ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NmUyMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIKLQkJcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIgotCQlwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlLyoqIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvKioiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvKioiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9zc2UvdWkvKioiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC94bWwvdWkvKioiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jc3MvdWkvKioiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9odG1sL3VpLyoqIiAvPgkJCQkKLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2phdmFzY3JpcHQvdWkvKioiIC8+CQotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSU1vZHVsZUNvbnN0YW50cyIgLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIgLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAwYzI2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi1qc3BlZGl0b3IuamFyCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2UuanN0LmpzcC51aV82LjAuMC5qYXIKLWJ1aWxkLnhtbAotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTc0ZDYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotb3JnLmVjbGlwc2UuanN0LmpzcC51aS9kZWJ1Zy9qc3Bjb250ZW50YXNzaXN0PWZhbHNlCi1vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3Byb2plY3Rpb25wZXJmPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDQyZTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qc3AudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE2OTdkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotI1dlZCBNYXIgMjggMDM6MTE6NDUgRURUIDIwMDcNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4NCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3INCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNNb24gQXByIDE3IDAyOjAxOjMzIEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDkxNDAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuanNwLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuNjAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MudWkuaW50ZXJuYWwucHJvcGVydGllczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLnVpLmludGVybmFsLnJlZ2lzdHJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWksCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYXV0b2VkaXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmJyZWFrcG9pbnRwcm92aWRlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5kZXJpdmVkO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmZvcm1hdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaGFuZGxlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluazt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnJlZ2lzdHJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuanNwZWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRhZ2luZm87eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudmFsaWRhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwud2l6YXJkO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS52aWV3cy5jb250ZW50b3V0bGluZQotSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnV0aWw7IHZlcnNpb249IjMuOCIsCi0gY29tLmlibS5pY3UudGV4dDsgdmVyc2lvbj0iMy44IgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5mb3JtcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wXSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuNTAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC41MDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjEwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMi4zMDAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjQwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjUwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5kZWJ1ZztidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5zZWFyY2g7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMSwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkudmlld3M7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjEwMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YmJjOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgdGVtcGxhdGVzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotYWRkaXRpb25hbC5idW5kbGVzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUubWFuaXB1bGF0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2pzcF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdqc3Bfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmOWIzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2pzcF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2phdmFhc3Npc3RfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2phdmFhc3Npc3RfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWE2YmQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL2VsY2wxNi9qYXZhYXNzaXN0X2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3anNwX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2pzcF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDk0NGFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3anNwX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2xhc3Nfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwMTE4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZGVmYXVsdF9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9kZWZhdWx0X2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhMTQ2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9kZWZhdWx0X2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2ZpZWxkX2RlZmF1bHRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2ZpZWxkX2RlZmF1bHRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyOWQzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9kZWZhdWx0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcml2YXRlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcml2YXRlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZTA2NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHJpdmF0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHJvdGVjdGVkX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcm90ZWN0ZWRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3N2IxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcm90ZWN0ZWRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2ZpZWxkX3B1YmxpY19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHVibGljX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0Y2I0MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHVibGljX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX2RlZmF1bHRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfZGVmYXVsdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjQ0YTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfZGVmYXVsdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJjbGFzc19wcml2YXRlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3ByaXZhdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM5MmYxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3ByaXZhdGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHJvdGVjdGVkX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3Byb3RlY3RlZF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTA1NTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHJvdGVjdGVkX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3B1YmxpY19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJjbGFzc19wdWJsaWNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjMmE4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3B1YmxpY19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfZGVmYXVsdF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfZGVmYXVsdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjFiNTc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX2RlZmF1bHRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3ByaXZhdGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3ByaXZhdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFjYmZmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wcml2YXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wcm90ZWN0ZWRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3Byb3RlY3RlZF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNThlZWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3Byb3RlY3RlZF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfcHVibGljX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wdWJsaWNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViYzQ2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wdWJsaWNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2xvY2FsdmFyaWFibGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2xvY2FsdmFyaWFibGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkY2U5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbHZhcmlhYmxlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWNrYWdlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWNrYWdlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMWMyOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcGFja2FnZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJpdmF0ZV9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wcml2YXRlX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI4ODFkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wcml2YXRlX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3Byb3RlY3RlZF9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm90ZWN0ZWRfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDgzYjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3Byb3RlY3RlZF9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wdWJsaWMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHVibGljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QyNDcwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wdWJsaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHVibGljX2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3B1YmxpY19jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YWY1ZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHVibGljX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWViZGI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZjUxNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWpzcC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctanNwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4NDYwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctanNwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctdGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDFmODFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3anNwZmlsZV93aXoucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2pzcGZpbGVfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwZmYwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3anNwZmlsZV93aXoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGRlY2wuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGRlY2wuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWY0OGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy9qc3BkZWNsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy9qc3BleHAuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGV4cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNGQ3NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGV4cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwaW5jbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwaW5jbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ODRjMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGluY2wuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcHNjci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwc2NyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1M2I5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwc2NyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy9qc3B0YWdsaWIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcHRhZ2xpYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTVlMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcHRhZ2xpYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvdGFnLWdlbmVyaWMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL3RhZy1nZW5lcmljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3ZmIzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvdGFnLWdlbmVyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL3RhZy1qc3AuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL3RhZy1qc3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTRkZTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy90YWctanNwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE3NmEyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIE1hdHRoaWFzIEZ1ZXNzZWwsIG1hdC5mdWVzc2VsQGdteC5uZXQgLSBbMTc3Mzg3XSB1c2UgYmFzZSBoeXBlcmxpbmtpbmcgZXh0ZW5zaW9uIHBvaW50cwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi1wbHVnaW5OYW1lPVNTRSBKU1AgU291cmNlIEVkaXRvcgotSlNQX1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lPUpTUCBFZGl0b3IKLUNTU19KU1BfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWU9Q1NTIEpTUCBFZGl0b3IKLUpTUF9GaWxlcy5uYW1lPUpTUCBGaWxlcwotSlNQX1NvdXJjZS5uYW1lPUVkaXRvcgotSlNQX0NvbnRlbnRfQXNzaXN0Lm5hbWU9Q29udGVudCBBc3Npc3QKLUpTUF9UZW1wbGF0ZXMubmFtZT1UZW1wbGF0ZXMKLUpTUF9TdHlsZXMubmFtZT1TdHlsZXMKLUpTUF9TeW50YXhfQ29sb3Jpbmc9U3ludGF4IENvbG9yaW5nCi1KU1BfU291cmNlX3RhcmdldF9uYW1lPUpTUCBFZGl0b3JzCi1KU1BfVmFsaWRhdGlvbj1WYWxpZGF0aW9uCi1KU1BfUHJvcGVydHlfdmFsaWRhdGlvbj1KU1AgU3ludGF4Ci1KU1BfVHlwaW5nPVR5cGluZwotCi0jIFNuaXBwZXRzIGNvbnRyaWJ1dGlvbnMgZm9yIGhlbHBpbmcgd2l0aCBKU1Agc3ludGF4Ci1qc3Bfc2NyaXB0bGV0PTwlLi4lPiBzY3JpcHRsZXQKLWpzcF9zY3JfY29udGVudD08JSAgJT4KLWpzcF9oaWRkZW5fY29tbWVudD08JS0tLi4tLSU+IGNvbW1lbnQKLWpzcF9oaWRkZW5fY29tbWVudF9jb250ZW50PTwlLS0gIC0tJT4KLWpzcF9kZWNsYXJhdGlvbj08JSEuLiU+IGRlY2xhcmF0aW9uCi1qc3BfZGVjbGFyYXRpb25fY29udGVudD08JSEgICU+Ci1qc3BfZXhwcmVzc2lvbj08JT0uLiU+IGV4cHJlc3Npb24KLWpzcF9leHByZXNzaW9uX2NvbnRlbnQ9PCU9ICAlPgotanNwX2luY2x1ZGVfZGlyZWN0aXZlPWluY2x1ZGUgZGlyZWN0aXZlCi1qc3BfaW5jbHVkZV9kaXJlY3RpdmVfY29udGVudD08JUAgaW5jbHVkZSBmaWxlPSIiICU+Ci1qc3BfcGFnZV9kaXJlY3RpdmU9cGFnZSBkaXJlY3RpdmUKLWpzcF9wYWdlX2RpcmVjdGl2ZV9jb250ZW50PTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9IiAlPgotanNwX3RhZ2xpYl9kaXJlY3RpdmU9dGFnbGliIGRpcmVjdGl2ZQotanNwX3RhZ2xpYl9kaXJlY3RpdmVfY29udGVudD08JUAgdGFnbGliIHVyaT0iJHt1cml9IiBwcmVmaXg9IiR7cHJlZml4fSIgJT4KLWpzcF90YWdsaWJfZGlyZWN0aXZlX3VyaT1VUkkgdG8gdGhlIGNvbnRhaW5pbmcgSkFSIGZpbGUgb3IgdGFnbGliIGRlc2NyaXB0b3IgKC50bGQpCi1qc3BfdGFnbGliX2RpcmVjdGl2ZV9wcmVmaXg9TmFtZXNwYWNlIHByZWZpeCBmb3IgdGFncyBmcm9tIHRoaXMgbGlicmFyeQotSlNQRnJhZ21lbnRDb250ZW50U2V0dGluZ3MubmFtZT1KU1AgRnJhZ21lbnQKLUpTUF9Qcm9wZXJ0eV90YWdfY29udGVudFNldHRpbmdzPVRhZyBDb250ZW50Ci1jb21tYW5kLmpzcC5yZWZhY3Rvci5yZW5hbWUubmFtZT1SZW5hbWUKLWNvbW1hbmQuanNwLnJlZmFjdG9yLnJlbmFtZS5kZXNjcmlwdGlvbj1SZW5hbWUgYSBKYXZhIEVsZW1lbnQKLWNvbW1hbmQuanNwLnJlZmFjdG9yLm1vdmUubmFtZT1Nb3ZlCi1jb21tYW5kLmpzcC5yZWZhY3Rvci5tb3ZlLmRlc2NyaXB0aW9uPU1vdmUgYSBKYXZhIEVsZW1lbnQgdG8gYW5vdGhlciBwYWNrYWdlCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmpzcC5uYW1lPUVkaXRpbmcgSlNQIFNvdXJjZQotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5qc3AuZGVzY3JpcHRpb249RWRpdGluZyBKU1AgU291cmNlCi1zY29wZS5qc3AuY29yZS5qc3Bzb3VyY2UubmFtZT1KU1AgU291cmNlCi1zY29wZS5qc3AuY29yZS5qc3Bzb3VyY2UuZGVzY3JpcHRpb249SlNQIFNvdXJjZQotSlNQX1R5cGVfUmVuYW1lX1BhcnRpY2lwYW50X0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIFR5cGUgUmVuYW1lIFBhcnRpY2lwYW50Ci1KU1BfTWV0aG9kX1JlbmFtZV9QYXJ0aWNpcGFudF9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUpTUCBNZXRob2QgUmVuYW1lIFBhcnRpY2lwYW50Ci1KU1BfUGFja2FnZV9SZW5hbWVfUGFydGljaXBhbnRfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgUGFja2FnZSBSZW5hbWUgUGFydGljaXBhbnQKLUpTUF9GaWVsZF9SZW5hbWVfUGFydGljaXBhbnRfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgRmllbGQgUmVuYW1lIFBhcnRpY2lwYW50Ci1KU1BfVHlwZV9Nb3ZlX1BhcnRpY2lwYW50X0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIFR5cGUgTW92ZSBQYXJ0aWNpcGFudAotQWxsX0pTUF9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1BbGwgSlNQCi1KU1BfTmV3X2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPU5ldyBKU1AKLVRhZ19OZXdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9TmV3IFRhZwotSlNQX1RhZ19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgVGFnCi1KU1BfQXR0cmlidXRlX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUpTUCBBdHRyaWJ1dGUKLUpTUF9BdHRyaWJ1dGVfdmFsdWVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIEF0dHJpYnV0ZSB2YWx1ZQotSlNQX1F1ZXJ5X1BhcnRpY2lwYW50X0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIFF1ZXJ5IFBhcnRpY2lwYW50Ci1KU1BfRXh0ZW5zaW9uX0VsZW1lbnQubGFiZWw9SlNQCi0jb3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyBleHRlbnNpb24gcG9pbnQKLV9VSV9XSVpBUkRfTkFNRSA9IEpTUCBGaWxlCi1fVUlfV0laQVJEX0NSRUFURV9ORVdfRklMRSA9IENyZWF0ZSBhIG5ldyBKU1AgZmlsZQotX1VJX1dJWkFSRF9UQUdfTkFNRSA9IEpTUCBUYWcKLV9VSV9XSVpBUkRfVEFHX0NSRUFURV9ORVdfRklMRSA9IENyZWF0ZSBhIG5ldyBKU1AgVGFnIGZpbGUKLSMjCi1BZGRUYXNrLmxhYmVsPUFkZCAmVGFzay4uLgotQWRkVGFzay50b29sdGlwPUFkZCBUYXNrLi4uCi1BZGRCb29rbWFyay5sYWJlbD1BZGQgQm9vJmttYXJrLi4uCi1BZGRCb29rbWFyay50b29sdGlwPUFkZCBCb29rbWFyay4uLgotU2VsZWN0UnVsZXIubGFiZWw9U2VsZWN0IFJ1bGVyCi0jIyBFTCBFcnJvciBNZXNzYWdlCi0jIwotQ2xlYW51cERvY3VtZW50X2xhYmVsPUNsZWFudXAgRG9jdW1lbnQuLi4KLUNsZWFudXBEb2N1bWVudF90b29sdGlwPUNsZWFudXAgRG9jdW1lbnQKLVRvZ2dsZUNvbW1lbnRfbGFiZWw9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfdG9vbHRpcD1Ub2dnbGUgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2xhYmVsPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfdG9vbHRpcD1BZGQgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcD1SZW1vdmUgQmxvY2sgQ29tbWVudAotRmluZE9jY3VycmVuY2VzX2xhYmVsPU9jY3VycmVuY2VzIGluIEZpbGUKLVJlbmFtZUVsZW1lbnRfbGFiZWw9UmVuYW1lCi1Nb3ZlRWxlbWVudF9sYWJlbD1Nb3ZlCi1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWw9RW5jbG9zaW5nIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBlbmNsb3NpbmcgZWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbD1OZXh0IEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgbmV4dCBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbD1QcmV2aW91cyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBwcmV2aW91cyBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsPVJlc3RvcmUgTGFzdCBTZWxlY3Rpb24KLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcD1SZXN0b3JlIGxhc3Qgc2VsZWN0aW9uCi0jIwotcHJlZmVyZW5jZUtleXdvcmRzLmZpbGVzPWVkaXRvciBqc3AgY3JlYXRpbmcgc2F2aW5nIGZpbGVzIHN1ZmZpeCBzcGVjaWZpZWQgZW5jb2RpbmcgaWFuYSB2YWxpZGF0aW5nIHZhbGlkYXRlIGZyYWdtZW50cwotcHJlZmVyZW5jZUtleXdvcmRzLmNvbnRlbnRhc3Npc3Q9anNwIGVkaXRvciBjb250ZW50IGNvZGUgYXNzaXN0IGNvbXBsZXRlIGNvbXBsZXRpb24gaW5zZXJ0IG92ZXJ3cml0ZSBzaW5nbGUgcHJvcG9zYWwgY29tbW9uIHByZWZpeCBhdXRvbWF0aWNhbGx5IGltcG9ydCBmaWxsIGFyZ3VtZW50IG5hbWUgZ3Vlc3MgYWxwaGFiZXRpY2FsIGhpZGUgYXV0byBhY3RpdmF0aW9uIHRyaWdnZXIgY2F0ZWdvcnkgY2F0ZWdvcmllcyBzZXBhcmF0ZSBzcGVjaWZpYwotcHJlZmVyZW5jZUtleXdvcmRzLnRlbXBsYXRlcz1lZGl0b3IganNwIHRlbXBsYXRlcyBzbmlwcGV0IG1hY3JvcwotcHJlZmVyZW5jZUtleXdvcmRzLnN0eWxlcz1lZGl0b3IganNwIHN0eWxlIGN1c3RvbWl6ZSBzeW50YXggaGlnaGxpZ2h0aW5nIHR5cGUgdGV4dCBjb250ZW50IGZvcmVncm91bmQgYmFja2dyb3VuZCBib2xkIGNvbG9yCi1wcmVmZXJlbmNlS2V5d29yZHMuZnJhZ21lbnRzPWVkaXRvciBqc3AgZnJhZ21lbnQgbGFuZ3VhZ2UgY29udGVudCB0eXBlIHZhbGlkYXRlCi1wcmVmZXJlbmNlS2V5d29yZHMuc2V2ZXJpdGllcz1qc3AgZXJyb3JzIHdhcm5pbmdzIGlnbm9yZSBvcHRpb25zIHNldmVyaXR5IHNldmVyaXRpZXMgc3VwcHJlc3MgcHJvamVjdCBzcGVjaWZpYyBwcm9qZWN0c3BlY2lmaWMKLQotIyMKLUphdmFfRWxlbWVudF9oeXBlcmxpbms9SmF2YSBFbGVtZW50Ci1UYWdsaWJfaHlwZXJsaW5rPVRhZyBMaWJyYXJ5IERlc2NyaXB0b3IKLQotIyMKLXByb3Bvc2FsQ2F0ZWdvcnkuanNwVGVtcGxhdGVzPUpTUCBUZW1wbGF0ZSBQcm9wb3NhbHMKLXByb3Bvc2FsQ2F0ZWdvcnkuanNwPUpTUCBQcm9wb3NhbHMKLXByb3Bvc2FsQ2F0ZWdvcnkuanNwSmF2YT1KU1AgSmF2YSBQcm9wb3NhbHMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNjNlYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0JCTxlZGl0b3IKLQkJCW5hbWU9IiVKU1BfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWUiCi0JCQlpY29uPSIkbmwkL2ljb25zLy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYiCi0JCQlleHRlbnNpb25zPSJqc3AsIGpzZiwganNwZiwganNweCwgdGFnLCB0YWd4LCB0YWdmIgotCQkJY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuQWN0aW9uQ29udHJpYnV0b3JKU1AiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIKLQkJCXN5bWJvbGljRm9udE5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZS5zb3VyY2UiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCTwvZWRpdG9yPgotCQk8ZWRpdG9yCi0JCQluYW1lPSIlQ1NTX0pTUF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZSIKLQkJCWljb249IiRubCQvaWNvbnMvL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZiIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkFjdGlvbkNvbnRyaWJ1dG9ySlNQIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiCi0JCQlzeW1ib2xpY0ZvbnROYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3Bzb3VyY2Uuc291cmNlIj4KLQkJCTxjb250ZW50VHlwZUJpbmRpbmcKLQkJCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIiAvPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3BmcmFnbWVudHNvdXJjZSIgLz4KLQkJPC9lZGl0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXRvckNvbmZpZ3VyYXRpb24iPgotCQk8c291cmNlVmlld2VyQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCQk8Y29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS52aWV3cy5jb250ZW50b3V0bGluZS5KU1BDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCTxxdWlja091dGxpbmVDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5xdWlja291dGxpbmUuWE1MUXVpY2tPdXRsaW5lQ29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQkJPHByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS52aWV3cy5wcm9wZXJ0aWVzLlhNTFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotICAJCTxkb2N1bWVudGF0aW9uVGV4dEhvdmVyCi0gICAgICAgIAljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50YWdpbmZvLkpTUFRhZ0luZm9Ib3ZlclByb2Nlc3NvciIKLSAgICAgICAgCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5ERUZBVUxUX0pTUCwgb3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfRElSRUNUSVZFIj4KLSAgCQk8L2RvY3VtZW50YXRpb25UZXh0SG92ZXI+Ci0gIAkJPGRvY3VtZW50YXRpb25UZXh0SG92ZXIKLSAgICAgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRhZ2luZm8uSlNQSmF2YUphdmFkb2NIb3ZlclByb2Nlc3NvciIKLSAgICAgICAgCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5TQ1JJUFQuSkFWQSI+Ci0gIAkJPC9kb2N1bWVudGF0aW9uVGV4dEhvdmVyPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJzb3VyY2VlZGl0aW5ndGV4dHRvb2xzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImNoYXJhY3RlcnBhaXJtYXRjaGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGV4dC5KU1BEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJmb2xkaW5nc3RyYXRlZ3kiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLlhNTEZvbGRpbmdTdHJhdGVneSIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJlZmVyZW5jZXMuanNwLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcC5zb3VyY2UsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLnRlbXBsYXRlcywgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5qc3Auc3R5bGVzLCxvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnByZWZlcmVuY2VzLnZhbGlkYXRpb24sIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLmNvbnRlbnRhc3Npc3QiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9InNob3dpbnRhcmdldCIKLQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qZHQudWkuUGFja2FnZUV4cGxvcmVyIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJzcGVsbGluZ3JlZ2lvbnMiCi0JCQl2YWx1ZT0iWE1MX0NPTU1FTlRfVEVYVCwgSlNQX0NPTU1FTlRfVEVYVCwgWE1MX0NPTlRFTlQsIEhUTUxfQ09OVEVOVCwgSlNQX0NPTlRFTlQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9ImFjdGl2ZWNvbnRleHRzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UsIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5qc3Auc2NvcGUsIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5uYXZpZ2F0aW9uLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvbW1lbnRzLCBvcmcuZWNsaXBzZS53c3QueG1sLnNlbGVjdGlvbiIKLSAgICAgICAgCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQotCQk8Y29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5UTERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50bGRzb3VyY2UiIC8+Ci0JCTxkb2N1bWVudGF0aW9uVGV4dEhvdmVyCi0gICAgICAgIAljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50YWdpbmZvLlhNTEphdmFkb2NIb3ZlclByb2Nlc3NvciIKLSAgICAgICAgCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBzb3VyY2UgdmFsaWRhdGlvbiBmb3IgSlNQCQkJCQkJCQkJCQkJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSlNQSmF2YVZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmpzcHNvdXJjZXZhbGlkYXRvciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLkRFRkFVTFRfSlNQIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuU0NSSVBULkpBVkEiPgotCQkJCTwvcGFydGl0aW9uVHlwZT4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfRElSRUNUSVZFIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBzb3VyY2UgKGFzIHlvdSB0eXBlKSB2YWxpZGF0aW9uIGZvciBKU1AgRUwJCQkJCSAgIAkJCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InRvdGFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUEVMVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuanNwZWxzb3VyY2V2YWxpZGF0b3IiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllcgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5TQ1JJUFQuSlNQX0VMIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBzb3VyY2UgKGFzIHlvdSB0eXBlKSB2YWxpZGF0aW9uIGZvciBKU1AgZGlyZWN0aXZlCQkJICAgCQkJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSlNQRGlyZWN0aXZlVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudGxkc291cmNldmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuREVGQVVMVF9KU1AiPgotCQkJCTwvcGFydGl0aW9uVHlwZT4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfRElSRUNUSVZFIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBzb3VyY2UgKGFzIHlvdSB0eXBlKSB2YWxpZGF0aW9uIGZvciBKU1AgYWN0aW9uIHRhZ3MJCQkgICAJCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InRvdGFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5KU1BBY3Rpb25Tb3VyY2VWYWxpZGF0b3IiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmpzcGFjdGlvbnZhbGlkYXRvciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLkRFRkFVTFRfSlNQIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuSlNQX0RJUkVDVElWRSI+Ci0JCQkJPC9wYXJ0aXRpb25UeXBlPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBIVE1MIChhcyB5b3UgdHlwZSkgdmFsaWRhdGlvbgkJCQkJICAgCQkJCQkJICAJCQkgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJ0b3RhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnZhbGlkYXRpb24uSlNQQ29udGVudFNvdXJjZVZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnZhbGlkYXRpb24uaHRtbHN5bnRheHZhbGlkYXRvciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLkpTUF9ESVJFQ1RJVkUiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfQ09NTUVOVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUNMQVJBVElPTiIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0NPTU1FTlQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiLz4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gSlNQIFVJIEFkYXB0ZXIgZmFjdG9yaWVzCQkJCQkgICAJCQkJCQkgIAkJCQkgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbiI+Ci0JCTxhZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNQIj4KLQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQkJPC9hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5hbm5vdGF0aW9uTW9kZWxDcmVhdGlvbiI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0KLQkJPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JCTwhLS0gSlNQIFBSRUZFUkVOQ0UgUEFHRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVKU1BfRmlsZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy53ZWIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5KU1BGaWxlc1ByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJlZmVyZW5jZXMuanNwIj4KLQkJCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmZpbGVzIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVKU1BfU291cmNlLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcmVmZXJlbmNlcy5qc3AiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcC5zb3VyY2UiPgotCQk8L3BhZ2U+Ci0gIDxwYWdlCi0gICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcC5zb3VyY2UiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkpTUENvbnRlbnRBc3Npc3RQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLmNvbnRlbnRhc3Npc3QiCi0gICAgICAgIG5hbWU9IiVKU1BfQ29udGVudF9Bc3Npc3QubmFtZSI+Ci0gICAgIDxrZXl3b3JkUmVmZXJlbmNlCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmNvbnRlbnRhc3Npc3QiPgotICAgICA8L2tleXdvcmRSZWZlcmVuY2U+Ci0gIDwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVKU1BfVGVtcGxhdGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5qc3Auc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSlNQVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcC50ZW1wbGF0ZXMiPgotCQkJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVKU1BfU3ludGF4X0NvbG9yaW5nIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLnNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkpTUFN5bnRheENvbG9yaW5nUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcC5zdHlsZXMiPgotCQkJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuc3R5bGVzIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVKU1BfVmFsaWRhdGlvbiIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnByZWZlcmVuY2VzLmpzcCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkpTUFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnByZWZlcmVuY2VzLnZhbGlkYXRpb24iPgotCQkJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuc2V2ZXJpdGllcyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSlNQX1R5cGluZyIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcC5zb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5KU1BUeXBpbmdQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnByZWZlcmVuY2VzLnR5cGluZyI+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIEtleXdvcmRzIGZvciBwcmVmZXJlbmNlIGFuZCBwcm9wZXJ0aWVzIHBhZ2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmtleXdvcmRzIj4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLmZpbGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuZmlsZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLmNvbnRlbnRhc3Npc3QiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5jb250ZW50YXNzaXN0Ii8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy50ZW1wbGF0ZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnN0eWxlcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnN0eWxlcyIvPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMuZnJhZ21lbnRzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuZnJhZ21lbnRzIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5zZXZlcml0aWVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuc2V2ZXJpdGllcyIvPgotICAgIDwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBGT1IgSlNQL0pBVkEgUkVOQU1FIFBBUlRJQ0lQQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucmVuYW1lUGFydGljaXBhbnRzIj4KLQkJPHJlbmFtZVBhcnRpY2lwYW50Ci0JCQluYW1lPSIlSlNQX1R5cGVfUmVuYW1lX1BhcnRpY2lwYW50X0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmphdmEucmVmYWN0b3JpbmcuSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJhZmZlY3RlZE5hdHVyZXMiPgotCQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIgLz4KLQotCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJPC93aXRoPgotCQkJCTx3aXRoIHZhcmlhYmxlPSJlbGVtZW50Ij4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlIiAvPgotCi0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3JlbmFtZVBhcnRpY2lwYW50PgotCi0JCTxyZW5hbWVQYXJ0aWNpcGFudAotCQkJbmFtZT0iJUpTUF9NZXRob2RfUmVuYW1lX1BhcnRpY2lwYW50X0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUE1ldGhvZFJlbmFtZVBhcnRpY2lwYW50IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuamF2YS5yZWZhY3RvcmluZy5KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWZmZWN0ZWROYXR1cmVzIj4KLQkJCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiIC8+Ci0KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kIiAvPgotCi0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3JlbmFtZVBhcnRpY2lwYW50PgotCi0JCTxyZW5hbWVQYXJ0aWNpcGFudAotCQkJbmFtZT0iJUpTUF9QYWNrYWdlX1JlbmFtZV9QYXJ0aWNpcGFudF9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BQYWNrYWdlUmVuYW1lUGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qYXZhLnJlZmFjdG9yaW5nLkpTUFBhY2thZ2VSZW5hbWVQYXJ0aWNpcGFudCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWZmZWN0ZWROYXR1cmVzIj4KLQkJCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiIC8+Ci0KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCIgLz4KLQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQkJICA8cmVuYW1lUGFydGljaXBhbnQKLQkJICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUEZpZWxkUmVuYW1lUGFydGljaXBhbnQiCi0JCSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuamF2YS5yZWZhY3RvcmluZy5KU0ZpZWxkUmVuYW1lUGFydGljaXBhbnQiCi0JCSAgICAgICAgbmFtZT0iJUpTUF9GaWVsZF9SZW5hbWVfUGFydGljaXBhbnRfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSI+Ci0JCSAgICAgPGVuYWJsZW1lbnQ+Ci0JCSAgICAgICAgPHdpdGggdmFyaWFibGU9ImFmZmVjdGVkTmF0dXJlcyI+Ci0JCSAgICAgICAgICAgPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJICAgICAgICAgICAgICA8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIj4KLQkJICAgICAgICAgICAgICA8L2VxdWFscz4KLQkJICAgICAgICAgICA8L2l0ZXJhdGU+Ci0JCSAgICAgICAgPC93aXRoPgotCQkgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJlbGVtZW50Ij4KLQkJICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkIj4KLQkJICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0JCSAgICAgICAgPC93aXRoPgotCQkgICAgIDwvZW5hYmxlbWVudD4KLQkJICA8L3JlbmFtZVBhcnRpY2lwYW50PgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBGT1IgSlNQL0pBVkEgTU9WRSBQQVJUSUNJUEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcubW92ZVBhcnRpY2lwYW50cyI+Ci0KLQkJPG1vdmVQYXJ0aWNpcGFudAotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuamF2YS5yZWZhY3RvcmluZy5KU1BUeXBlTW92ZVBhcnRpY2lwYW50IgotCQkJbmFtZT0iJUpTUF9UeXBlX01vdmVfUGFydGljaXBhbnRfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQVHlwZU1vdmVQYXJ0aWNpcGFudCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWZmZWN0ZWROYXR1cmVzIj4KLQkJCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiIC8+Ci0JCQkJCTwvaXRlcmF0ZT4KLQkJCQk8L3dpdGg+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUiIC8+Ci0KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvbW92ZVBhcnRpY2lwYW50PgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBmb3IgYnJlYWtwb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5icmVha3BvaW50Ij4KLQkJPGJyZWFrcG9pbnRDb250cmlidXRpb24gaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJvdmlkZXJzIj4KLQkJCTxwcm92aWRlcgotCQkJCWNvbnRlbnRUeXBlcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzLkphdmFTdHJhdHVtQnJlYWtwb2ludFByb3ZpZGVyIj4KLQkJCQk8Y2xhc3MgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVycy5KYXZhU3RyYXR1bUJyZWFrcG9pbnRQcm92aWRlciI+Ci0JCQkJCTxwYXJhbWV0ZXIgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgdmFsdWU9Iipqc3AsanNwX3NlcnZsZXQuXyoiLz4KLQkJCQkJPHBhcmFtZXRlciBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnc291cmNlIiB2YWx1ZT0iKnRhZywqdGFneCx0YWcuXyosdGFneC5fKiIvPgotCQkJCTwvY2xhc3M+Ci0JCQk8L3Byb3ZpZGVyPgotCQk8L2JyZWFrcG9pbnRDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIFNuaXBwZXQgVmlldyBjb250cmlidXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnNuaXBwZXRzLlNuaXBwZXRDb250cmlidXRpb25zIj4KLQkJPGNhdGVnb3J5Ci0JCQlsYWJlbD0iJUpTUF9FeHRlbnNpb25fRWxlbWVudC5sYWJlbCIKLQkJCXNtYWxsaWNvbj0iaWNvbnMvc25pcHBldHMvdGFnLWpzcC5naWYiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5jYXRlZ29yeTAiCi0JCQljb250ZW50dHlwZXM9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotCQkJPGl0ZW0KLQkJCQlsYWJlbD0iJWpzcF9oaWRkZW5fY29tbWVudCIKLQkJCQlzbWFsbGljb249Imljb25zL3NuaXBwZXRzL3RhZy1nZW5lcmljLmdpZiIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qc3BfaGlkZGVuX2NvbW1lbnQiPgotCQkJCTxjb250ZW50PiVqc3BfaGlkZGVuX2NvbW1lbnRfY29udGVudDwvY29udGVudD4KLQkJCTwvaXRlbT4KLQkJCTxpdGVtCi0JCQkJbGFiZWw9IiVqc3Bfc2NyaXB0bGV0IgotCQkJCXNtYWxsaWNvbj0iaWNvbnMvc25pcHBldHMvanNwc2NyLmdpZiIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qc3Bfc2NyaXB0bGV0Ij4KLQkJCQk8Y29udGVudD4lanNwX3Njcl9jb250ZW50PC9jb250ZW50PgotCQkJPC9pdGVtPgotCQkJPGl0ZW0KLQkJCQlsYWJlbD0iJWpzcF9leHByZXNzaW9uIgotCQkJCXNtYWxsaWNvbj0iaWNvbnMvc25pcHBldHMvanNwZXhwLmdpZiIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qc3BfZXhwcmVzc2lvbiI+Ci0JCQkJPGNvbnRlbnQ+JWpzcF9leHByZXNzaW9uX2NvbnRlbnQ8L2NvbnRlbnQ+Ci0JCQk8L2l0ZW0+Ci0JCQk8aXRlbQotCQkJCWxhYmVsPSIlanNwX2RlY2xhcmF0aW9uIgotCQkJCXNtYWxsaWNvbj0iaWNvbnMvc25pcHBldHMvanNwZGVjbC5naWYiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuanNwX2RlY2xhcmF0aW9uIj4KLQkJCQk8Y29udGVudD4lanNwX2RlY2xhcmF0aW9uX2NvbnRlbnQ8L2NvbnRlbnQ+Ci0JCQk8L2l0ZW0+Ci0JCQk8aXRlbQotCQkJCWxhYmVsPSIlanNwX2luY2x1ZGVfZGlyZWN0aXZlIgotCQkJCXNtYWxsaWNvbj0iaWNvbnMvc25pcHBldHMvanNwaW5jbC5naWYiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuanNwX2luY2x1ZGVfZGlyZWN0aXZlIj4KLQkJCQk8Y29udGVudD4lanNwX2luY2x1ZGVfZGlyZWN0aXZlX2NvbnRlbnQ8L2NvbnRlbnQ+Ci0JCQk8L2l0ZW0+Ci0JCQk8aXRlbQotCQkJCWxhYmVsPSIlanNwX3BhZ2VfZGlyZWN0aXZlIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmpzcF9wYWdlX2RpcmVjdGl2ZSI+Ci0JCQkJPGNvbnRlbnQ+JWpzcF9wYWdlX2RpcmVjdGl2ZV9jb250ZW50PC9jb250ZW50PgotCQkJPC9pdGVtPgotCQkJPGl0ZW0KLQkJCQlsYWJlbD0iJWpzcF90YWdsaWJfZGlyZWN0aXZlIgotCQkJCXNtYWxsaWNvbj0iaWNvbnMvc25pcHBldHMvanNwdGFnbGliLmdpZiIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qc3BfdGFnbGliX2RpcmVjdGl2ZSI+Ci0JCQkJPGNvbnRlbnQ+JWpzcF90YWdsaWJfZGlyZWN0aXZlX2NvbnRlbnQ8L2NvbnRlbnQ+Ci0JCQkJPHZhcmlhYmxlCi0JCQkJCWRlc2NyaXB0aW9uPSIlanNwX3RhZ2xpYl9kaXJlY3RpdmVfdXJpIgotCQkJCQlpZD0idXJpIiAvPgotCi0JCQkJPHZhcmlhYmxlCi0JCQkJCWRlZmF1bHQ9Im15bGliIgotCQkJCQlkZXNjcmlwdGlvbj0iJWpzcF90YWdsaWJfZGlyZWN0aXZlX3ByZWZpeCIKLQkJCQkJaWQ9InByZWZpeCIgLz4KLQotCQkJPC9pdGVtPgotCQk8L2NhdGVnb3J5PgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBFZGl0b3IgYWN0aW9uc2V0cyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zIj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5hY3Rpb25TZXQuYW5ub3RhdGlvbk5hdmlnYXRpb24iPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2Uuc291cmNlIiAvPgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ij4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlLnNvdXJjZSIgLz4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hBY3Rpb25TZXQiPgotICAgICAgICAgICAgPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2Uuc291cmNlIi8+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBKU1AgRWRpdG9yIHNwZWNpZmljIGFjdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotCQk8IS0tIHJlbmFtZSByZWZhY3RvciAtLT4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLmpzcC5yZWZhY3Rvci5yZW5hbWUubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC5qc3AucmVmYWN0b3IucmVuYW1lLmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnJlZmFjdG9yLnJlbmFtZSIgLz4KLQotCQk8IS0tIG1vdmUgcmVmYWN0b3IgLS0+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlY29tbWFuZC5qc3AucmVmYWN0b3IubW92ZS5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLmpzcC5yZWZhY3Rvci5tb3ZlLmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnJlZmFjdG9yLm1vdmUiIC8+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBLZXliaW5kaW5nIHNjb3BlIGZvciBqc3Agc291cmNlIGVkaXRvciAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cyI+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5qc3AubmFtZSIKLQkJCXBhcmVudElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQlkZXNjcmlwdGlvbj0iJXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuanNwLmRlc2NyaXB0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5qc3Auc2NvcGUiPgotCQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuanNwLmNvcmUuanNwc291cmNlLm5hbWUiCi0JCQlwYXJlbnRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJZGVzY3JpcHRpb249IiVzY29wZS5qc3AuY29yZS5qc3Bzb3VyY2UuZGVzY3JpcHRpb24iCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCTwvY29udGV4dD4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIEtleWJpbmRpbmdzIGZvciBqc3Agc291cmNlIGVkaXRvciAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5iaW5kaW5ncyI+Ci0JICAgIDwhLS0gIHdpbjMyOiAgTTE9Q1RSTCwgTTI9U0hJRlQsIE0zPUFMVCAtLT4KLQkJPCEtLSByZW5hbWUgcmVmYWN0b3IgLS0+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMitNMytSIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuanNwLnNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnJlZmFjdG9yLnJlbmFtZSIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXk+Ci0KLQkJPCEtLSBtb3ZlIHJlZmFjdG9yIC0tPgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTIrTTMrViIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmpzcC5zY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5yZWZhY3Rvci5tb3ZlIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gVGVtcGxhdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGVtcGxhdGVzIj4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlQWxsX0pTUF9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSlNQIgotCQkJaWQ9ImpzcF9hbGwiIC8+Ci0KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlSlNQX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSlNQIgotCQkJaWQ9ImpzcF9uZXciIC8+Ci0KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlVGFnX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSlNQIgotCQkJaWQ9InRhZ19uZXciIC8+Ci0KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlSlNQX1RhZ19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSlNQIgotCQkJaWQ9ImpzcF90YWciIC8+Ci0KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlSlNQX0F0dHJpYnV0ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSlNQIgotCQkJaWQ9ImpzcF9hdHRyaWJ1dGUiIC8+Ci0KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlSlNQX0F0dHJpYnV0ZV92YWx1ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSlNQIgotCQkJaWQ9ImpzcF9hdHRyaWJ1dGVfdmFsdWUiIC8+Ci0KLQkJPGluY2x1ZGUKLQkJCWZpbGU9InRlbXBsYXRlcy9qc3BkZWZhdWx0LXRlbXBsYXRlcy54bWwiCi0JCQl0cmFuc2xhdGlvbnM9IiRubCQvdGVtcGxhdGVzL2pzcGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMiIC8+Ci0KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gcXVlcnlQYXJ0aWNpcGFudCB0byBwYXJ0aWNpcGF0ZSBpbiBqYXZhIHNlcmFjaGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC51aS5xdWVyeVBhcnRpY2lwYW50cyI+Ci0JCTxxdWVyeVBhcnRpY2lwYW50Ci0JCQluYW1lPSIlSlNQX1F1ZXJ5X1BhcnRpY2lwYW50X0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQluYXR1cmU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaC51aS5KU1BRdWVyeVBhcnRpY2lwYW50IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuamF2YS5zZWFyY2gudWkuSlNQUXVlcnlQYXJ0aWNpcGFudCIgLz4KLQotCTwvZXh0ZW5zaW9uPgotCTwhLS0gaW5pdGlhbGl6ZSB4bWwgdWkgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BVSVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gRG9jdW1lbnQgcHJvdmlkZXIgZm9yIEV4dGVybmFsRmlsZUVkaXRvcklucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuZG9jdW1lbnRQcm92aWRlcnMiPgotCQk8cHJvdmlkZXIKLQkJCWlucHV0VHlwZXM9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rLkV4dGVybmFsRmlsZUVkaXRvcklucHV0IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RmlsZURvY3VtZW50UHJvdmlkZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5FeHRlcm5hbEZpbGVEb2N1bWVudFByb3ZpZGVyIiAvPgotCi0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIE5ldyBKU1Agd2l6YXJkIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotCQk8d2l6YXJkCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQuTmV3SlNQV2l6YXJkIgotCQkJbmFtZT0iJV9VSV9XSVpBUkRfTkFNRSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLndpemFyZC5OZXdKU1BXaXphcmQiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2pzcF93aXouZ2lmIj4KLQkJCTxkZXNjcmlwdGlvbj4lX1VJX1dJWkFSRF9DUkVBVEVfTkVXX0ZJTEU8L2Rlc2NyaXB0aW9uPgotCQkJPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPgotCQk8L3dpemFyZD4KLQotCQk8d2l6YXJkCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQuTmV3VGFnV2l6YXJkIgotCQkJbmFtZT0iJV9VSV9XSVpBUkRfVEFHX05BTUUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQuTmV3VGFnV2l6YXJkIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0JCQlpY29uPSIkbmwkL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdqc3Bfd2l6LmdpZiI+Ci0JCQk8ZGVzY3JpcHRpb24+JV9VSV9XSVpBUkRfVEFHX0NSRUFURV9ORVdfRklMRTwvZGVzY3JpcHRpb24+Ci0JCQk8c2VsZWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiIC8+Ci0JCTwvd2l6YXJkPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBBZGQgbmV3IEpTUCB3aXphcmQgdG8gUHJvamVjdCBFeHBsb3JlciAtLT4KLQk8ZXh0ZW5zaW9uCi0JCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvbW1vbldpemFyZC5uZXdKU1AiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudCI+Ci0JCTxjb21tb25XaXphcmQKLSAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0gICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwud2l6YXJkLk5ld0pTUFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotCQkJCQkJPHRlc3QKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3Qud2ViIi8+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkJPHZpZXdlckNvbnRyaWJ1dGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2Uuc291cmNlLlJ1bGVyQ29udGV4dCIKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnJ1bGVyLmNvbnRleHQuYWN0aW9ucyI+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRUYXNrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLkFkZFRhc2tfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRUYXNrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iIC8+Ci0KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZEJvb2ttYXJrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIiAvPgotCi0JCTwvdmlld2VyQ29udHJpYnV0aW9uPgotCQk8dmlld2VyQ29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGZyYWdtZW50c291cmNlLnNvdXJjZS5SdWxlckNvbnRleHQiCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5ydWxlci5jb250ZXh0LmFjdGlvbnMiPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkVGFzay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5BZGRUYXNrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkVGFzay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIiAvPgotCi0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRCb29rbWFyay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIgLz4KLQotCQk8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KLQkJPHZpZXdlckNvbnRyaWJ1dGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdzb3VyY2Uuc291cmNlLlJ1bGVyQ29udGV4dCIKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnJ1bGVyLmNvbnRleHQuYWN0aW9ucyI+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRUYXNrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLkFkZFRhc2tfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRUYXNrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iIC8+Ci0KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZEJvb2ttYXJrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIiAvPgotCi0JCTwvdmlld2VyQ29udHJpYnV0aW9uPgotCQk8dmlld2VyQ29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRsZHNvdXJjZS5zb3VyY2UuUnVsZXJDb250ZXh0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IucnVsZXIuY29udGV4dC5hY3Rpb25zIj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZFRhc2subGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuQWRkVGFza19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZFRhc2sudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIgLz4KLQotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkQm9va21hcmsudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iIC8+Ci0KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zIj4KLQk8ZWRpdG9yQ29udHJpYnV0aW9uCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZS5zb3VyY2UuZWRpdG9yQWN0aW9ucyIKLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlLnNvdXJjZSI+Ci0JPCEtLQkJPGFjdGlvbgotCQkJCWlkPSJDbGVhbnVwRG9jdW1lbnQiCi0JCQkJbGFiZWw9IiVDbGVhbnVwRG9jdW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNsZWFudXAuZG9jdW1lbnQiCi0JCQkJdG9vbHRpcD0iJUNsZWFudXBEb2N1bWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpLkNsZWFudXBBY3Rpb25IVE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkNsZWFudXBEb2N1bWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iVG9nZ2xlQ29tbWVudCIKLQkJCQlsYWJlbD0iJVRvZ2dsZUNvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZ2dsZS5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVUb2dnbGVDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5Ub2dnbGVDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlRvZ2dsZUNvbW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkFkZEJsb2NrQ29tbWVudCIKLQkJCQlsYWJlbD0iJUFkZEJsb2NrQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRkLmJsb2NrLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJUFkZEJsb2NrQ29tbWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQWRkQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkFkZEJsb2NrQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iUmVtb3ZlQmxvY2tDb21tZW50IgotCQkJCWxhYmVsPSIlUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5yZW1vdmUuYmxvY2suY29tbWVudCIKLQkJCQl0b29sdGlwPSIlUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5SZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iUmVtb3ZlQmxvY2tDb21tZW50Ij4KLQkJCTwvYWN0aW9uPi0tPgotCQkJPCEtLTxhY3Rpb24KLQkJCQlpZD0iUmVuYW1lRWxlbWVudCIKLQkJCQlsYWJlbD0iJVJlbmFtZUVsZW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnJlZmFjdG9yLnJlbmFtZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUFJlbmFtZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iUmVuYW1lRWxlbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iTW92ZUVsZW1lbnQiCi0JCQkJbGFiZWw9IiVNb3ZlRWxlbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucmVmYWN0b3IubW92ZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUE1vdmVFbGVtZW50QWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9Ik1vdmVFbGVtZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJGaW5kT2NjdXJyZW5jZXMiCi0JCQkJbGFiZWw9IiVGaW5kT2NjdXJyZW5jZXNfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoLkpTUEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJGaW5kT2NjdXJyZW5jZXMiPgotCQkJPC9hY3Rpb24+LS0+Ci0JCQk8IS0tPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdE5leHRYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0TmV4dCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RIaXN0b3J5QWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiPgotCQkJPC9hY3Rpb24+LS0+Ci0JCTwvZWRpdG9yQ29udHJpYnV0aW9uPgotICAgICAgICA8ZWRpdG9yQ29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZS5zb3VyY2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZS5ydWxlci5hY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlU2VsZWN0UnVsZXIubGFiZWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iLz4KLSAgICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLlJlbmFtZUVsZW1lbnRIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5yZWZhY3Rvci5yZW5hbWUiPgotICAgICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgIAk8cmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmpzcC51aS5qc3BTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iPgotICAgICAgICAgICAgIAk8L3JlZmVyZW5jZT4KLSAgICAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgIAk8cmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmpzcC51aS5qc3BTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iPgotICAgICAgICAgICAgIAk8L3JlZmVyZW5jZT4KLSAgICAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuTW92ZUVsZW1lbnRIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5yZWZhY3Rvci5tb3ZlIj4KLSAgICAgICAgICAgICA8YWN0aXZlV2hlbj4KLSAgICAgICAgICAgICAJPHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5qc3AudWkuanNwU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj4KLSAgICAgICAgICAgICAJPC9yZWZlcmVuY2U+Ci0gICAgICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAJPHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5qc3AudWkuanNwU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj4KLSAgICAgICAgICAgICAJPC9yZWZlcmVuY2U+Ci0gICAgICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oYW5kbGVycy5KU1BGaW5kT2NjdXJyZW5jZXNIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zZWFyY2guZmluZC5vY2N1cnJlbmNlcyI+Ci0gICAgICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgCTxyZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuanNwLnVpLmpzcFNvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+Ci0gICAgICAgICAgICAgCTwvcmVmZXJlbmNlPgotICAgICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgCTxyZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuanNwLnVpLmpzcFNvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+Ci0gICAgICAgICAgICAgCTwvcmVmZXJlbmNlPgotICAgICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlRXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbiB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aS53ZWJEZXZQZXJzcGVjdGl2ZSI+Ci0gICAgICAgICAgICA8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwud2l6YXJkLk5ld0pTUFdpemFyZCIvPgotICAgICAgICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPiAKLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIEpTUCBGcmFnbWVudCBQcm9wZXJ0eSBQYWdlIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgotCQk8IS0tIGZvciBqMmVlIHdlYiBwcm9qZWN0IC0tPgotCQk8cGFnZQotCQkJbmFtZT0iJUpTUEZyYWdtZW50Q29udGVudFNldHRpbmdzLm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Qcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLlByb2plY3RKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIj4KLSAgICAgICAgIAk8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgICAJPGFuZD4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCTxvcj4gCi0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJdmFsdWU9ImpzdC53ZWIiIC8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvYW5kPiAKLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5mcmFnbWVudHMiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUpTUEZyYWdtZW50Q29udGVudFNldHRpbmdzLm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSI+Ci0gICAgICAgICAJPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICAgCTxhbmQ+Ci0JCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0JCQkJCQk8b3I+IAotCQkJCQkJCTx0ZXN0IAotCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5jb250ZW50VHlwZUlkIgotCQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGZyYWdtZW50c291cmNlIiAvPgotCQkJCQkJCTx0ZXN0IAotCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5jb250ZW50VHlwZUlkIgotCQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcGZyYWdtZW50c291cmNlIiAvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L2FuZD4gCi0JCQk8L2VuYWJsZWRXaGVuPgotCQkJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuZnJhZ21lbnRzIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVKU1BfUHJvcGVydHlfdmFsaWRhdGlvbiIgCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5KU1BWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm9wZXJ0eVBhZ2UucHJvamVjdC52YWxpZGF0aW9uIgotCQkJY2F0ZWdvcnk9IlZhbGlkYXRpb25Qcm9wZXJ0aWVzUGFnZSI+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByb2plY3ROYXR1cmUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIi8+Ci0JCQkJPC9hZGFwdD4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5zZXZlcml0aWVzIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVKU1BfUHJvcGVydHlfdGFnX2NvbnRlbnRTZXR0aW5ncyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLlRhZ0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnByb3BlcnR5UGFnZS5wcm9qZWN0LnRhZy5jb250ZW50LnNldHRpbmdzIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5cGFnZXMuaW5mby5maWxlIj4KLSAgICAgICAgIAk8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgICAJPGFuZD4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLQkJCQkJCTxvcj4gCi0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnc291cmNlIiAvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L2FuZD4gCi0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+CQotCTwhLS0gIGpzcC1mb3ItY3NzIGVkaXRvciBjb25maWd1cmF0aW9ucyAtLT4JCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTxjb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNTU0NvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIgLz4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIgLz4KLQkJPHByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllcy5KU1BlZENTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJjaGFyYWN0ZXJwYWlybWF0Y2hlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRleHQuQ1NTRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0iZm9sZGluZ3N0cmF0ZWd5IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvamVjdGlvbi5DU1NGb2xkaW5nU3RyYXRlZ3kiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3Bzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9InByZWZlcmVuY2VwYWdlcyIKLQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmNzcywgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3Muc291cmNlLCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByZWZlcmVuY2VzLnRlbXBsYXRlcywgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3Muc3R5bGVzIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24iPgotCQk8YWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLnVpLmludGVybmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJKU1BlZENTUyI+Ci0JCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3Bzb3VyY2UiIC8+Ci0JCTwvYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci5oeXBlcmxpbmtEZXRlY3RvclRhcmdldHMiPgotCQk8dGFyZ2V0Ci0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCW5hbWU9IiVKU1BfU291cmNlX3RhcmdldF9uYW1lIj4KLQkJPC90YXJnZXQ+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IuaHlwZXJsaW5rRGV0ZWN0b3JzIj4KLQkJPGh5cGVybGlua0RldGVjdG9yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbmsuSlNQSmF2YUh5cGVybGlua0RldGVjdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rLkpTUEphdmFIeXBlcmxpbmtEZXRlY3RvciIKLQkJCW5hbWU9IiVKYXZhX0VsZW1lbnRfaHlwZXJsaW5rIgotCQkJdGFyZ2V0SWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotCQk8L2h5cGVybGlua0RldGVjdG9yPgotCQk8aHlwZXJsaW5rRGV0ZWN0b3IKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluay5UYWdsaWJIeXBlcmxpbmtEZXRlY3RvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluay5UYWdsaWJIeXBlcmxpbmtEZXRlY3RvciIKLQkJCW5hbWU9IiVUYWdsaWJfaHlwZXJsaW5rIgotCQkJdGFyZ2V0SWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotCQk8L2h5cGVybGlua0RldGVjdG9yPgotCQk8aHlwZXJsaW5rRGV0ZWN0b3IKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluay5YTUxKYXZhSHlwZXJsaW5rRGV0ZWN0b3IiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbmsuWE1MSmF2YUh5cGVybGlua0RldGVjdG9yIgotCQkJbmFtZT0iJUphdmFfRWxlbWVudF9oeXBlcmxpbmsiCi0JCQl0YXJnZXRJZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCI+Ci0JCTwvaHlwZXJsaW5rRGV0ZWN0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+Ci0JCTxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3QuanNwLnVpLmpzcFNvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+Ci0gICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0iYWN0aXZlQ29udGV4dHMiPgotCSAgICAgICAgICAgPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkgICAgICAgICAgICAgIDxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiLz4KLQkgICAgICAgICAgIDwvaXRlcmF0ZT4KLSAgICAgICAgICAgIDwvd2l0aD4KLQkJPC9kZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLQkgICAgPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9Im1lbnU6cmVmYWN0b3JNZW51SWQiPgotCSAgICAgICA8c2VwYXJhdG9yIG5hbWU9ImpzcFJlZmFjdG9yQmVnaW4iIHZpc2libGU9ImZhbHNlIj48L3NlcGFyYXRvcj4KLQkgICAgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnJlZmFjdG9yLnJlbmFtZSIgaWQ9IlJlbmFtZUVsZW1lbnQiIGxhYmVsPSIlY29tbWFuZC5qc3AucmVmYWN0b3IucmVuYW1lLm5hbWUiIHN0eWxlPSJwdXNoIj4KLQkJCSAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5qc3AudWkuanNwU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCQk8L3Zpc2libGVXaGVuPgotCSAgICAgICA8L2NvbW1hbmQ+Ci0JICAgICAgIDxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5yZWZhY3Rvci5tb3ZlIiBpZD0iTW92ZUVsZW1lbnQiIGxhYmVsPSIlY29tbWFuZC5qc3AucmVmYWN0b3IubW92ZS5uYW1lIiBzdHlsZT0icHVzaCI+Ci0JCQkgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuanNwLnVpLmpzcFNvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkgICAgICAgPC9jb21tYW5kPgotCSAgICAgICA8c2VwYXJhdG9yIG5hbWU9ImpzcFJlZmFjdG9yQmVnaW4iIHZpc2libGU9ImZhbHNlIj48L3NlcGFyYXRvcj4KLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCQk8bWVudUNvbnRyaWJ1dGlvbgotCQkJbG9jYXRpb25VUkk9InBvcHVwOnJlZmFjdG9yUG9wdXBNZW51SWQiPgotCQkJPHNlcGFyYXRvciBuYW1lPSJqc3BSZWZhY3RvckJlZ2luIiB2aXNpYmxlPSJmYWxzZSI+PC9zZXBhcmF0b3I+Ci0JCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucmVmYWN0b3IucmVuYW1lIiBpZD0iUmVuYW1lRWxlbWVudCIgbGFiZWw9IiVjb21tYW5kLmpzcC5yZWZhY3Rvci5yZW5hbWUubmFtZSIgc3R5bGU9InB1c2giPgotCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5qc3AudWkuanNwU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkJPC9jb21tYW5kPgotCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnJlZmFjdG9yLm1vdmUiIGlkPSJNb3ZlRWxlbWVudCIgbGFiZWw9IiVjb21tYW5kLmpzcC5yZWZhY3Rvci5tb3ZlLm5hbWUiIHN0eWxlPSJwdXNoIj4KLQkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuanNwLnVpLmpzcFNvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4KLQkJCTxzZXBhcmF0b3IgbmFtZT0ianNwUmVmYWN0b3JCZWdpbiIgdmlzaWJsZT0iZmFsc2UiPjwvc2VwYXJhdG9yPgotCQk8L21lbnVDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBFbmFibGUgdGhlIEZvcm1hdEhhbmRsZXIgZm9yIEpTUCBDb250ZW50IFR5cGUgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgotCQk8aGFuZGxlciAKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzLkZvcm1hdEhhbmRsZXIiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0Ij4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuanNwLnVpLmpzcENvbnRlbnRUeXBlLmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJPC9hY3RpdmVXaGVuPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuanNwLnVpLmpzcENvbnRlbnRUeXBlLmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9oYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gU2V0IHVwIGEgZGVmaW5pdGlvbiBmb3IgSlNQIENvbnRlbnQgVHlwZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+Ci0JCTxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3QuanNwLnVpLmpzcENvbnRlbnRUeXBlLmRlZmluaXRpb24iPgotCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgotCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0JCQkJCTwhLS0gRm9yY2UgcHJvcGVydHkgdGVzdGVyIHRvIGxvYWQsIHNob3VsZCBub3QgY2F1c2UgZW50aXJlIHBsdWctaW4gdG8gc3RhcnQgLS0+Ci0JCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+Ci0JCQkJPC9hZGFwdD4KLQkJCTwvaXRlcmF0ZT4KLQkJPC9kZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2hhcmFjdGVyUGFpcmluZyI+Ci0JCTxpbnNlcnRlciBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGV4dC5DaGFyYWN0ZXJQYWlySW5zZXJ0ZXIiIGlkPSJvcmcuZWNsaXBzZS53c3QuanNwLnVpLmluc2VydGVyIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCQlwYXJ0aXRpb25zPSJvcmcuZWNsaXBzZS5qc3QuanNwLkpTUF9ESVJFQ1RJVkUsb3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUZBVUxULG9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfREVDTEFSQVRJT04iPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvaW5zZXJ0ZXI+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jaGFyYWN0ZXJQYWlyaW5nIj4KLQkJPGluc2VydGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRleHQuSmF2YUNoYXJhY3RlclBhaXJJbnNlcnRlciIgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc3AuamF2YS51aS5pbnNlcnRlciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiCi0JCQkJcGFydGl0aW9ucz0ib3JnLmVjbGlwc2UuanN0LmpzcC5TQ1JJUFQuSkFWQSI+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC9pbnNlcnRlcj4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNoYXJhY3RlclBhaXJpbmciPgotCQk8aW5zZXJ0ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGV4dC5DU1NDaGFyYWN0ZXJQYWlySW5zZXJ0ZXIiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy51aS5pbnNlcnRlciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiCi0JCQkJcGFydGl0aW9ucz0ib3JnLmVjbGlwc2Uud3N0LmNzcy5TVFlMRSI+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC9pbnNlcnRlcj4KLQk8L2V4dGVuc2lvbj4KLSA8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29tcGxldGlvblByb3Bvc2FsIj4KLSAgICA8cHJvcG9zYWxDYXRlZ29yeQotICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvdGFnLXRlbXBsYXRlLmdpZiIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm9wb3NhbENhdGVnb3J5LmpzcFRlbXBsYXRlcyIKLSAgICAgICAgICBuYW1lPSIlcHJvcG9zYWxDYXRlZ29yeS5qc3BUZW1wbGF0ZXMiPgotICAgIDwvcHJvcG9zYWxDYXRlZ29yeT4KLSAgICA8cHJvcG9zYWxDYXRlZ29yeQotICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvdGFnLWpzcC5naWYiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJvcG9zYWxDYXRlZ29yeS5qc3AiCi0gICAgICAgICAgbmFtZT0iJXByb3Bvc2FsQ2F0ZWdvcnkuanNwIj4KLSAgICA8L3Byb3Bvc2FsQ2F0ZWdvcnk+Ci0gICAgPHByb3Bvc2FsQ2F0ZWdvcnkKLSAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2VsY2wxNi9qYXZhYXNzaXN0X2NvLmdpZiIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm9wb3NhbENhdGVnb3J5LmpzcEphdmEiCi0gICAgICAgICAgbmFtZT0iJXByb3Bvc2FsQ2F0ZWdvcnkuanNwSmF2YSI+Ci0gICAgPC9wcm9wb3NhbENhdGVnb3J5PgotICAgIDxwcm9wb3NhbENvbXB1dGVyRXh0ZW5kZWRBY3RpdmF0aW9uCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByb3Bvc2FsQ29tcHV0ZXIuaHRtbFRhZ3MiPgotICAgICAgIDxjb250ZW50VHlwZQotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLSAgICAgICAgICA8cGFydGl0aW9uVHlwZQotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQiPgotICAgICAgICAgIDwvcGFydGl0aW9uVHlwZT4KLSAgICAgICAgICA8cGFydGl0aW9uVHlwZQotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0NPTU1FTlQiPgotICAgICAgICAgIDwvcGFydGl0aW9uVHlwZT4KLSAgICAgICAgICA8cGFydGl0aW9uVHlwZQotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiPgotICAgICAgICAgIDwvcGFydGl0aW9uVHlwZT4KLSAgICAgICAgICA8cGFydGl0aW9uVHlwZQotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLkpTUF9DT01NRU5UIj4KLSAgICAgICAgICA8L3BhcnRpdGlvblR5cGU+Ci0gICAgICAgICAgPHBhcnRpdGlvblR5cGUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfRElSRUNUSVZFIj4KLSAgICAgICAgICA8L3BhcnRpdGlvblR5cGU+Ci0gICAgICAgPC9jb250ZW50VHlwZT4KLSAgICA8L3Byb3Bvc2FsQ29tcHV0ZXJFeHRlbmRlZEFjdGl2YXRpb24+Ci0gICAgPHByb3Bvc2FsQ29tcHV0ZXJFeHRlbmRlZEFjdGl2YXRpb24KLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJvcG9zYWxDb21wdXRlci5odG1sVGVtcGxhdGVzIj4KLSAgICAgICA8Y29udGVudFR5cGUKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0gICAgICAgICAgPHBhcnRpdGlvblR5cGUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUZBVUxUIj4KLSAgICAgICAgICA8L3BhcnRpdGlvblR5cGU+Ci0gICAgICAgICAgPHBhcnRpdGlvblR5cGUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9DT01NRU5UIj4KLSAgICAgICAgICA8L3BhcnRpdGlvblR5cGU+Ci0gICAgICAgICAgPHBhcnRpdGlvblR5cGUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5TVF9ERUZBVUxUIj4KLSAgICAgICAgICA8L3BhcnRpdGlvblR5cGU+Ci0gICAgICAgICAgPHBhcnRpdGlvblR5cGUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfQ09NTUVOVCI+Ci0gICAgICAgICAgPC9wYXJ0aXRpb25UeXBlPgotICAgICAgIDwvY29udGVudFR5cGU+Ci0gICAgPC9wcm9wb3NhbENvbXB1dGVyRXh0ZW5kZWRBY3RpdmF0aW9uPgotICAgIDxwcm9wb3NhbENvbXB1dGVyRXh0ZW5kZWRBY3RpdmF0aW9uCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJvcG9zYWxDb21wdXRlci54bWxUYWdzIj4KLSAgICAgICA8Y29udGVudFR5cGUKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0gICAgICAgICAgPHBhcnRpdGlvblR5cGUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCI+Ci0gICAgICAgICAgPC9wYXJ0aXRpb25UeXBlPgotICAgICAgIDwvY29udGVudFR5cGU+Ci0gICAgPC9wcm9wb3NhbENvbXB1dGVyRXh0ZW5kZWRBY3RpdmF0aW9uPgotICAgIDxwcm9wb3NhbENvbXB1dGVyRXh0ZW5kZWRBY3RpdmF0aW9uCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJvcG9zYWxDb21wdXRlci54bWxUZW1wbGF0ZXMiPgotICAgICAgIDxjb250ZW50VHlwZQotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLSAgICAgICAgICA8cGFydGl0aW9uVHlwZQotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIj4KLSAgICAgICAgICA8L3BhcnRpdGlvblR5cGU+Ci0gICAgICAgICAgPHBhcnRpdGlvblR5cGUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfRElSRUNUSVZFIj4KLSAgICAgICAgICA8L3BhcnRpdGlvblR5cGU+Ci0gICAgICAgPC9jb250ZW50VHlwZT4KLSAgICA8L3Byb3Bvc2FsQ29tcHV0ZXJFeHRlbmRlZEFjdGl2YXRpb24+Ci0gICAgPHByb3Bvc2FsQ29tcHV0ZXIKLSAgICAgICAgICBhY3RpdmF0ZT0iZmFsc2UiCi0gICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm9wb3NhbENhdGVnb3J5LmpzcFRlbXBsYXRlcyIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkpTUFRlbXBsYXRlc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnByb3Bvc2FsQ29tcHV0ZXIuanNwVGVtcGxhdGVzIj4KLSAgICAgICA8Y29udGVudFR5cGUKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0gICAgICAgICAgPHBhcnRpdGlvblR5cGUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUZBVUxUIj4KLSAgICAgICAgICA8L3BhcnRpdGlvblR5cGU+Ci0gICAgICAgPC9jb250ZW50VHlwZT4KLSAgICA8L3Byb3Bvc2FsQ29tcHV0ZXI+Ci0gICAgPHByb3Bvc2FsQ29tcHV0ZXIKLSAgICAgICAgICBhY3RpdmF0ZT0iZmFsc2UiCi0gICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm9wb3NhbENhdGVnb3J5LmpzcCIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkpTUENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnByb3Bvc2FsQ29tcHV0ZXIuanNwIj4KLSAgICAgICA8Y29udGVudFR5cGUKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0gICAgICAgPC9jb250ZW50VHlwZT4KLSAgICA8L3Byb3Bvc2FsQ29tcHV0ZXI+Ci0gICAgPHByb3Bvc2FsQ29tcHV0ZXIKLSAgICAgICAgICBhY3RpdmF0ZT0iZmFsc2UiCi0gICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm9wb3NhbENhdGVnb3J5LmpzcCIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkxpYnJhcnlUYWdzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJvcG9zYWxDb21wdXRlci5saWJyYXJ5VGFncyI+Ci0gICAgICAgPGNvbnRlbnRUeXBlCi0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotICAgICAgICAgIDxwYXJ0aXRpb25UeXBlCi0gICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfREVGQVVMVCI+Ci0gICAgICAgICAgPC9wYXJ0aXRpb25UeXBlPgotICAgICAgICAgIDxwYXJ0aXRpb25UeXBlCi0gICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfQ09NTUVOVCI+Ci0gICAgICAgICAgPC9wYXJ0aXRpb25UeXBlPgotICAgICAgICAgIDxwYXJ0aXRpb25UeXBlCi0gICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuU1RfREVGQVVMVCI+Ci0gICAgICAgICAgPC9wYXJ0aXRpb25UeXBlPgotICAgICAgICAgIDxwYXJ0aXRpb25UeXBlCi0gICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuSlNQX0NPTU1FTlQiPgotICAgICAgICAgIDwvcGFydGl0aW9uVHlwZT4KLSAgICAgICAgICA8cGFydGl0aW9uVHlwZQotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLkpTUF9ESVJFQ1RJVkUiPgotICAgICAgICAgIDwvcGFydGl0aW9uVHlwZT4KLSAgICAgICA8L2NvbnRlbnRUeXBlPgotICAgIDwvcHJvcG9zYWxDb21wdXRlcj4KLSAgICA8cHJvcG9zYWxDb21wdXRlcgotICAgICAgICAgIGFjdGl2YXRlPSJmYWxzZSIKLSAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnByb3Bvc2FsQ2F0ZWdvcnkuanNwSmF2YSIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm9wb3NhbENvbXB1dGVyLmpzcEphdmEiPgotICAgICAgIDxjb250ZW50VHlwZQotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLSAgICAgICAgICA8cGFydGl0aW9uVHlwZQotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLlNDUklQVC5KQVZBIj4KLSAgICAgICAgICA8L3BhcnRpdGlvblR5cGU+Ci0gICAgICAgICAgPHBhcnRpdGlvblR5cGUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfQ0RBVEEiPgotICAgICAgICAgIDwvcGFydGl0aW9uVHlwZT4KLSAgICAgICAgICA8cGFydGl0aW9uVHlwZQotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLkRFRkFVTFRfSlNQIj4KLSAgICAgICAgICA8L3BhcnRpdGlvblR5cGU+Ci0gICAgICAgICAgPHBhcnRpdGlvblR5cGUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5TQ1JJUFQuREVMSU1JVEVSIj4KLSAgICAgICAgICA8L3BhcnRpdGlvblR5cGU+Ci0gICAgICAgICAgPHBhcnRpdGlvblR5cGUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5TQ1JJUFQuSkFWQVNDUklQVCI+Ci0gICAgICAgICAgPC9wYXJ0aXRpb25UeXBlPgotICAgICAgICAgIDxwYXJ0aXRpb25UeXBlCi0gICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCI+Ci0gICAgICAgICAgPC9wYXJ0aXRpb25UeXBlPgotICAgICAgIDwvY29udGVudFR5cGU+Ci0gICAgPC9wcm9wb3NhbENvbXB1dGVyPgotICAgIDxwcm9wb3NhbENvbXB1dGVyCi0gICAgICAgICAgYWN0aXZhdGU9ImZhbHNlIgotICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJvcG9zYWxDYXRlZ29yeS5qc3BKYXZhIgotICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSlNQRUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm9wb3NhbENvbXB1dGVyLmpzcEVMIj4KLSAgICAgICA8Y29udGVudFR5cGUKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0gICAgICAgICAgPHBhcnRpdGlvblR5cGUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5TQ1JJUFQuSlNQX0VMIj4KLSAgICAgICAgICA8L3BhcnRpdGlvblR5cGU+Ci0gICAgICAgPC9jb250ZW50VHlwZT4KLSAgICA8L3Byb3Bvc2FsQ29tcHV0ZXI+Ci0gICAgPHByb3Bvc2FsQ29tcHV0ZXIKLSAgICAgICAgICBhY3RpdmF0ZT0iZmFsc2UiCi0gICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm9wb3NhbENhdGVnb3J5LmpzcEphdmEiCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5KU1BJbXBvcnRDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm9wb3NhbENvbXB1dGVyLmpzcEltcG9ydCI+Ci0gICAgICAgPGNvbnRlbnRUeXBlCi0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotICAgICAgICAgIDxwYXJ0aXRpb25UeXBlCi0gICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuSlNQX0RJUkVDVElWRSI+Ci0gICAgICAgICAgPC9wYXJ0aXRpb25UeXBlPgotICAgICAgIDwvY29udGVudFR5cGU+Ci0gICAgPC9wcm9wb3NhbENvbXB1dGVyPgotICAgIDxwcm9wb3NhbENvbXB1dGVyCi0gICAgICAgICAgYWN0aXZhdGU9ImZhbHNlIgotICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJvcG9zYWxDYXRlZ29yeS5qc3AiCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5KU1BQcm9wZXJ0eUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnByb3Bvc2FsQ29tcHV0ZXIuanNwUHJvcGVydHkiPgotICAgICAgIDxjb250ZW50VHlwZQotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLSAgICAgICA8L2NvbnRlbnRUeXBlPgotICAgIDwvcHJvcG9zYWxDb21wdXRlcj4KLSAgICA8cHJvcG9zYWxDb21wdXRlcgotICAgICAgICAgIGFjdGl2YXRlPSJmYWxzZSIKLSAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnByb3Bvc2FsQ2F0ZWdvcnkuanNwIgotICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSlNQVXNlQmVhbkNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnByb3Bvc2FsQ29tcHV0ZXIuanNwVXNlQmVhbiI+Ci0gICAgICAgPGNvbnRlbnRUeXBlCi0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotICAgICAgIDwvY29udGVudFR5cGU+Ci0gICAgPC9wcm9wb3NhbENvbXB1dGVyPgotICAgIDxwcm9wb3NhbENvbXB1dGVyCi0gICAgICAgICAgYWN0aXZhdGU9ImZhbHNlIgotICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJvcG9zYWxDYXRlZ29yeS5qc3AiCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5KU1BUYWdsaWJDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm9wb3NhbENvbXB1dGVyLmpzcFRhZ2xpYiI+Ci0gICAgICAgPGNvbnRlbnRUeXBlCi0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotICAgICAgIDwvY29udGVudFR5cGU+Ci0gICAgPC9wcm9wb3NhbENvbXB1dGVyPgotICAgIDxwcm9wb3NhbENvbXB1dGVyRXh0ZW5kZWRBY3RpdmF0aW9uCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkucHJvcG9zYWxDb21wdXRlci5jc3MiPgotICAgICAgIDxjb250ZW50VHlwZQotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLSAgICAgICAgICA8cGFydGl0aW9uVHlwZQotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLlNUWUxFIj4KLSAgICAgICAgICA8L3BhcnRpdGlvblR5cGU+Ci0gICAgICAgPC9jb250ZW50VHlwZT4KLSAgICA8L3Byb3Bvc2FsQ29tcHV0ZXJFeHRlbmRlZEFjdGl2YXRpb24+Ci0gICAgPHByb3Bvc2FsQ29tcHV0ZXJFeHRlbmRlZEFjdGl2YXRpb24KLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5wcm9wb3NhbENvbXB1dGVyLmNzc1RlbXBsYXRlcyI+Ci0gICAgICAgPGNvbnRlbnRUeXBlCi0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotICAgICAgICAgIDxwYXJ0aXRpb25UeXBlCi0gICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuU1RZTEUiPgotICAgICAgICAgIDwvcGFydGl0aW9uVHlwZT4KLSAgICAgICA8L2NvbnRlbnRUeXBlPgotICAgIDwvcHJvcG9zYWxDb21wdXRlckV4dGVuZGVkQWN0aXZhdGlvbj4KLSA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uIj4KLSAgICA8Y2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24KLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbiIKLSAgICAgICAgICBjb250ZW50VHlwZUlEPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLSAgICA8L2NhdGVnb3JpZXNDb25maWd1cmF0aW9uPgotIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSlNQZWRDU1NQcm9wZXJ0eVNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0pTUGVkQ1NTUHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljNzgyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSlNQZWRDU1NQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvcGVydGllcy5DU1NQcm9wZXJ0eVNvdXJjZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBKU1BlZENTU1Byb3BlcnR5U291cmNlIGV4dGVuZHMgQ1NTUHJvcGVydHlTb3VyY2UgewotCi0JcHVibGljIEpTUGVkQ1NTUHJvcGVydHlTb3VyY2UoSUNTU05vZGUgdGFyZ2V0KSB7Ci0JCXN1cGVyKHRhcmdldCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQkvLyB3b3JrYXJvdW5kIHRvIGF2b2lkIERPTUV4Y2VwdGlvbjogaWYgdmFsdWUgY29udGFpbnMganNwIGVsZW1lbnQsIG5vdGhpbmcgaGFwcGVuLgotCQlTdHJpbmcgdiA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0JCWlmICh2LmluZGV4T2YoIiR7IikgIT0gLTEgfHwgdi5pbmRleE9mKCI8JT0iKSAhPSAtMSl7Ci0JCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBKU1BVSU1lc3NhZ2VzLlRpdGxlX0ludmFsaWRWYWx1ZTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG1lc3NhZ2UgPSBKU1BVSU1lc3NhZ2VzLk1lc3NhZ2VfSW52YWxpZFZhbHVlOyAvLyROT04tTkxTLTEkCi0JCQlNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKHdpbmRvdy5nZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuc2V0UHJvcGVydHlWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVySlNQZWRDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckpTUGVkQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOWU4N2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVySlNQZWRDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MudWkuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JKU1BlZENTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVySlNQZWRDU1MgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyQ1NTIHsKLQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSURvY3VtZW50VHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbikgewotCQlyZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JKU1BlZENTUyk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvdWkvaW50ZXJuYWwvdmlld3MvcHJvcGVydGllcy9KU1BlZENTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL3VpL2ludGVybmFsL3ZpZXdzL3Byb3BlcnRpZXMvSlNQZWRDU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDAzODE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvdWkvaW50ZXJuYWwvdmlld3MvcHJvcGVydGllcy9KU1BlZENTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLnVpLmludGVybmFsLnByb3BlcnRpZXMuSlNQZWRDU1NQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5VSUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEpTUGVkQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiB7Ci0JcHJpdmF0ZSBjbGFzcyBDU1NQcm9wZXJ0eVNoZWV0UmVmcmVzaEFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIgewotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJCWlmIChmUHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCkgewotCQkJCWdldFByb3BlcnRpZXNSZWZyZXNoSm9iKCkuYWRkUHJvcGVydHlTaGVldFBhZ2UoZlByb3BlcnR5U2hlZXRQYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgQ1NTUHJvcGVydHlTb3VyY2VQcm92aWRlciBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBJUHJvcGVydHlTb3VyY2UgZlByb3BlcnR5U291cmNlID0gbnVsbDsKLQkJcHJpdmF0ZSBJQ1NTTm9kZSBmU291cmNlID0gbnVsbDsKLQotCQlwdWJsaWMgSVByb3BlcnR5U291cmNlIGdldFByb3BlcnR5U291cmNlKE9iamVjdCBvYmplY3QpIHsKLQkJCWlmIChmU291cmNlICE9IG51bGwgJiYgb2JqZWN0LmVxdWFscyhmU291cmNlKSkgewotCQkJCXJldHVybiBmUHJvcGVydHlTb3VyY2U7Ci0JCQl9Ci0KLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJCWZTb3VyY2UgPSAoSUNTU05vZGUpb2JqZWN0OwotCQkJCWZQcm9wZXJ0eVNvdXJjZSA9IG5ldyBKU1BlZENTU1Byb3BlcnR5U291cmNlKGZTb3VyY2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZlNvdXJjZSA9IG51bGw7Ci0JCQkJZlByb3BlcnR5U291cmNlID0gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBmUHJvcGVydHlTb3VyY2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFByb3BlcnRpZXNSZWZyZXNoSm9iIGV4dGVuZHMgVUlKb2IgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUERBVEVfREVMQVkgPSAyMDA7Ci0KLQkJcHJpdmF0ZSBTZXQgcHJvcGVydHlTaGVldFBhZ2VzID0gbnVsbDsKLQotCQlwdWJsaWMgUHJvcGVydGllc1JlZnJlc2hKb2IoKSB7Ci0JCQlzdXBlcihYTUxVSU1lc3NhZ2VzLkpGYWNlTm9kZUFkYXB0ZXJfMSk7Ci0JCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCQlzZXRQcmlvcml0eShKb2IuU0hPUlQpOwotCQkJcHJvcGVydHlTaGVldFBhZ2VzID0gbmV3IEhhc2hTZXQoMSk7Ci0JCX0KLQotCQl2b2lkIGFkZFByb3BlcnR5U2hlZXRQYWdlKElQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZXMuYWRkKHBhZ2UpOwotCQkJc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlPYmplY3RbXSBwYWdlcyA9IHByb3BlcnR5U2hlZXRQYWdlcy50b0FycmF5KCk7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZXMuY2xlYXIoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UgPSAoUHJvcGVydHlTaGVldFBhZ2UpIHBhZ2VzW2ldOwotCQkJCWlmIChwYWdlLmdldENvbnRyb2woKSAhPSBudWxsICYmICFwYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJcGFnZS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCX0KLQotCXByaXZhdGUgUHJvcGVydGllc1JlZnJlc2hKb2IgZlByb3BlcnRpZXNSZWZyZXNoSm9iID0gbnVsbDsKLQotCUlQcm9wZXJ0eVNoZWV0UGFnZSBmUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQlwcml2YXRlIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyID0gbnVsbDsKLQotCXByaXZhdGUgSU5vZGVBZGFwdGVyIGZSZWZyZXNoQWRhcHRlciA9IG5ldyBDU1NQcm9wZXJ0eVNoZWV0UmVmcmVzaEFkYXB0ZXIoKTsKLQotCXByaXZhdGUgSU5vZGVOb3RpZmllcltdIGZTZWxlY3RlZE5vdGlmaWVyczsKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgSlNQZWRDU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbigpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRJbnB1dFNlbGVjdGlvbihJV29ya2JlbmNoUGFydCBzZWxlY3RpbmdQYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyByZW1vdmUgVUkgcmVmcmVzaCBhZGFwdGVycwotCQlpZiAoZlNlbGVjdGVkTm90aWZpZXJzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlNlbGVjdGVkTm90aWZpZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZlNlbGVjdGVkTm90aWZpZXJzW2ldLnJlbW92ZUFkYXB0ZXIoZlJlZnJlc2hBZGFwdGVyKTsKLQkJCX0KLQkJCWZTZWxlY3RlZE5vdGlmaWVycyA9IG51bGw7Ci0JCX0KLQotCQlJU2VsZWN0aW9uIHByZWZlcnJlZFNlbGVjdGlvbiA9IHN1cGVyLmdldElucHV0U2VsZWN0aW9uKHNlbGVjdGluZ1BhcnQsIHNlbGVjdGlvbik7Ci0JCWlmIChwcmVmZXJyZWRTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJT2JqZWN0W10gc2VsZWN0ZWRPYmplY3RzID0gbmV3IE9iamVjdFsoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnNpemUoKV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikudG9BcnJheSgpLCAwLCBzZWxlY3RlZE9iamVjdHMsIDAsIHNlbGVjdGVkT2JqZWN0cy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc2VsZWN0ZWRPYmplY3RzW2ldIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCQkJSUNTU05vZGUgbm9kZSA9IChJQ1NTTm9kZSkgc2VsZWN0ZWRPYmplY3RzW2ldOwotCQkJCQl3aGlsZSAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlBSSU1JVElWRVZBTFVFX05PREUgfHwgbm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSkgewotCQkJCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJc2VsZWN0ZWRPYmplY3RzW2ldID0gbm9kZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLyoKLQkJCSAqIEFkZCBVSSByZWZyZXNoIGFkYXB0ZXJzIGFuZCByZW1lbWJlciBub3RpZmllcnMgZm9yIGxhdGVyCi0JCQkgKiByZW1vdmFsCi0JCQkgKi8KLQkJCWlmIChzZWxlY3RlZE9iamVjdHMubGVuZ3RoID4gMCkgewotCQkJCUxpc3Qgc2VsZWN0ZWROb3RpZmllcnMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChzZWxlY3RlZE9iamVjdHNbaV0gaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkJCQlzZWxlY3RlZE5vdGlmaWVycy5hZGQoc2VsZWN0ZWRPYmplY3RzW2ldKTsKLQkJCQkJCSgoSU5vZGVOb3RpZmllcikgc2VsZWN0ZWRPYmplY3RzW2ldKS5hZGRBZGFwdGVyKGZSZWZyZXNoQWRhcHRlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZlNlbGVjdGVkTm90aWZpZXJzID0gKElOb2RlTm90aWZpZXJbXSkgc2VsZWN0ZWROb3RpZmllcnMudG9BcnJheShuZXcgSU5vZGVOb3RpZmllcltzZWxlY3RlZE5vdGlmaWVycy5zaXplKCldKTsKLQkJCX0KLQkJCXByZWZlcnJlZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGVkT2JqZWN0cyk7Ci0JCX0KLQkJcmV0dXJuIHByZWZlcnJlZFNlbGVjdGlvbjsKLQl9Ci0KLQlQcm9wZXJ0aWVzUmVmcmVzaEpvYiBnZXRQcm9wZXJ0aWVzUmVmcmVzaEpvYigpIHsKLQkJaWYgKGZQcm9wZXJ0aWVzUmVmcmVzaEpvYiA9PSBudWxsKSB7Ci0JCQlmUHJvcGVydGllc1JlZnJlc2hKb2IgPSBuZXcgUHJvcGVydGllc1JlZnJlc2hKb2IoKTsKLQkJfQotCQlyZXR1cm4gZlByb3BlcnRpZXNSZWZyZXNoSm9iOwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlTb3VyY2VQcm92aWRlciBnZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKElQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlKSB7Ci0JCWlmIChmUHJvcGVydHlTb3VyY2VQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmUHJvcGVydHlTb3VyY2VQcm92aWRlciA9IG5ldyBDU1NQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKCk7Ci0JCQlmUHJvcGVydHlTaGVldFBhZ2UgPSBwYWdlOwotCQl9Ci0JCXJldHVybiBmUHJvcGVydHlTb3VyY2VQcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmNvbmZpZ3VyZSgpIHsKLQkJc3VwZXIudW5jb25maWd1cmUoKTsKLQkJaWYgKGZTZWxlY3RlZE5vdGlmaWVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZTZWxlY3RlZE5vdGlmaWVycy5sZW5ndGg7IGkrKykgewotCQkJCWZTZWxlY3RlZE5vdGlmaWVyc1tpXS5yZW1vdmVBZGFwdGVyKGZSZWZyZXNoQWRhcHRlcik7Ci0JCQl9Ci0JCQlmU2VsZWN0ZWROb3RpZmllcnMgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzlkN2IyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIE1hdHRoaWFzIEZ1ZXNzZWwsIG1hdC5mdWVzc2VsQGdteC5uZXQgLSBbMTc3Mzg3XSB1c2UgYmFzZSBoeXBlcmxpbmtpbmcgZXh0ZW5zaW9uIHBvaW50cyAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LklKYXZhUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5KYXZhU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0RG91YmxlQ2xpY2tTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUNvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmF1dG9lZGl0LkF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYXV0b2VkaXQuU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5hdXRvZWRpdC5TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUpTUEphdmE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkpTUFN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZm9ybWF0LkZvcm1hdHRpbmdTdHJhdGVneUpTUEphdmE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmphdmEuTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuanNwZWwuTGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGV4dC5JQ1NTUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdC5IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0dGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBhIHNvdXJjZSB2aWV3ZXIgd2hpY2ggc2hvd3MgSlNQIGNvbnRlbnQuCi0gKiA8cD4KLSAqIENsaWVudHMgY2FuIHN1YmNsYXNzIGFuZCBvdmVycmlkZSBqdXN0IHRob3NlIG1ldGhvZHMgd2hpY2ggbXVzdCBiZSBzcGVjaWZpYwotICogdG8gdGhlaXIgbmVlZHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiB7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24gYmVjYXVzZSBub3Qgc291cmNldmlld2VyLXNwZWNpZmljIGFuZAotCSAqIGl0J3MgYSBTdHJpbmcgYXJyYXkKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JKU1A7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGZMaW5lU3R5bGVQcm92aWRlckZvckpTUEVMOwotCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGZIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGZKYXZhU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBmWE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGZTdGF0dXNMaW5lTGFiZWxQcm92aWRlcjsKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCgpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24jZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQXV0b0VkaXRTdHJhdGVneVtdIGdldEF1dG9FZGl0U3RyYXRlZ2llcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCUlBdXRvRWRpdFN0cmF0ZWd5W10gc3RyYXRlZ2llcyA9IG51bGw7Ci0KLQkJaWYgKGNvbnRlbnRUeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUKSB7Ci0JCQkvLyB4bWwgYXV0b2VkaXQgc3RyYXRlZ2llcwotCQkJc3RyYXRlZ2llcyA9IGdldFhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRBdXRvRWRpdFN0cmF0ZWdpZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSkgewotCQkJLy8ganNwIGphdmEgYXV0b2VkaXQgc3RyYXRlZ2llcwotCQkJTGlzdCBhbGxTdHJhdGVnaWVzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQkJLy8gYWRkIHRoZSBzY3JpdHBsZXQgYXV0b2VkaXQgc3RyYXRlZ3kgZmlyc3QKLQkJCWFsbFN0cmF0ZWdpZXMuYWRkKG5ldyBTdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUpTUEphdmEoKSk7Ci0JCQkKLQkJCUlBdXRvRWRpdFN0cmF0ZWd5W10gamF2YVN0cmF0ZWdpZXMgPSBnZXRKYXZhU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldEF1dG9FZGl0U3RyYXRlZ2llcyhzb3VyY2VWaWV3ZXIsIElKYXZhUGFydGl0aW9ucy5KQVZBX1BBUlRJVElPTklORyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGphdmFTdHJhdGVnaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYWxsU3RyYXRlZ2llcy5hZGQoamF2YVN0cmF0ZWdpZXNbaV0pOwotCQkJfQotCQkJLy8gYmUgc3VyZSB0aGlzIGlzIGFkZGVkIGxhc3QsIGFmdGVyIG90aGVycywgc28gaXQgY2FuIG1vZGlmeQotCQkJLy8gcmVzdWx0cyBmcm9tIGVhcmxpZXIgc3RlcHMuCi0JCQkvLyBhZGQgYXV0byBlZGl0IHN0cmF0ZWd5IHRoYXQgaGFuZGxlcyB3aGVuIHRhYiBrZXkgaXMgcHJlc3NlZAotCQkJYWxsU3RyYXRlZ2llcy5hZGQobmV3IEF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzKCkpOwotCi0JCQlzdHJhdGVnaWVzID0gKElBdXRvRWRpdFN0cmF0ZWd5W10pIGFsbFN0cmF0ZWdpZXMudG9BcnJheShuZXcgSUF1dG9FZGl0U3RyYXRlZ3lbYWxsU3RyYXRlZ2llcy5zaXplKCldKTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUIHx8IGNvbnRlbnRUeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFQ0xBUkFUSU9OIHx8IGNvbnRlbnRUeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkUpIHsKLQkJCS8vIGh0bWwgYW5kIGpzcCBhdXRvZWRpdCBzdHJhdGVnaWVzCi0JCQlMaXN0IGFsbFN0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCQkvLyBhZGQgdGhlIGpzcCBhdXRvZWRpdCBzdHJhdGVneSBmaXJzdCB0aGVuIGFkZCBhbGwgaHRtbCdzCi0JCQlhbGxTdHJhdGVnaWVzLmFkZChuZXcgU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lKU1AoKSk7Ci0KLQkJCUlBdXRvRWRpdFN0cmF0ZWd5W10gaHRtbFN0cmF0ZWdpZXMgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldEF1dG9FZGl0U3RyYXRlZ2llcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaHRtbFN0cmF0ZWdpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlhbGxTdHJhdGVnaWVzLmFkZChodG1sU3RyYXRlZ2llc1tpXSk7Ci0JCQl9Ci0KLQkJCXN0cmF0ZWdpZXMgPSAoSUF1dG9FZGl0U3RyYXRlZ3lbXSkgYWxsU3RyYXRlZ2llcy50b0FycmF5KG5ldyBJQXV0b0VkaXRTdHJhdGVneVthbGxTdHJhdGVnaWVzLnNpemUoKV0pOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gZGVmYXVsdCBhdXRvZWRpdCBzdHJhdGVnaWVzCi0JCQlMaXN0IGFsbFN0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCQlJQXV0b0VkaXRTdHJhdGVneVtdIHN1cGVyU3RyYXRlZ2llcyA9IHN1cGVyLmdldEF1dG9FZGl0U3RyYXRlZ2llcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJTdHJhdGVnaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYWxsU3RyYXRlZ2llcy5hZGQoc3VwZXJTdHJhdGVnaWVzW2ldKTsKLQkJCX0KLQotCQkJLy8gYmUgc3VyZSB0aGlzIGlzIGFkZGVkIGxhc3QsIGFmdGVyIG90aGVycywgc28gaXQgY2FuIG1vZGlmeQotCQkJLy8gcmVzdWx0cyBmcm9tIGVhcmxpZXIgc3RlcHMuCi0JCQkvLyBhZGQgYXV0byBlZGl0IHN0cmF0ZWd5IHRoYXQgaGFuZGxlcyB3aGVuIHRhYiBrZXkgaXMgcHJlc3NlZAotCQkJYWxsU3RyYXRlZ2llcy5hZGQobmV3IEF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzKCkpOwotCi0JCQlzdHJhdGVnaWVzID0gKElBdXRvRWRpdFN0cmF0ZWd5W10pIGFsbFN0cmF0ZWdpZXMudG9BcnJheShuZXcgSUF1dG9FZGl0U3RyYXRlZ3lbYWxsU3RyYXRlZ2llcy5zaXplKCldKTsKLQkJfQotCi0JCXJldHVybiBzdHJhdGVnaWVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9PSBudWxsKSB7Ci0JCQkvKgotCQkJICogQSBsaXR0bGUgYml0IG9mIGNoZWF0aW5nIGJlY2F1c2UgYXNzdW1pbmcgaHRtbCdzIGNvbmZpZ3VyZWQKLQkJCSAqIGNvbnRlbnQgdHlwZXMgd2lsbCBhZGQgZGVmYXVsdCwgdW5rbm93biwgYW5kIGFsbCB4bWwgY29uZmlndXJlZAotCQkJICogY29udGVudCB0eXBlcwotCQkJICovCi0JCQlTdHJpbmdbXSBodG1sVHlwZXMgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCVN0cmluZ1tdIGpzcFR5cGVzID0gU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUC5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCk7Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbaHRtbFR5cGVzLmxlbmd0aCArIGpzcFR5cGVzLmxlbmd0aF07Ci0KLQkJCWludCBpbmRleCA9IDA7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGh0bWxUeXBlcywgMCwgZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMsIGluZGV4LCBodG1sVHlwZXMubGVuZ3RoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoanNwVHlwZXMsIDAsIGZDb25maWd1cmVkQ29udGVudFR5cGVzLCBpbmRleCArPSBodG1sVHlwZXMubGVuZ3RoLCBqc3BUeXBlcy5sZW5ndGgpOwotCQl9Ci0KLQkJcmV0dXJuIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uI2dldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKAotCSAqIAlvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIGdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKAotCQkJSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSlNQU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoCi0JCQkJdGhpcy5nZXRDb250ZW50QXNzaXN0YW50KCksIHBhcnRpdGlvblR5cGUsIHNvdXJjZVZpZXdlcik7Ci0JCXJldHVybiBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtwcm9jZXNzb3J9OwotCX0KLQotCXB1YmxpYyBJQ29udGVudEZvcm1hdHRlciBnZXRDb250ZW50Rm9ybWF0dGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCUlDb250ZW50Rm9ybWF0dGVyIGZvcm1hdHRlciA9IHN1cGVyLmdldENvbnRlbnRGb3JtYXR0ZXIoc291cmNlVmlld2VyKTsKLQkJLy8gc3VwZXIgd2FzIHVuYWJsZSB0byBjcmVhdGUgYSBmb3JtYXR0ZXIsIHByb2JhYmx5IGJlY2F1c2UKLQkJLy8gc291cmNlVmlld2VyIGRvZXMgbm90IGhhdmUgZG9jdW1lbnQgc2V0IHlldCwgc28ganVzdCBjcmVhdGUgYQotCQkvLyBnZW5lcmljIG9uZQotCQlpZiAoIShmb3JtYXR0ZXIgaW5zdGFuY2VvZiBNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKSkKLQkJCWZvcm1hdHRlciA9IG5ldyBNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKGdldENvbmZpZ3VyZWREb2N1bWVudFBhcnRpdGlvbmluZyhzb3VyY2VWaWV3ZXIpLCBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCk7Ci0KLQkJTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlciBtdWx0aUZvcm1hdHRlciA9IChNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKSBmb3JtYXR0ZXI7Ci0JCW11bHRpRm9ybWF0dGVyLnNldE1hc3RlclN0cmF0ZWd5KG5ldyBTdHJ1Y3R1cmVkRm9ybWF0dGluZ1N0cmF0ZWd5KG5ldyBIVE1MRm9ybWF0UHJvY2Vzc29ySW1wbCgpKSk7Ci0JCW11bHRpRm9ybWF0dGVyLnNldFNsYXZlU3RyYXRlZ3kobmV3IEZvcm1hdHRpbmdTdHJhdGVneUpTUEphdmEoKSwgSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSk7Ci0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0KLQlwdWJsaWMgSVRleHREb3VibGVDbGlja1N0cmF0ZWd5IGdldERvdWJsZUNsaWNrU3RyYXRlZ3koSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlJVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3kgc3RyYXRlZ3kgPSBudWxsOwotCi0JCS8vIGh0bWwgb3IgamF2YXNjcmlwdAotCQlpZiAoY29udGVudFR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCB8fCBjb250ZW50VHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKQotCQkJc3RyYXRlZ3kgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldERvdWJsZUNsaWNrU3RyYXRlZ3koc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEgfHwgY29udGVudFR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCkKLQkJCS8vIEpTUCBKYXZhIG9yIEpTUCBKYXZhU2NyaXB0Ci0JCQlzdHJhdGVneSA9IGdldEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0RG91YmxlQ2xpY2tTdHJhdGVneShzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJZWxzZSBpZiAoY29udGVudFR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQpCi0JCQkvLyBKU1AgKGp1c3QgdHJlYXQgbGlrZSBodG1sKQotCQkJc3RyYXRlZ3kgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldERvdWJsZUNsaWNrU3RyYXRlZ3koc291cmNlVmlld2VyLCBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKTsKLQkJZWxzZQotCQkJc3RyYXRlZ3kgPSBzdXBlci5nZXREb3VibGVDbGlja1N0cmF0ZWd5KHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCi0JCXJldHVybiBzdHJhdGVneTsKLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJaWYgKGZIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlmSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCgpOwotCQl9Ci0JCXJldHVybiBmSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldEluZGVudFByZWZpeGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJU3RyaW5nW10gaW5kZW50YXRpb25zID0gbnVsbDsKLQotCQlpZiAoY29udGVudFR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpCi0JCQlpbmRlbnRhdGlvbnMgPSBnZXRYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0SW5kZW50UHJlZml4ZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCWVsc2UKLQkJCWluZGVudGF0aW9ucyA9IGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0SW5kZW50UHJlZml4ZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0KLQkJcmV0dXJuIGluZGVudGF0aW9uczsKLQl9Ci0KLQlwcml2YXRlIEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGdldEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQlpZiAoZkphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJLyoKLQkJCSAqIE5PVEU6IG51bGwgdGV4dCBlZGl0b3IgaXMgYmVpbmcgcGFzc2VkIHRvCi0JCQkgKiBKYXZhU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBiZWNhdXNlCi0JCQkgKiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gZG9lcyBub3Qga25vdyBjdXJyZW50IGVkaXRvci4KLQkJCSAqIHRoaXMgaXMgb2theSBiZWNhdXNlIGVkaXRvciBpcyBub3QgbmVlZGVkIGluIHRoZSBjYXNlcyB3ZSBhcmUKLQkJCSAqIHVzaW5nIGphdmFzb3VyY2V2aWV3ZXJjb25maWd1cmF0aW9uLgotCQkJICovCi0JCQlmSmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgSmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oSmF2YVVJLmdldENvbG9yTWFuYWdlcigpLCBzdG9yZSwgbnVsbCwgSUphdmFQYXJ0aXRpb25zLkpBVkFfUEFSVElUSU9OSU5HKTsKLQkJfQotCQlyZXR1cm4gZkphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotCX0KLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJTGluZVN0eWxlUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBudWxsOwotCi0JCWlmIChwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQgfHwgcGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9DT01NRU5UIHx8IHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVDTEFSQVRJT04pIHsKLQkJCXByb3ZpZGVycyA9IGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCk7Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUIHx8IHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCkgewotCQkJcHJvdmlkZXJzID0gZ2V0SFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElDU1NQYXJ0aXRpb25zLlNUWUxFIHx8IHBhcnRpdGlvblR5cGUgPT0gSUNTU1BhcnRpdGlvbnMuQ09NTUVOVCkgewotCQkJcHJvdmlkZXJzID0gZ2V0SFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBJQ1NTUGFydGl0aW9ucy5TVFlMRSk7Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCB8fCBwYXJ0aXRpb25UeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9DREFUQSB8fCBwYXJ0aXRpb25UeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9DT01NRU5UIHx8IHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFQ0xBUkFUSU9OIHx8IHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX1BJKSB7Ci0JCQlwcm92aWRlcnMgPSBnZXRYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpOwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSkgewotCQkJcHJvdmlkZXJzID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyW117Z2V0TGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhKCl9OwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFRfRUwpIHsKLQkJCXByb3ZpZGVycyA9IG5ldyBMaW5lU3R5bGVQcm92aWRlcltde2dldExpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUwoKX07Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09NTUVOVCB8fCBwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0RFTElNSVRFUiB8fCBwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxUIHx8IHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSkgewotCQkJcHJvdmlkZXJzID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyW117Z2V0TGluZVN0eWxlUHJvdmlkZXJGb3JKU1AoKX07Ci0JCX0KLQotCQlyZXR1cm4gcHJvdmlkZXJzOwotCX0KLQotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZ2V0TGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhKCkgewotCQlpZiAoZkxpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YSA9PSBudWxsKSB7Ci0JCQlmTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YSgpOwotCQl9Ci0JCXJldHVybiBmTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhOwotCX0KLQotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZ2V0TGluZVN0eWxlUHJvdmlkZXJGb3JKU1AoKSB7Ci0JCWlmIChmTGluZVN0eWxlUHJvdmlkZXJGb3JKU1AgPT0gbnVsbCkgewotCQkJZkxpbmVTdHlsZVByb3ZpZGVyRm9ySlNQID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyRm9ySlNQKCk7Ci0JCX0KLQkJcmV0dXJuIGZMaW5lU3R5bGVQcm92aWRlckZvckpTUDsKLQl9Ci0KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGdldExpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUwoKSB7Ci0JCWlmIChmTGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTCA9PSBudWxsKSB7Ci0JCQlmTGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTCA9IG5ldyBMaW5lU3R5bGVQcm92aWRlckZvckpTUEVMKCk7Ci0JCX0KLQkJcmV0dXJuIGZMaW5lU3R5bGVQcm92aWRlckZvckpTUEVMOwotCX0KLQotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRTdGF0dXNMaW5lTGFiZWxQcm92aWRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlpZiAoZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZTdGF0dXNMaW5lTGFiZWxQcm92aWRlciA9IG5ldyBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0KLQkJCQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBlbGVtZW50OwotCQkJCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCQkJCXMuaW5zZXJ0KDAsIHN1cGVyLmdldFRleHQobm9kZSkpOwotCQkJCQkJfQotCi0JCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpCi0JCQkJCQkJbm9kZSA9ICgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkKLQkJCQkJCWlmIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCQkJCXMuaW5zZXJ0KDAsIElQYXRoLlNFUEFSQVRPUik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHMudG9TdHJpbmcoKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGZTdGF0dXNMaW5lTGFiZWxQcm92aWRlcjsKLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBnZXRYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQlpZiAoZlhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewotCQkJZlhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MKCk7Ci0JCX0KLQkJcmV0dXJuIGZYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0SHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCU1hcCB0YXJnZXRzID0gc3VwZXIuZ2V0SHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzKHNvdXJjZVZpZXdlcik7Ci0JCXRhcmdldHMucHV0KENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1AsIG51bGwpOwotCi0JCS8vIGFsc28gYWRkIGh0bWwgJiB4bWwgc2luY2UgdGhlcmUgY291bGQgYmUgaHRtbC94bWwgY29udGVudCBpbiBqc3AKLQkJLy8gKGp1c3QgaG9wZSB0aGUgaHlwZXJsaW5rIGRldGVjdG9ycyB3aWxsIGRvIGFkZGl0aW9uYWwgY2hlY2tpbmcpCi0JCXRhcmdldHMucHV0KENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCwgbnVsbCk7Ci0JCS8vdGFyZ2V0cy5wdXQoQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTCwgbnVsbCk7Ci0JCXJldHVybiB0YXJnZXRzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9JQWN0aW9uQ29uc3RhbnRzSlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSUFjdGlvbkNvbnN0YW50c0pTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDAwNzgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9JQWN0aW9uQ29uc3RhbnRzSlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWw7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aW9uQ29uc3RhbnRzSlNQIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9SRU5BTUVfRUxFTUVOVCA9ICJSZW5hbWVFbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX01PVkVfRUxFTUVOVCA9ICJNb3ZlRWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9JQWN0aW9uRGVmaW5pdGlvbklkc0pTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0lBY3Rpb25EZWZpbml0aW9uSWRzSlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MDYwN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0lBY3Rpb25EZWZpbml0aW9uSWRzSlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuYWN0aW9ucy5JSmF2YUVkaXRvckFjdGlvbkRlZmluaXRpb25JZHM7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aW9uRGVmaW5pdGlvbklkc0pTUCB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVOQU1FX0VMRU1FTlQgPSBJSmF2YUVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuUkVOQU1FX0VMRU1FTlQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTU9WRV9FTEVNRU5UID0gSUphdmFFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLk1PVkVfRUxFTUVOVDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9KU1BVSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjZhYWRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9KU1BVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgSlNQIFVJCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSlNQVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGU7Ci0JCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpTUFVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZlJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJZlJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCWZSZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZSZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYW1wbGVfSlNQX2RvYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BfRGVsaW1pdGVyc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVmYWN0b3JfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lRWxlbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZUVsZW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVFbGVtZW50V2l6YXJkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9LOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUF9jaGFuZ2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGlvbkNvbnRyaWJ1dG9ySlNQXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQUmVuYW1lRWxlbWVudEFjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUE1vdmVFbGVtZW50QWN0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha3BvaW50Tm90QWxsb3dlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX0RFU0NSSVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfVEFHX05FV19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX1RBR19ORVdfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX1RBR19ORVdfREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0pTUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTklOR19GSUxFX01VU1RfQkVfSU5TSURFX0pBVkFfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X3Rvb2x0aXA7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X3Rvb2x0aXA7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbmRPY2N1cnJlbmNlc19sYWJlbDsJLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdmVycmlkZV9tZXRob2RfaW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfZmlsZXNfZW5jb2Rpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudF9Bc3Npc3Rfbm90X2F2YWlsYWJfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphdmFfQ29udGVudF9Bc3Npc3RfaXNfbm90X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BDb2xvclBhZ2VfanNwX2NvbnRlbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRmlsZXNQcmVmZXJlbmNlUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnUHJvcGVydHlQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGl0bGVfSW52YWxpZFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VfSW52YWxpZFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTks7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQVHlwaW5nX0F1dG9fQ29tcGxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQVHlwaW5nX0NvbXBsZXRlX1NjcmlwdGxldHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQVHlwaW5nX0NvbXBsZXRlX0JyYWNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BUeXBpbmdfQ29tcGxldGVfQ29tbWVudHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQVHlwaW5nX0phdmFfQ29kZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BUeXBpbmdfQ2xvc2VfU3RyaW5nczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BUeXBpbmdfQ2xvc2VfQnJhY2tldHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzA7Ci0KLQkvLyBiZWxvdyBhcmUgdGhlIHN0cmluZ3MgZm9yIHRoZSB2YWxpZGF0aW9uIHBhZ2UKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25fV2FybmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25fSWdub3JlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9IRUFERVJfRElSRUNUSVZFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9EVVBMSUNBVEVfUFJFRklYRVNfRElGRkVSRU5UX1VSSVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX0RVUExJQ0FURV9QUkVGSVhFU19TQU1FX1VSSVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX01JU1NJTkdfUFJFRklYOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9NSVNTSU5HX1VSSV9PUl9UQUdESVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX1VOUkVTT0xWQUJMRV9VUklfT1JfVEFHRElSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fRElSRUNUSVZFX1BBR0VfU1VQRVJDTEFTU19OT1RfRk9VTkQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9ESVJFQ1RJVkVfSU5DTFVERV9OT19GSUxFX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0RJUkVDVElWRV9JTkNMVURFX0ZJTEVfTk9UX0ZPVU5EOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fSEVBREVSX0pBVkE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9KQVZBX05PVElDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfTE9DQUxfVkFSSUFCTEVfTkVWRVJfVVNFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfQVJHVU1FTlRfSVNfTkVWRVJfVVNFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfTlVMTF9MT0NBTF9WQVJJQUJMRV9SRUZFUkVOQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9KQVZBX1BPVEVOVElBTF9OVUxMX0xPQ0FMX1ZBUklBQkxFX1JFRkVSRU5DRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfVU5VU0VEX0lNUE9SVDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fSEVBREVSX0VMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fRUxfU1lOVEFYOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fRUxfTEVYRVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9FTF9GVU5DVElPTl9VTkRFRklORUQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0hFQURFUl9DVVNUT01fQUNUSU9OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfTUlTU0lOR19SRVFVSVJFRF9BVFRSSUJVVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX1VOS05PV05fQVRUUklCVVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9VTkVYUEVDVEVEX1JURVhQUlZBTFVFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9OT05fRU1QVFlfSU5MSU5FX1RBRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9WQUxJREFUSU9OX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfTk9UX0ZPVU5EOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX05PVF9JTlNUQU5USUFURUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfUlVOVElNRV9FWENFUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9UUkFOU0xBVElPTl9UQUdfSEFORExFUl9DTEFTU19OT1RfRk9VTkQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0hFQURFUl9TVEFOREFSRF9BQ1RJT05TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNFQkVBTl9JTlZBTElEX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNCRUFOX01JU1NJTkdfVFlQRV9JTkZPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNFQkVBTl9BTUJJR1VPVVNfVFlQRV9JTkZPOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUTERIeXBlcmxpbmtfaHlwZXJsaW5rVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDdXN0b21UYWdIeXBlcmxpbmtfaHlwZXJsaW5rVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUTERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb25fMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfU2VhcmNoX2dyb3VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfU3VwcGx5X0pTUF9zZWFyY2hfdG9fSmF2YV9zZWFyY2g7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQQ29kZUFzc2lzdF9JbnNlcnRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQQ29kZUFzc2lzdF9BdXRvX0ltcG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDeWNsaW5nX1VJOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0pTUFVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjY2I4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpTUFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEpTUFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgSlNQVUlQbHVnaW4gaW5zdGFuY2UgPSBudWxsOwkKLQkKLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBqc3AgZWRpdG9yLiAKLQkgKi8KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0JCi0JLyoqIAotCSAqIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBqc3AgZWRpdG9yLiAKLQkgKi8KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0KLQlwdWJsaWMgSlNQVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEpTUFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBKU1BVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGdldEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBqc3AgZWRpdG9yIHRlbXBsYXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGpzcCBlZGl0b3IgdGVtcGxhdGVzCi0JICovCi0JcHVibGljIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJaWYgKGZUZW1wbGF0ZVN0b3JlID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVN0b3JlPSBuZXcgQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZShnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLCBnZXRQcmVmZXJlbmNlU3RvcmUoKSwgSlNQVUlQcmVmZXJlbmNlTmFtZXMuVEVNUExBVEVTX0tFWSk7Ci0KLQkJCXRyeSB7Ci0JCQkJZlRlbXBsYXRlU3RvcmUubG9hZCgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gZlRlbXBsYXRlU3RvcmU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGpzcCBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUganNwIHBsdWdpbgotCSAqLwotCXB1YmxpYyBDb250ZXh0VHlwZVJlZ2lzdHJ5IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkgewotCQlpZiAoZkNvbnRleHRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSA9IG5ldyBDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5KCk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFMTCk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLk5FVyk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLlRBRyk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFUVFJJQlVURSk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFUVFJJQlVURV9WQUxVRSk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLk5FV19UQUcpOwotCQkJCi0JCQlmQ29udGV4dFR5cGVSZWdpc3RyeT0gcmVnaXN0cnk7Ci0JCX0KLQotCQlyZXR1cm4gZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0pTUFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhMTA3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBUaGUgZm9sbG93aW5nIGxpbmUgaXMgYSBzYW1wbGUgSlNQIGRvY3VtZW50LiAgUGxlYXNlIHRyYW5zbGF0ZSBvbmx5IHRoZSBmb2xsb3dpbmcgcGFydHM6Ci0jIyBVc2UgYmVsb3cgdGFncyBPTkxZIGZvciBKU1AgMS4xCi0jIyBXZWxjb21lIQotIyMgVXNlIGJlbG93IHRhZ3MgT05MWSBmb3IgSlNQIDEuMgotIyMgV2VsY29tZSEKLVNhbXBsZV9KU1BfZG9jPTwlQCBwYWdlIFxuXHRsYW5ndWFnZT1cImphdmFcIiBcblx0Y29udGVudFR5cGU9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMVwiXG4lPlxuPGpzcDppbmNsdWRlIGZsdXNoPVwidHJ1ZVwiIHBhZ2U9XCJ0aXRsZUJhci5qc3BcIi8+XG5cbjwlLS0gVXNlIGJlbG93IHRhZ3MgT05MWSBmb3IgSlNQIDEuMSAtLSU+XG48JVxuXHRTeXN0ZW0ub3V0LnByaW50bG4oXCJXZWxjb21lIVwiKTtcbiU+XG48JS0tIFVzZSBiZWxvdyB0YWdzIE9OTFkgZm9yIEpTUCAxLjIgLS0lPlxuPGpzcDpzY3JpcHRsZXQ+XG5cdFN5c3RlbS5vdXQucHJpbnRsbihcIldlbGNvbWUhXCIpO1xuPC9qc3A6c2NyaXB0bGV0PgotSlNQX0RlbGltaXRlcnNfVUlfPVNjcmlwdGluZyBFbGVtZW50IERlbGltaXRlcnMKLVJlZmFjdG9yX2xhYmVsPVJlZmFjdG9yCi1SZW5hbWVFbGVtZW50X2xhYmVsPVJlbmFtZQotTW92ZUVsZW1lbnRfbGFiZWw9TW92ZQotTW92ZUVsZW1lbnRXaXphcmQ9TW92ZSB0aGUgc2VsZWN0ZWQgZWxlbWVudHMKLSMKLU9LPU9LCi1CcmVha3BvaW50Tm90QWxsb3dlZD1BIGJyZWFrcG9pbnQgaXMgbm90IGFsbG93ZWQgb24gdGhpcyBsaW5lCi1KU1BfY2hhbmdlcz1KU1AgY2hhbmdlcwotQWN0aW9uQ29udHJpYnV0b3JKU1BfMD1SZWZhJmN0b3IKLUpTUFJlbmFtZUVsZW1lbnRBY3Rpb25fMD1FZGl0b3Igc2VsZWN0aW9uIGRvZXMgbm90IHJlc29sdmUgdG8gYSByZW5hbWFibGUgSmF2YSBlbGVtZW50Ci1KU1BNb3ZlRWxlbWVudEFjdGlvbl8wPUVkaXRvciBzZWxlY3Rpb24gZG9lcyBub3QgcmVzb2x2ZSB0byBtb3ZhYmxlIEphdmEgZWxlbWVudHMKLUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMD1KU1AgUmVuYW1lCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzE9aW4gZmlsZTogezB9IGxpbmU6IHsxfQotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8yPU1vdmUgVHlwZSAnJ3swfScnIHRvIHBhY2thZ2UgJyd7MX0nJwotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8zPVJlbmFtZSBNZXRob2QgJyd7MH0nJyB0byAnJ3sxfScnCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzQ9UmVuYW1lIFR5cGUgJyd7MH0nJyB0byAnJ3sxfScnCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzU9UmVuYW1lIFBhY2thZ2UgJyd7MH0nJyB0byAnJ3sxfScnCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzY9SlNQIFJlbmFtZSBDaGFuZ2UKLUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNz1SZW5hbWUgRmllbGQgJyd7MH0nJyB0byAnJ3sxfScnCi0jCi1fVUlfV0laQVJEX05FV19USVRMRSA9IE5ldyBKU1AgRmlsZQotX1VJX1dJWkFSRF9ORVdfSEVBRElORyA9IEpTUAotX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT04gPSBDcmVhdGUgYSBuZXcgSlNQIGZpbGUuCi1fVUlfV0laQVJEX1RBR19ORVdfVElUTEUgPSBOZXcgVGFnIEZpbGUKLV9VSV9XSVpBUkRfVEFHX05FV19IRUFESU5HID0gVGFnIEZpbGUKLV9VSV9XSVpBUkRfVEFHX05FV19ERVNDUklQVElPTiA9IENyZWF0ZSBhIG5ldyBUYWcuCi1fRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfSlNQID0gVGhlIGZpbGUgbmFtZSBtdXN0IGVuZCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zIHswfS4gCi1fV0FSTklOR19GSUxFX01VU1RfQkVfSU5TSURFX0pBVkFfUFJPSkVDVCA9IEphdmFTZXJ2ZXIgUGFnZXMgY3JlYXRlZCBpbiBwcm9qZWN0cyB0aGF0IGRvIG5vdCBzdXBwb3J0IEphdmEgbWlnaHQgbm90IHdvcmsgYXMgZXhwZWN0ZWQuIAotX1dBUk5JTkdfRk9MREVSX01VU1RfQkVfSU5TSURFX1dFQl9DT05URU5UID0gRmlsZXMgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBXZWIgQ29udGVudCBmb2xkZXIgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4geW91ciBkZXBsb3llZCBXZWIgYXBwbGljYXRpb24uIAotUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzID0gVGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMD1TZWxlY3QgSlNQIFRlbXBsYXRlCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzE9U2VsZWN0IGEgdGVtcGxhdGUgYXMgaW5pdGlhbCBjb250ZW50IGluIHRoZSBKU1AgcGFnZS4KLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMj1OYW1lCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzM9RGVzY3JpcHRpb24KLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfND0mVXNlIEpTUCBUZW1wbGF0ZQotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV81PSZQcmV2aWV3OgotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV82PVRlbXBsYXRlcyBhcmUgJ05ldyBKU1AnIHRlbXBsYXRlcyBmb3VuZCBpbiB0aGUgPGE+SlNQIFRlbXBsYXRlczwvYT4gcHJlZmVyZW5jZSBwYWdlLgotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV83PSZUZW1wbGF0ZXM6Ci1OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzA9U2VsZWN0IFRhZyBmaWxlIFRlbXBsYXRlCi1OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzE9U2VsZWN0IGEgdGVtcGxhdGUgYXMgaW5pdGlhbCBjb250ZW50IGluIHRoZSBUYWcgZmlsZS4KLU5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfMj1OYW1lCi1OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzM9RGVzY3JpcHRpb24KLU5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfND0mVXNlIFRhZyBmaWxlIFRlbXBsYXRlCi1OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzU9JlByZXZpZXc6Ci1OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzY9VGVtcGxhdGVzIGFyZSAnTmV3IFRhZycgdGVtcGxhdGVzIGZvdW5kIGluIHRoZSA8YT5KU1AgVGVtcGxhdGVzPC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi1OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzc9JlRlbXBsYXRlczoKLSMgQ29waWVkIGZyb20gc3NlLnVpCi1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uPUNsZWFudXAgRG9jdW1lbnQKLVRvZ2dsZUNvbW1lbnRfbGFiZWw9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfdG9vbHRpcD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbj1Ub2dnbGUgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2xhYmVsPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfdG9vbHRpcD1BZGQgQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uPUFkZCBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb249UmVtb3ZlIEJsb2NrIENvbW1lbnQKLUZpbmRPY2N1cnJlbmNlc19sYWJlbD1PY2N1cnJlbmNlcyBpbiBGaWxlCi1PY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzA9ezB9IC0gezF9IE9jY3VycmVuY2VzIGluIHsyfQotT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8yPWZpbGUKLUNvbnRlbnRfQXNzaXN0X25vdF9hdmFpbGFiX1VJXz1Db250ZW50IEFzc2lzdCBub3QgYXZhaWxhYmxlIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uCi1KYXZhX0NvbnRlbnRfQXNzaXN0X2lzX25vdF9VSV89SmF2YSBDb250ZW50IEFzc2lzdCBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBjdXJzb3IgbG9jYXRpb24KLSMKLU92ZXJyaWRlX21ldGhvZF9pbj1PdmVycmlkZSBtZXRob2QgaW4gJwotQ3JlYXRpbmdfZmlsZXNfZW5jb2Rpbmc9Q3JlYXRpbmcgZmlsZXMgZW5jb2RpbmcgcHJlZmVyZW5jZQotIwotSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMD1KU1AgU291cmNlIHByZWZlcmVuY2VzIGFyZSBiYXNlZCBvbiB0aGUgY29udGVudCB3aXRoaW4gdGhlIEpTUC4KLUpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzE9U2VlIDxhPicnezB9Jyc8L2E+IGZvciBKU1Agd2l0aCBIVE1MIGNvbnRlbnQuCi1KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8yPVNlZSA8YT4nJ3swfScnPC9hPiBmb3IgSlNQIHdpdGggWE1MIGNvbnRlbnQuCi1KU1BDb2xvclBhZ2VfanNwX2NvbnRlbnQ9U2NyaXB0aW5nIEVsZW1lbnRzCi1KU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzA9VmFsaWRhdGluZyBmaWxlcwotSlNQRmlsZXNQcmVmZXJlbmNlUGFnZV8xPVZhbGlkYXRlIEpTUCBmcmFnbWVudHMKLSMgSlNQIEZyYWdtZW50cwotSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wPW5vbmUKLUpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMT1UaGUgcHJvcGVydGllcyB1c2VkIGluc3RlYWQgb2YgdGhlIHBhZ2UgZGlyZWN0aXZlIHRoYXQgY2Fubm90IGJlIHNwZWNpZmllZCBpbiBKU1AgZnJhZ21lbnQgZmlsZXMuICBUaGUgcHJvamVjdCBzZXR0aW5nIGlzIHVzZWQgaWYgeW91IHNwZWNpZnkgIm5vbmUuIgotSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8yPUxhbmd1YWdlOgotSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8zPUNvbnRlbnQgVHlwZToKLUpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfND1FbmFibGUgc3BlY2lmaWMgc2V0dGluZzoKLVByb2plY3RKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA9VGhlIHByb3BlcnRpZXMgZm9yIEoyRUUgV2ViIHByb2plY3RzIGFjdCBhcyAicHJvamVjdCIgZGVmYXVsdCB0byBiZSBsb29rZWQgdXAgd2hlbiBubyBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQgZm9yIGEgcGFydGljdWxhciBKU1AgZnJhZ21lbnQgZmlsZS4KLSMgQ1NTIEpTUAotVGl0bGVfSW52YWxpZFZhbHVlPUludmFsaWQgVmFsdWUKLU1lc3NhZ2VfSW52YWxpZFZhbHVlPUludmFsaWQgcHJvcGVydHkgdmFsdWUuCi0KLVN5bnRheENvbG9yaW5nUGFnZV8wPVN5bnRheCBFbGVtZW50OgotU3ludGF4Q29sb3JpbmdQYWdlXzI9RW5hYmxlCi1TeW50YXhDb2xvcmluZ1BhZ2VfMz0mQm9sZAotU3ludGF4Q29sb3JpbmdQYWdlXzQ9Jkl0YWxpYwotU3ludGF4Q29sb3JpbmdQYWdlXzU9JlN0cmlrZXRocm91Z2gKLVN5bnRheENvbG9yaW5nUGFnZV82PSZVbmRlcmxpbmUKLV9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTks9SlNQIGVkaXRpbmcgcHJlZmVyZW5jZXMuICBOb3RlIHRoYXQgc29tZSBwcmVmZXJlbmNlcyBtYXkgYmUgc2V0IG9uIHRoZSA8YT57MH08L2E+IHByZWZlcmVuY2UgcGFnZS4KLQotIyBKU1AgVHlwaW5nIFByZWZlcmVuY2UgUGFnZQotSlNQVHlwaW5nX0F1dG9fQ29tcGxldGU9QXV0b21hdGljYWxseSBjbG9zZQotSlNQVHlwaW5nX0NvbXBsZXRlX1NjcmlwdGxldHM9JlNjcmlwdGxldCByZWdpb25zCi1KU1BUeXBpbmdfQ29tcGxldGVfQnJhY2VzPSZCcmFjZXMgaW4gRUwgZXhwcmVzc2lvbnMKLUpTUFR5cGluZ19Db21wbGV0ZV9Db21tZW50cz0mSlNQIGNvbW1lbnRzCi1KU1BUeXBpbmdfSmF2YV9Db2RlPUphdmEKLUpTUFR5cGluZ19DbG9zZV9TdHJpbmdzPUF1dG9tYXRpY2FsbHkgY2xvc2UgInMmdHJpbmdzIgotSlNQVHlwaW5nX0Nsb3NlX0JyYWNrZXRzPUF1dG9tYXRpY2FsbHkgY2xvc2UgKHBhcmVudGhlc2VzKSwgW3NxdWFyZV0gYW5kIDxhbmdsZT4gYnJhYyZrZXRzCi0jIFZhbGlkYXRpb24gcGFnZSBzdHJpbmdzCi1WYWxpZGF0aW9uX2Rlc2NyaXB0aW9uPVNlbGVjdCB0aGUgc2V2ZXJpdHkgbGV2ZWwgZm9yIHRoZSBmb2xsb3dpbmcgdmFsaWRhdGlvbiBwcm9ibGVtczoKLVZhbGlkYXRpb25fV2FybmluZz1XYXJuaW5nCi1WYWxpZGF0aW9uX0Vycm9yPUVycm9yCi1WYWxpZGF0aW9uX0lnbm9yZT1JZ25vcmUKLUpTUFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8wPUVycm9ycy9XYXJuaW5ncwotCi1WQUxJREFUSU9OX0hFQURFUl9ESVJFQ1RJVkU9RGlyZWN0aXZlcwotVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX0RVUExJQ0FURV9QUkVGSVhFU19ESUZGRVJFTlRfVVJJUz1TYW1lIHByZWZpeCB1c2VkIGZvciBkaWZmZXJlbnQgVVJJcyBvciB0YWdkaXI6Ci1WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfRFVQTElDQVRFX1BSRUZJWEVTX1NBTUVfVVJJUz1SZWR1bmRhbnQgdGFnIGxpYnJhcnkgZGlyZWN0aXZlOgotVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX01JU1NJTkdfUFJFRklYPU5vIHByZWZpeCBzcGVjaWZpZWQ6Ci1WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfTUlTU0lOR19VUklfT1JfVEFHRElSPU5vIFVSSSBvciB0YWdkaXIgc3BlY2lmaWVkOgotVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX1VOUkVTT0xWQUJMRV9VUklfT1JfVEFHRElSPVVucmVzb2x2YWJsZSBVUkkgb3IgdGFnZGlyOgotVkFMSURBVElPTl9ESVJFQ1RJVkVfUEFHRV9TVVBFUkNMQVNTX05PVF9GT1VORD1TdXBlcmNsYXNzIG5vdCBmb3VuZDoKLVZBTElEQVRJT05fRElSRUNUSVZFX0lOQ0xVREVfTk9fRklMRV9TUEVDSUZJRUQ9SW5jbHVkZWQgZnJhZ21lbnQgZmlsZSBub3Qgc3BlY2lmaWVkOgotVkFMSURBVElPTl9ESVJFQ1RJVkVfSU5DTFVERV9GSUxFX05PVF9GT1VORD1JbmNsdWRlZCBmcmFnbWVudCBmaWxlIG5vdCBmb3VuZDoKLQotVkFMSURBVElPTl9IRUFERVJfSkFWQT1KYXZhCi1WQUxJREFUSU9OX0pBVkFfTk9USUNFPVRoZXNlIHZhbHVlcyBvdmVycmlkZSB0aG9zZSBvbiB0aGUgPGE+RXJyb3JzL1dhcm5pbmdzPC9hPiBwYWdlOgotVkFMSURBVElPTl9KQVZBX0xPQ0FMX1ZBUklBQkxFX05FVkVSX1VTRUQ9TG9jYWwgdmFyaWFibGUgbmV2ZXIgdXNlZDoKLVZBTElEQVRJT05fSkFWQV9BUkdVTUVOVF9JU19ORVZFUl9VU0VEPVBhcmFtZXRlciBpcyBuZXZlciByZWFkOgotVkFMSURBVElPTl9KQVZBX05VTExfTE9DQUxfVkFSSUFCTEVfUkVGRVJFTkNFPU51bGwgcG9pbnRlciBhY2Nlc3M6Ci1WQUxJREFUSU9OX0pBVkFfUE9URU5USUFMX05VTExfTE9DQUxfVkFSSUFCTEVfUkVGRVJFTkNFPVBvdGVudGlhbCBudWxsIHBvaW50ZXIgYWNjZXNzOgotVkFMSURBVElPTl9KQVZBX1VOVVNFRF9JTVBPUlQ9VW51c2VkIGltcG9ydDoKLQkKLVZBTElEQVRJT05fSEVBREVSX0VMPUV4cHJlc3Npb24gTGFuZ3VhZ2UKLVZBTElEQVRJT05fRUxfU1lOVEFYPUVMIFN5bnRheCBwcm9ibGVtOgotVkFMSURBVElPTl9FTF9MRVhFUj1VbmFibGUgdG8gYW5hbHl6ZSBFTCBleHByZXNzaW9uIGR1ZSB0byBsZXhpY2FsIGFuYWx5c2lzIGVycm9yOiAKLVZBTElEQVRJT05fRUxfRlVOQ1RJT05fVU5ERUZJTkVEPUZ1bmN0aW9uIGlzIHVuZGVmaW5lZDoKLQotVkFMSURBVElPTl9IRUFERVJfQ1VTVE9NX0FDVElPTlM9Q3VzdG9tIGFjdGlvbnMKLVZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9NSVNTSU5HX1JFUVVJUkVEX0FUVFJJQlVURT1NaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZToKLVZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9VTktOT1dOX0FUVFJJQlVURT1Vbmtub3duIGF0dHJpYnV0ZToKLVZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9VTkVYUEVDVEVEX1JURVhQUlZBTFVFPUF0dHJpYnV0ZSBkb2VzIG5vdCBzdXBwb3J0IHJ1bnRpbWUgZXhwcmVzc2lvbnM6Ci1WQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfTk9OX0VNUFRZX0lOTElORV9UQUc9VGFnIGRlY2xhcmVkIHdpdGggZW1wdHkgY29udGVudCBoYXMgY29udGVudDoKLVZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX1ZBTElEQVRJT05fTUVTU0FHRT1UYWdFeHRyYUluZm8gdmFsaWRhdGlvbiBtZXNzYWdlOgotVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfTk9UX0ZPVU5EPVRhZ0V4dHJhSW5mbyBjbGFzcyBub3Qgb24gSmF2YSBCdWlsZCBQYXRoOgotVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfTk9UX0lOU1RBTlRJQVRFRD1GYWlsdXJlIGluc3RhbnRpYXRpbmcgVGFnRXh0cmFJbmZvIGNsYXNzOgotVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfUlVOVElNRV9FWENFUFRJT049T3RoZXIgcHJvYmxlbXMgd2l0aCBUYWdFeHRyYUluZm8gY2xhc3M6CQotVkFMSURBVElPTl9UUkFOU0xBVElPTl9UQUdfSEFORExFUl9DTEFTU19OT1RfRk9VTkQ9Q2xhc3NpYyB0YWcgaGFuZGxlciBjbGFzcyBub3Qgb24gSmF2YSBCdWlsZCBQYXRoOgotCi1WQUxJREFUSU9OX0hFQURFUl9TVEFOREFSRF9BQ1RJT05TPVN0YW5kYXJkIGFjdGlvbnMKLVZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNFQkVBTl9JTlZBTElEX0lEPUludmFsaWQgJ2lkJyBzcGVjaWZpZWQgZm9yIGpzcDp1c2VCZWFuOgotVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0JFQU5fTUlTU0lOR19UWVBFX0lORk89TWlzc2luZyB0eXBlIGluZm9ybWF0aW9uIGZvciBqc3A6dXNlQmVhbjoKLVZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNFQkVBTl9BTUJJR1VPVVNfVFlQRV9JTkZPPUFtYmlndW91cyB0eXBlIGluZm9ybWF0aW9uIGZvciBqc3A6dXNlQmVhbjoKLQotT3Blbj1PcGVuICcnezB9JycKLVRMREh5cGVybGlua19oeXBlcmxpbmtUZXh0PU9wZW4gRGVzY3JpcHRvcgotQ3VzdG9tVGFnSHlwZXJsaW5rX2h5cGVybGlua1RleHQ9T3BlbiBEZWNsYXJhdGlvbgotVExEQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uXzA9U2hvdyBDb250ZW50IFZhbHVlcwotVGFnUHJvcGVydHlQYWdlX2Rlc2M9U3BlY2lmeSB0aGUgc3Vycm91bmRpbmcgbGFuZ3VhZ2UgdXNlZCBpbiB0aGlzIHRhZyBmaWxlOgotCi1KU1BGaWxlc1ByZWZlcmVuY2VQYWdlX1NlYXJjaF9ncm91cD1TZWFyY2gKLUpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfU3VwcGx5X0pTUF9zZWFyY2hfdG9fSmF2YV9zZWFyY2g9JkluY2x1ZGUgSlNQIG1hdGNoZXMgaW4gSmF2YSBzZWFyY2hlcwotCi1KU1BDb2RlQXNzaXN0X0luc2VydGlvbj1JbnNlcnRpb24KLUpTUENvZGVBc3Npc3RfQXV0b19JbXBvcnQ9QWRkIGltcG9ydCBpbnN0ZWFkIG9mICZxdWFsaWZpZWQgbmFtZQotQ3ljbGluZ19VST1DeWNsaW5nClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGYwMGY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmIGRlc2lyZWQsCi0gKiB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcyBwbHVnaW4uIE90aGVyCi0gKiBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogQHBhcmFtIGxldmVsIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZSB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbiBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogQHBhcmFtIG1lc3NhZ2UgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeSBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aCAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9hY3Rpb25zL0pTUE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYWN0aW9ucy9KU1BOb2RlQWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTU4Yjk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9hY3Rpb25zL0pTUE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5IVE1MTm9kZUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEpTUE5vZGVBY3Rpb25NYW5hZ2VyIGV4dGVuZHMgSFRNTE5vZGVBY3Rpb25NYW5hZ2VyIHsKLQotCXB1YmxpYyBKU1BOb2RlQWN0aW9uTWFuYWdlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKG1vZGVsLCB2aWV3ZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5Db250cmlidXRlQ2hpbGRBY3Rpb25zKE5vZGUgbm9kZSl7Ci0JCVN0cmluZyBub2RlTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKS50b0xvd2VyQ2FzZSgpOwotCQlyZXR1cm4gIShub2RlTmFtZS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUTEVUKSB8fCBub2RlTmFtZS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVDTEFSQVRJT04pIHx8IG5vZGVOYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5FWFBSRVNTSU9OKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9hdXRvZWRpdC9BdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWNiYzAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9hdXRvZWRpdC9BdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYXV0b2VkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci0KLS8qKgotICogQXV0b0VkaXRTdHJhdGVneSB0byBoYW5kbGUgY2hhcmFjdGVycyBpbnNlcnRlZCB3aGVuIFRhYiBrZXkgaXMgcHJlc3NlZAotICovCi1wdWJsaWMgY2xhc3MgQXV0b0VkaXRTdHJhdGVneUZvclRhYnMgaW1wbGVtZW50cyBJQXV0b0VkaXRTdHJhdGVneSB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFCX0NIQVJBQ1RFUiA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyB2b2lkIGN1c3RvbWl6ZURvY3VtZW50Q29tbWFuZChJRG9jdW1lbnQgZG9jdW1lbnQsIERvY3VtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCS8vIGlmIG5vdCBpbiBzbWFydCBpbnNlcnQgbW9kZSBqdXN0IGlnbm9yZQotCQlpZiAoIWlzU21hcnRJbnNlcnRNb2RlKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gc3BhY2VzIGZvciB0YWIgY2hhcmFjdGVyCi0JCWlmIChjb21tYW5kLmxlbmd0aCA9PSAwICYmIGNvbW1hbmQudGV4dCAhPSBudWxsICYmIGNvbW1hbmQudGV4dC5sZW5ndGgoKSA+IDAgJiYgY29tbWFuZC50ZXh0LmluZGV4T2YoVEFCX0NIQVJBQ1RFUikgIT0gLTEpCi0JCQlzbWFydEluc2VydEZvclRhYihjb21tYW5kLCBkb2N1bWVudCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHNwYWNlcyBmb3IgdGFicwotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNtYXJ0SW5zZXJ0Rm9yVGFiKERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gdGFiIGtleSB3YXMgcHJlc3NlZC4gbm93IGNoZWNrIHByZWZlcmVuY2VzIHRvIHNlZSBpZiBuZWVkIHRvIGluc2VydAotCQkvLyBzcGFjZXMgaW5zdGVhZCBvZiB0YWIKLQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBnZXRJbmRlbnRhdGlvbldpZHRoKCk7Ci0JCWlmIChpbmRlbnRhdGlvbldpZHRoID4gLTEpIHsKLQkJCVN0cmluZyBvcmlnaW5hbFRleHQgPSBjb21tYW5kLnRleHQ7Ci0JCQlTdHJpbmdCdWZmZXIgbmV3VGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIob3JpZ2luYWxUZXh0KTsKLQotCQkJLy8gZGV0ZXJtaW5lIHdoZXJlIGluIGxpbmUgdGhpcyBjb21tYW5kIGJlZ2lucwotCQkJaW50IGxpbmVPZmZzZXQgPSAtMTsKLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiBsaW5lSW5mbyA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGNvbW1hbmQub2Zmc2V0KTsKLQkJCQlsaW5lT2Zmc2V0ID0gY29tbWFuZC5vZmZzZXQgLSBsaW5lSW5mby5nZXRPZmZzZXQoKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0KLQkJCUlMaW5lVHJhY2tlciBsaW5lVHJhY2tlciA9IGdldExpbmVUcmFja2VyKGRvY3VtZW50LCBvcmlnaW5hbFRleHQpOwotCi0JCQlpbnQgc3RhcnRJbmRleCA9IDA7Ci0JCQlpbnQgaW5kZXggPSBuZXdUZXh0LmluZGV4T2YoVEFCX0NIQVJBQ1RFUik7Ci0JCQl3aGlsZSAoaW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgaW5kZW50ID0gZ2V0SW5kZW50U3RyaW5nKGluZGVudGF0aW9uV2lkdGgsIGxpbmVPZmZzZXQsIGxpbmVUcmFja2VyLCBpbmRleCk7Ci0KLQkJCQkvLyByZXBsYWNlIFx0IGNoYXJhY3RlciB3aXRoIHNwYWNlcwotCQkJCW5ld1RleHQucmVwbGFjZShpbmRleCwgaW5kZXggKyAxLCBpbmRlbnQpOwotCQkJCWlmIChsaW5lVHJhY2tlciAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsaW5lVHJhY2tlci5yZXBsYWNlKGluZGV4LCAxLCBpbmRlbnQpOwotCQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIHJlcGxhY2luZyB0ZXh0LCBqdXN0Ci0JCQkJCQkvLyByZXNldCB0byBjdXJyZW50IHN0cmluZwotCQkJCQkJbGluZVRyYWNrZXIuc2V0KG5ld1RleHQudG9TdHJpbmcoKSk7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlzdGFydEluZGV4ID0gaW5kZXggKyBpbmRlbnQubGVuZ3RoKCk7Ci0JCQkJaW5kZXggPSBuZXdUZXh0LmluZGV4T2YoVEFCX0NIQVJBQ1RFUiwgc3RhcnRJbmRleCk7Ci0JCQl9Ci0JCQljb21tYW5kLnRleHQgPSBuZXdUZXh0LnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgbnVtYmVyIG9mIHNwYWNlcyBmb3IgbmV4dCB0YWIgc3RvcAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEluZGVudFN0cmluZyhpbnQgaW5kZW50YXRpb25XaWR0aCwgaW50IGxpbmVPZmZzZXQsIElMaW5lVHJhY2tlciBsaW5lVHJhY2tlciwgaW50IGluZGV4KSB7Ci0JCWludCBpbmRlbnRTaXplID0gaW5kZW50YXRpb25XaWR0aDsKLQkJaW50IG9mZnNldEluTGluZSA9IC0xOwotCQlpZiAobGluZVRyYWNrZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIGxpbmVJbmZvID0gbGluZVRyYWNrZXIuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoaW5kZXgpOwotCQkJCWlmIChsaW5lSW5mby5nZXRPZmZzZXQoKSA9PSAwICYmIGxpbmVPZmZzZXQgPiAtMSkKLQkJCQkJb2Zmc2V0SW5MaW5lID0gbGluZU9mZnNldCArIGluZGV4OwotCQkJCWVsc2UKLQkJCQkJb2Zmc2V0SW5MaW5lID0gaW5kZXggLSBsaW5lSW5mby5nZXRPZmZzZXQoKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobGluZU9mZnNldCA+IC0xKSB7Ci0JCQkJb2Zmc2V0SW5MaW5lID0gbGluZU9mZnNldCArIGluZGV4OwotCQkJfQotCQl9Ci0JCWlmIChvZmZzZXRJbkxpbmUgPiAtMSAmJiBpbmRlbnRhdGlvbldpZHRoID4gMCkgewotCQkJaW50IHJlbWFpbmRlciA9IG9mZnNldEluTGluZSAlIGluZGVudGF0aW9uV2lkdGg7Ci0JCQlpbmRlbnRTaXplID0gaW5kZW50YXRpb25XaWR0aCAtIHJlbWFpbmRlcjsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50U2l6ZTsgaSsrKQotCQkJaW5kZW50LmFwcGVuZCgnICcpOwotCQlyZXR1cm4gaW5kZW50LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHVwIGEgbGluZSB0cmFja2VyIGZvciB0ZXh0IHdpdGhpbiBjb21tYW5kIGlmIHRleHQgaXMgbXVsdGktbGluZQotCSAqLwotCXByaXZhdGUgSUxpbmVUcmFja2VyIGdldExpbmVUcmFja2VyKElEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIG9yaWdpbmFsVGV4dCkgewotCQlDb25maWd1cmFibGVMaW5lVHJhY2tlciBsaW5lVHJhY2tlciA9IG51bGw7Ci0JCWludFtdIGRlbGltcyA9IFRleHRVdGlsaXRpZXMuaW5kZXhPZihkb2N1bWVudC5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCksIG9yaWdpbmFsVGV4dCwgMCk7Ci0JCWlmIChkZWxpbXNbMF0gIT0gLTEgfHwgZGVsaW1zWzFdICE9IC0xKSB7Ci0JCQlsaW5lVHJhY2tlciA9IG5ldyBDb25maWd1cmFibGVMaW5lVHJhY2tlcihkb2N1bWVudC5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCkpOwotCQkJbGluZVRyYWNrZXIuc2V0KG9yaWdpbmFsVGV4dCk7Ci0JCX0KLQkJcmV0dXJuIGxpbmVUcmFja2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGFjdGl2ZSBlZGl0b3IgaXMgaW4gc21hcnQgaW5zZXJ0IG1vZGUsIGZhbHNlIG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNTbWFydEluc2VydE1vZGUoKSB7Ci0JCWJvb2xlYW4gaXNTbWFydEluc2VydE1vZGUgPSBmYWxzZTsKLQotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvcjsKLQkJCQkJZWxzZQotCQkJCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGlmIHNtYXJ0IGluc2VydCBtb2RlCi0JCWlmICh0ZXh0RWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3JFeHRlbnNpb24zICYmICgoSVRleHRFZGl0b3JFeHRlbnNpb24zKSB0ZXh0RWRpdG9yKS5nZXRJbnNlcnRNb2RlKCkgPT0gSVRleHRFZGl0b3JFeHRlbnNpb24zLlNNQVJUX0lOU0VSVCkKLQkJCWlzU21hcnRJbnNlcnRNb2RlID0gdHJ1ZTsKLQkJcmV0dXJuIGlzU21hcnRJbnNlcnRNb2RlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaW5kZW50YXRpb24gd2lkdGggaWYgdXNpbmcgc3BhY2VzIGZvciBpbmRlbnRhdGlvbiwgLTEgb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGdldEluZGVudGF0aW9uV2lkdGgoKSB7Ci0JCWludCB3aWR0aCA9IC0xOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUEFDRS5lcXVhbHMocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpKSkKLQkJCXdpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCXJldHVybiB3aWR0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzQ4YTJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmF1dG9lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUpTUCBpbXBsZW1lbnRzIElBdXRvRWRpdFN0cmF0ZWd5IHsKLQlwdWJsaWMgdm9pZCBjdXN0b21pemVEb2N1bWVudENvbW1hbmQoSURvY3VtZW50IGRvY3VtZW50LCBEb2N1bWVudENvbW1hbmQgY29tbWFuZCkgewotCQlPYmplY3QgdGV4dEVkaXRvciA9IGdldEFjdGl2ZVRleHRFZGl0b3IoKTsKLQkJaWYgKCEodGV4dEVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yRXh0ZW5zaW9uMyAmJiAoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlpZiAoY29tbWFuZC50ZXh0ICE9IG51bGwpIHsKLQkJCQkJc21hcnRJbnNlcnRGb3JFbmRUYWcoY29tbWFuZCwgZG9jdW1lbnQsIG1vZGVsKTsKLQkJCQkJc21hcnRSZW1vdmVFbmRUYWcoY29tbWFuZCwgZG9jdW1lbnQsIG1vZGVsKTsKLQkJCQkJaWYgKGNvbW1hbmQudGV4dC5lcXVhbHMoIiUiKSAmJiBpc1ByZWZlcmVuY2VFbmFibGVkKEpTUFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9TQ1JJUFRMRVRTKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBzY3JpcHRsZXQgLSBhZGQgZW5kICU+Ci0JCQkJCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGNvbW1hbmQub2Zmc2V0KTsKLQkJCQkJCWlmIChub2RlICE9IG51bGwgJiYgcHJlZml4ZWRXaXRoKGRvY3VtZW50LCBjb21tYW5kLm9mZnNldCwgIjwiKSAmJiAhbm9kZS5nZXRTb3VyY2UoKS5lbmRzV2l0aCgiJT4iKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQljb21tYW5kLnRleHQgKz0gIiAlPiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQljb21tYW5kLnNoaWZ0c0NhcmV0ID0gZmFsc2U7Ci0JCQkJCQkJY29tbWFuZC5jYXJldE9mZnNldCA9IGNvbW1hbmQub2Zmc2V0ICsgMTsKLQkJCQkJCQljb21tYW5kLmRvaXQgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoY29tbWFuZC50ZXh0LmVxdWFscygieyIpICYmIGlzUHJlZmVyZW5jZUVuYWJsZWQoSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0VMX0JSQUNFUykpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihjb21tYW5kLm9mZnNldCk7Ci0JCQkJCQlpZiAobm9kZSAhPSBudWxsICYmIChwcmVmaXhlZFdpdGgoZG9jdW1lbnQsIGNvbW1hbmQub2Zmc2V0LCAiJCIpIHx8IHByZWZpeGVkV2l0aChkb2N1bWVudCwgY29tbWFuZC5vZmZzZXQsICIjIikpICYmIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJIW5vZGUuZ2V0U291cmNlKCkuZW5kc1dpdGgoIn0iKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQljb21tYW5kLnRleHQgKz0gIiB9IjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWNvbW1hbmQuc2hpZnRzQ2FyZXQgPSBmYWxzZTsKLQkJCQkJCQljb21tYW5kLmNhcmV0T2Zmc2V0ID0gY29tbWFuZC5vZmZzZXQgKyAxOwotCQkJCQkJCWNvbW1hbmQuZG9pdCA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzUHJlZmVyZW5jZUVuYWJsZWQoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gKGtleSAhPSBudWxsICYmIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKGtleSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWN0aXZlIHRleHQgZWRpdG9yIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgdGhlIGFjdGl2ZSBlZGl0b3IKLQkgKiBwYXJ0LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRBY3RpdmVUZXh0RWRpdG9yKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkJcmV0dXJuIGVkaXRvcjsKLQkJCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHRleHRFZGl0b3I7Ci0JCQkJCXJldHVybiBlZGl0b3I7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwcmVmaXhlZFdpdGgoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBTdHJpbmcgc3RyaW5nKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBkb2N1bWVudC5nZXRMZW5ndGgoKSA+PSBzdHJpbmcubGVuZ3RoKCkgJiYgZG9jdW1lbnQuZ2V0KG9mZnNldCAtIHN0cmluZy5sZW5ndGgoKSwgc3RyaW5nLmxlbmd0aCgpKS5lcXVhbHMoc3RyaW5nKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNDb21tZW50Tm9kZShJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiAoKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkgJiYgKChJRE9NRWxlbWVudCkgbm9kZSkuaXNDb21tZW50VGFnKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RvY3VtZW50Tm9kZShJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiAoKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNtYXJ0SW5zZXJ0Rm9yRW5kVGFnKERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJdHJ5IHsKLQkJCWlmIChjb21tYW5kLnRleHQuZXF1YWxzKCIvIikgJiYgKGRvY3VtZW50LmdldExlbmd0aCgpID49IDEpICYmIGRvY3VtZW50LmdldChjb21tYW5kLm9mZnNldCAtIDEsIDEpLmVxdWFscygiPCIpICYmIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0VORF9UQUdTKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlJRE9NTm9kZSBwYXJlbnROb2RlID0gKElET01Ob2RlKSAoKElET01Ob2RlKSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGNvbW1hbmQub2Zmc2V0IC0gMSkpLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAoaXNDb21tZW50Tm9kZShwYXJlbnROb2RlKSkgewotCQkJCQkvLyBsb29wIGFuZCBmaW5kIG5vbiBjb21tZW50IG5vZGUgcGFyZW50Ci0JCQkJCXdoaWxlICgocGFyZW50Tm9kZSAhPSBudWxsKSAmJiBpc0NvbW1lbnROb2RlKHBhcmVudE5vZGUpKSB7Ci0JCQkJCQlwYXJlbnROb2RlID0gKElET01Ob2RlKSBwYXJlbnROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICghaXNEb2N1bWVudE5vZGUocGFyZW50Tm9kZSkpIHsKLQkJCQkJLy8gb25seSBhZGQgZW5kIHRhZyBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBvciBpZgotCQkJCQkvLyBhZGQgJy8nIGRvZXMgbm90IGNyZWF0ZSBvbmUgYWxyZWFkeQotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHBhcmVudE5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCUlET01Ob2RlIGFuY2VzdG9yID0gcGFyZW50Tm9kZTsKLQkJCQkJYm9vbGVhbiBzbWFydEluc2VydEZvckVuZCA9IGZhbHNlOwotCQkJCQlpZihlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJLy8gTG9vayBmb3IgYW5jZXN0b3JzIGJ5IHRoZSBzYW1lIG5hbWUgdGhhdCBhcmUgbWlzc2luZyBlbmQgdGFncwotCQkJCQkJd2hpbGUoKGFuY2VzdG9yID0gKElET01Ob2RlKSBhbmNlc3Rvci5nZXRQYXJlbnROb2RlKCkpICE9IG51bGwpIHsKLQkJCQkJCQlpZihhbmNlc3Rvci5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsICYmIHBhcmVudE5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoYW5jZXN0b3IuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQkJCQkJc21hcnRJbnNlcnRGb3JFbmQgPSB0cnVlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsIHx8IHNtYXJ0SW5zZXJ0Rm9yRW5kKSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgdG9BZGQgPSBuZXcgU3RyaW5nQnVmZmVyKHBhcmVudE5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCQlpZiAodG9BZGQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJdG9BZGQuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgc3VmZml4ID0gdG9BZGQudG9TdHJpbmcoKTsKLQkJCQkJCQlpZiAoKGRvY3VtZW50LmdldExlbmd0aCgpIDwgY29tbWFuZC5vZmZzZXQgKyBzdWZmaXgubGVuZ3RoKCkpIHx8ICghc3VmZml4LmVxdWFscyhkb2N1bWVudC5nZXQoY29tbWFuZC5vZmZzZXQsIHN1ZmZpeC5sZW5ndGgoKSkpKSkgewotCQkJCQkJCQljb21tYW5kLnRleHQgKz0gc3VmZml4OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEF0dGVtcHRzIHRvIGNsZWFuIHVwIGFuIGVuZC10YWcgaWYgYSBzdGFydC10YWcgaXMgY29udmVydGVkIGludG8gYW4gZW1wdHktZWxlbWVudAotCSAqIHRhZyAoZS5nLiwgPG5vZGUgLz4pIGFuZCB0aGUgb3JpZ2luYWwgZWxlbWVudCB3YXMgZW1wdHkuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQgdGhlIGRvY3VtZW50IGNvbW1hbmQgZGVzY3JpYmluZyB0aGUgY2hhbmdlCi0JICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudCB0aGF0IHdpbGwgYmUgY2hhbmdlZAotCSAqIEBwYXJhbSBtb2RlbCB0aGUgbW9kZWwgYmFzZWQgb24gdGhlIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNtYXJ0UmVtb3ZlRW5kVGFnKERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJdHJ5IHsKLQkJCS8vIEFuIG9wZW5pbmcgdGFnIGlzIG5vdyBhIHNlbGYtdGVybWluYXRlZCBlbmQtdGFnCi0JCQlpZiAoIi8iLmVxdWFscyhjb21tYW5kLnRleHQpICYmICI+Ii5lcXVhbHMoZG9jdW1lbnQuZ2V0KGNvbW1hbmQub2Zmc2V0LCAxKSkgJiYgY29tbWFuZC5sZW5ndGggPT0gMCAmJiBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19SRU1PVkVfRU5EX1RBR1MpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIG1vZGVsLmdldEluZGV4ZWRSZWdpb24oY29tbWFuZC5vZmZzZXQpOwotCQkJCWlmIChub2RlICE9IG51bGwgJiYgIW5vZGUuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpZihyZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gJiYgY29tbWFuZC5vZmZzZXQgPD0gcmVnaW9uLmdldEVuZCgpKSB7Ci0JCQkJCQkKLQkJCQkJCS8qIGlmIHRoZSByZWdpb24gYmVmb3JlIHRoZSBjb21tYW5kIG9mZnNldCBpcyBhIGFuIGF0dHJpYnV0ZSB2YWx1ZSByZWdpb24KLQkJCQkJCSAqIGNoZWNrIHRvIHNlZSBpZiBpdCBoYXMgYm90aCBhbmQgb3BlbmluZyBhbmQgY2xvc2luZyBxdW90ZQotCQkJCQkJICovCi0JCQkJCQlJVGV4dFJlZ2lvbiBwcmV2VGV4dFJlZ2lvbiA9IHJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChjb21tYW5kLm9mZnNldC0xKTsKLQkJCQkJCWJvb2xlYW4gaW5VbmNsb3NlZEF0dFZhbHVlUmVnaW9uID0gZmFsc2U7Ci0JCQkJCQlpZihwcmV2VGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJCS8vZ2V0IHRoZSB0ZXh0IG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgcmVnaW9uCi0JCQkJCQkJU3RyaW5nIHByZXZUZXh0ID0gcmVnaW9uLmdldFRleHQocHJldlRleHRSZWdpb24pOwotCQkJCQkJCWluVW5jbG9zZWRBdHRWYWx1ZVJlZ2lvbiA9IChwcmV2VGV4dC5zdGFydHNXaXRoKCInIikgJiYgKChwcmV2VGV4dC5sZW5ndGgoKSA9PSAxKSB8fCAhcHJldlRleHQuZW5kc1dpdGgoIiciKSkpIHx8Ci0JCQkJCQkJCShwcmV2VGV4dC5zdGFydHNXaXRoKCJcIiIpICYmICgocHJldlRleHQubGVuZ3RoKCkgPT0gMSkgfHwgIXByZXZUZXh0LmVuZHNXaXRoKCJcIiIpKSk7Ci0JCQkJCQl9IAotCQkJCQkKLQkJCQkJCS8vaWYgY29tbWFuZCBvZmZzZXQgaXMgaW4gYW4gdW5jbG9zZWQgYXR0cmlidXRlIHZhbHVlIHJlZ2lvbiB0aGVuIGRvbmUgcmVtb3ZlIHRoZSBlbmQgdGFnCi0JCQkJCQlpZighaW5VbmNsb3NlZEF0dFZhbHVlUmVnaW9uKSB7Ci0JCQkJCQkJcmVnaW9uID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCQlpZiAocmVnaW9uICE9IG51bGwgJiYgcmVnaW9uLmlzRW5kZWQoKSkgewotCQkJCQkJCQlkb2N1bWVudC5yZXBsYWNlKHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUpTUEphdmEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUpTUEphdmEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJlZjdkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lKU1BKYXZhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYXV0b2VkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5SlNQSmF2YSBpbXBsZW1lbnRzIElBdXRvRWRpdFN0cmF0ZWd5IHsKLQotCXB1YmxpYyB2b2lkIGN1c3RvbWl6ZURvY3VtZW50Q29tbWFuZChJRG9jdW1lbnQgZG9jdW1lbnQsIERvY3VtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCU9iamVjdCB0ZXh0RWRpdG9yID0gZ2V0QWN0aXZlVGV4dEVkaXRvcigpOwotCQlpZiAoISh0ZXh0RWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3JFeHRlbnNpb24zICYmICgoSVRleHRFZGl0b3JFeHRlbnNpb24zKSB0ZXh0RWRpdG9yKS5nZXRJbnNlcnRNb2RlKCkgPT0gSVRleHRFZGl0b3JFeHRlbnNpb24zLlNNQVJUX0lOU0VSVCkpCi0JCQlyZXR1cm47Ci0JCQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIEF1dG8gZWRpdCBmb3IgSlNQIENvbW1lbnRzCi0JCQlpZiAoIi0iLmVxdWFscyhjb21tYW5kLnRleHQpICYmIGlzUHJlZmVyZW5jZUVuYWJsZWQoSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0NPTU1FTlRTKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHByZWZpeGVkV2l0aChkb2N1bWVudCwgY29tbWFuZC5vZmZzZXQsICI8JS0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQotCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihjb21tYW5kLm9mZnNldCk7Ci0JCQkJCQlJRE9NTm9kZSBwYXJlbnQgPSAobm9kZSAhPSBudWxsKSA/IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCkgOiBudWxsOwotCQkJCQkJLy8gUGFyZW50IGlzIHRoZSBzY3JpcHRsZXQgdGFnCi0JCQkJCQlpZiAocGFyZW50ICE9IG51bGwgJiYgSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUTEVULmVxdWFscyhwYXJlbnQuZ2V0Tm9kZU5hbWUoKSkgJiYgIXBhcmVudC5nZXRTb3VyY2UoKS5lbmRzV2l0aCgiLS0lPiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZCA9IHBhcmVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCQlpZiAoZW5kICE9IG51bGwpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCWRvY3VtZW50LnJlcGxhY2UoZW5kLmdldFN0YXJ0T2Zmc2V0KCksIDAsICItLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNQcmVmZXJlbmNlRW5hYmxlZChTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoa2V5ICE9IG51bGwgJiYgSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oa2V5KSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgYWN0aXZlIHRleHQgZWRpdG9yIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgdGhlIGFjdGl2ZSBlZGl0b3IKLQkgKiBwYXJ0LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRBY3RpdmVUZXh0RWRpdG9yKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkJcmV0dXJuIGVkaXRvcjsKLQkJCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHRleHRFZGl0b3I7Ci0JCQkJCXJldHVybiBlZGl0b3I7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwcmVmaXhlZFdpdGgoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBTdHJpbmcgc3RyaW5nKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBkb2N1bWVudC5nZXRMZW5ndGgoKSA+PSBzdHJpbmcubGVuZ3RoKCkgJiYgZG9jdW1lbnQuZ2V0KG9mZnNldCAtIHN0cmluZy5sZW5ndGgoKSwgc3RyaW5nLmxlbmd0aCgpKS5lcXVhbHMoc3RyaW5nKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvQWJzdHJhY3RCcmVha3BvaW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0Fic3RyYWN0QnJlYWtwb2ludFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTM3NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvQWJzdHJhY3RCcmVha3BvaW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50LklCcmVha3BvaW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNTm9kZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEFic3RyYWN0IGJyZWFrcG9pbnQgcHJvdmlkZXIgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyBicmVha3BvaW50IHByb3ZpZGVyCi0gKiBpbnRlcmZhY2UuCi0gKiAKLSAqIFRoaXMgaXMgYSB0ZW1wb3JhcnkgY2xhc3MgZm9yIEphdmFCcmVha3BvaW50UHJvdmlkZXIgYW5kCi0gKiBKYXZhU2NyaXB0QnJlYWtwb2ludFByb3ZpZGVyLCBhbmQgc2hvdWxkIGJlIHJlZmFjdG9yZWQgdG8gc2VwYXJhdGUgSmF2YSBhbmQKLSAqIEphdmFTY3JpcHQgcGFydHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJyZWFrcG9pbnRQcm92aWRlciBpbXBsZW1lbnRzIElCcmVha3BvaW50UHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRU5EX09GX0xJTkUgPSAtMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBKQVZBID0gMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBKQVZBU0NSSVBUID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBKQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVMgPSBuZXcgU3RyaW5nW117ImphdmFzY3JpcHQiLCAiamF2YXNjcmlwdDEuMCIsICJqYXZhc2NyaXB0MS4xXzMiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSJqYXZhc2NyaXB0MS4yIiwgImphdmFzY3JpcHQxLjMiLCAiamF2YXNjcmlwdDEuNCIsICJqYXZhc2NyaXB0MS41IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCSJqYXZhc2NyaXB0MS42IiwgImpzY3JpcHQiLCAic2FzaHNjcmlwdCJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX1BBR0UgPSAianNwOmRpcmVjdGl2ZS5wYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTk9fVkFMSURfQ09OVEVOVCA9IC0yOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFVOU1VQUE9SVEVEID0gMDsKLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmdbXSBoYXlzdGFjaywgU3RyaW5nIG5lZWRsZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGhheXN0YWNrLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaGF5c3RhY2tbaV0uZXF1YWxzKG5lZWRsZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIHBhZ2UgbGFuZ3VhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRQYWdlTGFuZ3VhZ2UoRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybiBVTlNVUFBPUlRFRDsKLQotCQlOb2RlTGlzdCBwYWdlRGlyZWN0aXZlcyA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZShKU1BfRElSRUNUSVZFX1BBR0UpOwotCQkvLyBTZWFyY2ggZm9yIGZpcnN0IGxhbmd1YWdlIGRpcmVjdGl2ZQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VEaXJlY3RpdmVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGQgPSBwYWdlRGlyZWN0aXZlcy5pdGVtKGkpOwotCQkJTm9kZSBsYW5ndWFnZUF0dHIgPSBjaGlsZC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJsYW5ndWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobGFuZ3VhZ2VBdHRyICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcGFnZUxhbmd1YWdlID0gbGFuZ3VhZ2VBdHRyLmdldE5vZGVWYWx1ZSgpOwotCQkJCWlmIChwYWdlTGFuZ3VhZ2UgPT0gbnVsbCB8fCBwYWdlTGFuZ3VhZ2UubGVuZ3RoKCkgPT0gMCkKLQkJCQkJcmV0dXJuIFVOU1VQUE9SVEVEOwotCQkJCXBhZ2VMYW5ndWFnZSA9IHBhZ2VMYW5ndWFnZS50b0xvd2VyQ2FzZSgpOwotCQkJCWlmIChjb250YWlucyhKQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVMsIHBhZ2VMYW5ndWFnZSkpCi0JCQkJCXJldHVybiBKQVZBU0NSSVBUOwotCQkJCWVsc2UgaWYgKHBhZ2VMYW5ndWFnZS5lcXVhbHMoImphdmEiKSkvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBKQVZBOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIFVOU1VQUE9SVEVEOwotCQkJfQotCQl9Ci0JCXJldHVybiBKQVZBOyAvLyBKYXZhIGlzIGRlZmF1bHQgaWYgbm8gbGFuZ3VhZ2UgZGlyZWN0aXZlCi0JfQotCi0JLyoKLQkgKiBTZWFyY2ggdGhlIFJlZ2lvbkNvbnRhaW5lcidzIHJlZ2lvbnMgbG9va2luZyBmb3IgSlNQIGNvbnRlbnQuIElmIHZhbGlkCi0JICogY29udGVudCBpcyBmb3VuZCwgcmV0dXJuIHRoZSBwb3NpdGlvbiA+PSAwIElmIG5vIHZhbGlkIGNvbnRlbnQgaXMKLQkgKiBmb3VuZCwgcmV0dXJuIE5PX1ZBTElEX0NPTlRFTlQuIElmIGEgcmVnaW9uIHN0YXJ0cyBhZnRlciB0aGUgbGluZSdzCi0JICogZW5kT2Zmc2V0LCByZXR1cm4gRU5EX09GX0xJTkUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFZhbGlkUmVnaW9uUG9zaXRpb24oSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbkNvbnRhaW5lciwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgZW5kT2Zmc2V0KSB7Ci0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSByZWdpb25Db250YWluZXIuZ2V0UmVnaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJCWludCB2YWxpZFBvc2l0aW9uID0gZ2V0VmFsaWRSZWdpb25Qb3NpdGlvbihtb2RlbCwgKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgcmVnaW9uLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKLQkJCQlpZiAodmFsaWRQb3NpdGlvbiA9PSBFTkRfT0ZfTElORSB8fCB2YWxpZFBvc2l0aW9uID49IDApCi0JCQkJCXJldHVybiB2YWxpZFBvc2l0aW9uOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gcmVnaW9uIG11c3QgYmUgYXQgbGVhc3QgcGFydGlhbGx5IG9uIHNlbGVjdGVkIGxpbmUKLQkJCQlpZiAocmVnaW9uQ29udGFpbmVyLmdldEVuZE9mZnNldChyZWdpb24pID4gc3RhcnRPZmZzZXQpIHsKLQotCQkJCQlpbnQgcmVnaW9uU3RhcnRPZmZzZXQgPSByZWdpb25Db250YWluZXIuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJLy8gaWYgcmVnaW9uIHN0YXJ0cyBhZnRlciBsaW5lJ3MgZW5kT2Zmc2V0LCB3ZSdyZSBkb25lCi0JCQkJCS8vIHNlYXJjaGluZwotCQkJCQlpZiAocmVnaW9uU3RhcnRPZmZzZXQgPiBlbmRPZmZzZXQpCi0JCQkJCQlyZXR1cm4gRU5EX09GX0xJTkU7Ci0KLQkJCQkJLy8gSWYgcmVnaW9uIGlzIEpTUCBjb250ZW50LCBtYWtlIHN1cmUgdGhlIGxhbmd1YWdlIGlzCi0JCQkJCS8vIEphdmEgbm90IEphdmFzY3JpcHQgYnkKLQkJCQkJLy8gY2hlY2tpbmcgdGhlIGNvbnRlbnQgYXNzaXN0IGFkYXB0ZXIncyB0eXBlLgotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpKSB7Ci0JCQkJCQkvLyBEV006IHRoaXMgbG9naWMgaXMgbm90IGluY29ycmVjdCAuLi4gZ2l2ZW4gY2hhbmdlcwotCQkJCQkJLy8gdG8gYWRhcHRlcnMsIGV0Yy4KLQkJCQkJCS8vIGJ1dCBwcm9iYWJseSBkb24ndCBuZWVkIGFueXRoaW5nIGhlcmUsIHNpbmNlIGJvdGgKLQkJCQkJCS8vIEphdmEgYW5kIEphdmFTY3JpcHQKLQkJCQkJCS8vIGFyZSBzdXBwb3J0ZWQgaW4gVjUuCi0KLQkJCQkJCS8vIG5zZF9UT0RPOiB2ZXJpZnkgdGhpcyEhIQotCi0JCQkJCQkvLyBJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0KLQkJCQkJCS8vIChJTm9kZU5vdGlmaWVyKW1vZGVsLmdldE5vZGUocmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQkJLy8gSUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPQotCQkJCQkJLy8gbW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihDb250ZW50QXNzaXN0QWRhcHRlci5jbGFzcyk7Ci0JCQkJCQkvLyBpZihmYWN0b3J5IGluc3RhbmNlb2YKLQkJCQkJCS8vIEhUTUxDb250ZW50QXNzaXN0QWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJCS8vIElOb2RlQWRhcHRlciBhZGFwdGVyID0KLQkJCQkJCS8vICgoSFRNTENvbnRlbnRBc3Npc3RBZGFwdGVyRmFjdG9yeSlmYWN0b3J5KS5jcmVhdGVBZGFwdGVyKG5vdGlmaWVyLAotCQkJCQkJLy8gcmVnaW9uKTsKLQkJCQkJCS8vIGlmKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyIGluc3RhbmNlb2YKLQkJCQkJCS8vIEpTUEphdmFDb250ZW50QXNzaXN0QWRhcHRlcikKLQotCQkJCQkJaWYgKHJlZ2lvblN0YXJ0T2Zmc2V0ID4gc3RhcnRPZmZzZXQpCi0JCQkJCQkJcmV0dXJuIHJlZ2lvblN0YXJ0T2Zmc2V0OwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBzdGFydE9mZnNldDsKLQkJCQkJCS8vIH0KLQkJCQkJfQotCQkJCQkvLyBhIGN1c3RvbSB0YWcsIGpzcDp1c2VCZWFuLCBnZXRwcm9wZXJ0eSBvciBzZXRwcm9wZXJ0eQotCQkJCQkvLyBzdGF0ZW1lbnQgaXMgYWxzbyBhIHZhbGlkIGJyZWFrcG9pbnQgbG9jYXRpb24KLQkJCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpICYmIChpc0N1c3RvbVRhZ1JlZ2lvbihtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHJlZ2lvblN0YXJ0T2Zmc2V0KSkgfHwgcmVnaW9uQ29udGFpbmVyLmdldFRleHQocmVnaW9uKS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuVVNFQkVBTikgfHwgcmVnaW9uQ29udGFpbmVyLmdldFRleHQocmVnaW9uKS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuR0VUUFJPUEVSVFkpIHx8IHJlZ2lvbkNvbnRhaW5lci5nZXRUZXh0KHJlZ2lvbikuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFVFBST1BFUlRZKSkpIHsKLQotCQkJCQkJaWYgKHJlZ2lvblN0YXJ0T2Zmc2V0ID4gc3RhcnRPZmZzZXQpCi0JCQkJCQkJcmV0dXJuIHJlZ2lvblN0YXJ0T2Zmc2V0OwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBzdGFydE9mZnNldDsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIERlZmVjdCAjMjQxMDkwLCB0aGUgVGV4dCBOb2RlcyBpbnNpZGUgb2YgSlNQCi0JCQkJCQkvLyBzY3JpcHRsZXRzLCBleHByZXNzaW9ucywgYW5kIGRlY2xhcmF0aW9ucyBhcmUgdmFsaWQKLQkJCQkJCS8vIGJyZWFrcG9pbnQtYWJsZSBsb2NhdGlvbnMKLQkJCQkJCWJvb2xlYW4gaXNDb2RlTm9kZSA9IGZhbHNlOwotCQkJCQkJSW5kZXhlZFJlZ2lvbiBub2RlID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihyZWdpb25TdGFydE9mZnNldCk7Ci0JCQkJCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQkJTm9kZSBkb21Ob2RlID0gKE5vZGUpIG5vZGU7Ci0JCQkJCQkJTm9kZSByb290ID0gZG9tTm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQkJCQkJaWYgKHJvb3QgIT0gbnVsbCAmJiByb290LmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJPT1QpICYmIGRvbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBkb21Ob2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCVN0cmluZyBwYXJlbnROYW1lID0gZG9tTm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJCQkJaXNDb2RlTm9kZSA9IHBhcmVudE5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVExFVCkgfHwgcGFyZW50TmFtZS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRVhQUkVTU0lPTikgfHwgcGFyZW50TmFtZS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVDTEFSQVRJT04pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChpc0NvZGVOb2RlKSB7Ci0JCQkJCQkJaWYgKHJlZ2lvblN0YXJ0T2Zmc2V0ID4gc3RhcnRPZmZzZXQpCi0JCQkJCQkJCXJldHVybiByZWdpb25TdGFydE9mZnNldDsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXJldHVybiBzdGFydE9mZnNldDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gTk9fVkFMSURfQ09OVEVOVDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ3VzdG9tVGFnUmVnaW9uKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJRWxlbWVudCB4bWxFbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSh4bWxFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gbXEuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oeG1sRWxlbWVudCk7Ci0JCQlpZiAoZGVjbCBpbnN0YW5jZW9mIENNTm9kZVdyYXBwZXIpIHsKLQkJCQlDTU5vZGUgY21Ob2RlID0gKChDTU5vZGVXcmFwcGVyKSBkZWNsKS5nZXRPcmlnaW5Ob2RlKCk7Ci0JCQkJcmV0dXJuIGNtTm9kZSBpbnN0YW5jZW9mIFRMREVsZW1lbnREZWNsYXJhdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBJU291cmNlRWRpdGluZ1RleHRUb29scyBmU291cmNlRWRpdGluZ1RleHRUb29sczsKLQotCi0JcHJvdGVjdGVkIElSZXNvdXJjZSBnZXRFZGl0b3JJbnB1dFJlc291cmNlKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpbnB1dC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgaW5wdXQuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgZ2V0U291cmNlRWRpdGluZ1RleHRUb29scygpIHsKLQkJcmV0dXJuIGZTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VmFsaWRQb3NpdGlvbihJRG9jdW1lbnQgaWRvYywgaW50IGxpbmVOdW1iZXIpIHsKLQkJaWYgKCEoZ2V0U291cmNlRWRpdGluZ1RleHRUb29scygpIGluc3RhbmNlb2YgSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMpKSB7Ci0JCQlyZXR1cm4gTk9fVkFMSURfQ09OVEVOVDsKLQkJfQotCQlpZiAoaWRvYyA9PSBudWxsKQotCQkJcmV0dXJuIE5PX1ZBTElEX0NPTlRFTlQ7Ci0KLQkJaW50IHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQ7Ci0JCXRyeSB7Ci0JCQlzdGFydE9mZnNldCA9IGlkb2MuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyIC0gMSk7Ci0JCQllbmRPZmZzZXQgPSBpZG9jLmdldExpbmVPZmZzZXQobGluZU51bWJlcikgLSAxOwotCi0JCQlpZiAoaWRvYyA9PSBudWxsKQotCQkJCXJldHVybiBOT19WQUxJRF9DT05URU5UOwotCQkJU3RyaW5nIGxpbmVUZXh0ID0gaWRvYy5nZXQoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KS50cmltKCk7Ci0KLQkJCS8vIGJsYW5rIGxpbmVzIG9yIGxpbmVzIHdpdGggb25seSBhbiBvcGVuIG9yIGNsb3NlIGJyYWNlIG9yCi0JCQkvLyBzY3JpcHRsZXQgdGFnIGNhbm5vdCBoYXZlIGEgYnJlYWtwb2ludAotCQkJaWYgKGxpbmVUZXh0LmVxdWFscygiIikgfHwgbGluZVRleHQuZXF1YWxzKCJ7IikgfHwgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCWxpbmVUZXh0LmVxdWFscygifSIpIHx8IGxpbmVUZXh0LmVxdWFscygiPCUiKSkvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBOT19WQUxJRF9DT05URU5UOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gTk9fVkFMSURfQ09OVEVOVDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGlkb2MpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0T2Zmc2V0KTsKLQkJLy8gZ28gdGhyb3VnaCB0aGUgbm9kZSdzIHJlZ2lvbnMgbG9va2luZyBmb3IgSlNQIGNvbnRlbnQKLQkJLy8gdW50aWwgcmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUgbGluZQotCQl3aGlsZSAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJaW50IHZhbGlkUG9zaXRpb24gPSBnZXRWYWxpZFJlZ2lvblBvc2l0aW9uKCgoSURPTURvY3VtZW50KSAoKElET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSBnZXRTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKCkpLmdldERPTURvY3VtZW50KCkpLmdldE1vZGVsKCksIGZsYXROb2RlLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKLQotCQkJaWYgKHZhbGlkUG9zaXRpb24gPT0gRU5EX09GX0xJTkUpCi0JCQkJcmV0dXJuIE5PX1ZBTElEX0NPTlRFTlQ7Ci0KLQkJCWlmICh2YWxpZFBvc2l0aW9uID49IDApCi0JCQkJcmV0dXJuIHZhbGlkUG9zaXRpb247Ci0KLQkJCWZsYXROb2RlID0gZmxhdE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBOT19WQUxJRF9DT05URU5UOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgc291cmNlRWRpdGluZ1RleHRUb29scykgewotCQlmU291cmNlRWRpdGluZ1RleHRUb29scyA9IHNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YUJyZWFrcG9pbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YUJyZWFrcG9pbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzA3MjViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFCcmVha3BvaW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy5jb3JlLkpESURlYnVnTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5JRE9NU291cmNlRWRpdGluZ1RleHRUb29sczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEEgQnJlYWtwb2ludFByb3ZpZGVyIHN1cHBvcnRpbmcgc2VydmVyLXNpZGUgSmF2YSBhcyBhIEpTUCBsYW5ndWFnZQotICogCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YUJyZWFrcG9pbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0QnJlYWtwb2ludFByb3ZpZGVyIHsKLQotCS8qCi0JICogQHBhcmFtIHJlcyBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRUeXBlTmFtZShJUmVzb3VyY2UgcmVzKSB7Ci0JCUlQYXRoIHBhdGggPSByZXMuZ2V0RnVsbFBhdGgoKTsKLQkJLy8gQXNzdW1lIHVuZGVyIFdlYiBDb250ZW50IGZvbGRlciBpZiBtb3JlIHRoYW4gMiBzZWdtZW50cwotCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDIpIHsKLQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQl9Ci0JCVN0cmluZyB0eXBlTmFtZSA9IHBhdGgudG9TdHJpbmcoKS5yZXBsYWNlKElQYXRoLlNFUEFSQVRPUiwgJy4nKTsKLQkJaWYgKHJlcy5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgewotCQkJdHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVOYW1lOwotCX0KLQotCi0KLQlwdWJsaWMgSVN0YXR1cyBhZGRCcmVha3BvaW50KElEb2N1bWVudCBkb2N1bWVudCwgSUVkaXRvcklucHV0IGlucHV0LCBpbnQgbGluZU51bWJlciwgaW50IG9mZnNldCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpbnQgcG9zID0gZ2V0VmFsaWRQb3NpdGlvbihkb2N1bWVudCwgbGluZU51bWJlcik7Ci0JCWlmIChwb3MgIT0gTk9fVkFMSURfQ09OVEVOVCkgewotCQkJSVJlc291cmNlIHJlcyA9IGdldEVkaXRvcklucHV0UmVzb3VyY2UoaW5wdXQpOwotCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0VHlwZU5hbWUocmVzKTsKLQkJCQl0cnkgewotCQkJCQlKRElEZWJ1Z01vZGVsLmNyZWF0ZUxpbmVCcmVha3BvaW50KHJlcywgdHlwZU5hbWUsIGxpbmVOdW1iZXIsIHBvcywgcG9zLCAwLCB0cnVlLCBudWxsKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSlNQVUlQbHVnaW4uSUQsIElTdGF0dXMuT0ssIEpTUFVJTWVzc2FnZXMuT0ssIG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuQWRkQnJlYWtwb2ludChJRG9jdW1lbnQgZG9jdW1lbnQsIElFZGl0b3JJbnB1dCBpbnB1dCwgTm9kZSBub2RlLCBpbnQgbGluZU51bWJlciwgaW50IG9mZnNldCkgewotCQlJUmVzb3VyY2UgcmVzID0gaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0ID8gKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0RmlsZSgpIDogbnVsbDsKLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJaWYgKGdldFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoKSBpbnN0YW5jZW9mIElET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSB7Ci0JCQlkb2MgPSAoKElET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSBnZXRTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKCkpLmdldERPTURvY3VtZW50KCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzICE9IG51bGwgJiYgIWlzQnJlYWtwb2ludEV4aXN0KHJlcywgbGluZU51bWJlcikgJiYgaXNWYWxpZFBvc2l0aW9uKGRvY3VtZW50LCBsaW5lTnVtYmVyKSAmJiAoZ2V0UGFnZUxhbmd1YWdlKGRvYykgPT0gSkFWQSk7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJcmV0dXJuIGdldEVkaXRvcklucHV0UmVzb3VyY2UoaW5wdXQpOwotCX0KLQotCS8qCi0JICogQHBhcmFtIHJlcyBAcGFyYW0gbGluZU51bWJlciBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNCcmVha3BvaW50RXhpc3QoSVJlc291cmNlIHJlcywgaW50IGxpbmVOdW1iZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBKRElEZWJ1Z01vZGVsLmxpbmVCcmVha3BvaW50RXhpc3RzKGdldFR5cGVOYW1lKHJlcyksIGxpbmVOdW1iZXIpICE9IG51bGw7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAcGFyYW0gZG9jIEBwYXJhbSBpZG9jIEBwYXJhbSBsaW5lTnVtYmVyIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUG9zaXRpb24oSURvY3VtZW50IGlkb2MsIGludCBsaW5lTnVtYmVyKSB7Ci0JCXJldHVybiBnZXRWYWxpZFBvc2l0aW9uKGlkb2MsIGxpbmVOdW1iZXIpICE9IE5PX1ZBTElEX0NPTlRFTlQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YVNjcmlwdEJyZWFrcG9pbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YVNjcmlwdEJyZWFrcG9pbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzdjNTFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFTY3JpcHRCcmVha3BvaW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmJyZWFrcG9pbnRwcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUJyZWFrcG9pbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIEEgSUJyZWFrcG9pbnRQcm92aWRlciBzdXBwb3J0aW5nIHNlcnZlci1zaWRlIEphdmFTY3JpcHQgYXMgYSBKU1AgbGFuZ3VhZ2UKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVNjcmlwdEJyZWFrcG9pbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0QnJlYWtwb2ludFByb3ZpZGVyIHsKLQlwdWJsaWMgYm9vbGVhbiBjYW5BZGRCcmVha3BvaW50KElEb2N1bWVudCBkb2N1bWVudCwgSUVkaXRvcklucHV0IGlucHV0LCBpbnQgbGluZU51bWJlciwgaW50IG9mZnNldCkgewotCQlJUmVzb3VyY2UgcmVzID0gZ2V0RWRpdG9ySW5wdXRSZXNvdXJjZShpbnB1dCk7Ci0JCURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCXJldHVybiByZXMgIT0gbnVsbCAmJiAhaXNCcmVha3BvaW50RXhpc3QocmVzLCBsaW5lTnVtYmVyKSAmJiBpc1ZhbGlkUG9zaXRpb24oZG9jdW1lbnQsIGxpbmVOdW1iZXIpICYmIChnZXRQYWdlTGFuZ3VhZ2UoZG9jKSAhPSBKQVZBKTsKLQl9Ci0KLQotCXB1YmxpYyBJU3RhdHVzIGFkZEJyZWFrcG9pbnQoSURvY3VtZW50IGRvY3VtZW50LCBJRWRpdG9ySW5wdXQgaW5wdXQsIGludCBsaW5lTnVtYmVyLCBpbnQgb2Zmc2V0KSB7Ci0JCWludCBwb3MgPSBnZXRWYWxpZFBvc2l0aW9uKGRvY3VtZW50LCBsaW5lTnVtYmVyKTsKLQkJaWYgKHBvcyAhPSBOT19WQUxJRF9DT05URU5UICYmIGNhbkFkZEJyZWFrcG9pbnQoZG9jdW1lbnQsIGlucHV0LCBsaW5lTnVtYmVyLCBvZmZzZXQpKSB7Ci0JCQlJUmVzb3VyY2UgcmVzID0gZ2V0RWRpdG9ySW5wdXRSZXNvdXJjZShpbnB1dCk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQluZXcgSmF2YXNjcmlwdExpbmVCcmVha3BvaW50KHJlcywgbGluZU51bWJlciwgcG9zLCBwb3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEpTUFVJUGx1Z2luLklELCBJU3RhdHVzLk9LLCBKU1BVSU1lc3NhZ2VzLk9LLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogQHBhcmFtIHJlcyBAcGFyYW0gbGluZU51bWJlciBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNCcmVha3BvaW50RXhpc3QoSVJlc291cmNlIHJlcywgaW50IGxpbmVOdW1iZXIpIHsKLQkJSUJyZWFrcG9pbnRNYW5hZ2VyIG1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKTsKLQkJSUJyZWFrcG9pbnRbXSBicmVha3BvaW50cyA9IG1hbmFnZXIuZ2V0QnJlYWtwb2ludHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBicmVha3BvaW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCEoYnJlYWtwb2ludHNbaV0gaW5zdGFuY2VvZiBKYXZhc2NyaXB0TGluZUJyZWFrcG9pbnQpKQotCQkJCWNvbnRpbnVlOwotCQkJSmF2YXNjcmlwdExpbmVCcmVha3BvaW50IGJyZWFrcG9pbnQgPSAoSmF2YXNjcmlwdExpbmVCcmVha3BvaW50KSBicmVha3BvaW50c1tpXTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGJyZWFrcG9pbnQuZ2V0UmVzb3VyY2UoKS5lcXVhbHMocmVzKSAmJiBicmVha3BvaW50LmdldExpbmVOdW1iZXIoKSA9PSBsaW5lTnVtYmVyKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAcGFyYW0gZG9jIEBwYXJhbSBpZG9jIEBwYXJhbSBsaW5lTnVtYmVyIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUG9zaXRpb24oSURvY3VtZW50IGlkb2MsIGludCBsaW5lTnVtYmVyKSB7Ci0JCXJldHVybiBnZXRWYWxpZFBvc2l0aW9uKGlkb2MsIGxpbmVOdW1iZXIpICE9IE5PX1ZBTElEX0NPTlRFTlQ7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJcmV0dXJuIGdldEVkaXRvcklucHV0UmVzb3VyY2UoaW5wdXQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFTdHJhdHVtQnJlYWtwb2ludFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9KYXZhU3RyYXR1bUJyZWFrcG9pbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzkwODFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFTdHJhdHVtQnJlYWtwb2ludFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmRlYnVnLmNvcmUuSkRJRGVidWdNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0b3JhZ2VFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQuSUJyZWFrcG9pbnRQcm92aWRlcjsKLQotLyoqCi0gKiBBIElCcmVha3BvaW50UHJvdmlkZXIgc3VwcG9ydGluZyBKU1AgYnJlYWtwb2ludHMgZm9yIGEgTm9uLUphdmEgTGFuZ3VhZ2UKLSAqIFNvdXJjZSBKU1AgcGFnZQotICovCi1wdWJsaWMgY2xhc3MgSmF2YVN0cmF0dW1CcmVha3BvaW50UHJvdmlkZXIgaW1wbGVtZW50cyBJQnJlYWtwb2ludFByb3ZpZGVyLCBJRXhlY3V0YWJsZUV4dGVuc2lvbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0xBU1NfUEFUVEVSTiA9ICIqanNwLGpzcF9zZXJ2bGV0Ll8qIjsKLQlwcml2YXRlIE9iamVjdCBmRGF0YSA9IG51bGw7Ci0KLQlwdWJsaWMgSVN0YXR1cyBhZGRCcmVha3BvaW50KElEb2N1bWVudCBkb2N1bWVudCwgSUVkaXRvcklucHV0IGlucHV0LCBpbnQgZWRpdG9yTGluZU51bWJlciwgaW50IG9mZnNldCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBjaGVjayBpZiB0aGVyZSBpcyBhIHZhbGlkIHBvc2l0aW9uIHRvIHNldCBicmVha3BvaW50Ci0JCWludCBwb3MgPSBnZXRWYWxpZFBvc2l0aW9uKGRvY3VtZW50LCBlZGl0b3JMaW5lTnVtYmVyKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlpZiAocG9zID49IDApIHsKLQkJCUlSZXNvdXJjZSByZXMgPSBnZXRSZXNvdXJjZUZyb21JbnB1dChpbnB1dCk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0JCQkJSUJyZWFrcG9pbnQgcG9pbnQgPSBKRElEZWJ1Z01vZGVsLmNyZWF0ZVN0cmF0dW1CcmVha3BvaW50KHJlcywgIkpTUCIsIHJlcy5nZXROYW1lKCksIHBhdGgsIGdldENsYXNzUGF0dGVybihyZXMpLCBlZGl0b3JMaW5lTnVtYmVyLCBwb3MsIHBvcywgMCwgdHJ1ZSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocG9pbnQgPT0gbnVsbCkgewotCQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpTUFVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCAidW5zdXBwb3J0ZWQgaW5wdXQgdHlwZSIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQkJLy8gRm9yIG5vbi1yZXNvdXJjZXMsIHVzZSB0aGUgd29ya3NwYWNlIHJvb3QgYW5kIGEgY29vcmRpbmF0ZWQKLQkJCQkvLyBhdHRyaWJ1dGUgdGhhdCBpcyB1c2VkIHRvCi0JCQkJLy8gcHJldmVudCB1bndhbnRlZCAoYnJlYWtwb2ludCkgbWFya2VycyBmcm9tIGJlaW5nIGxvYWRlZAotCQkJCS8vIGludG8gdGhlIGVkaXRvcnMuCi0JCQkJcmVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQlTdHJpbmcgaWQgPSBpbnB1dC5nZXROYW1lKCk7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCAmJiAoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRTdG9yYWdlKCkgIT0gbnVsbCAmJiAoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKSAhPSBudWxsKSB7Ci0JCQkJCWlkID0gKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWF0dHJpYnV0ZXMucHV0KFN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbC5TRUNPTkRBUllfSURfS0VZLCBpZCk7Ci0JCQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQkJCUlCcmVha3BvaW50IHBvaW50ID0gSkRJRGVidWdNb2RlbC5jcmVhdGVTdHJhdHVtQnJlYWtwb2ludChyZXMsICJKU1AiLCBpbnB1dC5nZXROYW1lKCksIHBhdGgsIGdldENsYXNzUGF0dGVybihyZXMpLCBlZGl0b3JMaW5lTnVtYmVyLCBwb3MsIHBvcywgMCwgdHJ1ZSwgYXR0cmlidXRlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocG9pbnQgPT0gbnVsbCkgewotCQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpTUFVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCAidW5zdXBwb3J0ZWQgaW5wdXQgdHlwZSIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIEpTUFVJUGx1Z2luLklELCBJU3RhdHVzLklORk8sIEpTUFVJTWVzc2FnZXMuQnJlYWtwb2ludE5vdEFsbG93ZWQsIG51bGwpOwotCQl9Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCkgewotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKU1BVSVBsdWdpbi5JRCwgSVN0YXR1cy5PSywgSlNQVUlNZXNzYWdlcy5PSywgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRDbGFzc1BhdHRlcm4oSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc2hvcnROYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCAmJiBleHRlbnNpb24ubGVuZ3RoKCkgPCBzaG9ydE5hbWUubGVuZ3RoKCkpIHsKLQkJCQlzaG9ydE5hbWUgPSBzaG9ydE5hbWUuc3Vic3RyaW5nKDAsIHNob3J0TmFtZS5sZW5ndGgoKSAtIGV4dGVuc2lvbi5sZW5ndGgoKSAtIDEpOwotCQkJfQotCQkJaWYgKGZEYXRhIGluc3RhbmNlb2YgU3RyaW5nICYmIGZEYXRhLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJLyoKLQkJCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NDc1Ci0JCQkJICovCi0JCQkJcmV0dXJuIGZEYXRhICsgIixfIiArIHNob3J0TmFtZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZEYXRhIGluc3RhbmNlb2YgTWFwICYmIHJlc291cmNlLmlzQWNjZXNzaWJsZSgpICYmIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihyZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCWlmICh0eXBlcy5sZW5ndGggPT0gMCkgewotCQkJCQkvLyBpZiBmYWlsZWQgdG8gZmluZCBxdWlja2x5LCBiZSBtb3JlIGFnZ3Jlc3NpdmUKLQkJCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIG9wdGltaXplZCBkZXNjcmlwdGlvbiBsb29rdXAsIG1pZ2h0IG5vdCBzdWNjZWVkCi0JCQkJCQlkID0gKChJRmlsZSkgcmVzb3VyY2UpLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCQkJaWYgKGQgIT0gbnVsbCkgewotCQkJCQkJCXR5cGVzID0gbmV3IElDb250ZW50VHlwZVtde2QuZ2V0Q29udGVudFR5cGUoKX07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLyoKLQkJCQkJCSAqIHNob3VsZCBub3QgYmUgcG9zc2libGUgZ2l2ZW4gdGhlIGFjY2Vzc2libGUgYW5kCi0JCQkJCQkgKiBmaWxlIHR5cGUgY2hlY2sgYWJvdmUKLQkJCQkJCSAqLwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHdhc24ndCBmb3VuZCBlYXJsaWVyCi0JCQkJaWYgKHR5cGVzID09IG51bGwpIHsKLQkJCQkJdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKHJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJCVN0cmluZ0J1ZmZlciBwYXR0ZXJuQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiXyIgKyBzaG9ydE5hbWUpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJT2JqZWN0IHBhdHRlcm4gPSAoKE1hcCkgZkRhdGEpLmdldCh0eXBlc1tpXS5nZXRJZCgpKTsKLQkJCQkJaWYgKHBhdHRlcm4gIT0gbnVsbCkgewotCQkJCQkJcGF0dGVybkJ1ZmZlci5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGF0dGVybkJ1ZmZlci5hcHBlbmQocGF0dGVybik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHBhdHRlcm5CdWZmZXIudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gREVGQVVMVF9DTEFTU19QQVRURVJOOwotCX0KLQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUZyb21JbnB1dChpbnB1dCk7Ci0JfQotCi0JcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0UmVzb3VyY2VGcm9tSW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGlucHV0LmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpbnB1dC5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIGEgdmFsaWQgcG9zaXRpb24gc29tZXdoZXJlIG9uIGxpbmVOdW1iZXIgaW4gZG9jdW1lbnQsIGlkb2MsIHdoZXJlCi0JICogYSBicmVha3BvaW50IGNhbiBiZSBzZXQgYW5kIHJldHVybnMgdGhhdCBwb3NpdGlvbi4gLTEgaXMgcmV0dXJuZWQgaWYgYQotCSAqIHBvc2l0aW9uIGNvdWxkIG5vdCBiZSBmb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWRvYwotCSAqIEBwYXJhbSBlZGl0b3JMaW5lTnVtYmVyCi0JICogQHJldHVybiBwb3NpdGlvbiB0byBzZXQgYnJlYWtwb2ludCBvciAtMSBpZiBubyBwb3NpdGlvbiBjb3VsZCBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgaW50IGdldFZhbGlkUG9zaXRpb24oSURvY3VtZW50IGlkb2MsIGludCBlZGl0b3JMaW5lTnVtYmVyKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaWYgKGlkb2MgIT0gbnVsbCkgewotCi0JCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJaW50IGVuZE9mZnNldCA9IDA7Ci0JCQl0cnkgewotCQkJCUlSZWdpb24gbGluZSA9IGlkb2MuZ2V0TGluZUluZm9ybWF0aW9uKGVkaXRvckxpbmVOdW1iZXIgLSAxKTsKLQkJCQlzdGFydE9mZnNldCA9IGxpbmUuZ2V0T2Zmc2V0KCk7Ci0JCQkJZW5kT2Zmc2V0ID0gTWF0aC5tYXgobGluZS5nZXRPZmZzZXQoKSwgbGluZS5nZXRPZmZzZXQoKSArIGxpbmUuZ2V0TGVuZ3RoKCkpOwotCi0JCQkJU3RyaW5nIGxpbmVUZXh0ID0gaWRvYy5nZXQoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KS50cmltKCk7Ci0KLQkJCQkvLyBibGFuayBsaW5lcyBvciBsaW5lcyB3aXRoIG9ubHkgYW4gb3BlbiBvciBjbG9zZSBicmFjZSBvcgotCQkJCS8vIHNjcmlwdGxldCB0YWcgY2Fubm90IGhhdmUgYSBicmVha3BvaW50Ci0JCQkJaWYgKGxpbmVUZXh0LmVxdWFscygiIikgfHwgbGluZVRleHQuZXF1YWxzKCJ7IikgfHwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJbGluZVRleHQuZXF1YWxzKCJ9IikgfHwgbGluZVRleHQuZXF1YWxzKCI8JSIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl7Ci0JCQkJCXJlc3VsdCA9IC0xOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gZ2V0IGFsbCBwYXJ0aXRpb25zIGZvciBjdXJyZW50IGxpbmUKLQkJCQkJSVR5cGVkUmVnaW9uW10gcGFydGl0aW9ucyA9IG51bGw7Ci0KLQkJCQkJcGFydGl0aW9ucyA9IGlkb2MuY29tcHV0ZVBhcnRpdGlvbmluZyhzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOwotCi0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aXRpb25zLmxlbmd0aDsgKytpKSB7Ci0JCQkJCQlTdHJpbmcgdHlwZSA9IHBhcnRpdGlvbnNbaV0uZ2V0VHlwZSgpOwotCQkJCQkJLy8gaWYgZm91bmQganNwIGphdmEgY29udGVudCwganNwIGRpcmVjdGl2ZSB0YWdzLAotCQkJCQkJLy8gY3VzdG9tCi0JCQkJCQkvLyB0YWdzLAotCQkJCQkJLy8gcmV0dXJuIHRoYXQgcG9zaXRpb24KLQkJCQkJCWlmICh0eXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEgfHwgdHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFIHx8Ci0JCQkJCQkJCXR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFRfRUwgfHwgdHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVF9FTDIpIHsKLQkJCQkJCQlyZXN1bHQgPSBwYXJ0aXRpb25zW2ldLmdldE9mZnNldCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXN1bHQgPSAtMTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb24jc2V0SW5pdGlhbGl6YXRpb25EYXRhKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxpemF0aW9uRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZGF0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmRGF0YSA9IGRhdGE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U291cmNlRWRpdGluZ1RleHRUb29scyhJU291cmNlRWRpdGluZ1RleHRUb29scyB0b29scykgewotCQkvLyBub3QgdXNlZAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFzY3JpcHRMaW5lQnJlYWtwb2ludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YXNjcmlwdExpbmVCcmVha3BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYWQ1OTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YXNjcmlwdExpbmVCcmVha3BvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEp1bCAyMCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIGRhdmlkdwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSmF2YXNjcmlwdExpbmVCcmVha3BvaW50IHsKLQotCS8qKgotCSAqIEBwYXJhbSByZXMKLQkgKiBAcGFyYW0gbGluZU51bWJlcgotCSAqIEBwYXJhbSBwb3MKLQkgKiBAcGFyYW0gcG9zMQotCSAqLwotCXB1YmxpYyBKYXZhc2NyaXB0TGluZUJyZWFrcG9pbnQoSVJlc291cmNlIHJlcywgaW50IGxpbmVOdW1iZXIsIGludCBwb3MsIGludCBwb3MxKSB7Ci0KLQkJLy8gVE9ETyBTaG91bGQgYmUgZGVsZXRlZD8gQWxvbmcgd2l0aCBjYWxsaW5nIGNsYXNzPwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBKYXZhc2NyaXB0TGluZUJyZWFrcG9pbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQXV0b0ltcG9ydFByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdXRvSW1wb3J0UHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyNTZkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdXRvSW1wb3J0UHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgR2VudWl0ZWMsIExMQyAtIEZpeCBmb3IgYnVnIDIwMzMwMwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUltcG9ydENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDIwVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIEF1dG9JbXBvcnRQcm9wb3NhbCBleHRlbmRzIEpTUENvbXBsZXRpb25Qcm9wb3NhbCB7Ci0JCi0JLy8gdGhlIGltcG9ydCBzdHJpbmcsIG5vIHF1b3RlcyBvciBjb2xvbnMKLQlTdHJpbmcgZkltcG9ydERlY2xhcmF0aW9uOwotCUlJbXBvcnRDb250YWluZXIgZkltcG9ydENvbnRhaW5lcjsKLQotCXB1YmxpYyBBdXRvSW1wb3J0UHJvcG9zYWwoU3RyaW5nIGltcG9ydERlY2xhcmF0aW9uLCBTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIGludCByZXBsYWNlbWVudE9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBpbnQgY3Vyc29yUG9zaXRpb24sIEltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZywgSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24sIFN0cmluZyBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCBpbnQgcmVsZXZhbmNlLCBib29sZWFuIHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZSkgewotCQlzdXBlcihyZXBsYWNlbWVudFN0cmluZywgcmVwbGFjZW1lbnRPZmZzZXQsIHJlcGxhY2VtZW50TGVuZ3RoLCBjdXJzb3JQb3NpdGlvbiwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIGNvbnRleHRJbmZvcm1hdGlvbiwgYWRkaXRpb25hbFByb3Bvc2FsSW5mbywgcmVsZXZhbmNlLCB1cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGUpOwotCQlzZXRJbXBvcnREZWNsYXJhdGlvbihpbXBvcnREZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIEF1dG9JbXBvcnRQcm9wb3NhbChTdHJpbmcgaW1wb3J0RGVjbGFyYXRpb24sIElJbXBvcnRDb250YWluZXIgaW1wb3J0Q29udGFpbmVyICxTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIGludCByZXBsYWNlbWVudE9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBpbnQgY3Vyc29yUG9zaXRpb24sIEltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZywgSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24sIFN0cmluZyBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCBpbnQgcmVsZXZhbmNlLCBib29sZWFuIHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZSkgewotCQl0aGlzKGltcG9ydERlY2xhcmF0aW9uLCByZXBsYWNlbWVudFN0cmluZywgcmVwbGFjZW1lbnRPZmZzZXQsIHJlcGxhY2VtZW50TGVuZ3RoLCBjdXJzb3JQb3NpdGlvbiwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIGNvbnRleHRJbmZvcm1hdGlvbiwgYWRkaXRpb25hbFByb3Bvc2FsSW5mbywgcmVsZXZhbmNlLCB1cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGUpOwotCQlmSW1wb3J0Q29udGFpbmVyID0gaW1wb3J0Q29udGFpbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCXN1cGVyLmFwcGx5KHZpZXdlciwgdHJpZ2dlciwgc3RhdGVNYXNrLCBvZmZzZXQpOwotCQkvLyBpZiB0aGUgaW1wb3J0IGRvZXNuJ3QgZXhpc3QsIGFkZCBpdAotCQlTdHJpbmcgaW1wb3J0RGVjbCA9IGdldEltcG9ydERlY2xhcmF0aW9uKCkucmVwbGFjZUFsbCgiOyIsICIiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWlmIChmSW1wb3J0Q29udGFpbmVyID09IG51bGwgfHwgIShmSW1wb3J0Q29udGFpbmVyLmdldEltcG9ydChpbXBvcnREZWNsKS5leGlzdHMoKSB8fCBpc0ltcG9ydFBhZ2VEaXJlY3RpdmUodmlld2VyLCBvZmZzZXQpKSkKLQkJCWFkZEltcG9ydERlY2xhcmF0aW9uKHZpZXdlcik7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0ltcG9ydFBhZ2VEaXJlY3RpdmUoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KXsKLQkJTm9kZSBub2RlID0gKE5vZGUpIENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodmlld2VyLCBvZmZzZXQpOwotCQkKLQkJd2hpbGUgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSkgewotCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfUEFHRSkpewotCQkJTmFtZWROb2RlTWFwIG5vZGVNYXAgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWlmIChub2RlTWFwICE9IG51bGwpCi0JCQkJcmV0dXJuIG5vZGVNYXAuZ2V0TmFtZWRJdGVtKEpTUDIwVExETmFtZXMuSU1QT1JUKSAhPSBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2UgOwotCX0KLQkvKioKLQkgKiBhZGRzIHRoZSBpbXBvcnQgZGVjbGFyYXRpb24gdG8gdGhlIGRvY3VtZW50IGluIHRoZSB2aWV3ZXIgaW4gdGhlIGFwcHJvcHJpYXRlIHBvc2l0aW9uCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRJbXBvcnREZWNsYXJhdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQkJSURvY3VtZW50IGRvYyA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQkKLQkJLy8gY2FsY3VsYXRlIG9uY2UgYW5kIHBhc3MgYWxvbmcKLQkJYm9vbGVhbiBpc1htbCA9IGlzWG1sRm9ybWF0KGRvYyk7Ci0JCQotCQlpbnQgaW5zZXJ0UG9zaXRpb24gPSBnZXRJbnNlcnRQb3NpdGlvbihkb2MsIGlzWG1sKTsKLQkJU3RyaW5nIGluc2VydFRleHQgPSBjcmVhdGVJbXBvcnREZWNsYXJhdGlvbihkb2MsIGlzWG1sKTsKLQkJSW5zZXJ0RWRpdCBpbnNlcnQgPSBuZXcgSW5zZXJ0RWRpdChpbnNlcnRQb3NpdGlvbiwgaW5zZXJ0VGV4dCk7Ci0JCXRyeSB7Ci0JCQlpbnNlcnQuYXBwbHkoZG9jKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIGN1cnNvciBwb3NpdGlvbiBhZnRlciBpcyBjb3JyZWN0Ci0JCXNldEN1cnNvclBvc2l0aW9uKGdldEN1cnNvclBvc2l0aW9uKCkgKyBpbnNlcnRUZXh0Lmxlbmd0aCgpKTsKLQl9Ci0JCi0gCXByaXZhdGUgTm9kZSBnZXRJbnNlcnROb2RlKElET01Eb2N1bWVudCBkb2N1bWVudE5vZGUpIHsKLQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IGRvY3VtZW50Tm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoY2hpbGROb2Rlcy5pdGVtKGkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJcmV0dXJuIGNoaWxkTm9kZXMuaXRlbShpKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnROb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGRvYwotCSAqIEBwYXJhbSBpc1htbAotCSAqIEByZXR1cm4gcG9zaXRpb24gYWZ0ZXIgPGpzcDpyb290PiBpZiB4bWwsIG90aGVyd2lzZSByaWdodCBiZWZvcmUgdGhlIGRvY3VtZW50IGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIGludCBnZXRJbnNlcnRQb3NpdGlvbihJRG9jdW1lbnQgZG9jLCBib29sZWFuIGlzWG1sKSB7Ci0JCWludCBwb3MgPSAwOwotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jKTsKLQkJdHJ5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCWlmIChzTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQkJSURPTURvY3VtZW50IGRvY3VtZW50Tm9kZSA9ICgoSURPTU1vZGVsKSBzTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJCS8qCi0JCQkJCSAqIGRvY3VtZW50IGVsZW1lbnQgbXVzdCBiZSBzb2xlIEVsZW1lbnQgY2hpbGQgb2YgRG9jdW1lbnQKLQkJCQkJICogdG8gcmVtYWluIHZhbGlkCi0JCQkJCSAqLwotCQkJCQlOb2RlIHRhcmdldEVsZW1lbnQgPSBudWxsOwotCQkJCQlpZiAoaXNYbWwpIHsKLQkJCQkJCXRhcmdldEVsZW1lbnQgPSBkb2N1bWVudE5vZGUuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHRhcmdldEVsZW1lbnQgPT0gbnVsbCkKLQkJCQkJCXRhcmdldEVsZW1lbnQgPSBnZXRJbnNlcnROb2RlKGRvY3VtZW50Tm9kZSk7Ci0JCQkJCWlmICh0YXJnZXRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSAoKElET01Ob2RlKSB0YXJnZXRFbGVtZW50KS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQkJaWYgKGlzWG1sKSB7Ci0JCQkJCQkJLyoKLQkJCQkJCQkgKiBkb2N1bWVudCBFbGVtZW50IG11c3QgYmUgc29sZSBFbGVtZW50IGNoaWxkIG9mCi0JCQkJCQkJICogRG9jdW1lbnQgdG8gcmVtYWluIHZhbGlkLCBzbyBpbnNlcnQgYWZ0ZXIKLQkJCQkJCQkgKi8KLQkJCQkJCQlwb3MgPSBzZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQl3aGlsZSAocG9zIDwgZG9jLmdldExlbmd0aCgpICYmIChkb2MuZ2V0Q2hhcihwb3MpID09ICdccicgfHwgZG9jLmdldENoYXIocG9zKSA9PSAnXG4nKSkgewotCQkJCQkJCQkJcG9zKys7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJLy8gbm90IGltcG9ydGFudCwgdXNlIHBvcyBhcyBkZXRlcm1pbmVkIGVhcmxpZXIKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBpbnNlcnQgYmVmb3JlIHRhcmdldCBlbGVtZW50Ci0JCQkJCQkJcG9zID0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXBvcyA9IDA7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiBwb3M7Ci0JfQotCQotCS8vIEdlbnVpdGVjIGJ1ZyAjNjIyNywKLQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzMzAzCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3VzdG9tVGFnRG9jdW1lbnQoSURvY3VtZW50IGRvYykgewotCQlib29sZWFuIGlzVGFnID0gZmFsc2U7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2MpOwotCQl0cnkgewotCQkJaWYgKHNNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCVN0cmluZyBjb250ZW50VHlwZSA9ICgoSURPTU1vZGVsKSBzTW9kZWwpLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpOwotCQkJCWlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkJCUlDb250ZW50VHlwZSBtb2RlbENUID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGUpOwotCQkJCQlJQ29udGVudFR5cGUgdGFnQ1QgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQVEFHKTsKLQkJCQkJaWYgKG1vZGVsQ1QgIT0gbnVsbCAmJiB0YWdDVCAhPSBudWxsKSB7Ci0JCQkJCQlpc1RhZyA9IG1vZGVsQ1QuaXNLaW5kT2YodGFnQ1QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gaXNUYWc7Ci0JfQotCQkgCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGRvYwotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGRvY3VtZW50IGlzIHhtbC1qc3Agc3ludGF4LCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNYbWxGb3JtYXQoSURvY3VtZW50IGRvYykgewotCQlib29sZWFuIGlzWG1sID0gZmFsc2U7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2MpOwotCQl0cnkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaWYgKCFpc1htbCkgewotCQkJCQlpZiAoc01vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnROb2RlID0gKChJRE9NTW9kZWwpIHNNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJCUVsZW1lbnQgZG9jRWxlbWVudCA9IGRvY3VtZW50Tm9kZS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCQkJCWlzWG1sID0gZG9jRWxlbWVudCAhPSBudWxsICYmICgoZG9jRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFscygianNwOnJvb3QiKSkgfHwgZG9jRWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCJ4bWxuczpqc3AiKSAhPSBudWxsIHx8ICgoKChJRE9NTm9kZSkgZG9jRWxlbWVudCkuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsICYmICgoSURPTU5vZGUpIGRvY0VsZW1lbnQpLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIGlzWG1sOwotCX0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICogQHBhcmFtIGlzWG1sCi0JICogQHJldHVybiBhcHByb3ByaWF0ZSBpbXBvcnQgZGVjbGFyYXRpb24gc3RyaW5nIGRlcGVuZGluZyBpZiBkb2N1bWVudCBpcyB4bWwgb3Igbm90Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlSW1wb3J0RGVjbGFyYXRpb24oSURvY3VtZW50IGRvYywgYm9vbGVhbiBpc1htbCkgewotCQlTdHJpbmcgZGVsaW0gPSAoZG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgPyAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvYykuZ2V0TGluZURlbGltaXRlcigpIDogVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihkb2MpOwotCQlib29sZWFuIGlzQ3VzdG9tVGFnID0gaXNDdXN0b21UYWdEb2N1bWVudChkb2MpOwotCQlmaW5hbCBTdHJpbmcgb3BlbmluZzsKLQkJZmluYWwgU3RyaW5nIGNsb3Npbmc7Ci0JCWlmIChpc0N1c3RvbVRhZykgewotCQkJaWYgKGlzWG1sKSB7Ci0JCQkJb3BlbmluZyA9ICI8anNwOmRpcmVjdGl2ZS50YWcgaW1wb3J0PVwiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWNsb3NpbmcgPSAiXCIvPiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCW9wZW5pbmcgPSAiPCVAdGFnIGltcG9ydD1cIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQljbG9zaW5nID0gIlwiJT4iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoaXNYbWwpIHsKLQkJCQlvcGVuaW5nID0gIjxqc3A6ZGlyZWN0aXZlLnBhZ2UgaW1wb3J0PVwiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWNsb3NpbmcgPSAiXCIvPiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCW9wZW5pbmcgPSAiPCVAcGFnZSBpbXBvcnQ9XCIiOyAvLyROT04tTkxTLTEkCi0JCQkJY2xvc2luZyA9ICJcIiU+IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBvcGVuaW5nICsgZ2V0SW1wb3J0RGVjbGFyYXRpb24oKSArIGNsb3NpbmcgKyBkZWxpbTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEltcG9ydERlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gZkltcG9ydERlY2xhcmF0aW9uOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRJbXBvcnREZWNsYXJhdGlvbihTdHJpbmcgaW1wb3J0RGVjbGFyYXRpb24pIHsKLQkJZkltcG9ydERlY2xhcmF0aW9uID0gaW1wb3J0RGVjbGFyYXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQmVhbkluZm9Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQmVhbkluZm9Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MThiZDIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0JlYW5JbmZvUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIE5hdmlnYXRlcyB0aGUgSUphdmFQcm9qZWN0IGNsYXNzcGF0aCAoaW5jbC4gc291cmNlKSBvbiBhIGdpdmVuIHJlc291cmNlIGFuZCBpbmZlcnMgYmVhbiBwcm9wZXJ0aWVzCi0gKiBnaXZlbiBhIGZ1bGx5IHF1YWxpZmllZCBiZWFubmFtZS4gQmVhbiBwcm9wZXJ0aWVzIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmc6Ci0gKiA8Y29kZT5nZXRSdW50aW1lUHJvcGVydGllcyhJUmVzb3VyY2UgYmFzZVJlc291cmNlLCBTdHJpbmcgdHlwZU5hbWUpPC9jb2RlPgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJlYW5JbmZvUHJvdmlkZXIgaW1wbGVtZW50cyBJQmVhbkluZm9Qcm92aWRlciB7Ci0KLQlwdWJsaWMgY2xhc3MgSmF2YVByb3BlcnR5RGVzY3JpcHRvciBpbXBsZW1lbnRzIElKYXZhUHJvcGVydHlEZXNjcmlwdG9yIHsKLQkJU3RyaW5nIGZUeXBlID0gbnVsbDsKLQkJU3RyaW5nIGZOYW1lID0gbnVsbDsKLQkJYm9vbGVhbiBmUmVhZGFibGUgPSB0cnVlOwotCQlib29sZWFuIGZXcml0YWJsZSA9IHRydWU7Ci0KLQkJcHVibGljIEphdmFQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBib29sZWFuIHJlYWRhYmxlLCBib29sZWFuIHdyaXRhYmxlKSB7Ci0JCQlmTmFtZSA9IG5hbWU7Ci0JCQlmVHlwZSA9IHR5cGU7Ci0JCQlmUmVhZGFibGUgPSByZWFkYWJsZTsKLQkJCWZXcml0YWJsZSA9IHdyaXRhYmxlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWNsYXJlZFR5cGUoKSB7Ci0JCQlyZXR1cm4gZlR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQkJcmV0dXJuIGZOYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIGZOYW1lOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2V0UmVhZGFibGUoKSB7Ci0JCQlyZXR1cm4gZlJlYWRhYmxlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2V0V3JpdGVhYmxlKCkgewotCQkJcmV0dXJuIGZXcml0YWJsZTsKLQkJfQotCX0KLQotCS8vIGxvb2tzIHVwIGVuY29kZWQgdHlwZSAoc2VlIENsYXNzLmdldE5hbWUpLCBhbmQgZ2l2ZXMgeW91IGEgZGlzcGxheWFibGUgc3RyaW5nCi0JcHJpdmF0ZSBIYXNoTWFwIGZFbmNvZGVkVHlwZU1hcCA9IG51bGw7Ci0JLy8gdG8gYXZvaWQgcmVwZWF0IHByb3BlcnRpZXMgZnJvbSBzaG93aW5nIHVwCi0JcHJpdmF0ZSBIYXNoU2V0IGZSZXBlYXRNZXRob2RzID0gbnVsbDsKLQotCXB1YmxpYyBCZWFuSW5mb1Byb3ZpZGVyKCkgewotCQlmUmVwZWF0TWV0aG9kcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5mZXJyZWQgcHJvcGVydGllcyBvZiBhIGJlYW4gYmFzZWQgb24gdGhlIHByb2plY3QgZnJvbSB0aGUgYmFzZVJlc291cmNlLAotCSAqIGFuZCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGJlYW4uCi0JICogCi0JICogQHBhcmFtIGJhc2VSZXNvdXJjZSB0aGUgYmFzZSByZXNvdXJjZSB3aGVyZSB0aGUgYmVhbiBpcyBiZWluZyB1c2VkCi0JICogQHBhcmFtIHR5cGVOYW1lIHRoZSA8aT5mdWxseSBxdWFsaWZpZWQ8L2k+IHR5cGUgbmFtZSAoZWcuIGphdmF4LnN3aW5nLkpCdXR0b24pIG9mIHRoZSBiZWFuCi0JICovCi0JcHVibGljIElKYXZhUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UnVudGltZVByb3BlcnRpZXMoSVJlc291cmNlIGJhc2VSZXNvdXJjZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShiYXNlUmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJUXVhbGlmaWVkTmFtZSB0eXBlUXVhbGlmaWVkTmFtZSA9IGdldFR5cGVRdWFsaWZpZWROYW1lKHR5cGVOYW1lKTsKLQkJTGlzdCBnZXRNZXRob2RSZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGlzTWV0aG9kUmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBzZXRNZXRob2RSZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGRlc2NyaXB0b3JSZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJSVR5cGUgdHlwZSA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKHR5cGVRdWFsaWZpZWROYW1lLmdldFF1YWxpZmllcigpICsgIi4iICsgdHlwZVF1YWxpZmllZE5hbWUuZ2V0TG9jYWxOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkvLyB0eXBlIG11c3QgZXhpc3QKLQkJCWlmKHR5cGUgIT0gbnVsbCkgewotCQkJCUlUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSA9IHR5cGUubmV3VHlwZUhpZXJhcmNoeShudWxsKTsKLQkJCQlJVHlwZVtdIHN1cGVycyA9IGhpZXJhcmNoeS5nZXRBbGxTdXBlcmNsYXNzZXModHlwZSk7Ci0JCi0JCQkJSU1ldGhvZFtdIG1ldGhvZHMgPSB0eXBlLmdldE1ldGhvZHMoKTsKLQkJCQkvLyBpdGVyYXRlIHRoZSBiZWFuJ3MgbWV0aG9kcwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykKLQkJCQkJYWNjZXB0TWV0aG9kKGdldE1ldGhvZFJlc3VsdHMsIGlzTWV0aG9kUmVzdWx0cywgc2V0TWV0aG9kUmVzdWx0cywgbWV0aG9kc1tpXSk7Ci0JCQkJLy8gdGhlIGJlYW4gaGllcmFyY2h5J3MgbWV0aG9kcwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCW1ldGhvZHMgPSBzdXBlcnNbaV0uZ2V0TWV0aG9kcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1ldGhvZHMubGVuZ3RoOyBqKyspCi0JCQkJCQlhY2NlcHRNZXRob2QoZ2V0TWV0aG9kUmVzdWx0cywgaXNNZXRob2RSZXN1bHRzLCBzZXRNZXRob2RSZXN1bHRzLCBtZXRob2RzW2pdKTsKLQkJCQl9Ci0JCQkJYWRhcHRNZXRob2RzVG9Qcm9wZXJ0eURlc2NyaXB0b3JzKGdldE1ldGhvZFJlc3VsdHMsIGlzTWV0aG9kUmVzdWx0cywgc2V0TWV0aG9kUmVzdWx0cywgZGVzY3JpcHRvclJlc3VsdHMpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1leCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiUHJvYmxlbSBuYXZpZ2F0aW5nIEphdmFQcm9qZWN0IGluIEJlYW5JbmZvUHJvdmlkZXIiLCBqbWV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSUphdmFQcm9wZXJ0eURlc2NyaXB0b3JbXSBmaW5hbFJlc3VsdHMgPSBuZXcgSUphdmFQcm9wZXJ0eURlc2NyaXB0b3JbZGVzY3JpcHRvclJlc3VsdHMuc2l6ZSgpXTsKLQkJU3lzdGVtLmFycmF5Y29weShkZXNjcmlwdG9yUmVzdWx0cy50b0FycmF5KCksIDAsIGZpbmFsUmVzdWx0cywgMCwgZGVzY3JpcHRvclJlc3VsdHMuc2l6ZSgpKTsKLQkJcmV0dXJuIGZpbmFsUmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmcm9tIG1ldGhvZCBkZWNsYXJhdGlvbiBsaXN0cywgY3JlYXRlcyBhbmQgZmlsbHMgYSBsaXN0IG9mIEphdmFQcm9wZXJ0eURlc2NyaXB0b3JzLgotCSAqIEBwYXJhbSBnZXRNZXRob2RzCi0JICogQHBhcmFtIGlzTWV0aG9kcwotCSAqIEBwYXJhbSBzZXRNZXRob2RzCi0JICogQHBhcmFtIGRlc2NyaXB0b3JSZXN1bHRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkYXB0TWV0aG9kc1RvUHJvcGVydHlEZXNjcmlwdG9ycyhMaXN0IGdldE1ldGhvZHMsIExpc3QgaXNNZXRob2RzLCBMaXN0IHNldE1ldGhvZHMsIExpc3QgZGVzY3JpcHRvcnMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlMaXN0IHJlYWRhYmxlID0gbmV3IEFycmF5TGlzdCgpOwotCQlIYXNoTWFwIHR5cGVzID0gbmV3IEhhc2hNYXAoKTsKLQotCQkvLyBpdGVyYXRlIHRocm91Z2ggZ2V0KiBhbmQgaXMqIG1ldGhvZHMsIHVwZGF0aW5nICdyZWFkYWJsZScgbGlzdCBhbmQgJ3R5cGVzJyBtYXAKLQkJZmlsdGVyR2V0TWV0aG9kcyhnZXRNZXRob2RzLCByZWFkYWJsZSwgdHlwZXMpOwotCQlmaWx0ZXJJc01ldGhvZHMoaXNNZXRob2RzLCByZWFkYWJsZSwgdHlwZXMpOwotCi0JCS8vIGl0ZXJhdGUgc2V0KiBtZXRob2RzLCBjaGVja2luZyBvdmVybGFwIHcvIHJlYWRhYmxlCi0JCUl0ZXJhdG9yIGl0ID0gc2V0TWV0aG9kcy5pdGVyYXRvcigpOwotCQlJTWV0aG9kIHRlbXAgPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0eXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nW10gZW5jb2RlZFBhcmFtcyA9IG51bGw7Ci0JCVN0cmluZyByZXR1cm5UeXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHBhcmFtMCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJdGVtcCA9IChJTWV0aG9kKSBpdC5uZXh0KCk7Ci0JCQluYW1lID0gY3JlYXRlUHJvcGVydHlOYW1lRnJvbU1ldGhvZCh0ZW1wKTsKLQkJCS8vIGludmFsaWQgbmFtaW5nIGNvbnZlbnRpb24KLQkJCWlmIChuYW1lID09IG51bGwpCi0JCQkJY29udGludWU7Ci0KLQkJCXJldHVyblR5cGUgPSBnZXREZWNvZGVkVHlwZU5hbWUodGVtcC5nZXRSZXR1cm5UeXBlKCkpOwotCQkJLy8gc2V0dGVyIHNob3VsZCBoYXZlIG5vIHJldHVybiB0eXBlCi0JCQlpZiAoIXJldHVyblR5cGUuZXF1YWxzKCJ2b2lkIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQotCQkJLy8gbmVlZCB0byBnZXQgdHlwZSBmcm9tIHBhcmFtZXRlcgotCQkJZW5jb2RlZFBhcmFtcyA9IHRlbXAuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCWlmIChlbmNvZGVkUGFyYW1zICE9IG51bGwgJiYgZW5jb2RlZFBhcmFtcy5sZW5ndGggPiAwKSB7Ci0JCQkJaWYgKGVuY29kZWRQYXJhbXMubGVuZ3RoID4gMSkgewotCQkJCQkvLyBtdWx0aXBsZSBwYXJhbXMKLQkJCQkJcGFyYW0wID0gZ2V0RGVjb2RlZFR5cGVOYW1lKGVuY29kZWRQYXJhbXNbMF0pOwotCQkJCQlpZiAoIXBhcmFtMC5lcXVhbHMoImludCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBub3QgYSB2YWxpZCBpbmRleGVkIHByb3BlcnR5Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJCi0JCQkJCXR5cGUgPSBnZXREZWNvZGVkVHlwZU5hbWUoZW5jb2RlZFBhcmFtc1sxXSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBvbmUgcGFyYW0sIHJlZ3VsYXIgc2V0dGVyCi0JCQkJCWlmIChpc0FycmF5KGVuY29kZWRQYXJhbXNbMF0pKQotCQkJCQkJdHlwZSA9IGdldERlY29kZWRUeXBlTmFtZShlbmNvZGVkUGFyYW1zWzBdKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZWFkYWJsZS5jb250YWlucyhuYW1lKSkgewotCQkJCS8vIHdyaXRhYmxlIGFuZCByZWFkYWJsZQotCQkJCWlmICghZlJlcGVhdE1ldGhvZHMuY29udGFpbnMobmFtZSkpIHsKLQkJCQkJZGVzY3JpcHRvcnMuYWRkKG5ldyBKYXZhUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIChTdHJpbmcpIHR5cGVzLmdldChuYW1lKSwgdHJ1ZSwgdHJ1ZSkpOwotCQkJCQlyZWFkYWJsZS5yZW1vdmUobmFtZSk7Ci0JCQkJCWZSZXBlYXRNZXRob2RzLmFkZChuYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3YXNuJ3QgcmVhZGFibGUsIGp1c3Qgd3JpdGFibGUKLQkJCQlTdHJpbmdbXSBwYXJhbXMgPSB0ZW1wLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCQkJLy8gY2FuJ3QgYmUgc2V0UHJvcGVydHkgaWYgbm8gcGFyYW1ldGVycwotCQkJCWlmICghKHBhcmFtcy5sZW5ndGggPiAwKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKCFmUmVwZWF0TWV0aG9kcy5jb250YWlucyhuYW1lKSkgewotCQkJCQl0eXBlID0gZ2V0RGVjb2RlZFR5cGVOYW1lKHBhcmFtc1swXSk7Ci0JCQkJCWRlc2NyaXB0b3JzLmFkZChuZXcgSmF2YVByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCB0eXBlLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCQlmUmVwZWF0TWV0aG9kcy5hZGQobmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGFkZCBsZWZ0b3ZlciBmcm9tIHJlYWRhYmxlLCBnZXQqIGFuZCBpcyogbWV0aG9kcyAocmVhZGFibGUgPSB0cnVlLCB3cml0YWJsZSA9IGZhbHNlKQotCQlpdCA9IHJlYWRhYmxlLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCW5hbWUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlpZiAoIWZSZXBlYXRNZXRob2RzLmNvbnRhaW5zKG5hbWUpKSB7Ci0JCQkJZGVzY3JpcHRvcnMuYWRkKG5ldyBKYXZhUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIChTdHJpbmcpIHR5cGVzLmdldChuYW1lKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQlmUmVwZWF0TWV0aG9kcy5hZGQobmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsdGVyR2V0TWV0aG9kcyhMaXN0IGdldE1ldGhvZHMsIExpc3QgcmVhZGFibGUsIEhhc2hNYXAgdHlwZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJTWV0aG9kIHRlbXA7Ci0JCVN0cmluZyBuYW1lOwotCQlTdHJpbmcgZW5jb2RlZFJldHVyblR5cGU7Ci0JCVN0cmluZyByZXR1cm5UeXBlOwotCQlJdGVyYXRvciBpdCA9IGdldE1ldGhvZHMuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gZW5jb2RlZFBhcmFtczsKLQkJU3RyaW5nIHBhcmFtVHlwZTsKLQkJLy8gaXRlcmF0ZSBnZXQqIG1ldGhvZHMKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJdGVtcCA9IChJTWV0aG9kKSBpdC5uZXh0KCk7Ci0JCQluYW1lID0gY3JlYXRlUHJvcGVydHlOYW1lRnJvbU1ldGhvZCh0ZW1wKTsKLQkJCS8vIGludmFsaWQgYmVhbiBuYW1pbmcgY29udmVudGlvbgotCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQotCQkJZW5jb2RlZFJldHVyblR5cGUgPSB0ZW1wLmdldFJldHVyblR5cGUoKTsKLQkJCXJldHVyblR5cGUgPSBnZXREZWNvZGVkVHlwZU5hbWUoZW5jb2RlZFJldHVyblR5cGUpOwotCi0JCQkvLyAgY2FuJ3QgZ2V0IGJlIGEgZ2V0UHJvcGVydHkgaWYgcmV0dXJucyB2b2lkCi0JCQlpZiAocmV0dXJuVHlwZS5lcXVhbHMoInZvaWQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCi0JCQkvLyBjaGVjayBwYXJhbXMgaW4gY2FzZSBpdCdzIGluZGV4ZWQgcHJvcGV0eQotCQkJZW5jb2RlZFBhcmFtcyA9IHRlbXAuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCWlmIChlbmNvZGVkUGFyYW1zICE9IG51bGwgJiYgZW5jb2RlZFBhcmFtcy5sZW5ndGggPT0gMSkgewotCQkJCXBhcmFtVHlwZSA9IGdldERlY29kZWRUeXBlTmFtZShlbmNvZGVkUGFyYW1zWzBdKTsKLQkJCQkvLyBzeW50YXggaXMgPiBUeXBlIGdldHRlcihpbnQpOwotCQkJCWlmICghcGFyYW1UeXBlLmVxdWFscygiaW50IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkvL2l0J3Mgbm90IGFuIGluZGV4ZWQgcHJvcGVydHkKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8vIGl0IGlzIGluZGV4ZWQsIHByb3AgdHlwZSBpcyBhbiBBUlJBWQotCQkJCXJldHVyblR5cGUgKz0gIltdIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlyZWFkYWJsZS5hZGQobmFtZSk7Ci0JCQl0eXBlcy5wdXQobmFtZSwgcmV0dXJuVHlwZSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBmaWx0ZXJJc01ldGhvZHMoTGlzdCBpc01ldGhvZFJlc3VsdHMsIExpc3QgcmVhZGFibGUsIEhhc2hNYXAgdHlwZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJTWV0aG9kIHRlbXA7Ci0JCVN0cmluZyBuYW1lOwotCQlTdHJpbmcgZW5jb2RlZFJldHVyblR5cGU7Ci0JCVN0cmluZyByZXR1cm5UeXBlOwotCQlTdHJpbmdbXSBlbmNvZGVkUGFyYW1zOwotCQlTdHJpbmcgcGFyYW1UeXBlOwotCQkvLyBpdGVyYXRlIGlzKiBtZXRob2RzCi0JCUl0ZXJhdG9yIGl0ID0gaXNNZXRob2RSZXN1bHRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXRlbXAgPSAoSU1ldGhvZCkgaXQubmV4dCgpOwotCQkJbmFtZSA9IGNyZWF0ZVByb3BlcnR5TmFtZUZyb21NZXRob2QodGVtcCk7Ci0JCQkvLyBpbnZhbGlkIGJlYW4gbmFtaW5nIGNvbnZlbnRpb24KLQkJCWlmIChuYW1lID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQllbmNvZGVkUmV0dXJuVHlwZSA9IHRlbXAuZ2V0UmV0dXJuVHlwZSgpOwotCQkJcmV0dXJuVHlwZSA9IGdldERlY29kZWRUeXBlTmFtZShlbmNvZGVkUmV0dXJuVHlwZSk7Ci0KLQkJCS8vIGlzUHJvcGVydHkgb25seSB2YWxpZCBmb3IgYm9vbGVhbgotCQkJaWYgKCFyZXR1cm5UeXBlLmVxdWFscygiYm9vbGVhbiIpKSAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0KLQkJCS8vIGNoZWNrIHBhcmFtcyBpbiBjYXNlIGl0J3MgaW5kZXhlZCBwcm9wZXR5Ci0JCQllbmNvZGVkUGFyYW1zID0gdGVtcC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQkJaWYgKGVuY29kZWRQYXJhbXMgIT0gbnVsbCAmJiBlbmNvZGVkUGFyYW1zLmxlbmd0aCA9PSAxKSB7Ci0JCQkJcGFyYW1UeXBlID0gZ2V0RGVjb2RlZFR5cGVOYW1lKGVuY29kZWRQYXJhbXNbMF0pOwotCQkJCS8vIHN5bnRheCBpcyA+IFR5cGUgZ2V0dGVyKGludCk7Ci0JCQkJaWYgKCFwYXJhbVR5cGUuZXF1YWxzKCJpbnQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vaXQncyBub3QgYSB2YWxpZCBpbmRleGVkIHByb3BlcnR5Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQotCQkJcmVhZGFibGUuYWRkKG5hbWUpOwotCQkJdHlwZXMucHV0KG5hbWUsIHJldHVyblR5cGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFzcyBpbiBhIGdldCp8c2V0KnxpcyogbWV0aG9kIGFuZCBpdCB3aWxsIHJldHVybiBhbiBpbmZlcnJlZCBwcm9wZXJ0eSBuYW1lIHVzaW5nIDxjb2RlPkludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUoU3RyaW5nKTwvY29kZT4KLQkgKiBAcGFyYW0gdGVtcAotCSAqIEByZXR1cm4gYW4gaW5mZXJyZWQgcHJvcGVydHkgbmFtZSBiYXNlZCBvbiB0aGUgSU1ldGhvZCBuYW1lLCBudWxsIGlmIHRoZSBuYW1lIGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8gYmVhbiBzcGVjCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlUHJvcGVydHlOYW1lRnJvbU1ldGhvZChJTWV0aG9kIHRlbXApIHsKLQkJU3RyaW5nIG5hbWUgPSB0ZW1wLmdldEVsZW1lbnROYW1lKCk7Ci0JCWlmIChuYW1lLnN0YXJ0c1dpdGgoImlzIikpIC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKG5hbWUuc3Vic3RyaW5nKDIpKTsKLQkJZWxzZQotCQkJLy8gbXVzdCBiZSBnZXQgb3Igc2V0Ci0JCQluYW1lID0gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShuYW1lLnN1YnN0cmluZygzKSk7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWwgZmlsdGVyaW5nIG9mIG1ldGhvZHMuICBDaGVja3MgcHJlZml4IGlmIGl0J3MgdmFsaWQgbGVuZ3RoLiAgSWYgdGhlIHByZWZpeCBpcyAiZ2V0IiB0aGUgIG1ldGhvZCBuYW1lIAotCSAqIGlzIHBsYWNlZCBpbiB0aGUgZ2V0TWV0aG9kUmVzdWx0cyBMaXN0LiAgSWYgdGhlIHByZWZpeCBpcyAiaXMiLCB0aGUgbmFtZSBpcyBhZGRlZCB0byB0aGUgaXNNZXRob2RSZXN1bHRzIGxpc3QuICBJZiB0aGUKLQkgKiBwcmVmaXggaXMgInNldCIsIGl0J3MgYWRkZWQgdG8gdGhlIHNldE1ldGhvZFJlc3VsdHNMaXN0LgotCSAqIAotCSAqIEBwYXJhbSBnZXRNZXRob2RSZXN1bHRzCi0JICogQHBhcmFtIGlzTWV0aG9kUmVzdWx0cwotCSAqIEBwYXJhbSBzZXRNZXRob2RSZXN1bHRzCi0JICogQHBhcmFtIG1ldGhvZAotCSAqLwotCXByaXZhdGUgdm9pZCBhY2NlcHRNZXRob2QoTGlzdCBnZXRNZXRob2RSZXN1bHRzLCBMaXN0IGlzTWV0aG9kUmVzdWx0cywgTGlzdCBzZXRNZXRob2RSZXN1bHRzLCBJTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWlmICghZlJlcGVhdE1ldGhvZHMuY29udGFpbnMobWV0aG9kLmdldEVsZW1lbnROYW1lKCkpKSB7Ci0JCQlmUmVwZWF0TWV0aG9kcy5hZGQobWV0aG9kLmdldEVsZW1lbnROYW1lKCkpOwotCQkJaW50IGZsYWdzID0gbWV0aG9kLmdldEZsYWdzKCk7Ci0JCQlTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpOwotCQkJaWYgKEZsYWdzLmlzUHVibGljKGZsYWdzKSkgewotCQkJCWlmIChtZXRob2ROYW1lLmxlbmd0aCgpID4gMyAmJiBtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImdldCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWdldE1ldGhvZFJlc3VsdHMuYWRkKG1ldGhvZCk7Ci0JCQkJZWxzZSBpZiAobWV0aG9kTmFtZS5sZW5ndGgoKSA+IDIgJiYgbWV0aG9kTmFtZS5zdGFydHNXaXRoKCJpcyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWlzTWV0aG9kUmVzdWx0cy5hZGQobWV0aG9kKTsKLQkJCQllbHNlIGlmIChtZXRob2ROYW1lLmxlbmd0aCgpID4gMyAmJiBtZXRob2ROYW1lLnN0YXJ0c1dpdGgoInNldCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXNldE1ldGhvZFJlc3VsdHMuYWRkKG1ldGhvZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdHlwZU5hbWUKLQkgKiBAcmV0dXJuIGEgUXVhbGlmaWVkIG5hbWUgd2l0aCB0aGUgcGFja2FnZSBhcyB0aGUgcXVhbGlmaWVyLCBhbmQgY2xhc3MgbmFtZSBhcyBMb2NhbE5hbWUKLQkgKi8KLQlwcml2YXRlIFF1YWxpZmllZE5hbWUgZ2V0VHlwZVF1YWxpZmllZE5hbWUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHlwZU5hbWUsICIuIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCWludCBsZW5ndGggPSBzdC5jb3VudFRva2VucygpOwotCQlpbnQgY291bnQgPSAwOwotCQlTdHJpbmdCdWZmZXIgcm9vdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJd2hpbGUgKGNvdW50KysgPCBsZW5ndGggLSAxKSB7Ci0JCQlyb290LmFwcGVuZChzdC5uZXh0VG9rZW4oKSk7Ci0JCQlpZiAoY291bnQgPCBsZW5ndGggLSAxKQotCQkJCXJvb3QuYXBwZW5kKCcuJyk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBRdWFsaWZpZWROYW1lKHJvb3QudG9TdHJpbmcoKSwgc3QubmV4dFRva2VuKCkpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBlbmNvZGVkVHlwZU5hbWUgaXMgYW4gYXJyYXkKLQkgKiBAcGFyYW0gZW5jb2RlZFR5cGVOYW1lCi0JICogQHJldHVybiB0cnVlIGlmIGVuY29kZWRUeXBlTmFtZSBpcyBhbiBhcnJheSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0FycmF5KFN0cmluZyBlbmNvZGVkVHlwZU5hbWUpIHsKLQkJaWYgKGVuY29kZWRUeXBlTmFtZSAhPSBudWxsICYmIGVuY29kZWRUeXBlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCWlmIChlbmNvZGVkVHlwZU5hbWUuY2hhckF0KDApID09ICdbJykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVjb2RlZCAoZGlzcGxheWFibGUpIG5hbWUgZm8gdGhlIHR5cGUuCi0JICogRWl0aGVyIGEgcHJpbWl0aXZlIHR5cGUgKGludCwgbG9uZywgZmxvYXQuLi4pIE9iamVjdCAoU3RyaW5nKQotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybiBkZWNvZGVkIG5hbWUgZm9yIHRoZSBlbmNvZGVkIHN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERlY29kZWRUeXBlTmFtZShTdHJpbmcgZW5jb2RlZCkgewotCQlIYXNoTWFwIG1hcCA9IGdldEVuY29kZWRUeXBlTWFwKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIGRlY29kZWQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNoYXIgQlJBQ0tFVCA9ICdbJzsKLQkJU3RyaW5nIEJSQUNLRVRTID0gIltdIjsgLy8kTk9OLU5MUy0xJAotCQljaGFyIGlkZW50aWZpZXIgPSAnICc7Ci0JCWludCBsYXN0ID0gMDsKLQkJLy8gY291bnQgYnJhY2tldHMKLQkJd2hpbGUgKGVuY29kZWQuaW5kZXhPZihCUkFDS0VULCBsYXN0KSAhPSAtMSkgewotCQkJbGFzdCsrOwotCQl9Ci0JCWlkZW50aWZpZXIgPSBlbmNvZGVkLmNoYXJBdChsYXN0KTsKLQkJT2JqZWN0IHByaW1pdGl2ZVR5cGUgPSBtYXAuZ2V0KFN0cmluZy52YWx1ZU9mKGlkZW50aWZpZXIpKTsKLQkJLy8gTCA+IGJpbmFyeSB0eXBlIG5hbWUsIFEgPiBzb3VyY2UgdHlwZSBuYW1lCi0JCWlmIChpZGVudGlmaWVyID09ICdMJyB8fCBpZGVudGlmaWVyID09ICdRJykgewotCQkJLy8gaGFuZGxlIG9iamVjdAotCQkJU3RyaW5nIGNsYXNzbmFtZSA9IGVuY29kZWQuc3Vic3RyaW5nKGxhc3QgKyAxLCBlbmNvZGVkLmxlbmd0aCgpIC0gMSk7Ci0JCQlkZWNvZGVkLmFwcGVuZChjbGFzc25hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZVR5cGUgIT0gbnVsbCkgewotCQkJLy8gaGFuZGxlIHByaW1pdGl2ZSB0eXBlIChmcm9tIElGaWVsZC5nZXRTaWduYXR1cmUoKSkKLQkJCWRlY29kZWQuYXBwZW5kKChTdHJpbmcpIHByaW1pdGl2ZVR5cGUpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gaGFuZGxlIHByaW1pdGl2ZSB0eXBlIChmcm9tIENsYXNzLmdldE5hbWUoKSkKLQkJCWRlY29kZWQuYXBwZW5kKGVuY29kZWQpOwotCQl9Ci0JCS8vIGhhbmRsZSBhcnJheXMKLQkJaWYgKGxhc3QgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxhc3Q7IGkrKykgewotCQkJCWRlY29kZWQuYXBwZW5kKEJSQUNLRVRTKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVjb2RlZC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqCWZyb20gQ2xhc3MuZ2V0TmFtZSgpIGphdmFkb2MKLQkgKglhbHNvIHNlZSBTaWduYXR1cmUgaW4gamR0LmNvcmUgYXBpCi0JICo8cHJlPgotCSAqCQkJQiAgICAgICAgICAgIGJ5dGUKLQkgKgkJCUMgICAgICAgICAgICBjaGFyCi0JICoJCQlEICAgICAgICAgICAgZG91YmxlCi0JICoJCQlGICAgICAgICAgICAgZmxvYXQKLQkgKgkJCUkgICAgICAgICAgICBpbnQKLQkgKgkJCUogICAgICAgICAgICBsb25nCi0JICoJCQlMY2xhc3NuYW1lOyAgY2xhc3Mgb3IgaW50ZXJmYWNlCi0JICoJCQlRc291cmNlbmFtZTsgc291cmNlCi0JICoJCQlTICAgICAgICAgICAgc2hvcnQKLQkgKgkJCVogICAgICAgICAgICBib29sZWFuCi0JICoJCQlWCSAgIAkJIHZvaWQKLQkgKjwvcHJlPgotCSAqCi0JICogQHJldHVybiB0aGUgImVuY29kaW5nIGxldHRlciIgdG8gInR5cGUiIG1hcC4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0RW5jb2RlZFR5cGVNYXAoKSB7Ci0JCWlmIChmRW5jb2RlZFR5cGVNYXAgPT0gbnVsbCkgewotCQkJZkVuY29kZWRUeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZFbmNvZGVkVHlwZU1hcC5wdXQoIkIiLCAiYnl0ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZFbmNvZGVkVHlwZU1hcC5wdXQoIkMiLCAiY2hhciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZFbmNvZGVkVHlwZU1hcC5wdXQoIkQiLCAiZG91YmxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiRiIsICJmbG9hdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZFbmNvZGVkVHlwZU1hcC5wdXQoIkkiLCAiaW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiSiIsICJsb25nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiUyIsICJzaG9ydCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZFbmNvZGVkVHlwZU1hcC5wdXQoIloiLCAiYm9vbGVhbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZFbmNvZGVkVHlwZU1hcC5wdXQoIlYiLCAidm9pZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gZkVuY29kZWRUeXBlTWFwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyMTIxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DdXN0b21UZW1wbGF0ZVByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZVByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWw7Ci0KLS8qKgotICogUHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIG1ha2UgdGhlIGFkZGl0aW9uYWwgcHJvcG9zYWwgaW5mbyBpbnRvIGNvbnRlbnQKLSAqIGZpdCBmb3IgYW4gSFRNTCB2aWV3ZXIgKGJ5IGVzY2FwaW5nIGNoYXJhY3RlcnMpCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1jbGFzcyBDdXN0b21UZW1wbGF0ZVByb3Bvc2FsIGV4dGVuZHMgVGVtcGxhdGVQcm9wb3NhbCBpbXBsZW1lbnRzIElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdAotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QKLQotCXB1YmxpYyBDdXN0b21UZW1wbGF0ZVByb3Bvc2FsKFRlbXBsYXRlIHRlbXBsYXRlLCBUZW1wbGF0ZUNvbnRleHQgY29udGV4dCwgSVJlZ2lvbiByZWdpb24sIEltYWdlIGltYWdlLCBpbnQgcmVsZXZhbmNlKSB7Ci0JCXN1cGVyKHRlbXBsYXRlLCBjb250ZXh0LCByZWdpb24sIGltYWdlLCByZWxldmFuY2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gc3VwZXIuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQlyZXR1cm4gU3RyaW5nVXRpbHMuY29udmVydFRvSFRNTENvbnRlbnQoYWRkaXRpb25hbEluZm8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0lCZWFuSW5mb1Byb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JQmVhbkluZm9Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWQ5ZWY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0lCZWFuSW5mb1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCZWFuSW5mb1Byb3ZpZGVyIHsKLQlJSmF2YVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFJ1bnRpbWVQcm9wZXJ0aWVzKElSZXNvdXJjZSBiYXNlUmVzb3VyY2UsIFN0cmluZyB0eXBlTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JSmF2YVByb3BlcnR5RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSUphdmFQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzZTNmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JSmF2YVByb3BlcnR5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotLyoqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YVByb3BlcnR5RGVzY3JpcHRvciB7Ci0KLQlTdHJpbmcgZ2V0RGVjbGFyZWRUeXBlKCk7Ci0KLQlTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQlib29sZWFuIGdldFJlYWRhYmxlKCk7Ci0KLQlib29sZWFuIGdldFdyaXRlYWJsZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGVkMzg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUENvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuV29ya2luZ0NvcHlPd25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLklKU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi0vKioKLSAqIEBwbGFubmVkZm9yIDEuMAotICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyBpcyBubyBsb25nZXIgdXNlZCBsb2NhbGx5IGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZQotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29tcGxldGlvblByb2Nlc3NvciBpbXBsZW1lbnRzIElDb250ZW50QXNzaXN0UHJvY2Vzc29yLCBJUmVsZWFzYWJsZSB7Ci0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B0cmFuc2xhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkRUX0NPUkVfUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGludCBmSnNwU291cmNlUG9zaXRpb24sIGZKYXZhUG9zaXRpb247Ci0JcHJvdGVjdGVkIFN0cmluZyBmRXJyb3JNZXNzYWdlID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRWaWV3ZXIgZlZpZXdlciA9IG51bGw7Ci0JcHJpdmF0ZSBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgZlRyYW5zbGF0aW9uQWRhcHRlciA9IG51bGw7Ci0JLy8gdHJhbnNsYXRpb24gYWRhcHRlciBtYXkgYmUgc3RhbGUsIGNoZWNrIHRoZSBtb2RlbCBpZAotCXByaXZhdGUgU3RyaW5nIGZNb2RlbElkID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24KLQkgKiB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uCi0JICogd2l0aGluIHRoZSB0ZXh0IHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyIHdob3NlIGRvY3VtZW50IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgcHJvcG9zYWxzCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiAgICAgICAgICAgIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRvY3VtZW50IGZvciB3aGljaCBjb21wbGV0aW9ucyBzaG91bGQKLQkgKiAgICAgICAgICAgIGJlIGNvbXB1dGVkCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb21wbGV0aW9uIHByb3Bvc2FscyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwotCSAqICAgICAgICAgcHJvcG9zYWxzIGFyZSBwb3NzaWJsZQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgcG9zKSB7Ci0JCXJldHVybiBjb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIHBvcywgMCk7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBzYW1lIGFzIHRoZSBub3JtYWwgPGNvZGU+Y29tcHV0ZUNvbXBlbHRhaW9uUHJvcG9zYWxzPC9jb2RlPiBleGNlcHQgdGhlIGNhbGN1bGF0ZWQKLQkgKiBqYXZhIHBvc2l0aW9uIGlzIG9mZnNldCBieSB0aGUgZ2l2ZW4gZXh0cmEgb2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgd2hvc2UgZG9jdW1lbnQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBwcm9wb3NhbHMKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZG9jdW1lbnQgZm9yIHdoaWNoIGNvbXBsZXRpb25zIHNob3VsZAotCSAqICAgICAgICAgICAgYmUgY29tcHV0ZWQKLQkgKiBAcGFyYW0gamF2YVBvc2l0aW9uRXh0cmFPZmZzZXQKLQkgKiAJCQkJdGhlIGV4dHJhIG9mZnNldCBmb3IgdGhlIGphdmEgcG9zaXRpb24KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0JICogICAgICAgICBwcm9wb3NhbHMgYXJlIHBvc3NpYmxlCi0JICovCi0JcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBwb3MsIGludCBqYXZhUG9zaXRpb25FeHRyYU9mZnNldCkgewotCQlpbml0aWFsaXplKHBvcyk7Ci0KLQkJSlNQUHJvcG9zYWxDb2xsZWN0b3IgY29sbGVjdG9yID0gbnVsbDsKLQkJCi0JCUlET01Nb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRWaWV3ZXIpCi0JCQkJZlZpZXdlciA9IChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyOwotCi0JCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZlZpZXdlci5nZXREb2N1bWVudCgpKTsKLQotCQkJSURPTURvY3VtZW50IHhtbERvYyA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZlRyYW5zbGF0aW9uQWRhcHRlciA9PSBudWxsIHx8IHhtbE1vZGVsLmdldElkKCkgIT0gZk1vZGVsSWQpIHsKLQkJCQlmVHJhbnNsYXRpb25BZGFwdGVyID0gKEpTUFRyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQlmTW9kZWxJZCA9IHhtbE1vZGVsLmdldElkKCk7Ci0JCQl9Ci0JCQlpZiAoZlRyYW5zbGF0aW9uQWRhcHRlciAhPSBudWxsKSB7Ci0KLQkJCQlKU1BUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IGZUcmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24oKTsKLQkJCQlmSmF2YVBvc2l0aW9uID0gdHJhbnNsYXRpb24uZ2V0SmF2YU9mZnNldChnZXREb2N1bWVudFBvc2l0aW9uKCkpK2phdmFQb3NpdGlvbkV4dHJhT2Zmc2V0OwotCi0JCQkJaWYgKERFQlVHKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZGVidWcodHJhbnNsYXRpb24pKTsKLQotCQkJCXRyeSB7Ci0KLQkJCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRyYW5zbGF0aW9uLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCi0JCQkJCS8vIGNhbid0IGdldCBqYXZhIHByb3Bvc2FscyB3L291dCBhIGNvbXBpbGF0aW9uIHVuaXQKLQkJCQkJLy8gb3Igd2l0aG91dCBhIHZhbGlkIHBvc2l0aW9uCi0JCQkJCWlmIChjdSA9PSBudWxsIHx8IC0xID09IGZKYXZhUG9zaXRpb24pCi0JCQkJCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCQkJCQotCQkJCQljb2xsZWN0b3IgPSBnZXRQcm9wb3NhbENvbGxlY3RvcihjdSwgdHJhbnNsYXRpb24pOwotCQkJCQlzeW5jaHJvbml6ZWQgKGN1KSB7Ci0JCQkJCQljdS5jb2RlQ29tcGxldGUoZkphdmFQb3NpdGlvbiwgY29sbGVjdG9yLCAoV29ya2luZ0NvcHlPd25lcikgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY29yZUV4KSB7Ci0JCQkJCS8vIGEgcG9zc2libGUgSmF2YSBNb2RlbCBFeGNlcHRpb24gZHVlIHRvIG5vdCBiZWluZyBhIFdlYgotCQkJCQkvLyAoSmF2YSkgUHJvamVjdAotCQkJCQljb3JlRXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkvLyB0aHJvdyBvdXQgZXhjZXB0aW9ucyBvbiBjb2RlIGFzc2lzdC4KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHJlc3VsdHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJaWYoY29sbGVjdG9yICE9IG51bGwpIHsKLQkJCXJlc3VsdHMgPSBjb2xsZWN0b3IuZ2V0SlNQQ29tcGxldGlvblByb3Bvc2FscygpOwotCQkJaWYgKHJlc3VsdHMgPT0gbnVsbCB8fCByZXN1bHRzLmxlbmd0aCA8IDEpCi0JCQkJZkVycm9yTWVzc2FnZSA9IEpTUFVJTWVzc2FnZXMuSmF2YV9Db250ZW50X0Fzc2lzdF9pc19ub3RfVUlfOwotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQkKLQlwcm90ZWN0ZWQgSlNQUHJvcG9zYWxDb2xsZWN0b3IgZ2V0UHJvcG9zYWxDb2xsZWN0b3IoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24pIHsKLQkJcmV0dXJuIG5ldyBKU1BQcm9wb3NhbENvbGxlY3RvcihjdSwgdHJhbnNsYXRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBGb3IgZGVidWdnaW5nIHRyYW5zbGF0aW9uIG1hcHBpbmcgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gdHJhbnNsYXRpb24KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWJ1ZyhKU1BUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbikgewotCQlTdHJpbmdCdWZmZXIgZGVidWdTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUhhc2hNYXAganNwMmphdmEgPSB0cmFuc2xhdGlvbi5nZXRKc3AySmF2YU1hcCgpOwotCQlTdHJpbmcgamF2YVRleHQgPSB0cmFuc2xhdGlvbi5nZXRKYXZhVGV4dCgpOwotCQlTdHJpbmcganNwVGV4dCA9IGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXQoKTsKLQkJZGVidWdTdHJpbmcuYXBwZW5kKCJbanNwMkphdmFNYXAgaW4gSlNQQ29tcGxldGlvblByb2Nlc3Nvcl1cclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJZGVidWdTdHJpbmcuYXBwZW5kKCJqc3AgY3Vyc29yIHBvc2l0aW9uID4+ICIgKyBmVmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRDYXJldE9mZnNldCgpICsgIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJdGVyYXRvciBpdCA9IGpzcDJqYXZhLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXRyeSB7Ci0JCQkJUG9zaXRpb24ganNwUG9zID0gKFBvc2l0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJUG9zaXRpb24gamF2YVBvcyA9IChQb3NpdGlvbikganNwMmphdmEuZ2V0KGpzcFBvcyk7Ci0JCQkJZGVidWdTdHJpbmcuYXBwZW5kKCJqc3AgPiAiICsganNwUG9zLm9mZnNldCArICI6IiArIGpzcFBvcy5sZW5ndGggKyAiOiIgKyBqc3BUZXh0LnN1YnN0cmluZyhqc3BQb3Mub2Zmc2V0LCBqc3BQb3Mub2Zmc2V0ICsganNwUG9zLmxlbmd0aCkgKyAiOlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoImphdmEgPiAiICsgamF2YVBvcy5vZmZzZXQgKyAiOiIgKyBqYXZhUG9zLmxlbmd0aCArICI6IiArIGphdmFUZXh0LnN1YnN0cmluZyhqYXZhUG9zLm9mZnNldCwgamF2YVBvcy5vZmZzZXQgKyBqYXZhUG9zLmxlbmd0aCkgKyAiOlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBlYXQgZXhjZXB0aW9ucywgaXQncyBvbmx5IGZvciBkZWJ1ZwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWJ1Z1N0cmluZy50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgcG9zc2libGUgY29udGV4dHMgYmFzZWQgb24gdGhlIHNwZWNpZmllZAotCSAqIGxvY2F0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBjdXJzb3IKLQkgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIHRleHQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgd2hvc2UgZG9jdW1lbnQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBwb3NzaWJsZQotCSAqICAgICAgICAgICAgY29udGV4dHMKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZG9jdW1lbnQgZm9yIHdoaWNoIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKiAgICAgICAgICAgIHNob3VsZCBiZSBjb21wdXRlZAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29udGV4dCBpbmZvcm1hdGlvbiBvYmplY3RzIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICBpZiBubyBjb250ZXh0IGNvdWxkIGJlIGZvdW5kCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB3aGljaCB3aGVuIHByZXNzZWQgc2hvdWxkIGF1dG9tYXRpY2FsbHkKLQkgKiBkaXNwbGF5IGNvbnRlbnQtYXNzaXN0IHByb3Bvc2Fscy4KLQkgKiAKLQkgKiBAcmV0dXJuIHN0cmluZyBvZiBjaGFyYWN0ZXJzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXV0b1Byb3Bvc2FsSW52b2NhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB3aGljaCB3aGVuIHByZXNzZWQgc2hvdWxkIGF1dG9tYXRpY2FsbHkKLQkgKiBkaXNwbGF5IGEgY29udGVudC1hc3Npc3QgdGlwLgotCSAqIAotCSAqIEByZXR1cm4gc3RyaW5nIG9mIGNoYXJhY3RlcnMKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdXRvVGlwSW52b2NhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBjb21wbGV0aW9uIHByb3Bvc2FsIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhdXRvIGFjdGl2YXRpb24gaXMgZGVzaXJlZAotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gZW50ZXJlZCBieSB0aGUgdXNlciBzaG91bGQKLQkgKiBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgdGhlIHByZXNlbnRhdGlvbiBvZiBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBwcmVzZW50aW5nIGNvbnRleHQKLQkgKiAgICAgICAgIGluZm9ybWF0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGF1dG8gYWN0aXZhdGlvbiBpcwotCSAqICAgICAgICAgZGVzaXJlZAotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgdmFsaWRhdG9yIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gZGlzcGxheWVkIGNvbnRleHQKLQkgKiBpbmZvcm1hdGlvbiBzaG91bGQgYmUgZGlzbWlzc2VkLiBNYXkgb25seSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGUgcHJvY2Vzc29yIGlzIGluY2FwYWJsZSBvZiBjb21wdXRpbmcgY29udGV4dCBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29udGV4dCBpbmZvcm1hdGlvbiB2YWxpZGF0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqICAgICAgICAgcHJvY2Vzc29yIGlzIGluY2FwYWJsZSBvZiBjb21wdXRpbmcgY29udGV4dCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0RG9jdW1lbnRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZKc3BTb3VyY2VQb3NpdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJLy8gVE9ETzogZ2V0IGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UKLQkJLy8gaWYgKGZDb2xsZWN0b3IuZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCAmJgotCQkvLyBmQ29sbGVjdG9yLmdldEVycm9yTWVzc2FnZSgpLmxlbmd0aCgpID4gMCkKLQkJLy8gcmV0dXJuIGZDb2xsZWN0b3IuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCXJldHVybiBmRXJyb3JNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGNvZGUgYXNzaXN0IHByb2Nlc3Nvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKGludCBwb3MpIHsKLQkJaW5pdGlhbGl6ZUphdmFQbHVnaW5zKCk7Ci0KLQkJZkpzcFNvdXJjZVBvc2l0aW9uID0gcG9zOwotCQlmRXJyb3JNZXNzYWdlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBKYXZhIFBsdWdpbnMgdGhhdCB0aGUgSlNQIHByb2Nlc3NvciByZXF1aXJlcy4KLQkgKiBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0Mzc2NQotCSAqIFdlIHNob3VsZCBub3QgY2FsbCAic3RhcnQiLCBiZWNhdXNlIHRoYXQgd2lsbCBjYXVzZSB0aGF0IAotCSAqIHN0YXRlIHRvIGJlIHJlbWVtYmVyZWQsIGFuZCByZS1zdGFydGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIAotCSAqIHRoZSBuZXh0IGJvb3QgdXAgc2VxdWVuY2UuIAotCSAqIAotCSAqIElTU1VFOiB3ZSBtYXkgYmUgYWJsZSB0byBnZXQgcmlkIG9mIHRoaXMgYWxsIHRvZ2V0aGVyLCBpbiBmdXR1cmUsIAotCSAqIHNpbmNlIDk5JSB3ZSBwcm9iYWJseSBoYXZlIGFscmVhZHkgdXNlZCBzb21lIEpEVCBjbGFzcyBieSB0aGUgdGltZSAKLQkgKiB3ZSBuZWVkIEpEVCB0byBiZSBhY3RpdmUgLi4uIGJ1dCAuLi4gdGhpcyBpcyB0aGUgc2FmZXN0IGZpeCBmb3IgCi0JICogdGhpcyBwb2ludCBpbiAxLjUgc3RyZWFtLiBOZXh0IHJlbGVhc2UsIGxldCdzIGp1c3QgcmVtb3ZlIHRoaXMsIAotCSAqIHJlLWRpc2NvdmVyIHdoYXQgZXZlciBidWcgdGhpcyB3YXMgZml4aW5nIChpZiBhbnkpIGFuZCBpZiB0aGVyZSBpcyAKLQkgKiBvbmUsIHRoZW4gd2UnbGwgZWl0aGVyIHB1dCBiYWNrIGluLCBhcyBpcywgb3IgY29tZSB1cCB3aXRoIGEgCi0JICogbW9yZSBhcHByb3ByaWF0ZSBmaXguIAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKYXZhUGx1Z2lucygpIHsKLQkJdHJ5IHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoSkRUX0NPUkVfUExVR0lOX0lEKTsKLQkJCWJ1bmRsZS5sb2FkQ2xhc3MoImR1bW15Q2xhc3NOYW1lVGhhdFNob3VsZE5ldmVyRXhpc3QiKTsKLQkJfQotCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB0aGlzIGlzIHRoZSBleHBlY3RlZCByZXN1bHQsIHdlIGp1c3Qgd2FudCB0byAKLQkJCS8vIG51ZGdlIHRoZSBidW5kbGUgdG8gYmUgc3VyZSBpdHMgYWN0aXZhdGVkLiAKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWZUcmFuc2xhdGlvbkFkYXB0ZXIgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUENvbXBsZXRpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29tcGxldGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YTYwMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29tcGxldGlvblByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci0KLS8qKgotICogSW1wbGVtZW50cyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCBmb3IgdXNlIHdpdGggSlNQUHJvcG9zYWxDb2xsZWN0b3IuCi0gKgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb21wbGV0aW9uUHJvcG9zYWwgZXh0ZW5kcyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgaW1wbGVtZW50cyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCwgSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjMsIElDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb241IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBUUklHR0VSUyA9IG5ldyBjaGFyW10geyAnLicsICdbJyB9OwotCS8qCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDQ4MwotCSAqIAotCSAqIFRoaXMgaXMgYSB3cmFwcGVkIHByb3Bvc2FsIHNvIHdlIGRvbid0IG5lZWQgdG8gCi0JICogbWFrZSAic2xvdyIgY2FsbHMgdG8gdGhlIGphdmEgcHJvcG9zYWwgdXAgZnJvbnQsIG9ubHkgd2hlbiBuZWVkZWQKLQkgKiBmb3IgZXhhbXBsZSwgZ2V0QWRkaXRpb25hbEluZm8oKSByZWFkcyBleHRlcm5hbCBqYXZhZG9jLCBhbmQgaXQgbWFrZXMKLQkgKiBubyBzZW5zZQotCSAqLyAKLQlJQ29tcGxldGlvblByb3Bvc2FsIGZKYXZhQ29tcGxldGlvblByb3Bvc2FsID0gbnVsbDsKLQkKLQlwdWJsaWMgSlNQQ29tcGxldGlvblByb3Bvc2FsKFN0cmluZyByZXBsYWNlbWVudFN0cmluZywgaW50IHJlcGxhY2VtZW50T2Zmc2V0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIGludCBjdXJzb3JQb3NpdGlvbiwgSW1hZ2UgaW1hZ2UsIFN0cmluZyBkaXNwbGF5U3RyaW5nLCBJQ29udGV4dEluZm9ybWF0aW9uIGNvbnRleHRJbmZvcm1hdGlvbiwgU3RyaW5nIGFkZGl0aW9uYWxQcm9wb3NhbEluZm8sIGludCByZWxldmFuY2UsIGJvb2xlYW4gdXBkYXRlUmVwbGFjZW1lbnRMZW5ndGhPblZhbGlkYXRlKSB7Ci0JCXN1cGVyKHJlcGxhY2VtZW50U3RyaW5nLCByZXBsYWNlbWVudE9mZnNldCwgcmVwbGFjZW1lbnRMZW5ndGgsIGN1cnNvclBvc2l0aW9uLCBpbWFnZSwgZGlzcGxheVN0cmluZywgY29udGV4dEluZm9ybWF0aW9uLCBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCByZWxldmFuY2UsIHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgY3Vyc29yIHBvc2l0aW9uIGFmdGVyIGFwcGx5aW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICh0cmlnZ2VyICE9IChjaGFyKSAwICkgewotCQkJc2V0UmVwbGFjZW1lbnRTdHJpbmcoZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSArIHRyaWdnZXIpOwotCQkJc2V0Q3Vyc29yUG9zaXRpb24oZ2V0Q3Vyc29yUG9zaXRpb24oKSArIDEpOwotCQl9Ci0JCXN1cGVyLmFwcGx5KHZpZXdlciwgdHJpZ2dlciwgc3RhdGVNYXNrLCBvZmZzZXQpOwotCQkvL21vdmUgdGhlIGNhcmV0IHRvIHRoZSBlbmQgb2YgdGhlIGNoYW5nZQotCQlpbnQgZW5kT2Zmc2V0T2ZDaGFuZ2VzID0gZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKS5sZW5ndGgoKSArIGdldFJlcGxhY2VtZW50T2Zmc2V0KCk7Ci0JCXZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuc2V0Q2FyZXRPZmZzZXQoZW5kT2Zmc2V0T2ZDaGFuZ2VzKTsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbCBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKCkgewotCQlyZXR1cm4gZkphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci0JfQotCi0JZmluYWwgcHVibGljIHZvaWQgc2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbChJQ29tcGxldGlvblByb3Bvc2FsIGphdmFDb21wbGV0aW9uUHJvcG9zYWwpIHsKLQkJZkphdmFDb21wbGV0aW9uUHJvcG9zYWwgPSBqYXZhQ29tcGxldGlvblByb3Bvc2FsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCVN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IHN1cGVyLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBqYXZhUHJvcG9zYWwgPSBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKCk7Ci0JCWlmKGphdmFQcm9wb3NhbCAhPSBudWxsKQotCQkJYWRkaXRpb25hbEluZm8gPSBqYXZhUHJvcG9zYWwuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQkKLQkJcmV0dXJuIGFkZGl0aW9uYWxJbmZvOwotCX0KLQotCS8qKgotCSAqIHVzZSB0aGUgamF2YSBwcm9wb3NhbHMgaW1hZ2UgaWYgdGhlcmUgaXMgb25lIGZvciB0aGlzIHByb3Bvc2FscyBpbWFnZQotCSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlpZih0aGlzLmZKYXZhQ29tcGxldGlvblByb3Bvc2FsICE9IG51bGwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJcmV0dXJuIHRoaXMuZkphdmFDb21wbGV0aW9uUHJvcG9zYWwuZ2V0SW1hZ2UoKTsgICAgICAgICAgICAgICAgIAotCQl9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0JLyogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjUjZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCU9iamVjdCBhZGRpdGlvbmFsSW5mbyA9IHN1cGVyLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBqYXZhUHJvcG9zYWwgPSBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKCk7Ci0JCWlmIChqYXZhUHJvcG9zYWwgIT0gbnVsbCkgewotCQkJaWYgKGphdmFQcm9wb3NhbCBpbnN0YW5jZW9mIElDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb241KQotCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjA5NTEKLQkJCQlhZGRpdGlvbmFsSW5mbyA9ICgoSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjUpIGphdmFQcm9wb3NhbCkuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbyhtb25pdG9yKTsKLQkJCWVsc2UKLQkJCQlhZGRpdGlvbmFsSW5mbyA9IGphdmFQcm9wb3NhbC5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCX0KLQotCQlyZXR1cm4gYWRkaXRpb25hbEluZm87Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMyNnZXRJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKCkKLQkgKi8KLQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgZ2V0SW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpIHsKLQkJLy8gWzI3NzUzMF0gVXNlIHRoZSBqYXZhIHByb3Bvc2FsJ3MgaW5mb3JtYXRpb24gY29udHJvbCBjcmVhdG9yCi0JCUlDb21wbGV0aW9uUHJvcG9zYWwgamF2YVByb3Bvc2FsID0gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbCgpOwotCQlJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciBpbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yID0gbnVsbDsKLQotCQlpZiAoamF2YVByb3Bvc2FsIGluc3RhbmNlb2YgSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjMpCi0JCQlpbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yID0gKChJQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMykgamF2YVByb3Bvc2FsKS5nZXRJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKCk7Ci0KLQkJcmV0dXJuIGluZm9ybWF0aW9uQ29udHJvbENyZWF0b3I7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMyNnZXRQcmVmaXhDb21wbGV0aW9uU3RhcnQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFByZWZpeENvbXBsZXRpb25TdGFydChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBjb21wbGV0aW9uT2Zmc2V0KSB7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWwgamF2YVByb3Bvc2FsID0gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbCgpOwotCQlpZiAoamF2YVByb3Bvc2FsIGluc3RhbmNlb2YgSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjMpCi0JCQlyZXR1cm4gKChJQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMykgamF2YVByb3Bvc2FsKS5nZXRQcmVmaXhDb21wbGV0aW9uU3RhcnQoZG9jdW1lbnQsIGNvbXBsZXRpb25PZmZzZXQpOwotCi0JCXJldHVybiBnZXRSZXBsYWNlbWVudE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyBjaGFyW10gZ2V0VHJpZ2dlckNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBUUklHR0VSUzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24zI2dldFByZWZpeENvbXBsZXRpb25UZXh0KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LCBpbnQpCi0JICovCi0JcHVibGljIENoYXJTZXF1ZW5jZSBnZXRQcmVmaXhDb21wbGV0aW9uVGV4dChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBjb21wbGV0aW9uT2Zmc2V0KSB7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWwgamF2YVByb3Bvc2FsID0gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbCgpOwotCQlpZiAoamF2YVByb3Bvc2FsIGluc3RhbmNlb2YgSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjMpCi0JCQlyZXR1cm4gKChJQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMykgamF2YVByb3Bvc2FsKS5nZXRQcmVmaXhDb21wbGV0aW9uVGV4dChkb2N1bWVudCwgY29tcGxldGlvbk9mZnNldCk7Ci0KLQkJcmV0dXJuIGdldFJlcGxhY2VtZW50U3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMDIyYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuRGVmYXVsdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxSZWxldmFuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIDxwPkNvbXB1dGVzIEpTUCBzcGVjaWZpYyBwcm9wb3NhbHM8L3A+Ci0gKiAKLSAqIEBiYXNlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5KU1BDb250ZW50QXNzaXN0UHJvY2Vzc29yCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciBleHRlbmRzIERlZmF1bHRYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciB7Ci0JLyoqCi0JICogPHA+Q3JlYXRlIHRoZSBjb21wdXRlcjwvcD4KLQkgKi8KLQlwdWJsaWMgSlNQQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIoKSB7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb24sIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZSwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwKLQkJCUlET01Ob2RlIHRyZWVOb2RlLCBJRE9NTm9kZSB4bWxub2RlLCBDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0KLQkJLy9iZSBzdXJlIHRvIGdldCB0aGUgc3VwZXIgcHJvcG9zYWxzCi0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IHJlcXVlc3QgPSBzdXBlci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUsIGNvbnRleHQpOwotCQkKLQkJLy9jYWxjdWxhdGUgSlNQIHNwZWNpZmljIHByb3Bvc2FscwotCQlpbnQgZG9jdW1lbnRQb3NpdGlvbiA9IGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gQ29udGVudEFzc2lzdFV0aWxzLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigKLQkJCQljb250ZXh0LmdldFZpZXdlcigpLCBkb2N1bWVudFBvc2l0aW9uKTsKLQotCQlEb2N1bWVudCBkb2MgPSBudWxsOwotCQlpZiAoeG1sbm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAoeG1sbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCWRvYyA9IChEb2N1bWVudCkgeG1sbm9kZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZG9jID0geG1sbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nW10gZGlyZWN0aXZlTmFtZXMgPSB7InBhZ2UiLCAiaW5jbHVkZSIsICJ0YWdsaWIifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCi0JCUlUZXh0UmVnaW9uIHByZXZUZXh0UmVnaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWludCBvZmZzZXQgPSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKTsKLQkJCWlmKG9mZnNldCA+IDApIHsKLQkJCQlvZmZzZXQtLTsKLQkJCX0KLQkJCUlUeXBlZFJlZ2lvbiBwcmV2UmVnaW9uID0gY29udGV4dC5nZXREb2N1bWVudCgpLmdldFBhcnRpdGlvbihvZmZzZXQpOwotCQkJcHJldlRleHRSZWdpb24gPSBzZFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwcmV2UmVnaW9uLmdldE9mZnNldCgpKTsKLQkJfSBjYXRjaChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL3RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQkKLQkJLy8gc3VnZ2VzdCBKU1AgRXhwcmVzc2lvbiBpbnNpZGUgb2YgWE1MIGNvbW1lbnRzCi0JCWlmIChjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQgJiYgIWlzWE1MRm9ybWF0KGRvYykpIHsKLQkJCWlmIChyZXF1ZXN0ID09IG51bGwpIHsKLQkJCQlyZXF1ZXN0ID0gbmV3IENvbnRlbnRBc3Npc3RSZXF1ZXN0KHRyZWVOb2RlLCB4bWxub2RlLCBzZFJlZ2lvbiwKLQkJCQkJCWNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmVxdWVzdC5hZGRQcm9wb3NhbChuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCI8JT0gICU+IiwvLyROT04tTkxTLTEkCi0JCQkJCWRvY3VtZW50UG9zaXRpb24sIDAsIDQsCi0JCQkJCUpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0pTUCksCi0JCQkJCSJqc3A6ZXhwcmVzc2lvbiIsIG51bGwsICImbHQ7JT0gJSZndDsiLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9KU1ApKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJLyogaGFuZGxlIHByb3Bvc2FscyBpbiBhbmQgYXJvdW5kIEpTUF9ESVJFQ1RJVkVfT1BFTiwKLQkJICogSlNQX0RJUkVDVElWRV9DTE9TRSAocHJlY2VkZWQgYnkgT1BFTikgYW5kIEpTUF9ESVJFQ1RJVkVfTkFNRQotCQkgKi8KLQkJZWxzZSBpZiAoKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiAmJgotCQkJCWRvY3VtZW50UG9zaXRpb24gPj0gc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgfHwKLQkJCQkoY29tcGxldGlvblJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FICYmCi0JCQkJCQlkb2N1bWVudFBvc2l0aW9uIDw9IHNkUmVnaW9uLmdldFRleHRFbmRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpIHx8Ci0JCQkJKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UgJiYKLQkJCQkJCXByZXZUZXh0UmVnaW9uICE9IG51bGwgJiYKLQkJCQkJCXByZXZUZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4gJiYKLQkJCQkJCWRvY3VtZW50UG9zaXRpb24gPD0gc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkpIHsKLQotCQkJaWYgKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiB8fAotCQkJCQljb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFKSB7Ci0JCQkJCi0JCQkJaWYgKHJlcXVlc3QgPT0gbnVsbCkgewotCQkJCQlyZXF1ZXN0ID0gbmV3IENvbnRlbnRBc3Npc3RSZXF1ZXN0KHhtbG5vZGUsIHhtbG5vZGUsIHNkUmVnaW9uLAotCQkJCQkJCWNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy9kZXRlcm1pbmUgaWYgdGhlcmUgaXMgYW55IHBhcnQgb2YgYSBkaXJlY3RpdmUgbmFtZSBhbHJlYWR5IGV4aXN0aW5nCi0JCQkJSXRlcmF0b3IgcmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJCVN0cmluZyBuYW1lU3RyaW5nID0gbnVsbDsKLQkJCQlpbnQgYmVnaW4gPSByZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpOwotCQkJCWludCBsZW5ndGggPSByZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCk7Ci0JCQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCQkJbmFtZVN0cmluZyA9IHNkUmVnaW9uLmdldFRleHQocmVnaW9uKTsKLQkJCQkJCWJlZ2luID0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJCWxlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobmFtZVN0cmluZyA9PSBudWxsKSB7Ci0JCQkJCW5hbWVTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQkKLQkJCQkvKiBTdWdnZXN0IHRoZSBkaXJlY3RpdmUgbmFtZXMgdGhhdCBoYXZlIGJlZW4gZGV0ZXJtaW5lZCB0byBiZQotCQkJCSAqIGFwcHJvcHJpYXRlIGJhc2VkIG9uIGV4aXN0aW5nIGNvbnRlbnQKLQkJCQkgKi8KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdGl2ZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChkaXJlY3RpdmVOYW1lc1tpXS5zdGFydHNXaXRoKG5hbWVTdHJpbmcpIHx8IGRvY3VtZW50UG9zaXRpb24gPD0gYmVnaW4pIHsKLQkJCQkJCXJlcXVlc3QuYWRkUHJvcG9zYWwobmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChkaXJlY3RpdmVOYW1lc1tpXSwgYmVnaW4sCi0JCQkJCQkJCWxlbmd0aCwgZGlyZWN0aXZlTmFtZXNbaV0ubGVuZ3RoKCksCi0JCQkJCQkJCUpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0pTUCksCi0JCQkJCQkJCWRpcmVjdGl2ZU5hbWVzW2ldLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9KU1ApKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGJ5IGRlZmF1bHQsIEpTUF9ESVJFQ1RJVkVfTkFNRQotCQkJZWxzZSB7IAotCQkJCWlmIChyZXF1ZXN0ID09IG51bGwpIHsKLQkJCQkJcmVxdWVzdCA9IG5ldyBDb250ZW50QXNzaXN0UmVxdWVzdCh4bWxub2RlLCB4bWxub2RlLCBzZFJlZ2lvbiwKLQkJCQkJCQljb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSwKLQkJCQkJCQljb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQkJCX0KLQkJCQkvL2FkZCBlYWNoIG9mIHRoZSBkaXJlY3RpdmUgbmFtZXMgYXMgYSBwcm9wb3NhbAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0aXZlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGRpcmVjdGl2ZU5hbWVzW2ldLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcpKSB7Ci0JCQkJCQlyZXF1ZXN0LmFkZFByb3Bvc2FsKG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoCi0JCQkJCQkJCWRpcmVjdGl2ZU5hbWVzW2ldLCByZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLAotCQkJCQkJCQlyZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIGRpcmVjdGl2ZU5hbWVzW2ldLmxlbmd0aCgpLAotCQkJCQkJCQlKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKEpTUEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19KU1ApLAotCQkJCQkJCQlkaXJlY3RpdmVOYW1lc1tpXSwgbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfSlNQKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSAmJgotCQkJCWRvY3VtZW50UG9zaXRpb24gPiBzZFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKSB8fAotCQkJCShjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFICYmCi0JCQkJCQlkb2N1bWVudFBvc2l0aW9uIDw9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKSkgewotCQkJCi0JCQlpZiAocmVxdWVzdCA9PSBudWxsKSB7Ci0JCQkJcmVxdWVzdCA9IGNvbXB1dGVBdHRyaWJ1dGVQcm9wb3NhbHMobWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sCi0JCQkJCQl0cmVlTm9kZSwgeG1sbm9kZSwgY29udGV4dCk7Ci0JCQl9Ci0JCX0KLQkJLy8gbm8gbmFtZT86IDwlQCAlPgotCQllbHNlIGlmIChjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFICYmCi0JCQkJZG9jdW1lbnRQb3NpdGlvbiA8PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgewotCQkJaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotCQkJCXJlcXVlc3QgPSBjb21wdXRlQXR0cmlidXRlUHJvcG9zYWxzKG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwKLQkJCQkJCXhtbG5vZGUsIGNvbnRleHQpOwotCQkJfQotCQkJSXRlcmF0b3IgcmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJU3RyaW5nIG5hbWVTdHJpbmcgPSBudWxsOwotCQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQkJbmFtZVN0cmluZyA9IHNkUmVnaW9uLmdldFRleHQocmVnaW9uKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5hbWVTdHJpbmcgPT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0aXZlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJcmVxdWVzdC5hZGRQcm9wb3NhbChuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKAotCQkJCQkJCWRpcmVjdGl2ZU5hbWVzW2ldLCByZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLAotCQkJCQkJCXJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgZGlyZWN0aXZlTmFtZXNbaV0ubGVuZ3RoKCksCi0JCQkJCQkJSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfSlNQKSwKLQkJCQkJCQlkaXJlY3RpdmVOYW1lc1tpXSwgbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfSlNQKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlcXVlc3Q7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkRlZmF1bHRYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3QsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscygKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkKLQkJLy9ub3RoaW5nIHRvIHN1Z2dlc3QgaGVyZQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb2MgZGV0ZXJtaW5lIGlmIHRoaXMgZG9jIGlzIFhNTCBmb3JtYXQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBkb2MgaXMgb2YgWE1MIGZvcm1hdCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxGb3JtYXQoRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudCBkb2NFbGVtZW50ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQlyZXR1cm4gZG9jRWxlbWVudCAhPSBudWxsICYmICgoZG9jRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFscygianNwOnJvb3QiKSkgfHwgLy8kTk9OLU5MUy0xJAotCQkJCSgoKChJRE9NTm9kZSkgZG9jRWxlbWVudCkuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsICYmCi0JCQkJCQkoKElET01Ob2RlKSBkb2NFbGVtZW50KS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSkpIHx8Ci0JCQkJCQlkZWNsYXJlc05hbWVTcGFjZXNJblJvb3QoZG9jRWxlbWVudCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGRlY2xhcmVzTmFtZVNwYWNlc0luUm9vdChFbGVtZW50IGRvY0VsZW1lbnQpIHsKLQkJaWYgKGRvY0VsZW1lbnQuaGFzQXR0cmlidXRlKCJ4bWxuczpqc3AiKSkKLQkJCXJldHVybiB0cnVlOwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGRvY0VsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJQXR0ciBhdHRyID0gKEF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCVN0cmluZyBwcmVmaXggPSBhdHRyLmdldFByZWZpeCgpOwotCQkJaWYgKHByZWZpeCAhPSBudWxsICYmICJ4bWxucyIuZXF1YWxzKHByZWZpeCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29udGVudEFzc2lzdEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29udGVudEFzc2lzdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmJiNGM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUENvbnRlbnRBc3Npc3RIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3Q7Ci0KLS8qKgotICogPHA+SGVscGZ1bCB1dGlsaXR5IG1ldGhvZHMgZm9yIEpTUCBjb250ZW50IGFzc2lzdDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEpTUENvbnRlbnRBc3Npc3RIZWxwZXIgewotCS8qKgotCSAqIFJldHVybnMgcHJvamVjdCByZXF1ZXN0IGlzIGluCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiBAcmV0dXJuIHtAbGluayBJUmVzb3VyY2V9IHJlcHJlc2VudGluZyB0aGUgcHJvamVjdCB0aGUgZ2l2ZW4gcmVxdWVzdCB3YXMgbWFkZSBpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGdldFJlc291cmNlKENvbnRlbnRBc3Npc3RSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJU3RyaW5nIGJhc2Vsb2NhdGlvbiA9IG51bGw7Ci0KLQkJaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSByZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSByZWdpb24uZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJYmFzZWxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChiYXNlbG9jYXRpb24gIT0gbnVsbCkgewotCQkJLy8gY29waWVkIGZyb20gSlNQVHJhbnNsYXRpb25BZGFwdGVyI2dldEphdmFQcm9qZWN0Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoYmFzZWxvY2F0aW9uKTsKLQkJCUlGaWxlIGZpbGUgPSBudWxsOwotCi0JCQlpZiAoZmlsZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJZmlsZSA9IHJvb3QuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCQl9Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2UgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTJmNTU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uNTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5EZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50LlBhZ2VEaXJlY3RpdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5QYWdlRGlyZWN0aXZlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkpTUENNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5JUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5JUmVsZXZhbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50VHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNTm9kZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuUHJvcG9zYWxDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxDb250ZW50TW9kZWxHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTFJlbGV2YW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBBZGRzIHByb3Bvc2FscyBub3Qgbm9ybWFsbHkgY292ZXJlZCBieSB0aGUgZ2VuZXJpYyBiZWhhdmlvciB3aXRoIHRoZQotICogY29udGVudCBtb2RlbAotICogCi0gKiBAZGVwcmVjYXRlZCBUaGlzIGNsYXNzIGlzIG5vIGxvbmdlciB1c2VkIGxvY2FsbHkgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlCi0gKiBAc2VlIEpTUFN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQotCXByb3RlY3RlZCBpbnQgZGVwdGhDb3VudCA9IDA7Ci0JcHJvdGVjdGVkIElUZXh0Vmlld2VyIGZWaWV3ZXIgPSBudWxsOwotCXByb3RlY3RlZCBib29sZWFuIHVzZUVtYmVkZGVkUmVzdWx0cyA9IHRydWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnRlcm5hbEFkYXB0ZXIgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgSGFzaE1hcCBmTmFtZVRvUHJvY2Vzc29yTWFwID0gbnVsbDsKLQlwcm90ZWN0ZWQgSGFzaE1hcCBmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAgPSBudWxsOwotCXByaXZhdGUgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIEVNUFRZX1BST1BPU0FMX1NFVCA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCXByaXZhdGUgSlNQVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIGZUZW1wbGF0ZVByb2Nlc3NvciA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZUZW1wbGF0ZUNvbnRleHRzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZkpTQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQotCXB1YmxpYyBKU1BDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCQlzdXBlcigpOwotCQlpbml0TmFtZVRvUHJvY2Vzc29yTWFwKCk7Ci0JCWluaXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpOwotCX0KLQotCS8qKgotCSAqIGluaXQgbWFwIGZvciBleHRyYSBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3JzICh1c2VCZWFuLAotCSAqIGdldC9zZXRQcm9wZXJ0eSkuIHBvaW50cyBbdGFnbmFtZSA+IHByb2Nlc3Nvcl0KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0TmFtZVRvUHJvY2Vzc29yTWFwKCkgewotCQlmTmFtZVRvUHJvY2Vzc29yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJSlNQUHJvcGVydHlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGpzcFByb3BlcnR5Q0FQID0gbmV3IEpTUFByb3BlcnR5Q29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlmTmFtZVRvUHJvY2Vzc29yTWFwLnB1dChKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5TRVRQUk9QRVJUWSwganNwUHJvcGVydHlDQVApOwotCQlmTmFtZVRvUHJvY2Vzc29yTWFwLnB1dChKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5HRVRQUk9QRVJUWSwganNwUHJvcGVydHlDQVApOwotCQlmTmFtZVRvUHJvY2Vzc29yTWFwLnB1dChKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOLCBuZXcgSlNQVXNlQmVhbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSk7Ci0JCWZOYW1lVG9Qcm9jZXNzb3JNYXAucHV0KEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIsIG5ldyBKU1BUYWdsaWJEaXJlY3RpdmVDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkpOwotCX0KLQotCS8qKgotCSAqIGludCBtYXAgdGhhdCBwb2ludHMgW3BhcnRpdGlvbiA+IHByb2Nlc3Nvcl0uIFRoaXMgdGFrZXMgcGxhY2Ugb2YKLQkgKiBlbWJlZGRlZCBhZGFwdGVycyBmb3Igbm93LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpIHsKLQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgaHRtbFByb2Nlc3NvciA9IG5ldyBIVE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlKU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvciBqc3BKYXZhUHJvY2Vzc29yID0gbmV3IEpTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCVhNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgeG1sUHJvY2Vzc29yID0gbmV3IFhNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKTsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgamF2YXNjcmlwdFByb2Nlc3NvciA9IGdldEpTQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCi0JCWZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5wdXQoSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCwgaHRtbFByb2Nlc3Nvcik7Ci0JCWZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5wdXQoSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQsIHhtbFByb2Nlc3Nvcik7Ci0JCWZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5wdXQoSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OLCBodG1sUHJvY2Vzc29yKTsKLQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLnB1dChJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVCwganNwSmF2YVByb2Nlc3Nvcik7Ci0JCWZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5wdXQoSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSwgeG1sUHJvY2Vzc29yKTsKLQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLnB1dChJSFRNTFBhcnRpdGlvbnMuSFRNTF9DT01NRU5ULCBodG1sUHJvY2Vzc29yKTsKLQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLnB1dChJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVF9FTCwganNwSmF2YVByb2Nlc3Nvcik7Ci0JCWlmIChqYXZhc2NyaXB0UHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCWZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5wdXQoSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCwgamF2YXNjcmlwdFByb2Nlc3Nvcik7Ci0JCQlmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAucHV0KElIVE1MUGFydGl0aW9ucy5TQ1JJUFQsIGphdmFzY3JpcHRQcm9jZXNzb3IpOyAvLyBkZWZhdWx0Ci0JCX0KLQkJLy8gdG8KLQkJLy8gamF2YXNjcmlwdAotCQkvLyBmb3IKLQkJLy8gYWxsCi0JCS8vIHNjcmlwdAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbW1lbnRQcm9wb3NhbChDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRG9jVHlwZVByb3Bvc2FsKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCWlmIChDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQVEFHLmVxdWFscygoKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCkpLmdldE1vZGVsKCkuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpKSB7Ci0JCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuTkVXX1RBRyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuTkVXKTsKLQkJfQotCi0JCXN1cGVyLmFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQlhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIDApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVuZFRhZ05hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFBDREFUQVByb3Bvc2FsKFN0cmluZyBub2RlTmFtZSwgQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ0Nsb3NlUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYTUxQcm9wb3NhbChDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW5kVGFnUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5BVFRSSUJVVEUpOwotCX0KLQotCS8qKgotCSAqIGFkZCBwcm9wb3NhbHMgZm9yIHRhZ3MgaW4gYXR0cmlidXRlIHZhbHVlcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5BVFRSSUJVVEVfVkFMVUUpOwotCi0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKTsKLQotCQkvLyBhZGQgSlNQIGV4dHJhIHByb3Bvc2FscyBmcm9tIEpTUEJlYW5JbmZvQ29udGVudEFzc2lzdFByb2Nlc3NvcgotCQkvLyBKU1BQcm9wZXJ0eUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IKLQotCQkvLyAyLjEKLQkJLy8gZ2V0IHJlc3VsdHMgZnJvbSBKU1BVc2VCZWFuIGFuZCBKU1BQcm9wZXJ0eSBoZXJlCi0JCS8vIChsb29rIHVwIHByb2Nlc3NvciBpbiBhIG1hcCBiYXNlZCBvbiBub2RlIG5hbWUpCi0JCUpTUER1bW15Q29udGVudEFzc2lzdFByb2Nlc3NvciBleHRyYVByb2Nlc3NvciA9IChKU1BEdW1teUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGZOYW1lVG9Qcm9jZXNzb3JNYXAuZ2V0KG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCWlmIChleHRyYVByb2Nlc3NvciAhPSBudWxsICYmIGNvbnRlbnRBc3Npc3RSZXF1ZXN0ICE9IG51bGwpIHsKLQkJCWV4dHJhUHJvY2Vzc29yLmFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJfQotCi0JCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCUNNRG9jdW1lbnQgZG9jID0gbXEuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSk7Ci0JCQkvLyB0aGlzIHNob3VsZG4ndCBoYXZlIHRvIGhhdmUgdGhlIHByZWZpeCBjb2RlZCBpbgotCQkJaWYgKGRvYyBpbnN0YW5jZW9mIEpTUENNRG9jdW1lbnQgfHwgZG9jIGluc3RhbmNlb2YgQ01Ob2RlV3JhcHBlciB8fCBub2RlLmdldE5vZGVOYW1lKCkuc3RhcnRzV2l0aCgianNwOiIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gRmluZCB0aGUgYXR0cmlidXRlIG5hbWUgZm9yIHdoaWNoIHRoaXMgcG9zaXRpb24gc2hvdWxkIGhhdmUgYSB2YWx1ZQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9wZW4gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCBvcGVuUmVnaW9ucyA9IG9wZW4uZ2V0UmVnaW9ucygpOwotCQlpbnQgaSA9IG9wZW5SZWdpb25zLmluZGV4T2YoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkpOwotCQlpZiAoaSA8IDApCi0JCQlyZXR1cm47Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBudWxsOwotCQl3aGlsZSAoaSA+PSAwKSB7Ci0JCQluYW1lUmVnaW9uID0gb3BlblJlZ2lvbnMuZ2V0KGktLSk7Ci0JCQlpZiAobmFtZVJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKQotCQkJCWJyZWFrOwotCQl9Ci0JCQotCQkvLyBvbiBhbiBlbXB0eSB2YWx1ZSwgYWRkIGFsbCB0aGUgSlNQIGFuZCB0YWdsaWIgdGFncwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKG5vZGUpOwotCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsICYmIGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gb3Blbi5nZXRUZXh0KG5hbWVSZWdpb24pOwotCQkJaWYgKGF0dHJpYnV0ZU5hbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBjdXJyZW50VmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0cmlidXRlTmFtZSkuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCi0JCQkJaWYoY3VycmVudFZhbHVlID09IG51bGwgfHwgY3VycmVudFZhbHVlLmxlbmd0aCgpID09IDApIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlMaXN0IGFkZGl0aW9uYWxFbGVtZW50cyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIG5vZGUsIGVsZW1lbnREZWNsLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQkJCWZvciAoaSA9IDA7IGkgPCBhZGRpdGlvbmFsRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCU9iamVjdCBhZGRpdGlvbmFsRWxlbWVudCA9IGFkZGl0aW9uYWxFbGVtZW50cy5nZXQoaSk7Ci0JCQkJCQlpZihhZGRpdGlvbmFsRWxlbWVudCBpbnN0YW5jZW9mIENNRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGFkZGl0aW9uYWxFbGVtZW50OwotCQotCQkJCQkJCVN0cmluZyB0YWduYW1lID0gZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldFJlcXVpcmVkTmFtZShub2RlLCBlZCk7Ci0JCQkJCQkJU3RyaW5nQnVmZmVyIGNvbnRlbnRzID0gbmV3IFN0cmluZ0J1ZmZlcigiXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWdldENvbnRlbnRHZW5lcmF0b3IoKS5nZW5lcmF0ZVRhZyhub2RlLCBlZCwgY29udGVudHMpOwotCQkJCQkJCWNvbnRlbnRzLmFwcGVuZCgnIicpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChjb250ZW50cy50b1N0cmluZygpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgY29udGVudHMubGVuZ3RoKCksIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpLCB0YWduYW1lLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9KU1BfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCXRyeSB7Ci0JCQkJLy8gQ3JlYXRlIGEgbmV3IG1vZGVsIGZvciBDb250ZW50IEFzc2lzdCB0byBvcGVyYXRlIG9uLiBUaGlzCi0JCQkJLy8gd2lsbCBzaW11bGF0ZQotCQkJCS8vIGEgZnVsbCBEb2N1bWVudCBhbmQgdGhlbiBhZGp1c3QgdGhlIG9mZnNldCBudW1iZXJzIGluIHRoZQotCQkJCS8vIGxpc3Qgb2YgcmVzdWx0cy4KLQkJCQlJU3RydWN0dXJlZE1vZGVsIGludGVybmFsTW9kZWwgPSBudWxsOwotCQkJCUlNb2RlbE1hbmFnZXIgbW1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQkJCWludGVybmFsTW9kZWwgPSBtbWFuYWdlci5jcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0JCQkJSURPTU5vZGUgeG1sTm9kZSA9IG51bGw7Ci0JCQkJSURPTU1vZGVsIHhtbE91dGVyTW9kZWwgPSBudWxsOwotCQkJCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCkgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQl4bWxOb2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0JCQkJCXhtbE91dGVyTW9kZWwgPSB4bWxOb2RlLmdldE1vZGVsKCk7Ci0JCQkJCWludGVybmFsTW9kZWwuc2V0UmVzb2x2ZXIoeG1sT3V0ZXJNb2RlbC5nZXRSZXNvbHZlcigpKTsKLQkJCQkJaW50ZXJuYWxNb2RlbC5zZXRCYXNlTG9jYXRpb24oeG1sT3V0ZXJNb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCQkJfQotCQkJCVN0cmluZyBjb250ZW50cyA9IFN0cmluZ1V0aWxzLnN0cmlwKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFRleHQoKSk7Ci0JCQkJaWYgKHhtbE5vZGUgIT0gbnVsbCAmJiBjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCWludCBhZGRpdGlvbmFsU2hpZnRzID0gMDsKLQkJCQkJLy8gQmUgc3VyZSB0aGF0IGN1c3RvbSB0YWdzIGZyb20gdGFnbGlicyBhbHNvIHNob3cgdXAKLQkJCQkJLy8gYnkKLQkJCQkJLy8gYWRkaW5nIHRhZ2xpYiBkZWNsYXJhdGlvbnMgdG8gdGhlIGludGVybmFsIG1vZGVsLgotCQkJCQlUTERDTURvY3VtZW50TWFuYWdlciBtZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKHhtbE91dGVyTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCQkJCUxpc3QgdHJhY2tlcnMgPSBtZ3IuZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpKTsKLQkJCQkJCWlmICh0cmFja2VycyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChpID0gMDsgaSA8IHRyYWNrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJCUNNRG9jdW1lbnRUcmFja2VyIHRyYWNrZXIgPSAoQ01Eb2N1bWVudFRyYWNrZXIpIHRyYWNrZXJzLmdldChpKTsKLQkJCQkJCQkJU3RyaW5nIGRlY2xhcmF0aW9uID0gdHJhY2tlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KCk7Ci0JCQkJCQkJCWlmIChkZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCQljb250ZW50cyA9IGRlY2xhcmF0aW9uICsgY29udGVudHM7Ci0JCQkJCQkJCQlhZGRpdGlvbmFsU2hpZnRzICs9IGRlY2xhcmF0aW9uLmxlbmd0aCgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIEFsc28gY29weSBhbnkganNwOnVzZUJlYW4gdGFncyBzbyB0aGF0Ci0JCQkJCS8vIGpzcDpbZ3NdZXRQcm9wZXJ0eSB3aWxsIGZ1bmN0aW9uCi0JCQkJCURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCQkJCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQkJCQlkb2MgPSAoRG9jdW1lbnQpIG5vZGU7Ci0JCQkJCWVsc2UKLQkJCQkJCWRvYyA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJCQlOb2RlTGlzdCB1c2VCZWFucyA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZShKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOKTsKLQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCB1c2VCZWFucy5nZXRMZW5ndGgoKTsgaysrKSB7Ci0JCQkJCQlJRE9NTm9kZSB1c2VCZWFuID0gKElET01Ob2RlKSB1c2VCZWFucy5pdGVtKGspOwotCQkJCQkJaWYgKHVzZUJlYW4uZ2V0U3RhcnRPZmZzZXQoKSA8IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpKSB7Ci0JCQkJCQkJU3RyaW5nQnVmZmVyIHVzZUJlYW5UZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigiPGpzcDp1c2VCZWFuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHVzZUJlYW4uZ2V0QXR0cmlidXRlcygpLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJCQkJQXR0ciBhdHRyID0gKEF0dHIpIHVzZUJlYW4uZ2V0QXR0cmlidXRlcygpLml0ZW0oaik7Ci0JCQkJCQkJCXVzZUJlYW5UZXh0LmFwcGVuZCgnICcpOwotCQkJCQkJCQl1c2VCZWFuVGV4dC5hcHBlbmQoYXR0ci5nZXROYW1lKCkpOwotCQkJCQkJCQl1c2VCZWFuVGV4dC5hcHBlbmQoIj1cIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXVzZUJlYW5UZXh0LmFwcGVuZChhdHRyLmdldFZhbHVlKCkpOwotCQkJCQkJCQl1c2VCZWFuVGV4dC5hcHBlbmQoJyInKTsKLQkJCQkJCQl9Ci0JCQkJCQkJdXNlQmVhblRleHQuYXBwZW5kKCIvPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJYWRkaXRpb25hbFNoaWZ0cyArPSB1c2VCZWFuVGV4dC5sZW5ndGgoKTsKLQkJCQkJCQljb250ZW50cyA9IHVzZUJlYW5UZXh0LnRvU3RyaW5nKCkgKyBjb250ZW50czsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpbnRlcm5hbE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnNldChjb250ZW50cyk7Ci0JCQkJCWludCBpbnRlcm5hbE9mZnNldCA9IDA7Ci0JCQkJCWJvb2xlYW4gcXVvdGVkID0gZmFsc2U7Ci0JCQkJCS8vIGlmIHF1b3RlZCwgdXNlIHBvc2l0aW9uIGluc2lkZSBhbmQgc2hpZnQgYnkgb25lCi0JCQkJCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpID4gMCAmJiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5jaGFyQXQoMCkgPT0gJ1wnJyB8fCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmNoYXJBdCgwKSA9PSAnIicpKSB7Ci0JCQkJCQlpbnRlcm5hbE9mZnNldCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkgLSAxICsgYWRkaXRpb25hbFNoaWZ0czsKLQkJCQkJCXF1b3RlZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJLy8gaWYgdW5xdW90ZWQsIHVzZSBwb3NpdGlvbiBpbnNpZGUKLQkJCQkJZWxzZSBpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSA+IDAgJiYgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5jaGFyQXQoMCkgPT0gJzwnKQotCQkJCQkJaW50ZXJuYWxPZmZzZXQgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpICsgYWRkaXRpb25hbFNoaWZ0czsKLQkJCQkJZWxzZQotCQkJCQkJaW50ZXJuYWxPZmZzZXQgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSAtIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFN0YXJ0T2Zmc2V0KCkgKyBhZGRpdGlvbmFsU2hpZnRzOwotCQkJCQlkZXB0aENvdW50Kys7Ci0JCQkJCUluZGV4ZWRSZWdpb24gaW50ZXJuYWxOb2RlID0gbnVsbDsKLQkJCQkJaW50IHRtcE9mZnNldCA9IGludGVybmFsT2Zmc2V0OwotCQkJCQl3aGlsZSAoaW50ZXJuYWxOb2RlID09IG51bGwgJiYgdG1wT2Zmc2V0ID49IDApCi0JCQkJCQlpbnRlcm5hbE5vZGUgPSBpbnRlcm5hbE1vZGVsLmdldEluZGV4ZWRSZWdpb24odG1wT2Zmc2V0LS0pOwotCi0JCQkJCWlmIChpbnRlcm5hbE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpICE9IG51bGwpIHsKLQkJCQkJCS8vIHNldCB1cCB0aGUgaW50ZXJuYWwgbW9kZWwKLQkJCQkJCWlmIChpbnRlcm5hbE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpID09IG51bGwpIHsKLQkJCQkJCQlpbnRlcm5hbE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpLmFkZEZhY3RvcnkobmV3IFBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQkJCX0KLQkJCQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIG91dGVyRW1iZWRkZWRUeXBlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgeG1sT3V0ZXJNb2RlbC5nZXREb2N1bWVudCgpLmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkJCQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXIgaW50ZXJuYWxFbWJlZGRlZFR5cGVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpICgoTm9kZSkgaW50ZXJuYWxOb2RlKS5nZXRPd25lckRvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkJCQkJaW50ZXJuYWxFbWJlZGRlZFR5cGVBZGFwdGVyLnNldEVtYmVkZGVkVHlwZShvdXRlckVtYmVkZGVkVHlwZUFkYXB0ZXIuZ2V0RW1iZWRkZWRUeXBlKCkpOwotCQkJCQl9Ci0KLQkJCQkJQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBhZGFwdGVyUmVnaXN0cnkgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QWRhcHRlckZhY3RvcnlSZWdpc3RyeSgpOwotCQkJCQlJdGVyYXRvciBhZGFwdGVyTGlzdCA9IGFkYXB0ZXJSZWdpc3RyeS5nZXRBZGFwdGVyRmFjdG9yaWVzKCk7Ci0JCQkJCS8vIEFuZCBhbGwgdGhvc2UgYXBwcm9wcmlhdGUgZm9yIHRoaXMgcGFydGljdWxhciB0eXBlCi0JCQkJCS8vIG9mIGNvbnRlbnQKLQkJCQkJd2hpbGUgKGFkYXB0ZXJMaXN0Lmhhc05leHQoKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHByb3ZpZGVyID0gKEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIpIGFkYXB0ZXJMaXN0Lm5leHQoKTsKLQkJCQkJCQlpZiAocHJvdmlkZXIuaXNGb3IoaW50ZXJuYWxNb2RlbC5nZXRNb2RlbEhhbmRsZXIoKSkpIHsKLQkJCQkJCQkJcHJvdmlkZXIuYWRkQWRhcHRlckZhY3RvcmllcyhpbnRlcm5hbE1vZGVsKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLyoqCi0JCQkJCSAqIHRoZSBpbnRlcm5hbCBhZGFwdGVyIGRvZXMgYWxsIHRoZSByZWFsIHdvcmsgb2YgdXNpbmcKLQkJCQkJICogdGhlIEpTUCBjb250ZW50IG1vZGVsIHRvIGZvcm0gcHJvcG9zYWxzCi0JCQkJCSAqLwotCQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcmVzdWx0cyA9IG51bGw7Ci0JCQkJCWRlcHRoQ291bnQtLTsKLQkJCQkJaWYgKHJlc3VsdHMgIT0gbnVsbCkgewotCQkJCQkJZm9yIChpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCgoQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKSByZXN1bHRzW2ldKS5nZXRSZXBsYWNlbWVudFN0cmluZygpLCAoKEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCkgcmVzdWx0c1tpXSkuZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSAtIGFkZGl0aW9uYWxTaGlmdHMgKyBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRTdGFydE9mZnNldCgpICsgKHF1b3RlZCA/IDEgOiAwKSwgKChDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwpIHJlc3VsdHNbaV0pLmdldFJlcGxhY2VtZW50TGVuZ3RoKCksICgoQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKSByZXN1bHRzW2ldKS5nZXRDdXJzb3JQb3NpdGlvbigpLCByZXN1bHRzW2ldLmdldEltYWdlKCksIHJlc3VsdHNbaV0uZ2V0RGlzcGxheVN0cmluZygpLCAoKEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCkgcmVzdWx0c1tpXSkuZ2V0Q29udGV4dEluZm9ybWF0aW9uKCksICgoQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKSByZXN1bHRzW2ldKS5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCksIChyZXN1bHRzW2ldIGluc3RhbmNlb2YgSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCkgPyAoKElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwpIHJlc3VsdHNbaV0pLmdldFJlbGV2YW5jZSgpIDogSVJlbGV2YW5jZUNvbnN0YW50cy5SX05PTkUpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkVycm9yIGluIGVtYmVkZGVkIEpTUCBDb250ZW50IEFzc2lzdCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCi0JfQotCi0JLyoqCi0JICogRm9yIEpTUCBmaWxlcyBhbmQgc2VnbWVudHMsIHRoaXMgaXMganVzdCB0aGUgSlNQCi0JICogICAgICAgICBkb2N1bWVudCwgYnV0IHdoZW4gZWRpdGluZyB0YWcgZmlsZXMgYW5kIHRoZWlyIGZyYWdtZW50cywgaXQKLQkgKiAgICAgICAgIHNob3VsZCBiZSB0aGUgdGFnIGRvY3VtZW50LgotCSAqIAotCSAqIEl0IG1heSBhbHNvIHZhcnkgYmFzZWQgb24gdGhlIG1vZGVsIGJlaW5nIGVkaXRlZCBpbiB0aGUgZnV0dXJlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgbm9uLWVtYmVkZGVkIENNRG9jdW1lbnQgZm9yIHRoZSBkb2N1bWVudCBiZWluZwotCSAqICAgICAgICAgZWRpdGVkLiAKLQkgKi8KLQlDTURvY3VtZW50IGdldERlZmF1bHRKU1BDTURvY3VtZW50KElET01Ob2RlIG5vZGUpIHsKLQkJLy8gaGFuZGxlIHRhZyBmaWxlcyBoZXJlCi0JCVN0cmluZyBjb250ZW50VHlwZSA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLQkJaWYgKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BUQUcuZXF1YWxzKGNvbnRlbnRUeXBlKSkKLQkJCXJldHVybiBKU1BDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5UQUcyMF9ET0NfVFlQRSk7Ci0KLQkJQ01Eb2N1bWVudCBqY21kb2MgPSBudWxsOwotCQlTdHJpbmcgbW9kZWxQYXRoID0gbm9kZS5nZXRNb2RlbCgpLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAobW9kZWxQYXRoICE9IG51bGwgJiYgIUlNb2RlbE1hbmFnZXIuVU5NQU5BR0VEX01PREVMLmVxdWFscyhtb2RlbFBhdGgpKSB7Ci0JCQlmbG9hdCB2ZXJzaW9uID0gRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0SlNQVmVyc2lvbihuZXcgUGF0aChtb2RlbFBhdGgpKTsKLQkJCWpjbWRvYyA9IEpTUENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQodmVyc2lvbik7Ci0JCX0KLQkJaWYgKGpjbWRvYyA9PSBudWxsKSB7Ci0JCQlqY21kb2MgPSBKU1BDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KCk7Ci0JCX0KLQotCQlyZXR1cm4gamNtZG9jOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQlpZiAoZGVwdGhDb3VudCA9PSAwKQotCQkJZkVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBhY3RpbmcgYXMgYSAiY2F0Y2ggYWxsIiBmb3IgcHVsbGluZyB0b2dldGhlciBjb250ZW50Ci0JICogYXNzaXN0IHByb3Bvc2FscyBmcm9tIGRpZmZlcmVudCBQcm9jZXNzb3JzIHdoZW4gZG9jdW1lbnQgcGFydGl0aW9uaW5nCi0JICogYWxvbmUgY291bGRuJ3QgZGV0ZXJtaW5lIGRlZmluaXRpdmVseSB3aGF0IGNvbnRlbnQgYXNzaXN0IHNob3VsZCBzaG93Ci0JICogdXAgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlmVGVtcGxhdGVDb250ZXh0cy5jbGVhcigpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWZWaWV3ZXIgPSB2aWV3ZXI7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBqc3BSZXN1bHRzID0gRU1QVFlfUFJPUE9TQUxfU0VUOwotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gZW1iZWRkZWRSZXN1bHRzID0gRU1QVFlfUFJPUE9TQUxfU0VUOwotCi0JCS8vIGNoZWNrIHRoZSBhY3R1YWwgcGFydGl0aW9uIHR5cGUKLQkJU3RyaW5nIHBhcnRpdGlvblR5cGUgPSBnZXRQYXJ0aXRpb25UeXBlKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHZpZXdlci5nZXREb2N1bWVudCgpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm4gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvLyBBTk9USEVSIFdPUktBUk9VTkQgVU5USUwgUEFSVElUSU9OSU5HIFRBS0VTIENBUkUgT0YgVEhJUwotCQkvLyBjaGVjayBmb3IgeG1sLWpzcCB0YWdzLi4uCi0JCWlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkUgJiYgZm4gIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwb3NzaWJsZVhNTEpTUCA9ICgoZm4uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpICYmIGZuLmdldFByZXZpb3VzKCkgIT0gbnVsbCkgPyBmbi5nZXRQcmV2aW91cygpIDogZm47Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHBvc3NpYmxlWE1MSlNQLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChyZWdpb25zLnNpemUoKSA+IDEpIHsKLQkJCQkvLyBjaGVjayBib3VuZHMgY2FzZXMKLQkJCQlJVGV4dFJlZ2lvbiB4bWxPcGVuT3JDbG9zZSA9IHJlZ2lvbnMuZ2V0KDApOwotCQkJCWlmICh4bWxPcGVuT3JDbG9zZS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gJiYgZG9jdW1lbnRQb3NpdGlvbiA9PSBwb3NzaWJsZVhNTEpTUC5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCS8vIGRvIHJlZ3VsYXIganNwIGNvbnRlbnQgYXNzaXN0Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHhtbE9wZW5PckNsb3NlLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4gJiYgZG9jdW1lbnRQb3NpdGlvbiA+IHBvc3NpYmxlWE1MSlNQLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJLy8gZG8gcmVndWxhciBqc3AgY29udGVudCBhc3Npc3QKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHBvc3NpYmxlIHhtbC1qc3AKLQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDEpOwotCQkJCQlTdHJpbmcgbmFtZSA9IHBvc3NpYmxlWE1MSlNQLmdldFRleHQobmFtZVJlZ2lvbik7Ci0JCQkJCWlmIChuYW1lLmVxdWFscygianNwOnNjcmlwdGxldCIpIHx8IG5hbWUuZXF1YWxzKCJqc3A6ZXhwcmVzc2lvbiIpIHx8IG5hbWUuZXF1YWxzKCJqc3A6ZGVjbGFyYXRpb24iKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCS8vICoqIFRISVMgSVMgQSBURU1QIEZJWCBVTlRJTCBQQVJUSVRJT05JTkcgVEFLRVMgQ0FSRSBPRiBUSElTLi4uCi0JCS8vIGNoZWNrIGZvciBYTUwtSlNQIGluIGEgPHNjcmlwdD4gcmVnaW9uCi0JCWlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQgfHwgcGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKSB7Ci0JCQkvLyBmbiBzaG91bGQgYmUgYmxvY2sgdGV4dAotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkZWNvZGVkU0RSZWdpb24gPSBkZWNvZGVTY3JpcHRCbG9jayhmbi5nZXRGdWxsVGV4dCgpKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZGVjb2RlZCA+ICIgKwotCQkJLy8gYmxvY2tPZlRleHQuc3Vic3RyaW5nKGRlY29kZWRTRFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLAotCQkJLy8gZGVjb2RlZFNEUmVnaW9uLmdldEVuZE9mZnNldCgpKSk7Ci0JCQlpZiAoZGVjb2RlZFNEUmVnaW9uICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkciA9IGRlY29kZWRTRFJlZ2lvbjsKLQkJCQl3aGlsZSAoc2RyICE9IG51bGwpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzZHIgIiArIHNkci5nZXRUeXBlKCkpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNkciA+ICIgKwotCQkJCQkvLyBibG9ja09mVGV4dC5zdWJzdHJpbmcoc2RyLmdldFN0YXJ0T2Zmc2V0KCksCi0JCQkJCS8vIHNkci5nZXRFbmRPZmZzZXQoKSkpOwotCQkJCQlpZiAoc2RyLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgewotCQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPj0gZm4uZ2V0U3RhcnRPZmZzZXQoKSArIHNkci5nZXRTdGFydE9mZnNldCgpICYmIGRvY3VtZW50UG9zaXRpb24gPD0gZm4uZ2V0U3RhcnRPZmZzZXQoKSArIHNkci5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkJCXJldHVybiBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHNkci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID4gZm4uZ2V0U3RhcnRPZmZzZXQoKSArIHNkci5nZXRTdGFydE9mZnNldCgpICYmIGRvY3VtZW50UG9zaXRpb24gPCBmbi5nZXRTdGFydE9mZnNldCgpICsgc2RyLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCQkJcmV0dXJuIEVNUFRZX1BST1BPU0FMX1NFVDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gZm4uZ2V0U3RhcnRPZmZzZXQoKSArIHNkci5nZXRFbmRPZmZzZXQoKSAmJiBzZHIuZ2V0TmV4dCgpICE9IG51bGwgJiYgc2RyLmdldE5leHQoKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpIHsKLQkJCQkJCQkvLyB0aGUgZW5kIG9mIGFuIG9wZW4gdGFnIDxzY3JpcHQ+Ci0JCQkJCQkJLy8gPGpzcDpzY3JpcHRsZXQ+fCBibGFoIDwvanNwOnNjcmlwdGxldD4KLQkJCQkJCQlyZXR1cm4gZ2V0SlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gZm4uZ2V0U3RhcnRPZmZzZXQoKSArIHNkci5nZXRTdGFydE9mZnNldCgpICYmIHNkci5nZXRQcmV2aW91cygpICE9IG51bGwgJiYgc2RyLmdldFByZXZpb3VzKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc2RyID0gc2RyLmdldE5leHQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvLyBjaGVjayBzcGVjaWFsIEpTUCBkZWxpbWl0ZXIgY2FzZXMKLQkJaWYgKGZuICE9IG51bGwgJiYgcGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9ERUxJTUlURVIpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm5EZWxpbSA9IGZuOwotCi0JCQkvLyBpZiBpdCdzIGEgbmVzdGVkIEpTUCByZWdpb24sIG5lZWQgdG8gZ2V0IHRoZSBjb3JyZWN0Ci0JCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCS8vIG5vdCBzdXJlIHdoeSB0aGlzIGNoZWNrIHdhcyB0aGVyZS4uLgotCQkJLy8gaWYgKGZuRGVsaW0uZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJSXRlcmF0b3IgYmxvY2tSZWdpb25zID0gZm5EZWxpbS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCUlUZXh0UmVnaW9uIHRlbXAgPSBudWxsOwotCQkJSVRleHRSZWdpb25Db250YWluZXIgdHJjOwotCQkJd2hpbGUgKGJsb2NrUmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQl0ZW1wID0gKElUZXh0UmVnaW9uKSBibG9ja1JlZ2lvbnMubmV4dCgpOwotCQkJCS8vIHdlIGhpdCBhIG5lc3RlZAotCQkJCWlmICh0ZW1wIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJdHJjID0gKElUZXh0UmVnaW9uQ29udGFpbmVyKSB0ZW1wOwotCQkJCQkvLyBpdCdzIGluIHRoaXMgcmVnaW9uCi0JCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID49IHRyYy5nZXRTdGFydE9mZnNldCgpICYmIGRvY3VtZW50UG9zaXRpb24gPCB0cmMuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJCUl0ZXJhdG9yIG5lc3RlZEpTUFJlZ2lvbnMgPSB0cmMuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZSAobmVzdGVkSlNQUmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQkJCQl0ZW1wID0gKElUZXh0UmVnaW9uKSBuZXN0ZWRKU1BSZWdpb25zLm5leHQoKTsKLQkJCQkJCQlpZiAoWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5pc0pTUE9wZW5EZWxpbWl0ZXIodGVtcC5nZXRUeXBlKCkpICYmIGRvY3VtZW50UG9zaXRpb24gPT0gdHJjLmdldFN0YXJ0T2Zmc2V0KHRlbXApKSB7Ci0JCQkJCQkJCS8vIEhUTUwgY29udGVudCBhc3Npc3QKLQkJCQkJCQkJLy8gd2UgYWN0dWFsbHkgd2FudCBjb250ZW50IGFzc2lzdCBmb3IgdGhlCi0JCQkJCQkJCS8vIHByZXZpb3VzIHR5cGUgb2YgcmVnaW9uLAotCQkJCQkJCQkvLyB3ZWxsIGdldCB0aG9zZSBwcm9wb3NhbHMgZnJvbSB0aGUgZW1iZWRkZWQKLQkJCQkJCQkJLy8gYWRhcHRlcgotCQkJCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+IDApIHsKLQkJCQkJCQkJCXBhcnRpdGlvblR5cGUgPSBnZXRQYXJ0aXRpb25UeXBlKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbiAtIDEpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAoWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5pc0pTUENsb3NlRGVsaW1pdGVyKHRlbXAuZ2V0VHlwZSgpKSAmJiBkb2N1bWVudFBvc2l0aW9uID09IHRyYy5nZXRTdGFydE9mZnNldCh0ZW1wKSkgewotCQkJCQkJCQkvLyBKU1AgY29udGVudCBhc3Npc3QKLQkJCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIH0KLQkJCX0KLQotCQkJLy8gdGFrZSBjYXJlIG9mIFhNTC1KU1AgZGVsaW10ZXIgY2FzZXMKLQkJCWlmIChYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmlzWE1MSlNQRGVsaW1pdGVyKGZuRGVsaW0pKSB7Ci0JCQkJLy8gc2luY2UgaXQncyBhIGRlbGltaXRlciwgd2Uga25vdyBpdCdzIGEgSVRleHRSZWdpb25Db250YWluZXIKLQkJCQlJVGV4dFJlZ2lvbiBmaXJzdFJlZ2lvbiA9IGZuRGVsaW0uZ2V0UmVnaW9ucygpLmdldCgwKTsKLQkJCQlpZiAoZm5EZWxpbS5nZXRTdGFydE9mZnNldCgpID09IGRvY3VtZW50UG9zaXRpb24gJiYgKGZpcnN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikpIHsKLQkJCQkJLy8gfDxqc3A6c2NyaXB0bGV0PiA8L2pzcDpzY3JpcHRsZXQ+Ci0JCQkJCS8vIChwYSkgY29tbWVudGVkIG91dCBzbyB0aGF0IHdlIGdldCByZWd1bGFyIGJlaGF2aW9yIEpTUAotCQkJCQkvLyBtYWNyb3MgZXRjLi4uCi0JCQkJCS8vIHJldHVybiBnZXRIVE1MQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsCi0JCQkJCS8vIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCX0KLQkJCQllbHNlIGlmIChmbkRlbGltLmdldFN0YXJ0T2Zmc2V0KCkgPT0gZG9jdW1lbnRQb3NpdGlvbiAmJiAoZmlyc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikpIHsKLQkJCQkJLy8gPGpzcDpzY3JpcHRsZXQ+IHw8L2pzcDpzY3JpcHRsZXQ+Ci0JCQkJCS8vIGNoZWNrIHByZXZpb3VzIHBhcnRpdGlvbiB0eXBlIHRvIHNlZSBpZiBpdCdzIEpBVkFTQ1JJUFQKLQkJCQkJLy8gaWYgaXQgaXMsIHdlJ3JlIGp1c3QgZ29ubmEgbGV0IHRoZSBlbWJlZGRlZCBKQVZBU0NSSVBUCi0JCQkJCS8vIGFkYXB0ZXIgZ2V0IHRoZSBwcm9wb3NhbHMKLQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPiAwKSB7Ci0JCQkJCQlTdHJpbmcgY2hlY2tUeXBlID0gZ2V0UGFydGl0aW9uVHlwZSh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24gLSAxKTsKLQkJCQkJCWlmIChjaGVja1R5cGUgIT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCkgeyAvLyB0aGlzCi0JCQkJCQkJLy8gY2hlY2sKLQkJCQkJCQkvLyBpcwotCQkJCQkJCS8vIGZhaWxpbmcKLQkJCQkJCQkvLyBmb3IKLQkJCQkJCQkvLyBYTUwtSlNQCi0JCQkJCQkJLy8gKHJlZ2lvbgotCQkJCQkJCS8vIGlzCi0JCQkJCQkJLy8gbm90Ci0JCQkJCQkJLy8gamF2YXNjcmlwdC4uLikKLQkJCQkJCQlyZXR1cm4gZ2V0SlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQkJCX0KLQkJCQkJCXBhcnRpdGlvblR5cGUgPSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChmaXJzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pICYmIGRvY3VtZW50UG9zaXRpb24gPj0gZm5EZWxpbS5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkvLyBhbnl0aGluZyBlbHNlIGluYmV0d2VlbgotCQkJCQlyZXR1cm4gZ2V0SlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmlzSlNQRGVsaW1pdGVyKGZuRGVsaW0pKSB7Ci0JCQkJLy8gdGhlIGRlbGltaXRlciA8JSwgPCU9LCA8JSEsIC4uLgotCQkJCWlmIChYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmlzSlNQQ2xvc2VEZWxpbWl0ZXIoZm5EZWxpbSkpIHsKLQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gZm5EZWxpbS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCQkvLyBjaGVjayBwcmV2aW91cyBwYXJ0aXRpb24gdHlwZSB0byBzZWUgaWYgaXQncwotCQkJCQkJLy8gSkFWQVNDUklQVAotCQkJCQkJLy8gaWYgaXQgaXMsIHdlJ3JlIGp1c3QgZ29ubmEgbGV0IHRoZSBlbWJlZGRlZAotCQkJCQkJLy8gSkFWQVNDUklQVCBhZGFwdGVyIGdldCB0aGUgcHJvcG9zYWxzCi0JCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+IDApIHsKLQkJCQkJCQlTdHJpbmcgY2hlY2tUeXBlID0gZ2V0UGFydGl0aW9uVHlwZSh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24gLSAxKTsKLQkJCQkJCQlpZiAoY2hlY2tUeXBlICE9IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQpIHsKLQkJCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJCXBhcnRpdGlvblR5cGUgPSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuaXNKU1BPcGVuRGVsaW1pdGVyKGZuRGVsaW0pKSB7Ci0JCQkJCS8vIGlmIGl0J3MgdGhlIGZpcnN0IHBvc2l0aW9uIG9mIG9wZW4gZGVsaW1pdGVyCi0JCQkJCS8vIHVzZSBlbWJlZGRlZCBIVE1MIHJlc3VsdHMKLQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gZm5EZWxpbS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCQllbWJlZGRlZFJlc3VsdHMgPSBnZXRIVE1MQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gZm5EZWxpbS5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkJLy8gaXQncyBhdCB0aGUgRU9GIDwlfAotCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgSlNQIHJlZ2lvbiBpbnNpZGUgb2YgQ0RBVEEgdy8gbm8gcmVnaW9uCi0JCS8vIDwhW0NEQVRBWyA8JXwlPiBdXT4KLQkJLy8gb3IgYSBjb21tZW50IHJlZ2lvbgotCQkvLyA8IS0tIDwlIHwlPiAtLT4KLQkJaWYgKGZuICE9IG51bGwgJiYgKGZuLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUIHx8IGZuLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQpKSB7Ci0JCQlpZiAoZm4gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCU9iamVjdFtdIGNkYXRhUmVnaW9ucyA9IGZuLmdldFJlZ2lvbnMoKS50b0FycmF5KCk7Ci0JCQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCQkJSVRleHRSZWdpb24ganNwUmVnaW9uID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNkYXRhUmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlyID0gKElUZXh0UmVnaW9uKSBjZGF0YVJlZ2lvbnNbaV07Ci0JCQkJCWlmIChyIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJCS8vIENEQVRBIGVtYmVkZGVkIGNvbnRhaW5lciwgb3IgY29tbWVudCBjb250YWluZXIKLQkJCQkJCU9iamVjdFtdIGpzcFJlZ2lvbnMgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByKS5nZXRSZWdpb25zKCkudG9BcnJheSgpOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBqc3BSZWdpb25zLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJanNwUmVnaW9uID0gKElUZXh0UmVnaW9uKSBqc3BSZWdpb25zW2pdOwotCQkJCQkJCWlmIChqc3BSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkgewotCQkJCQkJCQlpZiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoanNwUmVnaW9uKSA9PSBkb2N1bWVudFBvc2l0aW9uKQotCQkJCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBpZiBpdCdzIGluIGFuIGF0dHJpYnV0ZSB2YWx1ZSwgaWYgc28sIGRvbid0IGFkZCBDREFUQQotCQkvLyBwcm9wb3NhbAotCQlJVGV4dFJlZ2lvbiBhdHRyQ29udGFpbmVyID0gKGZuICE9IG51bGwpID8gZm4uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbikgOiBudWxsOwotCQlpZiAoYXR0ckNvbnRhaW5lciAhPSBudWxsICYmIGF0dHJDb250YWluZXIgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJaWYgKGF0dHJDb250YWluZXIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkvLyB0ZXN0IGxvY2F0aW9uIG9mIHRoZSBjdXJzb3IKLQkJCQkvLyByZXR1cm4gbnVsbCBpZiBpdCdzIGluIHRoZSBtaWRkbGUgb2YgYW4gb3Blbi9jbG9zZQotCQkJCS8vIGRlbGltZXRlcgotCQkJCUl0ZXJhdG9yIGF0dHJSZWdpb25zID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgYXR0ckNvbnRhaW5lcikuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJSVRleHRSZWdpb24gdGVzdFJlZ2lvbiA9IG51bGw7Ci0JCQkJd2hpbGUgKGF0dHJSZWdpb25zLmhhc05leHQoKSkgewotCQkJCQl0ZXN0UmVnaW9uID0gKElUZXh0UmVnaW9uKSBhdHRyUmVnaW9ucy5uZXh0KCk7Ci0JCQkJCS8vIG5lZWQgdG8gY2hlY2sgZm9yIG90aGVyIHZhbGlkIGF0dHJpYnV0ZSByZWdpb25zCi0JCQkJCWlmIChYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmlzSlNQT3BlbkRlbGltaXRlcih0ZXN0UmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJCWlmICghKCgoSVRleHRSZWdpb25Db250YWluZXIpIGF0dHJDb250YWluZXIpLmdldEVuZE9mZnNldCh0ZXN0UmVnaW9uKSA8PSBkb2N1bWVudFBvc2l0aW9uKSkKLQkJCQkJCQlyZXR1cm4gRU1QVFlfUFJPUE9TQUxfU0VUOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuaXNKU1BDbG9zZURlbGltaXRlcih0ZXN0UmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJCWlmICghKCgoSVRleHRSZWdpb25Db250YWluZXIpIGF0dHJDb250YWluZXIpLmdldFN0YXJ0T2Zmc2V0KHRlc3RSZWdpb24pID49IGRvY3VtZW50UG9zaXRpb24pKQotCQkJCQkJCXJldHVybiBFTVBUWV9QUk9QT1NBTF9TRVQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gVE9ETzogaGFuZGxlIG5vbi1KYXZhIGNvZGUgc3VjaCBhcyBuZXN0ZWQgdGFncwotCQkJCWlmICh0ZXN0UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpKQotCQkJCQlyZXR1cm4gZ2V0SlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQlyZXR1cm4gRU1QVFlfUFJPUE9TQUxfU0VUOwotCQkJfQotCQl9Ci0KLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLmdldChwYXJ0aXRpb25UeXBlKTsKLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJZW1iZWRkZWRSZXN1bHRzID0gcC5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJLy8gZ2V0IGJlYW4gbWV0aG9kcywgb2JqZWN0cywgYW5kIGNvbnN0YW50cyBpZiB0aGVyZSBhcmUgYW55Li4uCi0JCQlpZiAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUIHx8IHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVCkgewotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBiZWFuUmVzdWx0cyA9IGdldEpTUEphdmFCZWFuUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJaWYgKGJlYW5SZXN1bHRzICE9IG51bGwgJiYgYmVhblJlc3VsdHMubGVuZ3RoID4gMCkgewotCQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gYWRkZWQgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtiZWFuUmVzdWx0cy5sZW5ndGggKyBlbWJlZGRlZFJlc3VsdHMubGVuZ3RoXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShiZWFuUmVzdWx0cywgMCwgYWRkZWQsIDAsIGJlYW5SZXN1bHRzLmxlbmd0aCk7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoZW1iZWRkZWRSZXN1bHRzLCAwLCBhZGRlZCwgYmVhblJlc3VsdHMubGVuZ3RoLCBlbWJlZGRlZFJlc3VsdHMubGVuZ3RoKTsKLQkJCQkJZW1iZWRkZWRSZXN1bHRzID0gYWRkZWQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gdGhlIHBhcnRpdGlvbiB0eXBlIGlzIHByb2JhYmx5IG5vdCBtYXBwZWQKLQkJfQotCi0JCS8vIGZpeCBmb3I6Ci0JCS8vIEhUTUwgY29udGVudCBhc3Npc3QgZ2l2ZSBKU1AgdGFncyBpbiBiZXR3ZWVuIGVtcHR5IHNjcmlwdCB0YWdzCi0JCWlmICghKChnZXRKU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSAhPSBudWxsICYmIGdldEpTQ29udGVudEFzc2lzdFByb2Nlc3NvcigpLmdldENsYXNzKCkuaXNJbnN0YW5jZShwKSkgfHwgcCBpbnN0YW5jZW9mIENTU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IpKSB7Ci0JCQlmVGVtcGxhdGVDb250ZXh0cy5jbGVhcigpOwotCQkJanNwUmVzdWx0cyA9IHN1cGVyLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCX0KLQkJCi0JCS8vbWVyZ2UgdGhlIGVtYmVkZGVkIHJlc3VsdHMKLQkJaWYgKHVzZUVtYmVkZGVkUmVzdWx0cyAmJiBlbWJlZGRlZFJlc3VsdHMgIT0gbnVsbCAmJiBlbWJlZGRlZFJlc3VsdHMubGVuZ3RoID4gMCkgewotCQkJanNwUmVzdWx0cyA9IG1lcmdlKGpzcFJlc3VsdHMsIGVtYmVkZGVkUmVzdWx0cyk7Ci0JCX0KLQkJaWYgKGpzcFJlc3VsdHMgPT0gbnVsbCkKLQkJCWpzcFJlc3VsdHMgPSBFTVBUWV9QUk9QT1NBTF9TRVQ7Ci0JCXNldEVycm9yTWVzc2FnZShqc3BSZXN1bHRzLmxlbmd0aCA9PSAwID8gVU5LTk9XTl9DT05URVhUIDogbnVsbCk7Ci0KLQkJLy8gZml4IGZvcjoKLQkJLy8gY2hlY2sgZm9yIHw8JS0tIC0tJT4gZmlyc3QgcG9zaXRpb24gb2YganNwIGNvbW1lbnQKLQkJaWYgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTU1FTlQpIHsKLQkJCWlmIChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpID09IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gaHRtbFJlc3VsdHMgPSBnZXRIVE1MQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCWpzcFJlc3VsdHMgPSBtZXJnZShqc3BSZXN1bHRzLCBodG1sUmVzdWx0cyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODY2NTYKLQkJaWYgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSkgewotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGltcG9ydFByb3Bvc2FscyA9IGdldEltcG9ydFByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJaWYgKGltcG9ydFByb3Bvc2Fscy5sZW5ndGggPiAwKQotCQkJCWpzcFJlc3VsdHMgPSBtZXJnZShqc3BSZXN1bHRzLCBpbXBvcnRQcm9wb3NhbHMpOwotCQl9Ci0JCXJldHVybiBqc3BSZXN1bHRzOwotCX0KLQotCXByaXZhdGUgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldEltcG9ydFByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCUxpc3QgaW1wb3J0UHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZ2V0SlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wb3NhbHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwcm9wb3NhbHNbaV0gaW5zdGFuY2VvZiBKU1BDb21wbGV0aW9uUHJvcG9zYWwpIHsKLQotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWwgaW1wb3J0UHJvcG9zYWwgPSBhZGp1c3RJbXBvcnRQcm9wb3NhbCgoSlNQQ29tcGxldGlvblByb3Bvc2FsKSBwcm9wb3NhbHNbaV0pOwotCQkJCWltcG9ydFByb3Bvc2Fscy5hZGQoaW1wb3J0UHJvcG9zYWwpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBpbXBvcnRQcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtpbXBvcnRQcm9wb3NhbHMuc2l6ZSgpXSk7Ci0JfQotCi0KLQlwcml2YXRlIElDb21wbGV0aW9uUHJvcG9zYWwgYWRqdXN0SW1wb3J0UHJvcG9zYWwoSlNQQ29tcGxldGlvblByb3Bvc2FsIGltcG9ydFByb3Bvc2FsKSB7Ci0KLQkJLy8ganVzdCBuZWVkIHRvIHJlbW92ZSB0aGUgIjsiCi0JCS8vIGFuZCBhZGp1c3Qgb2Zmc2V0cyBmb3IgdGhlIGNoYW5nZQotCQlTdHJpbmcgbmV3UmVwbGFjZSA9IGltcG9ydFByb3Bvc2FsLmdldFJlcGxhY2VtZW50U3RyaW5nKCkucmVwbGFjZUFsbCgiOyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWltcG9ydFByb3Bvc2FsLnNldFJlcGxhY2VtZW50U3RyaW5nKG5ld1JlcGxhY2UpOwotCi0JCVN0cmluZyBuZXdEaXNwbGF5ID0gaW1wb3J0UHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpLnJlcGxhY2VBbGwoIjsiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbXBvcnRQcm9wb3NhbC5zZXREaXNwbGF5U3RyaW5nKG5ld0Rpc3BsYXkpOwotCi0JCWludCBuZXdSZXBsYWNlbWVudExlbmd0aCA9IGltcG9ydFByb3Bvc2FsLmdldFJlcGxhY2VtZW50TGVuZ3RoKCkgLSAxOwotCQlpZiAobmV3UmVwbGFjZW1lbnRMZW5ndGggPj0gMCkKLQkJCWltcG9ydFByb3Bvc2FsLnNldFJlcGxhY2VtZW50TGVuZ3RoKG5ld1JlcGxhY2VtZW50TGVuZ3RoKTsKLQotCQlpbnQgbmV3Q3Vyc29yUG9zaXRpb24gPSBpbXBvcnRQcm9wb3NhbC5nZXRDdXJzb3JQb3NpdGlvbigpIC0gMTsKLQkJaW1wb3J0UHJvcG9zYWwuc2V0Q3Vyc29yUG9zaXRpb24obmV3Q3Vyc29yUG9zaXRpb24pOwotCi0JCXJldHVybiBpbXBvcnRQcm9wb3NhbDsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIDIgYXJyYXlzIG9mIHtAbGluayBJQ29tcGxldGlvblByb3Bvc2FsfXMgdG8gYSB7QGxpbmsgVHJlZVNldH0KLQkgKiBlbGltaW5hdGluZyBkdXBsaWNhdGVzIGFuZCBzb3J0aW5nIHdpdGggYSB7QGxpbmsgUHJvcG9zYWxDb21wYXJhdG9yfQotCSAqIHRoZW4gcmV0dXJuaW5nIHRoZSBuZXcgbWVyZ2VkLCBmaWx0ZXJlZCwgc29ydGVkLCBhcnJheSBvZiB7QGxpbmsgSUNvbXBsZXRpb25Qcm9wb3NhbH1zLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wb3NhbHNPbmUKLQkgKiBAcGFyYW0gcHJvcG9zYWxzVHdvCi0JICogQHJldHVybiBhIG5ldyBtZXJnZWQsIGZpbHRlcmVkLCBzb3J0ZWQgYXJyYXkgb2Yge0BsaW5rIElDb21wbGV0aW9uUHJvcG9zYWx9cyBjcmVhdGVkIGZyb20KLQkgKiB0aGUgdHdvIGdpdmVuIGFycmF5cyBvZiB7QGxpbmsgSUNvbXBsZXRpb25Qcm9wb3NhbH1zLgotCSAqLwotCXByaXZhdGUgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIG1lcmdlKElDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHNPbmUsIElDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHNUd28pIHsKLQkJU2V0IHJlc3VsdHMgPSBuZXcgVHJlZVNldChuZXcgUHJvcG9zYWxDb21wYXJhdG9yKCkpOwotCi0JCWlmIChwcm9wb3NhbHNPbmUgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wb3NhbHNPbmUubGVuZ3RoOyBpKyspCi0JCQkJcmVzdWx0cy5hZGQocHJvcG9zYWxzT25lW2ldKTsKLQkJfQotCQlpZiAocHJvcG9zYWxzVHdvICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcG9zYWxzVHdvLmxlbmd0aDsgaSsrKQotCQkJCXJlc3VsdHMuYWRkKHByb3Bvc2Fsc1R3b1tpXSk7Ci0JCX0KLQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRKU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCWlmIChmSlNDb250ZW50QXNzaXN0UHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZKU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCgpLmdldENvbnRlbnRBc3Npc3RhbnQobnVsbCkuZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKTsKLQkJfQotCQlyZXR1cm4gZkpTQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIEpTUEphdmEgUHJvcG9zYWxzIHRoYXQgYXJlIHJlbGV2YW50IHRvIGFueSBqYXZhCi0JICogYmVhbnMgdGhhdCBpbiBzY29wZSBhdCB0aGUgZG9jdW1lbnRQb3NpdGlvbgotCSAqIAotCSAqIFRPRE8gKHBhKSBhcmUgdGFnbGliIHZhcnMgZ2V0dGluZyBmaWx0ZXJlZD8KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uIEByZXR1cm4gSUNvbXBsZXRpb25Qcm9wb3NhbFtdCi0JICovCi0JcHJpdmF0ZSBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0SlNQSmF2YUJlYW5Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcmVndWxhckpTUFJlc3VsdHMgPSBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQlWZWN0b3IgZmlsdGVyZWRQcm9wb3NhbHMgPSBuZXcgVmVjdG9yKCk7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBmaW5hbFJlc3VsdHMgPSBFTVBUWV9QUk9QT1NBTF9TRVQ7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVndWxhckpTUFJlc3VsdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWwgdGVzdCA9IHJlZ3VsYXJKU1BSZXN1bHRzW2ldOwotCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInByb3Bvc2FsID4gIiArIHRlc3QuZ2V0RGlzcGxheVN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWxldmFuY2UgPiAiICsgKChDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwpIHRlc3QpLmdldFJlbGV2YW5jZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoaXNSZWxldmFuY2VBbGxvd2VkKCgoQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKSB0ZXN0KS5nZXRSZWxldmFuY2UoKSkpIHsKLQkJCQlmaWx0ZXJlZFByb3Bvc2Fscy5hZGQodGVzdCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbHRlcmVkUHJvcG9zYWxzLnNpemUoKSA+IDApIHsKLQkJCWZpbmFsUmVzdWx0cyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2ZpbHRlcmVkUHJvcG9zYWxzLnNpemUoKV07Ci0JCQlJdGVyYXRvciBpdCA9IGZpbHRlcmVkUHJvcG9zYWxzLml0ZXJhdG9yKCk7Ci0JCQlpbnQgaiA9IDA7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJZmluYWxSZXN1bHRzW2orK10gPSAoSUNvbXBsZXRpb25Qcm9wb3NhbCkgaXQubmV4dCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaW5hbFJlc3VsdHM7Ci0JfQotCi0JLy8gVGhlc2UgYXJlIHRoZSBvbmx5IHRoaW5ncyBJJ20gYWxsb3dpbmcgZm9yIHVzZSBiZWFuIGlmIHRoZSBsYW5ndWFnZSBpcwotCS8vIEpBVkFTQ1JJUFQKLQkvLyBJJ20gZmlsdGVyaW5nIGJhc2VkIG9uIEphdmFDb250ZW50QXNzaXN0UHJvcG9zYWwgcmVsZXZhbmNlCi0JLy8KLQkvLyA0ODUgPiBtZXRob2QgdGhhdCBiZWxvbmdzIHRvIHRoZSBiZWFuCi0JLy8gNDg2ID4gYmVhbiBvYmplY3QKLQkvLyAzODYgPiBiZWFuIENPTlNUQU5UCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZhbmNlQWxsb3dlZChpbnQgcmVsZXZhbmNlKSB7Ci0JCXJldHVybiAocmVsZXZhbmNlID09IDQ4NSB8fCByZWxldmFuY2UgPT0gNDg2IHx8IHJlbGV2YW5jZSA9PSAzMjYpOwotCX0KLQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogQHJldHVybiBJQ29tcGxldGlvblByb3Bvc2FsW10KLQkgKi8KLQlwcml2YXRlIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRIVE1MQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0KLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLmdldChJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKTsKLQkJcmV0dXJuIHAuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiBAcmV0dXJuIElDb21wbGV0aW9uUHJvcG9zYWxbXQotCSAqLwotCXByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0SlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlKU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gKEpTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAuZ2V0KElKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxUKTsKLQkJcmV0dXJuIHAuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCVN0cmluZyBwYXJ0aXRpb25UeXBlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpCi0JCQkJcGFydGl0aW9uVHlwZSA9IFRleHRVdGlsaXRpZXMuZ2V0Q29udGVudFR5cGUodmlld2VyLmdldERvY3VtZW50KCksIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcsICgoSVRleHRWaWV3ZXJFeHRlbnNpb241KSB2aWV3ZXIpLm1vZGVsT2Zmc2V0MldpZGdldE9mZnNldChkb2N1bWVudFBvc2l0aW9uKSwgZmFsc2UpOwotCQkJZWxzZQotCQkJCXBhcnRpdGlvblR5cGUgPSBUZXh0VXRpbGl0aWVzLmdldENvbnRlbnRUeXBlKHZpZXdlci5nZXREb2N1bWVudCgpLCBJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCBkb2N1bWVudFBvc2l0aW9uLCBmYWxzZSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXBhcnRpdGlvblR5cGUgPSBJRG9jdW1lbnQuREVGQVVMVF9DT05URU5UX1RZUEU7Ci0JCX0KLQkJcmV0dXJuIHBhcnRpdGlvblR5cGU7Ci0JfQotCi0JLyoKLQkgKiAqKiBURU1QIFdPUktBUk9VTkQgRk9SIENNVkMgMjQxODgyIFRha2VzIGEgU3RyaW5nIGFuZCBibG9ja3Mgb3V0Ci0JICoganNwOnNjcmlwdGxldCwganNwOmV4cHJlc3Npb24sIGFuZCBqc3A6ZGVjbGFyYXRpb24gQHBhcmFtIGJsb2NrVGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGVjb2RlU2NyaXB0QmxvY2soU3RyaW5nIGJsb2NrVGV4dCkgewotCQlYTUxTb3VyY2VQYXJzZXIgcGFyc2VyID0gbmV3IFhNTFNvdXJjZVBhcnNlcigpOwotCQkvLyB1c2UgSlNQX0NPTlRFTlQgZm9yIHJlZ2lvbiB0eXBlCi0JCXBhcnNlci5hZGRCbG9ja01hcmtlcihuZXcgQmxvY2tNYXJrZXIoImpzcDpzY3JpcHRsZXQiLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOmV4cHJlc3Npb24iLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOmRlY2xhcmF0aW9uIiwgbnVsbCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIGZhbHNlLCBmYWxzZSkpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlci5yZXNldChibG9ja1RleHQpOwotCQlyZXR1cm4gcGFyc2VyLmdldERvY3VtZW50UmVnaW9ucygpOwotCX0KLQotCS8qCi0JICogQHNlZSBDb250ZW50QXNzaXN0QWRhcHRlciNjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyLCBpbnQsCi0JICogICAgICBJbmRleGVkUmVnaW9uKQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCwgSW5kZXhlZFJlZ2lvbiBpbmRleGVkTm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbih2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ29udGVudEFzc2lzdEFkYXB0ZXIjZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpOwotCX0KLQotCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSAoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5nZXQoSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCk7Ci0JCXJldHVybiBwLmdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpOwotCX0KLQotCS8qCi0JICogQHNlZSBDb250ZW50QXNzaXN0QWRhcHRlciNnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzWE1MRm9ybWF0KERvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUVsZW1lbnQgZG9jRWxlbWVudCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJcmV0dXJuIGRvY0VsZW1lbnQgIT0gbnVsbCAmJiAoKGRvY0VsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImpzcDpyb290IikpIHx8ICgoKChJRE9NTm9kZSkgZG9jRWxlbWVudCkuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsICYmICgoSURPTU5vZGUpIGRvY0VsZW1lbnQpLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ29udGVudEFzc2lzdEFkYXB0ZXIjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCQkvLyByZWxlYXNlICpDb250ZW50QXNzaXN0UHJvY2Vzc29ycyBpbiBtYXBzCi0JCS8vIENNVkMgMjU0MDIzCi0JCXJlbGVhc2VQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpOwotCQlyZWxlYXNlTmFtZVRvUHJvY2Vzc29yTWFwKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZVBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCkgewotCQlyZWxlYXNlTWFwKGZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZU5hbWVUb1Byb2Nlc3Nvck1hcCgpIHsKLQkJcmVsZWFzZU1hcChmTmFtZVRvUHJvY2Vzc29yTWFwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlTWFwKEhhc2hNYXAgbWFwKSB7Ci0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJaWYgKCFtYXAuaXNFbXB0eSgpKSB7Ci0JCQkJSXRlcmF0b3IgaXQgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQlPYmplY3Qga2V5ID0gbnVsbDsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCWtleSA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKG1hcC5nZXQoa2V5KSBpbnN0YW5jZW9mIElSZWxlYXNhYmxlKSB7Ci0JCQkJCQkoKElSZWxlYXNhYmxlKSBtYXAuZ2V0KGtleSkpLnJlbGVhc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCW1hcC5jbGVhcigpOwotCQkJbWFwID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGludCwKLQkgKiAgICAgIFN0cmluZywgSVRleHRSZWdpb24sIElET01Ob2RlLCBJRE9NTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgdHJlZU5vZGUsIElET01Ob2RlIHhtbG5vZGUpIHsKLQotCQlDb250ZW50QXNzaXN0UmVxdWVzdCByZXF1ZXN0ID0gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZlRleHRWaWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCi0JCURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCWlmICh4bWxub2RlICE9IG51bGwpIHsKLQkJCWlmICh4bWxub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotCQkJCWRvYyA9IChEb2N1bWVudCkgeG1sbm9kZTsKLQkJCWVsc2UKLQkJCQlkb2MgPSB4bWxub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJfQotCQlTdHJpbmdbXSBkaXJlY3RpdmVOYW1lcyA9IHsicGFnZSIsICJpbmNsdWRlIiwgInRhZ2xpYiJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkvLyBzdWdnZXN0IEpTUCBFeHByZXNzaW9uIGluc2lkZSBvZiBYTUwgY29tbWVudHMKLQkJaWYgKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCAmJiAhaXNYTUxGb3JtYXQoZG9jKSkgewotCQkJaWYgKHJlcXVlc3QgPT0gbnVsbCkKLQkJCQlyZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QodHJlZU5vZGUsIHhtbG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcXVlc3QuYWRkUHJvcG9zYWwobmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiPCU9ICAlPiIsIGRvY3VtZW50UG9zaXRpb24sIDAsIDQsIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpLCAianNwOmV4cHJlc3Npb24iLCBudWxsLCAiJmx0OyU9ICUmZ3Q7IiwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfSlNQKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfQotCQkvLyBoYW5kbGUgcHJvcG9zYWxzIGluIGFuZCBhcm91bmQgSlNQX0RJUkVDVElWRV9PUEVOIGFuZAotCQkvLyBKU1BfRElSRUNUSVZFX05BTUUKLQkJZWxzZSBpZiAoKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiAmJiBkb2N1bWVudFBvc2l0aW9uID49IHNkUmVnaW9uLmdldFRleHRFbmRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpIHx8IChjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUgJiYgZG9jdW1lbnRQb3NpdGlvbiA8PSBzZFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKSkgewotCQkJaWYgKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTikgewotCQkJCWlmIChyZXF1ZXN0ID09IG51bGwpCi0JCQkJCXJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdCh4bWxub2RlLCB4bWxub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCUl0ZXJhdG9yIHJlZ2lvbnMgPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCQlTdHJpbmcgbmFtZVN0cmluZyA9IG51bGw7Ci0JCQkJaW50IGJlZ2luID0gcmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKTsKLQkJCQlpbnQgbGVuZ3RoID0gcmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpOwotCQkJCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQkJCW5hbWVTdHJpbmcgPSBzZFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJCQliZWdpbiA9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCQlsZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG5hbWVTdHJpbmcgPT0gbnVsbCkKLQkJCQkJbmFtZVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3RpdmVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZGlyZWN0aXZlTmFtZXNbaV0uc3RhcnRzV2l0aChuYW1lU3RyaW5nKSB8fCBkb2N1bWVudFBvc2l0aW9uIDw9IGJlZ2luKQotCQkJCQkJcmVxdWVzdC5hZGRQcm9wb3NhbChuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKGRpcmVjdGl2ZU5hbWVzW2ldLCBiZWdpbiwgbGVuZ3RoLCBkaXJlY3RpdmVOYW1lc1tpXS5sZW5ndGgoKSwgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyksIGRpcmVjdGl2ZU5hbWVzW2ldLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9KU1ApKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsgLy8gYnkgZGVmYXVsdCwgSlNQX0RJUkVDVElWRV9OQU1FCi0JCQkJaWYgKHJlcXVlc3QgPT0gbnVsbCkKLQkJCQkJcmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KHhtbG5vZGUsIHhtbG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSwgY29tcGxldGlvblJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdGl2ZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChkaXJlY3RpdmVOYW1lc1tpXS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nKSkKLQkJCQkJCXJlcXVlc3QuYWRkUHJvcG9zYWwobmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChkaXJlY3RpdmVOYW1lc1tpXSwgcmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgcmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBkaXJlY3RpdmVOYW1lc1tpXS5sZW5ndGgoKSwgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyksIGRpcmVjdGl2ZU5hbWVzW2ldLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9KU1ApKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSAmJiBkb2N1bWVudFBvc2l0aW9uID4gc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgfHwgKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UgJiYgZG9jdW1lbnRQb3NpdGlvbiA8PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkpIHsKLQkJCWlmIChyZXF1ZXN0ID09IG51bGwpCi0JCQkJcmVxdWVzdCA9IGNvbXB1dGVBdHRyaWJ1dGVQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCXN1cGVyLmFkZFRhZ0Nsb3NlUHJvcG9zYWxzKHJlcXVlc3QpOwotCQkJLy8gQ01WQyAyNzQwMzMsIHRoaXMgaXMgYmVpbmcgYWRkZWQgZm9yIGFsbCA8anNwOiogdGFncwotCQkJLy8gaW4gYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCkKLQkJCS8vIHN1cGVyLmFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMocmVxdWVzdCk7Ci0JCX0KLQkJLy8gbm8gbmFtZT86IDwlQCAlPgotCQllbHNlIGlmIChjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFICYmIGRvY3VtZW50UG9zaXRpb24gPD0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpIHsKLQkJCWlmIChyZXF1ZXN0ICE9IG51bGwpCi0JCQkJcmVxdWVzdCA9IGNvbXB1dGVBdHRyaWJ1dGVQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCUl0ZXJhdG9yIHJlZ2lvbnMgPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCVN0cmluZyBuYW1lU3RyaW5nID0gbnVsbDsKLQkJCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJCW5hbWVTdHJpbmcgPSBzZFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChuYW1lU3RyaW5nID09IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdGl2ZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXJlcXVlc3QuYWRkUHJvcG9zYWwobmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChkaXJlY3RpdmVOYW1lc1tpXSwgcmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgcmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBkaXJlY3RpdmVOYW1lc1tpXS5sZW5ndGgoKSwgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyksIGRpcmVjdGl2ZU5hbWVzW2ldLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9KU1ApKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBidWcxMTU5MjcgdXNlIG9yaWdpbmFsIGRvY3VtZW50IHBvc2l0aW9uIGZvciBhbGwvYW55IHJlZ2lvbgotCQkvLyB0ZW1wbGF0ZXMKLQkJYWRkVGVtcGxhdGVzKHJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuQUxMLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJcmV0dXJuIHJlcXVlc3Q7Ci0JfQotCi0JcHJpdmF0ZSBKU1BUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZlRlbXBsYXRlUHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVByb2Nlc3NvciA9IG5ldyBKU1BUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlUHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGVtcGxhdGVzIHRvIHRoZSBsaXN0IG9mIHByb3Bvc2FscwotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRlbXBsYXRlcyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgU3RyaW5nIGNvbnRleHQpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0ZW1wbGF0ZXMgdG8gdGhlIGxpc3Qgb2YgcHJvcG9zYWxzCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRBc3Npc3RSZXF1ZXN0Ci0JICogQHBhcmFtIGNvbnRleHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVGVtcGxhdGVzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0T2Zmc2V0KSB7Ci0JCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGlmIGFscmVhZHkgYWRkaW5nIHRlbXBsYXRlIHByb3Bvc2FscyBmb3IgYSBjZXJ0YWluIGNvbnRleHQgdHlwZSwgZG8KLQkJLy8gbm90IGFkZCBhZ2FpbgotCQlpZiAoIWZUZW1wbGF0ZUNvbnRleHRzLmNvbnRhaW5zKGNvbnRleHQpKSB7Ci0JCQlmVGVtcGxhdGVDb250ZXh0cy5hZGQoY29udGV4dCk7Ci0JCQlib29sZWFuIHVzZVByb3Bvc2FsTGlzdCA9ICFjb250ZW50QXNzaXN0UmVxdWVzdC5zaG91bGRTZXBhcmF0ZSgpOwotCi0JCQlpZiAoZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgIT0gbnVsbCkgewotCQkJCWdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpLnNldENvbnRleHRUeXBlKGNvbnRleHQpOwotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhmVGV4dFZpZXdlciwgc3RhcnRPZmZzZXQpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcG9zYWxzLmxlbmd0aDsgKytpKSB7Ci0JCQkJCWlmICh1c2VQcm9wb3NhbExpc3QpCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbHNbaV0pOwotCQkJCQllbHNlCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRNYWNybyhwcm9wb3NhbHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVudGl0eVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGRvY3VtZW50UG9zaXRpb24sIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlKSB7Ci0JCS8vIGlnbm9yZQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ0luc2VydGlvblByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGNoaWxkUG9zaXRpb24pIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLlRBRyk7Ci0JCS8vZG9uJ3QgbmVlZCB0byBjYWxsIHN1cGVyIGhlcmUgYmVjYXVzZSBvdGhlcndpc2Ugd2UgZHVwbGljYXRlIHdoYXQgdGhlIEhUTUxDT250ZW50QXNzaXN0UHJvY2Vzc29yIHRoYXQgaXMgcnVubmluZyBpcyBhbHJlYWR5IGRvaW5nCi0JfQotCi0JLyoqCi0JICogVXNlIHRoZSBlbWJlZGRlZCBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3IgdG8gZGV0ZXJtaW5lIHRoZSBjb250ZW50IGdlbmVyYXRvcgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb250ZW50R2VuZXJhdG9yKCkKLQkgKi8KLQlwdWJsaWMgWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yIGdldENvbnRlbnRHZW5lcmF0b3IoKSB7Ci0JCWlmIChmR2VuZXJhdG9yID09IG51bGwpIHsKLQkJCWZHZW5lcmF0b3IgPSAoKEFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvcikgZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLmdldChJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKSkuZ2V0Q29udGVudEdlbmVyYXRvcigpOwotCQl9Ci0JCXJldHVybiBmR2VuZXJhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUER1bW15Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRHVtbXlDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMTRlY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRHVtbXlDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkRlZmF1bHRYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgIm51bGwiIHZlcnNpb24gb2YgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yCi0gKiAKLSAqIEBkZXByZWNhdGVkIFRoaXMgY2xhc3MgaXMgbm8gbG9uZ2VyIHVzZWQgbG9jYWxseSBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUKLSAqIEBzZWUgRGVmYXVsdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BEdW1teUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZXh0ZW5kcyBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJc3VwZXIuYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJc3VwZXIuYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tbWVudFByb3Bvc2FsKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCXN1cGVyLmFkZENvbW1lbnRQcm9wb3NhbChjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50KExpc3QgY29udGVudExpc3QsIENNQ29udGVudCBjb250ZW50KSB7Ci0JCXN1cGVyLmFkZENvbnRlbnQoY29udGVudExpc3QsIGNvbnRlbnQpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRG9jVHlwZVByb3Bvc2FsKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCXN1cGVyLmFkZERvY1R5cGVQcm9wb3NhbChjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCXN1cGVyLmFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW5kVGFnTmFtZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlzdXBlci5hZGRFbmRUYWdOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVuZFRhZ1Byb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlzdXBlci5hZGRFbmRUYWdQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW50aXR5UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgZG9jdW1lbnRQb3NpdGlvbiwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgdHJlZU5vZGUpIHsKLQkJc3VwZXIuYWRkRW50aXR5UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBkb2N1bWVudFBvc2l0aW9uLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbnRpdHlQcm9wb3NhbHMoVmVjdG9yIHByb3Bvc2FscywgUHJvcGVydGllcyBtYXAsIFN0cmluZyBrZXksIGludCBub2RlT2Zmc2V0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbikgewotCQlzdXBlci5hZGRFbnRpdHlQcm9wb3NhbHMocHJvcG9zYWxzLCBtYXAsIGtleSwgbm9kZU9mZnNldCwgcGFyZW50LCBjb21wbGV0aW9uUmVnaW9uKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFBDREFUQVByb3Bvc2FsKFN0cmluZyBub2RlTmFtZSwgQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJc3VwZXIuYWRkUENEQVRBUHJvcG9zYWwobm9kZU5hbWUsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJc3VwZXIuYWRkU3RhcnREb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdDbG9zZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlzdXBlci5hZGRUYWdDbG9zZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0JCXN1cGVyLmFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY2hpbGRQb3NpdGlvbik7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgY2hpbGRQb3NpdGlvbikgewotCQlzdXBlci5hZGRUYWdOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjaGlsZFBvc2l0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdHRyaWJ1dGVJbkxpc3QoSURPTU5vZGUgbm9kZSwgTm9kZSBwYXJlbnQsIENNTm9kZSBjbW5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmF0dHJpYnV0ZUluTGlzdChub2RlLCBwYXJlbnQsIGNtbm9kZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiZWdpbnNXaXRoKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBzdXBlci5iZWdpbnNXaXRoKGFTdHJpbmcsIHByZWZpeCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUF0dHJpYnV0ZVByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVBdHRyaWJ1dGVQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIG5vZGVBdE9mZnNldCwgbm9kZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCBub2RlQXRPZmZzZXQsIG5vZGUpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlLCBJRE9NTm9kZSB4bWxub2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCX0KLQotCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUNvbnRlbnRQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlQ29udGVudFByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgbm9kZUF0T2Zmc2V0LCBub2RlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbltdIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24odmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVFbmRUYWdPcGVuUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUVuZFRhZ09wZW5Qcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIG5vZGVBdE9mZnNldCwgbm9kZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVFbnRpdHlSZWZlcmVuY2VQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlRW50aXR5UmVmZXJlbmNlUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUVxdWFsc1Byb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVFcXVhbHNQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIG5vZGVBdE9mZnNldCwgbm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVTdGFydERvY3VtZW50UHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZVN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIG5vZGVBdE9mZnNldCwgbm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVUYWdDbG9zZVByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVUYWdDbG9zZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgbm9kZUF0T2Zmc2V0LCBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVRhZ05hbWVQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlVGFnTmFtZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgbm9kZUF0T2Zmc2V0LCBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVRhZ09wZW5Qcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlVGFnT3BlblByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgbm9kZUF0T2Zmc2V0LCBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFkZGl0aW9uYWxJbmZvKENNTm9kZSBwYXJlbnRPck93bmVyLCBDTU5vZGUgY21ub2RlKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBZGRpdGlvbmFsSW5mbyhwYXJlbnRPck93bmVyLCBjbW5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEF2YWlsYWJsZUNoaWxkcmVuQXRJbmRleChFbGVtZW50IHBhcmVudCwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZykgewotCQlyZXR1cm4gc3VwZXIuZ2V0QXZhaWxhYmxlQ2hpbGRyZW5BdEluZGV4KHBhcmVudCwgaW5kZXgsIHZhbGlkaXR5Q2hlY2tpbmcpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEF2YWlsYWJsZVJvb3RDaGlsZHJlbihEb2N1bWVudCBkb2N1bWVudCwgaW50IGNoaWxkSW5kZXgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEF2YWlsYWJsZVJvb3RDaGlsZHJlbihkb2N1bWVudCwgY2hpbGRJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24obm9kZSk7Ci0JfQotCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0Q29tcGxldGlvblJlZ2lvbihpbnQgb2Zmc2V0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDb21wbGV0aW9uUmVnaW9uKG9mZnNldCwgZmxhdE5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBnZXRDb21wbGV0aW9uUmVnaW9uKGludCBkb2N1bWVudFBvc2l0aW9uLCBOb2RlIGRvbW5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbXBsZXRpb25SZWdpb24oZG9jdW1lbnRQb3NpdGlvbiwgZG9tbm9kZSk7Ci0JfQotCi0JcHVibGljIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvciBnZXRDb250ZW50R2VuZXJhdG9yKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudEdlbmVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCk7Ci0JfQotCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRFbGVtZW50UG9zaXRpb24oTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0RWxlbWVudFBvc2l0aW9uKGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRFcnJvck1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXRjaFN0cmluZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgSVRleHRSZWdpb24gYVJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TWF0Y2hTdHJpbmcocGFyZW50LCBhUmVnaW9uLCBvZmZzZXQpOwotCX0KLQotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE5hbWVSZWdpb24oZmxhdE5vZGUpOwotCX0KLQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhOb2RlIG5vZGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMobm9kZSwgYWQpOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXF1aXJlZE5hbWUoTm9kZSBwYXJlbnRPck93bmVyLCBDTU5vZGUgY21ub2RlKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXF1aXJlZE5hbWUocGFyZW50T3JPd25lciwgY21ub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlcXVpcmVkVGV4dChOb2RlIHBhcmVudE9yT3duZXIsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlcXVpcmVkVGV4dChwYXJlbnRPck93bmVyLCBhdHRyRGVjbCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXF1aXJlZFRleHQoTm9kZSBwYXJlbnRPck93bmVyLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVxdWlyZWRUZXh0KHBhcmVudE9yT3duZXIsIGVsZW1lbnREZWNsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRWYWxpZENoaWxkRWxlbWVudERlY2xhcmF0aW9ucyhFbGVtZW50IHBhcmVudCwgaW50IGNoaWxkUG9zaXRpb24sIGludCBraW5kT2ZBY3Rpb24pIHsKLQkJcmV0dXJuIHN1cGVyLmdldFZhbGlkQ2hpbGRFbGVtZW50RGVjbGFyYXRpb25zKHBhcmVudCwgY2hpbGRQb3NpdGlvbiwga2luZE9mQWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDbG9zZVJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIHN1cGVyLmlzQ2xvc2VSZWdpb24ocmVnaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05hbWVSZWdpb24oSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiBzdXBlci5pc05hbWVSZWdpb24ocmVnaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1F1b3RlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN1cGVyLmlzUXVvdGUoc3RyaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydGllcyBtYXBUb1Byb3BlcnRpZXMoQ01OYW1lZE5vZGVNYXAgbWFwKSB7Ci0JCXJldHVybiBzdXBlci5tYXBUb1Byb3BlcnRpZXMobWFwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSwgU3RyaW5nIGFwcGVuZCkgewotCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlLCBhcHBlbmQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlLCBTdHJpbmcgcHJlcGVuZCwgU3RyaW5nIGFwcGVuZCkgewotCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlLCBwcmVwZW5kLCBhcHBlbmQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHN0cmluZ3NFcXVhbChTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLQkJcmV0dXJuIHN1cGVyLnN0cmluZ3NFcXVhbChhLCBiKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEVMQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRUxDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMzJiM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRUxDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBUaGlzIGNsYXNzIGlzIG5vIGxvbmdlciB1c2VkIGxvY2FsbHkgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BFTENvbXBsZXRpb25Qcm9jZXNzb3IgZXh0ZW5kcyBKU1BDb21wbGV0aW9uUHJvY2Vzc29yIHsKLQlwcm90ZWN0ZWQgSlNQUHJvcG9zYWxDb2xsZWN0b3IgZ2V0UHJvcG9zYWxDb2xsZWN0b3IoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24pIHsKLQkJcmV0dXJuIG5ldyBKU1BFTFByb3Bvc2FsQ29sbGVjdG9yKGN1LCB0cmFuc2xhdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBqYXZhIHBvc2l0aW9uIG9mZnNldCBuZWVkcyB0byBiZSBzaGlmdGVkIDMgZm9yIHRoZSAiZ2V0IiBpbiB0aGUgamF2YQotCSAqIHByb3Bvc2FsIG1hcHBlZCB0byBhIGdpdmVuIEpTUCBFTCBwcm9wb3NhbAotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgcG9zKSB7Ci0JCS8vMyBmb3IgdGhlICJnZXQiIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGphdmEgcHJvcG9zYWwKLQkJcmV0dXJuIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgcG9zLCAzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BFTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BFTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwOWJhYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLkNNRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRhZ2xpYlRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuSlNQRUxQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuU2ltcGxlQ2hhclN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5Ub2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci0KLS8qKgotICogPHA+Q29tcHV0ZSBKU1AgRUwgY29tcGxldGlvbiBwcm9wb3NhbHM8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BFTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIGV4dGVuZHMKLQkJSlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIHsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5KU1BKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscygKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCUlUZXh0Vmlld2VyIHZpZXdlciA9IGNvbnRleHQuZ2V0Vmlld2VyKCk7Ci0JCWludCBkb2N1bWVudFBvc2l0aW9uID0gY29udGV4dC5nZXRJbnZvY2F0aW9uT2Zmc2V0KCk7Ci0KLQkJLy8gZ2V0IHJlc3VsdHMgZnJvbSBKU1AgY29tcGxldGlvbiBwcm9jZXNzb3IKLQkJLy8zIGZvciB0aGUgImdldCIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgamF2YSBwcm9wb3NhbAotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KGNvbXB1dGVKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24sIDMpKTsKLQotCQkvL2dldCB0aGUgZnVuY3Rpb24gcHJvcG9zYWxzIGZvciBzeW50YXggbGlrZTogJHsgZm46fCB9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdCA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKGZsYXQgIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb24gY3Vyc29yUmVnaW9uID0gZmxhdC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uKTsKLQkJCVN0cmluZyBlbFRleHQ7Ci0JCQlpbnQgc3RhcnRPZmZzZXQ7Ci0JCQkvL2lmIGNvbnRhaW5lciB0aGVuIG5lZWQgdG8gZ2V0IGlubmVyIHJlZ2lvbgotCQkJLy9lbHNlIGNhbiB1c2UgZmxhdCByZWdpb24KLQkJCWlmIChjdXJzb3JSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCUlUZXh0UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgY3Vyc29yUmVnaW9uOwotCQkJCWN1cnNvclJlZ2lvbiA9IGNvbnRhaW5lci5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQllbFRleHQgPSBjb250YWluZXIuZ2V0VGV4dChjdXJzb3JSZWdpb24pOwotCQkJCXN0YXJ0T2Zmc2V0ID0gY29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KGN1cnNvclJlZ2lvbik7Ci0JCQl9IGVsc2UgewotCQkJCWVsVGV4dCA9IGZsYXQuZ2V0VGV4dChjdXJzb3JSZWdpb24pOwotCQkJCXN0YXJ0T2Zmc2V0ID0gZmxhdC5nZXRTdGFydE9mZnNldChjdXJzb3JSZWdpb24pOwotCQkJfQotCQkJCi0JCQkvL3Nhbml0eSBjaGVjayB0aGF0IHdlIGFyZSBhY3R1YWxseSBpbiBFTCByZWdpb24KLQkJCWlmIChjdXJzb3JSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9DT05URU5UKSB7Ci0JCQkJU3RyaW5nIHByZWZpeCA9IGdldFByZWZpeChkb2N1bWVudFBvc2l0aW9uIC0gc3RhcnRPZmZzZXQsIGVsVGV4dCk7Ci0JCQkJaWYgKG51bGwgIT0gcHJlZml4KSB7Ci0JCQkJCUxpc3QgcHJvcG9zYWxzID0gZ2V0RnVuY3Rpb25Qcm9wb3NhbHMocHJlZml4LCB2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQlyZXN1bHRzLmFkZEFsbChwcm9wb3NhbHMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHRzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5KU1BKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjZ2V0UHJvcG9zYWxDb2xsZWN0b3IoCi0JICogCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0LCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgSlNQUHJvcG9zYWxDb2xsZWN0b3IgZ2V0UHJvcG9zYWxDb2xsZWN0b3IoSUNvbXBpbGF0aW9uVW5pdCBjdSwKLQkJCUpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uKSB7Ci0JCQotCQlyZXR1cm4gbmV3IEpTUEVMUHJvcG9zYWxDb2xsZWN0b3IoY3UsIHRyYW5zbGF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD5HZXRzIHRoZSBFTCBwcmVmaXggZnJvbSB0aGUgcmVsYXRpdmUgcG9zaXRpb24gYW5kIHRoZSBnaXZlbiBFTCB0ZXh0PC9wPgotCSAqIAotCSAqIEBwYXJhbSByZWxhdGl2ZVBvc2l0aW9uCi0JICogQHBhcmFtIGVsVGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVmaXgoaW50IHJlbGF0aXZlUG9zaXRpb24sIFN0cmluZyBlbFRleHQpIHsKLQkJamF2YS5pby5TdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKGVsVGV4dCk7Ci0JCUpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyIHNjYW5uZXIgPSBuZXcgSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIobmV3IFNpbXBsZUNoYXJTdHJlYW0ocmVhZGVyLCAxLCAxKSk7Ci0JCVRva2VuIGN1clRva2VuID0gbnVsbCwgbGFzdElkZW50aWZpZXIgPSBudWxsOwotCQl3aGlsZSAoSlNQRUxQYXJzZXJDb25zdGFudHMuRU9GICE9IChjdXJUb2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpLmtpbmQpIHsKLQkJCWlmIChKU1BFTFBhcnNlckNvbnN0YW50cy5DT0xPTiA9PSBjdXJUb2tlbi5raW5kICYmIGN1clRva2VuLmVuZENvbHVtbiA9PSByZWxhdGl2ZVBvc2l0aW9uICYmIG51bGwgIT0gbGFzdElkZW50aWZpZXIpIHsKLQkJCQlyZXR1cm4gKGxhc3RJZGVudGlmaWVyLmltYWdlKTsKLQkJCX0KLQotCQkJaWYgKEpTUEVMUGFyc2VyQ29uc3RhbnRzLklERU5USUZJRVIgPT0gY3VyVG9rZW4ua2luZCkgewotCQkJCWxhc3RJZGVudGlmaWVyID0gY3VyVG9rZW47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlsYXN0SWRlbnRpZmllciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+R2V0IHRoZSBFTCBmdW5jdGlvbiBwcm9wb3NhbHMsIGV4OiAke2ZuOnwgfTwvcD4KLQkgKiBAcGFyYW0gcHJlZml4Ci0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEZ1bmN0aW9uUHJvcG9zYWxzKFN0cmluZyBwcmVmaXgsIElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlUTERDTURvY3VtZW50TWFuYWdlciBkb2NNZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKHZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJQXJyYXlMaXN0IGNvbXBsZXRpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZG9jTWdyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJdGVyYXRvciB0YWdsaWJzID0gZG9jTWdyLmdldENNRG9jdW1lbnRUcmFja2VycyhvZmZzZXQpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlICh0YWdsaWJzLmhhc05leHQoKSkgewotCQkJVGFnbGliVHJhY2tlciB0cmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpIHRhZ2xpYnMubmV4dCgpOwotCQkJaWYgKHRyYWNrZXIuZ2V0UHJlZml4KCkuZXF1YWxzKHByZWZpeCkpIHsKLQkJCQlDTURvY3VtZW50SW1wbCBkb2MgPSAoQ01Eb2N1bWVudEltcGwpIHRyYWNrZXIuZ2V0RG9jdW1lbnQoKTsKLQotCQkJCUxpc3QgZnVuY3Rpb25zID0gZG9jLmdldEZ1bmN0aW9ucygpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBmdW5jdGlvbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlUTERGdW5jdGlvbiBmdW5jdGlvbiA9IChUTERGdW5jdGlvbikgaXQubmV4dCgpOwotCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKGZ1bmN0aW9uLmdldE5hbWUoKSArICIoKSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJb2Zmc2V0LCAwLCBmdW5jdGlvbi5nZXROYW1lKCkubGVuZ3RoKCkgKyAxLCBudWxsLCBmdW5jdGlvbi5nZXROYW1lKCkgKyAiIC0gIiArIGZ1bmN0aW9uLmdldFNpZ25hdHVyZSgpLCBudWxsLCBudWxsLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCWNvbXBsZXRpb25MaXN0LmFkZChwcm9wb3NhbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb21wbGV0aW9uTGlzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BFTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEVMQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmM2YzU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEVMQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLkNNRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRhZ2xpYlRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuQVNURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5BU1RGdW5jdGlvbkludm9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuRmluZEZ1bmN0aW9uSW52b2NhdGlvblZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuSlNQRUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuSlNQRUxQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuU2ltcGxlQ2hhclN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5Ub2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyBpcyBubyBsb25nZXIgdXNlZCBsb2NhbGx5IGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZQotICovCi1wdWJsaWMgY2xhc3MgSlNQRUxDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewotCXByb3RlY3RlZCBjaGFyIGVsQ29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzW10gPSBuZXcgY2hhcltdeycuJywgJzonfTsKLQotCXByb3RlY3RlZCBKU1BDb21wbGV0aW9uUHJvY2Vzc29yIGdldEpzcENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChmSnNwQ29tcGxldGlvblByb2Nlc3NvciA9PSBudWxsKSB7Ci0JCQlmSnNwQ29tcGxldGlvblByb2Nlc3NvciA9IG5ldyBKU1BFTENvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZkpzcENvbXBsZXRpb25Qcm9jZXNzb3I7Ci0JfQotCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0KLQotCQkvLyBnZXQgcmVzdWx0cyBmcm9tIEpTUCBjb21wbGV0aW9uIHByb2Nlc3NvcgotCQlmSnNwQ29tcGxldGlvblByb2Nlc3NvciA9IGdldEpzcENvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHJlc3VsdHMgPSBmSnNwQ29tcGxldGlvblByb2Nlc3Nvci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQlmRXJyb3JNZXNzYWdlID0gZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCWlmIChyZXN1bHRzLmxlbmd0aCA9PSAwICYmIChmRXJyb3JNZXNzYWdlID09IG51bGwgfHwgZkVycm9yTWVzc2FnZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJZkVycm9yTWVzc2FnZSA9IFVOS05PV05fQ09OVEVYVDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdCA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCi0JCWlmIChmbGF0ICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uIGN1cnNvclJlZ2lvbiA9IGZsYXQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQlpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSA9PSBjdXJzb3JSZWdpb24uZ2V0VHlwZSgpKSB7Ci0JCQkJSVRleHRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKElUZXh0UmVnaW9uQ29udGFpbmVyKSBjdXJzb3JSZWdpb247Ci0JCQkJY3Vyc29yUmVnaW9uID0gY29udGFpbmVyLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pOwotCQkJCWlmIChjdXJzb3JSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9DT05URU5UKSB7Ci0JCQkJCVN0cmluZyBlbFRleHQgPSBjb250YWluZXIuZ2V0VGV4dChjdXJzb3JSZWdpb24pLnRyaW0oKTsKLQkJCQkJU3RyaW5nIHByZWZpeCA9IGdldFByZWZpeChkb2N1bWVudFBvc2l0aW9uIC0gY29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KGN1cnNvclJlZ2lvbikgLSAxLCBlbFRleHQpOwotCQkJCQlpZiAobnVsbCAhPSBwcmVmaXgpIHsKLQkJCQkJCUxpc3QgcHJvcG9zYWxzID0gZ2V0RnVuY3Rpb25Qcm9wb3NhbHMocHJlZml4LCAoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQlyZXN1bHRzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLnNpemUoKV07Ci0JCQkJCQlwcm9wb3NhbHMudG9BcnJheShyZXN1bHRzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmaXgoaW50IHJlbGF0aXZlUG9zaXRpb24sIFN0cmluZyBlbFRleHQpIHsKLQkJamF2YS5pby5TdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKGVsVGV4dCk7Ci0JCUpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyIHNjYW5uZXIgPSBuZXcgSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIobmV3IFNpbXBsZUNoYXJTdHJlYW0ocmVhZGVyLCAxLCAxKSk7Ci0JCVRva2VuIGN1clRva2VuID0gbnVsbCwgbGFzdElkZW50aWZpZXIgPSBudWxsOwotCQl3aGlsZSAoSlNQRUxQYXJzZXJDb25zdGFudHMuRU9GICE9IChjdXJUb2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpLmtpbmQpIHsKLQkJCWlmIChKU1BFTFBhcnNlckNvbnN0YW50cy5DT0xPTiA9PSBjdXJUb2tlbi5raW5kICYmIGN1clRva2VuLmVuZENvbHVtbiA9PSByZWxhdGl2ZVBvc2l0aW9uICYmIG51bGwgIT0gbGFzdElkZW50aWZpZXIpIHsKLQkJCQlyZXR1cm4gKGxhc3RJZGVudGlmaWVyLmltYWdlKTsKLQkJCX0KLQotCQkJaWYgKEpTUEVMUGFyc2VyQ29uc3RhbnRzLklERU5USUZJRVIgPT0gY3VyVG9rZW4ua2luZCkgewotCQkJCWxhc3RJZGVudGlmaWVyID0gY3VyVG9rZW47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlsYXN0SWRlbnRpZmllciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEFTVEZ1bmN0aW9uSW52b2NhdGlvbiBnZXRJbnZvY2F0aW9uKGludCByZWxhdGl2ZVBvc2l0aW9uLCBTdHJpbmcgZWxUZXh0KSB7Ci0JCUZpbmRGdW5jdGlvbkludm9jYXRpb25WaXNpdG9yIHZpc2l0b3IgPSBuZXcgRmluZEZ1bmN0aW9uSW52b2NhdGlvblZpc2l0b3IocmVsYXRpdmVQb3NpdGlvbik7Ci0JCUpTUEVMUGFyc2VyIHBhcnNlciA9IEpTUEVMUGFyc2VyLmNyZWF0ZVBhcnNlcihlbFRleHQpOwotCQl0cnkgewotCQkJQVNURXhwcmVzc2lvbiBleHByZXNzaW9uID0gcGFyc2VyLkV4cHJlc3Npb24oKTsKLQkJCXJldHVybiAoQVNURnVuY3Rpb25JbnZvY2F0aW9uKSBleHByZXNzaW9uLmpqdEFjY2VwdCh2aXNpdG9yLCBudWxsKTsKLQkJfQotCQljYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeyAvKiBwYXJzZSBleGNlcHRpb24gPSBubyBjb21wbGV0aW9uICovCi0JCX0KLQkJcmV0dXJuIChudWxsKTsKLQl9Ci0KLQotCXB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gZWxDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnM7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0RnVuY3Rpb25Qcm9wb3NhbHMoU3RyaW5nIHByZWZpeCwgU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCVRMRENNRG9jdW1lbnRNYW5hZ2VyIGRvY01nciA9IFRhZ2xpYkNvbnRyb2xsZXIuZ2V0VExEQ01Eb2N1bWVudE1hbmFnZXIodmlld2VyLmdldERvY3VtZW50KCkpOwotCQlBcnJheUxpc3QgY29tcGxldGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChkb2NNZ3IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUl0ZXJhdG9yIHRhZ2xpYnMgPSBkb2NNZ3IuZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKG9mZnNldCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHRhZ2xpYnMuaGFzTmV4dCgpKSB7Ci0JCQlUYWdsaWJUcmFja2VyIHRyYWNrZXIgPSAoVGFnbGliVHJhY2tlcikgdGFnbGlicy5uZXh0KCk7Ci0JCQlpZiAodHJhY2tlci5nZXRQcmVmaXgoKS5lcXVhbHMocHJlZml4KSkgewotCQkJCUNNRG9jdW1lbnRJbXBsIGRvYyA9IChDTURvY3VtZW50SW1wbCkgdHJhY2tlci5nZXREb2N1bWVudCgpOwotCi0JCQkJTGlzdCBmdW5jdGlvbnMgPSBkb2MuZ2V0RnVuY3Rpb25zKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGZ1bmN0aW9ucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCVRMREZ1bmN0aW9uIGZ1bmN0aW9uID0gKFRMREZ1bmN0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoZnVuY3Rpb24uZ2V0TmFtZSgpICsgIigpIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlvZmZzZXQsIDAsIGZ1bmN0aW9uLmdldE5hbWUoKS5sZW5ndGgoKSArIDEsIG51bGwsIGZ1bmN0aW9uLmdldE5hbWUoKSArICIgLSAiICsgZnVuY3Rpb24uZ2V0U2lnbmF0dXJlKCksIG51bGwsIG51bGwsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJY29tcGxldGlvbkxpc3QuYWRkKHByb3Bvc2FsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbXBsZXRpb25MaXN0OwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEVMUHJvcG9zYWxDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEVMUHJvcG9zYWxDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM3YTAzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BFTFByb3Bvc2FsQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBKU1BFTFByb3Bvc2FsQ29sbGVjdG9yIGV4dGVuZHMgSlNQUHJvcG9zYWxDb2xsZWN0b3IgewotCi0JcHVibGljIEpTUEVMUHJvcG9zYWxDb2xsZWN0b3IoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24pIHsKLQkJc3VwZXIoY3UsIHRyYW5zbGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlSmF2YUNvbXBsZXRpb25Qcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwpIHsKLQkJSlNQQ29tcGxldGlvblByb3Bvc2FsIGpzcFByb3Bvc2FsID0gbnVsbDsKLQkJCi0JCWlmKG51bGwgPT0gcHJvcG9zYWwgfHwgbnVsbCA9PSBwcm9wb3NhbC5nZXROYW1lKCkpCi0JCQlyZXR1cm4obnVsbCk7Ci0JCQotCQlTdHJpbmcgcmF3TmFtZSA9IG5ldyBTdHJpbmcocHJvcG9zYWwuZ2V0TmFtZSgpKTsKLQkJU3RyaW5nIGNvbXBsZXRpb24gPSBudWxsOwotCQkKLQkJaWYocHJvcG9zYWwuZ2V0S2luZCgpID09IENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGICYmIHByb3Bvc2FsLmZpbmRQYXJhbWV0ZXJOYW1lcyhudWxsKS5sZW5ndGggPT0gMCkgewotCQkJaWYocmF3TmFtZS5sZW5ndGgoKSA+IDMgJiYgcmF3TmFtZS5zdGFydHNXaXRoKCJnZXQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJY29tcGxldGlvbiA9IHJhd05hbWUuc3Vic3RyaW5nKDMsNCkudG9Mb3dlckNhc2UoKSArIHJhd05hbWUuc3Vic3RyaW5nKDQsIHJhd05hbWUubGVuZ3RoKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJLy8gamF2YSBvZmZzZXQKLQkJCWludCBvZmZzZXQgPSBwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKTsKLQkJCQotCQkJLy8gcmVwbGFjZW1lbnQgbGVuZ3RoCi0JCQkvLy0zIGZvciAiZ2V0IiBwcmUgdGV4dCBvbiB0aGUgamF2YSBwcm9wb3NhbAotCQkJaW50IGxlbmd0aCA9IHByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSAtIG9mZnNldCAtIDM7Ci0JCQkKLQkJCS8vIHRyYW5zbGF0ZSBvZmZzZXQgZnJvbSBKYXZhID4gSlNQCi0JCQlvZmZzZXQgPSBnZXRUcmFuc2xhdGlvbigpLmdldEpzcE9mZnNldChvZmZzZXQpOwotCQkJCi0JCQkvLyBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgbXVzdCBiZSBjYWxjdWxhdGVkCi0JCQlpbnQgcG9zaXRpb25BZnRlciA9IG9mZnNldCArIGNvbXBsZXRpb24ubGVuZ3RoKCk7Ci0JCQkJCi0JCQkvLyBmcm9tIGphdmEgcHJvcG9zYWwKLQkJCUlKYXZhQ29tcGxldGlvblByb3Bvc2FsIGphdmFQcm9wb3NhbCA9IHN1cGVyLmNyZWF0ZUphdmFDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQkJU3RyaW5nIGxvbmdEaXNwbGF5U3RyaW5nID0gamF2YVByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKTsKLQkJCWludCBmaXN0U3BhY2VJbmRleCA9IGxvbmdEaXNwbGF5U3RyaW5nLmluZGV4T2YoJyAnKTsKLQkJCVN0cmluZyBzaG9ydERpc3BsYXlTdHJpbmcgPSBsb25nRGlzcGxheVN0cmluZzsKLQkJCQotCQkJaWYoZmlzdFNwYWNlSW5kZXggIT0gLTEpIHsKLQkJCQlzaG9ydERpc3BsYXlTdHJpbmcgPSBsb25nRGlzcGxheVN0cmluZy5zdWJzdHJpbmcoZmlzdFNwYWNlSW5kZXgpOwotCQkJfQotCQkJCQotCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBjb21wbGV0aW9uICsgIiAiICsgc2hvcnREaXNwbGF5U3RyaW5nOyAvLyROT04tTkxTLTEkCi0JCQlJQ29udGV4dEluZm9ybWF0aW9uIGNvbnRleHRJbmZvcm1hdGlvbiA9IGphdmFQcm9wb3NhbC5nZXRDb250ZXh0SW5mb3JtYXRpb24oKTsKLQkJCVN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IGphdmFQcm9wb3NhbC5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCQlpbnQgcmVsZXZhbmNlID0gamF2YVByb3Bvc2FsLmdldFJlbGV2YW5jZSgpOwotCQkJCi0JCQlib29sZWFuIHVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUgPSB0cnVlOwotCQkJCi0JCQlqc3BQcm9wb3NhbCA9IG5ldyBKU1BDb21wbGV0aW9uUHJvcG9zYWwoY29tcGxldGlvbiwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uQWZ0ZXIsIGltYWdlLCBkaXNwbGF5U3RyaW5nLCBjb250ZXh0SW5mb3JtYXRpb24sIGFkZGl0aW9uYWxJbmZvLCByZWxldmFuY2UsIHVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUpOwotCQkJCi0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0NDgzCi0JCQkvLyBzZXQgd3JhcHBlZCBqYXZhIHByb3Bvc2FsIHNvIGFkZGl0aW9uYWwgaW5mbyBjYW4gYmUgY2FsY3VsYXRlZCBvbiBkZW1hbmQKLQkJCWpzcFByb3Bvc2FsLnNldEphdmFDb21wbGV0aW9uUHJvcG9zYWwoamF2YVByb3Bvc2FsKTsKLQkJCQotCQkJcmV0dXJuIGpzcFByb3Bvc2FsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLS8vCXByb3RlY3RlZCB2b2lkIGFjY2VwdE1ldGhvZChjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsIGNoYXJbXSBuYW1lLCBjaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsIGNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcywgY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsIGNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsIGNoYXJbXSByZXR1cm5UeXBlTmFtZSwgY2hhcltdIGNvbXBsZXRpb25OYW1lLCBpbnQgbW9kaWZpZXJzLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCByZWxldmFuY2UpIHsKLS8vCQlTdHJpbmcgcmF3TmFtZSA9IFN0cmluZy52YWx1ZU9mKG5hbWUpOwotLy8JCWlmKHBhcmFtZXRlck5hbWVzLmxlbmd0aCA9PSAwICYmIHJhd05hbWUubGVuZ3RoKCkgPiAzICYmIHJhd05hbWUuc3RhcnRzV2l0aCgiZ2V0IikpCi0vLwkJewotLy8JCQlTdHJpbmcgbWFuZ2xlZE5hbWUgPSByYXdOYW1lLnN1YnN0cmluZygzLDQpLnRvTG93ZXJDYXNlKCkgKyByYXdOYW1lLnN1YnN0cmluZyg0LCByYXdOYW1lLmxlbmd0aCgpKTsKLS8vCQkJc3VwZXIuYWNjZXB0RmllbGQoZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBkZWNsYXJpbmdUeXBlTmFtZSwgbWFuZ2xlZE5hbWUudG9DaGFyQXJyYXkoKSwgcmV0dXJuVHlwZVBhY2thZ2VOYW1lLCByZXR1cm5UeXBlTmFtZSwgbWFuZ2xlZE5hbWUudG9DaGFyQXJyYXkoKSwgbW9kaWZpZXJzLCBzdGFydCwgZW5kLCByZWxldmFuY2UpOwotLy8JCX0KLS8vCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEltcG9ydENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BJbXBvcnRDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGJmYjdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEltcG9ydENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQ7Ci0KLS8qKgotICogPHA+R2VuZXJhdGVzIEpTUCBpbXBvcnQgY29tcGxldGlvbiBwcm9wb3NhbHM8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BJbXBvcnRDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciBleHRlbmRzCi0JCUpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5KU1BKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscygKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCUxpc3QgcHJvcG9zYWxzID0gY29tcHV0ZUphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGNvbnRleHQuZ2V0Vmlld2VyKCksIGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpLCAwKTsKLQkJTGlzdCBpbXBvcnRQcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KHByb3Bvc2Fscy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3Bvc2Fscy5zaXplKCk7IGkrKykgewotCQkJaWYgKHByb3Bvc2Fscy5nZXQoaSkgaW5zdGFuY2VvZiBKU1BDb21wbGV0aW9uUHJvcG9zYWwpIHsKLQotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWwgaW1wb3J0UHJvcG9zYWwgPSBhZGp1c3RJbXBvcnRQcm9wb3NhbCgoSlNQQ29tcGxldGlvblByb3Bvc2FsKSBwcm9wb3NhbHMuZ2V0KGkpKTsKLQkJCQlpbXBvcnRQcm9wb3NhbHMuYWRkKGltcG9ydFByb3Bvc2FsKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1wb3J0UHJvcG9zYWxzOwotCQkKLQl9Ci0KLQkvKioKLQkgKiA8cD5KU1AgaW1wb3J0IHByb3Bvc2FscyBuZWVkIHRvIGJlIGFkanVzdGVkLCB0aGlzIGRvZXMgdGhhdDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gaW1wb3J0UHJvcG9zYWwge0BsaW5rIEpTUENvbXBsZXRpb25Qcm9wb3NhbH0gdG8gYWRqdXN0Ci0JICogQHJldHVybiBhZGp1c3RlZCB7QGxpbmsgSUNvbXBsZXRpb25Qcm9wb3NhbH0KLQkgKi8KLQlwcml2YXRlIElDb21wbGV0aW9uUHJvcG9zYWwgYWRqdXN0SW1wb3J0UHJvcG9zYWwoSlNQQ29tcGxldGlvblByb3Bvc2FsIGltcG9ydFByb3Bvc2FsKSB7Ci0JCS8vIGp1c3QgbmVlZCB0byByZW1vdmUgdGhlICI7IgotCQkvLyBhbmQgYWRqdXN0IG9mZnNldHMgZm9yIHRoZSBjaGFuZ2UKLQkJU3RyaW5nIG5ld1JlcGxhY2U7Ci0JCWlmIChpbXBvcnRQcm9wb3NhbCBpbnN0YW5jZW9mIEF1dG9JbXBvcnRQcm9wb3NhbCl7Ci0JCQluZXdSZXBsYWNlID0oKEF1dG9JbXBvcnRQcm9wb3NhbClpbXBvcnRQcm9wb3NhbCkuZ2V0SW1wb3J0RGVjbGFyYXRpb24oKSAucmVwbGFjZUFsbCgiOyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZXsKLQkJCSBuZXdSZXBsYWNlID0gaW1wb3J0UHJvcG9zYWwuZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKS5yZXBsYWNlQWxsKCI7IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpbXBvcnRQcm9wb3NhbC5zZXRSZXBsYWNlbWVudFN0cmluZyhuZXdSZXBsYWNlKTsKLQotCQlTdHJpbmcgbmV3RGlzcGxheSA9IGltcG9ydFByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKS5yZXBsYWNlQWxsKCI7IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW1wb3J0UHJvcG9zYWwuc2V0RGlzcGxheVN0cmluZyhuZXdEaXNwbGF5KTsKLQotCQlpbnQgbmV3UmVwbGFjZW1lbnRMZW5ndGggPSBpbXBvcnRQcm9wb3NhbC5nZXRSZXBsYWNlbWVudExlbmd0aCgpIC0gMTsKLQkJaWYgKG5ld1JlcGxhY2VtZW50TGVuZ3RoID49IDApIHsKLQkJCWltcG9ydFByb3Bvc2FsLnNldFJlcGxhY2VtZW50TGVuZ3RoKG5ld1JlcGxhY2VtZW50TGVuZ3RoKTsKLQkJfQotCi0JCWludCBuZXdDdXJzb3JQb3NpdGlvbiA9IGltcG9ydFByb3Bvc2FsLmdldEN1cnNvclBvc2l0aW9uKCkgLSAxOwotCQlpbXBvcnRQcm9wb3NhbC5zZXRDdXJzb3JQb3NpdGlvbihuZXdDdXJzb3JQb3NpdGlvbik7Ci0KLQkJcmV0dXJuIGltcG9ydFByb3Bvc2FsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2ZGMxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLldvcmtpbmdDb3B5T3duZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXJFeHRlbnNpb241OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5JSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXh0LklKU1BQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkRlZmF1bHRYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MQ29udGVudEFzc2lzdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MUmVsZXZhbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5TaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIDxwPkdlbmVyYXRlcyBKYXZhIHByb3Bvc2FscyBmb3IgSlNQIGRvY3VtZW50czwvcD4KLSAqIAotICogQGJhc2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkpTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgZXh0ZW5kcyBEZWZhdWx0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKRFRfQ09SRV9QTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKiogVGhlIHRyYW5zbGF0aW9uIGFkYXB0ZXIgdXNlZCB0byBjcmVhdGUgdGhlIEphdmEgcHJvcG9zYWxzICovCi0JcHJpdmF0ZSBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgZlRyYW5zbGF0aW9uQWRhcHRlciA9IG51bGw7Ci0JCi0JLyoqIHRyYW5zbGF0aW9uIGFkYXB0ZXIgbWF5IGJlIHN0YWxlLCBjaGVjayB0aGUgbW9kZWwgaWQgKi8KLQlwcml2YXRlIFN0cmluZyBmTW9kZWxJZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGNvbXB1dGVyCi0JICovCi0JcHVibGljIEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcigpIHsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuRGVmYXVsdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI3Nlc3Npb25FbmRlZCgpCi0JICovCi0JcHVibGljIHZvaWQgc2Vzc2lvbkVuZGVkKCkgewotCQlmVHJhbnNsYXRpb25BZGFwdGVyID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD5SZXR1cm4gYSBsaXN0IG9mIHByb3Bvc2VkIGNvZGUgY29tcGxldGlvbnMgYmFzZWQgb24gdGhlIHNwZWNpZmllZAotCSAqIGxvY2F0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBjdXJzb3IKLQkgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIHRleHQtZWRpdG9yIGNvbnRyb2wuPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscygKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCWlmKGlzVmFsaWRDb250ZXh0KGNvbnRleHQpKSB7Ci0JCQlJVGV4dFZpZXdlciB2aWV3ZXIgPSBjb250ZXh0LmdldFZpZXdlcigpOwotCQkJaW50IGRvY3VtZW50UG9zaXRpb24gPSBjb250ZXh0LmdldEludm9jYXRpb25PZmZzZXQoKTsKLQkJCUluZGV4ZWRSZWdpb24gdHJlZU5vZGUgPSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkKLQkJCS8vIGdldCByZXN1bHRzIGZyb20gSlNQIGNvbXBsZXRpb24gcHJvY2Vzc29yCi0JCQlyZXN1bHRzID0gY29tcHV0ZUphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbiwgMCk7Ci0KLQkJCUlET01Ob2RlIHhOb2RlID0gbnVsbDsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdCA9IG51bGw7Ci0JCQlpZiAodHJlZU5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCXhOb2RlID0gKElET01Ob2RlKSB0cmVlTm9kZTsKLQkJCQlmbGF0ID0geE5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZmxhdCAhPSBudWxsICYmIGZsYXQuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSB7Ci0JCQkJCWZsYXQgPSBmbGF0LmdldFByZXZpb3VzKCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyB0aGlzIGlzIGluIGNhc2UgaXQncyBhIDwlQCwgaXQgd2lsbCBiZSBhIHJlZ2lvbiBjb250YWluZXIuLi4KLQkJCUlUZXh0UmVnaW9uIG9wZW5SZWdpb24gPSBudWxsOwotCQkJaWYgKGZsYXQgIT0gbnVsbCAmJiBmbGF0IGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQlJVGV4dFJlZ2lvbkxpc3QgdiA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIGZsYXQpLmdldFJlZ2lvbnMoKTsKLQkJCQlpZiAodi5zaXplKCkgPiAwKQotCQkJCQlvcGVuUmVnaW9uID0gdi5nZXQoMCk7Ci0JCQl9Ci0KLQkJCS8vIEFERCBDREFUQSBQUk9QT1NBTCBJRiBJVCdTIEFOIFhNTC1KU1AgVEFHCi0JCQlpZiAoZmxhdCAhPSBudWxsICYmIGZsYXQuZ2V0VHlwZSgpICE9IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTiAmJgotCQkJCQlmbGF0LmdldFR5cGUoKSAhPSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTiAmJgotCQkJCQlmbGF0LmdldFR5cGUoKSAhPSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOICYmCi0JCQkJCWZsYXQuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCAmJgotCQkJCQkob3BlblJlZ2lvbiAhPSBudWxsICYmCi0JCQkJCQkJb3BlblJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOKSAmJgotCQkJCQkJCSFpbkF0dHJpYnV0ZVJlZ2lvbihmbGF0LCBkb2N1bWVudFBvc2l0aW9uKSkgewotCQkJCQotCQkJCS8vIGRldGVybWluZSBpZiBjdXJzb3IgaXMgYmVmb3JlIG9yIGFmdGVyIHNlbGVjdGVkIHJhbmdlCi0JCQkJaW50IGFkanVzdGVkRG9jUG9zaXRpb24gPSBkb2N1bWVudFBvc2l0aW9uOwotCQkJCWludCByZWFsQ2FyZXRQb3NpdGlvbiA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gdmlld2VyLmdldFNlbGVjdGVkUmFuZ2UoKS55OwotCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID4gcmVhbENhcmV0UG9zaXRpb24pIHsKLQkJCQkJYWRqdXN0ZWREb2NQb3NpdGlvbiAtPSBzZWxlY3Rpb25MZW5ndGg7Ci0JCQkJfQotCi0JCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIGNkYXRhUHJvcG9zYWwgPSBjcmVhdGVDREFUQVByb3Bvc2FsKGFkanVzdGVkRG9jUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQkJcmVzdWx0cy5hZGQoY2RhdGFQcm9wb3NhbCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQotCQlJVGV4dFZpZXdlciB2aWV3ZXIgPSBjb250ZXh0LmdldFZpZXdlcigpOwotCQlpbnQgZG9jdW1lbnRPZmZzZXQgPSBjb250ZXh0LmdldEludm9jYXRpb25PZmZzZXQoKTsKLQkJCi0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gbmVlZCB0byBjb21wdXRlIGNvbnRleHQgaW5mbyBoZXJlLCBpZiBpdCdzIEpTUCwgY2FsbCBqYXZhIGNvbXB1dGVyCi0JCUlEb2N1bWVudCBkb2MgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJSURvY3VtZW50UGFydGl0aW9uZXIgZHAgPSBudWxsOwotCQlpZiAoZG9jIGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMykgewotCQkJZHAgPSAoKElEb2N1bWVudEV4dGVuc2lvbjMpIGRvYykuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HKTsKLQkJfQotCQlpZiAoZHAgIT0gbnVsbCkgewotCQkJLy9JRG9jdW1lbnRQYXJ0aXRpb25lciBkcCA9IHZpZXdlci5nZXREb2N1bWVudCgpLmdldERvY3VtZW50UGFydGl0aW9uZXIoKTsKLQkJCVN0cmluZyB0eXBlID0gZHAuZ2V0UGFydGl0aW9uKGRvY3VtZW50T2Zmc2V0KS5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVCB8fCB0eXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEpIHsKLQkJCQkvLyBnZXQgY29udGV4dCBpbmZvIGZyb20gY29tcGxldGlvbiByZXN1bHRzLi4uCi0JCQkJTGlzdCBwcm9wb3NhbHMgPSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhjb250ZXh0LG1vbml0b3IpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcG9zYWxzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlDb250ZXh0SW5mb3JtYXRpb24gY2kgPSAoKElDb21wbGV0aW9uUHJvcG9zYWwpcHJvcG9zYWxzLmdldChpKSkuZ2V0Q29udGV4dEluZm9ybWF0aW9uKCk7Ci0JCQkJCWlmIChjaSAhPSBudWxsKQotCQkJCQkJcmVzdWx0cy5hZGQoY2kpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIHNhbWUgYXMgdGhlIG5vcm1hbCA8Y29kZT5jb21wdXRlQ29tcGVsdGFpb25Qcm9wb3NhbHM8L2NvZGU+IGV4Y2VwdCB0aGUgY2FsY3VsYXRlZAotCSAqIGphdmEgcG9zaXRpb24gaXMgb2Zmc2V0IGJ5IHRoZSBnaXZlbiBleHRyYSBvZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlciB3aG9zZSBkb2N1bWVudCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIHByb3Bvc2FscwotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogICAgICAgICAgICBhbiBvZmZzZXQgd2l0aGluIHRoZSBkb2N1bWVudCBmb3Igd2hpY2ggY29tcGxldGlvbnMgc2hvdWxkCi0JICogICAgICAgICAgICBiZSBjb21wdXRlZAotCSAqIEBwYXJhbSBqYXZhUG9zaXRpb25FeHRyYU9mZnNldAotCSAqIAkJCQl0aGUgZXh0cmEgb2Zmc2V0IGZvciB0aGUgamF2YSBwb3NpdGlvbgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8KLQkgKiAgICAgICAgIHByb3Bvc2FscyBhcmUgcG9zc2libGUKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjb21wdXRlSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLAotCQkJaW50IHBvcywgaW50IGphdmFQb3NpdGlvbkV4dHJhT2Zmc2V0KSB7Ci0JCQotCQlpbml0aWFsaXplSmF2YVBsdWdpbnMoKTsKLQotCQlKU1BQcm9wb3NhbENvbGxlY3RvciBjb2xsZWN0b3IgPSBudWxsOwotCQkKLQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZCh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0KLQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJaWYgKGZUcmFuc2xhdGlvbkFkYXB0ZXIgPT0gbnVsbCB8fCB4bWxNb2RlbC5nZXRJZCgpICE9IGZNb2RlbElkKSB7Ci0JCQkJZlRyYW5zbGF0aW9uQWRhcHRlciA9IChKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKU1BUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkJZk1vZGVsSWQgPSB4bWxNb2RlbC5nZXRJZCgpOwotCQkJfQotCQkJaWYgKGZUcmFuc2xhdGlvbkFkYXB0ZXIgIT0gbnVsbCkgewotCi0JCQkJSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSBmVHJhbnNsYXRpb25BZGFwdGVyLmdldEpTUFRyYW5zbGF0aW9uKCk7Ci0JCQkJaW50IGphdmFQb3NpdGlvbiA9IHRyYW5zbGF0aW9uLmdldEphdmFPZmZzZXQocG9zKSArIGphdmFQb3NpdGlvbkV4dHJhT2Zmc2V0OwotCi0JCQkJdHJ5IHsKLQotCQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdHJhbnNsYXRpb24uZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0KLQkJCQkJLy8gY2FuJ3QgZ2V0IGphdmEgcHJvcG9zYWxzIHcvb3V0IGEgY29tcGlsYXRpb24gdW5pdAotCQkJCQkvLyBvciB3aXRob3V0IGEgdmFsaWQgcG9zaXRpb24KLQkJCQkJaWYgKGN1ID09IG51bGwgfHwgLTEgPT0gamF2YVBvc2l0aW9uKQotCQkJCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoMCk7Ci0JCQkJCQotCQkJCQljb2xsZWN0b3IgPSBnZXRQcm9wb3NhbENvbGxlY3RvcihjdSwgdHJhbnNsYXRpb24pOwotCQkJCQlzeW5jaHJvbml6ZWQgKGN1KSB7Ci0JCQkJCQljdS5jb2RlQ29tcGxldGUoamF2YVBvc2l0aW9uLCBjb2xsZWN0b3IsIChXb3JraW5nQ29weU93bmVyKSBudWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjb3JlRXgpIHsKLQkJCQkJLy8gYSBwb3NzaWJsZSBKYXZhIE1vZGVsIEV4Y2VwdGlvbiBkdWUgdG8gbm90IGJlaW5nIGEgV2ViCi0JCQkJCS8vIChKYXZhKSBQcm9qZWN0Ci0JCQkJCWNvcmVFeC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCS8vIHRocm93IG91dCBleGNlcHRpb25zIG9uIGNvZGUgYXNzaXN0LgotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcmVzdWx0cyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCQlpZihjb2xsZWN0b3IgIT0gbnVsbCkgewotCQkJcmVzdWx0cyA9IGNvbGxlY3Rvci5nZXRKU1BDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JCQlpZiAocmVzdWx0cyA9PSBudWxsIHx8IHJlc3VsdHMubGVuZ3RoIDwgMSkKLQkJCQl0aGlzLnNldEVycm9yTWVzc2FnZShKU1BVSU1lc3NhZ2VzLkphdmFfQ29udGVudF9Bc3Npc3RfaXNfbm90X1VJXyk7Ci0JCX0KLQkJCi0JCXJldHVybiBBcnJheXMuYXNMaXN0KHJlc3VsdHMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSlNQUHJvcG9zYWxDb2xsZWN0b3IgZ2V0UHJvcG9zYWxDb2xsZWN0b3IoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24pIHsKLQkJcmV0dXJuIG5ldyBKU1BQcm9wb3NhbENvbGxlY3RvcihjdSwgdHJhbnNsYXRpb24pOwotCX0KLQkKLQlwcml2YXRlIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVDREFUQVByb3Bvc2FsKGludCBhZGp1c3RlZERvY1Bvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCXJldHVybiBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCI8IVtDREFUQVtdXT4iLCAvLyROT04tTkxTLTEkCi0JCQkJCWFkanVzdGVkRG9jUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCwgLy8gc2hvdWxkIGJlIHRoZSBzZWxlY3Rpb24gbGVuZ3RoCi0JCQkJCTksIFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfQ0RBVEFTRUNUSU9OKSwgCi0JCQkJCSJDREFUQSBTZWN0aW9uIiwgLy8kTk9OLU5MUy0xJAotCQkJCQludWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DREFUQSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGluQXR0cmlidXRlUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdCwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJSVRleHRSZWdpb24gYXR0ckNvbnRhaW5lciA9IGZsYXQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmIChhdHRyQ29udGFpbmVyICE9IG51bGwgJiYgYXR0ckNvbnRhaW5lciBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlpZiAoYXR0ckNvbnRhaW5lci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgSmF2YSBQbHVnaW5zIHRoYXQgdGhlIEpTUCBwcm9jZXNzb3IgcmVxdWlyZXMuCi0JICogU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDM3NjUKLQkgKiBXZSBzaG91bGQgbm90IGNhbGwgInN0YXJ0IiwgYmVjYXVzZSB0aGF0IHdpbGwgY2F1c2UgdGhhdCAKLQkgKiBzdGF0ZSB0byBiZSByZW1lbWJlcmVkLCBhbmQgcmUtc3RhcnRlZCBhdXRvbWF0aWNhbGx5IGR1cmluZyAKLQkgKiB0aGUgbmV4dCBib290IHVwIHNlcXVlbmNlLiAKLQkgKiAKLQkgKiBJU1NVRTogd2UgbWF5IGJlIGFibGUgdG8gZ2V0IHJpZCBvZiB0aGlzIGFsbCB0b2dldGhlciwgaW4gZnV0dXJlLCAKLQkgKiBzaW5jZSA5OSUgd2UgcHJvYmFibHkgaGF2ZSBhbHJlYWR5IHVzZWQgc29tZSBKRFQgY2xhc3MgYnkgdGhlIHRpbWUgCi0JICogd2UgbmVlZCBKRFQgdG8gYmUgYWN0aXZlIC4uLiBidXQgLi4uIHRoaXMgaXMgdGhlIHNhZmVzdCBmaXggZm9yIAotCSAqIHRoaXMgcG9pbnQgaW4gMS41IHN0cmVhbS4gTmV4dCByZWxlYXNlLCBsZXQncyBqdXN0IHJlbW92ZSB0aGlzLCAKLQkgKiByZS1kaXNjb3ZlciB3aGF0IGV2ZXIgYnVnIHRoaXMgd2FzIGZpeGluZyAoaWYgYW55KSBhbmQgaWYgdGhlcmUgaXMgCi0JICogb25lLCB0aGVuIHdlJ2xsIGVpdGhlciBwdXQgYmFjayBpbiwgYXMgaXMsIG9yIGNvbWUgdXAgd2l0aCBhIAotCSAqIG1vcmUgYXBwcm9wcmlhdGUgZml4LiAKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUphdmFQbHVnaW5zKCkgewotCQl0cnkgewotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShKRFRfQ09SRV9QTFVHSU5fSUQpOwotCQkJYnVuZGxlLmxvYWRDbGFzcygiZHVtbXlDbGFzc05hbWVUaGF0U2hvdWxkTmV2ZXJFeGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gdGhpcyBpcyB0aGUgZXhwZWN0ZWQgcmVzdWx0LCB3ZSBqdXN0IHdhbnQgdG8gCi0JCQkvLyBudWRnZSB0aGUgYnVuZGxlIHRvIGJlIHN1cmUgaXRzIGFjdGl2YXRlZC4gCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJU3RyaW5nIHBhcnRpdGlvblR5cGUgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkKLQkJCQlwYXJ0aXRpb25UeXBlID0gVGV4dFV0aWxpdGllcy5nZXRDb250ZW50VHlwZSh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSwgSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORywgKChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHZpZXdlcikubW9kZWxPZmZzZXQyV2lkZ2V0T2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pLCBmYWxzZSk7Ci0JCQllbHNlCi0JCQkJcGFydGl0aW9uVHlwZSA9IFRleHRVdGlsaXRpZXMuZ2V0Q29udGVudFR5cGUodmlld2VyLmdldERvY3VtZW50KCksIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcsIGRvY3VtZW50UG9zaXRpb24sIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcGFydGl0aW9uVHlwZSA9IElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRTsKLQkJfQotCQlyZXR1cm4gcGFydGl0aW9uVHlwZTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+RGV0ZXJtaW5lcyBpZiB0aGUgY29udGV4dCBpcyBhIHZhbGlkIG9uZSBmb3IgSlNQIEphdmEgcHJvcG9zYWxzLgotCSAqIFRoZSBkZWZhdWx0IHJlc3VsdCBpcyA8Y29kZT50cnVlPC9jb2RlPjwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dCBjaGVjayB0aGlzIGNvbnRleHQgdG8gc2VlIGlmIGl0IGlzIHZhbGlkIGZvciBKU1AKLQkgKiBKYXZhIHByb3Bvc2FscwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGNvbnRleHQgaXMgYSB2YWxpZCBvbmUgZm9yCi0JICogSlNQIEphdmEgcHJvcG9zYWxzLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLiAgPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpcyB0aGUgZGVmYXVsdCByZXNwb25zZSBpZiBhIHNwZWNpZmljIGNhc2UgZm9yIDxjb2RlPmZhbHNlPC9jb2RlPiBpcwotCSAqIG5vdCBmb3VuZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZENvbnRleHQoQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQlJVGV4dFZpZXdlciB2aWV3ZXIgPSBjb250ZXh0LmdldFZpZXdlcigpOwotCQlpbnQgZG9jdW1lbnRQb3NpdGlvbiA9IGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpOwotCQkKLQkJU3RyaW5nIHBhcnRpdGlvblR5cGUgPSBnZXRQYXJ0aXRpb25UeXBlKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm4gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbik7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJLy8gQU5PVEhFUiBXT1JLQVJPVU5EIFVOVElMIFBBUlRJVElPTklORyBUQUtFUyBDQVJFIE9GIFRISVMKLQkJLy8gY2hlY2sgZm9yIHhtbC1qc3AgdGFncy4uLgotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFICYmIGZuICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcG9zc2libGVYTUxKU1AgPSAoKGZuLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSAmJiBmbi5nZXRQcmV2aW91cygpICE9IG51bGwpID8gZm4uZ2V0UHJldmlvdXMoKSA6IGZuOwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBwb3NzaWJsZVhNTEpTUC5nZXRSZWdpb25zKCk7Ci0JCQlpZiAocmVnaW9ucy5zaXplKCkgPiAxKSB7Ci0JCQkJLy8gY2hlY2sgYm91bmRzIGNhc2VzCi0JCQkJSVRleHRSZWdpb24geG1sT3Blbk9yQ2xvc2UgPSByZWdpb25zLmdldCgwKTsKLQkJCQlpZiAoeG1sT3Blbk9yQ2xvc2UuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOICYmCi0JCQkJCQlkb2N1bWVudFBvc2l0aW9uICE9IHBvc3NpYmxlWE1MSlNQLmdldFN0YXJ0T2Zmc2V0KCkgJiYKLQkJCQkJCXhtbE9wZW5PckNsb3NlLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4gJiYKLQkJCQkJCWRvY3VtZW50UG9zaXRpb24gPD0gcG9zc2libGVYTUxKU1AuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCQkKLQkJCQkJLy8gcG9zc2libGUgeG1sLWpzcAotCQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gcmVnaW9ucy5nZXQoMSk7Ci0JCQkJCVN0cmluZyBuYW1lID0gcG9zc2libGVYTUxKU1AuZ2V0VGV4dChuYW1lUmVnaW9uKTsKLQkJCQkJaWYgKG5hbWUuZXF1YWxzKCJqc3A6c2NyaXB0bGV0IikgfHwgbmFtZS5lcXVhbHMoImpzcDpleHByZXNzaW9uIikgfHwgbmFtZS5lcXVhbHMoImpzcDpkZWNsYXJhdGlvbiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJLy8gKiogVEhJUyBJUyBBIFRFTVAgRklYIFVOVElMIFBBUlRJVElPTklORyBUQUtFUyBDQVJFIE9GIFRISVMuLi4KLQkJLy8gY2hlY2sgZm9yIFhNTC1KU1AgaW4gYSA8c2NyaXB0PiByZWdpb24KLQkJaWYgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCB8fCBwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpIHsKLQkJCS8vIGZuIHNob3VsZCBiZSBibG9jayB0ZXh0Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRlY29kZWRTRFJlZ2lvbiA9IGRlY29kZVNjcmlwdEJsb2NrKGZuLmdldEZ1bGxUZXh0KCkpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJkZWNvZGVkID4gIiArCi0JCQkvLyBibG9ja09mVGV4dC5zdWJzdHJpbmcoZGVjb2RlZFNEUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksCi0JCQkvLyBkZWNvZGVkU0RSZWdpb24uZ2V0RW5kT2Zmc2V0KCkpKTsKLQkJCWlmIChkZWNvZGVkU0RSZWdpb24gIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RyID0gZGVjb2RlZFNEUmVnaW9uOwotCQkJCXdoaWxlIChzZHIgIT0gbnVsbCkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNkciAiICsgc2RyLmdldFR5cGUoKSk7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2RyID4gIiArCi0JCQkJCS8vIGJsb2NrT2ZUZXh0LnN1YnN0cmluZyhzZHIuZ2V0U3RhcnRPZmZzZXQoKSwKLQkJCQkJLy8gc2RyLmdldEVuZE9mZnNldCgpKSk7Ci0JCQkJCWlmIChzZHIuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSB7Ci0JCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+PSBmbi5nZXRTdGFydE9mZnNldCgpICsgc2RyLmdldFN0YXJ0T2Zmc2V0KCkgJiYgZG9jdW1lbnRQb3NpdGlvbiA8PSBmbi5nZXRTdGFydE9mZnNldCgpICsgc2RyLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoc2RyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPiBmbi5nZXRTdGFydE9mZnNldCgpICsgc2RyLmdldFN0YXJ0T2Zmc2V0KCkgJiYgZG9jdW1lbnRQb3NpdGlvbiA8IGZuLmdldFN0YXJ0T2Zmc2V0KCkgKyBzZHIuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChkb2N1bWVudFBvc2l0aW9uID09IGZuLmdldFN0YXJ0T2Zmc2V0KCkgKyBzZHIuZ2V0RW5kT2Zmc2V0KCkgJiYgc2RyLmdldE5leHQoKSAhPSBudWxsICYmIHNkci5nZXROZXh0KCkuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSB7Ci0JCQkJCQkJLy8gdGhlIGVuZCBvZiBhbiBvcGVuIHRhZyA8c2NyaXB0PgotCQkJCQkJCS8vIDxqc3A6c2NyaXB0bGV0PnwgYmxhaCA8L2pzcDpzY3JpcHRsZXQ+Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChkb2N1bWVudFBvc2l0aW9uID09IGZuLmdldFN0YXJ0T2Zmc2V0KCkgKyBzZHIuZ2V0U3RhcnRPZmZzZXQoKSAmJiBzZHIuZ2V0UHJldmlvdXMoKSAhPSBudWxsICYmIHNkci5nZXRQcmV2aW91cygpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXNkciA9IHNkci5nZXROZXh0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJLy8gY2hlY2sgc3BlY2lhbCBKU1AgZGVsaW1pdGVyIGNhc2VzCi0JCWlmIChmbiAhPSBudWxsICYmIHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfREVMSU1JVEVSKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZuRGVsaW0gPSBmbjsKLQotCQkJLy8gaWYgaXQncyBhIG5lc3RlZCBKU1AgcmVnaW9uLCBuZWVkIHRvIGdldCB0aGUgY29ycmVjdAotCQkJLy8gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkvLyBub3Qgc3VyZSB3aHkgdGhpcyBjaGVjayB3YXMgdGhlcmUuLi4KLQkJCS8vIGlmIChmbkRlbGltLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCUl0ZXJhdG9yIGJsb2NrUmVnaW9ucyA9IGZuRGVsaW0uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQlJVGV4dFJlZ2lvbiB0ZW1wID0gbnVsbDsKLQkJCUlUZXh0UmVnaW9uQ29udGFpbmVyIHRyYzsKLQkJCXdoaWxlIChibG9ja1JlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJdGVtcCA9IChJVGV4dFJlZ2lvbikgYmxvY2tSZWdpb25zLm5leHQoKTsKLQkJCQkvLyB3ZSBoaXQgYSBuZXN0ZWQKLQkJCQlpZiAodGVtcCBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCXRyYyA9IChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgdGVtcDsKLQkJCQkJLy8gaXQncyBpbiB0aGlzIHJlZ2lvbgotCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+PSB0cmMuZ2V0U3RhcnRPZmZzZXQoKSAmJiBkb2N1bWVudFBvc2l0aW9uIDwgdHJjLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCQlJdGVyYXRvciBuZXN0ZWRKU1BSZWdpb25zID0gdHJjLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJCQkJd2hpbGUgKG5lc3RlZEpTUFJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJdGVtcCA9IChJVGV4dFJlZ2lvbikgbmVzdGVkSlNQUmVnaW9ucy5uZXh0KCk7Ci0JCQkJCQkJaWYgKFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuaXNKU1BPcGVuRGVsaW1pdGVyKHRlbXAuZ2V0VHlwZSgpKSAmJiBkb2N1bWVudFBvc2l0aW9uID09IHRyYy5nZXRTdGFydE9mZnNldCh0ZW1wKSkgewotCQkJCQkJCQkvLyBIVE1MIGNvbnRlbnQgYXNzaXN0Ci0JCQkJCQkJCS8vIHdlIGFjdHVhbGx5IHdhbnQgY29udGVudCBhc3Npc3QgZm9yIHRoZQotCQkJCQkJCQkvLyBwcmV2aW91cyB0eXBlIG9mIHJlZ2lvbiwKLQkJCQkJCQkJLy8gd2VsbCBnZXQgdGhvc2UgcHJvcG9zYWxzIGZyb20gdGhlIGVtYmVkZGVkCi0JCQkJCQkJCS8vIGFkYXB0ZXIKLQkJCQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPiAwKSB7Ci0JCQkJCQkJCQlwYXJ0aXRpb25UeXBlID0gZ2V0UGFydGl0aW9uVHlwZSh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24gLSAxKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuaXNKU1BDbG9zZURlbGltaXRlcih0ZW1wLmdldFR5cGUoKSkgJiYgZG9jdW1lbnRQb3NpdGlvbiA9PSB0cmMuZ2V0U3RhcnRPZmZzZXQodGVtcCkpIHsKLQkJCQkJCQkJLy8gSlNQIGNvbnRlbnQgYXNzaXN0Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyB9Ci0JCQl9Ci0KLQkJCS8vIHRha2UgY2FyZSBvZiBYTUwtSlNQIGRlbGltdGVyIGNhc2VzCi0JCQlpZiAoWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5pc1hNTEpTUERlbGltaXRlcihmbkRlbGltKSkgewotCQkJCS8vIHNpbmNlIGl0J3MgYSBkZWxpbWl0ZXIsIHdlIGtub3cgaXQncyBhIElUZXh0UmVnaW9uQ29udGFpbmVyCi0JCQkJSVRleHRSZWdpb24gZmlyc3RSZWdpb24gPSBmbkRlbGltLmdldFJlZ2lvbnMoKS5nZXQoMCk7Ci0JCQkJaWYgKGZuRGVsaW0uZ2V0U3RhcnRPZmZzZXQoKSA9PSBkb2N1bWVudFBvc2l0aW9uICYmIChmaXJzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pKSB7Ci0JCQkJCS8vIHw8anNwOnNjcmlwdGxldD4gPC9qc3A6c2NyaXB0bGV0PgotCQkJCQkvLyAocGEpIGNvbW1lbnRlZCBvdXQgc28gdGhhdCB3ZSBnZXQgcmVndWxhciBiZWhhdmlvciBKU1AKLQkJCQkJLy8gbWFjcm9zIGV0Yy4uLgotCQkJCQkvLyByZXR1cm4gZ2V0SFRNTENvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLAotCQkJCQkvLyBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZm5EZWxpbS5nZXRTdGFydE9mZnNldCgpID09IGRvY3VtZW50UG9zaXRpb24gJiYgKGZpcnN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pKSB7Ci0JCQkJCS8vIDxqc3A6c2NyaXB0bGV0PiB8PC9qc3A6c2NyaXB0bGV0PgotCQkJCQkvLyBjaGVjayBwcmV2aW91cyBwYXJ0aXRpb24gdHlwZSB0byBzZWUgaWYgaXQncyBKQVZBU0NSSVBUCi0JCQkJCS8vIGlmIGl0IGlzLCB3ZSdyZSBqdXN0IGdvbm5hIGxldCB0aGUgZW1iZWRkZWQgSkFWQVNDUklQVAotCQkJCQkvLyBhZGFwdGVyIGdldCB0aGUgcHJvcG9zYWxzCi0JCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID4gMCkgewotCQkJCQkJU3RyaW5nIGNoZWNrVHlwZSA9IGdldFBhcnRpdGlvblR5cGUodmlld2VyLCBkb2N1bWVudFBvc2l0aW9uIC0gMSk7Ci0JCQkJCQlpZiAoY2hlY2tUeXBlICE9IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQpIHsgLy8gdGhpcwotCQkJCQkJCS8vIGNoZWNrIGlzIGZhaWxpbmcgZm9yIFhNTC1KU1AgKHJlZ2lvbiBpcyBub3QgamF2YXNjcmlwdC4uLikKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCXBhcnRpdGlvblR5cGUgPSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChmaXJzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pICYmIGRvY3VtZW50UG9zaXRpb24gPj0gZm5EZWxpbS5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkvLyBhbnl0aGluZyBlbHNlIGluYmV0d2VlbgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmlzSlNQRGVsaW1pdGVyKGZuRGVsaW0pKSB7Ci0JCQkJLy8gdGhlIGRlbGltaXRlciA8JSwgPCU9LCA8JSEsIC4uLgotCQkJCWlmIChYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmlzSlNQQ2xvc2VEZWxpbWl0ZXIoZm5EZWxpbSkpIHsKLQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gZm5EZWxpbS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCQkvLyBjaGVjayBwcmV2aW91cyBwYXJ0aXRpb24gdHlwZSB0byBzZWUgaWYgaXQncwotCQkJCQkJLy8gSkFWQVNDUklQVAotCQkJCQkJLy8gaWYgaXQgaXMsIHdlJ3JlIGp1c3QgZ29ubmEgbGV0IHRoZSBlbWJlZGRlZAotCQkJCQkJLy8gSkFWQVNDUklQVCBhZGFwdGVyIGdldCB0aGUgcHJvcG9zYWxzCi0JCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+IDApIHsKLQkJCQkJCQlTdHJpbmcgY2hlY2tUeXBlID0gZ2V0UGFydGl0aW9uVHlwZSh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24gLSAxKTsKLQkJCQkJCQlpZiAoY2hlY2tUeXBlICE9IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQpIHsKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJCXBhcnRpdGlvblR5cGUgPSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuaXNKU1BPcGVuRGVsaW1pdGVyKGZuRGVsaW0pKSB7Ci0JCQkJCS8vIGlmIGl0J3MgdGhlIGZpcnN0IHBvc2l0aW9uIG9mIG9wZW4gZGVsaW1pdGVyCi0JCQkJCS8vIHVzZSBlbWJlZGRlZCBIVE1MIHJlc3VsdHMKLQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gZm5EZWxpbS5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkJLy8gaXQncyBhdCB0aGUgRU9GIDwlfAotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgSlNQIHJlZ2lvbiBpbnNpZGUgb2YgQ0RBVEEgdy8gbm8gcmVnaW9uCi0JCS8vIDwhW0NEQVRBWyA8JXwlPiBdXT4KLQkJLy8gb3IgYSBjb21tZW50IHJlZ2lvbgotCQkvLyA8IS0tIDwlIHwlPiAtLT4KLQkJaWYgKGZuICE9IG51bGwgJiYgKGZuLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUIHx8IGZuLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQpKSB7Ci0JCQlpZiAoZm4gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCU9iamVjdFtdIGNkYXRhUmVnaW9ucyA9IGZuLmdldFJlZ2lvbnMoKS50b0FycmF5KCk7Ci0JCQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCQkJSVRleHRSZWdpb24ganNwUmVnaW9uID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNkYXRhUmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlyID0gKElUZXh0UmVnaW9uKSBjZGF0YVJlZ2lvbnNbaV07Ci0JCQkJCWlmIChyIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJCS8vIENEQVRBIGVtYmVkZGVkIGNvbnRhaW5lciwgb3IgY29tbWVudCBjb250YWluZXIKLQkJCQkJCU9iamVjdFtdIGpzcFJlZ2lvbnMgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByKS5nZXRSZWdpb25zKCkudG9BcnJheSgpOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBqc3BSZWdpb25zLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJanNwUmVnaW9uID0gKElUZXh0UmVnaW9uKSBqc3BSZWdpb25zW2pdOwotCQkJCQkJCWlmIChqc3BSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkgewotCQkJCQkJCQlpZiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoanNwUmVnaW9uKSA9PSBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGlmIGl0J3MgaW4gYW4gYXR0cmlidXRlIHZhbHVlLCBpZiBzbywgZG9uJ3QgYWRkIENEQVRBCi0JCS8vIHByb3Bvc2FsCi0JCUlUZXh0UmVnaW9uIGF0dHJDb250YWluZXIgPSAoZm4gIT0gbnVsbCkgPyBmbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uKSA6IG51bGw7Ci0JCWlmIChhdHRyQ29udGFpbmVyICE9IG51bGwgJiYgYXR0ckNvbnRhaW5lciBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlpZiAoYXR0ckNvbnRhaW5lci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCS8vIHRlc3QgbG9jYXRpb24gb2YgdGhlIGN1cnNvcgotCQkJCS8vIHJldHVybiBudWxsIGlmIGl0J3MgaW4gdGhlIG1pZGRsZSBvZiBhbiBvcGVuL2Nsb3NlIGRlbGltaXRlcgotCQkJCUl0ZXJhdG9yIGF0dHJSZWdpb25zID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgYXR0ckNvbnRhaW5lcikuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJSVRleHRSZWdpb24gdGVzdFJlZ2lvbiA9IG51bGw7Ci0JCQkJd2hpbGUgKGF0dHJSZWdpb25zLmhhc05leHQoKSkgewotCQkJCQl0ZXN0UmVnaW9uID0gKElUZXh0UmVnaW9uKSBhdHRyUmVnaW9ucy5uZXh0KCk7Ci0JCQkJCS8vIG5lZWQgdG8gY2hlY2sgZm9yIG90aGVyIHZhbGlkIGF0dHJpYnV0ZSByZWdpb25zCi0JCQkJCWlmIChYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmlzSlNQT3BlbkRlbGltaXRlcih0ZXN0UmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJCWlmICghKCgoSVRleHRSZWdpb25Db250YWluZXIpIGF0dHJDb250YWluZXIpLmdldEVuZE9mZnNldCh0ZXN0UmVnaW9uKSA8PSBkb2N1bWVudFBvc2l0aW9uKSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5pc0pTUENsb3NlRGVsaW1pdGVyKHRlc3RSZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJCQkJaWYgKCEoKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgYXR0ckNvbnRhaW5lcikuZ2V0U3RhcnRPZmZzZXQodGVzdFJlZ2lvbikgPj0gZG9jdW1lbnRQb3NpdGlvbikpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIFRPRE86IGhhbmRsZSBub24tSmF2YSBjb2RlIHN1Y2ggYXMgbmVzdGVkIHRhZ3MKLQkJCQlpZiAodGVzdFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogKiogVEVNUCBXT1JLQVJPVU5EIEZPUiBDTVZDIDI0MTg4MiBUYWtlcyBhIFN0cmluZyBhbmQgYmxvY2tzIG91dAotCSAqIGpzcDpzY3JpcHRsZXQsIGpzcDpleHByZXNzaW9uLCBhbmQganNwOmRlY2xhcmF0aW9uIEBwYXJhbSBibG9ja1RleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRlY29kZVNjcmlwdEJsb2NrKFN0cmluZyBibG9ja1RleHQpIHsKLQkJWE1MU291cmNlUGFyc2VyIHBhcnNlciA9IG5ldyBYTUxTb3VyY2VQYXJzZXIoKTsKLQkJLy8gdXNlIEpTUF9DT05URU5UIGZvciByZWdpb24gdHlwZQotCQlwYXJzZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKCJqc3A6c2NyaXB0bGV0IiwgbnVsbCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIGZhbHNlLCBmYWxzZSkpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlci5hZGRCbG9ja01hcmtlcihuZXcgQmxvY2tNYXJrZXIoImpzcDpleHByZXNzaW9uIiwgbnVsbCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIGZhbHNlLCBmYWxzZSkpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlci5hZGRCbG9ja01hcmtlcihuZXcgQmxvY2tNYXJrZXIoImpzcDpkZWNsYXJhdGlvbiIsIG51bGwsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCBmYWxzZSwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIucmVzZXQoYmxvY2tUZXh0KTsKLQkJcmV0dXJuIHBhcnNlci5nZXREb2N1bWVudFJlZ2lvbnMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmZjgwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXh0LklKU1BQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MUmVsZXZhbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5TaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLQotLyoqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqIEBkZXByZWNhdGVkIFRoaXMgY2xhc3MgaXMgbm8gbG9uZ2VyIHVzZWQgbG9jYWxseSBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUKLSAqLwotcHVibGljIGNsYXNzIEpTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IsIElSZWxlYXNhYmxlIHsKLQkvKioKLQkgKiBQcmVmZXJlbmNlIGxpc3RlbmVyIHRvIGtlZXAgdHJhY2sgb2YgY2hhbmdlcyB0byBjb250ZW50IGFzc2lzdAotCSAqIHByZWZlcmVuY2VzCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQcmVmZXJlbmNlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCVN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0SmF2YVByZWZlcmVuY2VTdG9yZSgpOwotCi0JCQlpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5DT0RFQVNTSVNUX0FVVE9BQ1RJVkFUSU9OLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCQlmQXV0b0FjdGl2YXRlID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkNPREVBU1NJU1RfQVVUT0FDVElWQVRJT04pOwotCQkJfQotCQkJZWxzZSBpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5DT0RFQVNTSVNUX0FVVE9BQ1RJVkFUSU9OX1RSSUdHRVJTX0pBVkEuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJCVN0cmluZyBhdXRvQ2hhcmFjdGVycyA9IHN0b3JlLmdldFN0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLkNPREVBU1NJU1RfQVVUT0FDVElWQVRJT05fVFJJR0dFUlNfSkFWQSk7Ci0JCQkJY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzID0gKGF1dG9DaGFyYWN0ZXJzICE9IG51bGwpID8gYXV0b0NoYXJhY3RlcnMudG9DaGFyQXJyYXkoKSA6IG5ldyBjaGFyWzBdOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGZBdXRvQWN0aXZhdGUgPSB0cnVlOwotCXByb3RlY3RlZCBjaGFyIGNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyc1tdID0gbmV3IGNoYXJbXXsnLid9OwotCXByb3RlY3RlZCBjaGFyIGNvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyc1tdID0gbnVsbDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX0NPTlRFWFQgPSBKU1BVSU1lc3NhZ2VzLkNvbnRlbnRfQXNzaXN0X25vdF9hdmFpbGFiX1VJXzsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZFcnJvck1lc3NhZ2UgPSBudWxsOwotCXByb3RlY3RlZCBKU1BDb21wbGV0aW9uUHJvY2Vzc29yIGZKc3BDb21wbGV0aW9uUHJvY2Vzc29yID0gbnVsbDsKLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZKYXZhUHJlZmVyZW5jZUxpc3RlbmVyOwotCi0JcHVibGljIEpTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgcHJvcG9zZWQgY29kZSBjb21wbGV0aW9ucyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0JICogbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dC1lZGl0b3IgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgYSBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50Ci0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb2RlLWFzc2lzdCBpdGVtcwotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCi0JCUluZGV4ZWRSZWdpb24gdHJlZU5vZGUgPSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJLy8gZ2V0IHJlc3VsdHMgZnJvbSBKU1AgY29tcGxldGlvbiBwcm9jZXNzb3IKLQkJZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgPSBnZXRKc3BDb21wbGV0aW9uUHJvY2Vzc29yKCk7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXN1bHRzID0gZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJZkVycm9yTWVzc2FnZSA9IGZKc3BDb21wbGV0aW9uUHJvY2Vzc29yLmdldEVycm9yTWVzc2FnZSgpOwotCQlpZiAocmVzdWx0cy5sZW5ndGggPT0gMCAmJiAoZkVycm9yTWVzc2FnZSA9PSBudWxsIHx8IGZFcnJvck1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCWZFcnJvck1lc3NhZ2UgPSBVTktOT1dOX0NPTlRFWFQ7Ci0JCX0KLQotCQlJRE9NTm9kZSB4Tm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdCA9IG51bGw7Ci0JCWlmICh0cmVlTm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQl4Tm9kZSA9IChJRE9NTm9kZSkgdHJlZU5vZGU7Ci0JCQlmbGF0ID0geE5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0ICE9IG51bGwgJiYgZmxhdC5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpIHsKLQkJCQlmbGF0ID0gZmxhdC5nZXRQcmV2aW91cygpOwotCQkJfQotCQl9Ci0KLQkJLy8gdGhpcyBpcyBpbiBjYXNlIGl0J3MgYSA8JUAsIGl0IHdpbGwgYmUgYSByZWdpb24gY29udGFpbmVyLi4uCi0JCUlUZXh0UmVnaW9uIG9wZW5SZWdpb24gPSBudWxsOwotCQlpZiAoZmxhdCAhPSBudWxsICYmIGZsYXQgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJSVRleHRSZWdpb25MaXN0IHYgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBmbGF0KS5nZXRSZWdpb25zKCk7Ci0JCQlpZiAodi5zaXplKCkgPiAwKQotCQkJCW9wZW5SZWdpb24gPSB2LmdldCgwKTsKLQkJfQotCi0JCS8vIEFERCBDREFUQSBQUk9QT1NBTCBJRiBJVCdTIEFOIFhNTC1KU1AgVEFHCi0JCWlmIChmbGF0ICE9IG51bGwgJiYgZmxhdC5nZXRUeXBlKCkgIT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOICYmIGZsYXQuZ2V0VHlwZSgpICE9IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOICYmIGZsYXQuZ2V0VHlwZSgpICE9IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4gJiYgZmxhdC5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUICYmIChvcGVuUmVnaW9uICE9IG51bGwgJiYgb3BlblJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOKSAmJiAhaW5BdHRyaWJ1dGVSZWdpb24oZmxhdCwgZG9jdW1lbnRQb3NpdGlvbikpIHsKLQotCQkJLy8gZGV0ZXJtaW5lIGlmIGN1cnNvciBpcyBiZWZvcmUgb3IgYWZ0ZXIgc2VsZWN0ZWQgcmFuZ2UKLQkJCWludCBhZGp1c3RlZERvY1Bvc2l0aW9uID0gZG9jdW1lbnRQb3NpdGlvbjsKLQkJCWludCByZWFsQ2FyZXRQb3NpdGlvbiA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCWludCBzZWxlY3Rpb25MZW5ndGggPSB2aWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpLnk7Ci0JCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+IHJlYWxDYXJldFBvc2l0aW9uKSB7Ci0JCQkJYWRqdXN0ZWREb2NQb3NpdGlvbiAtPSBzZWxlY3Rpb25MZW5ndGg7Ci0JCQl9Ci0KLQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBjZGF0YVByb3Bvc2FsID0gY3JlYXRlQ0RBVEFQcm9wb3NhbChhZGp1c3RlZERvY1Bvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIG5ld1Jlc3VsdHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtyZXN1bHRzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShyZXN1bHRzLCAwLCBuZXdSZXN1bHRzLCAwLCByZXN1bHRzLmxlbmd0aCk7Ci0JCQluZXdSZXN1bHRzW3Jlc3VsdHMubGVuZ3RoXSA9IGNkYXRhUHJvcG9zYWw7Ci0JCQlyZXN1bHRzID0gbmV3UmVzdWx0czsKLQkJfQotCi0JCS8vIChwYSkgKiogdGhpcyBpcyBjb2RlIGluIHByb2dyZXNzLi4uCi0JCS8vIGFkZCBlbmRpbmcgJT4gcHJvcG9zYWwgZm9yIG5vbiBjbG9zZWQgSlNQIHRhZ3MKLQkJLy8gU3RyaW5nIHRhZ1RleHQgPSBmbGF0LmdldFRleHQoKTsKLQkJLy8gLy8gVE9ETyBuZWVkIGEgbXVjaCBiZXR0ZXIgY29tcGFyZSAodXNpbmcgY29uc3RhbnRzPykKLQkJLy8JCWlmKHRhZ1RleHQuZXF1YWxzKCI8JSIpIHx8IHRhZ1RleHQuZXF1YWxzKCI8JT0iKSB8fCB0YWdUZXh0LmVxdWFscygiPCUhIikpOwotCQkvLyB7Ci0JCS8vCQkJSUNvbXBsZXRpb25Qcm9wb3NhbCB0ZXN0YWggPSBDb250ZW50QXNzaXN0VXRpbHMuY29tcHV0ZUpTUEVuZFRhZ1Byb3Bvc2FsKHZpZXdlcixkb2N1bWVudFBvc2l0aW9uLCB0cmVlTm9kZSwgIjwlIiAsIFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfVEFHX0dFTkVSSUMpOwotCQkvLyBpZih0ZXN0YWggIT0gbnVsbCkKLQkJLy8gewotCQkvLwkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gbmV3UmVzdWx0cyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Jlc3VsdHMubGVuZ3RoICsgMV07Ci0JCS8vIFN5c3RlbS5hcnJheWNvcHkoIHJlc3VsdHMsIDAsIG5ld1Jlc3VsdHMsIDAsIHJlc3VsdHMubGVuZ3RoKTsKLQkJLy8gbmV3UmVzdWx0c1tyZXN1bHRzLmxlbmd0aF0gPSB0ZXN0YWg7Ci0JCS8vIHJlc3VsdHMgPSBuZXdSZXN1bHRzOwotCQkvLyB9Ci0JCS8vIH0KLQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQlwcml2YXRlIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVDREFUQVByb3Bvc2FsKGludCBhZGp1c3RlZERvY1Bvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCXJldHVybiBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCI8IVtDREFUQVtdXT4iLCAvLyROT04tTkxTLTEkCi0JCQkJCWFkanVzdGVkRG9jUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCwgLy8gc2hvdWxkIGJlIHRoZSBzZWxlY3Rpb24gbGVuZ3RoCi0JCQkJCTksIFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfQ0RBVEFTRUNUSU9OKSwgCi0JCQkJCSJDREFUQSBTZWN0aW9uIiwgLy8kTk9OLU5MUy0xJAotCQkJCQludWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DREFUQSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGluQXR0cmlidXRlUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdCwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJSVRleHRSZWdpb24gYXR0ckNvbnRhaW5lciA9IGZsYXQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmIChhdHRyQ29udGFpbmVyICE9IG51bGwgJiYgYXR0ckNvbnRhaW5lciBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlpZiAoYXR0ckNvbnRhaW5lci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gZW50ZXJlZCBieSB0aGUgdXNlciBzaG91bGQKLQkgKiBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgdGhlIHByZXNlbnRhdGlvbiBvZiBwb3NzaWJsZSBjb21wbGV0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyBmb3IgY29tcGxldGlvbiBwcm9wb3NhbCBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXV0byBhY3RpdmF0aW9uIGlzIGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJLy8gaWYgbm8gbGlzdGVuZXIgaGFzIGJlZW4gY3JlYXRlZCwgcHJlZmVyZW5lcyBoYXZlIG5vdCBiZWVuCi0JCS8vIGluaXRpYWxpemVkCi0JCWlmIChmSmF2YVByZWZlcmVuY2VMaXN0ZW5lciA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZVByZWZlcmVuY2VzKCk7Ci0KLQkJaWYgKGZBdXRvQWN0aXZhdGUpCi0JCQlyZXR1cm4gY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gZW50ZXJlZCBieSB0aGUgdXNlciBzaG91bGQKLQkgKiBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgdGhlIHByZXNlbnRhdGlvbiBvZiBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBwcmVzZW50aW5nIGNvbnRleHQKLQkgKiAgICAgICAgIGluZm9ybWF0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGF1dG8gYWN0aXZhdGlvbiBpcwotCSAqICAgICAgICAgZGVzaXJlZAotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gY29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVhc29uIHdoeSBjb21wdXRlUHJvcG9zYWxzIHdhcyBub3QgYWJsZSB0byBmaW5kIGFueQotCSAqIGNvbXBsZXRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZSBvciBudWxsIGlmIG5vIGVycm9yIG9jY3VycmVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBmRXJyb3JNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ29udGVudEFzc2lzdEFkYXB0ZXIjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gcmVtb3ZlIGxpc3RlbmVyIG9uIGphdmEgcHJlZmVyZW5jZXMgaWYgd2UgYWRkZWQgb25lCi0JCWlmIChmSmF2YVByZWZlcmVuY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlnZXRKYXZhUHJlZmVyZW5jZVN0b3JlKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmSmF2YVByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCX0KLQotCQlpZiAoZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IucmVsZWFzZSgpOwotCQkJZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIEpTUENvbXBsZXRpb25Qcm9jZXNzb3IgZ2V0SnNwQ29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGZKc3BDb21wbGV0aW9uUHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZKc3BDb21wbGV0aW9uUHJvY2Vzc29yID0gbmV3IEpTUENvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZkpzcENvbXBsZXRpb25Qcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIG5lZWQgdG8gY29tcHV0ZSBjb250ZXh0IGluZm8gaGVyZSwgaWYgaXQncyBKU1AsIGNhbGwgamF2YSBjb21wdXRlcgotCQlJRG9jdW1lbnQgZG9jID0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCUlEb2N1bWVudFBhcnRpdGlvbmVyIGRwID0gbnVsbDsKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjMpIHsKLQkJCWRwID0gKChJRG9jdW1lbnRFeHRlbnNpb24zKSBkb2MpLmdldERvY3VtZW50UGFydGl0aW9uZXIoSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORyk7Ci0JCX0KLQkJaWYgKGRwICE9IG51bGwpIHsKLQkJCS8vSURvY3VtZW50UGFydGl0aW9uZXIgZHAgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXREb2N1bWVudFBhcnRpdGlvbmVyKCk7Ci0JCQlTdHJpbmcgdHlwZSA9IGRwLmdldFBhcnRpdGlvbihkb2N1bWVudE9mZnNldCkuZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQgfHwgdHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBKSB7Ci0JCQkJLy8gZ2V0IGNvbnRleHQgaW5mbyBmcm9tIGNvbXBsZXRpb24gcmVzdWx0cy4uLgotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3Bvc2Fscy5sZW5ndGg7IGkrKykgewotCQkJCQlJQ29udGV4dEluZm9ybWF0aW9uIGNpID0gcHJvcG9zYWxzW2ldLmdldENvbnRleHRJbmZvcm1hdGlvbigpOwotCQkJCQlpZiAoY2kgIT0gbnVsbCkKLQkJCQkJCXJlc3VsdHMuYWRkKGNpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJQ29udGV4dEluZm9ybWF0aW9uW10pIHJlc3VsdHMudG9BcnJheShuZXcgSUNvbnRleHRJbmZvcm1hdGlvbltyZXN1bHRzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB2YWxpZGF0b3IgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiBkaXNwbGF5ZWQgY29udGV4dAotCSAqIGluZm9ybWF0aW9uIHNob3VsZCBiZSBkaXNtaXNzZWQuIE1heSBvbmx5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoZSBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb250ZXh0IGluZm9ybWF0aW9uIHZhbGlkYXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IEphdmFQYXJhbWV0ZXJMaXN0VmFsaWRhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgamF2YSBwcmVmZXJlbmNlIHN0b3JlLiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIGdldHRpbmcgaXQsCi0JICogYWRkIGEgcHJlZmVyZW5jZSBsaXN0ZW5lciB0byBpdC4KLQkgKiAKLQkgKiBAcmV0dXJuIElQcmVmZXJlbmNlU3RvcmUKLQkgKi8KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZ2V0SmF2YVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWlmIChmSmF2YVByZWZlcmVuY2VMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmSmF2YVByZWZlcmVuY2VMaXN0ZW5lciA9IG5ldyBQcmVmZXJlbmNlTGlzdGVuZXIoKTsKLQkJCXN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZkphdmFQcmVmZXJlbmNlTGlzdGVuZXIpOwotCQl9Ci0JCXJldHVybiBzdG9yZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHByZWZlcmVuY2UgZm9yIGNvbnRlbnQgYXNzaXN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldEphdmFQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlmQXV0b0FjdGl2YXRlID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkNPREVBU1NJU1RfQVVUT0FDVElWQVRJT04pOwotCQlTdHJpbmcgYXV0b0NoYXJhY3RlcnMgPSBzdG9yZS5nZXRTdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5DT0RFQVNTSVNUX0FVVE9BQ1RJVkFUSU9OX1RSSUdHRVJTX0pBVkEpOwotCQljb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMgPSAoYXV0b0NoYXJhY3RlcnMgIT0gbnVsbCkgPyBhdXRvQ2hhcmFjdGVycy50b0NoYXJBcnJheSgpIDogbmV3IGNoYXJbMF07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQTWV0aG9kQ29tcGxldGlvblByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BNZXRob2RDb21wbGV0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNkMjI4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BNZXRob2RDb21wbGV0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuSUxpbmtlZE1vZGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5MaW5rZWRNb2RlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVVSS5FeGl0RmxhZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVVSS5JRXhpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZFBvc2l0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5saW5rLkVkaXRvckxpbmtlZE1vZGVVSTsKLQotcHVibGljIGNsYXNzIEpTUE1ldGhvZENvbXBsZXRpb25Qcm9wb3NhbCBleHRlbmRzIEpTUENvbXBsZXRpb25Qcm9wb3NhbCB7Ci0KLQlwcml2YXRlIENvbXBsZXRpb25Qcm9wb3NhbCBmUHJvcG9zYWw7Ci0JcHJpdmF0ZSBJSmF2YVByb2plY3QgZlByb2plY3Q7Ci0JcHJpdmF0ZSBGb3JtYXR0ZXJQcmVmcyBmRm9ybWF0dGVyUHJlZnM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFBBUkVOID0gIigiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJQQVJFTiA9ICIpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQSA9ICIsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRSA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJUmVnaW9uIGZTZWxlY3RlZFJlZ2lvbjsKLQotCXB1YmxpYyBKU1BNZXRob2RDb21wbGV0aW9uUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsLCBJSmF2YVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nLCBpbnQgcmVwbGFjZW1lbnRPZmZzZXQsIGludCByZXBsYWNlbWVudExlbmd0aCwgaW50IGN1cnNvclBvc2l0aW9uLCBJbWFnZSBpbWFnZSwgU3RyaW5nIGRpc3BsYXlTdHJpbmcsIElDb250ZXh0SW5mb3JtYXRpb24gY29udGV4dEluZm9ybWF0aW9uLCBTdHJpbmcgYWRkaXRpb25hbFByb3Bvc2FsSW5mbywgaW50IHJlbGV2YW5jZSwgYm9vbGVhbiB1cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGUpIHsKLQkJc3VwZXIocmVwbGFjZW1lbnRTdHJpbmcsIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwgY3Vyc29yUG9zaXRpb24sIGltYWdlLCBkaXNwbGF5U3RyaW5nLCBjb250ZXh0SW5mb3JtYXRpb24sIGFkZGl0aW9uYWxQcm9wb3NhbEluZm8sIHJlbGV2YW5jZSwgdXBkYXRlUmVwbGFjZW1lbnRMZW5ndGhPblZhbGlkYXRlKTsKLQkJZlByb3Bvc2FsID0gcHJvcG9zYWw7Ci0JCWZQcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhcHBseShJVGV4dFZpZXdlciB2aWV3ZXIsIGNoYXIgdHJpZ2dlciwgaW50IHN0YXRlTWFzaywgaW50IG9mZnNldCkgewotCQlQb3NpdGlvbltdIHBvc2l0aW9ucyA9IG51bGw7Ci0JCUZvcm1hdHRlclByZWZzIGZvcm1hdHRlclByZWZzID0gZ2V0Rm9ybWF0dGVyUHJlZnMoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlidWZmZXIuYXBwZW5kKGZQcm9wb3NhbC5nZXROYW1lKCkpOwotCi0JCWlmIChmb3JtYXR0ZXJQcmVmcy5iZWZvcmVPcGVuaW5nUGFyZW4pCi0JCQlidWZmZXIuYXBwZW5kKFNQQUNFKTsKLQotCQlidWZmZXIuYXBwZW5kKExQQVJFTik7Ci0KLQkJaWYgKGZvcm1hdHRlclByZWZzLmFmdGVyT3BlbmluZ1BhcmVuKQotCQkJYnVmZmVyLmFwcGVuZChTUEFDRSk7Ci0KLQkJaWYgKFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJDb3VudChmUHJvcG9zYWwuZ2V0U2lnbmF0dXJlKCkpID4gMCkgewotCQkJY2hhcltdW10gcGFyYW1ldGVycyA9IGZQcm9wb3NhbC5maW5kUGFyYW1ldGVyTmFtZXMobnVsbCk7Ci0JCQlpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7Ci0JCQkJcG9zaXRpb25zID0gbmV3IFBvc2l0aW9uW3BhcmFtZXRlcnMubGVuZ3RoXTsKLQkJCQkKLQkJCQlpbnQgYmFzZSA9IGdldFJlcGxhY2VtZW50T2Zmc2V0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICE9IDApIHsKLQkJCQkJCWlmIChmb3JtYXR0ZXJQcmVmcy5iZWZvcmVDb21tYSkKLQkJCQkJCQlidWZmZXIuYXBwZW5kKFNQQUNFKTsKLQotCQkJCQkJYnVmZmVyLmFwcGVuZChDT01NQSk7Ci0KLQkJCQkJCWlmIChmb3JtYXR0ZXJQcmVmcy5hZnRlckNvbW1hKQotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoU1BBQ0UpOwotCQkJCQl9Ci0JCQkJCVBvc2l0aW9uIHBvc2l0aW9uID0gbmV3IFBvc2l0aW9uKDAsMCk7Ci0JCQkJCXBvc2l0aW9uLnNldE9mZnNldChiYXNlICsgYnVmZmVyLmxlbmd0aCgpKTsKLQkJCQkJcG9zaXRpb24uc2V0TGVuZ3RoKHBhcmFtZXRlcnNbaV0ubGVuZ3RoKTsKLQkJCQkJcG9zaXRpb25zW2ldID0gcG9zaXRpb247Ci0JCQkJCWJ1ZmZlci5hcHBlbmQocGFyYW1ldGVyc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGZvcm1hdHRlclByZWZzLmJlZm9yZUNsb3NpbmdQYXJlbikKLQkJCWJ1ZmZlci5hcHBlbmQoU1BBQ0UpOwotCi0JCWJ1ZmZlci5hcHBlbmQoUlBBUkVOKTsKLQkJc2V0UmVwbGFjZW1lbnRTdHJpbmcoYnVmZmVyLnRvU3RyaW5nKCkpOwotCi0JCXN1cGVyLmFwcGx5KHZpZXdlciwgdHJpZ2dlciwgc3RhdGVNYXNrLCBvZmZzZXQpOwotCi0JCXRyeSB7Ci0JCQlpZiAocG9zaXRpb25zICE9IG51bGwpIHsKLQkJCQlMaW5rZWRNb2RlTW9kZWwgbW9kZWwgPSBuZXcgTGlua2VkTW9kZU1vZGVsKCk7Ci0JCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJTGlua2VkUG9zaXRpb25Hcm91cCBncm91cCA9IG5ldyBMaW5rZWRQb3NpdGlvbkdyb3VwKCk7Ci0JCQkJCVBvc2l0aW9uIHBvc2l0aW9uID0gcG9zaXRpb25zW2ldOwotCQkJCQlncm91cC5hZGRQb3NpdGlvbihuZXcgTGlua2VkUG9zaXRpb24odmlld2VyLmdldERvY3VtZW50KCksIHBvc2l0aW9uLmdldE9mZnNldCgpLCBwb3NpdGlvbi5nZXRMZW5ndGgoKSwgaSkpOwotCQkJCQltb2RlbC5hZGRHcm91cChncm91cCk7Ci0JCQkJfQotCQkJCW1vZGVsLmZvcmNlSW5zdGFsbCgpOwotCi0JCQkJTGlua2VkTW9kZVVJIHVpID0gbmV3IEVkaXRvckxpbmtlZE1vZGVVSShtb2RlbCwgdmlld2VyKTsKLQkJCQl1aS5zZXRFeGl0UG9zaXRpb24odmlld2VyLCBnZXRSZXBsYWNlbWVudE9mZnNldCgpICsgZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKS5sZW5ndGgoKSwgMCwgSW50ZWdlci5NQVhfVkFMVUUpOwotCQkJCXVpLnNldEV4aXRQb2xpY3kobmV3IEV4aXRQb2xpY3koJyknLCB2aWV3ZXIuZ2V0RG9jdW1lbnQoKSkpOwotCQkJCXVpLnNldEN5Y2xpbmdNb2RlKExpbmtlZE1vZGVVSS5DWUNMRV9XSEVOX05PX1BBUkVOVCk7Ci0JCQkJdWkuc2V0RG9Db250ZXh0SW5mbyh0cnVlKTsKLQkJCQl1aS5lbnRlcigpOwotCQkJCWZTZWxlY3RlZFJlZ2lvbiA9IHVpLmdldFNlbGVjdGVkUmVnaW9uKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIEZvcm1hdHRlclByZWZzIGdldEZvcm1hdHRlclByZWZzKCkgewotCQlpZiAoZkZvcm1hdHRlclByZWZzID09IG51bGwpCi0JCQlmRm9ybWF0dGVyUHJlZnM9IG5ldyBGb3JtYXR0ZXJQcmVmcyhmUHJvamVjdCk7Ci0JCXJldHVybiBmRm9ybWF0dGVyUHJlZnM7Ci0JfQotCi0JLyogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuamF2YS5BYnN0cmFjdEphdmFDb21wbGV0aW9uUHJvcG9zYWwuRXhpdFBvbGljeSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgRXhpdFBvbGljeSBpbXBsZW1lbnRzIElFeGl0UG9saWN5IHsKLQotCQlmaW5hbCBjaGFyIGZFeGl0Q2hhcmFjdGVyOwotCQlwcml2YXRlIGZpbmFsIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0KLQkJcHVibGljIEV4aXRQb2xpY3koY2hhciBleGl0Q2hhcmFjdGVyLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJCWZFeGl0Q2hhcmFjdGVyPSBleGl0Q2hhcmFjdGVyOwotCQkJZkRvY3VtZW50PSBkb2N1bWVudDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQubGluay5MaW5rZWRQb3NpdGlvblVJLkV4aXRQb2xpY3kjZG9FeGl0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LmxpbmsuTGlua2VkUG9zaXRpb25NYW5hZ2VyLCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50LCBpbnQsIGludCkKLQkJICovCi0JCXB1YmxpYyBFeGl0RmxhZ3MgZG9FeGl0KExpbmtlZE1vZGVNb2RlbCBlbnZpcm9ubWVudCwgVmVyaWZ5RXZlbnQgZXZlbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQotCQkJaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBmRXhpdENoYXJhY3RlcikgewotCQkJCWlmIChlbnZpcm9ubWVudC5hbnlQb3NpdGlvbkNvbnRhaW5zKG9mZnNldCkpCi0JCQkJCXJldHVybiBuZXcgRXhpdEZsYWdzKElMaW5rZWRNb2RlTGlzdGVuZXIuVVBEQVRFX0NBUkVULCBmYWxzZSk7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gbmV3IEV4aXRGbGFncyhJTGlua2VkTW9kZUxpc3RlbmVyLlVQREFURV9DQVJFVCwgdHJ1ZSk7Ci0JCQl9Ci0KLQkJCXN3aXRjaCAoZXZlbnQuY2hhcmFjdGVyKSB7Ci0JCQkJY2FzZSAnOyc6Ci0JCQkJCXJldHVybiBuZXcgRXhpdEZsYWdzKElMaW5rZWRNb2RlTGlzdGVuZXIuTk9ORSwgdHJ1ZSk7Ci0JCQkJY2FzZSBTV1QuQ1I6Ci0JCQkJCS8vIHdoZW4gZW50ZXJpbmcgYW4gYW5vbnltb3VzIGNsYXNzIGFzIGEgcGFyYW1ldGVyLCB3ZSBkb24ndCB3YW50Ci0JCQkJCS8vIHRvIGp1bXAgYWZ0ZXIgdGhlIHBhcmVudGhlc2lzIHdoZW4gcmV0dXJuIGlzIHByZXNzZWQKLQkJCQkJaWYgKG9mZnNldCA+IDApIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaWYgKGZEb2N1bWVudC5nZXRDaGFyKG9mZnNldCAtIDEpID09ICd7JykKLQkJCQkJCQkJcmV0dXJuIG5ldyBFeGl0RmxhZ3MoSUxpbmtlZE1vZGVMaXN0ZW5lci5FWElUX0FMTCwgdHJ1ZSk7Ci0JCQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuTGF6eUphdmFDb21wbGV0aW9uUHJvcG9zYWwuRm9ybWF0dGVyUHJlZnMgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIEZvcm1hdHRlclByZWZzIHsKLQkJLyogTWV0aG9kcyAmIGNvbnN0cnVjdG9ycyAqLwotCQlwdWJsaWMgZmluYWwgYm9vbGVhbiBiZWZvcmVPcGVuaW5nUGFyZW47Ci0JCXB1YmxpYyBmaW5hbCBib29sZWFuIGFmdGVyT3BlbmluZ1BhcmVuOwotCQlwdWJsaWMgZmluYWwgYm9vbGVhbiBiZWZvcmVDb21tYTsKLQkJcHVibGljIGZpbmFsIGJvb2xlYW4gYWZ0ZXJDb21tYTsKLQkJcHVibGljIGZpbmFsIGJvb2xlYW4gYmVmb3JlQ2xvc2luZ1BhcmVuOwotCQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpbkVtcHR5TGlzdDsKLQotCQkvKiB0eXBlIHBhcmFtZXRlcnMgKi8KLQkJcHVibGljIGZpbmFsIGJvb2xlYW4gYmVmb3JlT3BlbmluZ0JyYWNrZXQ7Ci0JCXB1YmxpYyBmaW5hbCBib29sZWFuIGFmdGVyT3BlbmluZ0JyYWNrZXQ7Ci0JCXB1YmxpYyBmaW5hbCBib29sZWFuIGJlZm9yZVR5cGVBcmd1bWVudENvbW1hOwotCQlwdWJsaWMgZmluYWwgYm9vbGVhbiBhZnRlclR5cGVBcmd1bWVudENvbW1hOwotCQlwdWJsaWMgZmluYWwgYm9vbGVhbiBiZWZvcmVDbG9zaW5nQnJhY2tldDsKLQotCQlGb3JtYXR0ZXJQcmVmcyhJSmF2YVByb2plY3QgcHJvamVjdCkgewotCQkJYmVmb3JlT3BlbmluZ1BhcmVuID0gZ2V0Q29yZU9wdGlvbihwcm9qZWN0LCBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX1NQQUNFX0JFRk9SRV9PUEVOSU5HX1BBUkVOX0lOX01FVEhPRF9JTlZPQ0FUSU9OLCBmYWxzZSk7Ci0JCQlhZnRlck9wZW5pbmdQYXJlbiA9IGdldENvcmVPcHRpb24ocHJvamVjdCwgRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9BRlRFUl9PUEVOSU5HX1BBUkVOX0lOX01FVEhPRF9JTlZPQ0FUSU9OLCBmYWxzZSk7Ci0JCQliZWZvcmVDb21tYSA9IGdldENvcmVPcHRpb24ocHJvamVjdCwgRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfQ09NTUFfSU5fTUVUSE9EX0lOVk9DQVRJT05fQVJHVU1FTlRTLCBmYWxzZSk7Ci0JCQlhZnRlckNvbW1hID0gZ2V0Q29yZU9wdGlvbihwcm9qZWN0LCBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX1NQQUNFX0FGVEVSX0NPTU1BX0lOX01FVEhPRF9JTlZPQ0FUSU9OX0FSR1VNRU5UUywgdHJ1ZSk7Ci0JCQliZWZvcmVDbG9zaW5nUGFyZW4gPSBnZXRDb3JlT3B0aW9uKHByb2plY3QsIERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQkVGT1JFX0NMT1NJTkdfUEFSRU5fSU5fTUVUSE9EX0lOVk9DQVRJT04sIGZhbHNlKTsKLQkJCWluRW1wdHlMaXN0ID0gZ2V0Q29yZU9wdGlvbihwcm9qZWN0LCBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX1NQQUNFX0JFVFdFRU5fRU1QVFlfUEFSRU5TX0lOX01FVEhPRF9JTlZPQ0FUSU9OLCBmYWxzZSk7Ci0KLQkJCWJlZm9yZU9wZW5pbmdCcmFja2V0ID0gZ2V0Q29yZU9wdGlvbihwcm9qZWN0LCBEZWZhdWx0Q29kZUZvcm1hdHRlckNvbnN0YW50cy5GT1JNQVRURVJfSU5TRVJUX1NQQUNFX0JFRk9SRV9PUEVOSU5HX0FOR0xFX0JSQUNLRVRfSU5fUEFSQU1FVEVSSVpFRF9UWVBFX1JFRkVSRU5DRSwgZmFsc2UpOwotCQkJYWZ0ZXJPcGVuaW5nQnJhY2tldCA9IGdldENvcmVPcHRpb24ocHJvamVjdCwgRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9BRlRFUl9PUEVOSU5HX0FOR0xFX0JSQUNLRVRfSU5fUEFSQU1FVEVSSVpFRF9UWVBFX1JFRkVSRU5DRSwgZmFsc2UpOwotCQkJYmVmb3JlVHlwZUFyZ3VtZW50Q29tbWEgPSBnZXRDb3JlT3B0aW9uKHByb2plY3QsIERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQkVGT1JFX0NPTU1BX0lOX1BBUkFNRVRFUklaRURfVFlQRV9SRUZFUkVOQ0UsIGZhbHNlKTsKLQkJCWFmdGVyVHlwZUFyZ3VtZW50Q29tbWEgPSBnZXRDb3JlT3B0aW9uKHByb2plY3QsIERlZmF1bHRDb2RlRm9ybWF0dGVyQ29uc3RhbnRzLkZPUk1BVFRFUl9JTlNFUlRfU1BBQ0VfQUZURVJfQ09NTUFfSU5fUEFSQU1FVEVSSVpFRF9UWVBFX1JFRkVSRU5DRSwgdHJ1ZSk7Ci0JCQliZWZvcmVDbG9zaW5nQnJhY2tldCA9IGdldENvcmVPcHRpb24ocHJvamVjdCwgRGVmYXVsdENvZGVGb3JtYXR0ZXJDb25zdGFudHMuRk9STUFUVEVSX0lOU0VSVF9TUEFDRV9CRUZPUkVfQ0xPU0lOR19BTkdMRV9CUkFDS0VUX0lOX1BBUkFNRVRFUklaRURfVFlQRV9SRUZFUkVOQ0UsIGZhbHNlKTsKLQkJfQotCi0JCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGdldENvcmVPcHRpb24oSUphdmFQcm9qZWN0IHByb2plY3QsIFN0cmluZyBrZXksIGJvb2xlYW4gZGVmKSB7Ci0JCQlTdHJpbmcgb3B0aW9uID0gZ2V0Q29yZU9wdGlvbihwcm9qZWN0LCBrZXkpOwotCQkJaWYgKEphdmFDb3JlLklOU0VSVC5lcXVhbHMob3B0aW9uKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChKYXZhQ29yZS5ET19OT1RfSU5TRVJULmVxdWFscyhvcHRpb24pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiBkZWY7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldENvcmVPcHRpb24oSUphdmFQcm9qZWN0IHByb2plY3QsIFN0cmluZyBrZXkpIHsKLQkJCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQkJcmV0dXJuIEphdmFDb3JlLmdldE9wdGlvbihrZXkpOwotCQkJcmV0dXJuIHByb2plY3QuZ2V0T3B0aW9uKGtleSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZlNlbGVjdGVkUmVnaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUG9pbnQoZlNlbGVjdGVkUmVnaW9uLmdldE9mZnNldCgpLCBmU2VsZWN0ZWRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRTZWxlY3Rpb24oZG9jdW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFByb3BlcnR5Q29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFByb3BlcnR5Q29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAxOGY4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BQcm9wZXJ0eUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5EZWZhdWx0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTFJlbGV2YW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWwuU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIDxwPlRoaXMgY2xhc3MgY29tcHV0ZXMgYXR0cmlidXRlIHZhbHVlIGNvbXBsZXRpb24gcHJvcG9zYWxzCi0gKiBmb3IgPGNvZGU+Jmx0O2pzcDpbZ3NdZXRQcm9wZXJ0eSZndDs8L2NvZGU+IHRhZ3MuPC9wPgotICovCi1wdWJsaWMgY2xhc3MgSlNQUHJvcGVydHlDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciBleHRlbmRzCi0JCURlZmF1bHRYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5EZWZhdWx0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoCi0JCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJCi0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKTsKLQotCQkvL29ubHkgYWRkIGF0dHJpYnV0ZSB2YWx1ZSBwcm9wb3NhbHMgZm9yIHNwZWNpZmljIGVsZW1lbnRzCi0JCWlmKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VUUFJPUEVSVFkpIHx8Ci0JCQkJbm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5HRVRQUk9QRVJUWSkpIHsKLQkJCi0JCQkvLyBGaW5kIHRoZSBhdHRyaWJ1dGUgbmFtZSBmb3Igd2hpY2ggdGhpcyBwb3NpdGlvbiBzaG91bGQgaGF2ZSBhIHZhbHVlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9wZW4gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3Qgb3BlblJlZ2lvbnMgPSBvcGVuLmdldFJlZ2lvbnMoKTsKLQkJCWludCBpID0gb3BlblJlZ2lvbnMuaW5kZXhPZihjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSk7Ci0JCQlpZiAoaSA8IDApCi0JCQkJcmV0dXJuOwotCQotCQkJLy8gZ2V0IHRoZSBhdHRyaWJ1dGUgaW4gcXVlc3Rpb24gKGZpcnN0IGF0dHIgbmFtZSB0byB0aGUgbGVmdCBvZiB0aGUgY3Vyc29yKQotCQkJSVRleHRSZWdpb24gYXR0ck5hbWVSZWdpb24gPSBudWxsOwotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBudWxsOwotCQkJd2hpbGUgKGkgPj0gMCkgewotCQkJCWF0dHJOYW1lUmVnaW9uID0gb3BlblJlZ2lvbnMuZ2V0KGktLSk7Ci0JCQkJaWYgKGF0dHJOYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGF0dHJOYW1lUmVnaW9uICE9IG51bGwpCi0JCQkJYXR0cmlidXRlTmFtZSA9IG9wZW4uZ2V0VGV4dChhdHRyTmFtZVJlZ2lvbik7Ci0JCi0JCQkvLyBkZXRlcm1pbmUgZ2V0IG9yIHNldAotCQkJSVRleHRSZWdpb24gdGFnTmFtZVJlZ2lvbiA9IG51bGw7Ci0JCQlib29sZWFuIGlzR2V0UHJvcGVydHkgPSB0cnVlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvcGVuUmVnaW9ucy5zaXplKCk7IGorKykgewotCQkJCXRhZ05hbWVSZWdpb24gPSBvcGVuUmVnaW9ucy5nZXQoaik7Ci0JCQkJaWYgKHRhZ05hbWVSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FICYmCi0JCQkJCQlvcGVuLmdldFRleHQodGFnTmFtZVJlZ2lvbikudHJpbSgpLmVxdWFscygianNwOnNldFByb3BlcnR5IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlpc0dldFByb3BlcnR5ID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkKLQkJCVN0cmluZyBjdXJyZW50VmFsdWUgPSBudWxsOwotCQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKQotCQkJCWN1cnJlbnRWYWx1ZSA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFRleHQoKTsKLQkJCWVsc2UKLQkJCQljdXJyZW50VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gbnVsbDsKLQkJCS8vIGZpeHVwcyBzaW5jZSB0aGUgbWF0Y2hTdHJpbmcgY29tcHV0YXRpb25zIGRvbid0IGNhcmUgaWYgdGhlcmUgYXJlIHF1b3RlcyBhcm91bmQgdGhlIHZhbHVlCi0JCQlpZiAoY3VycmVudFZhbHVlLmxlbmd0aCgpID4gU3RyaW5nVXRpbHMuc3RyaXAoY3VycmVudFZhbHVlKS5sZW5ndGgoKSAmJgotCQkJCQkoY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoIlwiIikgfHwgY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoIiciKSkgJiYgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJbWF0Y2hTdHJpbmcgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKDEsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkpOwotCQkJfSBlbHNlIHsKLQkJCQltYXRjaFN0cmluZyA9IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoMCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSk7Ci0JCQl9Ci0JCQkvLyBmb3Igbm93IHdlIGlnbm9yZSBjb21wbGljYXRlZCB2YWx1ZXMgc3VjaCBhcyBqc3AgZW1iZWRkZWQgaW4gYW4gYXR0cmlidXRlCi0JCQlib29sZWFuIGV4aXN0aW5nQ29tcGxpY2F0ZWRWYWx1ZSA9Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkgIT0gbnVsbCAmJgotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXI7Ci0JCQlpZiAoZXhpc3RpbmdDb21wbGljYXRlZFZhbHVlKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UHJvcG9zYWxzKCkuY2xlYXIoKTsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYWNyb3MoKS5jbGVhcigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FKSkgewotCQkJCQlhZGRCZWFuTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgbm9kZSwgbWF0Y2hTdHJpbmcpOwotCQkJCX0KLQkJCQllbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfUFJPUEVSVFkpKSB7Ci0JCQkJCWFkZEJlYW5Qcm9wZXJ0eVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgbm9kZSwgaXNHZXRQcm9wZXJ0eSwgbWF0Y2hTdHJpbmcpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD5BZGQgYmVhbiBwcm9wZXJ0eSBwcm9wb3NhbHMgdG8gdGhlIGdpdmVuIHtAbGluayBDb250ZW50QXNzaXN0UmVxdWVzdH08L3A+Ci0JICogCi0JICogQHBhcmFtIGNvbnRlbnRBc3Npc3RSZXF1ZXN0Ci0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gaXNHZXRQcm9wZXJ0eQotCSAqIEBwYXJhbSBtYXRjaFN0cmluZwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRCZWFuUHJvcGVydHlQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlJRE9NTm9kZSBub2RlLCBib29sZWFuIGlzR2V0UHJvcGVydHksIFN0cmluZyBtYXRjaFN0cmluZykgewotCQkKLQkJaWYgKCgoRWxlbWVudCkgbm9kZSkuaGFzQXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FKSkgewotCQkJLy8gYXNzdW1lcyB0aGF0IHRoZSBub2RlIGlzIHRoZSBbZ3NdZXRQcm9wZXJ0eSB0YWcKLQkJCVN0cmluZyB1c2VCZWFuTmFtZSA9ICgoRWxlbWVudCkgbm9kZSkuZ2V0QXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FKTsKLQkJCS8vIHByb3BlcnRpZXMgY2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgYSBjbGFzcy90eXBlL2JlYW5OYW1lIGhhcyBiZWVuIGRlY2xhcmVkCi0JCQlpZiAodXNlQmVhbk5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJTm9kZUxpc3QgdXNlQmVhbnMgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZShKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOKTsKLQkJCQlpZiAodXNlQmVhbnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdHlwZU5hbWUgPSBudWxsOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHVzZUJlYW5zLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJCWlmICh1c2VCZWFucy5pdGVtKGopLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlFbGVtZW50IHVzZUJlYW4gPSAoRWxlbWVudCkgdXNlQmVhbnMuaXRlbShqKTsKLQkJCQkJCWlmICh1c2VCZWFuIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbiAmJiAoKEluZGV4ZWRSZWdpb24pIHVzZUJlYW4pLmdldFN0YXJ0T2Zmc2V0KCkgPCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJCQlpZiAodXNlQmVhbk5hbWUuZXF1YWxzKHVzZUJlYW4uZ2V0QXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9JRCkpKSB7Ci0JCQkJCQkJCXR5cGVOYW1lID0gdXNlQmVhbi5nZXRBdHRyaWJ1dGUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0NMQVNTKTsKLQkJCQkJCQkJaWYgKCF1c2VCZWFuLmhhc0F0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfQ0xBU1MpIHx8IHR5cGVOYW1lLmxlbmd0aCgpIDwgMSkgewotCQkJCQkJCQkJdHlwZU5hbWUgPSB1c2VCZWFuLmdldEF0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKCF1c2VCZWFuLmhhc0F0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSkgfHwgdHlwZU5hbWUubGVuZ3RoKCkgPCAxKSB7Ci0JCQkJCQkJCQl0eXBlTmFtZSA9IHVzZUJlYW4uZ2V0QXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9CRUFOX05BTUUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh0eXBlTmFtZSAhPSBudWxsICYmIHR5cGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCQkJLy8gZmluZCB0aGUgY2xhc3MvdHlwZS9iZWFuTmFtZSBkZWZpbml0aW9uIGFuZCBvYnRhaW4gdGhlIGxpc3Qgb2YgcHJvcGVydGllcwotCQkJCQkJSUJlYW5JbmZvUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgQmVhbkluZm9Qcm92aWRlcigpOwotCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gSlNQQ29udGVudEFzc2lzdEhlbHBlci5nZXRSZXNvdXJjZShjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJCQlJSmF2YVByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gcHJvdmlkZXIuZ2V0UnVudGltZVByb3BlcnRpZXMocmVzb3VyY2UsIHR5cGVOYW1lKTsKLQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG51bGw7Ci0JCQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJSUphdmFQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSBkZXNjcmlwdG9yc1tqXTsKLQkJCQkJCQkvLyBjaGVjayB3aGV0aGVyIGl0J3MgZ2V0IG9yIHNldCBraW5kYSBwcm9wZXJ0eQotCQkJCQkJCWlmIChwZC5nZXRSZWFkYWJsZSgpICYmIGlzR2V0UHJvcGVydHkgfHwgcGQuZ2V0V3JpdGVhYmxlKCkgJiYgIWlzR2V0UHJvcGVydHkpIHsKLQkJCQkJCQkJLy8gZmlsdGVyIGF0dHIgdmFsdWUgbmFtZQotCQkJCQkJCQlpZiAobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPT0gMCB8fCBwZC5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nLnRvTG93ZXJDYXNlKCkpKSB7Ci0JCQkJCQkJCQlkaXNwbGF5U3RyaW5nID0gcGQuZ2V0RGlzcGxheU5hbWUoKTsKLQkJCQkJCQkJCWlmIChwZC5nZXREZWNsYXJlZFR5cGUoKSAhPSBudWxsICYmIHBkLmdldERlY2xhcmVkVHlwZSgpLmxlbmd0aCgpID4gMCkKLQkJCQkJCQkJCQlkaXNwbGF5U3RyaW5nICs9ICIgLSAiICsgcGQuZ2V0RGVjbGFyZWRUeXBlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiXCIiICsgcGQuZ2V0TmFtZSgpICsgIlwiIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwKLQkJCQkJCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksCi0JCQkJCQkJCQkJCQlwZC5nZXROYW1lKCkubGVuZ3RoKCkgKyAyLAotCQkJCQkJCQkJCQkJU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9BVFRSSUJVVEUpLAotCQkJCQkJCQkJCQkJZGlzcGxheVN0cmluZywgbnVsbCwgcGQuZ2V0RGVjbGFyZWRUeXBlKCksIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1hNTF9BVFRSSUJVVEVfVkFMVUUpOwotCQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+QWRkIGJlYW4gbmFtZSBwcm9wb2FzYWxzIHRvIHRoZSBnaXZlbiB7QGxpbmsgQ29udGVudEFzc2lzdFJlcXVlc3R9PC9wPgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIG1hdGNoU3RyaW5nCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEJlYW5OYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBJRE9NTm9kZSBub2RlLCBTdHJpbmcgbWF0Y2hTdHJpbmcpIHsKLQkJLy8gd2lsbCBub3QgY2F0Y2ggdXNlQmVhbnMgc3BlY2lmaWVkIHVzaW5nIG90aGVyIHRoYW4gYWN0dWFsIERPTSBOb2RlcwotCQlOb2RlTGlzdCB1c2VCZWFucyA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4pOwotCQlpZiAodXNlQmVhbnMgIT0gbnVsbCkgewotCQkJU3RyaW5nIGlkID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nID0gbnVsbDsKLQkJCVN0cmluZyBjbGFzc09yVHlwZSA9IG51bGw7Ci0JCQlTdHJpbmcgaW1hZ2VOYW1lID0gSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0xBU1NfT0JKOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCB1c2VCZWFucy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJaWYgKHVzZUJlYW5zLml0ZW0oaikuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJRWxlbWVudCB1c2VCZWFuID0gKEVsZW1lbnQpIHVzZUJlYW5zLml0ZW0oaik7Ci0JCQkJaWYgKHVzZUJlYW4gaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uICYmCi0JCQkJCQkoKEluZGV4ZWRSZWdpb24pIHVzZUJlYW4pLmdldFN0YXJ0T2Zmc2V0KCkgPCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkgJiYKLQkJCQkJCXVzZUJlYW4uaGFzQXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9JRCkpIHsKLQkJCQkJCi0JCQkJCWlkID0gdXNlQmVhbi5oYXNBdHRyaWJ1dGUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0lEKSA/Ci0JCQkJCQkJU3RyaW5nVXRpbHMuc3RyaXAodXNlQmVhbi5nZXRBdHRyaWJ1dGUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0lEKSkgOiBudWxsOwotCQkJCQlkaXNwbGF5U3RyaW5nID0gbnVsbDsKLQkJCQkJY2xhc3NPclR5cGUgPSBudWxsOwotCQkJCQlpbWFnZU5hbWUgPSBKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DTEFTU19PQko7Ci0JCQkJCS8vIHNldCB0aGUgSW1hZ2UgYmFzZWQgb24gd2hldGhlciB0aGUgY2xhc3MsIHR5cGUsIG9yIGJlYW5OYW1lIGF0dHJpYnV0ZSBpcyBwcmVzZW50Ci0JCQkJCWlmICh1c2VCZWFuLmhhc0F0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfQ0xBU1MpKQotCQkJCQkJY2xhc3NPclR5cGUgPSB1c2VCZWFuLmdldEF0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfQ0xBU1MpOwotCQkJCQlpZiAoKGNsYXNzT3JUeXBlID09IG51bGwgfHwgY2xhc3NPclR5cGUubGVuZ3RoKCkgPCAxKSAmJiB1c2VCZWFuLmhhc0F0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSkpIHsKLQkJCQkJCWNsYXNzT3JUeXBlID0gdXNlQmVhbi5nZXRBdHRyaWJ1dGUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUpOwotCQkJCQkJaW1hZ2VOYW1lID0gSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUFVCTElDOwotCQkJCQl9Ci0JCQkJCWlmICgoY2xhc3NPclR5cGUgPT0gbnVsbCB8fCBjbGFzc09yVHlwZS5sZW5ndGgoKSA8IDEpICYmIHVzZUJlYW4uaGFzQXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9CRUFOX05BTUUpKSB7Ci0JCQkJCQljbGFzc09yVHlwZSA9IHVzZUJlYW4uZ2V0QXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9CRUFOX05BTUUpOwotCQkJCQkJaW1hZ2VOYW1lID0gSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUFVCTElDOwotCQkJCQl9Ci0JCQkJCWlmIChjbGFzc09yVHlwZSAhPSBudWxsICYmIGNsYXNzT3JUeXBlLmxlbmd0aCgpID4gMCkgewotCQkJCQkJZGlzcGxheVN0cmluZyA9IGlkICsgIiAtICIgKyBjbGFzc09yVHlwZTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgewotCQkJCQkJZGlzcGxheVN0cmluZyA9IGlkOwotCQkJCQl9Ci0KLQkJCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTIzNDEKLQkJCQkJaWYoaWQgIT0gbnVsbCkgewotCQkJCQkgICAgLy8gZmlsdGVyCi0JCQkJCQlpZiAobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPT0gMCB8fCBpZC5zdGFydHNXaXRoKG1hdGNoU3RyaW5nKSkgewotCQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIlwiIiArIGlkICsgIlwiIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLmxlbmd0aCgpICsgMiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpbWFnZU5hbWUpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5U3RyaW5nLCBudWxsLCBudWxsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BQcm9wZXJ0eUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFByb3BlcnR5Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGI1ZGNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFByb3BlcnR5Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbXB1dGVzIGF0dHJpYnV0ZSB2YWx1ZSBjb21wbGV0aW9uIHByb3Bvc2FscyBmb3IgJmx0O2pzcDpbZ3NdZXRQcm9wZXJ0eSZndDsgdGFncy4KLSAqIAotICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyBpcyBubyBsb25nZXIgdXNlZCBsb2NhbGx5IGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZQotICogQHNlZSBKU1BQcm9wZXJ0eUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQcm9wZXJ0eUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZXh0ZW5kcyBKU1BEdW1teUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewotCXByaXZhdGUgSlNQUHJvcGVydHlDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciBmQ29tcHV0ZXI7Ci0JCi0JcHVibGljIEpTUFByb3BlcnR5Q29udGVudEFzc2lzdFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKTsKLQkJZkNvbXB1dGVyID0gbmV3IEpTUFByb3BlcnR5Q29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlmQ29tcHV0ZXIuYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIG51bGwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BQcm9wb3NhbENvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQUHJvcG9zYWxDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFlNGRjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BQcm9wb3NhbENvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbXBvcnRDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuUHJvcG9zYWxDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5Db21wbGV0aW9uUHJvcG9zYWxDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5Db21wbGV0aW9uUHJvcG9zYWxDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpTUFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBQYXNzZWQgaW50byBJQ29kZUNvbXBsZXRlI2NvZGVDb21wbGV0ZShpbnQgb2Zmc2V0LCBDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikuCi0gKiBBZGFwdHMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxzIHRvIEpTUENvbXBsZXRpb24gcHJvcG9zYWxzLgotICogVGhpcyBpbmNsdWRlczoKLSAqICAtIHRyYW5zbGF0aW5nIG9mZnNldHMKLSAqICAtICJmaXhpbmciIHVwIGRpc3BsYXkgc3RyaW5ncwotICogIC0gZmlsdGVyaW5nIHNvbWUgdW53YW50ZWQgcHJvcG9zYWxzCi0gKgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQcm9wb3NhbENvbGxlY3RvciBleHRlbmRzIENvbXBsZXRpb25Qcm9wb3NhbENvbGxlY3RvciB7Ci0KLQlwcml2YXRlIEpTUFRyYW5zbGF0aW9uIGZUcmFuc2xhdGlvbjsKLQlwcml2YXRlIENvbXBhcmF0b3IgZkNvbXBhcmF0b3I7Ci0JcHJpdmF0ZSBJSW1wb3J0Q29udGFpbmVyIGZJbXBvcnRDb250YWluZXI7Ci0KLQlwdWJsaWMgSlNQUHJvcG9zYWxDb2xsZWN0b3IoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24pIHsKLQkJc3VwZXIoY3UpOwotCQotCQlpZih0cmFuc2xhdGlvbiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSlNQVHJhbnNsYXRpb24gY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZlRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb247Ci0JCWZJbXBvcnRDb250YWluZXIgPSBjdS5nZXRJbXBvcnRDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgd2Ugb25seSByZXR1cm4gSlNQQ29tcGxldGlvblByb3Bvc2Fscy4KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIEpTUENvbXBsZXRpb25Qcm9wb3NhbHMKLQkgKi8KLQlwdWJsaWMgSlNQQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0SlNQQ29tcGxldGlvblByb3Bvc2FscygpIHsKLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdIGphdmFQcm9wb3NhbHMgPSBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscygpOwotCQkvLyBuZWVkIHRvIGZpbHRlciBvdXQgbm9uIEpTUENvbXBsZXRpb25Qcm9wb3NhbHMKLQkJLy8gYmVjYXVzZSB0aGVpciBvZmZzZXRzIGhhdmVuJ3QgYmVlbiB0cmFuc2xhdGVkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YVByb3Bvc2Fscy5sZW5ndGg7IGkrKykgewotCQkJaWYoamF2YVByb3Bvc2Fsc1tpXSBpbnN0YW5jZW9mIEpTUENvbXBsZXRpb25Qcm9wb3NhbCkKLQkJCQlyZXN1bHRzLmFkZChqYXZhUHJvcG9zYWxzW2ldKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHMsIGdldENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiAoSlNQQ29tcGxldGlvblByb3Bvc2FsW10pcmVzdWx0cy50b0FycmF5KG5ldyBKU1BDb21wbGV0aW9uUHJvcG9zYWxbcmVzdWx0cy5zaXplKCldKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb21wYXJhdG9yIGdldENvbXBhcmF0b3IoKSB7Ci0JCWlmKGZDb21wYXJhdG9yID09IG51bGwpCi0JCQlmQ29tcGFyYXRvciA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWxDb21wYXJhdG9yKCk7Ci0JCXJldHVybiBmQ29tcGFyYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGRlbiB0bzoKLQkgKiAgLSB0cmFuc2xhdGUgSmF2YSAtPiBKU1Agb2Zmc2V0cwotCSAqICAtIGZpeCBjdXJzb3ItcG9zaXRpb24tYWZ0ZXIKLQkgKiAgLSBmaXggbWFuZ2xlZCBzZXJ2bGV0IG5hbWUgaW4gZGlzcGxheSBzdHJpbmcKLQkgKiAgLSByZW1vdmUgdW53YW50ZWQgcHJvcG9zYWxzIChzZXJ2bGV0IGNvbnN0cnVjdG9yKQotCSAqLwotCXByb3RlY3RlZCBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVKYXZhQ29tcGxldGlvblByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCkgewotCQkKLQkJSlNQQ29tcGxldGlvblByb3Bvc2FsIGpzcFByb3Bvc2FsID0gbnVsbDsKLQkJCi0JCS8vIGlnbm9yZSBjb25zdHJ1Y3RvciBwcm9wb3NhbHMgKHRoZXkncmUgbm90IHJlbGV2YW50IGZvciBvdXIgSlNQIHByb3Bvc2FsIGxpc3QpCi0JCWlmKCFwcm9wb3NhbC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCWludCBraW5kID0gcHJvcG9zYWwuZ2V0S2luZCgpOwotCQkJaWYocHJvcG9zYWwuZ2V0S2luZCgpID09IENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRiAmJiBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihKU1BVSVByZWZlcmVuY2VOYW1lcy5BVVRPX0lNUE9SVF9JTlNFUlQpKSB7Ci0JCQkJU3RyaW5nIHNpZ25hdHVyZSA9IFN0cmluZy52YWx1ZU9mKHByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkpOwotCQkJCVN0cmluZyBjb21wbGV0aW9uID0gU3RyaW5nLnZhbHVlT2YocHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpKTsKLQkJCQlpZihjb21wbGV0aW9uLmluZGV4T2Yoc2lnbmF0dXJlICsgIi4iKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWpzcFByb3Bvc2FsID0gY3JlYXRlQXV0b0ltcG9ydFByb3Bvc2FsKHByb3Bvc2FsKTsJCQkKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChraW5kID09IENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGKSB7Ci0JCQkJanNwUHJvcG9zYWwgPSBjcmVhdGVNZXRob2RQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIGRlZmF1bHQgYmVoYXZpb3IKLQkJCWlmKGpzcFByb3Bvc2FsID09IG51bGwpCi0JCQkJanNwUHJvcG9zYWwgPSBjcmVhdGVKc3BQcm9wb3NhbChwcm9wb3NhbCk7CQkKLQkJfQotCQlyZXR1cm4ganNwUHJvcG9zYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSB0eXBlIG5hbWUgZnJvbSB0aGUgc3RyaW5nIDxjb2RlPmZ1bGxOYW1lPC9jb2RlPgotCSAqIEBwYXJhbSBmdWxsTmFtZSB0aGUgZnVsbHkgcXVhbGlmaWVkIEphdmEgbmFtZQotCSAqIEByZXR1cm4gdGhlIHR5cGUgbmFtZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFR5cGVOYW1lKFN0cmluZyBmdWxsTmFtZSkgewotCQlpbnQgaW5kZXggPSBmdWxsTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlyZXR1cm4gKGluZGV4ICE9IC0xKSA/IGZ1bGxOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpIDogZnVsbE5hbWU7Ci0JfQotCi0JcHJpdmF0ZSBKU1BDb21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlQXV0b0ltcG9ydFByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCkgewotCQkKLQkJSlNQQ29tcGxldGlvblByb3Bvc2FsIGpzcFByb3Bvc2FsID0gbnVsbDsKLQotCQlTdHJpbmcgY29tcGxldGlvbiA9IG5ldyBTdHJpbmcocHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpKTsKLQkJCi0JCS8vIGl0J3MgZnVsbHkgcXVhbGlmaWVkIHNvIHdlIHNob3VsZAotCQkvLyBhZGQgYW4gaW1wb3J0IHN0YXRlbWVudAotCQkvLyBjcmVhdGUgYW4gYXV0b2ltcG9ydCBwcm9wb3NhbAotCQlTdHJpbmcgbmV3Q29tcGxldGlvbiA9IGdldFR5cGVOYW1lKGNvbXBsZXRpb24pOwotCQkKLQkJLy8gamF2YSBvZmZzZXQKLQkJaW50IG9mZnNldCA9IHByb3Bvc2FsLmdldFJlcGxhY2VTdGFydCgpOwotCQkvLyByZXBsYWNlbWVudCBsZW5ndGgKLQkJaW50IGxlbmd0aCA9IHByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSAtIG9mZnNldDsKLQkJLy8gdHJhbnNsYXRlIG9mZnNldCBmcm9tIEphdmEgPiBKU1AKLQkJb2Zmc2V0ID0gZlRyYW5zbGF0aW9uLmdldEpzcE9mZnNldChvZmZzZXQpOwotCQkvLyBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgbXVzdCBiZSBjYWxjdWxhdGVkCi0JCWludCBwb3NpdGlvbkFmdGVyID0gY2FsY3VsYXRlUG9zaXRpb25BZnRlcihwcm9wb3NhbCwgbmV3Q29tcGxldGlvbiwgb2Zmc2V0KTsKLQkJCi0JCS8vIGZyb20gamF2YSBwcm9wb3NhbAotCQlJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCBqYXZhUHJvcG9zYWwgPSBzdXBlci5jcmVhdGVKYXZhQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJcHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBqYXZhUHJvcG9zYWwuZ2V0SW1hZ2UoKTsKLQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBqYXZhUHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpOwotCQlkaXNwbGF5U3RyaW5nID0gZ2V0VHJhbnNsYXRpb24oKS5maXh1cE1hbmdsZWROYW1lKGRpc3BsYXlTdHJpbmcpOwotCQlJQ29udGV4dEluZm9ybWF0aW9uIGNvbnRleHRJbmZvcm1hdGlvbiA9IGphdmFQcm9wb3NhbC5nZXRDb250ZXh0SW5mb3JtYXRpb24oKTsKLQkJLy8gZG9uJ3QgZG8gdGhpcywgaXQncyBzbG93Ci0JCS8vIFN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IGphdmFQcm9wb3NhbC5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCWludCByZWxldmFuY2UgPSBqYXZhUHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCk7Ci0JCQotCQlib29sZWFuIHVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUgPSB0cnVlOwotCQkKLQkJanNwUHJvcG9zYWwgPSBuZXcgQXV0b0ltcG9ydFByb3Bvc2FsKGNvbXBsZXRpb24sIGZJbXBvcnRDb250YWluZXIsIG5ld0NvbXBsZXRpb24sIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbkFmdGVyLCBpbWFnZSwgZGlzcGxheVN0cmluZywgY29udGV4dEluZm9ybWF0aW9uLCBudWxsLCByZWxldmFuY2UsIHVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUpOwotCQkKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDQ4MwotCQkvLyBzZXQgd3JhcHBlZCBqYXZhIHByb3Bvc2FsIHNvIGFkZGl0aW9uYWwgaW5mbyBjYW4gYmUgY2FsY3VsYXRlZCBvbiBkZW1hbmQKLQkJanNwUHJvcG9zYWwuc2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbChqYXZhUHJvcG9zYWwpOwotCQkKLQkJcmV0dXJuIGpzcFByb3Bvc2FsOwotCX0KLQotCXByaXZhdGUgSlNQQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZUpzcFByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCkgewotCQkKLQkJSlNQQ29tcGxldGlvblByb3Bvc2FsIGpzcFByb3Bvc2FsOwotCQlTdHJpbmcgY29tcGxldGlvbiA9IFN0cmluZy52YWx1ZU9mKHByb3Bvc2FsLmdldENvbXBsZXRpb24oKSk7Ci0JCS8vIGphdmEgb2Zmc2V0Ci0JCWludCBvZmZzZXQgPSBwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKTsKLQkJLy8gcmVwbGFjZW1lbnQgbGVuZ3RoCi0JCWludCBsZW5ndGggPSBwcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCkgLSBvZmZzZXQ7Ci0JCS8vIHRyYW5zbGF0ZSBvZmZzZXQgZnJvbSBKYXZhID4gSlNQCi0JCW9mZnNldCA9IGZUcmFuc2xhdGlvbi5nZXRKc3BPZmZzZXQob2Zmc2V0KTsKLQkJLy8gY3Vyc29yIHBvc2l0aW9uIGFmdGVyIG11c3QgYmUgY2FsY3VsYXRlZAotCQlpbnQgcG9zaXRpb25BZnRlciA9IGNhbGN1bGF0ZVBvc2l0aW9uQWZ0ZXIocHJvcG9zYWwsIGNvbXBsZXRpb24sIG9mZnNldCk7Ci0JCQotCQkvLyBmcm9tIGphdmEgcHJvcG9zYWwKLQkJSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgamF2YVByb3Bvc2FsID0gc3VwZXIuY3JlYXRlSmF2YUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbCk7Ci0JCXByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCk7Ci0JCUltYWdlIGltYWdlID0gamF2YVByb3Bvc2FsLmdldEltYWdlKCk7Ci0JCVN0cmluZyBkaXNwbGF5U3RyaW5nID0gamF2YVByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKTsKLQkJZGlzcGxheVN0cmluZyA9IGdldFRyYW5zbGF0aW9uKCkuZml4dXBNYW5nbGVkTmFtZShkaXNwbGF5U3RyaW5nKTsKLQkJSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24gPSBqYXZhUHJvcG9zYWwuZ2V0Q29udGV4dEluZm9ybWF0aW9uKCk7Ci0JCS8vIFN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IGphdmFQcm9wb3NhbC5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCQotCQkvKiB0aGUgY29udGV4dCBpbmZvcm1hdGlvbiBpcyBjYWxjdWxhdGVkIHdpdGggcmVzcGVjdCB0byB0aGUgamF2YSBkb2N1bWVudAotCQkgKiB0aHVzIGl0IG5lZWRzIHRvIGJlIHVwZGF0ZWQgaW4gcmVzcGVjdCBvZiB0aGUgSlNQIGRvY3VtZW50LgotCQkgKi8KLQkJaWYoY29udGV4dEluZm9ybWF0aW9uIGluc3RhbmNlb2YgUHJvcG9zYWxDb250ZXh0SW5mb3JtYXRpb24pIHsKLQkJCVByb3Bvc2FsQ29udGV4dEluZm9ybWF0aW9uIHByb3Bvc2FsSW5mbyA9IChQcm9wb3NhbENvbnRleHRJbmZvcm1hdGlvbiljb250ZXh0SW5mb3JtYXRpb247Ci0JCQlpbnQgY29udGV4dEluZm9KU1BPZmZzZXQgPSBmVHJhbnNsYXRpb24uZ2V0SnNwT2Zmc2V0KHByb3Bvc2FsSW5mby5nZXRDb250ZXh0SW5mb3JtYXRpb25Qb3NpdGlvbigpKTsKLQkJCXByb3Bvc2FsSW5mby5zZXRDb250ZXh0SW5mb3JtYXRpb25Qb3NpdGlvbihjb250ZXh0SW5mb0pTUE9mZnNldCk7Ci0JCX0KLQkJCi0JCWludCByZWxldmFuY2UgPSBqYXZhUHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCk7Ci0JCQotCQlib29sZWFuIHVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUgPSB0cnVlOwotCQkKLQkJanNwUHJvcG9zYWwgPSBuZXcgSlNQQ29tcGxldGlvblByb3Bvc2FsKGNvbXBsZXRpb24sIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbkFmdGVyLCBpbWFnZSwgZGlzcGxheVN0cmluZywgY29udGV4dEluZm9ybWF0aW9uLCBudWxsLCByZWxldmFuY2UsIHVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUpOwotCQkKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDQ4MwotCQkvLyBzZXQgd3JhcHBlZCBqYXZhIHByb3Bvc2FsIHNvIGFkZGl0aW9uYWwgaW5mbyBjYW4gYmUgY2FsY3VsYXRlZCBvbiBkZW1hbmQKLQkJanNwUHJvcG9zYWwuc2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbChqYXZhUHJvcG9zYWwpOwotCQkKLQkJcmV0dXJuIGpzcFByb3Bvc2FsOwotCX0KLQotCXByaXZhdGUgSlNQQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZU1ldGhvZFByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCkgewotCQkKLQkJSlNQQ29tcGxldGlvblByb3Bvc2FsIGpzcFByb3Bvc2FsOwotCQlTdHJpbmcgY29tcGxldGlvbiA9IFN0cmluZy52YWx1ZU9mKHByb3Bvc2FsLmdldENvbXBsZXRpb24oKSk7Ci0JCS8vIGphdmEgb2Zmc2V0Ci0JCWludCBvZmZzZXQgPSBwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKTsKLQkJLy8gcmVwbGFjZW1lbnQgbGVuZ3RoCi0JCWludCBsZW5ndGggPSBwcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCkgLSBvZmZzZXQ7Ci0JCS8vIHRyYW5zbGF0ZSBvZmZzZXQgZnJvbSBKYXZhID4gSlNQCi0JCW9mZnNldCA9IGZUcmFuc2xhdGlvbi5nZXRKc3BPZmZzZXQob2Zmc2V0KTsKLQkJLy8gY3Vyc29yIHBvc2l0aW9uIGFmdGVyIG11c3QgYmUgY2FsY3VsYXRlZAotCQlpbnQgcG9zaXRpb25BZnRlciA9IGNhbGN1bGF0ZVBvc2l0aW9uQWZ0ZXIocHJvcG9zYWwsIGNvbXBsZXRpb24sIG9mZnNldCk7Ci0JCQotCQkvLyBmcm9tIGphdmEgcHJvcG9zYWwKLQkJSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgamF2YVByb3Bvc2FsID0gc3VwZXIuY3JlYXRlSmF2YUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbCk7Ci0JCXByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCk7Ci0JCUltYWdlIGltYWdlID0gamF2YVByb3Bvc2FsLmdldEltYWdlKCk7Ci0JCVN0cmluZyBkaXNwbGF5U3RyaW5nID0gamF2YVByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKTsKLQkJZGlzcGxheVN0cmluZyA9IGdldFRyYW5zbGF0aW9uKCkuZml4dXBNYW5nbGVkTmFtZShkaXNwbGF5U3RyaW5nKTsKLQkJSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24gPSBqYXZhUHJvcG9zYWwuZ2V0Q29udGV4dEluZm9ybWF0aW9uKCk7Ci0JCS8vIFN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IGphdmFQcm9wb3NhbC5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCQotCQkvKiB0aGUgY29udGV4dCBpbmZvcm1hdGlvbiBpcyBjYWxjdWxhdGVkIHdpdGggcmVzcGVjdCB0byB0aGUgamF2YSBkb2N1bWVudAotCQkgKiB0aHVzIGl0IG5lZWRzIHRvIGJlIHVwZGF0ZWQgaW4gcmVzcGVjdCBvZiB0aGUgSlNQIGRvY3VtZW50LgotCQkgKi8KLQkJaWYoY29udGV4dEluZm9ybWF0aW9uIGluc3RhbmNlb2YgUHJvcG9zYWxDb250ZXh0SW5mb3JtYXRpb24pIHsKLQkJCVByb3Bvc2FsQ29udGV4dEluZm9ybWF0aW9uIHByb3Bvc2FsSW5mbyA9IChQcm9wb3NhbENvbnRleHRJbmZvcm1hdGlvbiljb250ZXh0SW5mb3JtYXRpb247Ci0JCQlpbnQgY29udGV4dEluZm9KU1BPZmZzZXQgPSBmVHJhbnNsYXRpb24uZ2V0SnNwT2Zmc2V0KHByb3Bvc2FsSW5mby5nZXRDb250ZXh0SW5mb3JtYXRpb25Qb3NpdGlvbigpKTsKLQkJCXByb3Bvc2FsSW5mby5zZXRDb250ZXh0SW5mb3JtYXRpb25Qb3NpdGlvbihjb250ZXh0SW5mb0pTUE9mZnNldCk7Ci0JCX0KLQkJCi0JCWludCByZWxldmFuY2UgPSBqYXZhUHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCk7Ci0JCQotCQlib29sZWFuIHVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUgPSB0cnVlOwotCQkKLQkJanNwUHJvcG9zYWwgPSBuZXcgSlNQTWV0aG9kQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2FsLCBmVHJhbnNsYXRpb24uZ2V0SmF2YVByb2plY3QoKSwgY29tcGxldGlvbiwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uQWZ0ZXIsIGltYWdlLCBkaXNwbGF5U3RyaW5nLCBjb250ZXh0SW5mb3JtYXRpb24sIG51bGwsIHJlbGV2YW5jZSwgdXBkYXRlTGVuZ3RoT25WYWxpZGF0ZSk7Ci0JCQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0NDgzCi0JCS8vIHNldCB3cmFwcGVkIGphdmEgcHJvcG9zYWwgc28gYWRkaXRpb25hbCBpbmZvIGNhbiBiZSBjYWxjdWxhdGVkIG9uIGRlbWFuZAotCQlqc3BQcm9wb3NhbC5zZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKGphdmFQcm9wb3NhbCk7Ci0JCQotCQlyZXR1cm4ganNwUHJvcG9zYWw7Ci0JfQotCi0JLyoqCi0JICogQ2FjbHVhdGVzIHRoZSB3aGVyZSB0aGUgY3Vyc29yIHNob3VsZCBiZSBhZnRlciBhcHBseWluZyB0aGlzIHByb3Bvc2FsLgotCSAqIGVnLiBtZXRob2QofCkgaWYgdGhlIG1ldGhvZCBwcm9wb3NhbCBjaG9zZW4gaGFkIHBhcmFtcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcG9zYWwKLQkgKiBAcGFyYW0gY29tcGxldGlvbgotCSAqIEBwYXJhbSBjdXJyZW50Q3Vyc29yT2Zmc2V0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGNhbGN1bGF0ZVBvc2l0aW9uQWZ0ZXIoQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsLCBTdHJpbmcgY29tcGxldGlvbiwgaW50IGN1cnJlbnRDdXJzb3JPZmZzZXQpIHsKLQkJLy8gY2FsY3VsYXRlIGN1cnNvciBwb3NpdGlvbiBhZnRlcgotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE4Mzk4Ci0JCS8vaW50IHBvc2l0aW9uQWZ0ZXIgPSBjdXJyZW50Q3Vyc29yT2Zmc2V0K2NvbXBsZXRpb24ubGVuZ3RoKCk7Ci0JCWludCBwb3NpdGlvbkFmdGVyID0gY29tcGxldGlvbi5sZW5ndGgoKTsKLQkJCi0JCWludCBraW5kID0gcHJvcG9zYWwuZ2V0S2luZCgpOwotCQkKLQkJLy8gbWF5IG5lZWQgYmV0dGVyIGxvZ2ljIGhlcmUuLi4KLQkJLy8gcHV0IGN1cnNvciBpbnNpZGUgcGFyZW50aGVzaXMgaWYgdGhlcmUncyBwYXJhbXMKLQkJLy8gb25seSBjaGVja2luZyBmb3IgYW55IGtpbmQgb2YgZGVjbGFyYXRpb24KLQkJaWYoa2luZCA9PSBDb21wbGV0aW9uUHJvcG9zYWwuQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OIHx8IGtpbmQgPT0gQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9ERUNMQVJBVElPTiB8fCBraW5kID09IENvbXBsZXRpb25Qcm9wb3NhbC5QT1RFTlRJQUxfTUVUSE9EX0RFQ0xBUkFUSU9OIHx8IGtpbmQgPT0gQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYpIHsKLQkJCVN0cmluZ1tdIHBhcmFtcyA9IFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcyhTdHJpbmcudmFsdWVPZihwcm9wb3NhbC5nZXRTaWduYXR1cmUoKSkpOwotCQkJaWYoY29tcGxldGlvbi5sZW5ndGgoKSA+IDAgJiYgcGFyYW1zLmxlbmd0aCA+IDApCi0JCQkJcG9zaXRpb25BZnRlci0tOwotCQl9Ci0JCXJldHVybiBwb3NpdGlvbkFmdGVyOwotCX0KLQkKLQlzdGF0aWMgY2hhcltdIGdldFR5cGVUcmlnZ2VycygpIHsKLQkJcmV0dXJuIFRZUEVfVFJJR0dFUlM7Ci0JfQotCi0JcHVibGljIEpTUFRyYW5zbGF0aW9uIGdldFRyYW5zbGF0aW9uKCkgewotCQlyZXR1cm4gZlRyYW5zbGF0aW9uOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjk5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRleHQuSUpTUFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlcjsKLQotLyoqCi0gKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3J9IGZvciBKU1AgZG9jdW1lbnRzPC9wPgotICogCi0gKiA8cD5DdXJyZW50bHkgdGhpcyBpbXBsZW1lbnRhdGlvbiBzdGlsbCB1c2VzIHRoZSBIVE1MIHByZWZlcmVuY2VzIGZvciBhdXRvCi0gKiBhY3RpdmF0aW9uIGNoYXJhY3RlcnMsIGJ1dCBpbiB0aGUgZnV0dXJlIHRoaXMgc2hvdWxkIHByb2JhYmx5IGNoYW5nZTwvcD4KLSAqLwotcHVibGljIGNsYXNzIEpTUFN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewotCi0JLyoqIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzICovCi0JcHJpdmF0ZSBjaGFyW10gZkNvbXBsZXRpb25Qcm9wb2FzbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyczsKLQkKLQkvKiogcHJvcGVydHkga2V5IGZvciBkZXRlcm1pbmluZyBpZiBhdXRvIGFjdGl2YXRpb24gaXMgZW5hYmxlZCAqLwotCXByaXZhdGUgU3RyaW5nIGZBdXRvQWN0aXZhdGlvbkVuYWJsZWRQcm9wZXJ0eUtleTsKLQkKLQkvKiogcHJvcGVydHkga2V5IGZvciBkZXRlcm1pbmluZyB3aGF0IHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyBhcmUgKi8KLQlwcml2YXRlIFN0cmluZyBmQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzUHJvcGVydHlLZXk7Ci0JCi0JLyoqIHRoZSBjb250ZXh0IGluZm9ybWF0aW9uIHZhbGlkYXRvciBmb3IgdGhpcyBwcm9jZXNzb3IgKi8KLQlwcml2YXRlIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZkNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLQkKLQkvKioKLQkgKiA8cD5Db25zdHJ1Y3RvcjwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYXNzaXN0YW50IHtAbGluayBDb250ZW50QXNzaXN0YW50fSB0byB1c2UKLQkgKiBAcGFyYW0gcGFydGl0aW9uVHlwZUlEIHRoZSBwYXJ0aXRpb24gdHlwZSB0aGlzIHByb2Nlc3NvciBpcyBmb3IKLQkgKiBAcGFyYW0gdmlld2VyIHtAbGluayBJVGV4dFZpZXdlcn0gdGhpcyBwcm9jZXNzb3IgaXMgYWN0aW5nIGluCi0JICovCi0JcHVibGljIEpTUFN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yKENvbnRlbnRBc3Npc3RhbnQgYXNzaXN0YW50LAotCQkJU3RyaW5nIHBhcnRpdGlvblR5cGVJRCwgSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JCQotCQlzdXBlcihhc3Npc3RhbnQsIHBhcnRpdGlvblR5cGVJRCwgdmlld2VyLCBpc0phdmFQYXJ0aXRpb25UeXBlKHBhcnRpdGlvblR5cGVJRCkgPwotCQkJCVByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJlZmVyZW5jZVN0b3JlKCkgOiBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQotCQkvL2RldGVybWluZSB3aGljaCBwcm9wZXJ0eSBrZXlzIHRvIHVzZWQgYmFzZWQgb24gd2VhdGhlciB0aGlzIHByb2Nlc3NvciBpcyBmb3IgSmF2YSBvciBIVE1MIHN5bnRheAotCQlpZihpc0phdmFQYXJ0aXRpb25UeXBlKHBhcnRpdGlvblR5cGVJRCkpIHsKLQkJCWZBdXRvQWN0aXZhdGlvbkVuYWJsZWRQcm9wZXJ0eUtleSA9IFByZWZlcmVuY2VDb25zdGFudHMuQ09ERUFTU0lTVF9BVVRPQUNUSVZBVElPTjsKLQkJCWZBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnNQcm9wZXJ0eUtleSA9IFByZWZlcmVuY2VDb25zdGFudHMuQ09ERUFTU0lTVF9BVVRPQUNUSVZBVElPTl9UUklHR0VSU19KQVZBOwotCQl9IGVsc2UgewotCQkJZkF1dG9BY3RpdmF0aW9uRW5hYmxlZFByb3BlcnR5S2V5ID0gSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRTsKLQkJCWZBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnNQcm9wZXJ0eUtleSA9IEhUTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0VfQ09ERTsKLQkJfQotCQkKLQkJLy9nZXQgdGhlIGN1cnJlbnQgdXNlciBwcmVmZXJlbmNlCi0JCWdldEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyUHJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCWlmICh0aGlzLmZDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgPT0gbnVsbCkgewotCQkJdGhpcy5mQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yID0gbmV3IEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlcigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmZDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5IVE1MU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIGZDb21wbGV0aW9uUHJvcG9hc2xBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LlN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yI3Byb3BlcnR5Q2hhbmdlKAotCSAqIAlvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgcHJvcGVydHkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQlpZihwcm9wZXJ0eS5lcXVhbHMoZkF1dG9BY3RpdmF0aW9uRW5hYmxlZFByb3BlcnR5S2V5KSB8fAotCQkJCXByb3BlcnR5LmVxdWFscyhmQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzUHJvcGVydHlLZXkpKSB7Ci0JCQkKLQkJCWdldEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyUHJlZmVyZW5jZXMoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD5HZXRzIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVyIHVzZXIgcHJlZmVyZW5jZXMgZm9yIEphdmEgYW5kIHN0b3JlcyB0aGVtIGZvciBsYXRlciB1c2U8L3A+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGdldEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyUHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCi0JCWJvb2xlYW4gZG9BdXRvID0gc3RvcmUuZ2V0Qm9vbGVhbihmQXV0b0FjdGl2YXRpb25FbmFibGVkUHJvcGVydHlLZXkpOwotCQlpZiAoZG9BdXRvKSB7Ci0JCQlmQ29tcGxldGlvblByb3BvYXNsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzID0KLQkJCQlzdG9yZS5nZXRTdHJpbmcoZkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyc1Byb3BlcnR5S2V5KS50b0NoYXJBcnJheSgpOwotCQl9IGVsc2UgewotCQkJZkNvbXBsZXRpb25Qcm9wb2FzbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycyA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGVJRCBjaGVjayB0byBzZWUgaWYgdGhpcyBwYXJ0aXRpb24gdHlwZSBJRCBpcyBmb3IgYSBKYXZhIHBhcnRpdGlvbiB0eXBlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGFydGl0b24gdHlwZSBpcyBhIEphdmEgcGFydGl0aW9uIHR5cGUsCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNKYXZhUGFydGl0aW9uVHlwZShTdHJpbmcgcGFydGl0aW9uVHlwZUlEKSB7Ci0JCXJldHVybiBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBLmVxdWFscyhwYXJ0aXRpb25UeXBlSUQpIHx8IElKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxUX0VMLmVxdWFscyhwYXJ0aXRpb25UeXBlSUQpIHx8IElKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxUX0VMMi5lcXVhbHMocGFydGl0aW9uVHlwZUlEKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BUYWdsaWJDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQVGFnbGliQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxYjhjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BUYWdsaWJDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsLkZhY2V0TW9kdWxlQ29yZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JSmFyUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRMRFJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdEaXJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnbGliRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdsaWJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVVJMUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuVGFnbGliSW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5KU1AyME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5EZWZhdWx0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogPHA+Q29tcHV0ZSBKU1AgdGFnbGliIGNvbXBsZXRpb24gcHJvcG9zYWxzPC9wPgotICovCi1wdWJsaWMgY2xhc3MgSlNQVGFnbGliQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgZXh0ZW5kcwotCQlEZWZhdWx0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuRGVmYXVsdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2FkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKAotCQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCQotCQlJUGF0aCBiYXNlUGF0aCA9IGdldEJhc2VQYXRoKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJaWYgKGJhc2VQYXRoICE9IG51bGwpIHsKLQkJCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKTsKLQkKLQkJCS8vb25seSBhZGQgYXR0cmlidXRlIHZhbHVlIHByb3Bvc2FscyBmb3Igc3BlY2lmaWMgZWxlbWVudHMKLQkJCWlmKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQikpIHsKLQkJCQkvLyBGaW5kIHRoZSBhdHRyaWJ1dGUgbmFtZSBmb3Igd2hpY2ggdGhpcyBwb3NpdGlvbiBzaG91bGQgaGF2ZSBhIHZhbHVlCi0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvcGVuID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCUlUZXh0UmVnaW9uTGlzdCBvcGVuUmVnaW9ucyA9IG9wZW4uZ2V0UmVnaW9ucygpOwotCQkJCWludCBpID0gb3BlblJlZ2lvbnMuaW5kZXhPZihjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSk7Ci0JCQkJaWYgKGkgPCAwKQotCQkJCQlyZXR1cm47Ci0JCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCQkJd2hpbGUgKGkgPj0gMCkgewotCQkJCQluYW1lUmVnaW9uID0gb3BlblJlZ2lvbnMuZ2V0KGktLSk7Ci0JCQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQotCQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gbnVsbDsKLQkJCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKQotCQkJCQlhdHRyaWJ1dGVOYW1lID0gb3Blbi5nZXRUZXh0KG5hbWVSZWdpb24pOwotCQkKLQkJCQlTdHJpbmcgY3VycmVudFZhbHVlID0gbnVsbDsKLQkJCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpCi0JCQkJCWN1cnJlbnRWYWx1ZSA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFRleHQoKTsKLQkJCQllbHNlCi0JCQkJCWN1cnJlbnRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gbnVsbDsKLQkJCQkvLyBmaXh1cHMKLQkJCQlpbnQgc3RhcnQgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKTsKLQkJCQlpbnQgbGVuZ3RoID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKTsKLQkJCQlpZiAoY3VycmVudFZhbHVlLmxlbmd0aCgpID4gU3RyaW5nVXRpbHMuc3RyaXAoY3VycmVudFZhbHVlKS5sZW5ndGgoKSAmJgotCQkJCQkJKGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCJcIiIpIHx8IGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCInIikpICYmIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCi0JCQkJCW1hdGNoU3RyaW5nID0gY3VycmVudFZhbHVlLnN1YnN0cmluZygxLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW1hdGNoU3RyaW5nID0gY3VycmVudFZhbHVlLnN1YnN0cmluZygwLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJYm9vbGVhbiBleGlzdGluZ0NvbXBsaWNhdGVkVmFsdWUgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSAhPSBudWxsICYmCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyOwotCQkJCWlmIChleGlzdGluZ0NvbXBsaWNhdGVkVmFsdWUpIHsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UHJvcG9zYWxzKCkuY2xlYXIoKTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWFjcm9zKCkuY2xlYXIoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cmluZyBsb3dlckNhc2VNYXRjaCA9IG1hdGNoU3RyaW5nLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7Ci0JCQkJCWlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfVVJJKSkgewotCQkJCQkJSVRhZ2xpYlJlY29yZFtdIGF2YWlsYWJsZVRhZ2xpYlJlY29yZHMgPSBUYWdsaWJJbmRleC5nZXRBdmFpbGFibGVUYWdsaWJSZWNvcmRzKGJhc2VQYXRoKTsKLQkJCQkJCS8qCi0JCQkJCQkgKiBhIHNpbXBsZSBlbm91Z2ggd2F5IHRvIHJlbW92ZSBkdXBsaWNhdGVzIChyZXNvbHV0aW9uIGF0Ci0JCQkJCQkgKiBydW50aW1lIHdvdWxkIGJlIG5vbmRldGVybWluaXN0aWMgYW55d2F5KQotCQkJCQkJICovCi0JCQkJCQlNYXAgdXJpVG9SZWNvcmRzID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJCWZvciAoaW50IHRhZ2xpYlJlY29yZE51bWJlciA9IDA7IHRhZ2xpYlJlY29yZE51bWJlciA8IGF2YWlsYWJsZVRhZ2xpYlJlY29yZHMubGVuZ3RoOyB0YWdsaWJSZWNvcmROdW1iZXIrKykgewotCQkJCQkJCUlUYWdsaWJSZWNvcmQgdGFnbGliUmVjb3JkID0gYXZhaWxhYmxlVGFnbGliUmVjb3Jkc1t0YWdsaWJSZWNvcmROdW1iZXJdOwotCQkJCQkJCUlUYWdsaWJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSB0YWdsaWJSZWNvcmQuZ2V0RGVzY3JpcHRvcigpOwotCQkJCQkJCVN0cmluZyB1cmkgPSBudWxsOwotCQkJCQkJCXN3aXRjaCAodGFnbGliUmVjb3JkLmdldFJlY29yZFR5cGUoKSkgewotCQkJCQkJCQljYXNlIElUYWdsaWJSZWNvcmQuVVJMIDoKLQkJCQkJCQkJCXVyaSA9IGRlc2NyaXB0b3IuZ2V0VVJJKCk7Ci0JCQkJCQkJCQl1cmlUb1JlY29yZHMucHV0KHVyaSwgdGFnbGliUmVjb3JkKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQljYXNlIElUYWdsaWJSZWNvcmQuSkFSIDogewotCQkJCQkJCQkJSVBhdGggbG9jYXRpb24gPSAoKElKYXJSZWNvcmQpIHRhZ2xpYlJlY29yZCkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCQkJCUlGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKGxvY2F0aW9uKTsKLQkJCQkJCQkJCUlQYXRoIGxvY2FsQ29udGV4dFJvb3QgPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LmNvbXB1dGVXZWJDb250ZW50Um9vdFBhdGgoYmFzZVBhdGgpOwotCQkJCQkJCQkJZm9yIChpbnQgZmlsZU51bWJlciA9IDA7IGZpbGVOdW1iZXIgPCBmaWxlcy5sZW5ndGg7IGZpbGVOdW1iZXIrKykgewotCQkJCQkJCQkJCWlmIChsb2NhbENvbnRleHRSb290LmlzUHJlZml4T2YoZmlsZXNbZmlsZU51bWJlcl0uZ2V0RnVsbFBhdGgoKSkpIHsKLQkJCQkJCQkJCQkJdXJpID0gSVBhdGguU0VQQVJBVE9SICsKLQkJCQkJCQkJCQkJCQlmaWxlc1tmaWxlTnVtYmVyXS5nZXRGdWxsUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMobG9jYWxDb250ZXh0Um9vdC5zZWdtZW50Q291bnQoKSkudG9TdHJpbmcoKTsKLQkJCQkJCQkJCQkJdXJpVG9SZWNvcmRzLnB1dCh1cmksIHRhZ2xpYlJlY29yZCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCQl1cmkgPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LmdldFJ1bnRpbWVQYXRoKGZpbGVzW2ZpbGVOdW1iZXJdLmdldEZ1bGxQYXRoKCkpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCQkJCXVyaVRvUmVjb3Jkcy5wdXQodXJpLCB0YWdsaWJSZWNvcmQpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhc2UgSVRhZ2xpYlJlY29yZC5UTEQgOiB7Ci0JCQkJCQkJCQlJUGF0aCBwYXRoID0gKChJVExEUmVjb3JkKSB0YWdsaWJSZWNvcmQpLmdldFBhdGgoKTsKLQkJCQkJCQkJCUlQYXRoIGxvY2FsQ29udGV4dFJvb3QgPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LmNvbXB1dGVXZWJDb250ZW50Um9vdFBhdGgoYmFzZVBhdGgpOwotCQkJCQkJCQkJaWYgKGxvY2FsQ29udGV4dFJvb3QuaXNQcmVmaXhPZihwYXRoKSkgewotCQkJCQkJCQkJCXVyaSA9IElQYXRoLlNFUEFSQVRPUiArIHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhsb2NhbENvbnRleHRSb290LnNlZ21lbnRDb3VudCgpKS50b1N0cmluZygpOwotCQkJCQkJCQkJCXVyaVRvUmVjb3Jkcy5wdXQodXJpLCB0YWdsaWJSZWNvcmQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJdXJpID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5nZXRSdW50aW1lUGF0aChwYXRoKS50b1N0cmluZygpOwotCQkJCQkJCQkJCXVyaVRvUmVjb3Jkcy5wdXQodXJpLCB0YWdsaWJSZWNvcmQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvKgotCQkJCQkJICogdXNlIHRoZSByZWNvcmRzIGFuZCB0aGVpciBkZXNjcmlwdG9ycyB0byBjb25zdHJ1Y3QKLQkJCQkJCSAqIHByb3Bvc2FscwotCQkJCQkJICovCi0JCQkJCQlPYmplY3RbXSB1cmlzID0gdXJpVG9SZWNvcmRzLmtleVNldCgpLnRvQXJyYXkoKTsKLQkJCQkJCWZvciAoaW50IHVyaU51bWJlciA9IDA7IHVyaU51bWJlciA8IHVyaXMubGVuZ3RoOyB1cmlOdW1iZXIrKykgewotCQkJCQkJCVN0cmluZyB1cmkgPSB1cmlzW3VyaU51bWJlcl0udG9TdHJpbmcoKTsKLQkJCQkJCQlJVGFnbGliUmVjb3JkIHRhZ2xpYlJlY29yZCA9IChJVGFnbGliUmVjb3JkKSB1cmlUb1JlY29yZHMuZ2V0KHVyaSk7Ci0JCQkJCQkJSVRhZ2xpYkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9ICh0YWdsaWJSZWNvcmQpLmdldERlc2NyaXB0b3IoKTsKLQkJCQkJCQlpZiAodXJpICE9IG51bGwgJiYgdXJpLmxlbmd0aCgpID4gMCAmJiAobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPT0gMCB8fAotCQkJCQkJCQkJdXJpLnRvTG93ZXJDYXNlKExvY2FsZS5VUykuc3RhcnRzV2l0aChsb3dlckNhc2VNYXRjaCkpKSB7Ci0JCQkJCQkJCQotCQkJCQkJCQlTdHJpbmcgdXJsID0gZ2V0U21hbGxJbWFnZVVSTCh0YWdsaWJSZWNvcmQpOwotCQkJCQkJCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gSlNQVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0RGVzY3JpcHRvcih1cmwpOwotCQkJCQkJCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwgJiYgdXJsICE9IG51bGwpIHsKLQkJCQkJCQkJCVVSTCBpbWFnZVVSTDsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJaW1hZ2VVUkwgPSBuZXcgVVJMKHVybCk7Ci0JCQkJCQkJCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpOwotCQkJCQkJCQkJCUpTUFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dCh1cmwsIGltYWdlRGVzY3JpcHRvcik7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCVN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IGRlc2NyaXB0b3IuZ2V0RGlzcGxheU5hbWUoKSArICI8YnIvPiIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJZGVzY3JpcHRvci5nZXREZXNjcmlwdGlvbigpICsgIjxici8+IiArIGRlc2NyaXB0b3IuZ2V0VGxpYlZlcnNpb24oKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlpbWFnZSA9IEpTUFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldCh1cmwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJCQkJaW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVFJJQlVURSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQkJCQkJCQkiXCIiICsgdXJpICsgIlwiIiwgc3RhcnQsIGxlbmd0aCwgdXJpLmxlbmd0aCgpICsgMiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJaW1hZ2UsIHVyaSwgbnVsbCwgYWRkaXRpb25hbEluZm8sIElSZWxldmFuY2VDb25zdGFudHMuUl9OT05FKTsKLQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVEFHRElSKSkgewotCQkJCQkJSVRhZ2xpYlJlY29yZFtdIGF2YWlsYWJsZVRhZ2xpYlJlY29yZHMgPSBUYWdsaWJJbmRleC5nZXRBdmFpbGFibGVUYWdsaWJSZWNvcmRzKGJhc2VQYXRoKTsKLQkJCQkJCS8qCi0JCQkJCQkgKiBhIHNpbXBsZSBlbm91Z2ggd2F5IHRvIHJlbW92ZSBkdXBsaWNhdGVzIChyZXNvbHV0aW9uIGF0Ci0JCQkJCQkgKiBydW50aW1lIHdvdWxkIGJlIG5vbmRldGVybWluaXN0aWMgYW55d2F5KQotCQkJCQkJICovCi0JCQkJCQlNYXAgdXJpVG9SZWNvcmRzID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJCWZvciAoaW50IHRhZ2xpYlJlY29yZE51bWJlciA9IDA7IHRhZ2xpYlJlY29yZE51bWJlciA8IGF2YWlsYWJsZVRhZ2xpYlJlY29yZHMubGVuZ3RoOyB0YWdsaWJSZWNvcmROdW1iZXIrKykgewotCQkJCQkJCUlUYWdsaWJSZWNvcmQgdGFnbGliUmVjb3JkID0gYXZhaWxhYmxlVGFnbGliUmVjb3Jkc1t0YWdsaWJSZWNvcmROdW1iZXJdOwotCQkJCQkJCVN0cmluZyB1cmkgPSBudWxsOwotCQkJCQkJCWlmICh0YWdsaWJSZWNvcmQuZ2V0UmVjb3JkVHlwZSgpID09IElUYWdsaWJSZWNvcmQuVEFHRElSKSB7Ci0JCQkJCQkJCUlQYXRoIHBhdGggPSAoKElUYWdEaXJSZWNvcmQpIHRhZ2xpYlJlY29yZCkuZ2V0UGF0aCgpOwotCQkJCQkJCQlJUGF0aCBsb2NhbENvbnRleHRSb290ID0gVGFnbGliSW5kZXguZ2V0Q29udGV4dFJvb3QoYmFzZVBhdGgpOwotCQkJCQkJCQlpZiAobG9jYWxDb250ZXh0Um9vdC5pc1ByZWZpeE9mKHBhdGgpKSB7Ci0JCQkJCQkJCQl1cmkgPSBJUGF0aC5TRVBBUkFUT1IgKyBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMobG9jYWxDb250ZXh0Um9vdC5zZWdtZW50Q291bnQoKSkudG9TdHJpbmcoKTsKLQkJCQkJCQkJCXVyaVRvUmVjb3Jkcy5wdXQodXJpLCB0YWdsaWJSZWNvcmQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLyoKLQkJCQkJCSAqIHVzZSB0aGUgcmVjb3JkcyBhbmQgdGhlaXIgZGVzY3JpcHRvcnMgdG8gY29uc3RydWN0Ci0JCQkJCQkgKiBwcm9wb3NhbHMKLQkJCQkJCSAqLwotCQkJCQkJT2JqZWN0W10gdXJpcyA9IHVyaVRvUmVjb3Jkcy5rZXlTZXQoKS50b0FycmF5KCk7Ci0JCQkJCQlmb3IgKGludCB1cmlOdW1iZXIgPSAwOyB1cmlOdW1iZXIgPCB1cmlzLmxlbmd0aDsgdXJpTnVtYmVyKyspIHsKLQkJCQkJCQlTdHJpbmcgdXJpID0gdXJpc1t1cmlOdW1iZXJdLnRvU3RyaW5nKCk7Ci0JCQkJCQkJSVRhZ2xpYlJlY29yZCB0YWdsaWJSZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgdXJpVG9SZWNvcmRzLmdldCh1cmkpOwotCQkJCQkJCUlUYWdsaWJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAodGFnbGliUmVjb3JkKS5nZXREZXNjcmlwdG9yKCk7Ci0JCQkJCQkJaWYgKHVyaSAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA+IDAgJiYgKG1hdGNoU3RyaW5nLmxlbmd0aCgpID09IDAgfHwKLQkJCQkJCQkJCXVyaS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpLnN0YXJ0c1dpdGgobG93ZXJDYXNlTWF0Y2gpKSkgewotCQkJCQkJCQkKLQkJCQkJCQkJU3RyaW5nIHVybCA9IGdldFNtYWxsSW1hZ2VVUkwodGFnbGliUmVjb3JkKTsKLQkJCQkJCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCQkJCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQkJCQkJaW1hZ2VEZXNjcmlwdG9yID0gSlNQVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0RGVzY3JpcHRvcih1cmwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCAmJiB1cmwgIT0gbnVsbCkgewotCQkJCQkJCQkJVVJMIGltYWdlVVJMOwotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlpbWFnZVVSTCA9IG5ldyBVUkwodXJsKTsKLQkJCQkJCQkJCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0JCQkJCQkJCQkJSlNQVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHVybCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gZGVzY3JpcHRvci5nZXREZXNjcmlwdGlvbigpICsgIjxici8+IiArIGRlc2NyaXB0b3IuZ2V0VGxpYlZlcnNpb24oKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlpbWFnZSA9IEpTUFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldCh1cmwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJCQkJaW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVFJJQlVURSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQkJCQkJCQkiXCIiICsgdXJpICsgIlwiIiwgc3RhcnQsIGxlbmd0aCwgdXJpLmxlbmd0aCgpICsgMiwgaW1hZ2UsIHVyaSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJbnVsbCwgYWRkaXRpb25hbEluZm8sIElSZWxldmFuY2VDb25zdGFudHMuUl9OT05FKTsKLQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfUFJFRklYKSkgewotCQkJCQkJTm9kZSB1cmlBdHRyID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9VUkkpOwotCQkJCQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCQkJCQlpZiAodXJpQXR0ciAhPSBudWxsKSB7Ci0JCQkJCQkJdXJpID0gdXJpQXR0ci5nZXROb2RlVmFsdWUoKTsKLQkJCQkJCQlJVGFnbGliUmVjb3JkW10gYXZhaWxhYmxlVGFnbGliUmVjb3JkcyA9IFRhZ2xpYkluZGV4LmdldEF2YWlsYWJsZVRhZ2xpYlJlY29yZHMoYmFzZVBhdGgpOwotCQkJCQkJCU1hcCBwcmVmaXhNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQkJCWZvciAoaW50IHRhZ2xpYnJlY29yZE51bWJlciA9IDA7IHRhZ2xpYnJlY29yZE51bWJlciA8IGF2YWlsYWJsZVRhZ2xpYlJlY29yZHMubGVuZ3RoOyB0YWdsaWJyZWNvcmROdW1iZXIrKykgewotCQkJCQkJCQlJVGFnbGliRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gYXZhaWxhYmxlVGFnbGliUmVjb3Jkc1t0YWdsaWJyZWNvcmROdW1iZXJdLmdldERlc2NyaXB0b3IoKTsKLQkJCQkJCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCAmJiBkZXNjcmlwdG9yLmdldFVSSSgpICE9IG51bGwgJiYKLQkJCQkJCQkJCQlkZXNjcmlwdG9yLmdldFVSSSgpLnRvTG93ZXJDYXNlKExvY2FsZS5VUykuZXF1YWxzKHVyaS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKSkgewotCQkJCQkJCQkJU3RyaW5nIHNob3J0TmFtZSA9IGRlc2NyaXB0b3IuZ2V0U2hvcnROYW1lKCkudHJpbSgpOwotCQkJCQkJCQkJaWYgKHNob3J0TmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJCQlib29sZWFuIHZhbGlkID0gdHJ1ZTsKLQkJCQkJCQkJCQlmb3IgKGludCBjaGFyYWN0ZXIgPSAwOyBjaGFyYWN0ZXIgPCBzaG9ydE5hbWUubGVuZ3RoKCk7IGNoYXJhY3RlcisrKSB7Ci0JCQkJCQkJCQkJCXZhbGlkID0gdmFsaWQgJiYgIUNoYXJhY3Rlci5pc1doaXRlc3BhY2Uoc2hvcnROYW1lLmNoYXJBdChjaGFyYWN0ZXIpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJaWYgKHZhbGlkKSB7Ci0JCQkJCQkJCQkJCXByZWZpeE1hcC5wdXQoc2hvcnROYW1lLCBkZXNjcmlwdG9yKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJT2JqZWN0IHByZWZpeGVzW10gPSBwcmVmaXhNYXAua2V5U2V0KCkudG9BcnJheSgpOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJlZml4ZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkJU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIHByZWZpeGVzW2pdOwotCQkJCQkJCQlJVGFnbGliRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKElUYWdsaWJEZXNjcmlwdG9yKSBwcmVmaXhNYXAuZ2V0KHByZWZpeCk7Ci0JCQkJCQkJCUltYWdlIGltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCQkJCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKAotCQkJCQkJCQkJCSJcIiIgKyBwcmVmaXggKyAiXCIiLCBzdGFydCwgbGVuZ3RoLCBwcmVmaXgubGVuZ3RoKCkgKyAyLCBpbWFnZSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJcHJlZml4LCBudWxsLCBkZXNjcmlwdG9yLmdldERlc2NyaXB0aW9uKCksIElSZWxldmFuY2VDb25zdGFudHMuUl9OT05FKTsKLQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCU5vZGUgZGlyQXR0ciA9IG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVEFHRElSKTsKLQkJCQkJCQlpZiAoZGlyQXR0ciAhPSBudWxsKSB7Ci0JCQkJCQkJCVN0cmluZyBkaXIgPSBkaXJBdHRyLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJCQlpZiAoZGlyICE9IG51bGwpIHsKLQkJCQkJCQkJCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gVGFnbGliSW5kZXgucmVzb2x2ZShiYXNlUGF0aC50b1N0cmluZygpLCBkaXIsIGZhbHNlKTsKLQkJCQkJCQkJCWlmIChyZWNvcmQgIT0gbnVsbCkgewotCQkJCQkJCQkJCUlUYWdsaWJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSByZWNvcmQuZ2V0RGVzY3JpcHRvcigpOwotCQkJCQkJCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJU3RyaW5nIHNob3J0TmFtZSA9IGRlc2NyaXB0b3IuZ2V0U2hvcnROYW1lKCk7Ci0JCQotCQkJCQkJCQkJCQlJbWFnZSBpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQVRUUklCVVRFKTsKLQkJCQkJCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQkJCQkJCQkJCQkiXCIiICsgc2hvcnROYW1lICsgIlwiIiwgc3RhcnQsIGxlbmd0aCwgc2hvcnROYW1lLmxlbmd0aCgpICsgMiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCQkJaW1hZ2UsIHNob3J0TmFtZSwgbnVsbCwgZGVzY3JpcHRvci5nZXREZXNjcmlwdGlvbigpLAotCQkJCQkJCQkJCQkJCUlSZWxldmFuY2VDb25zdGFudHMuUl9OT05FKTsKLQkJCQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkJaWYgKGRpci5zdGFydHNXaXRoKCIvV0VCLUlORi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQlkaXIgPSBkaXIuc3Vic3RyaW5nKDkpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCVN0cmluZyBwcmVmaXggPSBTdHJpbmdVdGlscy5yZXBsYWNlKGRpciwgIi8iLCAiLSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCi0JCQkJCQkJCQkJCUltYWdlIGltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCQkJCQkJCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKAotCQkJCQkJCQkJCQkJCSJcIiIgKyBwcmVmaXggKyAiXCIiLCBzdGFydCwgbGVuZ3RoLCBwcmVmaXgubGVuZ3RoKCkgKyAyLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJCQlpbWFnZSwgcHJlZml4LCBudWxsLCBudWxsLCBJUmVsZXZhbmNlQ29uc3RhbnRzLlJfTk9ORSk7Ci0JCQkJCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U21hbGxJbWFnZVVSTChJVGFnbGliUmVjb3JkIHRhZ2xpYlJlY29yZCkgewotCQlTdHJpbmcgdXJsID0gbnVsbDsKLQkJc3dpdGNoICh0YWdsaWJSZWNvcmQuZ2V0UmVjb3JkVHlwZSgpKSB7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLlRMRCkgOiB7Ci0JCQkJSVRMRFJlY29yZCByZWNvcmQgPSAoSVRMRFJlY29yZCkgdGFnbGliUmVjb3JkOwotCQkJCUlSZXNvdXJjZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHJlY29yZC5nZXRQYXRoKCkpOwotCQkJCWlmIChmaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCAmJiByZWNvcmQuZ2V0RGVzY3JpcHRvcigpLmdldFNtYWxsSWNvbigpLmxlbmd0aCgpID4gMCkgewotCQkJCQl1cmwgPSAicGxhdGZvcm06L3Jlc291cmNlLyIgKyAvLyROT04tTkxTLTEkCi0JCQkJCUZhY2V0TW9kdWxlQ29yZVN1cHBvcnQucmVzb2x2ZShmaWxlLmdldEZ1bGxQYXRoKCksCi0JCQkJCQkJcmVjb3JkLmdldERlc2NyaXB0b3IoKS5nZXRTbWFsbEljb24oKSk7Ci0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5KQVIpIDogewotCQkJCUlKYXJSZWNvcmQgcmVjb3JkID0gKElKYXJSZWNvcmQpIHRhZ2xpYlJlY29yZDsKLQkJCQlpZiAocmVjb3JkLmdldERlc2NyaXB0b3IoKS5nZXRTbWFsbEljb24oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJLy8gdXJsID0gImZpbGU6IiArCi0JCQkJCS8vIFVSSUhlbHBlci5ub3JtYWxpemUocmVjb3JkLmdldERlc2NyaXB0b3IoKS5nZXRTbWFsbEljb24oKSwKLQkJCQkJLy8gcmVjb3JkLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVEFHRElSKSA6IHsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVVJMKSA6IHsKLQkJCQlJVVJMUmVjb3JkIHJlY29yZCA9IChJVVJMUmVjb3JkKSB0YWdsaWJSZWNvcmQ7Ci0JCQkJaWYgKHJlY29yZC5nZXREZXNjcmlwdG9yKCkuZ2V0U21hbGxJY29uKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXVybCA9IFVSSUhlbHBlci5ub3JtYWxpemUocmVjb3JkLmdldERlc2NyaXB0b3IoKS5nZXRTbWFsbEljb24oKSwgcmVjb3JkLmdldFVSTCgpLnRvU3RyaW5nKCksICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHVybDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBwcm9qZWN0IHJlcXVlc3QgaXMgaW4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElQYXRoIGdldEJhc2VQYXRoKENvbnRlbnRBc3Npc3RSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSVBhdGggYmFzZWxvY2F0aW9uID0gbnVsbDsKLQotCQlpZiAocmVxdWVzdCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IHJlcXVlc3QuZ2V0RG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHJlZ2lvbi5nZXRQYXJlbnREb2N1bWVudCgpOwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgbG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJYmFzZWxvY2F0aW9uID0gbmV3IFBhdGgobG9jYXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYmFzZWxvY2F0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFRhZ2xpYkRpcmVjdGl2ZUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFRhZ2xpYkRpcmVjdGl2ZUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3NGY4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BUYWdsaWJEaXJlY3RpdmVDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFRoaXMgY2xhc3MgaXMgbm8gbG9uZ2VyIHVzZWQgbG9jYWxseSBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUKLSAqIEBzZWUgSlNQVGFnbGliQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIKLSAqLwotcHVibGljIGNsYXNzIEpTUFRhZ2xpYkRpcmVjdGl2ZUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZXh0ZW5kcyBKU1BEdW1teUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewotCi0JcHJpdmF0ZSBKU1BUYWdsaWJDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciBmQ29tcHV0ZXI7Ci0JCi0JcHVibGljIEpTUFRhZ2xpYkRpcmVjdGl2ZUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZDb21wdXRlciA9IG5ldyBKU1BUYWdsaWJDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCWZDb21wdXRlci5hZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFiMjBlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZVByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIENvbXBsZXRpb24gcHJvY2Vzc29yIGZvciBKU1AgVGVtcGxhdGVzLiBNb3N0IG9mIHRoZSB3b3JrIGlzIGFscmVhZHkgZG9uZSBieQotICogdGhlIEpTUCBDb250ZW50IEFzc2lzdCBwcm9jZXNzb3IsIHNvIGJ5IHRoZSB0aW1lIHRoZQotICogSlNQVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIGlzIGFza2VkIGZvciBjb250ZW50IGFzc2lzdCBwcm9wb3NhbHMsIHRoZQotICoganNwIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvciBoYXMgYWxyZWFkeSBzZXQgdGhlIGNvbnRleHQgdHlwZSBmb3IKLSAqIHRlbXBsYXRlcy4KLSAqLwotY2xhc3MgSlNQVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIGV4dGVuZHMgVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm9wb3NhbENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlyZXR1cm4gKChUZW1wbGF0ZVByb3Bvc2FsKSBvMikuZ2V0UmVsZXZhbmNlKCkgLSAoKFRlbXBsYXRlUHJvcG9zYWwpIG8xKS5nZXRSZWxldmFuY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgZmdQcm9wb3NhbENvbXBhcmF0b3IgPSBuZXcgUHJvcG9zYWxDb21wYXJhdG9yKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNvbnRleHRUeXBlSWQgPSBudWxsOwotCi0JLyoKLQkgKiBDb3BpZWQgZnJvbSBzdXBlciBjbGFzcyBleGNlcHQgaW5zdGVhZCBvZiBjYWxsaW5nIGNyZWF0ZUNvbnRleHQodmlld2VyLAotCSAqIHJlZ2lvbikgY2FsbCBjcmVhdGVDb250ZXh0KHZpZXdlciwgcmVnaW9uLCBvZmZzZXQpIGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCi0JCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgdmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJLy8gYWRqdXN0IG9mZnNldCB0byBlbmQgb2Ygbm9ybWFsaXplZCBzZWxlY3Rpb24KLQkJaWYgKHNlbGVjdGlvbi5nZXRPZmZzZXQoKSA9PSBvZmZzZXQpCi0JCQlvZmZzZXQgPSBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0KLQkJU3RyaW5nIHByZWZpeCA9IGV4dHJhY3RQcmVmaXgodmlld2VyLCBvZmZzZXQpOwotCQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbihvZmZzZXQgLSBwcmVmaXgubGVuZ3RoKCksIHByZWZpeC5sZW5ndGgoKSk7Ci0JCVRlbXBsYXRlQ29udGV4dCBjb250ZXh0ID0gY3JlYXRlQ29udGV4dCh2aWV3ZXIsIHJlZ2lvbiwgb2Zmc2V0KTsKLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQotCQkvLyBuYW1lIG9mIHRoZSBzZWxlY3Rpb24gdmFyaWFibGVzIHtsaW5lLCB3b3JkfV9zZWxlY3Rpb24KLQkJY29udGV4dC5zZXRWYXJpYWJsZSgic2VsZWN0aW9uIiwgc2VsZWN0aW9uLmdldFRleHQoKSk7IC8vIC8vJE5PTi1OTFMtMSQKLQotCQlUZW1wbGF0ZVtdIHRlbXBsYXRlcyA9IGdldFRlbXBsYXRlcyhjb250ZXh0LmdldENvbnRleHRUeXBlKCkuZ2V0SWQoKSk7Ci0KLQkJTGlzdCBtYXRjaGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRlbXBsYXRlcy5sZW5ndGg7IGkrKykgewotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSB0ZW1wbGF0ZXNbaV07Ci0JCQl0cnkgewotCQkJCWNvbnRleHQuZ2V0Q29udGV4dFR5cGUoKS52YWxpZGF0ZSh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQkJfQotCQkJY2F0Y2ggKFRlbXBsYXRlRXhjZXB0aW9uIGUpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh0ZW1wbGF0ZS5tYXRjaGVzKHByZWZpeCwgY29udGV4dC5nZXRDb250ZXh0VHlwZSgpLmdldElkKCkpKQotCQkJCW1hdGNoZXMuYWRkKGNyZWF0ZVByb3Bvc2FsKHRlbXBsYXRlLCBjb250ZXh0LCAoSVJlZ2lvbikgcmVnaW9uLCBnZXRSZWxldmFuY2UodGVtcGxhdGUsIHByZWZpeCkpKTsKLQkJfQotCi0JCUNvbGxlY3Rpb25zLnNvcnQobWF0Y2hlcywgZmdQcm9wb3NhbENvbXBhcmF0b3IpOwotCi0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBtYXRjaGVzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbbWF0Y2hlcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29uY3JldGUgdGVtcGxhdGUgY29udGV4dCBmb3IgdGhlIGdpdmVuIHJlZ2lvbiBpbiB0aGUKLQkgKiBkb2N1bWVudC4gVGhpcyBpbnZvbHZlcyBmaW5kaW5nIG91dCB3aGljaCBjb250ZXh0IHR5cGUgaXMgdmFsaWQgYXQgdGhlCi0JICogZ2l2ZW4gbG9jYXRpb24sIGFuZCB0aGVuIGNyZWF0aW5nIGEgY29udGV4dCBvZiB0aGlzIHR5cGUuIFRoZSBkZWZhdWx0Ci0JICogaW1wbGVtZW50YXRpb24gcmV0dXJucyBhIDxjb2RlPlNtYXJ0UmVwbGFjZVRlbXBsYXRlQ29udGV4dDwvY29kZT4gZm9yCi0JICogdGhlIGNvbnRleHQgdHlwZSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24uIFRoaXMgdGFrZXMgdGhlIG9mZnNldCBhdCB3aGljaAotCSAqIGNvbnRlbnQgYXNzaXN0IHdhcyBpbnZva2VkIGludG8gY29uc2lkZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyIGZvciB3aGljaCB0aGUgY29udGV4dCBpcyBjcmVhdGVkCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbiBpbnRvIDxjb2RlPmRvY3VtZW50PC9jb2RlPiBmb3Igd2hpY2ggdGhlCi0JICogICAgICAgICAgICBjb250ZXh0IGlzIGNyZWF0ZWQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgb2Zmc2V0IHdoZXJlIGNvbnRlbnQgYXNzaXN0IHdhcyBpbnZva2VkCi0JICogQHJldHVybiBhIHRlbXBsYXRlIGNvbnRleHQgdGhhdCBjYW4gaGFuZGxlIHRlbXBsYXRlIGluc2VydGlvbiBhdCB0aGUKLQkgKiAgICAgICAgIGdpdmVuIGxvY2F0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGVDb250ZXh0IGNyZWF0ZUNvbnRleHQoSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQkvLyBwcmV0dHkgbXVjaCBzYW1lIGNvZGUgYXMgc3VwZXIuY3JlYXRlQ29udGV4dCBleGNlcHQgY3JlYXRlCi0JCS8vIFNtYXJ0UmVwbGFjZVRlbXBsYXRlQ29udGV4dAotCQlUZW1wbGF0ZUNvbnRleHRUeXBlIGNvbnRleHRUeXBlID0gZ2V0Q29udGV4dFR5cGUodmlld2VyLCByZWdpb24pOwotCQlpZiAoY29udGV4dFR5cGUgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQlyZXR1cm4gbmV3IFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0KGNvbnRleHRUeXBlLCBkb2N1bWVudCwgcmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCksIG9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlUHJvcG9zYWwoVGVtcGxhdGUgdGVtcGxhdGUsIFRlbXBsYXRlQ29udGV4dCBjb250ZXh0LCBJUmVnaW9uIHJlZ2lvbiwgaW50IHJlbGV2YW5jZSkgewotCQlyZXR1cm4gbmV3IEN1c3RvbVRlbXBsYXRlUHJvcG9zYWwodGVtcGxhdGUsIGNvbnRleHQsIHJlZ2lvbiwgZ2V0SW1hZ2UodGVtcGxhdGUpLCByZWxldmFuY2UpOwotCX0KLQotCXByb3RlY3RlZCBUZW1wbGF0ZUNvbnRleHRUeXBlIGdldENvbnRleHRUeXBlKElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiByZWdpb24pIHsKLQkJVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlID0gbnVsbDsKLQotCQlDb250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKTsKLQkJaWYgKHJlZ2lzdHJ5ICE9IG51bGwpCi0JCQl0eXBlID0gcmVnaXN0cnkuZ2V0Q29udGV4dFR5cGUoZkNvbnRleHRUeXBlSWQpOwotCi0JCXJldHVybiB0eXBlOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZShUZW1wbGF0ZSB0ZW1wbGF0ZSkgewotCQlyZXR1cm4gSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfVEVNUExBVEUpOwotCX0KLQotCXByaXZhdGUgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpOwotCX0KLQotCXByb3RlY3RlZCBUZW1wbGF0ZVtdIGdldFRlbXBsYXRlcyhTdHJpbmcgY29udGV4dFR5cGVJZCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZXNbXSA9IG51bGw7Ci0KLQkJVGVtcGxhdGVTdG9yZSBzdG9yZSA9IGdldFRlbXBsYXRlU3RvcmUoKTsKLQkJaWYgKHN0b3JlICE9IG51bGwpCi0JCQl0ZW1wbGF0ZXMgPSBzdG9yZS5nZXRUZW1wbGF0ZXMoY29udGV4dFR5cGVJZCk7Ci0KLQkJcmV0dXJuIHRlbXBsYXRlczsKLQl9Ci0KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JfQotCi0Jdm9pZCBzZXRDb250ZXh0VHlwZShTdHJpbmcgY29udGV4dFR5cGVJZCkgewotCQlmQ29udGV4dFR5cGVJZCA9IGNvbnRleHRUeXBlSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQVGVtcGxhdGVzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFRlbXBsYXRlc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYjA1ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQVGVtcGxhdGVzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkRlZmF1bHRYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcjsKLQotLyoqCi0gKiA8cD5Db21wdXRlcyBKU1AgdGVtcGxhdGUgY29tcGxldGlvbiBwcm9wb3NhbHM8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUZW1wbGF0ZXNDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciBleHRlbmRzCi0JCURlZmF1bHRYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciB7Ci0KLQkvKiogVGVtcGxhdGUgY29tcGxldGlvbiBwcm9jZXNzb3IgdXNlZCB0byBjcmVhdGUgdGVtcGxhdGUgcHJvcG9zYWxzICovCi0JcHJpdmF0ZSBKU1BUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZlRlbXBsYXRlUHJvY2Vzc29yID0gbnVsbDsKLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGNvbXB1dGVyCi0JICovCi0JcHVibGljIEpTUFRlbXBsYXRlc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyKCkgewotCQl0aGlzLmZUZW1wbGF0ZVByb2Nlc3NvciA9IG5ldyBKU1BUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBMaXN0IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkKLQkJLy9nZXQgdGhlIHRlbXBsYXRlcyBzcGVjaWZpYyB0byB0aGUgY29udGV4dAotCQlMaXN0IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoY29udGV4dCwgbW9uaXRvcikpOwotCQkKLQkJLy9nZXQgdGVtcGxhdGVzIG5vdCBzcGVjaWZpYyB0byB0aGUgY29udGV4dAotCQlwcm9wb3NhbHMuYWRkQWxsKHRoaXMuZ2V0VGVtcGxhdGVQcm9wb3NhbHMoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5BTEwsIGNvbnRleHQpKTsKLQkKLQkJcmV0dXJuIHByb3Bvc2FsczsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuRGVmYXVsdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2FkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlTmFtZVByb3Bvc2FscygKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFUVFJJQlVURSwgY29udGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkRlZmF1bHRYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3QsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscygKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFUVFJJQlVURV9WQUxVRSwgY29udGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkRlZmF1bHRYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoCi0JCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGNoaWxkUG9zaXRpb24sCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCQotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuVEFHLCBjb250ZXh0KTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuRGVmYXVsdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2FkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW1wdHlEb2N1bWVudFByb3Bvc2FscygKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkKLQkJaWYgKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BUQUcuZXF1YWxzKAotCQkJCSgoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKSkuZ2V0TW9kZWwoKS5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSkpIHsKLQkJCQotCQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLk5FV19UQUcsIGNvbnRleHQpOwotCQl9IGVsc2UgewotCQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLk5FVywgY29udGV4dCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+R2V0IHRoZSB0ZW1wbGF0ZSBwcm9wb3NhbHMgZnJvbSB0aGUgdGVtcGxhdGUgcHJvY2Vzc29yPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZUNvbnRleHQKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VGVtcGxhdGVQcm9wb3NhbHMoU3RyaW5nIHRlbXBsYXRlQ29udGV4dCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJCi0JCUxpc3QgdGVtcGxhdGVQcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlpZiAoZlRlbXBsYXRlUHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVByb2Nlc3Nvci5zZXRDb250ZXh0VHlwZSh0ZW1wbGF0ZUNvbnRleHQpOwotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9Ci0JCQkJZlRlbXBsYXRlUHJvY2Vzc29yLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGNvbnRleHQuZ2V0Vmlld2VyKCksIGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpKTsKLQkJCi0JCQl0ZW1wbGF0ZVByb3Bvc2Fscy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwcm9wb3NhbHMpKTsKLQkJfQotCQkKLQkJcmV0dXJuIHRlbXBsYXRlUHJvcG9zYWxzOwotCX0KLQkKLQkvKioKLQkgKiA8cD5BZGRzIHRlbXBsYXRlcyB0byB0aGUgbGlzdCBvZiBwcm9wb3NhbHM8L3A+Ci0JICogCi0JICogQHBhcmFtIGNvbnRlbnRBc3Npc3RSZXF1ZXN0Ci0JICogQHBhcmFtIHRlbXBsYXRlQ29udGV4dAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRlbXBsYXRlcyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgU3RyaW5nIHRlbXBsYXRlQ29udGV4dCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJCi0JCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdCAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHVzZVByb3Bvc2FsTGlzdCA9ICFjb250ZW50QXNzaXN0UmVxdWVzdC5zaG91bGRTZXBhcmF0ZSgpOwotCQkJTGlzdCBwcm9wb3NhbHMgPSB0aGlzLmdldFRlbXBsYXRlUHJvcG9zYWxzKHRlbXBsYXRlQ29udGV4dCwgY29udGV4dCk7Ci0JCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3Bvc2Fscy5zaXplKCk7ICsraSkgewotCQkJCWlmICh1c2VQcm9wb3NhbExpc3QpIHsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwoKElDb21wbGV0aW9uUHJvcG9zYWwpcHJvcG9zYWxzLmdldChpKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRNYWNybygoSUNvbXBsZXRpb25Qcm9wb3NhbClwcm9wb3NhbHMuZ2V0KGkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BVc2VCZWFuQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFVzZUJlYW5Db21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjAzMzU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFVzZUJlYW5Db21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5EZWZhdWx0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI7Ci0KLS8qKgotICogPHA+Q29tcHV0ZSBKU1AgdXNlIGJlYW4gY29tcGxldGlvbiBwcm9wb3NhbHM8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BVc2VCZWFuQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgZXh0ZW5kcwotCQlEZWZhdWx0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuRGVmYXVsdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2FkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKAotCQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCQotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0KLQkJLy9vbmx5IGFkZCBhdHRyaWJ1dGUgdmFsdWUgcHJvcG9zYWxzIGZvciBzcGVjaWZpYyBlbGVtZW50cwotCQlpZihub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4pKSB7Ci0JCQkvLyBGaW5kIHRoZSBhdHRyaWJ1dGUgbmFtZSBmb3Igd2hpY2ggdGhpcyBwb3NpdGlvbiBzaG91bGQgaGF2ZSBhIHZhbHVlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9wZW4gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3Qgb3BlblJlZ2lvbnMgPSBvcGVuLmdldFJlZ2lvbnMoKTsKLQkJCWludCBpID0gb3BlblJlZ2lvbnMuaW5kZXhPZihjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSk7Ci0JCQlpZiAoaSA8IDApCi0JCQkJcmV0dXJuOwotCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCQl3aGlsZSAoaSA+PSAwKSB7Ci0JCQkJbmFtZVJlZ2lvbiA9IG9wZW5SZWdpb25zLmdldChpLS0pOwotCQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJCWJyZWFrOwotCQkJfQotCQotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBudWxsOwotCQkJaWYgKG5hbWVSZWdpb24gIT0gbnVsbCkKLQkJCQlhdHRyaWJ1dGVOYW1lID0gb3Blbi5nZXRUZXh0KG5hbWVSZWdpb24pOwotCQotCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IG51bGw7Ci0JCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpCi0JCQkJY3VycmVudFZhbHVlID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0VGV4dCgpOwotCQkJZWxzZQotCQkJCWN1cnJlbnRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBudWxsOwotCQkJLy8gZml4dXBzCi0JCQlpbnQgc3RhcnQgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKTsKLQkJCWludCBsZW5ndGggPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpOwotCQkJaWYgKGN1cnJlbnRWYWx1ZS5sZW5ndGgoKSA+IFN0cmluZ1V0aWxzLnN0cmlwKGN1cnJlbnRWYWx1ZSkubGVuZ3RoKCkgJiYgKGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCJcIiIpIHx8IGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCInIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJJiYgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQltYXRjaFN0cmluZyA9IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoMSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSk7Ci0JCQkJc3RhcnQrKzsKLQkJCQlsZW5ndGggPSBtYXRjaFN0cmluZy5sZW5ndGgoKTsKLQkJCX0gZWxzZQotCQkJCW1hdGNoU3RyaW5nID0gY3VycmVudFZhbHVlLnN1YnN0cmluZygwLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpKTsKLQkJCWJvb2xlYW4gZXhpc3RpbmdDb21wbGljYXRlZFZhbHVlID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkgIT0gbnVsbCAmJiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyOwotCQkJaWYgKGV4aXN0aW5nQ29tcGxpY2F0ZWRWYWx1ZSkgewotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFByb3Bvc2FscygpLmNsZWFyKCk7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWFjcm9zKCkuY2xlYXIoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9DTEFTUykpIHsKLQkJCQkJLy8gY2xhc3MgaXMgdGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIGNsYXNzCi0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IEpTUENvbnRlbnRBc3Npc3RIZWxwZXIuZ2V0UmVzb3VyY2UoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gY2xhc3NQcm9wb3NhbHMgPSBKYXZhVHlwZUZpbmRlci5nZXRDbGFzc1Byb3Bvc2FscyhyZXNvdXJjZSwgc3RhcnQsIGxlbmd0aCk7Ci0JCQkJCWlmIChjbGFzc1Byb3Bvc2FscyAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNsYXNzUHJvcG9zYWxzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAoSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwpIGNsYXNzUHJvcG9zYWxzW2pdOwotCQkJCQkJCWlmIChtYXRjaFN0cmluZy5sZW5ndGgoKSA9PSAwIHx8IHByb3Bvc2FsLmdldFF1YWxpZmllZE5hbWUoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcudG9Mb3dlckNhc2UoKSkgfHwgcHJvcG9zYWwuZ2V0U2hvcnROYW1lKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nLnRvTG93ZXJDYXNlKCkpKQotCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFKSkgewotCQkJCQkvLyB0eXBlIGlzIHRoZSBtb3JlIGdlbmVyYWwgdHlwZSBmb3IgdGhlIGJlYW4KLQkJCQkJLy8gd2hpY2ggbWVhbnMgaXQgbWF5IGJlIGFuIGludGVyZmFjZQotCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBKU1BDb250ZW50QXNzaXN0SGVscGVyLmdldFJlc291cmNlKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHR5cGVQcm9wb3NhbHMgPSBKYXZhVHlwZUZpbmRlci5nZXRUeXBlUHJvcG9zYWxzKHJlc291cmNlLCBzdGFydCwgbGVuZ3RoKTsKLQkJCQkJaWYgKHR5cGVQcm9wb3NhbHMgIT0gbnVsbCkgewotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0eXBlUHJvcG9zYWxzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAoSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwpIHR5cGVQcm9wb3NhbHNbal07Ci0JCQkJCQkJaWYgKG1hdGNoU3RyaW5nLmxlbmd0aCgpID09IDAgfHwgcHJvcG9zYWwuZ2V0UXVhbGlmaWVkTmFtZSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaFN0cmluZy50b0xvd2VyQ2FzZSgpKSB8fCBwcm9wb3NhbC5nZXRTaG9ydE5hbWUoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcudG9Mb3dlckNhc2UoKSkpCi0JCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0JFQU5fTkFNRSkpIHsKLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gSlNQQ29udGVudEFzc2lzdEhlbHBlci5nZXRSZXNvdXJjZShjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBiZWFuTmFtZVByb3Bvc2FscyA9IEphdmFUeXBlRmluZGVyLmdldEJlYW5Qcm9wb3NhbHMocmVzb3VyY2UsIHN0YXJ0LCBsZW5ndGgpOwotCQkJCQlpZiAoYmVhbk5hbWVQcm9wb3NhbHMgIT0gbnVsbCkgewotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBiZWFuTmFtZVByb3Bvc2Fscy5sZW5ndGg7IGorKykgewotCQkJCQkJCWlmIChiZWFuTmFtZVByb3Bvc2Fsc1tqXSBpbnN0YW5jZW9mIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCkgewotCQkJCQkJCQlKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IChKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCkgYmVhbk5hbWVQcm9wb3NhbHNbal07Ci0JCQkJCQkJCWlmIChtYXRjaFN0cmluZy5sZW5ndGgoKSA9PSAwIHx8IHByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcudG9Mb3dlckNhc2UoKSkpCi0JCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQkJfSBlbHNlIGlmIChiZWFuTmFtZVByb3Bvc2Fsc1tqXSBpbnN0YW5jZW9mIEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsKSB7Ci0JCQkJCQkJCUphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gKEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsKSBiZWFuTmFtZVByb3Bvc2Fsc1tqXTsKLQkJCQkJCQkJaWYgKG1hdGNoU3RyaW5nLmxlbmd0aCgpID09IDAgfHwgcHJvcG9zYWwuZ2V0UXVhbGlmaWVkTmFtZSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaFN0cmluZy50b0xvd2VyQ2FzZSgpKSB8fCBwcm9wb3NhbC5nZXRTaG9ydE5hbWUoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcudG9Mb3dlckNhc2UoKSkpCi0JCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQVXNlQmVhbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFVzZUJlYW5Db250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYjdmOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQVXNlQmVhbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3Q7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyBpcyBubyBsb25nZXIgdXNlZCBsb2NhbGx5IGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZQotICogQHNlZSBKU1BVc2VCZWFuQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIKLSAqLwotcHVibGljIGNsYXNzIEpTUFVzZUJlYW5Db250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgSlNQRHVtbXlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQotCXByaXZhdGUgSlNQVXNlQmVhbkNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIGZDb21wdXRlcjsKLQkKLQlwdWJsaWMgSlNQVXNlQmVhbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZDb21wdXRlciA9IG5ldyBKU1BVc2VCZWFuQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlmQ29tcHV0ZXIuYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0phdmFQYXJhbWV0ZXJMaXN0VmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhUGFyYW1ldGVyTGlzdFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzNhNGMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0phdmFQYXJhbWV0ZXJMaXN0VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLQotCi0vKioKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVBhcmFtZXRlckxpc3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yLCBJQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyIHsKLQotCXByaXZhdGUgaW50IGZQb3NpdGlvbjsKLQlwcml2YXRlIElUZXh0Vmlld2VyIGZWaWV3ZXI7Ci0JcHJpdmF0ZSBJQ29udGV4dEluZm9ybWF0aW9uIGZJbmZvcm1hdGlvbjsKLQotCXByaXZhdGUgaW50IGZDdXJyZW50UGFyYW1ldGVyOwotCi0JLyoqCi0JICogQHNlZSBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yI2luc3RhbGwoSUNvbnRleHRJbmZvcm1hdGlvbiwKLQkgKiAgICAgIElUZXh0Vmlld2VyLCBpbnQpCi0JICogQHNlZSBJQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyI2luc3RhbGwoSUNvbnRleHRJbmZvcm1hdGlvbiwKLQkgKiAgICAgIElUZXh0Vmlld2VyLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChJQ29udGV4dEluZm9ybWF0aW9uIGluZm8sIElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJZlBvc2l0aW9uID0gZG9jdW1lbnRQb3NpdGlvbjsKLQkJZlZpZXdlciA9IHZpZXdlcjsKLQkJZkluZm9ybWF0aW9uID0gaW5mbzsKLQotCQlmQ3VycmVudFBhcmFtZXRlciA9IC0xOwotCX0KLQotCXByaXZhdGUgaW50IGdldENvbW1lbnRFbmQoSURvY3VtZW50IGQsIGludCBwb3MsIGludCBlbmQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChwb3MgPCBlbmQpIHsKLQkJCWNoYXIgY3VyciA9IGQuZ2V0Q2hhcihwb3MpOwotCQkJcG9zKys7Ci0JCQlpZiAoY3VyciA9PSAnKicpIHsKLQkJCQlpZiAocG9zIDwgZW5kICYmIGQuZ2V0Q2hhcihwb3MpID09ICcvJykgewotCQkJCQlyZXR1cm4gcG9zICsgMTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVuZDsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRTdHJpbmdFbmQoSURvY3VtZW50IGQsIGludCBwb3MsIGludCBlbmQsIGNoYXIgY2gpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChwb3MgPCBlbmQpIHsKLQkJCWNoYXIgY3VyciA9IGQuZ2V0Q2hhcihwb3MpOwotCQkJcG9zKys7Ci0JCQlpZiAoY3VyciA9PSAnXFwnKSB7Ci0JCQkJLy8gaWdub3JlIGVzY2FwZWQgY2hhcmFjdGVycwotCQkJCXBvcysrOwotCQkJfQotCQkJZWxzZSBpZiAoY3VyciA9PSBjaCkgewotCQkJCXJldHVybiBwb3M7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVuZDsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRDaGFyQ291bnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnQsIGludCBlbmQsIGNoYXIgaW5jcmVtZW50LCBjaGFyIGRlY3JlbWVudCwgYm9vbGVhbiBjb25zaWRlck5lc3RpbmcpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0KLQkJQXNzZXJ0LmlzVHJ1ZSgoaW5jcmVtZW50ICE9IDAgfHwgZGVjcmVtZW50ICE9IDApICYmIGluY3JlbWVudCAhPSBkZWNyZW1lbnQpOwotCi0JCWludCBuZXN0aW5nTGV2ZWwgPSAwOwotCQlpbnQgY2hhckNvdW50ID0gMDsKLQkJd2hpbGUgKHN0YXJ0IDwgZW5kKSB7Ci0JCQljaGFyIGN1cnIgPSBkb2N1bWVudC5nZXRDaGFyKHN0YXJ0KyspOwotCQkJc3dpdGNoIChjdXJyKSB7Ci0JCQkJY2FzZSAnLycgOgotCQkJCQlpZiAoc3RhcnQgPCBlbmQpIHsKLQkJCQkJCWNoYXIgbmV4dCA9IGRvY3VtZW50LmdldENoYXIoc3RhcnQpOwotCQkJCQkJaWYgKG5leHQgPT0gJyonKSB7Ci0JCQkJCQkJLy8gYSBjb21tZW50IHN0YXJ0cywgYWR2YW5jZSB0byB0aGUgY29tbWVudCBlbmQKLQkJCQkJCQlzdGFydCA9IGdldENvbW1lbnRFbmQoZG9jdW1lbnQsIHN0YXJ0ICsgMSwgZW5kKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKG5leHQgPT0gJy8nKSB7Ci0JCQkJCQkJLy8gJy8vJy1jb21tZW50OiBub3RoaW5nIHRvIGRvIGFueW1vcmUgb24gdGhpcwotCQkJCQkJCS8vIGxpbmUKLQkJCQkJCQlzdGFydCA9IGVuZDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlICcqJyA6Ci0JCQkJCWlmIChzdGFydCA8IGVuZCkgewotCQkJCQkJY2hhciBuZXh0ID0gZG9jdW1lbnQuZ2V0Q2hhcihzdGFydCk7Ci0JCQkJCQlpZiAobmV4dCA9PSAnLycpIHsKLQkJCQkJCQkvLyB3ZSBoYXZlIGJlZW4gaW4gYSBjb21tZW50OiBmb3JnZXQgd2hhdCB3ZSByZWFkCi0JCQkJCQkJLy8gYmVmb3JlCi0JCQkJCQkJY2hhckNvdW50ID0gMDsKLQkJCQkJCQkrK3N0YXJ0OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyInIDoKLQkJCQljYXNlICdcJycgOgotCQkJCQlzdGFydCA9IGdldFN0cmluZ0VuZChkb2N1bWVudCwgc3RhcnQsIGVuZCwgY3Vycik7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCi0JCQkJCWlmIChjb25zaWRlck5lc3RpbmcpIHsKLQotCQkJCQkJaWYgKCcoJyA9PSBjdXJyKQotCQkJCQkJCSsrbmVzdGluZ0xldmVsOwotCQkJCQkJZWxzZSBpZiAoJyknID09IGN1cnIpCi0JCQkJCQkJLS1uZXN0aW5nTGV2ZWw7Ci0KLQkJCQkJCWlmIChuZXN0aW5nTGV2ZWwgIT0gMCkKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCQkJCWlmIChpbmNyZW1lbnQgIT0gMCkgewotCQkJCQkJaWYgKGN1cnIgPT0gaW5jcmVtZW50KQotCQkJCQkJCSsrY2hhckNvdW50OwotCQkJCQl9Ci0KLQkJCQkJaWYgKGRlY3JlbWVudCAhPSAwKSB7Ci0JCQkJCQlpZiAoY3VyciA9PSBkZWNyZW1lbnQpCi0JCQkJCQkJLS1jaGFyQ291bnQ7Ci0JCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGFyQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yI2lzQ29udGV4dEluZm9ybWF0aW9uVmFsaWQoaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29udGV4dEluZm9ybWF0aW9uVmFsaWQoaW50IHBvc2l0aW9uKSB7Ci0KLQkJdHJ5IHsKLQkJCWlmIChwb3NpdGlvbiA8IGZQb3NpdGlvbikKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCUlSZWdpb24gbGluZSA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGZQb3NpdGlvbik7Ci0KLQkJCWlmIChwb3NpdGlvbiA8IGxpbmUuZ2V0T2Zmc2V0KCkgfHwgcG9zaXRpb24gPj0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlyZXR1cm4gKGdldENoYXJDb3VudChkb2N1bWVudCwgZlBvc2l0aW9uLCBwb3NpdGlvbiwgJygnLCAnKScsIGZhbHNlKSA+PSAwKTsKLQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIjdXBkYXRlUHJlc2VudGF0aW9uKGludCwKLQkgKiAgICAgIFRleHRQcmVzZW50YXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlUHJlc2VudGF0aW9uKGludCBwb3NpdGlvbiwgVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24pIHsKLQotCQlpbnQgY3VycmVudFBhcmFtZXRlciA9IC0xOwotCi0JCXRyeSB7Ci0JCQljdXJyZW50UGFyYW1ldGVyID0gZ2V0Q2hhckNvdW50KGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKSwgZlBvc2l0aW9uLCBwb3NpdGlvbiwgJywnLCAoY2hhcikgMCwgdHJ1ZSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChmQ3VycmVudFBhcmFtZXRlciAhPSAtMSkgewotCQkJaWYgKGN1cnJlbnRQYXJhbWV0ZXIgPT0gZkN1cnJlbnRQYXJhbWV0ZXIpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGZJbmZvcm1hdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXByZXNlbnRhdGlvbi5jbGVhcigpOwotCQlmQ3VycmVudFBhcmFtZXRlciA9IGN1cnJlbnRQYXJhbWV0ZXI7Ci0KLQkJU3RyaW5nIHMgPSBmSW5mb3JtYXRpb24uZ2V0SW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nKCk7Ci0JCWludCBzdGFydCA9IDA7Ci0JCWludCBvY2N1cnJlbmNlcyA9IDA7Ci0JCXdoaWxlIChvY2N1cnJlbmNlcyA8IGZDdXJyZW50UGFyYW1ldGVyKSB7Ci0JCQlpbnQgZm91bmQgPSBzLmluZGV4T2YoJywnLCBzdGFydCk7Ci0JCQlpZiAoZm91bmQgPT0gLTEpCi0JCQkJYnJlYWs7Ci0JCQlzdGFydCA9IGZvdW5kICsgMTsKLQkJCSsrb2NjdXJyZW5jZXM7Ci0JCX0KLQotCQlpZiAob2NjdXJyZW5jZXMgPCBmQ3VycmVudFBhcmFtZXRlcikgewotCQkJcHJlc2VudGF0aW9uLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2UoMCwgcy5sZW5ndGgoKSwgbnVsbCwgbnVsbCwgU1dULk5PUk1BTCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAoc3RhcnQgPT0gLTEpCi0JCQlzdGFydCA9IDA7Ci0KLQkJaW50IGVuZCA9IHMuaW5kZXhPZignLCcsIHN0YXJ0KTsKLQkJaWYgKGVuZCA9PSAtMSkKLQkJCWVuZCA9IHMubGVuZ3RoKCk7Ci0KLQkJaWYgKHN0YXJ0ID4gMCkKLQkJCXByZXNlbnRhdGlvbi5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKDAsIHN0YXJ0LCBudWxsLCBudWxsLCBTV1QuTk9STUFMKSk7Ci0KLQkJaWYgKGVuZCA+IHN0YXJ0KQotCQkJcHJlc2VudGF0aW9uLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0LCBudWxsLCBudWxsLCBTV1QuQk9MRCkpOwotCi0JCWlmIChlbmQgPCBzLmxlbmd0aCgpKQotCQkJcHJlc2VudGF0aW9uLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2UoZW5kLCBzLmxlbmd0aCgpIC0gZW5kLCBudWxsLCBudWxsLCBTV1QuTk9STUFMKSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0phdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmE4ZTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0phdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIElDb21wbGV0aW9uUHJvcG9zYWwgd2hvc2UgdmFsdWVzIGNhbiBiZQotICogcmVhZCBhZnRlciBjcmVhdGlvbi4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCBleHRlbmRzIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBpbXBsZW1lbnRzIElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwgewotCi0JcHJpdmF0ZSBpbnQgZkN1cnNvclBvc2l0aW9uID0gMDsKLQlwcml2YXRlIFN0cmluZyBmTG9jYWxEaXNwbGF5U3RyaW5nOwotCXByaXZhdGUgU3RyaW5nIGZTaG9ydE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZlF1YWxpZmllZE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNvbnRhaW5lck5hbWU7Ci0KLQlwdWJsaWMgSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwoU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nLCBpbnQgcmVwbGFjZW1lbnRPZmZzZXQsIGludCByZXBsYWNlbWVudExlbmd0aCwgU3RyaW5nIHF1YWxpZmllZE5hbWUsIEltYWdlIGltYWdlLCBTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBjb250YWluZXJOYW1lLCAgaW50IHJlbGV2ZW5jZSwgIGJvb2xlYW4gdXBkYXRlUmVwbGFjZW1lbnRMZW5ndGhPblZhbGlkYXRlKSB7Ci0JCXN1cGVyKHJlcGxhY2VtZW50U3RyaW5nLCByZXBsYWNlbWVudE9mZnNldCwgcmVwbGFjZW1lbnRMZW5ndGgsIHF1YWxpZmllZE5hbWUubGVuZ3RoKCkgKyAyLCBpbWFnZSwgCi0gICAgICAgICAgICAgICAgKGNvbnRhaW5lck5hbWUgIT0gbnVsbCAmJiBjb250YWluZXJOYW1lLmxlbmd0aCgpID4gMCkgPyB0eXBlTmFtZSArICIgLSAiICsgY29udGFpbmVyTmFtZSA6IHR5cGVOYW1lLCBudWxsLCBudWxsLCByZWxldmVuY2UsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCS8vIENNVkMgMjQzODE3LCBzdXBlcmNsYXNzIHdhcyBjb21wYXJpbmcgaW5jb3JyZWN0IGRpc3BsYXkgc3RyaW5nIGluIHZhbGlkYXRlIG1ldGhvZC4uLgotCQkvL3N1cGVyKHJlcGxhY2VtZW50U3RyaW5nLCByZXBsYWNlbWVudE9mZnNldCwgcmVwbGFjZW1lbnRMZW5ndGgsIGltYWdlLCAoY29udGFpbmVyTmFtZSAhPSBudWxsICYmIGNvbnRhaW5lck5hbWUubGVuZ3RoKCkgPiAwKT8gdHlwZU5hbWUgKyAiIC0gIiArIGNvbnRhaW5lck5hbWU6dHlwZU5hbWUvKnF1YWxpZmllZE5hbWUqLywgcmVsZXZlbmNlKTsKLQkJZlNob3J0TmFtZSA9IHR5cGVOYW1lOwotCQlmUXVhbGlmaWVkTmFtZSA9IHF1YWxpZmllZE5hbWU7Ci0JCWZDb250YWluZXJOYW1lID0gY29udGFpbmVyTmFtZTsKLQkJZkN1cnNvclBvc2l0aW9uID0gZlF1YWxpZmllZE5hbWUubGVuZ3RoKCkgKyAyOwotCQkvL2ZQcm9wb3NhbEluZm8gPSBwcm9wb3NhbEluZm87Ci0JCWlmIChjb250YWluZXJOYW1lICE9IG51bGwgJiYgY29udGFpbmVyTmFtZS5sZW5ndGgoKSA+IDApCi0JCQlmTG9jYWxEaXNwbGF5U3RyaW5nID0gdHlwZU5hbWUgKyAiIC0gIiArIGNvbnRhaW5lck5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJZkxvY2FsRGlzcGxheVN0cmluZyA9IHR5cGVOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIGZMb2NhbERpc3BsYXlTdHJpbmc7Ci0JfQotCi0JcHVibGljIGludCBnZXRDdXJzb3JQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZDdXJzb3JQb3NpdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDdXJzb3JQb3NpdGlvbihpbnQgY3Vyc29yUG9zaXRpb24pIHsKLQkJc3VwZXIuc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zaXRpb24pOwotCQlmQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7Ci0JCXJldHVybiBmUXVhbGlmaWVkTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCS8vCQlTdHJpbmcgaW5mbyA9IHN1cGVyLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJLy8JCWlmIChpbmZvID09IG51bGwgfHwgaW5mby5sZW5ndGgoKSA9PSAwICYmIGZQcm9wb3NhbEluZm8gIT0gbnVsbCkKLQkJLy8JCQlyZXR1cm4gZlByb3Bvc2FsSW5mby5nZXRJbmZvKCk7Ci0JCS8vCQlyZXR1cm4gaW5mbzsKLQkJcmV0dXJuIG51bGw7IC8vIHVuZXhwbGFpbmVkIE5QRQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCkgewotCQlyZXR1cm4gZlNob3J0TmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEltcG9ydChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlTdHJpbmcgaW1wb3J0U3BlYyA9IG51bGw7Ci0JCWJvb2xlYW4gaXNJbXBvcnQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCWlmIChmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbikuZXF1YWxzKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9JTVBPUlQpKSB7Ci0JCQkJCWlzSW1wb3J0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlzSW1wb3J0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoaXNJbXBvcnQgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJaW1wb3J0U3BlYyA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1wb3J0U3BlYzsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYW4gaW1wb3J0IHBhZ2UgZGlyZWN0aXZlIGZvciB0aGUgY3VycmVudCB0eXBlIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGFwcGx5SW1wb3J0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbW9kZWwpIHsKLQkJLy8gaWYgdGhlIHR5cGUgaXMgaW4gdGhlIGRlZmF1bHQgcGFja2FnZSBvciBqYXZhLmxhbmcsIHNraXAgaXQKLQkJaWYgKGZDb250YWluZXJOYW1lID09IG51bGwgfHwgZkNvbnRhaW5lck5hbWUubGVuZ3RoKCkgPT0gMCB8fCBmQ29udGFpbmVyTmFtZS5lcXVhbHMoImphdmEubGFuZyIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gMDsKLQkJLy8gY29sbGVjdCBwYWdlIGRpcmVjdGl2ZXMgYW5kIHN0b3JlIHRoZWlyIGltcG9ydCB2YWx1ZXMKLQkJTGlzdCBpbXBvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBtb2RlbC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCS8vIHVzZSB0aGUgbGFzdCBwb3NpdGlvbiBvZiBhIHBhZ2UgZGlyZWN0aXZlIGFzIGEgaGludCBhcyB0byB3aGVyZSB0byBhZGQKLQkJLy8gYSBuZXcgb25lCi0JCWludCBoaW50ID0gMDsKLQkJLy8gd2F0Y2ggZm9yIGpzcDpyb290IHNvIHRoYXQgd2UgdXNlIHRoZSByaWdodCBYTUwvSlNQIGZvcm1hdCBmb3IgdGhlIGRpcmVjdGl2ZQotCQlib29sZWFuIHVzZVhNTCA9IGZhbHNlOwotCi0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCS8vIENhbid0IGp1c3QgbG9vayBmb3IgYWxsIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgc3RhcnRpbmcgd2l0aCBKU1BfRElSRUNUSVZFX09QRU4KLQkJCS8vIHNpbmNlIHRoZSBYTUwgZm9ybSBpcyByZXF1aXJlZCwgdG9vCi0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG5vZGUuZ2V0UmVnaW9ucygpOwotCQkJaWYgKHJlZ2lvbnMuc2l6ZSgpID4gMSkgewotCQkJCUlUZXh0UmVnaW9uIG5hbWUgPSByZWdpb25zLmdldCgxKTsKLQkJCQkvLyB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgSlNQIGRpcmVjdGl2ZQotCQkJCWlmIChuYW1lLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQkJLy8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBhICpwYWdlKiBkaXJlY3RpdmUKLQkJCQkJaWYgKG5vZGUuZ2V0VGV4dChuYW1lKS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1BBR0UpIHx8IG5vZGUuZ2V0VGV4dChuYW1lKS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1BBR0UpKSB7Ci0JCQkJCQlpZiAobm9kZS5nZXRFbmRPZmZzZXQoKSA8IGdldFJlcGxhY2VtZW50T2Zmc2V0KCkpCi0JCQkJCQkJaGludCA9IG5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQlTdHJpbmcgaW1wb3J0U3BlYyA9IGdldEltcG9ydChub2RlKTsKLQkJCQkJCWlmIChpbXBvcnRTcGVjICE9IG51bGwpIHsKLQkJCQkJCQlpbXBvcnRzLmFkZChpbXBvcnRTcGVjKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gaWYgdGhpcyBpcyBhIGpzcDpyb290IHRhZywgdXNlIHRoZSBYTUwgZm9ybQotCQkJCQl1c2VYTUwgPSB1c2VYTUwgfHwgbmFtZS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUU7Ci0JCQkJfQotCQkJfQotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0KLQkJLy8gZXZhbHVhdGUgcmVxdWlyZW1lbnRzIGZvciBhICJuZXciIGltcG9ydCBkaXJlY3RpdmUKLQkJYm9vbGVhbiBuZWVkc0ltcG9ydCA9ICFpbXBvcnRIYW5kbGVzKGZRdWFsaWZpZWROYW1lLCBpbXBvcnRzKTsKLQkJaW50IGFkanVzdG1lbnRMZW5ndGggPSAwOwotCQkvLyBpbnNlcnQgIm5ldyIgaW1wb3J0IGRpcmVjdGl2ZQotCQlpZiAobmVlZHNJbXBvcnQpIHsKLQkJCVN0cmluZyBkaXJlY3RpdmUgPSBudWxsOwotCi0JCQkvLyB2YXJ5IHRoZSBYTUwgYmVoYXZpb3IKLQkJCWlmICh1c2VYTUwpIHsKLQkJCQlkaXJlY3RpdmUgPSAiPGpzcDpkaXJlY3RpdmUucGFnZSBpbXBvcnQ9XCIiICsgZlF1YWxpZmllZE5hbWUgKyAiXCIvPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZGlyZWN0aXZlID0gIjwlQCBwYWdlIGltcG9ydD1cIiIgKyBmUXVhbGlmaWVkTmFtZSArICJcIiAlPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQl0cnkgewotCQkJCUlSZWdpb24gbGluZSA9IG1vZGVsLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGhpbnQpOwotCQkJCWJvb2xlYW4gcHJlcGVuZE5ld0xpbmUgPSBsaW5lLmdldE9mZnNldCgpICsgbGluZS5nZXRMZW5ndGgoKSA9PSBoaW50OwotCQkJCWJvb2xlYW4gYXBwZW5kTmV3TGluZSA9IGhpbnQgPT0gMDsKLQkJCQlpZiAocHJlcGVuZE5ld0xpbmUpCi0JCQkJCWRpcmVjdGl2ZSA9IG1vZGVsLmdldExpbmVEZWxpbWl0ZXIoKSArIGRpcmVjdGl2ZTsKLQkJCQlpZiAoYXBwZW5kTmV3TGluZSkKLQkJCQkJZGlyZWN0aXZlID0gZGlyZWN0aXZlICsgbW9kZWwuZ2V0TGluZURlbGltaXRlcigpOwotCQkJCWFkanVzdG1lbnRMZW5ndGggPSBkaXJlY3RpdmUubGVuZ3RoKCk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCi0JCQl0cnkgewotCQkJCW1vZGVsLnJlcGxhY2UoaGludCwgMCwgZGlyZWN0aXZlKTsKLQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBOb3QgdGhhdCB3ZSBzaG91bGQgZXZlciBnZXQgYSBCTEUsIGJ1dCBpZiBzbywgb3VyCi0JCQkJLy8gcmVwbGFjZW1lbnQgb2Zmc2V0IGZyb20gdGhlIENvbnRlbnQgQXNzaXN0IGNhbGwgc2hvdWxkCi0JCQkJLy8gd29yawotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsLnJlcGxhY2UoZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSwgMCwgZGlyZWN0aXZlKTsKLQkJCQkJYWRqdXN0bWVudExlbmd0aCA9IGRpcmVjdGl2ZS5sZW5ndGgoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUyKSB7Ci0JCQkJCS8vIG5vdyB3aGF0PwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYWRqdXN0bWVudExlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgaWYgdGhlIGltcG9ydCBzcGVjaWZpY2F0aW9uIGlzIGEgd2lsZGNhcmQgaW1wb3J0LCBhbmQgaWYgc28sIHRoYXQKLQkgKiBpdCBhcHBsaWVzIHRvIHRoZSBnaXZlbiB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzV2lsZGNhcmRNYXRjaChTdHJpbmcgaW1wb3J0U3BlYywgU3RyaW5nIHR5cGUpIHsKLQkJaW50IHNwZWNMZW5ndGggPSBpbXBvcnRTcGVjLmxlbmd0aCgpOwotCQlpZiAoaW1wb3J0U3BlYy5lbmRzV2l0aCgiKiIpICYmIHNwZWNMZW5ndGggPiAyICYmIHR5cGUubGVuZ3RoKCkgPj0gc3BlY0xlbmd0aCkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBwdWxsIG91dCB0aGUgcGFja2FnZSBuYW1lIGluY2x1ZGluZyB0aGUgZmluYWwgJy4nCi0JCQlTdHJpbmcgY29udGFpbmVyID0gaW1wb3J0U3BlYy5zdWJzdHJpbmcoMCwgc3BlY0xlbmd0aCAtIDEpOwotCQkJLy8gdmVyaWZ5IHRoYXQgdGhlIHR5cGUgaXMgaW4gdGhlIGNvbnRhaW5lcidzIGhpZXJhcmNoeSBhbmQgdGhhdAotCQkJLy8gdGhlcmUgYXJlIG5vIG90aGVyIHBhY2thZ2Ugc2VwYXJhdG9ycyBhZnRlcndhcmRzCi0JCQlpZiAodHlwZS5zdGFydHNXaXRoKGNvbnRhaW5lcikgJiYgdHlwZS5pbmRleE9mKCcuJywgc3BlY0xlbmd0aCAtIDEpIDwgMCkgewotCQkJCS8vIGNvbnRhaW5lciBtYXRjaGVzCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGltcG9ydEhhbmRsZXMoU3RyaW5nIHR5cGUsIExpc3QgbGlzdE9mSW1wb3J0cykgewotCQlJdGVyYXRvciBpbXBvcnRzID0gbGlzdE9mSW1wb3J0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaW1wb3J0cy5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBpbXBvcnRTcGVjID0gU3RyaW5nVXRpbHMuc3RyaXAoaW1wb3J0cy5uZXh0KCkudG9TdHJpbmcoKSk7Ci0JCQlpZiAoaW1wb3J0U3BlYy5lcXVhbHModHlwZSkgfHwgaXNXaWxkY2FyZE1hdGNoKGltcG9ydFNwZWMsIHR5cGUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhcHBseShJRG9jdW1lbnQgZG9jdW1lbnQsIGNoYXIgdHJpZ2dlciwgaW50IG9mZnNldCkgewotCQkvLyBJZiB3ZSBoYXZlIGEgcGFyc2VkIElTdHJ1Y3R1cmVkRG9jdW1lbnQsIGluc2VydCB0aGUgc2hvcnQgbmFtZSBpbnN0ZWFkIG9mIHRoZQotCQkvLyBmdWxseSBxdWFsaWZpZWQgbmFtZSBhbmQgYSBpbXBvcnQgcGFnZSBkaXJlY3RpdmUgaWYKLQkJLy8gbmVlZGVkLiAgRG8gdGhlIGltcG9ydCBmaXJzdCBzbyB0aGUgY3Vyc29yIGdvZXMgdG8gdGhlIHJpZ2h0IGxvY2F0aW9uCi0JCS8vIGFuZCB3ZSBkb24ndCBzdXJwcmlzZSB0aGUgdXNlci4KLQotCQlib29sZWFuIGFkZFNob3J0Rm9ybSA9IGZhbHNlOyAvL2RvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCAmJiBmQ29udGFpbmVyTmFtZSAhPSBudWxsICYmIGZDb250YWluZXJOYW1lLmxlbmd0aCgpID4gMDsKLQkJaWYgKGFkZFNob3J0Rm9ybSkgewotCQkJc2V0UmVwbGFjZW1lbnRTdHJpbmcoJyInICsgZlNob3J0TmFtZSArICciJyk7Ci0JCQlpbnQgaW1wb3J0TGVuZ3RoID0gYXBwbHlJbXBvcnQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KTsKLQkJCXNldFJlcGxhY2VtZW50T2Zmc2V0KGdldFJlcGxhY2VtZW50T2Zmc2V0KCkgKyBpbXBvcnRMZW5ndGgpOwotCQl9Ci0KLQkJc2V0Q3Vyc29yUG9zaXRpb24oZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKS5sZW5ndGgoKSk7Ci0JCXN1cGVyLmFwcGx5KGRvY3VtZW50LCB0cmlnZ2VyLCBvZmZzZXQpOwotCi0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMSNhcHBseShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLCBjaGFyLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseShJVGV4dFZpZXdlciB2aWV3ZXIsIGNoYXIgdHJpZ2dlciwgaW50IHN0YXRlTWFzaywgaW50IG9mZnNldCkgewotCQkvLyBDTVZDIDI0MzgxNQotCQkvLyAocGEpIHRoaXMgaXMgb3ZlcnJpZGRlbiB0byBnZXQgYXJvdW5kIHJlcGxhY2VtZW50IGxlbmd0aCBtb2RpZmljYXRpb24KLQkJLy8gd2hpY2ggaXMgZG9uZSBpbiB0aGUgc3VwZXIgKHNpbmNlIGVjbGlwc2UgMi4xKQotCQlhcHBseSh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSwgdHJpZ2dlciwgb2Zmc2V0KTsKLQl9Ci0KLQkvLyBjb2RlIGlzIGJvcnJvd2VkIGZyb20gSmF2YUNvbXBsZXRpb25Qcm9wb3NhbAotCXByb3RlY3RlZCBib29sZWFuIHN0YXJ0c1dpdGgoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBTdHJpbmcgd29yZCkgewotCQlpbnQgd29yZExlbmd0aCA9IHdvcmQgPT0gbnVsbCA/IDAgOiB3b3JkLmxlbmd0aCgpOwotCQlpZiAob2Zmc2V0ID4gZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSArIHdvcmRMZW5ndGgpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJdHJ5IHsKLQkJCWludCBsZW5ndGggPSBvZmZzZXQgLSBnZXRSZXBsYWNlbWVudE9mZnNldCgpOwotCQkJLy8gQ01WQyAyNDM4MTcKLQkJCS8vIHNsaWdodGx5IG1vZGlmaWVkIHRvIGJlIGEgbGl0dGxlIG1vcmUgZmxleGlibGUgZm9yIGF0dHJpYnV0ZSB2YWx1ZSBzdHJpbmcgbWF0Y2hpbmcuLgotCQkJU3RyaW5nIHN0YXJ0ID0gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXMoZG9jdW1lbnQuZ2V0KGdldFJlcGxhY2VtZW50T2Zmc2V0KCksIGxlbmd0aCkpOwotCQkJcmV0dXJuIHdvcmQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHN0YXJ0LnRvTG93ZXJDYXNlKCkpIHx8IGZRdWFsaWZpZWROYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChzdGFydC50b0xvd2VyQ2FzZSgpKTsKLQkJCS8vcmV0dXJuIHdvcmQuc3Vic3RyaW5nKDAsIGxlbmd0aCkuZXF1YWxzSWdub3JlQ2FzZShzdGFydCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCN2YWxpZGF0ZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwgaW50LCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JIC8vCSAqLwotCS8vCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JLy8JCXJldHVybiBzdXBlci52YWxpZGF0ZShkb2N1bWVudCwgb2Zmc2V0LCBldmVudCk7Ci0JLy8JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCNzZWxlY3RlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGVkKElUZXh0Vmlld2VyIHZpZXdlciwgYm9vbGVhbiBzbWFydFRvZ2dsZSkgewotCQkvLyAocGEpIHdlIGN1cnJlbnRseSBkb24ndCB1c2Ugc21hcnQgdG9nZ2xlLi4uCi0JCXN1cGVyLnNlbGVjdGVkKHZpZXdlciwgZmFsc2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVR5cGVGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0phdmFUeXBlRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWMzYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVR5cGVGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbnN0YW50czsKLQotLyoqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFUeXBlRmluZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldEJlYW5Qcm9wb3NhbHMoSVJlc291cmNlIHJlc291cmNlLCBpbnQgcmVwbGFjZW1lbnRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoKSB7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSB0eXBlUHJvcG9zYWxzID0gZ2V0VHlwZVByb3Bvc2FscyhyZXNvdXJjZSwgcmVwbGFjZW1lbnRTdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gc2VyaWFsUHJvcG9zYWxzID0gZ2V0U2VyaWFsaXplZFByb3Bvc2FscyhyZXNvdXJjZSwgcmVwbGFjZW1lbnRTdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gYmVhblByb3Bvc2FscyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3R5cGVQcm9wb3NhbHMubGVuZ3RoICsgc2VyaWFsUHJvcG9zYWxzLmxlbmd0aF07Ci0KLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBzZXJpYWxQcm9wb3NhbHMubGVuZ3RoOyBpKyspIHsKLQkJCWJlYW5Qcm9wb3NhbHNbaV0gPSBzZXJpYWxQcm9wb3NhbHNbaV07Ci0JCX0KLQkJZm9yIChpID0gc2VyaWFsUHJvcG9zYWxzLmxlbmd0aDsgaSA8IHNlcmlhbFByb3Bvc2Fscy5sZW5ndGggKyB0eXBlUHJvcG9zYWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQliZWFuUHJvcG9zYWxzW2ldID0gdHlwZVByb3Bvc2Fsc1tpIC0gc2VyaWFsUHJvcG9zYWxzLmxlbmd0aF07Ci0JCX0KLQkJcmV0dXJuIGJlYW5Qcm9wb3NhbHM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRNZW1iZXJzKElDb250YWluZXIgY29udGFpbmVyLCBMaXN0IG1lbWJlcnNMaXN0KSB7Ci0JCXRyeSB7Ci0JCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gY29udGFpbmVyLm1lbWJlcnModHJ1ZSk7Ci0JCQlpZiAobWVtYmVycyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChtZW1iZXJzW2ldLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCQkJCW1lbWJlcnNMaXN0LmFkZChtZW1iZXJzW2ldKTsKLQkJCQkJZWxzZSBpZiAobWVtYmVyc1tpXS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikKLQkJCQkJCWdldE1lbWJlcnMoKElDb250YWluZXIpIG1lbWJlcnNbaV0sIG1lbWJlcnNMaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFNlcmlhbGl6ZWRQcm9wb3NhbHMoSVJlc291cmNlIHJlc291cmNlLCBpbnQgcmVwbGFjZW1lbnRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoKSB7Ci0JCUxpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRNZW1iZXJzKHJlc291cmNlLmdldFByb2plY3QoKSwgcmVzb3VyY2VzKTsKLQkJSVJlc291cmNlIG1lbWJlclJlc291cmNlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCW1lbWJlclJlc291cmNlID0gKElSZXNvdXJjZSkgcmVzb3VyY2VzLmdldChpKTsKLQkJCWlmIChtZW1iZXJSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgbWVtYmVyUmVzb3VyY2UuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuc2VyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBwYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZShtZW1iZXJSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgcmVzb3VyY2UuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCQluYW1lcy5hZGQobmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiXCIiICsgcGF0aCArICJcIiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQlyZXBsYWNlbWVudFN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgcGF0aC5sZW5ndGgoKSArIDIsIG51bGwsIHBhdGgsIG51bGwsIG51bGwsIElSZWxldmFuY2VDb25zdGFudHMuUl9OT05FKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBuYW1lcy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW25hbWVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIHJlcGxhY2VtZW50U3RhcnQKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRMZW5ndGgKLQkgKiBAcGFyYW0gc2VhcmNoRm9yIElKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEUsIElKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBmaW5kUHJvcG9zYWxzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHJlcGxhY2VtZW50U3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCwgaW50IHNlYXJjaEZvciwgYm9vbGVhbiBpZ25vcmVBYnN0cmFjdENsYXNzZXMpIHsKLQotCQlKYXZhVHlwZU5hbWVSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IEphdmFUeXBlTmFtZVJlcXVlc3RvcigpOwotCQlyZXF1ZXN0b3Iuc2V0SlNQT2Zmc2V0KHJlcGxhY2VtZW50U3RhcnQpOwotCQlyZXF1ZXN0b3Iuc2V0UmVwbGFjZW1lbnRMZW5ndGgocmVwbGFjZW1lbnRMZW5ndGgpOwotCQlyZXF1ZXN0b3Iuc2V0SWdub3JlQWJzdHJhY3RDbGFzc2VzKGlnbm9yZUFic3RyYWN0Q2xhc3Nlcyk7Ci0KLQkJdHJ5IHsKLQkJCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtde2dldEphdmFQcm9qZWN0KHJlc291cmNlKX07Ci0JCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShlbGVtZW50cyk7Ci0JCQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoQWxsVHlwZU5hbWVzKG51bGwsIG51bGwsIFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENIIHwgU2VhcmNoUGF0dGVybi5SX1BSRUZJWF9NQVRDSCwgc2VhcmNoRm9yLCBzY29wZSwgcmVxdWVzdG9yLCBJSmF2YVNlYXJjaENvbnN0YW50cy5XQUlUX1VOVElMX1JFQURZX1RPX1NFQVJDSCwgbnVsbCk7Ci0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4YykgeyAKLQkJCS8vIEphdmFNb2RlbAotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGMpOwotCQl9Ci0JCXJldHVybiByZXF1ZXN0b3IuZ2V0UHJvcG9zYWxzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0VHlwZVByb3Bvc2FscyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCByZXBsYWNlbWVudFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgpIHsKLQkJcmV0dXJuIGZpbmRQcm9wb3NhbHMocmVzb3VyY2UsIHJlcGxhY2VtZW50U3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoLCBJSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldENsYXNzUHJvcG9zYWxzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHJlcGxhY2VtZW50U3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCkgewotCQlyZXR1cm4gZmluZFByb3Bvc2FscyhyZXNvdXJjZSwgcmVwbGFjZW1lbnRTdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgsIElKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTLCB0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCUlQcm9qZWN0IHByb2ogPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qKTsKLQkJcmV0dXJuIGphdmFQcm9qZWN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0phdmFUeXBlTmFtZVJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVR5cGVOYW1lUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYTJkZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVR5cGVOYW1lUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guVHlwZU5hbWVSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5Db21wbGV0aW9uUHJvcG9zYWxMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb25zdGFudHM7Ci0KLS8qKgotICogVXNlIHcvIEpEVCBzZWFyY2ggZW5naW5lIHRvIGZpbmQgYWxsIHR5cGUgbmFtZXMuCi0gKiBDcmVhdGVzIHByb3Bvc2FscyBmcm9tIG1hdGNoZXMgcmVwb3J0ZWQuCi0gKgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVHlwZU5hbWVSZXF1ZXN0b3IgZXh0ZW5kcyBUeXBlTmFtZVJlcXVlc3RvciB7Ci0JCi0JcHJpdmF0ZSBpbnQgZkpTUE9mZnNldCA9IC0xOwotCXByaXZhdGUgaW50IGZSZXBsYWNlbWVudExlbmd0aCA9IC0xOwotCXByaXZhdGUgTGlzdCBmUHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgYm9vbGVhbiBmSWdub3JlQWJzdHJhY3RDbGFzc2VzID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBDb21wbGV0aW9uUHJvcG9zYWxMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbExhYmVsUHJvdmlkZXIoKTsKLQkKLQlwdWJsaWMgdm9pZCBhY2NlcHRUeXBlKGludCBtb2RpZmllcnMsIGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsIFN0cmluZyBwYXRoKSB7Ci0KLSAgICAgICAgaW50IG9mZnNldCA9IGdldEpTUE9mZnNldCgpOwotICAgICAgICBpbnQgbGVuZ3RoID0gZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKTsKLQkJCi0JCS8vIHNvbWVob3cgb2Zmc2V0IG9yIGxlbmd0aCB3YXMgc2V0IGluY29ycmVjdGx5Ci0JCWlmKG9mZnNldCA9PSAtMSB8fCBsZW5ndGggPT0gLTEpCi0JCQlyZXR1cm47Ci0JCS8vIGlnbm9yZSBhYnN0cmFjdCBjbGFzc2VzPwotCQlpZihpZ25vcmVBYnN0cmFjdENsYXNzZXMoKSAmJiBGbGFncy5pc0Fic3RyYWN0KG1vZGlmaWVycykpCi0JCQlyZXR1cm47Ci0JCQotCQlJbWFnZSBpbWFnZSA9IGNhbGN1bGF0ZUltYWdlKG1vZGlmaWVycyk7Ci0JCQotICAgICAgICBTdHJpbmcgY29udGFpbmVyTmFtZVN0cmluZyA9IG5ldyBTdHJpbmcocGFja2FnZU5hbWUpOwotICAgICAgICBTdHJpbmcgdHlwZU5hbWVTdHJpbmcgPSBTdHJpbmcudmFsdWVPZihzaW1wbGVUeXBlTmFtZSk7Ci0JCQkKLSAgICAgICAgLy8gY29udGFpbmVybmFtZSBjYW4gYmUgbnVsbAotICAgICAgICBTdHJpbmcgZnVsbE5hbWUgPSBjb25jYXRlbmF0ZU5hbWUoY29udGFpbmVyTmFtZVN0cmluZywgdHlwZU5hbWVTdHJpbmcpOwotCi0gICAgICAgIFN0cmluZyBzaW1wbGVOYW1lID0gU2lnbmF0dXJlLmdldFNpbXBsZU5hbWUoZnVsbE5hbWUpOwotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihzaW1wbGVOYW1lKTsKLSAgICAgICAgU3RyaW5nIHR5cGVRdWFsaWZpZXIgPSBTaWduYXR1cmUuZ2V0UXVhbGlmaWVyKGZ1bGxOYW1lKTsKLSAgICAgICAgaWYgKHR5cGVRdWFsaWZpZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCIgLSAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgYnVmLmFwcGVuZCh0eXBlUXVhbGlmaWVyKTsKLSAgICAgICAgfQotCQkKLSAgICAgICAgSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwoZnVsbE5hbWUsIG9mZnNldCwgbGVuZ3RoLCBmdWxsTmFtZSwgaW1hZ2UsIHR5cGVOYW1lU3RyaW5nLCB0eXBlUXVhbGlmaWVyLCBJUmVsZXZhbmNlQ29uc3RhbnRzLlJfTk9ORSwgdHJ1ZSk7Ci0gICAgICAgIHByb3Bvc2FsLnNldFRyaWdnZXJDaGFyYWN0ZXJzKEpTUFByb3Bvc2FsQ29sbGVjdG9yLmdldFR5cGVUcmlnZ2VycygpKTsKLQkJZlByb3Bvc2Fscy5hZGQocHJvcG9zYWwpOwotCX0KLQotCi0JcHJpdmF0ZSBJbWFnZSBjYWxjdWxhdGVJbWFnZShpbnQgbW9kaWZpZXJzKSB7Ci0JCUNvbXBsZXRpb25Qcm9wb3NhbCBwID0gQ29tcGxldGlvblByb3Bvc2FsLmNyZWF0ZShDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYsIGdldEpTUE9mZnNldCgpKTsKLQkJcC5zZXRGbGFncyhtb2RpZmllcnMpOwotCQkKLQkJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyMjA2Ci0JCWNoYXJbXSBzaWcgPSBuZXcgY2hhcltde1NpZ25hdHVyZS5DX1VOUkVTT0xWRUR9OwotCQlwLnNldFNpZ25hdHVyZShzaWcpOwotCQkKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBmTGFiZWxQcm92aWRlci5jcmVhdGVJbWFnZURlc2NyaXB0b3IocCk7Ci0JCUltYWdlIGltYWdlID0gSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShkZXNjcmlwdG9yKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBDb25jYXRlbmF0ZXMgdHdvIG5hbWVzLiBVc2VzIGEgZG90IGZvciBzZXBhcmF0aW9uLiBCb3RoIHN0cmluZ3MgY2FuIGJlCi0gICAgICogZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjb25jYXRlbmF0ZU5hbWUoU3RyaW5nIG5hbWUxLCBTdHJpbmcgbmFtZTIpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaWYgKG5hbWUxICE9IG51bGwgJiYgbmFtZTEubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKG5hbWUxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZTIgIT0gbnVsbCAmJiBuYW1lMi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGlmIChidWYubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnLicpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmLmFwcGVuZChuYW1lMik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQkKLQlpbnQgZ2V0SlNQT2Zmc2V0KCkgewotCQlyZXR1cm4gZkpTUE9mZnNldDsKLQl9Ci0KLQl2b2lkIHNldEpTUE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCWZKU1BPZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JaW50IGdldFJlcGxhY2VtZW50TGVuZ3RoKCkgewotCQlyZXR1cm4gZlJlcGxhY2VtZW50TGVuZ3RoOwotCX0KLQotCXZvaWQgc2V0UmVwbGFjZW1lbnRMZW5ndGgoaW50IHJlcGxhY2VtZW50TGVuZ3RoKSB7Ci0JCWZSZXBsYWNlbWVudExlbmd0aCA9IHJlcGxhY2VtZW50TGVuZ3RoOwotCX0KLQl2b2lkIHNldElnbm9yZUFic3RyYWN0Q2xhc3Nlcyhib29sZWFuIGlnbm9yZSkgewotCQlmSWdub3JlQWJzdHJhY3RDbGFzc2VzID0gaWdub3JlOwotCX0KLQlib29sZWFuIGlnbm9yZUFic3RyYWN0Q2xhc3NlcygpIHsKLQkJcmV0dXJuIGZJZ25vcmVBYnN0cmFjdENsYXNzZXM7Ci0JfQotCQotCUphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0UHJvcG9zYWxzKCkgewotCQlyZXR1cm4gKEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsW10pZlByb3Bvc2Fscy50b0FycmF5KG5ldyBKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbFtmUHJvcG9zYWxzLnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0xpYnJhcnlUYWdzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0xpYnJhcnlUYWdzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJjZDI5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9MaWJyYXJ5VGFnc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkpTUENNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UTERDTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkRlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDIwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTFByb3BlcnR5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkhUTUxUYWdzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNRG9jVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNTm9kZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0WE1MTW9kZWxRdWVyeUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxSZWxldmFuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuQ01JbWFnZVV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIDxwPkNvbXB1dGVzIHRhZ3MgcHJvdmlkZWQgYnkgdGFnIGxpYnJhcmllcyBjb21wbGV0aW9uIHByb3Bvc2Fscy48L3A+Ci0gKiAKLSAqIDxwPkV4dGVuZHMgdGhlIHtAbGluayBIVE1MVGFnc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyfSB0byBiZW5lZml0IGZyb20KLSAqIGl0cyB3b3JrIGZvciBkZXRlcm1pbmluZyB0aGUgY29ycmVjdCB7QGxpbmsgWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yfSB0byB1c2U8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VGFnc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIGV4dGVuZHMKLQlIVE1MVGFnc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIHsKLQkKLQlwcml2YXRlIGludCBmRGVwdGhDb3VudDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5IVE1MVGFnc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5IVE1MVGFnc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI3ZhbGlkTW9kZWxRdWVyeU5vZGUob3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRNb2RlbFF1ZXJ5Tm9kZShDTU5vZGUgbm9kZSkgewotCQlib29sZWFuIGlzVmFsaWQgPSBmYWxzZTsKLQkJCi0JCS8vdW53cmFwCi0JCWlmKG5vZGUgaW5zdGFuY2VvZiBDTU5vZGVXcmFwcGVyKSB7Ci0JCQlub2RlID0gKChDTU5vZGVXcmFwcGVyKW5vZGUpLmdldE9yaWdpbk5vZGUoKTsKLQkJfQotCQkKLQkJLy9kZXRlcm1pbmUgaWYgaXMgdmFsaWQKLQkJaWYobm9kZSBpbnN0YW5jZW9mIEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uKSB7Ci0JCQlIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBwcm9wRGVjID0gKEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uKW5vZGU7Ci0JCQlpc1ZhbGlkID0gcHJvcERlYy5pc0pTUCgpOwotCQl9IGVsc2UgaWYobm9kZS5zdXBwb3J0cyhUTERFbGVtZW50RGVjbGFyYXRpb24uSVNfTElCUkFSWV9UQUcpKXsKLQkJCUJvb2xlYW4gaXNMaWJyYXJ5VGFnID0gKEJvb2xlYW4pbm9kZS5nZXRQcm9wZXJ0eShUTERFbGVtZW50RGVjbGFyYXRpb24uSVNfTElCUkFSWV9UQUcpOwotCQkJaXNWYWxpZCA9IGlzTGlicmFyeVRhZyAhPSBudWxsICYmIGlzTGlicmFyeVRhZy5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGlzVmFsaWQ7Ci0JfQotCQotCS8qKgotCSAqIDxwPkpTUCBoYXMgbm9uZS4gIFRoaXMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIHRvIGFkZCBpbiBkb2N0eXBlIHByb3Bvc2FscyB3aGljaAotCSAqIHNob3VsZCByZWFsbHkgYmUgY29udHJpYnV0ZWQgYnkgdGhlIEhUTUwgdGFnIGNvbXB1dGVyPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5IVE1MVGFnc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2FkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3RhcnREb2N1bWVudFByb3Bvc2FscygKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkvL2pzcCBoYXMgbm9uZQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSFRNTFRhZ3NDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoCi0JCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJLy9qc3AgaGFzIG5vbmUKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RYTUxNb2RlbFF1ZXJ5Q29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjYWRkVGFnQ2xvc2VQcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnQ2xvc2VQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIENvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJLy9kbyBub3RoaW5nLCBodG1sIGNvbXB1dGVyIHdpbGwgdGFrZSBjYXJlIG9mIGFkZGluZyB0aGUgPiBhbmQgLz4gc3VnZ2VzdGlvbnMKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuRGVmYXVsdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2FkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKAotCQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0KLQkJaWYoIXRoaXMuaXNYSFRNTCkgewotCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCQotCQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCQlDTURvY3VtZW50IGRvYyA9IG1xLmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KG5vZGUpOwotCQkJCS8vIHRoaXMgc2hvdWxkbid0IGhhdmUgdG8gaGF2ZSB0aGUgcHJlZml4IGNvZGVkIGluCi0JCQkJaWYgKGRvYyBpbnN0YW5jZW9mIEpTUENNRG9jdW1lbnQgfHwgZG9jIGluc3RhbmNlb2YgQ01Ob2RlV3JhcHBlciB8fAotCQkJCQkJbm9kZS5nZXROb2RlTmFtZSgpLnN0YXJ0c1dpdGgoImpzcDoiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCi0JCQkvLyBGaW5kIHRoZSBhdHRyaWJ1dGUgbmFtZSBmb3Igd2hpY2ggdGhpcyBwb3NpdGlvbiBzaG91bGQgaGF2ZSBhIHZhbHVlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9wZW4gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3Qgb3BlblJlZ2lvbnMgPSBvcGVuLmdldFJlZ2lvbnMoKTsKLQkJCWludCBpID0gb3BlblJlZ2lvbnMuaW5kZXhPZihjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSk7Ci0JCQlpZiAoaSA8IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gbnVsbDsKLQkJCXdoaWxlIChpID49IDApIHsKLQkJCQluYW1lUmVnaW9uID0gb3BlblJlZ2lvbnMuZ2V0KGktLSk7Ci0JCQkJaWYgKG5hbWVSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIG9uIGFuIGVtcHR5IHZhbHVlLCBhZGQgYWxsIHRoZSBKU1AgYW5kIHRhZ2xpYiB0YWdzCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9Ci0JCQkJQWJzdHJhY3RYTUxNb2RlbFF1ZXJ5Q29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24obm9kZSk7Ci0JCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsICYmIGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG9wZW4uZ2V0VGV4dChuYW1lUmVnaW9uKTsKLQkJCQlpZiAoYXR0cmlidXRlTmFtZSAhPSBudWxsKSB7Ci0JCQkJCU5vZGUgcGFyZW50ID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UGFyZW50KCk7Ci0JCQkJCQotCQkJCQkvL2lnbm9yZSBzdGFydCBxdW90ZSBpbiBtYXRjaCBzdHJpbmcKLQkJCQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS50cmltKCk7Ci0JCQkJCWlmKG1hdGNoU3RyaW5nLnN0YXJ0c1dpdGgoIiciKSB8fCBtYXRjaFN0cmluZy5zdGFydHNXaXRoKCJcIiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJbWF0Y2hTdHJpbmcgPSBtYXRjaFN0cmluZy5zdWJzdHJpbmcoMSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vZ2V0IGFsbCB0aGUgcHJvcG9zYWxzCi0JCQkJCUxpc3QgYWRkaXRpb25hbEVsZW1lbnRzID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudCgKLQkJCQkJCQkoRWxlbWVudCkgbm9kZSwgZWxlbWVudERlY2wsIE1vZGVsUXVlcnkuSU5DTFVERV9BTEwpOwotCQkJCQlJdGVyYXRvciBub2RlSXRlcmF0b3IgPSBhZGRpdGlvbmFsRWxlbWVudHMuaXRlcmF0b3IoKTsKLQkJCQkJCi0JCQkJCS8vY2hlY2sgZWFjaCBzdWdnZXN0aW9uCi0JCQkJCXdoaWxlIChub2RlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlDTU5vZGUgYWRkaXRpb25hbEVsZW1lbnREZWNsID0gKENNTm9kZSkgbm9kZUl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmIChhZGRpdGlvbmFsRWxlbWVudERlY2wgIT0gbnVsbCAmJiBhZGRpdGlvbmFsRWxlbWVudERlY2wgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbiAmJgotCQkJCQkJCQl2YWxpZE1vZGVsUXVlcnlOb2RlKGFkZGl0aW9uYWxFbGVtZW50RGVjbCkpIHsKLQkJCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgYWRkaXRpb25hbEVsZW1lbnREZWNsOwotCQkJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04OTgxMQotCQkJCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCQlnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2VuZXJhdGVUYWcocGFyZW50LCBlZCwgc2IpOwotCQotCQkJCQkJCVN0cmluZyBwcm9wb3NlZFRleHQgPSBzYi50b1N0cmluZygpOwotCQotCQkJCQkJCS8vZmlsdGVyIG91dCBhbnkgcHJvcG9zYWxzIHRoYXQgZG9udCBtYXRjaCBtYXRjaFN0cmluZwotCQkJCQkJCWlmIChiZWdpbnNXaXRoKHByb3Bvc2VkVGV4dCwgbWF0Y2hTdHJpbmcpKSB7Ci0JCQkJCQkJCS8vd3JhcCB3aXRoICcgYmVjYXVzZSBKU1AgYXR0cmlidXRlcyBhcmUgd2FycGVkIHdpdGggIgotCQkJCQkJCQlwcm9wb3NlZFRleHQgPSAiJyIgKyBwcm9wb3NlZFRleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCi0JCQkJCQkJCS8vaWYgaXRzIGEgY29udGFpbmVyIGl0cyBwb3NzaWJsZSB0aGUgY2xvc2luZyBxdW90ZSBpcyBhbHJlYWR5IHRoZXJlCi0JCQkJCQkJCS8vZG9uJ3Qgd2FudCB0byByaXNrIGluamVjdGluZyBhbiBleHRyYQotCQkJCQkJCQlpZighKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpKSB7Ci0JCQkJCQkJCQlwcm9wb3NlZFRleHQgKz0gIiciOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCS8vZ2V0IHRoZSBpbWFnZQotCQkJCQkJCQlJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGVsZW1lbnREZWNsKTsKLQkJCQkJCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJCQkJCWltYWdlID0gdGhpcy5nZXRHZW5lcmljVGFnSW1hZ2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQkJLy9jcmVhdGUgdGhlIHByb3Bvc2FsCi0JCQkJCQkJCWludCBjdXJzb3JBZGp1c3RtZW50ID0gZ2V0Q3Vyc29yUG9zaXRpb25Gb3JQcm9wb3NlZFRleHQocHJvcG9zZWRUZXh0KTsKLQkJCQkJCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IEFic3RyYWN0WE1MTW9kZWxRdWVyeUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmdldEFkZGl0aW9uYWxJbmZvKAotCQkJCQkJCQkJCUFic3RyYWN0WE1MTW9kZWxRdWVyeUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudCksIGVsZW1lbnREZWNsKTsKLQkJCQkJCQkJU3RyaW5nIHRhZ25hbWUgPSBnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGVkKTsKLQkJCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQkJCQkJCQlwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLAotCQkJCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIGN1cnNvckFkanVzdG1lbnQsIGltYWdlLCB0YWduYW1lLCBudWxsLCBwcm9wb3NlZEluZm8sCi0JCQkJCQkJCQkJWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNzZXRFcnJvck1lc3NhZ2UoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQlpZiAoZkRlcHRoQ291bnQgPT0gMCkgewotCQkJc3VwZXIuc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RYTUxNb2RlbFF1ZXJ5Q29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjZ2V0R2VuZXJpY1RhZ0ltYWdlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0R2VuZXJpY1RhZ0ltYWdlKCkgewotCQlyZXR1cm4gSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfSlNQKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RYTUxNb2RlbFF1ZXJ5Q29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjZ2V0RGVlbXBoYXNpemVkVGFnSW1hZ2UoKQotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXREZWVtcGhhc2l6ZWRUYWdJbWFnZSgpIHsKLQkJcmV0dXJuIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0pTUCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0WE1MTW9kZWxRdWVyeUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2dldEVtcGhhc2l6ZWRUYWdJbWFnZSgpCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldEVtcGhhc2l6ZWRUYWdJbWFnZSgpIHsKLQkJcmV0dXJuIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0pTUCk7Ci0JfQotCQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUJFTE9XIEhFUkUgU0hPVUxEIEJFIFJFTU9WRUQgT05DRSBCVUcgMjExOTYxIElTIEZJWEVEIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCS8qKgotCSAqIDxwPjxiPk5PVEU6IDwvYj5UaGlzIHNob3VsZCBiZSByZW1vdmVkIGFzIHNvb24gYXMgQnVnIDMxMTk2MSBpcyBmaXhlZDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdFhNTE1vZGVsUXVlcnlDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoCi0JCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGNoaWxkUG9zaXRpb24sCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCQotCQkvL2dldCB0aGUgZGVmYXVsdCBwcm9wb3NhbHMKLQkJc3VwZXIuYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjaGlsZFBvc2l0aW9uLCBjb250ZXh0KTsKLQkJCi0JCS8qKgotCQkgKiBUT0RPOiBSRU1PVkUgVEhJUyBIQUNLIC0gQnVnIDMxMTk2MQotCQkgKi8KLQkJaWYoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UGFyZW50KCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCXRoaXMuZm9yY2libHlBZGRUYWdMaWJBbmRKU1BQcm9wc29hbHMoKERvY3VtZW50KWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFBhcmVudCgpLAotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCwgY2hpbGRQb3NpdGlvbik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+PGI+Tk9URTogPC9iPlRoaXMgc2hvdWxkIGJlIHJlbW92ZWQgYXMgc29vbiBhcyBCdWcgMzExOTYxIGlzIGZpeGVkPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0WE1MTW9kZWxRdWVyeUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2FkZFRhZ05hbWVQcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdOYW1lUHJvcG9zYWxzKAotCQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBjaGlsZFBvc2l0aW9uLAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkKLQkJLy9nZXQgdGhlIGRlZmF1bHQgcHJvcG9zYWxzCi0JCXN1cGVyLmFkZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNoaWxkUG9zaXRpb24sIGNvbnRleHQpOwotCQkKLQkJLyoqCi0JCSAqIFRPRE86IFJFTU9WRSBUSElTIEhBQ0sgLSBCdWcgMzExOTYxCi0JCSAqLwotCQlpZihjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRQYXJlbnQoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJdGhpcy5mb3JjaWJseUFkZFRhZ0xpYkFuZEpTUFByb3Bzb2FscygoRG9jdW1lbnQpY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UGFyZW50KCksCi0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjaGlsZFBvc2l0aW9uKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD48Yj5OT1RFOiA8L2I+VGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBhcyBzb29uIGFzIEJ1ZyAzMTE5NjEgaXMgZml4ZWQ8L3A+Ci0JICogPHA+VGhpcyBpcyBiYWQgYmVjYXVzZSBpdCBkb2VzIG5vdCB1c2UgdGhlIE1vZGVsUXVlcnkgZnJhbWV3b3JrPC9wPgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjaGlsZFBvc2l0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZvcmNpYmx5QWRkVGFnTGliQW5kSlNQUHJvcHNvYWxzKERvY3VtZW50IGRvY3VtZW50LCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGNoaWxkUG9zaXRpb24pIHsKLQkJaWYgKCFpc1hNTEZvcm1hdChkb2N1bWVudCkpIHsKLQkJCUxpc3QgYWRkaXRpb25hbEVsZW1lbnRzID0gZm9yY2libHlHZXRUYWdMaWJBbmRKU1BFbGVtZW50cyhuZXcgQXJyYXlMaXN0KCksIGRvY3VtZW50LCBjaGlsZFBvc2l0aW9uKTsKLQkJCQotCQkJLy9jb252ZXJ0IENNRWxlbWVudERlY2xhcnRpb25zIHRvIHByb3Bvc2FscwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRpdGlvbmFsRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgYWRkaXRpb25hbEVsZW1lbnRzLmdldChpKTsKLQkJCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJCQlJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGVkKTsKLQkJCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJCWltYWdlID0gdGhpcy5nZXRHZW5lcmljVGFnSW1hZ2UoKTsKLQkJCQkJfQotCQkJCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWRUZXh0KGRvY3VtZW50LCBlZCk7Ci0JCQkJCVN0cmluZyB0YWduYW1lID0gZ2V0UmVxdWlyZWROYW1lKGRvY3VtZW50LCBlZCk7Ci0JCQkJCS8vIGFjY291bnQgZm9yIHRoZSAmbHQ7IGFuZCAmZ3Q7Ci0JCQkJCWludCBtYXJrdXBBZGp1c3RtZW50ID0gZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldE1pbmltYWxTdGFydFRhZ0xlbmd0aChkb2N1bWVudCwgZWQpOwotCQkJCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8obnVsbCwgZWQpOwotCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKAotCQkJCQkJCXByb3Bvc2VkVGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksCi0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgbWFya3VwQWRqdXN0bWVudCwgaW1hZ2UsCi0JCQkJCQkJdGFnbmFtZSwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9UQUdfSU5TRVJUSU9OKTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD48Yj5OT1RFOiA8L2I+VGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBhcyBzb29uIGFzIEJ1ZyAzMTE5NjEgaXMgZml4ZWQ8L3A+Ci0JICogPHA+VGhpcyBpcyBiYWQgYmVjYXVzZSBpdCBkb2VzIG5vdCB1c2UgdGhlIE1vZGVsUXVlcnkgZnJhbWV3b3JrLCBpdAotCSAqIGFjY2VzcyB0aGUgVExEQ01Eb2N1bWVudE1hbmFnZXIgZGlyZWN0bHk8L3A+Ci0JICogPHA+VGhpcyBpcyBlc3NlbnRpYWxseSBhIGNvbWJpbmF0aW9uIG9mIHRoZSB7QGxpbmsgVGFnbGliTW9kZWxRdWVyeUV4dGVuc2lvbn0gYW5kCi0JICogdGhlIHtAbGluayBKU1BNb2RlbFF1ZXJ5RXh0ZW5zaW9ufSBidXQgaXQgbWVhbnMgYW55IG90aGVyIGV4dGVuc2lvbnMgZ2V0IGxlZnQKLQkgKiBvdXQgd2hlbiBjcmVhdGluZyBjb250ZW50IGFzc2lzdCBzdWdnZXN0aW9uIGF0IHRoZSBkb2N1bWVudCByb290IGxldmVsPC9wPgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50RGVjbHMKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBjaGlsZEluZGV4Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBmb3JjaWJseUdldFRhZ0xpYkFuZEpTUEVsZW1lbnRzKExpc3QgZWxlbWVudERlY2xzLCBOb2RlIG5vZGUsIGludCBjaGlsZEluZGV4KSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCS8qCi0JCQkgKiBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW50ZW5kZWQgaW5zZXJ0aW9uIGFzIGl0IHdpbGwgZ2l2ZSB1cwotCQkJICogdGhlIGNvcnJlY3Qgb2Zmc2V0IGZvciBjaGVja2luZyBwb3NpdGlvbiBkZXBlbmRlbnQgQ01Eb2N1bWVudHMKLQkJCSAqLwotCQkJaW50IHRleHRJbnNlcnRpb25PZmZzZXQgPSAwOwotCQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCWlmIChjaGlsZHJlbi5nZXRMZW5ndGgoKSA+PSBjaGlsZEluZGV4ICYmIGNoaWxkSW5kZXggPj0gMCkgewotCQkJCU5vZGUgbm9kZUFscmVhZHlBdEluZGV4ID0gY2hpbGRyZW4uaXRlbShjaGlsZEluZGV4KTsKLQkJCQlpZiAobm9kZUFscmVhZHlBdEluZGV4IGluc3RhbmNlb2YgSURPTU5vZGUpCi0JCQkJCXRleHRJbnNlcnRpb25PZmZzZXQgPSAoKElET01Ob2RlKSBub2RlQWxyZWFkeUF0SW5kZXgpLmdldEVuZE9mZnNldCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGV4dEluc2VydGlvbk9mZnNldCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQl9Ci0JCQlUTERDTURvY3VtZW50TWFuYWdlciBtZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKCgoSURPTU5vZGUpIG5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCWlmIChtZ3IgIT0gbnVsbCkgewotCQkJCUxpc3QgbW9yZUNNRG9jdW1lbnRzID0gbWdyLmdldENNRG9jdW1lbnRUcmFja2Vycyh0ZXh0SW5zZXJ0aW9uT2Zmc2V0KTsKLQkJCQlpZiAobW9yZUNNRG9jdW1lbnRzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb3JlQ01Eb2N1bWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCUNNRG9jdW1lbnQgZG9jID0gKENNRG9jdW1lbnQpIG1vcmVDTURvY3VtZW50cy5nZXQoaSk7Ci0JCQkJCQlDTU5hbWVkTm9kZU1hcCBlbGVtZW50cyA9IGRvYy5nZXRFbGVtZW50cygpOwotCQkJCQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGVsZW1lbnRzLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRzLml0ZW0oaik7Ci0JCQkJCQkJCWVsZW1lbnREZWNscy5hZGQoZWQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gZ2V0IHBvc2l0aW9uIGRlcGVuZGVudCBDTURvY3VtZW50cyBhbmQgaW5zZXJ0IHRoZWlyIHRhZ3MgYXMKLQkJCS8vIHByb3Bvc2FscwotCi0JCQlNb2RlbFF1ZXJ5QWRhcHRlciBtcUFkYXB0ZXIgPSBudWxsOwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQkJbXFBZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSAoKElET01Ob2RlKSBub2RlKS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJCWVsc2UKLQkJCQltcUFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpICgoSURPTU5vZGUpIG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQotCQkJaWYgKG1xQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJQ01Eb2N1bWVudCBkb2MgPSBtcUFkYXB0ZXIuZ2V0TW9kZWxRdWVyeSgpLmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KG5vZGUpOwotCQkJCWlmIChkb2MgIT0gbnVsbCkgewotCQkJCQlDTURvY3VtZW50IGpjbWRvYyA9IGdldERlZmF1bHRKU1BDTURvY3VtZW50KChJRE9NTm9kZSkgbm9kZSk7Ci0JCQkJCUNNTmFtZWROb2RlTWFwIGpzcGVsZW1lbnRzID0gamNtZG9jLmdldEVsZW1lbnRzKCk7Ci0KLQkJCQkJLyoKLQkJCQkJICogRm9yIGEgYnVpbHQtaW4gSlNQIGFjdGlvbiB0aGUgY29udGVudCBtb2RlbCBpcyBwcm9wZXJseQotCQkJCQkgKiBzZXQgdXAsIHNvIGRvbid0IGp1c3QgYmxpbmRseSBhZGQgdGhlIHJlc3QtLXVubGVzcyB0aGlzCi0JCQkJCSAqIHdpbGwgYmUgYSBkaXJlY3QgY2hpbGQgb2YgdGhlIGRvY3VtZW50Ci0JCQkJCSAqLwotCQkJCQlpZiAoanNwZWxlbWVudHMgIT0gbnVsbCAmJiAoIShkb2MgaW5zdGFuY2VvZiBKU1BDTURvY3VtZW50KSB8fCBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgewotCQkJCQkJTGlzdCByZWplY3RFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCQkJLy8gZGV0ZXJtaW5lIGlmIHRoZSBkb2N1bWVudCBpcyBpbiBYTUwgZm9ybQotCQkJCQkJRG9jdW1lbnQgZG9tRG9jID0gbnVsbDsKLQkJCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotCQkJCQkJCWRvbURvYyA9IChEb2N1bWVudCkgbm9kZTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlkb21Eb2MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQotCQkJCQkJLy8gU2hvdyBYTUwgdGFnIGZvcm1zIG9mIEpTUCBtYXJrZXJzIGlmIGpzcDpyb290IGlzCi0JCQkJCQkvLyB0aGUgZG9jdW1lbnQgZWxlbWVudCBPUiBpdCdzIEhUTUwgYnV0Ci0JCQkJCQkvLyBpc24ndCByZWFsbHkgaW4gdGhlIHRleHQuCi0JCQkJCQkvLyBJZiB0aGUgZG9jdW1lbnQgaXNuJ3Qgc3RyaWN0bHkgWE1MLCBwdWxsIG91dCB0aGUKLQkJCQkJCS8vIFhNTCB0YWcgZm9ybXMgaXQgaXMgeG1sIGZvcm1hdAotCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVExFVCk7Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRVhQUkVTU0lPTik7Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVDTEFSQVRJT04pOwotCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFKTsKLQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfUEFHRSk7Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVCk7Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQik7Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBRyk7Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX0FUVFJJQlVURSk7Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1ZBUklBQkxFKTsKLQkJCQkJCWlmIChpc1hNTEZvcm1hdChkb21Eb2MpKSB7Ci0JCQkJCQkJLy8ganNwIGFjdGlvbnMKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRkFMTEJBQ0spOwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOKTsKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuR0VUUFJPUEVSVFkpOwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5TRVRQUk9QRVJUWSk7Ci0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOQ0xVREUpOwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JXQVJEKTsKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUExVR0lOKTsKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRkFMTEJBQ0spOwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTSk7Ci0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNUyk7Ci0JCQkJCQl9Ci0KLQotCQkJCQkJLy8gZG9uJ3Qgc2hvdyBqc3A6cm9vdCBpZiBhIGRvY3VtZW50IGVsZW1lbnQgYWxyZWFkeQotCQkJCQkJLy8gZXhpc3RzCi0JCQkJCQlFbGVtZW50IGRvY0VsZW1lbnQgPSBkb21Eb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQkJCQlpZiAoZG9jRWxlbWVudCAhPSBudWxsICYmICgoZG9jRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFscygianNwOnJvb3QiKSkgfHwgKCgoKElET01Ob2RlKSBkb2NFbGVtZW50KS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwgfHwgKChJRE9NTm9kZSkgZG9jRWxlbWVudCkuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkpKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ST09UKTsKLQotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBqc3BlbGVtZW50cy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGpzcGVsZW1lbnRzLml0ZW0oaik7Ci0JCQkJCQkJaWYgKHJlamVjdEVsZW1lbnRzLmNvbnRhaW5zKGVkLmdldE5vZGVOYW1lKCkpKQotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQllbGVtZW50RGVjbHMuYWRkKGVkKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIE5vIGNtIGRvY3VtZW50IChzdWNoIGFzIGZvciB0aGUgRG9jdW1lbnQgKGEgbm9uLUVsZW1lbnQpIG5vZGUgaXRzZWxmKQotCQkJCWVsc2UgewotCQkJCQlDTU5hbWVkTm9kZU1hcCBqc3BFbGVtZW50cyA9IGdldERlZmF1bHRKU1BDTURvY3VtZW50KChJRE9NTm9kZSkgbm9kZSkuZ2V0RWxlbWVudHMoKTsKLQkJCQkJaW50IGxlbmd0aCA9IGpzcEVsZW1lbnRzLmdldExlbmd0aCgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCQllbGVtZW50RGVjbHMuYWRkKGpzcEVsZW1lbnRzLml0ZW0oaSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50RGVjbHM7Ci0JfQotCQotCS8qKgotCSAqIDxwPjxiPk5PVEU6IDwvYj5UaGlzIHNob3VsZCBiZSByZW1vdmVkIGFzIHNvb24gYXMgQnVnIDMxMTk2MSBpcyBmaXhlZDwvcD4KLQkgKiAKLQkgKiBGb3IgSlNQIGZpbGVzIGFuZCBzZWdtZW50cywgdGhpcyBpcyBqdXN0IHRoZSBKU1AgZG9jdW1lbnQsIGJ1dCB3aGVuCi0JICogZWRpdGluZyB0YWcgZmlsZXMgYW5kIHRoZWlyIGZyYWdtZW50cywgaXQgc2hvdWxkIGJlIHRoZSB0YWcgZG9jdW1lbnQuCi0JICogCi0JICogSXQgbWF5IGFsc28gdmFyeSBiYXNlZCBvbiB0aGUgbW9kZWwgYmVpbmcgZWRpdGVkIGluIHRoZSBmdXR1cmUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBub24tZW1iZWRkZWQgQ01Eb2N1bWVudCBmb3IgdGhlIGRvY3VtZW50IGJlaW5nCi0JICogICAgICAgICBlZGl0ZWQuCi0JICovCi0JcHJpdmF0ZSBDTURvY3VtZW50IGdldERlZmF1bHRKU1BDTURvY3VtZW50KElET01Ob2RlIG5vZGUpIHsKLQkJLy8gaGFuZGxlIHRhZyBmaWxlcyBoZXJlCi0JCVN0cmluZyBjb250ZW50VHlwZSA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLQkJaWYgKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BUQUcuZXF1YWxzKGNvbnRlbnRUeXBlKSkKLQkJCXJldHVybiBKU1BDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5UQUcyMF9ET0NfVFlQRSk7Ci0KLQkJQ01Eb2N1bWVudCBqY21kb2MgPSBudWxsOwotCQlTdHJpbmcgbW9kZWxQYXRoID0gbm9kZS5nZXRNb2RlbCgpLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAobW9kZWxQYXRoICE9IG51bGwgJiYgIUlNb2RlbE1hbmFnZXIuVU5NQU5BR0VEX01PREVMLmVxdWFscyhtb2RlbFBhdGgpKSB7Ci0JCQlmbG9hdCB2ZXJzaW9uID0gRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0SlNQVmVyc2lvbihuZXcgUGF0aChtb2RlbFBhdGgpKTsKLQkJCWpjbWRvYyA9IEpTUENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQodmVyc2lvbik7Ci0JCX0KLQkJaWYgKGpjbWRvYyA9PSBudWxsKSB7Ci0JCQlqY21kb2MgPSBKU1BDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KCk7Ci0JCX0KLQotCQlyZXR1cm4gamNtZG9jOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxGb3JtYXQoRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudCBkb2NFbGVtZW50ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQlyZXR1cm4gZG9jRWxlbWVudCAhPSBudWxsICYmICgoZG9jRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFscygianNwOnJvb3QiKSkgfHwKLQkJCQkoKCgoSURPTU5vZGUpIGRvY0VsZW1lbnQpLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCAmJgotCQkJCQkJKChJRE9NTm9kZSkgZG9jRWxlbWVudCkuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkpKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3JGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTNjOGUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotCi0vKioKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySlNQIGV4dGVuZHMgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTCB7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGZKU1BDb250ZXh0cyA9IG51bGw7Ci0KLQlwdWJsaWMgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySlNQKCkgewotCQlzdXBlcigpOwotCQlpbml0SlNQQ29udGV4dHMoKTsKLQl9Ci0KLQkvKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTCNpbml0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpIHsKLQkJc3VwZXIuaW5pdFBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCk7Ci0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGpzcENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBuZXcgSlNQQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCi0JCS8vIEpTUAotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OLCBqc3BDb250ZW50QXNzaXN0UHJvY2Vzc29yKTsKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxULCBqc3BDb250ZW50QXNzaXN0UHJvY2Vzc29yKTsKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQsIGpzcENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUhUTUxQYXJ0aXRpb25zLkhUTUxfQ09NTUVOVCwganNwQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVCwganNwQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFLCBqc3BDb250ZW50QXNzaXN0UHJvY2Vzc29yKTsKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0RFTElNSVRFUiwganNwQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBULCBqc3BDb250ZW50QXNzaXN0UHJvY2Vzc29yKTsKLQotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBqc3BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvciA9IG5ldyBKU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSwganNwSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdE5hbWVUb1Byb2Nlc3Nvck1hcCgpIHsKLQkJc3VwZXIuaW5pdE5hbWVUb1Byb2Nlc3Nvck1hcCgpOwotCQlKU1BQcm9wZXJ0eUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IganNwUHJvcGVydHlDQVAgPSBuZXcgSlNQUHJvcGVydHlDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCWFkZE5hbWVQcm9jZXNzb3IoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VUUFJPUEVSVFksIGpzcFByb3BlcnR5Q0FQKTsKLQkJYWRkTmFtZVByb2Nlc3NvcihKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5HRVRQUk9QRVJUWSwganNwUHJvcGVydHlDQVApOwotCQlhZGROYW1lUHJvY2Vzc29yKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4sIG5ldyBKU1BVc2VCZWFuQ29udGVudEFzc2lzdFByb2Nlc3NvcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdEpTUENvbnRleHRzKCkgewotCQlmSlNQQ29udGV4dHMgPSBuZXcgU3RyaW5nW117RE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4sIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4sIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTn07Ci0JfQotCi0JLyoqCi0JICogUXVpY2sgY2hlY2sgdG8gc2VlIGlmIGNvbnRleHQgKFN0cmluZykgc2hvdWxkIG1hcCB0bwotCSAqIEpTUENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiBAcmV0dXJuIGlmIGl0J3MgYSBKU1AgUmVnaW9uIChmb3Igd2hpY2ggd2UgbmVlZCBKU1AgQ29udGVudCBhc3Npc3QpCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSlNQUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJU3RyaW5nIGNvbnRleHQgPSBzZFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkpTUENvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29udGV4dCA9PSBmSlNQQ29udGV4dHNbaV0pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBndWVzc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IHN1cGVyLmd1ZXNzQ29udGVudEFzc2lzdFByb2Nlc3Nvcih2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQkJaWYgKHAgPT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgdmlld2VyLmdldERvY3VtZW50KCkpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50T2Zmc2V0KTsKLQkJCWlmIChpc0pTUFJlZ2lvbihzZFJlZ2lvbikpCi0JCQkJcCA9IGdldFBhcnRpdGlvblByb2Nlc3NvcihJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBKTsKLQkJfQotCQlyZXR1cm4gcDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9SZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUwNmU2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9SZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkRvY3VtZW50VGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVWYXJpYWJsZTsKLQotLyoqCi0gKiBKdXN0IGxpa2UgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQgZXhjZXB0IGlmIGFuIGluc2VydCBvZmZzZXQgaXMgcGFzc2VkIGluLAotICogZHVyaW5nIGV2YWx1YXRpb24sIHRoZSAicHJlZml4IiBiZWZvcmUgdGhlIHRlbXBsYXRlIHdpbGwgYmUgY2hlY2tlZCB0byBzZWUKLSAqIGlmIGl0IG1hdGNoZXMgdGhlIHRlbXBsYXRlIG5hbWUuIElmIHNvLCBvdmVyd3JpdGUgdGhlIHRlbXBsYXRlIG5hbWUuCi0gKiBPdGhlcndpc2UsIGp1c3QgaW5zZXJ0IHRoZSB0ZW1wbGF0ZSBhdCB0aGUgaW5zZXJ0IG9mZnNldCBsb2NhdGlvbiAoYnkgbm90Ci0gKiBvdmVyd3JpdGluZyB0aGUgcHJlZml4IHRleHQpCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dCBleHRlbmRzIERvY3VtZW50VGVtcGxhdGVDb250ZXh0IHsKLQlwcml2YXRlIGludCBmSW5zZXJ0T2Zmc2V0ID0gLTE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZG9jdW1lbnQgdGVtcGxhdGUgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdHlwZQotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRoaXMgY29udGV4dCBhcHBsaWVzIHRvCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICovCi0JcHVibGljIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0KFRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSwgSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXModHlwZSwgZG9jdW1lbnQsIG5ldyBQb3NpdGlvbihvZmZzZXQsIGxlbmd0aCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb2N1bWVudCB0ZW1wbGF0ZSBjb250ZXh0LiBUaGUgc3VwcGxpZWQgPGNvZGU+UG9zaXRpb248L2NvZGU+Ci0JICogd2lsbCBiZSBxdWVyaWVkIHRvIGNvbXB1dGUgdGhlIDxjb2RlPmdldFN0YXJ0PC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5nZXRFbmQ8L2NvZGU+IG1ldGhvZHMsIHdoaWNoIHdpbGwgdGhlcmVmb3JlIGFuc3dlciB1cGRhdGVkCi0JICogcG9zaXRpb24gZGF0YSBpZiBpdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0eXBlCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdGhpcyBjb250ZXh0IGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBkZXNjcmliaW5nIHRoZSBhcmVhIG9mIHRoZSBkb2N1bWVudCB3aGljaCBmb3JtcwotCSAqICAgICAgICAgICAgdGhlIHRlbXBsYXRlIGNvbnRleHQKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0KFRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSwgSURvY3VtZW50IGRvY3VtZW50LCBQb3NpdGlvbiBwb3NpdGlvbikgewotCQlzdXBlcih0eXBlLCBkb2N1bWVudCwgcG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb2N1bWVudCB0ZW1wbGF0ZSBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0eXBlCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdGhpcyBjb250ZXh0IGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKiBAcGFyYW0gaW5zZXJ0T2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkb2N1bWVudCByZWdpb24gd2hlcmUgaW5zZXJ0IHdhcwotCSAqICAgICAgICAgICAgb3JpZ2luYWxseSByZXF1ZXN0ZWQKLQkgKi8KLQlwdWJsaWMgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlLCBJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBpbnNlcnRPZmZzZXQpIHsKLQkJdGhpcyh0eXBlLCBkb2N1bWVudCwgbmV3IFBvc2l0aW9uKG9mZnNldCwgbGVuZ3RoKSk7Ci0JCWZJbnNlcnRPZmZzZXQgPSBpbnNlcnRPZmZzZXQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dCNldmFsdWF0ZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZSkKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGVCdWZmZXIgZXZhbHVhdGUoVGVtcGxhdGUgdGVtcGxhdGUpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgVGVtcGxhdGVFeGNlcHRpb24gewotCQlUZW1wbGF0ZUJ1ZmZlciBidWZmZXIgPSBzdXBlci5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJaWYgKGZJbnNlcnRPZmZzZXQgPiAtMSAmJiBmSW5zZXJ0T2Zmc2V0ID4gZ2V0U3RhcnQoKSkgewotCQkJCVN0cmluZyBwcmVmaXggPSBnZXREb2N1bWVudCgpLmdldChnZXRTdGFydCgpLCBmSW5zZXJ0T2Zmc2V0IC0gZ2V0U3RhcnQoKSk7Ci0JCQkJaWYgKCF0ZW1wbGF0ZS5nZXROYW1lKCkuc3RhcnRzV2l0aChwcmVmaXgpKSB7Ci0JCQkJCS8vIGdlbmVyYXRlIGEgbmV3IGJ1ZmZlciB0aGF0IGFjdHVhbGx5IGNvbnRhaW5zIHRoZQotCQkJCQkvLyB0ZXh0IHRoYXQgd2FzIGdvaW5nIHRvIGJlIG92ZXJ3cml0dGVuCi0JCQkJCWludCBwcmVmaXhTaXplID0gcHJlZml4Lmxlbmd0aCgpOwotCQkJCQlUZW1wbGF0ZVZhcmlhYmxlW10gbmV3VGVtcGxhdGVWYXIgPSBidWZmZXIuZ2V0VmFyaWFibGVzKCk7Ci0JCQkJCWZvciAoaW50IGkgPTA7IGkgPCBuZXdUZW1wbGF0ZVZhci5sZW5ndGg7IGkrKyApewotCQkJCQkJaW50W10gb2Zmc2V0cyA9IG5ld1RlbXBsYXRlVmFyW2ldLmdldE9mZnNldHMoKTsKLQkJCQkJCWZvciAoaW50IGo9MDsgajxvZmZzZXRzLmxlbmd0aCA7aisrKXsKLQkJCQkJCQlvZmZzZXRzW2pdICs9IHByZWZpeFNpemU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnVmZmVyID0gbmV3IFRlbXBsYXRlQnVmZmVyKHByZWZpeCArIGJ1ZmZlci5nZXRTdHJpbmcoKSwgbmV3VGVtcGxhdGVWYXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWUwNzk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkpTUEZDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotCi0vKioKLSAqIEpTUCBGcmFnbWVudCBQcm9wZXJ0eSBQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX05PTkUgPSBKU1BVSU1lc3NhZ2VzLkpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMDsKLQotCS8vIFRPRE86IEZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIHRoZXNlIHN0cmluZ3MvdmFyaWFibGVzCi0JcHJpdmF0ZSBTdHJpbmdbXSBmTGFuZ3VhZ2VzID0ge1NFTEVDVF9OT05FLCAiamF2YSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXNjcmlwdCJ9OyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmdbXSBmQ29udGVudFR5cGVzID0ge1NFTEVDVF9OT05FLCAiYXBwbGljYXRpb24veGh0bWwreG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJhcHBsaWNhdGlvbi94bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJInRleHQvaHRtbCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkidGV4dC94bWwiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJ0ZXh0L2NzcyJ9OyAvLyROT04tTkxTLTEkCi0KLQotCXByaXZhdGUgQ29tYm8gZkxhbmd1YWdlQ29tYm87Ci0JcHJpdmF0ZSBDb21ibyBmQ29udGVudFR5cGVDb21ibzsKLQotCXB1YmxpYyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCQlzZXREZXNjcmlwdGlvbihKU1BVSU1lc3NhZ2VzLkpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwcm9wZXJ0eVBhZ2UgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCAyKTsKLQotCQkvLyBmcmFnbWVudCBsYW5ndWFnZSBjb250cm9sCi0JCVRleHQgbGFuZ3VhZ2VMYWJlbCA9IG5ldyBUZXh0KHByb3BlcnR5UGFnZSwgU1dULlJFQURfT05MWSk7Ci0JCWxhbmd1YWdlTGFiZWwuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLkpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMik7Ci0JCWZMYW5ndWFnZUNvbWJvID0gbmV3IENvbWJvKHByb3BlcnR5UGFnZSwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZkxhbmd1YWdlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZkxhbmd1YWdlQ29tYm8uc2V0SXRlbXMoZkxhbmd1YWdlcyk7Ci0KLQkJLy8gZnJhZ21lbnQgY29udGVudCB0eXBlIGNvbnRyb2wKLQkJVGV4dCBjb250ZW50VHlwZUxhYmVsID0gbmV3IFRleHQocHJvcGVydHlQYWdlLCBTV1QuUkVBRF9PTkxZKTsKLQkJY29udGVudFR5cGVMYWJlbC5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8zKTsKLQkJZkNvbnRlbnRUeXBlQ29tYm8gPSBuZXcgQ29tYm8ocHJvcGVydHlQYWdlLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlmQ29udGVudFR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmQ29udGVudFR5cGVDb21iby5zZXRJdGVtcyhmQ29udGVudFR5cGVzKTsKLQotCQlpbml0aWFsaXplVmFsdWVzKCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcm9wZXJ0eVBhZ2UsIElIZWxwQ29udGV4dElkcy5KU1BfRlJBR01FTlRfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gcHJvcGVydHlQYWdlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVzb3VyY2UgdGhpcyBwcm9wZXJ0aWVzIHBhZ2UgaXMgZm9yCi0JICogCi0JICogQHJldHVybiBJUmVzb3VyY2UgZm9yIHRoaXMgcHJvcGVydGllcyBwYWdlIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgIElSZXNvdXJjZQotCSAqLwotCXByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlJQWRhcHRhYmxlIGFkYXB0YWJsZSA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSBhZGFwdGFibGU7Ci0JCX0gZWxzZSBpZiAoYWRhcHRhYmxlICE9IG51bGwpIHsKLQkJCU9iamVjdCBvID0gYWRhcHRhYmxlLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKW87Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlTdHJpbmcgbGFuZ3VhZ2UgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUExBTkdVQUdFLCBnZXRSZXNvdXJjZSgpLCBmYWxzZSk7Ci0JCWlmIChsYW5ndWFnZSA9PSBudWxsIHx8IGxhbmd1YWdlLmxlbmd0aCgpID09IDApIHsKLQkJCS8vIGlmIG51bGwsIHVzZSBub25lCi0JCQlsYW5ndWFnZSA9IFNFTEVDVF9OT05FOwotCQl9Ci0JCS8qCi0JCSAqIElmIGl0ZW0gaXMgYWxyZWFkeSBwYXJ0IG9mIGNvbWJvLCBzZWxlY3QgaXQuIE90aGVyd2lzZSwgYWRkIHRvIHRoZQotCQkgKiBjb21ib2JveC4KLQkJICovCi0JCWludCBpbmRleCA9IGZMYW5ndWFnZUNvbWJvLmluZGV4T2YobGFuZ3VhZ2UpOwotCQlpZiAoaW5kZXggPiAtMSkKLQkJCWZMYW5ndWFnZUNvbWJvLnNlbGVjdChpbmRleCk7Ci0JCWVsc2UKLQkJCWZMYW5ndWFnZUNvbWJvLnNldFRleHQobGFuZ3VhZ2UpOwotCi0JCVN0cmluZyBjb250ZW50VHlwZSA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQQ09OVEVOVFRZUEUsIGdldFJlc291cmNlKCksIGZhbHNlKTsKLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwgfHwgY29udGVudFR5cGUubGVuZ3RoKCkgPT0gMCkgewotCQkJLy8gaWYgbnVsbCwgdXNlIG5vbmUKLQkJCWNvbnRlbnRUeXBlID0gU0VMRUNUX05PTkU7Ci0JCX0KLQkJLyoKLQkJICogSWYgaXRlbSBpcyBhbHJlYWR5IHBhcnQgb2YgY29tYm8sIHNlbGVjdCBpdC4gT3RoZXJ3aXNlLCBhZGQgdG8gdGhlCi0JCSAqIGNvbWJvYm94LgotCQkgKi8KLQkJaW5kZXggPSBmQ29udGVudFR5cGVDb21iby5pbmRleE9mKGNvbnRlbnRUeXBlKTsKLQkJaWYgKGluZGV4ID4gLTEpCi0JCQlmQ29udGVudFR5cGVDb21iby5zZWxlY3QoaW5kZXgpOwotCQllbHNlCi0JCQlmQ29udGVudFR5cGVDb21iby5zZXRUZXh0KGNvbnRlbnRUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWludCBpbmRleCA9IGZMYW5ndWFnZUNvbWJvLmluZGV4T2YoU0VMRUNUX05PTkUpOwotCQlpZiAoaW5kZXggPiAtMSkKLQkJCWZMYW5ndWFnZUNvbWJvLnNlbGVjdChpbmRleCk7Ci0KLQkJaW5kZXggPSBmQ29udGVudFR5cGVDb21iby5pbmRleE9mKFNFTEVDVF9OT05FKTsKLQkJaWYgKGluZGV4ID4gLTEpCi0JCQlmQ29udGVudFR5cGVDb21iby5zZWxlY3QoaW5kZXgpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJdHJ5IHsKLQkJCS8vIHNhdmUgdGhlIGZyYWdtZW50IGxhbmd1YWdlCi0JCQlTdHJpbmcgbGFuZ3VhZ2UgPSBmTGFuZ3VhZ2VDb21iby5nZXRUZXh0KCk7Ci0JCQlpZiAobGFuZ3VhZ2UgPT0gbnVsbCB8fCBsYW5ndWFnZS5sZW5ndGgoKSA9PSAwIHx8IGxhbmd1YWdlLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUX05PTkUpKSB7Ci0JCQkJLy8gaWYgbm9uZSwgdXNlIG51bGwKLQkJCQlsYW5ndWFnZSA9IG51bGw7Ci0JCQl9Ci0JCQlKU1BGQ29udGVudFByb3BlcnRpZXMuc2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUExBTkdVQUdFLCBnZXRSZXNvdXJjZSgpLCBsYW5ndWFnZSk7Ci0KLQkJCS8vIHNhdmUgZnJhZ21lbnQgY29udGVudCB0eXBlCi0JCQlTdHJpbmcgY29udGVudFR5cGUgPSBmQ29udGVudFR5cGVDb21iby5nZXRUZXh0KCk7Ci0JCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCB8fCBjb250ZW50VHlwZS5sZW5ndGgoKSA9PSAwIHx8IGNvbnRlbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUX05PTkUpKSB7Ci0JCQkJLy8gaWYgbm9uZSwgdXNlIG51bGwKLQkJCQljb250ZW50VHlwZSA9IG51bGw7Ci0JCQl9Ci0JCQlKU1BGQ29udGVudFByb3BlcnRpZXMuc2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUENPTlRFTlRUWVBFLCBnZXRSZXNvdXJjZSgpLCBjb250ZW50VHlwZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gbWF5YmUgaW4gZnV0dXJlLCBsZXQgdXNlciBrbm93IHRoZXJlIHdhcyBhIHByb2JsZW0gc2F2aW5nIGZpbGUKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5wZXJmb3JtT2soKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Qcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTk3NmI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Qcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIHsKLQlwdWJsaWMgUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UoKSB7Ci0JCXNldERlc2NyaXB0aW9uKEpTUFVJTWVzc2FnZXMuUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1RhZ0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1RhZ0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjM3YmEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9UYWdDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkNvbWJvRmllbGRFZGl0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5UYWdNb2RlbFF1ZXJ5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJvcGVydHlQYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuU2NvcGVkUHJlZmVyZW5jZVN0b3JlOw0KLQ0KLXB1YmxpYyBjbGFzcyBUYWdDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJvcGVydHlQYWdlIHsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gZkRpc3BsYXlUeXBlcyA9IHsiSFRNTCIsICJYTUwifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gZlZhbHVlcyA9IHsidGV4dC9odG1sIiwgInRleHQveG1sIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCXByaXZhdGUgQ29tYm9GaWVsZEVkaXRvciBmQ29tYm9GaWVsZEVkaXRvcjsNCi0NCi0JcHVibGljIFRhZ0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSgpIHsNCi0JCXN1cGVyKCk7DQotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOw0KLQkJc2V0RGVzY3JpcHRpb24oSlNQVUlNZXNzYWdlcy5UYWdQcm9wZXJ0eVBhZ2VfZGVzYyk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7DQotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkpOw0KLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7DQotDQotCQlPYmplY3QgYWRhcHRlciA9IGdldEVsZW1lbnQoKS5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsNCi0JCWlmIChhZGFwdGVyID09IG51bGwpIHsNCi0JCQlhZGFwdGVyID0gZ2V0RWxlbWVudCgpLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsNCi0JCX0NCi0JCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlciBpbnN0YW5jZW9mIElSZXNvdXJjZSkgew0KLQkJCVN0cmluZyBwcmVmZXJlbmNlS2V5ID0gVGFnTW9kZWxRdWVyeS5jcmVhdGVQcmVmZXJlbmNlS2V5KCgoSVJlc291cmNlKSBhZGFwdGVyKS5nZXRGdWxsUGF0aCgpKTsNCi0JCQluZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSkucHV0KHByZWZlcmVuY2VLZXksIGZWYWx1ZXNbMF0pOw0KLQkJCVNjb3BlZFByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IG5ldyBTY29wZWRQcmVmZXJlbmNlU3RvcmUobmV3IFByb2plY3RTY29wZSgoKElSZXNvdXJjZSkgYWRhcHRlcikuZ2V0UHJvamVjdCgpKSwgSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOw0KLQ0KLQkJCVN0cmluZ1tdW10gZW50cnlOYW1lc0FuZFZhbHVlcyA9IG5ldyBTdHJpbmdbXVtde3tmRGlzcGxheVR5cGVzWzBdLCBmVmFsdWVzWzBdfSwge2ZEaXNwbGF5VHlwZXNbMV0sIGZWYWx1ZXNbMV19fTsNCi0JCQlmQ29tYm9GaWVsZEVkaXRvciA9IG5ldyBDb21ib0ZpZWxkRWRpdG9yKHByZWZlcmVuY2VLZXksIEpTUFVJTWVzc2FnZXMuSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8yLCBlbnRyeU5hbWVzQW5kVmFsdWVzLCBjb21wb3NpdGUpOw0KLQkJCWZDb21ib0ZpZWxkRWRpdG9yLmZpbGxJbnRvR3JpZChjb21wb3NpdGUsIDIpOw0KLQkJCWZDb21ib0ZpZWxkRWRpdG9yLnNldFByZWZlcmVuY2VTdG9yZShzdG9yZSk7DQotCQkJZkNvbWJvRmllbGRFZGl0b3IubG9hZCgpOw0KLQ0KLQkJCS8vIGxldCB0aGUgcGFnZSBzYXZlIGZvciB1cyBpZiBuZWVkZWQNCi0JCQlzZXRQcmVmZXJlbmNlU3RvcmUoc3RvcmUpOw0KLQkJfQ0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkNCi0JICovDQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsNCi0JCWlmIChmQ29tYm9GaWVsZEVkaXRvciAhPSBudWxsKSB7DQotCQkJZkNvbWJvRmllbGRFZGl0b3Iuc3RvcmUoKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5wZXJmb3JtT2soKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZGVyaXZlZC9TaW5nbGVDaGFyUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZGVyaXZlZC9TaW5nbGVDaGFyUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOThhMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5kZXJpdmVkOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotLyoKLSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQuamF2YWRvYy5TaW5nbGVDaGFyUmVhZGVyLgotICogTW9kaWZpY2F0aW9uIHdhcyBtYWRlIHRvIGZpeCBzdGF0ZW1lbnQgdW5uZWNlc3NhcmlseSBuZXN0ZWQgd2l0aGluIGVsc2UKLSAqIGNsYXVzZSB3YXJuaW5nIGluIHJlYWQoLi4pLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2luZ2xlQ2hhclJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkKGNoYXJbXSxpbnQsaW50KQotCSAqLwotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNidWZbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGVuZCA9IG9mZiArIGxlbjsKLQkJZm9yIChpbnQgaSA9IG9mZjsgaSA8IGVuZDsgaSsrKSB7Ci0JCQlpbnQgY2ggPSByZWFkKCk7Ci0JCQlpZiAoY2ggPT0gLTEpIHsKLQkJCQlpZiAoaSA9PSBvZmYpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlyZXR1cm4gaSAtIG9mZjsKLQkJCX0KLQkJCWNidWZbaV0gPSAoY2hhcikgY2g7Ci0JCX0KLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkeSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb250ZW50IGFzIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgY2g7Ci0JCXdoaWxlICgoY2ggPSByZWFkKCkpICE9IC0xKSB7Ci0JCQlidWYuYXBwZW5kKChjaGFyKSBjaCk7Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvQWN0aW9uQ29udHJpYnV0b3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvQWN0aW9uQ29udHJpYnV0b3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5NzE1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuUmVmYWN0b3JBY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLklBY3Rpb25Db25zdGFudHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5JQWN0aW9uRGVmaW5pdGlvbklkc0pTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWkuQWN0aW9uQ29udHJpYnV0b3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5TdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLQotLyoqCi0gKiBBY3Rpb25Db250cmlidXRvckpTUAotICogCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgdXNlZCBpbnNpZGUgbXVsdGkgcGFnZSBlZGl0b3IncwotICogQWN0aW9uQmFyQ29udHJpYnV0b3IsIHNpbmNlIGNhc2NhZGVkIGluaXQoKSBjYWxsIGZyb20gdGhlCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciB3aWxsIGNhdXNlcyBleGNlcHRpb24gYW5kIGl0IGxlYWRzIHRvIGxvc2Ugd2hvbGUKLSAqIHRvb2xiYXJzLgotICogCi0gKiBJbnN0ZWFkLCB1c2UgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yIGZvciBzb3VyY2UgcGFnZSBjb250cmlidXRvciBvZgotICogbXVsdGkgcGFnZSBlZGl0b3IuCi0gKiAKLSAqIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIHN0aWxsIHZhbGlkIGZvciBzaW5nbGUgcGFnZSBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Db250cmlidXRvckpTUCBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9ySFRNTCB7Ci0KLQlwcml2YXRlIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiByZW5hbWVFbGVtZW50QWN0aW9uID0gbnVsbDsKLQlwcml2YXRlIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBtb3ZlRWxlbWVudEFjdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJTWVudU1hbmFnZXIgcmVmYWN0b3JNZW51ID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVESVRPUl9JRFMgPSB7Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2Uuc291cmNlIiwgIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwdWJsaWMgQWN0aW9uQ29udHJpYnV0b3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gSlNQVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24gPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKGJ1bmRsZSwgSUFjdGlvbkNvbnN0YW50c0pTUC5BQ1RJT05fTkFNRV9SRU5BTUVfRUxFTUVOVCArIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVOREVSU0NPUkUpOwotCQl0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElBY3Rpb25EZWZpbml0aW9uSWRzSlNQLlJFTkFNRV9FTEVNRU5UKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24sIElIZWxwQ29udGV4dElkcy5KU1BfUkVGQUNUT1JSRU5BTUVfSEVMUElEKTsKLQotCQl0aGlzLm1vdmVFbGVtZW50QWN0aW9uID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihidW5kbGUsIElBY3Rpb25Db25zdGFudHNKU1AuQUNUSU9OX05BTUVfTU9WRV9FTEVNRU5UICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ERVJTQ09SRSk7Ci0JCXRoaXMubW92ZUVsZW1lbnRBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElBY3Rpb25EZWZpbml0aW9uSWRzSlNQLk1PVkVfRUxFTUVOVCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5tb3ZlRWxlbWVudEFjdGlvbiwgSUhlbHBDb250ZXh0SWRzLkpTUF9SRUZBQ1RPUk1PVkVfSEVMUElEKTsKLQotCQkvLyB0aGUgcmVmYWN0b3IgbWVudSwgYWRkIHRoZSBtZW51IGl0c2VsZiB0byBhZGQgYWxsIHJlZmFjdG9yIGFjdGlvbnMKLQkJdGhpcy5yZWZhY3Rvck1lbnUgPSBuZXcgTWVudU1hbmFnZXIoSlNQVUlNZXNzYWdlcy5BY3Rpb25Db250cmlidXRvckpTUF8wLCBSZWZhY3RvckFjdGlvbkdyb3VwLk1FTlVfSUQpOyAvLyROT04tTkxTLTEkCi0JCXJlZmFjdG9yTWVudS5hZGQodGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uKTsKLQkJcmVmYWN0b3JNZW51LmFkZCh0aGlzLm1vdmVFbGVtZW50QWN0aW9uKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRFeHRlbnNpb25JRHMoKSB7Ci0JCXJldHVybiBFRElUT1JfSURTOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLmFkZFRvTWVudShtZW51KTsKLQotCQltZW51Lmluc2VydEFmdGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElULCB0aGlzLnJlZmFjdG9yTWVudSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0KLQkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCXRoaXMucmVuYW1lRWxlbWVudEFjdGlvbi5zZXRBY3Rpb24oZ2V0QWN0aW9uKGdldFRleHRFZGl0b3IoZ2V0QWN0aXZlRWRpdG9yUGFydCgpKSwgSUFjdGlvbkNvbnN0YW50c0pTUC5BQ1RJT05fTkFNRV9SRU5BTUVfRUxFTUVOVCkpOwotCQl0aGlzLm1vdmVFbGVtZW50QWN0aW9uLnNldEFjdGlvbihnZXRBY3Rpb24oZ2V0VGV4dEVkaXRvcihnZXRBY3RpdmVFZGl0b3JQYXJ0KCkpLCBJQWN0aW9uQ29uc3RhbnRzSlNQLkFDVElPTl9OQU1FX01PVkVfRUxFTUVOVCkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQotCQlzdXBlci5zZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKGVuYWJsZWQpOwotCQl0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJdGhpcy5tb3ZlRWxlbWVudEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDE5MzYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotCi0vKioKLSAqIEhlbHAgY29udGV4dCBpZHMgZm9yIHRoZSBKU1AgU291cmNlIEVkaXRvci4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQotICogaW1wbGVtZW50ZWQuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSGVscENvbnRleHRJZHMgewotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gSlNQVUlQbHVnaW4uSUQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gLy8gZmlndXJlZCBvdXQgb24gdGhlIGZseQotCS8vIC8vIEpTUCBTb3VyY2UgcGFnZSBlZGl0b3IKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfU09VUkNFVklFV19IRUxQSUQgPQotCS8vIENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1AgKyJfc291cmNlX0hlbHBJZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEpTUCBGaWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUFJFRldFQlhfRklMRVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDUwIjsgLy8kTk9OLU5MUy0xJAotCS8vIEpTUCBTdHlsZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwNTEiOyAvLyROT04tTkxTLTEkCi0JLy8gSlNQIFRlbXBsYXRlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUFJFRldFQlhfVEVNUExBVEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDA1MiI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gSlNQIEZyYWdtZW50IFByb3BlcnR5IFBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRlJBR01FTlRfSEVMUElEID0gUFJFRklYICsgImpzcGYxMDAwIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gSlNQIFNvdXJjZSBFZGl0b3IgQ29udGV4dCBNZW51Ci0JLy8gUmVmYWN0b3IgUmVuYW1lCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1JFRkFDVE9SUkVOQU1FX0hFTFBJRCA9IFBSRUZJWCArICJqc3ByMDAxMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFJlZmFjdG9yIE1vdmUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUkVGQUNUT1JNT1ZFX0hFTFBJRCA9IFBSRUZJWCArICJqc3ByMDAyMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEpTUCBOZXcgRmlsZSBXaXphcmQgLSBUZW1wbGF0ZSBQYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX05FV1dJWkFSRF9URU1QTEFURV9IRUxQSUQgPSBQUkVGSVggKyAianNwdzAwMTAiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0pTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0pTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0Y2E5ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9KU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIGltYWdlcyBwcm92aWRlZCBieSB0aGlzIHBsdWctaW4uCi0gKiAKLSAqIE5PVEU6IEZvciBpbnRlcm5hbCB1c2Ugb25seS4gRm9yIGltYWdlcyB1c2VkIGV4dGVybmFsbHksIHBsZWFzZSB1c2UgdGhlCi0gKiBTaGFyZWQqKipJbWFnZUhlbHBlciBjbGFzcyBpbnN0ZWFkLgotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUExVR0lOSUQgPSBKU1BVSVBsdWdpbi5JRDsKLQlwcml2YXRlIHN0YXRpYyBKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvLwkgc2F2ZSBhIGRlc2NyaXB0b3IgZm9yIGVhY2ggaW1hZ2UKLQlwcml2YXRlIEhhc2hNYXAgZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbnVsbDsKLQotCS8qKgotCSAqIEdldHMgdGhlIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIElmIHRoZSBpbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGF0Ci0JICogdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2UgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGFuIGltYWdlCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotICAgCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSBJbWFnZSBhc3NvY2lhdGVkIHdpdGggSW1hZ2VEZXNjcmlwdG9yIGZyb20gdGhlIGltYWdlCi0gICAgICogZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgdGhlIEltYWdlIGNhbm5vdCBiZSByZXRyaWV2ZWQsIGl0IGlzIGNyZWF0ZWQKLSAgICAgKiBmcm9tIHRoZSBJbWFnZURlc2NyaXB0b3IKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvIHJldHJpZXZlCi0gICAgICogQHJldHVybiBJbWFnZSB0aGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJbWFnZURlc2NyaXB0b3Igb3IKLSAgICAgKiAgICAgICAgIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIG9uZSBjb3VsZCBub3QgYmUKLSAgICAgKiAgICAgICAgIGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpCi0gICAgICAgICAgICBkZXNjcmlwdG9yPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotICAgICAgICAgICAgCi0gICAgICAgIEltYWdlIHJlc3VsdD0gKEltYWdlKWdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KGRlc2NyaXB0b3IpOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAKLSAgICAgICAgcmVzdWx0PSBkZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgIGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkucHV0KGRlc2NyaXB0b3IsIHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZQotCSAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQsCi0JICogYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQKLQkgKiBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NhdGVkIHdpdGggcmVzb3VyY2Ugb3IKLQkgKiAgICAgICAgIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIG9uZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlPYmplY3QgbyA9IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJLy9jcmVhdGUgYSBkZXNjcmlwdG9yCi0JCQlpbWFnZURlc2NyaXB0b3IgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gKEltYWdlRGVzY3JpcHRvcikgbzsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSGFzaE1hcCAtIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgewotCQlpZiAoZkltYWdlRGVzY1JlZ2lzdHJ5ID09IG51bGwpCi0JCQlmSW1hZ2VEZXNjUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZkltYWdlRGVzY1JlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEltYWdlUmVnaXN0cnkgLSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwcml2YXRlIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGZyb20gdGhlIGdpdmVuIHJlc291cmNlIGFuZCBhZGRzIHRoZSBpbWFnZSB0byB0aGUKLQkgKiBpbWFnZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIEltYWdlCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBjcmVhdGVJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBnZXRJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCQotCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCS8vIGRvbnQgYWRkIHRoZSBtaXNzaW5nIGltYWdlIGRlc2NyaXB0b3IgaW1hZ2UgdG8gdGhlIGltYWdlIHJlZ2lzdHJ5Ci0JCQlpZiAoIWRlc2MuZXF1YWxzKEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCkpKQotCQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQocmVzb3VyY2UsIGltYWdlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZyb20gdGhlIGdpdmVuIGltYWdlRmlsZVBhdGggYW5kIGFkZHMgdGhlCi0JICogaW1hZ2UgZGVzY3JpcHRvciB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgYW4gaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBjcmVhdGVkLCB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvcgotCSAqIGlzIHJldHVybmVkIGJ1dCBub3QgYWRkZWQgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIGltYWdlRmlsZVBhdGgKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciBpbWFnZSBkZXNjcmlwdG9yIGZvciBpbWFnZUZpbGVQYXRoIG9yIGRlZmF1bHQKLQkgKiAgICAgICAgICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZUltYWdlRGVzY3JpcHRvcihTdHJpbmcgaW1hZ2VGaWxlUGF0aCkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTklELCBpbWFnZUZpbGVQYXRoKTsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQlnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLnB1dChpbWFnZUZpbGVQYXRoLCBpbWFnZURlc2NyaXB0b3IpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCi0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9KU1BFZGl0b3JQbHVnaW5JbWFnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzhmMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9KU1BFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLS8qKgotICogQnVuZGxlIG9mIG1vc3QgaW1hZ2VzIHVzZWQgYnkgdGhlIEpTUCBFZGl0b3IgcGx1Zy1pbi4KLSAqLwotcHVibGljIGNsYXNzIEpTUEVkaXRvclBsdWdpbkltYWdlcyB7IAkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NMQVNTX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2NsYXNzX29iai5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19HRU5FUklDID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfSlNQID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLWpzcC5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19URU1QTEFURSA9ICJpY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1BVQkxJQyA9ICJpY29ucy9mdWxsL29iajE2L3B1YmxpYy5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9QUk9URUNURURfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHJvdGVjdGVkX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfUFVCTElDX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2ZpZWxkX3B1YmxpY19vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0RFRkFVTFRfT0JKPSAiaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9kZWZhdWx0X29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfUFJJVkFURV9PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcml2YXRlX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DTyA9ICJpY29ucy9mdWxsL29iajE2L2RlZmF1bHRfY28uZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RFQ1RFRF9DTyA9ICJpY29ucy9mdWxsL29iajE2L3Byb3RlY3RlZF9jby5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDX0NPID0gImljb25zL2Z1bGwvb2JqMTYvcHVibGljX2NvLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklWQVRFX0NPID0gImljb25zL2Z1bGwvb2JqMTYvcHJpdmF0ZV9jby5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ORVJDTEFTU19ERUZBVUxUX09CSj0gImljb25zL2Z1bGwvb2JqMTYvaW5uZXJjbGFzc19kZWZhdWx0X29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ORVJDTEFTU19QUklWQVRFX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHJpdmF0ZV9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTkVSQ0xBU1NfUFJPVEVDVEVEX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHJvdGVjdGVkX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ORVJDTEFTU19QVUJMSUNfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvaW5uZXJjbGFzc19wdWJsaWNfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTk5FUklOVEVSRkFDRV9ERUZBVUxUX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX2RlZmF1bHRfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTk5FUklOVEVSRkFDRV9QUklWQVRFX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3ByaXZhdGVfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTk5FUklOVEVSRkFDRV9QUk9URUNURURfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfcHJvdGVjdGVkX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ORVJJTlRFUkZBQ0VfUFVCTElDX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3B1YmxpY19vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvcGFja2FnZV9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX1ZBUklBQkxFX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2xvY2FsdmFyaWFibGVfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1dJWkJBTl9ORVdKU1BGSUxFID0gImljb25zL2Z1bGwvd2l6YmFuL25ld2pzcGZpbGVfd2l6LnBuZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1dJWkJBTl9ORVdUQUdGSUxFID0gImljb25zL2Z1bGwvd2l6YmFuL25ld2pzcGZpbGVfd2l6LnBuZyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvSlNQU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9KU1BTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMjY4NDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9KU1BTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50LlBhZ2VEaXJlY3RpdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlhNTFNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEltcGxlbWVudHMgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIGV4dGVuZHMgWE1MU291cmNlRWRpdGluZ1RleHRUb29scyB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VMYW5ndWFnZShOb2RlIG5vZGUpIHsKLQkJU3RyaW5nIGxhbmd1YWdlID0gbnVsbDsKLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCWRvYyA9IChEb2N1bWVudCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCWRvYyA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQl9Ci0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJaWYgKGRvYyBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkgewotCQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIGFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpICgoSURPTURvY3VtZW50KSBkb2MpLmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJCWxhbmd1YWdlID0gYWRhcHRlci5nZXRMYW5ndWFnZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgcGFnZSBkaXJlY3RpdmVzCi0JCQkJTm9kZUxpc3QgcGFnZURpcmVjdGl2ZXMgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1BBR0UpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZURpcmVjdGl2ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlFbGVtZW50IHBhZ2VEaXJlY3RpdmUgPSAoRWxlbWVudCkgcGFnZURpcmVjdGl2ZXMuaXRlbShpKTsKLQkJCQkJLy8gbGFzdCBvbmUgdG8gZGVjbGFyZSBhIGxhbmd1YWdlIHdpbnMKLQkJCQkJaWYgKHBhZ2VEaXJlY3RpdmUuaGFzQXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9MQU5HVUFHRSkpCi0JCQkJCQlsYW5ndWFnZSA9IHBhZ2VEaXJlY3RpdmUuZ2V0QXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9MQU5HVUFHRSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGlmIG5vIGxhbmd1YWdlIHdhcyBzcGVjaWZpZWQgYW55d2hlcmUsIGFzc3VtZSBKYXZhCi0JCWlmIChsYW5ndWFnZSA9PSBudWxsKQotCQkJbGFuZ3VhZ2UgPSBKU1AxMU5hbWVzcGFjZS5BVFRSX1ZBTFVFX0pBVkE7Ci0JCXJldHVybiBsYW5ndWFnZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZm9ybWF0L0Zvcm1hdHRpbmdTdHJhdGVneUpTUEphdmEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0dGluZ1N0cmF0ZWd5SlNQSmF2YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDliOTEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0dGluZ1N0cmF0ZWd5SlNQSmF2YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Ub29sRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuQ29kZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlR5cGVkUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JRm9ybWF0dGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci0KLQotcHVibGljIGNsYXNzIEZvcm1hdHRpbmdTdHJhdGVneUpTUEphdmEgZXh0ZW5kcyBDb250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kgewotCi0JLyoqIERvY3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYnkgdGhpcyBzdHJhdGVneSAqLwotCXByaXZhdGUgZmluYWwgTGlua2VkTGlzdCBmRG9jdW1lbnRzID0gbmV3IExpbmtlZExpc3QoKTsKLQkvKiogUGFydGl0aW9ucyB0byBiZSBmb3JtYXR0ZWQgYnkgdGhpcyBzdHJhdGVneSAqLwotCXByaXZhdGUgZmluYWwgTGlua2VkTGlzdCBmUGFydGl0aW9ucyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBqYXZhIGZvcm1hdHRpbmcgc3RyYXRlZ3kuCi0JICovCi0JcHVibGljIEZvcm1hdHRpbmdTdHJhdGVneUpTUEphdmEoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdCgpIHsKLQkJc3VwZXIuZm9ybWF0KCk7Ci0KLQkJZmluYWwgSURvY3VtZW50IGRvY3VtZW50ID0gKElEb2N1bWVudCkgZkRvY3VtZW50cy5yZW1vdmVGaXJzdCgpOwotCQlmaW5hbCBUeXBlZFBvc2l0aW9uIHBhcnRpdGlvbiA9IChUeXBlZFBvc2l0aW9uKSBmUGFydGl0aW9ucy5yZW1vdmVGaXJzdCgpOwotCi0JCWlmIChkb2N1bWVudCAhPSBudWxsICYmIHBhcnRpdGlvbiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCi0JCQkJSlNQVHJhbnNsYXRpb25VdGlsIHRyYW5zbGF0aW9uVXRpbCA9IG5ldyBKU1BUcmFuc2xhdGlvblV0aWwoZG9jdW1lbnQpOwotCQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0cmFuc2xhdGlvblV0aWwuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJaWYgKGN1ICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGN1U291cmNlID0gY3UuZ2V0U291cmNlKCk7Ci0JCQkJCVRleHRFZGl0IHRleHRFZGl0ID0gZm9ybWF0U3RyaW5nKENvZGVGb3JtYXR0ZXIuS19DT01QSUxBVElPTl9VTklULCBjdVNvdXJjZSwgMCwgVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihkb2N1bWVudCksIGdldFByZWZlcmVuY2VzKCkpOwotCi0JCQkJCVRleHRFZGl0IGpzcEVkaXQgPSB0cmFuc2xhdGlvblV0aWwuZ2V0VHJhbnNsYXRpb24oKS5nZXRKc3BFZGl0KHRleHRFZGl0KTsKLQkJCQkJaWYgKGpzcEVkaXQgIT0gbnVsbCAmJiBqc3BFZGl0Lmhhc0NoaWxkcmVuKCkpCi0JCQkJCQlqc3BFZGl0LmFwcGx5KGRvY3VtZW50KTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkvLyBDYW4gb25seSBoYXBwZW4gb24gY29uY3VycmVudCBkb2N1bWVudCBtb2RpZmljYXRpb24gLSBsb2cKLQkJCQkvLyBhbmQgYmFpbCBvdXQKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kjZm9ybWF0dGVyU3RhcnRzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXR0ZXJTdGFydHMoZmluYWwgSUZvcm1hdHRpbmdDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIuZm9ybWF0dGVyU3RhcnRzKGNvbnRleHQpOwotCi0JCWZQYXJ0aXRpb25zLmFkZExhc3QoY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9QQVJUSVRJT04pKTsKLQkJZkRvY3VtZW50cy5hZGRMYXN0KGNvbnRleHQuZ2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfTUVESVVNKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXR0ZXJTdG9wcygpCi0JICovCi0JcHVibGljIHZvaWQgZm9ybWF0dGVyU3RvcHMoKSB7Ci0JCXN1cGVyLmZvcm1hdHRlclN0b3BzKCk7Ci0KLQkJZlBhcnRpdGlvbnMuY2xlYXIoKTsKLQkJZkRvY3VtZW50cy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBUZXh0RWRpdCBmb3JtYXRTdHJpbmcoaW50IGtpbmQsIFN0cmluZyBzdHJpbmcsIGludCBpbmRlbnRhdGlvbkxldmVsLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgTWFwIG9wdGlvbnMpIHsKLQkJcmV0dXJuIFRvb2xGYWN0b3J5LmNyZWF0ZUNvZGVGb3JtYXR0ZXIob3B0aW9ucykuZm9ybWF0KGtpbmQsIHN0cmluZywgMCwgc3RyaW5nLmxlbmd0aCgpLCBpbmRlbnRhdGlvbkxldmVsLCBsaW5lU2VwYXJhdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaGFuZGxlcnMvSlNQRmluZE9jY3VycmVuY2VzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2hhbmRsZXJzL0pTUEZpbmRPY2N1cnJlbmNlc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3MjY2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaGFuZGxlcnMvSlNQRmluZE9jY3VycmVuY2VzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnNlYXJjaC5IVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuaGFuZGxlcnMuRmluZE9jY3VycmVuY2VzSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIEpTUEZpbmRPY2N1cnJlbmNlc0hhbmRsZXIgZXh0ZW5kcyBGaW5kT2NjdXJyZW5jZXNIYW5kbGVyIHsKLQlwcml2YXRlIExpc3QgZlByb2Nlc3NvcnM7Ci0JCi0JcHJvdGVjdGVkIExpc3QgZ2V0UHJvY2Vzc29ycygpIHsKLQkJaWYgKGZQcm9jZXNzb3JzID09IG51bGwpIHsKLQkJCWZQcm9jZXNzb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBodG1sUHJvY2Vzc29yID0gbmV3IEhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IoKTsKLQkJCWZQcm9jZXNzb3JzLmFkZChodG1sUHJvY2Vzc29yKTsKLQkJCUpTUEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBqc3BQcm9jZXNzb3IgPSBuZXcgSlNQRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yKCk7Ci0JCQlmUHJvY2Vzc29ycy5hZGQoanNwUHJvY2Vzc29yKTsKLQkJfQotCQlyZXR1cm4gZlByb2Nlc3NvcnM7Ci0JfQotCi0JCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWZmMjQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLkVGUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciBleHRlcm5hbCBmaWxlcy4KLSAqLwotY2xhc3MgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCQotCXByaXZhdGUgSVJlZ2lvbiBmSHlwZXJsaW5rUmVnaW9uOwotCXByaXZhdGUgRmlsZSBmSHlwZXJsaW5rRmlsZTsKLQotCXB1YmxpYyBFeHRlcm5hbEZpbGVIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIEZpbGUgZmlsZSkgewotCQlmSHlwZXJsaW5rRmlsZSA9IGZpbGU7Ci0JCWZIeXBlcmxpbmtSZWdpb24gPSByZWdpb247Ci0JfQotCQotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZIeXBlcmxpbmtSZWdpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJU3RyaW5nIHBhdGggPSBmSHlwZXJsaW5rRmlsZS5nZXRQYXRoKCk7Ci0JCWlmIChwYXRoLmxlbmd0aCgpID4gNjApIHsKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygwLCAyNSkgKyAiLi4uIiArIHBhdGguc3Vic3RyaW5nKHBhdGgubGVuZ3RoKCkgLSAyNSwgcGF0aC5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIE5MUy5iaW5kKEpTUFVJTWVzc2FnZXMuT3BlbiwgcGF0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJaWYgKGZIeXBlcmxpbmtGaWxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCUlGaWxlU3RvcmUgc3RvcmUgPSBFRlMuZ2V0TG9jYWxGaWxlU3lzdGVtKCkuZ2V0U3RvcmUoZkh5cGVybGlua0ZpbGUudG9VUkkoKSk7Ci0JCQkJSURFLm9wZW5FZGl0b3JPbkZpbGVTdG9yZShwYWdlLCBzdG9yZSkgOwotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0pTUEphdmFIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNQSmF2YUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWVhZWFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNQSmF2YUh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRMYWJlbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBIeXBlcmxpbmsgZm9yIEpTUCBKYXZhIGVsZW1lbnRzCi0gKi8KLWNsYXNzIEpTUEphdmFIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQlwcml2YXRlIElKYXZhRWxlbWVudCBmRWxlbWVudDsKLQotCXB1YmxpYyBKU1BKYXZhSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCQlmUmVnaW9uID0gcmVnaW9uOwotCQlmRWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1JlZ2lvbigpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZlJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKEpTUFVJTWVzc2FnZXMuT3BlbiwgSmF2YUVsZW1lbnRMYWJlbHMuZ2V0RWxlbWVudExhYmVsKGZFbGVtZW50LCBKYXZhRWxlbWVudExhYmVscy5BTExfUE9TVF9RVUFMSUZJRUQpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjb3BlbigpCi0JICovCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJdHJ5IHsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IEphdmFVSS5vcGVuSW5FZGl0b3IoZkVsZW1lbnQpOwotCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJSmF2YVVJLnJldmVhbEluRWRpdG9yKGVkaXRvciwgZkVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9KU1BKYXZhSHlwZXJsaW5rRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNQSmF2YUh5cGVybGlua0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NmRlZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9KU1BKYXZhSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklTb3VyY2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuQWJzdHJhY3RIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLklKU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0vKioKLSAqIERldGVjdHMgaHlwZXJsaW5rcyBpbiBKU1AgSmF2YSBjb250ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BKYXZhSHlwZXJsaW5rRGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdEh5cGVybGlua0RldGVjdG9yIHsKLQotCXByaXZhdGUgSUh5cGVybGluayBjcmVhdGVIeXBlcmxpbmsoSUphdmFFbGVtZW50IGVsZW1lbnQsIElSZWdpb24gcmVnaW9uLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSUh5cGVybGluayBsaW5rID0gbnVsbDsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBvcGVuIGxvY2FsIHZhcmlhYmxlIGluIHRoZSBKU1AgZmlsZS4uLgotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU291cmNlUmVmZXJlbmNlKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCQkJaW50IGpzcE9mZnNldCA9IDA7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCi0JCQkJLy8gdHJ5IHRvIGxvY2F0ZSB0aGUgZmlsZSBpbiB0aGUgd29ya3NwYWNlCi0JCQkJdHJ5IHsKLQkJCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBzTW9kZWwuZ2V0UmVzb2x2ZXIoKTsKLQkJCQkJCWlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIHVyaVN0cmluZyA9IHJlc29sdmVyLmdldEZpbGVCYXNlTG9jYXRpb24oKTsKLQkJCQkJCQlmaWxlID0gZ2V0RmlsZSh1cmlTdHJpbmcpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCi0JCQkJLy8gZ2V0IEphdmEgcmFuZ2UsIHRyYW5zbGF0ZSBjb29yZGluYXRlIHRvIEpTUAotCi0JCQkJdHJ5IHsKLQkJCQkJSVNvdXJjZVJhbmdlIHJhbmdlID0gbnVsbDsKLQkJCQkJSUpTUFRyYW5zbGF0aW9uIGpzcFRyYW5zbGF0aW9uID0gZ2V0SlNQVHJhbnNsYXRpb24oZG9jdW1lbnQpOwotCQkJCQlpZiAoanNwVHJhbnNsYXRpb24gIT0gbnVsbCkgewotCQkJCQkJLy8gbGluayB0byBsb2NhbCB2YXJpYWJsZSBkZWZpbml0aW9ucwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9jYWxWYXJpYWJsZSkgewotCQkJCQkJCXJhbmdlID0gKChJTG9jYWxWYXJpYWJsZSkgZWxlbWVudCkuZ2V0TmFtZVJhbmdlKCk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBsaW5raW5nIHRvIGZpZWxkcyBvZiB0aGUgc2FtZSBjb21waWxhdGlvbiB1bml0Ci0JCQkJCQllbHNlIGlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkZJRUxEKSB7Ci0JCQkJCQkJT2JqZWN0IGN1ID0gKChJRmllbGQpIGVsZW1lbnQpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJCQkJCWlmIChjdSAhPSBudWxsICYmIGN1LmVxdWFscyhqc3BUcmFuc2xhdGlvbi5nZXRDb21waWxhdGlvblVuaXQoKSkpCi0JCQkJCQkJCXJhbmdlID0gKChJU291cmNlUmVmZXJlbmNlKSBlbGVtZW50KS5nZXRTb3VyY2VSYW5nZSgpOwotCQkJCQkJfQotCQkJCQkJLy8gbGlua2luZyB0byBtZXRob2RzIG9mIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQKLQkJCQkJCWVsc2UgaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0JCQkJCQkJT2JqZWN0IGN1ID0gKChJTWV0aG9kKSBlbGVtZW50KS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCQkJCQlpZiAoY3UgIT0gbnVsbCAmJiBjdS5lcXVhbHMoanNwVHJhbnNsYXRpb24uZ2V0Q29tcGlsYXRpb25Vbml0KCkpKQotCQkJCQkJCQlyYW5nZSA9ICgoSVNvdXJjZVJlZmVyZW5jZSkgZWxlbWVudCkuZ2V0U291cmNlUmFuZ2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmIChyYW5nZSAhPSBudWxsICYmIGZpbGUgIT0gbnVsbCkgewotCQkJCQkJanNwT2Zmc2V0ID0ganNwVHJhbnNsYXRpb24uZ2V0SnNwT2Zmc2V0KHJhbmdlLmdldE9mZnNldCgpKTsKLQkJCQkJCWlmIChqc3BPZmZzZXQgPj0gMCkgewotCQkJCQkJCWxpbmsgPSBuZXcgV29ya3NwYWNlRmlsZUh5cGVybGluayhyZWdpb24sIGZpbGUsIG5ldyBSZWdpb24oanNwT2Zmc2V0LCByYW5nZS5nZXRMZW5ndGgoKSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGptZS5nZXRNZXNzYWdlKCksIGptZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGxpbmsgPT0gbnVsbCkgewotCQkJCWxpbmsgPSBuZXcgSlNQSmF2YUh5cGVybGluayhyZWdpb24sIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGlua0RldGVjdG9yI2RldGVjdEh5cGVybGlua3Mob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSUh5cGVybGlua1tdIGRldGVjdEh5cGVybGlua3MoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiByZWdpb24sIGJvb2xlYW4gY2FuU2hvd011bHRpcGxlSHlwZXJsaW5rcykgewotCQlMaXN0IGh5cGVybGlua3MgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCWlmIChyZWdpb24gIT0gbnVsbCAmJiB0ZXh0Vmlld2VyICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQotCQkJLy8gY2hlY2sgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIGEgdmFsaWQgSmF2YSB0eXBlCi0JCQlKU1BUcmFuc2xhdGlvbiBqc3BUcmFuc2xhdGlvbiA9IGdldEpTUFRyYW5zbGF0aW9uKGRvY3VtZW50KTsKLQkJCWlmIChqc3BUcmFuc2xhdGlvbiAhPSBudWxsKSB7Ci0JCQkJLy8gY2hlY2sgaWYgd2UgYXJlIGluIEpTUCBKYXZhIGNvbnRlbnQKLQkJCQlpbnQgamF2YU9mZnNldCA9IGpzcFRyYW5zbGF0aW9uLmdldEphdmFPZmZzZXQocmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCQlpZiAoamF2YU9mZnNldCA+IC0xKSB7Ci0JCQkJCS8vIGNoZWNrIHRoYXQgd2UgYXJlIG5vdCBpbiBpbmRpcmVjdCBKYXZhIGNvbnRlbnQgKGxpa2UKLQkJCQkJLy8gaW5jbHVkZWQgZmlsZXMpCi0JCQkJCWlmICghanNwVHJhbnNsYXRpb24uaXNJbmRpcmVjdChqYXZhT2Zmc2V0KSkgewotCQkJCQkJLy8gZ2V0IEphdmEgZWxlbWVudHMKLQkJCQkJCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0ganNwVHJhbnNsYXRpb24uZ2V0RWxlbWVudHNGcm9tSnNwUmFuZ2UocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJCQkJCS8vIGNyZWF0ZSBhIEpTUEphdmFIeXBlcmxpbmsgZm9yIGVhY2ggSmF2YSBlbGVtZW50Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkgewotCQkJCQkJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCi0JCQkJCQkJCS8vIGZpbmQgaHlwZXJsaW5rIHJhbmdlIGZvciBKYXZhIGVsZW1lbnQKLQkJCQkJCQkJSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24gPSBzZWxlY3RXb3JkKGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCQkJCQlJSHlwZXJsaW5rIGxpbmsgPSBjcmVhdGVIeXBlcmxpbmsoZWxlbWVudCwgaHlwZXJsaW5rUmVnaW9uLCBkb2N1bWVudCk7Ci0JCQkJCQkJCWlmIChsaW5rICE9IG51bGwpIHsKLQkJCQkJCQkJCWh5cGVybGlua3MuYWRkKGxpbmspOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGh5cGVybGlua3Muc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChJSHlwZXJsaW5rW10pIGh5cGVybGlua3MudG9BcnJheShuZXcgSUh5cGVybGlua1swXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBJRmlsZSBmcm9tIHRoZSBnaXZlbiB1cmkgaWYgcG9zc2libGUsIG51bGwgaWYgY2Fubm90IGZpbmQKLQkgKiBmaWxlIGZyb20gdXJpLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlU3RyaW5nCi0JICogICAgICAgICAgICBmaWxlIHN5c3RlbSBwYXRoCi0JICogQHJldHVybiByZXR1cm5zIElGaWxlIGlmIGZpbGVTdHJpbmcgZXhpc3RzIGluIHRoZSB3b3Jrc3BhY2UKLQkgKi8KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoU3RyaW5nIGZpbGVTdHJpbmcpIHsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0KLQkJaWYgKGZpbGVTdHJpbmcgIT0gbnVsbCkgewotCQkJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGZpbGVTdHJpbmcpOwotCQkJaWYgKGZpbGVQYXRoLnNlZ21lbnRDb3VudCgpID4gMSAmJiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCQl9Ci0JCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihmaWxlUGF0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aCAmJiBmaWxlID09IG51bGw7IGkrKykKLQkJCQlpZiAoZmlsZXNbaV0uZXhpc3RzKCkpCi0JCQkJCWZpbGUgPSBmaWxlc1tpXTsKLQkJfQotCi0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKgotCSAqIEdldCBKU1AgdHJhbnNsYXRpb24gb2JqZWN0Ci0JICogCi0JICogQHJldHVybiBKU1BUcmFuc2xhdGlvbiBpZiBvbmUgZXhpc3RzLCBudWxsIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgSlNQVHJhbnNsYXRpb24gZ2V0SlNQVHJhbnNsYXRpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gbnVsbDsKLQotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJSURPTURvY3VtZW50IHhtbERvYyA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQkJSlNQVHJhbnNsYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSlNQVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJdHJhbnNsYXRpb24gPSBhZGFwdGVyLmdldEpTUFRyYW5zbGF0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIHRyYW5zbGF0aW9uOwotCX0KLQotCS8qKgotCSAqIEphdmEgYWx3YXlzIHNlbGVjdHMgd29yZCB3aGVuIGRlZmluaW5nIHJlZ2lvbgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEBwYXJhbSBhbmNob3IKLQkgKiBAcmV0dXJuIElSZWdpb24KLQkgKi8KLQlwcml2YXRlIElSZWdpb24gc2VsZWN0V29yZChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBhbmNob3IpIHsKLQotCQl0cnkgewotCQkJaW50IG9mZnNldCA9IGFuY2hvcjsKLQkJCWNoYXIgYzsKLQotCQkJd2hpbGUgKG9mZnNldCA+PSAwKSB7Ci0JCQkJYyA9IGRvY3VtZW50LmdldENoYXIob2Zmc2V0KTsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSkKLQkJCQkJYnJlYWs7Ci0JCQkJLS1vZmZzZXQ7Ci0JCQl9Ci0KLQkJCWludCBzdGFydCA9IG9mZnNldDsKLQotCQkJb2Zmc2V0ID0gYW5jaG9yOwotCQkJaW50IGxlbmd0aCA9IGRvY3VtZW50LmdldExlbmd0aCgpOwotCi0JCQl3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKSB7Ci0JCQkJYyA9IGRvY3VtZW50LmdldENoYXIob2Zmc2V0KTsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSkKLQkJCQkJYnJlYWs7Ci0JCQkJKytvZmZzZXQ7Ci0JCQl9Ci0KLQkJCWludCBlbmQgPSBvZmZzZXQ7Ci0KLQkJCWlmIChzdGFydCA9PSBlbmQpCi0JCQkJcmV0dXJuIG5ldyBSZWdpb24oc3RhcnQsIDApOwotCi0JCQlyZXR1cm4gbmV3IFJlZ2lvbihzdGFydCArIDEsIGVuZCAtIHN0YXJ0IC0gMSk7Ci0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1RMREZpbGVIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVExERmlsZUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTJiMGY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVExERmlsZUh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotY2xhc3MgVExERmlsZUh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCi0JcHJpdmF0ZSBJUmVzb3VyY2UgZlJlc291cmNlOwotCXByaXZhdGUgSVJlZ2lvbiBmSHlwZXJsaW5rUmVnaW9uOwotCXByaXZhdGUgU3RyaW5nIGZTZWFyY2hOYW1lOwotCXByaXZhdGUgaW50IGZTZWFyY2hUeXBlOwotCi0JcHVibGljIFRMREZpbGVIeXBlcmxpbmsoSVJlc291cmNlIHJlc291cmNlLCBpbnQgc2VhcmNoVHlwZSwgU3RyaW5nIHNlYXJjaE5hbWUsIElSZWdpb24gaHlwZXJsaW5rUmVnaW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCWZSZXNvdXJjZSA9IHJlc291cmNlOwotCQlmU2VhcmNoTmFtZSA9IHNlYXJjaE5hbWU7Ci0JCWZTZWFyY2hUeXBlID0gc2VhcmNoVHlwZTsKLQkJZkh5cGVybGlua1JlZ2lvbiA9IGh5cGVybGlua1JlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIElNYXJrZXIgY3JlYXRlTWFya2VyKElGaWxlIGZpbGUsIElSZWdpb24gcmVnaW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyVXRpbGl0aWVzLnNldENoYXJTdGFydChJTWFya2VyLCBpbnQpCi0JCUlNYXJrZXIgbWFya2VyID0gZmlsZS5jcmVhdGVNYXJrZXIoSlNQVUlQbHVnaW4uSUQgKyAiaHlwZXJsaW5rIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlRSQU5TSUVOVCwgQm9vbGVhbi5UUlVFKTsKLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNPVVJDRV9JRCwgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgcmVnaW9uLmdldE9mZnNldCgpKTsKLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5ELCByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQlyZXR1cm4gbWFya2VyOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZIeXBlcmxpbmtSZWdpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQlyZXR1cm4gTkxTLmJpbmQoSlNQVUlNZXNzYWdlcy5PcGVuLCBmUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBKU1BVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKGZSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBmUmVzb3VyY2U7Ci0JCQkJSU1hcmtlciBtYXJrZXIgPSBudWxsOwotCQkJCUlET01Nb2RlbCBkb21Nb2RlbCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQkJCWRvbU1vZGVsID0gKElET01Nb2RlbCkgbW9kZWw7Ci0JCQkJCQlpZiAoZG9tTW9kZWwgIT0gbnVsbCkgewotCQkJCQkJCUlSZWdpb24gdGFyZ2V0UmVnaW9uID0gVGFnbGliSHlwZXJsaW5rRGV0ZWN0b3IuZmluZERlZmluaXRpb24oZG9tTW9kZWwsIGZTZWFyY2hOYW1lLCBmU2VhcmNoVHlwZSk7Ci0JCQkJCQkJaWYgKHRhcmdldFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQltYXJrZXIgPSBjcmVhdGVNYXJrZXIoZmlsZSwgdGFyZ2V0UmVnaW9uKTsKLQkJCQkJCQkJfQotCQkJCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChtYXJrZXIgIT0gbnVsbCkgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgbWFya2VyKTsKLQkJCQkJCQkJfQotCQkJCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZTEpIHsKLQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQltYXJrZXIuZGVsZXRlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMikgewotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKGRvbU1vZGVsICE9IG51bGwpIHsKLQkJCQkJCWRvbU1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UYWdsaWJIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UYWdsaWJIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmQ3YjQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVGFnbGliSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5BYnN0cmFjdEh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuVVJMSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5DTUVsZW1lbnREZWNsYXJhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVGFnbGliVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMVRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVExEUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRhZ2xpYlJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLlRhZ2xpYkluZGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXh0LklKU1BQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Ob2RlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIERldGVjdHMgaHlwZXJsaW5rcyBmb3IgdGFnbGlicy4KLSAqLwotcHVibGljIGNsYXNzIFRhZ2xpYkh5cGVybGlua0RldGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RIeXBlcmxpbmtEZXRlY3RvciB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSFRUUF9QUk9UT0NPTCA9ICJodHRwOi8vIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSkFSX1BST1RPQ09MID0gImphcjpmaWxlOiI7Ly8kTk9OLU5MUy0xJAotCS8vIHByaXZhdGUgU3RyaW5nIFVSTl9UQUdESVIgPSAidXJuOmpzcHRhZ2RpcjoiOwotCXByaXZhdGUgU3RyaW5nIFVSTl9UTEQgPSAidXJuOmpzcHRsZDoiOwotCXByaXZhdGUgU3RyaW5nIFhNTE5TID0gInhtbG5zOiI7IC8vJE5PTi1OTFMtMSQgCi0JCi0Jc3RhdGljIGZpbmFsIGludCBUQUcgPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFID0gMjsKLQkKLQlzdGF0aWMgSVJlZ2lvbiBmaW5kRGVmaW5pdGlvbihJRE9NTW9kZWwgbW9kZWwsIFN0cmluZyBzZWFyY2hOYW1lLCBpbnQgc2VhcmNoVHlwZSkgewotCQlOb2RlTGlzdCBkZWNsYXJhdGlvbnMgPSBudWxsOwotCQlpZiAoc2VhcmNoVHlwZSA9PSBUQUcpCi0JCQlkZWNsYXJhdGlvbnMgPSBtb2RlbC5nZXREb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoIioiLCBKU1AxMVRMRE5hbWVzLlRBRyk7Ci0JCWVsc2UgaWYgKHNlYXJjaFR5cGUgPT0gQVRUUklCVVRFKQotCQkJZGVjbGFyYXRpb25zID0gbW9kZWwuZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCIqIiwgSlNQMTFUTEROYW1lcy5BVFRSSUJVVEUpOwotCQlpZiAoZGVjbGFyYXRpb25zID09IG51bGwgfHwgZGVjbGFyYXRpb25zLmdldExlbmd0aCgpID09IDApIHsKLQkJCWlmIChzZWFyY2hUeXBlID09IFRBRykKLQkJCQlkZWNsYXJhdGlvbnMgPSBtb2RlbC5nZXREb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKEpTUDExVExETmFtZXMuVEFHKTsKLQkJCWVsc2UgaWYgKHNlYXJjaFR5cGUgPT0gQVRUUklCVVRFKQotCQkJCWRlY2xhcmF0aW9ucyA9IG1vZGVsLmdldERvY3VtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlNQMTFUTEROYW1lcy5BVFRSSUJVVEUpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVjbGFyYXRpb25zLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGVMaXN0IG5hbWVzID0gbW9kZWwuZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZShKU1AxMVRMRE5hbWVzLk5BTUUpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBuYW1lcy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBnZXRDb250YWluZWRUZXh0KG5hbWVzLml0ZW0oaikpOwotCQkJCWlmIChzZWFyY2hOYW1lLmNvbXBhcmVUbyhuYW1lKSA9PSAwKSB7Ci0JCQkJCWludCBzdGFydCA9IC0xOwotCQkJCQlpbnQgZW5kID0gLTE7Ci0JCQkJCU5vZGUgY2FyZXQgPSBuYW1lcy5pdGVtKGopLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJaWYgKGNhcmV0ICE9IG51bGwpIHsKLQkJCQkJCXN0YXJ0ID0gKChJRE9NTm9kZSkgY2FyZXQpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQkJd2hpbGUgKGNhcmV0ICE9IG51bGwpIHsKLQkJCQkJCWVuZCA9ICgoSURPTU5vZGUpIGNhcmV0KS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCWNhcmV0ID0gY2FyZXQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJfQotCQkJCQlpZiAoc3RhcnQgPiAwKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENvbnRhaW5lZFRleHQoTm9kZSBwYXJlbnQpIHsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoY2hpbGRyZW4uZ2V0TGVuZ3RoKCkgPT0gMSkgewotCQkJcmV0dXJuIGNoaWxkcmVuLml0ZW0oMCkuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKSB7Ci0JCQkJU3RyaW5nIHJlZmVyZW5jZSA9ICgoRW50aXR5UmVmZXJlbmNlKSBjaGlsZCkuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJaWYgKHJlZmVyZW5jZSA9PSBudWxsICYmIGNoaWxkLmdldE5vZGVOYW1lKCkgIT0gbnVsbCkgewotCQkJCQlyZWZlcmVuY2UgPSAiJiIgKyBjaGlsZC5nZXROb2RlTmFtZSgpICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQkJCXMuYXBwZW5kKHJlZmVyZW5jZS50cmltKCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXMuYXBwZW5kKGNoaWxkLmdldE5vZGVWYWx1ZSgpLnRyaW0oKSk7Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHMudG9TdHJpbmcoKS50cmltKCk7Ci0JfQotCi0JcHVibGljIElIeXBlcmxpbmtbXSBkZXRlY3RIeXBlcmxpbmtzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gcmVnaW9uLCBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MpIHsKLQkJSUh5cGVybGluayBoeXBlcmxpbmsgPSBudWxsOwotCi0JCWlmICh0ZXh0Vmlld2VyICE9IG51bGwgJiYgcmVnaW9uICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2MgPSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBjaGVjayBpZiBqc3AgdGFnL2RpcmVjdGl2ZSBmaXJzdAotCQkJCQlJVHlwZWRSZWdpb24gcGFydGl0aW9uID0gVGV4dFV0aWxpdGllcy5nZXRQYXJ0aXRpb24oZG9jLCBJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCByZWdpb24uZ2V0T2Zmc2V0KCksIGZhbHNlKTsKLQkJCQkJaWYgKHBhcnRpdGlvbiAhPSBudWxsICYmIHBhcnRpdGlvbi5nZXRUeXBlKCkgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSkgewotCQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvYyk7Ci0JCQkJCQkJLy8gY2hlY2sgaWYganNwIHRhZ2xpYiBkaXJlY3RpdmUKLQkJCQkJCQlOb2RlIGN1cnJlbnROb2RlID0gZ2V0Q3VycmVudE5vZGUoc01vZGVsLCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCQkJU3RyaW5nIGJhc2VMb2NhdGlvbkZvclRhZ2xpYiA9IGdldEJhc2VMb2NhdGlvbkZvclRhZ2xpYihkb2MpOwotCQkJCQkJCQlpZiAoYmFzZUxvY2F0aW9uRm9yVGFnbGliICE9IG51bGwgJiYgSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQi5lcXVhbHNJZ25vcmVDYXNlKGN1cnJlbnROb2RlLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJCQkJCQkvKioKLQkJCQkJCQkJCSAqIFRoZSB0YWdsaWIgZGlyZWN0aXZlIGl0c2VsZgotCQkJCQkJCQkJICovCi0JCQkJCQkJCQkvLyBnZXQgdGhlIHVyaSBhdHRyaWJ1dGUKLQkJCQkJCQkJCUF0dHIgdGFnbGliVVJJTm9kZSA9ICgoRWxlbWVudCkgY3VycmVudE5vZGUpLmdldEF0dHJpYnV0ZU5vZGUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1VSSSk7Ci0JCQkJCQkJCQlpZiAodGFnbGliVVJJTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJSVRhZ2xpYlJlY29yZCByZWZlcmVuY2UgPSBUYWdsaWJJbmRleC5yZXNvbHZlKGJhc2VMb2NhdGlvbkZvclRhZ2xpYiwgdGFnbGliVVJJTm9kZS5nZXRWYWx1ZSgpLCBmYWxzZSk7Ci0JCQkJCQkJCQkJLy8gd2hlbiB1c2luZyBhIHRhZ2RpcgotCQkJCQkJCQkJCS8vIChJVGFnbGliUmVjb3JkLlRBR0RJUiksCi0JCQkJCQkJCQkJLy8gdGhlcmUncyBub3RoaW5nIHRvIGxpbmsgdG8KLQkJCQkJCQkJCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJLy8gaGFuZGxlIHRhZ2xpYnMKLQkJCQkJCQkJCQkJc3dpdGNoIChyZWZlcmVuY2UuZ2V0UmVjb3JkVHlwZSgpKSB7Ci0JCQkJCQkJCQkJCQljYXNlIChJVGFnbGliUmVjb3JkLlRMRCkgOiB7Ci0JCQkJCQkJCQkJCQkJSVRMRFJlY29yZCByZWNvcmQgPSAoSVRMRFJlY29yZCkgcmVmZXJlbmNlOwotCQkJCQkJCQkJCQkJCVN0cmluZyB1cmlTdHJpbmcgPSByZWNvcmQuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCQkJCQkJSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24gPSBnZXRIeXBlcmxpbmtSZWdpb24odGFnbGliVVJJTm9kZSwgcmVnaW9uKTsKLQkJCQkJCQkJCQkJCQlpZiAoaHlwZXJsaW5rUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJCQkJaHlwZXJsaW5rID0gY3JlYXRlSHlwZXJsaW5rKHVyaVN0cmluZywgaHlwZXJsaW5rUmVnaW9uLCBkb2MsIG51bGwpOwotCQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuSkFSKSA6Ci0JCQkJCQkJCQkJCQljYXNlIChJVGFnbGliUmVjb3JkLlVSTCkgOiB7Ci0JCQkJCQkJCQkJCQkJSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24gPSBnZXRIeXBlcmxpbmtSZWdpb24odGFnbGliVVJJTm9kZSwgcmVnaW9uKTsKLQkJCQkJCQkJCQkJCQlpZiAoaHlwZXJsaW5rUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJCQkJaHlwZXJsaW5rID0gbmV3IFRhZ2xpYkphclVyaUh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIHJlZmVyZW5jZSk7Ci0JCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgaWYgKGJhc2VMb2NhdGlvbkZvclRhZ2xpYiAhPSBudWxsICYmIEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJPT1QuZXF1YWxzSWdub3JlQ2FzZShjdXJyZW50Tm9kZS5nZXROb2RlTmFtZSgpKSkgewotCQkJCQkJCQkJLyoqCi0JCQkJCQkJCQkgKiBUaGUganNwOnJvb3QgZWxlbWVudAotCQkJCQkJCQkJICovCi0JCQkJCQkJCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBjdXJyZW50Tm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJCQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCQkJCQkJCQlpZiAoYXR0ci5nZXROb2RlTmFtZSgpLnN0YXJ0c1dpdGgoWE1MTlMpKSB7Ci0JCQkJCQkJCQkJCVN0cmluZyB1cmkgPSBTdHJpbmdVdGlscy5zdHJpcChhdHRyLmdldE5vZGVWYWx1ZSgpKTsKLQkJCQkJCQkJCQkJaWYgKHVyaS5zdGFydHNXaXRoKFVSTl9UTEQpKSB7Ci0JCQkJCQkJCQkJCQl1cmkgPSB1cmkuc3Vic3RyaW5nKFVSTl9UTEQubGVuZ3RoKCkpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCUlUYWdsaWJSZWNvcmQgcmVmZXJlbmNlID0gVGFnbGliSW5kZXgucmVzb2x2ZShiYXNlTG9jYXRpb25Gb3JUYWdsaWIsIHVyaSwgZmFsc2UpOwotCQkJCQkJCQkJCQkvLyB3aGVuIHVzaW5nIGEgdGFnZGlyCi0JCQkJCQkJCQkJCS8vIChJVGFnbGliUmVjb3JkLlRBR0RJUiksCi0JCQkJCQkJCQkJCS8vIHRoZXJlJ3Mgbm90aGluZyB0byBsaW5rIHRvCi0JCQkJCQkJCQkJCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCQkJCQkJCQkJLy8gaGFuZGxlIHRhZ2xpYnMKLQkJCQkJCQkJCQkJCXN3aXRjaCAocmVmZXJlbmNlLmdldFJlY29yZFR5cGUoKSkgewotCQkJCQkJCQkJCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVExEKSA6IHsKLQkJCQkJCQkJCQkJCQkJSVRMRFJlY29yZCByZWNvcmQgPSAoSVRMRFJlY29yZCkgcmVmZXJlbmNlOwotCQkJCQkJCQkJCQkJCQlTdHJpbmcgdXJpU3RyaW5nID0gcmVjb3JkLmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJCQkJCQkJCQkJCQlJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IGdldEh5cGVybGlua1JlZ2lvbihhdHRyLCByZWdpb24pOwotCQkJCQkJCQkJCQkJCQlpZiAoaHlwZXJsaW5rUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJCQkJCWh5cGVybGluayA9IGNyZWF0ZUh5cGVybGluayh1cmlTdHJpbmcsIGh5cGVybGlua1JlZ2lvbiwgZG9jLCBudWxsKTsKLQkJCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5KQVIpIDoKLQkJCQkJCQkJCQkJCQljYXNlIChJVGFnbGliUmVjb3JkLlVSTCkgOiB7Ci0JCQkJCQkJCQkJCQkJCUlSZWdpb24gaHlwZXJsaW5rUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKGF0dHIsIHJlZ2lvbik7Ci0JCQkJCQkJCQkJCQkJCWlmIChoeXBlcmxpbmtSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCQkJCQkJCQkJaHlwZXJsaW5rID0gbmV3IFRhZ2xpYkphclVyaUh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIHJlZmVyZW5jZSk7Ci0JCQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkvKioKLQkJCQkJCQkJCSAqIEh5cGVybGluayBjdXN0b20gdGFnIHRvIGl0cyBUTEQgb3IgdGFnIGZpbGUKLQkJCQkJCQkJCSAqLwotCQkJCQkJCQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgZG9jdW1lbnRNYW5hZ2VyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcihkb2MpOwotCQkJCQkJCQkJaWYgKGRvY3VtZW50TWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJTGlzdCBkb2N1bWVudFRyYWNrZXJzID0gZG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnRUcmFja2VycyhjdXJyZW50Tm9kZS5nZXRQcmVmaXgoKSwgcmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRvY3VtZW50VHJhY2tlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQkJCQkJVGFnbGliVHJhY2tlciB0cmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpIGRvY3VtZW50VHJhY2tlcnMuZ2V0KGkpOwotCQkJCQkJCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSB0cmFja2VyLmdldEVsZW1lbnRzKCkuZ2V0TmFtZWRJdGVtKGN1cnJlbnROb2RlLmdldE5vZGVOYW1lKCkpOwotCQkJCQkJCQkJCQlpZiAoZGVjbCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCQlkZWNsID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSAoKENNTm9kZVdyYXBwZXIpIGRlY2wpLmdldE9yaWdpbk5vZGUoKTsKLQkJCQkJCQkJCQkJCWlmIChkZWNsIGluc3RhbmNlb2YgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKSB7Ci0JCQkJCQkJCQkJCQkJU3RyaW5nIGJhc2UgPSAoKENNRWxlbWVudERlY2xhcmF0aW9uSW1wbCkgZGVjbCkuZ2V0TG9jYXRpb25TdHJpbmcoKTsKLQkJCQkJCQkJCQkJCQlJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IGdldEh5cGVybGlua1JlZ2lvbihjdXJyZW50Tm9kZSwgcmVnaW9uKTsKLQkJCQkJCQkJCQkJCQlpZiAoaHlwZXJsaW5rUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJCQkJaHlwZXJsaW5rID0gY3JlYXRlSHlwZXJsaW5rKGJhc2UsIGh5cGVybGlua1JlZ2lvbiwgZG9jLCBjdXJyZW50Tm9kZSk7Ci0JCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJCQl9CQkJCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGh5cGVybGluayAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBJSHlwZXJsaW5rW117aHlwZXJsaW5rfTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBiYXNlIGxvY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgbW9kZWwgKGlmIHdpdGhpbiB3b3Jrc3BhY2UsCi0JICogbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gd29ya3NwYWNlLCBvdGhlcndpc2UsIGZpbGUgc3lzdGVtIHBhdGgpCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uRm9yVGFnbGliKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlTdHJpbmcgYmFzZUxvYyA9IG51bGw7Ci0KLQkJLy8gZ2V0IHRoZSBiYXNlIGxvY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgbW9kZWwKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQliYXNlTG9jID0gc01vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBiYXNlTG9jOwotCX0KLQotCS8vIHRoZSBiZWxvdyBtZXRob2RzIHdlcmUgY29waWVkIGZyb20gVVJJSHlwZXJsaW5rRGV0ZWN0b3IKLQotCXByaXZhdGUgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oTm9kZSBub2RlLCBJUmVnaW9uIGJvdW5kaW5nUmVnaW9uKSB7Ci0JCUlSZWdpb24gaHlwZXJSZWdpb24gPSBudWxsOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQkJLy8gaGFuZGxlIGRvYyB0eXBlIG5vZGUKLQkJCQlJRE9NTm9kZSBkb2NOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkJCWh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihkb2NOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGRvY05vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBkb2NOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCS8vIGhhbmRsZSBhdHRyaWJ1dGUgbm9kZXMKLQkJCQlJRE9NQXR0ciBhdHQgPSAoSURPTUF0dHIpIG5vZGU7Ci0JCQkJLy8gZG8gbm90IGluY2x1ZGUgcXVvdGVzIGluIGF0dHJpYnV0ZSB2YWx1ZSByZWdpb24KLQkJCQlpbnQgcmVnT2Zmc2V0ID0gYXR0LmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IGF0dC5nZXRWYWx1ZVJlZ2lvbigpOwotCQkJCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWludCByZWdMZW5ndGggPSB2YWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCVN0cmluZyBhdHRWYWx1ZSA9IGF0dC5nZXRWYWx1ZVJlZ2lvblRleHQoKTsKLQkJCQkJaWYgKFN0cmluZ1V0aWxzLmlzUXVvdGVkKGF0dFZhbHVlKSkgewotCQkJCQkJKytyZWdPZmZzZXQ7Ci0JCQkJCQlyZWdMZW5ndGggPSByZWdMZW5ndGggLSAyOwotCQkJCQl9Ci0JCQkJCWh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihyZWdPZmZzZXQsIHJlZ0xlbmd0aCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJLy8gSGFuZGxlIGRvYyB0eXBlIG5vZGUKLQkJCQlJRE9NTm9kZSBkb2NOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkJCWh5cGVyUmVnaW9uID0gZ2V0TmFtZVJlZ2lvbihkb2NOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJCWlmIChoeXBlclJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCWh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihkb2NOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGRvY05vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvKioKLQkJICogT25seSByZXR1cm4gYSBoeXBlcmxpbmsgcmVnaW9uIHRoYXQgb3ZlcmxhcHMgdGhlIHNlYXJjaCByZWdpb24uCi0JCSAqIFRoaXMgd2lsbCBoZWxwIHVzIHRvIG5vdCB1bmRlcmxpbmUgYXJlYXMgbm90IHVuZGVyIHRoZSBjdXJzb3IuCi0JCSAqLwotCQlpZiAoaHlwZXJSZWdpb24gIT0gbnVsbCAmJiBpbnRlcnNlY3RzKGh5cGVyUmVnaW9uLCBib3VuZGluZ1JlZ2lvbikpCi0JCQlyZXR1cm4gaHlwZXJSZWdpb247Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpbnRlcnNlY3RzKElSZWdpb24gaHlwZXJsaW5rUmVnaW9uLCBJUmVnaW9uIGRldGVjdGlvblJlZ2lvbikgewotCQlpbnQgaHlwZXJMaW5rU3RhcnQgPSBoeXBlcmxpbmtSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCWludCBoeXBlckxpbmtFbmQgPSBoeXBlcmxpbmtSZWdpb24uZ2V0T2Zmc2V0KCkgKyBoeXBlcmxpbmtSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWludCBkZXRlY3Rpb25TdGFydCA9IGRldGVjdGlvblJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJaW50IGRldGVjdGlvbkVuZCA9IGRldGVjdGlvblJlZ2lvbi5nZXRPZmZzZXQoKSArIGRldGVjdGlvblJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJcmV0dXJuIChoeXBlckxpbmtTdGFydCA8PSBkZXRlY3Rpb25TdGFydCAmJiBkZXRlY3Rpb25TdGFydCA8IGh5cGVyTGlua0VuZCkgfHwgKGh5cGVyTGlua1N0YXJ0IDw9IGRldGVjdGlvbkVuZCAmJiBkZXRlY3Rpb25FbmQgPD0gaHlwZXJMaW5rRW5kKTsvLyB8fAotCX0KLQotCXByaXZhdGUgSVJlZ2lvbiBnZXROYW1lUmVnaW9uKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXJSZWdpb24pIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBjb250YWluZXJSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQluYW1lUmVnaW9uID0gcjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBSZWdpb24oY29udGFpbmVyUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pLCBuYW1lUmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgaHlwZXJsaW5rCi0JICogCi0JICogQHBhcmFtIHVyaVN0cmluZwotCSAqIEBwYXJhbSBoeXBlcmxpbmtSZWdpb24KLQkgKiBAcmV0dXJuIElIeXBlcmxpbmsKLQkgKi8KLQlwcml2YXRlIElIeXBlcmxpbmsgY3JlYXRlSHlwZXJsaW5rKFN0cmluZyB1cmlTdHJpbmcsIElSZWdpb24gaHlwZXJsaW5rUmVnaW9uLCBJRG9jdW1lbnQgZG9jdW1lbnQsIE5vZGUgbm9kZSkgewotCQlJSHlwZXJsaW5rIGxpbmsgPSBudWxsOwotCi0JCWlmICh1cmlTdHJpbmcgIT0gbnVsbCkgewotCQkJU3RyaW5nIHRlbXAgPSB1cmlTdHJpbmcudG9Mb3dlckNhc2UoKTsKLQkJCWlmICh0ZW1wLnN0YXJ0c1dpdGgoSFRUUF9QUk9UT0NPTCkpIHsKLQkJCQkvLyB0aGlzIGlzIGEgVVJMSHlwZXJsaW5rIHNpbmNlIHRoaXMgaXMgYSB3ZWIgYWRkcmVzcwotCQkJCWxpbmsgPSBuZXcgVVJMSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgdXJpU3RyaW5nKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRlbXAuc3RhcnRzV2l0aChKQVJfUFJPVE9DT0wpKSB7Ci0JCQkJLy8gdGhpcyBpcyBhIFVSTEZpbGVIeXBlcmxpbmsgc2luY2UgdGhpcyBpcyBhIGxvY2FsIGFkZHJlc3MKLQkJCQl0cnkgewotCQkJCQlsaW5rID0gbmV3IFVSTEZpbGVSZWdpb25IeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCBUQUcsIG5vZGUuZ2V0TG9jYWxOYW1lKCksIG5ldyBVUkwodXJpU3RyaW5nKSkgewotCQkJCQkJcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQkJCQkJCXJldHVybiBKU1BVSU1lc3NhZ2VzLkN1c3RvbVRhZ0h5cGVybGlua19oeXBlcmxpbmtUZXh0OwotCQkJCQkJfQotCQkJCQl9OwotCQkJCX0KLQkJCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHRyeSB0byBsb2NhdGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZQotCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aCh1cmlTdHJpbmcpOwotCQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJCQlpZiAoZmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgZmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJCWxpbmsgPSBuZXcgVExERmlsZUh5cGVybGluayhmaWxlLCBUQUcsIG5vZGUuZ2V0TG9jYWxOYW1lKCksIGh5cGVybGlua1JlZ2lvbikgewotCQkJCQkJCQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCQkJCQkJCQlyZXR1cm4gSlNQVUlNZXNzYWdlcy5DdXN0b21UYWdIeXBlcmxpbmtfaHlwZXJsaW5rVGV4dDsKLQkJCQkJCQkJfQotCQkJCQkJCX07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlsaW5rID0gbmV3IFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCBmaWxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChsaW5rID09IG51bGwpIHsKLQkJCQkvLyB0aGlzIGlzIGFuIEV4dGVybmFsRmlsZUh5cGVybGluayBzaW5jZSBmaWxlIGRvZXMgbm90IGV4aXN0Ci0JCQkJLy8gaW4gd29ya3NwYWNlCi0JCQkJRmlsZSBleHRlcm5hbEZpbGUgPSBuZXcgRmlsZSh1cmlTdHJpbmcpOwotCQkJCWxpbmsgPSBuZXcgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgZXh0ZXJuYWxGaWxlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBsaW5rOwotCX0KLQotCXByaXZhdGUgTm9kZSBnZXRDdXJyZW50Tm9kZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIGdldCB0aGUgY3VycmVudCBub2RlIGF0IHRoZSBvZmZzZXQgKHJldHVybnMgZWl0aGVyOiBlbGVtZW50LAotCQkvLyBkb2N0eXBlLCB0ZXh0KQotCQlJbmRleGVkUmVnaW9uIGlub2RlID0gbnVsbDsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCWlub2RlID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQpOwotCQkJaWYgKGlub2RlID09IG51bGwpIHsKLQkJCQlpbm9kZSA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0IC0gMSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaW5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gKE5vZGUpIGlub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVGFnbGliSmFySHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1RhZ2xpYkphckh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjUyYWRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVGFnbGliSmFySHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotLyoqCi0gKiBIeXBlcmxpbmsgZm9yIHRhZ2xpYiBmaWxlcyBpbiBqYXJzLgotICovCi1jbGFzcyBUYWdsaWJKYXJIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQlzdGF0aWMgY2xhc3MgWmlwU3RvcmFnZSBpbXBsZW1lbnRzIElTdG9yYWdlIHsKLQkJRmlsZSBmRmlsZSA9IG51bGw7Ci0JCVN0cmluZyBmRW50cnlOYW1lID0gbnVsbDsKLQotCQlaaXBTdG9yYWdlKEZpbGUgZmlsZSwgU3RyaW5nIGVudHJ5TmFtZSkgewotCQkJZkZpbGUgPSBmaWxlOwotCQkJZkVudHJ5TmFtZSA9IGVudHJ5TmFtZTsKLQkJfQotCi0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCVppcEZpbGUgZmlsZSA9IG5ldyBaaXBGaWxlKGZGaWxlKTsKLQkJCQlaaXBFbnRyeSBlbnRyeSA9IGZpbGUuZ2V0RW50cnkoZkVudHJ5TmFtZSk7Ci0JCQkJc3RyZWFtID0gZmlsZS5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5FUlJPUiwgZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBlKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RyZWFtOwotCQl9Ci0KLQkJcHVibGljIElQYXRoIGdldEZ1bGxQYXRoKCkgewotCQkJcmV0dXJuIG5ldyBQYXRoKGZGaWxlLmdldEFic29sdXRlUGF0aCgpICsgSVBhdGguU0VQQVJBVE9SICsgZkVudHJ5TmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gZkVudHJ5TmFtZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgSVJlZ2lvbiBmUmVnaW9uOwotCXByaXZhdGUgSVBhdGggZlppcEZpbGVQYXRoOwotCi0JcHVibGljIFRhZ2xpYkphckh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgSVBhdGggemlwRmlsZVBhdGgpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZlppcEZpbGVQYXRoID0gemlwRmlsZVBhdGg7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZlJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJcmV0dXJuIEpTUFVJTWVzc2FnZXMuVExESHlwZXJsaW5rX2h5cGVybGlua1RleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IFVSTEZpbGVIeXBlcmxpbmsuU3RvcmFnZUVkaXRvcklucHV0KG5ldyBaaXBTdG9yYWdlKGZaaXBGaWxlUGF0aC50b0ZpbGUoKSwgIk1FVEEtSU5GL3RhZ2xpYi50bGQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSUVkaXRvckRlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQkJdHJ5IHsKLQkJCWRlc2NyaXB0b3IgPSBJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcihpbnB1dC5nZXROYW1lKCkpOwotCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBpbnB1dCwgZGVzY3JpcHRvci5nZXRJZCgpLCB0cnVlKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UYWdsaWJKYXJVcmlIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVGFnbGliSmFyVXJpSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDA3MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UYWdsaWJKYXJVcmlIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklKYXJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnbGliUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVVSTFJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciB0YWdsaWIgZmlsZXMgaW4gamFycyBvciBzcGVjaWZpZWQgYnkgdXJscy4KLSAqLwotY2xhc3MgVGFnbGliSmFyVXJpSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0JcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0JcHJpdmF0ZSBJVGFnbGliUmVjb3JkIGZUYWdsaWJSZWNvcmQ7Ci0JcHJpdmF0ZSBJSHlwZXJsaW5rIGZIeXBlcmxpbms7Ci0KLQlwdWJsaWMgVGFnbGliSmFyVXJpSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBJVGFnbGliUmVjb3JkIHJlY29yZCkgewotCQlmUmVnaW9uID0gcmVnaW9uOwotCQlmVGFnbGliUmVjb3JkID0gcmVjb3JkOwotCX0KLQotCXByaXZhdGUgSUh5cGVybGluayBnZXRIeXBlcmxpbmsoKSB7Ci0JCWlmIChmSHlwZXJsaW5rID09IG51bGwgJiYgZlRhZ2xpYlJlY29yZCAhPSBudWxsKSB7Ci0JCQlzd2l0Y2ggKGZUYWdsaWJSZWNvcmQuZ2V0UmVjb3JkVHlwZSgpKSB7Ci0JCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5KQVIpIDogewotCQkJCQlJSmFyUmVjb3JkIHJlY29yZCA9IChJSmFyUmVjb3JkKSBmVGFnbGliUmVjb3JkOwotCQkJCQlmSHlwZXJsaW5rID0gbmV3IFRhZ2xpYkphckh5cGVybGluayhmUmVnaW9uLCByZWNvcmQuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIChJVGFnbGliUmVjb3JkLlVSTCkgOiB7Ci0JCQkJCUlVUkxSZWNvcmQgcmVjb3JkID0gKElVUkxSZWNvcmQpIGZUYWdsaWJSZWNvcmQ7Ci0JCQkJCWZIeXBlcmxpbmsgPSBuZXcgVVJMRmlsZUh5cGVybGluayhmUmVnaW9uLCByZWNvcmQuZ2V0VVJMKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZkh5cGVybGluazsKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCUlSZWdpb24gcmVnaW9uID0gbnVsbDsKLQotCQlJSHlwZXJsaW5rIGxpbmsgPSBnZXRIeXBlcmxpbmsoKTsKLQkJaWYgKGxpbmsgIT0gbnVsbCkgewotCQkJcmVnaW9uID0gbGluay5nZXRIeXBlcmxpbmtSZWdpb24oKTsKLQkJfQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRUeXBlTGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQlyZXR1cm4gSlNQVUlNZXNzYWdlcy5UTERIeXBlcmxpbmtfaHlwZXJsaW5rVGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlJSHlwZXJsaW5rIGxpbmsgPSBnZXRIeXBlcmxpbmsoKTsKLQkJaWYgKGxpbmsgIT0gbnVsbCkgewotCQkJbGluay5vcGVuKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1VSTEZpbGVIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVVJMRmlsZUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjhkNWE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVVJMRmlsZUh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkphclV0aWxpdGllczsKLQotLyoqCi0gKiBIeXBlcmxpbmsgZm9yIFVSTHMgKG9wZW5zIGluIHJlYWQtb25seSBtb2RlKQotICovCi1jbGFzcyBVUkxGaWxlSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCi0Jc3RhdGljIGNsYXNzIFN0b3JhZ2VFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElTdG9yYWdlRWRpdG9ySW5wdXQgewotCQlJU3RvcmFnZSBmU3RvcmFnZSA9IG51bGw7Ci0KLQkJU3RvcmFnZUVkaXRvcklucHV0KElTdG9yYWdlIHN0b3JhZ2UpIHsKLQkJCWZTdG9yYWdlID0gc3RvcmFnZTsKLQkJfQotCi0JCXB1YmxpYyBJU3RvcmFnZSBnZXRTdG9yYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJcmV0dXJuIGZTdG9yYWdlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQkJcmV0dXJuIGZTdG9yYWdlICE9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJCXJldHVybiBmU3RvcmFnZS5lcXVhbHMoKChTdG9yYWdlRWRpdG9ySW5wdXQpIG9iaikuZlN0b3JhZ2UpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotCQl9Ci0KLQkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBmU3RvcmFnZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJCXJldHVybiBmU3RvcmFnZS5nZXRGdWxsUGF0aCgpICE9IG51bGwgPyBmU3RvcmFnZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkgOiBmU3RvcmFnZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVVJMU3RvcmFnZSBpbXBsZW1lbnRzIElTdG9yYWdlIHsKLQkJVVJMIGZVUkwgPSBudWxsOwotCi0JCVVSTFN0b3JhZ2UoVVJMIHVybCkgewotCQkJZlVSTCA9IHVybDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVVJMU3RvcmFnZSkgewotCQkJCXJldHVybiBmVVJMLmVxdWFscygoKFVSTFN0b3JhZ2UpIG9iaikuZlVSTCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7Ci0JCX0KLQotCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzdHJlYW0gPSBKYXJVdGlsaXRpZXMuZ2V0SW5wdXRTdHJlYW0oZlVSTCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5FUlJPUiwgZlVSTC50b1N0cmluZygpLCBlKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RyZWFtOwotCQl9Ci0KLQkJcHVibGljIElQYXRoIGdldEZ1bGxQYXRoKCkgewotCQkJcmV0dXJuIG5ldyBQYXRoKGZVUkwudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmV3IFBhdGgoZlVSTC5nZXRGaWxlKCkpLmxhc3RTZWdtZW50KCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgSVJlZ2lvbiBmUmVnaW9uOwotCXByaXZhdGUgVVJMIGZVUkw7Ci0KLQlwdWJsaWMgVVJMRmlsZUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgVVJMIHVybCkgewotCQlmUmVnaW9uID0gcmVnaW9uOwotCQlmVVJMID0gdXJsOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZSZWdpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldFR5cGVMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCVN0cmluZyBwYXRoID0gZlVSTC5nZXRQYXRoKCk7Ci0JCWlmIChwYXRoLmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiBOTFMuYmluZChKU1BVSU1lc3NhZ2VzLk9wZW4sIG5ldyBQYXRoKHBhdGgpLmxhc3RTZWdtZW50KCkpOwotCQlyZXR1cm4gTkxTLmJpbmQoSlNQVUlNZXNzYWdlcy5UTERIeXBlcmxpbmtfaHlwZXJsaW5rVGV4dCwgZlVSTC50b1N0cmluZygpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjb3BlbigpCi0JICovCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJaWYgKGZVUkwgIT0gbnVsbCkgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IFN0b3JhZ2VFZGl0b3JJbnB1dChuZXcgVVJMU3RvcmFnZShmVVJMKSk7Ci0JCQlJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCQkJdHJ5IHsKLQkJCQlkZXNjcmlwdG9yID0gSURFLmdldEVkaXRvckRlc2NyaXB0b3IoaW5wdXQuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgaW5wdXQsIGRlc2NyaXB0b3IuZ2V0SWQoKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1VSTEZpbGVSZWdpb25IeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVVJMRmlsZVJlZ2lvbkh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjM4M2M5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVVJMRmlsZVJlZ2lvbkh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0vKioKLSAqIEh5cGVybGluayBmb3IgVVJMcyAob3BlbnMgaW4gcmVhZC1vbmx5IG1vZGUpCi0gKi8KLWNsYXNzIFVSTEZpbGVSZWdpb25IeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0KLQlzdGF0aWMgY2xhc3MgU3RvcmFnZUVkaXRvcklucHV0IGltcGxlbWVudHMgSVN0b3JhZ2VFZGl0b3JJbnB1dCB7Ci0JCUlTdG9yYWdlIGZTdG9yYWdlID0gbnVsbDsKLQotCQlTdG9yYWdlRWRpdG9ySW5wdXQoSVN0b3JhZ2Ugc3RvcmFnZSkgewotCQkJZlN0b3JhZ2UgPSBzdG9yYWdlOwotCQl9Ci0KLQkJcHVibGljIElTdG9yYWdlIGdldFN0b3JhZ2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gZlN0b3JhZ2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCQlyZXR1cm4gZlN0b3JhZ2UgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQkJcmV0dXJuIGZTdG9yYWdlLmVxdWFscygoKFN0b3JhZ2VFZGl0b3JJbnB1dCkgb2JqKS5mU3RvcmFnZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIGZTdG9yYWdlLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQkJcmV0dXJuIGZTdG9yYWdlLmdldEZ1bGxQYXRoKCkgIT0gbnVsbCA/IGZTdG9yYWdlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSA6IGZTdG9yYWdlLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBVUkxTdG9yYWdlIGltcGxlbWVudHMgSVN0b3JhZ2UgewotCQlVUkwgZlVSTCA9IG51bGw7Ci0KLQkJVVJMU3RvcmFnZShVUkwgdXJsKSB7Ci0JCQlmVVJMID0gdXJsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBVUkxTdG9yYWdlKSB7Ci0JCQkJcmV0dXJuIGZVUkwuZXF1YWxzKCgoVVJMU3RvcmFnZSkgb2JqKS5mVVJMKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKLQkJfQotCi0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXN0cmVhbSA9IGZVUkwub3BlblN0cmVhbSgpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuRVJST1IsIGZVUkwudG9TdHJpbmcoKSwgZSkpOwotCQkJfQotCQkJcmV0dXJuIHN0cmVhbTsKLQkJfQotCi0JCXB1YmxpYyBJUGF0aCBnZXRGdWxsUGF0aCgpIHsKLQkJCXJldHVybiBuZXcgUGF0aChmVVJMLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5ldyBQYXRoKGZVUkwuZ2V0RmlsZSgpKS5sYXN0U2VnbWVudCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQlwcml2YXRlIFVSTCBmVVJMOwotCXByaXZhdGUgaW50IGZTZWFyY2hUeXBlOwotCXByaXZhdGUgU3RyaW5nIGZTZWFyY2hOYW1lOwotCi0JcHVibGljIFVSTEZpbGVSZWdpb25IeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIGludCBzZWFyY2hUeXBlLCBTdHJpbmcgc2VhcmNoTmFtZSwgVVJMIHVybCkgewotCQlmUmVnaW9uID0gcmVnaW9uOwotCQlmVVJMID0gdXJsOwotCQlmU2VhcmNoTmFtZSA9IHNlYXJjaE5hbWU7Ci0JCWZTZWFyY2hUeXBlID0gc2VhcmNoVHlwZTsKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmUmVnaW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRUeXBlTGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQlyZXR1cm4gTkxTLmJpbmQoSlNQVUlNZXNzYWdlcy5PcGVuLCBmVVJMLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNvcGVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlpZiAoZlVSTCAhPSBudWxsKSB7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgU3RvcmFnZUVkaXRvcklucHV0KG5ldyBVUkxTdG9yYWdlKGZVUkwpKTsKLQkJCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0JCQl0cnkgewotCQkJCWRlc2NyaXB0b3IgPSBJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcihpbnB1dC5nZXROYW1lKCksIHRydWUpOwotCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlJRWRpdG9yUGFydCBvcGVuZWRFZGl0b3IgPSBJREUub3BlbkVkaXRvcihwYWdlLCBpbnB1dCwgZGVzY3JpcHRvci5nZXRJZCgpLCB0cnVlKTsKLQkJCQkJSVJlZ2lvbiBkZWZpbml0aW9uUmVnaW9uID0gZmluZERlZmluaXRpb25SZWdpb24obmV3IFVSTFN0b3JhZ2UoZlVSTCkpOwotCQkJCQlpZiAoZGVmaW5pdGlvblJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlvcGVuZWRFZGl0b3IuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKG5ldyBUZXh0U2VsZWN0aW9uKGRlZmluaXRpb25SZWdpb24uZ2V0T2Zmc2V0KCksIGRlZmluaXRpb25SZWdpb24uZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVJlZ2lvbiBmaW5kRGVmaW5pdGlvblJlZ2lvbihJU3RvcmFnZSBzdG9yYWdlKSB7Ci0JCUlSZWdpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChzdG9yYWdlLmdldE5hbWUoKSwgc3RvcmFnZS5nZXRDb250ZW50cygpLCBudWxsKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCWRlZmluaXRpb24gPSBUYWdsaWJIeXBlcmxpbmtEZXRlY3Rvci5maW5kRGVmaW5pdGlvbigoSURPTU1vZGVsKSBtb2RlbCwgZlNlYXJjaE5hbWUsIGZTZWFyY2hUeXBlKTsKLQkJCX0KLQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiBkZWZpbml0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvV29ya3NwYWNlRmlsZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYjI1NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciBmaWxlcyB3aXRoaW4gdGhlIHdvcmtzcGFjZS4gKEFzIGxvbmcgYXMgdGhlcmUgaXMgYW4gSUZpbGUsCi0gKiB0aGlzIGNhbiBiZSB1c2VkKSBPcGVucyB0aGUgZGVmYXVsdCBlZGl0b3IgZm9yIHRoZSBmaWxlLgotICovCi1jbGFzcyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCi0JcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0JcHJpdmF0ZSBJRmlsZSBmRmlsZTsKLQlwcml2YXRlIElSZWdpb24gZkhpZ2hsaWdodFJhbmdlOwotCi0JcHVibGljIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElGaWxlIGZpbGUpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZkZpbGUgPSBmaWxlOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBJRmlsZSBmaWxlLCBJUmVnaW9uIHJhbmdlKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZGaWxlID0gZmlsZTsKLQkJZkhpZ2hsaWdodFJhbmdlID0gcmFuZ2U7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZlJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJU3RyaW5nIHBhdGggPSBmRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCWlmIChwYXRoLmxlbmd0aCgpID4gNjApIHsKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygwLCAyNSkgKyAiLi4uIiArIHBhdGguc3Vic3RyaW5nKHBhdGgubGVuZ3RoKCkgLSAyNSwgcGF0aC5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIE5MUy5iaW5kKEpTUFVJTWVzc2FnZXMuT3BlbiwgcGF0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJaWYgKGZGaWxlICE9IG51bGwgJiYgZkZpbGUuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IElERS5vcGVuRWRpdG9yKHBhZ2UsIGZGaWxlLCB0cnVlKTsKLQkJCQkvLyBoaWdobGlnaHQgcmFuZ2UgaW4gZWRpdG9yIGlmIHBvc3NpYmxlCi0JCQkJaWYgKGZIaWdobGlnaHRSYW5nZSAhPSBudWxsICYmIGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQkJCSgoSVRleHRFZGl0b3IpIGVkaXRvcikuc2V0SGlnaGxpZ2h0UmFuZ2UoZkhpZ2hsaWdodFJhbmdlLmdldE9mZnNldCgpLCBmSGlnaGxpZ2h0UmFuZ2UuZ2V0TGVuZ3RoKCksIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBwaWUuZ2V0TWVzc2FnZSgpLCBwaWUpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1hNTEphdmFIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9YTUxKYXZhSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5MGRmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1hNTEphdmFIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRMYWJlbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5BYnN0cmFjdEh5cGVybGlua0RldGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsNCi0NCi0vKioNCi0gKiBEZXRlY3RzIGh5cGVyLWxpbmtzIGluIFRhZyBMaWJyYXJ5IERlc2NyaXB0b3JzDQotICovDQotcHVibGljIGNsYXNzIFhNTEphdmFIeXBlcmxpbmtEZXRlY3RvciBleHRlbmRzIEFic3RyYWN0SHlwZXJsaW5rRGV0ZWN0b3Igew0KLQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0ZJTEVfUFJPVE9DT0wgPSAiamFyOmZpbGU6IjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQmFzZWQgb24gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmphdmFlZGl0b3IuSmF2YUVsZW1lbnRIeXBlcmxpbmsNCi0JICovDQotCXN0YXRpYyBjbGFzcyBKYXZhRWxlbWVudEh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgew0KLQ0KLQkJcHJpdmF0ZSBmaW5hbCBJSmF2YUVsZW1lbnQgZkVsZW1lbnQ7DQotCQlwcml2YXRlIGZpbmFsIElSZWdpb24gZlJlZ2lvbjsNCi0NCi0NCi0JCS8qKg0KLQkJICogQ3JlYXRlcyBhIG5ldyBKYXZhIGVsZW1lbnQgaHlwZXJsaW5rLg0KLQkJICogDQotCQkgKiBAcGFyYW0gcmVnaW9uDQotCQkgKiAgICAgICAgICAgIHRoZSByZWdpb24gb2YgdGhlIGxpbmsNCi0JCSAqIEBwYXJhbSBlbGVtZW50DQotCQkgKiAgICAgICAgICAgIHRoZSBqYXZhIGVsZW1lbnQgdG8gb3Blbg0KLQkJICogQHBhcmFtIHF1YWxpZnkNCi0JCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGh5cGVyLWxpbmsgdGV4dCBzaG91bGQgc2hvdyBhDQotCQkgKiAgICAgICAgICAgIHF1YWxpZmllZCBuYW1lIGZvciBlbGVtZW50Lg0KLQkJICovDQotCQlKYXZhRWxlbWVudEh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgSUphdmFFbGVtZW50IGVsZW1lbnQpIHsNCi0JCQlmUmVnaW9uID0gcmVnaW9uOw0KLQkJCWZFbGVtZW50ID0gZWxlbWVudDsNCi0JCX0NCi0NCi0JCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsNCi0JCQlyZXR1cm4gZlJlZ2lvbjsNCi0JCX0NCi0NCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsNCi0JCQlTdHJpbmcgZWxlbWVudExhYmVsID0gSmF2YUVsZW1lbnRMYWJlbHMuZ2V0RWxlbWVudExhYmVsKGZFbGVtZW50LCBKYXZhRWxlbWVudExhYmVscy5BTExfUE9TVF9RVUFMSUZJRUQpOw0KLQkJCXJldHVybiBOTFMuYmluZChKU1BVSU1lc3NhZ2VzLk9wZW4sIGVsZW1lbnRMYWJlbCk7DQotCQl9DQotDQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0NCi0JCXB1YmxpYyB2b2lkIG9wZW4oKSB7DQotCQkJdHJ5IHsNCi0JCQkJSmF2YVVJLm9wZW5JbkVkaXRvcihmRWxlbWVudCk7DQotCQkJfQ0KLQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7DQotCQkJfQ0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQ0KLQlwcml2YXRlIElIeXBlcmxpbmsgY3JlYXRlSHlwZXJsaW5rKFN0cmluZyBlbGVtZW50TmFtZSwgSVJlZ2lvbiByZWdpb24sIElEb2N1bWVudCBkb2N1bWVudCkgew0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7DQotCQl0cnkgew0KLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7DQotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsNCi0JCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOw0KLQkJCQkvLyBVUkwgZml4dXAgZnJvbSB0aGUgdGFnbGliIGluZGV4IHJlY29yZA0KLQkJCQlpZiAoYmFzZUxvY2F0aW9uLnN0YXJ0c1dpdGgoImphcjovZmlsZToiKSkgeyAvLyROT04tTkxTLTEkDQotCQkJCQliYXNlTG9jYXRpb24gPSBTdHJpbmdVdGlscy5yZXBsYWNlKGJhc2VMb2NhdGlvbiwgImphcjovIiwgImphcjoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJCX0NCi0JCQkJLyoNCi0JCQkJICogSGFuZGxlIG9wZW5lZCBUTEQgZmlsZXMgZnJvbSBKQVJzIG9uIHRoZSBKYXZhIEJ1aWxkIFBhdGggYnkNCi0JCQkJICogZmluZGluZyBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBmb3IgdGhlIHNhbWUgLmphciBmaWxlIGFuZA0KLQkJCQkgKiBvcGVuaW5nIHRoZSBjbGFzcyBmcm9tIHRoZXJlLiBOb3RlIHRoYXQgdGhpcyBtaWdodCBiZSBmcm9tDQotCQkJCSAqIGEgZGlmZmVyZW50IEphdmEgcHJvamVjdCdzIGJ1aWxkIHBhdGggdGhhbiB0aGUgVExELg0KLQkJCQkgKi8NCi0JCQkJaWYgKGJhc2VMb2NhdGlvbi5zdGFydHNXaXRoKEpBUl9GSUxFX1BST1RPQ09MKSAmJiBiYXNlTG9jYXRpb24uaW5kZXhPZignIScpID4gSkFSX0ZJTEVfUFJPVE9DT0wubGVuZ3RoKCkpIHsNCi0JCQkJCVN0cmluZyBiYXNlRmlsZSA9IGJhc2VMb2NhdGlvbi5zdWJzdHJpbmcoSkFSX0ZJTEVfUFJPVE9DT0wubGVuZ3RoKCksIGJhc2VMb2NhdGlvbi5pbmRleE9mKCchJykpOw0KLQkJCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aChiYXNlRmlsZSk7DQotCQkJCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOw0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgew0KLQkJCQkJCXRyeSB7DQotCQkJCQkJCWlmIChwcm9qZWN0c1tpXS5pc0FjY2Vzc2libGUoKSAmJiBwcm9qZWN0c1tpXS5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgew0KLQkJCQkJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3RzW2ldKTsNCi0JCQkJCQkJCWlmIChqYXZhUHJvamVjdC5leGlzdHMoKSkgew0KLQkJCQkJCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBqYXZhUHJvamVjdC5maW5kUGFja2FnZUZyYWdtZW50Um9vdChiYXNlUGF0aCk7DQotCQkJCQkJCQkJaWYgKHJvb3QgIT0gbnVsbCkgew0KLQkJCQkJCQkJCQlyZXR1cm4gY3JlYXRlSmF2YUVsZW1lbnRIeXBlcmxpbmsoamF2YVByb2plY3QsIGVsZW1lbnROYW1lLCByZWdpb24pOw0KLQkJCQkJCQkJCX0NCi0JCQkJCQkJCX0NCi0JCQkJCQkJfQ0KLQkJCQkJCX0NCi0JCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOw0KLQkJCQkJaWYgKGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgew0KLQkJCQkJCXJldHVybiBjcmVhdGVKYXZhRWxlbWVudEh5cGVybGluayhKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGJhc2VQYXRoLnNlZ21lbnQoMCkpKSwgZWxlbWVudE5hbWUsIHJlZ2lvbik7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotDQotCQl9DQotCQlmaW5hbGx5IHsNCi0JCQlpZiAobW9kZWwgIT0gbnVsbCkNCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwcml2YXRlIElIeXBlcmxpbmsgY3JlYXRlSmF2YUVsZW1lbnRIeXBlcmxpbmsoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgZWxlbWVudE5hbWUsIElSZWdpb24gcmVnaW9uKSB7DQotCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCAmJiBqYXZhUHJvamVjdC5leGlzdHMoKSkgew0KLQkJCXRyeSB7DQotCQkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gamF2YVByb2plY3QuZmluZFR5cGUoZWxlbWVudE5hbWUpOw0KLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZXhpc3RzKCkpIHsNCi0JCQkJCXJldHVybiBuZXcgSmF2YUVsZW1lbnRIeXBlcmxpbmsocmVnaW9uLCBlbGVtZW50KTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsNCi0JCQkJLy8gYmFkIG5hbWUsIG5vIGxpbmsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlDQotCSAqIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3RvciNkZXRlY3RIeXBlcmxpbmtzDQotCSAqIChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24sDQotCSAqIGJvb2xlYW4pDQotCSAqLw0KLQlwdWJsaWMgSUh5cGVybGlua1tdIGRldGVjdEh5cGVybGlua3MoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiByZWdpb24sIGJvb2xlYW4gY2FuU2hvd011bHRpcGxlSHlwZXJsaW5rcykgew0KLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHRleHRWaWV3ZXIgIT0gbnVsbCkgew0KLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsNCi0JCQkvLyBmaW5kIGh5cGVybGluayByYW5nZSBmb3IgSmF2YSBlbGVtZW50DQotCQkJSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24gPSByZWdpb24uZ2V0TGVuZ3RoKCkgPiAwID8gcmVnaW9uIDogc2VsZWN0UXVhbGlmaWVkTmFtZShkb2N1bWVudCwgcmVnaW9uLmdldE9mZnNldCgpKTsNCi0JCQlTdHJpbmcgbmFtZSA9IG51bGw7DQotCQkJdHJ5IHsNCi0JCQkJbmFtZSA9IGRvY3VtZW50LmdldChoeXBlcmxpbmtSZWdpb24uZ2V0T2Zmc2V0KCksIGh5cGVybGlua1JlZ2lvbi5nZXRMZW5ndGgoKSkudHJpbSgpOw0KLQkJCX0NCi0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgew0KLQkJCX0NCi0JCQlpZiAobmFtZSAhPSBudWxsKSB7DQotCQkJCUlIeXBlcmxpbmsgbGluayA9IGNyZWF0ZUh5cGVybGluayhuYW1lLCBoeXBlcmxpbmtSZWdpb24sIGRvY3VtZW50KTsNCi0JCQkJaWYgKGxpbmsgIT0gbnVsbCkNCi0JCQkJCXJldHVybiBuZXcgSUh5cGVybGlua1tde2xpbmt9Ow0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBKYXZhIGFsd2F5cyBzZWxlY3RzIHdvcmQgd2hlbiBkZWZpbmluZyByZWdpb24NCi0JICogDQotCSAqIEBwYXJhbSBkb2N1bWVudA0KLQkgKiBAcGFyYW0gYW5jaG9yDQotCSAqIEByZXR1cm4gSVJlZ2lvbg0KLQkgKi8NCi0JcHJpdmF0ZSBJUmVnaW9uIHNlbGVjdFF1YWxpZmllZE5hbWUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgYW5jaG9yKSB7DQotDQotCQl0cnkgew0KLQkJCWludCBvZmZzZXQgPSBhbmNob3I7DQotCQkJY2hhciBjOw0KLQ0KLQkJCXdoaWxlIChvZmZzZXQgPj0gMCkgew0KLQkJCQljID0gZG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQpOw0KLQkJCQlpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSAmJiBjICE9ICcuJykNCi0JCQkJCWJyZWFrOw0KLQkJCQktLW9mZnNldDsNCi0JCQl9DQotDQotCQkJaW50IHN0YXJ0ID0gb2Zmc2V0Ow0KLQ0KLQkJCW9mZnNldCA9IGFuY2hvcjsNCi0JCQlpbnQgbGVuZ3RoID0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCk7DQotDQotCQkJd2hpbGUgKG9mZnNldCA8IGxlbmd0aCkgew0KLQkJCQljID0gZG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQpOw0KLQkJCQlpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSAmJiBjICE9ICcuJykNCi0JCQkJCWJyZWFrOw0KLQkJCQkrK29mZnNldDsNCi0JCQl9DQotDQotCQkJaW50IGVuZCA9IG9mZnNldDsNCi0NCi0JCQlpZiAoc3RhcnQgPT0gZW5kKQ0KLQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihzdGFydCwgMCk7DQotDQotCQkJcmV0dXJuIG5ldyBSZWdpb24oc3RhcnQgKyAxLCBlbmQgLSBzdGFydCAtIDEpOw0KLQ0KLQkJfQ0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNTdlZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0Q2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdEdyb3VwOwotCi0vKioKLSAqIDxwPkFmdGVyIGEgc2VhcmNoIGlzIHJ1biB3aXRoIHRoaXMge0BsaW5rIFNlYXJjaFJlcXVlc3Rvcn0ge0BsaW5rICNnZXRDaGFuZ2VzKFJlZmFjdG9yaW5nUGFydGljaXBhbnQpfQotICogY2FuIGJlIGNhbGxlZCB0byBnZXQgYW55IG5ldyB7QGxpbmsgQ2hhbmdlfXMgdGhhdCBuZWVkIHRvIGJlIGNyZWF0ZWQgYXMgYSByZXN1bHQgb2YgdGhlIHNlYXJjaC4gIElmCi0gKiB7QGxpbmsgQ2hhbmdlfXMgYXJlIGFscmVhZHkgZXhpc3RpbmcgZm9yIHRoZSBkb2N1bWVudHMgZm91bmQgdGhlbiBuZXcge0BsaW5rIENoYW5nZX1zIHdpbGwgbm90IGJlCi0gKiBjcmVhdGVkIGZvciB0aGVtLCBidXQgdGhlIG5lZWRlZCB7QGxpbmsgVGV4dEVkaXR9cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBleGlzdGluZyB7QGxpbmsgQ2hhbmdlfXMuPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciBleHRlbmRzIFNlYXJjaFJlcXVlc3RvciB7Ci0JLyoqIFRoZSB0eXBlIGJlaW5nIHJlbmFtZWQgKHRoZSBvbGQgdHlwZSkqLwotCUlKYXZhRWxlbWVudCBmRWxlbWVudCA9IG51bGw7Ci0JLyoqIFRoZSBuZXcgbmFtZSBvZiB0aGUgdHlwZSBiZWluZyByZW5hbWVkKi8KLQlwcml2YXRlIFN0cmluZyBmTmV3TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JLyoqIG1hcHMgYSBKU1BTZWFyY2hEb2N1bWVudCBwYXRoIC0+IE11bHRpVGV4dEVkaXQgZm9yIHRoZSBqYXZhIGZpbGUqLwotCXByaXZhdGUgSGFzaE1hcCBmU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcCA9IG51bGw7Ci0JCi0JcHVibGljIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IoSUphdmFFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMuZk5ld05hbWUgPSBuZXdOYW1lOwotCQl0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5mU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCQotCXB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbmV3IG5hbWUgZm9yIHRoZSBUeXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROZXdOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5mTmV3TmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2FjY2VwdFNlYXJjaE1hdGNoKG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCVN0cmluZyBtYXRjaERvY3VtZW50UGF0aCA9IGphdmFNYXRjaC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJU2VhcmNoRG9jdW1lbnQgc2VhcmNoRG9jID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFNlYXJjaERvY3VtZW50KG1hdGNoRG9jdW1lbnRQYXRoKTsKLQkKLQkJaWYgKHNlYXJjaERvYyAhPSBudWxsICYmIHNlYXJjaERvYyBpbnN0YW5jZW9mIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKSB7Ci0JCi0JCQlTdHJpbmcgcmVuYW1lVGV4dCA9IGdldFJlbmFtZVRleHQoKEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKXNlYXJjaERvYywgamF2YU1hdGNoKTsKLQkJCQotCQkJLy9pZiByZW5hbWUgdGV4dCBpcyBudWxsIHRoZW4gZG9uJ3QgY3JlYXRlIGFuIGVkaXQgZm9yIGl0Ci0JCQlpZihyZW5hbWVUZXh0ICE9IG51bGwpIHsKLQkJCQkvLyBhZGQgaXQgZm9yIHRoZSBjb3JyZWN0IGRvY3VtZW50Ci0JCQkJYWRkSmF2YUVkaXQoc2VhcmNoRG9jLmdldFBhdGgoKSwgbmV3IFJlcGxhY2VFZGl0KGphdmFNYXRjaC5nZXRPZmZzZXQoKSwgamF2YU1hdGNoLmdldExlbmd0aCgpLCByZW5hbWVUZXh0KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNlYXJjaERvYwotCSAqIEByZXR1cm4gdGhlIHJlbmFtZSB0ZXh0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGVkaXQgc2hvdWxkIGJlIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiBtYXRjaC4KLQkgKiBTdWNoIGEgY2FzZSB3b3VsZCBiZSBhIG1hdGNoIHdoZXJlIG5vdGhpbmcgbmVlZHMgdG8gYmUgZWRpdGVkLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVuYW1lVGV4dChKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBzZWFyY2hEb2MsIFNlYXJjaE1hdGNoIGphdmFNYXRjaCkgewotCQlyZXR1cm4gZ2V0TmV3TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdG8gdGhlIG11bHRpIGVkaXQgZm9yIGEgZ2l2ZSBqYXZhIGRvY3VtZW50LgotCSAqIEBwYXJhbSBqYXZhRG9jdW1lbnQKLQkgKiBAcGFyYW0gamF2YUVkaXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkSmF2YUVkaXQoU3RyaW5nIHNlYXJjaERvY1BhdGgsIFJlcGxhY2VFZGl0IGphdmFFZGl0KSB7Ci0JCQotCQlPYmplY3QgbyA9IHRoaXMuZlNlYXJjaERvY1BhdGgySmF2YUVkaXRNYXAuZ2V0KHNlYXJjaERvY1BhdGgpOwotCQlpZihvICE9IG51bGwpIHsKLQotCQkJTXVsdGlUZXh0RWRpdCBtdWx0aSA9IChNdWx0aVRleHRFZGl0KW87Ci0JCQltdWx0aS5hZGRDaGlsZChqYXZhRWRpdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB1c2UgYSBtdWx0aSBlZGl0IHNvIGRvYyBwb3NpdGlvbiBvZmZzZXRzIGdldCB1cGRhdGVkIGF1dG9tYXRpY2FsbHkKLQkJCS8vIHdoZW4gYWRkaW5nIG11bHRpcGxlIGNoaWxkIGVkaXRzCi0JCQlNdWx0aVRleHRFZGl0IG11bHRpID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCW11bHRpLmFkZENoaWxkKGphdmFFZGl0KTsKLQkJCXRoaXMuZlNlYXJjaERvY1BhdGgySmF2YUVkaXRNYXAucHV0KHNlYXJjaERvY1BhdGgsIG11bHRpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD5UaGlzIGZ1bmN0aW9uIGlzIG5vdCBzYWZlIGJlY2F1c2UgaXQgZG9lcyBub3QgY2hlY2sgZm9yIGV4aXN0aW5nIHtAbGluayBDaGFuZ2V9cyB0aGF0Ci0JICogbmV3IHtAbGluayBDaGFuZ2V9cyBjcmVhdGVkIGJ5IHRoaXMgbWV0aG9kIG1heSBjb25mbGljdCB3aXRoLiAgVGhlc2UgY29uZmxpY3RzIGNhbgotCSAqIGNhdXNlIGluZGV0ZXJtaW5hdGUgcmVzdWx0cyB3aGVuIGFwcGxpZWQgdG8gZG9jdW1lbnRzLiAgTG9uZyBzdG9yeSBzaG9ydCwgZG9uJ3QKLQkgKiB1c2UgdGhpcyBtZXRob2QgYW55IG1vcmUuPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYWxsIEpTUCBjaGFuZ2VzIGZvciB0aGUgc2VhcmNoIG1hdGNoZXMgZm9yIHRoZSBnaXZlbiBUeXBlLCB0aGV5IG1heSBjb25mbGljdAotCSAqIHdpdGggYWxyZWFkeSBleGlzdGluZyB7QGxpbmsgQ2hhbmdlfXMKLQkgKiAKLQkgKiBAc2VlICNnZXRDaGFuZ2VzKFJlZmFjdG9yaW5nUGFydGljaXBhbnQpCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlW10gZ2V0Q2hhbmdlcygpIHsKLQkJCi0JCUpTUFNlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJTGlzdCBjaGFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBrZXlzID0gZlNlYXJjaERvY1BhdGgySmF2YUVkaXRNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIHNlYXJjaERvY1BhdGggPSBudWxsOwotCQlTZWFyY2hEb2N1bWVudCBkZWxlZ2F0ZSA9IG51bGw7Ci0JCQotCQl3aGlsZShrZXlzLmhhc05leHQoKSkgewotCQkJLy8gY3JlYXRlIG9uIHRoZSBmbHkKLQkJCXNlYXJjaERvY1BhdGggPSAoU3RyaW5nKWtleXMubmV4dCgpOwotCQkJTXVsdGlUZXh0RWRpdCBqYXZhRWRpdCA9IChNdWx0aVRleHRFZGl0KWZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwLmdldChzZWFyY2hEb2NQYXRoKTsKLQkJCWRlbGVnYXRlID0gc3VwcG9ydC5nZXRTZWFyY2hEb2N1bWVudChzZWFyY2hEb2NQYXRoKTsKLQkJCQotCQkJaWYoZGVsZWdhdGUgIT0gbnVsbCAmJiBkZWxlZ2F0ZSBpbnN0YW5jZW9mIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKSB7Ci0JCQkJSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgamF2YURlbGVnYXRlID0gKEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKWRlbGVnYXRlOwotCQkJCWNoYW5nZXMuYWRkKGNyZWF0ZUNoYW5nZShqYXZhRGVsZWdhdGUsIGphdmFEZWxlZ2F0ZS5nZXRKc3BUcmFuc2xhdGlvbigpLmdldEpzcEVkaXQoamF2YUVkaXQpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChDaGFuZ2VbXSljaGFuZ2VzLnRvQXJyYXkobmV3IENoYW5nZVtjaGFuZ2VzLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIG5ldyB7QGxpbmsgQ2hhbmdlfXMgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiB0aGlzIHtAbGluayBTZWFyY2hSZXF1ZXN0b3J9LgotCSAqIEFueSBleGlzdGluZyB7QGxpbmsgVGV4dENoYW5nZX1zIHRoYXQgaGFkIG5ldyBlZGl0cyBhZGRlZCB0byB0aGVtIHdpbGwgbm90IGJlCi0JICogcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIHBhcnRpY2lwYW50IHtAbGluayBSZWZhY3RvcmluZ1BhcnRpY2lwYW50fSB0byBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIGFscmVhZHkgZXhpc3RpbmcKLQkgKiB7QGxpbmsgVGV4dENoYW5nZX1zIGZvciB0aGUgZG9jdW1lbnRzIHRoYXQgdGhpcyB7QGxpbmsgU2VhcmNoUmVxdWVzdG9yfSBmb3VuZC4KLQkgKiBJZiBleGlzdGluZwotCSAqIHtAbGluayBUZXh0Q2hhbmdlfXMgYXJlIGZvdW5kIHRoZW4gdGhleSB3aWxsIGJlIHVzZWQgZm9yIGFueSBuZXcgZWRpdHMsIGVsc2UgbmV3IHtAbGluayBUZXh0Q2hhbmdlfXMKLQkgKiB3aWxsIGJlIGNyZWF0ZWQuCi0JICogCi0JICogQHJldHVybiBBbnkgbmV3IHtAbGluayBUZXh0Q2hhbmdlfXMgY3JlYXRlZCBieSB0aGlzIHtAbGluayBTZWFyY2hSZXF1ZXN0b3J9LiAgSWYgZWRpdHMgd2VyZQotCSAqIGFkZGVkIHRvIGV4aXN0aW5nIHtAbGluayBUZXh0Q2hhbmdlfXMgdGhlbiB0aG9zZSBleGlzdGluZyB7QGxpbmsgVGV4dENoYW5nZX1zIHdpbGwgbm90IGJlCi0JICogcmV0dXJuZWQgaW4gdGhpcyBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQ2hhbmdlW10gZ2V0Q2hhbmdlcyhSZWZhY3RvcmluZ1BhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7Ci0JCQotCQlKU1BTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCUxpc3QgY2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3Iga2V5cyA9IGZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzZWFyY2hEb2NQYXRoID0gbnVsbDsKLQkJU2VhcmNoRG9jdW1lbnQgZGVsZWdhdGUgPSBudWxsOwotCQkKLQkJd2hpbGUoa2V5cy5oYXNOZXh0KCkpIHsKLQkJCS8vIGNyZWF0ZSBvbiB0aGUgZmx5Ci0JCQlzZWFyY2hEb2NQYXRoID0gKFN0cmluZylrZXlzLm5leHQoKTsKLQkJCU11bHRpVGV4dEVkaXQgamF2YUVkaXQgPSAoTXVsdGlUZXh0RWRpdClmU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcC5nZXQoc2VhcmNoRG9jUGF0aCk7Ci0JCQlkZWxlZ2F0ZSA9IHN1cHBvcnQuZ2V0U2VhcmNoRG9jdW1lbnQoc2VhcmNoRG9jUGF0aCk7Ci0JCQkKLQkJCWlmKGRlbGVnYXRlICE9IG51bGwgJiYgZGVsZWdhdGUgaW5zdGFuY2VvZiBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkgewotCQkJCUphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlIGphdmFEZWxlZ2F0ZSA9IChKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSlkZWxlZ2F0ZTsKLQkJCQlDaGFuZ2UgY2hhbmdlID0gY3JlYXRlQ2hhbmdlKGphdmFEZWxlZ2F0ZSwgamF2YURlbGVnYXRlLmdldEpzcFRyYW5zbGF0aW9uKCkuZ2V0SnNwRWRpdChqYXZhRWRpdCksIHBhcnRpY2lwYW50KTsKLQkJCQljaGFuZ2VzLmFkZChjaGFuZ2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoQ2hhbmdlW10pY2hhbmdlcy50b0FycmF5KG5ldyBDaGFuZ2VbY2hhbmdlcy5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+VGhpcyBtZXRob2QgaXMgbm90IHNhZmUgYmVjYXVzZSBpdCBkb2VzIG5vdCB0YWtlIGludG8gY29uc2lkZXJhdGlvbiBhbHJlYWR5IGV4aXN0aW5nCi0JICoge0BsaW5rIENoYW5nZX1zIGFuZCB0aHVzIGNvbmZsaWN0cyBjb3VsZCBvY2N1ciB0aGF0IHdoZW4gYXBwbGllZCBjcmVhdGUgaW5kZXRlcm1pbmF0ZQotCSAqIHJlc3VsdHMgaW4gdGhlIHRhcmdldCBkb2N1bWVudHM8L3A+Ci0JICogCi0JICogQHNlZSAjY3JlYXRlQ2hhbmdlKEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlLCBUZXh0RWRpdCwgUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCkKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXByaXZhdGUgQ2hhbmdlIGNyZWF0ZUNoYW5nZShKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBzZWFyY2hEb2MsIFRleHRFZGl0IGVkaXQpIHsKLQkJCi0JCUlEb2N1bWVudCBkb2MgPSBzZWFyY2hEb2MuZ2V0SnNwVHJhbnNsYXRpb24oKS5nZXRKc3BEb2N1bWVudCgpOwotCQlTdHJpbmcgZmlsZSA9IHNlYXJjaERvYy5nZXRGaWxlKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBnZXREZXNjcmlwdGlvbigpOwotCQl0cnkgewotCQkJLy8gZG9jdW1lbnQgbGluZXMgYXJlIDAgYmFzZWQKLQkJCVN0cmluZyBsaW5lTnVtYmVyID0gSW50ZWdlci50b1N0cmluZyhkb2MuZ2V0TGluZU9mT2Zmc2V0KGVkaXQuZ2V0T2Zmc2V0KCkpICsgMSk7Ci0JCQlkZXNjcmlwdGlvbiArPSAiICIgKyBOTFMuYmluZChKU1BVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMSwgbmV3IFN0cmluZ1tde2ZpbGUsIGxpbmVOdW1iZXJ9KTsgLy8kTk9OLU5MUy0xJAotCQl9IAotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gbmV3IEpTUFJlbmFtZUNoYW5nZShzZWFyY2hEb2MuZ2V0RmlsZSgpLCBkb2MsIGVkaXQsIGRlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogPC9wPklmIGEge0BsaW5rIFRleHRDaGFuZ2V9IGRvZXMgbm90IGFscmVhZHkgZXhpc3QgZm9yIHRoZSBnaXZlbiB7QGxpbmsgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGV9Ci0JICogdGhlbiBhIG5ldyBvbmUgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIGdpdmVuIHtAbGluayBUZXh0RWRpdH0uICBPdGhlcndpc2UgdGhlIGdpdmVuIHtAbGluayBUZXh0RWRpdH0KLQkgKiB3aWxsIGJlIGFkZGVkIHRvIGEgbmV3IGdyb3VwIGFuZCBhZGRlZCB0byB0aGUgZXhpc3RpbmcgY2hhbmdlIGFuZCA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHJldHVybmVkLjwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc2VhcmNoRG9jIHRoZSB7QGxpbmsgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGV9IHRoYXQgdGhlIDxjb2RlPmVkaXQ8L2NvZGU+IHdpbGwgYmUgYXBwbGllZCB0bwotCSAqIEBwYXJhbSBlZGl0IHRoZSB7QGxpbmsgVGV4dEVkaXR9IHRoYXQgbmVlZHMgdG8gYmUgYWRkZWQgdG8gYSBuZXcge0BsaW5rIFRleHRDaGFuZ2V9IG9yIGFwcGVuZGVkIHRvIGFuCi0JICogZXhpc3Rpbmcgb25lCi0JICogQHBhcmFtIHBhcnRpY2lwYW50IHRoZSB7QGxpbmsgUmVmYWN0b3JpbmdQYXJ0aWNpcGFudH0gdGhhdCBrbm93cyBhYm91dCB0aGUgZXhpc3Rpbmcge0BsaW5rIFRleHRDaGFuZ2V9cwotCSAqIEByZXR1cm4gYSBuZXcge0BsaW5rIENoYW5nZX0gaWYgdGhlcmUgd2FzIG5vdCBvbmUgYWxyZWFkeSBleGlzdGluZyBmb3IgdGhlIGRvY3VtZW50IGluIHF1ZXN0aW9uLAotCSAqIGVsc2UgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIENoYW5nZSBjcmVhdGVDaGFuZ2UoSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBUZXh0RWRpdCBlZGl0LCBSZWZhY3RvcmluZ1BhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7Ci0JCUlEb2N1bWVudCBkb2MgPSBzZWFyY2hEb2MuZ2V0SnNwVHJhbnNsYXRpb24oKS5nZXRKc3BEb2N1bWVudCgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBnZXREZXNjcmlwdGlvbigpOwotCQkKLQkJVGV4dENoYW5nZSBleGlzdGluZ0NoYW5nZSA9IHBhcnRpY2lwYW50LmdldFRleHRDaGFuZ2Uoc2VhcmNoRG9jLmdldEZpbGUoKSk7Ci0JCVRleHRDaGFuZ2UgY2hhbmdlID0gbnVsbDsKLQkJaWYoZXhpc3RpbmdDaGFuZ2UgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlleGlzdGluZ0NoYW5nZS5hZGRFZGl0KGVkaXQpOwotCQkJfWNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIHdoaWxlIGFkZGluZyBlZGl0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQllZGl0ICsgIiB0byBleGlzdGluZyBjaGFuZ2UgIiArIGNoYW5nZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJVGV4dEVkaXRHcm91cCBncm91cCA9IG5ldyBUZXh0RWRpdEdyb3VwKGRlc2NyaXB0aW9uLCBlZGl0KTsKLQkJCWV4aXN0aW5nQ2hhbmdlLmFkZFRleHRFZGl0R3JvdXAoZ3JvdXApOwotCQl9IGVsc2UgewotCQkJY2hhbmdlID0gbmV3IEpTUFJlbmFtZUNoYW5nZShzZWFyY2hEb2MuZ2V0RmlsZSgpLCBkb2MsIGVkaXQsIHNlYXJjaERvYy5nZXRGaWxlKCkuZ2V0TmFtZSgpKTsKLQkJCVRleHRFZGl0R3JvdXAgZ3JvdXAgPSBuZXcgVGV4dEVkaXRHcm91cChkZXNjcmlwdGlvbiwgZWRpdCk7Ci0JCQljaGFuZ2UuYWRkVGV4dEVkaXRHcm91cChncm91cCk7Ci0JCX0KLQkJCi0JCXJldHVybiBjaGFuZ2U7IAotCX0KLQkKLQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzIwNQotCS8vIG9ubHkgcmVsZXZhbnQgZm9yIElUeXBlIHJlZmFjdG9yaW5ncwotCXByb3RlY3RlZCBib29sZWFuIGlzRnVsbHlRdWFsaWZpZWQoU3RyaW5nIG1hdGNoVGV4dCkgewotCQlpZihnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJVHlwZSkgewotCQkJU3RyaW5nIHBrZyA9ICgoSVR5cGUpZ2V0RWxlbWVudCgpKS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQkJcmV0dXJuIG1hdGNoVGV4dC5zdGFydHNXaXRoKHBrZyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIGJldHRlciBkZXNjcmliZSB0aGUgY2hhbmdlLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BGaWVsZFJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BGaWVsZFJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOTExMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQRmllbGRSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci0KLS8qKgotICogPHA+UGFydGljaXBhbnQgZm9yIHJlbmFtaW5nIEphdmEgZmllbGRzIGluIEpTUCBkb2N1bWVudHM8L3A+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgSlNQRmllbGRSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIEpTUFJlbmFtZVBhcnRpY2lwYW50IHsKLQotCS8qKgotCSAqIDxwPkluaXRpYWxpemVzIHRoZSBuYW1lIG9mIHRoaXMgcGFydGljaXBhbnQgdG8gdGhlIG5hbWUgb2YgdGhlIHtAbGluayBJRmllbGR9PC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmllbGQpIHsKLQkJCXN1cGVyLmZOYW1lID0gKChJRmllbGQpZWxlbWVudCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCXN1Y2Nlc3MgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBzdWNjZXNzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BSZW5hbWVQYXJ0aWNpcGFudCNpc0xlZ2FsRWxlbWVudFR5cGUob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTGVnYWxFbGVtZW50VHlwZShJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmllbGQpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BSZW5hbWVQYXJ0aWNpcGFudCNnZXRTZWFyY2hSZXF1ZXN0b3Iob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIGdldFNlYXJjaFJlcXVlc3RvcihJSmF2YUVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciBzZWFyY2hSZXF1ZXN0b3IgPSBudWxsOwotCQkKLQkJaWYoaXNMZWdhbEVsZW1lbnRUeXBlKGVsZW1lbnQpKSB7Ci0JCQlzZWFyY2hSZXF1ZXN0b3IgPSBuZXcgSlNQRmllbGRSZW5hbWVSZXF1ZXN0b3IoZWxlbWVudCwgbmV3TmFtZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBzZWFyY2hSZXF1ZXN0b3I7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUEZpZWxkUmVuYW1lUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BGaWVsZFJlbmFtZVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2NkYWY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUEZpZWxkUmVuYW1lUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIDxwPlJlYWN0b3Igc2VhcmNoIHJlcXVlc3RvciB0byByZW5hbWUgSmF2YSBmaWVsZHMgaW4gSlNQIGRvY3VtZW50czwvcD4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BGaWVsZFJlbmFtZVJlcXVlc3RvciBleHRlbmRzIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgewotCi0JLyoqCi0JICogPHA+Q29uc3RydWN0b3I8L3A+Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIG9sZCBmaWVsZCBuYW1lCi0JICogQHBhcmFtIG5ld05hbWUgdGhlIG5ldyBmaWVsZCBuYW1lCi0JICovCi0JcHVibGljIEpTUEZpZWxkUmVuYW1lUmVxdWVzdG9yKElKYXZhRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcihlbGVtZW50LCBuZXdOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IGdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWUoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gTkxTLmJpbmQoSlNQVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzcsIChuZXcgU3RyaW5nW117ZmllbGROYW1lLCBuZXdOYW1lfSkpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUEphdmFTZWxlY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQSmF2YVNlbGVjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YjZjOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQSmF2YVNlbGVjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLklKU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLWNsYXNzIEpTUEphdmFTZWxlY3Rpb25Qcm92aWRlciB7Ci0Jc3RhdGljIElKYXZhRWxlbWVudFtdIGdldFNlbGVjdGlvbihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yKSB7Ci0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbnVsbDsKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkvLyBnZXQgdGhlIEpTUCB0cmFuc2xhdGlvbiBvYmplY3QgZm9yIHRoaXMgZWRpdG9yJ3MgZG9jdW1lbnQKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsgCi0JCQl0cnkgewotCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSAoSURPTU1vZGVsKW1vZGVsOwotCQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQkJCQlKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKU1BUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCUpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCQkJCQkJZWxlbWVudHMgPSB0cmFuc2xhdGlvbi5nZXRFbGVtZW50c0Zyb21Kc3BSYW5nZSh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCWVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFswXTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVDaGFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWE3MDk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZUNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci0KLS8qKgotICogPHA+PGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MgaXMgbm90IHVzZWQgaW50ZXJuYWxseSBhbnkgbG9uZ2VyIGFuZCB3aWxsCi0gKiBiZSByZW1vdmVkIGF0IHNvbWUgcG9pbnQuPC9wPgotICogCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSlNQTWV0aG9kUmVuYW1lQ2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDaGFuZ2VbXSBjcmVhdGVDaGFuZ2VzRm9yKElNZXRob2QgbWV0aG9kLCBTdHJpbmcgbmV3TmFtZSkgewotCQlKU1BTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCQotCQkvLyBzaG91bGQgYmUgaGFuZGxlZCBieSBKU1BJbmRleE1hbmFnZXIKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMwMzYKLQkJLy8gc3VwcG9ydC5pbmRleFdvcmtzcGFjZUFuZFdhaXQoKTsKLQkJCi0JCUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IEpTUE1ldGhvZFJlbmFtZVJlcXVlc3RvcihtZXRob2QsIG5ld05hbWUpOwotCQlzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKG1ldGhvZCwgbmV3IEpTUFNlYXJjaFNjb3BlKCksIHJlcXVlc3Rvcik7Ci0KLQkJcmV0dXJuIHJlcXVlc3Rvci5nZXRDaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlNQVUlNZXNzYWdlcy5KU1BfY2hhbmdlczsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZGVjaWRlIGNvcnJlY3QgdmFsdWUgb2YgaXNWYWxpZAotCX0KLQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gVGhpcyBtZXRob2QgbXVzdCBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIG9iamVjdCBpcyBzdGlsbCB2YWxpZC4KLQkJLy8gVGhpcyBpcyBpbiBwYXJ0aWN1bGFyIGludGVyZXN0aW5nIHdoZW4gcGVyZm9ybWluZyBhbiB1bmRvIGNoYW5nZQotCQkvLyBzaW5jZSB0aGUgd29ya3NwYWNlIGNvdWxkIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgdW5kbyBjaGFuZ2UgaGFzCi0JCS8vIGJlZW4gY3JlYXRlZC4KLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQotCXB1YmxpYyBDaGFuZ2UgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHBhX1RPRE8gcmV0dXJuIHRoZSAidW5kbyIgY2hhbmdlIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNb2RpZmllZEVsZW1lbnQoKSB7Ci0JCS8vIHBhX1RPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MjIxMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICoge0BsaW5rIEpTUFJlbmFtZVBhcnRpY2lwYW50fSB1c2VkIHRvIHVwZGF0ZSBKU1AgZG9jdW1lbnRzIHdoZW4gYSBKYXZhIG1ldGhvZCBpcyByZW5hbWVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIEpTUFJlbmFtZVBhcnRpY2lwYW50IHsKLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgbmFtZSBvZiB0aGlzIHBhcnRpY2lwYW50IHRvIHRoZSBzb3VyY2Ugb2YgdGhlIGdpdmVuIHtAbGluayBJTWV0aG9kfQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkgewotCQkJCXN1cGVyLmZOYW1lID0gKChJTWV0aG9kKSBlbGVtZW50KS5nZXRTb3VyY2UoKTsKLQkJCQlzdWNjZXNzID0gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhIHtAbGluayBKU1BNZXRob2RSZW5hbWVSZXF1ZXN0b3J9Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQUmVuYW1lUGFydGljaXBhbnQjZ2V0U2VhcmNoUmVxdWVzdG9yKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciBnZXRTZWFyY2hSZXF1ZXN0b3IoSUphdmFFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3Igc2VhcmNoUmVxdWVzdG9yID0gbnVsbDsKLQkJCi0JCWlmKGlzTGVnYWxFbGVtZW50VHlwZShlbGVtZW50KSkgewotCQkJc2VhcmNoUmVxdWVzdG9yID0gbmV3IEpTUE1ldGhvZFJlbmFtZVJlcXVlc3RvcihlbGVtZW50LCBuZXdOYW1lKTsKLQkJfQotCQkKLQkJcmV0dXJuIHNlYXJjaFJlcXVlc3RvcjsKLQl9Ci0KLQkvKioKLQkgKiA8cD5MZWdhbCB0eXBlcyBhcmU6IAotCSAqIDx1bD48bGk+e0BsaW5rIElNZXRob2R9PC9saT48L3VsPjwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BSZW5hbWVQYXJ0aWNpcGFudCNpc0xlZ2FsRWxlbWVudFR5cGUob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTGVnYWxFbGVtZW50VHlwZShJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjhmZTc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZVJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BNZXRob2RSZW5hbWVSZXF1ZXN0b3IgZXh0ZW5kcyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIHsKLQkKLQlwdWJsaWMgSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yKElKYXZhRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcihlbGVtZW50LCBuZXdOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZW5hbWVUZXh0KEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlIHNlYXJjaERvYywgU2VhcmNoTWF0Y2ggamF2YU1hdGNoKSB7Ci0JCQotCQlTdHJpbmcgamF2YVRleHQgPSBzZWFyY2hEb2MuZ2V0SnNwVHJhbnNsYXRpb24oKS5nZXRKYXZhVGV4dCgpOwotCQlTdHJpbmcgbWV0aG9kVGV4dCA9IGphdmFUZXh0LnN1YnN0cmluZyhqYXZhTWF0Y2guZ2V0T2Zmc2V0KCksIGphdmFNYXRjaC5nZXRPZmZzZXQoKSArIGphdmFNYXRjaC5nZXRMZW5ndGgoKSk7Ci0JCVN0cmluZyBtZXRob2RTdWZmaXggPSBtZXRob2RUZXh0LnN1YnN0cmluZyhtZXRob2RUZXh0LmluZGV4T2YoIigiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGdldE5ld05hbWUoKSArIG1ldGhvZFN1ZmZpeDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IjZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQotCQlTdHJpbmcgbWV0aG9kTmFtZSA9IGdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWUoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlNQVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzMsIG5ldyBTdHJpbmdbXXttZXRob2ROYW1lLCBuZXdOYW1lfSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1vdmVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1vdmVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3M2RiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNb3ZlRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotLyoqCi0gKiBBbiBhY3Rpb24gZGVsZWdhdGUgdGhhdCBsYXVuY2hlcyBKRFQgbW92ZSBlbGVtZW50IHdpemFyZAotICogCi0gKiBTdGlsbCByZWxpZXMgaGVhdmlseSBvbiBpbnRlcm5hbCBBUEkKLSAqIHdpbGwgY2hhbmdlIHBvc3QgMy4wIHdpdGggcHVibGljIG1vdmUgc3VwcG9ydAotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxODE3IAotICovCi1wdWJsaWMgY2xhc3MgSlNQTW92ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSwgSUFjdGlvbkRlbGVnYXRlMiwgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0JLy9wcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQkvL2ZFZGl0b3IgPSB0YXJnZXRFZGl0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbnVsbGluZyBvdXQganVzdCBpbiBjYXNlCi0JCS8vZkVkaXRvciA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuTW92ZUVsZW1lbnRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KEpTUFVJTWVzc2FnZXMuTW92ZUVsZW1lbnRfbGFiZWwpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJCi0JCS8vIG5vLW9wIHVudGlsIHdlIGtub3cgaG93IHdlJ3JlIHN1cHBvc2VkIHRvIHVzZSB0aGlzIAotCQkvLyBlY2xpcHNlIDMuMk01Ci0JCS8vIHB1YmxpYyBtb3ZlIHN1cHBvcnQ6IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTgxNwotCQkKLS8vCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoKTsKLS8vCQlpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgewotLy8KLS8vCQkJLy8gbmVlZCB0byBjaGVjayBpZiBpdCdzIG1vdmFibGUKLS8vCQkJdHJ5IHsKLS8vCQkJCUphdmFNb3ZlUHJvY2Vzc29yIHByb2Nlc3NvciA9IEphdmFNb3ZlUHJvY2Vzc29yLmNyZWF0ZShnZXRSZXNvdXJjZXMoZWxlbWVudHMpLCBlbGVtZW50cyk7Ci0vLwkJCQkKLS8vCQkJCVNoZWxsIHBhcmVudCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLS8vCQkJCU1vdmVSZWZhY3RvcmluZyByZWZhY3RvcmluZyA9IG5ldyBNb3ZlUmVmYWN0b3JpbmcocHJvY2Vzc29yKTsKLS8vCi0vLwkJCQlSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBjcmVhdGVXaXphcmQocmVmYWN0b3JpbmcpOwotLy8KLS8vCQkJCS8qCi0vLwkJCQkgKiBXZSB3YW50IHRvIGdldCB0aGUgc2hlbGwgZnJvbSB0aGUgcmVmYWN0b3JpbmcgZGlhbG9nIGJ1dAotLy8JCQkJICogaXQncyBub3Qga25vd24gYXQgdGhpcyBwb2ludCwgc28gd2UgcGFzcyB0aGUgd2l6YXJkIGFuZAotLy8JCQkJICogdGhlbiwgb25jZSB0aGUgZGlhbG9nIGlzIG9wZW4sIHdlIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gaXRzCi0vLwkJCQkgKiBzaGVsbC4KLS8vCQkJCSAqLwotLy8KLS8vCQkJCXByb2Nlc3Nvci5zZXRDcmVhdGVUYXJnZXRRdWVyaWVzKG5ldyBDcmVhdGVUYXJnZXRRdWVyaWVzKHdpemFyZCkpOwotLy8JCQkJcHJvY2Vzc29yLnNldFJlb3JnUXVlcmllcyhuZXcgUmVvcmdRdWVyaWVzKHdpemFyZCkpOwotLy8JCQkJLy8gU3RyaW5nIG9wZW5SZWZhY3RvcmluZ1dpek1zZyA9Ci0vLwkJCQkvLyBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiT3BlblJlZmFjdG9yaW5nV2l6YXJkQWN0aW9uLnJlZmFjdG9yaW5nIik7Ci0vLwkJCQkvLyAvLyROT04tTkxTLTEkCi0vLwkJCQlTdHJpbmcgb3BlblJlZmFjdG9yaW5nV2l6TXNnID0gSlNQVUlNZXNzYWdlcy5Nb3ZlRWxlbWVudFdpemFyZDsgLy8gIk1vdmUKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGUKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzZWxlY3RlZAotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGVsZW1lbnRzIjsKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0vLwkJCQluZXcgUmVmYWN0b3JpbmdTdGFydGVyKCkuYWN0aXZhdGUocmVmYWN0b3JpbmcsIHdpemFyZCwgcGFyZW50LCBvcGVuUmVmYWN0b3JpbmdXaXpNc2csIHRydWUpOwotLy8KLS8vCQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0vLwotLy8JCQl9Ci0vLwkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotLy8JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLS8vCQkJfQotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5RXJyb3JNZXNzYWdlKEpTUFVJTWVzc2FnZXMuSlNQTW92ZUVsZW1lbnRBY3Rpb25fMCk7IC8vJE5PTi1OTFMtMSQKLS8vCQl9Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1vdmVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTW92ZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZTk0ZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTW92ZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLklTaGFyYWJsZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5Nb3ZlQXJndW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5Nb3ZlUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nQXJndW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotCi0vKioKLSAqIEFic3RyYWN0IHtAbGluayBJU2hhcmFibGVQYXJ0aWNpcGFudH0ge0BsaW5rIE1vdmVQYXJ0aWNpcGFudH0gZm9yIGVkaXRpbmcgSlNQIGRvY3VtZW50cwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSlNQTW92ZVBhcnRpY2lwYW50IGV4dGVuZHMgTW92ZVBhcnRpY2lwYW50IGltcGxlbWVudHMgSVNoYXJhYmxlUGFydGljaXBhbnQgewotCQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoaXMgcGFydGljaXBhbnQuCi0JICogU2hvdWxkIGJlIGluaXRpYWxpemVkIGJ5IGltcGxlbWVudGVycyBpbiB7QGxpbmsgI2luaXRpYWxpemUoT2JqZWN0KX0KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZOYW1lOwotCQotCS8qKgotCSAqIEEgbWFwIG9mIHtAbGluayBJSmF2YUVsZW1lbnR9IG5hbWVzIHRvIHBhaXJzIG9mIHtAbGluayBJSmF2YUVsZW1lbnR9cwotCSAqIGFuZCB0aGVpciBhc3NvY2lhdGVkIHtAbGluayBNb3ZlQXJndW1lbnRzfSB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0bwotCSAqIHRoaXMge0BsaW5rIElTaGFyYWJsZVBhcnRpY2lwYW50fS4KLQkgKiAKLQkgKiBrZXk6IHtAbGluayBTdHJpbmd9IC0gRWxlbWVudCBuYW1lPGJyLz4KLQkgKiB2YWx1ZToge0BsaW5rIEVsZW1lbnRBbmRBcmd1bWVudHNQYWlyfQotCSAqLwotCXByaXZhdGUgTWFwIGZFbGVtZW50QW5kQXJndW1lbnRQYWlyczsKLQkKLQkvKioKLQkgKiBXaGVuIG5ldyBjaGFuZ2VzIGFyZSBiZWluZyBzYWZlbHkgY3JlYXRlZCB7QGxpbmsgI2dldFRleHRDaGFuZ2UoT2JqZWN0KX0KLQkgKiBpcyBjYWxsZWQgZmlyc3QgdG8gY2hlY2sgZm9yIGV4aXN0aW5nIHtAbGluayBUZXh0Q2hhbmdlfXMsIGJ1dCB0aG9zZQotCSAqIHJlc3VsdHMgZG8gbm90IHVzdWFsbHkgaW5jbHVkZSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkIHRodXMgZmFyCi0JICogbG9jYWxseSBieSB0aGlzIHtAbGluayBNb3ZlUGFydGljaXBhbnR9LiAgVGhpcyBpcyB0byBrZWVwIHRyYWNrIG9mIHRob3NlCi0JICogY2hhbmdlcyBzbyB0aGUgb3ZlcnJpZGRlbiB2ZXJzaW9uIG9mIHtAbGluayAjZ2V0VGV4dENoYW5nZShPYmplY3QpfXMgd2lsbCB0YWtlCi0JICogdGhlc2UgbG9jYWwge0BsaW5rIFRleHRDaGFuZ2V9cyBpbnRvIGFjY291bnQuCi0JICovCi0JcHJpdmF0ZSBNYXAgZkxvY2FsVGV4dENoYW5nZXM7Ci0JCi0JLyoqCi0JICogR3JvdXBzIGFuIHtAbGluayBJSmF2YUVsZW1lbnR9IHdpdGggaXRzIGFzc29jaWF0ZWQge0BsaW5rIE1vdmVBcmd1bWVudHN9Ci0JICogdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhpcyB7QGxpbmsgSVNoYXJhYmxlUGFydGljaXBhbnR9Ci0JICovCi0JcHJpdmF0ZSBjbGFzcyBFbGVtZW50QW5kQXJndW1lbnRzUGFpciB7Ci0JCXByb3RlY3RlZCBJSmF2YUVsZW1lbnQgZkVsZW1lbnQ7Ci0JCXByb3RlY3RlZCBNb3ZlQXJndW1lbnRzIGZBcmdzOwotCQkKLQkJcHVibGljIEVsZW1lbnRBbmRBcmd1bWVudHNQYWlyKElKYXZhRWxlbWVudCBlbGVtZW50LCBNb3ZlQXJndW1lbnRzIGFyZ3MpIHsKLQkJCXRoaXMuZkVsZW1lbnQgPSBlbGVtZW50OwotCQkJdGhpcy5mQXJncyA9IGFyZ3M7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8cD5EbyBsb2NhbCBpbml0aWFsaXphdGlvbi4gVGhpcyBpcyBkb25lIGhlcmUgaW5zdGVhZCBvZiBpbiBhbiBpbXBsZW1lbnRhdGlvbiBvZgotCSAqIHtAbGluayBSZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCl9IGJlY2F1c2UgaW1wbGVtZW50ZXJzCi0JICogb2YgdGhpcyBjbGFzcyBhcmUgbm90IGV4cGVjdGVkIHRvIGhhdmUgdG8gY2FsbCBzdXBlciB3aGVuIHRoZXkgaW1wbGVtZW50Ci0JICoge0BsaW5rIFJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KX08L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKAotCSAqIAlvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IsIGphdmEubGFuZy5PYmplY3QsCi0JICogCW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ0FyZ3VtZW50cykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbml0aWFsaXplKFJlZmFjdG9yaW5nUHJvY2Vzc29yIHByb2Nlc3NvciwgT2JqZWN0IGVsZW1lbnQsCi0JCQlSZWZhY3RvcmluZ0FyZ3VtZW50cyBhcmd1bWVudHMpIHsKLQkJCi0JCXRoaXMuZkVsZW1lbnRBbmRBcmd1bWVudFBhaXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJdGhpcy5hZGRFbGVtZW50KGVsZW1lbnQsIGFyZ3VtZW50cyk7Ci0JCXRoaXMuZkxvY2FsVGV4dENoYW5nZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl0aGlzLmZOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXJldHVybiBzdXBlci5pbml0aWFsaXplKHByb2Nlc3NvciwgZWxlbWVudCwgYXJndW1lbnRzKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD5XaGVuIGFuIGVsZW1lbnQgaXMgYWRkZWQgdG8gdGhpcyB7QGxpbmsgSVNoYXJhYmxlUGFydGljaXBhbnR9IGl0IG11c3QgYmUKLQkgKiBhIHtAbGluayBJSmF2YUVsZW1lbnR9IGFuZCBiZSBhIGxlZ2FsIGVsZW1lbnQgdHlwZSAoe0BsaW5rICNpc0xlZ2FsRWxlbWVudFR5cGUoSUphdmFFbGVtZW50KX0KLQkgKiBhbmQgdGhlIGdpdmVuIGFyZ3VtZW50cyBtdXN0IGJlIHtAbGluayBNb3ZlQXJndW1lbnRzfS4gIEFsc28gdGhlIG5ldyA8Y29kZT5lbGVtZW50PC9jb2RlPgotCSAqIHdpbGwgbm90IGJlIGFkZGVkIGlmIGFuZCB7QGxpbmsgSUphdmFFbGVtZW50fSBvZiB0aGF0IG5hbWUgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0bwotCSAqIHRoaXMge0BsaW5rIElTaGFyYWJsZVBhcnRpY2lwYW50fS4gIFRoaXMgcHJvdGVjdHMgYWdhaW5zdCBlbGVtZW50cyBiZWluZyBhZGRlZCBtb3JlCi0JICogdGhlbiBvbmNlLjwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5JU2hhcmFibGVQYXJ0aWNpcGFudCNhZGRFbGVtZW50KGphdmEubGFuZy5PYmplY3QsCi0JICogCW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ0FyZ3VtZW50cykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbGVtZW50KE9iamVjdCBlbGVtZW50LCBSZWZhY3RvcmluZ0FyZ3VtZW50cyBhcmd1bWVudHMpIHsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCAmJgotCQkJCWlzTGVnYWxFbGVtZW50VHlwZSgoSUphdmFFbGVtZW50KWVsZW1lbnQpICYmCi0JCQkJYXJndW1lbnRzIGluc3RhbmNlb2YgTW92ZUFyZ3VtZW50cykgewotCQkJCi0JCQkvL2Rvbid0IGFkZCBlbGVtZW50cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGFkZGVkCi0JCQlTdHJpbmcgZWxlbWVudE5hbWUgPSAoKElKYXZhRWxlbWVudCllbGVtZW50KS5nZXRFbGVtZW50TmFtZSgpOwotCQkJaWYoIXRoaXMuZkVsZW1lbnRBbmRBcmd1bWVudFBhaXJzLmNvbnRhaW5zS2V5KGVsZW1lbnROYW1lKSkgewotCQkJCXRoaXMuZkVsZW1lbnRBbmRBcmd1bWVudFBhaXJzLnB1dChlbGVtZW50TmFtZSwKLQkJCQkJCW5ldyBFbGVtZW50QW5kQXJndW1lbnRzUGFpcigoSUphdmFFbGVtZW50KWVsZW1lbnQsIChNb3ZlQXJndW1lbnRzKWFyZ3VtZW50cykpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPkFzIG9mIG5vdyB0aGUgY29uZGl0aW9ucyBhcmUgYWx3YXlzIHtAbGluayBSZWZhY3RvcmluZ1N0YXR1cyNPS308L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjaGVja0NvbmRpdGlvbnMoCi0JICogCW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY3JlYXRlQ2hhbmdlKAotCSAqIAlvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMuZ2V0VGV4dENoYW5nZSgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vY3JlYXRlIG9uZSBtdWx0aSBjaGFuZ2UgdG8gY29udGFpbiBhbGwgbmV3IGNyZWF0ZWQgY2hhbmdlcwotCQlDb21wb3NpdGVDaGFuZ2UgbXVsdGlDaGFuZ2UgPSBuZXcgQ29tcG9zaXRlQ2hhbmdlKEpTUFVJTWVzc2FnZXMuSlNQX2NoYW5nZXMpOwotCQkKLQkJLy9mb3IgZWFjaCBlbGVtZW50IGdldCB0aGUgY2hhbmdlcyBmb3IgaXQgYW5kIGFkZCBpdCB0byB0aGUgbXVsdGkgY2hhbmdlCi0JCUl0ZXJhdG9yIGl0ZXIgPSBmRWxlbWVudEFuZEFyZ3VtZW50UGFpcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUVsZW1lbnRBbmRBcmd1bWVudHNQYWlyIGVsZW1BcmdzUGFpciA9IChFbGVtZW50QW5kQXJndW1lbnRzUGFpcilpdGVyLm5leHQoKTsKLQkJCQotCQkJT2JqZWN0IGRlc3QgPSBlbGVtQXJnc1BhaXIuZkFyZ3MuZ2V0RGVzdGluYXRpb24oKTsKLQkJCQotCQkJaWYoZGVzdCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpIHsJCi0JCQkJQ2hhbmdlW10gY2hhbmdlcyA9IGNyZWF0ZUNoYW5nZXNGb3IoZWxlbUFyZ3NQYWlyLmZFbGVtZW50LCAoKElQYWNrYWdlRnJhZ21lbnQpZGVzdCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQkJCi0JCQkJLyogYWRkIGFsbCBuZXcgdGV4dCBjaGFuZ2VzIHRvIHRoZSBsb2NhbCBsaXN0IG9mIHRleHQgY2hhbmdlcyBzbyB0aGF0Ci0JCQkJICogZnV0dXJlIGl0ZXJhdGlvbnMgdGhyb3VnaCB0aGUgd2hpbGUgbG9vcCB3aWxsIGJlIGF3YXJlIG9mIGFscmVhZHkKLQkJCQkgKiBleGlzdGluZyBjaGFuZ2VzCi0JCQkJICovCi0JCQkJZm9yKGludCBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyArK2kpIHsKLQkJCQkJaWYoY2hhbmdlc1tpXSBpbnN0YW5jZW9mIFRleHRDaGFuZ2UpIHsKLQkJCQkJCWZMb2NhbFRleHRDaGFuZ2VzLnB1dCgoKFRleHRDaGFuZ2UpY2hhbmdlc1tpXSkuZ2V0TW9kaWZpZWRFbGVtZW50KCksIGNoYW5nZXNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmKGNoYW5nZXMubGVuZ3RoID4gMCkgewotCQkJCQltdWx0aUNoYW5nZS5hZGRBbGwoY2hhbmdlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy91bmxlc3MgdGhlcmUgYXJlIGFjdHVhbGx5IG5ldyBjaGFuZ2VzIHJldHVybiBudWxsCi0JCUNoYW5nZSByZXN1bHQgPSBudWxsOwotCQlpZihtdWx0aUNoYW5nZS5nZXRDaGlsZHJlbigpLmxlbmd0aCA+IDApIHsKLQkJCXJlc3VsdCA9IG11bHRpQ2hhbmdlOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZOYW1lOwotCX0KLQkKLQkvKioKLQkgKiA8cD5PdmVycmlkZGVuIHRvIGluY2x1ZGUgbG9jYWxseSBjcmVhdGVkIHtAbGluayBUZXh0Q2hhbmdlfXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmUgcmV0dXJuZWQgYnkKLQkgKiB7QGxpbmsgI2NyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yKX0uPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0VGV4dENoYW5nZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBUZXh0Q2hhbmdlIGdldFRleHRDaGFuZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJVGV4dENoYW5nZSBleGlzdGluZ0NoYW5nZSA9IChUZXh0Q2hhbmdlKWZMb2NhbFRleHRDaGFuZ2VzLmdldChlbGVtZW50KTsKLQkJaWYoZXhpc3RpbmdDaGFuZ2UgPT0gbnVsbCkgewotCQkJZXhpc3RpbmdDaGFuZ2UgPSBzdXBlci5nZXRUZXh0Q2hhbmdlKGVsZW1lbnQpOwotCQl9Ci0JCQotCQlyZXR1cm4gZXhpc3RpbmdDaGFuZ2U7Ci0JfQotCQotCS8qKgotCSAqIFVzaW5nIGEge0BsaW5rIFNlYXJjaFJlcXVlc3Rvcn0gY3JlYXRlIG5ldyBjaGFuZ2VzLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSB7QGxpbmsgSUphdmFFbGVtZW50fSB0byBjcmVhdGUgbmV3IGNoYW5nZXMgZm9yCi0JICogQHBhcmFtIG5ld05hbWUgdGhlIG5ldyBuYW1lIG9mIHRoZSBnaXZlbiB7QGxpbmsgSUphdmFFbGVtZW50fQotCSAqIAotCSAqIEByZXR1cm4gYW55IG5ld2x5IGNyZWF0ZWQge0BsaW5rIENoYW5nZX1zLiAgSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUKLQkgKiB0aGF0IHdoaWxlIG5vIE5FVyB7QGxpbmsgQ2hhbmdlfXMgbWF5YmUgcmV0dXJuZWQgaXQgaXMgcG9zc2libGUgdGhhdAotCSAqIG5ldyB7QGxpbmsgVGV4dEVkaXR9cyB3aWxsIHN0aWxsIGFkZGVkIHRvIGV4aXN0aW5nIHtAbGluayBDaGFuZ2V9cy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlW10gY3JlYXRlQ2hhbmdlc0ZvcihJSmF2YUVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJQ2hhbmdlW10gY2hhbmdlczsKLQkJQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBnZXRTZWFyY2hSZXF1ZXN0b3IoZWxlbWVudCwgbmV3TmFtZSk7Ci0JCWlmKHJlcXVlc3RvciAhPSBudWxsKSB7Ci0JCQlKU1BTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCQlzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKGVsZW1lbnQsIG5ldyBKU1BTZWFyY2hTY29wZSgpLCByZXF1ZXN0b3IpOwotCQkJY2hhbmdlcyA9IHJlcXVlc3Rvci5nZXRDaGFuZ2VzKHRoaXMpOwotCQl9IGVsc2UgewotCQkJY2hhbmdlcyA9IG5ldyBDaGFuZ2VbMF07Ci0JCX0KLQkJCi0JCXJldHVybiBjaGFuZ2VzOwotCX0KLQkKLQkvKioKLQkgKiA8cD5TaG91bGQgYmUgaW1wbGVtZW50ZWQgdG8gcmV0dXJuIHRoZSB7QGxpbmsgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcn0gYXNzb2NpYXRlZAotCSAqIHdpdGggdGhlIGltcGxlbWVudGVycyB7QGxpbmsgSlNQTW92ZVBhcnRpY2lwYW50fS48L3A+Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIHtAbGluayBJSmF2YUVsZW1lbnR9IHRvIGNyZWF0ZSB0aGUge0BsaW5rIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3J9IGZyb20KLQkgKiBAcGFyYW0gbmV3TmFtZSB0aGUgbmV3IG5hbWUgb2YgdGhlIHtAbGluayBJSmF2YUVsZW1lbnR9IHRvIHVzZSB3aGVuCi0JICogY3JlYXRpbmcgdGhlIHtAbGluayBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yfQotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcge0BsaW5rIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3J9IGJhc2VkIG9uIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgZ2V0U2VhcmNoUmVxdWVzdG9yKElKYXZhRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmV3TmFtZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQgY2hlY2sgdGhhdCB0aGlzIHtAbGluayBJSmF2YUVsZW1lbnR9IGlzIG9mIHRoZSB0eXBlIHRoZQotCSAqIGltcGxlbWVudGVycyB7QGxpbmsgSlNQTW92ZVBhcnRpY2lwYW50fSBpcyBjb25maWd1cmVkIHRvIGRlYWwgd2l0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiB7QGxpbmsgSUphdmFFbGVtZW50fSBpcyBvZiBhIHR5cGUKLQkgKiB0aGUgaW1wbGVtZW50ZXJzIHtAbGluayBKU1BNb3ZlUGFydGljaXBhbnR9IGlzIGNvbmZpZ3VyZWQgdG8gZGVhbCB3aXRoLAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNMZWdhbEVsZW1lbnRUeXBlKElKYXZhRWxlbWVudCBlbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVDaGFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVDaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ5NmEyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLQotLyoqCi0gKiA8cD48Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcyBpcyBub3QgdXNlZCBpbnRlcm5hbGx5IGFueSBsb25nZXIgYW5kIHdpbGwKLSAqIGJlIHJlbW92ZWQgYXQgc29tZSBwb2ludC48L3A+Ci0gKiAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQYWNrYWdlUmVuYW1lQ2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDaGFuZ2VbXSBjcmVhdGVDaGFuZ2VzRm9yKElQYWNrYWdlRnJhZ21lbnQgcGtnLCBTdHJpbmcgbmV3TmFtZSkgewotCQlKU1BTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCQotCQkvLyBzaG91bGQgYmUgaGFuZGxlZCBieSBKU1BJbmRleE1hbmFnZXIKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMwMzYKLQkJLy9zdXBwb3J0LmluZGV4V29ya3NwYWNlQW5kV2FpdCgpOwotCQkKLQkJQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSlNQUGFja2FnZVJlbmFtZVJlcXVlc3Rvcihwa2csIG5ld05hbWUpOwotCQlzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKHBrZywgbmV3IEpTUFNlYXJjaFNjb3BlKCksIHJlcXVlc3Rvcik7Ci0KLQkJcmV0dXJuIHJlcXVlc3Rvci5nZXRDaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlNQVUlNZXNzYWdlcy5KU1BfY2hhbmdlczsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZGVjaWRlIGNvcnJlY3QgdmFsdWUgb2YgaXNWYWxpZAotCX0KLQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gVGhpcyBtZXRob2QgbXVzdCBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIG9iamVjdCBpcyBzdGlsbCB2YWxpZC4KLQkJLy8gVGhpcyBpcyBpbiBwYXJ0aWN1bGFyIGludGVyZXN0aW5nIHdoZW4gcGVyZm9ybWluZyBhbiB1bmRvIGNoYW5nZQotCQkvLyBzaW5jZSB0aGUgd29ya3NwYWNlIGNvdWxkIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgdW5kbyBjaGFuZ2UgaGFzCi0JCS8vIGJlZW4gY3JlYXRlZC4KLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQotCXB1YmxpYyBDaGFuZ2UgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gcmV0dXJuIHRoZSAidW5kbyIgY2hhbmdlIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNb2RpZmllZEVsZW1lbnQoKSB7Ci0JCQotCQkvL3JldHVybiB0aGlzLnBrZzsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyMmJhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLQotLyoqCi0gKiB7QGxpbmsgSlNQUmVuYW1lUGFydGljaXBhbnR9IHVzZWQgdG8gdXBkYXRlIEpTUCBkb2N1bWVudHMgd2hlbiBhIEphdmEgcGFja2FnZSBpcyByZW5hbWVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQYWNrYWdlUmVuYW1lUGFydGljaXBhbnQgZXh0ZW5kcyBKU1BSZW5hbWVQYXJ0aWNpcGFudCB7Ci0JLyoqCi0JICogIEluaXRpYWxpemVzIHRoZSBuYW1lIG9mIHRoaXMgcGFydGljaXBhbnQgdG8gdGhlIG5hbWUgb2YgdGhlIHtAbGluayBJUGFja2FnZUZyYWdtZW50fQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0JCQlzdXBlci5mTmFtZSA9ICgoSVBhY2thZ2VGcmFnbWVudCllbGVtZW50KS5nZXRFbGVtZW50TmFtZSgpOwotCQkJc3VjY2VzcyA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gYSB7QGxpbmsgSlNQUGFja2FnZVJlbmFtZVJlcXVlc3Rvcn0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BSZW5hbWVQYXJ0aWNpcGFudCNnZXRTZWFyY2hSZXF1ZXN0b3Iob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIGdldFNlYXJjaFJlcXVlc3RvcihJSmF2YUVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciBzZWFyY2hSZXF1ZXN0b3IgPSBudWxsOwotCQkKLQkJaWYoaXNMZWdhbEVsZW1lbnRUeXBlKGVsZW1lbnQpKSB7Ci0JCQlzZWFyY2hSZXF1ZXN0b3IgPSBuZXcgSlNQUGFja2FnZVJlbmFtZVJlcXVlc3RvcihlbGVtZW50LCBuZXdOYW1lKTsKLQkJfQotCQkKLQkJcmV0dXJuIHNlYXJjaFJlcXVlc3RvcjsKLQl9Ci0JCi0JLyoqCi0JICogPHA+TGVnYWwgdHlwZXMgYXJlOiAKLQkgKiA8dWw+PGxpPntAbGluayBJUGFja2FnZUZyYWdtZW50fTwvbGk+PC91bD48L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQUmVuYW1lUGFydGljaXBhbnQjaXNMZWdhbEVsZW1lbnRUeXBlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNMZWdhbEVsZW1lbnRUeXBlKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyMTFiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIE92ZXJyaWRlcyBnZXQgZGVzY3JpcHRpb24KLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciB7Ci0JCi0JLyoqCi0JICogRWxlbWVudCBpcyB0aGUgb2xkIHBhY2thZ2UuICBuZXdOYW1lIGlzIHRoZSBuZXcgcGFja2FnZSBuYW1lLgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIG5ld05hbWUKLQkgKi8KLQlwdWJsaWMgSlNQUGFja2FnZVJlbmFtZVJlcXVlc3RvcihJSmF2YUVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc3VwZXIoZWxlbWVudCwgbmV3TmFtZSk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBOTFMuYmluZChKU1BVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNSwgKG5ldyBTdHJpbmdbXXtwYWNrYWdlTmFtZSwgbmV3TmFtZX0pKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUmVuYW1lQ2hhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVDaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAzMmMyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuRG9jdW1lbnRDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZFN0cmVhbUNyZWF0b3I7Ci0KLS8qKgotICoge0BsaW5rIERvY3VtZW50Q2hhbmdlfSBpbXBsZW1lbnRhdGlvbiBmb3IgSlNQIERvY3VtZW50cwotICovCi1wdWJsaWMgY2xhc3MgSlNQUmVuYW1lQ2hhbmdlIGV4dGVuZHMgRG9jdW1lbnRDaGFuZ2UgewotCi0JLyoqCi0JICogVGhlIEpTUCBmaWxlIHRoaXMge0BsaW5rIENoYW5nZX0gd2lsbCBjaGFuZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbGUgZkpTUEZpbGUgPSBudWxsOwotCQotCS8qKgotCSAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGNoYW5nZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZEZXNjcmlwdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcge0BsaW5rIEpTUFJlbmFtZUNoYW5nZX0KLQkgKiAKLQkgKiBAcGFyYW0ganNwRmlsZQotCSAqIEBwYXJhbSBqc3BEb2MKLQkgKiBAcGFyYW0gZWRpdAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBKU1BSZW5hbWVDaGFuZ2UoSUZpbGUganNwRmlsZSwgSURvY3VtZW50IGpzcERvYywgVGV4dEVkaXQgZWRpdCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKEpTUFVJTWVzc2FnZXMuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl82LCBqc3BEb2MpOwotCQlNdWx0aVRleHRFZGl0IHBhcmVudEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQlwYXJlbnRFZGl0LmFkZENoaWxkKGVkaXQpOwotCQlzdXBlci5zZXRFZGl0KHBhcmVudEVkaXQpOwotCQl0aGlzLmZKU1BGaWxlID0ganNwRmlsZTsKLQkJdGhpcy5mRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHtAbGluayBKU1BSZW5hbWVDaGFuZ2V9IGJ5IHNoYWxsb3cgY29weWluZyB0aGUgZ2l2ZW4KLQkgKiBvcmlnaW5hbCB7QGxpbmsgSlNQUmVuYW1lQ2hhbmdlfS4KLQkgKiAKLQkgKiBAcGFyYW0gb3JpZ2luYWxDaGFuZ2UgdGhlIHtAbGluayBKU1BSZW5hbWVDaGFuZ2V9IHRvIHNoYWxsb3cgY29weSB0byBjcmVhdGUKLQkgKiBhIG5ldyB7QGxpbmsgSlNQUmVuYW1lQ2hhbmdlfQotCSAqLwotCXB1YmxpYyBKU1BSZW5hbWVDaGFuZ2UoSlNQUmVuYW1lQ2hhbmdlIG9yaWdpbmFsQ2hhbmdlKSB7Ci0JCXN1cGVyKEpTUFVJTWVzc2FnZXMuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl82LCBvcmlnaW5hbENoYW5nZS5nZXRKU1BEb2MoKSk7Ci0JCXN1cGVyLnNldEVkaXQob3JpZ2luYWxDaGFuZ2UuZ2V0RWRpdCgpKTsKLQkJdGhpcy5mSlNQRmlsZSA9IG9yaWdpbmFsQ2hhbmdlLmZKU1BGaWxlOwotCQl0aGlzLmZEZXNjcmlwdGlvbiA9IG9yaWdpbmFsQ2hhbmdlLmZEZXNjcmlwdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Q3VycmVudGx5IHdpbGwgYWx3YXlzIGJlIHtAbGluayBSZWZhY3RvcmluZ1N0YXR1cyNPS308L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Eb2N1bWVudENoYW5nZSNpc1ZhbGlkKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dENoYW5nZSNnZXRQcmV2aWV3RG9jdW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElEb2N1bWVudCBnZXRQcmV2aWV3RG9jdW1lbnQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRG9jdW1lbnQgY29weURvYyA9IG5ldyBEb2N1bWVudCh0aGlzLmdldEpTUERvYygpLmdldCgpKTsKLQkJdHJ5IHsKLQkJCXN1cGVyLmdldEVkaXQoKS5hcHBseShjb3B5RG9jKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIGNvcHlEb2M7Ci0JfQotCQotCS8qKgotCSAqIFBlcmZvcm1zIHRoaXMgY2hhbmdlIGFuZCByZXR1cm5zIGEge0BsaW5rIEpTUFJlbmFtZVVuZG9DaGFuZ2V9IHRvIHVuZG8gdGhlIGNoYW5nZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEge0BsaW5rIEpTUFJlbmFtZVVuZG9DaGFuZ2V9IHRvIHVuZG8gdGhpcyBwZXJmb3JtZWQge0BsaW5rIENoYW5nZX0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRDaGFuZ2UjcGVyZm9ybShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlDaGFuZ2UgdW5kb0NoYW5nZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvL2FwcGx5IGVkaXQKLQkJCXVuZG9DaGFuZ2UgPSBzdXBlci5wZXJmb3JtKHBtKTsKLQkJCXVuZG9DaGFuZ2UgPSBuZXcgSlNQUmVuYW1lVW5kb0NoYW5nZSh0aGlzLCB1bmRvQ2hhbmdlKTsKLQkJCQotCQkJLy9zYXZlIHRoZSBtb2RlbAotCQkJc2F2ZUpTUEZpbGUodGhpcy5mSlNQRmlsZSwgdGhpcy5nZXRKU1BEb2MoKSk7Ci0JCQkKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiB1bmRvQ2hhbmdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEVkaXRCYXNlZENoYW5nZSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmZEZXNjcmlwdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogPHA+VGhlIG1vZGlmaWVkIGVsZW1lbnQgaXMgdGhlIEpTUCB7QGxpbmsgSUZpbGV9IHRoYXQgdGhpcyB7QGxpbmsgQ2hhbmdlfQotCSAqIGNoYW5nZXMuPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuRG9jdW1lbnRDaGFuZ2UjZ2V0TW9kaWZpZWRFbGVtZW50KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZkpTUEZpbGU7Ci0JfQotCQotCS8qKgotCSAqIDxwPkNvbnZlbmllbmNlIG1ldGhvZCB0byBnZXQgdGhlIEpTUCB7QGxpbmsgSURvY3VtZW50fSB0aGF0IHRoaXMge0BsaW5rIENoYW5nZX0KLQkgKiBlZGl0cy48L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgSlNQIHtAbGluayBJRG9jdW1lbnR9IHRoYXQgdGhpcyB7QGxpbmsgQ2hhbmdlfSBlZGl0cwotCSAqLwotCXByb3RlY3RlZCBJRG9jdW1lbnQgZ2V0SlNQRG9jKCkgewotCQlJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRvYyA9IHRoaXMuYWNxdWlyZURvY3VtZW50KG51bGwpOwotCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy9pZ25vcmUsIERvY3VtZW50Q2hhbmdlLmFjcXVpcmVEb2N1bWVudCB3aWxsIG5ldmVyIHRocm93IGl0Ci0JCX0KLQkJCi0JCXJldHVybiBkb2M7Ci0JfQotCQotCS8qKgotCSAqIDxwPlNhdmVzIGEgSlNQIGZpbGUuICBJZiB0aGUgZmlsZSBpcyBub3Qgb3BlbiBpbiBhbiBlZGl0b3IgdGhlbiBtb2RpZmllcyB0aGUgZmlsZSBkaXJlY3RseSwgZWxzZQotCSAqIGlmIHRoZSBmaWxlIGlzIG9wZW4gYW4gZWRpdG9yIHRoZW4gcnVuIHRoZSBzYXZlIG1ldGhvZCBvbiB0aGUgb3BlbiBlZGl0b3IuPC9wPgotCSAqIAotCSAqIEBwYXJhbSBqc3BGaWxlIHRoZSB7QGxpbmsgSUZpbGV9IHRvIHNhdmUKLQkgKiBAcGFyYW0ganNwRG9jIHRoZSB7QGxpbmsgSURvY3VtZW50fSB3aXRoIHRoZSBuZXcgY29udGVudCBmb3IgdGhlIGdpdmVuIHtAbGluayBJRmlsZX0KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc2F2ZUpTUEZpbGUoSUZpbGUganNwRmlsZSwgSURvY3VtZW50IGpzcERvYykgewotCQkvL2lmIG5vdCBvcGVuIHRoZW4gc2F2ZSBtb2RlbAotCQlmaW5hbCBJVGV4dEVkaXRvciBlZGl0b3IgPSBmaW5kT3BlbkVkaXRvcihqc3BEb2MpOwotCQl0cnkgewotCQkJLyogaWYgbm8gb3BlbiBlZGl0b3IgdGhlbiBzYXZlIHRoZSBkb2N1bWVudCB0byB0aGUgZmlsZQotCQkJICogZWxzZSBzYXZlIHRoZSBvcGVuIGVkaXRvcgotCQkJICovCi0JCQlpZihlZGl0b3IgPT0gbnVsbCkgewotCQkJCVNhdmVKc3BGaWxlT3Agb3AgID0gbmV3IFNhdmVKc3BGaWxlT3AoanNwRmlsZSwganNwRG9jKTsKLQkJCQlvcC5ydW4oSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy9lZGl0b3Igc2F2ZSBtdXN0IGJlIGRvbmUgb24gVUkgdGhyZWFkCi0JCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCWVkaXRvci5kb1NhdmUocG0pOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bkluVUkoZWRpdG9yLmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKSwgcnVubmFibGUsIG51bGwpOwotCQkJfQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+Q2hlY2tzIGlmIGEgZG9jdW1lbnQgaXMgb3BlbiBpbiBhbiBlZGl0b3IgYW5kIHJldHVybnMgaXQgaWYgaXQgaXM8L3A+Ci0JICogCi0JICogQHBhcmFtIGpzcERvYyBjaGVjayB0byBzZWUgaWYgdGhpcyB7QGxpbmsgSURvY3VtZW50fSBpcyBjdXJyZW50bHkgb3BlbiBpbiBhbiBlZGl0b3IKLQkgKiBAcmV0dXJuIHRoZSBvcGVuIHtAbGluayBJVGV4dEVkaXRvcn0gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgSURvY3VtZW50fSBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgY2FuIGJlIGZvdW5kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIElUZXh0RWRpdG9yIGZpbmRPcGVuRWRpdG9yKElEb2N1bWVudCBqc3BEb2MpIHsKLQkJSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dzLmxlbmd0aDsgaSsrKSB7Ci0KLQkJCXcgPSB3aW5kb3dzW2ldOwotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHcuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCi0JCQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBwYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBudWxsOwotCQkJCU9iamVjdCBvID0gbnVsbDsKLQkJCQlJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZmVyZW5jZXMubGVuZ3RoOyBqKyspIHsKLQotCQkJCQllZGl0b3IgPSByZWZlcmVuY2VzW2pdLmdldEVkaXRvcihmYWxzZSk7Ci0JCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zNzY0Ci0JCQkJCS8vIHVzZSBhZGFwdGVyIHRvIGdldCBJVGV4dEVkaXRvciAoZm9yIHRoaW5ncyBsaWtlCi0JCQkJCS8vIHBhZ2UgZGVzaWduZXIpCi0JCQkJCW8gPSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJCWlmIChvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0KLQkJCQkJCWRvYyA9ICgoSVRleHRFZGl0b3IpIG8pLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCQlpZiAoZG9jICE9IG51bGwgJiYgZG9jLmVxdWFscyhqc3BEb2MpKSB7Ci0JCQkJCQkJcmV0dXJuIChJVGV4dEVkaXRvcikgbzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogV29ya3NwYWNlIG9wZXJhdGlvbiB0byBwZXJmb3JtIHNhdmUgb24gbW9kZWwgZm9yIHVwZGF0ZWQgZG9jdW1lbnRzLgotCSAqIFNob3VsZCBvbmx5IGJlIGRvbmUgb24gbW9kZWxzIG5vdCBvcGVuIGluIGFuIGVkaXRvci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTYXZlSnNwRmlsZU9wIGV4dGVuZHMgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIHsKLQkJCi0JCXByaXZhdGUgSURvY3VtZW50IGZKU1BEb2MgPSBudWxsOwotCQlwcml2YXRlIElGaWxlIGZKU1BGaWxlID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBTYXZlSnNwRmlsZU9wKElGaWxlIGpzcEZpbGUsIElEb2N1bWVudCBqc3BEb2MpIHsKLQkJCXRoaXMuZkpTUERvYyA9IGpzcERvYzsKLQkJCXRoaXMuZkpTUEZpbGUgPSBqc3BGaWxlOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQotCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM3NjUKLQkJCS8vIHNhdmUgZmlsZSB3LyBubyBpbnRlcm1lZGlhdGUgbW9kZWwgY3JlYXRpb24KLQkJCQotCQkJQ29kZWRTdHJlYW1DcmVhdG9yIGNvZGVkU3RyZWFtQ3JlYXRvciA9IG5ldyBDb2RlZFN0cmVhbUNyZWF0b3IoKTsKLQkJCVJlYWRlciByZWFkZXIgPSBuZXcgRG9jdW1lbnRSZWFkZXIodGhpcy5mSlNQRG9jKTsKLQkJCWNvZGVkU3RyZWFtQ3JlYXRvci5zZXQodGhpcy5mSlNQRmlsZSwgcmVhZGVyKTsKLQkJCQotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGNvZGVkQnl0ZVN0cmVhbSA9IG51bGw7Ci0JCQlJbnB1dFN0cmVhbSBjb2RlZFN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNvZGVkQnl0ZVN0cmVhbSA9IGNvZGVkU3RyZWFtQ3JlYXRvci5nZXRDb2RlZEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCWNvZGVkU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvZGVkQnl0ZVN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCQlpZiAodGhpcy5mSlNQRmlsZS5leGlzdHMoKSkKLQkJCQkJdGhpcy5mSlNQRmlsZS5zZXRDb250ZW50cyhjb2RlZFN0cmVhbSwgdHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQkJZWxzZQotCQkJCQl0aGlzLmZKU1BGaWxlLmNyZWF0ZShjb2RlZFN0cmVhbSwgZmFsc2UsIG51bGwpOwotCQkJCQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYoY29kZWRCeXRlU3RyZWFtICE9IG51bGwpCi0JCQkJCQljb2RlZEJ5dGVTdHJlYW0uY2xvc2UoKTsKLQkJCQkJaWYoY29kZWRTdHJlYW0gIT0gbnVsbCkKLQkJCQkJCWNvZGVkU3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLQkJCQkJLy8gdW5saWtlbHkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUmVuYW1lRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4N2ZjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkucmVmYWN0b3JpbmcuUmVuYW1lU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotLyoqCi0gKiBBbiBhY3Rpb24gZGVsZWdhdGUgdGhhdCBsYXVuY2hlcyBKRFQgcmVuYW1lIGVsZW1lbnQgd2l6YXJkCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElBY3Rpb25EZWxlZ2F0ZTIsIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSUVkaXRvclBhcnQgZkVkaXRvcjsKLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCQlmRWRpdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoSlNQVUlNZXNzYWdlcy5SZW5hbWVFbGVtZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChKU1BVSU1lc3NhZ2VzLlJlbmFtZUVsZW1lbnRfbGFiZWwpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZ2V0U2VsZWN0ZWRFbGVtZW50KCk7Ci0JCWlmKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJUmVuYW1lU3VwcG9ydCByZW5hbWVTdXBwb3J0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc3dpdGNoKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJCQljYXNlIElKYXZhRWxlbWVudC5UWVBFOgotCQkJCQkJcmVuYW1lU3VwcG9ydD0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoKElUeXBlKWVsZW1lbnQsIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSwgUmVuYW1lU3VwcG9ydC5VUERBVEVfUkVGRVJFTkNFUyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJSmF2YUVsZW1lbnQuTUVUSE9EOgotCQkJCQkJcmVuYW1lU3VwcG9ydD0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoKElNZXRob2QpZWxlbWVudCwgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCBSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UOgotCQkJCQkJcmVuYW1lU3VwcG9ydD0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoKElQYWNrYWdlRnJhZ21lbnQpZWxlbWVudCwgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCBSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZihyZW5hbWVTdXBwb3J0ICE9IG51bGwpIHsKLQkJCQkJcmVuYW1lU3VwcG9ydC5vcGVuRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0JCQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSAgewotCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5RXJyb3JNZXNzYWdlKEpTUFVJTWVzc2FnZXMuSlNQUmVuYW1lRWxlbWVudEFjdGlvbl8wKTsgLy8kTk9OLU5MUy0xJAotCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5hZGRPbmVUaW1lQ2xlYXJMaXN0ZW5lcigpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJpdmF0ZSBJSmF2YUVsZW1lbnQgZ2V0U2VsZWN0ZWRFbGVtZW50KCkgewotCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gSlNQSmF2YVNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigoSVRleHRFZGl0b3IpZkVkaXRvcik7Ci0JCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDEpCi0JCQkJZWxlbWVudCA9IGVsZW1lbnRzWzBdOwotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTFlYzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFJlbmFtZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dENoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuSVNoYXJhYmxlUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nQXJndW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lQXJndW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotCi0vKioKLSAqIEFic3RyYWN0IHtAbGluayBJU2hhcmFibGVQYXJ0aWNpcGFudH0ge0BsaW5rIFJlbmFtZVBhcnRpY2lwYW50fSBmb3IgZWRpdGluZyBKU1AgZG9jdW1lbnRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKU1BSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIFJlbmFtZVBhcnRpY2lwYW50IGltcGxlbWVudHMgSVNoYXJhYmxlUGFydGljaXBhbnQgewotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoaXMgcGFydGljaXBhbnQuCi0JICogU2hvdWxkIGJlIGluaXRpYWxpemVkIGJ5IGltcGxlbWVudGVycyBpbiB7QGxpbmsgI2luaXRpYWxpemUoT2JqZWN0KX0KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZOYW1lOwotCQotCS8qKgotCSAqIEEgbWFwIG9mIHtAbGluayBJSmF2YUVsZW1lbnR9IG5hbWVzIHRvIHBhaXJzIG9mIHtAbGluayBJSmF2YUVsZW1lbnR9cwotCSAqIGFuZCB0aGVpciBhc3NvY2lhdGVkIHtAbGluayBSZW5hbWVBcmd1bWVudHN9IHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvCi0JICogdGhpcyB7QGxpbmsgSVNoYXJhYmxlUGFydGljaXBhbnR9LgotCSAqIAotCSAqIGtleToge0BsaW5rIFN0cmluZ30gLSBFbGVtZW50IG5hbWU8YnIvPgotCSAqIHZhbHVlOiB7QGxpbmsgRWxlbWVudEFuZEFyZ3VtZW50c1BhaXJ9Ci0JICovCi0JcHJpdmF0ZSBNYXAgZkVsZW1lbnRBbmRBcmd1bWVudFBhaXJzOwotCQotCS8qKgotCSAqIFdoZW4gbmV3IGNoYW5nZXMgYXJlIGJlaW5nIHNhZmVseSBjcmVhdGVkIHtAbGluayAjZ2V0VGV4dENoYW5nZShPYmplY3QpfQotCSAqIGlzIGNhbGxlZCBmaXJzdCB0byBjaGVjayBmb3IgZXhpc3Rpbmcge0BsaW5rIFRleHRDaGFuZ2V9cywgYnV0IHRob3NlCi0JICogcmVzdWx0cyBkbyBub3QgdXN1YWxseSBpbmNsdWRlIHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQgdGh1cyBmYXIKLQkgKiBsb2NhbGx5IGJ5IHRoaXMge0BsaW5rIFJlbmFtZVBhcnRpY2lwYW50fS4gIFRoaXMgaXMgdG8ga2VlcCB0cmFjayBvZiB0aG9zZQotCSAqIGNoYW5nZXMgc28gdGhlIG92ZXJyaWRkZW4gdmVyc2lvbiBvZiB7QGxpbmsgI2dldFRleHRDaGFuZ2UoT2JqZWN0KX1zIHdpbGwgdGFrZQotCSAqIHRoZXNlIGxvY2FsIHtAbGluayBUZXh0Q2hhbmdlfXMgaW50byBhY2NvdW50LgotCSAqLwotCXByaXZhdGUgTWFwIGZMb2NhbFRleHRDaGFuZ2VzOwotCQotCS8qKgotCSAqIEdyb3VwcyBhbiB7QGxpbmsgSUphdmFFbGVtZW50fSB3aXRoIGl0cyBhc3NvY2lhdGVkIHtAbGluayBSZW5hbWVBcmd1bWVudHN9Ci0JICogdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhpcyB7QGxpbmsgSVNoYXJhYmxlUGFydGljaXBhbnR9Ci0JICovCi0JcHJpdmF0ZSBjbGFzcyBFbGVtZW50QW5kQXJndW1lbnRzUGFpciB7Ci0JCXByb3RlY3RlZCBJSmF2YUVsZW1lbnQgZkVsZW1lbnQ7Ci0JCXByb3RlY3RlZCBSZW5hbWVBcmd1bWVudHMgZkFyZ3M7Ci0JCQotCQlwdWJsaWMgRWxlbWVudEFuZEFyZ3VtZW50c1BhaXIoSUphdmFFbGVtZW50IGVsZW1lbnQsIFJlbmFtZUFyZ3VtZW50cyBhcmdzKSB7Ci0JCQl0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLQkJCXRoaXMuZkFyZ3MgPSBhcmdzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+RG8gbG9jYWwgaW5pdGlhbGl6YXRpb24uIFRoaXMgaXMgZG9uZSBoZXJlIGluc3RlYWQgb2YgaW4gYW4gaW1wbGVtZW50YXRpb24gb2YKLQkgKiB7QGxpbmsgUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKGphdmEubGFuZy5PYmplY3QpfSBiZWNhdXNlIGltcGxlbWVudGVycwotCSAqIG9mIHRoaXMgY2xhc3MgYXJlIG5vdCBleHBlY3RlZCB0byBoYXZlIHRvIGNhbGwgc3VwZXIgd2hlbiB0aGV5IGltcGxlbWVudAotCSAqIHtAbGluayBSZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCl9PC9wPgotCSAqIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZSgKLQkgKiAJb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yLCBqYXZhLmxhbmcuT2JqZWN0LAotCSAqIAlvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdBcmd1bWVudHMpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5pdGlhbGl6ZShSZWZhY3RvcmluZ1Byb2Nlc3NvciBwcm9jZXNzb3IsIE9iamVjdCBlbGVtZW50LAotCQkJUmVmYWN0b3JpbmdBcmd1bWVudHMgYXJndW1lbnRzKSB7Ci0JCQotCQl0aGlzLmZFbGVtZW50QW5kQXJndW1lbnRQYWlycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRoaXMuYWRkRWxlbWVudChlbGVtZW50LCBhcmd1bWVudHMpOwotCQl0aGlzLmZMb2NhbFRleHRDaGFuZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQkJdGhpcy5mTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQotCQlyZXR1cm4gc3VwZXIuaW5pdGlhbGl6ZShwcm9jZXNzb3IsIGVsZW1lbnQsIGFyZ3VtZW50cyk7Ci0JfQotCi0JLyoqCi0JICogPHA+V2hlbiBhbiBlbGVtZW50IGlzIGFkZGVkIHRvIHRoaXMge0BsaW5rIElTaGFyYWJsZVBhcnRpY2lwYW50fSBpdCBtdXN0IGJlCi0JICogYSB7QGxpbmsgSUphdmFFbGVtZW50fSBhbmQgYmUgYSBsZWdhbCBlbGVtZW50IHR5cGUgKHtAbGluayAjaXNMZWdhbEVsZW1lbnRUeXBlKElKYXZhRWxlbWVudCl9Ci0JICogYW5kIHRoZSBnaXZlbiBhcmd1bWVudHMgbXVzdCBiZSB7QGxpbmsgUmVuYW1lQXJndW1lbnRzfS4gIEFsc28gdGhlIG5ldyA8Y29kZT5lbGVtZW50PC9jb2RlPgotCSAqIHdpbGwgbm90IGJlIGFkZGVkIGlmIGFuZCB7QGxpbmsgSUphdmFFbGVtZW50fSBvZiB0aGF0IG5hbWUgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0bwotCSAqIHRoaXMge0BsaW5rIElTaGFyYWJsZVBhcnRpY2lwYW50fS4gIFRoaXMgcHJvdGVjdHMgYWdhaW5zdCBlbGVtZW50cyBiZWluZyBhZGRlZCBtb3JlCi0JICogdGhlbiBvbmNlLjwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5JU2hhcmFibGVQYXJ0aWNpcGFudCNhZGRFbGVtZW50KGphdmEubGFuZy5PYmplY3QsCi0JICogCW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ0FyZ3VtZW50cykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbGVtZW50KE9iamVjdCBlbGVtZW50LCBSZWZhY3RvcmluZ0FyZ3VtZW50cyBhcmd1bWVudHMpIHsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCAmJgotCQkJCWlzTGVnYWxFbGVtZW50VHlwZSgoSUphdmFFbGVtZW50KWVsZW1lbnQpICYmCi0JCQkJYXJndW1lbnRzIGluc3RhbmNlb2YgUmVuYW1lQXJndW1lbnRzKSB7Ci0JCQkKLQkJCS8vZG9uJ3QgYWRkIGVsZW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQKLQkJCVN0cmluZyBlbGVtZW50TmFtZSA9ICgoSUphdmFFbGVtZW50KWVsZW1lbnQpLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlpZighdGhpcy5mRWxlbWVudEFuZEFyZ3VtZW50UGFpcnMuY29udGFpbnNLZXkoZWxlbWVudE5hbWUpKSB7Ci0JCQkJdGhpcy5mRWxlbWVudEFuZEFyZ3VtZW50UGFpcnMucHV0KGVsZW1lbnROYW1lLAotCQkJCQkJbmV3IEVsZW1lbnRBbmRBcmd1bWVudHNQYWlyKChJSmF2YUVsZW1lbnQpZWxlbWVudCwgKFJlbmFtZUFyZ3VtZW50cylhcmd1bWVudHMpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD5BcyBvZiBub3cgdGhlIGNvbmRpdGlvbnMgYXJlIGFsd2F5cyB7QGxpbmsgUmVmYWN0b3JpbmdTdGF0dXMjT0t9PC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY2hlY2tDb25kaXRpb25zKAotCSAqIAlvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLCBDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NyZWF0ZUNoYW5nZSgKLQkgKiAJb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzLmdldFRleHRDaGFuZ2UoIiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvL2NyZWF0ZSBvbmUgbXVsdGkgY2hhbmdlIHRvIGNvbnRhaW4gYWxsIG5ldyBjcmVhdGVkIGNoYW5nZXMKLQkJQ29tcG9zaXRlQ2hhbmdlIG11bHRpQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZShKU1BVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzKTsKLQkJCi0JCS8vZm9yIGVhY2ggZWxlbWVudCBnZXQgdGhlIGNoYW5nZXMgZm9yIGl0IGFuZCBhZGQgaXQgdG8gdGhlIG11bHRpIGNoYW5nZQotCQlJdGVyYXRvciBpdGVyID0gZkVsZW1lbnRBbmRBcmd1bWVudFBhaXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlFbGVtZW50QW5kQXJndW1lbnRzUGFpciBlbGVtQXJnc1BhaXIgPSAoRWxlbWVudEFuZEFyZ3VtZW50c1BhaXIpaXRlci5uZXh0KCk7Ci0JCQlDaGFuZ2VbXSBjaGFuZ2VzID0gY3JlYXRlQ2hhbmdlc0ZvcihlbGVtQXJnc1BhaXIuZkVsZW1lbnQsIGVsZW1BcmdzUGFpci5mQXJncy5nZXROZXdOYW1lKCkpOwotCQkJCi0JCQkvKiBhZGQgYWxsIG5ldyB0ZXh0IGNoYW5nZXMgdG8gdGhlIGxvY2FsIGxpc3Qgb2YgdGV4dCBjaGFuZ2VzIHNvIHRoYXQKLQkJCSAqIGZ1dHVyZSBpdGVyYXRpb25zIHRocm91Z2ggdGhlIHdoaWxlIGxvb3Agd2lsbCBiZSBhd2FyZSBvZiBhbHJlYWR5Ci0JCQkgKiBleGlzdGluZyBjaGFuZ2VzCi0JCQkgKi8KLQkJCWZvcihpbnQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgKytpKSB7Ci0JCQkJaWYoY2hhbmdlc1tpXSBpbnN0YW5jZW9mIFRleHRDaGFuZ2UpIHsKLQkJCQkJZkxvY2FsVGV4dENoYW5nZXMucHV0KCgoVGV4dENoYW5nZSljaGFuZ2VzW2ldKS5nZXRNb2RpZmllZEVsZW1lbnQoKSwgY2hhbmdlc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZihjaGFuZ2VzLmxlbmd0aCA+IDApIHsKLQkJCQltdWx0aUNoYW5nZS5hZGRBbGwoY2hhbmdlcyk7Ci0JCQl9Ci0JCX0KLQotCQkvL3VubGVzcyB0aGVyZSBhcmUgYWN0dWFsbHkgbmV3IGNoYW5nZXMgcmV0dXJuIG51bGwKLQkJQ2hhbmdlIHJlc3VsdCA9IG51bGw7Ci0JCWlmKG11bHRpQ2hhbmdlLmdldENoaWxkcmVuKCkubGVuZ3RoID4gMCkgewotCQkJcmVzdWx0ID0gbXVsdGlDaGFuZ2U7Ci0JCX0KLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCQotCS8qKgotCSAqIDxwPk92ZXJyaWRkZW4gdG8gaW5jbHVkZSBsb2NhbGx5IGNyZWF0ZWQge0BsaW5rIFRleHRDaGFuZ2V9cyB0aGF0IGhhdmUgbm90IHlldCBiZSByZXR1cm5lZCBieQotCSAqIHtAbGluayAjY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IpfS48L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXRUZXh0Q2hhbmdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFRleHRDaGFuZ2UgZ2V0VGV4dENoYW5nZShPYmplY3QgZWxlbWVudCkgewotCQlUZXh0Q2hhbmdlIGV4aXN0aW5nQ2hhbmdlID0gKFRleHRDaGFuZ2UpZkxvY2FsVGV4dENoYW5nZXMuZ2V0KGVsZW1lbnQpOwotCQlpZihleGlzdGluZ0NoYW5nZSA9PSBudWxsKSB7Ci0JCQlleGlzdGluZ0NoYW5nZSA9IHN1cGVyLmdldFRleHRDaGFuZ2UoZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBleGlzdGluZ0NoYW5nZTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIHtAbGluayBJSmF2YUVsZW1lbnR9IHRvIGNyZWF0ZSBuZXcgY2hhbmdlcyBmb3IKLQkgKiBAcGFyYW0gbmV3TmFtZSB0aGUgbmV3IG5hbWUgb2YgdGhlIGdpdmVuIHtAbGluayBJSmF2YUVsZW1lbnR9Ci0JICogCi0JICogQHJldHVybiBhbnkgbmV3bHkgY3JlYXRlZCB7QGxpbmsgQ2hhbmdlfXMuICBJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZQotCSAqIHRoYXQgd2hpbGUgbm8gTkVXIHtAbGluayBDaGFuZ2V9cyBtYXliZSByZXR1cm5lZCBpdCBpcyBwb3NzaWJsZSB0aGF0Ci0JICogbmV3IHtAbGluayBUZXh0RWRpdH1zIHdpbGwgc3RpbGwgYWRkZWQgdG8gZXhpc3Rpbmcge0BsaW5rIENoYW5nZX1zLgotCSAqLwotCXByb3RlY3RlZCBDaGFuZ2VbXSBjcmVhdGVDaGFuZ2VzRm9yKElKYXZhRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmV3TmFtZSkgewotCQlDaGFuZ2VbXSBjaGFuZ2VzOwotCQlCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciA9IGdldFNlYXJjaFJlcXVlc3RvcihlbGVtZW50LCBuZXdOYW1lKTsKLQkJaWYocmVxdWVzdG9yICE9IG51bGwpIHsKLQkJCUpTUFNlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJCXN1cHBvcnQuc2VhcmNoUnVubmFibGUoZWxlbWVudCwgbmV3IEpTUFNlYXJjaFNjb3BlKCksIHJlcXVlc3Rvcik7Ci0JCQljaGFuZ2VzID0gcmVxdWVzdG9yLmdldENoYW5nZXModGhpcyk7Ci0JCX0gZWxzZSB7Ci0JCQljaGFuZ2VzID0gbmV3IENoYW5nZVswXTsKLQkJfQotCQkKLQkJcmV0dXJuIGNoYW5nZXM7Ci0JfQotCQotCS8qKgotCSAqIDxwPlNob3VsZCBiZSBpbXBsZW1lbnRlZCB0byByZXR1cm4gdGhlIHtAbGluayBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yfSBhc3NvY2lhdGVkCi0JICogd2l0aCB0aGUgaW1wbGVtZW50ZXJzIHtAbGluayBKU1BSZW5hbWVQYXJ0aWNpcGFudFBhcnRpY2lwYW50fS48L3A+Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIHtAbGluayBJSmF2YUVsZW1lbnR9IHRvIGNyZWF0ZSB0aGUge0BsaW5rIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3J9IGZyb20KLQkgKiBAcGFyYW0gbmV3TmFtZSB0aGUgbmV3IG5hbWUgb2YgdGhlIHtAbGluayBJSmF2YUVsZW1lbnR9IHRvIHVzZSB3aGVuCi0JICogY3JlYXRpbmcgdGhlIHtAbGluayBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yfQotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcge0BsaW5rIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3J9IGJhc2VkIG9uIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgZ2V0U2VhcmNoUmVxdWVzdG9yKElKYXZhRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmV3TmFtZSk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQgY2hlY2sgdGhhdCB0aGlzIHtAbGluayBJSmF2YUVsZW1lbnR9IGlzIG9mIHRoZSB0eXBlIHRoZQotCSAqIGltcGxlbWVudGVycyB7QGxpbmsgSlNQUmVuYW1lUGFydGljaXBhbnR9IGlzIGNvbmZpZ3VyZWQgdG8gZGVhbCB3aXRoLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHtAbGluayBJSmF2YUVsZW1lbnR9IGlzIG9mIGEgdHlwZQotCSAqIHRoZSBpbXBsZW1lbnRlcnMge0BsaW5rIEpTUFJlbmFtZVBhcnRpY2lwYW50fSBpcyBjb25maWd1cmVkIHRvIGRlYWwgd2l0aCwKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzTGVnYWxFbGVtZW50VHlwZShJSmF2YUVsZW1lbnQgZWxlbWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVVbmRvQ2hhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVVbmRvQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNGU2N2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUmVuYW1lVW5kb0NoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotCi0vKioKLSAqIDxwPldoZW4gdW5kb2luZyB7QGxpbmsgSlNQUmVuYW1lQ2hhbmdlfXMgbmVlZCB0byBiZSBzdXJlIG5vdCBvbmx5IHRvIHBlcmZvcm0KLSAqIHRoZSBVbmRvRG9jdW1lbnRDaGFuZ2UgYnV0IHRvIGFsc28gc2F2ZSB0aGUgSlNQIGZpbGUgb3RoZXJ3aXNlIG9uZSBvZiB0d28KLSAqIHVud2FudGVkIHRoaW5ncyBjb3VsZCBoYXBwZW46Ci0gKiA8dWw+PGxpPmFuIG9wZW4gZWRpdG9yIHdpdGggdGhlIGZpbGUgY291bGQgYmUgbWFya2VkIGRpcnR5PC9saT4KLSAqIDxsaT5vciBpZiB0aGUgY2hhbmdlZCBmaWxlIGlzIG5vdCBvcGVuIGluIGFuIGVkaXRvciB0aGVuIHRoZSBjaGFuZ2VzIHdpbGwKLSAqIG5vdCBiZSBzYXZlZCB0byB0aGUgZmlsZSBhbmQgdGh1cyBub3QgcGVyc2lzdC48L2xpPjwvdWw+PC9wPgotICogCi0gKiA8cD5UaGVyZWZvcmUgYSB7QGxpbmsgSlNQUmVuYW1lVW5kb0NoYW5nZX0gd3JhcHMgYW5vdGhlciB7QGxpbmsgQ2hhbmdlfSB3aGljaAotICogaXMgY29uc2lkZXJlZCB0aGUgInVuZG8gY2hhbmdlIi4gIFdoZW4gYSBwZXJmb3JtIGlzIGNhbGxlZCBvbiB7QGxpbmsgSlNQUmVuYW1lVW5kb0NoYW5nZX0KLSAqIHRoZSBwZXJmb3JtIGlzIGNhbGxlZCBvbiB0aGUgd3JhcHBlZCAidW5kbyBjaGFuZ2UiLCBhbm90aGVyIHtAbGluayBKU1BSZW5hbWVVbmRvQ2hhbmdlfQotICogaXMgY3JlYXRlZCBhcyB0aGUgInJlZG8gY2hhbmdlIiBmcm9tIHRoZSByZXR1cm4gb2YgdGhlIHBlcmZvcm0gb24gdGhlICJ1bmRvIGNoYW5nZSIKLSAqIGFuZCB0aGVuIG1vc3QgaW1wb3J0YW50bHkgdGhlIHVwZGF0ZWQge0BsaW5rIElEb2N1bWVudH0gaXMgc2F2ZWQgdG8gdGhlIHtAbGluayBJRmlsZX0KLSAqIGlmIHRoZSBKU1AgZmlsZSBpcyBub3Qgb3BlbiBpbiBhbiBlZGl0b3IsIG9yIGEgc2F2ZSBpcyBjYWxsZWQgb24gdGhlIG9wZW4ge0BsaW5rIElUZXh0RWRpdG9yfQotICogdGhhdCBpcyBlZGl0aW5nIHRoZSBjaGFuZ2VkIEpTUCBmaWxlLjwvcD4KLSAqLwotcHVibGljIGNsYXNzIEpTUFJlbmFtZVVuZG9DaGFuZ2UgZXh0ZW5kcyBKU1BSZW5hbWVDaGFuZ2UgewotCS8qKgotCSAqIFRoZSAidW5kbyBjaGFuZ2UiIGJlaW5nIHdyYXBwZWQKLQkgKi8KLQlwcml2YXRlIENoYW5nZSBmVW5kb0NoYW5nZTsKLQkKLQkvKioKLQkgKiA8cD5DcmVhdGUgdGhlIHtAbGluayBKU1BSZW5hbWVVbmRvQ2hhbmdlfSBmcm9tIHRoZSB7QGxpbmsgSlNQUmVuYW1lQ2hhbmdlfQotCSAqIHRoYXQgY3JlYXRlZCB0aGUgdW5kbyBjaGFuZ2UgYW5kIHRoZSB1bmRvIGNoYW5nZSBpdHNlbGYuPC9wPgotCSAqIAotCSAqIEBwYXJhbSBvcmlnaW5hbENoYW5nZSB0aGUge0BsaW5rIEpTUFJlbmFtZUNoYW5nZX0gdGhhdCBjcmVhdGVkIHRoZSA8Y29kZT51bmRvQ2hhbmdlPC9jb2RlPgotCSAqIEBwYXJhbSB1bmRvQ2hhbmdlIHRoZSB1bmRvIGNoYW5nZSB0byBiZSB3cmFwcGVkIGJ5IHRoaXMge0BsaW5rIEpTUFJlbmFtZVVuZG9DaGFuZ2V9Ci0JICovCi0JcHVibGljIEpTUFJlbmFtZVVuZG9DaGFuZ2UoSlNQUmVuYW1lQ2hhbmdlIG9yaWdpbmFsQ2hhbmdlLCBDaGFuZ2UgdW5kb0NoYW5nZSkgewotCQlzdXBlcihvcmlnaW5hbENoYW5nZSk7Ci0JCWZVbmRvQ2hhbmdlID0gdW5kb0NoYW5nZTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+U2VlIHtAbGluayBKU1BSZW5hbWVVbmRvQ2hhbmdlfSBjbGFzcyBkZXNjcmlwdGlvbiBmb3IgbW9yZSBkZXRhaWxzLjwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEge0BsaW5rIEpTUFJlbmFtZVVuZG9DaGFuZ2V9IHdyYXBwaW5nIHRoZSAicmVkbyBjaGFuZ2UiIHJldHVybmVkIGJ5IHRoZQotCSAqIGNhbGwgdG8ge0BsaW5rIENoYW5nZSNwZXJmb3JtKElQcm9ncmVzc01vbml0b3IpfSBvbiB0aGUgd3JhcHBlZCAidW5kbyBjaGFuZ2UiLgotCSAqIAotCSAqIEBzZWUgSlNQUmVuYW1lVW5kb0NoYW5nZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUFJlbmFtZUNoYW5nZSNwZXJmb3JtKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBDaGFuZ2UgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vYXBwbHkgZWRpdAotCQlDaGFuZ2UgcmVkb0NoYW5nZSA9IGZVbmRvQ2hhbmdlLnBlcmZvcm0ocG0pOwotCQlyZWRvQ2hhbmdlID0gbmV3IEpTUFJlbmFtZVVuZG9DaGFuZ2UodGhpcywgcmVkb0NoYW5nZSk7Ci0JCQotCQkvL3NhdmUgdGhlIGZpbGUKLQkJc2F2ZUpTUEZpbGUodGhpcy5mSlNQRmlsZSwgdGhpcy5nZXRKU1BEb2MoKSk7Ci0JCQotCQlyZXR1cm4gcmVkb0NoYW5nZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZUNoYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVDaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYwYmFhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZUNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotCi0vKioKLSAqIDxwPjxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzIGlzIG5vdCB1c2VkIGludGVybmFsbHkgYW55IGxvbmdlciBhbmQgd2lsbAotICogYmUgcmVtb3ZlZCBhdCBzb21lIHBvaW50LjwvcD4KLSAqIAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVNb3ZlQ2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDaGFuZ2VbXSBjcmVhdGVDaGFuZ2VzRm9yKElUeXBlIHR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCQotCQlKU1BTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCS8vIHNob3VsZCBiZSBoYW5kbGVkIGJ5IEpTUEluZGV4TWFuYWdlcgotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzAzNgotCQkvLyBzdXBwb3J0LmluZGV4V29ya3NwYWNlQW5kV2FpdCgpOwotCQkKLQkJSlNQVHlwZU1vdmVSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IEpTUFR5cGVNb3ZlUmVxdWVzdG9yKHR5cGUsIG5ld05hbWUpOwotCQlzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKHR5cGUsIG5ldyBKU1BTZWFyY2hTY29wZSgpLCByZXF1ZXN0b3IpOwotCi0JCXJldHVybiByZXF1ZXN0b3IuZ2V0Q2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpTUFVJTWVzc2FnZXMuSlNQX2NoYW5nZXM7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGRlY2lkZSBjb3JyZWN0IHZhbHVlIG9mIGlzVmFsaWQKLQl9Ci0KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIFRoaXMgbWV0aG9kIG11c3QgZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBvYmplY3QgaXMgc3RpbGwgdmFsaWQuCi0JCS8vIFRoaXMgaXMgaW4gcGFydGljdWxhciBpbnRlcmVzdGluZyB3aGVuIHBlcmZvcm1pbmcgYW4gdW5kbyBjaGFuZ2UKLQkJLy8gc2luY2UgdGhlIHdvcmtzcGFjZSBjb3VsZCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIHVuZG8gY2hhbmdlIGhhcwotCQkvLyBiZWVuIGNyZWF0ZWQuCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0KLQlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIHJldHVybiB0aGUgInVuZG8iIGNoYW5nZSBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYzBiYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLQotLyoqCi0gKiB7QGxpbmsgSlNQTW92ZVBhcnRpY2lwYW50fSB1c2VkIHRvIHVwZGF0ZSBKU1AgZG9jdW1lbnRzIHdoZW4gYSBKYXZhIHR5cGUgaXMgbW92ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlTW92ZVBhcnRpY2lwYW50IGV4dGVuZHMgSlNQTW92ZVBhcnRpY2lwYW50IHsKLQkKLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgbmFtZSBvZiB0aGlzIHBhcnRpY2lwYW50IHRvIHRoZSBuYW1lIG9mIHRoZSB7QGxpbmsgSVR5cGV9Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSB7Ci0JCQlzdXBlci5mTmFtZSA9KChJVHlwZSllbGVtZW50KS5nZXRFbGVtZW50TmFtZSgpOwotCQkJc3VjY2VzcyA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhIHtAbGluayBKU1BUeXBlTW92ZVJlcXVlc3Rvcn0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BNb3ZlUGFydGljaXBhbnQjZ2V0U2VhcmNoUmVxdWVzdG9yKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciBnZXRTZWFyY2hSZXF1ZXN0b3IoCi0JCQlJSmF2YUVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJCi0JCUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3Igc2VhcmNoUmVxdWVzdG9yID0gbnVsbDsKLQkJCi0JCWlmKGlzTGVnYWxFbGVtZW50VHlwZShlbGVtZW50KSkgewotCQkJc2VhcmNoUmVxdWVzdG9yID0gbmV3IEpTUFR5cGVNb3ZlUmVxdWVzdG9yKGVsZW1lbnQsIG5ld05hbWUpOwotCQl9Ci0JCQotCQlyZXR1cm4gc2VhcmNoUmVxdWVzdG9yOwotCX0KLQotCS8qKgotCSAqIDxwPkxlZ2FsIHR5cGVzIGFyZTogCi0JICogPHVsPjxsaT57QGxpbmsgSVR5cGV9PC9saT48L3VsPjwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BSZW5hbWVQYXJ0aWNpcGFudCNpc0xlZ2FsRWxlbWVudFR5cGUob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTGVnYWxFbGVtZW50VHlwZShJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOWM4YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQVHlwZU1vdmVSZXF1ZXN0b3IgZXh0ZW5kcyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIG5ld05hbWUKLQkgKi8KLQlwdWJsaWMgSlNQVHlwZU1vdmVSZXF1ZXN0b3IoSUphdmFFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdQYWNrYWdlKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG5ld1BhY2thZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yI2dldFJlbmFtZVRleHQob3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2gpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZW5hbWVUZXh0KEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlIHNlYXJjaERvYywgU2VhcmNoTWF0Y2ggamF2YU1hdGNoKSB7Ci0JCQotCQlTdHJpbmcgcmVuYW1lVGV4dCA9IGdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCi0JCUpTUFRyYW5zbGF0aW9uIHRyYW5zID0gc2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCk7Ci0JCVN0cmluZyBtYXRjaFRleHQgPSB0cmFucy5nZXRKYXZhVGV4dCgpLnN1YnN0cmluZyhqYXZhTWF0Y2guZ2V0T2Zmc2V0KCksIGphdmFNYXRjaC5nZXRPZmZzZXQoKSArIGphdmFNYXRjaC5nZXRMZW5ndGgoKSk7Ci0JCQotCQkvLyBpZiBpdCdzIGFuIGltcG9ydCBvciBqc3A6dXNlQmVhbiwgd2UgbmVlZCB0byBhZGQgdGhlIHBhY2thZ2UgbmFtZSBhcyB3ZWxsCi0JCWlmKHRyYW5zLmlzSW1wb3J0KGphdmFNYXRjaC5nZXRPZmZzZXQoKSkgfHwgdHJhbnMuaXNVc2VCZWFuKGphdmFNYXRjaC5nZXRPZmZzZXQoKSkgfHwgaXNGdWxseVF1YWxpZmllZChtYXRjaFRleHQpKSB7Ci0JCQlpZighZ2V0TmV3TmFtZSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBnZXROZXdOYW1lKCkgaXMgdGhlIHBrZyBuYW1lCi0JCQkJcmVuYW1lVGV4dCA9IGdldE5ld05hbWUoKSArICIuIiArIHJlbmFtZVRleHQ7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vaWYgdGhlIHJlbmFtZSB0ZXh0IGlzIHRoZSBzYW1lIGFzIHRoZSBtYXRjaCB0ZXh0IHRoZW4sIGRvbid0IHdhbnQgdG8gYm90aGVyIHJlbmFtaW5nIGFueXRoaW5nCi0JCWlmKHJlbmFtZVRleHQuZXF1YWxzKG1hdGNoVGV4dCkpIHsKLQkJCXJlbmFtZVRleHQgPSBudWxsOwotCQl9IAotCi0JCXJldHVybiByZW5hbWVUZXh0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCi0JCVN0cmluZyB0eXBlTmFtZSA9IGdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWUoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlNQVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzIsIG5ldyBTdHJpbmdbXXt0eXBlTmFtZSwgbmV3TmFtZX0pOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lQ2hhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZWE5NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZUNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotCi0vKioKLSAqIDxwPjxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzIGlzIG5vdCB1c2VkIGludGVybmFsbHkgYW55IGxvbmdlciBhbmQgd2lsbAotICogYmUgcmVtb3ZlZCBhdCBzb21lIHBvaW50LjwvcD4KLSAqIAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVSZW5hbWVDaGFuZ2UgZXh0ZW5kcyBDaGFuZ2UgewotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENoYW5nZVtdIGNyZWF0ZUNoYW5nZXNGb3IoSVR5cGUgdHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJSlNQU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkKLQkJLy8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgSlNQSW5kZXhNYW5hZ2VyCi0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMDM2Ci0JCS8vIHN1cHBvcnQuaW5kZXhXb3Jrc3BhY2VBbmRXYWl0KCk7Ci0JCi0JCQotCQlKU1BUeXBlUmVuYW1lUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBKU1BUeXBlUmVuYW1lUmVxdWVzdG9yKHR5cGUsIG5ld05hbWUpOwotCQlzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKHR5cGUsIG5ldyBKU1BTZWFyY2hTY29wZSgpLCByZXF1ZXN0b3IpOwotCi0JCXJldHVybiByZXF1ZXN0b3IuZ2V0Q2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpTUFVJTWVzc2FnZXMuSlNQX2NoYW5nZXM7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGRlY2lkZSBjb3JyZWN0IHZhbHVlIG9mIGlzVmFsaWQKLQl9Ci0KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIFRoaXMgbWV0aG9kIG11c3QgZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBvYmplY3QgaXMgc3RpbGwgdmFsaWQuCi0JCS8vIFRoaXMgaXMgaW4gcGFydGljdWxhciBpbnRlcmVzdGluZyB3aGVuIHBlcmZvcm1pbmcgYW4gdW5kbyBjaGFuZ2UKLQkJLy8gc2luY2UgdGhlIHdvcmtzcGFjZSBjb3VsZCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIHVuZG8gY2hhbmdlIGhhcwotCQkvLyBiZWVuIGNyZWF0ZWQuCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0KLQlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIHJldHVybiB0aGUgInVuZG8iIGNoYW5nZSBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMmU5NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotCi0vKioKLSAqIHtAbGluayBKU1BSZW5hbWVQYXJ0aWNpcGFudH0gdXNlZCB0byB1cGRhdGUgSlNQIGRvY3VtZW50cyB3aGVuIGEgSmF2YSB0eXBlIGlzIHJlbmFtZWQKLSAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIEpTUFJlbmFtZVBhcnRpY2lwYW50IHsKLQotCQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBuYW1lIG9mIHRoaXMgcGFydGljaXBhbnQgdG8gdGhlIG5hbWUgb2YgdGhlIHtAbGluayBJVHlwZX0KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKLQkJCXN1cGVyLmZOYW1lID0gKChJVHlwZSllbGVtZW50KS5nZXRFbGVtZW50TmFtZSgpOwotCQkJc3VjY2VzcyA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhIHtAbGluayBKU1BUeXBlUmVuYW1lUmVxdWVzdG9yfQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUFJlbmFtZVBhcnRpY2lwYW50I2dldFNlYXJjaFJlcXVlc3RvcihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgZ2V0U2VhcmNoUmVxdWVzdG9yKElKYXZhRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmV3TmFtZSkgewotCQkKLQkJQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciBzZWFyY2hSZXF1ZXN0b3IgPSBudWxsOwotCQkKLQkJaWYoaXNMZWdhbEVsZW1lbnRUeXBlKGVsZW1lbnQpKSB7Ci0JCQlzZWFyY2hSZXF1ZXN0b3IgPSBuZXcgSlNQVHlwZVJlbmFtZVJlcXVlc3RvcigoSVR5cGUpZWxlbWVudCwgbmV3TmFtZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBzZWFyY2hSZXF1ZXN0b3I7Ci0JfQotCi0JLyoqCi0JICogPHA+TGVnYWwgdHlwZXMgYXJlOiAKLQkgKiA8dWw+PGxpPntAbGluayBJVHlwZX08L2xpPjwvdWw+PC9wPgotCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQUmVuYW1lUGFydGljaXBhbnQjaXNMZWdhbEVsZW1lbnRUeXBlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0xlZ2FsRWxlbWVudFR5cGUoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM0MTc1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci0KLS8qKgotICogQ3JlYXRlcyBkb2N1bWVudCBjaGFuZ2UocykgZm9yIGEgdHlwZSByZW5hbWUuCi0gKiBDaGFuZ2VzIGFyZSBjcmVhdGVkIGZvciBldmVyeSB0eXBlICJtYXRjaCIgaW4gdGhlIHdvcmtzcGFjZQotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVSZW5hbWVSZXF1ZXN0b3IgZXh0ZW5kcyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIHsKLQotCXB1YmxpYyBKU1BUeXBlUmVuYW1lUmVxdWVzdG9yKElUeXBlIHR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXN1cGVyKHR5cGUsIG5ld05hbWUpOwotCX0KLQkKLQlwcml2YXRlIElUeXBlIGdldFR5cGUoKSB7Ci0JCXJldHVybiAoSVR5cGUpZ2V0RWxlbWVudCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbmFtZVRleHQoSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHsKLQkJCi0JCVN0cmluZyByZW5hbWVUZXh0ID0gZ2V0TmV3TmFtZSgpOwotCQkKLQkJU3RyaW5nIHBrZyA9IGdldFR5cGUoKS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQlJSmF2YUVsZW1lbnQgcGFyZW50ID0gZ2V0VHlwZSgpLmdldFBhcmVudCgpOwotCQlTdHJpbmcgcGFyZW50TmFtZSA9IChwYXJlbnQgIT0gbnVsbCkgPyBwYXJlbnQuZ2V0RWxlbWVudE5hbWUoKSA6IG51bGw7Ci0JCUpTUFRyYW5zbGF0aW9uIHRyYW5zID0gc2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCk7Ci0JCVN0cmluZyBtYXRjaFRleHQgPSB0cmFucy5nZXRKYXZhVGV4dCgpLnN1YnN0cmluZyhqYXZhTWF0Y2guZ2V0T2Zmc2V0KCksIGphdmFNYXRjaC5nZXRPZmZzZXQoKSArIGphdmFNYXRjaC5nZXRMZW5ndGgoKSk7Ci0JCQotCQkvLyBpZiBpdCdzIGFuIGltcG9ydCBvciBqc3A6dXNlQmVhbiBvciBmdWxseSBxdWFsaWZpZWQgdHlwZSwgd2UgbmVlZCB0byBhZGQgdGhlIHBhY2thZ2UgbmFtZSBhcyB3ZWxsCi0JCS8vIGVsc2UgaWYgc3RhcnRzIHdpdGggcGFyZW50IG5hbWUgc3VjaCBhcyAiTXlDbGFzcy5FbnVtIiB0aGVuIG5lZWQgdG8gYWRkIHRoZSBwYXJlbnQgbmFtZSBhcyB3ZWxsCi0JCWlmKHRyYW5zLmlzSW1wb3J0KGphdmFNYXRjaC5nZXRPZmZzZXQoKSkgfHwgaXNGdWxseVF1YWxpZmllZChtYXRjaFRleHQpKSB7Ci0JCQlpZighcGtnLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZW5hbWVUZXh0ID0gcGtnICsgIi4iICsgcmVuYW1lVGV4dDsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYocGFyZW50TmFtZSAhPSBudWxsICYmIG1hdGNoVGV4dC5zdGFydHNXaXRoKHBhcmVudE5hbWUpKSB7Ci0JCQlyZW5hbWVUZXh0ID0gcGFyZW50TmFtZSArICIuIiArIHJlbmFtZVRleHQ7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVuYW1lVGV4dDsKLQl9Ci0JCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCi0JCVN0cmluZyB0eXBlTmFtZSA9IGdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWUoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlNQVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzQsIG5ldyBTdHJpbmdbXXt0eXBlTmFtZSwgbmV3TmFtZX0pOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9Nb3ZlRWxlbWVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL01vdmVFbGVtZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWFiYmYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL01vdmVFbGVtZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgaGFuZGxlciB0aGF0IGxhdW5jaGVzIEpEVCBtb3ZlIGVsZW1lbnQgd2l6YXJkCi0gKiAKLSAqIFN0aWxsIHJlbGllcyBoZWF2aWx5IG9uIGludGVybmFsIEFQSQotICogd2lsbCBjaGFuZ2UgcG9zdCAzLjAgd2l0aCBwdWJsaWMgbW92ZSBzdXBwb3J0Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE4MTcgCi0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlRWxlbWVudEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotLy8JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGFyZzApIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkvLyBuby1vcCB1bnRpbCB3ZSBrbm93IGhvdyB3ZSdyZSBzdXBwb3NlZCB0byB1c2UgdGhpcyAKLQkJLy8gZWNsaXBzZSAzLjJNNQotCQkvLyBwdWJsaWMgbW92ZSBzdXBwb3J0OiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE4MTcKLQkJCi0vLwkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKCk7Ci0vLwkJaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLS8vCi0vLwkJCS8vIG5lZWQgdG8gY2hlY2sgaWYgaXQncyBtb3ZhYmxlCi0vLwkJCXRyeSB7Ci0vLwkJCQlKYXZhTW92ZVByb2Nlc3NvciBwcm9jZXNzb3IgPSBKYXZhTW92ZVByb2Nlc3Nvci5jcmVhdGUoZ2V0UmVzb3VyY2VzKGVsZW1lbnRzKSwgZWxlbWVudHMpOwotLy8JCQkJCi0vLwkJCQlTaGVsbCBwYXJlbnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0vLwkJCQlNb3ZlUmVmYWN0b3JpbmcgcmVmYWN0b3JpbmcgPSBuZXcgTW92ZVJlZmFjdG9yaW5nKHByb2Nlc3Nvcik7Ci0vLwotLy8JCQkJUmVmYWN0b3JpbmdXaXphcmQgd2l6YXJkID0gY3JlYXRlV2l6YXJkKHJlZmFjdG9yaW5nKTsKLS8vCi0vLwkJCQkvKgotLy8JCQkJICogV2Ugd2FudCB0byBnZXQgdGhlIHNoZWxsIGZyb20gdGhlIHJlZmFjdG9yaW5nIGRpYWxvZyBidXQKLS8vCQkJCSAqIGl0J3Mgbm90IGtub3duIGF0IHRoaXMgcG9pbnQsIHNvIHdlIHBhc3MgdGhlIHdpemFyZCBhbmQKLS8vCQkJCSAqIHRoZW4sIG9uY2UgdGhlIGRpYWxvZyBpcyBvcGVuLCB3ZSB3aWxsIGhhdmUgYWNjZXNzIHRvIGl0cwotLy8JCQkJICogc2hlbGwuCi0vLwkJCQkgKi8KLS8vCi0vLwkJCQlwcm9jZXNzb3Iuc2V0Q3JlYXRlVGFyZ2V0UXVlcmllcyhuZXcgQ3JlYXRlVGFyZ2V0UXVlcmllcyh3aXphcmQpKTsKLS8vCQkJCXByb2Nlc3Nvci5zZXRSZW9yZ1F1ZXJpZXMobmV3IFJlb3JnUXVlcmllcyh3aXphcmQpKTsKLS8vCQkJCS8vIFN0cmluZyBvcGVuUmVmYWN0b3JpbmdXaXpNc2cgPQotLy8JCQkJLy8gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIk9wZW5SZWZhY3RvcmluZ1dpemFyZEFjdGlvbi5yZWZhY3RvcmluZyIpOwotLy8JCQkJLy8gLy8kTk9OLU5MUy0xJAotLy8JCQkJU3RyaW5nIG9wZW5SZWZhY3RvcmluZ1dpek1zZyA9IEpTUFVJTWVzc2FnZXMuTW92ZUVsZW1lbnRXaXphcmQ7IC8vICJNb3ZlCi0vLwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdGhlCi0vLwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gc2VsZWN0ZWQKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBlbGVtZW50cyI7Ci0vLwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotLy8JCQkJbmV3IFJlZmFjdG9yaW5nU3RhcnRlcigpLmFjdGl2YXRlKHJlZmFjdG9yaW5nLCB3aXphcmQsIHBhcmVudCwgb3BlblJlZmFjdG9yaW5nV2l6TXNnLCB0cnVlKTsKLS8vCi0vLwkJCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmNsZWFyU3RhdHVzTGluZSgpOwotLy8KLS8vCQkJfQotLy8JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLS8vCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJZWxzZSB7Ci0vLwkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuZGlzcGxheUVycm9yTWVzc2FnZShKU1BVSU1lc3NhZ2VzLkpTUE1vdmVFbGVtZW50QWN0aW9uXzApOyAvLyROT04tTkxTLTEkCi0vLwkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL1JlbmFtZUVsZW1lbnRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9SZW5hbWVFbGVtZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDM5OWY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL1JlbmFtZUVsZW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnJlZmFjdG9yaW5nLlJlbmFtZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotcHVibGljIGNsYXNzIFJlbmFtZUVsZW1lbnRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0JCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZkVkaXRvciA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZUVkaXRvcihldmVudCk7Ci0JCQotCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGdldFNlbGVjdGVkRWxlbWVudCgpOwotCQlpZihlbGVtZW50ICE9IG51bGwpIHsKLQkJCVJlbmFtZVN1cHBvcnQgcmVuYW1lU3VwcG9ydCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXN3aXRjaChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRToKLQkJCQkJCXJlbmFtZVN1cHBvcnQ9IFJlbmFtZVN1cHBvcnQuY3JlYXRlKChJVHlwZSllbGVtZW50LCBlbGVtZW50LmdldEVsZW1lbnROYW1lKCksIFJlbmFtZVN1cHBvcnQuVVBEQVRFX1JFRkVSRU5DRVMpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRDoKLQkJCQkJCXJlbmFtZVN1cHBvcnQ9IFJlbmFtZVN1cHBvcnQuY3JlYXRlKChJTWV0aG9kKWVsZW1lbnQsIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSwgUmVuYW1lU3VwcG9ydC5VUERBVEVfUkVGRVJFTkNFUyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVDoKLQkJCQkJCXJlbmFtZVN1cHBvcnQ9IFJlbmFtZVN1cHBvcnQuY3JlYXRlKChJUGFja2FnZUZyYWdtZW50KWVsZW1lbnQsIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSwgUmVuYW1lU3VwcG9ydC5VUERBVEVfUkVGRVJFTkNFUyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJSmF2YUVsZW1lbnQuRklFTEQ6Ci0JCQkJCQlyZW5hbWVTdXBwb3J0ID0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoKElGaWVsZCllbGVtZW50LCBlbGVtZW50LmdldEVsZW1lbnROYW1lKCksIFJlbmFtZVN1cHBvcnQuVVBEQVRFX1JFRkVSRU5DRVMpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmKHJlbmFtZVN1cHBvcnQgIT0gbnVsbCkgewotCQkJCQlyZW5hbWVTdXBwb3J0Lm9wZW5EaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpKTsKLQkJCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5jbGVhclN0YXR1c0xpbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQllbHNlICB7Ci0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5KU1BSZW5hbWVFbGVtZW50QWN0aW9uXzApOyAvLyROT04tTkxTLTEkCi0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElKYXZhRWxlbWVudCBnZXRTZWxlY3RlZEVsZW1lbnQoKSB7Ci0JCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJaWYgKGZFZGl0b3IgIT0gbnVsbCkgewotCQkJSVRleHRFZGl0b3IgZWRpdG9yID0gKElUZXh0RWRpdG9yKSAoKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgPyBmRWRpdG9yIDogZkVkaXRvci5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IEpTUEphdmFTZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oZWRpdG9yKTsKLQkJCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDEpCi0JCQkJCWVsZW1lbnQgPSBlbGVtZW50c1swXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9CYXNpY0pTUFNlYXJjaFJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0Jhc2ljSlNQU2VhcmNoUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhY2I3YmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0Jhc2ljSlNQU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZTsKLQotLyoqCi0gKiBBY2NlcHRzIG1hdGNoZXMgZnJvbSBKU1BTZWFyY2hTdXBwb3J0LnNlYXJjaCguLi4pIHJlcXVlc3QuCi0gKiBBZGFwdHMgdGhlIHJlc3VsdHMgZnJvbSBqYXZhIHRvIEpTUCBhbmQgZGlzcGxheXMgaW4gdGhlIFNlYXJjaFJlc3VsdFZpZXcuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY0pTUFNlYXJjaFJlcXVlc3RvciBleHRlbmRzIFNlYXJjaFJlcXVlc3RvciB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWU9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwc2VhcmNoIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUc9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIE1hcHMgamF2YSBzZWFyY2ggY29vcmRpbmF0ZXMgdG8gY29ycmVzcG9uZGluZyBKU1AgY29vcmRpbmF0ZXMuCi0JICogQWRkcyB0aGUgbWF0Y2hlcyB0byB0aGUgU2VhcmNoIFJlc3VsdHMgdmlldy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3IjYWNjZXB0U2VhcmNoTWF0Y2gob3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2VwdFNlYXJjaE1hdGNoKFNlYXJjaE1hdGNoIG1hdGNoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYoSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQkJCQkKLQkJU3RyaW5nIG1hdGNoRG9jdW1lbnRQYXRoID0gbWF0Y2guZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCVNlYXJjaERvY3VtZW50IHNlYXJjaERvYyA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5nZXRTZWFyY2hEb2N1bWVudChtYXRjaERvY3VtZW50UGF0aCk7Ci0JCQotCQlpZiAoc2VhcmNoRG9jICE9IG51bGwgJiYgc2VhcmNoRG9jIGluc3RhbmNlb2YgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUpIHsKLQkJCUphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlIGphdmFTZWFyY2hEb2MgPSAoSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUpc2VhcmNoRG9jOwotCQkJaW50IGpzcFN0YXJ0ID0gamF2YVNlYXJjaERvYy5nZXRKc3BPZmZzZXQobWF0Y2guZ2V0T2Zmc2V0KCkpOwotCQkJaW50IGpzcEVuZCA9IGphdmFTZWFyY2hEb2MuZ2V0SnNwT2Zmc2V0KG1hdGNoLmdldE9mZnNldCgpICsgbWF0Y2guZ2V0TGVuZ3RoKCkpOwotCi0JCQlKU1BUcmFuc2xhdGlvbiB0cmFucyA9IGphdmFTZWFyY2hEb2MuZ2V0SnNwVHJhbnNsYXRpb24oKTsKLQkJCVN0cmluZyBqc3BUZXh0ID0gdHJhbnMuZ2V0SnNwVGV4dCgpOwotCQkJU3RyaW5nIGphdmFUZXh0ID0gamF2YVNlYXJjaERvYy5nZXRKYXZhVGV4dCgpOwotCi0JCQlpZiAoREVCVUcpIAotCQkJCWRpc3BsYXlEZWJ1Z0luZm8obWF0Y2gsIGpzcFN0YXJ0LCBqc3BFbmQsIGpzcFRleHQsIGphdmFUZXh0KTsKLQkJCi0JCQlpZiAoanNwU3RhcnQgPiAtMSAmJiBqc3BFbmQgPiAtMSkKLQkJCQlhZGRTZWFyY2hNYXRjaChuZXcgRG9jdW1lbnQodHJhbnMuZ2V0SnNwVGV4dCgpKSwgamF2YVNlYXJjaERvYy5nZXRGaWxlKCksIGpzcFN0YXJ0LCBqc3BFbmQsIGpzcFRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNlYXJjaERvYwotCSAqIEBwYXJhbSBqc3BTdGFydAotCSAqIEBwYXJhbSBqc3BFbmQKLQkgKiBAcGFyYW0ganNwVHJhbnNsYXRpb24KLQkgKiBAcGFyYW0ganNwVGV4dAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlYXJjaE1hdGNoKElEb2N1bWVudCBqc3BEb2N1bWVudCwgSUZpbGUganNwRmlsZSwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBTdHJpbmcganNwVGV4dCkgewotCQkvLyBpbXBsZW1lbnQgaW4gc3ViY2xhc3MKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3IjYmVnaW5SZXBvcnRpbmcoKQotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luUmVwb3J0aW5nKCkgewotCi0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQIFNlYXJjaCByZXF1ZXN0b3I6IGJlZ2luUmVwb3J0aW5nKCkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvciNlbmRSZXBvcnRpbmcoKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFJlcG9ydGluZygpIHsKLQotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBTZWFyY2ggcmVxdWVzdG9yOiBlbmRSZXBvcnRpbmcoKSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2VudGVyUGFydGljaXBhbnQob3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVudGVyUGFydGljaXBhbnQoU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQpIHsKLQotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBTZWFyY2ggcmVxdWVzdG9yOiBlbnRlclBhcnRpY2lwYW50KCkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvciNleGl0UGFydGljaXBhbnQob3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGV4aXRQYXJ0aWNpcGFudChTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCkgewotCi0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQIFNlYXJjaCByZXF1ZXN0b3I6IGV4aXRQYXJ0aWNpcGFudCgpIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBGb3IgZGVidWcuCi0JICogQHBhcmFtIG9yaWdNYXRjaAotCSAqIEBwYXJhbSBqc3BTdGFydAotCSAqIEBwYXJhbSBqc3BFbmQKLQkgKiBAcGFyYW0ganNwVGV4dAotCSAqIEBwYXJhbSBqYXZhVGV4dAotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNwbGF5RGVidWdJbmZvKFNlYXJjaE1hdGNoIG9yaWdNYXRjaCwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBTdHJpbmcganNwVGV4dCwgU3RyaW5nIGphdmFUZXh0KSB7Ci0KLQkJaWYgKG9yaWdNYXRjaCA9PSBudWxsIHx8IGpzcFN0YXJ0ID09IC0xIHx8IGpzcEVuZCA9PSAtMSB8fCBqc3BFbmQgPCBqc3BTdGFydCB8fCBqc3BUZXh0ID09IG51bGwgfHwgamF2YVRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oImFjY2VwdCBwb3NzaWJsZSBtYXRjaCBbanNwRG9jOiAiICsgb3JpZ01hdGNoLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkgKyAiICIgKyBvcmlnTWF0Y2guZ2V0T2Zmc2V0KCkgKyAiOiIgKyBvcmlnTWF0Y2guZ2V0T2Zmc2V0KCkgKyBvcmlnTWF0Y2guZ2V0TGVuZ3RoKCkgKyAiXT8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm1hdGNoIGluZm86Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJ0aGUgamF2YSB0ZXh0IGlzOiIgKyBqYXZhVGV4dC5zdWJzdHJpbmcob3JpZ01hdGNoLmdldE9mZnNldCgpLCBvcmlnTWF0Y2guZ2V0T2Zmc2V0KCkgKyBvcmlnTWF0Y2guZ2V0TGVuZ3RoKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oImphdmEgc2VhcmNoIG1hdGNoIHRyYW5zbGF0ZXMgdG8ganNwIGNvb3JkcyBbc3RhcnQ6ICIgKyBqc3BTdGFydCArICIgZW5kOiIgKyBqc3BFbmQgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiB0aGUganNwIHRleHQgaXM6IiArIGpzcFRleHQuc3Vic3RyaW5nKGpzcFN0YXJ0LCBqc3BFbmQpKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OTdkZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zZWFyY2guSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5GaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBTZXRzIHVwIEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIGZvciBqc3AgZmluZCBvY2N1cnJlbmNlcyBwcm9jZXNzb3JzCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIExpc3QgZlByb2Nlc3NvcnM7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRQcm9jZXNzb3JzKCkgewotCQlpZiAoZlByb2Nlc3NvcnMgPT0gbnVsbCkgewotCQkJZlByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlIVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGh0bWxQcm9jZXNzb3IgPSBuZXcgSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcigpOwotCQkJZlByb2Nlc3NvcnMuYWRkKGh0bWxQcm9jZXNzb3IpOwotCQkJSlNQRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGpzcFByb2Nlc3NvciA9IG5ldyBKU1BGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IoKTsKLQkJCWZQcm9jZXNzb3JzLmFkZChqc3BQcm9jZXNzb3IpOwotCQl9Ci0JCXJldHVybiBmUHJvY2Vzc29yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZmZmOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5JSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXh0LklKU1BQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5GaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLS8qKgotICogQ29uZmlndXJlcyBhIEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciB3aXRoIEpTUCBwYXJ0aXRpb25zIGFuZCByZWdpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZXh0ZW5kcyBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgewotCi0JcHVibGljIGJvb2xlYW4gZmluZE9jY3VycmVuY2VzKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiwgSUZpbGUgZmlsZSkgewotCQlib29sZWFuIGZpbmRPY2N1cnJlbmNlcyA9IGZhbHNlOwotCi0JCS8vIGRldGVybWluZSBpZiBhY3Rpb24gc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50OwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQkJCWlmIChzZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJSVRleHRSZWdpb24gciA9IHNkUmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCWlmIChyICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHR5cGUgPSByLmdldFR5cGUoKTsKLQkJCQkJaWYgKGVuYWJsZWRGb3JSZWdpb25UeXBlKHR5cGUpKSB7Ci0JCQkJCQlTdHJpbmcgbWF0Y2hUZXh0ID0gc2RSZWdpb24uZ2V0VGV4dChyKTsKLQotCQkJCQkJaWYgKG1hdGNoVGV4dCAhPSBudWxsICYmIHR5cGUgIT0gbnVsbCkgewotCQkJCQkJCUpTUFNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5ID0gKEpTUFNlYXJjaFF1ZXJ5KSBnZXRTZWFyY2hRdWVyeShmaWxlLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIG1hdGNoVGV4dCwgdHlwZSwgdGV4dFNlbGVjdGlvbik7Ci0JCQkJCQkJZmluZE9jY3VycmVuY2VzID0gdHJ1ZTsKLQkJCQkJCQlpZiAoc2VhcmNoUXVlcnkgIT0gbnVsbCkgewotCQkJCQkJCQlpZihzZWFyY2hRdWVyeS5nZXRTZWFyY2hUZXh0KCkgPT0gbnVsbCB8fCBzZWFyY2hRdWVyeS5nZXRTZWFyY2hUZXh0KCkubGVuZ3RoKCkgPT0gMCkKLQkJCQkJCQkJCWZpbmRPY2N1cnJlbmNlcyA9IGZhbHNlOwotCQkJCQkJCQllbHNlCi0JCQkJCQkJCXsKLQkJCQkJCQkJCS8vIGZpcnN0IG9mIGFsbCBhY3RpdmF0ZSB0aGUgdmlldwotCQkJCQkJCQkJTmV3U2VhcmNoVUkuYWN0aXZhdGVTZWFyY2hSZXN1bHRWaWV3KCk7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCWlmIChzZWFyY2hRdWVyeS5jYW5SdW5JbkJhY2tncm91bmQoKSkKLQkJCQkJCQkJCQlOZXdTZWFyY2hVSS5ydW5RdWVyeUluQmFja2dyb3VuZChzZWFyY2hRdWVyeSk7Ci0JCQkJCQkJCQllbHNlCi0JCQkJCQkJCQkJTmV3U2VhcmNoVUkucnVuUXVlcnlJbkZvcmVncm91bmQobnVsbCwgc2VhcmNoUXVlcnkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmaW5kT2NjdXJyZW5jZXM7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRQYXJ0aXRpb25UeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVCwgSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQX07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFJlZ2lvblR5cGVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0RPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlR9OwotCX0KLQotCXByb3RlY3RlZCBJU2VhcmNoUXVlcnkgZ2V0U2VhcmNoUXVlcnkoSUZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIHJlZ2lvblRleHQsIFN0cmluZyByZWdpb25UeXBlLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgSlNQU2VhcmNoUXVlcnkoZmlsZSwgZ2V0SmF2YUVsZW1lbnQoZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24pKTsKLQl9Ci0KLQlwcml2YXRlIElKYXZhRWxlbWVudCBnZXRKYXZhRWxlbWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBnZXRKYXZhRWxlbWVudHNGb3JDdXJyZW50U2VsZWN0aW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQkJcmV0dXJuIGVsZW1lbnRzLmxlbmd0aCA+IDAgPyBlbGVtZW50c1swXSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogdXNlcyBKU1BUcmFuc2xhdGlvbiB0byBnZXQgY3VycmVudGx5IHNlbGVjdGVkIEphdmEgZWxlbWVudHMuCi0JICogCi0JICogQHJldHVybiBjdXJyZW50bHkgc2VsZWN0ZWQgSUphdmFFbGVtZW50cwotCSAqLwotCXByaXZhdGUgSUphdmFFbGVtZW50W10gZ2V0SmF2YUVsZW1lbnRzRm9yQ3VycmVudFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbMF07Ci0JCS8vIGdldCBKU1AgdHJhbnNsYXRpb24gb2JqZWN0IGZvciB0aGlzIHZpZXdlcidzIGRvY3VtZW50Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJdHJ5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJSURPTURvY3VtZW50IHhtbERvYyA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQlKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKU1BUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlKU1BUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IGFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24oKTsKLQotCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyMjExCi0JCQkJCWVsZW1lbnRzID0gdHJhbnNsYXRpb24uZ2V0RWxlbWVudHNGcm9tSnNwUmFuZ2Uoc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzllNGJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5PY2N1cnJlbmNlc1NlYXJjaFJlc3VsdDsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQgZXh0ZW5kcyBPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdCB7Ci0JCi0JcHVibGljIEpTUE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0KElTZWFyY2hRdWVyeSBxdWVyeSkgewotCQlzdXBlcihxdWVyeSk7Ci0JfQotCQotCXB1YmxpYyBNYXRjaFtdIGdldE1hdGNoZXMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRNYXRjaGVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFF1ZXJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVlZjgzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guQmFzaWNTZWFyY2hRdWVyeTsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5JU2VhcmNoUXVlcnk8L2NvZGU+IGZvciA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+cyBpbiBKU1AgZmlsZXMuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BTZWFyY2hRdWVyeSBleHRlbmRzIEJhc2ljU2VhcmNoUXVlcnkgewotCQotCS8qKiB0aGUgSUphdmFFbGVtZW50IHdlIGFyZSBzZWFyY2hpbmcgZm9yIGluIHRoZSBmaWxlICoqLwotCXByaXZhdGUgSUphdmFFbGVtZW50IGZFbGVtZW50ID0gbnVsbDsKLQkKLQlwdWJsaWMgSlNQU2VhcmNoUXVlcnkoSUZpbGUgZmlsZSwgSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoZmlsZSk7Ci0JCXN1cGVyLnNldFJlc3VsdChuZXcgSlNQT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQodGhpcykpOwotCQl0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0JCi0JcHVibGljIElKYXZhRWxlbWVudCBnZXRKYXZhRWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZkVsZW1lbnQ7Ci0JfQotCQotCS8vIGZvciBhY2Nlc3MgYnkgaW5uZXIgY2xhc3MKLQlwdWJsaWMgSlNQU2VhcmNoUXVlcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1F1ZXJ5KCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCXRyeSB7Ci0JCQlKU1BTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCQkvLyBpbmRleCB0aGUgZmlsZQotCQkJU2VhcmNoRG9jdW1lbnQgZGVsZWdhdGUgPSAgc3VwcG9ydC5hZGRKc3BGaWxlKGdldEZpbGUoKSk7Ci0JCQkKLQkJCVN0cmluZyBzY29wZVBhdGggPSBkZWxlZ2F0ZS5nZXRQYXRoKCk7Ci0JCQlKU1BTZWFyY2hTY29wZSBzaW5nbGVGaWxlU2NvcGUgPSBuZXcgSlNQU2VhcmNoU2NvcGUobmV3IFN0cmluZ1tde2dldEZpbGUoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHNjb3BlUGF0aH0pOwotCQkJCi0JCQkvLyBwZXJmb3JtIGEgc2VhcmNocwotCQkJLy8gYnkgcGFzc2luZyBpbiB0aGlzIGpzcCBzZWFyY2ggcXVlcnksIHJlcXVzdG9yIGNhbiBhZGQgbWF0Y2hlcwotCQkJc3VwcG9ydC5zZWFyY2hSdW5uYWJsZShnZXRKYXZhRWxlbWVudCgpLCBzaW5nbGVGaWxlU2NvcGUsIG5ldyBKU1BTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yKGdldEluc3RhbmNlKCkpKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIsIElTdGF0dXMuT0ssICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlTdHJpbmcgbGFiZWwgPSBKU1BVSU1lc3NhZ2VzLk9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMDsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBhcmdzID0ge2dldFNlYXJjaFRleHQoKSwgIiIgKyBzdXBlci5nZXRNYXRjaENvdW50KCksIGdldEZpbGVuYW1lKCl9OwotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobGFiZWwsIGFyZ3MpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEZpbGVuYW1lKCkgewotCQlTdHJpbmcgZmlsZW5hbWUgPSBKU1BVSU1lc3NhZ2VzLk9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMjsKLQkJaWYoZ2V0RmlsZSgpICE9IG51bGwpCi0JCQlmaWxlbmFtZSA9IGdldEZpbGUoKS5nZXROYW1lKCk7Ci0JCXJldHVybiBmaWxlbmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlYXJjaFRleHQoKSB7Ci0JCWlmKGZFbGVtZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gZkVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLQkJcmV0dXJuICIiOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXJ1bigpIHsKLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjY2FuUnVuSW5CYWNrZ3JvdW5kKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW5JbkJhY2tncm91bmQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNiNGFlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLklTZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQU2VhcmNoUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNKU1BTZWFyY2hSZXF1ZXN0b3IgewotCQotCXByaXZhdGUgSVNlYXJjaFJlcXVlc3RvciBmSmF2YVJlcXVlc3RvciA9IG51bGw7Ci0JCi0JcHVibGljIEpTUFNlYXJjaFJlcXVlc3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIEpTUFNlYXJjaFJlcXVlc3RvcihJU2VhcmNoUmVxdWVzdG9yIGphdmFSZXF1ZXN0b3IpIHsKLQkJLy8gbmVlZCB0byByZXBvcnQgbWF0Y2hlcyB0byBqYXZhUmVxdWVzdG9yCi0JCXRoaXMuZkphdmFSZXF1ZXN0b3IgPSBqYXZhUmVxdWVzdG9yOwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIGFkZFNlYXJjaE1hdGNoKElEb2N1bWVudCBqc3BEb2N1bWVudCwgSUZpbGUganNwRmlsZSwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBTdHJpbmcganNwVGV4dCkgewotCQkKLQkJaWYoIWpzcEZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0KLQkJaW50IGxpbmVOdW1iZXIgPSAtMTsKLQkJdHJ5IHsKLQkJCWxpbmVOdW1iZXIgPSBqc3BEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoanNwU3RhcnQpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJvZmZzZXQ6ICIgKyBJbnRlZ2VyLnRvU3RyaW5nKGpzcFN0YXJ0KSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljcmVhdGVTZWFyY2hNYXJrZXIoanNwRmlsZSwganNwU3RhcnQsIGpzcEVuZCwgbGluZU51bWJlcik7Ci0JCQotCQlpZih0aGlzLmZKYXZhUmVxdWVzdG9yICE9IG51bGwpIHsKLQkJCU1hdGNoIG1hdGNoID0gbmV3IE1hdGNoKGpzcEZpbGUsIGpzcFN0YXJ0LCBqc3BFbmQgLSBqc3BTdGFydCk7Ci0JCQl0aGlzLmZKYXZhUmVxdWVzdG9yLnJlcG9ydE1hdGNoKG1hdGNoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBqc3BGaWxlCi0JICogQHBhcmFtIGpzcFN0YXJ0Ci0JICogQHBhcmFtIGpzcEVuZAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWFyY2hNYXJrZXIoSUZpbGUganNwRmlsZSwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBpbnQgbGluZU51bWJlcikgewotCQkKLQkJdHJ5IHsKLQkJCUlNYXJrZXIgbWFya2VyID0ganNwRmlsZS5jcmVhdGVNYXJrZXIoTmV3U2VhcmNoVUkuU0VBUkNIX01BUktFUik7Ci0JCQlIYXNoTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCg0KTsKLQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgbmV3IEludGVnZXIoanNwU3RhcnQpKTsKLQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9FTkQsIG5ldyBJbnRlZ2VyKGpzcEVuZCkpOwotCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5MSU5FX05VTUJFUiwgbmV3IEludGVnZXIobGluZU51bWJlcikpOwotCQkJbWFya2VyLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JCQkKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNpbmdsZUZpbGVTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMDc5MmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNpbmdsZUZpbGVTZWFyY2hSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiA8cD4KLSAqIFNwZWNpYWwgcmVxdWVzdG9yIHRoYXQgYWRkcyBzZWFyY2ggcmVzdWx0cyBmb3Igc2luZ2xlIGZpbGUgc2VhcmNoCi0gKiAoVXNlZCBmb3IgSlNQRmluZE9jY3VycmVuY2VzIGFjdGlvbikuCi0gKiBJdCBncm91cHMgZWFjaCBtYXRjaCBhcyBpdCdzIG93biByZXN1bHQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNKU1BTZWFyY2hSZXF1ZXN0b3IgewotCi0JcHJpdmF0ZSBKU1BTZWFyY2hRdWVyeSBmUXVlcnkgPSBudWxsOwotCQotCXB1YmxpYyBKU1BTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yKEpTUFNlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCXRoaXMuZlF1ZXJ5ID0gcXVlcnk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFNlYXJjaE1hdGNoKElEb2N1bWVudCBqc3BEb2N1bWVudCwgSUZpbGUganNwRmlsZSwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBTdHJpbmcganNwVGV4dCkgewotCQkvLyBhZGQgbWF0Y2ggdG8gSlNQIHF1ZXJ5Li4uCi0JCXRoaXMuZlF1ZXJ5LmFkZE1hdGNoKGpzcERvY3VtZW50LCBqc3BTdGFydCwganNwRW5kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSlNQTWF0Y2hQcmVzZW50YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC91aS9KU1BNYXRjaFByZXNlbnRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGIxYTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC91aS9KU1BNYXRjaFByZXNlbnRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JTWF0Y2hQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5CYXNpY1NlYXJjaExhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUE1hdGNoUHJlc2VudGF0aW9uIGltcGxlbWVudHMgSU1hdGNoUHJlc2VudGF0aW9uIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JTWF0Y2hQcmVzZW50YXRpb24jY3JlYXRlTGFiZWxQcm92aWRlcigpCi0JICovCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGNyZWF0ZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgQmFzaWNTZWFyY2hMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JTWF0Y2hQcmVzZW50YXRpb24jc2hvd01hdGNoKG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoLCBpbnQsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93TWF0Y2goTWF0Y2ggbWF0Y2gsIGludCBjdXJyZW50T2Zmc2V0LCBpbnQgY3VycmVudExlbmd0aCwgYm9vbGVhbiBhY3RpdmF0ZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLS8vCQlPYmplY3Qgb2JqID0gbWF0Y2guZ2V0RWxlbWVudCgpOwotCQkvLyBzaG93IG1hdGNoIGluIEpTUCBlZGl0b3IKLQkJaWYoYWN0aXZhdGUpIHsKLQkJCS8vIHVzZSBzaG93IGluIHRhcmdldD8KLQkJfQotCQllbHNlIHsKLQkJCS8vIGp1c3Qgc2VsZWN0Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSlNQUXVlcnlQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL3VpL0pTUFF1ZXJ5UGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk5ZjI3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSlNQUXVlcnlQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guRWxlbWVudFF1ZXJ5U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLklNYXRjaFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLklRdWVyeVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSVNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLlBhdHRlcm5RdWVyeVNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5RdWVyeVNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BVSVByZWZlcmVuY2VOYW1lczsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeSAKLSAqLwotcHVibGljIGNsYXNzIEpTUFF1ZXJ5UGFydGljaXBhbnQgaW1wbGVtZW50cyBJUXVlcnlQYXJ0aWNpcGFudCB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWU9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwc2VhcmNoIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUc9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JUXVlcnlQYXJ0aWNpcGFudCNzZWFyY2gob3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JU2VhcmNoUmVxdWVzdG9yLCBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLlF1ZXJ5U3BlY2lmaWNhdGlvbiwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2VhcmNoKElTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBRdWVyeVNwZWNpZmljYXRpb24gcXVlcnlTcGVjaWZpY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCWlmKHNob3VsZFN1cHBseUpTUFNlYXJjaFJlc3VsdHNUb0phdmFTZWFyY2goKSkgewotCQkJLy9pbmRleElmTmVlZGVkKCk7Ci0JCQkKLQkJCS8vIGRvIHNlYXJjaCBiYXNlZCBvbiB0aGUgcGFydGljdWxhciBKYXZhIHF1ZXJ5Ci0JCQlpZihxdWVyeVNwZWNpZmljYXRpb24gaW5zdGFuY2VvZiBFbGVtZW50UXVlcnlTcGVjaWZpY2F0aW9uKSB7Ci0JCQkJLy8gZWxlbWVudCBzZWFyY2ggKGVnLiBmcm9tIGdsb2JhbCBmaW5kIHJlZmVyZW5jZXMgaW4gSmF2YSBmaWxlKQotCQkJCUVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb24gZWxlbWVudFF1ZXJ5ID0gKEVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb24pcXVlcnlTcGVjaWZpY2F0aW9uOwotCQkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudFF1ZXJ5LmdldEVsZW1lbnQoKTsKLQkJCQkKLQkJCQlpZihERUJVRykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1AgUXVlcnkgUGFydGljaXBhbnQgc2VhcmNoaW5nIG9uIEVMRU1FTlQ6ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJCQotCQkJCVNlYXJjaFJlcXVlc3RvciBqc3BSZXF1ZXN0b3IgPSBuZXcgSlNQU2VhcmNoUmVxdWVzdG9yKHJlcXVlc3Rvcik7Ci0JCQkJCi0JCQkJLy8gcGFfVE9ETyBuZWVkIHRvIGFkYXB0IEphdmFTZWFyY2hTY29wZSB0byBhIEpTUFNlYXJjaFNjb3BlCi0JCQkJSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLnNlYXJjaChlbGVtZW50LCBuZXcgSlNQU2VhcmNoU2NvcGUoKSwganNwUmVxdWVzdG9yKTsKLQkJCQkKLQkJCX0KLQkJCWVsc2UgaWYocXVlcnlTcGVjaWZpY2F0aW9uIGluc3RhbmNlb2YgUGF0dGVyblF1ZXJ5U3BlY2lmaWNhdGlvbikgewotCQkJCQotCQkJCS8vIHBhdHRlcm4gc2VhcmNoIChlZy4gZnJvbSBKYXZhIHNlYXJjaCBwYWdlKQotCQkJCVBhdHRlcm5RdWVyeVNwZWNpZmljYXRpb24gcGF0dGVyblF1ZXJ5ID0gKFBhdHRlcm5RdWVyeVNwZWNpZmljYXRpb24pcXVlcnlTcGVjaWZpY2F0aW9uOwotCQkJCVN0cmluZyBwYXR0ZXJuID0gcGF0dGVyblF1ZXJ5LmdldFBhdHRlcm4oKTsKLQkJCQkKLQkJCQlpZihERUJVRykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1AgUXVlcnkgUGFydGljaXBhbnQgc2VhcmNoaW5nIG9uIFBBVFRFUk46ICIgKyBwYXR0ZXJuKTsgLy8kTk9OLU5MUy0xJAotCQkJCQotCQkJCVNlYXJjaFJlcXVlc3RvciBqc3BSZXF1ZXN0b3IgPSBuZXcgSlNQU2VhcmNoUmVxdWVzdG9yKHJlcXVlc3Rvcik7Ci0JCQkJCi0JCQkJSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLnNlYXJjaChwYXR0ZXJuLCAKLQkJCQkJCQkJCQkJCQkJbmV3IEpTUFNlYXJjaFNjb3BlKCksIAotCQkJCQkJCQkJCQkJCQlwYXR0ZXJuUXVlcnkuZ2V0U2VhcmNoRm9yKCksIAotCQkJCQkJCQkJCQkJCQlwYXR0ZXJuUXVlcnkuZ2V0TGltaXRUbygpLCAKLQkJCQkJCQkJCQkJCQkJU2VhcmNoUGF0dGVybi5SX1BBVFRFUk5fTUFUQ0gsIAotCQkJCQkJCQkJCQkJCQlmYWxzZSwgCi0JCQkJCQkJCQkJCQkJCWpzcFJlcXVlc3Rvcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSVF1ZXJ5UGFydGljaXBhbnQjZXN0aW1hdGVUaWNrcyhvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLlF1ZXJ5U3BlY2lmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGVzdGltYXRlVGlja3MoUXVlcnlTcGVjaWZpY2F0aW9uIGRhdGEpIHsKLQkJLy8gcGFfVE9ETyB1c2UgcHJvamVjdCBmaWxlIGNvdW50ZXIgZnJvbSBKU1BTZWFyY2hTdXBwb3J0Li4uCi0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JUXVlcnlQYXJ0aWNpcGFudCNnZXRVSVBhcnRpY2lwYW50KCkKLQkgKi8KLQlwdWJsaWMgSU1hdGNoUHJlc2VudGF0aW9uIGdldFVJUGFydGljaXBhbnQoKSB7Ci0JCXJldHVybiBuZXcgSlNQTWF0Y2hQcmVzZW50YXRpb24oKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFN1cHBseUpTUFNlYXJjaFJlc3VsdHNUb0phdmFTZWFyY2goKSB7Ci0JCXJldHVybiBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihKU1BVSVByZWZlcmVuY2VOYW1lcy5TVVBQTFlfSlNQX1NFQVJDSF9SRVNVTFRTX1RPX0pBVkFfU0VBUkNIKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YjU3YzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLkFic3RyYWN0Q29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogPHA+VGhlIHJlYWRhYmxlIGFuZCB3cml0YWJsZSBjb21wbGV0aW9uIHByb3Bvc2FsIGNhdGVnb3JpZXMgY29uZmlndXJhdGlvbgotICogZm9yIHRoZSBKU1AgY29udGVudCB0eXBlPC9wPgotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uIHsKLQotCS8qKiB0aGUgSUQgb2YgdGhlIHByZWZlcmVuY2UgcGFnZSB3aGVyZSB1c2VycyBjYW4gY2hhbmdlIHRoZSBwcmVmZXJlbmNlcyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFU19QQUdFX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLmNvbnRlbnRhc3Npc3QiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogPHA+Q3JlYXRlcyB0aGUgY29uZmlndXJhdGlvbjwvcD4KLQkgKi8KLQlwdWJsaWMgSlNQQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vbm90aGluZyB0byBkby4KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbiNnZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLklDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlciNoYXNBc3NvY2lhdGVkUHJvcGVydGllc1BhZ2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0Fzc29jaWF0ZWRQcm9wZXJ0aWVzUGFnZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLklDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlciNnZXRQcm9wZXJ0aWVzUGFnZUlEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNQYWdlSUQoKSB7Ci0JCXJldHVybiBQUkVGRVJFTkNFU19QQUdFX0lEOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5BYnN0cmFjdENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uI2dldFNob3VsZE5vdERpc3BsYXlPbkRlZmF1bHRQYWdlUHJlZktleSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTaG91bGROb3REaXNwbGF5T25EZWZhdWx0UGFnZVByZWZLZXkoKSB7Ci0JCXJldHVybiBKU1BVSVByZWZlcmVuY2VOYW1lcy5DT05URU5UX0FTU0lTVF9ET19OT1RfRElTUExBWV9PTl9ERUZBVUxUX1BBR0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLkFic3RyYWN0Q29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24jZ2V0U2hvdWxkTm90RGlzcGxheU9uT3duUGFnZVByZWZLZXkoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2hvdWxkTm90RGlzcGxheU9uT3duUGFnZVByZWZLZXkoKSB7Ci0JCXJldHVybiBKU1BVSVByZWZlcmVuY2VOYW1lcy5DT05URU5UX0FTU0lTVF9ET19OT1RfRElTUExBWV9PTl9PV05fUEFHRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhZ2VTb3J0T3JkZXJQcmVmS2V5KCkgewotCQlyZXR1cm4gSlNQVUlQcmVmZXJlbmNlTmFtZXMuQ09OVEVOVF9BU1NJU1RfT1dOX1BBR0VfU09SVF9PUkRFUjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLkFic3RyYWN0Q29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24jZ2V0RGVmYXVsdFBhZ2VTb3J0T3JkZXJQcmVmS2V5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRQYWdlU29ydE9yZGVyUHJlZktleSgpIHsKLQkJcmV0dXJuIEpTUFVJUHJlZmVyZW5jZU5hbWVzLkNPTlRFTlRfQVNTSVNUX0RFRkFVTFRfUEFHRV9TT1JUX09SREVSOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUFVJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZTkwY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUFVJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgSlNQIFVJIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BVSVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCUNvbG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFRoZW1lTWFuYWdlcigpLmdldEN1cnJlbnRUaGVtZSgpLmdldENvbG9yUmVnaXN0cnkoKTsKLQotCQkvLyBzZXR0aW5nIHRoZSBzYW1lIGFzIEhUTUwKLQkJc3RvcmUuc2V0RGVmYXVsdChKU1BVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KEpTUFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFLCAiPD0iKTsvLyROT04tTkxTLTEkCi0KLQkJLy8gSlNQIFN0eWxlIFByZWZlcmVuY2VzCi0JCVN0cmluZyBOT0JBQ0tHUk9VTkRCT0xEID0gIiB8IG51bGwgfCBmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIEpVU1RJVEFMSUMgPSAiIHwgbnVsbCB8IGZhbHNlIHwgdHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLCAxMjcsIDAsIDEyNykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSwgNDIsIDAsIDI1NSkgKyBKVVNUSVRBTElDOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHNwZWNpZmllZCB2YWx1ZSBpcyBibGFjazsgbGVhdmluZyBhcyB3aWRnZXQgZGVmYXVsdAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUywgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUiwgNjMsIDk1LCAxOTEpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIsIHN0eWxlVmFsdWUpOwotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCwgNjMsIDk1LCAxOTEpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhULCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIDAsIDEyOCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUsIDYzLCAxMjcsIDEyNykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSLCAxOTEsIDk1LCA2MykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVCwgc3R5bGVWYWx1ZSk7Ci0JCQotCQkvLyBzZXQgZGVmYXVsdCBuZXcganNwIGZpbGUgdGVtcGxhdGUgdG8gdXNlIGluIG5ldyBmaWxlIHdpemFyZAotCQkvKgotCQkgKiBOZWVkIHRvIGZpbmQgdGVtcGxhdGUgbmFtZSB0aGF0IGdvZXMgd2l0aCBkZWZhdWx0IHRlbXBsYXRlIGlkIChuYW1lCi0JCSAqIG1heSBjaGFuZ2UgZm9yIGRpZmZlcmVudCBsYW5ndWFnZSkKLQkJICovCi0JCXN0b3JlLnNldERlZmF1bHQoSlNQVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfSUQsICJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BodG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIHNldCBkZWZhdWx0IG5ldyBqc3AgdGFnIGZpbGUgdGVtcGxhdGUgdG8gdXNlIGluIG5ldyB0YWcgZmlsZSB3aXphcmQKLQkJc3RvcmUuc2V0RGVmYXVsdChKU1BVSVByZWZlcmVuY2VOYW1lcy5ORVdfVEFHX0ZJTEVfVEVNUExBVEVfSUQsICJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5zaW1wbGV0YWciKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJc3RvcmUuc2V0RGVmYXVsdChKU1BVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRUxfQlJBQ0VTLCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChKU1BVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfU0NSSVBUTEVUUywgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0NPTU1FTlRTLCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChKU1BVSVByZWZlcmVuY2VOYW1lcy5TVVBQTFlfSlNQX1NFQVJDSF9SRVNVTFRTX1RPX0pBVkFfU0VBUkNILCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChKU1BVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ0xPU0VfU1RSSU5HUywgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NMT1NFX0JSQUNLRVRTLCB0cnVlKTsKLQkJCi0JCS8vIERlZmF1bHRzIGZvciBDb250ZW50IEFzc2lzdCBwcmVmZXJlbmNlIHBhZ2UKLQkJc3RvcmUuc2V0RGVmYXVsdChKU1BVSVByZWZlcmVuY2VOYW1lcy5DT05URU5UX0FTU0lTVF9ET19OT1RfRElTUExBWV9PTl9ERUZBVUxUX1BBR0UsICIiKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChKU1BVSVByZWZlcmVuY2VOYW1lcy5DT05URU5UX0FTU0lTVF9ET19OT1RfRElTUExBWV9PTl9PV05fUEFHRSwgIiIpOwotCQlzdG9yZS5zZXREZWZhdWx0KEpTUFVJUHJlZmVyZW5jZU5hbWVzLkNPTlRFTlRfQVNTSVNUX0RFRkFVTFRfUEFHRV9TT1JUX09SREVSLAotCQkJCSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcm9wb3NhbENhdGVnb3J5Lmh0bWxUYWdzXDAiICsKLQkJCQkib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcm9wb3NhbENhdGVnb3J5LnhtbFRhZ3NcMCIgKwotCQkJCSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByb3Bvc2FsQ2F0ZWdvcnkuY3NzXDAiICsKLQkJCQkib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm9wb3NhbENhdGVnb3J5LmpzcFwwIiArCi0JCQkJIm9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJvcG9zYWxDYXRlZ29yeS5qc3BKYXZhXDAiICsKLQkJCQkib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm9wb3NhbENhdGVnb3J5LmpzcFRlbXBsYXRlc1wwIiArCi0JCQkJIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByb3Bvc2FsQ2F0ZWdvcnkuaHRtbFRlbXBsYXRlc1wwIiArCi0JCQkJIm9yZy5lY2xpcHNlLndzdC54bWwudWkucHJvcG9zYWxDYXRlZ29yeS54bWxUZW1wbGF0ZXNcMCIgKwotCQkJCSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByb3Bvc2FsQ2F0ZWdvcnkuY3NzVGVtcGxhdGVzIik7Ci0JCXN0b3JlLnNldERlZmF1bHQoSlNQVUlQcmVmZXJlbmNlTmFtZXMuQ09OVEVOVF9BU1NJU1RfT1dOX1BBR0VfU09SVF9PUkRFUiwKLQkJCQkib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm9wb3NhbENhdGVnb3J5LmpzcFRlbXBsYXRlc1wwIiArCi0JCQkJIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByb3Bvc2FsQ2F0ZWdvcnkuaHRtbFRlbXBsYXRlc1wwIiArCi0JCQkJIm9yZy5lY2xpcHNlLndzdC54bWwudWkucHJvcG9zYWxDYXRlZ29yeS54bWxUZW1wbGF0ZXNcMCIgKwotCQkJCSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByb3Bvc2FsQ2F0ZWdvcnkuY3NzVGVtcGxhdGVzXDAiICsKLQkJCQkib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJvcG9zYWxDYXRlZ29yeS5odG1sVGFnc1wwIiArCi0JCQkJIm9yZy5lY2xpcHNlLndzdC54bWwudWkucHJvcG9zYWxDYXRlZ29yeS54bWxUYWdzXDAiICsKLQkJCQkib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm9wb3NhbENhdGVnb3J5LmpzcFwwIiArCi0JCQkJIm9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJvcG9zYWxDYXRlZ29yeS5qc3BKYXZhXDAiICsKLQkJCQkib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5wcm9wb3NhbENhdGVnb3J5LmNzcyIpOwotCQlzdG9yZS5zZXREZWZhdWx0KEpTUFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fSU1QT1JUX0lOU0VSVCwgdHJ1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQVUlQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BVSVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjE3NmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BVSVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIGtleXMgZm9yIEpTUCBVSQotICovCi1wdWJsaWMgY2xhc3MgSlNQVUlQcmVmZXJlbmNlTmFtZXMgewotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGNvbnRyb2xzIGlmIGNvZGUgYXNzaXN0IGdldHMgYXV0byBhY3RpdmF0ZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19QUk9QT1NFID0gZ2V0QXV0b1Byb3Bvc2VLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdXRvUHJvcG9zZUtleSgpIHsKLQkJcmV0dXJuICJhdXRvUHJvcG9zZSI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGhvbGRzIHRoZSBjaGFyYWN0ZXJzIHRoYXQgYXV0byBhY3RpdmF0ZSBjb2RlCi0JICogYXNzaXN0LgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4gQWxsIGNoYXJhY3RlcnMgdGhhdCB0cmlnZ2VyCi0JICogYXV0byBjb2RlIGFzc2lzdC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19QUk9QT1NFX0NPREUgPSBnZXRBdXRvUHJvcG9zZUNvZGVLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdXRvUHJvcG9zZUNvZGVLZXkoKSB7Ci0JCXJldHVybiAiYXV0b1Byb3Bvc2VDb2RlIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSBjdXN0b21pemVkIHRlbXBsYXRlcy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFU19LRVkgPSBnZXRUZW1wbGF0ZXNLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZW1wbGF0ZXNLZXkoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jdXN0b21fdGVtcGxhdGVzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIGxhc3QgdGVtcGxhdGUgbmFtZSB1c2VkIGluIG5ldyBKU1AgZmlsZSB3aXphcmQuCi0JICogVGVtcGxhdGUgbmFtZSBpcyBzdG9yZWQgaW5zdGVhZCBvZiB0ZW1wbGF0ZSBpZCBiZWNhdXNlIHVzZXItY3JlYXRlZAotCSAqIHRlbXBsYXRlcyBkbyBub3QgaGF2ZSB0ZW1wbGF0ZSBpZHMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRklMRV9URU1QTEFURV9OQU1FID0gIm5ld0ZpbGVUZW1wbGF0ZU5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaW5pdGlhbCB0ZW1wbGF0ZSBJRCB0byBiZSB1c2VkIGluIHRoZSBuZXcgSlNQIGZpbGUgd2l6YXJkLiBJbiB0aGUgYWJzZW5jZQotCSAqIG9mIHtAbGluayBORVdfRklMRV9URU1QTEFURV9OQU1FfSwgdGhpcyBJRCBpcyB1c2VkIHRvIGZpbmQgYSB0ZW1wbGF0ZSBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0ZJTEVfVEVNUExBVEVfSUQgPSAibmV3RmlsZVRlbXBsYXRlSWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBuZXcgSlNQIFRhZyBmaWxlIHdpemFyZC4KLQkgKiBUZW1wbGF0ZSBuYW1lIGlzIHN0b3JlZCBpbnN0ZWFkIG9mIHRlbXBsYXRlIGlkIGJlY2F1c2UgdXNlci1jcmVhdGVkCi0JICogdGVtcGxhdGVzIGRvIG5vdCBoYXZlIHRlbXBsYXRlIGlkcy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19UQUdfRklMRV9URU1QTEFURV9OQU1FID0gIm5ld1RhZ0ZpbGVUZW1wbGF0ZU5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaW5pdGlhbCB0ZW1wbGF0ZSBJRCB0byBiZSB1c2VkIGluIHRoZSBuZXcgSlNQIGZpbGUgd2l6YXJkLiBJbiB0aGUgYWJzZW5jZQotCSAqIG9mIHtAbGluayBORVdfRklMRV9URU1QTEFURV9OQU1FfSwgdGhpcyBJRCBpcyB1c2VkIHRvIGZpbmQgYSB0ZW1wbGF0ZSBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1RBR19GSUxFX1RFTVBMQVRFX0lEID0gIm5ld1RhZ0ZpbGVUZW1wbGF0ZUlkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgb3B0aW9uIGZvciBhdXRvLWNvbXBsZXRpbmcgRUwgYnJhY2VzIGFmdGVyIGVudGVyaW5nCi0JICogPGNvZGU+JHs8L2NvZGU+Ci0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQSU5HX0NPTVBMRVRFX0VMX0JSQUNFUyA9ICJ0eXBpbmdDb21wbGV0ZUVsQnJhY2VzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIG9wdGlvbiBmb3IgYXV0by1jb21wbGV0aW5nIHNjcmlwdGxldHMgYWZ0ZXIgZW50ZXJpbmcKLQkgKiA8Y29kZT4mbHQ7JTwvY29kZT4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBJTkdfQ09NUExFVEVfU0NSSVBUTEVUUyA9ICJ0eXBpbmdDb21wbGV0ZVNjcmlwdGxldHMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgb3B0aW9uIGZvciBhdXRvLWNvbXBsZXRpbmcgSlNQIGNvbW1lbnRzIGFmdGVyIGVudGVyaW5nCi0JICogPGNvZGU+Jmx0OyUtLTwvY29kZT4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBJTkdfQ09NUExFVEVfQ09NTUVOVFMgPSAidHlwaW5nQ29tcGxldGVDb21tZW50cyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIG9wdGlvbiBmb3IgYXV0by1jb21wbGV0aW5nIHN0cmluZ3MgKCIgYW5kICcpIHdoaWxlCi0JICogdHlwaW5nLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUElOR19DTE9TRV9TVFJJTkdTID0gImNsb3NlU3RyaW5ncyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIG9wdGlvbiBmb3IgYXV0by1jb21wbGV0aW5nIGJyYWNrZXRzIChbIGFuZCAoKSB3aGlsZQotCSAqIHR5cGluZy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBJTkdfQ0xPU0VfQlJBQ0tFVFMgPSAiY2xvc2VCcmFja2V0cyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUFBMWV9KU1BfU0VBUkNIX1JFU1VMVFNfVE9fSkFWQV9TRUFSQ0ggPSAic3VwcGx5SlNQU2VhcmNoUmVzdWx0c1RvSmF2YVNlYXJjaCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIDxwPnByZWZlcmVuY2Uga2V5IHVzZWQgZm9yIHNhdmluZyB3aGljaCBjYXRlZ29yaWVzIHNob3VsZCBub3QgZGlzcGxheSBvbiB0aGUgZGVmYXVsdCBwYWdlPC9wPgotCSAqIAotCSAqIDxwPlZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIFN0cmluZ30gY29uc2lzdGluZyBvZgotCSAqIDx0dD5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbXBsZXRpb25Qcm9wb3NhbC9wcm9wb3NhbENhdGVnb3J5L0BpZDwvdHQ+cyBzZXBhcmF0ZWQgYnkgdGhlIG51bGwKLQkgKiBjaGFyYWN0ZXIgKDx0dD5cMDwvdHQ+KSwgb3JkZXJlZCBpcyBpZ25vcmVkPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfQVNTSVNUX0RPX05PVF9ESVNQTEFZX09OX0RFRkFVTFRfUEFHRSA9ICJqc3BfY29udGVudF9hc3Npc3RfZGlzcGxheV9vbl9kZWZhdWx0X3BhZ2UiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogPHA+cHJlZmVyZW5jZSBrZXkgdXNlZCBmb3Igc2F2aW5nIHdoaWNoIGNhdGVnb3JpZXMgc2hvdWxkIG5vdCBkaXNwbGF5IG9uIHRoZWlyIG93biBwYWdlPC9wPgotCSAqIAotCSAqIDxwPlZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIFN0cmluZ30gY29uc2lzdGluZyBvZgotCSAqIDx0dD5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbXBsZXRpb25Qcm9wb3NhbC9wcm9wb3NhbENhdGVnb3J5L0BpZDwvdHQ+cyBzZXBhcmF0ZWQgYnkgdGhlIG51bGwKLQkgKiBjaGFyYWN0ZXIgKDx0dD5cMDwvdHQ+KSwgb3JkZXIgaXMgaWdub3JlZDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0FTU0lTVF9ET19OT1RfRElTUExBWV9PTl9PV05fUEFHRSA9ICJqc3BfY29udGVudF9hc3Npc3RfZGlzcGxheV9vbl9vd25fcGFnZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiA8cD5wcmVmZXJlbmNlIGtleSBmb3Igc2F2aW5nIHRoZSBzb3J0IG9yZGVyIG9mIHRoZSBjYXRlZ29yaWVzIHdoZW4gZGlzcGxheWluZyB0aGVtIG9uIHRoZWlyIG93biBwYWdlPC9wPgotCSAqIAotCSAqIDxwPlZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIFN0cmluZ30gY29uc2lzdGluZyBvZgotCSAqIDx0dD5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbXBsZXRpb25Qcm9wb3NhbC9wcm9wb3NhbENhdGVnb3J5L0BpZDwvdHQ+cyBzZXBhcmF0ZWQgYnkgdGhlIG51bGwKLQkgKiBjaGFyYWN0ZXIgKDx0dD5cMDwvdHQ+KSBpbiB0aGUgZGVzaXJlZCBzb3J0IG9yZGVyLjwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0FTU0lTVF9PV05fUEFHRV9TT1JUX09SREVSPSAianNwX2NvbnRlbnRfYXNzaXN0X293bl9wYWdlX3NvcnRfb3JkZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogPHA+cHJlZmVyZW5jZSBrZXkgZm9yIHNhdmluZyB0aGUgc29ydCBvcmRlciBvZiB0aGUgY2F0ZWdvcmllcyB3aGVuIGRpc3BsYXlpbmcgdGhlbSBvbiB0aGUgZGVmYXVsdCBwYWdlPC9wPgotCSAqIAotCSAqIDxwPlZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIFN0cmluZ30gY29uc2lzdGluZyBvZgotCSAqIDx0dD5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbXBsZXRpb25Qcm9wb3NhbC9wcm9wb3NhbENhdGVnb3J5L0BpZDwvdHQ+cyBzZXBhcmF0ZWQgYnkgdGhlIG51bGwKLQkgKiBjaGFyYWN0ZXIgKDx0dD5cMDwvdHQ+KSBpbiB0aGUgZGVzaXJlZCBzb3J0IG9yZGVyLjwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0FTU0lTVF9ERUZBVUxUX1BBR0VfU09SVF9PUkRFUj0gImpzcF9jb250ZW50X2Fzc2lzdF9kZWZhdWx0X3BhZ2Vfc29ydF9vcmRlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiA8cD5wcmVmZXJlbmNlIGtleSB0byBzdG9yZSB0aGUgb3B0aW9uIGZvciBhdXRvIGluc2VydGlvbiBvZiBwYWdlIGltcG9ydHM8L3A+Ci0JICogCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19JTVBPUlRfSU5TRVJUID0gImF1dG9JbXBvcnRpbnNlcnRpb24iOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RQcm9wZXJ0eVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RQcm9wZXJ0eVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkOTYxNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0UHJvcGVydHlQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Db250cm9sRW5hYmxlU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3REaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLS8qKgotICogQmFzZWQgbG9vc2VseSBvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuUHJvcGVydHlBbmRQcmVmZXJlbmNlUGFnZQotICovCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3BlcnR5UHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnUHJlZmVyZW5jZXMgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wcmVmZXJlbmNlcy1wcm9wZXJ0aWVzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKgotCSAqIERpc2FibGUgbGluayBkYXRhLCBwcmV2ZW50cyB0aGUgZGlzcGxheSBvZiBhICJ3b3Jrc3BhY2UiIG9yICJwcm9qZWN0IgotCSAqIHNldHRpbmdzIGxpbmsgdG8gcHJldmVudCByZWN1cnNpdmUgZGlhbG9nIGxhdW5jaGluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBESVNBQkxFX0xJTksgPSAiRElTQUJMRV9MSU5LIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNYXAgZkRhdGEgPSBudWxsOwotCi0JcHJpdmF0ZSBCdXR0b24gZkVuYWJsZVByb2plY3RTZXR0aW5nczsKLQotCXByaXZhdGUgTGluayBmUHJvamVjdFNldHRpbmdzTGluazsKLQkKLQlwcml2YXRlIENvbnRyb2wgZkNvbW1vbjsKLQkKLQlwcml2YXRlIENvbnRyb2xFbmFibGVTdGF0ZSBmRW5hYmxlbWVudHM7Ci0KLQlwdWJsaWMgQWJzdHJhY3RQcm9wZXJ0eVByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIGFwcGx5RGF0YShPYmplY3QgZGF0YSkgewotCQlzdXBlci5hcHBseURhdGEoZGF0YSk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgTWFwKSB7Ci0JCQlmRGF0YSA9IChNYXApIGRhdGE7Ci0JCQl1cGRhdGVMaW5rRW5hYmxlbWVudCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29tbW9uQ29udGVudHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSk7Ci0KLQlwdWJsaWMgZmluYWwgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUNvbXBvc2l0ZSBjaGVja0xpbmtDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljaGVja0xpbmtDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWNoZWNrTGlua0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3MgPSBuZXcgQnV0dG9uKGNoZWNrTGlua0NvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3Muc2V0VGV4dChTU0VVSU1lc3NhZ2VzLkVuYWJsZVByb2plY3RTZXR0aW5ncyk7Ci0JCQlmRW5hYmxlUHJvamVjdFNldHRpbmdzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkJYm9vbGVhbiBlbmFibGVkRm9yUHJvamVjdCA9IGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKVswXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLmdldEJvb2xlYW4oZ2V0UHJvamVjdFNldHRpbmdzS2V5KCksIGZhbHNlKTsKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3Muc2V0U2VsZWN0aW9uKGVuYWJsZWRGb3JQcm9qZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxhYmVsIHNwYWNlciA9IG5ldyBMYWJlbChjaGVja0xpbmtDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCQlzcGFjZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCX0KLQotCQlmUHJvamVjdFNldHRpbmdzTGluayA9IG5ldyBMaW5rKGNoZWNrTGlua0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlmUHJvamVjdFNldHRpbmdzTGluay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSkpOwotCi0JCS8qCi0JCSAqICJlbGVtZW50IiBzaG91bGQgYmUgYSBwcm9qZWN0LCBpZiBudWxsLCBsaW5rIHRvIHBlci1wcm9qZWN0Ci0JCSAqIHByb3BlcnRpZXMKLQkJICovCi0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJZlByb2plY3RTZXR0aW5nc0xpbmsuc2V0VGV4dCgiPGE+IiArIFNTRVVJTWVzc2FnZXMuQ29uZmlndXJlV29ya3NwYWNlU2V0dGluZ3MgKyAiPC9hPiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJZlByb2plY3RTZXR0aW5nc0xpbmsuc2V0VGV4dCgiPGE+IiArIFNTRVVJTWVzc2FnZXMuQ29uZmlndXJlUHJvamVjdFNldHRpbmdzICsgIjwvYT4iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXVwZGF0ZUxpbmtFbmFibGVtZW50KCk7Ci0KLQkJZlByb2plY3RTZXR0aW5nc0xpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCkgewotCQkJCQlvcGVuUHJvamVjdFNldHRpbmdzKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlvcGVuV29ya3NwYWNlU2V0dGluZ3MoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJaWYgKGdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJCWxpbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCX0KLQotLy8JCWZpbmFsIENvbnRyb2wgY29tbW9uID0gY3JlYXRlQ29tbW9uQ29udGVudHMoY29tcG9zaXRlKTsKLQkJZkNvbW1vbiA9IGNyZWF0ZUNvbW1vbkNvbnRlbnRzKGNvbXBvc2l0ZSk7Ci0JCQotCQlmQ29tbW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWlmIChmRW5hYmxlUHJvamVjdFNldHRpbmdzICE9IG51bGwpIHsKLQkJCVNlbGVjdGlvbkFkYXB0ZXIgc2VsZWN0aW9uQWRhcHRlciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJCWVuYWJsZVByZWZlcmVuY2VDb250ZW50KGZFbmFibGVQcm9qZWN0U2V0dGluZ3MuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX07Ci0JCQlzZWxlY3Rpb25BZGFwdGVyLndpZGdldFNlbGVjdGVkKG51bGwpOwotCQkJZkVuYWJsZVByb2plY3RTZXR0aW5ncy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25BZGFwdGVyKTsKLQkJfQotCQkKLQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIElTY29wZUNvbnRleHRbXSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpLCBuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCQl9Ci0JCXJldHVybiBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlEKCk7Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJaWYgKGdldEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlyZXR1cm4gKElQcm9qZWN0KSBnZXRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlPYmplY3QgYWRhcHRlciA9IGdldEVsZW1lbnQoKS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlyZXR1cm4gKElQcm9qZWN0KSBhZGFwdGVyOwotCQkJfQotCQkJYWRhcHRlciA9IGdldEVsZW1lbnQoKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJcmV0dXJuIChJUHJvamVjdCkgYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFByb2plY3RTZXR0aW5nc0tleSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0eVBhZ2VJRCgpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbGVtZW50U2V0dGluZ3NFbmFibGVkKCkgewotCQlyZXR1cm4gZkVuYWJsZVByb2plY3RTZXR0aW5ncyAhPSBudWxsICYmIGZFbmFibGVQcm9qZWN0U2V0dGluZ3MuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0Jdm9pZCBvcGVuUHJvamVjdFNldHRpbmdzKCkgewotCQlMaXN0RGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0RGlhbG9nKGdldFNoZWxsKCkpIHsKLQotCQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQkJQ29udHJvbCBhcmVhID0gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShjb250YWluZXIpOwotCQkJCWdldFRhYmxlVmlld2VyKCkuc2V0U29ydGVyKG5ldyBSZXNvdXJjZVNvcnRlcihSZXNvdXJjZVNvcnRlci5OQU1FKSk7Ci0JCQkJcmV0dXJuIGFyZWE7Ci0JCQl9Ci0JCX07Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKFNTRVVJTWVzc2FnZXMuUHJvcGVydHlQcmVmZXJlbmNlUGFnZV8wMik7Ci0JCWRpYWxvZy5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChJV29ya3NwYWNlKSBpbnB1dEVsZW1lbnQpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJfSk7Ci0JCWRpYWxvZy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCkpKTsKLQkJZGlhbG9nLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSk7Ci0JCWRpYWxvZy5zZXRUaXRsZShTU0VVSU1lc3NhZ2VzLlByb3BlcnR5UHJlZmVyZW5jZVBhZ2VfMDEpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCU9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCWlmIChyZXN1bHQubGVuZ3RoID4gMCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJCQlNYXAgZGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZGF0YS5wdXQoRElTQUJMRV9MSU5LLCBCb29sZWFuLlRSVUUpOwotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcm9wZXJ0eURpYWxvZ09uKGdldFNoZWxsKCksIHByb2plY3QsIGdldFByb3BlcnR5UGFnZUlEKCksIG5ldyBTdHJpbmdbXXtnZXRQcm9wZXJ0eVBhZ2VJRCgpfSwgZGF0YSkub3BlbigpOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBvcGVuV29ya3NwYWNlU2V0dGluZ3MoKSB7Ci0JCU1hcCBkYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJZGF0YS5wdXQoRElTQUJMRV9MSU5LLCBCb29sZWFuLlRSVUUpOwotCQlQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIGdldFByZWZlcmVuY2VQYWdlSUQoKSwgbmV3IFN0cmluZ1tde2dldFByZWZlcmVuY2VQYWdlSUQoKX0sIGRhdGEpLm9wZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJSVNjb3BlQ29udGV4dFtdIHByZWZlcmVuY2VTY29wZXMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCk7Ci0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJaWYgKGlzRWxlbWVudFNldHRpbmdzRW5hYmxlZCgpKSB7Ci0JCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgc2V0dGluZyAiICsgZ2V0UHJvamVjdFNldHRpbmdzS2V5KCkgKyAiICgiICsgdHJ1ZSArICIpIGluIHNjb3BlICIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5hbWUoKSArICI6IiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgIAotCQkJCX0KLQkJCQlwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucHV0Qm9vbGVhbihnZXRQcm9qZWN0U2V0dGluZ3NLZXkoKSwgZkVuYWJsZVByb2plY3RTZXR0aW5ncy5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZW1vdmluZyAiICsgZ2V0UHJvamVjdFNldHRpbmdzS2V5KCkgKyAiIGZyb20gc2NvcGUgIiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TmFtZSgpICsgIjoiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQkJcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnJlbW92ZShnZXRQcm9qZWN0U2V0dGluZ3NLZXkoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9rOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWlmKGdldFByb2plY3QoKSAhPSBudWxsICYmIGZFbmFibGVQcm9qZWN0U2V0dGluZ3MgIT0gbnVsbCkgewotCQkJZkVuYWJsZVByb2plY3RTZXR0aW5ncy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZW5hYmxlUHJlZmVyZW5jZUNvbnRlbnQoZmFsc2UpOwotCQl9Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVMaW5rRW5hYmxlbWVudCgpIHsKLQkJaWYgKGZEYXRhICE9IG51bGwgJiYgZlByb2plY3RTZXR0aW5nc0xpbmsgIT0gbnVsbCkgewotCQkJZlByb2plY3RTZXR0aW5nc0xpbmsuc2V0RW5hYmxlZCghQm9vbGVhbi5UUlVFLmVxdWFscyhmRGF0YS5nZXQoRElTQUJMRV9MSU5LKSkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnRyb2xzIHRoZSBlbmFibGVtZW50IG9mIHRoZSBjb21tb24gY29udGVudCByZWdpb24KLQkgKiBvZiBhIHByb3BlcnR5IG9yIHByZWZlcmVuY2UgcGFnZQotCSAqIAotCSAqIEBwYXJhbSBlbmFibGUgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIGNvbW1vbiBjb250ZW50Ci0JICogYXJlYQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVByZWZlcmVuY2VDb250ZW50KGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWlmKGVuYWJsZSkgewotCQkJaWYoZkVuYWJsZW1lbnRzICE9IG51bGwpIHsKLQkJCQlmRW5hYmxlbWVudHMucmVzdG9yZSgpOwotCQkJCWZFbmFibGVtZW50cyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihmRW5hYmxlbWVudHMgPT0gbnVsbCkKLQkJCQlmRW5hYmxlbWVudHMgPSBDb250cm9sRW5hYmxlU3RhdGUuZGlzYWJsZShmQ29tbW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3ZDk2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RWYWxpZGF0aW9uU2V0dGluZ3NQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5FeHBhbnNpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5FeHBhbnNpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU2Nyb2xsZWRQYWdlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEJhc2VkIG9uIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5PcHRpb25zQ29uZmlndXJhdGlvbkJsb2NrCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblNldHRpbmdzUGFnZSBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIExpc3QgZkNvbWJvczsKLQlwcml2YXRlIExpc3QgZkV4cGFuZGFibGVzOwotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBmU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlc1NlcnZpY2UgZlByZWZlcmVuY2VzU2VydmljZSA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUVElOR1NfRVhQQU5ERUQgPSAiZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFZhbGlkYXRpb25GcmFtZXdvcmsgZlZhbGlkYXRpb247Ci0KLQlwcml2YXRlIGNsYXNzIENvbWJvRGF0YSB7Ci0JCXByaXZhdGUgU3RyaW5nIGZLZXk7Ci0JCXByaXZhdGUgaW50W10gZlNldmVyaXRpZXM7Ci0JCXByaXZhdGUgaW50IGZJbmRleDsKLQkJaW50IG9yaWdpbmFsU2V2ZXJpdHkgPSAtMjsKLQotCQlwdWJsaWMgQ29tYm9EYXRhKFN0cmluZyBrZXksIGludFtdIHNldmVyaXRpZXMsIGludCBpbmRleCkgewotCQkJZktleSA9IGtleTsKLQkJCWZTZXZlcml0aWVzID0gc2V2ZXJpdGllczsKLQkJCWZJbmRleCA9IGluZGV4OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCQlyZXR1cm4gZktleTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEluZGV4KGludCBpbmRleCkgewotCQkJZkluZGV4ID0gaW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQkJcmV0dXJuIGZJbmRleDsKLQkJfQotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBzZXZlcml0eSBpbmRleCBiYXNlZCBvbiA8Y29kZT5zZXZlcml0eTwvY29kZT4uCi0JCSAqIElmIHRoZSBzZXZlcml0eSBkb2Vzbid0IGV4aXN0LCB0aGUgaW5kZXggaXMgc2V0IHRvIC0xLgotCQkgKiAKLQkJICogQHBhcmFtIHNldmVyaXR5IHRoZSBzZXZlcml0eSBsZXZlbAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoaW50IHNldmVyaXR5KSB7Ci0JCQlmb3IgKGludCBpID0gMDsgZlNldmVyaXRpZXMgIT0gbnVsbCAmJiBpIDwgZlNldmVyaXRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZlNldmVyaXRpZXNbaV0gPT0gc2V2ZXJpdHkpIHsKLQkJCQkJc2V0SW5kZXgoaSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXNldEluZGV4KC0xKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCQlyZXR1cm4gKGZJbmRleCA+PSAwICYmIGZTZXZlcml0aWVzICE9IG51bGwgJiYgZkluZGV4IDwgZlNldmVyaXRpZXMubGVuZ3RoKSA/IGZTZXZlcml0aWVzW2ZJbmRleF0gOiAtMTsKLQkJfQotCi0JCWJvb2xlYW4gaXNDaGFuZ2VkKCkgewotCQkJcmV0dXJuIGZTZXZlcml0aWVzW2ZJbmRleF0gIT0gb3JpZ2luYWxTZXZlcml0eTsKLQkJfQotCX0KLQotCXB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZDb21ib3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZFeHBhbmRhYmxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZlByZWZlcmVuY2VzU2VydmljZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpOwotCQlmVmFsaWRhdGlvbiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBDb21ibyB3aWRnZXQgaW4gdGhlIGNvbXBvc2l0ZSA8Y29kZT5wYXJlbnQ8L2NvZGU+LiBUaGUgZGF0YQotCSAqIGluIHRoZSBDb21ibyBpcyBhc3NvY2lhdGVkIHdpdGggPGNvZGU+a2V5PC9jb2RlPi4gVGhlIENvbWJvIGRhdGEgaXMKLQkgKiBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIGludGVnZXIgPGNvZGU+dmFsdWVzPC9jb2RlPiB3aGVyZSB0aGUgaW5kZXgKLQkgKiBvZiA8Y29kZT52YWx1ZXM8L2NvZGU+IGNvcnJlc3BvbmRzIHRvIHRoZSBpbmRleCBvZiA8Y29kZT52YWx1ZUxhYmVsczwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBjb21wb3NpdGUgdG8gY3JlYXRlIHRoZSBjb21ibyBib3ggaW4KLQkgKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsIHRvIGdpdmUgdGhlIGNvbWJvIGJveAotCSAqIEBwYXJhbSBrZXkgdGhlIHVuaXF1ZSBrZXkgdG8gaWRlbnRpZnkgdGhlIGNvbWJvIGJveAotCSAqIEBwYXJhbSB2YWx1ZXMgdGhlIHZhbHVlcyByZXByZXNlbnRlZCBieSB0aGUgY29tYm8gb3B0aW9ucwotCSAqIEBwYXJhbSB2YWx1ZUxhYmVscyB0aGUgY2FsdWVzIGRpc3BsYXllZCBpbiB0aGUgY29tYm8gYm94Ci0JICogQHBhcmFtIGluZGVudCBob3cgZmFyIHRvIGluZGVudCB0aGUgY29tYm8gYm94IGxhYmVsCi0JICogCi0JICogQHJldHVybiB0aGUgZ2VuZXJhdGVkIGNvbWJvIGJveAotCSAqLwotCXByb3RlY3RlZCBDb21ibyBhZGRDb21ib0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBrZXksIGludFtdIHZhbHVlcywgU3RyaW5nW10gdmFsdWVMYWJlbHMsIGludCBpbmRlbnQpIHsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWdkLmhvcml6b250YWxJbmRlbnQgPSBpbmRlbnQ7Ci0KLQkJTGFiZWwgbGFiZWxDb250cm9sID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlsYWJlbENvbnRyb2wuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQlsYWJlbENvbnRyb2wuc2V0VGV4dChsYWJlbCk7Ci0JCWxhYmVsQ29udHJvbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlDb21ibyBjb21ib0JveCA9IG5ld0NvbWJvQ29udHJvbChwYXJlbnQsIGtleSwgdmFsdWVzLCB2YWx1ZUxhYmVscyk7Ci0JCWNvbWJvQm94LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCXJldHVybiBjb21ib0JveDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tYm8gYm94IGFuZCBhc3NvY2lhdGVzIHRoZSBjb21ibyBkYXRhIHdpdGggdGhlCi0JICogY29tYm8gYm94LgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUgdGhlIGNvbXBvc2l0ZSB0byBjcmVhdGUgdGhlIGNvbWJvIGJveCBpbgotCSAqIEBwYXJhbSBrZXkgdGhlIHVuaXF1ZSBrZXkgdG8gaWRlbnRpZnkgdGhlIGNvbWJvIGJveAotCSAqIEBwYXJhbSB2YWx1ZXMgdGhlIHZhbHVlcyByZXByZXNlbnRlZCBieSB0aGUgY29tYm8gb3B0aW9ucwotCSAqIEBwYXJhbSB2YWx1ZUxhYmVscyB0aGUgdmFsdWVzIGRpc3BsYXllZCBpbiB0aGUgY29tYm8gYm94Ci0JICogCi0JICogQHJldHVybiB0aGUgZ2VuZXJhdGVkIGNvbWJvIGJveAotCSAqLwotCXByb3RlY3RlZCBDb21ibyBuZXdDb21ib0NvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSwgU3RyaW5nIGtleSwgaW50W10gdmFsdWVzLCBTdHJpbmdbXSB2YWx1ZUxhYmVscykgewotCQlDb21ib0RhdGEgZGF0YSA9IG5ldyBDb21ib0RhdGEoa2V5LCB2YWx1ZXMsIC0xKTsKLQotCQlDb21ibyBjb21ib0JveCA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQljb21ib0JveC5zZXRJdGVtcyh2YWx1ZUxhYmVscyk7Ci0JCWNvbWJvQm94LnNldERhdGEoZGF0YSk7Ci0JCWNvbWJvQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQljb21ib0JveC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0KLQkJbWFrZVNjcm9sbGFibGVDb21wb3NpdGVBd2FyZShjb21ib0JveCk7Ci0KLQkJaW50IHNldmVyaXR5ID0gLTE7Ci0JCWlmIChrZXkgIT0gbnVsbCkKLQkJCXNldmVyaXR5ID0gZlByZWZlcmVuY2VzU2VydmljZS5nZXRJbnQoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSwga2V5LCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HLCBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCkpOwotCi0JCWlmIChzZXZlcml0eSA9PSBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUiB8fCBzZXZlcml0eSA9PSBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HIHx8IHNldmVyaXR5ID09IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkgewotCQkJZGF0YS5zZXRTZXZlcml0eShzZXZlcml0eSk7Ci0JCQlkYXRhLm9yaWdpbmFsU2V2ZXJpdHkgPSBzZXZlcml0eTsKLQkJfQotCi0JCWlmIChkYXRhLmdldEluZGV4KCkgPj0gMCkKLQkJCWNvbWJvQm94LnNlbGVjdChkYXRhLmdldEluZGV4KCkpOwotCi0JCWZDb21ib3MuYWRkKGNvbWJvQm94KTsKLQkJcmV0dXJuIGNvbWJvQm94OwotCX0KLQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBnZXRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJaWYgKGZTZWxlY3Rpb25MaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQljb250cm9sQ2hhbmdlZChlLndpZGdldCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gZlNlbGVjdGlvbkxpc3RlbmVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyb2xDaGFuZ2VkKFdpZGdldCB3aWRnZXQpIHsKLQkJQ29tYm9EYXRhIGRhdGEgPSAoQ29tYm9EYXRhKSB3aWRnZXQuZ2V0RGF0YSgpOwotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ29tYm8pIHsKLQkJCWRhdGEuc2V0SW5kZXgoKChDb21ibykgd2lkZ2V0KS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFNldHRpbmdzUGFnZSNzdG9yZVZhbHVlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCWlmIChmQ29tYm9zID09IG51bGwgfHwgZkNvbWJvcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybjsKLQotCQlJdGVyYXRvciBpdCA9IGZDb21ib3MuaXRlcmF0b3IoKTsKLQotCQlJU2NvcGVDb250ZXh0W10gY29udGV4dHMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCk7Ci0KLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJQ29tYm9EYXRhIGRhdGEgPSAoQ29tYm9EYXRhKSAoKENvbWJvKSBpdC5uZXh0KCkpLmdldERhdGEoKTsKLQkJCWlmIChkYXRhLmdldEtleSgpICE9IG51bGwpIHsKLQkJCQljb250ZXh0c1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnB1dEludChkYXRhLmdldEtleSgpLCBkYXRhLmdldFNldmVyaXR5KCkpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQljb250ZXh0c1tpXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLmZsdXNoKCk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEV4cGFuZGFibGVDb21wb3NpdGUgZ2V0UGFyZW50RXhwYW5kYWJsZUNvbXBvc2l0ZShDb250cm9sIGNvbnRyb2wpIHsKLQkJQ29udHJvbCBwYXJlbnQgPSBjb250cm9sLmdldFBhcmVudCgpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBFeHBhbmRhYmxlQ29tcG9zaXRlKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOwotCQl9Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBFeHBhbmRhYmxlQ29tcG9zaXRlKSB7Ci0JCQlyZXR1cm4gKEV4cGFuZGFibGVDb21wb3NpdGUpIHBhcmVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRXhwYW5kYWJsZUNvbXBvc2l0ZSBjcmVhdGVTdHlsZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBpbnQgbkNvbHVtbnMpIHsKLQkJRXhwYW5kYWJsZUNvbXBvc2l0ZSBleGNvbXBvc2l0ZSA9IG5ldyBFeHBhbmRhYmxlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUsIEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuQ0xJRU5UX0lOREVOVCk7Ci0JCWV4Y29tcG9zaXRlLnNldFRleHQobGFiZWwpOwotCQlleGNvbXBvc2l0ZS5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JCWV4Y29tcG9zaXRlLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0Qm9sZChKRmFjZVJlc291cmNlcy5ESUFMT0dfRk9OVCkpOwotCQlleGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSwgbkNvbHVtbnMsIDEpKTsKLQkJZXhjb21wb3NpdGUuYWRkRXhwYW5zaW9uTGlzdGVuZXIobmV3IEV4cGFuc2lvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleHBhbnNpb25TdGF0ZUNoYW5nZWQoRXhwYW5zaW9uRXZlbnQgZSkgewotCQkJCWV4cGFuZGVkU3RhdGVDaGFuZ2VkKChFeHBhbmRhYmxlQ29tcG9zaXRlKSBlLmdldFNvdXJjZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCWZFeHBhbmRhYmxlcy5hZGQoZXhjb21wb3NpdGUpOwotCQltYWtlU2Nyb2xsYWJsZUNvbXBvc2l0ZUF3YXJlKGV4Y29tcG9zaXRlKTsKLQkJcmV0dXJuIGV4Y29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlU3R5bGVTZWN0aW9uV2l0aENvbnRlbnRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBpbnQgbkNvbHVtbnMpIHsKLQkJRXhwYW5kYWJsZUNvbXBvc2l0ZSBleGNvbXBvc2l0ZSA9IG5ldyBFeHBhbmRhYmxlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUsIEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuQ0xJRU5UX0lOREVOVCk7Ci0JCWV4Y29tcG9zaXRlLnNldFRleHQobGFiZWwpOwotCQlleGNvbXBvc2l0ZS5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JCWV4Y29tcG9zaXRlLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0Qm9sZChKRmFjZVJlc291cmNlcy5ESUFMT0dfRk9OVCkpOwotCQlleGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSwgbkNvbHVtbnMsIDEpKTsKLQkJZXhjb21wb3NpdGUuYWRkRXhwYW5zaW9uTGlzdGVuZXIobmV3IEV4cGFuc2lvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleHBhbnNpb25TdGF0ZUNoYW5nZWQoRXhwYW5zaW9uRXZlbnQgZSkgewotCQkJCWV4cGFuZGVkU3RhdGVDaGFuZ2VkKChFeHBhbmRhYmxlQ29tcG9zaXRlKSBlLmdldFNvdXJjZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCWZFeHBhbmRhYmxlcy5hZGQoZXhjb21wb3NpdGUpOwotCQltYWtlU2Nyb2xsYWJsZUNvbXBvc2l0ZUF3YXJlKGV4Y29tcG9zaXRlKTsKLQotCQlDb21wb3NpdGUgaW5uZXIgPSBuZXcgQ29tcG9zaXRlKGV4Y29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWlubmVyLnNldEZvbnQoZXhjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLQkJaW5uZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KG5Db2x1bW5zLCBmYWxzZSkpOwotCQlleGNvbXBvc2l0ZS5zZXRDbGllbnQoaW5uZXIpOwotCQlyZXR1cm4gaW5uZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZXhwYW5kZWRTdGF0ZUNoYW5nZWQoRXhwYW5kYWJsZUNvbXBvc2l0ZSBleHBhbmRhYmxlKSB7Ci0JCVNjcm9sbGVkUGFnZUNvbnRlbnQgcGFyZW50U2Nyb2xsZWRDb21wb3NpdGUgPSBnZXRQYXJlbnRTY3JvbGxlZENvbXBvc2l0ZShleHBhbmRhYmxlKTsKLQkJaWYgKHBhcmVudFNjcm9sbGVkQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCXBhcmVudFNjcm9sbGVkQ29tcG9zaXRlLnJlZmxvdyh0cnVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBtYWtlU2Nyb2xsYWJsZUNvbXBvc2l0ZUF3YXJlKENvbnRyb2wgY29udHJvbCkgewotCQlTY3JvbGxlZFBhZ2VDb250ZW50IHBhcmVudFNjcm9sbGVkQ29tcG9zaXRlID0gZ2V0UGFyZW50U2Nyb2xsZWRDb21wb3NpdGUoY29udHJvbCk7Ci0JCWlmIChwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZS5hZGFwdENoaWxkKGNvbnRyb2wpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFNjcm9sbGVkUGFnZUNvbnRlbnQgZ2V0UGFyZW50U2Nyb2xsZWRDb21wb3NpdGUoQ29udHJvbCBjb250cm9sKSB7Ci0JCUNvbnRyb2wgcGFyZW50ID0gY29udHJvbC5nZXRQYXJlbnQoKTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgU2Nyb2xsZWRQYWdlQ29udGVudCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJfQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgU2Nyb2xsZWRQYWdlQ29udGVudCkgewotCQkJcmV0dXJuIChTY3JvbGxlZFBhZ2VDb250ZW50KSBwYXJlbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVTZWN0aW9uRXhwYW5zaW9uU3RhdGVzKElEaWFsb2dTZXR0aW5ncyBzZWN0aW9uKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkV4cGFuZGFibGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlFeHBhbmRhYmxlQ29tcG9zaXRlIGNvbXAgPSAoRXhwYW5kYWJsZUNvbXBvc2l0ZSkgZkV4cGFuZGFibGVzLmdldChpKTsKLQkJCXNlY3Rpb24ucHV0KFNFVFRJTkdTX0VYUEFOREVEICsgU3RyaW5nLnZhbHVlT2YoaSksIGNvbXAuaXNFeHBhbmRlZCgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVTZWN0aW9uRXhwYW5zaW9uU3RhdGVzKElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncykgewotCQlmb3IgKGludCBpPSAwOyBpIDwgZkV4cGFuZGFibGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlFeHBhbmRhYmxlQ29tcG9zaXRlIGV4Y29tcG9zaXRlPSAoRXhwYW5kYWJsZUNvbXBvc2l0ZSkgZkV4cGFuZGFibGVzLmdldChpKTsKLQkJCWlmIChzZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQkJZXhjb21wb3NpdGUuc2V0RXhwYW5kZWQoaSA9PSAwKTsgLy8gb25seSBleHBhbmQgdGhlIGZpcnN0IG5vZGUgYnkgZGVmYXVsdAotCQkJfSBlbHNlIHsKLQkJCQlleGNvbXBvc2l0ZS5zZXRFeHBhbmRlZChzZXR0aW5ncy5nZXRCb29sZWFuKFNFVFRJTkdTX0VYUEFOREVEICsgU3RyaW5nLnZhbHVlT2YoaSkpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc2V0U2V2ZXJpdGllcygpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBkZWZhdWx0Q29udGV4dCA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZDb21ib3Muc2l6ZSgpOyBpKyspIHsKLQkJCUNvbWJvRGF0YSBkYXRhID0gKENvbWJvRGF0YSkgKChDb21ibykgZkNvbWJvcy5nZXQoaSkpLmdldERhdGEoKTsKLQkJCWludCBzZXZlcml0eSA9IGRlZmF1bHRDb250ZXh0LmdldEludChkYXRhLmdldEtleSgpLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJCWRhdGEuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOwotCQkJKChDb21ibykgZkNvbWJvcy5nZXQoaSkpLnNlbGVjdChkYXRhLmdldEluZGV4KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkUmV2YWxpZGF0ZU9uU2V0dGluZ3NDaGFuZ2UoKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gZkNvbWJvcy5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUNvbWJvRGF0YSBkYXRhID0gKENvbWJvRGF0YSkgKChDb21ibykgaXQubmV4dCgpKS5nZXREYXRhKCk7Ci0JCQlpZiAoZGF0YS5pc0NoYW5nZWQoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlpZihzdXBlci5wZXJmb3JtT2soKSAmJiBzaG91bGRSZXZhbGlkYXRlT25TZXR0aW5nc0NoYW5nZSgpKSB7Ci0JCQlNZXNzYWdlQm94IG1iID0gbmV3IE1lc3NhZ2VCb3godGhpcy5nZXRTaGVsbCgpLCBTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuWUVTIHwgU1dULk5PIHwgU1dULkNBTkNFTCB8IFNXVC5JQ09OX0lORk9STUFUSU9OIHwgU1dULlJJR0hUKTsKLQkJCW1iLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVmFsaWRhdGlvbl9UaXRsZSk7Ci0JCQkvKiBDaG9vc2Ugd2hpY2ggbWVzc2FnZSB0byB1c2UgYmFzZWQgb24gaWYgaXRzIHByb2plY3Qgb3Igd29ya3NwYWNlIHNldHRpbmdzICovCi0JCQlTdHJpbmcgbXNnID0gKGdldFByb2plY3QoKSA9PSBudWxsKSA/IEhUTUxVSU1lc3NhZ2VzLlZhbGlkYXRpb25fV29ya3NwYWNlIDogSFRNTFVJTWVzc2FnZXMuVmFsaWRhdGlvbl9Qcm9qZWN0OwotCQkJbWIuc2V0TWVzc2FnZShtc2cpOwotCQkJc3dpdGNoKG1iLm9wZW4oKSkgewotCQkJCWNhc2UgU1dULkNBTkNFTDoKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWNhc2UgU1dULllFUzoKLQkJCQkJc3RvcmVWYWx1ZXMoKTsKLQkJCQkJVmFsaWRhdGVKb2Igam9iID0gbmV3IFZhbGlkYXRlSm9iKEhUTUxVSU1lc3NhZ2VzLlZhbGlkYXRpb25fam9iTmFtZSk7Ci0JCQkJCWpvYi5zY2hlZHVsZSgpOwotCQkJCWNhc2UgU1dULk5POgotCQkJCQlzdG9yZVZhbHVlcygpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHZhbGlkYXRpb24gYWZ0ZXIgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyBoYXZlIGJlZW4gbW9kaWZpZWQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBWYWxpZGF0ZUpvYiBleHRlbmRzIEpvYiB7Ci0KLQkJcHVibGljIFZhbGlkYXRlSm9iKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihuYW1lKTsKLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCXRyeSB7Ci0JCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IG51bGw7Ci0JCQkJLyogQ2hhbmdlZCBwcmVmZXJlbmNlcyBmb3IgYSBzaW5nbGUgcHJvamVjdCwgb25seSB2YWxpZGF0ZSBpdCAqLwotCQkJCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkKLQkJCQkJcHJvamVjdHMgPSBuZXcgSVByb2plY3RbXXtnZXRQcm9qZWN0KCl9OwotCQkJCS8qIFdvcmtzcGFjZS13aWRlIHByZWZlcmVuY2VzIGNoYW5nZWQgKi8KLQkJCQllbHNlIHsKLQkJCQkJLyogR2V0IGFsbCBvZiB0aGUgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZSAqLwotCQkJCQlwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmcyA9IG51bGw7Ci0JCQkJCUxpc3QgcHJvamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCQkJLyogRmlsdGVyIG91dCBwcm9qZWN0cyB0aGF0IHVzZSBwcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzIG9yIGhhdmUgYmVlbiBjbG9zZWQgKi8KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQkJcHJlZnMgPSBuZXcgUHJvamVjdFNjb3BlKHByb2plY3RzW2ldKS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpOwotCQkJCQkJaWYgKHByb2plY3RzW2ldLmlzQWNjZXNzaWJsZSgpICYmICFwcmVmcy5nZXRCb29sZWFuKGdldFByb2plY3RTZXR0aW5nc0tleSgpLCBmYWxzZSkpCi0JCQkJCQkJcHJvamVjdExpc3QuYWRkKHByb2plY3RzW2ldKTsKLQkJCQkJfQotCQkJCQlwcm9qZWN0cyA9IChJUHJvamVjdFtdKSBwcm9qZWN0TGlzdC50b0FycmF5KG5ldyBJUHJvamVjdFtwcm9qZWN0TGlzdC5zaXplKCldKTsKLQkJCQl9Ci0JCQkJZlZhbGlkYXRpb24udmFsaWRhdGUocHJvamVjdHMsIHRydWUsIGZhbHNlLCBtb25pdG9yKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJc3RhdHVzID0gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQl9Ci0KLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUENvbG9yUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUENvbG9yUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ1YTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BDb2xvclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU3R5bGVkVGV4dENvbG9yUGlja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb2xvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpTUENvbG9yUGFnZSBleHRlbmRzIFhNTENvbG9yUGFnZSB7Ci0KLQkvKioKLQkgKiBPdmVycmlkZGVuIHRvIHNldCB1cCBTdHlsZWRUZXh0Q29sb3JQaWNrZXIgZGlmZmVyZW50bHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0ZvclBpY2tlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSB0aGUgY29sb3IgcGlja2VyCi0JCWZQaWNrZXIgPSBuZXcgSlNQU3R5bGVkVGV4dENvbG9yUGlja2VyKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWZQaWNrZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlmUGlja2VyLnNldFByZWZlcmVuY2VTdG9yZShmT3ZlcmxheVN0b3JlKTsKLQkJc2V0dXBQaWNrZXIoZlBpY2tlcik7Ci0KLQkJZlBpY2tlci5zZXRUZXh0KGdldFNhbXBsZVRleHQoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldCB1cCBhbGwgdGhlIHN0eWxlIHByZWZlcmVuY2Uga2V5cyBpbiB0aGUgb3ZlcmxheSBzdG9yZQotCSAqLwotCXByb3RlY3RlZCBPdmVybGF5S2V5W10gY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpIHsKLQkJQXJyYXlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCQlJdGVyYXRvciBpID0gc3R5bGVMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIChTdHJpbmcpaS5uZXh0KCkpKTsJCi0JCX0KLQotCQlPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBrZXlzID0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtvdmVybGF5S2V5cy5zaXplKCldOwotCQlvdmVybGF5S2V5cy50b0FycmF5KGtleXMpOwotCQlyZXR1cm4ga2V5czsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBKU1BVSU1lc3NhZ2VzLlNhbXBsZV9KU1BfZG9jOyAvLyROT04tTkxTLTEkID0gIjwlQCBwYWdlIFxuXHRsYW5ndWFnZT1cImphdmFcIiBcblx0Y29udGVudFR5cGU9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMVwiXG4lPlxuPGpzcDppbmNsdWRlIGZsdXNoPVwidHJ1ZVwiIHBhZ2U9XCJ0aXRsZUJhci5qc3BcIi8+XG5cbjwlLS0gVXNlIGJlbG93IHRhZ3MgT05MWSBmb3IgSlNQIDEuMSAtLSU+XG48JVxuXHRTeXN0ZW0ub3V0LnByaW50bG4oXCJXZWxjb21lIVwiKTtcbiU+XG48JS0tIFVzZSBiZWxvdyB0YWdzIE9OTFkgZm9yIEpTUCAxLjIgLS0lPlxuPGpzcDpzY3JpcHRsZXQ+XG5cdFN5c3RlbS5vdXQucHJpbnRsbihcIldlbGNvbWUhXCIpO1xuPC9qc3A6c2NyaXB0bGV0PiIKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGV4dFN0eWxlTWFwKERpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwKSB7Ci0KLQkJaW5pdENvbW1vbkNvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCQljb250ZXh0U3R5bGVNYXAucmVtb3ZlKERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpOyAvLyBsZWF2ZSBjb250ZW50IGJldHdlZW4gdGFncyBhbG9uZQotCQljb250ZXh0U3R5bGVNYXAucmVtb3ZlKERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pOyAvLyB4bWwvaHRtbCBzcGVjaWZpYwotCQljb250ZXh0U3R5bGVNYXAucmVtb3ZlKERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsgLy8geG1sL2h0bWwgc3BlY2lmaWMKLQkJY29udGV4dFN0eWxlTWFwLnJlbW92ZShET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OKTsgLy8geG1sL2h0bWwgc3BlY2lmaWMKLQkJY29udGV4dFN0eWxlTWFwLnJlbW92ZShET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xfQ0xPU0UpOyAvLyB4bWwvaHRtbCBzcGVjaWZpYwotCi0JCS8vCWNvbnRleHRTdHlsZU1hcC5wdXQoWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIEhUTUxDb2xvck1hbmFnZXIuU0NSSVBUX0FSRUEpOwotCQkvLwljb250ZXh0U3R5bGVNYXAucHV0KFhNTEpTUFJlZ2lvbkNvbnRleHRzLkJMT0NLX1RFWFQsIEhUTUxDb2xvck1hbmFnZXIuU0NSSVBUX0FSRUEpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOLCBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOLCBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiwgSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiwgSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UsIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UsIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVCk7Ci0JCQotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX1RFWFQsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQkKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RGVzY3JpcHRpb25zKERpY3Rpb25hcnkgZGVzY3JpcHRpb25zKSB7Ci0JCWluaXRDb21tb25EZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJZGVzY3JpcHRpb25zLnJlbW92ZShJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOyAvLyBsZWF2ZSBjb250ZW50IGJldHdlZW4gdGFncyBhbG9uZQotCQlkZXNjcmlwdGlvbnMucmVtb3ZlKElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7IC8vIHhtbC9odG1sIHNwZWNpZmljCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIsIEpTUFVJTWVzc2FnZXMuSlNQX0RlbGltaXRlcnNfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJKU1AgRGVsaW1pdGVycyIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNKU1AuSlNQX0NPTlRFTlQsIEpTUFVJTWVzc2FnZXMuSlNQQ29sb3JQYWdlX2pzcF9jb250ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0U3R5bGVMaXN0KEFycmF5TGlzdCBsaXN0KSB7Ci0JCWluaXRDb21tb25TdHlsZUxpc3QobGlzdCk7Ci0JCWxpc3QucmVtb3ZlKElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7IC8vIGxlYXZlIGNvbnRlbnQgYmV0d2VlbiB0YWdzIGFsb25lCi0JCWxpc3QucmVtb3ZlKElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7IC8vIHhtbC9odG1sIHNwZWNpZmljCi0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzSlNQLkpTUF9DT05URU5UKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFBpY2tlcihTdHlsZWRUZXh0Q29sb3JQaWNrZXIgcGlja2VyKSB7Ci0JCUlNb2RlbE1hbmFnZXIgbW1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlwaWNrZXIuc2V0UGFyc2VyKG1tYW5hZ2VyLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKS5nZXRQYXJzZXIoKSk7Ci0KLQkJLy8gY3JlYXRlIGRlc2NyaXB0aW9ucyBmb3IgaGlnaGxpZ2h0aW5nIHR5cGVzCi0JCURpY3Rpb25hcnkgZGVzY3JpcHRpb25zID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0RGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0KLQkJLy8gbWFwIHJlZ2lvbiB0eXBlcyB0byBoaWdobGlnaHRpbmcgdHlwZXMKLQkJRGljdGlvbmFyeSBjb250ZXh0U3R5bGVNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWluaXRDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQotCQlBcnJheUxpc3Qgc3R5bGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbml0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0KLQkJcGlja2VyLnNldENvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCQlwaWNrZXIuc2V0RGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0JCXBpY2tlci5zZXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGMsIElIZWxwQ29udGV4dElkcy5KU1BfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCk7Ci0JCXJldHVybiBjOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdENvbG9yUGFnZSNzYXZlUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHsKLQkJSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BDb250ZW50QXNzaXN0UHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BDb250ZW50QXNzaXN0UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZjMmRlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQQ29udGVudEFzc2lzdFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlNQVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zb2FsQ2F0aWdvcmllc0NvbmZpZ3VyYXRpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5Db2RlQXNzaXN0Q3ljbGluZ0NvbmZpZ3VyYXRpb25CbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLklDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlcjsKLQotLyoqCi0gKiA8cD5EZWZpbmVzIHRoZSBwcmVmZXJlbmNlIHBhZ2UgZm9yIGFsbG93aW5nIHRoZSB1c2VyIHRvIGNoYW5nZSB0aGUgY29udGVudAotICogYXNzaXN0IHByZWZlcmVuY2VzPC9wPgotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29udGVudEFzc2lzdFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0JCUlXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTlRFTlRfVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qIENoZWNrYm94IHRvIHN0b3JlIEF1dG8gSW5zZXJ0aW9uIHByZWZlcmVuY2UgKi8KLQlwcml2YXRlIEJ1dHRvbiBmQXV0b0ltcG9ydDsKLQkKLQkvKiogY29uZmlndXJhdGlvbiBibG9jayBmb3IgY2hhbmdpbmcgcHJlZmVyZW5jZSBoYXZpbmcgdG8gZG8gd2l0aCB0aGUgY29udGVudCBhc3Npc3QgY2F0ZWdvcmllcyAqLwotCXByaXZhdGUgQ29kZUFzc2lzdEN5Y2xpbmdDb25maWd1cmF0aW9uQmxvY2sgZkNvbmZpZ3VyYXRpb25CbG9jazsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCQotCQljcmVhdGVDb250ZW50c0ZvckF1dG9JbnNlcnRpb25Hcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVDb250ZW50c0ZvckN5Y2xpbmdHcm91cChjb21wb3NpdGUpOwotCQkKLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlwZXJmb3JtRGVmYXVsdHNGb3JBdXRvSW5zZXJ0aW9uR3JvdXAoKTsKLQkJcGVyZm9ybURlZmF1bHRzRm9yQ3ljbGluZ0dyb3VwKCk7Ci0KLQkJdmFsaWRhdGVWYWx1ZXMoKTsKLQkJZW5hYmxlVmFsdWVzKCk7Ci0KLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlI2luaXRpYWxpemVWYWx1ZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWluaXRpYWxpemVWYWx1ZXNGb3JBdXRvSW5zZXJ0aW9uR3JvdXAoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckN5Y2xpbmdHcm91cCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSNzdG9yZVZhbHVlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCXN0b3JlVmFsdWVzRm9yQXV0b0luc2VydGlvbkdyb3VwKCk7Ci0JCXN0b3JlVmFsdWVzRm9yQ3ljbGluZ0dyb3VwKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPkNyZWF0ZSB0aGUgY29udGVudHMgZm9yIHRoZSBjb250ZW50IGFzc2lzdCBBdXRvIEluc2VydGlvbiBwcmVmZXJlbmNlIGdyb3VwPC9wPgotCSAqIEBwYXJhbSBwYXJlbnQge0BsaW5rIENvbXBvc2l0ZX0gcGFyZW50IG9mIHRoZSBncm91cAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50c0ZvckF1dG9JbnNlcnRpb25Hcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQkJCi0JCWdyb3VwLnNldFRleHQoSlNQVUlNZXNzYWdlcy5KU1BDb2RlQXNzaXN0X0luc2VydGlvbik7Ci0JCQotCQlmQXV0b0ltcG9ydCA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBKU1BVSU1lc3NhZ2VzLkpTUENvZGVBc3Npc3RfQXV0b19JbXBvcnQpOwotCQkoKEdyaWREYXRhKSBmQXV0b0ltcG9ydC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJCi0JCi0JfQotCQotCS8qKgotCSAqIDxwPkNyZWF0ZSB0aGUgY29udGVudHMgZm9yIHRoZSBjb250ZW50IGFzc2lzdCBjeWNsaW5nIHByZWZlcmVuY2UgZ3JvdXA8L3A+Ci0JICogQHBhcmFtIHBhcmVudCB7QGxpbmsgQ29tcG9zaXRlfSBwYXJlbnQgb2YgdGhlIGdyb3VwCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yQ3ljbGluZ0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyIGNvbmZpZ3VyYXRpb25Xcml0ZXIgPSBDb21wbGV0aW9uUHJvcG9zb2FsQ2F0aWdvcmllc0NvbmZpZ3VyYXRpb25SZWdpc3RyeS5nZXREZWZhdWx0KCkuZ2V0V3JpdGFibGVDb25maWd1cmF0aW9uKEpTUF9DT05URU5UX1RZUEVfSUQpOwotCQkKLQkJaWYoY29uZmlndXJhdGlvbldyaXRlciAhPSBudWxsKSB7Ci0JCQlmQ29uZmlndXJhdGlvbkJsb2NrID0gbmV3IENvZGVBc3Npc3RDeWNsaW5nQ29uZmlndXJhdGlvbkJsb2NrKEpTUF9DT05URU5UX1RZUEVfSUQsIGNvbmZpZ3VyYXRpb25Xcml0ZXIpOwotCQkJZkNvbmZpZ3VyYXRpb25CbG9jay5jcmVhdGVDb250ZW50cyhwYXJlbnQsIEpTUFVJTWVzc2FnZXMuQ3ljbGluZ19VSSk7Ci0JCX0gZWxzZSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIlRoZXJlIHNob3VsZCBiZSBhbiBJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25Xcml0ZXIiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiIHNwZWNpZmllZCBmb3IgdGhlIEpTUCBjb250ZW50IHR5cGUsIGJ1dCBjYW4ndCBmaW5lIGl0LCB0aHVzIGNhbid0IGNyZWF0ZSB1c2VyIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJIiBwcmVmZXJlbmNlIGJsb2NrIGZvciBlZGl0aW5nIHByb3Bvc2FsIGNhdGVnb3JpZXMgcHJlZmVyZW5jZXMuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiA8cD5TdG9yZSB0aGUgdmFsdWVzIGZvciB0aGUgYXV0byBpbnNlcnRpb24gZ3JvdXA8L3A+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzRm9yQXV0b0luc2VydGlvbkdyb3VwKCkgewotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShKU1BVSVByZWZlcmVuY2VOYW1lcy5BVVRPX0lNUE9SVF9JTlNFUlQsIChmQXV0b0ltcG9ydCAhPSBudWxsKSA/IGZBdXRvSW1wb3J0LmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiA8cD5TdG9yZSB0aGUgdmFsdWVzIGZvciB0aGUgY3ljbGluZyBncm91cDwvcD4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXNGb3JDeWNsaW5nR3JvdXAoKSB7Ci0JCWlmIChmQ29uZmlndXJhdGlvbkJsb2NrICE9IG51bGwpIHsKLQkJCWZDb25maWd1cmF0aW9uQmxvY2suc3RvcmVWYWx1ZXMoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD5Jbml0aWFsaXplIHRoZSB2YWx1ZXMgZm9yIHRoZSBhdXRvIGluc2VydGlvbiBncm91cDwvcD4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckF1dG9JbnNlcnRpb25Hcm91cCgpIHsKLQkJaW5pdENoZWNrYm94KGZBdXRvSW1wb3J0LCBKU1BVSVByZWZlcmVuY2VOYW1lcy5BVVRPX0lNUE9SVF9JTlNFUlQpOwotCX0KLQkKLQkvKioKLQkgKiA8cD5Jbml0aWFsaXplIHRoZSB2YWx1ZXMgZm9yIHRoZSBjeWNsaW5nIGdyb3VwPC9wPgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yQ3ljbGluZ0dyb3VwKCkgewotCQlpZihmQ29uZmlndXJhdGlvbkJsb2NrICE9IG51bGwpIHsKLQkJCWZDb25maWd1cmF0aW9uQmxvY2suaW5pdGlhbGl6ZVZhbHVlcygpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPkxvYWQgdGhlIGRlZmF1bHRzIGZvciB0aGUgYXV0byBhY3RpdmF0aW9uIGdyb3VwPC9wPgotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGVmYXVsdHNGb3JBdXRvSW5zZXJ0aW9uR3JvdXAoKSB7Ci0JCWRlZmF1bHRDaGVja2JveChmQXV0b0ltcG9ydCwgSlNQVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19JTVBPUlRfSU5TRVJUKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+TG9hZCB0aGUgZGVmYXVsdHMgb2YgdGhlIGN5Y2xpbmcgZ3JvdXA8L3A+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckN5Y2xpbmdHcm91cCgpIHsKLQkJaWYoZkNvbmZpZ3VyYXRpb25CbG9jayAhPSBudWxsKSB7Ci0JCQlmQ29uZmlndXJhdGlvbkJsb2NrLnBlcmZvcm1EZWZhdWx0cygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZDA0MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlNQVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxGaWxlc1ByZWZlcmVuY2VQYWdlOwotCi1wdWJsaWMgY2xhc3MgSlNQRmlsZXNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFhNTEZpbGVzUHJlZmVyZW5jZVBhZ2UgewotCXByaXZhdGUgQnV0dG9uIGZKU1BTZWFyY2hUb0phdmFTZWFyY2hCdXR0b247Ci0JCi0JLyoqCi0JICogPHA+PGI+Tk9URTogPC9iPm9yaWdpbmFsbHkgY29waWVkIGZyb20ge0BsaW5rIFhNTEZpbGVzUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpfTwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHNjcm9sbGVkQ29tcG9zaXRlID0gY3JlYXRlU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50KTsKLQkJY3JlYXRlQ29udGVudHNGb3JDcmVhdGluZ0dyb3VwKHNjcm9sbGVkQ29tcG9zaXRlKTsKLQkJY3JlYXRlQ29udGVudHNGb3JTZWFyY2hHcm91cChzY3JvbGxlZENvbXBvc2l0ZSk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzY3JvbGxlZENvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLkpTUF9QUkVGV0VCWF9GSUxFU19IRUxQSUQpOwotCi0JCXNldFNpemUoc2Nyb2xsZWRDb21wb3NpdGUpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQotCQlyZXR1cm4gc2Nyb2xsZWRDb21wb3NpdGU7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHNGb3JTZWFyY2hHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAxKTsKLQkJZ3JvdXAuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLkpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfU2VhcmNoX2dyb3VwKTsKLQkJZkpTUFNlYXJjaFRvSmF2YVNlYXJjaEJ1dHRvbiA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBKU1BVSU1lc3NhZ2VzLkpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfU3VwcGx5X0pTUF9zZWFyY2hfdG9fSmF2YV9zZWFyY2gpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxGaWxlc1ByZWZlcmVuY2VQYWdlI2luaXRpYWxpemVWYWx1ZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVWYWx1ZXMoKTsKLQkJaW5pdENoZWNrYm94KGZKU1BTZWFyY2hUb0phdmFTZWFyY2hCdXR0b24sIEpTUFVJUHJlZmVyZW5jZU5hbWVzLlNVUFBMWV9KU1BfU0VBUkNIX1JFU1VMVFNfVE9fSkFWQV9TRUFSQ0gpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxGaWxlc1ByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJZGVmYXVsdENoZWNrYm94KGZKU1BTZWFyY2hUb0phdmFTZWFyY2hCdXR0b24sIEpTUFVJUHJlZmVyZW5jZU5hbWVzLlNVUFBMWV9KU1BfU0VBUkNIX1JFU1VMVFNfVE9fSkFWQV9TRUFSQ0gpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxGaWxlc1ByZWZlcmVuY2VQYWdlI3N0b3JlVmFsdWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJc3VwZXIuc3RvcmVWYWx1ZXMoKTsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSlNQVUlQcmVmZXJlbmNlTmFtZXMuU1VQUExZX0pTUF9TRUFSQ0hfUkVTVUxUU19UT19KQVZBX1NFQVJDSCwKLQkJCQkoZkpTUFNlYXJjaFRvSmF2YVNlYXJjaEJ1dHRvbiAhPSBudWxsKSA/IGZKU1BTZWFyY2hUb0phdmFTZWFyY2hCdXR0b24uZ2V0U2VsZWN0aW9uKCkgOiBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MRmlsZXNQcmVmZXJlbmNlUGFnZSNnZXRDb250ZW50VHlwZSgpCi0JICovCi0JcHJvdGVjdGVkIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxGaWxlc1ByZWZlcmVuY2VQYWdlI2RvU2F2ZVByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCkgewotCQlKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MRmlsZXNQcmVmZXJlbmNlUGFnZSNnZXRNb2RlbFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQU291cmNlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE3NmI0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQU291cmNlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWREYXRhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlTGlua0FyZWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXI7Ci0KLXB1YmxpYyBjbGFzcyBKU1BTb3VyY2VQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCi0JCW5ldyBQcmVmZXJlbmNlTGlua0FyZWEoY29tcG9zaXRlLCBTV1QuV1JBUCB8IFNXVC5NVUxUSSwgIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZWRpdG9yIiwgSlNQVUlNZXNzYWdlcy5fVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LLC8vJE5PTi1OTFMtMSQKLQkJCQkJKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKSBnZXRDb250YWluZXIoKSwgbnVsbCkuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmluZGVudCg1LCAwKS5oaW50KDE1MCwgU1dULkRFRkFVTFQpLmNyZWF0ZSgpKTsKLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LnN3dERlZmF1bHRzKCkuY3JlYXRlKCkpOwotCi0JCVRleHQgbGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQlsYWJlbC5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5ERUZBVUxULCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlQcmVmZXJlbmNlTGlua0FyZWEgZmlsZUVkaXRvcnNBcmVhID0gbmV3IFByZWZlcmVuY2VMaW5rQXJlYShjb21wb3NpdGUsIFNXVC5OT05FLCAib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMuc291cmNlIiwgSlNQVUlNZXNzYWdlcy5KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8xLC8vJE5PTi1OTFMtMSQKLQkJCQkJKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKSBnZXRDb250YWluZXIoKSwgbnVsbCk7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkRFRkFVTFQsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gNTsKLQkJZmlsZUVkaXRvcnNBcmVhLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCVByZWZlcmVuY2VMaW5rQXJlYSBjb250ZW50VHlwZUFyZWEgPSBuZXcgUHJlZmVyZW5jZUxpbmtBcmVhKGNvbXBvc2l0ZSwgU1dULk5PTkUsICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC5zb3VyY2UiLCBKU1BVSU1lc3NhZ2VzLkpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzIsLy8kTk9OLU5MUy0xJAotCQkJCQkoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLCBudWxsKTsKLQotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuREVGQVVMVCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSA1OwotCQljb250ZW50VHlwZUFyZWEuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFN0eWxlZFRleHRDb2xvclBpY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFN0eWxlZFRleHRDb2xvclBpY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWJkODA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BTdHlsZWRUZXh0Q29sb3JQaWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU3R5bGVkVGV4dENvbG9yUGlja2VyOwotCi0vKioKLSogT3ZlcnJpZGVzIFN0eWxlZFRleHRDb2xvclBpY2tlciBmb3Igc3BlY2lhbCBlbmFibGVtZW50IGJlaGF2aW9yIAotKiBmb3IgSlNQQ29udGVudCAob25seSBiYWNrZ3JvdW5kIHNldHRhYmxlKQotKiovCi1wdWJsaWMgY2xhc3MgSlNQU3R5bGVkVGV4dENvbG9yUGlja2VyIGV4dGVuZHMgU3R5bGVkVGV4dENvbG9yUGlja2VyIHsKLQkKLQlwdWJsaWMgSlNQU3R5bGVkVGV4dENvbG9yUGlja2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQl9Ci0JCi0JLyoqCi0JICogQWN0aXZhdGUgY29udHJvbHMgYmFzZWQgb24gdGhlIGdpdmVuIGxvY2FsIGNvbG9yIHR5cGUuCi0JICogT3ZlcnJpZGRlbiB0byBkaXNhYmxlIGZvcmVncm91bmQgY29sb3IsIGJvbGQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGUoU3RyaW5nIG5hbWVkU3R5bGUpIHsKLQkJc3VwZXIuYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JCQotCQlpZihuYW1lZFN0eWxlID09IElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVCkgewotCQkJZkZvcmVncm91bmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQm9sZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWlmIChzaG93SXRhbGljKQotCQkJCWZJdGFsaWMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwkKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BTeW50YXhDb2xvcmluZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BTeW50YXhDb2xvcmluZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJkNzU1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQU3ludGF4Q29sb3JpbmdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuQ29sb3JTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIEEgcHJlZmVyZW5jZSBwYWdlIHRvIGNvbmZpZ3VyZSBvdXIgWE1MIHN5bnRheCBjb2xvci4gSXQgcmVzZW1ibGVzIHRoZSBKRFQKLSAqIGFuZCBDRFQgcGFnZXMgZmFyIG1vcmUgdGhhbiBvdXIgb3JpZ2luYWwgY29sb3IgcGFnZSB3aGlsZSByZXRhaW5pbmcgdGhlCi0gKiBleHRyYSAiY2xpY2stdG8tZmluZCIgZnVuY3Rpb25hbGl0eS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpTUFN5bnRheENvbG9yaW5nUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgQnV0dG9uIGZCb2xkOwotCXByaXZhdGUgTGFiZWwgZkZvcmVncm91bmRMYWJlbDsKLQlwcml2YXRlIExhYmVsIGZCYWNrZ3JvdW5kTGFiZWw7Ci0JcHJpdmF0ZSBCdXR0b24gZkNsZWFyU3R5bGU7Ci0JcHJpdmF0ZSBNYXAgZkNvbnRleHRUb1N0eWxlTWFwOwotCXByaXZhdGUgQ29sb3IgZkRlZmF1bHRGb3JlZ3JvdW5kID0gbnVsbDsKLQlwcml2YXRlIENvbG9yIGZEZWZhdWx0QmFja2dyb3VuZCA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIENvbG9yU2VsZWN0b3IgZkZvcmVncm91bmRDb2xvckVkaXRvcjsKLQlwcml2YXRlIENvbG9yU2VsZWN0b3IgZkJhY2tncm91bmRDb2xvckVkaXRvcjsKLQlwcml2YXRlIEJ1dHRvbiBmSXRhbGljOwotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBmT3ZlcmxheVN0b3JlOwotCXByaXZhdGUgQnV0dG9uIGZTdHJpa2U7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGZTdHlsZVByZWZlcmVuY2VLZXlzOwotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlciBmU3R5bGVzVmlld2VyID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwOwotCXByaXZhdGUgU3R5bGVkVGV4dCBmVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBmVW5kZXJsaW5lOwotCi0KLQkvLyBhY3RpdmF0ZSBjb250cm9scyBiYXNlZCBvbiB0aGUgZ2l2ZW4gbG9jYWwgY29sb3IgdHlwZQotCXByaXZhdGUgdm9pZCBhY3RpdmF0ZShTdHJpbmcgbmFtZWRTdHlsZSkgewotCQlDb2xvciBmb3JlZ3JvdW5kID0gZkRlZmF1bHRGb3JlZ3JvdW5kOwotCQlDb2xvciBiYWNrZ3JvdW5kID0gZkRlZmF1bHRCYWNrZ3JvdW5kOwotCQlpZiAobmFtZWRTdHlsZSA9PSBudWxsKSB7Ci0JCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZCb2xkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkl0YWxpYy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZTdHJpa2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkZvcmVncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZCYWNrZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZCb2xkLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlmSXRhbGljLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlmU3RyaWtlLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlmVW5kZXJsaW5lLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlUZXh0QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEF0dHJpYnV0ZUZvcihuYW1lZFN0eWxlKTsKLQkJCWZDbGVhclN0eWxlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlib29sZWFuIGVuYWJsZUJhY2tncm91bmRPbmx5ID0gSVN0eWxlQ29uc3RhbnRzSlNQLkpTUF9DT05URU5ULmVxdWFscyhuYW1lZFN0eWxlKTsKLQkJCWZCb2xkLnNldEVuYWJsZWQoIWVuYWJsZUJhY2tncm91bmRPbmx5KTsKLQkJCWZJdGFsaWMuc2V0RW5hYmxlZCghZW5hYmxlQmFja2dyb3VuZE9ubHkpOwotCQkJZlN0cmlrZS5zZXRFbmFibGVkKCFlbmFibGVCYWNrZ3JvdW5kT25seSk7Ci0JCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQoIWVuYWJsZUJhY2tncm91bmRPbmx5KTsKLQkJCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZCghZW5hYmxlQmFja2dyb3VuZE9ubHkpOwotCQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKCFlbmFibGVCYWNrZ3JvdW5kT25seSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQm9sZC5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOwotCQkJZkl0YWxpYy5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7Ci0JCQlmU3RyaWtlLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0gpICE9IDApOwotCQkJZlVuZGVybGluZS5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkUpICE9IDApOwotCQkJaWYgKGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWZvcmVncm91bmQgPSBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJfQotCQkJaWYgKGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWJhY2tncm91bmQgPSBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpOwotCQkJfQotCQl9Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRDb2xvclZhbHVlKGZvcmVncm91bmQuZ2V0UkdCKCkpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldENvbG9yVmFsdWUoYmFja2dyb3VuZC5nZXRSR0IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29sb3IgdGhlIHRleHQgaW4gdGhlIHNhbXBsZSBhcmVhIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwcmVmZXJlbmNlcwotCSAqLwotCXZvaWQgYXBwbHlTdHlsZXMoKSB7Ci0JCWlmIChmVGV4dCA9PSBudWxsIHx8IGZUZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJLy8gbG9va3VwIHRoZSBsb2NhbCBjb2xvcmluZyB0eXBlIGFuZCBhcHBseSBpdAotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZkNvbnRleHRUb1N0eWxlTWFwLmdldChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSk7Ci0JCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVGb3IobmFtZWRTdHlsZSk7Ci0JCQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY3VycmVudFJlZ2lvbiksIGN1cnJlbnRSZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0U3R5bGUoKSk7Ci0JCQkJc3R5bGUuc3RyaWtlb3V0ID0gKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwOwotCQkJCXN0eWxlLnVuZGVybGluZSA9IChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwOwotCQkJCWZUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCQkJfQotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQl9Ci0KLQlCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tcG9zaXRlIGNvbnRyb2wgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCWZEZWZhdWx0Rm9yZWdyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCk7Ci0JCWZEZWZhdWx0QmFja2dyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLkpTUF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhwYWdlQ29tcG9uZW50LCBTV1QuV1JBUCk7Ci0JCWxpbmsuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nX0xpbmspOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24ocGFyZW50LmdldFNoZWxsKCksIGUudGV4dCwgbnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyaWREYXRhIGxpbmtEYXRhPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGlua0RhdGEud2lkdGhIaW50PSAxNTA7IC8vIG9ubHkgZXhwYW5kIGZ1cnRoZXIgaWYgYW55b25lIGVsc2UgcmVxdWlyZXMgaXQKLQkJbGluay5zZXRMYXlvdXREYXRhKGxpbmtEYXRhKTsKLQotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCVNhc2hGb3JtIGVkaXRvciA9IG5ldyBTYXNoRm9ybShwYWdlQ29tcG9uZW50LCBTV1QuVkVSVElDQUwpOwotCQlHcmlkRGF0YSBncmlkRGF0YTIgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEyLmhvcml6b250YWxTcGFuID0gMjsKLQkJZWRpdG9yLnNldExheW91dERhdGEoZ3JpZERhdGEyKTsKLQkJU2FzaEZvcm0gdG9wID0gbmV3IFNhc2hGb3JtKGVkaXRvciwgU1dULkhPUklaT05UQUwpOwotCQlDb21wb3NpdGUgc3R5bGVFZGl0b3IgPSBjcmVhdGVDb21wb3NpdGUodG9wLCAxKTsKLQkJKChHcmlkTGF5b3V0KSBzdHlsZUVkaXRvci5nZXRMYXlvdXQoKSkubWFyZ2luUmlnaHQgPSA1OwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gMDsKLQkJY3JlYXRlTGFiZWwoc3R5bGVFZGl0b3IsIEpTUFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzApOwotCQlmU3R5bGVzVmlld2VyID0gY3JlYXRlU3R5bGVzVmlld2VyKHN0eWxlRWRpdG9yKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBNYXRoLm1heChncmlkRGF0YS53aWR0aEhpbnQsIGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhpdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKS5sZW5ndGgoKSkpOwotCQl9Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQlmU3R5bGVzVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlDb21wb3NpdGUgZWRpdGluZ0NvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b3AsIDEpOwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gNTsKLQkJY3JlYXRlTGFiZWwoZWRpdGluZ0NvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1dHRvbiBlbmFibGVyID0gY3JlYXRlQ2hlY2tib3goZWRpdGluZ0NvbXBvc2l0ZSwgSlNQVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMik7Ci0JCWVuYWJsZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVuYWJsZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQlDb21wb3NpdGUgZWRpdENvbnRyb2xzID0gY3JlYXRlQ29tcG9zaXRlKGVkaXRpbmdDb21wb3NpdGUsIDIpOwotCQkoKEdyaWRMYXlvdXQpIGVkaXRDb250cm9scy5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDIwOwotCi0JCWZGb3JlZ3JvdW5kTGFiZWwgPSBjcmVhdGVMYWJlbChlZGl0Q29udHJvbHMsIFNTRVVJTWVzc2FnZXMuRm9yZWdyb3VuZF9VSV8pOwotCQkoKEdyaWREYXRhKSBmRm9yZWdyb3VuZExhYmVsLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JTZWxlY3RvcihlZGl0Q29udHJvbHMpOwotCQlCdXR0b24gZkZvcmVncm91bmRDb2xvciA9IGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlmRm9yZWdyb3VuZENvbG9yLnNldExheW91dERhdGEoZ2QpOwotCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCYWNrZ3JvdW5kTGFiZWwgPSBjcmVhdGVMYWJlbChlZGl0Q29udHJvbHMsIFNTRVVJTWVzc2FnZXMuQmFja2dyb3VuZF9VSV8pOwotCQkoKEdyaWREYXRhKSBmQmFja2dyb3VuZExhYmVsLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JTZWxlY3RvcihlZGl0Q29udHJvbHMpOwotCQlCdXR0b24gZkJhY2tncm91bmRDb2xvciA9IGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlmQmFja2dyb3VuZENvbG9yLnNldExheW91dERhdGEoZ2QpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCb2xkID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBKU1BVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV8zKTsKLQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZCb2xkLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmSXRhbGljID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBKU1BVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV80KTsKLQkJZkl0YWxpYy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJKChHcmlkRGF0YSkgZkl0YWxpYy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlN0cmlrZSA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgSlNQVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfNSk7Ci0JCWZTdHJpa2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZTdHJpa2UuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZVbmRlcmxpbmUgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIEpTUFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzYpOwotCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmVW5kZXJsaW5lLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmQ2xlYXJTdHlsZSA9IG5ldyBCdXR0b24oZWRpdGluZ0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlmQ2xlYXJTdHlsZS5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuUmVzdG9yZV9EZWZhdWx0X1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiUmVzdG9yZSBEZWZhdWx0IgotCQlmQ2xlYXJTdHlsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HKSk7Ci0JCSgoR3JpZERhdGEpIGZDbGVhclN0eWxlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlDb21wb3NpdGUgc2FtcGxlQXJlYSA9IGNyZWF0ZUNvbXBvc2l0ZShlZGl0b3IsIDEpOwotCi0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDU7Ci0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luVG9wID0gNTsKLQkJY3JlYXRlTGFiZWwoc2FtcGxlQXJlYSwgU1NFVUlNZXNzYWdlcy5TYW1wbGVfdGV4dF9fVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICImU2FtcGxlIHRleHQ6IgotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFNvdXJjZVZpZXdlcihzYW1wbGVBcmVhLCBudWxsLCBTV1QuQk9SREVSIHwgU1dULkxFRlRfVE9fUklHSFQgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZlRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlHcmlkRGF0YSBncmlkRGF0YTMgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEzLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyMCk7Ci0JCWdyaWREYXRhMy5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJZ3JpZERhdGEzLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YTMpOwotCQlmVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWZUZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlmVGV4dC5hZGRLZXlMaXN0ZW5lcihnZXRUZXh0S2V5TGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkTW91c2VMaXN0ZW5lcihnZXRUZXh0TW91c2VMaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkVHJhdmVyc2VMaXN0ZW5lcihnZXRUcmF2ZXJzZUxpc3RlbmVyKCkpOwotCQlzZXRBY2Nlc3NpYmxlKGZUZXh0LCBTU0VVSU1lc3NhZ2VzLlNhbXBsZV90ZXh0X19VSV8pOwotCQlmRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJZkRvY3VtZW50LnNldChnZXRFeGFtcGxlVGV4dCgpKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGZEb2N1bWVudCk7Ci0KLQkJdG9wLnNldFdlaWdodHMobmV3IGludFtdezEsIDF9KTsKLQkJZWRpdG9yLnNldFdlaWdodHMobmV3IGludFtdezEsIDF9KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYWdlQ29tcG9uZW50LCBJSGVscENvbnRleHRJZHMuSlNQX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCi0JCWZTdHlsZXNWaWV3ZXIuc2V0SW5wdXQoZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpKTsKLQotCQlhcHBseVN0eWxlcygpOwotCi0JCWZTdHlsZXNWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIWV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgewotCQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJCQlpZiAobmFtZWRTdHlsZSA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1swXTsKLQkJCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0Q29sb3JWYWx1ZSgpKTsKLQotCQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQkJc3R5bGVQcmVmc1swXSA9IG5ld1ZhbHVlOwotCQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1sxXTsKLQkJCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0Q29sb3JWYWx1ZSgpKTsKLQotCQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQkJc3R5bGVQcmVmc1sxXSA9IG5ld1ZhbHVlOwotCQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJvbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1syXTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZkJvbGQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbMl0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkl0YWxpYy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzNdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmSXRhbGljLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzNdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZTdHJpa2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1s0XTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZlN0cmlrZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1s0XSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmVW5kZXJsaW5lLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbNV07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZVbmRlcmxpbmUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbNV0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkNsZWFyU3R5bGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm47Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKS50b1N0cmluZygpOwotCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFRvRGVmYXVsdChuYW1lZFN0eWxlKTsKLQkJCQlhcHBseVN0eWxlcygpOwotCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gcGFnZUNvbXBvbmVudDsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGFiZWwuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8vIHByb3RlY3RlZCBMYWJlbCBjcmVhdGVEZXNjcmlwdGlvbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYWxsIHRoZSBzdHlsZSBwcmVmZXJlbmNlIGtleXMgaW4gdGhlIG92ZXJsYXkgc3RvcmUKLQkgKi8KLQlwcml2YXRlIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUl0ZXJhdG9yIGkgPSBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgKFN0cmluZykgaS5uZXh0KCkpKTsKLQkJfQotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIExpc3Qgdmlld2VyIHdoZXJlIHdlIHNlZSB0aGUgdmFyaW91cyBzeW50YXggZWxlbWVudCBkaXNwbGF5Ci0JICogbmFtZXMtLXdvdWxkIGl0IGV2ZXIgYmUgYSBUcmVlIGxpa2UgSkRUJ3M/Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgY3JlYXRlU3R5bGVzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RydWN0dXJlZFZpZXdlciBzdHlsZXNWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVzVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKSkpOwotCQlzdHlsZXNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCU9iamVjdCBkZXNjcmlwdGlvbiA9IGZTdHlsZVRvRGVzY3JpcHRpb25NYXAuZ2V0KGVsZW1lbnQpOwotCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJCQlyZXR1cm4gZGVzY3JpcHRpb24udG9TdHJpbmcoKTsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXN0eWxlc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKS50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHN0eWxlc1ZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQlmT3ZlcmxheVN0b3JlLnN0b3AoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihTdHJpbmcgbmFtZWRTdHlsZSkgewotCQlUZXh0QXR0cmlidXRlIHRhID0gbmV3IFRleHRBdHRyaWJ1dGUoZkRlZmF1bHRGb3JlZ3JvdW5kLCBmRGVmYXVsdEJhY2tncm91bmQsIFNXVC5OT1JNQUwpOwotCi0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwgJiYgZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQkvLyBub3RlOiAibmFtZWRTdHlsZSIgKmlzKiB0aGUgcHJlZmVyZW5jZSBrZXkKLQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCi0JCQkJaW50IGZvbnRNb2RpZmllciA9IFNXVC5OT1JNQUw7Ci0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAyKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAzKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1szXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDQpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzRdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiA1KSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1s1XSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXRhID0gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgZm9udE1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGE7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RXhhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBKU1BVSU1lc3NhZ2VzLlNhbXBsZV9KU1BfZG9jOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5hbWVkU3R5bGVBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCS8vIGVuc3VyZSB0aGUgb2Zmc2V0IGlzIGNsZWFuCi0JCWlmIChvZmZzZXQgPj0gZkRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJcmV0dXJuIGdldE5hbWVkU3R5bGVBdE9mZnNldChmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJZWxzZSBpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybiBnZXROYW1lZFN0eWxlQXRPZmZzZXQoMCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBmRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJd2hpbGUgKGRvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgIWRvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCWRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQl9Ci0JCWlmIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBmaW5kIHRoZSBJVGV4dFJlZ2lvbidzIENvbnRleHQgYXQgdGhpcyBvZmZzZXQKLQkJCUlUZXh0UmVnaW9uIGludGVyZXN0ID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChpbnRlcmVzdCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKG9mZnNldCA+IGRvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQoaW50ZXJlc3QpKQotCQkJCXJldHVybiBudWxsOwotCQkJU3RyaW5nIHJlZ2lvbkNvbnRleHQgPSBpbnRlcmVzdC5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uQ29udGV4dCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJLy8gZmluZCB0aGUgbmFtZWQgc3R5bGUgKGludGVybmFsL3NlbGVjdGFibGUgbmFtZSkgZm9yIHRoYXQKLQkJCS8vIGNvbnRleHQKLQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZkNvbnRleHRUb1N0eWxlTWFwLmdldChyZWdpb25Db250ZXh0KTsKLQkJCWlmIChuYW1lZFN0eWxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmFtZWRTdHlsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZ2V0T3ZlcmxheVN0b3JlKCkgewotCQlyZXR1cm4gZk92ZXJsYXlTdG9yZTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpIHsKLQkJaWYgKGZTdHlsZVByZWZlcmVuY2VLZXlzID09IG51bGwpIHsKLQkJCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9FUVVBTFMpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVCk7Ci0JCQlmU3R5bGVQcmVmZXJlbmNlS2V5cyA9IHN0eWxlczsKLQkJfQotCQlyZXR1cm4gZlN0eWxlUHJlZmVyZW5jZUtleXM7Ci0JfQotCi0JcHJpdmF0ZSBLZXlMaXN0ZW5lciBnZXRUZXh0S2V5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb3VzZUxpc3RlbmVyIGdldFRleHRNb3VzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZ2V0VGV4dFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmF2ZXJzZUxpc3RlbmVyIGdldFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXIja2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWlmICgoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUKSB8fCAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykpCi0JCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCXNldERlc2NyaXB0aW9uKFNTRVVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdfRGVzY3JpcHRpb24pOwotCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCWluaXRTdHlsZVRvRGVzY3JpcHRpb25NYXAoKTsKLQkJaW5pdFJlZ2lvbkNvbnRleHRUb1N0eWxlTWFwKCk7Ci0KLQkJZk92ZXJsYXlTdG9yZSA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlKGdldFByZWZlcmVuY2VTdG9yZSgpLCBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkpOwotCQlmT3ZlcmxheVN0b3JlLmxvYWQoKTsKLQkJZk92ZXJsYXlTdG9yZS5zdGFydCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UmVnaW9uQ29udGV4dFRvU3R5bGVNYXAoKSB7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUywgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfRVFVQUxTKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UsIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9QRV9SRUZFUkVOQ0UsIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOLCBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOLCBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiwgSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiwgSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UsIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UsIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCBJU3R5bGVDb25zdGFudHNKU1AuSlNQX0NPTlRFTlQpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfVEVYVCwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFN0eWxlVG9EZXNjcmlwdGlvbk1hcCgpIHsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLkNvbW1lbnRfRGVsaW1pdGVyc19VSV8pOyAvLyA9Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQsIFhNTFVJTWVzc2FnZXMuQ29tbWVudF9Db250ZW50X1VJXyk7IC8vID0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIFhNTFVJTWVzc2FnZXMuVGFnX0RlbGltaXRlcnNfVUlfKTsgLy8gPQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUsIFhNTFVJTWVzc2FnZXMuVGFnX05hbWVzX1VJXyk7IC8vID0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSwgWE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfTmFtZXNfVUlfKTsgLy8gPQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9FUVVBTFMsIFhNTFVJTWVzc2FnZXMuQXR0cmlidXRlX0VxdWFsc19VSV8pOwotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSwgWE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfVmFsdWVzX1VJXyk7IC8vID0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UsIFhNTFVJTWVzc2FnZXMuRW50aXR5X1JlZmVyZW5jZV9VSV8pOyAvLyROT04tTkxTLTEkID0gIkVudGl0eSBSZWZlcmVuY2VzIgotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUiwgSlNQVUlNZXNzYWdlcy5KU1BfRGVsaW1pdGVyc19VSV8pOyAvLyROT04tTkxTLTEkID0gIkpTUCBEZWxpbWl0ZXJzIgotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNKU1AuSlNQX0NPTlRFTlQsIEpTUFVJTWVzc2FnZXMuSlNQQ29sb3JQYWdlX2pzcF9jb250ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlnZXRPdmVybGF5U3RvcmUoKS5sb2FkRGVmYXVsdHMoKTsKLQkJYXBwbHlTdHlsZXMoKTsKLQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCWFjdGl2YXRlKG51bGwpOwotCQlmVGV4dC5yZWRyYXcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWdldE92ZXJsYXlTdG9yZSgpLnByb3BhZ2F0ZSgpOwotCi0JCUpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0Q29sb3JBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyBuYW1lZFN0eWxlID0gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KG9mZnNldCk7Ci0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwpIHsKLQkJCWZTdHlsZXNWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5hbWVkU3R5bGUpKTsKLQkJCWZTdHlsZXNWaWV3ZXIucmV2ZWFsKG5hbWVkU3R5bGUpOwotCQl9Ci0JCWVsc2UgewotCQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCX0KLQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lmaWNhbGx5IHNldCB0aGUgcmVwb3J0aW5nIG5hbWUgb2YgYSBjb250cm9sIGZvciBhY2Nlc3NpYmlsaXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFjY2Vzc2libGUoQ29udHJvbCBjb250cm9sLCBTdHJpbmcgbmFtZSkgewotCQlpZiAoY29udHJvbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmaW5hbCBTdHJpbmcgbiA9IG5hbWU7Ci0JCWNvbnRyb2wuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKQotCQkJCQllLnJlc3VsdCA9IG47Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTUzN2VlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBKU1AgdGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSB7Ci0JY2xhc3MgSlNQRWRpdFRlbXBsYXRlRGlhbG9nIGV4dGVuZHMgRWRpdFRlbXBsYXRlRGlhbG9nIHsKLQkJcHVibGljIEpTUEVkaXRUZW1wbGF0ZURpYWxvZyhTaGVsbCBwYXJlbnQsIFRlbXBsYXRlIHRlbXBsYXRlLCBib29sZWFuIGVkaXQsIGJvb2xlYW4gaXNOYW1lTW9kaWZpYWJsZSwgQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSkgewotCQkJc3VwZXIocGFyZW50LCB0ZW1wbGF0ZSwgZWRpdCwgaXNOYW1lTW9kaWZpYWJsZSwgcmVnaXN0cnkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewkJCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQotCQkJcHVibGljIElDb250ZW50QXNzaXN0YW50IGdldENvbnRlbnRBc3Npc3RhbnQoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlDb250ZW50QXNzaXN0YW50IGFzc2lzdGFudCA9IG5ldyBDb250ZW50QXNzaXN0YW50KCk7Ci0JCQkJYXNzaXN0YW50LmVuYWJsZUF1dG9BY3RpdmF0aW9uKHRydWUpOwotCQkJCWFzc2lzdGFudC5lbmFibGVBdXRvSW5zZXJ0KHRydWUpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGdldFRlbXBsYXRlUHJvY2Vzc29yKCksIElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRSk7Ci0JCQkJcmV0dXJuIGFzc2lzdGFudDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGRvQ3JlYXRlVmlld2VyKHBhcmVudCwgc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci19Ci0JfQotCi0JcHVibGljIEpTUFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCUpTUFVJUGx1Z2luIGpzcEVkaXRvclBsdWdpbiA9IEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKTsKLQotCQlzZXRQcmVmZXJlbmNlU3RvcmUoanNwRWRpdG9yUGx1Z2luLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJc2V0VGVtcGxhdGVTdG9yZShqc3BFZGl0b3JQbHVnaW4uZ2V0VGVtcGxhdGVTdG9yZSgpKTsKLQkJc2V0Q29udGV4dFR5cGVSZWdpc3RyeShqc3BFZGl0b3JQbHVnaW4uZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnBlcmZvcm1PaygpOwotCQlKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBvazsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjaXNTaG93Rm9ybWF0dGVyU2V0dGluZygpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaG93Rm9ybWF0dGVyU2V0dGluZygpIHsKLQkJLy8gdGVtcGxhdGUgZm9ybWF0dGluZyBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGFuY2VzdG9yKSB7Ci0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKGFuY2VzdG9yKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjLCBJSGVscENvbnRleHRJZHMuSlNQX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjY3JlYXRlVmlld2VyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGRvQ3JlYXRlVmlld2VyKHBhcmVudCwgc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JfQotCi0JU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gdmlld2VyQ29uZmlndXJhdGlvbikgewotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlSUQgPSBDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQOwotCQl2aWV3ZXIgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXIocGFyZW50LCBudWxsLCBudWxsLCBmYWxzZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCXZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250KCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IikpOyAvLyROT04tTkxTLTEkCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc2NyYXRjaE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoY29udGVudFR5cGVJRCk7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHNjcmF0Y2hNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJdmlld2VyLmNvbmZpZ3VyZSh2aWV3ZXJDb25maWd1cmF0aW9uKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBlZGl0IGRpYWxvZy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZQotCSAqIGEgY3VzdG9tIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gdGVtcGxhdGUKLQkgKiAgICAgICAgICAgIHRoZSB0ZW1wbGF0ZSBiZWluZyBlZGl0ZWQKLQkgKiBAcGFyYW0gZWRpdAotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgZGlhbG9nIHNob3VsZCBiZSBlZGl0YWJsZQotCSAqIEBwYXJhbSBpc05hbWVNb2RpZmlhYmxlCi0JICogICAgICAgICAgICB3aGV0aGVyIHRoZSB0ZW1wbGF0ZSBuYW1lIG1heSBiZSBtb2RpZmllZAotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgb3IgbW9kaWZpZWQgdGVtcGxhdGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqICAgICAgICAgZWRpdGlvbiBmYWlsZWQKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIFRlbXBsYXRlIGVkaXRUZW1wbGF0ZShUZW1wbGF0ZSB0ZW1wbGF0ZSwgYm9vbGVhbiBlZGl0LCBib29sZWFuIGlzTmFtZU1vZGlmaWFibGUpIHsKLQkJRWRpdFRlbXBsYXRlRGlhbG9nIGRpYWxvZyA9IG5ldyBKU1BFZGl0VGVtcGxhdGVEaWFsb2coZ2V0U2hlbGwoKSwgdGVtcGxhdGUsIGVkaXQsIGlzTmFtZU1vZGlmaWFibGUsIGdldENvbnRleHRUeXBlUmVnaXN0cnkoKSk7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJcmV0dXJuIGRpYWxvZy5nZXRUZW1wbGF0ZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BUeXBpbmdQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFR5cGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDU5NDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFR5cGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBKU1BUeXBpbmdQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBCdXR0b24gZkNsb3NlQnJhY2VzOwotCXByaXZhdGUgQnV0dG9uIGZDbG9zZVNjcmlwdGxldHM7Ci0JcHJpdmF0ZSBCdXR0b24gZkNsb3NlQ29tbWVudHM7Ci0JcHJpdmF0ZSBCdXR0b24gZkNsb3NlU3RyaW5nczsKLQlwcml2YXRlIEJ1dHRvbiBmQ2xvc2VCcmFja2V0czsKLQkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQkJCi0JCWNyZWF0ZUF1dG9Db21wbGV0ZShjb21wb3NpdGUpOwotCQljcmVhdGVKYXZhR3JvdXAoY29tcG9zaXRlKTsKLQotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCWxvYWRQcmVmZXJlbmNlcygpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUF1dG9Db21wbGV0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQkJCi0JCWdyb3VwLnNldFRleHQoSlNQVUlNZXNzYWdlcy5KU1BUeXBpbmdfQXV0b19Db21wbGV0ZSk7Ci0JCQotCQlmQ2xvc2VCcmFjZXMgPSBjcmVhdGVDaGVja0JveChncm91cCwgSlNQVUlNZXNzYWdlcy5KU1BUeXBpbmdfQ29tcGxldGVfQnJhY2VzKTsKLQkJKChHcmlkRGF0YSkgZkNsb3NlQnJhY2VzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkKLQkJZkNsb3NlQ29tbWVudHMgPSBjcmVhdGVDaGVja0JveChncm91cCwgSlNQVUlNZXNzYWdlcy5KU1BUeXBpbmdfQ29tcGxldGVfQ29tbWVudHMpOwotCQkoKEdyaWREYXRhKSBmQ2xvc2VDb21tZW50cy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJCi0JCWZDbG9zZVNjcmlwdGxldHMgPSBjcmVhdGVDaGVja0JveChncm91cCwgSlNQVUlNZXNzYWdlcy5KU1BUeXBpbmdfQ29tcGxldGVfU2NyaXB0bGV0cyk7Ci0JCSgoR3JpZERhdGEpIGZDbG9zZVNjcmlwdGxldHMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUphdmFHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQotCQlncm91cC5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuSlNQVHlwaW5nX0phdmFfQ29kZSk7Ci0KLQkJZkNsb3NlU3RyaW5ncyA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBKU1BVSU1lc3NhZ2VzLkpTUFR5cGluZ19DbG9zZV9TdHJpbmdzKTsKLQkJKChHcmlkRGF0YSkgZkNsb3NlU3RyaW5ncy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQlmQ2xvc2VCcmFja2V0cyA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBKU1BVSU1lc3NhZ2VzLkpTUFR5cGluZ19DbG9zZV9CcmFja2V0cyk7Ci0JCSgoR3JpZERhdGEpIGZDbG9zZUJyYWNrZXRzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJCi0JCUpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWluaXRDaGVja2JveChmQ2xvc2VCcmFjZXMsIEpTUFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9FTF9CUkFDRVMpOwotCQlpbml0Q2hlY2tib3goZkNsb3NlU2NyaXB0bGV0cywgSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX1NDUklQVExFVFMpOwotCQlpbml0Q2hlY2tib3goZkNsb3NlQ29tbWVudHMsIEpTUFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9DT01NRU5UUyk7Ci0JCWluaXRDaGVja2JveChmQ2xvc2VTdHJpbmdzLCBKU1BVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ0xPU0VfU1RSSU5HUyk7Ci0JCWluaXRDaGVja2JveChmQ2xvc2VCcmFja2V0cywgSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NMT1NFX0JSQUNLRVRTKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlkZWZhdWx0Q2hlY2tib3goZkNsb3NlQnJhY2VzLCBKU1BVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRUxfQlJBQ0VTKTsKLQkJZGVmYXVsdENoZWNrYm94KGZDbG9zZVNjcmlwdGxldHMsIEpTUFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9TQ1JJUFRMRVRTKTsKLQkJZGVmYXVsdENoZWNrYm94KGZDbG9zZUNvbW1lbnRzLCBKU1BVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfQ09NTUVOVFMpOwotCQlkZWZhdWx0Q2hlY2tib3goZkNsb3NlU3RyaW5ncywgSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NMT1NFX1NUUklOR1MpOwotCQlkZWZhdWx0Q2hlY2tib3goZkNsb3NlQnJhY2tldHMsIEpTUFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DTE9TRV9CUkFDS0VUUyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShKU1BVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRUxfQlJBQ0VTLCAoZkNsb3NlQnJhY2VzICE9IG51bGwpID8gZkNsb3NlQnJhY2VzLmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShKU1BVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfU0NSSVBUTEVUUywgKGZDbG9zZVNjcmlwdGxldHMgIT0gbnVsbCkgPyBmQ2xvc2VTY3JpcHRsZXRzLmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShKU1BVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfQ09NTUVOVFMsIChmQ2xvc2VDb21tZW50cyAhPSBudWxsKSA/IGZDbG9zZUNvbW1lbnRzLmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShKU1BVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ0xPU0VfU1RSSU5HUywgKGZDbG9zZVN0cmluZ3MgIT0gbnVsbCkgPyBmQ2xvc2VTdHJpbmdzLmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShKU1BVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ0xPU0VfQlJBQ0tFVFMsIChmQ2xvc2VCcmFja2V0cyAhPSBudWxsKSA/IGZDbG9zZUJyYWNrZXRzLmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3ZGFlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWREYXRhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuUGl4ZWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkpTUENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZUxpbmtBcmVhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VzLklXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlNjcm9sbGVkUGFnZUNvbnRlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBKU1BWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2UgewotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVIgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRUSU5HU19TRUNUSU9OX05BTUUgPSAiSlNQVmFsaWRhdGlvblNldmVyaXRpZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIFNFVkVSSVRJRVMgPSB7VmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcsIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRX07Ci0KLQkvLyBTaG91bGQgZXF1YWwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnByZWZlcmVuY2VzLlByb2JsZW1TZXZlcml0aWVzUHJlZmVyZW5jZVBhZ2UuUFJFRl9JRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfU0VWRVJJVFlfUFJFRkVSRU5DRV9QQUdFID0gIm9yZy5lY2xpcHNlLmpkdC51aS5wcmVmZXJlbmNlcy5Qcm9ibGVtU2V2ZXJpdGllc1ByZWZlcmVuY2VQYWdlIjsKLQkvLyBTaG91bGQgZXF1YWwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnByZWZlcmVuY2VzLlByb2JsZW1TZXZlcml0aWVzUHJlZmVyZW5jZVBhZ2UuUFJPUF9JRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfU0VWRVJJVFlfUFJPUEVSVFlfUEFHRSA9ICJvcmcuZWNsaXBzZS5qZHQudWkucHJvcGVydHlQYWdlcy5Qcm9ibGVtU2V2ZXJpdGllc1ByZWZlcmVuY2VQYWdlIjsKLQkvLyBTaG91bGQgZXF1YWwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnByZWZlcmVuY2VzLlByb3BlcnR5QW5kUHJlZmVyZW5jZVBhZ2UuREFUQV9OT19MSU5LCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9OT19MSU5LPSAiUHJvcGVydHlBbmRQcmVmZXJlbmNlUGFnZS5ub2xpbmsiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFBpeGVsQ29udmVydGVyIGZQaXhlbENvbnZlcnRlcjsKLQlwcml2YXRlIEJ1dHRvbiBmVmFsaWRhdGVGcmFnbWVudHM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZk9yaWdpbmFsVmFsaWRhdGVGcmFnbWVudHM7Ci0KLQlwdWJsaWMgSlNQVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlCdXR0b24gYyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQljLnNldFRleHQodGV4dCk7Ci0JCWMuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuY3JlYXRlKCkpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb21tb25Db250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbXBvc2l0ZSBwYWdlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBHcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlwYWdlLnNldExheW91dChsYXlvdXQpOwotCi0JCWZQaXhlbENvbnZlcnRlciA9IG5ldyBQaXhlbENvbnZlcnRlcihwYXJlbnQpOwotCQkKLQkJR3JvdXAgZmlsZXNHcm91cCA9IG5ldyBHcm91cChwYWdlLCBTV1QuTk9ORSk7Ci0JCWZpbGVzR3JvdXAuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuZ3JhYih0cnVlLCBmYWxzZSkuY3JlYXRlKCkpOwotCQlmaWxlc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlmaWxlc0dyb3VwLnNldFRleHQoSlNQVUlNZXNzYWdlcy5KU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzApOwotCQljcmVhdGVGaWxlc1NlY3Rpb24oZmlsZXNHcm91cCk7Ci0KLQkJLy8gc3BhY2VyCi0vLwkJbmV3IExhYmVsKHBhZ2UsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5jcmVhdGUoKSk7Ci0KLQkJR3JvdXAgc2V2ZXJpdGllc0dyb3VwID0gbmV3IEdyb3VwKHBhZ2UsIFNXVC5OT05FKTsKLQkJc2V2ZXJpdGllc0dyb3VwLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmdyYWIodHJ1ZSwgdHJ1ZSkuY3JlYXRlKCkpOwotCQlzZXZlcml0aWVzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCXNldmVyaXRpZXNHcm91cC5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuSlNQVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzApOwotCQlmaW5hbCBDb21wb3NpdGUgY29udGVudCA9IGNyZWF0ZVZhbGlkYXRpb25TZWN0aW9uKHNldmVyaXRpZXNHcm91cCk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBmUGl4ZWxDb252ZXJ0ZXIuY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygyMCk7Ci0JCWNvbnRlbnQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZyYWdtZW50R3JvdXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRmlsZXNTZWN0aW9uKEdyb3VwIGZyYWdtZW50R3JvdXApIHsKLQkJZlZhbGlkYXRlRnJhZ21lbnRzID0gY3JlYXRlQ2hlY2tCb3goZnJhZ21lbnRHcm91cCwgSlNQVUlNZXNzYWdlcy5KU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGZWYWxpZGF0ZUZyYWdtZW50cywgSUhlbHBDb250ZXh0SWRzLkpTUF9QUkVGV0VCWF9GSUxFU19IRUxQSUQpOwotCQlJU2NvcGVDb250ZXh0W10gY29udGV4dHMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCk7Ci0JCWZPcmlnaW5hbFZhbGlkYXRlRnJhZ21lbnRzID0gY29udGV4dHNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5nZXRCb29sZWFuKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVEVfRlJBR01FTlRTLCBjb250ZXh0c1sxXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLmdldEJvb2xlYW4oSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFURV9GUkFHTUVOVFMsIHRydWUpKTsKLQkJZlZhbGlkYXRlRnJhZ21lbnRzLnNldFNlbGVjdGlvbihmT3JpZ2luYWxWYWxpZGF0ZUZyYWdtZW50cyk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlVmFsaWRhdGlvblNlY3Rpb24oQ29tcG9zaXRlIHBhZ2UpIHsKLQkJaW50IG5Db2x1bW5zID0gMzsKLQotCQlmaW5hbCBTY3JvbGxlZFBhZ2VDb250ZW50IHNwQ29udGVudCA9IG5ldyBTY3JvbGxlZFBhZ2VDb250ZW50KHBhZ2UpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBzcENvbnRlbnQuZ2V0Qm9keSgpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQobkNvbHVtbnMsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlMYWJlbCBkZXNjcmlwdGlvbiA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZGVzY3JpcHRpb24uc2V0VGV4dChKU1BVSU1lc3NhZ2VzLlZhbGlkYXRpb25fZGVzY3JpcHRpb24pOwotCQlkZXNjcmlwdGlvbi5zZXRGb250KHBhZ2UuZ2V0Rm9udCgpKTsKLQotCQlTdHJpbmdbXSBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMgPSBuZXcgU3RyaW5nW117SlNQVUlNZXNzYWdlcy5WYWxpZGF0aW9uX0Vycm9yLCBKU1BVSU1lc3NhZ2VzLlZhbGlkYXRpb25fV2FybmluZywgSlNQVUlNZXNzYWdlcy5WYWxpZGF0aW9uX0lnbm9yZX07Ci0JCUNvbXBvc2l0ZSBzZWN0aW9uOwotCi0JCS8vIGJlZ2luIGRpcmVjdGl2ZXMgc2VjdGlvbgotCQlzZWN0aW9uID0gY3JlYXRlU3R5bGVTZWN0aW9uV2l0aENvbnRlbnRDb21wb3NpdGUoY29tcG9zaXRlLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fSEVBREVSX0RJUkVDVElWRSwgbkNvbHVtbnMpOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9VTlJFU09MVkFCTEVfVVJJX09SX1RBR0RJUiwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfVU5SRVNPTFZBQkxFX1VSSV9PUl9UQUdESVIsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX0RVUExJQ0FURV9QUkVGSVhFU19ESUZGRVJFTlRfVVJJUywgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfRFVQTElDQVRFX1BSRUZJWEVTX0RJRkZFUkVOVF9VUklTLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9EVVBMSUNBVEVfUFJFRklYRVNfU0FNRV9VUklTLCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9EVVBMSUNBVEVfUFJFRklYRVNfU0FNRV9VUklTLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9NSVNTSU5HX1BSRUZJWCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfTUlTU0lOR19QUkVGSVgsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX01JU1NJTkdfVVJJX09SX1RBR0RJUiwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfTUlTU0lOR19VUklfT1JfVEFHRElSLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fRElSRUNUSVZFX0lOQ0xVREVfRklMRV9OT1RfRk9VTkQsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfSU5DTFVERV9GSUxFX05PVF9GT1VORCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0RJUkVDVElWRV9JTkNMVURFX05PX0ZJTEVfU1BFQ0lGSUVELCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRElSRUNUSVZFX0lOQ0xVREVfTk9fRklMRV9TUEVDSUZJRUQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0vLwkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0RJUkVDVElWRV9QQUdFX1NVUEVSQ0xBU1NfTk9UX0ZPVU5ELCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRElSRUNUSVZFX1BBR0VfU1VQRVJDTEFTU19OT1RfRk9VTkQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0JCS8vIGVuZCBkaXJlY3RpdmVzIHNlY3Rpb24KLQotCQkvLyBiZWdpbiBjdXN0b20gYWN0aW9ucyBzZWN0aW9uCi0JCXNlY3Rpb24gPSBjcmVhdGVTdHlsZVNlY3Rpb25XaXRoQ29udGVudENvbXBvc2l0ZShjb21wb3NpdGUsIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9IRUFERVJfQ1VTVE9NX0FDVElPTlMsIG5Db2x1bW5zKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfTUlTU0lOR19SRVFVSVJFRF9BVFRSSUJVVEUsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX01JU1NJTkdfUkVRVUlSRURfQVRUUklCVVRFLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9VTktOT1dOX0FUVFJJQlVURSwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfVU5LTk9XTl9BVFRSSUJVVEUsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX1VORVhQRUNURURfUlRFWFBSVkFMVUUsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX1VORVhQRUNURURfUlRFWFBSVkFMVUUsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX05PTl9FTVBUWV9JTkxJTkVfVEFHLCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9OT05fRU1QVFlfSU5MSU5FX1RBRywgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9WQUxJREFUSU9OX01FU1NBR0UsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfVkFMSURBVElPTl9NRVNTQUdFLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX05PVF9GT1VORCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9DTEFTU19OT1RfRk9VTkQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfTk9UX0lOU1RBTlRJQVRFRCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9DTEFTU19OT1RfSU5TVEFOVElBVEVELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX1JVTlRJTUVfRVhDRVBUSU9OLCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX1JVTlRJTUVfRVhDRVBUSU9OLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEFHX0hBTkRMRVJfQ0xBU1NfTk9UX0ZPVU5ELCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEFHX0hBTkRMRVJfQ0xBU1NfTk9UX0ZPVU5ELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQkvLyBlbmQgY3VzdG9tIGFjdGlvbnMgc2VjdGlvbgotCi0JCS8vIGJlZ2luIHN0YW5kYXJkIGFjdGlvbnMgc2VjdGlvbgotCQlzZWN0aW9uID0gY3JlYXRlU3R5bGVTZWN0aW9uV2l0aENvbnRlbnRDb21wb3NpdGUoY29tcG9zaXRlLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fSEVBREVSX1NUQU5EQVJEX0FDVElPTlMsIG5Db2x1bW5zKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTRUJFQU5fSU5WQUxJRF9JRCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTRUJFQU5fSU5WQUxJRF9JRCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTQkVBTl9NSVNTSU5HX1RZUEVfSU5GTywgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTQkVBTl9NSVNTSU5HX1RZUEVfSU5GTywgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTRUJFQU5fQU1CSUdVT1VTX1RZUEVfSU5GTywgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTRUJFQU5fQU1CSUdVT1VTX1RZUEVfSU5GTywgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJLy8gZW5kIHN0YW5kYXJkIGFjdGlvbnMgc2VjdGlvbgotCi0JCS8vIGJlZ2luIEphdmEgc2V2ZXJpdHkgb3ZlcnJpZGUgc2VjdGlvbgotCQlzZWN0aW9uID0gY3JlYXRlU3R5bGVTZWN0aW9uV2l0aENvbnRlbnRDb21wb3NpdGUoY29tcG9zaXRlLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fSEVBREVSX0pBVkEsIG5Db2x1bW5zKTsKLQkJaWYgKGdldFByb2plY3QoKSA9PSBudWxsKSB7Ci0JCQluZXcgUHJlZmVyZW5jZUxpbmtBcmVhKHNlY3Rpb24sIFNXVC5XUkFQIHwgU1dULk1VTFRJIHwgU1dULkxFRlRfVE9fUklHSFQsIEpBVkFfU0VWRVJJVFlfUFJFRkVSRU5DRV9QQUdFLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fSkFWQV9OT1RJQ0UsIChJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcikgZ2V0Q29udGFpbmVyKCksIG51bGwpLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5zcGFuKDIsIDEpLmluZGVudCgwLCAwKS5oaW50KDE1MCwgU1dULkRFRkFVTFQpLmNyZWF0ZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCWZpbmFsIE1hcCBkYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJCWRhdGEucHV0KERBVEFfTk9fTElOSywgQm9vbGVhbi5UUlVFKTsKLQkJCUxpbmsgbGluaz0gbmV3IExpbmsoc2VjdGlvbiwgU1dULldSQVAgfCBTV1QuTVVMVEkgfCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0JCQlsaW5rLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLnNwYW4oMiwgMSkuaW5kZW50KDAsIDApLmhpbnQoMTUwLCBTV1QuREVGQVVMVCkuY3JlYXRlKCkpOwotCQkJbGluay5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9KQVZBX05PVElDRSk7Ci0JCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIgY29udGFpbmVyPSAoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpZ2V0Q29udGFpbmVyKCk7Ci0JCQkJCWNvbnRhaW5lci5vcGVuUGFnZShKQVZBX1NFVkVSSVRZX1BST1BFUlRZX1BBR0UsIGRhdGEpOwotCQkJCX0KLQkJCX0pOwotCQkJLy9uZXcgUHJlZmVyZW5jZUxpbmtBcmVhKHNlY3Rpb24sIFNXVC5XUkFQIHwgU1dULk1VTFRJIHwgU1dULkxFRlRfVE9fUklHSFQsIEpBVkFfU0VWRVJJVFlfUFJPUEVSVFlfUEFHRSwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0pBVkFfTk9USUNFLCAoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLCBkYXRhKS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuc3BhbigyLCAxKS5pbmRlbnQoMCwgMCkuaGludCgxNTAsIFNXVC5ERUZBVUxUKS5jcmVhdGUoKSk7Ci0JCQkvLyBvcGVuIGluIHNhbWUgc2hlbGw/Ci0JCQkvLyBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJvcGVydHlEaWFsb2dPbihnZXRTaGVsbCgpLCBnZXRQcm9qZWN0KCksIEpBVkFfU0VWRVJJVFlfUFJPUEVSVFlfUEFHRSwgbmV3IFN0cmluZ1tdIHsgSkFWQV9TRVZFUklUWV9QUk9QRVJUWV9QQUdFIH0sIGRhdGEpLm9wZW4oKTsKLQkJfQotCQlpbnQgc2VjdGlvbkluZGVudCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0pBVkFfTE9DQUxfVkFSSUFCTEVfTkVWRVJfVVNFRCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0pBVkFfTE9DQUxfVkFSSUFCTEVfTkVWRVJfVVNFRCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCBzZWN0aW9uSW5kZW50KTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0pBVkFfQVJHVU1FTlRfSVNfTkVWRVJfVVNFRCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0pBVkFfQVJHVU1FTlRfSVNfTkVWRVJfVVNFRCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCBzZWN0aW9uSW5kZW50KTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0pBVkFfTlVMTF9MT0NBTF9WQVJJQUJMRV9SRUZFUkVOQ0UsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX05VTExfTE9DQUxfVkFSSUFCTEVfUkVGRVJFTkNFLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIHNlY3Rpb25JbmRlbnQpOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fSkFWQV9QT1RFTlRJQUxfTlVMTF9MT0NBTF9WQVJJQUJMRV9SRUZFUkVOQ0UsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX1BPVEVOVElBTF9OVUxMX0xPQ0FMX1ZBUklBQkxFX1JFRkVSRU5DRSwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCBzZWN0aW9uSW5kZW50KTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0pBVkFfVU5VU0VEX0lNUE9SVCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0pBVkFfVU5VU0VEX0lNUE9SVCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCBzZWN0aW9uSW5kZW50KTsKLQkJLy8gZW5kIEphdmEgc2V2ZXJpdHkgb3ZlcnJpZGUgc2VjdGlvbgotCi0JCS8vIGJlZ2luIEVMIHNlY3Rpb24KLQkJc2VjdGlvbiA9IGNyZWF0ZVN0eWxlU2VjdGlvbldpdGhDb250ZW50Q29tcG9zaXRlKGNvbXBvc2l0ZSwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0hFQURFUl9FTCwgbkNvbHVtbnMpOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fRUxfU1lOVEFYLCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRUxfU1lOVEFYLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fRUxfTEVYRVIsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9FTF9MRVhFUiwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0VMX0ZVTkNUSU9OX1VOREVGSU5FRCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0VMX0ZVTkNUSU9OX1VOREVGSU5FRCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJLy8gZW5kIEVMIHNlY3Rpb24KLQotCQlyZXN0b3JlU2VjdGlvbkV4cGFuc2lvblN0YXRlcyhnZXREaWFsb2dTZXR0aW5ncygpLmdldFNlY3Rpb24oU0VUVElOR1NfU0VDVElPTl9OQU1FKSk7Ci0KLQkJcmV0dXJuIHNwQ29udGVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdG9yZVNlY3Rpb25FeHBhbnNpb25TdGF0ZXMoZ2V0RGlhbG9nU2V0dGluZ3MoKS5hZGROZXdTZWN0aW9uKFNFVFRJTkdTX1NFQ1RJT05fTkFNRSkpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSB7Ci0JCXJldHVybiBQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJRCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnByZWZlcmVuY2VzLnZhbGlkYXRpb24iOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RTZXR0aW5nc0tleSgpIHsKLQkJcmV0dXJuIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9VU0VfUFJPSkVDVF9TRVRUSU5HUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5UGFnZUlEKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJvcGVydHlQYWdlLnByb2plY3QudmFsaWRhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybURlZmF1bHRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXJlc2V0U2V2ZXJpdGllcygpOwotCi0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgZGVmYXVsdENvbnRleHQgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKTsKLQkJYm9vbGVhbiB2YWxpZGF0ZUZyYWdtZW50cyA9IGRlZmF1bHRDb250ZXh0LmdldEJvb2xlYW4oSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFURV9GUkFHTUVOVFMsIHRydWUpOwotCQlmVmFsaWRhdGVGcmFnbWVudHMuc2V0U2VsZWN0aW9uKHZhbGlkYXRlRnJhZ21lbnRzKTsKLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRSZXZhbGlkYXRlT25TZXR0aW5nc0NoYW5nZSgpIHsKLQkJcmV0dXJuIGZPcmlnaW5hbFZhbGlkYXRlRnJhZ21lbnRzICE9IGZWYWxpZGF0ZUZyYWdtZW50cy5nZXRTZWxlY3Rpb24oKSB8fCBzdXBlci5zaG91bGRSZXZhbGlkYXRlT25TZXR0aW5nc0NoYW5nZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2Ujc3RvcmVWYWx1ZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlzdXBlci5zdG9yZVZhbHVlcygpOwotCi0JCUlTY29wZUNvbnRleHRbXSBjb250ZXh0cyA9IGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKTsKLQkJYm9vbGVhbiB2YWxpZGF0ZUZyYWdtZW50cyA9IGZWYWxpZGF0ZUZyYWdtZW50cy5nZXRTZWxlY3Rpb24oKTsKLQkJY29udGV4dHNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5wdXRCb29sZWFuKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVEVfRlJBR01FTlRTLCB2YWxpZGF0ZUZyYWdtZW50cyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZDhiMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU1AgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQotCS8qCi0JICogQHNlZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2FkZEFkYXB0ZXJGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIHRoZXNlIGFyZSB0aGUgbWFpbiBmYWN0b3JpZXMsIG9uIG1vZGVsJ3MgZmFjdG9yeSByZWdpc3RyeQotCQlhZGRDb250ZW50QmFzZWRGYWN0b3JpZXMoc3RydWN0dXJlZE1vZGVsKTsKLQkJLy8gLS0tLS0tLQotCQkvLyBNdXN0IHVwZGF0ZS9hZGQgdG8gcHJvcGFnYXRpbmcgYWRhcHRlcnMgaGVyZSB0b28KLQkJYWRkUHJvcGFnYXRpbmdBZGFwdGVycyhzdHJ1Y3R1cmVkTW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gc3RydWN0dXJlZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZhY3RvcnlSZWdpc3RyeSwgIlByb2dyYW0gRXJyb3I6IGNsaWVudCBjYWxsZXIgbXVzdCBlbnN1cmUgbW9kZWwgaGFzIGZhY3RvcnkgcmVnaXN0cnkiKTsgLy8kTk9OLU5MUy0xJAotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlmYWN0b3J5ID0gZmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlmYWN0b3J5ID0gbmV3IEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTChJSkZhY2VOb2RlQWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JCQlmYWN0b3J5UmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCi0JCU1vZGVsSGFuZGxlckZvckpTUC5lbnN1cmVUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KHN0cnVjdHVyZWRNb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGFnYXRpbmdBZGFwdGVycyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCUlET01Nb2RlbCB4bWxNb2RlbCA9IChJRE9NTW9kZWwpIHN0cnVjdHVyZWRNb2RlbDsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQlQcm9wYWdhdGluZ0FkYXB0ZXIgcHJvcGFnYXRpbmdBZGFwdGVyID0gKFByb3BhZ2F0aW5nQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKHByb3BhZ2F0aW5nQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJLy8gd2hhdCB0byBkbz8KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2lzRm9yKENvbnRlbnRUeXBlRGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSURvY3VtZW50VHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbikgewotCQlyZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JKU1ApOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZUZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4MWJmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzSlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZTsKLQotcHVibGljIGludGVyZmFjZSBJU3R5bGVDb25zdGFudHNKU1AgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DT05URU5UID0gImpzcF9jb250ZW50IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjNTJhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRnJpdHMgSmFsdmluZ2ggLSBjb250cmlidXRpb25zIGZvciBidWcgMTUwNzk0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JKU1AgZXh0ZW5kcyBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyIGltcGxlbWVudHMgTGluZVN0eWxlUHJvdmlkZXJ7Ci0KLQlwcml2YXRlIFN0cmluZyBmTGFuZ3VhZ2UgPSBudWxsOwotCi0JLy8gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkEgPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBKQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVMgPSBuZXcgU3RyaW5nW10gewotCS8vICJqYXZhc2NyaXB0IiwgImphdmFzY3JpcHQxLjAiLCAiamF2YXNjcmlwdDEuMV8zIiwgImphdmFzY3JpcHQxLjIiLAotCS8vICJqYXZhc2NyaXB0MS4zIiwgImphdmFzY3JpcHQxLjQiLCAiamF2YXNjcmlwdDEuNSIsICJqYXZhc2NyaXB0MS42IiwKLQkvLyAianNjcmlwdCIsICJzYXNoc2NyaXB0IiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCS8vIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCS8vIC8vJE5PTi1OTFMtOSQgLy8kTk9OLU5MUy0xMCQKLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlckZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8qKgotCQkgKiBhIG1ldGhvZCB0byBjZW50cmFsaXplIGFsbCB0aGUgInN5dGxlIHJ1bGVzIiBmb3IgcmVnaW9ucwotCQkgKi8KLQkJVGV4dEF0dHJpYnV0ZSByZXN1bHQgPSBudWxsOwotCQkvLyBub3Qgc3VyZSB3aHkgdGhpcyBpcyBjb21pbmcgdGhyb3VnaCBudWxsLCBidXQganVzdCB0byBjYXRjaCBpdAotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAoKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UpKSB7Ci0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUUpIHsKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX0NMT1NFKSkgewotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9URVhUKSB7Ci0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUKTsKLQkJCQl9Ci0JCQkJLy8gPT09PT09PT09PT09IFRoZXNlIGFyZSBpbiBjb21tb24gd2l0aCBYTUwgLS0tIChmb3IgWE1MIGZvcm0KLQkJCQkvLyBvZiB0YWdzKQotCQkJCS8vICAgICAgICAgICAgICBOb3RlOiB0aGlzIGFzc3VtZSdzIHRoaXMgcHJvdmlkZXIgaXMgb25seSBjYWxsZWQgZm9yCi0JCQkJLy8gICAgICAgICAgICAgIHRydWUgSlNQIE5vZGVzLiBJZiBpdHMgY2FsbGVkIGZvciBvdGhlcnMsIHRoZW4gdGhpcyB3aWxsCi0JCQkJLy8gICAgICAgICAgICAgIGNhdXNlIHRoZWlyIHRhZyBuYW1lcyB0byBiZSBoaWdobGlnaHRlZCB0b28hCi0JCQkJLy8gICAgICAgICAgICAgIEZ1cnRoZXIgY2hlY2tzIGNvdWxkIGJlIGRvbmUgdG8gcHJldmVudCB0aGF0LCBidXQgZG9lc24ndAotCQkJCS8vICAgICAgICAgICAgICBzZWVtIHdvcnRoIGl0LCBzaW5jZSBpZiBhZHBhdGVycyBmYWN0b3JpZXMgYXJlIHdvcmtpbmcKLQkJCQkvLyByaWdodCwKLQkJCQkvLyAgICAgICAgICAgICAgdGhlbiB3b3VsZG4ndCBiZSBuZWVkZWQuCi0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpKSB7Ci0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpKSB7Ci0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUyk7Ci0JCQkJfQotCi0JCQkJLy8gRE1XOiBhZGRlZCA5LzEvMjAwMiBVbmRlZmluZWQgY29sb3IgbWF5IG5lZWQgYWRkanVzdG1lbnQgOikKLQkJCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEKQotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRSkKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCQkJLy8gRE1XIGFkZGVkIDgvMzAvMjAwMiAtLSBzaG91bGQgcHJvdmlkZSBKU1Agc3BlY2lmaWMKLQkJCQkvLyBwcmVmZXJlbmNlIGZvciAiY3VzdG9tIHRhZyBjb250ZW50IiAoYm90aCB0YWcgZGVwZW5kZW50LAotCQkJCS8vIEJMT0NLRURfVEVYVCwgYW5kIG5vdCwgWE1MIENPTlRFTlQpCi0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKQotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJCQllbHNlIGlmICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URXx8dHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpCi0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQl9Ci0JCX0KLQkJLy8gZGVmYXVsdCwgcmV0dXJuIG51bGwgdG8gc2lnbmFsICJub3QgaGFuZGxlZCIKLQkJLy8gaW4gd2hpY2ggY2FzZSwgb3RoZXIgZmFjdG9yaWVzIHNob3VsZCBiZSB0cmllZAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0Q29sb3JQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9FUVVBTFMpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCi0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkvLyBjaGVjayBpZiBwcmVmZXJlbmNlIGNoYW5nZWQgaXMgYSBzdHlsZSBwcmVmZXJlbmNlCi0JCQlpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUy5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUzsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVI7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5ULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUjsKLQkJCX0KLQkJfQotCi0JCWlmIChzdHlsZUtleSAhPSBudWxsKSB7Ci0JCQkvLyBvdmVyd3JpdGUgc3R5bGUgcHJlZmVyZW5jZSB3aXRoIG5ldyB2YWx1ZQotCQkJYWRkVGV4dEF0dHJpYnV0ZShzdHlsZUtleSk7Ci0JCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0JCXJldHVybiBmTGFuZ3VhZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFuZ3VhZ2UuCi0JICogCi0JICogQHBhcmFtIGxhbmd1YWdlCi0JICogICAgICAgICAgICBUaGUgbGFuZ3VhZ2UgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlKSB7Ci0JCXRoaXMuZkxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvRG91YmxlUXVvdGVkU3RyaW5nUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvRG91YmxlUXVvdGVkU3RyaW5nUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWJiOTYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0RvdWJsZVF1b3RlZFN0cmluZ1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgRnJpdHMgSmFsdmluZ2ggYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIEZyaXRzIEphbHZpbmdoIC0gaW5pdGlhbCB2ZXJzaW9uIChidWdmaXggZm9yIDE1MDc5NCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklDaGFyYWN0ZXJTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVByZWRpY2F0ZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5Ub2tlbjsKLQotLyoqCi0gKiBUaGlzIHJ1bGUgbWF0Y2hlcyB0aGUgZG91YmxlLXF1b3RlZCBzdHJpbmdzIHByZXNlbnQgaW4gSlNQIHRhZyBhdHRyaWJ1dGVzLiBBIGRvdWJsZS1xdW90ZWQKLSAqIHN0cmluZ3Mgc3RhcnRzIHdpdGggXCIgKHR3byBjaGFyYWN0ZXJzISkgYW5kIGVuZHMgd2l0aCBcIiAodHdvIGNoYXJhY3RlcnMhKSB0b28uIFRoZSBzZXF1ZW5jZQotICogXCIgaXMgZXNjYXBlZCBieSB0aGUgaG9ycm9yIFxcXCIgKDQgY2hhcnMhPykgYXMgcGVyIHRoZSBKU1Agc3BlYy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYWxAZXRjLnRvIj5Gcml0cyBKYWx2aW5naDwvYT4KLSAqIENyZWF0ZWQgb24gQXVnIDUsIDIwMDcKLSAqLwotcHVibGljIGNsYXNzIERvdWJsZVF1b3RlZFN0cmluZ1J1bGUgaW1wbGVtZW50cyBJUHJlZGljYXRlUnVsZSB7Ci0JcHJpdmF0ZSBJVG9rZW4JZlRva2VuOwotCXByaXZhdGUgaW50CQltX3FjOwotCi0JcHVibGljIERvdWJsZVF1b3RlZFN0cmluZ1J1bGUoSVRva2VuIHRvaykgewotCQlmVG9rZW4gPSB0b2s7Ci0JfQotCXB1YmxpYyBJVG9rZW4gZXZhbHVhdGUoSUNoYXJhY3RlclNjYW5uZXIgc2Nhbm5lciwgYm9vbGVhbiByZXN1bWUpIHsKLQkJaWYocmVzdW1lKSB7Ci0JCQlpZihmaW5kRW5kKHNjYW5uZXIsIG1fcWMpKQotCQkJCXJldHVybiBmVG9rZW47Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgYz0gc2Nhbm5lci5yZWFkKCk7Ci0JCQlpZihjID09ICdcXCcpIHsKLQkJCQljID0gc2Nhbm5lci5yZWFkKCk7Ci0JCQkJaWYoYyA9PSAnIicgfHwgYyA9PSAnXCcnKSB7Ci0JCQkJCWlmKGZpbmRFbmQoc2Nhbm5lciwgYykpCi0JCQkJCQlyZXR1cm4gZlRva2VuOwotCQkJCX0KLQkJCQlzY2FubmVyLnVucmVhZCgpOwotCQkJfQotCQkJc2Nhbm5lci51bnJlYWQoKTsKLQkJfQotCQlyZXR1cm4gVG9rZW4uVU5ERUZJTkVEOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBmaW5kRW5kKElDaGFyYWN0ZXJTY2FubmVyIHNjYW5uZXIsIGludCBxYykgewotCQltX3FjID0gcWM7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWludCBjOwotCQlpbnQgbnNsID0gMDsKLQkJd2hpbGUoKGM9IHNjYW5uZXIucmVhZCgpKSAhPSBJQ2hhcmFjdGVyU2Nhbm5lci5FT0YpIHsKLQkJCWNvdW50Kys7Ci0JCQlpZihjID09ICdcXCcpIHsKLQkJCQluc2wrKzsKLQkJCQlpZihuc2wgPj0gNCkKLQkJCQkJbnNsID0gMDsKLQkJCX0gZWxzZSBpZihjID09IHFjKSB7Ci0JCQkJaWYobnNsID09IDEpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCW5zbCA9IDA7Ci0JCQl9IGVsc2UKLQkJCQluc2w9IDA7Ci0JCX0KLQkJd2hpbGUoLS1jb3VudCA+PSAwKQotCQkJc2Nhbm5lci51bnJlYWQoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJVG9rZW4gZ2V0U3VjY2Vzc1Rva2VuKCkgewotCQlyZXR1cm4gZlRva2VuOwotCX0KLQotCXB1YmxpYyBJVG9rZW4gZXZhbHVhdGUoSUNoYXJhY3RlclNjYW5uZXIgc2Nhbm5lcikgewotCQlyZXR1cm4gZXZhbHVhdGUoc2Nhbm5lciwgZmFsc2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0lTdHlsZUNvbnN0YW50c0pTUEphdmEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0lTdHlsZUNvbnN0YW50c0pTUEphdmEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmNzcyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9JU3R5bGVDb25zdGFudHNKU1BKYXZhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmphdmE7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlQ29uc3RhbnRzSlNQSmF2YSB7Ci0JU3RyaW5nIEpBVkFfS0VZV09SRCA9ICJrZXl3b3JkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKQVZBX1NJTkdMRV9MSU5FX0NPTU1FTlQgPSAic2luZ2xlX2xpbmVfY29tbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSkFWQV9TVFJJTkcgPSAic3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKQVZBX0RFRkFVTFQgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFDb2RlU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YUNvZGVTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMDVhZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YUNvZGVTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEZyaXRzIEphbHZpbmdoIC0gY29udHJpYnV0aW9ucyBmb3IgYnVnIDE1MDc5NAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuamF2YTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5FbmRPZkxpbmVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5NdWx0aUxpbmVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuU2luZ2xlTGluZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5Ub2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLldvcmRSdWxlOwotCi0vKioKLSAqIEEgSmF2YSBjb2RlIHNjYW5uZXIuCi0gKi8KLWNsYXNzIEphdmFDb2RlU2Nhbm5lciBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuUnVsZUJhc2VkU2Nhbm5lciB7Ci0JcHJpdmF0ZSBJVG9rZW4gZktleXdvcmRUb2tlbjsKLQlwcml2YXRlIElUb2tlbiBmVHlwZVRva2VuOwotCXByaXZhdGUgSVRva2VuIGZTdHJpbmdUb2tlbjsKLQlwcml2YXRlIElUb2tlbiBmU2luZ2xlTGluZUNvbW1lbnRUb2tlbjsKLQlwcml2YXRlIElUb2tlbiBmRGVmYXVsdFRva2VuOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZmdLZXl3b3JkcyA9IHsiYWJzdHJhY3QiLCAvLyROT04tTkxTLTEkCi0JCQkJImJyZWFrIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJjYXNlIiwgImNhdGNoIiwgImNsYXNzIiwgImNvbnRpbnVlIiwgLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSJkZWZhdWx0IiwgImRvIiwgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkiZWxzZSIsICJleHRlbmRzIiwgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkiZmluYWwiLCAiZmluYWxseSIsICJmb3IiLCAvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkiaWYiLCAiaW1wbGVtZW50cyIsICJpbXBvcnQiLCAiaW5zdGFuY2VvZiIsICJpbnRlcmZhY2UiLCAvLyROT04tTkxTLTUkLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSJuYXRpdmUiLCAibmV3IiwgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkicGFja2FnZSIsICJwcml2YXRlIiwgInByb3RlY3RlZCIsICJwdWJsaWMiLCAvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJInJldHVybiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkic3RhdGljIiwgInN1cGVyIiwgInN3aXRjaCIsICJzeW5jaHJvbml6ZWQiLCAvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJInRoaXMiLCAidGhyb3ciLCAidGhyb3dzIiwgInRyYW5zaWVudCIsICJ0cnkiLCAvLyROT04tTkxTLTUkLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSJ2b2xhdGlsZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkid2hpbGUiLCAvLyROT04tTkxTLTEkCi0JCQkJInN0cmljdGZwIiwvLyROT04tTkxTLTEkCi0JfTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmZ1R5cGVzID0geyJ2b2lkIiwgImJvb2xlYW4iLCAiY2hhciIsICJieXRlIiwgInNob3J0IiwgImludCIsICJsb25nIiwgImZsb2F0IiwgImRvdWJsZSJ9Oy8vJE5PTi1OTFMtOSQvLyROT04tTkxTLTgkLy8kTk9OLU5MUy03JC8vJE5PTi1OTFMtNiQvLyROT04tTkxTLTUkLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZnQ29uc3RhbnRzID0geyJmYWxzZSIsICJudWxsIiwgInRydWUifTsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBKYXZhIGNvZGUgc2Nhbm5lcgotCSAqLwotCXB1YmxpYyBKYXZhQ29kZVNjYW5uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVSdWxlcygpIHsKLQkJTGlzdCBydWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBBZGQgcnVsZSBmb3IgbXVsdGlwbGUgbGluZSBjb21tZW50cy4KLQkJcnVsZXMuYWRkKG5ldyBNdWx0aUxpbmVSdWxlKCIvKiIsICIqLyIsIGZTaW5nbGVMaW5lQ29tbWVudFRva2VuKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJLy8gQWRkIHJ1bGUgZm9yIHNpbmdsZSBsaW5lIGNvbW1lbnRzLgotCQlydWxlcy5hZGQobmV3IEVuZE9mTGluZVJ1bGUoIi8vIiwgZlNpbmdsZUxpbmVDb21tZW50VG9rZW4pKTsvLyROT04tTkxTLTEkCi0KLQkJLy8gQWRkIHJ1bGUgZm9yIHN0cmluZ3MgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuCi0JCXJ1bGVzLmFkZChuZXcgU2luZ2xlTGluZVJ1bGUoIlwiIiwgIlwiIiwgZlN0cmluZ1Rva2VuLCAnXFwnKSk7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJcnVsZXMuYWRkKG5ldyBTaW5nbGVMaW5lUnVsZSgiJyIsICInIiwgZlN0cmluZ1Rva2VuLCAnXFwnKSk7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCQkvLyBBZGQgZ2VuZXJpYyB3aGl0ZXNwYWNlIHJ1bGUuCi0JCS8vcnVsZXMuYWRkKG5ldyBXaGl0ZXNwYWNlUnVsZShuZXcgSmF2YVdoaXRlc3BhY2VEZXRlY3RvcigpKSk7Ci0KLQkJLy8gQWRkIHdvcmQgcnVsZSBmb3Iga2V5d29yZHMsIHR5cGVzLCBhbmQgY29uc3RhbnRzLgotCQlXb3JkUnVsZSB3b3JkUnVsZSA9IG5ldyBXb3JkUnVsZShuZXcgSmF2YVdvcmREZXRlY3RvcigpLCBmRGVmYXVsdFRva2VuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZ0tleXdvcmRzLmxlbmd0aDsgaSsrKQotCQkJd29yZFJ1bGUuYWRkV29yZChmZ0tleXdvcmRzW2ldLCBmS2V5d29yZFRva2VuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZ1R5cGVzLmxlbmd0aDsgaSsrKQotCQkJd29yZFJ1bGUuYWRkV29yZChmZ1R5cGVzW2ldLCBmVHlwZVRva2VuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZ0NvbnN0YW50cy5sZW5ndGg7IGkrKykKLQkJCXdvcmRSdWxlLmFkZFdvcmQoZmdDb25zdGFudHNbaV0sIGZUeXBlVG9rZW4pOwotCQlydWxlcy5hZGQod29yZFJ1bGUpOwotCi0JCS8vIEFkZCB0aGUgZG91YmxlLXF1b3RlZCBzdHJpbmcgcnVsZQotCQlydWxlcy5hZGQobmV3IERvdWJsZVF1b3RlZFN0cmluZ1J1bGUoZlN0cmluZ1Rva2VuKSk7Ci0KLQkJSVJ1bGVbXSByZXN1bHQgPSBuZXcgSVJ1bGVbcnVsZXMuc2l6ZSgpXTsKLQkJcnVsZXMudG9BcnJheShyZXN1bHQpOwotCQlzZXRSdWxlcyhyZXN1bHQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUb2tlbkRhdGEoU3RyaW5nIHRva2VuS2V5LCBPYmplY3QgZGF0YSkgewotCQlpZiAodG9rZW5LZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX0tFWVdPUkQpIHsKLQkJCWZLZXl3b3JkVG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCQlmVHlwZVRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQl9IGVsc2UgaWYgKHRva2VuS2V5ID09IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9TVFJJTkcpIHsKLQkJCWZTdHJpbmdUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJfSBlbHNlIGlmICh0b2tlbktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVCkgewotCQkJZlNpbmdsZUxpbmVDb21tZW50VG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCX0gZWxzZSBpZiAodG9rZW5LZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX0RFRkFVTFQpIHsKLQkJCWZEZWZhdWx0VG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhQ29sb3JQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YUNvbG9yUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhMjM4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhQ29sb3JQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotCi0vKioKLSAqIENvbG9ycyB1c2VkIGluIHRoZSBKYXZhIGVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUNvbG9yUHJvdmlkZXIgewotCQotCS8vIHBlb3BsZSBzaG91bGQgbm90IGJlIHNldHRpbmcgdGhlc2UsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIGN1cnJlbnRseSBub3QgZmluYWwKLQlwdWJsaWMgc3RhdGljIFJHQiBNVUxUSV9MSU5FX0NPTU1FTlQgPSBuZXcgUkdCKDEyOCwgMCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgU0lOR0xFX0xJTkVfQ09NTUVOVCA9IG5ldyBSR0IoMTI4LCAxMjgsIDApOwotCXB1YmxpYyBzdGF0aWMgUkdCIEtFWVdPUkQgPSBuZXcgUkdCKDAsIDAsIDEyOCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgVFlQRSA9IG5ldyBSR0IoMCwgMCwgMTI4KTsKLQlwdWJsaWMgc3RhdGljIFJHQiBTVFJJTkcgPSBuZXcgUkdCKDAsIDEyOCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgREVGQVVMVCA9IG5ldyBSR0IoMCwgMCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgSkFWQURPQ19LRVlXT1JEID0gbmV3IFJHQigwLCAxMjgsIDApOwotCXB1YmxpYyBzdGF0aWMgUkdCIEpBVkFET0NfVEFHID0gbmV3IFJHQigxMjgsIDEyOCwgMTI4KTsKLQlwdWJsaWMgc3RhdGljIFJHQiBKQVZBRE9DX0xJTksgPSBuZXcgUkdCKDEyOCwgMTI4LCAxMjgpOwotCXB1YmxpYyBzdGF0aWMgUkdCIEpBVkFET0NfREVGQVVMVCA9IG5ldyBSR0IoMCwgMTI4LCAxMjgpOwotCQotCXB1YmxpYyBzdGF0aWMgaW50IE1VTFRJX0xJTkVfQ09NTUVOVF9CT0xEID0gU1dULk5PUk1BTDsKLQlwdWJsaWMgc3RhdGljIGludCBTSU5HTEVfTElORV9DT01NRU5UX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IEtFWVdPUkRfQk9MRCA9IFNXVC5CT0xEOwotCXB1YmxpYyBzdGF0aWMgaW50IFRZUEVfQk9MRCA9IFNXVC5CT0xEOwotCXB1YmxpYyBzdGF0aWMgaW50IFNUUklOR19CT0xEID0gU1dULk5PUk1BTDsKLQlwdWJsaWMgc3RhdGljIGludCBERUZBVUxUX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IEpBVkFET0NfS0VZV09SRF9CT0xEID0gU1dULkJPTEQ7Ci0JcHVibGljIHN0YXRpYyBpbnQgSkFWQURPQ19UQUdfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgSkFWQURPQ19MSU5LX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IEpBVkFET0NfREVGQVVMVF9CT0xEID0gU1dULk5PUk1BTDsKLQkKLQlwcml2YXRlIHN0YXRpYyBKYXZhQ29sb3JQcm92aWRlciBmSW5zdGFuY2UgPSBudWxsOwotCQotCXB1YmxpYyBzdGF0aWMgSmF2YUNvbG9yUHJvdmlkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IEphdmFDb2xvclByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0JCi0JLyoqCi0JICogVXNlIGNvbG9ycyBmcm9tIEpEVCBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkSmF2YUNvbG9ycygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBqZHRTdG9yZSA9IFByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCU1VTFRJX0xJTkVfQ09NTUVOVCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX01VTFRJX0xJTkVfQ09NTUVOVF9DT0xPUik7Ci0JCVNJTkdMRV9MSU5FX0NPTU1FTlQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0NPTE9SKTsKLQkJS0VZV09SRCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9DT0xPUik7Ci0JCVRZUEUgPSBLRVlXT1JEOwotCQlTVFJJTkcgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQ09MT1IpOwotCQlERUZBVUxUID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0NPTE9SKTsKLQkJSkFWQURPQ19LRVlXT1JEID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19LRVlXT1JEX0NPTE9SKTsKLQkJSkFWQURPQ19UQUcgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX1RBR19DT0xPUik7Ci0JCUpBVkFET0NfTElOSyA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfTElOS1NfQ09MT1IpOwotCQlKQVZBRE9DX0RFRkFVTFQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX0RFRkFVTFRfQ09MT1IpOwotCQkKLQkJTVVMVElfTElORV9DT01NRU5UX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX01VTFRJX0xJTkVfQ09NTUVOVF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJU0lOR0xFX0xJTkVfQ09NTUVOVF9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlLRVlXT1JEX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJVFlQRV9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCVNUUklOR19CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCURFRkFVTFRfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlKQVZBRE9DX1RBR19CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX1RBR19CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJSkFWQURPQ19MSU5LX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfTElOS1NfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCUpBVkFET0NfREVGQVVMVF9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX0RFRkFVTFRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YVdoaXRlc3BhY2VEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YVdoaXRlc3BhY2VEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjNjODFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFXaGl0ZXNwYWNlRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmphdmE7Ci0KLQotCi0vKioKLSAqIEEgamF2YSBhd2FyZSB3aGl0ZSBzcGFjZSBkZXRlY3Rvci4KLSAqLwotcHVibGljIGNsYXNzIEphdmFXaGl0ZXNwYWNlRGV0ZWN0b3IgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXaGl0ZXNwYWNlRGV0ZWN0b3IgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXaGl0ZXNwYWNlRGV0ZWN0b3IjaXNXaGl0ZXNwYWNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlKGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhV29yZERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhV29yZERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZjYzNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YVdvcmREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuamF2YTsKLQotCi0vKioKLSAqIEEgSmF2YSBhd2FyZSB3b3JkIGRldGVjdG9yLgotICovCi1wdWJsaWMgY2xhc3MgSmF2YVdvcmREZXRlY3RvciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdvcmREZXRlY3RvciB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdvcmREZXRlY3RvciNpc1dvcmRJZGVudGlmaWVyUGFydAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV29yZFBhcnQoY2hhciBjKSB7Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXb3JkRGV0ZWN0b3IjaXNXb3JkSWRlbnRpZmllclN0YXJ0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXb3JkU3RhcnQoY2hhciBjKSB7Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0xpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1M2FmN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBGcml0cyBKYWx2aW5naCAtIGNvbnRyaWJ1dGlvbnMgZm9yIGJ1ZyAxNTA3OTQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c1hNTDsKLQotLy8gTm90ZTogbWFueSBvZiB0aGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHdlcmUgYmFzZWQgb24gKG9yIGNvcGllZCBmcm9tKSB0aG9zZQotLy8gZm91bmQgaW4gdGhlIGV4YW1wbGUgSmF2YSBFZGl0b3IKLXB1YmxpYyBjbGFzcyBMaW5lU3R5bGVQcm92aWRlckZvckphdmEgZXh0ZW5kcyBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyIGltcGxlbWVudHMgTGluZVN0eWxlUHJvdmlkZXJ7Ci0KLQkvKiogVGhlIHNjYW5uZXIgaXQgdXNlcyAqLwotCXByaXZhdGUgSmF2YUNvZGVTY2FubmVyIGZTY2FubmVyOwotCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YSgpIHsKLQkJc3VwZXIoKTsKLQkJZlNjYW5uZXIgPSBuZXcgSmF2YUNvZGVTY2FubmVyKCk7Ci0JCWxvYWRDb2xvcnMoKTsJCS8vIE1ha2Ugc3VyZSB3ZSBoYXZlIHJ1bGVzIGJlZm9yZSB3ZSBzdGFydCBwYXJzaW5nCi0JfQotCi0JLyoqCi0JICogQWRkcyBzdHlsZSBpbmZvcm1hdGlvbiB0byB0aGUgZ2l2ZW4gdGV4dCBwcmVzZW50YXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcHJlc2VudGF0aW9uIHRoZSB0ZXh0IHByZXNlbnRhdGlvbiB0byBiZSBleHRlbmRlZAotCSAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBvZiB0aGUgcmFuZ2UgdG8gYmUgc3R5bGVkCi0JICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSByYW5nZSB0byBiZSBzdHlsZWQKLQkgKiBAcGFyYW0gYXR0ciB0aGUgYXR0cmlidXRlIGRlc2NyaWJpbmcgdGhlIHN0eWxlIG9mIHRoZSByYW5nZSB0byBiZSBzdHlsZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUmFuZ2UoQ29sbGVjdGlvbiBwcmVzZW50YXRpb24sIGludCBvZmZzZXQsIGludCBsZW5ndGgsIFRleHRBdHRyaWJ1dGUgYXR0cikgewotCQkvLyBzdXBwb3J0IGZvciB1c2VyIGRlZmluZWQgYmFja2dyb3VkIGZvciBKU1Agc2NyaXB0bGV0IHJlZ2lvbnMKLQkJVGV4dEF0dHJpYnV0ZSB0YSA9IChUZXh0QXR0cmlidXRlKWdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVCk7Ci0JCUNvbG9yIGJnQ29sb3IgPSB0YS5nZXRCYWNrZ3JvdW5kKCk7Ci0JCWlmIChiZ0NvbG9yID09IG51bGwpCi0JCQliZ0NvbG9yID0gYXR0ci5nZXRCYWNrZ3JvdW5kKCk7Ci0JCVN0eWxlUmFuZ2UgcmVzdWx0ID0gbmV3IFN0eWxlUmFuZ2Uob2Zmc2V0LCBsZW5ndGgsIGF0dHIuZ2V0Rm9yZWdyb3VuZCgpLCBiZ0NvbG9yLCBhdHRyLmdldFN0eWxlKCkpOwotCQlpZigoYXR0ci5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwKSB7Ci0JCQlyZXN1bHQuc3RyaWtlb3V0ID0gdHJ1ZTsKLQkJfQotCQlpZigoYXR0ci5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkUpICE9IDApIHsKLQkJCXJlc3VsdC51bmRlcmxpbmUgPSB0cnVlOwotCQl9Ci0JCXByZXNlbnRhdGlvbi5hZGQocmVzdWx0KTsKLQl9Ci0KLQkvKioKLQkgKiBMb29rcyB1cCB0aGUgY29sb3JLZXkgaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUgYW5kIGFkZHMgdGhlIHN0eWxlCi0JICogaW5mb3JtYXRpb24gdG8gbGlzdCBvZiBUZXh0QXR0cmlidXRlcwotCSAqIAotCSAqIEBwYXJhbSBjb2xvcktleQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRKYXZhVGV4dEF0dHJpYnV0ZShTdHJpbmcgY29sb3JLZXkpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldEphdmFDb2xvclByZWZlcmVuY2VzKCk7Ci0JCWlmIChzdG9yZSAhPSBudWxsICYmIGNvbG9yS2V5ICE9IG51bGwpIHsgCi0JCQlUZXh0QXR0cmlidXRlIHRhID0gbnVsbDsKLQkJCWlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfS0VZV09SRCkgewotCQkJCS8vIGtleXdvcmQKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9DT0xPUik7Ci0JCQkJYm9vbGVhbiBib2xkID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQk9MRCk7Ci0JCQkJYm9vbGVhbiBpdGFsaWNzID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfSVRBTElDKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9TVFJJS0VUSFJPVUdIKTsKLQkJCQlib29sZWFuIHVuZGVybGluZSA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX1VOREVSTElORSk7Ci0JCQkJaW50IHN0eWxlID0gU1dULk5PUk1BTDsKLQkJCQlpZiAoYm9sZCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChpdGFsaWNzKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuSVRBTElDOwotCQkJCX0KLQkJCQlpZiAoc3RyaWtldGhyb3VnaCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAodW5kZXJsaW5lKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlVOREVSTElORTsKLQkJCQl9Ci0KLQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgbnVsbCwgc3R5bGUpOwotCQkJfSBlbHNlIGlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfU1RSSU5HKSB7Ci0JCQkJLy8gc3RyaW5nCi0JCQkJUkdCIGZvcmVncm91bmQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQ09MT1IpOwotCQkJCWJvb2xlYW4gYm9sZCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0JPTEQpOwotCQkJCWJvb2xlYW4gaXRhbGljcyA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0lUQUxJQyk7Ci0JCQkJYm9vbGVhbiBzdHJpa2V0aHJvdWdoID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfU1RSSUtFVEhST1VHSCk7Ci0JCQkJYm9vbGVhbiB1bmRlcmxpbmUgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19VTkRFUkxJTkUpOwotCQkJCWludCBzdHlsZSA9IFNXVC5OT1JNQUw7Ci0JCQkJaWYgKGJvbGQpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoaXRhbGljcykgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULklUQUxJQzsKLQkJCQl9Ci0JCQkJaWYgKHN0cmlrZXRocm91Z2gpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSDsKLQkJCQl9Ci0JCQkJaWYgKHVuZGVybGluZSkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkU7Ci0JCQkJfQotCi0JCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIG51bGwsIHN0eWxlKTsKLQkJCX0gZWxzZSBpZiAoY29sb3JLZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX1NJTkdMRV9MSU5FX0NPTU1FTlQpIHsKLQkJCQkvLyBzaW5nbGUgbGluZSBjb21tZW50Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0NPTE9SKTsKLQkJCQlib29sZWFuIGJvbGQgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQk9MRCk7Ci0JCQkJYm9vbGVhbiBpdGFsaWNzID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0lUQUxJQyk7Ci0JCQkJYm9vbGVhbiBzdHJpa2V0aHJvdWdoID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX1NUUklLRVRIUk9VR0gpOwotCQkJCWJvb2xlYW4gdW5kZXJsaW5lID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX1VOREVSTElORSk7Ci0JCQkJaW50IHN0eWxlID0gU1dULk5PUk1BTDsKLQkJCQlpZiAoYm9sZCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChpdGFsaWNzKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuSVRBTElDOwotCQkJCX0KLQkJCQlpZiAoc3RyaWtldGhyb3VnaCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAodW5kZXJsaW5lKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlVOREVSTElORTsKLQkJCQl9Ci0KLQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgbnVsbCwgc3R5bGUpOwotCQkJfSBlbHNlIGlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfREVGQVVMVCkgewotCQkJCS8vIGRlZmF1bHQKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9DT0xPUik7Ci0JCQkJYm9vbGVhbiBib2xkID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQk9MRCk7Ci0JCQkJYm9vbGVhbiBpdGFsaWNzID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfSVRBTElDKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9TVFJJS0VUSFJPVUdIKTsKLQkJCQlib29sZWFuIHVuZGVybGluZSA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX1VOREVSTElORSk7Ci0JCQkJaW50IHN0eWxlID0gU1dULk5PUk1BTDsKLQkJCQlpZiAoYm9sZCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChpdGFsaWNzKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuSVRBTElDOwotCQkJCX0KLQkJCQlpZiAoc3RyaWtldGhyb3VnaCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAodW5kZXJsaW5lKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlVOREVSTElORTsKLQkJCQl9Ci0KLQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgbnVsbCwgc3R5bGUpOwotCQkJfQotCQkJaWYgKHRhICE9IG51bGwpIHsKLQkJCQlnZXRUZXh0QXR0cmlidXRlcygpLnB1dChjb2xvcktleSwgdGEpOwotCQkJCWZTY2FubmVyLnNldFRva2VuRGF0YShjb2xvcktleSwgdGEpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSB0ZXh0IGF0dHJpYnV0ZSBlbmNvZGVkIGluIHRoZSBnaXZlbiB0b2tlbi4gSWYgdGhlIHRva2VuJ3MKLQkgKiBkYXRhIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiBhbmQgYSB0ZXh0IGF0dHJpYnV0ZSBpdCBpcyBhc3N1bWVkIHRoYXQKLQkgKiBpdCBpcyB0aGUgZW5jb2RlZCB0ZXh0IGF0dHJpYnV0ZS4gSXQgcmV0dXJucyB0aGUgZGVmYXVsdCB0ZXh0IGF0dHJpYnV0ZQotCSAqIGlmIHRoZXJlIGlzIG5vIGVuY29kZWQgdGV4dCBhdHRyaWJ1dGUgZm91bmQuCi0JICoKLQkgKiBAcGFyYW0gdG9rZW4gdGhlIHRva2VuIHdob3NlIHRleHQgYXR0cmlidXRlIGlzIHRvIGJlIGRldGVybWluZWQKLQkgKiBAcmV0dXJuIHRoZSB0b2tlbidzIHRleHQgYXR0cmlidXRlCi0JICovCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGdldFRva2VuVGV4dEF0dHJpYnV0ZShJVG9rZW4gdG9rZW4pIHsKLQkJVGV4dEF0dHJpYnV0ZSB0YSA9IG51bGw7Ci0JCQotCQlPYmplY3QgZGF0YSA9IHRva2VuLmdldERhdGEoKTsKLQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBUZXh0QXR0cmlidXRlKQotCQkJdGEgPSAoVGV4dEF0dHJpYnV0ZSlkYXRhOwotCQllbHNlIHsKLQkJCXRhID0gKFRleHRBdHRyaWJ1dGUpZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX0RFRkFVTFQpOwotCQl9Ci0JCXJldHVybiB0YTsgCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvYWRDb2xvcnMoKSB7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU1AuSlNQX0NPTlRFTlQpOwotCQkKLQkJYWRkSmF2YVRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX0tFWVdPUkQpOwotCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfU1RSSU5HKTsKLQkJYWRkSmF2YVRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX1NJTkdMRV9MSU5FX0NPTU1FTlQpOwotCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfREVGQVVMVCk7Ci0JCQotCQlmU2Nhbm5lci5pbml0aWFsaXplUnVsZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHlsZUtleSA9IG51bGw7Ci0JCVN0cmluZyBqYXZhU3R5bGVLZXkgPSBudWxsOwotCi0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkvLyBjaGVjayBpZiBwcmVmZXJlbmNlIGNoYW5nZWQgaXMgYSBzdHlsZSBwcmVmZXJlbmNlCi0JCQlpZiAoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzSlNQLkpTUF9DT05URU5ULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzSlNQLkpTUF9DT05URU5UOwotCQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQk9MRC5lcXVhbHMocHJlZktleSkpfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCWphdmFTdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9LRVlXT1JEOwotCQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQk9MRC5lcXVhbHMocHJlZktleSkpfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCWphdmFTdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9TVFJJTkc7Ci0JCQl9IGVsc2UgaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0JPTEQuZXF1YWxzKHByZWZLZXkpKXx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0lUQUxJQy5lcXVhbHMocHJlZktleSkpKSB7Ci0JCQkJamF2YVN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX1NJTkdMRV9MSU5FX0NPTU1FTlQ7Ci0JCQl9IGVsc2UgaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9DT0xPUi5lcXVhbHMocHJlZktleSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9CT0xELmVxdWFscyhwcmVmS2V5KSl8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0lUQUxJQy5lcXVhbHMocHJlZktleSkpKSB7Ci0JCQkJamF2YVN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX0RFRkFVTFQ7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gb3ZlcndyaXRlIHN0eWxlIHByZWZlcmVuY2Ugd2l0aCBuZXcgdmFsdWUKLQkJCWFkZFRleHRBdHRyaWJ1dGUoc3R5bGVLZXkpOwotCQl9Ci0JCWlmIChqYXZhU3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gb3ZlcndyaXRlIHN0eWxlIHByZWZlcmVuY2Ugd2l0aCBuZXcgdmFsdWUKLQkJCWFkZEphdmFUZXh0QXR0cmlidXRlKGphdmFTdHlsZUtleSk7Ci0JCQlmU2Nhbm5lci5pbml0aWFsaXplUnVsZXMoKTsKLQkJfQotCQlpZiAoc3R5bGVLZXkgIT0gbnVsbCB8fCBqYXZhU3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gZm9yY2UgYSBmdWxsIHVwZGF0ZSBvZiB0aGUgdGV4dCB2aWV3ZXIKLQkJCWZSZWNIaWdobGlnaHRlci5yZWZyZXNoRGlzcGxheSgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJlcGFyZVJlZ2lvbnMoSVR5cGVkUmVnaW9uIHR5cGVkUmVnaW9uLCBpbnQgc3Nzc3JlcXVlc3RlZFN0YXJ0LCBpbnQgc3Nzc3JlcXVlc3RlZExlbmd0aCwgQ29sbGVjdGlvbiBob2xkUmVzdWx0cykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCS8qIEluaXRpYWxpemUgdGhlIHRleHQgYXR0cmlidXRlcy4gQWxzbyBsb2FkIHRoZSBjb2xvcnMgYW5kIGluaXRpYWxpemUgdGhlIHJ1bGVzIG9mIHRoZSBzY2FubmVyICovCi0JCWdldFRleHRBdHRyaWJ1dGVzKCk7Ci0JCXRyeSB7Ci0JCQkvLyBpZGVhbGx5LCBldmVudHVhbGx5LCB3ZSdsbCBoYXZlIGEgInZpcnR1YWxEb2N1bWVudCIgd2UgY2FuCi0JCQkvLyByZWZlciB0bywgYnV0IGZvciBub3cgLi4uIHdlJ2xsIHNpbXBsZSByZXNjYW4gdGhlIG9uZSByZWdpb24uCi0JCQkvLyB1c2Ugc2ltcGxlIGFkanVzdG1lbnQgKHNpbmNlICJzdWItY29udGVudCIgc3RhcnRzIGF0IDAKLQkJCWludCBsYXN0U3RhcnQgPSB0eXBlZFJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCWludCBsZW5ndGggPSAwOwotCQkJSVRva2VuIGxhc3RUb2tlbiA9IFRva2VuLlVOREVGSU5FRDsKLQkJCWZTY2FubmVyLnNldFJhbmdlKGdldERvY3VtZW50KCksIGxhc3RTdGFydCwgdHlwZWRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlJVG9rZW4gdG9rZW4gPSBmU2Nhbm5lci5uZXh0VG9rZW4oKTsKLQkJCQlpZiAodG9rZW4uaXNFT0YoKSkgewotCQkJCQlpZiAoIWxhc3RUb2tlbi5pc1VuZGVmaW5lZCgpICYmIGxlbmd0aCAhPSAwKSB7Ci0JCQkJCQlhZGRSYW5nZShob2xkUmVzdWx0cywgbGFzdFN0YXJ0LCBsZW5ndGgsIGdldFRva2VuVGV4dEF0dHJpYnV0ZShsYXN0VG9rZW4pKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHRva2VuLmlzV2hpdGVzcGFjZSgpKSB7Ci0JCQkJCWxlbmd0aCArPSBmU2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGxhc3RUb2tlbi5pc1VuZGVmaW5lZCgpKSB7Ci0JCQkJCWxhc3RUb2tlbiA9IHRva2VuOwotCQkJCQlsZW5ndGggKz0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmICh0b2tlbiAhPSBsYXN0VG9rZW4pIHsKLQkJCQkJYWRkUmFuZ2UoaG9sZFJlc3VsdHMsIGxhc3RTdGFydCwgbGVuZ3RoLCBnZXRUb2tlblRleHRBdHRyaWJ1dGUobGFzdFRva2VuKSk7Ci0JCQkJCWxhc3RUb2tlbiA9IHRva2VuOwotCQkJCQlsYXN0U3RhcnQgPSBmU2Nhbm5lci5nZXRUb2tlbk9mZnNldCgpOwotCQkJCQlsZW5ndGggPSBmU2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJbGVuZ3RoICs9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGRuJ3QgaGFwcGVuLCBidXQgd2UgZG9uJ3Qgd2FudCBpdCB0byBzdG9wIG90aGVyCi0JCQkvLyBoaWdobGlnaHRpbmcsIGlmIGl0IGRvZXMuCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQkKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCkgewotCQlnZXRDb2xvclByZWZlcmVuY2VzKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1blJlZ2lzdGVyUHJlZmVyZW5jZU1hbmFnZXIoKSB7Ci0JCWdldENvbG9yUHJlZmVyZW5jZXMoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCQlnZXRKYXZhQ29sb3JQcmVmZXJlbmNlcygpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSVN0eWxlQ29uc3RhbnRzSlNQRUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9JU3R5bGVDb25zdGFudHNKU1BFTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmM0ODI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9JU3R5bGVDb25zdGFudHNKU1BFTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qc3BlbDsKLQotcHVibGljIGludGVyZmFjZSBJU3R5bGVDb25zdGFudHNKU1BFTCB7Ci0JU3RyaW5nIEVMX0tFWVdPUkQgPSAia2V5d29yZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRUxfREVGQVVMVCA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMQ29kZVNjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTENvZGVTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MzRiOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMQ29kZVNjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmpzcGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5XaGl0ZXNwYWNlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLldvcmRSdWxlOwotCi0vKioKLSAqIEEgSmF2YSBjb2RlIHNjYW5uZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BFTENvZGVTY2FubmVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5SdWxlQmFzZWRTY2FubmVyIHsKLQlwcml2YXRlIElUb2tlbiBmS2V5d29yZFRva2VuOwotCXByaXZhdGUgSVRva2VuIGZUeXBlVG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZkRlZmF1bHRUb2tlbjsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmZ0tleXdvcmRzID0gewotCQkJCSJhbmQiLCAvLyROT04tTkxTLTEkCi0JCQkJImRpZCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiZGl2IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJlbXB0eSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiZXEiLCAvLyROT04tTkxTLTEkCi0JCQkJImdlIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJndCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkib3IiLCAvLyROT04tTkxTLTEkCi0JCQkJImxlIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJsdCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkibW9kIiwgLy8kTk9OLU5MUy0xJAotIAkJCQkibmUiLCAvLyROT04tTkxTLTEkCi0gCQkJCSJub3QiICAvLyROT04tTkxTLTEkCi0JfTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmZ0NvbnN0YW50cyA9IHsiZmFsc2UiLCAidHJ1ZSJ9Oy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgSmF2YSBjb2RlIHNjYW5uZXIKLQkgKi8KLQlwdWJsaWMgSlNQRUxDb2RlU2Nhbm5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVJ1bGVzKCkgewotCQlMaXN0IHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIEFkZCBnZW5lcmljIHdoaXRlc3BhY2UgcnVsZS4KLQkJcnVsZXMuYWRkKG5ldyBXaGl0ZXNwYWNlUnVsZShuZXcgSlNQRUxXaGl0ZXNwYWNlRGV0ZWN0b3IoKSkpOwotCi0JCS8vIEFkZCB3b3JkIHJ1bGUgZm9yIGtleXdvcmRzLCB0eXBlcywgYW5kIGNvbnN0YW50cy4KLQkJV29yZFJ1bGUgd29yZFJ1bGUgPSBuZXcgV29yZFJ1bGUobmV3IEpTUEVMV29yZERldGVjdG9yKCksIGZEZWZhdWx0VG9rZW4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZnS2V5d29yZHMubGVuZ3RoOyBpKyspCi0JCQl3b3JkUnVsZS5hZGRXb3JkKGZnS2V5d29yZHNbaV0sIGZLZXl3b3JkVG9rZW4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZnQ29uc3RhbnRzLmxlbmd0aDsgaSsrKQotCQkJd29yZFJ1bGUuYWRkV29yZChmZ0NvbnN0YW50c1tpXSwgZlR5cGVUb2tlbik7Ci0JCXJ1bGVzLmFkZCh3b3JkUnVsZSk7Ci0KLQkJSVJ1bGVbXSByZXN1bHQgPSBuZXcgSVJ1bGVbcnVsZXMuc2l6ZSgpXTsKLQkJcnVsZXMudG9BcnJheShyZXN1bHQpOwotCQlzZXRSdWxlcyhyZXN1bHQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUb2tlbkRhdGEoU3RyaW5nIHRva2VuS2V5LCBPYmplY3QgZGF0YSkgewotCQlpZiAodG9rZW5LZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQRUwuRUxfS0VZV09SRCkgewotCQkJZktleXdvcmRUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJCWZUeXBlVG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCX0gZWxzZSBpZiAodG9rZW5LZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQRUwuRUxfREVGQVVMVCkgewotCQkJZkRlZmF1bHRUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTENvbG9yUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTENvbG9yUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDExNzhhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxDb2xvclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuanNwZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLQotLyoqCi0gKiBDb2xvcnMgdXNlZCBpbiB0aGUgSmF2YSBlZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIEpTUEVMQ29sb3JQcm92aWRlciB7Ci0JCi0JLy8gcGVvcGxlIHNob3VsZCBub3QgYmUgc2V0dGluZyB0aGVzZSwgZXZlbiB0aG91Z2ggdGhleSBhcmUgY3VycmVudGx5IG5vdCBmaW5hbAotCXB1YmxpYyBzdGF0aWMgUkdCIE1VTFRJX0xJTkVfQ09NTUVOVCA9IG5ldyBSR0IoMTI4LCAwLCAwKTsKLQlwdWJsaWMgc3RhdGljIFJHQiBTSU5HTEVfTElORV9DT01NRU5UID0gbmV3IFJHQigxMjgsIDEyOCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgS0VZV09SRCA9IG5ldyBSR0IoMCwgMCwgMTI4KTsKLQlwdWJsaWMgc3RhdGljIFJHQiBUWVBFID0gbmV3IFJHQigwLCAwLCAxMjgpOwotCXB1YmxpYyBzdGF0aWMgUkdCIFNUUklORyA9IG5ldyBSR0IoMCwgMTI4LCAwKTsKLQlwdWJsaWMgc3RhdGljIFJHQiBERUZBVUxUID0gbmV3IFJHQigwLCAwLCAwKTsKLQlwdWJsaWMgc3RhdGljIFJHQiBKQVZBRE9DX0tFWVdPUkQgPSBuZXcgUkdCKDAsIDEyOCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgSkFWQURPQ19UQUcgPSBuZXcgUkdCKDEyOCwgMTI4LCAxMjgpOwotCXB1YmxpYyBzdGF0aWMgUkdCIEpBVkFET0NfTElOSyA9IG5ldyBSR0IoMTI4LCAxMjgsIDEyOCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgSkFWQURPQ19ERUZBVUxUID0gbmV3IFJHQigwLCAxMjgsIDEyOCk7Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgTVVMVElfTElORV9DT01NRU5UX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IFNJTkdMRV9MSU5FX0NPTU1FTlRfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgS0VZV09SRF9CT0xEID0gU1dULkJPTEQ7Ci0JcHVibGljIHN0YXRpYyBpbnQgVFlQRV9CT0xEID0gU1dULkJPTEQ7Ci0JcHVibGljIHN0YXRpYyBpbnQgU1RSSU5HX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IERFRkFVTFRfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgSkFWQURPQ19LRVlXT1JEX0JPTEQgPSBTV1QuQk9MRDsKLQlwdWJsaWMgc3RhdGljIGludCBKQVZBRE9DX1RBR19CT0xEID0gU1dULk5PUk1BTDsKLQlwdWJsaWMgc3RhdGljIGludCBKQVZBRE9DX0xJTktfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgSkFWQURPQ19ERUZBVUxUX0JPTEQgPSBTV1QuTk9STUFMOwotCQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGFsbCBlZGl0b3JzIHVzZSBzYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBSR0IgRURJVE9SX0JBQ0tHUk9VTkQgPSBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpOwotCS8qKgotCSAqIEBkZXByZWNhdGVkIGFsbCBlZGl0b3JzIHVzZSBzYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIEVESVRPUl9DVVJSRU5UX0xJTkUgPSB0cnVlOwotCS8qKgotCSAqIEBkZXByZWNhdGVkIGFsbCBlZGl0b3JzIHVzZSBzYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBSR0IgRURJVE9SX0NVUlJFTlRfTElORV9DT0xPUiA9IG5ldyBSR0IoMTI4LCAxMjgsIDEyOCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSlNQRUxDb2xvclByb3ZpZGVyIGZJbnN0YW5jZSA9IG51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyBKU1BFTENvbG9yUHJvdmlkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IEpTUEVMQ29sb3JQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCQotCS8qKgotCSAqIFVzZSBjb2xvcnMgZnJvbSBKRFQgcGx1Z2luCi0JICovCi0JcHVibGljIHZvaWQgbG9hZEphdmFDb2xvcnMoKSB7Ci0JCQotCQlJUHJlZmVyZW5jZVN0b3JlIGpkdFN0b3JlID0gUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJTVVMVElfTElORV9DT01NRU5UID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfTVVMVElfTElORV9DT01NRU5UX0NPTE9SKTsKLQkJU0lOR0xFX0xJTkVfQ09NTUVOVCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQ09MT1IpOwotCQlLRVlXT1JEID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0NPTE9SKTsKLQkJVFlQRSA9IEtFWVdPUkQ7Ci0JCVNUUklORyA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19DT0xPUik7Ci0JCURFRkFVTFQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQ09MT1IpOwotCQlKQVZBRE9DX0tFWVdPUkQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX0tFWVdPUkRfQ09MT1IpOwotCQlKQVZBRE9DX1RBRyA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfVEFHX0NPTE9SKTsKLQkJSkFWQURPQ19MSU5LID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19MSU5LU19DT0xPUik7Ci0JCUpBVkFET0NfREVGQVVMVCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfREVGQVVMVF9DT0xPUik7Ci0JCQotCQlNVUxUSV9MSU5FX0NPTU1FTlRfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfTVVMVElfTElORV9DT01NRU5UX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlTSU5HTEVfTElORV9DT01NRU5UX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCUtFWVdPUkRfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlUWVBFX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJU1RSSU5HX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJREVGQVVMVF9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCUpBVkFET0NfVEFHX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfVEFHX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlKQVZBRE9DX0xJTktfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19MSU5LU19CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJSkFWQURPQ19ERUZBVUxUX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfREVGQVVMVF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJCi0vLwkJRURJVE9SX0JBQ0tHUk9VTkQgPSBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpOwotCQkKLS8vCQlJUHJlZmVyZW5jZVN0b3JlIHNzZVN0b3JlID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotLy8JCUVESVRPUl9DVVJSRU5UX0xJTkUgPSBzc2VTdG9yZS5nZXRCb29sZWFuKEFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0NVUlJFTlRfTElORSk7Ci0vLwkJRURJVE9SX0NVUlJFTlRfTElORV9DT0xPUiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3NlU3RvcmUsIEFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0NVUlJFTlRfTElORV9DT0xPUik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMV2hpdGVzcGFjZURldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxXaGl0ZXNwYWNlRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5OTcwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxXaGl0ZXNwYWNlRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmpzcGVsOwotCi0KLQotLyoqCi0gKiBBIGphdmEgYXdhcmUgd2hpdGUgc3BhY2UgZGV0ZWN0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BFTFdoaXRlc3BhY2VEZXRlY3RvciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdoaXRlc3BhY2VEZXRlY3RvciB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdoaXRlc3BhY2VEZXRlY3RvciNpc1doaXRlc3BhY2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1doaXRlc3BhY2UoY2hhciBjKSB7Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTFdvcmREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMV29yZERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMGE3YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMV29yZERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qc3BlbDsKLQotCi0vKioKLSAqIEEgSmF2YSBhd2FyZSB3b3JkIGRldGVjdG9yLgotICovCi1wdWJsaWMgY2xhc3MgSlNQRUxXb3JkRGV0ZWN0b3IgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXb3JkRGV0ZWN0b3IgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXb3JkRGV0ZWN0b3IjaXNXb3JkSWRlbnRpZmllclBhcnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmRQYXJ0KGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV29yZERldGVjdG9yI2lzV29yZElkZW50aWZpZXJTdGFydAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV29yZFN0YXJ0KGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvTGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0xpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlNjM1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvTGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qc3BlbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhLklTdHlsZUNvbnN0YW50c0pTUEphdmE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLS8vIE5vdGU6IG1hbnkgb2YgdGhlIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyB3ZXJlIGJhc2VkIG9uIChvciBjb3BpZWQgZnJvbSkKLS8vIHRob3NlCi0vLyBmb3VuZCBpbiB0aGUgZXhhbXBsZSBKYXZhIEVkaXRvcgotcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUwgZXh0ZW5kcyBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyIGltcGxlbWVudHMgTGluZVN0eWxlUHJvdmlkZXIgewotCi0JLyoqIFRoZSBzY2FubmVyIGl0IHVzZXMgKi8KLQlwcml2YXRlIEpTUEVMQ29kZVNjYW5uZXIgZlNjYW5uZXI7Ci0KLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTCgpIHsKLQkJc3VwZXIoKTsKLQkJZlNjYW5uZXIgPSBuZXcgSlNQRUxDb2RlU2Nhbm5lcigpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgc3R5bGUgaW5mb3JtYXRpb24gdG8gdGhlIGdpdmVuIHRleHQgcHJlc2VudGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwcmVzZW50YXRpb24KLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHByZXNlbnRhdGlvbiB0byBiZSBleHRlbmRlZAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIHJhbmdlIHRvIGJlIHN0eWxlZAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJhbmdlIHRvIGJlIHN0eWxlZAotCSAqIEBwYXJhbSBhdHRyCi0JICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIGRlc2NyaWJpbmcgdGhlIHN0eWxlIG9mIHRoZSByYW5nZSB0byBiZSBzdHlsZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUmFuZ2UoQ29sbGVjdGlvbiBwcmVzZW50YXRpb24sIGludCBvZmZzZXQsIGludCBsZW5ndGgsIFRleHRBdHRyaWJ1dGUgYXR0cikgewotCQkvLyBzdXBwb3J0IGZvciB1c2VyIGRlZmluZWQgYmFja2dyb3VkIGZvciBKU1Agc2NyaXB0bGV0IHJlZ2lvbnMKLQkJU3RyaW5nIHN0eWxlU3RyaW5nID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhJU3R5bGVDb25zdGFudHNKU1AuSlNQX0NPTlRFTlQpOwotCQlTdHJpbmdbXSBwcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVTdHJpbmcpOwotCQlDb2xvciBiZ0NvbG9yID0gKHByZWZzICE9IG51bGwgJiYgcHJlZnMubGVuZ3RoID09IDMgJiYgcHJlZnNbMV0uc3RhcnRzV2l0aCgiIyIpICYmIERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJCQkJPyBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIENvbG9ySGVscGVyLnRvUkdCKHByZWZzWzFdKSkgOiBhdHRyLmdldEJhY2tncm91bmQoKTsKLQotCQlwcmVzZW50YXRpb24uYWRkKG5ldyBTdHlsZVJhbmdlKG9mZnNldCwgbGVuZ3RoLCBhdHRyLmdldEZvcmVncm91bmQoKSwgYmdDb2xvciwgYXR0ci5nZXRTdHlsZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIGNvbG9yS2V5IGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGFuZCBhZGRzIHRoZSBzdHlsZQotCSAqIGluZm9ybWF0aW9uIHRvIGxpc3Qgb2YgVGV4dEF0dHJpYnV0ZXMKLQkgKiAKLQkgKiBAcGFyYW0gY29sb3JLZXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkSmF2YVRleHRBdHRyaWJ1dGUoU3RyaW5nIGNvbG9yS2V5KSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRKYXZhQ29sb3JQcmVmZXJlbmNlcygpOwotCQlpZiAoc3RvcmUgIT0gbnVsbCAmJiBjb2xvcktleSAhPSBudWxsKSB7Ci0JCQlUZXh0QXR0cmlidXRlIHRhID0gbnVsbDsKLQkJCWlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BFTC5FTF9LRVlXT1JEKSB7Ci0JCQkJLy8ga2V5d29yZAotCQkJCVJHQiBmb3JlZ3JvdW5kID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0NPTE9SKTsKLQkJCQlib29sZWFuIGJvbGQgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9JVEFMSUMpOwotCQkJCWJvb2xlYW4gc3RyaWtldGhyb3VnaCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX1NUUklLRVRIUk9VR0gpOwotCQkJCWJvb2xlYW4gdW5kZXJsaW5lID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfVU5ERVJMSU5FKTsKLQkJCQlpbnQgc3R5bGUgPSBTV1QuTk9STUFMOwotCQkJCWlmIChib2xkKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKGl0YWxpY3MpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHJpa2V0aHJvdWdoKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmICh1bmRlcmxpbmUpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXRhID0gY3JlYXRlVGV4dEF0dHJpYnV0ZShmb3JlZ3JvdW5kLCBudWxsLCBzdHlsZSk7Ci0JCQl9IGVsc2UgaWYgKGNvbG9yS2V5ID09IElTdHlsZUNvbnN0YW50c0pTUEVMLkVMX0RFRkFVTFQpIHsKLQkJCQkvLyBkZWZhdWx0Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQ09MT1IpOwotCQkJCWJvb2xlYW4gYm9sZCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0JPTEQpOwotCQkJCWJvb2xlYW4gaXRhbGljcyA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0lUQUxJQyk7Ci0JCQkJYm9vbGVhbiBzdHJpa2V0aHJvdWdoID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfU1RSSUtFVEhST1VHSCk7Ci0JCQkJYm9vbGVhbiB1bmRlcmxpbmUgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9VTkRFUkxJTkUpOwotCQkJCWludCBzdHlsZSA9IFNXVC5OT1JNQUw7Ci0JCQkJaWYgKGJvbGQpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoaXRhbGljcykgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULklUQUxJQzsKLQkJCQl9Ci0JCQkJaWYgKHN0cmlrZXRocm91Z2gpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSDsKLQkJCQl9Ci0JCQkJaWYgKHVuZGVybGluZSkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkU7Ci0JCQkJfQotCi0JCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIG51bGwsIHN0eWxlKTsKLQkJCX0KLQkJCWlmICh0YSAhPSBudWxsKSB7Ci0JCQkJZ2V0VGV4dEF0dHJpYnV0ZXMoKS5wdXQoY29sb3JLZXksIHRhKTsKLQkJCQlmU2Nhbm5lci5zZXRUb2tlbkRhdGEoY29sb3JLZXksIHRhKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB0ZXh0IGF0dHJpYnV0ZSBlbmNvZGVkIGluIHRoZSBnaXZlbiB0b2tlbi4gSWYgdGhlIHRva2VuJ3MKLQkgKiBkYXRhIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiBhbmQgYSB0ZXh0IGF0dHJpYnV0ZSBpdCBpcyBhc3N1bWVkIHRoYXQKLQkgKiBpdCBpcyB0aGUgZW5jb2RlZCB0ZXh0IGF0dHJpYnV0ZS4gSXQgcmV0dXJucyB0aGUgZGVmYXVsdCB0ZXh0IGF0dHJpYnV0ZQotCSAqIGlmIHRoZXJlIGlzIG5vIGVuY29kZWQgdGV4dCBhdHRyaWJ1dGUgZm91bmQuCi0JICogCi0JICogQHBhcmFtIHRva2VuCi0JICogICAgICAgICAgICB0aGUgdG9rZW4gd2hvc2UgdGV4dCBhdHRyaWJ1dGUgaXMgdG8gYmUgZGV0ZXJtaW5lZAotCSAqIEByZXR1cm4gdGhlIHRva2VuJ3MgdGV4dCBhdHRyaWJ1dGUKLQkgKi8KLQlwcml2YXRlIFRleHRBdHRyaWJ1dGUgZ2V0VG9rZW5UZXh0QXR0cmlidXRlKElUb2tlbiB0b2tlbikgewotCQlUZXh0QXR0cmlidXRlIHRhID0gbnVsbDsKLQotCQlPYmplY3QgZGF0YSA9IHRva2VuLmdldERhdGEoKTsKLQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBUZXh0QXR0cmlidXRlKQotCQkJdGEgPSAoVGV4dEF0dHJpYnV0ZSkgZGF0YTsKLQkJZWxzZSB7Ci0JCQl0YSA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfREVGQVVMVCk7Ci0JCX0KLQkJcmV0dXJuIHRhOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRDb2xvcnMoKSB7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQotCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfS0VZV09SRCk7Ci0JCWFkZEphdmFUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9ERUZBVUxUKTsKLQotCQlmU2Nhbm5lci5pbml0aWFsaXplUnVsZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHlsZUtleSA9IG51bGw7Ci0JCVN0cmluZyBqYXZhU3R5bGVLZXkgPSBudWxsOwotCi0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkvLyBjaGVjayBpZiBwcmVmZXJlbmNlIGNoYW5nZWQgaXMgYSBzdHlsZSBwcmVmZXJlbmNlCi0JCQlpZiAoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUjsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQl9IGVsc2UgaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9DT0xPUi5lcXVhbHMocHJlZktleSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9CT0xELmVxdWFscyhwcmVmS2V5KSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCWphdmFTdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTUEVMLkVMX0tFWVdPUkQ7Ci0JCQl9IGVsc2UgaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9DT0xPUi5lcXVhbHMocHJlZktleSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9CT0xELmVxdWFscyhwcmVmS2V5KSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCWphdmFTdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTUEVMLkVMX0RFRkFVTFQ7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gb3ZlcndyaXRlIHN0eWxlIHByZWZlcmVuY2Ugd2l0aCBuZXcgdmFsdWUKLQkJCWFkZFRleHRBdHRyaWJ1dGUoc3R5bGVLZXkpOwotCQl9Ci0JCWlmIChqYXZhU3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gb3ZlcndyaXRlIHN0eWxlIHByZWZlcmVuY2Ugd2l0aCBuZXcgdmFsdWUKLQkJCWFkZEphdmFUZXh0QXR0cmlidXRlKGphdmFTdHlsZUtleSk7Ci0JCQlmU2Nhbm5lci5pbml0aWFsaXplUnVsZXMoKTsKLQkJfQotCQlpZiAoc3R5bGVLZXkgIT0gbnVsbCB8fCBqYXZhU3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gZm9yY2UgYSBmdWxsIHVwZGF0ZSBvZiB0aGUgdGV4dCB2aWV3ZXIKLQkJCWZSZWNIaWdobGlnaHRlci5yZWZyZXNoRGlzcGxheSgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJlcGFyZVJlZ2lvbnMoSVR5cGVkUmVnaW9uIHR5cGVkUmVnaW9uLCBpbnQgc3Nzc3JlcXVlc3RlZFN0YXJ0LCBpbnQgc3Nzc3JlcXVlc3RlZExlbmd0aCwgQ29sbGVjdGlvbiBob2xkUmVzdWx0cykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQkvLyBpZGVhbGx5LCBldmVudHVhbGx5LCB3ZSdsbCBoYXZlIGEgInZpcnR1YWxEb2N1bWVudCIgd2UgY2FuCi0JCQkvLyByZWZlciB0bywgYnV0IGZvciBub3cgLi4uIHdlJ2xsIHNpbXBsZSByZXNjYW4gdGhlIG9uZSByZWdpb24uCi0JCQkvLyB1c2Ugc2ltcGxlIGFkanVzdG1lbnQgKHNpbmNlICJzdWItY29udGVudCIgc3RhcnRzIGF0IDAKLQkJCWludCBvZmZzZXRBZGp1c3RtZW50ID0gdHlwZWRSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlTdHJpbmcgY29udGVudCA9IGZEb2N1bWVudC5nZXQodHlwZWRSZWdpb24uZ2V0T2Zmc2V0KCksIHR5cGVkUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudChjb250ZW50KTsKLQotCQkJaW50IGxhc3RTdGFydCA9IDA7Ci0JCQlpbnQgbGVuZ3RoID0gMDsKLQkJCUlUb2tlbiBsYXN0VG9rZW4gPSBUb2tlbi5VTkRFRklORUQ7Ci0KLQkJCWludCByZW1haW5pbmdMZW5ndGggPSB0eXBlZFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCWZTY2FubmVyLnNldFJhbmdlKGRvY3VtZW50LCBsYXN0U3RhcnQsIHJlbWFpbmluZ0xlbmd0aCk7Ci0KLQkJCXdoaWxlICh0cnVlKSB7Ci0KLQkJCQlJVG9rZW4gdG9rZW4gPSBmU2Nhbm5lci5uZXh0VG9rZW4oKTsKLQotCQkJCWlmICh0b2tlbi5pc0VPRigpKSB7Ci0JCQkJCWlmICghbGFzdFRva2VuLmlzVW5kZWZpbmVkKCkgJiYgbGVuZ3RoICE9IDApCi0JCQkJCQlhZGRSYW5nZShob2xkUmVzdWx0cywgbGFzdFN0YXJ0ICsgb2Zmc2V0QWRqdXN0bWVudCwgbGVuZ3RoLCBnZXRUb2tlblRleHRBdHRyaWJ1dGUobGFzdFRva2VuKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWlmICh0b2tlbi5pc1doaXRlc3BhY2UoKSkgewotCQkJCQlsZW5ndGggKz0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGxhc3RUb2tlbi5pc1VuZGVmaW5lZCgpKSB7Ci0JCQkJCWxhc3RUb2tlbiA9IHRva2VuOwotCQkJCQlsZW5ndGggKz0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKHRva2VuICE9IGxhc3RUb2tlbikgewotCQkJCQlhZGRSYW5nZShob2xkUmVzdWx0cywgbGFzdFN0YXJ0ICsgb2Zmc2V0QWRqdXN0bWVudCwgbGVuZ3RoLCBnZXRUb2tlblRleHRBdHRyaWJ1dGUobGFzdFRva2VuKSk7Ci0JCQkJCWxhc3RUb2tlbiA9IHRva2VuOwotCQkJCQlsYXN0U3RhcnQgPSBmU2Nhbm5lci5nZXRUb2tlbk9mZnNldCgpOwotCQkJCQlsZW5ndGggPSBmU2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlsZW5ndGggKz0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCX0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkbid0IGhhcHBlbiwgYnV0IHdlIGRvbid0IHdhbnQgaXQgdG8gc3RvcCBvdGhlcgotCQkJLy8gaGlnaGxpZ2h0aW5nLCBpZiBpdCBkb2VzLgotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0Q29sb3JQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldEphdmFDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJQcmVmZXJlbmNlTWFuYWdlcigpIHsKLQkJZ2V0Q29sb3JQcmVmZXJlbmNlcygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCWdldEphdmFDb2xvclByZWZlcmVuY2VzKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdW5SZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCkgewotCQlnZXRDb2xvclByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjczNzFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi0vKioKLSAqIFByb3ZpZGVzIGNvbnRleHQgaGVscCBmb3IgSlNQIHRhZ3MgKFNob3cgdG9vbHRpcCBkZXNjcmlwdGlvbikKLSAqIAotICogQGRlcHJlY2F0ZWQgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGNyZWF0ZXMgdGhlIGFwcHJvcHJpYXRlCi0gKiAgICAgICAgICAgICBpbmZvcm1hdGlvbiBwcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgSlNQSW5mb3JtYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIElJbmZvcm1hdGlvblByb3ZpZGVyLCBJSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbiB7Ci0JcHJpdmF0ZSBJVGV4dEhvdmVyIGZUZXh0SG92ZXIgPSBudWxsOwotCi0JcHVibGljIEpTUEluZm9ybWF0aW9uUHJvdmlkZXIoKSB7Ci0JCWZUZXh0SG92ZXIgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGV4dEhvdmVyTWFuYWdlcigpLmNyZWF0ZUJlc3RNYXRjaEhvdmVyKG5ldyBKU1BUYWdJbmZvSG92ZXJQcm9jZXNzb3IoKSk7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0U3ViamVjdChJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBmVGV4dEhvdmVyLmdldEhvdmVyUmVnaW9uKHRleHRWaWV3ZXIsIG9mZnNldCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHN1YmplY3QpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldEluZm9ybWF0aW9uMih0ZXh0Vmlld2VyLCBzdWJqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEluZm9ybWF0aW9uMihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHN1YmplY3QpIHsKLQkJcmV0dXJuIGZUZXh0SG92ZXIuZ2V0SG92ZXJJbmZvKHRleHRWaWV3ZXIsIHN1YmplY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUEphdmFKYXZhZG9jSG92ZXJQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUEphdmFKYXZhZG9jSG92ZXJQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE3YWRlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KU1BKYXZhSmF2YWRvY0hvdmVyUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRMYWJlbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFkb2NDb250ZW50QWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLnRleHQuaHRtbC5IVE1MUHJpbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5JSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mby5BYnN0cmFjdEhvdmVyUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotLyoqCi0gKiBQcm92aWRlcyBqYXZhZG9jIGhvdmVyIGhlbHAgZG9jdW1lbnRhdGlvbiBmb3IgamF2YSBjb2RlIGluc2lkZSBKU1BzCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BKYXZhSmF2YWRvY0hvdmVyUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RIb3ZlclByb2Nlc3NvciB7Ci0JLyoKLQkgKiBCdWxrIG9mIHRoZSB3b3JrIHdhcyBjb3BpZWQgZnJvbQotCSAqIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuaG92ZXIuSmF2YWRvY0hvdmVyCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBsb25nIExBQkVMX0ZMQUdTID0gSmF2YUVsZW1lbnRMYWJlbHMuQUxMX0ZVTExZX1FVQUxJRklFRCB8IEphdmFFbGVtZW50TGFiZWxzLk1fUFJFX1JFVFVSTlRZUEUgfCBKYXZhRWxlbWVudExhYmVscy5NX1BBUkFNRVRFUl9UWVBFUyB8IEphdmFFbGVtZW50TGFiZWxzLk1fUEFSQU1FVEVSX05BTUVTIHwgSmF2YUVsZW1lbnRMYWJlbHMuTV9FWENFUFRJT05TIHwgSmF2YUVsZW1lbnRMYWJlbHMuRl9QUkVfVFlQRV9TSUdOQVRVUkUgfCBKYXZhRWxlbWVudExhYmVscy5NX1BSRV9UWVBFX1BBUkFNRVRFUlMgfCBKYXZhRWxlbWVudExhYmVscy5UX1RZUEVfUEFSQU1FVEVSUyB8IEphdmFFbGVtZW50TGFiZWxzLlVTRV9SRVNPTFZFRDsKLQlwcml2YXRlIGZpbmFsIGxvbmcgTE9DQUxfVkFSSUFCTEVfRkxBR1MgPSBMQUJFTF9GTEFHUyAmIH5KYXZhRWxlbWVudExhYmVscy5GX0ZVTExZX1FVQUxJRklFRCB8IEphdmFFbGVtZW50TGFiZWxzLkZfUE9TVF9RVUFMSUZJRUQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhvdmVySW5mbyhJSmF2YUVsZW1lbnRbXSByZXN1bHQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG5SZXN1bHRzID0gcmVzdWx0Lmxlbmd0aDsKLQkJaWYgKG5SZXN1bHRzID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoblJlc3VsdHMgPiAxKSB7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJSFRNTFByaW50ZXIuc3RhcnRCdWxsZXRMaXN0KGJ1ZmZlcik7Ci0JCQkJSUphdmFFbGVtZW50IGN1cnIgPSByZXN1bHRbaV07Ci0JCQkJaWYgKGN1cnIgaW5zdGFuY2VvZiBJTWVtYmVyIHx8IGN1cnIuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEUpCi0JCQkJCUhUTUxQcmludGVyLmFkZEJ1bGxldChidWZmZXIsIGdldEluZm9UZXh0KGN1cnIpKTsKLQkJCQlIVE1MUHJpbnRlci5lbmRCdWxsZXRMaXN0KGJ1ZmZlcik7Ci0JCQl9Ci0KLQkJfQotCQllbHNlIHsKLQotCQkJSUphdmFFbGVtZW50IGN1cnIgPSByZXN1bHRbMF07Ci0JCQlpZiAoY3VyciBpbnN0YW5jZW9mIElNZW1iZXIpIHsKLQkJCQlJTWVtYmVyIG1lbWJlciA9IChJTWVtYmVyKSBjdXJyOwotCQkJCUhUTUxQcmludGVyLmFkZFNtYWxsSGVhZGVyKGJ1ZmZlciwgZ2V0SW5mb1RleHQobWVtYmVyKSk7Ci0JCQkJUmVhZGVyIHJlYWRlcjsKLQkJCQl0cnkgewotCQkJCQlyZWFkZXIgPSBKYXZhZG9jQ29udGVudEFjY2Vzcy5nZXRIVE1MQ29udGVudFJlYWRlcihtZW1iZXIsIHRydWUsIHRydWUpOwotCQkJCX0KLQkJCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKLQkJCQkJSFRNTFByaW50ZXIuYWRkUGFyYWdyYXBoKGJ1ZmZlciwgcmVhZGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChjdXJyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFIHx8IGN1cnIuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRV9QQVJBTUVURVIpCi0JCQkJSFRNTFByaW50ZXIuYWRkU21hbGxIZWFkZXIoYnVmZmVyLCBnZXRJbmZvVGV4dChjdXJyKSk7Ci0JCX0KLQotCQlpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgewotCQkJSFRNTFByaW50ZXIuaW5zZXJ0UGFnZVByb2xvZyhidWZmZXIsIDApOwotCQkJSFRNTFByaW50ZXIuYWRkUGFnZUVwaWxvZyhidWZmZXIpOwotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIjZ2V0SG92ZXJJbmZvKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIb3ZlckluZm8oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBob3ZlclJlZ2lvbikgewotCQkvLyBnZXQgSlNQIHRyYW5zbGF0aW9uIG9iamVjdCBmb3IgdGhpcyB2aWV3ZXIncyBkb2N1bWVudAotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCXRyeSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCUpTUFRyYW5zbGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKEpTUFRyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCUpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCQkJCQkKLQkJCQkJSUphdmFFbGVtZW50W10gcmVzdWx0ID0gdHJhbnNsYXRpb24uZ2V0RWxlbWVudHNGcm9tSnNwUmFuZ2UoaG92ZXJSZWdpb24uZ2V0T2Zmc2V0KCksIGhvdmVyUmVnaW9uLmdldE9mZnNldCgpICsgaG92ZXJSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQlyZXR1cm4gdHJhbnNsYXRpb24uZml4dXBNYW5nbGVkTmFtZShnZXRIb3ZlckluZm8ocmVzdWx0KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIjZ2V0SG92ZXJSZWdpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIb3ZlclJlZ2lvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBKYXZhV29yZEZpbmRlci5maW5kV29yZCh0ZXh0Vmlld2VyLmdldERvY3VtZW50KCksIG9mZnNldCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5mb1RleHQoSUphdmFFbGVtZW50IG1lbWJlcikgewotCQlsb25nIGZsYWdzID0gbWVtYmVyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFID8gTE9DQUxfVkFSSUFCTEVfRkxBR1MgOiBMQUJFTF9GTEFHUzsKLQkJU3RyaW5nIGxhYmVsID0gSmF2YUVsZW1lbnRMYWJlbHMuZ2V0RWxlbWVudExhYmVsKG1lbWJlciwgZmxhZ3MpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxhYmVsLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBsYWJlbC5jaGFyQXQoaSk7Ci0JCQlpZiAoY2ggPT0gJzwnKSB7Ci0JCQkJYnVmLmFwcGVuZCgiJmx0OyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmIChjaCA9PSAnPicpIHsKLQkJCQlidWYuYXBwZW5kKCImZ3Q7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJ1Zi5hcHBlbmQoY2gpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KU1BKYXZhSmF2YWRvY0luZm9ybWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUEphdmFKYXZhZG9jSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWEwNmYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUEphdmFKYXZhZG9jSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLS8qKgotICogUHJvdmlkZXMgamF2YWRvYyBjb250ZXh0IGluZm9ybWF0aW9uIGZvciBqYXZhIGNvZGUgaW5zaWRlIEpTUHMgKFNob3dzCi0gKiB0b29sdGlwIGRlc2NyaXB0aW9uKQotICogCi0gKiBAZGVwcmVjYXRlZCBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gY3JlYXRlcyB0aGUgYXBwcm9wcmlhdGUKLSAqICAgICAgICAgICAgIGluZm9ybWF0aW9uIHByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BKYXZhSmF2YWRvY0luZm9ybWF0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJSW5mb3JtYXRpb25Qcm92aWRlciwgSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb24gewotCXByaXZhdGUgSVRleHRIb3ZlciBmVGV4dEhvdmVyID0gbnVsbDsKLQotCXB1YmxpYyBKU1BKYXZhSmF2YWRvY0luZm9ybWF0aW9uUHJvdmlkZXIoKSB7Ci0JCWZUZXh0SG92ZXIgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGV4dEhvdmVyTWFuYWdlcigpLmNyZWF0ZUJlc3RNYXRjaEhvdmVyKG5ldyBKU1BKYXZhSmF2YWRvY0hvdmVyUHJvY2Vzc29yKCkpOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldFN1YmplY3QoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlclJlZ2lvbih0ZXh0Vmlld2VyLCBvZmZzZXQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRJbmZvcm1hdGlvbjIodGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbjIoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiBmVGV4dEhvdmVyLmdldEhvdmVySW5mbyh0ZXh0Vmlld2VyLCBzdWJqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KU1BUYWdJbmZvSG92ZXJQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzJhN2MyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50YWdpbmZvLkhUTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogUHJvdmlkZXMgaG92ZXIgaGVscCBkb2N1bWVudGF0aW9uIGZvciBKU1AgdGFncwotICovCi1wdWJsaWMgY2xhc3MgSlNQVGFnSW5mb0hvdmVyUHJvY2Vzc29yIGV4dGVuZHMgSFRNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvciB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVSZWdpb25IZWxwKEluZGV4ZWRSZWdpb24gdHJlZU5vZGUsIElET01Ob2RlIHBhcmVudE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJcmVzdWx0ID0gY29tcHV0ZUpTUERpckhlbHAoKElET01Ob2RlKSB0cmVlTm9kZSwgcGFyZW50Tm9kZSwgZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZQotCQkJcmVzdWx0ID0gc3VwZXIuY29tcHV0ZVJlZ2lvbkhlbHAodHJlZU5vZGUsIHBhcmVudE5vZGUsIGZsYXROb2RlLCByZWdpb24pOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGhvdmVyIGhlbHAgZm9yIHRoZSBqc3AgZGlyZWN0aXZlIG5hbWUKLQkgKiBmb3Igbm93LCB0cmVhdCBqc3AgZGlyZWN0aXZlcyBsaWtlIGFueSBvdGhlciB0YWcgbmFtZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZUpTUERpckhlbHAoSURPTU5vZGUgeG1sbm9kZSwgSURPTU5vZGUgcGFyZW50Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiBjb21wdXRlVGFnTmFtZUhlbHAoeG1sbm9kZSwgcGFyZW50Tm9kZSwgZmxhdE5vZGUsIHJlZ2lvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KYXZhV29yZEZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSmF2YVdvcmRGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFjYzU3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KYXZhV29yZEZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotCi0vKioKLSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkphdmFXb3JkRmluZGVyCi0gKi8KLWNsYXNzIEphdmFXb3JkRmluZGVyIHsKLQlwdWJsaWMgc3RhdGljIElSZWdpb24gZmluZFdvcmQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBmaW5kV29yZChkb2N1bWVudCwgb2Zmc2V0LCBmYWxzZSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgSVJlZ2lvbiBmaW5kV29yZChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGJvb2xlYW4gc2VhcmNoUXVhbGlmaWVkKSB7Ci0JCQotCQlpbnQgc3RhcnQ9IC0xOwotCQlpbnQgZW5kPSAtMTsKLQkJCi0JCQotCQl0cnkgewotCQkJCi0JCQlpbnQgcG9zPSBvZmZzZXQ7Ci0JCQljaGFyIGM7Ci0JCQkKLQkJCXdoaWxlIChwb3MgPj0gMCkgewotCQkJCWM9IGRvY3VtZW50LmdldENoYXIocG9zKTsKLQkJCQlpZiAoc2VhcmNoUXVhbGlmaWVkID8gIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSAmJiBjICE9ICcuJyA6ICFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykpCi0JCQkJCWJyZWFrOwotCQkJCS0tcG9zOwotCQkJfQotCQkJCi0JCQlzdGFydD0gcG9zOwotCQkJCi0JCQlwb3M9IG9mZnNldDsKLQkJCWludCBsZW5ndGg9IGRvY3VtZW50LmdldExlbmd0aCgpOwotCQkJCi0JCQl3aGlsZSAocG9zIDwgbGVuZ3RoKSB7Ci0JCQkJYz0gZG9jdW1lbnQuZ2V0Q2hhcihwb3MpOwotCQkJCWlmIChzZWFyY2hRdWFsaWZpZWQgPyAhQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpICYmIGMgIT0gJy4nIDogIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSkKLQkJCQkJYnJlYWs7Ci0JCQkJKytwb3M7Ci0JCQl9Ci0JCQkKLQkJCWVuZD0gcG9zOwotCQkJCi0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJfQotCQkKLQkJaWYgKHN0YXJ0ID4gLTEgJiYgZW5kID4gLTEpIHsKLQkJCWlmIChzdGFydCA9PSBvZmZzZXQgJiYgZW5kID09IG9mZnNldCkKLQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihvZmZzZXQsIDApOwotCQkJZWxzZSBpZiAoc3RhcnQgPT0gb2Zmc2V0KQotCQkJCXJldHVybiBuZXcgUmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG5ldyBSZWdpb24oc3RhcnQgKyAxLCBlbmQgLSBzdGFydCAtIDEpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9YTUxKYXZhZG9jSG92ZXJQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL1hNTEphdmFkb2NIb3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWQ2MjEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL1hNTEphdmFkb2NIb3ZlclByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nDQotICogICAgIA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50YWdpbmZvOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsNCi0NCi0NCi0NCi0vKioNCi0gKiBQcm92aWRlcyBob3ZlciBoZWxwIGRvY3VtZW50YXRpb24gZm9yIHhtbCB0YWdzDQotICogDQotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXINCi0gKi8NCi1wdWJsaWMgY2xhc3MgWE1MSmF2YWRvY0hvdmVyUHJvY2Vzc29yIGV4dGVuZHMgSlNQSmF2YUphdmFkb2NIb3ZlclByb2Nlc3NvciB7DQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUNCi0JICogb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50YWdpbmZvLkpTUEphdmFKYXZhZG9jSG92ZXJQcm9jZXNzb3INCi0JICogI2dldEhvdmVySW5mbyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLA0KLQkgKiBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEhvdmVySW5mbyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIGhvdmVyUmVnaW9uKSB7DQotCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQllbGVtZW50TmFtZSA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXQoaG92ZXJSZWdpb24uZ2V0T2Zmc2V0KCksIGhvdmVyUmVnaW9uLmdldExlbmd0aCgpKTsNCi0JCX0NCi0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7DQotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsNCi0JCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOw0KLQkJCQkvLyBVUkwgZml4dXAgZnJvbSB0aGUgdGFnbGliIGluZGV4IHJlY29yZA0KLQkJCQlpZiAoYmFzZUxvY2F0aW9uLnN0YXJ0c1dpdGgoImphcjovZmlsZToiKSkgew0KLQkJCQkJYmFzZUxvY2F0aW9uID0gU3RyaW5nVXRpbHMucmVwbGFjZShiYXNlTG9jYXRpb24sICJqYXI6LyIsICJqYXI6Iik7DQotCQkJCX0NCi0JCQkJLyoNCi0JCQkJICogSGFuZGxlIG9wZW5lZCBUTEQgZmlsZXMgZnJvbSBKQVJzIG9uIHRoZSBKYXZhIEJ1aWxkIFBhdGggYnkNCi0JCQkJICogZmluZGluZyBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBmb3IgdGhlIHNhbWUgLmphciBmaWxlIGFuZA0KLQkJCQkgKiBvcGVuaW5nIHRoZSBjbGFzcyBmcm9tIHRoZXJlLiBOb3RlIHRoYXQgdGhpcyBtaWdodCBiZSBmcm9tDQotCQkJCSAqIGEgZGlmZmVyZW50IEphdmEgcHJvamVjdCdzIGJ1aWxkIHBhdGggdGhhbiB0aGUgVExELg0KLQkJCQkgKi8NCi0JCQkJaWYgKGJhc2VMb2NhdGlvbi5zdGFydHNXaXRoKCJqYXI6ZmlsZToiKSAmJiBiYXNlTG9jYXRpb24uaW5kZXhPZignIScpID4gOSkgew0KLQkJCQkJU3RyaW5nIGJhc2VGaWxlID0gYmFzZUxvY2F0aW9uLnN1YnN0cmluZyg5LCBiYXNlTG9jYXRpb24uaW5kZXhPZignIScpKTsNCi0JCQkJCUlQYXRoIGJhc2VQYXRoID0gbmV3IFBhdGgoYmFzZUZpbGUpOw0KLQkJCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsNCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsNCi0JCQkJCQl0cnkgew0KLQkJCQkJCQlpZiAocHJvamVjdHNbaV0uaXNBY2Nlc3NpYmxlKCkgJiYgcHJvamVjdHNbaV0uaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpIHsNCi0JCQkJCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0c1tpXSk7DQotCQkJCQkJCQlpZiAoamF2YVByb2plY3QuZXhpc3RzKCkpIHsNCi0JCQkJCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gamF2YVByb2plY3QuZmluZFBhY2thZ2VGcmFnbWVudFJvb3QoYmFzZVBhdGgpOw0KLQkJCQkJCQkJCWlmIChyb290ICE9IG51bGwpIHsNCi0JCQkJCQkJCQkJLy8gVExEcyBkb24ndCByZWZlcmVuY2UgbWV0aG9kIG5hbWVzDQotCQkJCQkJCQkJCUlUeXBlIHR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZShlbGVtZW50TmFtZSk7DQotCQkJCQkJCQkJCWlmICh0eXBlICE9IG51bGwpIHsNCi0JCQkJCQkJCQkJCXJldHVybiBnZXRIb3ZlckluZm8obmV3IElKYXZhRWxlbWVudFtde3R5cGV9KTsNCi0JCQkJCQkJCQkJfQ0KLQkJCQkJCQkJCX0NCi0JCQkJCQkJCX0NCi0JCQkJCQkJfQ0KLQkJCQkJCX0NCi0JCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOw0KLQkJCQkJaWYgKGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgew0KLQkJCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoYmFzZVBhdGguc2VnbWVudCgwKSkpOw0KLQkJCQkJCWlmIChqYXZhUHJvamVjdC5leGlzdHMoKSkgew0KLQkJCQkJCQl0cnkgew0KLQkJCQkJCQkJLy8gVExEcyBkb24ndCByZWZlcmVuY2UgbWV0aG9kIG5hbWVzDQotCQkJCQkJCQlJVHlwZSB0eXBlID0gamF2YVByb2plY3QuZmluZFR5cGUoZWxlbWVudE5hbWUpOw0KLQkJCQkJCQkJaWYgKHR5cGUgIT0gbnVsbCkgew0KLQkJCQkJCQkJCXJldHVybiBnZXRIb3ZlckluZm8obmV3IElKYXZhRWxlbWVudFtde3R5cGV9KTsNCi0JCQkJCQkJCX0NCi0JCQkJCQkJfQ0KLQkJCQkJCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsNCi0JCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7DQotCQkJCQkJCX0NCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotDQotCQl9DQotCQlmaW5hbGx5IHsNCi0JCQlpZiAobW9kZWwgIT0gbnVsbCkNCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlDQotCSAqIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlciNnZXRIb3ZlclJlZ2lvbihvcmcuZWNsaXBzZS5qZmFjZS4NCi0JICogdGV4dC5JVGV4dFZpZXdlciwgaW50KQ0KLQkgKi8NCi0JcHVibGljIElSZWdpb24gZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgew0KLQkJcmV0dXJuIEphdmFXb3JkRmluZGVyLmZpbmRXb3JkKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSwgb2Zmc2V0LCB0cnVlKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYjEwNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RlbXBsYXRlcy9FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlNpbXBsZVRlbXBsYXRlVmFyaWFibGVSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLQotCi1wdWJsaWMgY2xhc3MgRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJKU1AgZXh0ZW5kcyBTaW1wbGVUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPRElOR19UWVBFID0gZ2V0RW5jb2RpbmdUeXBlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RW5jb2RpbmdUeXBlKCkgewotCQlyZXR1cm4gImVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZW5jb2RpbmcgdmFyaWFibGUKLQkgKi8KLQlwdWJsaWMgRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJKU1AoKSB7Ci0JCXN1cGVyKEVOQ09ESU5HX1RZUEUsIEpTUFVJTWVzc2FnZXMuQ3JlYXRpbmdfZmlsZXNfZW5jb2RpbmcpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZShUZW1wbGF0ZUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYzc3ZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi0KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTCA9IGdldEFsbCgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFID0gZ2V0QXR0cmlidXRlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVkFMVUUgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXID0gZ2V0TmV3KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBnZXRUYWcoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19UQUcgPSAidGFnX25ldyI7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QWxsKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX2FsbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX2F0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfYXR0cmlidXRlX3ZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXROZXcoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfbmV3IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiAianNwIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUYWcoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfdGFnIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZTE5ZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5HbG9iYWxUZW1wbGF0ZVZhcmlhYmxlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIEpTUCB0ZW1wbGF0ZSBjb250ZXh0IHR5cGVzLiBUZW1wbGF0ZXMgb2YgdGhpcyBjb250ZXh0IHR5cGUKLSAqIGFwcGx5IHRvIGFueSBwbGFjZSB3aXRoaW4gSlNQIGNvbnRlbnQgdHlwZS4KLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVKU1AgZXh0ZW5kcyBUZW1wbGF0ZUNvbnRleHRUeXBlIHsKLQlwdWJsaWMgVGVtcGxhdGVDb250ZXh0VHlwZUpTUCgpIHsKLQkJc3VwZXIoKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkN1cnNvcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRhdGUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Eb2xsYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5MaW5lU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVGltZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlVzZXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Xb3JkU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuWWVhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySlNQKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0pTUERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0pTUERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzYzQxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGV4dC9KU1BEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50ZXh0LkRvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEpTUERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgZXh0ZW5kcyBEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgY2hhcltdIEJSQUNLRVRTID0geyd7JywgJ30nLCAnKCcsICcpJywgJ1snLCAnXScsJyInLCciJywnXCcnLCdcJyd9OwotCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkQ29udGV4dHMKLQkgKiBAcGFyYW0gbmV4dE1hdGNoZXIKLQkgKi8KLQlwdWJsaWMgSlNQRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcigpIHsKLQkJc3VwZXIobmV3IFN0cmluZ1tde0RPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLCBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX1RFWFQsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUUsIERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQsIERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4sIERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NPTlRFTlR9LCBuZXcgSmF2YVBhaXJNYXRjaGVyKEJSQUNLRVRTKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RleHQvSmF2YUNoYXJhY3RlclBhaXJJbnNlcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RleHQvSmF2YUNoYXJhY3RlclBhaXJJbnNlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2U4MjNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0phdmFDaGFyYWN0ZXJQYWlySW5zZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGV4dDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlNQVUlQcmVmZXJlbmNlTmFtZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS50eXBpbmcuQWJzdHJhY3RDaGFyYWN0ZXJQYWlySW5zZXJ0ZXI7DQotDQotcHVibGljIGNsYXNzIEphdmFDaGFyYWN0ZXJQYWlySW5zZXJ0ZXIgZXh0ZW5kcyBBYnN0cmFjdENoYXJhY3RlclBhaXJJbnNlcnRlciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsNCi0NCi0JcHJpdmF0ZSBib29sZWFuIGZDbG9zZUJyYWNrZXRzID0gdHJ1ZTsNCi0JcHJpdmF0ZSBib29sZWFuIGZDbG9zZVN0cmluZ3MgPSB0cnVlOw0KLQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRQYWlyKElTb3VyY2VWaWV3ZXIgdmlld2VyLCBjaGFyIGMpIHsNCi0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHZpZXdlci5nZXREb2N1bWVudCgpOw0KLQkJZmluYWwgUG9pbnQgc2VsZWN0aW9uID0gdmlld2VyLmdldFNlbGVjdGVkUmFuZ2UoKTsNCi0JCWZpbmFsIGludCBvZmZzZXQgPSBzZWxlY3Rpb24ueDsNCi0JCWZpbmFsIGludCBsZW5ndGggPSBzZWxlY3Rpb24ueTsNCi0NCi0JCXRyeSB7DQotCQkJSVJlZ2lvbiBzdGFydExpbmU9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KG9mZnNldCk7DQotCQkJSVJlZ2lvbiBlbmRMaW5lPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChvZmZzZXQgKyBsZW5ndGgpOw0KLQkNCi0JCQlKYXZhSGV1cmlzdGljU2Nhbm5lciBzY2FubmVyID0gbmV3IEphdmFIZXVyaXN0aWNTY2FubmVyKGRvY3VtZW50KTsNCi0JCQlpbnQgbmV4dFRva2VuID0gc2Nhbm5lci5uZXh0VG9rZW4ob2Zmc2V0ICsgbGVuZ3RoLCBlbmRMaW5lLmdldE9mZnNldCgpICsgZW5kTGluZS5nZXRMZW5ndGgoKSk7DQotCQkJU3RyaW5nIG5leHQgPSBuZXh0VG9rZW4gPT0gU3ltYm9scy5Ub2tlbkVPRiA/IG51bGwgOiBkb2N1bWVudC5nZXQob2Zmc2V0LCBzY2FubmVyLmdldFBvc2l0aW9uKCkgLSBvZmZzZXQpLnRyaW0oKTsNCi0JCQlpbnQgcHJldlRva2VuID0gc2Nhbm5lci5wcmV2aW91c1Rva2VuKG9mZnNldCAtIDEsIHN0YXJ0TGluZS5nZXRPZmZzZXQoKSk7DQotCQkJaW50IHByZXZUb2tlbk9mZnNldCA9IHNjYW5uZXIuZ2V0UG9zaXRpb24oKSArIDE7DQotCQkJU3RyaW5nIHByZXZpb3VzID0gcHJldlRva2VuID09IFN5bWJvbHMuVG9rZW5FT0YgPyBudWxsIDogZG9jdW1lbnQuZ2V0KHByZXZUb2tlbk9mZnNldCwgb2Zmc2V0IC0gcHJldlRva2VuT2Zmc2V0KS50cmltKCk7DQotCQkJDQotCQkJc3dpdGNoIChjKSB7DQotCQkJCWNhc2UgJygnOg0KLQkJCQkJaWYgKCFmQ2xvc2VCcmFja2V0cyB8fCBuZXh0VG9rZW4gPT0gU3ltYm9scy5Ub2tlbkxQQVJFTiB8fCBuZXh0VG9rZW4gPT0gU3ltYm9scy5Ub2tlbklERU5UCXx8IG5leHQgIT0gbnVsbCAmJiBuZXh0Lmxlbmd0aCgpID4gMSkNCi0JCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCQlicmVhazsNCi0JDQotCQkJCWNhc2UgJzwnOg0KLQkJCQkJaWYgKCFmQ2xvc2VCcmFja2V0cyB8fCBuZXh0VG9rZW4gPT0gU3ltYm9scy5Ub2tlbkxFU1NUSEFODQotCQkJCQkJCXx8IAkJICAgcHJldlRva2VuICE9IFN5bWJvbHMuVG9rZW5MQlJBQ0UNCi0JCQkJCQkJCQkmJiBwcmV2VG9rZW4gIT0gU3ltYm9scy5Ub2tlblJCUkFDRQ0KLQkJCQkJCQkJCSYmIHByZXZUb2tlbiAhPSBTeW1ib2xzLlRva2VuU0VNSUNPTE9ODQotCQkJCQkJCQkJJiYgcHJldlRva2VuICE9IFN5bWJvbHMuVG9rZW5TWU5DSFJPTklaRUQNCi0JCQkJCQkJCQkmJiBwcmV2VG9rZW4gIT0gU3ltYm9scy5Ub2tlblNUQVRJQw0KLQkJCQkJCQkJCSYmIChwcmV2VG9rZW4gIT0gU3ltYm9scy5Ub2tlbklERU5UIHx8ICFpc0FuZ3VsYXJJbnRyb2R1Y2VyKHByZXZpb3VzKSkNCi0JCQkJCQkJCQkmJiBwcmV2VG9rZW4gIT0gU3ltYm9scy5Ub2tlbkVPRikNCi0JCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCQlicmVhazsNCi0JDQotCQkJCWNhc2UgJ1snOg0KLQkJCQkJaWYgKCFmQ2xvc2VCcmFja2V0cyB8fCBuZXh0VG9rZW4gPT0gU3ltYm9scy5Ub2tlbklERU5UIHx8IG5leHQgIT0gbnVsbCAmJiBuZXh0Lmxlbmd0aCgpID4gMSkNCi0JCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCQlicmVhazsNCi0JDQotCQkJCWNhc2UgJ1wnJzoNCi0JCQkJY2FzZSAnIic6DQotCQkJCQlpZiAoIWZDbG9zZVN0cmluZ3MgfHwgbmV4dFRva2VuID09IFN5bWJvbHMuVG9rZW5JREVOVA0KLQkJCQkJCQl8fCBwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlbklERU5UDQotCQkJCQkJCXx8IHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuU1FVT1RFDQotCQkJCQkJCXx8IG5leHRUb2tlbiA9PSBTeW1ib2xzLlRva2VuU1FVT1RFDQotCQkJCQkJCXx8IHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuRFFVT1RFDQotCQkJCQkJCXx8IG5leHRUb2tlbiA9PSBTeW1ib2xzLlRva2VuRFFVT1RFDQotCQkJCQkJCXx8IG5leHQgIT0gbnVsbCAmJiBuZXh0Lmxlbmd0aCgpID4gMQ0KLQkJCQkJCQl8fCBwcmV2aW91cyAhPSBudWxsICYmIHByZXZpb3VzLmxlbmd0aCgpID4gMSkNCi0JCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCQlicmVhazsNCi0JDQotCQkJCWRlZmF1bHQ6DQotCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCXByaXZhdGUgYm9vbGVhbiBpc0FuZ3VsYXJJbnRyb2R1Y2VyKFN0cmluZyBpZGVudGlmaWVyKSB7DQotCQlyZXR1cm4gaWRlbnRpZmllci5sZW5ndGgoKSA+IDANCi0JCQkJJiYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShpZGVudGlmaWVyLmNoYXJBdCgwKSkNCi0JCQkJCQl8fCBpZGVudGlmaWVyLnN0YXJ0c1dpdGgoImZpbmFsIikgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCXx8IGlkZW50aWZpZXIuc3RhcnRzV2l0aCgicHVibGljIikgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCXx8IGlkZW50aWZpZXIuc3RhcnRzV2l0aCgicHVibGljIikgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCXx8IGlkZW50aWZpZXIuc3RhcnRzV2l0aCgicHJvdGVjdGVkIikgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCXx8IGlkZW50aWZpZXIuc3RhcnRzV2l0aCgicHJpdmF0ZSIpKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotCXByb3RlY3RlZCBjaGFyIGdldFBhaXIoY2hhciBjKSB7DQotCQlzd2l0Y2ggKGMpIHsNCi0JCQljYXNlICdcJyc6DQotCQkJY2FzZSAnIic6DQotCQkJCXJldHVybiBjOw0KLQkJCWNhc2UgJygnOg0KLQkJCQlyZXR1cm4gJyknOw0KLQkJCWNhc2UgJ1snOg0KLQkJCQlyZXR1cm4gJ10nOw0KLQkJCWNhc2UgJzwnOg0KLQkJCQlyZXR1cm4gJz4nOw0KLQkJCWRlZmF1bHQ6DQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgY2hhciBnZXRFc2NhcGVDaGFyKGNoYXIgYykgew0KLQkJc3dpdGNoIChjKSB7DQotCQkJY2FzZSAnXCcnOg0KLQkJCWNhc2UgJyInOg0KLQkJCQlyZXR1cm4gJ1xcJzsNCi0JCQlkZWZhdWx0Og0KLQkJCQlyZXR1cm4gMDsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQYWlyKGNoYXIgYykgew0KLQkJc3dpdGNoIChjKSB7DQotCQkJY2FzZSAnIic6DQotCQkJY2FzZSAnXCcnOg0KLQkJCWNhc2UgJ1snOg0KLQkJCWNhc2UgJygnOg0KLQkJCWNhc2UgJzwnOg0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQlkZWZhdWx0Og0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsNCi0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBKU1BVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KLQkJZkNsb3NlU3RyaW5ncyA9IHN0b3JlLmdldEJvb2xlYW4oSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NMT1NFX1NUUklOR1MpOw0KLQkJZkNsb3NlQnJhY2tldHMgPSBzdG9yZS5nZXRCb29sZWFuKEpTUFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DTE9TRV9CUkFDS0VUUyk7DQotCQlzdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQlKU1BVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgew0KLQkJaWYgKEpTUFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DTE9TRV9CUkFDS0VUUy5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoKSkpDQotCQkJZkNsb3NlQnJhY2tldHMgPSAoKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpOw0KLQkJZWxzZSBpZiAoSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NMT1NFX1NUUklOR1MuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpKQ0KLQkJCWZDbG9zZVN0cmluZ3MgPSAoKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0phdmFDb2RlUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGV4dC9KYXZhQ29kZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjgwMjM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0phdmFDb2RlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZGVyaXZlZC5TaW5nbGVDaGFyUmVhZGVyOwotCi0KLS8qKgotICogUmVhZHMgZnJvbSBhIGRvY3VtZW50IGVpdGhlciBmb3J3YXJkcyBvciBiYWNrd2FyZHMuIE1heSBiZSBjb25maWd1cmVkIHRvCi0gKiBza2lwIGNvbW1lbnRzIGFuZCBzdHJpbmdzLgotICogCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dCBzbyB3ZSBkb24ndCBoYXZlIHRvCi0gKiBkZXBlbmQgb24gdGhlIG9yZy5lY2xpcHNlLmpkdC51aSBwbHVnaW4uCi0gKiAKLSAqIE5vIG1vZGlmaWNhdGlvbnMgd2VyZSBtYWRlLgotICovCi1jbGFzcyBKYXZhQ29kZVJlYWRlciBleHRlbmRzIFNpbmdsZUNoYXJSZWFkZXIgewotCi0JLyoqIFRoZSBFT0YgY2hhcmFjdGVyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GID0gLTE7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlNraXBDb21tZW50cyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmU2tpcFN0cmluZ3MgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkZvcndhcmQgPSBmYWxzZTsKLQotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIGludCBmT2Zmc2V0OwotCi0JcHJpdmF0ZSBpbnQgZkVuZCA9IC0xOwotCXByaXZhdGUgaW50IGZDYWNoZWRMaW5lTnVtYmVyID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZkNhY2hlZExpbmVPZmZzZXQgPSAtMTsKLQotCi0JcHVibGljIEphdmFDb2RlUmVhZGVyKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgbGFzdCByZWFkIGNoYXJhY3Rlci4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIHJlYWQgaGFzIGJlZW4gY2FsbGVkLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gZkZvcndhcmQgPyBmT2Zmc2V0IC0gMSA6IGZPZmZzZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgY29uZmlndXJlRm9yd2FyZFJlYWRlcihJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gc2tpcENvbW1lbnRzLCBib29sZWFuIHNraXBTdHJpbmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQkJZlNraXBDb21tZW50cyA9IHNraXBDb21tZW50czsKLQkJZlNraXBTdHJpbmdzID0gc2tpcFN0cmluZ3M7Ci0KLQkJZkZvcndhcmQgPSB0cnVlOwotCQlmRW5kID0gTWF0aC5taW4oZkRvY3VtZW50LmdldExlbmd0aCgpLCBmT2Zmc2V0ICsgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVCYWNrd2FyZFJlYWRlcihJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGJvb2xlYW4gc2tpcENvbW1lbnRzLCBib29sZWFuIHNraXBTdHJpbmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQkJZlNraXBDb21tZW50cyA9IHNraXBDb21tZW50czsKLQkJZlNraXBTdHJpbmdzID0gc2tpcFN0cmluZ3M7Ci0KLQkJZkZvcndhcmQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWZDYWNoZWRMaW5lTnVtYmVyID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKHguZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBSZWFkZXIjY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZkRvY3VtZW50ID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgU2luZ2xlQ2hhclJlYWRlciNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGZGb3J3YXJkID8gcmVhZEZvcndhcmRzKCkgOiByZWFkQmFja3dhcmRzKCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbih4LmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ290b0NvbW1lbnRFbmQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoZk9mZnNldCA8IGZFbmQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQrKyk7Ci0JCQlpZiAoY3VycmVudCA9PSAnKicpIHsKLQkJCQlpZiAoZk9mZnNldCA8IGZFbmQgJiYgZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCkgPT0gJy8nKSB7Ci0JCQkJCSsrZk9mZnNldDsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnb3RvU3RyaW5nRW5kKGNoYXIgZGVsaW1pdGVyKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoZk9mZnNldCA8IGZFbmQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQrKyk7Ci0JCQlpZiAoY3VycmVudCA9PSAnXFwnKSB7Ci0JCQkJLy8gaWdub3JlIGVzY2FwZWQgY2hhcmFjdGVycwotCQkJCSsrZk9mZnNldDsKLQkJCX0KLQkJCWVsc2UgaWYgKGN1cnJlbnQgPT0gZGVsaW1pdGVyKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdvdG9MaW5lRW5kKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJaW50IGxpbmUgPSBmRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGZPZmZzZXQpOwotCQlmT2Zmc2V0ID0gZkRvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSArIDEpOwotCX0KLQotCXByaXZhdGUgaW50IHJlYWRGb3J3YXJkcygpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChmT2Zmc2V0IDwgZkVuZCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCsrKTsKLQotCQkJc3dpdGNoIChjdXJyZW50KSB7Ci0JCQkJY2FzZSAnLycgOgotCi0JCQkJCWlmIChmU2tpcENvbW1lbnRzICYmIGZPZmZzZXQgPCBmRW5kKSB7Ci0JCQkJCQljaGFyIG5leHQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KTsKLQkJCQkJCWlmIChuZXh0ID09ICcqJykgewotCQkJCQkJCS8vIGEgY29tbWVudCBzdGFydHMsIGFkdmFuY2UgdG8gdGhlIGNvbW1lbnQgZW5kCi0JCQkJCQkJKytmT2Zmc2V0OwotCQkJCQkJCWdvdG9Db21tZW50RW5kKCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChuZXh0ID09ICcvJykgewotCQkJCQkJCS8vICcvLyctY29tbWVudCBzdGFydHMsIGFkdmFuY2UgdG8gdGhlIGxpbmUgZW5kCi0JCQkJCQkJZ290b0xpbmVFbmQoKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXJldHVybiBjdXJyZW50OwotCi0JCQkJY2FzZSAnIicgOgotCQkJCWNhc2UgJ1wnJyA6Ci0KLQkJCQkJaWYgKGZTa2lwU3RyaW5ncykgewotCQkJCQkJZ290b1N0cmluZ0VuZChjdXJyZW50KTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCQl9Ci0KLQkJCXJldHVybiBjdXJyZW50OwotCQl9Ci0KLQkJcmV0dXJuIEVPRjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2luZ2xlTGluZUNvbW1lbnQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlpbnQgbGluZSA9IGZEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZk9mZnNldCk7Ci0JCWlmIChsaW5lIDwgZkNhY2hlZExpbmVOdW1iZXIpIHsKLQkJCWZDYWNoZWRMaW5lTnVtYmVyID0gbGluZTsKLQkJCWZDYWNoZWRMaW5lT2Zmc2V0ID0gZkRvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSk7Ci0JCQlpbnQgb2Zmc2V0ID0gZk9mZnNldDsKLQkJCXdoaWxlIChmQ2FjaGVkTGluZU9mZnNldCA8IG9mZnNldCkgewotCQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKG9mZnNldC0tKTsKLQkJCQlpZiAoY3VycmVudCA9PSAnLycgJiYgZkNhY2hlZExpbmVPZmZzZXQgPD0gb2Zmc2V0ICYmIGZEb2N1bWVudC5nZXRDaGFyKG9mZnNldCkgPT0gJy8nKSB7Ci0JCQkJCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ290b0NvbW1lbnRTdGFydCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlICgwIDwgZk9mZnNldCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldC0tKTsKLQkJCWlmIChjdXJyZW50ID09ICcqJyAmJiAwIDw9IGZPZmZzZXQgJiYgZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCkgPT0gJy8nKQotCQkJCXJldHVybjsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnb3RvU3RyaW5nU3RhcnQoY2hhciBkZWxpbWl0ZXIpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlICgwIDwgZk9mZnNldCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCk7Ci0JCQlpZiAoY3VycmVudCA9PSBkZWxpbWl0ZXIpIHsKLQkJCQlpZiAoISgwIDw9IGZPZmZzZXQgJiYgZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCAtIDEpID09ICdcXCcpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQktLWZPZmZzZXQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCByZWFkQmFja3dhcmRzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQotCQl3aGlsZSAoMCA8IGZPZmZzZXQpIHsKLQkJCS0tZk9mZnNldDsKLQotCQkJaGFuZGxlU2luZ2xlTGluZUNvbW1lbnQoKTsKLQotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCk7Ci0JCQlzd2l0Y2ggKGN1cnJlbnQpIHsKLQkJCQljYXNlICcvJyA6Ci0KLQkJCQkJaWYgKGZTa2lwQ29tbWVudHMgJiYgZk9mZnNldCA+IDEpIHsKLQkJCQkJCWNoYXIgbmV4dCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQgLSAxKTsKLQkJCQkJCWlmIChuZXh0ID09ICcqJykgewotCQkJCQkJCS8vIGEgY29tbWVudCBlbmRzLCBhZHZhbmNlIHRvIHRoZSBjb21tZW50IHN0YXJ0Ci0JCQkJCQkJZk9mZnNldCAtPSAyOwotCQkJCQkJCWdvdG9Db21tZW50U3RhcnQoKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXJldHVybiBjdXJyZW50OwotCi0JCQkJY2FzZSAnIicgOgotCQkJCWNhc2UgJ1wnJyA6Ci0KLQkJCQkJaWYgKGZTa2lwU3RyaW5ncykgewotCQkJCQkJLS1mT2Zmc2V0OwotCQkJCQkJZ290b1N0cmluZ1N0YXJ0KGN1cnJlbnQpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gY3VycmVudDsKLQkJCX0KLQotCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCX0KLQotCQlyZXR1cm4gRU9GOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0phdmFIZXVyaXN0aWNTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGV4dC9KYXZhSGV1cmlzdGljU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTEzYzM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0phdmFIZXVyaXN0aWNTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRleHQ7DQotDQotLy90YWtlbiBmcm9tIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQ7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlR5cGVkUmVnaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7DQotDQotY2xhc3MgSmF2YUhldXJpc3RpY1NjYW5uZXIgaW1wbGVtZW50cyBTeW1ib2xzIHsNCi0JLyoqDQotCSAqIFJldHVybmVkIGJ5IGFsbCBtZXRob2RzIHdoZW4gdGhlIHJlcXVlc3RlZCBwb3NpdGlvbiBjb3VsZCBub3QgYmUgZm91bmQsIG9yIGlmIGENCi0JICoge0BsaW5rIEJhZExvY2F0aW9uRXhjZXB0aW9ufSB3YXMgdGhyb3duIHdoaWxlIHNjYW5uaW5nLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0ZPVU5EPSAtMTsNCi0NCi0JLyoqDQotCSAqIFNwZWNpYWwgYm91bmQgcGFyYW1ldGVyIHRoYXQgbWVhbnMgZWl0aGVyIC0xIChiYWNrd2FyZCBzY2FubmluZykgb3INCi0JICogPGNvZGU+ZkRvY3VtZW50LmdldExlbmd0aCgpPC9jb2RlPiAoZm9yd2FyZCBzY2FubmluZykuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkJPVU5EPSAtMjsNCi0NCi0NCi0JLyogY2hhcmFjdGVyIGNvbnN0YW50cyAqLw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIExCUkFDRT0gJ3snOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFJCUkFDRT0gJ30nOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIExQQVJFTj0gJygnOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFJQQVJFTj0gJyknOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNFTUlDT0xPTj0gJzsnOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIENPTE9OPSAnOic7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQ09NTUE9ICcsJzsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBMQlJBQ0tFVD0gJ1snOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFJCUkFDS0VUPSAnXSc7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUVVFU1RJT05NQVJLPSAnPyc7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRVFVQUw9ICc9JzsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBMQU5HTEU9ICc8JzsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBSQU5HTEU9ICc+JzsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTUVVPVEUgPSAnXCcnOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIERRVU9URSA9ICciJzsNCi0NCi0JLyoqDQotCSAqIFNwZWNpZmllcyB0aGUgc3RvcCBjb25kaXRpb24sIHVwb24gd2hpY2ggdGhlIDxjb2RlPnNjYW5YWFg8L2NvZGU+IG1ldGhvZHMgd2lsbCBkZWNpZGUgd2hldGhlcg0KLQkgKiB0byBrZWVwIHNjYW5uaW5nIG9yIG5vdC4gVGhpcyBpbnRlcmZhY2UgbWF5IGltcGxlbWVudGVkIGJ5IGNsaWVudHMuDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdG9wQ29uZGl0aW9uIHsNCi0JCS8qKg0KLQkJICogSW5zdHJ1Y3RzIHRoZSBzY2FubmVyIHRvIHJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbi4NCi0JCSAqDQotCQkgKiBAcGFyYW0gY2ggdGhlIGNoYXIgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24NCi0JCSAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgY3VycmVudCBwb3NpdGlvbg0KLQkJICogQHBhcmFtIGZvcndhcmQgdGhlIGl0ZXJhdGlvbiBkaXJlY3Rpb24NCi0JCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN0b3AgY29uZGl0aW9uIGlzIG1ldC4NCi0JCSAqLw0KLQkJcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3RvcChjaGFyIGNoLCBpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCk7DQotDQotCQkvKioNCi0JCSAqIEFza3MgdGhlIGNvbmRpdGlvbiB0byByZXR1cm4gdGhlIG5leHQgcG9zaXRpb24gdG8gcXVlcnkuIFRoZSBkZWZhdWx0DQotCQkgKiBpcyB0byByZXR1cm4gdGhlIG5leHQvcHJldmlvdXMgcG9zaXRpb24uDQotCQkgKiANCi0JCSAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgcG9zaXRpb24gDQotCQkgKiBAcGFyYW0gZm9yd2FyZCA8Y29kZT50cnVlPC9jb2RlPiBpZiBuZXh0IHBvc2l0aW9uIHNob3VsZCBiZSByZXR1cm5lZA0KLQkJICogQHJldHVybiB0aGUgbmV4dCBwb3NpdGlvbiB0byBzY2FuDQotCQkgKi8NCi0JCXB1YmxpYyBpbnQgbmV4dFBvc2l0aW9uKGludCBwb3NpdGlvbiwgYm9vbGVhbiBmb3J3YXJkKSB7DQotCQkJcmV0dXJuIGZvcndhcmQgPyBwb3NpdGlvbiArIDEgOiBwb3NpdGlvbiAtIDE7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFN0b3BzIHVwb24gYSBub24td2hpdGVzcGFjZSAoYXMgZGVmaW5lZCBieSB7QGxpbmsgQ2hhcmFjdGVyI2lzV2hpdGVzcGFjZShjaGFyKX0pIGNoYXJhY3Rlci4NCi0JICovDQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5vbldoaXRlc3BhY2UgZXh0ZW5kcyBTdG9wQ29uZGl0aW9uIHsNCi0JCS8qDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkphdmFIZXVyaXN0aWNTY2FubmVyLlN0b3BDb25kaXRpb24jc3RvcChjaGFyKQ0KLQkJICovDQotCQlwdWJsaWMgYm9vbGVhbiBzdG9wKGNoYXIgY2gsIGludCBwb3NpdGlvbiwgYm9vbGVhbiBmb3J3YXJkKSB7DQotCQkJcmV0dXJuICFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogU3RvcHMgdXBvbiBhIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uDQotCSAqDQotCSAqIEBzZWUgSmF2YUhldXJpc3RpY1NjYW5uZXIuTm9uV2hpdGVzcGFjZQ0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBOb25XaGl0ZXNwYWNlRGVmYXVsdFBhcnRpdGlvbiBleHRlbmRzIE5vbldoaXRlc3BhY2Ugew0KLQkJLyoNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSmF2YUhldXJpc3RpY1NjYW5uZXIuU3RvcENvbmRpdGlvbiNzdG9wKGNoYXIpDQotCQkgKi8NCi0JCXB1YmxpYyBib29sZWFuIHN0b3AoY2hhciBjaCwgaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsNCi0JCQlyZXR1cm4gc3VwZXIuc3RvcChjaCwgcG9zaXRpb24sIHRydWUpICYmIGlzRGVmYXVsdFBhcnRpdGlvbihwb3NpdGlvbik7DQotCQl9DQotDQotCQkvKg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhSGV1cmlzdGljU2Nhbm5lci5TdG9wQ29uZGl0aW9uI25leHRQb3NpdGlvbihpbnQsIGJvb2xlYW4pDQotCQkgKi8NCi0JCXB1YmxpYyBpbnQgbmV4dFBvc2l0aW9uKGludCBwb3NpdGlvbiwgYm9vbGVhbiBmb3J3YXJkKSB7DQotCQkJSVR5cGVkUmVnaW9uIHBhcnRpdGlvbj0gZ2V0UGFydGl0aW9uKHBvc2l0aW9uKTsNCi0JCQlpZiAoZlBhcnRpdGlvbi5lcXVhbHMocGFydGl0aW9uLmdldFR5cGUoKSkpDQotCQkJCXJldHVybiBzdXBlci5uZXh0UG9zaXRpb24ocG9zaXRpb24sIGZvcndhcmQpOw0KLQ0KLQkJCWlmIChmb3J3YXJkKSB7DQotCQkJCWludCBlbmQ9IHBhcnRpdGlvbi5nZXRPZmZzZXQoKSArIHBhcnRpdGlvbi5nZXRMZW5ndGgoKTsNCi0JCQkJaWYgKHBvc2l0aW9uIDwgZW5kKQ0KLQkJCQkJcmV0dXJuIGVuZDsNCi0JCQl9IGVsc2Ugew0KLQkJCQlpbnQgb2Zmc2V0PSBwYXJ0aXRpb24uZ2V0T2Zmc2V0KCk7DQotCQkJCWlmIChwb3NpdGlvbiA+IG9mZnNldCkNCi0JCQkJCXJldHVybiBvZmZzZXQgLSAxOw0KLQkJCX0NCi0JCQlyZXR1cm4gc3VwZXIubmV4dFBvc2l0aW9uKHBvc2l0aW9uLCBmb3J3YXJkKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogU3RvcHMgdXBvbiBhIG5vbi1qYXZhIGlkZW50aWZpZXIgKGFzIGRlZmluZWQgYnkge0BsaW5rIENoYXJhY3RlciNpc0phdmFJZGVudGlmaWVyUGFydChjaGFyKX0pIGNoYXJhY3Rlci4NCi0JICovDQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5vbkphdmFJZGVudGlmaWVyUGFydCBleHRlbmRzIFN0b3BDb25kaXRpb24gew0KLQkJLyoNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSmF2YUhldXJpc3RpY1NjYW5uZXIuU3RvcENvbmRpdGlvbiNzdG9wKGNoYXIpDQotCQkgKi8NCi0JCXB1YmxpYyBib29sZWFuIHN0b3AoY2hhciBjaCwgaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsNCi0JCQlyZXR1cm4gIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjaCk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFN0b3BzIHVwb24gYSBub24tamF2YSBpZGVudGlmaWVyIGNoYXJhY3RlciBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uDQotCSAqDQotCSAqIEBzZWUgSmF2YUhldXJpc3RpY1NjYW5uZXIuTm9uSmF2YUlkZW50aWZpZXJQYXJ0DQotCSAqLw0KLQlwcml2YXRlIGZpbmFsIGNsYXNzIE5vbkphdmFJZGVudGlmaWVyUGFydERlZmF1bHRQYXJ0aXRpb24gZXh0ZW5kcyBOb25KYXZhSWRlbnRpZmllclBhcnQgew0KLQkJLyoNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSmF2YUhldXJpc3RpY1NjYW5uZXIuU3RvcENvbmRpdGlvbiNzdG9wKGNoYXIpDQotCQkgKi8NCi0JCXB1YmxpYyBib29sZWFuIHN0b3AoY2hhciBjaCwgaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsNCi0JCQlyZXR1cm4gc3VwZXIuc3RvcChjaCwgcG9zaXRpb24sIHRydWUpIHx8ICFpc0RlZmF1bHRQYXJ0aXRpb24ocG9zaXRpb24pOw0KLQkJfQ0KLQ0KLQkJLyoNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSmF2YUhldXJpc3RpY1NjYW5uZXIuU3RvcENvbmRpdGlvbiNuZXh0UG9zaXRpb24oaW50LCBib29sZWFuKQ0KLQkJICovDQotCQlwdWJsaWMgaW50IG5leHRQb3NpdGlvbihpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCkgew0KLQkJCUlUeXBlZFJlZ2lvbiBwYXJ0aXRpb249IGdldFBhcnRpdGlvbihwb3NpdGlvbik7DQotCQkJaWYgKGZQYXJ0aXRpb24uZXF1YWxzKHBhcnRpdGlvbi5nZXRUeXBlKCkpKQ0KLQkJCQlyZXR1cm4gc3VwZXIubmV4dFBvc2l0aW9uKHBvc2l0aW9uLCBmb3J3YXJkKTsNCi0NCi0JCQlpZiAoZm9yd2FyZCkgew0KLQkJCQlpbnQgZW5kPSBwYXJ0aXRpb24uZ2V0T2Zmc2V0KCkgKyBwYXJ0aXRpb24uZ2V0TGVuZ3RoKCk7DQotCQkJCWlmIChwb3NpdGlvbiA8IGVuZCkNCi0JCQkJCXJldHVybiBlbmQ7DQotCQkJfSBlbHNlIHsNCi0JCQkJaW50IG9mZnNldD0gcGFydGl0aW9uLmdldE9mZnNldCgpOw0KLQkJCQlpZiAocG9zaXRpb24gPiBvZmZzZXQpDQotCQkJCQlyZXR1cm4gb2Zmc2V0IC0gMTsNCi0JCQl9DQotCQkJcmV0dXJuIHN1cGVyLm5leHRQb3NpdGlvbihwb3NpdGlvbiwgZm9yd2FyZCk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFN0b3BzIHVwb24gYSBjaGFyYWN0ZXIgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGxpc3QuDQotCSAqLw0KLQlwcml2YXRlIGZpbmFsIGNsYXNzIENoYXJhY3Rlck1hdGNoIGV4dGVuZHMgU3RvcENvbmRpdGlvbiB7DQotCQlwcml2YXRlIGZpbmFsIGNoYXJbXSBmQ2hhcnM7DQotDQotCQkvKioNCi0JCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuDQotCQkgKiBAcGFyYW0gY2ggdGhlIHNpbmdsZSBjaGFyYWN0ZXIgdG8gbWF0Y2gNCi0JCSAqLw0KLQkJcHVibGljIENoYXJhY3Rlck1hdGNoKGNoYXIgY2gpIHsNCi0JCQl0aGlzKG5ldyBjaGFyW10ge2NofSk7DQotCQl9DQotDQotCQkvKioNCi0JCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuDQotCQkgKiBAcGFyYW0gY2hhcnMgdGhlIGNoYXJzIHRvIG1hdGNoLg0KLQkJICovDQotCQlwdWJsaWMgQ2hhcmFjdGVyTWF0Y2goY2hhcltdIGNoYXJzKSB7DQotCQkJQXNzZXJ0LmlzTm90TnVsbChjaGFycyk7DQotCQkJQXNzZXJ0LmlzVHJ1ZShjaGFycy5sZW5ndGggPiAwKTsNCi0JCQlmQ2hhcnM9IGNoYXJzOw0KLQkJCUFycmF5cy5zb3J0KGNoYXJzKTsNCi0JCX0NCi0NCi0JCS8qDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkphdmFIZXVyaXN0aWNTY2FubmVyLlN0b3BDb25kaXRpb24jc3RvcChjaGFyLCBpbnQpDQotCQkgKi8NCi0JCXB1YmxpYyBib29sZWFuIHN0b3AoY2hhciBjaCwgaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsNCi0JCQlyZXR1cm4gQXJyYXlzLmJpbmFyeVNlYXJjaChmQ2hhcnMsIGNoKSA+PSAwICYmIGlzRGVmYXVsdFBhcnRpdGlvbihwb3NpdGlvbik7DQotCQl9DQotDQotCQkvKg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhSGV1cmlzdGljU2Nhbm5lci5TdG9wQ29uZGl0aW9uI25leHRQb3NpdGlvbihpbnQsIGJvb2xlYW4pDQotCQkgKi8NCi0JCXB1YmxpYyBpbnQgbmV4dFBvc2l0aW9uKGludCBwb3NpdGlvbiwgYm9vbGVhbiBmb3J3YXJkKSB7DQotCQkJSVR5cGVkUmVnaW9uIHBhcnRpdGlvbj0gZ2V0UGFydGl0aW9uKHBvc2l0aW9uKTsNCi0JCQlpZiAoZlBhcnRpdGlvbi5lcXVhbHMocGFydGl0aW9uLmdldFR5cGUoKSkpDQotCQkJCXJldHVybiBzdXBlci5uZXh0UG9zaXRpb24ocG9zaXRpb24sIGZvcndhcmQpOw0KLQ0KLQkJCWlmIChmb3J3YXJkKSB7DQotCQkJCWludCBlbmQ9IHBhcnRpdGlvbi5nZXRPZmZzZXQoKSArIHBhcnRpdGlvbi5nZXRMZW5ndGgoKTsNCi0JCQkJaWYgKHBvc2l0aW9uIDwgZW5kKQ0KLQkJCQkJcmV0dXJuIGVuZDsNCi0JCQl9IGVsc2Ugew0KLQkJCQlpbnQgb2Zmc2V0PSBwYXJ0aXRpb24uZ2V0T2Zmc2V0KCk7DQotCQkJCWlmIChwb3NpdGlvbiA+IG9mZnNldCkNCi0JCQkJCXJldHVybiBvZmZzZXQgLSAxOw0KLQkJCX0NCi0JCQlyZXR1cm4gc3VwZXIubmV4dFBvc2l0aW9uKHBvc2l0aW9uLCBmb3J3YXJkKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKiogVGhlIGRvY3VtZW50IGJlaW5nIHNjYW5uZWQuICovDQotCXByaXZhdGUgZmluYWwgSURvY3VtZW50IGZEb2N1bWVudDsNCi0JLyoqIFRoZSBwYXJ0aXRpb25pbmcgYmVpbmcgdXNlZCBmb3Igc2Nhbm5pbmcuICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGZQYXJ0aXRpb25pbmc7DQotCS8qKiBUaGUgcGFydGl0aW9uIHRvIHNjYW4gaW4uICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGZQYXJ0aXRpb247DQotDQotCS8qIGludGVybmFsIHNjYW4gc3RhdGUgKi8NCi0NCi0JLyoqIHRoZSBtb3N0IHJlY2VudGx5IHJlYWQgY2hhcmFjdGVyLiAqLw0KLQlwcml2YXRlIGNoYXIgZkNoYXI7DQotCS8qKiB0aGUgbW9zdCByZWNlbnRseSByZWFkIHBvc2l0aW9uLiAqLw0KLQlwcml2YXRlIGludCBmUG9zOw0KLQkvKioNCi0JICogVGhlIG1vc3QgcmVjZW50bHkgdXNlZCBwYXJ0aXRpb24uDQotCSAqIEBzaW5jZSAzLjINCi0JICovDQotCXByaXZhdGUgSVR5cGVkUmVnaW9uIGZDYWNoZWRQYXJ0aXRpb249IG5ldyBUeXBlZFJlZ2lvbigtMSwgMCwgIl9fbm9fcGFydGl0aW9uX2F0X2FsbCIpOyAvLyROT04tTkxTLTEkDQotDQotCS8qIHByZXNldCBzdG9wIGNvbmRpdGlvbnMgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdG9wQ29uZGl0aW9uIGZOb25XU0RlZmF1bHRQYXJ0PSBuZXcgTm9uV2hpdGVzcGFjZURlZmF1bHRQYXJ0aXRpb24oKTsNCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RvcENvbmRpdGlvbiBmTm9uV1M9IG5ldyBOb25XaGl0ZXNwYWNlKCk7DQotCXByaXZhdGUgZmluYWwgU3RvcENvbmRpdGlvbiBmTm9uSWRlbnQ9IG5ldyBOb25KYXZhSWRlbnRpZmllclBhcnREZWZhdWx0UGFydGl0aW9uKCk7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLg0KLQkgKg0KLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IHRvIHNjYW4NCi0JICogQHBhcmFtIHBhcnRpdGlvbmluZyB0aGUgcGFydGl0aW9uaW5nIHRvIHVzZSBmb3Igc2Nhbm5pbmcNCi0JICogQHBhcmFtIHBhcnRpdGlvbiB0aGUgcGFydGl0aW9uIHRvIHNjYW4gaW4NCi0JICovDQotCXB1YmxpYyBKYXZhSGV1cmlzdGljU2Nhbm5lcihJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwYXJ0aXRpb25pbmcsIFN0cmluZyBwYXJ0aXRpb24pIHsNCi0JCUFzc2VydC5pc0xlZ2FsKGRvY3VtZW50ICE9IG51bGwpOw0KLQkJQXNzZXJ0LmlzTGVnYWwocGFydGl0aW9uaW5nICE9IG51bGwpOw0KLQkJQXNzZXJ0LmlzTGVnYWwocGFydGl0aW9uICE9IG51bGwpOw0KLQkJZkRvY3VtZW50PSBkb2N1bWVudDsNCi0JCWZQYXJ0aXRpb25pbmc9IHBhcnRpdGlvbmluZzsNCi0JCWZQYXJ0aXRpb249IHBhcnRpdGlvbjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2FsbHMgPGNvZGU+dGhpcyhkb2N1bWVudCwgSUphdmFQYXJ0aXRpb25zLkpBVkFfUEFSVElUSU9OSU5HLCBJRG9jdW1lbnQuREVGQVVMVF9DT05URU5UX1RZUEUpPC9jb2RlPi4NCi0JICoNCi0JICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudCB0byBzY2FuLg0KLQkgKi8NCi0JcHVibGljIEphdmFIZXVyaXN0aWNTY2FubmVyKElEb2N1bWVudCBkb2N1bWVudCkgew0KLQkJdGhpcyhkb2N1bWVudCwgSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORywgSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1vc3QgcmVjZW50IGludGVybmFsIHNjYW4gcG9zaXRpb24uDQotCSAqDQotCSAqIEByZXR1cm4gdGhlIG1vc3QgcmVjZW50IGludGVybmFsIHNjYW4gcG9zaXRpb24uDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldFBvc2l0aW9uKCkgew0KLQkJcmV0dXJuIGZQb3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG5leHQgdG9rZW4gaW4gZm9yd2FyZCBkaXJlY3Rpb24sIHN0YXJ0aW5nIGF0IDxjb2RlPnN0YXJ0PC9jb2RlPiwgYW5kIG5vdCBleHRlbmRpbmcNCi0JICogZnVydGhlciB0aGFuIDxjb2RlPmJvdW5kPC9jb2RlPi4gVGhlIHJldHVybiB2YWx1ZSBpcyBvbmUgb2YgdGhlIGNvbnN0YW50cyBkZWZpbmVkIGluIHtAbGluayBTeW1ib2xzfS4NCi0JICogQWZ0ZXIgYSBjYWxsLCB7QGxpbmsgI2dldFBvc2l0aW9uKCl9IHdpbGwgcmV0dXJuIHRoZSBwb3NpdGlvbiBqdXN0IGFmdGVyIHRoZSBzY2FubmVkIHRva2VuDQotCSAqIChpLmUuIHRoZSBuZXh0IHBvc2l0aW9uIHRoYXQgd2lsbCBiZSBzY2FubmVkKS4NCi0JICoNCi0JICogQHBhcmFtIHN0YXJ0IHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50IHRvIGNvbnNpZGVyDQotCSAqIEBwYXJhbSBib3VuZCB0aGUgZmlyc3QgcG9zaXRpb24gbm90IHRvIGNvbnNpZGVyIGFueSBtb3JlDQotCSAqIEByZXR1cm4gYSBjb25zdGFudCBmcm9tIHtAbGluayBTeW1ib2xzfSBkZXNjcmliaW5nIHRoZSBuZXh0IHRva2VuDQotCSAqLw0KLQlwdWJsaWMgaW50IG5leHRUb2tlbihpbnQgc3RhcnQsIGludCBib3VuZCkgew0KLQkJaW50IHBvcz0gc2NhbkZvcndhcmQoc3RhcnQsIGJvdW5kLCBmTm9uV1NEZWZhdWx0UGFydCk7DQotCQlpZiAocG9zID09IE5PVF9GT1VORCkNCi0JCQlyZXR1cm4gVG9rZW5FT0Y7DQotDQotCQlmUG9zKys7DQotDQotCQlzd2l0Y2ggKGZDaGFyKSB7DQotCQkJY2FzZSBMQlJBQ0U6DQotCQkJCXJldHVybiBUb2tlbkxCUkFDRTsNCi0JCQljYXNlIFJCUkFDRToNCi0JCQkJcmV0dXJuIFRva2VuUkJSQUNFOw0KLQkJCWNhc2UgTEJSQUNLRVQ6DQotCQkJCXJldHVybiBUb2tlbkxCUkFDS0VUOw0KLQkJCWNhc2UgUkJSQUNLRVQ6DQotCQkJCXJldHVybiBUb2tlblJCUkFDS0VUOw0KLQkJCWNhc2UgTFBBUkVOOg0KLQkJCQlyZXR1cm4gVG9rZW5MUEFSRU47DQotCQkJY2FzZSBSUEFSRU46DQotCQkJCXJldHVybiBUb2tlblJQQVJFTjsNCi0JCQljYXNlIFNFTUlDT0xPTjoNCi0JCQkJcmV0dXJuIFRva2VuU0VNSUNPTE9OOw0KLQkJCWNhc2UgQ09NTUE6DQotCQkJCXJldHVybiBUb2tlbkNPTU1BOw0KLQkJCWNhc2UgUVVFU1RJT05NQVJLOg0KLQkJCQlyZXR1cm4gVG9rZW5RVUVTVElPTk1BUks7DQotCQkJY2FzZSBFUVVBTDoNCi0JCQkJcmV0dXJuIFRva2VuRVFVQUw7DQotCQkJY2FzZSBMQU5HTEU6DQotCQkJCXJldHVybiBUb2tlbkxFU1NUSEFOOw0KLQkJCWNhc2UgUkFOR0xFOg0KLQkJCQlyZXR1cm4gVG9rZW5HUkVBVEVSVEhBTjsNCi0JCQljYXNlIFNRVU9URToNCi0JCQkJcmV0dXJuIFRva2VuU1FVT1RFOw0KLQkJCWNhc2UgRFFVT1RFOg0KLQkJCQlyZXR1cm4gVG9rZW5EUVVPVEU7DQotCQl9DQotDQotCQkvLyBlbHNlDQotCQlpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGZDaGFyKSkgew0KLQkJCS8vIGFzc3VtZSBhbiBpZGVudGlmaWVyIG9yIGtleXdvcmQNCi0JCQlpbnQgZnJvbT0gcG9zLCB0bzsNCi0JCQlwb3M9IHNjYW5Gb3J3YXJkKHBvcyArIDEsIGJvdW5kLCBmTm9uSWRlbnQpOw0KLQkJCWlmIChwb3MgPT0gTk9UX0ZPVU5EKQ0KLQkJCQl0bz0gYm91bmQgPT0gVU5CT1VORCA/IGZEb2N1bWVudC5nZXRMZW5ndGgoKSA6IGJvdW5kOw0KLQkJCWVsc2UNCi0JCQkJdG89IHBvczsNCi0NCi0JCQlTdHJpbmcgaWRlbnRPcktleXdvcmQ7DQotCQkJdHJ5IHsNCi0JCQkJaWRlbnRPcktleXdvcmQ9IGZEb2N1bWVudC5nZXQoZnJvbSwgdG8gLSBmcm9tKTsNCi0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7DQotCQkJCXJldHVybiBUb2tlbkVPRjsNCi0JCQl9DQotDQotCQkJcmV0dXJuIGdldFRva2VuKGlkZW50T3JLZXl3b3JkKTsNCi0NCi0NCi0JCX0gZWxzZSB7DQotCQkJLy8gb3BlcmF0b3JzLCBudW1iZXIgbGl0ZXJhbHMgZXRjDQotCQkJcmV0dXJuIFRva2VuT1RIRVI7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG5leHQgdG9rZW4gaW4gYmFja3dhcmQgZGlyZWN0aW9uLCBzdGFydGluZyBhdCA8Y29kZT5zdGFydDwvY29kZT4sIGFuZCBub3QgZXh0ZW5kaW5nDQotCSAqIGZ1cnRoZXIgdGhhbiA8Y29kZT5ib3VuZDwvY29kZT4uIFRoZSByZXR1cm4gdmFsdWUgaXMgb25lIG9mIHRoZSBjb25zdGFudHMgZGVmaW5lZCBpbiB7QGxpbmsgU3ltYm9sc30uDQotCSAqIEFmdGVyIGEgY2FsbCwge0BsaW5rICNnZXRQb3NpdGlvbigpfSB3aWxsIHJldHVybiB0aGUgcG9zaXRpb24ganVzdCBiZWZvcmUgdGhlIHNjYW5uZWQgdG9rZW4NCi0JICogc3RhcnRzIChpLmUuIHRoZSBuZXh0IHBvc2l0aW9uIHRoYXQgd2lsbCBiZSBzY2FubmVkKS4NCi0JICoNCi0JICogQHBhcmFtIHN0YXJ0IHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50IHRvIGNvbnNpZGVyDQotCSAqIEBwYXJhbSBib3VuZCB0aGUgZmlyc3QgcG9zaXRpb24gbm90IHRvIGNvbnNpZGVyIGFueSBtb3JlDQotCSAqIEByZXR1cm4gYSBjb25zdGFudCBmcm9tIHtAbGluayBTeW1ib2xzfSBkZXNjcmliaW5nIHRoZSBwcmV2aW91cyB0b2tlbg0KLQkgKi8NCi0JcHVibGljIGludCBwcmV2aW91c1Rva2VuKGludCBzdGFydCwgaW50IGJvdW5kKSB7DQotCQlpbnQgcG9zPSBzY2FuQmFja3dhcmQoc3RhcnQsIGJvdW5kLCBmTm9uV1NEZWZhdWx0UGFydCk7DQotCQlpZiAocG9zID09IE5PVF9GT1VORCkNCi0JCQlyZXR1cm4gVG9rZW5FT0Y7DQotDQotCQlmUG9zLS07DQotDQotCQlzd2l0Y2ggKGZDaGFyKSB7DQotCQkJY2FzZSBMQlJBQ0U6DQotCQkJCXJldHVybiBUb2tlbkxCUkFDRTsNCi0JCQljYXNlIFJCUkFDRToNCi0JCQkJcmV0dXJuIFRva2VuUkJSQUNFOw0KLQkJCWNhc2UgTEJSQUNLRVQ6DQotCQkJCXJldHVybiBUb2tlbkxCUkFDS0VUOw0KLQkJCWNhc2UgUkJSQUNLRVQ6DQotCQkJCXJldHVybiBUb2tlblJCUkFDS0VUOw0KLQkJCWNhc2UgTFBBUkVOOg0KLQkJCQlyZXR1cm4gVG9rZW5MUEFSRU47DQotCQkJY2FzZSBSUEFSRU46DQotCQkJCXJldHVybiBUb2tlblJQQVJFTjsNCi0JCQljYXNlIFNFTUlDT0xPTjoNCi0JCQkJcmV0dXJuIFRva2VuU0VNSUNPTE9OOw0KLQkJCWNhc2UgQ09MT046DQotCQkJCXJldHVybiBUb2tlbkNPTE9OOw0KLQkJCWNhc2UgQ09NTUE6DQotCQkJCXJldHVybiBUb2tlbkNPTU1BOw0KLQkJCWNhc2UgUVVFU1RJT05NQVJLOg0KLQkJCQlyZXR1cm4gVG9rZW5RVUVTVElPTk1BUks7DQotCQkJY2FzZSBFUVVBTDoNCi0JCQkJcmV0dXJuIFRva2VuRVFVQUw7DQotCQkJY2FzZSBMQU5HTEU6DQotCQkJCXJldHVybiBUb2tlbkxFU1NUSEFOOw0KLQkJCWNhc2UgUkFOR0xFOg0KLQkJCQlyZXR1cm4gVG9rZW5HUkVBVEVSVEhBTjsNCi0JCQljYXNlIFNRVU9URToNCi0JCQkJcmV0dXJuIFRva2VuU1FVT1RFOw0KLQkJCWNhc2UgRFFVT1RFOg0KLQkJCQlyZXR1cm4gVG9rZW5EUVVPVEU7DQotCQl9DQotDQotCQkvLyBlbHNlDQotCQlpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGZDaGFyKSkgew0KLQkJCS8vIGFzc3VtZSBhbiBpZGVudCBvciBrZXl3b3JkDQotCQkJaW50IGZyb20sIHRvPSBwb3MgKyAxOw0KLQkJCXBvcz0gc2NhbkJhY2t3YXJkKHBvcyAtIDEsIGJvdW5kLCBmTm9uSWRlbnQpOw0KLQkJCWlmIChwb3MgPT0gTk9UX0ZPVU5EKQ0KLQkJCQlmcm9tPSBib3VuZCA9PSBVTkJPVU5EID8gMCA6IGJvdW5kICsgMTsNCi0JCQllbHNlDQotCQkJCWZyb209IHBvcyArIDE7DQotDQotCQkJU3RyaW5nIGlkZW50T3JLZXl3b3JkOw0KLQkJCXRyeSB7DQotCQkJCWlkZW50T3JLZXl3b3JkPSBmRG9jdW1lbnQuZ2V0KGZyb20sIHRvIC0gZnJvbSk7DQotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgew0KLQkJCQlyZXR1cm4gVG9rZW5FT0Y7DQotCQkJfQ0KLQ0KLQkJCXJldHVybiBnZXRUb2tlbihpZGVudE9yS2V5d29yZCk7DQotDQotDQotCQl9IGVsc2Ugew0KLQkJCS8vIG9wZXJhdG9ycywgbnVtYmVyIGxpdGVyYWxzIGV0Yw0KLQkJCXJldHVybiBUb2tlbk9USEVSOw0KLQkJfQ0KLQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIG9uZSBvZiB0aGUga2V5d29yZCBjb25zdGFudHMgb3IgPGNvZGU+VG9rZW5JREVOVDwvY29kZT4gZm9yIGEgc2Nhbm5lZCBpZGVudGlmaWVyLg0KLQkgKg0KLQkgKiBAcGFyYW0gcyBhIHNjYW5uZWQgaWRlbnRpZmllcg0KLQkgKiBAcmV0dXJuIG9uZSBvZiB0aGUgY29uc3RhbnRzIGRlZmluZWQgaW4ge0BsaW5rIFN5bWJvbHN9DQotCSAqLw0KLQlwcml2YXRlIGludCBnZXRUb2tlbihTdHJpbmcgcykgew0KLQkJQXNzZXJ0LmlzTm90TnVsbChzKTsNCi0NCi0JCXN3aXRjaCAocy5sZW5ndGgoKSkgew0KLQkJCWNhc2UgMjoNCi0JCQkJaWYgKCJpZiIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkDQotCQkJCQlyZXR1cm4gVG9rZW5JRjsNCi0JCQkJaWYgKCJkbyIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkDQotCQkJCQlyZXR1cm4gVG9rZW5ETzsNCi0JCQkJYnJlYWs7DQotCQkJY2FzZSAzOg0KLQkJCQlpZiAoImZvciIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkDQotCQkJCQlyZXR1cm4gVG9rZW5GT1I7DQotCQkJCWlmICgidHJ5Ii5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQNCi0JCQkJCXJldHVybiBUb2tlblRSWTsNCi0JCQkJaWYgKCJuZXciLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJA0KLQkJCQkJcmV0dXJuIFRva2VuTkVXOw0KLQkJCQlicmVhazsNCi0JCQljYXNlIDQ6DQotCQkJCWlmICgiY2FzZSIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkDQotCQkJCQlyZXR1cm4gVG9rZW5DQVNFOw0KLQkJCQlpZiAoImVsc2UiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJA0KLQkJCQkJcmV0dXJuIFRva2VuRUxTRTsNCi0JCQkJaWYgKCJlbnVtIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQNCi0JCQkJCXJldHVybiBUb2tlbkVOVU07DQotCQkJCWlmICgiZ290byIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkDQotCQkJCQlyZXR1cm4gVG9rZW5HT1RPOw0KLQkJCQlicmVhazsNCi0JCQljYXNlIDU6DQotCQkJCWlmICgiYnJlYWsiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJA0KLQkJCQkJcmV0dXJuIFRva2VuQlJFQUs7DQotCQkJCWlmICgiY2F0Y2giLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJA0KLQkJCQkJcmV0dXJuIFRva2VuQ0FUQ0g7DQotCQkJCWlmICgiY2xhc3MiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJA0KLQkJCQkJcmV0dXJuIFRva2VuQ0xBU1M7DQotCQkJCWlmICgid2hpbGUiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJA0KLQkJCQkJcmV0dXJuIFRva2VuV0hJTEU7DQotCQkJCWJyZWFrOw0KLQkJCWNhc2UgNjoNCi0JCQkJaWYgKCJyZXR1cm4iLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJA0KLQkJCQkJcmV0dXJuIFRva2VuUkVUVVJOOw0KLQkJCQlpZiAoInN0YXRpYyIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkDQotCQkJCQlyZXR1cm4gVG9rZW5TVEFUSUM7DQotCQkJCWlmICgic3dpdGNoIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQNCi0JCQkJCXJldHVybiBUb2tlblNXSVRDSDsNCi0JCQkJYnJlYWs7DQotCQkJY2FzZSA3Og0KLQkJCQlpZiAoImRlZmF1bHQiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJA0KLQkJCQkJcmV0dXJuIFRva2VuREVGQVVMVDsNCi0JCQkJaWYgKCJmaW5hbGx5Ii5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQNCi0JCQkJCXJldHVybiBUb2tlbkZJTkFMTFk7DQotCQkJCWJyZWFrOw0KLQkJCWNhc2UgOToNCi0JCQkJaWYgKCJpbnRlcmZhY2UiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJA0KLQkJCQkJcmV0dXJuIFRva2VuSU5URVJGQUNFOw0KLQkJCQlicmVhazsNCi0JCQljYXNlIDEyOg0KLQkJCQlpZiAoInN5bmNocm9uaXplZCIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkDQotCQkJCQlyZXR1cm4gVG9rZW5TWU5DSFJPTklaRUQ7DQotCQkJCWJyZWFrOw0KLQkJfQ0KLQkJcmV0dXJuIFRva2VuSURFTlQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjbG9zaW5nIHBlZXIgY2hhcmFjdGVyIChmb3J3YXJkIHNlYXJjaCkuIEFueSBzY29wZXMgaW50cm9kdWNlZCBieSBvcGVuaW5nIHBlZXJzDQotCSAqIGFyZSBza2lwcGVkLiBBbGwgcGVlcnMgYWNjb3VudGVkIGZvciBtdXN0IHJlc2lkZSBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uDQotCSAqDQotCSAqIDxwPk5vdGUgdGhhdCA8Y29kZT5zdGFydDwvY29kZT4gbXVzdCBub3QgcG9pbnQgdG8gdGhlIG9wZW5pbmcgcGVlciwgYnV0IHRvIHRoZSBmaXJzdA0KLQkgKiBjaGFyYWN0ZXIgYmVpbmcgc2VhcmNoZWQuPC9wPg0KLQkgKg0KLQkgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IHBvc2l0aW9uDQotCSAqIEBwYXJhbSBvcGVuaW5nUGVlciB0aGUgb3BlbmluZyBwZWVyIGNoYXJhY3RlciAoZS5nLiAneycpDQotCSAqIEBwYXJhbSBjbG9zaW5nUGVlciB0aGUgY2xvc2luZyBwZWVyIGNoYXJhY3RlciAoZS5nLiAnfScpDQotCSAqIEByZXR1cm4gdGhlIG1hdGNoaW5nIHBlZXIgY2hhcmFjdGVyIHBvc2l0aW9uLCBvciA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgaW50IGZpbmRDbG9zaW5nUGVlcihpbnQgc3RhcnQsIGZpbmFsIGNoYXIgb3BlbmluZ1BlZXIsIGZpbmFsIGNoYXIgY2xvc2luZ1BlZXIpIHsNCi0JCXJldHVybiBmaW5kQ2xvc2luZ1BlZXIoc3RhcnQsIFVOQk9VTkQsIG9wZW5pbmdQZWVyLCBjbG9zaW5nUGVlcik7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjbG9zaW5nIHBlZXIgY2hhcmFjdGVyIChmb3J3YXJkIHNlYXJjaCkuIEFueSBzY29wZXMgaW50cm9kdWNlZCBieSBvcGVuaW5nIHBlZXJzDQotCSAqIGFyZSBza2lwcGVkLiBBbGwgcGVlcnMgYWNjb3VudGVkIGZvciBtdXN0IHJlc2lkZSBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uDQotCSAqDQotCSAqIDxwPk5vdGUgdGhhdCA8Y29kZT5zdGFydDwvY29kZT4gbXVzdCBub3QgcG9pbnQgdG8gdGhlIG9wZW5pbmcgcGVlciwgYnV0IHRvIHRoZSBmaXJzdA0KLQkgKiBjaGFyYWN0ZXIgYmVpbmcgc2VhcmNoZWQuPC9wPg0KLQkgKg0KLQkgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IHBvc2l0aW9uDQotCSAqIEBwYXJhbSBib3VuZCB0aGUgYm91bmQNCi0JICogQHBhcmFtIG9wZW5pbmdQZWVyIHRoZSBvcGVuaW5nIHBlZXIgY2hhcmFjdGVyIChlLmcuICd7JykNCi0JICogQHBhcmFtIGNsb3NpbmdQZWVyIHRoZSBjbG9zaW5nIHBlZXIgY2hhcmFjdGVyIChlLmcuICd9JykNCi0JICogQHJldHVybiB0aGUgbWF0Y2hpbmcgcGVlciBjaGFyYWN0ZXIgcG9zaXRpb24sIG9yIDxjb2RlPk5PVF9GT1VORDwvY29kZT4NCi0JICovDQotCXB1YmxpYyBpbnQgZmluZENsb3NpbmdQZWVyKGludCBzdGFydCwgaW50IGJvdW5kLCBmaW5hbCBjaGFyIG9wZW5pbmdQZWVyLCBmaW5hbCBjaGFyIGNsb3NpbmdQZWVyKSB7DQotCQlBc3NlcnQuaXNMZWdhbChzdGFydCA+PSAwKTsNCi0NCi0JCXRyeSB7DQotCQkJQ2hhcmFjdGVyTWF0Y2ggbWF0Y2g9IG5ldyBDaGFyYWN0ZXJNYXRjaChuZXcgY2hhcltdIHtvcGVuaW5nUGVlciwgY2xvc2luZ1BlZXJ9KTsNCi0JCQlpbnQgZGVwdGg9IDE7DQotCQkJc3RhcnQgLT0gMTsNCi0JCQl3aGlsZSAodHJ1ZSkgew0KLQkJCQlzdGFydD0gc2NhbkZvcndhcmQoc3RhcnQgKyAxLCBib3VuZCwgbWF0Y2gpOw0KLQkJCQlpZiAoc3RhcnQgPT0gTk9UX0ZPVU5EKQ0KLQkJCQkJcmV0dXJuIE5PVF9GT1VORDsNCi0NCi0JCQkJaWYgKGZEb2N1bWVudC5nZXRDaGFyKHN0YXJ0KSA9PSBvcGVuaW5nUGVlcikNCi0JCQkJCWRlcHRoKys7DQotCQkJCWVsc2UNCi0JCQkJCWRlcHRoLS07DQotDQotCQkJCWlmIChkZXB0aCA9PSAwKQ0KLQkJCQkJcmV0dXJuIHN0YXJ0Ow0KLQkJCX0NCi0NCi0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gTk9UX0ZPVU5EOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgb3BlbmluZyBwZWVyIGNoYXJhY3RlciAoYmFja3dhcmQgc2VhcmNoKS4gQW55IHNjb3BlcyBpbnRyb2R1Y2VkIGJ5IGNsb3NpbmcgcGVlcnMNCi0JICogYXJlIHNraXBwZWQuIEFsbCBwZWVycyBhY2NvdW50ZWQgZm9yIG11c3QgcmVzaWRlIGluIHRoZSBkZWZhdWx0IHBhcnRpdGlvbi4NCi0JICoNCi0JICogPHA+Tm90ZSB0aGF0IDxjb2RlPnN0YXJ0PC9jb2RlPiBtdXN0IG5vdCBwb2ludCB0byB0aGUgY2xvc2luZyBwZWVyLCBidXQgdG8gdGhlIGZpcnN0DQotCSAqIGNoYXJhY3RlciBiZWluZyBzZWFyY2hlZC48L3A+DQotCSAqDQotCSAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgcG9zaXRpb24NCi0JICogQHBhcmFtIG9wZW5pbmdQZWVyIHRoZSBvcGVuaW5nIHBlZXIgY2hhcmFjdGVyIChlLmcuICd7JykNCi0JICogQHBhcmFtIGNsb3NpbmdQZWVyIHRoZSBjbG9zaW5nIHBlZXIgY2hhcmFjdGVyIChlLmcuICd9JykNCi0JICogQHJldHVybiB0aGUgbWF0Y2hpbmcgcGVlciBjaGFyYWN0ZXIgcG9zaXRpb24sIG9yIDxjb2RlPk5PVF9GT1VORDwvY29kZT4NCi0JICovDQotCXB1YmxpYyBpbnQgZmluZE9wZW5pbmdQZWVyKGludCBzdGFydCwgY2hhciBvcGVuaW5nUGVlciwgY2hhciBjbG9zaW5nUGVlcikgew0KLQkJcmV0dXJuIGZpbmRPcGVuaW5nUGVlcihzdGFydCwgVU5CT1VORCwgb3BlbmluZ1BlZXIsIGNsb3NpbmdQZWVyKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIG9wZW5pbmcgcGVlciBjaGFyYWN0ZXIgKGJhY2t3YXJkIHNlYXJjaCkuIEFueSBzY29wZXMgaW50cm9kdWNlZCBieSBjbG9zaW5nIHBlZXJzDQotCSAqIGFyZSBza2lwcGVkLiBBbGwgcGVlcnMgYWNjb3VudGVkIGZvciBtdXN0IHJlc2lkZSBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uDQotCSAqDQotCSAqIDxwPk5vdGUgdGhhdCA8Y29kZT5zdGFydDwvY29kZT4gbXVzdCBub3QgcG9pbnQgdG8gdGhlIGNsb3NpbmcgcGVlciwgYnV0IHRvIHRoZSBmaXJzdA0KLQkgKiBjaGFyYWN0ZXIgYmVpbmcgc2VhcmNoZWQuPC9wPg0KLQkgKg0KLQkgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IHBvc2l0aW9uDQotCSAqIEBwYXJhbSBib3VuZCB0aGUgYm91bmQNCi0JICogQHBhcmFtIG9wZW5pbmdQZWVyIHRoZSBvcGVuaW5nIHBlZXIgY2hhcmFjdGVyIChlLmcuICd7JykNCi0JICogQHBhcmFtIGNsb3NpbmdQZWVyIHRoZSBjbG9zaW5nIHBlZXIgY2hhcmFjdGVyIChlLmcuICd9JykNCi0JICogQHJldHVybiB0aGUgbWF0Y2hpbmcgcGVlciBjaGFyYWN0ZXIgcG9zaXRpb24sIG9yIDxjb2RlPk5PVF9GT1VORDwvY29kZT4NCi0JICovDQotCXB1YmxpYyBpbnQgZmluZE9wZW5pbmdQZWVyKGludCBzdGFydCwgaW50IGJvdW5kLCBjaGFyIG9wZW5pbmdQZWVyLCBjaGFyIGNsb3NpbmdQZWVyKSB7DQotCQlBc3NlcnQuaXNMZWdhbChzdGFydCA8IGZEb2N1bWVudC5nZXRMZW5ndGgoKSk7DQotDQotCQl0cnkgew0KLQkJCWZpbmFsIENoYXJhY3Rlck1hdGNoIG1hdGNoPSBuZXcgQ2hhcmFjdGVyTWF0Y2gobmV3IGNoYXJbXSB7b3BlbmluZ1BlZXIsIGNsb3NpbmdQZWVyfSk7DQotCQkJaW50IGRlcHRoPSAxOw0KLQkJCXN0YXJ0ICs9IDE7DQotCQkJd2hpbGUgKHRydWUpIHsNCi0JCQkJc3RhcnQ9IHNjYW5CYWNrd2FyZChzdGFydCAtIDEsIGJvdW5kLCBtYXRjaCk7DQotCQkJCWlmIChzdGFydCA9PSBOT1RfRk9VTkQpDQotCQkJCQlyZXR1cm4gTk9UX0ZPVU5EOw0KLQ0KLQkJCQlpZiAoZkRvY3VtZW50LmdldENoYXIoc3RhcnQpID09IGNsb3NpbmdQZWVyKQ0KLQkJCQkJZGVwdGgrKzsNCi0JCQkJZWxzZQ0KLQkJCQkJZGVwdGgtLTsNCi0NCi0JCQkJaWYgKGRlcHRoID09IDApDQotCQkJCQlyZXR1cm4gc3RhcnQ7DQotCQkJfQ0KLQ0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBOT1RfRk9VTkQ7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbXB1dGVzIHRoZSBzdXJyb3VuZGluZyBibG9jayBhcm91bmQgPGNvZGU+b2Zmc2V0PC9jb2RlPi4gVGhlIHNlYXJjaCBpcyBzdGFydGVkIGF0IHRoZQ0KLQkgKiBiZWdpbm5pbmcgb2YgPGNvZGU+b2Zmc2V0PC9jb2RlPiwgaS5lLiBhbiBvcGVuaW5nIGJyYWNlIGF0IDxjb2RlPm9mZnNldDwvY29kZT4gd2lsbCBub3QgYmUNCi0JICogcGFydCBvZiB0aGUgc3Vycm91bmRpbmcgYmxvY2ssIGJ1dCBhIGNsb3NpbmcgYnJhY2Ugd2lsbC4NCi0JICoNCi0JICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGZvciB3aGljaCB0aGUgc3Vycm91bmRpbmcgYmxvY2sgaXMgY29tcHV0ZWQNCi0JICogQHJldHVybiBhIHJlZ2lvbiBkZXNjcmliaW5nIHRoZSBzdXJyb3VuZGluZyBibG9jaywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQNCi0JICovDQotCXB1YmxpYyBJUmVnaW9uIGZpbmRTdXJyb3VuZGluZ0Jsb2NrKGludCBvZmZzZXQpIHsNCi0JCWlmIChvZmZzZXQgPCAxIHx8IG9mZnNldCA+PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpDQotCQkJcmV0dXJuIG51bGw7DQotDQotCQlpbnQgYmVnaW49IGZpbmRPcGVuaW5nUGVlcihvZmZzZXQgLSAxLCBMQlJBQ0UsIFJCUkFDRSk7DQotCQlpbnQgZW5kPSBmaW5kQ2xvc2luZ1BlZXIob2Zmc2V0LCBMQlJBQ0UsIFJCUkFDRSk7DQotCQlpZiAoYmVnaW4gPT0gTk9UX0ZPVU5EIHx8IGVuZCA9PSBOT1RfRk9VTkQpDQotCQkJcmV0dXJuIG51bGw7DQotCQlyZXR1cm4gbmV3IFJlZ2lvbihiZWdpbiwgZW5kICsgMSAtIGJlZ2luKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogRmluZHMgdGhlIHNtYWxsZXN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gc3VjaCB0aGF0IHRoZSBwb3NpdGlvbiBpcyAmZ3Q7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4NCi0JICogYW5kICZsdDsgPGNvZGU+Ym91bmQ8L2NvZGU+IGFuZCA8Y29kZT5DaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGZEb2N1bWVudC5nZXRDaGFyKHBvcykpPC9jb2RlPiBldmFsdWF0ZXMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+DQotCSAqIGFuZCB0aGUgcG9zaXRpb24gaXMgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uLg0KLQkgKg0KLQkgKiBAcGFyYW0gcG9zaXRpb24gdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIGJlIGNvbnNpZGVyZWQNCi0JICogQHBhcmFtIGJvdW5kIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIG5vdCBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmd0OyA8Y29kZT5wb3NpdGlvbjwvY29kZT4sIG9yIDxjb2RlPlVOQk9VTkQ8L2NvZGU+DQotCSAqIEByZXR1cm4gdGhlIHNtYWxsZXN0IHBvc2l0aW9uIG9mIGEgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGluIFs8Y29kZT5wb3NpdGlvbjwvY29kZT4sIDxjb2RlPmJvdW5kPC9jb2RlPikgdGhhdCByZXNpZGVzIGluIGEgSmF2YSBwYXJ0aXRpb24sIG9yIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQNCi0JICovDQotCXB1YmxpYyBpbnQgZmluZE5vbldoaXRlc3BhY2VGb3J3YXJkKGludCBwb3NpdGlvbiwgaW50IGJvdW5kKSB7DQotCQlyZXR1cm4gc2NhbkZvcndhcmQocG9zaXRpb24sIGJvdW5kLCBmTm9uV1NEZWZhdWx0UGFydCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEZpbmRzIHRoZSBzbWFsbGVzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUgcG9zaXRpb24gaXMgJmd0Oz0gPGNvZGU+cG9zaXRpb248L2NvZGU+DQotCSAqIGFuZCAmbHQ7IDxjb2RlPmJvdW5kPC9jb2RlPiBhbmQgPGNvZGU+Q2hhcmFjdGVyLmlzV2hpdGVzcGFjZShmRG9jdW1lbnQuZ2V0Q2hhcihwb3MpKTwvY29kZT4gZXZhbHVhdGVzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4NCi0JICoNCi0JICogQHBhcmFtIHBvc2l0aW9uIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBiZSBjb25zaWRlcmVkDQotCSAqIEBwYXJhbSBib3VuZCB0aGUgZmlyc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBub3QgY29uc2lkZXIgYW55IG1vcmUsIHdpdGggPGNvZGU+Ym91bmQ8L2NvZGU+ICZndDsgPGNvZGU+cG9zaXRpb248L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPg0KLQkgKiBAcmV0dXJuIHRoZSBzbWFsbGVzdCBwb3NpdGlvbiBvZiBhIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpbiBbPGNvZGU+cG9zaXRpb248L2NvZGU+LCA8Y29kZT5ib3VuZDwvY29kZT4pLCBvciA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuIGJlIGZvdW5kDQotCSAqLw0KLQlwdWJsaWMgaW50IGZpbmROb25XaGl0ZXNwYWNlRm9yd2FyZEluQW55UGFydGl0aW9uKGludCBwb3NpdGlvbiwgaW50IGJvdW5kKSB7DQotCQlyZXR1cm4gc2NhbkZvcndhcmQocG9zaXRpb24sIGJvdW5kLCBmTm9uV1MpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBGaW5kcyB0aGUgaGlnaGVzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUgcG9zaXRpb24gaXMgJmx0Oz0gPGNvZGU+cG9zaXRpb248L2NvZGU+DQotCSAqIGFuZCAmZ3Q7IDxjb2RlPmJvdW5kPC9jb2RlPiBhbmQgPGNvZGU+Q2hhcmFjdGVyLmlzV2hpdGVzcGFjZShmRG9jdW1lbnQuZ2V0Q2hhcihwb3MpKTwvY29kZT4gZXZhbHVhdGVzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPg0KLQkgKiBhbmQgdGhlIHBvc2l0aW9uIGlzIGluIHRoZSBkZWZhdWx0IHBhcnRpdGlvbi4NCi0JICoNCi0JICogQHBhcmFtIHBvc2l0aW9uIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBiZSBjb25zaWRlcmVkDQotCSAqIEBwYXJhbSBib3VuZCB0aGUgZmlyc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBub3QgY29uc2lkZXIgYW55IG1vcmUsIHdpdGggPGNvZGU+Ym91bmQ8L2NvZGU+ICZsdDsgPGNvZGU+cG9zaXRpb248L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPg0KLQkgKiBAcmV0dXJuIHRoZSBoaWdoZXN0IHBvc2l0aW9uIG9mIGEgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGluICg8Y29kZT5ib3VuZDwvY29kZT4sIDxjb2RlPnBvc2l0aW9uPC9jb2RlPl0gdGhhdCByZXNpZGVzIGluIGEgSmF2YSBwYXJ0aXRpb24sIG9yIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQNCi0JICovDQotCXB1YmxpYyBpbnQgZmluZE5vbldoaXRlc3BhY2VCYWNrd2FyZChpbnQgcG9zaXRpb24sIGludCBib3VuZCkgew0KLQkJcmV0dXJuIHNjYW5CYWNrd2FyZChwb3NpdGlvbiwgYm91bmQsIGZOb25XU0RlZmF1bHRQYXJ0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogRmluZHMgdGhlIGxvd2VzdCBwb3NpdGlvbiA8Y29kZT5wPC9jb2RlPiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCA8Y29kZT5zdGFydDwvY29kZT4gJmx0Oz0gcCAmbHQ7DQotCSAqIDxjb2RlPmJvdW5kPC9jb2RlPiBhbmQgPGNvZGU+Y29uZGl0aW9uLnN0b3AoZkRvY3VtZW50LmdldENoYXIocCksIHApPC9jb2RlPiBldmFsdWF0ZXMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uDQotCSAqDQotCSAqIEBwYXJhbSBzdGFydCB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gYmUgY29uc2lkZXJlZA0KLQkgKiBAcGFyYW0gYm91bmQgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90IGNvbnNpZGVyIGFueSBtb3JlLCB3aXRoIDxjb2RlPmJvdW5kPC9jb2RlPiAmZ3Q7IDxjb2RlPnN0YXJ0PC9jb2RlPiwgb3IgPGNvZGU+VU5CT1VORDwvY29kZT4NCi0JICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgPGNvZGU+U3RvcENvbmRpdGlvbjwvY29kZT4gdG8gY2hlY2sNCi0JICogQHJldHVybiB0aGUgbG93ZXN0IHBvc2l0aW9uIGluIFs8Y29kZT5zdGFydDwvY29kZT4sIDxjb2RlPmJvdW5kPC9jb2RlPikgZm9yIHdoaWNoIDxjb2RlPmNvbmRpdGlvbjwvY29kZT4gaG9sZHMsIG9yIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQNCi0JICovDQotCXB1YmxpYyBpbnQgc2NhbkZvcndhcmQoaW50IHN0YXJ0LCBpbnQgYm91bmQsIFN0b3BDb25kaXRpb24gY29uZGl0aW9uKSB7DQotCQlBc3NlcnQuaXNMZWdhbChzdGFydCA+PSAwKTsNCi0NCi0JCWlmIChib3VuZCA9PSBVTkJPVU5EKQ0KLQkJCWJvdW5kPSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCk7DQotDQotCQlBc3NlcnQuaXNMZWdhbChib3VuZCA8PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOw0KLQ0KLQkJdHJ5IHsNCi0JCQlmUG9zPSBzdGFydDsNCi0JCQl3aGlsZSAoZlBvcyA8IGJvdW5kKSB7DQotDQotCQkJCWZDaGFyPSBmRG9jdW1lbnQuZ2V0Q2hhcihmUG9zKTsNCi0JCQkJaWYgKGNvbmRpdGlvbi5zdG9wKGZDaGFyLCBmUG9zLCB0cnVlKSkNCi0JCQkJCXJldHVybiBmUG9zOw0KLQ0KLQkJCQlmUG9zPSBjb25kaXRpb24ubmV4dFBvc2l0aW9uKGZQb3MsIHRydWUpOw0KLQkJCX0NCi0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsNCi0JCX0NCi0JCXJldHVybiBOT1RfRk9VTkQ7DQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIEZpbmRzIHRoZSBsb3dlc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiBzdWNoIHRoYXQgdGhlIHBvc2l0aW9uIGlzICZndDs9IDxjb2RlPnBvc2l0aW9uPC9jb2RlPg0KLQkgKiBhbmQgJmx0OyA8Y29kZT5ib3VuZDwvY29kZT4gYW5kIDxjb2RlPmZEb2N1bWVudC5nZXRDaGFyKHBvc2l0aW9uKSA9PSBjaDwvY29kZT4gZXZhbHVhdGVzIHRvIDxjb2RlPnRydWU8L2NvZGU+DQotCSAqIGFuZCB0aGUgcG9zaXRpb24gaXMgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uLg0KLQkgKg0KLQkgKiBAcGFyYW0gcG9zaXRpb24gdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIGJlIGNvbnNpZGVyZWQNCi0JICogQHBhcmFtIGJvdW5kIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIG5vdCBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmd0OyA8Y29kZT5wb3NpdGlvbjwvY29kZT4sIG9yIDxjb2RlPlVOQk9VTkQ8L2NvZGU+DQotCSAqIEBwYXJhbSBjaCB0aGUgPGNvZGU+Y2hhcjwvY29kZT4gdG8gc2VhcmNoIGZvcg0KLQkgKiBAcmV0dXJuIHRoZSBsb3dlc3QgcG9zaXRpb24gb2YgPGNvZGU+Y2g8L2NvZGU+IGluICg8Y29kZT5ib3VuZDwvY29kZT4sIDxjb2RlPnBvc2l0aW9uPC9jb2RlPl0gdGhhdCByZXNpZGVzIGluIGEgSmF2YSBwYXJ0aXRpb24sIG9yIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQNCi0JICovDQotCXB1YmxpYyBpbnQgc2NhbkZvcndhcmQoaW50IHBvc2l0aW9uLCBpbnQgYm91bmQsIGNoYXIgY2gpIHsNCi0JCXJldHVybiBzY2FuRm9yd2FyZChwb3NpdGlvbiwgYm91bmQsIG5ldyBDaGFyYWN0ZXJNYXRjaChjaCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBGaW5kcyB0aGUgbG93ZXN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gc3VjaCB0aGF0IHRoZSBwb3NpdGlvbiBpcyAmZ3Q7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4NCi0JICogYW5kICZsdDsgPGNvZGU+Ym91bmQ8L2NvZGU+IGFuZCA8Y29kZT5mRG9jdW1lbnQuZ2V0Q2hhcihwb3NpdGlvbikgPT0gY2g8L2NvZGU+IGV2YWx1YXRlcyB0byA8Y29kZT50cnVlPC9jb2RlPiBmb3IgYXQgbGVhc3Qgb25lDQotCSAqIGNoIGluIDxjb2RlPmNoYXJzPC9jb2RlPiBhbmQgdGhlIHBvc2l0aW9uIGlzIGluIHRoZSBkZWZhdWx0IHBhcnRpdGlvbi4NCi0JICoNCi0JICogQHBhcmFtIHBvc2l0aW9uIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBiZSBjb25zaWRlcmVkDQotCSAqIEBwYXJhbSBib3VuZCB0aGUgZmlyc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBub3QgY29uc2lkZXIgYW55IG1vcmUsIHdpdGggPGNvZGU+Ym91bmQ8L2NvZGU+ICZndDsgPGNvZGU+cG9zaXRpb248L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPg0KLQkgKiBAcGFyYW0gY2hhcnMgYW4gYXJyYXkgb2YgPGNvZGU+Y2hhcjwvY29kZT4gdG8gc2VhcmNoIGZvcg0KLQkgKiBAcmV0dXJuIHRoZSBsb3dlc3QgcG9zaXRpb24gb2YgYSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW4gWzxjb2RlPnBvc2l0aW9uPC9jb2RlPiwgPGNvZGU+Ym91bmQ8L2NvZGU+KSB0aGF0IHJlc2lkZXMgaW4gYSBKYXZhIHBhcnRpdGlvbiwgb3IgPGNvZGU+Tk9UX0ZPVU5EPC9jb2RlPiBpZiBub25lIGNhbiBiZSBmb3VuZA0KLQkgKi8NCi0JcHVibGljIGludCBzY2FuRm9yd2FyZChpbnQgcG9zaXRpb24sIGludCBib3VuZCwgY2hhcltdIGNoYXJzKSB7DQotCQlyZXR1cm4gc2NhbkZvcndhcmQocG9zaXRpb24sIGJvdW5kLCBuZXcgQ2hhcmFjdGVyTWF0Y2goY2hhcnMpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogRmluZHMgdGhlIGhpZ2hlc3QgcG9zaXRpb24gPGNvZGU+cDwvY29kZT4gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiBzdWNoIHRoYXQgPGNvZGU+Ym91bmQ8L2NvZGU+ICZsdDsgPGNvZGU+cDwvY29kZT4gJmx0Oz0gPGNvZGU+c3RhcnQ8L2NvZGU+DQotCSAqIGFuZCA8Y29kZT5jb25kaXRpb24uc3RvcChmRG9jdW1lbnQuZ2V0Q2hhcihwKSwgcCk8L2NvZGU+IGV2YWx1YXRlcyB0byA8Y29kZT50cnVlPC9jb2RlPi4NCi0JICoNCi0JICogQHBhcmFtIHN0YXJ0IHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBiZSBjb25zaWRlcmVkDQotCSAqIEBwYXJhbSBib3VuZCB0aGUgZmlyc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBub3QgY29uc2lkZXIgYW55IG1vcmUsIHdpdGggPGNvZGU+Ym91bmQ8L2NvZGU+ICZsdDsgPGNvZGU+c3RhcnQ8L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPg0KLQkgKiBAcGFyYW0gY29uZGl0aW9uIHRoZSA8Y29kZT5TdG9wQ29uZGl0aW9uPC9jb2RlPiB0byBjaGVjaw0KLQkgKiBAcmV0dXJuIHRoZSBoaWdoZXN0IHBvc2l0aW9uIGluICg8Y29kZT5ib3VuZDwvY29kZT4sIDxjb2RlPnN0YXJ0PC9jb2RlPiBmb3Igd2hpY2ggPGNvZGU+Y29uZGl0aW9uPC9jb2RlPiBob2xkcywgb3IgPGNvZGU+Tk9UX0ZPVU5EPC9jb2RlPiBpZiBub25lIGNhbiBiZSBmb3VuZA0KLQkgKi8NCi0JcHVibGljIGludCBzY2FuQmFja3dhcmQoaW50IHN0YXJ0LCBpbnQgYm91bmQsIFN0b3BDb25kaXRpb24gY29uZGl0aW9uKSB7DQotCQlpZiAoYm91bmQgPT0gVU5CT1VORCkNCi0JCQlib3VuZD0gLTE7DQotDQotCQlBc3NlcnQuaXNMZWdhbChib3VuZCA+PSAtMSk7DQotCQlBc3NlcnQuaXNMZWdhbChzdGFydCA8IGZEb2N1bWVudC5nZXRMZW5ndGgoKSApOw0KLQ0KLQkJdHJ5IHsNCi0JCQlmUG9zPSBzdGFydDsNCi0JCQl3aGlsZSAoZlBvcyA+IGJvdW5kKSB7DQotDQotCQkJCWZDaGFyPSBmRG9jdW1lbnQuZ2V0Q2hhcihmUG9zKTsNCi0JCQkJaWYgKGNvbmRpdGlvbi5zdG9wKGZDaGFyLCBmUG9zLCBmYWxzZSkpDQotCQkJCQlyZXR1cm4gZlBvczsNCi0NCi0JCQkJZlBvcz0gY29uZGl0aW9uLm5leHRQb3NpdGlvbihmUG9zLCBmYWxzZSk7DQotCQkJfQ0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgew0KLQkJfQ0KLQkJcmV0dXJuIE5PVF9GT1VORDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogRmluZHMgdGhlIGhpZ2hlc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiBzdWNoIHRoYXQgdGhlIHBvc2l0aW9uIGlzICZsdDs9IDxjb2RlPnBvc2l0aW9uPC9jb2RlPg0KLQkgKiBhbmQgJmd0OyA8Y29kZT5ib3VuZDwvY29kZT4gYW5kIDxjb2RlPmZEb2N1bWVudC5nZXRDaGFyKHBvc2l0aW9uKSA9PSBjaDwvY29kZT4gZXZhbHVhdGVzIHRvIDxjb2RlPnRydWU8L2NvZGU+IGZvciBhdCBsZWFzdCBvbmUNCi0JICogY2ggaW4gPGNvZGU+Y2hhcnM8L2NvZGU+IGFuZCB0aGUgcG9zaXRpb24gaXMgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uLg0KLQkgKg0KLQkgKiBAcGFyYW0gcG9zaXRpb24gdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIGJlIGNvbnNpZGVyZWQNCi0JICogQHBhcmFtIGJvdW5kIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIG5vdCBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmx0OyA8Y29kZT5wb3NpdGlvbjwvY29kZT4sIG9yIDxjb2RlPlVOQk9VTkQ8L2NvZGU+DQotCSAqIEBwYXJhbSBjaCB0aGUgPGNvZGU+Y2hhcjwvY29kZT4gdG8gc2VhcmNoIGZvcg0KLQkgKiBAcmV0dXJuIHRoZSBoaWdoZXN0IHBvc2l0aW9uIG9mIG9uZSBlbGVtZW50IGluIDxjb2RlPmNoYXJzPC9jb2RlPiBpbiAoPGNvZGU+Ym91bmQ8L2NvZGU+LCA8Y29kZT5wb3NpdGlvbjwvY29kZT5dIHRoYXQgcmVzaWRlcyBpbiBhIEphdmEgcGFydGl0aW9uLCBvciA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuIGJlIGZvdW5kDQotCSAqLw0KLQlwdWJsaWMgaW50IHNjYW5CYWNrd2FyZChpbnQgcG9zaXRpb24sIGludCBib3VuZCwgY2hhciBjaCkgew0KLQkJcmV0dXJuIHNjYW5CYWNrd2FyZChwb3NpdGlvbiwgYm91bmQsIG5ldyBDaGFyYWN0ZXJNYXRjaChjaCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBGaW5kcyB0aGUgaGlnaGVzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUgcG9zaXRpb24gaXMgJmx0Oz0gPGNvZGU+cG9zaXRpb248L2NvZGU+DQotCSAqIGFuZCAmZ3Q7IDxjb2RlPmJvdW5kPC9jb2RlPiBhbmQgPGNvZGU+ZkRvY3VtZW50LmdldENoYXIocG9zaXRpb24pID09IGNoPC9jb2RlPiBldmFsdWF0ZXMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGF0IGxlYXN0IG9uZQ0KLQkgKiBjaCBpbiA8Y29kZT5jaGFyczwvY29kZT4gYW5kIHRoZSBwb3NpdGlvbiBpcyBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uDQotCSAqDQotCSAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gYmUgY29uc2lkZXJlZA0KLQkgKiBAcGFyYW0gYm91bmQgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90IGNvbnNpZGVyIGFueSBtb3JlLCB3aXRoIDxjb2RlPmJvdW5kPC9jb2RlPiAmbHQ7IDxjb2RlPnBvc2l0aW9uPC9jb2RlPiwgb3IgPGNvZGU+VU5CT1VORDwvY29kZT4NCi0JICogQHBhcmFtIGNoYXJzIGFuIGFycmF5IG9mIDxjb2RlPmNoYXI8L2NvZGU+IHRvIHNlYXJjaCBmb3INCi0JICogQHJldHVybiB0aGUgaGlnaGVzdCBwb3NpdGlvbiBvZiBvbmUgZWxlbWVudCBpbiA8Y29kZT5jaGFyczwvY29kZT4gaW4gKDxjb2RlPmJvdW5kPC9jb2RlPiwgPGNvZGU+cG9zaXRpb248L2NvZGU+XSB0aGF0IHJlc2lkZXMgaW4gYSBKYXZhIHBhcnRpdGlvbiwgb3IgPGNvZGU+Tk9UX0ZPVU5EPC9jb2RlPiBpZiBub25lIGNhbiBiZSBmb3VuZA0KLQkgKi8NCi0JcHVibGljIGludCBzY2FuQmFja3dhcmQoaW50IHBvc2l0aW9uLCBpbnQgYm91bmQsIGNoYXJbXSBjaGFycykgew0KLQkJcmV0dXJuIHNjYW5CYWNrd2FyZChwb3NpdGlvbiwgYm91bmQsIG5ldyBDaGFyYWN0ZXJNYXRjaChjaGFycykpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3Mgd2hldGhlciA8Y29kZT5wb3NpdGlvbjwvY29kZT4gcmVzaWRlcyBpbiBhIGRlZmF1bHQgKEphdmEpIHBhcnRpdGlvbiBvZiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+Lg0KLQkgKg0KLQkgKiBAcGFyYW0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIHRvIGJlIGNoZWNrZWQNCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5wb3NpdGlvbjwvY29kZT4gaXMgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uIG9mIDxjb2RlPmZEb2N1bWVudDwvY29kZT4sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFBhcnRpdGlvbihpbnQgcG9zaXRpb24pIHsNCi0JCXJldHVybiBmUGFydGl0aW9uLmVxdWFscyhnZXRQYXJ0aXRpb24ocG9zaXRpb24pLmdldFR5cGUoKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHBhcnRpdGlvbiBhdCA8Y29kZT5wb3NpdGlvbjwvY29kZT4uDQotCSAqDQotCSAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgcG9zaXRpb24gdG8gZ2V0IHRoZSBwYXJ0aXRpb24gZm9yDQotCSAqIEByZXR1cm4gdGhlIHBhcnRpdGlvbiBhdCA8Y29kZT5wb3NpdGlvbjwvY29kZT4gb3IgYSBkdW1teSB6ZXJvLWxlbmd0aA0KLQkgKiAgICAgICAgIHBhcnRpdGlvbiBpZiBhY2Nlc3NpbmcgdGhlIGRvY3VtZW50IGZhaWxzDQotCSAqLw0KLQlwcml2YXRlIElUeXBlZFJlZ2lvbiBnZXRQYXJ0aXRpb24oaW50IHBvc2l0aW9uKSB7DQotCQlpZiAoIWNvbnRhaW5zKGZDYWNoZWRQYXJ0aXRpb24sIHBvc2l0aW9uKSkgew0KLQkJCUFzc2VydC5pc1RydWUocG9zaXRpb24gPj0gMCk7DQotCQkJQXNzZXJ0LmlzVHJ1ZShwb3NpdGlvbiA8PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOw0KLQ0KLQkJCXRyeSB7DQotCQkJCWZDYWNoZWRQYXJ0aXRpb249IFRleHRVdGlsaXRpZXMuZ2V0UGFydGl0aW9uKGZEb2N1bWVudCwgZlBhcnRpdGlvbmluZywgcG9zaXRpb24sIGZhbHNlKTsNCi0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7DQotCQkJCWZDYWNoZWRQYXJ0aXRpb249IG5ldyBUeXBlZFJlZ2lvbihwb3NpdGlvbiwgMCwgIl9fbm9fcGFydGl0aW9uX2F0X2FsbCIpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZDYWNoZWRQYXJ0aXRpb247DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+cmVnaW9uPC9jb2RlPiBjb250YWlucyA8Y29kZT5wb3NpdGlvbjwvY29kZT4uDQotCSAqDQotCSAqIEBwYXJhbSByZWdpb24gYSByZWdpb24NCi0JICogQHBhcmFtIHBvc2l0aW9uIGFuIG9mZnNldA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPnJlZ2lvbjwvY29kZT4gY29udGFpbnMgPGNvZGU+cG9zaXRpb248L2NvZGU+DQotCSAqIEBzaW5jZSAzLjINCi0JICovDQotCXByaXZhdGUgYm9vbGVhbiBjb250YWlucyhJUmVnaW9uIHJlZ2lvbiwgaW50IHBvc2l0aW9uKSB7DQotCQlpbnQgb2Zmc2V0PSByZWdpb24uZ2V0T2Zmc2V0KCk7DQotCQlyZXR1cm4gb2Zmc2V0IDw9IHBvc2l0aW9uICYmIHBvc2l0aW9uIDwgb2Zmc2V0ICsgcmVnaW9uLmdldExlbmd0aCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3MgaWYgdGhlIGxpbmUgc2VlbXMgdG8gYmUgYW4gb3BlbiBjb25kaXRpb24gbm90IGZvbGxvd2VkIGJ5IGEgYmxvY2sgKGkuZS4gYW4gaWYsIHdoaWxlLA0KLQkgKiBvciBmb3Igc3RhdGVtZW50IHdpdGgganVzdCBvbmUgZm9sbG93aW5nIHN0YXRlbWVudCwgc2VlIGV4YW1wbGUgYmVsb3cpLg0KLQkgKg0KLQkgKiA8cHJlPg0KLQkgKiBpZiAoY29uZGl0aW9uKQ0KLQkgKiAgICAgZG9TdHVmZigpOw0KLQkgKiA8L3ByZT4NCi0JICoNCi0JICogPHA+QWxnb3JpdGhtOiBpZiB0aGUgbGFzdCBub24tV1MsIG5vbi1Db21tZW50IGNvZGUgb24gdGhlIGxpbmUgaXMgYW4gaWYgKGNvbmRpdGlvbiksIHdoaWxlIChjb25kaXRpb24pLA0KLQkgKiBmb3IoIGV4cHJlc3Npb24pLCBkbywgZWxzZSwgYW5kIHRoZXJlIGlzIG5vIHN0YXRlbWVudCBhZnRlciB0aGF0IDwvcD4NCi0JICoNCi0JICogQHBhcmFtIHBvc2l0aW9uIHRoZSBpbnNlcnQgcG9zaXRpb24gb2YgdGhlIG5ldyBjaGFyYWN0ZXINCi0JICogQHBhcmFtIGJvdW5kIHRoZSBsb3dlc3QgcG9zaXRpb24gdG8gY29uc2lkZXINCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29kZSBpcyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCBvciBsb29wIHdpdGhvdXQgYSBibG9jaywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNCcmFjZWxlc3NCbG9ja1N0YXJ0KGludCBwb3NpdGlvbiwgaW50IGJvdW5kKSB7DQotCQlpZiAocG9zaXRpb24gPCAxKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0NCi0JCXN3aXRjaCAocHJldmlvdXNUb2tlbihwb3NpdGlvbiwgYm91bmQpKSB7DQotCQkJY2FzZSBUb2tlbkRPOg0KLQkJCWNhc2UgVG9rZW5FTFNFOg0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQljYXNlIFRva2VuUlBBUkVOOg0KLQkJCQlwb3NpdGlvbj0gZmluZE9wZW5pbmdQZWVyKGZQb3MsIExQQVJFTiwgUlBBUkVOKTsNCi0JCQkJaWYgKHBvc2l0aW9uID4gMCkgew0KLQkJCQkJc3dpdGNoIChwcmV2aW91c1Rva2VuKHBvc2l0aW9uIC0gMSwgYm91bmQpKSB7DQotCQkJCQkJY2FzZSBUb2tlbklGOg0KLQkJCQkJCWNhc2UgVG9rZW5GT1I6DQotCQkJCQkJY2FzZSBUb2tlbldISUxFOg0KLQkJCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkb2N1bWVudCwgd2hlbiBzY2FubmVkIGJhY2t3YXJkcyBmcm9tIDxjb2RlPnN0YXJ0PC9jb2RlPg0KLQkgKiBhcHBlYXJzIHRvIGNvbnRhaW4gYSBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiwgaS5lLiBhIHBvc3NpYmx5IHF1YWxpZmllZCBuYW1lIHByZWNlZGVkIGJ5IGENCi0JICogPGNvZGU+bmV3PC9jb2RlPiBrZXl3b3JkLiBUaGUgPGNvZGU+c3RhcnQ8L2NvZGU+IG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgdHlwZSBuYW1lLCBhbmQNCi0JICogYmVmb3JlIGFueSBnZW5lcmljIHNpZ25hdHVyZSBvciBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgbGlzdC4gVGhlIGhldXJpc3RpYyB3aWxsIHJldHVybg0KLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5zdGFydDwvY29kZT4gaXMgYXQgdGhlIGZvbGxvd2luZyBwb3NpdGlvbnMgKHwpOg0KLQkgKg0KLQkgKiA8cHJlPg0KLQkgKiAgbmV3IGphdmEudXRpbC4gQXJyYXlMaXN0fCZsdDtTdHJpbmcmZ3Q7KDEwKQ0KLQkgKiAgbmV3IEFycmF5TGlzdCB8KDEwKQ0KLQkgKiAgbmV3ICAvICogY29tbWVudCAgKiAvIEFycmF5TGlzdCB8KDEwKQ0KLQkgKiA8L3ByZT4NCi0JICoNCi0JICogYnV0IG5vdCB0aGUgZm9sbG93aW5nOg0KLQkgKg0KLQkgKiA8cHJlPg0KLQkgKiAgbmV3IGphdmEudXRpbC4gQXJyYXlMaXN0Jmx0O1N0cmluZyZndDsoMTApfA0KLQkgKiAgbmV3IGphdmEudXRpbC4gQXJyYXlMaXN0Jmx0O1N0cmluZyZndDt8KDEwKQ0KLQkgKiAgbmV3IEFycmF5TGlzdCAoMTApfA0KLQkgKiAgQXJyYXlMaXN0IHwoMTApDQotCSAqIDwvcHJlPg0KLQkgKg0KLQkgKiBAcGFyYW0gc3RhcnQgdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSB0eXBlIG5hbWUgb2YgdGhlIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIHN1cHBvc2VkbHkgZW5kcw0KLQkgKiBAcGFyYW0gYm91bmQgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90IGNvbnNpZGVyIGFueSBtb3JlLCB3aXRoDQotCSAqICAgICAgICA8Y29kZT5ib3VuZDwvY29kZT4gJmx0OyA8Y29kZT5zdGFydDwvY29kZT4sIG9yIDxjb2RlPlVOQk9VTkQ8L2NvZGU+DQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gbG9va3MgbGlrZSBhZnRlciB0aGUgdHlwZSBuYW1lIG9mIGEgY2xhc3MNCi0JICogICAgICAgICBpbnN0YW5jZSBjcmVhdGlvbg0KLQkgKiBAc2luY2UgMy4yDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBsb29rc0xpa2VDbGFzc0luc3RhbmNlQ3JlYXRpb25CYWNrd2FyZChpbnQgc3RhcnQsIGludCBib3VuZCkgew0KLQkJaW50IHRva2VuPSBwcmV2aW91c1Rva2VuKHN0YXJ0IC0gMSwgYm91bmQpOw0KLQkJaWYgKHRva2VuID09IFN5bWJvbHMuVG9rZW5JREVOVCkgeyAvLyB0eXBlIG5hbWUNCi0JCQl0b2tlbj0gcHJldmlvdXNUb2tlbihnZXRQb3NpdGlvbigpLCBib3VuZCk7DQotCQkJd2hpbGUgKHRva2VuID09IFN5bWJvbHMuVG9rZW5PVEhFUikgeyAvLyBkb3Qgb2YgcXVhbGlmaWNhdGlvbg0KLQkJCQl0b2tlbj0gcHJldmlvdXNUb2tlbihnZXRQb3NpdGlvbigpLCBib3VuZCk7DQotCQkJCWlmICh0b2tlbiAhPSBTeW1ib2xzLlRva2VuSURFTlQpIC8vIHF1YWxpZmljYXRpb24gbmFtZQ0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQl0b2tlbj0gcHJldmlvdXNUb2tlbihnZXRQb3NpdGlvbigpLCBib3VuZCk7DQotCQkJfQ0KLQkJCXJldHVybiB0b2tlbiA9PSBTeW1ib2xzLlRva2VuTkVXOw0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPmlkZW50aWZpZXI8L2NvZGU+IGlzIHByb2JhYmx5IGENCi0JICogdHlwZSB2YXJpYWJsZSBvciB0eXBlIG5hbWUsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyByYXRoZXIgbm90Lg0KLQkgKiBUaGlzIGlzIGEgaGV1cmlzdGljLg0KLQkgKg0KLQkgKiBAcGFyYW0gaWRlbnRpZmllciB0aGUgaWRlbnRpZmllciB0byBjaGVjaw0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPmlkZW50aWZpZXI8L2NvZGU+IGlzIHByb2JhYmx5IGENCi0JICogICAgICAgICB0eXBlIHZhcmlhYmxlIG9yIHR5cGUgbmFtZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdA0KLQkgKiBAc2luY2UgMy4yDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHZW5lcmljU3RhcnRlcihDaGFyU2VxdWVuY2UgaWRlbnRpZmllcikgew0KLQkJLyogVGhpcyBoZXVyaXN0aWMgYWxsb3dzIGFueSBpZGVudGlmaWVycyBpZiB0aGV5IHN0YXJ0IHdpdGggYW4gdXBwZXINCi0JCSAqIGNhc2UuIFRoaXMgd2lsbCBmYWlsIHdoZW4gYSBjb21wYXJpc29uIGlzIG1hZGUgd2l0aCBjb25zdGFudHM6DQotCQkgKg0KLQkJICogaWYgKE1BWCA+IGZvbykNCi0JCSAqDQotCQkgKiB3aWxsIHRyeSB0byBmaW5kIHRoZSBtYXRjaGluZyAnPCcgd2hpY2ggd2lsbCBuZXZlciBjb21lDQotCQkgKg0KLQkJICogQWxzbywgaXQgd2lsbCBmYWlsIG9uIGxvd2VyIGNhc2UgdHlwZXMgYW5kIHR5cGUgdmFyaWFibGVzDQotCQkgKi8NCi0JCWludCBsZW5ndGg9IGlkZW50aWZpZXIubGVuZ3RoKCk7DQotCQlpZiAobGVuZ3RoID4gMCAmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoaWRlbnRpZmllci5jaGFyQXQoMCkpKSB7DQotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQotCQkJCWlmIChpZGVudGlmaWVyLmNoYXJBdChpKSA9PSAnXycpDQotCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0phdmFQYWlyTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RleHQvSmF2YVBhaXJNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNmZmZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RleHQvSmF2YVBhaXJNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXI7Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIG1hdGNoIHBhaXJzIG9mIGNoYXJhY3RlcnMuCi0gKgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQgc28gd2UgZG9uJ3QgaGF2ZSB0bwotICogZGVwZW5kIG9uIHRoZSBvcmcuZWNsaXBzZS5qZHQudWkgcGx1Z2luLgotICogCi0gKiBObyBtb2RpZmljYXRpb25zIHdlcmUgbWFkZS4KLSAqLwotY2xhc3MgSmF2YVBhaXJNYXRjaGVyIGltcGxlbWVudHMgSUNoYXJhY3RlclBhaXJNYXRjaGVyIHsKLQotCXByb3RlY3RlZCBjaGFyW10gZlBhaXJzOwotCXByb3RlY3RlZCBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByb3RlY3RlZCBpbnQgZk9mZnNldDsKLQotCXByb3RlY3RlZCBpbnQgZlN0YXJ0UG9zOwotCXByb3RlY3RlZCBpbnQgZkVuZFBvczsKLQlwcm90ZWN0ZWQgaW50IGZBbmNob3I7Ci0KLQlwcm90ZWN0ZWQgSmF2YUNvZGVSZWFkZXIgZlJlYWRlciA9IG5ldyBKYXZhQ29kZVJlYWRlcigpOwotCi0KLQlwdWJsaWMgSmF2YVBhaXJNYXRjaGVyKGNoYXJbXSBwYWlycykgewotCQlmUGFpcnMgPSBwYWlyczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjbWF0Y2gob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBtYXRjaChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCi0JCWlmIChmT2Zmc2V0IDwgMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCAmJiBtYXRjaFBhaXJzQXQoKSAmJiBmU3RhcnRQb3MgIT0gZkVuZFBvcykKLQkJCXJldHVybiBuZXcgUmVnaW9uKGZTdGFydFBvcywgZkVuZFBvcyAtIGZTdGFydFBvcyArIDEpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNnZXRBbmNob3IoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QW5jaG9yKCkgewotCQlyZXR1cm4gZkFuY2hvcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY2xlYXIoKTsKLQkJZkRvY3VtZW50ID0gbnVsbDsKLQkJZlJlYWRlciA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNjbGVhcigpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWlmIChmUmVhZGVyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZlJlYWRlci5jbG9zZSgpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoUGFpcnNBdCgpIHsKLQotCQlpbnQgaTsKLQkJaW50IHBhaXJJbmRleDEgPSBmUGFpcnMubGVuZ3RoOwotCQlpbnQgcGFpckluZGV4MiA9IGZQYWlycy5sZW5ndGg7Ci0KLQkJZlN0YXJ0UG9zID0gLTE7Ci0JCWZFbmRQb3MgPSAtMTsKLQotCQkvLyBnZXQgdGhlIGNoYXJzIHByZWNlZGluZyBhbmQgZm9sbG93aW5nIHRoZSBzdGFydCBwb3NpdGlvbgotCQl0cnkgewotCi0JCQljaGFyIHByZXZDaGFyID0gZkRvY3VtZW50LmdldENoYXIoTWF0aC5tYXgoZk9mZnNldCAtIDEsIDApKTsKLQkJCS8vIG1vZGlmaWVkIGJlaGF2aW9yIGZvciBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2ODc5CQkJCi0JCQkvLwkJCWNoYXIgbmV4dENoYXI9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCi0JCQkvLyBzZWFyY2ggZm9yIG9wZW5pbmcgcGVlciBjaGFyYWN0ZXIgbmV4dCB0byB0aGUgYWN0aXZhdGlvbiBwb2ludAotCQkJZm9yIChpID0gMDsgaSA8IGZQYWlycy5sZW5ndGg7IGkgPSBpICsgMikgewotCQkJCS8vCQkJCWlmIChuZXh0Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkvLwkJCQkJZlN0YXJ0UG9zPSBmT2Zmc2V0OwotCQkJCS8vCQkJCQlwYWlySW5kZXgxPSBpOwotCQkJCS8vCQkJCX0gZWxzZSAKLQkJCQlpZiAocHJldkNoYXIgPT0gZlBhaXJzW2ldKSB7Ci0JCQkJCWZTdGFydFBvcyA9IGZPZmZzZXQgLSAxOwotCQkJCQlwYWlySW5kZXgxID0gaTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHNlYXJjaCBmb3IgY2xvc2luZyBwZWVyIGNoYXJhY3RlciBuZXh0IHRvIHRoZSBhY3RpdmF0aW9uIHBvaW50Ci0JCQlmb3IgKGkgPSAxOyBpIDwgZlBhaXJzLmxlbmd0aDsgaSA9IGkgKyAyKSB7Ci0JCQkJaWYgKHByZXZDaGFyID09IGZQYWlyc1tpXSkgewotCQkJCQlmRW5kUG9zID0gZk9mZnNldCAtIDE7Ci0JCQkJCXBhaXJJbmRleDIgPSBpOwotCQkJCX0KLQkJCQkvLwkJCQllbHNlIGlmIChuZXh0Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkvLwkJCQkJZkVuZFBvcz0gZk9mZnNldDsKLQkJCQkvLwkJCQkJcGFpckluZGV4Mj0gaTsKLQkJCQkvLwkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChmRW5kUG9zID4gLTEpIHsKLQkJCQlmQW5jaG9yID0gUklHSFQ7Ci0JCQkJZlN0YXJ0UG9zID0gc2VhcmNoRm9yT3BlbmluZ1BlZXIoZkVuZFBvcywgZlBhaXJzW3BhaXJJbmRleDIgLSAxXSwgZlBhaXJzW3BhaXJJbmRleDJdLCBmRG9jdW1lbnQpOwotCQkJCWlmIChmU3RhcnRQb3MgPiAtMSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZQotCQkJCQlmRW5kUG9zID0gLTE7Ci0JCQl9Ci0JCQllbHNlIGlmIChmU3RhcnRQb3MgPiAtMSkgewotCQkJCWZBbmNob3IgPSBMRUZUOwotCQkJCWZFbmRQb3MgPSBzZWFyY2hGb3JDbG9zaW5nUGVlcihmU3RhcnRQb3MsIGZQYWlyc1twYWlySW5kZXgxXSwgZlBhaXJzW3BhaXJJbmRleDEgKyAxXSwgZkRvY3VtZW50KTsKLQkJCQlpZiAoZkVuZFBvcyA+IC0xKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCWZTdGFydFBvcyA9IC0xOwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBpbnQgc2VhcmNoRm9yQ2xvc2luZ1BlZXIoaW50IG9mZnNldCwgaW50IG9wZW5pbmdQZWVyLCBpbnQgY2xvc2luZ1BlZXIsIElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlmUmVhZGVyLmNvbmZpZ3VyZUZvcndhcmRSZWFkZXIoZG9jdW1lbnQsIG9mZnNldCArIDEsIGRvY3VtZW50LmdldExlbmd0aCgpLCB0cnVlLCB0cnVlKTsKLQotCQlpbnQgc3RhY2sgPSAxOwotCQlpbnQgYyA9IGZSZWFkZXIucmVhZCgpOwotCQl3aGlsZSAoYyAhPSBKYXZhQ29kZVJlYWRlci5FT0YpIHsKLQkJCWlmIChjID09IG9wZW5pbmdQZWVyICYmIGMgIT0gY2xvc2luZ1BlZXIpCi0JCQkJc3RhY2srKzsKLQkJCWVsc2UgaWYgKGMgPT0gY2xvc2luZ1BlZXIpCi0JCQkJc3RhY2stLTsKLQotCQkJaWYgKHN0YWNrID09IDApCi0JCQkJcmV0dXJuIGZSZWFkZXIuZ2V0T2Zmc2V0KCk7Ci0KLQkJCWMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IHNlYXJjaEZvck9wZW5pbmdQZWVyKGludCBvZmZzZXQsIGludCBvcGVuaW5nUGVlciwgaW50IGNsb3NpbmdQZWVyLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJZlJlYWRlci5jb25maWd1cmVCYWNrd2FyZFJlYWRlcihkb2N1bWVudCwgb2Zmc2V0LCB0cnVlLCB0cnVlKTsKLQotCQlpbnQgc3RhY2sgPSAxOwotCQlpbnQgYyA9IGZSZWFkZXIucmVhZCgpOwotCQl3aGlsZSAoYyAhPSBKYXZhQ29kZVJlYWRlci5FT0YpIHsKLQkJCWlmIChjID09IGNsb3NpbmdQZWVyICYmIGMgIT0gb3BlbmluZ1BlZXIpCi0JCQkJc3RhY2srKzsKLQkJCWVsc2UgaWYgKGMgPT0gb3BlbmluZ1BlZXIpCi0JCQkJc3RhY2stLTsKLQotCQkJaWYgKHN0YWNrID09IDApCi0JCQkJcmV0dXJuIGZSZWFkZXIuZ2V0T2Zmc2V0KCk7Ci0KLQkJCWMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGV4dC9TeW1ib2xzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGV4dC9TeW1ib2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MWU5OWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RleHQvU3ltYm9scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRleHQ7DQotDQotLy90YWtlbiBmcm9tIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQ7DQotDQotaW50ZXJmYWNlIFN5bWJvbHMgew0KLQlpbnQgVG9rZW5FT0YgPSAtMTsNCi0JaW50IFRva2VuTEJSQUNFID0gMTsNCi0JaW50IFRva2VuUkJSQUNFID0gMjsNCi0JaW50IFRva2VuTEJSQUNLRVQgPSAzOw0KLQlpbnQgVG9rZW5SQlJBQ0tFVCA9IDQ7DQotCWludCBUb2tlbkxQQVJFTiA9IDU7DQotCWludCBUb2tlblJQQVJFTiA9IDY7DQotCWludCBUb2tlblNFTUlDT0xPTiA9IDc7DQotCWludCBUb2tlbk9USEVSID0gODsNCi0JaW50IFRva2VuQ09MT04gPSA5Ow0KLQlpbnQgVG9rZW5RVUVTVElPTk1BUksgPSAxMDsNCi0JaW50IFRva2VuQ09NTUEgPSAxMTsNCi0JaW50IFRva2VuRVFVQUwgPSAxMjsNCi0JaW50IFRva2VuTEVTU1RIQU4gPSAxMzsNCi0JaW50IFRva2VuR1JFQVRFUlRIQU4gPSAxNDsNCi0JaW50IFRva2VuU1FVT1RFID0gMTU7DQotCWludCBUb2tlbkRRVU9URSA9IDE2Ow0KLQlpbnQgVG9rZW5JRiA9IDEwOTsNCi0JaW50IFRva2VuRE8gPSAxMDEwOw0KLQlpbnQgVG9rZW5GT1IgPSAxMDExOw0KLQlpbnQgVG9rZW5UUlkgPSAxMDEyOw0KLQlpbnQgVG9rZW5DQVNFID0gMTAxMzsNCi0JaW50IFRva2VuRUxTRSA9IDEwMTQ7DQotCWludCBUb2tlbkJSRUFLID0gMTAxNTsNCi0JaW50IFRva2VuQ0FUQ0ggPSAxMDE2Ow0KLQlpbnQgVG9rZW5XSElMRSA9IDEwMTc7DQotCWludCBUb2tlblJFVFVSTiA9IDEwMTg7DQotCWludCBUb2tlblNUQVRJQyA9IDEwMTk7DQotCWludCBUb2tlblNXSVRDSCA9IDEwMjA7DQotCWludCBUb2tlbkZJTkFMTFkgPSAxMDIxOw0KLQlpbnQgVG9rZW5TWU5DSFJPTklaRUQgPSAxMDIyOw0KLQlpbnQgVG9rZW5HT1RPID0gMTAyMzsNCi0JaW50IFRva2VuREVGQVVMVCA9IDEwMjQ7DQotCWludCBUb2tlbk5FVyA9IDEwMjU7DQotCWludCBUb2tlbkNMQVNTID0gMTAyNjsNCi0JaW50IFRva2VuSU5URVJGQUNFID0gMTAyNzsNCi0JaW50IFRva2VuRU5VTSA9IDEwMjg7DQotCWludCBUb2tlbklERU5UID0gMjAwMDsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vSFRNTFZhbGlkYXRpb25SZXBvcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vSFRNTFZhbGlkYXRpb25SZXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGZhYmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uUmVwb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuRXJyb3JJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvblJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKgotICogQ29waWVkIGZyb20ganNwLmNvcmUncyBIVE1MVmFsaWRhdGlvblJlcG9ydGVyCi0gKi8KLWNsYXNzIEhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIgaW1wbGVtZW50cyBWYWxpZGF0aW9uUmVwb3J0ZXIgewotCXByaXZhdGUgSVZhbGlkYXRvciBvd25lciA9IG51bGw7Ci0JcHJpdmF0ZSBJUmVwb3J0ZXIgcmVwb3J0ZXIgPSBudWxsOwotCXByaXZhdGUgSUZpbGUgZmlsZSA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQlwcml2YXRlIE1lc3NhZ2VGYWN0b3J5IGZGYWN0b3J5ID0gbnVsbDsKLQkKLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTFZhbGlkYXRpb25SZXBvcnRlcihJVmFsaWRhdG9yIG93bmVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLnJlcG9ydGVyID0gcmVwb3J0ZXI7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJZkZhY3RvcnkgPSBuZXcgTWVzc2FnZUZhY3RvcnkoZmlsZSAhPSBudWxsID8gZmlsZS5nZXRQcm9qZWN0KCkgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHRoaXMuZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICh0aGlzLnJlcG9ydGVyICE9IG51bGwpIHsKLQkJCXRoaXMucmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcy5vd25lciwgdGhpcy5maWxlKTsKLQkJfQotCQkKLQl9Ci0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9ydChWYWxpZGF0aW9uTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWlmIChtZXNzYWdlID09IG51bGwgfHwgdGhpcy5maWxlID09IG51bGwgfHwgbWVzc2FnZS5nZXRTZXZlcml0eSgpID09IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkKLQkJCXJldHVybjsKLQkJSU1lc3NhZ2UgbWVzID0gdHJhbnNsYXRlTWVzc2FnZShtZXNzYWdlKTsKLQotCQlpZiAodGhpcy5yZXBvcnRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcy5vd25lciwgbWVzKTsKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2xhdGUgVmFsaWRhdGlvbk1lc3NhZ2UgdG8gSU1lc3NhZ2UgYW5kIGdlbmVyYXRlIHJlc3VsdCBsb2cKLQkgKi8KLQlwcml2YXRlIElNZXNzYWdlIHRyYW5zbGF0ZU1lc3NhZ2UoVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSkgewotCQlpbnQgc2V2ZXJpdHkgPSBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7Ci0JCXN3aXRjaCAobWVzc2FnZS5nZXRTZXZlcml0eSgpKSB7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5JTkZPUk1BVElPTiA6Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCi0JCUlNZXNzYWdlIG1lcyA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKHNldmVyaXR5LCBtZXNzYWdlLmdldE1lc3NhZ2UoKSwgdGhpcy5maWxlKTsKLQkJbWVzLnNldE9mZnNldChtZXNzYWdlLmdldE9mZnNldCgpKTsKLQkJbWVzLnNldExlbmd0aChtZXNzYWdlLmdldExlbmd0aCgpKTsKLQkJaWYgKHRoaXMubW9kZWwgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBmbGF0TW9kZWwgPSB0aGlzLm1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKGZsYXRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaW50IGxpbmUgPSBmbGF0TW9kZWwuZ2V0TGluZU9mT2Zmc2V0KG1lc3NhZ2UuZ2V0T2Zmc2V0KCkpOwotCQkJCW1lcy5zZXRMaW5lTm8obGluZSArIDEpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1lczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXBvcnQoRXJyb3JJbmZvIGluZm8pIHsKLQkJcmVwb3J0KGZGYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoaW5mbykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEFjdGlvblNvdXJjZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQQWN0aW9uU291cmNlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYjIwZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQQWN0aW9uU291cmNlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5KU1BGQ29udGVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSlNQQWN0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUENvbnRlbnRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkZpbGVCdWZmZXJNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLklTb3VyY2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUHJvamVjdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotCi0vKioKLSAqIFNvdXJjZSB2YWxpZGF0b3IgKGFibGUgdG8gY2hlY2sgcGFydGlhbCBkb2N1bWVudCkgdGhhdCBjaGVja3MgZm9yOiAtCi0gKiBtaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZXMgJiB1bmRlZmluZWQgYXR0cmlidXRlcyBpbiBqc3AgYWN0aW9uIHRhZ3Mgc3VjaAotICogYXMganNwIGRpcmVjdGl2ZXMgYW5kIGpzcCBjdXN0b20gdGFncwotICovCi1wdWJsaWMgY2xhc3MgSlNQQWN0aW9uU291cmNlVmFsaWRhdG9yIGV4dGVuZHMgSlNQQWN0aW9uVmFsaWRhdG9yIGltcGxlbWVudHMgSVNvdXJjZVZhbGlkYXRvciB7Ci0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgYm9vbGVhbiBmRW5hYmxlU291cmNlVmFsaWRhdGlvbjsKLQlwcml2YXRlIElDb250ZW50VHlwZSBmSlNQRkNvbnRlbnRUeXBlID0gbnVsbDsKLQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCi0JCS8vIHNwZWNpYWwgY2hlY2tzIHRvIHNlZSBzb3VyY2UgdmFsaWRhdGlvbiBzaG91bGQgcmVhbGx5IGV4ZWN1dGUKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCS8vIFRoZSBiYXNlTG9jYXRpb24gbWF5IGJlIGEgcGF0aCBvbiBkaXNrIG9yIHJlbGF0aXZlIHRvIHRoZQotCQkJCS8vIHdvcmtzcGFjZSByb290LiBEb24ndCB0cmFuc2xhdGUgb24tZGlzayBwYXRocyB0bwotCQkJCS8vIGluLXdvcmtzcGFjZSByZXNvdXJjZXMuCi0JCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOwotCQkJCWlmIChiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShiYXNlUGF0aCk7Ci0JCQkJCS8qCi0JCQkJCSAqIElmIHRoZSBJRmlsZSBkb2Vzbid0IGV4aXN0LCBtYWtlIHN1cmUgaXQncyBub3QgcmV0dXJuZWQKLQkJCQkJICovCi0JCQkJCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCQkJCWZpbGUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJZkVuYWJsZVNvdXJjZVZhbGlkYXRpb24gPSAoZmlsZSAhPSBudWxsICYmIGlzQmF0Y2hWYWxpZGF0b3JQcmVmZXJlbmNlRW5hYmxlZChmaWxlKSAmJiBzaG91bGRWYWxpZGF0ZShmaWxlKSAmJiBmcmFnbWVudENoZWNrKGZpbGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlmRG9jdW1lbnQgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElSZWdpb24gZGlydHlSZWdpb24sIElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoaGVscGVyID09IG51bGwgfHwgZkRvY3VtZW50ID09IG51bGwgfHwgIWZFbmFibGVTb3VyY2VWYWxpZGF0aW9uKQotCQkJcmV0dXJuOwotCi0JCWlmICgocmVwb3J0ZXIgIT0gbnVsbCkgJiYgKHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgPT0gdHJ1ZSkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdHJ5IHsKLQkJCUlUZXh0RmlsZUJ1ZmZlciBmYiA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRCdWZmZXIoZkRvY3VtZW50KTsKLQkJCWlmIChmYiA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmIuZ2V0TG9jYXRpb24oKSk7Ci0JCQlpZiAoZmlsZSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpKQotCQkJCXJldHVybjsKLQkJCXBlcmZvcm1WYWxpZGF0aW9uKGZpbGUsIHJlcG9ydGVyLCBtb2RlbCwgZGlydHlSZWdpb24pOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGN1cnJlbnQgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIGJhc2VkIG9uIGN1cnJlbnQgcHJvamVjdCAod2hpY2gKLQkgKiBpcyBiYXNlZCBvbiBjdXJyZW50IGRvY3VtZW50KSBvciBnbG9iYWwgY29uZmlndXJhdGlvbiBpZiBwcm9qZWN0IGRvZXMKLQkgKiBub3Qgb3ZlcnJpZGUKLQkgKiAKLQkgKiBAcmV0dXJuIFZhbGlkYXRpb25Db25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBnZXRWYWxpZGF0aW9uQ29uZmlndXJhdGlvbihJRmlsZSBmaWxlKSB7Ci0JCVZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBudWxsOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJvamVjdENvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQkJCWNvbmZpZ3VyYXRpb24gPSBwcm9qZWN0Q29uZmlndXJhdGlvbjsKLQkJCQkJaWYgKHByb2plY3RDb25maWd1cmF0aW9uID09IG51bGwgfHwgcHJvamVjdENvbmZpZ3VyYXRpb24udXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0JCQkJCQljb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdmFsaWRhdG9yIGlzIGVuYWJsZWQgYWNjb3JkaW5nIGluIFZhbGlkYXRpb24gcHJlZmVyZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gdm1kCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0JhdGNoVmFsaWRhdG9yUHJlZmVyZW5jZUVuYWJsZWQoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0JCVZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBnZXRWYWxpZGF0aW9uQ29uZmlndXJhdGlvbihmaWxlKTsKLQkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGEgbWV0YWRhdGEgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoSlNQQ29udGVudFZhbGlkYXRvci5jbGFzcy5nZXROYW1lKCkpOwotCQkJaWYgKG1ldGFkYXRhICE9IG51bGwpIHsKLQkJCQlpZiAoIWNvbmZpZ3VyYXRpb24uaXNCdWlsZEVuYWJsZWQobWV0YWRhdGEpICYmICFjb25maWd1cmF0aW9uLmlzTWFudWFsRW5hYmxlZChtZXRhZGF0YSkpCi0JCQkJCWVuYWJsZWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgZmlsZSBpcyBhIGpzcCBmcmFnbWVudCBvciBub3QuIElmIHNvLCBjaGVjayBpZiB0aGUgZnJhZ21lbnQKLQkgKiBzaG91bGQgYmUgdmFsaWRhdGVkIG9yIG5vdC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgQXNzdW1lcyBzaG91bGRWYWxpZGF0ZSB3YXMgYWxyZWFkeSBjYWxsZWQgb24gZmlsZSBzbyBpdAotCSAqICAgICAgICAgICAgc2hvdWxkIG5vdCBiZSBudWxsIGFuZCBkb2VzIGV4aXN0Ci0JICogQHJldHVybiBmYWxzZSBpZiBmaWxlIGlzIGEgZnJhZ21lbnQgYW5kIGl0IHNob3VsZCBub3QgYmUgdmFsaWRhdGVkLAotCSAqICAgICAgICAgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZnJhZ21lbnRDaGVjayhJRmlsZSBmaWxlKSB7Ci0JCS8vIGNvcGllZCBmcm9tIEpTUFZhbGlkYXRvcgotCQlib29sZWFuIHNob3VsZFZhbGlkYXRlID0gdHJ1ZTsKLQkJLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgcG9zc2libHkgYSBqc3AgZnJhZ21lbnQKLQkJaWYgKGdldEpTUEZDb250ZW50VHlwZSgpLmlzQXNzb2NpYXRlZFdpdGgoZmlsZS5nZXROYW1lKCkpKSB7Ci0JCQkvLyBnZXQgcHJlZmVyZW5jZSBmb3IgdmFsaWRhdGUganNwIGZyYWdtZW50cwotCQkJYm9vbGVhbiBzaG91bGRWYWxpZGF0ZUZyYWdtZW50cyA9IEJvb2xlYW4udmFsdWVPZihKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLlZBTElEQVRFX0ZSQUdNRU5UUywgZmlsZSwgdHJ1ZSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJLyoKLQkJCSAqIGlmIGpzcCBmcmFnbWVudHMgc2hvdWxkIG5vdCBiZSB2YWxpZGF0ZWQsIGNoZWNrIGlmIGZpbGUgaXMKLQkJCSAqIHJlYWxseSBqc3AgZnJhZ21lbnQKLQkJCSAqLwotCQkJaWYgKCFzaG91bGRWYWxpZGF0ZUZyYWdtZW50cykgewotCQkJCWJvb2xlYW4gaXNGcmFnbWVudCA9IGlzRnJhZ21lbnQoZmlsZSk7Ci0JCQkJc2hvdWxkVmFsaWRhdGUgPSAhaXNGcmFnbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2hvdWxkVmFsaWRhdGU7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBmaWxlIGlzIGpzcCBmcmFnbWVudCBvciBub3QgKGRvZXMgYSBkZWVwLCBpbmRlcHRoIGNoZWNrLAotCSAqIGxvb2tpbmcgaW50byBjb250ZW50cyBvZiBmaWxlKQotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhc3N1bWVzIGZpbGUgaXMgbm90IG51bGwgYW5kIGV4aXN0cwotCSAqIEByZXR1cm4gdHJ1ZSBpZiBmaWxlIGlzIGpzcCBmcmFnbWVudCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRnJhZ21lbnQoSUZpbGUgZmlsZSkgewotCQkvLyBjb3BpZWQgZnJvbSBKU1BWYWxpZGF0b3IKLQkJYm9vbGVhbiBpc0ZyYWdtZW50ID0gZmFsc2U7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCS8vIGl0IGNhbiBiZSBudWxsCi0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCQlpcyA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQljb250ZW50RGVzY3JpcHRpb24gPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXREZXNjcmlwdGlvbkZvcihpcywgZmlsZS5nZXROYW1lKCksIG5ldyBRdWFsaWZpZWROYW1lW117SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUfSk7Ci0JCQl9Ci0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZmlsZUN0SWQgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKS5nZXRJZCgpOwotCQkJCWlzRnJhZ21lbnQgPSAoZmlsZUN0SWQgIT0gbnVsbCAmJiBDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQRlJBR01FTlQuZXF1YWxzKGZpbGVDdElkKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZSwgYXNzdW1lIGl0J3MgaW52YWxpZCBKU1AKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUsIGFzc3VtZSBpdCdzIGludmFsaWQgSlNQCi0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBtdXN0IGNsb3NlIGlucHV0IHN0cmVhbSBpbiBjYXNlIG90aGVycyBuZWVkIGl0Ci0JCQlpZiAoaXMgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlpcy5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm90IHN1cmUgaG93IHRvIHJlY292ZXIgYXQgdGhpcyBwb2ludAotCQkJCX0KLQkJfQotCQlyZXR1cm4gaXNGcmFnbWVudDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSUZpbGUgZmlsZSkgewotCQkvLyBjb3BpZWQgZnJvbSBKU1BWYWxpZGF0b3IKLQkJSVJlc291cmNlIHJlc291cmNlID0gZmlsZTsKLQkJZG8gewotCQkJaWYgKHJlc291cmNlLmlzRGVyaXZlZCgpIHx8IHJlc291cmNlLmlzVGVhbVByaXZhdGVNZW1iZXIoKSB8fCAhcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkgfHwgcmVzb3VyY2UuZ2V0TmFtZSgpLmNoYXJBdCgwKSA9PSAnLicpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXNvdXJjZSA9IHJlc291cmNlLmdldFBhcmVudCgpOwotCQl9Ci0JCXdoaWxlICgocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLlBST0pFQ1QpID09IDApOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIEpTUCBmcmFnbWVudCBjb250ZW50IHR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuIGpzcGYgY29udGVudCB0eXBlCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZ2V0SlNQRkNvbnRlbnRUeXBlKCkgewotCQkvLyBjb3BpZWQgZnJvbSBKU1BWYWxpZGF0b3IKLQkJaWYgKGZKU1BGQ29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJZkpTUEZDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BGUkFHTUVOVCk7Ci0JCX0KLQkJcmV0dXJuIGZKU1BGQ29udGVudFR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQQ29udGVudFNvdXJjZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQQ29udGVudFNvdXJjZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmJkODkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUENvbnRlbnRTb3VyY2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkpTUEZDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KU1BDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLkhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkZpbGVCdWZmZXJNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuSVNvdXJjZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8qKgotICogU291cmNlIHZhbGlkYXRvciBmb3IgSlNQIGNvbnRlbnQuIFRoaXMgdmFsaWRhdG9yIGN1cnJlbnRseSBvbmx5IHZhbGlkYXRlcwotICogaHRtbCBjb250ZW50IGluIGpzcC4KLSAqLwotcHVibGljIGNsYXNzIEpTUENvbnRlbnRTb3VyY2VWYWxpZGF0b3IgZXh0ZW5kcyBKU1BDb250ZW50VmFsaWRhdG9yIGltcGxlbWVudHMgSVNvdXJjZVZhbGlkYXRvciB7Ci0JLyoKLQkgKiBNb3N0IG9mIHRoaXMgY2xhc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBJU291cmNlVmFsaWRhdG9yIGFzcGVjdHMgb2YKLQkgKiBodG1sLnVpJ3MgSFRNTFZhbGlkYXRvcgotCSAqLwotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIGJvb2xlYW4gZkVuYWJsZVNvdXJjZVZhbGlkYXRpb247Ci0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkpTUEZDb250ZW50VHlwZSA9IG51bGw7Ci0KLQlwdWJsaWMgdm9pZCBjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQotCQkvLyBzcGVjaWFsIGNoZWNrcyB0byBzZWUgc291cmNlIHZhbGlkYXRpb24gc2hvdWxkIHJlYWxseSBleGVjdXRlCi0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCQkvLyBUaGUgYmFzZUxvY2F0aW9uIG1heSBiZSBhIHBhdGggb24gZGlzayBvciByZWxhdGl2ZSB0byB0aGUKLQkJCQkvLyB3b3Jrc3BhY2Ugcm9vdC4gRG9uJ3QgdHJhbnNsYXRlIG9uLWRpc2sgcGF0aHMgdG8KLQkJCQkvLyBpbi13b3Jrc3BhY2UgcmVzb3VyY2VzLgotCQkJCUlQYXRoIGJhc2VQYXRoID0gbmV3IFBhdGgoYmFzZUxvY2F0aW9uKTsKLQkJCQlpZiAoYmFzZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCWZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoYmFzZVBhdGgpOwotCQkJCQkvKgotCQkJCQkgKiBJZiB0aGUgSUZpbGUgZG9lc24ndCBleGlzdCwgbWFrZSBzdXJlIGl0J3Mgbm90IHJldHVybmVkCi0JCQkJCSAqLwotCQkJCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQkJCQlmaWxlID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCWZFbmFibGVTb3VyY2VWYWxpZGF0aW9uID0gKGZpbGUgIT0gbnVsbCAmJiBpc0JhdGNoVmFsaWRhdG9yUHJlZmVyZW5jZUVuYWJsZWQoZmlsZSkgJiYgc2hvdWxkVmFsaWRhdGUoZmlsZSkgJiYgZnJhZ21lbnRDaGVjayhmaWxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJZkRvY3VtZW50ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHZhbGlkYXRlIGNhbGwgaXMgZm9yIHRoZSBJU291cmNlVmFsaWRhdG9yIHBhcnRpYWwgZG9jdW1lbnQKLQkgKiB2YWxpZGF0aW9uIGFwcHJvYWNoCi0JICogCi0JICogQHBhcmFtIGRpcnR5UmVnaW9uCi0JICogQHBhcmFtIGhlbHBlcgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLklTb3VyY2VWYWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJUmVnaW9uIGRpcnR5UmVnaW9uLCBJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKGhlbHBlciA9PSBudWxsIHx8IGZEb2N1bWVudCA9PSBudWxsIHx8ICFmRW5hYmxlU291cmNlVmFsaWRhdGlvbikKLQkJCXJldHVybjsKLQotCQlpZiAoKHJlcG9ydGVyICE9IG51bGwpICYmIChyZXBvcnRlci5pc0NhbmNlbGxlZCgpID09IHRydWUpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCXRyeSB7Ci0KLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQlkb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCX0KLQotCQkJaWYgKGRvY3VtZW50ID09IG51bGwgfHwgIWhhc0hUTUxGZWF0dXJlKGRvY3VtZW50KSkKLQkJCQlyZXR1cm47IC8vIGlnbm9yZQotCi0JCQlJVGV4dEZpbGVCdWZmZXIgZmIgPSBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0QnVmZmVyKGZEb2N1bWVudCk7Ci0JCQlpZiAoZmIgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmIuZ2V0TG9jYXRpb24oKSk7Ci0JCQlpZiAoZmlsZSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpKQotCQkJCXJldHVybjsKLQotCQkJLy8gdGhpcyB3aWxsIGJlIHRoZSB3cm9uZyByZWdpb24gaWYgaXQncyBUZXh0IChpbnN0ZWFkIG9mIEVsZW1lbnQpCi0JCQkvLyB3ZSBkb24ndCBrbm93IGhvdyB0byB2YWxpZGF0ZSBUZXh0Ci0JCQlJbmRleGVkUmVnaW9uIGlyID0gZ2V0Q292ZXJpbmdOb2RlKGRpcnR5UmVnaW9uKTsgLy8gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihkaXJ0eVJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQlpZiAoaXIgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJd2hpbGUgKGlyICE9IG51bGwgJiYgaXIgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJCS8vIGl0J3MgYXNzdW1lZCB0aGF0IHRoaXMgZ2V0cyB0aGUgSW5kZXhlZFJlZ2lvbiB0bwotCQkJCQkvLyB0aGUgcmlnaHQgb2YgdGhlIGVuZCBvZmZzZXQKLQkJCQkJaXIgPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGlyLmdldEVuZE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChpciBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJCQlWYWxpZGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKFZhbGlkYXRpb25BZGFwdGVyKSBmYWN0b3J5LmFkYXB0KChJTm9kZU5vdGlmaWVyKSBpcik7Ci0JCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCQkJaWYgKHJlcG9ydGVyICE9IG51bGwpIHsKLQkJCQkJSFRNTFZhbGlkYXRpb25SZXBvcnRlciByZXAgPSBudWxsOwotCQkJCQlyZXAgPSBnZXRSZXBvcnRlcihyZXBvcnRlciwgZmlsZSwgKElET01Nb2RlbCkgbW9kZWwpOwotCQkJCQlyZXAuY2xlYXIoKTsKLQkJCQkJYWRhcHRlci5zZXRSZXBvcnRlcihyZXApOwotCi0JCQkJCU1lc3NhZ2UgbWVzcyA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpKTsKLQkJCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sodGhpcywgbWVzcyk7Ci0JCQkJfQotCQkJCWFkYXB0ZXIudmFsaWRhdGUoaXIpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEluZGV4ZWRSZWdpb24gZ2V0Q292ZXJpbmdOb2RlKElSZWdpb24gZGlydHlSZWdpb24pIHsKLQotCQlJbmRleGVkUmVnaW9uIGxhcmdlc3RSZWdpb24gPSBudWxsOwotCQlpZiAoZkRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIHJlZ2lvbnMgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudCkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhkaXJ0eVJlZ2lvbi5nZXRPZmZzZXQoKSwgZGlydHlSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJbGFyZ2VzdFJlZ2lvbiA9IGdldExhcmdlc3QocmVnaW9ucyk7Ci0JCX0KLQkJcmV0dXJuIGxhcmdlc3RSZWdpb247Ci0JfQotCi0JcHJpdmF0ZSBJbmRleGVkUmVnaW9uIGdldExhcmdlc3QoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIHNkUmVnaW9ucykgewotCi0JCWlmIChzZFJlZ2lvbnMgPT0gbnVsbCB8fCBzZFJlZ2lvbnMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJbmRleGVkUmVnaW9uIGN1cnJlbnRMYXJnZXN0ID0gZ2V0Q29ycmVzcG9uZGluZ05vZGUoc2RSZWdpb25zWzBdKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZFJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghc2RSZWdpb25zW2ldLmlzRGVsZXRlZCgpKSB7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBjb3JyZXNwb25kaW5nID0gZ2V0Q29ycmVzcG9uZGluZ05vZGUoc2RSZWdpb25zW2ldKTsKLQotCQkJCWlmIChjdXJyZW50TGFyZ2VzdCBpbnN0YW5jZW9mIFRleHQpCi0JCQkJCWN1cnJlbnRMYXJnZXN0ID0gY29ycmVzcG9uZGluZzsKLQotCQkJCWlmIChjb3JyZXNwb25kaW5nICE9IG51bGwpIHsKLQkJCQkJaWYgKCEoY29ycmVzcG9uZGluZyBpbnN0YW5jZW9mIFRleHQpKSB7Ci0JCQkJCQlpZiAoY29ycmVzcG9uZGluZy5nZXRTdGFydE9mZnNldCgpIDw9IGN1cnJlbnRMYXJnZXN0LmdldFN0YXJ0T2Zmc2V0KCkgJiYgY29ycmVzcG9uZGluZy5nZXRFbmRPZmZzZXQoKSA+PSBjdXJyZW50TGFyZ2VzdC5nZXRFbmRPZmZzZXQoKSkKLQkJCQkJCQljdXJyZW50TGFyZ2VzdCA9IGNvcnJlc3BvbmRpbmc7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY3VycmVudExhcmdlc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q29ycmVzcG9uZGluZ05vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlpbmRleGVkUmVnaW9uID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24oc2RSZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNIVE1MRmVhdHVyZShJRE9NRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpIGRvY3VtZW50LmdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBhZGFwdGVyLmhhc0ZlYXR1cmUoSFRNTERvY3VtZW50VHlwZUNvbnN0YW50cy5IVE1MKTsKLQl9Ci0KLQlwcml2YXRlIEhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIgZ2V0UmVwb3J0ZXIoSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJRE9NTW9kZWwgbW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBIVE1MVmFsaWRhdGlvblJlcG9ydGVyKHRoaXMsIHJlcG9ydGVyLCBmaWxlLCBtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBjdXJyZW50IHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBiYXNlZCBvbiBjdXJyZW50IHByb2plY3QgKHdoaWNoCi0JICogaXMgYmFzZWQgb24gY3VycmVudCBkb2N1bWVudCkgb3IgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gaWYgcHJvamVjdCBkb2VzCi0JICogbm90IG92ZXJyaWRlCi0JICogCi0JICogQHJldHVybiBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gZ2V0VmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oSUZpbGUgZmlsZSkgewotCQlWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbnVsbDsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByb2plY3RDb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJCQljb25maWd1cmF0aW9uID0gcHJvamVjdENvbmZpZ3VyYXRpb247Ci0JCQkJCWlmIChwcm9qZWN0Q29uZmlndXJhdGlvbiA9PSBudWxsIHx8IHByb2plY3RDb25maWd1cmF0aW9uLnVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotCQkJCQkJY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHZhbGlkYXRvciBpcyBlbmFibGVkIGFjY29yZGluZyBpbiBWYWxpZGF0aW9uIHByZWZlcmVuY2VzCi0JICogCi0JICogQHBhcmFtIHZtZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNCYXRjaFZhbGlkYXRvclByZWZlcmVuY2VFbmFibGVkKElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCQlWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gZ2V0VmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oZmlsZSk7Ci0JCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhIG1ldGFkYXRhID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKEpTUENvbnRlbnRWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCWlmIChtZXRhZGF0YSAhPSBudWxsKSB7Ci0JCQkJaWYgKCFjb25maWd1cmF0aW9uLmlzQnVpbGRFbmFibGVkKG1ldGFkYXRhKSAmJiAhY29uZmlndXJhdGlvbi5pc01hbnVhbEVuYWJsZWQobWV0YWRhdGEpKQotCQkJCQllbmFibGVkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVuYWJsZWQ7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGZpbGUgaXMgYSBqc3AgZnJhZ21lbnQgb3Igbm90LiBJZiBzbywgY2hlY2sgaWYgdGhlIGZyYWdtZW50Ci0JICogc2hvdWxkIGJlIHZhbGlkYXRlZCBvciBub3QuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIEFzc3VtZXMgc2hvdWxkVmFsaWRhdGUgd2FzIGFscmVhZHkgY2FsbGVkIG9uIGZpbGUgc28gaXQKLQkgKiAgICAgICAgICAgIHNob3VsZCBub3QgYmUgbnVsbCBhbmQgZG9lcyBleGlzdAotCSAqIEByZXR1cm4gZmFsc2UgaWYgZmlsZSBpcyBhIGZyYWdtZW50IGFuZCBpdCBzaG91bGQgbm90IGJlIHZhbGlkYXRlZCwKLQkgKiAgICAgICAgIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZyYWdtZW50Q2hlY2soSUZpbGUgZmlsZSkgewotCQkvLyBjb3BpZWQgZnJvbSBKU1BWYWxpZGF0b3IKLQkJYm9vbGVhbiBzaG91bGRWYWxpZGF0ZSA9IHRydWU7Ci0JCS8vIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIHBvc3NpYmx5IGEganNwIGZyYWdtZW50Ci0JCWlmIChnZXRKU1BGQ29udGVudFR5cGUoKS5pc0Fzc29jaWF0ZWRXaXRoKGZpbGUuZ2V0TmFtZSgpKSkgewotCQkJLy8gZ2V0IHByZWZlcmVuY2UgZm9yIHZhbGlkYXRlIGpzcCBmcmFnbWVudHMKLQkJCWJvb2xlYW4gc2hvdWxkVmFsaWRhdGVGcmFnbWVudHMgPSBCb29sZWFuLnZhbHVlT2YoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEpTUEZDb250ZW50UHJvcGVydGllcy5WQUxJREFURV9GUkFHTUVOVFMsIGZpbGUsIHRydWUpKS5ib29sZWFuVmFsdWUoKTsKLQkJCS8qCi0JCQkgKiBpZiBqc3AgZnJhZ21lbnRzIHNob3VsZCBub3QgYmUgdmFsaWRhdGVkLCBjaGVjayBpZiBmaWxlIGlzCi0JCQkgKiByZWFsbHkganNwIGZyYWdtZW50Ci0JCQkgKi8KLQkJCWlmICghc2hvdWxkVmFsaWRhdGVGcmFnbWVudHMpIHsKLQkJCQlib29sZWFuIGlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50KGZpbGUpOwotCQkJCXNob3VsZFZhbGlkYXRlID0gIWlzRnJhZ21lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNob3VsZFZhbGlkYXRlOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgZmlsZSBpcyBqc3AgZnJhZ21lbnQgb3Igbm90IChkb2VzIGEgZGVlcCwgaW5kZXB0aCBjaGVjaywKLQkgKiBsb29raW5nIGludG8gY29udGVudHMgb2YgZmlsZSkKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgYXNzdW1lcyBmaWxlIGlzIG5vdCBudWxsIGFuZCBleGlzdHMKLQkgKiBAcmV0dXJuIHRydWUgaWYgZmlsZSBpcyBqc3AgZnJhZ21lbnQsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ZyYWdtZW50KElGaWxlIGZpbGUpIHsKLQkJLy8gY29waWVkIGZyb20gSlNQVmFsaWRhdG9yCi0JCWJvb2xlYW4gaXNGcmFnbWVudCA9IGZhbHNlOwotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkvLyBpdCBjYW4gYmUgbnVsbAotCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkJaXMgPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkJY29udGVudERlc2NyaXB0aW9uID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0RGVzY3JpcHRpb25Gb3IoaXMsIGZpbGUuZ2V0TmFtZSgpLCBuZXcgUXVhbGlmaWVkTmFtZVtde0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVH0pOwotCQkJfQotCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGZpbGVDdElkID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCkuZ2V0SWQoKTsKLQkJCQlpc0ZyYWdtZW50ID0gKGZpbGVDdElkICE9IG51bGwgJiYgQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUEZSQUdNRU5ULmVxdWFscyhmaWxlQ3RJZCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUsIGFzc3VtZSBpdCdzIGludmFsaWQgSlNQCi0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlLCBhc3N1bWUgaXQncyBpbnZhbGlkIEpTUAotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gbXVzdCBjbG9zZSBpbnB1dCBzdHJlYW0gaW4gY2FzZSBvdGhlcnMgbmVlZCBpdAotCQkJaWYgKGlzICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vdCBzdXJlIGhvdyB0byByZWNvdmVyIGF0IHRoaXMgcG9pbnQKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIGlzRnJhZ21lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFZhbGlkYXRlKElGaWxlIGZpbGUpIHsKLQkJLy8gY29waWVkIGZyb20gSlNQVmFsaWRhdG9yCi0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGZpbGU7Ci0JCWRvIHsKLQkJCWlmIChyZXNvdXJjZS5pc0Rlcml2ZWQoKSB8fCByZXNvdXJjZS5pc1RlYW1Qcml2YXRlTWVtYmVyKCkgfHwgIXJlc291cmNlLmlzQWNjZXNzaWJsZSgpIHx8IHJlc291cmNlLmdldE5hbWUoKS5jaGFyQXQoMCkgPT0gJy4nKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJfQotCQl3aGlsZSAoKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5QUk9KRUNUKSA9PSAwKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBKU1AgZnJhZ21lbnQgY29udGVudCB0eXBlCi0JICogCi0JICogQHJldHVybiBqc3BmIGNvbnRlbnQgdHlwZQotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGdldEpTUEZDb250ZW50VHlwZSgpIHsKLQkJLy8gY29waWVkIGZyb20gSlNQVmFsaWRhdG9yCi0JCWlmIChmSlNQRkNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWZKU1BGQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQRlJBR01FTlQpOwotCQl9Ci0JCXJldHVybiBmSlNQRkNvbnRlbnRUeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0xvY2FsaXplZE1lc3NhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0xvY2FsaXplZE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY4NmUzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9Mb2NhbGl6ZWRNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotCi0vKioKLSAqIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBNZXNzYWdlIGFsbCB2YWxpZGF0b3JzIGluIHBhY2thZ2UgY2FuIHVzZS4KLSAqLwotY2xhc3MgTG9jYWxpemVkTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2UgewotCXByaXZhdGUgU3RyaW5nIF9tZXNzYWdlID0gbnVsbDsKLQotCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0KSB7Ci0JCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgSVJlc291cmNlIHRhcmdldE9iamVjdCkgewotCQl0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgKE9iamVjdCkgdGFyZ2V0T2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgT2JqZWN0IHRhcmdldE9iamVjdCkgewotCQlzdXBlcihudWxsLCBzZXZlcml0eSwgbnVsbCk7Ci0JCXNldExvY2FsaXplZE1lc3NhZ2UobWVzc2FnZVRleHQpOwotCQlzZXRUYXJnZXRPYmplY3QodGFyZ2V0T2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbGl6ZWRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9tZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBfbWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KENsYXNzTG9hZGVyIGNsKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsLCBDbGFzc0xvYWRlciBjbCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9UTERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9UTERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0NGY1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvVExEQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTFUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMlRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLlhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgVExEQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGV4dGVuZHMgWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIHsKLQotCXByaXZhdGUgY2xhc3MgQ29udGVudExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7Ci0JCUlMYWJlbFByb3ZpZGVyIGZQYXJlbnRQcm92aWRlciA9IG51bGw7Ci0KLQkJQ29udGVudExhYmVsUHJvdmlkZXIoSUxhYmVsUHJvdmlkZXIgcGFyZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJZlBhcmVudFByb3ZpZGVyID0gcGFyZW50OwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZQotCQkgKiBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZQotCQkgKiAuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJZlBhcmVudFByb3ZpZGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZlBhcmVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nIGZpcnN0TGluZU9mKFN0cmluZyB0ZXh0KSB7Ci0JCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPCAxIHx8ICh0ZXh0LmluZGV4T2YoJ1xyJykgPCAwICYmIHRleHQuaW5kZXhPZignXG4nKSA8IDApKSB7Ci0JCQkJcmV0dXJuIHRleHQ7Ci0JCQl9Ci0KLQkJCWludCBzdGFydCA9IDA7Ci0JCQlpbnQgbWF4TGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsKLQkJCXdoaWxlIChzdGFydCA8IG1heExlbmd0aCAmJiB0ZXh0LmNoYXJBdChzdGFydCkgPT0gJ1xyJyB8fCB0ZXh0LmNoYXJBdChzdGFydCkgPT0gJ1xuJykKLQkJCQlzdGFydCsrOwotCQkJaW50IGVuZE4gPSB0ZXh0LmluZGV4T2YoJ1xuJywgc3RhcnQpOwotCQkJaW50IGVuZFIgPSB0ZXh0LmluZGV4T2YoJ1xyJywgc3RhcnQpOwotCQkJLy8gbm8gbW9yZSBsaW5lIGRlbGltaXRlcnMKLQkJCWlmIChlbmROIDwgMCAmJiBlbmRSIDwgMCkgewotCQkJCWlmIChzdGFydCA9PSAwKSB7Ci0JCQkJCS8vIG5vIGxlYWRpbmcgbGluZSBkZWxpbWl0ZXJzLCByZXR1cm4gYXMtaXMKLQkJCQkJcmV0dXJuIHRleHQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBjdXQgbGVhZGluZyBsaW5lIGRlbGltaXRlcnMKLQkJCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKHN0YXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZW5kTiA8IDApIHsKLQkJCQkvKiBubyBcciBjdXQgbGVhZGluZyBsaW5lIGRlbGltaXRlcnMgdXAgdG8gZmlyc3QgXHIgKi8KLQkJCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZFIpOwotCQkJfQotCQkJaWYgKGVuZFIgPCAwKSB7Ci0JCQkJLyogbm8gXHIgY3V0IGxlYWRpbmcgbGluZSBkZWxpbWl0ZXJzIHVwIHRvIGZpcnN0IFxuICovCi0JCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmROKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIEJvdGggXG4gYW5kIFxyLCBjdXQgbGVhZGluZyBsaW5lIGRlbGltaXRlcnMgdXAgdG8gd2hpY2hldmVyIGlzCi0JCQkgKiBmaXJzdAotCQkJICovCi0JCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIE1hdGgubWluKGVuZE4sIGVuZFIpKTsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nIGdldENvbnRhaW5lZFRleHQoTm9kZSBwYXJlbnQpIHsKLQkJCU5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJCWlmIChjaGlsZHJlbi5nZXRMZW5ndGgoKSA9PSAxKSB7Ci0JCQkJcmV0dXJuIGdldFZhbHVlKGNoaWxkcmVuLml0ZW0oMCkpOwotCQkJfQotCQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpIHsKLQkJCQkJU3RyaW5nIHJlZmVyZW5jZSA9ICgoRW50aXR5UmVmZXJlbmNlKSBjaGlsZCkuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCWlmIChyZWZlcmVuY2UgPT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlTmFtZSgpICE9IG51bGwpIHsKLQkJCQkJCXJlZmVyZW5jZSA9ICImIiArIGNoaWxkLmdldE5vZGVOYW1lKCkgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCQkJcy5hcHBlbmQocmVmZXJlbmNlLnRyaW0oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXMuYXBwZW5kKGdldFZhbHVlKGNoaWxkKSk7Ci0JCQkJfQotCQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJCXJldHVybiBzLnRvU3RyaW5nKCkudHJpbSgpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZQotCQkgKiBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBmUGFyZW50UHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGRvbUVsZW1lbnQKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZVZhbHVlKEVsZW1lbnQgZG9tRWxlbWVudCkgewotCQkJTm9kZUxpc3QgbmFtZXMgPSBkb21FbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKEpTUDExVExETmFtZXMuTkFNRSk7Ci0JCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmdldExlbmd0aCgpICYmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKTsgaSsrKSB7Ci0JCQkJbmFtZSA9IGdldENvbnRhaW5lZFRleHQobmFtZXMuaXRlbShpKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gZG9tRWxlbWVudAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBnZXRTaG9ydE5hbWVWYWx1ZShFbGVtZW50IGRvbUVsZW1lbnQpIHsKLQkJCU5vZGVMaXN0IG5hbWVzID0gZG9tRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShKU1AxMlRMRE5hbWVzLlNIT1JUX05BTUUpOwotCQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5nZXRMZW5ndGgoKSAmJiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCk7IGkrKykgewotCQkJCW5hbWUgPSBnZXRDb250YWluZWRUZXh0KG5hbWVzLml0ZW0oaSkpOwotCQkJfQotCQkJbmFtZXMgPSBkb21FbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKEpTUDExVExETmFtZXMuU0hPUlROQU1FKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMuZ2V0TGVuZ3RoKCkgJiYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApOyBpKyspIHsKLQkJCQluYW1lID0gZ2V0Q29udGFpbmVkVGV4dChuYW1lcy5pdGVtKGkpKTsKLQkJCX0KLQkJCXJldHVybiBuYW1lOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZQotCQkgKiBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGZTaG93Q29udGVudFZhbHVlcyAmJiBlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCUVsZW1lbnQgZG9tRWxlbWVudCA9IChFbGVtZW50KSBlbGVtZW50OwotCQkJCVN0cmluZyBuYW1lID0gZG9tRWxlbWVudC5nZXROb2RlTmFtZSgpOwotCQkJCWJvb2xlYW4gc2hvd05hbWUgPSBKU1AxMVRMRE5hbWVzLlRBRy5lcXVhbHMobmFtZSk7Ci0JCQkJc2hvd05hbWUgPSBzaG93TmFtZSB8fCBKU1AxMVRMRE5hbWVzLkFUVFJJQlVURS5lcXVhbHMobmFtZSk7Ci0JCQkJaWYgKHNob3dOYW1lKSB7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9IGdldE5hbWVWYWx1ZShkb21FbGVtZW50KTsKLQkJCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkvKioKLQkJCQkJCSAqIEN1cnJlbnRseSBub3QgZXh0ZXJuYWxpemVkIHNpbmNlIGl0J3MgYW5hbGFnb3VzIHRvCi0JCQkJCQkgKiBhIGRlY29yYXRvci4KLQkJCQkJCSAqLwotCQkJCQkJcmV0dXJuIGZQYXJlbnRQcm92aWRlci5nZXRUZXh0KGRvbUVsZW1lbnQpICsgIiBbIiArIGZpcnN0TGluZU9mKHZhbHVlKSArICJdIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJYm9vbGVhbiBzaG93Q29udGVudHMgPSBKU1AxMVRMRE5hbWVzLk5BTUUuZXF1YWxzKG5hbWUpOwotCQkJCXNob3dDb250ZW50cyA9IHNob3dDb250ZW50cyB8fCBKU1AxMVRMRE5hbWVzLkJPRFlDT05URU5ULmVxdWFscyhuYW1lKTsKLQkJCQlzaG93Q29udGVudHMgPSBzaG93Q29udGVudHMgfHwgSlNQMTJUTEROYW1lcy5CT0RZX0NPTlRFTlQuZXF1YWxzKG5hbWUpOwotCQkJCXNob3dDb250ZW50cyA9IHNob3dDb250ZW50cyB8fCBKU1AxMVRMRE5hbWVzLlRBR0NMQVNTLmVxdWFscyhuYW1lKTsKLQkJCQlzaG93Q29udGVudHMgPSBzaG93Q29udGVudHMgfHwgSlNQMTJUTEROYW1lcy5UQUdfQ0xBU1MuZXF1YWxzKG5hbWUpOwotCQkJCXNob3dDb250ZW50cyA9IHNob3dDb250ZW50cyB8fCBKU1AxMVRMRE5hbWVzLlRFSUNMQVNTLmVxdWFscyhuYW1lKTsKLQkJCQlzaG93Q29udGVudHMgPSBzaG93Q29udGVudHMgfHwgSlNQMTJUTEROYW1lcy5URUlfQ0xBU1MuZXF1YWxzKG5hbWUpOwotCQkJCXNob3dDb250ZW50cyA9IHNob3dDb250ZW50cyB8fCBKU1AxMVRMRE5hbWVzLlJFUVVJUkVELmVxdWFscyhuYW1lKTsKLQkJCQlzaG93Q29udGVudHMgPSBzaG93Q29udGVudHMgfHwgSlNQMTFUTEROYW1lcy5SVEVYUFJWQUxVRS5lcXVhbHMobmFtZSk7Ci0JCQkJc2hvd0NvbnRlbnRzID0gc2hvd0NvbnRlbnRzIHx8IEpTUDExVExETmFtZXMuVVJJLmVxdWFscyhuYW1lKTsKLQkJCQlzaG93Q29udGVudHMgPSBzaG93Q29udGVudHMgfHwgSlNQMTFUTEROYW1lcy5TSE9SVE5BTUUuZXF1YWxzKG5hbWUpOwotCQkJCXNob3dDb250ZW50cyA9IHNob3dDb250ZW50cyB8fCBKU1AxMlRMRE5hbWVzLlNIT1JUX05BTUUuZXF1YWxzKG5hbWUpOwotCQkJCXNob3dDb250ZW50cyA9IHNob3dDb250ZW50cyB8fCBKU1AxMlRMRE5hbWVzLkRJU1BMQVlfTkFNRS5lcXVhbHMobmFtZSk7Ci0JCQkJc2hvd0NvbnRlbnRzID0gc2hvd0NvbnRlbnRzIHx8IEpTUDExVExETmFtZXMuSlNQVkVSU0lPTi5lcXVhbHMobmFtZSk7Ci0JCQkJc2hvd0NvbnRlbnRzID0gc2hvd0NvbnRlbnRzIHx8IEpTUDEyVExETmFtZXMuSlNQX1ZFUlNJT04uZXF1YWxzKG5hbWUpOwotCQkJCXNob3dDb250ZW50cyA9IHNob3dDb250ZW50cyB8fCBKU1AxMVRMRE5hbWVzLlRMSUJWRVJTSU9OLmVxdWFscyhuYW1lKTsKLQkJCQlzaG93Q29udGVudHMgPSBzaG93Q29udGVudHMgfHwgSlNQMTJUTEROYW1lcy5UTElCX1ZFUlNJT04uZXF1YWxzKG5hbWUpOwotCQkJCXNob3dDb250ZW50cyA9IHNob3dDb250ZW50cyB8fCBKU1AxMlRMRE5hbWVzLkxJU1RFTkVSX0NMQVNTLmVxdWFscyhuYW1lKTsKLQkJCQlzaG93Q29udGVudHMgPSBzaG93Q29udGVudHMgfHwgSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9TQ09QRS5lcXVhbHMobmFtZSk7Ci0JCQkJc2hvd0NvbnRlbnRzID0gc2hvd0NvbnRlbnRzIHx8IEpTUDEyVExETmFtZXMuVkFSSUFCTEVfQ0xBU1MuZXF1YWxzKG5hbWUpOwotCQkJCXNob3dDb250ZW50cyA9IHNob3dDb250ZW50cyB8fCBKU1AxMlRMRE5hbWVzLlZBUklBQkxFX0RFQ0xBUkUuZXF1YWxzKG5hbWUpOwotCQkJCXNob3dDb250ZW50cyA9IHNob3dDb250ZW50cyB8fCBKU1AxMlRMRE5hbWVzLlZBUklBQkxFX05BTUVfRlJPTV9BVFRSSUJVVEUuZXF1YWxzKG5hbWUpOwotCQkJCXNob3dDb250ZW50cyA9IHNob3dDb250ZW50cyB8fCBKU1AxMlRMRE5hbWVzLlZBUklBQkxFX05BTUVfR0lWRU4uZXF1YWxzKG5hbWUpOwotCQkJCXNob3dDb250ZW50cyA9IHNob3dDb250ZW50cyB8fCBKU1AxMlRMRE5hbWVzLlZBTElEQVRPUl9DTEFTUy5lcXVhbHMobmFtZSk7Ci0JCQkJc2hvd0NvbnRlbnRzID0gc2hvd0NvbnRlbnRzIHx8IEpTUDEyVExETmFtZXMuU01BTExfSUNPTi5lcXVhbHMobmFtZSk7Ci0JCQkJc2hvd0NvbnRlbnRzID0gc2hvd0NvbnRlbnRzIHx8IEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTi5lcXVhbHMobmFtZSk7Ci0KLQkJCQlpZiAoc2hvd0NvbnRlbnRzKSB7Ci0JCQkJCXJldHVybiBmUGFyZW50UHJvdmlkZXIuZ2V0VGV4dChkb21FbGVtZW50KSArICI6ICIgKyBnZXRDb250YWluZWRUZXh0KGRvbUVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQkJaWYgKEpTUDExVExETmFtZXMuVEFHTElCLmVxdWFscyhuYW1lKSkgewotCQkJCQlTdHJpbmcgdmFsdWUgPSBnZXRTaG9ydE5hbWVWYWx1ZShkb21FbGVtZW50KTsKLQkJCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkvKioKLQkJCQkJCSAqIEN1cnJlbnRseSBub3QgZXh0ZXJuYWxpemVkIHNpbmNlIGl0J3MgYW5hbGFnb3VzIHRvCi0JCQkJCQkgKiBhIGRlY29yYXRvci4KLQkJCQkJCSAqLwotCQkJCQkJcmV0dXJuIGZQYXJlbnRQcm92aWRlci5nZXRUZXh0KGRvbUVsZW1lbnQpICsgIiBbIiArIHZhbHVlICsgIl0iOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZlBhcmVudFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBnZXRWYWx1ZShOb2RlIG4pIHsKLQkJCWlmIChuID09IG51bGwpCi0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmFsdWUgPSBuLmdldE5vZGVWYWx1ZSgpOwotCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdmFsdWUudHJpbSgpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZQotCQkgKiBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YQotCQkgKiAubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIGZQYXJlbnRQcm92aWRlci5pc0xhYmVsUHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHkpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZQotCQkgKiBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcKLQkJICogLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJZlBhcmVudFByb3ZpZGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRvZ2dsZSBhY3Rpb24gZm9yIHdoZXRoZXIgb3Igbm90IHRvIGRpc3BsYXkgZWxlbWVudCdzIGZpcnN0IGF0dHJpYnV0ZQotCSAqLwotCXByaXZhdGUgY2xhc3MgVG9nZ2xlU2hvd1ZhbHVlQWN0aW9uIGV4dGVuZHMgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb24gewotCQlwcml2YXRlIFRyZWVWaWV3ZXIgZlRyZWVWaWV3ZXI7Ci0KLQkJcHVibGljIFRvZ2dsZVNob3dWYWx1ZUFjdGlvbihJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcgcHJlZmVyZW5jZSwgVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCQlzdXBlcihKU1BVSU1lc3NhZ2VzLlRMRENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbl8wLCBzdG9yZSwgcHJlZmVyZW5jZSwgdHJ1ZSk7Ci0JCQlzZXRUb29sVGlwVGV4dChnZXRUZXh0KCkpOwotCQkJLy8gVE9ETzogaW1hZ2UgbmVlZGVkCi0JCQlzZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUFJPUF9QUykpOwotCQkJZlRyZWVWaWV3ZXIgPSB0cmVlVmlld2VyOwotCQkJdXBkYXRlKCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZSN1cGRhdGUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQkJc3VwZXIudXBkYXRlKCk7Ci0JCQlmU2hvd0NvbnRlbnRWYWx1ZXMgPSBpc0NoZWNrZWQoKTsKLQotCQkJLy8gcmVmcmVzaCB0aGUgb3V0bGluZSB2aWV3Ci0JCQlmVHJlZVZpZXdlci5yZWZyZXNoKHRydWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBQcmVmZXJlbmNlIGtleSBmb3IgU2hvdyBBdHRyaWJ1dGVzCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT1VUTElORV9TSE9XX1ZBTFVFX1BSRUYgPSAib3V0bGluZS1zaG93LXZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JYm9vbGVhbiBmU2hvd0NvbnRlbnRWYWx1ZXMgPSB0cnVlOwotCUlMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyID0gbnVsbDsKLQotCXB1YmxpYyBUTERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElDb250cmlidXRpb25JdGVtW10gY3JlYXRlTWVudUNvbnRyaWJ1dGlvbnMoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtczsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gc2hvd1ZhbHVlSXRlbSA9IG5ldyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0obmV3IFRvZ2dsZVNob3dWYWx1ZUFjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKSwgT1VUTElORV9TSE9XX1ZBTFVFX1BSRUYsIHZpZXdlcikpOwotCi0JCWl0ZW1zID0gc3VwZXIuY3JlYXRlTWVudUNvbnRyaWJ1dGlvbnModmlld2VyKTsKLQkJaWYgKGl0ZW1zID09IG51bGwpIHsKLQkJCWl0ZW1zID0gbmV3IElDb250cmlidXRpb25JdGVtW117c2hvd1ZhbHVlSXRlbX07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJQ29udHJpYnV0aW9uSXRlbVtdIGNvbWJpbmVkSXRlbXMgPSBuZXcgSUNvbnRyaWJ1dGlvbkl0ZW1baXRlbXMubGVuZ3RoICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGl0ZW1zLCAwLCBjb21iaW5lZEl0ZW1zLCAwLCBpdGVtcy5sZW5ndGgpOwotCQkJY29tYmluZWRJdGVtc1tpdGVtcy5sZW5ndGhdID0gc2hvd1ZhbHVlSXRlbTsKLQkJCWl0ZW1zID0gY29tYmluZWRJdGVtczsKLQkJfQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlCi0JICogb3JnLmVjbGlwc2Uud3N0LnhtbC51aS52aWV3cy5jb250ZW50b3V0bGluZS5YTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkgKiAjZ2V0TGFiZWxQcm92aWRlcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZMYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZMYWJlbFByb3ZpZGVyID0gbmV3IENvbnRlbnRMYWJlbFByb3ZpZGVyKHN1cGVyLmdldExhYmVsUHJvdmlkZXIodmlld2VyKSk7Ci0JCX0KLQkJcmV0dXJuIGZMYWJlbFByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUKLQkgKiBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCSAqICNnZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0pTUEZpbGVXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0pTUEZpbGVXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMzYyNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BGaWxlV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgLDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkpTUENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWwuRmFjZXRNb2R1bGVDb3JlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci0KLWNsYXNzIE5ld0pTUEZpbGVXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSB7Ci0KLQlwcml2YXRlIElDb250ZW50VHlwZSBmQ29udGVudFR5cGU7Ci0JcHJpdmF0ZSBMaXN0IGZWYWxpZEV4dGVuc2lvbnMgPSBudWxsOwotCi0JcHVibGljIE5ld0pTUEZpbGVXaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiB0byBzZXQgdGhlIHNlbGVjdGVkIGZvbGRlciB0byB3ZWIgY29udGVudHMKLQkgKiBmb2xkZXIgaWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIG91dHNpZGUgdGhlIHdlYiBjb250ZW50cyBmb2xkZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbFBvcHVsYXRlQ29udGFpbmVyTmFtZUZpZWxkKCkgewotCQlzdXBlci5pbml0aWFsUG9wdWxhdGVDb250YWluZXJOYW1lRmllbGQoKTsKLQotCQlJUGF0aCBmdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0RnJvbVBhdGgoZnVsbFBhdGgpOwotCQlJUGF0aCB3ZWJDb250ZW50UGF0aCA9IGdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotCi0JCWlmICh3ZWJDb250ZW50UGF0aCAhPSBudWxsICYmICF3ZWJDb250ZW50UGF0aC5pc1ByZWZpeE9mKGZ1bGxQYXRoKSkgewotCQkJc2V0Q29udGFpbmVyRnVsbFBhdGgod2ViQ29udGVudFBhdGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGVuIHRvIHNldCBhZGRpdGlvbmFsIHZhbGlkYXRpb24gc3BlY2lmaWMgdG8ganNwCi0JICogZmlsZXMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlzZXRNZXNzYWdlKG51bGwpOwotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLQkJaWYgKCFzdXBlci52YWxpZGF0ZVBhZ2UoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWUoKTsKLQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlpZiAoKGZ1bGxQYXRoICE9IG51bGwpICYmIChmdWxsUGF0aC5pc0VtcHR5KCkgPT0gZmFsc2UpICYmIChmaWxlTmFtZSAhPSBudWxsKSkgewotCQkJLy8gY2hlY2sgdGhhdCBmaWxlbmFtZSBkb2VzIG5vdCBjb250YWluIGludmFsaWQgZXh0ZW5zaW9uCi0JCQlpZiAoIWV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoZmlsZU5hbWUpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKEpTUFVJTWVzc2FnZXMuX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0pTUCwgZ2V0VmFsaWRFeHRlbnNpb25zKCkudG9TdHJpbmcoKSkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCS8vIG5vIGZpbGUgZXh0ZW5zaW9uIHNwZWNpZmllZCBzbyBjaGVjayBhZGRpbmcgZGVmYXVsdAotCQkJLy8gZXh0ZW5zaW9uIGRvZXNuJ3QgZXF1YWwgYSBmaWxlIHRoYXQgYWxyZWFkeSBleGlzdHMKLQkJCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpID09IC0xKSB7Ci0JCQkJU3RyaW5nIG5ld0ZpbGVOYW1lID0gYWRkRGVmYXVsdEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0JCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gZnVsbFBhdGguYXBwZW5kKG5ld0ZpbGVOYW1lKTsKLQotCQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJCUlTdGF0dXMgcmVzdWx0ID0gd29ya3NwYWNlLnZhbGlkYXRlUGF0aChyZXNvdXJjZVBhdGgudG9TdHJpbmcoKSwgSVJlc291cmNlLkZPTERFUik7Ci0JCQkJaWYgKCFyZXN1bHQuaXNPSygpKSB7Ci0JCQkJCS8vIHBhdGggaW52YWxpZAotCQkJCQlzZXRFcnJvck1lc3NhZ2UocmVzdWx0LmdldE1lc3NhZ2UoKSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlpZiAoKHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0Rm9sZGVyKHJlc291cmNlUGF0aCkuZXhpc3RzKCkgfHwgd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHJlc291cmNlUGF0aCkuZXhpc3RzKCkpKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShKU1BVSU1lc3NhZ2VzLlJlc291cmNlR3JvdXBfbmFtZUV4aXN0cyk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdldCB0aGUgSVByb2plY3QgZm9yIHRoZSBzZWxlY3Rpb24gcGF0aAotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3RGcm9tUGF0aChmdWxsUGF0aCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKCFpc0phdmFQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJCXNldE1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5fV0FSTklOR19GSUxFX01VU1RfQkVfSU5TSURFX0pBVkFfUFJPSkVDVCwgV0FSTklORyk7Ci0JCQkJfQotCQkJCS8vIGlmIGluc2lkZSB3ZWIgcHJvamVjdCwgY2hlY2sgaWYgaW5zaWRlIHdlYkNvbnRlbnQgZm9sZGVyCi0JCQkJaWYgKGlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpIHsKLQkJCQkJLy8gY2hlY2sgdGhhdCB0aGUgcGF0aCBpcyBpbnNpZGUgdGhlIHdlYkNvbnRlbnQgZm9sZGVyCi0JCQkJCUlQYXRoIHdlYkNvbnRlbnRQYXRoID0gZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0JCQkJCWlmICghd2ViQ29udGVudFBhdGguaXNQcmVmaXhPZihmdWxsUGF0aCkpIHsKLQkJCQkJCXNldE1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5fV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQsIFdBUk5JTkcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBkZWZhdWx0IGV4dGVuc2lvbiB0byB0aGUgZmlsZW5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGFkZERlZmF1bHRFeHRlbnNpb24oU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBuZXdGaWxlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoZmlsZW5hbWUpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2UgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgZXh0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTik7Ci0KLQkJbmV3RmlsZU5hbWUuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJbmV3RmlsZU5hbWUuYXBwZW5kKGV4dCk7Ci0KLQkJcmV0dXJuIG5ld0ZpbGVOYW1lLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGNvbnRlbnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBuZXcgZmlsZSB3aXphcmQKLQkgKiAKLQkgKiBAcmV0dXJuIElDb250ZW50VHlwZQotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlpZiAoZkNvbnRlbnRUeXBlID09IG51bGwpCi0JCQlmQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJcmV0dXJuIGZDb250ZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbGlzdCBvZiB2YWxpZCBleHRlbnNpb25zIGZvciBKU1AgQ29udGVudCB0eXBlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRWYWxpZEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChmVmFsaWRFeHRlbnNpb25zID09IG51bGwpIHsKLQkJCUlDb250ZW50VHlwZSB0eXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJCWZWYWxpZEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QodHlwZS5nZXRGaWxlU3BlY3MoSUNvbnRlbnRUeXBlLkZJTEVfRVhURU5TSU9OX1NQRUMpKSk7Ci0JCX0KLQkJcmV0dXJuIGZWYWxpZEV4dGVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgaWYgZmlsZU5hbWUgaXMgdmFsaWQgbmFtZSBmb3IgY29udGVudCB0eXBlLiBUYWtlcyBiYXNlIGNvbnRlbnQKLQkgKiB0eXBlIGludG8gY29uc2lkZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgZXh0ZW5zaW9uIGlzIHZhbGlkIGZvciB0aGlzIGNvbnRlbnQgdHlwZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKFN0cmluZyBmaWxlTmFtZSkgewotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgYW4gZXh0ZW5zaW9uCi0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSB7Ci0JCQkvLyBjaGVjayB3aGF0IGNvbnRlbnQgdHlwZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IGV4dGVuc2lvbgotCQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKGZpbGVOYW1lKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNLaW5kT2YodHlwZSk7Ci0JCQkJKytpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXZhbGlkID0gdHJ1ZTsgLy8gbm8gZXh0ZW5zaW9uIHNvIHZhbGlkCi0JCXJldHVybiB2YWxpZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBwYXRoCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHdoaWNoIHByb2plY3QgaXMgbmVlZGVkCi0JICogQHJldHVybiBJUHJvamVjdCBvYmplY3QuIElmIHBhdGggaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlIHJldHVybgotCSAqICAgICAgICAgdmFsdWUgaXMgYWxzbyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3RGcm9tUGF0aChJUGF0aCBwYXRoKSB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlpZiAod29ya3NwYWNlLnZhbGlkYXRlUGF0aChwYXRoLnRvU3RyaW5nKCksIElSZXNvdXJjZS5QUk9KRUNUKS5pc09LKCkpIHsKLQkJCQlwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGgudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpLmdldFByb2plY3QoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgaXMgYSB3ZWIgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgcHJvamVjdCB0byBiZSBjaGVja2VkCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9qZWN0IGlzIHdlYiBwcm9qZWN0LCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNEeW5hbWljV2ViUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWJvb2xlYW4gaXMgPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCk7Ci0JCXJldHVybiBpczsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGlzIGEgdHlwZSBvZiBqYXZhIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHByb2plY3QgdG8gYmUgY2hlY2tlZCAoY2Fubm90IGJlIG51bGwpCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9qZWN0IGlzIGEgdHlwZSBvZiBqYXZhIHByb2plY3QsIG90aGVyd2lzZSBmYWxzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0phdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJYm9vbGVhbiBpc0phdmEgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlzSmF2YSA9IHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0KLQkJcmV0dXJuIGlzSmF2YTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB3aGljaCB3ZWIgY29udGVudHMgcGF0aCBpcyBuZWVkZWQKLQkgKiBAcmV0dXJuIElQYXRoIG9mIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyCi0JICovCi0JcHJpdmF0ZSBJUGF0aCBnZXRXZWJDb250ZW50UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlQYXRoIHBhdGggPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LmdldFdlYkNvbnRlbnRSb290UGF0aChwcm9qZWN0KTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiNWI4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkRvY3VtZW50VGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlNQVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0vKioKLSAqIFRlbXBsYXRlcyBwYWdlIGluIG5ldyBmaWxlIHdpemFyZC4gQWxsb3dzIHVzZXJzIHRvIHNlbGVjdCBhIG5ldyBmaWxlCi0gKiB0ZW1wbGF0ZSB0byBiZSBhcHBsaWVkIGluIG5ldyBmaWxlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBDb250ZW50IHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQkvKiogVGhlIHRlbXBsYXRlIHN0b3JlLiAqLwotCQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlN0b3JlOwotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlmU3RvcmUgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlyZXR1cm4gZlN0b3JlLmdldFRlbXBsYXRlcyhUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLk5FVyk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCWZTdG9yZSA9IChUZW1wbGF0ZVN0b3JlKSBuZXdJbnB1dDsKLQkJfQotCX0KLQotCS8qKgotCSAqIExhYmVsIHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gKFRlbXBsYXRlKSBlbGVtZW50OwotCi0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJCQljYXNlIDEgOgotCQkJCQlyZXR1cm4gdGVtcGxhdGUuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiogTGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZSBuYW1lICovCi0JcHJpdmF0ZSBTdHJpbmcgZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZTsKLQkvKiogVGhlIHZpZXdlciBkaXNwbGF5cyB0aGUgcGF0dGVybiBvZiBzZWxlY3RlZCB0ZW1wbGF0ZS4gKi8KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBmUGF0dGVyblZpZXdlcjsKLQkvKiogVGhlIHRhYmxlIHByZXNlbnRpbmcgdGhlIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIFRhYmxlVmlld2VyIGZUYWJsZVZpZXdlcjsKLQkvKiogVGVtcGxhdGUgc3RvcmUgdXNlZCBieSB0aGlzIHdpemFyZCBwYWdlICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCS8qKiBDaGVja2JveCBmb3IgdXNpbmcgdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgQnV0dG9uIGZVc2VUZW1wbGF0ZUJ1dHRvbjsKLQotCXB1YmxpYyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlKCkgewotCQlzdXBlcigiTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZSIsIEpTUFVJTWVzc2FnZXMuTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8wLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihKU1BVSU1lc3NhZ2VzLk5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMSk7Ci0JfQotCi0JLyoqCi0JICogQ29ycmVjdGx5IHJlc2l6ZXMgdGhlIHRhYmxlIHNvIG5vIHBoYW50b20gY29sdW1ucyBhcHBlYXIKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcGFyYW0gYnV0dG9ucwotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbnMKLQkgKiBAcGFyYW0gdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSB0YWJsZQotCSAqIEBwYXJhbSBjb2x1bW4xCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbjIKLQkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbjMKLQkgKiAgICAgICAgICAgIHRoZSB0aGlyZCBjb2x1bW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlVGFibGVSZXNpemluZyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBUYWJsZSB0YWJsZSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMikgewotCQlwYXJlbnQuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJUmVjdGFuZ2xlIGFyZWEgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCVBvaW50IHByZWZlcnJlZFNpemUgPSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCWludCB3aWR0aCA9IGFyZWEud2lkdGggLSAyICogdGFibGUuZ2V0Qm9yZGVyV2lkdGgoKTsKLQkJCQlpZiAocHJlZmVycmVkU2l6ZS55ID4gYXJlYS5oZWlnaHQpIHsKLQkJCQkJLy8gU3VidHJhY3QgdGhlIHNjcm9sbGJhciB3aWR0aCBmcm9tIHRoZSB0b3RhbCBjb2x1bW4KLQkJCQkJLy8gd2lkdGgKLQkJCQkJLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotCQkJCQlQb2ludCB2QmFyU2l6ZSA9IHRhYmxlLmdldFZlcnRpY2FsQmFyKCkuZ2V0U2l6ZSgpOwotCQkJCQl3aWR0aCAtPSB2QmFyU2l6ZS54OwotCQkJCX0KLQotCQkJCVBvaW50IG9sZFNpemUgPSB0YWJsZS5nZXRTaXplKCk7Ci0JCQkJaWYgKG9sZFNpemUueCA+IHdpZHRoKSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgc21hbGxlciBzbyBtYWtlIHRoZSBjb2x1bW5zCi0JCQkJCS8vIHNtYWxsZXIgZmlyc3QgYW5kIHRoZW4gcmVzaXplIHRoZSB0YWJsZSB0bwotCQkJCQkvLyBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgYmlnZ2VyIHNvIG1ha2UgdGhlIHRhYmxlCi0JCQkJCS8vIGJpZ2dlciBmaXJzdCBhbmQgdGhlbiBtYWtlIHRoZSBjb2x1bW5zIHdpZGVyCi0JCQkJCS8vIHRvIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQl0YWJsZS5zZXRTaXplKHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgYW5jZXN0b3IpIHsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoYW5jZXN0b3IsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBjcmVhdGUgY2hlY2tib3ggZm9yIHVzZXIgdG8gdXNlIEpTUCBUZW1wbGF0ZQotCQlmVXNlVGVtcGxhdGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFRleHQoSlNQVUlNZXNzYWdlcy5OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVuYWJsZVRlbXBsYXRlcygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlIGZvciBUZW1wbGF0ZXMgdGFibGUKLQkJQ29tcG9zaXRlIGlubmVyUGFyZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBpbm5lckxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWlubmVyTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlpbm5lckxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlpbm5lckxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWlubmVyUGFyZW50LnNldExheW91dChpbm5lckxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSk7Ci0JCWlubmVyUGFyZW50LnNldExheW91dERhdGEoZ2QpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGlubmVyUGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoSlNQVUlNZXNzYWdlcy5OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzcpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRlbXBsYXRlcwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShpbm5lclBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoSlNQVUlNZXNzYWdlcy5OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzIpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMi5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8zKTsKLQotCQlmVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQlmVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVGVtcGxhdGVMYWJlbFByb3ZpZGVyKCkpOwotCQlmVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlcigpKTsKLQotCQlmVGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyKSB7Ci0JCQkJaWYgKChvYmplY3QxIGluc3RhbmNlb2YgVGVtcGxhdGUpICYmIChvYmplY3QyIGluc3RhbmNlb2YgVGVtcGxhdGUpKSB7Ci0JCQkJCVRlbXBsYXRlIGxlZnQgPSAoVGVtcGxhdGUpIG9iamVjdDE7Ci0JCQkJCVRlbXBsYXRlIHJpZ2h0ID0gKFRlbXBsYXRlKSBvYmplY3QyOwotCQkJCQlpbnQgcmVzdWx0ID0gbGVmdC5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXROYW1lKCkpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApCi0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQlyZXR1cm4gbGVmdC5nZXREZXNjcmlwdGlvbigpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgb2JqZWN0MSwgb2JqZWN0Mik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzU29ydGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9KTsKLQotCQlmVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgewotCQkJCXVwZGF0ZVZpZXdlcklucHV0KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB2aWV3ZXIgdGhhdCBkaXNwbGF5cyBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUncyBjb250ZW50cwotCQlmUGF0dGVyblZpZXdlciA9IGRvQ3JlYXRlVmlld2VyKHBhcmVudCk7Ci0KLQkJZlRlbXBsYXRlU3RvcmUgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCQlmVGFibGVWaWV3ZXIuc2V0SW5wdXQoZlRlbXBsYXRlU3RvcmUpOwotCi0JCS8vIENyZWF0ZSBsaW5rZWQgdGV4dCB0byBqdXN0IHRvIHRlbXBsYXRlcyBwcmVmZXJlbmNlIHBhZ2UKLQkJTGluayBsaW5rID0gbmV3IExpbmsocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxpbmsuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLk5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWxpbmtDbGlja2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0KLQkJY29uZmlndXJlVGFibGVSZXNpemluZyhpbm5lclBhcmVudCwgdGFibGUsIGNvbHVtbjEsIGNvbHVtbjIpOwotCQlsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUhlbHBDb250ZXh0SWRzLkpTUF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlzZXRDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcywgY29uZmlndXJlcyBhbmQgcmV0dXJucyBhIHNvdXJjZSB2aWV3ZXIgdG8gcHJlc2VudCB0aGUgdGVtcGxhdGUKLQkgKiBwYXR0ZXJuIG9uIHRoZSBwcmVmZXJlbmNlIHBhZ2UuIENsaWVudHMgbWF5IG92ZXJyaWRlIHRvIHByb3ZpZGUgYQotCSAqIGN1c3RvbSBzb3VyY2Ugdmlld2VyIGZlYXR1cmluZyBlLmcuIHN5bnRheCBjb2xvcmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJlZCBzb3VyY2Ugdmlld2VyCi0JICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AoKTsKLQotCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQl9OwotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQl2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHNjcmF0Y2hNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUoc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZG9DcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLk5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJU291cmNlVmlld2VyIHZpZXdlciA9IGNyZWF0ZVZpZXdlcihwYXJlbnQpOwotCQl2aWV3ZXIuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCUNvbnRyb2wgY29udHJvbCA9IHZpZXdlci5nZXRDb250cm9sKCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCS8vIFsyNjEyNzRdIC0gc291cmNlIHZpZXdlciB3YXMgZ3Jvd2luZyB0byBmaXQgdGhlIG1heCBsaW5lIHdpZHRoIG9mIHRoZSB0ZW1wbGF0ZQotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlL2Rpc2FibGUgY29udHJvbHMgaW4gcGFnZSBiYXNlZCBvbiBmVXNlVGVtcGxhdGVCdXR0b24ncyBjdXJyZW50Ci0JICogc3RhdGUuCi0JICovCi0Jdm9pZCBlbmFibGVUZW1wbGF0ZXMoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGZVc2VUZW1wbGF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoIWVuYWJsZWQpIHsKLQkJCS8vIHNhdmUgbGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZQotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJZWxzZQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0U2VsZWN0ZWRUZW1wbGF0ZShmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lKTsKLQkJfQotCi0JCWZUYWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZlBhdHRlcm5WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZW1wbGF0ZSBwcmVmZXJlbmNlIHBhZ2UgaWQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJZCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcC50ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGUgZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBudWxsOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQl0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiB0ZW1wbGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRlbXBsYXRlIHN0cmluZyB0byBpbnNlcnQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdG8gaW5zZXJ0IG9yIG51bGwgaWYgbm9uZSBpcyB0byBiZSBpbnNlcnRlZAotCSAqLwotCVN0cmluZyBnZXRUZW1wbGF0ZVN0cmluZygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gbnVsbDsKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKS5nZXRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLk5FVyk7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoKTsKLQkJCVRlbXBsYXRlQ29udGV4dCBjb250ZXh0ID0gbmV3IERvY3VtZW50VGVtcGxhdGVDb250ZXh0KGNvbnRleHRUeXBlLCBkb2N1bWVudCwgMCwgMCk7Ci0JCQl0cnkgewotCQkJCVRlbXBsYXRlQnVmZmVyIGJ1ZmZlciA9IGNvbnRleHQuZXZhbHVhdGUodGVtcGxhdGUpOwotCQkJCXRlbXBsYXRlU3RyaW5nID0gYnVmZmVyLmdldFN0cmluZygpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgdGVtcGxhdGUgZm9yIG5ldyBqc3AiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRlbXBsYXRlU3RyaW5nOwotCX0KLQotCXZvaWQgbGlua0NsaWNrZWQoKSB7Ci0JCVN0cmluZyBwYWdlSWQgPSBnZXRQcmVmZXJlbmNlUGFnZUlkKCk7Ci0JCVByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBwYWdlSWQsIG5ldyBTdHJpbmdbXXtwYWdlSWR9LCBudWxsKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBOZXcgSlNQIEZpbGUgd2l6YXJkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKSB7Ci0JCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIHNldFNlbGVjdGlvbiA9IGZhbHNlOwotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhKU1BVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9OQU1FKTsKLQkJaWYgKHRlbXBsYXRlTmFtZSA9PSBudWxsIHx8IHRlbXBsYXRlTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZW1wbGF0ZU5hbWUgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKEpTUFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX0lEKTsKLQkJCWlmICh0ZW1wbGF0ZU5hbWUgIT0gbnVsbCAmJiB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBmVGVtcGxhdGVTdG9yZS5maW5kVGVtcGxhdGVCeUlkKHRlbXBsYXRlTmFtZSk7Ci0JCQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJCQkJc2V0U2VsZWN0aW9uID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lOwotCQkJc2V0U2VsZWN0aW9uID0gdHJ1ZTsKLQkJfQotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKHNldFNlbGVjdGlvbik7Ci0JCWVuYWJsZVRlbXBsYXRlcygpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGVtcGxhdGUgbmFtZSB1c2VkIGZvciBuZXh0IGNhbGwgdG8gTmV3IEpTUCBGaWxlIHdpemFyZC4KLQkgKi8KLQl2b2lkIHNhdmVMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQl0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSlNQVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQkJSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCBhIHRlbXBsYXRlIGluIHRoZSB0YWJsZSB2aWV3ZXIgZ2l2ZW4gdGhlIHRlbXBsYXRlIG5hbWUuIElmCi0JICogdGVtcGxhdGUgbmFtZSBjYW5ub3QgYmUgZm91bmQgb3IgdGVtcGxhdGVOYW1lIGlzIG51bGwsIGp1c3Qgc2VsZWN0Ci0JICogZmlyc3QgaXRlbSBpbiB0YWJsZS4gSWYgbm8gaXRlbXMgaW4gdGFibGUgc2VsZWN0IG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFRlbXBsYXRlKFN0cmluZyB0ZW1wbGF0ZU5hbWUpIHsKLQkJT2JqZWN0IHRlbXBsYXRlID0gbnVsbDsKLQotCQlpZiAodGVtcGxhdGVOYW1lICE9IG51bGwgJiYgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJLy8gcGljayB0aGUgbGFzdCB1c2VkIHRlbXBsYXRlCi0JCQl0ZW1wbGF0ZSA9IGZUZW1wbGF0ZVN0b3JlLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuTkVXKTsKLQkJfQotCi0JCS8vIG5vIHJlY29yZCBvZiBsYXN0IHVzZWQgdGVtcGxhdGUgc28ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJaWYgKHRlbXBsYXRlID09IG51bGwpIHsKLQkJCS8vIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCQl0ZW1wbGF0ZSA9IGZUYWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCk7Ci0JCX0KLQotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGVtcGxhdGUpOwotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgcGF0dGVybiB2aWV3ZXIuCi0JICovCi0Jdm9pZCB1cGRhdGVWaWV3ZXJJbnB1dCgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0pTUFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhOTI5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0pTUFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBOZXdKU1BXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQlwcml2YXRlIE5ld0pTUEZpbGVXaXphcmRQYWdlIGZOZXdGaWxlUGFnZTsKLQlwcml2YXRlIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2UgZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlOwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLQlwcml2YXRlIERpc3BsYXkgZkRpc3BsYXk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlNob3VsZE9wZW5FZGl0b3JPbkZpbmlzaCA9IHRydWU7Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCWZEaXNwbGF5ID0gcGFnZUNvbnRhaW5lci5nZXREaXNwbGF5KCk7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQl9Ci0KLQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ4NDI0Ci0JcHVibGljIHZvaWQgc2V0T3BlbkVkaXRvck9uRmluaXNoKGJvb2xlYW4gb3BlbkVkaXRvcikgewotCQl0aGlzLmZTaG91bGRPcGVuRWRpdG9yT25GaW5pc2ggPSBvcGVuRWRpdG9yOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJZk5ld0ZpbGVQYWdlID0gbmV3IE5ld0pTUEZpbGVXaXphcmRQYWdlKCJKU1BXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIiwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oSURFLmNvbXB1dGVTZWxlY3RlZFJlc291cmNlcyhmU2VsZWN0aW9uKSkpOyAvLyROT04tTkxTLTEkIAotCQlmTmV3RmlsZVBhZ2Uuc2V0VGl0bGUoSlNQVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19IRUFESU5HKTsKLQkJZk5ld0ZpbGVQYWdlLnNldERlc2NyaXB0aW9uKEpTUFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT04pOwotCQlhZGRQYWdlKGZOZXdGaWxlUGFnZSk7Ci0KLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlID0gbmV3IE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2UoKTsKLQkJYWRkUGFnZShmTmV3RmlsZVRlbXBsYXRlc1BhZ2UpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGFwcGx5TGluZURlbGltaXRlcihJRmlsZSBmaWxlLCBTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFN0cmluZyhQbGF0Zm9ybS5QSV9SVU5USU1FLCBQbGF0Zm9ybS5QUkVGX0xJTkVfU0VQQVJBVE9SLCBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiksIG5ldyBJU2NvcGVDb250ZXh0W10ge25ldyBQcm9qZWN0U2NvcGUoZmlsZS5nZXRQcm9qZWN0KCkpLCBuZXcgSW5zdGFuY2VTY29wZSgpIH0pOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKHRleHQsICJcclxuIiwgIlxuIik7Ci0JCWNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKGNvbnZlcnRlZFRleHQsICJcciIsICJcbiIpOwotCQljb252ZXJ0ZWRUZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZShjb252ZXJ0ZWRUZXh0LCAiXG4iLCBsaW5lRGVsaW1pdGVyKTsKLQkJcmV0dXJuIGNvbnZlcnRlZFRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIGFXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQkJZlNlbGVjdGlvbiA9IGFTZWxlY3Rpb247Ci0JCXNldFdpbmRvd1RpdGxlKEpTUFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9ORVdfVElUTEUpOwotCi0JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfV0laQkFOX05FV0pTUEZJTEUpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWZEaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoIVBsYXRmb3JtVUkuaXNXb3JrYmVuY2hSdW5uaW5nKCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlLCB0cnVlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlib29sZWFuIHBlcmZvcm1lZE9LID0gZmFsc2U7Ci0KLQkJLy8gc2F2ZSB1c2VyIG9wdGlvbnMgZm9yIG5leHQgdXNlCi0JCWZOZXdGaWxlVGVtcGxhdGVzUGFnZS5zYXZlTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQkvLyBubyBmaWxlIGV4dGVuc2lvbiBzcGVjaWZpZWQgc28gYWRkIGRlZmF1bHQgZXh0ZW5zaW9uCi0JCVN0cmluZyBmaWxlTmFtZSA9IGZOZXdGaWxlUGFnZS5nZXRGaWxlTmFtZSgpOwotCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PSAtMSkgewotCQkJU3RyaW5nIG5ld0ZpbGVOYW1lID0gZk5ld0ZpbGVQYWdlLmFkZERlZmF1bHRFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkJZk5ld0ZpbGVQYWdlLnNldEZpbGVOYW1lKG5ld0ZpbGVOYW1lKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSBhIG5ldyBlbXB0eSBmaWxlCi0JCUlGaWxlIGZpbGUgPSBmTmV3RmlsZVBhZ2UuY3JlYXRlTmV3RmlsZSgpOwotCi0JCS8vIGlmIHRoZXJlIHdhcyBwcm9ibGVtIHdpdGggY3JlYXRpbmcgZmlsZSwgaXQgd2lsbCBiZSBudWxsLCBzbyBtYWtlCi0JCS8vIHN1cmUgdG8gY2hlY2sKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJLy8gcHV0IHRlbXBsYXRlIGNvbnRlbnRzIGludG8gZmlsZQotCQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlLmdldFRlbXBsYXRlU3RyaW5nKCk7Ci0JCQlpZiAodGVtcGxhdGVTdHJpbmcgIT0gbnVsbCkgewotCQkJCXRlbXBsYXRlU3RyaW5nID0gYXBwbHlMaW5lRGVsaW1pdGVyKGZpbGUsIHRlbXBsYXRlU3RyaW5nKTsKLQkJCQkvLyBkZXRlcm1pbmUgdGhlIGVuY29kaW5nIGZvciB0aGUgbmV3IGZpbGUKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCQlTdHJpbmcgY2hhclNldCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQotCQkJCXRyeSB7Ci0JCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXRTdHJlYW1Xcml0ZXIgPSBudWxsOwotCQkJCQlpZiAoY2hhclNldCA9PSBudWxsIHx8IGNoYXJTZXQudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8ganVzdCB1c2UgZGVmYXVsdCBlbmNvZGluZwotCQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0pOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0sIGNoYXJTZXQpOwotCQkJCQl9Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci53cml0ZSh0ZW1wbGF0ZVN0cmluZyk7Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci5mbHVzaCgpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKLQkJCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCQkJCQlmaWxlLnNldENvbnRlbnRzKGlucHV0U3RyZWFtLCB0cnVlLCBmYWxzZSwgbnVsbCk7Ci0JCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSBjb250ZW50cyBmb3IgbmV3IEpTUCBmaWxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG9wZW4gdGhlIGZpbGUgaW4gZWRpdG9yCi0JCQlpZiAoZlNob3VsZE9wZW5FZGl0b3JPbkZpbmlzaCkKLQkJCQlvcGVuRWRpdG9yKGZpbGUpOwotCi0JCQkvLyBldmVyeXRoaW5nJ3MgZmluZQotCQkJcGVyZm9ybWVkT0sgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBwZXJmb3JtZWRPSzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1RhZ0ZpbGVXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1RhZ0ZpbGVXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYmNiNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdUYWdGaWxlV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgLDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5GYWNldE1vZHVsZUNvcmVTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLQotY2xhc3MgTmV3VGFnRmlsZVdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIHsKLQotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGZDb250ZW50VHlwZTsKLQlwcml2YXRlIExpc3QgZlZhbGlkRXh0ZW5zaW9ucyA9IG51bGw7Ci0KLQlwdWJsaWMgTmV3VGFnRmlsZVdpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIocGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGVuIHRvIHNldCB0aGUgc2VsZWN0ZWQgZm9sZGVyIHRvIHdlYiBjb250ZW50cwotCSAqIGZvbGRlciBpZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gaXMgb3V0c2lkZSB0aGUgd2ViIGNvbnRlbnRzIGZvbGRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsUG9wdWxhdGVDb250YWluZXJOYW1lRmllbGQoKSB7Ci0JCXN1cGVyLmluaXRpYWxQb3B1bGF0ZUNvbnRhaW5lck5hbWVGaWVsZCgpOwotCi0JCUlQYXRoIGZ1bGxQYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3RGcm9tUGF0aChmdWxsUGF0aCk7Ci0JCUlQYXRoIHdlYkNvbnRlbnRQYXRoID0gZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0KLQkJaWYgKHdlYkNvbnRlbnRQYXRoICE9IG51bGwgJiYgIXdlYkNvbnRlbnRQYXRoLmlzUHJlZml4T2YoZnVsbFBhdGgpKSB7Ci0JCQlzZXRDb250YWluZXJGdWxsUGF0aCh3ZWJDb250ZW50UGF0aCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZW4gdG8gc2V0IGFkZGl0aW9uYWwgdmFsaWRhdGlvbiBzcGVjaWZpYyB0byBqc3AKLQkgKiBmaWxlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCXNldE1lc3NhZ2UobnVsbCk7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQotCQlpZiAoIXN1cGVyLnZhbGlkYXRlUGFnZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRGaWxlTmFtZSgpOwotCQlJUGF0aCBmdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0JCWlmICgoZnVsbFBhdGggIT0gbnVsbCkgJiYgKGZ1bGxQYXRoLmlzRW1wdHkoKSA9PSBmYWxzZSkgJiYgKGZpbGVOYW1lICE9IG51bGwpKSB7Ci0JCQkvLyBjaGVjayB0aGF0IGZpbGVuYW1lIGRvZXMgbm90IGNvbnRhaW4gaW52YWxpZCBleHRlbnNpb24KLQkJCWlmICghZXh0ZW5zaW9uVmFsaWRGb3JDb250ZW50VHlwZShmaWxlTmFtZSkpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoSlNQVUlNZXNzYWdlcy5fRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfSlNQLCBnZXRWYWxpZEV4dGVuc2lvbnMoKS50b1N0cmluZygpKSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGNoZWNrIGFkZGluZyBkZWZhdWx0Ci0JCQkvLyBleHRlbnNpb24gZG9lc24ndCBlcXVhbCBhIGZpbGUgdGhhdCBhbHJlYWR5IGV4aXN0cwotCQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCQlTdHJpbmcgbmV3RmlsZU5hbWUgPSBhZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCQlJUGF0aCByZXNvdXJjZVBhdGggPSBmdWxsUGF0aC5hcHBlbmQobmV3RmlsZU5hbWUpOwotCi0JCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQkJSVN0YXR1cyByZXN1bHQgPSB3b3Jrc3BhY2UudmFsaWRhdGVQYXRoKHJlc291cmNlUGF0aC50b1N0cmluZygpLCBJUmVzb3VyY2UuRk9MREVSKTsKLQkJCQlpZiAoIXJlc3VsdC5pc09LKCkpIHsKLQkJCQkJLy8gcGF0aCBpbnZhbGlkCi0JCQkJCXNldEVycm9yTWVzc2FnZShyZXN1bHQuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCWlmICgod29ya3NwYWNlLmdldFJvb3QoKS5nZXRGb2xkZXIocmVzb3VyY2VQYXRoKS5leGlzdHMoKSB8fCB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUocmVzb3VyY2VQYXRoKS5leGlzdHMoKSkpIHsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKEpTUFVJTWVzc2FnZXMuUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gZ2V0IHRoZSBJUHJvamVjdCBmb3IgdGhlIHNlbGVjdGlvbiBwYXRoCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21QYXRoKGZ1bGxQYXRoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAoIWlzSmF2YVByb2plY3QocHJvamVjdCkpIHsKLQkJCQkJc2V0TWVzc2FnZShKU1BVSU1lc3NhZ2VzLl9XQVJOSU5HX0ZJTEVfTVVTVF9CRV9JTlNJREVfSkFWQV9QUk9KRUNULCBXQVJOSU5HKTsKLQkJCQl9Ci0JCQkJLy8gaWYgaW5zaWRlIHdlYiBwcm9qZWN0LCBjaGVjayBpZiBpbnNpZGUgd2ViQ29udGVudCBmb2xkZXIKLQkJCQkvKgotCQkJCWlmIChpc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJCS8vIGNoZWNrIHRoYXQgdGhlIHBhdGggaXMgaW5zaWRlIHRoZSB3ZWJDb250ZW50IGZvbGRlcgotCQkJCQlJUGF0aCB3ZWJDb250ZW50UGF0aCA9IGdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpLmFwcGVuZCgiL1dFQi1JTkYvdGFncyIpOwotCQkJCQlpZiAoIXdlYkNvbnRlbnRQYXRoLmlzUHJlZml4T2YoZnVsbFBhdGgpKSB7Ci0JCQkJCQlzZXRNZXNzYWdlKEpTUFVJTWVzc2FnZXMuX1dBUk5JTkdfRk9MREVSX01VU1RfQkVfSU5TSURFX1dFQl9DT05URU5ULCBXQVJOSU5HKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkqLwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBkZWZhdWx0IGV4dGVuc2lvbiB0byB0aGUgZmlsZW5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGFkZERlZmF1bHRFeHRlbnNpb24oU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBuZXdGaWxlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoZmlsZW5hbWUpOwotCi0vLwkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBleHQgPSAidGFnIjsvL3ByZWZlcmVuY2UuZ2V0U3RyaW5nKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04pOwotCi0JCW5ld0ZpbGVOYW1lLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCi0JCW5ld0ZpbGVOYW1lLmFwcGVuZChleHQpOwotCi0JCXJldHVybiBuZXdGaWxlTmFtZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdldCBjb250ZW50IHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmV3IGZpbGUgd2l6YXJkCi0JICogCi0JICogQHJldHVybiBJQ29udGVudFR5cGUKLQkgKi8KLQlwcml2YXRlIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJaWYgKGZDb250ZW50VHlwZSA9PSBudWxsKQotCQkJZkNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUFRBRyk7Ci0JCXJldHVybiBmQ29udGVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogR2V0IGxpc3Qgb2YgdmFsaWQgZXh0ZW5zaW9ucyBmb3IgSlNQIENvbnRlbnQgdHlwZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VmFsaWRFeHRlbnNpb25zKCkgewotCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQl9Ci0JCXJldHVybiBmVmFsaWRFeHRlbnNpb25zOwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIGlmIGZpbGVOYW1lIGlzIHZhbGlkIG5hbWUgZm9yIGNvbnRlbnQgdHlwZS4gVGFrZXMgYmFzZSBjb250ZW50Ci0JICogdHlwZSBpbnRvIGNvbnNpZGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogQHJldHVybiB0cnVlIGlmIGV4dGVuc2lvbiBpcyB2YWxpZCBmb3IgdGhpcyBjb250ZW50IHR5cGUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZXh0ZW5zaW9uVmFsaWRGb3JDb250ZW50VHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCi0JCUlDb250ZW50VHlwZSB0eXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJLy8gdGhlcmUgaXMgY3VycmVudGx5IGFuIGV4dGVuc2lvbgotCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSAhPSAtMSkgewotCQkJLy8gY2hlY2sgd2hhdCBjb250ZW50IHR5cGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggY3VycmVudCBleHRlbnNpb24KLQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihmaWxlTmFtZSk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IHR5cGVzLmxlbmd0aCAmJiAhdmFsaWQpIHsKLQkJCQl2YWxpZCA9IHR5cGVzW2ldLmlzS2luZE9mKHR5cGUpOwotCQkJCSsraTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCQl2YWxpZCA9IHRydWU7IC8vIG5vIGV4dGVuc2lvbiBzbyB2YWxpZAotCQlyZXR1cm4gdmFsaWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB3aGljaCBwcm9qZWN0IGlzIG5lZWRlZAotCSAqIEByZXR1cm4gSVByb2plY3Qgb2JqZWN0LiBJZiBwYXRoIGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZSByZXR1cm4KLQkgKiAgICAgICAgIHZhbHVlIGlzIGFsc28gPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbVBhdGgoSVBhdGggcGF0aCkgewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0KLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJaWYgKHdvcmtzcGFjZS52YWxpZGF0ZVBhdGgocGF0aC50b1N0cmluZygpLCBJUmVzb3VyY2UuUFJPSkVDVCkuaXNPSygpKSB7Ci0JCQkJcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKS5nZXRQcm9qZWN0KCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGlzIGEgd2ViIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHByb2plY3QgdG8gYmUgY2hlY2tlZAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvamVjdCBpcyB3ZWIgcHJvamVjdCwgb3RoZXJ3aXNlIGZhbHNlCi0JICovCi0JYm9vbGVhbiBpc0R5bmFtaWNXZWJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJYm9vbGVhbiBpcyA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KTsKLQkJcmV0dXJuIGlzOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgaXMgYSB0eXBlIG9mIGphdmEgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgcHJvamVjdCB0byBiZSBjaGVja2VkIChjYW5ub3QgYmUgbnVsbCkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb2plY3QgaXMgYSB0eXBlIG9mIGphdmEgcHJvamVjdCwgb3RoZXJ3aXNlIGZhbHNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSmF2YVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlib29sZWFuIGlzSmF2YSA9IGZhbHNlOwotCQl0cnkgewotCQkJaXNKYXZhID0gcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQotCQlyZXR1cm4gaXNKYXZhOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdlYiBjb250ZW50cyBmb2xkZXIgb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IHdoaWNoIHdlYiBjb250ZW50cyBwYXRoIGlzIG5lZWRlZAotCSAqIEByZXR1cm4gSVBhdGggb2YgdGhlIHdlYiBjb250ZW50cyBmb2xkZXIKLQkgKi8KLQlwcml2YXRlIElQYXRoIGdldFdlYkNvbnRlbnRQYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVBhdGggcGF0aCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQuZ2V0V2ViQ29udGVudFJvb3RQYXRoKHByb2plY3QpOwotCQlyZXR1cm4gcGF0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWQwMWM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLS8qKgotICogVGVtcGxhdGVzIHBhZ2UgaW4gbmV3IGZpbGUgd2l6YXJkLiBBbGxvd3MgdXNlcnMgdG8gc2VsZWN0IGEgbmV3IGZpbGUKLSAqIHRlbXBsYXRlIHRvIGJlIGFwcGxpZWQgaW4gbmV3IGZpbGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIENvbnRlbnQgcHJvdmlkZXIgZm9yIHRlbXBsYXRlcwotCSAqLwotCXByaXZhdGUgY2xhc3MgVGVtcGxhdGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCS8qKiBUaGUgdGVtcGxhdGUgc3RvcmUuICovCi0JCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmU3RvcmU7Ci0KLQkJLyoKLQkJICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWZTdG9yZSA9IG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsKLQkJCXJldHVybiBmU3RvcmUuZ2V0VGVtcGxhdGVzKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuTkVXX1RBRyk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCWZTdG9yZSA9IChUZW1wbGF0ZVN0b3JlKSBuZXdJbnB1dDsKLQkJfQotCX0KLQotCS8qKgotCSAqIExhYmVsIHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gKFRlbXBsYXRlKSBlbGVtZW50OwotCi0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJCQljYXNlIDEgOgotCQkJCQlyZXR1cm4gdGVtcGxhdGUuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiogTGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZSBuYW1lICovCi0JcHJpdmF0ZSBTdHJpbmcgZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZTsKLQkvKiogVGhlIHZpZXdlciBkaXNwbGF5cyB0aGUgcGF0dGVybiBvZiBzZWxlY3RlZCB0ZW1wbGF0ZS4gKi8KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBmUGF0dGVyblZpZXdlcjsKLQkvKiogVGhlIHRhYmxlIHByZXNlbnRpbmcgdGhlIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIFRhYmxlVmlld2VyIGZUYWJsZVZpZXdlcjsKLQkvKiogVGVtcGxhdGUgc3RvcmUgdXNlZCBieSB0aGlzIHdpemFyZCBwYWdlICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCS8qKiBDaGVja2JveCBmb3IgdXNpbmcgdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgQnV0dG9uIGZVc2VUZW1wbGF0ZUJ1dHRvbjsKLQotCXB1YmxpYyBOZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlKCkgewotCQlzdXBlcigiTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZSIsIEpTUFVJTWVzc2FnZXMuTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZV8wLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihKU1BVSU1lc3NhZ2VzLk5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfMSk7Ci0JfQotCi0JLyoqCi0JICogQ29ycmVjdGx5IHJlc2l6ZXMgdGhlIHRhYmxlIHNvIG5vIHBoYW50b20gY29sdW1ucyBhcHBlYXIKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcGFyYW0gYnV0dG9ucwotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbnMKLQkgKiBAcGFyYW0gdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSB0YWJsZQotCSAqIEBwYXJhbSBjb2x1bW4xCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbjIKLQkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbjMKLQkgKiAgICAgICAgICAgIHRoZSB0aGlyZCBjb2x1bW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlVGFibGVSZXNpemluZyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBUYWJsZSB0YWJsZSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMikgewotCQlwYXJlbnQuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJUmVjdGFuZ2xlIGFyZWEgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCVBvaW50IHByZWZlcnJlZFNpemUgPSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCWludCB3aWR0aCA9IGFyZWEud2lkdGggLSAyICogdGFibGUuZ2V0Qm9yZGVyV2lkdGgoKTsKLQkJCQlpZiAocHJlZmVycmVkU2l6ZS55ID4gYXJlYS5oZWlnaHQpIHsKLQkJCQkJLy8gU3VidHJhY3QgdGhlIHNjcm9sbGJhciB3aWR0aCBmcm9tIHRoZSB0b3RhbCBjb2x1bW4KLQkJCQkJLy8gd2lkdGgKLQkJCQkJLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotCQkJCQlQb2ludCB2QmFyU2l6ZSA9IHRhYmxlLmdldFZlcnRpY2FsQmFyKCkuZ2V0U2l6ZSgpOwotCQkJCQl3aWR0aCAtPSB2QmFyU2l6ZS54OwotCQkJCX0KLQotCQkJCVBvaW50IG9sZFNpemUgPSB0YWJsZS5nZXRTaXplKCk7Ci0JCQkJaWYgKG9sZFNpemUueCA+IHdpZHRoKSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgc21hbGxlciBzbyBtYWtlIHRoZSBjb2x1bW5zCi0JCQkJCS8vIHNtYWxsZXIgZmlyc3QgYW5kIHRoZW4gcmVzaXplIHRoZSB0YWJsZSB0bwotCQkJCQkvLyBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgYmlnZ2VyIHNvIG1ha2UgdGhlIHRhYmxlCi0JCQkJCS8vIGJpZ2dlciBmaXJzdCBhbmQgdGhlbiBtYWtlIHRoZSBjb2x1bW5zIHdpZGVyCi0JCQkJCS8vIHRvIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQl0YWJsZS5zZXRTaXplKHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgYW5jZXN0b3IpIHsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoYW5jZXN0b3IsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBjcmVhdGUgY2hlY2tib3ggZm9yIHVzZXIgdG8gdXNlIEpTUCBUZW1wbGF0ZQotCQlmVXNlVGVtcGxhdGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFRleHQoSlNQVUlNZXNzYWdlcy5OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVuYWJsZVRlbXBsYXRlcygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlIGZvciBUZW1wbGF0ZXMgdGFibGUKLQkJQ29tcG9zaXRlIGlubmVyUGFyZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBpbm5lckxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWlubmVyTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlpbm5lckxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlpbm5lckxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWlubmVyUGFyZW50LnNldExheW91dChpbm5lckxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSk7Ci0JCWlubmVyUGFyZW50LnNldExheW91dERhdGEoZ2QpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGlubmVyUGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoSlNQVUlNZXNzYWdlcy5OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzcpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRlbXBsYXRlcwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShpbm5lclBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoSlNQVUlNZXNzYWdlcy5OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzIpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMi5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZV8zKTsKLQotCQlmVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQlmVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVGVtcGxhdGVMYWJlbFByb3ZpZGVyKCkpOwotCQlmVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlcigpKTsKLQotCQlmVGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyKSB7Ci0JCQkJaWYgKChvYmplY3QxIGluc3RhbmNlb2YgVGVtcGxhdGUpICYmIChvYmplY3QyIGluc3RhbmNlb2YgVGVtcGxhdGUpKSB7Ci0JCQkJCVRlbXBsYXRlIGxlZnQgPSAoVGVtcGxhdGUpIG9iamVjdDE7Ci0JCQkJCVRlbXBsYXRlIHJpZ2h0ID0gKFRlbXBsYXRlKSBvYmplY3QyOwotCQkJCQlpbnQgcmVzdWx0ID0gbGVmdC5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXROYW1lKCkpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApCi0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQlyZXR1cm4gbGVmdC5nZXREZXNjcmlwdGlvbigpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgb2JqZWN0MSwgb2JqZWN0Mik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzU29ydGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9KTsKLQotCQlmVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgewotCQkJCXVwZGF0ZVZpZXdlcklucHV0KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB2aWV3ZXIgdGhhdCBkaXNwbGF5cyBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUncyBjb250ZW50cwotCQlmUGF0dGVyblZpZXdlciA9IGRvQ3JlYXRlVmlld2VyKHBhcmVudCk7Ci0KLQkJZlRlbXBsYXRlU3RvcmUgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCQlmVGFibGVWaWV3ZXIuc2V0SW5wdXQoZlRlbXBsYXRlU3RvcmUpOwotCi0JCS8vIENyZWF0ZSBsaW5rZWQgdGV4dCB0byBqdXN0IHRvIHRlbXBsYXRlcyBwcmVmZXJlbmNlIHBhZ2UKLQkJTGluayBsaW5rID0gbmV3IExpbmsocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxpbmsuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLk5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfNik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWxpbmtDbGlja2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNvbmZpZ3VyZVRhYmxlUmVzaXppbmcoaW5uZXJQYXJlbnQsIHRhYmxlLCBjb2x1bW4xLCBjb2x1bW4yKTsKLQkJbG9hZExhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElIZWxwQ29udGV4dElkcy5KU1BfTkVXV0laQVJEX1RFTVBMQVRFX0hFTFBJRCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJc2V0Q29udHJvbChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMsIGNvbmZpZ3VyZXMgYW5kIHJldHVybnMgYSBzb3VyY2Ugdmlld2VyIHRvIHByZXNlbnQgdGhlIHRlbXBsYXRlCi0JICogcGF0dGVybiBvbiB0aGUgcHJlZmVyZW5jZSBwYWdlLiBDbGllbnRzIG1heSBvdmVycmlkZSB0byBwcm92aWRlIGEKLQkgKiBjdXN0b20gc291cmNlIHZpZXdlciBmZWF0dXJpbmcgZS5nLiBzeW50YXggY29sb3JpbmcuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHJldHVybiBhIGNvbmZpZ3VyZWQgc291cmNlIHZpZXdlcgotCSAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQkJfTsKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlcihwYXJlbnQsIG51bGwsIG51bGwsIGZhbHNlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJdmlld2VyLmdldFRleHRXaWRnZXQoKS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQVEFHKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gc2NyYXRjaE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl2aWV3ZXIuY29uZmlndXJlKHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCXByaXZhdGUgU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoSlNQVUlNZXNzYWdlcy5OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBjcmVhdGVWaWV3ZXIocGFyZW50KTsKLQkJdmlld2VyLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQlDb250cm9sIGNvbnRyb2wgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQkvLyBbMjYxMjc0XSAtIHNvdXJjZSB2aWV3ZXIgd2FzIGdyb3dpbmcgdG8gZml0IHRoZSBtYXggbGluZSB3aWR0aCBvZiB0aGUgdGVtcGxhdGUKLQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoMik7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZS9kaXNhYmxlIGNvbnRyb2xzIGluIHBhZ2UgYmFzZWQgb24gZlVzZVRlbXBsYXRlQnV0dG9uJ3MgY3VycmVudAotCSAqIHN0YXRlLgotCSAqLwotCXZvaWQgZW5hYmxlVGVtcGxhdGVzKCkgewotCQlib29sZWFuIGVuYWJsZWQgPSBmVXNlVGVtcGxhdGVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJaWYgKCFlbmFibGVkKSB7Ci0JCQkvLyBzYXZlIGxhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQkJaWYgKHRlbXBsYXRlICE9IG51bGwpCi0JCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJCWVsc2UKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihudWxsKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldFNlbGVjdGVkVGVtcGxhdGUoZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSk7Ci0JCX0KLQotCQlmVGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZQYXR0ZXJuVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGVtcGxhdGUgcHJlZmVyZW5jZSBwYWdlIGlkCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFByZWZlcmVuY2VQYWdlSWQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5qc3AudGVtcGxhdGVzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRlbXBsYXRlLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFRlbXBsYXRlIGdldFNlbGVjdGVkVGVtcGxhdGUoKSB7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJdGVtcGxhdGUgPSAoVGVtcGxhdGUpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gdGVtcGxhdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0ZW1wbGF0ZSBzdHJpbmcgdG8gaW5zZXJ0LgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIHRvIGluc2VydCBvciBudWxsIGlmIG5vbmUgaXMgdG8gYmUgaW5zZXJ0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VGVtcGxhdGVTdHJpbmcoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IG51bGw7Ci0KLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlUZW1wbGF0ZUNvbnRleHRUeXBlIGNvbnRleHRUeXBlID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkuZ2V0Q29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5ORVdfVEFHKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBuZXcgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCAwLCAwKTsKLQkJCXRyeSB7Ci0JCQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gY29udGV4dC5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCQkJdGVtcGxhdGVTdHJpbmcgPSBidWZmZXIuZ2V0U3RyaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSBmb3IgbmV3IGpzcCB0YWciLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRlbXBsYXRlU3RyaW5nOwotCX0KLQotCXZvaWQgbGlua0NsaWNrZWQoKSB7Ci0JCVN0cmluZyBwYWdlSWQgPSBnZXRQcmVmZXJlbmNlUGFnZUlkKCk7Ci0JCVByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBwYWdlSWQsIG5ldyBTdHJpbmdbXXtwYWdlSWR9LCBudWxsKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBOZXcgSlNQIEZpbGUgd2l6YXJkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKSB7Ci0JCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIHNldFNlbGVjdGlvbiA9IGZhbHNlOwotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhKU1BVSVByZWZlcmVuY2VOYW1lcy5ORVdfVEFHX0ZJTEVfVEVNUExBVEVfTkFNRSk7Ci0JCWlmICh0ZW1wbGF0ZU5hbWUgPT0gbnVsbCB8fCB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJdGVtcGxhdGVOYW1lID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhKU1BVSVByZWZlcmVuY2VOYW1lcy5ORVdfVEFHX0ZJTEVfVEVNUExBVEVfSUQpOwotCQkJaWYgKHRlbXBsYXRlTmFtZSAhPSBudWxsICYmIHRlbXBsYXRlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGZUZW1wbGF0ZVN0b3JlLmZpbmRUZW1wbGF0ZUJ5SWQodGVtcGxhdGVOYW1lKTsKLQkJCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJCQlzZXRTZWxlY3Rpb24gPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZU5hbWU7Ci0JCQlzZXRTZWxlY3Rpb24gPSB0cnVlOwotCQl9Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24oc2V0U2VsZWN0aW9uKTsKLQkJZW5hYmxlVGVtcGxhdGVzKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0ZW1wbGF0ZSBuYW1lIHVzZWQgZm9yIG5leHQgY2FsbCB0byBOZXcgSlNQIEZpbGUgd2l6YXJkLgotCSAqLwotCXZvaWQgc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCXRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJfQotCi0JCUpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShKU1BVSVByZWZlcmVuY2VOYW1lcy5ORVdfVEFHX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQkJSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCBhIHRlbXBsYXRlIGluIHRoZSB0YWJsZSB2aWV3ZXIgZ2l2ZW4gdGhlIHRlbXBsYXRlIG5hbWUuIElmCi0JICogdGVtcGxhdGUgbmFtZSBjYW5ub3QgYmUgZm91bmQgb3IgdGVtcGxhdGVOYW1lIGlzIG51bGwsIGp1c3Qgc2VsZWN0Ci0JICogZmlyc3QgaXRlbSBpbiB0YWJsZS4gSWYgbm8gaXRlbXMgaW4gdGFibGUgc2VsZWN0IG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFRlbXBsYXRlKFN0cmluZyB0ZW1wbGF0ZU5hbWUpIHsKLQkJT2JqZWN0IHRlbXBsYXRlID0gbnVsbDsKLQotCQlpZiAodGVtcGxhdGVOYW1lICE9IG51bGwgJiYgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJLy8gcGljayB0aGUgbGFzdCB1c2VkIHRlbXBsYXRlCi0JCQl0ZW1wbGF0ZSA9IGZUZW1wbGF0ZVN0b3JlLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuTkVXX1RBRyk7Ci0JCX0KLQotCQkvLyBubyByZWNvcmQgb2YgbGFzdCB1c2VkIHRlbXBsYXRlIHNvIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCWlmICh0ZW1wbGF0ZSA9PSBudWxsKSB7Ci0JCQkvLyBqdXN0IHBpY2sgZmlyc3QgZWxlbWVudAotCQkJdGVtcGxhdGUgPSBmVGFibGVWaWV3ZXIuZ2V0RWxlbWVudEF0KDApOwotCQl9Ci0KLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRlbXBsYXRlKTsKLQkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHBhdHRlcm4gdmlld2VyLgotCSAqLwotCXZvaWQgdXBkYXRlVmlld2VySW5wdXQoKSB7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQodGVtcGxhdGUuZ2V0UGF0dGVybigpKTsKLQkJfQotCQllbHNlIHsKLQkJCWZQYXR0ZXJuVmlld2VyLmdldERvY3VtZW50KCkuc2V0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdUYWdXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3VGFnV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MjcxNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdUYWdXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi1wdWJsaWMgY2xhc3MgTmV3VGFnV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0JcHJpdmF0ZSBOZXdUYWdGaWxlV2l6YXJkUGFnZSBmTmV3RmlsZVBhZ2U7Ci0JcHJpdmF0ZSBOZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlIGZOZXdGaWxlVGVtcGxhdGVzUGFnZTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJZk5ld0ZpbGVQYWdlID0gbmV3IE5ld1RhZ0ZpbGVXaXphcmRQYWdlKCJUYWdXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIiwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oSURFLmNvbXB1dGVTZWxlY3RlZFJlc291cmNlcyhmU2VsZWN0aW9uKSkpOyAvLyROT04tTkxTLTEkIAotCQlmTmV3RmlsZVBhZ2Uuc2V0VGl0bGUoSlNQVUlNZXNzYWdlcy5fVUlfV0laQVJEX1RBR19ORVdfSEVBRElORyk7Ci0JCWZOZXdGaWxlUGFnZS5zZXREZXNjcmlwdGlvbihKU1BVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfVEFHX05FV19ERVNDUklQVElPTik7Ci0JCWFkZFBhZ2UoZk5ld0ZpbGVQYWdlKTsKLQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2UgPSBuZXcgTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZSgpOwotCQlhZGRQYWdlKGZOZXdGaWxlVGVtcGxhdGVzUGFnZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYXBwbHlMaW5lRGVsaW1pdGVyKElGaWxlIGZpbGUsIFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0U3RyaW5nKFBsYXRmb3JtLlBJX1JVTlRJTUUsIFBsYXRmb3JtLlBSRUZfTElORV9TRVBBUkFUT1IsIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSwgbmV3IElTY29wZUNvbnRleHRbXSB7bmV3IFByb2plY3RTY29wZShmaWxlLmdldFByb2plY3QoKSksIG5ldyBJbnN0YW5jZVNjb3BlKCkgfSk7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UodGV4dCwgIlxyXG4iLCAiXG4iKTsKLQkJY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoY29udmVydGVkVGV4dCwgIlxyIiwgIlxuIik7Ci0JCWNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKGNvbnZlcnRlZFRleHQsICJcbiIsIGxpbmVEZWxpbWl0ZXIpOwotCQlyZXR1cm4gY29udmVydGVkVGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggYVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCQlmU2VsZWN0aW9uID0gYVNlbGVjdGlvbjsKLQkJc2V0V2luZG93VGl0bGUoSlNQVUlNZXNzYWdlcy5fVUlfV0laQVJEX1RBR19ORVdfVElUTEUpOwotCi0JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfV0laQkFOX05FV1RBR0ZJTEUpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJYm9vbGVhbiBwZXJmb3JtZWRPSyA9IGZhbHNlOwotCi0JCS8vIHNhdmUgdXNlciBvcHRpb25zIGZvciBuZXh0IHVzZQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2Uuc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGFkZCBkZWZhdWx0IGV4dGVuc2lvbgotCQlTdHJpbmcgZmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGZOZXdGaWxlUGFnZS5hZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCWZOZXdGaWxlUGFnZS5zZXRGaWxlTmFtZShuZXdGaWxlTmFtZSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSBuZXcgZW1wdHkgZmlsZQotCQlJRmlsZSBmaWxlID0gZk5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQkvLyBpZiB0aGVyZSB3YXMgcHJvYmxlbSB3aXRoIGNyZWF0aW5nIGZpbGUsIGl0IHdpbGwgYmUgbnVsbCwgc28gbWFrZQotCQkvLyBzdXJlIHRvIGNoZWNrCi0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCS8vIHB1dCB0ZW1wbGF0ZSBjb250ZW50cyBpbnRvIGZpbGUKLQkJCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IGZOZXdGaWxlVGVtcGxhdGVzUGFnZS5nZXRUZW1wbGF0ZVN0cmluZygpOwotCQkJaWYgKHRlbXBsYXRlU3RyaW5nICE9IG51bGwpIHsKLQkJCQl0ZW1wbGF0ZVN0cmluZyA9IGFwcGx5TGluZURlbGltaXRlcihmaWxlLCB0ZW1wbGF0ZVN0cmluZyk7Ci0JCQkJLy8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZyBmb3IgdGhlIG5ldyBmaWxlCi0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0KLQkJCQl0cnkgewotCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0U3RyZWFtV3JpdGVyID0gbnVsbDsKLQkJCQkJaWYgKGNoYXJTZXQgPT0gbnVsbCB8fCBjaGFyU2V0LnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIGp1c3QgdXNlIGRlZmF1bHQgZW5jb2RpbmcKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyU2V0KTsKLQkJCQkJfQotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIud3JpdGUodGVtcGxhdGVTdHJpbmcpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmNsb3NlKCk7Ci0JCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgY29udGVudHMgZm9yIG5ldyBUYWcgZmlsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQkvLyBvcGVuIHRoZSBmaWxlIGluIGVkaXRvcgotCQkJb3BlbkVkaXRvcihmaWxlKTsKLQotCQkJLy8gZXZlcnl0aGluZydzIGZpbmUKLQkJCXBlcmZvcm1lZE9LID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcGVyZm9ybWVkT0s7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pTUENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pTUENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWVlOTJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS92aWV3cy9jb250ZW50b3V0bGluZS9KU1BDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmFjdGlvbnMuSlNQTm9kZUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudmlld3MuY29udGVudG91dGxpbmUuSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlhNTE5vZGVBY3Rpb25NYW5hZ2VyOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIG91dGxpbmUgdmlldyBwYWdlIHdoaWNoIHNob3dzIEpTUCBjb250ZW50LgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBIVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIHsKLQotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUT0RPOiBBdXRvbWF0ZSB0aGUgbG9hZGluZyBvZiBhIHJlYWwgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgbW9kZWwKLQkvLyB0eXBlIGF0Ci0JLy8gY3JlYXRpb24gdGltZTsgY2xlYXIgb24gdW5Db25maWd1cmUgc28gdGhhdCBhIG5ldyBlbWJlZGRlZAotCS8vIGNvbmZpZ3VyYXRpb24gY2FuCi0JLy8gYmUgdXNlZAotCS8vIHByaXZhdGUgU3RydWN0dXJlZENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiBmRW1iZWRkZWRDb25maWd1cmF0aW9uID0KLQkvLyBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBKU1BDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgSlNQQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBYTUxOb2RlQWN0aW9uTWFuYWdlciBjcmVhdGVOb2RlQWN0aW9uTWFuYWdlcihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJcmV0dXJuIG5ldyBKU1BOb2RlQWN0aW9uTWFuYWdlcigoSVN0cnVjdHVyZWRNb2RlbCkgdHJlZVZpZXdlci5nZXRJbnB1dCgpLCB0cmVlVmlld2VyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvdGVtcGxhdGVzL2pzcGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvdGVtcGxhdGVzL2pzcGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZDlkZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3RlbXBsYXRlcy9qc3BkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVGVtcGxhdGVzLmpzcHNjcmlwdGxldC5uYW1lPUpTUCBzY3JpcHRsZXQKLVRlbXBsYXRlcy5qc3BzY3JpcHRsZXQuZGVzYz1KU1Agc2NyaXB0bGV0IDwlLi4lPgotVGVtcGxhdGVzLmpzcHNjcmlwdGxldC5jb250ZW50PTwlICR7Y3Vyc29yfSAlPgotVGVtcGxhdGVzLmpzcGhpZGRlbmNvbW1lbnQubmFtZT1KU1AgaGlkZGVuIGNvbW1lbnQKLVRlbXBsYXRlcy5qc3BoaWRkZW5jb21tZW50LmRlc2M9SlNQIGhpZGRlbiBjb21tZW50IDwlLS0gLS0lPgotVGVtcGxhdGVzLmpzcGhpZGRlbmNvbW1lbnQuY29udGVudD08JS0tICR7Y3Vyc29yfSAtLSU+Ci1UZW1wbGF0ZXMuanNwZGVjbGFyYXRpb24ubmFtZT1KU1AgZGVjbGFyYXRpb24ocykKLVRlbXBsYXRlcy5qc3BkZWNsYXJhdGlvbi5kZXNjPUpTUCBkZWNsYXJhdGlvbihzKSA8JSEuLiU+Ci1UZW1wbGF0ZXMuanNwZGVjbGFyYXRpb24uY29udGVudD08JSEgJHtjdXJzb3J9ICU+Ci1UZW1wbGF0ZXMuanNwZXhwcmVzc2lvbi5uYW1lPUpTUCBleHByZXNzaW9uCi1UZW1wbGF0ZXMuanNwZXhwcmVzc2lvbi5kZXNjPUpTUCBleHByZXNzaW9uIDwlPS4uJT4KLVRlbXBsYXRlcy5qc3BleHByZXNzaW9uLmNvbnRlbnQ9PCU9ICR7Y3Vyc29yfSAlPgotVGVtcGxhdGVzLmpzcGluY2x1ZGVkaXJlY3RpdmUubmFtZT1KU1AgaW5jbHVkZSBkaXJlY3RpdmUKLVRlbXBsYXRlcy5qc3BpbmNsdWRlZGlyZWN0aXZlLmRlc2M9SlNQIGluY2x1ZGUgZGlyZWN0aXZlCi1UZW1wbGF0ZXMuanNwaW5jbHVkZWRpcmVjdGl2ZS5jb250ZW50PTwlQCBpbmNsdWRlIGZpbGU9IiR7Y3Vyc29yfSIgJT4KLVRlbXBsYXRlcy5qc3BwYWdlZGlyZWN0aXZlLm5hbWU9SlNQIHBhZ2UgZGlyZWN0aXZlCi1UZW1wbGF0ZXMuanNwcGFnZWRpcmVjdGl2ZS5kZXNjPUpTUCBwYWdlIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcHBhZ2VkaXJlY3RpdmUuY29udGVudD08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9IiAlPgotVGVtcGxhdGVzLmpzcHRhZ2xpYmRpcmVjdGl2ZS5uYW1lPUpTUCB0YWdsaWIgZGlyZWN0aXZlCi1UZW1wbGF0ZXMuanNwdGFnbGliZGlyZWN0aXZlLmRlc2M9SlNQIHRhZ2xpYiBkaXJlY3RpdmUKLVRlbXBsYXRlcy5qc3B0YWdsaWJkaXJlY3RpdmUuY29udGVudD08JUAgdGFnbGliIHVyaT0iJHtjdXJzb3J9IiBwcmVmaXg9IiIgJT4KLVRlbXBsYXRlcy5qc3BodG1sLm5hbWU9TmV3IEpTUCBGaWxlIChodG1sKQotVGVtcGxhdGVzLmpzcGh0bWwuZGVzYz1KU1Agd2l0aCBodG1sIG1hcmt1cAotVGVtcGxhdGVzLmpzcGh0bWwuY29udGVudD08JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD0ke2VuY29kaW5nfSJcbiAgICBwYWdlRW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9IiU+XG48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj5cbjxodG1sPlxuPGhlYWQ+XG48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0ke2VuY29kaW5nfSI+XG48dGl0bGU+SW5zZXJ0IHRpdGxlIGhlcmU8L3RpdGxlPlxuPC9oZWFkPlxuPGJvZHk+XG4ke2N1cnNvcn1cbjwvYm9keT5cbjwvaHRtbD4KLVRlbXBsYXRlcy5qc3B4aHRtbC5uYW1lPU5ldyBKU1AgRmlsZSAoeGh0bWwpCi1UZW1wbGF0ZXMuanNweGh0bWwuZGVzYz1KU1Agd2l0aCB4aHRtbCBtYXJrdXAKLVRlbXBsYXRlcy5qc3B4aHRtbC5jb250ZW50PTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9IiA/PlxuPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iXG4gICAgcGFnZUVuY29kaW5nPSIke2VuY29kaW5nfSIlPlxuPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPlxuPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPlxuPGhlYWQ+XG48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0ke2VuY29kaW5nfSIgLz5cbjx0aXRsZT5JbnNlcnQgdGl0bGUgaGVyZTwvdGl0bGU+XG48L2hlYWQ+XG48Ym9keT5cbiR7Y3Vyc29yfVxuPC9ib2R5PlxuPC9odG1sPgotVGVtcGxhdGVzLmpzcHhodG1seG1sLm5hbWU9TmV3IEpTUCBGaWxlICh4aHRtbCwgeG1sIHN5bnRheCkKLVRlbXBsYXRlcy5qc3B4aHRtbHhtbC5kZXNjPUpTUCB3aXRoIHhodG1sIG1hcmt1cCBhbmQgeG1sIHN0eWxlIHN5bnRheAotVGVtcGxhdGVzLmpzcHhodG1seG1sLmNvbnRlbnQ9PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJHtlbmNvZGluZ30iID8+XG48anNwOnJvb3QgeG1sbnM6anNwPSJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIiB2ZXJzaW9uPSIyLjAiPlxuICAgIDxqc3A6ZGlyZWN0aXZlLnBhZ2UgbGFuZ3VhZ2U9ImphdmEiXG4gICAgICAgIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iIHBhZ2VFbmNvZGluZz0iJHtlbmNvZGluZ30iIC8+XG4gICAgPGpzcDp0ZXh0PlxuICAgICAgICA8IVtDREFUQVsgPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJHtlbmNvZGluZ30iID8+IF1dPlxuICAgIDwvanNwOnRleHQ+XG4gICAgPGpzcDp0ZXh0PlxuICAgICAgICA8IVtDREFUQVsgPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPiBdXT5cbiAgICA8L2pzcDp0ZXh0PlxuPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPlxuPGhlYWQ+XG48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0ke2VuY29kaW5nfSIgLz5cbjx0aXRsZT5JbnNlcnQgdGl0bGUgaGVyZTwvdGl0bGU+XG48L2hlYWQ+XG48Ym9keT5cbiR7Y3Vyc29yfVxuPC9ib2R5PlxuPC9odG1sPlxuPC9qc3A6cm9vdD4KLQotVGVtcGxhdGVzLmpzcDIweGh0bWx4bWwubmFtZT1OZXcgSlNQIEZpbGUgKHhodG1sLCB4bWwgc3ludGF4LCBKU1AgMi4wKQotVGVtcGxhdGVzLmpzcDIweGh0bWx4bWwuZGVzYz1KU1Agd2l0aCBKU1AgMi4wIHNwZWNpZmljIHRhZ3MsIHhodG1sIG1hcmt1cCBhbmQgeG1sIHN0eWxlIHN5bnRheAotVGVtcGxhdGVzLmpzcDIweGh0bWx4bWwuY29udGVudD08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIke2VuY29kaW5nfSIgPz5cbjxqc3A6cm9vdCB4bWxuczpqc3A9Imh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiIHZlcnNpb249IjIuMCI+XG5cdDxqc3A6ZGlyZWN0aXZlLnBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD0ke2VuY29kaW5nfSIgXG5cdFx0cGFnZUVuY29kaW5nPSIke2VuY29kaW5nfSIgc2Vzc2lvbj0iZmFsc2UiLz5cblx0PGpzcDpvdXRwdXQgZG9jdHlwZS1yb290LWVsZW1lbnQ9Imh0bWwiXG5cdFx0ZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIlxuXHRcdGRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIlxuXHRcdG9taXQteG1sLWRlY2xhcmF0aW9uPSJ0cnVlIiAvPlxuPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPlxuPGhlYWQ+XG48dGl0bGU+SW5zZXJ0IHRpdGxlIGhlcmU8L3RpdGxlPlxuPC9oZWFkPlxuPGJvZHk+XG4ke2N1cnNvcn1cbjwvYm9keT5cbjwvaHRtbD5cbjwvanNwOnJvb3Q+Ci0KLVRlbXBsYXRlcy5qc3B0YWdkaXJlY3RpdmUubmFtZT1UYWcgZmlsZSB0YWcgZGlyZWN0aXZlCi1UZW1wbGF0ZXMuanNwdGFnZGlyZWN0aXZlLmRlc2M9VGFnIGZpbGUgdGFnIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcHRhZ2RpcmVjdGl2ZS5jb250ZW50PTwlQCB0YWcgZGlzcGxheS1uYW1lPSIke2N1cnNvcn0iIGRlc2NyaXB0aW9uPSIiIHNtYWxsLWljb249IiIgJT4KLQotVGVtcGxhdGVzLmpzcHZhcmlhYmxlZGlyZWN0aXZlLm5hbWU9VGFnIHZhcmlhYmxlIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcHZhcmlhYmxlZGlyZWN0aXZlLmRlc2M9VGFnIHZhcmlhYmxlIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcHZhcmlhYmxlZGlyZWN0aXZlLmNvbnRlbnQ9PCVAIHZhcmlhYmxlIHZhcmlhYmxlLWNsYXNzPSIke2N1cnNvcn0iIGRlc2NyaXB0aW9uPSIiICU+Ci0KLVRlbXBsYXRlcy5qc3BhdHRyaWJ1dGVkaXJlY3RpdmUubmFtZT1UYWcgYXR0cmlidXRlIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcGF0dHJpYnV0ZWRpcmVjdGl2ZS5kZXNjPVRhZyBhdHRyaWJ1dGUgZGlyZWN0aXZlCi1UZW1wbGF0ZXMuanNwYXR0cmlidXRlZGlyZWN0aXZlLmNvbnRlbnQ9PCVAIGF0dHJpYnV0ZSBuYW1lPSIke2N1cnNvcn0iIGRlc2NyaXB0aW9uPSIiIHJlcXVpcmVkPSJmYWxzZSIgdHlwZT0iIiAlPgotCi1UZW1wbGF0ZXMuc2ltcGxldGFnLm5hbWU9TmV3IFRhZyBGaWxlCi1UZW1wbGF0ZXMuc2ltcGxldGFnLmRlc2M9TmV3IEpTUCBUYWcgRmlsZQotVGVtcGxhdGVzLnNpbXBsZXRhZy5jb250ZW50PTwlQCB0YWcgbGFuZ3VhZ2U9ImphdmEiIHBhZ2VFbmNvZGluZz0iJHtlbmNvZGluZ30iJT5cbgotCi1UZW1wbGF0ZXMuc2ltcGxldGFneC5uYW1lPU5ldyBUYWdYIEZpbGUKLVRlbXBsYXRlcy5zaW1wbGV0YWd4LmRlc2M9TmV3IEpTUCBUYWdYIEZpbGUKLVRlbXBsYXRlcy5zaW1wbGV0YWd4LmNvbnRlbnQ9PGpzcDpkaXJlY3RpdmUudGFnIGxhbmd1YWdlPSJqYXZhIiBwYWdlRW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9Ii8+XG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS90ZW1wbGF0ZXMvanNwZGVmYXVsdC10ZW1wbGF0ZXMueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3RlbXBsYXRlcy9qc3BkZWZhdWx0LXRlbXBsYXRlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NWE4MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3RlbXBsYXRlcy9qc3BkZWZhdWx0LXRlbXBsYXRlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPHRlbXBsYXRlcz4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwc2NyaXB0bGV0Lm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcHNjcmlwdGxldC5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNwc2NyaXB0bGV0IiBjb250ZXh0PSJqc3BfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcHNjcmlwdGxldC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwaGlkZGVuY29tbWVudC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3BoaWRkZW5jb21tZW50LmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BoaWRkZW5jb21tZW50IiBjb250ZXh0PSJqc3BfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcGhpZGRlbmNvbW1lbnQuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmpzcGRlY2xhcmF0aW9uLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcGRlY2xhcmF0aW9uLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BkZWNsYXJhdGlvbiIgY29udGV4dD0ianNwX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5qc3BkZWNsYXJhdGlvbi5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwZXhwcmVzc2lvbi5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3BleHByZXNzaW9uLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BleHByZXNzaW9uIiBjb250ZXh0PSJqc3BfYWxsIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcGV4cHJlc3Npb24uY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmpzcGluY2x1ZGVkaXJlY3RpdmUubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuanNwaW5jbHVkZWRpcmVjdGl2ZS5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNwaW5jbHVkZWRpcmVjdGl2ZSIgY29udGV4dD0ianNwX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5qc3BpbmNsdWRlZGlyZWN0aXZlLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5qc3BwYWdlZGlyZWN0aXZlLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcHBhZ2VkaXJlY3RpdmUuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcHBhZ2VkaXJlY3RpdmUiIGNvbnRleHQ9ImpzcF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuanNwcGFnZWRpcmVjdGl2ZS5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwdGFnbGliZGlyZWN0aXZlLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcHRhZ2xpYmRpcmVjdGl2ZS5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNwdGFnbGliZGlyZWN0aXZlIiBjb250ZXh0PSJqc3BfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcHRhZ2xpYmRpcmVjdGl2ZS5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwaHRtbC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3BodG1sLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BodG1sIiBjb250ZXh0PSJqc3BfbmV3IiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcGh0bWwuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmpzcHhodG1sLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcHhodG1sLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3B4aHRtbCIgY29udGV4dD0ianNwX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5qc3B4aHRtbC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNweGh0bWx4bWwubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuanNweGh0bWx4bWwuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcHhodG1seG1sIiBjb250ZXh0PSJqc3BfbmV3IiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcHhodG1seG1sLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5qc3AyMHhodG1seG1sLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcDIweGh0bWx4bWwuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcDIweGh0bWx4bWwiIGNvbnRleHQ9ImpzcF9uZXciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuanNwMjB4aHRtbHhtbC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwdGFnZGlyZWN0aXZlLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcHRhZ2RpcmVjdGl2ZS5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNwdGFnZGlyZWN0aXZlIiBjb250ZXh0PSJqc3BfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcHRhZ2RpcmVjdGl2ZS5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwdmFyaWFibGVkaXJlY3RpdmUubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuanNwdmFyaWFibGVkaXJlY3RpdmUuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcHZhcmlhYmxlZGlyZWN0aXZlIiBjb250ZXh0PSJqc3BfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcHZhcmlhYmxlZGlyZWN0aXZlLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5qc3BhdHRyaWJ1dGVkaXJlY3RpdmUubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuanNwYXR0cmlidXRlZGlyZWN0aXZlLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BhdHRyaWJ1dGVkaXJlY3RpdmUiIGNvbnRleHQ9ImpzcF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuanNwYXR0cmlidXRlZGlyZWN0aXZlLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5zaW1wbGV0YWcubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuc2ltcGxldGFnLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5zaW1wbGV0YWciIGNvbnRleHQ9InRhZ19uZXciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuc2ltcGxldGFnLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5zaW1wbGV0YWd4Lm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnNpbXBsZXRhZ3guZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLnNpbXBsZXRhZ3giIGNvbnRleHQ9InRhZ19uZXciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuc2ltcGxldGFneC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5NzRlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjVjMDkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVHVlIEZlYiAwOSAxNzo1MzowMiBFU1QgMjAxMAotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy8vZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VsZXR0YWdsaWJyYXJ5XzJfMC54c2Q9VVRGOApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGFjOWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNTYXQgQXByIDI4IDA5OjI4OjMxIEVEVCAyMDA3Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTEKLWNvbXBpbGVycy5wLmJ1aWxkPTEKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubWlzc2luZy1wYWNrYWdlcz0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MQotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0xCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWFiMTIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDZiMzA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIgLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPHA+SmFudWFyeSwgMjAxMDwvcD4KLTxoMz5MaWNlbnNlPC9oMz4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMKLXBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlCi1Db250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiBBIGNvcHkgb2YgdGhlIEVQTCBpcwotYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlCi1Gb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkKLSgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseQotdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzCi1saWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsCi1jb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zCi1hbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhCi0JaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9hPi48L3A+Ci08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQKLXBhcnRpZXMgYXMgc2V0IG91dCBiZWxvdy4gSWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkKLWZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCBmb3IgaW5mb3JtYXRpb25hbAotcHVycG9zZXMgb25seSwgYW5kIHlvdSBzaG91bGQgbG9vayB0byB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgZm9yCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuPC9wPgotPGg0PkFwcHNlcnYgQ29tbW9ucyBzY2hlbWFzIGFuZCBEVERzIHYyX2IzMyAoU3Vic2V0KTwvaDQ+Ci08cD5Zb3VyIHVzZSBvZiB0aGUgQXBwc2VydiBDb21tb25zIHNjaGVtYXMgYW5kIERURHMgaXMgc3ViamVjdCB0bwotdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbgotTGljZW5zZSB2MS4wLiBBIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaXMgY29udGFpbmVkIGluIHRoZSBmaWxlIDxhCi0JaHJlZj0iYWJvdXRfZmlsZXMvQ0RETHYxLjAudHh0Ij5MSUNFTlNFLnR4dDwvYT4gYW5kIGlzIGFsc28gYXZhaWxhYmxlCi1hdCA8YSBocmVmPSJodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWwiPmh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbDwvYT4uCi08L3A+Ci08cD5UaGUgc291cmNlIGZvciB0aGUgc2NoZW1hcyBhbmQgRFREcyBpcyBhdmFpbGFibGUgb24gdGhlIEdsYXNzZmlzaAotY29tbXVuaXR5IHdlYnNpdGUgYXQgPGEKLQlocmVmPSJodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL2Rvd25sb2Fkc2luZGV4Lmh0bWwiPmh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC88L2E+LgotPC9wPgotCi08aDQ+SmF2YSBTZXJ2ZXIgRmFjZXMgMS4yIFNjaGVtYSBhbmQgRFREcyAoU3Vic2V0KTwvaDQ+Ci08cD5Zb3VyIHVzZSBvZiB0aGUgSmF2YSBTZXJ2ZXIgRmFjZXMgc2NoZW1hcyBhbmQgRFREcyBpcyBzdWJqZWN0IHRvCi10aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uCi1MaWNlbnNlIHYxLjAuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBjb250YWluZWQgaW4gdGhlIGZpbGUgPGEKLQlocmVmPSJhYm91dF9maWxlcy9DRERMdjEuMC50eHQiPkxJQ0VOU0UudHh0PC9hPiBhbmQgaXMgYWxzbyBhdmFpbGFibGUKLWF0IDxhIGhyZWY9Imh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbCI+aHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMdjEuMC5odG1sPC9hPi4KLTwvcD4KLTxwPlRoZSBzb3VyY2UgZm9yIHRoZSBzY2hlbWFzIGFuZCBEVERzIGlzIGF2YWlsYWJsZSBvbiB0aGUgSmF2YQotU2VydmVyIEZhY2VzIHByb2plY3QgcGFnZSBvbiB0aGUgR2xhc3NmaXNoIGNvbW11bml0eSB3ZWJzaXRlIGF0IDxhCi0JaHJlZj0iaHR0cHM6Ly9qYXZhc2VydmVyZmFjZXMuZGV2LmphdmEubmV0Ij5odHRwczovL2phdmFzZXJ2ZXJmYWNlcy5kZXYuamF2YS5uZXQvPC9hPi4KLTwvcD4KLQotPGg0PkphdmEgUGVyc2lzdGVuY2UgQVBJIFhNTCBTY2hlbWFzPC9oND4KLTxwPllvdXIgdXNlIG9mIHRoZSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBYTUwgU2NoZW1hcyAob3JtXzFfMC54c2QsCi1wZXJzaXN0ZW5jZV8xXzAueHNkKSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgdjEuMC4gQSBjb3B5IG9mIHRoZSBsaWNlbnNlCi1pcyBjb250YWluZWQgaW4gdGhlIGZpbGUgPGEgaHJlZj0iYWJvdXRfZmlsZXMvQ0RETHYxLjAudHh0Ij5MSUNFTlNFLnR4dDwvYT4KLWFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQotCWhyZWY9Imh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbCI+aHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMdjEuMC5odG1sPC9hPi4KLTwvcD4KLTxwPlRoZSBvcmlnaW5hbCBzb3VyY2UgZm9yIHRoZSBzY2hlbWFzIGlzIGF2YWlsYWJsZSBvbiA8YQotCWhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlLyI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UvPC9hPi4KLTwvcD4KLQotPGg0PkphdmEgRUUgNiBYTUwgU2NoZW1hczwvaDQ+Ci08cD5Zb3VyIHVzZSBvZiB0aGUgSmF2YSBFRSA2IFhNTCBTY2hlbWFzIChhcHBsaWNhdGlvbl82LnhzZCwKLWFwcGxpY2F0aW9uLWNsaWVudC02LnhzZCwgY29ubmVjdG9yXzFfNi54c2QsIGVqYi1qYXJfM18xLnhzZCwKLWphdmFlZV82LnhzZCwgamF2YWVlX3dlYl9zZXJ2aWNlc18xXzMueHNkLAotamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8zLnhzZCwganNwXzJfMi54c2QsIHdlYi1hcHBfM18wLnhzZCwKLXdlYi1jb21tb25fM18wLnhzZCwgd2ViLWZyYWdtZW50XzNfMC54c2QpIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZAotY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wLiBBCi1jb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSA8YQotCWhyZWY9ImFib3V0X2ZpbGVzL0NEREx2MS4wLnR4dCI+TElDRU5TRS50eHQ8L2E+IGFuZCBpcyBhbHNvIGF2YWlsYWJsZQotYXQgPGEgaHJlZj0iaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMdjEuMC5odG1sIj5odHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWw8L2E+LgotPC9wPgotPHA+VGhlIG9yaWdpbmFsIHNvdXJjZSBmb3IgdGhlIHNjaGVtYXMgaXMgYXZhaWxhYmxlIG9uIDxhCi0JaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlLyI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlLzwvYT4uCi08L3A+Ci0KLTxoND5KYXZhIFNlcnZlciBGYWNlcyAyLjAgU2NoZW1hPC9oND4KLTxwPllvdXIgdXNlIG9mIHRoZSBKYXZhIFNlcnZlciBGYWNlcyAyLjAgc2NoZW1hcyBpcyBzdWJqZWN0IHRvIHRoZQotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UKLXYxLjAuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBjb250YWluZWQgaW4gdGhlIGZpbGUgPGEKLQlocmVmPSJhYm91dF9maWxlcy9DRERMdjEuMC50eHQiPkxJQ0VOU0UudHh0PC9hPiBhbmQgaXMgYWxzbyBhdmFpbGFibGUKLWF0IDxhIGhyZWY9Imh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbCI+aHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMdjEuMC5odG1sPC9hPi4KLTwvcD4KLTxwPlRoZSBzb3VyY2UgZm9yIHRoZSBzY2hlbWEgaXMgYXZhaWxhYmxlIG9uIHRoZSBKYXZhIFNlcnZlciBGYWNlcwotcHJvamVjdCBwYWdlIG9uIHRoZSBHbGFzc2Zpc2ggY29tbXVuaXR5IHdlYnNpdGUgYXQgPGEKLQlocmVmPSJodHRwczovL2phdmFzZXJ2ZXJmYWNlcy5kZXYuamF2YS5uZXQiPmh0dHBzOi8vamF2YXNlcnZlcmZhY2VzLmRldi5qYXZhLm5ldC88L2E+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL0NEREx2MS4wLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvQ0RETHYxLjAudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU0ZTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvQ0RETHYxLjAudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLUNPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4wCi0KLTEuIERlZmluaXRpb25zLgotCi0xLjEuIENvbnRyaWJ1dG9yIG1lYW5zIGVhY2ggaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBjcmVhdGVzIG9yIGNvbnRyaWJ1dGVzIHRvIHRoZSBjcmVhdGlvbiBvZiBNb2RpZmljYXRpb25zLgotCi0xLjIuIENvbnRyaWJ1dG9yIFZlcnNpb24gbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgcHJpb3IgTW9kaWZpY2F0aW9ucyB1c2VkIGJ5IGEgQ29udHJpYnV0b3IgKGlmIGFueSksIGFuZCB0aGUgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KLQotMS4zLiBDb3ZlcmVkIFNvZnR3YXJlIG1lYW5zIChhKSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yIChiKSBNb2RpZmljYXRpb25zLCBvciAoYykgdGhlIGNvbWJpbmF0aW9uIG9mIGZpbGVzIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgd2l0aCBmaWxlcyBjb250YWluaW5nIE1vZGlmaWNhdGlvbnMsIGluIGVhY2ggY2FzZSBpbmNsdWRpbmcgcG9ydGlvbnMgdGhlcmVvZi4KLQotMS40LiBFeGVjdXRhYmxlIG1lYW5zIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIGFueSBmb3JtIG90aGVyIHRoYW4gU291cmNlIENvZGUuCi0KLTEuNS4gSW5pdGlhbCBEZXZlbG9wZXIgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQgZmlyc3QgbWFrZXMgT3JpZ2luYWwgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotMS42LiBMYXJnZXIgV29yayBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZCBTb2Z0d2FyZSBvciBwb3J0aW9ucyB0aGVyZW9mIHdpdGggY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotMS43LiBMaWNlbnNlIG1lYW5zIHRoaXMgZG9jdW1lbnQuCi0KLTEuOC4gTGljZW5zYWJsZSBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUgbWF4aW11bSBleHRlbnQgcG9zc2libGUsIHdoZXRoZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGluaXRpYWwgZ3JhbnQgb3Igc3Vic2VxdWVudGx5IGFjcXVpcmVkLCBhbnkgYW5kIGFsbCBvZiB0aGUgcmlnaHRzIGNvbnZleWVkIGhlcmVpbi4KLQotMS45LiBNb2RpZmljYXRpb25zIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtIG9mIGFueSBvZiB0aGUgZm9sbG93aW5nOgotCi1BLiBBbnkgZmlsZSB0aGF0IHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywgZGVsZXRpb24gZnJvbSBvciBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbnM7Ci0KLUIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cyBNb2RpZmljYXRpb247IG9yCi0KLUMuIEFueSBuZXcgZmlsZSB0aGF0IGlzIGNvbnRyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0xLjEwLiBPcmlnaW5hbCBTb2Z0d2FyZSBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUgZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIHRoYXQgaXMgb3JpZ2luYWxseSByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLTEuMTEuIFBhdGVudCBDbGFpbXMgbWVhbnMgYW55IHBhdGVudCBjbGFpbShzKSwgbm93IG93bmVkIG9yIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgbWV0aG9kLCBwcm9jZXNzLCBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudCBMaWNlbnNhYmxlIGJ5IGdyYW50b3IuCi0KLTEuMTIuIFNvdXJjZSBDb2RlIG1lYW5zIChhKSB0aGUgY29tbW9uIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSBpbiB3aGljaCBtb2RpZmljYXRpb25zIGFyZSBtYWRlIGFuZCAoYikgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIGluIG9yIHdpdGggc3VjaCBjb2RlLgotCi0xLjEzLiBZb3UgKG9yIFlvdXIpIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYSBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YgdGhlIHRlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgWW91IGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCBjb250cm9sIG1lYW5zIChhKeF0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGIp4W93bmVyc2hpcCBvZiBtb3JlIHRoYW4gZmlmdHkgcGVyY2VudCAoNTAlKSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzIG9yIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0yLiBMaWNlbnNlIEdyYW50cy4KLQotMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCi1Db25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIHRoZSBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgotKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCB3aXRoIG9yIHdpdGhvdXQgTW9kaWZpY2F0aW9ucywgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCi0oYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcgb3Igc2VsbGluZyBvZiBPcmlnaW5hbCBTb2Z0d2FyZSwgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIHByYWN0aWNlLCBzZWxsLCBhbmQgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpLgotKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25z4TIuMShhKSBhbmQgKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgSW5pdGlhbCBEZXZlbG9wZXIgZmlyc3QgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9u4TIuMShiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEp4WZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKDIp4WZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkp4XRoZSBtb2RpZmljYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoaWkp4XRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBkZXZpY2VzLgotCi0yLjIuIENvbnRyaWJ1dG9yIEdyYW50LgotQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6Ci0oYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IENvbnRyaWJ1dG9yIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE1vZGlmaWNhdGlvbnMgY3JlYXRlZCBieSBzdWNoIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgZWl0aGVyIG9uIGFuIHVubW9kaWZpZWQgYmFzaXMsIHdpdGggb3RoZXIgTW9kaWZpY2F0aW9ucywgYXMgQ292ZXJlZCBTb2Z0d2FyZSBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKLShiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLCB1c2luZywgb3Igc2VsbGluZyBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciBlaXRoZXIgYWxvbmUgYW5kL29yIGluIGNvbWJpbmF0aW9uIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBoYXZlIG1hZGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZjogKDEp4U1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKTsgYW5kICgyKeF0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3Igd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaCBjb21iaW5hdGlvbikuCi0oYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnPhMi4yKGEpIGFuZCAyLjIoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE1vZGlmaWNhdGlvbnMgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkuCi0oZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb27hMi4yKGIpIGFib3ZlLCBubyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkOiAoMSnhZm9yIGFueSBjb2RlIHRoYXQgQ29udHJpYnV0b3IgaGFzIGRlbGV0ZWQgZnJvbSB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbjsgKDIp4WZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkp4XRoaXJkIHBhcnR5IG1vZGlmaWNhdGlvbnMgb2YgQ29udHJpYnV0b3IgVmVyc2lvbiwgb3IgKGlpKeF0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3Igd2l0aCBvdGhlciBzb2Z0d2FyZSAoZXhjZXB0IGFzIHBhcnQgb2YgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24pIG9yIG90aGVyIGRldmljZXM7IG9yICgzKeF1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSBDb3ZlcmVkIFNvZnR3YXJlIGluIHRoZSBhYnNlbmNlIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yLgotCi0zLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuCi0KLTMuMS4gQXZhaWxhYmlsaXR5IG9mIFNvdXJjZSBDb2RlLgotCi1BbnkgQ292ZXJlZCBTb2Z0d2FyZSB0aGF0IFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBpbiBFeGVjdXRhYmxlIGZvcm0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGluIFNvdXJjZSBDb2RlIGZvcm0gYW5kIHRoYXQgU291cmNlIENvZGUgZm9ybSBtdXN0IGJlIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUgU291cmNlIENvZGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUuIFlvdSBtdXN0IGluZm9ybSByZWNpcGllbnRzIG9mIGFueSBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIGFzIHRvIGhvdyB0aGV5IGNhbiBvYnRhaW4gc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgotCi0zLjIuIE1vZGlmaWNhdGlvbnMuCi0KLVRoZSBNb2RpZmljYXRpb25zIHRoYXQgWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSBhcmUgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IHJlcHJlc2VudCB0aGF0IFlvdSBiZWxpZXZlIFlvdXIgTW9kaWZpY2F0aW9ucyBhcmUgWW91ciBvcmlnaW5hbCBjcmVhdGlvbihzKSBhbmQvb3IgWW91IGhhdmUgc3VmZmljaWVudCByaWdodHMgdG8gZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuCi0KLTMuMy4gUmVxdWlyZWQgTm90aWNlcy4KLVlvdSBtdXN0IGluY2x1ZGUgYSBub3RpY2UgaW4gZWFjaCBvZiBZb3VyIE1vZGlmaWNhdGlvbnMgdGhhdCBpZGVudGlmaWVzIFlvdSBhcyB0aGUgQ29udHJpYnV0b3Igb2YgdGhlIE1vZGlmaWNhdGlvbi4gWW91IG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCBvciB0cmFkZW1hcmsgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLCBvciBhbnkgbm90aWNlcyBvZiBsaWNlbnNpbmcgb3IgYW55IGRlc2NyaXB0aXZlIHRleHQgZ2l2aW5nIGF0dHJpYnV0aW9uIHRvIGFueSBDb250cmlidXRvciBvciB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuCi0KLTMuNC4gQXBwbGljYXRpb24gb2YgQWRkaXRpb25hbCBUZXJtcy4KLVlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlIGFwcGxpY2FibGUgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2Ugb3IgdGhlIHJlY2lwaWVudHMgcmlnaHRzIGhlcmV1bmRlci4gWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsIGFuZCB0byBjaGFyZ2UgYSBmZWUgZm9yLCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyB0byBvbmUgb3IgbW9yZSByZWNpcGllbnRzIG9mIENvdmVyZWQgU29mdHdhcmUuIEhvd2V2ZXIsIHlvdSBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24gYmVoYWxmIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSBzdWNoIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4KLQotMy41LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KLVlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zIG9mIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGVybXMgZGlmZmVyZW50IGZyb20gdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB0aGF0IFlvdSBhcmUgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIGZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50cyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIGZvcm0gZnJvbSB0aGUgcmlnaHRzIHNldCBmb3J0aCBpbiB0aGlzIExpY2Vuc2UuIElmIFlvdSBkaXN0cmlidXRlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlLCBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlIGFyZSBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgbm90IGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvci4gWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiBhbnkgc3VjaCB0ZXJtcyBZb3Ugb2ZmZXIuCi0KLTMuNi4gTGFyZ2VyIFdvcmtzLgotWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoIG90aGVyIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIExhcmdlciBXb3JrIGFzIGEgc2luZ2xlIHByb2R1Y3QuIEluIHN1Y2ggYSBjYXNlLCBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UgYXJlIGZ1bGZpbGxlZCBmb3IgdGhlIENvdmVyZWQgU29mdHdhcmUuCi0KLTQuIFZlcnNpb25zIG9mIHRoZSBMaWNlbnNlLgotCi00LjEuIE5ldyBWZXJzaW9ucy4KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaXMgdGhlIGluaXRpYWwgbGljZW5zZSBzdGV3YXJkIGFuZCBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBFYWNoIHZlcnNpb24gd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBFeGNlcHQgYXMgcHJvdmlkZWQgaW4gU2VjdGlvbiA0LjMsIG5vIG9uZSBvdGhlciB0aGFuIHRoZSBsaWNlbnNlIHN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBMaWNlbnNlLgotCi00LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuCi0KLVlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBJZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW5jbHVkZXMgYSBub3RpY2UgaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHByb2hpYml0aW5nIGl0IGZyb20gYmVpbmcgZGlzdHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UsIFlvdSBtdXN0IGRpc3RyaWJ1dGUgYW5kIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZCB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gT3RoZXJ3aXNlLCBZb3UgbWF5IGFsc28gY2hvb3NlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgcHVibGlzaGVkIGJ5IHRoZSBsaWNlbnNlIHN0ZXdhcmQuCi00LjMuIE1vZGlmaWVkIFZlcnNpb25zLgotCi1XaGVuIFlvdSBhcmUgYW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIFlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBsaWNlbnNlIGZvciBZb3VyIE9yaWdpbmFsIFNvZnR3YXJlLCBZb3UgbWF5IGNyZWF0ZSBhbmQgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgaWYgWW91OiAoYSnhcmVuYW1lIHRoZSBsaWNlbnNlIGFuZCByZW1vdmUgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG5hbWUgb2YgdGhlIGxpY2Vuc2Ugc3Rld2FyZCAoZXhjZXB0IHRvIG5vdGUgdGhhdCB0aGUgbGljZW5zZSBkaWZmZXJzIGZyb20gdGhpcyBMaWNlbnNlKTsgYW5kIChiKeFvdGhlcndpc2UgbWFrZSBpdCBjbGVhciB0aGF0IHRoZSBsaWNlbnNlIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZS4KLQotNS4gRElTQ0xBSU1FUiBPRiBXQVJSQU5UWS4KLQotQ09WRVJFRCBTT0ZUV0FSRSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gQVMgSVMgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMgVEhBVCBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QgVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTCBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTIERJU0NMQUlNRVIuCi0KLTYuIFRFUk1JTkFUSU9OLgotCi02LjEuIFRoaXMgTGljZW5zZSBhbmQgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmV1bmRlciB3aWxsIHRlcm1pbmF0ZSBhdXRvbWF0aWNhbGx5IGlmIFlvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mIGJlY29taW5nIGF3YXJlIG9mIHRoZSBicmVhY2guIFByb3Zpc2lvbnMgd2hpY2gsIGJ5IHRoZWlyIG5hdHVyZSwgbXVzdCByZW1haW4gaW4gZWZmZWN0IGJleW9uZCB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlIHNoYWxsIHN1cnZpdmUuCi0KLTYuMi4gSWYgWW91IGFzc2VydCBhIHBhdGVudCBpbmZyaW5nZW1lbnQgY2xhaW0gKGV4Y2x1ZGluZyBkZWNsYXJhdG9yeSBqdWRnbWVudCBhY3Rpb25zKSBhZ2FpbnN0IEluaXRpYWwgRGV2ZWxvcGVyIG9yIGEgQ29udHJpYnV0b3IgKHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0IHdob20gWW91IGFzc2VydCBzdWNoIGNsYWltIGlzIHJlZmVycmVkIHRvIGFzIFBhcnRpY2lwYW50KSBhbGxlZ2luZyB0aGF0IHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSAobWVhbmluZyB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbiB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgYSBDb250cmlidXRvciBvciB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIHRoZSBJbml0aWFsIERldmVsb3BlcikgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmZyaW5nZXMgYW55IHBhdGVudCwgdGhlbiBhbnkgYW5kIGFsbCByaWdodHMgZ3JhbnRlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRvIFlvdSBieSBzdWNoIFBhcnRpY2lwYW50LCB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgKGlmIHRoZSBJbml0aWFsIERldmVsb3BlciBpcyBub3QgdGhlIFBhcnRpY2lwYW50KSBhbmQgYWxsIENvbnRyaWJ1dG9ycyB1bmRlciBTZWN0aW9uc+EyLjEgYW5kL29yIDIuMiBvZiB0aGlzIExpY2Vuc2Ugc2hhbGwsIHVwb24gNjAgZGF5cyBub3RpY2UgZnJvbSBQYXJ0aWNpcGFudCB0ZXJtaW5hdGUgcHJvc3BlY3RpdmVseSBhbmQgYXV0b21hdGljYWxseSBhdCB0aGUgZXhwaXJhdGlvbiBvZiBzdWNoIDYwIGRheSBub3RpY2UgcGVyaW9kLCB1bmxlc3MgaWYgd2l0aGluIHN1Y2ggNjAgZGF5IHBlcmlvZCBZb3Ugd2l0aGRyYXcgWW91ciBjbGFpbSB3aXRoIHJlc3BlY3QgdG8gdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIGFnYWluc3Qgc3VjaCBQYXJ0aWNpcGFudCBlaXRoZXIgdW5pbGF0ZXJhbGx5IG9yIHB1cnN1YW50IHRvIGEgd3JpdHRlbiBhZ3JlZW1lbnQgd2l0aCBQYXJ0aWNpcGFudC4KLQotNi4zLiBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnPhNi4xIG9yIDYuMiBhYm92ZSwgYWxsIGVuZCB1c2VyIGxpY2Vuc2VzIHRoYXQgaGF2ZSBiZWVuIHZhbGlkbHkgZ3JhbnRlZCBieSBZb3Ugb3IgYW55IGRpc3RyaWJ1dG9yIGhlcmV1bmRlciBwcmlvciB0byB0ZXJtaW5hdGlvbiAoZXhjbHVkaW5nIGxpY2Vuc2VzIGdyYW50ZWQgdG8gWW91IGJ5IGFueSBkaXN0cmlidXRvcikgc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4KLQotNy4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuCi0KLVVOREVSIE5PIENJUkNVTVNUQU5DRVMgQU5EIFVOREVSIE5PIExFR0FMIFRIRU9SWSwgV0hFVEhFUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSksIENPTlRSQUNULCBPUiBPVEhFUldJU0UsIFNIQUxMIFlPVSwgVEhFIElOSVRJQUwgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRiBDT1ZFUkVEIFNPRlRXQVJFLCBPUiBBTlkgU1VQUExJRVIgT0YgQU5ZIE9GIFNVQ0ggUEFSVElFUywgQkUgTElBQkxFIFRPIEFOWSBQRVJTT04gRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1QgUFJPRklUUywgTE9TUyBPRiBHT09EV0lMTCwgV09SSyBTVE9QUEFHRSwgQ09NUFVURVIgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiwgT1IgQU5ZIEFORCBBTEwgT1RIRVIgQ09NTUVSQ0lBTCBEQU1BR0VTIE9SIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTiBJTkZPUk1FRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiBUSElTIExJTUlUQVRJT04gT0YgTElBQklMSVRZIFNIQUxMIE5PVCBBUFBMWSBUTyBMSUFCSUxJVFkgRk9SIERFQVRIIE9SIFBFUlNPTkFMIElOSlVSWSBSRVNVTFRJTkcgRlJPTSBTVUNIIFBBUlRZUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQgQVBQTElDQUJMRSBMQVcgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPIE5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIFNPIFRISVMgRVhDTFVTSU9OIEFORCBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLgotCi04LiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLgotCi1UaGUgQ292ZXJlZCBTb2Z0d2FyZSBpcyBhIGNvbW1lcmNpYWwgaXRlbSwgYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgaW4gNDjhQy5GLlIu4TIuMTAxIChPY3QuIDE5OTUpLCBjb25zaXN0aW5nIG9mIGNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUgKGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGF0IDQ4IEMuRi5SLiDhMjUyLjIyNy03MDE0KGEpKDEpKSBhbmQgY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZSBkb2N1bWVudGF0aW9uIGFzIHN1Y2ggdGVybXMgYXJlIHVzZWQgaW4gNDjhQy5GLlIu4TEyLjIxMiAoU2VwdC4gMTk5NSkuIENvbnNpc3RlbnQgd2l0aCA0OCBDLkYuUi4gMTIuMjEyIGFuZCA0OCBDLkYuUi4gMjI3LjcyMDItMSB0aHJvdWdoIDIyNy43MjAyLTQgKEp1bmUgMTk5NSksIGFsbCBVLlMuIEdvdmVybm1lbnQgRW5kIFVzZXJzIGFjcXVpcmUgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoIG9ubHkgdGhvc2UgcmlnaHRzIHNldCBmb3J0aCBoZXJlaW4uIFRoaXMgVS5TLiBHb3Zlcm5tZW50IFJpZ2h0cyBjbGF1c2UgaXMgaW4gbGlldSBvZiwgYW5kIHN1cGVyc2VkZXMsIGFueSBvdGhlciBGQVIsIERGQVIsIG9yIG90aGVyIGNsYXVzZSBvciBwcm92aXNpb24gdGhhdCBhZGRyZXNzZXMgR292ZXJubWVudCByaWdodHMgaW4gY29tcHV0ZXIgc29mdHdhcmUgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi05LiBNSVNDRUxMQU5FT1VTLgotCi1UaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdCBtYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBoZWxkIHRvIGJlIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBsYXcgb2YgdGhlIGp1cmlzZGljdGlvbiBzcGVjaWZpZWQgaW4gYSBub3RpY2UgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKGV4Y2VwdCB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3LCBpZiBhbnksIHByb3ZpZGVzIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBzdWNoIGp1cmlzZGljdGlvbnMgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIEFueSBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24gb2YgdGhlIGNvdXJ0cyBsb2NhdGVkIGluIHRoZSBqdXJpc2RpY3Rpb24gYW5kIHZlbnVlIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgd2l0aCB0aGUgbG9zaW5nIHBhcnR5IHJlc3BvbnNpYmxlIGZvciBjb3N0cywgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0IGNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5cyBmZWVzIGFuZCBleHBlbnNlcy4gVGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucyBDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcyBleHByZXNzbHkgZXhjbHVkZWQuIEFueSBsYXcgb3IgcmVndWxhdGlvbiB3aGljaCBwcm92aWRlcyB0aGF0IHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsIGJlIGNvbnN0cnVlZCBhZ2FpbnN0IHRoZSBkcmFmdGVyIHNoYWxsIG5vdCBhcHBseSB0byB0aGlzIExpY2Vuc2UuIFlvdSBhZ3JlZSB0aGF0IFlvdSBhbG9uZSBhcmUgcmVzcG9uc2libGUgZm9yIGNvbXBsaWFuY2Ugd2l0aCB0aGUgVW5pdGVkIFN0YXRlcyBleHBvcnQgYWRtaW5pc3RyYXRpb24gcmVndWxhdGlvbnMgKGFuZCB0aGUgZXhwb3J0IGNvbnRyb2wgbGF3cyBhbmQgcmVndWxhdGlvbiBvZiBhbnkgb3RoZXIgY291bnRyaWVzKSB3aGVuIFlvdSB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGFueSBDb3ZlcmVkIFNvZnR3YXJlLgotCi0xMC4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4KLQotQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcyByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIG91dCBvZiBpdHMgdXRpbGl6YXRpb24gb2YgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgWW91IGFncmVlIHRvIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvIGRpc3RyaWJ1dGUgc3VjaCByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcgaGVyZWluIGlzIGludGVuZGVkIG9yIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24gb2YgbGlhYmlsaXR5LgotCi1OT1RJQ0UgUFVSU1VBTlQgVE8gU0VDVElPTiA5IE9GIFRIRSBDT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKQotVGhlIEdsYXNzRmlzaCBjb2RlIHJlbGVhc2VkIHVuZGVyIHRoZSBDRERMIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhIChleGNsdWRpbmcgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMpLiBBbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBGZWRlcmFsIENvdXJ0cyBvZiB0aGUgTm9ydGhlcm4gRGlzdHJpY3Qgb2YgQ2FsaWZvcm5pYSBhbmQgdGhlIHN0YXRlIGNvdXJ0cyBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSwgd2l0aCB2ZW51ZSBseWluZyBpbiBTYW50YSBDbGFyYSBDb3VudHksIENhbGlmb3JuaWEuIAotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy9MSUNFTlNFLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNTRlMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi1DT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKSBWZXJzaW9uIDEuMAotCi0xLiBEZWZpbml0aW9ucy4KLQotMS4xLiBDb250cmlidXRvciBtZWFucyBlYWNoIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQgY3JlYXRlcyBvciBjb250cmlidXRlcyB0byB0aGUgY3JlYXRpb24gb2YgTW9kaWZpY2F0aW9ucy4KLQotMS4yLiBDb250cmlidXRvciBWZXJzaW9uIG1lYW5zIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIHByaW9yIE1vZGlmaWNhdGlvbnMgdXNlZCBieSBhIENvbnRyaWJ1dG9yIChpZiBhbnkpLCBhbmQgdGhlIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCi0KLTEuMy4gQ292ZXJlZCBTb2Z0d2FyZSBtZWFucyAoYSkgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoYikgTW9kaWZpY2F0aW9ucywgb3IgKGMpIHRoZSBjb21iaW5hdGlvbiBvZiBmaWxlcyBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggZmlsZXMgY29udGFpbmluZyBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuCi0KLTEuNC4gRXhlY3V0YWJsZSBtZWFucyB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBhbnkgZm9ybSBvdGhlciB0aGFuIFNvdXJjZSBDb2RlLgotCi0xLjUuIEluaXRpYWwgRGV2ZWxvcGVyIG1lYW5zIHRoZSBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0IGZpcnN0IG1ha2VzIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLTEuNi4gTGFyZ2VyIFdvcmsgbWVhbnMgYSB3b3JrIHdoaWNoIGNvbWJpbmVzIENvdmVyZWQgU29mdHdhcmUgb3IgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLTEuNy4gTGljZW5zZSBtZWFucyB0aGlzIGRvY3VtZW50LgotCi0xLjguIExpY2Vuc2FibGUgbWVhbnMgaGF2aW5nIHRoZSByaWdodCB0byBncmFudCwgdG8gdGhlIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlLCB3aGV0aGVyIGF0IHRoZSB0aW1lIG9mIHRoZSBpbml0aWFsIGdyYW50IG9yIHN1YnNlcXVlbnRseSBhY3F1aXJlZCwgYW55IGFuZCBhbGwgb2YgdGhlIHJpZ2h0cyBjb252ZXllZCBoZXJlaW4uCi0KLTEuOS4gTW9kaWZpY2F0aW9ucyBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUgZm9ybSBvZiBhbnkgb2YgdGhlIGZvbGxvd2luZzoKLQotQS4gQW55IGZpbGUgdGhhdCByZXN1bHRzIGZyb20gYW4gYWRkaXRpb24gdG8sIGRlbGV0aW9uIGZyb20gb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cyBNb2RpZmljYXRpb25zOwotCi1CLiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uOyBvcgotCi1DLiBBbnkgbmV3IGZpbGUgdGhhdCBpcyBjb250cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotMS4xMC4gT3JpZ2luYWwgU29mdHdhcmUgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSB0aGF0IGlzIG9yaWdpbmFsbHkgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0xLjExLiBQYXRlbnQgQ2xhaW1zIG1lYW5zIGFueSBwYXRlbnQgY2xhaW0ocyksIG5vdyBvd25lZCBvciBoZXJlYWZ0ZXIgYWNxdWlyZWQsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24sIG1ldGhvZCwgcHJvY2VzcywgYW5kIGFwcGFyYXR1cyBjbGFpbXMsIGluIGFueSBwYXRlbnQgTGljZW5zYWJsZSBieSBncmFudG9yLgotCi0xLjEyLiBTb3VyY2UgQ29kZSBtZWFucyAoYSkgdGhlIGNvbW1vbiBmb3JtIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgaW4gd2hpY2ggbW9kaWZpY2F0aW9ucyBhcmUgbWFkZSBhbmQgKGIpIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCBpbiBvciB3aXRoIHN1Y2ggY29kZS4KLQotMS4xMy4gWW91IChvciBZb3VyKSBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZSB0ZXJtcyBvZiwgdGhpcyBMaWNlbnNlLiBGb3IgbGVnYWwgZW50aXRpZXMsIFlvdSBpbmNsdWRlcyBhbnkgZW50aXR5IHdoaWNoIGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoIFlvdS4gRm9yIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgY29udHJvbCBtZWFucyAoYSnhdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKeFvd25lcnNoaXAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcyBvciBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotMi4gTGljZW5zZSBHcmFudHMuCi0KLTIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50LgotQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZToKLShhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgSW5pdGlhbCBEZXZlbG9wZXIsIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAotKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nIG9yIHNlbGxpbmcgb2YgT3JpZ2luYWwgU29mdHdhcmUsIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBwcmFjdGljZSwgc2VsbCwgYW5kIG9mZmVyIGZvciBzYWxlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKS4KLShjKSBUaGUgbGljZW5zZXMgZ3JhbnRlZCBpbiBTZWN0aW9uc+EyLjEoYSkgYW5kIChiKSBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIEluaXRpYWwgRGV2ZWxvcGVyIGZpcnN0IGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgT3JpZ2luYWwgU29mdHdhcmUgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLShkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbuEyLjEoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKeFmb3IgY29kZSB0aGF0IFlvdSBkZWxldGUgZnJvbSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yICgyKeFmb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKeF0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKGlpKeF0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4KLQotMi4yLiBDb250cmlidXRvciBHcmFudC4KLUNvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgotKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBDb250cmlidXRvciB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zIGNyZWF0ZWQgYnkgc3VjaCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZiksIGVpdGhlciBvbiBhbiB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzIENvdmVyZWQgU29mdHdhcmUgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCi0oYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgZWl0aGVyIGFsb25lIGFuZC9vciBpbiBjb21iaW5hdGlvbiB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaGF2ZSBtYWRlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2Y6ICgxKeFNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZik7IGFuZCAoMinhdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLgotKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25z4TIuMihhKSBhbmQgMi4yKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgQ29udHJpYnV0b3IgZmlyc3QgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBNb2RpZmljYXRpb25zIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5LgotKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9u4TIuMihiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEp4WZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yIGhhcyBkZWxldGVkIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247ICgyKeFmb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKeF0aGlyZCBwYXJ0eSBtb2RpZmljYXRpb25zIG9mIENvbnRyaWJ1dG9yIFZlcnNpb24sIG9yIChpaSnhdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggb3RoZXIgc29mdHdhcmUgKGV4Y2VwdCBhcyBwYXJ0IG9mIHRoZSBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciAoMynhdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiB0aGUgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvci4KLQotMy4gRGlzdHJpYnV0aW9uIE9ibGlnYXRpb25zLgotCi0zLjEuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4KLQotQW55IENvdmVyZWQgU29mdHdhcmUgdGhhdCBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgaW4gRXhlY3V0YWJsZSBmb3JtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGFuZCB0aGF0IFNvdXJjZSBDb2RlIGZvcm0gbXVzdCBiZSBkaXN0cmlidXRlZCBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSBtdXN0IGluY2x1ZGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSB3aXRoIGV2ZXJ5IGNvcHkgb2YgdGhlIFNvdXJjZSBDb2RlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgWW91IGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlLiBZb3UgbXVzdCBpbmZvcm0gcmVjaXBpZW50cyBvZiBhbnkgc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSBhcyB0byBob3cgdGhleSBjYW4gb2J0YWluIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KLQotMy4yLiBNb2RpZmljYXRpb25zLgotCi1UaGUgTW9kaWZpY2F0aW9ucyB0aGF0IFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91IGNvbnRyaWJ1dGUgYXJlIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSByZXByZXNlbnQgdGhhdCBZb3UgYmVsaWV2ZSBZb3VyIE1vZGlmaWNhdGlvbnMgYXJlIFlvdXIgb3JpZ2luYWwgY3JlYXRpb24ocykgYW5kL29yIFlvdSBoYXZlIHN1ZmZpY2llbnQgcmlnaHRzIHRvIGdyYW50IHRoZSByaWdodHMgY29udmV5ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0zLjMuIFJlcXVpcmVkIE5vdGljZXMuCi1Zb3UgbXVzdCBpbmNsdWRlIGEgbm90aWNlIGluIGVhY2ggb2YgWW91ciBNb2RpZmljYXRpb25zIHRoYXQgaWRlbnRpZmllcyBZb3UgYXMgdGhlIENvbnRyaWJ1dG9yIG9mIHRoZSBNb2RpZmljYXRpb24uIFlvdSBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQgb3IgdHJhZGVtYXJrIG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSwgb3IgYW55IG5vdGljZXMgb2YgbGljZW5zaW5nIG9yIGFueSBkZXNjcmlwdGl2ZSB0ZXh0IGdpdmluZyBhdHRyaWJ1dGlvbiB0byBhbnkgQ29udHJpYnV0b3Igb3IgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLgotCi0zLjQuIEFwcGxpY2F0aW9uIG9mIEFkZGl0aW9uYWwgVGVybXMuCi1Zb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBhbHRlcnMgb3IgcmVzdHJpY3RzIHRoZSBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzIHJpZ2h0cyBoZXJldW5kZXIuIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLCBhbmQgdG8gY2hhcmdlIGEgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIFNvZnR3YXJlLiBIb3dldmVyLCB5b3UgbWF5IGRvIHNvIG9ubHkgb24gWW91ciBvd24gYmVoYWxmLCBhbmQgbm90IG9uIGJlaGFsZiBvZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgc3VjaCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9uIGlzIG9mZmVyZWQgYnkgWW91IGFsb25lLCBhbmQgWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSB0ZXJtcyBZb3Ugb2ZmZXIuCi0KLTMuNS4gRGlzdHJpYnV0aW9uIG9mIEV4ZWN1dGFibGUgVmVyc2lvbnMuCi1Zb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIEV4ZWN1dGFibGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIG9yIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIGxpY2Vuc2Ugb2YgWW91ciBjaG9pY2UsIHdoaWNoIG1heSBjb250YWluIHRlcm1zIGRpZmZlcmVudCBmcm9tIHRoaXMgTGljZW5zZSwgcHJvdmlkZWQgdGhhdCBZb3UgYXJlIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCB0aGF0IHRoZSBsaWNlbnNlIGZvciB0aGUgRXhlY3V0YWJsZSBmb3JtIGRvZXMgbm90IGF0dGVtcHQgdG8gbGltaXQgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudHMgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZSBmb3JtIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcyBMaWNlbnNlLiBJZiBZb3UgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSwgWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IuIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2ggdGVybXMgWW91IG9mZmVyLgotCi0zLjYuIExhcmdlciBXb3Jrcy4KLVlvdSBtYXkgY3JlYXRlIGEgTGFyZ2VyIFdvcmsgYnkgY29tYmluaW5nIENvdmVyZWQgU29mdHdhcmUgd2l0aCBvdGhlciBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBMYXJnZXIgV29yayBhcyBhIHNpbmdsZSBwcm9kdWN0LiBJbiBzdWNoIGEgY2FzZSwgWW91IG11c3QgbWFrZSBzdXJlIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLgotCi00LiBWZXJzaW9ucyBvZiB0aGUgTGljZW5zZS4KLQotNC4xLiBOZXcgVmVyc2lvbnMuCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGlzIHRoZSBpbml0aWFsIGxpY2Vuc2Ugc3Rld2FyZCBhbmQgbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoaXMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gRXhjZXB0IGFzIHByb3ZpZGVkIGluIFNlY3Rpb24gNC4zLCBubyBvbmUgb3RoZXIgdGhhbiB0aGUgbGljZW5zZSBzdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgTGljZW5zZS4KLQotNC4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLgotCi1Zb3UgbWF5IGFsd2F5cyBjb250aW51ZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZCB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gSWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluY2x1ZGVzIGEgbm90aWNlIGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBwcm9oaWJpdGluZyBpdCBmcm9tIGJlaW5nIGRpc3RyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlLCBZb3UgbXVzdCBkaXN0cmlidXRlIGFuZCBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUuIE90aGVyd2lzZSwgWW91IG1heSBhbHNvIGNob29zZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHB1Ymxpc2hlZCBieSB0aGUgbGljZW5zZSBzdGV3YXJkLgotNC4zLiBNb2RpZmllZCBWZXJzaW9ucy4KLQotV2hlbiBZb3UgYXJlIGFuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBZb3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgbGljZW5zZSBmb3IgWW91ciBPcmlnaW5hbCBTb2Z0d2FyZSwgWW91IG1heSBjcmVhdGUgYW5kIHVzZSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIGlmIFlvdTogKGEp4XJlbmFtZSB0aGUgbGljZW5zZSBhbmQgcmVtb3ZlIGFueSByZWZlcmVuY2VzIHRvIHRoZSBuYW1lIG9mIHRoZSBsaWNlbnNlIHN0ZXdhcmQgKGV4Y2VwdCB0byBub3RlIHRoYXQgdGhlIGxpY2Vuc2UgZGlmZmVycyBmcm9tIHRoaXMgTGljZW5zZSk7IGFuZCAoYinhb3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdCB0aGUgbGljZW5zZSBjb250YWlucyB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UuCi0KLTUuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuCi0KLUNPVkVSRUQgU09GVFdBUkUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOIEFTIElTIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUyBESVNDTEFJTUVSLgotCi02LiBURVJNSU5BVElPTi4KLQotNi4xLiBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbCB0ZXJtaW5hdGUgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcyBoZXJlaW4gYW5kIGZhaWwgdG8gY3VyZSBzdWNoIGJyZWFjaCB3aXRoaW4gMzAgZGF5cyBvZiBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpciBuYXR1cmUsIG11c3QgcmVtYWluIGluIGVmZmVjdCBiZXlvbmQgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZSBzaGFsbCBzdXJ2aXZlLgotCi02LjIuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIChleGNsdWRpbmcgZGVjbGFyYXRvcnkganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvciBhIENvbnRyaWJ1dG9yICh0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IgYWdhaW5zdCB3aG9tIFlvdSBhc3NlcnQgc3VjaCBjbGFpbSBpcyByZWZlcnJlZCB0byBhcyBQYXJ0aWNpcGFudCkgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgKG1lYW5pbmcgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24gd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIGEgQ29udHJpYnV0b3Igb3IgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIpIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCwgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIChpZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaXMgbm90IHRoZSBQYXJ0aWNpcGFudCkgYW5kIGFsbCBDb250cmlidXRvcnMgdW5kZXIgU2VjdGlvbnPhMi4xIGFuZC9vciAyLjIgb2YgdGhpcyBMaWNlbnNlIHNoYWxsLCB1cG9uIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQgdGVybWluYXRlIHByb3NwZWN0aXZlbHkgYW5kIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGV4cGlyYXRpb24gb2Ygc3VjaCA2MCBkYXkgbm90aWNlIHBlcmlvZCwgdW5sZXNzIGlmIHdpdGhpbiBzdWNoIDYwIGRheSBwZXJpb2QgWW91IHdpdGhkcmF3IFlvdXIgY2xhaW0gd2l0aCByZXNwZWN0IHRvIHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSBhZ2FpbnN0IHN1Y2ggUGFydGljaXBhbnQgZWl0aGVyIHVuaWxhdGVyYWxseSBvciBwdXJzdWFudCB0byBhIHdyaXR0ZW4gYWdyZWVtZW50IHdpdGggUGFydGljaXBhbnQuCi0KLTYuMy4gSW4gdGhlIGV2ZW50IG9mIHRlcm1pbmF0aW9uIHVuZGVyIFNlY3Rpb25z4TYuMSBvciA2LjIgYWJvdmUsIGFsbCBlbmQgdXNlciBsaWNlbnNlcyB0aGF0IGhhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQgYnkgWW91IG9yIGFueSBkaXN0cmlidXRvciBoZXJldW5kZXIgcHJpb3IgdG8gdGVybWluYXRpb24gKGV4Y2x1ZGluZyBsaWNlbnNlcyBncmFudGVkIHRvIFlvdSBieSBhbnkgZGlzdHJpYnV0b3IpIHNoYWxsIHN1cnZpdmUgdGVybWluYXRpb24uCi0KLTcuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLgotCi1VTkRFUiBOTyBDSVJDVU1TVEFOQ0VTIEFORCBVTkRFUiBOTyBMRUdBTCBUSEVPUlksIFdIRVRIRVIgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBDT05UUkFDVCwgT1IgT1RIRVJXSVNFLCBTSEFMTCBZT1UsIFRIRSBJTklUSUFMIERFVkVMT1BFUiwgQU5ZIE9USEVSIENPTlRSSUJVVE9SLCBPUiBBTlkgRElTVFJJQlVUT1IgT0YgQ09WRVJFRCBTT0ZUV0FSRSwgT1IgQU5ZIFNVUFBMSUVSIE9GIEFOWSBPRiBTVUNIIFBBUlRJRVMsIEJFIExJQUJMRSBUTyBBTlkgUEVSU09OIEZPUiBBTlkgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgQ0hBUkFDVEVSIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBEQU1BR0VTIEZPUiBMT1NUIFBST0ZJVFMsIExPU1MgT0YgR09PRFdJTEwsIFdPUksgU1RPUFBBR0UsIENPTVBVVEVSIEZBSUxVUkUgT1IgTUFMRlVOQ1RJT04sIE9SIEFOWSBBTkQgQUxMIE9USEVSIENPTU1FUkNJQUwgREFNQUdFUyBPUiBMT1NTRVMsIEVWRU4gSUYgU1VDSCBQQVJUWSBTSEFMTCBIQVZFIEJFRU4gSU5GT1JNRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gVEhJUyBMSU1JVEFUSU9OIE9GIExJQUJJTElUWSBTSEFMTCBOT1QgQVBQTFkgVE8gTElBQklMSVRZIEZPUiBERUFUSCBPUiBQRVJTT05BTCBJTkpVUlkgUkVTVUxUSU5HIEZST00gU1VDSCBQQVJUWVMgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UIEFQUExJQ0FCTEUgTEFXIFBST0hJQklUUyBTVUNIIExJTUlUQVRJT04uIFNPTUUgSlVSSVNESUNUSU9OUyBETyBOT1QgQUxMT1cgVEhFIEVYQ0xVU0lPTiBPUiBMSU1JVEFUSU9OIE9GIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTyBUSElTIEVYQ0xVU0lPTiBBTkQgTElNSVRBVElPTiBNQVkgTk9UIEFQUExZIFRPIFlPVS4KLQotOC4gVS5TLiBHT1ZFUk5NRU5UIEVORCBVU0VSUy4KLQotVGhlIENvdmVyZWQgU29mdHdhcmUgaXMgYSBjb21tZXJjaWFsIGl0ZW0sIGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGluIDQ44UMuRi5SLuEyLjEwMSAoT2N0LiAxOTk1KSwgY29uc2lzdGluZyBvZiBjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIChhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBhdCA0OCBDLkYuUi4g4TI1Mi4yMjctNzAxNChhKSgxKSkgYW5kIGNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUgZG9jdW1lbnRhdGlvbiBhcyBzdWNoIHRlcm1zIGFyZSB1c2VkIGluIDQ44UMuRi5SLuExMi4yMTIgKFNlcHQuIDE5OTUpLiBDb25zaXN0ZW50IHdpdGggNDggQy5GLlIuIDEyLjIxMiBhbmQgNDggQy5GLlIuIDIyNy43MjAyLTEgdGhyb3VnaCAyMjcuNzIwMi00IChKdW5lIDE5OTUpLCBhbGwgVS5TLiBHb3Zlcm5tZW50IEVuZCBVc2VycyBhY3F1aXJlIENvdmVyZWQgU29mdHdhcmUgd2l0aCBvbmx5IHRob3NlIHJpZ2h0cyBzZXQgZm9ydGggaGVyZWluLiBUaGlzIFUuUy4gR292ZXJubWVudCBSaWdodHMgY2xhdXNlIGlzIGluIGxpZXUgb2YsIGFuZCBzdXBlcnNlZGVzLCBhbnkgb3RoZXIgRkFSLCBERkFSLCBvciBvdGhlciBjbGF1c2Ugb3IgcHJvdmlzaW9uIHRoYXQgYWRkcmVzc2VzIEdvdmVybm1lbnQgcmlnaHRzIGluIGNvbXB1dGVyIHNvZnR3YXJlIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotOS4gTUlTQ0VMTEFORU9VUy4KLQotVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudCBjb25jZXJuaW5nIHN1YmplY3QgbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgaGVsZCB0byBiZSB1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuIFRoaXMgTGljZW5zZSBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgbGF3IG9mIHRoZSBqdXJpc2RpY3Rpb24gc3BlY2lmaWVkIGluIGEgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChleGNlcHQgdG8gdGhlIGV4dGVudCBhcHBsaWNhYmxlIGxhdywgaWYgYW55LCBwcm92aWRlcyBvdGhlcndpc2UpLCBleGNsdWRpbmcgc3VjaCBqdXJpc2RpY3Rpb25zIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zLiBBbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBjb3VydHMgbG9jYXRlZCBpbiB0aGUganVyaXNkaWN0aW9uIGFuZCB2ZW51ZSBzcGVjaWZpZWQgaW4gYSBub3RpY2UgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIHdpdGggdGhlIGxvc2luZyBwYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBjb3VydCBjb3N0cyBhbmQgcmVhc29uYWJsZSBhdHRvcm5leXMgZmVlcyBhbmQgZXhwZW5zZXMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZSBJbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgbGF3IG9yIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhhdCB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb250cmFjdCBzaGFsbCBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLiBZb3UgYWdyZWUgdGhhdCBZb3UgYWxvbmUgYXJlIHJlc3BvbnNpYmxlIGZvciBjb21wbGlhbmNlIHdpdGggdGhlIFVuaXRlZCBTdGF0ZXMgZXhwb3J0IGFkbWluaXN0cmF0aW9uIHJlZ3VsYXRpb25zIChhbmQgdGhlIGV4cG9ydCBjb250cm9sIGxhd3MgYW5kIHJlZ3VsYXRpb24gb2YgYW55IG90aGVyIGNvdW50cmllcykgd2hlbiBZb3UgdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBhbnkgQ292ZXJlZCBTb2Z0d2FyZS4KLQotMTAuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuCi0KLUFzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMgcmVzcG9uc2libGUgZm9yIGNsYWltcyBhbmQgZGFtYWdlcyBhcmlzaW5nLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCBvdXQgb2YgaXRzIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIFlvdSBhZ3JlZSB0byB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0byBkaXN0cmlidXRlIHN1Y2ggcmVzcG9uc2liaWxpdHkgb24gYW4gZXF1aXRhYmxlIGJhc2lzLiBOb3RoaW5nIGhlcmVpbiBpcyBpbnRlbmRlZCBvciBzaGFsbCBiZSBkZWVtZWQgdG8gY29uc3RpdHV0ZSBhbnkgYWRtaXNzaW9uIG9mIGxpYWJpbGl0eS4KLQotTk9USUNFIFBVUlNVQU5UIFRPIFNFQ1RJT04gOSBPRiBUSEUgQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkKLVRoZSBHbGFzc0Zpc2ggY29kZSByZWxlYXNlZCB1bmRlciB0aGUgQ0RETCBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSAoZXhjbHVkaW5nIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zKS4gQW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZiB0aGUgRmVkZXJhbCBDb3VydHMgb2YgdGhlIE5vcnRoZXJuIERpc3RyaWN0IG9mIENhbGlmb3JuaWEgYW5kIHRoZSBzdGF0ZSBjb3VydHMgb2YgdGhlIFN0YXRlIG9mIENhbGlmb3JuaWEsIHdpdGggdmVudWUgbHlpbmcgaW4gU2FudGEgQ2xhcmEgQ291bnR5LCBDYWxpZm9ybmlhLiAKLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4MWE5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGR0ZHNBbmRTY2hlbWFzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0X2ZpbGVzLwotc3JjLmluY2x1ZGVzID0gZHRkc0FuZFNjaGVtYXMvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXRfZmlsZXMvCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfMV8yLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzFfMi5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNThjYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfMV8yLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi08IS0tCi1Db3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIDkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDQSAgOTQzMDMsIFUuUy5BLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLVRoaXMgcHJvZHVjdCBvciBkb2N1bWVudCBpcyBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGFuZCBkaXN0cmlidXRlZAotdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgaXRzIHVzZSwgY29weWluZywgZGlzdHJpYnV0aW9uLCBhbmQKLWRlY29tcGlsYXRpb24uICBObyBwYXJ0IG9mIHRoaXMgcHJvZHVjdCBvciBkb2N1bWVudGF0aW9uIG1heSBiZQotcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KLW9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LiAgCi0KLVRoaXJkIHBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcyBjb3B5cmlnaHRlZCBhbmQgCi1saWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuIAotCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gTG9nbywgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YSAKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCBhbmQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsIAotYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYyBpbiB0aGUgVS5TLiAKLWFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUFsbCBTUEFSQyB0cmFkZW1hcmtzIGFyZSB1c2VkIHVuZGVyIGxpY2Vuc2UgYW5kIGFyZSB0cmFkZW1hcmtzCi1vciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU1BBUkMgSW50ZXJuYXRpb25hbCwgSW5jLgotaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4gUHJvZHVjdHMgYmVhcmluZyBTUEFSQwotdHJhZGVtYXJrcyBhcmUgYmFzZWQgdXBvbiBhbiBhcmNoaXRlY3R1cmUgZGV2ZWxvcGVkIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gCi0KLVBvc3RTY3JpcHQgaXMgYSByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zLCBJbmMuIAotCi0gCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMgU3ViamVjdCB0byAKLVN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLQotIAotRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTEwgRVhQUkVTUyBPUiBJTVBMSUVECi1DT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkKLUlNUExJRUQgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UgT1IgTk9OLUlORlJJTkdFTUVOVCwgQVJFIERJU0NMQUlNRUQsIEVYQ0VQVAotVE8gVEhFIEVYVEVOVCBUSEFUIFNVQ0ggRElTQ0xBSU1FUlMgQVJFIEhFTEQgVE8gQkUgTEVHQUxMWQotSU5WQUxJRC4KLQotX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgCi05MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSAgOTQzMDMsIEV0YXRzLVVuaXMuIAotVG91cyBkcm9pdHMgcmUnc2VydmUncy4KLSAKLQotQ2UgcHJvZHVpdCBvdSBkb2N1bWVudCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQgZGlzdHJpYnVlJyBhdmVjIAotZGVzIGxpY2VuY2VzIHF1aSBlbiByZXN0cmVpZ25lbnQgbCd1dGlsaXNhdGlvbiwgbGEgY29waWUsIGxhIGRpc3RyaWJ1dGlvbiwKLWV0IGxhIGRlJ2NvbXBpbGF0aW9uLiAgQXVjdW5lIHBhcnRpZSBkZSBjZSBwcm9kdWl0IG91IGRlIHNhIGRvY3VtZW50YXRpb24KLWFzc29jaWUnZSBuZSBwZXV0IGVedHJlIHJlcHJvZHVpdGUgc291cyBhdWN1bmUgZm9ybWUsIHBhciBxdWVscXVlIG1veWVuIAotcXVlIGNlIHNvaXQsIHNhbnMgbCdhdXRvcmlzYXRpb24gcHJlJ2FsYWJsZSBldCBlJ2NyaXRlIGRlIFN1biBldCBkZSBzZXMgCi1iYWlsbGV1cnMgZGUgbGljZW5jZSwgcydpbCB5IGVuIGEuICAKLQotTGUgbG9naWNpZWwgZGUndGVudSBwYXIgZGVzIHRpZXJzLCBldCBxdWkgY29tcHJlbmQgbGEgdGVjaG5vbG9naWUgCi1yZWxhdGl2ZSBhdXggcG9saWNlcyBkZSBjYXJhY3RlYHJlcywgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IAotZXQgbGljZW5jaWUnIHBhciBkZXMgZm91cm5pc3NldXJzIGRlIFN1bi4KLSAKLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgbGUgbG9nbyBTdW4sIFNvbGFyaXMsIEphdmEsIEphdmFTZXJ2ZXIgUGFnZXMsIEphdmEgCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsIEpEQkMsIEpESywgSmF2YU1haWwsIGV0IEVudGVycHJpc2UgSmF2YUJlYW5zLCAgCi1zb250IGRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU3VuIAotTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFdGF0cy1VbmlzIGV0IGRhbnMgZCdhdXRyZXMgcGF5cy4KLSAKLVRvdXRlcyBsZXMgbWFycXVlcyBTUEFSQyBzb250IHV0aWxpc2UnZXMgc291cyBsaWNlbmNlIGV0IHNvbnQKLWRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU1BBUkMKLUludGVybmF0aW9uYWwsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgIGRhbnMKLWQnYXV0cmVzIHBheXMuIExlcyBwcm9kdWl0cyBwb3J0YW50IGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQKLWJhc2UncyBzdXIgdW5lIGFyY2hpdGVjdHVyZSBkZSd2ZWxvcHBlJ2UgcGFyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIAotCi1Qb3N0Y3JpcHQgZXN0IHVuZSBtYXJxdWUgZW5yZWdpc3RyZSdlIGQnQWRvYmUgU3lzdGVtcyBJbmMuIAotIAotTEEgRE9DVU1FTlRBVElPTiBFU1QgRk9VUk5JRSAiRU4gTCdFVEFUIiBFVCBUT1VURVMgQVVUUkVTIENPTkRJVElPTlMsCi1ERUNMQVJBVElPTlMgRVQgR0FSQU5USUVTIEVYUFJFU1NFUyBPVSBUQUNJVEVTIFNPTlQgRk9STUVMTEVNRU5UIEVYQ0xVRVMsCi1EQU5TIExBIE1FU1VSRSBBVVRPUklTRUUgUEFSIExBIExPSSBBUFBMSUNBQkxFLCBZIENPTVBSSVMgTk9UQU1NRU5UCi1UT1VURSBHQVJBTlRJRSBJTVBMSUNJVEUgUkVMQVRJVkUgQSBMQSBRVUFMSVRFIE1BUkNIQU5ERSwgQSBMJ0FQVElUVURFCi1BIFVORSBVVElMSVNBVElPTiBQQVJUSUNVTElFUkUgT1UgQSBMJ0FCU0VOQ0UgREUgQ09OVFJFRkFDT04uCi0tLT4KLQotPCEtLQotVGhlIGFwcGxpY2F0aW9uLWNsaWVudCBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYW4gYXBwbGljYXRpb24gY2xpZW50Ci1kZXBsb3ltZW50IGRlc2NyaXB0b3IuCi1UaGUgYXBwbGljYXRpb24gY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvciBkZXNjcmliZXMgdGhlIEVKQiBjb21wb25lbnRzIGFuZAotZXh0ZXJuYWwgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudC4KLS0tPgotPCFFTEVNRU5UIGFwcGxpY2F0aW9uLWNsaWVudCAoaWNvbj8sIGRpc3BsYXktbmFtZSwgZGVzY3JpcHRpb24/LCBlbnYtZW50cnkqLAotZWpiLXJlZiosIHJlc291cmNlLXJlZiopPgotCi08IS0tCi1UaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4KLVRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZQotYXBwbGljYXRpb24tY2xpZW50IGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlCi1hcHBsaWNhdGlvbi1jbGllbnQgZmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieQotdGhlIGFwcGxpY2F0aW9uLWNsaWVudCBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbgotcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgZGVzY3JpcHRpb24uCi0tLT4KLTwhRUxFTUVOVCBkZXNjcmlwdGlvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQKLWJ5IHRvb2xzLgotLS0+Ci08IUVMRU1FTlQgZGlzcGxheS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgZWpiLXJlZiBlbGVtZW50IHRvIHNwZWNpZnkgdGhhdCBhbiBFSkIKLXJlZmVyZW5jZSBpcyBsaW5rZWQgdG8gYW4gZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBlbmNvbXBhc3NpbmcgSjJFRSBBcHBsaWNhdGlvbgotcGFja2FnZS4gVGhlIHZhbHVlIG9mIHRoZSBlamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuIGVudGVycHJpc2UKLWJlYW4gaW4gdGhlIHNhbWUgSjJFRSBBcHBsaWNhdGlvbiBwYWNrYWdlLiBVc2VkIGluOiBlamItcmVmCi1FeGFtcGxlOiA8ZWpiLWxpbms+RW1wbG95ZWVSZWNvcmQ8L2VqYi1saW5rPgotLS0+Ci08IUVMRU1FTlQgZWpiLWxpbmsgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLXJlZiBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlCi1iZWFuJ3MgaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyB0aGUgRUpCCi1yZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSByZWZlcmVuY2luZyBhcHBsaWNhdGlvbiBjbGllbnQ7IHRoZQotZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW47IHRoZSBleHBlY3RlZCBob21lIGFuZCByZW1vdGUKLWludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuOyBhbmQgYW4gb3B0aW9uYWwgZWpiLWxpbmsKLWluZm9ybWF0aW9uLiBUaGUgb3B0aW9uYWwgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlZmVyZW5jZWQKLWVudGVycHJpc2UgYmVhbi4KLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYgKGRlc2NyaXB0aW9uPywgZWpiLXJlZi1uYW1lLCBlamItcmVmLXR5cGUsIGhvbWUsIHJlbW90ZSwKLWVqYi1saW5rPyk+Ci0KLTwhLS0KLVRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCCi1yZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50LiBJdCBpcyByZWNvbW1lbmRlZAotdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLiBVc2VkIGluOiBlamItcmVmCi1FeGFtcGxlOiA8ZWpiLXJlZi1uYW1lPmVqYi9QYXlyb2xsPC9lamItcmVmLW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBlamItcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZQotYmVhbi4gVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci08ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci1Vc2VkIGluOiBlamItcmVmCi0tLT4KLTwhRUxFTUVOVCBlamItcmVmLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzCi1lbnZpcm9ubWVudCBlbnRyaWVzLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZQotbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiBvcHRpb25hbCB2YWx1ZS4KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeSAoZGVzY3JpcHRpb24/LCBlbnYtZW50cnktbmFtZSwgZW52LWVudHJ5LXR5cGUsCi1lbnYtZW50cnktdmFsdWU/KT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MKLWVudmlyb25tZW50IGVudHJ5LiBVc2VkIGluOiBlbnYtZW50cnkKLUV4YW1wbGU6IDxlbnYtZW50cnktbmFtZT5FbXBsb3llZUFwcERCPC9lbnYtZW50cnktbmFtZT4KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgb2YgdGhlCi1lbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQncyBjb2RlLiBUaGUKLWZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZTogamF2YS5sYW5nLkJvb2xlYW4sCi1qYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuSW50ZWdlciwgamF2YS5sYW5nLkRvdWJsZSwgamF2YS5sYW5nLkJ5dGUsCi1qYXZhLmxhbmcuU2hvcnQsIGphdmEubGFuZy5Mb25nLCBhbmQgamF2YS5sYW5nLkZsb2F0LgotCi1Vc2VkIGluOiBlbnYtZW50cnkKLQotRXhhbXBsZToKLTxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MKLWVudmlyb25tZW50IGVudHJ5LiBUaGUgdmFsdWUgbXVzdCBiZSBhIFN0cmluZyB0aGF0IGlzIHZhbGlkIGZvciB0aGUgY29uc3RydWN0b3IKLW9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIuCi0KLVVzZWQgaW46IGVudi1lbnRyeQotCi1FeGFtcGxlOgotPGVudi1lbnRyeS12YWx1ZT4vZGF0YXNvdXJjZXMvTXlEYXRhYmFzZTwvZW52LWVudHJ5LXZhbHVlPgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LXZhbHVlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGhvbWUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUKLWludGVyZmFjZS4KLVVzZWQgaW46IGVqYi1yZWYKLUV4YW1wbGU6IDxob21lPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxIb21lPC9ob21lPgotLS0+Ci08IUVMRU1FTlQgaG9tZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBpY29uIGVsZW1lbnQgY29udGFpbnMgYSBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnQgd2hpY2ggc3BlY2lmeSB0aGUKLVVSSXMgZm9yIGEgc21hbGwgYW5kIGEgbGFyZ2UgR0lGIG9yIEpQRUcgaWNvbiBpbWFnZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUKLWFwcGxpY2F0aW9uIGNsaWVudCBpbiBhIEdVSSB0b29sLgotLS0+Ci08IUVMRU1FTlQgaWNvbiAoc21hbGwtaWNvbj8sIGxhcmdlLWljb24/KT4KLQotPCEtLQotVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgY29udGFpbmluZyBhIGxhcmdlICgzMiB4IDMyKQotaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBhcHBsaWNhdGlvbi1jbGllbnQgamFyCi1maWxlLiBUaGUgaW1hZ2UgbXVzdCBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdCwgYW5kIHRoZSBmaWxlIG5hbWUgbXVzdAotZW5kIHdpdGggdGhlIHN1ZmZpeCAiLmpwZyIgb3IgIi5naWYiIHJlc3BlY3RpdmVseS4gVGhlIGljb24gY2FuIGJlIHVzZWQgYnkKLXRvb2xzLgotRXhhbXBsZToKLTxsYXJnZS1pY29uPmxpYi9pbWFnZXMvZW1wbG95ZWUtc2VydmljZS1pY29uMzJ4MzIuanBnPC9sYXJnZS1pY29uPgotLS0+Ci08IUVMRU1FTlQgbGFyZ2UtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzCi1yZW1vdGUgaW50ZXJmYWNlLgotVXNlZCBpbjogZWpiLXJlZgotRXhhbXBsZToKLTxyZW1vdGU+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZTwvcmVtb3RlPgotLS0+Ci08IUVMRU1FTlQgcmVtb3RlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1hdXRoIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlIHNpZ25zIG9uCi1wcm9ncmFtbWF0aWNhbGx5IHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyLCBvciB3aGV0aGVyIHRoZSBDb250YWluZXIgd2lsbCBzaWduIG9uCi10byB0aGUgcmVzb3VyY2UgbWFuYWdlciBvbiBiZWhhbGYgb2YgdGhlIGJlYW4uIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIENvbnRhaW5lcgotdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZSBEZXBsb3llci4KLVRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci08cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0tLT4KLTwhRUxFTUVOVCByZXMtYXV0aCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGZhY3RvcnkgcmVmZXJlbmNlCi1uYW1lLiBUaGUgcmVzb3VyY2UgZmFjdG9yeSByZWZlcmVuY2UgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24KLWNsaWVudCdzIGVudmlyb25tZW50IGVudHJ5IHdob3NlIHZhbHVlIGNvbnRhaW5zIHRoZSBKTkRJIG5hbWUgb2YgdGhlIGRhdGEKLXNvdXJjZS4KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhIHNvdXJjZS4gVGhlIHR5cGUgaXMKLXNwZWNpZmllZCBieSB0aGUgSmF2YSBpbnRlcmZhY2UgKG9yIGNsYXNzKSBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUKLWRhdGEgc291cmNlLgotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGFwcGxpY2F0aW9uIGNsaWVudHMncwotcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlCi1yZXNvdXJjZSBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lLCB0aGUgaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeSB0eXBlCi1leHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50J3MgY29kZSwgYW5kIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uIChiZWFuCi1vciBjb250YWluZXIpLgotCi1FeGFtcGxlOgotPHJlc291cmNlLXJlZj4KLTxyZXMtcmVmLW5hbWU+RW1wbG95ZWVBcHBEQjwvcmVzLXJlZi1uYW1lPgotPHJlcy10eXBlPmphdmF4LnNxbC5EYXRhU291cmNlPC9yZXMtdHlwZT4KLTxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotPC9yZXNvdXJjZS1yZWY+Ci0tLT4KLTwhRUxFTUVOVCByZXNvdXJjZS1yZWYgKGRlc2NyaXB0aW9uPywgcmVzLXJlZi1uYW1lLCByZXMtdHlwZSwgcmVzLWF1dGgpPgotPCEtLQotVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KQotaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBhcHBsaWNhdGlvbi1jbGllbnQgamFyCi1maWxlLiBUaGUgaW1hZ2UgbXVzdCBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdCwgYW5kIHRoZSBmaWxlIG5hbWUgbXVzdAotZW5kIHdpdGggdGhlIHN1ZmZpeCAiLmpwZyIgb3IgIi5naWYiIHJlc3BlY3RpdmVseS4gVGhlIGljb24gY2FuIGJlIHVzZWQgYnkKLXRvb2xzLgotRXhhbXBsZToKLTxzbWFsbC1pY29uPmxpYi9pbWFnZXMvZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotLS0+Ci08IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBJRCBtZWNoYW5pc20gaXMgdG8gYWxsb3cgdG9vbHMgdG8gZWFzaWx5IG1ha2UgdG9vbC1zcGVjaWZpYyByZWZlcmVuY2VzIHRvCi10aGUgZWxlbWVudHMgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAtLT4KLTwhQVRUTElTVCBhcHBsaWNhdGlvbi1jbGllbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVzY3JpcHRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGlzcGxheS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1saW5rIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LXZhbHVlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGhvbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsYXJnZS1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbW90ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtYXV0aCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNtYWxsLWljb24gaWQgSUQgI0lNUExJRUQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzMuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfMV8zLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkNDU2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzMuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsNTA2ICswLDAgQEAKLTwhLS0KLUNvcHlyaWdodCAoYykgMjAwMCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLAotOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyByZWxhdGluZyB0bwotdGVjaG5vbG9neSBlbWJvZGllZCBpbiB0aGUgcHJvZHVjdCB0aGF0IGlzIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LgotSW4gcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cyBsaXN0ZWQgYXQKLWh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZSBhZGRpdGlvbmFsIHBhdGVudHMgb3IKLXBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUgVS5TLiBhbmQgaW4gb3RoZXIgY291bnRyaWVzLgotCi1UaGlzIGRvY3VtZW50IGFuZCB0aGUgcHJvZHVjdCB0byB3aGljaCBpdCBwZXJ0YWlucyBhcmUgZGlzdHJpYnV0ZWQKLXVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywgZGlzdHJpYnV0aW9uLCBhbmQKLWRlY29tcGlsYXRpb24uICBUaGlzIGRvY3VtZW50IG1heSBiZSByZXByb2R1Y2VkIGFuZCBkaXN0cmlidXRlZCBidXQgbWF5Ci1ub3QgYmUgY2hhbmdlZCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cwotbGljZW5zb3JzLCBpZiBhbnkuCi0KLVRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcyBjb3B5cmlnaHRlZCBhbmQKLWxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotU3VuLCAgU3VuIE1pY3Jvc3lzdGVtcywgIHRoZSBTdW4gbG9nbywgIEphdmEsICBKYXZhU2VydmVyIFBhZ2VzLCAgSmF2YQotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCAgSkRCQywgIEpESywgIEphdmFNYWlsIGFuZCAgYW5kCi1FbnRlcnByaXNlIEphdmFCZWFucyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi1NaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzIFN1YmplY3QgdG8KLVN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLURPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQUxMIEVYUFJFU1MgT1IgSU1QTElFRAotQ09ORElUSU9OUywgUkVQUkVTRU5UQVRJT05TIEFORCBXQVJSQU5USUVTLCBJTkNMVURJTkcgQU5ZIElNUExJRUQKLVdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIE9SCi1OT04tSU5GUklOR0VNRU5ULCBBUkUgRElTQ0xBSU1FRCwgRVhDRVBUIFRPIFRIRSBFWFRFTlQgVEhBVCBTVUNICi1ESVNDTEFJTUVSUyBBUkUgSEVMRCBUTyBCRSBMRUdBTExZIElOVkFMSUQuCi0KLQotX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi1Db3B5cmlnaHQgKGMpIDIwMDAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwKLTkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBFJ3RhdHMtVW5pcy4KLVRvdXMgZHJvaXRzIHJlJ3NlcnZlJ3MuCi0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gYSBsZXMgZHJvaXRzIGRlIHByb3ByaWUndGUnIGludGVsbGVjdHVlbHMKLXJlbGF0YW50cyBhYCBsYSB0ZWNobm9sb2dpZSBpbmNvcnBvcmUnZSBkYW5zIGxlIHByb2R1aXQgcXVpIGVzdCBkZSdjcml0Ci1kYW5zIGNlIGRvY3VtZW50LiBFbiBwYXJ0aWN1bGllciwgZXQgc2FucyBsYSBsaW1pdGF0aW9uLCBjZXMgZHJvaXRzIGRlCi1wcm9wcmllJ3RlJyBpbnRlbGxlY3R1ZWxzIHBldXZlbnQgaW5jbHVyZSB1biBvdSBwbHVzIGRlcyBicmV2ZXRzCi1hbWUncmljYWlucyBlJ251bWUncmUncyBhYCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBldCB1biBvdSBsZXMKLWJyZXZldHMgcGx1cyBzdXBwbGUnbWVudGFpcmVzIG91IGxlcyBhcHBsaWNhdGlvbnMgZGUgYnJldmV0IGVuIGF0dGVudGUKLWRhbnMgbGVzIEUndGF0cy1VbmlzIGV0IGRhbnMgbGVzIGF1dHJlcyBwYXlzLgotCi1DZSBwcm9kdWl0IG91IGRvY3VtZW50IGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldCBkaXN0cmlidWUnCi1hdmVjIGRlcyBsaWNlbmNlcyBxdWkgZW4gcmVzdHJlaWduZW50IGwndXRpbGlzYXRpb24sIGxhIGNvcGllLCBsYQotZGlzdHJpYnV0aW9uLCBldCBsYSBkZSdjb21waWxhdGlvbi4gIENlIGRvY3VtZW50aW9uIGFzc29jaWUgbiBwZXV0Ci1lXnRyZSByZXByb2R1aXRlIGV0IGRpc3RyaWJ1ZXIsIHBhciBxdWVscXVlIG1veWVuIHF1ZSBjZSBzb2l0LCBzYW5zCi1sJ2F1dG9yaXNhdGlvbiBwcmUnYWxhYmxlIGV0IGUnY3JpdGUgZGUgU3VuIGV0IGRlIHNlcyBiYWlsbGV1cnMgZGUKLWxpY2VuY2UsIGxlIGNhcyBlJ2NoZSdhbnQuCi0KLUxlIGxvZ2ljaWVsIGRlJ3RlbnUgcGFyIGRlcyB0aWVycywgZXQgcXVpIGNvbXByZW5kIGxhIHRlY2hub2xvZ2llCi1yZWxhdGl2ZSBhdXggcG9saWNlcyBkZSBjYXJhY3RlYHJlcywgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IGV0Ci1saWNlbmNpZScgcGFyIGRlcyBmb3Vybmlzc2V1cnMgZGUgU3VuLgotCi1TdW4sICBTdW4gTWljcm9zeXN0ZW1zLCAgbGUgbG9nbyBTdW4sICBKYXZhLCAgSmF2YVNlcnZlciBQYWdlcywgIEphdmEKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgIEpEQkMsICBKREssICBKYXZhTWFpbCBldCAgYW5kCi1FbnRlcnByaXNlIEphdmFCZWFucyBzb250IGRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzCi1kZSdwb3NlJ2VzIGRlIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYXV4IEUndGF0cy1VbmlzIGV0IGRhbnMgZCdhdXRyZXMKLXBheXMuCi0KLUxBIERPQ1VNRU5UQVRJT04gRVNUIEZPVVJOSUUgIkVOIEwnRSdUQVQiIEVUIFRPVVRFUyBBVVRSRVMgQ09ORElUSU9OUywKLURFQ0xBUkFUSU9OUyBFVCBHQVJBTlRJRVMgRVhQUkVTU0VTIE9VIFRBQ0lURVMgU09OVCBGT1JNRUxMRU1FTlQKLUVYQ0xVRVMsIERBTlMgTEEgTUVTVVJFIEFVVE9SSVNFRSBQQVIgTEEgTE9JIEFQUExJQ0FCTEUsIFkgQ09NUFJJUwotTk9UQU1NRU5UIFRPVVRFIEdBUkFOVElFIElNUExJQ0lURSBSRUxBVElWRSBBIExBIFFVQUxJVEUgTUFSQ0hBTkRFLCBBCi1MJ0FQVElUVURFIEEgVU5FIFVUSUxJU0FUSU9OIFBBUlRJQ1VMSUVSRSBPVSBBIEwnQUJTRU5DRSBERQotQ09OVFJFRkFDLE9OLgotLS0+Ci0KLTwhLS0KLVRoaXMgaXMgdGhlIFhNTCBEVEQgZm9yIHRoZSBKMkVFIDEuMyBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudAotZGVzY3JpcHRvci4gIEFsbCBKMkVFIDEuMyBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9ycwotbXVzdCBpbmNsdWRlIGEgRE9DVFlQRSBvZiB0aGUgZm9sbG93aW5nIGZvcm06Ci0KLSAgPCFET0NUWVBFIGFwcGxpY2F0aW9uLWNsaWVudCBQVUJMSUMKLQkiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gQ2xpZW50IDEuMy8vRU4iCi0JImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uLWNsaWVudF8xXzMuZHRkIj4KLQotLS0+Ci0KLTwhLS0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi1lbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gUENEQVRBLCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCi0gIGluIHRoZSBkYXRhIG1heSBiZSBpZ25vcmVkLgotCi0tIEluIGVsZW1lbnRzIHdob3NlIHZhbHVlIGlzIGFuICJlbnVtZXJhdGVkIHR5cGUiLCB0aGUgdmFsdWUgaXMKLSAgY2FzZSBzZW5zaXRpdmUuCi0KLS0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUgc2FtZQotICBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3Qgc3RhcnRpbmcgd2l0aCAiLyIpCi0gIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4KLSAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5Ci0gIG5hbWVzIGluIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlCi0gIG5hbWVzIGFyZSBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgc2VydmxldCBBUEkuCi0tLT4KLQotCi08IS0tCi1UaGUgYXBwbGljYXRpb24tY2xpZW50IGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBhcHBsaWNhdGlvbgotY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudAotZGVzY3JpcHRvciBkZXNjcmliZXMgdGhlIEVKQiBjb21wb25lbnRzIGFuZCBleHRlcm5hbCByZXNvdXJjZXMKLXJlZmVyZW5jZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudC4KLS0tPgotPCFFTEVNRU5UIGFwcGxpY2F0aW9uLWNsaWVudCAoaWNvbj8sIGRpc3BsYXktbmFtZSwgZGVzY3JpcHRpb24/LAotCQllbnYtZW50cnkqLCBlamItcmVmKiwgcmVzb3VyY2UtcmVmKiwgcmVzb3VyY2UtZW52LXJlZiosCi0JCWNhbGxiYWNrLWhhbmRsZXI/KT4KLQotPCEtLQotVGhlIGNhbGxiYWNrLWhhbmRsZXIgZWxlbWVudCBuYW1lcyBhIGNsYXNzIHByb3ZpZGVkIGJ5IHRoZQotYXBwbGljYXRpb24uICBUaGUgY2xhc3MgbXVzdCBoYXZlIGEgbm8gYXJncyBjb25zdHJ1Y3RvciBhbmQgbXVzdAotaW1wbGVtZW50IHRoZSBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlciBpbnRlcmZhY2UuCi1UaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBjb250YWluZXIgYW5kCi11c2VkIGJ5IHRoZSBjb250YWluZXIgdG8gY29sbGVjdCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZQotdXNlci4KLQotVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50Ci0tLT4KLTwhRUxFTUVOVCBjYWxsYmFjay1oYW5kbGVyICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50Ci1lbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQKLXRoZSBhcHBsaWNhdGlvbiBjbGllbnQgamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YKLXRoZSBhcHBsaWNhdGlvbiBjbGllbnQgamFyIGZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzCi11c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbgotd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4KLQotVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50LCBlamItcmVmLCBlbnYtZW50cnksIHJlc291cmNlLWVudi1yZWYsCi1yZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi1kaXNwbGF5ZWQgYnkgdG9vbHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KLQotVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50Ci0KLUV4YW1wbGU6Ci0KLTxkaXNwbGF5LW5hbWU+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBlamItcmVmIGVsZW1lbnQKLXRvIHNwZWNpZnkgdGhhdCBhbiBFSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBhbgotZW50ZXJwcmlzZSBiZWFuLgotCi1UaGUgbmFtZSBpbiB0aGUgZWpiLWxpbmsgZWxlbWVudCBpcyBjb21wb3NlZCBvZiBhCi1wYXRoIG5hbWUgc3BlY2lmeWluZyB0aGUgZWpiLWphciBjb250YWluaW5nIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UKLWJlYW4gd2l0aCB0aGUgZWpiLW5hbWUgb2YgdGhlIHRhcmdldCBiZWFuIGFwcGVuZGVkIGFuZCBzZXBhcmF0ZWQgZnJvbQotdGhlIHBhdGggbmFtZSBieSAiIyIuICBUaGUgcGF0aCBuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSBqYXIgZmlsZQotY29udGFpbmluZyB0aGUgYXBwbGljYXRpb24gY2xpZW50IHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbi4KLVRoaXMgYWxsb3dzIG11bHRpcGxlIGVudGVycHJpc2UgYmVhbnMgd2l0aCB0aGUgc2FtZSBlamItbmFtZSB0byBiZQotdW5pcXVlbHkgaWRlbnRpZmllZC4KLQotVXNlZCBpbjogZWpiLXJlZgotCi1FeGFtcGxlczoKLQotCTxlamItbGluaz5FbXBsb3llZVJlY29yZDwvZWpiLWxpbms+Ci0KLQk8ZWpiLWxpbms+Li4vcHJvZHVjdHMvcHJvZHVjdC5qYXIjUHJvZHVjdEVKQjwvZWpiLWxpbms+Ci0KLS0tPgotPCFFTEVNRU5UIGVqYi1saW5rICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1yZWYgZWxlbWVudCBpcyB1c2VkIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8KLWFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCS0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQktIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZgotCSAgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbgotCS0gdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0JLSB0aGUgZXhwZWN0ZWQgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQKLQkgIGVudGVycHJpc2UgYmVhbgotCS0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZAotCSAgZW50ZXJwcmlzZSBiZWFuCi0KLVVzZWQgaW46IGFwcGxpY2F0aW9uLWNsaWVudAotLS0+Ci08IUVMRU1FTlQgZWpiLXJlZiAoZGVzY3JpcHRpb24/LCBlamItcmVmLW5hbWUsIGVqYi1yZWYtdHlwZSwKLQkJaG9tZSwgcmVtb3RlLCBlamItbGluaz8pPgotCi08IS0tCi1UaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCIHJlZmVyZW5jZS4gVGhlCi1FSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQncyBlbnZpcm9ubWVudCBhbmQgaXMKLXJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotd2l0aGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLUl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotVXNlZCBpbjogZWpiLXJlZgotCi1FeGFtcGxlOgotCi08ZWpiLXJlZi1uYW1lPmVqYi9QYXlyb2xsPC9lamItcmVmLW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBlamItcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlCi1yZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KLQotVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQk8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotCTxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotCi1Vc2VkIGluOiBlamItcmVmCi0tLT4KLTwhRUxFTUVOVCBlamItcmVmLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzCi1lbnZpcm9ubWVudCBlbnRyeS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4gb3B0aW9uYWwKLXZhbHVlLiAgSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLCBvbmUgbXVzdCBiZSBzdXBwbGllZAotZHVyaW5nIGRlcGxveW1lbnQuCi0KLVVzZWQgaW46IGFwcGxpY2F0aW9uLWNsaWVudAotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5IChkZXNjcmlwdGlvbj8sIGVudi1lbnRyeS1uYW1lLCBlbnYtZW50cnktdHlwZSwKLQkJZW52LWVudHJ5LXZhbHVlPyk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzCi1lbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotVXNlZCBpbjogZW52LWVudHJ5Ci0KLUV4YW1wbGU6Ci0KLTxlbnYtZW50cnktbmFtZT5taW5BbW91bnQ8L2Vudi1lbnRyeS1uYW1lPgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBvZgotdGhlIGVudmlyb25tZW50IGVudHJ5IHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCdzCi1jb2RlLgotCi1UaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlOgotCi0JamF2YS5sYW5nLkJvb2xlYW4KLQlqYXZhLmxhbmcuQnl0ZQotCWphdmEubGFuZy5DaGFyYWN0ZXIKLQlqYXZhLmxhbmcuU3RyaW5nCi0JamF2YS5sYW5nLlNob3J0Ci0JamF2YS5sYW5nLkludGVnZXIKLQlqYXZhLmxhbmcuTG9uZwotCWphdmEubGFuZy5GbG9hdAotCWphdmEubGFuZy5Eb3VibGUKLQotCi1Vc2VkIGluOiBlbnYtZW50cnkKLQotRXhhbXBsZToKLQotPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncwotZW52aXJvbm1lbnQgZW50cnkuIFRoZSB2YWx1ZSBtdXN0IGJlIGEgU3RyaW5nIHRoYXQgaXMgdmFsaWQgZm9yIHRoZQotY29uc3RydWN0b3Igb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgdGFrZXMgYSBzaW5nbGUgU3RyaW5nCi1wYXJhbWV0ZXIsIG9yIGZvciBqYXZhLmxhbmcuQ2hhcmFjdGVyLCBhIHNpbmdsZSBjaGFyYWN0ZXIuCi0KLVVzZWQgaW46IGVudi1lbnRyeQotCi1FeGFtcGxlOgotCi08ZW52LWVudHJ5LXZhbHVlPjEwMC4wMDwvZW52LWVudHJ5LXZhbHVlPgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LXZhbHVlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGhvbWUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UKLWJlYW4ncyBob21lIGludGVyZmFjZS4KLQotVXNlZCBpbjogZWpiLXJlZgotCi1FeGFtcGxlOgotCi08aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvaG9tZT4KLS0tPgotPCFFTEVNRU5UIGhvbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaWNvbiBlbGVtZW50IGNvbnRhaW5zIHNtYWxsLWljb24gYW5kIGxhcmdlLWljb24gZWxlbWVudHMgdGhhdAotc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGEgbGFyZ2UgR0lGIG9yIEpQRUcgaWNvbiBpbWFnZXMKLXVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhIEdVSSB0b29sLgotCi1Vc2VkIGluOiBhcHBsaWNhdGlvbi1jbGllbnQKLS0tPgotPCFFTEVNRU5UIGljb24gKHNtYWxsLWljb24/LCBsYXJnZS1pY29uPyk+Ci0KLTwhLS0KLVRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi1jb250YWluaW5nIGEgbGFyZ2UgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi1uYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudCdzCi1qYXIgZmlsZS4KLQotVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLVRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi1Vc2VkIGluOiBpY29uCi0KLUV4YW1wbGU6Ci0KLTxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLS0tPgotPCFFTEVNRU5UIGxhcmdlLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlCi1iZWFuJ3MgcmVtb3RlIGludGVyZmFjZS4KLQotVXNlZCBpbjogZWpiLXJlZgotCi1FeGFtcGxlOgotCi08cmVtb3RlPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2U8L3JlbW90ZT4KLS0tPgotPCFFTEVNRU5UIHJlbW90ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtYXV0aCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgY29kZSBzaWducwotb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3Igd2hldGhlciB0aGUgQ29udGFpbmVyCi13aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIgb24gYmVoYWxmIG9mIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQuIEluIHRoZQotbGF0dGVyIGNhc2UsIHRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZQotRGVwbG95ZXIuCi0KLVRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQk8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotCTxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy1hdXRoICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIHJlc291cmNlIG1hbmFnZXIKLWNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLWphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1zaGFyaW5nLXNjb3BlIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgY29ubmVjdGlvbnMgb2J0YWluZWQKLXRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBjYW4gYmUKLXNoYXJlZC4gVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCwgaWYgc3BlY2lmaWVkLCBtdXN0IGJlIG9uZSBvZiB0aGUKLXR3byBmb2xsb3dpbmc6Ci0KLQk8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLQk8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotCi1UaGUgZGVmYXVsdCB2YWx1ZSBpcyBTaGFyZWFibGUuCi0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLXNoYXJpbmctc2NvcGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGEgc291cmNlLiBUaGUgdHlwZQotaXMgc3BlY2lmaWVkIGJ5IHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSBsYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UKLWV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkYXRhIHNvdXJjZS4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1lbnYtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncwotcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UKLWluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQncyBlbnZpcm9ubWVudC4gIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4KLWluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlIGV4cGVjdGVkIGJ5Ci10aGUgYXBwbGljYXRpb24gY2xpZW50IGNvZGUuCi0KLVVzZWQgaW46IGFwcGxpY2F0aW9uLWNsaWVudAotCi1FeGFtcGxlOgotCi08cmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZheC5qbXMuUXVldWU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLTwvcmVzb3VyY2UtZW52LXJlZj4KLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLWVudi1yZWYgKGRlc2NyaXB0aW9uPywgcmVzb3VyY2UtZW52LXJlZi1uYW1lLAotCQlyZXNvdXJjZS1lbnYtcmVmLXR5cGUpPgotCi08IS0tCi1UaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UKLWVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLXRoZSBhcHBsaWNhdGlvbiBjbGllbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50LgotCi1Vc2VkIGluOiByZXNvdXJjZS1lbnYtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXNvdXJjZS1lbnYtcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzb3VyY2UtZW52LXJlZi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIGEgcmVzb3VyY2UKLWVudmlyb25tZW50IHJlZmVyZW5jZS4gIEl0IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEKLWxhbmd1YWdlIGNsYXNzIG9yIGludGVyZmFjZS4KLQotVXNlZCBpbjogcmVzb3VyY2UtZW52LXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtZW52LXJlZi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MKLXJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLWRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUsCi10aGUgaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZQotZXhwZWN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBjb2RlLCB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbgotKEFwcGxpY2F0aW9uIG9yIENvbnRhaW5lciksIGFuZCBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZQotc2hhcmVhYmlsaXR5IG9mIGNvbm5lY3Rpb25zIG9idGFpbmVkIGZyb20gdGhlIHJlc291cmNlIChTaGFyZWFibGUgb3IKLVVuc2hhcmVhYmxlKS4KLQotVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50Ci0KLUV4YW1wbGU6Ci0KLSAgICA8cmVzb3VyY2UtcmVmPgotCTxyZXMtcmVmLW5hbWU+amRiYy9FbXBsb3llZUFwcERCPC9yZXMtcmVmLW5hbWU+Ci0JPHJlcy10eXBlPmphdmF4LnNxbC5EYXRhU291cmNlPC9yZXMtdHlwZT4KLQk8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLQk8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLXJlZiAoZGVzY3JpcHRpb24/LCByZXMtcmVmLW5hbWUsIHJlcy10eXBlLCByZXMtYXV0aCwKLQkJcmVzLXNoYXJpbmctc2NvcGU/KT4KLQotPCEtLQotVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLWNvbnRhaW5pbmcgYSBzbWFsbCAoMTYgeCAxNikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKLW5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgYXBwbGljYXRpb24gY2xpZW50J3MKLWphciBmaWxlLgotCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGljb24KLQotRXhhbXBsZToKLQotPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotLS0+Ci08IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBJRCBtZWNoYW5pc20gaXMgdG8gYWxsb3cgdG9vbHMgdGhhdCBwcm9kdWNlIGFkZGl0aW9uYWwgZGVwbG95bWVudAotaW5mb3JtYXRpb24gKGkuZS4sIGluZm9ybWF0aW9uIGJleW9uZCB0aGUgc3RhbmRhcmQgZGVwbG95bWVudAotZGVzY3JpcHRvciBpbmZvcm1hdGlvbikgdG8gc3RvcmUgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbiBhCi1zZXBhcmF0ZSBmaWxlLCBhbmQgZWFzaWx5IHJlZmVyIGZyb20gdGhlc2UgdG9vbC1zcGVjaWZpYyBmaWxlcyB0byB0aGUKLWluZm9ybWF0aW9uIGluIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLVRvb2xzIGFyZSBub3QgYWxsb3dlZCB0byBhZGQgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbnRvIHRoZQotc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotLS0+Ci0KLTwhQVRUTElTVCBhcHBsaWNhdGlvbi1jbGllbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY2FsbGJhY2staGFuZGxlciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWxpbmsgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktdmFsdWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaG9tZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBpY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxhcmdlLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVtb3RlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1hdXRoIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtc2hhcmluZy1zY29wZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1lbnYtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLWVudi1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1lbnYtcmVmLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNtYWxsLWljb24gaWQgSUQgI0lNUExJRUQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4ODk3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotCSAgICB2ZXJzaW9uPSIxLjQiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWFwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkcwkxLjE3IDAyLzExLzAzCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLSAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLSAgICAgIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgYXBwbGljYXRpb24gY2xpZW50IDEuNAotCWRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdAotCWJlIG5hbWVkICJNRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIiBpbiB0aGUKLQlhcHBsaWNhdGlvbiBjbGllbnQncyBqYXIgZmlsZS4gIEFsbCBhcHBsaWNhdGlvbiBjbGllbnQKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUgdGhlIGFwcGxpY2F0aW9uCi0JY2xpZW50IHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0KLQlhbmQgaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotCXVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLQkgICAgPGFwcGxpY2F0aW9uLWNsaWVudCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkIgotCSAgICAgIHZlcnNpb249IjEuNCI+Ci0JICAgICAgLi4uCi0JICAgIDwvYXBwbGljYXRpb24tY2xpZW50PgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0JdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSjJFRQotCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24tY2xpZW50IiB0eXBlPSJqMmVlOmFwcGxpY2F0aW9uLWNsaWVudFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhcHBsaWNhdGlvbi1jbGllbnQgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuCi0JYXBwbGljYXRpb24gY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBhcHBsaWNhdGlvbgotCWNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cwotCWFuZCBleHRlcm5hbCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGUgYXBwbGljYXRpb24KLQljbGllbnQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4KLQkgIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0JICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0Ci0JICBiZSB1bmlxdWUgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnYtZW50cnkiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZW52LWVudHJ5LW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0JICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSBhcHBsaWNhdGlvbgotCSAgY2xpZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgamF2YTpjb21wL2VudiBjb250ZXh0LiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlCi0JICBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLQkgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLlRoZSBuYW1lCi0JICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKLQkgIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0JICBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudAotCSAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgYXBwbGljYXRpb24gY2xpZW50LgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUKLQkgIG5hbWUgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZQotCSAgYXBwbGljYXRpb24gY2xpZW50IGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lCi0JICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZQotCSAgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICA8L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBsaWNhdGlvbi1jbGllbnRUeXBlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeSIKLQkJICAgdHlwZT0iajJlZTplbnYtZW50cnlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZiIKLQkJICAgdHlwZT0iajJlZTplamItcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6c2VydmljZS1yZWZHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLXJlZiIKLQkJICAgdHlwZT0iajJlZTpyZXNvdXJjZS1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZiIKLQkJICAgdHlwZT0iajJlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIgotCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhbGxiYWNrLWhhbmRsZXIiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGNhbGxiYWNrLWhhbmRsZXIgZWxlbWVudCBuYW1lcyBhIGNsYXNzIHByb3ZpZGVkIGJ5Ci0JICAgIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzCi0JICAgIGNvbnN0cnVjdG9yIGFuZCBtdXN0IGltcGxlbWVudCB0aGUKLQkgICAgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXIKLQkgICAgaW50ZXJmYWNlLiAgVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZQotCSAgICBhcHBsaWNhdGlvbiBjbGllbnQgY29udGFpbmVyIGFuZCB1c2VkIGJ5IHRoZSBjb250YWluZXIKLQkgICAgdG8gY29sbGVjdCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSB1c2VyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24iCi0JCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0JCSAgIGZpeGVkPSIxLjQiCi0JCSAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjQuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzUueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfNS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDA4MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfNS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjUiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWFwcGxpY2F0aW9uLWNsaWVudF81LnhzZHMJMS4yNiAwMi8xNy8wNgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICAgICAgVS5TLkEKLSAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVsKLQotCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgNQotCWRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdAotCWJlIG5hbWVkICJNRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIiBpbiB0aGUKLQlhcHBsaWNhdGlvbiBjbGllbnQncyBqYXIgZmlsZS4gIEFsbCBhcHBsaWNhdGlvbiBjbGllbnQKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUgdGhlIGFwcGxpY2F0aW9uCi0JY2xpZW50IHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRSBuYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLQotCWFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8YXBwbGljYXRpb24tY2xpZW50IHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotCQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb24tY2xpZW50XzUueHNkIgotCSAgICAgIHZlcnNpb249IjUiPgotCSAgICAgIC4uLgotCSAgICA8L2FwcGxpY2F0aW9uLWNsaWVudD4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotCXRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIEphdmEgRUUKLQluYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzUueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbi1jbGllbnQiIHR5cGU9ImphdmFlZTphcHBsaWNhdGlvbi1jbGllbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXBwbGljYXRpb24tY2xpZW50IGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbgotCWFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBUaGUgYXBwbGljYXRpb24KLQljbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yIGRlc2NyaWJlcyB0aGUgRUpCIGNvbXBvbmVudHMKLQlhbmQgZXh0ZXJuYWwgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhlIGFwcGxpY2F0aW9uCi0JY2xpZW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuCi0JICBhcHBsaWNhdGlvbiBjbGllbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotCSAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdAotCSAgYmUgdW5pcXVlIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplbnYtZW50cnkiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplbnYtZW50cnktbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIGFwcGxpY2F0aW9uCi0JICBjbGllbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLQkgIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotCSAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLlRoZSBuYW1lCi0JICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJlcy1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InJlc291cmNlLWVudi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0JICBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzIHRoZQotCSAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQKLQkgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLQkgIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZQotCSAgbmFtZSBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlCi0JICBhcHBsaWNhdGlvbiBjbGllbnQgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKLQkgIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlCi0JICB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50LgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICA8L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBsaWNhdGlvbi1jbGllbnRUeXBlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgotCQkgICB0eXBlPSJqYXZhZWU6ZW52LWVudHJ5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTplamItcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpzZXJ2aWNlLXJlZkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6cmVzb3VyY2UtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTpwZXJzaXN0ZW5jZS11bml0LXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWNvbnN0cnVjdCIKLQkJICAgdHlwZT0iamF2YWVlOmxpZmVjeWNsZS1jYWxsYmFja1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtZGVzdHJveSIKLQkJICAgdHlwZT0iamF2YWVlOmxpZmVjeWNsZS1jYWxsYmFja1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWxsYmFjay1oYW5kbGVyIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGNhbGxiYWNrLWhhbmRsZXIgZWxlbWVudCBuYW1lcyBhIGNsYXNzIHByb3ZpZGVkIGJ5Ci0JICAgIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzCi0JICAgIGNvbnN0cnVjdG9yIGFuZCBtdXN0IGltcGxlbWVudCB0aGUKLQkgICAgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXIKLQkgICAgaW50ZXJmYWNlLiAgVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZQotCSAgICBhcHBsaWNhdGlvbiBjbGllbnQgY29udGFpbmVyIGFuZCB1c2VkIGJ5IHRoZSBjb250YWluZXIKLQkgICAgdG8gY29sbGVjdCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSB1c2VyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRld2V5LXZlcnNpb25UeXBlIgotCQkgICBmaXhlZD0iNSIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDUuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDwveHNkOmF0dHJpYnV0ZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIGRlZmluZXMgd2hldGhlciB0aGlzCi0JICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYW5kIG90aGVyIHJlbGF0ZWQgZGVwbG95bWVudAotCSAgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbW9kdWxlIChlLmcuLCB3ZWIgc2VydmljZQotCSAgZGVzY3JpcHRvcnMpIGFyZSBjb21wbGV0ZSwgb3Igd2hldGhlciB0aGUgY2xhc3MKLQkgIGZpbGVzIGF2YWlsYWJsZSB0byB0aGlzIG1vZHVsZSBhbmQgcGFja2FnZWQgd2l0aAotCSAgdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQgYmUgZXhhbWluZWQgZm9yIGFubm90YXRpb25zCi0JICB0aGF0IHNwZWNpZnkgZGVwbG95bWVudCBpbmZvcm1hdGlvbi4KLQotCSAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgc2V0IHRvICJ0cnVlIiwgdGhlIGRlcGxveW1lbnQKLQkgIHRvb2wgbXVzdCBpZ25vcmUgYW55IGFubm90YXRpb25zIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50Ci0JICBpbmZvcm1hdGlvbiwgd2hpY2ggbWlnaHQgYmUgcHJlc2VudCBpbiB0aGUgY2xhc3MgZmlsZXMKLQkgIG9mIHRoZSBhcHBsaWNhdGlvbi4KLQotCSAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgbm90IHNwZWNpZmllZCBvciBpcyBzZXQgdG8KLQkgICJmYWxzZSIsIHRoZSBkZXBsb3ltZW50IHRvb2wgbXVzdCBleGFtaW5lIHRoZSBjbGFzcwotCSAgZmlsZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGZvciBhbm5vdGF0aW9ucywgYXMKLQkgIHNwZWNpZmllZCBieSB0aGUgc3BlY2lmaWNhdGlvbnMuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDwveHNkOmF0dHJpYnV0ZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfNi54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF82LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4ZTVlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF82LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgICAgICAgIHZlcnNpb249IjYiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgotICAgICAgCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAgIAotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uCi0gICAgICBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUKLSAgICAgICJMaWNlbnNlIikuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgICAgIHRoZSBMaWNlbnNlLiBZb3UgY2FuIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgICAgIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUEwuaHRtbCBvcgotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotICAgICAgTGljZW5zZS4KLSAgICAgIAotICAgICAgV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIKLSAgICAgIE5vdGljZSBpbiBlYWNoIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdAotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAgICAgIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMKLSAgICAgIHByb3ZpZGVkIGJ5IFN1biBpbiB0aGUgR1BMIFZlcnNpb24gMiBzZWN0aW9uIG9mIHRoZSBMaWNlbnNlIGZpbGUKLSAgICAgIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLiAgSWYgYXBwbGljYWJsZSwgYWRkIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFtdCi0gICAgICByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKLSAgICAgICJQb3J0aW9ucyBDb3B5cmlnaHRlZCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSIKLSAgICAgIAotICAgICAgQ29udHJpYnV0b3Iocyk6Ci0gICAgICAKLSAgICAgIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUKLSAgICAgIENEREwgb3Igb25seSB0aGUgR1BMIFZlcnNpb24gMiwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBhZGRpbmcKLSAgICAgICJbQ29udHJpYnV0b3JdIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcwotICAgICAgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwgVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdQotICAgICAgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEgcmVjaXBpZW50IGhhcyB0aGUKLSAgICAgIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZQotICAgICAgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0byBpdHMKLSAgICAgIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMgotICAgICAgY29kZSBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlCi0gICAgICBvcHRpb24gYXBwbGllcyBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaAotICAgICAgb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyLgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbWwotICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCA2Ci0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QKLSAgICAgIGJlIG5hbWVkICJNRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIiBpbiB0aGUKLSAgICAgIGFwcGxpY2F0aW9uIGNsaWVudCdzIGphciBmaWxlLiAgQWxsIGFwcGxpY2F0aW9uIGNsaWVudAotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlIHRoZSBhcHBsaWNhdGlvbgotICAgICAgY2xpZW50IHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRSBuYW1lc3BhY2U6Ci0gICAgICAKLSAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotICAgICAgCi0gICAgICBhbmQgaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotICAgICAgdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLSAgICAgIAotICAgICAgPGFwcGxpY2F0aW9uLWNsaWVudCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIAotICAgICAgCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbi1jbGllbnRfNi54c2QiCi0gICAgICB2ZXJzaW9uPSI2Ij4KLSAgICAgIC4uLgotICAgICAgPC9hcHBsaWNhdGlvbi1jbGllbnQ+Ci0gICAgICAKLSAgICAgIFRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotICAgICAgdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSmF2YSBFRQotICAgICAgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLSAgICAgIAotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uLWNsaWVudF82LnhzZAotICAgICAgCi0gICAgICBdXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLSAgICAgIAotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICAgICAgc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICAgICAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICAgICAgc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAgICAgIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gICAgICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgICAgIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV82LnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24tY2xpZW50IgotICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmFwcGxpY2F0aW9uLWNsaWVudFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgYXBwbGljYXRpb24tY2xpZW50IGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbgotICAgICAgICBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGFwcGxpY2F0aW9uCi0gICAgICAgIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cwotICAgICAgICBhbmQgZXh0ZXJuYWwgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhlIGFwcGxpY2F0aW9uCi0gICAgICAgIGNsaWVudC4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0iZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuCi0gICAgICAgICAgYXBwbGljYXRpb24gY2xpZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLSAgICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0Ci0gICAgICAgICAgYmUgdW5pcXVlIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVudi1lbnRyeSIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmVudi1lbnRyeS1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotICAgICAgICAgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIGFwcGxpY2F0aW9uCi0gICAgICAgICAgY2xpZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotICAgICAgICAgIGFwcGxpY2F0aW9uIGNsaWVudC4KLSAgICAgICAgICAKLSAgICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTplamItcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuVGhlIG5hbWUKLSAgICAgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotICAgICAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnJlcy1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0gICAgICAgICAgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUKLSAgICAgICAgICBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudAotICAgICAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0gICAgICAgICAgYXBwbGljYXRpb24gY2xpZW50LgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICAgIDx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUKLSAgICAgICAgICBuYW1lIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotICAgICAgICAgIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlCi0gICAgICAgICAgYXBwbGljYXRpb24gY2xpZW50IGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lCi0gICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgICB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50LgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwbGljYXRpb24tY2xpZW50VHlwZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtb2R1bGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplbnYtZW50cnlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVqYi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpzZXJ2aWNlLXJlZkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyZXNvdXJjZS1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnJlc291cmNlLWVudi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1yZWYiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBlcnNpc3RlbmNlLXVuaXQtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWNvbnN0cnVjdCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtZGVzdHJveSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWxsYmFjay1oYW5kbGVyIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBjYWxsYmFjay1oYW5kbGVyIGVsZW1lbnQgbmFtZXMgYSBjbGFzcyBwcm92aWRlZCBieQotICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uLiAgVGhlIGNsYXNzIG11c3QgaGF2ZSBhIG5vIGFyZ3MKLSAgICAgICAgICAgIGNvbnN0cnVjdG9yIGFuZCBtdXN0IGltcGxlbWVudCB0aGUKLSAgICAgICAgICAgIGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyCi0gICAgICAgICAgICBpbnRlcmZhY2UuICBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlCi0gICAgICAgICAgICBhcHBsaWNhdGlvbiBjbGllbnQgY29udGFpbmVyIGFuZCB1c2VkIGJ5IHRoZSBjb250YWluZXIKLSAgICAgICAgICAgIHRvIGNvbGxlY3QgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgdXNlci4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGEtc291cmNlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkYXRhLXNvdXJjZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgZml4ZWQ9IjYiCi0gICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgNi4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBkZWZpbmVzIHdoZXRoZXIgdGhpcwotICAgICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgb3RoZXIgcmVsYXRlZCBkZXBsb3ltZW50Ci0gICAgICAgICAgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbW9kdWxlIChlLmcuLCB3ZWIgc2VydmljZQotICAgICAgICAgIGRlc2NyaXB0b3JzKSBhcmUgY29tcGxldGUsIG9yIHdoZXRoZXIgdGhlIGNsYXNzCi0gICAgICAgICAgZmlsZXMgYXZhaWxhYmxlIHRvIHRoaXMgbW9kdWxlIGFuZCBwYWNrYWdlZCB3aXRoCi0gICAgICAgICAgdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQgYmUgZXhhbWluZWQgZm9yIGFubm90YXRpb25zCi0gICAgICAgICAgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQgaW5mb3JtYXRpb24uCi0gICAgICAgICAgCi0gICAgICAgICAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgc2V0IHRvICJ0cnVlIiwgdGhlIGRlcGxveW1lbnQKLSAgICAgICAgICB0b29sIG11c3QgaWdub3JlIGFueSBhbm5vdGF0aW9ucyB0aGF0IHNwZWNpZnkgZGVwbG95bWVudAotICAgICAgICAgIGluZm9ybWF0aW9uLCB3aGljaCBtaWdodCBiZSBwcmVzZW50IGluIHRoZSBjbGFzcyBmaWxlcwotICAgICAgICAgIG9mIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAKLSAgICAgICAgICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIHNldCB0bwotICAgICAgICAgICJmYWxzZSIsIHRoZSBkZXBsb3ltZW50IHRvb2wgbXVzdCBleGFtaW5lIHRoZSBjbGFzcwotICAgICAgICAgIGZpbGVzIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgYW5ub3RhdGlvbnMsIGFzCi0gICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9ucy4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl8xXzIuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl8xXzIuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzU3MzYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fMV8yLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi08IS0tCi1Db3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIDkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDQSAgOTQzMDMsIFUuUy5BLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLVRoaXMgcHJvZHVjdCBvciBkb2N1bWVudCBpcyBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGFuZCBkaXN0cmlidXRlZAotdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgaXRzIHVzZSwgY29weWluZywgZGlzdHJpYnV0aW9uLCBhbmQKLWRlY29tcGlsYXRpb24uICBObyBwYXJ0IG9mIHRoaXMgcHJvZHVjdCBvciBkb2N1bWVudGF0aW9uIG1heSBiZQotcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KLW9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LiAgCi0KLVRoaXJkIHBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcyBjb3B5cmlnaHRlZCBhbmQgCi1saWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuIAotCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gTG9nbywgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YSAKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCBhbmQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsIAotYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYyBpbiB0aGUgVS5TLiAKLWFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUFsbCBTUEFSQyB0cmFkZW1hcmtzIGFyZSB1c2VkIHVuZGVyIGxpY2Vuc2UgYW5kIGFyZSB0cmFkZW1hcmtzCi1vciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU1BBUkMgSW50ZXJuYXRpb25hbCwgSW5jLgotaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4gUHJvZHVjdHMgYmVhcmluZyBTUEFSQwotdHJhZGVtYXJrcyBhcmUgYmFzZWQgdXBvbiBhbiBhcmNoaXRlY3R1cmUgZGV2ZWxvcGVkIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gCi0KLVBvc3RTY3JpcHQgaXMgYSByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zLCBJbmMuIAotCi0gCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMgU3ViamVjdCB0byAKLVN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLQotIAotRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTEwgRVhQUkVTUyBPUiBJTVBMSUVECi1DT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkKLUlNUExJRUQgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UgT1IgTk9OLUlORlJJTkdFTUVOVCwgQVJFIERJU0NMQUlNRUQsIEVYQ0VQVAotVE8gVEhFIEVYVEVOVCBUSEFUIFNVQ0ggRElTQ0xBSU1FUlMgQVJFIEhFTEQgVE8gQkUgTEVHQUxMWQotSU5WQUxJRC4KLQotX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgCi05MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSAgOTQzMDMsIEV0YXRzLVVuaXMuIAotVG91cyBkcm9pdHMgcmUnc2VydmUncy4KLSAKLQotQ2UgcHJvZHVpdCBvdSBkb2N1bWVudCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQgZGlzdHJpYnVlJyBhdmVjIAotZGVzIGxpY2VuY2VzIHF1aSBlbiByZXN0cmVpZ25lbnQgbCd1dGlsaXNhdGlvbiwgbGEgY29waWUsIGxhIGRpc3RyaWJ1dGlvbiwKLWV0IGxhIGRlJ2NvbXBpbGF0aW9uLiAgQXVjdW5lIHBhcnRpZSBkZSBjZSBwcm9kdWl0IG91IGRlIHNhIGRvY3VtZW50YXRpb24KLWFzc29jaWUnZSBuZSBwZXV0IGVedHJlIHJlcHJvZHVpdGUgc291cyBhdWN1bmUgZm9ybWUsIHBhciBxdWVscXVlIG1veWVuIAotcXVlIGNlIHNvaXQsIHNhbnMgbCdhdXRvcmlzYXRpb24gcHJlJ2FsYWJsZSBldCBlJ2NyaXRlIGRlIFN1biBldCBkZSBzZXMgCi1iYWlsbGV1cnMgZGUgbGljZW5jZSwgcydpbCB5IGVuIGEuICAKLQotTGUgbG9naWNpZWwgZGUndGVudSBwYXIgZGVzIHRpZXJzLCBldCBxdWkgY29tcHJlbmQgbGEgdGVjaG5vbG9naWUgCi1yZWxhdGl2ZSBhdXggcG9saWNlcyBkZSBjYXJhY3RlYHJlcywgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IAotZXQgbGljZW5jaWUnIHBhciBkZXMgZm91cm5pc3NldXJzIGRlIFN1bi4KLSAKLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgbGUgbG9nbyBTdW4sIFNvbGFyaXMsIEphdmEsIEphdmFTZXJ2ZXIgUGFnZXMsIEphdmEgCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsIEpEQkMsIEpESywgSmF2YU1haWwsIGV0IEVudGVycHJpc2UgSmF2YUJlYW5zLCAgCi1zb250IGRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU3VuIAotTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFdGF0cy1VbmlzIGV0IGRhbnMgZCdhdXRyZXMgcGF5cy4KLSAKLVRvdXRlcyBsZXMgbWFycXVlcyBTUEFSQyBzb250IHV0aWxpc2UnZXMgc291cyBsaWNlbmNlIGV0IHNvbnQKLWRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU1BBUkMKLUludGVybmF0aW9uYWwsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgIGRhbnMKLWQnYXV0cmVzIHBheXMuIExlcyBwcm9kdWl0cyBwb3J0YW50IGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQKLWJhc2UncyBzdXIgdW5lIGFyY2hpdGVjdHVyZSBkZSd2ZWxvcHBlJ2UgcGFyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIAotCi1Qb3N0Y3JpcHQgZXN0IHVuZSBtYXJxdWUgZW5yZWdpc3RyZSdlIGQnQWRvYmUgU3lzdGVtcyBJbmMuIAotIAotTEEgRE9DVU1FTlRBVElPTiBFU1QgRk9VUk5JRSAiRU4gTCdFVEFUIiBFVCBUT1VURVMgQVVUUkVTIENPTkRJVElPTlMsCi1ERUNMQVJBVElPTlMgRVQgR0FSQU5USUVTIEVYUFJFU1NFUyBPVSBUQUNJVEVTIFNPTlQgRk9STUVMTEVNRU5UIEVYQ0xVRVMsCi1EQU5TIExBIE1FU1VSRSBBVVRPUklTRUUgUEFSIExBIExPSSBBUFBMSUNBQkxFLCBZIENPTVBSSVMgTk9UQU1NRU5UCi1UT1VURSBHQVJBTlRJRSBJTVBMSUNJVEUgUkVMQVRJVkUgQSBMQSBRVUFMSVRFIE1BUkNIQU5ERSwgQSBMJ0FQVElUVURFCi1BIFVORSBVVElMSVNBVElPTiBQQVJUSUNVTElFUkUgT1UgQSBMJ0FCU0VOQ0UgREUgQ09OVFJFRkFDT04uCi0tLT4KLQotPCEtLQotVGhlIGFsdC1kZCBlbGVtZW50IHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUKLWRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlIGZvciBhIHBhcnRpY3VsYXIgSjJFRSBtb2R1bGUuIFRoZSBVUkkgbXVzdCBzcGVjaWZ5Ci10aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgcmVsYXRpdmUgdG8gdGhlCi1hcHBsaWNhdGlvbidzIHJvb3QgZGlyZWN0b3J5LiBJZiBhbHQtZGQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlcGxveWVyIG11c3QgcmVhZAotdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmcm9tIHRoZSBkZWZhdWx0IGxvY2F0aW9uIGFuZCBmaWxlIG5hbWUgcmVxdWlyZWQgYnkKLXRoZSByZXNwZWN0aXZlIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uLgotLS0+Ci08IUVMRU1FTlQgYWx0LWRkICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIEoyRUUgYXBwbGljYXRpb24gZGVwbG95bWVudAotZGVzY3JpcHRvci4KLS0tPgotPCFFTEVNRU5UIGFwcGxpY2F0aW9uIChpY29uPywgZGlzcGxheS1uYW1lLCBkZXNjcmlwdGlvbj8sIG1vZHVsZSssCi1zZWN1cml0eS1yb2xlKik+Ci0KLTwhLS0KLVRoZSBjb250ZXh0LXJvb3QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNvbnRleHQgcm9vdCBvZiBhIHdlYiBhcHBsaWNhdGlvbgotLS0+Ci08IUVMRU1FTlQgY29udGV4dC1yb290ICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgcHJvdmlkZXMgYSBodW1hbiByZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKLWFwcGxpY2F0aW9uLiBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUKLWFwcGxpY2F0aW9uIGFzc2VtYmxlciB3YW50cyB0byBwcm92aWRlIHRoZSBkZXBsb3llci4KLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhbiBhcHBsaWNhdGlvbiBuYW1lLgotVGhlIGFwcGxpY2F0aW9uIG5hbWUgaXMgYXNzaWduZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGJ5IHRoZSBhcHBsaWNhdGlvbiBhc3NlbWJsZXIKLWFuZCBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBhcHBsaWNhdGlvbiB0byB0aGUgZGVwbG95ZXIgYXQgZGVwbG95bWVudCB0aW1lLgotLS0+Ci08IUVMRU1FTlQgZGlzcGxheS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYiBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgZWpiLWphciwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUKLWFwcGxpY2F0aW9uIHBhY2thZ2UuCi0tLT4KLTwhRUxFTUVOVCBlamIgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaWNvbiBlbGVtZW50IGNvbnRhaW5zIGEgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50IHdoaWNoIHNwZWNpZnkgdGhlCi1VUklzIGZvciBhIHNtYWxsIGFuZCBhIGxhcmdlIEdJRiBvciBKUEVHIGljb24gaW1hZ2UgdG8gcmVwcmVzZW50IHRoZSBhcHBsaWNhdGlvbgotaW4gYSBHVUkuCi0tLT4KLTwhRUxFTUVOVCBpY29uIChzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8pPgotCi08IS0tCi1UaGUgamF2YSBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgamF2YSBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlLCByZWxhdGl2ZQotdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLS0tPgotPCFFTEVNRU5UIGphdmEgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbGFyZ2UtaWNvbiBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIGZvciBhIGxhcmdlIEdJRiBvciBKUEVHIGljb24gaW1hZ2UgdG8KLXJlcHJlc2VudCB0aGUgYXBwbGljYXRpb24gaW4gYSBHVUkuCi0tLT4KLTwhRUxFTUVOVCBsYXJnZS1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIG1vZHVsZSBlbGVtZW50IHJlcHJlc2VudHMgYSBzaW5nbGUgSjJFRSBtb2R1bGUgYW5kIGNvbnRhaW5zIGFuIGVqYiwgamF2YSwgb3IKLXdlYiBlbGVtZW50LCB3aGljaCBpbmRpY2F0ZXMgdGhlIG1vZHVsZSB0eXBlIGFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZQotZmlsZSwgYW5kIGFuIG9wdGlvbmFsIGFsdC1kZCBlbGVtZW50LCB3aGljaCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvIHRoZQotcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi1UaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgaGF2ZSBvbmUgbW9kdWxlIGVsZW1lbnQgZm9yIGVhY2ggSjJFRQotbW9kdWxlIGluIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotLS0+Ci08IUVMRU1FTlQgbW9kdWxlICgoZWpiIHwgamF2YSB8IHdlYiksIGFsdC1kZD8pPgotCi08IS0tCi1UaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotLS0+Ci08IUVMRU1FTlQgcm9sZS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNlY3VyaXR5IHJvbGUgd2hpY2ggaXMKLWdsb2JhbCB0byB0aGUgYXBwbGljYXRpb24uIFRoZSBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGEgZGVzY3JpcHRpb24gb2YgdGhlCi1zZWN1cml0eSByb2xlLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZS4gVGhlIGRlc2NyaXB0aW9ucyBhdCB0aGlzIGxldmVsCi1vdmVycmlkZSB0aG9zZSBpbiB0aGUgY29tcG9uZW50IGxldmVsIHNlY3VyaXR5LXJvbGUgZGVmaW5pdGlvbnMgYW5kIG11c3QgYmUgdGhlCi1kZXNjcmlwdGlvbnMgdG9vbCBkaXNwbGF5IHRvIHRoZSBkZXBsb3llci4KLS0tPgotPCFFTEVNRU5UIHNlY3VyaXR5LXJvbGUgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKT4KLQotPCEtLQotVGhlIHNtYWxsLWljb24gZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBmb3IgYSBzbWFsbCBHSUYgb3IgSlBFRyBpY29uIGltYWdlIHRvCi1yZXByZXNlbnQgdGhlIGFwcGxpY2F0aW9uIGluIGEgR1VJLgotLS0+Ci08IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB3ZWIgZWxlbWVudCBjb250YWlucyB0aGUgd2ViLXVyaSBhbmQgY29udGV4dC1yb290IG9mIGEgd2ViIGFwcGxpY2F0aW9uCi1tb2R1bGUuCi0tLT4KLTwhRUxFTUVOVCB3ZWIgKHdlYi11cmksIGNvbnRleHQtcm9vdCk+Ci0KLTwhLS0KLVRoZSB3ZWItdXJpIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSB3ZWIgYXBwbGljYXRpb24gZmlsZSwgcmVsYXRpdmUgdG8gdGhlCi10b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0tLT4KLTwhRUxFTUVOVCB3ZWItdXJpICgjUENEQVRBKT4KLQotPCEtLQotVGhlIElEIG1lY2hhbmlzbSBpcyB0byBhbGxvdyB0b29scyB0byBlYXNpbHkgbWFrZSB0b29sLXNwZWNpZmljIHJlZmVyZW5jZXMgdG8KLXRoZSBlbGVtZW50cyBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotIC0tPgotPCFBVFRMSVNUIGFsdC1kZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhcHBsaWNhdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb250ZXh0LXJvb3QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVzY3JpcHRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGlzcGxheS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBpY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGphdmEgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGFyZ2UtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtb2R1bGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgcm9sZS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LXJvbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc21hbGwtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWIgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgd2ViLXVyaSBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fMV8zLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fMV8zLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJhNDlhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzFfMy5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotPCEtLQotQ29weXJpZ2h0IChjKSAyMDAwIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sCi05MDEgU2FuIEFudG9uaW8gUm9hZCwKLVBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIHJlbGF0aW5nIHRvCi10ZWNobm9sb2d5IGVtYm9kaWVkIGluIHRoZSBwcm9kdWN0IHRoYXQgaXMgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuCi1JbiBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzIGxpc3RlZCBhdAotaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlIGFkZGl0aW9uYWwgcGF0ZW50cyBvcgotcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZSBVLlMuIGFuZCBpbiBvdGhlciBjb3VudHJpZXMuCi0KLVRoaXMgZG9jdW1lbnQgYW5kIHRoZSBwcm9kdWN0IHRvIHdoaWNoIGl0IHBlcnRhaW5zIGFyZSBkaXN0cmlidXRlZAotdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLCBkaXN0cmlidXRpb24sIGFuZAotZGVjb21waWxhdGlvbi4gIFRoaXMgZG9jdW1lbnQgbWF5IGJlIHJlcHJvZHVjZWQgYW5kIGRpc3RyaWJ1dGVkIGJ1dCBtYXkKLW5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzCi1saWNlbnNvcnMsIGlmIGFueS4KLQotVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzIGNvcHlyaWdodGVkIGFuZAotbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi1TdW4sICBTdW4gTWljcm9zeXN0ZW1zLCAgdGhlIFN1biBsb2dvLCAgSmF2YSwgIEphdmFTZXJ2ZXIgUGFnZXMsICBKYXZhCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsICBKREJDLCAgSkRLLCAgSmF2YU1haWwgYW5kICBhbmQKLUVudGVycHJpc2UgSmF2YUJlYW5zIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLU1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMgU3ViamVjdCB0bwotU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTEwgRVhQUkVTUyBPUiBJTVBMSUVECi1DT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkgSU1QTElFRAotV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IKLU5PTi1JTkZSSU5HRU1FTlQsIEFSRSBESVNDTEFJTUVELCBFWENFUFQgVE8gVEhFIEVYVEVOVCBUSEFUIFNVQ0gKLURJU0NMQUlNRVJTIEFSRSBIRUxEIFRPIEJFIExFR0FMTFkgSU5WQUxJRC4KLQotCi1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLUNvcHlyaWdodCAoYykgMjAwMCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLAotOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIEUndGF0cy1VbmlzLgotVG91cyBkcm9pdHMgcmUnc2VydmUncy4KLQotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhIGxlcyBkcm9pdHMgZGUgcHJvcHJpZSd0ZScgaW50ZWxsZWN0dWVscwotcmVsYXRhbnRzIGFgIGxhIHRlY2hub2xvZ2llIGluY29ycG9yZSdlIGRhbnMgbGUgcHJvZHVpdCBxdWkgZXN0IGRlJ2NyaXQKLWRhbnMgY2UgZG9jdW1lbnQuIEVuIHBhcnRpY3VsaWVyLCBldCBzYW5zIGxhIGxpbWl0YXRpb24sIGNlcyBkcm9pdHMgZGUKLXByb3ByaWUndGUnIGludGVsbGVjdHVlbHMgcGV1dmVudCBpbmNsdXJlIHVuIG91IHBsdXMgZGVzIGJyZXZldHMKLWFtZSdyaWNhaW5zIGUnbnVtZSdyZSdzIGFgIGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGV0IHVuIG91IGxlcwotYnJldmV0cyBwbHVzIHN1cHBsZSdtZW50YWlyZXMgb3UgbGVzIGFwcGxpY2F0aW9ucyBkZSBicmV2ZXQgZW4gYXR0ZW50ZQotZGFucyBsZXMgRSd0YXRzLVVuaXMgZXQgZGFucyBsZXMgYXV0cmVzIHBheXMuCi0KLUNlIHByb2R1aXQgb3UgZG9jdW1lbnQgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IGV0IGRpc3RyaWJ1ZScKLWF2ZWMgZGVzIGxpY2VuY2VzIHF1aSBlbiByZXN0cmVpZ25lbnQgbCd1dGlsaXNhdGlvbiwgbGEgY29waWUsIGxhCi1kaXN0cmlidXRpb24sIGV0IGxhIGRlJ2NvbXBpbGF0aW9uLiAgQ2UgZG9jdW1lbnRpb24gYXNzb2NpZSBuIHBldXQKLWVedHJlIHJlcHJvZHVpdGUgZXQgZGlzdHJpYnVlciwgcGFyIHF1ZWxxdWUgbW95ZW4gcXVlIGNlIHNvaXQsIHNhbnMKLWwnYXV0b3Jpc2F0aW9uIHByZSdhbGFibGUgZXQgZSdjcml0ZSBkZSBTdW4gZXQgZGUgc2VzIGJhaWxsZXVycyBkZQotbGljZW5jZSwgbGUgY2FzIGUnY2hlJ2FudC4KLQotTGUgbG9naWNpZWwgZGUndGVudSBwYXIgZGVzIHRpZXJzLCBldCBxdWkgY29tcHJlbmQgbGEgdGVjaG5vbG9naWUKLXJlbGF0aXZlIGF1eCBwb2xpY2VzIGRlIGNhcmFjdGVgcmVzLCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQKLWxpY2VuY2llJyBwYXIgZGVzIGZvdXJuaXNzZXVycyBkZSBTdW4uCi0KLVN1biwgIFN1biBNaWNyb3N5c3RlbXMsICBsZSBsb2dvIFN1biwgIEphdmEsICBKYXZhU2VydmVyIFBhZ2VzLCAgSmF2YQotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCAgSkRCQywgIEpESywgIEphdmFNYWlsIGV0ICBhbmQKLUVudGVycHJpc2UgSmF2YUJlYW5zIHNvbnQgZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMKLWRlJ3Bvc2UnZXMgZGUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhdXggRSd0YXRzLVVuaXMgZXQgZGFucyBkJ2F1dHJlcwotcGF5cy4KLQotTEEgRE9DVU1FTlRBVElPTiBFU1QgRk9VUk5JRSAiRU4gTCdFJ1RBVCIgRVQgVE9VVEVTIEFVVFJFUyBDT05ESVRJT05TLAotREVDTEFSQVRJT05TIEVUIEdBUkFOVElFUyBFWFBSRVNTRVMgT1UgVEFDSVRFUyBTT05UIEZPUk1FTExFTUVOVAotRVhDTFVFUywgREFOUyBMQSBNRVNVUkUgQVVUT1JJU0VFIFBBUiBMQSBMT0kgQVBQTElDQUJMRSwgWSBDT01QUklTCi1OT1RBTU1FTlQgVE9VVEUgR0FSQU5USUUgSU1QTElDSVRFIFJFTEFUSVZFIEEgTEEgUVVBTElURSBNQVJDSEFOREUsIEEKLUwnQVBUSVRVREUgQSBVTkUgVVRJTElTQVRJT04gUEFSVElDVUxJRVJFIE9VIEEgTCdBQlNFTkNFIERFCi1DT05UUkVGQUMsT04uCi0tLT4KLQotPCEtLQotVGhpcyBpcyB0aGUgWE1MIERURCBmb3IgdGhlIEoyRUUgMS4zIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IuICBBbGwgSjJFRSAxLjMgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9ycwotbXVzdCBpbmNsdWRlIGEgRE9DVFlQRSBvZiB0aGUgZm9sbG93aW5nIGZvcm06Ci0KLSAgPCFET0NUWVBFIGFwcGxpY2F0aW9uIFBVQkxJQwotCSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiAxLjMvL0VOIgotCSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzMuZHRkIj4KLQotLS0+Ci0KLTwhLS0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi1lbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gUENEQVRBLCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCi0gIGluIHRoZSBkYXRhIG1heSBiZSBpZ25vcmVkLgotCi0tIEluIGVsZW1lbnRzIHdob3NlIHZhbHVlIGlzIGFuICJlbnVtZXJhdGVkIHR5cGUiLCB0aGUgdmFsdWUgaXMKLSAgY2FzZSBzZW5zaXRpdmUuCi0KLS0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUgc2FtZQotICBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3Qgc3RhcnRpbmcgd2l0aCAiLyIpCi0gIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4KLSAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5Ci0gIG5hbWVzIGluIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlCi0gIG5hbWVzIGFyZSBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgc2VydmxldCBBUEkuCi0tLT4KLQotCi08IS0tCi1UaGUgYXBwbGljYXRpb24gZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgSjJFRSBhcHBsaWNhdGlvbgotZGVwbG95bWVudCBkZXNjcmlwdG9yLgotLS0+Ci08IUVMRU1FTlQgYXBwbGljYXRpb24gKGljb24/LCBkaXNwbGF5LW5hbWUsIGRlc2NyaXB0aW9uPywgbW9kdWxlKywKLQkJc2VjdXJpdHktcm9sZSopPgotCi08IS0tCi1UaGUgYWx0LWRkIGVsZW1lbnQgc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0byB0aGUgcG9zdC1hc3NlbWJseQotdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgZm9yIGEgcGFydGljdWxhciBKMkVFIG1vZHVsZS4KLVRoZSBVUkkgbXVzdCBzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWZpbGUgcmVsYXRpdmUgdG8gdGhlIGFwcGxpY2F0aW9uJ3Mgcm9vdCBkaXJlY3RvcnkuIElmIGFsdC1kZCBpcyBub3QKLXNwZWNpZmllZCwgdGhlIGRlcGxveWVyIG11c3QgcmVhZCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZyb20gdGhlCi1kZWZhdWx0IGxvY2F0aW9uIGFuZCBmaWxlIG5hbWUgcmVxdWlyZWQgYnkgdGhlIHJlc3BlY3RpdmUgY29tcG9uZW50Ci1zcGVjaWZpY2F0aW9uLgotCi1Vc2VkIGluOiBtb2R1bGUKLS0tPgotPCFFTEVNRU5UIGFsdC1kZCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBjb25uZWN0b3IgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIHJlc291cmNlIGFkYXB0ZXIgYXJjaGl2ZQotZmlsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLQotVXNlZCBpbjogbW9kdWxlCi0tLT4KLTwhRUxFTUVOVCBjb25uZWN0b3IgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgY29udGV4dC1yb290IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjb250ZXh0IHJvb3Qgb2YgYSB3ZWIKLWFwcGxpY2F0aW9uLgotCi1Vc2VkIGluOiB3ZWIKLS0tPgotPCFFTEVNRU5UIGNvbnRleHQtcm9vdCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudAotZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0Ci10aGUgYXBwbGljYXRpb24gZWFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YKLXRoZSBhcHBsaWNhdGlvbiBlYXIgZmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMKLXVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGVhciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24KLXdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgZGVzY3JpcHRpb24uCi0KLVVzZWQgaW46IGFwcGxpY2F0aW9uLCBzZWN1cml0eS1yb2xlCi0tLT4KLTwhRUxFTUVOVCBkZXNjcmlwdGlvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQotZGlzcGxheWVkIGJ5IHRvb2xzLiAgVGhlIGRpc3BsYXkgbmFtZSBuZWVkIG5vdCBiZSB1bmlxdWUuCi0KLVVzZWQgaW46IGFwcGxpY2F0aW9uCi0KLUV4YW1wbGU6Ci0KLTxkaXNwbGF5LW5hbWU+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYW4gZWpiLWphciwgcmVsYXRpdmUgdG8gdGhlIHRvcAotbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0KLVVzZWQgaW46IG1vZHVsZQotLS0+Ci08IUVMRU1FTlQgZWpiICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGljb24gZWxlbWVudCBjb250YWlucyBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnRzIHRoYXQKLXNwZWNpZnkgdGhlIGZpbGUgbmFtZXMgZm9yIHNtYWxsIGFuZCBhIGxhcmdlIEdJRiBvciBKUEVHIGljb24gaW1hZ2VzCi11c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYSBHVUkgdG9vbC4KLQotVXNlZCBpbjogYXBwbGljYXRpb24KLS0tPgotPCFFTEVNRU5UIGljb24gKHNtYWxsLWljb24/LCBsYXJnZS1pY29uPyk+Ci0KLTwhLS0KLVRoZSBqYXZhIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBqYXZhIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUsCi1yZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi1Vc2VkIGluOiBtb2R1bGUKLS0tPgotPCFFTEVNRU5UIGphdmEgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotY29udGFpbmluZyBhIGxhcmdlICgzMiB4IDMyKSBpY29uIGltYWdlLiBUaGUgZmlsZQotbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBhcHBsaWNhdGlvbidzCi1lYXIgZmlsZS4KLQotVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLVRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi1Vc2VkIGluOiBpY29uCi0KLUV4YW1wbGU6Ci0KLTxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLS0tPgotPCFFTEVNRU5UIGxhcmdlLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbW9kdWxlIGVsZW1lbnQgcmVwcmVzZW50cyBhIHNpbmdsZSBKMkVFIG1vZHVsZSBhbmQgY29udGFpbnMgYQotY29ubmVjdG9yLCBlamIsIGphdmEsIG9yIHdlYiBlbGVtZW50LCB3aGljaCBpbmRpY2F0ZXMgdGhlIG1vZHVsZSB0eXBlCi1hbmQgY29udGFpbnMgYSBwYXRoIHRvIHRoZSBtb2R1bGUgZmlsZSwgYW5kIGFuIG9wdGlvbmFsIGFsdC1kZCBlbGVtZW50LAotd2hpY2ggc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0byB0aGUgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZQotZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi1UaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgaGF2ZSBvbmUgbW9kdWxlIGVsZW1lbnQgZm9yCi1lYWNoIEoyRUUgbW9kdWxlIGluIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi1Vc2VkIGluOiBhcHBsaWNhdGlvbgotLS0+Ci08IUVMRU1FTlQgbW9kdWxlICgoY29ubmVjdG9yIHwgZWpiIHwgamF2YSB8IHdlYiksIGFsdC1kZD8pPgotCi08IS0tCi1UaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi1UaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0KLVVzZWQgaW46IHNlY3VyaXR5LXJvbGUKLS0tPgotPCFFTEVNRU5UIHJvbGUtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBzZWN1cml0eQotcm9sZS4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlCi1zZWN1cml0eSByb2xlLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZS4KLQotVXNlZCBpbjogYXBwbGljYXRpb24KLQotRXhhbXBsZToKLQotICAgIDxzZWN1cml0eS1yb2xlPgotCTxkZXNjcmlwdGlvbj4KLQkgICAgVGhpcyByb2xlIGluY2x1ZGVzIGFsbCBlbXBsb3llZXMgd2hvIGFyZSBhdXRob3JpemVkCi0JICAgIHRvIGFjY2VzcyB0aGUgZW1wbG95ZWUgc2VydmljZSBhcHBsaWNhdGlvbi4KLQk8L2Rlc2NyaXB0aW9uPgotCTxyb2xlLW5hbWU+ZW1wbG95ZWU8L3JvbGUtbmFtZT4KLSAgICA8L3NlY3VyaXR5LXJvbGU+Ci0tLT4KLTwhRUxFTUVOVCBzZWN1cml0eS1yb2xlIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSk+Ci0KLTwhLS0KLVRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi1jb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi1uYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uJ3MKLWVhciBmaWxlLgotCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGljb24KLQotRXhhbXBsZToKLQotPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotLS0+Ci08IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB3ZWIgZWxlbWVudCBjb250YWlucyB0aGUgd2ViLXVyaSBhbmQgY29udGV4dC1yb290IG9mIGEgd2ViCi1hcHBsaWNhdGlvbiBtb2R1bGUuCi0KLVVzZWQgaW46IG1vZHVsZQotLS0+Ci08IUVMRU1FTlQgd2ViICh3ZWItdXJpLCBjb250ZXh0LXJvb3QpPgotCi08IS0tCi1UaGUgd2ViLXVyaSBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgd2ViIGFwcGxpY2F0aW9uIGZpbGUsCi1yZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi1Vc2VkIGluOiB3ZWIKLS0tPgotPCFFTEVNRU5UIHdlYi11cmkgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgSUQgbWVjaGFuaXNtIGlzIHRvIGFsbG93IHRvb2xzIHRoYXQgcHJvZHVjZSBhZGRpdGlvbmFsIGRlcGxveW1lbnQKLWluZm9ybWF0aW9uIChpLmUuLCBpbmZvcm1hdGlvbiBiZXlvbmQgdGhlIHN0YW5kYXJkIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IgaW5mb3JtYXRpb24pIHRvIHN0b3JlIHRoZSBub24tc3RhbmRhcmQgaW5mb3JtYXRpb24gaW4gYQotc2VwYXJhdGUgZmlsZSwgYW5kIGVhc2lseSByZWZlciBmcm9tIHRoZXNlIHRvb2wtc3BlY2lmaWMgZmlsZXMgdG8gdGhlCi1pbmZvcm1hdGlvbiBpbiB0aGUgc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi1Ub29scyBhcmUgbm90IGFsbG93ZWQgdG8gYWRkIHRoZSBub24tc3RhbmRhcmQgaW5mb3JtYXRpb24gaW50byB0aGUKLXN0YW5kYXJkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLS0tPgotCi08IUFUVExJU1QgYWx0LWRkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGFwcGxpY2F0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbm5lY3RvciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb250ZXh0LXJvb3QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVzY3JpcHRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGlzcGxheS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBpY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGphdmEgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGFyZ2UtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtb2R1bGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgcm9sZS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LXJvbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc21hbGwtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWIgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgd2ViLXVyaSBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fMV80LnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fMV80LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1OGNmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzFfNC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjEuNCI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpYXBwbGljYXRpb25fMV80LnhzZHMJMS4xMyAwMi8xMS8wMwotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi0gICAgICBSb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi0gICAgICByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBWwotCi0JVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIGFwcGxpY2F0aW9uIDEuNCBkZXBsb3ltZW50Ci0JZGVzY3JpcHRvci4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZAotCSJNRVRBLUlORi9hcHBsaWNhdGlvbi54bWwiIGluIHRoZSBhcHBsaWNhdGlvbidzIGVhciBmaWxlLgotCUFsbCBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUKLQl0aGUgYXBwbGljYXRpb24gc2NoZW1hIGJ5IHVzaW5nIHRoZSBKMkVFIG5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotCWFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8YXBwbGljYXRpb24geG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQkJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIgotCSAgICAgIHZlcnNpb249IjEuNCI+Ci0JICAgICAgLi4uCi0JICAgIDwvYXBwbGljYXRpb24+Ci0KLQlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLQl0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi0JbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImFwcGxpY2F0aW9uIiB0eXBlPSJqMmVlOmFwcGxpY2F0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIEoyRUUKLQlhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImNvbnRleHQtcm9vdC11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBjb250ZXh0LXJvb3QgZWxlbWVudCBjb250ZW50IG11c3QgYmUgdW5pcXVlCi0JICBpbiB0aGUgZWFyLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1vZHVsZS9qMmVlOndlYiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpjb250ZXh0LXJvb3QiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJzZWN1cml0eS1yb2xlLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHNlY3VyaXR5LXJvbGUtbmFtZSBlbGVtZW50IGNvbnRlbnQKLQkgIG11c3QgYmUgdW5pcXVlIGluIHRoZSBlYXIuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6c2VjdXJpdHktcm9sZSIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyb2xlLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgPC94c2Q6ZWxlbWVudD4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwbGljYXRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXBwbGljYXRpb25UeXBlIGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUKLQlhcHBsaWNhdGlvbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtb2R1bGUiCi0JCSAgIHR5cGU9ImoyZWU6bW9kdWxlVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgaGF2ZSBvbmUKLQkgICAgbW9kdWxlIGVsZW1lbnQgZm9yIGVhY2ggSjJFRSBtb2R1bGUgaW4gdGhlCi0JICAgIGFwcGxpY2F0aW9uIHBhY2thZ2UuIEEgbW9kdWxlIGVsZW1lbnQgaXMgZGVmaW5lZAotCSAgICBieSBtb2R1bGVUeXBlIGRlZmluaXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZSIKLQkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0JCSAgIGZpeGVkPSIxLjQiCi0JCSAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjQuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtb2R1bGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbW9kdWxlVHlwZSBkZWZpbmVzIGEgc2luZ2xlIEoyRUUgbW9kdWxlIGFuZCBjb250YWlucyBhCi0JY29ubmVjdG9yLCBlamIsIGphdmEsIG9yIHdlYiBlbGVtZW50LCB3aGljaCBpbmRpY2F0ZXMgdGhlCi0JbW9kdWxlIHR5cGUgYW5kIGNvbnRhaW5zIGEgcGF0aCB0byB0aGUgbW9kdWxlIGZpbGUsIGFuZCBhbgotCW9wdGlvbmFsIGFsdC1kZCBlbGVtZW50LCB3aGljaCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvCi0JdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3RvciIKLQkJICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGNvbm5lY3RvciBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEKLQkgICAgICByZXNvdXJjZSBhZGFwdGVyIGFyY2hpdmUgZmlsZSwgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImVqYiIKLQkJICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYiBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGFuIGVqYi1qYXIsCi0JICAgICAgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24KLQkgICAgICBwYWNrYWdlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImphdmEiCi0JCSAgICAgdHlwZT0iajJlZTpwYXRoVHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBqYXZhIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBqYXZhCi0JICAgICAgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcAotCSAgICAgIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IndlYiIKLQkJICAgICB0eXBlPSJqMmVlOndlYlR5cGUiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbHQtZGQiCi0JCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBhbHQtZGQgZWxlbWVudCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvIHRoZQotCSAgICBwb3N0LWFzc2VtYmx5IHZlcnNpb24gb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCSAgICBmaWxlIGZvciBhIHBhcnRpY3VsYXIgSjJFRSBtb2R1bGUuICBUaGUgVVJJIG11c3QKLQkgICAgc3BlY2lmeSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgZGVwbG95bWVudAotCSAgICBkZXNjcmlwdG9yIGZpbGUgcmVsYXRpdmUgdG8gdGhlIGFwcGxpY2F0aW9uJ3Mgcm9vdAotCSAgICBkaXJlY3RvcnkuIElmIGFsdC1kZCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVwbG95ZXIKLQkgICAgbXVzdCByZWFkIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZnJvbSB0aGUgZGVmYXVsdAotCSAgICBsb2NhdGlvbiBhbmQgZmlsZSBuYW1lIHJlcXVpcmVkIGJ5IHRoZSByZXNwZWN0aXZlCi0JICAgIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3ZWJUeXBlIGRlZmluZXMgdGhlIHdlYi11cmkgYW5kIGNvbnRleHQtcm9vdCBvZgotCWEgd2ViIGFwcGxpY2F0aW9uIG1vZHVsZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLXVyaSIKLQkJICAgdHlwZT0iajJlZTpwYXRoVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3ZWItdXJpIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSB3ZWIKLQkgICAgYXBwbGljYXRpb24gZmlsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUKLQkgICAgYXBwbGljYXRpb24gcGFja2FnZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250ZXh0LXJvb3QiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgY29udGV4dC1yb290IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjb250ZXh0IHJvb3QKLQkgICAgb2YgYSB3ZWIgYXBwbGljYXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzUueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl81LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwOTY2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotCSAgICB2ZXJzaW9uPSI1Ij4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIylhcHBsaWNhdGlvbl81LnhzZHMJMS4xNyAwOC8wNS8wNQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICAgICAgVS5TLkEKLSAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVsKLQotCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBhcHBsaWNhdGlvbiA1IGRlcGxveW1lbnQKLQlkZXNjcmlwdG9yLiAgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkCi0JIk1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCIgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgZWFyIGZpbGUuCi0JQWxsIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZQotCXRoZSBhcHBsaWNhdGlvbiBzY2hlbWEgYnkgdXNpbmcgdGhlIEphdmEgRUUgbmFtZXNwYWNlOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0KLQlhbmQgaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotCXVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLQkgICAgPGFwcGxpY2F0aW9uIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotCQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb25fNS54c2QiCi0JICAgICAgdmVyc2lvbj0iNSI+Ci0JICAgICAgLi4uCi0JICAgIDwvYXBwbGljYXRpb24+Ci0KLQlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLQl0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKYXZhIEVFCi0JbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbl81LnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzUueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImFwcGxpY2F0aW9uIiB0eXBlPSJqYXZhZWU6YXBwbGljYXRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXBwbGljYXRpb24gZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgSmF2YSBFRQotCWFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0iY29udGV4dC1yb290LXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGNvbnRleHQtcm9vdCBlbGVtZW50IGNvbnRlbnQgbXVzdCBiZSB1bmlxdWUKLQkgIGluIHRoZSBlYXIuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTptb2R1bGUvamF2YWVlOndlYiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmNvbnRleHQtcm9vdCIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlY3VyaXR5LXJvbGUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgc2VjdXJpdHktcm9sZS1uYW1lIGVsZW1lbnQgY29udGVudAotCSAgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIGVhci4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnNlY3VyaXR5LXJvbGUiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpyb2xlLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgPC94c2Q6ZWxlbWVudD4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwbGljYXRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXBwbGljYXRpb25UeXBlIGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUKLQlhcHBsaWNhdGlvbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1vZHVsZSIKLQkJICAgdHlwZT0iamF2YWVlOm1vZHVsZVR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGhhdmUgb25lCi0JICAgIG1vZHVsZSBlbGVtZW50IGZvciBlYWNoIEphdmEgRUUgbW9kdWxlIGluIHRoZQotCSAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLiBBIG1vZHVsZSBlbGVtZW50IGlzIGRlZmluZWQKLQkgICAgYnkgbW9kdWxlVHlwZSBkZWZpbml0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUiCi0JCSAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1yb2xlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpYnJhcnktZGlyZWN0b3J5IgotCQkgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGxpYnJhcnktZGlyZWN0b3J5IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBwYXRobmFtZQotCSAgICBvZiBhIGRpcmVjdG9yeSB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UsIHJlbGF0aXZlCi0JICAgIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuICBBbGwgZmlsZXMKLQkgICAgbmFtZWQgIiouamFyIiBpbiB0aGlzIGRpcmVjdG9yeSBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlCi0JICAgIGluIHRoZSBjbGFzcyBwYXRoIG9mIGFsbCBjb21wb25lbnRzIGluY2x1ZGVkIGluIHRoaXMKLQkgICAgYXBwbGljYXRpb24gcGFja2FnZS4gIElmIHRoaXMgZWxlbWVudCBpc24ndCBzcGVjaWZpZWQsCi0JICAgIHRoZSBkaXJlY3RvcnkgbmFtZWQgImxpYiIgaXMgc2VhcmNoZWQuICBBbiBlbXB0eSBlbGVtZW50Ci0JICAgIG1heSBiZSB1c2VkIHRvIGRpc2FibGUgc2VhcmNoaW5nLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXdleS12ZXJzaW9uVHlwZSIKLQkJICAgZml4ZWQ9IjUiCi0JCSAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyA1LgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibW9kdWxlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1vZHVsZVR5cGUgZGVmaW5lcyBhIHNpbmdsZSBKYXZhIEVFIG1vZHVsZSBhbmQgY29udGFpbnMgYQotCWNvbm5lY3RvciwgZWpiLCBqYXZhLCBvciB3ZWIgZWxlbWVudCwgd2hpY2ggaW5kaWNhdGVzIHRoZQotCW1vZHVsZSB0eXBlIGFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZSBmaWxlLCBhbmQgYW4KLQlvcHRpb25hbCBhbHQtZGQgZWxlbWVudCwgd2hpY2ggc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0bwotCXRoZSBwb3N0LWFzc2VtYmx5IHZlcnNpb24gb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0b3IiCi0JCSAgICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGNvbm5lY3RvciBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEKLQkgICAgICByZXNvdXJjZSBhZGFwdGVyIGFyY2hpdmUgZmlsZSwgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImVqYiIKLQkJICAgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYW4gZWpiLWphciwKLQkgICAgICByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbgotCSAgICAgIHBhY2thZ2UuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iamF2YSIKLQkJICAgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgamF2YSBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgamF2YQotCSAgICAgIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUsIHJlbGF0aXZlIHRvIHRoZSB0b3AKLQkgICAgICBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWIiCi0JCSAgICAgdHlwZT0iamF2YWVlOndlYlR5cGUiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbHQtZGQiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGFsdC1kZCBlbGVtZW50IHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlCi0JICAgIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JICAgIGZpbGUgZm9yIGEgcGFydGljdWxhciBKYXZhIEVFIG1vZHVsZS4gIFRoZSBVUkkgbXVzdAotCSAgICBzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBkZXBsb3ltZW50Ci0JICAgIGRlc2NyaXB0b3IgZmlsZSByZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24ncyByb290Ci0JICAgIGRpcmVjdG9yeS4gSWYgYWx0LWRkIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZXBsb3llcgotCSAgICBtdXN0IHJlYWQgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmcm9tIHRoZSBkZWZhdWx0Ci0JICAgIGxvY2F0aW9uIGFuZCBmaWxlIG5hbWUgcmVxdWlyZWQgYnkgdGhlIHJlc3BlY3RpdmUKLQkgICAgY29tcG9uZW50IHNwZWNpZmljYXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2ViVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdlYlR5cGUgZGVmaW5lcyB0aGUgd2ViLXVyaSBhbmQgY29udGV4dC1yb290IG9mCi0JYSB3ZWIgYXBwbGljYXRpb24gbW9kdWxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItdXJpIgotCQkgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd2ViLXVyaSBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgd2ViCi0JICAgIGFwcGxpY2F0aW9uIGZpbGUsIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlCi0JICAgIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGV4dC1yb290IgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLQotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgY29udGV4dC1yb290IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjb250ZXh0IHJvb3QKLQkgICAgb2YgYSB3ZWIgYXBwbGljYXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzYueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl82LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxMTFjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzYueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICAgICAgICAgdmVyc2lvbj0iNiI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0gICAgICAKLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICAgCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24KLSAgICAgIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZQotICAgICAgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICAgdGhlIExpY2Vuc2UuIFlvdSBjYW4gb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sIG9yCi0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0gICAgICBMaWNlbnNlLgotICAgICAgCi0gICAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlcgotICAgICAgTm90aWNlIGluIGVhY2ggZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0Ci0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICAgICAgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcwotICAgICAgcHJvdmlkZWQgYnkgU3VuIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UgZmlsZQotICAgICAgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZwotICAgICAgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10KLSAgICAgIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICAgIlBvcnRpb25zIENvcHlyaWdodGVkIFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotICAgICAgCi0gICAgICBDb250cmlidXRvcihzKToKLSAgICAgIAotICAgICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZQotICAgICAgQ0RETCBvciBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZwotICAgICAgIltDb250cmlidXRvcl0gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTCBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91Ci0gICAgICBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYSByZWNpcGllbnQgaGFzIHRoZQotICAgICAgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlCi0gICAgICBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvIGl0cwotICAgICAgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyCi0gICAgICBjb2RlIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUKLSAgICAgIG9wdGlvbiBhcHBsaWVzIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoCi0gICAgICBvcHRpb24gYnkgdGhlIGNvcHlyaWdodCBob2xkZXIuCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVtbCi0gICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgYXBwbGljYXRpb24gNiBkZXBsb3ltZW50Ci0gICAgICBkZXNjcmlwdG9yLiAgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkCi0gICAgICAiTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sIiBpbiB0aGUgYXBwbGljYXRpb24ncyBlYXIgZmlsZS4KLSAgICAgIEFsbCBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUKLSAgICAgIHRoZSBhcHBsaWNhdGlvbiBzY2hlbWEgYnkgdXNpbmcgdGhlIEphdmEgRUUgbmFtZXNwYWNlOgotICAgICAgCi0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLSAgICAgIAotICAgICAgYW5kIGluZGljYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLSAgICAgIHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0gICAgICAKLSAgICAgIDxhcHBsaWNhdGlvbiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIAotICAgICAgCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbl82LnhzZCIKLSAgICAgIHZlcnNpb249IjYiPgotICAgICAgLi4uCi0gICAgICA8L2FwcGxpY2F0aW9uPgotICAgICAgCi0gICAgICBUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLSAgICAgIHRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIEphdmEgRUUKLSAgICAgIG5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0gICAgICAKLSAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbl82LnhzZAotICAgICAgCi0gICAgICBdXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLSAgICAgIAotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICAgICAgc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICAgICAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICAgICAgc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAgICAgIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gICAgICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgICAgIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV82LnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24iCi0gICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YXBwbGljYXRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIEphdmEgRUUKLSAgICAgICAgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJjb250ZXh0LXJvb3QtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBjb250ZXh0LXJvb3QgZWxlbWVudCBjb250ZW50IG11c3QgYmUgdW5pcXVlCi0gICAgICAgICAgaW4gdGhlIGVhci4gCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOm1vZHVsZS9qYXZhZWU6d2ViIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6Y29udGV4dC1yb290Ii8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlY3VyaXR5LXJvbGUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBzZWN1cml0eS1yb2xlLW5hbWUgZWxlbWVudCBjb250ZW50Ci0gICAgICAgICAgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIGVhci4gIAotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpzZWN1cml0eS1yb2xlIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6cm9sZS1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICA8L3hzZDplbGVtZW50PgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFwcGxpY2F0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhcHBsaWNhdGlvblR5cGUgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIHRoZQotICAgICAgICBhcHBsaWNhdGlvbi4gCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24tbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdGlhbGl6ZS1pbi1vcmRlciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgSWYgaW5pdGlhbGl6ZS1pbi1vcmRlciBpcyB0cnVlLCBtb2R1bGVzIG11c3QgYmUgaW5pdGlhbGl6ZWQKLSAgICAgICAgICAgIGluIHRoZSBvcmRlciB0aGV5J3JlIGxpc3RlZCBpbiB0aGlzIGRlcGxveW1lbnQgZGVzY3JpcHRvciwKLSAgICAgICAgICAgIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlcywgd2hpY2ggY2FuCi0gICAgICAgICAgICBiZSBpbml0aWFsaXplZCBpbiBhbnkgb3JkZXIuCi0gICAgICAgICAgICBJZiBpbml0aWFsaXplLWluLW9yZGVyIGlzIG5vdCBzZXQgb3Igc2V0IHRvIGZhbHNlLCB0aGUgb3JkZXIKLSAgICAgICAgICAgIG9mIGluaXRpYWxpemF0aW9uIGlzIHVuc3BlY2lmaWVkIGFuZCBtYXkgYmUgcHJvZHVjdC1kZXBlbmRlbnQuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtb2R1bGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm1vZHVsZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgaGF2ZSBvbmUKLSAgICAgICAgICAgIG1vZHVsZSBlbGVtZW50IGZvciBlYWNoIEphdmEgRUUgbW9kdWxlIGluIHRoZQotICAgICAgICAgICAgYXBwbGljYXRpb24gcGFja2FnZS4gQSBtb2R1bGUgZWxlbWVudCBpcyBkZWZpbmVkIAotICAgICAgICAgICAgYnkgbW9kdWxlVHlwZSBkZWZpbml0aW9uLiAKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LXJvbGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpYnJhcnktZGlyZWN0b3J5IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGxpYnJhcnktZGlyZWN0b3J5IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBwYXRobmFtZQotICAgICAgICAgICAgb2YgYSBkaXJlY3Rvcnkgd2l0aGluIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLCByZWxhdGl2ZQotICAgICAgICAgICAgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4gIEFsbCBmaWxlcwotICAgICAgICAgICAgbmFtZWQgIiouamFyIiBpbiB0aGlzIGRpcmVjdG9yeSBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlCi0gICAgICAgICAgICBpbiB0aGUgY2xhc3MgcGF0aCBvZiBhbGwgY29tcG9uZW50cyBpbmNsdWRlZCBpbiB0aGlzCi0gICAgICAgICAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLiAgSWYgdGhpcyBlbGVtZW50IGlzbid0IHNwZWNpZmllZCwKLSAgICAgICAgICAgIHRoZSBkaXJlY3RvcnkgbmFtZWQgImxpYiIgaXMgc2VhcmNoZWQuICBBbiBlbXB0eSBlbGVtZW50Ci0gICAgICAgICAgICBtYXkgYmUgdXNlZCB0byBkaXNhYmxlIHNlYXJjaGluZy4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZW52LWVudHJ5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbG9jYWwtcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItbG9jYWwtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6c2VydmljZS1yZWZHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLXJlZiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cmVzb3VyY2UtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLWNvbnRleHQtcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1yZWYiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBlcnNpc3RlbmNlLXVuaXQtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhLXNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGF0YS1zb3VyY2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRld2V5LXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIGZpeGVkPSI2IgotICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDYuCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibW9kdWxlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtb2R1bGVUeXBlIGRlZmluZXMgYSBzaW5nbGUgSmF2YSBFRSBtb2R1bGUgYW5kIGNvbnRhaW5zIGEKLSAgICAgICAgY29ubmVjdG9yLCBlamIsIGphdmEsIG9yIHdlYiBlbGVtZW50LCB3aGljaCBpbmRpY2F0ZXMgdGhlCi0gICAgICAgIG1vZHVsZSB0eXBlIGFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZSBmaWxlLCBhbmQgYW4KLSAgICAgICAgb3B0aW9uYWwgYWx0LWRkIGVsZW1lbnQsIHdoaWNoIHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8KLSAgICAgICAgdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0b3IiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgY29ubmVjdG9yIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYQotICAgICAgICAgICAgICByZXNvdXJjZSBhZGFwdGVyIGFyY2hpdmUgZmlsZSwgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgICAgIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgZWpiIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYW4gZWpiLWphciwKLSAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24KLSAgICAgICAgICAgICAgcGFja2FnZS4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqYXZhIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIGphdmEgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIGphdmEKLSAgICAgICAgICAgICAgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcAotICAgICAgICAgICAgICBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6d2ViVHlwZSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFsdC1kZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGFsdC1kZCBlbGVtZW50IHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlCi0gICAgICAgICAgICBwb3N0LWFzc2VtYmx5IHZlcnNpb24gb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgICAgICAgICAgZmlsZSBmb3IgYSBwYXJ0aWN1bGFyIEphdmEgRUUgbW9kdWxlLiAgVGhlIFVSSSBtdXN0Ci0gICAgICAgICAgICBzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBkZXBsb3ltZW50Ci0gICAgICAgICAgICBkZXNjcmlwdG9yIGZpbGUgcmVsYXRpdmUgdG8gdGhlIGFwcGxpY2F0aW9uJ3Mgcm9vdAotICAgICAgICAgICAgZGlyZWN0b3J5LiBJZiBhbHQtZGQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlcGxveWVyCi0gICAgICAgICAgICBtdXN0IHJlYWQgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmcm9tIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICBsb2NhdGlvbiBhbmQgZmlsZSBuYW1lIHJlcXVpcmVkIGJ5IHRoZSByZXNwZWN0aXZlCi0gICAgICAgICAgICBjb21wb25lbnQgc3BlY2lmaWNhdGlvbi4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHdlYlR5cGUgZGVmaW5lcyB0aGUgd2ViLXVyaSBhbmQgY29udGV4dC1yb290IG9mCi0gICAgICAgIGEgd2ViIGFwcGxpY2F0aW9uIG1vZHVsZS4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItdXJpIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSB3ZWItdXJpIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSB3ZWIKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uIGZpbGUsIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlCi0gICAgICAgICAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGV4dC1yb290IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgY29udGV4dC1yb290IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjb250ZXh0IHJvb3QKLSAgICAgICAgICAgIG9mIGEgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2Nvbm5lY3Rvcl8xXzAuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9jb25uZWN0b3JfMV8wLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiM2I1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2Nvbm5lY3Rvcl8xXzAuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsNTU3ICswLDAgQEAKLTwhLS0KLUNvcHlyaWdodCAyMDAwLTIwMDEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiA5MDEgU2FuIEFudG9uaW8gUm9hZCwKLVBhbG8gQWx0bywgQ0EgIDk0MzAzLCBVLlMuQS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgcHJvZHVjdCBvciBkb2N1bWVudCBpcyBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGFuZCBkaXN0cmlidXRlZAotdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgaXRzIHVzZSwgY29weWluZywgZGlzdHJpYnV0aW9uLCBhbmQKLWRlY29tcGlsYXRpb24uICBObyBwYXJ0IG9mIHRoaXMgcHJvZHVjdCBvciBkb2N1bWVudGF0aW9uIG1heSBiZQotcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KLW9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZCBwYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMgY29weXJpZ2h0ZWQgYW5kCi1saWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBMb2dvLCBTb2xhcmlzLCBKYXZhLCBKYXZhU2VydmVyIFBhZ2VzLCBKYXZhCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsIEpEQkMsIEpESywgSmF2YU1haWwgYW5kIEVudGVycHJpc2UgSmF2YUJlYW5zLAotYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYyBpbiB0aGUgVS5TLgotYW5kIG90aGVyIGNvdW50cmllcy4KLQotQWxsIFNQQVJDIHRyYWRlbWFya3MgYXJlIHVzZWQgdW5kZXIgbGljZW5zZSBhbmQgYXJlIHRyYWRlbWFya3MKLW9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTUEFSQyBJbnRlcm5hdGlvbmFsLCBJbmMuCi1pbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLiBQcm9kdWN0cyBiZWFyaW5nIFNQQVJDCi10cmFkZW1hcmtzIGFyZSBiYXNlZCB1cG9uIGFuIGFyY2hpdGVjdHVyZSBkZXZlbG9wZWQgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotCi1Qb3N0U2NyaXB0IGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcywgSW5jLgotCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMgU3ViamVjdCB0bwotU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTEwgRVhQUkVTUyBPUiBJTVBMSUVECi1DT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkKLUlNUExJRUQgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UgT1IgTk9OLUlORlJJTkdFTUVOVCwgQVJFIERJU0NMQUlNRUQsIEVYQ0VQVAotVE8gVEhFIEVYVEVOVCBUSEFUIFNVQ0ggRElTQ0xBSU1FUlMgQVJFIEhFTEQgVE8gQkUgTEVHQUxMWQotSU5WQUxJRC4KLQotX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi1Db3B5cmlnaHQgMjAwMC0yMDAxIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sCi05MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSAgOTQzMDMsIEV0YXRzLVVuaXMuCi1Ub3VzIGRyb2l0cyByZSdzZXJ2ZSdzLgotCi0KLUNlIHByb2R1aXQgb3UgZG9jdW1lbnQgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IGV0IGRpc3RyaWJ1ZScgYXZlYwotZGVzIGxpY2VuY2VzIHF1aSBlbiByZXN0cmVpZ25lbnQgbCd1dGlsaXNhdGlvbiwgbGEgY29waWUsIGxhIGRpc3RyaWJ1dGlvbiwKLWV0IGxhIGRlJ2NvbXBpbGF0aW9uLiAgQXVjdW5lIHBhcnRpZSBkZSBjZSBwcm9kdWl0IG91IGRlIHNhIGRvY3VtZW50YXRpb24KLWFzc29jaWUnZSBuZSBwZXV0IGVedHJlIHJlcHJvZHVpdGUgc291cyBhdWN1bmUgZm9ybWUsIHBhciBxdWVscXVlIG1veWVuCi1xdWUgY2Ugc29pdCwgc2FucyBsJ2F1dG9yaXNhdGlvbiBwcmUnYWxhYmxlIGV0IGUnY3JpdGUgZGUgU3VuIGV0IGRlIHNlcwotYmFpbGxldXJzIGRlIGxpY2VuY2UsIHMnaWwgeSBlbiBhLgotCi1MZSBsb2dpY2llbCBkZSd0ZW51IHBhciBkZXMgdGllcnMsIGV0IHF1aSBjb21wcmVuZCBsYSB0ZWNobm9sb2dpZQotcmVsYXRpdmUgYXV4IHBvbGljZXMgZGUgY2FyYWN0ZWByZXMsIGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodAotZXQgbGljZW5jaWUnIHBhciBkZXMgZm91cm5pc3NldXJzIGRlIFN1bi4KLQotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCBsZSBsb2dvIFN1biwgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YQotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCBKREJDLCBKREssIEphdmFNYWlsLCBldCBFbnRlcnByaXNlIEphdmFCZWFucywKLXNvbnQgZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTdW4KLU1pY3Jvc3lzdGVtcywgSW5jLiBhdXggRXRhdHMtVW5pcyBldCBkYW5zIGQnYXV0cmVzIHBheXMuCi0KLVRvdXRlcyBsZXMgbWFycXVlcyBTUEFSQyBzb250IHV0aWxpc2UnZXMgc291cyBsaWNlbmNlIGV0IHNvbnQKLWRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU1BBUkMKLUludGVybmF0aW9uYWwsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgIGRhbnMKLWQnYXV0cmVzIHBheXMuIExlcyBwcm9kdWl0cyBwb3J0YW50IGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQKLWJhc2UncyBzdXIgdW5lIGFyY2hpdGVjdHVyZSBkZSd2ZWxvcHBlJ2UgcGFyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLQotUG9zdGNyaXB0IGVzdCB1bmUgbWFycXVlIGVucmVnaXN0cmUnZSBkJ0Fkb2JlIFN5c3RlbXMgSW5jLgotCi1MQSBET0NVTUVOVEFUSU9OIEVTVCBGT1VSTklFICJFTiBMJ0VUQVQiIEVUIFRPVVRFUyBBVVRSRVMgQ09ORElUSU9OUywKLURFQ0xBUkFUSU9OUyBFVCBHQVJBTlRJRVMgRVhQUkVTU0VTIE9VIFRBQ0lURVMgU09OVCBGT1JNRUxMRU1FTlQgRVhDTFVFUywKLURBTlMgTEEgTUVTVVJFIEFVVE9SSVNFRSBQQVIgTEEgTE9JIEFQUExJQ0FCTEUsIFkgQ09NUFJJUyBOT1RBTU1FTlQKLVRPVVRFIEdBUkFOVElFIElNUExJQ0lURSBSRUxBVElWRSBBIExBIFFVQUxJVEUgTUFSQ0hBTkRFLCBBIEwnQVBUSVRVREUKLUEgVU5FIFVUSUxJU0FUSU9OIFBBUlRJQ1VMSUVSRSBPVSBBIEwnQUJTRU5DRSBERSBDT05UUkVGQUNPTi4KLS0tPgotCi08IS0tCi1UaGlzIGlzIHRoZSBYTUwgRFREIGZvciB0aGUgQ29ubmVjdG9yIDEuMCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi1BbGwgQ29ubmVjdG9yIDEuMCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5jbHVkZSBhIERPQ1RZUEUKLW9mIHRoZSBmb2xsb3dpbmcgZm9ybToKLQotICA8IURPQ1RZUEUgY29ubmVjdG9yIFBVQkxJQwotCSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgQ29ubmVjdG9yIDEuMC8vRU4iCi0JImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2Nvbm5lY3Rvcl8xXzAuZHRkIj4KLQotLS0+Ci0KLTwhLS0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi1lbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gUENEQVRBLCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCi0gIGluIHRoZSBkYXRhIG1heSBiZSBpZ25vcmVkLgotCi0tIEluIGVsZW1lbnRzIHdob3NlIHZhbHVlIGlzIGFuICJlbnVtZXJhdGVkIHR5cGUiLCB0aGUgdmFsdWUgaXMKLSAgY2FzZSBzZW5zaXRpdmUuCi0KLS0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUgc2FtZQotICBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3Qgc3RhcnRpbmcgd2l0aCAiLyIpCi0gIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4KLSAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5Ci0gIG5hbWVzIGluIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlCi0gIG5hbWVzIGFyZSBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgc2VydmxldCBBUEkuCi0tLT4KLQotCi08IS0tCi1UaGUgY29ubmVjdG9yIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi1mb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgZWxlbWVudCBpbmNsdWRlcyBnZW5lcmFsIGluZm9ybWF0aW9uIC0gdmVuZG9yCi1uYW1lLCB2ZXJzaW9uLCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gc3VwcG9ydGVkLCBpY29uIC0gIGFib3V0IHRoZQotcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIEl0IGFsc28gaW5jbHVkZXMgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlCi1pbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoCi10aGUgZWxlbWVudCByZXNvdXJjZWFkYXB0ZXIuCi0tLT4KLTwhRUxFTUVOVCBjb25uZWN0b3IgKGRpc3BsYXktbmFtZT8sIGRlc2NyaXB0aW9uPywgaWNvbj8sIHZlbmRvci1uYW1lLAotc3BlYy12ZXJzaW9uLCBlaXMtdHlwZSwgdmVyc2lvbiwgbGljZW5zZT8sIHJlc291cmNlYWRhcHRlcik+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBzcGVjaWZpZXMgYW4gYXV0aGVudGljYXRpb24gbWVjaGFuaXNtCi1zdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuIE5vdGUgdGhhdCB0aGlzIHN1cHBvcnQgaXMgZm9yCi10aGUgcmVzb3VyY2UgYWRhcHRlciBhbmQgbm90IGZvciB0aGUgdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuIFRoZQotb3B0aW9uYWwgZGVzY3JpcHRpb24gc3BlY2lmaWVzIGFueSByZXNvdXJjZSBhZGFwdGVyIHNwZWNpZmljIHJlcXVpcmVtZW50Ci1mb3IgdGhlIHN1cHBvcnQgb2Ygc2VjdXJpdHkgY29udHJhY3QgYW5kIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbS4KLQotTm90ZSB0aGF0IEJhc2ljUGFzc3dvcmQgbWVjaGFuaXNtIHR5cGUgc2hvdWxkIHN1cHBvcnQgdGhlCi1qYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsIGludGVyZmFjZS4KLVRoZSBLZXJidjUgbWVjaGFuaXNtIHR5cGUgc2hvdWxkIHN1cHBvcnQgdGhlCi1qYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuR2VuZXJpY0NyZWRlbnRpYWwgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiByZXNvdXJjZWFkYXB0ZXIKLS0tPgotPCFFTEVNRU5UIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSAoCi1kZXNjcmlwdGlvbj8sIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlLCBjcmVkZW50aWFsLWludGVyZmFjZSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlIHNwZWNpZmllcyB0eXBlIG9mIGFuIGF1dGhlbnRpY2F0aW9uCi1tZWNoYW5pc20uCi0KLVRoZSBleGFtcGxlIHZhbHVlcyBhcmU6Ci0gICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+QmFzaWNQYXNzd29yZAotICAgICAgICAgICAgICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+S2VyYnY1Ci0gICAgICAgICAgICAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLQotQW55IGFkZGl0aW9uYWwgc2VjdXJpdHkgbWVjaGFuaXNtcyBhcmUgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhlCi1Db25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCi0KLVVzZWQgaW46IGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbQotLS0+Ci08IUVMRU1FTlQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCBjb25maWctcHJvcGVydHkgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhIHNpbmdsZQotY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBmb3IgYSBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UuCi0KLUVhY2ggTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlIGNyZWF0ZXMgY29ubmVjdGlvbnMgdG8gYQotc3BlY2lmaWMgRUlTIGluc3RhbmNlIGJhc2VkIG9uIHRoZSBwcm9wZXJ0aWVzIGNvbmZpZ3VyZWQgb24gdGhlCi1NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UuIFRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBhcmUKLXNwZWNpZmllZCBvbmx5IG9uY2UgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgZXZlbiB0aG91Z2ggYQotcmVzb3VyY2UgYWRhcHRlciBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgbXVsdGlwbGUgTWFuYWdlZENvbm5uZWN0aW9uLQotRmFjdG9yeSBpbnN0YW5jZXMgKHRoYXQgY3JlYXRlIGNvbm5lY3Rpb25zIHRvIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YKLXRoZSBzYW1lIEVJUykuCi0KLVRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgbmFtZSwgdHlwZQotYW5kIGFuIG9wdGlvbmFsIHZhbHVlIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5LiBJZiB0aGUgcmVzb3VyY2UKLWFkYXB0ZXIgcHJvdmlkZXIgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbHVlIHRoYW4gdGhlIGRlcGxveWVyIGlzCi1yZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIGEgdmFsaWQgdmFsdWUgZm9yIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KLQotQW55IGJvdW5kcyBvciB3ZWxsLWRlZmluZWQgdmFsdWVzIG9mIHByb3BlcnRpZXMgc2hvdWxkIGJlIGRlc2NyaWJlZAotaW4gdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQuCi0KLVVzZWQgaW46IHJlc291cmNlYWRhcHRlcgotLS0+Ci08IUVMRU1FTlQgY29uZmlnLXByb3BlcnR5IChkZXNjcmlwdGlvbj8sIGNvbmZpZy1wcm9wZXJ0eS1uYW1lLAotY29uZmlnLXByb3BlcnR5LXR5cGUsIGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT8pPgotCi08IS0tCi1UaGUgZWxlbWVudCBjb25maWctcHJvcGVydHktbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiBhIGNvbmZpZ3VyYXRpb24KLXByb3BlcnR5LgotCi1UaGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBkZWZpbmVzIGEgc2V0IG9mIHdlbGwtZGVmaW5lZCBwcm9wZXJ0aWVzCi1hbGwgb2YgdHlwZSBqYXZhLmxhbmcuU3RyaW5nLiBUaGVzZSBhcmUgYXMgZm9sbG93czoKLSAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPlNlcnZlck5hbWU8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+UG9ydE51bWJlcjwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgIDxjb25maWctcHJvcGVydHktbmFtZT5Vc2VyTmFtZTwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgIDxjb25maWctcHJvcGVydHktbmFtZT5QYXNzd29yZDwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgIDxjb25maWctcHJvcGVydHktbmFtZT5Db25uZWN0aW9uVVJMPC9jb25maWctcHJvcGVydHktbmFtZT4KLQotQSByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIGNhbiBleHRlbmQgdGhpcyBwcm9wZXJ0eSBzZXQgdG8gaW5jbHVkZQotcHJvcGVydGllcyBzcGVjaWZpYyB0byB0aGUgcmVzb3VyY2UgYWRhcHRlciBhbmQgaXRzIHVuZGVybHlpbmcgRUlTLgotCi1Vc2VkIGluOiBjb25maWctcHJvcGVydHkKLQotRXhhbXBsZTogPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPlNlcnZlck5hbWU8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotLS0+Ci08IUVMRU1FTlQgY29uZmlnLXByb3BlcnR5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCBjb25maWctcHJvcGVydHktdHlwZSBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIEphdmEKLXR5cGUgb2YgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGFzIHJlcXVpcmVkIGJ5IE1hbmFnZWRDb25uZWN0aW9uLQotRmFjdG9yeSBpbnN0YW5jZS4KLQotVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBjb25maWctcHJvcGVydHktdHlwZToKLSAgIGphdmEubGFuZy5Cb29sZWFuLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuSW50ZWdlciwKLSAgIGphdmEubGFuZy5Eb3VibGUsIGphdmEubGFuZy5CeXRlLCBqYXZhLmxhbmcuU2hvcnQsCi0gICBqYXZhLmxhbmcuTG9uZywgamF2YS5sYW5nLkZsb2F0LCBqYXZhLmxhbmcuQ2hhcmFjdGVyCi0KLVVzZWQgaW46IGNvbmZpZy1wcm9wZXJ0eQotCi1FeGFtcGxlOiA8Y29uZmlnLXByb3BlcnR5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0tLT4KLTwhRUxFTUVOVCBjb25maWctcHJvcGVydHktdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGNvbmZpZy1wcm9wZXJ0eS12YWx1ZSBjb250YWlucyB0aGUgdmFsdWUgb2YgYSBjb25maWd1cmF0aW9uCi1lbnRyeS4KLQotVXNlZCBpbjogY29uZmlnLXByb3BlcnR5Ci0KLUV4YW1wbGU6IDxjb25maWctcHJvcGVydHktdmFsdWU+V29tYmF0U2VydmVyPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0tLT4KLTwhRUxFTUVOVCBjb25maWctcHJvcGVydHktdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCBjb25uZWN0aW9uLWltcGwtY2xhc3Mgc3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQKLW5hbWUgb2YgdGhlIENvbm5lY3Rpb24gY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIKLXNwZWNpZmljIENvbm5lY3Rpb24gaW50ZXJmYWNlLgotCi1Vc2VkIGluOiByZXNvdXJjZWFkYXB0ZXIKLQotRXhhbXBsZTogPGNvbm5lY3Rpb24taW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25JbXBsCi0gICAgICAgICA8L2Nvbm5lY3Rpb24taW1wbC1jbGFzcz4KLS0tPgotPCFFTEVNRU5UIGNvbm5lY3Rpb24taW1wbC1jbGFzcyAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGNvbm5lY3Rpb24taW50ZXJmYWNlIHNwZWNpZmllcyB0aGUgZnVsbHktcXVhbGlmaWVkCi1uYW1lIG9mIHRoZSBDb25uZWN0aW9uIGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlCi1hZGFwdGVyLgotCi1Vc2VkIGluOiByZXNvdXJjZWFkYXB0ZXIKLQotRXhhbXBsZTogPGNvbm5lY3Rpb24taW50ZXJmYWNlPmphdmF4LnJlc291cmNlLmNjaS5Db25uZWN0aW9uCi0gICAgICAgICA8L2Nvbm5lY3Rpb24taW50ZXJmYWNlPgotLS0+Ci08IUVMRU1FTlQgY29ubmVjdGlvbi1pbnRlcmZhY2UgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCBjb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHktcXVhbGlmaWVkCi1uYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeSBjbGFzcyB0aGF0IGltcGxlbWVudHMgcmVzb3VyY2UgYWRhcHRlcgotc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiByZXNvdXJjZWFkYXB0ZXIKLQotRXhhbXBsZTogPGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Y29tLndvbWJhdC5Db25uZWN0aW9uRmFjdG9yeUltcGwKLSAgICAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz4KLS0tPgotPCFFTEVNRU5UIGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3MgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCBjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2Ugc3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQKLW5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlCi1hZGFwdGVyLgotCi1Vc2VkIGluOiByZXNvdXJjZWFkYXB0ZXIKLQotRXhhbXBsZTogPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5jb20ud29tYmF0LkNvbm5lY3Rpb25GYWN0b3J5Ci0gICAgICAgICA8L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4KLU9SCi08Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPmphdmF4LnJlc291cmNlLmNjaS5Db25uZWN0aW9uRmFjdG9yeQotICAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Ci0tLT4KLTwhRUxFTUVOVCBjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2UgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCBjcmVkZW50aWFsLWludGVyZmFjZSBzcGVjaWZpZXMgdGhlIGludGVyZmFjZSB0aGF0IHRoZQotcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBmb3IgdGhlIHJlcHJlc2VudGF0aW9uCi1vZiB0aGUgY3JlZGVudGlhbHMuIFRoaXMgZWxlbWVudCBzaG91bGQgYmUgdXNlZCBieSBhcHBsaWNhdGlvbiBzZXJ2ZXIKLXRvIGZpbmQgb3V0IHRoZSBDcmVkZW50aWFsIGludGVyZmFjZSBpdCBzaG91bGQgdXNlIGFzIHBhcnQgb2YgdGhlCi1zZWN1cml0eSBjb250cmFjdC4KLQotVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6Ci0gICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbAotICAgICAgICA8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbAotICAgICAgICA8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotCi1Vc2VkIGluOiBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20KLS0tPgotPCFFTEVNRU5UIGNyZWRlbnRpYWwtaW50ZXJmYWNlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50Ci1lbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQKLXRoZSByZXNvdXJjZSBhZGFwdGVyIHJhciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mCi10aGUgcmVzb3VyY2UgYWRhcHRlciByYXIgZmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMKLXVzZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIgcmFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbgotd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4KLQotVXNlZCBpbjogYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLCBjb25maWctcHJvcGVydHksIGNvbm5lY3RvciwgbGljZW5zZSwKLXNlY3VyaXR5LXBlcm1pc3Npb24KLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi1kaXNwbGF5ZWQgYnkgdG9vbHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KLQotVXNlZCBpbjogY29ubmVjdG9yCi0KLUV4YW1wbGU6Ci0KLTxkaXNwbGF5LW5hbWU+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCBlaXMtdHlwZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiB0aGUKLUVJUy4gRm9yIGV4YW1wbGUsIHRoZSB0eXBlIG9mIGFuIEVJUyBjYW4gYmUgcHJvZHVjdCBuYW1lIG9mIEVJUwotaW5kZXBlbmRlbnQgb2YgYW55IHZlcnNpb24gaW5mby4KLQotVGhpcyBoZWxwcyBpbiBpZGVudGlmeWluZyBFSVMgaW5zdGFuY2VzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aAotdGhpcyByZXNvdXJjZSBhZGFwdGVyLgotCi1Vc2VkIGluOiBjb25uZWN0b3IKLS0tPgotPCFFTEVNRU5UIGVpcy10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGljb24gZWxlbWVudCBjb250YWlucyBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnRzIHRoYXQKLXNwZWNpZnkgdGhlIGZpbGUgbmFtZXMgZm9yIHNtYWxsIGFuZCBhIGxhcmdlIEdJRiBvciBKUEVHIGljb24gaW1hZ2VzCi11c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYSBHVUkgdG9vbC4KLQotVXNlZCBpbjogY29ubmVjdG9yCi0tLT4KLTwhRUxFTUVOVCBpY29uIChzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8pPgotCi08IS0tCi1UaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotY29udGFpbmluZyBhIGxhcmdlICgzMiB4IDMyKSBpY29uIGltYWdlLiBUaGUgZmlsZQotbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSByZXNvdXJjZSBhZGFwdGVyJ3MKLXJhciBmaWxlLgotCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGljb24KLQotRXhhbXBsZToKLQotPGxhcmdlLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMzJ4MzIuanBnPC9sYXJnZS1pY29uPgotLS0+Ci08IUVMRU1FTlQgbGFyZ2UtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGxpY2Vuc2Ugc3BlY2lmaWVzIGxpY2Vuc2luZyByZXF1aXJlbWVudHMgZm9yIHRoZSByZXNvdXJjZQotYWRhcHRlciBtb2R1bGUuIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhIGxpY2Vuc2UgaXMgcmVxdWlyZWQKLXRvIGRlcGxveSBhbmQgdXNlIHRoaXMgcmVzb3VyY2UgYWRhcHRlciwgYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi1vZiB0aGUgbGljZW5zaW5nIHRlcm1zIChleGFtcGxlczogZHVyYXRpb24gb2YgbGljZW5zZSwgbnVtYmVyIG9mCi1jb25uZWN0aW9uIHJlc3RyaWN0aW9ucykuCi0KLVVzZWQgaW46IGNvbm5lY3RvcgotLS0+Ci08IUVMRU1FTlQgbGljZW5zZSAoZGVzY3JpcHRpb24/LCBsaWNlbnNlLXJlcXVpcmVkKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgbGljZW5zZS1yZXF1aXJlZCBzcGVjaWZpZXMgd2hldGhlciBhIGxpY2Vuc2UgaXMgcmVxdWlyZWQKLXRvIGRlcGxveSBhbmQgdXNlIHRoZSByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YKLXRoZSBmb2xsb3dpbmc6Ci0KLQk8bGljZW5zZS1yZXF1aXJlZD50cnVlPC9saWNlbnNlLXJlcXVpcmVkPgotCTxsaWNlbnNlLXJlcXVpcmVkPmZhbHNlPC9saWNlbnNlLXJlcXVpcmVkPgotCi1Vc2VkIGluOiBsaWNlbnNlCi0tLT4KLTwhRUxFTUVOVCBsaWNlbnNlLXJlcXVpcmVkICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkCi1uYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgamF2YXgucmVzb3VyY2Uuc3BpLk1hbmFnZWQtCi1Db25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuIFRoaXMgSmF2YSBjbGFzcyBpcyBwcm92aWRlZCBhcyBwYXJ0IG9mCi1yZXNvdXJjZSBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQKLWNvbnRyYWN0cy4KLQotVXNlZCBpbjogcmVzb3VyY2VhZGFwdGVyCi0KLUV4YW1wbGU6Ci0gIDxtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+Y29tLndvbWJhdC5NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlJbXBsCi0gIDwvbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotLS0+Ci08IUVMRU1FTlQgbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0IHNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZQotYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyByZS1hdXRoZW50aWNhdGlvbiBvZiBleGlzdGluZyBNYW5hZ2VkLQotQ29ubmVjdGlvbiBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMgZm9yIHRoZSByZXNvdXJjZQotYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBhbmQgbm90IGZvciB0aGUgdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuCi0KLVRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgICAgICA8cmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0PnRydWU8L3JlYXV0aGVudGljYXRpb24tc3VwcG9ydD4KLSAgICAgICAgPHJlYXV0aGVudGljYXRpb24tc3VwcG9ydD5mYWxzZTwvcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0PgotVXNlZCBpbjogcmVzb3VyY2VhZGFwdGVyCi0tLT4KLTwhRUxFTUVOVCByZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCByZXNvdXJjZWFkYXB0ZXIgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNvdXJjZQotYWRhcHRlci4gVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGZ1bGx5LXF1YWxpZmllZCBuYW1lcyBvZgotY2xhc3MvaW50ZXJmYWNlcyByZXF1aXJlZCBhcyBwYXJ0IG9mIHRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlCi1zcGVjaWZpZWQgY29udHJhY3RzLCBsZXZlbCBvZiB0cmFuc2FjdGlvbiBzdXBwb3J0IHByb3ZpZGVkLAotY29uZmlndXJhYmxlIHByb3BlcnRpZXMgZm9yIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZXMsCi1vbmUgb3IgbW9yZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHN1cHBvcnRlZCBhbmQgYWRkaXRpb25hbAotcmVxdWlyZWQgc2VjdXJpdHkgcGVybWlzc2lvbnMuCi0KLUlmIHRoZXJlIGlzIG5vIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBzcGVjaWZpZWQgYXMgcGFydCBvZgotcmVzb3VyY2UgYWRhcHRlciBlbGVtZW50IHRoZW4gdGhlIHJlc291cmNlIGFkYXB0ZXIgZG9lcyBub3QKLXN1cHBvcnQgYW55IHN0YW5kYXJkIHNlY3VyaXR5IGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgYXMgcGFydAotb2Ygc2VjdXJpdHkgY29udHJhY3QuIFRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgaWdub3JlcyB0aGUgc2VjdXJpdHkKLXBhcnQgb2YgdGhlIHN5c3RlbSBjb250cmFjdHMgaW4gdGhpcyBjYXNlLgotCi1Vc2VkIGluOiBjb25uZWN0b3IKLS0tPgotPCFFTEVNRU5UIHJlc291cmNlYWRhcHRlciAoCi1tYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3MsIGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZSwKLWNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3MsIGNvbm5lY3Rpb24taW50ZXJmYWNlLAotY29ubmVjdGlvbi1pbXBsLWNsYXNzLCB0cmFuc2FjdGlvbi1zdXBwb3J0LCBjb25maWctcHJvcGVydHkqLAotYXV0aGVudGljYXRpb24tbWVjaGFuaXNtKiwgcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0LCBzZWN1cml0eS1wZXJtaXNzaW9uKgotKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgc2VjdXJpdHkgcGVybWlzc2lvbiBzcGVjaWZpZXMgYSBzZWN1cml0eSBwZXJtaXNzaW9uIHRoYXQKLWlzIHJlcXVpcmVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyIGNvZGUuCi0KLVRoZSBzZWN1cml0eSBwZXJtaXNzaW9uIGxpc3RlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFyZSBvbmVzCi10aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSB0aG9zZSByZXF1aXJlZCBieSB0aGUgZGVmYXVsdCBwZXJtaXNzaW9uIHNldAotYXMgc3BlY2lmaWVkIGluIHRoZSBjb25uZWN0b3Igc3BlY2lmaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi1jYW4gbWVudGlvbiBzcGVjaWZpYyByZWFzb24gdGhhdCByZXNvdXJjZSBhZGFwdGVyIHJlcXVpcmVzIGEgZ2l2ZW4KLXNlY3VyaXR5IHBlcm1pc3Npb24uCi0KLVVzZWQgaW46IHJlc291cmNlYWRhcHRlcgotLS0+Ci08IUVMRU1FTlQgc2VjdXJpdHktcGVybWlzc2lvbiAoZGVzY3JpcHRpb24/LCBzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWMpPgotCi08IS0tCi1UaGUgZWxlbWVudCBwZXJtaXNzaW9uLXNwZWMgc3BlY2lmaWVzIGEgc2VjdXJpdHkgcGVybWlzc2lvbiBiYXNlZAotb24gdGhlIFNlY3VyaXR5IHBvbGljeSBmaWxlIHN5bnRheC4gUmVmZXIgdG8gdGhlIGZvbGxvd2luZyBVUkwgZm9yCi1TdW4ncyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcGVybWlzc2lvbiBzcGVjaWZpY2F0aW9uOgotCi1odHRwOgotCi1Vc2VkIGluOiBzZWN1cml0eS1wZXJtaXNzaW9uCi0tLT4KLTwhRUxFTUVOVCBzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWMgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZQotbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSByZXNvdXJjZSBhZGFwdGVyJ3MKLXJhciBmaWxlLgotCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGljb24KLQotRXhhbXBsZToKLQotPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotLS0+Ci08IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IHNwZWMtdmVyc2lvbiBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlIGNvbm5lY3RvcgotYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyByZXNvdXJjZQotYWRhcHRlci4gVGhpcyBpbmZvcm1hdGlvbiBlbmFibGVzIGRlcGxveWVyIHRvIGNvbmZpZ3VyZSB0aGUgcmVzb3VyY2UKLWFkYXB0ZXIgdG8gc3VwcG9ydCBkZXBsb3ltZW50IGFuZCBydW50aW1lIHJlcXVpcmVtZW50cyBvZiB0aGUKLWNvcnJlc3BvbmRpbmcgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLgotCi1Vc2VkIGluOiBjb25uZWN0b3IKLQotRXhhbXBsZToKLSAgPHNwZWMtdmVyc2lvbj4xLjA8L3NwZWMtdmVyc2lvbj4KLS0tPgotPCFFTEVNRU5UIHNwZWMtdmVyc2lvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB0cmFuc2FjdGlvbi1zdXBwb3J0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsZXZlbCBvZiB0cmFuc2FjdGlvbgotc3VwcG9ydCBwcm92aWRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLVRoZSB2YWx1ZSBvZiB0cmFuc2FjdGlvbi1zdXBwb3J0IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gPHRyYW5zYWN0aW9uLXN1cHBvcnQ+Tm9UcmFuc2FjdGlvbjwvdHJhbnNhY3Rpb24tc3VwcG9ydD4KLSA8dHJhbnNhY3Rpb24tc3VwcG9ydD5Mb2NhbFRyYW5zYWN0aW9uPC90cmFuc2FjdGlvbi1zdXBwb3J0PgotIDx0cmFuc2FjdGlvbi1zdXBwb3J0PlhBVHJhbnNhY3Rpb248L3RyYW5zYWN0aW9uLXN1cHBvcnQ+Ci0KLVVzZWQgaW46IHJlc291cmNlYWRhcHRlcgotLS0+Ci08IUVMRU1FTlQgdHJhbnNhY3Rpb24tc3VwcG9ydCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IHZlbmRvci1uYW1lIHNwZWNpZmllcyB0aGUgbmFtZSBvZiByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyCi12ZW5kb3IuCi0KLVVzZWQgaW46IGNvbm5lY3RvcgotCi1FeGFtcGxlOgotICA8dmVuZG9yLW5hbWU+V29tYmF0IENvcnAuPC92ZW5kb3ItbmFtZT4KLS0tPgotPCFFTEVNRU5UIHZlbmRvci1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgdmVyc2lvbiBzcGVjaWZpZXMgYSBzdHJpbmctYmFzZWQgdmVyc2lvbiBvZiB0aGUKLXJlc291cmNlIGFkYXB0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlci4KLQotVXNlZCBpbjogY29ubmVjdG9yCi0KLUV4YW1wbGU6Ci0gIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLS0tPgotPCFFTEVNRU5UIHZlcnNpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgSUQgbWVjaGFuaXNtIGlzIHRvIGFsbG93IHRvb2xzIHRoYXQgcHJvZHVjZSBhZGRpdGlvbmFsIGRlcGxveW1lbnQKLWluZm9ybWF0aW9uIChpLmUuLCBpbmZvcm1hdGlvbiBiZXlvbmQgdGhlIHN0YW5kYXJkIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IgaW5mb3JtYXRpb24pIHRvIHN0b3JlIHRoZSBub24tc3RhbmRhcmQgaW5mb3JtYXRpb24gaW4gYQotc2VwYXJhdGUgZmlsZSwgYW5kIGVhc2lseSByZWZlciBmcm9tIHRoZXNlIHRvb2wtc3BlY2lmaWMgZmlsZXMgdG8gdGhlCi1pbmZvcm1hdGlvbiBpbiB0aGUgc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi1Ub29scyBhcmUgbm90IGFsbG93ZWQgdG8gYWRkIHRoZSBub24tc3RhbmRhcmQgaW5mb3JtYXRpb24gaW50byB0aGUKLXN0YW5kYXJkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLS0tPgotCi08IUFUVExJU1QgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbmZpZy1wcm9wZXJ0eSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb25maWctcHJvcGVydHktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb25maWctcHJvcGVydHktdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb25maWctcHJvcGVydHktdmFsdWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29ubmVjdGlvbi1pbXBsLWNsYXNzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbm5lY3Rpb24taW50ZXJmYWNlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbm5lY3RvciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjcmVkZW50aWFsLWludGVyZmFjZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWlzLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsYXJnZS1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxpY2Vuc2UgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGljZW5zZS1yZXF1aXJlZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlYWRhcHRlciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZWN1cml0eS1wZXJtaXNzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzbWFsbC1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNwZWMtdmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0cmFuc2FjdGlvbi1zdXBwb3J0IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZlbmRvci1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZlcnNpb24gaWQgSUQgI0lNUExJRUQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2Nvbm5lY3Rvcl8xXzUueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9jb25uZWN0b3JfMV81LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkMTkxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2Nvbm5lY3Rvcl8xXzUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMS41Ij4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIyljb25uZWN0b3JfMV81LnhzZHMJMS4yNyAwNi8xNy8wMwotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi0gICAgICBSb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi0gICAgICByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBWwotCi0JVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIENvbm5lY3RvciAxLjUgZGVwbG95bWVudAotCWRlc2NyaXB0b3IuICBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgbmFtZWQKLQkiTUVUQS1JTkYvcmEueG1sIiBpbiB0aGUgY29ubmVjdG9yJ3MgcmFyIGZpbGUuICBBbGwgQ29ubmVjdG9yCi0JZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlIHRoZSBjb25uZWN0b3IgcmVzb3VyY2UKLQlhZGFwdGVyIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0KLQlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8Y29ubmVjdG9yIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0JCSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkIgotCSAgICAgIHZlcnNpb249IjEuNSI+Ci0JICAgICAgLi4uCi0JICAgIDwvY29ubmVjdG9yPgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0JdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSjJFRQotCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdG9yIiB0eXBlPSJqMmVlOmNvbm5lY3RvclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjb25uZWN0b3IgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXBsb3ltZW50Ci0JZGVzY3JpcHRvciBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgZWxlbWVudCBpbmNsdWRlcwotCWdlbmVyYWwgaW5mb3JtYXRpb24gLSB2ZW5kb3IgbmFtZSwgcmVzb3VyY2UgYWRhcHRlciB2ZXJzaW9uLAotCWljb24gLSBhYm91dCB0aGUgcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIEl0IGFsc28gaW5jbHVkZXMKLQlpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc291cmNlCi0JYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBlbGVtZW50Ci0JcmVzb3VyY2VhZGFwdGVyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPC94c2Q6ZWxlbWVudD4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWN0aXZhdGlvbnNwZWNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYWN0aXZhdGlvbnNwZWNUeXBlIHNwZWNpZmllcyBhbiBhY3RpdmF0aW9uCi0Jc3BlY2lmaWNhdGlvbi4gIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseSBxdWFsaWZpZWQKLQlKYXZhIGNsYXNzIG5hbWUgb2YgYW4gYWN0aXZhdGlvbiBzcGVjaWZpY2F0aW9uIGFuZCBhIHNldCBvZgotCXJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgbmFtZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbnNwZWMtY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbGVtZW50IGFjdGl2YXRpb25zcGVjLWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkKLQkgICAgICBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBhY3RpdmF0aW9uCi0JICAgICAgc3BlY2lmaWNhdGlvbiBjbGFzcy4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUKLQkgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuQWN0aXZhdGlvblNwZWMgaW50ZXJmYWNlLiBUaGUKLQkgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzIGlzIHJlcXVpcmVkIHRvIGJlIGEKLQkgICAgICBKYXZhQmVhbi4KLQotCSAgICAgIEV4YW1wbGU6Ci0JCSAgPGFjdGl2YXRpb25zcGVjLWNsYXNzPmNvbS53b21iYXQuQWN0aXZhdGlvblNwZWNJbXBsCi0JCSAgPC9hY3RpdmF0aW9uc3BlYy1jbGFzcz4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1aXJlZC1jb25maWctcHJvcGVydHkiCi0JCSAgIHR5cGU9ImoyZWU6cmVxdWlyZWQtY29uZmlnLXByb3BlcnR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFkbWlub2JqZWN0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGFkbWlub2JqZWN0VHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYW4KLQlhZG1pbmlzdGVyZWQgb2JqZWN0LiAgQWRtaW5pc3RlcmVkIG9iamVjdHMgYXJlIHNwZWNpZmljIHRvIGEKLQltZXNzYWdpbmcgc3R5bGUgb3IgbWVzc2FnZSBwcm92aWRlci4gIFRoaXMgY29udGFpbnMKLQlpbmZvcm1hdGlvbiBvbiB0aGUgSmF2YSB0eXBlIG9mIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkKLQlhbiBhZG1pbmlzdGVyZWQgb2JqZWN0LCBpdHMgSmF2YSBjbGFzcyBuYW1lIGFuZCBpdHMKLQljb25maWd1cmF0aW9uIHByb3BlcnRpZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRtaW5vYmplY3QtaW50ZXJmYWNlIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgZWxlbWVudCBhZG1pbm9iamVjdC1pbnRlcmZhY2Ugc3BlY2lmaWVzIHRoZQotCSAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIHR5cGUgb2YgdGhlCi0JICAgICAgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGFuIGFkbWluaXN0ZXJlZCBvYmplY3QuCi0KLQkgICAgICBFeGFtcGxlOgotCQk8YWRtaW5vYmplY3QtaW50ZXJmYWNlPmphdmF4Lmptcy5EZXN0aW5hdGlvbgotCQk8L2FkbWlub2JqZWN0LWludGVyZmFjZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkbWlub2JqZWN0LWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgZWxlbWVudCBhZG1pbm9iamVjdC1jbGFzcyBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0JICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0LgotCi0JICAgICAgRXhhbXBsZToKLQkJICA8YWRtaW5vYmplY3QtY2xhc3M+Y29tLndvbWJhdC5EZXN0aW5hdGlvbkltcGwKLQkJICA8L2FkbWlub2JqZWN0LWNsYXNzPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5IgotCQkgICB0eXBlPSJqMmVlOmNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdXRoZW50aWNhdGlvbi1tZWNoYW5pc21UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtVHlwZSBzcGVjaWZpZXMgYW4gYXV0aGVudGljYXRpb24KLQltZWNoYW5pc20gc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLiBOb3RlIHRoYXQgdGhpcwotCXN1cHBvcnQgaXMgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyIGFuZCBub3QgZm9yIHRoZQotCXVuZGVybHlpbmcgRUlTIGluc3RhbmNlLiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gc3BlY2lmaWVzCi0JYW55IHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgcmVxdWlyZW1lbnQgZm9yIHRoZSBzdXBwb3J0IG9mCi0Jc2VjdXJpdHkgY29udHJhY3QgYW5kIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbS4KLQotCU5vdGUgdGhhdCBCYXNpY1Bhc3N3b3JkIG1lY2hhbmlzbSB0eXBlIHNob3VsZCBzdXBwb3J0IHRoZQotCWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwgaW50ZXJmYWNlLgotCVRoZSBLZXJidjUgbWVjaGFuaXNtIHR5cGUgc2hvdWxkIHN1cHBvcnQgdGhlCi0Jb3JnLmlldGYuamdzcy5HU1NDcmVkZW50aWFsIGludGVyZmFjZSBvciB0aGUgZGVwcmVjYXRlZAotCWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbCBpbnRlcmZhY2UuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbGVtZW50IGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlIHNwZWNpZmllcwotCSAgICAgIHR5cGUgb2YgYW4gYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotCi0JICAgICAgVGhlIGV4YW1wbGUgdmFsdWVzIGFyZToKLQotCSAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5CYXNpY1Bhc3N3b3JkCi0JICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLQotCSAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5LZXJidjUKLQkgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotCi0JICAgICAgQW55IGFkZGl0aW9uYWwgc2VjdXJpdHkgbWVjaGFuaXNtcyBhcmUgb3V0c2lkZSB0aGUKLQkgICAgICBzY29wZSBvZiB0aGUgQ29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3JlZGVudGlhbC1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImoyZWU6Y3JlZGVudGlhbC1pbnRlcmZhY2VUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29uZmlnLXByb3BlcnR5LW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBjb25maWctcHJvcGVydHktbmFtZVR5cGUgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KLQotCSAgVGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgZGVmaW5lcyBhIHNldCBvZiB3ZWxsLWRlZmluZWQKLQkgIHByb3BlcnRpZXMgYWxsIG9mIHR5cGUgamF2YS5sYW5nLlN0cmluZy4gVGhlc2UgYXJlIGFzCi0JICBmb2xsb3dzLgotCi0JICAgICAgIFNlcnZlck5hbWUKLQkgICAgICAgUG9ydE51bWJlcgotCSAgICAgICBVc2VyTmFtZQotCSAgICAgICBQYXNzd29yZAotCSAgICAgICBDb25uZWN0aW9uVVJMCi0KLQkgIEEgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlciBjYW4gZXh0ZW5kIHRoaXMgcHJvcGVydHkgc2V0IHRvCi0JICBpbmNsdWRlIHByb3BlcnRpZXMgc3BlY2lmaWMgdG8gdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIGl0cwotCSAgdW5kZXJseWluZyBFSVMuCi0KLQkgIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlCi0JCSAgU2VydmVyTmFtZQotCQkgIFBvcnROdW1iZXIKLQkJICBVc2VyTmFtZQotCQkgIFBhc3N3b3JkCi0JCSAgQ29ubmVjdGlvblVSTAotCi0JICBFeGFtcGxlOiA8Y29uZmlnLXByb3BlcnR5LW5hbWU+U2VydmVyTmFtZTwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTp4c2RTdHJpbmdUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbmZpZy1wcm9wZXJ0eS10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgY29uZmlnLXByb3BlcnR5LXR5cGVUeXBlIGNvbnRhaW5zIHRoZSBmdWxseQotCSAgcXVhbGlmaWVkIEphdmEgdHlwZSBvZiBhIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0KLQkgIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXM6Ci0JICAgICBqYXZhLmxhbmcuQm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsCi0JICAgICBqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwgamF2YS5sYW5nLlNob3J0LAotCSAgICAgamF2YS5sYW5nLkxvbmcsIGphdmEubGFuZy5GbG9hdCwgamF2YS5sYW5nLkNoYXJhY3RlcgotCi0JICBVc2VkIGluOiBjb25maWctcHJvcGVydHkKLQotCSAgRXhhbXBsZToKLQkgIDxjb25maWctcHJvcGVydHktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jb25maWctcHJvcGVydHktdHlwZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkJvb2xlYW4iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkludGVnZXIiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuRG91YmxlIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkJ5dGUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU2hvcnQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuTG9uZyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5GbG9hdCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5DaGFyYWN0ZXIiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25maWctcHJvcGVydHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY29uZmlnLXByb3BlcnR5VHlwZSBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEgc2luZ2xlCi0JY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB0aGF0IG1heSBiZSB1c2VkIGZvciBwcm92aWRpbmcKLQljb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotCi0JVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBuYW1lLAotCXR5cGUgYW5kIGFuIG9wdGlvbmFsIHZhbHVlIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5LiBJZgotCXRoZSByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIGRvZXMgbm90IHNwZWNpZnkgYSB2YWx1ZSB0aGFuCi0JdGhlIGRlcGxveWVyIGlzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYSB2YWxpZCB2YWx1ZSBmb3IKLQlhIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0KLQlBbnkgYm91bmRzIG9yIHdlbGwtZGVmaW5lZCB2YWx1ZXMgb2YgcHJvcGVydGllcyBzaG91bGQgYmUKLQlkZXNjcmliZWQgaW4gdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmNvbmZpZy1wcm9wZXJ0eS1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eS10eXBlIgotCQkgICB0eXBlPSJqMmVlOmNvbmZpZy1wcm9wZXJ0eS10eXBlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eS12YWx1ZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgZWxlbWVudCBjb25maWctcHJvcGVydHktdmFsdWUgY29udGFpbnMgdGhlIHZhbHVlCi0JICAgICAgb2YgYSBjb25maWd1cmF0aW9uIGVudHJ5LiBOb3RlLCBpdCBpcyBwb3NzaWJsZSBmb3IgYQotCSAgICAgIHJlc291cmNlIGFkYXB0ZXIgZGVwbG95ZXIgdG8gb3ZlcnJpZGUgdGhpcwotCSAgICAgIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZHVyaW5nIGRlcGxveW1lbnQuCi0KLQkgICAgICBFeGFtcGxlOgotCSAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+V29tYmF0U2VydmVyPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdGlvbi1kZWZpbml0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNvbm5lY3Rpb24tZGVmaW5pdGlvblR5cGUgZGVmaW5lcyBhIHNldCBvZiBjb25uZWN0aW9uCi0JaW50ZXJmYWNlcyBhbmQgY2xhc3NlcyBwZXJ0YWluaW5nIHRvIGEgcGFydGljdWxhciBjb25uZWN0aW9uCi0JdHlwZS4gVGhpcyBhbHNvIGluY2x1ZGVzIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIGZvcgotCU1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZXMgdGhhdCBtYXkgYmUgcHJvZHVjZWQgb3V0Ci0Jb2YgdGhpcyBzZXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgZWxlbWVudCBtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3Mgc3BlY2lmaWVzCi0JICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQKLQkgICAgICBpbXBsZW1lbnRzIHRoZQotCSAgICAgIGphdmF4LnJlc291cmNlLnNwaS5NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLgotCSAgICAgIFRoaXMgSmF2YSBjbGFzcyBpcyBwcm92aWRlZCBhcyBwYXJ0IG9mIHJlc291cmNlCi0JICAgICAgYWRhcHRlcidzIGltcGxlbWVudGF0aW9uIG9mIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUKLQkgICAgICBzcGVjaWZpZWQgY29udHJhY3RzLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcwotCSAgICAgIGNsYXNzIGlzIHJlcXVpcmVkIHRvIGJlIGEgSmF2YUJlYW4uCi0KLQkgICAgICBFeGFtcGxlOgotCSAgICAgIDxtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+Ci0JCSAgY29tLndvbWJhdC5NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlJbXBsCi0JICAgICAgPC9tYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5IgotCQkgICB0eXBlPSJqMmVlOmNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbGVtZW50IGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZSBzcGVjaWZpZXMKLQkgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5Ci0JICAgICAgaW50ZXJmYWNlIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLQotCSAgICAgIEV4YW1wbGU6Ci0JICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5jb20ud29tYmF0LkNvbm5lY3Rpb25GYWN0b3J5Ci0JICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Ci0KLQkgICAgICBPUgotCi0JICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbkZhY3RvcnkKLQkgICAgICA8L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbGVtZW50IGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3Mgc3BlY2lmaWVzCi0JICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeQotCSAgICAgIGNsYXNzIHRoYXQgaW1wbGVtZW50cyByZXNvdXJjZSBhZGFwdGVyCi0JICAgICAgc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLgotCi0JICAgICAgRXhhbXBsZToKLQotCSAgICAgIDxjb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPmNvbS53b21iYXQuQ29ubmVjdGlvbkZhY3RvcnlJbXBsCi0JICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24taW50ZXJmYWNlIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgY29ubmVjdGlvbi1pbnRlcmZhY2UgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0JICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gaW50ZXJmYWNlIHN1cHBvcnRlZAotCSAgICAgIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLgotCi0JICAgICAgRXhhbXBsZToKLQotCQkgIDxjb25uZWN0aW9uLWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbgotCQkgIDwvY29ubmVjdGlvbi1pbnRlcmZhY2U+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1pbXBsLWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgY29ubmVjdGlvbi1pbXBsLWNsYXNzVHlwZSBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0JICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gY2xhc3MgdGhhdAotCSAgICAgIGltcGxlbWVudHMgcmVzb3VyY2UgYWRhcHRlciBzcGVjaWZpYyBDb25uZWN0aW9uCi0JICAgICAgaW50ZXJmYWNlLiAgSXQgaXMgdXNlZCBieSB0aGUgY29ubmVjdGlvbi1pbXBsLWNsYXNzCi0JICAgICAgZWxlbWVudHMuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JCSAgPGNvbm5lY3Rpb24taW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25JbXBsCi0JCSAgPC9jb25uZWN0aW9uLWltcGwtY2xhc3M+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdG9yVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNvbm5lY3RvclR5cGUgZGVmaW5lcyBhIHJlc291cmNlIGFkYXB0ZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVuZG9yLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBlbGVtZW50IHZlbmRvci1uYW1lIHNwZWNpZmllcyB0aGUgbmFtZSBvZgotCSAgICByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIHZlbmRvci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlaXMtdHlwZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVsZW1lbnQgZWlzLXR5cGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JICAgIHR5cGUgb2YgdGhlIEVJUy4gRm9yIGV4YW1wbGUsIHRoZSB0eXBlIG9mIGFuIEVJUyBjYW4KLQkgICAgYmUgcHJvZHVjdCBuYW1lIG9mIEVJUyBpbmRlcGVuZGVudCBvZiBhbnkgdmVyc2lvbgotCSAgICBpbmZvLgotCi0JICAgIFRoaXMgaGVscHMgaW4gaWRlbnRpZnlpbmcgRUlTIGluc3RhbmNlcyB0aGF0IGNhbiBiZQotCSAgICB1c2VkIHdpdGggdGhpcyByZXNvdXJjZSBhZGFwdGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlYWRhcHRlci12ZXJzaW9uIgotCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWxlbWVudCByZXNvdXJjZWFkYXB0ZXItdmVyc2lvbiBzcGVjaWZpZXMgYSBzdHJpbmctYmFzZWQgdmVyc2lvbgotCSAgICBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBmcm9tIHRoZSByZXNvdXJjZSBhZGFwdGVyCi0JICAgIHByb3ZpZGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGljZW5zZSIKLQkJICAgdHlwZT0iajJlZTpsaWNlbnNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2VhZGFwdGVyIgotCQkgICB0eXBlPSJqMmVlOnJlc291cmNlYWRhcHRlclR5cGUiLz4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0JCSAgIGZpeGVkPSIxLjUiCi0JCSAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHZlcnNpb24gc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZQotCSAgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIHRoYXQgaXMKLQkgIHN1cHBvcnRlZCBieSB0aGlzIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgaW5mb3JtYXRpb24KLQkgIGVuYWJsZXMgZGVwbG95ZXIgdG8gY29uZmlndXJlIHRoZSByZXNvdXJjZSBhZGFwdGVyIHRvCi0JICBzdXBwb3J0IGRlcGxveW1lbnQgYW5kIHJ1bnRpbWUgcmVxdWlyZW1lbnRzIG9mIHRoZQotCSAgY29ycmVzcG9uZGluZyBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3JlZGVudGlhbC1pbnRlcmZhY2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY3JlZGVudGlhbC1pbnRlcmZhY2VUeXBlIHNwZWNpZmllcyB0aGUKLQlpbnRlcmZhY2UgdGhhdCB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbgotCXN1cHBvcnRzIGZvciB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlCi0JY3JlZGVudGlhbHMuIFRoaXMgZWxlbWVudChzKSB0aGF0IHVzZSB0aGlzIHR5cGUsCi0JaS5lLiBjcmVkZW50aWFsLWludGVyZmFjZSwgIHNob3VsZCBiZSB1c2VkIGJ5Ci0JYXBwbGljYXRpb24gc2VydmVyIHRvIGZpbmQgb3V0IHRoZSBDcmVkZW50aWFsCi0JaW50ZXJmYWNlIGl0IHNob3VsZCB1c2UgYXMgcGFydCBvZiB0aGUgc2VjdXJpdHkKLQljb250cmFjdC4KLQotCVRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOgotCi0JamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbAotCW9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbAotCWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6ZW51bWVyYXRpb24KLQkgICAgIHZhbHVlPSJqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsIi8+Ci0JPHhzZDplbnVtZXJhdGlvbgotCSAgICAgdmFsdWU9Im9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbCIvPgotCTx4c2Q6ZW51bWVyYXRpb24KLQkgICAgIHZhbHVlPSJqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuR2VuZXJpY0NyZWRlbnRpYWwiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBpbmJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uCi0JYWJvdXQgYW4gaW5ib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGNvbnRhaW5zIGluZm9ybWF0aW9uCi0Jc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyCi0JbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgbWVzc2FnZWFkYXB0ZXIgZWxlbWVudC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlYWRhcHRlciIKLQkJICAgdHlwZT0iajJlZTptZXNzYWdlYWRhcHRlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWxpc3RlbmVyLXR5cGUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBtZXNzYWdlbGlzdGVuZXItdHlwZSBlbGVtZW50IGNvbnRlbnQgbXVzdCBiZQotCSAgICAgIHVuaXF1ZSBpbiB0aGUgbWVzc2FnZWFkYXB0ZXIuIFNldmVyYWwgbWVzc2FnZWxpc3RlbmVycwotCSAgICAgIGNhbiBub3QgdXNlIHRoZSBzYW1lIG1lc3NhZ2VsaXN0ZW5lci10eXBlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlbGlzdGVuZXIiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6bWVzc2FnZWxpc3RlbmVyLXR5cGUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxpY2Vuc2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbGljZW5zZVR5cGUgc3BlY2lmaWVzIGxpY2Vuc2luZyByZXF1aXJlbWVudHMgZm9yIHRoZQotCXJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBUaGlzIHR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgYQotCWxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZSBhZGFwdGVyLAotCWFuZCBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgbGljZW5zaW5nIHRlcm1zCi0JKGV4YW1wbGVzOiBkdXJhdGlvbiBvZiBsaWNlbnNlLCBudW1iZXIgb2YgY29ubmVjdGlvbgotCXJlc3RyaWN0aW9ucykuIEl0IGlzIHVzZWQgYnkgdGhlIGxpY2Vuc2UgZWxlbWVudC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaWNlbnNlLXJlcXVpcmVkIgotCQkgICB0eXBlPSJqMmVlOnRydWUtZmFsc2VUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVsZW1lbnQgbGljZW5zZS1yZXF1aXJlZCBzcGVjaWZpZXMgd2hldGhlciBhCi0JICAgIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhlCi0JICAgIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZgotCSAgICB0aGUgZm9sbG93aW5nLCAidHJ1ZSIgb3IgImZhbHNlIi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlYWRhcHRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXNzYWdlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotCW1lc3NhZ2luZyBjYXBhYmlsaXRpZXMgb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMKLQljb250YWlucyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0JcmVzb3VyY2UgYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZQotCW1lc3NhZ2VsaXN0ZW5lciBlbGVtZW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2VsaXN0ZW5lciIKLQkJICAgdHlwZT0iajJlZTptZXNzYWdlbGlzdGVuZXJUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2VsaXN0ZW5lclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXNzYWdlbGlzdGVuZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhCi0Jc3BlY2lmaWMgbWVzc2FnZSBsaXN0ZW5lciBzdXBwb3J0ZWQgYnkgdGhlIG1lc3NhZ2luZwotCXJlc291cmNlIGFkYXB0ZXIuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBKYXZhIHR5cGUKLQlvZiB0aGUgbWVzc2FnZSBsaXN0ZW5lciBpbnRlcmZhY2UgYW5kIGFuIGFjdGl2YXRpb24KLQlzcGVjaWZpY2F0aW9uLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2VsaXN0ZW5lci10eXBlIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgZWxlbWVudCBtZXNzYWdlbGlzdGVuZXItdHlwZSBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0JICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgdHlwZSBvZiBhIG1lc3NhZ2UKLQkgICAgICBsaXN0ZW5lciBpbnRlcmZhY2UuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JCTxtZXNzYWdlbGlzdGVuZXItdHlwZT5qYXZheC5qbXMuTWVzc2FnZUxpc3RlbmVyCi0JCTwvbWVzc2FnZWxpc3RlbmVyLXR5cGU+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uc3BlYyIKLQkJICAgdHlwZT0iajJlZTphY3RpdmF0aW9uc3BlY1R5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgb3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQKLQlhbiBvdXRib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkKLQlxdWFsaWZpZWQgbmFtZXMgb2YgY2xhc3Nlcy9pbnRlcmZhY2VzIHJlcXVpcmVkIGFzIHBhcnQgb2YKLQl0aGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgY29udHJhY3RzIGZvcgotCWNvbm5lY3Rpb24gbWFuYWdlbWVudCwgbGV2ZWwgb2YgdHJhbnNhY3Rpb24gc3VwcG9ydAotCXByb3ZpZGVkLCBvbmUgb3IgbW9yZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHN1cHBvcnRlZAotCWFuZCBhZGRpdGlvbmFsIHJlcXVpcmVkIHNlY3VyaXR5IHBlcm1pc3Npb25zLgotCi0JSWYgdGhlcmUgaXMgbm8gYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllZCBhcyBwYXJ0IG9mCi0JcmVzb3VyY2UgYWRhcHRlciBlbGVtZW50IHRoZW4gdGhlIHJlc291cmNlIGFkYXB0ZXIgZG9lcyBub3QKLQlzdXBwb3J0IGFueSBzdGFuZGFyZCBzZWN1cml0eSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIGFzCi0JcGFydCBvZiBzZWN1cml0eSBjb250cmFjdC4gVGhlIGFwcGxpY2F0aW9uIHNlcnZlciBpZ25vcmVzCi0JdGhlIHNlY3VyaXR5IHBhcnQgb2YgdGhlIHN5c3RlbSBjb250cmFjdHMgaW4gdGhpcyBjYXNlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tZGVmaW5pdGlvbiIKLQkJICAgdHlwZT0iajJlZTpjb25uZWN0aW9uLWRlZmluaXRpb25UeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zYWN0aW9uLXN1cHBvcnQiCi0JCSAgIHR5cGU9ImoyZWU6dHJhbnNhY3Rpb24tc3VwcG9ydFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20iCi0JCSAgIHR5cGU9ImoyZWU6YXV0aGVudGljYXRpb24tbWVjaGFuaXNtVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYXV0aGVudGljYXRpb24tc3VwcG9ydCIKLQkJICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBlbGVtZW50IHJlYXV0aGVudGljYXRpb24tc3VwcG9ydCBzcGVjaWZpZXMKLQkgICAgd2hldGhlciB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cwotCSAgICByZS1hdXRoZW50aWNhdGlvbiBvZiBleGlzdGluZyBNYW5hZ2VkLSBDb25uZWN0aW9uCi0JICAgIGluc3RhbmNlLiBOb3RlIHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBmb3IgdGhlCi0JICAgIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gYW5kIG5vdCBmb3IgdGhlCi0JICAgIHVuZGVybHlpbmcgRUlTIGluc3RhbmNlLiBUaGlzIGVsZW1lbnQgbXVzdCBoYXZlCi0JICAgIGVpdGhlciBhICJ0cnVlIiBvciAiZmFsc2UiIHZhbHVlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVxdWlyZWQtY29uZmlnLXByb3BlcnR5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5VHlwZSBjb250YWlucyBhIGRlY2xhcmF0aW9uCi0JICBvZiBhIHNpbmdsZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IHVzZWQgZm9yIHNwZWNpZnlpbmcgYQotCSAgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBuYW1lLiBJdCBpcyB1c2VkCi0JICBieSByZXF1aXJlZC1jb25maWctcHJvcGVydHkgZWxlbWVudHMuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxyZXF1aXJlZC1jb25maWctcHJvcGVydHk+RGVzdGluYXRpb248L3JlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmNvbmZpZy1wcm9wZXJ0eS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlYWRhcHRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByZXNvdXJjZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLQlyZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkgcXVhbGlmaWVkCi0JcmVzb3VyY2UgYWRhcHRlciBKYXZhIGNsYXNzIG5hbWUsIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcywKLQlpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc291cmNlCi0JYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZQotCW91dGJvdW5kLXJlc291cmNlYWRhcHRlciBhbmQgaW5ib3VuZC1yZXNvdXJjZWFkYXB0ZXIKLQllbGVtZW50cywgYW5kIGFuIG9wdGlvbmFsIHNldCBvZiBhZG1pbmlzdGVyZWQgb2JqZWN0cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZWFkYXB0ZXItY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVsZW1lbnQgcmVzb3VyY2VhZGFwdGVyLWNsYXNzIHNwZWNpZmllcyB0aGUKLQkgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cwotCSAgICB0aGUgamF2YXgucmVzb3VyY2Uuc3BpLlJlc291cmNlQWRhcHRlcgotCSAgICBpbnRlcmZhY2UuIFRoaXMgSmF2YSBjbGFzcyBpcyBwcm92aWRlZCBhcyBwYXJ0IG9mCi0JICAgIHJlc291cmNlIGFkYXB0ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0b3IKLQkgICAgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMuIFRoZSBpbXBsZW1lbnRhdGlvbgotCSAgICBvZiB0aGlzIGNsYXNzIGlzIHJlcXVpcmVkIHRvIGJlIGEgSmF2YUJlYW4uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHkiCi0JCSAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im91dGJvdW5kLXJlc291cmNlYWRhcHRlciIKLQkJICAgdHlwZT0iajJlZTpvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6dW5pcXVlIG5hbWU9ImNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZSBlbGVtZW50IGNvbnRlbnQKLQkgICAgICBtdXN0IGJlIHVuaXF1ZSBpbiB0aGUgb3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyLgotCSAgICAgIE11bHRpcGxlIGNvbm5lY3Rpb24tZGVmaW5pdGlvbnMgY2FuIG5vdCB1c2UgdGhlCi0JICAgICAgc2FtZSBjb25uZWN0aW9uZmFjdG9yeS10eXBlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpjb25uZWN0aW9uLWRlZmluaXRpb24iLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIi8+Ci0JPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmJvdW5kLXJlc291cmNlYWRhcHRlciIKLQkJICAgdHlwZT0iajJlZTppbmJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkbWlub2JqZWN0IgotCQkgICB0eXBlPSJqMmVlOmFkbWlub2JqZWN0VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXBlcm1pc3Npb24iCi0JCSAgIHR5cGU9ImoyZWU6c2VjdXJpdHktcGVybWlzc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1wZXJtaXNzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlY3VyaXR5LXBlcm1pc3Npb25UeXBlIHNwZWNpZmllcyBhIHNlY3VyaXR5Ci0JcGVybWlzc2lvbiB0aGF0IGlzIHJlcXVpcmVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyIGNvZGUuCi0KLQlUaGUgc2VjdXJpdHkgcGVybWlzc2lvbiBsaXN0ZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCWFyZSBvbmVzIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIHJlcXVpcmVkIGJ5IHRoZQotCWRlZmF1bHQgcGVybWlzc2lvbiBzZXQgYXMgc3BlY2lmaWVkIGluIHRoZSBjb25uZWN0b3IKLQlzcGVjaWZpY2F0aW9uLiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gY2FuIG1lbnRpb24gc3BlY2lmaWMKLQlyZWFzb24gdGhhdCByZXNvdXJjZSBhZGFwdGVyIHJlcXVpcmVzIGEgZ2l2ZW4gc2VjdXJpdHkKLQlwZXJtaXNzaW9uLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYyIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVsZW1lbnQgc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjIHNwZWNpZmllcyBhIHNlY3VyaXR5Ci0JICAgIHBlcm1pc3Npb24gYmFzZWQgb24gdGhlIFNlY3VyaXR5IHBvbGljeSBmaWxlCi0JICAgIHN5bnRheC4gUmVmZXIgdG8gdGhlIGZvbGxvd2luZyBVUkwgZm9yIFN1bidzCi0JICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZWN1cml0eSBwZXJtaXNzaW9uCi0JICAgIHNwZWNpZmljYXRpb246Ci0KLQkgICAgaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGsvMS40L2RvY3MvZ3VpZGUvc2VjdXJpdHkvUG9saWN5RmlsZXMuaHRtbCNGaWxlU3ludGF4Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zYWN0aW9uLXN1cHBvcnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdHJhbnNhY3Rpb24tc3VwcG9ydFR5cGUgc3BlY2lmaWVzIHRoZSBsZXZlbCBvZgotCXRyYW5zYWN0aW9uIHN1cHBvcnQgcHJvdmlkZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuIEl0IGlzCi0JdXNlZCBieSB0cmFuc2FjdGlvbi1zdXBwb3J0IGVsZW1lbnRzLgotCi0JVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQkgICAgTm9UcmFuc2FjdGlvbgotCSAgICBMb2NhbFRyYW5zYWN0aW9uCi0JICAgIFhBVHJhbnNhY3Rpb24KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vVHJhbnNhY3Rpb24iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFRyYW5zYWN0aW9uIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWEFUcmFuc2FjdGlvbiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9jb25uZWN0b3JfMV82LnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvY29ubmVjdG9yXzFfNi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZDg3NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9jb25uZWN0b3JfMV82LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgICAgICAgICB2ZXJzaW9uPSIxLjYiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgotICAgICAgCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAgIAotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uCi0gICAgICBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUKLSAgICAgICJMaWNlbnNlIikuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgICAgIHRoZSBMaWNlbnNlLiBZb3UgY2FuIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgICAgIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUEwuaHRtbCBvcgotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotICAgICAgTGljZW5zZS4KLSAgICAgIAotICAgICAgV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIKLSAgICAgIE5vdGljZSBpbiBlYWNoIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdAotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAgICAgIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMKLSAgICAgIHByb3ZpZGVkIGJ5IFN1biBpbiB0aGUgR1BMIFZlcnNpb24gMiBzZWN0aW9uIG9mIHRoZSBMaWNlbnNlIGZpbGUKLSAgICAgIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLiAgSWYgYXBwbGljYWJsZSwgYWRkIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFtdCi0gICAgICByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKLSAgICAgICJQb3J0aW9ucyBDb3B5cmlnaHRlZCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSIKLSAgICAgIAotICAgICAgQ29udHJpYnV0b3Iocyk6Ci0gICAgICAKLSAgICAgIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUKLSAgICAgIENEREwgb3Igb25seSB0aGUgR1BMIFZlcnNpb24gMiwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBhZGRpbmcKLSAgICAgICJbQ29udHJpYnV0b3JdIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcwotICAgICAgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwgVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdQotICAgICAgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEgcmVjaXBpZW50IGhhcyB0aGUKLSAgICAgIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZQotICAgICAgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0byBpdHMKLSAgICAgIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMgotICAgICAgY29kZSBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlCi0gICAgICBvcHRpb24gYXBwbGllcyBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaAotICAgICAgb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyLgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgotICAgICAgCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAgIAotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uCi0gICAgICBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUKLSAgICAgICJMaWNlbnNlIikuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgICAgIHRoZSBMaWNlbnNlLiBZb3UgY2FuIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgICAgIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUEwuaHRtbCBvcgotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotICAgICAgTGljZW5zZS4KLSAgICAgIAotICAgICAgV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIKLSAgICAgIE5vdGljZSBpbiBlYWNoIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdAotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAgICAgIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMKLSAgICAgIHByb3ZpZGVkIGJ5IFN1biBpbiB0aGUgR1BMIFZlcnNpb24gMiBzZWN0aW9uIG9mIHRoZSBMaWNlbnNlIGZpbGUKLSAgICAgIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLiAgSWYgYXBwbGljYWJsZSwgYWRkIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFtdCi0gICAgICByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKLSAgICAgICJQb3J0aW9ucyBDb3B5cmlnaHRlZCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSIKLSAgICAgIAotICAgICAgQ29udHJpYnV0b3Iocyk6Ci0gICAgICAKLSAgICAgIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUKLSAgICAgIENEREwgb3Igb25seSB0aGUgR1BMIFZlcnNpb24gMiwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBhZGRpbmcKLSAgICAgICJbQ29udHJpYnV0b3JdIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcwotICAgICAgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwgVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdQotICAgICAgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEgcmVjaXBpZW50IGhhcyB0aGUKLSAgICAgIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZQotICAgICAgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0byBpdHMKLSAgICAgIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMgotICAgICAgY29kZSBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlCi0gICAgICBvcHRpb24gYXBwbGllcyBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaAotICAgICAgb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyLgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbWwotICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIENvbm5lY3RvciAxLjYgZGVwbG95bWVudAotICAgICAgZGVzY3JpcHRvci4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZAotICAgICAgIk1FVEEtSU5GL3JhLnhtbCIgaW4gdGhlIGNvbm5lY3RvcidzIHJhciBmaWxlLiAgQWxsIENvbm5lY3RvcgotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlIHRoZSBjb25uZWN0b3IgcmVzb3VyY2UKLSAgICAgIGFkYXB0ZXIgc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFIG5hbWVzcGFjZToKLSAgICAgIAotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0gICAgICAKLSAgICAgIGFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLSAgICAgIHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0gICAgICAKLSAgICAgIDxjb25uZWN0b3IgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotICAgICAgCSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvY29ubmVjdG9yXzFfNi54c2QiCi0gICAgICB2ZXJzaW9uPSIxLjYiPgotICAgICAgLi4uCi0gICAgICA8L2Nvbm5lY3Rvcj4KLSAgICAgIAotICAgICAgVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0gICAgICB0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKYXZhIEVFCi0gICAgICBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotICAgICAgCi0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvY29ubmVjdG9yXzFfNi54c2QKLSAgICAgIAotICAgICAgXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0gICAgICAKLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLSAgICAgIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gICAgICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAgICAgIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLSAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0gICAgICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICAgICAgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0gICAgICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqYXZhZWVfNi54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3RvciIKLSAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpjb25uZWN0b3JUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNvbm5lY3RvciBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQKLSAgICAgICAgZGVzY3JpcHRvciBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgZWxlbWVudCBpbmNsdWRlcwotICAgICAgICBnZW5lcmFsIGluZm9ybWF0aW9uIC0gdmVuZG9yIG5hbWUsIHJlc291cmNlIGFkYXB0ZXIgdmVyc2lvbiwKLSAgICAgICAgaWNvbiAtIGFib3V0IHRoZSByZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gSXQgYWxzbyBpbmNsdWRlcwotICAgICAgICBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc291cmNlCi0gICAgICAgIGFkYXB0ZXIgbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgZWxlbWVudAotICAgICAgICByZXNvdXJjZWFkYXB0ZXIuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDplbGVtZW50PgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjdGl2YXRpb25zcGVjVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhY3RpdmF0aW9uc3BlY1R5cGUgc3BlY2lmaWVzIGFuIGFjdGl2YXRpb24KLSAgICAgICAgc3BlY2lmaWNhdGlvbi4gIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseSBxdWFsaWZpZWQKLSAgICAgICAgSmF2YSBjbGFzcyBuYW1lIG9mIGFuIGFjdGl2YXRpb24gc3BlY2lmaWNhdGlvbiBhbmQgYSBzZXQgb2YKLSAgICAgICAgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBuYW1lcy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uc3BlYy1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgICAgICBUaGUgZWxlbWVudCBhY3RpdmF0aW9uc3BlYy1jbGFzcyBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBhY3RpdmF0aW9uCi0gICAgICAgICAgICBzcGVjaWZpY2F0aW9uIGNsYXNzLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZQotICAgICAgICAgICAgamF2YXgucmVzb3VyY2Uuc3BpLkFjdGl2YXRpb25TcGVjIGludGVyZmFjZS4gVGhlCi0gICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzIGlzIHJlcXVpcmVkIHRvIGJlIGEKLSAgICAgICAgICAgIEphdmFCZWFuLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBFeGFtcGxlOgotICAgICAgICAgICAgCSAgPGFjdGl2YXRpb25zcGVjLWNsYXNzPmNvbS53b21iYXQuQWN0aXZhdGlvblNwZWNJbXBsCi0gICAgICAgICAgICAJICA8L2FjdGl2YXRpb25zcGVjLWNsYXNzPgotICAgICAgICAgICAgCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1aXJlZC1jb25maWctcHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eSBlbGVtZW50IGlzIGRlcHJlY2F0ZWQgc2luY2UKLSAgICAgICAgICAgIENvbm5lY3RvcnMgMS42IHNwZWNpZmljYXRpb24uIFRoZSByZXNvdXJjZSBhZGFwdGVyIAotICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBATm90TnVsbAotICAgICAgICAgICAgQmVhbiBWYWxpZGF0aW9uIGFubm90YXRpb24gb3IgaXRzIFhNTCB2YWxpZGF0aW9uCi0gICAgICAgICAgICBkZXNjcmlwdG9yIGVxdWl2YWxlbnQgdG8gaW5kaWNhdGUgdGhhdCBhIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIHByb3BlcnR5IGlzIHJlcXVpcmVkIHRvIGJlIHNwZWNpZmllZCBieSB0aGUgZGVwbG95ZXIuCi0gICAgICAgICAgICBTZWUgdGhlIENvbm5lY3RvcnMgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFkbWlub2JqZWN0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhZG1pbm9iamVjdFR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGFuCi0gICAgICAgIGFkbWluaXN0ZXJlZCBvYmplY3QuICBBZG1pbmlzdGVyZWQgb2JqZWN0cyBhcmUgc3BlY2lmaWMgdG8gYQotICAgICAgICBtZXNzYWdpbmcgc3R5bGUgb3IgbWVzc2FnZSBwcm92aWRlci4gIFRoaXMgY29udGFpbnMKLSAgICAgICAgaW5mb3JtYXRpb24gb24gdGhlIEphdmEgdHlwZSBvZiB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5Ci0gICAgICAgIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QsIGl0cyBKYXZhIGNsYXNzIG5hbWUgYW5kIGl0cwotICAgICAgICBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRtaW5vYmplY3QtaW50ZXJmYWNlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgICAgIFRoZSBlbGVtZW50IGFkbWlub2JqZWN0LWludGVyZmFjZSBzcGVjaWZpZXMgdGhlCi0gICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSB0eXBlIG9mIHRoZQotICAgICAgICAgICAgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGFuIGFkbWluaXN0ZXJlZCBvYmplY3QuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICAJPGFkbWlub2JqZWN0LWludGVyZmFjZT5qYXZheC5qbXMuRGVzdGluYXRpb24KLSAgICAgICAgICAgIAk8L2FkbWlub2JqZWN0LWludGVyZmFjZT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRtaW5vYmplY3QtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICAgICAgVGhlIGVsZW1lbnQgYWRtaW5vYmplY3QtY2xhc3Mgc3BlY2lmaWVzIHRoZSBmdWxseQotICAgICAgICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0LgotICAgICAgICAgICAgCi0gICAgICAgICAgICBFeGFtcGxlOgotICAgICAgICAgICAgCSAgPGFkbWlub2JqZWN0LWNsYXNzPmNvbS53b21iYXQuRGVzdGluYXRpb25JbXBsCi0gICAgICAgICAgICAJICA8L2FkbWlub2JqZWN0LWNsYXNzPgotICAgICAgICAgICAgCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtVHlwZSBzcGVjaWZpZXMgYW4gYXV0aGVudGljYXRpb24KLSAgICAgICAgbWVjaGFuaXNtIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4gTm90ZSB0aGF0IHRoaXMKLSAgICAgICAgc3VwcG9ydCBpcyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIG5vdCBmb3IgdGhlCi0gICAgICAgIHVuZGVybHlpbmcgRUlTIGluc3RhbmNlLiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gc3BlY2lmaWVzCi0gICAgICAgIGFueSByZXNvdXJjZSBhZGFwdGVyIHNwZWNpZmljIHJlcXVpcmVtZW50IGZvciB0aGUgc3VwcG9ydCBvZgotICAgICAgICBzZWN1cml0eSBjb250cmFjdCBhbmQgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotICAgICAgICAKLSAgICAgICAgTm90ZSB0aGF0IEJhc2ljUGFzc3dvcmQgbWVjaGFuaXNtIHR5cGUgc2hvdWxkIHN1cHBvcnQgdGhlCi0gICAgICAgIGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwgaW50ZXJmYWNlLgotICAgICAgICBUaGUgS2VyYnY1IG1lY2hhbmlzbSB0eXBlIHNob3VsZCBzdXBwb3J0IHRoZQotICAgICAgICBvcmcuaWV0Zi5qZ3NzLkdTU0NyZWRlbnRpYWwgaW50ZXJmYWNlIG9yIHRoZSBkZXByZWNhdGVkCi0gICAgICAgIGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbCBpbnRlcmZhY2UuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgICAgICBUaGUgZWxlbWVudCBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZSBzcGVjaWZpZXMKLSAgICAgICAgICAgIHR5cGUgb2YgYW4gYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBUaGUgZXhhbXBsZSB2YWx1ZXMgYXJlOgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+QmFzaWNQYXNzd29yZAotICAgICAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPktlcmJ2NQotICAgICAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgQW55IGFkZGl0aW9uYWwgc2VjdXJpdHkgbWVjaGFuaXNtcyBhcmUgb3V0c2lkZSB0aGUKLSAgICAgICAgICAgIHNjb3BlIG9mIHRoZSBDb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNyZWRlbnRpYWwtaW50ZXJmYWNlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpjcmVkZW50aWFsLWludGVyZmFjZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29uZmlnLXByb3BlcnR5LW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgVGhlIGNvbmZpZy1wcm9wZXJ0eS1uYW1lVHlwZSBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0gICAgICAgIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0gICAgICAgIAotICAgICAgICBUaGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBkZWZpbmVzIGEgc2V0IG9mIHdlbGwtZGVmaW5lZAotICAgICAgICBwcm9wZXJ0aWVzIGFsbCBvZiB0eXBlIGphdmEubGFuZy5TdHJpbmcuIFRoZXNlIGFyZSBhcwotICAgICAgICBmb2xsb3dzLgotICAgICAgICAKLSAgICAgICAgU2VydmVyTmFtZQotICAgICAgICBQb3J0TnVtYmVyCi0gICAgICAgIFVzZXJOYW1lCi0gICAgICAgIFBhc3N3b3JkCi0gICAgICAgIENvbm5lY3Rpb25VUkwKLSAgICAgICAgCi0gICAgICAgIEEgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlciBjYW4gZXh0ZW5kIHRoaXMgcHJvcGVydHkgc2V0IHRvCi0gICAgICAgIGluY2x1ZGUgcHJvcGVydGllcyBzcGVjaWZpYyB0byB0aGUgcmVzb3VyY2UgYWRhcHRlciBhbmQgaXRzCi0gICAgICAgIHVuZGVybHlpbmcgRUlTLgotICAgICAgICAKLSAgICAgICAgUG9zc2libGUgdmFsdWVzIGluY2x1ZGUKLSAgICAgICAgCSAgU2VydmVyTmFtZQotICAgICAgICAJICBQb3J0TnVtYmVyCi0gICAgICAgIAkgIFVzZXJOYW1lCi0gICAgICAgIAkgIFBhc3N3b3JkCi0gICAgICAgIAkgIENvbm5lY3Rpb25VUkwKLSAgICAgICAgCi0gICAgICAgIEV4YW1wbGU6IDxjb25maWctcHJvcGVydHktbmFtZT5TZXJ2ZXJOYW1lPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25maWctcHJvcGVydHktdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgY29uZmlnLXByb3BlcnR5LXR5cGVUeXBlIGNvbnRhaW5zIHRoZSBmdWxseQotICAgICAgICBxdWFsaWZpZWQgSmF2YSB0eXBlIG9mIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KLSAgICAgICAgCi0gICAgICAgIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXM6Ci0gICAgICAgIGphdmEubGFuZy5Cb29sZWFuLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuSW50ZWdlciwKLSAgICAgICAgamF2YS5sYW5nLkRvdWJsZSwgamF2YS5sYW5nLkJ5dGUsIGphdmEubGFuZy5TaG9ydCwKLSAgICAgICAgamF2YS5sYW5nLkxvbmcsIGphdmEubGFuZy5GbG9hdCwgamF2YS5sYW5nLkNoYXJhY3RlcgotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogY29uZmlnLXByb3BlcnR5Ci0gICAgICAgIAotICAgICAgICBFeGFtcGxlOgotICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgIAotICAgICAgICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQm9vbGVhbiIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5JbnRlZ2VyIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Eb3VibGUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkJ5dGUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLlNob3J0Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Mb25nIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5GbG9hdCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQ2hhcmFjdGVyIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25maWctcHJvcGVydHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhIHNpbmdsZQotICAgICAgICBjb25maWd1cmF0aW9uIHByb3BlcnR5IHRoYXQgbWF5IGJlIHVzZWQgZm9yIHByb3ZpZGluZwotICAgICAgICBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotICAgICAgICAKLSAgICAgICAgVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBuYW1lLAotICAgICAgICB0eXBlIGFuZCBhbiBvcHRpb25hbCB2YWx1ZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4gSWYKLSAgICAgICAgdGhlIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbHVlIHRoYW4KLSAgICAgICAgdGhlIGRlcGxveWVyIGlzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYSB2YWxpZCB2YWx1ZSBmb3IKLSAgICAgICAgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5LgotICAgICAgICAKLSAgICAgICAgQW55IGJvdW5kcyBvciB3ZWxsLWRlZmluZWQgdmFsdWVzIG9mIHByb3BlcnRpZXMgc2hvdWxkIGJlCi0gICAgICAgIGRlc2NyaWJlZCBpbiB0aGUgZGVzY3JpcHRpb24gZWxlbWVudC4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eS1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpjb25maWctcHJvcGVydHktbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHktdHlwZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6Y29uZmlnLXByb3BlcnR5LXR5cGVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5LXZhbHVlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgICAgICBUaGUgZWxlbWVudCBjb25maWctcHJvcGVydHktdmFsdWUgY29udGFpbnMgdGhlIHZhbHVlCi0gICAgICAgICAgICBvZiBhIGNvbmZpZ3VyYXRpb24gZW50cnkuIE5vdGUsIGl0IGlzIHBvc3NpYmxlIGZvciBhCi0gICAgICAgICAgICByZXNvdXJjZSBhZGFwdGVyIGRlcGxveWVyIHRvIG92ZXJyaWRlIHRoaXMKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZHVyaW5nIGRlcGxveW1lbnQuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPldvbWJhdFNlcnZlcjwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICAgICAgCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHktaWdub3JlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGVsZW1lbnQgY29uZmlnLXByb3BlcnR5LWlnbm9yZSBpcyB1c2VkIHRvIHNwZWNpZnkgCi0gICAgICAgICAgICB3aGV0aGVyIHRoZSBjb25maWd1cmF0aW9uIHRvb2xzIG11c3QgaWdub3JlIGNvbnNpZGVyaW5nIHRoZSAKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgZHVyaW5nIGF1dG8tZGlzY292ZXJ5IG9mCi0gICAgICAgICAgICBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMuIFNlZSB0aGUgQ29ubmVjdG9yIHNwZWNpZmljYXRpb24gZm9yCi0gICAgICAgICAgICBtb3JlIGRldGFpbHMuIElmIHVuc3BlY2lmaWVkLCB0aGUgY29udGFpbmVyIG11c3Qgbm90IGlnbm9yZQotICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgZHVyaW5nIGF1dG8tZGlzY292ZXJ5LgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcsICJ0cnVlIiBvciAiZmFsc2UiLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5LXN1cHBvcnRzLWR5bmFtaWMtdXBkYXRlcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBlbGVtZW50IGNvbmZpZy1wcm9wZXJ0eS1zdXBwb3J0cy1keW5hbWljLXVwZGF0ZXMgaXMgdXNlZCB0byBzcGVjaWZ5IAotICAgICAgICAgICAgd2hldGhlciB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBhbGxvd3MgaXRzIHZhbHVlIHRvIGJlIHVwZGF0ZWQsIGJ5Ci0gICAgICAgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXIncyBjb25maWd1cmF0aW9uIHRvb2xzLCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mCi0gICAgICAgICAgICB0aGUgSmF2YUJlYW4gaW5zdGFuY2UuIFNlZSB0aGUgQ29ubmVjdG9yIHNwZWNpZmljYXRpb24gZm9yCi0gICAgICAgICAgICBtb3JlIGRldGFpbHMuIElmIHVuc3BlY2lmaWVkLCB0aGUgY29udGFpbmVyIG11c3Qgbm90IGR5bmFtaWNhbGx5Ci0gICAgICAgICAgICByZWNvbmZpZ3VyZSB0aGUgcHJvcGVydHkuCi0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZywgInRydWUiIG9yICJmYWxzZSIuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHktY29uZmlkZW50aWFsIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGVsZW1lbnQgY29uZmlnLXByb3BlcnR5LWNvbmZpZGVudGlhbCBpcyB1c2VkIHRvIHNwZWNpZnkgCi0gICAgICAgICAgICB3aGV0aGVyIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIGNvbmZpZGVudGlhbCBhbmQKLSAgICAgICAgICAgIHJlY29tbWVuZHMgYXBwbGljYXRpb24gc2VydmVyJ3MgY29uZmlndXJhdGlvbiB0b29scyB0byB1c2Ugc3BlY2lhbCAKLSAgICAgICAgICAgIHZpc3VhbCBhaWRzIGZvciBlZGl0aW5nIHRoZW0uIFNlZSB0aGUgQ29ubmVjdG9yIHNwZWNpZmljYXRpb24gZm9yCi0gICAgICAgICAgICBtb3JlIGRldGFpbHMuIElmIHVuc3BlY2lmaWVkLCB0aGUgY29udGFpbmVyIG11c3Qgbm90IHRyZWF0IHRoZQotICAgICAgICAgICAgcHJvcGVydHkgYXMgY29uZmlkZW50aWFsLgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcsICJ0cnVlIiBvciAiZmFsc2UiLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbm5lY3Rpb24tZGVmaW5pdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgY29ubmVjdGlvbi1kZWZpbml0aW9uVHlwZSBkZWZpbmVzIGEgc2V0IG9mIGNvbm5lY3Rpb24KLSAgICAgICAgaW50ZXJmYWNlcyBhbmQgY2xhc3NlcyBwZXJ0YWluaW5nIHRvIGEgcGFydGljdWxhciBjb25uZWN0aW9uCi0gICAgICAgIHR5cGUuIFRoaXMgYWxzbyBpbmNsdWRlcyBjb25maWd1cmFibGUgcHJvcGVydGllcyBmb3IKLSAgICAgICAgTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlcyB0aGF0IG1heSBiZSBwcm9kdWNlZCBvdXQKLSAgICAgICAgb2YgdGhpcyBzZXQuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgICAgIFRoZSBlbGVtZW50IG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcyBzcGVjaWZpZXMKLSAgICAgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0Ci0gICAgICAgICAgICBpbXBsZW1lbnRzIHRoZQotICAgICAgICAgICAgamF2YXgucmVzb3VyY2Uuc3BpLk1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuCi0gICAgICAgICAgICBUaGlzIEphdmEgY2xhc3MgaXMgcHJvdmlkZWQgYXMgcGFydCBvZiByZXNvdXJjZQotICAgICAgICAgICAgYWRhcHRlcidzIGltcGxlbWVudGF0aW9uIG9mIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUKLSAgICAgICAgICAgIHNwZWNpZmllZCBjb250cmFjdHMuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICAgICAgICBjbGFzcyBpcyByZXF1aXJlZCB0byBiZSBhIEphdmFCZWFuLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBFeGFtcGxlOgotICAgICAgICAgICAgPG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz4KLSAgICAgICAgICAgIAkgIGNvbS53b21iYXQuTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5SW1wbAotICAgICAgICAgICAgPC9tYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6Y29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2UiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICAgICAgVGhlIGVsZW1lbnQgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIHNwZWNpZmllcwotICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeQotICAgICAgICAgICAgaW50ZXJmYWNlIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgRXhhbXBsZToKLSAgICAgICAgICAgIDxjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Y29tLndvbWJhdC5Db25uZWN0aW9uRmFjdG9yeQotICAgICAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE9SCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2UuY2NpLkNvbm5lY3Rpb25GYWN0b3J5Ci0gICAgICAgICAgICA8L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgICAgICBUaGUgZWxlbWVudCBjb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzIHNwZWNpZmllcwotICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeQotICAgICAgICAgICAgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIKLSAgICAgICAgICAgIHNwZWNpZmljIENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgRXhhbXBsZToKLSAgICAgICAgICAgIAotICAgICAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Y29tLndvbWJhdC5Db25uZWN0aW9uRmFjdG9yeUltcGwKLSAgICAgICAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1pbnRlcmZhY2UiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICAgICAgVGhlIGNvbm5lY3Rpb24taW50ZXJmYWNlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBmdWxseQotICAgICAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gaW50ZXJmYWNlIHN1cHBvcnRlZAotICAgICAgICAgICAgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAkgIDxjb25uZWN0aW9uLWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbgotICAgICAgICAgICAgCSAgPC9jb25uZWN0aW9uLWludGVyZmFjZT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1pbXBsLWNsYXNzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgICAgIFRoZSBjb25uZWN0aW9uLWltcGwtY2xhc3NUeXBlIHNwZWNpZmllcyB0aGUgZnVsbHkKLSAgICAgICAgICAgIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uIGNsYXNzIHRoYXQKLSAgICAgICAgICAgIGltcGxlbWVudHMgcmVzb3VyY2UgYWRhcHRlciBzcGVjaWZpYyBDb25uZWN0aW9uCi0gICAgICAgICAgICBpbnRlcmZhY2UuICBJdCBpcyB1c2VkIGJ5IHRoZSBjb25uZWN0aW9uLWltcGwtY2xhc3MKLSAgICAgICAgICAgIGVsZW1lbnRzLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBFeGFtcGxlOgotICAgICAgICAgICAgCi0gICAgICAgICAgICAJICA8Y29ubmVjdGlvbi1pbXBsLWNsYXNzPmNvbS53b21iYXQuQ29ubmVjdGlvbkltcGwKLSAgICAgICAgICAgIAkgIDwvY29ubmVjdGlvbi1pbXBsLWNsYXNzPgotICAgICAgICAgICAgCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdG9yVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjb25uZWN0b3JUeXBlIGRlZmluZXMgYSByZXNvdXJjZSBhZGFwdGVyLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1vZHVsZS1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGVsZW1lbnQgbW9kdWxlLW5hbWUgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZQotICAgICAgICAgICAgcmVzb3VyY2UgYWRhcHRlci4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgSWYgdGhlcmUgaXMgbm8gbW9kdWxlLW5hbWUgc3BlY2lmaWVkLCB0aGUgbW9kdWxlLW5hbWUKLSAgICAgICAgICAgIGlzIGRldGVybWluZWQgYXMgZGVmaW5lZCBpbiBTZWN0aW9uIEVFLjguMS4xIGFuZCBFRS44LjEuMiAKLSAgICAgICAgICAgIG9mIHRoZSBKYXZhIFBsYXRmb3JtLCBFbnRlcnByaXNlIEVkaXRpb24gKEphdmEgRUUpIAotICAgICAgICAgICAgU3BlY2lmaWNhdGlvbiwgdmVyc2lvbiA2LgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZW5kb3ItbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZWxlbWVudCB2ZW5kb3ItbmFtZSBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKLSAgICAgICAgICAgIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgdmVuZG9yLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBJZiB0aGVyZSBpcyBubyB2ZW5kb3ItbmFtZSBzcGVjaWZpZWQsIHRoZSBhcHBsaWNhdGlvbiAKLSAgICAgICAgICAgIHNlcnZlciBtdXN0IGNvbnNpZGVyIHRoZSBkZWZhdWx0ICIiIChlbXB0eSBzdHJpbmcpIGFzCi0gICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlciB2ZW5kb3IuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlaXMtdHlwZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZWxlbWVudCBlaXMtdHlwZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLSAgICAgICAgICAgIHR5cGUgb2YgdGhlIEVJUy4gRm9yIGV4YW1wbGUsIHRoZSB0eXBlIG9mIGFuIEVJUyBjYW4KLSAgICAgICAgICAgIGJlIHByb2R1Y3QgbmFtZSBvZiBFSVMgaW5kZXBlbmRlbnQgb2YgYW55IHZlcnNpb24KLSAgICAgICAgICAgIGluZm8uCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRoaXMgaGVscHMgaW4gaWRlbnRpZnlpbmcgRUlTIGluc3RhbmNlcyB0aGF0IGNhbiBiZQotICAgICAgICAgICAgdXNlZCB3aXRoIHRoaXMgcmVzb3VyY2UgYWRhcHRlci4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgSWYgdGhlcmUgaXMgbm8gZWlzLXR5cGUgc3BlY2lmaWVkLCB0aGUgYXBwbGljYXRpb24gCi0gICAgICAgICAgICBzZXJ2ZXIgbXVzdCBjb25zaWRlciB0aGUgZGVmYXVsdCAiIiAoZW1wdHkgc3RyaW5nKSBhcwotICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIEVJUy4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlYWRhcHRlci12ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci12ZXJzaW9uIHNwZWNpZmllcyBhIHN0cmluZy1iYXNlZCB2ZXJzaW9uCi0gICAgICAgICAgICBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBmcm9tIHRoZSByZXNvdXJjZSBhZGFwdGVyCi0gICAgICAgICAgICBwcm92aWRlci4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgSWYgdGhlcmUgaXMgbm8gcmVzb3VyY2VhZGFwdGVyLXZlcnNpb24gc3BlY2lmaWVkLCB0aGUgYXBwbGljYXRpb24gCi0gICAgICAgICAgICBzZXJ2ZXIgbXVzdCBjb25zaWRlciB0aGUgZGVmYXVsdCAiIiAoZW1wdHkgc3RyaW5nKSBhcwotICAgICAgICAgICAgdGhlIHZlcnNpb24gb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIuCi0gICAgICAgICAgICAJCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaWNlbnNlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsaWNlbnNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZWFkYXB0ZXIiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnJlc291cmNlYWRhcHRlclR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1aXJlZC13b3JrLWNvbnRleHQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGVsZW1lbnQgcmVxdWlyZWQtd29yay1jb250ZXh0IHNwZWNpZmllcyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyAKLSAgICAgICAgICAgIG5hbWUgdGhhdCBpbXBsZW1lbnRzIFdvcmtDb250ZXh0IGludGVyZmFjZSwgdGhhdCB0aGUgcmVzb3VyY2UgYWRhcHRlciAKLSAgICAgICAgICAgIHJlcXVpcmVzIHRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgdG8gc3VwcG9ydC4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRld2V5LXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIGZpeGVkPSIxLjYiCi0gICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSB2ZXJzaW9uIGluZGljYXRlcyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIHRvIGJlIHVzZWQgYnkgdGhlCi0gICAgICAgICAgZGVwbG95bWVudCB0b29sLiBUaGlzIGVsZW1lbnQgZG9lc24ndCBoYXZlIGEgZGVmYXVsdCwgYW5kIHRoZSByZXNvdXJjZSBhZGFwdGVyIAotICAgICAgICAgIGRldmVsb3Blci9kZXBsb3llciBpcyByZXF1aXJlZCB0byBzcGVjaWZ5IGl0LiBUaGUgZWxlbWVudCBhbGxvd3MgdGhlIGRlcGxveW1lbnQgCi0gICAgICAgICAgdG9vbCB0byBjaG9vc2Ugd2hpY2ggc2NoZW1hIHRvIHZhbGlkYXRlIHRoZSBkZXNjcmlwdG9yIGFnYWluc3QuCi0gICAgICAgICAgCSAgCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgZGVmaW5lcyB3aGV0aGVyIHRoZSBkZXBsb3ltZW50IAotICAgICAgICAgIGRlc2NyaXB0b3IgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyIG1vZHVsZSBpcyBjb21wbGV0ZSwgb3Igd2hldGhlcgotICAgICAgICAgIHRoZSBjbGFzcyBmaWxlcyBhdmFpbGFibGUgdG8gdGhlIG1vZHVsZSBhbmQgcGFja2FnZWQgd2l0aCB0aGUgcmVzb3VyY2UgCi0gICAgICAgICAgYWRhcHRlciBzaG91bGQgYmUgZXhhbWluZWQgZm9yIGFubm90YXRpb25zIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50IAotICAgICAgICAgIGluZm9ybWF0aW9uLgotICAgICAgICAgIAotICAgICAgICAgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIHNldCB0byAidHJ1ZSIsIHRoZSBkZXBsb3ltZW50IHRvb2wgb2YgdGhlIAotICAgICAgICAgIGFwcGxpY2F0aW9uIHNlcnZlciBtdXN0IGlnbm9yZSBhbnkgYW5ub3RhdGlvbnMgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQgCi0gICAgICAgICAgaW5mb3JtYXRpb24sIHdoaWNoIG1pZ2h0IGJlIHByZXNlbnQgaW4gdGhlIGNsYXNzIGZpbGVzIG9mIHRoZSAKLSAgICAgICAgICBhcHBsaWNhdGlvbi5JZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIHNldCB0byAiZmFsc2UiLCAKLSAgICAgICAgICB0aGUgZGVwbG95bWVudCB0b29sIG11c3QgZXhhbWluZSB0aGUgY2xhc3MgZmlsZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGZvciAKLSAgICAgICAgICBhbm5vdGF0aW9ucywgYXMgc3BlY2lmaWVkIGJ5IHRoaXMgc3BlY2lmaWNhdGlvbi4gSWYgdGhlIAotICAgICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyBub3QgaW5jbHVkZWQgb3IgaXMgaW5jbHVkZWQgYnV0IG5vdCBtYXJrZWQgCi0gICAgICAgICAgbWV0YWRhdGEtY29tcGxldGUsIHRoZSBkZXBsb3ltZW50IHRvb2wgd2lsbCBwcm9jZXNzIGFubm90YXRpb25zLgotICAgICAgICAgIAotICAgICAgICAgIEFwcGxpY2F0aW9uIHNlcnZlcnMgbXVzdCBhc3N1bWUgdGhhdCBtZXRhZGF0YS1jb21wbGV0ZSBpcyB0cnVlIGZvciAKLSAgICAgICAgICByZXNvdXJjZSBhZGFwdGVyIG1vZHVsZXMgd2l0aCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgdmVyc2lvbiAKLSAgICAgICAgICBsb3dlciB0aGFuIDEuNi4KLSAgICAgICAgICAJCQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNyZWRlbnRpYWwtaW50ZXJmYWNlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjcmVkZW50aWFsLWludGVyZmFjZVR5cGUgc3BlY2lmaWVzIHRoZQotICAgICAgICBpbnRlcmZhY2UgdGhhdCB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbgotICAgICAgICBzdXBwb3J0cyBmb3IgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICAgICAgICBjcmVkZW50aWFscy4gVGhpcyBlbGVtZW50KHMpIHRoYXQgdXNlIHRoaXMgdHlwZSwKLSAgICAgICAgaS5lLiBjcmVkZW50aWFsLWludGVyZmFjZSwgIHNob3VsZCBiZSB1c2VkIGJ5Ci0gICAgICAgIGFwcGxpY2F0aW9uIHNlcnZlciB0byBmaW5kIG91dCB0aGUgQ3JlZGVudGlhbAotICAgICAgICBpbnRlcmZhY2UgaXQgc2hvdWxkIHVzZSBhcyBwYXJ0IG9mIHRoZSBzZWN1cml0eQotICAgICAgICBjb250cmFjdC4KLSAgICAgICAgCi0gICAgICAgIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOgotICAgICAgICAKLSAgICAgICAgamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbAotICAgICAgICBvcmcuaWV0Zi5qZ3NzLkdTU0NyZWRlbnRpYWwKLSAgICAgICAgamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuR2VuZXJpY0NyZWRlbnRpYWwiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluYm91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBpbmJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uCi0gICAgICAgIGFib3V0IGFuIGluYm91bmQgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBjb250YWlucyBpbmZvcm1hdGlvbgotICAgICAgICBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIKLSAgICAgICAgbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgbWVzc2FnZWFkYXB0ZXIgZWxlbWVudC4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlYWRhcHRlciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWVzc2FnZWFkYXB0ZXJUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VsaXN0ZW5lci10eXBlLXVuaXF1ZW5lc3MiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgbWVzc2FnZWxpc3RlbmVyLXR5cGUgZWxlbWVudCBjb250ZW50IG11c3QgYmUKLSAgICAgICAgICAgICAgdW5pcXVlIGluIHRoZSBtZXNzYWdlYWRhcHRlci4gU2V2ZXJhbCBtZXNzYWdlbGlzdGVuZXJzCi0gICAgICAgICAgICAgIGNhbiBub3QgdXNlIHRoZSBzYW1lIG1lc3NhZ2VsaXN0ZW5lci10eXBlLgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6bWVzc2FnZWxpc3RlbmVyIi8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOm1lc3NhZ2VsaXN0ZW5lci10eXBlIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxpY2Vuc2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGxpY2Vuc2VUeXBlIHNwZWNpZmllcyBsaWNlbnNpbmcgcmVxdWlyZW1lbnRzIGZvciB0aGUKLSAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIFRoaXMgdHlwZSBzcGVjaWZpZXMgd2hldGhlciBhCi0gICAgICAgIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZSBhZGFwdGVyLAotICAgICAgICBhbmQgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGxpY2Vuc2luZyB0ZXJtcwotICAgICAgICAoZXhhbXBsZXM6IGR1cmF0aW9uIG9mIGxpY2Vuc2UsIG51bWJlciBvZiBjb25uZWN0aW9uCi0gICAgICAgIHJlc3RyaWN0aW9ucykuIEl0IGlzIHVzZWQgYnkgdGhlIGxpY2Vuc2UgZWxlbWVudC4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpY2Vuc2UtcmVxdWlyZWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGVsZW1lbnQgbGljZW5zZS1yZXF1aXJlZCBzcGVjaWZpZXMgd2hldGhlciBhCi0gICAgICAgICAgICBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGRlcGxveSBhbmQgdXNlIHRoZQotICAgICAgICAgICAgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBlbGVtZW50IG11c3QgYmUgb25lIG9mCi0gICAgICAgICAgICB0aGUgZm9sbG93aW5nLCAidHJ1ZSIgb3IgImZhbHNlIi4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlYWRhcHRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWVzc2FnZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLSAgICAgICAgbWVzc2FnaW5nIGNhcGFiaWxpdGllcyBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhpcwotICAgICAgICBjb250YWlucyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gICAgICAgIHJlc291cmNlIGFkYXB0ZXIgbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUKLSAgICAgICAgbWVzc2FnZWxpc3RlbmVyIGVsZW1lbnQuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZWxpc3RlbmVyIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptZXNzYWdlbGlzdGVuZXJUeXBlIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2VsaXN0ZW5lclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWVzc2FnZWxpc3RlbmVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYQotICAgICAgICBzcGVjaWZpYyBtZXNzYWdlIGxpc3RlbmVyIHN1cHBvcnRlZCBieSB0aGUgbWVzc2FnaW5nCi0gICAgICAgIHJlc291cmNlIGFkYXB0ZXIuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBKYXZhIHR5cGUKLSAgICAgICAgb2YgdGhlIG1lc3NhZ2UgbGlzdGVuZXIgaW50ZXJmYWNlIGFuZCBhbiBhY3RpdmF0aW9uCi0gICAgICAgIHNwZWNpZmljYXRpb24uCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZWxpc3RlbmVyLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICAgICAgVGhlIGVsZW1lbnQgbWVzc2FnZWxpc3RlbmVyLXR5cGUgc3BlY2lmaWVzIHRoZSBmdWxseQotICAgICAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgdHlwZSBvZiBhIG1lc3NhZ2UKLSAgICAgICAgICAgIGxpc3RlbmVyIGludGVyZmFjZS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgRXhhbXBsZToKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCTxtZXNzYWdlbGlzdGVuZXItdHlwZT5qYXZheC5qbXMuTWVzc2FnZUxpc3RlbmVyCi0gICAgICAgICAgICAJPC9tZXNzYWdlbGlzdGVuZXItdHlwZT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbnNwZWMiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmFjdGl2YXRpb25zcGVjVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG91dGJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgICAgIGFuIG91dGJvdW5kIHJlc291cmNlIGFkYXB0ZXIuIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseQotICAgICAgICBxdWFsaWZpZWQgbmFtZXMgb2YgY2xhc3Nlcy9pbnRlcmZhY2VzIHJlcXVpcmVkIGFzIHBhcnQgb2YKLSAgICAgICAgdGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGNvbnRyYWN0cyBmb3IKLSAgICAgICAgY29ubmVjdGlvbiBtYW5hZ2VtZW50LCBsZXZlbCBvZiB0cmFuc2FjdGlvbiBzdXBwb3J0Ci0gICAgICAgIHByb3ZpZGVkLCBvbmUgb3IgbW9yZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHN1cHBvcnRlZAotICAgICAgICBhbmQgYWRkaXRpb25hbCByZXF1aXJlZCBzZWN1cml0eSBwZXJtaXNzaW9ucy4KLSAgICAgICAgCi0gICAgICAgIElmIGFueSBvZiB0aGUgb3V0Ym91bmQgcmVzb3VyY2UgYWRhcHRlciBlbGVtZW50cyAodHJhbnNhY3Rpb24tc3VwcG9ydCwKLSAgICAgICAgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLCByZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQpIGlzIHNwZWNpZmllZCB0aHJvdWdoCi0gICAgICAgIHRoaXMgZWxlbWVudCBvciBtZXRhZGF0YSBhbm5vdGF0aW9ucywgYW5kIG5vICBjb25uZWN0aW9uLWRlZmluaXRpb24gaXMgCi0gICAgICAgIHNwZWNpZmllZCBhcyBwYXJ0IG9mIHRoaXMgZWxlbWVudCBvciB0aHJvdWdoIGFubm90YXRpb25zLCB0aGUgCi0gICAgICAgIGFwcGxpY2F0aW9uIHNlcnZlciBtdXN0IGNvbnNpZGVyIHRoaXMgYW4gZXJyb3IgYW5kIGZhaWwgZGVwbG95bWVudC4gCi0gICAgICAgIAotICAgICAgICBJZiB0aGVyZSBpcyBubyBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gc3BlY2lmaWVkIGFzIHBhcnQgb2YKLSAgICAgICAgdGhpcyBlbGVtZW50IG9yIG1ldGFkYXRhIGFubm90YXRpb25zLCB0aGVuIHRoZSByZXNvdXJjZSBhZGFwdGVyIGRvZXMgCi0gICAgICAgIG5vdCBzdXBwb3J0IGFueSBzdGFuZGFyZCBzZWN1cml0eSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIGFzIAotICAgICAgICBwYXJ0IG9mIHNlY3VyaXR5IGNvbnRyYWN0LiBUaGUgYXBwbGljYXRpb24gc2VydmVyIGlnbm9yZXMgdGhlIHNlY3VyaXR5IAotICAgICAgICBwYXJ0IG9mIHRoZSBzeXN0ZW0gY29udHJhY3RzIGluIHRoaXMgY2FzZS4KLSAgICAgICAgCi0gICAgICAgIElmIHRoZXJlIGlzIG5vIHRyYW5zYWN0aW9uLXN1cHBvcnQgc3BlY2lmaWVkIGFzIHBhcnQgb2YgdGhpcyBlbGVtZW50IAotICAgICAgICBvciBtZXRhZGF0YSBhbm5vdGF0aW9uLCB0aGVuIHRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgbXVzdCBjb25zaWRlciB0aGF0IAotICAgICAgICB0aGUgcmVzb3VyY2UgYWRhcHRlciBkb2VzIG5vdCBzdXBwb3J0IGVpdGhlciB0aGUgcmVzb3VyY2UgbWFuYWdlciBsb2NhbCAKLSAgICAgICAgb3IgSlRBIHRyYW5zYWN0aW9ucyBhbmQgbXVzdCBjb25zaWRlciB0aGUgdHJhbnNhY3Rpb24gc3VwcG9ydCBhcyAKLSAgICAgICAgTm9UcmFuc2FjdGlvbi4gTm90ZSB0aGF0IHJlc291cmNlIGFkYXB0ZXJzIG1heSBzcGVjaWZ5IHRoZSBsZXZlbCBvZiAKLSAgICAgICAgdHJhbnNhY3Rpb24gc3VwcG9ydCB0byBiZSB1c2VkIGF0IHJ1bnRpbWUgZm9yIGEgTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IAotICAgICAgICB0aHJvdWdoIHRoZSBUcmFuc2FjdGlvblN1cHBvcnQgaW50ZXJmYWNlLgotICAgICAgICAKLSAgICAgICAgSWYgdGhlcmUgaXMgbm8gcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0IHNwZWNpZmllZCBhcyBwYXJ0IG9mCi0gICAgICAgIHRoaXMgZWxlbWVudCBvciBtZXRhZGF0YSBhbm5vdGF0aW9uLCB0aGVuIHRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgbXVzdCBjb25zaWRlciAKLSAgICAgICAgdGhhdCB0aGUgcmVzb3VyY2UgYWRhcHRlciBkb2VzIG5vdCBzdXBwb3J0IHJlLWF1dGhlbnRpY2F0aW9uIG9mIAotICAgICAgICBNYW5hZ2VkQ29ubmVjdGlvbnMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1kZWZpbml0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpjb25uZWN0aW9uLWRlZmluaXRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zYWN0aW9uLXN1cHBvcnQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRyYW5zYWN0aW9uLXN1cHBvcnRUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YXV0aGVudGljYXRpb24tbWVjaGFuaXNtVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIAkgICAgVGhlIGVsZW1lbnQgcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0IHNwZWNpZmllcwotICAgICAgICAgICAgCSAgICB3aGV0aGVyIHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzCi0gICAgICAgICAgICAJICAgIHJlLWF1dGhlbnRpY2F0aW9uIG9mIGV4aXN0aW5nIE1hbmFnZWQtIENvbm5lY3Rpb24KLSAgICAgICAgICAgIAkgICAgaW5zdGFuY2UuIE5vdGUgdGhhdCB0aGlzIGluZm9ybWF0aW9uIGlzIGZvciB0aGUKLSAgICAgICAgICAgIAkgICAgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBhbmQgbm90IGZvciB0aGUKLSAgICAgICAgICAgIAkgICAgdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuIFRoaXMgZWxlbWVudCBtdXN0IGhhdmUKLSAgICAgICAgICAgIAkgICAgZWl0aGVyIGEgInRydWUiIG9yICJmYWxzZSIgdmFsdWUuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIAkgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXF1aXJlZC1jb25maWctcHJvcGVydHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgVGhlIHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotICAgICAgICBvZiBhIHNpbmdsZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IHVzZWQgZm9yIHNwZWNpZnlpbmcgYQotICAgICAgICByZXF1aXJlZCBjb25maWd1cmF0aW9uIHByb3BlcnR5IG5hbWUuIEl0IGlzIHVzZWQKLSAgICAgICAgYnkgcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5IGVsZW1lbnRzLgotICAgICAgICAKLSAgICAgICAgVXNhZ2Ugb2YgdGhpcyB0eXBlIGlzIGRlcHJlY2F0ZWQgZnJvbSBDb25uZWN0b3JzIDEuNiBzcGVjaWZpY2F0aW9uLiAKLSAgICAgICAgUmVmZXIgdG8gcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5IGVsZW1lbnQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICAgIAotICAgICAgICBFeGFtcGxlOgotICAgICAgICAKLSAgICAgICAgPHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPkRlc3RpbmF0aW9uPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgPC9yZXF1aXJlZC1jb25maWctcHJvcGVydHk+Ci0gICAgICAgIAotICAgICAgICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmNvbmZpZy1wcm9wZXJ0eS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXNvdXJjZWFkYXB0ZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlc291cmNlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgICAgICByZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkgcXVhbGlmaWVkCi0gICAgICAgIHJlc291cmNlIGFkYXB0ZXIgSmF2YSBjbGFzcyBuYW1lLCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMsCi0gICAgICAgIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UKLSAgICAgICAgYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZQotICAgICAgICBvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXIgYW5kIGluYm91bmQtcmVzb3VyY2VhZGFwdGVyCi0gICAgICAgIGVsZW1lbnRzLCBhbmQgYW4gb3B0aW9uYWwgc2V0IG9mIGFkbWluaXN0ZXJlZCBvYmplY3RzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlYWRhcHRlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZWxlbWVudCByZXNvdXJjZWFkYXB0ZXItY2xhc3Mgc3BlY2lmaWVzIHRoZQotICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cwotICAgICAgICAgICAgdGhlIGphdmF4LnJlc291cmNlLnNwaS5SZXNvdXJjZUFkYXB0ZXIKLSAgICAgICAgICAgIGludGVyZmFjZS4gVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YKLSAgICAgICAgICAgIHJlc291cmNlIGFkYXB0ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0b3IKLSAgICAgICAgICAgIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgY29udHJhY3RzLiBUaGUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgIG9mIHRoaXMgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6Y29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXIiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm91dGJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlLXVuaXF1ZW5lc3MiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIGVsZW1lbnQgY29udGVudAotICAgICAgICAgICAgICBtdXN0IGJlIHVuaXF1ZSBpbiB0aGUgb3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyLgotICAgICAgICAgICAgICBNdWx0aXBsZSBjb25uZWN0aW9uLWRlZmluaXRpb25zIGNhbiBub3QgdXNlIHRoZQotICAgICAgICAgICAgICBzYW1lIGNvbm5lY3Rpb25mYWN0b3J5LXR5cGUuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpjb25uZWN0aW9uLWRlZmluaXRpb24iLz4KLSAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5ib3VuZC1yZXNvdXJjZWFkYXB0ZXIiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmluYm91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZG1pbm9iamVjdCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YWRtaW5vYmplY3RUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImFkbWlub2JqZWN0LXR5cGUtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSBhZG1pbm9iamVjdC1pbnRlcmZhY2UgYW5kIGFkbWlub2JqZWN0LWNsYXNzIGVsZW1lbnQgY29udGVudCBtdXN0IGJlCi0gICAgICAgICAgICAgIHVuaXF1ZSBpbiB0aGUgcmVzb3VyY2VhZGFwdGVyVHlwZS4gU2V2ZXJhbCBhZG1pbiBvYmplY3RzCi0gICAgICAgICAgICAgIGNhbiBub3QgdXNlIHRoZSBzYW1lIGFkbWlub2JqZWN0LWludGVyZmFjZSBhbmQgYWRtaW5vYmplY3QtY2xhc3MuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTphZG1pbm9iamVjdCIvPgotICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTphZG1pbm9iamVjdC1pbnRlcmZhY2UiLz4KLSAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6YWRtaW5vYmplY3QtY2xhc3MiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1wZXJtaXNzaW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1wZXJtaXNzaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktcGVybWlzc2lvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgc2VjdXJpdHktcGVybWlzc2lvblR5cGUgc3BlY2lmaWVzIGEgc2VjdXJpdHkKLSAgICAgICAgcGVybWlzc2lvbiB0aGF0IGlzIHJlcXVpcmVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyIGNvZGUuCi0gICAgICAgIAotICAgICAgICBUaGUgc2VjdXJpdHkgcGVybWlzc2lvbiBsaXN0ZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgICAgICBhcmUgb25lcyB0aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSB0aG9zZSByZXF1aXJlZCBieSB0aGUKLSAgICAgICAgZGVmYXVsdCBwZXJtaXNzaW9uIHNldCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbm5lY3RvcgotICAgICAgICBzcGVjaWZpY2F0aW9uLiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gY2FuIG1lbnRpb24gc3BlY2lmaWMKLSAgICAgICAgcmVhc29uIHRoYXQgcmVzb3VyY2UgYWRhcHRlciByZXF1aXJlcyBhIGdpdmVuIHNlY3VyaXR5Ci0gICAgICAgIHBlcm1pc3Npb24uCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWMiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZWxlbWVudCBzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWMgc3BlY2lmaWVzIGEgc2VjdXJpdHkKLSAgICAgICAgICAgIHBlcm1pc3Npb24gYmFzZWQgb24gdGhlIFNlY3VyaXR5IHBvbGljeSBmaWxlCi0gICAgICAgICAgICBzeW50YXguIFJlZmVyIHRvIHRoZSBmb2xsb3dpbmcgVVJMIGZvciBTdW4ncwotICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlY3VyaXR5IHBlcm1pc3Npb24KLSAgICAgICAgICAgIHNwZWNpZmljYXRpb246Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL3NlY3VyaXR5L1BvbGljeUZpbGVzLmh0bWwKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2FjdGlvbi1zdXBwb3J0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSB0cmFuc2FjdGlvbi1zdXBwb3J0VHlwZSBzcGVjaWZpZXMgdGhlIGxldmVsIG9mCi0gICAgICAgIHRyYW5zYWN0aW9uIHN1cHBvcnQgcHJvdmlkZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuIEl0IGlzCi0gICAgICAgIHVzZWQgYnkgdHJhbnNhY3Rpb24tc3VwcG9ydCBlbGVtZW50cy4KLSAgICAgICAgCi0gICAgICAgIFRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgICAgICAKLSAgICAgICAgTm9UcmFuc2FjdGlvbgotICAgICAgICBMb2NhbFRyYW5zYWN0aW9uCi0gICAgICAgIFhBVHJhbnNhY3Rpb24KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9UcmFuc2FjdGlvbiIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFRyYW5zYWN0aW9uIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhBVHJhbnNhY3Rpb24iLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfMV8xLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8xXzEuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmQ4MzhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8xXzEuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsODk0ICswLDAgQEAKLTwhLS0KLUNvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENBICA5NDMwMywgVS5TLkEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIAotVGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50IGlzIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgYW5kIGRpc3RyaWJ1dGVkCi11bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyBpdHMgdXNlLCBjb3B5aW5nLCBkaXN0cmlidXRpb24sIGFuZAotZGVjb21waWxhdGlvbi4gIE5vIHBhcnQgb2YgdGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50YXRpb24gbWF5IGJlCi1yZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgotb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuICAKLQotVGhpcmQgcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzIGNvcHlyaWdodGVkIGFuZCAKLWxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4gCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBMb2dvLCBTb2xhcmlzLCBKYXZhLCBKYXZhU2VydmVyIFBhZ2VzLCBKYXZhIAotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCBKREJDLCBKREssIEphdmFNYWlsIGFuZCBFbnRlcnByaXNlIEphdmFCZWFucywgCi1hcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jIGluIHRoZSBVLlMuIAotYW5kIG90aGVyIGNvdW50cmllcy4KLQotQWxsIFNQQVJDIHRyYWRlbWFya3MgYXJlIHVzZWQgdW5kZXIgbGljZW5zZSBhbmQgYXJlIHRyYWRlbWFya3MKLW9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTUEFSQyBJbnRlcm5hdGlvbmFsLCBJbmMuCi1pbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLiBQcm9kdWN0cyBiZWFyaW5nIFNQQVJDCi10cmFkZW1hcmtzIGFyZSBiYXNlZCB1cG9uIGFuIGFyY2hpdGVjdHVyZSBkZXZlbG9wZWQgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAKLQotUG9zdFNjcmlwdCBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMsIEluYy4gCi0KLSAKLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycyBTdWJqZWN0IHRvIAotU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotCi0gCi1ET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFMTCBFWFBSRVNTIE9SIElNUExJRUQKLUNPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIEFOWQotSU1QTElFRCBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRSBPUiBOT04tSU5GUklOR0VNRU5ULCBBUkUgRElTQ0xBSU1FRCwgRVhDRVBUCi1UTyBUSEUgRVhURU5UIFRIQVQgU1VDSCBESVNDTEFJTUVSUyBBUkUgSEVMRCBUTyBCRSBMRUdBTExZCi1JTlZBTElELgotCi1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi1Db3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCAKLTkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENBICA5NDMwMywgRXRhdHMtVW5pcy4gCi1Ub3VzIGRyb2l0cyByZSdzZXJ2ZSdzLgotIAotCi1DZSBwcm9kdWl0IG91IGRvY3VtZW50IGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldCBkaXN0cmlidWUnIGF2ZWMgCi1kZXMgbGljZW5jZXMgcXVpIGVuIHJlc3RyZWlnbmVudCBsJ3V0aWxpc2F0aW9uLCBsYSBjb3BpZSwgbGEgZGlzdHJpYnV0aW9uLAotZXQgbGEgZGUnY29tcGlsYXRpb24uICBBdWN1bmUgcGFydGllIGRlIGNlIHByb2R1aXQgb3UgZGUgc2EgZG9jdW1lbnRhdGlvbgotYXNzb2NpZSdlIG5lIHBldXQgZV50cmUgcmVwcm9kdWl0ZSBzb3VzIGF1Y3VuZSBmb3JtZSwgcGFyIHF1ZWxxdWUgbW95ZW4gCi1xdWUgY2Ugc29pdCwgc2FucyBsJ2F1dG9yaXNhdGlvbiBwcmUnYWxhYmxlIGV0IGUnY3JpdGUgZGUgU3VuIGV0IGRlIHNlcyAKLWJhaWxsZXVycyBkZSBsaWNlbmNlLCBzJ2lsIHkgZW4gYS4gIAotCi1MZSBsb2dpY2llbCBkZSd0ZW51IHBhciBkZXMgdGllcnMsIGV0IHF1aSBjb21wcmVuZCBsYSB0ZWNobm9sb2dpZSAKLXJlbGF0aXZlIGF1eCBwb2xpY2VzIGRlIGNhcmFjdGVgcmVzLCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgCi1ldCBsaWNlbmNpZScgcGFyIGRlcyBmb3Vybmlzc2V1cnMgZGUgU3VuLgotIAotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCBsZSBsb2dvIFN1biwgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YSAKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCwgZXQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsICAKLXNvbnQgZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTdW4gCi1NaWNyb3N5c3RlbXMsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgZGFucyBkJ2F1dHJlcyBwYXlzLgotIAotVG91dGVzIGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQgdXRpbGlzZSdlcyBzb3VzIGxpY2VuY2UgZXQgc29udAotZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTUEFSQwotSW50ZXJuYXRpb25hbCwgSW5jLiBhdXggRXRhdHMtVW5pcyBldCAgZGFucwotZCdhdXRyZXMgcGF5cy4gTGVzIHByb2R1aXRzIHBvcnRhbnQgbGVzIG1hcnF1ZXMgU1BBUkMgc29udAotYmFzZSdzIHN1ciB1bmUgYXJjaGl0ZWN0dXJlIGRlJ3ZlbG9wcGUnZSBwYXIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgCi0KLVBvc3RjcmlwdCBlc3QgdW5lIG1hcnF1ZSBlbnJlZ2lzdHJlJ2UgZCdBZG9iZSBTeXN0ZW1zIEluYy4gCi0gCi1MQSBET0NVTUVOVEFUSU9OIEVTVCBGT1VSTklFICJFTiBMJ0VUQVQiIEVUIFRPVVRFUyBBVVRSRVMgQ09ORElUSU9OUywKLURFQ0xBUkFUSU9OUyBFVCBHQVJBTlRJRVMgRVhQUkVTU0VTIE9VIFRBQ0lURVMgU09OVCBGT1JNRUxMRU1FTlQgRVhDTFVFUywKLURBTlMgTEEgTUVTVVJFIEFVVE9SSVNFRSBQQVIgTEEgTE9JIEFQUExJQ0FCTEUsIFkgQ09NUFJJUyBOT1RBTU1FTlQKLVRPVVRFIEdBUkFOVElFIElNUExJQ0lURSBSRUxBVElWRSBBIExBIFFVQUxJVEUgTUFSQ0hBTkRFLCBBIEwnQVBUSVRVREUKLUEgVU5FIFVUSUxJU0FUSU9OIFBBUlRJQ1VMSUVSRSBPVSBBIEwnQUJTRU5DRSBERSBDT05UUkVGQUNPTi4KLS0tPgotCi0KLTwhLS0KLVRoaXMgaXMgdGhlIFhNTCBEVEQgZm9yIHRoZSBFSkIgMS4xIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLS0tPgotCi0KLTwhLS0KLVRoZSBhc3NlbWJseS1kZXNjcmlwdG9yIGVsZW1lbnQgY29udGFpbnMgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24uCi0KLVRoZSBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbiBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhcnRzOgotdGhlIGRlZmluaXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMsIHRoZSBkZWZpbml0aW9uIG9mIG1ldGhvZCBwZXJtaXNzaW9ucywKLWFuZCB0aGUgZGVmaW5pdGlvbiBvZiB0cmFuc2FjdGlvbiBhdHRyaWJ1dGVzIGZvciBlbnRlcnByaXNlIGJlYW5zIHdpdGgKLWNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uLgotCi1BbGwgdGhlIHBhcnRzIGFyZSBvcHRpb25hbCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGFyZSBvbWl0dGVkIGlmIHRoZQotbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuCi0KLVByb3ZpZGluZyBhbiBhc3NlbWJseS1kZXNjcmlwdG9yIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMKLW9wdGlvbmFsIGZvciB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyLgotCi1Vc2VkIGluOiBlamItamFyCi0tLT4KLTwhRUxFTUVOVCBhc3NlbWJseS1kZXNjcmlwdG9yIChzZWN1cml0eS1yb2xlKiwgbWV0aG9kLXBlcm1pc3Npb24qLAotCQljb250YWluZXItdHJhbnNhY3Rpb24qKT4KLQotPCEtLQotVGhlIGNtcC1maWVsZCBlbGVtZW50IGRlc2NyaWJlcyBhIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkLiBUaGUgZmllbGQKLWVsZW1lbnQgaW5jbHVkZXMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGZpZWxkLCBhbmQgdGhlIG5hbWUgb2YKLXRoZSBmaWVsZC4KLQotVXNlZCBpbjogZW50aXR5Ci0tLT4KLTwhRUxFTUVOVCBjbXAtZmllbGQgKGRlc2NyaXB0aW9uPywgZmllbGQtbmFtZSk+Ci0KLTwhLS0KLVRoZSBjb250YWluZXItdHJhbnNhY3Rpb24gZWxlbWVudCBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdAotbWFuYWdlIHRyYW5zYWN0aW9uIHNjb3BlcyBmb3IgdGhlIGVudGVycHJpc2UgYmVhbidzIG1ldGhvZCBpbnZvY2F0aW9ucy4KLVRoZSBlbGVtZW50IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhIGxpc3Qgb2YgbWV0aG9kCi1lbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLlRoZSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUgaXMgdG8KLWJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQgbWV0aG9kcy4KLQotVXNlZCBpbjogYXNzZW1ibHktZGVzY3JpcHRvcgotLS0+Ci08IUVMRU1FTlQgY29udGFpbmVyLXRyYW5zYWN0aW9uIChkZXNjcmlwdGlvbj8sIG1ldGhvZCssCi0JCXRyYW5zLWF0dHJpYnV0ZSk+Ci0KLTwhLS0KLVRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlCi10ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LgotCi1UaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphcgotZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlCi0oaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUKLWNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQKLWVsZW1lbnQuCi0KLVVzZWQgaW46IGNtcC1maWVsZCwgY29udGFpbmVyLXRyYW5zYWN0aW9uLCBlamItamFyLCBlbnRpdHksIGVudi1lbnRyeSwKLWVqYi1yZWYsIG1ldGhvZCwgbWV0aG9kLXBlcm1pc3Npb24sIHJlc291cmNlLXJlZiwgc2VjdXJpdHktcm9sZSwKLXNlY3VyaXR5LXJvbGUtcmVmLCBhbmQgc2Vzc2lvbi4KLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi1kaXNwbGF5IGJ5IHRvb2xzLgotCi1Vc2VkIGluOiBlamItamFyLCBzZXNzaW9uLCBhbmQgZW50aXR5Ci0KLUV4YW1wbGU6Ci0JPGRpc3BsYXktbmFtZT5FbXBsb3llZSBTZWxmIFNlcnZpY2U8L2Rpc3BsYXktbmFtZT4KLS0tPgotPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi1lbnRlcnByaXNlIGJlYW4ncyBjbGFzcy4KLQotVXNlZCBpbjogZW50aXR5IGFuZCBzZXNzaW9uCi0KLUV4YW1wbGU6Ci0JCTxlamItY2xhc3M+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZUJlYW48L2VqYi1jbGFzcz4KLS0tPgotPCFFTEVNRU5UIGVqYi1jbGFzcyAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBvcHRpb25hbCBlamItY2xpZW50LWphciBlbGVtZW50IHNwZWNpZmllcyBhIEpBUiBmaWxlIHRoYXQgY29udGFpbnMKLXRoZSBjbGFzcyBmaWxlcyBuZWNlc3NhcnkgZm9yIGEgY2xpZW50IHByb2dyYW0gdG8gYWNjZXNzIHRoZSBlbnRlcnByaXNlCi1iZWFucyBpbiB0aGUgZWpiLWphciBmaWxlLiBUaGUgRGVwbG95ZXIgc2hvdWxkIG1ha2UgdGhlIGVqYi1jbGllbnQgSkFSCi1maWxlIGFjY2Vzc2libGUgdG8gdGhlIGNsaWVudCdzIGNsYXNzLWxvYWRlci4KLQotVXNlZCBpbjogZWpiLWphcgotCi1FeGFtcGxlOgotCTxlamItY2xpZW50LWphcj5lbXBsb3llZV9zZXJ2aWNlX2NsaWVudC5qYXI8L2VqYi1jbGllbnQtamFyPgotLS0+Ci08IUVMRU1FTlQgZWpiLWNsaWVudC1qYXIgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLWphciBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIEVKQiBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZWpiLWphciBmaWxlLAotb3B0aW9uYWwgZGlzcGxheSBuYW1lLCBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZSwgb3B0aW9uYWwgbGFyZ2UKLWljb24gZmlsZSBuYW1lLCBtYW5kYXRvcnkgc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgaW5jbHVkZWQKLWVudGVycHJpc2UgYmVhbnMsIG9wdGlvbmFsIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGRlc2NyaXB0b3IsIGFuZCBhbgotb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUgZWpiLWphci4KLS0tPgotPCFFTEVNRU5UIGVqYi1qYXIgKGRlc2NyaXB0aW9uPywgZGlzcGxheS1uYW1lPywgc21hbGwtaWNvbj8sCi0JCWxhcmdlLWljb24/LCBlbnRlcnByaXNlLWJlYW5zLCBhc3NlbWJseS1kZXNjcmlwdG9yPywKLQkJZWpiLWNsaWVudC1qYXI/KT4KLQotPCEtLQotVGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgZWpiLXJlZiBlbGVtZW50IHRvIHNwZWNpZnkgdGhhdCBhbgotRUpCIHJlZmVyZW5jZSBpcyBsaW5rZWQgdG8gYW5vdGhlciBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIGVqYi1qYXIKLWZpbGUuCi0KLVRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbiBlbnRlcnByaXNlCi1iZWFuIGluIHRoZSBzYW1lIGVqYi1qYXIgZmlsZSwgb3IgaW4gYW5vdGhlciBlamItamFyIGZpbGUgaW4gdGhlIHNhbWUKLUoyRUUgYXBwbGljYXRpb24gdW5pdC4KLQotVXNlZCBpbjogZWpiLXJlZgotCi1FeGFtcGxlOgotCQk8ZWpiLWxpbms+RW1wbG95ZWVSZWNvcmQ8L2VqYi1saW5rPgotLS0+Ci08IUVMRU1FTlQgZWpiLWxpbmsgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbmFtZS4gVGhpcyBuYW1lIGlzCi1hc3NpZ25lZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIG5hbWUgdGhlIGVudGVycHJpc2UgYmVhbiBpbgotdGhlIGVqYi1qYXIgZmlsZSdzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgYW1vbmcKLXRoZSBuYW1lcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgc2FtZSBlamItamFyIGZpbGUuCi0KLVRoZSBlbnRlcnByaXNlIGJlYW4gY29kZSBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIG5hbWU7IHRoZXJlZm9yZSB0aGUKLW5hbWUgY2FuIGJlIGNoYW5nZWQgZHVyaW5nIHRoZSBhcHBsaWNhdGlvbi1hc3NlbWJseSBwcm9jZXNzIHdpdGhvdXQKLWJyZWFraW5nIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBmdW5jdGlvbi4KLQotVGhlcmUgaXMgbm8gYXJjaGl0ZWN0ZWQgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGVqYi1uYW1lIGluIHRoZQotZGVwbG95bWVudCBkZXNjcmlwdG9yIGFuZCB0aGUgSk5ESSBuYW1lIHRoYXQgdGhlIERlcGxveWVyIHdpbGwgYXNzaWduCi10byB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4KLQotVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhbiBOTVRPS0VOLgotCi1Vc2VkIGluOiBlbnRpdHksIG1ldGhvZCwgYW5kIHNlc3Npb24KLQotRXhhbXBsZToKLQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBlamItbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVmIGVsZW1lbnQgaXMgdXNlZCBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvCi1hbm90aGVyIGVudGVycHJpc2UgYmVhbidzIGhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotZGVzY3JpcHRpb247IHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgcmVmZXJlbmNpbmcKLWVudGVycHJpc2UgYmVhbjsgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuOwotdGhlIGV4cGVjdGVkIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UKLWJlYW47IGFuZCBhbiBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbi4KLQotVGhlIG9wdGlvbmFsIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSByZWZlcmVuY2VkCi1lbnRlcnByaXNlIGJlYW4uIEl0IGlzIHVzZWQgdHlwaWNhbGx5IGluIGVqYi1qYXIgZmlsZXMgdGhhdCBjb250YWluIGFuCi1hc3NlbWJsZWQgYXBwbGljYXRpb24uCi0KLVVzZWQgaW46IGVudGl0eSBhbmQgc2Vzc2lvbgotLS0+Ci08IUVMRU1FTlQgZWpiLXJlZiAoZGVzY3JpcHRpb24/LCBlamItcmVmLW5hbWUsIGVqYi1yZWYtdHlwZSwgaG9tZSwKLQkJcmVtb3RlLCBlamItbGluaz8pPgotCi08IS0tCi1UaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCIHJlZmVyZW5jZS4gVGhlIEVKQgotcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBlbnZpcm9ubWVudC4KLQotSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi1Vc2VkIGluOiBlamItcmVmCi0KLUV4YW1wbGU6Ci0JCTxlamItcmVmLW5hbWU+ZWpiL1BheXJvbGw8L2VqYi1yZWYtbmFtZT4KLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZAotZW50ZXJwcmlzZSBiZWFuLgotCi1UaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQkJPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLQkJPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0KLVVzZWQgaW46IGVqYi1yZWYKLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnRlcnByaXNlLWJlYW5zIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBvZiBvbmUgb3IgbW9yZQotZW50ZXJwcmlzZSBiZWFucy4KLS0tPgotPCFFTEVNRU5UIGVudGVycHJpc2UtYmVhbnMgKHNlc3Npb24gfCBlbnRpdHkpKz4KLQotPCEtLQotVGhlIGVudGl0eSBlbGVtZW50IGRlY2xhcmVzIGFuIGVudGl0eSBiZWFuLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMKLW9mOiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgb3B0aW9uYWwgZGlzcGxheSBuYW1lOyBvcHRpb25hbCBzbWFsbCBpY29uCi1maWxlIG5hbWU7IG9wdGlvbmFsIGxhcmdlIGljb24gZmlsZSBuYW1lOyBhIG5hbWUgYXNzaWduZWQgdG8gdGhlCi1lbnRlcnByaXNlIGJlYW4gaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcjsgdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkKLWJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlczsgdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24KLWNsYXNzOyB0aGUgZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZSBtYW5hZ2VtZW50IHR5cGU7IHRoZSBlbnRpdHkgYmVhbidzCi1wcmltYXJ5IGtleSBjbGFzcyBuYW1lOyBhbiBpbmRpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlZW50cmFuY3k7Ci1hbiBvcHRpb25hbCBsaXN0IG9mIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkczsgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbgotb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi1lbnZpcm9ubWVudCBlbnRyaWVzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQgotcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlczsKLWFuZCBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbgotZmFjdG9yeSByZWZlcmVuY2VzLgotCi1UaGUgb3B0aW9uYWwgcHJpbWtleS1maWVsZCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZiB0aGUKLWVudGl0eSdzIHBlcnNpc3RlbmN5LXR5cGUgaXMgQ29udGFpbmVyLgotCi1UaGUgb3RoZXIgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlIHRoYXQKLXRoZXkgYXJlIG9taXR0ZWQgaWYgdGhlIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LgotCi1BdCBsZWFzdCBvbmUgY21wLWZpZWxkIGVsZW1lbnQgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yIGlmIHRoZQotZW50aXR5J3MgcGVyc2lzdGVuY3ktdHlwZSBpcyBDb250YWluZXIsIGFuZCBub25lIG11c3Qgbm90IGJlIHByZXNlbnQgaWYKLXRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIEJlYW4uCi0KLVVzZWQgaW46IGVudGVycHJpc2UtYmVhbnMKLS0tPgotPCFFTEVNRU5UIGVudGl0eSAoZGVzY3JpcHRpb24/LCBkaXNwbGF5LW5hbWU/LCBzbWFsbC1pY29uPywKLQkJbGFyZ2UtaWNvbj8sIGVqYi1uYW1lLCBob21lLCByZW1vdGUsIGVqYi1jbGFzcywKLQkJcGVyc2lzdGVuY2UtdHlwZSwgcHJpbS1rZXktY2xhc3MsIHJlZW50cmFudCwKLQkJY21wLWZpZWxkKiwgcHJpbWtleS1maWVsZD8sIGVudi1lbnRyeSosCi0JCWVqYi1yZWYqLCBzZWN1cml0eS1yb2xlLXJlZiosIHJlc291cmNlLXJlZiopPgotCi08IS0tCi1UaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGVudGVycHJpc2UgYmVhbidzCi1lbnZpcm9ubWVudCBlbnRyaWVzLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLWRlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiBvcHRpb25hbCB2YWx1ZS4KLQotVXNlZCBpbjogZW50aXR5IGFuZCBzZXNzaW9uCi0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnkgKGRlc2NyaXB0aW9uPywgZW52LWVudHJ5LW5hbWUsIGVudi1lbnRyeS10eXBlLAotCQllbnYtZW50cnktdmFsdWU/KT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLWVudmlyb25tZW50IGVudHJ5LgotCi1Vc2VkIGluOiBlbnYtZW50cnkKLQotRXhhbXBsZToKLQkJPGVudi1lbnRyeS1uYW1lPm1pbkFtb3VudDwvZW52LWVudHJ5LW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mCi10aGUgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MKLWNvZGUuCi0KLVRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgZW52LWVudHJ5LXR5cGU6Ci1qYXZhLmxhbmcuQm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsCi1qYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwgamF2YS5sYW5nLlNob3J0LCBqYXZhLmxhbmcuTG9uZywgYW5kCi1qYXZhLmxhbmcuRmxvYXQuCi0KLVVzZWQgaW46IGVudi1lbnRyeQotCi1FeGFtcGxlOgotCQk8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGFuIGVudGVycHJpc2UgYmVhbidzCi1lbnZpcm9ubWVudCBlbnRyeS4KLQotVXNlZCBpbjogZW52LWVudHJ5Ci0KLUV4YW1wbGU6Ci0JCTxlbnYtZW50cnktdmFsdWU+MTAwLjAwPC9lbnYtZW50cnktdmFsdWU+Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZmllbGQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGNvbnRhaW5lciBtYW5hZ2VkIGZpZWxkLgotVGhlIG5hbWUgbXVzdCBiZSBhIHB1YmxpYyBmaWVsZCBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIG9yIG9uZSBvZgotaXRzIHN1cGVyY2xhc3Nlcy4KLQotVXNlZCBpbjogY21wLWZpZWxkCi0KLUV4YW1wbGU6Ci0JCTxmaWVsZC1uYW1lPmZpcnN0TmFtZTwvZmllbGQtTmFtZT4KLS0tPgotPCFFTEVNRU5UIGZpZWxkLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZQotYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItcmVmLCBlbnRpdHksIGFuZCBzZXNzaW9uCi0KLUV4YW1wbGU6Ci0JCTxob21lPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxIb21lPC9ob21lPgotLS0+Ci08IUVMRU1FTlQgaG9tZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIGNvbnRhaW5pbmcgYSBsYXJnZQotKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlIG5hbWUgaXMgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIGVqYi1qYXIKLWZpbGUuCi0KLVRoZSBpbWFnZSBtdXN0IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LCBhbmQgdGhlIGZpbGUgbmFtZQotbXVzdCBlbmQgd2l0aCB0aGUgc3VmZml4ICIuanBnIiBvciAiLmdpZiIgcmVzcGVjdGl2ZWx5LiAgVGhlIGljb24gY2FuCi1iZSB1c2VkIGJ5IHRvb2xzLgotCi1FeGFtcGxlOgotCTxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLS0tPgotPCFFTEVNRU5UIGxhcmdlLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbWV0aG9kIGVsZW1lbnQgaXMgdXNlZCB0byBkZW5vdGUgYSBtZXRob2Qgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLWhvbWUgb3IgcmVtb3RlIGludGVyZmFjZSwgb3IgYSBzZXQgb2YgbWV0aG9kcy4gVGhlIGVqYi1uYW1lIGVsZW1lbnQKLW11c3QgYmUgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW5zIGluIGRlY2xhcmVkIGluIHRoZQotZGVwbG95bWVudCBkZXNjcmlwdG9yOyB0aGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBhbGxvd3MgdG8KLWRpc3Rpbmd1aXNoIGJldHdlZW4gYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgdGhhdCBpcyBkZWZpbmVkIGluCi1ib3RoIHRoZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlOyB0aGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMKLXRoZSBtZXRob2QgbmFtZTsgYW5kIHRoZSBvcHRpb25hbCBtZXRob2QtcGFyYW1zIGVsZW1lbnRzIGlkZW50aWZ5IGEKLXNpbmdsZSBtZXRob2QgYW1vbmcgbXVsdGlwbGUgbWV0aG9kcyB3aXRoIGFuIG92ZXJsb2FkZWQgbWV0aG9kIG5hbWUuCi0KLVRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBzdHlsZXMgb2YgdGhlIG1ldGhvZCBlbGVtZW50IHN5bnRheDoKLQotMS4gCTxtZXRob2Q+Ci0JCTxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgIAkJPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotCTwvbWV0aG9kPgotCi0gICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBzcGVjaWZpZWQKLSAgIGVudGVycHJpc2UgYmVhbidzIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLgotCi0yLiAJPG1ldGhvZD4KLQkJPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICAgCQk8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLQk8L21ldGhvZD4+Ci0KLSAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byB0aGUgc3BlY2lmaWVkIG1ldGhvZCBvZiB0aGUKLSAgIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4uIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBtZXRob2RzIHdpdGgKLSAgIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhlIGVsZW1lbnQgb2YgdGhpcyBzdHlsZSByZWZlcnMgdG8KLSAgIGFsbCB0aGUgbWV0aG9kcyB3aXRoIHRoZSBvdmVybG9hZGVkIG5hbWUuCi0KLQotCi0KLQotMy4gCTxtZXRob2Q+Ci0JCTxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgIAkJPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci0JCTxtZXRob2QtcGFyYW1zPgotICAgCQkJPG1ldGhvZC1wYXJhbT5QQVJBTS0xPC9tZXRob2QtcGFyYW0+Ci0gICAJCQk8bWV0aG9kLXBhcmFtPlBBUkFNLTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAJCQkuLi4KLSAgIAkJCTxtZXRob2QtcGFyYW0+UEFSQU0tbjwvbWV0aG9kLXBhcmFtPgotCQk8L21ldGhvZC1wYXJhbXM+Ci0JPG1ldGhvZD4JCi0KLSAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEgc2V0IG9mCi0gICBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBuYW1lLiBQQVJBTS0xIHRocm91Z2ggUEFSQU0tbiBhcmUgdGhlCi0gICBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlcyBvZiB0aGUgbWV0aG9kJ3MgaW5wdXQgcGFyYW1ldGVycyAoaWYKLSAgIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0IGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudAotICAgY29udGFpbnMgbm8gbWV0aG9kLXBhcmFtIGVsZW1lbnRzKS4gQXJyYXlzIGFyZSBzcGVjaWZpZWQgYnkgdGhlCi0gICBhcnJheSBlbGVtZW50J3MgdHlwZSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGFpciBvZiBzcXVhcmUKLSAgIGJyYWNrZXRzIChlLmcuIGludFtdW10pLgotCi0KLVVzZWQgaW46IG1ldGhvZC1wZXJtaXNzaW9uIGFuZCBjb250YWluZXItdHJhbnNhY3Rpb24KLQotRXhhbXBsZXM6Ci0KLSAgICBTdHlsZSAxOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlIG1ldGhvZHMgb2YKLQkJdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXM6Ci0KLQkJPG1ldGhvZD4KLQkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCQkJPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotCQk8L21ldGhvZD4KLQotCVN0eWxlIDI6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUgY3JlYXRlCi0JCW1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0KLSAgICAJCTxtZXRob2Q+Ci0JCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkJCTxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotCQk8L21ldGhvZD4KLQotCVN0eWxlIDM6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIHRoZQotCQljcmVhdGUoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIExhc3ROYW1lKSBtZXRob2Qgb2YgdGhlCi0JIAlFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotCi0gICAgCQk8bWV0aG9kPgotCQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JCQk8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkJCTxtZXRob2QtcGFyYW1zPgotCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCQkJPC9tZXRob2QtcGFyYW1zPgotCQk8L21ldGhvZD4KLQotCQotCVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBhIFN0eWxlIDMgZWxlbWVudCB3aXRoCi0JbW9yZSBjb21wbGV4IHBhcmFtZXRlciB0eXBlcy4gVGhlIG1ldGhvZAotCQkJZm9vYmFyKGNoYXIgcywgaW50IGksIGludFtdIGlhciwgbXlwYWNrYWdlLk15Q2xhc3MgbXljbCwKLQkJCQlteXBhY2thZ2UuTXlDbGFzc1tdW10gbXljbGFhcikKLSAgICAgICAgd291bGQgYmUgc3BlY2lmaWVkIGFzOgotCi0gICAgCQk8bWV0aG9kPgotCQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JCQk8bWV0aG9kLW5hbWU+Zm9vYmFyPC9tZXRob2QtbmFtZT4KLQkJCTxtZXRob2QtcGFyYW1zPgotCQkJCTxtZXRob2QtcGFyYW0+Y2hhcjwvbWV0aG9kLXBhcmFtPgotCQkJCTxtZXRob2QtcGFyYW0+aW50PC9tZXRob2QtcGFyYW0+Ci0JCQkJPG1ldGhvZC1wYXJhbT5pbnRbXTwvbWV0aG9kLXBhcmFtPgotCQkJCTxtZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3M8L21ldGhvZC1wYXJhbT4KLQkJCQk8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzW11bXTwvbWV0aG9kLXBhcmFtPgotCQkJPC9tZXRob2QtcGFyYW1zPgotCQk8L21ldGhvZD4KLQotCVRoZSBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGNhbiBiZSB1c2VkIHdoZW4gaXQgYmVjb21lcwotICAgbmVjZXNzYXJ5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhIG1ldGhvZCBkZWZpbmVkIGluIHRoZSBob21lCi0gICBpbnRlcmZhY2UgYW5kIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgc2lnbmF0dXJlIHRoYXQgaXMKLSAgIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UuCi0KLQlGb3IgZXhhbXBsZSwgdGhlIG1ldGhvZCBlbGVtZW50Ci0KLSAgIAkJPG1ldGhvZD4KLQkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCQkJPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0JCQk8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkJCTxtZXRob2QtcGFyYW1zPgotCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCQkJPC9tZXRob2QtcGFyYW1zPgotCQk8L21ldGhvZD4KLQotCWNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykgbWV0aG9kCi0gICBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlIGZyb20gdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykKLSAgIG1ldGhvZCBkZWZpbmVkIGluIHRoZSBob21lIGludGVyZmFjZSwgd2hpY2ggd291bGQgYmUgZGVmaW5lZCBhcwotCi0gICAJCTxtZXRob2Q+Ci0JCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkJCTxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLQkJCTxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotCQkJPG1ldGhvZC1wYXJhbXM+Ci0JCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCQk8L21ldGhvZC1wYXJhbXM+Ci0JCTwvbWV0aG9kPgotCi0tLT4KLTwhRUxFTUVOVCBtZXRob2QgKGRlc2NyaXB0aW9uPywgZWpiLW5hbWUsIG1ldGhvZC1pbnRmPywgbWV0aG9kLW5hbWUsCi0JCQltZXRob2QtcGFyYW1zPyk+Ci0KLTwhLS0KLVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyBhIG1ldGhvZCBlbGVtZW50IHRvIGRpZmZlcmVudGlhdGUKLWJldHdlZW4gdGhlIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBzaWduYXR1cmUgdGhhdCBhcmUgZGVmaW5lZAotaW4gYm90aCB0aGUgcmVtb3RlIGFuZCBob21lIGludGVyZmFjZXMuCi0KLVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JCTxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLQkJPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0KLVVzZWQgaW46IG1ldGhvZAotLS0+Ci08IUVMRU1FTlQgbWV0aG9kLWludGYgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBjb250YWlucyBhIG5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIG1ldGhvZCwKLW9yIHRoZSBhc3RlcmlzayAoKikgY2hhcmFjdGVyLiBUaGUgYXN0ZXJpc2sgaXMgdXNlZCB3aGVuIHRoZSBlbGVtZW50Ci1kZW5vdGVzIGFsbCB0aGUgbWV0aG9kcyBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgYW5kIGhvbWUKLWludGVyZmFjZXMuCi0KLVVzZWQgaW46IG1ldGhvZAotLS0+Ci08IUVMRU1FTlQgbWV0aG9kLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbWV0aG9kLXBhcmFtIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZSBvZgotYSBtZXRob2QgcGFyYW1ldGVyLgotCi1Vc2VkIGluOiBtZXRob2QtcGFyYW1zCi0tLT4KLTwhRUxFTUVOVCBtZXRob2QtcGFyYW0gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbWV0aG9kLXBhcmFtcyBlbGVtZW50IGNvbnRhaW5zIGEgbGlzdCBvZiB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEKLXR5cGUgbmFtZXMgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzLgotCi1Vc2VkIGluOiBtZXRob2QKLS0tPgotPCFFTEVNRU5UIG1ldGhvZC1wYXJhbXMgKG1ldGhvZC1wYXJhbSopPgotCi08IS0tCi1UaGUgbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBzcGVjaWZpZXMgdGhhdCBvbmUgb3IgbW9yZSBzZWN1cml0eSByb2xlcwotYXJlIGFsbG93ZWQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGVudGVycHJpc2UgYmVhbiBtZXRob2RzLiBUaGUKLW1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdAotb2Ygc2VjdXJpdHkgcm9sZSBuYW1lcywgYW5kIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMuCi0KLVRoZSBzZWN1cml0eSByb2xlcyB1c2VkIGluIHRoZSBtZXRob2QtcGVybWlzc2lvbiBlbGVtZW50IG11c3QgYmUKLWRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBhbmQKLXRoZSBtZXRob2RzIG11c3QgYmUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUKLWFuZC9vciBob21lIGludGVyZmFjZXMuCi0KLVVzZWQgaW46IGFzc2VtYmx5LWRlc2NyaXB0b3IKLS0tPgotPCFFTEVNRU5UIG1ldGhvZC1wZXJtaXNzaW9uIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSssIG1ldGhvZCspPgotCi08IS0tCi1UaGUgcGVyc2lzdGVuY2UtdHlwZSBlbGVtZW50IHNwZWNpZmllcyBhbiBlbnRpdHkgYmVhbidzIHBlcnNpc3RlbmNlCi1tYW5hZ2VtZW50IHR5cGUuCi0KLVRoZSBwZXJzaXN0ZW5jZS10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0JCTxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0JCTxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLQotVXNlZCBpbjogZW50aXR5Ci0tLT4KLTwhRUxFTUVOVCBwZXJzaXN0ZW5jZS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHByaW0ta2V5LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi1lbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzLgotCi1JZiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgaXMgZGVmZXJyZWQgdG8gZGVwbG95bWVudAotdGltZSwgdGhlIHByaW0ta2V5LWNsYXNzIGVsZW1lbnQgc2hvdWxkIHNwZWNpZnkgamF2YS5sYW5nLk9iamVjdC4KLQotVXNlZCBpbjogZW50aXR5Ci0KLUV4YW1wbGVzOgotCTxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9wcmltLWtleS1jbGFzcz4KLQk8cHJpbS1rZXktY2xhc3M+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlSUQ8L3ByaW0ta2V5LWNsYXNzPgotCTxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuT2JqZWN0PC9wcmltLWtleS1jbGFzcz4KLQotLS0+Ci08IUVMRU1FTlQgcHJpbS1rZXktY2xhc3MgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgcHJpbWFyeQota2V5IGZpZWxkIGZvciBhbiBlbnRpdHkgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4KLQotVGhlIHByaW1rZXktZmllbGQgbXVzdCBiZSBvbmUgb2YgdGhlIGZpZWxkcyBkZWNsYXJlZCBpbiB0aGUgY21wLWZpZWxkCi1lbGVtZW50LCBhbmQgdGhlIHR5cGUgb2YgdGhlIGZpZWxkIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIHByaW1hcnkga2V5Ci10eXBlLgotCi1UaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIG5vdCB1c2VkIGlmIHRoZSBwcmltYXJ5IGtleSBtYXBzIHRvCi1tdWx0aXBsZSBjb250YWluZXItbWFuYWdlZCBmaWVsZHMgKGkuZS4gdGhlIGtleSBpcyBhIGNvbXBvdW5kIGtleSkuIEluCi10aGlzIGNhc2UsIHRoZSBmaWVsZHMgb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQKLXRoZWlyIG5hbWVzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgZmllbGQgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuIGNsYXNzCi10aGF0IGNvbXByaXNlIHRoZSBrZXkuCi0KLVVzZWQgaW46IGVudGl0eQotCi1FeGFtcGxlOgotCTxwcmlta2V5LWZpZWxkPkVtcGxveWVlSWQ8L3ByaW1rZXktZmllbGQ+Ci0tLT4KLTwhRUxFTUVOVCBwcmlta2V5LWZpZWxkICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlZW50cmFudCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGFuIGVudGl0eSBiZWFuIGlzIHJlZW50cmFudCBvciBub3QuCi0KLVRoZSByZWVudHJhbnQgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQkJPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0JCTxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLQotVXNlZCBpbjogZW50aXR5Ci0tLT4KLTwhRUxFTUVOVCByZWVudHJhbnQgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlCi1iZWFuJ3MgcmVtb3RlIGludGVyZmFjZS4KLQotVXNlZCBpbjogZWpiLXJlZiwgZW50aXR5LCBhbmQgc2Vzc2lvbgotCi1FeGFtcGxlOgotCQk8cmVtb3RlPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2U8L3JlbW90ZT4KLS0tPgotPCFFTEVNRU5UIHJlbW90ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtYXV0aCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBlbnRlcnByaXNlIGJlYW4gY29kZSBzaWducwotb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3Igd2hldGhlciB0aGUgQ29udGFpbmVyCi13aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIgb24gYmVoYWxmIG9mIHRoZSBiZWFuLiBJbiB0aGUKLWxhdHRlciBjYXNlLCB0aGUgQ29udGFpbmVyIHVzZXMgaW5mb3JtYXRpb24gdGhhdCBpcyBzdXBwbGllZCBieSB0aGUKLURlcGxveWVyLgotCi1UaGUgdmFsdWUgb2YgdGhpcyBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCQk8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotCQk8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLS0tPgotPCFFTEVNRU5UIHJlcy1hdXRoICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIHJlc291cmNlIG1hbmFnZXIKLWNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuCi0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhIHNvdXJjZS4gVGhlIHR5cGUgaXMKLXNwZWNpZmllZCBieSB0aGUgSmF2YSBpbnRlcmZhY2UgKG9yIGNsYXNzKSBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZAotYnkgdGhlIGRhdGEgc291cmNlLgotCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgZW50ZXJwcmlzZSBiZWFuJ3MKLXJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLWRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUsCi10aGUgaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZSBleHBlY3RlZAotYnkgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLCBhbmQgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRpb24gKGJlYW4gb3IKLWNvbnRhaW5lcikuCi0KLVVzZWQgaW46IGVudGl0eSBhbmQgc2Vzc2lvbgotCi1FeGFtcGxlOgotCQk8cmVzb3VyY2UtcmVmPgotCQkJPHJlcy1yZWYtbmFtZT5FbXBsb3llZUFwcERCPC9yZXMtcmVmLW5hbWU+Ci0JCQk8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPgotCQkJPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0JCTwvcmVzb3VyY2UtcmVmPgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtcmVmIChkZXNjcmlwdGlvbj8sIHJlcy1yZWYtbmFtZSwgcmVzLXR5cGUsCi0JCQlyZXMtYXV0aCk+Ci0KLTwhLS0KLVRoZSByb2xlLWxpbmsgZWxlbWVudCBpcyB1c2VkIHRvIGxpbmsgYSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSB0byBhCi1kZWZpbmVkIHNlY3VyaXR5IHJvbGUuIFRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4gdGhlIG5hbWUgb2YKLW9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4KLQotVXNlZCBpbjogc2VjdXJpdHktcm9sZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJvbGUtbGluayAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLVRoZSBuYW1lIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYW4gTk1UT0tFTi4KLQotVXNlZCBpbjogbWV0aG9kLXBlcm1pc3Npb24sIHNlY3VyaXR5LXJvbGUsIGFuZCBzZWN1cml0eS1yb2xlLXJlZgotLS0+Ci08IUVMRU1FTlQgcm9sZS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNlY3VyaXR5IHJvbGUuCi1UaGUgZGVmaW5pdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgc2VjdXJpdHkKLXJvbGUsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lLgotCi1Vc2VkIGluOiBhc3NlbWJseS1kZXNjcmlwdG9yCi0KLUV4YW1wbGU6Ci0JCTxzZWN1cml0eS1yb2xlPgotCQkJPGRlc2NyaXB0aW9uPgotCQkJCVRoaXMgcm9sZSBpbmNsdWRlcyBhbGwgZW1wbG95ZWVzIHdobwotCQkJCWFyZSBhdXRob3JpemVkIHRvIGFjY2VzcyB0aGUgZW1wbG95ZWUKLQkJCQlzZXJ2aWNlIGFwcGxpY2F0aW9uLgotCQkJPC9kZXNjcmlwdGlvbj4KLQkJCTxyb2xlLW5hbWU+ZW1wbG95ZWU8L3JvbGUtbmFtZT4KLQkJPC9zZWN1cml0eS1yb2xlPgotLS0+Ci08IUVMRU1FTlQgc2VjdXJpdHktcm9sZSAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUpPgotCi08IS0tCi1UaGUgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSBzZWN1cml0eQotcm9sZSByZWZlcmVuY2UgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIGNvZGUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cwotb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSBzZWN1cml0eSByb2xlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSwKLWFuZCBhbiBvcHRpb25hbCBsaW5rIHRvIGEgZGVmaW5lZCBzZWN1cml0eSByb2xlLgotCi1UaGUgdmFsdWUgb2YgdGhlIHJvbGUtbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIFN0cmluZyB1c2VkIGFzIHRoZQotcGFyYW1ldGVyIHRvIHRoZSBFSkJDb250ZXh0LmlzQ2FsbGVySW5Sb2xlKFN0cmluZyByb2xlTmFtZSkgbWV0aG9kLgotCi1UaGUgdmFsdWUgb2YgdGhlIHJvbGUtbGluayBlbGVtZW50IG11c3QgYmUgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZQotc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4KLQotVXNlZCBpbjogZW50aXR5IGFuZCBzZXNzaW9uCi0KLS0tPgotPCFFTEVNRU5UIHNlY3VyaXR5LXJvbGUtcmVmIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSwgcm9sZS1saW5rPyk+Ci0KLTwhLS0KLVRoZSBzZXNzaW9uLXR5cGUgZWxlbWVudCBkZXNjcmliZXMgd2hldGhlciB0aGUgc2Vzc2lvbiBiZWFuIGlzIGEKLXN0YXRlZnVsIHNlc3Npb24sIG9yIHN0YXRlbGVzcyBzZXNzaW9uLgotCi1UaGUgc2Vzc2lvbi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0JCTxzZXNzaW9uLXR5cGU+U3RhdGVmdWw8L3Nlc3Npb24tdHlwZT4KLQkJPHNlc3Npb24tdHlwZT5TdGF0ZWxlc3M8L3Nlc3Npb24tdHlwZT4KLS0tPgotPCFFTEVNRU5UIHNlc3Npb24tdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzZXNzaW9uIGVsZW1lbnQgZGVjbGFyZXMgYW4gc2Vzc2lvbiBiZWFuLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMKLW9mOiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgb3B0aW9uYWwgZGlzcGxheSBuYW1lOyBvcHRpb25hbCBzbWFsbCBpY29uCi1maWxlIG5hbWU7IG9wdGlvbmFsIGxhcmdlIGljb24gZmlsZSBuYW1lOyBhIG5hbWUgYXNzaWduZWQgdG8gdGhlCi1lbnRlcnByaXNlIGJlYW4gaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRpb247IHRoZSBuYW1lcyBvZiB0aGUgc2Vzc2lvbgotYmVhbidzIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzOyB0aGUgc2Vzc2lvbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24KLWNsYXNzOyB0aGUgc2Vzc2lvbiBiZWFuJ3Mgc3RhdGUgbWFuYWdlbWVudCB0eXBlOyB0aGUgc2Vzc2lvbiBiZWFuJ3MKLXRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZTsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotZW52aXJvbm1lbnQgZW50cmllczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIKLXJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXM7Ci1hbmQgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24KLWZhY3RvcnkgcmVmZXJlbmNlcy4KLQotVGhlIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkKLWFyZSBvbWl0dGVkIHdoZW4gaWYgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuCi0KLVVzZWQgaW46IGVudGVycHJpc2UtYmVhbnMKLS0tPgotPCFFTEVNRU5UIHNlc3Npb24gKGRlc2NyaXB0aW9uPywgZGlzcGxheS1uYW1lPywgc21hbGwtaWNvbj8sCi0JCWxhcmdlLWljb24/LCBlamItbmFtZSwgaG9tZSwgcmVtb3RlLCBlamItY2xhc3MsCi0JCXNlc3Npb24tdHlwZSwgdHJhbnNhY3Rpb24tdHlwZSwgZW52LWVudHJ5KiwKLQkJZWpiLXJlZiosIHNlY3VyaXR5LXJvbGUtcmVmKiwgcmVzb3VyY2UtcmVmKik+Ci0KLTwhLS0KLVRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIGNvbnRhaW5pbmcgYSBzbWFsbAotKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlIG5hbWUgaXMgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIGVqYi1qYXIKLWZpbGUuCi0KLVRoZSBpbWFnZSBtdXN0IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LCBhbmQgdGhlIGZpbGUgbmFtZQotbXVzdCBlbmQgd2l0aCB0aGUgc3VmZml4ICIuanBnIiBvciAiLmdpZiIgcmVzcGVjdGl2ZWx5LgotCi1UaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotRXhhbXBsZToKLQk8c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgdHJhbnNhY3Rpb24KLW1hbmFnZW1lbnQgdHlwZS4KLQotVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQkJPHRyYW5zYWN0aW9uLXR5cGU+QmVhbjwvdHJhbnNhY3Rpb24tdHlwZT4KLQkJPHRyYW5zYWN0aW9uLXR5cGU+Q29udGFpbmVyPC90cmFuc2FjdGlvbi10eXBlPgotCi1Vc2VkIGluOiBzZXNzaW9uCi0tLT4KLTwhRUxFTUVOVCB0cmFuc2FjdGlvbi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHRyYW5zLWF0dHJpYnV0ZSBlbGVtZW50IHNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lciBtdXN0IG1hbmFnZSB0aGUKLXRyYW5zYWN0aW9uIGJvdW5kYXJpZXMgd2hlbiBkZWxlZ2F0aW5nIGEgbWV0aG9kIGludm9jYXRpb24gdG8gYW4KLWVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzIG1ldGhvZC4KLQotVGhlIHZhbHVlIG9mIHRyYW5zLWF0dHJpYnV0ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCQk8dHJhbnMtYXR0cmlidXRlPk5vdFN1cHBvcnRlZDwvdHJhbnMtYXR0cmlidXRlPgotCQk8dHJhbnMtYXR0cmlidXRlPlN1cHBvcnRzPC90cmFucy1hdHRyaWJ1dGU+Ci0JCTx0cmFucy1hdHRyaWJ1dGU+UmVxdWlyZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLQkJPHRyYW5zLWF0dHJpYnV0ZT5SZXF1aXJlc05ldzwvdHJhbnMtYXR0cmlidXRlPgotCQk8dHJhbnMtYXR0cmlidXRlPk1hbmRhdG9yeTwvdHJhbnMtYXR0cmlidXRlPgotCQk8dHJhbnMtYXR0cmlidXRlPk5ldmVyPC90cmFucy1hdHRyaWJ1dGU+Ci0KLVVzZWQgaW46IGNvbnRhaW5lci10cmFuc2FjdGlvbgotLS0+Ci08IUVMRU1FTlQgdHJhbnMtYXR0cmlidXRlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIElEIG1lY2hhbmlzbSBpcyB0byBhbGxvdyB0b29scyB0aGF0IHByb2R1Y2UgYWRkaXRpb25hbCBkZXBsb3ltZW50Ci1pbmZvcm1hdGlvbiAoaS5lIGluZm9ybWF0aW9uIGJleW9uZCB0aGUgc3RhbmRhcmQgRUpCIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IgaW5mb3JtYXRpb24pIHRvIHN0b3JlIHRoZSBub24tc3RhbmRhcmQgaW5mb3JtYXRpb24gaW4gYQotc2VwYXJhdGUgZmlsZSwgYW5kIGVhc2lseSByZWZlciBmcm9tIHRoZXNlIHRvb2xzLXNwZWNpZmljIGZpbGVzIHRvIHRoZQotaW5mb3JtYXRpb24gaW4gdGhlIHN0YW5kYXJkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotVGhlIEVKQiBhcmNoaXRlY3R1cmUgZG9lcyBub3QgYWxsb3cgdGhlIHRvb2xzIHRvIGFkZCB0aGUgbm9uLXN0YW5kYXJkCi1pbmZvcm1hdGlvbiBpbnRvIHRoZSBFSkIgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotLS0+Ci08IUFUVExJU1QgYXNzZW1ibHktZGVzY3JpcHRvciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjbXAtZmllbGQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udGFpbmVyLXRyYW5zYWN0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRpc3BsYXktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWNsaWVudC1qYXIgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWphciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItbGluayBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW50ZXJwcmlzZS1iZWFucyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnRpdHkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmaWVsZC1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGhvbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGFyZ2UtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXRob2QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWV0aG9kLWludGYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWV0aG9kLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWV0aG9kLXBhcmFtIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1ldGhvZC1wYXJhbXMgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWV0aG9kLXBlcm1pc3Npb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcGVyc2lzdGVuY2UtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcmltLWtleS1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcmlta2V5LWZpZWxkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlZW50cmFudCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW1vdGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLWF1dGggaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByb2xlLWxpbmsgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgcm9sZS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LXJvbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktcm9sZS1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2Vzc2lvbi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlc3Npb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc21hbGwtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0cmFuc2FjdGlvbi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRyYW5zLWF0dHJpYnV0ZSBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8yXzAuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9lamItamFyXzJfMC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMmNjN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9lamItamFyXzJfMC5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcxICswLDAgQEAKLTwhLS0KLUNvcHlyaWdodCAoYykgMjAwMCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLAotOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyByZWxhdGluZyB0bwotdGVjaG5vbG9neSBlbWJvZGllZCBpbiB0aGUgcHJvZHVjdCB0aGF0IGlzIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LgotSW4gcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cyBsaXN0ZWQgYXQKLWh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZSBhZGRpdGlvbmFsIHBhdGVudHMgb3IKLXBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUgVS5TLiBhbmQgaW4gb3RoZXIgY291bnRyaWVzLgotCi1UaGlzIGRvY3VtZW50IGFuZCB0aGUgcHJvZHVjdCB0byB3aGljaCBpdCBwZXJ0YWlucyBhcmUgZGlzdHJpYnV0ZWQKLXVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywgZGlzdHJpYnV0aW9uLCBhbmQKLWRlY29tcGlsYXRpb24uICBUaGlzIGRvY3VtZW50IG1heSBiZSByZXByb2R1Y2VkIGFuZCBkaXN0cmlidXRlZCBidXQgbWF5Ci1ub3QgYmUgY2hhbmdlZCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cwotbGljZW5zb3JzLCBpZiBhbnkuCi0KLVRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcyBjb3B5cmlnaHRlZCBhbmQKLWxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotU3VuLCAgU3VuIE1pY3Jvc3lzdGVtcywgIHRoZSBTdW4gbG9nbywgIEphdmEsICBKYXZhU2VydmVyIFBhZ2VzLCAgSmF2YQotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCAgSkRCQywgIEpESywgIEphdmFNYWlsIGFuZCAgYW5kCi1FbnRlcnByaXNlIEphdmFCZWFucyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi1NaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzIFN1YmplY3QgdG8KLVN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLURPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQUxMIEVYUFJFU1MgT1IgSU1QTElFRAotQ09ORElUSU9OUywgUkVQUkVTRU5UQVRJT05TIEFORCBXQVJSQU5USUVTLCBJTkNMVURJTkcgQU5ZIElNUExJRUQKLVdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIE9SCi1OT04tSU5GUklOR0VNRU5ULCBBUkUgRElTQ0xBSU1FRCwgRVhDRVBUIFRPIFRIRSBFWFRFTlQgVEhBVCBTVUNICi1ESVNDTEFJTUVSUyBBUkUgSEVMRCBUTyBCRSBMRUdBTExZIElOVkFMSUQuCi0KLQotX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi1Db3B5cmlnaHQgKGMpIDIwMDAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwKLTkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBFJ3RhdHMtVW5pcy4KLVRvdXMgZHJvaXRzIHJlJ3NlcnZlJ3MuCi0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gYSBsZXMgZHJvaXRzIGRlIHByb3ByaWUndGUnIGludGVsbGVjdHVlbHMKLXJlbGF0YW50cyBhYCBsYSB0ZWNobm9sb2dpZSBpbmNvcnBvcmUnZSBkYW5zIGxlIHByb2R1aXQgcXVpIGVzdCBkZSdjcml0Ci1kYW5zIGNlIGRvY3VtZW50LiBFbiBwYXJ0aWN1bGllciwgZXQgc2FucyBsYSBsaW1pdGF0aW9uLCBjZXMgZHJvaXRzIGRlCi1wcm9wcmllJ3RlJyBpbnRlbGxlY3R1ZWxzIHBldXZlbnQgaW5jbHVyZSB1biBvdSBwbHVzIGRlcyBicmV2ZXRzCi1hbWUncmljYWlucyBlJ251bWUncmUncyBhYCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBldCB1biBvdSBsZXMKLWJyZXZldHMgcGx1cyBzdXBwbGUnbWVudGFpcmVzIG91IGxlcyBhcHBsaWNhdGlvbnMgZGUgYnJldmV0IGVuIGF0dGVudGUKLWRhbnMgbGVzIEUndGF0cy1VbmlzIGV0IGRhbnMgbGVzIGF1dHJlcyBwYXlzLgotCi1DZSBwcm9kdWl0IG91IGRvY3VtZW50IGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldCBkaXN0cmlidWUnCi1hdmVjIGRlcyBsaWNlbmNlcyBxdWkgZW4gcmVzdHJlaWduZW50IGwndXRpbGlzYXRpb24sIGxhIGNvcGllLCBsYQotZGlzdHJpYnV0aW9uLCBldCBsYSBkZSdjb21waWxhdGlvbi4gIENlIGRvY3VtZW50aW9uIGFzc29jaWUgbiBwZXV0Ci1lXnRyZSByZXByb2R1aXRlIGV0IGRpc3RyaWJ1ZXIsIHBhciBxdWVscXVlIG1veWVuIHF1ZSBjZSBzb2l0LCBzYW5zCi1sJ2F1dG9yaXNhdGlvbiBwcmUnYWxhYmxlIGV0IGUnY3JpdGUgZGUgU3VuIGV0IGRlIHNlcyBiYWlsbGV1cnMgZGUKLWxpY2VuY2UsIGxlIGNhcyBlJ2NoZSdhbnQuCi0KLUxlIGxvZ2ljaWVsIGRlJ3RlbnUgcGFyIGRlcyB0aWVycywgZXQgcXVpIGNvbXByZW5kIGxhIHRlY2hub2xvZ2llCi1yZWxhdGl2ZSBhdXggcG9saWNlcyBkZSBjYXJhY3RlYHJlcywgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IGV0Ci1saWNlbmNpZScgcGFyIGRlcyBmb3Vybmlzc2V1cnMgZGUgU3VuLgotCi1TdW4sICBTdW4gTWljcm9zeXN0ZW1zLCAgbGUgbG9nbyBTdW4sICBKYXZhLCAgSmF2YVNlcnZlciBQYWdlcywgIEphdmEKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgIEpEQkMsICBKREssICBKYXZhTWFpbCBldCAgYW5kCi1FbnRlcnByaXNlIEphdmFCZWFucyBzb250IGRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzCi1kZSdwb3NlJ2VzIGRlIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYXV4IEUndGF0cy1VbmlzIGV0IGRhbnMgZCdhdXRyZXMKLXBheXMuCi0KLUxBIERPQ1VNRU5UQVRJT04gRVNUIEZPVVJOSUUgIkVOIEwnRSdUQVQiIEVUIFRPVVRFUyBBVVRSRVMgQ09ORElUSU9OUywKLURFQ0xBUkFUSU9OUyBFVCBHQVJBTlRJRVMgRVhQUkVTU0VTIE9VIFRBQ0lURVMgU09OVCBGT1JNRUxMRU1FTlQKLUVYQ0xVRVMsIERBTlMgTEEgTUVTVVJFIEFVVE9SSVNFRSBQQVIgTEEgTE9JIEFQUExJQ0FCTEUsIFkgQ09NUFJJUwotTk9UQU1NRU5UIFRPVVRFIEdBUkFOVElFIElNUExJQ0lURSBSRUxBVElWRSBBIExBIFFVQUxJVEUgTUFSQ0hBTkRFLCBBCi1MJ0FQVElUVURFIEEgVU5FIFVUSUxJU0FUSU9OIFBBUlRJQ1VMSUVSRSBPVSBBIEwnQUJTRU5DRSBERQotQ09OVFJFRkFDLE9OLgotLS0+Ci0KLTwhLS0KLVRoaXMgaXMgdGhlIFhNTCBEVEQgZm9yIHRoZSBFSkIgMi4wIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLUFsbCBFSkIgMi4wIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmNsdWRlIGEgRE9DVFlQRQotb2YgdGhlIGZvbGxvd2luZyBmb3JtOgotCi0gIDwhRE9DVFlQRSBlamItamFyIFBVQkxJQwotCSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiIKLQkiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZWpiLWphcl8yXzAuZHRkIj4KLQotLS0+Ci0KLTwhLS0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi1lbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gUENEQVRBLCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCi0gIGluIHRoZSBkYXRhIG1heSBiZSBpZ25vcmVkLgotCi0tIEluIGVsZW1lbnRzIHdob3NlIHZhbHVlIGlzIGFuICJlbnVtZXJhdGVkIHR5cGUiLCB0aGUgdmFsdWUgaXMKLSAgY2FzZSBzZW5zaXRpdmUuCi0KLS0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUgc2FtZQotICBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3Qgc3RhcnRpbmcgd2l0aCAiLyIpCi0gIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4KLSAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5Ci0gIG5hbWVzIGluIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlCi0gIG5hbWVzIGFyZSBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgc2VydmxldCBBUEkuCi0tLT4KLQotCi08IS0tCi1UaGUgZWpiLWphciBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIEVKQiBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yLiBJdCBjb250YWlucwotCi0JLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZWpiLWphciBmaWxlCi0JLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLQktIGFuIG9wdGlvbmFsIHNtYWxsIGljb24gZmlsZSBuYW1lCi0JLSBhbiBvcHRpb25hbCBsYXJnZSBpY29uIGZpbGUgbmFtZQotCS0gbWFuZGF0b3J5IHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGluY2x1ZGVkCi0JICBlbnRlcnByaXNlIGJlYW5zCi0JLSBhIGRlc2NyaXB0b3IgZm9yIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMsIGlmIGFueQotCS0gYW4gb3B0aW9uYWwgYXBwbGljYXRpb24tYXNzZW1ibHkgZGVzY3JpcHRvcgotCS0gYW4gb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUgZWpiLWphci4KLS0tPgotPCFFTEVNRU5UIGVqYi1qYXIgKGRlc2NyaXB0aW9uPywgZGlzcGxheS1uYW1lPywgc21hbGwtaWNvbj8sCi1sYXJnZS1pY29uPywgZW50ZXJwcmlzZS1iZWFucywgcmVsYXRpb25zaGlwcz8sIGFzc2VtYmx5LWRlc2NyaXB0b3I/LAotZWpiLWNsaWVudC1qYXI/KT4KLQotPCEtLQotVGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBhYnN0cmFjdAotc2NoZW1hIHR5cGUgb2YgYW4gZW50aXR5IGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnguIEl0IGlzIHVzZWQgaW4gRUpCCi1RTCBxdWVyaWVzLgotCi1Gb3IgZXhhbXBsZSwgdGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGZvciBhbiBlbnRpdHkgYmVhbiB3aG9zZSBsb2NhbAotaW50ZXJmYWNlIGlzIGNvbS5hY21lLmNvbW1lcmNlLk9yZGVyIG1pZ2h0IGJlIE9yZGVyLgotCi1Vc2VkIGluOiBlbnRpdHkKLS0tPgotPCFFTEVNRU5UIGFic3RyYWN0LXNjaGVtYS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotCi1UaGUgYWNrbm93bGVkZ2UtbW9kZSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIEpNUyBBVVRPX0FDS05PV0xFREdFIG9yCi1EVVBTX09LX0FDS05PV0xFREdFIG1lc3NhZ2UgYWNrbm93bGVkZ21lbnQgc2VtYW50aWNzIHNob3VsZCBiZSB1c2VkCi1mb3IgdGhlIG9uTWVzc2FnZSBtZXNzYWdlIG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbiB0aGF0IHVzZXMgYmVhbgotbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbi4KLQotVGhlIGFja25vd2xlZGdlLW1vZGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCTxhY2tub3dsZWRnZS1tb2RlPkF1dG8tYWNrbm93bGVkZ2U8L2Fja25vd2xlZGdlLW1vZGU+Ci0JPGFja25vd2xlZGdlLW1vZGU+RHVwcy1vay1hY2tub3dsZWRnZTwvYWNrbm93bGVkZ2Vtb2RlPgotCi1Vc2VkIGluOiBtZXNzYWdlLWRyaXZlbgotLS0+Ci08IUVMRU1FTlQgYWNrbm93bGVkZ2UtbW9kZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBhc3NlbWJseS1kZXNjcmlwdG9yIGVsZW1lbnQgY29udGFpbnMgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24uCi0KLVRoZSBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbiBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhcnRzOgotdGhlIGRlZmluaXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMsIHRoZSBkZWZpbml0aW9uIG9mIG1ldGhvZAotcGVybWlzc2lvbnMsIHRoZSBkZWZpbml0aW9uIG9mIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yCi1lbnRlcnByaXNlIGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gYW5kCi1hIGxpc3Qgb2YgbWV0aG9kcyB0byBiZSBleGNsdWRlZCBmcm9tIGJlaW5nIGludm9rZWQuCi0KLUFsbCB0aGUgcGFydHMgYXJlIG9wdGlvbmFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlIG9taXR0ZWQgaWYgdGhlCi1saXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4KLQotUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcwotb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuCi0KLVVzZWQgaW46IGVqYi1qYXIKLS0tPgotPCFFTEVNRU5UIGFzc2VtYmx5LWRlc2NyaXB0b3IgKHNlY3VyaXR5LXJvbGUqLCBtZXRob2QtcGVybWlzc2lvbiosCi1jb250YWluZXItdHJhbnNhY3Rpb24qLCBleGNsdWRlLWxpc3Q/KT4KLQotPCEtLQotVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQsIHdpdGhpbiBhIHBhcnRpY3VsYXIKLXJlbGF0aW9uc2hpcCwgdGhlIGxpZmV0aW1lIG9mIG9uZSBvciBtb3JlIGVudGl0eSBiZWFucyBpcyBkZXBlbmRlbnQKLXVwb24gdGhlIGxpZmV0aW1lIG9mIGFub3RoZXIgZW50aXR5IGJlYW4uIFRoZSBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50Ci1jYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIGFuIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50IGNvbnRhaW5lZAotaW4gYW4gZWpiLXJlbGF0aW9uIGVsZW1lbnQgaW4gd2hpY2ggdGhlIG90aGVyIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotZWxlbWVudCBzcGVjaWZpZXMgYSBtdWx0aXBsaWNpdHkgb2YgT25lLgotCi1Vc2VkIGluOiBlamItcmVsYXRpb25zaGlwLXJvbGUKLS0tPgotPCFFTEVNRU5UIGNhc2NhZGUtZGVsZXRlIEVNUFRZPgotCi08IS0tCi1UaGUgY21wLWZpZWxkIGVsZW1lbnQgZGVzY3JpYmVzIGEgY29udGFpbmVyLW1hbmFnZWQgZmllbGQuIFRoZQotZmllbGQgZWxlbWVudCBpbmNsdWRlcyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQsIGFuZCB0aGUKLW5hbWUgb2YgdGhlIGZpZWxkLgotCi1Vc2VkIGluOiBlbnRpdHkKLS0tPgotPCFFTEVNRU5UIGNtcC1maWVsZCAoZGVzY3JpcHRpb24/LCBmaWVsZC1uYW1lKT4KLQotPCEtLQotVGhlIGNtcC12ZXJzaW9uIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIGFuIGVudGl0eSBiZWFuCi13aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLgotCi1UaGUgY21wLXZlcnNpb24gZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCTxjbXAtdmVyc2lvbj4xLng8L2NtcC12ZXJzaW9uPgotCTxjbXAtdmVyc2lvbj4yLng8L2NtcC12ZXJzaW9uPgotCi1UaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY21wLXZlcnNpb24gZWxlbWVudCBpcyAyLnguCi0KLVVzZWQgaW46IGVudGl0eQotLS0+Ci08IUVMRU1FTlQgY21wLXZlcnNpb24gKCNQQ0RBVEEpPgotCi08IS0tCi0KLVRoZSBjbXItZmllbGQgZWxlbWVudCBkZXNjcmliZXMgdGhlIGJlYW4gcHJvdmlkZXIncyB2aWV3IG9mIGEKLXJlbGF0aW9uc2hpcC4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBhbmQKLXRoZSBjbGFzcyB0eXBlIG9mIGEgZmllbGQgaW4gdGhlIHNvdXJjZSBvZiBhIHJvbGUgb2YgYQotcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLW5hbWUgZWxlbWVudCBjb3JyZXNwb25kcyB0byB0aGUgbmFtZSB1c2VkCi1mb3IgdGhlIGdldCBhbmQgc2V0IGFjY2Vzc29yIG1ldGhvZHMgZm9yIHRoZSByZWxhdGlvbnNoaXAuIFRoZQotY21yLWZpZWxkLXR5cGUgZWxlbWVudCBpcyB1c2VkIG9ubHkgZm9yIGNvbGxlY3Rpb24tdmFsdWVkCi1jbXItZmllbGRzLiBJdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBpcyB1c2VkLgotCi1Vc2VkIGluOiBlamItcmVsYXRpb25zaGlwLXJvbGUKLS0tPgotPCFFTEVNRU5UIGNtci1maWVsZCAoZGVzY3JpcHRpb24/LCBjbXItZmllbGQtbmFtZSwgY21yLWZpZWxkLXR5cGU/KT4KLQotPCEtLQotVGhlIGNtci1maWVsZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgbG9naWNhbAotcmVsYXRpb25zaGlwIGZpZWxkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcy4gVGhlIG5hbWUgb2YgdGhlIGNtci1maWVsZAotbXVzdCBiZWdpbiB3aXRoIGEgbG93ZXJjYXNlIGxldHRlci4gVGhpcyBmaWVsZCBpcyBhY2Nlc3NlZCBieSBtZXRob2RzCi13aG9zZSBuYW1lcyBjb25zaXN0IG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkKLWNtci1maWVsZC1uYW1lIGluIHdoaWNoIHRoZSBmaXJzdCBsZXR0ZXIgaXMgdXBwZXJjYXNlZCwgcHJlZml4ZWQgYnkKLSJnZXQiIG9yICJzZXQiLgotCi1Vc2VkIGluOiBjbXItZmllbGQKLS0tPgotPCFFTEVNRU5UIGNtci1maWVsZC1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGNtci1maWVsZC10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjbGFzcyBvZiBhCi1jb2xsZWN0aW9uLXZhbHVlZCBsb2dpY2FsIHJlbGF0aW9uc2hpcCBmaWVsZCBpbiB0aGUgZW50aXR5IGJlYW4KLWNsYXNzLiBUaGUgdmFsdWUgb2YgdGhlIGNtci1maWVsZC10eXBlIGVsZW1lbnQgbXVzdCBiZSBlaXRoZXI6Ci1qYXZhLnV0aWwuQ29sbGVjdGlvbiBvciBqYXZhLnV0aWwuU2V0LgotCi1Vc2VkIGluOiBjbXItZmllbGQKLS0tPgotPCFFTEVNRU5UIGNtci1maWVsZC10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGNvbnRhaW5lci10cmFuc2FjdGlvbiBlbGVtZW50IHNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lcgotbXVzdCBtYW5hZ2UgdHJhbnNhY3Rpb24gc2NvcGVzIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kCi1pbnZvY2F0aW9ucy4gVGhlIGVsZW1lbnQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdAotb2YgbWV0aG9kIGVsZW1lbnRzLCBhbmQgYSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUuIFRoZSB0cmFuc2FjdGlvbgotYXR0cmlidXRlIGlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQgbWV0aG9kcy4KLQotVXNlZCBpbjogYXNzZW1ibHktZGVzY3JpcHRvcgotLS0+Ci08IUVMRU1FTlQgY29udGFpbmVyLXRyYW5zYWN0aW9uIChkZXNjcmlwdGlvbj8sIG1ldGhvZCssIHRyYW5zLWF0dHJpYnV0ZSk+Ci0KLTwhLS0KLVRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudAotZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0Ci10aGUgZW50ZXJwcmlzZSBiZWFuIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZgotdGhlIGVudGVycHJpc2UgYmVhbiBlamItamFyIGZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzCi11c2VkIGJ5IHRoZSBlbnRlcnByaXNlIGJlYW4gZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24KLXdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgZGVzY3JpcHRpb24uCi0KLVVzZWQgaW46IGNtcC1maWVsZCwgY21yLWZpZWxkLCBjb250YWluZXItdHJhbnNhY3Rpb24sIGVqYi1qYXIsCi1lamItbG9jYWwtcmVmLCBlamItcmVmLCBlamItcmVsYXRpb24sIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSwgZW50aXR5LAotZW52LWVudHJ5LCBleGNsdWRlLWxpc3QsIG1lc3NhZ2UtZHJpdmVuLCBtZXRob2QsIG1ldGhvZC1wZXJtaXNzaW9uLAotcXVlcnksIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSwgcmVsYXRpb25zaGlwcywgcmVzb3VyY2UtZW52LXJlZiwKLXJlc291cmNlLXJlZiwgcnVuLWFzLCBzZWN1cml0eS1pZGVudGl0eSwgc2VjdXJpdHktcm9sZSwKLXNlY3VyaXR5LXJvbGUtcmVmLCBzZXNzaW9uCi0tLT4KLTwhRUxFTUVOVCBkZXNjcmlwdGlvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBkZXN0aW5hdGlvbi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBKTVMKLWRlc3RpbmF0aW9uLiBUaGUgdHlwZSBpcyBzcGVjaWZpZWQgYnkgdGhlIEphdmEgaW50ZXJmYWNlIGV4cGVjdGVkIHRvCi1iZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVzdGluYXRpb24uCi0KLVRoZSBkZXN0aW5hdGlvbi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLTxkZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZTwvZGVzdGluYXRpb24tdHlwZT4KLTxkZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5Ub3BpYzwvZGVzdGluYXRpb24tdHlwZT4KLQotVXNlZCBpbjogbWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24KLS0tPgotPCFFTEVNRU5UIGRlc3RpbmF0aW9uLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKLWRpc3BsYXllZCBieSB0b29scy4gIFRoZSBkaXNwbGF5IG5hbWUgbmVlZCBub3QgYmUgdW5pcXVlLgotCi1Vc2VkIGluOiBlamItamFyLCBlbnRpdHksIG1lc3NhZ2UtZHJpdmVuLCBzZXNzaW9uCi0KLUV4YW1wbGU6Ci0KLTxkaXNwbGF5LW5hbWU+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZQotZW50ZXJwcmlzZSBiZWFuJ3MgY2xhc3MuCi0KLVVzZWQgaW46IGVudGl0eSwgbWVzc2FnZS1kcml2ZW4sIHNlc3Npb24KLQotRXhhbXBsZToKLQotPGVqYi1jbGFzcz5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlQmVhbjwvZWpiLWNsYXNzPgotLS0+Ci08IUVMRU1FTlQgZWpiLWNsYXNzICgjUENEQVRBKT4KLQotPCEtLQotVGhlIG9wdGlvbmFsIGVqYi1jbGllbnQtamFyIGVsZW1lbnQgc3BlY2lmaWVzIGEgSkFSIGZpbGUgdGhhdCBjb250YWlucwotdGhlIGNsYXNzIGZpbGVzIG5lY2Vzc2FyeSBmb3IgYSBjbGllbnQgcHJvZ3JhbSB0byBhY2Nlc3MgdGhlCi1lbnRlcnByaXNlIGJlYW5zIGluIHRoZSBlamItamFyIGZpbGUuCi0KLVVzZWQgaW46IGVqYi1qYXIKLQotRXhhbXBsZToKLQotPGVqYi1jbGllbnQtamFyPmVtcGxveWVlX3NlcnZpY2VfY2xpZW50LmphcjwvZWpiLWNsaWVudC1qYXI+Ci0tLT4KLTwhRUxFTUVOVCBlamItY2xpZW50LWphciAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGVqYi1yZWYgb3IgZWpiLWxvY2FsLXJlZgotZWxlbWVudHMgdG8gc3BlY2lmeSB0aGF0IGFuIEVKQiByZWZlcmVuY2UgaXMgbGlua2VkIHRvIGFuCi1lbnRlcnByaXNlIGJlYW4uCi0KLVRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbgotZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIGVqYi1qYXIgZmlsZSBvciBpbiBhbm90aGVyIGVqYi1qYXIKLWZpbGUgaW4gdGhlIHNhbWUgSjJFRSBhcHBsaWNhdGlvbiB1bml0LgotCi1BbHRlcm5hdGl2ZWx5LCB0aGUgbmFtZSBpbiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtYXkgYmUgY29tcG9zZWQgb2YgYQotcGF0aCBuYW1lIHNwZWNpZnlpbmcgdGhlIGVqYi1qYXIgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlCi1iZWFuIHdpdGggdGhlIGVqYi1uYW1lIG9mIHRoZSB0YXJnZXQgYmVhbiBhcHBlbmRlZCBhbmQgc2VwYXJhdGVkIGZyb20KLXRoZSBwYXRoIG5hbWUgYnkgIiMiLiAgVGhlIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgZWpiLWphciBmaWxlCi1jb250YWluaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4gdGhhdCBpcyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuLgotVGhpcyBhbGxvd3MgbXVsdGlwbGUgZW50ZXJwcmlzZSBiZWFucyB3aXRoIHRoZSBzYW1lIGVqYi1uYW1lIHRvIGJlCi11bmlxdWVseSBpZGVudGlmaWVkLgotCi1Vc2VkIGluOiBlamItbG9jYWwtcmVmLCBlamItcmVmCi0KLUV4YW1wbGVzOgotCi0JPGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC9lamItbGluaz4KLQotCTxlamItbGluaz4uLi9wcm9kdWN0cy9wcm9kdWN0LmphciNQcm9kdWN0RUpCPC9lamItbGluaz4KLQotLS0+Ci08IUVMRU1FTlQgZWpiLWxpbmsgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLWxvY2FsLXJlZiBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0bwotYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCS0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4KLQkgIHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLQktIHRoZSBleHBlY3RlZCBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9mIHRoZSByZWZlcmVuY2VkCi0JICBlbnRlcnByaXNlIGJlYW4KLQktIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlZmVyZW5jZWQKLQkgIGVudGVycHJpc2UgYmVhbgotCi1Vc2VkIGluOiBlbnRpdHksIG1lc3NhZ2UtZHJpdmVuLCBzZXNzaW9uCi0tLT4KLTwhRUxFTUVOVCBlamItbG9jYWwtcmVmIChkZXNjcmlwdGlvbj8sIGVqYi1yZWYtbmFtZSwgZWpiLXJlZi10eXBlLAotCQlsb2NhbC1ob21lLCBsb2NhbCwgZWpiLWxpbms/KT4KLQotPCEtLQotVGhlIGVqYi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbidzIG5hbWUuIFRoaXMgbmFtZSBpcwotYXNzaWduZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBuYW1lIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4KLXRoZSBlamItamFyIGZpbGUncyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi1hbW9uZyB0aGUgbmFtZXMgb2YgdGhlIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIHNhbWUgZWpiLWphciBmaWxlLgotCi1UaGVyZSBpcyBubyBhcmNoaXRlY3RlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgZWpiLW5hbWUgaW4gdGhlCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IgYW5kIHRoZSBKTkRJIG5hbWUgdGhhdCB0aGUgRGVwbG95ZXIgd2lsbCBhc3NpZ24KLXRvIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBob21lLgotCi1UaGUgbmFtZSBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnggbXVzdCBjb25mb3JtIHRvIHRoZQotbGV4aWNhbCBydWxlcyBmb3IgYW4gTk1UT0tFTi4gVGhlIG5hbWUgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGgKLWNtcC12ZXJzaW9uIDIueCBtdXN0IG5vdCBiZSBhIHJlc2VydmVkIGxpdGVyYWwgaW4gRUpCIFFMLgotCi1Vc2VkIGluOiBlbnRpdHksIG1lc3NhZ2UtZHJpdmVuLCBtZXRob2QsIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSwKLXNlc3Npb24KLQotRXhhbXBsZToKLQotPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBlamItbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcWwgZWxlbWVudCBjb250YWlucyB0aGUgRUpCIFFMIHF1ZXJ5IHN0cmluZyB0aGF0IGRlZmluZXMKLWEgZmluZGVyIG9yIHNlbGVjdCBxdWVyeS4gVGhpcyBlbGVtZW50IGlzIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZgotYSBxdWVyeSBlbGVtZW50IHdob3NlIGNvbnRlbnRzIHNwZWNpZnkgdGhlIGZpbmRlciBvciB0aGUgc2VsZWN0IG1ldGhvZAotdGhhdCB1c2VzIHRoZSBxdWVyeS4gVGhlIGNvbnRlbnQgbXVzdCBiZSBhIHZhbGlkIEVKQiBRTCBxdWVyeSBzdHJpbmcKLWZvciB0aGUgZW50aXR5IGJlYW4gZm9yIHdoaWNoIHRoZSBxdWVyeSBpcyBzcGVjaWZpZWQuCi0KLVRoZSBlamItcWwgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYWxsIHF1ZXJpZXMgdGhhdCBhcmUKLWV4cHJlc3NpYmxlIGluIEVKQiBRTC4KLQotVXNlZCBpbjogcXVlcnkKLQotRXhhbXBsZToKLTxxdWVyeT4KLSAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICA8bWV0aG9kLW5hbWU+ZWpiU2VsZWN0UGVuZGluZ0xpbmVpdGVtczwvbWV0aG9kLW5hbWU+Ci0gICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICA8ZWpiLXFsPlNFTEVDVCBPQkpFQ1QobCkgRlJPTSBMaW5lSXRlbXMgbCBXSEVSRSBsLnNoaXBwZWQgPD4gVFJVRQotICAgIDwvZWpiLXFsPgotPC9xdWVyeT4KLQotLS0+Ci08IUVMRU1FTlQgZWpiLXFsICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1yZWYgZWxlbWVudCBpcyB1c2VkIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8KLWFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCS0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQktIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZgotCSAgdGhlIGVudGVycHJpc2UgYmVhbiB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbgotCS0gdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0JLSB0aGUgZXhwZWN0ZWQgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQKLQkgIGVudGVycHJpc2UgYmVhbgotCS0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZAotCSAgZW50ZXJwcmlzZSBiZWFuCi0KLVVzZWQgaW46IGVudGl0eSwgbWVzc2FnZS1kcml2ZW4sIHNlc3Npb24KLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYgKGRlc2NyaXB0aW9uPywgZWpiLXJlZi1uYW1lLCBlamItcmVmLXR5cGUsCi0JCWhvbWUsIHJlbW90ZSwgZWpiLWxpbms/KT4KLQotPCEtLQotVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQiByZWZlcmVuY2UuIFRoZQotRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgZW52aXJvbm1lbnQgYW5kIGlzCi1yZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLXdpdGhpbiB0aGUgZW50ZXJwcmlzZSBiZWFuLgotCi1JdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLVVzZWQgaW46IGVqYi1sb2NhbC1yZWYsIGVqYi1yZWYKLQotRXhhbXBsZToKLQotPGVqYi1yZWYtbmFtZT5lamIvUGF5cm9sbDwvZWpiLXJlZi1uYW1lPgotLS0+Ci08IUVMRU1FTlQgZWpiLXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZQotcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uCi0KLVRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0JPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLQk8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLQotVXNlZCBpbjogZWpiLWxvY2FsLXJlZiwgZWpiLXJlZgotLS0+Ci08IUVMRU1FTlQgZWpiLXJlZi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotCi1UaGUgZWpiLXJlbGF0aW9uIGVsZW1lbnQgZGVzY3JpYmVzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvCi1lbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4gIEFuIGVqYi1yZWxhdGlvbgotZWxlbWVudCBjb250YWlucyBhIGRlc2NyaXB0aW9uOyBhbiBvcHRpb25hbCBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50OwotYW5kIGV4YWN0bHkgdHdvIHJlbGF0aW9uc2hpcCByb2xlIGRlY2xhcmF0aW9ucywgZGVmaW5lZCBieSB0aGUKLWVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50cy4gVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaWYKLXNwZWNpZmllZCwgaXMgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphciBmaWxlLgotCi1Vc2VkIGluOiByZWxhdGlvbnNoaXBzCi0tLT4KLTwhRUxFTUVOVCBlamItcmVsYXRpb24gKGRlc2NyaXB0aW9uPywgZWpiLXJlbGF0aW9uLW5hbWU/LCBlamItcmVsYXRpb25zaGlwLXJvbGUsCi1lamItcmVsYXRpb25zaGlwLXJvbGUpPgotCi08IS0tCi1UaGUgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudCBwcm92aWRlcyBhIHVuaXF1ZSBuYW1lIGZvciBhIHJlbGF0aW9uc2hpcC4KLQotVXNlZCBpbjogZWpiLXJlbGF0aW9uCi0tLT4KLTwhRUxFTUVOVCBlamItcmVsYXRpb24tbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUgZWxlbWVudCBkZXNjcmliZXMgYSByb2xlIHdpdGhpbiBhCi1yZWxhdGlvbnNoaXAuIFRoZXJlIGFyZSB0d28gcm9sZXMgaW4gZWFjaCByZWxhdGlvbnNoaXAuCi0KLVRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUgZWxlbWVudCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgYW4KLW9wdGlvbmFsIG5hbWUgZm9yIHRoZSByZWxhdGlvbnNoaXAgcm9sZTsgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZQotbXVsdGlwbGljaXR5IG9mIHRoZSByb2xlOyBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlCi1mdW5jdGlvbmFsaXR5IGZvciB0aGUgcm9sZTsgdGhlIHJvbGUgc291cmNlOyBhbmQgYSBkZWNsYXJhdGlvbiBvZiB0aGUKLWNtci1maWVsZCwgaWYgYW55LCBieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUKLXJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuCi0KLVRoZSBtdWx0aXBsaWNpdHkgYW5kIHJvbGUtc291cmNlIGVsZW1lbnQgYXJlIG1hbmRhdG9yeS4KLQotVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGRlc2lnbmF0ZXMgYW4gZW50aXR5IGJlYW4gYnkKLW1lYW5zIG9mIGFuIGVqYi1uYW1lIGVsZW1lbnQuIEZvciBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMsIGJvdGgKLXJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG11c3QgZGVjbGFyZSBhIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZQotZWxlbWVudCB0aGF0IHNwZWNpZmllcyBhIGNtci1maWVsZCBpbiB0ZXJtcyBvZiB3aGljaCB0aGUgcmVsYXRpb25zaGlwCi1pcyBhY2Nlc3NlZC4gVGhlIGxhY2sgb2YgYSBjbXItZmllbGQgZWxlbWVudCBpbiBhbgotZWpiLXJlbGF0aW9uc2hpcC1yb2xlIHNwZWNpZmllcyB0aGF0IHRoZSByZWxhdGlvbnNoaXAgaXMKLXVuaWRpcmVjdGlvbmFsIGluIG5hdmlnYWJpbGl0eSBhbmQgdGhlIGVudGl0eSBiZWFuIHRoYXQgcGFydGljaXBhdGVzCi1pbiB0aGUgcmVsYXRpb25zaGlwIGlzICJub3QgYXdhcmUiIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0KLVVzZWQgaW46IGVqYi1yZWxhdGlvbgotCi1FeGFtcGxlOgotCi08ZWpiLXJlbGF0aW9uPgotICAgIDxlamItcmVsYXRpb24tbmFtZT5Qcm9kdWN0LUxpbmVJdGVtPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cHJvZHVjdC1oYXMtbGluZWl0ZW1zCi0gICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgIDxlamItbmFtZT5Qcm9kdWN0RUpCPC9lamItbmFtZT4KLSAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotCi0tLT4KLTwhRUxFTUVOVCBlamItcmVsYXRpb25zaGlwLXJvbGUgKGRlc2NyaXB0aW9uPywgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU/LAotbXVsdGlwbGljaXR5LCBjYXNjYWRlLWRlbGV0ZT8sIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSwgY21yLWZpZWxkPyk+Ci0KLTwhLS0KLVRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSBlbGVtZW50IGRlZmluZXMgYSBuYW1lIGZvciBhIHJvbGUgdGhhdAotaXMgdW5pcXVlIHdpdGhpbiBhbiBlamItcmVsYXRpb24uIERpZmZlcmVudCByZWxhdGlvbnNoaXBzIGNhbiB1c2UgdGhlCi1zYW1lIG5hbWUgZm9yIGEgcm9sZS4KLQotVXNlZCBpbjogZWpiLXJlbGF0aW9uc2hpcC1yb2xlCi0tLT4KLTwhRUxFTUVOVCBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnRlcnByaXNlLWJlYW5zIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBvZiBvbmUgb3IgbW9yZQotZW50ZXJwcmlzZSBiZWFucy4KLS0tPgotPCFFTEVNRU5UIGVudGVycHJpc2UtYmVhbnMgKHNlc3Npb24gfCBlbnRpdHkgfCBtZXNzYWdlLWRyaXZlbikrPgotCi08IS0tCi1UaGUgZW50aXR5IGVsZW1lbnQgZGVjbGFyZXMgYW4gZW50aXR5IGJlYW4uIFRoZSBkZWNsYXJhdGlvbgotY29uc2lzdHMgb2Y6Ci0KLQktIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLQktIGFuIG9wdGlvbmFsIHNtYWxsIGljb24gZmlsZSBuYW1lCi0JLSBhbiBvcHRpb25hbCBsYXJnZSBpY29uIGZpbGUgbmFtZQotCS0gYSB1bmlxdWUgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JICBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JLSB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGhvbWUgYW5kIHJlbW90ZQotICAgICAgICAgIGludGVyZmFjZXMsIGlmIGFueQotCS0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIGxvY2FsIGhvbWUgYW5kIGxvY2FsCi0JICBpbnRlcmZhY2VzLCBpZiBhbnkKLQktIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0JLSB0aGUgZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZSBtYW5hZ2VtZW50IHR5cGUKLQktIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzIG5hbWUKLQktIGFuIGluZGljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVlbnRyYW5jeQotCS0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyBjbXAtdmVyc2lvbgotCS0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyBhYnN0cmFjdAotCSAgc2NoZW1hIG5hbWUKLQktIGFuIG9wdGlvbmFsIGxpc3Qgb2YgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0JLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBwcmltYXJ5IGtleSBmaWVsZAotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudCBlbnRyaWVzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsIEVKQiByZWZlcmVuY2VzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkKLQkgIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlIG1hbmFnZXIKLSAgICAgICAgICBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlcwotCS0gYW4gb3B0aW9uYWwgc2V0IG9mIHF1ZXJ5IGRlY2xhcmF0aW9ucwotCSAgZm9yIGZpbmRlciBhbmQgc2VsZWN0IG1ldGhvZHMgZm9yIGFuIGVudGl0eQotCSAgYmVhbiB3aXRoIGNtcC12ZXJzaW9uIDIueC4KLQotVGhlIG9wdGlvbmFsIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGFuCi1lbnRpdHkgYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlIGFuZCBjbXAtdmVyc2lvbiAyLnguCi0KLVRoZSBvcHRpb25hbCBwcmlta2V5LWZpZWxkIG1heSBiZSBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yIGlmIHRoZQotZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuCi0KLVRoZSBvcHRpb25hbCBjbXAtdmVyc2lvbiBlbGVtZW50IG1heSBiZSBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yIGlmCi10aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuIElmIHRoZSBwZXJzaXN0ZW5jZS10eXBlIGlzCi1Db250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIGl0cyB2YWx1ZQotZGVmYXVsdHMgdG8gMi54LgotCi1UaGUgb3B0aW9uYWwgaG9tZSBhbmQgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmIHRoZSBlbnRpdHkKLWJlYW4gY21wLXZlcnNpb24gaXMgMS54LgotCi1UaGUgb3B0aW9uYWwgaG9tZSBhbmQgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmIHRoZSBlbnRpdHkKLWJlYW4gaGFzIGEgcmVtb3RlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2UuCi0KLVRoZSBvcHRpb25hbCBsb2NhbC1ob21lIGFuZCBsb2NhbCBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZiB0aGUKLWVudGl0eSBiZWFuIGhhcyBhIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZS4KLQotRWl0aGVyIGJvdGggdGhlIGxvY2FsLWhvbWUgYW5kIHRoZSBsb2NhbCBlbGVtZW50cyBvciBib3RoIHRoZQotaG9tZSBhbmQgdGhlIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZC4KLQotVGhlIG9wdGlvbmFsIHF1ZXJ5IGVsZW1lbnRzIG11c3QgYmUgcHJlc2VudCBpZiB0aGUgcGVyc2lzdGVuY2UtdHlwZSBpcwotQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gaXMgMi54IGFuZCBxdWVyeSBtZXRob2RzIG90aGVyIHRoYW4KLWZpbmRCeVByaW1hcnlLZXkgaGF2ZSBiZWVuIGRlZmluZWQgZm9yIHRoZSBlbnRpdHkgYmVhbi4KLQotVGhlIG90aGVyIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZSBzZW5zZSB0aGF0Ci10aGV5IGFyZSBvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4KLQotQXQgbGVhc3Qgb25lIGNtcC1maWVsZCBlbGVtZW50IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZgotdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gaXMgMS54LAotYW5kIG5vbmUgbXVzdCBub3QgYmUgcHJlc2VudCBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBCZWFuLgotCi1Vc2VkIGluOiBlbnRlcnByaXNlLWJlYW5zCi0KLS0tPgotPCFFTEVNRU5UIGVudGl0eSAoZGVzY3JpcHRpb24/LCBkaXNwbGF5LW5hbWU/LCBzbWFsbC1pY29uPywKLQkJbGFyZ2UtaWNvbj8sIGVqYi1uYW1lLCBob21lPywgcmVtb3RlPywgbG9jYWwtaG9tZT8sCi0JCWxvY2FsPywgZWpiLWNsYXNzLCBwZXJzaXN0ZW5jZS10eXBlLCBwcmltLWtleS1jbGFzcywKLQkJcmVlbnRyYW50LCBjbXAtdmVyc2lvbj8sIGFic3RyYWN0LXNjaGVtYS1uYW1lPywKLQkJY21wLWZpZWxkKiwgcHJpbWtleS1maWVsZD8sIGVudi1lbnRyeSosIGVqYi1yZWYqLAotCQllamItbG9jYWwtcmVmKiwgc2VjdXJpdHktcm9sZS1yZWYqLCBzZWN1cml0eS1pZGVudGl0eT8sCi0JCXJlc291cmNlLXJlZiosIHJlc291cmNlLWVudi1yZWYqLCBxdWVyeSopPgotCi08IS0tCi1UaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGVudGVycHJpc2UgYmVhbidzCi1lbnZpcm9ubWVudCBlbnRyeS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4gb3B0aW9uYWwKLXZhbHVlLiAgSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLCBvbmUgbXVzdCBiZSBzdXBwbGllZAotZHVyaW5nIGRlcGxveW1lbnQuCi0KLVVzZWQgaW46IGVudGl0eSwgbWVzc2FnZS1kcml2ZW4sIHNlc3Npb24KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeSAoZGVzY3JpcHRpb24/LCBlbnYtZW50cnktbmFtZSwgZW52LWVudHJ5LXR5cGUsCi0JCWVudi1lbnRyeS12YWx1ZT8pPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncwotZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLWphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBlbnRlcnByaXNlIGJlYW4uCi0KLVVzZWQgaW46IGVudi1lbnRyeQotCi1FeGFtcGxlOgotCi08ZW52LWVudHJ5LW5hbWU+bWluQW1vdW50PC9lbnYtZW50cnktbmFtZT4KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgb2YKLXRoZSBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZSBlbnRlcnByaXNlIGJlYW4ncwotY29kZS4KLQotVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZToKLQotCWphdmEubGFuZy5Cb29sZWFuCi0JamF2YS5sYW5nLkJ5dGUKLQlqYXZhLmxhbmcuQ2hhcmFjdGVyCi0JamF2YS5sYW5nLlN0cmluZwotCWphdmEubGFuZy5TaG9ydAotCWphdmEubGFuZy5JbnRlZ2VyCi0JamF2YS5sYW5nLkxvbmcKLQlqYXZhLmxhbmcuRmxvYXQKLQlqYXZhLmxhbmcuRG91YmxlCi0KLQotVXNlZCBpbjogZW52LWVudHJ5Ci0KLUV4YW1wbGU6Ci0KLTxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLWVudmlyb25tZW50IGVudHJ5LiBUaGUgdmFsdWUgbXVzdCBiZSBhIFN0cmluZyB0aGF0IGlzIHZhbGlkIGZvciB0aGUKLWNvbnN0cnVjdG9yIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEgc2luZ2xlIFN0cmluZwotcGFyYW1ldGVyLCBvciBmb3IgamF2YS5sYW5nLkNoYXJhY3RlciwgYSBzaW5nbGUgY2hhcmFjdGVyLgotCi1Vc2VkIGluOiBlbnYtZW50cnkKLQotRXhhbXBsZToKLQotPGVudi1lbnRyeS12YWx1ZT4xMDAuMDA8L2Vudi1lbnRyeS12YWx1ZT4KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeS12YWx1ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBleGNsdWRlIGxpc3QgZWxlbWVudCBzcGVjaWZpZXMgb25lIG9yIG1vcmUgbWV0aG9kcyB3aGljaCB0aGUKLUFzc2VtYmxlciBtYXJrcyB0byBiZSB1bmNhbGxhYmxlLgotCi1JZiB0aGUgbWV0aG9kIHBlcm1pc3Npb24gcmVsYXRpb24gY29udGFpbnMgbWV0aG9kcyB0aGF0IGFyZSBpbiB0aGUKLWV4Y2x1ZGUgbGlzdCwgdGhlIERlcGxveWVyIHNob3VsZCBjb25zaWRlciB0aG9zZSBtZXRob2RzIHRvIGJlCi11bmNhbGxhYmxlLgotCi1Vc2VkIGluOiBhc3NlbWJseS1kZXNjcmlwdG9yCi0tLT4KLTwhRUxFTUVOVCBleGNsdWRlLWxpc3QgKGRlc2NyaXB0aW9uPywgbWV0aG9kKyk+Ci0KLTwhLS0KLVRoZSBmaWVsZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgY29udGFpbmVyIG1hbmFnZWQKLWZpZWxkLgotCi1UaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54IG11c3QKLWJlZ2luIHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyLiBUaGlzIGZpZWxkIGlzIGFjY2Vzc2VkIGJ5IG1ldGhvZHMgd2hvc2UKLW5hbWVzIGNvbnNpc3RzIG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkgZmllbGQtbmFtZSBpbgotd2hpY2ggdGhlIGZpcnN0IGxldHRlciBpcyB1cHBlcmNhc2VkLCBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4KLQotVGhlIG5hbWUgb2YgdGhlIGNtcC1maWVsZCBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoIGNtcC12ZXJzaW9uIDEueCBtdXN0Ci1kZW5vdGUgYSBwdWJsaWMgZmllbGQgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBjbGFzcyBvciBvbmUgb2YgaXRzCi1zdXBlcmNsYXNzZXMuCi0KLVVzZWQgaW46IGNtcC1maWVsZAotCi1FeGFtcGxlOgotCi0KLQk8ZmllbGQtbmFtZT5maXJzdE5hbWU8L2ZpZWxkLU5hbWU+Ci0KLS0tPgotPCFFTEVNRU5UIGZpZWxkLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZQotYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItcmVmLCBlbnRpdHksIHNlc3Npb24KLQotRXhhbXBsZToKLQotPGhvbWU+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEhvbWU8L2hvbWU+Ci0tLT4KLTwhRUxFTUVOVCBob21lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLWNvbnRhaW5pbmcgYSBsYXJnZSAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKLW5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MKLWVqYi1qYXIgZmlsZS4KLQotVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLVRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi1Vc2VkIGluOiBlamItamFyLCBlbnRpdHksIG1lc3NhZ2UtZHJpdmVuLCBzZXNzaW9uCi0KLUV4YW1wbGU6Ci0KLTxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLS0tPgotPCFFTEVNRU5UIGxhcmdlLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi0KLVRoZSBsb2NhbCBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUKLWVudGVycHJpc2UgYmVhbidzIGxvY2FsIGludGVyZmFjZS4KLQotVXNlZCBpbjogZWpiLWxvY2FsLXJlZiwgZW50aXR5LCBzZXNzaW9uCi0KLS0tPgotPCFFTEVNRU5UIGxvY2FsICgjUENEQVRBKT4KLQotPCEtLQotCi1UaGUgbG9jYWwtaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUKLWVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItbG9jYWwtcmVmLCBlbnRpdHksIHNlc3Npb24KLS0tPgotPCFFTEVNRU5UIGxvY2FsLWhvbWUgKCNQQ0RBVEEpPgotCi08IS0tCi0KLVRoZSBtZXNzYWdlLWRyaXZlbiBlbGVtZW50IGRlY2xhcmVzIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4gVGhlCi1kZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCS0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQktIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotCS0gYW4gb3B0aW9uYWwgc21hbGwgaWNvbiBmaWxlIG5hbWUKLQktIGFuIG9wdGlvbmFsIGxhcmdlIGljb24gZmlsZSBuYW1lCi0JLSBhIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbiBpbgotCSAgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCS0gdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcwotCS0gdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MKLQkgIG1lc3NhZ2Ugc2VsZWN0b3IKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZQotCSAgYWNrbm93bGVkZ21lbnQgbW9kZSBmb3IgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4KLQkgIGlmIGJlYW4tbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBpcyB1c2VkCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUKLQkgIGludGVuZGVkIGRlc3RpbmF0aW9uIHR5cGUgb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4KLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQgZW50cmllcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbCBFSkIgcmVmZXJlbmNlcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5Ci0JICBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBtYW5hZ2VyCi0JICBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICAgICAgICAgIGVudmlyb25tZW50IHJlZmVyZW5jZXMuCi0KLVVzZWQgaW46IGVudGVycHJpc2UtYmVhbnMKLS0tPgotPCFFTEVNRU5UIG1lc3NhZ2UtZHJpdmVuIChkZXNjcmlwdGlvbj8sIGRpc3BsYXktbmFtZT8sIHNtYWxsLWljb24/LAotCQlsYXJnZS1pY29uPywgZWpiLW5hbWUsIGVqYi1jbGFzcywgdHJhbnNhY3Rpb24tdHlwZSwKLQkJbWVzc2FnZS1zZWxlY3Rvcj8sIGFja25vd2xlZGdlLW1vZGU/LAotCQltZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbj8sIGVudi1lbnRyeSosIGVqYi1yZWYqLAotCQllamItbG9jYWwtcmVmKiwgc2VjdXJpdHktaWRlbnRpdHk/LCByZXNvdXJjZS1yZWYqLAotCQlyZXNvdXJjZS1lbnYtcmVmKik+Ci0KLTwhLS0KLVRoZSBtZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbiBlbGVtZW50IHByb3ZpZGVzIGFkdmljZSB0byB0aGUgRGVwbG95ZXIKLWFzIHRvIHdoZXRoZXIgYSBtZXNzYWdlLWRyaXZlbiBiZWFuIGlzIGludGVuZGVkIGZvciBhIFF1ZXVlIG9yIGEKLVRvcGljLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6IHRoZSB0eXBlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbgotYmVhbidzIGludGVuZGVkIGRlc3RpbmF0aW9uIGFuZCBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB3aGV0aGVyIGEKLWR1cmFibGUgb3Igbm9uLWR1cmFibGUgc3Vic2NyaXB0aW9uIHNob3VsZCBiZSB1c2VkIGlmIHRoZQotZGVzdGluYXRpb24tdHlwZSBpcyBqYXZheC5qbXMuVG9waWMuCi0KLVVzZWQgaW46IG1lc3NhZ2UtZHJpdmVuCi0tLT4KLTwhRUxFTUVOVCBtZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbiAoZGVzdGluYXRpb24tdHlwZSwKLXN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5Pyk+Ci0KLTwhLS0KLVRoZSBtZXNzYWdlLXNlbGVjdG9yIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBKTVMgbWVzc2FnZQotc2VsZWN0b3IgdG8gYmUgdXNlZCBpbiBkZXRlcm1pbmluZyB3aGljaCBtZXNzYWdlcyBhIG1lc3NhZ2UtZHJpdmVuCi1iZWFuIGlzIHRvIHJlY2VpdmUuCi0KLUV4YW1wbGU6Ci08bWVzc2FnZS1zZWxlY3Rvcj5KTVNUeXBlID0gYGNhcicgQU5EIGNvbG9yID0gYGJsdWUnIEFORCB3ZWlnaHQgJmd0OyAyNTAwCi08L21lc3NhZ2Utc2VsZWN0b3I+Ci0KLVVzZWQgaW46IG1lc3NhZ2UtZHJpdmVuCi0tLT4KLTwhRUxFTUVOVCBtZXNzYWdlLXNlbGVjdG9yICgjUENEQVRBKT4KLQotPCEtLQotCi1UaGUgbWV0aG9kIGVsZW1lbnQgaXMgdXNlZCB0byBkZW5vdGUgYSBtZXRob2Qgb2YgYW4gZW50ZXJwcmlzZQotYmVhbidzIGhvbWUgb3IgY29tcG9uZW50IGludGVyZmFjZSwgb3IsIGluIHRoZSBjYXNlIG9mIGEgbWVzc2FnZS1kcml2ZW4KLWJlYW4sIHRoZSBiZWFuJ3Mgb25NZXNzYWdlIG1ldGhvZCwgb3IgYSBzZXQgb2YgbWV0aG9kcy4gVGhlIGVqYi1uYW1lCi1lbGVtZW50IG11c3QgYmUgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW5zIGRlY2xhcmVkIGluCi10aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yOyB0aGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBhbGxvd3MgdG8KLWRpc3Rpbmd1aXNoIGJldHdlZW4gYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgdGhhdCBpcyBtdWx0aXBseQotZGVmaW5lZCBhY3Jvc3MgaW4gYm90aCB0aGUgaG9tZSBhbmQgY29tcG9uZW50IGludGVyZmFjZXM7IHRoZQotbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1ldGhvZCBuYW1lOyBhbmQgdGhlIG9wdGlvbmFsCi1tZXRob2QtcGFyYW1zIGVsZW1lbnRzIGlkZW50aWZ5IGEgc2luZ2xlIG1ldGhvZCBhbW9uZyBtdWx0aXBsZSBtZXRob2RzCi13aXRoIGFuIG92ZXJsb2FkZWQgbWV0aG9kIG5hbWUuCi0KLVRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBzdHlsZXMgb2YgdGhlIG1ldGhvZCBlbGVtZW50IHN5bnRheDoKLQotMS4KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KLTwvbWV0aG9kPgotCi0gICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBzcGVjaWZpZWQKLSAgIGVudGVycHJpc2UgYmVhbidzIGhvbWUgYW5kIGNvbXBvbmVudCBpbnRlcmZhY2VzLgotCi0yLgotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci08L21ldGhvZD4+Ci0KLSAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byB0aGUgc3BlY2lmaWVkIG1ldGhvZCBvZiB0aGUKLSAgIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4uIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBtZXRob2RzIHdpdGgKLSAgIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhlIGVsZW1lbnQgb2YgdGhpcyBzdHlsZSByZWZlcnMgdG8KLSAgIGFsbCB0aGUgbWV0aG9kcyB3aXRoIHRoZSBvdmVybG9hZGVkIG5hbWUuCi0KLQotMy4KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPlBBUkFNLTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS0yPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIC4uLgotICAgICAgICA8bWV0aG9kLXBhcmFtPlBBUkFNLW48L21ldGhvZC1wYXJhbT4KLSAgICA8L21ldGhvZC1wYXJhbXM+Ci08bWV0aG9kPgotCi0KLSAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEgc2V0IG9mCi0gICBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBuYW1lLiBQQVJBTS0xIHRocm91Z2ggUEFSQU0tbiBhcmUgdGhlCi0gICBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlcyBvZiB0aGUgbWV0aG9kJ3MgaW5wdXQgcGFyYW1ldGVycyAoaWYKLSAgIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0IGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudAotICAgY29udGFpbnMgbm8gbWV0aG9kLXBhcmFtIGVsZW1lbnRzKS4gQXJyYXlzIGFyZSBzcGVjaWZpZWQgYnkgdGhlCi0gICBhcnJheSBlbGVtZW50J3MgdHlwZSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGFpciBvZiBzcXVhcmUKLSAgIGJyYWNrZXRzIChlLmcuIGludFtdW10pLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWV0aG9kcyB3aXRoIHRoZQotICAgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoaXMgc3R5bGUgcmVmZXJzIHRvIGFsbCBvZiB0aGUgb3ZlcmxvYWRlZAotICAgbWV0aG9kcy4KLQotCi1Vc2VkIGluOiBjb250YWluZXItdHJhbnNhY3Rpb24sIGV4Y2x1ZGUtbGlzdCwgbWV0aG9kLXBlcm1pc3Npb24KLQotRXhhbXBsZXM6Ci0KLVN0eWxlIDE6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUgbWV0aG9kcyBvZgotdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBhbmQgY29tcG9uZW50IGludGVyZmFjZXM6Ci0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotPC9tZXRob2Q+Ci0KLVN0eWxlIDI6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUgY3JlYXRlCi1tZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlKHMpLgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotPC9tZXRob2Q+Ci0KLQotU3R5bGUgMzogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gdGhlCi1jcmVhdGUoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIExhc3ROYW1lKSBtZXRob2Qgb2YgdGhlCi1FbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlKHMpLgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLQotVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGEgU3R5bGUgMyBlbGVtZW50IHdpdGgKLW1vcmUgY29tcGxleCBwYXJhbWV0ZXIgdHlwZXMuIFRoZSBtZXRob2QKLWZvb2JhcihjaGFyIHMsIGludCBpLCBpbnRbXSBpYXIsIG15cGFja2FnZS5NeUNsYXNzIG15Y2wsCi1teXBhY2thZ2UuTXlDbGFzc1tdW10gbXljbGFhcikgd291bGQgYmUgc3BlY2lmaWVkIGFzOgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT5mb29iYXI8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmNoYXI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5pbnQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5pbnRbXTwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3NbXVtdPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLQotVGhlIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2hlbiBpdCBiZWNvbWVzIG5lY2Vzc2FyeQotdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgbWV0aG9kIHRoYXQgaXMgbXVsdGlwbHkgZGVmaW5lZCBhY3Jvc3MgdGhlCi1lbnRlcnByaXNlIGJlYW4ncyBob21lIGFuZCBjb21wb25lbnQgaW50ZXJmYWNlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kCi1zaWduYXR1cmUuCi0KLQotRm9yIGV4YW1wbGUsIHRoZSBtZXRob2QgZWxlbWVudAotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLQotY2FuIGJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSB0aGUgY3JlYXRlKFN0cmluZywgU3RyaW5nKSBtZXRob2QgZGVmaW5lZAotaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UgZnJvbSB0aGUgY3JlYXRlKFN0cmluZywgU3RyaW5nKSBtZXRob2QgZGVmaW5lZAotaW4gdGhlIHJlbW90ZSBob21lIGludGVyZmFjZSwgd2hpY2ggd291bGQgYmUgZGVmaW5lZCBhcwotCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLWFuZCB0aGUgY3JlYXRlIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgaW4gdGhlIGxvY2FsIGhvbWUgaW50ZXJmYWNlCi13aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0gICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICA8L21ldGhvZC1wYXJhbXM+Ci08L21ldGhvZD4KLQotCi1UaGUgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aXRoIGFsbCB0aHJlZSBTdHlsZXMgb2YgdGhlCi1tZXRob2QgZWxlbWVudCB1c2FnZS4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQKLWV4YW1wbGUgY291bGQgYmUgdXNlZCB0byByZWZlciB0byBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlCi1FbXBsb3llZVNlcnZpY2UgYmVhbidzIHJlbW90ZSBob21lIGludGVyZmFjZS4KLQotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci08L21ldGhvZD4KLQotLS0+Ci08IUVMRU1FTlQgbWV0aG9kIChkZXNjcmlwdGlvbj8sIGVqYi1uYW1lLCBtZXRob2QtaW50Zj8sIG1ldGhvZC1uYW1lLAotbWV0aG9kLXBhcmFtcz8pPgotCi08IS0tCi0KLVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyBhIG1ldGhvZCBlbGVtZW50IHRvIGRpZmZlcmVudGlhdGUKLWJldHdlZW4gdGhlIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBzaWduYXR1cmUgdGhhdCBhcmUgbXVsdGlwbHkKLWRlZmluZWQgYWNyb3NzIHRoZSBjb21wb25lbnQgYW5kIGhvbWUgaW50ZXJmYWNlcyAoZS5nLCBpbiBib3RoIGFuCi1lbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgYW5kIGxvY2FsIGludGVyZmFjZXM7IGluIGJvdGggYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLWhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLCBldGMuKQotCi1UaGUgbWV0aG9kLWludGYgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0JPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotCTxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotCTxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotCTxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0KLVVzZWQgaW46IG1ldGhvZAotLS0+Ci08IUVMRU1FTlQgbWV0aG9kLWludGYgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBjb250YWlucyBhIG5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIG1ldGhvZAotb3IgdGhlIGFzdGVyaXNrICgqKSBjaGFyYWN0ZXIuIFRoZSBhc3RlcmlzayBpcyB1c2VkIHdoZW4gdGhlIGVsZW1lbnQKLWRlbm90ZXMgYWxsIHRoZSBtZXRob2RzIG9mIGFuIGVudGVycHJpc2UgYmVhbidzIGNvbXBvbmVudCBhbmQgaG9tZQotaW50ZXJmYWNlcy4KLQotVXNlZCBpbjogbWV0aG9kLCBxdWVyeS1tZXRob2QKLS0tPgotPCFFTEVNRU5UIG1ldGhvZC1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIG1ldGhvZC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG5hbWUKLW9mIGEgbWV0aG9kIHBhcmFtZXRlci4KLQotVXNlZCBpbjogbWV0aG9kLXBhcmFtcwotLS0+Ci08IUVMRU1FTlQgbWV0aG9kLXBhcmFtICgjUENEQVRBKT4KLQotPCEtLQotVGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudCBjb250YWlucyBhIGxpc3Qgb2YgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhCi10eXBlIG5hbWVzIG9mIHRoZSBtZXRob2QgcGFyYW1ldGVycy4KLQotVXNlZCBpbjogbWV0aG9kLCBxdWVyeS1tZXRob2QKLS0tPgotPCFFTEVNRU5UIG1ldGhvZC1wYXJhbXMgKG1ldGhvZC1wYXJhbSopPgotCi08IS0tCi0KLVRoZSBtZXRob2QtcGVybWlzc2lvbiBlbGVtZW50IHNwZWNpZmllcyB0aGF0IG9uZSBvciBtb3JlIHNlY3VyaXR5Ci1yb2xlcyBhcmUgYWxsb3dlZCB0byBpbnZva2Ugb25lIG9yIG1vcmUgZW50ZXJwcmlzZSBiZWFuIG1ldGhvZHMuIFRoZQotbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0Ci1vZiBzZWN1cml0eSByb2xlIG5hbWVzIG9yIGFuIGluZGljYXRvciB0byBzdGF0ZSB0aGF0IHRoZSBtZXRob2QgaXMKLXVuY2hlY2tlZCBmb3IgYXV0aG9yaXphdGlvbiwgYW5kIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMuCi0KLVRoZSBzZWN1cml0eSByb2xlcyB1c2VkIGluIHRoZSBtZXRob2QtcGVybWlzc2lvbiBlbGVtZW50IG11c3QgYmUKLWRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwKLWFuZCB0aGUgbWV0aG9kcyBtdXN0IGJlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MKLWNvbXBvbmVudCBhbmQvb3IgaG9tZSBpbnRlcmZhY2VzLgotCi0KLVVzZWQgaW46IGFzc2VtYmx5LWRlc2NyaXB0b3IKLS0tPgotPCFFTEVNRU5UIG1ldGhvZC1wZXJtaXNzaW9uIChkZXNjcmlwdGlvbj8sIChyb2xlLW5hbWUrfHVuY2hlY2tlZCksIG1ldGhvZCspPgotCi08IS0tCi1UaGUgbXVsdGlwbGljaXR5IGVsZW1lbnQgZGVzY3JpYmVzIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGUgdGhhdAotcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb24uCi0KLVRoZSBtdWx0aXBsaWNpdHkgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCTxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0JPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0KLVVzZWQgaW46IGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotLS0+Ci08IUVMRU1FTlQgbXVsdGlwbGljaXR5ICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHBlcnNpc3RlbmNlLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZQotbWFuYWdlbWVudCB0eXBlLgotCi1UaGUgcGVyc2lzdGVuY2UtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLQk8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0KLVVzZWQgaW46IGVudGl0eQotLS0+Ci08IUVMRU1FTlQgcGVyc2lzdGVuY2UtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBwcmltLWtleS1jbGFzcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBhbgotZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSBjbGFzcy4KLQotSWYgdGhlIGRlZmluaXRpb24gb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIGlzIGRlZmVycmVkIHRvIGRlcGxveW1lbnQKLXRpbWUsIHRoZSBwcmltLWtleS1jbGFzcyBlbGVtZW50IHNob3VsZCBzcGVjaWZ5IGphdmEubGFuZy5PYmplY3QuCi0KLVVzZWQgaW46IGVudGl0eQotCi1FeGFtcGxlczoKLQotCTxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9wcmltLWtleS1jbGFzcz4KLQotCTxwcmltLWtleS1jbGFzcz5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVJRDwvcHJpbS1rZXktY2xhc3M+Ci0KLQk8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLk9iamVjdDwvcHJpbS1rZXktY2xhc3M+Ci0KLS0tPgotPCFFTEVNRU5UIHByaW0ta2V5LWNsYXNzICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHByaW1hcnkKLWtleSBmaWVsZCBmb3IgYW4gZW50aXR5IHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuCi0KLVRoZSBwcmlta2V5LWZpZWxkIG11c3QgYmUgb25lIG9mIHRoZSBmaWVsZHMgZGVjbGFyZWQgaW4gdGhlIGNtcC1maWVsZAotZWxlbWVudCwgYW5kIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5IGtleQotdHlwZS4KLQotVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyBub3QgdXNlZCBpZiB0aGUgcHJpbWFyeSBrZXkgbWFwcyB0bwotbXVsdGlwbGUgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzIChpLmUuIHRoZSBrZXkgaXMgYSBjb21wb3VuZCBrZXkpLiBJbgotdGhpcyBjYXNlLCB0aGUgZmllbGRzIG9mIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kCi10aGVpciBuYW1lcyBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIGZpZWxkIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbgotY2xhc3MgdGhhdCBjb21wcmlzZSB0aGUga2V5LgotCi1Vc2VkIGluOiBlbnRpdHkKLQotRXhhbXBsZToKLQotCTxwcmlta2V5LWZpZWxkPkVtcGxveWVlSWQ8L3ByaW1rZXktZmllbGQ+Ci0KLS0tPgotPCFFTEVNRU5UIHByaW1rZXktZmllbGQgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcXVlcnkgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgYSBmaW5kZXIgb3Igc2VsZWN0IHF1ZXJ5LiBJdAotY29udGFpbnMKLQktIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWVyeQotCS0gdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbmRlciBvciBzZWxlY3QKLQkgIG1ldGhvZCBpdCBpcyB1c2VkIGJ5Ci0gICAgICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcmVzdWx0IHR5cGUgbWFwcGluZywgaWYKLSAgICAgICAgICB0aGUgcXVlcnkgaXMgZm9yIGEgc2VsZWN0IG1ldGhvZCBhbmQgZW50aXR5IG9iamVjdHMgYXJlCi0gICAgICAgICAgcmV0dXJuZWQuCi0gICAgCS0gdGhlIEVKQiBRTCBxdWVyeSBzdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBxdWVyeS4KLQotUXVlcmllcyB0aGF0IGFyZSBleHByZXNzaWJsZSBpbiBFSkIgUUwgbXVzdCB1c2UgdGhlIGVqYi1xbCBlbGVtZW50IHRvCi1zcGVjaWZ5IHRoZSBxdWVyeS4gSWYgYSBxdWVyeSBpcyBub3QgZXhwcmVzc2libGUgaW4gRUpCIFFMLCB0aGUKLWRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNlbWFudGljcyBvZiB0aGUKLXF1ZXJ5IGFuZCB0aGUgZWpiLXFsIGVsZW1lbnQgc2hvdWxkIGJlIGVtcHR5LgotCi1UaGUgcmVzdWx0LXR5cGUtbWFwcGluZyBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBJdCBjYW4gb25seSBiZSBwcmVzZW50Ci1pZiB0aGUgcXVlcnktbWV0aG9kIHNwZWNpZmllcyBhIHNlbGVjdCBtZXRob2QgdGhhdCByZXR1cm5zIGVudGl0eQotb2JqZWN0cy4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcmVzdWx0LXR5cGUtbWFwcGluZyBlbGVtZW50IGlzCi0iTG9jYWwiLgotCi0KLVVzZWQgaW46IGVudGl0eQotLS0+Ci08IUVMRU1FTlQgcXVlcnkgKGRlc2NyaXB0aW9uPywgcXVlcnktbWV0aG9kLCByZXN1bHQtdHlwZS1tYXBwaW5nPywgZWpiLXFsKT4KLQotPCEtLQotVGhlIHF1ZXJ5LW1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbWV0aG9kIGZvciBhIGZpbmRlciBvcgotc2VsZWN0IHF1ZXJ5LgotCi1UaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBmaW5kZXIgb3Igc2VsZWN0Ci1tZXRob2QgaW4gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0KLUVhY2ggbWV0aG9kLXBhcmFtIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBxdWVyeS1tZXRob2QgdXNpbmcgdGhlCi1tZXRob2QtcGFyYW1zIGVsZW1lbnQuCi0KLVVzZWQgaW46IHF1ZXJ5Ci0KLUV4YW1wbGU6Ci0KLTxxdWVyeT4KLSAgICA8ZGVzY3JpcHRpb24+TWV0aG9kIGZpbmRzIGxhcmdlIG9yZGVyczwvZGVzY3JpcHRpb24+Ci0gICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgPG1ldGhvZC1uYW1lPmZpbmRMYXJnZU9yZGVyczwvbWV0aG9kLW5hbWU+Ci0gICAgICAgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLSAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICA8ZWpiLXFsPlNFTEVDVCBPQkpFQ1QobykgRlJPTSBPcmRlciBvIFdIRVJFIG8uYW1vdW50ICZndDsgMTAwMDwvZWpiLXFsPgotPC9xdWVyeT4KLQotLS0+Ci08IUVMRU1FTlQgcXVlcnktbWV0aG9kIChtZXRob2QtbmFtZSwgbWV0aG9kLXBhcmFtcyk+Ci0KLTwhLS0KLVRoZSByZWVudHJhbnQgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhbiBlbnRpdHkgYmVhbiBpcyByZWVudHJhbnQgb3IKLW5vdC4KLQotVGhlIHJlZW50cmFudCBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0JPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotCi1Vc2VkIGluOiBlbnRpdHkKLS0tPgotPCFFTEVNRU5UIHJlZW50cmFudCAoI1BDREFUQSk+Ci0KLTwhLS0KLQotVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGRlc2lnbmF0ZXMgdGhlIHNvdXJjZSBvZiBhIHJvbGUKLXRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLiBBIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZQotZWxlbWVudCB1bmlxdWVseSBpZGVudGlmaWVzIGFuIGVudGl0eSBiZWFuLgotCi1Vc2VkIGluOiBlamItcmVsYXRpb25zaGlwLXJvbGUKLS0tPgotPCFFTEVNRU5UIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSAoZGVzY3JpcHRpb24/LCBlamItbmFtZSk+Ci0KLTwhLS0KLVRoZSByZWxhdGlvbnNoaXBzIGVsZW1lbnQgZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluIHdoaWNoCi1lbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZSBwYXJ0aWNpcGF0ZS4gVGhlCi1yZWxhdGlvbnNoaXBzIGVsZW1lbnQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IGFuZCBhIGxpc3Qgb2YKLWVqYi1yZWxhdGlvbiBlbGVtZW50cywgd2hpY2ggc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQKLXJlbGF0aW9uc2hpcHMuCi0KLQotVXNlZCBpbjogZWpiLWphcgotLS0+Ci08IUVMRU1FTlQgcmVsYXRpb25zaGlwcyAoZGVzY3JpcHRpb24/LCBlamItcmVsYXRpb24rKT4KLQotPCEtLQotVGhlIHJlbW90ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZQotYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IGVqYi1yZWYsIGVudGl0eSwgc2Vzc2lvbgotCi1FeGFtcGxlOgotCi08cmVtb3RlPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2U8L3JlbW90ZT4KLS0tPgotPCFFTEVNRU5UIHJlbW90ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtYXV0aCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBlbnRlcnByaXNlIGJlYW4gY29kZSBzaWducwotb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3Igd2hldGhlciB0aGUgQ29udGFpbmVyCi13aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIgb24gYmVoYWxmIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4uIEluIHRoZQotbGF0dGVyIGNhc2UsIHRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZQotRGVwbG95ZXIuCi0KLVRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQk8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotCTxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy1hdXRoICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIHJlc291cmNlIG1hbmFnZXIKLWNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLWphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBlbnRlcnByaXNlIGJlYW4uCi0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1zaGFyaW5nLXNjb3BlIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgY29ubmVjdGlvbnMgb2J0YWluZWQKLXRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBjYW4gYmUKLXNoYXJlZC4gVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCwgaWYgc3BlY2lmaWVkLCBtdXN0IGJlIG9uZSBvZiB0aGUKLXR3byBmb2xsb3dpbmc6Ci0KLQk8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLQk8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotCi1UaGUgZGVmYXVsdCB2YWx1ZSBpcyBTaGFyZWFibGUuCi0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLXNoYXJpbmctc2NvcGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGEgc291cmNlLiBUaGUgdHlwZQotaXMgc3BlY2lmaWVkIGJ5IHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSBsYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UKLWV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkYXRhIHNvdXJjZS4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1lbnYtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncwotcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UKLWluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBlbnZpcm9ubWVudC4gIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4KLWluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlIGV4cGVjdGVkIGJ5Ci10aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUuCi0KLVVzZWQgaW46IGVudGl0eSwgbWVzc2FnZS1kcml2ZW4sIHNlc3Npb24KLQotRXhhbXBsZToKLQotPHJlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci08L3Jlc291cmNlLWVudi1yZWY+Ci0tLT4KLTwhRUxFTUVOVCByZXNvdXJjZS1lbnYtcmVmIChkZXNjcmlwdGlvbj8sIHJlc291cmNlLWVudi1yZWYtbmFtZSwKLQkJcmVzb3VyY2UtZW52LXJlZi10eXBlKT4KLQotPCEtLQotVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIHJlc291cmNlCi1lbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCi10aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLWphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGVudGVycHJpc2UgYmVhbi4KLQotVXNlZCBpbjogcmVzb3VyY2UtZW52LXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtZW52LXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLWVudi1yZWYtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBhIHJlc291cmNlCi1lbnZpcm9ubWVudCByZWZlcmVuY2UuICBJdCBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhCi1sYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IHJlc291cmNlLWVudi1yZWYKLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLWVudi1yZWYtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGFuIGVudGVycHJpc2UgYmVhbidzCi1yZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lLAotdGhlIGluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUKLWV4cGVjdGVkIGJ5IHRoZSBlbnRlcnByaXNlIGJlYW4gY29kZSwgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRpb24KLShBcHBsaWNhdGlvbiBvciBDb250YWluZXIpLCBhbmQgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUKLXNoYXJlYWJpbGl0eSBvZiBjb25uZWN0aW9ucyBvYnRhaW5lZCBmcm9tIHRoZSByZXNvdXJjZSAoU2hhcmVhYmxlIG9yCi1VbnNoYXJlYWJsZSkuCi0KLVVzZWQgaW46IGVudGl0eSwgbWVzc2FnZS1kcml2ZW4sIHNlc3Npb24KLQotRXhhbXBsZToKLQotICAgIDxyZXNvdXJjZS1yZWY+Ci0JPHJlcy1yZWYtbmFtZT5qZGJjL0VtcGxveWVlQXBwREI8L3Jlcy1yZWYtbmFtZT4KLQk8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPgotCTxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotCTxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtcmVmIChkZXNjcmlwdGlvbj8sIHJlcy1yZWYtbmFtZSwgcmVzLXR5cGUsIHJlcy1hdXRoLAotCQlyZXMtc2hhcmluZy1zY29wZT8pPgotCi08IS0tCi0KLVRoZSByZXN1bHQtdHlwZS1tYXBwaW5nIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgcXVlcnkgZWxlbWVudCB0byBzcGVjaWZ5Ci13aGV0aGVyIGFuIGFic3RyYWN0IHNjaGVtYSB0eXBlIHJldHVybmVkIGJ5IGEgcXVlcnkgZm9yIGEgc2VsZWN0IG1ldGhvZAotaXMgdG8gYmUgbWFwcGVkIHRvIGFuIEVKQkxvY2FsT2JqZWN0IG9yIEVKQk9iamVjdCB0eXBlLgotCi1UaGUgcmVzdWx0LXR5cGUtbWFwcGluZyBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+TG9jYWw8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPlJlbW90ZTwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLQotVXNlZCBpbjogcXVlcnkKLS0tPgotPCFFTEVNRU5UIHJlc3VsdC10eXBlLW1hcHBpbmcgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcm9sZS1saW5rIGVsZW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gYSBkZWZpbmVkIHNlY3VyaXR5IHJvbGUuIFRoZQotcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBjb250YWluIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMKLWRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0KLVVzZWQgaW46IHNlY3VyaXR5LXJvbGUtcmVmCi0tLT4KLTwhRUxFTUVOVCByb2xlLWxpbmsgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi1UaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0KLVVzZWQgaW46IG1ldGhvZC1wZXJtaXNzaW9uLCBydW4tYXMsIHNlY3VyaXR5LXJvbGUsIHNlY3VyaXR5LXJvbGUtcmVmCi0tLT4KLTwhRUxFTUVOVCByb2xlLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcnVuLWFzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlCi1leGVjdXRpb24gb2YgdGhlIGVudGVycHJpc2UgYmVhbi4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZAotdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi1Vc2VkIGluOiBzZWN1cml0eS1pZGVudGl0eQotLS0+Ci08IUVMRU1FTlQgcnVuLWFzIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSk+Ci0KLTwhLS0KLQotVGhlIHNlY3VyaXR5LWlkZW50aXR5IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNhbGxlcidzCi1zZWN1cml0eSBpZGVudGl0eSBpcyB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mCi10aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMgaWRlbnRpdHkgaXMgdG8gYmUKLXVzZWQuIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGFuZCBhIHNwZWNpZmljYXRpb24gb2YgdGhlCi1zZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkLgotCi1Vc2VkIGluOiBlbnRpdHksIG1lc3NhZ2UtZHJpdmVuLCBzZXNzaW9uCi0tLT4KLTwhRUxFTUVOVCBzZWN1cml0eS1pZGVudGl0eSAoZGVzY3JpcHRpb24/LCAodXNlLWNhbGxlci1pZGVudGl0eXxydW4tYXMpKT4KLQotPCEtLQotVGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNlY3VyaXR5Ci1yb2xlLiBUaGUgZGVmaW5pdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUKLXNlY3VyaXR5IHJvbGUsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lLgotCi1Vc2VkIGluOiBhc3NlbWJseS1kZXNjcmlwdG9yCi0KLUV4YW1wbGU6Ci0KLSAgICA8c2VjdXJpdHktcm9sZT4KLQk8ZGVzY3JpcHRpb24+Ci0JICAgIFRoaXMgcm9sZSBpbmNsdWRlcyBhbGwgZW1wbG95ZWVzIHdobyBhcmUgYXV0aG9yaXplZAotCSAgICB0byBhY2Nlc3MgdGhlIGVtcGxveWVlIHNlcnZpY2UgYXBwbGljYXRpb24uCi0JPC9kZXNjcmlwdGlvbj4KLQk8cm9sZS1uYW1lPmVtcGxveWVlPC9yb2xlLW5hbWU+Ci0gICAgPC9zZWN1cml0eS1yb2xlPgotLS0+Ci08IUVMRU1FTlQgc2VjdXJpdHktcm9sZSAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUpPgotCi08IS0tCi1UaGUgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSBzZWN1cml0eQotcm9sZSByZWZlcmVuY2UgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIGNvZGUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cwotb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSBzZWN1cml0eSByb2xlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSwKLWFuZCBhbiBvcHRpb25hbCBsaW5rIHRvIGEgc2VjdXJpdHkgcm9sZS4gSWYgdGhlIHNlY3VyaXR5IHJvbGUgaXMgbm90Ci1zcGVjaWZpZWQsIHRoZSBEZXBsb3llciBtdXN0IGNob29zZSBhbiBhcHByb3ByaWF0ZSBzZWN1cml0eSByb2xlLgotCi1UaGUgdmFsdWUgb2YgdGhlIHJvbGUtbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIFN0cmluZyB1c2VkIGFzIHRoZQotcGFyYW1ldGVyIHRvIHRoZSBFSkJDb250ZXh0LmlzQ2FsbGVySW5Sb2xlKFN0cmluZyByb2xlTmFtZSkgbWV0aG9kCi1vciB0aGUgSHR0cFNlcnZsZXRSZXF1ZXN0LmlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgbWV0aG9kLgotCi1Vc2VkIGluOiBlbnRpdHksIHNlc3Npb24KLQotLS0+Ci08IUVMRU1FTlQgc2VjdXJpdHktcm9sZS1yZWYgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lLCByb2xlLWxpbms/KT4KLQotPCEtLQotVGhlIHNlc3Npb24gZWxlbWVudCBkZWNsYXJlcyBhbiBzZXNzaW9uIGJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cwotb2Y6Ci0JLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCS0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0JLSBhbiBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZQotCS0gYW4gb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlIG5hbWUKLQktIGEgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JICBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdGlvbgotCS0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgaG9tZSBhbmQKLQkgIHJlbW90ZSBpbnRlcmZhY2VzLCBpZiBhbnkKLQktIHRoZSBuYW1lcyBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgbG9jYWwgaG9tZSBhbmQKLQkgIGxvY2FsIGludGVyZmFjZXMsIGlmIGFueQotCS0gdGhlIHNlc3Npb24gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0JLSB0aGUgc2Vzc2lvbiBiZWFuJ3Mgc3RhdGUgbWFuYWdlbWVudCB0eXBlCi0JLSB0aGUgc2Vzc2lvbiBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50IGVudHJpZXMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCIHJlZmVyZW5jZXMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZQotICAgICAgICAgIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlIG1hbmFnZXIKLQkgIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlIGVudmlyb25tZW50Ci0JICByZWZlcmVuY2VzLgotCi1UaGUgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlIHRoYXQgdGhleQotYXJlIG9taXR0ZWQgd2hlbiBpZiBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4KLQotRWl0aGVyIGJvdGggdGhlIGxvY2FsLWhvbWUgYW5kIHRoZSBsb2NhbCBlbGVtZW50cyBvciBib3RoIHRoZQotaG9tZSBhbmQgdGhlIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlIHNlc3Npb24gYmVhbi4KLQotVXNlZCBpbjogZW50ZXJwcmlzZS1iZWFucwotLS0+Ci08IUVMRU1FTlQgc2Vzc2lvbiAoZGVzY3JpcHRpb24/LCBkaXNwbGF5LW5hbWU/LCBzbWFsbC1pY29uPywKLWxhcmdlLWljb24/LCBlamItbmFtZSwgaG9tZT8sIHJlbW90ZT8sIGxvY2FsLWhvbWU/LCBsb2NhbD8sCi1lamItY2xhc3MsIHNlc3Npb24tdHlwZSwgdHJhbnNhY3Rpb24tdHlwZSwgZW52LWVudHJ5KiwgZWpiLXJlZiosCi1lamItbG9jYWwtcmVmKiwgc2VjdXJpdHktcm9sZS1yZWYqLCBzZWN1cml0eS1pZGVudGl0eT8sIHJlc291cmNlLXJlZiosCi1yZXNvdXJjZS1lbnYtcmVmKik+Ci0KLTwhLS0KLVRoZSBzZXNzaW9uLXR5cGUgZWxlbWVudCBkZXNjcmliZXMgd2hldGhlciB0aGUgc2Vzc2lvbiBiZWFuIGlzIGEKLXN0YXRlZnVsIHNlc3Npb24gb3Igc3RhdGVsZXNzIHNlc3Npb24uCi0KLVRoZSBzZXNzaW9uLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCTxzZXNzaW9uLXR5cGU+U3RhdGVmdWw8L3Nlc3Npb24tdHlwZT4KLQk8c2Vzc2lvbi10eXBlPlN0YXRlbGVzczwvc2Vzc2lvbi10eXBlPgotLS0+Ci08IUVMRU1FTlQgc2Vzc2lvbi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLWNvbnRhaW5pbmcgYSBzbWFsbCAoMTYgeCAxNikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKLW5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MKLWVqYi1qYXIgZmlsZS4KLQotVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLVRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi1Vc2VkIGluOiBlamItamFyLCBlbnRpdHksIG1lc3NhZ2UtZHJpdmVuLCBzZXNzaW9uCi0KLUV4YW1wbGU6Ci0KLTxzbWFsbC1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjE2eDE2LmpwZzwvc21hbGwtaWNvbj4KLS0tPgotPCFFTEVNRU5UIHNtYWxsLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhIEpNUyB0b3BpYwotc3Vic2NyaXB0aW9uIGlzIGludGVuZGVkIHRvIGJlIGR1cmFibGUgb3Igbm9uZHVyYWJsZS4KLQotVGhlIHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQk8c3Vic2NyaXB0aW9uLWR1cmFiaWxpdHk+RHVyYWJsZTwvc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHk+Ci0JPHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5Pk5vbkR1cmFibGU8L3N1YnNjcmlwdGlvbi1kdXJhYmlsaXR5PgotCi1Vc2VkIGluOiBtZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbgotLS0+Ci08IUVMRU1FTlQgc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHkgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgdHJhbnMtYXR0cmlidXRlIGVsZW1lbnQgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QgbWFuYWdlCi10aGUgdHJhbnNhY3Rpb24gYm91bmRhcmllcyB3aGVuIGRlbGVnYXRpbmcgYSBtZXRob2QgaW52b2NhdGlvbiB0byBhbgotZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MgbWV0aG9kLgotCi1UaGUgdmFsdWUgb2YgdHJhbnMtYXR0cmlidXRlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQotCTx0cmFucy1hdHRyaWJ1dGU+Tm90U3VwcG9ydGVkPC90cmFucy1hdHRyaWJ1dGU+Ci0JPHRyYW5zLWF0dHJpYnV0ZT5TdXBwb3J0czwvdHJhbnMtYXR0cmlidXRlPgotCTx0cmFucy1hdHRyaWJ1dGU+UmVxdWlyZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLQk8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVzTmV3PC90cmFucy1hdHRyaWJ1dGU+Ci0JPHRyYW5zLWF0dHJpYnV0ZT5NYW5kYXRvcnk8L3RyYW5zLWF0dHJpYnV0ZT4KLQk8dHJhbnMtYXR0cmlidXRlPk5ldmVyPC90cmFucy1hdHRyaWJ1dGU+Ci0KLVVzZWQgaW46IGNvbnRhaW5lci10cmFuc2FjdGlvbgotLS0+Ci08IUVMRU1FTlQgdHJhbnMtYXR0cmlidXRlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLXRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZS4KLQotVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCTx0cmFuc2FjdGlvbi10eXBlPkJlYW48L3RyYW5zYWN0aW9uLXR5cGU+Ci0JPHRyYW5zYWN0aW9uLXR5cGU+Q29udGFpbmVyPC90cmFuc2FjdGlvbi10eXBlPgotCi1Vc2VkIGluOiBtZXNzYWdlLWRyaXZlbiwgc2Vzc2lvbgotLS0+Ci08IUVMRU1FTlQgdHJhbnNhY3Rpb24tdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB1bmNoZWNrZWQgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCBhIG1ldGhvZCBpcyBub3QgY2hlY2tlZCBmb3IgYXV0aG9yaXphdGlvbgotYnkgdGhlIGNvbnRhaW5lciBwcmlvciB0byBpbnZvY2F0aW9uIG9mIHRoZSBtZXRob2QuCi0KLVVzZWQgaW46IG1ldGhvZC1wZXJtaXNzaW9uCi0tLT4KLTwhRUxFTUVOVCB1bmNoZWNrZWQgRU1QVFk+Ci0KLTwhLS0KLQotVGhlIHVzZS1jYWxsZXItaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkKLWlkZW50aXR5IGJlIHVzZWQgYXMgdGhlIHNlY3VyaXR5IGlkZW50aXR5IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQotZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kcy4KLQotVXNlZCBpbjogc2VjdXJpdHktaWRlbnRpdHkKLS0tPgotPCFFTEVNRU5UIHVzZS1jYWxsZXItaWRlbnRpdHkgRU1QVFk+Ci0KLTwhLS0KLVRoZSBJRCBtZWNoYW5pc20gaXMgdG8gYWxsb3cgdG9vbHMgdGhhdCBwcm9kdWNlIGFkZGl0aW9uYWwgZGVwbG95bWVudAotaW5mb3JtYXRpb24gKGkuZS4sIGluZm9ybWF0aW9uIGJleW9uZCB0aGUgc3RhbmRhcmQgZGVwbG95bWVudAotZGVzY3JpcHRvciBpbmZvcm1hdGlvbikgdG8gc3RvcmUgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbiBhCi1zZXBhcmF0ZSBmaWxlLCBhbmQgZWFzaWx5IHJlZmVyIGZyb20gdGhlc2UgdG9vbC1zcGVjaWZpYyBmaWxlcyB0byB0aGUKLWluZm9ybWF0aW9uIGluIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLVRvb2xzIGFyZSBub3QgYWxsb3dlZCB0byBhZGQgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbnRvIHRoZQotc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotLS0+Ci0KLTwhQVRUTElTVCBhYnN0cmFjdC1zY2hlbWEtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhY2tub3dsZWRnZS1tb2RlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGFzc2VtYmx5LWRlc2NyaXB0b3IgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY2FzY2FkZS1kZWxldGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY21wLWZpZWxkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNtcC12ZXJzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNtci1maWVsZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjbXItZmllbGQtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjbXItZmllbGQtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb250YWluZXItdHJhbnNhY3Rpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVzY3JpcHRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVzdGluYXRpb24tdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWNsYXNzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1jbGllbnQtamFyIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1qYXIgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWxpbmsgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWxvY2FsLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcWwgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWxhdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVsYXRpb24tbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVsYXRpb25zaGlwLXJvbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW50ZXJwcmlzZS1iZWFucyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnRpdHkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBleGNsdWRlLWxpc3QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmllbGQtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBob21lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxhcmdlLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbG9jYWwgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbG9jYWwtaG9tZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXNzYWdlLWRyaXZlbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXNzYWdlLXNlbGVjdG9yIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1ldGhvZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXRob2QtaW50ZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXRob2QtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXRob2QtcGFyYW0gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWV0aG9kLXBhcmFtcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXRob2QtcGVybWlzc2lvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtdWx0aXBsaWNpdHkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcGVyc2lzdGVuY2UtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcmltLWtleS1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcmlta2V5LWZpZWxkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHF1ZXJ5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHF1ZXJ5LW1ldGhvZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWVudHJhbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbGF0aW9uc2hpcHMgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVtb3RlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1hdXRoIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtc2hhcmluZy1zY29wZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1lbnYtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLWVudi1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1lbnYtcmVmLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc3VsdC10eXBlLW1hcHBpbmcgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgcm9sZS1saW5rIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJvbGUtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBydW4tYXMgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktaWRlbnRpdHkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktcm9sZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZWN1cml0eS1yb2xlLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXNzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlc3Npb24tdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzbWFsbC1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRyYW5zLWF0dHJpYnV0ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0cmFuc2FjdGlvbi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHVuY2hlY2tlZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB1c2UtY2FsbGVyLWlkZW50aXR5IGlkIElEICNJTVBMSUVEPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9lamItamFyXzJfMS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfMl8xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5NDI2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfMl8xLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDIyMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjIuMSI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpZWpiLWphcl8yXzEueHNkcwkxLjIzIDA4LzAxLzAzCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLSAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLSAgICAgIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgRUpCIDIuMSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0JVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkICJNRVRBLUlORi9lamItamFyLnhtbCIgaW4KLQl0aGUgRUpCJ3MgamFyIGZpbGUuICBBbGwgRUpCIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZQotCXRoZSBlamItamFyIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0KLQlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8ZWpiLWphciB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCQkgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvZWpiLWphcl8yXzEueHNkIgotCSAgICAgIHZlcnNpb249IjIuMSI+Ci0JICAgICAgLi4uCi0JICAgIDwvZWpiLWphcj4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotCXRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIHRoZQotCUoyRUUgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvZWpiLWphcl8yXzEueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWphciIgdHlwZT0iajJlZTplamItamFyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBpcyB0aGUgcm9vdCBvZiB0aGUgZWpiLWphciBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6a2V5IG5hbWU9ImVqYi1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZWpiLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBlbnRlcnByaXNlCi0JICBiZWFuLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnRlcnByaXNlLWJlYW5zLyoiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0KLSAgICA8eHNkOmtleXJlZiBuYW1lPSJlamItbmFtZS1yZWZlcmVuY2VzIgotCQlyZWZlcj0iajJlZTplamItbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGtleXJlZiBpbmRpY2F0ZXMgdGhlIHJlZmVyZW5jZXMgZnJvbQotCSAgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIG11c3QgYmUgdG8gYSBzcGVjaWZpYyBlamItbmFtZQotCSAgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGVudGVycHJpc2UtYmVhbnMgZWxlbWVudC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvcgotCSAgIHhwYXRoPSIuLy9qMmVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZS9qMmVlOnJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSIvPgotICAgICAgPHhzZDpmaWVsZAotCSAgIHhwYXRoPSJqMmVlOmVqYi1uYW1lIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotCi0gICAgPHhzZDprZXkgbmFtZT0icm9sZS1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBBIHJvbGUtbmFtZS1rZXkgaXMgc3BlY2lmaWVkIHRvIGFsbG93IHRoZSByZWZlcmVuY2VzCi0JICBmcm9tIHRoZSBzZWN1cml0eS1yb2xlLXJlZnMuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6YXNzZW1ibHktZGVzY3JpcHRvci9qMmVlOnNlY3VyaXR5LXJvbGUiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cm9sZS1uYW1lIi8+Ci0gICAgPC94c2Q6a2V5PgotCi0gICAgPHhzZDprZXlyZWYgbmFtZT0icm9sZS1uYW1lLXJlZmVyZW5jZXMiCi0JCXJlZmVyPSJqMmVlOnJvbGUtbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGtleXJlZiBpbmRpY2F0ZXMgdGhlIHJlZmVyZW5jZXMgZnJvbQotCSAgc2VjdXJpdHktcm9sZS1yZWYgdG8gYSBzcGVjaWZpZWQgcm9sZS1uYW1lLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudGVycHJpc2UtYmVhbnMvKi9qMmVlOnNlY3VyaXR5LXJvbGUtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJvbGUtbGluayIvPgotICAgIDwveHNkOmtleXJlZj4KLSAgPC94c2Q6ZWxlbWVudD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBuYW1lL3ZhbHVlCi0JY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBwYWlyIGZvciBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uCi0KLQlUaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXIKLQltZXNzYWdlLWRyaXZlbiBiZWFuIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBtZXNzYWdpbmcgdHlwZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSBlbGVtZW50IGNvbnRhaW5zCi0JICAgIHRoZSBuYW1lIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgb2YKLQkgICAgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCi0JICAgIEZvciBKTVMgbWVzc2FnZS1kcml2ZW4gYmVhbnMsIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkKLQkgICAgbmFtZXMgYXJlIHJlY29nbml6ZWQ6IGFja25vd2xlZGdlTW9kZSwKLQkgICAgbWVzc2FnZVNlbGVjdG9yLCBkZXN0aW5hdGlvblR5cGUsIHN1YnNjcmlwdGlvbkR1cmFiaWxpdHkKLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS12YWx1ZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LXZhbHVlIGVsZW1lbnQKLQkgICAgY29udGFpbnMgdGhlIHZhbHVlIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24KLQkgICAgcHJvcGVydHkgb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjdGl2YXRpb24tY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGFjdGl2YXRpb24tY29uZmlnVHlwZSBkZWZpbmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotCWV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbgotCWluIGl0cyBvcGVyYXRpb25hbCBlbnZpcm9ubWVudC4gVGhpcyBtYXkgaW5jbHVkZSBpbmZvcm1hdGlvbgotCWFib3V0IG1lc3NhZ2UgYWNrbm93bGVkZ2VtZW50LCBtZXNzYWdlIHNlbGVjdG9yLCBleHBlY3RlZAotCWRlc3RpbmF0aW9uIHR5cGUsIGV0Yy4KLQotCVRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZgotCW5hbWUvdmFsdWUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgotCi0JVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyCi0JbWVzc2FnZS1kcml2ZW4gYmVhbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbWVzc2FnaW5nIHR5cGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHkiCi0JCSAgIHR5cGU9ImoyZWU6YWN0aXZhdGlvbi1jb25maWctcHJvcGVydHlUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzc2VtYmx5LWRlc2NyaXB0b3JUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXNzZW1ibHktZGVzY3JpcHRvclR5cGUgZGVmaW5lcwotCWFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uLgotCi0JVGhlIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uIGNvbnNpc3RzIG9mIHRoZQotCWZvbGxvd2luZyBwYXJ0czogdGhlIGRlZmluaXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMsIHRoZQotCWRlZmluaXRpb24gb2YgbWV0aG9kIHBlcm1pc3Npb25zLCB0aGUgZGVmaW5pdGlvbiBvZgotCXRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yIGVudGVycHJpc2UgYmVhbnMgd2l0aAotCWNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uIGFuZCBhIGxpc3Qgb2YKLQltZXRob2RzIHRvIGJlIGV4Y2x1ZGVkIGZyb20gYmVpbmcgaW52b2tlZC4KLQotCUFsbCB0aGUgcGFydHMgYXJlIG9wdGlvbmFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlCi0Jb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuCi0KLQlQcm92aWRpbmcgYW4gYXNzZW1ibHktZGVzY3JpcHRvciBpbiB0aGUgZGVwbG95bWVudAotCWRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZSIKLQkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wZXJtaXNzaW9uIgotCQkgICB0eXBlPSJqMmVlOm1ldGhvZC1wZXJtaXNzaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci10cmFuc2FjdGlvbiIKLQkJICAgdHlwZT0iajJlZTpjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbiIKLQkJICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtbGlzdCIKLQkJICAgdHlwZT0iajJlZTpleGNsdWRlLWxpc3RUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXAtZmllbGRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY21wLWZpZWxkVHlwZSBkZXNjcmliZXMgYSBjb250YWluZXItbWFuYWdlZCBmaWVsZC4gVGhlCi0JY21wLWZpZWxkVHlwZSBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQsCi0JYW5kIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICBjb250YWluZXIgbWFuYWdlZCBmaWVsZC4KLQotCSAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLQkgICAgY21wLXZlcnNpb24gMi54IG11c3QgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZQotCSAgICBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcyB3aG9zZQotCSAgICBuYW1lcyBjb25zaXN0cyBvZiB0aGUgbmFtZSBvZiB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5Ci0JICAgIGZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0IGxldHRlciBpcyB1cHBlcmNhc2VkLAotCSAgICBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4KLQotCSAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLQkgICAgY21wLXZlcnNpb24gMS54IG11c3QgZGVub3RlIGEgcHVibGljIGZpZWxkIG9mIHRoZQotCSAgICBlbnRlcnByaXNlIGJlYW4gY2xhc3Mgb3Igb25lIG9mIGl0cyBzdXBlcmNsYXNzZXMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY21wLXZlcnNpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY21wLXZlcnNpb25UeXBlIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiBhbiBlbnRpdHkgYmVhbgotCXdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuIEl0IGlzIHVzZWQgYnkKLQljbXAtdmVyc2lvbiBlbGVtZW50cy4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICAxLngKLQkgICAgMi54Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxLngiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyLngiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXItZmllbGQtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjbXItZmllbGQtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgY2xhc3Mgb2YgYQotCWNvbGxlY3Rpb24tdmFsdWVkIGxvZ2ljYWwgcmVsYXRpb25zaGlwIGZpZWxkIGluIHRoZSBlbnRpdHkKLQliZWFuIGNsYXNzLiBUaGUgdmFsdWUgb2YgYW4gZWxlbWVudCB1c2luZyBjbXItZmllbGQtdHlwZVR5cGUKLQltdXN0IGJlIGVpdGhlcjogamF2YS51dGlsLkNvbGxlY3Rpb24gb3IgamF2YS51dGlsLlNldC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS51dGlsLlNldCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtci1maWVsZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjbXItZmllbGRUeXBlIGRlc2NyaWJlcyB0aGUgYmVhbiBwcm92aWRlcidzIHZpZXcgb2YKLQlhIHJlbGF0aW9uc2hpcC4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZAotCXRoZSBuYW1lIGFuZCB0aGUgY2xhc3MgdHlwZSBvZiBhIGZpZWxkIGluIHRoZSBzb3VyY2Ugb2YgYQotCXJvbGUgb2YgYSByZWxhdGlvbnNoaXAuIFRoZSBjbXItZmllbGQtbmFtZSBlbGVtZW50Ci0JY29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgdXNlZCBmb3IgdGhlIGdldCBhbmQgc2V0IGFjY2Vzc29yCi0JbWV0aG9kcyBmb3IgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIGNtci1maWVsZC10eXBlIGVsZW1lbnQgaXMKLQl1c2VkIG9ubHkgZm9yIGNvbGxlY3Rpb24tdmFsdWVkIGNtci1maWVsZHMuIEl0IHNwZWNpZmllcyB0aGUKLQl0eXBlIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgaXMgdXNlZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXItZmllbGQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgY21yLWZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICBsb2dpY2FsIHJlbGF0aW9uc2hpcCBmaWVsZCBpbiB0aGUgZW50aXR5IGJlYW4KLQkgICAgY2xhc3MuIFRoZSBuYW1lIG9mIHRoZSBjbXItZmllbGQgbXVzdCBiZWdpbiB3aXRoIGEKLQkgICAgbG93ZXJjYXNlIGxldHRlci4gVGhpcyBmaWVsZCBpcyBhY2Nlc3NlZCBieSBtZXRob2RzCi0JICAgIHdob3NlIG5hbWVzIGNvbnNpc3Qgb2YgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCi0JICAgIHNwZWNpZmllZCBieSBjbXItZmllbGQtbmFtZSBpbiB3aGljaCB0aGUgZmlyc3QKLQkgICAgbGV0dGVyIGlzIHVwcGVyY2FzZWQsIHByZWZpeGVkIGJ5ICJnZXQiIG9yICJzZXQiLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNtci1maWVsZC10eXBlIgotCQkgICB0eXBlPSJqMmVlOmNtci1maWVsZC10eXBlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udGFpbmVyLXRyYW5zYWN0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNvbnRhaW5lci10cmFuc2FjdGlvblR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyCi0JbXVzdCBtYW5hZ2UgdHJhbnNhY3Rpb24gc2NvcGVzIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MKLQltZXRob2QgaW52b2NhdGlvbnMuIEl0IGRlZmluZXMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEKLQlsaXN0IG9mIG1ldGhvZCBlbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLiBUaGUKLQl0cmFuc2FjdGlvbiBhdHRyaWJ1dGUgaXMgdG8gYmUgYXBwbGllZCB0byBhbGwgdGhlIHNwZWNpZmllZAotCW1ldGhvZHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIgotCQkgICB0eXBlPSJqMmVlOm1ldGhvZFR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnMtYXR0cmlidXRlIgotCQkgICB0eXBlPSJqMmVlOnRyYW5zLWF0dHJpYnV0ZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItY2xhc3NUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBlamItY2xhc3NUeXBlIGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUKLQkgIGVudGVycHJpc2UgYmVhbidzIGNsYXNzLiBJdCBpcyB1c2VkIGJ5IGVqYi1jbGFzcyBlbGVtZW50cy4KLQotCSAgRXhhbXBsZToKLQotCSAgICAgIDxlamItY2xhc3M+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZUJlYW48L2VqYi1jbGFzcz4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLWphclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlamItamFyVHlwZSBkZWZpbmVzIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIEVKQgotCWRlcGxveW1lbnQgZGVzY3JpcHRvci4gSXQgY29udGFpbnMKLQotCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBlamItamFyIGZpbGUKLQkgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLQkgICAgLSBhbiBvcHRpb25hbCBpY29uIHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotCSAgICAgIGljb24gZmlsZSBuYW1lCi0JICAgIC0gbWFuZGF0b3J5IHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGluY2x1ZGVkCi0JICAgICAgZW50ZXJwcmlzZSBiZWFucwotCSAgICAtIGEgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcywKLQkgICAgICBpZiBhbnkKLQkgICAgLSBhbiBvcHRpb25hbCBhcHBsaWNhdGlvbi1hc3NlbWJseSBkZXNjcmlwdG9yCi0JICAgIC0gYW4gb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUKLQkgICAgICBlamItamFyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGVycHJpc2UtYmVhbnMiCi0JCSAgIHR5cGU9ImoyZWU6ZW50ZXJwcmlzZS1iZWFuc1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbnNoaXBzIgotCQkgICB0eXBlPSJqMmVlOnJlbGF0aW9uc2hpcHNUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6dW5pcXVlIG5hbWU9InJlbGF0aW9uc2hpcC1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlbGF0aW9uLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgICAgIHJlbGF0aW9uLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLQkgICAgICByZWxhdGlvbnNoaXBzLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVsYXRpb24iLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlbGF0aW9uLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc2VtYmx5LWRlc2NyaXB0b3IiCi0JCSAgIHR5cGU9ImoyZWU6YXNzZW1ibHktZGVzY3JpcHRvclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFByb3ZpZGluZyBhbiBhc3NlbWJseS1kZXNjcmlwdG9yIGluIHRoZSBkZXBsb3ltZW50Ci0JICAgIGRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUKLQkgICAgcHJvZHVjZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWNsaWVudC1qYXIiCi0JCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBvcHRpb25hbCBlamItY2xpZW50LWphciBlbGVtZW50IHNwZWNpZmllcyBhIEpBUgotCSAgICAgIGZpbGUgdGhhdCBjb250YWlucyB0aGUgY2xhc3MgZmlsZXMgbmVjZXNzYXJ5IGZvciBhCi0JICAgICAgY2xpZW50IHByb2dyYW0gdG8gYWNjZXNzIHRoZQotCSAgICAgIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIGVqYi1qYXIgZmlsZS4KLQotCSAgICAgIEV4YW1wbGU6Ci0KLQkJICA8ZWpiLWNsaWVudC1qYXI+ZW1wbG95ZWVfc2VydmljZV9jbGllbnQuamFyCi0JCSAgPC9lamItY2xpZW50LWphcj4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotCQkgICB0eXBlPSJqMmVlOmRld2V5LXZlcnNpb25UeXBlIgotCQkgICBmaXhlZD0iMi4xIgotCQkgICB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSB2ZXJzaW9uIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUKLQkgIEVKQiBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIGluc3RhbmNlIGRvY3VtZW50IG11c3QKLQkgIGNvbXBseSB3aXRoLiBUaGlzIGluZm9ybWF0aW9uIGVuYWJsZXMgZGVwbG95bWVudCB0b29scwotCSAgdG8gdmFsaWRhdGUgYSBwYXJ0aWN1bGFyIEVKQiBEZXBsb3ltZW50Ci0JICBEZXNjcmlwdG9yIHdpdGggcmVzcGVjdCB0byBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIEVKQgotCSAgc2NoZW1hLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgZWpiLW5hbWVUeXBlIHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncyBuYW1lLiBJdCBpcwotCSAgdXNlZCBieSBlamItbmFtZSBlbGVtZW50cy4gVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZQotCSAgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIG5hbWUgdGhlIGVudGVycHJpc2UgYmVhbiBpbiB0aGUKLQkgIGVqYi1qYXIgZmlsZSdzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZQotCSAgdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgc2FtZQotCSAgZWpiLWphciBmaWxlLgotCi0JICBUaGVyZSBpcyBubyBhcmNoaXRlY3RlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgdXNlZAotCSAgZWpiLW5hbWUgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgdGhlIEpOREkgbmFtZSB0aGF0Ci0JICB0aGUgRGVwbG95ZXIgd2lsbCBhc3NpZ24gdG8gdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUuCi0KLQkgIFRoZSBuYW1lIGZvciBhbiBlbnRpdHkgYmVhbiBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwKLQkgIHJ1bGVzIGZvciBhbiBOTVRPS0VOLgotCi0JICBFeGFtcGxlOgotCi0JICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnhzZE5NVE9LRU5UeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWxhdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlamItcmVsYXRpb25UeXBlIGRlc2NyaWJlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3bwotCWVudGl0eSBiZWFucyB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLiAgSXQgaXMgdXNlZAotCWJ5IGVqYi1yZWxhdGlvbiBlbGVtZW50cy4gSXQgY29udGFpbnMgYSBkZXNjcmlwdGlvbjsgYW4KLQlvcHRpb25hbCBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50OyBhbmQgZXhhY3RseSB0d28KLQlyZWxhdGlvbnNoaXAgcm9sZSBkZWNsYXJhdGlvbnMsIGRlZmluZWQgYnkgdGhlCi0JZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGVsZW1lbnRzLiBUaGUgbmFtZSBvZiB0aGUKLQlyZWxhdGlvbnNoaXAsIGlmIHNwZWNpZmllZCwgaXMgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphcgotCWZpbGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudCBwcm92aWRlcyBhIHVuaXF1ZSBuYW1lCi0JICAgIHdpdGhpbiB0aGUgZWpiLWphciBmaWxlIGZvciBhIHJlbGF0aW9uc2hpcC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb25zaGlwLXJvbGUiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZSIKLQkJICAgdHlwZT0iajJlZTplamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSBkZXNjcmliZXMgYSByb2xlIHdpdGhpbiBhCi0JICByZWxhdGlvbnNoaXAuIFRoZXJlIGFyZSB0d28gcm9sZXMgaW4gZWFjaCByZWxhdGlvbnNoaXAuCi0KLQkgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsCi0JICBkZXNjcmlwdGlvbjsgYW4gb3B0aW9uYWwgbmFtZSBmb3IgdGhlIHJlbGF0aW9uc2hpcCByb2xlOyBhCi0JICBzcGVjaWZpY2F0aW9uIG9mIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGU7IGFuIG9wdGlvbmFsCi0JICBzcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByb2xlOwotCSAgdGhlIHJvbGUgc291cmNlOyBhbmQgYSBkZWNsYXJhdGlvbiBvZiB0aGUgY21yLWZpZWxkLCBpZiBhbnksCi0JICBieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGlzCi0JICBhY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuCi0KLQkgIFRoZSBtdWx0aXBsaWNpdHkgYW5kIHJvbGUtc291cmNlIGVsZW1lbnQgYXJlIG1hbmRhdG9yeS4KLQotCSAgVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGRlc2lnbmF0ZXMgYW4gZW50aXR5Ci0JICBiZWFuIGJ5IG1lYW5zIG9mIGFuIGVqYi1uYW1lIGVsZW1lbnQuIEZvciBiaWRpcmVjdGlvbmFsCi0JICByZWxhdGlvbnNoaXBzLCBib3RoIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG11c3QgZGVjbGFyZSBhCi0JICByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB0aGF0IHNwZWNpZmllcyBhIGNtci1maWVsZAotCSAgaW4gdGVybXMgb2Ygd2hpY2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZC4gVGhlIGxhY2sgb2YKLQkgIGEgY21yLWZpZWxkIGVsZW1lbnQgaW4gYW4gZWpiLXJlbGF0aW9uc2hpcC1yb2xlIHNwZWNpZmllcwotCSAgdGhhdCB0aGUgcmVsYXRpb25zaGlwIGlzIHVuaWRpcmVjdGlvbmFsIGluIG5hdmlnYWJpbGl0eSBhbmQKLQkgIHRoZSBlbnRpdHkgYmVhbiB0aGF0IHBhcnRpY2lwYXRlcyBpbiB0aGUgcmVsYXRpb25zaGlwIGlzCi0JICAibm90IGF3YXJlIiBvZiB0aGUgcmVsYXRpb25zaGlwLgotCi0JICBFeGFtcGxlOgotCi0JICA8ZWpiLXJlbGF0aW9uPgotCSAgICAgIDxlamItcmVsYXRpb24tbmFtZT5Qcm9kdWN0LUxpbmVJdGVtPC9lamItcmVsYXRpb24tbmFtZT4KLQkgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotCQkgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5wcm9kdWN0LWhhcy1saW5laXRlbXMKLQkJICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotCQkgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0JCSAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLQkJICA8ZWpiLW5hbWU+UHJvZHVjdEVKQjwvZWpiLW5hbWU+Ci0JCSAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0JICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotCSAgPC9lamItcmVsYXRpb24+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSBlbGVtZW50IGRlZmluZXMgYQotCSAgICBuYW1lIGZvciBhIHJvbGUgdGhhdCBpcyB1bmlxdWUgd2l0aGluIGFuCi0JICAgIGVqYi1yZWxhdGlvbi4gRGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgY2FuIHVzZSB0aGUKLQkgICAgc2FtZSBuYW1lIGZvciBhIHJvbGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXVsdGlwbGljaXR5IgotCQkgICB0eXBlPSJqMmVlOm11bHRpcGxpY2l0eVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWRlbGV0ZSIKLQkJICAgdHlwZT0iajJlZTplbXB0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0LCB3aXRoaW4gYQotCSAgICBwYXJ0aWN1bGFyIHJlbGF0aW9uc2hpcCwgdGhlIGxpZmV0aW1lIG9mIG9uZSBvciBtb3JlCi0JICAgIGVudGl0eSBiZWFucyBpcyBkZXBlbmRlbnQgdXBvbiB0aGUgbGlmZXRpbWUgb2YKLQkgICAgYW5vdGhlciBlbnRpdHkgYmVhbi4gVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgY2FuCi0JICAgIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUKLQkgICAgZWxlbWVudCBjb250YWluZWQgaW4gYW4gZWpiLXJlbGF0aW9uIGVsZW1lbnQgaW4KLQkgICAgd2hpY2ggdGhlIG90aGVyIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotCSAgICBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVsYXRpb25zaGlwLXJvbGUtc291cmNlIgotCQkgICB0eXBlPSJqMmVlOnJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXItZmllbGQiCi0JCSAgIHR5cGU9ImoyZWU6Y21yLWZpZWxkVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50ZXJwcmlzZS1iZWFuc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbnRlcnByaXNlLWJlYW5zVHlwZSBkZWNsYXJlcyBvbmUgb3IgbW9yZSBlbnRlcnByaXNlCi0JYmVhbnMuIEVhY2ggYmVhbiBjYW4gYmUgYSBzZXNzaW9uLCBlbnRpdHkgb3IgbWVzc2FnZS1kcml2ZW4KLQliZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbiIKLQkJICAgdHlwZT0iajJlZTpzZXNzaW9uLWJlYW5UeXBlIj4KLQk8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mCi0JICAgICAgYW4gRUpCIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4KLQkgICAgICB0aGUgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotCSAgICAgIHRoZSBjb21wb25lbnQuCi0KLQkgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgYmUgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1sb2NhbC1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotCSAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0KLQkgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotCSAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0JICAgICAgY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgICAgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICAgICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0JICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLQkgICAgICBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLQkgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXMtcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLWVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLQkgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLQkgICAgICBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiCi0JCSAgIHR5cGU9ImoyZWU6ZW50aXR5LWJlYW5UeXBlIj4KLQk8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YKLQkgICAgICBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbgotCSAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICAgICAgdGhlIGNvbXBvbmVudC4KLQotCSAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLWxvY2FsLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktZWpiLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0JICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLQkgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAgICAgIHdpdGhpbiB0aGUgY29tcG9uZW50LgotCi0JICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotCSAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0JICAgICAgY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgICBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLQkgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgICAgIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1yZXMtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0JICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQkgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LWVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLQkgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLQkgICAgICBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRyaXZlbiIKLQkJICAgdHlwZT0iajJlZTptZXNzYWdlLWRyaXZlbi1iZWFuVHlwZSI+Ci0JPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YKLQkgICAgICBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbgotCSAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICAgICAgdGhlIGNvbXBvbmVudC4KLQotCSAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLWxvY2FsLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotCSAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0KLQkgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtcmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgICB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLQkgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgICAgIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgICBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLQkgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgICAgIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLQkgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXMtcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0JICAgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlCi0JICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnYtZW50cnkiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZW52LWVudHJ5LW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6Y2hvaWNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1iZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVudGl0eS1iZWFuVHlwZSBkZWNsYXJlcyBhbiBlbnRpdHkgYmVhbi4gVGhlIGRlY2xhcmF0aW9uCi0JY29uc2lzdHMgb2Y6Ci0KLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotCSAgICAtIGFuIG9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UKLQkgICAgICBpY29uIGZpbGUgbmFtZQotCSAgICAtIGEgdW5pcXVlIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbgotCSAgICAgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQkgICAgLSB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGhvbWUKLQkgICAgICBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueQotCSAgICAtIHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4ncyBsb2NhbCBob21lIGFuZCBsb2NhbAotCSAgICAgIGludGVyZmFjZXMsIGlmIGFueQotCSAgICAtIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0JICAgIC0gdGhlIGVudGl0eSBiZWFuJ3MgcGVyc2lzdGVuY2UgbWFuYWdlbWVudCB0eXBlCi0JICAgIC0gdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MgbmFtZQotCSAgICAtIGFuIGluZGljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVlbnRyYW5jeQotCSAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlCi0JICAgICAgZW50aXR5IGJlYW4ncyBjbXAtdmVyc2lvbgotCSAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MKLQkgICAgICBhYnN0cmFjdCBzY2hlbWEgbmFtZQotCSAgICAtIGFuIG9wdGlvbmFsIGxpc3Qgb2YgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0JICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkKLQkgICAgICBmaWVsZAotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQKLQkgICAgICBlbnRyaWVzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIKLQkgICAgICByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbAotCSAgICAgIEVKQiByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIKLQkgICAgICBzZXJ2aWNlIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZQotCSAgICAgIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkKLQkgICAgICB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UKLQkgICAgICBkZXN0aW5hdGlvbiByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgc2V0IG9mIHF1ZXJ5IGRlY2xhcmF0aW9ucwotCSAgICAgIGZvciBmaW5kZXIgYW5kIHNlbGVjdCBtZXRob2RzIGZvciBhbiBlbnRpdHkKLQkgICAgICBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54LgotCi0JVGhlIG9wdGlvbmFsIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQKLQlmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZSBhbmQKLQljbXAtdmVyc2lvbiAyLnguCi0KLQlUaGUgb3B0aW9uYWwgcHJpbWtleS1maWVsZCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvcgotCWlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lci4KLQotCVRoZSBvcHRpb25hbCBjbXAtdmVyc2lvbiBlbGVtZW50IG1heSBiZSBwcmVzZW50IGluIHRoZQotCWRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLiBJZgotCXRoZSBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uCi0JZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdHMgdmFsdWUgZGVmYXVsdHMgdG8gMi54LgotCi0JVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZgotCXRoZSBlbnRpdHkgYmVhbiBjbXAtdmVyc2lvbiBpcyAxLnguCi0KLQlUaGUgb3B0aW9uYWwgaG9tZSBhbmQgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmCi0JdGhlIGVudGl0eSBiZWFuIGhhcyBhIHJlbW90ZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlLgotCi0JVGhlIG9wdGlvbmFsIGxvY2FsLWhvbWUgYW5kIGxvY2FsIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkCi0JaWYgdGhlIGVudGl0eSBiZWFuIGhhcyBhIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZS4KLQotCUVpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aAotCXRoZSBob21lIGFuZCB0aGUgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkLgotCi0JVGhlIG9wdGlvbmFsIHF1ZXJ5IGVsZW1lbnRzIG11c3QgYmUgcHJlc2VudCBpZiB0aGUKLQlwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDIueCBhbmQKLQlxdWVyeSBtZXRob2RzIG90aGVyIHRoYW4gZmluZEJ5UHJpbWFyeUtleSBoYXZlIGJlZW4gZGVmaW5lZAotCWZvciB0aGUgZW50aXR5IGJlYW4uCi0KLQlUaGUgb3RoZXIgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlCi0Jc2Vuc2UgdGhhdCB0aGV5IGFyZSBvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtCi0JYXJlIGVtcHR5LgotCi0JQXQgbGVhc3Qgb25lIGNtcC1maWVsZCBlbGVtZW50IG11c3QgYmUgcHJlc2VudCBpbiB0aGUKLQlkZXNjcmlwdG9yIGlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQKLQl0aGUgY21wLXZlcnNpb24gaXMgMS54LCBhbmQgbm9uZSBtdXN0IG5vdCBiZSBwcmVzZW50IGlmIHRoZQotCWVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQmVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLQkJICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJob21lIgotCQkgICB0eXBlPSJqMmVlOmhvbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUiCi0JCSAgIHR5cGU9ImoyZWU6cmVtb3RlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwtaG9tZSIKLQkJICAgdHlwZT0iajJlZTpsb2NhbC1ob21lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwiCi0JCSAgIHR5cGU9ImoyZWU6bG9jYWxUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLWNsYXNzVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6cGVyc2lzdGVuY2UtdHlwZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltLWtleS1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHByaW0ta2V5LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlCi0JICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi0JICAgIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MuCi0KLQkgICAgSWYgdGhlIGRlZmluaXRpb24gb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIGlzCi0JICAgIGRlZmVycmVkIHRvIGRlcGxveW1lbnQgdGltZSwgdGhlIHByaW0ta2V5LWNsYXNzCi0JICAgIGVsZW1lbnQgc2hvdWxkIHNwZWNpZnkgamF2YS5sYW5nLk9iamVjdC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWVudHJhbnQiCi0JCSAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcmVlbnRyYW50IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgYW4gZW50aXR5Ci0JICAgIGJlYW4gaXMgcmVlbnRyYW50IG9yIG5vdC4KLQotCSAgICBUaGUgcmVlbnRyYW50IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3bwotCSAgICBmb2xsb3dpbmc6IHRydWUgb3IgZmFsc2UKLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXAtdmVyc2lvbiIKLQkJICAgdHlwZT0iajJlZTpjbXAtdmVyc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFic3RyYWN0LXNjaGVtYS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmphdmEtaWRlbnRpZmllclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICBvZiB0aGUgYWJzdHJhY3Qgc2NoZW1hIHR5cGUgb2YgYW4gZW50aXR5IGJlYW4gd2l0aAotCSAgICBjbXAtdmVyc2lvbiAyLnguIEl0IGlzIHVzZWQgaW4gRUpCIFFMIHF1ZXJpZXMuCi0KLQkgICAgRm9yIGV4YW1wbGUsIHRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBmb3IgYW4gZW50aXR5Ci0JICAgIGJlYW4gd2hvc2UgbG9jYWwgaW50ZXJmYWNlIGlzCi0JICAgIGNvbS5hY21lLmNvbW1lcmNlLk9yZGVyIG1pZ2h0IGJlIE9yZGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNtcC1maWVsZCIKLQkJICAgdHlwZT0iajJlZTpjbXAtZmllbGRUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWtleS1maWVsZCIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQotCSAgICBuYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBmaWVsZCBmb3IgYW4gZW50aXR5IHdpdGgKLQkgICAgY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuCi0KLQkgICAgVGhlIHByaW1rZXktZmllbGQgbXVzdCBiZSBvbmUgb2YgdGhlIGZpZWxkcyBkZWNsYXJlZAotCSAgICBpbiB0aGUgY21wLWZpZWxkIGVsZW1lbnQsIGFuZCB0aGUgdHlwZSBvZiB0aGUgZmllbGQKLQkgICAgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgcHJpbWFyeSBrZXkgdHlwZS4KLQotCSAgICBUaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIG5vdCB1c2VkIGlmIHRoZSBwcmltYXJ5Ci0JICAgIGtleSBtYXBzIHRvIG11bHRpcGxlIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcwotCSAgICAoaS5lLiB0aGUga2V5IGlzIGEgY29tcG91bmQga2V5KS4gSW4gdGhpcyBjYXNlLCB0aGUKLQkgICAgZmllbGRzIG9mIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kCi0JICAgIHRoZWlyIG5hbWVzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgZmllbGQgbmFtZXMgb2YKLQkgICAgdGhlIGVudGl0eSBiZWFuIGNsYXNzIHRoYXQgY29tcHJpc2UgdGhlIGtleS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGUtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LWlkZW50aXR5IgotCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LWlkZW50aXR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiCi0JCSAgIHR5cGU9ImoyZWU6cXVlcnlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXhjbHVkZS1saXN0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGV4Y2x1ZGUtbGlzdFR5cGUgc3BlY2lmaWVzIG9uZSBvciBtb3JlIG1ldGhvZHMgd2hpY2gKLQl0aGUgQXNzZW1ibGVyIG1hcmtzIHRvIGJlIHVuY2FsbGFibGUuCi0KLQlJZiB0aGUgbWV0aG9kIHBlcm1pc3Npb24gcmVsYXRpb24gY29udGFpbnMgbWV0aG9kcyB0aGF0IGFyZQotCWluIHRoZSBleGNsdWRlIGxpc3QsIHRoZSBEZXBsb3llciBzaG91bGQgY29uc2lkZXIgdGhvc2UKLQltZXRob2RzIHRvIGJlIHVuY2FsbGFibGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIgotCQkgICB0eXBlPSJqMmVlOm1ldGhvZFR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kcml2ZW4tYmVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXNzYWdlLWRyaXZlbiBlbGVtZW50IGRlY2xhcmVzIGEgbWVzc2FnZS1kcml2ZW4KLQliZWFuLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotCSAgICAtIGFuIG9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UKLQkgICAgICBpY29uIGZpbGUgbmFtZS4KLQkgICAgLSBhIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbiBpbgotCSAgICAgIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQkgICAgLSB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdpbmcKLQkgICAgICB0eXBlCi0JICAgIC0gdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0JICAgICAgbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tbGluawotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MKLQkgICAgICBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQKLQkgICAgICBlbnRyaWVzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCCi0JICAgICAgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViIHNlcnZpY2UKLQkgICAgICByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5Ci0JICAgICAgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzCi0JICAgICAgbWV0aG9kcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeQotCSAgICAgIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlCi0JICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UKLQkgICAgICBkZXN0aW5hdGlvbiByZWZlcmVuY2VzCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmVqYi1jbGFzc1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdpbmctdHlwZSIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UKLQkgICAgbGlzdGVuZXIgaW50ZXJmYWNlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuLiBJZgotCSAgICB0aGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcwotCSAgICBhc3N1bWVkIHRvIGJlIGphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNhY3Rpb24tdHlwZSIKLQkJICAgdHlwZT0iajJlZTp0cmFuc2FjdGlvbi10eXBlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZSIKLQkJICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsiCi0JCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWciCi0JCSAgIHR5cGU9ImoyZWU6YWN0aXZhdGlvbi1jb25maWdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LWlkZW50aXR5IgotCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LWlkZW50aXR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLWludGZUeXBlIj4KLQotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyBhIG1ldGhvZCBlbGVtZW50IHRvCi0JZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSBtZXRob2RzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQKLQlzaWduYXR1cmUgdGhhdCBhcmUgbXVsdGlwbHkgZGVmaW5lZCBhY3Jvc3MgdGhlIGhvbWUgYW5kCi0JY29tcG9uZW50IGludGVyZmFjZXMgKGUuZywgaW4gYm90aCBhbiBlbnRlcnByaXNlIGJlYW4ncwotCXJlbW90ZSBhbmQgbG9jYWwgaW50ZXJmYWNlcyBvciBpbiBib3RoIGFuIGVudGVycHJpc2UgYmVhbidzCi0JaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGV0Yy4pOyB0aGUgY29tcG9uZW50IGFuZCB3ZWIKLQlzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMsIGFuZCBzbyBvbi4KLQotCVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQkgICAgSG9tZQotCSAgICBSZW1vdGUKLQkgICAgTG9jYWxIb21lCi0JICAgIExvY2FsCi0JICAgIFNlcnZpY2VFbmRwb2ludAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW90ZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsSG9tZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUVuZHBvaW50Ii8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWV0aG9kLW5hbWVUeXBlIGNvbnRhaW5zIGEgbmFtZSBvZiBhbiBlbnRlcnByaXNlCi0JYmVhbiBtZXRob2Qgb3IgdGhlIGFzdGVyaXNrICgqKSBjaGFyYWN0ZXIuIFRoZSBhc3RlcmlzayBpcwotCXVzZWQgd2hlbiB0aGUgZWxlbWVudCBkZW5vdGVzIGFsbCB0aGUgbWV0aG9kcyBvZiBhbgotCWVudGVycHJpc2UgYmVhbidzIGNsaWVudCB2aWV3IGludGVyZmFjZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1wYXJhbXNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWV0aG9kLXBhcmFtc1R5cGUgZGVmaW5lcyBhIGxpc3Qgb2YgdGhlCi0JZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBuYW1lcyBvZiB0aGUgbWV0aG9kIHBhcmFtZXRlcnMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtIgotCQkgICB0eXBlPSJqMmVlOmphdmEtdHlwZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbWV0aG9kLXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBwcmltaXRpdmUKLQkgICAgb3IgYSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG5hbWUgb2YgYSBtZXRob2QKLQkgICAgcGFyYW1ldGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1wZXJtaXNzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1ldGhvZC1wZXJtaXNzaW9uVHlwZSBzcGVjaWZpZXMgdGhhdCBvbmUgb3IgbW9yZQotCXNlY3VyaXR5IHJvbGVzIGFyZSBhbGxvd2VkIHRvIGludm9rZSBvbmUgb3IgbW9yZSBlbnRlcnByaXNlCi0JYmVhbiBtZXRob2RzLiBUaGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlIGNvbnNpc3RzIG9mIGFuCi0Jb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdCBvZiBzZWN1cml0eSByb2xlIG5hbWVzIG9yIGFuCi0JaW5kaWNhdG9yIHRvIHN0YXRlIHRoYXQgdGhlIG1ldGhvZCBpcyB1bmNoZWNrZWQgZm9yCi0JYXV0aG9yaXphdGlvbiwgYW5kIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMuCi0KLQlUaGUgc2VjdXJpdHkgcm9sZXMgdXNlZCBpbiB0aGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlCi0JbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzIG9mIHRoZQotCWRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHRoZSBtZXRob2RzIG11c3QgYmUgbWV0aG9kcwotCWRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUsIGNvbXBvbmVudCBhbmQvb3Igd2ViCi0Jc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLQkJICAgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiCi0JCSAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0idW5jaGVja2VkIgotCQkgICAgIHR5cGU9ImoyZWU6ZW1wdHlUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHVuY2hlY2tlZCBlbGVtZW50IHNwZWNpZmllcyB0aGF0IGEgbWV0aG9kIGlzCi0JICAgICAgbm90IGNoZWNrZWQgZm9yIGF1dGhvcml6YXRpb24gYnkgdGhlIGNvbnRhaW5lcgotCSAgICAgIHByaW9yIHRvIGludm9jYXRpb24gb2YgdGhlIG1ldGhvZC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIKLQkJICAgdHlwZT0iajJlZTptZXRob2RUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIG1ldGhvZFR5cGUgaXMgdXNlZCB0byBkZW5vdGUgYSBtZXRob2Qgb2YgYW4gZW50ZXJwcmlzZQotCSAgYmVhbidzIGhvbWUsIGNvbXBvbmVudCwgYW5kL29yIHdlYiBzZXJ2aWNlIGVuZHBvaW50Ci0JICBpbnRlcmZhY2UsIG9yLCBpbiB0aGUgY2FzZSBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4sIHRoZQotCSAgYmVhbidzIG1lc3NhZ2UgbGlzdGVuZXIgbWV0aG9kLCBvciBhIHNldCBvZiBzdWNoCi0JICBtZXRob2RzLiBUaGUgZWpiLW5hbWUgZWxlbWVudCBtdXN0IGJlIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUKLQkgIGVudGVycHJpc2UgYmVhbnMgZGVjbGFyZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcjsgdGhlCi0JICBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEKLQkgIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSB0aGF0IGlzIG11bHRpcGx5IGRlZmluZWQKLQkgIGFjcm9zcyB0aGUgaG9tZSwgY29tcG9uZW50LCBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQKLQkgIGludGVyZmFjZXM7IHRoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWV0aG9kCi0JICBuYW1lOyBhbmQgdGhlIG9wdGlvbmFsIG1ldGhvZC1wYXJhbXMgZWxlbWVudHMgaWRlbnRpZnkgYQotCSAgc2luZ2xlIG1ldGhvZCBhbW9uZyBtdWx0aXBsZSBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZAotCSAgbWV0aG9kIG5hbWUuCi0KLQkgIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBzdHlsZXMgb2YgdXNpbmcgbWV0aG9kVHlwZSBlbGVtZW50Ci0JICB3aXRoaW4gYSBtZXRob2QgZWxlbWVudDoKLQotCSAgMS4KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KLQkgIDwvbWV0aG9kPgotCi0JICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYWxsIHRoZSBtZXRob2RzIG9mIHRoZQotCSAgICAgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbidzIGhvbWUsIGNvbXBvbmVudCwgYW5kL29yIHdlYgotCSAgICAgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzLgotCi0JICAyLgotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci0JICA8L21ldGhvZD4KLQotCSAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mCi0JICAgICB0aGUgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCi0JICAgICBtZXRob2RzIHdpdGggdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGUgZWxlbWVudCBvZgotCSAgICAgdGhpcyBzdHlsZSByZWZlcnMgdG8gYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQKLQkgICAgIG5hbWUuCi0KLQkgIDMuCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLQkgICAgICA8bWV0aG9kLXBhcmFtcz4KLQkJICA8bWV0aG9kLXBhcmFtPlBBUkFNLTE8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPlBBUkFNLTI8L21ldGhvZC1wYXJhbT4KLQkJICAuLi4KLQkJICA8bWV0aG9kLXBhcmFtPlBBUkFNLW48L21ldGhvZC1wYXJhbT4KLQkgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0JICA8L21ldGhvZD4KLQotCSAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgc2luZ2xlIG1ldGhvZCB3aXRoaW4gYQotCSAgICAgc2V0IG9mIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuIFBBUkFNLTEgdGhyb3VnaAotCSAgICAgUEFSQU0tbiBhcmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGVzIG9mIHRoZQotCSAgICAgbWV0aG9kJ3MgaW5wdXQgcGFyYW1ldGVycyAoaWYgdGhlIG1ldGhvZCBoYXMgbm8gaW5wdXQKLQkgICAgIGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudCBjb250YWlucyBubwotCSAgICAgbWV0aG9kLXBhcmFtIGVsZW1lbnRzKS4gQXJyYXlzIGFyZSBzcGVjaWZpZWQgYnkgdGhlCi0JICAgICBhcnJheSBlbGVtZW50J3MgdHlwZSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGFpciBvZgotCSAgICAgc3F1YXJlIGJyYWNrZXRzIChlLmcuIGludFtdW10pLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUKLQkgICAgIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoaXMgc3R5bGUgcmVmZXJzCi0JICAgICB0byBhbGwgb2YgdGhlIG92ZXJsb2FkZWQgbWV0aG9kcy4KLQotCSAgRXhhbXBsZXM6Ci0KLQkgIFN0eWxlIDE6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUKLQkgIG1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSwgY29tcG9uZW50LAotCSAgYW5kL29yIHdlYiBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXM6Ci0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotCSAgPC9tZXRob2Q+Ci0KLQkgIFN0eWxlIDI6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUKLQkgIGNyZWF0ZSBtZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUKLQkgIGludGVyZmFjZShzKS4KLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkgIDwvbWV0aG9kPgotCi0JICBTdHlsZSAzOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byB0aGUKLQkgIGNyZWF0ZShTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgTGFzdE5hbWUpIG1ldGhvZCBvZiB0aGUKLQkgIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UocykuCi0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JICAgICAgPC9tZXRob2QtcGFyYW1zPgotCSAgPC9tZXRob2Q+Ci0KLQkgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBhIFN0eWxlIDMgZWxlbWVudCB3aXRoCi0JICBtb3JlIGNvbXBsZXggcGFyYW1ldGVyIHR5cGVzLiBUaGUgbWV0aG9kCi0JICBmb29iYXIoY2hhciBzLCBpbnQgaSwgaW50W10gaWFyLCBteXBhY2thZ2UuTXlDbGFzcyBteWNsLAotCSAgbXlwYWNrYWdlLk15Q2xhc3NbXVtdIG15Y2xhYXIpIHdvdWxkIGJlIHNwZWNpZmllZCBhczoKLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+Zm9vYmFyPC9tZXRob2QtbmFtZT4KLQkgICAgICA8bWV0aG9kLXBhcmFtcz4KLQkJICA8bWV0aG9kLXBhcmFtPmNoYXI8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPmludDwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+aW50W108L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzc1tdW108L21ldGhvZC1wYXJhbT4KLQkgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0JICA8L21ldGhvZD4KLQotCSAgVGhlIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2hlbiBpdCBiZWNvbWVzCi0JICBuZWNlc3NhcnkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgbWV0aG9kIHRoYXQgaXMgbXVsdGlwbHkKLQkgIGRlZmluZWQgYWNyb3NzIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBob21lLCBjb21wb25lbnQsIGFuZC9vcgotCSAgd2ViIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kCi0JICBzaWduYXR1cmUuCi0KLQkgIEZvciBleGFtcGxlLCB0aGUgbWV0aG9kIGVsZW1lbnQKLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLQkgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkgICAgICA8bWV0aG9kLXBhcmFtcz4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0JICA8L21ldGhvZD4KLQotCSAgY2FuIGJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSB0aGUgY3JlYXRlKFN0cmluZywgU3RyaW5nKQotCSAgbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UgZnJvbSB0aGUKLQkgIGNyZWF0ZShTdHJpbmcsIFN0cmluZykgbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBob21lCi0JICBpbnRlcmZhY2UsIHdoaWNoIHdvdWxkIGJlIGRlZmluZWQgYXMKLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0JICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JICAgICAgPC9tZXRob2QtcGFyYW1zPgotCSAgPC9tZXRob2Q+Ci0KLQkgIGFuZCB0aGUgY3JlYXRlIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgaW4gdGhlIGxvY2FsIGhvbWUKLQkgIGludGVyZmFjZSB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0JICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JICAgICAgPC9tZXRob2QtcGFyYW1zPgotCSAgPC9tZXRob2Q+Ci0KLQkgIFRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGNhbiBiZSB1c2VkIHdpdGggYWxsIHRoIHJlZSBTdHlsZXMKLQkgIG9mIHRoZSBtZXRob2QgZWxlbWVudCB1c2FnZS4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcKLQkgIG1ldGhvZCBlbGVtZW50IGV4YW1wbGUgY291bGQgYmUgdXNlZCB0byByZWZlciB0byBhbGwgdGhlCi0JICBtZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIHJlbW90ZSBob21lIGludGVyZmFjZS4KLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0JICAgICAgPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotCSAgPC9tZXRob2Q+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLQkJICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtaW50ZiIKLQkJICAgdHlwZT0iajJlZTptZXRob2QtaW50ZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1uYW1lIgotCQkgICB0eXBlPSJqMmVlOm1ldGhvZC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wYXJhbXMiCi0JCSAgIHR5cGU9ImoyZWU6bWV0aG9kLXBhcmFtc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im11bHRpcGxpY2l0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtdWx0aXBsaWNpdHlUeXBlIGRlc2NyaWJlcyB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZQotCXJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbi4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICBPbmUKLQkgICAgTWFueQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFueSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcGVyc2lzdGVuY2UtdHlwZVR5cGUgc3BlY2lmaWVzIGFuIGVudGl0eSBiZWFuJ3MgcGVyc2lzdGVuY2UKLQltYW5hZ2VtZW50IHR5cGUuCi0KLQlUaGUgcGVyc2lzdGVuY2UtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JICAgIEJlYW4KLQkgICAgQ29udGFpbmVyCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFuIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktbWV0aG9kVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgcXVlcnktbWV0aG9kIHNwZWNpZmllcyB0aGUgbWV0aG9kIGZvciBhIGZpbmRlciBvciBzZWxlY3QKLQkgIHF1ZXJ5LgotCi0JICBUaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBmaW5kZXIgb3Igc2VsZWN0Ci0JICBtZXRob2QgaW4gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0KLQkgIEVhY2ggbWV0aG9kLXBhcmFtIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBxdWVyeS1tZXRob2QgdXNpbmcgdGhlCi0JICBtZXRob2QtcGFyYW1zIGVsZW1lbnQuCi0KLQkgIEl0IGlzIHVzZWQgYnkgdGhlIHF1ZXJ5LW1ldGhvZCBlbGVtZW50LgotCi0JICBFeGFtcGxlOgotCi0JICA8cXVlcnk+Ci0JICAgICAgPGRlc2NyaXB0aW9uPk1ldGhvZCBmaW5kcyBsYXJnZSBvcmRlcnM8L2Rlc2NyaXB0aW9uPgotCSAgICAgIDxxdWVyeS1tZXRob2Q+Ci0JCSAgPG1ldGhvZC1uYW1lPmZpbmRMYXJnZU9yZGVyczwvbWV0aG9kLW5hbWU+Ci0JCSAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotCSAgICAgIDwvcXVlcnktbWV0aG9kPgotCSAgICAgIDxlamItcWw+Ci0JCVNFTEVDVCBPQkpFQ1QobykgRlJPTSBPcmRlciBvCi0JCSAgV0hFUkUgby5hbW91bnQgJmd0OyAxMDAwCi0JICAgICAgPC9lamItcWw+Ci0JICA8L3F1ZXJ5PgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6bWV0aG9kLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtcyIKLQkJICAgdHlwZT0iajJlZTptZXRob2QtcGFyYW1zVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHF1ZXJ5VHlwZSBkZWZpbmVzIGEgZmluZGVyIG9yIHNlbGVjdAotCXF1ZXJ5LiBJdCBjb250YWlucwotCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWVyeQotCSAgICAtIHRoZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBmaW5kZXIgb3Igc2VsZWN0Ci0JICAgICAgbWV0aG9kIGl0IGlzIHVzZWQgYnkKLQkJLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSByZXN1bHQgdHlwZQotCQkgIG1hcHBpbmcsIGlmIHRoZSBxdWVyeSBpcyBmb3IgYSBzZWxlY3QgbWV0aG9kCi0JCSAgYW5kIGVudGl0eSBvYmplY3RzIGFyZSByZXR1cm5lZC4KLQkJLSB0aGUgRUpCIFFMIHF1ZXJ5IHN0cmluZyB0aGF0IGRlZmluZXMgdGhlIHF1ZXJ5LgotCi0JUXVlcmllcyB0aGF0IGFyZSBleHByZXNzaWJsZSBpbiBFSkIgUUwgbXVzdCB1c2UgdGhlIGVqYi1xbAotCWVsZW1lbnQgdG8gc3BlY2lmeSB0aGUgcXVlcnkuIElmIGEgcXVlcnkgaXMgbm90IGV4cHJlc3NpYmxlCi0JaW4gRUpCIFFMLCB0aGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgYmUgdXNlZCB0bwotCWRlc2NyaWJlIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIHF1ZXJ5IGFuZCB0aGUgZWpiLXFsIGVsZW1lbnQKLQlzaG91bGQgYmUgZW1wdHkuCi0KLQlUaGUgcmVzdWx0LXR5cGUtbWFwcGluZyBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBJdCBjYW4gb25seQotCWJlIHByZXNlbnQgaWYgdGhlIHF1ZXJ5LW1ldGhvZCBzcGVjaWZpZXMgYSBzZWxlY3QgbWV0aG9kCi0JdGhhdCByZXR1cm5zIGVudGl0eSBvYmplY3RzLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZQotCXJlc3VsdC10eXBlLW1hcHBpbmcgZWxlbWVudCBpcyAiTG9jYWwiLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktbWV0aG9kIgotCQkgICB0eXBlPSJqMmVlOnF1ZXJ5LW1ldGhvZFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXN1bHQtdHlwZS1tYXBwaW5nIgotCQkgICB0eXBlPSJqMmVlOnJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcWwiCi0JCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIGRlc2lnbmF0ZXMgdGhlIHNvdXJjZSBvZiBhCi0Jcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uc2hpcC4gQQotCXJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUgaXMgdXNlZCBieQotCXJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50cyB0byB1bmlxdWVseSBpZGVudGlmeSBhbgotCWVudGl0eSBiZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmVqYi1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uc2hpcHNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcmVsYXRpb25zaGlwc1R5cGUgZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluCi0Jd2hpY2ggZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UKLQlwYXJ0aWNpcGF0ZS4gVGhlIHJlbGF0aW9uc2hpcHNUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsCi0JZGVzY3JpcHRpb247IGFuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaAotCXNwZWNpZnkgdGhlIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uIgotCQkgICB0eXBlPSJqMmVlOmVqYi1yZWxhdGlvblR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9InJvbGUtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgICByZWxhdGlvbnNoaXAgcm9sZS4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICAgICAgYSByZWxhdGlvbnNoaXAsIGJ1dCBjYW4gYmUgcmV1c2VkIGluIGRpZmZlcmVudAotCSAgICAgIHJlbGF0aW9uc2hpcHMuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yCi0JICAgICAgIHhwYXRoPSIuLy9qMmVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIi8+Ci0JICA8eHNkOmZpZWxkCi0JICAgICAgIHhwYXRoPSIuIi8+Ci0JPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXN1bHQtdHlwZS1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIGlzIHVzZWQgaW4gdGhlIHF1ZXJ5IGVsZW1lbnQgdG8KLQlzcGVjaWZ5IHdoZXRoZXIgYW4gYWJzdHJhY3Qgc2NoZW1hIHR5cGUgcmV0dXJuZWQgYnkgYSBxdWVyeQotCWZvciBhIHNlbGVjdCBtZXRob2QgaXMgdG8gYmUgbWFwcGVkIHRvIGFuIEVKQkxvY2FsT2JqZWN0IG9yCi0JRUpCT2JqZWN0IHR5cGUuCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCSAgICBMb2NhbAotCSAgICBSZW1vdGUKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3RlIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktaWRlbnRpdHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VjdXJpdHktaWRlbnRpdHlUeXBlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncwotCXNlY3VyaXR5IGlkZW50aXR5IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlCi0JbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMKLQlpZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCWFuZCBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0idXNlLWNhbGxlci1pZGVudGl0eSIKLQkJICAgICB0eXBlPSJqMmVlOmVtcHR5VHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSB1c2UtY2FsbGVyLWlkZW50aXR5IGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQKLQkgICAgICB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgYmUgdXNlZCBhcyB0aGUKLQkgICAgICBzZWN1cml0eSBpZGVudGl0eSBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLQkgICAgICBlbnRlcnByaXNlIGJlYW4ncyBtZXRob2RzLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9InJ1bi1hcyIKLQkJICAgICB0eXBlPSJqMmVlOnJ1bi1hc1R5cGUiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWJlYW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2Vzc2lvbi1iZWFuVHlwZSBkZWNsYXJlcyBhbiBzZXNzaW9uIGJlYW4uIFRoZQotCWRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLQkgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0JICAgICAgaWNvbiBmaWxlIG5hbWUKLQkgICAgLSBhIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbgotCSAgICAgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0aW9uCi0JICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgaG9tZSBhbmQKLQkgICAgICByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55Ci0JICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBsb2NhbCBob21lIGFuZAotCSAgICAgIGxvY2FsIGludGVyZmFjZXMsIGlmIGFueQotCSAgICAtIHRoZSBuYW1lIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyB3ZWIgc2VydmljZSBlbmRwb2ludAotCSAgICAgIGludGVyZmFjZSwgaWYgYW55Ci0JICAgIC0gdGhlIHNlc3Npb24gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0JICAgIC0gdGhlIHNlc3Npb24gYmVhbidzIHN0YXRlIG1hbmFnZW1lbnQgdHlwZQotCSAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0JICAgICAgZW52aXJvbm1lbnQgZW50cmllcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsCi0JICAgICAgRUpCIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYgotCSAgICAgIHNlcnZpY2UgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlCi0JICAgICAgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eQotCSAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotCSAgICAgIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlCi0JICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UKLQkgICAgICBkZXN0aW5hdGlvbiByZWZlcmVuY2VzCi0KLQlUaGUgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlCi0JdGhhdCB0aGV5IGFyZSBvbWl0dGVkIHdoZW4gaWYgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUKLQllbXB0eS4KLQotCUVpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aAotCXRoZSBob21lIGFuZCB0aGUgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGZvciB0aGUKLQlzZXNzaW9uIGJlYW4uCi0KLQlUaGUgc2VydmljZS1lbmRwb2ludCBlbGVtZW50IG1heSBvbmx5IGJlIHNwZWNpZmllZCBpZiB0aGUKLQliZWFuIGlzIGEgc3RhdGVsZXNzIHNlc3Npb24gYmVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLQkJICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJob21lIgotCQkgICB0eXBlPSJqMmVlOmhvbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUiCi0JCSAgIHR5cGU9ImoyZWU6cmVtb3RlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwtaG9tZSIKLQkJICAgdHlwZT0iajJlZTpsb2NhbC1ob21lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwiCi0JCSAgIHR5cGU9ImoyZWU6bG9jYWxUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50IgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50IGVsZW1lbnQgY29udGFpbnMgdGhlCi0JICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyB3ZWIKLQkgICAgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuIFRoZSBzZXJ2aWNlLWVuZHBvaW50Ci0JICAgIGVsZW1lbnQgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhIHN0YXRlbGVzcwotCSAgICBzZXNzaW9uIGJlYW4uIFRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlIG11c3QgYmUgYQotCSAgICB2YWxpZCBKQVgtUlBDIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTplamItY2xhc3NUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi10eXBlIgotCQkgICB0eXBlPSJqMmVlOnNlc3Npb24tdHlwZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlIgotCQkgICB0eXBlPSJqMmVlOnRyYW5zYWN0aW9uLXR5cGVUeXBlIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlLXJlZiIKLQkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLQkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1pZGVudGl0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXNzaW9uLXR5cGVUeXBlIGRlc2NyaWJlcyB3aGV0aGVyIHRoZSBzZXNzaW9uIGJlYW4gaXMgYQotCXN0YXRlZnVsIHNlc3Npb24gb3Igc3RhdGVsZXNzIHNlc3Npb24uIEl0IGlzIHVzZWQgYnkKLQlzZXNzaW9uLXR5cGUgZWxlbWVudHMuCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgU3RhdGVmdWwKLQkgICAgU3RhdGVsZXNzCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZWZ1bCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlbGVzcyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zLWF0dHJpYnV0ZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0cmFucy1hdHRyaWJ1dGVUeXBlIHNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lciBtdXN0Ci0JbWFuYWdlIHRoZSB0cmFuc2FjdGlvbiBib3VuZGFyaWVzIHdoZW4gZGVsZWdhdGluZyBhIG1ldGhvZAotCWludm9jYXRpb24gdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MgbWV0aG9kLgotCi0JVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQkgICAgTm90U3VwcG9ydGVkCi0JICAgIFN1cHBvcnRzCi0JICAgIFJlcXVpcmVkCi0JICAgIFJlcXVpcmVzTmV3Ci0JICAgIE1hbmRhdG9yeQotCSAgICBOZXZlcgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90U3VwcG9ydGVkIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcG9ydHMiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlZCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVzTmV3Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuZGF0b3J5Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV2ZXIiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRyYW5zYWN0aW9uLXR5cGVUeXBlIHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncwotCXRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZS4KLQotCVRoZSB0cmFuc2FjdGlvbi10eXBlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JICAgIEJlYW4KLQkgICAgQ29udGFpbmVyCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFuIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfM18wLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8zXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODI4MjkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8zXzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjcwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMy4wIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIyllamItamFyXzNfMC54c2RzCTEuNTEgMDIvMjMvMDYKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAgICAgIFUuUy5BCi0gICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgRUpCIDMuMCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0JVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkICJNRVRBLUlORi9lamItamFyLnhtbCIgaW4KLQl0aGUgRUpCJ3MgamFyIGZpbGUuICBBbGwgRUpCIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZQotCXRoZSBlamItamFyIHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRSBuYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLQotCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLQl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDxlamItamFyIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotCQkgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9lamItamFyXzNfMC54c2QiCi0JICAgICAgdmVyc2lvbj0iMy4wIj4KLQkgICAgICAuLi4KLQkgICAgPC9lamItamFyPgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0JdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgdGhlCi0JSmF2YSBFRSBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2VqYi1qYXJfM18wLnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzUueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItamFyIiB0eXBlPSJqYXZhZWU6ZWpiLWphclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgaXMgdGhlIHJvb3Qgb2YgdGhlIGVqYi1qYXIgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmtleSBuYW1lPSJlamItbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGVqYi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gZW50ZXJwcmlzZQotCSAgYmVhbi4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyIGZpbGUuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplbnRlcnByaXNlLWJlYW5zLyoiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplamItbmFtZSIvPgotICAgIDwveHNkOmtleT4KLQotICAgIDx4c2Q6a2V5cmVmIG5hbWU9ImVqYi1uYW1lLXJlZmVyZW5jZXMiCi0JCXJlZmVyPSJqYXZhZWU6ZWpiLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBrZXlyZWYgaW5kaWNhdGVzIHRoZSByZWZlcmVuY2VzIGZyb20KLQkgIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBtdXN0IGJlIHRvIGEgc3BlY2lmaWMgZWpiLW5hbWUKLQkgIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBlbnRlcnByaXNlLWJlYW5zIGVsZW1lbnQuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IKLXhwYXRoPSIuLy9qYXZhZWU6ZWpiLXJlbGF0aW9uc2hpcC1yb2xlL2phdmFlZTpyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UiLz4KLSAgICAgIDx4c2Q6ZmllbGQKLQkgICB4cGF0aD0iamF2YWVlOmVqYi1uYW1lIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotCi0gICAgPHhzZDprZXkgbmFtZT0icm9sZS1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBBIHJvbGUtbmFtZS1rZXkgaXMgc3BlY2lmaWVkIHRvIGFsbG93IHRoZSByZWZlcmVuY2VzCi0JICBmcm9tIHRoZSBzZWN1cml0eS1yb2xlLXJlZnMuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTphc3NlbWJseS1kZXNjcmlwdG9yL2phdmFlZTpzZWN1cml0eS1yb2xlIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cm9sZS1uYW1lIi8+Ci0gICAgPC94c2Q6a2V5PgotCi0gICAgPHhzZDprZXlyZWYgbmFtZT0icm9sZS1uYW1lLXJlZmVyZW5jZXMiCi0JCXJlZmVyPSJqYXZhZWU6cm9sZS1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0JICBzZWN1cml0eS1yb2xlLXJlZiB0byBhIHNwZWNpZmllZCByb2xlLW5hbWUuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplbnRlcnByaXNlLWJlYW5zLyovamF2YWVlOnNlY3VyaXR5LXJvbGUtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cm9sZS1saW5rIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotICA8L3hzZDplbGVtZW50PgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSBjb250YWlucyBhIG5hbWUvdmFsdWUKLQljb25maWd1cmF0aW9uIHByb3BlcnR5IHBhaXIgZm9yIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQotCVRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlY29nbml6ZWQgZm9yIGEgcGFydGljdWxhcgotCW1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LW5hbWUgZWxlbWVudCBjb250YWlucwotCSAgICB0aGUgbmFtZSBmb3IgYW4gYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uIHByb3BlcnR5IG9mCi0JICAgIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQotCSAgICBGb3IgSk1TIG1lc3NhZ2UtZHJpdmVuIGJlYW5zLCB0aGUgZm9sbG93aW5nIHByb3BlcnR5Ci0JICAgIG5hbWVzIGFyZSByZWNvZ25pemVkOiBhY2tub3dsZWRnZU1vZGUsCi0JICAgIG1lc3NhZ2VTZWxlY3RvciwgZGVzdGluYXRpb25UeXBlLCBzdWJzY3JpcHRpb25EdXJhYmlsaXR5Ci0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktdmFsdWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LXZhbHVlIGVsZW1lbnQKLQkgICAgY29udGFpbnMgdGhlIHZhbHVlIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24KLQkgICAgcHJvcGVydHkgb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjdGl2YXRpb24tY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGFjdGl2YXRpb24tY29uZmlnVHlwZSBkZWZpbmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotCWV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbgotCWluIGl0cyBvcGVyYXRpb25hbCBlbnZpcm9ubWVudC4gVGhpcyBtYXkgaW5jbHVkZSBpbmZvcm1hdGlvbgotCWFib3V0IG1lc3NhZ2UgYWNrbm93bGVkZ2VtZW50LCBtZXNzYWdlIHNlbGVjdG9yLCBleHBlY3RlZAotCWRlc3RpbmF0aW9uIHR5cGUsIGV0Yy4KLQotCVRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZgotCW5hbWUvdmFsdWUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgotCi0JVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyCi0JbWVzc2FnZS1kcml2ZW4gYmVhbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbWVzc2FnaW5nIHR5cGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eSIKLQkJICAgdHlwZT0iamF2YWVlOmFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBsaWNhdGlvbi1leGNlcHRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFwcGxpY2F0aW9uLWV4Y2VwdGlvblR5cGUgZGVjbGFyZXMgYW4gYXBwbGljYXRpb24KLSAgICAgICAgZXhjZXB0aW9uLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLSAgICAgICAgICAgIC0gdGhlIGV4Y2VwdGlvbiBjbGFzcy4gV2hlbiB0aGUgY29udGFpbmVyIHJlY2VpdmVzCi0gICAgICAgICAgICAgIGFuIGV4Y2VwdGlvbiBvZiB0aGlzIHR5cGUsIGl0IGlzIHJlcXVpcmVkIHRvCi0gICAgICAgICAgICAgIGZvcndhcmQgdGhpcyBleGNlcHRpb24gYXMgYW4gYXBwbGNhdGlvbiBleGNlcHRpb24KLSAgICAgICAgICAgICAgdG8gdGhlIGNsaWVudCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgYSBjaGVja2VkCi0gICAgICAgICAgICAgIG9yIHVuY2hlY2tlZCBleGNlcHRpb24uCi0gICAgICAgICAgICAtIGFuIG9wdGlvbmFsIHJvbGxiYWNrIGVsZW1lbnQuIElmIHRoaXMgZWxlbWVudCBpcwotICAgICAgICAgICAgICBzZXQgdG8gdHJ1ZSwgdGhlIGNvbnRhaW5lciBtdXN0IHJvbGxiYWNrIHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAgIHRyYW5zYWN0aW9uIGJlZm9yZSBmb3J3YXJkaW5nIHRoZSBleGNlcHRpb24gdG8gdGhlCi0gICAgICAgICAgICAgIGNsaWVudC4gIElmIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGZhbHNlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24tY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sbGJhY2siCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFyb3VuZC1pbnZva2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFyb3VuZC1pbnZva2UgdHlwZSBzcGVjaWZpZXMgYSBtZXRob2Qgb24gYQotICAgICAgICBjbGFzcyB0byBiZSBjYWxsZWQgZHVyaW5nIHRoZSBhcm91bmQgaW52b2tlIHBvcnRpb24gb2YgYW4KLSAgICAgICAgZWpiIGludm9jYXRpb24uICBOb3RlIHRoYXQgZWFjaCBjbGFzcyBtYXkgaGF2ZSBvbmx5IG9uZQotICAgICAgICBhcm91bmQgaW52b2tlIG1ldGhvZCBhbmQgdGhhdCB0aGUgbWV0aG9kIG1heSBub3QgYmUKLSAgICAgICAgb3ZlcmxvYWRlZC4KLQotICAgICAgICBJZiB0aGUgY2xhc3MgZWxlbWVudCBpcyBtaXNzaW5nIHRoZW4KLSAgICAgICAgdGhlIGNsYXNzIGRlZmluaW5nIHRoZSBjYWxsYmFjayBpcyBhc3N1bWVkIHRvIGJlIHRoZQotICAgICAgICBpbnRlcmNlcHRvciBjbGFzcyBvciBjb21wb25lbnQgY2xhc3MgaW4gc2NvcGUgYXQgdGhlCi0gICAgICAgIGxvY2F0aW9uIGluIHRoZSBkZXNjcmlwdG9yIGluIHdoaWNoIHRoZSBhcm91bmQgaW52b2tlCi0gICAgICAgIGRlZmluaXRpb24gYXBwZWFycy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzc2VtYmx5LWRlc2NyaXB0b3JUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXNzZW1ibHktZGVzY3JpcHRvclR5cGUgZGVmaW5lcwotCWFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uLgotCi0JVGhlIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uIGNvbnNpc3RzIG9mIHRoZQotCWZvbGxvd2luZyBwYXJ0czogdGhlIGRlZmluaXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMsIHRoZQotCWRlZmluaXRpb24gb2YgbWV0aG9kIHBlcm1pc3Npb25zLCB0aGUgZGVmaW5pdGlvbiBvZgotCXRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yIGVudGVycHJpc2UgYmVhbnMgd2l0aAotCWNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uLCB0aGUgZGVmaW5pdGlvbgotICAgICAgICBvZiBpbnRlcmNlcHRvciBiaW5kaW5ncywgYSBsaXN0IG9mCi0JbWV0aG9kcyB0byBiZSBleGNsdWRlZCBmcm9tIGJlaW5nIGludm9rZWQsIGFuZCBhIGxpc3Qgb2YKLSAgICAgICAgZXhjZXB0aW9uIHR5cGVzIHRoYXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYXBwbGljYXRpb24gZXhjZXB0aW9ucy4KLQotCUFsbCB0aGUgcGFydHMgYXJlIG9wdGlvbmFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlCi0Jb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuCi0KLQlQcm92aWRpbmcgYW4gYXNzZW1ibHktZGVzY3JpcHRvciBpbiB0aGUgZGVwbG95bWVudAotCWRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZSIKLQkJICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LXJvbGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBlcm1pc3Npb24iCi0JCSAgIHR5cGU9ImphdmFlZTptZXRob2QtcGVybWlzc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItdHJhbnNhY3Rpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJjZXB0b3ItYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aW50ZXJjZXB0b3ItYmluZGluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1saXN0IgotCQkgICB0eXBlPSJqYXZhZWU6ZXhjbHVkZS1saXN0VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24tZXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphcHBsaWNhdGlvbi1leGNlcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtcC1maWVsZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjbXAtZmllbGRUeXBlIGRlc2NyaWJlcyBhIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkLiBUaGUKLQljbXAtZmllbGRUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWVsZCwKLQlhbmQgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICBjb250YWluZXIgbWFuYWdlZCBmaWVsZC4KLQotCSAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLQkgICAgY21wLXZlcnNpb24gMi54IG11c3QgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZQotCSAgICBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcyB3aG9zZQotCSAgICBuYW1lcyBjb25zaXN0cyBvZiB0aGUgbmFtZSBvZiB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5Ci0JICAgIGZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0IGxldHRlciBpcyB1cHBlcmNhc2VkLAotCSAgICBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4KLQotCSAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLQkgICAgY21wLXZlcnNpb24gMS54IG11c3QgZGVub3RlIGEgcHVibGljIGZpZWxkIG9mIHRoZQotCSAgICBlbnRlcnByaXNlIGJlYW4gY2xhc3Mgb3Igb25lIG9mIGl0cyBzdXBlcmNsYXNzZXMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY21wLXZlcnNpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY21wLXZlcnNpb25UeXBlIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiBhbiBlbnRpdHkgYmVhbgotCXdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuIEl0IGlzIHVzZWQgYnkKLQljbXAtdmVyc2lvbiBlbGVtZW50cy4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICAxLngKLQkgICAgMi54Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEueCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIueCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtci1maWVsZC10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNtci1maWVsZC10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjbGFzcyBvZiBhCi0JY29sbGVjdGlvbi12YWx1ZWQgbG9naWNhbCByZWxhdGlvbnNoaXAgZmllbGQgaW4gdGhlIGVudGl0eQotCWJlYW4gY2xhc3MuIFRoZSB2YWx1ZSBvZiBhbiBlbGVtZW50IHVzaW5nIGNtci1maWVsZC10eXBlVHlwZQotCW11c3QgYmUgZWl0aGVyOiBqYXZhLnV0aWwuQ29sbGVjdGlvbiBvciBqYXZhLnV0aWwuU2V0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEudXRpbC5TZXQiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXItZmllbGRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY21yLWZpZWxkVHlwZSBkZXNjcmliZXMgdGhlIGJlYW4gcHJvdmlkZXIncyB2aWV3IG9mCi0JYSByZWxhdGlvbnNoaXAuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQKLQl0aGUgbmFtZSBhbmQgdGhlIGNsYXNzIHR5cGUgb2YgYSBmaWVsZCBpbiB0aGUgc291cmNlIG9mIGEKLQlyb2xlIG9mIGEgcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLW5hbWUgZWxlbWVudAotCWNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lIHVzZWQgZm9yIHRoZSBnZXQgYW5kIHNldCBhY2Nlc3NvcgotCW1ldGhvZHMgZm9yIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBjbXItZmllbGQtdHlwZSBlbGVtZW50IGlzCi0JdXNlZCBvbmx5IGZvciBjb2xsZWN0aW9uLXZhbHVlZCBjbXItZmllbGRzLiBJdCBzcGVjaWZpZXMgdGhlCi0JdHlwZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IGlzIHVzZWQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXItZmllbGQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBjbXItZmllbGQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICAgIGxvZ2ljYWwgcmVsYXRpb25zaGlwIGZpZWxkIGluIHRoZSBlbnRpdHkgYmVhbgotCSAgICBjbGFzcy4gVGhlIG5hbWUgb2YgdGhlIGNtci1maWVsZCBtdXN0IGJlZ2luIHdpdGggYQotCSAgICBsb3dlcmNhc2UgbGV0dGVyLiBUaGlzIGZpZWxkIGlzIGFjY2Vzc2VkIGJ5IG1ldGhvZHMKLQkgICAgd2hvc2UgbmFtZXMgY29uc2lzdCBvZiB0aGUgbmFtZSBvZiB0aGUgZmllbGQKLQkgICAgc3BlY2lmaWVkIGJ5IGNtci1maWVsZC1uYW1lIGluIHdoaWNoIHRoZSBmaXJzdAotCSAgICBsZXR0ZXIgaXMgdXBwZXJjYXNlZCwgcHJlZml4ZWQgYnkgImdldCIgb3IgInNldCIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkLXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTpjbXItZmllbGQtdHlwZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnRhaW5lci10cmFuc2FjdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIHNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lcgotCW11c3QgbWFuYWdlIHRyYW5zYWN0aW9uIHNjb3BlcyBmb3IgdGhlIGVudGVycHJpc2UgYmVhbidzCi0JbWV0aG9kIGludm9jYXRpb25zLiBJdCBkZWZpbmVzIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhCi0JbGlzdCBvZiBtZXRob2QgZWxlbWVudHMsIGFuZCBhIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZS4gVGhlCi0JdHJhbnNhY3Rpb24gYXR0cmlidXRlIGlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQKLQltZXRob2RzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIgotCQkgICB0eXBlPSJqYXZhZWU6bWV0aG9kVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFucy1hdHRyaWJ1dGUiCi0JCSAgIHR5cGU9ImphdmFlZTp0cmFucy1hdHRyaWJ1dGVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLWNsYXNzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgZWpiLWNsYXNzVHlwZSBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi0JICBlbnRlcnByaXNlIGJlYW4ncyBjbGFzcy4gSXQgaXMgdXNlZCBieSBlamItY2xhc3MgZWxlbWVudHMuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgICAgICA8ZWpiLWNsYXNzPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2VCZWFuPC9lamItY2xhc3M+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLWphclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlamItamFyVHlwZSBkZWZpbmVzIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIEVKQgotCWRlcGxveW1lbnQgZGVzY3JpcHRvci4gSXQgY29udGFpbnMKLQotCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBlamItamFyIGZpbGUKLQkgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLQkgICAgLSBhbiBvcHRpb25hbCBpY29uIHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotCSAgICAgIGljb24gZmlsZSBuYW1lCi0JICAgIC0gc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgaW5jbHVkZWQKLQkgICAgICBlbnRlcnByaXNlIGJlYW5zIHRoYXQgaXMgbm90IHNwZWNpZmllZCB0aHJvdWdoCi0gICAgICAgICAgICAgIGFubm90YXRpb25zCi0gICAgICAgICAgICAtIHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYWJvdXQgaW50ZXJjZXB0b3IgY2xhc3NlcwotCSAgICAtIGEgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcywKLQkgICAgICBpZiBhbnkuCi0JICAgIC0gYW4gb3B0aW9uYWwgYXBwbGljYXRpb24tYXNzZW1ibHkgZGVzY3JpcHRvcgotCSAgICAtIGFuIG9wdGlvbmFsIG5hbWUgb2YgYW4gZWpiLWNsaWVudC1qYXIgZmlsZSBmb3IgdGhlCi0JICAgICAgZWpiLWphci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGVycHJpc2UtYmVhbnMiCi0JCSAgIHR5cGU9ImphdmFlZTplbnRlcnByaXNlLWJlYW5zVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnRlcmNlcHRvcnMiCi0JCSAgIHR5cGU9ImphdmFlZTppbnRlcmNlcHRvcnNUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbGF0aW9uc2hpcHMiCi0JCSAgIHR5cGU9ImphdmFlZTpyZWxhdGlvbnNoaXBzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOnVuaXF1ZSBuYW1lPSJyZWxhdGlvbnNoaXAtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWxhdGlvbi1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgICByZWxhdGlvbi4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICAgICAgcmVsYXRpb25zaGlwcy4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItcmVsYXRpb24iLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplamItcmVsYXRpb24tbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzZW1ibHktZGVzY3JpcHRvciIKLQkJICAgdHlwZT0iamF2YWVlOmFzc2VtYmx5LWRlc2NyaXB0b3JUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBQcm92aWRpbmcgYW4gYXNzZW1ibHktZGVzY3JpcHRvciBpbiB0aGUgZGVwbG95bWVudAotCSAgICBkZXNjcmlwdG9yIGlzIG9wdGlvbmFsIGZvciB0aGUgZWpiLWphciBmaWxlCi0JICAgIHByb2R1Y2VyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGllbnQtamFyIgotCQkgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBvcHRpb25hbCBlamItY2xpZW50LWphciBlbGVtZW50IHNwZWNpZmllcyBhIEpBUgotCSAgICAgIGZpbGUgdGhhdCBjb250YWlucyB0aGUgY2xhc3MgZmlsZXMgbmVjZXNzYXJ5IGZvciBhCi0JICAgICAgY2xpZW50IHByb2dyYW0gdG8gYWNjZXNzIHRoZQotCSAgICAgIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIGVqYi1qYXIgZmlsZS4KLQotCSAgICAgIEV4YW1wbGU6Ci0KLQkJICA8ZWpiLWNsaWVudC1qYXI+ZW1wbG95ZWVfc2VydmljZV9jbGllbnQuamFyCi0JCSAgPC9lamItY2xpZW50LWphcj4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0JCSAgIGZpeGVkPSIzLjAiCi0JCSAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHZlcnNpb24gc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZQotCSAgRUpCIHNwZWNpZmljYXRpb24gdGhhdCB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgbXVzdAotCSAgY29tcGx5IHdpdGguIFRoaXMgaW5mb3JtYXRpb24gZW5hYmxlcyBkZXBsb3ltZW50IHRvb2xzCi0JICB0byB2YWxpZGF0ZSBhIHBhcnRpY3VsYXIgRUpCIERlcGxveW1lbnQKLQkgIERlc2NyaXB0b3Igd2l0aCByZXNwZWN0IHRvIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgRUpCCi0JICBzY2hlbWEuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgZGVmaW5lcyB3aGV0aGVyIHRoaXMKLQkgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgb3RoZXIgcmVsYXRlZCBkZXBsb3ltZW50Ci0JICBkZXNjcmlwdG9ycyBmb3IgdGhpcyBtb2R1bGUgKGUuZy4sIHdlYiBzZXJ2aWNlCi0JICBkZXNjcmlwdG9ycykgYXJlIGNvbXBsZXRlLCBvciB3aGV0aGVyIHRoZSBjbGFzcwotCSAgZmlsZXMgYXZhaWxhYmxlIHRvIHRoaXMgbW9kdWxlIGFuZCBwYWNrYWdlZCB3aXRoCi0JICB0aGlzIGFwcGxpY2F0aW9uIHNob3VsZCBiZSBleGFtaW5lZCBmb3IgYW5ub3RhdGlvbnMKLQkgIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50IGluZm9ybWF0aW9uLgotCi0JICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBzZXQgdG8gInRydWUiLCB0aGUgZGVwbG95bWVudAotCSAgdG9vbCBtdXN0IGlnbm9yZSBhbnkgYW5ub3RhdGlvbnMgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQKLQkgIGluZm9ybWF0aW9uLCB3aGljaCBtaWdodCBiZSBwcmVzZW50IGluIHRoZSBjbGFzcyBmaWxlcwotCSAgb2YgdGhlIGFwcGxpY2F0aW9uLgotCi0JICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIHNldCB0bwotCSAgImZhbHNlIiwgdGhlIGRlcGxveW1lbnQgdG9vbCBtdXN0IGV4YW1pbmUgdGhlIGNsYXNzCi0JICBmaWxlcyBvZiB0aGUgYXBwbGljYXRpb24gZm9yIGFubm90YXRpb25zLCBhcwotCSAgc3BlY2lmaWVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9ucy4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPC94c2Q6YXR0cmlidXRlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBlamItbmFtZVR5cGUgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbidzIG5hbWUuIEl0IGlzCi0JICB1c2VkIGJ5IGVqYi1uYW1lIGVsZW1lbnRzLiBUaGlzIG5hbWUgaXMgYXNzaWduZWQgYnkgdGhlCi0JICBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gbmFtZSB0aGUgZW50ZXJwcmlzZSBiZWFuIGluIHRoZQotCSAgZWpiLWphciBmaWxlJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlCi0JICB1bmlxdWUgYW1vbmcgdGhlIG5hbWVzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW5zIGluIHRoZSBzYW1lCi0JICBlamItamFyIGZpbGUuCi0KLQkgIFRoZXJlIGlzIG5vIGFyY2hpdGVjdGVkIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB1c2VkCi0JICBlamItbmFtZSBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFuZCB0aGUgSk5ESSBuYW1lIHRoYXQKLQkgIHRoZSBEZXBsb3llciB3aWxsIGFzc2lnbiB0byB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4KLQotCSAgVGhlIG5hbWUgZm9yIGFuIGVudGl0eSBiZWFuIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbAotCSAgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTp4c2ROTVRPS0VOVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItcmVsYXRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWpiLXJlbGF0aW9uVHlwZSBkZXNjcmliZXMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28KLQllbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4gIEl0IGlzIHVzZWQKLQlieSBlamItcmVsYXRpb24gZWxlbWVudHMuIEl0IGNvbnRhaW5zIGEgZGVzY3JpcHRpb247IGFuCi0Jb3B0aW9uYWwgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudDsgYW5kIGV4YWN0bHkgdHdvCi0JcmVsYXRpb25zaGlwIHJvbGUgZGVjbGFyYXRpb25zLCBkZWZpbmVkIGJ5IHRoZQotCWVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50cy4gVGhlIG5hbWUgb2YgdGhlCi0JcmVsYXRpb25zaGlwLCBpZiBzcGVjaWZpZWQsIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIKLQlmaWxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50IHByb3ZpZGVzIGEgdW5pcXVlIG5hbWUKLQkgICAgd2l0aGluIHRoZSBlamItamFyIGZpbGUgZm9yIGEgcmVsYXRpb25zaGlwLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZSIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb25zaGlwLXJvbGUiCi0JCSAgIHR5cGU9ImphdmFlZTplamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSBkZXNjcmliZXMgYSByb2xlIHdpdGhpbiBhCi0JICByZWxhdGlvbnNoaXAuIFRoZXJlIGFyZSB0d28gcm9sZXMgaW4gZWFjaCByZWxhdGlvbnNoaXAuCi0KLQkgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsCi0JICBkZXNjcmlwdGlvbjsgYW4gb3B0aW9uYWwgbmFtZSBmb3IgdGhlIHJlbGF0aW9uc2hpcCByb2xlOyBhCi0JICBzcGVjaWZpY2F0aW9uIG9mIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGU7IGFuIG9wdGlvbmFsCi0JICBzcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByb2xlOwotCSAgdGhlIHJvbGUgc291cmNlOyBhbmQgYSBkZWNsYXJhdGlvbiBvZiB0aGUgY21yLWZpZWxkLCBpZiBhbnksCi0JICBieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGlzCi0JICBhY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuCi0KLQkgIFRoZSBtdWx0aXBsaWNpdHkgYW5kIHJvbGUtc291cmNlIGVsZW1lbnQgYXJlIG1hbmRhdG9yeS4KLQotCSAgVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGRlc2lnbmF0ZXMgYW4gZW50aXR5Ci0JICBiZWFuIGJ5IG1lYW5zIG9mIGFuIGVqYi1uYW1lIGVsZW1lbnQuIEZvciBiaWRpcmVjdGlvbmFsCi0JICByZWxhdGlvbnNoaXBzLCBib3RoIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG11c3QgZGVjbGFyZSBhCi0JICByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB0aGF0IHNwZWNpZmllcyBhIGNtci1maWVsZAotCSAgaW4gdGVybXMgb2Ygd2hpY2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZC4gVGhlIGxhY2sgb2YKLQkgIGEgY21yLWZpZWxkIGVsZW1lbnQgaW4gYW4gZWpiLXJlbGF0aW9uc2hpcC1yb2xlIHNwZWNpZmllcwotCSAgdGhhdCB0aGUgcmVsYXRpb25zaGlwIGlzIHVuaWRpcmVjdGlvbmFsIGluIG5hdmlnYWJpbGl0eSBhbmQKLQkgIHRoZSBlbnRpdHkgYmVhbiB0aGF0IHBhcnRpY2lwYXRlcyBpbiB0aGUgcmVsYXRpb25zaGlwIGlzCi0JICAibm90IGF3YXJlIiBvZiB0aGUgcmVsYXRpb25zaGlwLgotCi0JICBFeGFtcGxlOgotCi0JICA8ZWpiLXJlbGF0aW9uPgotCSAgICAgIDxlamItcmVsYXRpb24tbmFtZT5Qcm9kdWN0LUxpbmVJdGVtPC9lamItcmVsYXRpb24tbmFtZT4KLQkgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotCQkgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5wcm9kdWN0LWhhcy1saW5laXRlbXMKLQkJICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotCQkgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0JCSAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLQkJICA8ZWpiLW5hbWU+UHJvZHVjdEVKQjwvZWpiLW5hbWU+Ci0JCSAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0JICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotCSAgPC9lamItcmVsYXRpb24+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUgZWxlbWVudCBkZWZpbmVzIGEKLQkgICAgbmFtZSBmb3IgYSByb2xlIHRoYXQgaXMgdW5pcXVlIHdpdGhpbiBhbgotCSAgICBlamItcmVsYXRpb24uIERpZmZlcmVudCByZWxhdGlvbnNoaXBzIGNhbiB1c2UgdGhlCi0JICAgIHNhbWUgbmFtZSBmb3IgYSByb2xlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im11bHRpcGxpY2l0eSIKLQkJICAgdHlwZT0iamF2YWVlOm11bHRpcGxpY2l0eVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWRlbGV0ZSIKLQkJICAgdHlwZT0iamF2YWVlOmVtcHR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQsIHdpdGhpbiBhCi0JICAgIHBhcnRpY3VsYXIgcmVsYXRpb25zaGlwLCB0aGUgbGlmZXRpbWUgb2Ygb25lIG9yIG1vcmUKLQkgICAgZW50aXR5IGJlYW5zIGlzIGRlcGVuZGVudCB1cG9uIHRoZSBsaWZldGltZSBvZgotCSAgICBhbm90aGVyIGVudGl0eSBiZWFuLiBUaGUgY2FzY2FkZS1kZWxldGUgZWxlbWVudCBjYW4KLQkgICAgb25seSBiZSBzcGVjaWZpZWQgZm9yIGFuIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotCSAgICBlbGVtZW50IGNvbnRhaW5lZCBpbiBhbiBlamItcmVsYXRpb24gZWxlbWVudCBpbgotCSAgICB3aGljaCB0aGUgb3RoZXIgZWpiLXJlbGF0aW9uc2hpcC1yb2xlCi0JICAgIGVsZW1lbnQgc3BlY2lmaWVzIGEgbXVsdGlwbGljaXR5IG9mIE9uZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UiCi0JCSAgIHR5cGU9ImphdmFlZTpyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkIgotCQkgICB0eXBlPSJqYXZhZWU6Y21yLWZpZWxkVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50ZXJwcmlzZS1iZWFuc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbnRlcnByaXNlLWJlYW5zVHlwZSBkZWNsYXJlcyBvbmUgb3IgbW9yZSBlbnRlcnByaXNlCi0JYmVhbnMuIEVhY2ggYmVhbiBjYW4gYmUgYSBzZXNzaW9uLCBlbnRpdHkgb3IgbWVzc2FnZS1kcml2ZW4KLQliZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOnNlc3Npb24tYmVhblR5cGUiPgotCTx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YKLQkgICAgICBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbgotCSAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICAgICAgdGhlIGNvbXBvbmVudC4KLQotCSAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItbG9jYWwtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotCSAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0KLQkgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tcmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgICB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLQkgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgICAgIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgICBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLQkgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgICAgIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLQkgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cmVzLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0JICAgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlCi0JICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVudi1lbnRyeSIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVudi1lbnRyeS1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eSIKLQkJICAgdHlwZT0iamF2YWVlOmVudGl0eS1iZWFuVHlwZSI+Ci0JPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mCi0JICAgICAgYW4gRUpCIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4KLQkgICAgICB0aGUgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotCSAgICAgIHRoZSBjb21wb25lbnQuCi0KLQkgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgYmUgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLWxvY2FsLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotCSAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0KLQkgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotCSAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0JICAgICAgY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgICAgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICAgICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0JICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLQkgICAgICBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLQkgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cmVzLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LWVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLQkgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLQkgICAgICBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5Ii8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5LW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kcml2ZW4iCi0JCSAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRyaXZlbi1iZWFuVHlwZSI+Ci0JPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YKLQkgICAgICBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbgotCSAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICAgICAgdGhlIGNvbXBvbmVudC4KLQotCSAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItbG9jYWwtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtZWpiLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0JICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLQkgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAgICAgIHdpdGhpbiB0aGUgY29tcG9uZW50LgotCi0JICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplamItcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotCSAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0JICAgICAgY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgICBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLQkgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgICAgIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1yZXMtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0JICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQkgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJlcy1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLWVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLQkgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLQkgICAgICBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5Ii8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5LW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6Y2hvaWNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1iZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVudGl0eS1iZWFuVHlwZSBkZWNsYXJlcyBhbiBlbnRpdHkgYmVhbi4gVGhlIGRlY2xhcmF0aW9uCi0JY29uc2lzdHMgb2Y6Ci0KLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotCSAgICAtIGFuIG9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UKLQkgICAgICBpY29uIGZpbGUgbmFtZQotCSAgICAtIGEgdW5pcXVlIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbgotCSAgICAgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLSAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgbWFwcGVkLW5hbWUgZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUKLSAgICAgICAgICAgICAgdmVuZG9yLXNwZWNpZmljIGRlcGxveW1lbnQgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgcGh5c2ljYWwKLSAgICAgICAgICAgICAgam5kaS1uYW1lIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBob21lIGludGVyZmFjZS4gVGhpcwotICAgICAgICAgICAgICBlbGVtZW50IGlzIG5vdCByZXF1aXJlZCB0byBiZSBzdXBwb3J0ZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucy4KLSAgICAgICAgICAgICAgQW55IHVzZSBvZiB0aGlzIGVsZW1lbnQgaXMgbm9uLXBvcnRhYmxlLgotCSAgICAtIHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaG9tZQotCSAgICAgIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55Ci0JICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIGxvY2FsIGhvbWUgYW5kIGxvY2FsCi0JICAgICAgaW50ZXJmYWNlcywgaWYgYW55Ci0JICAgIC0gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLQkgICAgLSB0aGUgb3B0aW9uYWwgZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZSBtYW5hZ2VtZW50IHR5cGUuIElmCi0gICAgICAgICAgICAgIHRoaXMgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkIGl0IGlzIGRlZmF1bHRlZCB0byBDb250YWluZXIuCi0JICAgIC0gdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MgbmFtZQotCSAgICAtIGFuIGluZGljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVlbnRyYW5jeQotCSAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlCi0JICAgICAgZW50aXR5IGJlYW4ncyBjbXAtdmVyc2lvbgotCSAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MKLQkgICAgICBhYnN0cmFjdCBzY2hlbWEgbmFtZQotCSAgICAtIGFuIG9wdGlvbmFsIGxpc3Qgb2YgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0JICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkKLQkgICAgICBmaWVsZAotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQKLQkgICAgICBlbnRyaWVzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIKLQkgICAgICByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbAotCSAgICAgIEVKQiByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIKLQkgICAgICBzZXJ2aWNlIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZQotCSAgICAgIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkKLQkgICAgICB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UKLQkgICAgICBkZXN0aW5hdGlvbiByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgc2V0IG9mIHF1ZXJ5IGRlY2xhcmF0aW9ucwotCSAgICAgIGZvciBmaW5kZXIgYW5kIHNlbGVjdCBtZXRob2RzIGZvciBhbiBlbnRpdHkKLQkgICAgICBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54LgotCi0JVGhlIG9wdGlvbmFsIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQKLQlmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZSBhbmQKLQljbXAtdmVyc2lvbiAyLnguCi0KLQlUaGUgb3B0aW9uYWwgcHJpbWtleS1maWVsZCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvcgotCWlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lci4KLQotCVRoZSBvcHRpb25hbCBjbXAtdmVyc2lvbiBlbGVtZW50IG1heSBiZSBwcmVzZW50IGluIHRoZQotCWRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLiBJZgotCXRoZSBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uCi0JZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdHMgdmFsdWUgZGVmYXVsdHMgdG8gMi54LgotCi0JVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZgotCXRoZSBlbnRpdHkgYmVhbiBjbXAtdmVyc2lvbiBpcyAxLnguCi0KLQlUaGUgb3B0aW9uYWwgaG9tZSBhbmQgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmCi0JdGhlIGVudGl0eSBiZWFuIGhhcyBhIHJlbW90ZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlLgotCi0JVGhlIG9wdGlvbmFsIGxvY2FsLWhvbWUgYW5kIGxvY2FsIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkCi0JaWYgdGhlIGVudGl0eSBiZWFuIGhhcyBhIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZS4KLQotCUVpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aAotCXRoZSBob21lIGFuZCB0aGUgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkLgotCi0JVGhlIG9wdGlvbmFsIHF1ZXJ5IGVsZW1lbnRzIG11c3QgYmUgcHJlc2VudCBpZiB0aGUKLQlwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDIueCBhbmQKLQlxdWVyeSBtZXRob2RzIG90aGVyIHRoYW4gZmluZEJ5UHJpbWFyeUtleSBoYXZlIGJlZW4gZGVmaW5lZAotCWZvciB0aGUgZW50aXR5IGJlYW4uCi0KLQlUaGUgb3RoZXIgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlCi0Jc2Vuc2UgdGhhdCB0aGV5IGFyZSBvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtCi0JYXJlIGVtcHR5LgotCi0JQXQgbGVhc3Qgb25lIGNtcC1maWVsZCBlbGVtZW50IG11c3QgYmUgcHJlc2VudCBpbiB0aGUKLQlkZXNjcmlwdG9yIGlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQKLQl0aGUgY21wLXZlcnNpb24gaXMgMS54LCBhbmQgbm9uZSBtdXN0IG5vdCBiZSBwcmVzZW50IGlmIHRoZQotCWVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQmVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJob21lIgotCQkgICB0eXBlPSJqYXZhZWU6aG9tZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZSIKLQkJICAgdHlwZT0iamF2YWVlOnJlbW90ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsLWhvbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpsb2NhbC1ob21lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwiCi0JCSAgIHR5cGU9ImphdmFlZTpsb2NhbFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1jbGFzc1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6cGVyc2lzdGVuY2UtdHlwZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltLWtleS1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcHJpbS1rZXktY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUKLQkgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYW4KLQkgICAgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSBjbGFzcy4KLQotCSAgICBJZiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgaXMKLQkgICAgZGVmZXJyZWQgdG8gZGVwbG95bWVudCB0aW1lLCB0aGUgcHJpbS1rZXktY2xhc3MKLQkgICAgZWxlbWVudCBzaG91bGQgc3BlY2lmeSBqYXZhLmxhbmcuT2JqZWN0LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZW50cmFudCIKLQkJICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJlZW50cmFudCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGFuIGVudGl0eQotCSAgICBiZWFuIGlzIHJlZW50cmFudCBvciBub3QuCi0KLQkgICAgVGhlIHJlZW50cmFudCBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28KLQkgICAgZm9sbG93aW5nOiB0cnVlIG9yIGZhbHNlCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21wLXZlcnNpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpjbXAtdmVyc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFic3RyYWN0LXNjaGVtYS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgIG9mIHRoZSBhYnN0cmFjdCBzY2hlbWEgdHlwZSBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoCi0JICAgIGNtcC12ZXJzaW9uIDIueC4gSXQgaXMgdXNlZCBpbiBFSkIgUUwgcXVlcmllcy4KLQotCSAgICBGb3IgZXhhbXBsZSwgdGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGZvciBhbiBlbnRpdHkKLQkgICAgYmVhbiB3aG9zZSBsb2NhbCBpbnRlcmZhY2UgaXMKLQkgICAgY29tLmFjbWUuY29tbWVyY2UuT3JkZXIgbWlnaHQgYmUgT3JkZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21wLWZpZWxkIgotCQkgICB0eXBlPSJqYXZhZWU6Y21wLWZpZWxkVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1rZXktZmllbGQiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQotCSAgICBuYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBmaWVsZCBmb3IgYW4gZW50aXR5IHdpdGgKLQkgICAgY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuCi0KLQkgICAgVGhlIHByaW1rZXktZmllbGQgbXVzdCBiZSBvbmUgb2YgdGhlIGZpZWxkcyBkZWNsYXJlZAotCSAgICBpbiB0aGUgY21wLWZpZWxkIGVsZW1lbnQsIGFuZCB0aGUgdHlwZSBvZiB0aGUgZmllbGQKLQkgICAgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgcHJpbWFyeSBrZXkgdHlwZS4KLQotCSAgICBUaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIG5vdCB1c2VkIGlmIHRoZSBwcmltYXJ5Ci0JICAgIGtleSBtYXBzIHRvIG11bHRpcGxlIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcwotCSAgICAoaS5lLiB0aGUga2V5IGlzIGEgY29tcG91bmQga2V5KS4gSW4gdGhpcyBjYXNlLCB0aGUKLQkgICAgZmllbGRzIG9mIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kCi0JICAgIHRoZWlyIG5hbWVzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgZmllbGQgbmFtZXMgb2YKLQkgICAgdGhlIGVudGl0eSBiZWFuIGNsYXNzIHRoYXQgY29tcHJpc2UgdGhlIGtleS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6am5kaUVudmlyb25tZW50UmVmc0dyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLQkJICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LWlkZW50aXR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiCi0JCSAgIHR5cGU9ImphdmFlZTpxdWVyeVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJleGNsdWRlLWxpc3RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZXhjbHVkZS1saXN0VHlwZSBzcGVjaWZpZXMgb25lIG9yIG1vcmUgbWV0aG9kcyB3aGljaAotCXRoZSBBc3NlbWJsZXIgbWFya3MgdG8gYmUgdW5jYWxsYWJsZS4KLQotCUlmIHRoZSBtZXRob2QgcGVybWlzc2lvbiByZWxhdGlvbiBjb250YWlucyBtZXRob2RzIHRoYXQgYXJlCi0JaW4gdGhlIGV4Y2x1ZGUgbGlzdCwgdGhlIERlcGxveWVyIHNob3VsZCBjb25zaWRlciB0aG9zZQotCW1ldGhvZHMgdG8gYmUgdW5jYWxsYWJsZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIKLQkJICAgdHlwZT0iamF2YWVlOm1ldGhvZFR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5pdC1tZXRob2RUeXBlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNyZWF0ZS1tZXRob2QiCi0JCSAgIHR5cGU9ImphdmFlZTpuYW1lZC1tZXRob2RUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmVhbi1tZXRob2QiCi0JCSAgIHR5cGU9ImphdmFlZTpuYW1lZC1tZXRob2RUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJjZXB0b3ItYmluZGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgaW50ZXJjZXB0b3ItYmluZGluZ1R5cGUgZWxlbWVudCBkZXNjcmliZXMgdGhlIGJpbmRpbmcgb2YKLSAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3NlcyB0byBiZWFucyB3aXRoaW4gdGhlIGVqYi1qYXIuCi0gICAgICAgIEl0IGNvbnNpc3RzIG9mIDoKLQotICAgICAgICAgIC0gQW4gb3B0aW9uYWwgZGVzY3JpcHRpb24uCi0gICAgICAgICAgLSBUaGUgbmFtZSBvZiBhbiBlamIgd2l0aGluIHRoZSBlamItamFyIG9yIHRoZSB3aWxkY2FyZCB2YWx1ZSAiKiIsCi0gICAgICAgICAgICB3aGljaCBpcyB1c2VkIHRvIGRlZmluZSBpbnRlcmNlcHRvcnMgdGhhdCBhcmUgYm91bmQgdG8gYWxsCi0gICAgICAgICAgICBiZWFucyBpbiB0aGUgZWpiLWphci4KLSAgICAgICAgICAtIEEgbGlzdCBvZiBpbnRlcmNlcHRvciBjbGFzc2VzIHRoYXQgYXJlIGJvdW5kIHRvIHRoZSBjb250ZW50cyBvZgotICAgICAgICAgICAgdGhlIGVqYi1uYW1lIGVsZW1lbnQgb3IgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSB0b3RhbCBvcmRlcmluZwotICAgICAgICAgICAgb3ZlciB0aGUgaW50ZXJjZXB0b3JzIGRlZmluZWQgZm9yIHRoZSBnaXZlbiBsZXZlbCBhbmQgYWJvdmUuCi0gICAgICAgICAgLSBBbiBvcHRpb25hbCBleGNsdWRlLWRlZmF1bHQtaW50ZXJjZXB0b3JzIGVsZW1lbnQuICBJZiBzZXQgdG8gdHJ1ZSwKLSAgICAgICAgICAgIHNwZWNpZmllcyB0aGF0IGRlZmF1bHQgaW50ZXJjZXB0b3JzIGFyZSBub3QgdG8gYmUgYXBwbGllZCB0bwotICAgICAgICAgICAgYSBiZWFuLWNsYXNzIGFuZC9vciBidXNpbmVzcyBtZXRob2QuCi0gICAgICAgICAgLSBBbiBvcHRpb25hbCBleGNsdWRlLWNsYXNzLWludGVyY2VwdG9ycyBlbGVtZW50LiAgSWYgc2V0IHRvIHRydWUsCi0gICAgICAgICAgICBzcGVjaWZpZXMgdGhhdCBjbGFzcyBpbnRlcmNlcHRvcnMgYXJlIG5vdCB0byBiZSBhcHBsaWVkIHRvCi0gICAgICAgICAgICBhIGJ1c2luZXNzIG1ldGhvZC4KLSAgICAgICAgICAtIEFuIG9wdGlvbmFsIHNldCBvZiBtZXRob2QgZWxlbWVudHMgZm9yIGRlc2NyaWJpbmcgdGhlIG5hbWUvcGFyYW1zCi0gICAgICAgICAgICBvZiBhIG1ldGhvZC1sZXZlbCBpbnRlcmNlcHRvci4KLQotICAgICAgICAgSW50ZXJjZXB0b3JzIGJvdW5kIHRvIGFsbCBjbGFzc2VzIHVzaW5nIHRoZSB3aWxkY2FyZCBzeW50YXgKLSAgICAgICAgICIqIiBhcmUgZGVmYXVsdCBpbnRlcmNlcHRvcnMgZm9yIHRoZSBjb21wb25lbnRzIGluIHRoZSBlamItamFyLgotICAgICAgICAgSW4gYWRkaXRpb24sIGludGVyY2VwdG9ycyBtYXkgYmUgYm91bmQgYXQgdGhlIGxldmVsIG9mIHRoZSBiZWFuCi0gICAgICAgICBjbGFzcyAoY2xhc3MtbGV2ZWwgaW50ZXJjZXB0b3JzKSBvciBidXNpbmVzcyBtZXRob2RzIChtZXRob2QtbGV2ZWwKLSAgICAgICAgIGludGVyY2VwdG9ycyApLgotCi0gICAgICAgICBUaGUgYmluZGluZyBvZiBpbnRlcmNlcHRvcnMgdG8gY2xhc3NlcyBpcyBhZGRpdGl2ZS4gIElmIGludGVyY2VwdG9ycwotICAgICAgICAgYXJlIGJvdW5kIGF0IHRoZSBjbGFzcy1sZXZlbCBhbmQvb3IgZGVmYXVsdC1sZXZlbCBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgbWV0aG9kLWxldmVsLCBib3RoIGNsYXNzLWxldmVsIGFuZC9vciBkZWZhdWx0LWxldmVsIGFzIHdlbGwgYXMKLSAgICAgICAgIG1ldGhvZC1sZXZlbCB3aWxsIGFwcGx5LgotCi0gICAgICAgICBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSBzdHlsZXMgb2YgdGhlIGludGVyY2VwdG9yIGVsZW1lbnQgc3ludGF4IDoKLQotICAgICAgICAgMS4KLSAgICAgICAgIDxpbnRlcmNlcHRvci1iaW5kaW5nPgotICAgICAgICAgICA8ZWpiLW5hbWU+KjwvZWpiLW5hbWU+Ci0gICAgICAgICAgIDxpbnRlcmNlcHRvci1jbGFzcz5JTlRFUkNFUFRPUjwvaW50ZXJjZXB0b3ItY2xhc3M+Ci0gICAgICAgICA8L2ludGVyY2VwdG9yLWJpbmRpbmc+Ci0KLSAgICAgICAgIFNwZWNpZnlpbmcgdGhlIGVqYi1uYW1lIGFzIHRoZSB3aWxkY2FyZCB2YWx1ZSAiKiIgZGVzaWduYXRlcwotICAgICAgICAgZGVmYXVsdCBpbnRlcmNlcHRvcnMgKGludGVyY2VwdG9ycyB0aGF0IGFwcGx5IHRvIGFsbCBzZXNzaW9uIGFuZAotICAgICAgICAgbWVzc2FnZS1kcml2ZW4gYmVhbnMgY29udGFpbmVkIGluIHRoZSBlamItamFyKS4KLQotICAgICAgICAgMi4KLSAgICAgICAgIDxpbnRlcmNlcHRvci1iaW5kaW5nPgotICAgICAgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAgICAgICAgIDxpbnRlcmNlcHRvci1jbGFzcz5JTlRFUkNFUFRPUjwvaW50ZXJjZXB0b3ItY2xhc3M+Ci0gICAgICAgICA8L2ludGVyY2VwdG9yLWJpbmRpbmc+Ci0KLSAgICAgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBpbnRlcmNlcHRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICAgICAgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbihjbGFzcy1sZXZlbCBpbnRlcmNlcHRvcnMpLgotCi0gICAgICAgICAzLgotICAgICAgICAgPGludGVyY2VwdG9yLWJpbmRpbmc+Ci0gICAgICAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICAgICAgICAgPGludGVyY2VwdG9yLWNsYXNzPklOVEVSQ0VQVE9SPC9pbnRlcmNlcHRvci1jbGFzcz4KLSAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L2ludGVyY2VwdG9yLWJpbmRpbmc+Ci0KLSAgICAgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byBhc3NvY2lhdGUgYSBtZXRob2QtbGV2ZWwgaW50ZXJjZXB0b3Igd2l0aAotICAgICAgICAgdGhlIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4uICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWV0aG9kcwotICAgICAgICAgd2l0aCB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoZSBlbGVtZW50IG9mIHRoaXMgc3R5bGUgcmVmZXJzCi0gICAgICAgICB0byBhbGwgdGhlIG1ldGhvZHMgd2l0aCB0aGUgb3ZlcmxvYWRlZCBuYW1lLiAgTWV0aG9kLWxldmVsCi0gICAgICAgICBpbnRlcmNlcHRvcnMgY2FuIG9ubHkgYmUgYXNzb2NpYXRlZCB3aXRoIGJ1c2luZXNzIG1ldGhvZHMgb2YgdGhlCi0gICAgICAgICBiZWFuIGNsYXNzLiAgIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmQgdmFsdWUgIioiIGNhbm5vdCBiZSB1c2VkCi0gICAgICAgICB0byBzcGVjaWZ5IG1ldGhvZC1sZXZlbCBpbnRlcmNlcHRvcnMuCi0KLSAgICAgICAgIDQuCi0gICAgICAgICA8aW50ZXJjZXB0b3ItYmluZGluZz4KLSAgICAgICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICAgICAgICAgICA8aW50ZXJjZXB0b3ItY2xhc3M+SU5URVJDRVBUT1I8L2ludGVyY2VwdG9yLWNsYXNzPgotICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS0xPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPlBBUkFNLTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIC4uLgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS1OPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvaW50ZXJjZXB0b3ItYmluZGluZz4KLQotICAgICAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIGFzc29jaWF0ZSBhIG1ldGhvZC1sZXZlbCBpbnRlcmNlcHRvciB3aXRoCi0gICAgICAgICB0aGUgc3BlY2lmaWVkIG1ldGhvZCBvZiB0aGUgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gIFRoaXMKLSAgICAgICAgIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYSBzaW5nbGUgbWV0aG9kIHdpdGhpbiBhIHNldCBvZiBtZXRob2RzCi0gICAgICAgICB3aXRoIGFuIG92ZXJsb2FkZWQgbmFtZS4gIFRoZSB2YWx1ZXMgUEFSQU0tMSB0aHJvdWdoIFBBUkFNLU4KLSAgICAgICAgIGFyZSB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZXMgb2YgdGhlIG1ldGhvZCdzIGlucHV0IHBhcmFtZXRlcnMKLSAgICAgICAgIChpZiB0aGUgbWV0aG9kIGhhcyBubyBpbnB1dCBhcmd1bWVudHMsIHRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQKLSAgICAgICAgIGNvbnRhaW5zIG5vIG1ldGhvZC1wYXJhbSBlbGVtZW50cykuIEFycmF5cyBhcmUgc3BlY2lmaWVkIGJ5IHRoZQotICAgICAgICAgYXJyYXkgZWxlbWVudCdzIHR5cGUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBhaXIgb2Ygc3F1YXJlCi0gICAgICAgICBicmFja2V0cyAoZS5nLiBpbnRbXVtdKS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnRlcmNlcHRvci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnRlcmNlcHRvci1vcmRlciIKLQkJICAgICB0eXBlPSJqYXZhZWU6aW50ZXJjZXB0b3Itb3JkZXJUeXBlIgotCQkgICAgIG1pbk9jY3Vycz0iMSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1pbnRlcmNlcHRvcnMiCi0JCSAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1jbGFzcy1pbnRlcmNlcHRvcnMiCi0JCSAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIgotCQkgICB0eXBlPSJqYXZhZWU6bmFtZWQtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnRlcmNlcHRvci1vcmRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgVGhlIGludGVyY2VwdG9yLW9yZGVyVHlwZSBlbGVtZW50IGRlc2NyaWJlcyBhIHRvdGFsIG9yZGVyaW5nCi0gICAgICAgIG9mIGludGVyY2VwdG9yIGNsYXNzZXMuCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJjZXB0b3ItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMSIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJjZXB0b3JUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGludGVyY2VwdG9yVHlwZSBlbGVtZW50IGRlY2xhcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlCi0gICAgICAgIGludGVyY2VwdG9yIGNsYXNzLiAgSXQgY29uc2lzdHMgb2YgOgotCi0gICAgICAgICAgICAtIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLgotICAgICAgICAgICAgLSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGludGVyY2VwdG9yIGNsYXNzLgotICAgICAgICAgICAgLSBBbiBvcHRpb25hbCBsaXN0IG9mIGFyb3VuZCBpbnZva2UgbWV0aG9kcyBkZWNsYXJlZCBvbiB0aGUKLSAgICAgICAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3MgYW5kL29yIGl0cyBzdXBlci1jbGFzc2VzLgotICAgICAgICAgICAgLSBBbiBvcHRpb25hbCBsaXN0IGVudmlyb25tZW50IGRlcGVuZGVuY2llcyBmb3IgdGhlIGludGVyY2VwdG9yCi0gICAgICAgICAgICAgIGNsYXNzIGFuZC9vciBpdHMgc3VwZXItY2xhc3Nlcy4KLSAgICAgICAgICAgIC0gQW4gb3B0aW9uYWwgbGlzdCBvZiBwb3N0LWFjdGl2YXRlIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhlCi0gICAgICAgICAgICAgIGludGVyY2VwdG9yIGNsYXNzIGFuZC9vciBpdHMgc3VwZXItY2xhc3Nlcy4KLSAgICAgICAgICAgIC0gQW4gb3B0aW9uYWwgbGlzdCBvZiBwcmUtcGFzc2l2YXRlIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhlCi0gICAgICAgICAgICAgIGludGVyY2VwdG9yIGNsYXNzIGFuZC9vciBpdHMgc3VwZXItY2xhc3Nlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnRlcmNlcHRvci1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcm91bmQtaW52b2tlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphcm91bmQtaW52b2tlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6am5kaUVudmlyb25tZW50UmVmc0dyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1hY3RpdmF0ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGFzc2l2YXRlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsaWZlY3ljbGUtY2FsbGJhY2tUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImludGVyY2VwdG9yc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgaW50ZXJjZXB0b3JzVHlwZSBlbGVtZW50IGRlY2xhcmVzIG9uZSBvciBtb3JlIGludGVyY2VwdG9yCi0gICAgICAgIGNsYXNzZXMgdXNlZCBieSBjb21wb25lbnRzIHdpdGhpbiB0aGlzIGVqYi1qYXIuICBUaGUgZGVjbGFyYXRpb24KLSAgICAgICAgY29uc2lzdHMgb2YgOgotCi0gICAgICAgICAgICAtIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLgotICAgICAgICAgICAgLSBPbmUgb3IgbW9yZSBpbnRlcmNlcHRvciBlbGVtZW50cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnRlcmNlcHRvciIKLQkJICAgdHlwZT0iamF2YWVlOmludGVyY2VwdG9yVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRyaXZlbi1iZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1lc3NhZ2UtZHJpdmVuIGVsZW1lbnQgZGVjbGFyZXMgYSBtZXNzYWdlLWRyaXZlbgotCWJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0JICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotCSAgICAgIGljb24gZmlsZSBuYW1lLgotCSAgICAtIGEgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuIGluCi0JICAgICAgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgICAgICAgICAgLSBhbiBvcHRpb25hbCBtYXBwZWQtbmFtZSBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZQotICAgICAgICAgICAgICB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBwaHlzaWNhbAotICAgICAgICAgICAgICBqbmRpLW5hbWUgb2YgZGVzdGluYXRpb24gZnJvbSB3aGljaCB0aGlzIG1lc3NhZ2UtZHJpdmVuIGJlYW4KLSAgICAgICAgICAgICAgc2hvdWxkIGNvbnN1bWUuICBUaGlzIGVsZW1lbnQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIHN1cHBvcnRlZAotICAgICAgICAgICAgICBieSBhbGwgaW1wbGVtZW50YXRpb25zLiAgQW55IHVzZSBvZiB0aGlzIGVsZW1lbnQgaXMgbm9uLXBvcnRhYmxlLgotCSAgICAtIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2luZwotCSAgICAgIHR5cGUKLSAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB0aW1lb3V0IG1ldGhvZC4KLQkgICAgLSB0aGUgb3B0aW9uYWwgbWVzc2FnZS1kcml2ZW4gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQKLSAgICAgICAgICAgICAgdHlwZS4gSWYgaXQgaXMgbm90IGRlZmluZWQsIGl0IGlzIGRlZmF1bHRlZCB0byBDb250YWluZXIuCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZQotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICBtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzCi0JICAgICAgYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMKLSAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbiBjbGFzcyBhbmQvb3IKLSAgICAgICAgICAgICAgc3VwZXJjbGFzcyBhcm91bmQtaW52b2tlIG1ldGhvZHMuCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudAotCSAgICAgIGVudHJpZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbCBFSkIKLQkgICAgICByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIgc2VydmljZQotCSAgICAgIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkKLQkgICAgICBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICBtZXRob2RzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5Ci0JICAgICAgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UKLQkgICAgICBlbnZpcm9ubWVudCByZWZlcmVuY2VzLgotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZQotCSAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTplamItY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICBUaGUgZWpiLWNsYXNzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZQotICAgICAgICAgICAgIG9mIHRoZSBiZWFuIGNsYXNzIGZvciB0aGlzIGVqYi4gIEl0IGlzIHJlcXVpcmVkIHVubGVzcwotICAgICAgICAgICAgIHRoZXJlIGlzIGEgY29tcG9uZW50LWRlZmluaW5nIGFubm90YXRpb24gZm9yIHRoZSBzYW1lCi0gICAgICAgICAgICAgZWpiLW5hbWUuCi0KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdpbmctdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBtZXNzYWdpbmctdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWVzc2FnZQotCSAgICBsaXN0ZW5lciBpbnRlcmZhY2Ugb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGltZW91dC1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm5hbWVkLW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNhY3Rpb24tdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOnRyYW5zYWN0aW9uLXR5cGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGluayIKLQkJICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb24tY29uZmlnIgotCQkgICB0eXBlPSJqYXZhZWU6YWN0aXZhdGlvbi1jb25maWdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcm91bmQtaW52b2tlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphcm91bmQtaW52b2tlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6am5kaUVudmlyb25tZW50UmVmc0dyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktaWRlbnRpdHkiCi0JCSAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1pZGVudGl0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1pbnRmVHlwZSI+Ci0KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWV0aG9kLWludGYgZWxlbWVudCBhbGxvd3MgYSBtZXRob2QgZWxlbWVudCB0bwotCWRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kCi0Jc2lnbmF0dXJlIHRoYXQgYXJlIG11bHRpcGx5IGRlZmluZWQgYWNyb3NzIHRoZSBob21lIGFuZAotCWNvbXBvbmVudCBpbnRlcmZhY2VzIChlLmcsIGluIGJvdGggYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLQlyZW1vdGUgYW5kIGxvY2FsIGludGVyZmFjZXMgb3IgaW4gYm90aCBhbiBlbnRlcnByaXNlIGJlYW4ncwotCWhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLCBldGMuKTsgdGhlIGNvbXBvbmVudCBhbmQgd2ViCi0Jc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzLCBhbmQgc28gb24uIFRoZSBMb2NhbCBhcHBsaWVzIHRvCi0gICAgICAgIGJvdGggbG9jYWwgY29tcG9uZW50IGludGVyZmFjZSBhbmQgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlLgotICAgICAgICBTaW1pbGFybHksIFJlbW90ZSBhcHBsaWVzIHRvIGJvdGggcmVtb3RlIGNvbXBvbmVudCBpbnRlcmZhY2UKLSAgICAgICAgYW5kIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlLgotCi0JVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCSAgICBIb21lCi0JICAgIFJlbW90ZQotCSAgICBMb2NhbEhvbWUKLQkgICAgTG9jYWwKLQkgICAgU2VydmljZUVuZHBvaW50Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdGUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbEhvbWUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VFbmRwb2ludCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1ldGhvZC1uYW1lVHlwZSBjb250YWlucyBhIG5hbWUgb2YgYW4gZW50ZXJwcmlzZQotCWJlYW4gbWV0aG9kIG9yIHRoZSBhc3RlcmlzayAoKikgY2hhcmFjdGVyLiBUaGUgYXN0ZXJpc2sgaXMKLQl1c2VkIHdoZW4gdGhlIGVsZW1lbnQgZGVub3RlcyBhbGwgdGhlIG1ldGhvZHMgb2YgYW4KLQllbnRlcnByaXNlIGJlYW4ncyBjbGllbnQgdmlldyBpbnRlcmZhY2VzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1wYXJhbXNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWV0aG9kLXBhcmFtc1R5cGUgZGVmaW5lcyBhIGxpc3Qgb2YgdGhlCi0JZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBuYW1lcyBvZiB0aGUgbWV0aG9kIHBhcmFtZXRlcnMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtIgotCQkgICB0eXBlPSJqYXZhZWU6amF2YS10eXBlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBtZXRob2QtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIHByaW1pdGl2ZQotCSAgICBvciBhIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZSBvZiBhIG1ldGhvZAotCSAgICBwYXJhbWV0ZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLXBlcm1pc3Npb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlIHNwZWNpZmllcyB0aGF0IG9uZSBvciBtb3JlCi0Jc2VjdXJpdHkgcm9sZXMgYXJlIGFsbG93ZWQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGVudGVycHJpc2UKLQliZWFuIG1ldGhvZHMuIFRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUgY29uc2lzdHMgb2YgYW4KLQlvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMgb3IgYW4KLQlpbmRpY2F0b3IgdG8gc3RhdGUgdGhhdCB0aGUgbWV0aG9kIGlzIHVuY2hlY2tlZCBmb3IKLQlhdXRob3JpemF0aW9uLCBhbmQgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cy4KLQotCVRoZSBzZWN1cml0eSByb2xlcyB1c2VkIGluIHRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUKLQltdXN0IGJlIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMgb2YgdGhlCi0JZGVwbG95bWVudCBkZXNjcmlwdG9yLCBhbmQgdGhlIG1ldGhvZHMgbXVzdCBiZSBtZXRob2RzCi0JZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MsIGhvbWUsIGNvbXBvbmVudAotICAgICAgICBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLQkJICAgICB0eXBlPSJqYXZhZWU6cm9sZS1uYW1lVHlwZSIKLQkJICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmNoZWNrZWQiCi0JCSAgICAgdHlwZT0iamF2YWVlOmVtcHR5VHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSB1bmNoZWNrZWQgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCBhIG1ldGhvZCBpcwotCSAgICAgIG5vdCBjaGVja2VkIGZvciBhdXRob3JpemF0aW9uIGJ5IHRoZSBjb250YWluZXIKLQkgICAgICBwcmlvciB0byBpbnZvY2F0aW9uIG9mIHRoZSBtZXRob2QuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiCi0JCSAgIHR5cGU9ImphdmFlZTptZXRob2RUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIG1ldGhvZFR5cGUgaXMgdXNlZCB0byBkZW5vdGUgYSBtZXRob2Qgb2YgYW4gZW50ZXJwcmlzZQotCSAgYmVhbidzIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludAotCSAgaW50ZXJmYWNlLCBvciwgaW4gdGhlIGNhc2Ugb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLCB0aGUKLQkgIGJlYW4ncyBtZXNzYWdlIGxpc3RlbmVyIG1ldGhvZCwgb3IgYSBzZXQgb2Ygc3VjaAotCSAgbWV0aG9kcy4gVGhlIGVqYi1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlCi0JICBlbnRlcnByaXNlIGJlYW5zIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3I7IHRoZQotCSAgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBhbGxvd3MgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhCi0JICBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgdGhhdCBpcyBtdWx0aXBseSBkZWZpbmVkCi0JICBhY3Jvc3MgdGhlIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZQotICAgICAgICAgIGVuZHBvaW50IG50ZXJmYWNlczsgdGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZQotICAgICAgICAgIG1ldGhvZCBuYW1lOyBhbmQgdGhlIG9wdGlvbmFsIG1ldGhvZC1wYXJhbXMgZWxlbWVudHMgaWRlbnRpZnkKLSAgICAgICAgICBhIHNpbmdsZSBtZXRob2QgYW1vbmcgbXVsdGlwbGUgbWV0aG9kcyB3aXRoIGFuIG92ZXJsb2FkZWQKLQkgIG1ldGhvZCBuYW1lLgotCi0JICBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgc3R5bGVzIG9mIHVzaW5nIG1ldGhvZFR5cGUgZWxlbWVudAotCSAgd2l0aGluIGEgbWV0aG9kIGVsZW1lbnQ6Ci0KLQkgIDEuCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci0JICA8L21ldGhvZD4KLQotCSAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUKLQkgICAgIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcywgaG9tZSwgY29tcG9uZW50LAotICAgICAgICAgICAgIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzLgotCi0JICAyLgotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci0JICA8L21ldGhvZD4KLQotCSAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mCi0JICAgICB0aGUgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCi0JICAgICBtZXRob2RzIHdpdGggdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGUgZWxlbWVudCBvZgotCSAgICAgdGhpcyBzdHlsZSByZWZlcnMgdG8gYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQKLQkgICAgIG5hbWUuCi0KLQkgIDMuCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLQkgICAgICA8bWV0aG9kLXBhcmFtcz4KLQkJICA8bWV0aG9kLXBhcmFtPlBBUkFNLTE8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPlBBUkFNLTI8L21ldGhvZC1wYXJhbT4KLQkJICAuLi4KLQkJICA8bWV0aG9kLXBhcmFtPlBBUkFNLW48L21ldGhvZC1wYXJhbT4KLQkgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0JICA8L21ldGhvZD4KLQotCSAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgc2luZ2xlIG1ldGhvZCB3aXRoaW4gYQotCSAgICAgc2V0IG9mIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuIFBBUkFNLTEgdGhyb3VnaAotCSAgICAgUEFSQU0tbiBhcmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGVzIG9mIHRoZQotCSAgICAgbWV0aG9kJ3MgaW5wdXQgcGFyYW1ldGVycyAoaWYgdGhlIG1ldGhvZCBoYXMgbm8gaW5wdXQKLQkgICAgIGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudCBjb250YWlucyBubwotCSAgICAgbWV0aG9kLXBhcmFtIGVsZW1lbnRzKS4gQXJyYXlzIGFyZSBzcGVjaWZpZWQgYnkgdGhlCi0JICAgICBhcnJheSBlbGVtZW50J3MgdHlwZSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGFpciBvZgotCSAgICAgc3F1YXJlIGJyYWNrZXRzIChlLmcuIGludFtdW10pLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUKLQkgICAgIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoaXMgc3R5bGUgcmVmZXJzCi0JICAgICB0byBhbGwgb2YgdGhlIG92ZXJsb2FkZWQgbWV0aG9kcy4KLQotCSAgRXhhbXBsZXM6Ci0KLQkgIFN0eWxlIDE6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUKLQkgIG1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgYnVzaW5lc3MsIGhvbWUsCi0gICAgICAgICAgY29tcG9uZW50LCBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlczoKLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci0JICA8L21ldGhvZD4KLQotCSAgU3R5bGUgMjogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZQotCSAgY3JlYXRlIG1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZQotCSAgaW50ZXJmYWNlKHMpLgotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotCSAgPC9tZXRob2Q+Ci0KLQkgIFN0eWxlIDM6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIHRoZQotCSAgY3JlYXRlKFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBMYXN0TmFtZSkgbWV0aG9kIG9mIHRoZQotCSAgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGludGVyZmFjZShzKS4KLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkgICAgICA8bWV0aG9kLXBhcmFtcz4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0JICA8L21ldGhvZD4KLQotCSAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGEgU3R5bGUgMyBlbGVtZW50IHdpdGgKLQkgIG1vcmUgY29tcGxleCBwYXJhbWV0ZXIgdHlwZXMuIFRoZSBtZXRob2QKLQkgIGZvb2JhcihjaGFyIHMsIGludCBpLCBpbnRbXSBpYXIsIG15cGFja2FnZS5NeUNsYXNzIG15Y2wsCi0JICBteXBhY2thZ2UuTXlDbGFzc1tdW10gbXljbGFhcikgd291bGQgYmUgc3BlY2lmaWVkIGFzOgotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtbmFtZT5mb29iYXI8L21ldGhvZC1uYW1lPgotCSAgICAgIDxtZXRob2QtcGFyYW1zPgotCQkgIDxtZXRob2QtcGFyYW0+Y2hhcjwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+aW50PC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5pbnRbXTwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3M8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzW11bXTwvbWV0aG9kLXBhcmFtPgotCSAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLQkgIDwvbWV0aG9kPgotCi0JICBUaGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aGVuIGl0IGJlY29tZXMKLQkgIG5lY2Vzc2FyeSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBtZXRob2QgdGhhdCBpcyBtdWx0aXBseQotCSAgZGVmaW5lZCBhY3Jvc3MgdGhlIGVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsCi0gICAgICAgICAgYW5kL29yIHdlYiBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZAotCSAgc2lnbmF0dXJlLiBIb3dldmVyLCBpZiB0aGUgc2FtZSBtZXRob2QgaXMgYSBtZXRob2Qgb2YgYm90aCB0aGUKLSAgICAgICAgICBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2UsIGFuZCB0aGUgbG9jYWwgY29tcG9uZW50IGludGVyZmFjZSwKLSAgICAgICAgICB0aGUgc2FtZSBhdHRyaWJ1dGUgYXBwbGllcyB0byB0aGUgbWV0aG9kIGZvciBib3RoIGludGVyZmFjZXMuCi0gICAgICAgICAgTGlrZXdpc2UsIGlmIHRoZSBzYW1lIG1ldGhvZCBpcyBhIG1ldGhvZCBvZiBib3RoIHRoZSByZW1vdGUKLSAgICAgICAgICBidXNpbmVzcyBpbnRlcmZhY2UgYW5kIHRoZSByZW1vdGUgY29tcG9uZW50IGludGVyZmFjZSwgdGhlIHNhbWUKLSAgICAgICAgICBhdHRyaWJ1dGUgYXBwbGllcyB0byB0aGUgbWV0aG9kIGZvciBib3RoIGludGVyZmFjZXMuCi0KLQkgIEZvciBleGFtcGxlLCB0aGUgbWV0aG9kIGVsZW1lbnQKLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLQkgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkgICAgICA8bWV0aG9kLXBhcmFtcz4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0JICA8L21ldGhvZD4KLQotCSAgY2FuIGJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSB0aGUgY3JlYXRlKFN0cmluZywgU3RyaW5nKQotCSAgbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UgZnJvbSB0aGUKLQkgIGNyZWF0ZShTdHJpbmcsIFN0cmluZykgbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBob21lCi0JICBpbnRlcmZhY2UsIHdoaWNoIHdvdWxkIGJlIGRlZmluZWQgYXMKLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0JICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JICAgICAgPC9tZXRob2QtcGFyYW1zPgotCSAgPC9tZXRob2Q+Ci0KLQkgIGFuZCB0aGUgY3JlYXRlIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgaW4gdGhlIGxvY2FsIGhvbWUKLQkgIGludGVyZmFjZSB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0JICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JICAgICAgPC9tZXRob2QtcGFyYW1zPgotCSAgPC9tZXRob2Q+Ci0KLQkgIFRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGNhbiBiZSB1c2VkIHdpdGggYWxsIHRocmVlIFN0eWxlcwotCSAgb2YgdGhlIG1ldGhvZCBlbGVtZW50IHVzYWdlLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwotCSAgbWV0aG9kIGVsZW1lbnQgZXhhbXBsZSBjb3VsZCBiZSB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUKLQkgIG1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgcmVtb3RlIGhvbWUgaW50ZXJmYWNlCi0gICAgICAgICAgYW5kIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlLgotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLQkgICAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci0JICA8L21ldGhvZD4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTplamItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtaW50ZiIKLQkJICAgdHlwZT0iamF2YWVlOm1ldGhvZC1pbnRmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTptZXRob2QtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtcGFyYW1zIgotCQkgICB0eXBlPSJqYXZhZWU6bWV0aG9kLXBhcmFtc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im11bHRpcGxpY2l0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtdWx0aXBsaWNpdHlUeXBlIGRlc2NyaWJlcyB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZQotCXJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbi4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICBPbmUKLQkgICAgTWFueQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW55Ii8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtbWV0aG9kVHlwZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wYXJhbXMiCi0JCSAgIHR5cGU9ImphdmFlZTptZXRob2QtcGFyYW1zVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBwZXJzaXN0ZW5jZS10eXBlVHlwZSBzcGVjaWZpZXMgYW4gZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZQotCW1hbmFnZW1lbnQgdHlwZS4KLQotCVRoZSBwZXJzaXN0ZW5jZS10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgQmVhbgotCSAgICBDb250YWluZXIKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lciIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHF1ZXJ5LW1ldGhvZCBzcGVjaWZpZXMgdGhlIG1ldGhvZCBmb3IgYSBmaW5kZXIgb3Igc2VsZWN0Ci0JICBxdWVyeS4KLQotCSAgVGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgZmluZGVyIG9yIHNlbGVjdAotCSAgbWV0aG9kIGluIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzLgotCi0JICBFYWNoIG1ldGhvZC1wYXJhbSBtdXN0IGJlIGRlZmluZWQgZm9yIGEgcXVlcnktbWV0aG9kIHVzaW5nIHRoZQotCSAgbWV0aG9kLXBhcmFtcyBlbGVtZW50LgotCi0JICBJdCBpcyB1c2VkIGJ5IHRoZSBxdWVyeS1tZXRob2QgZWxlbWVudC4KLQotCSAgRXhhbXBsZToKLQotCSAgPHF1ZXJ5PgotCSAgICAgIDxkZXNjcmlwdGlvbj5NZXRob2QgZmluZHMgbGFyZ2Ugb3JkZXJzPC9kZXNjcmlwdGlvbj4KLQkgICAgICA8cXVlcnktbWV0aG9kPgotCQkgIDxtZXRob2QtbmFtZT5maW5kTGFyZ2VPcmRlcnM8L21ldGhvZC1uYW1lPgotCQkgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLQkgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLQkgICAgICA8ZWpiLXFsPgotCQlTRUxFQ1QgT0JKRUNUKG8pIEZST00gT3JkZXIgbwotCQkgIFdIRVJFIG8uYW1vdW50ICZndDsgMTAwMAotCSAgICAgIDwvZWpiLXFsPgotCSAgPC9xdWVyeT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6bWV0aG9kLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtcyIKLQkJICAgdHlwZT0iamF2YWVlOm1ldGhvZC1wYXJhbXNUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcXVlcnlUeXBlIGRlZmluZXMgYSBmaW5kZXIgb3Igc2VsZWN0Ci0JcXVlcnkuIEl0IGNvbnRhaW5zCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHF1ZXJ5Ci0JICAgIC0gdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbmRlciBvciBzZWxlY3QKLQkgICAgICBtZXRob2QgaXQgaXMgdXNlZCBieQotCQktIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHJlc3VsdCB0eXBlCi0JCSAgbWFwcGluZywgaWYgdGhlIHF1ZXJ5IGlzIGZvciBhIHNlbGVjdCBtZXRob2QKLQkJICBhbmQgZW50aXR5IG9iamVjdHMgYXJlIHJldHVybmVkLgotCQktIHRoZSBFSkIgUUwgcXVlcnkgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgcXVlcnkuCi0KLQlRdWVyaWVzIHRoYXQgYXJlIGV4cHJlc3NpYmxlIGluIEVKQiBRTCBtdXN0IHVzZSB0aGUgZWpiLXFsCi0JZWxlbWVudCB0byBzcGVjaWZ5IHRoZSBxdWVyeS4gSWYgYSBxdWVyeSBpcyBub3QgZXhwcmVzc2libGUKLQlpbiBFSkIgUUwsIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBiZSB1c2VkIHRvCi0JZGVzY3JpYmUgdGhlIHNlbWFudGljcyBvZiB0aGUgcXVlcnkgYW5kIHRoZSBlamItcWwgZWxlbWVudAotCXNob3VsZCBiZSBlbXB0eS4KLQotCVRoZSByZXN1bHQtdHlwZS1tYXBwaW5nIGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIEl0IGNhbiBvbmx5Ci0JYmUgcHJlc2VudCBpZiB0aGUgcXVlcnktbWV0aG9kIHNwZWNpZmllcyBhIHNlbGVjdCBtZXRob2QKLQl0aGF0IHJldHVybnMgZW50aXR5IG9iamVjdHMuICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCi0JcmVzdWx0LXR5cGUtbWFwcGluZyBlbGVtZW50IGlzICJMb2NhbCIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5LW1ldGhvZCIKLQkJICAgdHlwZT0iamF2YWVlOnF1ZXJ5LW1ldGhvZFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXN1bHQtdHlwZS1tYXBwaW5nIgotCQkgICB0eXBlPSJqYXZhZWU6cmVzdWx0LXR5cGUtbWFwcGluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1xbCIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSBkZXNpZ25hdGVzIHRoZSBzb3VyY2Ugb2YgYQotCXJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIEEKLQlyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIGlzIHVzZWQgYnkKLQlyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudHMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYW4KLQllbnRpdHkgYmVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByZWxhdGlvbnNoaXBzVHlwZSBkZXNjcmliZXMgdGhlIHJlbGF0aW9uc2hpcHMgaW4KLQl3aGljaCBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZQotCXBhcnRpY2lwYXRlLiBUaGUgcmVsYXRpb25zaGlwc1R5cGUgY29udGFpbnMgYW4gb3B0aW9uYWwKLQlkZXNjcmlwdGlvbjsgYW5kIGEgbGlzdCBvZiBlamItcmVsYXRpb24gZWxlbWVudHMsIHdoaWNoCi0Jc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1yZWxhdGlvblR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9InJvbGUtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgICByZWxhdGlvbnNoaXAgcm9sZS4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICAgICAgYSByZWxhdGlvbnNoaXAsIGJ1dCBjYW4gYmUgcmV1c2VkIGluIGRpZmZlcmVudAotCSAgICAgIHJlbGF0aW9uc2hpcHMuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yCi0JICAgICAgIHhwYXRoPSIuLy9qYXZhZWU6ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUiLz4KLQkgIDx4c2Q6ZmllbGQKLQkgICAgICAgeHBhdGg9Ii4iLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbW92ZS1tZXRob2RUeXBlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJlYW4tbWV0aG9kIgotCQkgICB0eXBlPSJqYXZhZWU6bmFtZWQtbWV0aG9kVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJldGFpbi1pZi1leGNlcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzdWx0LXR5cGUtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByZXN1bHQtdHlwZS1tYXBwaW5nVHlwZSBpcyB1c2VkIGluIHRoZSBxdWVyeSBlbGVtZW50IHRvCi0Jc3BlY2lmeSB3aGV0aGVyIGFuIGFic3RyYWN0IHNjaGVtYSB0eXBlIHJldHVybmVkIGJ5IGEgcXVlcnkKLQlmb3IgYSBzZWxlY3QgbWV0aG9kIGlzIHRvIGJlIG1hcHBlZCB0byBhbiBFSkJMb2NhbE9iamVjdCBvcgotCUVKQk9iamVjdCB0eXBlLgotCi0JVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQkgICAgTG9jYWwKLQkgICAgUmVtb3RlCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3RlIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktaWRlbnRpdHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VjdXJpdHktaWRlbnRpdHlUeXBlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncwotCXNlY3VyaXR5IGlkZW50aXR5IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlCi0JbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMKLQlpZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCWFuZCBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2UtY2FsbGVyLWlkZW50aXR5IgotCQkgICAgIHR5cGU9ImphdmFlZTplbXB0eVR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgdXNlLWNhbGxlci1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB0aGF0Ci0JICAgICAgdGhlIGNhbGxlcidzIHNlY3VyaXR5IGlkZW50aXR5IGJlIHVzZWQgYXMgdGhlCi0JICAgICAgc2VjdXJpdHkgaWRlbnRpdHkgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlCi0JICAgICAgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kcy4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJydW4tYXMiCi0JCSAgICAgdHlwZT0iamF2YWVlOnJ1bi1hc1R5cGUiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWJlYW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2Vzc2lvbi1iZWFuVHlwZSBkZWNsYXJlcyBhbiBzZXNzaW9uIGJlYW4uIFRoZQotCWRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLQkgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0JICAgICAgaWNvbiBmaWxlIG5hbWUKLQkgICAgLSBhIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbgotCSAgICAgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAtIGFuIG9wdGlvbmFsIG1hcHBlZC1uYW1lIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBwcm92aWRlCi0gICAgICAgICAgICAgIHZlbmRvci1zcGVjaWZpYyBkZXBsb3ltZW50IGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHBoeXNpY2FsCi0gICAgICAgICAgICAgIGpuZGktbmFtZSBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIGhvbWUvYnVzaW5lc3MgaW50ZXJmYWNlLgotICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIHN1cHBvcnRlZCBieSBhbGwKLSAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zLiBBbnkgdXNlIG9mIHRoaXMgZWxlbWVudCBpcyBub24tcG9ydGFibGUuCi0gICAgICAgICAgICAtIHRoZSBuYW1lcyBvZiBhbGwgdGhlIHJlbW90ZSBvciBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2VzLAotICAgICAgICAgICAgICBpZiBhbnkKLQkgICAgLSB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSBob21lIGFuZAotCSAgICAgIHJlbW90ZSBpbnRlcmZhY2VzLCBpZiBhbnkKLQkgICAgLSB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIGxvY2FsIGhvbWUgYW5kCi0JICAgICAgbG9jYWwgaW50ZXJmYWNlcywgaWYgYW55Ci0JICAgIC0gdGhlIG5hbWUgb2YgdGhlIHNlc3Npb24gYmVhbidzIHdlYiBzZXJ2aWNlIGVuZHBvaW50Ci0JICAgICAgaW50ZXJmYWNlLCBpZiBhbnkKLQkgICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLQkgICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3Mgc3RhdGUgbWFuYWdlbWVudCB0eXBlCi0gICAgICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyB0aW1lb3V0IG1ldGhvZC4KLQkgICAgLSB0aGUgb3B0aW9uYWwgc2Vzc2lvbiBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLgotICAgICAgICAgICAgICBJZiBpdCBpcyBub3QgcHJlc2VudCwgaXQgaXMgZGVmYXVsdGVkIHRvIENvbnRhaW5lci4KLSAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIGFuZC9vcgotICAgICAgICAgICAgICBzdXBlcmNsYXNzIGFyb3VuZC1pbnZva2UgbWV0aG9kcy4KLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0JICAgICAgZW52aXJvbm1lbnQgZW50cmllcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsCi0JICAgICAgRUpCIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYgotCSAgICAgIHNlcnZpY2UgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlCi0JICAgICAgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eQotCSAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotCSAgICAgIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlCi0JICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UKLQkgICAgICBkZXN0aW5hdGlvbiByZWZlcmVuY2VzCi0KLQlUaGUgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlCi0JdGhhdCB0aGV5IGFyZSBvbWl0dGVkIHdoZW4gaWYgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUKLQllbXB0eS4KLQotCUVpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aAotCXRoZSBob21lIGFuZCB0aGUgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGZvciB0aGUKLQlzZXNzaW9uIGJlYW4uCi0KLQlUaGUgc2VydmljZS1lbmRwb2ludCBlbGVtZW50IG1heSBvbmx5IGJlIHNwZWNpZmllZCBpZiB0aGUKLQliZWFuIGlzIGEgc3RhdGVsZXNzIHNlc3Npb24gYmVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJob21lIgotCQkgICB0eXBlPSJqYXZhZWU6aG9tZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZSIKLQkJICAgdHlwZT0iamF2YWVlOnJlbW90ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsLWhvbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpsb2NhbC1ob21lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwiCi0JCSAgIHR5cGU9ImphdmFlZTpsb2NhbFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJ1c2luZXNzLWxvY2FsIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYnVzaW5lc3MtcmVtb3RlIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1lbmRwb2ludCIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50IGVsZW1lbnQgY29udGFpbnMgdGhlCi0JICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyB3ZWIKLQkgICAgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuIFRoZSBzZXJ2aWNlLWVuZHBvaW50Ci0JICAgIGVsZW1lbnQgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhIHN0YXRlbGVzcwotCSAgICBzZXNzaW9uIGJlYW4uIFRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlIG11c3QgYmUgYQotCSAgICB2YWxpZCBKQVgtUlBDIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgIFRoZSBlamItY2xhc3MgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lCi0gICAgICAgICAgICAgb2YgdGhlIGJlYW4gY2xhc3MgZm9yIHRoaXMgZWpiLiAgSXQgaXMgcmVxdWlyZWQgdW5sZXNzCi0gICAgICAgICAgICAgdGhlcmUgaXMgYSBjb21wb25lbnQtZGVmaW5pbmcgYW5ub3RhdGlvbiBmb3IgdGhlIHNhbWUKLSAgICAgICAgICAgICBlamItbmFtZS4KLQotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOnNlc3Npb24tdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGltZW91dC1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm5hbWVkLW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmluaXQtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGluaXQtbWV0aG9kIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtYXBwaW5ncyBmb3IKLQkgICAgRUpCIDIueCBzdHlsZSBjcmVhdGUgbWV0aG9kcyBmb3IgYW4gRUpCIDMuMCBiZWFuLgotCSAgICBUaGlzIGVsZW1lbnQgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBzdGF0ZWZ1bAotICAgICAgICAgICAgc2Vzc2lvbiBiZWFucy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdmUtbWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyZW1vdmUtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJlbW92ZS1tZXRob2QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1hcHBpbmdzIGZvcgotCSAgICBFSkIgMi54IHN0eWxlIHJlbW92ZSBtZXRob2RzIGZvciBhbiBFSkIgMy4wIGJlYW4uCi0JICAgIFRoaXMgZWxlbWVudCBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIHN0YXRlZnVsCi0gICAgICAgICAgICBzZXNzaW9uIGJlYW5zLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zYWN0aW9uLXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTp0cmFuc2FjdGlvbi10eXBlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcm91bmQtaW52b2tlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphcm91bmQtaW52b2tlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6am5kaUVudmlyb25tZW50UmVmc0dyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1hY3RpdmF0ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGFzc2l2YXRlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsaWZlY3ljbGUtY2FsbGJhY2tUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktcm9sZS1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktaWRlbnRpdHkiCi0JCSAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1pZGVudGl0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXNzaW9uLXR5cGVUeXBlIGRlc2NyaWJlcyB3aGV0aGVyIHRoZSBzZXNzaW9uIGJlYW4gaXMgYQotCXN0YXRlZnVsIHNlc3Npb24gb3Igc3RhdGVsZXNzIHNlc3Npb24uIEl0IGlzIHVzZWQgYnkKLQlzZXNzaW9uLXR5cGUgZWxlbWVudHMuCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgU3RhdGVmdWwKLQkgICAgU3RhdGVsZXNzCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlZnVsIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVsZXNzIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnMtYXR0cmlidXRlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRyYW5zLWF0dHJpYnV0ZVR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QKLQltYW5hZ2UgdGhlIHRyYW5zYWN0aW9uIGJvdW5kYXJpZXMgd2hlbiBkZWxlZ2F0aW5nIGEgbWV0aG9kCi0JaW52b2NhdGlvbiB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcyBtZXRob2QuCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCSAgICBOb3RTdXBwb3J0ZWQKLQkgICAgU3VwcG9ydHMKLQkgICAgUmVxdWlyZWQKLQkgICAgUmVxdWlyZXNOZXcKLQkgICAgTWFuZGF0b3J5Ci0JICAgIE5ldmVyCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFN1cHBvcnRlZCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBvcnRzIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZWQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlc05ldyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmRhdG9yeSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldmVyIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNhY3Rpb24tdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0cmFuc2FjdGlvbi10eXBlVHlwZSBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLQl0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUuCi0KLQlUaGUgdHJhbnNhY3Rpb24tdHlwZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICBCZWFuCi0JICAgIENvbnRhaW5lcgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFuIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfM18xLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8zXzEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzA5NzYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8zXzEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzI0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgICAgICAgIHZlcnNpb249IjMuMSI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0gICAgICAKLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICAgCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24KLSAgICAgIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZQotICAgICAgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICAgdGhlIExpY2Vuc2UuIFlvdSBjYW4gb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sIG9yCi0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0gICAgICBMaWNlbnNlLgotICAgICAgCi0gICAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlcgotICAgICAgTm90aWNlIGluIGVhY2ggZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0Ci0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICAgICAgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcwotICAgICAgcHJvdmlkZWQgYnkgU3VuIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UgZmlsZQotICAgICAgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZwotICAgICAgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10KLSAgICAgIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICAgIlBvcnRpb25zIENvcHlyaWdodGVkIFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotICAgICAgCi0gICAgICBDb250cmlidXRvcihzKToKLSAgICAgIAotICAgICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZQotICAgICAgQ0RETCBvciBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZwotICAgICAgIltDb250cmlidXRvcl0gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTCBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91Ci0gICAgICBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYSByZWNpcGllbnQgaGFzIHRoZQotICAgICAgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlCi0gICAgICBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvIGl0cwotICAgICAgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyCi0gICAgICBjb2RlIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUKLSAgICAgIG9wdGlvbiBhcHBsaWVzIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoCi0gICAgICBvcHRpb24gYnkgdGhlIGNvcHlyaWdodCBob2xkZXIuCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVtbCi0gICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgRUpCIDMuMSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gICAgICAKLSAgICAgIEFsbCBFSkIgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlCi0gICAgICB0aGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFIG5hbWVzcGFjZToKLSAgICAgIAotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0gICAgICAKLSAgICAgIGFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLSAgICAgIHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0gICAgICAKLSAgICAgIDxlamItamFyIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLSAgICAgIAkgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9lamItamFyXzNfMS54c2QiCi0gICAgICB2ZXJzaW9uPSIzLjEiPgotICAgICAgLi4uCi0gICAgICA8L2VqYi1qYXI+Ci0gICAgICAKLSAgICAgIFRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotICAgICAgdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgdGhlCi0gICAgICBKYXZhIEVFIG5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0gICAgICAKLSAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9lamItamFyXzNfMS54c2QKLSAgICAgIAotICAgICAgXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0gICAgICAKLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLSAgICAgIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gICAgICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAgICAgIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLSAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0gICAgICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICAgICAgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0gICAgICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqYXZhZWVfNi54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1qYXIiCi0gICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZWpiLWphclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGlzIHRoZSByb290IG9mIHRoZSBlamItamFyIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDprZXkgbmFtZT0iZWpiLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIGVqYi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gZW50ZXJwcmlzZQotICAgICAgICAgIGJlYW4uIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphciBvcgotICAgICAgICAgIC53YXIgZmlsZS4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZW50ZXJwcmlzZS1iZWFucy8qIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6ZWpiLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0gICAgPHhzZDprZXlyZWYgbmFtZT0iZWpiLW5hbWUtcmVmZXJlbmNlcyIKLSAgICAgICAgICAgICAgICByZWZlcj0iamF2YWVlOmVqYi1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBrZXlyZWYgaW5kaWNhdGVzIHRoZSByZWZlcmVuY2VzIGZyb20KLSAgICAgICAgICByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgbXVzdCBiZSB0byBhIHNwZWNpZmljIGVqYi1uYW1lCi0gICAgICAgICAgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGVudGVycHJpc2UtYmVhbnMgZWxlbWVudC4gCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iLi8vamF2YWVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZS9qYXZhZWU6cmVsYXRpb25zaGlwLXJvbGUtc291cmNlIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6ZWpiLW5hbWUiLz4KLSAgICA8L3hzZDprZXlyZWY+Ci0gICAgPHhzZDprZXkgbmFtZT0icm9sZS1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIEEgcm9sZS1uYW1lLWtleSBpcyBzcGVjaWZpZWQgdG8gYWxsb3cgdGhlIHJlZmVyZW5jZXMKLSAgICAgICAgICBmcm9tIHRoZSBzZWN1cml0eS1yb2xlLXJlZnMuCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmFzc2VtYmx5LWRlc2NyaXB0b3IvamF2YWVlOnNlY3VyaXR5LXJvbGUiLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpyb2xlLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0gICAgPHhzZDprZXlyZWYgbmFtZT0icm9sZS1uYW1lLXJlZmVyZW5jZXMiCi0gICAgICAgICAgICAgICAgcmVmZXI9ImphdmFlZTpyb2xlLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIGtleXJlZiBpbmRpY2F0ZXMgdGhlIHJlZmVyZW5jZXMgZnJvbQotICAgICAgICAgIHNlY3VyaXR5LXJvbGUtcmVmIHRvIGEgc3BlY2lmaWVkIHJvbGUtbmFtZS4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZW50ZXJwcmlzZS1iZWFucy8qL2phdmFlZTpzZWN1cml0eS1yb2xlLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnJvbGUtbGluayIvPgotICAgIDwveHNkOmtleXJlZj4KLSAgPC94c2Q6ZWxlbWVudD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhY2Nlc3MtdGltZW91dFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgYWNjZXNzLXRpbWVvdXRUeXBlIHJlcHJlc2VudHMgdGhlIG1heGltdW0gYW1vdW50IG9mCi0gICAgICAgIHRpbWUgKGluIGEgZ2l2ZW4gdGltZSB1bml0KSB0aGF0IHRoZSBjb250YWluZXIgc2hvdWxkIHdhaXQgZm9yCi0gICAgICAgIGEgY29uY3VycmVuY3kgbG9jayBiZWZvcmUgdGhyb3dpbmcgYSB0aW1lb3V0IGV4Y2VwdGlvbiB0byB0aGUKLSAgICAgICAgY2xpZW50LgotICAgICAgICAKLSAgICAgICAgQSB0aW1lb3V0IHZhbHVlIG9mIDAgbWVhbnMgY29uY3VycmVudCBhY2Nlc3MgaXMgbm90IHBlcm1pdHRlZC4KLSAgICAgICAgCi0gICAgICAgIEEgdGltZW91dCB2YWx1ZSBvZiAtMSBtZWFucyB3YWl0IGluZGVmaW5pdGVseSB0byBhY3F1aXJlIGEgbG9jay4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0aW1lb3V0IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RJbnRlZ2VyVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRpbWUtdW5pdC10eXBlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhc3luYy1tZXRob2RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFzeW5jLW1ldGhvZFR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCBhIHNlc3Npb24KLSAgICAgICAgYmVhbiBtZXRob2QgaGFzIGFzeW5jaHJvbm91cyBpbnZvY2F0aW9uIHNlbWFudGljcy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWV0aG9kLXBhcmFtc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjdGl2YXRpb24tY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhY3RpdmF0aW9uLWNvbmZpZ1R5cGUgZGVmaW5lcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLSAgICAgICAgZXhwZWN0ZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuCi0gICAgICAgIGluIGl0cyBvcGVyYXRpb25hbCBlbnZpcm9ubWVudC4gVGhpcyBtYXkgaW5jbHVkZSBpbmZvcm1hdGlvbgotICAgICAgICBhYm91dCBtZXNzYWdlIGFja25vd2xlZGdlbWVudCwgbWVzc2FnZSBzZWxlY3RvciwgZXhwZWN0ZWQKLSAgICAgICAgZGVzdGluYXRpb24gdHlwZSwgZXRjLgotICAgICAgICAKLSAgICAgICAgVGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgZXhwcmVzc2VkIGluIHRlcm1zIG9mCi0gICAgICAgIG5hbWUvdmFsdWUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgotICAgICAgICAKLSAgICAgICAgVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyCi0gICAgICAgIG1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHlUeXBlIGNvbnRhaW5zIGEgbmFtZS92YWx1ZQotICAgICAgICBjb25maWd1cmF0aW9uIHByb3BlcnR5IHBhaXIgZm9yIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLSAgICAgICAgCi0gICAgICAgIFRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlY29nbml6ZWQgZm9yIGEgcGFydGljdWxhcgotICAgICAgICBtZXNzYWdlLWRyaXZlbiBiZWFuIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBtZXNzYWdpbmcgdHlwZS4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LW5hbWUgZWxlbWVudCBjb250YWlucwotICAgICAgICAgICAgdGhlIG5hbWUgZm9yIGFuIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBvZgotICAgICAgICAgICAgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBGb3IgSk1TIG1lc3NhZ2UtZHJpdmVuIGJlYW5zLCB0aGUgZm9sbG93aW5nIHByb3BlcnR5Ci0gICAgICAgICAgICBuYW1lcyBhcmUgcmVjb2duaXplZDogYWNrbm93bGVkZ2VNb2RlLAotICAgICAgICAgICAgbWVzc2FnZVNlbGVjdG9yLCBkZXN0aW5hdGlvblR5cGUsIHN1YnNjcmlwdGlvbkR1cmFiaWxpdHkKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LXZhbHVlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LXZhbHVlIGVsZW1lbnQKLSAgICAgICAgICAgIGNvbnRhaW5zIHRoZSB2YWx1ZSBmb3IgYW4gYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICBwcm9wZXJ0eSBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXJvdW5kLWludm9rZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgYXJvdW5kLWludm9rZSB0eXBlIHNwZWNpZmllcyBhIG1ldGhvZCBvbiBhCi0gICAgICAgIGNsYXNzIHRvIGJlIGNhbGxlZCBkdXJpbmcgdGhlIGFyb3VuZCBpbnZva2UgcG9ydGlvbiBvZiBhbiAKLSAgICAgICAgZWpiIGludm9jYXRpb24uICBOb3RlIHRoYXQgZWFjaCBjbGFzcyBtYXkgaGF2ZSBvbmx5IG9uZQotICAgICAgICBhcm91bmQgaW52b2tlIG1ldGhvZCBhbmQgdGhhdCB0aGUgbWV0aG9kIG1heSBub3QgYmUKLSAgICAgICAgb3ZlcmxvYWRlZC4KLSAgICAgICAgCi0gICAgICAgIElmIHRoZSBjbGFzcyBlbGVtZW50IGlzIG1pc3NpbmcgdGhlbgotICAgICAgICB0aGUgY2xhc3MgZGVmaW5pbmcgdGhlIGNhbGxiYWNrIGlzIGFzc3VtZWQgdG8gYmUgdGhlCi0gICAgICAgIGludGVyY2VwdG9yIGNsYXNzIG9yIGNvbXBvbmVudCBjbGFzcyBpbiBzY29wZSBhdCB0aGUKLSAgICAgICAgbG9jYXRpb24gaW4gdGhlIGRlc2NyaXB0b3IgaW4gd2hpY2ggdGhlIGFyb3VuZCBpbnZva2UKLSAgICAgICAgZGVmaW5pdGlvbiBhcHBlYXJzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFyb3VuZC10aW1lb3V0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhcm91bmQtdGltZW91dCB0eXBlIHNwZWNpZmllcyBhIG1ldGhvZCBvbiBhCi0gICAgICAgIGNsYXNzIHRvIGJlIGNhbGxlZCBkdXJpbmcgdGhlIGFyb3VuZC10aW1lb3V0IHBvcnRpb24gb2YKLSAgICAgICAgYSB0aW1lciB0aW1lb3V0IGNhbGxiYWNrLiAgTm90ZSB0aGF0IGVhY2ggY2xhc3MgbWF5IGhhdmUgCi0gICAgICAgIG9ubHkgb25lIGFyb3VuZC10aW1lb3V0IG1ldGhvZCBhbmQgdGhhdCB0aGUgbWV0aG9kIG1heSBub3QgCi0gICAgICAgIGJlIG92ZXJsb2FkZWQuCi0gICAgICAgIAotICAgICAgICBJZiB0aGUgY2xhc3MgZWxlbWVudCBpcyBtaXNzaW5nIHRoZW4KLSAgICAgICAgdGhlIGNsYXNzIGRlZmluaW5nIHRoZSBjYWxsYmFjayBpcyBhc3N1bWVkIHRvIGJlIHRoZQotICAgICAgICBpbnRlcmNlcHRvciBjbGFzcyBvciBjb21wb25lbnQgY2xhc3MgaW4gc2NvcGUgYXQgdGhlCi0gICAgICAgIGxvY2F0aW9uIGluIHRoZSBkZXNjcmlwdG9yIGluIHdoaWNoIHRoZSBhcm91bmQtdGltZW91dAotICAgICAgICBkZWZpbml0aW9uIGFwcGVhcnMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXNzZW1ibHktZGVzY3JpcHRvclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgYXNzZW1ibHktZGVzY3JpcHRvclR5cGUgZGVmaW5lcwotICAgICAgICBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbi4KLSAgICAgICAgCi0gICAgICAgIFRoZSBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbiBjb25zaXN0cyBvZiB0aGUKLSAgICAgICAgZm9sbG93aW5nIHBhcnRzOiB0aGUgZGVmaW5pdGlvbiBvZiBzZWN1cml0eSByb2xlcywgdGhlCi0gICAgICAgIGRlZmluaXRpb24gb2YgbWV0aG9kIHBlcm1pc3Npb25zLCB0aGUgZGVmaW5pdGlvbiBvZgotICAgICAgICB0cmFuc2FjdGlvbiBhdHRyaWJ1dGVzIGZvciBlbnRlcnByaXNlIGJlYW5zIHdpdGgKLSAgICAgICAgY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24sIHRoZSBkZWZpbml0aW9uCi0gICAgICAgIG9mIGludGVyY2VwdG9yIGJpbmRpbmdzLCBhIGxpc3Qgb2YKLSAgICAgICAgbWV0aG9kcyB0byBiZSBleGNsdWRlZCBmcm9tIGJlaW5nIGludm9rZWQsIGFuZCBhIGxpc3Qgb2YKLSAgICAgICAgZXhjZXB0aW9uIHR5cGVzIHRoYXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYXBwbGljYXRpb24gZXhjZXB0aW9ucy4KLSAgICAgICAgCi0gICAgICAgIEFsbCB0aGUgcGFydHMgYXJlIG9wdGlvbmFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlCi0gICAgICAgIG9taXR0ZWQgaWYgdGhlIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LgotICAgICAgICAKLSAgICAgICAgUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQKLSAgICAgICAgZGVzY3JpcHRvciBpcyBvcHRpb25hbCBmb3IgdGhlIGVqYi1qYXIgb3IgLndhciBmaWxlIHByb2R1Y2VyLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LXJvbGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wZXJtaXNzaW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptZXRob2QtcGVybWlzc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXRyYW5zYWN0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludGVyY2VwdG9yLWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmludGVyY2VwdG9yLWJpbmRpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtbGlzdCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZXhjbHVkZS1saXN0VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbi1leGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmFwcGxpY2F0aW9uLWV4Y2VwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtcC1maWVsZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgY21wLWZpZWxkVHlwZSBkZXNjcmliZXMgYSBjb250YWluZXItbWFuYWdlZCBmaWVsZC4gVGhlCi0gICAgICAgIGNtcC1maWVsZFR5cGUgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGZpZWxkLAotICAgICAgICBhbmQgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBmaWVsZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgICAgIGNvbnRhaW5lciBtYW5hZ2VkIGZpZWxkLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLSAgICAgICAgICAgIGNtcC12ZXJzaW9uIDIueCBtdXN0IGJlZ2luIHdpdGggYSBsb3dlcmNhc2UKLSAgICAgICAgICAgIGxldHRlci4gVGhpcyBmaWVsZCBpcyBhY2Nlc3NlZCBieSBtZXRob2RzIHdob3NlCi0gICAgICAgICAgICBuYW1lcyBjb25zaXN0cyBvZiB0aGUgbmFtZSBvZiB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5Ci0gICAgICAgICAgICBmaWVsZC1uYW1lIGluIHdoaWNoIHRoZSBmaXJzdCBsZXR0ZXIgaXMgdXBwZXJjYXNlZCwKLSAgICAgICAgICAgIHByZWZpeGVkIGJ5ICJnZXQiIG9yICJzZXQiLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLSAgICAgICAgICAgIGNtcC12ZXJzaW9uIDEueCBtdXN0IGRlbm90ZSBhIHB1YmxpYyBmaWVsZCBvZiB0aGUKLSAgICAgICAgICAgIGVudGVycHJpc2UgYmVhbiBjbGFzcyBvciBvbmUgb2YgaXRzIHN1cGVyY2xhc3Nlcy4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXAtdmVyc2lvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgY21wLXZlcnNpb25UeXBlIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiBhbiBlbnRpdHkgYmVhbgotICAgICAgICB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLiBJdCBpcyB1c2VkIGJ5Ci0gICAgICAgIGNtcC12ZXJzaW9uIGVsZW1lbnRzLgotICAgICAgICAKLSAgICAgICAgVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotICAgICAgICAKLSAgICAgICAgMS54Ci0gICAgICAgIDIueAotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxLngiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMi54Ii8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXItZmllbGRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNtci1maWVsZFR5cGUgZGVzY3JpYmVzIHRoZSBiZWFuIHByb3ZpZGVyJ3MgdmlldyBvZgotICAgICAgICBhIHJlbGF0aW9uc2hpcC4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZAotICAgICAgICB0aGUgbmFtZSBhbmQgdGhlIGNsYXNzIHR5cGUgb2YgYSBmaWVsZCBpbiB0aGUgc291cmNlIG9mIGEKLSAgICAgICAgcm9sZSBvZiBhIHJlbGF0aW9uc2hpcC4gVGhlIGNtci1maWVsZC1uYW1lIGVsZW1lbnQKLSAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgdXNlZCBmb3IgdGhlIGdldCBhbmQgc2V0IGFjY2Vzc29yCi0gICAgICAgIG1ldGhvZHMgZm9yIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBjbXItZmllbGQtdHlwZSBlbGVtZW50IGlzCi0gICAgICAgIHVzZWQgb25seSBmb3IgY29sbGVjdGlvbi12YWx1ZWQgY21yLWZpZWxkcy4gSXQgc3BlY2lmaWVzIHRoZQotICAgICAgICB0eXBlIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgaXMgdXNlZC4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNtci1maWVsZC1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgY21yLWZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotICAgICAgICAgICAgbG9naWNhbCByZWxhdGlvbnNoaXAgZmllbGQgaW4gdGhlIGVudGl0eSBiZWFuCi0gICAgICAgICAgICBjbGFzcy4gVGhlIG5hbWUgb2YgdGhlIGNtci1maWVsZCBtdXN0IGJlZ2luIHdpdGggYQotICAgICAgICAgICAgbG93ZXJjYXNlIGxldHRlci4gVGhpcyBmaWVsZCBpcyBhY2Nlc3NlZCBieSBtZXRob2RzCi0gICAgICAgICAgICB3aG9zZSBuYW1lcyBjb25zaXN0IG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAotICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IGNtci1maWVsZC1uYW1lIGluIHdoaWNoIHRoZSBmaXJzdAotICAgICAgICAgICAgbGV0dGVyIGlzIHVwcGVyY2FzZWQsIHByZWZpeGVkIGJ5ICJnZXQiIG9yICJzZXQiLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmNtci1maWVsZC10eXBlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY21yLWZpZWxkLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNtci1maWVsZC10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjbGFzcyBvZiBhCi0gICAgICAgIGNvbGxlY3Rpb24tdmFsdWVkIGxvZ2ljYWwgcmVsYXRpb25zaGlwIGZpZWxkIGluIHRoZSBlbnRpdHkKLSAgICAgICAgYmVhbiBjbGFzcy4gVGhlIHZhbHVlIG9mIGFuIGVsZW1lbnQgdXNpbmcgY21yLWZpZWxkLXR5cGVUeXBlCi0gICAgICAgIG11c3QgYmUgZWl0aGVyOiBqYXZhLnV0aWwuQ29sbGVjdGlvbiBvciBqYXZhLnV0aWwuU2V0LgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLnV0aWwuU2V0Ii8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25jdXJyZW5jeS1tYW5hZ2VtZW50LXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNvbmN1cnJlbmN5LW1hbmFnZW1lbnQtdHlwZVR5cGUgc3BlY2lmaWVzIHRoZSB3YXkgY29uY3VycmVuY3kKLSAgICAgICAgaXMgbWFuYWdlZCBmb3IgYSBzaW5nbGV0b24gb3Igc3RhdGVmdWwgc2Vzc2lvbiBiZWFuLiAgCi0gICAgICAgIAotICAgICAgICBUaGUgY29uY3VycmVuY3kgbWFuYWdlbWVudCB0eXBlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIAotICAgICAgICBCZWFuCi0gICAgICAgIENvbnRhaW5lcgotICAgICAgICAKLSAgICAgICAgQmVhbiBtYW5hZ2VkIGNvbmN1cnJlbmN5IGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYSBzaW5nbGV0b24gYmVhbi4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbiIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbmN1cnJlbnQtbG9jay10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjb25jdXJyZW50LWxvY2stdHlwZVR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QKLSAgICAgICAgbWFuYWdlIGNvbmN1cnJlbnQgYWNjZXNzIHRvIGEgbWV0aG9kIG9mIGEgU2luZ2xldG9uIGJlYW4gCi0gICAgICAgIHdpdGggY29udGFpbmVyLW1hbmFnZWQgY29uY3VycmVuY3kuCi0gICAgICAgIAotICAgICAgICBUaGUgY29udGFpbmVyIG1hbmFnZWQgY29uY3VycmVuY3kgbG9jayB0eXBlIG11c3QgYmUgb25lIAotICAgICAgICBvZiB0aGUgZm9sbG93aW5nIDoKLSAgICAgICAgCi0gICAgICAgIFJlYWQKLSAgICAgICAgV3JpdGUKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhZCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXcml0ZSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29uY3VycmVudC1tZXRob2RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGNvbmN1cnJlbnQtbWV0aG9kVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBtZXRob2QKLSAgICAgICAgb2YgYSBiZWFuIHdpdGggY29udGFpbmVyIG1hbmFnZWQgY29uY3VycmVuY3kuCi0gICAgICAgIAotICAgICAgICBUaGUgb3B0aW9uYWwgbG9jayBlbGVtZW50IHNwZWNpZmllcyB0aGUga2luZCBvZiBjb25jdXJyZW5jeSAKLSAgICAgICAgbG9jayBhc3Nzb2NpYXRlZCB3aXRoIHRoZSBtZXRob2QuCi0gICAgICAgIAotICAgICAgICBUaGUgb3B0aW9uYWwgYWNjZXNzLXRpbWVvdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFtb3VudCBvZgotICAgICAgICB0aW1lIChpbiBhIGdpdmVuIHRpbWUgdW5pdCkgdGhlIGNvbnRhaW5lciBzaG91bGQgd2FpdCBmb3IgYQotICAgICAgICBjb25jdXJyZW5jeSBsb2NrIGJlZm9yZSB0aHJvd2luZyBhbiBleGNlcHRpb24gdG8gdGhlIGNsaWVudC4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm5hbWVkLW1ldGhvZFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NrIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpjb25jdXJyZW50LWxvY2stdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLXRpbWVvdXQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmFjY2Vzcy10aW1lb3V0VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udGFpbmVyLXRyYW5zYWN0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIHNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lcgotICAgICAgICBtdXN0IG1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4ncwotICAgICAgICBtZXRob2QgaW52b2NhdGlvbnMuIEl0IGRlZmluZXMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEKLSAgICAgICAgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMsIGFuZCBhIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZS4gVGhlCi0gICAgICAgIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZSBpcyB0byBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3BlY2lmaWVkCi0gICAgICAgIG1ldGhvZHMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFucy1hdHRyaWJ1dGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRyYW5zLWF0dHJpYnV0ZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVwZW5kcy1vblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZGVwZW5kcy1vblR5cGUgaXMgdXNlZCB0byBleHByZXNzIGluaXRpYWxpemF0aW9uIAotICAgICAgICBvcmRlcmluZyBkZXBlbmRlbmNpZXMgYmV0d2VlbiBTaW5nbGV0b24gY29tcG9uZW50cy4KLSAgICAgICAgVGhlIGRlcGVuZHMtb25UeXBlIHNwZWNpZmllcyB0aGUgbmFtZXMgb2Ygb25lIG9yIG1vcmUKLSAgICAgICAgU2luZ2xldG9uIGJlYW5zIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uIGFzIHRoZSByZWZlcnJpbmcKLSAgICAgICAgU2luZ2xldG9uLCBlYWNoIG9mIHdoaWNoIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlCi0gICAgICAgIHRoZSByZWZlcnJpbmcgYmVhbi4gIAotICAgICAgICAKLSAgICAgICAgRWFjaCBkZXBlbmRlbnQgYmVhbiBpcyBleHByZXNzZWQgdXNpbmcgZWpiLWxpbmsgc3ludGF4LgotICAgICAgICBUaGUgb3JkZXIgaW4gd2hpY2ggZGVwZW5kZW50IGJlYW5zIGFyZSBpbml0aWFsaXplZCBhdCAKLSAgICAgICAgcnVudGltZSBpcyBub3QgZ3VhcmFudGVlZCB0byBtYXRjaCB0aGUgb3JkZXIgaW4gd2hpY2gKLSAgICAgICAgdGhleSBhcmUgbGlzdGVkLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItbGlua1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIxIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1jbGFzc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgZWpiLWNsYXNzVHlwZSBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi0gICAgICAgIGVudGVycHJpc2UgYmVhbidzIGNsYXNzLiBJdCBpcyB1c2VkIGJ5IGVqYi1jbGFzcyBlbGVtZW50cy4gCi0gICAgICAgIAotICAgICAgICBFeGFtcGxlOgotICAgICAgICAKLSAgICAgICAgPGVqYi1jbGFzcz5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlQmVhbjwvZWpiLWNsYXNzPgotICAgICAgICAKLSAgICAgICAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1qYXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVqYi1qYXJUeXBlIGRlZmluZXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgRUpCCi0gICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gSXQgY29udGFpbnMKLSAgICAgICAgCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGVqYi1qYXIgZmlsZQotICAgICAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotICAgICAgICAtIGFuIG9wdGlvbmFsIGljb24gdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0gICAgICAgIGljb24gZmlsZSBuYW1lCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgbW9kdWxlIG5hbWUuIE9ubHkgYXBwbGljYWJsZSB0bwotICAgICAgICBzdGFuZC1hbG9uZSBlamItamFycyBvciBlamItamFycyBwYWNrYWdlZCBpbiBhbiBlYXIuCi0gICAgICAgIElnbm9yZWQgaWYgc3BlY2lmaWVkIGZvciBhbiBlamItamFyLnhtbCB3aXRoaW4gYSAud2FyLgotICAgICAgICBJbiB0aGF0IGNhc2UsIHN0YW5kYXJkIC53YXIgbW9kdWxlLW5hbWUgcnVsZXMgYXBwbHkuCi0gICAgICAgIC0gc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgaW5jbHVkZWQKLSAgICAgICAgZW50ZXJwcmlzZSBiZWFucyB0aGF0IGlzIG5vdCBzcGVjaWZpZWQgdGhyb3VnaAotICAgICAgICBhbm5vdGF0aW9ucwotICAgICAgICAtIHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYWJvdXQgaW50ZXJjZXB0b3IgY2xhc3NlcwotICAgICAgICAtIGEgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcywgCi0gICAgICAgIGlmIGFueS4gCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgYXBwbGljYXRpb24tYXNzZW1ibHkgZGVzY3JpcHRvcgotICAgICAgICAtIGFuIG9wdGlvbmFsIG5hbWUgb2YgYW4gZWpiLWNsaWVudC1qYXIgZmlsZSBmb3IgdGhlIAotICAgICAgICBlamItamFyLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1vZHVsZS1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRlcnByaXNlLWJlYW5zIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplbnRlcnByaXNlLWJlYW5zVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnRlcmNlcHRvcnMiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmludGVyY2VwdG9yc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVsYXRpb25zaGlwcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cmVsYXRpb25zaGlwc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0icmVsYXRpb25zaGlwLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSBlamItcmVsYXRpb24tbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0gICAgICAgICAgICAgIHJlbGF0aW9uLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLSAgICAgICAgICAgICAgcmVsYXRpb25zaGlwcy4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1yZWxhdGlvbiIvPgotICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTplamItcmVsYXRpb24tbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc2VtYmx5LWRlc2NyaXB0b3IiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmFzc2VtYmx5LWRlc2NyaXB0b3JUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFByb3ZpZGluZyBhbiBhc3NlbWJseS1kZXNjcmlwdG9yIGluIHRoZSBkZXBsb3ltZW50Ci0gICAgICAgICAgICBkZXNjcmlwdG9yIGlzIG9wdGlvbmFsIGZvciB0aGUgZWpiLWphciBvciAud2FyIGZpbGUKLSAgICAgICAgICAgIHByb2R1Y2VyLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWNsaWVudC1qYXIiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgICAgICBUaGUgb3B0aW9uYWwgZWpiLWNsaWVudC1qYXIgZWxlbWVudCBzcGVjaWZpZXMgYSBKQVIKLSAgICAgICAgICAgIGZpbGUgdGhhdCBjb250YWlucyB0aGUgY2xhc3MgZmlsZXMgbmVjZXNzYXJ5IGZvciBhCi0gICAgICAgICAgICBjbGllbnQgcHJvZ3JhbSB0byBhY2Nlc3MgdGhlCi0gICAgICAgICAgICBlbnRlcnByaXNlIGJlYW5zIGluIHRoZSBlamItamFyIGZpbGUuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIEV4YW1wbGU6Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAkgIDxlamItY2xpZW50LWphcj5lbXBsb3llZV9zZXJ2aWNlX2NsaWVudC5qYXIKLSAgICAgICAgICAgIAkgIDwvZWpiLWNsaWVudC1qYXI+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRld2V5LXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIGZpeGVkPSIzLjEiCi0gICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSB2ZXJzaW9uIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUKLSAgICAgICAgICBFSkIgc3BlY2lmaWNhdGlvbiB0aGF0IHRoZSBpbnN0YW5jZSBkb2N1bWVudCBtdXN0IAotICAgICAgICAgIGNvbXBseSB3aXRoLiBUaGlzIGluZm9ybWF0aW9uIGVuYWJsZXMgZGVwbG95bWVudCB0b29scwotICAgICAgICAgIHRvIHZhbGlkYXRlIGEgcGFydGljdWxhciBFSkIgRGVwbG95bWVudAotICAgICAgICAgIERlc2NyaXB0b3Igd2l0aCByZXNwZWN0IHRvIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgRUpCCi0gICAgICAgICAgc2NoZW1hLiAKLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBkZWZpbmVzIHdoZXRoZXIgdGhpcwotICAgICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgb3RoZXIgcmVsYXRlZCBkZXBsb3ltZW50Ci0gICAgICAgICAgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbW9kdWxlIChlLmcuLCB3ZWIgc2VydmljZQotICAgICAgICAgIGRlc2NyaXB0b3JzKSBhcmUgY29tcGxldGUsIG9yIHdoZXRoZXIgdGhlIGNsYXNzCi0gICAgICAgICAgZmlsZXMgYXZhaWxhYmxlIHRvIHRoaXMgbW9kdWxlIGFuZCBwYWNrYWdlZCB3aXRoCi0gICAgICAgICAgdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQgYmUgZXhhbWluZWQgZm9yIGFubm90YXRpb25zCi0gICAgICAgICAgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQgaW5mb3JtYXRpb24uCi0gICAgICAgICAgCi0gICAgICAgICAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgc2V0IHRvICJ0cnVlIiwgdGhlIGRlcGxveW1lbnQKLSAgICAgICAgICB0b29sIG11c3QgaWdub3JlIGFueSBhbm5vdGF0aW9ucyB0aGF0IHNwZWNpZnkgZGVwbG95bWVudAotICAgICAgICAgIGluZm9ybWF0aW9uLCB3aGljaCBtaWdodCBiZSBwcmVzZW50IGluIHRoZSBjbGFzcyBmaWxlcwotICAgICAgICAgIG9mIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAKLSAgICAgICAgICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIHNldCB0bwotICAgICAgICAgICJmYWxzZSIsIHRoZSBkZXBsb3ltZW50IHRvb2wgbXVzdCBleGFtaW5lIHRoZSBjbGFzcwotICAgICAgICAgIGZpbGVzIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgYW5ub3RhdGlvbnMsIGFzCi0gICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9ucy4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgZWpiLW5hbWVUeXBlIHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncyBuYW1lLiBJdCBpcwotICAgICAgICB1c2VkIGJ5IGVqYi1uYW1lIGVsZW1lbnRzLiBUaGlzIG5hbWUgaXMgYXNzaWduZWQgYnkgdGhlCi0gICAgICAgIGZpbGUgcHJvZHVjZXIgdG8gbmFtZSB0aGUgZW50ZXJwcmlzZSBiZWFuIGluIHRoZQotICAgICAgICBlamItamFyIG9yIC53YXIgZmlsZSdzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZQotICAgICAgICB1bmlxdWUgYW1vbmcgdGhlIG5hbWVzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW5zIGluIHRoZSBzYW1lCi0gICAgICAgIGVqYi1qYXIgb3IgLndhciBmaWxlLgotICAgICAgICAKLSAgICAgICAgVGhlcmUgaXMgbm8gYXJjaGl0ZWN0ZWQgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHVzZWQKLSAgICAgICAgZWpiLW5hbWUgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgdGhlIEpOREkgbmFtZSB0aGF0Ci0gICAgICAgIHRoZSBEZXBsb3llciB3aWxsIGFzc2lnbiB0byB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4KLSAgICAgICAgCi0gICAgICAgIFRoZSBuYW1lIGZvciBhbiBlbnRpdHkgYmVhbiBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwKLSAgICAgICAgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0gICAgICAgIAotICAgICAgICBFeGFtcGxlOgotICAgICAgICAKLSAgICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgICAgIAotICAgICAgICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTp4c2ROTVRPS0VOVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWxhdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWpiLXJlbGF0aW9uVHlwZSBkZXNjcmliZXMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28KLSAgICAgICAgZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuICBJdCBpcyB1c2VkCi0gICAgICAgIGJ5IGVqYi1yZWxhdGlvbiBlbGVtZW50cy4gSXQgY29udGFpbnMgYSBkZXNjcmlwdGlvbjsgYW4KLSAgICAgICAgb3B0aW9uYWwgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudDsgYW5kIGV4YWN0bHkgdHdvCi0gICAgICAgIHJlbGF0aW9uc2hpcCByb2xlIGRlY2xhcmF0aW9ucywgZGVmaW5lZCBieSB0aGUKLSAgICAgICAgZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGVsZW1lbnRzLiBUaGUgbmFtZSBvZiB0aGUKLSAgICAgICAgcmVsYXRpb25zaGlwLCBpZiBzcGVjaWZpZWQsIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIKLSAgICAgICAgZmlsZS4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbi1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGVqYi1yZWxhdGlvbi1uYW1lIGVsZW1lbnQgcHJvdmlkZXMgYSB1bmlxdWUgbmFtZQotICAgICAgICAgICAgd2l0aGluIHRoZSBlamItamFyIGZpbGUgZm9yIGEgcmVsYXRpb25zaGlwLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSBkZXNjcmliZXMgYSByb2xlIHdpdGhpbiBhCi0gICAgICAgIHJlbGF0aW9uc2hpcC4gVGhlcmUgYXJlIHR3byByb2xlcyBpbiBlYWNoIHJlbGF0aW9uc2hpcC4KLSAgICAgICAgCi0gICAgICAgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsCi0gICAgICAgIGRlc2NyaXB0aW9uOyBhbiBvcHRpb25hbCBuYW1lIGZvciB0aGUgcmVsYXRpb25zaGlwIHJvbGU7IGEKLSAgICAgICAgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSByb2xlOyBhbiBvcHRpb25hbAotICAgICAgICBzcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByb2xlOwotICAgICAgICB0aGUgcm9sZSBzb3VyY2U7IGFuZCBhIGRlY2xhcmF0aW9uIG9mIHRoZSBjbXItZmllbGQsIGlmIGFueSwKLSAgICAgICAgYnkgbWVhbnMgb2Ygd2hpY2ggdGhlIG90aGVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcwotICAgICAgICBhY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuCi0gICAgICAgIAotICAgICAgICBUaGUgbXVsdGlwbGljaXR5IGFuZCByb2xlLXNvdXJjZSBlbGVtZW50IGFyZSBtYW5kYXRvcnkuCi0gICAgICAgIAotICAgICAgICBUaGUgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgZGVzaWduYXRlcyBhbiBlbnRpdHkKLSAgICAgICAgYmVhbiBieSBtZWFucyBvZiBhbiBlamItbmFtZSBlbGVtZW50LiBGb3IgYmlkaXJlY3Rpb25hbAotICAgICAgICByZWxhdGlvbnNoaXBzLCBib3RoIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG11c3QgZGVjbGFyZSBhCi0gICAgICAgIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IHRoYXQgc3BlY2lmaWVzIGEgY21yLWZpZWxkCi0gICAgICAgIGluIHRlcm1zIG9mIHdoaWNoIHRoZSByZWxhdGlvbnNoaXAgaXMgYWNjZXNzZWQuIFRoZSBsYWNrIG9mCi0gICAgICAgIGEgY21yLWZpZWxkIGVsZW1lbnQgaW4gYW4gZWpiLXJlbGF0aW9uc2hpcC1yb2xlIHNwZWNpZmllcwotICAgICAgICB0aGF0IHRoZSByZWxhdGlvbnNoaXAgaXMgdW5pZGlyZWN0aW9uYWwgaW4gbmF2aWdhYmlsaXR5IGFuZAotICAgICAgICB0aGUgZW50aXR5IGJlYW4gdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gdGhlIHJlbGF0aW9uc2hpcCBpcwotICAgICAgICAibm90IGF3YXJlIiBvZiB0aGUgcmVsYXRpb25zaGlwLgotICAgICAgICAKLSAgICAgICAgRXhhbXBsZToKLSAgICAgICAgCi0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5Qcm9kdWN0LUxpbmVJdGVtPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgCSAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnByb2R1Y3QtaGFzLWxpbmVpdGVtcwotICAgICAgICAJICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAJICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAJICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAJICA8ZWpiLW5hbWU+UHJvZHVjdEVKQjwvZWpiLW5hbWU+Ci0gICAgICAgIAkgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgIAotICAgICAgICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUgZWxlbWVudCBkZWZpbmVzIGEKLSAgICAgICAgICAgIG5hbWUgZm9yIGEgcm9sZSB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gYW4KLSAgICAgICAgICAgIGVqYi1yZWxhdGlvbi4gRGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgY2FuIHVzZSB0aGUKLSAgICAgICAgICAgIHNhbWUgbmFtZSBmb3IgYSByb2xlLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXVsdGlwbGljaXR5IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptdWx0aXBsaWNpdHlUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1kZWxldGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgY2FzY2FkZS1kZWxldGUgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCwgd2l0aGluIGEKLSAgICAgICAgICAgIHBhcnRpY3VsYXIgcmVsYXRpb25zaGlwLCB0aGUgbGlmZXRpbWUgb2Ygb25lIG9yIG1vcmUKLSAgICAgICAgICAgIGVudGl0eSBiZWFucyBpcyBkZXBlbmRlbnQgdXBvbiB0aGUgbGlmZXRpbWUgb2YKLSAgICAgICAgICAgIGFub3RoZXIgZW50aXR5IGJlYW4uIFRoZSBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IGNhbgotICAgICAgICAgICAgb25seSBiZSBzcGVjaWZpZWQgZm9yIGFuIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotICAgICAgICAgICAgZWxlbWVudCBjb250YWluZWQgaW4gYW4gZWpiLXJlbGF0aW9uIGVsZW1lbnQgaW4KLSAgICAgICAgICAgIHdoaWNoIHRoZSBvdGhlciBlamItcmVsYXRpb25zaGlwLXJvbGUKLSAgICAgICAgICAgIGVsZW1lbnQgc3BlY2lmaWVzIGEgbXVsdGlwbGljaXR5IG9mIE9uZS4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNtci1maWVsZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6Y21yLWZpZWxkVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50ZXJwcmlzZS1iZWFuc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZW50ZXJwcmlzZS1iZWFuc1R5cGUgZGVjbGFyZXMgb25lIG9yIG1vcmUgZW50ZXJwcmlzZQotICAgICAgICBiZWFucy4gRWFjaCBiZWFuIGNhbiBiZSBhIHNlc3Npb24sIGVudGl0eSBvciBtZXNzYWdlLWRyaXZlbgotICAgICAgICBiZWFuLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2Vzc2lvbi1iZWFuVHlwZSI+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YKLSAgICAgICAgICAgICAgYW4gRUpCIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4KLSAgICAgICAgICAgICAgdGhlIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0gICAgICAgICAgICAgIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgYmUgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItbG9jYWwtcmVmIi8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tZWpiLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0gICAgICAgICAgICAgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlCi0gICAgICAgICAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotICAgICAgICAgICAgICB3aXRoaW4gdGhlIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1yZWYiLz4KLSAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0gICAgICAgICAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgICAgICAgICAgICBjb21wb25lbnQuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgICAgICAgIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotICAgICAgICAgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLSAgICAgICAgICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0gICAgICAgICAgICAgIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIi8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0gICAgICAgICAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0gICAgICAgICAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0gICAgICAgICAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1yZWYiLz4KLSAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgICAgICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLSAgICAgICAgICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5Ii8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmVudi1lbnRyeS1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplbnRpdHktYmVhblR5cGUiPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YKLSAgICAgICAgICAgICAgYW4gRUpCIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4KLSAgICAgICAgICAgICAgdGhlIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0gICAgICAgICAgICAgIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgYmUgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItbG9jYWwtcmVmIi8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLSAgICAgICAgICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLSAgICAgICAgICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0gICAgICAgICAgICAgIHdpdGhpbiB0aGUgY29tcG9uZW50LgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZiIvPgotICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTplamItcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktcmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotICAgICAgICAgICAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0gICAgICAgICAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotICAgICAgICAgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLSAgICAgICAgICAgICAgY29tcG9uZW50LgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgICAgICAgIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotICAgICAgICAgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLSAgICAgICAgICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0gICAgICAgICAgICAgIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIi8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLSAgICAgICAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLSAgICAgICAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLXJlZiIvPgotICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpyZXMtcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLSAgICAgICAgICAgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlCi0gICAgICAgICAgICAgIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVudi1lbnRyeSIvPgotICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTplbnYtZW50cnktbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZHJpdmVuIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRyaXZlbi1iZWFuVHlwZSI+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mCi0gICAgICAgICAgICAgIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluCi0gICAgICAgICAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotICAgICAgICAgICAgICB0aGUgY29tcG9uZW50LgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGJlIHByZWZpeGVkIHdpdGggImVqYi8iLgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLWxvY2FsLXJlZiIvPgotICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTplamItcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLSAgICAgICAgICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLSAgICAgICAgICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0gICAgICAgICAgICAgIHdpdGhpbiB0aGUgY29tcG9uZW50LgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZiIvPgotICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTplamItcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0gICAgICAgICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0gICAgICAgICAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgICAgICAgICAgICBjb21wb25lbnQuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYtbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLW1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotICAgICAgICAgICAgICBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgICAgICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0gICAgICAgICAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotICAgICAgICAgICAgICBjb21wb25lbnQuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLSAgICAgICAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLSAgICAgICAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLXJlZiIvPgotICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpyZXMtcmVmLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICAgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotICAgICAgICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLSAgICAgICAgICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5Ii8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmVudi1lbnRyeS1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6Y2hvaWNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktYmVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZW50aXR5LWJlYW5UeXBlIGRlY2xhcmVzIGFuIGVudGl0eSBiZWFuLiBUaGUgZGVjbGFyYXRpb24KLSAgICAgICAgY29uc2lzdHMgb2Y6Ci0gICAgICAgIAotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZSAKLSAgICAgICAgaWNvbiBmaWxlIG5hbWUKLSAgICAgICAgLSBhIHVuaXF1ZSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4KLSAgICAgICAgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgICAgICAtIGFuIG9wdGlvbmFsIG1hcHBlZC1uYW1lIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBwcm92aWRlCi0gICAgICAgIHZlbmRvci1zcGVjaWZpYyBkZXBsb3ltZW50IGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHBoeXNpY2FsCi0gICAgICAgIGpuZGktbmFtZSBvZiB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaG9tZSBpbnRlcmZhY2UuIFRoaXMgCi0gICAgICAgIGVsZW1lbnQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIHN1cHBvcnRlZCBieSBhbGwgaW1wbGVtZW50YXRpb25zLgotICAgICAgICBBbnkgdXNlIG9mIHRoaXMgZWxlbWVudCBpcyBub24tcG9ydGFibGUuCi0gICAgICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBob21lIAotICAgICAgICBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueQotICAgICAgICAtIHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4ncyBsb2NhbCBob21lIGFuZCBsb2NhbAotICAgICAgICBpbnRlcmZhY2VzLCBpZiBhbnkKLSAgICAgICAgLSB0aGUgZW50aXR5IGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcwotICAgICAgICAtIHRoZSBvcHRpb25hbCBlbnRpdHkgYmVhbidzIHBlcnNpc3RlbmNlIG1hbmFnZW1lbnQgdHlwZS4gSWYgCi0gICAgICAgIHRoaXMgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkIGl0IGlzIGRlZmF1bHRlZCB0byBDb250YWluZXIuCi0gICAgICAgIC0gdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MgbmFtZQotICAgICAgICAtIGFuIGluZGljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVlbnRyYW5jeQotICAgICAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIAotICAgICAgICBlbnRpdHkgYmVhbidzIGNtcC12ZXJzaW9uCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncwotICAgICAgICBhYnN0cmFjdCBzY2hlbWEgbmFtZQotICAgICAgICAtIGFuIG9wdGlvbmFsIGxpc3Qgb2YgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkgCi0gICAgICAgIGZpZWxkCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudCAKLSAgICAgICAgZW50cmllcwotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIAotICAgICAgICByZWZlcmVuY2VzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbCAKLSAgICAgICAgRUpCIHJlZmVyZW5jZXMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYiAKLSAgICAgICAgc2VydmljZSByZWZlcmVuY2VzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUgCi0gICAgICAgIHJlZmVyZW5jZXMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkKLSAgICAgICAgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzIG1ldGhvZHMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIAotICAgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotICAgICAgICByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2VzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdlIAotICAgICAgICBkZXN0aW5hdGlvbiByZWZlcmVuY2VzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgc2V0IG9mIHF1ZXJ5IGRlY2xhcmF0aW9ucwotICAgICAgICBmb3IgZmluZGVyIGFuZCBzZWxlY3QgbWV0aG9kcyBmb3IgYW4gZW50aXR5Ci0gICAgICAgIGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnguCi0gICAgICAgIAotICAgICAgICBUaGUgb3B0aW9uYWwgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZAotICAgICAgICBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZSBhbmQKLSAgICAgICAgY21wLXZlcnNpb24gMi54LgotICAgICAgICAKLSAgICAgICAgVGhlIG9wdGlvbmFsIHByaW1rZXktZmllbGQgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IKLSAgICAgICAgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLgotICAgICAgICAKLSAgICAgICAgVGhlIG9wdGlvbmFsIGNtcC12ZXJzaW9uIGVsZW1lbnQgbWF5IGJlIHByZXNlbnQgaW4gdGhlCi0gICAgICAgIGRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLiBJZgotICAgICAgICB0aGUgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbgotICAgICAgICBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIGl0cyB2YWx1ZSBkZWZhdWx0cyB0byAyLnguCi0gICAgICAgIAotICAgICAgICBUaGUgb3B0aW9uYWwgaG9tZSBhbmQgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmCi0gICAgICAgIHRoZSBlbnRpdHkgYmVhbiBjbXAtdmVyc2lvbiBpcyAxLnguCi0gICAgICAgIAotICAgICAgICBUaGUgb3B0aW9uYWwgaG9tZSBhbmQgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmCi0gICAgICAgIHRoZSBlbnRpdHkgYmVhbiBoYXMgYSByZW1vdGUgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZS4KLSAgICAgICAgCi0gICAgICAgIFRoZSBvcHRpb25hbCBsb2NhbC1ob21lIGFuZCBsb2NhbCBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZAotICAgICAgICBpZiB0aGUgZW50aXR5IGJlYW4gaGFzIGEgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlLgotICAgICAgICAKLSAgICAgICAgRWl0aGVyIGJvdGggdGhlIGxvY2FsLWhvbWUgYW5kIHRoZSBsb2NhbCBlbGVtZW50cyBvciBib3RoCi0gICAgICAgIHRoZSBob21lIGFuZCB0aGUgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkLgotICAgICAgICAKLSAgICAgICAgVGhlIG9wdGlvbmFsIHF1ZXJ5IGVsZW1lbnRzIG11c3QgYmUgcHJlc2VudCBpZiB0aGUKLSAgICAgICAgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAyLnggYW5kCi0gICAgICAgIHF1ZXJ5IG1ldGhvZHMgb3RoZXIgdGhhbiBmaW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkCi0gICAgICAgIGZvciB0aGUgZW50aXR5IGJlYW4uCi0gICAgICAgIAotICAgICAgICBUaGUgb3RoZXIgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlCi0gICAgICAgIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbQotICAgICAgICBhcmUgZW1wdHkuCi0gICAgICAgIAotICAgICAgICBBdCBsZWFzdCBvbmUgY21wLWZpZWxkIGVsZW1lbnQgbXVzdCBiZSBwcmVzZW50IGluIHRoZQotICAgICAgICBkZXNjcmlwdG9yIGlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQKLSAgICAgICAgdGhlIGNtcC12ZXJzaW9uIGlzIDEueCwgYW5kIG5vbmUgbXVzdCBub3QgYmUgcHJlc2VudCBpZiB0aGUKLSAgICAgICAgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBCZWFuLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVqYi1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBlZC1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhvbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmhvbWVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cmVtb3RlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbC1ob21lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsb2NhbC1ob21lVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bG9jYWxUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZWpiLWNsYXNzVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBlcnNpc3RlbmNlLXR5cGVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbS1rZXktY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgcHJpbS1rZXktY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUKLSAgICAgICAgICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi0gICAgICAgICAgICBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBJZiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgaXMKLSAgICAgICAgICAgIGRlZmVycmVkIHRvIGRlcGxveW1lbnQgdGltZSwgdGhlIHByaW0ta2V5LWNsYXNzIAotICAgICAgICAgICAgZWxlbWVudCBzaG91bGQgc3BlY2lmeSBqYXZhLmxhbmcuT2JqZWN0LgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVlbnRyYW50IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSByZWVudHJhbnQgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhbiBlbnRpdHkKLSAgICAgICAgICAgIGJlYW4gaXMgcmVlbnRyYW50IG9yIG5vdC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgVGhlIHJlZW50cmFudCBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28KLSAgICAgICAgICAgIGZvbGxvd2luZzogdHJ1ZSBvciBmYWxzZQotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21wLXZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmNtcC12ZXJzaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhYnN0cmFjdC1zY2hlbWEtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLSAgICAgICAgICAgIG9mIHRoZSBhYnN0cmFjdCBzY2hlbWEgdHlwZSBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoIAotICAgICAgICAgICAgY21wLXZlcnNpb24gMi54LiBJdCBpcyB1c2VkIGluIEVKQiBRTCBxdWVyaWVzLiAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBmb3IgYW4gZW50aXR5IAotICAgICAgICAgICAgYmVhbiB3aG9zZSBsb2NhbCBpbnRlcmZhY2UgaXMgCi0gICAgICAgICAgICBjb20uYWNtZS5jb21tZXJjZS5PcmRlciBtaWdodCBiZSBPcmRlci4gCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXAtZmllbGQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmNtcC1maWVsZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWtleS1maWVsZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQotICAgICAgICAgICAgbmFtZSBvZiB0aGUgcHJpbWFyeSBrZXkgZmllbGQgZm9yIGFuIGVudGl0eSB3aXRoCi0gICAgICAgICAgICBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgVGhlIHByaW1rZXktZmllbGQgbXVzdCBiZSBvbmUgb2YgdGhlIGZpZWxkcyBkZWNsYXJlZAotICAgICAgICAgICAgaW4gdGhlIGNtcC1maWVsZCBlbGVtZW50LCBhbmQgdGhlIHR5cGUgb2YgdGhlIGZpZWxkCi0gICAgICAgICAgICBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5IGtleSB0eXBlLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBUaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIG5vdCB1c2VkIGlmIHRoZSBwcmltYXJ5Ci0gICAgICAgICAgICBrZXkgbWFwcyB0byBtdWx0aXBsZSBjb250YWluZXItbWFuYWdlZCBmaWVsZHMKLSAgICAgICAgICAgIChpLmUuIHRoZSBrZXkgaXMgYSBjb21wb3VuZCBrZXkpLiBJbiB0aGlzIGNhc2UsIHRoZQotICAgICAgICAgICAgZmllbGRzIG9mIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kCi0gICAgICAgICAgICB0aGVpciBuYW1lcyBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIGZpZWxkIG5hbWVzIG9mCi0gICAgICAgICAgICB0aGUgZW50aXR5IGJlYW4gY2xhc3MgdGhhdCBjb21wcmlzZSB0aGUga2V5LgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktaWRlbnRpdHkiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LWlkZW50aXR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cXVlcnlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJleGNsdWRlLWxpc3RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGV4Y2x1ZGUtbGlzdFR5cGUgc3BlY2lmaWVzIG9uZSBvciBtb3JlIG1ldGhvZHMgd2hpY2gKLSAgICAgICAgdGhlIEFzc2VtYmxlciBtYXJrcyB0byBiZSB1bmNhbGxhYmxlLgotICAgICAgICAKLSAgICAgICAgSWYgdGhlIG1ldGhvZCBwZXJtaXNzaW9uIHJlbGF0aW9uIGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBhcmUKLSAgICAgICAgaW4gdGhlIGV4Y2x1ZGUgbGlzdCwgdGhlIERlcGxveWVyIHNob3VsZCBjb25zaWRlciB0aG9zZQotICAgICAgICBtZXRob2RzIHRvIGJlIHVuY2FsbGFibGUuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwbGljYXRpb24tZXhjZXB0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhcHBsaWNhdGlvbi1leGNlcHRpb25UeXBlIGRlY2xhcmVzIGFuIGFwcGxpY2F0aW9uCi0gICAgICAgIGV4Y2VwdGlvbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotICAgICAgICAKLSAgICAgICAgLSB0aGUgZXhjZXB0aW9uIGNsYXNzLiBXaGVuIHRoZSBjb250YWluZXIgcmVjZWl2ZXMKLSAgICAgICAgYW4gZXhjZXB0aW9uIG9mIHRoaXMgdHlwZSwgaXQgaXMgcmVxdWlyZWQgdG8gCi0gICAgICAgIGZvcndhcmQgdGhpcyBleGNlcHRpb24gYXMgYW4gYXBwbGNhdGlvbiBleGNlcHRpb24gCi0gICAgICAgIHRvIHRoZSBjbGllbnQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGEgY2hlY2tlZAotICAgICAgICBvciB1bmNoZWNrZWQgZXhjZXB0aW9uLgotICAgICAgICAtIGFuIG9wdGlvbmFsIHJvbGxiYWNrIGVsZW1lbnQuIElmIHRoaXMgZWxlbWVudCBpcyAKLSAgICAgICAgc2V0IHRvIHRydWUsIHRoZSBjb250YWluZXIgbXVzdCByb2xsYmFjayB0aGUgY3VycmVudCAKLSAgICAgICAgdHJhbnNhY3Rpb24gYmVmb3JlIGZvcndhcmRpbmcgdGhlIGV4Y2VwdGlvbiB0byB0aGUKLSAgICAgICAgY2xpZW50LiAgSWYgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gZmFsc2UuCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgaW5oZXJpdGVkIGVsZW1lbnQuIElmIHRoaXMgZWxlbWVudCBpcyAKLSAgICAgICAgc2V0IHRvIHRydWUsIHN1YmNsYXNzZXMgb2YgdGhlIGV4Y2VwdGlvbiBjbGFzcyB0eXBlCi0gICAgICAgIGFyZSBhbHNvIGF1dG9tYXRpY2FsbHkgY29uc2lkZXJlZCBhcHBsaWNhdGlvbiAKLSAgICAgICAgZXhjZXB0aW9ucyAodW5sZXNzIG92ZXJyaWRlbiBhdCBhIGxvd2VyIGxldmVsKS4KLSAgICAgICAgSWYgc2V0IHRvIGZhbHNlLCBvbmx5IHRoZSBleGNlcHRpb24gY2xhc3MgdHlwZSBpcwotICAgICAgICBjb25zaWRlcmVkIGFuIGFwcGxpY2F0aW9uLWV4Y2VwdGlvbiwgbm90IGl0cwotICAgICAgICBleGNlcHRpb24gc3ViY2xhc3Nlcy4gSWYgbm90IHNwZWNpZmllZCwgdGhpcwotICAgICAgICB2YWx1ZSBkZWZhdWx0cyB0byB0cnVlLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2VwdGlvbi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGxiYWNrIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmhlcml0ZWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnRlcmNlcHRvcnNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGludGVyY2VwdG9yc1R5cGUgZWxlbWVudCBkZWNsYXJlcyBvbmUgb3IgbW9yZSBpbnRlcmNlcHRvcgotICAgICAgICBjbGFzc2VzIHVzZWQgYnkgY29tcG9uZW50cyB3aXRoaW4gdGhpcyBlamItamFyIG9yIC53YXIuICBUaGUgZGVjbGFyYXRpb24KLSAgICAgICAgY29uc2lzdHMgb2YgOgotICAgICAgICAKLSAgICAgICAgLSBBbiBvcHRpb25hbCBkZXNjcmlwdGlvbi4KLSAgICAgICAgLSBPbmUgb3IgbW9yZSBpbnRlcmNlcHRvciBlbGVtZW50cy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludGVyY2VwdG9yIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTppbnRlcmNlcHRvclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJjZXB0b3JUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGludGVyY2VwdG9yVHlwZSBlbGVtZW50IGRlY2xhcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlCi0gICAgICAgIGludGVyY2VwdG9yIGNsYXNzLiAgSXQgY29uc2lzdHMgb2YgOgotICAgICAgICAKLSAgICAgICAgLSBBbiBvcHRpb25hbCBkZXNjcmlwdGlvbi4KLSAgICAgICAgLSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGludGVyY2VwdG9yIGNsYXNzLgotICAgICAgICAtIEFuIG9wdGlvbmFsIGxpc3Qgb2YgYXJvdW5kIGludm9rZSBtZXRob2RzIGRlY2xhcmVkIG9uIHRoZQotICAgICAgICBpbnRlcmNlcHRvciBjbGFzcyBhbmQvb3IgaXRzIHN1cGVyLWNsYXNzZXMuCi0gICAgICAgIC0gQW4gb3B0aW9uYWwgbGlzdCBvZiBhcm91bmQgdGltZW91dCBtZXRob2RzIGRlY2xhcmVkIG9uIHRoZQotICAgICAgICBpbnRlcmNlcHRvciBjbGFzcyBhbmQvb3IgaXRzIHN1cGVyLWNsYXNzZXMuCi0gICAgICAgIC0gQW4gb3B0aW9uYWwgbGlzdCBlbnZpcm9ubWVudCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBpbnRlcmNlcHRvcgotICAgICAgICBjbGFzcyBhbmQvb3IgaXRzIHN1cGVyLWNsYXNzZXMuCi0gICAgICAgIC0gQW4gb3B0aW9uYWwgbGlzdCBvZiBwb3N0LWFjdGl2YXRlIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhlCi0gICAgICAgIGludGVyY2VwdG9yIGNsYXNzIGFuZC9vciBpdHMgc3VwZXItY2xhc3Nlcy4KLSAgICAgICAgLSBBbiBvcHRpb25hbCBsaXN0IG9mIHByZS1wYXNzaXZhdGUgbWV0aG9kcyBkZWNsYXJlZCBvbiB0aGUKLSAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3MgYW5kL29yIGl0cyBzdXBlci1jbGFzc2VzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJjZXB0b3ItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcm91bmQtaW52b2tlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphcm91bmQtaW52b2tlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcm91bmQtdGltZW91dCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YXJvdW5kLXRpbWVvdXRUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWFjdGl2YXRlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsaWZlY3ljbGUtY2FsbGJhY2tUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wYXNzaXZhdGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmxpZmVjeWNsZS1jYWxsYmFja1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImludGVyY2VwdG9yLWJpbmRpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgVGhlIGludGVyY2VwdG9yLWJpbmRpbmdUeXBlIGVsZW1lbnQgZGVzY3JpYmVzIHRoZSBiaW5kaW5nIG9mCi0gICAgICAgIGludGVyY2VwdG9yIGNsYXNzZXMgdG8gYmVhbnMgd2l0aGluIHRoZSBlamItamFyIG9yIC53YXIuCi0gICAgICAgIEl0IGNvbnNpc3RzIG9mIDoKLSAgICAgICAgCi0gICAgICAgIC0gQW4gb3B0aW9uYWwgZGVzY3JpcHRpb24uCi0gICAgICAgIC0gVGhlIG5hbWUgb2YgYW4gZWpiIHdpdGhpbiB0aGUgbW9kdWxlIG9yIHRoZSB3aWxkY2FyZCB2YWx1ZSAiKiIsCi0gICAgICAgIHdoaWNoIGlzIHVzZWQgdG8gZGVmaW5lIGludGVyY2VwdG9ycyB0aGF0IGFyZSBib3VuZCB0byBhbGwKLSAgICAgICAgYmVhbnMgaW4gdGhlIGVqYi1qYXIgb3IgLndhci4KLSAgICAgICAgLSBBIGxpc3Qgb2YgaW50ZXJjZXB0b3IgY2xhc3NlcyB0aGF0IGFyZSBib3VuZCB0byB0aGUgY29udGVudHMgb2YKLSAgICAgICAgdGhlIGVqYi1uYW1lIGVsZW1lbnQgb3IgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSB0b3RhbCBvcmRlcmluZwotICAgICAgICBvdmVyIHRoZSBpbnRlcmNlcHRvcnMgZGVmaW5lZCBmb3IgdGhlIGdpdmVuIGxldmVsIGFuZCBhYm92ZS4KLSAgICAgICAgLSBBbiBvcHRpb25hbCBleGNsdWRlLWRlZmF1bHQtaW50ZXJjZXB0b3JzIGVsZW1lbnQuICBJZiBzZXQgdG8gdHJ1ZSwKLSAgICAgICAgc3BlY2lmaWVzIHRoYXQgZGVmYXVsdCBpbnRlcmNlcHRvcnMgYXJlIG5vdCB0byBiZSBhcHBsaWVkIHRvIAotICAgICAgICBhIGJlYW4tY2xhc3MgYW5kL29yIGJ1c2luZXNzIG1ldGhvZC4KLSAgICAgICAgLSBBbiBvcHRpb25hbCBleGNsdWRlLWNsYXNzLWludGVyY2VwdG9ycyBlbGVtZW50LiAgSWYgc2V0IHRvIHRydWUsCi0gICAgICAgIHNwZWNpZmllcyB0aGF0IGNsYXNzIGludGVyY2VwdG9ycyBhcmUgbm90IHRvIGJlIGFwcGxpZWQgdG8gCi0gICAgICAgIGEgYnVzaW5lc3MgbWV0aG9kLgotICAgICAgICAtIEFuIG9wdGlvbmFsIHNldCBvZiBtZXRob2QgZWxlbWVudHMgZm9yIGRlc2NyaWJpbmcgdGhlIG5hbWUvcGFyYW1zCi0gICAgICAgIG9mIGEgbWV0aG9kLWxldmVsIGludGVyY2VwdG9yLgotICAgICAgICAKLSAgICAgICAgSW50ZXJjZXB0b3JzIGJvdW5kIHRvIGFsbCBjbGFzc2VzIHVzaW5nIHRoZSB3aWxkY2FyZCBzeW50YXgKLSAgICAgICAgIioiIGFyZSBkZWZhdWx0IGludGVyY2VwdG9ycyBmb3IgdGhlIGNvbXBvbmVudHMgaW4gdGhlIGVqYi1qYXIgb3IgLndhci4gCi0gICAgICAgIEluIGFkZGl0aW9uLCBpbnRlcmNlcHRvcnMgbWF5IGJlIGJvdW5kIGF0IHRoZSBsZXZlbCBvZiB0aGUgYmVhbgotICAgICAgICBjbGFzcyAoY2xhc3MtbGV2ZWwgaW50ZXJjZXB0b3JzKSBvciBidXNpbmVzcyBtZXRob2RzIChtZXRob2QtbGV2ZWwKLSAgICAgICAgaW50ZXJjZXB0b3JzICkuCi0gICAgICAgIAotICAgICAgICBUaGUgYmluZGluZyBvZiBpbnRlcmNlcHRvcnMgdG8gY2xhc3NlcyBpcyBhZGRpdGl2ZS4gIElmIGludGVyY2VwdG9ycwotICAgICAgICBhcmUgYm91bmQgYXQgdGhlIGNsYXNzLWxldmVsIGFuZC9vciBkZWZhdWx0LWxldmVsIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgIG1ldGhvZC1sZXZlbCwgYm90aCBjbGFzcy1sZXZlbCBhbmQvb3IgZGVmYXVsdC1sZXZlbCBhcyB3ZWxsIGFzCi0gICAgICAgIG1ldGhvZC1sZXZlbCB3aWxsIGFwcGx5LiAKLSAgICAgICAgCi0gICAgICAgIFRoZXJlIGFyZSBmb3VyIHBvc3NpYmxlIHN0eWxlcyBvZiB0aGUgaW50ZXJjZXB0b3IgZWxlbWVudCBzeW50YXggOgotICAgICAgICAKLSAgICAgICAgMS4KLSAgICAgICAgPGludGVyY2VwdG9yLWJpbmRpbmc+Ci0gICAgICAgIDxlamItbmFtZT4qPC9lamItbmFtZT4KLSAgICAgICAgPGludGVyY2VwdG9yLWNsYXNzPklOVEVSQ0VQVE9SPC9pbnRlcmNlcHRvci1jbGFzcz4KLSAgICAgICAgPC9pbnRlcmNlcHRvci1iaW5kaW5nPgotICAgICAgICAKLSAgICAgICAgU3BlY2lmeWluZyB0aGUgZWpiLW5hbWUgYXMgdGhlIHdpbGRjYXJkIHZhbHVlICIqIiBkZXNpZ25hdGVzCi0gICAgICAgIGRlZmF1bHQgaW50ZXJjZXB0b3JzIChpbnRlcmNlcHRvcnMgdGhhdCBhcHBseSB0byBhbGwgc2Vzc2lvbiBhbmQKLSAgICAgICAgbWVzc2FnZS1kcml2ZW4gYmVhbnMgY29udGFpbmVkIGluIHRoZSBlamItamFyIG9yIC53YXIpLgotICAgICAgICAKLSAgICAgICAgMi4gCi0gICAgICAgIDxpbnRlcmNlcHRvci1iaW5kaW5nPgotICAgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAgICAgIDxpbnRlcmNlcHRvci1jbGFzcz5JTlRFUkNFUFRPUjwvaW50ZXJjZXB0b3ItY2xhc3M+Ci0gICAgICAgIDwvaW50ZXJjZXB0b3ItYmluZGluZz4KLSAgICAgICAgCi0gICAgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBpbnRlcmNlcHRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICAgICBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuKGNsYXNzLWxldmVsIGludGVyY2VwdG9ycykuCi0gICAgICAgIAotICAgICAgICAzLiAKLSAgICAgICAgPGludGVyY2VwdG9yLWJpbmRpbmc+Ci0gICAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICAgICAgPGludGVyY2VwdG9yLWNsYXNzPklOVEVSQ0VQVE9SPC9pbnRlcmNlcHRvci1jbGFzcz4KLSAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L2ludGVyY2VwdG9yLWJpbmRpbmc+Ci0gICAgICAgIAotICAgICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gYXNzb2NpYXRlIGEgbWV0aG9kLWxldmVsIGludGVyY2VwdG9yIHdpdGggCi0gICAgICAgIHRoZSBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuLiAgSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1ldGhvZHMKLSAgICAgICAgd2l0aCB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoZSBlbGVtZW50IG9mIHRoaXMgc3R5bGUgcmVmZXJzCi0gICAgICAgIHRvIGFsbCB0aGUgbWV0aG9kcyB3aXRoIHRoZSBvdmVybG9hZGVkIG5hbWUuICBNZXRob2QtbGV2ZWwKLSAgICAgICAgaW50ZXJjZXB0b3JzIGNhbiBvbmx5IGJlIGFzc29jaWF0ZWQgd2l0aCBidXNpbmVzcyBtZXRob2RzIG9mIHRoZQotICAgICAgICBiZWFuIGNsYXNzLiAgIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmQgdmFsdWUgIioiIGNhbm5vdCBiZSB1c2VkCi0gICAgICAgIHRvIHNwZWNpZnkgbWV0aG9kLWxldmVsIGludGVyY2VwdG9ycy4KLSAgICAgICAgCi0gICAgICAgIDQuIAotICAgICAgICA8aW50ZXJjZXB0b3ItYmluZGluZz4KLSAgICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICAgICAgICA8aW50ZXJjZXB0b3ItY2xhc3M+SU5URVJDRVBUT1I8L2ludGVyY2VwdG9yLWNsYXNzPgotICAgICAgICA8bWV0aG9kPgotICAgICAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+UEFSQU0tMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPlBBUkFNLTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgLi4uCi0gICAgICAgIDxtZXRob2QtcGFyYW0+UEFSQU0tTjwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L2ludGVyY2VwdG9yLWJpbmRpbmc+Ci0gICAgICAgIAotICAgICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gYXNzb2NpYXRlIGEgbWV0aG9kLWxldmVsIGludGVyY2VwdG9yIHdpdGggCi0gICAgICAgIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mIHRoZSBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuLiAgVGhpcyAKLSAgICAgICAgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEgc2V0IG9mIG1ldGhvZHMKLSAgICAgICAgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuICBUaGUgdmFsdWVzIFBBUkFNLTEgdGhyb3VnaCBQQVJBTS1OCi0gICAgICAgIGFyZSB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZXMgb2YgdGhlIG1ldGhvZCdzIGlucHV0IHBhcmFtZXRlcnMKLSAgICAgICAgKGlmIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0IGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudAotICAgICAgICBjb250YWlucyBubyBtZXRob2QtcGFyYW0gZWxlbWVudHMpLiBBcnJheXMgYXJlIHNwZWNpZmllZCBieSB0aGUKLSAgICAgICAgYXJyYXkgZWxlbWVudCdzIHR5cGUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBhaXIgb2Ygc3F1YXJlIAotICAgICAgICBicmFja2V0cyAoZS5nLiBpbnRbXVtdKS4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludGVyY2VwdG9yLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJjZXB0b3Itb3JkZXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aW50ZXJjZXB0b3Itb3JkZXJUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIxIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWludGVyY2VwdG9ycyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1jbGFzcy1pbnRlcmNlcHRvcnMiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bmFtZWQtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJjZXB0b3Itb3JkZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGludGVyY2VwdG9yLW9yZGVyVHlwZSBlbGVtZW50IGRlc2NyaWJlcyBhIHRvdGFsIG9yZGVyaW5nCi0gICAgICAgIG9mIGludGVyY2VwdG9yIGNsYXNzZXMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJjZXB0b3ItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIxIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wYXJhbXMiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm1ldGhvZC1wYXJhbXNUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbml0LW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3JlYXRlLW1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bmFtZWQtbWV0aG9kVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJlYW4tbWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpuYW1lZC1tZXRob2RUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbW92ZS1tZXRob2RUeXBlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJlYW4tbWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpuYW1lZC1tZXRob2RUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmV0YWluLWlmLWV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZHJpdmVuLWJlYW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG1lc3NhZ2UtZHJpdmVuIGVsZW1lbnQgZGVjbGFyZXMgYSBtZXNzYWdlLWRyaXZlbgotICAgICAgICBiZWFuLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0gICAgICAgIAotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZSAKLSAgICAgICAgaWNvbiBmaWxlIG5hbWUuIAotICAgICAgICAtIGEgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuIGluCi0gICAgICAgIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLSAgICAgICAgLSBhbiBvcHRpb25hbCBtYXBwZWQtbmFtZSBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZQotICAgICAgICB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBwaHlzaWNhbAotICAgICAgICBqbmRpLW5hbWUgb2YgZGVzdGluYXRpb24gZnJvbSB3aGljaCB0aGlzIG1lc3NhZ2UtZHJpdmVuIGJlYW4KLSAgICAgICAgc2hvdWxkIGNvbnN1bWUuICBUaGlzIGVsZW1lbnQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIHN1cHBvcnRlZCAKLSAgICAgICAgYnkgYWxsIGltcGxlbWVudGF0aW9ucy4gIEFueSB1c2Ugb2YgdGhpcyBlbGVtZW50IGlzIG5vbi1wb3J0YWJsZS4KLSAgICAgICAgLSB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdpbmcgCi0gICAgICAgIHR5cGUgCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB0aW1lb3V0IG1ldGhvZCBmb3IKLSAgICAgICAgaGFuZGxpbmcgcHJvZ3JhbW1hdGljYWxseSBjcmVhdGVkIHRpbWVycwotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRpbWVycyB0byBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYXQKLSAgICAgICAgZGVwbG95bWVudCB0aW1lCi0gICAgICAgIC0gdGhlIG9wdGlvbmFsIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IAotICAgICAgICB0eXBlLiBJZiBpdCBpcyBub3QgZGVmaW5lZCwgaXQgaXMgZGVmYXVsdGVkIHRvIENvbnRhaW5lci4KLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIAotICAgICAgICBtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIAotICAgICAgICBtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzCi0gICAgICAgIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbiBjbGFzcyBhbmQvb3IKLSAgICAgICAgc3VwZXJjbGFzcyBhcm91bmQtaW52b2tlIG1ldGhvZHMuCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbiBjbGFzcyBhbmQvb3IKLSAgICAgICAgc3VwZXJjbGFzcyBhcm91bmQtdGltZW91dCBtZXRob2RzLgotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQKLSAgICAgICAgZW50cmllcwotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsIEVKQgotICAgICAgICByZWZlcmVuY2VzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIgc2VydmljZQotICAgICAgICByZWZlcmVuY2VzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUgCi0gICAgICAgIHJlZmVyZW5jZXMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkKLSAgICAgICAgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzCi0gICAgICAgIG1ldGhvZHMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIAotICAgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSAKLSAgICAgICAgcmVmZXJlbmNlcwotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UKLSAgICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UgCi0gICAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVqYi1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGVqYi1jbGFzcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUKLSAgICAgICAgICAgIG9mIHRoZSBiZWFuIGNsYXNzIGZvciB0aGlzIGVqYi4gIEl0IGlzIHJlcXVpcmVkIHVubGVzcwotICAgICAgICAgICAgdGhlcmUgaXMgYSBjb21wb25lbnQtZGVmaW5pbmcgYW5ub3RhdGlvbiBmb3IgdGhlIHNhbWUKLSAgICAgICAgICAgIGVqYi1uYW1lLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnaW5nLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIG1lc3NhZ2luZy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBsaXN0ZW5lciBpbnRlcmZhY2Ugb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4uIAotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGltZW91dC1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm5hbWVkLW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHRpbWVvdXQtbWV0aG9kIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtZXRob2QgdGhhdAotICAgICAgICAgICAgd2lsbCByZWNlaXZlIGNhbGxiYWNrcyBmb3IgcHJvZ3JhbW1hdGljYWxseQotICAgICAgICAgICAgY3JlYXRlZCB0aW1lcnMuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0aW1lciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dGltZXJUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zYWN0aW9uLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRyYW5zYWN0aW9uLXR5cGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWciCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmFjdGl2YXRpb24tY29uZmlnVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcm91bmQtaW52b2tlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphcm91bmQtaW52b2tlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcm91bmQtdGltZW91dCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YXJvdW5kLXRpbWVvdXRUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlLXJlZiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktcm9sZS1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LWlkZW50aXR5IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1pZGVudGl0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgbWV0aG9kVHlwZSBpcyB1c2VkIHRvIGRlbm90ZSBhIG1ldGhvZCBvZiBhbiBlbnRlcnByaXNlCi0gICAgICAgIGJlYW4ncyBidXNpbmVzcywgaG9tZSwgY29tcG9uZW50LCBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQKLSAgICAgICAgaW50ZXJmYWNlLCBvciwgaW4gdGhlIGNhc2Ugb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLCB0aGUKLSAgICAgICAgYmVhbidzIG1lc3NhZ2UgbGlzdGVuZXIgbWV0aG9kLCBvciBhIHNldCBvZiBzdWNoCi0gICAgICAgIG1ldGhvZHMuIFRoZSBlamItbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZQotICAgICAgICBlbnRlcnByaXNlIGJlYW5zIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3I7IHRoZQotICAgICAgICBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEKLSAgICAgICAgbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIHRoYXQgaXMgbXVsdGlwbHkgZGVmaW5lZAotICAgICAgICBhY3Jvc3MgdGhlIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZSAKLSAgICAgICAgZW5kcG9pbnQgbnRlcmZhY2VzOyB0aGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIAotICAgICAgICBtZXRob2QgbmFtZTsgYW5kIHRoZSBvcHRpb25hbCBtZXRob2QtcGFyYW1zIGVsZW1lbnRzIGlkZW50aWZ5IAotICAgICAgICBhIHNpbmdsZSBtZXRob2QgYW1vbmcgbXVsdGlwbGUgbWV0aG9kcyB3aXRoIGFuIG92ZXJsb2FkZWQKLSAgICAgICAgbWV0aG9kIG5hbWUuCi0gICAgICAgIAotICAgICAgICBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgc3R5bGVzIG9mIHVzaW5nIG1ldGhvZFR5cGUgZWxlbWVudAotICAgICAgICB3aXRoaW4gYSBtZXRob2QgZWxlbWVudDoKLSAgICAgICAgCi0gICAgICAgIDEuCi0gICAgICAgIDxtZXRob2Q+Ci0gICAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICAgICAgPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgCi0gICAgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlCi0gICAgICAgIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcywgaG9tZSwgY29tcG9uZW50LCAKLSAgICAgICAgYW5kL29yIHdlYiBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMuCi0gICAgICAgIAotICAgICAgICAyLgotICAgICAgICA8bWV0aG9kPgotICAgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAgICAgIDxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPgotICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgCi0gICAgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byB0aGUgc3BlY2lmaWVkIG1ldGhvZCBvZgotICAgICAgICB0aGUgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCi0gICAgICAgIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoZSBlbGVtZW50IG9mCi0gICAgICAgIHRoaXMgc3R5bGUgcmVmZXJzIHRvIGFsbCB0aGUgbWV0aG9kcyB3aXRoIHRoZSBvdmVybG9hZGVkCi0gICAgICAgIG5hbWUuCi0gICAgICAgIAotICAgICAgICAzLgotICAgICAgICA8bWV0aG9kPgotICAgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAgICAgIDxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPgotICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgCSAgPG1ldGhvZC1wYXJhbT5QQVJBTS0xPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIAkgIDxtZXRob2QtcGFyYW0+UEFSQU0tMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAJICAuLi4KLSAgICAgICAgCSAgPG1ldGhvZC1wYXJhbT5QQVJBTS1uPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIAotICAgICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYSBzaW5nbGUgbWV0aG9kIHdpdGhpbiBhCi0gICAgICAgIHNldCBvZiBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBuYW1lLiBQQVJBTS0xIHRocm91Z2gKLSAgICAgICAgUEFSQU0tbiBhcmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGVzIG9mIHRoZQotICAgICAgICBtZXRob2QncyBpbnB1dCBwYXJhbWV0ZXJzIChpZiB0aGUgbWV0aG9kIGhhcyBubyBpbnB1dAotICAgICAgICBhcmd1bWVudHMsIHRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQgY29udGFpbnMgbm8KLSAgICAgICAgbWV0aG9kLXBhcmFtIGVsZW1lbnRzKS4gQXJyYXlzIGFyZSBzcGVjaWZpZWQgYnkgdGhlCi0gICAgICAgIGFycmF5IGVsZW1lbnQncyB0eXBlLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwYWlyIG9mCi0gICAgICAgIHNxdWFyZSBicmFja2V0cyAoZS5nLiBpbnRbXVtdKS4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCi0gICAgICAgIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoaXMgc3R5bGUgcmVmZXJzCi0gICAgICAgIHRvIGFsbCBvZiB0aGUgb3ZlcmxvYWRlZCBtZXRob2RzLiAKLSAgICAgICAgCi0gICAgICAgIEV4YW1wbGVzOgotICAgICAgICAKLSAgICAgICAgU3R5bGUgMTogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZQotICAgICAgICBtZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGJ1c2luZXNzLCBob21lLCAKLSAgICAgICAgY29tcG9uZW50LCBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlczoKLSAgICAgICAgCi0gICAgICAgIDxtZXRob2Q+Ci0gICAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgICAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgIDwvbWV0aG9kPgotICAgICAgICAKLSAgICAgICAgU3R5bGUgMjogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZQotICAgICAgICBjcmVhdGUgbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lCi0gICAgICAgIGludGVyZmFjZShzKS4KLSAgICAgICAgCi0gICAgICAgIDxtZXRob2Q+Ci0gICAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLSAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIAotICAgICAgICBTdHlsZSAzOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byB0aGUKLSAgICAgICAgY3JlYXRlKFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBMYXN0TmFtZSkgbWV0aG9kIG9mIHRoZQotICAgICAgICBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlKHMpLgotICAgICAgICAKLSAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIAkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgIDwvbWV0aG9kPgotICAgICAgICAKLSAgICAgICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGEgU3R5bGUgMyBlbGVtZW50IHdpdGgKLSAgICAgICAgbW9yZSBjb21wbGV4IHBhcmFtZXRlciB0eXBlcy4gVGhlIG1ldGhvZCAKLSAgICAgICAgZm9vYmFyKGNoYXIgcywgaW50IGksIGludFtdIGlhciwgbXlwYWNrYWdlLk15Q2xhc3MgbXljbCwgCi0gICAgICAgIG15cGFja2FnZS5NeUNsYXNzW11bXSBteWNsYWFyKSB3b3VsZCBiZSBzcGVjaWZpZWQgYXM6Ci0gICAgICAgIAotICAgICAgICA8bWV0aG9kPgotICAgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLSAgICAgICAgPG1ldGhvZC1uYW1lPmZvb2JhcjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAJICA8bWV0aG9kLXBhcmFtPmNoYXI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgCSAgPG1ldGhvZC1wYXJhbT5pbnQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgCSAgPG1ldGhvZC1wYXJhbT5pbnRbXTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAJICA8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIAkgIDxtZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3NbXVtdPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIAotICAgICAgICBUaGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aGVuIGl0IGJlY29tZXMKLSAgICAgICAgbmVjZXNzYXJ5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhIG1ldGhvZCB0aGF0IGlzIG11bHRpcGx5Ci0gICAgICAgIGRlZmluZWQgYWNyb3NzIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcywgaG9tZSwgY29tcG9uZW50LAotICAgICAgICBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kCi0gICAgICAgIHNpZ25hdHVyZS4gSG93ZXZlciwgaWYgdGhlIHNhbWUgbWV0aG9kIGlzIGEgbWV0aG9kIG9mIGJvdGggdGhlCi0gICAgICAgIGxvY2FsIGJ1c2luZXNzIGludGVyZmFjZSwgYW5kIHRoZSBsb2NhbCBjb21wb25lbnQgaW50ZXJmYWNlLCAKLSAgICAgICAgdGhlIHNhbWUgYXR0cmlidXRlIGFwcGxpZXMgdG8gdGhlIG1ldGhvZCBmb3IgYm90aCBpbnRlcmZhY2VzLgotICAgICAgICBMaWtld2lzZSwgaWYgdGhlIHNhbWUgbWV0aG9kIGlzIGEgbWV0aG9kIG9mIGJvdGggdGhlIHJlbW90ZSAKLSAgICAgICAgYnVzaW5lc3MgaW50ZXJmYWNlIGFuZCB0aGUgcmVtb3RlIGNvbXBvbmVudCBpbnRlcmZhY2UsIHRoZSBzYW1lCi0gICAgICAgIGF0dHJpYnV0ZSBhcHBsaWVzIHRvIHRoZSBtZXRob2QgZm9yIGJvdGggaW50ZXJmYWNlcy4KLSAgICAgICAgCi0gICAgICAgIEZvciBleGFtcGxlLCB0aGUgbWV0aG9kIGVsZW1lbnQKLSAgICAgICAgCi0gICAgICAgIDxtZXRob2Q+Ci0gICAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIHRoZSBjcmVhdGUoU3RyaW5nLCBTdHJpbmcpCi0gICAgICAgIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlIGZyb20gdGhlCi0gICAgICAgIGNyZWF0ZShTdHJpbmcsIFN0cmluZykgbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBob21lCi0gICAgICAgIGludGVyZmFjZSwgd2hpY2ggd291bGQgYmUgZGVmaW5lZCBhcwotICAgICAgICAKLSAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIAotICAgICAgICBhbmQgdGhlIGNyZWF0ZSBtZXRob2QgdGhhdCBpcyBkZWZpbmVkIGluIHRoZSBsb2NhbCBob21lCi0gICAgICAgIGludGVyZmFjZSB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0gICAgICAgIAotICAgICAgICA8bWV0aG9kPgotICAgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLSAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIAkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgIDwvbWV0aG9kPgotICAgICAgICAKLSAgICAgICAgVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2l0aCBhbGwgdGhyZWUgU3R5bGVzCi0gICAgICAgIG9mIHRoZSBtZXRob2QgZWxlbWVudCB1c2FnZS4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcKLSAgICAgICAgbWV0aG9kIGVsZW1lbnQgZXhhbXBsZSBjb3VsZCBiZSB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUKLSAgICAgICAgbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyByZW1vdGUgaG9tZSBpbnRlcmZhY2UKLSAgICAgICAgYW5kIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlLgotICAgICAgICAKLSAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLWludGYiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm1ldGhvZC1pbnRmVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWV0aG9kLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWV0aG9kLXBhcmFtc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1pbnRmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyBhIG1ldGhvZCBlbGVtZW50IHRvCi0gICAgICAgIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kCi0gICAgICAgIHNpZ25hdHVyZSB0aGF0IGFyZSBtdWx0aXBseSBkZWZpbmVkIGFjcm9zcyB0aGUgaG9tZSBhbmQKLSAgICAgICAgY29tcG9uZW50IGludGVyZmFjZXMgKGUuZywgaW4gYm90aCBhbiBlbnRlcnByaXNlIGJlYW4ncwotICAgICAgICByZW1vdGUgYW5kIGxvY2FsIGludGVyZmFjZXMgb3IgaW4gYm90aCBhbiBlbnRlcnByaXNlIGJlYW4ncwotICAgICAgICBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgZXRjLik7IHRoZSBjb21wb25lbnQgYW5kIHdlYgotICAgICAgICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMsIGFuZCBzbyBvbi4gCi0gICAgICAgIAotICAgICAgICBMb2NhbCBhcHBsaWVzIHRvIHRoZSBsb2NhbCBjb21wb25lbnQgaW50ZXJmYWNlLCBsb2NhbCBidXNpbmVzcyAKLSAgICAgICAgaW50ZXJmYWNlcywgYW5kIHRoZSBuby1pbnRlcmZhY2Ugdmlldy4gCi0gICAgICAgIAotICAgICAgICBSZW1vdGUgYXBwbGllcyB0byBib3RoIHJlbW90ZSBjb21wb25lbnQgaW50ZXJmYWNlIGFuZCB0aGUgcmVtb3RlIAotICAgICAgICBidXNpbmVzcyBpbnRlcmZhY2VzLiAgCi0gICAgICAgIAotICAgICAgICBTZXJ2aWNlRW5kcG9pbnQgcmVmZXJzIHRvIG1ldGhvZHMgZXhwb3NlZCB0aHJvdWdoIGEgd2ViIHNlcnZpY2UKLSAgICAgICAgZW5kcG9pbnQuCi0gICAgICAgIAotICAgICAgICBUaW1lciByZWZlcnMgdG8gdGhlIGJlYW4ncyB0aW1lb3V0IGNhbGxiYWNrIG1ldGhvZHMuCi0gICAgICAgIAotICAgICAgICBNZXNzYWdlRW5kcG9pbnQgcmVmZXJzIHRvIHRoZSBtZXRob2RzIG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbidzCi0gICAgICAgIG1lc3NhZ2UtbGlzdGVuZXIgaW50ZXJmYWNlLgotICAgICAgICAKLSAgICAgICAgVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgCi0gICAgICAgIEhvbWUKLSAgICAgICAgUmVtb3RlCi0gICAgICAgIExvY2FsSG9tZQotICAgICAgICBMb2NhbAotICAgICAgICBTZXJ2aWNlRW5kcG9pbnQKLSAgICAgICAgVGltZXIKLSAgICAgICAgTWVzc2FnZUVuZHBvaW50Ci0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3RlIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsSG9tZSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRW5kcG9pbnQiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZXIiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZUVuZHBvaW50Ii8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWV0aG9kLW5hbWVUeXBlIGNvbnRhaW5zIGEgbmFtZSBvZiBhbiBlbnRlcnByaXNlCi0gICAgICAgIGJlYW4gbWV0aG9kIG9yIHRoZSBhc3RlcmlzayAoKikgY2hhcmFjdGVyLiBUaGUgYXN0ZXJpc2sgaXMKLSAgICAgICAgdXNlZCB3aGVuIHRoZSBlbGVtZW50IGRlbm90ZXMgYWxsIHRoZSBtZXRob2RzIG9mIGFuCi0gICAgICAgIGVudGVycHJpc2UgYmVhbidzIGNsaWVudCB2aWV3IGludGVyZmFjZXMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1wYXJhbXNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG1ldGhvZC1wYXJhbXNUeXBlIGRlZmluZXMgYSBsaXN0IG9mIHRoZQotICAgICAgICBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG5hbWVzIG9mIHRoZSBtZXRob2QgcGFyYW1ldGVycy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtcGFyYW0iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIG1ldGhvZC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgcHJpbWl0aXZlCi0gICAgICAgICAgICBvciBhIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZSBvZiBhIG1ldGhvZAotICAgICAgICAgICAgcGFyYW1ldGVyLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1wZXJtaXNzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUgc3BlY2lmaWVzIHRoYXQgb25lIG9yIG1vcmUKLSAgICAgICAgc2VjdXJpdHkgcm9sZXMgYXJlIGFsbG93ZWQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGVudGVycHJpc2UKLSAgICAgICAgYmVhbiBtZXRob2RzLiBUaGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlIGNvbnNpc3RzIG9mIGFuCi0gICAgICAgIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhIGxpc3Qgb2Ygc2VjdXJpdHkgcm9sZSBuYW1lcyBvciBhbgotICAgICAgICBpbmRpY2F0b3IgdG8gc3RhdGUgdGhhdCB0aGUgbWV0aG9kIGlzIHVuY2hlY2tlZCBmb3IKLSAgICAgICAgYXV0aG9yaXphdGlvbiwgYW5kIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMuCi0gICAgICAgIAotICAgICAgICBUaGUgc2VjdXJpdHkgcm9sZXMgdXNlZCBpbiB0aGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlCi0gICAgICAgIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cyBvZiB0aGUKLSAgICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBhbmQgdGhlIG1ldGhvZHMgbXVzdCBiZSBtZXRob2RzCi0gICAgICAgIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQgCi0gICAgICAgIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyb2xlLW5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuY2hlY2tlZCIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplbXB0eVR5cGUiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgdW5jaGVja2VkIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgYSBtZXRob2QgaXMKLSAgICAgICAgICAgICAgbm90IGNoZWNrZWQgZm9yIGF1dGhvcml6YXRpb24gYnkgdGhlIGNvbnRhaW5lcgotICAgICAgICAgICAgICBwcmlvciB0byBpbnZvY2F0aW9uIG9mIHRoZSBtZXRob2QuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtdWx0aXBsaWNpdHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG11bHRpcGxpY2l0eVR5cGUgZGVzY3JpYmVzIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlCi0gICAgICAgIHJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbi4KLSAgICAgICAgCi0gICAgICAgIFRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLSAgICAgICAgCi0gICAgICAgIE9uZQotICAgICAgICBNYW55Ci0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW55Ii8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBwZXJzaXN0ZW5jZS10eXBlVHlwZSBzcGVjaWZpZXMgYW4gZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZQotICAgICAgICBtYW5hZ2VtZW50IHR5cGUuCi0gICAgICAgIAotICAgICAgICBUaGUgcGVyc2lzdGVuY2UtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotICAgICAgICAKLSAgICAgICAgQmVhbgotICAgICAgICBDb250YWluZXIKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbiIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBxdWVyeVR5cGUgZGVmaW5lcyBhIGZpbmRlciBvciBzZWxlY3QKLSAgICAgICAgcXVlcnkuIEl0IGNvbnRhaW5zCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHF1ZXJ5Ci0gICAgICAgIC0gdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbmRlciBvciBzZWxlY3QKLSAgICAgICAgbWV0aG9kIGl0IGlzIHVzZWQgYnkKLSAgICAgICAgCS0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcmVzdWx0IHR5cGUgCi0gICAgICAgIAkgIG1hcHBpbmcsIGlmIHRoZSBxdWVyeSBpcyBmb3IgYSBzZWxlY3QgbWV0aG9kIAotICAgICAgICAJICBhbmQgZW50aXR5IG9iamVjdHMgYXJlIHJldHVybmVkLgotICAgICAgICAJLSB0aGUgRUpCIFFMIHF1ZXJ5IHN0cmluZyB0aGF0IGRlZmluZXMgdGhlIHF1ZXJ5LgotICAgICAgICAKLSAgICAgICAgUXVlcmllcyB0aGF0IGFyZSBleHByZXNzaWJsZSBpbiBFSkIgUUwgbXVzdCB1c2UgdGhlIGVqYi1xbAotICAgICAgICBlbGVtZW50IHRvIHNwZWNpZnkgdGhlIHF1ZXJ5LiBJZiBhIHF1ZXJ5IGlzIG5vdCBleHByZXNzaWJsZQotICAgICAgICBpbiBFSkIgUUwsIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBiZSB1c2VkIHRvCi0gICAgICAgIGRlc2NyaWJlIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIHF1ZXJ5IGFuZCB0aGUgZWpiLXFsIGVsZW1lbnQKLSAgICAgICAgc2hvdWxkIGJlIGVtcHR5LgotICAgICAgICAKLSAgICAgICAgVGhlIHJlc3VsdC10eXBlLW1hcHBpbmcgaXMgYW4gb3B0aW9uYWwgZWxlbWVudC4gSXQgY2FuIG9ubHkKLSAgICAgICAgYmUgcHJlc2VudCBpZiB0aGUgcXVlcnktbWV0aG9kIHNwZWNpZmllcyBhIHNlbGVjdCBtZXRob2QKLSAgICAgICAgdGhhdCByZXR1cm5zIGVudGl0eSBvYmplY3RzLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZQotICAgICAgICByZXN1bHQtdHlwZS1tYXBwaW5nIGVsZW1lbnQgaXMgIkxvY2FsIi4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5LW1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cXVlcnktbWV0aG9kVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc3VsdC10eXBlLW1hcHBpbmciCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1xbCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1tZXRob2RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgVGhlIHF1ZXJ5LW1ldGhvZCBzcGVjaWZpZXMgdGhlIG1ldGhvZCBmb3IgYSBmaW5kZXIgb3Igc2VsZWN0Ci0gICAgICAgIHF1ZXJ5LgotICAgICAgICAKLSAgICAgICAgVGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgZmluZGVyIG9yIHNlbGVjdAotICAgICAgICBtZXRob2QgaW4gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0gICAgICAgIAotICAgICAgICBFYWNoIG1ldGhvZC1wYXJhbSBtdXN0IGJlIGRlZmluZWQgZm9yIGEgcXVlcnktbWV0aG9kIHVzaW5nIHRoZQotICAgICAgICBtZXRob2QtcGFyYW1zIGVsZW1lbnQuCi0gICAgICAgIAotICAgICAgICBJdCBpcyB1c2VkIGJ5IHRoZSBxdWVyeS1tZXRob2QgZWxlbWVudC4gCi0gICAgICAgIAotICAgICAgICBFeGFtcGxlOgotICAgICAgICAKLSAgICAgICAgPHF1ZXJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+TWV0aG9kIGZpbmRzIGxhcmdlIG9yZGVyczwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgIAkgIDxtZXRob2QtbmFtZT5maW5kTGFyZ2VPcmRlcnM8L21ldGhvZC1uYW1lPgotICAgICAgICAJICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICA8ZWpiLXFsPgotICAgICAgICAJU0VMRUNUIE9CSkVDVChvKSBGUk9NIE9yZGVyIG8KLSAgICAgICAgCSAgV0hFUkUgby5hbW91bnQgJmd0OyAxMDAwCi0gICAgICAgIDwvZWpiLXFsPgotICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAKLSAgICAgICAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWV0aG9kLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWV0aG9kLXBhcmFtc1R5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIGRlc2lnbmF0ZXMgdGhlIHNvdXJjZSBvZiBhCi0gICAgICAgIHJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIEEKLSAgICAgICAgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSBpcyB1c2VkIGJ5Ci0gICAgICAgIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50cyB0byB1bmlxdWVseSBpZGVudGlmeSBhbgotICAgICAgICBlbnRpdHkgYmVhbi4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItbmFtZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVsYXRpb25zaGlwc1R5cGUgZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluCi0gICAgICAgIHdoaWNoIGVudGl0eSBiZWFucyB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlCi0gICAgICAgIHBhcnRpY2lwYXRlLiBUaGUgcmVsYXRpb25zaGlwc1R5cGUgY29udGFpbnMgYW4gb3B0aW9uYWwKLSAgICAgICAgZGVzY3JpcHRpb247IGFuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaAotICAgICAgICBzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItcmVsYXRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0icm9sZS1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotICAgICAgICAgICAgICByZWxhdGlvbnNoaXAgcm9sZS4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIAotICAgICAgICAgICAgICBhIHJlbGF0aW9uc2hpcCwgYnV0IGNhbiBiZSByZXVzZWQgaW4gZGlmZmVyZW50Ci0gICAgICAgICAgICAgIHJlbGF0aW9uc2hpcHMuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9Ii4vL2phdmFlZTplamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSIvPgotICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9Ii4iLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzdWx0LXR5cGUtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcmVzdWx0LXR5cGUtbWFwcGluZ1R5cGUgaXMgdXNlZCBpbiB0aGUgcXVlcnkgZWxlbWVudCB0bwotICAgICAgICBzcGVjaWZ5IHdoZXRoZXIgYW4gYWJzdHJhY3Qgc2NoZW1hIHR5cGUgcmV0dXJuZWQgYnkgYSBxdWVyeQotICAgICAgICBmb3IgYSBzZWxlY3QgbWV0aG9kIGlzIHRvIGJlIG1hcHBlZCB0byBhbiBFSkJMb2NhbE9iamVjdCBvcgotICAgICAgICBFSkJPYmplY3QgdHlwZS4KLSAgICAgICAgCi0gICAgICAgIFRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgICAgICAKLSAgICAgICAgTG9jYWwKLSAgICAgICAgUmVtb3RlCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW90ZSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktaWRlbnRpdHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHNlY3VyaXR5LWlkZW50aXR5VHlwZSBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3MKLSAgICAgICAgc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLSAgICAgICAgbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMKLSAgICAgICAgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAgICAgICAgYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2UtY2FsbGVyLWlkZW50aXR5IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVtcHR5VHlwZSI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSB1c2UtY2FsbGVyLWlkZW50aXR5IGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQKLSAgICAgICAgICAgICAgdGhlIGNhbGxlcidzIHNlY3VyaXR5IGlkZW50aXR5IGJlIHVzZWQgYXMgdGhlCi0gICAgICAgICAgICAgIHNlY3VyaXR5IGlkZW50aXR5IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQotICAgICAgICAgICAgICBlbnRlcnByaXNlIGJlYW4ncyBtZXRob2RzLgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJ1bi1hcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpydW4tYXNUeXBlIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tYmVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgc2Vzc2lvbi1iZWFuVHlwZSBkZWNsYXJlcyBhbiBzZXNzaW9uIGJlYW4uIFRoZQotICAgICAgICBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLSAgICAgICAgCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAgICAgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLSAgICAgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlIAotICAgICAgICBpY29uIGZpbGUgbmFtZQotICAgICAgICAtIGEgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuCi0gICAgICAgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0aW9uCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgbWFwcGVkLW5hbWUgZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUKLSAgICAgICAgdmVuZG9yLXNwZWNpZmljIGRlcGxveW1lbnQgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgcGh5c2ljYWwKLSAgICAgICAgam5kaS1uYW1lIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgaG9tZS9idXNpbmVzcyBpbnRlcmZhY2UuIAotICAgICAgICBUaGlzIGVsZW1lbnQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIHN1cHBvcnRlZCBieSBhbGwgCi0gICAgICAgIGltcGxlbWVudGF0aW9ucy4gQW55IHVzZSBvZiB0aGlzIGVsZW1lbnQgaXMgbm9uLXBvcnRhYmxlLgotICAgICAgICAtIHRoZSBuYW1lcyBvZiBhbGwgdGhlIHJlbW90ZSBvciBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2VzLCAKLSAgICAgICAgaWYgYW55Ci0gICAgICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgaG9tZSBhbmQKLSAgICAgICAgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueQotICAgICAgICAtIHRoZSBuYW1lcyBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgbG9jYWwgaG9tZSBhbmQKLSAgICAgICAgbG9jYWwgaW50ZXJmYWNlcywgaWYgYW55Ci0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gdGhhdCB0aGlzIGJlYW4gZXhwb3NlcyBhCi0gICAgICAgIG5vLWludGVyZmFjZSB2aWV3Ci0gICAgICAgIC0gdGhlIG5hbWUgb2YgdGhlIHNlc3Npb24gYmVhbidzIHdlYiBzZXJ2aWNlIGVuZHBvaW50Ci0gICAgICAgIGludGVyZmFjZSwgaWYgYW55Ci0gICAgICAgIC0gdGhlIHNlc3Npb24gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgICAgIC0gdGhlIHNlc3Npb24gYmVhbidzIHN0YXRlIG1hbmFnZW1lbnQgdHlwZQotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIGEgc3RhdGVmdWwgc2Vzc2lvbiBiZWFuJ3MgdGltZW91dCB2YWx1ZQotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyB0aW1lb3V0IG1ldGhvZCBmb3IKLSAgICAgICAgaGFuZGxpbmcgcHJvZ3JhbW1hdGljYWxseSBjcmVhdGVkIHRpbWVycwotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRpbWVycyB0byBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYXQKLSAgICAgICAgZGVwbG95bWVudCB0aW1lCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gdGhhdCBhIFNpbmdsZXRvbiBiZWFuIGhhcyBlYWdlcgotICAgICAgICBpbml0aWFsaXphdGlvbgotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIGEgU2luZ2xldG9uL1N0YXRlZnVsIGJlYW4ncyBjb25jdXJyZW5jeSAKLSAgICAgICAgbWFuYWdlbWVudCB0eXBlCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIG1ldGhvZCBsb2NraW5nIG1ldGFkYXRhCi0gICAgICAgIGZvciBhIFNpbmdsZXRvbiB3aXRoIGNvbnRhaW5lciBtYW5hZ2VkIGNvbmN1cnJlbmN5Ci0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIG90aGVyIFNpbmdsZXRvbiBiZWFucyBpbiB0aGUKLSAgICAgICAgYXBwbGljYXRpb24gdGhhdCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGJlYW4KLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgYXN5bmNocm9ub3VzIAotICAgICAgICBtZXRob2RzCi0gICAgICAgIC0gdGhlIG9wdGlvbmFsIHNlc3Npb24gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZS4gCi0gICAgICAgIElmIGl0IGlzIG5vdCBwcmVzZW50LCBpdCBpcyBkZWZhdWx0ZWQgdG8gQ29udGFpbmVyLgotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIGEgc3RhdGVmdWwgc2Vzc2lvbiBiZWFuJ3MgCi0gICAgICAgIGFmdGVyQmVnaW4sIGJlZm9yZUNvbXBsZXRpb24sIGFuZC9vciBhZnRlckNvbXBsZXRpb24gbWV0aG9kcwotICAgICAgICAtIGFuIG9wdGlvbmFsIGxpc3Qgb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBhbmQvb3IKLSAgICAgICAgc3VwZXJjbGFzcyBhcm91bmQtaW52b2tlIG1ldGhvZHMuCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIGFuZC9vcgotICAgICAgICBzdXBlcmNsYXNzIGFyb3VuZC10aW1lb3V0IG1ldGhvZHMuCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyAKLSAgICAgICAgZW52aXJvbm1lbnQgZW50cmllcwotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsIAotICAgICAgICBFSkIgcmVmZXJlbmNlcwotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViIAotICAgICAgICBzZXJ2aWNlIHJlZmVyZW5jZXMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSAKLSAgICAgICAgcmVmZXJlbmNlcwotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSAKLSAgICAgICAgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzIG1ldGhvZHMKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlIAotICAgICAgICBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSAKLSAgICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UgCi0gICAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMKLSAgICAgICAgCi0gICAgICAgIFRoZSBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUgc2Vuc2UKLSAgICAgICAgdGhhdCB0aGV5IGFyZSBvbWl0dGVkIHdoZW4gaWYgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUKLSAgICAgICAgZW1wdHkuCi0gICAgICAgIAotICAgICAgICBUaGUgc2VydmljZS1lbmRwb2ludCBlbGVtZW50IG1heSBvbmx5IGJlIHNwZWNpZmllZCBpZiB0aGUKLSAgICAgICAgYmVhbiBpcyBhIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4uCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaG9tZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aG9tZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3RlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyZW1vdGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsLWhvbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmxvY2FsLWhvbWVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsb2NhbFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYnVzaW5lc3MtbG9jYWwiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYnVzaW5lc3MtcmVtb3RlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsLWJlYW4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgbG9jYWwtYmVhbiBlbGVtZW50IGRlY2xhcmVzIHRoYXQgdGhpcwotICAgICAgICAgICAgc2Vzc2lvbiBiZWFuIGV4cG9zZXMgYSBuby1pbnRlcmZhY2UgTG9jYWwgY2xpZW50IHZpZXcuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50IGVsZW1lbnQgY29udGFpbnMgdGhlCi0gICAgICAgICAgICBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3Mgd2ViCi0gICAgICAgICAgICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4gVGhlIHNlcnZpY2UtZW5kcG9pbnQKLSAgICAgICAgICAgIGVsZW1lbnQgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhIHN0YXRlbGVzcwotICAgICAgICAgICAgc2Vzc2lvbiBiZWFuLiBUaGUgc3BlY2lmaWVkIGludGVyZmFjZSBtdXN0IGJlIGEKLSAgICAgICAgICAgIHZhbGlkIEpBWC1SUEMgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVqYi1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGVqYi1jbGFzcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUKLSAgICAgICAgICAgIG9mIHRoZSBiZWFuIGNsYXNzIGZvciB0aGlzIGVqYi4gIEl0IGlzIHJlcXVpcmVkIHVubGVzcwotICAgICAgICAgICAgdGhlcmUgaXMgYSBjb21wb25lbnQtZGVmaW5pbmcgYW5ub3RhdGlvbiBmb3IgdGhlIHNhbWUKLSAgICAgICAgICAgIGVqYi1uYW1lLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi10eXBlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZXNzaW9uLXR5cGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0YXRlZnVsLXRpbWVvdXQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0YXRlZnVsLXRpbWVvdXRUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRpbWVvdXQtbWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpuYW1lZC1tZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSB0aW1lb3V0LW1ldGhvZCBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWV0aG9kIHRoYXQKLSAgICAgICAgICAgIHdpbGwgcmVjZWl2ZSBjYWxsYmFja3MgZm9yIHByb2dyYW1tYXRpY2FsbHkKLSAgICAgICAgICAgIGNyZWF0ZWQgdGltZXJzLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGltZXIiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRpbWVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LW9uLXN0YXJ0dXAiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBpbml0LW9uLXN0YXJ0dXAgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCBhIFNpbmdsZXRvbgotICAgICAgICAgICAgYmVhbiBoYXMgZWFnZXIgaW5pdGlhbGl6YXRpb24uCi0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBzaW5nbGV0b24gc2Vzc2lvbgotICAgICAgICAgICAgYmVhbnMuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25jdXJyZW5jeS1tYW5hZ2VtZW50LXR5cGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmNvbmN1cnJlbmN5LW1hbmFnZW1lbnQtdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uY3VycmVudC1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmNvbmN1cnJlbnQtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBlbmRzLW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXBlbmRzLW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LW1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aW5pdC1tZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBpbml0LW1ldGhvZCBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWFwcGluZ3MgZm9yCi0gICAgICAgICAgICBFSkIgMi54IHN0eWxlIGNyZWF0ZSBtZXRob2RzIGZvciBhbiBFSkIgMy54IGJlYW4uCi0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBzdGF0ZWZ1bCAKLSAgICAgICAgICAgIHNlc3Npb24gYmVhbnMuIAotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3ZlLW1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cmVtb3ZlLW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHJlbW92ZS1tZXRob2QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1hcHBpbmdzIGZvcgotICAgICAgICAgICAgRUpCIDIueCBzdHlsZSByZW1vdmUgbWV0aG9kcyBmb3IgYW4gRUpCIDMueCBiZWFuLgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3Igc3RhdGVmdWwgCi0gICAgICAgICAgICBzZXNzaW9uIGJlYW5zLiAKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzeW5jLW1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YXN5bmMtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cmFuc2FjdGlvbi10eXBlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZnRlci1iZWdpbi1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm5hbWVkLW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmVmb3JlLWNvbXBsZXRpb24tbWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpuYW1lZC1tZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFmdGVyLWNvbXBsZXRpb24tbWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpuYW1lZC1tZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFyb3VuZC1pbnZva2UiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmFyb3VuZC1pbnZva2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFyb3VuZC10aW1lb3V0IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphcm91bmQtdGltZW91dFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtYWN0aXZhdGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmxpZmVjeWNsZS1jYWxsYmFja1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBhc3NpdmF0ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlLXJlZiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktcm9sZS1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LWlkZW50aXR5IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1pZGVudGl0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgc2Vzc2lvbi10eXBlVHlwZSBkZXNjcmliZXMgd2hldGhlciB0aGUgc2Vzc2lvbiBiZWFuIGlzIGEKLSAgICAgICAgc2luZ2xldG9uLCBzdGF0ZWZ1bCBvciBzdGF0ZWxlc3Mgc2Vzc2lvbi4gSXQgaXMgdXNlZCBieQotICAgICAgICBzZXNzaW9uLXR5cGUgZWxlbWVudHMuCi0gICAgICAgIAotICAgICAgICBUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHRocmVlIGZvbGxvd2luZzoKLSAgICAgICAgCi0gICAgICAgIFNpbmdsZXRvbgotICAgICAgICBTdGF0ZWZ1bAotICAgICAgICBTdGF0ZWxlc3MKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xldG9uIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlZnVsIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlbGVzcyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RhdGVmdWwtdGltZW91dFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgc3RhdGVmdWwtdGltZW91dFR5cGUgcmVwcmVzZW50cyB0aGUgYW1vdW50IG9mIHRpbWUKLSAgICAgICAgYSBzdGF0ZWZ1bCBzZXNzaW9uIGJlYW4gY2FuIGJlIGlkbGUobm90IHJlY2VpdmUgYW55IGNsaWVudAotICAgICAgICBpbnZvY2F0aW9ucykgYmVmb3JlIGl0IGlzIGVsaWdpYmxlIGZvciByZW1vdmFsIGJ5IHRoZSBjb250YWluZXIuCi0gICAgICAgIAotICAgICAgICBBIHRpbWVvdXQgdmFsdWUgb2YgMCBtZWFucyB0aGUgYmVhbiBpcyBpbW1lZGlhdGVseSBlbGlnaWJsZSBmb3IgcmVtb3ZhbC4KLSAgICAgICAgCi0gICAgICAgIEEgdGltZW91dCB2YWx1ZSBvZiAtMSBtZWFucyB0aGUgYmVhbiB3aWxsIG5ldmVyIGJlIHJlbW92ZWQgZHVlIHRvIHRpbWVvdXQuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGltZW91dCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkSW50ZWdlclR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bml0IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0aW1lLXVuaXQtdHlwZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZS11bml0LXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHRpbWUtdW5pdC10eXBlVHlwZSByZXByZXNlbnRzIGEgdGltZSBkdXJhdGlvbiBhdCBhIGdpdmVuCi0gICAgICAgIHVuaXQgb2YgZ3JhbnVsYXJpdHkuICAKLSAgICAgICAgCi0gICAgICAgIFRoZSB0aW1lIHVuaXQgdHlwZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIDoKLSAgICAgICAgCi0gICAgICAgIERheXMKLSAgICAgICAgSG91cnMKLSAgICAgICAgTWludXRlcwotICAgICAgICBTZWNvbmRzCi0gICAgICAgIE1pbGxpc2Vjb25kcwotICAgICAgICBNaWNyb3NlY29uZHMKLSAgICAgICAgTmFub3NlY29uZHMKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF5cyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VycyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW51dGVzIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZHMiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsbGlzZWNvbmRzIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pY3Jvc2Vjb25kcyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW5vc2Vjb25kcyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZXItc2NoZWR1bGVUeXBlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY29uZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbnV0ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhvdXIiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXktb2YtbW9udGgiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtb250aCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRheS1vZi13ZWVrIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieWVhciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgdGltZXJUeXBlIHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4gdGltZXIuICBFYWNoCi0gICAgICAgIHRpbWVyIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSB0aGUgY29udGFpbmVyIHVwb24KLSAgICAgICAgZGVwbG95bWVudC4gIFRpbWVyIGNhbGxiYWNrcyBvY2N1ciBiYXNlZCBvbiB0aGUgCi0gICAgICAgIHNjaGVkdWxlIGF0dHJpYnV0ZXMuICBBbGwgY2FsbGJhY2tzIGFyZSBtYWRlIHRvIHRoZQotICAgICAgICB0aW1lb3V0LW1ldGhvZCBhc3NvY2lhdGVkIHdpdGggdGhlIHRpbWVyLiAgCi0gICAgICAgIAotICAgICAgICBBIHRpbWVyIGNhbiBoYXZlIGFuIG9wdGlvbmFsIHN0YXJ0IGFuZC9vciBlbmQgZGF0ZS4gSWYKLSAgICAgICAgYSBzdGFydCBkYXRlIGlzIHNwZWNpZmllZCwgaXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZQotICAgICAgICBhc3NvY2lhdGVkIHRpbWVyIHNjaGVkdWxlIHN1Y2ggdGhhdCBhbnkgbWF0Y2hpbmcKLSAgICAgICAgZXhwaXJhdGlvbnMgcHJpb3IgdG8gdGhlIHN0YXJ0IHRpbWUgd2lsbCBub3Qgb2NjdXIuCi0gICAgICAgIExpa2V3aXNlLCBubyBtYXRjaGluZyBleHBpcmF0aW9ucyB3aWxsIG9jY3VyIGFmdGVyIGFueQotICAgICAgICBlbmQgZGF0ZS4gICBTdGFydC9FbmQgZGF0ZXMgYXJlIHNwZWNpZmllZCB1c2luZyB0aGUKLSAgICAgICAgWE1MIFNjaGVtYSBkYXRlVGltZSB0eXBlLCB3aGljaCBmb2xsb3dzIHRoZSBJU08tODYwMQotICAgICAgICBzdGFuZGFyZCBmb3IgZGF0ZShhbmQgb3B0aW9uYWwgdGltZS13aXRoaW4tdGhlLWRheSkgCi0gICAgICAgIHJlcHJlc2VudGF0aW9uLgotICAgICAgICAKLSAgICAgICAgQW4gb3B0aW9uYWwgZmxhZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHdoZXRoZXIKLSAgICAgICAgdGhpcyB0aW1lciBoYXMgcGVyc2lzdGVudCh0cnVlKSBkZWxpdmVyeSBzZW1hbnRpY3Mgb3IKLSAgICAgICAgbm9uLXBlcnNpc3RlbnQoZmFsc2UpIGRlbGl2ZXJ5IHNlbWFudGljcy4gIElmIG5vdCBzcGVjaWZpZWQsCi0gICAgICAgIHRoZSB2YWx1ZSBkZWZhdWx0cyB0byBwZXJzaXN0ZW50KHRydWUpLgotICAgICAgICAKLSAgICAgICAgQSB0aW1lIHpvbmUgY2FuIG9wdGlvbmFsbHkgYmUgYXNzb2NpYXRlZCB3aXRoIGEgdGltZXIuCi0gICAgICAgIElmIHNwZWNpZmllZCwgdGhlIHRpbWVyJ3Mgc2NoZWR1bGUgaXMgZXZhbHVhdGVkIGluIHRoZSBjb250ZXh0Ci0gICAgICAgIG9mIHRoYXQgdGltZSB6b25lLCByZWdhcmRsZXNzIG9mIHRoZSBkZWZhdWx0IHRpbWUgem9uZSBpbiB3aGljaAotICAgICAgICB0aGUgY29udGFpbmVyIGlzIGV4ZWN1dGluZy4gICBUaW1lIHpvbmVzIGFyZSBzcGVjaWZpZWQgYXMgYW4KLSAgICAgICAgSUQgc3RyaW5nLiAgVGhlIHNldCBvZiByZXF1aXJlZCB0aW1lIHpvbmUgSURzIGlzIGRlZmluZWQgYnkKLSAgICAgICAgdGhlIFpvbmUgTmFtZShUWikgY29sdW1uIG9mIHRoZSBwdWJsaWMgZG9tYWluIHpvbmVpbmZvIGRhdGFiYXNlLgotICAgICAgICAKLSAgICAgICAgQW4gb3B0aW9uYWwgaW5mbyBzdHJpbmcgY2FuIGJlIGFzc2lnbmVkIHRvIHRoZSB0aW1lciBhbmQgCi0gICAgICAgIHJldHJpZXZlZCBhdCBydW50aW1lIHRocm91Z2ggdGhlIFRpbWVyLmdldEluZm8oKSBtZXRob2QuCi0gICAgICAgIAotICAgICAgICBUaGUgdGltZXJUeXBlIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBvbiBzdGF0ZWxlc3Mgc2Vzc2lvbgotICAgICAgICBiZWFucywgc2luZ2xldG9uIHNlc3Npb24gYmVhbnMsIGFuZCBtZXNzYWdlLWRyaXZlbiBiZWFucy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVkdWxlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0aW1lci1zY2hlZHVsZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdGFydCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpkYXRlVGltZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0aW1lb3V0LW1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bmFtZWQtbWV0aG9kVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbnQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRpbWV6b25lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5mbyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFucy1hdHRyaWJ1dGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHRyYW5zLWF0dHJpYnV0ZVR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QKLSAgICAgICAgbWFuYWdlIHRoZSB0cmFuc2FjdGlvbiBib3VuZGFyaWVzIHdoZW4gZGVsZWdhdGluZyBhIG1ldGhvZCAKLSAgICAgICAgaW52b2NhdGlvbiB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcyBtZXRob2QuIAotICAgICAgICAKLSAgICAgICAgVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6IAotICAgICAgICAKLSAgICAgICAgTm90U3VwcG9ydGVkIAotICAgICAgICBTdXBwb3J0cyAKLSAgICAgICAgUmVxdWlyZWQgIAotICAgICAgICBSZXF1aXJlc05ldyAKLSAgICAgICAgTWFuZGF0b3J5IAotICAgICAgICBOZXZlciAKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90U3VwcG9ydGVkIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBvcnRzIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVkIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVzTmV3Ii8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmRhdG9yeSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXZlciIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNhY3Rpb24tdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgdHJhbnNhY3Rpb24tdHlwZVR5cGUgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbidzCi0gICAgICAgIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZS4KLSAgICAgICAgCi0gICAgICAgIFRoZSB0cmFuc2FjdGlvbi10eXBlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotICAgICAgICAKLSAgICAgICAgQmVhbgotICAgICAgICBDb250YWluZXIKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbiIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2ZhY2VsZXQtdGFnbGliXzFfMC5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2ZhY2VsZXQtdGFnbGliXzFfMC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMzZkMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9mYWNlbGV0LXRhZ2xpYl8xXzAuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPCEtLQotIENvcHlyaWdodCAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBMaWNlbnNlZCB1bmRlciB0aGUgQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSwKLSB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gCi0gICBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC8KLSAgIAotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAKLSBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gCi0gJElkOiBmYWNlbGV0LXRhZ2xpYl8xXzAuZHRkLHYgMS4xIDIwMTAvMDIvMTAgMDI6MTQ6NTEgZGF2aWRfd2lsbGlhbXMgRXhwICQKLS0tPgotCi08IUVMRU1FTlQgZmFjZWxldC10YWdsaWIgKGxpYnJhcnktY2xhc3N8KG5hbWVzcGFjZSwodGFnfGZ1bmN0aW9uKSspKT4KLTwhQVRUTElTVCBmYWNlbGV0LXRhZ2xpYiB4bWxucyBDREFUQSAjRklYRUQgImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNGL0ZhY2VsZXQiPgotPCFFTEVNRU5UIG5hbWVzcGFjZSAoI1BDREFUQSk+Ci08IUVMRU1FTlQgbGlicmFyeS1jbGFzcyAoI1BDREFUQSk+Ci08IUVMRU1FTlQgdGFnICh0YWctbmFtZSwoaGFuZGxlci1jbGFzc3xjb21wb25lbnR8Y29udmVydGVyfHZhbGlkYXRvcnxzb3VyY2UpKT4KLTwhRUxFTUVOVCB0YWctbmFtZSAoI1BDREFUQSk+Ci08IUVMRU1FTlQgaGFuZGxlci1jbGFzcyAoI1BDREFUQSk+Ci08IUVMRU1FTlQgY29tcG9uZW50IChjb21wb25lbnQtdHlwZSxyZW5kZXJlci10eXBlPyxoYW5kbGVyLWNsYXNzPyk+Ci08IUVMRU1FTlQgY29tcG9uZW50LXR5cGUgKCNQQ0RBVEEpPgotPCFFTEVNRU5UIHJlbmRlcmVyLXR5cGUgKCNQQ0RBVEEpPgotPCFFTEVNRU5UIGNvbnZlcnRlciAoY29udmVydGVyLWlkLCBoYW5kbGVyLWNsYXNzPyk+Ci08IUVMRU1FTlQgY29udmVydGVyLWlkICgjUENEQVRBKT4KLTwhRUxFTUVOVCB2YWxpZGF0b3IgKHZhbGlkYXRvci1pZCwgaGFuZGxlci1jbGFzcz8pPgotPCFFTEVNRU5UIHZhbGlkYXRvci1pZCAoI1BDREFUQSk+Ci08IUVMRU1FTlQgc291cmNlICgjUENEQVRBKT4KLTwhRUxFTUVOVCBmdW5jdGlvbiAoZnVuY3Rpb24tbmFtZSxmdW5jdGlvbi1jbGFzcyxmdW5jdGlvbi1zaWduYXR1cmUpPgotPCFFTEVNRU5UIGZ1bmN0aW9uLW5hbWUgKCNQQ0RBVEEpPgotPCFFTEVNRU5UIGZ1bmN0aW9uLWNsYXNzICgjUENEQVRBKT4KLTwhRUxFTUVOVCBmdW5jdGlvbi1zaWduYXR1cmUgKCNQQ0RBVEEpPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qMmVlXzFfNC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2oyZWVfMV80LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIyMzM0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2oyZWVfMV80LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2MDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEKLSAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICB2ZXJzaW9uPSIxLjQiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWoyZWVfMV80LnhzZHMJMS40MyAwMy8wOS8xNgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi0gICAgICBSb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi0gICAgICByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiB0aGUgY29tbW9uCi1zaGFyZWFibGUgc2NoZW1hKHMpIG9mIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBzaG91bGQgYmUKLWludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY29udGV4dCB0aGV5IGFyZSBpbmNsdWRlZDoKLQotRGVwbG95bWVudCBDb21wb25lbnQgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgIGoyZWUgYXBwbGljYXRpb247Ci0gICAgYXBwbGljYXRpb24gY2xpZW50OwotICAgIHdlYiBhcHBsaWNhdGlvbjsKLSAgICBlbnRlcnByaXNlIGJlYW47Ci0gICAgcmVzb3VyY2UgYWRhcHRlcjsKLQotRGVwbG95bWVudCBGaWxlIG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICBlYXIgZmlsZTsKLSAgICB3YXIgZmlsZTsKLSAgICBqYXIgZmlsZTsKLSAgICByYXIgZmlsZTsKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0JICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0KLQkiaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL3hzZC9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmdyb3VwIG5hbWU9ImRlc2NyaXB0aW9uR3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgZ3JvdXAga2VlcHMgdGhlIHVzYWdlIG9mIHRoZSBjb250YWluZWQgZGVzY3JpcHRpb24gcmVsYXRlZAotCWVsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KLQotCUFsbCBlbGVtZW50cyBtYXkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgbGFuZ3VhZ2VzLAotCXRvIHN1cHBvcnQgbG9jYWxpemF0aW9uIG9mIHRoZSBjb250ZW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0JCSAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlc2NyaXB0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGRlc2NyaXB0aW9uIHR5cGUgaXMgdXNlZCBieSBhIGRlc2NyaXB0aW9uIGVsZW1lbnQgdG8KLQlwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZWxlbWVudHMKLQl0aGF0IHVzZSB0aGlzIHR5cGUgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlCi0JRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUgZmlsZSBwcm9kdWNlciB3YW50cwotCXRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0JRGVwbG95bWVudCBGaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZQotCXRvb2xzIHVzZWQgYnkgc3VjaCBhIERlcGxveW1lbnQgRmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkKLQl0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0Ci0JY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLgotCi0JVGhlIGxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlCi0JZGVzY3JpcHRpb24gaXMgcHJvdmlkZWQgaW4uIFRoZSBkZWZhdWx0IHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iajJlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGV3ZXktdmVyc2lvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBkZWZpbmVzIGEgZGV3ZXkgZGVjaW1hbCB3aGljaCBpcyB1c2VkCi0JdG8gZGVzY3JpYmUgdmVyc2lvbnMgb2YgZG9jdW1lbnRzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgIDx4c2Q6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNwbGF5LW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBkaXNwbGF5LW5hbWUgdHlwZSBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZAotCSAgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzLiBJdCBpcyB1c2VkIGJ5IGRpc3BsYXktbmFtZQotCSAgZWxlbWVudHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KLQotCSAgRXhhbXBsZToKLQotCSAgLi4uCi0JICAgICA8ZGlzcGxheS1uYW1lIHhtbDpsYW5nPSJlbiI+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+Ci0KLQkgIFRoZSB2YWx1ZSBvZiB0aGUgeG1sOmxhbmcgYXR0cmlidXRlIGlzICJlbiIgKEVuZ2xpc2gpIGJ5IGRlZmF1bHQuCi0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1saW5rVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgZWpiLWxpbmtUeXBlIGlzIHVzZWQgYnkgZWpiLWxpbmsKLQkgIGVsZW1lbnRzIGluIHRoZSBlamItcmVmIG9yIGVqYi1sb2NhbC1yZWYgZWxlbWVudHMgdG8gc3BlY2lmeQotCSAgdGhhdCBhbiBFSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBlbnRlcnByaXNlIGJlYW4uCi0KLQkgIFRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbgotCSAgZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIGVqYi1qYXIgZmlsZSBvciBpbiBhbm90aGVyIGVqYi1qYXIKLQkgIGZpbGUgaW4gdGhlIHNhbWUgSjJFRSBhcHBsaWNhdGlvbiB1bml0LgotCi0JICBBbHRlcm5hdGl2ZWx5LCB0aGUgbmFtZSBpbiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtYXkgYmUKLQkgIGNvbXBvc2VkIG9mIGEgcGF0aCBuYW1lIHNwZWNpZnlpbmcgdGhlIGVqYi1qYXIgY29udGFpbmluZyB0aGUKLQkgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuIHdpdGggdGhlIGVqYi1uYW1lIG9mIHRoZSB0YXJnZXQKLQkgIGJlYW4gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tIHRoZSBwYXRoIG5hbWUgYnkgIiMiLiAgVGhlCi0JICBwYXRoIG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIERlcGxveW1lbnQgRmlsZSBjb250YWluaW5nCi0JICBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0IGlzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlCi0JICBiZWFuLiAgVGhpcyBhbGxvd3MgbXVsdGlwbGUgZW50ZXJwcmlzZSBiZWFucyB3aXRoIHRoZSBzYW1lCi0JICBlamItbmFtZSB0byBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgotCi0JICBFeGFtcGxlczoKLQotCSAgICAgIDxlamItbGluaz5FbXBsb3llZVJlY29yZDwvZWpiLWxpbms+Ci0KLQkgICAgICA8ZWpiLWxpbms+Li4vcHJvZHVjdHMvcHJvZHVjdC5qYXIjUHJvZHVjdEVKQjwvZWpiLWxpbms+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLWxvY2FsLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlamItbG9jYWwtcmVmVHlwZSBpcyB1c2VkIGJ5IGVqYi1sb2NhbC1yZWYgZWxlbWVudHMgZm9yCi0JdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGxvY2FsCi0JaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkgICAgLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIERlcGxveW1lbnQKLQkgICAgICBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4KLQkgICAgLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLQkgICAgLSB0aGUgZXhwZWN0ZWQgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlcyBvZiB0aGUKLQkgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotCSAgICAtIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlCi0JICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLXJlZi1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtdHlwZSIKLQkJICAgdHlwZT0iajJlZTplamItcmVmLXR5cGVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwtaG9tZSIKLQkJICAgdHlwZT0iajJlZTpsb2NhbC1ob21lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsIgotCQkgICB0eXBlPSJqMmVlOmxvY2FsVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1saW5rIgotCQkgICB0eXBlPSJqMmVlOmVqYi1saW5rVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlZi1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0JICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotCSAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlCi0JICBEZXBsb3ltZW50IENvbXBvbmVudC4KLQotCSAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JICBFeGFtcGxlOgotCi0JICA8ZWpiLXJlZi1uYW1lPmVqYi9QYXlyb2xsPC9lamItcmVmLW5hbWU+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpqbmRpLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWYtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlamItcmVmLXR5cGVUeXBlIGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZQotCXJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLgotCi0JVGhlIGVqYi1yZWYtdHlwZSBkZXNpZ25hdGVzIGEgdmFsdWUKLQl0aGF0IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQkgICAgRW50aXR5Ci0JICAgIFNlc3Npb24KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0eSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlc3Npb24iLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVqYi1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLXJlZiBlbGVtZW50cyBmb3IgdGhlCi0JZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4gVGhlCi0JZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCSAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZgotCSAgICAgIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UKLQkgICAgICBiZWFuCi0JICAgIC0gdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0JICAgIC0gdGhlIGV4cGVjdGVkIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzIG9mIHRoZSByZWZlcmVuY2VkCi0JICAgICAgZW50ZXJwcmlzZSBiZWFuCi0JICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUKLQkgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtbmFtZSIKLQkJICAgdHlwZT0iajJlZTplamItcmVmLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi10eXBlIgotCQkgICB0eXBlPSJqMmVlOmVqYi1yZWYtdHlwZVR5cGUiLz4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhvbWUiCi0JCSAgIHR5cGU9ImoyZWU6aG9tZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUiCi0JCSAgIHR5cGU9ImoyZWU6cmVtb3RlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1saW5rIgotCQkgICB0eXBlPSJqMmVlOmVqYi1saW5rVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1wdHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgaXMgdXNlZCB0byBkZXNpZ25hdGUgYW4gZW1wdHkKLQllbGVtZW50IHdoZW4gdXNlZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mIHRoZQotCSAgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUKLQkgIGFwcGxpY2F0aW9uJ3MgY29kZS4KLQotCSAgVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlOgotCi0JICAgICAgamF2YS5sYW5nLkJvb2xlYW4KLQkgICAgICBqYXZhLmxhbmcuQnl0ZQotCSAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXIKLQkgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICAgICAgamF2YS5sYW5nLlNob3J0Ci0JICAgICAgamF2YS5sYW5nLkludGVnZXIKLQkgICAgICBqYXZhLmxhbmcuTG9uZwotCSAgICAgIGphdmEubGFuZy5GbG9hdAotCSAgICAgIGphdmEubGFuZy5Eb3VibGUKLQotCSAgRXhhbXBsZToKLQotCSAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkJvb2xlYW4iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQnl0ZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5DaGFyYWN0ZXIiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLlNob3J0Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkludGVnZXIiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuTG9uZyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5GbG9hdCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Eb3VibGUiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnYtZW50cnlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZW52LWVudHJ5VHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYW4gYXBwbGljYXRpb24ncwotCWVudmlyb25tZW50IGVudHJ5LiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLQlkZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4KLQlvcHRpb25hbCB2YWx1ZS4gIElmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCwgb25lIG11c3QgYmUKLQlzdXBwbGllZCBkdXJpbmcgZGVwbG95bWVudC4KLQotCUl0IGlzIHVzZWQgYnkgZW52LWVudHJ5IGVsZW1lbnRzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmpuZGktbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lCi0JICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKLQkgICAgICBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEKLQkgICAgICBEZXBsb3ltZW50IENvbXBvbmVudC4gVGhlIHVuaXF1ZW5lc3MKLQkgICAgICBjb25zdHJhaW50cyBtdXN0IGJlIGRlZmluZWQgd2l0aGluIHRoZSBkZWNsYXJlZAotCSAgICAgIGNvbnRleHQuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JICAgICAgPGVudi1lbnRyeS1uYW1lPm1pbkFtb3VudDwvZW52LWVudHJ5LW5hbWU+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktdHlwZSIKLQkJICAgdHlwZT0iajJlZTplbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlIi8+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktdmFsdWUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIGVudi1lbnRyeS12YWx1ZSBkZXNpZ25hdGVzIHRoZSB2YWx1ZSBvZiBhCi0JICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gVGhlIHZhbHVlCi0JICAgICAgbXVzdCBiZSBhIFN0cmluZyB0aGF0IGlzIHZhbGlkIGZvciB0aGUKLQkgICAgICBjb25zdHJ1Y3RvciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgdGhhdCB0YWtlcyBhCi0JICAgICAgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIsIG9yIGZvciBqYXZhLmxhbmcuQ2hhcmFjdGVyLAotCSAgICAgIGEgc2luZ2xlIGNoYXJhY3Rlci4KLQotCSAgICAgIEV4YW1wbGU6Ci0KLQkgICAgICA8ZW52LWVudHJ5LXZhbHVlPjEwMC4wMDwvZW52LWVudHJ5LXZhbHVlPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBkZXNpZ25hdGUgdGhlIG5hbWUgb2YgYQotCUphdmEgY2xhc3Mgb3IgaW50ZXJmYWNlLiAgVGhlIG5hbWUgaXMgaW4gdGhlIGZvcm0gb2YgYQotCSJiaW5hcnkgbmFtZSIsIGFzIGRlZmluZWQgaW4gdGhlIEpMUy4gIFRoaXMgaXMgdGhlIGZvcm0KLQlvZiBuYW1lIHVzZWQgaW4gQ2xhc3MuZm9yTmFtZSgpLiAgVG9vbHMgdGhhdCBuZWVkIHRoZQotCWNhbm9uaWNhbCBuYW1lICh0aGUgbmFtZSB1c2VkIGluIHNvdXJjZSBjb2RlKSB3aWxsIG5lZWQKLQl0byBjb252ZXJ0IHRoaXMgYmluYXJ5IG5hbWUgdG8gdGhlIGNhbm9uaWNhbCBuYW1lLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJnZW5lcmljLWJvb2xlYW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgZGVmaW5lcyBmb3VyIGRpZmZlcmVudCB2YWx1ZXMgd2hpY2ggY2FuIGRlc2lnbmF0ZQotCWJvb2xlYW4gdmFsdWVzLiBUaGlzIGluY2x1ZGVzIHZhbHVlcyB5ZXMgYW5kIG5vIHdoaWNoIGFyZQotCW5vdCBkZXNpZ25hdGVkIGJ5IHhzZDpib29sZWFuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0cnVlIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmFsc2UiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ5ZXMiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJubyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImhvbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBob21lVHlwZSBkZWZpbmVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZgotCSAgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgICAgICA8aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvaG9tZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWNvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBpY29uIHR5cGUgY29udGFpbnMgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50cwotCXRoYXQgc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGxhcmdlIEdJRiBvcgotCUpQRUcgaWNvbiBpbWFnZXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHBhcmVudCBlbGVtZW50IGluIGEKLQlHVUkgdG9vbC4KLQotCVRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUKLQlpY29uIGZpbGUgbmFtZXMgYXJlIHByb3ZpZGVkIGluLiBJdHMgdmFsdWUgaXMgImVuIiAoRW5nbGlzaCkKLQlieSBkZWZhdWx0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNtYWxsLWljb24iIHR5cGU9ImoyZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi0JICAgICAgY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZQotCSAgICAgIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgRGVwbG95bWVudAotCSAgICAgIENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZS4KLQotCSAgICAgIFRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi0JICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JICAgICAgPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxhcmdlLWljb24iIHR5cGU9ImoyZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi0JICAgICAgY29udGFpbmluZyBhIGxhcmdlCi0JICAgICAgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZQotCSAgICAgIHBhdGggd2l0aGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQKLQkgICAgICBGaWxlLgotCi0JICAgICAgVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLQkgICAgICBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotCSAgICAgIEV4YW1wbGU6Ci0KLQkgICAgICA8bGFyZ2UtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGc8L2xhcmdlLWljb24+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEtaWRlbnRpZmllclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBqYXZhLWlkZW50aWZpZXJUeXBlIGRlZmluZXMgYSBKYXZhIGlkZW50aWZpZXIuCi0JVGhlIHVzZXJzIG9mIHRoaXMgdHlwZSBzaG91bGQgZnVydGhlciB2ZXJpZnkgdGhhdAotCXRoZSBjb250ZW50IGRvZXMgbm90IGNvbnRhaW4gSmF2YSByZXNlcnZlZCBrZXl3b3Jkcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6cGF0dGVybiB2YWx1ZT0iKCR8X3xccHtMfSkoXHB7TH18XHB7TmR9fF98JCkqIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBpcyBhIGdlbmVyaWMgdHlwZSB0aGF0IGRlc2lnbmF0ZXMgYSBKYXZhIHByaW1pdGl2ZQotCXR5cGUgb3IgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgaW50ZXJmYWNlL3R5cGUsCi0Jb3IgYW4gYXJyYXkgb2Ygc3VjaCB0eXBlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6cGF0dGVybiB2YWx1ZT0iW15ccHtafV0qIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam5kaS1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGpuZGktbmFtZVR5cGUgdHlwZSBkZXNpZ25hdGVzIGEgSk5ESSBuYW1lIGluIHRoZQotCURlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCWphdmE6Y29tcC9lbnYgY29udGV4dC4gIEEgSk5ESSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLQlEZXBsb3ltZW50IENvbXBvbmVudC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Z3JvdXAgbmFtZT0iam5kaUVudmlyb25tZW50UmVmc0dyb3VwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIGdyb3VwIGtlZXBzIHRoZSB1c2FnZSBvZiB0aGUgY29udGFpbmVkIEpOREkgZW52aXJvbm1lbnQKLQlyZWZlcmVuY2UgZWxlbWVudHMgY29uc2lzdGVudCBhY3Jvc3MgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnkiCi0JCSAgIHR5cGU9ImoyZWU6ZW52LWVudHJ5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbG9jYWwtcmVmIgotCQkgICB0eXBlPSJqMmVlOmVqYi1sb2NhbC1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpzZXJ2aWNlLXJlZkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtcmVmIgotCQkgICB0eXBlPSJqMmVlOnJlc291cmNlLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotCQkgICB0eXBlPSJqMmVlOnJlc291cmNlLWVudi1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiCi0JCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmdyb3VwPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaXN0ZW5lclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsaXN0ZW5lclR5cGUgaW5kaWNhdGVzIHRoZSBkZXBsb3ltZW50IHByb3BlcnRpZXMgZm9yIGEgd2ViCi0JYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaXN0ZW5lci1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGxpc3RlbmVyLWNsYXNzIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGFzcyBpbiB0aGUKLQkgICAgYXBwbGljYXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViCi0JICAgIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uIFRoZSB2YWx1ZSBpcyB0aGUgZnVsbHkKLQkgICAgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgbGlzdGVuZXIgY2xhc3MuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWwtaG9tZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2NhbC1ob21lVHlwZSBkZWZpbmVzIHRoZSBmdWxseS1xdWFsaWZpZWQKLQluYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUgaW50ZXJmYWNlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9jYWxUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi0JZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaW50ZXJmYWNlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUgaXMgdXNlZCB0byBsaW5rIGEgbWVzc2FnZQotCWRlc3RpbmF0aW9uIHJlZmVyZW5jZSBvciBtZXNzYWdlLWRyaXZlbiBiZWFuIHRvIGEgbWVzc2FnZQotCWRlc3RpbmF0aW9uLgotCi0JVGhlIEFzc2VtYmxlciBzZXRzIHRoZSB2YWx1ZSB0byByZWZsZWN0IHRoZSBmbG93IG9mIG1lc3NhZ2VzCi0JYmV0d2VlbiBwcm9kdWNlcnMgYW5kIGNvbnN1bWVycyBpbiB0aGUgYXBwbGljYXRpb24uCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIG9mIGEgbWVzc2FnZQotCWRlc3RpbmF0aW9uIGluIHRoZSBzYW1lIERlcGxveW1lbnQgRmlsZSBvciBpbiBhbm90aGVyCi0JRGVwbG95bWVudCBGaWxlIGluIHRoZSBzYW1lIEoyRUUgYXBwbGljYXRpb24gdW5pdC4KLQotCUFsdGVybmF0aXZlbHksIHRoZSB2YWx1ZSBtYXkgYmUgY29tcG9zZWQgb2YgYSBwYXRoIG5hbWUKLQlzcGVjaWZ5aW5nIGEgRGVwbG95bWVudCBGaWxlIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZWQKLQltZXNzYWdlIGRlc3RpbmF0aW9uIHdpdGggdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBvZiB0aGUKLQlkZXN0aW5hdGlvbiBhcHBlbmRlZCBhbmQgc2VwYXJhdGVkIGZyb20gdGhlIHBhdGggbmFtZSBieQotCSIjIi4gVGhlIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgRGVwbG95bWVudCBGaWxlCi0JY29udGFpbmluZyBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0IGlzIHJlZmVyZW5jaW5nIHRoZQotCW1lc3NhZ2UgZGVzdGluYXRpb24uICBUaGlzIGFsbG93cyBtdWx0aXBsZSBtZXNzYWdlCi0JZGVzdGluYXRpb25zIHdpdGggdGhlIHNhbWUgbmFtZSB0byBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotCSAgb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYSBtZXNzYWdlIGRlc3RpbmF0aW9uCi0JICBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0JICBlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6Ci0KLQkJICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JCSAgLSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZQotCQkgIC0gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gdHlwZQotCQkgIC0gYSBzcGVjaWZpY2F0aW9uIGFzIHRvIHdoZXRoZXIgdGhlCi0JCSAgICBkZXN0aW5hdGlvbiBpcyB1c2VkIGZvcgotCQkgICAgY29uc3VtaW5nIG9yIHByb2R1Y2luZyBtZXNzYWdlcywgb3IgYm90aAotCQkgIC0gYSBsaW5rIHRvIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uCi0KLQkgIEV4YW1wbGVzOgotCi0JICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWY+Ci0JCSAgPG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWU+am1zL1N0b2NrUXVldWUKLQkJICA8L21lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWU+Ci0JCSAgPG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT5qYXZheC5qbXMuUXVldWUKLQkJICA8L21lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT4KLQkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZT5Db25zdW1lcwotCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZT4KLQkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rPkNvcnBvcmF0ZVN0b2NrcwotCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rPgotCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZj4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmpuZGktbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcwotCSAgICB0aGUgbmFtZSBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMKLQkgICAgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotCSAgICBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKLQkgICAgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZQotCSAgICB1bmlxdWUgd2l0aGluIGFuIGVqYi1qYXIgKGZvciBlbnRlcnByaXNlIGJlYW5zKSBvciBhCi0JICAgIERlcGxveW1lbnQgRmlsZSAoZm9yIG90aGVycykuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlIgotCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlIgotCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rIgotCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLQotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSBzcGVjaWZpZXMgdGhlIHR5cGUgb2YKLQkgIHRoZSBkZXN0aW5hdGlvbi4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBKYXZhIGludGVyZmFjZQotCSAgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlc3RpbmF0aW9uLgotCi0JICBFeGFtcGxlOgotCi0JICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlCi0JICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIHNwZWNpZmllcyB0aGUgdXNlIG9mIHRoZQotCW1lc3NhZ2UgZGVzdGluYXRpb24gaW5kaWNhdGVkIGJ5IHRoZSByZWZlcmVuY2UuICBUaGUgdmFsdWUKLQlpbmRpY2F0ZXMgd2hldGhlciBtZXNzYWdlcyBhcmUgY29uc3VtZWQgZnJvbSB0aGUgbWVzc2FnZQotCWRlc3RpbmF0aW9uLCBwcm9kdWNlZCBmb3IgdGhlIGRlc3RpbmF0aW9uLCBvciBib3RoLiAgVGhlCi0JQXNzZW1ibGVyIG1ha2VzIHVzZSBvZiB0aGlzIGluZm9ybWF0aW9uIGluIGxpbmtpbmcgcHJvZHVjZXJzCi0Jb2YgYSBkZXN0aW5hdGlvbiB3aXRoIGl0cyBjb25zdW1lcnMuCi0KLQlUaGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2UgZWxlbWVudCBtdXN0IGJlCi0Jb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JICAgIENvbnN1bWVzCi0JICAgIFByb2R1Y2VzCi0JICAgIENvbnN1bWVzUHJvZHVjZXMKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVzIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjZXMiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lc1Byb2R1Y2VzIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIHNwZWNpZmllcyBhIG1lc3NhZ2UKLQkgIGRlc3RpbmF0aW9uLiBUaGUgbG9naWNhbCBkZXN0aW5hdGlvbiBkZXNjcmliZWQgYnkgdGhpcwotCSAgZWxlbWVudCBpcyBtYXBwZWQgdG8gYSBwaHlzaWNhbCBkZXN0aW5hdGlvbiBieSB0aGUgRGVwbG95ZXIuCi0KLQkgIFRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIGVsZW1lbnQgY29udGFpbnM6Ci0KLQkJICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JCSAgLSBhbiBvcHRpb25hbCBkaXNwbGF5LW5hbWUKLQkJICAtIGFuIG9wdGlvbmFsIGljb24KLQkJICAtIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lIHdoaWNoIG11c3QgYmUgdW5pcXVlCi0JCSAgICBhbW9uZyBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWVzIHdpdGhpbiB0aGUgc2FtZQotCQkgICAgRGVwbG95bWVudCBGaWxlLgotCi0JICBFeGFtcGxlOgotCi0JICA8bWVzc2FnZS1kZXN0aW5hdGlvbj4KLQkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPkNvcnBvcmF0ZVN0b2NrcwotCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPgotCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGEKLQkgICAgbmFtZSBmb3IgYSBtZXNzYWdlIGRlc3RpbmF0aW9uLiAgVGhpcyBuYW1lIG11c3QgYmUKLQkgICAgdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiBtZXNzYWdlIGRlc3RpbmF0aW9ucwotCSAgICB3aXRoaW4gdGhlIERlcGxveW1lbnQgRmlsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJhbS12YWx1ZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBpcyBhIGdlbmVyYWwgdHlwZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlY2xhcmUKLQlwYXJhbWV0ZXIvdmFsdWUgbGlzdHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0tbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgcGFyYW1ldGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0tdmFsdWUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwYXJhbS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhCi0JICAgIHBhcmFtZXRlci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXRoVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBkZXNpZ25hdGUgZWl0aGVyIGEgcmVsYXRpdmUKLQlwYXRoIG9yIGFuIGFic29sdXRlIHBhdGggc3RhcnRpbmcgd2l0aCBhICIvIi4KLQotCUluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0Jc2FtZSBEZXBsb3ltZW50IEZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIERlcGxveW1lbnQgRmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwKLQl0aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mCi0JdGhlIERlcGxveW1lbnQgRmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzCi0JYXJlIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZW1vdGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUKLQkgIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLgotCi0JICBFeGFtcGxlOgotCi0JICAgICAgPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcy1hdXRoVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJlcy1hdXRoVHlwZSBzcGVjaWZpZXMgd2hldGhlciB0aGUgRGVwbG95bWVudCBDb21wb25lbnQKLQljb2RlIHNpZ25zIG9uIHByb2dyYW1tYXRpY2FsbHkgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIsIG9yCi0Jd2hldGhlciB0aGUgQ29udGFpbmVyIHdpbGwgc2lnbiBvbiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlcgotCW9uIGJlaGFsZiBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQuIEluIHRoZSBsYXR0ZXIgY2FzZSwKLQl0aGUgQ29udGFpbmVyIHVzZXMgaW5mb3JtYXRpb24gdGhhdCBpcyBzdXBwbGllZCBieSB0aGUKLQlEZXBsb3llci4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICBBcHBsaWNhdGlvbgotCSAgICBDb250YWluZXIKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzLXNoYXJpbmctc2NvcGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcmVzLXNoYXJpbmctc2NvcGUgdHlwZSBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucwotCW9idGFpbmVkIHRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbgotCWZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZSBzaGFyZWQuIFRoZSB2YWx1ZSwgaWYgc3BlY2lmaWVkLAotCW11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JICAgIFNoYXJlYWJsZQotCSAgICBVbnNoYXJlYWJsZQotCi0JVGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVhYmxlIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zaGFyZWFibGUiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgcmVzb3VyY2UtZW52LXJlZlR5cGUgaXMgdXNlZCB0byBkZWZpbmUKLQkgIHJlc291cmNlLWVudi10eXBlIGVsZW1lbnRzLiAgSXQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhCi0JICBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0Ci0JICBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncwotCSAgZW52aXJvbm1lbnQuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlCi0JICByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgbmFtZSwgYW5kIGFuIGluZGljYXRpb24gb2YKLQkgIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZSBleHBlY3RlZCBieSB0aGUKLQkgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxyZXNvdXJjZS1lbnYtcmVmPgotCSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+am1zL1N0b2NrUXVldWUKLQkgICAgICA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLQkgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmF4Lmptcy5RdWV1ZQotCSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotCSAgPC9yZXNvdXJjZS1lbnYtcmVmPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmpuZGktbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotCSAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotCSAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QKLQkgICAgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZi10eXBlIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlCi0JICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlLiAgSXQgaXMgdGhlCi0JICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBsYW5ndWFnZSBjbGFzcyBvcgotCSAgICBpbnRlcmZhY2UuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXNvdXJjZS1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSByZXNvdXJjZS1yZWZUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQotCSAgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0Ci0JICBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIG1hbmFnZXIKLQkgIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwgdGhlIGluZGljYXRpb24gb2YgdGhlCi0JICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlIGV4cGVjdGVkIGJ5IHRoZQotCSAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZSwgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRpb24KLQkgIChBcHBsaWNhdGlvbiBvciBDb250YWluZXIpLCBhbmQgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZgotCSAgdGhlIHNoYXJlYWJpbGl0eSBvZiBjb25uZWN0aW9ucyBvYnRhaW5lZCBmcm9tIHRoZSByZXNvdXJjZQotCSAgKFNoYXJlYWJsZSBvciBVbnNoYXJlYWJsZSkuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxyZXNvdXJjZS1yZWY+Ci0JICAgICAgPHJlcy1yZWYtbmFtZT5qZGJjL0VtcGxveWVlQXBwREI8L3Jlcy1yZWYtbmFtZT4KLQkgICAgICA8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPgotCSAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotCSAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotCSAgPC9yZXNvdXJjZS1yZWY+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXMtcmVmLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6am5kaS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuCi0JICAgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0JICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgRmlsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy10eXBlIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcmVzLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGEKLQkgICAgc291cmNlLiBUaGUgdHlwZSBpcyBzcGVjaWZpZWQgYnkgdGhlIGZ1bGx5IHF1YWxpZmllZAotCSAgICBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yIGludGVyZmFjZQotCSAgICBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGF0YSBzb3VyY2UuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXMtYXV0aCIKLQkJICAgdHlwZT0iajJlZTpyZXMtYXV0aFR5cGUiLz4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1zaGFyaW5nLXNjb3BlIgotCQkgICB0eXBlPSJqMmVlOnJlcy1zaGFyaW5nLXNjb3BlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm9sZS1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJvbGUtbmFtZVR5cGUgZGVzaWduYXRlcyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLQlUaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGEgdG9rZW4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icnVuLWFzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJ1bi1hc1R5cGUgc3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUKLQl1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIGEgY29tcG9uZW50LiBJdCBjb250YWlucyBhbgotCW9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpyb2xlLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VjdXJpdHktcm9sZS1yZWZUeXBlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhCi0Jc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgaW4gYSBjb21wb25lbnQncyBvciBhCi0JRGVwbG95bWVudCBDb21wb25lbnQncyBjb2RlLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4KLQlvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZSB1c2VkIGluIHRoZQotCWNvZGUsIGFuZCBhbiBvcHRpb25hbCBsaW5rIHRvIGEgc2VjdXJpdHkgcm9sZS4gSWYgdGhlCi0Jc2VjdXJpdHkgcm9sZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgRGVwbG95ZXIgbXVzdCBjaG9vc2UgYW4KLQlhcHByb3ByaWF0ZSBzZWN1cml0eSByb2xlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpyb2xlLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHZhbHVlIG9mIHRoZSByb2xlLW5hbWUgZWxlbWVudCBtdXN0IGJlIHRoZSBTdHJpbmcgdXNlZAotCSAgICBhcyB0aGUgcGFyYW1ldGVyIHRvIHRoZQotCSAgICBFSkJDb250ZXh0LmlzQ2FsbGVySW5Sb2xlKFN0cmluZyByb2xlTmFtZSkgbWV0aG9kIG9yIHRoZQotCSAgICBIdHRwU2VydmxldFJlcXVlc3QuaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSBtZXRob2QuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLWxpbmsiCi0JCSAgIHR5cGU9ImoyZWU6cm9sZS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZAotCSAgICBzZWN1cml0eSByb2xlLiBUaGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBjb250YWluCi0JICAgIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUKLQkgICAgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1yb2xlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgc2VjdXJpdHktcm9sZVR5cGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBzZWN1cml0eQotCSAgcm9sZS4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlCi0JICBzZWN1cml0eSByb2xlLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZS4KLQotCSAgRXhhbXBsZToKLQotCSAgICAgIDxzZWN1cml0eS1yb2xlPgotCSAgICAgIDxkZXNjcmlwdGlvbj4KLQkJICBUaGlzIHJvbGUgaW5jbHVkZXMgYWxsIGVtcGxveWVlcyB3aG8gYXJlIGF1dGhvcml6ZWQKLQkJICB0byBhY2Nlc3MgdGhlIGVtcGxveWVlIHNlcnZpY2UgYXBwbGljYXRpb24uCi0JICAgICAgPC9kZXNjcmlwdGlvbj4KLQkgICAgICA8cm9sZS1uYW1lPmVtcGxveWVlPC9yb2xlLW5hbWU+Ci0JICAgICAgPC9zZWN1cml0eS1yb2xlPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgaXMgYSBzcGVjaWFsIHN0cmluZyBkYXRhdHlwZSB0aGF0IGlzIGRlZmluZWQgYnkgSjJFRSBhcwotCWEgYmFzZSB0eXBlIGZvciBkZWZpbmluZyBjb2xsYXBzZWQgc3RyaW5ncy4gV2hlbiBzY2hlbWFzCi0JcmVxdWlyZSB0cmFpbGluZy9sZWFkaW5nIHNwYWNlIGVsaW1pbmF0aW9uIGFzIHdlbGwgYXMKLQljb2xsYXBzaW5nIHRoZSBleGlzdGluZyB3aGl0ZXNwYWNlLCB0aGlzIGJhc2UgdHlwZSBtYXkgYmUKLQl1c2VkLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnRva2VuIj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRydWUtZmFsc2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHNpbXBsZSB0eXBlIGRlc2lnbmF0ZXMgYSBib29sZWFuIHdpdGggb25seSB0d28KLQlwZXJtaXNzaWJsZSB2YWx1ZXMKLQotCS0gdHJ1ZQotCS0gZmFsc2UKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTp4c2RCb29sZWFuVHlwZSI+Ci0JPHhzZDpwYXR0ZXJuIHZhbHVlPSIodHJ1ZXxmYWxzZSkiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1cmwtcGF0dGVyblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB1cmwtcGF0dGVyblR5cGUgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLgotCUl0IG11c3QgZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMS4yIG9mIHRoZQotCVNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24uIFRoaXMgcGF0dGVybiBpcyBhc3N1bWVkIHRvIGJlIGluCi0JVVJMLWRlY29kZWQgZm9ybSBhbmQgbXVzdCBub3QgY29udGFpbiBDUigjeEQpIG9yIExGKCN4QSkuCi0JSWYgaXQgY29udGFpbnMgdGhvc2UgY2hhcmFjdGVycywgdGhlIGNvbnRhaW5lciBtdXN0IGluZm9ybQotCXRoZSBkZXZlbG9wZXIgd2l0aCBhIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UuCi0JVGhlIGNvbnRhaW5lciBtdXN0IHByZXNlcnZlIGFsbCBjaGFyYWN0ZXJzIGluY2x1ZGluZyB3aGl0ZXNwYWNlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkQW55VVJJVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOmFueVVSSS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDphbnlVUkkiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkQm9vbGVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpib29sZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmJvb2xlYW4iPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkSW50ZWdlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDppbnRlZ2VyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmludGVnZXIiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkTk1UT0tFTlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpOTVRPS0VOLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOm5vbk5lZ2F0aXZlSW50ZWdlci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpub25OZWdhdGl2ZUludGVnZXIiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkUG9zaXRpdmVJbnRlZ2VyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOnBvc2l0aXZlSW50ZWdlci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpwb3NpdGl2ZUludGVnZXIiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkUU5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6UU5hbWUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6UU5hbWUiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkU3RyaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOnN0cmluZy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2oyZWVfamF4cnBjX21hcHBpbmdfMV8xLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTIxOTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotCSAgICB2ZXJzaW9uPSIxLjEiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWoyZWVfamF4cnBjX21hcHBpbmdfMV8xLnhzZHMJMS4xMSAwOS8wMy8wMwotCi0gICAgICBCYXNlZCBvbiBqMmVlX2pheHJwY19tYXBwaW5nXzFfMC5kdGQsIExhc3QgdXBkYXRlZDogMDkvMTkvMjAwMiAxMDoyNgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi0gICAgICBSb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi0gICAgICByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBWwotCi0JVGhlIGVsZW1lbnQgZGVzY3JpYmVzIHRoZSBKYXZhIG1hcHBpbmcgdG8gYSBrbm93biBXU0RMIGRvY3VtZW50LgotCi0JSXQgY29udGFpbnMgdGhlIG1hcHBpbmcgYmV0d2VlbiBwYWNrYWdlIG5hbWVzIGFuZCBYTUwgbmFtZXNwYWNlcywKLQlXU0RMIHJvb3QgdHlwZXMgYW5kIEphdmEgYXJ0aWZhY3RzLCBhbmQgdGhlIHNldCBvZiBtYXBwaW5ncyBmb3IKLQlzZXJ2aWNlcy4KLQotCUFsbCBqYXZhLXdzZGwtbWFwcGluZyBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUgdGhlCi0Jc2NoZW1hIGJ5IHVzaW5nIHRoZSBKMkVFIG5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkgdXNpbmcgdGhlCi0JdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDxqYXZhLXdzZGwtbWFwcGluZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCQlodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfamF4cnBjX21hcHBpbmdfMV8xLnhzZCIKLQkgICAgICB2ZXJzaW9uPSIxLjEiPgotCSAgICAgIC4uLgotCSAgICA8L2phdmEtd3NkbC1tYXBwaW5nPgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0JdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSjJFRQotCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLQlodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfamF4cnBjX21hcHBpbmdfMV8xLnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImphdmEtd3NkbC1tYXBwaW5nIiB0eXBlPSJqMmVlOmphdmEtd3NkbC1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBpcyB0aGUgcm9vdCBvZiB0aGUgamF2YS13c2RsLW1hcHBpbmcgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnN0cnVjdG9yLXBhcmFtZXRlci1vcmRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjb25zdHJ1Y3Rvci1wYXJhbWV0ZXItb3JkZXIgZWxlbWVudCBkZWZpbmVzIHRoZSBvcmRlcgotCXRoYXQgY29tcGxleFR5cGUgZWxlbWVudCB2YWx1ZXMgYXJlIGFwcGxpZWQgdG8gYSBKYXZhCi0JZXhjZXB0aW9uIGNvbnN0cnVjdG9yLiBFbGVtZW50IG5hbWVzIGFyZSBzcGVjaWZpZWQgZm9yIGVhY2gKLQlwYXJhbWV0ZXIgb2YgdGhlIGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcgZWxlbWVudCBuYW1lcyBvZgotCWluaGVyaXRlZCB0eXBlcyBpZiBuZWNlc3NhcnkuCi0KLQlVc2VkIGluOiBleGNlcHRpb24tbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbGVtZW50LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVsZW1lbnQtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIG5hbWUgb2YgYSBjb21wbGV4VHlwZQotCSAgICBlbGVtZW50IG5hbWUgYXR0cmlidXRlIHZhbHVlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV4Y2VwdGlvbi1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGV4Y2VwdGlvbi1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgbWFwcGluZyBiZXR3ZWVuIHRoZQotCXNlcnZpY2Ugc3BlY2lmaWMgZXhjZXB0aW9uIHR5cGVzIGFuZCB3c2RsIGZhdWx0cyBhbmQKLQlTT0FQIGhlYWRlcmZhdWx0cy4KLQotCVRoaXMgZWxlbWVudCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZQotCW1hcHBpbmcgYmV0d2VlbiBhIG1ldGhvZCBhbmQgYW4gb3BlcmF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoZQotCW1hcHBpbmcgY29udGV4dC4KLQotCVVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBleGNlcHRpb24tdHlwZSBlbGVtZW50IGRlZmluZXMgSmF2YSB0eXBlIG9mIHRoZSBleGNlcHRpb24uCi0JICAgIEl0IG1heSBiZSBhIHNlcnZpY2Ugc3BlY2lmaWMgZXhjZXB0aW9uLgotCi0JICAgIEl0IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLW1lc3NhZ2UiCi0JCSAgIHR5cGU9ImoyZWU6d3NkbC1tZXNzYWdlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtbWVzc2FnZS1wYXJ0LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6d3NkbC1tZXNzYWdlLXBhcnQtbmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGVsZW1lbnQgaXMgcmVxdWlyZWQgb25seQotICAgICAgICAgICAgd2hlbiB0aGUgbWVzc2FnZSByZWZlcmVuY2VkIGJ5IHRoZSB3c2RsLW1lc3NhZ2UgZWxlbWVudAotICAgICAgICAgICAgaGFzIG1vcmUgdGhhbiBvbmUgcGFydC4KLQotICAgICAgICAgICAgVGhpcyBvbmx5IG9jY3VycyB3aGVuIG11bHRpcGxlIGhlYWRlcmZhdWx0cyB1c2UgdGhlCi0gICAgICAgICAgICBzYW1lIG1lc3NhZ2UuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uc3RydWN0b3ItcGFyYW1ldGVyLW9yZGVyIgotCQkgICB0eXBlPSJqMmVlOmNvbnN0cnVjdG9yLXBhcmFtZXRlci1vcmRlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS13c2RsLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWxlbWVudCBkZXNjcmliZXMgdGhlIEphdmEgbWFwcGluZyB0byBhIGtub3duIFdTREwgZG9jdW1lbnQuCi0KLQlJdCBjb250YWlucyB0aGUgbWFwcGluZyBiZXR3ZWVuIHBhY2thZ2UgbmFtZXMgYW5kIFhNTCBuYW1lc3BhY2VzLAotCVdTREwgcm9vdCB0eXBlcyBhbmQgSmF2YSBhcnRpZmFjdHMsIGFuZCB0aGUgc2V0IG9mIG1hcHBpbmdzIGZvcgotCXNlcnZpY2VzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrYWdlLW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6cGFja2FnZS1tYXBwaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImphdmEteG1sLXR5cGUtbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTpqYXZhLXhtbC10eXBlLW1hcHBpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uLW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6ZXhjZXB0aW9uLW1hcHBpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1pbnRlcmZhY2UtbWFwcGluZyIKLQkJICAgICB0eXBlPSJqMmVlOnNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmdUeXBlIgotCQkgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nIgotCQkgICAgIHR5cGU9ImoyZWU6c2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZ1R5cGUiCi0JCSAgICAgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotCQkgICB0eXBlPSJqMmVlOmRld2V5LXZlcnNpb25UeXBlIgotCQkgICBmaXhlZD0iMS4xIgotCQkgICB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgMS4xLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEteG1sLXR5cGUtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBqYXZhLXhtbC10eXBlLW1hcHBpbmcgZWxlbWVudCBjb250YWlucyBhIGphdmEtdHlwZSB0aGF0IGlzIHRoZQotCWZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzLCBwcmltaXRpdmUgdHlwZSwgb3IgYXJyYXkKLQl0eXBlLCBRTmFtZSBvZiB0aGUgWE1MIHJvb3QgdHlwZSBvciBhbm9ueW1vdXMgdHlwZSwgdGhlIFdTREwgdHlwZQotCXNjb3BlIHRoZSBRTmFtZSBhcHBsaWVzIHRvIGFuZCB0aGUgc2V0IG9mIHZhcmlhYmxlIG1hcHBpbmdzIGZvcgotCWVhY2ggcHVibGljIHZhcmlhYmxlIHdpdGhpbiB0aGUgSmF2YSBjbGFzcy4KLQotCVVzZWQgaW46IGphdmEtd3NkbC1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImphdmEtdHlwZSIKLQkJICAgdHlwZT0iajJlZTpqYXZhLXR5cGVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGphdmEtdHlwZSBlbGVtZW50IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZgotCSAgICBhIEphdmEgY2xhc3MsIHByaW1pdGl2ZSwgb3IgYXJyYXkgdHlwZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDxjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb290LXR5cGUtcW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkUU5hbWVUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJvb3QtdHlwZS1xbmFtZSBpZGVudGlmaWVzIHRoZSBXU0RMIFFOYW1lIG9mIGFuIFhNTCB0eXBlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW5vbnltb3VzLXR5cGUtcW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGFub255bW91cy10eXBlLXFuYW1lIGlkZW50aWZpZXMgdGhlIFdTREwgUU5hbWUgb2YgYW4KLQkgICAgICBhbm9ueW1vdXMgWE1MIHR5cGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L2Nob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxbmFtZS1zY29wZSIKLQkJICAgdHlwZT0iajJlZTpxbmFtZS1zY29wZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZS1tYXBwaW5nIgotCQkgICB0eXBlPSJqMmVlOnZhcmlhYmxlLW1hcHBpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIGJldHdlZW4gYQotCUphdmEgbWV0aG9kIHBhcmFtZXRlcnMgYW5kIGEgd3NkbC1tZXNzYWdlLgotCi0JVXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbS1wb3NpdGlvbiIKLQkJICAgdHlwZT0iajJlZTp4c2ROb25OZWdhdGl2ZUludGVnZXJUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBhcmFtLXBvc2l0aW9uIGVsZW1lbnQgZGVmaW5lcyB0aGUgcG9zaXRpb24gb2YgYQotCSAgICBwYXJhbWV0ZXIgd2l0aGluIGEgSmF2YSBtZXRob2QuICBJdCBtdXN0IGJlIGFuIGludGVnZXIKLQkgICAgc3RhcnRpbmcgZnJvbSAwLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6amF2YS10eXBlVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwYXJhbS10eXBlIGVsZW1lbnQgZGVmaW5lcyB0aGUgZnVsbHkgcXVhbGlmaWVkCi0JICAgIGNsYXNzIG5hbWUgb2YgYSBKYXZhIGNsYXNzLCBwcmltaXRpdmUsIG9yIGFycmF5IHR5cGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1tZXNzYWdlLW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6d3NkbC1tZXNzYWdlLW1hcHBpbmdUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFja2FnZS1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHBhY2thZ2UtbWFwcGluZyBpbmRpY2F0ZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiBqYXZhLXBhY2thZ2UtbmFtZQotCWFuZCBYTUwgbmFtZXNwYWNlIGluIHRoZSBXU0RMIGRvY3VtZW50LgotCi0JVXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2FnZS10eXBlIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcGFja2FnZS10eXBlIGluZGljYXRlcyB0aGUgSmF2YSBwYWNrYWdlIG5hbWUuIEl0IG11c3QgYmUgYSBmdWxseQotCSAgICBxdWFsaWZpZWQgcGFja2FnZSBuYW1lLCBldmVuIHRob3VnaCB0aGUgWE1MIHNjaGVtYSB0eXBlIGlzCi0JICAgIGZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZXNwYWNlVVJJIgotCQkgICB0eXBlPSJqMmVlOnhzZEFueVVSSVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbmFtZXNwYWNlVVJJIGVsZW1lbnQgaW5kaWNhdGVzIGEgVVJJLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcmFtZXRlci1tb2RlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHBhcmFtZXRlci1tb2RlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbW9kZSBvZiB0aGUgcGFyYW1ldGVyLgotCUl0IGNhbiBoYXZlIG9ubHkgdGhyZWUgdmFsdWVzLCBJTiwgT1VULCBJTk9VVC4KLQotCVVzZWQgaW46IGphdmEteG1sLXR5cGUtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTk9VVCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvcnQtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBwb3J0LW1hcHBpbmcgZGVmaW5lcyB0aGUgbWFwcGluZyBvZiB0aGUgV1NETCBwb3J0IG5hbWUgYXR0cmlidXRlCi0JdG8gdGhlIEphdmEgbmFtZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBHZW5lcmF0ZWQgU2VydmljZSBJbnRlcmZhY2UKLQltZXRob2QgZ2V0e2phdmEtbmFtZX0uCi0KLQlVc2VkIGluOiBzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcG9ydC1tYXBwaW5nIGRlZmluZXMgdGhlIG1hcHBpbmcgb2YgdGhlIFdTREwgcG9ydCBuYW1lCi0JICAgIGF0dHJpYnV0ZSB0byB0aGUgSmF2YSBuYW1lIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIEdlbmVyYXRlZAotCSAgICBTZXJ2aWNlIEludGVyZmFjZSBtZXRob2QgZ2V0e2phdmEtbmFtZX0uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF2YS1wb3J0LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGphdmEtcG9ydC1uYW1lIGVsZW1lbnQgaXMgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHBvcnQKLQkgICAgbmFtZSBpbiBKYXZhLiAgSXQgaXMgdXNlZCBpbiBnZW5lcmF0aW5nIHRoZSBHZW5lcmF0ZWQKLQkgICAgU2VydmljZSBJbnRlcmZhY2UgbWV0aG9kIGdldHtqYXZhLXBvcnQtbmFtZX0uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icW5hbWUtc2NvcGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcW5hbWUtc2NvcGUgZWxlbWVudHMgc2NvcGVzIHRoZSByZWZlcmVuY2Ugb2YgYSBRTmFtZSB0byB0aGUgV1NETAotCWVsZW1lbnQgdHlwZSBpdCBhcHBsaWVzIHRvLiBUaGUgdmFsdWUgb2YgcW5hbWUtc2NvcGUgbWF5IGJlCi0Jc2ltcGxlVHlwZSwgY29tcGxleFR5cGUsIG9yIGVsZW1lbnQuCi0KLQlVc2VkIGluOiBqYXZhLXhtbC10eXBlLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNpbXBsZVR5cGUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wbGV4VHlwZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmcgZGVmaW5lcyBhIHR1cGxlCi0JdG8gc3BlY2lmeSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXMgdG8KLQlXU0RMIHBvcnQgdHlwZXMgYW5kIFdTREwgYmluZGluZ3MuCi0KLQlBbiBpbnRlcmZhY2UgbWF5IGJlIG1hcHBlZCB0byBhIHBvcnQtdHlwZSBhbmQgYmluZGluZyBtdWx0aXBsZQotCXRpbWVzLiBUaGlzIGhhcHBlbnMgcmFyZWx5LgotCi0JVXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEKLQkgICAgdHlwZSBmb3IgdGhlIGVuZHBvaW50IGludGVyZmFjZS4gVGhlIG5hbWUgbXVzdCBiZSBhIGZ1bGx5Ci0JICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtcG9ydC10eXBlIgotCQkgICB0eXBlPSJqMmVlOnhzZFFOYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3c2RsLXBvcnQtdHlwZSBlbGVtZW50IGRlZmluZXMgdGhlIHdzZGwgcG9ydCB0eXBlCi0JICAgIGJ5IGEgUU5BTUUgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyAgdGhlIHBvcnQgdHlwZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLWJpbmRpbmciCi0JCSAgIHR5cGU9ImoyZWU6eHNkUU5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdzZGwtYmluZGluZyBlbGVtZW50IGRlZmluZXMgdGhlIHdzZGwgYmluZGluZwotCSAgICBieSBhIFFOQU1FIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgIHRoZSBiaW5kaW5nLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6c2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIG9mCi0JSmF2YSBtZXRob2RzIHRvIG9wZXJhdGlvbnMgKHdoaWNoIGFyZSBub3QgdW5pcXVlbHkgcXVhbGlmaWVkIGJ5Ci0JcW5hbWVzKS4KLQotCVRoZSB3c2RsLW9wZXJhdGlvbiBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZQotCXBvcnRUeXBlIGFuZCBiaW5kaW5nIGluIHdoaWNoIHRoaXMgZGVmaW5pdGlvbiBpcyBlbWJlZGRlZCB3aXRoaW4uCi0JU2VlIHRoZSBkZWZpbml0aW9ucyBmb3Igc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZyBhbmQKLQlzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nIHRvIGFjcXVpcmUgdGhlIHByb3BlciBjb250ZXh0LiAgVGhlCi0Jd3JhcHBlZC1lbGVtZW50IGluZGljYXRvciBzaG91bGQgb25seSBiZSBzcGVjaWZpZWQgd2hlbiBhIFdTREwKLQltZXNzYWdlIHdyYXBzIGFuIGVsZW1lbnQgdHlwZS4gIFRoZSB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nIGlzCi0Jbm90IHNwZWNpZmllZCBmb3Igb25lLXdheSBvcGVyYXRpb25zLgotCi0JVXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqYXZhLW1ldGhvZC1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBqYXZhLW1ldGhvZC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgbmFtZSBvZiBhIEphdmEgbWV0aG9kCi0JICAgIHdpdGhpbiBhbiBpbnRlcmZhY2UuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1vcGVyYXRpb24iCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdzZGwtb3BlcmF0aW9uIGVsZW1lbnQgZGVmaW5lcyBhbiBvcGVyYXRpb24gd2l0aGluIGEgV1NETAotCSAgICBkb2N1bWVudC4gIEl0IG11c3QgYmUgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIGEgcG9ydCB0eXBlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndyYXBwZWQtZWxlbWVudCIKLQkJICAgdHlwZT0iajJlZTplbXB0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdyYXBwZWQtZWxlbWVudCBlbGVtZW50IGlzIGRlZmluZWQgd2hlbiBhIFdTREwgbWVzc2FnZQotCSAgICB3aXRoIGEgc2luZ2xlIHBhcnQgaXMgdXNlZCB0byB3cmFwIGFuIGVsZW1lbnQgdHlwZSBhbmQgdGhlCi0JICAgIGVsZW1lbnQncyBuYW1lIG1hdGNoZXMgdGhlIG9wZXJhdGlvbiBuYW1lLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nIgotCQkgICB0eXBlPSJqMmVlOm1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6d3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VydmljZS1pbnRlcmZhY2UtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgaG93IGEgSmF2YSB0eXBlIGZvcgotCXRoZSBzZXJ2aWNlIGludGVyZmFjZSBtYXBzIHRvIGEgV1NETCBzZXJ2aWNlLgotCi0JVXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSBmb3IgdGhlIHNlcnZpY2UuCi0JICAgIEZvciBzdGF0aWMgc2VydmljZXMsIGl0IGlzIGphdmF4LnhtbC5ycGMuU2VydmljZSBpbnRlcmZhY2UuIEZvcgotCSAgICBnZW5lcmF0ZWQgc2VydmljZSwgaXQgd291bGQgYmUgdGhlIGdlbmVyYXRlZCBpbnRlcmZhY2UgbmFtZS4KLQotCSAgICBUaGUgbmFtZSBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1zZXJ2aWNlLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkUU5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdzZGwtc2VydmljZS1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NkbCBzZXJ2aWNlIG5hbWUKLQkgICAgYnkgYSBRTkFNRSB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzICB0aGUgc2VydmljZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6cG9ydC1tYXBwaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdmFyaWFibGUtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gYQotCUphdmEgY2xhc3MgZGF0YSBtZW1iZXIgb3IgSmF2YUJlYW5zIHByb3BlcnR5IHRvIGFuIFhNTCBlbGVtZW50Ci0Jb3IgYXR0cmlidXRlIG5hbWUgb2YgYW4gWE1MIHJvb3QgdHlwZS4gSWYgdGhlIGRhdGEtbWVtYmVyCi0JZWxlbWVudCBpcyBwcmVzZW50LCB0aGUgSmF2YSB2YXJpYWJsZSBuYW1lIGlzIGEgcHVibGljIGRhdGEKLQltZW1iZXIuICBJZiBkYXRhLW1lbWJlcglpcyBub3QgcHJlc2VudCwgdGhlIEphdmEgdmFyaWFibGUgbmFtZQotCWlzIGEgSmF2YUJlYW5zIHByb3BlcnR5LgotCi0JVXNlZCBpbjogamF2YS14bWwtdHlwZS1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImphdmEtdmFyaWFibGUtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgamF2YS12YXJpYWJsZS1uYW1lIGRlZmluZXMgdGhlIG5hbWUgb2YgYSBwdWJsaWMgZGF0YSBtZW1iZXIgb3IKLQkgICAgSmF2YUJlYW5zIHByb3BlcnR5IHdpdGhpbiBhIEphdmEgY2xhc3MuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YS1tZW1iZXIiCi0JCSAgIHR5cGU9ImoyZWU6ZW1wdHlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBkYXRhLW1lbWJlciBlbGVtZW50IGlzIGEgYm9vbGVhbiBpbmRpY2F0b3IgdGhhdCBhIEphdmEKLQkgICAgdmFyaWFibGUgaXMgYSBwdWJsaWMgZGF0YSBtZW1iZXIgYW5kIG5vdCBhIEphdmFCZWFucyBwcm9wZXJ0eS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLWF0dHJpYnV0ZS1uYW1lIgotCQkgICAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHhtbC1hdHRyaWJ1dGUtbmFtZSBlbGVtZW50IGRlZmluZXMgbmFtZSBhdHRyaWJ1dGUgdmFsdWUKLQkgICAgICBvZiBhIFdTREwgYXR0cmlidXRlIGVsZW1lbnQgd2l0aGluIGEgcm9vdCB0eXBlLiAgVGhlIHZhbHVlCi0JICAgICAgb2YgYW4geG1sLWF0dHJpYnV0ZS1uYW1lIGVsZW1lbnQgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YKLQkgICAgICB0aGUgcmVmIGF0dHJpYnV0ZSBpZiBtYXBwaW5nIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudC1uYW1lIgotCQkgICAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHhtbC1lbGVtZW50LW5hbWUgZWxlbWVudCBkZWZpbmVzIG5hbWUgYXR0cmlidXRlIHZhbHVlIG9mCi0JICAgICAgYSBXU0RMIGVsZW1lbnQgd2l0aGluIGEgcm9vdCB0eXBlLiAgVGhlIHZhbHVlIG9mIGFuCi0JICAgICAgeG1sLWVsZW1lbnQtbmFtZSBlbGVtZW50IG11c3QgbWF0Y2ggdGhlIHZhbHVlIG9mIHRoZSByZWYKLQkgICAgICBhdHRyaWJ1dGUgaWYgbWFwcGluZyBhbiBlbGVtZW50IHJlZmVyZW5jZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLXdpbGRjYXJkIgotCQkgICAgIHR5cGU9ImoyZWU6ZW1wdHlUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHhtbC13aWxkY2FyZCBlbGVtZW50IGFzc29jaWF0ZXMgdGhlIHZhcmlhYmxlLW1hcHBpbmcgd2l0aAotCSAgICAgIGFuIHhzZDphbnkgZWxlbWVudCB3aXRoaW4gYSByb290IHR5cGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3NkbC1tZXNzYWdlLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd3NkbC1tZXNzYWdlLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIHRvIGEKLQlzcGVjaWZpYyBtZXNzYWdlIGFuZCBpdHMgcGFydC4gVG9nZXRoZXIgdGhleSBkZWZpbmUgdW5pcXVlbHkKLQl0aGUgbWFwcGluZyBmb3IgYSBzcGVjaWZpYyBwYXJhbWV0ZXIuIFBhcnRzIHdpdGhpbiBhIG1lc3NhZ2UKLQljb250ZXh0IGFyZSB1bmlxdWVseSBpZGVudGlmaWVkIHdpdGggdGhlaXIgbmFtZXMuCi0KLQlUaGUgcGFyYW1ldGVyLW1vZGUgaXMgZGVmaW5lZCBieSB0aGUgbWFwcGluZyB0byBpbmRpY2F0ZQotCXdoZXRoZXIgdGhlIG1hcHBpbmcgd2lsbCBiZSBJTiwgT1VULCBvciBJTk9VVC4uICBUaGUgcHJlc2VuY2UKLQlvZiB0aGUgc29hcC1oZWFkZXIgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFyYW1ldGVyIGlzCi0JbWFwcGVkIHRvIGEgc29hcCBoZWFkZXIgb25seS4gIFdoZW4gYWJzZW50LCBpdCBtZWFucyB0aGF0IHRoZQotCXdzZGwtbWVzc2FnZSBpcyBtYXBwZWQgdG8gYSBKYXZhIHBhcmFtZXRlci4gVGhlIHNvYXAgaGVhZGVycwotCWFyZSBpbnRlcnByZXRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgcHJvdmlkZWQgaW4gdGhlIG1hcHBpbmcuCi0KLQlVc2VkIGluOiBtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLW1lc3NhZ2UiCi0JCSAgIHR5cGU9ImoyZWU6d3NkbC1tZXNzYWdlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtbWVzc2FnZS1wYXJ0LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6d3NkbC1tZXNzYWdlLXBhcnQtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXItbW9kZSIKLQkJICAgdHlwZT0iajJlZTpwYXJhbWV0ZXItbW9kZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb2FwLWhlYWRlciIKLQkJICAgdHlwZT0iajJlZTplbXB0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNvYXAtaGVhZGVyIGVsZW1lbnQgaXMgYSBib29sZWFuIGVsZW1lbnQgaW5kaWNhdGluZyB0aGF0Ci0JICAgIGEgcGFyYW1ldGVyIGlzIG1hcHBlZCB0byBhIFNPQVAgaGVhZGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndzZGwtbWVzc2FnZS1wYXJ0LW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlJbnRlcnByZXRhdGlvbiBvZiB0aGUgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBlbGVtZW50IGRlcGVuZHMgb24KLQl3aGV0aGVyIG9yIG5vdCB3cmFwcGVkLWVsZW1lbnQgaGFzIGJlZW4gZGVmaW5lZCBpbiB0aGUKLQlzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nLiAgSWYgd3JhcHBlZC1lbGVtZW50IGlzIG5vdAotCXNwZWNpZmllZCwgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBkZWZpbmVzIGEgV1NETCBtZXNzYWdlIHBhcnQuIEl0Ci0Jc2hvdWxkIGFsd2F5cyBiZSBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gYSB3c2RsLW1lc3NhZ2UKLQllbGVtZW50LiBJZiB3cmFwcGVkLWVsZW1lbnQgaXMgc3BlY2lmaWVkLCB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lCi0JcmVmZXJzIHRvIGFuIGVsZW1lbnQgbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLgotCi0JVXNlZCBpbjogd3NkbC1tZXNzYWdlLW1hcHBpbmcsIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3NkbC1tZXNzYWdlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdzZGwtbWVzc2FnZSBlbGVtZW50IGRlZmluZXMgYSBXU0RMIG1lc3NhZ2UgYnkgYSBRTkFNRS4KLQotCVVzZWQgaW46IHdzZGwtbWVzc2FnZS1tYXBwaW5nLCB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nLAotCWV4Y2VwdGlvbi1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6eHNkUU5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZyAgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIGZvciB0aGUKLQltZXRob2QncyByZXR1cm4gdmFsdWUuIEl0IGRlZmluZXMgdGhlIG1hcHBpbmcgdG8gYSBzcGVjaWZpYyBtZXNzYWdlCi0JYW5kIGl0cyBwYXJ0LiAgVG9nZXRoZXIgdGhleSBkZWZpbmUgdW5pcXVlbHkgdGhlIG1hcHBpbmcgZm9yIGEKLQlzcGVjaWZpYyBwYXJhbWV0ZXIuIFBhcnRzIHdpdGhpbiBhIG1lc3NhZ2UgY29udGV4dCBhcmUgdW5pcXVlbHkKLQlpZGVudGlmaWVkIHdpdGggdGhlaXIgbmFtZXMuIFRoZSB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGlzIG5vdAotCXNwZWNpZmllZCBpZiB0aGVyZSBpcyBubyByZXR1cm4gdmFsdWUgb3IgT1VUIHBhcmFtZXRlcnMuCi0KLQlVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1yZXR1cm4tdmFsdWUiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBtZXRob2QtcmV0dXJuLXZhbHVlICBlbGVtZW50IGRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQKLQkgICAgY2xhc3MgbmFtZSBvciB2b2lkIHR5cGUgZm9yIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUKLQkgICAgdHlwZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLW1lc3NhZ2UiCi0JCSAgIHR5cGU9ImoyZWU6d3NkbC1tZXNzYWdlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtbWVzc2FnZS1wYXJ0LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6d3NkbC1tZXNzYWdlLXBhcnQtbmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTJhNzk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMS4xIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIylqMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkcwkxLjExIDAyLzExLzAzCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLSAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLSAgICAgIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAoQykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gMjAwMgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGUgd2Vic2VydmljZXMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IGZvciB0aGUgd2ViIHNlcnZpY2VzCi0JZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgSXQgc3BlY2lmaWVzIHRoZSBzZXQgb2Ygd2ViIHNlcnZpY2UKLQlkZXNjcmlwdGlvbnMgdGhhdCBhcmUgdG8gYmUgZGVwbG95ZWQgaW50byB0aGUgSjJFRSBBcHBsaWNhdGlvbgotCVNlcnZlciBhbmQgdGhlIGRlcGVuZGVuY2llcyB0aGV5IGhhdmUgb24gY29udGFpbmVyIHJlc291cmNlcyBhbmQKLQlzZXJ2aWNlcy4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZAotCSJNRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwiIGluIHRoZSB3ZWIgc2VydmljZXMnIGphciBmaWxlLgotCi0JVXNlZCBpbjogd2Vic2VydmljZXMueG1sCi0KLQlBbGwgd2Vic2VydmljZXMgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlIHRoZQotCXdlYnNlcnZpY2VzIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0KLQlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSB2ZXJzaW9uCi0JZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8d2Vic2VydmljZXMgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQkJaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL3hzZC9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIgotCSAgICAgIHZlcnNpb249IjEuMSI+Ci0JICAgICAgLi4uCi0JICAgIDwvd2Vic2VydmljZXM+Ci0KLQlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YgdGhlCi0Jc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciB0aGUgSjJFRQotCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLQlodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QKLQotCV1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0gICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0Jc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLQlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLQlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImoyZWVfMV80LnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWJzZXJ2aWNlcyIgdHlwZT0iajJlZTp3ZWJzZXJ2aWNlc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3ZWJzZXJ2aWNlcyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgZm9yIHRoZSB3ZWIgc2VydmljZXMKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBJdCBzcGVjaWZpZXMgdGhlIHNldCBvZiB3ZWIgc2VydmljZQotCWRlc2NyaXB0aW9ucyB0aGF0IGFyZSB0byBiZSBkZXBsb3llZCBpbnRvIHRoZSBKMkVFIEFwcGxpY2F0aW9uIFNlcnZlcgotCWFuZCB0aGUgZGVwZW5kZW5jaWVzIHRoZXkgaGF2ZSBvbiBjb250YWluZXIgcmVzb3VyY2VzIGFuZCBzZXJ2aWNlcy4KLQotCVVzZWQgaW46IHdlYnNlcnZpY2VzLnhtbAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmtleSBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUgaWRlbnRpZmllcyB0aGUgY29sbGVjdGlvbiBvZgotCSAgcG9ydC1jb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIFdTREwgZmlsZSBhbmQgSkFYLVJQQyBtYXBwaW5nLiBUaGUKLQkgIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6d2Vic2VydmljZS1kZXNjcmlwdGlvbiIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iajJlZTp3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvcnQtY29tcG9uZW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHBvcnQtY29tcG9uZW50IGVsZW1lbnQgYXNzb2NpYXRlcyBhIFdTREwgcG9ydCB3aXRoIGEgd2ViIHNlcnZpY2UKLQlpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uLiAgSXQgZGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgcG9ydCBhcyBhCi0JY29tcG9uZW50LCBvcHRpb25hbCBkZXNjcmlwdGlvbiwgb3B0aW9uYWwgZGlzcGxheSBuYW1lLCBvcHRpb25hbCBpY29uaWMKLQlyZXByZXNlbnRhdGlvbnMsIFdTREwgcG9ydCBRTmFtZSwgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UsIFNlcnZpY2UKLQlJbXBsZW1lbnRhdGlvbiBCZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotCQkgICB0eXBlPSJqMmVlOmljb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtY29tcG9uZW50LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIHBvcnQtY29tcG9uZW50LW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYSBwb3J0IGNvbXBvbmVudCdzCi0JICAgICAgbmFtZS4gIFRoaXMgbmFtZSBpcyBhc3NpZ25lZCBieSB0aGUgbW9kdWxlIHByb2R1Y2VyIHRvIG5hbWUKLQkgICAgICB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuIGluIHRoZSBtb2R1bGUncyBkZXBsb3ltZW50Ci0JICAgICAgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgYW1vbmcgdGhlIHBvcnQgY29tcG9uZW50Ci0JICAgICAgbmFtZXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBtb2R1bGUuCi0KLQkgICAgICBVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotCi0JICAgICAgRXhhbXBsZToKLQkJICAgICAgPHBvcnQtY29tcG9uZW50LW5hbWU+RW1wbG95ZWVTZXJ2aWNlCi0JCSAgICAgIDwvcG9ydC1jb21wb25lbnQtbmFtZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLXBvcnQiCi0JCSAgIHR5cGU9ImoyZWU6eHNkUU5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgbmFtZSBzcGFjZSBhbmQgbG9jYWwgbmFtZSBwYXJ0IG9mIHRoZSBXU0RMIHBvcnQgUU5hbWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGNvbnRhaW5zIHRoZQotCSAgICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBwb3J0IGNvbXBvbmVudCdzIFNlcnZpY2UgRW5kcG9pbnQKLQkgICAgICBJbnRlcmZhY2UuCi0KLQkgICAgICBVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotCi0JICAgICAgRXhhbXBsZToKLQkJICAgICAgPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1pbXBsLWJlYW4iCi0JCSAgIHR5cGU9ImoyZWU6c2VydmljZS1pbXBsLWJlYW5UeXBlIi8+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyIgotCQkgICB0eXBlPSJqMmVlOnBvcnQtY29tcG9uZW50X2hhbmRsZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9ydC1jb21wb25lbnRfaGFuZGxlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCURlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZQotCWluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLgotCi0JVXNlZCBpbjogcG9ydC1jb21wb25lbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLQkgICAgbW9kdWxlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLQkJICAgdHlwZT0iajJlZTpwYXJhbS12YWx1ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvYXAtaGVhZGVyIgotCQkgICB0eXBlPSJqMmVlOnhzZFFOYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgdGhlIFFOYW1lIG9mIGEgU09BUCBoZWFkZXIgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUKLQkgICAgaGFuZGxlci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb2FwLXJvbGUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNvYXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGEgU09BUCBhY3RvciBkZWZpbml0aW9uIHRoYXQgdGhlCi0JICAgIEhhbmRsZXIgd2lsbCBwbGF5IGFzIGEgcm9sZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLWltcGwtYmVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50IGRlZmluZXMgdGhlIHdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uLgotCUEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgYW4gRUpCIGJlYW4gY2xhc3Mgb3IgSkFYLVJQQyB3ZWIKLQljb21wb25lbnQuICBFeGlzdGluZyBFSkIgaW1wbGVtZW50YXRpb25zIGFyZSBleHBvc2VkIGFzIGEgd2ViIHNlcnZpY2UKLQl1c2luZyBhbiBlamItbGluay4KLQotCVVzZWQgaW46IHBvcnQtY29tcG9uZW50Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKLQkJICAgdHlwZT0iajJlZTplamItbGlua1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LWxpbmsiCi0JCSAgIHR5cGU9ImoyZWU6c2VydmxldC1saW5rVHlwZSIvPgotICAgIDwveHNkOmNob2ljZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0LWxpbmtUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBzZXJ2bGV0LWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50Ci0JICB0byBzcGVjaWZ5IHRoYXQgYSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIEJlYW4gaXMgZGVmaW5lZCBhcyBhCi0JICBKQVgtUlBDIFNlcnZpY2UgRW5kcG9pbnQuCi0KLQkgIFRoZSB2YWx1ZSBvZiB0aGUgc2VydmxldC1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgc2VydmxldC1uYW1lIG9mCi0JICBhIEpBWC1SUEMgU2VydmljZSBFbmRwb2ludCBpbiB0aGUgc2FtZSBXQVIgZmlsZS4KLQotCSAgVXNlZCBpbjogc2VydmljZS1pbXBsLWJlYW4KLQotCSAgRXhhbXBsZToKLQkJICA8c2VydmxldC1saW5rPlN0b2NrUXVvdGVTZXJ2aWNlPC9zZXJ2bGV0LWxpbms+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic2VydmljZS1kZXNjcmlwdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIGVsZW1lbnQgZGVmaW5lcyBhIFdTREwgZG9jdW1lbnQgZmlsZQotCWFuZCB0aGUgc2V0IG9mIFBvcnQgY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIFdTREwgcG9ydHMKLQlkZWZpbmVkIGluIHRoZSBXU0RMIGRvY3VtZW50LiAgVGhlcmUgbWF5IGJlIG11bHRpcGxlCi0Jd2Vic2VydmljZS1kZXNjcmlwdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBtb2R1bGUuCi0KLQlBbGwgV1NETCBmaWxlIHBvcnRzIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgcG9ydC1jb21wb25lbnQgZWxlbWVudAotCWRlZmluZWQuCi0KLQlVc2VkIGluOiB3ZWJzZXJ2aWNlcwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotCQkgICB0eXBlPSJqMmVlOmljb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lIGlkZW50aWZpZXMgdGhlIGNvbGxlY3Rpb24gb2YKLQkgICAgcG9ydC1jb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIFdTREwgZmlsZSBhbmQgSkFYLVJQQwotCSAgICBtYXBwaW5nLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLWZpbGUiCi0JCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd3NkbC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBXU0RMIGZpbGUgaW4gdGhlCi0JICAgIG1vZHVsZS4gIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpheHJwYy1tYXBwaW5nLWZpbGUiCi0JCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0Ci0JICAgIGRlc2NyaWJlcyB0aGUgSkFYLVJQQyBtYXBwaW5nIGJldHdlZW4gdGhlIEphdmEgaW50ZXJhY2VzIHVzZWQgYnkKLQkgICAgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgV1NETCBkZXNjcmlwdGlvbiBpbiB0aGUgd3NkbC1maWxlLiAgVGhlCi0JICAgIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQiCi0JCSAgIHR5cGU9ImoyZWU6cG9ydC1jb21wb25lbnRUeXBlIgotCQkgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmtleSBuYW1lPSJwb3J0LWNvbXBvbmVudF9oYW5kbGVyLW5hbWUta2V5Ij4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLQkgICAgICB3aXRoaW4gdGhlIG1vZHVsZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6aGFuZGxlciIvPgotCSAgPHhzZDpmaWVsZCB4cGF0aD0iajJlZTpoYW5kbGVyLW5hbWUiLz4KLQk8L3hzZDprZXk+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNlcnZpY2VzVHlwZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOndlYnNlcnZpY2UtZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmtleSBuYW1lPSJwb3J0LWNvbXBvbmVudC1uYW1lLWtleSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgICA8IVtDREFUQVsKLQotCQlUaGUgcG9ydC1jb21wb25lbnQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhIHBvcnQKLQkJY29tcG9uZW50J3MgbmFtZS4gIFRoaXMgbmFtZSBpcyBhc3NpZ25lZCBieSB0aGUgbW9kdWxlCi0JCXByb2R1Y2VyIHRvIG5hbWUgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBpbiB0aGUKLQkJbW9kdWxlJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCQlhbW9uZyB0aGUgcG9ydCBjb21wb25lbnQgbmFtZXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBtb2R1bGUuCi0KLQkJVXNlZCBpbjogcG9ydC1jb21wb25lbnQKLQotCQlFeGFtcGxlOgotCQkJPHBvcnQtY29tcG9uZW50LW5hbWU+RW1wbG95ZWVTZXJ2aWNlCi0JCQk8L3BvcnQtY29tcG9uZW50LW5hbWU+Ci0KLQkJXV0+Ci0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpwb3J0LWNvbXBvbmVudCIvPgotCSAgPHhzZDpmaWVsZCB4cGF0aD0iajJlZTpwb3J0LWNvbXBvbmVudC1uYW1lIi8+Ci0JPC94c2Q6a2V5PgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0JCSAgIGZpeGVkPSIxLjEiCi0JCSAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjEuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0YTU1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotCSAgICB2ZXJzaW9uPSIxLjEiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWoyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkcwkxLjEwIDAyLzExLzAzCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLSAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLSAgICAgIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAoQykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gMjAwMgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3J0LWNvbXBvbmVudC1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcG9ydC1jb21wb25lbnQtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGllbnQgZGVwZW5kZW5jeQotCW9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi0JdG8gYSBXU0RMIHBvcnQuIEl0IG9wdGlvbmFsbHkgYXNzb2NpYXRlcyB0aGUgU2VydmljZSBFbmRwb2ludAotCUludGVyZmFjZSB3aXRoIGEgcGFydGljdWxhciBwb3J0LWNvbXBvbmVudC4gVGhpcyBpcyBvbmx5IHVzZWQKLQlieSB0aGUgY29udGFpbmVyIGZvciBhIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQKLQkgICAgSmF2YSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIG9mIGEKLQkgICAgV1NETCBwb3J0LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQtbGluayIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBvcnQtY29tcG9uZW50LWxpbmsgZWxlbWVudCBsaW5rcyBhIHBvcnQtY29tcG9uZW50LXJlZgotCSAgICB0byBhIHNwZWNpZmljIHBvcnQtY29tcG9uZW50IHJlcXVpcmVkIHRvIGJlIG1hZGUgYXZhaWxhYmxlCi0JICAgIGJ5IGEgc2VydmljZSByZWZlcmVuY2UuCi0KLQkgICAgVGhlIHZhbHVlIG9mIGEgcG9ydC1jb21wb25lbnQtbGluayBtdXN0IGJlIHRoZQotCSAgICBwb3J0LWNvbXBvbmVudC1uYW1lIG9mIGEgcG9ydC1jb21wb25lbnQgaW4gdGhlIHNhbWUgbW9kdWxlCi0JICAgIG9yIGFub3RoZXIgbW9kdWxlIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uIHVuaXQuIFRoZSBzeW50YXgKLQkgICAgZm9yIHNwZWNpZmljYXRpb24gZm9sbG93cyB0aGUgc3ludGF4IGRlZmluZWQgZm9yIGVqYi1saW5rCi0JICAgIGluIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Z3JvdXAgbmFtZT0ic2VydmljZS1yZWZHcm91cCI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXJlZiIKLQkJICAgdHlwZT0iajJlZTpzZXJ2aWNlLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6a2V5IG5hbWU9InNlcnZpY2UtcmVmX2hhbmRsZXItbmFtZS1rZXkiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAgICAgIHdpdGhpbiB0aGUgbW9kdWxlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpoYW5kbGVyIi8+Ci0JICA8eHNkOmZpZWxkIHhwYXRoPSJqMmVlOmhhbmRsZXItbmFtZSIvPgotCTwveHNkOmtleT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmdyb3VwPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXJ2aWNlLXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgcmVmZXJlbmNlIHRvIGEgV2ViCi0Jc2VydmljZS4gSXQgY29udGFpbnMgb3B0aW9uYWwgZGVzY3JpcHRpb24sIGRpc3BsYXkgbmFtZSBhbmQKLQlpY29ucywgYSBkZWNsYXJhdGlvbiBvZiB0aGUgcmVxdWlyZWQgU2VydmljZSBpbnRlcmZhY2UsCi0JYW4gb3B0aW9uYWwgV1NETCBkb2N1bWVudCBsb2NhdGlvbiwgYW4gb3B0aW9uYWwgc2V0Ci0Jb2YgSkFYLVJQQyBtYXBwaW5ncywgYW4gb3B0aW9uYWwgUU5hbWUgZm9yIHRoZSBzZXJ2aWNlIGVsZW1lbnQsCi0JYW4gb3B0aW9uYWwgc2V0IG9mIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlcyB0byBiZSByZXNvbHZlZAotCWJ5IHRoZSBjb250YWluZXIgdG8gYSBXU0RMIHBvcnQsIGFuZCBhbiBvcHRpb25hbCBzZXQgb2YgaGFuZGxlcnMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1yZWYtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpqbmRpLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtcmVmLW5hbWUgZWxlbWVudCBkZWNsYXJlcyBsb2dpY2FsIG5hbWUgdGhhdCB0aGUKLQkgICAgY29tcG9uZW50cyBpbiB0aGUgbW9kdWxlIHVzZSB0byBsb29rIHVwIHRoZSBXZWIgc2VydmljZS4gSXQKLQkgICAgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgc2VydmljZSByZWZlcmVuY2UgbmFtZXMgc3RhcnQgd2l0aAotCSAgICAic2VydmljZS8iLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLWludGVyZmFjZSBlbGVtZW50IGRlY2xhcmVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLQkgICAgbmFtZSBvZiB0aGUgSkFYLVJQQyBTZXJ2aWNlIGludGVyZmFjZSB0aGUgY2xpZW50IGRlcGVuZHMgb24uCi0JICAgIEluIG1vc3QgY2FzZXMgdGhlIHZhbHVlIHdpbGwgYmUgamF2YXgueG1sLnJwYy5TZXJ2aWNlLiAgQSBKQVgtUlBDCi0JICAgIGdlbmVyYXRlZCBTZXJ2aWNlIEludGVyZmFjZSBjbGFzcyBtYXkgYWxzbyBiZSBzcGVjaWZpZWQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLWZpbGUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkQW55VVJJVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd3NkbC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIFVSSSBsb2NhdGlvbiBvZiBhIFdTREwKLQkgICAgZmlsZS4gVGhlIGxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBtb2R1bGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqYXhycGMtbWFwcGluZy1maWxlIgotCQkgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBqYXhycGMtbWFwcGluZy1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQKLQkgICAgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieQotCSAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuICBUaGUKLQkgICAgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZSBmaWxlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1xbmFtZSIKLQkJICAgdHlwZT0iajJlZTp4c2RRTmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtcW5hbWUgZWxlbWVudCBkZWNsYXJlcyB0aGUgc3BlY2lmaWMgV1NETCBzZXJ2aWNlCi0JICAgIGVsZW1lbnQgdGhhdCBpcyBiZWluZyByZWZlcmVkIHRvLiAgSXQgaXMgbm90IHNwZWNpZmllZCBpZiBubwotCSAgICB3c2RsLWZpbGUgaXMgZGVjbGFyZWQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LWNvbXBvbmVudC1yZWYiCi0JCSAgIHR5cGU9ImoyZWU6cG9ydC1jb21wb25lbnQtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwb3J0LWNvbXBvbmVudC1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIGNsaWVudCBkZXBlbmRlbmN5Ci0JICAgIG9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi0JICAgIHRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKLQkgICAgSW50ZXJmYWNlIHdpdGggYSBwYXJ0aWN1bGFyIHBvcnQtY29tcG9uZW50LiBUaGlzIGlzIG9ubHkgdXNlZAotCSAgICBieSB0aGUgY29udGFpbmVyIGZvciBhIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyIgotCQkgICB0eXBlPSJqMmVlOnNlcnZpY2UtcmVmX2hhbmRsZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbgotCSAgICBhY2Nlc3MgdGhlIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUKLQkgICAgSGFuZGxlckluZm8gaW50ZXJmYWNlLiBJZiBwb3J0LW5hbWUgaXMgbm90IHNwZWNpZmllZCwgdGhlCi0JICAgIGhhbmRsZXIgaXMgYXNzdW1lZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggYWxsIHBvcnRzIG9mIHRoZQotCSAgICBzZXJ2aWNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtcmVmX2hhbmRsZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuIGFjY2VzcyB0aGUKLQlpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYKLQlwb3J0LW5hbWUgaXMgbm90IHNwZWNpZmllZCwgdGhlIGhhbmRsZXIgaXMgYXNzdW1lZCB0byBiZSBhc3NvY2lhdGVkCi0Jd2l0aCBhbGwgcG9ydHMgb2YgdGhlIHNlcnZpY2UuCi0KLQlVc2VkIGluOiBzZXJ2aWNlLXJlZgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLQkgICAgd2l0aGluIHRoZSBtb2R1bGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgaGFuZGxlcgotCSAgICBpbXBsZW1lbnRhdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgotCQkgICB0eXBlPSJqMmVlOnBhcmFtLXZhbHVlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic29hcC1oZWFkZXIiCi0JCSAgIHR5cGU9ImoyZWU6eHNkUU5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgUU5hbWUgb2YgYSBTT0FQIGhlYWRlciB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkCi0JICAgIGJ5IHRoZSBoYW5kbGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic29hcC1yb2xlIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzb2FwLXJvbGUgZWxlbWVudCBjb250YWlucyBhIFNPQVAgYWN0b3IgZGVmaW5pdGlvbiB0aGF0Ci0JICAgIHRoZSBIYW5kbGVyIHdpbGwgcGxheSBhcyBhIHJvbGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBvcnQtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIFdTREwgcG9ydC1uYW1lIHRoYXQgYQotCSAgICBoYW5kbGVyIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGguCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV81LnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlXzUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjEwMTgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlXzUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjA5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYQotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjUiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWphdmFlZV81LnhzZHMJMS42NSAwNi8wMi8xNwotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICAgICAgVS5TLkEKLSAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgdGhhdCBhcHBlYXIgaW4gdGhlIGNvbW1vbgotc2hhcmVhYmxlIHNjaGVtYShzKSBvZiBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgc2hvdWxkIGJlCi1pbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvbnRleHQgdGhleSBhcmUgaW5jbHVkZWQ6Ci0KLURlcGxveW1lbnQgQ29tcG9uZW50IG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICBqMmVlIGFwcGxpY2F0aW9uOwotICAgIGFwcGxpY2F0aW9uIGNsaWVudDsKLSAgICB3ZWIgYXBwbGljYXRpb247Ci0gICAgZW50ZXJwcmlzZSBiZWFuOwotICAgIHJlc291cmNlIGFkYXB0ZXI7Ci0KLURlcGxveW1lbnQgRmlsZSBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgZWFyIGZpbGU7Ci0gICAgd2FyIGZpbGU7Ci0gICAgamFyIGZpbGU7Ci0gICAgcmFyIGZpbGU7Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotCSAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLz4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMi54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJkZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIGdyb3VwIGtlZXBzIHRoZSB1c2FnZSBvZiB0aGUgY29udGFpbmVkIGRlc2NyaXB0aW9uIHJlbGF0ZWQKLQllbGVtZW50cyBjb25zaXN0ZW50IGFjcm9zcyBKYXZhIEVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuCi0KLQlBbGwgZWxlbWVudHMgbWF5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IGxhbmd1YWdlcywKLQl0byBzdXBwb3J0IGxvY2FsaXphdGlvbiBvZiB0aGUgY29udGVudC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpkaXNwbGF5LW5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLQkJICAgdHlwZT0iamF2YWVlOmljb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmdyb3VwPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZXNjcmlwdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBkZXNjcmlwdGlvbiB0eXBlIGlzIHVzZWQgYnkgYSBkZXNjcmlwdGlvbiBlbGVtZW50IHRvCi0JcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGVsZW1lbnRzCi0JdGhhdCB1c2UgdGhpcyB0eXBlIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZQotCURlcGxveW1lbnQgQ29tcG9uZW50J3MgRGVwbG95bWVudCBGaWxlIGZpbGUgcHJvZHVjZXIgd2FudHMKLQl0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncwotCURlcGxveW1lbnQgRmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUKLQl0b29scyB1c2VkIGJ5IHN1Y2ggYSBEZXBsb3ltZW50IEZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5Ci0JdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdAotCWNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4KLQotCVRoZSBsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZQotCWRlc2NyaXB0aW9uIGlzIHByb3ZpZGVkIGluLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiZW4iIChFbmdsaXNoKS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImphdmFlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGV3ZXktdmVyc2lvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBkZWZpbmVzIGEgZGV3ZXkgZGVjaW1hbCB0aGF0IGlzIHVzZWQKLQl0byBkZXNjcmliZSB2ZXJzaW9ucyBvZiBkb2N1bWVudHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iXC4/WzAtOV0rKFwuWzAtOV0rKSoiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzcGxheS1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgZGlzcGxheS1uYW1lIHR5cGUgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQKLQkgIHRvIGJlIGRpc3BsYXllZCBieSB0b29scy4gSXQgaXMgdXNlZCBieSBkaXNwbGF5LW5hbWUKLQkgIGVsZW1lbnRzLiAgVGhlIGRpc3BsYXkgbmFtZSBuZWVkIG5vdCBiZSB1bmlxdWUuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIC4uLgotCSAgICAgPGRpc3BsYXktbmFtZSB4bWw6bGFuZz0iZW4iPgotCSAgICAgICBFbXBsb3llZSBTZWxmIFNlcnZpY2UKLQkgICAgIDwvZGlzcGxheS1uYW1lPgotCi0JICBUaGUgdmFsdWUgb2YgdGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBpcyAiZW4iIChFbmdsaXNoKSBieSBkZWZhdWx0LgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1saW5rVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgZWpiLWxpbmtUeXBlIGlzIHVzZWQgYnkgZWpiLWxpbmsKLQkgIGVsZW1lbnRzIGluIHRoZSBlamItcmVmIG9yIGVqYi1sb2NhbC1yZWYgZWxlbWVudHMgdG8gc3BlY2lmeQotCSAgdGhhdCBhbiBFSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBlbnRlcnByaXNlIGJlYW4uCi0KLQkgIFRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbgotCSAgZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIGVqYi1qYXIgZmlsZSBvciBpbiBhbm90aGVyIGVqYi1qYXIKLQkgIGZpbGUgaW4gdGhlIHNhbWUgSmF2YSBFRSBhcHBsaWNhdGlvbiB1bml0LgotCi0JICBBbHRlcm5hdGl2ZWx5LCB0aGUgbmFtZSBpbiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtYXkgYmUKLQkgIGNvbXBvc2VkIG9mIGEgcGF0aCBuYW1lIHNwZWNpZnlpbmcgdGhlIGVqYi1qYXIgY29udGFpbmluZyB0aGUKLQkgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuIHdpdGggdGhlIGVqYi1uYW1lIG9mIHRoZSB0YXJnZXQKLQkgIGJlYW4gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tIHRoZSBwYXRoIG5hbWUgYnkgIiMiLiAgVGhlCi0JICBwYXRoIG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIERlcGxveW1lbnQgRmlsZSBjb250YWluaW5nCi0JICBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0IGlzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlCi0JICBiZWFuLiAgVGhpcyBhbGxvd3MgbXVsdGlwbGUgZW50ZXJwcmlzZSBiZWFucyB3aXRoIHRoZSBzYW1lCi0JICBlamItbmFtZSB0byBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgotCi0JICBFeGFtcGxlczoKLQotCSAgICAgIDxlamItbGluaz5FbXBsb3llZVJlY29yZDwvZWpiLWxpbms+Ci0KLQkgICAgICA8ZWpiLWxpbms+Li4vcHJvZHVjdHMvcHJvZHVjdC5qYXIjUHJvZHVjdEVKQjwvZWpiLWxpbms+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItbG9jYWwtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVqYi1sb2NhbC1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyBmb3IKLQl0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwKLQlob21lIG9yIHRvIHRoZSBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgYSAzLjAgYmVhbi4KLSAgICAgICAgVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkgICAgLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIERlcGxveW1lbnQKLQkgICAgICBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4uCi0JICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0JICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIGxvY2FsIGludGVyZmFjZSBvZiB0aGUgcmVmZXJlbmNlZAotICAgICAgICAgICAgICBlbnRlcnByaXNlIGJlYW4gb3IgdGhlIGxvY2FsIGJ1c2luZXNzIGludGVyZmFjZSBvZiB0aGUKLSAgICAgICAgICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uCi0JICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIGxvY2FsIGhvbWUgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkCi0gICAgICAgICAgICAgIGVudGVycHJpc2UgYmVhbi4gTm90IGFwcGxpY2FibGUgaWYgdGhpcyBlamItbG9jYWwtcmVmIHJlZmVycwotICAgICAgICAgICAgICB0byB0aGUgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIGEgMy4wIGJlYW4uCi0JICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUKLQkgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICAgICAgICAgICAgLSBvcHRpb25hbCBlbGVtZW50cyB0byBkZWZpbmUgaW5qZWN0aW9uIG9mIHRoZSBuYW1lZCBlbnRlcnByaXNlCi0gICAgICAgICAgICAgIGJlYW4gaW50byBhIGNvbXBvbmVudCBmaWVsZCBvciBwcm9wZXJ0eS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1yZWYtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTplamItcmVmLXR5cGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsLWhvbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpsb2NhbC1ob21lVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbCIKLQkJICAgdHlwZT0iamF2YWVlOmxvY2FsVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1saW5rVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlR3JvdXAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItcmVmLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlCi0JICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLQkgIERlcGxveW1lbnQgQ29tcG9uZW50LgotCi0JICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxlamItcmVmLW5hbWU+ZWpiL1BheXJvbGw8L2VqYi1yZWYtbmFtZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItcmVmLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWpiLXJlZi10eXBlVHlwZSBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUKLQlyZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KLQotCVRoZSBlamItcmVmLXR5cGUgZGVzaWduYXRlcyBhIHZhbHVlCi0JdGhhdCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0JICAgIEVudGl0eQotCSAgICBTZXNzaW9uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0eSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlc3Npb24iLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVqYi1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLXJlZiBlbGVtZW50cyBmb3IgdGhlCi0JZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBvcgotICAgICAgICB0byB0aGUgcmVtb3RlIGJ1c2luZXNzIGludGVyZmFjZSBvZiBhIDMuMCBiZWFuLgotCVRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JICAgIC0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mCi0JICAgICAgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZQotCSAgICAgIGJlYW4uCi0JICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0gICAgICAgICAgICAtIHRoZSBvcHRpb25hbCByZW1vdGUgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICAgICAgICAgICAgICBvciB0aGUgcmVtb3RlIGJ1c2luZXNzIGludGVyZmFjZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlCi0gICAgICAgICAgICAgIGJlYW4KLQkgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgaG9tZSBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQKLSAgICAgICAgICAgICAgZW50ZXJwcmlzZSBiZWFuLiAgTm90IGFwcGxpY2FibGUgaWYgdGhpcyBlamItcmVmCi0gICAgICAgICAgICAgIHJlZmVycyB0byB0aGUgcmVtb3RlIGJ1c2luZXNzIGludGVyZmFjZSBvZiBhIDMuMCBiZWFuLgotCSAgICAtIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlCi0JICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLSAgICAgICAgICAgIC0gb3B0aW9uYWwgZWxlbWVudHMgdG8gZGVmaW5lIGluamVjdGlvbiBvZiB0aGUgbmFtZWQgZW50ZXJwcmlzZQotICAgICAgICAgICAgICBiZWFuIGludG8gYSBjb21wb25lbnQgZmllbGQgb3IgcHJvcGVydHkKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1yZWYtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTplamItcmVmLXR5cGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJob21lIgotCQkgICB0eXBlPSJqYXZhZWU6aG9tZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZSIKLQkJICAgdHlwZT0iamF2YWVlOnJlbW90ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWxpbmsiCi0JCSAgIHR5cGU9ImphdmFlZTplamItbGlua1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1wdHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgaXMgdXNlZCB0byBkZXNpZ25hdGUgYW4gZW1wdHkKLQllbGVtZW50IHdoZW4gdXNlZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mIHRoZQotCSAgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUKLQkgIGFwcGxpY2F0aW9uJ3MgY29kZS4KLQotCSAgVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlOgotCi0JICAgICAgamF2YS5sYW5nLkJvb2xlYW4KLQkgICAgICBqYXZhLmxhbmcuQnl0ZQotCSAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXIKLQkgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICAgICAgamF2YS5sYW5nLlNob3J0Ci0JICAgICAgamF2YS5sYW5nLkludGVnZXIKLQkgICAgICBqYXZhLmxhbmcuTG9uZwotCSAgICAgIGphdmEubGFuZy5GbG9hdAotCSAgICAgIGphdmEubGFuZy5Eb3VibGUKLQotCSAgRXhhbXBsZToKLQotCSAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQm9vbGVhbiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5CeXRlIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkNoYXJhY3RlciIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5TdHJpbmciLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU2hvcnQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuSW50ZWdlciIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Mb25nIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkZsb2F0Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkRvdWJsZSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudi1lbnRyeVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbnYtZW50cnlUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhbiBhcHBsaWNhdGlvbidzCi0JZW52aXJvbm1lbnQgZW50cnkuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotCWRlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGEgdHlwZQotCShvcHRpb25hbCBpZiB0aGUgdmFsdWUgaXMgaW5qZWN0ZWQsIG90aGVyd2lzZSByZXF1aXJlZCksIGFuZAotCWFuIG9wdGlvbmFsIHZhbHVlLgotCi0JSXQgYWxzbyBpbmNsdWRlcyBvcHRpb25hbCBlbGVtZW50cyB0byBkZWZpbmUgaW5qZWN0aW9uIG9mCi0JdGhlIG5hbWVkIHJlc291cmNlIGludG8gZmllbGRzIG9yIEphdmFCZWFucyBwcm9wZXJ0aWVzLgotCi0JSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkIGFuZCBpbmplY3Rpb24gaXMgcmVxdWVzdGVkLAotCW5vIGluamVjdGlvbiB3aWxsIG9jY3VyIGFuZCBubyBlbnRyeSBvZiB0aGUgc3BlY2lmaWVkIG5hbWUKLQl3aWxsIGJlIGNyZWF0ZWQuICBUaGlzIGFsbG93cyBhbiBpbml0aWFsIHZhbHVlIHRvIGJlCi0Jc3BlY2lmaWVkIGluIHRoZSBzb3VyY2UgY29kZSB3aXRob3V0IGJlaW5nIGluY29ycmVjdGx5Ci0JY2hhbmdlZCB3aGVuIG5vIG92ZXJyaWRlIGhhcyBiZWVuIHNwZWNpZmllZC4KLQotCUlmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCBhbmQgbm8gaW5qZWN0aW9uIGlzIHJlcXVlc3RlZCwKLQlhIHZhbHVlIG11c3QgYmUgc3VwcGxpZWQgZHVyaW5nIGRlcGxveW1lbnQuCi0KLQlUaGlzIHR5cGUgaXMgdXNlZCBieSBlbnYtZW50cnkgZWxlbWVudHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmpuZGktbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lCi0JICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKLQkgICAgICBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEKLQkgICAgICBEZXBsb3ltZW50IENvbXBvbmVudC4gVGhlIHVuaXF1ZW5lc3MKLQkgICAgICBjb25zdHJhaW50cyBtdXN0IGJlIGRlZmluZWQgd2l0aGluIHRoZSBkZWNsYXJlZAotCSAgICAgIGNvbnRleHQuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JICAgICAgPGVudi1lbnRyeS1uYW1lPm1pbkFtb3VudDwvZW52LWVudHJ5LW5hbWU+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOmVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBKYXZhIGxhbmd1YWdlCi0JICAgICAgdHlwZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkuICBJZiBhbiBpbmplY3Rpb24gdGFyZ2V0Ci0JICAgICAgaXMgc3BlY2lmaWVkIGZvciB0aGUgZW52aXJvbm1lbnQgZW50cnksIHRoZSB0eXBlIG1heQotCSAgICAgIGJlIG9taXR0ZWQsIG9yIG11c3QgbWF0Y2ggdGhlIHR5cGUgb2YgdGhlIGluamVjdGlvbgotCSAgICAgIHRhcmdldC4gIElmIG5vIGluamVjdGlvbiB0YXJnZXQgaXMgc3BlY2lmaWVkLCB0aGUgdHlwZQotCSAgICAgIGlzIHJlcXVpcmVkLgotCi0JICAgICAgRXhhbXBsZToKLQotCSAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktdmFsdWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgZW52LWVudHJ5LXZhbHVlIGRlc2lnbmF0ZXMgdGhlIHZhbHVlIG9mIGEKLQkgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiBUaGUgdmFsdWUKLQkgICAgICBtdXN0IGJlIGEgU3RyaW5nIHRoYXQgaXMgdmFsaWQgZm9yIHRoZQotCSAgICAgIGNvbnN0cnVjdG9yIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEKLQkgICAgICBzaW5nbGUgU3RyaW5nIHBhcmFtZXRlciwgb3IgZm9yIGphdmEubGFuZy5DaGFyYWN0ZXIsCi0JICAgICAgYSBzaW5nbGUgY2hhcmFjdGVyLgotCi0JICAgICAgRXhhbXBsZToKLQotCSAgICAgIDxlbnYtZW50cnktdmFsdWU+MTAwLjAwPC9lbnYtZW50cnktdmFsdWU+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6cmVzb3VyY2VHcm91cCIvPgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBkZXNpZ25hdGUgdGhlIG5hbWUgb2YgYQotCUphdmEgY2xhc3Mgb3IgaW50ZXJmYWNlLiAgVGhlIG5hbWUgaXMgaW4gdGhlIGZvcm0gb2YgYQotCSJiaW5hcnkgbmFtZSIsIGFzIGRlZmluZWQgaW4gdGhlIEpMUy4gIFRoaXMgaXMgdGhlIGZvcm0KLQlvZiBuYW1lIHVzZWQgaW4gQ2xhc3MuZm9yTmFtZSgpLiAgVG9vbHMgdGhhdCBuZWVkIHRoZQotCWNhbm9uaWNhbCBuYW1lICh0aGUgbmFtZSB1c2VkIGluIHNvdXJjZSBjb2RlKSB3aWxsIG5lZWQKLQl0byBjb252ZXJ0IHRoaXMgYmluYXJ5IG5hbWUgdG8gdGhlIGNhbm9uaWNhbCBuYW1lLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdlbmVyaWMtYm9vbGVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBkZWZpbmVzIGZvdXIgZGlmZmVyZW50IHZhbHVlcyB3aGljaCBjYW4gZGVzaWduYXRlCi0JYm9vbGVhbiB2YWx1ZXMuIFRoaXMgaW5jbHVkZXMgdmFsdWVzIHllcyBhbmQgbm8gd2hpY2ggYXJlCi0Jbm90IGRlc2lnbmF0ZWQgYnkgeHNkOmJvb2xlYW4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHJ1ZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZhbHNlIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieWVzIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8iLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJob21lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgaG9tZVR5cGUgZGVmaW5lcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YKLQkgIGFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotCi0JICBFeGFtcGxlOgotCi0JICAgICAgPGhvbWU+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEhvbWU8L2hvbWU+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWNvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBpY29uIHR5cGUgY29udGFpbnMgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50cwotCXRoYXQgc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGxhcmdlIEdJRiwgSlBFRywKLQlvciBQTkcgaWNvbiBpbWFnZXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHBhcmVudCBlbGVtZW50IGluIGEKLQlHVUkgdG9vbC4KLQotCVRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUKLQlpY29uIGZpbGUgbmFtZXMgYXJlIHByb3ZpZGVkIGluLiBJdHMgdmFsdWUgaXMgImVuIiAoRW5nbGlzaCkKLQlieSBkZWZhdWx0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNtYWxsLWljb24iIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLQkgICAgICBjb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi0JICAgICAgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBEZXBsb3ltZW50Ci0JICAgICAgQ29tcG9uZW50J3MgRGVwbG95bWVudCBGaWxlLgotCi0JICAgICAgVGhlIGltYWdlIG1heSBiZSBpbiB0aGUgR0lGLCBKUEVHLCBvciBQTkcgZm9ybWF0LgotCSAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi0JICAgICAgRXhhbXBsZToKLQotCSAgICAgIDxzbWFsbC1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjE2eDE2LmpwZzwvc21hbGwtaWNvbj4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsYXJnZS1pY29uIiB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi0JICAgICAgY29udGFpbmluZyBhIGxhcmdlCi0JICAgICAgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZQotCSAgICAgIHBhdGggd2l0aGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQKLQkgICAgICBGaWxlLgotCi0JICAgICAgVGhlIGltYWdlIG1heSBiZSBpbiB0aGUgR0lGLCBKUEVHLCBvciBQTkcgZm9ybWF0LgotCSAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi0JICAgICAgRXhhbXBsZToKLQotCSAgICAgIDxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLQotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5qZWN0aW9uLXRhcmdldFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCUFuIGluamVjdGlvbiB0YXJnZXQgc3BlY2lmaWVzIGEgY2xhc3MgYW5kIGEgbmFtZSB3aXRoaW4KLQl0aGF0IGNsYXNzIGludG8gd2hpY2ggYSByZXNvdXJjZSBzaG91bGQgYmUgaW5qZWN0ZWQuCi0KLQlUaGUgaW5qZWN0aW9uIHRhcmdldCBjbGFzcyBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZAotCWNsYXNzIG5hbWUgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSBpbmplY3Rpb24uICBUaGUKLQlKYXZhIEVFIHNwZWNpZmljYXRpb25zIGRlc2NyaWJlIHdoaWNoIGNsYXNzZXMgY2FuIGJlIGFuCi0JaW5qZWN0aW9uIHRhcmdldC4KLQotCVRoZSBpbmplY3Rpb24gdGFyZ2V0IG5hbWUgc3BlY2lmaWVzIHRoZSB0YXJnZXQgd2l0aGluCi0JdGhlIHNwZWNpZmllZCBjbGFzcy4gIFRoZSB0YXJnZXQgaXMgZmlyc3QgbG9va2VkIGZvciBhcyBhCi0JSmF2YUJlYW5zIHByb3BlcnR5IG5hbWUuICBJZiBub3QgZm91bmQsIHRoZSB0YXJnZXQgaXMKLQlsb29rZWQgZm9yIGFzIGEgZmllbGQgbmFtZS4KLQotCVRoZSBzcGVjaWZpZWQgcmVzb3VyY2Ugd2lsbCBiZSBpbmplY3RlZCBpbnRvIHRoZSB0YXJnZXQKLQlkdXJpbmcgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNsYXNzIGJ5IGVpdGhlciBjYWxsaW5nIHRoZQotCXNldCBtZXRob2QgZm9yIHRoZSB0YXJnZXQgcHJvcGVydHkgb3IgYnkgc2V0dGluZyBhIHZhbHVlCi0JaW50byB0aGUgbmFtZWQgZmllbGQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluamVjdGlvbi10YXJnZXQtY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5qZWN0aW9uLXRhcmdldC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS1pZGVudGlmaWVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGphdmEtaWRlbnRpZmllclR5cGUgZGVmaW5lcyBhIEphdmEgaWRlbnRpZmllci4KLQlUaGUgdXNlcnMgb2YgdGhpcyB0eXBlIHNob3VsZCBmdXJ0aGVyIHZlcmlmeSB0aGF0Ci0JdGhlIGNvbnRlbnQgZG9lcyBub3QgY29udGFpbiBKYXZhIHJlc2VydmVkIGtleXdvcmRzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOnBhdHRlcm4gdmFsdWU9IigkfF98XHB7TH0pKFxwe0x9fFxwe05kfXxffCQpKiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgaXMgYSBnZW5lcmljIHR5cGUgdGhhdCBkZXNpZ25hdGVzIGEgSmF2YSBwcmltaXRpdmUKLQl0eXBlIG9yIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGludGVyZmFjZS90eXBlLAotCW9yIGFuIGFycmF5IG9mIHN1Y2ggdHlwZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6cGF0dGVybiB2YWx1ZT0iW15ccHtafV0qIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam5kaS1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGpuZGktbmFtZVR5cGUgdHlwZSBkZXNpZ25hdGVzIGEgSk5ESSBuYW1lIGluIHRoZQotCURlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCWphdmE6Y29tcC9lbnYgY29udGV4dC4gIEEgSk5ESSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLQlEZXBsb3ltZW50IENvbXBvbmVudC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgZ3JvdXAga2VlcHMgdGhlIHVzYWdlIG9mIHRoZSBjb250YWluZWQgSk5ESSBlbnZpcm9ubWVudAotCXJlZmVyZW5jZSBlbGVtZW50cyBjb25zaXN0ZW50IGFjcm9zcyBKYXZhIEVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeSIKLQkJICAgdHlwZT0iamF2YWVlOmVudi1lbnRyeVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbG9jYWwtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLWxvY2FsLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6c2VydmljZS1yZWZHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLXJlZiIKLQkJICAgdHlwZT0iamF2YWVlOnJlc291cmNlLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIKLQkJICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLWNvbnRleHQtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6cGVyc2lzdGVuY2UtY29udGV4dC1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTpwZXJzaXN0ZW5jZS11bml0LXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWNvbnN0cnVjdCIKLQkJICAgdHlwZT0iamF2YWVlOmxpZmVjeWNsZS1jYWxsYmFja1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtZGVzdHJveSIKLQkJICAgdHlwZT0iamF2YWVlOmxpZmVjeWNsZS1jYWxsYmFja1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxpZmVjeWNsZS1jYWxsYmFja1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsaWZlY3ljbGUtY2FsbGJhY2sgdHlwZSBzcGVjaWZpZXMgYSBtZXRob2Qgb24gYQotCWNsYXNzIHRvIGJlIGNhbGxlZCB3aGVuIGEgbGlmZWN5Y2xlIGV2ZW50IG9jY3Vycy4KLQlOb3RlIHRoYXQgZWFjaCBjbGFzcyBtYXkgaGF2ZSBvbmx5IG9uZSBsaWZlY3ljbGUgY2FsbGJhY2sKLSAgICAgICAgbWV0aG9kIGZvciBhbnkgZ2l2ZW4gZXZlbnQgYW5kIHRoYXQgdGhlIG1ldGhvZCBtYXkgbm90Ci0JYmUgb3ZlcmxvYWRlZC4KLQotICAgICAgICBJZiB0aGUgbGlmZWZ5Y2xlLWNhbGxiYWNrLWNsYXNzIGVsZW1lbnQgaXMgbWlzc2luZyB0aGVuCi0gICAgICAgIHRoZSBjbGFzcyBkZWZpbmluZyB0aGUgY2FsbGJhY2sgaXMgYXNzdW1lZCB0byBiZSB0aGUKLSAgICAgICAgY29tcG9uZW50IGNsYXNzIGluIHNjb3BlIGF0IHRoZSBwbGFjZSBpbiB0aGUgZGVzY3JpcHRvcgotICAgICAgICBpbiB3aGljaCB0aGUgY2FsbGJhY2sgZGVmaW5pdGlvbiBhcHBlYXJzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaWZlY3ljbGUtY2FsbGJhY2stY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpZmVjeWNsZS1jYWxsYmFjay1tZXRob2QiCi0JCSAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaXN0ZW5lclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsaXN0ZW5lclR5cGUgaW5kaWNhdGVzIHRoZSBkZXBsb3ltZW50IHByb3BlcnRpZXMgZm9yIGEgd2ViCi0JYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3RlbmVyLWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBsaXN0ZW5lci1jbGFzcyBlbGVtZW50IGRlY2xhcmVzIGEgY2xhc3MgaW4gdGhlCi0JICAgIGFwcGxpY2F0aW9uIG11c3QgYmUgcmVnaXN0ZXJlZCBhcyBhIHdlYgotCSAgICBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLiBUaGUgdmFsdWUgaXMgdGhlIGZ1bGx5Ci0JICAgIHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGxpc3RlbmVyIGNsYXNzLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsLWhvbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9jYWwtaG9tZVR5cGUgZGVmaW5lcyB0aGUgZnVsbHktcXVhbGlmaWVkCi0JbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lIGludGVyZmFjZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9jYWxUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi0JZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaW50ZXJmYWNlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSBpcyB1c2VkIHRvIGxpbmsgYSBtZXNzYWdlCi0JZGVzdGluYXRpb24gcmVmZXJlbmNlIG9yIG1lc3NhZ2UtZHJpdmVuIGJlYW4gdG8gYSBtZXNzYWdlCi0JZGVzdGluYXRpb24uCi0KLQlUaGUgQXNzZW1ibGVyIHNldHMgdGhlIHZhbHVlIHRvIHJlZmxlY3QgdGhlIGZsb3cgb2YgbWVzc2FnZXMKLQliZXR3ZWVuIHByb2R1Y2VycyBhbmQgY29uc3VtZXJzIGluIHRoZSBhcHBsaWNhdGlvbi4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIHRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgb2YgYSBtZXNzYWdlCi0JZGVzdGluYXRpb24gaW4gdGhlIHNhbWUgRGVwbG95bWVudCBGaWxlIG9yIGluIGFub3RoZXIKLQlEZXBsb3ltZW50IEZpbGUgaW4gdGhlIHNhbWUgSmF2YSBFRSBhcHBsaWNhdGlvbiB1bml0LgotCi0JQWx0ZXJuYXRpdmVseSwgdGhlIHZhbHVlIG1heSBiZSBjb21wb3NlZCBvZiBhIHBhdGggbmFtZQotCXNwZWNpZnlpbmcgYSBEZXBsb3ltZW50IEZpbGUgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlZAotCW1lc3NhZ2UgZGVzdGluYXRpb24gd2l0aCB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIG9mIHRoZQotCWRlc3RpbmF0aW9uIGFwcGVuZGVkIGFuZCBzZXBhcmF0ZWQgZnJvbSB0aGUgcGF0aCBuYW1lIGJ5Ci0JIiMiLiBUaGUgcGF0aCBuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSBEZXBsb3ltZW50IEZpbGUKLQljb250YWluaW5nIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhlCi0JbWVzc2FnZSBkZXN0aW5hdGlvbi4gIFRoaXMgYWxsb3dzIG11bHRpcGxlIG1lc3NhZ2UKLQlkZXN0aW5hdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIHRvIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KLQkgIG9mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGEgbWVzc2FnZSBkZXN0aW5hdGlvbgotCSAgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gRGVwbG95bWVudCBDb21wb25lbnQncwotCSAgZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mOgotCi0JCSAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCQkgIC0gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUKLQkJICAtIGFuIG9wdGlvbmFsIG1lc3NhZ2UgZGVzdGluYXRpb24gdHlwZQotCQkgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBhcyB0byB3aGV0aGVyCi0JCSAgICB0aGUgZGVzdGluYXRpb24gaXMgdXNlZCBmb3IKLQkJICAgIGNvbnN1bWluZyBvciBwcm9kdWNpbmcgbWVzc2FnZXMsIG9yIGJvdGguCi0JCSAgICBpZiBub3Qgc3BlY2lmaWVkLCAiYm90aCIgaXMgYXNzdW1lZC4KLQkJICAtIGFuIG9wdGlvbmFsIGxpbmsgdG8gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24KLQkJICAtIG9wdGlvbmFsIGluamVjdGlvbiB0YXJnZXRzCi0KLQkgIFRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHR5cGUgbXVzdCBiZSBzdXBwbGllZCB1bmxlc3MgYW4KLQkgIGluamVjdGlvbiB0YXJnZXQgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHRoZSB0eXBlCi0JICBvZiB0aGUgdGFyZ2V0IGlzIHVzZWQuICBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZSB0eXBlCi0JICBtdXN0IGJlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24KLQkgIHRhcmdldC4KLQotCSAgRXhhbXBsZXM6Ci0KLQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZj4KLQkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZQotCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZT4KLQkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZQotCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPgotCQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPkNvbnN1bWVzCi0JCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPgotCQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+Q29ycG9yYXRlU3RvY2tzCi0JCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+Ci0JICA8L21lc3NhZ2UtZGVzdGluYXRpb24tcmVmPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmpuZGktbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcwotCSAgICB0aGUgbmFtZSBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMKLQkgICAgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotCSAgICBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKLQkgICAgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZQotCSAgICB1bmlxdWUgd2l0aGluIGFuIGVqYi1qYXIgKGZvciBlbnRlcnByaXNlIGJlYW5zKSBvciBhCi0JICAgIERlcGxveW1lbnQgRmlsZSAoZm9yIG90aGVycykuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSIKLQkJICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsiCi0JCSAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLQotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUgc3BlY2lmaWVzIHRoZSB0eXBlIG9mCi0JICB0aGUgZGVzdGluYXRpb24uIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgSmF2YSBpbnRlcmZhY2UKLQkgIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkZXN0aW5hdGlvbi4KLQotCSAgRXhhbXBsZToKLQotCSAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZQotCSAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIHNwZWNpZmllcyB0aGUgdXNlIG9mIHRoZQotCW1lc3NhZ2UgZGVzdGluYXRpb24gaW5kaWNhdGVkIGJ5IHRoZSByZWZlcmVuY2UuICBUaGUgdmFsdWUKLQlpbmRpY2F0ZXMgd2hldGhlciBtZXNzYWdlcyBhcmUgY29uc3VtZWQgZnJvbSB0aGUgbWVzc2FnZQotCWRlc3RpbmF0aW9uLCBwcm9kdWNlZCBmb3IgdGhlIGRlc3RpbmF0aW9uLCBvciBib3RoLiAgVGhlCi0JQXNzZW1ibGVyIG1ha2VzIHVzZSBvZiB0aGlzIGluZm9ybWF0aW9uIGluIGxpbmtpbmcgcHJvZHVjZXJzCi0Jb2YgYSBkZXN0aW5hdGlvbiB3aXRoIGl0cyBjb25zdW1lcnMuCi0KLQlUaGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2UgZWxlbWVudCBtdXN0IGJlCi0Jb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JICAgIENvbnN1bWVzCi0JICAgIFByb2R1Y2VzCi0JICAgIENvbnN1bWVzUHJvZHVjZXMKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXMiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlcyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVzUHJvZHVjZXMiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvblR5cGUgc3BlY2lmaWVzIGEgbWVzc2FnZQotCSAgZGVzdGluYXRpb24uIFRoZSBsb2dpY2FsIGRlc3RpbmF0aW9uIGRlc2NyaWJlZCBieSB0aGlzCi0JICBlbGVtZW50IGlzIG1hcHBlZCB0byBhIHBoeXNpY2FsIGRlc3RpbmF0aW9uIGJ5IHRoZSBEZXBsb3llci4KLQotCSAgVGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gZWxlbWVudCBjb250YWluczoKLQotCQkgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkJICAtIGFuIG9wdGlvbmFsIGRpc3BsYXktbmFtZQotCQkgIC0gYW4gb3B0aW9uYWwgaWNvbgotCQkgIC0gYSBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWUgd2hpY2ggbXVzdCBiZSB1bmlxdWUKLQkJICAgIGFtb25nIG1lc3NhZ2UgZGVzdGluYXRpb24gbmFtZXMgd2l0aGluIHRoZSBzYW1lCi0JCSAgICBEZXBsb3ltZW50IEZpbGUuCi0JCSAgLSBhbiBvcHRpb25hbCBtYXBwZWQgbmFtZQotCi0JICBFeGFtcGxlOgotCi0JICA8bWVzc2FnZS1kZXN0aW5hdGlvbj4KLQkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPkNvcnBvcmF0ZVN0b2NrcwotCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPgotCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhCi0JICAgIG5hbWUgZm9yIGEgbWVzc2FnZSBkZXN0aW5hdGlvbi4gIFRoaXMgbmFtZSBtdXN0IGJlCi0JICAgIHVuaXF1ZSBhbW9uZyB0aGUgbmFtZXMgb2YgbWVzc2FnZSBkZXN0aW5hdGlvbnMKLQkgICAgd2l0aGluIHRoZSBEZXBsb3ltZW50IEZpbGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBBIHByb2R1Y3Qgc3BlY2lmaWMgbmFtZSB0aGF0IHRoaXMgbWVzc2FnZSBkZXN0aW5hdGlvbgotCSAgICAgIHNob3VsZCBiZSBtYXBwZWQgdG8uICBFYWNoIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmCi0JICAgICAgZWxlbWVudCB0aGF0IHJlZmVyZW5jZXMgdGhpcyBtZXNzYWdlIGRlc3RpbmF0aW9uIHdpbGwKLQkgICAgICBkZWZpbmUgYSBuYW1lIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHJlZmVyZW5jaW5nCi0JICAgICAgY29tcG9uZW50LiAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYKLQkgICAgICBuYW1lc3BhY2UuKSAgTWFueSBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8KLQkgICAgICBtYXAgdGhlc2UgbG9jYWwgbmFtZXMgdG8gbmFtZXMgb2YgcmVzb3VyY2VzIGtub3duIHRvIHRoZQotCSAgICAgIGFwcGxpY2F0aW9uIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwKLQkgICAgICBKTkRJIG5hbWUsIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLiAgRWFjaCBvZiB0aGUKLQkgICAgICBsb2NhbCBuYW1lcyBzaG91bGQgYmUgbWFwcGVkIHRvIHRoaXMgc2FtZSBnbG9iYWwgbmFtZS4KLQotCSAgICAgIEFwcGxpY2F0aW9uIHNlcnZlcnMgYXJlIG5vdCByZXF1aXJlZCB0byBzdXBwb3J0IGFueQotCSAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKLQkgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCi0JICAgICAgcHJvZHVjdC1kZXBlbmRlbnQgYW5kIG9mdGVuIGluc3RhbGxhdGlvbi1kZXBlbmRlbnQuICBObwotCSAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcmFtLXZhbHVlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGlzIGEgZ2VuZXJhbCB0eXBlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVjbGFyZQotCXBhcmFtZXRlci92YWx1ZSBsaXN0cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgcGFyYW1ldGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0tdmFsdWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEKLQkgICAgcGFyYW1ldGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhdGhUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWxlbWVudHMgdGhhdCB1c2UgdGhpcyB0eXBlIGRlc2lnbmF0ZSBlaXRoZXIgYSByZWxhdGl2ZQotCXBhdGggb3IgYW4gYWJzb2x1dGUgcGF0aCBzdGFydGluZyB3aXRoIGEgIi8iLgotCi0JSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIERlcGxveW1lbnQgRmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLQlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQl0aGUgRGVwbG95bWVudCBGaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLAotCXRob3NlIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YKLQl0aGUgRGVwbG95bWVudCBGaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMKLQlhcmUgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtY29udGV4dC1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KLQkgIG9mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGEgcGVyc2lzdGVuY2UgY29udGV4dAotCSAgYXNzb2NpYXRlZCB3aXRoaW4gYSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0JICBlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6Ci0KLQkJICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JCSAgLSB0aGUgcGVyc2lzdGVuY2UgY29udGV4dCByZWZlcmVuY2UgbmFtZQotCQkgIC0gYW4gb3B0aW9uYWwgcGVyc2lzdGVuY2UgdW5pdCBuYW1lLiAgSWYgbm90IHNwZWNpZmllZCwKLSAgICAgICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgcGVyc2lzdGVuY2UgdW5pdCBpcyBhc3N1bWVkLgotCQkgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBhcyB0byB3aGV0aGVyCi0JCSAgICB0aGUgcGVyc2lzdGVuY2UgY29udGV4dCB0eXBlIGlzIFRyYW5zYWN0aW9uIG9yCi0JCSAgICBFeHRlbmRlZC4gIElmIG5vdCBzcGVjaWZpZWQsIFRyYW5zYWN0aW9uIGlzIGFzc3VtZWQuCi0gICAgICAgICAgICAgICAgICAtIGFuIG9wdGlvbmFsIGxpc3Qgb2YgcGVyc2lzdGVuY2UgcHJvcGVydGllcwotCQkgIC0gb3B0aW9uYWwgaW5qZWN0aW9uIHRhcmdldHMKLQotCSAgRXhhbXBsZXM6Ci0KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZj4KLSAgICAgICAgICAgICAgPHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWU+bXlQZXJzaXN0ZW5jZUNvbnRleHQKLSAgICAgICAgICAgICAgPC9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lPgotICAgICAgICAgICAgPC9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZj4KLQotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmPgotICAgICAgICAgICAgICA8cGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZT5teVBlcnNpc3RlbmNlQ29udGV4dAotICAgICAgICAgICAgICAgIDwvcGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXVuaXQtbmFtZT5QZXJzaXN0ZW5jZVVuaXQxCi0gICAgICAgICAgICAgICAgPC9wZXJzaXN0ZW5jZS11bml0LW5hbWU+Ci0gICAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGU+RXh0ZW5kZWQ8L3BlcnNpc3RlbmNlLWNvbnRleHQtdHlwZT4KLSAgICAgICAgICAgIDwvcGVyc2lzdGVuY2UtY29udGV4dC1yZWY+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCi0JICAgIHRoZSBuYW1lIG9mIGEgcGVyc2lzdGVuY2UgY29udGV4dCByZWZlcmVuY2U7IGl0cwotCSAgICB2YWx1ZSBpcyB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCi0JICAgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQotCSAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLQkJICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgQXBwbGljYXRpb24gQXNzZW1ibGVyKG9yIEJlYW5Qcm92aWRlcikgbWF5IHVzZSB0aGUKLSAgICAgICAgICAgIGZvbGxvd2luZyBzeW50YXggdG8gYXZvaWQgdGhlIG5lZWQgdG8gcmVuYW1lIHBlcnNpc3RlbmNlCi0gICAgICAgICAgICB1bml0cyB0byBoYXZlIHVuaXF1ZSBuYW1lcyB3aXRoaW4gYSBKYXZhIEVFIGFwcGxpY2F0aW9uLgotCi0gICAgICAgICAgICBUaGUgQXBwbGljYXRpb24gQXNzZW1ibGVyIHNwZWNpZmllcyB0aGUgcGF0aG5hbWUgb2YgdGhlCi0gICAgICAgICAgICByb290IG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSBmb3IgdGhlIHJlZmVyZW5jZWQKLSAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQgYW5kIGFwcGVuZHMgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3RlbmNlCi0gICAgICAgICAgICB1bml0IHNlcGFyYXRlZCBmcm9tIHRoZSBwYXRobmFtZSBieSAjLiBUaGUgcGF0aG5hbWUgaXMKLSAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2luZyBhcHBsaWNhdGlvbiBjb21wb25lbnQgamFyIGZpbGUuCi0gICAgICAgICAgICBJbiB0aGlzIG1hbm5lciwgbXVsdGlwbGUgcGVyc2lzdGVuY2UgdW5pdHMgd2l0aCB0aGUgc2FtZQotICAgICAgICAgICAgcGVyc2lzdGVuY2UgdW5pdCBuYW1lIG1heSBiZSB1bmlxdWVseSBpZGVudGlmaWVkIHdoZW4gdGhlCi0gICAgICAgICAgICBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgY2Fubm90IGNoYW5nZSBwZXJzaXN0ZW5jZSB1bml0IG5hbWVzLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtY29udGV4dC10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6cGVyc2lzdGVuY2UtY29udGV4dC10eXBlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS1wcm9wZXJ0eSIKLQkJICAgdHlwZT0iamF2YWVlOnByb3BlcnR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IHByb3BlcnRpZXMgZm9yIHRoZSBjb250YWluZXIgb3IgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgIHByb3ZpZGVyLiAgVmVuZG9yLXNwZWNpZmljIHByb3BlcnRpZXMgbWF5IGJlIGluY2x1ZGVkIGluCi0gICAgICAgICAgICB0aGUgc2V0IG9mIHByb3BlcnRpZXMuICBQcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdCByZWNvZ25pemVkCi0gICAgICAgICAgICBieSBhIHZlbmRvciBtdXN0IGJlIGlnbm9yZWQuICBFbnRyaWVzIHRoYXQgbWFrZSB1c2Ugb2YgdGhlCi0gICAgICAgICAgICBuYW1lc3BhY2UgamF2YXgucGVyc2lzdGVuY2UgYW5kIGl0cyBzdWJuYW1lc3BhY2VzIG11c3Qgbm90Ci0gICAgICAgICAgICBiZSB1c2VkIGZvciB2ZW5kb3Itc3BlY2lmaWMgcHJvcGVydGllcy4gIFRoZSBuYW1lc3BhY2UKLSAgICAgICAgICAgIGphdmF4LnBlcnNpc3RlbmNlIGlzIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIHNwZWNpZmljYXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6cmVzb3VyY2VHcm91cCIvPgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotCi0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcGVyc2lzdGVuY2UtY29udGV4dC10eXBlVHlwZSBzcGVjaWZpZXMgdGhlIHRyYW5zYWN0aW9uYWwKLQluYXR1cmUgb2YgYSBwZXJzaXN0ZW5jZSBjb250ZXh0IHJlZmVyZW5jZS4KLQotCVRoZSB2YWx1ZSBvZiB0aGUgcGVyc2lzdGVuY2UtY29udGV4dC10eXBlIGVsZW1lbnQgbXVzdCBiZQotCW9uZSBvZiB0aGUgZm9sbG93aW5nOgotCSAgICBUcmFuc2FjdGlvbgotICAgICAgICAgICAgRXh0ZW5kZWQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb24iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgcGVyc2lzdGVuY2UtdW5pdC1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uCi0JICBvZiBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhIHBlcnNpc3RlbmNlIHVuaXQKLQkgIGFzc29jaWF0ZWQgd2l0aGluIGEgRGVwbG95bWVudCBDb21wb25lbnQncwotCSAgZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mOgotCi0JCSAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCQkgIC0gdGhlIHBlcnNpc3RlbmNlIHVuaXQgcmVmZXJlbmNlIG5hbWUKLQkJICAtIGFuIG9wdGlvbmFsIHBlcnNpc3RlbmNlIHVuaXQgbmFtZS4gIElmIG5vdCBzcGVjaWZpZWQsCi0gICAgICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IHBlcnNpc3RlbmNlIHVuaXQgaXMgYXNzdW1lZC4KLQkJICAtIG9wdGlvbmFsIGluamVjdGlvbiB0YXJnZXRzCi0KLQkgIEV4YW1wbGVzOgotCi0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdW5pdC1yZWY+Ci0gICAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lPm15UGVyc2lzdGVuY2VVbml0Ci0gICAgICAgICAgICAgIDwvcGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZT4KLSAgICAgICAgICAgIDwvcGVyc2lzdGVuY2UtdW5pdC1yZWY+Ci0KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS11bml0LXJlZj4KLSAgICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWU+bXlQZXJzaXN0ZW5jZVVuaXQKLSAgICAgICAgICAgICAgICA8L3BlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS11bml0LW5hbWU+UGVyc2lzdGVuY2VVbml0MQotICAgICAgICAgICAgICAgIDwvcGVyc2lzdGVuY2UtdW5pdC1uYW1lPgotICAgICAgICAgICAgPC9wZXJzaXN0ZW5jZS11bml0LXJlZj4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpqbmRpLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMKLQkgICAgdGhlIG5hbWUgb2YgYSBwZXJzaXN0ZW5jZSB1bml0IHJlZmVyZW5jZTsgaXRzCi0JICAgIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLQkgICAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lCi0JICAgIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIob3IgQmVhblByb3ZpZGVyKSBtYXkgdXNlIHRoZQotICAgICAgICAgICAgZm9sbG93aW5nIHN5bnRheCB0byBhdm9pZCB0aGUgbmVlZCB0byByZW5hbWUgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgIHVuaXRzIHRvIGhhdmUgdW5pcXVlIG5hbWVzIHdpdGhpbiBhIEphdmEgRUUgYXBwbGljYXRpb24uCi0KLSAgICAgICAgICAgIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgc3BlY2lmaWVzIHRoZSBwYXRobmFtZSBvZiB0aGUKLSAgICAgICAgICAgIHJvb3Qgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIGZvciB0aGUgcmVmZXJlbmNlZAotICAgICAgICAgICAgcGVyc2lzdGVuY2UgdW5pdCBhbmQgYXBwZW5kcyB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgIHVuaXQgc2VwYXJhdGVkIGZyb20gdGhlIHBhdGhuYW1lIGJ5ICMuIFRoZSBwYXRobmFtZSBpcwotICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jaW5nIGFwcGxpY2F0aW9uIGNvbXBvbmVudCBqYXIgZmlsZS4KLSAgICAgICAgICAgIEluIHRoaXMgbWFubmVyLCBtdWx0aXBsZSBwZXJzaXN0ZW5jZSB1bml0cyB3aXRoIHRoZSBzYW1lCi0gICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0IG5hbWUgbWF5IGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQgd2hlbiB0aGUKLSAgICAgICAgICAgIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBjYW5ub3QgY2hhbmdlIHBlcnNpc3RlbmNlIHVuaXQgbmFtZXMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6cmVzb3VyY2VHcm91cCIvPgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotCi0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVNwZWNpZmllcyBhIG5hbWUvdmFsdWUgcGFpci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSI+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSI+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbW90ZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHJlbW90ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZQotCSAgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgICAgICA8cmVtb3RlPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2U8L3JlbW90ZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXMtYXV0aFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByZXMtYXV0aFR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50Ci0JY29kZSBzaWducyBvbiBwcm9ncmFtbWF0aWNhbGx5IHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyLCBvcgotCXdoZXRoZXIgdGhlIENvbnRhaW5lciB3aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIKLQlvbiBiZWhhbGYgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50LiBJbiB0aGUgbGF0dGVyIGNhc2UsCi0JdGhlIENvbnRhaW5lciB1c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlCi0JRGVwbG95ZXIuCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgQXBwbGljYXRpb24KLQkgICAgQ29udGFpbmVyCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzLXNoYXJpbmctc2NvcGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcmVzLXNoYXJpbmctc2NvcGUgdHlwZSBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucwotCW9idGFpbmVkIHRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbgotCWZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZSBzaGFyZWQuIFRoZSB2YWx1ZSwgaWYgc3BlY2lmaWVkLAotCW11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JICAgIFNoYXJlYWJsZQotCSAgICBVbnNoYXJlYWJsZQotCi0JVGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZWFibGUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNoYXJlYWJsZSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlLWVudi1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSByZXNvdXJjZS1lbnYtcmVmVHlwZSBpcyB1c2VkIHRvIGRlZmluZQotCSAgcmVzb3VyY2UtZW52LXR5cGUgZWxlbWVudHMuICBJdCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEKLQkgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QKLQkgIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0JICBlbnZpcm9ubWVudC4gIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUKLQkgIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gb3B0aW9uYWwKLQkgIGluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlCi0JICBleHBlY3RlZCBieSB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4KLQotCSAgSXQgYWxzbyBpbmNsdWRlcyBvcHRpb25hbCBlbGVtZW50cyB0byBkZWZpbmUgaW5qZWN0aW9uIG9mCi0JICB0aGUgbmFtZWQgcmVzb3VyY2UgaW50byBmaWVsZHMgb3IgSmF2YUJlYW5zIHByb3BlcnRpZXMuCi0KLQkgIFRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCB0eXBlIG11c3QgYmUgc3VwcGxpZWQgdW5sZXNzIGFuCi0JICBpbmplY3Rpb24gdGFyZ2V0IGlzIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSB0aGUgdHlwZQotCSAgb2YgdGhlIHRhcmdldCBpcyB1c2VkLiAgSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUgdHlwZQotCSAgbXVzdCBiZSBhc3NpZ25tZW50IGNvbXBhdGlibGUgd2l0aCB0aGUgdHlwZSBvZiB0aGUgaW5qZWN0aW9uCi0JICB0YXJnZXQuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxyZXNvdXJjZS1lbnYtcmVmPgotCSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+am1zL1N0b2NrUXVldWUKLQkgICAgICA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLQkgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmF4Lmptcy5RdWV1ZQotCSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotCSAgPC9yZXNvdXJjZS1lbnYtcmVmPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpqbmRpLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLQkgICAgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkKLQkgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0Ci0JICAgIGJlIHVuaXF1ZSB3aXRoaW4gYSBEZXBsb3ltZW50IENvbXBvbmVudC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYtdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUKLQkgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UuICBJdCBpcyB0aGUKLQkgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yCi0JICAgIGludGVyZmFjZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXNvdXJjZS1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSByZXNvdXJjZS1yZWZUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQotCSAgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0Ci0JICBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIG1hbmFnZXIKLQkgIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwgYW4gb3B0aW9uYWwgaW5kaWNhdGlvbiBvZgotCSAgdGhlIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUgZXhwZWN0ZWQgYnkgdGhlCi0JICBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLCBhbiBvcHRpb25hbCB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uCi0JICAoQXBwbGljYXRpb24gb3IgQ29udGFpbmVyKSwgYW5kIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YKLQkgIHRoZSBzaGFyZWFiaWxpdHkgb2YgY29ubmVjdGlvbnMgb2J0YWluZWQgZnJvbSB0aGUgcmVzb3VyY2UKLQkgIChTaGFyZWFibGUgb3IgVW5zaGFyZWFibGUpLgotCi0JICBJdCBhbHNvIGluY2x1ZGVzIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YKLQkgIHRoZSBuYW1lZCByZXNvdXJjZSBpbnRvIGZpZWxkcyBvciBKYXZhQmVhbnMgcHJvcGVydGllcy4KLQotCSAgVGhlIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlIG11c3QgYmUgc3VwcGxpZWQgdW5sZXNzIGFuCi0JICBpbmplY3Rpb24gdGFyZ2V0IGlzIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSB0aGUgdHlwZQotCSAgb2YgdGhlIHRhcmdldCBpcyB1c2VkLiAgSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUgdHlwZQotCSAgbXVzdCBiZSBhc3NpZ25tZW50IGNvbXBhdGlibGUgd2l0aCB0aGUgdHlwZSBvZiB0aGUgaW5qZWN0aW9uCi0JICB0YXJnZXQuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxyZXNvdXJjZS1yZWY+Ci0JICAgICAgPHJlcy1yZWYtbmFtZT5qZGJjL0VtcGxveWVlQXBwREI8L3Jlcy1yZWYtbmFtZT4KLQkgICAgICA8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPgotCSAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotCSAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotCSAgPC9yZXNvdXJjZS1yZWY+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1yZWYtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmpuZGktbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLQkgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLgotCSAgICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBEZXBsb3ltZW50IEZpbGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXMtdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YQotCSAgICBzb3VyY2UuIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgZnVsbHkgcXVhbGlmaWVkCi0JICAgIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IgaW50ZXJmYWNlCi0JICAgIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkYXRhIHNvdXJjZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1hdXRoIgotCQkgICB0eXBlPSJqYXZhZWU6cmVzLWF1dGhUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1zaGFyaW5nLXNjb3BlIgotCQkgICB0eXBlPSJqYXZhZWU6cmVzLXNoYXJpbmctc2NvcGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLQotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJyZXNvdXJjZUdyb3VwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIGdyb3VwIGNvbGxlY3RzIGVsZW1lbnRzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgdGhlCi0JSk5ESSByZXNvdXJjZSBlbGVtZW50cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBBIHByb2R1Y3Qgc3BlY2lmaWMgbmFtZSB0aGF0IHRoaXMgcmVzb3VyY2Ugc2hvdWxkIGJlCi0JICAgICAgbWFwcGVkIHRvLiAgVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSwgYXMgZGVmaW5lZCBieSB0aGUKLQkgICAgICByZXNvdXJjZSdzIG5hbWUgZWxlbWVudCBvciBkZWZhdWx0ZWQsIGlzIGEgbmFtZSB0aGF0IGlzCi0JICAgICAgbG9jYWwgdG8gdGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudCB1c2luZyB0aGUgcmVzb3VyY2UuCi0JICAgICAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYgbmFtZXNwYWNlLikgIE1hbnkKLQkgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlIGxvY2FsCi0JICAgICAgbmFtZXMgdG8gbmFtZXMgb2YgcmVzb3VyY2VzIGtub3duIHRvIHRoZSBhcHBsaWNhdGlvbgotCSAgICAgIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwgSk5ESSBuYW1lLAotCSAgICAgIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLgotCi0JICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55Ci0JICAgICAgcGFydGljdWxhciBmb3JtIG9yIHR5cGUgb2YgbWFwcGVkIG5hbWUsIG5vciB0aGUgYWJpbGl0eQotCSAgICAgIHRvIHVzZSBtYXBwZWQgbmFtZXMuICBUaGUgbWFwcGVkIG5hbWUgaXMKLQkgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCi0JICAgICAgdXNlIG9mIGEgbWFwcGVkIG5hbWUgaXMgcG9ydGFibGUuCi0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmplY3Rpb24tdGFyZ2V0IgotCQkgICB0eXBlPSJqYXZhZWU6aW5qZWN0aW9uLXRhcmdldFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJvbGUtbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByb2xlLW5hbWVUeXBlIGRlc2lnbmF0ZXMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi0JVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhIHRva2VuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icnVuLWFzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJ1bi1hc1R5cGUgc3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUKLQl1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIGEgY29tcG9uZW50LiBJdCBjb250YWlucyBhbgotCW9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6cm9sZS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlY3VyaXR5LXJvbGUtcmVmVHlwZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYQotCXNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIGluIGEgY29tcG9uZW50J3Mgb3IgYQotCURlcGxveW1lbnQgQ29tcG9uZW50J3MgY29kZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuCi0Jb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSBzZWN1cml0eSByb2xlIG5hbWUgdXNlZCBpbiB0aGUKLQljb2RlLCBhbmQgYW4gb3B0aW9uYWwgbGluayB0byBhIHNlY3VyaXR5IHJvbGUuIElmIHRoZQotCXNlY3VyaXR5IHJvbGUgaXMgbm90IHNwZWNpZmllZCwgdGhlIERlcGxveWVyIG11c3QgY2hvb3NlIGFuCi0JYXBwcm9wcmlhdGUgc2VjdXJpdHkgcm9sZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnJvbGUtbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgdmFsdWUgb2YgdGhlIHJvbGUtbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIFN0cmluZyB1c2VkCi0JICAgIGFzIHRoZSBwYXJhbWV0ZXIgdG8gdGhlCi0JICAgIEVKQkNvbnRleHQuaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGVOYW1lKSBtZXRob2Qgb3IgdGhlCi0JICAgIEh0dHBTZXJ2bGV0UmVxdWVzdC5pc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIG1ldGhvZC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbGluayIKLQkJICAgdHlwZT0iamF2YWVlOnJvbGUtbmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByb2xlLWxpbmsgZWxlbWVudCBpcyBhIHJlZmVyZW5jZSB0byBhIGRlZmluZWQKLQkgICAgc2VjdXJpdHkgcm9sZS4gVGhlIHJvbGUtbGluayBlbGVtZW50IG11c3QgY29udGFpbgotCSAgICB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlCi0JICAgIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktcm9sZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHNlY3VyaXR5LXJvbGVUeXBlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgc2VjdXJpdHkKLQkgIHJvbGUuIFRoZSBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mCi0JICB0aGUgc2VjdXJpdHkgcm9sZSwgYW5kIHRoZSBzZWN1cml0eSByb2xlIG5hbWUuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgICAgICA8c2VjdXJpdHktcm9sZT4KLQkgICAgICA8ZGVzY3JpcHRpb24+Ci0JCSAgVGhpcyByb2xlIGluY2x1ZGVzIGFsbCBlbXBsb3llZXMgd2hvIGFyZSBhdXRob3JpemVkCi0JCSAgdG8gYWNjZXNzIHRoZSBlbXBsb3llZSBzZXJ2aWNlIGFwcGxpY2F0aW9uLgotCSAgICAgIDwvZGVzY3JpcHRpb24+Ci0JICAgICAgPHJvbGUtbmFtZT5lbXBsb3llZTwvcm9sZS1uYW1lPgotCSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6cm9sZS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cmluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBpcyBhIHNwZWNpYWwgc3RyaW5nIGRhdGF0eXBlIHRoYXQgaXMgZGVmaW5lZCBieSBKYXZhIEVFIGFzCi0JYSBiYXNlIHR5cGUgZm9yIGRlZmluaW5nIGNvbGxhcHNlZCBzdHJpbmdzLiBXaGVuIHNjaGVtYXMKLQlyZXF1aXJlIHRyYWlsaW5nL2xlYWRpbmcgc3BhY2UgZWxpbWluYXRpb24gYXMgd2VsbCBhcwotCWNvbGxhcHNpbmcgdGhlIGV4aXN0aW5nIHdoaXRlc3BhY2UsIHRoaXMgYmFzZSB0eXBlIG1heSBiZQotCXVzZWQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJ1ZS1mYWxzZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgc2ltcGxlIHR5cGUgZGVzaWduYXRlcyBhIGJvb2xlYW4gd2l0aCBvbmx5IHR3bwotCXBlcm1pc3NpYmxlIHZhbHVlcwotCi0JLSB0cnVlCi0JLSBmYWxzZQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6eHNkQm9vbGVhblR5cGUiPgotCTx4c2Q6cGF0dGVybiB2YWx1ZT0iKHRydWV8ZmFsc2UpIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXJsLXBhdHRlcm5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdXJsLXBhdHRlcm5UeXBlIGNvbnRhaW5zIHRoZSB1cmwgcGF0dGVybiBvZiB0aGUgbWFwcGluZy4KLQlJdCBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgc3BlY2lmaWVkIGluIFNlY3Rpb24gMTEuMiBvZiB0aGUKLQlTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLiBUaGlzIHBhdHRlcm4gaXMgYXNzdW1lZCB0byBiZSBpbgotCVVSTC1kZWNvZGVkIGZvcm0gYW5kIG11c3Qgbm90IGNvbnRhaW4gQ1IoI3hEKSBvciBMRigjeEEpLgotCUlmIGl0IGNvbnRhaW5zIHRob3NlIGNoYXJhY3RlcnMsIHRoZSBjb250YWluZXIgbXVzdCBpbmZvcm0KLQl0aGUgZGV2ZWxvcGVyIHdpdGggYSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlLgotCVRoZSBjb250YWluZXIgbXVzdCBwcmVzZXJ2ZSBhbGwgY2hhcmFjdGVycyBpbmNsdWRpbmcgd2hpdGVzcGFjZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZEFueVVSSVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDphbnlVUkkuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6YW55VVJJIj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZEJvb2xlYW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6Ym9vbGVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpib29sZWFuIj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZEludGVnZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6aW50ZWdlci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDppbnRlZ2VyIj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZE5NVE9LRU5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6Tk1UT0tFTi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZE5vbk5lZ2F0aXZlSW50ZWdlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpub25OZWdhdGl2ZUludGVnZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6bm9uTmVnYXRpdmVJbnRlZ2VyIj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZFBvc2l0aXZlSW50ZWdlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpwb3NpdGl2ZUludGVnZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6cG9zaXRpdmVJbnRlZ2VyIj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZFFOYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOlFOYW1lLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOlFOYW1lIj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZFN0cmluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpzdHJpbmcuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qYXZhZWVfNi54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV82LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2NWQxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV82LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI0MjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgICAgICAgICB2ZXJzaW9uPSI2Ij4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLSAgICAgIAotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICAgICAKLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbgotICAgICAgRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlCi0gICAgICAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgICB0aGUgTGljZW5zZS4gWW91IGNhbiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgICBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWwgb3IKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKLSAgICAgIExpY2Vuc2UuCi0gICAgICAKLSAgICAgIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyCi0gICAgICBOb3RpY2UgaW4gZWFjaCBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gICAgICBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzCi0gICAgICBwcm92aWRlZCBieSBTdW4gaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZSBmaWxlCi0gICAgICB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4gIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nCi0gICAgICBiZWxvdyB0aGUgTGljZW5zZSBIZWFkZXIsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBbXQotICAgICAgcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gICAgICAiUG9ydGlvbnMgQ29weXJpZ2h0ZWQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0gICAgICAKLSAgICAgIENvbnRyaWJ1dG9yKHMpOgotICAgICAgCi0gICAgICBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlCi0gICAgICBDRERMIG9yIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nCi0gICAgICAiW0NvbnRyaWJ1dG9yXSBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMKLSAgICAgIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UKLSAgICAgIGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhIHJlY2lwaWVudCBoYXMgdGhlCi0gICAgICBvcHRpb24gdG8gZGlzdHJpYnV0ZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUKLSAgICAgIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8gaXRzCi0gICAgICBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIKLSAgICAgIGNvZGUgYW5kIHRoZXJlZm9yZSwgZWxlY3RlZCB0aGUgR1BMIFZlcnNpb24gMiBsaWNlbnNlLCB0aGVuIHRoZQotICAgICAgb3B0aW9uIGFwcGxpZXMgb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2gKLSAgICAgIG9wdGlvbiBieSB0aGUgY29weXJpZ2h0IGhvbGRlci4KLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiB0aGUgY29tbW9uCi0gICAgICBzaGFyZWFibGUgc2NoZW1hKHMpIG9mIEphdmEgRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBzaG91bGQgYmUKLSAgICAgIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY29udGV4dCB0aGV5IGFyZSBpbmNsdWRlZDoKLSAgICAgIAotICAgICAgRGVwbG95bWVudCBDb21wb25lbnQgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgICAgamF2YSBlZSBhcHBsaWNhdGlvbjsKLSAgICAgIGFwcGxpY2F0aW9uIGNsaWVudDsKLSAgICAgIHdlYiBhcHBsaWNhdGlvbjsKLSAgICAgIGVudGVycHJpc2UgYmVhbjsKLSAgICAgIHJlc291cmNlIGFkYXB0ZXI7IAotICAgICAgCi0gICAgICBEZXBsb3ltZW50IEZpbGUgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgICAgZWFyIGZpbGU7Ci0gICAgICB3YXIgZmlsZTsKLSAgICAgIGphciBmaWxlOwotICAgICAgcmFyIGZpbGU7Ci0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzMueHNkIi8+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJkZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBncm91cCBrZWVwcyB0aGUgdXNhZ2Ugb2YgdGhlIGNvbnRhaW5lZCBkZXNjcmlwdGlvbiByZWxhdGVkCi0gICAgICAgIGVsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEphdmEgRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KLSAgICAgICAgCi0gICAgICAgIEFsbCBlbGVtZW50cyBtYXkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgbGFuZ3VhZ2VzLAotICAgICAgICB0byBzdXBwb3J0IGxvY2FsaXphdGlvbiBvZiB0aGUgY29udGVudC4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGlzcGxheS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTppY29uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGdyb3VwIGtlZXBzIHRoZSB1c2FnZSBvZiB0aGUgY29udGFpbmVkIEpOREkgZW52aXJvbm1lbnQKLSAgICAgICAgcmVmZXJlbmNlIGVsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEphdmEgRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnkiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVudi1lbnRyeVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZWpiLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWxvY2FsLXJlZiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZWpiLWxvY2FsLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnNlcnZpY2UtcmVmR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1yZWYiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnJlc291cmNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGVyc2lzdGVuY2UtY29udGV4dC1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwZXJzaXN0ZW5jZS11bml0LXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1jb25zdHJ1Y3QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmxpZmVjeWNsZS1jYWxsYmFja1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLWRlc3Ryb3kiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmxpZmVjeWNsZS1jYWxsYmFja1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YS1zb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRhdGEtc291cmNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJyZXNvdXJjZUdyb3VwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBncm91cCBjb2xsZWN0cyBlbGVtZW50cyB0aGF0IGFyZSBjb21tb24gdG8gbW9zdAotICAgICAgICBKTkRJIHJlc291cmNlIGVsZW1lbnRzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUJhc2VHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxvb2t1cC1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBKTkRJIG5hbWUgdG8gYmUgbG9va2VkIHVwIHRvIHJlc29sdmUgYSByZXNvdXJjZSByZWZlcmVuY2UuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJyZXNvdXJjZUJhc2VHcm91cCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZ3JvdXAgY29sbGVjdHMgZWxlbWVudHMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCB0aGUKLSAgICAgICAgSk5ESSByZXNvdXJjZSBlbGVtZW50cy4gSXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgbG9va3VwLW5hbWUKLSAgICAgICAgZWxlbWVudCwgdGhhdCBpcyBvbmx5IGFwcGxpY2FibGUgdG8gc29tZSByZXNvdXJjZSBlbGVtZW50cy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBBIHByb2R1Y3Qgc3BlY2lmaWMgbmFtZSB0aGF0IHRoaXMgcmVzb3VyY2Ugc2hvdWxkIGJlCi0gICAgICAgICAgICBtYXBwZWQgdG8uICBUaGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLCBhcyBkZWZpbmVkIGJ5IHRoZQotICAgICAgICAgICAgcmVzb3VyY2UncyBuYW1lIGVsZW1lbnQgb3IgZGVmYXVsdGVkLCBpcyBhIG5hbWUgdGhhdCBpcwotICAgICAgICAgICAgbG9jYWwgdG8gdGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudCB1c2luZyB0aGUgcmVzb3VyY2UuCi0gICAgICAgICAgICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudiBuYW1lc3BhY2UuKSAgTWFueQotICAgICAgICAgICAgYXBwbGljYXRpb24gc2VydmVycyBwcm92aWRlIGEgd2F5IHRvIG1hcCB0aGVzZSBsb2NhbAotICAgICAgICAgICAgbmFtZXMgdG8gbmFtZXMgb2YgcmVzb3VyY2VzIGtub3duIHRvIHRoZSBhcHBsaWNhdGlvbgotICAgICAgICAgICAgc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbCBKTkRJIG5hbWUsCi0gICAgICAgICAgICBidXQgbWF5IGJlIGEgbmFtZSBvZiBhbnkgZm9ybS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55Ci0gICAgICAgICAgICBwYXJ0aWN1bGFyIGZvcm0gb3IgdHlwZSBvZiBtYXBwZWQgbmFtZSwgbm9yIHRoZSBhYmlsaXR5Ci0gICAgICAgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCi0gICAgICAgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCi0gICAgICAgICAgICB1c2Ugb2YgYSBtYXBwZWQgbmFtZSBpcyBwb3J0YWJsZS4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluamVjdGlvbi10YXJnZXQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmluamVjdGlvbi10YXJnZXRUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpncm91cD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhLXNvdXJjZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBDb25maWd1cmF0aW9uIG9mIGEgRGF0YVNvdXJjZS4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uIG9mIHRoaXMgRGF0YVNvdXJjZS4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmpuZGktbmFtZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgSk5ESSBuYW1lIG9mIHRoZQotICAgICAgICAgICAgZGF0YSBzb3VyY2UgYmVpbmcgZGVmaW5lZC4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgRGF0YVNvdXJjZSwgWEFEYXRhU291cmNlIG9yIENvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZQotICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2ZXItbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIERhdGFiYXNlIHNlcnZlciBuYW1lLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1udW1iZXIiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZEludGVnZXJUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFBvcnQgbnVtYmVyIHdoZXJlIGEgc2VydmVyIGlzIGxpc3RlbmluZyBmb3IgcmVxdWVzdHMuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhYmFzZS1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgTmFtZSBvZiBhIGRhdGFiYXNlIG9uIGEgc2VydmVyLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqZGJjLXVybFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgICAgIEEgSkRCQyBVUkwuIElmIHRoZSA8Y29kZT51cmw8L2NvZGU+IHByb3BlcnR5IGlzIHNwZWNpZmllZAotICAgICAgICAgICAgYWxvbmcgd2l0aCBvdGhlciBzdGFuZGFyZCA8Y29kZT5EYXRhU291cmNlPC9jb2RlPiBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBzdWNoIGFzIDxjb2RlPnNlcnZlck5hbWU8L2NvZGU+LCA8Y29kZT5kYXRhYmFzZU5hbWU8L2NvZGU+Ci0gICAgICAgICAgICBhbmQgPGNvZGU+cG9ydE51bWJlcjwvY29kZT4sIHRoZSBtb3JlIHNwZWNpZmljIHByb3BlcnRpZXMgd2lsbAotICAgICAgICAgICAgdGFrZSBwcmVjZWRlbmNlIGFuZCA8Y29kZT51cmw8L2NvZGU+IHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFVzZXIgbmFtZSB0byB1c2UgZm9yIGNvbm5lY3Rpb24gYXV0aGVudGljYXRpb24uCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXNzd29yZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFBhc3N3b3JkIHRvIHVzZSBmb3IgY29ubmVjdGlvbiBhdXRoZW50aWNhdGlvbi4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgSkRCQyBEYXRhU291cmNlIHByb3BlcnR5LiAgVGhpcyBtYXkgYmUgYSB2ZW5kb3Itc3BlY2lmaWMKLSAgICAgICAgICAgIHByb3BlcnR5IG9yIGEgbGVzcyBjb21tb25seSB1c2VkIERhdGFTb3VyY2UgcHJvcGVydHkuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dpbi10aW1lb3V0IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RJbnRlZ2VyVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBTZXRzIHRoZSBtYXhpbXVtIHRpbWUgaW4gc2Vjb25kcyB0aGF0IHRoaXMgZGF0YSBzb3VyY2UKLSAgICAgICAgICAgIHdpbGwgd2FpdCB3aGlsZSBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gYSBkYXRhYmFzZS4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zYWN0aW9uYWwiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZEJvb2xlYW5UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFNldCB0byBmYWxzZSBpZiBjb25uZWN0aW9ucyBzaG91bGQgbm90IHBhcnRpY2lwYXRlIGluCi0gICAgICAgICAgICB0cmFuc2FjdGlvbnMuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpc29sYXRpb24tbGV2ZWwiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmlzb2xhdGlvbi1sZXZlbFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgSXNvbGF0aW9uIGxldmVsIGZvciBjb25uZWN0aW9ucy4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXRpYWwtcG9vbC1zaXplIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RJbnRlZ2VyVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBOdW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCB3aGVuIGEKLSAgICAgICAgICAgIGNvbm5lY3Rpb24gcG9vbCBpcyBpbml0aWFsaXplZC4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1heC1wb29sLXNpemUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZEludGVnZXJUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIE1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGNvbmN1cnJlbnRseQotICAgICAgICAgICAgYWxsb2NhdGVkIGZvciBhIGNvbm5lY3Rpb24gcG9vbC4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbi1wb29sLXNpemUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZEludGVnZXJUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIE1pbmltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGNvbmN1cnJlbnRseQotICAgICAgICAgICAgYWxsb2NhdGVkIGZvciBhIGNvbm5lY3Rpb24gcG9vbC4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1heC1pZGxlLXRpbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZEludGVnZXJUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0aGF0IGEgcGh5c2ljYWwgY29ubmVjdGlvbiBzaG91bGQKLSAgICAgICAgICAgIHJlbWFpbiB1bnVzZWQgaW4gdGhlIHBvb2wgYmVmb3JlIHRoZSBjb25uZWN0aW9uIGlzCi0gICAgICAgICAgICBjbG9zZWQgZm9yIGEgY29ubmVjdGlvbiBwb29sLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWF4LXN0YXRlbWVudHMiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZEludGVnZXJUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSB0b3RhbCBudW1iZXIgb2Ygc3RhdGVtZW50cyB0aGF0IGEgY29ubmVjdGlvbiBwb29sCi0gICAgICAgICAgICBzaG91bGQga2VlcCBvcGVuLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlc2NyaXB0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBkZXNjcmlwdGlvbiB0eXBlIGlzIHVzZWQgYnkgYSBkZXNjcmlwdGlvbiBlbGVtZW50IHRvCi0gICAgICAgIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBlbGVtZW50cwotICAgICAgICB0aGF0IHVzZSB0aGlzIHR5cGUgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlCi0gICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgRGVwbG95bWVudCBGaWxlIGZpbGUgcHJvZHVjZXIgd2FudHMKLSAgICAgICAgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLSAgICAgICAgRGVwbG95bWVudCBGaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZQotICAgICAgICB0b29scyB1c2VkIGJ5IHN1Y2ggYSBEZXBsb3ltZW50IEZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5Ci0gICAgICAgIHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQKLSAgICAgICAgY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLgotICAgICAgICAKLSAgICAgICAgVGhlIGxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlCi0gICAgICAgIGRlc2NyaXB0aW9uIGlzIHByb3ZpZGVkIGluLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiZW4iIChFbmdsaXNoKS4gCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImphdmFlZTp4c2RTdHJpbmdUeXBlIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkZXdleS12ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgdHlwZSBkZWZpbmVzIGEgZGV3ZXkgZGVjaW1hbCB0aGF0IGlzIHVzZWQKLSAgICAgICAgdG8gZGVzY3JpYmUgdmVyc2lvbnMgb2YgZG9jdW1lbnRzLiAKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJcLj9bMC05XSsoXC5bMC05XSspKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc3BsYXktbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgZGlzcGxheS1uYW1lIHR5cGUgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQKLSAgICAgICAgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzLiBJdCBpcyB1c2VkIGJ5IGRpc3BsYXktbmFtZQotICAgICAgICBlbGVtZW50cy4gIFRoZSBkaXNwbGF5IG5hbWUgbmVlZCBub3QgYmUgdW5pcXVlLgotICAgICAgICAKLSAgICAgICAgRXhhbXBsZTogCi0gICAgICAgIAotICAgICAgICAuLi4KLSAgICAgICAgPGRpc3BsYXktbmFtZSB4bWw6bGFuZz0iZW4iPgotICAgICAgICBFbXBsb3llZSBTZWxmIFNlcnZpY2UKLSAgICAgICAgPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIAotICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBpcyAiZW4iIChFbmdsaXNoKSBieSBkZWZhdWx0LiAKLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLWxpbmtUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgVGhlIGVqYi1saW5rVHlwZSBpcyB1c2VkIGJ5IGVqYi1saW5rCi0gICAgICAgIGVsZW1lbnRzIGluIHRoZSBlamItcmVmIG9yIGVqYi1sb2NhbC1yZWYgZWxlbWVudHMgdG8gc3BlY2lmeQotICAgICAgICB0aGF0IGFuIEVKQiByZWZlcmVuY2UgaXMgbGlua2VkIHRvIGVudGVycHJpc2UgYmVhbi4KLSAgICAgICAgCi0gICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbgotICAgICAgICBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIHNhbWUgZWpiLWphciBmaWxlIG9yIGluIGFub3RoZXIgZWpiLWphcgotICAgICAgICBmaWxlIGluIHRoZSBzYW1lIEphdmEgRUUgYXBwbGljYXRpb24gdW5pdC4gCi0gICAgICAgIAotICAgICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgbmFtZSBpbiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtYXkgYmUKLSAgICAgICAgY29tcG9zZWQgb2YgYSBwYXRoIG5hbWUgc3BlY2lmeWluZyB0aGUgZWpiLWphciBjb250YWluaW5nIHRoZQotICAgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbiB3aXRoIHRoZSBlamItbmFtZSBvZiB0aGUgdGFyZ2V0Ci0gICAgICAgIGJlYW4gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tIHRoZSBwYXRoIG5hbWUgYnkgIiMiLiAgVGhlCi0gICAgICAgIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgRGVwbG95bWVudCBGaWxlIGNvbnRhaW5pbmcKLSAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQgdGhhdCBpcyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZQotICAgICAgICBiZWFuLiAgVGhpcyBhbGxvd3MgbXVsdGlwbGUgZW50ZXJwcmlzZSBiZWFucyB3aXRoIHRoZSBzYW1lCi0gICAgICAgIGVqYi1uYW1lIHRvIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCi0gICAgICAgIAotICAgICAgICBFeGFtcGxlczoKLSAgICAgICAgCi0gICAgICAgIDxlamItbGluaz5FbXBsb3llZVJlY29yZDwvZWpiLWxpbms+Ci0gICAgICAgIAotICAgICAgICA8ZWpiLWxpbms+Li4vcHJvZHVjdHMvcHJvZHVjdC5qYXIjUHJvZHVjdEVKQjwvZWpiLWxpbms+Ci0gICAgICAgIAotICAgICAgICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItbG9jYWwtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlamItbG9jYWwtcmVmVHlwZSBpcyB1c2VkIGJ5IGVqYi1sb2NhbC1yZWYgZWxlbWVudHMgZm9yCi0gICAgICAgIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbAotICAgICAgICBob21lIG9yIHRvIHRoZSBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgYSAzLjAgYmVhbi4KLSAgICAgICAgVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotICAgICAgICAKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgICAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgRGVwbG95bWVudCAKLSAgICAgICAgQ29tcG9uZW50IHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuLgotICAgICAgICAtIHRoZSBvcHRpb25hbCBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICAgICAgICAtIHRoZSBvcHRpb25hbCBleHBlY3RlZCBsb2NhbCBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQgCi0gICAgICAgIGVudGVycHJpc2UgYmVhbiBvciB0aGUgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIHRoZSAKLSAgICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uCi0gICAgICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIGxvY2FsIGhvbWUgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkIAotICAgICAgICBlbnRlcnByaXNlIGJlYW4uIE5vdCBhcHBsaWNhYmxlIGlmIHRoaXMgZWpiLWxvY2FsLXJlZiByZWZlcnMKLSAgICAgICAgdG8gdGhlIGxvY2FsIGJ1c2luZXNzIGludGVyZmFjZSBvZiBhIDMuMCBiZWFuLgotICAgICAgICAtIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlIAotICAgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICAgICAgICAtIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YgdGhlIG5hbWVkIGVudGVycHJpc2UgIAotICAgICAgICBiZWFuIGludG8gYSBjb21wb25lbnQgZmllbGQgb3IgcHJvcGVydHkuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVqYi1yZWYtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVqYi1yZWYtdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwtaG9tZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bG9jYWwtaG9tZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmxvY2FsVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZWpiLWxpbmtUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWYtbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0gICAgICAgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlCi0gICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlCi0gICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50LgotICAgICAgICAKLSAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotICAgICAgICAKLSAgICAgICAgRXhhbXBsZToKLSAgICAgICAgCi0gICAgICAgIDxlamItcmVmLW5hbWU+ZWpiL1BheXJvbGw8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOmpuZGktbmFtZVR5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlamItcmVmVHlwZSBpcyB1c2VkIGJ5IGVqYi1yZWYgZWxlbWVudHMgZm9yIHRoZQotICAgICAgICBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBob21lIG9yCi0gICAgICAgIHRvIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIGEgMy4wIGJlYW4uICAKLSAgICAgICAgVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotICAgICAgICAKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgICAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZgotICAgICAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlCi0gICAgICAgIGJlYW4uIAotICAgICAgICAtIHRoZSBvcHRpb25hbCBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICAgICAgICAtIHRoZSBvcHRpb25hbCByZW1vdGUgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICAgICAgICBvciB0aGUgcmVtb3RlIGJ1c2luZXNzIGludGVyZmFjZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIAotICAgICAgICBiZWFuCi0gICAgICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIGhvbWUgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkIAotICAgICAgICBlbnRlcnByaXNlIGJlYW4uICBOb3QgYXBwbGljYWJsZSBpZiB0aGlzIGVqYi1yZWYKLSAgICAgICAgcmVmZXJzIHRvIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIGEgMy4wIGJlYW4uCi0gICAgICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUKLSAgICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLSAgICAgICAgLSBvcHRpb25hbCBlbGVtZW50cyB0byBkZWZpbmUgaW5qZWN0aW9uIG9mIHRoZSBuYW1lZCBlbnRlcnByaXNlCi0gICAgICAgIGJlYW4gaW50byBhIGNvbXBvbmVudCBmaWVsZCBvciBwcm9wZXJ0eQotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItcmVmLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi10eXBlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplamItcmVmLXR5cGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhvbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmhvbWVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cmVtb3RlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZWpiLWxpbmtUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWYtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZWpiLXJlZi10eXBlVHlwZSBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUKLSAgICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uCi0gICAgICAgIAotICAgICAgICBUaGUgZWpiLXJlZi10eXBlIGRlc2lnbmF0ZXMgYSB2YWx1ZQotICAgICAgICB0aGF0IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIAotICAgICAgICBFbnRpdHkKLSAgICAgICAgU2Vzc2lvbgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpdHkiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vzc2lvbiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1wdHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyB0eXBlIGlzIHVzZWQgdG8gZGVzaWduYXRlIGFuIGVtcHR5Ci0gICAgICAgIGVsZW1lbnQgd2hlbiB1c2VkLiAKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudi1lbnRyeVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZW52LWVudHJ5VHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYW4gYXBwbGljYXRpb24ncwotICAgICAgICBlbnZpcm9ubWVudCBlbnRyeS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi0gICAgICAgIGRlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGEgdHlwZQotICAgICAgICAob3B0aW9uYWwgaWYgdGhlIHZhbHVlIGlzIGluamVjdGVkLCBvdGhlcndpc2UgcmVxdWlyZWQpLCBhbmQKLSAgICAgICAgYW4gb3B0aW9uYWwgdmFsdWUuCi0gICAgICAgIAotICAgICAgICBJdCBhbHNvIGluY2x1ZGVzIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YKLSAgICAgICAgdGhlIG5hbWVkIHJlc291cmNlIGludG8gZmllbGRzIG9yIEphdmFCZWFucyBwcm9wZXJ0aWVzLgotICAgICAgICAKLSAgICAgICAgSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkIGFuZCBpbmplY3Rpb24gaXMgcmVxdWVzdGVkLAotICAgICAgICBubyBpbmplY3Rpb24gd2lsbCBvY2N1ciBhbmQgbm8gZW50cnkgb2YgdGhlIHNwZWNpZmllZCBuYW1lCi0gICAgICAgIHdpbGwgYmUgY3JlYXRlZC4gIFRoaXMgYWxsb3dzIGFuIGluaXRpYWwgdmFsdWUgdG8gYmUKLSAgICAgICAgc3BlY2lmaWVkIGluIHRoZSBzb3VyY2UgY29kZSB3aXRob3V0IGJlaW5nIGluY29ycmVjdGx5Ci0gICAgICAgIGNoYW5nZWQgd2hlbiBubyBvdmVycmlkZSBoYXMgYmVlbiBzcGVjaWZpZWQuCi0gICAgICAgIAotICAgICAgICBJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQgYW5kIG5vIGluamVjdGlvbiBpcyByZXF1ZXN0ZWQsCi0gICAgICAgIGEgdmFsdWUgbXVzdCBiZSBzdXBwbGllZCBkdXJpbmcgZGVwbG95bWVudC4gCi0gICAgICAgIAotICAgICAgICBUaGlzIHR5cGUgaXMgdXNlZCBieSBlbnYtZW50cnkgZWxlbWVudHMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0gICAgICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUKLSAgICAgICAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52Ci0gICAgICAgICAgICBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgCi0gICAgICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudC4gVGhlIHVuaXF1ZW5lc3MKLSAgICAgICAgICAgIGNvbnN0cmFpbnRzIG11c3QgYmUgZGVmaW5lZCB3aXRoaW4gdGhlIGRlY2xhcmVkCi0gICAgICAgICAgICBjb250ZXh0LgotICAgICAgICAgICAgCi0gICAgICAgICAgICBFeGFtcGxlOgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bWluQW1vdW50PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5LXR5cGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgICAgIFRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBKYXZhIGxhbmd1YWdlCi0gICAgICAgICAgICB0eXBlIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeS4gIElmIGFuIGluamVjdGlvbiB0YXJnZXQKLSAgICAgICAgICAgIGlzIHNwZWNpZmllZCBmb3IgdGhlIGVudmlyb25tZW50IGVudHJ5LCB0aGUgdHlwZSBtYXkKLSAgICAgICAgICAgIGJlIG9taXR0ZWQsIG9yIG11c3QgbWF0Y2ggdGhlIHR5cGUgb2YgdGhlIGluamVjdGlvbgotICAgICAgICAgICAgdGFyZ2V0LiAgSWYgbm8gaW5qZWN0aW9uIHRhcmdldCBpcyBzcGVjaWZpZWQsIHRoZSB0eXBlCi0gICAgICAgICAgICBpcyByZXF1aXJlZC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgRXhhbXBsZToKLSAgICAgICAgICAgIAotICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5LXZhbHVlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgICAgICBUaGUgZW52LWVudHJ5LXZhbHVlIGRlc2lnbmF0ZXMgdGhlIHZhbHVlIG9mIGEKLSAgICAgICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuIFRoZSB2YWx1ZQotICAgICAgICAgICAgbXVzdCBiZSBhIFN0cmluZyB0aGF0IGlzIHZhbGlkIGZvciB0aGUKLSAgICAgICAgICAgIGNvbnN0cnVjdG9yIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEKLSAgICAgICAgICAgIHNpbmdsZSBTdHJpbmcgcGFyYW1ldGVyLCBvciBmb3IgamF2YS5sYW5nLkNoYXJhY3RlciwKLSAgICAgICAgICAgIGEgc2luZ2xlIGNoYXJhY3Rlci4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgRXhhbXBsZToKLSAgICAgICAgICAgIAotICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT4xMDAuMDA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlR3JvdXAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgIFRoaXMgdHlwZSBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBvZiB0aGUKLSAgICAgICAgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUKLSAgICAgICAgYXBwbGljYXRpb24ncyBjb2RlLgotICAgICAgICAKLSAgICAgICAgVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlOgotICAgICAgICAKLSAgICAgICAgamF2YS5sYW5nLkJvb2xlYW4KLSAgICAgICAgamF2YS5sYW5nLkJ5dGUKLSAgICAgICAgamF2YS5sYW5nLkNoYXJhY3RlcgotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICAgIGphdmEubGFuZy5TaG9ydAotICAgICAgICBqYXZhLmxhbmcuSW50ZWdlcgotICAgICAgICBqYXZhLmxhbmcuTG9uZwotICAgICAgICBqYXZhLmxhbmcuRmxvYXQKLSAgICAgICAgamF2YS5sYW5nLkRvdWJsZQotICAgICAgICAJCSAgamF2YS5sYW5nLkNsYXNzCi0gICAgICAgIAkJICBhbnkgZW51bWVyYXRpb24gdHlwZSAoaS5lLiBhIHN1YmNsYXNzIG9mIGphdmEubGFuZy5FbnVtKQotICAgICAgICAKLSAgICAgICAgRXhhbXBsZXM6Ci0gICAgICAgIAotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNsYXNzPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmNvbS5leGFtcGxlLkNvbG9yPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBkZXNpZ25hdGUgdGhlIG5hbWUgb2YgYQotICAgICAgICBKYXZhIGNsYXNzIG9yIGludGVyZmFjZS4gIFRoZSBuYW1lIGlzIGluIHRoZSBmb3JtIG9mIGEKLSAgICAgICAgImJpbmFyeSBuYW1lIiwgYXMgZGVmaW5lZCBpbiB0aGUgSkxTLiAgVGhpcyBpcyB0aGUgZm9ybQotICAgICAgICBvZiBuYW1lIHVzZWQgaW4gQ2xhc3MuZm9yTmFtZSgpLiAgVG9vbHMgdGhhdCBuZWVkIHRoZQotICAgICAgICBjYW5vbmljYWwgbmFtZSAodGhlIG5hbWUgdXNlZCBpbiBzb3VyY2UgY29kZSkgd2lsbCBuZWVkCi0gICAgICAgIHRvIGNvbnZlcnQgdGhpcyBiaW5hcnkgbmFtZSB0byB0aGUgY2Fub25pY2FsIG5hbWUuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdlbmVyaWMtYm9vbGVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIHR5cGUgZGVmaW5lcyBmb3VyIGRpZmZlcmVudCB2YWx1ZXMgd2hpY2ggY2FuIGRlc2lnbmF0ZQotICAgICAgICBib29sZWFuIHZhbHVlcy4gVGhpcyBpbmNsdWRlcyB2YWx1ZXMgeWVzIGFuZCBubyB3aGljaCBhcmUgCi0gICAgICAgIG5vdCBkZXNpZ25hdGVkIGJ5IHhzZDpib29sZWFuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRydWUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieWVzIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpY29uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBpY29uIHR5cGUgY29udGFpbnMgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50cwotICAgICAgICB0aGF0IHNwZWNpZnkgdGhlIGZpbGUgbmFtZXMgZm9yIHNtYWxsIGFuZCBsYXJnZSBHSUYsIEpQRUcsCi0gICAgICAgIG9yIFBORyBpY29uIGltYWdlcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYQotICAgICAgICBHVUkgdG9vbC4gCi0gICAgICAgIAotICAgICAgICBUaGUgeG1sOmxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlCi0gICAgICAgIGljb24gZmlsZSBuYW1lcyBhcmUgcHJvdmlkZWQgaW4uIEl0cyB2YWx1ZSBpcyAiZW4iIChFbmdsaXNoKQotICAgICAgICBieSBkZWZhdWx0LiAKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzbWFsbC1pY29uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICAgICAgVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLSAgICAgICAgICAgIGNvbnRhaW5pbmcgYSBzbWFsbCAoMTYgeCAxNikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKLSAgICAgICAgICAgIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgRGVwbG95bWVudAotICAgICAgICAgICAgQ29tcG9uZW50J3MgRGVwbG95bWVudCBGaWxlLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBUaGUgaW1hZ2UgbWF5IGJlIGluIHRoZSBHSUYsIEpQRUcsIG9yIFBORyBmb3JtYXQuCi0gICAgICAgICAgICBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgRXhhbXBsZToKLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsYXJnZS1pY29uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICAgICAgVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLSAgICAgICAgICAgIGNvbnRhaW5pbmcgYSBsYXJnZQotICAgICAgICAgICAgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSAKLSAgICAgICAgICAgIHBhdGggd2l0aGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQKLSAgICAgICAgICAgIEZpbGUuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRoZSBpbWFnZSBtYXkgYmUgaW4gdGhlIEdJRiwgSlBFRywgb3IgUE5HIGZvcm1hdC4KLSAgICAgICAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBFeGFtcGxlOgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGc8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5qZWN0aW9uLXRhcmdldFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBBbiBpbmplY3Rpb24gdGFyZ2V0IHNwZWNpZmllcyBhIGNsYXNzIGFuZCBhIG5hbWUgd2l0aGluCi0gICAgICAgIHRoYXQgY2xhc3MgaW50byB3aGljaCBhIHJlc291cmNlIHNob3VsZCBiZSBpbmplY3RlZC4KLSAgICAgICAgCi0gICAgICAgIFRoZSBpbmplY3Rpb24gdGFyZ2V0IGNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkCi0gICAgICAgIGNsYXNzIG5hbWUgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSBpbmplY3Rpb24uICBUaGUKLSAgICAgICAgSmF2YSBFRSBzcGVjaWZpY2F0aW9ucyBkZXNjcmliZSB3aGljaCBjbGFzc2VzIGNhbiBiZSBhbgotICAgICAgICBpbmplY3Rpb24gdGFyZ2V0LgotICAgICAgICAKLSAgICAgICAgVGhlIGluamVjdGlvbiB0YXJnZXQgbmFtZSBzcGVjaWZpZXMgdGhlIHRhcmdldCB3aXRoaW4KLSAgICAgICAgdGhlIHNwZWNpZmllZCBjbGFzcy4gIFRoZSB0YXJnZXQgaXMgZmlyc3QgbG9va2VkIGZvciBhcyBhCi0gICAgICAgIEphdmFCZWFucyBwcm9wZXJ0eSBuYW1lLiAgSWYgbm90IGZvdW5kLCB0aGUgdGFyZ2V0IGlzCi0gICAgICAgIGxvb2tlZCBmb3IgYXMgYSBmaWVsZCBuYW1lLgotICAgICAgICAKLSAgICAgICAgVGhlIHNwZWNpZmllZCByZXNvdXJjZSB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIHRhcmdldAotICAgICAgICBkdXJpbmcgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNsYXNzIGJ5IGVpdGhlciBjYWxsaW5nIHRoZQotICAgICAgICBzZXQgbWV0aG9kIGZvciB0aGUgdGFyZ2V0IHByb3BlcnR5IG9yIGJ5IHNldHRpbmcgYSB2YWx1ZQotICAgICAgICBpbnRvIHRoZSBuYW1lZCBmaWVsZC4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmplY3Rpb24tdGFyZ2V0LWNsYXNzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5qZWN0aW9uLXRhcmdldC1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpc29sYXRpb24tbGV2ZWxUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgCVRoZSBmb2xsb3dpbmcgdHJhbnNhY3Rpb24gaXNvbGF0aW9uIGxldmVscyBhcmUgYWxsb3dlZAotICAgICAgICAJKHNlZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgamF2YS5zcWwuQ29ubmVjdGlvbiBpbnRlcmZhY2UpOgotICAgICAgICBUUkFOU0FDVElPTl9SRUFEX1VOQ09NTUlUVEVECi0gICAgICAgIFRSQU5TQUNUSU9OX1JFQURfQ09NTUlUVEVECi0gICAgICAgIFRSQU5TQUNUSU9OX1JFUEVBVEFCTEVfUkVBRAotICAgICAgICBUUkFOU0FDVElPTl9TRVJJQUxJWkFCTEUKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSQU5TQUNUSU9OX1JFQURfVU5DT01NSVRURUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSQU5TQUNUSU9OX1JFQURfQ09NTUlUVEVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUkFOU0FDVElPTl9SRVBFQVRBQkxFX1JFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSQU5TQUNUSU9OX1NFUklBTElaQUJMRSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEtaWRlbnRpZmllclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgamF2YS1pZGVudGlmaWVyVHlwZSBkZWZpbmVzIGEgSmF2YSBpZGVudGlmaWVyLgotICAgICAgICBUaGUgdXNlcnMgb2YgdGhpcyB0eXBlIHNob3VsZCBmdXJ0aGVyIHZlcmlmeSB0aGF0IAotICAgICAgICB0aGUgY29udGVudCBkb2VzIG5vdCBjb250YWluIEphdmEgcmVzZXJ2ZWQga2V5d29yZHMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iKCR8X3xccHtMfSkoXHB7TH18XHB7TmR9fF98JCkqIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYXZhLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBpcyBhIGdlbmVyaWMgdHlwZSB0aGF0IGRlc2lnbmF0ZXMgYSBKYXZhIHByaW1pdGl2ZQotICAgICAgICB0eXBlIG9yIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGludGVyZmFjZS90eXBlLAotICAgICAgICBvciBhbiBhcnJheSBvZiBzdWNoIHR5cGVzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlteXHB7Wn1dKiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamRiYy11cmxUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgVGhlIGpkYmMtdXJsVHlwZSBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlIG1hcHBpbmcuCi0gICAgICAgIEl0IG11c3QgZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiA5LjMgb2YgdGhlCi0gICAgICAgIEpEQkMgU3BlY2lmaWNhdGlvbiB3aGVyZSB0aGUgZm9ybWF0IGlzOgotICAgICAgICAKLSAgICAgICAgamRiYzo8c3VicHJvdG9jb2w+OjxzdWJuYW1lPgotICAgICAgICAKLSAgICAgICAgRXhhbXBsZToKLSAgICAgICAgCi0gICAgICAgIDx1cmw+amRiYzpteXNxbDovL2xvY2FsaG9zdDozMzA3L3Rlc3RkYjwvdXJsPgotICAgICAgICAKLSAgICAgICAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJqZGJjOiguKik6KC4qKSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam5kaS1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBqbmRpLW5hbWVUeXBlIHR5cGUgZGVzaWduYXRlcyBhIEpOREkgbmFtZSBpbiB0aGUKLSAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIEEgSk5ESSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLSAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImhvbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgVGhlIGhvbWVUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mCi0gICAgICAgIGFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlLiAKLSAgICAgICAgCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgIAotICAgICAgICA8aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvaG9tZT4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaWZlY3ljbGUtY2FsbGJhY2tUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGxpZmVjeWNsZS1jYWxsYmFjayB0eXBlIHNwZWNpZmllcyBhIG1ldGhvZCBvbiBhCi0gICAgICAgIGNsYXNzIHRvIGJlIGNhbGxlZCB3aGVuIGEgbGlmZWN5Y2xlIGV2ZW50IG9jY3Vycy4KLSAgICAgICAgTm90ZSB0aGF0IGVhY2ggY2xhc3MgbWF5IGhhdmUgb25seSBvbmUgbGlmZWN5Y2xlIGNhbGxiYWNrCi0gICAgICAgIG1ldGhvZCBmb3IgYW55IGdpdmVuIGV2ZW50IGFuZCB0aGF0IHRoZSBtZXRob2QgbWF5IG5vdAotICAgICAgICBiZSBvdmVybG9hZGVkLgotICAgICAgICAKLSAgICAgICAgSWYgdGhlIGxpZmVmeWNsZS1jYWxsYmFjay1jbGFzcyBlbGVtZW50IGlzIG1pc3NpbmcgdGhlbgotICAgICAgICB0aGUgY2xhc3MgZGVmaW5pbmcgdGhlIGNhbGxiYWNrIGlzIGFzc3VtZWQgdG8gYmUgdGhlCi0gICAgICAgIGNvbXBvbmVudCBjbGFzcyBpbiBzY29wZSBhdCB0aGUgcGxhY2UgaW4gdGhlIGRlc2NyaXB0b3IKLSAgICAgICAgaW4gd2hpY2ggdGhlIGNhbGxiYWNrIGRlZmluaXRpb24gYXBwZWFycy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaWZlY3ljbGUtY2FsbGJhY2stY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlmZWN5Y2xlLWNhbGxiYWNrLW1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaXN0ZW5lclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbGlzdGVuZXJUeXBlIGluZGljYXRlcyB0aGUgZGVwbG95bWVudCBwcm9wZXJ0aWVzIGZvciBhIHdlYgotICAgICAgICBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdGVuZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZQotICAgICAgICAgICAgYXBwbGljYXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViCi0gICAgICAgICAgICBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLiBUaGUgdmFsdWUgaXMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBsaXN0ZW5lciBjbGFzcy4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbG9jYWxUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi0gICAgICAgIGVudGVycHJpc2UgYmVhbidzIGxvY2FsIGludGVyZmFjZS4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsLWhvbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGxvY2FsLWhvbWVUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZAotICAgICAgICBuYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUgaW50ZXJmYWNlLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFyYW0tdmFsdWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyB0eXBlIGlzIGEgZ2VuZXJhbCB0eXBlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVjbGFyZQotICAgICAgICBwYXJhbWV0ZXIvdmFsdWUgbGlzdHMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbS1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgICAgIHBhcmFtZXRlci4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtLXZhbHVlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEKLSAgICAgICAgICAgIHBhcmFtZXRlci4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXRoVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50cyB0aGF0IHVzZSB0aGlzIHR5cGUgZGVzaWduYXRlIGVpdGhlciBhIHJlbGF0aXZlCi0gICAgICAgIHBhdGggb3IgYW4gYWJzb2x1dGUgcGF0aCBzdGFydGluZyB3aXRoIGEgIi8iLgotICAgICAgICAKLSAgICAgICAgSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLSAgICAgICAgc2FtZSBEZXBsb3ltZW50IEZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gICAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICAgICAgICB0aGUgRGVwbG95bWVudCBGaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLAotICAgICAgICB0aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mCi0gICAgICAgIHRoZSBEZXBsb3ltZW50IEZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcwotICAgICAgICBhcmUgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0gICAgICAgIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgcGVyc2lzdGVuY2UtY29udGV4dC1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uCi0gICAgICAgIG9mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGEgcGVyc2lzdGVuY2UgY29udGV4dAotICAgICAgICBhc3NvY2lhdGVkIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLSAgICAgICAgZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mOgotICAgICAgICAKLSAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICAgICAgICAtIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0IHJlZmVyZW5jZSBuYW1lCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgcGVyc2lzdGVuY2UgdW5pdCBuYW1lLiAgSWYgbm90IHNwZWNpZmllZCwKLSAgICAgICAgdGhlIGRlZmF1bHQgcGVyc2lzdGVuY2UgdW5pdCBpcyBhc3N1bWVkLgotICAgICAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gYXMgdG8gd2hldGhlcgotICAgICAgICB0aGUgcGVyc2lzdGVuY2UgY29udGV4dCB0eXBlIGlzIFRyYW5zYWN0aW9uIG9yCi0gICAgICAgIEV4dGVuZGVkLiAgSWYgbm90IHNwZWNpZmllZCwgVHJhbnNhY3Rpb24gaXMgYXNzdW1lZC4KLSAgICAgICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIHBlcnNpc3RlbmNlIHByb3BlcnRpZXMKLSAgICAgICAgLSBvcHRpb25hbCBpbmplY3Rpb24gdGFyZ2V0cwotICAgICAgICAKLSAgICAgICAgRXhhbXBsZXM6Ci0gICAgICAgIAotICAgICAgICA8cGVyc2lzdGVuY2UtY29udGV4dC1yZWY+Ci0gICAgICAgIDxwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lPm15UGVyc2lzdGVuY2VDb250ZXh0Ci0gICAgICAgIDwvcGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZT4KLSAgICAgICAgPC9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZj4KLSAgICAgICAgCi0gICAgICAgIDxwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZj4KLSAgICAgICAgPHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWU+bXlQZXJzaXN0ZW5jZUNvbnRleHQKLSAgICAgICAgPC9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lPgotICAgICAgICA8cGVyc2lzdGVuY2UtdW5pdC1uYW1lPlBlcnNpc3RlbmNlVW5pdDEKLSAgICAgICAgPC9wZXJzaXN0ZW5jZS11bml0LW5hbWU+Ci0gICAgICAgIDxwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGU+RXh0ZW5kZWQ8L3BlcnNpc3RlbmNlLWNvbnRleHQtdHlwZT4KLSAgICAgICAgPC9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZj4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqbmRpLW5hbWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMKLSAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgcGVyc2lzdGVuY2UgY29udGV4dCByZWZlcmVuY2U7IGl0cwotICAgICAgICAgICAgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotICAgICAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lCi0gICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlcihvciBCZWFuUHJvdmlkZXIpIG1heSB1c2UgdGhlCi0gICAgICAgICAgICBmb2xsb3dpbmcgc3ludGF4IHRvIGF2b2lkIHRoZSBuZWVkIHRvIHJlbmFtZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAgdW5pdHMgdG8gaGF2ZSB1bmlxdWUgbmFtZXMgd2l0aGluIGEgSmF2YSBFRSBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBzcGVjaWZpZXMgdGhlIHBhdGhuYW1lIG9mIHRoZQotICAgICAgICAgICAgcm9vdCBvZiB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgZm9yIHRoZSByZWZlcmVuY2VkCi0gICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0IGFuZCBhcHBlbmRzIHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAgdW5pdCBzZXBhcmF0ZWQgZnJvbSB0aGUgcGF0aG5hbWUgYnkgIy4gVGhlIHBhdGhuYW1lIGlzCi0gICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgcmVmZXJlbmNpbmcgYXBwbGljYXRpb24gY29tcG9uZW50IGphciBmaWxlLiAKLSAgICAgICAgICAgIEluIHRoaXMgbWFubmVyLCBtdWx0aXBsZSBwZXJzaXN0ZW5jZSB1bml0cyB3aXRoIHRoZSBzYW1lCi0gICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0IG5hbWUgbWF5IGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQgd2hlbiB0aGUgCi0gICAgICAgICAgICBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgY2Fubm90IGNoYW5nZSBwZXJzaXN0ZW5jZSB1bml0IG5hbWVzLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtY29udGV4dC10eXBlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IHByb3BlcnRpZXMgZm9yIHRoZSBjb250YWluZXIgb3IgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgIHByb3ZpZGVyLiAgVmVuZG9yLXNwZWNpZmljIHByb3BlcnRpZXMgbWF5IGJlIGluY2x1ZGVkIGluCi0gICAgICAgICAgICB0aGUgc2V0IG9mIHByb3BlcnRpZXMuICBQcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdCByZWNvZ25pemVkCi0gICAgICAgICAgICBieSBhIHZlbmRvciBtdXN0IGJlIGlnbm9yZWQuICBFbnRyaWVzIHRoYXQgbWFrZSB1c2Ugb2YgdGhlIAotICAgICAgICAgICAgbmFtZXNwYWNlIGphdmF4LnBlcnNpc3RlbmNlIGFuZCBpdHMgc3VibmFtZXNwYWNlcyBtdXN0IG5vdAotICAgICAgICAgICAgYmUgdXNlZCBmb3IgdmVuZG9yLXNwZWNpZmljIHByb3BlcnRpZXMuICBUaGUgbmFtZXNwYWNlCi0gICAgICAgICAgICBqYXZheC5wZXJzaXN0ZW5jZSBpcyByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZSBzcGVjaWZpY2F0aW9uLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlQmFzZUdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcGVyc2lzdGVuY2UtY29udGV4dC10eXBlVHlwZSBzcGVjaWZpZXMgdGhlIHRyYW5zYWN0aW9uYWwKLSAgICAgICAgbmF0dXJlIG9mIGEgcGVyc2lzdGVuY2UgY29udGV4dCByZWZlcmVuY2UuICAKLSAgICAgICAgCi0gICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgcGVyc2lzdGVuY2UtY29udGV4dC10eXBlIGVsZW1lbnQgbXVzdCBiZQotICAgICAgICBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgVHJhbnNhY3Rpb24KLSAgICAgICAgRXh0ZW5kZWQKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb24iLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5kZWQiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFNwZWNpZmllcyBhIG5hbWUvdmFsdWUgcGFpci4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgVGhlIHBlcnNpc3RlbmNlLXVuaXQtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotICAgICAgICBvZiBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgYXNzb2NpYXRlZCB3aXRoaW4gYSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0gICAgICAgIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZjoKLSAgICAgICAgCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAgICAgICAgLSB0aGUgcGVyc2lzdGVuY2UgdW5pdCByZWZlcmVuY2UgbmFtZQotICAgICAgICAtIGFuIG9wdGlvbmFsIHBlcnNpc3RlbmNlIHVuaXQgbmFtZS4gIElmIG5vdCBzcGVjaWZpZWQsCi0gICAgICAgIHRoZSBkZWZhdWx0IHBlcnNpc3RlbmNlIHVuaXQgaXMgYXNzdW1lZC4KLSAgICAgICAgLSBvcHRpb25hbCBpbmplY3Rpb24gdGFyZ2V0cwotICAgICAgICAKLSAgICAgICAgRXhhbXBsZXM6Ci0gICAgICAgIAotICAgICAgICA8cGVyc2lzdGVuY2UtdW5pdC1yZWY+Ci0gICAgICAgIDxwZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lPm15UGVyc2lzdGVuY2VVbml0Ci0gICAgICAgIDwvcGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZT4KLSAgICAgICAgPC9wZXJzaXN0ZW5jZS11bml0LXJlZj4KLSAgICAgICAgCi0gICAgICAgIDxwZXJzaXN0ZW5jZS11bml0LXJlZj4KLSAgICAgICAgPHBlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWU+bXlQZXJzaXN0ZW5jZVVuaXQKLSAgICAgICAgPC9wZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lPgotICAgICAgICA8cGVyc2lzdGVuY2UtdW5pdC1uYW1lPlBlcnNpc3RlbmNlVW5pdDEKLSAgICAgICAgPC9wZXJzaXN0ZW5jZS11bml0LW5hbWU+Ci0gICAgICAgIDwvcGVyc2lzdGVuY2UtdW5pdC1yZWY+Ci0gICAgICAgIAotICAgICAgICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBwZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCi0gICAgICAgICAgICB0aGUgbmFtZSBvZiBhIHBlcnNpc3RlbmNlIHVuaXQgcmVmZXJlbmNlOyBpdHMKLSAgICAgICAgICAgIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLSAgICAgICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQotICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIob3IgQmVhblByb3ZpZGVyKSBtYXkgdXNlIHRoZQotICAgICAgICAgICAgZm9sbG93aW5nIHN5bnRheCB0byBhdm9pZCB0aGUgbmVlZCB0byByZW5hbWUgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgIHVuaXRzIHRvIGhhdmUgdW5pcXVlIG5hbWVzIHdpdGhpbiBhIEphdmEgRUUgYXBwbGljYXRpb24uCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgc3BlY2lmaWVzIHRoZSBwYXRobmFtZSBvZiB0aGUKLSAgICAgICAgICAgIHJvb3Qgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIGZvciB0aGUgcmVmZXJlbmNlZAotICAgICAgICAgICAgcGVyc2lzdGVuY2UgdW5pdCBhbmQgYXBwZW5kcyB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgIHVuaXQgc2VwYXJhdGVkIGZyb20gdGhlIHBhdGhuYW1lIGJ5ICMuIFRoZSBwYXRobmFtZSBpcwotICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jaW5nIGFwcGxpY2F0aW9uIGNvbXBvbmVudCBqYXIgZmlsZS4gCi0gICAgICAgICAgICBJbiB0aGlzIG1hbm5lciwgbXVsdGlwbGUgcGVyc2lzdGVuY2UgdW5pdHMgd2l0aCB0aGUgc2FtZQotICAgICAgICAgICAgcGVyc2lzdGVuY2UgdW5pdCBuYW1lIG1heSBiZSB1bmlxdWVseSBpZGVudGlmaWVkIHdoZW4gdGhlIAotICAgICAgICAgICAgQXBwbGljYXRpb24gQXNzZW1ibGVyIGNhbm5vdCBjaGFuZ2UgcGVyc2lzdGVuY2UgdW5pdCBuYW1lcy4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUJhc2VHcm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZW1vdGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgVGhlIHJlbW90ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZQotICAgICAgICBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZS4KLSAgICAgICAgCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgIAotICAgICAgICA8cmVtb3RlPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2U8L3JlbW90ZT4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmVHlwZSBpcyB1c2VkIHRvIGRlZmluZQotICAgICAgICByZXNvdXJjZS1lbnYtcmVmIGVsZW1lbnRzLiAgSXQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhCi0gICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QKLSAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLSAgICAgICAgZW52aXJvbm1lbnQuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlCi0gICAgICAgIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gb3B0aW9uYWwKLSAgICAgICAgaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUKLSAgICAgICAgZXhwZWN0ZWQgYnkgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuCi0gICAgICAgIAotICAgICAgICBJdCBhbHNvIGluY2x1ZGVzIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YKLSAgICAgICAgdGhlIG5hbWVkIHJlc291cmNlIGludG8gZmllbGRzIG9yIEphdmFCZWFucyBwcm9wZXJ0aWVzLgotICAgICAgICAKLSAgICAgICAgVGhlIHJlc291cmNlIGVudmlyb25tZW50IHR5cGUgbXVzdCBiZSBzdXBwbGllZCB1bmxlc3MgYW4KLSAgICAgICAgaW5qZWN0aW9uIHRhcmdldCBpcyBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2UgdGhlIHR5cGUKLSAgICAgICAgb2YgdGhlIHRhcmdldCBpcyB1c2VkLiAgSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUgdHlwZQotICAgICAgICBtdXN0IGJlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24KLSAgICAgICAgdGFyZ2V0LgotICAgICAgICAKLSAgICAgICAgRXhhbXBsZToKLSAgICAgICAgCi0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlCi0gICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmF4Lmptcy5RdWV1ZQotICAgICAgICA8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAKLSAgICAgICAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLSAgICAgICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLSAgICAgICAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLSAgICAgICAgICAgIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIAotICAgICAgICAgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IAotICAgICAgICAgICAgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50LgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZi10eXBlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUKLSAgICAgICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlLiAgSXQgaXMgdGhlCi0gICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IKLSAgICAgICAgICAgIGludGVyZmFjZS4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgcmVzb3VyY2UtcmVmVHlwZSBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEKLSAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0Ci0gICAgICAgIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgbWFuYWdlcgotICAgICAgICBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUsIGFuIG9wdGlvbmFsIGluZGljYXRpb24gb2YKLSAgICAgICAgdGhlIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUgZXhwZWN0ZWQgYnkgdGhlCi0gICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUsIGFuIG9wdGlvbmFsIHR5cGUgb2YgYXV0aGVudGljYXRpb24KLSAgICAgICAgKEFwcGxpY2F0aW9uIG9yIENvbnRhaW5lciksIGFuZCBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mCi0gICAgICAgIHRoZSBzaGFyZWFiaWxpdHkgb2YgY29ubmVjdGlvbnMgb2J0YWluZWQgZnJvbSB0aGUgcmVzb3VyY2UKLSAgICAgICAgKFNoYXJlYWJsZSBvciBVbnNoYXJlYWJsZSkuCi0gICAgICAgIAotICAgICAgICBJdCBhbHNvIGluY2x1ZGVzIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YKLSAgICAgICAgdGhlIG5hbWVkIHJlc291cmNlIGludG8gZmllbGRzIG9yIEphdmFCZWFucyBwcm9wZXJ0aWVzLgotICAgICAgICAKLSAgICAgICAgVGhlIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlIG11c3QgYmUgc3VwcGxpZWQgdW5sZXNzIGFuCi0gICAgICAgIGluamVjdGlvbiB0YXJnZXQgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHRoZSB0eXBlCi0gICAgICAgIG9mIHRoZSB0YXJnZXQgaXMgdXNlZC4gIElmIGJvdGggYXJlIHNwZWNpZmllZCwgdGhlIHR5cGUKLSAgICAgICAgbXVzdCBiZSBhc3NpZ25tZW50IGNvbXBhdGlibGUgd2l0aCB0aGUgdHlwZSBvZiB0aGUgaW5qZWN0aW9uCi0gICAgICAgIHRhcmdldC4KLSAgICAgICAgCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgIAotICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8cmVzLXJlZi1uYW1lPmpkYmMvRW1wbG95ZWVBcHBEQjwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAKLSAgICAgICAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1yZWYtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotICAgICAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLgotICAgICAgICAgICAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICAKLSAgICAgICAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgRmlsZS4gCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXMtdHlwZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgcmVzLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGEKLSAgICAgICAgICAgIHNvdXJjZS4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBmdWxseSBxdWFsaWZpZWQKLSAgICAgICAgICAgIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IgaW50ZXJmYWNlCi0gICAgICAgICAgICBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGF0YSBzb3VyY2UuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXMtYXV0aCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cmVzLWF1dGhUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1zaGFyaW5nLXNjb3BlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyZXMtc2hhcmluZy1zY29wZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlR3JvdXAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzLWF1dGhUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlcy1hdXRoVHlwZSBzcGVjaWZpZXMgd2hldGhlciB0aGUgRGVwbG95bWVudCBDb21wb25lbnQKLSAgICAgICAgY29kZSBzaWducyBvbiBwcm9ncmFtbWF0aWNhbGx5IHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyLCBvcgotICAgICAgICB3aGV0aGVyIHRoZSBDb250YWluZXIgd2lsbCBzaWduIG9uIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyCi0gICAgICAgIG9uIGJlaGFsZiBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQuIEluIHRoZSBsYXR0ZXIgY2FzZSwKLSAgICAgICAgdGhlIENvbnRhaW5lciB1c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlCi0gICAgICAgIERlcGxveWVyLgotICAgICAgICAKLSAgICAgICAgVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotICAgICAgICAKLSAgICAgICAgQXBwbGljYXRpb24KLSAgICAgICAgQ29udGFpbmVyCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lciIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzLXNoYXJpbmctc2NvcGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHJlcy1zaGFyaW5nLXNjb3BlIHR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgY29ubmVjdGlvbnMKLSAgICAgICAgb2J0YWluZWQgdGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uCi0gICAgICAgIGZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZSBzaGFyZWQuIFRoZSB2YWx1ZSwgaWYgc3BlY2lmaWVkLAotICAgICAgICBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLSAgICAgICAgCi0gICAgICAgIFNoYXJlYWJsZQotICAgICAgICBVbnNoYXJlYWJsZQotICAgICAgICAKLSAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZWFibGUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zaGFyZWFibGUiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJ1bi1hc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgcnVuLWFzVHlwZSBzcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZQotICAgICAgICB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIGEgY29tcG9uZW50LiBJdCBjb250YWlucyBhbiAKLSAgICAgICAgb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnJvbGUtbmFtZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm9sZS1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSByb2xlLW5hbWVUeXBlIGRlc2lnbmF0ZXMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotICAgICAgICAKLSAgICAgICAgVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhIHRva2VuLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1yb2xlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgIFRoZSBzZWN1cml0eS1yb2xlVHlwZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNlY3VyaXR5Ci0gICAgICAgIHJvbGUuIFRoZSBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mCi0gICAgICAgIHRoZSBzZWN1cml0eSByb2xlLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZS4KLSAgICAgICAgCi0gICAgICAgIEV4YW1wbGU6Ci0gICAgICAgIAotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGlzIHJvbGUgaW5jbHVkZXMgYWxsIGVtcGxveWVlcyB3aG8gYXJlIGF1dGhvcml6ZWQKLSAgICAgICAgdG8gYWNjZXNzIHRoZSBlbXBsb3llZSBzZXJ2aWNlIGFwcGxpY2F0aW9uLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cm9sZS1uYW1lPmVtcGxveWVlPC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnJvbGUtbmFtZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHNlY3VyaXR5LXJvbGUtcmVmVHlwZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYQotICAgICAgICBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSBpbiBhIGNvbXBvbmVudCdzIG9yIGEKLSAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBjb2RlLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4KLSAgICAgICAgb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSBzZWN1cml0eSByb2xlIG5hbWUgdXNlZCBpbiB0aGUKLSAgICAgICAgY29kZSwgYW5kIGFuIG9wdGlvbmFsIGxpbmsgdG8gYSBzZWN1cml0eSByb2xlLiBJZiB0aGUKLSAgICAgICAgc2VjdXJpdHkgcm9sZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgRGVwbG95ZXIgbXVzdCBjaG9vc2UgYW4KLSAgICAgICAgYXBwcm9wcmlhdGUgc2VjdXJpdHkgcm9sZS4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cm9sZS1uYW1lVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgU3RyaW5nIHVzZWQKLSAgICAgICAgICAgIGFzIHRoZSBwYXJhbWV0ZXIgdG8gdGhlIAotICAgICAgICAgICAgRUpCQ29udGV4dC5pc0NhbGxlckluUm9sZShTdHJpbmcgcm9sZU5hbWUpIG1ldGhvZCBvciB0aGUKLSAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdC5pc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIG1ldGhvZC4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbGluayIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cm9sZS1uYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgcm9sZS1saW5rIGVsZW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gYSBkZWZpbmVkCi0gICAgICAgICAgICBzZWN1cml0eSByb2xlLiBUaGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBjb250YWluCi0gICAgICAgICAgICB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlCi0gICAgICAgICAgICBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZFFOYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpRTmFtZS4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOlFOYW1lIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZEJvb2xlYW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOmJvb2xlYW4uCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZE5NVE9LRU5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOk5NVE9LRU4uCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZEFueVVSSVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6YW55VVJJLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6YW55VVJJIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZEludGVnZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOmludGVnZXIuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZFBvc2l0aXZlSW50ZWdlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6cG9zaXRpdmVJbnRlZ2VyLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6cG9zaXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZE5vbk5lZ2F0aXZlSW50ZWdlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6bm9uTmVnYXRpdmVJbnRlZ2VyLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6bm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZFN0cmluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6c3RyaW5nLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cmluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgaXMgYSBzcGVjaWFsIHN0cmluZyBkYXRhdHlwZSB0aGF0IGlzIGRlZmluZWQgYnkgSmF2YSBFRSBhcwotICAgICAgICBhIGJhc2UgdHlwZSBmb3IgZGVmaW5pbmcgY29sbGFwc2VkIHN0cmluZ3MuIFdoZW4gc2NoZW1hcwotICAgICAgICByZXF1aXJlIHRyYWlsaW5nL2xlYWRpbmcgc3BhY2UgZWxpbWluYXRpb24gYXMgd2VsbCBhcwotICAgICAgICBjb2xsYXBzaW5nIHRoZSBleGlzdGluZyB3aGl0ZXNwYWNlLCB0aGlzIGJhc2UgdHlwZSBtYXkgYmUKLSAgICAgICAgdXNlZC4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRydWUtZmFsc2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBzaW1wbGUgdHlwZSBkZXNpZ25hdGVzIGEgYm9vbGVhbiB3aXRoIG9ubHkgdHdvCi0gICAgICAgIHBlcm1pc3NpYmxlIHZhbHVlcwotICAgICAgICAKLSAgICAgICAgLSB0cnVlCi0gICAgICAgIC0gZmFsc2UKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6eHNkQm9vbGVhblR5cGUiPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9Iih0cnVlfGZhbHNlKSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXJsLXBhdHRlcm5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHVybC1wYXR0ZXJuVHlwZSBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlIG1hcHBpbmcuCi0gICAgICAgIEl0IG11c3QgZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMS4yIG9mIHRoZQotICAgICAgICBTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLiBUaGlzIHBhdHRlcm4gaXMgYXNzdW1lZCB0byBiZSBpbgotICAgICAgICBVUkwtZGVjb2RlZCBmb3JtIGFuZCBtdXN0IG5vdCBjb250YWluIENSKCN4RCkgb3IgTEYoI3hBKS4KLSAgICAgICAgSWYgaXQgY29udGFpbnMgdGhvc2UgY2hhcmFjdGVycywgdGhlIGNvbnRhaW5lciBtdXN0IGluZm9ybQotICAgICAgICB0aGUgZGV2ZWxvcGVyIHdpdGggYSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlLgotICAgICAgICBUaGUgY29udGFpbmVyIG11c3QgcHJlc2VydmUgYWxsIGNoYXJhY3RlcnMgaW5jbHVkaW5nIHdoaXRlc3BhY2VzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvblR5cGUgc3BlY2lmaWVzIGEgbWVzc2FnZQotICAgICAgICBkZXN0aW5hdGlvbi4gVGhlIGxvZ2ljYWwgZGVzdGluYXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMKLSAgICAgICAgZWxlbWVudCBpcyBtYXBwZWQgdG8gYSBwaHlzaWNhbCBkZXN0aW5hdGlvbiBieSB0aGUgRGVwbG95ZXIuCi0gICAgICAgIAotICAgICAgICBUaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiBlbGVtZW50IGNvbnRhaW5zOiAKLSAgICAgICAgCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAgICAgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5LW5hbWUKLSAgICAgICAgLSBhbiBvcHRpb25hbCBpY29uCi0gICAgICAgIC0gYSBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWUgd2hpY2ggbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgYW1vbmcgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lcyB3aXRoaW4gdGhlIHNhbWUgCi0gICAgICAgIERlcGxveW1lbnQgRmlsZS4gCi0gICAgICAgIC0gYW4gb3B0aW9uYWwgbWFwcGVkIG5hbWUKLSAgICAgICAgLSBhbiBvcHRpb25hbCBsb29rdXAgbmFtZQotICAgICAgICAKLSAgICAgICAgRXhhbXBsZTogCi0gICAgICAgIAotICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbj4KLSAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZT5Db3Jwb3JhdGVTdG9ja3MKLSAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+Ci0gICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbj4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYQotICAgICAgICAgICAgbmFtZSBmb3IgYSBtZXNzYWdlIGRlc3RpbmF0aW9uLiAgVGhpcyBuYW1lIG11c3QgYmUKLSAgICAgICAgICAgIHVuaXF1ZSBhbW9uZyB0aGUgbmFtZXMgb2YgbWVzc2FnZSBkZXN0aW5hdGlvbnMKLSAgICAgICAgICAgIHdpdGhpbiB0aGUgRGVwbG95bWVudCBGaWxlLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgQSBwcm9kdWN0IHNwZWNpZmljIG5hbWUgdGhhdCB0aGlzIG1lc3NhZ2UgZGVzdGluYXRpb24KLSAgICAgICAgICAgIHNob3VsZCBiZSBtYXBwZWQgdG8uICBFYWNoIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmCi0gICAgICAgICAgICBlbGVtZW50IHRoYXQgcmVmZXJlbmNlcyB0aGlzIG1lc3NhZ2UgZGVzdGluYXRpb24gd2lsbAotICAgICAgICAgICAgZGVmaW5lIGEgbmFtZSBpbiB0aGUgbmFtZXNwYWNlIG9mIHRoZSByZWZlcmVuY2luZwotICAgICAgICAgICAgY29tcG9uZW50IG9yIGluIG9uZSBvZiB0aGUgb3RoZXIgcHJlZGVmaW5lZCBuYW1lc3BhY2VzLiAKLSAgICAgICAgICAgIE1hbnkgYXBwbGljYXRpb24gc2VydmVycyBwcm92aWRlIGEgd2F5IHRvIG1hcCB0aGVzZQotICAgICAgICAgICAgbG9jYWwgbmFtZXMgdG8gbmFtZXMgb2YgcmVzb3VyY2VzIGtub3duIHRvIHRoZQotICAgICAgICAgICAgYXBwbGljYXRpb24gc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbAotICAgICAgICAgICAgSk5ESSBuYW1lLCBidXQgbWF5IGJlIGEgbmFtZSBvZiBhbnkgZm9ybS4gIEVhY2ggb2YgdGhlCi0gICAgICAgICAgICBsb2NhbCBuYW1lcyBzaG91bGQgYmUgbWFwcGVkIHRvIHRoaXMgc2FtZSBnbG9iYWwgbmFtZS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55Ci0gICAgICAgICAgICBwYXJ0aWN1bGFyIGZvcm0gb3IgdHlwZSBvZiBtYXBwZWQgbmFtZSwgbm9yIHRoZSBhYmlsaXR5Ci0gICAgICAgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCi0gICAgICAgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCi0gICAgICAgICAgICB1c2Ugb2YgYSBtYXBwZWQgbmFtZSBpcyBwb3J0YWJsZS4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxvb2t1cC1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBKTkRJIG5hbWUgdG8gYmUgbG9va2VkIHVwIHRvIHJlc29sdmUgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24uCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotICAgICAgICBvZiBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhIG1lc3NhZ2UgZGVzdGluYXRpb24KLSAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gRGVwbG95bWVudCBDb21wb25lbnQncwotICAgICAgICBlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6Ci0gICAgICAgIAotICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gICAgICAgIC0gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUKLSAgICAgICAgLSBhbiBvcHRpb25hbCBtZXNzYWdlIGRlc3RpbmF0aW9uIHR5cGUKLSAgICAgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIGFzIHRvIHdoZXRoZXIKLSAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGlzIHVzZWQgZm9yIAotICAgICAgICBjb25zdW1pbmcgb3IgcHJvZHVjaW5nIG1lc3NhZ2VzLCBvciBib3RoLgotICAgICAgICBpZiBub3Qgc3BlY2lmaWVkLCAiYm90aCIgaXMgYXNzdW1lZC4KLSAgICAgICAgLSBhbiBvcHRpb25hbCBsaW5rIHRvIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uCi0gICAgICAgIC0gb3B0aW9uYWwgaW5qZWN0aW9uIHRhcmdldHMKLSAgICAgICAgCi0gICAgICAgIFRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHR5cGUgbXVzdCBiZSBzdXBwbGllZCB1bmxlc3MgYW4KLSAgICAgICAgaW5qZWN0aW9uIHRhcmdldCBpcyBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2UgdGhlIHR5cGUKLSAgICAgICAgb2YgdGhlIHRhcmdldCBpcyB1c2VkLiAgSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUgdHlwZQotICAgICAgICBtdXN0IGJlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24KLSAgICAgICAgdGFyZ2V0LgotICAgICAgICAKLSAgICAgICAgRXhhbXBsZXM6Ci0gICAgICAgIAotICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWY+Ci0gICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlCi0gICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZT4KLSAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT5qYXZheC5qbXMuUXVldWUKLSAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+Ci0gICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPkNvbnN1bWVzCi0gICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZT4KLSAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tbGluaz5Db3Jwb3JhdGVTdG9ja3MKLSAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+Ci0gICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWY+Ci0gICAgICAgIAotICAgICAgICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCi0gICAgICAgICAgICB0aGUgbmFtZSBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMKLSAgICAgICAgICAgIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLSAgICAgICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIHNwZWNpZmllcyB0aGUgdXNlIG9mIHRoZQotICAgICAgICBtZXNzYWdlIGRlc3RpbmF0aW9uIGluZGljYXRlZCBieSB0aGUgcmVmZXJlbmNlLiAgVGhlIHZhbHVlCi0gICAgICAgIGluZGljYXRlcyB3aGV0aGVyIG1lc3NhZ2VzIGFyZSBjb25zdW1lZCBmcm9tIHRoZSBtZXNzYWdlCi0gICAgICAgIGRlc3RpbmF0aW9uLCBwcm9kdWNlZCBmb3IgdGhlIGRlc3RpbmF0aW9uLCBvciBib3RoLiAgVGhlCi0gICAgICAgIEFzc2VtYmxlciBtYWtlcyB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbiBpbiBsaW5raW5nIHByb2R1Y2VycwotICAgICAgICBvZiBhIGRlc3RpbmF0aW9uIHdpdGggaXRzIGNvbnN1bWVycy4KLSAgICAgICAgCi0gICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSBlbGVtZW50IG11c3QgYmUKLSAgICAgICAgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIENvbnN1bWVzCi0gICAgICAgIFByb2R1Y2VzCi0gICAgICAgIENvbnN1bWVzUHJvZHVjZXMKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXMiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjZXMiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXNQcm9kdWNlcyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8IVtDREFUQVtbCi0gICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIHNwZWNpZmllcyB0aGUgdHlwZSBvZgotICAgICAgICB0aGUgZGVzdGluYXRpb24uIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgSmF2YSBpbnRlcmZhY2UKLSAgICAgICAgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlc3RpbmF0aW9uLgotICAgICAgICAKLSAgICAgICAgRXhhbXBsZTogCi0gICAgICAgIAotICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZQotICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT4KLSAgICAgICAgCi0gICAgICAgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUgaXMgdXNlZCB0byBsaW5rIGEgbWVzc2FnZQotICAgICAgICBkZXN0aW5hdGlvbiByZWZlcmVuY2Ugb3IgbWVzc2FnZS1kcml2ZW4gYmVhbiB0byBhIG1lc3NhZ2UKLSAgICAgICAgZGVzdGluYXRpb24uCi0gICAgICAgIAotICAgICAgICBUaGUgQXNzZW1ibGVyIHNldHMgdGhlIHZhbHVlIHRvIHJlZmxlY3QgdGhlIGZsb3cgb2YgbWVzc2FnZXMKLSAgICAgICAgYmV0d2VlbiBwcm9kdWNlcnMgYW5kIGNvbnN1bWVycyBpbiB0aGUgYXBwbGljYXRpb24uCi0gICAgICAgIAotICAgICAgICBUaGUgdmFsdWUgbXVzdCBiZSB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIG9mIGEgbWVzc2FnZQotICAgICAgICBkZXN0aW5hdGlvbiBpbiB0aGUgc2FtZSBEZXBsb3ltZW50IEZpbGUgb3IgaW4gYW5vdGhlcgotICAgICAgICBEZXBsb3ltZW50IEZpbGUgaW4gdGhlIHNhbWUgSmF2YSBFRSBhcHBsaWNhdGlvbiB1bml0LgotICAgICAgICAKLSAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIHZhbHVlIG1heSBiZSBjb21wb3NlZCBvZiBhIHBhdGggbmFtZQotICAgICAgICBzcGVjaWZ5aW5nIGEgRGVwbG95bWVudCBGaWxlIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZWQKLSAgICAgICAgbWVzc2FnZSBkZXN0aW5hdGlvbiB3aXRoIHRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgb2YgdGhlCi0gICAgICAgIGRlc3RpbmF0aW9uIGFwcGVuZGVkIGFuZCBzZXBhcmF0ZWQgZnJvbSB0aGUgcGF0aCBuYW1lIGJ5Ci0gICAgICAgICIjIi4gVGhlIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgRGVwbG95bWVudCBGaWxlCi0gICAgICAgIGNvbnRhaW5pbmcgRGVwbG95bWVudCBDb21wb25lbnQgdGhhdCBpcyByZWZlcmVuY2luZyB0aGUKLSAgICAgICAgbWVzc2FnZSBkZXN0aW5hdGlvbi4gIFRoaXMgYWxsb3dzIG11bHRpcGxlIG1lc3NhZ2UKLSAgICAgICAgZGVzdGluYXRpb25zIHdpdGggdGhlIHNhbWUgbmFtZSB0byBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4Y2IxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDc0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjEuMiI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpamF2YWVlX3dlYl9zZXJ2aWNlc18xXzIueHNkcwkxLjE4IDAyLzEzLzA2Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gICAgICBVLlMuQQotICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBWwotCi0JVGhlIHdlYnNlcnZpY2VzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBmb3IgdGhlIHdlYiBzZXJ2aWNlcwotCWRlcGxveW1lbnQgZGVzY3JpcHRvci4gIEl0IHNwZWNpZmllcyB0aGUgc2V0IG9mIHdlYiBzZXJ2aWNlCi0JZGVzY3JpcHRpb25zIHRoYXQgYXJlIHRvIGJlIGRlcGxveWVkIGludG8gdGhlIEphdmEgRUUgQXBwbGljYXRpb24KLQlTZXJ2ZXIgYW5kIHRoZSBkZXBlbmRlbmNpZXMgdGhleSBoYXZlIG9uIGNvbnRhaW5lciByZXNvdXJjZXMgYW5kCi0Jc2VydmljZXMuICBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgbmFtZWQKLQkiTUVUQS1JTkYvd2Vic2VydmljZXMueG1sIiBpbiB0aGUgd2ViIHNlcnZpY2VzJyBqYXIgZmlsZS4KLQotCVVzZWQgaW46IHdlYnNlcnZpY2VzLnhtbAotCi0JQWxsIHdlYnNlcnZpY2VzIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZSB0aGUKLQl3ZWJzZXJ2aWNlcyBzY2hlbWEgYnkgdXNpbmcgdGhlIEphdmEgRUUgbmFtZXNwYWNlOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0KLQlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSB2ZXJzaW9uCi0JZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8d2Vic2VydmljZXMgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0JCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2QiCi0JICAgICAgdmVyc2lvbj0iMS4yIj4KLQkgICAgICAuLi4KLQkgICAgPC93ZWJzZXJ2aWNlcz4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZiB0aGUKLQlzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIHRoZSBKYXZhIEVFCi0JbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2QKLQotCV1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSmF2YSBFRQotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0gICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0Jc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLQlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLQlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV81LnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0id2Vic2VydmljZXMiIHR5cGU9ImphdmFlZTp3ZWJzZXJ2aWNlc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3ZWJzZXJ2aWNlcyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgZm9yIHRoZSB3ZWIgc2VydmljZXMKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBJdCBzcGVjaWZpZXMgdGhlIHNldCBvZiB3ZWIgc2VydmljZQotCWRlc2NyaXB0aW9ucyB0aGF0IGFyZSB0byBiZSBkZXBsb3llZCBpbnRvIHRoZSBKYXZhIEVFIEFwcGxpY2F0aW9uIFNlcnZlcgotCWFuZCB0aGUgZGVwZW5kZW5jaWVzIHRoZXkgaGF2ZSBvbiBjb250YWluZXIgcmVzb3VyY2VzIGFuZCBzZXJ2aWNlcy4KLQotCVVzZWQgaW46IHdlYnNlcnZpY2VzLnhtbAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmtleSBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUgaWRlbnRpZmllcyB0aGUgY29sbGVjdGlvbiBvZgotCSAgcG9ydC1jb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIFdTREwgZmlsZSBhbmQgSkFYLVJQQyBtYXBwaW5nLiBUaGUKLQkgIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTp3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6d2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lIi8+Ci0gICAgPC94c2Q6a2V5PgotICA8L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoYW5kbGVyLWNoYWluVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgaGFuZGxlci1jaGFpbiBlbGVtZW50IGRlZmluZXMgdGhlIGhhbmRsZXJjaGFpbi4KLSAgICAgIEhhbmRsZXJjaGFpbiBjYW4gYmUgZGVmaW5lZCBzdWNoIHRoYXQgdGhlIGhhbmRsZXJzIGluIHRoZQotICAgICAgaGFuZGxlcmNoYWluIG9wZXJhdGUsYWxsIHBvcnRzIG9mIGEgc2VydmljZSwgb24gYSBzcGVjaWZpYwotICAgICAgcG9ydCBvciBvbiBhIGxpc3Qgb2YgcHJvdG9jb2wtYmluZGluZ3MuIFRoZSBjaG9pY2Ugb2YgZWxlbWVudHMKLSAgICAgIHNlcnZpY2UtbmFtZS1wYXR0ZXJuLCBwb3J0LW5hbWUtcGF0dGVybiBhbmQgcHJvdG9jb2wtYmluZGluZ3MKLSAgICAgIGFyZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgaGFuZGxlcnMgaW4gaGFuZGxlci1jaGFpbiBhcmUKLSAgICAgIGZvciBhIHNlcnZpY2UsIHBvcnQgb3IgcHJvdG9jb2wgYmluZGluZy4gSWYgbm9uZSBvZiB0aGVzZQotICAgICAgY2hvaWNlcyBhcmUgc3BlY2lmaWVkIHdpdGggdGhlIGhhbmRsZXItY2hhaW4gZWxlbWVudCB0aGVuIHRoZQotICAgICAgaGFuZGxlcnMgc3BlY2lmaWVkIGluIHRoZSBoYW5kbGVyLWNoYWluIHdpbGwgYmUgYXBwbGllZCBvbgotICAgICAgZXZlcnl0aGluZy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLQotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtbmFtZS1wYXR0ZXJuIgotCQkgICAgICB0eXBlPSJqYXZhZWU6cW5hbWUtcGF0dGVybiIgLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LW5hbWUtcGF0dGVybiIKLQkJICAgICAgdHlwZT0iamF2YWVlOnFuYW1lLXBhdHRlcm4iIC8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvdG9jb2wtYmluZGluZ3MiCi0JCSAgICAgIHR5cGU9ImphdmFlZTpwcm90b2NvbC1iaW5kaW5nTGlzdFR5cGUiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXIiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBvcnQtY29tcG9uZW50X2hhbmRsZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoYW5kbGVyLWNoYWluc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGhhbmRsZXItY2hhaW5zIGVsZW1lbnQgZGVmaW5lcyB0aGUgaGFuZGxlcmNoYWlucyBhc3NvY2lhdGVkCi0gICAgICB3aXRoIHRoaXMgc2VydmljZSBvciBzZXJ2aWNlIGVuZHBvaW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItY2hhaW4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmhhbmRsZXItY2hhaW5UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3J0LWNvbXBvbmVudFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBwb3J0LWNvbXBvbmVudCBlbGVtZW50IGFzc29jaWF0ZXMgYSBXU0RMIHBvcnQgd2l0aCBhIHdlYiBzZXJ2aWNlCi0JaW50ZXJmYWNlIGFuZCBpbXBsZW1lbnRhdGlvbi4gIEl0IGRlZmluZXMgdGhlIG5hbWUgb2YgdGhlIHBvcnQgYXMgYQotCWNvbXBvbmVudCwgb3B0aW9uYWwgZGVzY3JpcHRpb24sIG9wdGlvbmFsIGRpc3BsYXkgbmFtZSwgb3B0aW9uYWwgaWNvbmljCi0JcmVwcmVzZW50YXRpb25zLCBXU0RMIHBvcnQgUU5hbWUsIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlLCBTZXJ2aWNlCi0JSW1wbGVtZW50YXRpb24gQmVhbi4KLQotCVRoaXMgZWxlbWVudCBhbHNvIGFzc29jaWF0ZXMgYSBXU0RMIHNlcnZpY2Ugd2l0aCBhIEpBWC1XUyBQcm92aWRlcgotCWltcGxlbWVudGF0aW9uLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmRpc3BsYXktbmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLQkJICAgdHlwZT0iamF2YWVlOmljb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtY29tcG9uZW50LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgcG9ydC1jb21wb25lbnQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhIHBvcnQgY29tcG9uZW50J3MKLQkgICAgICBuYW1lLiAgVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZSBtb2R1bGUgcHJvZHVjZXIgdG8gbmFtZQotCSAgICAgIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGJlYW4gaW4gdGhlIG1vZHVsZSdzIGRlcGxveW1lbnQKLQkgICAgICBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSBhbW9uZyB0aGUgcG9ydCBjb21wb25lbnQKLQkgICAgICBuYW1lcyBkZWZpbmVkIGluIHRoZSBzYW1lIG1vZHVsZS4KLQotCSAgICAgIFVzZWQgaW46IHBvcnQtY29tcG9uZW50Ci0KLQkgICAgICBFeGFtcGxlOgotCQkgICAgICA8cG9ydC1jb21wb25lbnQtbmFtZT5FbXBsb3llZVNlcnZpY2UKLQkJICAgICAgPC9wb3J0LWNvbXBvbmVudC1uYW1lPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtc2VydmljZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFFOYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBuYW1lIHNwYWNlIGFuZCBsb2NhbCBuYW1lIHBhcnQgb2YgdGhlIFdTREwKLQkgICAgc2VydmljZSBRTmFtZS4gVGhpcyBpcyByZXF1aXJlZCB0byBiZSBzcGVjaWZpZWQgZm9yCi0JICAgIHBvcnQgY29tcG9uZW50cyB0aGF0IGFyZSBKQVgtV1MgUHJvdmlkZXIgaW1wbGVtZW50YXRpb25zLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtcG9ydCIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFFOYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBuYW1lIHNwYWNlIGFuZCBsb2NhbCBuYW1lIHBhcnQgb2YgdGhlIFdTREwKLQkgICAgcG9ydCBRTmFtZS4gVGhpcyBpcyBub3QgcmVxdWlyZWQgdG8gYmUgc3BlY2lmaWVkIGZvciBwb3J0Ci0JICAgIGNvbXBvbmVudHMgdGhhdCBhcmUgSkFYLVdTIFByb3ZpZGVyIGltcGxlbWVudGF0aW9ucwotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZS1tdG9tIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBVc2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIFNPQVAgTVRPTS9YT1AgbWVjaGFuaXNtIGZvciBhbgotICAgICAgICAgICAgZW5kcG9pbnQgaW1wbGVtZW50YXRpb24uCi0KLQkgICAgTm90IHRvIGJlIHNwZWNpZmllZCBmb3IgSkFYLVJQQyBydW50aW1lCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvdG9jb2wtYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cHJvdG9jb2wtYmluZGluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IHRoZSBwcm90b2NvbCBiaW5kaW5nIHVzZWQgYnkgdGhlIHBvcnQtY29tcG9uZW50LgotCSAgICBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgZGVmYXVsdCBiaW5kaW5nIGlzCi0gICAgICAgICAgICB1c2VkIChTT0FQIDEuMSBvdmVyIEhUVFApCi0KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UgZWxlbWVudCBjb250YWlucyB0aGUKLQkgICAgICBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgcG9ydCBjb21wb25lbnQncyBTZXJ2aWNlIEVuZHBvaW50Ci0JICAgICAgSW50ZXJmYWNlLgotCi0JICAgICAgVXNlZCBpbjogcG9ydC1jb21wb25lbnQKLQotCSAgICAgIEV4YW1wbGU6Ci0JCSAgICAgIDxyZW1vdGU+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZTwvcmVtb3RlPgotCi0JICAgICAgVGhpcyBtYXkgbm90IGJlIHNwZWNpZmllZCBpbiBjYXNlIHRoZXJlIGlzIG5vIFNlcnZpY2UKLQkgICAgICBFbnBvaW50IEludGVyZmFjZSBhcyBpcyB0aGUgY2FzZSB3aXRoIGRpcmVjdGx5IHVzaW5nIGFuCi0JICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3Mgd2l0aCB0aGUgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbi4KLQotCSAgICAgIFdoZW4gdGhlIHBvcnQgY29tcG9uZW50IGlzIGEgUHJvdmlkZXIgaW1wbGVtZW50YXRpb24KLQkgICAgICB0aGlzIGlzIG5vdCBzcGVjaWZpZWQuCi0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1pbXBsLWJlYW4iCi0JCSAgIHR5cGU9ImphdmFlZTpzZXJ2aWNlLWltcGwtYmVhblR5cGUiLz4KLQotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXIiCi0JCSAgICAgdHlwZT0iamF2YWVlOnBvcnQtY29tcG9uZW50X2hhbmRsZXJUeXBlIgotCQkgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCSBUbyBiZSB1c2VkIHdpdGggSkFYLVJQQyBiYXNlZCBydW50aW1lIG9ubHkuCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItY2hhaW5zIgotCQkgICAgIHR5cGU9ImphdmFlZTpoYW5kbGVyLWNoYWluc1R5cGUiCi0JCSAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCSBUbyBiZSB1c2VkIHdpdGggSkFYLVdTIGJhc2VkIHJ1bnRpbWUgb25seS4KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOmNob2ljZT4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvcnQtY29tcG9uZW50X2hhbmRsZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuIGFjY2VzcyB0aGUKLQlpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4KLQotCVVzZWQgaW46IHBvcnQtY29tcG9uZW50Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotCSAgICBtb2R1bGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHRoZSBoYW5kbGVyIGltcGxlbWVudGF0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iCi0JCSAgIHR5cGU9ImphdmFlZTpwYXJhbS12YWx1ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvYXAtaGVhZGVyIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkUU5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgUU5hbWUgb2YgYSBTT0FQIGhlYWRlciB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoZQotCSAgICBoYW5kbGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvYXAtcm9sZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzb2FwLXJvbGUgZWxlbWVudCBjb250YWlucyBhIFNPQVAgYWN0b3IgZGVmaW5pdGlvbiB0aGF0IHRoZQotCSAgICBIYW5kbGVyIHdpbGwgcGxheSBhcyBhIHJvbGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwcm90b2NvbC1VUklBbGlhc1R5cGUiPgotICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICBEZWZpbmVzIHRoZSB0eXBlIHRoYXQgaXMgdXNlZCBmb3Igc3BlY2lmeWluZyB0b2tlbnMgdGhhdAotCSAgIHN0YXJ0IHdpdGggIyMgd2hpY2ggYXJlIHVzZWQgdG8gYWxpYXMgZXhpc3Rpbmcgc3RhbmRhcmQKLQkgICBwcm90b2NvbCBiaW5kaW5ncyBhbmQgc3VwcG9ydCBhbGlhc2VzIGZvciBuZXcgc3RhbmRhcmQKLQkgICBiaW5kaW5nIFVSSXMgdGhhdCBhcmUgaW50cm9kdWNlZCBpbiBmdXR1cmUgc3BlY2lmaWNhdGlvbnMuCi0KLQkgICBUaGUgZm9sbG93aW5nIHRva2VucyBhbGlhcyB0aGUgc3RhbmRhcmQgcHJvdG9jb2wgYmluZGluZwotCSAgIFVSSXM6Ci0KLQkgICAjI1NPQVAxMV9IVFRQID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC9odHRwIgotCSAgICMjU09BUDExX0hUVFBfTVRPTSA9Ci0gICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvaHR0cD9tdG9tPXRydWUiCi0gICAgICAgICAgICMjU09BUDEyX0hUVFAgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvIgotICAgICAgICAgICAjI1NPQVAxMl9IVFRQX01UT00gPQotCQkgImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC9iaW5kaW5ncy9IVFRQLz9tdG9tPXRydWUiCi0gICAgICAgICAgICMjWE1MX0hUVFAgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2h0dHAiCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IiMjLisiLz4KLSAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icHJvdG9jb2wtYmluZGluZ0xpc3RUeXBlIj4KLSAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgRGVmaW5lcyB0aGUgdHlwZSB1c2VkIGZvciBzcGVjaWZ5aW5nIGEgbGlzdCBvZgotCSAgIHByb3RvY29sLWJpbmRpbmdUeXBlKHMpLiBGb3IgZS5nLgotCi0JICAgICMjU09BUDExX0hUVFAgIyNTT0FQMTJfSFRUUCAjI1hNTF9IVFRQCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpsaXN0IGl0ZW1UeXBlPSJqYXZhZWU6cHJvdG9jb2wtYmluZGluZ1R5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwcm90b2NvbC1iaW5kaW5nVHlwZSI+Ci0gICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgIERlZmluZXMgdGhlIHR5cGUgdXNlZCBmb3Igc3BlY2lmeWluZyB0aGUgVVJJIGZvciB0aGUKLQkgICBwcm90b2NvbCBiaW5kaW5nIHVzZWQgYnkgdGhlIHBvcnQtY29tcG9uZW50LiAgRm9yCi0JICAgcG9ydGFiaWxpdHkgb25lIGNvdWxkIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB0b2tlbnMgdGhhdAotCSAgIGFsaWFzIHRoZSBzdGFuZGFyZCBiaW5kaW5nIHR5cGVzOgotCi0JICAgICMjU09BUDExX0hUVFAKLQkgICAgIyNTT0FQMTFfSFRUUF9NVE9NCi0JICAgICMjU09BUDEyX0hUVFAKLQkgICAgIyNTT0FQMTJfSFRUUF9NVE9NCi0JICAgICMjWE1MX0hUVFAKLQotCSAgIE90aGVyIHNwZWNpZmljYXRpb25zIGNvdWxkIGRlZmluZSB0b2tlbnMgdGhhdCBzdGFydCB3aXRoICMjCi0JICAgdG8gYWxpYXMgbmV3IHN0YW5kYXJkIGJpbmRpbmcgVVJJcyB0aGF0IGFyZSBpbnRyb2R1Y2VkLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6dW5pb24gbWVtYmVyVHlwZXM9InhzZDphbnlVUkkgamF2YWVlOnByb3RvY29sLVVSSUFsaWFzVHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InFuYW1lLXBhdHRlcm4iPgotICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgIFRoaXMgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBRTmFtZSBwYXR0ZXJuIGluIHRoZQotCSAgICAgYXR0cmlidXRlIHNlcnZpY2UtbmFtZS1wYXR0ZXJuIGFuZCBwb3J0LW5hbWUtcGF0dGVybiBpbgotCSAgICAgdGhlIGhhbmRsZXItY2hhaW4gZWxlbWVudAotCi0JICAgICBGb3IgZXhhbXBsZSwgdGhlIHZhcmlvdXMgZm9ybXMgYWNjZXB0YWJsZSBoZXJlIGZvcgotCSAgICAgc2VydmljZS1uYW1lLXBhdHRlcm4gYXR0cmlidXRlIGluIGhhbmRsZXItY2hhaW4gZWxlbWVudAotCSAgICAgYXJlIDoKLQotCSAgICAgRXhhY3QgTmFtZTogc2VydmljZS1uYW1lLXBhdHRlcm49Im5zMTpFY2hvU2VydmljZSIKLQotCQkgSW4gdGhpcyBjYXNlLCBoYW5kbGVycyBzcGVjaWZpZWQgaW4gdGhpcwotCQkgaGFuZGxlci1jaGFpbiBlbGVtZW50IHdpbGwgYXBwbHkgdG8gYWxsIHBvcnRzIHdpdGgKLQkJIHRoaXMgZXhhY3Qgc2VydmljZSBuYW1lLiBUaGUgbmFtZXNwYWNlIHByZWZpeCBtdXN0Ci0JCSBoYXZlIGJlZW4gZGVjbGFyZWQgaW4gYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24KLQkJIGF0dHJpYnV0ZSBpbiBlaXRoZXIgdGhlIHN0YXJ0LXRhZyBvZiB0aGUgZWxlbWVudAotCQkgd2hlcmUgdGhlIHByZWZpeCBpcyB1c2VkIG9yIGluIGFuIGFuIGFuY2VzdG9yCi0JCSBlbGVtZW50IChpLmUuIGFuIGVsZW1lbnQgaW4gd2hvc2UgY29udGVudCB0aGUKLQkJIHByZWZpeGVkIG1hcmt1cCBvY2N1cnMpCi0KLQkgICAgIFBhdHRlcm4gOiBzZXJ2aWNlLW5hbWUtcGF0dGVybj0ibnMxOkVjaG9TZXJ2aWNlKiIKLQotCQkgSW4gdGhpcyBjYXNlLCBoYW5kbGVycyBzcGVjaWZpZWQgaW4gdGhpcwotCQkgaGFuZGxlci1jaGFpbiBlbGVtZW50IHdpbGwgYXBwbHkgdG8gYWxsIHBvcnRzIHdob3NlCi0JCSBTZXJ2aWNlIG5hbWVzIGFyZSBsaWtlIEVjaG9TZXJ2aWNlMSwgRWNob1NlcnZpY2VGb28KLQkJIGV0Yy4gVGhlIG5hbWVzcGFjZSBwcmVmaXggbXVzdCBoYXZlIGJlZW4gZGVjbGFyZWQgaW4KLQkJIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGF0dHJpYnV0ZSBpbiBlaXRoZXIgdGhlCi0JCSBzdGFydC10YWcgb2YgdGhlIGVsZW1lbnQgd2hlcmUgdGhlIHByZWZpeCBpcyB1c2VkIG9yCi0JCSBpbiBhbiBhbiBhbmNlc3RvciBlbGVtZW50IChpLmUuIGFuIGVsZW1lbnQgaW4gd2hvc2UKLQkJIGNvbnRlbnQgdGhlIHByZWZpeGVkIG1hcmt1cCBvY2N1cnMpCi0KLQkgICAgIFdpbGQgQ2FyZCA6IHNlcnZpY2UtbmFtZS1wYXR0ZXJuPSIqIgotCi0JCUluIHRoaXMgY2FzZSwgaGFuZGxlcnMgc3BlY2lmaWVkIGluIHRoaXMgaGFuZGxlci1jaGFpbgotCQllbGVtZW50IHdpbGwgYXBwbHkgdG8gcG9ydHMgb2YgYWxsIHNlcnZpY2UgbmFtZXMuCi0KLQkgICAgVGhlIHNhbWUgY2FuIGJlIGFwcGxpZWQgdG8gcG9ydC1uYW1lIGF0dHJpYnV0ZSBpbgotCSAgICBoYW5kbGVyLWNoYWluIGVsZW1lbnQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iXCp8KFtcaS1bOl1dW1xjLVs6XV0qOik/W1xpLVs6XV1bXGMtWzpdXSpcKj8iLz4KLSAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmljZS1pbXBsLWJlYW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudCBkZWZpbmVzIHRoZSB3ZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbi4KLQlBIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2FuIGJlIGFuIEVKQiBiZWFuIGNsYXNzIG9yIEpBWC1SUEMgd2ViCi0JY29tcG9uZW50LiAgRXhpc3RpbmcgRUpCIGltcGxlbWVudGF0aW9ucyBhcmUgZXhwb3NlZCBhcyBhIHdlYiBzZXJ2aWNlCi0JdXNpbmcgYW4gZWpiLWxpbmsuCi0KLQlVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWxpbmsiCi0JCSAgIHR5cGU9ImphdmFlZTplamItbGlua1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LWxpbmsiCi0JCSAgIHR5cGU9ImphdmFlZTpzZXJ2bGV0LWxpbmtUeXBlIi8+Ci0gICAgPC94c2Q6Y2hvaWNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXQtbGlua1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHNlcnZsZXQtbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIHNlcnZpY2UtaW1wbC1iZWFuIGVsZW1lbnQKLQkgIHRvIHNwZWNpZnkgdGhhdCBhIFNlcnZpY2UgSW1wbGVtZW50YXRpb24gQmVhbiBpcyBkZWZpbmVkIGFzIGEKLQkgIEpBWC1SUEMgU2VydmljZSBFbmRwb2ludC4KLQotCSAgVGhlIHZhbHVlIG9mIHRoZSBzZXJ2bGV0LWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBzZXJ2bGV0LW5hbWUgb2YKLQkgIGEgSkFYLVJQQyBTZXJ2aWNlIEVuZHBvaW50IGluIHRoZSBzYW1lIFdBUiBmaWxlLgotCi0JICBVc2VkIGluOiBzZXJ2aWNlLWltcGwtYmVhbgotCi0JICBFeGFtcGxlOgotCQkgIDxzZXJ2bGV0LWxpbms+U3RvY2tRdW90ZVNlcnZpY2U8L3NlcnZsZXQtbGluaz4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd2Vic2VydmljZS1kZXNjcmlwdGlvbiBlbGVtZW50IGRlZmluZXMgYSBXU0RMIGRvY3VtZW50IGZpbGUKLQlhbmQgdGhlIHNldCBvZiBQb3J0IGNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBXU0RMIHBvcnRzCi0JZGVmaW5lZCBpbiB0aGUgV1NETCBkb2N1bWVudC4gIFRoZXJlIG1heSBiZSBtdWx0aXBsZQotCXdlYnNlcnZpY2UtZGVzY3JpcHRpb25zIGRlZmluZWQgd2l0aGluIGEgbW9kdWxlLgotCi0JQWxsIFdTREwgZmlsZSBwb3J0cyBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHBvcnQtY29tcG9uZW50IGVsZW1lbnQKLQlkZWZpbmVkLgotCi0JVXNlZCBpbjogd2Vic2VydmljZXMKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpkaXNwbGF5LW5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0JCSAgIHR5cGU9ImphdmFlZTppY29uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lIGlkZW50aWZpZXMgdGhlIGNvbGxlY3Rpb24gb2YKLQkgICAgcG9ydC1jb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIFdTREwgZmlsZSBhbmQgSkFYLVJQQwotCSAgICBtYXBwaW5nLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLWZpbGUiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd3NkbC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBXU0RMIGZpbGUgaW4gdGhlCi0JICAgIG1vZHVsZS4gIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpheHJwYy1tYXBwaW5nLWZpbGUiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0Ci0JICAgIGRlc2NyaWJlcyB0aGUgSkFYLVJQQyBtYXBwaW5nIGJldHdlZW4gdGhlIEphdmEgaW50ZXJhY2VzIHVzZWQgYnkKLQkgICAgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgV1NETCBkZXNjcmlwdGlvbiBpbiB0aGUgd3NkbC1maWxlLiAgVGhlCi0JICAgIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUuCi0KLQkgICAgVGhpcyBpcyBub3QgcmVxdWlyZWQgd2hlbiBKQVgtV1MgYmFzZWQgcnVudGltZSBpcyB1c2VkLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtY29tcG9uZW50IgotCQkgICB0eXBlPSJqYXZhZWU6cG9ydC1jb21wb25lbnRUeXBlIgotCQkgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmtleSBuYW1lPSJwb3J0LWNvbXBvbmVudF9oYW5kbGVyLW5hbWUta2V5Ij4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLQkgICAgICB3aXRoaW4gdGhlIG1vZHVsZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpoYW5kbGVyIi8+Ci0JICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6aGFuZGxlci1uYW1lIi8+Ci0JPC94c2Q6a2V5PgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzZXJ2aWNlc1R5cGUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6d2Vic2VydmljZS1kZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6a2V5IG5hbWU9InBvcnQtY29tcG9uZW50LW5hbWUta2V5Ij4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICAgIDwhW0NEQVRBWwotCi0JCVRoZSBwb3J0LWNvbXBvbmVudC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGEgcG9ydAotCQljb21wb25lbnQncyBuYW1lLiAgVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZSBtb2R1bGUKLQkJcHJvZHVjZXIgdG8gbmFtZSB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuIGluIHRoZQotCQltb2R1bGUncyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JCWFtb25nIHRoZSBwb3J0IGNvbXBvbmVudCBuYW1lcyBkZWZpbmVkIGluIHRoZSBzYW1lIG1vZHVsZS4KLQotCQlVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotCi0JCUV4YW1wbGU6Ci0JCQk8cG9ydC1jb21wb25lbnQtbmFtZT5FbXBsb3llZVNlcnZpY2UKLQkJCTwvcG9ydC1jb21wb25lbnQtbmFtZT4KLQotCQldXT4KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cG9ydC1jb21wb25lbnQiLz4KLQkgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpwb3J0LWNvbXBvbmVudC1uYW1lIi8+Ci0JPC94c2Q6a2V5PgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXdleS12ZXJzaW9uVHlwZSIKLQkJICAgZml4ZWQ9IjEuMiIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDEuMi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMy54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV93ZWJfc2VydmljZXNfMV8zLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RhZjIzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV93ZWJfc2VydmljZXNfMV8zLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgICAgICAgIHZlcnNpb249IjEuMyI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0gICAgICAKLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICAgCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24KLSAgICAgIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZQotICAgICAgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICAgdGhlIExpY2Vuc2UuIFlvdSBjYW4gb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sIG9yCi0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0gICAgICBMaWNlbnNlLgotICAgICAgCi0gICAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlcgotICAgICAgTm90aWNlIGluIGVhY2ggZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0Ci0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICAgICAgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcwotICAgICAgcHJvdmlkZWQgYnkgU3VuIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UgZmlsZQotICAgICAgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZwotICAgICAgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10KLSAgICAgIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICAgIlBvcnRpb25zIENvcHlyaWdodGVkIFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotICAgICAgCi0gICAgICBDb250cmlidXRvcihzKToKLSAgICAgIAotICAgICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZQotICAgICAgQ0RETCBvciBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZwotICAgICAgIltDb250cmlidXRvcl0gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTCBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91Ci0gICAgICBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYSByZWNpcGllbnQgaGFzIHRoZQotICAgICAgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlCi0gICAgICBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvIGl0cwotICAgICAgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyCi0gICAgICBjb2RlIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUKLSAgICAgIG9wdGlvbiBhcHBsaWVzIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoCi0gICAgICBvcHRpb24gYnkgdGhlIGNvcHlyaWdodCBob2xkZXIuCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIChDKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiAyMDAyCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVtbCi0gICAgICBUaGUgd2Vic2VydmljZXMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IGZvciB0aGUgd2ViIHNlcnZpY2VzCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBJdCBzcGVjaWZpZXMgdGhlIHNldCBvZiB3ZWIgc2VydmljZQotICAgICAgZGVzY3JpcHRpb25zIHRoYXQgYXJlIHRvIGJlIGRlcGxveWVkIGludG8gdGhlIEphdmEgRUUgQXBwbGljYXRpb24KLSAgICAgIFNlcnZlciBhbmQgdGhlIGRlcGVuZGVuY2llcyB0aGV5IGhhdmUgb24gY29udGFpbmVyIHJlc291cmNlcyBhbmQKLSAgICAgIHNlcnZpY2VzLiAgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkCi0gICAgICAiTUVUQS1JTkYvd2Vic2VydmljZXMueG1sIiBpbiB0aGUgd2ViIHNlcnZpY2VzJyBqYXIgZmlsZS4KLSAgICAgIAotICAgICAgVXNlZCBpbjogd2Vic2VydmljZXMueG1sCi0gICAgICAKLSAgICAgIEFsbCB3ZWJzZXJ2aWNlcyBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUgdGhlCi0gICAgICB3ZWJzZXJ2aWNlcyBzY2hlbWEgYnkgdXNpbmcgdGhlIEphdmEgRUUgbmFtZXNwYWNlOgotICAgICAgCi0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLSAgICAgIAotICAgICAgYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieSB1c2luZyB0aGUgdmVyc2lvbgotICAgICAgZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLSAgICAgIAotICAgICAgPHdlYnNlcnZpY2VzIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLSAgICAgIAlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzMueHNkIgotICAgICAgdmVyc2lvbj0iMS4zIj4KLSAgICAgIC4uLgotICAgICAgPC93ZWJzZXJ2aWNlcz4KLSAgICAgIAotICAgICAgVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mIHRoZQotICAgICAgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciB0aGUgSmF2YSBFRQotICAgICAgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLSAgICAgIAotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2phdmFlZV93ZWJfc2VydmljZXNfMV8zLnhzZAotICAgICAgCi0gICAgICBdXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLSAgICAgIAotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICAgICAgc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICAgICAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICAgICAgc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAgICAgIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gICAgICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgICAgIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV82LnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0id2Vic2VydmljZXMiCi0gICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6d2Vic2VydmljZXNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHdlYnNlcnZpY2VzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBmb3IgdGhlIHdlYiBzZXJ2aWNlcwotICAgICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBJdCBzcGVjaWZpZXMgdGhlIHNldCBvZiB3ZWIgc2VydmljZQotICAgICAgICBkZXNjcmlwdGlvbnMgdGhhdCBhcmUgdG8gYmUgZGVwbG95ZWQgaW50byB0aGUgSmF2YSBFRSBBcHBsaWNhdGlvbiBTZXJ2ZXIKLSAgICAgICAgYW5kIHRoZSBkZXBlbmRlbmNpZXMgdGhleSBoYXZlIG9uIGNvbnRhaW5lciByZXNvdXJjZXMgYW5kIHNlcnZpY2VzLgotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogd2Vic2VydmljZXMueG1sCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6a2V5IG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgd2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lIGlkZW50aWZpZXMgdGhlIGNvbGxlY3Rpb24gb2YKLSAgICAgICAgICBwb3J0LWNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIGEgV1NETCBmaWxlIGFuZCBKQVgtUlBDIG1hcHBpbmcuIFRoZQotICAgICAgICAgIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOndlYnNlcnZpY2UtZGVzY3JpcHRpb24iLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTp3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9ydC1jb21wb25lbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHBvcnQtY29tcG9uZW50IGVsZW1lbnQgYXNzb2NpYXRlcyBhIFdTREwgcG9ydCB3aXRoIGEgd2ViIHNlcnZpY2UKLSAgICAgICAgaW50ZXJmYWNlIGFuZCBpbXBsZW1lbnRhdGlvbi4gIEl0IGRlZmluZXMgdGhlIG5hbWUgb2YgdGhlIHBvcnQgYXMgYQotICAgICAgICBjb21wb25lbnQsIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBvcHRpb25hbCBkaXNwbGF5IG5hbWUsIG9wdGlvbmFsIGljb25pYwotICAgICAgICByZXByZXNlbnRhdGlvbnMsIFdTREwgcG9ydCBRTmFtZSwgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UsIFNlcnZpY2UKLSAgICAgICAgSW1wbGVtZW50YXRpb24gQmVhbi4KLSAgICAgICAgCi0gICAgICAgIFRoaXMgZWxlbWVudCBhbHNvIGFzc29jaWF0ZXMgYSBXU0RMIHNlcnZpY2Ugd2l0aCBhIEpBWC1XUyBQcm92aWRlcgotICAgICAgICBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LWNvbXBvbmVudC1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICAgICAgVGhlIHBvcnQtY29tcG9uZW50LW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYSBwb3J0IGNvbXBvbmVudCdzCi0gICAgICAgICAgICBuYW1lLiAgVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZSBtb2R1bGUgcHJvZHVjZXIgdG8gbmFtZQotICAgICAgICAgICAgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBpbiB0aGUgbW9kdWxlJ3MgZGVwbG95bWVudAotICAgICAgICAgICAgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgYW1vbmcgdGhlIHBvcnQgY29tcG9uZW50Ci0gICAgICAgICAgICBuYW1lcyBkZWZpbmVkIGluIHRoZSBzYW1lIG1vZHVsZS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgVXNlZCBpbjogcG9ydC1jb21wb25lbnQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRXhhbXBsZToKLSAgICAgICAgICAgIAkgICAgICA8cG9ydC1jb21wb25lbnQtbmFtZT5FbXBsb3llZVNlcnZpY2UKLSAgICAgICAgICAgIAkgICAgICA8L3BvcnQtY29tcG9uZW50LW5hbWU+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtc2VydmljZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkUU5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBuYW1lIHNwYWNlIGFuZCBsb2NhbCBuYW1lIHBhcnQgb2YgdGhlIFdTREwKLSAgICAgICAgICAgIHNlcnZpY2UgUU5hbWUuIFRoaXMgaXMgcmVxdWlyZWQgdG8gYmUgc3BlY2lmaWVkIGZvcgotICAgICAgICAgICAgcG9ydCBjb21wb25lbnRzIHRoYXQgYXJlIEpBWC1XUyBQcm92aWRlciBpbXBsZW1lbnRhdGlvbnMuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLXBvcnQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZFFOYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgRGVmaW5lcyB0aGUgbmFtZSBzcGFjZSBhbmQgbG9jYWwgbmFtZSBwYXJ0IG9mIHRoZSBXU0RMCi0gICAgICAgICAgICBwb3J0IFFOYW1lLiBUaGlzIGlzIG5vdCByZXF1aXJlZCB0byBiZSBzcGVjaWZpZWQgZm9yIHBvcnQKLSAgICAgICAgICAgIGNvbXBvbmVudHMgdGhhdCBhcmUgSkFYLVdTIFByb3ZpZGVyIGltcGxlbWVudGF0aW9ucwotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5hYmxlLW10b20iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBVc2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIFNPQVAgTVRPTS9YT1AgbWVjaGFuaXNtIGZvciBhbgotICAgICAgICAgICAgZW5kcG9pbnQgaW1wbGVtZW50YXRpb24uCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIE5vdCB0byBiZSBzcGVjaWZpZWQgZm9yIEpBWC1SUEMgcnVudGltZQotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXRvbS10aHJlc2hvbGQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZE5vbk5lZ2F0aXZlSW50ZWdlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFdoZW4gTVRPTSBpcyBlbmFibGVkLCBiaW5hcnkgZGF0YSBhYm92ZSB0aGlzIHNpemUgaW4gYnl0ZXMKLSAgICAgICAgICAgIHdpbGwgYmUgWE9QIGVuY29kZWQgb3Igc2VudCBhcyBhdHRhY2htZW50LiBEZWZhdWx0IHZhbHVlIGlzIDAuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIE5vdCB0byBiZSBzcGVjaWZpZWQgZm9yIEpBWC1SUEMgcnVudGltZQotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRkcmVzc2luZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YWRkcmVzc2luZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoaXMgc3BlY2lmaWVzIHRoZSBXUy1BZGRyZXNzaW5nIHJlcXVpcmVtZW50cyBmb3IgYSBKQVgtV1MKLSAgICAgICAgICAgIHdlYiBzZXJ2aWNlLiBJdCBjb3JyZXNwb25kcyB0byBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nCi0gICAgICAgICAgICBhbm5vdGF0aW9uIG9yIGl0cyBmZWF0dXJlIGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3NpbmdGZWF0dXJlLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBTZWUgdGhlIGFkZHJlc3NpbmdUeXBlIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBOb3QgdG8gYmUgc3BlY2lmaWVkIGZvciBKQVgtUlBDIHJ1bnRpbWUKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc3BlY3QtYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cmVzcGVjdC1iaW5kaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnhtbC53cy5SZXNwZWN0QmluZGluZyBhbm5vdGF0aW9uCi0gICAgICAgICAgICBvciBpdHMgY29ycmVzcG9uZGluZyBqYXZheC54bWwud3MuUmVzcGVjdEJpbmRpbmdGZWF0dXJlIHdlYgotICAgICAgICAgICAgc2VydmljZSBmZWF0dXJlLiBUaGlzIGlzIHVzZWQgdG8gY29udHJvbCB3aGV0aGVyIGEgSkFYLVdTCi0gICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBtdXN0IHJlc3BlY3QvaG9ub3IgdGhlIGNvbnRlbnRzIG9mIHRoZQotICAgICAgICAgICAgd3NkbDpiaW5kaW5nIGluIHRoZSBXU0RMIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2aWNlLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBOb3QgdG8gYmUgc3BlY2lmaWVkIGZvciBKQVgtUlBDIHJ1bnRpbWUKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3RvY29sLWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnByb3RvY29sLWJpbmRpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgdGhlIHByb3RvY29sIGJpbmRpbmcgdXNlZCBieSB0aGUgcG9ydC1jb21wb25lbnQuCi0gICAgICAgICAgICBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgZGVmYXVsdCBiaW5kaW5nIGlzCi0gICAgICAgICAgICB1c2VkIChTT0FQIDEuMSBvdmVyIEhUVFApCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGNvbnRhaW5zIHRoZQotICAgICAgICAgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHBvcnQgY29tcG9uZW50J3MgU2VydmljZSBFbmRwb2ludAotICAgICAgICAgICAgSW50ZXJmYWNlLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotICAgICAgICAgICAgCi0gICAgICAgICAgICBFeGFtcGxlOgotICAgICAgICAgICAgCSAgICAgIDxyZW1vdGU+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZTwvcmVtb3RlPgotICAgICAgICAgICAgCi0gICAgICAgICAgICBUaGlzIG1heSBub3QgYmUgc3BlY2lmaWVkIGluIGNhc2UgdGhlcmUgaXMgbm8gU2VydmljZQotICAgICAgICAgICAgRW5wb2ludCBJbnRlcmZhY2UgYXMgaXMgdGhlIGNhc2Ugd2l0aCBkaXJlY3RseSB1c2luZyBhbgotICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3Mgd2l0aCB0aGUgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbi4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgV2hlbiB0aGUgcG9ydCBjb21wb25lbnQgaXMgYSBQcm92aWRlciBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgdGhpcyBpcyBub3Qgc3BlY2lmaWVkLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWltcGwtYmVhbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VydmljZS1pbXBsLWJlYW5UeXBlIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXIiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aGFuZGxlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIAkgVG8gYmUgdXNlZCB3aXRoIEpBWC1SUEMgYmFzZWQgcnVudGltZSBvbmx5LgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItY2hhaW5zIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmhhbmRsZXItY2hhaW5zVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIAkgVG8gYmUgdXNlZCB3aXRoIEpBWC1XUyBiYXNlZCBydW50aW1lIG9ubHkuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLWltcGwtYmVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudCBkZWZpbmVzIHRoZSB3ZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgQSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNhbiBiZSBhbiBFSkIgYmVhbiBjbGFzcyBvciBKQVgtUlBDIHdlYgotICAgICAgICBjb21wb25lbnQuICBFeGlzdGluZyBFSkIgaW1wbGVtZW50YXRpb25zIGFyZSBleHBvc2VkIGFzIGEgd2ViIHNlcnZpY2UKLSAgICAgICAgdXNpbmcgYW4gZWpiLWxpbmsuCi0gICAgICAgIAotICAgICAgICBVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZWpiLWxpbmtUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1saW5rIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZXJ2bGV0LWxpbmtUeXBlIi8+Ci0gICAgPC94c2Q6Y2hvaWNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0LWxpbmtUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwhW0NEQVRBW1sKLSAgICAgICAgVGhlIHNlcnZsZXQtbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIHNlcnZpY2UtaW1wbC1iZWFuIGVsZW1lbnQKLSAgICAgICAgdG8gc3BlY2lmeSB0aGF0IGEgU2VydmljZSBJbXBsZW1lbnRhdGlvbiBCZWFuIGlzIGRlZmluZWQgYXMgYQotICAgICAgICBKQVgtUlBDIFNlcnZpY2UgRW5kcG9pbnQuCi0gICAgICAgIAotICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHNlcnZsZXQtbGluayBlbGVtZW50IG11c3QgYmUgdGhlIHNlcnZsZXQtbmFtZSBvZgotICAgICAgICBhIEpBWC1SUEMgU2VydmljZSBFbmRwb2ludCBpbiB0aGUgc2FtZSBXQVIgZmlsZS4KLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IHNlcnZpY2UtaW1wbC1iZWFuCi0gICAgICAgIAotICAgICAgICBFeGFtcGxlOgotICAgICAgICAJICA8c2VydmxldC1saW5rPlN0b2NrUXVvdGVTZXJ2aWNlPC9zZXJ2bGV0LWxpbms+Ci0gICAgICAgIAotICAgICAgICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIGVsZW1lbnQgZGVmaW5lcyBhIFdTREwgZG9jdW1lbnQgZmlsZQotICAgICAgICBhbmQgdGhlIHNldCBvZiBQb3J0IGNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBXU0RMIHBvcnRzCi0gICAgICAgIGRlZmluZWQgaW4gdGhlIFdTREwgZG9jdW1lbnQuICBUaGVyZSBtYXkgYmUgbXVsdGlwbGUKLSAgICAgICAgd2Vic2VydmljZS1kZXNjcmlwdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBtb2R1bGUuCi0gICAgICAgIAotICAgICAgICBBbGwgV1NETCBmaWxlIHBvcnRzIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgcG9ydC1jb21wb25lbnQgZWxlbWVudAotICAgICAgICBkZWZpbmVkLgotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogd2Vic2VydmljZXMKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRpc3BsYXktbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmljb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUgaWRlbnRpZmllcyB0aGUgY29sbGVjdGlvbiBvZgotICAgICAgICAgICAgcG9ydC1jb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIFdTREwgZmlsZSBhbmQgSkFYLVJQQwotICAgICAgICAgICAgbWFwcGluZy4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLWZpbGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgd3NkbC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBXU0RMIGZpbGUgaW4gdGhlCi0gICAgICAgICAgICBtb2R1bGUuICBUaGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZS4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpheHJwYy1tYXBwaW5nLWZpbGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0Ci0gICAgICAgICAgICBkZXNjcmliZXMgdGhlIEpBWC1SUEMgbWFwcGluZyBiZXR3ZWVuIHRoZSBKYXZhIGludGVyYWNlcyB1c2VkIGJ5Ci0gICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuICBUaGUKLSAgICAgICAgICAgIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRoaXMgaXMgbm90IHJlcXVpcmVkIHdoZW4gSkFYLVdTIGJhc2VkIHJ1bnRpbWUgaXMgdXNlZC4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtY29tcG9uZW50IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwb3J0LWNvbXBvbmVudFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIxIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDprZXkgbmFtZT0icG9ydC1jb21wb25lbnRfaGFuZGxlci1uYW1lLWtleSI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0gICAgICAgICAgICAgIHdpdGhpbiB0aGUgbW9kdWxlLgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6aGFuZGxlciIvPgotICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpoYW5kbGVyLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6a2V5PgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic2VydmljZXNUeXBlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2Vic2VydmljZS1kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6d2Vic2VydmljZS1kZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIxIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDprZXkgbmFtZT0icG9ydC1jb21wb25lbnQtbmFtZS1rZXkiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPCFbQ0RBVEFbWwotICAgICAgICAgICAgICAJVGhlIHBvcnQtY29tcG9uZW50LW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYSBwb3J0Ci0gICAgICAgICAgICAgIAljb21wb25lbnQncyBuYW1lLiAgVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZSBtb2R1bGUKLSAgICAgICAgICAgICAgCXByb2R1Y2VyIHRvIG5hbWUgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBpbiB0aGUKLSAgICAgICAgICAgICAgCW1vZHVsZSdzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgICAgICAgCWFtb25nIHRoZSBwb3J0IGNvbXBvbmVudCBuYW1lcyBkZWZpbmVkIGluIHRoZSBzYW1lIG1vZHVsZS4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIAlVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgCUV4YW1wbGU6Ci0gICAgICAgICAgICAgIAkJPHBvcnQtY29tcG9uZW50LW5hbWU+RW1wbG95ZWVTZXJ2aWNlCi0gICAgICAgICAgICAgIAkJPC9wb3J0LWNvbXBvbmVudC1uYW1lPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgCQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnBvcnQtY29tcG9uZW50Ii8+Ci0gICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnBvcnQtY29tcG9uZW50LW5hbWUiLz4KLSAgICAgICAgPC94c2Q6a2V5PgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXdleS12ZXJzaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBmaXhlZD0iMS4zIgotICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDEuMy4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGYwZGQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8yLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjEuMiI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8yLnhzZHMJMS4xOSAwMi8xMy8wNgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICAgICAgVS5TLkEKLSAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIChDKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiAyMDAyCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvcnQtY29tcG9uZW50LXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBwb3J0LWNvbXBvbmVudC1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIGNsaWVudCBkZXBlbmRlbmN5Ci0Jb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLQl0byBhIFdTREwgcG9ydC4gSXQgb3B0aW9uYWxseSBhc3NvY2lhdGVzIHRoZSBTZXJ2aWNlIEVuZHBvaW50Ci0JSW50ZXJmYWNlIHdpdGggYSBwYXJ0aWN1bGFyIHBvcnQtY29tcG9uZW50LiBUaGlzIGlzIG9ubHkgdXNlZAotCWJ5IHRoZSBjb250YWluZXIgZm9yIGEgU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UgZWxlbWVudCBkZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkCi0JICAgIEphdmEgY2xhc3MgdGhhdCByZXByZXNlbnRzIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBvZiBhCi0JICAgIFdTREwgcG9ydC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZS1tdG9tIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBVc2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIFNPQVAgTVRPTS9YT1AgbWVjaGFuaXNtIG9uIHRoZSBjbGllbnQKLQkgICAgc2lkZSBmb3IgYSBwb3J0LWNvbXBvbmVudC4KLQotCSAgICBOb3QgdG8gYmUgc3BlY2lmaWVkIGZvciBKQVgtUlBDIHJ1bnRpbWUKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtY29tcG9uZW50LWxpbmsiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBvcnQtY29tcG9uZW50LWxpbmsgZWxlbWVudCBsaW5rcyBhIHBvcnQtY29tcG9uZW50LXJlZgotCSAgICB0byBhIHNwZWNpZmljIHBvcnQtY29tcG9uZW50IHJlcXVpcmVkIHRvIGJlIG1hZGUgYXZhaWxhYmxlCi0JICAgIGJ5IGEgc2VydmljZSByZWZlcmVuY2UuCi0KLQkgICAgVGhlIHZhbHVlIG9mIGEgcG9ydC1jb21wb25lbnQtbGluayBtdXN0IGJlIHRoZQotCSAgICBwb3J0LWNvbXBvbmVudC1uYW1lIG9mIGEgcG9ydC1jb21wb25lbnQgaW4gdGhlIHNhbWUgbW9kdWxlCi0JICAgIG9yIGFub3RoZXIgbW9kdWxlIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uIHVuaXQuIFRoZSBzeW50YXgKLQkgICAgZm9yIHNwZWNpZmljYXRpb24gZm9sbG93cyB0aGUgc3ludGF4IGRlZmluZWQgZm9yIGVqYi1saW5rCi0JICAgIGluIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Z3JvdXAgbmFtZT0ic2VydmljZS1yZWZHcm91cCI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXJlZiIKLQkJICAgdHlwZT0iamF2YWVlOnNlcnZpY2UtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDprZXkgbmFtZT0ic2VydmljZS1yZWZfaGFuZGxlci1uYW1lLWtleSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JICAgICAgd2l0aGluIHRoZSBtb2R1bGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6aGFuZGxlciIvPgotCSAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmhhbmRsZXItbmFtZSIvPgotCTwveHNkOmtleT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmdyb3VwPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXJ2aWNlLXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgcmVmZXJlbmNlIHRvIGEgV2ViCi0Jc2VydmljZS4gSXQgY29udGFpbnMgb3B0aW9uYWwgZGVzY3JpcHRpb24sIGRpc3BsYXkgbmFtZSBhbmQKLQlpY29ucywgYSBkZWNsYXJhdGlvbiBvZiB0aGUgcmVxdWlyZWQgU2VydmljZSBpbnRlcmZhY2UsCi0JYW4gb3B0aW9uYWwgV1NETCBkb2N1bWVudCBsb2NhdGlvbiwgYW4gb3B0aW9uYWwgc2V0Ci0Jb2YgSkFYLVJQQyBtYXBwaW5ncywgYW4gb3B0aW9uYWwgUU5hbWUgZm9yIHRoZSBzZXJ2aWNlIGVsZW1lbnQsCi0JYW4gb3B0aW9uYWwgc2V0IG9mIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlcyB0byBiZSByZXNvbHZlZAotCWJ5IHRoZSBjb250YWluZXIgdG8gYSBXU0RMIHBvcnQsIGFuZCBhbiBvcHRpb25hbCBzZXQgb2YgaGFuZGxlcnMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXJlZi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLXJlZi1uYW1lIGVsZW1lbnQgZGVjbGFyZXMgbG9naWNhbCBuYW1lIHRoYXQgdGhlCi0JICAgIGNvbXBvbmVudHMgaW4gdGhlIG1vZHVsZSB1c2UgdG8gbG9vayB1cCB0aGUgV2ViIHNlcnZpY2UuIEl0Ci0JICAgIGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIHNlcnZpY2UgcmVmZXJlbmNlIG5hbWVzIHN0YXJ0IHdpdGgKLQkgICAgInNlcnZpY2UvIi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtaW50ZXJmYWNlIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLWludGVyZmFjZSBlbGVtZW50IGRlY2xhcmVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLQkgICAgbmFtZSBvZiB0aGUgSkFYLVJQQyBTZXJ2aWNlIGludGVyZmFjZSB0aGUgY2xpZW50IGRlcGVuZHMgb24uCi0JICAgIEluIG1vc3QgY2FzZXMgdGhlIHZhbHVlIHdpbGwgYmUgamF2YXgueG1sLnJwYy5TZXJ2aWNlLiAgQSBKQVgtUlBDCi0JICAgIGdlbmVyYXRlZCBTZXJ2aWNlIEludGVyZmFjZSBjbGFzcyBtYXkgYWxzbyBiZSBzcGVjaWZpZWQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXJlZi10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc2VydmljZS1yZWYtdHlwZSBlbGVtZW50IGRlY2xhcmVzIHRoZSB0eXBlIG9mIHRoZSBzZXJ2aWNlLXJlZgotCSAgICBlbGVtZW50IHRoYXQgaXMgaW5qZWN0ZWQgb3IgcmV0dXJuZWQgd2hlbiBhIEpOREkgbG9va3VwIGlzIGRvbmUuCi0JICAgIFRoaXMgbXVzdCBiZSBlaXRoZXIgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBTZXJ2aWNlIGNsYXNzIG9yCi0JICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSBjbGFzcy4KLQkgICAgVGhpcyBpcyBvbmx5IHVzZWQgd2l0aCBKQVgtV1MgcnVudGltZSB3aGVyZSB0aGUgY29ycmVzcG9uZGluZwotCSAgICBAV2ViU2VydmljZVJlZiBhbm5vdGF0aW9uIGNhbiBiZSB1c2VkIHRvIGRlbm90ZSBib3RoIGEgU2VydmljZQotCSAgICBvciBhIFBvcnQuCi0KLQkgICAgSWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZSB0eXBlIG9mIHNlcnZpY2UtcmVmIGVsZW1lbnQKLQkgICAgdGhhdCBpcyBpbmplY3RlZCBvciByZXR1cm5lZCB3aGVuIGEgSk5ESSBsb29rdXAgaXMgZG9uZSBpcwotCSAgICBhbHdheXMgYSBTZXJ2aWNlIGludGVyZmFjZS9jbGFzcy4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLWZpbGUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RBbnlVUklUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3c2RsLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgVVJJIGxvY2F0aW9uIG9mIGEgV1NETAotCSAgICBmaWxlLiBUaGUgbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpheHJwYy1tYXBwaW5nLWZpbGUiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0Ci0JICAgIGRlc2NyaWJlcyB0aGUgSkFYLVJQQyBtYXBwaW5nIGJldHdlZW4gdGhlIEphdmEgaW50ZXJhY2VzIHVzZWQgYnkKLQkgICAgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgV1NETCBkZXNjcmlwdGlvbiBpbiB0aGUgd3NkbC1maWxlLiAgVGhlCi0JICAgIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUgZmlsZS4KLQotCSAgICBUaGlzIGlzIG5vdCByZXF1aXJlZCB3aGVuIEpBWC1XUyBiYXNlZCBydW50aW1lIGlzIHVzZWQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXFuYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkUU5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLXFuYW1lIGVsZW1lbnQgZGVjbGFyZXMgdGhlIHNwZWNpZmljIFdTREwgc2VydmljZQotCSAgICBlbGVtZW50IHRoYXQgaXMgYmVpbmcgcmVmZXJlZCB0by4gIEl0IGlzIG5vdCBzcGVjaWZpZWQgaWYgbm8KLQkgICAgd3NkbC1maWxlIGlzIGRlY2xhcmVkLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6cG9ydC1jb21wb25lbnQtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwb3J0LWNvbXBvbmVudC1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIGNsaWVudCBkZXBlbmRlbmN5Ci0JICAgIG9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi0JICAgIHRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKLQkgICAgSW50ZXJmYWNlIHdpdGggYSBwYXJ0aWN1bGFyIHBvcnQtY29tcG9uZW50LiBUaGlzIGlzIG9ubHkgdXNlZAotCSAgICBieSB0aGUgY29udGFpbmVyIGZvciBhIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCSAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXIiCi0JCSAgICAgICB0eXBlPSJqYXZhZWU6c2VydmljZS1yZWZfaGFuZGxlclR5cGUiCi0JCSAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkgICAgPHhzZDphbm5vdGF0aW9uPgotCSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQlEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuCi0JCWFjY2VzcyB0aGUgaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZQotCQlIYW5kbGVySW5mbyBpbnRlcmZhY2UuIElmIHBvcnQtbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUKLQkJaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhbGwgcG9ydHMgb2YgdGhlCi0JCXNlcnZpY2UuCi0KLQkJVG8gYmUgdXNlZCB3aXRoIEpBWC1SUEMgYmFzZWQgcnVudGltZSBvbmx5LgotCi0JICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDwveHNkOmVsZW1lbnQ+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jaGFpbnMiCi0JCSAgICAgICB0eXBlPSJqYXZhZWU6c2VydmljZS1yZWZfaGFuZGxlci1jaGFpbnNUeXBlIgotCQkgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCSAgICA8eHNkOmFubm90YXRpb24+Ci0JICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCQkgVG8gYmUgdXNlZCB3aXRoIEpBWC1XUyBiYXNlZCBydW50aW1lIG9ubHkuCi0JICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6cmVzb3VyY2VHcm91cCIvPgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmljZS1yZWZfaGFuZGxlci1jaGFpblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGhhbmRsZXItY2hhaW4gZWxlbWVudCBkZWZpbmVzIHRoZSBoYW5kbGVyY2hhaW4uCi0gICAgICBIYW5kbGVyY2hhaW4gY2FuIGJlIGRlZmluZWQgc3VjaCB0aGF0IHRoZSBoYW5kbGVycyBpbiB0aGUKLSAgICAgIGhhbmRsZXJjaGFpbiBvcGVyYXRlLGFsbCBwb3J0cyBvZiBhIHNlcnZpY2UsIG9uIGEgc3BlY2lmaWMKLSAgICAgIHBvcnQgb3Igb24gYSBsaXN0IG9mIHByb3RvY29sLWJpbmRpbmdzLiBUaGUgY2hvaWNlIG9mIGVsZW1lbnRzCi0gICAgICBzZXJ2aWNlLW5hbWUtcGF0dGVybiwgcG9ydC1uYW1lLXBhdHRlcm4gYW5kIHByb3RvY29sLWJpbmRpbmdzCi0gICAgICBhcmUgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIGhhbmRsZXJzIGluIGhhbmRsZXItY2hhaW4gYXJlCi0gICAgICBmb3IgYSBzZXJ2aWNlLCBwb3J0IG9yIHByb3RvY29sIGJpbmRpbmcuIElmIG5vbmUgb2YgdGhlc2UKLSAgICAgIGNob2ljZXMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgdGhlbiB0aGUKLSAgICAgIGhhbmRsZXJzIHNwZWNpZmllZCBpbiB0aGUgaGFuZGxlci1jaGFpbiB3aWxsIGJlIGFwcGxpZWQgb24KLSAgICAgIGV2ZXJ5dGhpbmcuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLW5hbWUtcGF0dGVybiIKLQkJICAgICAgdHlwZT0iamF2YWVlOnNlcnZpY2UtcmVmX3FuYW1lLXBhdHRlcm4iIC8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1uYW1lLXBhdHRlcm4iCi0JICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VydmljZS1yZWZfcW5hbWUtcGF0dGVybiIgLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm90b2NvbC1iaW5kaW5ncyIKLQkgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZXJ2aWNlLXJlZl9wcm90b2NvbC1iaW5kaW5nTGlzdFR5cGUiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXIiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlcnZpY2UtcmVmX2hhbmRsZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLXJlZl9oYW5kbGVyLWNoYWluc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGhhbmRsZXItY2hhaW5zIGVsZW1lbnQgZGVmaW5lcyB0aGUgaGFuZGxlcmNoYWlucyBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgICAgc2VydmljZSBvciBzZXJ2aWNlIGVuZHBvaW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItY2hhaW4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlcnZpY2UtcmVmX2hhbmRsZXItY2hhaW5UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLXJlZl9oYW5kbGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlCi0JaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZSBIYW5kbGVySW5mbyBpbnRlcmZhY2UuIElmCi0JcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZAotCXdpdGggYWxsIHBvcnRzIG9mIHRoZSBzZXJ2aWNlLgotCi0JVXNlZCBpbjogc2VydmljZS1yZWYKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAgICB3aXRoaW4gdGhlIG1vZHVsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGhhbmRsZXIKLQkgICAgaW1wbGVtZW50YXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLQkJICAgdHlwZT0iamF2YWVlOnBhcmFtLXZhbHVlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic29hcC1oZWFkZXIiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RRTmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBRTmFtZSBvZiBhIFNPQVAgaGVhZGVyIHRoYXQgd2lsbCBiZSBwcm9jZXNzZWQKLQkgICAgYnkgdGhlIGhhbmRsZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb2FwLXJvbGUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc29hcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYSBTT0FQIGFjdG9yIGRlZmluaXRpb24gdGhhdAotCSAgICB0aGUgSGFuZGxlciB3aWxsIHBsYXkgYXMgYSByb2xlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBvcnQtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIFdTREwgcG9ydC1uYW1lIHRoYXQgYQotCSAgICBoYW5kbGVyIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGguCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJzZXJ2aWNlLXJlZl9wcm90b2NvbC1VUklBbGlhc1R5cGUiPgotICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICBEZWZpbmVzIHRoZSB0eXBlIHRoYXQgaXMgdXNlZCBmb3Igc3BlY2lmeWluZyB0b2tlbnMgdGhhdAotCSAgIHN0YXJ0IHdpdGggIyMgd2hpY2ggYXJlIHVzZWQgdG8gYWxpYXMgZXhpc3Rpbmcgc3RhbmRhcmQKLQkgICBwcm90b2NvbCBiaW5kaW5ncyBhbmQgc3VwcG9ydCBhbGlhc2VzIGZvciBuZXcgc3RhbmRhcmQKLQkgICBiaW5kaW5nIFVSSXMgdGhhdCBhcmUgaW50cm9kdWNlZCBpbiBmdXR1cmUgc3BlY2lmaWNhdGlvbnMuCi0KLQkgICBUaGUgZm9sbG93aW5nIHRva2VucyBhbGlhcyB0aGUgc3RhbmRhcmQgcHJvdG9jb2wgYmluZGluZwotCSAgIFVSSXM6Ci0KLQkgICAjI1NPQVAxMV9IVFRQID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC9odHRwIgotCSAgICMjU09BUDExX0hUVFBfTVRPTSA9Ci0gICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvaHR0cD9tdG9tPXRydWUiCi0gICAgICAgICAgICMjU09BUDEyX0hUVFAgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvIgotICAgICAgICAgICAjI1NPQVAxMl9IVFRQX01UT00gPQotICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvP210b209dHJ1ZSIKLSAgICAgICAgICAgIyNYTUxfSFRUUCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaHR0cCIKLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iIyMuKyIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJzZXJ2aWNlLXJlZl9wcm90b2NvbC1iaW5kaW5nTGlzdFR5cGUiPgotICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICBEZWZpbmVzIHRoZSB0eXBlIHVzZWQgZm9yIHNwZWNpZnlpbmcgYSBsaXN0IG9mCi0JICAgcHJvdG9jb2wtYmluZGluZ1R5cGUocykuIEZvciBlLmcuCi0KLQkgICAgIyNTT0FQMTFfSFRUUCAjI1NPQVAxMl9IVFRQICMjWE1MX0hUVFAKLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOmxpc3QgaXRlbVR5cGU9ImphdmFlZTpzZXJ2aWNlLXJlZl9wcm90b2NvbC1iaW5kaW5nVHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InNlcnZpY2UtcmVmX3Byb3RvY29sLWJpbmRpbmdUeXBlIj4KLSAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgRGVmaW5lcyB0aGUgdHlwZSB1c2VkIGZvciBzcGVjaWZ5aW5nIHRoZSBVUkkgZm9yIHRoZQotCSAgIHByb3RvY29sIGJpbmRpbmcgdXNlZCBieSB0aGUgcG9ydC1jb21wb25lbnQuICBGb3IKLQkgICBwb3J0YWJpbGl0eSBvbmUgY291bGQgdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRva2VucyB0aGF0Ci0JICAgYWxpYXMgdGhlIHN0YW5kYXJkIGJpbmRpbmcgdHlwZXM6Ci0KLQkgICAgIyNTT0FQMTFfSFRUUAotCSAgICAjI1NPQVAxMV9IVFRQX01UT00KLSAgICAgICAgICAgICMjU09BUDEyX0hUVFAKLSAgICAgICAgICAgICMjU09BUDEyX0hUVFBfTVRPTQotICAgICAgICAgICAgIyNYTUxfSFRUUAotCi0JICAgT3RoZXIgc3BlY2lmaWNhdGlvbnMgY291bGQgZGVmaW5lIHRva2VucyB0aGF0IHN0YXJ0IHdpdGggIyMKLQkgICB0byBhbGlhcyBuZXcgc3RhbmRhcmQgYmluZGluZyBVUklzIHRoYXQgYXJlIGludHJvZHVjZWQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDp1bmlvbiBtZW1iZXJUeXBlcz0ieHNkOmFueVVSSSBqYXZhZWU6c2VydmljZS1yZWZfcHJvdG9jb2wtVVJJQWxpYXNUeXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ic2VydmljZS1yZWZfcW5hbWUtcGF0dGVybiI+Ci0gICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICAgVGhpcyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIFFOYW1lIHBhdHRlcm4gaW4gdGhlCi0JICAgICBhdHRyaWJ1dGUgc2VydmljZS1uYW1lLXBhdHRlcm4gYW5kIHBvcnQtbmFtZS1wYXR0ZXJuIGluCi0JICAgICB0aGUgaGFuZGxlci1jaGFpbiBlbGVtZW50Ci0KLQkgICAgIEZvciBleGFtcGxlLCB0aGUgdmFyaW91cyBmb3JtcyBhY2NlcHRhYmxlIGhlcmUgZm9yCi0JICAgICBzZXJ2aWNlLW5hbWUtcGF0dGVybiBhdHRyaWJ1dGUgaW4gaGFuZGxlci1jaGFpbiBlbGVtZW50Ci0JICAgICBhcmUgOgotCi0JICAgICBFeGFjdCBOYW1lOiBzZXJ2aWNlLW5hbWUtcGF0dGVybj0ibnMxOkVjaG9TZXJ2aWNlIgotCi0JCSBJbiB0aGlzIGNhc2UsIGhhbmRsZXJzIHNwZWNpZmllZCBpbiB0aGlzCi0JCSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgd2lsbCBhcHBseSB0byBhbGwgcG9ydHMgd2l0aAotCQkgdGhpcyBleGFjdCBzZXJ2aWNlIG5hbWUuIFRoZSBuYW1lc3BhY2UgcHJlZml4IG11c3QKLQkJIGhhdmUgYmVlbiBkZWNsYXJlZCBpbiBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbgotCQkgYXR0cmlidXRlIGluIGVpdGhlciB0aGUgc3RhcnQtdGFnIG9mIHRoZSBlbGVtZW50Ci0JCSB3aGVyZSB0aGUgcHJlZml4IGlzIHVzZWQgb3IgaW4gYW4gYW4gYW5jZXN0b3IKLQkJIGVsZW1lbnQgKGkuZS4gYW4gZWxlbWVudCBpbiB3aG9zZSBjb250ZW50IHRoZQotCQkgcHJlZml4ZWQgbWFya3VwIG9jY3VycykKLQotCSAgICAgUGF0dGVybiA6IHNlcnZpY2UtbmFtZS1wYXR0ZXJuPSJuczE6RWNob1NlcnZpY2UqIgotCi0JCSBJbiB0aGlzIGNhc2UsIGhhbmRsZXJzIHNwZWNpZmllZCBpbiB0aGlzCi0JCSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgd2lsbCBhcHBseSB0byBhbGwgcG9ydHMgd2hvc2UKLQkJIFNlcnZpY2UgbmFtZXMgYXJlIGxpa2UgRWNob1NlcnZpY2UxLCBFY2hvU2VydmljZUZvbwotCQkgZXRjLiBUaGUgbmFtZXNwYWNlIHByZWZpeCBtdXN0IGhhdmUgYmVlbiBkZWNsYXJlZCBpbgotCQkgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gYXR0cmlidXRlIGluIGVpdGhlciB0aGUKLQkJIHN0YXJ0LXRhZyBvZiB0aGUgZWxlbWVudCB3aGVyZSB0aGUgcHJlZml4IGlzIHVzZWQgb3IKLQkJIGluIGFuIGFuIGFuY2VzdG9yIGVsZW1lbnQgKGkuZS4gYW4gZWxlbWVudCBpbiB3aG9zZQotCQkgY29udGVudCB0aGUgcHJlZml4ZWQgbWFya3VwIG9jY3VycykKLQotCSAgICAgV2lsZCBDYXJkIDogc2VydmljZS1uYW1lLXBhdHRlcm49IioiCi0KLQkJSW4gdGhpcyBjYXNlLCBoYW5kbGVycyBzcGVjaWZpZWQgaW4gdGhpcyBoYW5kbGVyLWNoYWluCi0JCWVsZW1lbnQgd2lsbCBhcHBseSB0byBwb3J0cyBvZiBhbGwgc2VydmljZSBuYW1lcy4KLQotCSAgICBUaGUgc2FtZSBjYW4gYmUgYXBwbGllZCB0byBwb3J0LW5hbWUgYXR0cmlidXRlIGluCi0JICAgIGhhbmRsZXItY2hhaW4gZWxlbWVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJcKnwoW1xpLVs6XV1bXGMtWzpdXSo6KT9bXGktWzpdXVtcYy1bOl1dKlwqPyIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8zLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8zLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2NzNhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw3MzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgICAgICAgICB2ZXJzaW9uPSIxLjMiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgotICAgICAgCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAgIAotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uCi0gICAgICBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUKLSAgICAgICJMaWNlbnNlIikuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgICAgIHRoZSBMaWNlbnNlLiBZb3UgY2FuIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgICAgIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUEwuaHRtbCBvcgotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotICAgICAgTGljZW5zZS4KLSAgICAgIAotICAgICAgV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIKLSAgICAgIE5vdGljZSBpbiBlYWNoIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdAotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAgICAgIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMKLSAgICAgIHByb3ZpZGVkIGJ5IFN1biBpbiB0aGUgR1BMIFZlcnNpb24gMiBzZWN0aW9uIG9mIHRoZSBMaWNlbnNlIGZpbGUKLSAgICAgIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLiAgSWYgYXBwbGljYWJsZSwgYWRkIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFtdCi0gICAgICByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKLSAgICAgICJQb3J0aW9ucyBDb3B5cmlnaHRlZCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSIKLSAgICAgIAotICAgICAgQ29udHJpYnV0b3Iocyk6Ci0gICAgICAKLSAgICAgIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUKLSAgICAgIENEREwgb3Igb25seSB0aGUgR1BMIFZlcnNpb24gMiwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBhZGRpbmcKLSAgICAgICJbQ29udHJpYnV0b3JdIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcwotICAgICAgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwgVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdQotICAgICAgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEgcmVjaXBpZW50IGhhcyB0aGUKLSAgICAgIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZQotICAgICAgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0byBpdHMKLSAgICAgIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMgotICAgICAgY29kZSBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlCi0gICAgICBvcHRpb24gYXBwbGllcyBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaAotICAgICAgb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyLgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAoQykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gMjAwMgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgc2VydmljZS1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIHJlZmVyZW5jZSB0byBhIFdlYgotICAgICAgICBzZXJ2aWNlLiBJdCBjb250YWlucyBvcHRpb25hbCBkZXNjcmlwdGlvbiwgZGlzcGxheSBuYW1lIGFuZAotICAgICAgICBpY29ucywgYSBkZWNsYXJhdGlvbiBvZiB0aGUgcmVxdWlyZWQgU2VydmljZSBpbnRlcmZhY2UsCi0gICAgICAgIGFuIG9wdGlvbmFsIFdTREwgZG9jdW1lbnQgbG9jYXRpb24sIGFuIG9wdGlvbmFsIHNldAotICAgICAgICBvZiBKQVgtUlBDIG1hcHBpbmdzLCBhbiBvcHRpb25hbCBRTmFtZSBmb3IgdGhlIHNlcnZpY2UgZWxlbWVudCwKLSAgICAgICAgYW4gb3B0aW9uYWwgc2V0IG9mIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlcyB0byBiZSByZXNvbHZlZCAKLSAgICAgICAgYnkgdGhlIGNvbnRhaW5lciB0byBhIFdTREwgcG9ydCwgYW5kIGFuIG9wdGlvbmFsIHNldCBvZiBoYW5kbGVycy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmpuZGktbmFtZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgc2VydmljZS1yZWYtbmFtZSBlbGVtZW50IGRlY2xhcmVzIGxvZ2ljYWwgbmFtZSB0aGF0IHRoZQotICAgICAgICAgICAgY29tcG9uZW50cyBpbiB0aGUgbW9kdWxlIHVzZSB0byBsb29rIHVwIHRoZSBXZWIgc2VydmljZS4gSXQgCi0gICAgICAgICAgICBpcyByZWNvbW1lbmRlZCB0aGF0IGFsbCBzZXJ2aWNlIHJlZmVyZW5jZSBuYW1lcyBzdGFydCB3aXRoIAotICAgICAgICAgICAgInNlcnZpY2UvIi4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtaW50ZXJmYWNlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHNlcnZpY2UtaW50ZXJmYWNlIGVsZW1lbnQgZGVjbGFyZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotICAgICAgICAgICAgbmFtZSBvZiB0aGUgSkFYLVJQQyBTZXJ2aWNlIGludGVyZmFjZSB0aGUgY2xpZW50IGRlcGVuZHMgb24uIAotICAgICAgICAgICAgSW4gbW9zdCBjYXNlcyB0aGUgdmFsdWUgd2lsbCBiZSBqYXZheC54bWwucnBjLlNlcnZpY2UuICBBIEpBWC1SUEMKLSAgICAgICAgICAgIGdlbmVyYXRlZCBTZXJ2aWNlIEludGVyZmFjZSBjbGFzcyBtYXkgYWxzbyBiZSBzcGVjaWZpZWQuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXJlZi10eXBlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgc2VydmljZS1yZWYtdHlwZSBlbGVtZW50IGRlY2xhcmVzIHRoZSB0eXBlIG9mIHRoZSBzZXJ2aWNlLXJlZiAKLSAgICAgICAgICAgIGVsZW1lbnQgdGhhdCBpcyBpbmplY3RlZCBvciByZXR1cm5lZCB3aGVuIGEgSk5ESSBsb29rdXAgaXMgZG9uZS4KLSAgICAgICAgICAgIFRoaXMgbXVzdCBiZSBlaXRoZXIgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBTZXJ2aWNlIGNsYXNzIG9yIAotICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIGNsYXNzLiAKLSAgICAgICAgICAgIFRoaXMgaXMgb25seSB1c2VkIHdpdGggSkFYLVdTIHJ1bnRpbWUgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgCi0gICAgICAgICAgICBAV2ViU2VydmljZVJlZiBhbm5vdGF0aW9uIGNhbiBiZSB1c2VkIHRvIGRlbm90ZSBib3RoIGEgU2VydmljZQotICAgICAgICAgICAgb3IgYSBQb3J0LgotICAgICAgICAgICAgCi0gICAgICAgICAgICBJZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlIHR5cGUgb2Ygc2VydmljZS1yZWYgZWxlbWVudCAKLSAgICAgICAgICAgIHRoYXQgaXMgaW5qZWN0ZWQgb3IgcmV0dXJuZWQgd2hlbiBhIEpOREkgbG9va3VwIGlzIGRvbmUgaXMgCi0gICAgICAgICAgICBhbHdheXMgYSBTZXJ2aWNlIGludGVyZmFjZS9jbGFzcy4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtZmlsZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkQW55VVJJVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHdzZGwtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBVUkkgbG9jYXRpb24gb2YgYSBXU0RMCi0gICAgICAgICAgICBmaWxlLiBUaGUgbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZS4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpheHJwYy1tYXBwaW5nLWZpbGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0Ci0gICAgICAgICAgICBkZXNjcmliZXMgdGhlIEpBWC1SUEMgbWFwcGluZyBiZXR3ZWVuIHRoZSBKYXZhIGludGVyYWNlcyB1c2VkIGJ5Ci0gICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuICBUaGUgCi0gICAgICAgICAgICBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlIGZpbGUuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRoaXMgaXMgbm90IHJlcXVpcmVkIHdoZW4gSkFYLVdTIGJhc2VkIHJ1bnRpbWUgaXMgdXNlZC4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnhzZFFOYW1lVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHNlcnZpY2UtcW5hbWUgZWxlbWVudCBkZWNsYXJlcyB0aGUgc3BlY2lmaWMgV1NETCBzZXJ2aWNlCi0gICAgICAgICAgICBlbGVtZW50IHRoYXQgaXMgYmVpbmcgcmVmZXJlZCB0by4gIEl0IGlzIG5vdCBzcGVjaWZpZWQgaWYgbm8KLSAgICAgICAgICAgIHdzZGwtZmlsZSBpcyBkZWNsYXJlZC4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtY29tcG9uZW50LXJlZiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cG9ydC1jb21wb25lbnQtcmVmVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgcG9ydC1jb21wb25lbnQtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGllbnQgZGVwZW5kZW5jeQotICAgICAgICAgICAgb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLSAgICAgICAgICAgIHRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKLSAgICAgICAgICAgIEludGVyZmFjZSB3aXRoIGEgcGFydGljdWxhciBwb3J0LWNvbXBvbmVudC4gVGhpcyBpcyBvbmx5IHVzZWQKLSAgICAgICAgICAgIGJ5IHRoZSBjb250YWluZXIgZm9yIGEgU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmhhbmRsZXJUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAJRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbgotICAgICAgICAgICAgICAJYWNjZXNzIHRoZSBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlCi0gICAgICAgICAgICAgIAlIYW5kbGVySW5mbyBpbnRlcmZhY2UuIElmIHBvcnQtbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUKLSAgICAgICAgICAgICAgCWhhbmRsZXIgaXMgYXNzdW1lZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggYWxsIHBvcnRzIG9mIHRoZQotICAgICAgICAgICAgICAJc2VydmljZS4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIAlUbyBiZSB1c2VkIHdpdGggSkFYLVJQQyBiYXNlZCBydW50aW1lIG9ubHkuCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jaGFpbnMiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aGFuZGxlci1jaGFpbnNUeXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgCSBUbyBiZSB1c2VkIHdpdGggSkFYLVdTIGJhc2VkIHJ1bnRpbWUgb25seS4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlR3JvdXAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9ydC1jb21wb25lbnQtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBwb3J0LWNvbXBvbmVudC1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIGNsaWVudCBkZXBlbmRlbmN5Ci0gICAgICAgIG9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi0gICAgICAgIHRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKLSAgICAgICAgSW50ZXJmYWNlIHdpdGggYSBwYXJ0aWN1bGFyIHBvcnQtY29tcG9uZW50LiBUaGlzIGlzIG9ubHkgdXNlZAotICAgICAgICBieSB0aGUgY29udGFpbmVyIGZvciBhIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UgZWxlbWVudCBkZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkCi0gICAgICAgICAgICBKYXZhIGNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2Ugb2YgYQotICAgICAgICAgICAgV1NETCBwb3J0LgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5hYmxlLW10b20iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBVc2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIFNPQVAgTVRPTS9YT1AgbWVjaGFuaXNtIG9uIHRoZSBjbGllbnQKLSAgICAgICAgICAgIHNpZGUgZm9yIGEgcG9ydC1jb21wb25lbnQuIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBOb3QgdG8gYmUgc3BlY2lmaWVkIGZvciBKQVgtUlBDIHJ1bnRpbWUKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im10b20tdGhyZXNob2xkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2ROb25OZWdhdGl2ZUludGVnZXJUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBXaGVuIE1UT00gaXMgZW5hYmxlZCwgYmluYXJ5IGRhdGEgYWJvdmUgdGhpcyBzaXplIGluIGJ5dGVzCi0gICAgICAgICAgICBzaG91bGQgYmUgWE9QIGVuY29kZWQgb3Igc2VudCBhcyBhdHRhY2htZW50LiBEZWZhdWx0IHZhbHVlIGlzIDAuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIE5vdCB0byBiZSBzcGVjaWZpZWQgZm9yIEpBWC1SUEMgcnVudGltZQotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRkcmVzc2luZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YWRkcmVzc2luZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoaXMgc3BlY2lmaWVzIHRoZSBXUy1BZGRyZXNzaW5nIHJlcXVpcmVtZW50cyBmb3IgYSBKQVgtV1MKLSAgICAgICAgICAgIHdlYiBzZXJ2aWNlLiBJdCBjb3JyZXNwb25kcyB0byBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nCi0gICAgICAgICAgICBhbm5vdGF0aW9uIG9yIGl0cyBmZWF0dXJlIGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3NpbmdGZWF0dXJlLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBTZWUgdGhlIGFkZHJlc3NpbmdUeXBlIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBOb3QgdG8gYmUgc3BlY2lmaWVkIGZvciBKQVgtUlBDIHJ1bnRpbWUKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc3BlY3QtYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cmVzcGVjdC1iaW5kaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnhtbC53cy5SZXNwZWN0QmluZGluZyBhbm5vdGF0aW9uCi0gICAgICAgICAgICBvciBpdHMgY29ycmVzcG9uZGluZyBqYXZheC54bWwud3MuUmVzcGVjdEJpbmRpbmdGZWF0dXJlIHdlYgotICAgICAgICAgICAgc2VydmljZSBmZWF0dXJlLiBUaGlzIGlzIHVzZWQgdG8gY29udHJvbCB3aGV0aGVyIGEgSkFYLVdTCi0gICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBtdXN0IHJlc3BlY3QvaG9ub3IgdGhlIGNvbnRlbnRzIG9mIHRoZQotICAgICAgICAgICAgd3NkbDpiaW5kaW5nIGluIHRoZSBXU0RMIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2aWNlLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBOb3QgdG8gYmUgc3BlY2lmaWVkIGZvciBKQVgtUlBDIHJ1bnRpbWUKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtY29tcG9uZW50LWxpbmsiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHBvcnQtY29tcG9uZW50LWxpbmsgZWxlbWVudCBsaW5rcyBhIHBvcnQtY29tcG9uZW50LXJlZgotICAgICAgICAgICAgdG8gYSBzcGVjaWZpYyBwb3J0LWNvbXBvbmVudCByZXF1aXJlZCB0byBiZSBtYWRlIGF2YWlsYWJsZQotICAgICAgICAgICAgYnkgYSBzZXJ2aWNlIHJlZmVyZW5jZS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgVGhlIHZhbHVlIG9mIGEgcG9ydC1jb21wb25lbnQtbGluayBtdXN0IGJlIHRoZQotICAgICAgICAgICAgcG9ydC1jb21wb25lbnQtbmFtZSBvZiBhIHBvcnQtY29tcG9uZW50IGluIHRoZSBzYW1lIG1vZHVsZQotICAgICAgICAgICAgb3IgYW5vdGhlciBtb2R1bGUgaW4gdGhlIHNhbWUgYXBwbGljYXRpb24gdW5pdC4gVGhlIHN5bnRheAotICAgICAgICAgICAgZm9yIHNwZWNpZmljYXRpb24gZm9sbG93cyB0aGUgc3ludGF4IGRlZmluZWQgZm9yIGVqYi1saW5rCi0gICAgICAgICAgICBpbiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImhhbmRsZXItY2hhaW5zVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBoYW5kbGVyLWNoYWlucyBlbGVtZW50IGRlZmluZXMgdGhlIGhhbmRsZXJjaGFpbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICAgICAgc2VydmljZSBvciBzZXJ2aWNlIGVuZHBvaW50LgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItY2hhaW4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmhhbmRsZXItY2hhaW5UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoYW5kbGVyLWNoYWluVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgZGVmaW5lcyB0aGUgaGFuZGxlcmNoYWluLiAKLSAgICAgICAgSGFuZGxlcmNoYWluIGNhbiBiZSBkZWZpbmVkIHN1Y2ggdGhhdCB0aGUgaGFuZGxlcnMgaW4gdGhlCi0gICAgICAgIGhhbmRsZXJjaGFpbiBvcGVyYXRlLGFsbCBwb3J0cyBvZiBhIHNlcnZpY2UsIG9uIGEgc3BlY2lmaWMKLSAgICAgICAgcG9ydCBvciBvbiBhIGxpc3Qgb2YgcHJvdG9jb2wtYmluZGluZ3MuIFRoZSBjaG9pY2Ugb2YgZWxlbWVudHMKLSAgICAgICAgc2VydmljZS1uYW1lLXBhdHRlcm4sIHBvcnQtbmFtZS1wYXR0ZXJuIGFuZCBwcm90b2NvbC1iaW5kaW5ncwotICAgICAgICBhcmUgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIGhhbmRsZXJzIGluIGhhbmRsZXItY2hhaW4gYXJlCi0gICAgICAgIGZvciBhIHNlcnZpY2UsIHBvcnQgb3IgcHJvdG9jb2wgYmluZGluZy4gSWYgbm9uZSBvZiB0aGVzZSAKLSAgICAgICAgY2hvaWNlcyBhcmUgc3BlY2lmaWVkIHdpdGggdGhlIGhhbmRsZXItY2hhaW4gZWxlbWVudCB0aGVuIHRoZQotICAgICAgICBoYW5kbGVycyBzcGVjaWZpZWQgaW4gdGhlIGhhbmRsZXItY2hhaW4gd2lsbCBiZSBhcHBsaWVkIG9uIAotICAgICAgICBldmVyeXRoaW5nLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtbmFtZS1wYXR0ZXJuIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnFuYW1lLXBhdHRlcm4iLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtbmFtZS1wYXR0ZXJuIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnFuYW1lLXBhdHRlcm4iLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3RvY29sLWJpbmRpbmdzIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnByb3RvY29sLWJpbmRpbmdMaXN0VHlwZSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXIiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmhhbmRsZXJUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMSIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icHJvdG9jb2wtYmluZGluZ0xpc3RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgdHlwZSB1c2VkIGZvciBzcGVjaWZ5aW5nIGEgbGlzdCBvZgotICAgICAgICBwcm90b2NvbC1iaW5kaW5nVHlwZShzKS4gRm9yIGUuZy4KLSAgICAgICAgCi0gICAgICAgICMjU09BUDExX0hUVFAgIyNTT0FQMTJfSFRUUCAjI1hNTF9IVFRQCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6bGlzdCBpdGVtVHlwZT0iamF2YWVlOnByb3RvY29sLWJpbmRpbmdUeXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InByb3RvY29sLWJpbmRpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgdHlwZSB1c2VkIGZvciBzcGVjaWZ5aW5nIHRoZSBVUkkgZm9yIHRoZQotICAgICAgICBwcm90b2NvbCBiaW5kaW5nIHVzZWQgYnkgdGhlIHBvcnQtY29tcG9uZW50LiAgRm9yCi0gICAgICAgIHBvcnRhYmlsaXR5IG9uZSBjb3VsZCB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgdG9rZW5zIHRoYXQKLSAgICAgICAgYWxpYXMgdGhlIHN0YW5kYXJkIGJpbmRpbmcgdHlwZXM6IAotICAgICAgICAKLSAgICAgICAgIyNTT0FQMTFfSFRUUAotICAgICAgICAjI1NPQVAxMV9IVFRQX01UT00KLSAgICAgICAgIyNTT0FQMTJfSFRUUAotICAgICAgICAjI1NPQVAxMl9IVFRQX01UT00KLSAgICAgICAgIyNYTUxfSFRUUAotICAgICAgICAKLSAgICAgICAgT3RoZXIgc3BlY2lmaWNhdGlvbnMgY291bGQgZGVmaW5lIHRva2VucyB0aGF0IHN0YXJ0IHdpdGggIyMKLSAgICAgICAgdG8gYWxpYXMgbmV3IHN0YW5kYXJkIGJpbmRpbmcgVVJJcyB0aGF0IGFyZSBpbnRyb2R1Y2VkLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnVuaW9uIG1lbWJlclR5cGVzPSJ4c2Q6YW55VVJJIGphdmFlZTpwcm90b2NvbC1VUklBbGlhc1R5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icHJvdG9jb2wtVVJJQWxpYXNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgdHlwZSB0aGF0IGlzIHVzZWQgZm9yIHNwZWNpZnlpbmcgdG9rZW5zIHRoYXQKLSAgICAgICAgc3RhcnQgd2l0aCAjIyB3aGljaCBhcmUgdXNlZCB0byBhbGlhcyBleGlzdGluZyBzdGFuZGFyZAotICAgICAgICBwcm90b2NvbCBiaW5kaW5ncyBhbmQgc3VwcG9ydCBhbGlhc2VzIGZvciBuZXcgc3RhbmRhcmQKLSAgICAgICAgYmluZGluZyBVUklzIHRoYXQgYXJlIGludHJvZHVjZWQgaW4gZnV0dXJlIHNwZWNpZmljYXRpb25zLgotICAgICAgICAKLSAgICAgICAgVGhlIGZvbGxvd2luZyB0b2tlbnMgYWxpYXMgdGhlIHN0YW5kYXJkIHByb3RvY29sIGJpbmRpbmcKLSAgICAgICAgVVJJczoKLSAgICAgICAgCi0gICAgICAgICMjU09BUDExX0hUVFAgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwL2h0dHAiCi0gICAgICAgICMjU09BUDExX0hUVFBfTVRPTSA9IAotICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwL2h0dHA/bXRvbT10cnVlIgotICAgICAgICAjI1NPQVAxMl9IVFRQID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC9iaW5kaW5ncy9IVFRQLyIKLSAgICAgICAgIyNTT0FQMTJfSFRUUF9NVE9NID0gCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUC8/bXRvbT10cnVlIgotICAgICAgICAjI1hNTF9IVFRQID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9odHRwIgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IiMjLisiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icW5hbWUtcGF0dGVybiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBRTmFtZSBwYXR0ZXJuIGluIHRoZQotICAgICAgICBhdHRyaWJ1dGUgc2VydmljZS1uYW1lLXBhdHRlcm4gYW5kIHBvcnQtbmFtZS1wYXR0ZXJuIGluCi0gICAgICAgIHRoZSBoYW5kbGVyLWNoYWluIGVsZW1lbnQKLSAgICAgICAgCi0gICAgICAgIEZvciBleGFtcGxlLCB0aGUgdmFyaW91cyBmb3JtcyBhY2NlcHRhYmxlIGhlcmUgZm9yCi0gICAgICAgIHNlcnZpY2UtbmFtZS1wYXR0ZXJuIGF0dHJpYnV0ZSBpbiBoYW5kbGVyLWNoYWluIGVsZW1lbnQKLSAgICAgICAgYXJlIDoKLSAgICAgICAgCi0gICAgICAgIEV4YWN0IE5hbWU6IHNlcnZpY2UtbmFtZS1wYXR0ZXJuPSJuczE6RWNob1NlcnZpY2UiCi0gICAgICAgIAotICAgICAgICAJIEluIHRoaXMgY2FzZSwgaGFuZGxlcnMgc3BlY2lmaWVkIGluIHRoaXMKLSAgICAgICAgCSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgd2lsbCBhcHBseSB0byBhbGwgcG9ydHMgd2l0aAotICAgICAgICAJIHRoaXMgZXhhY3Qgc2VydmljZSBuYW1lLiBUaGUgbmFtZXNwYWNlIHByZWZpeCBtdXN0Ci0gICAgICAgIAkgaGF2ZSBiZWVuIGRlY2xhcmVkIGluIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0gICAgICAgIAkgYXR0cmlidXRlIGluIGVpdGhlciB0aGUgc3RhcnQtdGFnIG9mIHRoZSBlbGVtZW50Ci0gICAgICAgIAkgd2hlcmUgdGhlIHByZWZpeCBpcyB1c2VkIG9yIGluIGFuIGFuIGFuY2VzdG9yIAotICAgICAgICAJIGVsZW1lbnQgKGkuZS4gYW4gZWxlbWVudCBpbiB3aG9zZSBjb250ZW50IHRoZSAKLSAgICAgICAgCSBwcmVmaXhlZCBtYXJrdXAgb2NjdXJzKQotICAgICAgICAJIAotICAgICAgICAKLSAgICAgICAgUGF0dGVybiA6IHNlcnZpY2UtbmFtZS1wYXR0ZXJuPSJuczE6RWNob1NlcnZpY2UqIgotICAgICAgICAKLSAgICAgICAgCSBJbiB0aGlzIGNhc2UsIGhhbmRsZXJzIHNwZWNpZmllZCBpbiB0aGlzCi0gICAgICAgIAkgaGFuZGxlci1jaGFpbiBlbGVtZW50IHdpbGwgYXBwbHkgdG8gYWxsIHBvcnRzIHdob3NlCi0gICAgICAgIAkgU2VydmljZSBuYW1lcyBhcmUgbGlrZSBFY2hvU2VydmljZTEsIEVjaG9TZXJ2aWNlRm9vCi0gICAgICAgIAkgZXRjLiBUaGUgbmFtZXNwYWNlIHByZWZpeCBtdXN0IGhhdmUgYmVlbiBkZWNsYXJlZCBpbgotICAgICAgICAJIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGF0dHJpYnV0ZSBpbiBlaXRoZXIgdGhlCi0gICAgICAgIAkgc3RhcnQtdGFnIG9mIHRoZSBlbGVtZW50IHdoZXJlIHRoZSBwcmVmaXggaXMgdXNlZCBvcgotICAgICAgICAJIGluIGFuIGFuIGFuY2VzdG9yIGVsZW1lbnQgKGkuZS4gYW4gZWxlbWVudCBpbiB3aG9zZSAKLSAgICAgICAgCSBjb250ZW50IHRoZSBwcmVmaXhlZCBtYXJrdXAgb2NjdXJzKQotICAgICAgICAKLSAgICAgICAgV2lsZCBDYXJkIDogc2VydmljZS1uYW1lLXBhdHRlcm49IioiCi0gICAgICAgIAotICAgICAgICAJSW4gdGhpcyBjYXNlLCBoYW5kbGVycyBzcGVjaWZpZWQgaW4gdGhpcyBoYW5kbGVyLWNoYWluCi0gICAgICAgIAllbGVtZW50IHdpbGwgYXBwbHkgdG8gcG9ydHMgb2YgYWxsIHNlcnZpY2UgbmFtZXMuCi0gICAgICAgIAotICAgICAgICBUaGUgc2FtZSBjYW4gYmUgYXBwbGllZCB0byBwb3J0LW5hbWUgYXR0cmlidXRlIGluCi0gICAgICAgIGhhbmRsZXItY2hhaW4gZWxlbWVudC4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJcKnwoW1xpLVs6XV1bXGMtWzpdXSo6KT9bXGktWzpdXVtcYy1bOl1dKlwqPyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFkZHJlc3NpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBzcGVjaWZpZXMgdGhlIFdTLUFkZHJlc3NpbmcgcmVxdWlyZW1lbnRzIGZvciBhIEpBWC1XUyB3ZWIgc2VydmljZS4KLSAgICAgICAgSXQgY29ycmVzcG9uZHMgdG8gamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZyBhbm5vdGF0aW9uIG9yIGl0cwotICAgICAgICBmZWF0dXJlIGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3NpbmdGZWF0dXJlLgotICAgICAgICAKLSAgICAgICAgSWYgdGhlICJlbmFibGVkIiBlbGVtZW50IGlzICJ0cnVlIiwgV1MtQWRkcmVzc2luZyBpcyBlbmFibGVkLgotICAgICAgICBJdCBtZWFucyB0aGF0IHRoZSBlbmRwb2ludCBzdXBwb3J0cyBXUy1BZGRyZXNzaW5nIGJ1dCBkb2VzIG5vdCByZXF1aXJlCi0gICAgICAgIGl0cyB1c2UuIFRoZSBkZWZhdWx0IHZhbHVlIGZvciAiZW5hYmxlZCIgaXMgInRydWUiLgotICAgICAgICAKLSAgICAgICAgSWYgdGhlIFdTLUFkZHJlc3NpbmcgaXMgZW5hYmxlZCBhbmQgdGhlICJyZXF1aXJlZCIgZWxlbWVudCBpcyAidHJ1ZSIsCi0gICAgICAgIGl0IG1lYW5zIHRoYXQgdGhlIGVuZHBvaW50IHJlcXVpcmVzIFdTLUFkZHJlc3NpbmcuIFRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgIGZvciAicmVxdWlyZWQiIGlzICJmYWxzZSIuCi0gICAgICAgIAotICAgICAgICBJZiBXUy1BZGRyZXNzaW5nIGlzIGVuYWJsZWQsIHRoZSAicmVzcG9uc2VzIiBlbGVtZW50IGRldGVybWluZXMKLSAgICAgICAgaWYgYW4gZW5kcG9pbnQgcmVxdWlyZXMgdGhlIHVzZSBvZiBvbmx5IGFub255bW91cyByZXNwb25zZXMsCi0gICAgICAgIG9yIG9ubHkgbm9uLWFub255bW91cyByZXNwb25zZXMsIG9yIGFsbC4gVGhlIHZhbHVlIG9mIHRoZSAicmVzcG9uc2VzIgotICAgICAgICBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIAotICAgICAgICBBTk9OWU1PVVMKLSAgICAgICAgTk9OX0FOT05ZTU9VUwotICAgICAgICBBTEwKLSAgICAgICAgCi0gICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgInJlc3BvbnNlcyIgaXMgQUxMLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1aXJlZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YWRkcmVzc2luZy1yZXNwb25zZXNUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWRkcmVzc2luZy1yZXNwb25zZXNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgSWYgV1MtQWRkcmVzc2luZyBpcyBlbmFibGVkLCB0aGlzIHR5cGUgZGV0ZXJtaW5lcyBpZiBhbiBlbmRwb2ludAotICAgICAgICByZXF1aXJlcyB0aGUgdXNlIG9mIG9ubHkgYW5vbnltb3VzIHJlc3BvbnNlcywgb3Igb25seSBub24tYW5vbnltb3VzCi0gICAgICAgIHJlc3BvbnNlcywgb3IgYWxsLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTk9OWU1PVVMiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9OX0FOT05ZTU9VUyIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTEwiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc3BlY3QtYmluZGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBDb3JyZXNwb25kcyB0byB0aGUgamF2YXgueG1sLndzLlJlc3BlY3RCaW5kaW5nIGFubm90YXRpb24KLSAgICAgICAgb3IgaXRzIGNvcnJlc3BvbmRpbmcgamF2YXgueG1sLndzLlJlc3BlY3RCaW5kaW5nRmVhdHVyZSB3ZWIKLSAgICAgICAgc2VydmljZSBmZWF0dXJlLiBUaGlzIGlzIHVzZWQgdG8gY29udHJvbCB3aGV0aGVyIGEgSkFYLVdTCi0gICAgICAgIGltcGxlbWVudGF0aW9uIG11c3QgcmVzcGVjdC9ob25vciB0aGUgY29udGVudHMgb2YgdGhlCi0gICAgICAgIHdzZGw6YmluZGluZyBpbiB0aGUgV1NETCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZS4KLSAgICAgICAgCi0gICAgICAgIElmIHRoZSAiZW5hYmxlZCIgZWxlbWVudCBpcyAidHJ1ZSIsIHdzZGw6YmluZGluZyBpbiB0aGUKLSAgICAgICAgYXNzb2NpYXRlZCBXU0RMLCBpZiBhbnksIG11c3QgYmUgcmVzcGVjdGVkL2hvbm9yZWQuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5hYmxlZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoYW5kbGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LCBzZXJ2aWNlLXJlZi4gSGFuZGxlcnMgY2FuCi0gICAgICAgIGFjY2VzcyB0aGUgaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZSBIYW5kbGVySW5mbyBpbnRlcmZhY2UuCi0gICAgICAgIAotICAgICAgICBVc2VkIGluOiBwb3J0LWNvbXBvbmVudCwgc2VydmljZS1yZWYKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotICAgICAgICAgICAgbW9kdWxlLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIERlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24uCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwYXJhbS12YWx1ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgTm90IHRvIGJlIHNwZWNpZmllZCBmb3IgSkFYLVdTIHJ1bnRpbWUKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvYXAtaGVhZGVyIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp4c2RRTmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgRGVmaW5lcyB0aGUgUU5hbWUgb2YgYSBTT0FQIGhlYWRlciB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoZQotICAgICAgICAgICAgaGFuZGxlci4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgTm90IHRvIGJlIHNwZWNpZmllZCBmb3IgSkFYLVdTIHJ1bnRpbWUKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvYXAtcm9sZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBzb2FwLXJvbGUgZWxlbWVudCBjb250YWlucyBhIFNPQVAgYWN0b3IgZGVmaW5pdGlvbiB0aGF0IHRoZQotICAgICAgICAgICAgSGFuZGxlciB3aWxsIHBsYXkgYXMgYSByb2xlLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHBvcnQtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIFdTREwgcG9ydC1uYW1lIHRoYXQgYQotICAgICAgICAgICAgaGFuZGxlciBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoLiBJZiBwb3J0LW5hbWUgaXMgbm90Ci0gICAgICAgICAgICBzcGVjaWZpZWQsIHRoZSBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZCB3aXRoCi0gICAgICAgICAgICBhbGwgcG9ydHMgb2YgdGhlIHNlcnZpY2UuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIE5vdCB0byBiZSBzcGVjaWZpZWQgZm9yIEpBWC1XUyBydW50aW1lCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJzZXJ2aWNlLXJlZkdyb3VwIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZXJ2aWNlLXJlZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDprZXkgbmFtZT0ic2VydmljZS1yZWZfaGFuZGxlci1uYW1lLWtleSI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0gICAgICAgICAgICAgIHdpdGhpbiB0aGUgbW9kdWxlLgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6aGFuZGxlciIvPgotICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpoYW5kbGVyLW5hbWUiLz4KLSAgICAgICAgPC94c2Q6a2V5PgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvanNwXzJfMC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2pzcF8yXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzBhNzZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvanNwXzJfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjIuMCI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpanNwXzJfMC54c2RzCTEuMTcgMDMvMTgvMDMKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotICAgICAgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKU1AgMi4wIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgICAgdHlwZXMuICBUaGUgSlNQIDIuMCBzY2hlbWEgY29udGFpbnMgYWxsIHRoZSBzcGVjaWFsCi0gICAgICBzdHJ1Y3R1cmVzIGFuZCBkYXRhdHlwZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIHVzZSBKU1AgZmlsZXMKLSAgICAgIGZyb20gYSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIHNjaGVtYSBpcyB1c2VkIGJ5IHRoZSB3ZWItYXBwXzJfNC54c2QKLSAgICAgIGZpbGUgdG8gZGVmaW5lIEpTUCBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLWNvbmZpZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBqc3AtY29uZmlnVHlwZSBpcyB1c2VkIHRvIHByb3ZpZGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24KLQlpbmZvcm1hdGlvbiBmb3IgdGhlIEpTUCBmaWxlcyBpbiBhIHdlYiBhcHBsaWNhdGlvbi4gSXQgaGFzCi0JdHdvIHN1YmVsZW1lbnRzLCB0YWdsaWIgYW5kIGpzcC1wcm9wZXJ0eS1ncm91cC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWIiCi0JCSAgIHR5cGU9ImoyZWU6dGFnbGliVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpzcC1wcm9wZXJ0eS1ncm91cCIKLQkJICAgdHlwZT0iajJlZTpqc3AtcHJvcGVydHktZ3JvdXBUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLWZpbGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUganNwLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbCBwYXRoIHRvIGEgSlNQIGZpbGUKLQl3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBiZWdpbm5pbmcgd2l0aCBhIGAvJy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnBhdGhUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpzcC1wcm9wZXJ0eS1ncm91cFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBqc3AtcHJvcGVydHktZ3JvdXBUeXBlIGlzIHVzZWQgdG8gZ3JvdXAgYSBudW1iZXIgb2YKLQlmaWxlcyBzbyB0aGV5IGNhbiBiZSBnaXZlbiBnbG9iYWwgcHJvcGVydHkgaW5mb3JtYXRpb24uCi0JQWxsIGZpbGVzIHNvIGRlc2NyaWJlZCBhcmUgZGVlbWVkIHRvIGJlIEpTUCBmaWxlcy4gIFRoZQotCWZvbGxvd2luZyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgY2FuIGJlIGRlc2NyaWJlZDoKLQotCSAgICAtIENvbnRyb2wgd2hldGhlciBFTCBpcyBpZ25vcmVkCi0JICAgIC0gQ29udHJvbCB3aGV0aGVyIHNjcmlwdGluZyBlbGVtZW50cyBhcmUgaW52YWxpZAotCSAgICAtIEluZGljYXRlIHBhZ2VFbmNvZGluZyBpbmZvcm1hdGlvbi4KLQkgICAgLSBJbmRpY2F0ZSB0aGF0IGEgcmVzb3VyY2UgaXMgYSBKU1AgZG9jdW1lbnQgKFhNTCkKLQkgICAgLSBQcmVsdWRlIGFuZCBDb2RhIGF1dG9tYXRpYyBpbmNsdWRlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLQkJICAgdHlwZT0iajJlZTp1cmwtcGF0dGVyblR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWwtaWdub3JlZCIKLQkJICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IHNldCB0aGUgaXNFTElnbm9yZWQKLQkgICAgcHJvcGVydHkgb2YgYSBncm91cCBvZiBKU1AgcGFnZXMuICBCeSBkZWZhdWx0LCB0aGUKLQkgICAgRUwgZXZhbHVhdGlvbiBpcyBlbmFibGVkIGZvciBXZWIgQXBwbGljYXRpb25zIHVzaW5nCi0JICAgIGEgU2VydmxldCAyLjQgb3IgZ3JlYXRlciB3ZWIueG1sLCBhbmQgZGlzYWJsZWQKLQkgICAgb3RoZXJ3aXNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhZ2UtZW5jb2RpbmciCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgdmFsaWQgdmFsdWVzIG9mIHBhZ2UtZW5jb2RpbmcgYXJlIHRob3NlIG9mIHRoZQotCSAgICBwYWdlRW5jb2RpbmcgcGFnZSBkaXJlY3RpdmUuICBJdCBpcyBhCi0JICAgIHRyYW5zbGF0aW9uLXRpbWUgZXJyb3IgdG8gbmFtZSBkaWZmZXJlbnQgZW5jb2RpbmdzCi0JICAgIGluIHRoZSBwYWdlRW5jb2RpbmcgYXR0cmlidXRlIG9mIHRoZSBwYWdlIGRpcmVjdGl2ZQotCSAgICBvZiBhIEpTUCBwYWdlIGFuZCBpbiBhIEpTUCBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgICAgbWF0Y2hpbmcgdGhlIHBhZ2UuICBJdCBpcyBhbHNvIGEgdHJhbnNsYXRpb24tdGltZQotCSAgICBlcnJvciB0byBuYW1lIGRpZmZlcmVudCBlbmNvZGluZ3MgaW4gdGhlIHByb2xvZwotCSAgICBvciB0ZXh0IGRlY2xhcmF0aW9uIG9mIGEgZG9jdW1lbnQgaW4gWE1MIHN5bnRheCBhbmQKLQkgICAgaW4gYSBKU1AgY29uZmlndXJhdGlvbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBkb2N1bWVudC4KLQkgICAgSXQgaXMgbGVnYWwgdG8gbmFtZSB0aGUgc2FtZSBlbmNvZGluZyB0aHJvdWdoCi0JICAgIG11bGl0cGxlIG1lY2hhbmlzbXMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NyaXB0aW5nLWludmFsaWQiCi0JCSAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIENhbiBiZSB1c2VkIHRvIGVhc2lseSBkaXNhYmxlIHNjcmlwdGluZyBpbiBhCi0JICAgIGdyb3VwIG9mIEpTUCBwYWdlcy4gIEJ5IGRlZmF1bHQsIHNjcmlwdGluZyBpcwotCSAgICBlbmFibGVkLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlzLXhtbCIKLQkJICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgSWYgdHJ1ZSwgZGVub3RlcyB0aGF0IHRoZSBncm91cCBvZiByZXNvdXJjZXMKLQkgICAgdGhhdCBtYXRjaCB0aGUgVVJMIHBhdHRlcm4gYXJlIEpTUCBkb2N1bWVudHMsCi0JICAgIGFuZCB0aHVzIG11c3QgYmUgaW50ZXJwcmV0ZWQgYXMgWE1MIGRvY3VtZW50cy4KLQkgICAgSWYgZmFsc2UsIHRoZSByZXNvdXJjZXMgYXJlIGFzc3VtZWQgdG8gbm90Ci0JICAgIGJlIEpTUCBkb2N1bWVudHMsIHVubGVzcyB0aGVyZSBpcyBhbm90aGVyCi0JICAgIHByb3BlcnR5IGdyb3VwIHRoYXQgaW5kaWNhdGVzIG90aGVyd2lzZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmNsdWRlLXByZWx1ZGUiCi0JCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgaW5jbHVkZS1wcmVsdWRlIGVsZW1lbnQgaXMgYSBjb250ZXh0LXJlbGF0aXZlCi0JICAgIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZWxlbWVudCBpbiB0aGUKLQkgICAgV2ViIEFwcGxpY2F0aW9uLiAgV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LAotCSAgICB0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgKGFzCi0JICAgIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2gKLQkgICAgSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5jbHVkZS1jb2RhIgotCQkgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGluY2x1ZGUtY29kYSBlbGVtZW50IGlzIGEgY29udGV4dC1yZWxhdGl2ZQotCSAgICBwYXRoIHRoYXQgbXVzdCBjb3JyZXNwb25kIHRvIGFuIGVsZW1lbnQgaW4gdGhlCi0JICAgIFdlYiBBcHBsaWNhdGlvbi4gIFdoZW4gdGhlIGVsZW1lbnQgaXMgcHJlc2VudCwKLQkgICAgdGhlIGdpdmVuIHBhdGggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIChhcwotCSAgICBpbiBhbiBpbmNsdWRlIGRpcmVjdGl2ZSkgYXQgdGhlIGVuZCBvZiBlYWNoCi0JICAgIEpTUCBwYWdlIGluIHRoaXMganNwLXByb3BlcnR5LWdyb3VwLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhZ2xpYlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0YWdsaWJUeXBlIGRlZmluZXMgdGhlIHN5bnRheCBmb3IgZGVjbGFyaW5nIGluCi0JdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0aGF0IGEgdGFnIGxpYnJhcnkgaXMKLQlhdmFpbGFibGUgdG8gdGhlIGFwcGxpY2F0aW9uLiAgVGhpcyBjYW4gYmUgZG9uZQotCXRvIG92ZXJyaWRlIGltcGxpY2l0IG1hcCBlbnRyaWVzIGZyb20gVExEIGZpbGVzIGFuZAotCWZyb20gdGhlIGNvbnRhaW5lci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItdXJpIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIEEgdGFnbGliLXVyaSBlbGVtZW50IGRlc2NyaWJlcyBhIFVSSSBpZGVudGlmeWluZyBhCi0JICAgIHRhZyBsaWJyYXJ5IHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gIFRoZSBib2R5Ci0JICAgIG9mIHRoZSB0YWdsaWItdXJpIGVsZW1lbnQgbWF5IGJlIGVpdGhlciBhbgotCSAgICBhYnNvbHV0ZSBVUkkgc3BlY2lmaWNhdGlvbiwgb3IgYSByZWxhdGl2ZSBVUkkuCi0JICAgIFRoZXJlIHNob3VsZCBiZSBubyBlbnRyaWVzIGluIHdlYi54bWwgd2l0aCB0aGUKLQkgICAgc2FtZSB0YWdsaWItdXJpIHZhbHVlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliLWxvY2F0aW9uIgotCQkgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgdGhlIHRhZ2xpYi1sb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbgotCSAgICAoYXMgYSByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViCi0JICAgIGFwcGxpY2F0aW9uKSB3aGVyZSB0byBmaW5kIHRoZSBUYWcgTGlicmFyeQotCSAgICBEZXNjcmlwdGlvbiBmaWxlIGZvciB0aGUgdGFnIGxpYnJhcnkuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvanNwXzJfMS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2pzcF8yXzEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjYzMzg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvanNwXzJfMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjIuMSI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpanNwXzJfMS54c2RzCTEuNSAwOC8xMS8wNQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICAgICAgVS5TLkEKLSAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKU1AgMi4xIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgICAgdHlwZXMuICBUaGUgSlNQIDIuMSBzY2hlbWEgY29udGFpbnMgYWxsIHRoZSBzcGVjaWFsCi0gICAgICBzdHJ1Y3R1cmVzIGFuZCBkYXRhdHlwZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIHVzZSBKU1AgZmlsZXMKLSAgICAgIGZyb20gYSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIHNjaGVtYSBpcyB1c2VkIGJ5IHRoZSB3ZWItYXBwXzJfNS54c2QKLSAgICAgIGZpbGUgdG8gZGVmaW5lIEpTUCBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzUueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLWNvbmZpZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBqc3AtY29uZmlnVHlwZSBpcyB1c2VkIHRvIHByb3ZpZGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24KLQlpbmZvcm1hdGlvbiBmb3IgdGhlIEpTUCBmaWxlcyBpbiBhIHdlYiBhcHBsaWNhdGlvbi4gSXQgaGFzCi0JdHdvIHN1YmVsZW1lbnRzLCB0YWdsaWIgYW5kIGpzcC1wcm9wZXJ0eS1ncm91cC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWIiCi0JCSAgIHR5cGU9ImphdmFlZTp0YWdsaWJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianNwLXByb3BlcnR5LWdyb3VwIgotCQkgICB0eXBlPSJqYXZhZWU6anNwLXByb3BlcnR5LWdyb3VwVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpzcC1maWxlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGpzcC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGwgcGF0aCB0byBhIEpTUCBmaWxlCi0Jd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24gYmVnaW5uaW5nIHdpdGggYSBgLycuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnBhdGhUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpzcC1wcm9wZXJ0eS1ncm91cFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBqc3AtcHJvcGVydHktZ3JvdXBUeXBlIGlzIHVzZWQgdG8gZ3JvdXAgYSBudW1iZXIgb2YKLQlmaWxlcyBzbyB0aGV5IGNhbiBiZSBnaXZlbiBnbG9iYWwgcHJvcGVydHkgaW5mb3JtYXRpb24uCi0JQWxsIGZpbGVzIHNvIGRlc2NyaWJlZCBhcmUgZGVlbWVkIHRvIGJlIEpTUCBmaWxlcy4gIFRoZQotCWZvbGxvd2luZyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgY2FuIGJlIGRlc2NyaWJlZDoKLQotCSAgICAtIENvbnRyb2wgd2hldGhlciBFTCBpcyBpZ25vcmVkLgotCSAgICAtIENvbnRyb2wgd2hldGhlciBzY3JpcHRpbmcgZWxlbWVudHMgYXJlIGludmFsaWQuCi0JICAgIC0gSW5kaWNhdGUgcGFnZUVuY29kaW5nIGluZm9ybWF0aW9uLgotCSAgICAtIEluZGljYXRlIHRoYXQgYSByZXNvdXJjZSBpcyBhIEpTUCBkb2N1bWVudCAoWE1MKS4KLQkgICAgLSBQcmVsdWRlIGFuZCBDb2RhIGF1dG9tYXRpYyBpbmNsdWRlcy4KLSAgICAgICAgICAgIC0gQ29udHJvbCB3aGV0aGVyIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgI3sgaXMgYWxsb3dlZAotICAgICAgICAgICAgICB3aGVuIHVzZWQgYXMgYSBTdHJpbmcgbGl0ZXJhbC4KLSAgICAgICAgICAgIC0gQ29udHJvbCB3aGV0aGVyIHRlbXBsYXRlIHRleHQgY29udGFpbmluZyBvbmx5Ci0gICAgICAgICAgICAgIHdoaXRlc3BhY2VzIG11c3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSByZXNwb25zZSBvdXRwdXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLQkJICAgdHlwZT0iamF2YWVlOnVybC1wYXR0ZXJuVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbC1pZ25vcmVkIgotCQkgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIENhbiBiZSB1c2VkIHRvIGVhc2lseSBzZXQgdGhlIGlzRUxJZ25vcmVkCi0JICAgIHByb3BlcnR5IG9mIGEgZ3JvdXAgb2YgSlNQIHBhZ2VzLiAgQnkgZGVmYXVsdCwgdGhlCi0JICAgIEVMIGV2YWx1YXRpb24gaXMgZW5hYmxlZCBmb3IgV2ViIEFwcGxpY2F0aW9ucyB1c2luZwotCSAgICBhIFNlcnZsZXQgMi40IG9yIGdyZWF0ZXIgd2ViLnhtbCwgYW5kIGRpc2FibGVkCi0JICAgIG90aGVyd2lzZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWdlLWVuY29kaW5nIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgdmFsaWQgdmFsdWVzIG9mIHBhZ2UtZW5jb2RpbmcgYXJlIHRob3NlIG9mIHRoZQotCSAgICBwYWdlRW5jb2RpbmcgcGFnZSBkaXJlY3RpdmUuICBJdCBpcyBhCi0JICAgIHRyYW5zbGF0aW9uLXRpbWUgZXJyb3IgdG8gbmFtZSBkaWZmZXJlbnQgZW5jb2RpbmdzCi0JICAgIGluIHRoZSBwYWdlRW5jb2RpbmcgYXR0cmlidXRlIG9mIHRoZSBwYWdlIGRpcmVjdGl2ZQotCSAgICBvZiBhIEpTUCBwYWdlIGFuZCBpbiBhIEpTUCBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgICAgbWF0Y2hpbmcgdGhlIHBhZ2UuICBJdCBpcyBhbHNvIGEgdHJhbnNsYXRpb24tdGltZQotCSAgICBlcnJvciB0byBuYW1lIGRpZmZlcmVudCBlbmNvZGluZ3MgaW4gdGhlIHByb2xvZwotCSAgICBvciB0ZXh0IGRlY2xhcmF0aW9uIG9mIGEgZG9jdW1lbnQgaW4gWE1MIHN5bnRheCBhbmQKLQkgICAgaW4gYSBKU1AgY29uZmlndXJhdGlvbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBkb2N1bWVudC4KLQkgICAgSXQgaXMgbGVnYWwgdG8gbmFtZSB0aGUgc2FtZSBlbmNvZGluZyB0aHJvdWdoCi0JICAgIG11bGl0cGxlIG1lY2hhbmlzbXMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NyaXB0aW5nLWludmFsaWQiCi0JCSAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IGRpc2FibGUgc2NyaXB0aW5nIGluIGEKLQkgICAgZ3JvdXAgb2YgSlNQIHBhZ2VzLiAgQnkgZGVmYXVsdCwgc2NyaXB0aW5nIGlzCi0JICAgIGVuYWJsZWQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaXMteG1sIgotCQkgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIElmIHRydWUsIGRlbm90ZXMgdGhhdCB0aGUgZ3JvdXAgb2YgcmVzb3VyY2VzCi0JICAgIHRoYXQgbWF0Y2ggdGhlIFVSTCBwYXR0ZXJuIGFyZSBKU1AgZG9jdW1lbnRzLAotCSAgICBhbmQgdGh1cyBtdXN0IGJlIGludGVycHJldGVkIGFzIFhNTCBkb2N1bWVudHMuCi0JICAgIElmIGZhbHNlLCB0aGUgcmVzb3VyY2VzIGFyZSBhc3N1bWVkIHRvIG5vdAotCSAgICBiZSBKU1AgZG9jdW1lbnRzLCB1bmxlc3MgdGhlcmUgaXMgYW5vdGhlcgotCSAgICBwcm9wZXJ0eSBncm91cCB0aGF0IGluZGljYXRlcyBvdGhlcndpc2UuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5jbHVkZS1wcmVsdWRlIgotCQkgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgaW5jbHVkZS1wcmVsdWRlIGVsZW1lbnQgaXMgYSBjb250ZXh0LXJlbGF0aXZlCi0JICAgIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZWxlbWVudCBpbiB0aGUKLQkgICAgV2ViIEFwcGxpY2F0aW9uLiAgV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LAotCSAgICB0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgKGFzCi0JICAgIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2gKLQkgICAgSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5jbHVkZS1jb2RhIgotCQkgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgaW5jbHVkZS1jb2RhIGVsZW1lbnQgaXMgYSBjb250ZXh0LXJlbGF0aXZlCi0JICAgIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZWxlbWVudCBpbiB0aGUKLQkgICAgV2ViIEFwcGxpY2F0aW9uLiAgV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LAotCSAgICB0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgKGFzCi0JICAgIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgZW5kIG9mIGVhY2gKLQkgICAgSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmZXJyZWQtc3ludGF4LWFsbG93ZWQtYXMtbGl0ZXJhbCIKLQkJICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgIFRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgI3sgaXMgcmVzZXJ2ZWQgZm9yIEVMIGV4cHJlc3Npb25zLgotICAgICAgICAgICAgIENvbnNlcXVlbnRseSwgYSB0cmFuc2xhdGlvbiBlcnJvciBvY2N1cnMgaWYgdGhlICN7Ci0gICAgICAgICAgICAgY2hhcmFjdGVyIHNlcXVlbmNlIGlzIHVzZWQgYXMgYSBTdHJpbmcgbGl0ZXJhbCwgdW5sZXNzCi0gICAgICAgICAgICAgdGhpcyBlbGVtZW50IGlzIGVuYWJsZWQgKHRydWUpLiBEaXNhYmxlZCAoZmFsc2UpIGJ5Ci0gICAgICAgICAgICAgZGVmYXVsdC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmltLWRpcmVjdGl2ZS13aGl0ZXNwYWNlcyIKLQkJICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgIEluZGljYXRlcyB0aGF0IHRlbXBsYXRlIHRleHQgY29udGFpbmluZyBvbmx5IHdoaXRlc3BhY2VzCi0gICAgICAgICAgICAgbXVzdCBiZSByZW1vdmVkIGZyb20gdGhlIHJlc3BvbnNlIG91dHB1dC4gSXQgaGFzIG5vCi0gICAgICAgICAgICAgZWZmZWN0IG9uIEpTUCBkb2N1bWVudHMgKFhNTCBzeW50YXgpLiBEaXNhYmxlZCAoZmFsc2UpCi0gICAgICAgICAgICAgYnkgZGVmYXVsdC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWdsaWJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdGFnbGliVHlwZSBkZWZpbmVzIHRoZSBzeW50YXggZm9yIGRlY2xhcmluZyBpbgotCXRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgdGhhdCBhIHRhZyBsaWJyYXJ5IGlzCi0JYXZhaWxhYmxlIHRvIHRoZSBhcHBsaWNhdGlvbi4gIFRoaXMgY2FuIGJlIGRvbmUKLQl0byBvdmVycmlkZSBpbXBsaWNpdCBtYXAgZW50cmllcyBmcm9tIFRMRCBmaWxlcyBhbmQKLQlmcm9tIHRoZSBjb250YWluZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliLXVyaSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIEEgdGFnbGliLXVyaSBlbGVtZW50IGRlc2NyaWJlcyBhIFVSSSBpZGVudGlmeWluZyBhCi0JICAgIHRhZyBsaWJyYXJ5IHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gIFRoZSBib2R5Ci0JICAgIG9mIHRoZSB0YWdsaWItdXJpIGVsZW1lbnQgbWF5IGJlIGVpdGhlciBhbgotCSAgICBhYnNvbHV0ZSBVUkkgc3BlY2lmaWNhdGlvbiwgb3IgYSByZWxhdGl2ZSBVUkkuCi0JICAgIFRoZXJlIHNob3VsZCBiZSBubyBlbnRyaWVzIGluIHdlYi54bWwgd2l0aCB0aGUKLQkgICAgc2FtZSB0YWdsaWItdXJpIHZhbHVlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliLWxvY2F0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICB0aGUgdGFnbGliLWxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uCi0JICAgIChhcyBhIHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIKLQkgICAgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZyBMaWJyYXJ5Ci0JICAgIERlc2NyaXB0aW9uIGZpbGUgZm9yIHRoZSB0YWcgbGlicmFyeS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qc3BfMl8yLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvanNwXzJfMi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNDFlNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qc3BfMl8yLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgICAgICAgIHZlcnNpb249IjIuMiI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0gICAgICAKLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICAgCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24KLSAgICAgIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZQotICAgICAgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICAgdGhlIExpY2Vuc2UuIFlvdSBjYW4gb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sIG9yCi0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0gICAgICBMaWNlbnNlLgotICAgICAgCi0gICAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlcgotICAgICAgTm90aWNlIGluIGVhY2ggZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0Ci0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICAgICAgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcwotICAgICAgcHJvdmlkZWQgYnkgU3VuIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UgZmlsZQotICAgICAgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZwotICAgICAgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10KLSAgICAgIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICAgIlBvcnRpb25zIENvcHlyaWdodGVkIFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotICAgICAgCi0gICAgICBDb250cmlidXRvcihzKToKLSAgICAgIAotICAgICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZQotICAgICAgQ0RETCBvciBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZwotICAgICAgIltDb250cmlidXRvcl0gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTCBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91Ci0gICAgICBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYSByZWNpcGllbnQgaGFzIHRoZQotICAgICAgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlCi0gICAgICBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvIGl0cwotICAgICAgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyCi0gICAgICBjb2RlIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUKLSAgICAgIG9wdGlvbiBhcHBsaWVzIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoCi0gICAgICBvcHRpb24gYnkgdGhlIGNvcHlyaWdodCBob2xkZXIuCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKU1AgMi4yIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgICAgdHlwZXMuICBUaGUgSlNQIDIuMiBzY2hlbWEgY29udGFpbnMgYWxsIHRoZSBzcGVjaWFsCi0gICAgICBzdHJ1Y3R1cmVzIGFuZCBkYXRhdHlwZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIHVzZSBKU1AgZmlsZXMKLSAgICAgIGZyb20gYSB3ZWIgYXBwbGljYXRpb24uIAotICAgICAgCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBzY2hlbWEgaXMgdXNlZCBieSB0aGUgd2ViLWNvbW1vbl8zXzAueHNkIAotICAgICAgZmlsZSB0byBkZWZpbmUgSlNQIHNwZWNpZmljIGNvbnRlbnQuIAotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0gICAgICAKLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLSAgICAgIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gICAgICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAgICAgIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLSAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0gICAgICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICAgICAgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0gICAgICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqYXZhZWVfNi54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqc3AtY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBqc3AtY29uZmlnVHlwZSBpcyB1c2VkIHRvIHByb3ZpZGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgaW5mb3JtYXRpb24gZm9yIHRoZSBKU1AgZmlsZXMgaW4gYSB3ZWIgYXBwbGljYXRpb24uIEl0IGhhcwotICAgICAgICB0d28gc3ViZWxlbWVudHMsIHRhZ2xpYiBhbmQganNwLXByb3BlcnR5LWdyb3VwLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dGFnbGliVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqc3AtcHJvcGVydHktZ3JvdXAiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmpzcC1wcm9wZXJ0eS1ncm91cFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpzcC1maWxlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBqc3AtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxsIHBhdGggdG8gYSBKU1AgZmlsZQotICAgICAgICB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBiZWdpbm5pbmcgd2l0aCBhIGAvJy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6cGF0aFR5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqc3AtcHJvcGVydHktZ3JvdXBUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGpzcC1wcm9wZXJ0eS1ncm91cFR5cGUgaXMgdXNlZCB0byBncm91cCBhIG51bWJlciBvZgotICAgICAgICBmaWxlcyBzbyB0aGV5IGNhbiBiZSBnaXZlbiBnbG9iYWwgcHJvcGVydHkgaW5mb3JtYXRpb24uCi0gICAgICAgIEFsbCBmaWxlcyBzbyBkZXNjcmliZWQgYXJlIGRlZW1lZCB0byBiZSBKU1AgZmlsZXMuICBUaGUKLSAgICAgICAgZm9sbG93aW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyBjYW4gYmUgZGVzY3JpYmVkOgotICAgICAgICAKLSAgICAgICAgLSBDb250cm9sIHdoZXRoZXIgRUwgaXMgaWdub3JlZC4KLSAgICAgICAgLSBDb250cm9sIHdoZXRoZXIgc2NyaXB0aW5nIGVsZW1lbnRzIGFyZSBpbnZhbGlkLgotICAgICAgICAtIEluZGljYXRlIHBhZ2VFbmNvZGluZyBpbmZvcm1hdGlvbi4KLSAgICAgICAgLSBJbmRpY2F0ZSB0aGF0IGEgcmVzb3VyY2UgaXMgYSBKU1AgZG9jdW1lbnQgKFhNTCkuCi0gICAgICAgIC0gUHJlbHVkZSBhbmQgQ29kYSBhdXRvbWF0aWMgaW5jbHVkZXMuCi0gICAgICAgIC0gQ29udHJvbCB3aGV0aGVyIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgI3sgaXMgYWxsb3dlZAotICAgICAgICB3aGVuIHVzZWQgYXMgYSBTdHJpbmcgbGl0ZXJhbC4KLSAgICAgICAgLSBDb250cm9sIHdoZXRoZXIgdGVtcGxhdGUgdGV4dCBjb250YWluaW5nIG9ubHkKLSAgICAgICAgd2hpdGVzcGFjZXMgbXVzdCBiZSByZW1vdmVkIGZyb20gdGhlIHJlc3BvbnNlIG91dHB1dC4KLSAgICAgICAgLSBJbmRpY2F0ZSB0aGUgZGVmYXVsdCBjb250ZW50VHlwZSBpbmZvcm1hdGlvbi4KLSAgICAgICAgLSBJbmRpY2F0ZSB0aGUgZGVmYXVsdCBidWZmZXJpbmcgbW9kZWwgZm9yIEpzcFdyaXRlcgotICAgICAgICAtIENvbnRyb2wgd2hldGhlciBlcnJvciBzaG91bGQgYmUgcmFpc2VkIGZvciB0aGUgdXNlIG9mCi0gICAgICAgIHVuZGVjbGFyZWQgbmFtZXNwYWNlcyBpbiBhIEpTUCBwYWdlLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnVybC1wYXR0ZXJuVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVsLWlnbm9yZWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIENhbiBiZSB1c2VkIHRvIGVhc2lseSBzZXQgdGhlIGlzRUxJZ25vcmVkCi0gICAgICAgICAgICBwcm9wZXJ0eSBvZiBhIGdyb3VwIG9mIEpTUCBwYWdlcy4gIEJ5IGRlZmF1bHQsIHRoZQotICAgICAgICAgICAgRUwgZXZhbHVhdGlvbiBpcyBlbmFibGVkIGZvciBXZWIgQXBwbGljYXRpb25zIHVzaW5nCi0gICAgICAgICAgICBhIFNlcnZsZXQgMi40IG9yIGdyZWF0ZXIgd2ViLnhtbCwgYW5kIGRpc2FibGVkCi0gICAgICAgICAgICBvdGhlcndpc2UuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWdlLWVuY29kaW5nIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHZhbGlkIHZhbHVlcyBvZiBwYWdlLWVuY29kaW5nIGFyZSB0aG9zZSBvZiB0aGUKLSAgICAgICAgICAgIHBhZ2VFbmNvZGluZyBwYWdlIGRpcmVjdGl2ZS4gIEl0IGlzIGEKLSAgICAgICAgICAgIHRyYW5zbGF0aW9uLXRpbWUgZXJyb3IgdG8gbmFtZSBkaWZmZXJlbnQgZW5jb2RpbmdzCi0gICAgICAgICAgICBpbiB0aGUgcGFnZUVuY29kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgcGFnZSBkaXJlY3RpdmUKLSAgICAgICAgICAgIG9mIGEgSlNQIHBhZ2UgYW5kIGluIGEgSlNQIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotICAgICAgICAgICAgbWF0Y2hpbmcgdGhlIHBhZ2UuICBJdCBpcyBhbHNvIGEgdHJhbnNsYXRpb24tdGltZQotICAgICAgICAgICAgZXJyb3IgdG8gbmFtZSBkaWZmZXJlbnQgZW5jb2RpbmdzIGluIHRoZSBwcm9sb2cKLSAgICAgICAgICAgIG9yIHRleHQgZGVjbGFyYXRpb24gb2YgYSBkb2N1bWVudCBpbiBYTUwgc3ludGF4IGFuZAotICAgICAgICAgICAgaW4gYSBKU1AgY29uZmlndXJhdGlvbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBkb2N1bWVudC4KLSAgICAgICAgICAgIEl0IGlzIGxlZ2FsIHRvIG5hbWUgdGhlIHNhbWUgZW5jb2RpbmcgdGhyb3VnaAotICAgICAgICAgICAgbXVsaXRwbGUgbWVjaGFuaXNtcy4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjcmlwdGluZy1pbnZhbGlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBDYW4gYmUgdXNlZCB0byBlYXNpbHkgZGlzYWJsZSBzY3JpcHRpbmcgaW4gYQotICAgICAgICAgICAgZ3JvdXAgb2YgSlNQIHBhZ2VzLiAgQnkgZGVmYXVsdCwgc2NyaXB0aW5nIGlzCi0gICAgICAgICAgICBlbmFibGVkLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaXMteG1sIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBJZiB0cnVlLCBkZW5vdGVzIHRoYXQgdGhlIGdyb3VwIG9mIHJlc291cmNlcwotICAgICAgICAgICAgdGhhdCBtYXRjaCB0aGUgVVJMIHBhdHRlcm4gYXJlIEpTUCBkb2N1bWVudHMsCi0gICAgICAgICAgICBhbmQgdGh1cyBtdXN0IGJlIGludGVycHJldGVkIGFzIFhNTCBkb2N1bWVudHMuCi0gICAgICAgICAgICBJZiBmYWxzZSwgdGhlIHJlc291cmNlcyBhcmUgYXNzdW1lZCB0byBub3QKLSAgICAgICAgICAgIGJlIEpTUCBkb2N1bWVudHMsIHVubGVzcyB0aGVyZSBpcyBhbm90aGVyCi0gICAgICAgICAgICBwcm9wZXJ0eSBncm91cCB0aGF0IGluZGljYXRlcyBvdGhlcndpc2UuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmNsdWRlLXByZWx1ZGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBpbmNsdWRlLXByZWx1ZGUgZWxlbWVudCBpcyBhIGNvbnRleHQtcmVsYXRpdmUKLSAgICAgICAgICAgIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZWxlbWVudCBpbiB0aGUKLSAgICAgICAgICAgIFdlYiBBcHBsaWNhdGlvbi4gIFdoZW4gdGhlIGVsZW1lbnQgaXMgcHJlc2VudCwKLSAgICAgICAgICAgIHRoZSBnaXZlbiBwYXRoIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMKLSAgICAgICAgICAgIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2gKLSAgICAgICAgICAgIEpTUCBwYWdlIGluIHRoaXMganNwLXByb3BlcnR5LWdyb3VwLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5jbHVkZS1jb2RhIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgaW5jbHVkZS1jb2RhIGVsZW1lbnQgaXMgYSBjb250ZXh0LXJlbGF0aXZlCi0gICAgICAgICAgICBwYXRoIHRoYXQgbXVzdCBjb3JyZXNwb25kIHRvIGFuIGVsZW1lbnQgaW4gdGhlCi0gICAgICAgICAgICBXZWIgQXBwbGljYXRpb24uICBXaGVuIHRoZSBlbGVtZW50IGlzIHByZXNlbnQsCi0gICAgICAgICAgICB0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgKGFzCi0gICAgICAgICAgICBpbiBhbiBpbmNsdWRlIGRpcmVjdGl2ZSkgYXQgdGhlIGVuZCBvZiBlYWNoCi0gICAgICAgICAgICBKU1AgcGFnZSBpbiB0aGlzIGpzcC1wcm9wZXJ0eS1ncm91cC4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmVycmVkLXN5bnRheC1hbGxvd2VkLWFzLWxpdGVyYWwiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgI3sgaXMgcmVzZXJ2ZWQgZm9yIEVMIGV4cHJlc3Npb25zLgotICAgICAgICAgICAgQ29uc2VxdWVudGx5LCBhIHRyYW5zbGF0aW9uIGVycm9yIG9jY3VycyBpZiB0aGUgI3sKLSAgICAgICAgICAgIGNoYXJhY3RlciBzZXF1ZW5jZSBpcyB1c2VkIGFzIGEgU3RyaW5nIGxpdGVyYWwsIHVubGVzcwotICAgICAgICAgICAgdGhpcyBlbGVtZW50IGlzIGVuYWJsZWQgKHRydWUpLiBEaXNhYmxlZCAoZmFsc2UpIGJ5Ci0gICAgICAgICAgICBkZWZhdWx0LgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJpbS1kaXJlY3RpdmUtd2hpdGVzcGFjZXMiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIEluZGljYXRlcyB0aGF0IHRlbXBsYXRlIHRleHQgY29udGFpbmluZyBvbmx5IHdoaXRlc3BhY2VzCi0gICAgICAgICAgICBtdXN0IGJlIHJlbW92ZWQgZnJvbSB0aGUgcmVzcG9uc2Ugb3V0cHV0LiBJdCBoYXMgbm8KLSAgICAgICAgICAgIGVmZmVjdCBvbiBKU1AgZG9jdW1lbnRzIChYTUwgc3ludGF4KS4gRGlzYWJsZWQgKGZhbHNlKQotICAgICAgICAgICAgYnkgZGVmYXVsdC4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtY29udGVudC10eXBlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHZhbGlkIHZhbHVlcyBvZiBkZWZhdWx0LWNvbnRlbnQtdHlwZSBhcmUgdGhvc2Ugb2YgdGhlCi0gICAgICAgICAgICBjb250ZW50VHlwZSBwYWdlIGRpcmVjdGl2ZS4gIEl0IHNwZWNpZmllcyB0aGUgZGVmYXVsdAotICAgICAgICAgICAgcmVzcG9uc2UgY29udGVudFR5cGUgaWYgdGhlIHBhZ2UgZGlyZWN0aXZlIGRvZXMgbm90IGluY2x1ZGUKLSAgICAgICAgICAgIGEgY29udGVudFR5cGUgYXR0cmlidXRlLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYnVmZmVyIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHZhbGlkIHZhbHVlcyBvZiBidWZmZXIgYXJlIHRob3NlIG9mIHRoZQotICAgICAgICAgICAgYnVmZmVyIHBhZ2UgZGlyZWN0aXZlLiAgSXQgc3BlY2lmaWVzIGlmIGJ1ZmZlcmluZyBzaG91bGQgYmUKLSAgICAgICAgICAgIHVzZWQgZm9yIHRoZSBvdXRwdXQgdG8gcmVzcG9uc2UsIGFuZCBpZiBzbywgdGhlIHNpemUgb2YgdGhlCi0gICAgICAgICAgICBidWZmZXIgdG8gdXNlLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXJyb3Itb24tdW5kZWNsYXJlZC1uYW1lc3BhY2UiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIHdoZW4gYSB0YWcgd2l0aCB1bmtub3duIG5hbWVzcGFjZSBpcyB1c2VkCi0gICAgICAgICAgICBpbiBhIEpTUCBwYWdlIChyZWd1bGFyIHN5bnRheCkgaXMgdG8gc2lsZW50bHkgaWdub3JlIGl0LiAgSWYKLSAgICAgICAgICAgIHNldCB0byB0cnVlLCB0aGVuIGFuIGVycm9yIG11c3QgYmUgcmFpc2VkIGR1cmluZyB0aGUgdHJhbnNsYXRpb24KLSAgICAgICAgICAgIHRpbWUgd2hlbiBhbiB1bmRlY2xhcmVkIHRhZyBpcyB1c2VkIGluIGEgSlNQIHBhZ2UuICBEaXNhYmxlZAotICAgICAgICAgICAgKGZhbHNlKSBieSBkZWZhdWx0LgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhZ2xpYlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgdGFnbGliVHlwZSBkZWZpbmVzIHRoZSBzeW50YXggZm9yIGRlY2xhcmluZyBpbgotICAgICAgICB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRoYXQgYSB0YWcgbGlicmFyeSBpcwotICAgICAgICBhdmFpbGFibGUgdG8gdGhlIGFwcGxpY2F0aW9uLiAgVGhpcyBjYW4gYmUgZG9uZQotICAgICAgICB0byBvdmVycmlkZSBpbXBsaWNpdCBtYXAgZW50cmllcyBmcm9tIFRMRCBmaWxlcyBhbmQKLSAgICAgICAgZnJvbSB0aGUgY29udGFpbmVyLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYi11cmkiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIEEgdGFnbGliLXVyaSBlbGVtZW50IGRlc2NyaWJlcyBhIFVSSSBpZGVudGlmeWluZyBhCi0gICAgICAgICAgICB0YWcgbGlicmFyeSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uICBUaGUgYm9keQotICAgICAgICAgICAgb2YgdGhlIHRhZ2xpYi11cmkgZWxlbWVudCBtYXkgYmUgZWl0aGVyIGFuCi0gICAgICAgICAgICBhYnNvbHV0ZSBVUkkgc3BlY2lmaWNhdGlvbiwgb3IgYSByZWxhdGl2ZSBVUkkuCi0gICAgICAgICAgICBUaGVyZSBzaG91bGQgYmUgbm8gZW50cmllcyBpbiB3ZWIueG1sIHdpdGggdGhlCi0gICAgICAgICAgICBzYW1lIHRhZ2xpYi11cmkgdmFsdWUuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItbG9jYXRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgdGhlIHRhZ2xpYi1sb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbgotICAgICAgICAgICAgKGFzIGEgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYgotICAgICAgICAgICAgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZyBMaWJyYXJ5Ci0gICAgICAgICAgICBEZXNjcmlwdGlvbiBmaWxlIGZvciB0aGUgdGFnIGxpYnJhcnkuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvb3JtXzFfMC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL29ybV8xXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmQ5Yzc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvb3JtXzFfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIEphdmEgUGVyc2lzdGVuY2UgQVBJIG9iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZSBzY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybSIgCi0gIHhtbG5zOm9ybT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiAKLSAgdmVyc2lvbj0iMS4wIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKW9ybV8xXzAueHNkIDEuMCAgRmViIDE0IDIwMDYKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0KLSAgICAgIENvcHlyaWdodCAyMDA1LTIwMDcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24KLSAgICAgIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZQotICAgICAgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICAgdGhlIExpY2Vuc2UuIFlvdSBjYW4gb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sIG9yCi0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0gICAgICBMaWNlbnNlLgotCi0gICAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlcgotICAgICAgTm90aWNlIGluIGVhY2ggZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0Ci0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICAgICAgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcwotICAgICAgcHJvdmlkZWQgYnkgU3VuIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UgZmlsZQotICAgICAgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZwotICAgICAgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10KLSAgICAgIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICAgIlBvcnRpb25zIENvcHlyaWdodGVkIFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotCi0gICAgICBDb250cmlidXRvcihzKToKLQotICAgICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZQotICAgICAgQ0RETCBvciBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZwotICAgICAgIltDb250cmlidXRvcl0gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTCBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91Ci0gICAgICBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYSByZWNpcGllbnQgaGFzIHRoZQotICAgICAgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlCi0gICAgICBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvIGl0cwotICAgICAgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyCi0gICAgICBjb2RlIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUKLSAgICAgIG9wdGlvbiBhcHBsaWVzIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoCi0gICAgICBvcHRpb24gYnkgdGhlIGNvcHlyaWdodCBob2xkZXIuCi0KLSAgICAgIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIENEREwgbGljZW5zZS4KLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOmRvY3VtZW50YXRpb24+PCFbQ0RBVEFbCi0KLSAgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgcGVyc2lzdGVuY2Ugb2JqZWN0LXJlbGF0aW9uYWwgCi0gICAgICAgbWFwcGluZyBmaWxlLgotICAgICAgIFRoZSBmaWxlIG1heSBiZSBuYW1lZCAiTUVUQS1JTkYvb3JtLnhtbCIgaW4gdGhlIHBlcnNpc3RlbmNlIAotICAgICAgIGFyY2hpdmUgb3IgaXQgbWF5IGJlIG5hbWVkIHNvbWUgb3RoZXIgbmFtZSB3aGljaCB3b3VsZCBiZSAKLSAgICAgICB1c2VkIHRvIGxvY2F0ZSB0aGUgZmlsZSBhcyByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLgotCi0gICAgIF1dPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiLz4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idmVyc2lvblR5cGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV0rKFwuWzAtOV0rKSoiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1tYXBwaW5ncyI+Ci0gICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbnRpdHktbWFwcGluZ3MgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuIG1hcHBpbmcKLSAgICAgICAgZmlsZS4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmb3VyIHR5cGVzIG9mIGVsZW1lbnRzOgotCi0gICAgICAgIDEuIFRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgY29udGFpbnMgbWV0YWRhdGEKLSAgICAgICAgZm9yIHRoZSBlbnRpcmUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIGlmIHRoaXMgZWxlbWVudAotICAgICAgICBvY2N1cnMgaW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcyB3aXRoaW4gdGhlIHNhbWUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgCi0gICAgICAgIDIuIFRoZSBwYWNrYWdlLCBzY2hlbWEsIGNhdGFsb2cgYW5kIGFjY2VzcyBlbGVtZW50cyBhcHBseSB0byBhbGwgb2YKLSAgICAgICAgdGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZGVmaW5lZCBpbgotICAgICAgICB0aGUgc2FtZSBmaWxlIGluIHdoaWNoIHRoZXkgb2NjdXIuCi0KLSAgICAgICAgMy4gVGhlIHNlcXVlbmNlLWdlbmVyYXRvciwgdGFibGUtZ2VuZXJhdG9yLCBuYW1lZC1xdWVyeSwKLSAgICAgICAgbmFtZWQtbmF0aXZlLXF1ZXJ5IGFuZCBzcWwtcmVzdWx0LXNldC1tYXBwaW5nIGVsZW1lbnRzIGFyZSBnbG9iYWwKLSAgICAgICAgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUKLSAgICAgICAgc2VxdWVuY2UtZ2VuZXJhdG9yIG9yIHRhYmxlLWdlbmVyYXRvciBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lCi0gICAgICAgIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgYWxzbyAKLSAgICAgICAgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lZC1xdWVyeSBvciBuYW1lZC1uYXRpdmUtcXVlcnkKLSAgICAgICAgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZSBvciBkaWZmZXJlbnQgbWFwcGluZyBmaWxlcyBpbiBhIAotICAgICAgICBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgIDQuIFRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGVhY2ggZGVmaW5lCi0gICAgICAgIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIG1hbmFnZWQgcGVyc2lzdGVudCBjbGFzcy4gVGhlIG1hcHBpbmcKLSAgICAgICAgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZXNlIGVsZW1lbnRzIG1heSBiZSBjb21wbGV0ZSBvciBpdCBtYXkKLSAgICAgICAgYmUgcGFydGlhbC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIgCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyIgdHlwZT0ib3JtOm1hcHBlZC1zdXBlcmNsYXNzIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eSIgdHlwZT0ib3JtOmVudGl0eSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRhYmxlIiB0eXBlPSJvcm06ZW1iZWRkYWJsZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uVHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICBmaXhlZD0iMS4wIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIE1ldGFkYXRhIHRoYXQgYXBwbGllcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgbm90IGp1c3QgdG8gCi0gICAgICAgIHRoZSBtYXBwaW5nIGZpbGUgaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLiAKLQotICAgICAgICBJZiB0aGUgeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgZWxlbWVudCBpcyBzcGVjaWZpZWQgdGhlbiAKLSAgICAgICAgdGhlIGNvbXBsZXRlIHNldCBvZiBtYXBwaW5nIG1ldGFkYXRhIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdCAKLSAgICAgICAgaXMgY29udGFpbmVkIGluIHRoZSBYTUwgbWFwcGluZyBmaWxlcyBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlc2UgZGVmYXVsdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXMgYSB3aG9sZSAKLSAgICAgICAgdW5sZXNzIHRoZXkgYXJlIG92ZXJyaWRkZW4gYnkgbG9jYWwgYW5ub3RhdGlvbiBvciBYTUwgCi0gICAgICAgIGVsZW1lbnQgc2V0dGluZ3MuIAotICAgICAgICAKLSAgICAgICAgc2NoZW1hIC0gVXNlZCBhcyB0aGUgc2NoZW1hIGZvciBhbGwgdGFibGVzIG9yIHNlY29uZGFyeSB0YWJsZXMKLSAgICAgICAgICAgIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2F0YWxvZyAtIFVzZWQgYXMgdGhlIGNhdGFsb2cgZm9yIGFsbCB0YWJsZXMgb3Igc2Vjb25kYXJ5IHRhYmxlcwotICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBhY2Nlc3MgLSBVc2VkIGFzIHRoZSBhY2Nlc3MgdHlwZSBmb3IgYWxsIG1hbmFnZWQgY2xhc3NlcyBpbgotICAgICAgICAgICAgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2FzY2FkZS1wZXJzaXN0IC0gQWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMKLSAgICAgICAgICAgIGluIGVudGl0eSByZWxhdGlvbnNoaXBzIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGVudGl0eS1saXN0ZW5lcnMgLSBMaXN0IG9mIGRlZmF1bHQgZW50aXR5IGxpc3RlbmVycyB0byBiZSBpbnZva2VkIAotICAgICAgICAgICAgb24gZWFjaCBlbnRpdHkgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYW4gZW50aXR5LiBJcyBhbGxvd2VkIHRvIGJlCi0gICAgICAgIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhbm5vdGF0aW9ucy4KLSAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byAKLSAgICAgICAgaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBvbiB0aGUgZW50aXR5IGNsYXNzIChhbmQgaXRzIGZpZWxkcwotICAgICAgICBvciBwcm9wZXJ0aWVzKSBhcmUgdG8gYmUgcHJvY2Vzc2VkLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gCi0gICAgICAgIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIGZvciB0aGUgZW50aXR5IGFuZCBpdHMgc3ViZWxlbWVudHMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUiIHR5cGU9Im9ybTp0YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIiB0eXBlPSJvcm06c2Vjb25kYXJ5LXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaGVyaXRhbmNlIiB0eXBlPSJvcm06aW5oZXJpdGFuY2UiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXZhbHVlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGVzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBlbnRpdHkgZmllbGQgb3IgcHJvcGVydHkgbWFwcGluZ3MuCi0gICAgICAgIEl0IG1heSBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgdG8gaW5jbHVkZSBvbmx5IGEgc3Vic2V0IG9mIHRoZQotICAgICAgICBmaWVsZHMgb3IgcHJvcGVydGllcy4gSWYgbWV0YWRhdGEtY29tcGxldGUgZm9yIHRoZSBlbnRpdHkgaXMgdHJ1ZQotICAgICAgICB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSBkZWZhdWx0ZWQgYWNjb3JkaW5nCi0gICAgICAgIHRvIHRoZSBkZWZhdWx0IHJ1bGVzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9Im9ybTppZCIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZC1pZCIgdHlwZT0ib3JtOmVtYmVkZGVkLWlkIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljIiB0eXBlPSJvcm06YmFzaWMiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW9uZSIgdHlwZT0ib3JtOm1hbnktdG8tb25lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tbWFueSIgdHlwZT0ib3JtOm9uZS10by1tYW55IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tb25lIiB0eXBlPSJvcm06b25lLXRvLW9uZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1tYW55IiB0eXBlPSJvcm06bWFueS10by1tYW55IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQiIHR5cGU9Im9ybTplbWJlZGRlZCIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNpZW50IiB0eXBlPSJvcm06dHJhbnNpZW50IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJhY2Nlc3MtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZWxlbWVudCBkZXRlcm1pbmVzIGhvdyB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgYWNjZXNzZXMgdGhlCi0gICAgICAgIHN0YXRlIG9mIGFuIGVudGl0eSBvciBlbWJlZGRlZCBvYmplY3QuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9QRVJUWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRklFTEQiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5TGlzdGVuZXJzIHsKLSAgICAgICAgICBDbGFzc1tdIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVyIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgYW4gZW50aXR5IGxpc3RlbmVyIHRvIGJlIGludm9rZWQgYXQgbGlmZWN5Y2xlIGV2ZW50cwotICAgICAgICBmb3IgdGhlIGVudGl0aWVzIHRoYXQgbGlzdCB0aGlzIGxpc3RlbmVyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXJlbW92ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXJlbW92ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXVwZGF0ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlVXBkYXRlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXVwZGF0ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1sb2FkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0TG9hZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktaGludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkgCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5SGludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWROYXRpdmVRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOyAvL25hbWVkIFNxbFJlc3VsdFNldE1hcHBpbmcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3FsUmVzdWx0U2V0TWFwcGluZyB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBFbnRpdHlSZXN1bHRbXSBlbnRpdGllcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ29sdW1uUmVzdWx0W10gY29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LXJlc3VsdCIgdHlwZT0ib3JtOmVudGl0eS1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tcmVzdWx0IiB0eXBlPSJvcm06Y29sdW1uLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5UmVzdWx0IHsKLSAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcygpOwotICAgICAgICAgIEZpZWxkUmVzdWx0W10gZmllbGRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQtcmVzdWx0IiB0eXBlPSJvcm06ZmllbGQtcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW50aXR5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGaWVsZFJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2Vjb25kYXJ5VGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcGtKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgIH0KLQotICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaXF1ZS1jb25zdHJhaW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBVbmlxdWVDb25zdHJhaW50IHsKLSAgICAgICAgICBTdHJpbmdbXSBjb2x1bW5OYW1lcygpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZ2VuZXJhdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gR2VuZXJhdGlvblR5cGUgeyBUQUJMRSwgU0VRVUVOQ0UsIElERU5USVRZLCBBVVRPIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VRVUVOQ0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklERU5USVRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRPIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXR0cmlidXRlT3ZlcnJpZGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgQ29sdW1uIGNvbHVtbigpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBc3NvY2lhdGlvbk92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkLWNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWRDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkLWlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWRJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zaWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zaWVudCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2ZXJzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmVyc2lvbiB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpYyB7Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIgdHlwZT0ib3JtOmxvYiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEZldGNoVHlwZSB7IExBWlksIEVBR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQVpZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvYiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIExvYiB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUZW1wb3JhbCB7Ci0gICAgICAgICAgVGVtcG9yYWxUeXBlIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOnRlbXBvcmFsLXR5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBUZW1wb3JhbFR5cGUgewotICAgICAgICAgIERBVEUsIC8vIGphdmEuc3FsLkRhdGUKLSAgICAgICAgICBUSU1FLCAvLyBqYXZhLnNxbC5UaW1lCi0gICAgICAgICAgVElNRVNUQU1QIC8vIGphdmEuc3FsLlRpbWVzdGFtcAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFURSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUVTVEFNUCIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW1lcmF0ZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnVtZXJhdGVkIHsKLSAgICAgICAgICBFbnVtVHlwZSB2YWx1ZSgpIGRlZmF1bHQgT1JESU5BTDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06ZW51bS10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBFbnVtVHlwZSB7Ci0gICAgICAgICAgT1JESU5BTCwKLSAgICAgICAgICBTVFJJTkcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1JESU5BTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+ICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhc2NhZGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIENhc2NhZGVUeXBlIHsgQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1hbGwiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtbWVyZ2UiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZW1vdmUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZWZyZXNoIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+ICAgICAgIAotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOmNob2ljZT4gICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5UYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBpbnZlcnNlSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludmVyc2Utam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdlbmVyYXRlZC12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEdlbmVyYXRlZFZhbHVlIHsKLSAgICAgICAgICBHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgQVVUTzsKLSAgICAgICAgICBTdHJpbmcgZ2VuZXJhdG9yKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RyYXRlZ3kiIHR5cGU9Im9ybTpnZW5lcmF0aW9uLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmF0b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3JkZXItYnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcmRlckJ5IHsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmhlcml0YW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEluaGVyaXRhbmNlIHsKLSAgICAgICAgICBJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0IFNJTkdMRV9UQUJMRTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RyYXRlZ3kiIHR5cGU9Im9ybTppbmhlcml0YW5jZS10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iaW5oZXJpdGFuY2UtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEluaGVyaXRhbmNlVHlwZQotICAgICAgICAgIHsgU0lOR0xFX1RBQkxFLCBKT0lORUQsIFRBQkxFX1BFUl9DTEFTU307Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSU5HTEVfVEFCTEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPSU5FRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEVfUEVSX0NMQVNTIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvclZhbHVlIHsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBEaXNjcmltaW5hdG9yVHlwZSB7IFNUUklORywgQ0hBUiwgSU5URUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFSIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR0VSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICJEVFlQRSI7Ci0gICAgICAgICAgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoKSBkZWZhdWx0IFNUUklORzsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMzE7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBlbWJlZGRhYmxlIG9iamVjdHMuIElzIAotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgCi0gICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZCAKLSAgICAgICAgaW4gdGhlIGNsYXNzLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRhYmxlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06ZW1iZWRkYWJsZS1hdHRyaWJ1dGVzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGFibGUtYXR0cmlidXRlcyI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYyIgdHlwZT0ib3JtOmJhc2ljIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNpZW50IiB0eXBlPSJvcm06dHJhbnNpZW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYSBtYXBwZWQgc3VwZXJjbGFzcy4gSXMgCi0gICAgICAgIGFsbG93ZWQgdG8gYmUgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSAKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkIAotICAgICAgICBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbCBiZSByZWN1cnNpdmVseSAKLSAgICAgICAgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwcGVkU3VwZXJjbGFzc3t9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2VxdWVuY2VHZW5lcmF0b3IgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHNlcXVlbmNlTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMTsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtZ2VuZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGVHZW5lcmF0b3IgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHBrQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHBrQ29sdW1uVmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDA7Ci0gICAgICAgICAgaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL29ybV8yXzAueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9vcm1fMl8wLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiNmIzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL29ybV8yXzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTk0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBvYmplY3QvcmVsYXRpb25hbCBtYXBwaW5nIGZpbGUgc2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczpvcm09Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybSIgCi0gIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgCi0gIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgCi0gIHZlcnNpb249IjIuMCI+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIylvcm1fMl8wLnhzZCAyLjAgIE9jdG9iZXIgMSAyMDA5Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBTdW4gTWljcm9zeXN0ZW1zLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKLSAgCi0gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAKLSAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgCi0gIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAKLSAgVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgCi0gIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLSAgCi0gIENvbnRyaWJ1dG9yczoKLSAgICAgIExpbmRhIERlTWljaGllbCAtIEphdmEgUGVyc2lzdGVuY2UgMi4wLCBWZXJzaW9uIDIuMCAoT2N0b2JlciAxLCAyMDA5KQotICAgICAgU3BlY2lmaWNhdGlvbiBhdmFpbGFibGUgZnJvbSBodHRwOi8vamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTMxNwotICAKLSAgIFRoaXMgY29weSBvZiBvcm1fMl8wLnhzZCB3YXMgb3JpZ2luYWxseSBjb3BpZWQgZnJvbSB0aGUgRWNsaXBzZSBSdW50aW1lIAotICAgRWNsaXBzZUxpbmsgUHJvamVjdCBhbmQgaXMgaW5jbHVkZWQgaGVyZSB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOmRvY3VtZW50YXRpb24+PCFbQ0RBVEFbCi0KLSAgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgcGVyc2lzdGVuY2Ugb2JqZWN0L3JlbGF0aW9uYWwgCi0gICAgICAgbWFwcGluZyBmaWxlLgotICAgICAgIFRoZSBmaWxlIG1heSBiZSBuYW1lZCAiTUVUQS1JTkYvb3JtLnhtbCIgaW4gdGhlIHBlcnNpc3RlbmNlIAotICAgICAgIGFyY2hpdmUgb3IgaXQgbWF5IGJlIG5hbWVkIHNvbWUgb3RoZXIgbmFtZSB3aGljaCB3b3VsZCBiZSAKLSAgICAgICB1c2VkIHRvIGxvY2F0ZSB0aGUgZmlsZSBhcyByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLgotCi0gICAgICAgT2JqZWN0L3JlbGF0aW9uYWwgbWFwcGluZyBmaWxlcyBtdXN0IGluZGljYXRlIHRoZSBvYmplY3QvcmVsYXRpb25hbAotICAgICAgIG1hcHBpbmcgZmlsZSBzY2hlbWEgYnkgdXNpbmcgdGhlIHBlcnNpc3RlbmNlIG5hbWVzcGFjZToKLQotICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlCi0KLSAgICAgICBhbmQgaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotICAgICAgIHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLSAgICAgIDxlbnRpdHktbWFwcGluZ3MgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0KLSAgICAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0vb3JtXzJfMC54c2QiCi0gICAgICAgIHZlcnNpb249IjIuMCI+Ci0gICAgICAgICAgLi4uCi0gICAgICA8L2VudGl0eS1tYXBwaW5ncz4KLQotCi0gICAgIF1dPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiLz4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idmVyc2lvblR5cGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV0rKFwuWzAtOV0rKSoiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1tYXBwaW5ncyI+Ci0gICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbnRpdHktbWFwcGluZ3MgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgbWFwcGluZwotICAgICAgICBmaWxlLiBJdCBjb250YWlucyB0aGUgZm9sbG93aW5nIGZvdXIgdHlwZXMgb2YgZWxlbWVudHM6Ci0KLSAgICAgICAgMS4gVGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBjb250YWlucyBtZXRhZGF0YQotICAgICAgICBmb3IgdGhlIGVudGlyZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgaWYgdGhpcyBlbGVtZW50Ci0gICAgICAgIG9jY3VycyBpbiBtdWx0aXBsZSBtYXBwaW5nIGZpbGVzIHdpdGhpbiB0aGUgc2FtZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAKLSAgICAgICAgMi4gVGhlIHBhY2thZ2UsIHNjaGVtYSwgY2F0YWxvZyBhbmQgYWNjZXNzIGVsZW1lbnRzIGFwcGx5IHRvIGFsbCBvZgotICAgICAgICB0aGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBkZWZpbmVkIGluCi0gICAgICAgIHRoZSBzYW1lIGZpbGUgaW4gd2hpY2ggdGhleSBvY2N1ci4KLQotICAgICAgICAzLiBUaGUgc2VxdWVuY2UtZ2VuZXJhdG9yLCB0YWJsZS1nZW5lcmF0b3IsIG5hbWVkLXF1ZXJ5LAotICAgICAgICBuYW1lZC1uYXRpdmUtcXVlcnkgYW5kIHNxbC1yZXN1bHQtc2V0LW1hcHBpbmcgZWxlbWVudHMgYXJlIGdsb2JhbAotICAgICAgICB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZQotICAgICAgICBzZXF1ZW5jZS1nZW5lcmF0b3Igb3IgdGFibGUtZ2VuZXJhdG9yIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUKLSAgICAgICAgb3IgZGlmZmVyZW50IG1hcHBpbmcgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyBhbHNvIAotICAgICAgICB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIG5hbWVkLXF1ZXJ5LCBuYW1lZC1uYXRpdmUtcXVlcnksIG9yCi0gICAgICAgIHJlc3VsdC1zZXQtbWFwcGluZyBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lIG9yIGRpZmZlcmVudCBtYXBwaW5nIAotICAgICAgICBmaWxlcyBpbiBhIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgNC4gVGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZWFjaCBkZWZpbmUKLSAgICAgICAgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIGEgbWFuYWdlZCBwZXJzaXN0ZW50IGNsYXNzLiBUaGUgbWFwcGluZwotICAgICAgICBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlc2UgZWxlbWVudHMgbWF5IGJlIGNvbXBsZXRlIG9yIGl0IG1heQotICAgICAgICBiZSBwYXJ0aWFsLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIiB0eXBlPSJvcm06bWFwcGVkLXN1cGVyY2xhc3MiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5IiB0eXBlPSJvcm06ZW50aXR5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGFibGUiIHR5cGU9Im9ybTplbWJlZGRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb25UeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIGZpeGVkPSIyLjAiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgTWV0YWRhdGEgdGhhdCBhcHBsaWVzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFuZCBub3QganVzdCB0byAKLSAgICAgICAgdGhlIG1hcHBpbmcgZmlsZSBpbiB3aGljaCBpdCBpcyBjb250YWluZWQuIAotCi0gICAgICAgIElmIHRoZSB4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSBlbGVtZW50IGlzIHNwZWNpZmllZCwKLSAgICAgICAgdGhlIGNvbXBsZXRlIHNldCBvZiBtYXBwaW5nIG1ldGFkYXRhIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdCAKLSAgICAgICAgaXMgY29udGFpbmVkIGluIHRoZSBYTUwgbWFwcGluZyBmaWxlcyBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZXNlIGRlZmF1bHRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFzIGEgd2hvbGUgCi0gICAgICAgIHVubGVzcyB0aGV5IGFyZSBvdmVycmlkZGVuIGJ5IGxvY2FsIGFubm90YXRpb24gb3IgWE1MIAotICAgICAgICBlbGVtZW50IHNldHRpbmdzLiAKLSAgICAgICAgCi0gICAgICAgIHNjaGVtYSAtIFVzZWQgYXMgdGhlIHNjaGVtYSBmb3IgYWxsIHRhYmxlcywgc2Vjb25kYXJ5IHRhYmxlcywgam9pbgotICAgICAgICAgICAgdGFibGVzLCBjb2xsZWN0aW9uIHRhYmxlcywgc2VxdWVuY2UgZ2VuZXJhdG9ycywgYW5kIHRhYmxlIAotICAgICAgICAgICAgZ2VuZXJhdG9ycyB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhdGFsb2cgLSBVc2VkIGFzIHRoZSBjYXRhbG9nIGZvciBhbGwgdGFibGVzLCBzZWNvbmRhcnkgdGFibGVzLCBqb2luCi0gICAgICAgICAgICB0YWJsZXMsIGNvbGxlY3Rpb24gdGFibGVzLCBzZXF1ZW5jZSBnZW5lcmF0b3JzLCBhbmQgdGFibGUgCi0gICAgICAgICAgICBnZW5lcmF0b3JzIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgZGVsaW1pdGVkLWlkZW50aWZpZXJzIC0gVXNlZCB0byB0cmVhdCBkYXRhYmFzZSBpZGVudGlmaWVycyBhcwotICAgICAgICAgICAgZGVsaW1pdGVkIGlkZW50aWZpZXJzLgotICAgICAgICBhY2Nlc3MgLSBVc2VkIGFzIHRoZSBhY2Nlc3MgdHlwZSBmb3IgYWxsIG1hbmFnZWQgY2xhc3NlcyBpbgotICAgICAgICAgICAgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2FzY2FkZS1wZXJzaXN0IC0gQWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMKLSAgICAgICAgICAgIGluIGFsbCBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBlbnRpdHktbGlzdGVuZXJzIC0gTGlzdCBvZiBkZWZhdWx0IGVudGl0eSBsaXN0ZW5lcnMgdG8gYmUgaW52b2tlZCAKLSAgICAgICAgICAgIG9uIGVhY2ggZW50aXR5IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlbGltaXRlZC1pZGVudGlmaWVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGFuIGVudGl0eS4gSXMgYWxsb3dlZCB0byBiZQotICAgICAgICBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYW5ub3RhdGlvbnMuCi0gICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gCi0gICAgICAgIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgb24gdGhlIGVudGl0eSBjbGFzcyAoYW5kIGl0cyBmaWVsZHMKLSAgICAgICAgb3IgcHJvcGVydGllcykgYXJlIHRvIGJlIHByb2Nlc3NlZC4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIAotICAgICAgICB0aGUgZGVmYXVsdGluZyBydWxlcyBmb3IgdGhlIGVudGl0eSBhbmQgaXRzIHN1YmVsZW1lbnRzIHdpbGwgCi0gICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJvcm06dGFibGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY29uZGFyeS10YWJsZSIgdHlwZT0ib3JtOnNlY29uZGFyeS10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmhlcml0YW5jZSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLXZhbHVlIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci12YWx1ZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYWNoZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImFjY2Vzcy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGRldGVybWluZXMgaG93IHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBhY2Nlc3NlcyB0aGUKLSAgICAgICAgc3RhdGUgb2YgYW4gZW50aXR5IG9yIGVtYmVkZGVkIG9iamVjdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEFzc29jaWF0aW9uT3ZlcnJpZGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdHt9OwotICAgICAgICAgIEpvaW5UYWJsZSBqb2luVGFibGUoKSBkZWZhdWx0IEBKb2luVGFibGU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBdHRyaWJ1dGVPdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBDb2x1bW4gY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZXMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgY29udGFpbnMgdGhlIGVudGl0eSBmaWVsZCBvciBwcm9wZXJ0eSBtYXBwaW5ncy4KLSAgICAgICAgSXQgbWF5IGJlIHNwYXJzZWx5IHBvcHVsYXRlZCB0byBpbmNsdWRlIG9ubHkgYSBzdWJzZXQgb2YgdGhlCi0gICAgICAgIGZpZWxkcyBvciBwcm9wZXJ0aWVzLiBJZiBtZXRhZGF0YS1jb21wbGV0ZSBmb3IgdGhlIGVudGl0eSBpcyB0cnVlCi0gICAgICAgIHRoZW4gdGhlIHJlbWFpbmRlciBvZiB0aGUgYXR0cmlidXRlcyB3aWxsIGJlIGRlZmF1bHRlZCBhY2NvcmRpbmcKLSAgICAgICAgdG8gdGhlIGRlZmF1bHQgcnVsZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9Im9ybTppZCIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZC1pZCIgdHlwZT0ib3JtOmVtYmVkZGVkLWlkIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljIiB0eXBlPSJvcm06YmFzaWMiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW9uZSIgdHlwZT0ib3JtOm1hbnktdG8tb25lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tbWFueSIgdHlwZT0ib3JtOm9uZS10by1tYW55IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tb25lIiB0eXBlPSJvcm06b25lLXRvLW9uZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1tYW55IiB0eXBlPSJvcm06bWFueS10by1tYW55IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIiB0eXBlPSJvcm06ZWxlbWVudC1jb2xsZWN0aW9uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQiIHR5cGU9Im9ybTplbWJlZGRlZCIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNpZW50IiB0eXBlPSJvcm06dHJhbnNpZW50IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWMgewotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYXNjYWRlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBDYXNjYWRlVHlwZSB7IEFMTCwgUEVSU0lTVCwgTUVSR0UsIFJFTU9WRSwgUkVGUkVTSCwgREVUQUNIfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1hbGwiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtbWVyZ2UiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZW1vdmUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZWZyZXNoIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtZGV0YWNoIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sbGVjdGlvbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbGxlY3Rpb25UYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4tcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW5SZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICJEVFlQRSI7Ci0gICAgICAgICAgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoKSBkZWZhdWx0IFNUUklORzsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMzE7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBEaXNjcmltaW5hdG9yVHlwZSB7IFNUUklORywgQ0hBUiwgSU5URUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFSIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR0VSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JWYWx1ZSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRWxlbWVudENvbGxlY3Rpb24gewotICAgICAgICAgIENsYXNzIHRhcmdldENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTptYXAta2V5LWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTptYXAta2V5LWpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9iIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpsb2IiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmNvbGxlY3Rpb24tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBlbWJlZGRhYmxlIG9iamVjdHMuIElzIAotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgCi0gICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZCAKLSAgICAgICAgaW4gdGhlIGNsYXNzLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRhYmxlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06ZW1iZWRkYWJsZS1hdHRyaWJ1dGVzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRhYmxlLWF0dHJpYnV0ZXMiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMiIHR5cGU9Im9ybTpiYXNpYyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tb25lIiB0eXBlPSJvcm06bWFueS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1tYW55IiB0eXBlPSJvcm06b25lLXRvLW1hbnkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1vbmUiIHR5cGU9Im9ybTpvbmUtdG8tb25lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW1hbnkiIHR5cGU9Im9ybTptYW55LXRvLW1hbnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbGVtZW50LWNvbGxlY3Rpb24iIHR5cGU9Im9ybTplbGVtZW50LWNvbGxlY3Rpb24iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZCIgdHlwZT0ib3JtOmVtYmVkZGVkIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2llbnQiIHR5cGU9Im9ybTp0cmFuc2llbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkLWlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWRJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgYW4gZW50aXR5IGxpc3RlbmVyIHRvIGJlIGludm9rZWQgYXQgbGlmZWN5Y2xlIGV2ZW50cwotICAgICAgICBmb3IgdGhlIGVudGl0aWVzIHRoYXQgbGlzdCB0aGlzIGxpc3RlbmVyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlMaXN0ZW5lcnMgewotICAgICAgICAgIENsYXNzW10gdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXIiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eVJlc3VsdCB7Ci0gICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MoKTsKLSAgICAgICAgICBGaWVsZFJlc3VsdFtdIGZpZWxkcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkLXJlc3VsdCIgdHlwZT0ib3JtOmZpZWxkLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImVudGl0eS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW0tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEVudW1UeXBlIHsKLSAgICAgICAgICBPUkRJTkFMLAotICAgICAgICAgIFNUUklORwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRJTkFMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBGZXRjaFR5cGUgeyBMQVpZLCBFQUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEFaWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGaWVsZFJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdlbmVyYXRlZC12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEdlbmVyYXRlZFZhbHVlIHsKLSAgICAgICAgICBHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgQVVUTzsKLSAgICAgICAgICBTdHJpbmcgZ2VuZXJhdG9yKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RyYXRlZ3kiIHR5cGU9Im9ybTpnZW5lcmF0aW9uLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmF0b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZ2VuZXJhdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gR2VuZXJhdGlvblR5cGUgeyBUQUJMRSwgU0VRVUVOQ0UsIElERU5USVRZLCBBVVRPIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VRVUVOQ0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklERU5USVRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRPIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiIHR5cGU9Im9ybTpnZW5lcmF0ZWQtdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZC1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkQ2xhc3MgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmhlcml0YW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEluaGVyaXRhbmNlIHsKLSAgICAgICAgICBJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0IFNJTkdMRV9UQUJMRTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RyYXRlZ3kiIHR5cGU9Im9ybTppbmhlcml0YW5jZS10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iaW5oZXJpdGFuY2UtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEluaGVyaXRhbmNlVHlwZQotICAgICAgICAgIHsgU0lOR0xFX1RBQkxFLCBKT0lORUQsIFRBQkxFX1BFUl9DTEFTU307Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSU5HTEVfVEFCTEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPSU5FRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEVfUEVSX0NMQVNTIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pblRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGludmVyc2VKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW52ZXJzZS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBMb2Ige30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb2NrLW1vZGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIExvY2tNb2RlVHlwZSB7IFJFQUQsIFdSSVRFLCBPUFRJTUlTVElDLCBPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCwgUEVTU0lNSVNUSUNfUkVBRCwgUEVTU0lNSVNUSUNfV1JJVEUsIFBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCwgTk9ORX07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRUFEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU1JU1RJQyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX1JFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX1dSSVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hbnlUb01hbnkgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jbGFzcyIgdHlwZT0ib3JtOm1hcC1rZXktY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06dGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hbnlUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+ICAgICAgIAotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4gICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHMtaWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleS1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleUNsYXNzIHsKLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleS1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleUpvaW5Db2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGEgbWFwcGVkIHN1cGVyY2xhc3MuIElzIAotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgCi0gICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZCAKLSAgICAgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgYmUgcmVjdXJzaXZlbHkgCi0gICAgICAgIGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcHBlZFN1cGVyY2xhc3N7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZE5hdGl2ZVF1ZXJ5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBxdWVyeSgpOwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBDbGFzcyByZXN1bHRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZygpIGRlZmF1bHQgIiI7IC8vbmFtZWQgU3FsUmVzdWx0U2V0TWFwcGluZwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFF1ZXJ5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBxdWVyeSgpOwotICAgICAgICAgIExvY2tNb2RlVHlwZSBsb2NrTW9kZSgpIGRlZmF1bHQgTk9ORTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jay1tb2RlIiB0eXBlPSJvcm06bG9jay1tb2RlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1jb2x1bW4iIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JwaGFuLXJlbW92YWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gb3JwaGFuUmVtb3ZhbCgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBzLWlkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcmRlci1ieSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQnkgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvcmRlci1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcmRlckNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LWxvYWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RMb2FkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleUpvaW5Db2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktaGludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkgCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5SGludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWNvbmRhcnktdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZWNvbmRhcnlUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwa0pvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgfQotCi0gICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBzZXF1ZW5jZU5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAxOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTcWxSZXN1bHRTZXRNYXBwaW5nIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEVudGl0eVJlc3VsdFtdIGVudGl0aWVzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBDb2x1bW5SZXN1bHRbXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LXJlc3VsdCIgdHlwZT0ib3JtOmVudGl0eS1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tcmVzdWx0IiB0eXBlPSJvcm06Y29sdW1uLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLWdlbmVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlR2VuZXJhdG9yIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBwa0NvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB2YWx1ZUNvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBwa0NvbHVtblZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAwOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRlbXBvcmFsIHsKLSAgICAgICAgICBUZW1wb3JhbFR5cGUgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06dGVtcG9yYWwtdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIFRlbXBvcmFsVHlwZSB7Ci0gICAgICAgICAgREFURSwgLy8gamF2YS5zcWwuRGF0ZQotICAgICAgICAgIFRJTUUsIC8vIGphdmEuc3FsLlRpbWUKLSAgICAgICAgICBUSU1FU1RBTVAgLy8gamF2YS5zcWwuVGltZXN0YW1wCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQVRFIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRVNUQU1QIi8+Ci0gICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2llbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2llbnQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaXF1ZS1jb25zdHJhaW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBVbmlxdWVDb25zdHJhaW50IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nW10gY29sdW1uTmFtZXMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2ZXJzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmVyc2lvbiB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9wZXJzaXN0ZW5jZV8xXzAueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9wZXJzaXN0ZW5jZV8xXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2ExNTdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvcGVyc2lzdGVuY2VfMV8wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBwZXJzaXN0ZW5jZS54bWwgc2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZSIgCi0gIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gIHhtbG5zOnBlcnNpc3RlbmNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZSIKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIAotICB2ZXJzaW9uPSIxLjAiPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpcGVyc2lzdGVuY2VfMV8wLnhzZCAgMS4wICBGZWIgOSAyMDA2Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgotCi0gICAgICBDb3B5cmlnaHQgMjAwNS0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uCi0gICAgICBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUKLSAgICAgICJMaWNlbnNlIikuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgICAgIHRoZSBMaWNlbnNlLiBZb3UgY2FuIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgICAgIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUEwuaHRtbCBvcgotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotICAgICAgTGljZW5zZS4KLQotICAgICAgV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIKLSAgICAgIE5vdGljZSBpbiBlYWNoIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdAotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAgICAgIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMKLSAgICAgIHByb3ZpZGVkIGJ5IFN1biBpbiB0aGUgR1BMIFZlcnNpb24gMiBzZWN0aW9uIG9mIHRoZSBMaWNlbnNlIGZpbGUKLSAgICAgIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLiAgSWYgYXBwbGljYWJsZSwgYWRkIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFtdCi0gICAgICByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKLSAgICAgICJQb3J0aW9ucyBDb3B5cmlnaHRlZCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSIKLQotICAgICAgQ29udHJpYnV0b3Iocyk6Ci0KLSAgICAgIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUKLSAgICAgIENEREwgb3Igb25seSB0aGUgR1BMIFZlcnNpb24gMiwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBhZGRpbmcKLSAgICAgICJbQ29udHJpYnV0b3JdIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcwotICAgICAgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwgVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdQotICAgICAgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEgcmVjaXBpZW50IGhhcyB0aGUKLSAgICAgIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZQotICAgICAgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0byBpdHMKLSAgICAgIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMgotICAgICAgY29kZSBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlCi0gICAgICBvcHRpb24gYXBwbGllcyBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaAotICAgICAgb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyLgotCi0gICAgICBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcwotICAgICAgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBDRERMIGxpY2Vuc2UuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICA8eHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj48IVtDREFUQVsKLQotICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgcGVyc2lzdGVuY2UgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICBUaGUgZmlsZSBtdXN0IGJlIG5hbWVkICJNRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiIGluIHRoZSAKLSAgICAgcGVyc2lzdGVuY2UgYXJjaGl2ZS4KLSAgICAgUGVyc2lzdGVuY2UgY29uZmlndXJhdGlvbiBmaWxlcyBtdXN0IGluZGljYXRlCi0gICAgIHRoZSBwZXJzaXN0ZW5jZSBzY2hlbWEgYnkgdXNpbmcgdGhlIHBlcnNpc3RlbmNlIG5hbWVzcGFjZToKLQotICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZQotCi0gICAgIGFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0gICAgIHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLSAgICAgIDxwZXJzaXN0ZW5jZSB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UKLSAgICAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZV8xXzAueHNkIgotICAgICAgICB2ZXJzaW9uPSIxLjAiPgotICAgICAgICAgIC4uLgotICAgICAgPC9wZXJzaXN0ZW5jZT4KLQotICAgIF1dPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InZlcnNpb25UeXBlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldKyhcLlswLTldKykqIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0KLSAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gb2YgYSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLQotICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBUZXh0dWFsIGRlc2NyaXB0aW9uIG9mIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvdmlkZXIiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXIgY2xhc3MgdGhhdCBzdXBwbGllcyBFbnRpdHlNYW5hZ2VycyBmb3IgdGhpcyAKLSAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianRhLWRhdGEtc291cmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIFRoZSBjb250YWluZXItc3BlY2lmaWMgbmFtZSBvZiB0aGUgSlRBIGRhdGFzb3VyY2UgdG8gdXNlLgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJub24tanRhLWRhdGEtc291cmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIFRoZSBjb250YWluZXItc3BlY2lmaWMgbmFtZSBvZiBhIG5vbi1KVEEgZGF0YXNvdXJjZSB0byB1c2UuCi0KLSAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBpbmctZmlsZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgRmlsZSBjb250YWluaW5nIG1hcHBpbmcgaW5mb3JtYXRpb24uIExvYWRlZCBhcyBhIHJlc291cmNlIAotICAgICAgICAgICAgICAgICAgICBieSB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIuCi0KLSAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imphci1maWxlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBKYXIgZmlsZSB0aGF0IHNob3VsZCBiZSBzY2FubmVkIGZvciBlbnRpdGllcy4gCi0gICAgICAgICAgICAgICAgICAgIE5vdCBhcHBsaWNhYmxlIHRvIEphdmEgU0UgcGVyc2lzdGVuY2UgdW5pdHMuCi0KLSAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBDbGFzcyB0byBzY2FuIGZvciBhbm5vdGF0aW9ucy4gIEl0IHNob3VsZCBiZSBhbm5vdGF0ZWQgCi0gICAgICAgICAgICAgICAgICAgIHdpdGggZWl0aGVyIEBFbnRpdHksIEBFbWJlZGRhYmxlIG9yIEBNYXBwZWRTdXBlcmNsYXNzLgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXVubGlzdGVkLWNsYXNzZXMiIHR5cGU9InhzZDpib29sZWFuIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBXaGVuIHNldCB0byB0cnVlIHRoZW4gb25seSBsaXN0ZWQgY2xhc3NlcyBhbmQgamFycyB3aWxsIAotICAgICAgICAgICAgICAgICAgICBiZSBzY2FubmVkIGZvciBwZXJzaXN0ZW50IGNsYXNzZXMsIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIAotICAgICAgICAgICAgICAgICAgICBqYXIgb3IgZGlyZWN0b3J5IHdpbGwgYWxzbyBiZSBzY2FubmVkLiBOb3QgYXBwbGljYWJsZSB0byAKLSAgICAgICAgICAgICAgICAgICAgSmF2YSBTRSBwZXJzaXN0ZW5jZSB1bml0cy4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgQSBsaXN0IG9mIHZlbmRvci1zcGVjaWZpYyBwcm9wZXJ0aWVzLgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIEEgbmFtZS12YWx1ZSBwYWlyLgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgTmFtZSB1c2VkIGluIGNvZGUgdG8gcmVmZXJlbmNlIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0KLSAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNhY3Rpb24tdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJwZXJzaXN0ZW5jZTpwZXJzaXN0ZW5jZS11bml0LXRyYW5zYWN0aW9uLXR5cGUiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICBUeXBlIG9mIHRyYW5zYWN0aW9ucyB1c2VkIGJ5IEVudGl0eU1hbmFnZXJzIGZyb20gdGhpcyAKLSAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YXR0cmlidXRlPgotCi0gICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InBlcnNpc3RlbmNlOnZlcnNpb25UeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIGZpeGVkPSIxLjAiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtdHJhbnNhY3Rpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIFRyYW5zYWN0aW9uVHlwZSB7IEpUQSwgUkVTT1VSQ0VfTE9DQUwgfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpUQSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVTT1VSQ0VfTE9DQUwiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9wZXJzaXN0ZW5jZV8yXzAueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9wZXJzaXN0ZW5jZV8yXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjEzYTAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvcGVyc2lzdGVuY2VfMl8wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBwZXJzaXN0ZW5jZS54bWwgc2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZSIgCi0gIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gIHhtbG5zOnBlcnNpc3RlbmNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZSIKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIAotICB2ZXJzaW9uPSIyLjAiPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpcGVyc2lzdGVuY2VfMl8wLnhzZCAgMS4wICBPY3RvYmVyIDEgMjAwOQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgU3VuIE1pY3Jvc3lzdGVtcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gCi0gIAotICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgCi0gIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIAotICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gCi0gIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IAotICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0gIAotICBDb250cmlidXRvcnM6Ci0gICAgICBMaW5kYSBEZU1pY2hpZWwgLSBKYXZhIFBlcnNpc3RlbmNlIDIuMCwgVmVyc2lvbiAyLjAgKE9jdG9iZXIgMSwgMjAwOSkKLSAgICAgIFNwZWNpZmljYXRpb24gYXZhaWxhYmxlIGZyb20gaHR0cDovL2pjcC5vcmcvZW4vanNyL2RldGFpbD9pZD0zMTcKLSAKLSAgIFRoaXMgY29weSBvZiBwZXJzaXN0ZW5jZV8yXzAueHNkIHdhcyBvcmlnaW5hbGx5IGNvcGllZCBmcm9tIHRoZSBFY2xpcHNlIFJ1bnRpbWUgCi0gICBFY2xpcHNlTGluayBQcm9qZWN0IGFuZCBpcyBpbmNsdWRlZCBoZXJlIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgPHhzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOmRvY3VtZW50YXRpb24+PCFbQ0RBVEFbCi0KLSAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIHBlcnNpc3RlbmNlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgVGhlIGZpbGUgbXVzdCBiZSBuYW1lZCAiTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIiBpbiB0aGUgCi0gICAgIHBlcnNpc3RlbmNlIGFyY2hpdmUuCi0KLSAgICAgUGVyc2lzdGVuY2UgY29uZmlndXJhdGlvbiBmaWxlcyBtdXN0IGluZGljYXRlCi0gICAgIHRoZSBwZXJzaXN0ZW5jZSBzY2hlbWEgYnkgdXNpbmcgdGhlIHBlcnNpc3RlbmNlIG5hbWVzcGFjZToKLQotICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZQotCi0gICAgIGFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0gICAgIHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLSAgICAgIDxwZXJzaXN0ZW5jZSB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UKLSAgICAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZV8yXzAueHNkIgotICAgICAgICB2ZXJzaW9uPSIyLjAiPgotICAgICAgICAgIC4uLgotICAgICAgPC9wZXJzaXN0ZW5jZT4KLQotICAgIF1dPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InZlcnNpb25UeXBlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldKyhcLlswLTldKykqIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0KLSAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gb2YgYSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLQotICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiBvZiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3ZpZGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyIGNsYXNzIHRoYXQgc3VwcGxpZXMgRW50aXR5TWFuYWdlcnMgZm9yIHRoaXMgCi0gICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imp0YS1kYXRhLXNvdXJjZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBUaGUgY29udGFpbmVyLXNwZWNpZmljIG5hbWUgb2YgdGhlIEpUQSBkYXRhc291cmNlIHRvIHVzZS4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uLWp0YS1kYXRhLXNvdXJjZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBUaGUgY29udGFpbmVyLXNwZWNpZmljIG5hbWUgb2YgYSBub24tSlRBIGRhdGFzb3VyY2UgdG8gdXNlLgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwaW5nLWZpbGUiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIEZpbGUgY29udGFpbmluZyBtYXBwaW5nIGluZm9ybWF0aW9uLiBMb2FkZWQgYXMgYSByZXNvdXJjZSAKLSAgICAgICAgICAgICAgICAgICAgYnkgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyLgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqYXItZmlsZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgSmFyIGZpbGUgdGhhdCBpcyB0byBiZSBzY2FubmVkIGZvciBtYW5hZ2VkIGNsYXNzZXMuIAotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgTWFuYWdlZCBjbGFzcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQKLSAgICAgICAgICAgICAgICAgICAgdG8gc2NhbiBmb3IgYW5ub3RhdGlvbnMuICBJdCBzaG91bGQgYmUgYW5ub3RhdGVkIAotICAgICAgICAgICAgICAgICAgICB3aXRoIGVpdGhlciBARW50aXR5LCBARW1iZWRkYWJsZSBvciBATWFwcGVkU3VwZXJjbGFzcy4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS11bmxpc3RlZC1jbGFzc2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBXaGVuIHNldCB0byB0cnVlIHRoZW4gb25seSBsaXN0ZWQgY2xhc3NlcyBhbmQgamFycyB3aWxsIAotICAgICAgICAgICAgICAgICAgICBiZSBzY2FubmVkIGZvciBwZXJzaXN0ZW50IGNsYXNzZXMsIG90aGVyd2lzZSB0aGUgCi0gICAgICAgICAgICAgICAgICAgIGVuY2xvc2luZyBqYXIgb3IgZGlyZWN0b3J5IHdpbGwgYWxzbyBiZSBzY2FubmVkLiAKLSAgICAgICAgICAgICAgICAgICAgTm90IGFwcGxpY2FibGUgdG8gSmF2YSBTRSBwZXJzaXN0ZW5jZSB1bml0cy4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2hhcmVkLWNhY2hlLW1vZGUiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icGVyc2lzdGVuY2U6cGVyc2lzdGVuY2UtdW5pdC1jYWNoaW5nLXR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgRGVmaW5lcyB3aGV0aGVyIGNhY2hpbmcgaXMgZW5hYmxlZCBmb3IgdGhlIAotICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0IGlmIGNhY2hpbmcgaXMgc3VwcG9ydGVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW5jZSBwcm92aWRlci4gV2hlbiBzZXQgdG8gQUxMLCBhbGwgZW50aXRpZXMgCi0gICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgY2FjaGVkLiBXaGVuIHNldCB0byBOT05FLCBubyBlbnRpdGllcyB3aWxsCi0gICAgICAgICAgICAgICAgICAgIGJlIGNhY2hlZC4gV2hlbiBzZXQgdG8gRU5BQkxFX1NFTEVDVElWRSwgb25seSBlbnRpdGllcwotICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYXMgY2FjaGVhYmxlIHdpbGwgYmUgY2FjaGVkLiBXaGVuIHNldCB0bwotICAgICAgICAgICAgICAgICAgICBESVNBQkxFX1NFTEVDVElWRSwgZW50aXRpZXMgc3BlY2lmaWVkIGFzIG5vdCBjYWNoZWFibGUKLSAgICAgICAgICAgICAgICAgICAgd2lsbCBub3QgYmUgY2FjaGVkLiBXaGVuIG5vdCBzcGVjaWZpZWQgb3Igd2hlbiBzZXQgdG8KLSAgICAgICAgICAgICAgICAgICAgVU5TUEVDSUZJRUQsIHByb3ZpZGVyIGRlZmF1bHRzIG1heSBhcHBseS4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsaWRhdGlvbi1tb2RlIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InBlcnNpc3RlbmNlOnBlcnNpc3RlbmNlLXVuaXQtdmFsaWRhdGlvbi1tb2RlLXR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgVGhlIHZhbGlkYXRpb24gbW9kZSB0byBiZSB1c2VkIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0KLSAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0aWVzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBBIGxpc3Qgb2Ygc3RhbmRhcmQgYW5kIHZlbmRvci1zcGVjaWZpYyBwcm9wZXJ0aWVzIAotICAgICAgICAgICAgICAgICAgICBhbmQgaGludHMuCi0KLSAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgQSBuYW1lLXZhbHVlIHBhaXIuCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICBOYW1lIHVzZWQgaW4gY29kZSB0byByZWZlcmVuY2UgdGhpcyBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmF0dHJpYnV0ZT4KLQotICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InBlcnNpc3RlbmNlOnBlcnNpc3RlbmNlLXVuaXQtdHJhbnNhY3Rpb24tdHlwZSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgIFR5cGUgb2YgdHJhbnNhY3Rpb25zIHVzZWQgYnkgRW50aXR5TWFuYWdlcnMgZnJvbSB0aGlzIAotICAgICAgICAgICAgICAgICAgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0KLSAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0icGVyc2lzdGVuY2U6dmVyc2lvblR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgZml4ZWQ9IjIuMCIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC10cmFuc2FjdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHtKVEEsIFJFU09VUkNFX0xPQ0FMfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpUQSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVTT1VSQ0VfTE9DQUwiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWNhY2hpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIFNoYXJlZENhY2hlTW9kZSB7IEFMTCwgTk9ORSwgRU5BQkxFX1NFTEVDVElWRSwgRElTQUJMRV9TRUxFQ1RJVkUsIFVOU1BFQ0lGSUVEfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRU5BQkxFX1NFTEVDVElWRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRElTQUJMRV9TRUxFQ1RJVkUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVOU1BFQ0lGSUVEIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC12YWxpZGF0aW9uLW1vZGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIFZhbGlkYXRpb25Nb2RlIHsgQVVUTywgQ0FMTEJBQ0ssIE5PTkV9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FMTEJBQ0siLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItYXBwXzJfMi5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl8yLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0MzlmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl8yLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDYzOSArMCwwIEBACi08IS0tCi1Db3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIDkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDQSAgOTQzMDMsIFUuUy5BLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLVRoaXMgcHJvZHVjdCBvciBkb2N1bWVudCBpcyBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGFuZCBkaXN0cmlidXRlZAotdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgaXRzIHVzZSwgY29weWluZywgZGlzdHJpYnV0aW9uLCBhbmQKLWRlY29tcGlsYXRpb24uICBObyBwYXJ0IG9mIHRoaXMgcHJvZHVjdCBvciBkb2N1bWVudGF0aW9uIG1heSBiZQotcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KLW9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LiAgCi0KLVRoaXJkIHBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcyBjb3B5cmlnaHRlZCBhbmQgCi1saWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuIAotCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gTG9nbywgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YSAKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCBhbmQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsIAotYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYyBpbiB0aGUgVS5TLiAKLWFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUFsbCBTUEFSQyB0cmFkZW1hcmtzIGFyZSB1c2VkIHVuZGVyIGxpY2Vuc2UgYW5kIGFyZSB0cmFkZW1hcmtzCi1vciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU1BBUkMgSW50ZXJuYXRpb25hbCwgSW5jLgotaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4gUHJvZHVjdHMgYmVhcmluZyBTUEFSQwotdHJhZGVtYXJrcyBhcmUgYmFzZWQgdXBvbiBhbiBhcmNoaXRlY3R1cmUgZGV2ZWxvcGVkIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gCi0KLVBvc3RTY3JpcHQgaXMgYSByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zLCBJbmMuIAotCi0gCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMgU3ViamVjdCB0byAKLVN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLQotIAotRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTEwgRVhQUkVTUyBPUiBJTVBMSUVECi1DT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkKLUlNUExJRUQgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UgT1IgTk9OLUlORlJJTkdFTUVOVCwgQVJFIERJU0NMQUlNRUQsIEVYQ0VQVAotVE8gVEhFIEVYVEVOVCBUSEFUIFNVQ0ggRElTQ0xBSU1FUlMgQVJFIEhFTEQgVE8gQkUgTEVHQUxMWQotSU5WQUxJRC4KLQotX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgCi05MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSAgOTQzMDMsIEV0YXRzLVVuaXMuIAotVG91cyBkcm9pdHMgcmUnc2VydmUncy4KLSAKLQotQ2UgcHJvZHVpdCBvdSBkb2N1bWVudCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQgZGlzdHJpYnVlJyBhdmVjIAotZGVzIGxpY2VuY2VzIHF1aSBlbiByZXN0cmVpZ25lbnQgbCd1dGlsaXNhdGlvbiwgbGEgY29waWUsIGxhIGRpc3RyaWJ1dGlvbiwKLWV0IGxhIGRlJ2NvbXBpbGF0aW9uLiAgQXVjdW5lIHBhcnRpZSBkZSBjZSBwcm9kdWl0IG91IGRlIHNhIGRvY3VtZW50YXRpb24KLWFzc29jaWUnZSBuZSBwZXV0IGVedHJlIHJlcHJvZHVpdGUgc291cyBhdWN1bmUgZm9ybWUsIHBhciBxdWVscXVlIG1veWVuIAotcXVlIGNlIHNvaXQsIHNhbnMgbCdhdXRvcmlzYXRpb24gcHJlJ2FsYWJsZSBldCBlJ2NyaXRlIGRlIFN1biBldCBkZSBzZXMgCi1iYWlsbGV1cnMgZGUgbGljZW5jZSwgcydpbCB5IGVuIGEuICAKLQotTGUgbG9naWNpZWwgZGUndGVudSBwYXIgZGVzIHRpZXJzLCBldCBxdWkgY29tcHJlbmQgbGEgdGVjaG5vbG9naWUgCi1yZWxhdGl2ZSBhdXggcG9saWNlcyBkZSBjYXJhY3RlYHJlcywgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IAotZXQgbGljZW5jaWUnIHBhciBkZXMgZm91cm5pc3NldXJzIGRlIFN1bi4KLSAKLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgbGUgbG9nbyBTdW4sIFNvbGFyaXMsIEphdmEsIEphdmFTZXJ2ZXIgUGFnZXMsIEphdmEgCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsIEpEQkMsIEpESywgSmF2YU1haWwsIGV0IEVudGVycHJpc2UgSmF2YUJlYW5zLCAgCi1zb250IGRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU3VuIAotTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFdGF0cy1VbmlzIGV0IGRhbnMgZCdhdXRyZXMgcGF5cy4KLSAKLVRvdXRlcyBsZXMgbWFycXVlcyBTUEFSQyBzb250IHV0aWxpc2UnZXMgc291cyBsaWNlbmNlIGV0IHNvbnQKLWRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU1BBUkMKLUludGVybmF0aW9uYWwsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgIGRhbnMKLWQnYXV0cmVzIHBheXMuIExlcyBwcm9kdWl0cyBwb3J0YW50IGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQKLWJhc2UncyBzdXIgdW5lIGFyY2hpdGVjdHVyZSBkZSd2ZWxvcHBlJ2UgcGFyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIAotCi1Qb3N0Y3JpcHQgZXN0IHVuZSBtYXJxdWUgZW5yZWdpc3RyZSdlIGQnQWRvYmUgU3lzdGVtcyBJbmMuIAotIAotTEEgRE9DVU1FTlRBVElPTiBFU1QgRk9VUk5JRSAiRU4gTCdFVEFUIiBFVCBUT1VURVMgQVVUUkVTIENPTkRJVElPTlMsCi1ERUNMQVJBVElPTlMgRVQgR0FSQU5USUVTIEVYUFJFU1NFUyBPVSBUQUNJVEVTIFNPTlQgRk9STUVMTEVNRU5UIEVYQ0xVRVMsCi1EQU5TIExBIE1FU1VSRSBBVVRPUklTRUUgUEFSIExBIExPSSBBUFBMSUNBQkxFLCBZIENPTVBSSVMgTk9UQU1NRU5UCi1UT1VURSBHQVJBTlRJRSBJTVBMSUNJVEUgUkVMQVRJVkUgQSBMQSBRVUFMSVRFIE1BUkNIQU5ERSwgQSBMJ0FQVElUVURFCi1BIFVORSBVVElMSVNBVElPTiBQQVJUSUNVTElFUkUgT1UgQSBMJ0FCU0VOQ0UgREUgQ09OVFJFRkFDT04uCi0tLT4KLQotPCEtLQotVGhlIHdlYi1hcHAgZWxlbWVudCBpcyB0aGUgcm9vdCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvcgotYSB3ZWIgYXBwbGljYXRpb24KLS0tPgotCi08IUVMRU1FTlQgd2ViLWFwcCAoaWNvbj8sIGRpc3BsYXktbmFtZT8sIGRlc2NyaXB0aW9uPywgZGlzdHJpYnV0YWJsZT8sCi1jb250ZXh0LXBhcmFtKiwgc2VydmxldCosIHNlcnZsZXQtbWFwcGluZyosIHNlc3Npb24tY29uZmlnPywKLW1pbWUtbWFwcGluZyosIHdlbGNvbWUtZmlsZS1saXN0PywgZXJyb3ItcGFnZSosIHRhZ2xpYiosCi1yZXNvdXJjZS1yZWYqLCBzZWN1cml0eS1jb25zdHJhaW50KiwgbG9naW4tY29uZmlnPywgc2VjdXJpdHktcm9sZSosCi1lbnYtZW50cnkqLCBlamItcmVmKik+Ci0KLTwhLS0KLVRoZSBpY29uIGVsZW1lbnQgY29udGFpbnMgYSBzbWFsbC1pY29uIGFuZCBhIGxhcmdlLWljb24gZWxlbWVudAotd2hpY2ggc3BlY2lmeSB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24gZm9yIGEgc21hbGwgYW5kCi1sYXJnZSBpbWFnZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgd2ViIGFwcGxpY2F0aW9uIGluIGEgR1VJIHRvb2wuIEF0IGEKLW1pbmltdW0sIHRvb2xzIG11c3QgYWNjZXB0IEdJRiBhbmQgSlBFRyBmb3JtYXQgaW1hZ2VzLgotLS0+Ci0KLTwhRUxFTUVOVCBpY29uIChzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8pPgotCi08IS0tCi1UaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHdlYgotYXBwbGljYXRpb24gb2YgYSBmaWxlIGNvbnRhaW5pbmcgYSBzbWFsbCAoMTZ4MTYgcGl4ZWwpIGljb24gaW1hZ2UuCi0tLT4KLQotPCFFTEVNRU5UIHNtYWxsLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHdlYgotYXBwbGljYXRpb24gb2YgYSBmaWxlIGNvbnRhaW5pbmcgYSBsYXJnZSAoMzJ4MzIgcGl4ZWwpIGljb24gaW1hZ2UuCi0tLT4KLQotPCFFTEVNRU5UIGxhcmdlLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQKLXRvIGJlIGRpc3BsYXllZCBieSBHVUkgdG9vbHMKLS0tPgotCi08IUVMRU1FTlQgZGlzcGxheS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBwcm92aWRlIGRlc2NyaXB0aXZlIHRleHQgYWJvdXQKLXRoZSBwYXJlbnQgZWxlbWVudC4KLS0tPgotCi08IUVMRU1FTlQgZGVzY3JpcHRpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGlzdHJpYnV0YWJsZSBlbGVtZW50LCBieSBpdHMgcHJlc2VuY2UgaW4gYSB3ZWIgYXBwbGljYXRpb24KLWRlcGxveW1lbnQgZGVzY3JpcHRvciwgaW5kaWNhdGVzIHRoYXQgdGhpcyB3ZWIgYXBwbGljYXRpb24gaXMKLXByb2dyYW1tZWQgYXBwcm9wcmlhdGVseSB0byBiZSBkZXBsb3llZCBpbnRvIGEgZGlzdHJpYnV0ZWQgc2VydmxldAotY29udGFpbmVyCi0tLT4KLQotPCFFTEVNRU5UIGRpc3RyaWJ1dGFibGUgRU1QVFk+Ci0KLTwhLS0KLVRoZSBjb250ZXh0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgd2ViCi1hcHBsaWNhdGlvbidzIHNlcnZsZXQgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgotLS0+Ci0KLTwhRUxFTUVOVCBjb250ZXh0LXBhcmFtIChwYXJhbS1uYW1lLCBwYXJhbS12YWx1ZSwgZGVzY3JpcHRpb24/KT4KLQotPCEtLQotVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4KLS0tPgotCi08IUVMRU1FTlQgcGFyYW0tbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBwYXJhbS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlci4KLS0tPgotCi08IUVMRU1FTlQgcGFyYW0tdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc2VydmxldCBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGl2ZSBkYXRhIG9mIGEKLXNlcnZsZXQuIElmIGEganNwLWZpbGUgaXMgc3BlY2lmaWVkIGFuZCB0aGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaXMKLXByZXNlbnQsIHRoZW4gdGhlIEpTUCBzaG91bGQgYmUgcHJlY29tcGlsZWQgYW5kIGxvYWRlZC4KLS0tPgotCi08IUVMRU1FTlQgc2VydmxldCAoaWNvbj8sIHNlcnZsZXQtbmFtZSwgZGlzcGxheS1uYW1lPywgZGVzY3JpcHRpb24/LAotKHNlcnZsZXQtY2xhc3N8anNwLWZpbGUpLCBpbml0LXBhcmFtKiwgbG9hZC1vbi1zdGFydHVwPywgc2VjdXJpdHktcm9sZS1yZWYqKT4KLQotPCEtLQotVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUKLXNlcnZsZXQuCi0tLT4KLQotPCFFTEVNRU5UIHNlcnZsZXQtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzZXJ2bGV0LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi1vZiB0aGUgc2VydmxldC4KLS0tPgotCi08IUVMRU1FTlQgc2VydmxldC1jbGFzcyAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBqc3AtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxsIHBhdGggdG8gYSBKU1AgZmlsZSB3aXRoaW4KLXRoZSB3ZWIgYXBwbGljYXRpb24uCi0tLT4KLQotPCFFTEVNRU5UIGpzcC1maWxlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcyBhbgotaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgdGhlIHNlcnZsZXQKLS0tPgotCi08IUVMRU1FTlQgaW5pdC1wYXJhbSAocGFyYW0tbmFtZSwgcGFyYW0tdmFsdWUsIGRlc2NyaXB0aW9uPyk+Ci0KLTwhLS0KLVRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHNlcnZsZXQgc2hvdWxkIGJlCi1sb2FkZWQgb24gdGhlIHN0YXJ0dXAgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGNvbnRlbnRzIG9mCi10aGVzZSBlbGVtZW50IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG9yZGVyIGluIHdoaWNoCi10aGUgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkLiBMb3dlciBpbnRlZ2VycyBhcmUgbG9hZGVkIGJlZm9yZSBoaWdoZXIKLWludGVnZXJzLiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIG9yIGlmIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgbm90IGEKLXBvc2l0aXZlIGludGVnZXIsIHRoZSBjb250YWluZXIgaXMgZnJlZSB0byBsb2FkIGl0IGF0IGFueSB0aW1lIGluIHRoZQotc3RhcnR1cCBzZXF1ZW5jZS4KLS0tPgotCi08IUVMRU1FTlQgbG9hZC1vbi1zdGFydHVwICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNlcnZsZXQtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYSBzZXJ2bGV0Ci1hbmQgYSB1cmwgcGF0dGVybgotLS0+Ci0KLTwhRUxFTUVOVCBzZXJ2bGV0LW1hcHBpbmcgKHNlcnZsZXQtbmFtZSwgdXJsLXBhdHRlcm4pPgotCi08IS0tCi1UaGUgdXJsLXBhdHRlcm4gZWxlbWVudCBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlCi1tYXBwaW5nLiBNdXN0IGZvbGxvdyB0aGUgcnVsZXMgc3BlY2lmaWVkIGluIFNlY3Rpb24gMTAgb2YgdGhlIFNlcnZsZXQKLUFQSSBTcGVjaWZpY2F0aW9uLgotLS0+Ci0KLTwhRUxFTUVOVCB1cmwtcGF0dGVybiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzZXNzaW9uLWNvbmZpZyBlbGVtZW50IGRlZmluZXMgdGhlIHNlc3Npb24gcGFyYW1ldGVycyBmb3IKLXRoaXMgd2ViIGFwcGxpY2F0aW9uLgotLS0+Ci0KLTwhRUxFTUVOVCBzZXNzaW9uLWNvbmZpZyAoc2Vzc2lvbi10aW1lb3V0Pyk+Ci0KLTwhLS0KLVRoZSBzZXNzaW9uLXRpbWVvdXQgZWxlbWVudCBkZWZpbmVzIHRoZSBkZWZhdWx0IHNlc3Npb24gdGltZW91dAotaW50ZXJ2YWwgZm9yIGFsbCBzZXNzaW9ucyBjcmVhdGVkIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUKLXNwZWNpZmllZCB0aW1lb3V0IG11c3QgYmUgZXhwcmVzc2VkIGluIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuCi0tLT4KLQotPCFFTEVNRU5UIHNlc3Npb24tdGltZW91dCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBtaW1lLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGV4dGVuc2lvbgotYW5kIGEgbWltZSB0eXBlLgotLS0+Ci0KLTwhRUxFTUVOVCBtaW1lLW1hcHBpbmcgKGV4dGVuc2lvbiwgbWltZS10eXBlKT4KLQotPCEtLQotVGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4KLWV4dGVuc2lvbi4gZXhhbXBsZTogInR4dCIKLS0tPgotCi08IUVMRU1FTlQgZXh0ZW5zaW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIG1pbWUtdHlwZSBlbGVtZW50IGNvbnRhaW5zIGEgZGVmaW5lZCBtaW1lIHR5cGUuIGV4YW1wbGU6Ci0idGV4dC9wbGFpbiIKLS0tPgotCi08IUVMRU1FTlQgbWltZS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHdlbGNvbWUtZmlsZS1saXN0IGNvbnRhaW5zIGFuIG9yZGVyZWQgbGlzdCBvZiB3ZWxjb21lIGZpbGVzCi1lbGVtZW50cy4KLS0tPgotCi08IUVMRU1FTlQgd2VsY29tZS1maWxlLWxpc3QgKHdlbGNvbWUtZmlsZSspPgotCi08IS0tCi1UaGUgd2VsY29tZS1maWxlIGVsZW1lbnQgY29udGFpbnMgZmlsZSBuYW1lIHRvIHVzZSBhcyBhIGRlZmF1bHQKLXdlbGNvbWUgZmlsZSwgc3VjaCBhcyBpbmRleC5odG1sCi0tLT4KLQotPCFFTEVNRU5UIHdlbGNvbWUtZmlsZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB0YWdsaWIgZWxlbWVudCBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgSlNQIHRhZyBsaWJyYXJ5LgotLS0+Ci0KLTwhRUxFTUVOVCB0YWdsaWIgKHRhZ2xpYi11cmksIHRhZ2xpYi1sb2NhdGlvbik+Ci0KLTwhLS0KLVRoZSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJLCByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24KLW9mIHRoZSB3ZWIueG1sIGRvY3VtZW50LCBpZGVudGlmeWluZyBhIFRhZyBMaWJyYXJ5IHVzZWQgaW4gdGhlIFdlYgotQXBwbGljYXRpb24uCi0tLT4KLQotPCFFTEVNRU5UIHRhZ2xpYi11cmkgKCNQQ0RBVEEpPgotCi08IS0tCi10aGUgdGFnbGliLWxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIChhcyBhIHJlc291cmNlCi1yZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uKSB3aGVyZSB0byBmaW5kIHRoZSBUYWcKLUxpYmFyeSBEZXNjcmlwdGlvbiBmaWxlIGZvciB0aGUgdGFnIGxpYnJhcnkuCi0tLT4KLQotPCFFTEVNRU5UIHRhZ2xpYi1sb2NhdGlvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlcnJvci1wYWdlIGVsZW1lbnQgY29udGFpbnMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXJyb3IgY29kZQotb3IgZXhjZXB0aW9uIHR5cGUgdG8gdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCi0tLT4KLQotPCFFTEVNRU5UIGVycm9yLXBhZ2UgKChlcnJvci1jb2RlIHwgZXhjZXB0aW9uLXR5cGUpLCBsb2NhdGlvbik+Ci0KLTwhLS0KLVRoZSBlcnJvci1jb2RlIGNvbnRhaW5zIGFuIEhUVFAgZXJyb3IgY29kZSwgZXg6IDQwNAotLS0+Ci0KLTwhRUxFTUVOVCBlcnJvci1jb2RlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGV4Y2VwdGlvbiB0eXBlIGNvbnRhaW5zIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYQotSmF2YSBleGNlcHRpb24gdHlwZS4KLS0tPgotCi08IUVMRU1FTlQgZXhjZXB0aW9uLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIGluIHRoZQotd2ViIGFwcGxpY2F0aW9uCi0tLT4KLQotPCFFTEVNRU5UIGxvY2F0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYSBXZWIKLUFwcGxpY2F0aW9uJ3MgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLgotLS0+Ci0KLTwhRUxFTUVOVCByZXNvdXJjZS1yZWYgKGRlc2NyaXB0aW9uPywgcmVzLXJlZi1uYW1lLCByZXMtdHlwZSwgcmVzLWF1dGgpPgotCi08IS0tCi1UaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZQotZmFjdG9yeSByZWZlcmVuY2UgbmFtZS4KLS0tPgotCi08IUVMRU1FTlQgcmVzLXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSAoSmF2YSBjbGFzcykgdHlwZSBvZiB0aGUgZGF0YQotc291cmNlLgotLS0+Ci0KLTwhRUxFTUVOVCByZXMtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtYXV0aCBlbGVtZW50IGluZGljYXRlcyB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnQKLWNvZGUgcGVyZm9ybXMgcmVzb3VyY2Ugc2lnbm9uIHByb2dyYW1tYXRpY2FsbHkgb3Igd2hldGhlciB0aGUKLWNvbnRhaW5lciBzaWducyBvbnRvIHRoZSByZXNvdXJjZSBiYXNlZCBvbiB0aGUgcHJpbmNpcGxlIG1hcHBpbmcKLWluZm9ybWF0aW9uIHN1cHBsaWVkIGJ5IHRoZSBkZXBsb3llci4gTXVzdCBiZSBDT05UQUlORVIgb3IgU0VSVkxFVAotLS0+Ci0KLTwhRUxFTUVOVCByZXMtYXV0aCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzZWN1cml0eS1jb25zdHJhaW50IGVsZW1lbnQgaXMgdXNlZCB0byBhc3NvY2lhdGUgc2VjdXJpdHkKLWNvbnN0cmFpbnRzIHdpdGggb25lIG9yIG1vcmUgd2ViIHJlc291cmNlIGNvbGxlY3Rpb25zCi0tLT4KLQotPCFFTEVNRU5UIHNlY3VyaXR5LWNvbnN0cmFpbnQgKHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uKywKLWF1dGgtY29uc3RyYWludD8sIHVzZXItZGF0YS1jb25zdHJhaW50Pyk+Ci0KLTwhLS0KLVRoZSB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gaWRlbnRpZnkgYSBzdWJzZXQKLW9mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluIGEgd2ViCi1hcHBsaWNhdGlvbiB0byB3aGljaCBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYgbm8gSFRUUCBtZXRob2RzCi1hcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMgdG8gYWxsIEhUVFAKLW1ldGhvZHMuCi0tLT4KLQotPCFFTEVNRU5UIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uICh3ZWItcmVzb3VyY2UtbmFtZSwgZGVzY3JpcHRpb24/LAotdXJsLXBhdHRlcm4qLCBodHRwLW1ldGhvZCopPgotCi08IS0tCi1UaGUgd2ViLXJlc291cmNlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyB3ZWIgcmVzb3VyY2UKLWNvbGxlY3Rpb24KLS0tPgotCi08IUVMRU1FTlQgd2ViLXJlc291cmNlLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaHR0cC1tZXRob2QgY29udGFpbnMgYW4gSFRUUCBtZXRob2QgKEdFVCB8IFBPU1QgfC4uLikKLS0tPgotCi08IUVMRU1FTlQgaHR0cC1tZXRob2QgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgdXNlci1kYXRhLWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGluZGljYXRlIGhvdyBkYXRhCi1jb21tdW5pY2F0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBjb250YWluZXIgc2hvdWxkIGJlIHByb3RlY3RlZAotLS0+Ci0KLTwhRUxFTUVOVCB1c2VyLWRhdGEtY29uc3RyYWludCAoZGVzY3JpcHRpb24/LCB0cmFuc3BvcnQtZ3VhcmFudGVlKT4KLQotPCEtLQotVGhlIHRyYW5zcG9ydC1ndWFyYW50ZWUgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCB0aGUgY29tbXVuaWNhdGlvbgotYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yCi1DT05GSURFTlRJQUwuIE5PTkUgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QgcmVxdWlyZSBhbnkKLXRyYW5zcG9ydCBndWFyYW50ZWVzLiBBIHZhbHVlIG9mIElOVEVHUkFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uCi1yZXF1aXJlcyB0aGF0IHRoZSBkYXRhIHNlbnQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgYmUgc2VudCBpbgotc3VjaCBhIHdheSB0aGF0IGl0IGNhbid0IGJlIGNoYW5nZWQgaW4gdHJhbnNpdC4gQ09ORklERU5USUFMIG1lYW5zCi10aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIGJlIHRyYW5zbWl0dGVkIGluIGEKLWZhc2hpb24gdGhhdCBwcmV2ZW50cyBvdGhlciBlbnRpdGllcyBmcm9tIG9ic2VydmluZyB0aGUgY29udGVudHMgb2YKLXRoZSB0cmFuc21pc3Npb24uIEluIG1vc3QgY2FzZXMsIHRoZSBwcmVzZW5jZSBvZiB0aGUgSU5URUdSQUwgb3IKLUNPTkZJREVOVElBTCBmbGFnIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgdXNlIG9mIFNTTCBpcyByZXF1aXJlZC4KLS0tPgotCi08IUVMRU1FTlQgdHJhbnNwb3J0LWd1YXJhbnRlZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBhdXRoLWNvbnN0cmFpbnQgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHVzZXIgcm9sZXMgdGhhdCBzaG91bGQKLWJlIHBlcm1pdHRlZCBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZSBjb2xsZWN0aW9uLiBUaGUgcm9sZSB1c2VkIGhlcmUKLW11c3QgYXBwZWFyIGluIGEgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudC4KLS0tPgotCi08IUVMRU1FTlQgYXV0aC1jb25zdHJhaW50IChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSopPgotCi08IS0tCi1UaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotLS0+Ci0KLTwhRUxFTUVOVCByb2xlLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbG9naW4tY29uZmlnIGVsZW1lbnQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCi1tZXRob2QgdGhhdCBzaG91bGQgYmUgdXNlZCwgdGhlIHJlYWxtIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IKLXRoaXMgYXBwbGljYXRpb24sIGFuZCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZSBuZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4KLW1lY2hhbmlzbS4KLS0tPgotCi08IUVMRU1FTlQgbG9naW4tY29uZmlnIChhdXRoLW1ldGhvZD8sIHJlYWxtLW5hbWU/LCBmb3JtLWxvZ2luLWNvbmZpZz8pPgotCi08IS0tCi1UaGUgcmVhbG0gbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgcmVhbG0gbmFtZSB0byB1c2UgaW4gSFRUUAotQmFzaWMgYXV0aG9yaXphdGlvbgotLS0+Ci0KLTwhRUxFTUVOVCByZWFsbS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGZvcm0tbG9naW4tY29uZmlnIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsb2dpbiBhbmQgZXJyb3IgcGFnZXMKLXRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gZm9ybSBiYXNlZCBsb2dpbi4gSWYgZm9ybSBiYXNlZCBhdXRoZW50aWNhdGlvbgotaXMgbm90IHVzZWQsIHRoZXNlIGVsZW1lbnRzIGFyZSBpZ25vcmVkLgotLS0+Ci0KLTwhRUxFTUVOVCBmb3JtLWxvZ2luLWNvbmZpZyAoZm9ybS1sb2dpbi1wYWdlLCBmb3JtLWVycm9yLXBhZ2UpPgotCi08IS0tCi1UaGUgZm9ybS1sb2dpbi1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHAKLXdoZXJlIHRoZSBwYWdlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2luIGNhbiBiZSBmb3VuZAotLS0+Ci0KLTwhRUxFTUVOVCBmb3JtLWxvZ2luLXBhZ2UgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZm9ybS1lcnJvci1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHAKLXdoZXJlIHRoZSBlcnJvciBwYWdlIHRoYXQgaXMgZGlzcGxheWVkIHdoZW4gbG9naW4gaXMgbm90IHN1Y2Nlc3NmdWwKLWNhbiBiZSBmb3VuZAotLS0+Ci0KLTwhRUxFTUVOVCBmb3JtLWVycm9yLXBhZ2UgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgYXV0aC1tZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KLW1lY2hhbmlzbSBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbi4gQXMgYSBwcmVyZXF1aXNpdGUgdG8gZ2FpbmluZyBhY2Nlc3MKLXRvIGFueSB3ZWIgcmVzb3VyY2VzIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkgYW4gYXV0aG9yaXphdGlvbgotY29uc3RyYWludCwgYSB1c2VyIG11c3QgaGF2ZSBhdXRoZW50aWNhdGVkIHVzaW5nIHRoZSBjb25maWd1cmVkCi1tZWNoYW5pc20uIExlZ2FsIHZhbHVlcyBmb3IgdGhpcyBlbGVtZW50IGFyZSAiQkFTSUMiLCAiRElHRVNUIiwKLSJGT1JNIiwgb3IgIkNMSUVOVC1DRVJUIi4KLS0tPgotCi08IUVMRU1FTlQgYXV0aC1tZXRob2QgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc2VjdXJpdHktcm9sZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHNlY3VyaXR5Ci1yb2xlIHdoaWNoIGlzIHVzZWQgaW4gdGhlIHNlY3VyaXR5LWNvbnN0cmFpbnRzIHBsYWNlZCBvbiB0aGUgd2ViCi1hcHBsaWNhdGlvbi4KLS0tPgotCi08IUVMRU1FTlQgc2VjdXJpdHktcm9sZSAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUpPgotCi08IS0tCi1UaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSByb2xlLiBUaGlzIGVsZW1lbnQKLW11c3QgY29udGFpbiBhIG5vbi1lbXB0eSBzdHJpbmcuCi0tLT4KLQotPCFFTEVNRU5UIHNlY3VyaXR5LXJvbGUtcmVmIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSwgcm9sZS1saW5rKT4KLQotPCEtLQotVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIHVzZWQgdG8gbGluayBhIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlCi10byBhIGRlZmluZWQgc2VjdXJpdHkgcm9sZS4gVGhlIHJvbGUtbGluayBlbGVtZW50IG11c3QgY29udGFpbiB0aGUKLW5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlCi1lbGVtZW50cy4KLS0tPgotCi08IUVMRU1FTlQgcm9sZS1saW5rICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhbgotYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBlbnRyeS4gVGhpcyBlbGVtZW50IGlzIHJlcXVpcmVkIHRvIGJlCi1ob25vcmVkIG9uIGluIEoyRUUgY29tcGxpYW50IHNlcnZsZXQgY29udGFpbmVycy4KLS0tPgotCi08IUVMRU1FTlQgZW52LWVudHJ5IChkZXNjcmlwdGlvbj8sIGVudi1lbnRyeS1uYW1lLCBlbnYtZW50cnktdmFsdWU/LAotZW52LWVudHJ5LXR5cGUpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gYXBwbGljYXRpb24ncwotZW52aXJvbm1lbnQgZW50cnkKLS0tPgotCi08IUVMRU1FTlQgZW52LWVudHJ5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGFuCi1hcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGVudHJ5Ci0tLT4KLQotPCFFTEVNRU5UIGVudi1lbnRyeS12YWx1ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSB0eXBlCi1vZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24KLWNvZGUuIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgZW52LWVudHJ5LXR5cGU6Ci1qYXZhLmxhbmcuQm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsCi1qYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuRmxvYXQuCi0tLT4KLQotPCFFTEVNRU5UIGVudi1lbnRyeS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1yZWYgZWxlbWVudCBpcyB1c2VkIHRvIGRlY2xhcmUgYSByZWZlcmVuY2UgdG8gYW4KLWVudGVycHJpc2UgYmVhbi4gCi0tLT4KLQotPCFFTEVNRU5UIGVqYi1yZWYgKGRlc2NyaXB0aW9uPywgZWpiLXJlZi1uYW1lLCBlamItcmVmLXR5cGUsIGhvbWUsIHJlbW90ZSwKLWVqYi1saW5rPyk+Ci0KLTwhLS0KLVRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLXJlZmVyZW5jZS4gVGhpcyBpcyB0aGUgSk5ESSBuYW1lIHRoYXQgdGhlIHNlcnZsZXQgY29kZSB1c2VzIHRvIGdldCBhCi1yZWZlcmVuY2UgdG8gdGhlIGVudGVycHJpc2UgYmVhbi4KLS0tPgotCi08IUVMRU1FTlQgZWpiLXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBleHBlY3RlZCBqYXZhIGNsYXNzIHR5cGUgb2YKLXRoZSByZWZlcmVuY2VkIEVKQi4KLS0tPgotCi08IUVMRU1FTlQgZWpiLXJlZi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1ob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZQotRUpCJ3MgaG9tZSBpbnRlcmZhY2UKLS0tPgotCi08IUVMRU1FTlQgaG9tZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZQotRUpCJ3MgcmVtb3RlIGludGVyZmFjZQotLS0+Ci0KLTwhRUxFTUVOVCByZW1vdGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBlamItcmVmIGVsZW1lbnQgdG8gc3BlY2lmeQotdGhhdCBhbiBFSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBhbiBFSkIgaW4gYW4gZW5jb21wYXNzaW5nIEphdmEyCi1FbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIGFwcGxpY2F0aW9uIHBhY2thZ2UuIFRoZSB2YWx1ZSBvZiB0aGUKLWVqYi1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgZWpiLW5hbWUgb2YgYW5kIEVKQiBpbiB0aGUgSjJFRQotYXBwbGljYXRpb24gcGFja2FnZS4KLS0tPgotCi08IUVMRU1FTlQgZWpiLWxpbmsgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgSUQgbWVjaGFuaXNtIGlzIHRvIGFsbG93IHRvb2xzIHRvIGVhc2lseSBtYWtlIHRvb2wtc3BlY2lmaWMKLXJlZmVyZW5jZXMgdG8gdGhlIGVsZW1lbnRzIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoaXMgYWxsb3dzCi10b29scyB0aGF0IHByb2R1Y2UgYWRkaXRpb25hbCBkZXBsb3ltZW50IGluZm9ybWF0aW9uIChpLmUgaW5mb3JtYXRpb24KLWJleW9uZCB0aGUgc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yIGluZm9ybWF0aW9uKSB0byBzdG9yZSB0aGUKLW5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbiBhIHNlcGFyYXRlIGZpbGUsIGFuZCBlYXNpbHkgcmVmZXIgZnJvbQotdGhlc2UgdG9vbHMtc3BlY2lmaWMgZmlsZXMgdG8gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBzdGFuZGFyZCB3ZWItYXBwCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0tLT4KLQotPCFBVFRMSVNUIHdlYi1hcHAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzbWFsbC1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxhcmdlLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGlzcGxheS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRpc3RyaWJ1dGFibGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udGV4dC1wYXJhbSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwYXJhbS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHBhcmFtLXZhbHVlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlcnZsZXQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VydmxldC1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlcnZsZXQtY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QganNwLWZpbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaW5pdC1wYXJhbSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsb2FkLW9uLXN0YXJ0dXAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VydmxldC1tYXBwaW5nIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHVybC1wYXR0ZXJuIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlc3Npb24tY29uZmlnIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlc3Npb24tdGltZW91dCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtaW1lLW1hcHBpbmcgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZXh0ZW5zaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1pbWUtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWxjb21lLWZpbGUtbGlzdCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWxjb21lLWZpbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdGFnbGliIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRhZ2xpYi11cmkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdGFnbGliLWxvY2F0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVycm9yLXBhZ2UgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZXJyb3ItY29kZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBleGNlcHRpb24tdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsb2NhdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1hdXRoIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LWNvbnN0cmFpbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgd2ViLXJlc291cmNlLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaHR0cC1tZXRob2QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdXNlci1kYXRhLWNvbnN0cmFpbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdHJhbnNwb3J0LWd1YXJhbnRlZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhdXRoLWNvbnN0cmFpbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgcm9sZS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxvZ2luLWNvbmZpZyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWFsbS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZvcm0tbG9naW4tY29uZmlnIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZvcm0tbG9naW4tcGFnZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmb3JtLWVycm9yLXBhZ2UgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXV0aC1tZXRob2QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktcm9sZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZWN1cml0eS1yb2xlLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByb2xlLWxpbmsgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaG9tZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW1vdGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWxpbmsgaWQgSUQgI0lNUExJRUQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl8zLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzMuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTNhYjAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzMuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTA2MyArMCwwIEBACi08IS0tCi1Db3B5cmlnaHQgKGMpIDIwMDAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwKLTkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgcmVsYXRpbmcgdG8KLXRlY2hub2xvZ3kgZW1ib2RpZWQgaW4gdGhlIHByb2R1Y3QgdGhhdCBpcyBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4KLUluIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMgbGlzdGVkIGF0Ci1odHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUgYWRkaXRpb25hbCBwYXRlbnRzIG9yCi1wZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlIFUuUy4gYW5kIGluIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHByb2R1Y3QgdG8gd2hpY2ggaXQgcGVydGFpbnMgYXJlIGRpc3RyaWJ1dGVkCi11bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiwgYW5kCi1kZWNvbXBpbGF0aW9uLiAgVGhpcyBkb2N1bWVudCBtYXkgYmUgcmVwcm9kdWNlZCBhbmQgZGlzdHJpYnV0ZWQgYnV0IG1heQotbm90IGJlIGNoYW5nZWQgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMKLWxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMgY29weXJpZ2h0ZWQgYW5kCi1saWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgIFN1biBNaWNyb3N5c3RlbXMsICB0aGUgU3VuIGxvZ28sICBKYXZhLCAgSmF2YVNlcnZlciBQYWdlcywgIEphdmEKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgIEpEQkMsICBKREssICBKYXZhTWFpbCBhbmQgIGFuZAotRW50ZXJwcmlzZSBKYXZhQmVhbnMgYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycyBTdWJqZWN0IHRvCi1TdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi1ET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFMTCBFWFBSRVNTIE9SIElNUExJRUQKLUNPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIEFOWSBJTVBMSUVECi1XQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUgotTk9OLUlORlJJTkdFTUVOVCwgQVJFIERJU0NMQUlNRUQsIEVYQ0VQVCBUTyBUSEUgRVhURU5UIFRIQVQgU1VDSAotRElTQ0xBSU1FUlMgQVJFIEhFTEQgVE8gQkUgTEVHQUxMWSBJTlZBTElELgotCi0KLV9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotQ29weXJpZ2h0IChjKSAyMDAwIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sCi05MDEgU2FuIEFudG9uaW8gUm9hZCwKLVBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgRSd0YXRzLVVuaXMuCi1Ub3VzIGRyb2l0cyByZSdzZXJ2ZSdzLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGEgbGVzIGRyb2l0cyBkZSBwcm9wcmllJ3RlJyBpbnRlbGxlY3R1ZWxzCi1yZWxhdGFudHMgYWAgbGEgdGVjaG5vbG9naWUgaW5jb3Jwb3JlJ2UgZGFucyBsZSBwcm9kdWl0IHF1aSBlc3QgZGUnY3JpdAotZGFucyBjZSBkb2N1bWVudC4gRW4gcGFydGljdWxpZXIsIGV0IHNhbnMgbGEgbGltaXRhdGlvbiwgY2VzIGRyb2l0cyBkZQotcHJvcHJpZSd0ZScgaW50ZWxsZWN0dWVscyBwZXV2ZW50IGluY2x1cmUgdW4gb3UgcGx1cyBkZXMgYnJldmV0cwotYW1lJ3JpY2FpbnMgZSdudW1lJ3JlJ3MgYWAgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgZXQgdW4gb3UgbGVzCi1icmV2ZXRzIHBsdXMgc3VwcGxlJ21lbnRhaXJlcyBvdSBsZXMgYXBwbGljYXRpb25zIGRlIGJyZXZldCBlbiBhdHRlbnRlCi1kYW5zIGxlcyBFJ3RhdHMtVW5pcyBldCBkYW5zIGxlcyBhdXRyZXMgcGF5cy4KLQotQ2UgcHJvZHVpdCBvdSBkb2N1bWVudCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQgZGlzdHJpYnVlJwotYXZlYyBkZXMgbGljZW5jZXMgcXVpIGVuIHJlc3RyZWlnbmVudCBsJ3V0aWxpc2F0aW9uLCBsYSBjb3BpZSwgbGEKLWRpc3RyaWJ1dGlvbiwgZXQgbGEgZGUnY29tcGlsYXRpb24uICBDZSBkb2N1bWVudGlvbiBhc3NvY2llIG4gcGV1dAotZV50cmUgcmVwcm9kdWl0ZSBldCBkaXN0cmlidWVyLCBwYXIgcXVlbHF1ZSBtb3llbiBxdWUgY2Ugc29pdCwgc2FucwotbCdhdXRvcmlzYXRpb24gcHJlJ2FsYWJsZSBldCBlJ2NyaXRlIGRlIFN1biBldCBkZSBzZXMgYmFpbGxldXJzIGRlCi1saWNlbmNlLCBsZSBjYXMgZSdjaGUnYW50LgotCi1MZSBsb2dpY2llbCBkZSd0ZW51IHBhciBkZXMgdGllcnMsIGV0IHF1aSBjb21wcmVuZCBsYSB0ZWNobm9sb2dpZQotcmVsYXRpdmUgYXV4IHBvbGljZXMgZGUgY2FyYWN0ZWByZXMsIGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldAotbGljZW5jaWUnIHBhciBkZXMgZm91cm5pc3NldXJzIGRlIFN1bi4KLQotU3VuLCAgU3VuIE1pY3Jvc3lzdGVtcywgIGxlIGxvZ28gU3VuLCAgSmF2YSwgIEphdmFTZXJ2ZXIgUGFnZXMsICBKYXZhCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsICBKREJDLCAgSkRLLCAgSmF2YU1haWwgZXQgIGFuZAotRW50ZXJwcmlzZSBKYXZhQmVhbnMgc29udCBkZXMgbWFycXVlcyBkZSBmYWJyaXF1ZSBvdSBkZXMgbWFycXVlcwotZGUncG9zZSdlcyBkZSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFJ3RhdHMtVW5pcyBldCBkYW5zIGQnYXV0cmVzCi1wYXlzLgotCi1MQSBET0NVTUVOVEFUSU9OIEVTVCBGT1VSTklFICJFTiBMJ0UnVEFUIiBFVCBUT1VURVMgQVVUUkVTIENPTkRJVElPTlMsCi1ERUNMQVJBVElPTlMgRVQgR0FSQU5USUVTIEVYUFJFU1NFUyBPVSBUQUNJVEVTIFNPTlQgRk9STUVMTEVNRU5UCi1FWENMVUVTLCBEQU5TIExBIE1FU1VSRSBBVVRPUklTRUUgUEFSIExBIExPSSBBUFBMSUNBQkxFLCBZIENPTVBSSVMKLU5PVEFNTUVOVCBUT1VURSBHQVJBTlRJRSBJTVBMSUNJVEUgUkVMQVRJVkUgQSBMQSBRVUFMSVRFIE1BUkNIQU5ERSwgQQotTCdBUFRJVFVERSBBIFVORSBVVElMSVNBVElPTiBQQVJUSUNVTElFUkUgT1UgQSBMJ0FCU0VOQ0UgREUKLUNPTlRSRUZBQyxPTi4KLS0tPgotCi08IS0tCi1UaGlzIGlzIHRoZSBYTUwgRFREIGZvciB0aGUgU2VydmxldCAyLjMgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotQWxsIFNlcnZsZXQgMi4zIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmNsdWRlIGEgRE9DVFlQRQotb2YgdGhlIGZvbGxvd2luZyBmb3JtOgotCi0gIDwhRE9DVFlQRSB3ZWItYXBwIFBVQkxJQwotCSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iCi0JImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCI+Ci0KLS0tPgotCi08IS0tCi1UaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLS0gSW4gZWxlbWVudHMgdGhhdCBjb250YWluIFBDREFUQSwgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZQotICBpbiB0aGUgZGF0YSBtYXkgYmUgaWdub3JlZC4KLQotLSBJbiBlbGVtZW50cyB3aG9zZSB2YWx1ZSBpcyBhbiAiZW51bWVyYXRlZCB0eXBlIiwgdGhlIHZhbHVlIGlzCi0gIGNhc2Ugc2Vuc2l0aXZlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlIHNhbWUKLSAgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90IHN0YXJ0aW5nIHdpdGggIi8iKQotICBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuCi0gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeQotICBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0gIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIHNlcnZsZXQgQVBJLgotLS0+Ci0KLQotPCEtLQotVGhlIHdlYi1hcHAgZWxlbWVudCBpcyB0aGUgcm9vdCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvcgotYSB3ZWIgYXBwbGljYXRpb24uCi0tLT4KLTwhRUxFTUVOVCB3ZWItYXBwIChpY29uPywgZGlzcGxheS1uYW1lPywgZGVzY3JpcHRpb24/LCBkaXN0cmlidXRhYmxlPywKLWNvbnRleHQtcGFyYW0qLCBmaWx0ZXIqLCBmaWx0ZXItbWFwcGluZyosIGxpc3RlbmVyKiwgc2VydmxldCosCi1zZXJ2bGV0LW1hcHBpbmcqLCBzZXNzaW9uLWNvbmZpZz8sIG1pbWUtbWFwcGluZyosIHdlbGNvbWUtZmlsZS1saXN0PywKLWVycm9yLXBhZ2UqLCB0YWdsaWIqLCByZXNvdXJjZS1lbnYtcmVmKiwgcmVzb3VyY2UtcmVmKiwgc2VjdXJpdHktY29uc3RyYWludCosCi1sb2dpbi1jb25maWc/LCBzZWN1cml0eS1yb2xlKiwgZW52LWVudHJ5KiwgZWpiLXJlZiosICBlamItbG9jYWwtcmVmKik+Ci0KLTwhLS0KLVRoZSBhdXRoLWNvbnN0cmFpbnQgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHVzZXIgcm9sZXMgdGhhdCBzaG91bGQKLWJlIHBlcm1pdHRlZCBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZSBjb2xsZWN0aW9uLiBUaGUgcm9sZS1uYW1lCi11c2VkIGhlcmUgbXVzdCBlaXRoZXIgY29ycmVzcG9uZCB0byB0aGUgcm9sZS1uYW1lIG9mIG9uZSBvZiB0aGUKLXNlY3VyaXR5LXJvbGUgZWxlbWVudHMgZGVmaW5lZCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIG9yIGJlCi10aGUgc3BlY2lhbGx5IHJlc2VydmVkIHJvbGUtbmFtZSAiKiIgdGhhdCBpcyBhIGNvbXBhY3Qgc3ludGF4IGZvcgotaW5kaWNhdGluZyBhbGwgcm9sZXMgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gSWYgYm90aCAiKiIgYW5kCi1yb2xlbmFtZXMgYXBwZWFyLCB0aGUgY29udGFpbmVyIGludGVycHJldHMgdGhpcyBhcyBhbGwgcm9sZXMuCi1JZiBubyByb2xlcyBhcmUgZGVmaW5lZCwgbm8gdXNlciBpcyBhbGxvd2VkIGFjY2VzcyB0byB0aGUgcG9ydGlvbiBvZgotdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXNjcmliZWQgYnkgdGhlIGNvbnRhaW5pbmcgc2VjdXJpdHktY29uc3RyYWludC4KLVRoZSBjb250YWluZXIgbWF0Y2hlcyByb2xlIG5hbWVzIGNhc2Ugc2Vuc2l0aXZlbHkgd2hlbiBkZXRlcm1pbmluZwotYWNjZXNzLgotCi0KLVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLS0tPgotPCFFTEVNRU5UIGF1dGgtY29uc3RyYWludCAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUqKT4KLQotPCEtLQotVGhlIGF1dGgtbWV0aG9kIGVsZW1lbnQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCi1tZWNoYW5pc20gZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24uIEFzIGEgcHJlcmVxdWlzaXRlIHRvIGdhaW5pbmcgYWNjZXNzIHRvIGFueSB3ZWIgcmVzb3VyY2VzIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkgYW4gYXV0aG9yaXphdGlvbgotY29uc3RyYWludCwgYSB1c2VyIG11c3QgaGF2ZSBhdXRoZW50aWNhdGVkIHVzaW5nIHRoZSBjb25maWd1cmVkCi1tZWNoYW5pc20uIExlZ2FsIHZhbHVlcyBmb3IgdGhpcyBlbGVtZW50IGFyZSAiQkFTSUMiLCAiRElHRVNUIiwKLSJGT1JNIiwgb3IgIkNMSUVOVC1DRVJUIi4KLQotVXNlZCBpbjogbG9naW4tY29uZmlnCi0tLT4KLTwhRUxFTUVOVCBhdXRoLW1ldGhvZCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBjb250ZXh0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgd2ViCi1hcHBsaWNhdGlvbidzIHNlcnZsZXQgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBjb250ZXh0LXBhcmFtIChwYXJhbS1uYW1lLCBwYXJhbS12YWx1ZSwgZGVzY3JpcHRpb24/KT4KLQotPCEtLQotVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50Ci1lbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQKLXRoZSB3ZWIgYXBwbGljYXRpb24gd2FyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YKLXRoZSB3ZWIgYXBwbGljYXRpb24gd2FyIGZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzCi11c2VkIGJ5IHRoZSB3ZWIgYXBwbGljYXRpb24gd2FyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbgotd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4KLQotVXNlZCBpbjogYXV0aC1jb25zdHJhaW50LCBjb250ZXh0LXBhcmFtLCBlamItbG9jYWwtcmVmLCBlamItcmVmLAotZW52LWVudHJ5LCBmaWx0ZXIsIGluaXQtcGFyYW0sIHJlc291cmNlLWVudi1yZWYsIHJlc291cmNlLXJlZiwgcnVuLWFzLAotc2VjdXJpdHktcm9sZSwgc2VjdXJpdHktcm9sZS1yZWYsIHNlcnZsZXQsIHVzZXItZGF0YS1jb25zdHJhaW50LAotd2ViLWFwcCwgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24KLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi1kaXNwbGF5ZWQgYnkgdG9vbHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KLQotVXNlZCBpbjogZmlsdGVyLCBzZWN1cml0eS1jb25zdHJhaW50LCBzZXJ2bGV0LCB3ZWItYXBwCi0KLUV4YW1wbGU6Ci0KLTxkaXNwbGF5LW5hbWU+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGlzdHJpYnV0YWJsZSBlbGVtZW50LCBieSBpdHMgcHJlc2VuY2UgaW4gYSB3ZWIgYXBwbGljYXRpb24KLWRlcGxveW1lbnQgZGVzY3JpcHRvciwgaW5kaWNhdGVzIHRoYXQgdGhpcyB3ZWIgYXBwbGljYXRpb24gaXMKLXByb2dyYW1tZWQgYXBwcm9wcmlhdGVseSB0byBiZSBkZXBsb3llZCBpbnRvIGEgZGlzdHJpYnV0ZWQgc2VydmxldAotY29udGFpbmVyCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIGRpc3RyaWJ1dGFibGUgRU1QVFk+Ci0KLTwhLS0KLVRoZSBlamItbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGVqYi1yZWYgb3IgZWpiLWxvY2FsLXJlZgotZWxlbWVudHMgdG8gc3BlY2lmeSB0aGF0IGFuIEVKQiByZWZlcmVuY2UgaXMgbGlua2VkIHRvIGFuCi1lbnRlcnByaXNlIGJlYW4uCi0KLVRoZSBuYW1lIGluIHRoZSBlamItbGluayBlbGVtZW50IGlzIGNvbXBvc2VkIG9mIGEKLXBhdGggbmFtZSBzcGVjaWZ5aW5nIHRoZSBlamItamFyIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZQotYmVhbiB3aXRoIHRoZSBlamItbmFtZSBvZiB0aGUgdGFyZ2V0IGJlYW4gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tCi10aGUgcGF0aCBuYW1lIGJ5ICIjIi4gIFRoZSBwYXRoIG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIHdhciBmaWxlCi1jb250YWluaW5nIHRoZSB3ZWIgYXBwbGljYXRpb24gdGhhdCBpcyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuLgotVGhpcyBhbGxvd3MgbXVsdGlwbGUgZW50ZXJwcmlzZSBiZWFucyB3aXRoIHRoZSBzYW1lIGVqYi1uYW1lIHRvIGJlCi11bmlxdWVseSBpZGVudGlmaWVkLgotCi1Vc2VkIGluOiBlamItbG9jYWwtcmVmLCBlamItcmVmCi0KLUV4YW1wbGVzOgotCi0JPGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC9lamItbGluaz4KLQotCTxlamItbGluaz4uLi9wcm9kdWN0cy9wcm9kdWN0LmphciNQcm9kdWN0RUpCPC9lamItbGluaz4KLQotLS0+Ci08IUVMRU1FTlQgZWpiLWxpbmsgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLWxvY2FsLXJlZiBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0bwotYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCS0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24KLQkgIHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLQktIHRoZSBleHBlY3RlZCBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9mIHRoZSByZWZlcmVuY2VkCi0JICBlbnRlcnByaXNlIGJlYW4KLQktIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlZmVyZW5jZWQKLQkgIGVudGVycHJpc2UgYmVhbgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBlamItbG9jYWwtcmVmIChkZXNjcmlwdGlvbj8sIGVqYi1yZWYtbmFtZSwgZWpiLXJlZi10eXBlLAotCQlsb2NhbC1ob21lLCBsb2NhbCwgZWpiLWxpbms/KT4KLQotPCEtLQotVGhlIGVqYi1yZWYgZWxlbWVudCBpcyB1c2VkIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8KLWFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCS0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQktIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZgotCSAgdGhlIHdlYiBhcHBsaWNhdGlvbiB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbgotCS0gdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0JLSB0aGUgZXhwZWN0ZWQgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQKLQkgIGVudGVycHJpc2UgYmVhbgotCS0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZAotCSAgZW50ZXJwcmlzZSBiZWFuCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYgKGRlc2NyaXB0aW9uPywgZWpiLXJlZi1uYW1lLCBlamItcmVmLXR5cGUsCi0JCWhvbWUsIHJlbW90ZSwgZWpiLWxpbms/KT4KLQotPCEtLQotVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQiByZWZlcmVuY2UuIFRoZQotRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgYW5kIGlzCi1yZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLXdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi1JdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLVVzZWQgaW46IGVqYi1sb2NhbC1yZWYsIGVqYi1yZWYKLQotRXhhbXBsZToKLQotPGVqYi1yZWYtbmFtZT5lamIvUGF5cm9sbDwvZWpiLXJlZi1uYW1lPgotLS0+Ci08IUVMRU1FTlQgZWpiLXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZQotcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uCi0KLVRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0JPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLQk8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLQotVXNlZCBpbjogZWpiLWxvY2FsLXJlZiwgZWpiLXJlZgotLS0+Ci08IUVMRU1FTlQgZWpiLXJlZi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHdlYiBhcHBsaWNhdGlvbidzCi1lbnZpcm9ubWVudCBlbnRyeS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4gb3B0aW9uYWwKLXZhbHVlLiAgSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLCBvbmUgbXVzdCBiZSBzdXBwbGllZAotZHVyaW5nIGRlcGxveW1lbnQuCi0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnkgKGRlc2NyaXB0aW9uPywgZW52LWVudHJ5LW5hbWUsIGVudi1lbnRyeS12YWx1ZT8sCi1lbnYtZW50cnktdHlwZSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgd2ViIGFwcGxpY2F0aW9ucydzCi1lbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi1FeGFtcGxlOgotCi08ZW52LWVudHJ5LW5hbWU+bWluQW1vdW50PC9lbnYtZW50cnktbmFtZT4KLQotVXNlZCBpbjogZW52LWVudHJ5Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mCi10aGUgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MKLWNvZGUuCi0KLVRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgZW52LWVudHJ5LXR5cGU6Ci0KLQlqYXZhLmxhbmcuQm9vbGVhbgotCWphdmEubGFuZy5CeXRlCi0JamF2YS5sYW5nLkNoYXJhY3RlcgotCWphdmEubGFuZy5TdHJpbmcKLQlqYXZhLmxhbmcuU2hvcnQKLQlqYXZhLmxhbmcuSW50ZWdlcgotCWphdmEubGFuZy5Mb25nCi0JamF2YS5sYW5nLkZsb2F0Ci0JamF2YS5sYW5nLkRvdWJsZQotCi1Vc2VkIGluOiBlbnYtZW50cnkKLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIHdlYiBhcHBsaWNhdGlvbidzCi1lbnZpcm9ubWVudCBlbnRyeS4gVGhlIHZhbHVlIG11c3QgYmUgYSBTdHJpbmcgdGhhdCBpcyB2YWxpZCBmb3IgdGhlCi1jb25zdHJ1Y3RvciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgdGhhdCB0YWtlcyBhIHNpbmdsZSBTdHJpbmcKLXBhcmFtZXRlciwgb3IgZm9yIGphdmEubGFuZy5DaGFyYWN0ZXIsIGEgc2luZ2xlIGNoYXJhY3Rlci4KLQotRXhhbXBsZToKLQotPGVudi1lbnRyeS12YWx1ZT4xMDAuMDA8L2Vudi1lbnRyeS12YWx1ZT4KLQotVXNlZCBpbjogZW52LWVudHJ5Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZXJyb3ItY29kZSBjb250YWlucyBhbiBIVFRQIGVycm9yIGNvZGUsIGV4OiA0MDQKLQotVXNlZCBpbjogZXJyb3ItcGFnZQotLS0+Ci08IUVMRU1FTlQgZXJyb3ItY29kZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlcnJvci1wYWdlIGVsZW1lbnQgY29udGFpbnMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXJyb3IgY29kZQotb3IgZXhjZXB0aW9uIHR5cGUgdG8gdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIGVycm9yLXBhZ2UgKChlcnJvci1jb2RlIHwgZXhjZXB0aW9uLXR5cGUpLCBsb2NhdGlvbik+Ci0KLTwhLS0KLVRoZSBleGNlcHRpb24gdHlwZSBjb250YWlucyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEKLUphdmEgZXhjZXB0aW9uIHR5cGUuCi0KLVVzZWQgaW46IGVycm9yLXBhZ2UKLS0tPgotPCFFTEVNRU5UIGV4Y2VwdGlvbi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4KLWV4dGVuc2lvbi4gZXhhbXBsZTogInR4dCIKLQotVXNlZCBpbjogbWltZS1tYXBwaW5nCi0tLT4KLTwhRUxFTUVOVCBleHRlbnNpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1EZWNsYXJlcyBhIGZpbHRlciBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBUaGUgZmlsdGVyIGlzIG1hcHBlZCB0bwotZWl0aGVyIGEgc2VydmxldCBvciBhIFVSTCBwYXR0ZXJuIGluIHRoZSBmaWx0ZXItbWFwcGluZyBlbGVtZW50LCB1c2luZwotdGhlIGZpbHRlci1uYW1lIHZhbHVlIHRvIHJlZmVyZW5jZS4gRmlsdGVycyBjYW4gYWNjZXNzIHRoZQotaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGF0Ci1ydW50aW1lIHZpYSB0aGUgRmlsdGVyQ29uZmlnIGludGVyZmFjZS4KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgZmlsdGVyIChpY29uPywgZmlsdGVyLW5hbWUsIGRpc3BsYXktbmFtZT8sIGRlc2NyaXB0aW9uPywKLWZpbHRlci1jbGFzcywgaW5pdC1wYXJhbSopPgotCi08IS0tCi1UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZmlsdGVyLgotCi1Vc2VkIGluOiBmaWx0ZXIKLS0tPgotPCFFTEVNRU5UIGZpbHRlci1jbGFzcyAoI1BDREFUQSk+Ci0KLTwhLS0KLURlY2xhcmF0aW9uIG9mIHRoZSBmaWx0ZXIgbWFwcGluZ3MgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZQotY29udGFpbmVyIHVzZXMgdGhlIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0byBkZWNpZGUgd2hpY2ggZmlsdGVycwotdG8gYXBwbHkgdG8gYSByZXF1ZXN0LCBhbmQgaW4gd2hhdCBvcmRlci4gVGhlIGNvbnRhaW5lciBtYXRjaGVzIHRoZQotcmVxdWVzdCBVUkkgdG8gYSBTZXJ2bGV0IGluIHRoZSBub3JtYWwgd2F5LiBUbyBkZXRlcm1pbmUgd2hpY2ggZmlsdGVycwotdG8gYXBwbHkgaXQgbWF0Y2hlcyBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgZWl0aGVyIG9uIHNlcnZsZXQtbmFtZSwKLW9yIG9uIHVybC1wYXR0ZXJuIGZvciBlYWNoIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIGRlcGVuZGluZyBvbiB3aGljaAotc3R5bGUgaXMgdXNlZC4gVGhlIG9yZGVyIGluIHdoaWNoIGZpbHRlcnMgYXJlIGludm9rZWQgaXMgdGhlIG9yZGVyIGluCi13aGljaCBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdGhhdCBtYXRjaCBhIHJlcXVlc3QgVVJJIGZvciBhCi1zZXJ2bGV0IGFwcGVhciBpbiB0aGUgbGlzdCBvZiBmaWx0ZXItbWFwcGluZyBlbGVtZW50cy5UaGUgZmlsdGVyLW5hbWUKLXZhbHVlIG11c3QgYmUgdGhlIHZhbHVlIG9mIHRoZSA8ZmlsdGVyLW5hbWU+IHN1Yi1lbGVtZW50cyBvZiBvbmUgb2YgdGhlCi08ZmlsdGVyPiBkZWNsYXJhdGlvbnMgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgZmlsdGVyLW1hcHBpbmcgKGZpbHRlci1uYW1lLCAodXJsLXBhdHRlcm4gfCBzZXJ2bGV0LW5hbWUpKT4KLQotPCEtLQotVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZmlsdGVyLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBtYXAgdGhlIGZpbHRlci4KLUVhY2ggZmlsdGVyIG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi1Vc2VkIGluOiBmaWx0ZXIsIGZpbHRlci1tYXBwaW5nCi0tLT4KLTwhRUxFTUVOVCBmaWx0ZXItbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBmb3JtLWVycm9yLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViIGFwcAotd2hlcmUgdGhlIGVycm9yIHBhZ2UgdGhhdCBpcyBkaXNwbGF5ZWQgd2hlbiBsb2dpbiBpcyBub3Qgc3VjY2Vzc2Z1bAotY2FuIGJlIGZvdW5kLiBUaGUgcGF0aCBiZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMgaW50ZXJwcmV0ZWQKLXJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuCi0KLVVzZWQgaW46IGZvcm0tbG9naW4tY29uZmlnCi0tLT4KLTwhRUxFTUVOVCBmb3JtLWVycm9yLXBhZ2UgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZm9ybS1sb2dpbi1jb25maWcgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxvZ2luIGFuZCBlcnJvciBwYWdlcwotdGhhdCBzaG91bGQgYmUgdXNlZCBpbiBmb3JtIGJhc2VkIGxvZ2luLiBJZiBmb3JtIGJhc2VkIGF1dGhlbnRpY2F0aW9uCi1pcyBub3QgdXNlZCwgdGhlc2UgZWxlbWVudHMgYXJlIGlnbm9yZWQuCi0KLVVzZWQgaW46IGxvZ2luLWNvbmZpZwotLS0+Ci08IUVMRU1FTlQgZm9ybS1sb2dpbi1jb25maWcgKGZvcm0tbG9naW4tcGFnZSwgZm9ybS1lcnJvci1wYWdlKT4KLQotPCEtLQotVGhlIGZvcm0tbG9naW4tcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIgYXBwCi13aGVyZSB0aGUgcGFnZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBsb2dpbiBjYW4gYmUgZm91bmQuIFRoZSBwYXRoCi1iZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KLQotVXNlZCBpbjogZm9ybS1sb2dpbi1jb25maWcKLS0tPgotPCFFTEVNRU5UIGZvcm0tbG9naW4tcGFnZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlCi1iZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IGVqYi1yZWYKLQotRXhhbXBsZToKLQotPGhvbWU+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEhvbWU8L2hvbWU+Ci0tLT4KLTwhRUxFTUVOVCBob21lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGh0dHAtbWV0aG9kIGNvbnRhaW5zIGFuIEhUVFAgbWV0aG9kIChHRVQgfCBQT1NUIHwuLi4pLgotCi1Vc2VkIGluOiB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbgotLS0+Ci08IUVMRU1FTlQgaHR0cC1tZXRob2QgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaWNvbiBlbGVtZW50IGNvbnRhaW5zIHNtYWxsLWljb24gYW5kIGxhcmdlLWljb24gZWxlbWVudHMgdGhhdAotc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGEgbGFyZ2UgR0lGIG9yIEpQRUcgaWNvbiBpbWFnZXMKLXVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhIEdVSSB0b29sLgotCi1Vc2VkIGluOiBmaWx0ZXIsIHNlcnZsZXQsIHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIGljb24gKHNtYWxsLWljb24/LCBsYXJnZS1pY29uPyk+Ci0KLTwhLS0KLVRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMgYW4KLWluaXRpYWxpemF0aW9uIHBhcmFtIG9mIHRoZSBzZXJ2bGV0Ci0KLVVzZWQgaW46IGZpbHRlciwgc2VydmxldAotLS0+Ci08IUVMRU1FTlQgaW5pdC1wYXJhbSAocGFyYW0tbmFtZSwgcGFyYW0tdmFsdWUsIGRlc2NyaXB0aW9uPyk+Ci0KLTwhLS0KLVRoZSBqc3AtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxsIHBhdGggdG8gYSBKU1AgZmlsZSB3aXRoaW4KLXRoZSB3ZWIgYXBwbGljYXRpb24gYmVnaW5uaW5nIHdpdGggYSBgLycuCi0KLVVzZWQgaW46IHNlcnZsZXQKLS0tPgotPCFFTEVNRU5UIGpzcC1maWxlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLWNvbnRhaW5pbmcgYSBsYXJnZSAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKLW5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MKLXdhciBmaWxlLgotCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGljb24KLQotRXhhbXBsZToKLQotPGxhcmdlLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMzJ4MzIuanBnPC9sYXJnZS1pY29uPgotLS0+Ci08IUVMRU1FTlQgbGFyZ2UtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBsaXN0ZW5lciBlbGVtZW50IGluZGljYXRlcyB0aGUgZGVwbG95bWVudCBwcm9wZXJ0aWVzIGZvciBhIHdlYgotYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgbGlzdGVuZXIgKGxpc3RlbmVyLWNsYXNzKT4KLQotPCEtLQotVGhlIGxpc3RlbmVyLWNsYXNzIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGFzcyBpbiB0aGUgYXBwbGljYXRpb24gbXVzdCBiZQotcmVnaXN0ZXJlZCBhcyBhIHdlYiBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLiBUaGUgdmFsdWUgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGxpc3RlbmVyIGNsYXNzLgotCi0KLVVzZWQgaW46IGxpc3RlbmVyCi0tLT4KLTwhRUxFTUVOVCBsaXN0ZW5lci1jbGFzcyAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHNlcnZsZXQgc2hvdWxkIGJlCi1sb2FkZWQgKGluc3RhbnRpYXRlZCBhbmQgaGF2ZSBpdHMgaW5pdCgpIGNhbGxlZCkgb24gdGhlIHN0YXJ0dXAKLW9mIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSBvcHRpb25hbCBjb250ZW50cyBvZgotdGhlc2UgZWxlbWVudCBtdXN0IGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3JkZXIgaW4gd2hpY2gKLXRoZSBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQuIElmIHRoZSB2YWx1ZSBpcyBhIG5lZ2F0aXZlIGludGVnZXIsCi1vciB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudCwgdGhlIGNvbnRhaW5lciBpcyBmcmVlIHRvIGxvYWQgdGhlCi1zZXJ2bGV0IHdoZW5ldmVyIGl0IGNob29zZXMuIElmIHRoZSB2YWx1ZSBpcyBhIHBvc2l0aXZlIGludGVnZXIKLW9yIDAsIHRoZSBjb250YWluZXIgbXVzdCBsb2FkIGFuZCBpbml0aWFsaXplIHRoZSBzZXJ2bGV0IGFzIHRoZQotYXBwbGljYXRpb24gaXMgZGVwbG95ZWQuIFRoZSBjb250YWluZXIgbXVzdCBndWFyYW50ZWUgdGhhdAotc2VydmxldHMgbWFya2VkIHdpdGggbG93ZXIgaW50ZWdlcnMgYXJlIGxvYWRlZCBiZWZvcmUgc2VydmxldHMKLW1hcmtlZCB3aXRoIGhpZ2hlciBpbnRlZ2Vycy4gVGhlIGNvbnRhaW5lciBtYXkgY2hvb3NlIHRoZSBvcmRlcgotb2YgbG9hZGluZyBvZiBzZXJ2bGV0cyB3aXRoIHRoZSBzYW1lIGxvYWQtb24tc3RhcnQtdXAgdmFsdWUuCi0KLVVzZWQgaW46IHNlcnZsZXQKLS0tPgotPCFFTEVNRU5UIGxvYWQtb24tc3RhcnR1cCAoI1BDREFUQSk+Ci0KLTwhLS0KLQotVGhlIGxvY2FsIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZQotZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItbG9jYWwtcmVmCi0KLS0tPgotPCFFTEVNRU5UIGxvY2FsICgjUENEQVRBKT4KLQotPCEtLQotCi1UaGUgbG9jYWwtaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUKLWVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItbG9jYWwtcmVmCi0tLT4KLTwhRUxFTUVOVCBsb2NhbC1ob21lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBpbiB0aGUgd2ViCi1hcHBsaWNhdGlvbiByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBUaGUgdmFsdWUgb2YKLXRoZSBsb2NhdGlvbiBtdXN0IGhhdmUgYSBsZWFkaW5nIGAvJy4KLQotVXNlZCBpbjogZXJyb3ItcGFnZQotLS0+Ci08IUVMRU1FTlQgbG9jYXRpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbG9naW4tY29uZmlnIGVsZW1lbnQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCi1tZXRob2QgdGhhdCBzaG91bGQgYmUgdXNlZCwgdGhlIHJlYWxtIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IKLXRoaXMgYXBwbGljYXRpb24sIGFuZCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZSBuZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4KLW1lY2hhbmlzbS4KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgbG9naW4tY29uZmlnIChhdXRoLW1ldGhvZD8sIHJlYWxtLW5hbWU/LCBmb3JtLWxvZ2luLWNvbmZpZz8pPgotCi08IS0tCi1UaGUgbWltZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBleHRlbnNpb24KLWFuZCBhIG1pbWUgdHlwZS4KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgbWltZS1tYXBwaW5nIChleHRlbnNpb24sIG1pbWUtdHlwZSk+Ci0KLTwhLS0KLVRoZSBtaW1lLXR5cGUgZWxlbWVudCBjb250YWlucyBhIGRlZmluZWQgbWltZSB0eXBlLiBleGFtcGxlOgotInRleHQvcGxhaW4iCi0KLVVzZWQgaW46IG1pbWUtbWFwcGluZwotLS0+Ci08IUVMRU1FTlQgbWltZS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4gRWFjaCBwYXJhbWV0ZXIKLW5hbWUgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotCi1Vc2VkIGluOiBjb250ZXh0LXBhcmFtLCBpbml0LXBhcmFtCi0tLT4KLTwhRUxFTUVOVCBwYXJhbS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLgotCi1Vc2VkIGluOiBjb250ZXh0LXBhcmFtLCBpbml0LXBhcmFtCi0tLT4KLTwhRUxFTUVOVCBwYXJhbS12YWx1ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZWFsbSBuYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSByZWFsbSBuYW1lIHRvIHVzZSBpbiBIVFRQCi1CYXNpYyBhdXRob3JpemF0aW9uLgotCi1Vc2VkIGluOiBsb2dpbi1jb25maWcKLS0tPgotPCFFTEVNRU5UIHJlYWxtLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlCi1iZWFuJ3MgcmVtb3RlIGludGVyZmFjZS4KLQotVXNlZCBpbjogZWpiLXJlZgotCi1FeGFtcGxlOgotCi08cmVtb3RlPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2U8L3JlbW90ZT4KLS0tPgotPCFFTEVNRU5UIHJlbW90ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtYXV0aCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSB3ZWIgYXBwbGljYXRpb24gY29kZSBzaWducwotb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3Igd2hldGhlciB0aGUgQ29udGFpbmVyCi13aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIgb24gYmVoYWxmIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uIEluIHRoZQotbGF0dGVyIGNhc2UsIHRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZQotRGVwbG95ZXIuCi0KLVRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQk8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotCTxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy1hdXRoICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIHJlc291cmNlIG1hbmFnZXIKLWNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLWphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXNoYXJpbmctc2NvcGUgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucyBvYnRhaW5lZAotdGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZQotc2hhcmVkLiBUaGUgdmFsdWUgb2YgdGhpcyBlbGVtZW50LCBpZiBzcGVjaWZpZWQsIG11c3QgYmUgb25lIG9mIHRoZQotdHdvIGZvbGxvd2luZzoKLQotCTxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotCTxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0KLVRoZSBkZWZhdWx0IHZhbHVlIGlzIFNoYXJlYWJsZS4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtc2hhcmluZy1zY29wZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YSBzb3VyY2UuIFRoZSB0eXBlCi1pcyBzcGVjaWZpZWQgYnkgdGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yIGludGVyZmFjZQotZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRhdGEgc291cmNlLgotCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLWVudi1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3MKLXJlZmVyZW5jZSB0byBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlCi1pbiB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgbmFtZSwgYW5kIGFuCi1pbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZSBleHBlY3RlZCBieQotdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLUV4YW1wbGU6Ci0KLTxyZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+am1zL1N0b2NrUXVldWU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmF4Lmptcy5RdWV1ZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotPC9yZXNvdXJjZS1lbnYtcmVmPgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtZW52LXJlZiAoZGVzY3JpcHRpb24/LCByZXNvdXJjZS1lbnYtcmVmLW5hbWUsCi0JCXJlc291cmNlLWVudi1yZWYtdHlwZSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSByZXNvdXJjZQotZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi1qYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotVXNlZCBpbjogcmVzb3VyY2UtZW52LXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtZW52LXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLWVudi1yZWYtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBhIHJlc291cmNlCi1lbnZpcm9ubWVudCByZWZlcmVuY2UuICBJdCBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhCi1sYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IHJlc291cmNlLWVudi1yZWYKLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLWVudi1yZWYtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3MKLXJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLWRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUsCi10aGUgaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZQotZXhwZWN0ZWQgYnkgdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlLCB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbgotKEFwcGxpY2F0aW9uIG9yIENvbnRhaW5lciksIGFuZCBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZQotc2hhcmVhYmlsaXR5IG9mIGNvbm5lY3Rpb25zIG9idGFpbmVkIGZyb20gdGhlIHJlc291cmNlIChTaGFyZWFibGUgb3IKLVVuc2hhcmVhYmxlKS4KLQotVXNlZCBpbjogd2ViLWFwcAotCi1FeGFtcGxlOgotCi0gICAgPHJlc291cmNlLXJlZj4KLQk8cmVzLXJlZi1uYW1lPmpkYmMvRW1wbG95ZWVBcHBEQjwvcmVzLXJlZi1uYW1lPgotCTxyZXMtdHlwZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvcmVzLXR5cGU+Ci0JPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0JPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0tLT4KLTwhRUxFTUVOVCByZXNvdXJjZS1yZWYgKGRlc2NyaXB0aW9uPywgcmVzLXJlZi1uYW1lLCByZXMtdHlwZSwgcmVzLWF1dGgsCi0JCXJlcy1zaGFyaW5nLXNjb3BlPyk+Ci0KLTwhLS0KLVRoZSByb2xlLWxpbmsgZWxlbWVudCBpcyBhIHJlZmVyZW5jZSB0byBhIGRlZmluZWQgc2VjdXJpdHkgcm9sZS4gVGhlCi1yb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4gdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcwotZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4KLQotVXNlZCBpbjogc2VjdXJpdHktcm9sZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJvbGUtbGluayAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLVRoZSBuYW1lIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYW4gTk1UT0tFTi4KLQotVXNlZCBpbjogYXV0aC1jb25zdHJhaW50LCBydW4tYXMsIHNlY3VyaXR5LXJvbGUsIHNlY3VyaXR5LXJvbGUtcmVmCi0tLT4KLTwhRUxFTUVOVCByb2xlLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcnVuLWFzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlCi1leGVjdXRpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZAotdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi1Vc2VkIGluOiBzZXJ2bGV0Ci0tLT4KLTwhRUxFTUVOVCBydW4tYXMgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKT4KLQotPCEtLQotVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBzZWN1cml0eQotY29uc3RyYWludHMgd2l0aCBvbmUgb3IgbW9yZSB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbnMKLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgc2VjdXJpdHktY29uc3RyYWludCAoZGlzcGxheS1uYW1lPywgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24rLAotYXV0aC1jb25zdHJhaW50PywgdXNlci1kYXRhLWNvbnN0cmFpbnQ/KT4KLQotPCEtLQotVGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNlY3VyaXR5Ci1yb2xlLiBUaGUgZGVmaW5pdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUKLXNlY3VyaXR5IHJvbGUsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLUV4YW1wbGU6Ci0KLSAgICA8c2VjdXJpdHktcm9sZT4KLQk8ZGVzY3JpcHRpb24+Ci0JICAgIFRoaXMgcm9sZSBpbmNsdWRlcyBhbGwgZW1wbG95ZWVzIHdobyBhcmUgYXV0aG9yaXplZAotCSAgICB0byBhY2Nlc3MgdGhlIGVtcGxveWVlIHNlcnZpY2UgYXBwbGljYXRpb24uCi0JPC9kZXNjcmlwdGlvbj4KLQk8cm9sZS1uYW1lPmVtcGxveWVlPC9yb2xlLW5hbWU+Ci0gICAgPC9zZWN1cml0eS1yb2xlPgotLS0+Ci08IUVMRU1FTlQgc2VjdXJpdHktcm9sZSAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUpPgotCi08IS0tCi1UaGUgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSBzZWN1cml0eQotcm9sZSByZWZlcmVuY2UgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbidzIGNvZGUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cwotb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSBzZWN1cml0eSByb2xlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSwKLWFuZCBhbiBvcHRpb25hbCBsaW5rIHRvIGEgc2VjdXJpdHkgcm9sZS4gSWYgdGhlIHNlY3VyaXR5IHJvbGUgaXMgbm90Ci1zcGVjaWZpZWQsIHRoZSBEZXBsb3llciBtdXN0IGNob29zZSBhbiBhcHByb3ByaWF0ZSBzZWN1cml0eSByb2xlLgotCi1UaGUgdmFsdWUgb2YgdGhlIHJvbGUtbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIFN0cmluZyB1c2VkIGFzIHRoZQotcGFyYW1ldGVyIHRvIHRoZSBFSkJDb250ZXh0LmlzQ2FsbGVySW5Sb2xlKFN0cmluZyByb2xlTmFtZSkgbWV0aG9kCi1vciB0aGUgSHR0cFNlcnZsZXRSZXF1ZXN0LmlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgbWV0aG9kLgotCi1Vc2VkIGluOiBzZXJ2bGV0Ci0KLS0tPgotPCFFTEVNRU5UIHNlY3VyaXR5LXJvbGUtcmVmIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSwgcm9sZS1saW5rPyk+Ci0KLTwhLS0KLVRoZSBzZXJ2bGV0IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aXZlIGRhdGEgb2YgYQotc2VydmxldC4gSWYgYSBqc3AtZmlsZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpcwotcHJlc2VudCwgdGhlbiB0aGUgSlNQIHNob3VsZCBiZSBwcmVjb21waWxlZCBhbmQgbG9hZGVkLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBzZXJ2bGV0IChpY29uPywgc2VydmxldC1uYW1lLCBkaXNwbGF5LW5hbWU/LCBkZXNjcmlwdGlvbj8sCi0oc2VydmxldC1jbGFzc3xqc3AtZmlsZSksIGluaXQtcGFyYW0qLCBsb2FkLW9uLXN0YXJ0dXA/LCBydW4tYXM/LCBzZWN1cml0eS1yb2xlLXJlZiopPgotCi08IS0tCi1UaGUgc2VydmxldC1jbGFzcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotb2YgdGhlIHNlcnZsZXQuCi0KLVVzZWQgaW46IHNlcnZsZXQKLS0tPgotPCFFTEVNRU5UIHNlcnZsZXQtY2xhc3MgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc2VydmxldC1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhIHNlcnZsZXQKLWFuZCBhIHVybCBwYXR0ZXJuCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIHNlcnZsZXQtbWFwcGluZyAoc2VydmxldC1uYW1lLCB1cmwtcGF0dGVybik+Ci0KLTwhLS0KLVRoZSBzZXJ2bGV0LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlCi1zZXJ2bGV0LiBFYWNoIHNlcnZsZXQgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLVVzZWQgaW46IGZpbHRlci1tYXBwaW5nLCBzZXJ2bGV0LCBzZXJ2bGV0LW1hcHBpbmcKLS0tPgotPCFFTEVNRU5UIHNlcnZsZXQtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzZXNzaW9uLWNvbmZpZyBlbGVtZW50IGRlZmluZXMgdGhlIHNlc3Npb24gcGFyYW1ldGVycyBmb3IKLXRoaXMgd2ViIGFwcGxpY2F0aW9uLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBzZXNzaW9uLWNvbmZpZyAoc2Vzc2lvbi10aW1lb3V0Pyk+Ci0KLTwhLS0KLVRoZSBzZXNzaW9uLXRpbWVvdXQgZWxlbWVudCBkZWZpbmVzIHRoZSBkZWZhdWx0IHNlc3Npb24gdGltZW91dAotaW50ZXJ2YWwgZm9yIGFsbCBzZXNzaW9ucyBjcmVhdGVkIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUKLXNwZWNpZmllZCB0aW1lb3V0IG11c3QgYmUgZXhwcmVzc2VkIGluIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuCi1JZiB0aGUgdGltZW91dCBpcyAwIG9yIGxlc3MsIHRoZSBjb250YWluZXIgZW5zdXJlcyB0aGUgZGVmYXVsdAotYmVoYXZpb3VyIG9mIHNlc3Npb25zIGlzIG5ldmVyIHRvIHRpbWUgb3V0LgotCi1Vc2VkIGluOiBzZXNzaW9uLWNvbmZpZwotLS0+Ci08IUVMRU1FTlQgc2Vzc2lvbi10aW1lb3V0ICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLWNvbnRhaW5pbmcgYSBzbWFsbCAoMTYgeCAxNikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKLW5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MKLXdhciBmaWxlLgotCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGljb24KLQotRXhhbXBsZToKLQotPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotLS0+Ci08IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB0YWdsaWIgZWxlbWVudCBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgSlNQIHRhZyBsaWJyYXJ5LgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCB0YWdsaWIgKHRhZ2xpYi11cmksIHRhZ2xpYi1sb2NhdGlvbik+Ci0KLTwhLS0KLXRoZSB0YWdsaWItbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gKGFzIGEgcmVzb3VyY2UKLXJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZwotTGliYXJ5IERlc2NyaXB0aW9uIGZpbGUgZm9yIHRoZSB0YWcgbGlicmFyeS4KLQotVXNlZCBpbjogdGFnbGliCi0tLT4KLTwhRUxFTUVOVCB0YWdsaWItbG9jYXRpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgdGFnbGliLXVyaSBlbGVtZW50IGRlc2NyaWJlcyBhIFVSSSwgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uCi1vZiB0aGUgd2ViLnhtbCBkb2N1bWVudCwgaWRlbnRpZnlpbmcgYSBUYWcgTGlicmFyeSB1c2VkIGluIHRoZSBXZWIKLUFwcGxpY2F0aW9uLgotCi1Vc2VkIGluOiB0YWdsaWIKLS0tPgotPCFFTEVNRU5UIHRhZ2xpYi11cmkgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgdHJhbnNwb3J0LWd1YXJhbnRlZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0IHRoZSBjb21tdW5pY2F0aW9uCi1iZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIHNob3VsZCBiZSBOT05FLCBJTlRFR1JBTCwgb3IKLUNPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFueQotdHJhbnNwb3J0IGd1YXJhbnRlZXMuIEEgdmFsdWUgb2YgSU5URUdSQUwgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24KLXJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgc2VudCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlciBiZSBzZW50IGluCi1zdWNoIGEgd2F5IHRoYXQgaXQgY2FuJ3QgYmUgY2hhbmdlZCBpbiB0cmFuc2l0LiBDT05GSURFTlRJQUwgbWVhbnMKLXRoYXQgdGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgYmUgdHJhbnNtaXR0ZWQgaW4gYQotZmFzaGlvbiB0aGF0IHByZXZlbnRzIG90aGVyIGVudGl0aWVzIGZyb20gb2JzZXJ2aW5nIHRoZSBjb250ZW50cyBvZgotdGhlIHRyYW5zbWlzc2lvbi4gSW4gbW9zdCBjYXNlcywgdGhlIHByZXNlbmNlIG9mIHRoZSBJTlRFR1JBTCBvcgotQ09ORklERU5USUFMIGZsYWcgd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSB1c2Ugb2YgU1NMIGlzIHJlcXVpcmVkLgotCi1Vc2VkIGluOiB1c2VyLWRhdGEtY29uc3RyYWludAotLS0+Ci08IUVMRU1FTlQgdHJhbnNwb3J0LWd1YXJhbnRlZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB1cmwtcGF0dGVybiBlbGVtZW50IGNvbnRhaW5zIHRoZSB1cmwgcGF0dGVybiBvZiB0aGUgbWFwcGluZy4gTXVzdAotZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMS4yIG9mIHRoZSBTZXJ2bGV0IEFQSQotU3BlY2lmaWNhdGlvbi4KLQotVXNlZCBpbjogZmlsdGVyLW1hcHBpbmcsIHNlcnZsZXQtbWFwcGluZywgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24KLS0tPgotPCFFTEVNRU5UIHVybC1wYXR0ZXJuICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHVzZXItZGF0YS1jb25zdHJhaW50IGVsZW1lbnQgaXMgdXNlZCB0byBpbmRpY2F0ZSBob3cgZGF0YQotY29tbXVuaWNhdGVkIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgY29udGFpbmVyIHNob3VsZCBiZSBwcm90ZWN0ZWQuCi0KLVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLS0tPgotPCFFTEVNRU5UIHVzZXItZGF0YS1jb25zdHJhaW50IChkZXNjcmlwdGlvbj8sIHRyYW5zcG9ydC1ndWFyYW50ZWUpPgotCi08IS0tCi1UaGUgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgc3Vic2V0Ci1vZiB0aGUgcmVzb3VyY2VzIGFuZCBIVFRQIG1ldGhvZHMgb24gdGhvc2UgcmVzb3VyY2VzIHdpdGhpbiBhIHdlYgotYXBwbGljYXRpb24gdG8gd2hpY2ggYSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMuIElmIG5vIEhUVFAgbWV0aG9kcwotYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzIHRvIGFsbCBIVFRQCi1tZXRob2RzLgotCi1Vc2VkIGluOiBzZWN1cml0eS1jb25zdHJhaW50Ci0tLT4KLTwhRUxFTUVOVCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiAod2ViLXJlc291cmNlLW5hbWUsIGRlc2NyaXB0aW9uPywKLXVybC1wYXR0ZXJuKiwgaHR0cC1tZXRob2QqKT4KLQotPCEtLQotVGhlIHdlYi1yZXNvdXJjZS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoaXMgd2ViIHJlc291cmNlCi1jb2xsZWN0aW9uLgotCi1Vc2VkIGluOiB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbgotLS0+Ci08IUVMRU1FTlQgd2ViLXJlc291cmNlLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgd2VsY29tZS1maWxlIGVsZW1lbnQgY29udGFpbnMgZmlsZSBuYW1lIHRvIHVzZSBhcyBhIGRlZmF1bHQKLXdlbGNvbWUgZmlsZSwgc3VjaCBhcyBpbmRleC5odG1sCi0KLVVzZWQgaW46IHdlbGNvbWUtZmlsZS1saXN0Ci0tLT4KLTwhRUxFTUVOVCB3ZWxjb21lLWZpbGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgd2VsY29tZS1maWxlLWxpc3QgY29udGFpbnMgYW4gb3JkZXJlZCBsaXN0IG9mIHdlbGNvbWUgZmlsZXMKLWVsZW1lbnRzLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCB3ZWxjb21lLWZpbGUtbGlzdCAod2VsY29tZS1maWxlKyk+Ci0KLTwhLS0KLVRoZSBJRCBtZWNoYW5pc20gaXMgdG8gYWxsb3cgdG9vbHMgdGhhdCBwcm9kdWNlIGFkZGl0aW9uYWwgZGVwbG95bWVudAotaW5mb3JtYXRpb24gKGkuZS4sIGluZm9ybWF0aW9uIGJleW9uZCB0aGUgc3RhbmRhcmQgZGVwbG95bWVudAotZGVzY3JpcHRvciBpbmZvcm1hdGlvbikgdG8gc3RvcmUgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbiBhCi1zZXBhcmF0ZSBmaWxlLCBhbmQgZWFzaWx5IHJlZmVyIGZyb20gdGhlc2UgdG9vbC1zcGVjaWZpYyBmaWxlcyB0byB0aGUKLWluZm9ybWF0aW9uIGluIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLVRvb2xzIGFyZSBub3QgYWxsb3dlZCB0byBhZGQgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbnRvIHRoZQotc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotLS0+Ci0KLTwhQVRUTElTVCBhdXRoLWNvbnN0cmFpbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXV0aC1tZXRob2QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udGV4dC1wYXJhbSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGlzdHJpYnV0YWJsZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItbGluayBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItbG9jYWwtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LXZhbHVlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVycm9yLWNvZGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZXJyb3ItcGFnZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBleGNlcHRpb24tdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBleHRlbnNpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmlsdGVyIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZpbHRlci1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmaWx0ZXItbWFwcGluZyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmaWx0ZXItbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmb3JtLWVycm9yLXBhZ2UgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZm9ybS1sb2dpbi1jb25maWcgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZm9ybS1sb2dpbi1wYWdlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGhvbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaHR0cC1tZXRob2QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBpbml0LXBhcmFtIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGpzcC1maWxlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxhcmdlLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGlzdGVuZXIgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGlzdGVuZXItY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbG9hZC1vbi1zdGFydHVwIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxvY2FsIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxvY2FsLWhvbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbG9jYXRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbG9naW4tY29uZmlnIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1pbWUtbWFwcGluZyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtaW1lLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcGFyYW0tbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwYXJhbS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWFsbS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbW90ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtYXV0aCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLXNoYXJpbmctc2NvcGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtZW52LXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1lbnYtcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtZW52LXJlZi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByb2xlLWxpbmsgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgcm9sZS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJ1bi1hcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZWN1cml0eS1jb25zdHJhaW50IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LXJvbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktcm9sZS1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VydmxldCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXJ2bGV0LWNsYXNzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlcnZsZXQtbWFwcGluZyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXJ2bGV0LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2Vzc2lvbi1jb25maWcgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2Vzc2lvbi10aW1lb3V0IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNtYWxsLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdGFnbGliIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRhZ2xpYi1sb2NhdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0YWdsaWItdXJpIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRyYW5zcG9ydC1ndWFyYW50ZWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdXJsLXBhdHRlcm4gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdXNlci1kYXRhLWNvbnN0cmFpbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgd2ViLWFwcCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWItcmVzb3VyY2UtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWxjb21lLWZpbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgd2VsY29tZS1maWxlLWxpc3QgaWQgSUQgI0lNUExJRUQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl80LnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWEyNTEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMi40Ij4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIyl3ZWItYXBwXzJfNC54c2RzCTEuNjAgMDMvMDgvMjYKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDA0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotICAgICAgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVsKLQotCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBTZXJ2bGV0IDIuNCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0JVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkICJXRUItSU5GL3dlYi54bWwiIGluIHRoZQotCXdlYiBhcHBsaWNhdGlvbidzIHdhciBmaWxlLiAgQWxsIFNlcnZsZXQgZGVwbG95bWVudCBkZXNjcmlwdG9ycwotCW11c3QgaW5kaWNhdGUgdGhlIHdlYiBhcHBsaWNhdGlvbiBzY2hlbWEgYnkgdXNpbmcgdGhlIEoyRUUKLQluYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0KLQlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iLi4uIgotCSAgICAgIHZlcnNpb249IjIuNCI+Ci0JICAgICAgLi4uCi0JICAgIDwvd2ViLWFwcD4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotCXRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIEoyRUUKLQluYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QKLQotCV1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0gICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0Jc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLQlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLQlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImoyZWVfMV80LnhzZCIvPgotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImpzcF8yXzAueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLSAgPHhzZDplbGVtZW50IG5hbWU9IndlYi1hcHAiIHR5cGU9ImoyZWU6d2ViLWFwcFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3ZWItYXBwIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQKLQlkZXNjcmlwdG9yIGZvciBhIHdlYiBhcHBsaWNhdGlvbi4gIE5vdGUgdGhhdCB0aGUgc3ViLWVsZW1lbnRzCi0Jb2YgdGhpcyBlbGVtZW50IGNhbiBiZSBpbiB0aGUgYXJiaXRyYXJ5IG9yZGVyLiBCZWNhdXNlIG9mCi0JdGhhdCwgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgZWxlbWVudHMgb2YgZGlzdHJpYnV0YWJsZSwKLQlzZXNzaW9uLWNvbmZpZywgd2VsY29tZS1maWxlLWxpc3QsIGpzcC1jb25maWcsIGxvZ2luLWNvbmZpZywKLQlhbmQgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCB3YXMgY2hhbmdlZCBmcm9tICI/IiB0byAiKiIKLQlpbiB0aGlzIHNjaGVtYS4gIEhvd2V2ZXIsIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaW5zdGFuY2UKLQlmaWxlIG11c3Qgbm90IGNvbnRhaW4gbXVsdGlwbGUgZWxlbWVudHMgb2Ygc2Vzc2lvbi1jb25maWcsCi0JanNwLWNvbmZpZywgYW5kIGxvZ2luLWNvbmZpZy4gV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZWxlbWVudHMgb2YKLQl3ZWxjb21lLWZpbGUtbGlzdCBvciBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0LCB0aGUgY29udGFpbmVyCi0JbXVzdCBjb25jYXRpbmF0ZSB0aGUgZWxlbWVudCBjb250ZW50cy4gIFRoZSBtdWx0aXBsZSBvY2N1cmFuY2UKLQlvZiB0aGUgZWxlbWVudCBkaXN0cmlidXRhYmxlIGlzIHJlZHVuZGFudCBhbmQgdGhlIGNvbnRhaW5lcgotCXRyZWF0cyB0aGF0IGNhc2UgZXhhY3RseSBpbiB0aGUgc2FtZSB3YXkgd2hlbiB0aGVyZSBpcyBvbmx5Ci0Jb25lIGRpc3RyaWJ1dGFibGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtc2VydmxldC1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHNlcnZsZXQgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlcnZsZXQuCi0JICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpzZXJ2bGV0Ii8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnNlcnZsZXQtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtZmlsdGVyLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZmlsdGVyIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWx0ZXIuCi0JICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpmaWx0ZXIiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZmlsdGVyLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBlamItbG9jYWwtcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIHdlYgotCSAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLQkgIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLQkgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItbG9jYWwtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtZWpiLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotCSAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgd2ViCi0JICBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotCSAgdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotCSAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZgotCSAgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUKLQkgIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUuCi0JICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudgotCSAgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0JICBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0JICBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlLgotCSAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKLQkgIGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1yZXMtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLQkgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0JICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXMtcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLWVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSB3ZWIKLQkgIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLQkgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lCi0JICBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnYtZW50cnkiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZW52LWVudHJ5LW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOmtleSBuYW1lPSJ3ZWItYXBwLXJvbGUtbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgQSByb2xlLW5hbWUta2V5IGlzIHNwZWNpZmllZCB0byBhbGxvdyB0aGUgcmVmZXJlbmNlcwotCSAgZnJvbSB0aGUgc2VjdXJpdHktcm9sZS1yZWZzLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnNlY3VyaXR5LXJvbGUiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cm9sZS1uYW1lIi8+Ci0gICAgPC94c2Q6a2V5PgotCi0gICAgPHhzZDprZXlyZWYgbmFtZT0id2ViLWFwcC1yb2xlLW5hbWUtcmVmZXJlbmNlcyIKLQkJcmVmZXI9ImoyZWU6d2ViLWFwcC1yb2xlLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBrZXlyZWYgaW5kaWNhdGVzIHRoZSByZWZlcmVuY2VzIGZyb20KLQkgIHNlY3VyaXR5LXJvbGUtcmVmIHRvIGEgc3BlY2lmaWVkIHJvbGUtbmFtZS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpzZXJ2bGV0L2oyZWU6c2VjdXJpdHktcm9sZS1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cm9sZS1saW5rIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotICA8L3hzZDplbGVtZW50PgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF1dGgtY29uc3RyYWludFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhdXRoLWNvbnN0cmFpbnRUeXBlIGluZGljYXRlcyB0aGUgdXNlciByb2xlcyB0aGF0Ci0Jc2hvdWxkIGJlIHBlcm1pdHRlZCBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZQotCWNvbGxlY3Rpb24uIFRoZSByb2xlLW5hbWUgdXNlZCBoZXJlIG11c3QgZWl0aGVyIGNvcnJlc3BvbmQKLQl0byB0aGUgcm9sZS1uYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cwotCWRlZmluZWQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLCBvciBiZSB0aGUgc3BlY2lhbGx5Ci0JcmVzZXJ2ZWQgcm9sZS1uYW1lICIqIiB0aGF0IGlzIGEgY29tcGFjdCBzeW50YXggZm9yCi0JaW5kaWNhdGluZyBhbGwgcm9sZXMgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gSWYgYm90aCAiKiIKLQlhbmQgcm9sZW5hbWVzIGFwcGVhciwgdGhlIGNvbnRhaW5lciBpbnRlcnByZXRzIHRoaXMgYXMgYWxsCi0Jcm9sZXMuICBJZiBubyByb2xlcyBhcmUgZGVmaW5lZCwgbm8gdXNlciBpcyBhbGxvd2VkIGFjY2VzcwotCXRvIHRoZSBwb3J0aW9uIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVzY3JpYmVkIGJ5IHRoZQotCWNvbnRhaW5pbmcgc2VjdXJpdHktY29uc3RyYWludC4gIFRoZSBjb250YWluZXIgbWF0Y2hlcwotCXJvbGUgbmFtZXMgY2FzZSBzZW5zaXRpdmVseSB3aGVuIGRldGVybWluaW5nIGFjY2Vzcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6cm9sZS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF1dGgtbWV0aG9kVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGF1dGgtbWV0aG9kVHlwZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KLQltZWNoYW5pc20gZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24uIEFzIGEgcHJlcmVxdWlzaXRlIHRvCi0JZ2FpbmluZyBhY2Nlc3MgdG8gYW55IHdlYiByZXNvdXJjZXMgd2hpY2ggYXJlIHByb3RlY3RlZCBieQotCWFuIGF1dGhvcml6YXRpb24gY29uc3RyYWludCwgYSB1c2VyIG11c3QgaGF2ZSBhdXRoZW50aWNhdGVkCi0JdXNpbmcgdGhlIGNvbmZpZ3VyZWQgbWVjaGFuaXNtLiBMZWdhbCB2YWx1ZXMgYXJlICJCQVNJQyIsCi0JIkRJR0VTVCIsICJGT1JNIiwgIkNMSUVOVC1DRVJUIiwgb3IgYSB2ZW5kb3Itc3BlY2lmaWMKLQlhdXRoZW50aWNhdGlvbiBzY2hlbWUuCi0KLQlVc2VkIGluOiBsb2dpbi1jb25maWcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNwYXRjaGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGRpc3BhdGNoZXIgaGFzIGZvdXIgbGVnYWwgdmFsdWVzOiBGT1JXQVJELCBSRVFVRVNULCBJTkNMVURFLAotCWFuZCBFUlJPUi4gQSB2YWx1ZSBvZiBGT1JXQVJEIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkCi0JdW5kZXIgUmVxdWVzdERpc3BhdGNoZXIuZm9yd2FyZCgpIGNhbGxzLiAgQSB2YWx1ZSBvZiBSRVFVRVNUCi0JbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIgb3JkaW5hcnkgY2xpZW50IGNhbGxzIHRvCi0JdGhlIHBhdGggb3Igc2VydmxldC4gQSB2YWx1ZSBvZiBJTkNMVURFIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZQotCWFwcGxpZWQgdW5kZXIgUmVxdWVzdERpc3BhdGNoZXIuaW5jbHVkZSgpIGNhbGxzLiAgQSB2YWx1ZSBvZgotCUVSUk9SIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHVuZGVyIHRoZSBlcnJvciBwYWdlCi0JbWVjaGFuaXNtLiAgVGhlIGFic2VuY2Ugb2YgYW55IGRpc3BhdGNoZXIgZWxlbWVudHMgaW4gYQotCWZpbHRlci1tYXBwaW5nIGluZGljYXRlcyBhIGRlZmF1bHQgb2YgYXBwbHlpbmcgZmlsdGVycyBvbmx5IHVuZGVyCi0Jb3JkaW5hcnkgY2xpZW50IGNhbGxzIHRvIHRoZSBwYXRoIG9yIHNlcnZsZXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZPUldBUkQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTkNMVURFIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVRVUVTVCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVSUk9SIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbmNvZGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbmNvZGluZ1R5cGUgZGVmaW5lcyBJQU5BIGNoYXJhY3RlciBzZXRzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbXlxzXSsiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXJyb3ItY29kZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlcnJvci1jb2RlIGNvbnRhaW5zIGFuIEhUVFAgZXJyb3IgY29kZSwgZXg6IDQwNAotCi0JVXNlZCBpbjogZXJyb3ItcGFnZQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6eHNkUG9zaXRpdmVJbnRlZ2VyVHlwZSI+Ci0JPHhzZDpwYXR0ZXJuIHZhbHVlPSJcZHszfSIvPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlcnJvci1wYWdlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVycm9yLXBhZ2VUeXBlIGNvbnRhaW5zIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGVycm9yIGNvZGUKLQlvciBleGNlcHRpb24gdHlwZSB0byB0aGUgcGF0aCBvZiBhIHJlc291cmNlIGluIHRoZSB3ZWIKLQlhcHBsaWNhdGlvbi4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJlcnJvci1jb2RlIgotCQkgICAgIHR5cGU9ImoyZWU6ZXJyb3ItY29kZVR5cGUiLz4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24tdHlwZSIKLQkJICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZXhjZXB0aW9uLXR5cGUgY29udGFpbnMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLQkgICAgICBuYW1lIG9mIGEgSmF2YSBleGNlcHRpb24gdHlwZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6Y2hvaWNlPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYXRpb24iCi0JCSAgIHR5cGU9ImoyZWU6d2FyLXBhdGhUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZQotCSAgICByZXNvdXJjZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JICAgIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gbXVzdCBoYXZlCi0JICAgIGEgbGVhZGluZyBgLycuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmlsdGVyLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlEZWNsYXJhdGlvbiBvZiB0aGUgZmlsdGVyIG1hcHBpbmdzIGluIHRoaXMgd2ViCi0JYXBwbGljYXRpb24gaXMgZG9uZSBieSB1c2luZyBmaWx0ZXItbWFwcGluZ1R5cGUuCi0JVGhlIGNvbnRhaW5lciB1c2VzIHRoZSBmaWx0ZXItbWFwcGluZwotCWRlY2xhcmF0aW9ucyB0byBkZWNpZGUgd2hpY2ggZmlsdGVycyB0byBhcHBseSB0byBhIHJlcXVlc3QsCi0JYW5kIGluIHdoYXQgb3JkZXIuIFRoZSBjb250YWluZXIgbWF0Y2hlcyB0aGUgcmVxdWVzdCBVUkkgdG8KLQlhIFNlcnZsZXQgaW4gdGhlIG5vcm1hbCB3YXkuIFRvIGRldGVybWluZSB3aGljaCBmaWx0ZXJzIHRvCi0JYXBwbHkgaXQgbWF0Y2hlcyBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgZWl0aGVyIG9uCi0Jc2VydmxldC1uYW1lLCBvciBvbiB1cmwtcGF0dGVybiBmb3IgZWFjaCBmaWx0ZXItbWFwcGluZwotCWVsZW1lbnQsIGRlcGVuZGluZyBvbiB3aGljaCBzdHlsZSBpcyB1c2VkLiBUaGUgb3JkZXIgaW4KLQl3aGljaCBmaWx0ZXJzIGFyZSBpbnZva2VkIGlzIHRoZSBvcmRlciBpbiB3aGljaAotCWZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0aGF0IG1hdGNoIGEgcmVxdWVzdCBVUkkgZm9yIGEKLQlzZXJ2bGV0IGFwcGVhciBpbiB0aGUgbGlzdCBvZiBmaWx0ZXItbWFwcGluZyBlbGVtZW50cy5UaGUKLQlmaWx0ZXItbmFtZSB2YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgZmlsdGVyLW5hbWUKLQlzdWItZWxlbWVudHMgb2Ygb25lIG9mIHRoZSBmaWx0ZXIgZGVjbGFyYXRpb25zIGluIHRoZQotCWRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItbmFtZSIKLQkJICAgdHlwZT0iajJlZTpmaWx0ZXItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLQkJICAgICB0eXBlPSJqMmVlOnVybC1wYXR0ZXJuVHlwZSIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW5hbWUiCi0JCSAgICAgdHlwZT0iajJlZTpzZXJ2bGV0LW5hbWVUeXBlIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGF0Y2hlciIKLQkJICAgdHlwZT0iajJlZTpkaXNwYXRjaGVyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWx0ZXItbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGZpbHRlciBpcyBkZWNsYXJlCi0JYnkgdXNpbmcgZmlsdGVyLW5hbWVUeXBlLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBtYXAgdGhlCi0JZmlsdGVyLiAgRWFjaCBmaWx0ZXIgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIKLQlhcHBsaWNhdGlvbi4KLQotCVVzZWQgaW46IGZpbHRlciwgZmlsdGVyLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iajJlZTpub25FbXB0eVN0cmluZ1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmlsdGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGZpbHRlclR5cGUgaXMgdXNlZCB0byBkZWNsYXJlIGEgZmlsdGVyIGluIHRoZSB3ZWIKLQlhcHBsaWNhdGlvbi4gVGhlIGZpbHRlciBpcyBtYXBwZWQgdG8gZWl0aGVyIGEgc2VydmxldCBvciBhCi0JVVJMIHBhdHRlcm4gaW4gdGhlIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIHVzaW5nIHRoZQotCWZpbHRlci1uYW1lIHZhbHVlIHRvIHJlZmVyZW5jZS4gRmlsdGVycyBjYW4gYWNjZXNzIHRoZQotCWluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZGVjbGFyZWQgaW4gdGhlIGRlcGxveW1lbnQKLQlkZXNjcmlwdG9yIGF0IHJ1bnRpbWUgdmlhIHRoZSBGaWx0ZXJDb25maWcgaW50ZXJmYWNlLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmZpbHRlci1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGZpbHRlci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iCi0JCSAgIHR5cGU9ImoyZWU6cGFyYW0tdmFsdWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcwotCSAgICBhbiBpbml0aWFsaXphdGlvbiBwYXJhbSBvZiBhIHNlcnZsZXQgZmlsdGVyCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZm9ybS1sb2dpbi1jb25maWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZm9ybS1sb2dpbi1jb25maWdUeXBlIHNwZWNpZmllcyB0aGUgbG9naW4gYW5kIGVycm9yCi0JcGFnZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiBmb3JtIGJhc2VkIGxvZ2luLiBJZiBmb3JtIGJhc2VkCi0JYXV0aGVudGljYXRpb24gaXMgbm90IHVzZWQsIHRoZXNlIGVsZW1lbnRzIGFyZSBpZ25vcmVkLgotCi0JVXNlZCBpbjogbG9naW4tY29uZmlnCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JtLWxvZ2luLXBhZ2UiCi0JCSAgIHR5cGU9ImoyZWU6d2FyLXBhdGhUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGZvcm0tbG9naW4tcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIKLQkgICAgYXBwIHdoZXJlIHRoZSBwYWdlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2luIGNhbiBiZQotCSAgICBmb3VuZC4gIFRoZSBwYXRoIGJlZ2lucyB3aXRoIGEgbGVhZGluZyAvIGFuZCBpcyBpbnRlcnByZXRlZAotCSAgICByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV0FSLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1lcnJvci1wYWdlIgotCQkgICB0eXBlPSJqMmVlOndhci1wYXRoVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBmb3JtLWVycm9yLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbgotCSAgICB0aGUgd2ViIGFwcCB3aGVyZSB0aGUgZXJyb3IgcGFnZSB0aGF0IGlzIGRpc3BsYXllZAotCSAgICB3aGVuIGxvZ2luIGlzIG5vdCBzdWNjZXNzZnVsIGNhbiBiZSBmb3VuZC4KLQkgICAgVGhlIHBhdGggYmVnaW5zIHdpdGggYSBsZWFkaW5nIC8gYW5kIGlzIGludGVycHJldGVkCi0JICAgIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJodHRwLW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGh0dHAtbWV0aG9kIGNvbnRhaW5zIGFuIEhUVFAgbWV0aG9kIHJlY29nbml6ZWQgYnkgdGhlCi0Jd2ViLWFwcCwgZm9yIGV4YW1wbGUgR0VULCBQT1NULCAuLi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0VUIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUE9TVCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBVVCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFTEVURSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhFQUQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUFRJT05TIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFJBQ0UiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QgY29udGFpbnMgb25lIG9yIG1vcmUKLQlsb2NhbGUtZW5jb2RpbmctbWFwcGluZyhzKS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTpsb2NhbGUtZW5jb2RpbmctbWFwcGluZ1R5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmcgY29udGFpbnMgbG9jYWxlIG5hbWUgYW5kCi0JZW5jb2RpbmcgbmFtZS4gVGhlIGxvY2FsZSBuYW1lIG11c3QgYmUgZWl0aGVyICJMYW5ndWFnZS1jb2RlIiwKLQlzdWNoIGFzICJqYSIsIGRlZmluZWQgYnkgSVNPLTYzOSBvciAiTGFuZ3VhZ2UtY29kZV9Db3VudHJ5LWNvZGUiLAotCXN1Y2ggYXMgImphX0pQIi4gICJDb3VudHJ5IGNvZGUiIGlzIGRlZmluZWQgYnkgSVNPLTMxNjYuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWxlIgotCQkgICB0eXBlPSJqMmVlOmxvY2FsZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNvZGluZyIKLQkJICAgdHlwZT0iajJlZTplbmNvZGluZ1R5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2FsZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2NhbGVUeXBlIGRlZmluZXMgdmFsaWQgbG9jYWxlIGRlZmluZWQgYnkgSVNPLTYzOS0xCi0JYW5kIElTTy0zMTY2LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbYS16XXsyfShffC0pPyhbXHB7TH1cLVxwe05kfV17Mn0pPyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dpbi1jb25maWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9naW4tY29uZmlnVHlwZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KLQltZXRob2QgdGhhdCBzaG91bGQgYmUgdXNlZCwgdGhlIHJlYWxtIG5hbWUgdGhhdCBzaG91bGQgYmUKLQl1c2VkIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgdGhlIGF0dHJpYnV0ZXMgdGhhdCBhcmUKLQluZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4gbWVjaGFuaXNtLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF1dGgtbWV0aG9kIgotCQkgICB0eXBlPSJqMmVlOmF1dGgtbWV0aG9kVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhbG0tbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZWFsbSBuYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSByZWFsbSBuYW1lIHRvCi0JICAgIHVzZSBpbiBIVFRQIEJhc2ljIGF1dGhvcml6YXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1sb2dpbi1jb25maWciCi0JCSAgIHR5cGU9ImoyZWU6Zm9ybS1sb2dpbi1jb25maWdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtaW1lLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWltZS1tYXBwaW5nVHlwZSBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGV4dGVuc2lvbgotCWFuZCBhIG1pbWUgdHlwZS4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBleHRlbnNpb24gZWxlbWVudCBjb250YWlucyBhIHN0cmluZyBkZXNjcmliaW5nIGFuCi0JICBleHRlbnNpb24uIGV4YW1wbGU6ICJ0eHQiCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtaW1lLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6bWltZS10eXBlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1pbWUtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtaW1lLXR5cGVUeXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBkZWZpbmVkIG1pbWUgdHlwZS4KLQotCUV4YW1wbGU6Ci0JInRleHQvcGxhaW4iCi0KLQlVc2VkIGluOiBtaW1lLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iW15ccHtDY31eXHNdKy9bXlxwe0NjfV5cc10rIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm9uRW1wdHlTdHJpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JVGhpcyB0eXBlIGRlZmluZXMgYSBzdHJpbmcgd2hpY2ggY29udGFpbnMgYXQgbGVhc3Qgb25lCi0JY2hhcmFjdGVyLgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6bWluTGVuZ3RoIHZhbHVlPSIxIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktY29uc3RyYWludFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZWN1cml0eS1jb25zdHJhaW50VHlwZSBpcyB1c2VkIHRvIGFzc29jaWF0ZQotCXNlY3VyaXR5IGNvbnN0cmFpbnRzIHdpdGggb25lIG9yIG1vcmUgd2ViIHJlc291cmNlCi0JY29sbGVjdGlvbnMKLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIgotCQkgICB0eXBlPSJqMmVlOndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdXRoLWNvbnN0cmFpbnQiCi0JCSAgIHR5cGU9ImoyZWU6YXV0aC1jb25zdHJhaW50VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1kYXRhLWNvbnN0cmFpbnQiCi0JCSAgIHR5cGU9ImoyZWU6dXNlci1kYXRhLWNvbnN0cmFpbnRUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0LW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VydmxldC1tYXBwaW5nVHlwZSBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGEKLQlzZXJ2bGV0IGFuZCBhIHVybCBwYXR0ZXJuLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzZXJ2bGV0LW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCi0JCSAgIHR5cGU9ImoyZWU6dXJsLXBhdHRlcm5UeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmxldC1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUKLQlzZXJ2bGV0LiBFYWNoIHNlcnZsZXQgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIKLQlhcHBsaWNhdGlvbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iajJlZTpub25FbXB0eVN0cmluZ1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmxldFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXJ2bGV0VHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYSBzZXJ2bGV0LgotCUl0IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGl2ZSBkYXRhIG9mIGEKLQlzZXJ2bGV0LiBJZiBhIGpzcC1maWxlIGlzIHNwZWNpZmllZCBhbmQgdGhlIGxvYWQtb24tc3RhcnR1cAotCWVsZW1lbnQgaXMgcHJlc2VudCwgdGhlbiB0aGUgSlNQIHNob3VsZCBiZSBwcmVjb21waWxlZCBhbmQKLQlsb2FkZWQuCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnNlcnZsZXQtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LWNsYXNzIgotCQkgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBzZXJ2bGV0LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5Ci0JICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHNlcnZsZXQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJqc3AtZmlsZSIKLQkJICAgICB0eXBlPSJqMmVlOmpzcC1maWxlVHlwZSIvPgotCi0gICAgICA8L3hzZDpjaG9pY2U+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgotCQkgICB0eXBlPSJqMmVlOnBhcmFtLXZhbHVlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYWQtb24tc3RhcnR1cCIKLQkJICAgdHlwZT0iajJlZTp4c2RJbnRlZ2VyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoaXMKLQkgICAgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkIChpbnN0YW50aWF0ZWQgYW5kIGhhdmUKLQkgICAgaXRzIGluaXQoKSBjYWxsZWQpIG9uIHRoZSBzdGFydHVwIG9mIHRoZSB3ZWIKLQkgICAgYXBwbGljYXRpb24uIFRoZSBvcHRpb25hbCBjb250ZW50cyBvZiB0aGVzZQotCSAgICBlbGVtZW50IG11c3QgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBvcmRlciBpbgotCSAgICB3aGljaCB0aGUgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkLiBJZiB0aGUgdmFsdWUKLQkgICAgaXMgYSBuZWdhdGl2ZSBpbnRlZ2VyLCBvciB0aGUgZWxlbWVudCBpcyBub3QKLQkgICAgcHJlc2VudCwgdGhlIGNvbnRhaW5lciBpcyBmcmVlIHRvIGxvYWQgdGhlIHNlcnZsZXQKLQkgICAgd2hlbmV2ZXIgaXQgY2hvb3Nlcy4gSWYgdGhlIHZhbHVlIGlzIGEgcG9zaXRpdmUKLQkgICAgaW50ZWdlciBvciAwLCB0aGUgY29udGFpbmVyIG11c3QgbG9hZCBhbmQKLQkgICAgaW5pdGlhbGl6ZSB0aGUgc2VydmxldCBhcyB0aGUgYXBwbGljYXRpb24gaXMKLQkgICAgZGVwbG95ZWQuIFRoZSBjb250YWluZXIgbXVzdCBndWFyYW50ZWUgdGhhdAotCSAgICBzZXJ2bGV0cyBtYXJrZWQgd2l0aCBsb3dlciBpbnRlZ2VycyBhcmUgbG9hZGVkCi0JICAgIGJlZm9yZSBzZXJ2bGV0cyBtYXJrZWQgd2l0aCBoaWdoZXIgaW50ZWdlcnMuIFRoZQotCSAgICBjb250YWluZXIgbWF5IGNob29zZSB0aGUgb3JkZXIgb2YgbG9hZGluZyBvZgotCSAgICBzZXJ2bGV0cyB3aXRoIHRoZSBzYW1lIGxvYWQtb24tc3RhcnQtdXAgdmFsdWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icnVuLWFzIgotCQkgICB0eXBlPSJqMmVlOnJ1bi1hc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGUtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlc3Npb24tY29uZmlnVHlwZSBkZWZpbmVzIHRoZSBzZXNzaW9uIHBhcmFtZXRlcnMKLQlmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi10aW1lb3V0IgotCQkgICB0eXBlPSJqMmVlOnhzZEludGVnZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc2Vzc2lvbi10aW1lb3V0IGVsZW1lbnQgZGVmaW5lcyB0aGUgZGVmYXVsdAotCSAgICBzZXNzaW9uIHRpbWVvdXQgaW50ZXJ2YWwgZm9yIGFsbCBzZXNzaW9ucyBjcmVhdGVkCi0JICAgIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgc3BlY2lmaWVkIHRpbWVvdXQKLQkgICAgbXVzdCBiZSBleHByZXNzZWQgaW4gYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4KLQkgICAgSWYgdGhlIHRpbWVvdXQgaXMgMCBvciBsZXNzLCB0aGUgY29udGFpbmVyIGVuc3VyZXMKLQkgICAgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIHNlc3Npb25zIGlzIG5ldmVyIHRvIHRpbWUKLQkgICAgb3V0LiBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGNvbnRhaW5lcgotCSAgICBtdXN0IHNldCBpdHMgZGVmYXVsdCB0aW1lb3V0IHBlcmlvZC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIHNwZWNpZmllcyB0aGF0IHRoZSBjb21tdW5pY2F0aW9uCi0JYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yCi0JQ09ORklERU5USUFMLiBOT05FIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90Ci0JcmVxdWlyZSBhbnkgdHJhbnNwb3J0IGd1YXJhbnRlZXMuIEEgdmFsdWUgb2YgSU5URUdSQUwgbWVhbnMKLQl0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIHNlbnQgYmV0d2VlbiB0aGUKLQljbGllbnQgYW5kIHNlcnZlciBiZSBzZW50IGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBjYW4ndCBiZQotCWNoYW5nZWQgaW4gdHJhbnNpdC4gQ09ORklERU5USUFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uCi0JcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBiZSB0cmFuc21pdHRlZCBpbiBhIGZhc2hpb24gdGhhdAotCXByZXZlbnRzIG90aGVyIGVudGl0aWVzIGZyb20gb2JzZXJ2aW5nIHRoZSBjb250ZW50cyBvZiB0aGUKLQl0cmFuc21pc3Npb24uIEluIG1vc3QgY2FzZXMsIHRoZSBwcmVzZW5jZSBvZiB0aGUgSU5URUdSQUwgb3IKLQlDT05GSURFTlRJQUwgZmxhZyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiBTU0wgaXMKLQlyZXF1aXJlZC4KLQotCVVzZWQgaW46IHVzZXItZGF0YS1jb25zdHJhaW50Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR1JBTCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPTkZJREVOVElBTCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVzZXItZGF0YS1jb25zdHJhaW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHVzZXItZGF0YS1jb25zdHJhaW50VHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIGhvdwotCWRhdGEgY29tbXVuaWNhdGVkIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgY29udGFpbmVyIHNob3VsZCBiZQotCXByb3RlY3RlZC4KLQotCVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQtZ3VhcmFudGVlIgotCQkgICB0eXBlPSJqMmVlOnRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2FyLXBhdGhUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWxlbWVudHMgdGhhdCB1c2UgdGhpcyB0eXBlIGRlc2lnbmF0ZSBhIHBhdGggc3RhcnRpbmcKLQl3aXRoIGEgIi8iIGFuZCBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiBhIFdBUgotCWZpbGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOnBhdHRlcm4gdmFsdWU9Ii8uKiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0id2ViLWFwcC12ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSByZWNvZ25pemVkIHZlcnNpb25zIG9mCi0Jd2ViLWFwcGxpY2F0aW9uIHN1cHBvcnRlZC4gSXQgaXMgdXNlZCB0byBkZXNpZ25hdGUgdGhlCi0JdmVyc2lvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMi40Ii8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYi1hcHBUeXBlIj4KLQotICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3RyaWJ1dGFibGUiCi0JCSAgIHR5cGU9ImoyZWU6ZW1wdHlUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGV4dC1wYXJhbSIKLQkJICAgdHlwZT0iajJlZTpwYXJhbS12YWx1ZVR5cGUiPgotCi0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBjb250ZXh0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uCi0JICAgIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3Mgc2VydmxldCBjb250ZXh0Ci0JICAgIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiCi0JCSAgIHR5cGU9ImoyZWU6ZmlsdGVyVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1tYXBwaW5nIgotCQkgICB0eXBlPSJqMmVlOmZpbHRlci1tYXBwaW5nVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3RlbmVyIgotCQkgICB0eXBlPSJqMmVlOmxpc3RlbmVyVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQiCi0JCSAgIHR5cGU9ImoyZWU6c2VydmxldFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6c2VydmxldC1tYXBwaW5nVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tY29uZmlnIgotCQkgICB0eXBlPSJqMmVlOnNlc3Npb24tY29uZmlnVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbWUtbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTptaW1lLW1hcHBpbmdUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2VsY29tZS1maWxlLWxpc3QiCi0JCSAgIHR5cGU9ImoyZWU6d2VsY29tZS1maWxlLWxpc3RUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXJyb3ItcGFnZSIKLQkJICAgdHlwZT0iajJlZTplcnJvci1wYWdlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpzcC1jb25maWciCi0JCSAgIHR5cGU9ImoyZWU6anNwLWNvbmZpZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1jb25zdHJhaW50IgotCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9naW4tY29uZmlnIgotCQkgICB0eXBlPSJqMmVlOmxvZ2luLWNvbmZpZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlIgotCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGVUeXBlIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uIgotCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCIKLQkJICAgdHlwZT0iajJlZTpsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0VHlwZSIvPgotICAgIDwveHNkOmNob2ljZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6d2ViLWFwcC12ZXJzaW9uVHlwZSIKLQkJICAgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgc3Vic2V0Ci0Jb2YgdGhlIHJlc291cmNlcyBhbmQgSFRUUCBtZXRob2RzIG9uIHRob3NlIHJlc291cmNlcyB3aXRoaW4KLQlhIHdlYiBhcHBsaWNhdGlvbiB0byB3aGljaCBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYKLQlubyBIVFRQIG1ldGhvZHMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VjdXJpdHkgY29uc3RyYWludAotCWFwcGxpZXMgdG8gYWxsIEhUVFAgbWV0aG9kcy4KLQotCVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItcmVzb3VyY2UtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd2ViLXJlc291cmNlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyB3ZWIKLQkgICAgcmVzb3VyY2UgY29sbGVjdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLQkJICAgdHlwZT0iajJlZTp1cmwtcGF0dGVyblR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaHR0cC1tZXRob2QiCi0JCSAgIHR5cGU9ImoyZWU6aHR0cC1tZXRob2RUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VsY29tZS1maWxlLWxpc3RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd2VsY29tZS1maWxlLWxpc3QgY29udGFpbnMgYW4gb3JkZXJlZCBsaXN0IG9mIHdlbGNvbWUKLQlmaWxlcyBlbGVtZW50cy4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWxjb21lLWZpbGUiCi0JCSAgIHR5cGU9InhzZDpzdHJpbmciCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdlbGNvbWUtZmlsZSBlbGVtZW50IGNvbnRhaW5zIGZpbGUgbmFtZSB0byB1c2UKLQkgICAgYXMgYSBkZWZhdWx0IHdlbGNvbWUgZmlsZSwgc3VjaCBhcyBpbmRleC5odG1sCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl81LnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzA5MDJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMi41Ij4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIyl3ZWItYXBwXzJfNS54c2RzCTEuNjIgMDUvMDgvMDYKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAgICAgIFUuUy5BCi0gICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgU2VydmxldCAyLjUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCVRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZCAiV0VCLUlORi93ZWIueG1sIiBpbiB0aGUKLQl3ZWIgYXBwbGljYXRpb24ncyB3YXIgZmlsZS4gIEFsbCBTZXJ2bGV0IGRlcGxveW1lbnQgZGVzY3JpcHRvcnMKLQltdXN0IGluZGljYXRlIHRoZSB3ZWIgYXBwbGljYXRpb24gc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFCi0JbmFtZXNwYWNlOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0KLQlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSIuLi4iCi0JICAgICAgdmVyc2lvbj0iMi41Ij4KLQkgICAgICAuLi4KLQkgICAgPC93ZWItYXBwPgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0JdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSmF2YSBFRQotCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqYXZhZWVfNS54c2QiLz4KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqc3BfMl8xLnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLWFwcCIgdHlwZT0iamF2YWVlOndlYi1hcHBUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd2ViLWFwcCBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBkZXBsb3ltZW50Ci0JZGVzY3JpcHRvciBmb3IgYSB3ZWIgYXBwbGljYXRpb24uICBOb3RlIHRoYXQgdGhlIHN1Yi1lbGVtZW50cwotCW9mIHRoaXMgZWxlbWVudCBjYW4gYmUgaW4gdGhlIGFyYml0cmFyeSBvcmRlci4gQmVjYXVzZSBvZgotCXRoYXQsIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIGVsZW1lbnRzIG9mIGRpc3RyaWJ1dGFibGUsCi0Jc2Vzc2lvbi1jb25maWcsIHdlbGNvbWUtZmlsZS1saXN0LCBqc3AtY29uZmlnLCBsb2dpbi1jb25maWcsCi0JYW5kIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3Qgd2FzIGNoYW5nZWQgZnJvbSAiPyIgdG8gIioiCi0JaW4gdGhpcyBzY2hlbWEuICBIb3dldmVyLCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGluc3RhbmNlCi0JZmlsZSBtdXN0IG5vdCBjb250YWluIG11bHRpcGxlIGVsZW1lbnRzIG9mIHNlc3Npb24tY29uZmlnLAotCWpzcC1jb25maWcsIGFuZCBsb2dpbi1jb25maWcuIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzIG9mCi0Jd2VsY29tZS1maWxlLWxpc3Qgb3IgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCwgdGhlIGNvbnRhaW5lcgotCW11c3QgY29uY2F0ZW5hdGUgdGhlIGVsZW1lbnQgY29udGVudHMuICBUaGUgbXVsdGlwbGUgb2NjdXJlbmNlCi0Jb2YgdGhlIGVsZW1lbnQgZGlzdHJpYnV0YWJsZSBpcyByZWR1bmRhbnQgYW5kIHRoZSBjb250YWluZXIKLQl0cmVhdHMgdGhhdCBjYXNlIGV4YWN0bHkgaW4gdGhlIHNhbWUgd2F5IHdoZW4gdGhlcmUgaXMgb25seQotCW9uZSBkaXN0cmlidXRhYmxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLXNlcnZsZXQtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBzZXJ2bGV0IGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZXJ2bGV0LgotCSAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpzZXJ2bGV0Ii8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6c2VydmxldC1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1maWx0ZXItbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBmaWx0ZXIgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbHRlci4KLQkgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZmlsdGVyIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZmlsdGVyLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBlamItbG9jYWwtcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIHdlYgotCSAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLQkgIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLQkgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1sb2NhbC1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplamItcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIHdlYgotCSAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLQkgIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLQkgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplamItcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLXJlc291cmNlLWVudi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0JICBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzIHRoZQotCSAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gY29kZS4KLQkgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52Ci0JICBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0JICBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0JICBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlLgotCSAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKLQkgIGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZQotCSAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQkgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJlcy1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHdlYgotCSAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotCSAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUKLQkgIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5Ii8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5LW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOmtleSBuYW1lPSJ3ZWItYXBwLXJvbGUtbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgQSByb2xlLW5hbWUta2V5IGlzIHNwZWNpZmllZCB0byBhbGxvdyB0aGUgcmVmZXJlbmNlcwotCSAgZnJvbSB0aGUgc2VjdXJpdHktcm9sZS1yZWZzLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6c2VjdXJpdHktcm9sZSIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJvbGUtbmFtZSIvPgotICAgIDwveHNkOmtleT4KLQotICAgIDx4c2Q6a2V5cmVmIG5hbWU9IndlYi1hcHAtcm9sZS1uYW1lLXJlZmVyZW5jZXMiCi0JCXJlZmVyPSJqYXZhZWU6d2ViLWFwcC1yb2xlLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBrZXlyZWYgaW5kaWNhdGVzIHRoZSByZWZlcmVuY2VzIGZyb20KLQkgIHNlY3VyaXR5LXJvbGUtcmVmIHRvIGEgc3BlY2lmaWVkIHJvbGUtbmFtZS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnNlcnZsZXQvamF2YWVlOnNlY3VyaXR5LXJvbGUtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cm9sZS1saW5rIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotICA8L3hzZDplbGVtZW50PgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF1dGgtY29uc3RyYWludFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhdXRoLWNvbnN0cmFpbnRUeXBlIGluZGljYXRlcyB0aGUgdXNlciByb2xlcyB0aGF0Ci0Jc2hvdWxkIGJlIHBlcm1pdHRlZCBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZQotCWNvbGxlY3Rpb24uIFRoZSByb2xlLW5hbWUgdXNlZCBoZXJlIG11c3QgZWl0aGVyIGNvcnJlc3BvbmQKLQl0byB0aGUgcm9sZS1uYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cwotCWRlZmluZWQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLCBvciBiZSB0aGUgc3BlY2lhbGx5Ci0JcmVzZXJ2ZWQgcm9sZS1uYW1lICIqIiB0aGF0IGlzIGEgY29tcGFjdCBzeW50YXggZm9yCi0JaW5kaWNhdGluZyBhbGwgcm9sZXMgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gSWYgYm90aCAiKiIKLQlhbmQgcm9sZW5hbWVzIGFwcGVhciwgdGhlIGNvbnRhaW5lciBpbnRlcnByZXRzIHRoaXMgYXMgYWxsCi0Jcm9sZXMuICBJZiBubyByb2xlcyBhcmUgZGVmaW5lZCwgbm8gdXNlciBpcyBhbGxvd2VkIGFjY2VzcwotCXRvIHRoZSBwb3J0aW9uIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVzY3JpYmVkIGJ5IHRoZQotCWNvbnRhaW5pbmcgc2VjdXJpdHktY29uc3RyYWludC4gIFRoZSBjb250YWluZXIgbWF0Y2hlcwotCXJvbGUgbmFtZXMgY2FzZSBzZW5zaXRpdmVseSB3aGVuIGRldGVybWluaW5nIGFjY2Vzcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnJvbGUtbmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdXRoLW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhdXRoLW1ldGhvZFR5cGUgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCi0JbWVjaGFuaXNtIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uLiBBcyBhIHByZXJlcXVpc2l0ZSB0bwotCWdhaW5pbmcgYWNjZXNzIHRvIGFueSB3ZWIgcmVzb3VyY2VzIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkKLQlhbiBhdXRob3JpemF0aW9uIGNvbnN0cmFpbnQsIGEgdXNlciBtdXN0IGhhdmUgYXV0aGVudGljYXRlZAotCXVzaW5nIHRoZSBjb25maWd1cmVkIG1lY2hhbmlzbS4gTGVnYWwgdmFsdWVzIGFyZSAiQkFTSUMiLAotCSJESUdFU1QiLCAiRk9STSIsICJDTElFTlQtQ0VSVCIsIG9yIGEgdmVuZG9yLXNwZWNpZmljCi0JYXV0aGVudGljYXRpb24gc2NoZW1lLgotCi0JVXNlZCBpbjogbG9naW4tY29uZmlnCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNwYXRjaGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGRpc3BhdGNoZXIgaGFzIGZvdXIgbGVnYWwgdmFsdWVzOiBGT1JXQVJELCBSRVFVRVNULCBJTkNMVURFLAotCWFuZCBFUlJPUi4gQSB2YWx1ZSBvZiBGT1JXQVJEIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkCi0JdW5kZXIgUmVxdWVzdERpc3BhdGNoZXIuZm9yd2FyZCgpIGNhbGxzLiAgQSB2YWx1ZSBvZiBSRVFVRVNUCi0JbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIgb3JkaW5hcnkgY2xpZW50IGNhbGxzIHRvCi0JdGhlIHBhdGggb3Igc2VydmxldC4gQSB2YWx1ZSBvZiBJTkNMVURFIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZQotCWFwcGxpZWQgdW5kZXIgUmVxdWVzdERpc3BhdGNoZXIuaW5jbHVkZSgpIGNhbGxzLiAgQSB2YWx1ZSBvZgotCUVSUk9SIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHVuZGVyIHRoZSBlcnJvciBwYWdlCi0JbWVjaGFuaXNtLiAgVGhlIGFic2VuY2Ugb2YgYW55IGRpc3BhdGNoZXIgZWxlbWVudHMgaW4gYQotCWZpbHRlci1tYXBwaW5nIGluZGljYXRlcyBhIGRlZmF1bHQgb2YgYXBwbHlpbmcgZmlsdGVycyBvbmx5IHVuZGVyCi0Jb3JkaW5hcnkgY2xpZW50IGNhbGxzIHRvIHRoZSBwYXRoIG9yIHNlcnZsZXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk9SV0FSRCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOQ0xVREUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRVFVRVNUIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVJST1IiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVuY29kaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVuY29kaW5nVHlwZSBkZWZpbmVzIElBTkEgY2hhcmFjdGVyIHNldHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlteXHNdKyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlcnJvci1jb2RlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVycm9yLWNvZGUgY29udGFpbnMgYW4gSFRUUCBlcnJvciBjb2RlLCBleDogNDA0Ci0KLQlVc2VkIGluOiBlcnJvci1wYWdlCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnhzZFBvc2l0aXZlSW50ZWdlclR5cGUiPgotCTx4c2Q6cGF0dGVybiB2YWx1ZT0iXGR7M30iLz4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXJyb3ItcGFnZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlcnJvci1wYWdlVHlwZSBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlCi0Jb3IgZXhjZXB0aW9uIHR5cGUgdG8gdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbiB0aGUgd2ViCi0JYXBwbGljYXRpb24uCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iZXJyb3ItY29kZSIKLQkJICAgICB0eXBlPSJqYXZhZWU6ZXJyb3ItY29kZVR5cGUiLz4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24tdHlwZSIKLQkJICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBleGNlcHRpb24tdHlwZSBjb250YWlucyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotCSAgICAgIG5hbWUgb2YgYSBKYXZhIGV4Y2VwdGlvbiB0eXBlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOndhci1wYXRoVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBsb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUKLQkgICAgcmVzb3VyY2UgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCSAgICB0aGUgd2ViIGFwcGxpY2F0aW9uLiBUaGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIG11c3QgaGF2ZQotCSAgICBhIGxlYWRpbmcgYC8nLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpbHRlci1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JRGVjbGFyYXRpb24gb2YgdGhlIGZpbHRlciBtYXBwaW5ncyBpbiB0aGlzIHdlYgotCWFwcGxpY2F0aW9uIGlzIGRvbmUgYnkgdXNpbmcgZmlsdGVyLW1hcHBpbmdUeXBlLgotCVRoZSBjb250YWluZXIgdXNlcyB0aGUgZmlsdGVyLW1hcHBpbmcKLQlkZWNsYXJhdGlvbnMgdG8gZGVjaWRlIHdoaWNoIGZpbHRlcnMgdG8gYXBwbHkgdG8gYSByZXF1ZXN0LAotCWFuZCBpbiB3aGF0IG9yZGVyLiBUaGUgY29udGFpbmVyIG1hdGNoZXMgdGhlIHJlcXVlc3QgVVJJIHRvCi0JYSBTZXJ2bGV0IGluIHRoZSBub3JtYWwgd2F5LiBUbyBkZXRlcm1pbmUgd2hpY2ggZmlsdGVycyB0bwotCWFwcGx5IGl0IG1hdGNoZXMgZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIGVpdGhlciBvbgotCXNlcnZsZXQtbmFtZSwgb3Igb24gdXJsLXBhdHRlcm4gZm9yIGVhY2ggZmlsdGVyLW1hcHBpbmcKLQllbGVtZW50LCBkZXBlbmRpbmcgb24gd2hpY2ggc3R5bGUgaXMgdXNlZC4gVGhlIG9yZGVyIGluCi0Jd2hpY2ggZmlsdGVycyBhcmUgaW52b2tlZCBpcyB0aGUgb3JkZXIgaW4gd2hpY2gKLQlmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdGhhdCBtYXRjaCBhIHJlcXVlc3QgVVJJIGZvciBhCi0Jc2VydmxldCBhcHBlYXIgaW4gdGhlIGxpc3Qgb2YgZmlsdGVyLW1hcHBpbmcgZWxlbWVudHMuVGhlCi0JZmlsdGVyLW5hbWUgdmFsdWUgbXVzdCBiZSB0aGUgdmFsdWUgb2YgdGhlIGZpbHRlci1uYW1lCi0Jc3ViLWVsZW1lbnRzIG9mIG9uZSBvZiB0aGUgZmlsdGVyIGRlY2xhcmF0aW9ucyBpbiB0aGUKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpmaWx0ZXItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLQkJICAgICB0eXBlPSJqYXZhZWU6dXJsLXBhdHRlcm5UeXBlIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLQkJICAgICB0eXBlPSJqYXZhZWU6c2VydmxldC1uYW1lVHlwZSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BhdGNoZXIiCi0JCSAgIHR5cGU9ImphdmFlZTpkaXNwYXRjaGVyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWx0ZXItbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGZpbHRlciBpcyBkZWNsYXJlCi0JYnkgdXNpbmcgZmlsdGVyLW5hbWVUeXBlLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBtYXAgdGhlCi0JZmlsdGVyLiAgRWFjaCBmaWx0ZXIgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIKLQlhcHBsaWNhdGlvbi4KLQotCVVzZWQgaW46IGZpbHRlciwgZmlsdGVyLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOm5vbkVtcHR5U3RyaW5nVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWx0ZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZmlsdGVyVHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYSBmaWx0ZXIgaW4gdGhlIHdlYgotCWFwcGxpY2F0aW9uLiBUaGUgZmlsdGVyIGlzIG1hcHBlZCB0byBlaXRoZXIgYSBzZXJ2bGV0IG9yIGEKLQlVUkwgcGF0dGVybiBpbiB0aGUgZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgdXNpbmcgdGhlCi0JZmlsdGVyLW5hbWUgdmFsdWUgdG8gcmVmZXJlbmNlLiBGaWx0ZXJzIGNhbiBhY2Nlc3MgdGhlCi0JaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudAotCWRlc2NyaXB0b3IgYXQgcnVudGltZSB2aWEgdGhlIEZpbHRlckNvbmZpZyBpbnRlcmZhY2UuCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmZpbHRlci1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZmlsdGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLQkJICAgdHlwZT0iamF2YWVlOnBhcmFtLXZhbHVlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMKLQkgICAgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgYSBzZXJ2bGV0IGZpbHRlcgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZvcm0tbG9naW4tY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGZvcm0tbG9naW4tY29uZmlnVHlwZSBzcGVjaWZpZXMgdGhlIGxvZ2luIGFuZCBlcnJvcgotCXBhZ2VzIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gZm9ybSBiYXNlZCBsb2dpbi4gSWYgZm9ybSBiYXNlZAotCWF1dGhlbnRpY2F0aW9uIGlzIG5vdCB1c2VkLCB0aGVzZSBlbGVtZW50cyBhcmUgaWdub3JlZC4KLQotCVVzZWQgaW46IGxvZ2luLWNvbmZpZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1sb2dpbi1wYWdlIgotCQkgICB0eXBlPSJqYXZhZWU6d2FyLXBhdGhUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGZvcm0tbG9naW4tcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIKLQkgICAgYXBwIHdoZXJlIHRoZSBwYWdlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2luIGNhbiBiZQotCSAgICBmb3VuZC4gIFRoZSBwYXRoIGJlZ2lucyB3aXRoIGEgbGVhZGluZyAvIGFuZCBpcyBpbnRlcnByZXRlZAotCSAgICByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV0FSLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1lcnJvci1wYWdlIgotCQkgICB0eXBlPSJqYXZhZWU6d2FyLXBhdGhUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGZvcm0tZXJyb3ItcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluCi0JICAgIHRoZSB3ZWIgYXBwIHdoZXJlIHRoZSBlcnJvciBwYWdlIHRoYXQgaXMgZGlzcGxheWVkCi0JICAgIHdoZW4gbG9naW4gaXMgbm90IHN1Y2Nlc3NmdWwgY2FuIGJlIGZvdW5kLgotCSAgICBUaGUgcGF0aCBiZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMgaW50ZXJwcmV0ZWQKLQkgICAgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iaHR0cC1tZXRob2RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCUEgSFRUUCBtZXRob2QgdHlwZSBhcyBkZWZpbmVkIGluIEhUVFAgMS4xIHNlY3Rpb24gMi4yLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbJiMzMzstJiMxMjY7LVtcKFwpJiM2MDsmIzYyO0AsOzomIzM0Oy9cW1xdPz1ce1x9XFxccHtafV1dKyIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvYWQtb24tc3RhcnR1cFR5cGUiPgotICAgIDx4c2Q6dW5pb24gbWVtYmVyVHlwZXM9ImphdmFlZTpudWxsLWNoYXJUeXBlIHhzZDppbnRlZ2VyIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCBjb250YWlucyBvbmUgb3IgbW9yZQotCWxvY2FsZS1lbmNvZGluZy1tYXBwaW5nKHMpLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nIgotCQkgICB0eXBlPSJqYXZhZWU6bG9jYWxlLWVuY29kaW5nLW1hcHBpbmdUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nIGNvbnRhaW5zIGxvY2FsZSBuYW1lIGFuZAotCWVuY29kaW5nIG5hbWUuIFRoZSBsb2NhbGUgbmFtZSBtdXN0IGJlIGVpdGhlciAiTGFuZ3VhZ2UtY29kZSIsCi0Jc3VjaCBhcyAiamEiLCBkZWZpbmVkIGJ5IElTTy02Mzkgb3IgIkxhbmd1YWdlLWNvZGVfQ291bnRyeS1jb2RlIiwKLQlzdWNoIGFzICJqYV9KUCIuICAiQ291bnRyeSBjb2RlIiBpcyBkZWZpbmVkIGJ5IElTTy0zMTY2LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsZSIKLQkJICAgdHlwZT0iamF2YWVlOmxvY2FsZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNvZGluZyIKLQkJICAgdHlwZT0iamF2YWVlOmVuY29kaW5nVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9jYWxlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxvY2FsZVR5cGUgZGVmaW5lcyB2YWxpZCBsb2NhbGUgZGVmaW5lZCBieSBJU08tNjM5LTEKLQlhbmQgSVNPLTMxNjYuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlthLXpdezJ9KF98LSk/KFtccHtMfVwtXHB7TmR9XXsyfSk/Ii8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2luLWNvbmZpZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2dpbi1jb25maWdUeXBlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbgotCW1ldGhvZCB0aGF0IHNob3VsZCBiZSB1c2VkLCB0aGUgcmVhbG0gbmFtZSB0aGF0IHNob3VsZCBiZQotCXVzZWQgZm9yIHRoaXMgYXBwbGljYXRpb24sIGFuZCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZQotCW5lZWRlZCBieSB0aGUgZm9ybSBsb2dpbiBtZWNoYW5pc20uCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aC1tZXRob2QiCi0JCSAgIHR5cGU9ImphdmFlZTphdXRoLW1ldGhvZFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWxtLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZWFsbSBuYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSByZWFsbSBuYW1lIHRvCi0JICAgIHVzZSBpbiBIVFRQIEJhc2ljIGF1dGhvcml6YXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1sb2dpbi1jb25maWciCi0JCSAgIHR5cGU9ImphdmFlZTpmb3JtLWxvZ2luLWNvbmZpZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1pbWUtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtaW1lLW1hcHBpbmdUeXBlIGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXh0ZW5zaW9uCi0JYW5kIGEgbWltZSB0eXBlLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4KLQkgIGV4dGVuc2lvbi4gZXhhbXBsZTogInR4dCIKLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWltZS10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6bWltZS10eXBlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1pbWUtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtaW1lLXR5cGVUeXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBkZWZpbmVkIG1pbWUgdHlwZS4KLQotCUV4YW1wbGU6Ci0JInRleHQvcGxhaW4iCi0KLQlVc2VkIGluOiBtaW1lLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOnBhdHRlcm4gdmFsdWU9IlteXHB7Q2N9XlxzXSsvW15ccHtDY31eXHNdKyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vbkVtcHR5U3RyaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCVRoaXMgdHlwZSBkZWZpbmVzIGEgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIGF0IGxlYXN0IG9uZQotCWNoYXJhY3Rlci4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6bWluTGVuZ3RoIHZhbHVlPSIxIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJudWxsLWNoYXJUeXBlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VjdXJpdHktY29uc3RyYWludFR5cGUgaXMgdXNlZCB0byBhc3NvY2lhdGUKLQlzZWN1cml0eSBjb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlIHdlYiByZXNvdXJjZQotCWNvbGxlY3Rpb25zCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZGlzcGxheS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6d2ViLXJlc291cmNlLWNvbGxlY3Rpb25UeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF1dGgtY29uc3RyYWludCIKLQkJICAgdHlwZT0iamF2YWVlOmF1dGgtY29uc3RyYWludFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXItZGF0YS1jb25zdHJhaW50IgotCQkgICB0eXBlPSJqYXZhZWU6dXNlci1kYXRhLWNvbnN0cmFpbnRUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0LW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VydmxldC1tYXBwaW5nVHlwZSBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGEKLQlzZXJ2bGV0IGFuZCBhIHVybCBwYXR0ZXJuLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnNlcnZsZXQtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLQkJICAgdHlwZT0iamF2YWVlOnVybC1wYXR0ZXJuVHlwZSIKLSAgICAgICAgICAgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXQtbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXJ2bGV0LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlCi0Jc2VydmxldC4gRWFjaCBzZXJ2bGV0IG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgd2ViCi0JYXBwbGljYXRpb24uCi0gICAgICAgIFRoZSBzcGVjaWFsIHNlcnZsZXQgbmFtZSBvZiAiKiIgbWF5IGJlIHVzZWQgdG8gcmVmZXJlbmNlIGFsbAotICAgICAgICBzZXJ2bGV0cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOm5vbkVtcHR5U3RyaW5nVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlcnZsZXRUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhIHNlcnZsZXQuCi0JSXQgY29udGFpbnMgdGhlIGRlY2xhcmF0aXZlIGRhdGEgb2YgYQotCXNlcnZsZXQuIElmIGEganNwLWZpbGUgaXMgc3BlY2lmaWVkIGFuZCB0aGUgbG9hZC1vbi1zdGFydHVwCi0JZWxlbWVudCBpcyBwcmVzZW50LCB0aGVuIHRoZSBKU1Agc2hvdWxkIGJlIHByZWNvbXBpbGVkIGFuZAotCWxvYWRlZC4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnNlcnZsZXQtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LWNsYXNzIgotCQkgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHNlcnZsZXQtY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkKLQkgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgc2VydmxldC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCi0JPHhzZDplbGVtZW50IG5hbWU9ImpzcC1maWxlIgotCQkgICAgIHR5cGU9ImphdmFlZTpqc3AtZmlsZVR5cGUiLz4KLQotICAgICAgPC94c2Q6Y2hvaWNlPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLQkJICAgdHlwZT0iamF2YWVlOnBhcmFtLXZhbHVlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYWQtb24tc3RhcnR1cCIKLQkJICAgdHlwZT0iamF2YWVlOmxvYWQtb24tc3RhcnR1cFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzCi0JICAgIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZCAoaW5zdGFudGlhdGVkIGFuZCBoYXZlCi0JICAgIGl0cyBpbml0KCkgY2FsbGVkKSBvbiB0aGUgc3RhcnR1cCBvZiB0aGUgd2ViCi0JICAgIGFwcGxpY2F0aW9uLiBUaGUgb3B0aW9uYWwgY29udGVudHMgb2YgdGhlc2UKLQkgICAgZWxlbWVudCBtdXN0IGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3JkZXIgaW4KLQkgICAgd2hpY2ggdGhlIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZC4gSWYgdGhlIHZhbHVlCi0JICAgIGlzIGEgbmVnYXRpdmUgaW50ZWdlciwgb3IgdGhlIGVsZW1lbnQgaXMgbm90Ci0JICAgIHByZXNlbnQsIHRoZSBjb250YWluZXIgaXMgZnJlZSB0byBsb2FkIHRoZSBzZXJ2bGV0Ci0JICAgIHdoZW5ldmVyIGl0IGNob29zZXMuIElmIHRoZSB2YWx1ZSBpcyBhIHBvc2l0aXZlCi0JICAgIGludGVnZXIgb3IgMCwgdGhlIGNvbnRhaW5lciBtdXN0IGxvYWQgYW5kCi0JICAgIGluaXRpYWxpemUgdGhlIHNlcnZsZXQgYXMgdGhlIGFwcGxpY2F0aW9uIGlzCi0JICAgIGRlcGxveWVkLiBUaGUgY29udGFpbmVyIG11c3QgZ3VhcmFudGVlIHRoYXQKLQkgICAgc2VydmxldHMgbWFya2VkIHdpdGggbG93ZXIgaW50ZWdlcnMgYXJlIGxvYWRlZAotCSAgICBiZWZvcmUgc2VydmxldHMgbWFya2VkIHdpdGggaGlnaGVyIGludGVnZXJzLiBUaGUKLQkgICAgY29udGFpbmVyIG1heSBjaG9vc2UgdGhlIG9yZGVyIG9mIGxvYWRpbmcgb2YKLQkgICAgc2VydmxldHMgd2l0aCB0aGUgc2FtZSBsb2FkLW9uLXN0YXJ0LXVwIHZhbHVlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJ1bi1hcyIKLQkJICAgdHlwZT0iamF2YWVlOnJ1bi1hc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktcm9sZS1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbi1jb25maWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2Vzc2lvbi1jb25maWdUeXBlIGRlZmluZXMgdGhlIHNlc3Npb24gcGFyYW1ldGVycwotCWZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLXRpbWVvdXQiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RJbnRlZ2VyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQKLQkgICAgc2Vzc2lvbiB0aW1lb3V0IGludGVydmFsIGZvciBhbGwgc2Vzc2lvbnMgY3JlYXRlZAotCSAgICBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHNwZWNpZmllZCB0aW1lb3V0Ci0JICAgIG11c3QgYmUgZXhwcmVzc2VkIGluIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuCi0JICAgIElmIHRoZSB0aW1lb3V0IGlzIDAgb3IgbGVzcywgdGhlIGNvbnRhaW5lciBlbnN1cmVzCi0JICAgIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBzZXNzaW9ucyBpcyBuZXZlciB0byB0aW1lCi0JICAgIG91dC4gSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBjb250YWluZXIKLQkgICAgbXVzdCBzZXQgaXRzIGRlZmF1bHQgdGltZW91dCBwZXJpb2QuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNwb3J0LWd1YXJhbnRlZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSBzcGVjaWZpZXMgdGhhdCB0aGUgY29tbXVuaWNhdGlvbgotCWJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgc2hvdWxkIGJlIE5PTkUsIElOVEVHUkFMLCBvcgotCUNPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdAotCXJlcXVpcmUgYW55IHRyYW5zcG9ydCBndWFyYW50ZWVzLiBBIHZhbHVlIG9mIElOVEVHUkFMIG1lYW5zCi0JdGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBzZW50IGJldHdlZW4gdGhlCi0JY2xpZW50IGFuZCBzZXJ2ZXIgYmUgc2VudCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgY2FuJ3QgYmUKLQljaGFuZ2VkIGluIHRyYW5zaXQuIENPTkZJREVOVElBTCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbgotCXJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgYmUgdHJhbnNtaXR0ZWQgaW4gYSBmYXNoaW9uIHRoYXQKLQlwcmV2ZW50cyBvdGhlciBlbnRpdGllcyBmcm9tIG9ic2VydmluZyB0aGUgY29udGVudHMgb2YgdGhlCi0JdHJhbnNtaXNzaW9uLiBJbiBtb3N0IGNhc2VzLCB0aGUgcHJlc2VuY2Ugb2YgdGhlIElOVEVHUkFMIG9yCi0JQ09ORklERU5USUFMIGZsYWcgd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSB1c2Ugb2YgU1NMIGlzCi0JcmVxdWlyZWQuCi0KLQlVc2VkIGluOiB1c2VyLWRhdGEtY29uc3RyYWludAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR1JBTCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPTkZJREVOVElBTCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVzZXItZGF0YS1jb25zdHJhaW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHVzZXItZGF0YS1jb25zdHJhaW50VHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIGhvdwotCWRhdGEgY29tbXVuaWNhdGVkIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgY29udGFpbmVyIHNob3VsZCBiZQotCXByb3RlY3RlZC4KLQotCVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydC1ndWFyYW50ZWUiCi0JCSAgIHR5cGU9ImphdmFlZTp0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Indhci1wYXRoVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBkZXNpZ25hdGUgYSBwYXRoIHN0YXJ0aW5nCi0Jd2l0aCBhICIvIiBhbmQgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgYSBXQVIKLQlmaWxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOnBhdHRlcm4gdmFsdWU9Ii8uKiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0id2ViLWFwcC12ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSByZWNvZ25pemVkIHZlcnNpb25zIG9mCi0Jd2ViLWFwcGxpY2F0aW9uIHN1cHBvcnRlZC4gSXQgaXMgdXNlZCB0byBkZXNpZ25hdGUgdGhlCi0JdmVyc2lvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMi41Ii8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYi1hcHBUeXBlIj4KLQotICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzdHJpYnV0YWJsZSIKLQkJICAgdHlwZT0iamF2YWVlOmVtcHR5VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRleHQtcGFyYW0iCi0JCSAgIHR5cGU9ImphdmFlZTpwYXJhbS12YWx1ZVR5cGUiPgotCi0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBjb250ZXh0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uCi0JICAgIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3Mgc2VydmxldCBjb250ZXh0Ci0JICAgIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiCi0JCSAgIHR5cGU9ImphdmFlZTpmaWx0ZXJUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLW1hcHBpbmciCi0JCSAgIHR5cGU9ImphdmFlZTpmaWx0ZXItbWFwcGluZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaXN0ZW5lciIKLQkJICAgdHlwZT0iamF2YWVlOmxpc3RlbmVyVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQiCi0JCSAgIHR5cGU9ImphdmFlZTpzZXJ2bGV0VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbWFwcGluZyIKLQkJICAgdHlwZT0iamF2YWVlOnNlcnZsZXQtbWFwcGluZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLWNvbmZpZyIKLQkJICAgdHlwZT0iamF2YWVlOnNlc3Npb24tY29uZmlnVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbWUtbWFwcGluZyIKLQkJICAgdHlwZT0iamF2YWVlOm1pbWUtbWFwcGluZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWxjb21lLWZpbGUtbGlzdCIKLQkJICAgdHlwZT0iamF2YWVlOndlbGNvbWUtZmlsZS1saXN0VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVycm9yLXBhZ2UiCi0JCSAgIHR5cGU9ImphdmFlZTplcnJvci1wYWdlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpzcC1jb25maWciCi0JCSAgIHR5cGU9ImphdmFlZTpqc3AtY29uZmlnVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LWNvbnN0cmFpbnQiCi0JCSAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1jb25zdHJhaW50VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luLWNvbmZpZyIKLQkJICAgdHlwZT0iamF2YWVlOmxvZ2luLWNvbmZpZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlIgotCQkgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktcm9sZVR5cGUiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6am5kaUVudmlyb25tZW50UmVmc0dyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCIKLQkJICAgdHlwZT0iamF2YWVlOmxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3RUeXBlIi8+Ci0gICAgPC94c2Q6Y2hvaWNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOndlYi1hcHAtdmVyc2lvblR5cGUiCi0JCSAgIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBkZWZpbmVzIHdoZXRoZXIgdGhpcwotCSAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFuZCBvdGhlciByZWxhdGVkIGRlcGxveW1lbnQKLQkgIGRlc2NyaXB0b3JzIGZvciB0aGlzIG1vZHVsZSAoZS5nLiwgd2ViIHNlcnZpY2UKLQkgIGRlc2NyaXB0b3JzKSBhcmUgY29tcGxldGUsIG9yIHdoZXRoZXIgdGhlIGNsYXNzCi0JICBmaWxlcyBhdmFpbGFibGUgdG8gdGhpcyBtb2R1bGUgYW5kIHBhY2thZ2VkIHdpdGgKLQkgIHRoaXMgYXBwbGljYXRpb24gc2hvdWxkIGJlIGV4YW1pbmVkIGZvciBhbm5vdGF0aW9ucwotCSAgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQgaW5mb3JtYXRpb24uCi0KLQkgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIHNldCB0byAidHJ1ZSIsIHRoZSBkZXBsb3ltZW50Ci0JICB0b29sIG11c3QgaWdub3JlIGFueSBhbm5vdGF0aW9ucyB0aGF0IHNwZWNpZnkgZGVwbG95bWVudAotCSAgaW5mb3JtYXRpb24sIHdoaWNoIG1pZ2h0IGJlIHByZXNlbnQgaW4gdGhlIGNsYXNzIGZpbGVzCi0JICBvZiB0aGUgYXBwbGljYXRpb24uCi0KLQkgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgc2V0IHRvCi0JICAiZmFsc2UiLCB0aGUgZGVwbG95bWVudCB0b29sIG11c3QgZXhhbWluZSB0aGUgY2xhc3MKLQkgIGZpbGVzIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgYW5ub3RhdGlvbnMsIGFzCi0JICBzcGVjaWZpZWQgYnkgdGhlIHNwZWNpZmljYXRpb25zLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotCi0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWItcmVzb3VyY2UtY29sbGVjdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3ZWItcmVzb3VyY2UtY29sbGVjdGlvblR5cGUgaXMgdXNlZCB0byBpZGVudGlmeSBhIHN1YnNldAotCW9mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluCi0JYSB3ZWIgYXBwbGljYXRpb24gdG8gd2hpY2ggYSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMuIElmCi0Jbm8gSFRUUCBtZXRob2RzIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnQKLQlhcHBsaWVzIHRvIGFsbCBIVFRQIG1ldGhvZHMuCi0KLQlVc2VkIGluOiBzZWN1cml0eS1jb25zdHJhaW50Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLXJlc291cmNlLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd2ViLXJlc291cmNlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyB3ZWIKLQkgICAgcmVzb3VyY2UgY29sbGVjdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgotCQkgICB0eXBlPSJqYXZhZWU6dXJsLXBhdHRlcm5UeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imh0dHAtbWV0aG9kIgotCQkgICB0eXBlPSJqYXZhZWU6aHR0cC1tZXRob2RUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VsY29tZS1maWxlLWxpc3RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd2VsY29tZS1maWxlLWxpc3QgY29udGFpbnMgYW4gb3JkZXJlZCBsaXN0IG9mIHdlbGNvbWUKLQlmaWxlcyBlbGVtZW50cy4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWxjb21lLWZpbGUiCi0JCSAgIHR5cGU9InhzZDpzdHJpbmciCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdlbGNvbWUtZmlsZSBlbGVtZW50IGNvbnRhaW5zIGZpbGUgbmFtZSB0byB1c2UKLQkgICAgYXMgYSBkZWZhdWx0IHdlbGNvbWUgZmlsZSwgc3VjaCBhcyBpbmRleC5odG1sCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfM18wLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8zXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmNkZjQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8zXzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICAgICAgICAgdmVyc2lvbj0iMy4wIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLSAgICAgIAotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwOSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICAgICAKLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbgotICAgICAgRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlCi0gICAgICAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgICB0aGUgTGljZW5zZS4gWW91IGNhbiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgICBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWwgb3IKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKLSAgICAgIExpY2Vuc2UuCi0gICAgICAKLSAgICAgIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyCi0gICAgICBOb3RpY2UgaW4gZWFjaCBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gICAgICBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzCi0gICAgICBwcm92aWRlZCBieSBTdW4gaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZSBmaWxlCi0gICAgICB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4gIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nCi0gICAgICBiZWxvdyB0aGUgTGljZW5zZSBIZWFkZXIsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBbXQotICAgICAgcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gICAgICAiUG9ydGlvbnMgQ29weXJpZ2h0ZWQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0gICAgICAKLSAgICAgIENvbnRyaWJ1dG9yKHMpOgotICAgICAgCi0gICAgICBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlCi0gICAgICBDRERMIG9yIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nCi0gICAgICAiW0NvbnRyaWJ1dG9yXSBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMKLSAgICAgIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UKLSAgICAgIGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhIHJlY2lwaWVudCBoYXMgdGhlCi0gICAgICBvcHRpb24gdG8gZGlzdHJpYnV0ZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUKLSAgICAgIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8gaXRzCi0gICAgICBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIKLSAgICAgIGNvZGUgYW5kIHRoZXJlZm9yZSwgZWxlY3RlZCB0aGUgR1BMIFZlcnNpb24gMiBsaWNlbnNlLCB0aGVuIHRoZQotICAgICAgb3B0aW9uIGFwcGxpZXMgb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2gKLSAgICAgIG9wdGlvbiBieSB0aGUgY29weXJpZ2h0IGhvbGRlci4KLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBW1sKLSAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBTZXJ2bGV0IDMuMCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gICAgICBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgbmFtZWQgIldFQi1JTkYvd2ViLnhtbCIgaW4gdGhlCi0gICAgICB3ZWIgYXBwbGljYXRpb24ncyB3YXIgZmlsZS4gIEFsbCBTZXJ2bGV0IGRlcGxveW1lbnQgZGVzY3JpcHRvcnMKLSAgICAgIG11c3QgaW5kaWNhdGUgdGhlIHdlYiBhcHBsaWNhdGlvbiBzY2hlbWEgYnkgdXNpbmcgdGhlIEphdmEgRUUKLSAgICAgIG5hbWVzcGFjZToKLSAgICAgIAotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIAotICAgICAgCi0gICAgICBhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5IAotICAgICAgdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzogCi0gICAgICAKLSAgICAgIDx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSIuLi4iCi0gICAgICB2ZXJzaW9uPSIzLjAiPiAKLSAgICAgIC4uLgotICAgICAgPC93ZWItYXBwPgotICAgICAgCi0gICAgICBUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLSAgICAgIHRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIEphdmEgRUUKLSAgICAgIG5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0gICAgICAKLSAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QKLSAgICAgIAotICAgICAgXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0gICAgICAKLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLSAgICAgIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0gICAgICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAgICAgIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLSAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0gICAgICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICAgICAgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0gICAgICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJ3ZWItY29tbW9uXzNfMC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9IndlYi1hcHAiCi0gICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6d2ViLWFwcFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgd2ViLWFwcCBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBkZXBsb3ltZW50Ci0gICAgICAgIGRlc2NyaXB0b3IgZm9yIGEgd2ViIGFwcGxpY2F0aW9uLiAgTm90ZSB0aGF0IHRoZSBzdWItZWxlbWVudHMKLSAgICAgICAgb2YgdGhpcyBlbGVtZW50IGNhbiBiZSBpbiB0aGUgYXJiaXRyYXJ5IG9yZGVyLiBCZWNhdXNlIG9mCi0gICAgICAgIHRoYXQsIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIGVsZW1lbnRzIG9mIGRpc3RyaWJ1dGFibGUsCi0gICAgICAgIHNlc3Npb24tY29uZmlnLCB3ZWxjb21lLWZpbGUtbGlzdCwganNwLWNvbmZpZywgbG9naW4tY29uZmlnLAotICAgICAgICBhbmQgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCB3YXMgY2hhbmdlZCBmcm9tICI/IiB0byAiKiIKLSAgICAgICAgaW4gdGhpcyBzY2hlbWEuICBIb3dldmVyLCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGluc3RhbmNlCi0gICAgICAgIGZpbGUgbXVzdCBub3QgY29udGFpbiBtdWx0aXBsZSBlbGVtZW50cyBvZiBzZXNzaW9uLWNvbmZpZywKLSAgICAgICAganNwLWNvbmZpZywgYW5kIGxvZ2luLWNvbmZpZy4gV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZWxlbWVudHMgb2YKLSAgICAgICAgd2VsY29tZS1maWxlLWxpc3Qgb3IgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCwgdGhlIGNvbnRhaW5lcgotICAgICAgICBtdXN0IGNvbmNhdGVuYXRlIHRoZSBlbGVtZW50IGNvbnRlbnRzLiAgVGhlIG11bHRpcGxlIG9jY3VyZW5jZQotICAgICAgICBvZiB0aGUgZWxlbWVudCBkaXN0cmlidXRhYmxlIGlzIHJlZHVuZGFudCBhbmQgdGhlIGNvbnRhaW5lcgotICAgICAgICB0cmVhdHMgdGhhdCBjYXNlIGV4YWN0bHkgaW4gdGhlIHNhbWUgd2F5IHdoZW4gdGhlcmUgaXMgb25seQotICAgICAgICBvbmUgZGlzdHJpYnV0YWJsZS4gCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1jb21tb24tc2VydmxldC1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgc2VydmxldCBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgc2VydmxldC4KLSAgICAgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6c2VydmxldCIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnNlcnZsZXQtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItY29tbW9uLWZpbHRlci1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgZmlsdGVyIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWx0ZXIuCi0gICAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmZpbHRlciIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmZpbHRlci1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1jb21tb24tZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgZWpiLWxvY2FsLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0gICAgICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgd2ViCi0gICAgICAgICAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0gICAgICAgICAgdGhlIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAKLSAgICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1sb2NhbC1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTplamItcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWNvbW1vbi1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLSAgICAgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSB3ZWIKLSAgICAgICAgICBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLSAgICAgICAgICB0aGUgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgIAotICAgICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItY29tbW9uLXJlc291cmNlLWVudi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKLSAgICAgICAgICBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzIHRoZQotICAgICAgICAgIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUuCi0gICAgICAgICAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKLSAgICAgICAgICBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWNvbW1vbi1tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKLSAgICAgICAgICBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0gICAgICAgICAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gY29kZS4KLSAgICAgICAgICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudgotICAgICAgICAgIGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1jb21tb24tcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLSAgICAgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZQotICAgICAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0gICAgICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpyZXMtcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWNvbW1vbi1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSB3ZWIKLSAgICAgICAgICBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0gICAgICAgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUKLSAgICAgICAgICBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVudi1lbnRyeSIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmVudi1lbnRyeS1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICAgIDx4c2Q6a2V5IG5hbWU9IndlYi1jb21tb24tcm9sZS1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIEEgcm9sZS1uYW1lLWtleSBpcyBzcGVjaWZpZWQgdG8gYWxsb3cgdGhlIHJlZmVyZW5jZXMKLSAgICAgICAgICBmcm9tIHRoZSBzZWN1cml0eS1yb2xlLXJlZnMuCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnNlY3VyaXR5LXJvbGUiLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpyb2xlLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0gICAgPHhzZDprZXlyZWYgbmFtZT0id2ViLWNvbW1vbi1yb2xlLW5hbWUtcmVmZXJlbmNlcyIKLSAgICAgICAgICAgICAgICByZWZlcj0iamF2YWVlOndlYi1jb21tb24tcm9sZS1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBrZXlyZWYgaW5kaWNhdGVzIHRoZSByZWZlcmVuY2VzIGZyb20KLSAgICAgICAgICBzZWN1cml0eS1yb2xlLXJlZiB0byBhIHNwZWNpZmllZCByb2xlLW5hbWUuCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnNlcnZsZXQvamF2YWVlOnNlY3VyaXR5LXJvbGUtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6cm9sZS1saW5rIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotICA8L3hzZDplbGVtZW50PgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1jb21tb25fM18wLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWNvbW1vbl8zXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTk0YmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWNvbW1vbl8zXzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgICAgICAgIHZlcnNpb249IjMuMCI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0gICAgICAKLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICAgCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24KLSAgICAgIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZQotICAgICAgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICAgdGhlIExpY2Vuc2UuIFlvdSBjYW4gb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sIG9yCi0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0gICAgICBMaWNlbnNlLgotICAgICAgCi0gICAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlcgotICAgICAgTm90aWNlIGluIGVhY2ggZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0Ci0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICAgICAgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcwotICAgICAgcHJvdmlkZWQgYnkgU3VuIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UgZmlsZQotICAgICAgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZwotICAgICAgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10KLSAgICAgIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICAgIlBvcnRpb25zIENvcHlyaWdodGVkIFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotICAgICAgCi0gICAgICBDb250cmlidXRvcihzKToKLSAgICAgIAotICAgICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZQotICAgICAgQ0RETCBvciBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZwotICAgICAgIltDb250cmlidXRvcl0gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTCBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91Ci0gICAgICBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYSByZWNpcGllbnQgaGFzIHRoZQotICAgICAgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlCi0gICAgICBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvIGl0cwotICAgICAgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyCi0gICAgICBjb2RlIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUKLSAgICAgIG9wdGlvbiBhcHBsaWVzIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoCi0gICAgICBvcHRpb24gYnkgdGhlIGNvcHlyaWdodCBob2xkZXIuCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVtbCi0gICAgICBUaGlzIGlzIHRoZSBjb21tb24gWE1MIFNjaGVtYSBmb3IgdGhlIFNlcnZsZXQgMy4wIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAgICAgIFRoaXMgZmlsZSBpcyBpbiB0dXJuIHVzZWQgYnkgd2ViLnhtbCBhbmQgd2ViLWZyYWdtZW50LnhtbAotICAgICAgd2ViIGFwcGxpY2F0aW9uJ3Mgd2FyIGZpbGUuICBBbGwgU2VydmxldCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCi0gICAgICBtdXN0IGluZGljYXRlIHRoZSB3ZWIgY29tbW9uIHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRQotICAgICAgbmFtZXNwYWNlOgotICAgICAgCi0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgCi0gICAgICAKLSAgICAgIGFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkgCi0gICAgICB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OiAKLSAgICAgIAotICAgICAgPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICB4c2k6c2NoZW1hTG9jYXRpb249Ii4uLiIKLSAgICAgIHZlcnNpb249IjMuMCI+IAotICAgICAgLi4uCi0gICAgICA8L3dlYi1hcHA+Ci0gICAgICAKLSAgICAgIFRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotICAgICAgdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSmF2YSBFRQotICAgICAgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLSAgICAgIAotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1jb21tb25fM18wLnhzZAotICAgICAgCi0gICAgICBdXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLSAgICAgIAotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICAgICAgc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICAgICAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICAgICAgc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAgICAgIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gICAgICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgICAgIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV82LnhzZCIvPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ianNwXzJfMi54c2QiLz4KLQotICA8eHNkOmdyb3VwIG5hbWU9IndlYi1jb21tb25UeXBlIj4KLSAgICA8eHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3RyaWJ1dGFibGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVtcHR5VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRleHQtcGFyYW0iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhcmFtLXZhbHVlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBjb250ZXh0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uCi0gICAgICAgICAgICBvZiBhIHdlYiBhcHBsaWNhdGlvbidzIHNlcnZsZXQgY29udGV4dAotICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmlsdGVyVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1tYXBwaW5nIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmaWx0ZXItbWFwcGluZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaXN0ZW5lciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bGlzdGVuZXJUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VydmxldFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW1hcHBpbmciCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlcnZsZXQtbWFwcGluZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLWNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2Vzc2lvbi1jb25maWdUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWltZS1tYXBwaW5nIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTptaW1lLW1hcHBpbmdUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2VsY29tZS1maWxlLWxpc3QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOndlbGNvbWUtZmlsZS1saXN0VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVycm9yLXBhZ2UiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVycm9yLXBhZ2VUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianNwLWNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6anNwLWNvbmZpZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1jb25zdHJhaW50IgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1jb25zdHJhaW50VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luLWNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bG9naW4tY29uZmlnVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LXJvbGVUeXBlIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdFR5cGUiLz4KLSAgICA8L3hzZDpjaG9pY2U+Ci0gIDwveHNkOmdyb3VwPgotCi0gIDx4c2Q6YXR0cmlidXRlR3JvdXAgbmFtZT0id2ViLWNvbW1vbi1hdHRyaWJ1dGVzIj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp3ZWItYXBwLXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgZGVmaW5lcyB3aGV0aGVyIHRoaXMKLSAgICAgICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYW5kIG90aGVyIHJlbGF0ZWQgZGVwbG95bWVudAotICAgICAgICAgIGRlc2NyaXB0b3JzIGZvciB0aGlzIG1vZHVsZSAoZS5nLiwgd2ViIHNlcnZpY2UKLSAgICAgICAgICBkZXNjcmlwdG9ycykgYXJlIGNvbXBsZXRlLCBvciB3aGV0aGVyIHRoZSBjbGFzcwotICAgICAgICAgIGZpbGVzIGF2YWlsYWJsZSB0byB0aGlzIG1vZHVsZSBhbmQgcGFja2FnZWQgd2l0aAotICAgICAgICAgIHRoaXMgYXBwbGljYXRpb24gc2hvdWxkIGJlIGV4YW1pbmVkIGZvciBhbm5vdGF0aW9ucwotICAgICAgICAgIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50IGluZm9ybWF0aW9uLgotICAgICAgICAgIAotICAgICAgICAgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIHNldCB0byAidHJ1ZSIsIHRoZSBkZXBsb3ltZW50Ci0gICAgICAgICAgdG9vbCBtdXN0IGlnbm9yZSBhbnkgYW5ub3RhdGlvbnMgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQKLSAgICAgICAgICBpbmZvcm1hdGlvbiwgd2hpY2ggbWlnaHQgYmUgcHJlc2VudCBpbiB0aGUgY2xhc3MgZmlsZXMKLSAgICAgICAgICBvZiB0aGUgYXBwbGljYXRpb24uCi0gICAgICAgICAgCi0gICAgICAgICAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgbm90IHNwZWNpZmllZCBvciBpcyBzZXQgdG8KLSAgICAgICAgICAiZmFsc2UiLCB0aGUgZGVwbG95bWVudCB0b29sIG11c3QgZXhhbWluZSB0aGUgY2xhc3MKLSAgICAgICAgICBmaWxlcyBvZiB0aGUgYXBwbGljYXRpb24gZm9yIGFubm90YXRpb25zLCBhcwotICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgc3BlY2lmaWNhdGlvbnMuCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6YXR0cmlidXRlR3JvdXA+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2ViLWFwcFR5cGUiPgotICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibW9kdWxlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6d2ViLWNvbW1vblR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhYnNvbHV0ZS1vcmRlcmluZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YWJzb2x1dGVPcmRlcmluZ1R5cGUiLz4KLSAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGVHcm91cCByZWY9ImphdmFlZTp3ZWItY29tbW9uLWF0dHJpYnV0ZXMiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2ViLWZyYWdtZW50VHlwZSI+Ci0gICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOndlYi1jb21tb25UeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXJpbmciCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm9yZGVyaW5nVHlwZSIvPgotICAgIDwveHNkOmNob2ljZT4KLSAgICA8eHNkOmF0dHJpYnV0ZUdyb3VwIHJlZj0iamF2YWVlOndlYi1jb21tb24tYXR0cmlidXRlcyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdXRoLWNvbnN0cmFpbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGF1dGgtY29uc3RyYWludFR5cGUgaW5kaWNhdGVzIHRoZSB1c2VyIHJvbGVzIHRoYXQKLSAgICAgICAgc2hvdWxkIGJlIHBlcm1pdHRlZCBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZQotICAgICAgICBjb2xsZWN0aW9uLiBUaGUgcm9sZS1uYW1lIHVzZWQgaGVyZSBtdXN0IGVpdGhlciBjb3JyZXNwb25kCi0gICAgICAgIHRvIHRoZSByb2xlLW5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzCi0gICAgICAgIGRlZmluZWQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLCBvciBiZSB0aGUgc3BlY2lhbGx5Ci0gICAgICAgIHJlc2VydmVkIHJvbGUtbmFtZSAiKiIgdGhhdCBpcyBhIGNvbXBhY3Qgc3ludGF4IGZvcgotICAgICAgICBpbmRpY2F0aW5nIGFsbCByb2xlcyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBJZiBib3RoICIqIgotICAgICAgICBhbmQgcm9sZW5hbWVzIGFwcGVhciwgdGhlIGNvbnRhaW5lciBpbnRlcnByZXRzIHRoaXMgYXMgYWxsCi0gICAgICAgIHJvbGVzLiAgSWYgbm8gcm9sZXMgYXJlIGRlZmluZWQsIG5vIHVzZXIgaXMgYWxsb3dlZCBhY2Nlc3MKLSAgICAgICAgdG8gdGhlIHBvcnRpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXNjcmliZWQgYnkgdGhlCi0gICAgICAgIGNvbnRhaW5pbmcgc2VjdXJpdHktY29uc3RyYWludC4gIFRoZSBjb250YWluZXIgbWF0Y2hlcwotICAgICAgICByb2xlIG5hbWVzIGNhc2Ugc2Vuc2l0aXZlbHkgd2hlbiBkZXRlcm1pbmluZyBhY2Nlc3MuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnJvbGUtbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF1dGgtbWV0aG9kVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhdXRoLW1ldGhvZFR5cGUgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCi0gICAgICAgIG1lY2hhbmlzbSBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbi4gQXMgYSBwcmVyZXF1aXNpdGUgdG8KLSAgICAgICAgZ2FpbmluZyBhY2Nlc3MgdG8gYW55IHdlYiByZXNvdXJjZXMgd2hpY2ggYXJlIHByb3RlY3RlZCBieQotICAgICAgICBhbiBhdXRob3JpemF0aW9uIGNvbnN0cmFpbnQsIGEgdXNlciBtdXN0IGhhdmUgYXV0aGVudGljYXRlZAotICAgICAgICB1c2luZyB0aGUgY29uZmlndXJlZCBtZWNoYW5pc20uIExlZ2FsIHZhbHVlcyBhcmUgIkJBU0lDIiwKLSAgICAgICAgIkRJR0VTVCIsICJGT1JNIiwgIkNMSUVOVC1DRVJUIiwgb3IgYSB2ZW5kb3Itc3BlY2lmaWMKLSAgICAgICAgYXV0aGVudGljYXRpb24gc2NoZW1lLgotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogbG9naW4tY29uZmlnCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc3BhdGNoZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGRpc3BhdGNoZXIgaGFzIGZpdmUgbGVnYWwgdmFsdWVzOiBGT1JXQVJELCBSRVFVRVNULAotICAgICAgICBJTkNMVURFLCBBU1lOQywgYW5kIEVSUk9SLgotICAgICAgICAKLSAgICAgICAgQSB2YWx1ZSBvZiBGT1JXQVJEIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHVuZGVyCi0gICAgICAgIFJlcXVlc3REaXNwYXRjaGVyLmZvcndhcmQoKSBjYWxscy4KLSAgICAgICAgQSB2YWx1ZSBvZiBSRVFVRVNUIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHVuZGVyCi0gICAgICAgIG9yZGluYXJ5IGNsaWVudCBjYWxscyB0byB0aGUgcGF0aCBvciBzZXJ2bGV0LgotICAgICAgICBBIHZhbHVlIG9mIElOQ0xVREUgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIKLSAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIuaW5jbHVkZSgpIGNhbGxzLgotICAgICAgICBBIHZhbHVlIG9mIEFTWU5DIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHVuZGVyCi0gICAgICAgIGNhbGxzIGRpc3BhdGNoZWQgZnJvbSBhbiBBc3luY0NvbnRleHQuCi0gICAgICAgIEEgdmFsdWUgb2YgRVJST1IgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIgdGhlCi0gICAgICAgIGVycm9yIHBhZ2UgbWVjaGFuaXNtLgotICAgICAgICAKLSAgICAgICAgVGhlIGFic2VuY2Ugb2YgYW55IGRpc3BhdGNoZXIgZWxlbWVudHMgaW4gYSBmaWx0ZXItbWFwcGluZwotICAgICAgICBpbmRpY2F0ZXMgYSBkZWZhdWx0IG9mIGFwcGx5aW5nIGZpbHRlcnMgb25seSB1bmRlciBvcmRpbmFyeQotICAgICAgICBjbGllbnQgY2FsbHMgdG8gdGhlIHBhdGggb3Igc2VydmxldC4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk9SV0FSRCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTkNMVURFIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFUVVFU1QiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNZTkMiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVJST1IiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVycm9yLWNvZGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVycm9yLWNvZGUgY29udGFpbnMgYW4gSFRUUCBlcnJvciBjb2RlLCBleDogNDA0Ci0gICAgICAgIAotICAgICAgICBVc2VkIGluOiBlcnJvci1wYWdlCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnhzZFBvc2l0aXZlSW50ZWdlclR5cGUiPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlxkezN9Ii8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVycm9yLXBhZ2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVycm9yLXBhZ2VUeXBlIGNvbnRhaW5zIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGVycm9yIGNvZGUKLSAgICAgICAgb3IgZXhjZXB0aW9uIHR5cGUgdG8gdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbiB0aGUgd2ViCi0gICAgICAgIGFwcGxpY2F0aW9uLgotICAgICAgICAKLSAgICAgICAgRXJyb3ItcGFnZSBkZWNsYXJhdGlvbnMgdXNpbmcgdGhlIGV4Y2VwdGlvbi10eXBlIGVsZW1lbnQgaW4KLSAgICAgICAgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIHVuaXF1ZSB1cCB0byB0aGUgY2xhc3MgbmFtZSBvZgotICAgICAgICB0aGUgZXhjZXB0aW9uLXR5cGUuIFNpbWlsYXJseSwgZXJyb3ItcGFnZSBkZWNsYXJhdGlvbnMgdXNpbmcgdGhlCi0gICAgICAgIHN0YXR1cy1jb2RlIGVsZW1lbnQgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgICAgICB1cCB0byB0aGUgc3RhdHVzIGNvZGUuCi0gICAgICAgIAotICAgICAgICBVc2VkIGluOiB3ZWItYXBwCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXJyb3ItY29kZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTplcnJvci1jb2RlVHlwZSIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSBleGNlcHRpb24tdHlwZSBjb250YWlucyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotICAgICAgICAgICAgICBuYW1lIG9mIGEgSmF2YSBleGNlcHRpb24gdHlwZS4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYXRpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOndhci1wYXRoVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBsb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUKLSAgICAgICAgICAgIHJlc291cmNlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAgICAgICAgICAgIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gbXVzdCBoYXZlCi0gICAgICAgICAgICBhIGxlYWRpbmcgYC8nLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpbHRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZmlsdGVyVHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYSBmaWx0ZXIgaW4gdGhlIHdlYgotICAgICAgICBhcHBsaWNhdGlvbi4gVGhlIGZpbHRlciBpcyBtYXBwZWQgdG8gZWl0aGVyIGEgc2VydmxldCBvciBhCi0gICAgICAgIFVSTCBwYXR0ZXJuIGluIHRoZSBmaWx0ZXItbWFwcGluZyBlbGVtZW50LCB1c2luZyB0aGUKLSAgICAgICAgZmlsdGVyLW5hbWUgdmFsdWUgdG8gcmVmZXJlbmNlLiBGaWx0ZXJzIGNhbiBhY2Nlc3MgdGhlCi0gICAgICAgIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZGVjbGFyZWQgaW4gdGhlIGRlcGxveW1lbnQKLSAgICAgICAgZGVzY3JpcHRvciBhdCBydW50aW1lIHZpYSB0aGUgRmlsdGVyQ29uZmlnIGludGVyZmFjZS4KLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IHdlYi1hcHAKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmaWx0ZXItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBmaWx0ZXIuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3luYy1zdXBwb3J0ZWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhcmFtLXZhbHVlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzCi0gICAgICAgICAgICBhbiBpbml0aWFsaXphdGlvbiBwYXJhbSBvZiBhIHNlcnZsZXQgZmlsdGVyCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmlsdGVyLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVjbGFyYXRpb24gb2YgdGhlIGZpbHRlciBtYXBwaW5ncyBpbiB0aGlzIHdlYgotICAgICAgICBhcHBsaWNhdGlvbiBpcyBkb25lIGJ5IHVzaW5nIGZpbHRlci1tYXBwaW5nVHlwZS4gCi0gICAgICAgIFRoZSBjb250YWluZXIgdXNlcyB0aGUgZmlsdGVyLW1hcHBpbmcKLSAgICAgICAgZGVjbGFyYXRpb25zIHRvIGRlY2lkZSB3aGljaCBmaWx0ZXJzIHRvIGFwcGx5IHRvIGEgcmVxdWVzdCwKLSAgICAgICAgYW5kIGluIHdoYXQgb3JkZXIuIFRoZSBjb250YWluZXIgbWF0Y2hlcyB0aGUgcmVxdWVzdCBVUkkgdG8KLSAgICAgICAgYSBTZXJ2bGV0IGluIHRoZSBub3JtYWwgd2F5LiBUbyBkZXRlcm1pbmUgd2hpY2ggZmlsdGVycyB0bwotICAgICAgICBhcHBseSBpdCBtYXRjaGVzIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyBlaXRoZXIgb24KLSAgICAgICAgc2VydmxldC1uYW1lLCBvciBvbiB1cmwtcGF0dGVybiBmb3IgZWFjaCBmaWx0ZXItbWFwcGluZwotICAgICAgICBlbGVtZW50LCBkZXBlbmRpbmcgb24gd2hpY2ggc3R5bGUgaXMgdXNlZC4gVGhlIG9yZGVyIGluCi0gICAgICAgIHdoaWNoIGZpbHRlcnMgYXJlIGludm9rZWQgaXMgdGhlIG9yZGVyIGluIHdoaWNoCi0gICAgICAgIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0aGF0IG1hdGNoIGEgcmVxdWVzdCBVUkkgZm9yIGEKLSAgICAgICAgc2VydmxldCBhcHBlYXIgaW4gdGhlIGxpc3Qgb2YgZmlsdGVyLW1hcHBpbmcgZWxlbWVudHMuVGhlCi0gICAgICAgIGZpbHRlci1uYW1lIHZhbHVlIG11c3QgYmUgdGhlIHZhbHVlIG9mIHRoZSBmaWx0ZXItbmFtZQotICAgICAgICBzdWItZWxlbWVudHMgb2Ygb25lIG9mIHRoZSBmaWx0ZXIgZGVjbGFyYXRpb25zIGluIHRoZQotICAgICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZpbHRlci1uYW1lVHlwZSIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIxIgotICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dXJsLXBhdHRlcm5UeXBlIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VydmxldC1uYW1lVHlwZSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmRpc3BhdGNoZXJUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm9uRW1wdHlTdHJpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyB0eXBlIGRlZmluZXMgYSBzdHJpbmcgd2hpY2ggY29udGFpbnMgYXQgbGVhc3Qgb25lCi0gICAgICAgIGNoYXJhY3Rlci4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDptaW5MZW5ndGggdmFsdWU9IjEiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpbHRlci1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGZpbHRlciBpcyBkZWNsYXJlCi0gICAgICAgIGJ5IHVzaW5nIGZpbHRlci1uYW1lVHlwZS4gVGhpcyBuYW1lIGlzIHVzZWQgdG8gbWFwIHRoZQotICAgICAgICBmaWx0ZXIuICBFYWNoIGZpbHRlciBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYgotICAgICAgICBhcHBsaWNhdGlvbi4KLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IGZpbHRlciwgZmlsdGVyLW1hcHBpbmcKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOm5vbkVtcHR5U3RyaW5nVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZvcm0tbG9naW4tY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBmb3JtLWxvZ2luLWNvbmZpZ1R5cGUgc3BlY2lmaWVzIHRoZSBsb2dpbiBhbmQgZXJyb3IKLSAgICAgICAgcGFnZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiBmb3JtIGJhc2VkIGxvZ2luLiBJZiBmb3JtIGJhc2VkCi0gICAgICAgIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCB1c2VkLCB0aGVzZSBlbGVtZW50cyBhcmUgaWdub3JlZC4KLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IGxvZ2luLWNvbmZpZwotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcm0tbG9naW4tcGFnZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6d2FyLXBhdGhUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGZvcm0tbG9naW4tcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIKLSAgICAgICAgICAgIGFwcCB3aGVyZSB0aGUgcGFnZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBsb2dpbiBjYW4gYmUKLSAgICAgICAgICAgIGZvdW5kLiAgVGhlIHBhdGggYmVnaW5zIHdpdGggYSBsZWFkaW5nIC8gYW5kIGlzIGludGVycHJldGVkCi0gICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV0FSLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1lcnJvci1wYWdlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp3YXItcGF0aFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZm9ybS1lcnJvci1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4KLSAgICAgICAgICAgIHRoZSB3ZWIgYXBwIHdoZXJlIHRoZSBlcnJvciBwYWdlIHRoYXQgaXMgZGlzcGxheWVkCi0gICAgICAgICAgICB3aGVuIGxvZ2luIGlzIG5vdCBzdWNjZXNzZnVsIGNhbiBiZSBmb3VuZC4gCi0gICAgICAgICAgICBUaGUgcGF0aCBiZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMgaW50ZXJwcmV0ZWQKLSAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Imh0dHAtbWV0aG9kVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEEgSFRUUCBtZXRob2QgdHlwZSBhcyBkZWZpbmVkIGluIEhUVFAgMS4xIHNlY3Rpb24gMi4yLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlshLX4tW1woXCkmIzYwOyYjNjI7QCw7OiYjMzQ7L1xbXF0/PVx7XH1cXFxwe1p9XV0rIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvYWQtb24tc3RhcnR1cFR5cGUiPgotICAgIDx4c2Q6dW5pb24gbWVtYmVyVHlwZXM9ImphdmFlZTpudWxsLWNoYXJUeXBlIHhzZDppbnRlZ2VyIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im51bGwtY2hhclR5cGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dpbi1jb25maWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGxvZ2luLWNvbmZpZ1R5cGUgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCi0gICAgICAgIG1ldGhvZCB0aGF0IHNob3VsZCBiZSB1c2VkLCB0aGUgcmVhbG0gbmFtZSB0aGF0IHNob3VsZCBiZQotICAgICAgICB1c2VkIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgdGhlIGF0dHJpYnV0ZXMgdGhhdCBhcmUKLSAgICAgICAgbmVlZGVkIGJ5IHRoZSBmb3JtIGxvZ2luIG1lY2hhbmlzbS4KLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IHdlYi1hcHAKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdXRoLW1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YXV0aC1tZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWxtLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgcmVhbG0gbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgcmVhbG0gbmFtZSB0bwotICAgICAgICAgICAgdXNlIGluIEhUVFAgQmFzaWMgYXV0aG9yaXphdGlvbi4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcm0tbG9naW4tY29uZmlnIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmb3JtLWxvZ2luLWNvbmZpZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1pbWUtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbWltZS1tYXBwaW5nVHlwZSBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGV4dGVuc2lvbgotICAgICAgICBhbmQgYSBtaW1lIHR5cGUuCi0gICAgICAgIAotICAgICAgICBVc2VkIGluOiB3ZWItYXBwCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBleHRlbnNpb24gZWxlbWVudCBjb250YWlucyBhIHN0cmluZyBkZXNjcmliaW5nIGFuCi0gICAgICAgICAgZXh0ZW5zaW9uLiBleGFtcGxlOiAidHh0IgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbWUtdHlwZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bWltZS10eXBlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtaW1lLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIG1pbWUtdHlwZVR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZSBhIGRlZmluZWQgbWltZSB0eXBlLgotICAgICAgICAKLSAgICAgICAgRXhhbXBsZToKLSAgICAgICAgInRleHQvcGxhaW4iCi0gICAgICAgIAotICAgICAgICBVc2VkIGluOiBtaW1lLW1hcHBpbmcKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbXlxwe0NjfV5cc10rL1teXHB7Q2N9XlxzXSsiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIGlzIHVzZWQgdG8gYXNzb2NpYXRlCi0gICAgICAgIHNlY3VyaXR5IGNvbnN0cmFpbnRzIHdpdGggb25lIG9yIG1vcmUgd2ViIHJlc291cmNlCi0gICAgICAgIGNvbGxlY3Rpb25zCi0gICAgICAgIAotICAgICAgICBVc2VkIGluOiB3ZWItYXBwCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkaXNwbGF5LW5hbWVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp3ZWItcmVzb3VyY2UtY29sbGVjdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdXRoLWNvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmF1dGgtY29uc3RyYWludFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1kYXRhLWNvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnVzZXItZGF0YS1jb25zdHJhaW50VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmxldFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgc2VydmxldFR5cGUgaXMgdXNlZCB0byBkZWNsYXJlIGEgc2VydmxldC4KLSAgICAgICAgSXQgY29udGFpbnMgdGhlIGRlY2xhcmF0aXZlIGRhdGEgb2YgYQotICAgICAgICBzZXJ2bGV0LiBJZiBhIGpzcC1maWxlIGlzIHNwZWNpZmllZCBhbmQgdGhlIGxvYWQtb24tc3RhcnR1cAotICAgICAgICBlbGVtZW50IGlzIHByZXNlbnQsIHRoZW4gdGhlIEpTUCBzaG91bGQgYmUgcHJlY29tcGlsZWQgYW5kCi0gICAgICAgIGxvYWRlZC4KLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IHdlYi1hcHAKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VydmxldC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSBzZXJ2bGV0LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBzZXJ2bGV0LgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpzcC1maWxlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmpzcC1maWxlVHlwZSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhcmFtLXZhbHVlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2FkLW9uLXN0YXJ0dXAiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmxvYWQtb24tc3RhcnR1cFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoaXMKLSAgICAgICAgICAgIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZCAoaW5zdGFudGlhdGVkIGFuZCBoYXZlCi0gICAgICAgICAgICBpdHMgaW5pdCgpIGNhbGxlZCkgb24gdGhlIHN0YXJ0dXAgb2YgdGhlIHdlYgotICAgICAgICAgICAgYXBwbGljYXRpb24uIFRoZSBvcHRpb25hbCBjb250ZW50cyBvZiB0aGVzZQotICAgICAgICAgICAgZWxlbWVudCBtdXN0IGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3JkZXIgaW4KLSAgICAgICAgICAgIHdoaWNoIHRoZSBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQuIElmIHRoZSB2YWx1ZQotICAgICAgICAgICAgaXMgYSBuZWdhdGl2ZSBpbnRlZ2VyLCBvciB0aGUgZWxlbWVudCBpcyBub3QKLSAgICAgICAgICAgIHByZXNlbnQsIHRoZSBjb250YWluZXIgaXMgZnJlZSB0byBsb2FkIHRoZSBzZXJ2bGV0Ci0gICAgICAgICAgICB3aGVuZXZlciBpdCBjaG9vc2VzLiBJZiB0aGUgdmFsdWUgaXMgYSBwb3NpdGl2ZQotICAgICAgICAgICAgaW50ZWdlciBvciAwLCB0aGUgY29udGFpbmVyIG11c3QgbG9hZCBhbmQKLSAgICAgICAgICAgIGluaXRpYWxpemUgdGhlIHNlcnZsZXQgYXMgdGhlIGFwcGxpY2F0aW9uIGlzCi0gICAgICAgICAgICBkZXBsb3llZC4gVGhlIGNvbnRhaW5lciBtdXN0IGd1YXJhbnRlZSB0aGF0Ci0gICAgICAgICAgICBzZXJ2bGV0cyBtYXJrZWQgd2l0aCBsb3dlciBpbnRlZ2VycyBhcmUgbG9hZGVkCi0gICAgICAgICAgICBiZWZvcmUgc2VydmxldHMgbWFya2VkIHdpdGggaGlnaGVyIGludGVnZXJzLiBUaGUKLSAgICAgICAgICAgIGNvbnRhaW5lciBtYXkgY2hvb3NlIHRoZSBvcmRlciBvZiBsb2FkaW5nIG9mCi0gICAgICAgICAgICBzZXJ2bGV0cyB3aXRoIHRoZSBzYW1lIGxvYWQtb24tc3RhcnQtdXAgdmFsdWUuCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmFibGVkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3luYy1zdXBwb3J0ZWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJ1bi1hcyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cnVuLWFzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlLXJlZiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktcm9sZS1yZWZUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im11bHRpcGFydC1jb25maWciCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm11bHRpcGFydC1jb25maWdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmxldC1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBzZXJ2bGV0LW1hcHBpbmdUeXBlIGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYQotICAgICAgICBzZXJ2bGV0IGFuZCBhIHVybCBwYXR0ZXJuLiAKLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IHdlYi1hcHAKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlcnZsZXQtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dXJsLXBhdHRlcm5UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMSIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0LW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUKLSAgICAgICAgc2VydmxldC4gRWFjaCBzZXJ2bGV0IG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgd2ViCi0gICAgICAgIGFwcGxpY2F0aW9uLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqYXZhZWU6bm9uRW1wdHlTdHJpbmdUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbi1jb25maWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHNlc3Npb24tY29uZmlnVHlwZSBkZWZpbmVzIHRoZSBzZXNzaW9uIHBhcmFtZXRlcnMKLSAgICAgICAgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogd2ViLWFwcAotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tdGltZW91dCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkSW50ZWdlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgIHNlc3Npb24gdGltZW91dCBpbnRlcnZhbCBmb3IgYWxsIHNlc3Npb25zIGNyZWF0ZWQKLSAgICAgICAgICAgIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgc3BlY2lmaWVkIHRpbWVvdXQKLSAgICAgICAgICAgIG11c3QgYmUgZXhwcmVzc2VkIGluIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuCi0gICAgICAgICAgICBJZiB0aGUgdGltZW91dCBpcyAwIG9yIGxlc3MsIHRoZSBjb250YWluZXIgZW5zdXJlcwotICAgICAgICAgICAgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIHNlc3Npb25zIGlzIG5ldmVyIHRvIHRpbWUKLSAgICAgICAgICAgIG91dC4gSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBjb250YWluZXIKLSAgICAgICAgICAgIG11c3Qgc2V0IGl0cyBkZWZhdWx0IHRpbWVvdXQgcGVyaW9kLgotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29va2llLWNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6Y29va2llLWNvbmZpZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGNvb2tpZS1jb25maWcgZWxlbWVudCBkZWZpbmVzIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZQotICAgICAgICAgICAgc2Vzc2lvbiB0cmFja2luZyBjb29raWVzIGNyZWF0ZWQgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFja2luZy1tb2RlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cmFja2luZy1tb2RlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHRyYWNraW5nLW1vZGUgZWxlbWVudCBkZWZpbmVzIHRoZSB0cmFja2luZyBtb2RlcwotICAgICAgICAgICAgZm9yIHNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb29raWUtY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjb29raWUtY29uZmlnVHlwZSBkZWZpbmVzIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUKLSAgICAgICAgc2Vzc2lvbiB0cmFja2luZyBjb29raWVzIG9mIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogc2Vzc2lvbi1jb25maWcKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpjb29raWUtbmFtZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIG5hbWUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIGFueSBzZXNzaW9uIHRyYWNraW5nCi0gICAgICAgICAgICBjb29raWVzIGNyZWF0ZWQgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBKU0VTU0lPTklECi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkb21haW4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmNvb2tpZS1kb21haW5UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBkb21haW4gbmFtZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gYW55IHNlc3Npb24gdHJhY2tpbmcKLSAgICAgICAgICAgIGNvb2tpZXMgY3JlYXRlZCBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhdGgiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmNvb2tpZS1wYXRoVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgcGF0aCB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gYW55IHNlc3Npb24gdHJhY2tpbmcKLSAgICAgICAgICAgIGNvb2tpZXMgY3JlYXRlZCBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbW1lbnQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmNvb2tpZS1jb21tZW50VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgY29tbWVudCB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gYW55IHNlc3Npb24gdHJhY2tpbmcKLSAgICAgICAgICAgIGNvb2tpZXMgY3JlYXRlZCBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imh0dHAtb25seSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgYW55IHNlc3Npb24gdHJhY2tpbmcgY29va2llcyBjcmVhdGVkIAotICAgICAgICAgICAgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24gd2lsbCBiZSBtYXJrZWQgYXMgSHR0cE9ubHkKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgYW55IHNlc3Npb24gdHJhY2tpbmcgY29va2llcyBjcmVhdGVkIAotICAgICAgICAgICAgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24gd2lsbCBiZSBtYXJrZWQgYXMgc2VjdXJlCi0gICAgICAgICAgICBldmVuIGlmIHRoZSByZXF1ZXN0IHRoYXQgaW5pdGlhdGVkIHRoZSBjb3JyZXNwb25kaW5nIHNlc3Npb24KLSAgICAgICAgICAgIGlzIHVzaW5nIHBsYWluIEhUVFAgaW5zdGVhZCBvZiBIVFRQUwotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWF4LWFnZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkSW50ZWdlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGxpZmV0aW1lIChpbiBzZWNvbmRzKSB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gYW55Ci0gICAgICAgICAgICBzZXNzaW9uIHRyYWNraW5nIGNvb2tpZXMgY3JlYXRlZCBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAgIERlZmF1bHQgaXMgLTEKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb29raWUtbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbmFtZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gYW55IHNlc3Npb24gdHJhY2tpbmcKLSAgICAgICAgY29va2llcyBjcmVhdGVkIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICBUaGUgZGVmYXVsdCBpcyBKU0VTU0lPTklECi0gICAgICAgIAotICAgICAgICBVc2VkIGluOiBjb29raWUtY29uZmlnCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImphdmFlZTpub25FbXB0eVN0cmluZ1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb29raWUtZG9tYWluVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBkb21haW4gbmFtZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gYW55IHNlc3Npb24gdHJhY2tpbmcKLSAgICAgICAgY29va2llcyBjcmVhdGVkIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogY29va2llLWNvbmZpZwotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqYXZhZWU6bm9uRW1wdHlTdHJpbmdUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29va2llLXBhdGhUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHBhdGggdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIGFueSBzZXNzaW9uIHRyYWNraW5nCi0gICAgICAgIGNvb2tpZXMgY3JlYXRlZCBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IGNvb2tpZS1jb25maWcKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOm5vbkVtcHR5U3RyaW5nVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvb2tpZS1jb21tZW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBjb21tZW50IHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byBhbnkgc2Vzc2lvbiB0cmFja2luZwotICAgICAgICBjb29raWVzIGNyZWF0ZWQgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgIAotICAgICAgICBVc2VkIGluOiBjb29raWUtY29uZmlnCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImphdmFlZTpub25FbXB0eVN0cmluZ1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFja2luZy1tb2RlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSB0cmFja2luZyBtb2RlcyBmb3Igc2Vzc2lvbnMgY3JlYXRlZCBieSB0aGlzIHdlYgotICAgICAgICBhcHBsaWNhdGlvbgotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogc2Vzc2lvbi1jb25maWcKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ09PS0lFIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVSTCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTU0wiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIHNwZWNpZmllcyB0aGF0IHRoZSBjb21tdW5pY2F0aW9uCi0gICAgICAgIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgc2hvdWxkIGJlIE5PTkUsIElOVEVHUkFMLCBvcgotICAgICAgICBDT05GSURFTlRJQUwuIE5PTkUgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QKLSAgICAgICAgcmVxdWlyZSBhbnkgdHJhbnNwb3J0IGd1YXJhbnRlZXMuIEEgdmFsdWUgb2YgSU5URUdSQUwgbWVhbnMKLSAgICAgICAgdGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBzZW50IGJldHdlZW4gdGhlCi0gICAgICAgIGNsaWVudCBhbmQgc2VydmVyIGJlIHNlbnQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbid0IGJlCi0gICAgICAgIGNoYW5nZWQgaW4gdHJhbnNpdC4gQ09ORklERU5USUFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uCi0gICAgICAgIHJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgYmUgdHJhbnNtaXR0ZWQgaW4gYSBmYXNoaW9uIHRoYXQKLSAgICAgICAgcHJldmVudHMgb3RoZXIgZW50aXRpZXMgZnJvbSBvYnNlcnZpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZQotICAgICAgICB0cmFuc21pc3Npb24uIEluIG1vc3QgY2FzZXMsIHRoZSBwcmVzZW5jZSBvZiB0aGUgSU5URUdSQUwgb3IKLSAgICAgICAgQ09ORklERU5USUFMIGZsYWcgd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSB1c2Ugb2YgU1NMIGlzCi0gICAgICAgIHJlcXVpcmVkLgotICAgICAgICAKLSAgICAgICAgVXNlZCBpbjogdXNlci1kYXRhLWNvbnN0cmFpbnQKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR1JBTCIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT05GSURFTlRJQUwiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVzZXItZGF0YS1jb25zdHJhaW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSB1c2VyLWRhdGEtY29uc3RyYWludFR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZSBob3cKLSAgICAgICAgZGF0YSBjb21tdW5pY2F0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBjb250YWluZXIgc2hvdWxkIGJlCi0gICAgICAgIHByb3RlY3RlZC4KLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydC1ndWFyYW50ZWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Indhci1wYXRoVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbGVtZW50cyB0aGF0IHVzZSB0aGlzIHR5cGUgZGVzaWduYXRlIGEgcGF0aCBzdGFydGluZwotICAgICAgICB3aXRoIGEgIi8iIGFuZCBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiBhIFdBUgotICAgICAgICBmaWxlLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9Ii8uKiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IndlYi1hcHAtdmVyc2lvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIHR5cGUgY29udGFpbnMgdGhlIHJlY29nbml6ZWQgdmVyc2lvbnMgb2YKLSAgICAgICAgd2ViLWFwcGxpY2F0aW9uIHN1cHBvcnRlZC4gSXQgaXMgdXNlZCB0byBkZXNpZ25hdGUgdGhlCi0gICAgICAgIHZlcnNpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMy4wIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2ViLXJlc291cmNlLWNvbGxlY3Rpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZQotICAgICAgICByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgdG8gd2hpY2ggYQotICAgICAgICBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMuIElmIG5vIEhUVFAgbWV0aG9kcyBhcmUgc3BlY2lmaWVkLAotICAgICAgICB0aGVuIHRoZSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMgdG8gYWxsIEhUVFAgbWV0aG9kcy4KLSAgICAgICAgSWYgSFRUUCBtZXRob2RzIGFyZSBzcGVjaWZpZWQgYnkgaHR0cC1tZXRob2Qtb21pc3Npb24KLSAgICAgICAgZWxlbWVudHMsIHRoZSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMgdG8gYWxsIG1ldGhvZHMKLSAgICAgICAgZXhjZXB0IHRob3NlIGlkZW50aWZpZWQgaW4gdGhlIGNvbGxlY3Rpb24uCi0gICAgICAgIGh0dHAtbWV0aG9kLW9taXNzaW9uIGFuZCBodHRwLW1ldGhvZCBlbGVtZW50cyBhcmUgbmV2ZXIKLSAgICAgICAgbWl4ZWQgaW4gdGhlIHNhbWUgY29sbGVjdGlvbi4gCi0gICAgICAgIAotICAgICAgICBVc2VkIGluOiBzZWN1cml0eS1jb25zdHJhaW50Ci0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLXJlc291cmNlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSB3ZWItcmVzb3VyY2UtbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGlzIHdlYgotICAgICAgICAgICAgcmVzb3VyY2UgY29sbGVjdGlvbi4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnVybC1wYXR0ZXJuVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imh0dHAtbWV0aG9kIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmh0dHAtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgRWFjaCBodHRwLW1ldGhvZCBuYW1lcyBhbiBIVFRQIG1ldGhvZCB0byB3aGljaCB0aGUKLSAgICAgICAgICAgICAgY29uc3RyYWludCBhcHBsaWVzLgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imh0dHAtbWV0aG9kLW9taXNzaW9uIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmh0dHAtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMSIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgRWFjaCBodHRwLW1ldGhvZC1vbWlzc2lvbiBuYW1lcyBhbiBIVFRQIG1ldGhvZCB0bwotICAgICAgICAgICAgICB3aGljaCB0aGUgY29uc3RyYWludCBkb2VzIG5vdCBhcHBseS4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlbGNvbWUtZmlsZS1saXN0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSB3ZWxjb21lLWZpbGUtbGlzdCBjb250YWlucyBhbiBvcmRlcmVkIGxpc3Qgb2Ygd2VsY29tZQotICAgICAgICBmaWxlcyBlbGVtZW50cy4KLSAgICAgICAgCi0gICAgICAgIFVzZWQgaW46IHdlYi1hcHAKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWxjb21lLWZpbGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSB3ZWxjb21lLWZpbGUgZWxlbWVudCBjb250YWlucyBmaWxlIG5hbWUgdG8gdXNlCi0gICAgICAgICAgICBhcyBhIGRlZmF1bHQgd2VsY29tZSBmaWxlLCBzdWNoIGFzIGluZGV4Lmh0bWwKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9jYWxlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBsb2NhbGVUeXBlIGRlZmluZXMgdmFsaWQgbG9jYWxlIGRlZmluZWQgYnkgSVNPLTYzOS0xCi0gICAgICAgIGFuZCBJU08tMzE2Ni4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iW2Etel17Mn0oX3wtKT8oW1xwe0x9XC1ccHtOZH1dezJ9KT8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW5jb2RpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVuY29kaW5nVHlwZSBkZWZpbmVzIElBTkEgY2hhcmFjdGVyIHNldHMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlteXHNdKyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QgY29udGFpbnMgb25lIG9yIG1vcmUKLSAgICAgICAgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmcocykuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmciCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmxvY2FsZS1lbmNvZGluZy1tYXBwaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmcgY29udGFpbnMgbG9jYWxlIG5hbWUgYW5kCi0gICAgICAgIGVuY29kaW5nIG5hbWUuIFRoZSBsb2NhbGUgbmFtZSBtdXN0IGJlIGVpdGhlciAiTGFuZ3VhZ2UtY29kZSIsCi0gICAgICAgIHN1Y2ggYXMgImphIiwgZGVmaW5lZCBieSBJU08tNjM5IG9yICJMYW5ndWFnZS1jb2RlX0NvdW50cnktY29kZSIsCi0gICAgICAgIHN1Y2ggYXMgImphX0pQIi4gICJDb3VudHJ5IGNvZGUiIGlzIGRlZmluZWQgYnkgSVNPLTMxNjYuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWxlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsb2NhbGVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5jb2RpbmciCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmVuY29kaW5nVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvcmRlcmluZy1vdGhlcnNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoZSBvcmRlcmluZyBzdWItZWxlbWVudCBpbiB3aGljaAotICAgICAgICBpdCB3YXMgcGxhY2VkIHNob3VsZCB0YWtlIHNwZWNpYWwgYWN0aW9uIHJlZ2FyZGluZyB0aGUgb3JkZXJpbmcKLSAgICAgICAgb2YgdGhpcyBhcHBsaWNhdGlvbiByZXNvdXJjZSByZWxhdGl2ZSB0byBvdGhlciBhcHBsaWNhdGlvbgotICAgICAgICBjb25maWd1cmF0aW9uIHJlc291cmNlcy4KLSAgICAgICAgU2VlIHNlY3Rpb24gOC4yLjIgb2YgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnNvbHV0ZU9yZGVyaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFBsZWFzZSBzZWUgc2VjdGlvbiA4LjIuMiBvZiB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im90aGVycyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6b3JkZXJpbmctb3RoZXJzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6Y2hvaWNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvcmRlcmluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBQbGVhc2Ugc2VlIHNlY3Rpb24gOC4yLjIgb2YgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCi0gICAgICAgIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWZ0ZXIiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm9yZGVyaW5nLW9yZGVyaW5nVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmVmb3JlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpvcmRlcmluZy1vcmRlcmluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvcmRlcmluZy1vcmRlcmluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgY29udGFpbnMgYSBzZXF1ZW5jZSBvZiAibmFtZSIgZWxlbWVudHMsIGVhY2ggb2YKLSAgICAgICAgd2hpY2gKLSAgICAgICAgcmVmZXJzIHRvIGFuIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gcmVzb3VyY2UgYnkgdGhlICJuYW1lIgotICAgICAgICBkZWNsYXJlZCBvbiBpdHMgd2ViLnhtbCBmcmFnbWVudC4gIFRoaXMgZWxlbWVudCBjYW4gYWxzbyBjb250YWluCi0gICAgICAgIGEgc2luZ2xlICJvdGhlcnMiIGVsZW1lbnQgd2hpY2ggc3BlY2lmaWVzIHRoYXQgdGhpcyBkb2N1bWVudAotICAgICAgICBjb21lcwotICAgICAgICBiZWZvcmUgb3IgYWZ0ZXIgb3RoZXIgZG9jdW1lbnRzIHdpdGhpbiB0aGUgYXBwbGljYXRpb24uCi0gICAgICAgIFNlZSBzZWN0aW9uIDguMi4yIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3RoZXJzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpvcmRlcmluZy1vdGhlcnNUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibXVsdGlwYXJ0LWNvbmZpZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUKLSAgICAgICAgaGFuZGxpbmcgb2YgbXVsdGlwYXJ0L2Zvcm0tZGF0YSByZXF1ZXN0cy4KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZGlyZWN0b3J5IGxvY2F0aW9uIHdoZXJlIHVwbG9hZGVkIGZpbGVzIHdpbGwgYmUgc3RvcmVkCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXgtZmlsZS1zaXplIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpsb25nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgbWF4aW11bSBzaXplIGxpbWl0IG9mIHVwbG9hZGVkIGZpbGVzCi0gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXgtcmVxdWVzdC1zaXplIgotICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpsb25nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgbWF4aW11bSBzaXplIGxpbWl0IG9mIG11bHRpcGFydC9mb3JtLWRhdGEgcmVxdWVzdHMKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbGUtc2l6ZS10aHJlc2hvbGQiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBzaXplIHRocmVzaG9sZCBhZnRlciB3aGljaCBhbiB1cGxvYWRlZCBmaWxlIHdpbGwgYmUKLSAgICAgICAgICAgIHdyaXR0ZW4gdG8gZGlzawotICAgICAgICAgICAgCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlbGV0dGFnbGlicmFyeV8yXzAueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZWxldHRhZ2xpYnJhcnlfMl8wLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiOTMzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlbGV0dGFnbGlicmFyeV8yXzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb24gPSAiMS4wIiBlbmNvZGluZyA9ICJVVEYtOCI/PgotCi08eHNkOnNjaGVtYQotICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICB4bWxuczp4bWw9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLSAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICAgdmVyc2lvbj0iMi4wIj4KLSAgICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV81LnhzZCIvPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0gICAgICAKLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICAgCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24KLSAgICAgIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZQotICAgICAgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICAgdGhlIExpY2Vuc2UuIFlvdSBjYW4gb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sIG9yCi0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0gICAgICBMaWNlbnNlLgotICAgICAgCi0gICAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlcgotICAgICAgTm90aWNlIGluIGVhY2ggZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0Ci0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICAgICAgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcwotICAgICAgcHJvdmlkZWQgYnkgU3VuIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UgZmlsZQotICAgICAgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZwotICAgICAgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10KLSAgICAgIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICAgIlBvcnRpb25zIENvcHlyaWdodGVkIFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotICAgICAgCi0gICAgICBDb250cmlidXRvcihzKToKLSAgICAgIAotICAgICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZQotICAgICAgQ0RETCBvciBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZwotICAgICAgIltDb250cmlidXRvcl0gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTCBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91Ci0gICAgICBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYSByZWNpcGllbnQgaGFzIHRoZQotICAgICAgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlCi0gICAgICBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvIGl0cwotICAgICAgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyCi0gICAgICBjb2RlIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUKLSAgICAgIG9wdGlvbiBhcHBsaWVzIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoCi0gICAgICBvcHRpb24gYnkgdGhlIGNvcHlyaWdodCBob2xkZXIuCi0gICAgICAKLSAgICAgIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIENEREwgbGljZW5zZS4gICAgICAKLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICA8IVtDREFUQVsKLQotICAgICAgICAgICAgVGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBUYWcgTGlicmFyaWVzIGluIHRoZSBKYXZhU2VydmVyIEZhY2VzCi0gICAgICAgICAgICBTdGFuZGFyZCBGYWNlbGV0cyBWaWV3IERlY2xhcmF0aW9uIExhbmd1YWdlIChGYWNlbGV0cyBWREwpCi0gICAgICAgICAgICAoVmVyc2lvbiAyLjApLgotCi0gICAgICAgICAgICBKU0YgMi4wIEZhY2VsZXQgVGFnIExpYnJhcmllcyB0aGF0IHdpc2ggdG8gY29uZm9ybSB0byB0aGlzCi0gICAgICAgICAgICBzY2hlbWEgbXVzdCBkZWNsYXJlIGl0IGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLgotCi0gICAgICAgICAgICA8ZmFjZWxldC10YWdsaWIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlbGV0dGFnbGliYXJ5XzJfMC54c2QiCi0gICAgICAgICAgICAgIHZlcnNpb249IjIuMCI+Ci0KLSAgICAgICAgICAgIC4uLgotCi0gICAgICAgICAgICA8L2ZhY2VsZXQtdGFnbGliPgotCi0gICAgICAgICAgICBUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkCi0gICAgICAgICAgICB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgdXNpbmcgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZQotICAgICAgICAgICAgZm9yIGphdmFlZSBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0gICAgICAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VsZXR0YWdsaWJhcnlfMl8wLnhzZAotCi0gICAgICAgICAgICBdXT4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLQotCi0gICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY2VsZXQtdGFnbGliIiB0eXBlPSJqYXZhZWU6ZmFjZWxldC10YWdsaWJUeXBlIj4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZmFjZWxldC10YWdsaWItdGFnbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgdGFnLW5hbWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50LgotICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnRhZyIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnRhZy1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZmFjZXMtY29uZmlnLWJlaGF2aW9yLUlELXVuaXF1ZW5lc3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBCZWhhdmlvciBJRHMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgZG9jdW1lbnQuCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6YmVoYXZpb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpiZWhhdmlvci1pZCIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImZhY2VzLWNvbmZpZy1jb252ZXJ0ZXItSUQtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIENvbnZlcnRlciBJRHMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgZG9jdW1lbnQuCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6Y29udmVydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6Y29udmVydGVyLWlkIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZmFjZXMtY29uZmlnLXZhbGlkYXRvci1JRC11bmlxdWVuZXNzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yIElEcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBkb2N1bWVudC4KLSAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTp2YWxpZGF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTp2YWxpZGF0b3ItaWQiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlbGV0LXRhZ2xpYlR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhlIHRvcCBsZXZlbCBYTUwgZWxlbWVudCBpbiBhIGZhY2VsZXQgdGFnIGxpYnJhcnkgWE1MIGZpbGUuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlicmFyeS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImNvbXBvc2l0ZS1saWJyYXJ5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VsZXQtdGFnbGliLXRhZ1R5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZWxldC10YWdsaWItZnVuY3Rpb25UeXBlIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYi1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VsZXQtdGFnbGliLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlbGV0LXRhZ2xpYi12ZXJzaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZWxldC10YWdsaWItZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgZmFjZWxldC10YWdsaWIuIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VsZXQtdGFnbGliLXRhZ1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgSWYgdGhlIHRhZyBsaWJyYXJ5IFhNTCBmaWxlIGNvbnRhaW5zIGluZGl2aWR1YWwgdGFnCi0gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zIHJhdGhlciB0aGFuIHBvaW50aW5nIHRvIGEgbGlicmFyeS1jbGFzcyBvciBhCi0gICAgICAgICAgICAgICAgZGVjbGFyaW5nIGEgY29tcG9zaXRlLWxpYnJhcnkgbmFtZSwgdGhlIGluZGl2aWR1YWwgdGFncyBhcmUKLSAgICAgICAgICAgICAgICBlbmNsb3NlZCBpbiB0YWcgZWxlbWVudHMuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VsZXQtdGFnbGliLWNhbm9uaWNhbC1uYW1lVHlwZSIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJlaGF2aW9yIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZWxldC10YWdsaWItdGFnLWJlaGF2aW9yVHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlbGV0LXRhZ2xpYi10YWctY29tcG9uZW50VHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlbGV0LXRhZ2xpYi10YWctY29udmVydGVyVHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3IiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlbGV0LXRhZ2xpYi10YWctdmFsaWRhdG9yVHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UiIHR5cGU9ImphdmFlZTpzdHJpbmciLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VsZXQtdGFnbGliLXRhZy1hdHRyaWJ1dGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VsZXQtdGFnbGliLXRhZy1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZWxldC10YWdsaWItdGFnLWF0dHJpYnV0ZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgYXR0cmlidXRlIGVsZW1lbnQgZGVmaW5lcyBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBuZXN0aW5nCi0gICAgICAgICAgICAgICAgdGFnLiBUaGUgYXR0cmlidXRlIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cwotICAgICAgICAgICAgICAgIGRlZmluaW5nOgotCi0gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gYSBkZXNjcmlwdGlvbiBvZiB0aGUgYXR0cmlidXRlCi0KLSAgICAgICAgICAgICAgICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLQotICAgICAgICAgICAgICAgIHJlcXVpcmVkIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvcgotICAgICAgICAgICAgICAgIG9wdGlvbmFsCi0KLSAgICAgICAgICAgICAgICB0eXBlIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUKLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6eHNkTk1UT0tFTlR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1aXJlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvcgotICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIElmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXR0cmlidXRlIGlzIG9wdGlvbmFsLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIEphdmEgdHlwZSBvZiB0aGUgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLiBJZiB0aGlzIGVsZW1lbnQgaXMgb21pdHRlZCwgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgdHlwZSBpcyBhc3N1bWVkIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmEubGFuZy5PYmplY3QiLgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1zaWduYXR1cmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG1ldGhvZCBzaWduYXR1cmUgZm9yIGEgTWV0aG9kRXhwcmVzc2lvbi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkIGF0dHJpYnV0ZS4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VsZXQtdGFnbGliLXRhZy1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciB0YWcgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZWxldC10YWdsaWItZnVuY3Rpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIElmIHRoZSB0YWcgbGlicmFyeSBYTUwgZmlsZSBjb250YWlucyBpbmRpdmlkdWFsIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zIHJhdGhlciB0aGFuIHBvaW50aW5nIHRvIGEgbGlicmFyeS1jbGFzcyBvciBhCi0gICAgICAgICAgICAgICAgZGVjbGFyaW5nIGEgY29tcG9zaXRlLWxpYnJhcnkgbmFtZSwgdGhlIGluZGl2aWR1YWwgZnVuY3Rpb25zIGFyZQotICAgICAgICAgICAgICAgIGVuY2xvc2VkIGluIGZ1bmN0aW9uIGVsZW1lbnRzLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLW5hbWUiIHR5cGU9ImphdmFlZTpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLXNpZ25hdHVyZSIgdHlwZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VsZXQtdGFnbGliLXRhZy1iZWhhdmlvclR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgV2l0aGluIGEgdGFnIGVsZW1lbnQsIHRoZSBiZWhhdmlvciBlbGVtZW50IGVuY2Fwc3VsYXRlcwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGEgSlNGIEJlaGF2aW9yLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIgotICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImJlaGF2aW9yLWlkIiB0eXBlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iaGFuZGxlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJlaGF2aW9yLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZWxldC10YWdsaWItdGFnLWJlaGF2aW9yLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZWxldC10YWdsaWItdGFnLWJlaGF2aW9yLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGJlaGF2aW9yLiBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZWxldC10YWdsaWItdGFnLWNvbXBvbmVudFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgV2l0aGluIGEgdGFnIGVsZW1lbnQsIHRoZSBjb21wb25lbnQgZWxlbWVudCBlbmNhcHN1bGF0ZXMKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIEpTRiBVSUNvbXBvbmVudC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtdHlwZSIgdHlwZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIgotICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InJlbmRlcmVyLXR5cGUiIHR5cGU9ImphdmFlZTpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJoYW5kbGVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZWxldC10YWdsaWItdGFnLWNvbXBvbmVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCi0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZWxldC10YWdsaWItdGFnLWNvbXBvbmVudC1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBjb21wb25lbnQgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZWxldC10YWdsaWItdGFnLWNvbnZlcnRlclR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgV2l0aGluIGEgdGFnIGVsZW1lbnQsIHRoZSBjb252ZXJ0ZXIgZWxlbWVudCBlbmNhcHN1bGF0ZXMKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIEpTRiBDb252ZXJ0ZXIuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iY29udmVydGVyLWlkIiB0eXBlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iaGFuZGxlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VsZXQtdGFnbGliLXRhZy1jb252ZXJ0ZXItZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlbGV0LXRhZ2xpYi10YWctY29udmVydGVyLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGNvbnZlcnRlciBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlbGV0LXRhZ2xpYi10YWctdmFsaWRhdG9yVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBXaXRoaW4gYSB0YWcgZWxlbWVudCwgdGhlIHZhbGlkYXRvciBlbGVtZW50IGVuY2Fwc3VsYXRlcwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGEgSlNGIFZhbGlkYXRvci4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ2YWxpZGF0b3ItaWQiIHR5cGU9ImphdmFlZTpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJoYW5kbGVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZWxldC10YWdsaWItdGFnLXZhbGlkYXRvci1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VsZXQtdGFnbGliLXRhZy12YWxpZGF0b3ItZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgdmFsaWRhdG9yIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZhY2VsZXQtdGFnbGliLXZlcnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgdHlwZSBjb250YWlucyB0aGUgcmVjb2duaXplZCB2ZXJzaW9ucyBvZgotICAgICAgICAgICAgICAgIGZhY2VsZXQtdGFnbGliIHN1cHBvcnRlZC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIuMCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlbGV0LXRhZ2xpYi1jYW5vbmljYWwtbmFtZVR5cGUiPgotCi0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEgdGFnIG9yIGF0dHJpYnV0ZSBiZWluZwotICAgICAgICAgICAgICAgIGRlZmluZWQuCi0KLSAgICAgICAgICAgICAgICBUaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5DTmFtZQotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpOQ05hbWUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8wLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VzY29uZmlnXzFfMC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMWM5OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8wLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDg3NCArMCwwIEBACi08IS0tCi0gICAgRFREIGZvciB0aGUgSmF2YVNlcnZlciBGYWNlcyBBcHBsaWNhdGlvbiBDb25maWd1cmF0aW9uIEZpbGUgKFZlcnNpb24gMS4wKQotCi0gICAgVG8gc3VwcG9ydCB2YWxpZGF0aW9uIG9mIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlKHMpLCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcKLSAgICBET0NUWVBFIGVsZW1lbnQgYXQgdGhlIGJlZ2lubmluZyAoYWZ0ZXIgdGhlICJ4bWwiIGRlY2xhcmF0aW9uKToKLQotICAgIDwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDCi0gICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiIKLSAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzAuZHRkIj4KLQotICAgICRJZDogd2ViLWZhY2VzY29uZmlnXzFfMC5kdGQsdiAxLjEgMjAwNy8wNS8yNSAyMToxMjo0OSBkYXZpZF93aWxsaWFtcyBFeHAgJAotCi0tLT4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09IERlZmluZWQgVHlwZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotPCEtLQotICAgIEFuICJBY3Rpb24iIGlzIGEgU3RyaW5nIHRoYXQgcmVwcmVzZW50cyBhIG1ldGhvZCBiaW5kaW5nCi0gICAgZXhwcmVzc2lvbiB0aGF0IHBvaW50cyBhdCBhIG1ldGhvZCB3aXRoIG5vIGFyZ3VtZW50cyB0aGF0IHJldHVybnMgYQotICAgIFN0cmluZy4gIEl0IG11c3QgYmUgYnJhY2tldGVkIHdpdGggIiN7fSIsIGZvciBleGFtcGxlLAotICAgICIje2NhcmRlbW8uYnV5Q2FyfSIuCi0tLT4KLTwhRU5USVRZICUgQWN0aW9uICJDREFUQSI+Ci0KLQotPCEtLQotICAgIEEgIkNsYXNzTmFtZSIgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGlzCi0gICAgaW5zdGFudGlhdGVkIHRvIHByb3ZpZGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGVuY2xvc2luZyBlbGVtZW50LgotLS0+Ci08IUVOVElUWSAlIENsYXNzTmFtZSAiQ0RBVEEiPgotCi0KLTwhLS0KLSAgICBBbiAiSWRlbnRpZmllciIgaXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IGNvbmZvcm1zIHRvIHRoZSB2YXJpYWJsZQotICAgIG5hbWluZyBjb252ZW50aW9ucyBvZiB0aGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSAoSkxTIFNlY3Rpb24gPy4/Lj8pLgotLS0+Ci08IUVOVElUWSAlIElkZW50aWZpZXIgIkNEQVRBIj4KLQotCi08IS0tCi0gICAgQSAiSmF2YVR5cGUiIGlzIGVpdGhlciB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaXMKLSAgICBpbnN0YW50aWF0ZWQgdG8gcHJvdmlkZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZW5jbG9zaW5nIGVsZW1lbnQsIG9yCi0gICAgdGhlIG5hbWUgb2YgYSBKYXZhIHByaW1pdGl2ZSB0eXBlIChzdWNoIGFzIGludCBvciBjaGFyKS4gIFRoZSBjbGFzcyBuYW1lCi0gICAgb3IgcHJpbWl0aXZlIHR5cGUgbWF5IG9wdGlvbmFsbHkgYmUgZm9sbG93ZWQgYnkgIltdIiB0byBpbmRpY2F0ZSB0aGF0Ci0gICAgdGhlIHVuZGVybHlpbmcgZGF0YSBtdXN0IGJlIGFuIGFycmF5LCByYXRoZXIgdGhhbiBhIHNjYWxhciB2YXJpYWJsZS4KLS0tPgotPCFFTlRJVFkgJSBKYXZhVHlwZSAiQ0RBVEEiPgotCi0KLTwhLS0KLSAgICBBICJMYW5ndWFnZSIgaXMgYSBsb3dlciBjYXNlIHR3by1sZXR0ZXIgY29kZSBmb3IgYSBsYW5ndWFnZSBhcyBkZWZpbmVkCi0gICAgYnkgSVNMLTYzOS4KLS0tPgotPCFFTlRJVFkgJSBMYW5ndWFnZSAiQ0RBVEEiPgotCi0KLTwhLS0KLSAgICBBICJSZXNvdXJjZVBhdGgiIGlzIHRoZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoIHRvIGEgcmVzb3VyY2UgZmlsZQotICAgIChzdWNoIGFzIGEgbG9nbyBpbWFnZSkuCi0tLT4KLTwhRU5USVRZICUgUmVzb3VyY2VQYXRoICJDREFUQSI+Ci0KLQotPCEtLQotICAgIEEgIlNjb3BlIiBpcyB0aGUgd2VsbC1rbm93biBuYW1lIG9mIGEgc2NvcGUgaW4gd2hpY2ggbWFuYWdlZCBiZWFucyBtYXkKLSAgICBvcHRpb25hbGx5IGJlIGRlZmluZWQgdG8gYmUgY3JlYXRlZCBpbi4KLS0tPgotPCFFTlRJVFkgJSBTY29wZSAiKHJlcXVlc3R8c2Vzc2lvbnxhcHBsaWNhdGlvbikiPgotCi0KLQotPCEtLQotICAgIEEgIlNjb3BlT3JOb25lIiBlbGVtZW50IGRlZmluZXMgdGhlIGxlZ2FsIHZhbHVlcyBmb3IgdGhlCi0gICAgPG1hbmFnZWQtYmVhbi1zY29wZT4gZWxlbWVudCdzIGJvZHkgY29udGVudCwgd2hpY2ggaW5jbHVkZXMKLSAgICBhbGwgb2YgdGhlIHNjb3BlcyByZXNwcmVzZW50ZWQgYnkgdGhlICJTY29wZSIgdHlwZSwgcGx1cyB0aGUKLSAgICAibm9uZSIgdmFsdWUgaW5kaWNhdGluZyB0aGF0IGEgY3JlYXRlZCBiZWFuIHNob3VsZCBub3QgYmUKLSAgICBzdG9yZWQgaW50byBhbnkgc2NvcGUuCi0tLT4KLTwhRU5USVRZICUgU2NvcGVPck5vbmUgIihyZXF1ZXN0fHNlc3Npb258YXBwbGljYXRpb258bm9uZSkiPgotCi0KLTwhLS0KLSAgICBBICJWaWV3SWRQYXR0ZXJuIiBpcyBhIHBhdHRlcm4gZm9yIG1hdGNoaW5nIHZpZXcgaWRlbnRpZmllcnMgaW4KLSAgICBvcmRlciB0byBkZXRlcm1pbmUgd2hldGhlciBhIHBhcnRpY3VsYXIgbmF2aWdhdGlvbiBydWxlIHNob3VsZCBiZQotICAgIGZpcmVkLiAgSXQgbXVzdCBjb250YWluIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLQotICAgIC0gVGhlIGV4YWN0IG1hdGNoIGZvciBhIHZpZXcgaWRlbnRpZmllciB0aGF0IGlzIHJlY29nbml6ZWQKLSAgICAgIGJ5IHRoZSB0aGUgVmlld0hhbmRsZXIgaW1wbGVtZW50YXRpb24gYmVpbmcgdXNlZCAoc3VjaCBhcwotICAgICAgIi9pbmRleC5qc3AiIGlmIHlvdSBhcmUgdXNpbmcgdGhlIGRlZmF1bHQgVmlld0hhbmRsZXIpLgotCi0gICAgLSBBIHByb3BlciBwcmVmaXggb2YgYSB2aWV3IGlkZW50aWZpZXIsIHBsdXMgYSB0cmFpbGluZyAiKiIKLSAgICAgIGNoYXJhY3Rlci4gIFRoaXMgcGF0dGVybiBpbmRpY2F0ZXMgdGhhdCBhbGwgdmlldyBpZGVudGlmaWVycyB0aGF0Ci0gICAgICBtYXRjaCB0aGUgcG9ydGlvbiBvZiB0aGUgcGF0dGVybiB1cCB0byB0aGUgYXN0ZXJpc2sgd2lsbCBtYXRjaCB0aGUKLSAgICAgIHN1cnJvdW5kaW5nIHJ1bGUuICBXaGVuIG1vcmUgdGhhbiBvbmUgbWF0Y2ggZXhpc3RzLCB0aGUgbWF0Y2ggd2l0aAotICAgICAgdGhlIGxvbmdlc3QgcGF0dGVybiBpcyBzZWxlY3RlZC4KLQotICAgIC0gQW4gIioiIGNoYXJhY3Rlciwgd2hpY2ggbWVhbnMgdGhhdCB0aGlzIHBhdHRlcm4gYXBwbGllcyB0byBhbGwKLSAgICAgIHZpZXcgaWRlbnRpZmllcnMuCi0tLT4KLTwhRU5USVRZICUgVmlld0lkUGF0dGVybiAiQ0RBVEEiPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT0gVG9wIExldmVsIEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IS0tCi0gICAgVGhlICJmYWNlcy1jb25maWciIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLSAgICBoaWVyYXJjaHksIGFuZCBjb250YWlucyBuZXN0ZWQgZWxlbWVudHMgZm9yIGFsbCBvZiB0aGUgb3RoZXIgY29uZmlndXJhdGlvbgotICAgIHNldHRpbmdzLgotLS0+Ci08IUVMRU1FTlQgZmFjZXMtY29uZmlnICAgICgoYXBwbGljYXRpb258ZmFjdG9yeXxjb21wb25lbnR8Y29udmVydGVyfG1hbmFnZWQtYmVhbnxuYXZpZ2F0aW9uLXJ1bGV8cmVmZXJlbmNlZC1iZWFufHJlbmRlci1raXR8bGlmZWN5Y2xlfHZhbGlkYXRvcikqKT4KLTwhQVRUTElTVCBmYWNlcy1jb25maWcKLSAgICAgICB4bWxucyBDREFUQSAjRklYRUQgImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNGL0NvbmZpZ3VyYXRpb24iPgotCi0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PSBEZWZpbml0aW9uIEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLTwhLS0KLSAgICBUaGUgImFwcGxpY2F0aW9uIiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGRlZmluZSB0aGUgdmFyaW91cwotICAgIHBlci1hcHBsaWNhdGlvbi1zaW5nbGV0b24gaW1wbGVtZW50YXRpb24gYXJ0aWZhY3RzIGZvciBhIHBhcnRpY3VsYXIgd2ViCi0gICAgYXBwbGljYXRpb24gdGhhdCBpcyB1dGlsaXppbmcgSmF2YVNlcnZlciBGYWNlcy4gIEZvciBuZXN0ZWQgZWxlbWVudHMKLSAgICB0aGF0IGFyZSBub3Qgc3BlY2lmaWVkLCB0aGUgSlNGIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhIHN1aXRhYmxlCi0gICAgZGVmYXVsdC4KLS0tPgotPCFFTEVNRU5UIGFwcGxpY2F0aW9uICAgICAoKGFjdGlvbi1saXN0ZW5lcnxkZWZhdWx0LXJlbmRlci1raXQtaWR8bWVzc2FnZS1idW5kbGV8bmF2aWdhdGlvbi1oYW5kbGVyfHZpZXctaGFuZGxlcnxzdGF0ZS1tYW5hZ2VyfHByb3BlcnR5LXJlc29sdmVyfHZhcmlhYmxlLXJlc29sdmVyfGxvY2FsZS1jb25maWcpKik+Ci0KLQotPCEtLQotICAgIFRoZSAiZmFjdG9yeSIgZWxlbWVudCBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBkZWZpbmUgdGhlIHZhcmlvdXMKLSAgICBGYWN0b3JpZXMgdGhhdCBjb21wcmlzZSBwYXJ0cyBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgSmF2YVNlcnZlcgotICAgIEZhY2VzLiAgRm9yIG5lc3RlZCBlbGVtZW50cyB0aGF0IGFyZSBub3Qgc3BlY2lmaWVkLCB0aGUgSlNGCi0gICAgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEgc3VpdGFibGUgZGVmYXVsdC4KLS0tPgotPCFFTEVNRU5UIGZhY3RvcnkgICAgICgoYXBwbGljYXRpb24tZmFjdG9yeXxmYWNlcy1jb250ZXh0LWZhY3Rvcnl8bGlmZWN5Y2xlLWZhY3Rvcnl8cmVuZGVyLWtpdC1mYWN0b3J5KSopPgotCi0KLTwhLS0KLSAgICBUaGUgImF0dHJpYnV0ZSIgZWxlbWVudCByZXByZXNlbnRzIGEgbmFtZWQsIHR5cGVkLCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGgKLSAgICB0aGUgcGFyZW50IFVJQ29tcG9uZW50IHZpYSB0aGUgZ2VuZXJpYyBhdHRyaWJ1dGVzIG1lY2hhbmlzbS4KLQotICAgIEF0dHJpYnV0ZSBuYW1lcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwYXJlbnQgKG9yIHJlbGF0ZWQpCi0gICAgY29tcG9uZW50LgotLS0+Ci08IUVMRU1FTlQgYXR0cmlidXRlICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBhdHRyaWJ1dGUtbmFtZSwgYXR0cmlidXRlLWNsYXNzLCBkZWZhdWx0LXZhbHVlPywgc3VnZ2VzdGVkLXZhbHVlPywgYXR0cmlidXRlLWV4dGVuc2lvbiopPgotCi08IS0tIAotICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBhdHRyaWJ1dGUuICBNYXkgY29udGFpbiBpbXBsZW1lbnRhdGlvbgotICAgIHNwZWNpZmljIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBhdHRyaWJ1dGUtZXh0ZW5zaW9uIEFOWT4KLQotCi08IS0tCi0gICAgVGhlICJjb21wb25lbnQiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIFVJQ29tcG9uZW50IGltcGxlbWVudGF0aW9uCi0gICAgY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIHR5cGUgaWRlbnRpZmllciwKLSAgICBhbG9uZyB3aXRoIGl0cyBhc3NvY2lhdGVkIHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXMuICBDb21wb25lbnQgdHlwZXMgbXVzdAotICAgIGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQgYXJlIHJlY29nbml6ZWQKLSAgICBieSB0aGUgaW1wbGVtZW50YXRpb24gbG9naWMgb2YgdGhpcyBjb21wb25lbnQuICBOZXN0ZWQgInByb3BlcnR5IiBlbGVtZW50cwotICAgIGlkZW50aWZ5IEphdmFCZWFucyBwcm9wZXJ0aWVzIG9mIHRoZSBjb21wb25lbnQgY2xhc3MgdGhhdCBtYXkgYmUgZXhwb3NlZAotICAgIGZvciBtYW5pcHVsYXRpb24gdmlhIHRvb2xzLgotLS0+Ci08IUVMRU1FTlQgY29tcG9uZW50ICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBjb21wb25lbnQtdHlwZSwgY29tcG9uZW50LWNsYXNzLCBhdHRyaWJ1dGUqLCBwcm9wZXJ0eSosIGNvbXBvbmVudC1leHRlbnNpb24qKT4KLQotPCEtLSAKLSAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgY29tcG9uZW50LiAgTWF5IGNvbnRhaW4gaW1wbGVtZW50YXRpb24KLSAgICBzcGVjaWZpYyBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgY29tcG9uZW50LWV4dGVuc2lvbiBBTlk+Ci0KLQotCi08IS0tCi0gICAgVGhlICJjb252ZXJ0ZXIiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIENvbnZlcnRlciBpbXBsZW1lbnRhdGlvbgotICAgIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIHNwZWNpZmllZCBjb252ZXJ0ZXIgaWRlbnRpZmllci4KLSAgICBDb252ZXJ0ZXIgaWRlbnRpZmllcnMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlbnRpcmUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgTmVzdGVkICJhdHRyaWJ1dGUiIGVsZW1lbnRzIGlkZW50aWZ5IGdlbmVyaWMgYXR0cmlidXRlcyB0aGF0IG1heSBiZQotICAgIGNvbmZpZ3VyZWQgb24gdGhlIGNvcnJlc3BvbmRpbmcgVUlDb21wb25lbnQgaW4gb3JkZXIgdG8gYWZmZWN0IHRoZQotICAgIG9wZXJhdGlvbiBvZiB0aGUgQ29udmVydGVyLiAgTmVzdGVkICJwcm9wZXJ0eSIgZWxlbWVudHMgaWRlbnRpZnkgSmF2YUJlYW5zCi0gICAgcHJvcGVydGllcyBvZiB0aGUgQ29udmVydGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgbWF5IGJlIGNvbmZpZ3VyZWQKLSAgICB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZiB0aGUgQ29udmVydGVyLgotLS0+Ci08IUVMRU1FTlQgY29udmVydGVyICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCAoY29udmVydGVyLWlkIHwgY29udmVydGVyLWZvci1jbGFzcyksIGNvbnZlcnRlci1jbGFzcywgYXR0cmlidXRlKiwgcHJvcGVydHkqKT4KLQotCi08IS0tCi0gICAgVGhlICJpY29uIiBlbGVtZW50IGNvbnRhaW5zICJzbWFsbC1pY29uIiBhbmQgImxhcmdlLWljb24iIGVsZW1lbnRzIHRoYXQKLSAgICBzcGVjaWZ5IHRoZSByZXNvcnVjZSBwYXRocyBmb3Igc21hbGwgYW5kIGxhcmdlIEdJRiBvciBKUEcgaWNvbiBpbWFnZXMKLSAgICB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYSBHVUkgdG9vbC4KLS0tPgotPCFFTEVNRU5UIGljb24gICAgICAgICAgICAoc21hbGwtaWNvbj8sIGxhcmdlLWljb24/KT4KLTwhQVRUTElTVCBpY29uICAgICAgICAgICAgeG1sOmxhbmcgICAgICAgICVMYW5ndWFnZTsgICAgICAjSU1QTElFRD4KLQotPCEtLQotICAgIFRoZSAibGlmZWN5Y2xlIiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIHNwZWNpZnkKLSAgICBtb2RpZmljYXRpb25zIHRvIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGRlZmF1bHQgTGlmZWN5Y2xlCi0gICAgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotLS0+Ci08IUVMRU1FTlQgbGlmZWN5Y2xlICAgICAgIChwaGFzZS1saXN0ZW5lciopPgotCi08IS0tCi0gICAgIFRoZSAibG9jYWxlLWNvbmZpZyIgZWxlbWVudCBhbGxvd3MgdGhlIGFwcCBkZXZlbG9wZXIgdG8gZGVjbGFyZSB0aGUKLSAgICAgc3VwcG9ydGVkIGxvY2FsZXMgZm9yIHRoaXMgYXBwbGljYXRpb24uICAKLS0tPgotPCFFTEVNRU5UIGxvY2FsZS1jb25maWcgKGRlZmF1bHQtbG9jYWxlPywgc3VwcG9ydGVkLWxvY2FsZSopPgotCi08IS0tCi0gICAgVGhlICJtYW5hZ2VkLWJlYW4iIGVsZW1lbnQgcmVwcmVzZW50cyBhIEphdmFCZWFuLCBvZiBhIHBhcnRpY3VsYXIgY2xhc3MsCi0gICAgdGhhdCB3aWxsIGJlIGR5bmFtaWNhbGx5IGluc3RhbnRpYXRlZCBhdCBydW50aW1lIChieSB0aGUgZGVmYXVsdAotICAgIFZhcmlhYmxlUmVzb2x2ZXIgaW1wbGVtZW50YXRpb24pIGlmIGl0IGlzIHJlZmVyZW5jZWQgYXMgdGhlIGZpcnN0IGVsZW1lbnQKLSAgICBvZiBhIHZhbHVlIGJpbmRpbmcgZXhwcmVzc2lvbiwgYW5kIG5vIGNvcnJlc3BvbmRpbmcgYmVhbiBjYW4gYmUKLSAgICBpZGVudGlmaWVkIGluIGFueSBzY29wZS4gIEluIGFkZGl0aW9uIHRvIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWFuYWdlZCBiZWFuLAotICAgIGFuZCB0aGUgb3B0aW9uYWwgc3RvcmluZyBvZiBpdCBpbnRvIHRoZSBzcGVjaWZpZWQgc2NvcGUsIHRoZSBuZXN0ZWQKLSAgICBtYW5hZ2VkLXByb3BlcnR5IGVsZW1lbnRzIGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mCi0gICAgc2V0dGFibGUgSmF2YUJlYW5zIHByb3BlcnRpZXMgb2YgdGhlIGNyZWF0ZWQgaW5zdGFuY2UuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLWJlYW4gKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIG1hbmFnZWQtYmVhbi1uYW1lLCBtYW5hZ2VkLWJlYW4tY2xhc3MsIG1hbmFnZWQtYmVhbi1zY29wZSwgKG1hbmFnZWQtcHJvcGVydHkqIHwgbWFwLWVudHJpZXMgfCBsaXN0LWVudHJpZXMpKT4KLQotCi08IS0tCi0gICAgVGhlICJtYW5hZ2VkLXByb3BlcnR5IiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCBwcm9wZXJ0eSBvZiBhCi0gICAgbWFuYWdlZCBiZWFuIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgKG9yIHZhbHVlIHNldCkKLSAgICBpZiB0aGUgY29ycmVzcG9uZGluZyBtYW5hZ2VkIGJlYW4gaXMgYXV0b21hdGljYWxseSBjcmVhdGVkLgotLS0+Ci08IUVMRU1FTlQgbWFuYWdlZC1wcm9wZXJ0eSAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgcHJvcGVydHktbmFtZSwgcHJvcGVydHktY2xhc3M/LCAobWFwLWVudHJpZXN8bnVsbC12YWx1ZXx2YWx1ZXxsaXN0LWVudHJpZXMpKT4KLQotCi08IS0tCi0gICAgVGhlICJtYXAtZW50cnkiIGVsZW1lbnQgcmVwcnNlbnRzIGEgc2luZ2xlIGtleS1lbnRyeSBwYWlyIHRoYXQKLSAgICB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb21wdXRlZCB2YWx1ZSBvZiBhIG1hbmFnZWQgcHJvcGVydHkgb2YgdHlwZQotICAgIGphdmEudXRpbC5NYXAuCi0tLT4KLTwhRUxFTUVOVCBtYXAtZW50cnkgKGtleSwgKG51bGwtdmFsdWV8dmFsdWUpKT4KLQotCi08IS0tCi0gICAgVGhlICJtYXAtZW50cmllcycgZWxlbWVudCByZXByZXNlbnRzIGEgc2V0IG9mIGtleS1lbnRyeSBwYWlycyB0aGF0Ci0gICAgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29tcHV0ZWQgdmFsdWUgb2YgYSBtYW5hZ2VkIHByb3BlcnR5IG9mIHR5cGUKLSAgICBqYXZhLnV0aWwuTWFwLiAgSW4gYWRkaXRpb24sIHRoZSBKYXZhIGNsYXNzIHR5cGVzIG9mIHRoZSBrZXkgYW5kIGVudHJ5Ci0gICAgdmFsdWVzIG1heSBiZSBvcHRpb25hbGx5IGRlY2xhcmVkLgotLS0+Ci08IUVMRU1FTlQgbWFwLWVudHJpZXMgKGtleS1jbGFzcz8sIHZhbHVlLWNsYXNzPywgbWFwLWVudHJ5Kik+Ci0KLQotPCEtLQotICAgIFRoZSBiYXNlIG5hbWUgb2YgYSByZXNvdXJjZSBidW5kbGUgcmVwcmVzZW50aW5nIHRoZSBtZXNzYWdlIHJlc291cmNlcwotICAgIGZvciB0aGlzIGFwcGxpY2F0aW9uLiAgU2VlIHRoZSBKYXZhRG9jcyBmb3IgdGhlICJqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUiCi0gICAgY2xhc3MgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHN5bnRheCBvZiByZXNvdXJjZSBidW5kbGUgbmFtZXMuCi0tLT4KLQotPCFFTEVNRU5UIG1lc3NhZ2UtYnVuZGxlICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJuYXZpZ2F0aW9uLWNhc2UiIGVsZW1lbnQgZGVzY3JpYmVzIGEgcGFydGljdWxhciBjb21iaW5hdGlvbiBvZgotICAgIGNvbmRpdGlvbnMgdGhhdCBtdXN0IG1hdGNoIGZvciB0aGlzIGNhc2UgdG8gYmUgZXhlY3V0ZWQsIGFuZCB0aGUKLSAgICB2aWV3IGlkIG9mIHRoZSBjb21wb25lbnQgdHJlZSB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCBuZXh0LgotLS0+Ci08IUVMRU1FTlQgbmF2aWdhdGlvbi1jYXNlIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBmcm9tLWFjdGlvbj8sIGZyb20tb3V0Y29tZT8sIHRvLXZpZXctaWQsIHJlZGlyZWN0Pyk+Ci0KLQotPCEtLQotICAgIFRoZSAibmF2aWdhdGlvbi1ydWxlIiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCBkZWNpc2lvbiBydWxlCi0gICAgdGhhdCB3aWxsIGJlIHV0aWxpemVkIGJ5IHRoZSBkZWZhdWx0IE5hdmlnYXRpb25IYW5kbGVyCi0gICAgaW1wbGVtZW50YXRpb24gdG8gbWFrZSBkZWNpc2lvbnMgb24gd2hhdCB2aWV3IHNob3VsZCBiZSBkaXNwbGF5ZWQKLSAgICBuZXh0LCBiYXNlZCBvbiB0aGUgdmlldyBpZCBiZWluZyBwcm9jZXNzZWQuCi0tLT4KLTwhRUxFTUVOVCBuYXZpZ2F0aW9uLXJ1bGUgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIGZyb20tdmlldy1pZD8sIG5hdmlnYXRpb24tY2FzZSopPgotCi0KLTwhLS0KLSAgICBUaGUgInByb3BlcnR5IiBlbGVtZW50IHJlcHJlc2VudHMgYSBKYXZhQmVhbiBwcm9wZXJ0eSBvZiB0aGUgSmF2YSBjbGFzcwotICAgIHJlcHJlc2VudGVkIGJ5IG91ciBwYXJlbnQgZWxlbWVudC4KLQotICAgIFByb3BlcnR5IG5hbWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIEphdmEgY2xhc3MKLSAgICB0aGF0IGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgZWxlbWVudCwgYW5kIG11c3QgY29ycmVzcG9uZCB0bwotICAgIHByb3BlcnR5IG5hbWVzIHRoYXQgd2lsbCBiZSByZWNvZ25pemVkIHdoZW4gcGVyZm9ybWluZyBpbnRyb3NwZWN0aW9uCi0gICAgYWdhaW5zdCB0aGF0IGNsYXNzIHZpYSBqYXZhLmJlYW5zLkludHJvc3BlY3Rvci4KLS0tPgotPCFFTEVNRU5UIHByb3BlcnR5ICAgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgcHJvcGVydHktbmFtZSwgcHJvcGVydHktY2xhc3MsIGRlZmF1bHQtdmFsdWU/LCBzdWdnZXN0ZWQtdmFsdWU/LCBwcm9wZXJ0eS1leHRlbnNpb24qKT4KLQotPCEtLSAKLSAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgcHJvcGVydHkuICBNYXkgY29udGFpbiBpbXBsZW1lbnRhdGlvbgotICAgIHNwZWNpZmljIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBwcm9wZXJ0eS1leHRlbnNpb24gQU5ZPgotCi08IS0tCi0gICAgVGhlICJyZWZlcmVuY2VkLWJlYW4iIGVsZW1lbnQgcmVwcmVzZW50cyBhdCBkZXNpZ24gdGltZSB0aGUgcHJvbWlzZQotICAgIHRoYXQgYSBKYXZhIG9iamVjdCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgd2lsbCBleGlzdCBhdCBydW50aW1lIGluIHNvbWUKLSAgICBzY29wZSwgdW5kZXIgdGhlIHNwZWNpZmllZCBrZXkuICBUaGlzIGNhbiBiZSB1c2VkIGJ5IGRlc2lnbiB0aW1lIHRvb2xzCi0gICAgdG8gY29uc3RydWN0IHVzZXIgaW50ZXJmYWNlIGRpYWxvZ3MgYmFzZWQgb24gdGhlIHByb3BlcnRpZXMgb2YgdGhlCi0gICAgc3BlY2lmaWVkIGNsYXNzLiAgVGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgYSByZWZlcmVuY2VkIGJlYW4KLSAgICBlbGVtZW50IGhhcyBubyBpbXBhY3Qgb24gdGhlIEphdmFTZXJ2ZXIgRmFjZXMgcnVudGltZSBlbnZpcm9ubWVudAotICAgIGluc2lkZSBhIHdlYiBhcHBsaWNhdGlvbi4KLS0tPgotPCFFTEVNRU5UIHJlZmVyZW5jZWQtYmVhbiAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgcmVmZXJlbmNlZC1iZWFuLW5hbWUsIHJlZmVyZW5jZWQtYmVhbi1jbGFzcyk+Ci0KLQotPCEtLQotICAgIFRoZSAicmVuZGVyLWtpdCIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgUmVuZGVyS2l0IGltcGxlbWVudGF0aW9uCi0gICAgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIHJlbmRlci1raXQtaWQuICBJZiBubwotICAgIHJlbmRlci1raXQtaWQgaXMgc3BlY2lmaWVkLCB0aGUgaWRlbnRpZmllciBvZiB0aGUgZGVmYXVsdCBSZW5kZXJLaXQKLSAgICAoUmVuZGVyS2l0RmFjdG9yeS5ERUZBVUxUX1JFTkRFUl9LSVQpIGlzIGFzc3VtZWQuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXIta2l0ICAgICAgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIHJlbmRlci1raXQtaWQ/LCByZW5kZXIta2l0LWNsYXNzPywgcmVuZGVyZXIqKT4KLQotCi08IS0tCi0gICAgVGhlICJyZW5kZXJlciIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgUmVuZGVyZXIgaW1wbGVtZW50YXRpb24KLSAgICBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IGZhbWlseQotICAgIGFuZCByZW5kZXJlciB0eXBlIGlkZW50aWZpZXJzLCBpbiB0aGUgUmVuZGVyS2l0IGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICBwYXJlbnQgInJlbmRlci1raXQiIGVsZW1lbnQuICBDb21iaW5hdGlvbnMgb2YgY29tcG9uZW50IGZhbWlseSBhbmQgcmVuZGVyZXIKLSAgICB0eXBlIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgUmVuZGVyS2l0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyZW50Ci0gICAgInJlbmRlci1raXQiIGVsZW1lbnQuCi0KLSAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBjb21wb25lbnQgYXR0cmlidXRlcyB0aGF0Ci0gICAgYXJlIHJlY29nbml6ZWQgYnkgdGhpcyByZW5kZXJlci4KLS0tPgotPCFFTEVNRU5UIHJlbmRlcmVyICAgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgY29tcG9uZW50LWZhbWlseSwgcmVuZGVyZXItdHlwZSwgcmVuZGVyZXItY2xhc3MsIGF0dHJpYnV0ZSosIHJlbmRlcmVyLWV4dGVuc2lvbiopPgotCi08IS0tIAotICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciByZW5kZXJlci4gIE1heSBjb250YWluIGltcGxlbWVudGF0aW9uCi0gICAgc3BlY2lmaWMgY29udGVudC4KLS0tPgotPCFFTEVNRU5UIHJlbmRlcmVyLWV4dGVuc2lvbiBBTlk+Ci0KLTwhLS0KLSAgICBUaGUgInZhbGlkYXRvciIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgVmFsaWRhdG9yIGltcGxlbWVudGF0aW9uCi0gICAgY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZGVudGlmaWVyLgotICAgIFZhbGlkYXRvciBpZGVudGlmaWVycyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQgbWF5IGJlCi0gICAgY29uZmlndXJlZCBvbiB0aGUgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBpbiBvcmRlciB0byBhZmZlY3QgdGhlCi0gICAgb3BlcmF0aW9uIG9mIHRoZSBWYWxpZGF0b3IuICBOZXN0ZWQgInByb3BlcnR5IiBlbGVtZW50cyBpZGVudGlmeSBKYXZhQmVhbnMKLSAgICBwcm9wZXJ0aWVzIG9mIHRoZSBWYWxpZGF0b3IgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBtYXkgYmUgY29uZmlndXJlZAotICAgIHRvIGFmZmVjdCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBWYWxpZGF0b3IuCi0tLT4KLTwhRUxFTUVOVCB2YWxpZGF0b3IgICAgICAgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIHZhbGlkYXRvci1pZCwgdmFsaWRhdG9yLWNsYXNzLCBhdHRyaWJ1dGUqLCBwcm9wZXJ0eSopPgotCi0KLTwhLS0KLSAgICBUaGUgImxpc3QtZW50cmllcyIgZWxlbWVudCByZXByZXNlbnRzIGEgc2V0IG9mIGluaXRpYWxpemF0aW9uCi0gICAgZWxlbWVudHMgZm9yIGEgbWFuYWdlZCBwcm9wZXJ0eSB0aGF0IGlzIGEgamF2YS51dGlsLkxpc3Qgb3IgYW4KLSAgICBhcnJheS4gIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlICJ2YWx1ZS1jbGFzcyIgZWxlbWVudCBjYW4gb3B0aW9uYWxseQotICAgIGJlIHVzZWQgdG8gZGVjbGFyZSB0aGUgSmF2YSB0eXBlIHRvIHdoaWNoIGVhY2ggdmFsdWUgc2hvdWxkIGJlCi0gICAgY29udmVydGVkIGJlZm9yZSBhZGRpbmcgaXQgdG8gdGhlIENvbGxlY3Rpb24uCi0tLT4KLTwhRUxFTUVOVCBsaXN0LWVudHJpZXMgICAgKHZhbHVlLWNsYXNzPywgKG51bGwtdmFsdWV8dmFsdWUpKik+Ci0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PSBTdWJvcmRpbmF0ZSBFbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLTwhLS0KLSAgICBUaGUgImFjdGlvbi1saXN0ZW5lciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiB0aGUgY29uY3JldGUgQWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZAotICAgIGR1cmluZyB0aGUgSW52b2tlIEFwcGxpY2F0aW9uIHBoYXNlIG9mIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgbGlmZWN5Y2xlLgotICAgIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGFjdGlvbi1saXN0ZW5lciAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImFwcGxpY2F0aW9uLWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotICAgIG5hbWUgb2YgdGhlIGNvbmNyZXRlIEFwcGxpY2F0aW9uRmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0Ci0gICAgd2lsbCBiZSBjYWxsZWQgd2hlbiBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoQVBQTElDQVRJT05fRkFDVE9SWSkgaXMKLSAgICBjYWxsZWQuIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGFwcGxpY2F0aW9uLWZhY3RvcnkgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJhdHRyaWJ1dGUtY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgSmF2YSB0eXBlIG9mIHRoZSB2YWx1ZQotICAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGF0dHJpYnV0ZSBuYW1lLiAgSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgYXR0cmlidXRlLWNsYXNzICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJhdHRyaWJ1dGUtbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBuYW1lIHVuZGVyIHdoaWNoIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgdmFsdWUgd2lsbCBiZSBzdG9yZWQsIGluIHRoZSBnZW5lcmljIGF0dHJpYnV0ZXMgb2YgdGhlCi0gICAgVUlDb21wb25lbnQgd2UgYXJlIHJlbGF0ZWQgdG8uCi0tLT4KLTwhRUxFTUVOVCBhdHRyaWJ1dGUtbmFtZSAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImNvbXBvbmVudC1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIGEgY29uY3JldGUgVUlDb21wb25lbnQgaW1wbGVtZW50YXRpb24gY2xhc3MuICBJdCBtdXN0IGJlIG9mCi0gICAgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGNvbXBvbmVudC1jbGFzcyAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiY29tcG9uZW50LWZhbWlseSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBjb21wb25lbnQgZmFtaWx5IGZvcgotICAgIHdoaWNoIHRoZSBSZW5kZXJlciByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50ICJyZW5kZXJlciIgZWxlbWVudCB3aWxsIGJlCi0gICAgdXNlZC4KLS0tPgotPCFFTEVNRU5UIGNvbXBvbmVudC1mYW1pbHkgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJjb21wb25lbnQtdHlwZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBuYW1lIHVuZGVyIHdoaWNoIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgVUlDb21wb25lbnQgY2xhc3Mgc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCi0tLT4KLTwhRUxFTUVOVCBjb21wb25lbnQtdHlwZSAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImNvbnZlcnRlci1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIGEgY29uY3JldGUgQ29udmVydGVyIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBjb252ZXJ0ZXItY2xhc3MgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImNvbnZlcnRlci1mb3ItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBmb3Igd2hpY2ggYSBDb252ZXJ0ZXIgY2xhc3Mgd2lsbCBiZSByZWdpc3RlcmVkLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBjb252ZXJ0ZXItZm9yLWNsYXNzICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJjb252ZXJ0ZXItaWQiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgaWRlbnRpZmllciB1bmRlciB3aGljaCB0aGUKLSAgICBjb3JyZXNwb25kaW5nIENvbnZlcnRlciBjbGFzcyBzaG91bGQgYmUgcmVnaXN0ZXJlZC4KLS0tPgotPCFFTEVNRU5UIGNvbnZlcnRlci1pZCAgICAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImRlZmF1bHQtcmVuZGVyLWtpdC1pZCIgZWxlbWVudCBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIGRlZmluZQotICAgIGEgcmVuZGVya2l0IHRvIGJlIHVzZWQgb3RoZXIgdGhhbiB0aGUgc3RhbmRhcmQgb25lLiAKLS0tPgotPCFFTEVNRU5UIGRlZmF1bHQtcmVuZGVyLWtpdC1pZCAgICgjUENEQVRBKT4KLQotPCEtLQotICAgICBUaGUgImRlZmF1bHQtbG9jYWxlIiBlbGVtZW50IGRlY2xhcmVzIHRoZSBkZWZhdWx0IGxvY2FsZSBmb3IgdGhpcwotICAgICBhcHBsaWNhdGlvbiBpbnN0YW5jZS4gIEl0IG11c3QgYmUgc3BlY2lmaWVkIGFzCi0gICAgIDpsYW5ndWFnZTpbXzpjb3VudHJ5OltfOnZhcmlhbnQ6XV0gd2l0aG91dCB0aGUgY29sb25zLCBmb3IgZXhhbXBsZQotICAgICAiamFfSlBfU0pJUyIuICBUaGUgc2VwYXJhdG9ycyBiZXR3ZWVuIHRoZSBzZWdtZW50cyBtYXkgYmUgJy0nIG9yCi0gICAgICdfJy4KLS0tPgotPCFFTEVNRU5UIGRlZmF1bHQtbG9jYWxlICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAiZGVmYXVsdC12YWx1ZSIgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUgcHJvcGVydHkgb3IgYXR0cmlidXRlCi0gICAgaW4gd2hpY2ggdGhpcyBlbGVtZW50IHJlc2lkZXMuICBUaGlzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUKLSAgICAic3VnZ2VzdGVkLXZhbHVlIiBpbiB0aGF0IHRoZSBwcm9wZXJ0eSBvciBhdHRyaWJ1dGUgbXVzdCB0YWtlIHRoZQotICAgIHZhbHVlLCB3aGVyZWFzIGluICJzdWdnZXN0ZWQtdmFsdWUiIHRha2luZyB0aGUgdmFsdWUgaXMgb3B0aW9uYWwuCi0tLT4KLTwhRUxFTUVOVCBkZWZhdWx0LXZhbHVlICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAiZGVzY3JpcHRpb24iIGVsZW1lbnQgY29udGFpbnMgYSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBlbGVtZW50Ci0gICAgaXQgaXMgbmVzdGVkIGluLCBvcHRpb25hbGx5IGZsYWdnZWQgd2l0aCBhIGxhbmd1YWdlIGNvZGUgdXNpbmcgdGhlCi0gICAgInhtbDpsYW5nIiBhdHRyaWJ1dGUuCi0tLT4KLTwhRUxFTUVOVCBkZXNjcmlwdGlvbiAgICAgQU5ZPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uICAgICB4bWw6bGFuZyAgICAgICAgJUxhbmd1YWdlOyAgICAgICNJTVBMSUVEPgotCi0KLTwhLS0KLSAgICBUaGUgImRpc3BsYXktbmFtZSIgZWxlbWVudCBpcyBhIHNob3J0IGRlc2NyaXB0aXZlIG5hbWUgZGVzY3JpYmluZyB0aGUKLSAgICBlbnRpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50IGl0IGlzIG5lc3RlZCBpbiwgaW50ZW5kZWQgdG8gYmUKLSAgICBkaXNwbGF5ZWQgYnkgdG9vbHMsIGFuZCBvcHRpb25hbGx5IGZsYWdnZWQgd2l0aCBhIGxhbmd1YWdlIGNvZGUgdXNpbmcKLSAgICB0aGUgInhtbDpsYW5nIiBhdHRyaWJ1dGUuCi0tLT4KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgICAgKCNQQ0RBVEEpPgotPCFBVFRMSVNUIGRpc3BsYXktbmFtZSAgICB4bWw6bGFuZyAgICAgICAgJUxhbmd1YWdlOyAgICAgICNJTVBMSUVEPgotCi08IS0tCi0gICAgVGhlICJmYWNlcy1jb250ZXh0LWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZAotICAgIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIEZhY2VzQ29udGV4dEZhY3RvcnkgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4KLSAgICBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRkFDRVNfQ09OVEVYVF9GQUNUT1JZKSBpcyBjYWxsZWQuIEl0IG11c3QKLSAgICBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgZmFjZXMtY29udGV4dC1mYWN0b3J5ICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAiZnJvbS1hY3Rpb24iIGVsZW1lbnQgY29udGFpbnMgYW4gYWN0aW9uIHJlZmVyZW5jZSBleHByZXNzaW9uCi0gICAgdGhhdCBtdXN0IGhhdmUgYmVlbiBleGVjdXRlZCAoYnkgdGhlIGRlZmF1bHQgQWN0aW9uTGlzdGVuZXIgZm9yIGhhbmRsaW5nCi0gICAgYXBwbGljYXRpb24gbGV2ZWwgZXZlbnRzKSBpbiBvcmRlciB0byBzZWxlY3QgdGhpcyBuYXZpZ2F0aW9uIHJ1bGUuICBJZgotICAgIG5vdCBzcGVjaWZpZWQsIHRoaXMgcnVsZSB3aWxsIGJlIHJlbGV2YW50IG5vIG1hdHRlciB3aGljaCBhY3Rpb24gcmVmZXJlbmNlCi0gICAgd2FzIGV4ZWN1dGVkIChvciBpZiBubyBhY3Rpb24gcmVmZXJlbmNlIHdhcyBleGVjdXRlZCkuCi0KLSAgICBUaGlzIHZhbHVlIG11c3QgYmUgb2YgdHlwZSAiQWN0aW9uIi4KLS0tPgotPCFFTEVNRU5UIGZyb20tYWN0aW9uICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJmcm9tLW91dGNvbWUiIGVsZW1lbnQgY29udGFpbnMgYSBsb2dpY2FsIG91dGNvbWUgc3RyaW5nIHJldHVybmVkCi0gICAgYnkgdGhlIGV4ZWN1dGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBhY3Rpb24gbWV0aG9kIHNlbGVjdGVkIHZpYSBhbgotICAgICJhY3Rpb25SZWYiIHByb3BlcnR5IChvciBhIGxpdGVyYWwgdmFsdWUgc3BlY2lmaWVkIGJ5IGFuICJhY3Rpb24iCi0gICAgcHJvcGVydHkpIG9mIGEgVUlDb21tYW5kIGNvbXBvbmVudC4gIElmIHNwZWNpZmllZCwgdGhpcyBydWxlIHdpbGwgYmUKLSAgICByZWxldmFudCBvbmx5IGlmIHRoZSBvdXRjb21lIHZhbHVlIG1hdGNoZXMgdGhpcyBlbGVtZW50J3MgdmFsdWUuICBJZgotICAgIG5vdCBzcGVjaWZpZWQsIHRoaXMgcnVsZSB3aWxsIGJlIHJlbGV2YW50IG5vIG1hdHRlciB3aGF0IHRoZSBvdXRjb21lCi0gICAgdmFsdWUgd2FzLgotLS0+Ci08IUVMRU1FTlQgZnJvbS1vdXRjb21lICAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJmcm9tLXZpZXctaWQiIGVsZW1lbnQgY29udGFpbnMgdGhlIHZpZXcgaWRlbnRpZmllciBvZiB0aGUgdmlldwotICAgIGZvciB3aGljaCB0aGUgY29udGFpbmluZyBuYXZpZ2F0aW9uIHJ1bGUgaXMgcmVsZXZhbnQuICBJZiBubwotICAgICJmcm9tLXZpZXciIGVsZW1lbnQgaXMgc3BlY2lmaWVkLCB0aGlzIHJ1bGUgYXBwbGllcyB0byBuYXZpZ2F0aW9uCi0gICAgZGVjaXNpb25zIG9uIGFsbCB2aWV3cy4gIElmIHRoaXMgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBhIHZhbHVlCi0gICAgb2YgIioiIGlzIGFzc3VtZWQsIG1lYW5pbmcgdGhhdCB0aGlzIG5hdmlnYXRpb24gcnVsZSBhcHBsaWVzIHRvIGFsbAotICAgIHZpZXdzLgotCi0gICAgVGhpcyB2YWx1ZSBtdXN0IGJlIG9mIHR5cGUgIlZpZXdJZFBhdHRlcm4iLgotLS0+Ci08IUVMRU1FTlQgZnJvbS12aWV3LWlkICAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJrZXkiIGVsZW1lbnQgaXMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hcCBrZXkgdGhhdAotICAgIHdpbGwgYmUgc3RvcmVkIGluIGEgbWFuYWdlZCBwcm9wZXJ0eSBvZiB0eXBlIGphdmEudXRpbC5NYXAuICAKLS0tPgotPCFFTEVNRU5UIGtleSAgICAgICAgICAgICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAia2V5LWNsYXNzIiBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSB0byB3aGljaCBlYWNoICJrZXkiCi0gICAgZWxlbWVudCBpbiBhIHNldCBvZiAibWFwLWVudHJ5IiBlbGVtZW50cyB3aWxsIGJlIGNvbnZlcnRlZCB0by4gIEl0Ci0gICAgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLiAgSWYgb21pdHRlZCwgImphdmEubGFuZy5TdHJpbmciCi0gICAgaXMgYXNzdW1lZC4KLS0tPgotPCFFTEVNRU5UIGtleS1jbGFzcyAgICAgICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAibGFyZ2UtaWNvbiIgZWxlbWVudCBjb250YWlucyB0aGUgcmVzb3VyY2UgcGF0aCB0byBhIGxhcmdlICgzMngzMikKLSAgICBpY29uIGltYWdlLiAgVGhlIGltYWdlIG1heSBiZSBpbiBlaXRoZXIgR0lGIG9yIEpQRyBmb3JtYXQuCi0tLT4KLTwhRUxFTUVOVCBsYXJnZS1pY29uICAgICAgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJsaWZlY3ljbGUtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiB0aGUgY29uY3JldGUgTGlmZWN5Y2xlRmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkCi0gICAgd2hlbiBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoTElGRUNZQ0xFX0ZBQ1RPUlkpIGlzIGNhbGxlZC4gSXQgbXVzdCBiZSAKLSAgICBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgbGlmZWN5Y2xlLWZhY3RvcnkgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJtYW5hZ2VkLWJlYW4tY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi0gICAgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBpbnN0YW50aWF0ZSBhIG5ldyBpbnN0YW5jZQotICAgIGlmIGNyZWF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbWFuYWdlZCBiZWFuIGlzIHJlcXVlc3RlZC4gIEl0IG11c3QgYmUgb2YKLSAgICB0eXBlICJDbGFzc05hbWUiLgotCi0gICAgVGhlIHNwZWNpZmllZCBjbGFzcyBtdXN0IGNvbmZvcm0gdG8gc3RhbmRhcmQgSmF2YUJlYW5zIGNvbnZlbnRpb25zLgotICAgIEluIHBhcnRpY3VsYXIsIGl0IG11c3QgaGF2ZSBhIHB1YmxpYyB6ZXJvLWFyZ3VtZW50cyBjb25zdHJ1Y3RvciwgYW5kCi0gICAgemVybyBvciBtb3JlIHB1YmxpYyBwcm9wZXJ0eSBzZXR0ZXJzLgotLS0+Ci08IUVMRU1FTlQgbWFuYWdlZC1iZWFuLWNsYXNzICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAibWFuYWdlZC1iZWFuLW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgYXR0cmlidXRlIG5hbWUgdW5kZXIKLSAgICB3aGljaCBhIG1hbmFnZWQgYmVhbiB3aWxsIGJlIHNlYXJjaGVkIGZvciwgYXMgd2VsbCBhcyBzdG9yZWQgKHVubGVzcwotICAgIHRoZSAibWFuYWdlZC1iZWFuLXNjb3BlIiB2YWx1ZSBpcyAibm9uZSIpLiAgSXQgbXVzdCBiZSBvZiB0eXBlCi0gICAgIklkZW50aWZpZXIiLgotLS0+Ci08IUVMRU1FTlQgbWFuYWdlZC1iZWFuLW5hbWUgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgIm1hbmFnZWQtYmVhbi1zY29wZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBzY29wZSBpbnRvIHdoaWNoIGEgbmV3bHkKLSAgICBjcmVhdGVkIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgbWFuYWdlZCBiZWFuIHdpbGwgYmUgc3RvcmVkICh1bmxlc3MKLSAgICB0aGUgdmFsdWUgaXMgIm5vbmUiKS4gIEl0IG11c3QgYmUgb2YgdHlwZSAiU2NvcGVPck5vbmUiLgotLS0+Ci08IUVMRU1FTlQgbWFuYWdlZC1iZWFuLXNjb3BlICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAibmF2aWdhdGlvbi1oYW5kbGVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBOYXZpZ2F0aW9uSGFuZGxlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkCi0gICAgZHVyaW5nIHRoZSBJbnZva2UgQXBwbGljYXRpb24gcGhhc2Ugb2YgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBsaWZlY3ljbGUsCi0gICAgaWYgdGhlIGRlZmF1bHQgQWN0aW9uTGlzdGVuZXIgKHByb3ZpZGVkIGJ5IHRoZSBKU0YgaW1wbGVtZW50YXRpb24pIGlzIHVzZWQuCi0gICAgSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgbmF2aWdhdGlvbi1oYW5kbGVyICgjUENEQVRBKT4KLQotPCEtLQotVGhlICJwaGFzZS1saXN0ZW5lciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi1uYW1lIG9mIHRoZSBjb25jcmV0ZSBQaGFzZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZQotcmVnaXN0ZXJlZCBvbiB0aGUgTGlmZWN5Y2xlLiBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBwaGFzZS1saXN0ZW5lciAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgInJlZGlyZWN0IiBlbGVtZW50IGluZGljYXRlcyB0aGF0IG5hdmlnYXRpb24gdG8gdGhlIHNwZWNpZmllZAotICAgICJ0by12aWV3LWlkIiBzaG91bGQgYmUgYWNjb21wbGlzaGVkIGJ5IHBlcmZvcm1pbmcgYW4gSFRUUCByZWRpcmVjdAotICAgIHJhdGhlciB0aGFuIHRoZSB1c3VhbCBWaWV3SGFuZGxlciBtZWNoYW5pc21zLgotLS0+Ci08IUVMRU1FTlQgcmVkaXJlY3QgRU1QVFk+Ci0KLTwhLS0KLSAgICBUaGUgInN1Z2dlc3RlZC12YWx1ZSIgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUgcHJvcGVydHkgb3IKLSAgICBhdHRyaWJ1dGUgaW4gd2hpY2ggdGhpcyBlbGVtZW50IHJlc2lkZXMuICBUaGlzIHZhbHVlIGlzIGFkdmlzb3J5Ci0gICAgb25seSBhbmQgaXMgaW50ZW5kZWQgZm9yIHRvb2xzIHRvIHVzZSB3aGVuIHBvcHVsYXRpbmcgcGFsbGV0dGVzLgotLS0+Ci08IUVMRU1FTlQgc3VnZ2VzdGVkLXZhbHVlICgjUENEQVRBKT4KLQotCi08IS0tCi0KLSAgICBUaGUgInZpZXctaGFuZGxlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiB0aGUgY29uY3JldGUgVmlld0hhbmRsZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZAotICAgIGR1cmluZyB0aGUgUmVzdG9yZSBWaWV3IGFuZCBSZW5kZXIgUmVzcG9uc2UgcGhhc2VzIG9mIHRoZSByZXF1ZXN0Ci0gICAgcHJvY2Vzc2luZyBsaWZlY3ljbGUuICBUaGUgZmFjZXMgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEKLSAgICBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MKLS0tPgotPCFFTEVNRU5UIHZpZXctaGFuZGxlciAoI1BDREFUQSk+Ci0KLTwhLS0KLQotICAgIFRoZSAic3RhdGUtbWFuYWdlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiB0aGUgY29uY3JldGUgU3RhdGVNYW5hZ2VyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICBkdXJpbmcgdGhlIFJlc3RvcmUgVmlldyBhbmQgUmVuZGVyIFJlc3BvbnNlIHBoYXNlcyBvZiB0aGUgcmVxdWVzdAotICAgIHByb2Nlc3NpbmcgbGlmZWN5Y2xlLiAgVGhlIGZhY2VzIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhCi0gICAgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzCi0tLT4KLTwhRUxFTUVOVCBzdGF0ZS1tYW5hZ2VyICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAibnVsbC12YWx1ZSIgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGUgbWFuYWdlZCBwcm9wZXJ0eSBpbiB3aGljaCB3ZQotICAgIGFyZSBuZXN0ZWQgd2lsbCBiZSBleHBsaWNpdGx5IHNldCB0byBudWxsIGlmIG91ciBtYW5hZ2VkIGJlYW4gaXMKLSAgICBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIG9taXR0aW5nIHRoZSBtYW5hZ2VkCi0gICAgcHJvcGVydHkgZWxlbWVudCBlbnRpcmVseSwgd2hpY2ggd2lsbCBjYXVzZSBubyBwcm9wZXJ0eSBzZXR0ZXIgdG8gYmUKLSAgICBjYWxsZWQgZm9yIHRoaXMgcHJvcGVydHkuCi0KLSAgICBUaGUgIm51bGwtdmFsdWUiIGVsZW1lbnQgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBhc3NvY2lhdGVkCi0gICAgInByb3BlcnR5LWNsYXNzIiBpZGVudGlmaWVzIGEgSmF2YSBjbGFzcywgbm90IGEgSmF2YSBwcmltaXRpdmUuCi0tLT4KLTwhRUxFTUVOVCBudWxsLXZhbHVlIEVNUFRZPgotCi0KLTwhLS0KLSAgICBUaGUgInByb3BlcnR5LWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmEgdHlwZSBvZiB0aGUgdmFsdWUKLSAgICBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9wZXJ0eSBuYW1lLiAgSXQgbXVzdCBiZSBvZiB0eXBlICJKYXZhVHlwZSIuCi0gICAgSWYgbm90IHNwZWNpZmllZCwgaXQgY2FuIGJlIGluZmVycmVkIGZyb20gZXhpc3RpbmcgY2xhc3NlczsgaG93ZXZlciwKLSAgICB0aGlzIGVsZW1lbnQgc2hvdWxkIGJlIHNwZWNpZmllZCBpZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGdvaW5nCi0gICAgdG8gYmUgdGhlIHNvdXJjZSBmb3IgZ2VuZXJhdGluZyB0aGUgY29ycmVzcG9uZGluZyBjbGFzc2VzLgotLS0+Ci08IUVMRU1FTlQgcHJvcGVydHktY2xhc3MgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJwcm9wZXJ0eS1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmFCZWFucyBwcm9wZXJ0eSBuYW1lCi0gICAgdW5kZXIgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgbWF5IGJlIHN0b3JlZC4KLS0tPgotPCFFTEVNRU5UIHByb3BlcnR5LW5hbWUgICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAicHJvcGVydHktcmVzb2x2ZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIFByb3BlcnR5UmVzb2x2ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQKLSAgICBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgdmFsdWUgYmluZGluZyBleHByZXNzaW9ucy4KLSAgICBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBwcm9wZXJ0eS1yZXNvbHZlciAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAicmVmZXJlbmNlZC1iZWFuLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotICAgIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgKGVpdGhlciBhYnN0cmFjdCBvciBjb25jcmV0ZSkgb3IgSmF2YSBpbnRlcmZhY2UKLSAgICBpbXBsZW1lbnRlZCBieSB0aGUgY29ycmVzcG9uZGluZyByZWZlcmVuY2VkIGJlYW4uICBJdCBtdXN0IGJlIG9mIHR5cGUKLSAgICAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHJlZmVyZW5jZWQtYmVhbi1jbGFzcyAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInJlZmVyZW5jZWQtYmVhbi1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGF0dHJpYnV0ZSBuYW1lIHVuZGVyCi0gICAgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgcmVmZXJlbmNlZCBiZWFuIG1heSBiZSBhc3N1bWVkIHRvIGJlIHN0b3JlZCwKLSAgICBpbiBvbmUgb2YgdGhlIHNjb3BlcyBkZWZpbmVkIGJ5IHRoZSAiU2NvcGUiIHR5cGUuICBJdCBtdXN0IGJlIG9mIHR5cGUKLSAgICAiSWRlbnRpZmllciIuCi0tLT4KLTwhRUxFTUVOVCByZWZlcmVuY2VkLWJlYW4tbmFtZSAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAicmVuZGVyLWtpdC1pZCIgZWxlbWVudCByZXByZXNlbnRzIGFuIGlkZW50aWZpZXIgZm9yIHRoZQotICAgIFJlbmRlcktpdCByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50ICJyZW5kZXIta2l0IiBlbGVtZW50LgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyLWtpdC1pZCAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJyZW5kZXIta2l0LWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgYSBjb25jcmV0ZSBSZW5kZXJLaXQgaW1wbGVtZW50YXRpb24gY2xhc3MuICBJdCBtdXN0IGJlIG9mCi0gICAgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHJlbmRlci1raXQtY2xhc3MgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInJlbmRlcmVyLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgYSBjb25jcmV0ZSBSZW5kZXJlciBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gIEl0IG11c3QgYmUgb2YKLSAgICB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyZXItY2xhc3MgICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAicmVuZGVyLWtpdC1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBSZW5kZXJLaXRGYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICB3aGVuIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShSRU5ERVJfS0lUX0ZBQ1RPUlkpIGlzIGNhbGxlZC4gSXQgbXVzdCBiZSAKLSAgICBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyLWtpdC1mYWN0b3J5ICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAicmVuZGVyZXItdHlwZSIgZWxlbWVudCByZXByZXNlbnRzIGEgcmVuZGVyZXIgdHlwZSBpZGVudGlmaWVyIGZvciB0aGUKLSAgICBSZW5kZXJlciByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50ICJyZW5kZXJlciIgZWxlbWVudC4KLS0tPgotPCFFTEVNRU5UIHJlbmRlcmVyLXR5cGUgICAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgInNtYWxsLWljb24iIGVsZW1lbnQgY29udGFpbnMgdGhlIHJlc291cmNlIHBhdGggdG8gYSBsYXJnZSAoMTZ4MTYpCi0gICAgaWNvbiBpbWFnZS4gIFRoZSBpbWFnZSBtYXkgYmUgaW4gZWl0aGVyIEdJRiBvciBKUEcgZm9ybWF0LgotLS0+Ci08IUVMRU1FTlQgc21hbGwtaWNvbiAgICAgICgjUENEQVRBKT4KLQotPCEtLQotICAgICBUaGUgInN1cHBvcnRlZC1sb2NhbGUiIGVsZW1lbnQgYWxsb3dzIGF1dGhvcnMgdG8gZGVjbGFyZSB3aGljaAotICAgICBsb2NhbGVzIGFyZSBzdXBwb3J0ZWQgaW4gdGhpcyBhcHBsaWNhdGlvbiBpbnN0YW5jZS4KLQotICAgICBJdCBtdXN0IGJlIHNwZWNpZmllZCBhcyA6bGFuZ3VhZ2U6W186Y291bnRyeTpbXzp2YXJpYW50Ol1dIHdpdGhvdXQKLSAgICAgdGhlIGNvbG9ucywgZm9yIGV4YW1wbGUgImphX0pQX1NKSVMiLiAgVGhlIHNlcGFyYXRvcnMgYmV0d2VlbiB0aGUKLSAgICAgc2VnbWVudHMgbWF5IGJlICctJyBvciAnXycuCi0tLT4KLTwhRUxFTUVOVCBzdXBwb3J0ZWQtbG9jYWxlICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAidG8tdmlldyIgZWxlbWVudCBjb250YWlucyB0aGUgdmlldyBpZGVudGlmaWVyIG9mIHRoZSBuZXh0IHZpZXcKLSAgICB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaWYgdGhpcyBuYXZpZ2F0aW9uIHJ1bGUgaXMgbWF0Y2hlZC4gIEl0Ci0gICAgbXVzdCBiZSBvZiB0eXBlICJWaWV3SWQiLgotLS0+Ci08IUVMRU1FTlQgdG8tdmlldy1pZCAgICAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJ2YWxpZGF0b3ItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiBhIGNvbmNyZXRlIFZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gIEl0IG11c3QgYmUgb2YKLSAgICB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgdmFsaWRhdG9yLWNsYXNzICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJ2YWxpZGF0b3ItaWQiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgaWRlbnRpZmllciB1bmRlciB3aGljaCB0aGUKLSAgICBjb3JyZXNwb25kaW5nIFZhbGlkYXRvciBjbGFzcyBzaG91bGQgYmUgcmVnaXN0ZXJlZC4KLS0tPgotPCFFTEVNRU5UIHZhbGlkYXRvci1pZCAgICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAidmFsdWUiIGVsZW1lbnQgaXMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGxpdGVyYWwKLSAgICB2YWx1ZSB0byB3aGljaCBhIHNjYWxhciBtYW5hZ2VkIHByb3BlcnR5IHdpbGwgYmUgc2V0LCBvciBhIHZhbHVlCi0gICAgYmluZGluZyBleHByZXNzaW9uICgiI3suLi59IikgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZQotICAgIHJlcXVpcmVkIHZhbHVlLiAgSXQgd2lsbCBiZSBjb252ZXJ0ZWQgYXMgc3BlY2lmaWVkIGZvciB0aGUgYWN0dWFsCi0gICAgcHJvcGVydHkgdHlwZS4KLS0tPgotPCFFTEVNRU5UIHZhbHVlICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJ2YWx1ZS1jbGFzcyIgZWxlbWVudCBkZWZpbmVzIHRoZSBKYXZhIHR5cGUgdG8gd2hpY2ggZWFjaAotICAgICJ2YWx1ZSIgZWxlbWVudCdzIHZhbHVlIHdpbGwgYmUgY29udmVydGVkIHRvLCBwcmlvciB0byBhZGRpbmcgaXQgdG8KLSAgICB0aGUgImxpc3QtZW50cmllcyIgbGlzdCBmb3IgYSBtYW5hZ2VkIHByb3BlcnR5IHRoYXQgaXMgYQotICAgIGphdmEudXRpbC5MaXN0LCBvciBhICJtYXAtZW50cmllcyIgbWFwIGZvciBhIG1hbmFnZWQgcHJvcGVydHkgdGhhdAotICAgIGlzIGEgamF2YS51dGlsLk1hcC4gIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4gIElmIG9taXR0ZWQsCi0gICAgImphdmEubGFuZy5TdHJpbmciIGlzIGFzc3VtZWQuCi0tLT4KLTwhRUxFTUVOVCB2YWx1ZS1jbGFzcyAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgInZhcmlhYmxlLXJlc29sdmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBWYXJpYWJsZVJlc29sdmVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSB1c2VkCi0gICAgZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mIHZhbHVlIGJpbmRpbmcgZXhwcmVzc2lvbnMuCi0gICAgSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgdmFyaWFibGUtcmVzb2x2ZXIgKCNQQ0RBVEEpPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJZGVudGlmaWVyIEF0dHJpYnV0ZXMgPT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotPCFBVFRMSVNUIGFjdGlvbi1saXN0ZW5lciAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhcHBsaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXBwbGljYXRpb24tZmFjdG9yeSAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF0dHJpYnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhdHRyaWJ1dGUtY2xhc3MgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXR0cmlidXRlLWV4dGVuc2lvbiAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF0dHJpYnV0ZS1uYW1lICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb21wb25lbnQgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29tcG9uZW50LWNsYXNzICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbXBvbmVudC1leHRlbnNpb24gICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb21wb25lbnQtZmFtaWx5ICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29tcG9uZW50LXR5cGUgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbnZlcnRlciAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb252ZXJ0ZXItY2xhc3MgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udmVydGVyLWZvci1jbGFzcyAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbnZlcnRlci1pZCAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZWZhdWx0LWxvY2FsZSAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVmYXVsdC1yZW5kZXIta2l0LWlkICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlZmF1bHQtdmFsdWUgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGlzcGxheS1uYW1lICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZhY2VzLWNvbmZpZyAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmYWNlcy1jb250ZXh0LWZhY3RvcnkgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmFjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZyb20tYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmcm9tLW91dGNvbWUgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZnJvbS12aWV3LWlkICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGljb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qga2V5LWNsYXNzICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxhcmdlLWljb24gICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsaWZlY3ljbGUgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGlmZWN5Y2xlLWZhY3RvcnkgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxpc3QtZW50cmllcyAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsb2NhbGUtY29uZmlnICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFuYWdlZC1iZWFuICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hbmFnZWQtYmVhbi1jbGFzcyAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYW5hZ2VkLWJlYW4tbmFtZSAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFuYWdlZC1iZWFuLXNjb3BlICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hbmFnZWQtcHJvcGVydHkgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYXAtZW50cmllcyAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFwLWVudHJ5ICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1lc3NhZ2UtYnVuZGxlICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBuYXZpZ2F0aW9uLWNhc2UgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbmF2aWdhdGlvbi1oYW5kbGVyICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG5hdmlnYXRpb24tcnVsZSAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBudWxsLXZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcGhhc2UtbGlzdGVuZXIgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHByb3BlcnR5ICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcm9wZXJ0eS1jbGFzcyAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcHJvcGVydHktZXh0ZW5zaW9uICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHByb3BlcnR5LW5hbWUgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcm9wZXJ0eS1yZXNvbHZlciAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVkaXJlY3QgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlZmVyZW5jZWQtYmVhbiAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWZlcmVuY2VkLWJlYW4tY2xhc3MgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVmZXJlbmNlZC1iZWFuLW5hbWUgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlci1raXQgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXIta2l0LWNsYXNzICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyLWtpdC1mYWN0b3J5ICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlci1raXQtaWQgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXJlciAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyZXItY2xhc3MgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlcmVyLWV4dGVuc2lvbiAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXJlci10eXBlICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc21hbGwtaWNvbiAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHN0YXRlLW1hbmFnZXIgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzdWdnZXN0ZWQtdmFsdWUgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc3VwcG9ydGVkLWxvY2FsZSAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRvLXZpZXctaWQgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB2YWxpZGF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmFsaWRhdG9yLWNsYXNzICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZhbGlkYXRvci1pZCAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmFsdWUtY2xhc3MgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZhcmlhYmxlLXJlc29sdmVyICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB2aWV3LWhhbmRsZXIgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2RhZDhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSw4OTUgKzAsMCBAQAotPCEtLQotICAgIERURCBmb3IgdGhlIEphdmFTZXJ2ZXIgRmFjZXMgQXBwbGljYXRpb24gQ29uZmlndXJhdGlvbiBGaWxlIChWZXJzaW9uIDEuMSkKLQotICAgIFRvIHN1cHBvcnQgdmFsaWRhdGlvbiBvZiB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZShzKSwgaW5jbHVkZSB0aGUgZm9sbG93aW5nCi0gICAgRE9DVFlQRSBlbGVtZW50IGF0IHRoZSBiZWdpbm5pbmcgKGFmdGVyIHRoZSAieG1sIiBkZWNsYXJhdGlvbik6Ci0KLSAgICA8IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQwotICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMS8vRU4iCi0gICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCI+Ci0KLSAgICAkSWQ6IHdlYi1mYWNlc2NvbmZpZ18xXzEuZHRkLHYgMS4xIDIwMDcvMDUvMjUgMjE6MTI6NDggZGF2aWRfd2lsbGlhbXMgRXhwICQKLQotLS0+Ci0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PSBEZWZpbmVkIFR5cGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLTwhLS0KLSAgICBBbiAiQWN0aW9uIiBpcyBhIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgYSBtZXRob2QgYmluZGluZwotICAgIGV4cHJlc3Npb24gdGhhdCBwb2ludHMgYXQgYSBtZXRob2Qgd2l0aCBubyBhcmd1bWVudHMgdGhhdCByZXR1cm5zIGEKLSAgICBTdHJpbmcuICBJdCBtdXN0IGJlIGJyYWNrZXRlZCB3aXRoICIje30iLCBmb3IgZXhhbXBsZSwKLSAgICAiI3tjYXJkZW1vLmJ1eUNhcn0iLgotLS0+Ci08IUVOVElUWSAlIEFjdGlvbiAiQ0RBVEEiPgotCi0KLTwhLS0KLSAgICBBICJDbGFzc05hbWUiIGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpcwotICAgIGluc3RhbnRpYXRlZCB0byBwcm92aWRlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBlbmNsb3NpbmcgZWxlbWVudC4KLS0tPgotPCFFTlRJVFkgJSBDbGFzc05hbWUgIkNEQVRBIj4KLQotCi08IS0tCi0gICAgQW4gIklkZW50aWZpZXIiIGlzIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgdGhhdCBjb25mb3JtcyB0byB0aGUgdmFyaWFibGUKLSAgICBuYW1pbmcgY29udmVudGlvbnMgb2YgdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgKEpMUyBTZWN0aW9uID8uPy4/KS4KLS0tPgotPCFFTlRJVFkgJSBJZGVudGlmaWVyICJDREFUQSI+Ci0KLQotPCEtLQotICAgIEEgIkphdmFUeXBlIiBpcyBlaXRoZXIgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGlzCi0gICAgaW5zdGFudGlhdGVkIHRvIHByb3ZpZGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGVuY2xvc2luZyBlbGVtZW50LCBvcgotICAgIHRoZSBuYW1lIG9mIGEgSmF2YSBwcmltaXRpdmUgdHlwZSAoc3VjaCBhcyBpbnQgb3IgY2hhcikuICBUaGUgY2xhc3MgbmFtZQotICAgIG9yIHByaW1pdGl2ZSB0eXBlIG1heSBvcHRpb25hbGx5IGJlIGZvbGxvd2VkIGJ5ICJbXSIgdG8gaW5kaWNhdGUgdGhhdAotICAgIHRoZSB1bmRlcmx5aW5nIGRhdGEgbXVzdCBiZSBhbiBhcnJheSwgcmF0aGVyIHRoYW4gYSBzY2FsYXIgdmFyaWFibGUuCi0tLT4KLTwhRU5USVRZICUgSmF2YVR5cGUgIkNEQVRBIj4KLQotCi08IS0tCi0gICAgQSAiTGFuZ3VhZ2UiIGlzIGEgbG93ZXIgY2FzZSB0d28tbGV0dGVyIGNvZGUgZm9yIGEgbGFuZ3VhZ2UgYXMgZGVmaW5lZAotICAgIGJ5IElTTC02MzkuCi0tLT4KLTwhRU5USVRZICUgTGFuZ3VhZ2UgIkNEQVRBIj4KLQotCi08IS0tCi0gICAgQSAiUmVzb3VyY2VQYXRoIiBpcyB0aGUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB0byBhIHJlc291cmNlIGZpbGUKLSAgICAoc3VjaCBhcyBhIGxvZ28gaW1hZ2UpLgotLS0+Ci08IUVOVElUWSAlIFJlc291cmNlUGF0aCAiQ0RBVEEiPgotCi0KLTwhLS0KLSAgICBBICJTY29wZSIgaXMgdGhlIHdlbGwta25vd24gbmFtZSBvZiBhIHNjb3BlIGluIHdoaWNoIG1hbmFnZWQgYmVhbnMgbWF5Ci0gICAgb3B0aW9uYWxseSBiZSBkZWZpbmVkIHRvIGJlIGNyZWF0ZWQgaW4uCi0tLT4KLTwhRU5USVRZICUgU2NvcGUgIihyZXF1ZXN0fHNlc3Npb258YXBwbGljYXRpb24pIj4KLQotCi0KLTwhLS0KLSAgICBBICJTY29wZU9yTm9uZSIgZWxlbWVudCBkZWZpbmVzIHRoZSBsZWdhbCB2YWx1ZXMgZm9yIHRoZQotICAgIDxtYW5hZ2VkLWJlYW4tc2NvcGU+IGVsZW1lbnQncyBib2R5IGNvbnRlbnQsIHdoaWNoIGluY2x1ZGVzCi0gICAgYWxsIG9mIHRoZSBzY29wZXMgcmVzcHJlc2VudGVkIGJ5IHRoZSAiU2NvcGUiIHR5cGUsIHBsdXMgdGhlCi0gICAgIm5vbmUiIHZhbHVlIGluZGljYXRpbmcgdGhhdCBhIGNyZWF0ZWQgYmVhbiBzaG91bGQgbm90IGJlCi0gICAgc3RvcmVkIGludG8gYW55IHNjb3BlLgotLS0+Ci08IUVOVElUWSAlIFNjb3BlT3JOb25lICIocmVxdWVzdHxzZXNzaW9ufGFwcGxpY2F0aW9ufG5vbmUpIj4KLQotCi08IS0tCi0gICAgQSAiVmlld0lkUGF0dGVybiIgaXMgYSBwYXR0ZXJuIGZvciBtYXRjaGluZyB2aWV3IGlkZW50aWZpZXJzIGluCi0gICAgb3JkZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIG5hdmlnYXRpb24gcnVsZSBzaG91bGQgYmUKLSAgICBmaXJlZC4gIEl0IG11c3QgY29udGFpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0KLSAgICAtIFRoZSBleGFjdCBtYXRjaCBmb3IgYSB2aWV3IGlkZW50aWZpZXIgdGhhdCBpcyByZWNvZ25pemVkCi0gICAgICBieSB0aGUgdGhlIFZpZXdIYW5kbGVyIGltcGxlbWVudGF0aW9uIGJlaW5nIHVzZWQgKHN1Y2ggYXMKLSAgICAgICIvaW5kZXguanNwIiBpZiB5b3UgYXJlIHVzaW5nIHRoZSBkZWZhdWx0IFZpZXdIYW5kbGVyKS4KLQotICAgIC0gQSBwcm9wZXIgcHJlZml4IG9mIGEgdmlldyBpZGVudGlmaWVyLCBwbHVzIGEgdHJhaWxpbmcgIioiCi0gICAgICBjaGFyYWN0ZXIuICBUaGlzIHBhdHRlcm4gaW5kaWNhdGVzIHRoYXQgYWxsIHZpZXcgaWRlbnRpZmllcnMgdGhhdAotICAgICAgbWF0Y2ggdGhlIHBvcnRpb24gb2YgdGhlIHBhdHRlcm4gdXAgdG8gdGhlIGFzdGVyaXNrIHdpbGwgbWF0Y2ggdGhlCi0gICAgICBzdXJyb3VuZGluZyBydWxlLiAgV2hlbiBtb3JlIHRoYW4gb25lIG1hdGNoIGV4aXN0cywgdGhlIG1hdGNoIHdpdGgKLSAgICAgIHRoZSBsb25nZXN0IHBhdHRlcm4gaXMgc2VsZWN0ZWQuCi0KLSAgICAtIEFuICIqIiBjaGFyYWN0ZXIsIHdoaWNoIG1lYW5zIHRoYXQgdGhpcyBwYXR0ZXJuIGFwcGxpZXMgdG8gYWxsCi0gICAgICB2aWV3IGlkZW50aWZpZXJzLgotLS0+Ci08IUVOVElUWSAlIFZpZXdJZFBhdHRlcm4gIkNEQVRBIj4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09IFRvcCBMZXZlbCBFbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotPCEtLQotICAgIFRoZSAiZmFjZXMtY29uZmlnIiBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCi0gICAgaGllcmFyY2h5LCBhbmQgY29udGFpbnMgbmVzdGVkIGVsZW1lbnRzIGZvciBhbGwgb2YgdGhlIG90aGVyIGNvbmZpZ3VyYXRpb24KLSAgICBzZXR0aW5ncy4KLS0tPgotPCFFTEVNRU5UIGZhY2VzLWNvbmZpZyAgICAoKGFwcGxpY2F0aW9ufGZhY3Rvcnl8Y29tcG9uZW50fGNvbnZlcnRlcnxtYW5hZ2VkLWJlYW58bmF2aWdhdGlvbi1ydWxlfHJlZmVyZW5jZWQtYmVhbnxyZW5kZXIta2l0fGxpZmVjeWNsZXx2YWxpZGF0b3IpKik+Ci08IUFUVExJU1QgZmFjZXMtY29uZmlnCi0gICAgICAgeG1sbnMgQ0RBVEEgI0ZJWEVEICJodHRwOi8vamF2YS5zdW4uY29tL0pTRi9Db25maWd1cmF0aW9uIj4KLQotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT0gRGVmaW5pdGlvbiBFbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IS0tCi0gICAgVGhlICJhcHBsaWNhdGlvbiIgZWxlbWVudCBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBkZWZpbmUgdGhlIHZhcmlvdXMKLSAgICBwZXItYXBwbGljYXRpb24tc2luZ2xldG9uIGltcGxlbWVudGF0aW9uIGFydGlmYWN0cyBmb3IgYSBwYXJ0aWN1bGFyIHdlYgotICAgIGFwcGxpY2F0aW9uIHRoYXQgaXMgdXRpbGl6aW5nIEphdmFTZXJ2ZXIgRmFjZXMuICBGb3IgbmVzdGVkIGVsZW1lbnRzCi0gICAgdGhhdCBhcmUgbm90IHNwZWNpZmllZCwgdGhlIEpTRiBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYSBzdWl0YWJsZQotICAgIGRlZmF1bHQuCi0tLT4KLTwhRUxFTUVOVCBhcHBsaWNhdGlvbiAgICAgKChhY3Rpb24tbGlzdGVuZXJ8ZGVmYXVsdC1yZW5kZXIta2l0LWlkfG1lc3NhZ2UtYnVuZGxlfG5hdmlnYXRpb24taGFuZGxlcnx2aWV3LWhhbmRsZXJ8c3RhdGUtbWFuYWdlcnxwcm9wZXJ0eS1yZXNvbHZlcnx2YXJpYWJsZS1yZXNvbHZlcnxsb2NhbGUtY29uZmlnKSopPgotCi0KLTwhLS0KLSAgICBUaGUgImZhY3RvcnkiIGVsZW1lbnQgcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gZGVmaW5lIHRoZSB2YXJpb3VzCi0gICAgRmFjdG9yaWVzIHRoYXQgY29tcHJpc2UgcGFydHMgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIEphdmFTZXJ2ZXIKLSAgICBGYWNlcy4gIEZvciBuZXN0ZWQgZWxlbWVudHMgdGhhdCBhcmUgbm90IHNwZWNpZmllZCwgdGhlIEpTRgotICAgIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhIHN1aXRhYmxlIGRlZmF1bHQuCi0tLT4KLTwhRUxFTUVOVCBmYWN0b3J5ICAgICAoKGFwcGxpY2F0aW9uLWZhY3Rvcnl8ZmFjZXMtY29udGV4dC1mYWN0b3J5fGxpZmVjeWNsZS1mYWN0b3J5fHJlbmRlci1raXQtZmFjdG9yeSkqKT4KLQotCi08IS0tCi0gICAgVGhlICJhdHRyaWJ1dGUiIGVsZW1lbnQgcmVwcmVzZW50cyBhIG5hbWVkLCB0eXBlZCwgdmFsdWUgYXNzb2NpYXRlZCB3aXRoCi0gICAgdGhlIHBhcmVudCBVSUNvbXBvbmVudCB2aWEgdGhlIGdlbmVyaWMgYXR0cmlidXRlcyBtZWNoYW5pc20uCi0KLSAgICBBdHRyaWJ1dGUgbmFtZXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgcGFyZW50IChvciByZWxhdGVkKQotICAgIGNvbXBvbmVudC4KLS0tPgotPCFFTEVNRU5UIGF0dHJpYnV0ZSAgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgYXR0cmlidXRlLW5hbWUsIGF0dHJpYnV0ZS1jbGFzcywgZGVmYXVsdC12YWx1ZT8sIHN1Z2dlc3RlZC12YWx1ZT8sIGF0dHJpYnV0ZS1leHRlbnNpb24qKT4KLQotPCEtLSAKLSAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgYXR0cmlidXRlLiAgTWF5IGNvbnRhaW4gaW1wbGVtZW50YXRpb24KLSAgICBzcGVjaWZpYyBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgYXR0cmlidXRlLWV4dGVuc2lvbiBBTlk+Ci0KLQotPCEtLQotICAgIFRoZSAiY29tcG9uZW50IiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBVSUNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbgotICAgIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIHNwZWNpZmllZCB0eXBlIGlkZW50aWZpZXIsCi0gICAgYWxvbmcgd2l0aCBpdHMgYXNzb2NpYXRlZCBwcm9wZXJ0aWVzIGFuZCBhdHRyaWJ1dGVzLiAgQ29tcG9uZW50IHR5cGVzIG11c3QKLSAgICBiZSB1bmlxdWUgd2l0aGluIHRoZSBlbnRpcmUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgTmVzdGVkICJhdHRyaWJ1dGUiIGVsZW1lbnRzIGlkZW50aWZ5IGdlbmVyaWMgYXR0cmlidXRlcyB0aGF0IGFyZSByZWNvZ25pemVkCi0gICAgYnkgdGhlIGltcGxlbWVudGF0aW9uIGxvZ2ljIG9mIHRoaXMgY29tcG9uZW50LiAgTmVzdGVkICJwcm9wZXJ0eSIgZWxlbWVudHMKLSAgICBpZGVudGlmeSBKYXZhQmVhbnMgcHJvcGVydGllcyBvZiB0aGUgY29tcG9uZW50IGNsYXNzIHRoYXQgbWF5IGJlIGV4cG9zZWQKLSAgICBmb3IgbWFuaXB1bGF0aW9uIHZpYSB0b29scy4KLS0tPgotPCFFTEVNRU5UIGNvbXBvbmVudCAgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgY29tcG9uZW50LXR5cGUsIGNvbXBvbmVudC1jbGFzcywgZmFjZXQqLCBhdHRyaWJ1dGUqLCBwcm9wZXJ0eSosIGNvbXBvbmVudC1leHRlbnNpb24qKT4KLQotPCEtLSAKLSAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgY29tcG9uZW50LiAgTWF5IGNvbnRhaW4gaW1wbGVtZW50YXRpb24KLSAgICBzcGVjaWZpYyBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgY29tcG9uZW50LWV4dGVuc2lvbiBBTlk+Ci0KLTwhLS0KLSAgIERlZmluZSB0aGUgbmFtZSBhbmQgb3RoZXIgZGVzaWduLXRpbWUgaW5mb3JtYXRpb24gZm9yIGEgZmFjZXQgdGhhdCBpcwotICAgYXNzb2NpYXRlZCB3aXRoIGEgcmVuZGVyZXIgb3IgYSBjb21wb25lbnQuCi0tLT4KLQotPCFFTEVNRU5UIGZhY2V0ICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBmYWNldC1uYW1lLCBmYWNldC1leHRlbnNpb24qKT4KLQotPCEtLSAKLSAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgZmFjZXQuICBNYXkgY29udGFpbiBpbXBsZW1lbnRhdGlvbgotICAgIHNwZWNpZmljIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBmYWNldC1leHRlbnNpb24gQU5ZPgotCi08IS0tCi0gICAgVGhlICJmYWNldC1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZhY2V0IG5hbWUgdW5kZXIgd2hpY2ggYQotICAgIFVJQ29tcG9uZW50IHdpbGwgYmUgYWRkZWQgdG8gaXRzIHBhcmVudC4gIEl0IG11c3QgYmUgb2YgdHlwZQotICAgICJJZGVudGlmaWVyIi4KLS0tPgotPCFFTEVNRU5UIGZhY2V0LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJjb252ZXJ0ZXIiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIENvbnZlcnRlciBpbXBsZW1lbnRhdGlvbgotICAgIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIHNwZWNpZmllZCBjb252ZXJ0ZXIgaWRlbnRpZmllci4KLSAgICBDb252ZXJ0ZXIgaWRlbnRpZmllcnMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlbnRpcmUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgTmVzdGVkICJhdHRyaWJ1dGUiIGVsZW1lbnRzIGlkZW50aWZ5IGdlbmVyaWMgYXR0cmlidXRlcyB0aGF0IG1heSBiZQotICAgIGNvbmZpZ3VyZWQgb24gdGhlIGNvcnJlc3BvbmRpbmcgVUlDb21wb25lbnQgaW4gb3JkZXIgdG8gYWZmZWN0IHRoZQotICAgIG9wZXJhdGlvbiBvZiB0aGUgQ29udmVydGVyLiAgTmVzdGVkICJwcm9wZXJ0eSIgZWxlbWVudHMgaWRlbnRpZnkgSmF2YUJlYW5zCi0gICAgcHJvcGVydGllcyBvZiB0aGUgQ29udmVydGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgbWF5IGJlIGNvbmZpZ3VyZWQKLSAgICB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZiB0aGUgQ29udmVydGVyLgotLS0+Ci08IUVMRU1FTlQgY29udmVydGVyICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCAoY29udmVydGVyLWlkIHwgY29udmVydGVyLWZvci1jbGFzcyksIGNvbnZlcnRlci1jbGFzcywgYXR0cmlidXRlKiwgcHJvcGVydHkqKT4KLQotCi08IS0tCi0gICAgVGhlICJpY29uIiBlbGVtZW50IGNvbnRhaW5zICJzbWFsbC1pY29uIiBhbmQgImxhcmdlLWljb24iIGVsZW1lbnRzIHRoYXQKLSAgICBzcGVjaWZ5IHRoZSByZXNvcnVjZSBwYXRocyBmb3Igc21hbGwgYW5kIGxhcmdlIEdJRiBvciBKUEcgaWNvbiBpbWFnZXMKLSAgICB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYSBHVUkgdG9vbC4KLS0tPgotPCFFTEVNRU5UIGljb24gICAgICAgICAgICAoc21hbGwtaWNvbj8sIGxhcmdlLWljb24/KT4KLTwhQVRUTElTVCBpY29uICAgICAgICAgICAgeG1sOmxhbmcgICAgICAgICVMYW5ndWFnZTsgICAgICAjSU1QTElFRD4KLQotPCEtLQotICAgIFRoZSAibGlmZWN5Y2xlIiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIHNwZWNpZnkKLSAgICBtb2RpZmljYXRpb25zIHRvIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGRlZmF1bHQgTGlmZWN5Y2xlCi0gICAgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotLS0+Ci08IUVMRU1FTlQgbGlmZWN5Y2xlICAgICAgIChwaGFzZS1saXN0ZW5lciopPgotCi08IS0tCi0gICAgIFRoZSAibG9jYWxlLWNvbmZpZyIgZWxlbWVudCBhbGxvd3MgdGhlIGFwcCBkZXZlbG9wZXIgdG8gZGVjbGFyZSB0aGUKLSAgICAgc3VwcG9ydGVkIGxvY2FsZXMgZm9yIHRoaXMgYXBwbGljYXRpb24uICAKLS0tPgotPCFFTEVNRU5UIGxvY2FsZS1jb25maWcgKGRlZmF1bHQtbG9jYWxlPywgc3VwcG9ydGVkLWxvY2FsZSopPgotCi08IS0tCi0gICAgVGhlICJtYW5hZ2VkLWJlYW4iIGVsZW1lbnQgcmVwcmVzZW50cyBhIEphdmFCZWFuLCBvZiBhIHBhcnRpY3VsYXIgY2xhc3MsCi0gICAgdGhhdCB3aWxsIGJlIGR5bmFtaWNhbGx5IGluc3RhbnRpYXRlZCBhdCBydW50aW1lIChieSB0aGUgZGVmYXVsdAotICAgIFZhcmlhYmxlUmVzb2x2ZXIgaW1wbGVtZW50YXRpb24pIGlmIGl0IGlzIHJlZmVyZW5jZWQgYXMgdGhlIGZpcnN0IGVsZW1lbnQKLSAgICBvZiBhIHZhbHVlIGJpbmRpbmcgZXhwcmVzc2lvbiwgYW5kIG5vIGNvcnJlc3BvbmRpbmcgYmVhbiBjYW4gYmUKLSAgICBpZGVudGlmaWVkIGluIGFueSBzY29wZS4gIEluIGFkZGl0aW9uIHRvIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWFuYWdlZCBiZWFuLAotICAgIGFuZCB0aGUgb3B0aW9uYWwgc3RvcmluZyBvZiBpdCBpbnRvIHRoZSBzcGVjaWZpZWQgc2NvcGUsIHRoZSBuZXN0ZWQKLSAgICBtYW5hZ2VkLXByb3BlcnR5IGVsZW1lbnRzIGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mCi0gICAgc2V0dGFibGUgSmF2YUJlYW5zIHByb3BlcnRpZXMgb2YgdGhlIGNyZWF0ZWQgaW5zdGFuY2UuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLWJlYW4gKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIG1hbmFnZWQtYmVhbi1uYW1lLCBtYW5hZ2VkLWJlYW4tY2xhc3MsIG1hbmFnZWQtYmVhbi1zY29wZSwgKG1hbmFnZWQtcHJvcGVydHkqIHwgbWFwLWVudHJpZXMgfCBsaXN0LWVudHJpZXMpKT4KLQotCi08IS0tCi0gICAgVGhlICJtYW5hZ2VkLXByb3BlcnR5IiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCBwcm9wZXJ0eSBvZiBhCi0gICAgbWFuYWdlZCBiZWFuIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgKG9yIHZhbHVlIHNldCkKLSAgICBpZiB0aGUgY29ycmVzcG9uZGluZyBtYW5hZ2VkIGJlYW4gaXMgYXV0b21hdGljYWxseSBjcmVhdGVkLgotLS0+Ci08IUVMRU1FTlQgbWFuYWdlZC1wcm9wZXJ0eSAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgcHJvcGVydHktbmFtZSwgcHJvcGVydHktY2xhc3M/LCAobWFwLWVudHJpZXN8bnVsbC12YWx1ZXx2YWx1ZXxsaXN0LWVudHJpZXMpKT4KLQotCi08IS0tCi0gICAgVGhlICJtYXAtZW50cnkiIGVsZW1lbnQgcmVwcnNlbnRzIGEgc2luZ2xlIGtleS1lbnRyeSBwYWlyIHRoYXQKLSAgICB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb21wdXRlZCB2YWx1ZSBvZiBhIG1hbmFnZWQgcHJvcGVydHkgb2YgdHlwZQotICAgIGphdmEudXRpbC5NYXAuCi0tLT4KLTwhRUxFTUVOVCBtYXAtZW50cnkgKGtleSwgKG51bGwtdmFsdWV8dmFsdWUpKT4KLQotCi08IS0tCi0gICAgVGhlICJtYXAtZW50cmllcycgZWxlbWVudCByZXByZXNlbnRzIGEgc2V0IG9mIGtleS1lbnRyeSBwYWlycyB0aGF0Ci0gICAgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29tcHV0ZWQgdmFsdWUgb2YgYSBtYW5hZ2VkIHByb3BlcnR5IG9mIHR5cGUKLSAgICBqYXZhLnV0aWwuTWFwLiAgSW4gYWRkaXRpb24sIHRoZSBKYXZhIGNsYXNzIHR5cGVzIG9mIHRoZSBrZXkgYW5kIGVudHJ5Ci0gICAgdmFsdWVzIG1heSBiZSBvcHRpb25hbGx5IGRlY2xhcmVkLgotLS0+Ci08IUVMRU1FTlQgbWFwLWVudHJpZXMgKGtleS1jbGFzcz8sIHZhbHVlLWNsYXNzPywgbWFwLWVudHJ5Kik+Ci0KLQotPCEtLQotICAgIFRoZSBiYXNlIG5hbWUgb2YgYSByZXNvdXJjZSBidW5kbGUgcmVwcmVzZW50aW5nIHRoZSBtZXNzYWdlIHJlc291cmNlcwotICAgIGZvciB0aGlzIGFwcGxpY2F0aW9uLiAgU2VlIHRoZSBKYXZhRG9jcyBmb3IgdGhlICJqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUiCi0gICAgY2xhc3MgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHN5bnRheCBvZiByZXNvdXJjZSBidW5kbGUgbmFtZXMuCi0tLT4KLQotPCFFTEVNRU5UIG1lc3NhZ2UtYnVuZGxlICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJuYXZpZ2F0aW9uLWNhc2UiIGVsZW1lbnQgZGVzY3JpYmVzIGEgcGFydGljdWxhciBjb21iaW5hdGlvbiBvZgotICAgIGNvbmRpdGlvbnMgdGhhdCBtdXN0IG1hdGNoIGZvciB0aGlzIGNhc2UgdG8gYmUgZXhlY3V0ZWQsIGFuZCB0aGUKLSAgICB2aWV3IGlkIG9mIHRoZSBjb21wb25lbnQgdHJlZSB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCBuZXh0LgotLS0+Ci08IUVMRU1FTlQgbmF2aWdhdGlvbi1jYXNlIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBmcm9tLWFjdGlvbj8sIGZyb20tb3V0Y29tZT8sIHRvLXZpZXctaWQsIHJlZGlyZWN0Pyk+Ci0KLQotPCEtLQotICAgIFRoZSAibmF2aWdhdGlvbi1ydWxlIiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCBkZWNpc2lvbiBydWxlCi0gICAgdGhhdCB3aWxsIGJlIHV0aWxpemVkIGJ5IHRoZSBkZWZhdWx0IE5hdmlnYXRpb25IYW5kbGVyCi0gICAgaW1wbGVtZW50YXRpb24gdG8gbWFrZSBkZWNpc2lvbnMgb24gd2hhdCB2aWV3IHNob3VsZCBiZSBkaXNwbGF5ZWQKLSAgICBuZXh0LCBiYXNlZCBvbiB0aGUgdmlldyBpZCBiZWluZyBwcm9jZXNzZWQuCi0tLT4KLTwhRUxFTUVOVCBuYXZpZ2F0aW9uLXJ1bGUgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIGZyb20tdmlldy1pZD8sIG5hdmlnYXRpb24tY2FzZSopPgotCi0KLTwhLS0KLSAgICBUaGUgInByb3BlcnR5IiBlbGVtZW50IHJlcHJlc2VudHMgYSBKYXZhQmVhbiBwcm9wZXJ0eSBvZiB0aGUgSmF2YSBjbGFzcwotICAgIHJlcHJlc2VudGVkIGJ5IG91ciBwYXJlbnQgZWxlbWVudC4KLQotICAgIFByb3BlcnR5IG5hbWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIEphdmEgY2xhc3MKLSAgICB0aGF0IGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgZWxlbWVudCwgYW5kIG11c3QgY29ycmVzcG9uZCB0bwotICAgIHByb3BlcnR5IG5hbWVzIHRoYXQgd2lsbCBiZSByZWNvZ25pemVkIHdoZW4gcGVyZm9ybWluZyBpbnRyb3NwZWN0aW9uCi0gICAgYWdhaW5zdCB0aGF0IGNsYXNzIHZpYSBqYXZhLmJlYW5zLkludHJvc3BlY3Rvci4KLS0tPgotPCFFTEVNRU5UIHByb3BlcnR5ICAgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgcHJvcGVydHktbmFtZSwgcHJvcGVydHktY2xhc3MsIGRlZmF1bHQtdmFsdWU/LCBzdWdnZXN0ZWQtdmFsdWU/LCBwcm9wZXJ0eS1leHRlbnNpb24qKT4KLQotPCEtLSAKLSAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgcHJvcGVydHkuICBNYXkgY29udGFpbiBpbXBsZW1lbnRhdGlvbgotICAgIHNwZWNpZmljIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBwcm9wZXJ0eS1leHRlbnNpb24gQU5ZPgotCi08IS0tCi0gICAgVGhlICJyZWZlcmVuY2VkLWJlYW4iIGVsZW1lbnQgcmVwcmVzZW50cyBhdCBkZXNpZ24gdGltZSB0aGUgcHJvbWlzZQotICAgIHRoYXQgYSBKYXZhIG9iamVjdCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgd2lsbCBleGlzdCBhdCBydW50aW1lIGluIHNvbWUKLSAgICBzY29wZSwgdW5kZXIgdGhlIHNwZWNpZmllZCBrZXkuICBUaGlzIGNhbiBiZSB1c2VkIGJ5IGRlc2lnbiB0aW1lIHRvb2xzCi0gICAgdG8gY29uc3RydWN0IHVzZXIgaW50ZXJmYWNlIGRpYWxvZ3MgYmFzZWQgb24gdGhlIHByb3BlcnRpZXMgb2YgdGhlCi0gICAgc3BlY2lmaWVkIGNsYXNzLiAgVGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgYSByZWZlcmVuY2VkIGJlYW4KLSAgICBlbGVtZW50IGhhcyBubyBpbXBhY3Qgb24gdGhlIEphdmFTZXJ2ZXIgRmFjZXMgcnVudGltZSBlbnZpcm9ubWVudAotICAgIGluc2lkZSBhIHdlYiBhcHBsaWNhdGlvbi4KLS0tPgotPCFFTEVNRU5UIHJlZmVyZW5jZWQtYmVhbiAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgcmVmZXJlbmNlZC1iZWFuLW5hbWUsIHJlZmVyZW5jZWQtYmVhbi1jbGFzcyk+Ci0KLQotPCEtLQotICAgIFRoZSAicmVuZGVyLWtpdCIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgUmVuZGVyS2l0IGltcGxlbWVudGF0aW9uCi0gICAgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIHJlbmRlci1raXQtaWQuICBJZiBubwotICAgIHJlbmRlci1raXQtaWQgaXMgc3BlY2lmaWVkLCB0aGUgaWRlbnRpZmllciBvZiB0aGUgZGVmYXVsdCBSZW5kZXJLaXQKLSAgICAoUmVuZGVyS2l0RmFjdG9yeS5ERUZBVUxUX1JFTkRFUl9LSVQpIGlzIGFzc3VtZWQuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXIta2l0ICAgICAgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIHJlbmRlci1raXQtaWQ/LCByZW5kZXIta2l0LWNsYXNzPywgcmVuZGVyZXIqKT4KLQotCi08IS0tCi0gICAgVGhlICJyZW5kZXJlciIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgUmVuZGVyZXIgaW1wbGVtZW50YXRpb24KLSAgICBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IGZhbWlseQotICAgIGFuZCByZW5kZXJlciB0eXBlIGlkZW50aWZpZXJzLCBpbiB0aGUgUmVuZGVyS2l0IGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICBwYXJlbnQgInJlbmRlci1raXQiIGVsZW1lbnQuICBDb21iaW5hdGlvbnMgb2YgY29tcG9uZW50IGZhbWlseSBhbmQgcmVuZGVyZXIKLSAgICB0eXBlIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgUmVuZGVyS2l0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyZW50Ci0gICAgInJlbmRlci1raXQiIGVsZW1lbnQuCi0KLSAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBjb21wb25lbnQgYXR0cmlidXRlcyB0aGF0Ci0gICAgYXJlIHJlY29nbml6ZWQgYnkgdGhpcyByZW5kZXJlci4KLS0tPgotPCFFTEVNRU5UIHJlbmRlcmVyICAgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgY29tcG9uZW50LWZhbWlseSwgcmVuZGVyZXItdHlwZSwgcmVuZGVyZXItY2xhc3MsIGZhY2V0KiwgYXR0cmlidXRlKiwgcmVuZGVyZXItZXh0ZW5zaW9uKik+Ci0KLTwhLS0gCi0gICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIHJlbmRlcmVyLiAgTWF5IGNvbnRhaW4gaW1wbGVtZW50YXRpb24KLSAgICBzcGVjaWZpYyBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyZXItZXh0ZW5zaW9uIEFOWT4KLQotPCEtLQotICAgIFRoZSAidmFsaWRhdG9yIiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBWYWxpZGF0b3IgaW1wbGVtZW50YXRpb24KLSAgICBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkZW50aWZpZXIuCi0gICAgVmFsaWRhdG9yIGlkZW50aWZpZXJzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGF0dHJpYnV0ZXMgdGhhdCBtYXkgYmUKLSAgICBjb25maWd1cmVkIG9uIHRoZSBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGluIG9yZGVyIHRvIGFmZmVjdCB0aGUKLSAgICBvcGVyYXRpb24gb2YgdGhlIFZhbGlkYXRvci4gIE5lc3RlZCAicHJvcGVydHkiIGVsZW1lbnRzIGlkZW50aWZ5IEphdmFCZWFucwotICAgIHByb3BlcnRpZXMgb2YgdGhlIFZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IG1heSBiZSBjb25maWd1cmVkCi0gICAgdG8gYWZmZWN0IHRoZSBvcGVyYXRpb24gb2YgdGhlIFZhbGlkYXRvci4KLS0tPgotPCFFTEVNRU5UIHZhbGlkYXRvciAgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgdmFsaWRhdG9yLWlkLCB2YWxpZGF0b3ItY2xhc3MsIGF0dHJpYnV0ZSosIHByb3BlcnR5Kik+Ci0KLQotPCEtLQotICAgIFRoZSAibGlzdC1lbnRyaWVzIiBlbGVtZW50IHJlcHJlc2VudHMgYSBzZXQgb2YgaW5pdGlhbGl6YXRpb24KLSAgICBlbGVtZW50cyBmb3IgYSBtYW5hZ2VkIHByb3BlcnR5IHRoYXQgaXMgYSBqYXZhLnV0aWwuTGlzdCBvciBhbgotICAgIGFycmF5LiAgSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgInZhbHVlLWNsYXNzIiBlbGVtZW50IGNhbiBvcHRpb25hbGx5Ci0gICAgYmUgdXNlZCB0byBkZWNsYXJlIHRoZSBKYXZhIHR5cGUgdG8gd2hpY2ggZWFjaCB2YWx1ZSBzaG91bGQgYmUKLSAgICBjb252ZXJ0ZWQgYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgQ29sbGVjdGlvbi4KLS0tPgotPCFFTEVNRU5UIGxpc3QtZW50cmllcyAgICAodmFsdWUtY2xhc3M/LCAobnVsbC12YWx1ZXx2YWx1ZSkqKT4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09IFN1Ym9yZGluYXRlIEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotPCEtLQotICAgIFRoZSAiYWN0aW9uLWxpc3RlbmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBBY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkCi0gICAgZHVyaW5nIHRoZSBJbnZva2UgQXBwbGljYXRpb24gcGhhc2Ugb2YgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBsaWZlY3ljbGUuCi0gICAgSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgYWN0aW9uLWxpc3RlbmVyICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAiYXBwbGljYXRpb24tZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi0gICAgbmFtZSBvZiB0aGUgY29uY3JldGUgQXBwbGljYXRpb25GYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQKLSAgICB3aWxsIGJlIGNhbGxlZCB3aGVuIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShBUFBMSUNBVElPTl9GQUNUT1JZKSBpcwotICAgIGNhbGxlZC4gSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgYXBwbGljYXRpb24tZmFjdG9yeSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImF0dHJpYnV0ZS1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhIHR5cGUgb2YgdGhlIHZhbHVlCi0gICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXR0cmlidXRlIG5hbWUuICBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBhdHRyaWJ1dGUtY2xhc3MgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImF0dHJpYnV0ZS1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIG5hbWUgdW5kZXIgd2hpY2ggdGhlCi0gICAgY29ycmVzcG9uZGluZyB2YWx1ZSB3aWxsIGJlIHN0b3JlZCwgaW4gdGhlIGdlbmVyaWMgYXR0cmlidXRlcyBvZiB0aGUKLSAgICBVSUNvbXBvbmVudCB3ZSBhcmUgcmVsYXRlZCB0by4KLS0tPgotPCFFTEVNRU5UIGF0dHJpYnV0ZS1uYW1lICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiY29tcG9uZW50LWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgYSBjb25jcmV0ZSBVSUNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gIEl0IG11c3QgYmUgb2YKLSAgICB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgY29tcG9uZW50LWNsYXNzICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJjb21wb25lbnQtZmFtaWx5IiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGNvbXBvbmVudCBmYW1pbHkgZm9yCi0gICAgd2hpY2ggdGhlIFJlbmRlcmVyIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgInJlbmRlcmVyIiBlbGVtZW50IHdpbGwgYmUKLSAgICB1c2VkLgotLS0+Ci08IUVMRU1FTlQgY29tcG9uZW50LWZhbWlseSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImNvbXBvbmVudC10eXBlIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIG5hbWUgdW5kZXIgd2hpY2ggdGhlCi0gICAgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBjbGFzcyBzaG91bGQgYmUgcmVnaXN0ZXJlZC4KLS0tPgotPCFFTEVNRU5UIGNvbXBvbmVudC10eXBlICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiY29udmVydGVyLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgYSBjb25jcmV0ZSBDb252ZXJ0ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MuICBJdCBtdXN0IGJlIG9mCi0gICAgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGNvbnZlcnRlci1jbGFzcyAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiY29udmVydGVyLWZvci1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIGZvciB3aGljaCBhIENvbnZlcnRlciBjbGFzcyB3aWxsIGJlIHJlZ2lzdGVyZWQuICBJdCBtdXN0IGJlIG9mCi0gICAgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGNvbnZlcnRlci1mb3ItY2xhc3MgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImNvbnZlcnRlci1pZCIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBpZGVudGlmaWVyIHVuZGVyIHdoaWNoIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgQ29udmVydGVyIGNsYXNzIHNob3VsZCBiZSByZWdpc3RlcmVkLgotLS0+Ci08IUVMRU1FTlQgY29udmVydGVyLWlkICAgICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAiZGVmYXVsdC1yZW5kZXIta2l0LWlkIiBlbGVtZW50IGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gZGVmaW5lCi0gICAgYSByZW5kZXJraXQgdG8gYmUgdXNlZCBvdGhlciB0aGFuIHRoZSBzdGFuZGFyZCBvbmUuIAotLS0+Ci08IUVMRU1FTlQgZGVmYXVsdC1yZW5kZXIta2l0LWlkICAgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgIFRoZSAiZGVmYXVsdC1sb2NhbGUiIGVsZW1lbnQgZGVjbGFyZXMgdGhlIGRlZmF1bHQgbG9jYWxlIGZvciB0aGlzCi0gICAgIGFwcGxpY2F0aW9uIGluc3RhbmNlLiAgSXQgbXVzdCBiZSBzcGVjaWZpZWQgYXMKLSAgICAgOmxhbmd1YWdlOltfOmNvdW50cnk6W186dmFyaWFudDpdXSB3aXRob3V0IHRoZSBjb2xvbnMsIGZvciBleGFtcGxlCi0gICAgICJqYV9KUF9TSklTIi4gIFRoZSBzZXBhcmF0b3JzIGJldHdlZW4gdGhlIHNlZ21lbnRzIG1heSBiZSAnLScgb3IKLSAgICAgJ18nLgotLS0+Ci08IUVMRU1FTlQgZGVmYXVsdC1sb2NhbGUgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJkZWZhdWx0LXZhbHVlIiBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBvciBhdHRyaWJ1dGUKLSAgICBpbiB3aGljaCB0aGlzIGVsZW1lbnQgcmVzaWRlcy4gIFRoaXMgdmFsdWUgZGlmZmVycyBmcm9tIHRoZQotICAgICJzdWdnZXN0ZWQtdmFsdWUiIGluIHRoYXQgdGhlIHByb3BlcnR5IG9yIGF0dHJpYnV0ZSBtdXN0IHRha2UgdGhlCi0gICAgdmFsdWUsIHdoZXJlYXMgaW4gInN1Z2dlc3RlZC12YWx1ZSIgdGFraW5nIHRoZSB2YWx1ZSBpcyBvcHRpb25hbC4KLS0tPgotPCFFTEVNRU5UIGRlZmF1bHQtdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJkZXNjcmlwdGlvbiIgZWxlbWVudCBjb250YWlucyBhIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgdGhlIGVsZW1lbnQKLSAgICBpdCBpcyBuZXN0ZWQgaW4sIG9wdGlvbmFsbHkgZmxhZ2dlZCB3aXRoIGEgbGFuZ3VhZ2UgY29kZSB1c2luZyB0aGUKLSAgICAieG1sOmxhbmciIGF0dHJpYnV0ZS4KLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICAgICBBTlk+Ci08IUFUVExJU1QgZGVzY3JpcHRpb24gICAgIHhtbDpsYW5nICAgICAgICAlTGFuZ3VhZ2U7ICAgICAgI0lNUExJRUQ+Ci0KLQotPCEtLQotICAgIFRoZSAiZGlzcGxheS1uYW1lIiBlbGVtZW50IGlzIGEgc2hvcnQgZGVzY3JpcHRpdmUgbmFtZSBkZXNjcmliaW5nIHRoZQotICAgIGVudGl0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgaXQgaXMgbmVzdGVkIGluLCBpbnRlbmRlZCB0byBiZQotICAgIGRpc3BsYXllZCBieSB0b29scywgYW5kIG9wdGlvbmFsbHkgZmxhZ2dlZCB3aXRoIGEgbGFuZ3VhZ2UgY29kZSB1c2luZwotICAgIHRoZSAieG1sOmxhbmciIGF0dHJpYnV0ZS4KLS0tPgotPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAgICAoI1BDREFUQSk+Ci08IUFUVExJU1QgZGlzcGxheS1uYW1lICAgIHhtbDpsYW5nICAgICAgICAlTGFuZ3VhZ2U7ICAgICAgI0lNUExJRUQ+Ci0KLTwhLS0KLSAgICBUaGUgImZhY2VzLWNvbnRleHQtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkCi0gICAgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgRmFjZXNDb250ZXh0RmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcwotICAgIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbgotICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGQUNFU19DT05URVhUX0ZBQ1RPUlkpIGlzIGNhbGxlZC4gSXQgbXVzdAotICAgIGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBmYWNlcy1jb250ZXh0LWZhY3RvcnkgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJmcm9tLWFjdGlvbiIgZWxlbWVudCBjb250YWlucyBhbiBhY3Rpb24gcmVmZXJlbmNlIGV4cHJlc3Npb24KLSAgICB0aGF0IG11c3QgaGF2ZSBiZWVuIGV4ZWN1dGVkIChieSB0aGUgZGVmYXVsdCBBY3Rpb25MaXN0ZW5lciBmb3IgaGFuZGxpbmcKLSAgICBhcHBsaWNhdGlvbiBsZXZlbCBldmVudHMpIGluIG9yZGVyIHRvIHNlbGVjdCB0aGlzIG5hdmlnYXRpb24gcnVsZS4gIElmCi0gICAgbm90IHNwZWNpZmllZCwgdGhpcyBydWxlIHdpbGwgYmUgcmVsZXZhbnQgbm8gbWF0dGVyIHdoaWNoIGFjdGlvbiByZWZlcmVuY2UKLSAgICB3YXMgZXhlY3V0ZWQgKG9yIGlmIG5vIGFjdGlvbiByZWZlcmVuY2Ugd2FzIGV4ZWN1dGVkKS4KLQotICAgIFRoaXMgdmFsdWUgbXVzdCBiZSBvZiB0eXBlICJBY3Rpb24iLgotLS0+Ci08IUVMRU1FTlQgZnJvbS1hY3Rpb24gKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImZyb20tb3V0Y29tZSIgZWxlbWVudCBjb250YWlucyBhIGxvZ2ljYWwgb3V0Y29tZSBzdHJpbmcgcmV0dXJuZWQKLSAgICBieSB0aGUgZXhlY3V0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGFjdGlvbiBtZXRob2Qgc2VsZWN0ZWQgdmlhIGFuCi0gICAgImFjdGlvblJlZiIgcHJvcGVydHkgKG9yIGEgbGl0ZXJhbCB2YWx1ZSBzcGVjaWZpZWQgYnkgYW4gImFjdGlvbiIKLSAgICBwcm9wZXJ0eSkgb2YgYSBVSUNvbW1hbmQgY29tcG9uZW50LiAgSWYgc3BlY2lmaWVkLCB0aGlzIHJ1bGUgd2lsbCBiZQotICAgIHJlbGV2YW50IG9ubHkgaWYgdGhlIG91dGNvbWUgdmFsdWUgbWF0Y2hlcyB0aGlzIGVsZW1lbnQncyB2YWx1ZS4gIElmCi0gICAgbm90IHNwZWNpZmllZCwgdGhpcyBydWxlIHdpbGwgYmUgcmVsZXZhbnQgbm8gbWF0dGVyIHdoYXQgdGhlIG91dGNvbWUKLSAgICB2YWx1ZSB3YXMuCi0tLT4KLTwhRUxFTUVOVCBmcm9tLW91dGNvbWUgICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImZyb20tdmlldy1pZCIgZWxlbWVudCBjb250YWlucyB0aGUgdmlldyBpZGVudGlmaWVyIG9mIHRoZSB2aWV3Ci0gICAgZm9yIHdoaWNoIHRoZSBjb250YWluaW5nIG5hdmlnYXRpb24gcnVsZSBpcyByZWxldmFudC4gIElmIG5vCi0gICAgImZyb20tdmlldyIgZWxlbWVudCBpcyBzcGVjaWZpZWQsIHRoaXMgcnVsZSBhcHBsaWVzIHRvIG5hdmlnYXRpb24KLSAgICBkZWNpc2lvbnMgb24gYWxsIHZpZXdzLiAgSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIGEgdmFsdWUKLSAgICBvZiAiKiIgaXMgYXNzdW1lZCwgbWVhbmluZyB0aGF0IHRoaXMgbmF2aWdhdGlvbiBydWxlIGFwcGxpZXMgdG8gYWxsCi0gICAgdmlld3MuCi0KLSAgICBUaGlzIHZhbHVlIG11c3QgYmUgb2YgdHlwZSAiVmlld0lkUGF0dGVybiIuCi0tLT4KLTwhRUxFTUVOVCBmcm9tLXZpZXctaWQgICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImtleSIgZWxlbWVudCBpcyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWFwIGtleSB0aGF0Ci0gICAgd2lsbCBiZSBzdG9yZWQgaW4gYSBtYW5hZ2VkIHByb3BlcnR5IG9mIHR5cGUgamF2YS51dGlsLk1hcC4gIAotLS0+Ci08IUVMRU1FTlQga2V5ICAgICAgICAgICAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJrZXktY2xhc3MiIGVsZW1lbnQgZGVmaW5lcyB0aGUgSmF2YSB0eXBlIHRvIHdoaWNoIGVhY2ggImtleSIKLSAgICBlbGVtZW50IGluIGEgc2V0IG9mICJtYXAtZW50cnkiIGVsZW1lbnRzIHdpbGwgYmUgY29udmVydGVkIHRvLiAgSXQKLSAgICBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuICBJZiBvbWl0dGVkLCAiamF2YS5sYW5nLlN0cmluZyIKLSAgICBpcyBhc3N1bWVkLgotLS0+Ci08IUVMRU1FTlQga2V5LWNsYXNzICAgICAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJsYXJnZS1pY29uIiBlbGVtZW50IGNvbnRhaW5zIHRoZSByZXNvdXJjZSBwYXRoIHRvIGEgbGFyZ2UgKDMyeDMyKQotICAgIGljb24gaW1hZ2UuICBUaGUgaW1hZ2UgbWF5IGJlIGluIGVpdGhlciBHSUYgb3IgSlBHIGZvcm1hdC4KLS0tPgotPCFFTEVNRU5UIGxhcmdlLWljb24gICAgICAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImxpZmVjeWNsZS1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBMaWZlY3ljbGVGYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICB3aGVuIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShMSUZFQ1lDTEVfRkFDVE9SWSkgaXMgY2FsbGVkLiBJdCBtdXN0IGJlIAotICAgIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBsaWZlY3ljbGUtZmFjdG9yeSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgIm1hbmFnZWQtYmVhbi1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLSAgICBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGEgbmV3IGluc3RhbmNlCi0gICAgaWYgY3JlYXRpb24gb2YgdGhlIHNwZWNpZmllZCBtYW5hZ2VkIGJlYW4gaXMgcmVxdWVzdGVkLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0KLSAgICBUaGUgc3BlY2lmaWVkIGNsYXNzIG11c3QgY29uZm9ybSB0byBzdGFuZGFyZCBKYXZhQmVhbnMgY29udmVudGlvbnMuCi0gICAgSW4gcGFydGljdWxhciwgaXQgbXVzdCBoYXZlIGEgcHVibGljIHplcm8tYXJndW1lbnRzIGNvbnN0cnVjdG9yLCBhbmQKLSAgICB6ZXJvIG9yIG1vcmUgcHVibGljIHByb3BlcnR5IHNldHRlcnMuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLWJlYW4tY2xhc3MgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJtYW5hZ2VkLWJlYW4tbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBhdHRyaWJ1dGUgbmFtZSB1bmRlcgotICAgIHdoaWNoIGEgbWFuYWdlZCBiZWFuIHdpbGwgYmUgc2VhcmNoZWQgZm9yLCBhcyB3ZWxsIGFzIHN0b3JlZCAodW5sZXNzCi0gICAgdGhlICJtYW5hZ2VkLWJlYW4tc2NvcGUiIHZhbHVlIGlzICJub25lIikuICBJdCBtdXN0IGJlIG9mIHR5cGUKLSAgICAiSWRlbnRpZmllciIuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLWJlYW4tbmFtZSAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAibWFuYWdlZC1iZWFuLXNjb3BlIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIHNjb3BlIGludG8gd2hpY2ggYSBuZXdseQotICAgIGNyZWF0ZWQgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBtYW5hZ2VkIGJlYW4gd2lsbCBiZSBzdG9yZWQgKHVubGVzcwotICAgIHRoZSB2YWx1ZSBpcyAibm9uZSIpLiAgSXQgbXVzdCBiZSBvZiB0eXBlICJTY29wZU9yTm9uZSIuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLWJlYW4tc2NvcGUgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJuYXZpZ2F0aW9uLWhhbmRsZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIE5hdmlnYXRpb25IYW5kbGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICBkdXJpbmcgdGhlIEludm9rZSBBcHBsaWNhdGlvbiBwaGFzZSBvZiB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nIGxpZmVjeWNsZSwKLSAgICBpZiB0aGUgZGVmYXVsdCBBY3Rpb25MaXN0ZW5lciAocHJvdmlkZWQgYnkgdGhlIEpTRiBpbXBsZW1lbnRhdGlvbikgaXMgdXNlZC4KLSAgICBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBuYXZpZ2F0aW9uLWhhbmRsZXIgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgInBoYXNlLWxpc3RlbmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLW5hbWUgb2YgdGhlIGNvbmNyZXRlIFBoYXNlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlCi1yZWdpc3RlcmVkIG9uIHRoZSBMaWZlY3ljbGUuIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHBoYXNlLWxpc3RlbmVyICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAicmVkaXJlY3QiIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgbmF2aWdhdGlvbiB0byB0aGUgc3BlY2lmaWVkCi0gICAgInRvLXZpZXctaWQiIHNob3VsZCBiZSBhY2NvbXBsaXNoZWQgYnkgcGVyZm9ybWluZyBhbiBIVFRQIHJlZGlyZWN0Ci0gICAgcmF0aGVyIHRoYW4gdGhlIHVzdWFsIFZpZXdIYW5kbGVyIG1lY2hhbmlzbXMuCi0tLT4KLTwhRUxFTUVOVCByZWRpcmVjdCBFTVBUWT4KLQotPCEtLQotICAgIFRoZSAic3VnZ2VzdGVkLXZhbHVlIiBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBvcgotICAgIGF0dHJpYnV0ZSBpbiB3aGljaCB0aGlzIGVsZW1lbnQgcmVzaWRlcy4gIFRoaXMgdmFsdWUgaXMgYWR2aXNvcnkKLSAgICBvbmx5IGFuZCBpcyBpbnRlbmRlZCBmb3IgdG9vbHMgdG8gdXNlIHdoZW4gcG9wdWxhdGluZyBwYWxsZXR0ZXMuCi0tLT4KLTwhRUxFTUVOVCBzdWdnZXN0ZWQtdmFsdWUgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLQotICAgIFRoZSAidmlldy1oYW5kbGVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBWaWV3SGFuZGxlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkCi0gICAgZHVyaW5nIHRoZSBSZXN0b3JlIFZpZXcgYW5kIFJlbmRlciBSZXNwb25zZSBwaGFzZXMgb2YgdGhlIHJlcXVlc3QKLSAgICBwcm9jZXNzaW5nIGxpZmVjeWNsZS4gIFRoZSBmYWNlcyBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYQotICAgIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcwotLS0+Ci08IUVMRU1FTlQgdmlldy1oYW5kbGVyICgjUENEQVRBKT4KLQotPCEtLQotCi0gICAgVGhlICJzdGF0ZS1tYW5hZ2VyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBTdGF0ZU1hbmFnZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZAotICAgIGR1cmluZyB0aGUgUmVzdG9yZSBWaWV3IGFuZCBSZW5kZXIgUmVzcG9uc2UgcGhhc2VzIG9mIHRoZSByZXF1ZXN0Ci0gICAgcHJvY2Vzc2luZyBsaWZlY3ljbGUuICBUaGUgZmFjZXMgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEKLSAgICBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MKLS0tPgotPCFFTEVNRU5UIHN0YXRlLW1hbmFnZXIgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJudWxsLXZhbHVlIiBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoZSBtYW5hZ2VkIHByb3BlcnR5IGluIHdoaWNoIHdlCi0gICAgYXJlIG5lc3RlZCB3aWxsIGJlIGV4cGxpY2l0bHkgc2V0IHRvIG51bGwgaWYgb3VyIG1hbmFnZWQgYmVhbiBpcwotICAgIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gb21pdHRpbmcgdGhlIG1hbmFnZWQKLSAgICBwcm9wZXJ0eSBlbGVtZW50IGVudGlyZWx5LCB3aGljaCB3aWxsIGNhdXNlIG5vIHByb3BlcnR5IHNldHRlciB0byBiZQotICAgIGNhbGxlZCBmb3IgdGhpcyBwcm9wZXJ0eS4KLQotICAgIFRoZSAibnVsbC12YWx1ZSIgZWxlbWVudCBjYW4gb25seSBiZSB1c2VkIHdoZW4gdGhlIGFzc29jaWF0ZWQKLSAgICAicHJvcGVydHktY2xhc3MiIGlkZW50aWZpZXMgYSBKYXZhIGNsYXNzLCBub3QgYSBKYXZhIHByaW1pdGl2ZS4KLS0tPgotPCFFTEVNRU5UIG51bGwtdmFsdWUgRU1QVFk+Ci0KLQotPCEtLQotICAgIFRoZSAicHJvcGVydHktY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgSmF2YSB0eXBlIG9mIHRoZSB2YWx1ZQotICAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb3BlcnR5IG5hbWUuICBJdCBtdXN0IGJlIG9mIHR5cGUgIkphdmFUeXBlIi4KLSAgICBJZiBub3Qgc3BlY2lmaWVkLCBpdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSBleGlzdGluZyBjbGFzc2VzOyBob3dldmVyLAotICAgIHRoaXMgZWxlbWVudCBzaG91bGQgYmUgc3BlY2lmaWVkIGlmIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgZ29pbmcKLSAgICB0byBiZSB0aGUgc291cmNlIGZvciBnZW5lcmF0aW5nIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzZXMuCi0tLT4KLTwhRUxFTUVOVCBwcm9wZXJ0eS1jbGFzcyAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInByb3BlcnR5LW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgSmF2YUJlYW5zIHByb3BlcnR5IG5hbWUKLSAgICB1bmRlciB3aGljaCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBtYXkgYmUgc3RvcmVkLgotLS0+Ci08IUVMRU1FTlQgcHJvcGVydHktbmFtZSAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJwcm9wZXJ0eS1yZXNvbHZlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiB0aGUgY29uY3JldGUgUHJvcGVydHlSZXNvbHZlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgdXNlZAotICAgIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiB2YWx1ZSBiaW5kaW5nIGV4cHJlc3Npb25zLgotICAgIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHByb3BlcnR5LXJlc29sdmVyICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJyZWZlcmVuY2VkLWJlYW4tY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi0gICAgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyAoZWl0aGVyIGFic3RyYWN0IG9yIGNvbmNyZXRlKSBvciBKYXZhIGludGVyZmFjZQotICAgIGltcGxlbWVudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHJlZmVyZW5jZWQgYmVhbi4gIEl0IG11c3QgYmUgb2YgdHlwZQotICAgICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgcmVmZXJlbmNlZC1iZWFuLWNsYXNzICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAicmVmZXJlbmNlZC1iZWFuLW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgYXR0cmlidXRlIG5hbWUgdW5kZXIKLSAgICB3aGljaCB0aGUgY29ycmVzcG9uZGluZyByZWZlcmVuY2VkIGJlYW4gbWF5IGJlIGFzc3VtZWQgdG8gYmUgc3RvcmVkLAotICAgIGluIG9uZSBvZiB0aGUgc2NvcGVzIGRlZmluZWQgYnkgdGhlICJTY29wZSIgdHlwZS4gIEl0IG11c3QgYmUgb2YgdHlwZQotICAgICJJZGVudGlmaWVyIi4KLS0tPgotPCFFTEVNRU5UIHJlZmVyZW5jZWQtYmVhbi1uYW1lICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJyZW5kZXIta2l0LWlkIiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaWRlbnRpZmllciBmb3IgdGhlCi0gICAgUmVuZGVyS2l0IHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgInJlbmRlci1raXQiIGVsZW1lbnQuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXIta2l0LWlkICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInJlbmRlci1raXQtY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiBhIGNvbmNyZXRlIFJlbmRlcktpdCBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gIEl0IG11c3QgYmUgb2YKLSAgICB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyLWtpdC1jbGFzcyAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAicmVuZGVyZXItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiBhIGNvbmNyZXRlIFJlbmRlcmVyIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXJlci1jbGFzcyAgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJyZW5kZXIta2l0LWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIFJlbmRlcktpdEZhY3RvcnkgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZAotICAgIHdoZW4gRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KFJFTkRFUl9LSVRfRkFDVE9SWSkgaXMgY2FsbGVkLiBJdCBtdXN0IGJlIAotICAgIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXIta2l0LWZhY3RvcnkgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJyZW5kZXJlci10eXBlIiBlbGVtZW50IHJlcHJlc2VudHMgYSByZW5kZXJlciB0eXBlIGlkZW50aWZpZXIgZm9yIHRoZQotICAgIFJlbmRlcmVyIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgInJlbmRlcmVyIiBlbGVtZW50LgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyZXItdHlwZSAgICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAic21hbGwtaWNvbiIgZWxlbWVudCBjb250YWlucyB0aGUgcmVzb3VyY2UgcGF0aCB0byBhIGxhcmdlICgxNngxNikKLSAgICBpY29uIGltYWdlLiAgVGhlIGltYWdlIG1heSBiZSBpbiBlaXRoZXIgR0lGIG9yIEpQRyBmb3JtYXQuCi0tLT4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICAgICAgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgIFRoZSAic3VwcG9ydGVkLWxvY2FsZSIgZWxlbWVudCBhbGxvd3MgYXV0aG9ycyB0byBkZWNsYXJlIHdoaWNoCi0gICAgIGxvY2FsZXMgYXJlIHN1cHBvcnRlZCBpbiB0aGlzIGFwcGxpY2F0aW9uIGluc3RhbmNlLgotCi0gICAgIEl0IG11c3QgYmUgc3BlY2lmaWVkIGFzIDpsYW5ndWFnZTpbXzpjb3VudHJ5OltfOnZhcmlhbnQ6XV0gd2l0aG91dAotICAgICB0aGUgY29sb25zLCBmb3IgZXhhbXBsZSAiamFfSlBfU0pJUyIuICBUaGUgc2VwYXJhdG9ycyBiZXR3ZWVuIHRoZQotICAgICBzZWdtZW50cyBtYXkgYmUgJy0nIG9yICdfJy4KLS0tPgotPCFFTEVNRU5UIHN1cHBvcnRlZC1sb2NhbGUgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJ0by12aWV3IiBlbGVtZW50IGNvbnRhaW5zIHRoZSB2aWV3IGlkZW50aWZpZXIgb2YgdGhlIG5leHQgdmlldwotICAgIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpZiB0aGlzIG5hdmlnYXRpb24gcnVsZSBpcyBtYXRjaGVkLiAgSXQKLSAgICBtdXN0IGJlIG9mIHR5cGUgIlZpZXdJZCIuCi0tLT4KLTwhRUxFTUVOVCB0by12aWV3LWlkICAgICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInZhbGlkYXRvci1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIGEgY29uY3JldGUgVmFsaWRhdG9yIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCB2YWxpZGF0b3ItY2xhc3MgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInZhbGlkYXRvci1pZCIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBpZGVudGlmaWVyIHVuZGVyIHdoaWNoIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgVmFsaWRhdG9yIGNsYXNzIHNob3VsZCBiZSByZWdpc3RlcmVkLgotLS0+Ci08IUVMRU1FTlQgdmFsaWRhdG9yLWlkICAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJ2YWx1ZSIgZWxlbWVudCBpcyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbGl0ZXJhbAotICAgIHZhbHVlIHRvIHdoaWNoIGEgc2NhbGFyIG1hbmFnZWQgcHJvcGVydHkgd2lsbCBiZSBzZXQsIG9yIGEgdmFsdWUKLSAgICBiaW5kaW5nIGV4cHJlc3Npb24gKCIjey4uLn0iKSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlCi0gICAgcmVxdWlyZWQgdmFsdWUuICBJdCB3aWxsIGJlIGNvbnZlcnRlZCBhcyBzcGVjaWZpZWQgZm9yIHRoZSBhY3R1YWwKLSAgICBwcm9wZXJ0eSB0eXBlLgotLS0+Ci08IUVMRU1FTlQgdmFsdWUgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInZhbHVlLWNsYXNzIiBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSB0byB3aGljaCBlYWNoCi0gICAgInZhbHVlIiBlbGVtZW50J3MgdmFsdWUgd2lsbCBiZSBjb252ZXJ0ZWQgdG8sIHByaW9yIHRvIGFkZGluZyBpdCB0bwotICAgIHRoZSAibGlzdC1lbnRyaWVzIiBsaXN0IGZvciBhIG1hbmFnZWQgcHJvcGVydHkgdGhhdCBpcyBhCi0gICAgamF2YS51dGlsLkxpc3QsIG9yIGEgIm1hcC1lbnRyaWVzIiBtYXAgZm9yIGEgbWFuYWdlZCBwcm9wZXJ0eSB0aGF0Ci0gICAgaXMgYSBqYXZhLnV0aWwuTWFwLiAgSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLiAgSWYgb21pdHRlZCwKLSAgICAiamF2YS5sYW5nLlN0cmluZyIgaXMgYXNzdW1lZC4KLS0tPgotPCFFTEVNRU5UIHZhbHVlLWNsYXNzICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAidmFyaWFibGUtcmVzb2x2ZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIFZhcmlhYmxlUmVzb2x2ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQKLSAgICBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgdmFsdWUgYmluZGluZyBleHByZXNzaW9ucy4KLSAgICBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCB2YXJpYWJsZS1yZXNvbHZlciAoI1BDREFUQSk+Ci0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IElkZW50aWZpZXIgQXR0cmlidXRlcyA9PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IUFUVExJU1QgYWN0aW9uLWxpc3RlbmVyICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGFwcGxpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhcHBsaWNhdGlvbi1mYWN0b3J5ICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXR0cmlidXRlICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF0dHJpYnV0ZS1jbGFzcyAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhdHRyaWJ1dGUtZXh0ZW5zaW9uICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXR0cmlidXRlLW5hbWUgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbXBvbmVudCAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb21wb25lbnQtY2xhc3MgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29tcG9uZW50LWV4dGVuc2lvbiAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbXBvbmVudC1mYW1pbHkgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb21wb25lbnQtdHlwZSAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udmVydGVyICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbnZlcnRlci1jbGFzcyAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb252ZXJ0ZXItZm9yLWNsYXNzICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udmVydGVyLWlkICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlZmF1bHQtbG9jYWxlICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZWZhdWx0LXJlbmRlci1raXQtaWQgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVmYXVsdC12YWx1ZSAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmFjZXMtY29uZmlnICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZhY2VzLWNvbnRleHQtZmFjdG9yeSAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmYWNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmFjZXQtZXh0ZW5zaW9uICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZhY2V0LW5hbWUgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmYWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZnJvbS1hY3Rpb24gICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZyb20tb3V0Y29tZSAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmcm9tLXZpZXctaWQgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBrZXktY2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGFyZ2UtaWNvbiAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxpZmVjeWNsZSAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsaWZlY3ljbGUtZmFjdG9yeSAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGlzdC1lbnRyaWVzICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxvY2FsZS1jb25maWcgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYW5hZ2VkLWJlYW4gICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFuYWdlZC1iZWFuLWNsYXNzICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hbmFnZWQtYmVhbi1uYW1lICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYW5hZ2VkLWJlYW4tc2NvcGUgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFuYWdlZC1wcm9wZXJ0eSAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hcC1lbnRyaWVzICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYXAtZW50cnkgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWVzc2FnZS1idW5kbGUgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG5hdmlnYXRpb24tY2FzZSAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBuYXZpZ2F0aW9uLWhhbmRsZXIgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbmF2aWdhdGlvbi1ydWxlICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG51bGwtdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwaGFzZS1saXN0ZW5lciAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcHJvcGVydHkgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHByb3BlcnR5LWNsYXNzICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcm9wZXJ0eS1leHRlbnNpb24gICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcHJvcGVydHktbmFtZSAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHByb3BlcnR5LXJlc29sdmVyICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWRpcmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVmZXJlbmNlZC1iZWFuICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlZmVyZW5jZWQtYmVhbi1jbGFzcyAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWZlcmVuY2VkLWJlYW4tbmFtZSAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyLWtpdCAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlci1raXQtY2xhc3MgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXIta2l0LWZhY3RvcnkgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyLWtpdC1pZCAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlcmVyICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXJlci1jbGFzcyAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyZXItZXh0ZW5zaW9uICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlcmVyLXR5cGUgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzbWFsbC1pY29uICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc3RhdGUtbWFuYWdlciAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHN1Z2dlc3RlZC12YWx1ZSAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzdXBwb3J0ZWQtbG9jYWxlICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdG8tdmlldy1pZCAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZhbGlkYXRvciAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB2YWxpZGF0b3ItY2xhc3MgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmFsaWRhdG9yLWlkICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB2YWx1ZS1jbGFzcyAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmFyaWFibGUtcmVzb2x2ZXIgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZpZXctaGFuZGxlciAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8yLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODU3ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8yLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDIwNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbiA9ICIxLjAiIGVuY29kaW5nID0gIlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgeG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjEuMiI+Ci0KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICRJZDogd2ViLWZhY2VzY29uZmlnXzFfMi54c2QsdiAxLjEgMjAwNy8wNS8yNSAyMToxMjo0OSBkYXZpZF93aWxsaWFtcyBFeHAgJAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgCi0gICAgICAgICAgICA5MDEgU2FuIEFudG9uaW8gUm9hZCwgCi0gICAgICAgICAgICBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiAKLSAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSAKLSAgICAgICAgICAgIHJpZ2h0cyByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKYXZhIEVFLAotICAgICAgICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICA8IVtDREFUQVsKLQotICAgICAgICAgICAgVGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKYXZhU2VydmVyIEZhY2VzIEFwcGxpY2F0aW9uCi0gICAgICAgICAgICBDb25maWd1cmF0aW9uIEZpbGUgKFZlcnNpb24gMS4yKS4KLQotICAgICAgICAgICAgQWxsIEphdmFTZXJ2ZXIgRmFjZXMgY29uZmlndXJhdGlvbiBmaWxlcyBtdXN0IGluZGljYXRlCi0gICAgICAgICAgICB0aGUgSmF2YVNlcnZlciBGYWNlcyBzY2hlbWEgYnkgaW5kaWNhdGluZyB0aGUgSmF2YVNlcnZlcgotICAgICAgICAgICAgRmFjZXMgbmFtZXNwYWNlOgotCi0gICAgICAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLQotICAgICAgICAgICAgYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotICAgICAgICAgICAgdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgICAgICAgICAgPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Ii4uLiIKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4KLSAgICAgICAgICAgICAgICAuLi4KLSAgICAgICAgICAgIDwvZmFjZXMtY29uZmlnPgotCi0gICAgICAgICAgICBUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkCi0gICAgICAgICAgICB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgdXNpbmcgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZQotICAgICAgICAgICAgZm9yIGphdmFlZSBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0gICAgICAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QKLQotICAgICAgICAgICAgXV0+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqYXZhZWVfNS54c2QiLz4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lID0gImZhY2VzLWNvbmZpZyIgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZ1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImZhY2VzLWNvbmZpZyIgZWxlbWVudCBpcyB0aGUgcm9vdCBvZiB0aGUgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGhpZXJhcmNoeSwgYW5kIGNvbnRhaW5zIG5lc3RlZCBlbGVtZW50cyBmb3IgYWxsCi0gICAgICAgICAgICAgICAgb2YgdGhlIG90aGVyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZmFjZXMtY29uZmlnLWNvbnZlcnRlci1JRC11bmlxdWVuZXNzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyIElEcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBkb2N1bWVudC4KLQotICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6Y29udmVydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6Y29udmVydGVyLWlkIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmYWNlcy1jb25maWctY29udmVydGVyLWZvci1jbGFzcy11bmlxdWVuZXNzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgJ2NvbnZlcnRlci1mb3ItY2xhc3MnIGVsZW1lbnQgdmFsdWVzIG11c3QgYmUgdW5pcXVlCi0gICAgICAgICAgICAgICAgICAgIHdpdGhpbiBhIGRvY3VtZW50LgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpjb252ZXJ0ZXItZm9yLWNsYXNzIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmYWNlcy1jb25maWctdmFsaWRhdG9yLUlELXVuaXF1ZW5lc3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3IgSURzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50LgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTp2YWxpZGF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTp2YWxpZGF0b3ItaWQiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImZhY2VzLWNvbmZpZy1tYW5hZ2VkLWJlYW4tbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgTWFuYWdlZCBiZWFuIG5hbWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50LgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTptYW5hZ2VkLWJlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTptYW5hZ2VkLWJlYW4tbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiZmFjZXMtY29uZmlnIiBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gaGllcmFyY2h5LCBhbmQgY29udGFpbnMgbmVzdGVkIGVsZW1lbnRzIGZvciBhbGwKLSAgICAgICAgICAgICAgICBvZiB0aGUgb3RoZXIgY29uZmlndXJhdGlvbiBzZXR0aW5ncy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hcHBsaWNhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmYWN0b3J5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZmFjdG9yeVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1jb21wb25lbnRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctY29udmVydGVyVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbmFnZWQtYmVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW1hbmFnZWQtYmVhblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYXZpZ2F0aW9uLXJ1bGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1uYXZpZ2F0aW9uLXJ1bGVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlZC1iZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctcmVmZXJlbmNlZC1iZWFuVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbmRlci1raXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1yZW5kZXIta2l0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpZmVjeWNsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWxpZmVjeWNsZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3IiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12YWxpZGF0b3JUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmFjZXMtY29uZmlnLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiaWQiIHR5cGUgPSAieHNkOklEIi8+Ci0gICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctdmVyc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gImZhY2VzLWNvbmZpZy1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGZhY2VzLWNvbmZpZy4gIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctYXBwbGljYXRpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJhcHBsaWNhdGlvbiIgZWxlbWVudCBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBkZWZpbmUgdGhlCi0gICAgICAgICAgICAgICAgdmFyaW91cyBwZXItYXBwbGljYXRpb24tc2luZ2xldG9uIGltcGxlbWVudGF0aW9uIGFydGlmYWN0cyBmb3IKLSAgICAgICAgICAgICAgICBhIHBhcnRpY3VsYXIgd2ViIGFwcGxpY2F0aW9uIHRoYXQgaXMgdXRpbGl6aW5nIAotICAgICAgICAgICAgICAgIEphdmFTZXJ2ZXIgRmFjZXMuICBGb3IgbmVzdGVkIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBzcGVjaWZpZWQsIAotICAgICAgICAgICAgICAgIHRoZSBKU0YgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEgc3VpdGFibGUgZGVmYXVsdC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3Rpb24tbGlzdGVuZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiYWN0aW9uLWxpc3RlbmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBkdXJpbmcgdGhlIEludm9rZSBBcHBsaWNhdGlvbiBwaGFzZSBvZiB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCBwcm9jZXNzaW5nIGxpZmVjeWNsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXJlbmRlci1raXQtaWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJkZWZhdWx0LXJlbmRlci1raXQtaWQiIGVsZW1lbnQgYWxsb3dzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiB0byBkZWZpbmUgYSByZW5kZXJraXQgdG8gYmUgdXNlZCBvdGhlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIHRoZSBzdGFuZGFyZCBvbmUuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtYnVuZGxlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBiYXNlIG5hbWUgb2YgYSByZXNvdXJjZSBidW5kbGUgcmVwcmVzZW50aW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZXNzYWdlIHJlc291cmNlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gIFNlZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgSmF2YURvY3MgZm9yIHRoZSAiamF2YS51dGlsLlJlc291cmNlQnVuZGxlIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgc3ludGF4IG9mIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIGJ1bmRsZSBuYW1lcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYXZpZ2F0aW9uLWhhbmRsZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAibmF2aWdhdGlvbi1oYW5kbGVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF2aWdhdGlvbkhhbmRsZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNhbGxlZCBkdXJpbmcgdGhlIEludm9rZSBBcHBsaWNhdGlvbiBwaGFzZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nIGxpZmVjeWNsZSwgaWYgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgQWN0aW9uTGlzdGVuZXIgKHByb3ZpZGVkIGJ5IHRoZSBKU0YgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24pIGlzIHVzZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmlldy1oYW5kbGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgInZpZXctaGFuZGxlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIFZpZXdIYW5kbGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQgZHVyaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBSZXN0b3JlIFZpZXcgYW5kIFJlbmRlciBSZXNwb25zZSBwaGFzZXMgb2YgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgcHJvY2Vzc2luZyBsaWZlY3ljbGUuICBUaGUgZmFjZXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEgZGVmYXVsdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0YXRlLW1hbmFnZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAic3RhdGUtbWFuYWdlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIFN0YXRlTWFuYWdlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkIGR1cmluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgUmVzdG9yZSBWaWV3IGFuZCBSZW5kZXIgUmVzcG9uc2UgcGhhc2VzIG9mIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0IHByb2Nlc3NpbmcgbGlmZWN5Y2xlLiAgVGhlIGZhY2VzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhIGRlZmF1bHQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbC1yZXNvbHZlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJlbC1yZXNvbHZlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5lbC5FTFJlc29sdmVyIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIHVzZWQgZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUwgZXhwcmVzc2lvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHktcmVzb2x2ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicHJvcGVydHktcmVzb2x2ZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVJlc29sdmVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiB2YWx1ZSBiaW5kaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLXJlc29sdmVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAidmFyaWFibGUtcmVzb2x2ZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlUmVzb2x2ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mIHZhbHVlIGJpbmRpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCAKLSAgICAgICAgICAgICAgICBuYW1lPSJsb2NhbGUtY29uZmlnIgotICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbG9jYWxlLWNvbmZpZ1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCAKLSAgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZS1idW5kbGUiCi0gICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hcHBsaWNhdGlvbi1yZXNvdXJjZS1idW5kbGVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24tZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctYXBwbGljYXRpb24tZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpZCIgdHlwZSA9ICJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWFwcGxpY2F0aW9uLXJlc291cmNlLWJ1bmRsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIHJlc291cmNlLWJ1bmRsZSBlbGVtZW50IGluc2lkZSB0aGUgYXBwbGljYXRpb24gZWxlbWVudAotICAgICAgICAgICAgICByZWZlcmVuY2VzIGEgamF2YS51dGlsLlJlc291cmNlQnVuZGxlIGluc3RhbmNlIGJ5IG5hbWUKLSAgICAgICAgICAgICAgdXNpbmcgdGhlIHZhciBlbGVtZW50LiAgUmVzb3VyY2VCdW5kbGVzIHJlZmVyZW5jZWQgaW4gdGhpcwotICAgICAgICAgICAgICBtYW5uZXIgbWF5IGJlIHJldHVybmVkIGJ5IGEgY2FsbCB0bwotICAgICAgICAgICAgICBBcHBsaWNhdGlvbi5nZXRSZXNvdXJjZUJ1bmRsZSgpIHBhc3NpbmcgdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZvciB0aGlzIHJlcXVlc3QgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgdmFyCi0gICAgICAgICAgICAgIGVsZW1lbnQgYmVsb3cuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2UtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgYnkgd2hpY2ggdGhpcyBSZXNvdXJjZUJ1bmRsZSBpbnN0YW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmV0cmlldmVkIGJ5IGEgY2FsbCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb24uZ2V0UmVzb3VyY2VCdW5kbGUoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gImZhY2VzLWNvbmZpZy1hcHBsaWNhdGlvbi1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGFwcGxpY2F0aW9uLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLWZhY3RvcnlUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJmYWN0b3J5IiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGRlZmluZSB0aGUgCi0gICAgICAgICAgICAgICAgdmFyaW91cyBGYWN0b3JpZXMgdGhhdCBjb21wcmlzZSBwYXJ0cyBvZiB0aGUgaW1wbGVtZW50YXRpb24gCi0gICAgICAgICAgICAgICAgb2YgSmF2YVNlcnZlciBGYWNlcy4gIEZvciBuZXN0ZWQgZWxlbWVudHMgdGhhdCBhcmUgbm90IAotICAgICAgICAgICAgICAgIHNwZWNpZmllZCwgdGhlIEpTRiBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYSBzdWl0YWJsZSAKLSAgICAgICAgICAgICAgICBkZWZhdWx0LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFwcGxpY2F0aW9uLWZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJhcHBsaWNhdGlvbi1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgCi0gICAgICAgICAgICAgICAgICAgICAgICBiZSBjYWxsZWQgd2hlbiAKLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShBUFBMSUNBVElPTl9GQUNUT1JZKSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY2VzLWNvbnRleHQtZmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImZhY2VzLWNvbnRleHQtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNDb250ZXh0RmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNhbGxlZCB3aGVuIAotICAgICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZBQ0VTX0NPTlRFWFRfRkFDVE9SWSkgCi0gICAgICAgICAgICAgICAgICAgICAgICBpcyBjYWxsZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlmZWN5Y2xlLWZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImxpZmVjeWNsZS1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIExpZmVjeWNsZUZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KExJRkVDWUNMRV9GQUNUT1JZKSBpcyBjYWxsZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdC1mYWN0b3J5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJyZW5kZXIta2l0LWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgUmVuZGVyS2l0RmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoUkVOREVSX0tJVF9GQUNUT1JZKSBpcyAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZC4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY3RvcnktZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZmFjdG9yeS1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiaWQiIHR5cGUgPSAieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLWZhY3RvcnktZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBmYWN0b3J5LiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1hdHRyaWJ1dGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJhdHRyaWJ1dGUiIGVsZW1lbnQgcmVwcmVzZW50cyBhIG5hbWVkLCB0eXBlZCwgdmFsdWUKLSAgICAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcmVudCBVSUNvbXBvbmVudCB2aWEgdGhlIGdlbmVyaWMKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIG1lY2hhbmlzbS4KLQotICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBuYW1lcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwYXJlbnQKLSAgICAgICAgICAgICAgICAob3IgcmVsYXRlZCkgY29tcG9uZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJhdHRyaWJ1dGUtbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBuYW1lIHVuZGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgd2lsbCBiZSBzdG9yZWQsIGluIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgYXR0cmlidXRlcyBvZiB0aGUgVUlDb21wb25lbnQgd2UgYXJlIHJlbGF0ZWQgCi0gICAgICAgICAgICAgICAgICAgICAgICB0by4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiYXR0cmlidXRlLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmEgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGF0dHJpYnV0ZSBuYW1lLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWRlZmF1bHQtdmFsdWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN1Z2dlc3RlZC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXN1Z2dlc3RlZC12YWx1ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWF0dHJpYnV0ZS1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpZCIgdHlwZSA9ICJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctYXR0cmlidXRlLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgYXR0cmlidXRlLiAgSXQgbWF5IGNvbnRhaW4gCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWNvbXBvbmVudFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImNvbXBvbmVudCIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgVUlDb21wb25lbnQKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZQotICAgICAgICAgICAgICAgIHNwZWNpZmllZCB0eXBlIGlkZW50aWZpZXIsIGFsb25nIHdpdGggaXRzIGFzc29jaWF0ZWQgCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlcy4gIENvbXBvbmVudCB0eXBlcyBtdXN0IGJlIHVuaXF1ZSAKLSAgICAgICAgICAgICAgICB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICAgICAgICAgICAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQgCi0gICAgICAgICAgICAgICAgYXJlIHJlY29nbml6ZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIGxvZ2ljIG9mIHRoaXMgY29tcG9uZW50LgotICAgICAgICAgICAgICAgIE5lc3RlZCAicHJvcGVydHkiIGVsZW1lbnRzIGlkZW50aWZ5IEphdmFCZWFucyBwcm9wZXJ0aWVzIG9mIAotICAgICAgICAgICAgICAgIHRoZSBjb21wb25lbnQgY2xhc3MgdGhhdCBtYXkgYmUgZXhwb3NlZCBmb3IgbWFuaXB1bGF0aW9uIAotICAgICAgICAgICAgICAgIHZpYSB0b29scy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiY29tcG9uZW50LXR5cGUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbmFtZSB1bmRlciAKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGNsYXNzIHNob3VsZCBiZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImNvbXBvbmVudC1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY29uY3JldGUgVUlDb21wb25lbnQgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZmFjZXRUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWF0dHJpYnV0ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWNvbXBvbmVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctY29tcG9uZW50LWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGNvbXBvbmVudC4gIEl0IG1heSBjb250YWluIAotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctZGVmYXVsdC1sb2NhbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJkZWZhdWx0LWxvY2FsZSIgZWxlbWVudCBkZWNsYXJlcyB0aGUgZGVmYXVsdCBsb2NhbGUgCi0gICAgICAgICAgICAgICAgZm9yIHRoaXMgYXBwbGljYXRpb24gaW5zdGFuY2UuCi0KLSAgICAgICAgICAgICAgICBJdCBtdXN0IGJlIHNwZWNpZmllZCBhcyA6bGFuZ3VhZ2U6W186Y291bnRyeTpbXzp2YXJpYW50Ol1dCi0gICAgICAgICAgICAgICAgd2l0aG91dCB0aGUgY29sb25zLCBmb3IgZXhhbXBsZSAiamFfSlBfU0pJUyIuICBUaGUKLSAgICAgICAgICAgICAgICBzZXBhcmF0b3JzIGJldHdlZW4gdGhlIHNlZ21lbnRzIG1heSBiZSAnLScgb3IgJ18nLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWxvY2FsZVR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWRlZmF1bHQtdmFsdWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJkZWZhdWx0LXZhbHVlIiBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBvcgotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBpbiB3aGljaCB0aGlzIGVsZW1lbnQgcmVzaWRlcy4gIFRoaXMgdmFsdWUgZGlmZmVycwotICAgICAgICAgICAgICAgIGZyb20gdGhlICJzdWdnZXN0ZWQtdmFsdWUiIGluIHRoYXQgdGhlIHByb3BlcnR5IG9yIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgIG11c3QgdGFrZSB0aGUgdmFsdWUsIHdoZXJlYXMgaW4gInN1Z2dlc3RlZC12YWx1ZSIgdGFraW5nIHRoZQotICAgICAgICAgICAgICAgIHZhbHVlIGlzIG9wdGlvbmFsLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmYWNlcy1jb25maWctZWwtZXhwcmVzc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFTCBleHByZXNzaW9ucyBwcmVzZW50IHdpdGhpbiBhIGZhY2VzIGNvbmZpZyBmaWxlCi0gICAgICAgICAgICAgICAgbXVzdCBzdGFydCB3aXRoIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2Ugb2YgJyN7JyBhbmQKLSAgICAgICAgICAgICAgICBlbmQgd2l0aCAnfScuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IiNcey4qXH0iLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWZhY2V0VHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBhbmQgb3RoZXIgZGVzaWduLXRpbWUgaW5mb3JtYXRpb24gZm9yIGEgZmFjZXQKLSAgICAgICAgICAgICAgICB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbmRlcmVyIG9yIGEgY29tcG9uZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmYWNldC1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJmYWNldC1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZhY2V0IG5hbWUgCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmRlciB3aGljaCBhIFVJQ29tcG9uZW50IHdpbGwgYmUgYWRkZWQgdG8gaXRzIHBhcmVudC4gIAotICAgICAgICAgICAgICAgICAgICAgICAgSXQgbXVzdCBiZSBvZiB0eXBlICJJZGVudGlmaWVyIi4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY2V0LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWZhY2V0LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1mYWNldC1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBmYWNldC4gIEl0IG1heSBjb250YWluIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWZyb20tdmlldy1pZFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgZnJvbS12aWV3LWlkIG11c3QgY29udGFpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAgICAgICAgICAgICAgICB2YWx1ZXM6Ci0KLSAgICAgICAgICAgICAgICAgIC0gVGhlIGV4YWN0IG1hdGNoIGZvciBhIHZpZXcgaWRlbnRpZmllciB0aGF0IGlzIHJlY29nbml6ZWQKLSAgICAgICAgICAgICAgICAgICAgYnkgdGhlIHRoZSBWaWV3SGFuZGxlciBpbXBsZW1lbnRhdGlvbiBiZWluZyB1c2VkIChzdWNoIGFzCi0gICAgICAgICAgICAgICAgICAgICIvaW5kZXguanNwIiBpZiB5b3UgYXJlIHVzaW5nIHRoZSBkZWZhdWx0IFZpZXdIYW5kbGVyKS4KLQotICAgICAgICAgICAgICAgICAgLSBBIHByb3BlciBwcmVmaXggb2YgYSB2aWV3IGlkZW50aWZpZXIsIHBsdXMgYSB0cmFpbGluZyAKLSAgICAgICAgICAgICAgICAgICAgIioiIGNoYXJhY3Rlci4gIFRoaXMgcGF0dGVybiBpbmRpY2F0ZXMgdGhhdCBhbGwgdmlldyAKLSAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcnMgdGhhdCBtYXRjaCB0aGUgcG9ydGlvbiBvZiB0aGUgcGF0dGVybiB1cCB0byAKLSAgICAgICAgICAgICAgICAgICAgdGhlIGFzdGVyaXNrIHdpbGwgbWF0Y2ggdGhlIHN1cnJvdW5kaW5nIHJ1bGUuICBXaGVuIG1vcmUgCi0gICAgICAgICAgICAgICAgICAgIHRoYW4gb25lIG1hdGNoIGV4aXN0cywgdGhlIG1hdGNoIHdpdGggdGhlIGxvbmdlc3QgcGF0dGVybiAKLSAgICAgICAgICAgICAgICAgICAgaXMgc2VsZWN0ZWQuCi0KLSAgICAgICAgICAgICAgICAgIC0gQW4gIioiIGNoYXJhY3Rlciwgd2hpY2ggbWVhbnMgdGhhdCB0aGlzIHBhdHRlcm4gYXBwbGllcyAKLSAgICAgICAgICAgICAgICAgICAgdG8gYWxsIHZpZXcgaWRlbnRpZmllcnMuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctZnJvbS1hY3Rpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJmcm9tLWFjdGlvbiIgZWxlbWVudCBjb250YWlucyBhbiBhY3Rpb24gcmVmZXJlbmNlIAotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gdGhhdCBtdXN0IGhhdmUgYmVlbiBleGVjdXRlZCAoYnkgdGhlIGRlZmF1bHQgCi0gICAgICAgICAgICAgICAgQWN0aW9uTGlzdGVuZXIgZm9yIGhhbmRsaW5nIGFwcGxpY2F0aW9uIGxldmVsIGV2ZW50cykgCi0gICAgICAgICAgICAgICAgaW4gb3JkZXIgdG8gc2VsZWN0IHRoZSBuYXZpZ2F0aW9uIHJ1bGUuICBJZiBub3Qgc3BlY2lmaWVkLCAKLSAgICAgICAgICAgICAgICB0aGlzIHJ1bGUgd2lsbCBiZSByZWxldmFudCBubyBtYXR0ZXIgd2hpY2ggYWN0aW9uIHJlZmVyZW5jZSAKLSAgICAgICAgICAgICAgICB3YXMgZXhlY3V0ZWQgKG9yIGlmIG5vIGFjdGlvbiByZWZlcmVuY2Ugd2FzIGV4ZWN1dGVkKS4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1lbC1leHByZXNzaW9uVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctY29udmVydGVyVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiY29udmVydGVyIiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBDb252ZXJ0ZXIKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZQotICAgICAgICAgICAgICAgIHNwZWNpZmllZCBjb252ZXJ0ZXIgaWRlbnRpZmllci4gIENvbnZlcnRlciBpZGVudGlmaWVycyBtdXN0IAotICAgICAgICAgICAgICAgIGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICAgICAgICAgICAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQKLSAgICAgICAgICAgICAgICBtYXkgYmUgY29uZmlndXJlZCBvbiB0aGUgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBpbiBvcmRlciAKLSAgICAgICAgICAgICAgICB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZiB0aGUgQ29udmVydGVyLiAgTmVzdGVkICJwcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICBlbGVtZW50cyBpZGVudGlmeSBKYXZhQmVhbnMgcHJvcGVydGllcyBvZiB0aGUgQ29udmVydGVyCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBtYXkgYmUgY29uZmlndXJlZCB0byBhZmZlY3QgdGhlCi0gICAgICAgICAgICAgICAgb3BlcmF0aW9uIG9mIHRoZSBDb252ZXJ0ZXIuICAiYXR0cmlidXRlIiBhbmQgInByb3BlcnR5IiAKLSAgICAgICAgICAgICAgICBlbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYWxsb3cgY29tcG9uZW50IGRldmVsb3BlcnMgdG8gCi0gICAgICAgICAgICAgICAgbW9yZSBjb21wbGV0ZWx5IGRlc2NyaWJlIHRoZWlyIGNvbXBvbmVudHMgdG8gdG9vbHMgYW5kIHVzZXJzLgotICAgICAgICAgICAgICAgIFRoZXNlIGVsZW1lbnRzIGhhdmUgbm8gcmVxdWlyZWQgcnVudGltZSBzZW1hbnRpY3MuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1pZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiY29udmVydGVyLWlkIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgdW5kZXIgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyIGNsYXNzIHNob3VsZCBiZSByZWdpc3RlcmVkLgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1mb3ItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjb252ZXJ0ZXItZm9yLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB3aGljaCBhIENvbnZlcnRlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyB3aWxsIGJlIHJlZ2lzdGVyZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiY29udmVydGVyLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGNvbmNyZXRlIENvbnZlcnRlciAKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctYXR0cmlidXRlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljCi0gICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgdGhhdCBtYXkgYmUgY29uZmlndXJlZCBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBpbiBvcmRlciB0byBhZmZlY3QgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiBvZiB0aGUgQ29udmVydGVyLiAgVGhpcyBhdHRyaWJ1dGUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyaWx5IGZvciBkZXNpZ24tdGltZSB0b29scyBhbmQgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCB0byBoYXZlIGFueSBtZWFuaW5nIGF0IHJ1bnRpbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZCAicHJvcGVydHkiIGVsZW1lbnRzIGlkZW50aWZ5IEphdmFCZWFucwotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIG9mIHRoZSBDb252ZXJ0ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtYXkgYmUgY29uZmlndXJlZCB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgQ29udmVydGVyLiAgVGhpcyBhdHRyaWJ1dGUgaXMgcHJpbWFyaWx5IGZvcgotICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ24tdGltZSB0b29scyBhbmQgaXMgbm90IHNwZWNpZmllZCB0byBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgIGFueSBtZWFuaW5nIGF0IHJ1bnRpbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXItZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctY29udmVydGVyLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLWNvbnZlcnRlci1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGNvbnZlcnRlci4gIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1saWZlY3ljbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAibGlmZWN5Y2xlIiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIHNwZWNpZnkKLSAgICAgICAgICAgICAgICBtb2RpZmljYXRpb25zIHRvIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGRlZmF1bHQgTGlmZWN5Y2xlCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBoYXNlLWxpc3RlbmVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicGhhc2UtbGlzdGVuZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIFBoYXNlTGlzdGVuZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgcmVnaXN0ZXJlZCBvbiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBMaWZlY3ljbGUuCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpZmVjeWNsZS1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1saWZlY3ljbGUtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotCi0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLWxpZmVjeWNsZS1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGxpZmVjeWNsZS4gIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIAotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgICAKLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWxvY2FsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgbG9jYWxlVHlwZSBkZWZpbmVzIHZhbGlkIGxvY2FsZSBkZWZpbmVkIGJ5IElTTy02MzktMQotICAgICAgICAgICAgICAgIGFuZCBJU08tMzE2Ni4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbYS16XXsyfShffC0pPyhbXHB7TH1cLVxwe05kfV17Mn0pPyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWxvY2FsZS1jb25maWdUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJsb2NhbGUtY29uZmlnIiBlbGVtZW50IGFsbG93cyB0aGUgYXBwIGRldmVsb3BlciB0byAKLSAgICAgICAgICAgICAgICBkZWNsYXJlIHRoZcKgc3VwcG9ydGVkIGxvY2FsZXMgZm9yIHRoaXMgYXBwbGljYXRpb24uCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIAotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtbG9jYWxlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZGVmYXVsdC1sb2NhbGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN1cHBvcnRlZC1sb2NhbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1zdXBwb3J0ZWQtbG9jYWxlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIAotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbWFuYWdlZC1iZWFuVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgIm1hbmFnZWQtYmVhbiIgZWxlbWVudCByZXByZXNlbnRzIGEgSmF2YUJlYW4sIG9mIGEgCi0gICAgICAgICAgICAgICAgcGFydGljdWxhciBjbGFzcywgdGhhdCB3aWxsIGJlIGR5bmFtaWNhbGx5IGluc3RhbnRpYXRlZCAKLSAgICAgICAgICAgICAgICBhdCBydW50aW1lIChieSB0aGUgZGVmYXVsdCBWYXJpYWJsZVJlc29sdmVyIGltcGxlbWVudGF0aW9uKSAKLSAgICAgICAgICAgICAgICBpZiBpdCBpcyByZWZlcmVuY2VkIGFzIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgdmFsdWUgYmluZGluZyAKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uLCBhbmQgbm8gY29ycmVzcG9uZGluZyBiZWFuIGNhbiBiZSBpZGVudGlmaWVkIGluIAotICAgICAgICAgICAgICAgIGFueSBzY29wZS4gIEluIGFkZGl0aW9uIHRvIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWFuYWdlZCBiZWFuLCAKLSAgICAgICAgICAgICAgICBhbmQgdGhlIG9wdGlvbmFsIHN0b3Jpbmcgb2YgaXQgaW50byB0aGUgc3BlY2lmaWVkIHNjb3BlLCAKLSAgICAgICAgICAgICAgICB0aGUgbmVzdGVkIG1hbmFnZWQtcHJvcGVydHkgZWxlbWVudHMgY2FuIGJlIHVzZWQgdG8gCi0gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2Ygc2V0dGFibGUgSmF2YUJlYW5zIHByb3BlcnRpZXMgb2YgCi0gICAgICAgICAgICAgICAgdGhlIGNyZWF0ZWQgaW5zdGFuY2UuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLWJlYW4tbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAibWFuYWdlZC1iZWFuLW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgbmFtZSB1bmRlciB3aGljaCBhIG1hbmFnZWQgYmVhbiB3aWxsIAotICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2VhcmNoZWQgZm9yLCBhcyB3ZWxsIGFzIHN0b3JlZCAodW5sZXNzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICJtYW5hZ2VkLWJlYW4tc2NvcGUiIHZhbHVlIGlzICJub25lIikuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLWJlYW4tY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgIm1hbmFnZWQtYmVhbi1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCB3aWxsIGJlIAotICAgICAgICAgICAgICAgICAgICAgICAgdXNlZGB0byBpbnN0YW50aWF0ZSBhIG5ldyBpbnN0YW5jZSBpZiBjcmVhdGlvbiBvZiB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWRgbWFuYWdlZCBiZWFuIGlzIHJlcXVlc3RlZC4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNwZWNpZmllZCBjbGFzcyBtdXN0IGNvbmZvcm0gdG8gc3RhbmRhcmQgSmF2YUJlYW5zCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZW50aW9ucy4gIEluIHBhcnRpY3VsYXIsIGl0IG11c3QgaGF2ZSBhIHB1YmxpYwotICAgICAgICAgICAgICAgICAgICAgICAgemVyby1hcmd1bWVudHMgY29uc3RydWN0b3IsIGFuZCB6ZXJvIG9yIG1vcmUgcHVibGljCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSBzZXR0ZXJzLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgCi0gICAgICAgICAgICAgICAgbmFtZT0ibWFuYWdlZC1iZWFuLXNjb3BlIgotICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbWFuYWdlZC1iZWFuLXNjb3BlT3JOb25lVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAibWFuYWdlZC1iZWFuLXNjb3BlIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIHNjb3BlIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50byB3aGljaCBhIG5ld2x5IGNyZWF0ZWQgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZWQgYmVhbiB3aWxsIGJlIHN0b3JlZCAodW5sZXNzIHRoZSB2YWx1ZSBpcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICJub25lIikuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLXByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW1hbmFnZWQtcHJvcGVydHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1lbnRyaWVzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW1hcC1lbnRyaWVzVHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaXN0LWVudHJpZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbGlzdC1lbnRyaWVzVHlwZSIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbmFnZWQtYmVhbi1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1tYW5hZ2VkLWJlYW4tZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctbWFuYWdlZC1iZWFuLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgbWFuYWdlZC1iZWFuLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gICAgCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbWFuYWdlZC1iZWFuLXNjb3BlT3JOb25lVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIGxlZ2FsIHZhbHVlcyBmb3IgdGhlIDxtYW5hZ2VkLWJlYW4tc2NvcGU+Ci0gICAgICAgICAgICAgICAgZWxlbWVudCdzIGJvZHkgY29udGVudCwgd2hpY2ggaW5jbHVkZXMgYWxsIG9mIHRoZSBzY29wZXMKLSAgICAgICAgICAgICAgICBub3JtYWxseSB1c2VkIGluIGEgd2ViIGFwcGxpY2F0aW9uLCBwbHVzIHRoZSAibm9uZSIgdmFsdWUKLSAgICAgICAgICAgICAgICBpbmRpY2F0aW5nIHRoYXQgYSBjcmVhdGVkIGJlYW4gc2hvdWxkIG5vdCBiZSBzdG9yZWQgaW50bwotICAgICAgICAgICAgICAgIGFueSBzY29wZS4KLSAgICAgICAgICAgICAgICBdXT4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJlcXVlc3QiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzZXNzaW9uIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXBwbGljYXRpb24iLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIi8+Ci0gICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLW1hbmFnZWQtcHJvcGVydHlUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAibWFuYWdlZC1wcm9wZXJ0eSIgZWxlbWVudCByZXByZXNlbnRzIGFuIGluZGl2aWR1YWwgCi0gICAgICAgICAgICAgICAgcHJvcGVydHkgb2YgYSBtYW5hZ2VkIGJlYW4gdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gdGhlIAotICAgICAgICAgICAgICAgIHNwZWNpZmllZCB2YWx1ZSAob3IgdmFsdWUgc2V0KSBpZiB0aGUgY29ycmVzcG9uZGluZyAKLSAgICAgICAgICAgICAgICBtYW5hZ2VkIGJlYW4gaXMgYXV0b21hdGljYWxseSBjcmVhdGVkLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicHJvcGVydHktbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhQmVhbnMgCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSBuYW1lIHVuZGVyIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG1heSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlIHN0b3JlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLXR5cGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJwcm9wZXJ0eS1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhIHR5cGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvcGVydHkgbmFtZS4gIAotICAgICAgICAgICAgICAgICAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgaXQgY2FuIGJlIGluZmVycmVkIGZyb20gZXhpc3RpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOyBob3dldmVyLCB0aGlzIGVsZW1lbnQgc2hvdWxkIGJlIHNwZWNpZmllZCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgZ29pbmcgdG8gYmUgdGhlIHNvdXJjZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciBnZW5lcmF0aW5nIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAtZW50cmllcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1tYXAtZW50cmllc1R5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibnVsbC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1udWxsLXZhbHVlVHlwZSI+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctdmFsdWVUeXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3QtZW50cmllcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1saXN0LWVudHJpZXNUeXBlIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1tYXAtZW50cnlUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAibWFwLWVudHJ5IiBlbGVtZW50IHJlcHJzZW50cyBhIHNpbmdsZSBrZXktZW50cnkgcGFpciAKLSAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbXB1dGVkIHZhbHVlIG9mIGEgbWFuYWdlZCAKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSBvZiB0eXBlIGphdmEudXRpbC5NYXAuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImtleSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJrZXkiIGVsZW1lbnQgaXMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIAotICAgICAgICAgICAgICAgICAgICAgICAgbWFwIGtleSB0aGF0IHdpbGwgYmUgc3RvcmVkIGluIGEgbWFuYWdlZCBwcm9wZXJ0eSBvZiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgamF2YS51dGlsLk1hcC4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im51bGwtdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbnVsbC12YWx1ZVR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctdmFsdWVUeXBlIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1tYXAtZW50cmllc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJtYXAtZW50cmllcycgZWxlbWVudCByZXByZXNlbnRzIGEgc2V0IG9mIGtleS1lbnRyeSBwYWlycyAKLSAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbXB1dGVkIHZhbHVlIG9mIGEgbWFuYWdlZCBwcm9wZXJ0eSAKLSAgICAgICAgICAgICAgICBvZiB0eXBlIGphdmEudXRpbC5NYXAuICBJbiBhZGRpdGlvbiwgdGhlIEphdmEgY2xhc3MgdHlwZXMgCi0gICAgICAgICAgICAgICAgb2YgdGhlIGtleSBhbmQgZW50cnkgdmFsdWVzIG1heSBiZSBvcHRpb25hbGx5IGRlY2xhcmVkLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImtleS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImtleS1jbGFzcyIgZWxlbWVudCBkZWZpbmVzIHRoZSBKYXZhIHR5cGUgdG8gd2hpY2ggCi0gICAgICAgICAgICAgICAgICAgICAgICBlYWNoICJrZXkiIGVsZW1lbnQgaW4gYSBzZXQgb2YgIm1hcC1lbnRyeSIgZWxlbWVudHMgCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGNvbnZlcnRlZCB0by4gIElmIG9taXR0ZWQsICJqYXZhLmxhbmcuU3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFzc3VtZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXZhbHVlLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWVudHJ5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbWFwLWVudHJ5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLW5hdmlnYXRpb24tY2FzZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJuYXZpZ2F0aW9uLWNhc2UiIGVsZW1lbnQgZGVzY3JpYmVzIGEgcGFydGljdWxhciAKLSAgICAgICAgICAgICAgICBjb21iaW5hdGlvbiBvZiBjb25kaXRpb25zIHRoYXQgbXVzdCBtYXRjaCBmb3IgdGhpcyBjYXNlIHRvIAotICAgICAgICAgICAgICAgIGJlIGV4ZWN1dGVkLCBhbmQgdGhlIHZpZXcgaWQgb2YgdGhlIGNvbXBvbmVudCB0cmVlIHRoYXQgCi0gICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNlbGVjdGVkIG5leHQuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnJvbS1hY3Rpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1mcm9tLWFjdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnJvbS1vdXRjb21lIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiZnJvbS1vdXRjb21lIiBlbGVtZW50IGNvbnRhaW5zIGEgbG9naWNhbCBvdXRjb21lCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGlvbiBvZiBhbiBhcHBsaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uIG1ldGhvZCBzZWxlY3RlZCB2aWEgYW4gImFjdGlvblJlZiIgcHJvcGVydHkKLSAgICAgICAgICAgICAgICAgICAgICAgIChvciBhIGxpdGVyYWwgdmFsdWUgc3BlY2lmaWVkIGJ5IGFuICJhY3Rpb24iIHByb3BlcnR5KQotICAgICAgICAgICAgICAgICAgICAgICAgb2YgYSBVSUNvbW1hbmQgY29tcG9uZW50LiAgSWYgc3BlY2lmaWVkLCB0aGlzIHJ1bGUgCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHJlbGV2YW50IG9ubHkgaWYgdGhlIG91dGNvbWUgdmFsdWUgbWF0Y2hlcyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZWxlbWVudCdzIHZhbHVlLiAgSWYgbm90IHNwZWNpZmllZCwgdGhpcyBydWxlIAotICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSByZWxldmFudCBubyBtYXR0ZXIgd2hhdCB0aGUgb3V0Y29tZSB2YWx1ZSB3YXMuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0by12aWV3LWlkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInRvLXZpZXctaWQiIGVsZW1lbnQgY29udGFpbnMgdGhlIHZpZXcgaWRlbnRpZmllciAKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBuZXh0IHZpZXcgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGlmIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb24gcnVsZSBpcyBtYXRjaGVkLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgCi0gICAgICAgICAgICAgICAgbmFtZT0icmVkaXJlY3QiCi0gICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1yZWRpcmVjdFR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbmF2aWdhdGlvbi1ydWxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAibmF2aWdhdGlvbi1ydWxlIiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCAKLSAgICAgICAgICAgICAgICBkZWNpc2lvbiBydWxlIHRoYXQgd2lsbCBiZSB1dGlsaXplZCBieSB0aGUgZGVmYXVsdCAKLSAgICAgICAgICAgICAgICBOYXZpZ2F0aW9uSGFuZGxlciBpbXBsZW1lbnRhdGlvbiB0byBtYWtlIGRlY2lzaW9ucyBvbiAKLSAgICAgICAgICAgICAgICB3aGF0IHZpZXcgc2hvdWxkIGJlIGRpc3BsYXllZCBuZXh0LCBiYXNlZCBvbiB0aGUgCi0gICAgICAgICAgICAgICAgdmlldyBpZCBiZWluZyBwcm9jZXNzZWQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmcm9tLXZpZXctaWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1mcm9tLXZpZXctaWRUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hdmlnYXRpb24tY2FzZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW5hdmlnYXRpb24tY2FzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgCi0gICAgICAgICAgICAgICAgbmFtZT0ibmF2aWdhdGlvbi1ydWxlLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW5hdmlnYXRpb24tcnVsZS1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gImZhY2VzLWNvbmZpZy1uYXZpZ2F0aW9uLXJ1bGUtZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBuYXZpZ2F0aW9uLXJ1bGUuICBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLW51bGwtdmFsdWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJudWxsLXZhbHVlIiBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoZSBtYW5hZ2VkCi0gICAgICAgICAgICAgICAgcHJvcGVydHkgaW4gd2hpY2ggd2UgYXJlIG5lc3RlZCB3aWxsIGJlIGV4cGxpY2l0bHkKLSAgICAgICAgICAgICAgICBzZXQgdG8gbnVsbCBpZiBvdXIgbWFuYWdlZCBiZWFuIGlzIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICBjcmVhdGVkLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBvbWl0dGluZyB0aGUgbWFuYWdlZAotICAgICAgICAgICAgICAgIHByb3BlcnR5IGVsZW1lbnQgZW50aXJlbHksIHdoaWNoIHdpbGwgY2F1c2Ugbm8KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSBzZXR0ZXIgdG8gYmUgY2FsbGVkIGZvciB0aGlzIHByb3BlcnR5LgotCi0gICAgICAgICAgICAgICAgVGhlICJudWxsLXZhbHVlIiBlbGVtZW50IGNhbiBvbmx5IGJlIHVzZWQgd2hlbiB0aGUKLSAgICAgICAgICAgICAgICBhc3NvY2lhdGVkICJwcm9wZXJ0eS1jbGFzcyIgaWRlbnRpZmllcyBhIEphdmEgY2xhc3MsCi0gICAgICAgICAgICAgICAgbm90IGEgSmF2YSBwcmltaXRpdmUuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAKLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1wcm9wZXJ0eVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJwcm9wZXJ0eSIgZWxlbWVudCByZXByZXNlbnRzIGEgSmF2YUJlYW4gcHJvcGVydHkgb2YgdGhlIAotICAgICAgICAgICAgICAgIEphdmEgY2xhc3MgcmVwcmVzZW50ZWQgYnkgb3VyIHBhcmVudCBlbGVtZW50LgotCi0gICAgICAgICAgICAgICAgUHJvcGVydHkgbmFtZXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgSmF2YSAKLSAgICAgICAgICAgICAgICBjbGFzcyB0aGF0IGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgZWxlbWVudCwgYW5kIG11c3QgCi0gICAgICAgICAgICAgICAgY29ycmVzcG9uZCB0byBwcm9wZXJ0eSBuYW1lcyB0aGF0IHdpbGwgYmUgcmVjb2duaXplZCB3aGVuIAotICAgICAgICAgICAgICAgIHBlcmZvcm1pbmcgaW50cm9zcGVjdGlvbiBhZ2FpbnN0IHRoYXQgY2xhc3MgdmlhIAotICAgICAgICAgICAgICAgIGphdmEuYmVhbnMuSW50cm9zcGVjdG9yLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicHJvcGVydHktbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhQmVhbnMgCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSBuYW1lIHVuZGVyIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIAotICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGJlIHN0b3JlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLXR5cGVUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJwcm9wZXJ0eS1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhIHR5cGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvcGVydHkgbmFtZS4gIAotICAgICAgICAgICAgICAgICAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgaXQgY2FuIGJlIGluZmVycmVkIGZyb20gZXhpc3RpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOyBob3dldmVyLCB0aGlzIGVsZW1lbnQgc2hvdWxkIGJlIHNwZWNpZmllZCBpZiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgZ29pbmcgdG8gYmUgdGhlIHNvdXJjZSBmb3IgCi0gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZGVmYXVsdC12YWx1ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3VnZ2VzdGVkLXZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctc3VnZ2VzdGVkLXZhbHVlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1wcm9wZXJ0eS1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLQotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcHJvcGVydHktZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBwcm9wZXJ0eS4gIEl0IG1heSBjb250YWluIAotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1yZWRpcmVjdFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgVGhlICJyZWRpcmVjdCIgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCBuYXZpZ2F0aW9uIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgInRvLXZpZXctaWQiIHNob3VsZCBiZSBhY2NvbXBsaXNoZWQgYnkgCi0gICAgICAgICAgICAgICAgICAgIHBlcmZvcm1pbmcgYW4gSFRUUCByZWRpcmVjdCByYXRoZXIgdGhhbiB0aGUgdXN1YWwgCi0gICAgICAgICAgICAgICAgICAgIFZpZXdIYW5kbGVyIG1lY2hhbmlzbXMuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXJlZmVyZW5jZWQtYmVhblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJyZWZlcmVuY2VkLWJlYW4iIGVsZW1lbnQgcmVwcmVzZW50cyBhdCBkZXNpZ24gdGltZSB0aGUgCi0gICAgICAgICAgICAgICAgcHJvbWlzZSB0aGF0IGEgSmF2YSBvYmplY3Qgb2YgdGhlIHNwZWNpZmllZCB0eXBlIHdpbGwgZXhpc3QgYXQgCi0gICAgICAgICAgICAgICAgcnVudGltZSBpbiBzb21lIHNjb3BlLCB1bmRlciB0aGUgc3BlY2lmaWVkIGtleS4gIFRoaXMgY2FuIGJlIAotICAgICAgICAgICAgICAgIHVzZWQgYnkgZGVzaWduIHRpbWUgdG9vbHMgdG8gY29uc3RydWN0IHVzZXIgaW50ZXJmYWNlIGRpYWxvZ3MgCi0gICAgICAgICAgICAgICAgYmFzZWQgb24gdGhlIHByb3BlcnRpZXMgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4gIFRoZSBwcmVzZW5jZSAKLSAgICAgICAgICAgICAgICBvciBhYnNlbmNlIG9mIGEgcmVmZXJlbmNlZCBiZWFuIGVsZW1lbnQgaGFzIG5vIGltcGFjdCBvbiB0aGUgCi0gICAgICAgICAgICAgICAgSmF2YVNlcnZlciBGYWNlcyBydW50aW1lIGVudmlyb25tZW50IGluc2lkZSBhIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2VkLWJlYW4tbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicmVmZXJlbmNlZC1iZWFuLW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgbmFtZSB1bmRlciB3aGljaCB0aGUgY29ycmVzcG9uZGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWQgYmVhbiBtYXkgYmUgYXNzdW1lZCB0byBiZSBzdG9yZWQsIGluIG9uZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mICdyZXF1ZXN0JywgJ3Nlc3Npb24nLCBvciAnYXBwbGljYXRpb24nIHNjb3Blcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZWQtYmVhbi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicmVmZXJlbmNlZC1iZWFuLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgCi0gICAgICAgICAgICAgICAgICAgICAgICAoZWl0aGVyIGFic3RyYWN0IG9yIGNvbmNyZXRlKSBvciBKYXZhIGludGVyZmFjZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHJlZmVyZW5jZWQgYmVhbi4gCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXJlbmRlci1raXRUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAicmVuZGVyLWtpdCIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgUmVuZGVyS2l0IAotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIHNwZWNpZmllZCAKLSAgICAgICAgICAgICAgICByZW5kZXIta2l0LWlkLiAgSWYgbm8gcmVuZGVyLWtpdC1pZCBpcyBzcGVjaWZpZWQsIHRoZSAKLSAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBkZWZhdWx0IFJlbmRlcktpdCAKLSAgICAgICAgICAgICAgICAoUmVuZGVyS2l0RmFjdG9yeS5ERUZBVUxUX1JFTkRFUl9LSVQpIGlzIGFzc3VtZWQuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAKLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbmRlci1raXQtaWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInJlbmRlci1raXQtaWQiIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpZGVudGlmaWVyIAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBSZW5kZXJLaXQgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCAKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZW5kZXIta2l0IiBlbGVtZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInJlbmRlci1raXQtY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgCi0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGNvbmNyZXRlIFJlbmRlcktpdCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1yZW5kZXJlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbmRlci1raXQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctcmVuZGVyLWtpdC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcmVuZGVyZXJUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAicmVuZGVyZXIiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIFJlbmRlcmVyIAotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIAotICAgICAgICAgICAgICAgIHNwZWNpZmllZCBjb21wb25lbnQgZmFtaWx5IGFuZCByZW5kZXJlciB0eXBlIGlkZW50aWZpZXJzLCAKLSAgICAgICAgICAgICAgICBpbiB0aGUgUmVuZGVyS2l0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyZW50ICJyZW5kZXIta2l0IiAKLSAgICAgICAgICAgICAgICBlbGVtZW50LiAgQ29tYmluYXRpb25zIG9mIGNvbXBvbmVudCBmYW1pbHkgYW5kIAotICAgICAgICAgICAgICAgIHJlbmRlcmVyIHR5cGUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBSZW5kZXJLaXQgCi0gICAgICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJlbnQgInJlbmRlci1raXQiIGVsZW1lbnQuCi0KLSAgICAgICAgICAgICAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBjb21wb25lbnQgCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlcyB0aGF0IGFyZSByZWNvZ25pemVkIGJ5IHRoaXMgcmVuZGVyZXIuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAKLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1mYW1pbHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiY29tcG9uZW50LWZhbWlseSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBmYW1pbHkgZm9yIHdoaWNoIHRoZSBSZW5kZXJlciByZXByZXNlbnRlZCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBwYXJlbnQgInJlbmRlcmVyIiBlbGVtZW50IHdpbGwgYmUgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyZXItdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJyZW5kZXJlci10eXBlIiBlbGVtZW50IHJlcHJlc2VudHMgYSByZW5kZXJlciB0eXBlIAotICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciBmb3IgdGhlIFJlbmRlcmVyIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVuZGVyZXIiIGVsZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicmVuZGVyZXItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY29uY3JldGUgUmVuZGVyZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1mYWNldFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctYXR0cmlidXRlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1yZW5kZXJlci1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcmVuZGVyZXItZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciByZW5kZXJlci4gIEl0IG1heSBjb250YWluIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXJlbmRlci1raXQtZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciByZW5kZXIta2l0LiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1zdWdnZXN0ZWQtdmFsdWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJzdWdnZXN0ZWQtdmFsdWUiIGNvbnRhaW5zIHRoZSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG9yCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlIGluIHdoaWNoIHRoaXMgZWxlbWVudCByZXNpZGVzLiAgVGhpcyB2YWx1ZSBpcyAKLSAgICAgICAgICAgICAgICBhZHZpc29yeSBvbmx5IGFuZCBpcyBpbnRlbmRlZCBmb3IgdG9vbHMgdG8gdXNlIHdoZW4gCi0gICAgICAgICAgICAgICAgcG9wdWxhdGluZyBwYWxsZXR0ZXMuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctc3VwcG9ydGVkLWxvY2FsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgInN1cHBvcnRlZC1sb2NhbGUiIGVsZW1lbnQgYWxsb3dzIGF1dGhvcnMgdG8gZGVjbGFyZQotICAgICAgICAgICAgICAgIHdoaWNoIGxvY2FsZXMgYXJlIHN1cHBvcnRlZCBpbiB0aGlzIGFwcGxpY2F0aW9uIGluc3RhbmNlLgotCi0gICAgICAgICAgICAgICAgSXQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgOmxhbmd1YWdlOltfOmNvdW50cnk6W186dmFyaWFudDpdXQotICAgICAgICAgICAgICAgIHdpdGhvdXQgdGhlIGNvbG9ucywgZm9yIGV4YW1wbGUgImphX0pQX1NKSVMiLiAgVGhlCi0gICAgICAgICAgICAgICAgc2VwYXJhdG9ycyBiZXR3ZWVuIHRoZSBzZWdtZW50cyBtYXkgYmUgJy0nIG9yICdfJy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1sb2NhbGVUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+IAotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctdmFsaWRhdG9yVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAidmFsaWRhdG9yIiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBWYWxpZGF0b3IKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZQotICAgICAgICAgICAgICAgIHNwZWNpZmllZCB2YWxpZGF0b3IgaWRlbnRpZmllci4gIFZhbGlkYXRvciBpZGVudGlmaWVycyBtdXN0IAotICAgICAgICAgICAgICAgIGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICAgICAgICAgICAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQgCi0gICAgICAgICAgICAgICAgbWF5IGJlIGNvbmZpZ3VyZWQgb24gdGhlIGNvcnJlc3BvbmRpbmcgVUlDb21wb25lbnQgaW4gb3JkZXIgCi0gICAgICAgICAgICAgICAgdG8gYWZmZWN0IHRoZSBvcGVyYXRpb24gb2YgdGhlIFZhbGlkYXRvci4gIE5lc3RlZCAicHJvcGVydHkiCi0gICAgICAgICAgICAgICAgZWxlbWVudHMgaWRlbnRpZnkgSmF2YUJlYW5zIHByb3BlcnRpZXMgb2YgdGhlIFZhbGlkYXRvcgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgbWF5IGJlIGNvbmZpZ3VyZWQgdG8gYWZmZWN0IHRoZQotICAgICAgICAgICAgICAgIG9wZXJhdGlvbiBvZiB0aGUgVmFsaWRhdG9yLiAgImF0dHJpYnV0ZSIgYW5kICJwcm9wZXJ0eSIgCi0gICAgICAgICAgICAgICAgZWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGFsbG93IGNvbXBvbmVudCBkZXZlbG9wZXJzIHRvIAotICAgICAgICAgICAgICAgIG1vcmUgY29tcGxldGVseSBkZXNjcmliZSB0aGVpciBjb21wb25lbnRzIHRvIHRvb2xzIGFuZCB1c2Vycy4KLSAgICAgICAgICAgICAgICBUaGVzZSBlbGVtZW50cyBoYXZlIG5vIHJlcXVpcmVkIHJ1bnRpbWUgc2VtYW50aWNzLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yLWlkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInZhbGlkYXRvci1pZCIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBpZGVudGlmaWVyIAotICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgVmFsaWRhdG9yIGNsYXNzIHNob3VsZCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJlZ2lzdGVyZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJ2YWxpZGF0b3ItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgCi0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGNvbmNyZXRlIFZhbGlkYXRvciAKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hdHRyaWJ1dGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljCi0gICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgdGhhdCBtYXkgYmUgY29uZmlndXJlZCBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBpbiBvcmRlciB0byBhZmZlY3QgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiBvZiB0aGUgVmFsaWRhdG9yLiAgVGhpcyBhdHRyaWJ1dGUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyaWx5IGZvciBkZXNpZ24tdGltZSB0b29scyBhbmQgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCB0byBoYXZlIGFueSBtZWFuaW5nIGF0IHJ1bnRpbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctcHJvcGVydHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZCAicHJvcGVydHkiIGVsZW1lbnRzIGlkZW50aWZ5IEphdmFCZWFucwotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIG9mIHRoZSBWYWxpZGF0b3IgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtYXkgYmUgY29uZmlndXJlZCB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgVmFsaWRhdG9yLiAgVGhpcyBhdHRyaWJ1dGUgaXMgcHJpbWFyaWx5IGZvcgotICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ24tdGltZSB0b29scyBhbmQgaXMgbm90IHNwZWNpZmllZCB0byBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgIGFueSBtZWFuaW5nIGF0IHJ1bnRpbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3ItZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctdmFsaWRhdG9yLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLXZhbGlkYXRvci1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIHZhbGlkYXRvci4gIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmYWNlcy1jb25maWctdmFsdWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJ2YWx1ZSIgZWxlbWVudCBpcyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mCi0gICAgICAgICAgICAgICAgYSBsaXRlcmFsIHZhbHVlIHRvIHdoaWNoIGEgc2NhbGFyIG1hbmFnZWQgcHJvcGVydHkKLSAgICAgICAgICAgICAgICB3aWxsIGJlIHNldCwgb3IgYSB2YWx1ZSBiaW5kaW5nIGV4cHJlc3Npb24gKCIjey4uLn0iKQotICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgdmFsdWUuCi0gICAgICAgICAgICAgICAgSXQgd2lsbCBiZSBjb252ZXJ0ZWQgYXMgc3BlY2lmaWVkIGZvciB0aGUgYWN0dWFsCi0gICAgICAgICAgICAgICAgcHJvcGVydHkgdHlwZS4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDp1bmlvbiAKLSAgICAgICAgICAgIG1lbWJlclR5cGVzPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWVsLWV4cHJlc3Npb25UeXBlIHhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIAotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgICAKLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy12YWx1ZS1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJ2YWx1ZS1jbGFzcyIgZWxlbWVudCBkZWZpbmVzIHRoZSBKYXZhIHR5cGUgdG8gd2hpY2ggZWFjaAotICAgICAgICAgICAgICAgICJ2YWx1ZSIgZWxlbWVudCdzIHZhbHVlIHdpbGwgYmUgY29udmVydGVkIHRvLCBwcmlvciB0byBhZGRpbmcgCi0gICAgICAgICAgICAgICAgaXQgdG8gdGhlICJsaXN0LWVudHJpZXMiIGxpc3QgZm9yIGEgbWFuYWdlZCBwcm9wZXJ0eSB0aGF0IGlzIAotICAgICAgICAgICAgICAgIGEgamF2YS51dGlsLkxpc3QsIG9yIGEgIm1hcC1lbnRyaWVzIiBtYXAgZm9yIGEgbWFuYWdlZCAKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSB0aGF0IGlzIGEgamF2YS51dGlsLk1hcC4gIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbGlzdC1lbnRyaWVzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgImxpc3QtZW50cmllcyIgZWxlbWVudCByZXByZXNlbnRzIGEgc2V0IG9mIGluaXRpYWxpemF0aW9uCi0gICAgICAgICAgICAgICAgZWxlbWVudHMgZm9yIGEgbWFuYWdlZCBwcm9wZXJ0eSB0aGF0IGlzIGEgamF2YS51dGlsLkxpc3Qgb3IgYW4KLSAgICAgICAgICAgICAgICBhcnJheS4gIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlICJ2YWx1ZS1jbGFzcyIgZWxlbWVudCBjYW4gCi0gICAgICAgICAgICAgICAgb3B0aW9uYWxseSBiZSB1c2VkIHRvIGRlY2xhcmUgdGhlIEphdmEgdHlwZSB0byB3aGljaCBlYWNoIAotICAgICAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgQ29sbGVjdGlvbi4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12YWx1ZS1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibnVsbC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1udWxsLXZhbHVlVHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12YWx1ZVR5cGUiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmYWNlcy1jb25maWctdmVyc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGlzIHR5cGUgY29udGFpbnMgdGhlIHJlY29nbml6ZWQgdmVyc2lvbnMgb2YKLSAgICAgICAgICAgICAgICBmYWNlcy1jb25maWcgc3VwcG9ydGVkLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxLjIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMl8wLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VzY29uZmlnXzJfMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZTgwZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMl8wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI2OTggKzAsMCBAQAotPD94bWwgdmVyc2lvbiA9ICIxLjAiIGVuY29kaW5nID0gIlVURi04Ij8+Ci0KLQotPHhzZDpzY2hlbWEKLSAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICB4bWxuczp4bWw9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMi4wIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgotICAgICAgCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAgIAotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uCi0gICAgICBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUKLSAgICAgICJMaWNlbnNlIikuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgICAgIHRoZSBMaWNlbnNlLiBZb3UgY2FuIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgICAgIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUEwuaHRtbCBvcgotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotICAgICAgTGljZW5zZS4KLSAgICAgIAotICAgICAgV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIKLSAgICAgIE5vdGljZSBpbiBlYWNoIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdAotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAgICAgIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMKLSAgICAgIHByb3ZpZGVkIGJ5IFN1biBpbiB0aGUgR1BMIFZlcnNpb24gMiBzZWN0aW9uIG9mIHRoZSBMaWNlbnNlIGZpbGUKLSAgICAgIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLiAgSWYgYXBwbGljYWJsZSwgYWRkIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFtdCi0gICAgICByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKLSAgICAgICJQb3J0aW9ucyBDb3B5cmlnaHRlZCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSIKLSAgICAgIAotICAgICAgQ29udHJpYnV0b3Iocyk6Ci0gICAgICAKLSAgICAgIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUKLSAgICAgIENEREwgb3Igb25seSB0aGUgR1BMIFZlcnNpb24gMiwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBhZGRpbmcKLSAgICAgICJbQ29udHJpYnV0b3JdIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcwotICAgICAgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwgVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdQotICAgICAgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEgcmVjaXBpZW50IGhhcyB0aGUKLSAgICAgIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZQotICAgICAgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0byBpdHMKLSAgICAgIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMgotICAgICAgY29kZSBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlCi0gICAgICBvcHRpb24gYXBwbGllcyBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaAotICAgICAgb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyLgotICAgICAgCi0gICAgICBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcwotICAgICAgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBDRERMIGxpY2Vuc2UuCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIDwhW0NEQVRBWwotCi0gICAgICAgICAgICBUaGUgWE1MIFNjaGVtYSBmb3IgdGhlIEphdmFTZXJ2ZXIgRmFjZXMgQXBwbGljYXRpb24KLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gRmlsZSAoVmVyc2lvbiAyLjApLgotCi0gICAgICAgICAgICBBbGwgSmF2YVNlcnZlciBGYWNlcyBjb25maWd1cmF0aW9uIGZpbGVzIG11c3QgaW5kaWNhdGUKLSAgICAgICAgICAgIHRoZSBKYXZhU2VydmVyIEZhY2VzIHNjaGVtYSBieSBpbmRpY2F0aW5nIHRoZSBKYXZhU2VydmVyCi0gICAgICAgICAgICBGYWNlcyBuYW1lc3BhY2U6Ci0KLSAgICAgICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotCi0gICAgICAgICAgICBhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0gICAgICAgICAgICB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgICAgICAgICA8ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iLi4uIgotICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPSIyLjAiPgotICAgICAgICAgICAgICAgIC4uLgotICAgICAgICAgICAgPC9mYWNlcy1jb25maWc+Ci0KLSAgICAgICAgICAgIFRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQKLSAgICAgICAgICAgIHZlcnNpb24gb2YgdGhlIHNjaGVtYSB1c2luZyB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlCi0gICAgICAgICAgICBmb3IgamF2YWVlIG5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLSAgICAgICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMl8wLnhzZAotCi0gICAgICAgICAgICBdXT4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV81LnhzZCIvPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDplbGVtZW50IG5hbWUgPSAiZmFjZXMtY29uZmlnIiB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiZmFjZXMtY29uZmlnIiBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gaGllcmFyY2h5LCBhbmQgY29udGFpbnMgbmVzdGVkIGVsZW1lbnRzIGZvciBhbGwKLSAgICAgICAgICAgICAgICBvZiB0aGUgb3RoZXIgY29uZmlndXJhdGlvbiBzZXR0aW5ncy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmYWNlcy1jb25maWctYmVoYXZpb3ItSUQtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIEJlaGF2aW9yIElEcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBkb2N1bWVudC4KLQotICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6YmVoYXZpb3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpiZWhhdmlvci1pZCIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZmFjZXMtY29uZmlnLWNvbnZlcnRlci1JRC11bmlxdWVuZXNzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyIElEcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBkb2N1bWVudC4KLQotICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6Y29udmVydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6Y29udmVydGVyLWlkIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmYWNlcy1jb25maWctY29udmVydGVyLWZvci1jbGFzcy11bmlxdWVuZXNzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgJ2NvbnZlcnRlci1mb3ItY2xhc3MnIGVsZW1lbnQgdmFsdWVzIG11c3QgYmUgdW5pcXVlCi0gICAgICAgICAgICAgICAgICAgIHdpdGhpbiBhIGRvY3VtZW50LgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpjb252ZXJ0ZXItZm9yLWNsYXNzIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmYWNlcy1jb25maWctdmFsaWRhdG9yLUlELXVuaXF1ZW5lc3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3IgSURzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50LgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTp2YWxpZGF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTp2YWxpZGF0b3ItaWQiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImZhY2VzLWNvbmZpZy1tYW5hZ2VkLWJlYW4tbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgTWFuYWdlZCBiZWFuIG5hbWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50LgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTptYW5hZ2VkLWJlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTptYW5hZ2VkLWJlYW4tbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiZmFjZXMtY29uZmlnIiBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gaGllcmFyY2h5LCBhbmQgY29udGFpbnMgbmVzdGVkIGVsZW1lbnRzIGZvciBhbGwKLSAgICAgICAgICAgICAgICBvZiB0aGUgb3RoZXIgY29uZmlndXJhdGlvbiBzZXR0aW5ncy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hcHBsaWNhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlcmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW9yZGVyaW5nVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFic29sdXRlLW9yZGVyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctYWJzb2x1dGVPcmRlcmluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1mYWN0b3J5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbXBvbmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWNvbXBvbmVudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1jb252ZXJ0ZXJUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFuYWdlZC1iZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbWFuYWdlZC1iZWFuVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICBUaGUgIm5hbWUiIGVsZW1lbnQgd2l0aGluIHRoZSB0b3AgbGV2ZWwgImZhY2VzLWNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGRlY2xhcmVzIHRoZSBuYW1lIG9mIHRoaXMgYXBwbGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHJlc291cmNlLiAgU3VjaCBuYW1lcyBhcmUgdXNlZAotICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBkb2N1bWVudCBvcmRlcmluZyBzY2hlbWUgc3BlY2lmaWVkIGluIHNlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICBKU0YuMTEuNC42LgotICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hdmlnYXRpb24tcnVsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW5hdmlnYXRpb24tcnVsZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2VkLWJlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1yZWZlcmVuY2VkLWJlYW5UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXJlbmRlci1raXRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlmZWN5Y2xlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbGlmZWN5Y2xlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbGlkYXRvciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXZhbGlkYXRvclR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiZWhhdmlvciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWJlaGF2aW9yVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY2VzLWNvbmZpZy1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIgotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJvcHRpb25hbCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIFRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgZGVmaW5lcyB3aGV0aGVyIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgSmF2YVNlcnZlciBGYWNlcyBhcHBsaWNhdGlvbiBpcyBjb21wbGV0ZSwgb3Igd2hldGhlcgotICAgICAgICAgICAgICAgICAgICB0aGUgY2xhc3MgZmlsZXMgYXZhaWxhYmxlIHRvIHRoaXMgbW9kdWxlIGFuZCBwYWNrYWdlZCB3aXRoCi0gICAgICAgICAgICAgICAgICAgIHRoaXMgYXBwbGljYXRpb24gc2hvdWxkIGJlIGV4YW1pbmVkIGZvciBhbm5vdGF0aW9ucwotICAgICAgICAgICAgICAgICAgICB0aGF0IHNwZWNpZnkgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIG9ubHkgaW5zcGVjdGVkIG9uIHRoZSBhcHBsaWNhdGlvbiAKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiByZXNvdXJjZSBmaWxlIGxvY2F0ZWQgYXQgIldFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCIuCi0gICAgICAgICAgICAgICAgICAgIFRoZSBwcmVzZW5jZSBvZiB0aGlzIGF0dHJpYnV0ZSBvbiBhbnkgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbgotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSBvdGhlciB0aGFuIHRoZSBvbmUgbG9jYXRlZCBhdCAiV0VCLUlORi9mYWNlcy1jb25maWcueG1sIiwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIGFueSBmaWxlcyBuYW1lZCB1c2luZyB0aGUgamF2YXguZmFjZXMuQ09ORklHX0ZJTEVTCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSwgbXVzdCBiZSBpZ25vcmVkLgotCi0gICAgICAgICAgICAgICAgICAgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIHNldCB0byAidHJ1ZSIsIHRoZSBKYXZhU2VydmVyIEZhY2VzCi0gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUgbXVzdCBpZ25vcmUgYW55IGFubm90YXRpb25zIHRoYXQgc3BlY2lmeSBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uLCB3aGljaCBtaWdodCBiZSBwcmVzZW50IGluIHRoZSBjbGFzcyBmaWxlcwotICAgICAgICAgICAgICAgICAgICBvZiB0aGUgYXBwbGljYXRpb24uCi0KLSAgICAgICAgICAgICAgICAgICAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgbm90IHNwZWNpZmllZCBvciBpcyBzZXQgdG8KLSAgICAgICAgICAgICAgICAgICAgImZhbHNlIiwgdGhlIEphdmFTZXJ2ZXIgRmFjZXMgcnVudGltZSBtdXN0IGV4YW1pbmUgdGhlIGNsYXNzCi0gICAgICAgICAgICAgICAgICAgIGZpbGVzIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgYW5ub3RhdGlvbnMsIGFzIHNwZWNpZmllZCBieQotICAgICAgICAgICAgICAgICAgICB0aGUgc3BlY2lmaWNhdGlvbi4KLQotICAgICAgICAgICAgICAgICAgICBJZiAiV0VCLUlORi9mYWNlcy1jb25maWcueG1sIiBpcyBub3QgcHJlc2VudCwgdGhlIEphdmFTZXJ2ZXIKLSAgICAgICAgICAgICAgICAgICAgRmFjZXMgcnVudGltZSB3aWxsIGFzc3VtZSBtZXRhZGF0YS1jb21wbGV0ZSB0byBiZSAiZmFsc2UiLgotCi0gICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSB3aWxsIGhhdmUgbm8gaW1wYWN0IG9uCi0gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUgYW5ub3RhdGlvbnMgc3VjaCBhcyBAUmVzb3VyY2VEZXBlbmRlbmN5IG9yCi0gICAgICAgICAgICAgICAgICAgIEBMaXN0ZW5lckZvci4KLSAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6YXR0cmlidXRlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIiAvPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXZlcnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgZmFjZXMtY29uZmlnLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLW9yZGVyaW5nVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBQbGVhc2Ugc2VlIHNlY3Rpb24gSlNGLjExLjQuNiBmb3IgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhpcyBlbGVtZW50LgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZnRlciIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1vcmRlcmluZy1vcmRlcmluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJlZm9yZSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1vcmRlcmluZy1vcmRlcmluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLW9yZGVyaW5nLW9yZGVyaW5nVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBjb250YWlucyBhIHNlcXVlbmNlIG9mICJpZCIgZWxlbWVudHMsIGVhY2ggb2Ygd2hpY2gKLSAgICAgICAgICAgICAgICByZWZlcnMgdG8gYW4gYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiByZXNvdXJjZSBieSB0aGUgImlkIgotICAgICAgICAgICAgICAgIGRlY2xhcmVkIG9uIGl0cyBmYWNlcy1jb25maWcgZWxlbWVudC4gIFRoaXMgZWxlbWVudCBjYW4gYWxzbyBjb250YWluCi0gICAgICAgICAgICAgICAgYSBzaW5nbGUgIm90aGVycyIgZWxlbWVudCB3aGljaCBzcGVjaWZpZXMgdGhhdCB0aGlzIGRvY3VtZW50IGNvbWVzCi0gICAgICAgICAgICAgICAgYmVmb3JlIG9yIGFmdGVyIG90aGVyIGRvY3VtZW50cyB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3RoZXJzIiB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW9yZGVyaW5nLW90aGVyc1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAKLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1vcmRlcmluZy1vdGhlcnNUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGUgb3JkZXJpbmcgc3ViLWVsZW1lbnQgaW4gd2hpY2gKLSAgICAgICAgICAgICAgICBpdCB3YXMgcGxhY2VkIHNob3VsZCB0YWtlIHNwZWNpYWwgYWN0aW9uIHJlZ2FyZGluZyB0aGUgb3JkZXJpbmcKLSAgICAgICAgICAgICAgICBvZiB0aGlzIGFwcGxpY2F0aW9uIHJlc291cmNlIHJlbGF0aXZlIHRvIG90aGVyCi0gICAgICAgICAgICAgICAgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiByZXNvdXJjZXMuICBTZWUgc2VjdGlvbiBKU0YuMTEuNC42Ci0gICAgICAgICAgICAgICAgZm9yIHRoZSBjb21wbGV0ZSBzcGVjaWZpY2F0aW9uLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctYWJzb2x1dGVPcmRlcmluZ1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgT25seSByZWxldmFudCBpZiB0aGlzIGlzIHBsYWNlZCB3aXRoaW4gdGhlIC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwuCi0gICAgICAgICAgICAgIFBsZWFzZSBzZWUgc2VjdGlvbiBKU0YuMTEuNC42IGZvciB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvdGhlcnMiIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctb3JkZXJpbmctb3RoZXJzVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1hcHBsaWNhdGlvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImFwcGxpY2F0aW9uIiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGRlZmluZSB0aGUKLSAgICAgICAgICAgICAgICB2YXJpb3VzIHBlci1hcHBsaWNhdGlvbi1zaW5nbGV0b24gaW1wbGVtZW50YXRpb24gYXJ0aWZhY3RzIGZvcgotICAgICAgICAgICAgICAgIGEgcGFydGljdWxhciB3ZWIgYXBwbGljYXRpb24gdGhhdCBpcyB1dGlsaXppbmcgCi0gICAgICAgICAgICAgICAgSmF2YVNlcnZlciBGYWNlcy4gIEZvciBuZXN0ZWQgZWxlbWVudHMgdGhhdCBhcmUgbm90IHNwZWNpZmllZCwgCi0gICAgICAgICAgICAgICAgdGhlIEpTRiBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYSBzdWl0YWJsZSBkZWZhdWx0LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGlvbi1saXN0ZW5lciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJhY3Rpb24tbGlzdGVuZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIGR1cmluZyB0aGUgSW52b2tlIEFwcGxpY2F0aW9uIHBoYXNlIG9mIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0IHByb2Nlc3NpbmcgbGlmZWN5Y2xlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtcmVuZGVyLWtpdC1pZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgImRlZmF1bHQtcmVuZGVyLWtpdC1pZCIgZWxlbWVudCBhbGxvd3MgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHRvIGRlZmluZSBhIHJlbmRlcmtpdCB0byBiZSB1c2VkIG90aGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gdGhlIHN0YW5kYXJkIG9uZS4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1idW5kbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJhc2UgbmFtZSBvZiBhIHJlc291cmNlIGJ1bmRsZSByZXByZXNlbnRpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1lc3NhZ2UgcmVzb3VyY2VzIGZvciB0aGlzIGFwcGxpY2F0aW9uLiAgU2VlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBKYXZhRG9jcyBmb3IgdGhlICJqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBzeW50YXggb2YgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgYnVuZGxlIG5hbWVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hdmlnYXRpb24taGFuZGxlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJuYXZpZ2F0aW9uLWhhbmRsZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXZpZ2F0aW9uSGFuZGxlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FsbGVkIGR1cmluZyB0aGUgSW52b2tlIEFwcGxpY2F0aW9uIHBoYXNlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgbGlmZWN5Y2xlLCBpZiB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBBY3Rpb25MaXN0ZW5lciAocHJvdmlkZWQgYnkgdGhlIEpTRiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbikgaXMgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2aWV3LWhhbmRsZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAidmlldy1oYW5kbGVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgVmlld0hhbmRsZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZCBkdXJpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFJlc3RvcmUgVmlldyBhbmQgUmVuZGVyIFJlc3BvbnNlIHBoYXNlcyBvZiB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCBwcm9jZXNzaW5nIGxpZmVjeWNsZS4gIFRoZSBmYWNlcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYSBkZWZhdWx0IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RhdGUtbWFuYWdlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJzdGF0ZS1tYW5hZ2VyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgU3RhdGVNYW5hZ2VyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQgZHVyaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBSZXN0b3JlIFZpZXcgYW5kIFJlbmRlciBSZXNwb25zZSBwaGFzZXMgb2YgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgcHJvY2Vzc2luZyBsaWZlY3ljbGUuICBUaGUgZmFjZXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEgZGVmYXVsdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVsLXJlc29sdmVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgImVsLXJlc29sdmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LmVsLkVMUmVzb2x2ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgdXNlZCBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTCBleHByZXNzaW9ucy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1yZXNvbHZlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJwcm9wZXJ0eS1yZXNvbHZlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5UmVzb2x2ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mIHZhbHVlIGJpbmRpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUtcmVzb2x2ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJ2YXJpYWJsZS1yZXNvbHZlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVSZXNvbHZlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgdmFsdWUgYmluZGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucy4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWhhbmRsZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPCFbQ0RBVEFbCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgInJlc291cmNlLWhhbmRsZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VIYW5kbGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgZHVyaW5nIHJlbmRlcmluZyBhbmQgZGVjb2RpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiByZXNvdXJjZSByZXF1ZXN0cyBUaGUgc3RhbmRhcmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciBiYXNlZCBkZWNvcmF0b3IgcGF0dGVybiB1c2VkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIGFwcGxpY2F0aW9uIHNpbmdsZXRvbnMgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbm9yZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIF1dPgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3lzdGVtLWV2ZW50LWxpc3RlbmVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctc3lzdGVtLWV2ZW50LWxpc3RlbmVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCAKLSAgICAgICAgICAgICAgICBuYW1lPSJsb2NhbGUtY29uZmlnIgotICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbG9jYWxlLWNvbmZpZ1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCAKLSAgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZS1idW5kbGUiCi0gICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hcHBsaWNhdGlvbi1yZXNvdXJjZS1idW5kbGVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24tZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctYXBwbGljYXRpb24tZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCAKLSAgICAgICAgICAgICAgICBuYW1lPSJkZWZhdWx0LXZhbGlkYXRvcnMiCi0gICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1kZWZhdWx0LXZhbGlkYXRvcnNUeXBlIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiaWQiIHR5cGUgPSAieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1hcHBsaWNhdGlvbi1yZXNvdXJjZS1idW5kbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgIFRoZSByZXNvdXJjZS1idW5kbGUgZWxlbWVudCBpbnNpZGUgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQKLSAgICAgICAgICAgICAgcmVmZXJlbmNlcyBhIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSBpbnN0YW5jZSBieSBuYW1lCi0gICAgICAgICAgICAgIHVzaW5nIHRoZSB2YXIgZWxlbWVudC4gIFJlc291cmNlQnVuZGxlcyByZWZlcmVuY2VkIGluIHRoaXMKLSAgICAgICAgICAgICAgbWFubmVyIG1heSBiZSByZXR1cm5lZCBieSBhIGNhbGwgdG8KLSAgICAgICAgICAgICAgQXBwbGljYXRpb24uZ2V0UmVzb3VyY2VCdW5kbGUoKSBwYXNzaW5nIHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmb3IgdGhpcyByZXF1ZXN0IGFuZCB0aGUgdmFsdWUgb2YgdGhlIHZhcgotICAgICAgICAgICAgICBlbGVtZW50IGJlbG93LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgaW5zdGFuY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIGJ5IHdoaWNoIHRoaXMgUmVzb3VyY2VCdW5kbGUgaW5zdGFuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzIHJldHJpZXZlZCBieSBhIGNhbGwgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uLmdldFJlc291cmNlQnVuZGxlKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctYXBwbGljYXRpb24tZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBhcHBsaWNhdGlvbi4gIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gImZhY2VzLWNvbmZpZy1mYWN0b3J5VHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiZmFjdG9yeSIgZWxlbWVudCBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBkZWZpbmUgdGhlIAotICAgICAgICAgICAgICAgIHZhcmlvdXMgRmFjdG9yaWVzIHRoYXQgY29tcHJpc2UgcGFydHMgb2YgdGhlIGltcGxlbWVudGF0aW9uIAotICAgICAgICAgICAgICAgIG9mIEphdmFTZXJ2ZXIgRmFjZXMuICBGb3IgbmVzdGVkIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCAKLSAgICAgICAgICAgICAgICBzcGVjaWZpZWQsIHRoZSBKU0YgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEgc3VpdGFibGUgCi0gICAgICAgICAgICAgICAgZGVmYXVsdC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbi1mYWN0b3J5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiYXBwbGljYXRpb24tZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbkZhY3RvcnkgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIAotICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FsbGVkIHdoZW4gCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoQVBQTElDQVRJT05fRkFDVE9SWSkgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24taGFuZGxlci1mYWN0b3J5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiZXhjZXB0aW9uLWhhbmRsZXItZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uSGFuZGxlckZhY3RvcnkgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBiZSBjYWxsZWQgd2hlbiAKLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShFWENFUFRJT05fSEFORExFUl9GQUNUT1JZKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzIGNhbGxlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlcm5hbC1jb250ZXh0LWZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImV4dGVybmFsLWNvbnRleHQtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWxDb250ZXh0RmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNhbGxlZCB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRVhURVJOQUxfQ09OVEVYVF9GQUNUT1JZKQotICAgICAgICAgICAgICAgICAgICAgICAgaXMgY2FsbGVkLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmYWNlcy1jb250ZXh0LWZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJmYWNlcy1jb250ZXh0LWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUKLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dEZhY3RvcnkgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBiZSBjYWxsZWQgd2hlbiAKLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGQUNFU19DT05URVhUX0ZBQ1RPUlkpIAotICAgICAgICAgICAgICAgICAgICAgICAgaXMgY2FsbGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFydGlhbC12aWV3LWNvbnRleHQtZmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicGFydGlhbC12aWV3LWNvbnRleHQtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgUGFydGlhbFZpZXdDb250ZXh0RmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNhbGxlZCB3aGVuIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgKEZhY3RvcnlGaW5kZXIuUEFSVElBTF9WSUVXX0NPTlRFWFRfRkFDVE9SWSkgaXMgY2FsbGVkLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaWZlY3ljbGUtZmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAibGlmZWN5Y2xlLWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgTGlmZWN5Y2xlRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoTElGRUNZQ0xFX0ZBQ1RPUlkpIGlzIGNhbGxlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2aWV3LWRlY2xhcmF0aW9uLWxhbmd1YWdlLWZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInZpZXctZGVjbGFyYXRpb24tbGFuZ3VhZ2UtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3RGVjbGFyYXRpb25MYW5ndWFnZUZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KFZJRVdfREVDTEFSQVRJT05fRkFDVE9SWSkgaXMgY2FsbGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1oYW5kbGVyLWRlbGVnYXRlLWZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInRhZy1oYW5kbGVyLWRlbGVnYXRlLWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIAotICAgICAgICAgICAgICAgICAgICAgICAgVmlld0RlY2xhcmF0aW9uTGFuZ3VhZ2VGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShUQUdfSEFORExFUl9ERUxFR0FURV9GQUNUT1JZKSBpcyBjYWxsZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdC1mYWN0b3J5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJyZW5kZXIta2l0LWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgUmVuZGVyS2l0RmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoUkVOREVSX0tJVF9GQUNUT1JZKSBpcyAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZC4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZpc2l0LWNvbnRleHQtZmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAidmlzaXQtY29udGV4dC1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIFZpc2l0Q29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KFZJU0lUX0NPTlRFWFRfRkFDVE9SWSkgaXMgCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmYWN0b3J5LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWZhY3RvcnktZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImlkIiB0eXBlID0gInhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gImZhY2VzLWNvbmZpZy1mYWN0b3J5LWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgZmFjdG9yeS4gIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctYXR0cmlidXRlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiYXR0cmlidXRlIiBlbGVtZW50IHJlcHJlc2VudHMgYSBuYW1lZCwgdHlwZWQsIHZhbHVlCi0gICAgICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJlbnQgVUlDb21wb25lbnQgdmlhIHRoZSBnZW5lcmljCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlcyBtZWNoYW5pc20uCi0KLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgbmFtZXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgcGFyZW50Ci0gICAgICAgICAgICAgICAgKG9yIHJlbGF0ZWQpIGNvbXBvbmVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiYXR0cmlidXRlLW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbmFtZSB1bmRlciAKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIHdpbGwgYmUgc3RvcmVkLCBpbiB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljIGF0dHJpYnV0ZXMgb2YgdGhlIFVJQ29tcG9uZW50IHdlIGFyZSByZWxhdGVkIAotICAgICAgICAgICAgICAgICAgICAgICAgdG8uCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImF0dHJpYnV0ZS1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhdHRyaWJ1dGUgbmFtZS4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1kZWZhdWx0LXZhbHVlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdWdnZXN0ZWQtdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1zdWdnZXN0ZWQtdmFsdWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hdHRyaWJ1dGUtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiaWQiIHR5cGUgPSAieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLWF0dHJpYnV0ZS1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGF0dHJpYnV0ZS4gIEl0IG1heSBjb250YWluIAotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1jb21wb25lbnRUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJjb21wb25lbnQiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIFVJQ29tcG9uZW50Ci0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUKLSAgICAgICAgICAgICAgICBzcGVjaWZpZWQgdHlwZSBpZGVudGlmaWVyLCBhbG9uZyB3aXRoIGl0cyBhc3NvY2lhdGVkIAotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXMuICBDb21wb25lbnQgdHlwZXMgbXVzdCBiZSB1bmlxdWUgCi0gICAgICAgICAgICAgICAgd2l0aGluIHRoZSBlbnRpcmUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgICAgICAgICAgICAgTmVzdGVkICJhdHRyaWJ1dGUiIGVsZW1lbnRzIGlkZW50aWZ5IGdlbmVyaWMgYXR0cmlidXRlcyB0aGF0IAotICAgICAgICAgICAgICAgIGFyZSByZWNvZ25pemVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBsb2dpYyBvZiB0aGlzIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgICBOZXN0ZWQgInByb3BlcnR5IiBlbGVtZW50cyBpZGVudGlmeSBKYXZhQmVhbnMgcHJvcGVydGllcyBvZiAKLSAgICAgICAgICAgICAgICB0aGUgY29tcG9uZW50IGNsYXNzIHRoYXQgbWF5IGJlIGV4cG9zZWQgZm9yIG1hbmlwdWxhdGlvbiAKLSAgICAgICAgICAgICAgICB2aWEgdG9vbHMuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC10eXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImNvbXBvbmVudC10eXBlIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIG5hbWUgdW5kZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB0aGUgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBjbGFzcyBzaG91bGQgYmUgCi0gICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjb21wb25lbnQtY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgCi0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGNvbmNyZXRlIFVJQ29tcG9uZW50IAotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmYWNldCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWZhY2V0VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hdHRyaWJ1dGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctcHJvcGVydHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1jb21wb25lbnQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWNvbXBvbmVudC1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBjb21wb25lbnQuICBJdCBtYXkgY29udGFpbiAKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWRlZmF1bHQtbG9jYWxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiZGVmYXVsdC1sb2NhbGUiIGVsZW1lbnQgZGVjbGFyZXMgdGhlIGRlZmF1bHQgbG9jYWxlIAotICAgICAgICAgICAgICAgIGZvciB0aGlzIGFwcGxpY2F0aW9uIGluc3RhbmNlLgotCi0gICAgICAgICAgICAgICAgSXQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgOmxhbmd1YWdlOltfOmNvdW50cnk6W186dmFyaWFudDpdXQotICAgICAgICAgICAgICAgIHdpdGhvdXQgdGhlIGNvbG9ucywgZm9yIGV4YW1wbGUgImphX0pQX1NKSVMiLiAgVGhlCi0gICAgICAgICAgICAgICAgc2VwYXJhdG9ycyBiZXR3ZWVuIHRoZSBzZWdtZW50cyBtYXkgYmUgJy0nIG9yICdfJy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1sb2NhbGVUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1kZWZhdWx0LXZhbHVlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiZGVmYXVsdC12YWx1ZSIgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUgcHJvcGVydHkgb3IKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgaW4gd2hpY2ggdGhpcyBlbGVtZW50IHJlc2lkZXMuICBUaGlzIHZhbHVlIGRpZmZlcnMKLSAgICAgICAgICAgICAgICBmcm9tIHRoZSAic3VnZ2VzdGVkLXZhbHVlIiBpbiB0aGF0IHRoZSBwcm9wZXJ0eSBvciBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICBtdXN0IHRha2UgdGhlIHZhbHVlLCB3aGVyZWFzIGluICJzdWdnZXN0ZWQtdmFsdWUiIHRha2luZyB0aGUKLSAgICAgICAgICAgICAgICB2YWx1ZSBpcyBvcHRpb25hbC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWVsLWV4cHJlc3Npb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRUwgZXhwcmVzc2lvbnMgcHJlc2VudCB3aXRoaW4gYSBmYWNlcyBjb25maWcgZmlsZQotICAgICAgICAgICAgICAgIG11c3Qgc3RhcnQgd2l0aCB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIG9mICcjeycgYW5kCi0gICAgICAgICAgICAgICAgZW5kIHdpdGggJ30nLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSIjXHsuKlx9Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1mYWNldFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgYW5kIG90aGVyIGRlc2lnbi10aW1lIGluZm9ybWF0aW9uIGZvciBhIGZhY2V0Ci0gICAgICAgICAgICAgICAgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYSByZW5kZXJlciBvciBhIGNvbXBvbmVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmFjZXQtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiZmFjZXQtbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmYWNldCBuYW1lIAotICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgd2hpY2ggYSBVSUNvbXBvbmVudCB3aWxsIGJlIGFkZGVkIHRvIGl0cyBwYXJlbnQuICAKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0IG11c3QgYmUgb2YgdHlwZSAiSWRlbnRpZmllciIuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmYWNldC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1mYWNldC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctZmFjZXQtZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgZmFjZXQuICBJdCBtYXkgY29udGFpbiBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1mcm9tLXZpZXctaWRUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIGZyb20tdmlldy1pZCBtdXN0IGNvbnRhaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gICAgICAgICAgICAgICAgdmFsdWVzOgotCi0gICAgICAgICAgICAgICAgICAtIFRoZSBleGFjdCBtYXRjaCBmb3IgYSB2aWV3IGlkZW50aWZpZXIgdGhhdCBpcyByZWNvZ25pemVkCi0gICAgICAgICAgICAgICAgICAgIGJ5IHRoZSB0aGUgVmlld0hhbmRsZXIgaW1wbGVtZW50YXRpb24gYmVpbmcgdXNlZCAoc3VjaCBhcwotICAgICAgICAgICAgICAgICAgICAiL2luZGV4LmpzcCIgaWYgeW91IGFyZSB1c2luZyB0aGUgZGVmYXVsdCBWaWV3SGFuZGxlcikuCi0KLSAgICAgICAgICAgICAgICAgIC0gQSBwcm9wZXIgcHJlZml4IG9mIGEgdmlldyBpZGVudGlmaWVyLCBwbHVzIGEgdHJhaWxpbmcgCi0gICAgICAgICAgICAgICAgICAgICIqIiBjaGFyYWN0ZXIuICBUaGlzIHBhdHRlcm4gaW5kaWNhdGVzIHRoYXQgYWxsIHZpZXcgCi0gICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJzIHRoYXQgbWF0Y2ggdGhlIHBvcnRpb24gb2YgdGhlIHBhdHRlcm4gdXAgdG8gCi0gICAgICAgICAgICAgICAgICAgIHRoZSBhc3RlcmlzayB3aWxsIG1hdGNoIHRoZSBzdXJyb3VuZGluZyBydWxlLiAgV2hlbiBtb3JlIAotICAgICAgICAgICAgICAgICAgICB0aGFuIG9uZSBtYXRjaCBleGlzdHMsIHRoZSBtYXRjaCB3aXRoIHRoZSBsb25nZXN0IHBhdHRlcm4gCi0gICAgICAgICAgICAgICAgICAgIGlzIHNlbGVjdGVkLgotCi0gICAgICAgICAgICAgICAgICAtIEFuICIqIiBjaGFyYWN0ZXIsIHdoaWNoIG1lYW5zIHRoYXQgdGhpcyBwYXR0ZXJuIGFwcGxpZXMgCi0gICAgICAgICAgICAgICAgICAgIHRvIGFsbCB2aWV3IGlkZW50aWZpZXJzLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWZyb20tYWN0aW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiZnJvbS1hY3Rpb24iIGVsZW1lbnQgY29udGFpbnMgYW4gYWN0aW9uIHJlZmVyZW5jZSAKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uIHRoYXQgbXVzdCBoYXZlIGJlZW4gZXhlY3V0ZWQgKGJ5IHRoZSBkZWZhdWx0IAotICAgICAgICAgICAgICAgIEFjdGlvbkxpc3RlbmVyIGZvciBoYW5kbGluZyBhcHBsaWNhdGlvbiBsZXZlbCBldmVudHMpIAotICAgICAgICAgICAgICAgIGluIG9yZGVyIHRvIHNlbGVjdCB0aGUgbmF2aWdhdGlvbiBydWxlLiAgSWYgbm90IHNwZWNpZmllZCwgCi0gICAgICAgICAgICAgICAgdGhpcyBydWxlIHdpbGwgYmUgcmVsZXZhbnQgbm8gbWF0dGVyIHdoaWNoIGFjdGlvbiByZWZlcmVuY2UgCi0gICAgICAgICAgICAgICAgd2FzIGV4ZWN1dGVkIChvciBpZiBubyBhY3Rpb24gcmVmZXJlbmNlIHdhcyBleGVjdXRlZCkuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImphdmFlZTpmYWNlcy1jb25maWctZWwtZXhwcmVzc2lvblR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWlmVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiaWYiIGVsZW1lbnQgZGVmaW5lcyBhIGNvbmRpdGlvbiB0aGF0IG11c3QgcmVzb2x2ZQotICAgICAgICAgICAgICAgIHRvIHRydWUgaW4gb3JkZXIgZm9yIHRoZSBuYXZpZ2F0aW9uIGNhc2Ugb24gd2hpY2ggaXQgaXMKLSAgICAgICAgICAgICAgICBkZWZpbmVkIHRvIGJlIG1hdGNoZWQsIHdpdGggdGhlIGV4aXN0aW5nIG1hdGNoIGNyaXRlcmlhCi0gICAgICAgICAgICAgICAgKGFjdGlvbiBtZXRob2QgYW5kIG91dGNvbWUpIGFzIGEgcHJlcmVxdWlzdGUsIGlmIHByZXNlbnQuCi0gICAgICAgICAgICAgICAgVGhlIGNvbmRpdGlvbiBpcyBkZWZpbmVkIGRlY2xhcmF0aXZlbHkgdXNpbmcgYSB2YWx1ZQotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gaW4gdGhlIGJvZHkgb2YgdGhpcyBlbGVtZW50LiBUaGUgZXhwcmVzc2lvbiBpcwotICAgICAgICAgICAgICAgIGV2YWx1YXRlZCBhdCB0aGUgdGltZSB0aGUgbmF2aWdhdGlvbiBjYXNlIGlzIGJlaW5nIG1hdGNoZWQuCi0gICAgICAgICAgICAgICAgSWYgdGhlICJmcm9tLW91dGNvbWUiIGlzIG9taXR0ZWQgYW5kIHRoaXMgZWxlbWVudCBpcwotICAgICAgICAgICAgICAgIHByZXNlbnQsIHRoZSBuYXZpZ2F0aW9uIGhhbmRsZXIgd2lsbCBtYXRjaCBhIG51bGwgb3V0Y29tZQotICAgICAgICAgICAgICAgIGFuZCB1c2UgdGhlIGNvbmRpdGlvbiByZXR1cm4gdmFsdWUgdG8gZGV0ZXJtaW5lIGlmIHRoZQotICAgICAgICAgICAgICAgIGNhc2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBtYXRjaC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1lbC1leHByZXNzaW9uVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctY29udmVydGVyVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiY29udmVydGVyIiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBDb252ZXJ0ZXIKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZQotICAgICAgICAgICAgICAgIHNwZWNpZmllZCBjb252ZXJ0ZXIgaWRlbnRpZmllci4gIENvbnZlcnRlciBpZGVudGlmaWVycyBtdXN0IAotICAgICAgICAgICAgICAgIGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICAgICAgICAgICAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQKLSAgICAgICAgICAgICAgICBtYXkgYmUgY29uZmlndXJlZCBvbiB0aGUgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBpbiBvcmRlciAKLSAgICAgICAgICAgICAgICB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZiB0aGUgQ29udmVydGVyLiAgTmVzdGVkICJwcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICBlbGVtZW50cyBpZGVudGlmeSBKYXZhQmVhbnMgcHJvcGVydGllcyBvZiB0aGUgQ29udmVydGVyCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBtYXkgYmUgY29uZmlndXJlZCB0byBhZmZlY3QgdGhlCi0gICAgICAgICAgICAgICAgb3BlcmF0aW9uIG9mIHRoZSBDb252ZXJ0ZXIuICAiYXR0cmlidXRlIiBhbmQgInByb3BlcnR5IiAKLSAgICAgICAgICAgICAgICBlbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYWxsb3cgY29tcG9uZW50IGRldmVsb3BlcnMgdG8gCi0gICAgICAgICAgICAgICAgbW9yZSBjb21wbGV0ZWx5IGRlc2NyaWJlIHRoZWlyIGNvbXBvbmVudHMgdG8gdG9vbHMgYW5kIHVzZXJzLgotICAgICAgICAgICAgICAgIFRoZXNlIGVsZW1lbnRzIGhhdmUgbm8gcmVxdWlyZWQgcnVudGltZSBzZW1hbnRpY3MuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1pZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiY29udmVydGVyLWlkIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgdW5kZXIgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyIGNsYXNzIHNob3VsZCBiZSByZWdpc3RlcmVkLgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1mb3ItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjb252ZXJ0ZXItZm9yLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB3aGljaCBhIENvbnZlcnRlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyB3aWxsIGJlIHJlZ2lzdGVyZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiY29udmVydGVyLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGNvbmNyZXRlIENvbnZlcnRlciAKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctYXR0cmlidXRlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljCi0gICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgdGhhdCBtYXkgYmUgY29uZmlndXJlZCBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBpbiBvcmRlciB0byBhZmZlY3QgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiBvZiB0aGUgQ29udmVydGVyLiAgVGhpcyBhdHRyaWJ1dGUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyaWx5IGZvciBkZXNpZ24tdGltZSB0b29scyBhbmQgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCB0byBoYXZlIGFueSBtZWFuaW5nIGF0IHJ1bnRpbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZCAicHJvcGVydHkiIGVsZW1lbnRzIGlkZW50aWZ5IEphdmFCZWFucwotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIG9mIHRoZSBDb252ZXJ0ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtYXkgYmUgY29uZmlndXJlZCB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgQ29udmVydGVyLiAgVGhpcyBhdHRyaWJ1dGUgaXMgcHJpbWFyaWx5IGZvcgotICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ24tdGltZSB0b29scyBhbmQgaXMgbm90IHNwZWNpZmllZCB0byBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgIGFueSBtZWFuaW5nIGF0IHJ1bnRpbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXItZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctY29udmVydGVyLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLWNvbnZlcnRlci1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGNvbnZlcnRlci4gIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1saWZlY3ljbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAibGlmZWN5Y2xlIiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIHNwZWNpZnkKLSAgICAgICAgICAgICAgICBtb2RpZmljYXRpb25zIHRvIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGRlZmF1bHQgTGlmZWN5Y2xlCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBoYXNlLWxpc3RlbmVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicGhhc2UtbGlzdGVuZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIFBoYXNlTGlzdGVuZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgcmVnaXN0ZXJlZCBvbiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBMaWZlY3ljbGUuCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpZmVjeWNsZS1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1saWZlY3ljbGUtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotCi0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLWxpZmVjeWNsZS1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGxpZmVjeWNsZS4gIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIAotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgICAKLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWxvY2FsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgbG9jYWxlVHlwZSBkZWZpbmVzIHZhbGlkIGxvY2FsZSBkZWZpbmVkIGJ5IElTTy02MzktMQotICAgICAgICAgICAgICAgIGFuZCBJU08tMzE2Ni4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSIoW2Etel17Mn0pW198XC1dPyhbXHB7TH1dezJ9KT9bX3xcLV0/KFx3Kyk/Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbG9jYWxlLWNvbmZpZ1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImxvY2FsZS1jb25maWciIGVsZW1lbnQgYWxsb3dzIHRoZSBhcHAgZGV2ZWxvcGVyIHRvIAotICAgICAgICAgICAgICAgIGRlY2xhcmUgdGhlwqBzdXBwb3J0ZWQgbG9jYWxlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1sb2NhbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1kZWZhdWx0LWxvY2FsZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3VwcG9ydGVkLWxvY2FsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXN1cHBvcnRlZC1sb2NhbGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1kZWZhdWx0LXZhbGlkYXRvcnNUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJkZWZhdWx0LXZhbGlkYXRvcnMiIGVsZW1lbnQgYWxsb3dzIHRoZSBhcHAgZGV2ZWxvcGVyIHRvIAotICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGEgc2V0IG9mIHZhbGlkYXRvcnMsIHJlZmVyZW5jZWQgYnkgaWRlbnRpZmllciwgdGhhdAotICAgICAgICAgICAgICAgIGFyZSBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIHRvIGFueSBFZGl0YWJsZVZhbHVlSG9sZGVyIGNvbXBvbmVudAotICAgICAgICAgICAgICAgIGluIHRoZSBhcHBsaWNhdGlvbiwgdW5sZXNzIG92ZXJyaWRkZW4gb3IgZGlzYWJsZWQgbG9jYWxseS4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yLWlkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJ2YWxpZGF0b3ItaWQiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgaWRlbnRpZmllciAKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mIGEgcmVnaXN0ZXJlZCB2YWxpZGF0b3IuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLW1hbmFnZWQtYmVhblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJtYW5hZ2VkLWJlYW4iIGVsZW1lbnQgcmVwcmVzZW50cyBhIEphdmFCZWFuLCBvZiBhIAotICAgICAgICAgICAgICAgIHBhcnRpY3VsYXIgY2xhc3MsIHRoYXQgd2lsbCBiZSBkeW5hbWljYWxseSBpbnN0YW50aWF0ZWQgCi0gICAgICAgICAgICAgICAgYXQgcnVudGltZSAoYnkgdGhlIGRlZmF1bHQgVmFyaWFibGVSZXNvbHZlciBpbXBsZW1lbnRhdGlvbikgCi0gICAgICAgICAgICAgICAgaWYgaXQgaXMgcmVmZXJlbmNlZCBhcyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIHZhbHVlIGJpbmRpbmcgCi0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiwgYW5kIG5vIGNvcnJlc3BvbmRpbmcgYmVhbiBjYW4gYmUgaWRlbnRpZmllZCBpbiAKLSAgICAgICAgICAgICAgICBhbnkgc2NvcGUuICBJbiBhZGRpdGlvbiB0byB0aGUgY3JlYXRpb24gb2YgdGhlIG1hbmFnZWQgYmVhbiwgCi0gICAgICAgICAgICAgICAgYW5kIHRoZSBvcHRpb25hbCBzdG9yaW5nIG9mIGl0IGludG8gdGhlIHNwZWNpZmllZCBzY29wZSwgCi0gICAgICAgICAgICAgICAgdGhlIG5lc3RlZCBtYW5hZ2VkLXByb3BlcnR5IGVsZW1lbnRzIGNhbiBiZSB1c2VkIHRvIAotICAgICAgICAgICAgICAgIGluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mIHNldHRhYmxlIEphdmFCZWFucyBwcm9wZXJ0aWVzIG9mIAotICAgICAgICAgICAgICAgIHRoZSBjcmVhdGVkIGluc3RhbmNlLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFuYWdlZC1iZWFuLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgIm1hbmFnZWQtYmVhbi1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlIG5hbWUgdW5kZXIgd2hpY2ggYSBtYW5hZ2VkIGJlYW4gd2lsbCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNlYXJjaGVkIGZvciwgYXMgd2VsbCBhcyBzdG9yZWQgKHVubGVzcyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAibWFuYWdlZC1iZWFuLXNjb3BlIiB2YWx1ZSBpcyAibm9uZSIpLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFuYWdlZC1iZWFuLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJtYW5hZ2VkLWJlYW4tY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgd2lsbCBiZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRgdG8gaW5zdGFudGlhdGUgYSBuZXcgaW5zdGFuY2UgaWYgY3JlYXRpb24gb2YgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkYG1hbmFnZWQgYmVhbiBpcyByZXF1ZXN0ZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzcGVjaWZpZWQgY2xhc3MgbXVzdCBjb25mb3JtIHRvIHN0YW5kYXJkIEphdmFCZWFucwotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVudGlvbnMuICBJbiBwYXJ0aWN1bGFyLCBpdCBtdXN0IGhhdmUgYSBwdWJsaWMKLSAgICAgICAgICAgICAgICAgICAgICAgIHplcm8tYXJndW1lbnRzIGNvbnN0cnVjdG9yLCBhbmQgemVybyBvciBtb3JlIHB1YmxpYwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgc2V0dGVycy4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IAotICAgICAgICAgICAgICAgIG5hbWU9Im1hbmFnZWQtYmVhbi1zY29wZSIKLSAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW1hbmFnZWQtYmVhbi1zY29wZU9yTm9uZVR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgIm1hbmFnZWQtYmVhbi1zY29wZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBzY29wZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludG8gd2hpY2ggYSBuZXdseSBjcmVhdGVkIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgCi0gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VkIGJlYW4gd2lsbCBiZSBzdG9yZWQgKHVubGVzcyB0aGUgdmFsdWUgaXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAibm9uZSIpLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFuYWdlZC1wcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1tYW5hZ2VkLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAtZW50cmllcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1tYXAtZW50cmllc1R5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdC1lbnRyaWVzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWxpc3QtZW50cmllc1R5cGUiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLWJlYW4tZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbWFuYWdlZC1iZWFuLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJlYWdlciIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZT0ib3B0aW9uYWwiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpcyBvbmx5IGNvbnNpZGVyZWQgd2hlbiBhc3NvY2lhdGVkIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgYW4gYXBwbGljYXRpb24tc2NvcGVkIG1hbmFnZWQgYmVhbi4gSWYgdGhlIHZhbHVlIG9mIHRoZSBlYWdlcgotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgaXMgdHJ1ZSB0aGUgcnVudGltZSBtdXN0IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgYW5kIHN0b3JlIHRoZSBpbnN0YW5jZSB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uIHNjb3BlIHdoZW4gdGhlCi0gICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHN0YXJ0cy4KLQotICAgICAgICAgICAgICAgICAgICBJZiBlYWdlciBpcyB1bnNwZWNpZmllZCBvciBpcyBmYWxzZSwgdGhlIGRlZmF1bHQgImxhenkiCi0gICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRpb24gYW5kIHNjb3BlZCBzdG9yYWdlIG9mIHRoZSBtYW5hZ2VkIGJlYW4KLSAgICAgICAgICAgICAgICAgICAgd2lsbCBvY2N1ci4KLQotICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctbWFuYWdlZC1iZWFuLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgbWFuYWdlZC1iZWFuLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gICAgCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbWFuYWdlZC1iZWFuLXNjb3BlT3JOb25lVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIGxlZ2FsIHZhbHVlcyBmb3IgdGhlIDxtYW5hZ2VkLWJlYW4tc2NvcGU+Ci0gICAgICAgICAgICAgICAgZWxlbWVudCdzIGJvZHkgY29udGVudCwgd2hpY2ggaW5jbHVkZXMgYWxsIG9mIHRoZSBzY29wZXMKLSAgICAgICAgICAgICAgICBub3JtYWxseSB1c2VkIGluIGEgd2ViIGFwcGxpY2F0aW9uLCBwbHVzIHRoZSAibm9uZSIgdmFsdWUKLSAgICAgICAgICAgICAgICBpbmRpY2F0aW5nIHRoYXQgYSBjcmVhdGVkIGJlYW4gc2hvdWxkIG5vdCBiZSBzdG9yZWQgaW50bwotICAgICAgICAgICAgICAgIGFueSBzY29wZS4gIEFsdGVybmF0aXZlbHksIGFuIEVMIGV4cHJlc3Npb24gbWF5IGJlIHVzZWQKLSAgICAgICAgICAgICAgICBhcyB0aGUgdmFsdWUgb2YgdGhpcyBlbGVtZW50LiAgVGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoaXMKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uIG11c3QgYnkgb2YgdHlwZSBqYXZhLnV0aWwuTWFwLgotICAgICAgICAgICAgICAgIF1dPgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJ2aWV3fHJlcXVlc3R8c2Vzc2lvbnxhcHBsaWNhdGlvbnxub25lfCNcey4qXH0iLz4KLSAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbWFuYWdlZC1wcm9wZXJ0eVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJtYW5hZ2VkLXByb3BlcnR5IiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCAKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSBvZiBhIG1hbmFnZWQgYmVhbiB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCB0byB0aGUgCi0gICAgICAgICAgICAgICAgc3BlY2lmaWVkIHZhbHVlIChvciB2YWx1ZSBzZXQpIGlmIHRoZSBjb3JyZXNwb25kaW5nIAotICAgICAgICAgICAgICAgIG1hbmFnZWQgYmVhbiBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJwcm9wZXJ0eS1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmFCZWFucyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5IG5hbWUgdW5kZXIgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgbWF5IAotICAgICAgICAgICAgICAgICAgICAgICAgYmUgc3RvcmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHktY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInByb3BlcnR5LWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmEgdHlwZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9wZXJ0eSBuYW1lLiAgCi0gICAgICAgICAgICAgICAgICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCBpdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSBleGlzdGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXM7IGhvd2V2ZXIsIHRoaXMgZWxlbWVudCBzaG91bGQgYmUgc3BlY2lmaWVkIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBnb2luZyB0byBiZSB0aGUgc291cmNlIAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGdlbmVyYXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3Nlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1lbnRyaWVzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW1hcC1lbnRyaWVzVHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJudWxsLXZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW51bGwtdmFsdWVUeXBlIj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12YWx1ZVR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdC1lbnRyaWVzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWxpc3QtZW50cmllc1R5cGUiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLW1hcC1lbnRyeVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJtYXAtZW50cnkiIGVsZW1lbnQgcmVwcnNlbnRzIGEgc2luZ2xlIGtleS1lbnRyeSBwYWlyIAotICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29tcHV0ZWQgdmFsdWUgb2YgYSBtYW5hZ2VkIAotICAgICAgICAgICAgICAgIHByb3BlcnR5IG9mIHR5cGUgamF2YS51dGlsLk1hcC4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImtleSIgZWxlbWVudCBpcyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXAga2V5IHRoYXQgd2lsbCBiZSBzdG9yZWQgaW4gYSBtYW5hZ2VkIHByb3BlcnR5IG9mIAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBqYXZhLnV0aWwuTWFwLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibnVsbC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1udWxsLXZhbHVlVHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12YWx1ZVR5cGUiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLW1hcC1lbnRyaWVzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgIm1hcC1lbnRyaWVzJyBlbGVtZW50IHJlcHJlc2VudHMgYSBzZXQgb2Yga2V5LWVudHJ5IHBhaXJzIAotICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29tcHV0ZWQgdmFsdWUgb2YgYSBtYW5hZ2VkIHByb3BlcnR5IAotICAgICAgICAgICAgICAgIG9mIHR5cGUgamF2YS51dGlsLk1hcC4gIEluIGFkZGl0aW9uLCB0aGUgSmF2YSBjbGFzcyB0eXBlcyAKLSAgICAgICAgICAgICAgICBvZiB0aGUga2V5IGFuZCBlbnRyeSB2YWx1ZXMgbWF5IGJlIG9wdGlvbmFsbHkgZGVjbGFyZWQuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAia2V5LWNsYXNzIiBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSB0byB3aGljaCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggImtleSIgZWxlbWVudCBpbiBhIHNldCBvZiAibWFwLWVudHJ5IiBlbGVtZW50cyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgY29udmVydGVkIHRvLiAgSWYgb21pdHRlZCwgImphdmEubGFuZy5TdHJpbmciIAotICAgICAgICAgICAgICAgICAgICAgICAgaXMgYXNzdW1lZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctdmFsdWUtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAtZW50cnkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1tYXAtZW50cnlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbmF2aWdhdGlvbi1jYXNlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgIm5hdmlnYXRpb24tY2FzZSIgZWxlbWVudCBkZXNjcmliZXMgYSBwYXJ0aWN1bGFyIAotICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIGNvbmRpdGlvbnMgdGhhdCBtdXN0IG1hdGNoIGZvciB0aGlzIGNhc2UgdG8gCi0gICAgICAgICAgICAgICAgYmUgZXhlY3V0ZWQsIGFuZCB0aGUgdmlldyBpZCBvZiB0aGUgY29tcG9uZW50IHRyZWUgdGhhdCAKLSAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2VsZWN0ZWQgbmV4dC4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmcm9tLWFjdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWZyb20tYWN0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmcm9tLW91dGNvbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJmcm9tLW91dGNvbWUiIGVsZW1lbnQgY29udGFpbnMgYSBsb2dpY2FsIG91dGNvbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZXhlY3V0aW9uIG9mIGFuIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gbWV0aG9kIHNlbGVjdGVkIHZpYSBhbiAiYWN0aW9uUmVmIiBwcm9wZXJ0eQotICAgICAgICAgICAgICAgICAgICAgICAgKG9yIGEgbGl0ZXJhbCB2YWx1ZSBzcGVjaWZpZWQgYnkgYW4gImFjdGlvbiIgcHJvcGVydHkpCi0gICAgICAgICAgICAgICAgICAgICAgICBvZiBhIFVJQ29tbWFuZCBjb21wb25lbnQuICBJZiBzcGVjaWZpZWQsIHRoaXMgcnVsZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcmVsZXZhbnQgb25seSBpZiB0aGUgb3V0Y29tZSB2YWx1ZSBtYXRjaGVzIAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBlbGVtZW50J3MgdmFsdWUuICBJZiBub3Qgc3BlY2lmaWVkLCB0aGlzIHJ1bGUgCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHJlbGV2YW50IGlmIHRoZSBvdXRjb21lIHZhbHVlIGlzIG5vbi1udWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBvciwgaWYgdGhlICJpZiIgZWxlbWVudCBpcyBwcmVzZW50LCB3aWxsIGJlIHJlbGV2YW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgYW55IG91dGNvbWUgdmFsdWUsIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiBzcGVjaWZpZWQgaW4gdGhlICJpZiIgZWxlbWVudCB1bHRpbWF0ZWx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmVzIGlmIHRoaXMgcnVsZSBpcyBhIG1hdGNoLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWYiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1pZlR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICBQbGVhc2Ugc2VlIHNlY3Rpb24gSlNGLjcuNC4yIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGlzIGVsZW1lbnQuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0by12aWV3LWlkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctdmFsdWVUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJ0by12aWV3LWlkIiBlbGVtZW50IGNvbnRhaW5zIHRoZSB2aWV3IGlkZW50aWZpZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgbmV4dCB2aWV3IHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpZiB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uIHJ1bGUgaXMgbWF0Y2hlZC4gSWYgdGhlIGNvbnRlbnRzIGlzIGEKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGV4cHJlc3Npb24sIGl0IHNob3VsZCBiZSByZXNvbHZlZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb24gaGFuZGxlciB0byBvYnRhaW4gdGhlIHZpZXcgaWRlbnRpZmllci4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IAotICAgICAgICAgICAgICAgIG5hbWU9InJlZGlyZWN0IgotICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctcmVkaXJlY3RUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLW5hdmlnYXRpb24tcnVsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgIm5hdmlnYXRpb24tcnVsZSIgZWxlbWVudCByZXByZXNlbnRzIGFuIGluZGl2aWR1YWwgCi0gICAgICAgICAgICAgICAgZGVjaXNpb24gcnVsZSB0aGF0IHdpbGwgYmUgdXRpbGl6ZWQgYnkgdGhlIGRlZmF1bHQgCi0gICAgICAgICAgICAgICAgTmF2aWdhdGlvbkhhbmRsZXIgaW1wbGVtZW50YXRpb24gdG8gbWFrZSBkZWNpc2lvbnMgb24gCi0gICAgICAgICAgICAgICAgd2hhdCB2aWV3IHNob3VsZCBiZSBkaXNwbGF5ZWQgbmV4dCwgYmFzZWQgb24gdGhlIAotICAgICAgICAgICAgICAgIHZpZXcgaWQgYmVpbmcgcHJvY2Vzc2VkLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnJvbS12aWV3LWlkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZnJvbS12aWV3LWlkVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYXZpZ2F0aW9uLWNhc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1uYXZpZ2F0aW9uLWNhc2VUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IAotICAgICAgICAgICAgICAgIG5hbWU9Im5hdmlnYXRpb24tcnVsZS1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1uYXZpZ2F0aW9uLXJ1bGUtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctbmF2aWdhdGlvbi1ydWxlLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgbmF2aWdhdGlvbi1ydWxlLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1udWxsLXZhbHVlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAibnVsbC12YWx1ZSIgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGUgbWFuYWdlZAotICAgICAgICAgICAgICAgIHByb3BlcnR5IGluIHdoaWNoIHdlIGFyZSBuZXN0ZWQgd2lsbCBiZSBleHBsaWNpdGx5Ci0gICAgICAgICAgICAgICAgc2V0IHRvIG51bGwgaWYgb3VyIG1hbmFnZWQgYmVhbiBpcyBhdXRvbWF0aWNhbGx5Ci0gICAgICAgICAgICAgICAgY3JlYXRlZC4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gb21pdHRpbmcgdGhlIG1hbmFnZWQKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSBlbGVtZW50IGVudGlyZWx5LCB3aGljaCB3aWxsIGNhdXNlIG5vCi0gICAgICAgICAgICAgICAgcHJvcGVydHkgc2V0dGVyIHRvIGJlIGNhbGxlZCBmb3IgdGhpcyBwcm9wZXJ0eS4KLQotICAgICAgICAgICAgICAgIFRoZSAibnVsbC12YWx1ZSIgZWxlbWVudCBjYW4gb25seSBiZSB1c2VkIHdoZW4gdGhlCi0gICAgICAgICAgICAgICAgYXNzb2NpYXRlZCAicHJvcGVydHktY2xhc3MiIGlkZW50aWZpZXMgYSBKYXZhIGNsYXNzLAotICAgICAgICAgICAgICAgIG5vdCBhIEphdmEgcHJpbWl0aXZlLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcHJvcGVydHlUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAicHJvcGVydHkiIGVsZW1lbnQgcmVwcmVzZW50cyBhIEphdmFCZWFuIHByb3BlcnR5IG9mIHRoZSAKLSAgICAgICAgICAgICAgICBKYXZhIGNsYXNzIHJlcHJlc2VudGVkIGJ5IG91ciBwYXJlbnQgZWxlbWVudC4KLQotICAgICAgICAgICAgICAgIFByb3BlcnR5IG5hbWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIEphdmEgCi0gICAgICAgICAgICAgICAgY2xhc3MgdGhhdCBpcyByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50IGVsZW1lbnQsIGFuZCBtdXN0IAotICAgICAgICAgICAgICAgIGNvcnJlc3BvbmQgdG8gcHJvcGVydHkgbmFtZXMgdGhhdCB3aWxsIGJlIHJlY29nbml6ZWQgd2hlbiAKLSAgICAgICAgICAgICAgICBwZXJmb3JtaW5nIGludHJvc3BlY3Rpb24gYWdhaW5zdCB0aGF0IGNsYXNzIHZpYSAKLSAgICAgICAgICAgICAgICBqYXZhLmJlYW5zLkludHJvc3BlY3Rvci4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInByb3BlcnR5LW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgSmF2YUJlYW5zIAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgbmFtZSB1bmRlciB3aGljaCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSBzdG9yZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6amF2YS10eXBlVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicHJvcGVydHktY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgSmF2YSB0eXBlIAotICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb3BlcnR5IG5hbWUuICAKLSAgICAgICAgICAgICAgICAgICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIGl0IGNhbiBiZSBpbmZlcnJlZCBmcm9tIGV4aXN0aW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NlczsgaG93ZXZlciwgdGhpcyBlbGVtZW50IHNob3VsZCBiZSBzcGVjaWZpZWQgaWYgCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGdvaW5nIHRvIGJlIHRoZSBzb3VyY2UgZm9yIAotICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGluZyB0aGUgY29ycmVzcG9uZGluZyBjbGFzc2VzLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWRlZmF1bHQtdmFsdWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPiAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN1Z2dlc3RlZC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXN1Z2dlc3RlZC12YWx1ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHktZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctcHJvcGVydHktZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIAotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXByb3BlcnR5LWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgcHJvcGVydHkuICBJdCBtYXkgY29udGFpbiAKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcmVkaXJlY3RUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIFRoZSAicmVkaXJlY3QiIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgbmF2aWdhdGlvbiB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkICJ0by12aWV3LWlkIiBzaG91bGQgYmUgYWNjb21wbGlzaGVkIGJ5IAotICAgICAgICAgICAgICAgICAgICBwZXJmb3JtaW5nIGFuIEhUVFAgcmVkaXJlY3QgcmF0aGVyIHRoYW4gdGhlIHVzdWFsIAotICAgICAgICAgICAgICAgICAgICBWaWV3SGFuZGxlciBtZWNoYW5pc21zLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZpZXctcGFyYW0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1yZWRpcmVjdC12aWV3UGFyYW1UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5jbHVkZS12aWV3LXBhcmFtcyIgdHlwZT0ieHNkOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiLz4KLQotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcmVkaXJlY3Qtdmlld1BhcmFtVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBUaGUgInZpZXctcGFyYW0iIGVsZW1lbnQsIG9ubHkgdmFsaWQgd2l0aGluCi0gICAgICAgICAgICAgICAgICAgIGEgInJlZGlyZWN0IiBlbGVtZW50LCBjb250YWlucyBjaGlsZCAibmFtZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kICJ2YWx1ZSIgZWxlbWVudHMgdGhhdCBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZQotICAgICAgICAgICAgICAgICAgICByZWRpcmVjdCB1cmwgd2hlbiB0aGUgcmVkaXJlY3QgaXMgcGVyZm9ybWVkLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLQotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcmVmZXJlbmNlZC1iZWFuVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgInJlZmVyZW5jZWQtYmVhbiIgZWxlbWVudCByZXByZXNlbnRzIGF0IGRlc2lnbiB0aW1lIHRoZSAKLSAgICAgICAgICAgICAgICBwcm9taXNlIHRoYXQgYSBKYXZhIG9iamVjdCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgd2lsbCBleGlzdCBhdCAKLSAgICAgICAgICAgICAgICBydW50aW1lIGluIHNvbWUgc2NvcGUsIHVuZGVyIHRoZSBzcGVjaWZpZWQga2V5LiAgVGhpcyBjYW4gYmUgCi0gICAgICAgICAgICAgICAgdXNlZCBieSBkZXNpZ24gdGltZSB0b29scyB0byBjb25zdHJ1Y3QgdXNlciBpbnRlcmZhY2UgZGlhbG9ncyAKLSAgICAgICAgICAgICAgICBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLiAgVGhlIHByZXNlbmNlIAotICAgICAgICAgICAgICAgIG9yIGFic2VuY2Ugb2YgYSByZWZlcmVuY2VkIGJlYW4gZWxlbWVudCBoYXMgbm8gaW1wYWN0IG9uIHRoZSAKLSAgICAgICAgICAgICAgICBKYXZhU2VydmVyIEZhY2VzIHJ1bnRpbWUgZW52aXJvbm1lbnQgaW5zaWRlIGEgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZWQtYmVhbi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJyZWZlcmVuY2VkLWJlYW4tbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBuYW1lIHVuZGVyIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZCBiZWFuIG1heSBiZSBhc3N1bWVkIHRvIGJlIHN0b3JlZCwgaW4gb25lIAotICAgICAgICAgICAgICAgICAgICAgICAgb2YgJ3JlcXVlc3QnLCAnc2Vzc2lvbicsICd2aWV3JywgJ2FwcGxpY2F0aW9uJyAKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgY3VzdG9tIHNjb3BlLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlZC1iZWFuLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJyZWZlcmVuY2VkLWJlYW4tY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyAKLSAgICAgICAgICAgICAgICAgICAgICAgIChlaXRoZXIgYWJzdHJhY3Qgb3IgY29uY3JldGUpIG9yIEphdmEgaW50ZXJmYWNlIAotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgcmVmZXJlbmNlZCBiZWFuLiAKLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcmVuZGVyLWtpdFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJyZW5kZXIta2l0IiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBSZW5kZXJLaXQgCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIAotICAgICAgICAgICAgICAgIHJlbmRlci1raXQtaWQuICBJZiBubyByZW5kZXIta2l0LWlkIGlzIHNwZWNpZmllZCwgdGhlIAotICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIGRlZmF1bHQgUmVuZGVyS2l0IAotICAgICAgICAgICAgICAgIChSZW5kZXJLaXRGYWN0b3J5LkRFRkFVTFRfUkVOREVSX0tJVCkgaXMgYXNzdW1lZC4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIAotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdC1pZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicmVuZGVyLWtpdC1pZCIgZWxlbWVudCByZXByZXNlbnRzIGFuIGlkZW50aWZpZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIFJlbmRlcktpdCByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50IAotICAgICAgICAgICAgICAgICAgICAgICAgInJlbmRlci1raXQiIGVsZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicmVuZGVyLWtpdC1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY29uY3JldGUgUmVuZGVyS2l0IAotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXJlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXJlbmRlcmVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIAotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xpZW50LWJlaGF2aW9yLXJlbmRlcmVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctY2xpZW50LWJlaGF2aW9yLXJlbmRlcmVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIAotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1yZW5kZXIta2l0LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1jbGllbnQtYmVoYXZpb3ItcmVuZGVyZXJUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJjbGllbnQtYmVoYXZpb3ItcmVuZGVyZXIiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIAotICAgICAgICAgICAgICAgIENsaWVudEJlaGF2aW9yUmVuZGVyZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBzaG91bGQgYmUgCi0gICAgICAgICAgICAgICAgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIGJlaGF2aW9yIHJlbmRlcmVyIHR5cGUgaWRlbnRpZmllciwKLSAgICAgICAgICAgICAgICBpbiB0aGUgUmVuZGVyS2l0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyZW50ICJyZW5kZXIta2l0IgotICAgICAgICAgICAgICAgIGVsZW1lbnQuICBDbGllbnQgQmVoYXZpb3IgcmVuZGVyZXIgdHlwZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIFJlbmRlcktpdAotICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyZW50ICJyZW5kZXIta2l0IiBlbGVtZW50LgotCi0gICAgICAgICAgICAgICAgTmVzdGVkICJhdHRyaWJ1dGUiIGVsZW1lbnRzIGlkZW50aWZ5IGdlbmVyaWMgY29tcG9uZW50Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlcyB0aGF0IGFyZSByZWNvZ25pemVkIGJ5IHRoaXMgcmVuZGVyZXIuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGllbnQtYmVoYXZpb3ItcmVuZGVyZXItdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjbGllbnQtYmVoYXZpb3ItcmVuZGVyZXItdHlwZSIgZWxlbWVudCByZXByZXNlbnRzIGEgcmVuZGVyZXIgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciBmb3IgdGhlIENsaWVudCBCZWhhdmlvciBSZW5kZXJlciByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50LWJlaGF2aW9yLXJlbmRlcmVyIiBlbGVtZW50LgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xpZW50LWJlaGF2aW9yLXJlbmRlcmVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjbGllbnQtYmVoYXZpb3ItcmVuZGVyZXItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY29uY3JldGUgQ2xpZW50IEJlaGF2aW9yIFJlbmRlcmVyCi0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXJlbmRlcmVyVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgInJlbmRlcmVyIiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBSZW5kZXJlciAKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZSAKLSAgICAgICAgICAgICAgICBzcGVjaWZpZWQgY29tcG9uZW50IGZhbWlseSBhbmQgcmVuZGVyZXIgdHlwZSBpZGVudGlmaWVycywgCi0gICAgICAgICAgICAgICAgaW4gdGhlIFJlbmRlcktpdCBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcmVudCAicmVuZGVyLWtpdCIgCi0gICAgICAgICAgICAgICAgZWxlbWVudC4gIENvbWJpbmF0aW9ucyBvZiBjb21wb25lbnQgZmFtaWx5IGFuZCAKLSAgICAgICAgICAgICAgICByZW5kZXJlciB0eXBlIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgUmVuZGVyS2l0IAotICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyZW50ICJyZW5kZXIta2l0IiBlbGVtZW50LgotCi0gICAgICAgICAgICAgICAgTmVzdGVkICJhdHRyaWJ1dGUiIGVsZW1lbnRzIGlkZW50aWZ5IGdlbmVyaWMgY29tcG9uZW50IAotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgdGhhdCBhcmUgcmVjb2duaXplZCBieSB0aGlzIHJlbmRlcmVyLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtZmFtaWx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImNvbXBvbmVudC1mYW1pbHkiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgZmFtaWx5IGZvciB3aGljaCB0aGUgUmVuZGVyZXIgcmVwcmVzZW50ZWQgCi0gICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgcGFyZW50ICJyZW5kZXJlciIgZWxlbWVudCB3aWxsIGJlIHVzZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPiAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbmRlcmVyLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicmVuZGVyZXItdHlwZSIgZWxlbWVudCByZXByZXNlbnRzIGEgcmVuZGVyZXIgdHlwZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgZm9yIHRoZSBSZW5kZXJlciByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50IAotICAgICAgICAgICAgICAgICAgICAgICAgInJlbmRlcmVyIiBlbGVtZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInJlbmRlcmVyLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGNvbmNyZXRlIFJlbmRlcmVyCi0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZmFjZXRUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWF0dHJpYnV0ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyZXItZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctcmVuZGVyZXItZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXJlbmRlcmVyLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgcmVuZGVyZXIuICBJdCBtYXkgY29udGFpbiBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1yZW5kZXIta2l0LWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgcmVuZGVyLWtpdC4gIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctc3VnZ2VzdGVkLXZhbHVlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAic3VnZ2VzdGVkLXZhbHVlIiBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBvcgotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBpbiB3aGljaCB0aGlzIGVsZW1lbnQgcmVzaWRlcy4gIFRoaXMgdmFsdWUgaXMgCi0gICAgICAgICAgICAgICAgYWR2aXNvcnkgb25seSBhbmQgaXMgaW50ZW5kZWQgZm9yIHRvb2xzIHRvIHVzZSB3aGVuIAotICAgICAgICAgICAgICAgIHBvcHVsYXRpbmcgcGFsbGV0dGVzLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXN1cHBvcnRlZC1sb2NhbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJzdXBwb3J0ZWQtbG9jYWxlIiBlbGVtZW50IGFsbG93cyBhdXRob3JzIHRvIGRlY2xhcmUKLSAgICAgICAgICAgICAgICB3aGljaCBsb2NhbGVzIGFyZSBzdXBwb3J0ZWQgaW4gdGhpcyBhcHBsaWNhdGlvbiBpbnN0YW5jZS4KLQotICAgICAgICAgICAgICAgIEl0IG11c3QgYmUgc3BlY2lmaWVkIGFzIDpsYW5ndWFnZTpbXzpjb3VudHJ5OltfOnZhcmlhbnQ6XV0KLSAgICAgICAgICAgICAgICB3aXRob3V0IHRoZSBjb2xvbnMsIGZvciBleGFtcGxlICJqYV9KUF9TSklTIi4gIFRoZQotICAgICAgICAgICAgICAgIHNlcGFyYXRvcnMgYmV0d2VlbiB0aGUgc2VnbWVudHMgbWF5IGJlICctJyBvciAnXycuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImphdmFlZTpmYWNlcy1jb25maWctbG9jYWxlVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPiAKLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWJlaGF2aW9yVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiYmVoYXZpb3IiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIEJlaGF2aW9yIAotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlCi0gICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJlaGF2aW9yIGlkZW50aWZpZXIuICBCZWhhdmlvciBpZGVudGlmaWVycyBtdXN0Ci0gICAgICAgICAgICAgICAgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgICAgICAgICAgICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGF0dHJpYnV0ZXMgdGhhdAotICAgICAgICAgICAgICAgIG1heSBiZSBjb25maWd1cmVkIG9uIHRoZSBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGluIG9yZGVyCi0gICAgICAgICAgICAgICAgdG8gYWZmZWN0IHRoZSBvcGVyYXRpb24gb2YgdGhlIEJlaGF2aW9yLiAgTmVzdGVkICJwcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICBlbGVtZW50cyBpZGVudGlmeSBKYXZhQmVhbnMgcHJvcGVydGllcyBvZiB0aGUgQmVoYXZpb3IgCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBtYXkgYmUgY29uZmlndXJlZCB0byBhZmZlY3QgdGhlCi0gICAgICAgICAgICAgICAgb3BlcmF0aW9uIG9mIHRoZSBCZWhhdmlvci4gICJhdHRyaWJ1dGUiIGFuZCAicHJvcGVydHkiCi0gICAgICAgICAgICAgICAgZWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGFsbG93IGNvbXBvbmVudCBkZXZlbG9wZXJzIHRvCi0gICAgICAgICAgICAgICAgbW9yZSBjb21wbGV0ZWx5IGRlc2NyaWJlIHRoZWlyIGNvbXBvbmVudHMgdG8gdG9vbHMgYW5kIHVzZXJzLgotICAgICAgICAgICAgICAgIFRoZXNlIGVsZW1lbnRzIGhhdmUgbm8gcmVxdWlyZWQgcnVudGltZSBzZW1hbnRpY3MuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiZWhhdmlvci1pZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJiZWhhdmlvci1pZCIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBpZGVudGlmaWVyCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmRlciB3aGljaCB0aGUgY29ycmVzcG9uZGluZyBCZWhhdmlvciBjbGFzcyBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJlZ2lzdGVyZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiZWhhdmlvci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiYmVoYXZpb3ItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY29uY3JldGUgQmVoYXZpb3IgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWF0dHJpYnV0ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYwotICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIHRoYXQgbWF5IGJlIGNvbmZpZ3VyZWQgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgVUlDb21wb25lbnQgaW4gb3JkZXIgdG8gYWZmZWN0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gb2YgdGhlIEJlaGF2aW9yLiAgVGhpcyBhdHRyaWJ1dGUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyaWx5IGZvciBkZXNpZ24tdGltZSB0b29scyBhbmQgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCB0byBoYXZlIGFueSBtZWFuaW5nIGF0IHJ1bnRpbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctcHJvcGVydHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkICJwcm9wZXJ0eSIgZWxlbWVudHMgaWRlbnRpZnkgSmF2YUJlYW5zCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgb2YgdGhlIEJlaGF2aW9yIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWF5IGJlIGNvbmZpZ3VyZWQgdG8gYWZmZWN0IHRoZSBvcGVyYXRpb24gb2YKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIEJlaGF2aW9yLiAgVGhpcyBhdHRyaWJ1dGUgaXMgcHJpbWFyaWx5IGZvcgotICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ24tdGltZSB0b29scyBhbmQgaXMgbm90IHNwZWNpZmllZCB0byBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgIGFueSBtZWFuaW5nIGF0IHJ1bnRpbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiZWhhdmlvci1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1iZWhhdmlvci1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctYmVoYXZpb3ItZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBiZWhhdmlvci4gIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXZhbGlkYXRvclR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgInZhbGlkYXRvciIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgVmFsaWRhdG9yCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUKLSAgICAgICAgICAgICAgICBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkZW50aWZpZXIuICBWYWxpZGF0b3IgaWRlbnRpZmllcnMgbXVzdCAKLSAgICAgICAgICAgICAgICBiZSB1bmlxdWUgd2l0aGluIHRoZSBlbnRpcmUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgICAgICAgICAgICAgTmVzdGVkICJhdHRyaWJ1dGUiIGVsZW1lbnRzIGlkZW50aWZ5IGdlbmVyaWMgYXR0cmlidXRlcyB0aGF0IAotICAgICAgICAgICAgICAgIG1heSBiZSBjb25maWd1cmVkIG9uIHRoZSBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGluIG9yZGVyIAotICAgICAgICAgICAgICAgIHRvIGFmZmVjdCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBWYWxpZGF0b3IuICBOZXN0ZWQgInByb3BlcnR5IgotICAgICAgICAgICAgICAgIGVsZW1lbnRzIGlkZW50aWZ5IEphdmFCZWFucyBwcm9wZXJ0aWVzIG9mIHRoZSBWYWxpZGF0b3IKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IG1heSBiZSBjb25maWd1cmVkIHRvIGFmZmVjdCB0aGUKLSAgICAgICAgICAgICAgICBvcGVyYXRpb24gb2YgdGhlIFZhbGlkYXRvci4gICJhdHRyaWJ1dGUiIGFuZCAicHJvcGVydHkiIAotICAgICAgICAgICAgICAgIGVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBhbGxvdyBjb21wb25lbnQgZGV2ZWxvcGVycyB0byAKLSAgICAgICAgICAgICAgICBtb3JlIGNvbXBsZXRlbHkgZGVzY3JpYmUgdGhlaXIgY29tcG9uZW50cyB0byB0b29scyBhbmQgdXNlcnMuCi0gICAgICAgICAgICAgICAgVGhlc2UgZWxlbWVudHMgaGF2ZSBubyByZXF1aXJlZCBydW50aW1lIHNlbWFudGljcy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbGlkYXRvci1pZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJ2YWxpZGF0b3ItaWQiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgaWRlbnRpZmllciAKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIFZhbGlkYXRvciBjbGFzcyBzaG91bGQgCi0gICAgICAgICAgICAgICAgICAgICAgICBiZSByZWdpc3RlcmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbGlkYXRvci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAidmFsaWRhdG9yLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBjb25jcmV0ZSBWYWxpZGF0b3IgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctYXR0cmlidXRlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIAotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYwotICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIHRoYXQgbWF5IGJlIGNvbmZpZ3VyZWQgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgVUlDb21wb25lbnQgaW4gb3JkZXIgdG8gYWZmZWN0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gb2YgdGhlIFZhbGlkYXRvci4gIFRoaXMgYXR0cmlidXRlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgIHByaW1hcmlseSBmb3IgZGVzaWduLXRpbWUgdG9vbHMgYW5kIGlzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgdG8gaGF2ZSBhbnkgbWVhbmluZyBhdCBydW50aW1lLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIAotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWQgInByb3BlcnR5IiBlbGVtZW50cyBpZGVudGlmeSBKYXZhQmVhbnMKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyBvZiB0aGUgVmFsaWRhdG9yIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWF5IGJlIGNvbmZpZ3VyZWQgdG8gYWZmZWN0IHRoZSBvcGVyYXRpb24gb2YKLSAgICAgICAgICAgICAgICAgICAgICAgdGhlIFZhbGlkYXRvci4gIFRoaXMgYXR0cmlidXRlIGlzIHByaW1hcmlseSBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduLXRpbWUgdG9vbHMgYW5kIGlzIG5vdCBzcGVjaWZpZWQgdG8gaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICBhbnkgbWVhbmluZyBhdCBydW50aW1lLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXZhbGlkYXRvci1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gImZhY2VzLWNvbmZpZy12YWxpZGF0b3ItZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciB2YWxpZGF0b3IuICBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXZhbHVlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAidmFsdWUiIGVsZW1lbnQgaXMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZgotICAgICAgICAgICAgICAgIGEgbGl0ZXJhbCB2YWx1ZSB0byB3aGljaCBhIHNjYWxhciBtYW5hZ2VkIHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgd2lsbCBiZSBzZXQsIG9yIGEgdmFsdWUgYmluZGluZyBleHByZXNzaW9uICgiI3suLi59IikKLSAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHJlcXVpcmVkIHZhbHVlLgotICAgICAgICAgICAgICAgIEl0IHdpbGwgYmUgY29udmVydGVkIGFzIHNwZWNpZmllZCBmb3IgdGhlIGFjdHVhbAotICAgICAgICAgICAgICAgIHByb3BlcnR5IHR5cGUuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6dW5pb24gCi0gICAgICAgICAgICBtZW1iZXJUeXBlcz0iamF2YWVlOmZhY2VzLWNvbmZpZy1lbC1leHByZXNzaW9uVHlwZSB4c2Q6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAKLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gICAgCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctdmFsdWUtY2xhc3NUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAidmFsdWUtY2xhc3MiIGVsZW1lbnQgZGVmaW5lcyB0aGUgSmF2YSB0eXBlIHRvIHdoaWNoIGVhY2gKLSAgICAgICAgICAgICAgICAidmFsdWUiIGVsZW1lbnQncyB2YWx1ZSB3aWxsIGJlIGNvbnZlcnRlZCB0bywgcHJpb3IgdG8gYWRkaW5nIAotICAgICAgICAgICAgICAgIGl0IHRvIHRoZSAibGlzdC1lbnRyaWVzIiBsaXN0IGZvciBhIG1hbmFnZWQgcHJvcGVydHkgdGhhdCBpcyAKLSAgICAgICAgICAgICAgICBhIGphdmEudXRpbC5MaXN0LCBvciBhICJtYXAtZW50cmllcyIgbWFwIGZvciBhIG1hbmFnZWQgCi0gICAgICAgICAgICAgICAgcHJvcGVydHkgdGhhdCBpcyBhIGphdmEudXRpbC5NYXAuICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWxpc3QtZW50cmllc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJsaXN0LWVudHJpZXMiIGVsZW1lbnQgcmVwcmVzZW50cyBhIHNldCBvZiBpbml0aWFsaXphdGlvbgotICAgICAgICAgICAgICAgIGVsZW1lbnRzIGZvciBhIG1hbmFnZWQgcHJvcGVydHkgdGhhdCBpcyBhIGphdmEudXRpbC5MaXN0IG9yIGFuCi0gICAgICAgICAgICAgICAgYXJyYXkuICBJbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSAidmFsdWUtY2xhc3MiIGVsZW1lbnQgY2FuIAotICAgICAgICAgICAgICAgIG9wdGlvbmFsbHkgYmUgdXNlZCB0byBkZWNsYXJlIHRoZSBKYXZhIHR5cGUgdG8gd2hpY2ggZWFjaCAKLSAgICAgICAgICAgICAgICB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIGJlZm9yZSBhZGRpbmcgaXQgdG8gdGhlIENvbGxlY3Rpb24uCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctdmFsdWUtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im51bGwtdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbnVsbC12YWx1ZVR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctdmFsdWVUeXBlIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1zeXN0ZW0tZXZlbnQtbGlzdGVuZXJUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlIHByZXNlbmNlIG9mIHRoaXMgZWxlbWVudCB3aXRoaW4gdGhlICJhcHBsaWNhdGlvbiIgZWxlbWVudCBpbgotICAgICAgICAgICAgICAgIGFuIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gcmVzb3VyY2UgZmlsZSBpbmRpY2F0ZXMgdGhlCi0gICAgICAgICAgICAgICAgZGV2ZWxvcGVyIHdhbnRzIHRvIGFkZCBhbiBTeXN0ZW1FdmVudExpc3RlbmVyIHRvIHRoaXMKLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBpbnN0YW5jZS4gIEVsZW1lbnRzIG5lc3RlZCB3aXRoaW4gdGhpcyBlbGVtZW50IGFsbG93Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW5nIHRoZSBraW5kcyBvZiBldmVudHMgdGhhdCB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGUKLSAgICAgICAgICAgICAgICBsaXN0ZW5lciBpbnN0YW5jZSwgYW5kIGFsbG93IHNlbGVjdGluZyB0aGUga2luZHMgb2YgY2xhc3NlcyB0aGF0Ci0gICAgICAgICAgICAgICAgY2FuIGJlIHRoZSBzb3VyY2Ugb2YgZXZlbnRzIHRoYXQgYXJlIGRlbGl2ZXJlZCB0byB0aGUgbGlzdGVuZXIKLSAgICAgICAgICAgICAgICBpbnN0YW5jZS4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzeXN0ZW0tZXZlbnQtbGlzdGVuZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInN5c3RlbS1ldmVudC1saXN0ZW5lci1jbGFzcyIgZWxlbWVudCBjb250YWlucwotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtRXZlbnRMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCB3aGVuIGV2ZW50cyBvZiB0aGUgdHlwZSBzcGVjaWZpZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAic3lzdGVtLWV2ZW50LWNsYXNzIiBhcmUgc2VudCBieSB0aGUgcnVudGltZS4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN5c3RlbS1ldmVudC1jbGFzcyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInN5c3RlbS1ldmVudC1jbGFzcyIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBTeXN0ZW1FdmVudCBzdWJjbGFzcyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGV2ZW50cyB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGUgY2xhc3Mgd2hvc2UgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIGlzIGdpdmVuIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgInN5c3RlbS1ldmVudC1saXN0ZW5lci1jbGFzcyIgZWxlbWVudC4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1jbGFzcyIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJzb3VyY2UtY2xhc3MiIGVsZW1lbnQsIGlmIHByZXNlbnQsIGNvbnRhaW5zIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgd2lsbCBiZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSBmb3IgdGhlIGV2ZW50IHRvIGJlIGRlbGl2ZXJlZCB0byB0aGUgY2xhc3Mgd2hvc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGlzIGdpdmVuIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgInN5c3RlbS1ldmVudC1saXN0ZW5lci1jbGFzcyIgZWxlbWVudC4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy12ZXJzaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoaXMgdHlwZSBjb250YWlucyB0aGUgcmVjb2duaXplZCB2ZXJzaW9ucyBvZgotICAgICAgICAgICAgICAgIGZhY2VzLWNvbmZpZyBzdXBwb3J0ZWQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIuMCIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc3VpY29tcG9uZW50XzJfMC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc3VpY29tcG9uZW50XzJfMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDA2MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXN1aWNvbXBvbmVudF8yXzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLTw/eG1sIHZlcnNpb24gPSAiMS4wIiBlbmNvZGluZyA9ICJVVEYtOCI/PgotCi0KLQotPHhzZDpzY2hlbWEKLSAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICB4bWxuczp4bWw9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMi4wIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgotICAgICAgCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAgIAotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uCi0gICAgICBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUKLSAgICAgICJMaWNlbnNlIikuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgICAgIHRoZSBMaWNlbnNlLiBZb3UgY2FuIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgICAgIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUEwuaHRtbCBvcgotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotICAgICAgTGljZW5zZS4KLSAgICAgIAotICAgICAgV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIKLSAgICAgIE5vdGljZSBpbiBlYWNoIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdAotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAgICAgIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMKLSAgICAgIHByb3ZpZGVkIGJ5IFN1biBpbiB0aGUgR1BMIFZlcnNpb24gMiBzZWN0aW9uIG9mIHRoZSBMaWNlbnNlIGZpbGUKLSAgICAgIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLiAgSWYgYXBwbGljYWJsZSwgYWRkIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFtdCi0gICAgICByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKLSAgICAgICJQb3J0aW9ucyBDb3B5cmlnaHRlZCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSIKLSAgICAgIAotICAgICAgQ29udHJpYnV0b3Iocyk6Ci0gICAgICAKLSAgICAgIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUKLSAgICAgIENEREwgb3Igb25seSB0aGUgR1BMIFZlcnNpb24gMiwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBhZGRpbmcKLSAgICAgICJbQ29udHJpYnV0b3JdIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcwotICAgICAgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwgVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdQotICAgICAgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEgcmVjaXBpZW50IGhhcyB0aGUKLSAgICAgIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZQotICAgICAgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0byBpdHMKLSAgICAgIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMgotICAgICAgY29kZSBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlCi0gICAgICBvcHRpb24gYXBwbGllcyBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaAotICAgICAgb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyLgotICAgICAgCi0gICAgICBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcwotICAgICAgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBDRERMIGxpY2Vuc2UuCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIDwhW0NEQVRBWwotCi0gICAgICAgICAgICBUaGUgWE1MIFNjaGVtYSBmb3IgYSBKYXZhU2VydmVyIEZhY2VzIFVJQ29tcG9uZW50IChWZXJzaW9uIDIuMCkuCi0KLSAgICAgICAgICAgIFRoZSBlbGVtZW50cyBpbiB0aGlzIHNjaGVtYSBtYXkgYmUgdXNlZCBpbiBhbiBYSFRNTCBwYWdlIGZvcgotICAgICAgICAgICAgYSBjb21wb3NpdGUgY29tcG9uZW50LCBieSBwdWxsaW5nIGluIHRoZSBjb21wb3NpdGUgbmFtZXNwYWNlOgotICAgICAgICAgICAgCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgIHhtbG5zOmNvbXBvc2l0ZT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29tcG9zaXRlIj4KLSAgICAgIAotICAgICAgPGNvbXBvc2l0ZTppbnRlcmZhY2U+Ci0gICAgICAgICA8Y29tcG9zaXRlOmF0dHJpYnV0ZSBuYW1lPSJmb28iIGRlZmF1bHQ9ImJhciIgLz4KLSAgICAgIDwvY29tcG9zaXRlOi9pbnRlcmZhY2U+Ci0gICAgICA8IS0tIHRoZSByZXN0IG9taXR0ZWQgLS0+Ci08L2h0bWw+Ci0KLSAgICAgICAgICAgIFRoZSBlbGVtZW50cyBpbiB0aGlzIHNjaGVtYSBtYXkgYWxzbyBiZSB1c2VkIGluIGEgZmFjZWxldCB0YWdsaWJyYXJ5Ci0gICAgICAgICAgICBmaWxlIGluIHRoZSBzYW1lIG1hbm5lcjoKLSAgICAgICAgICAgIAotPGZhY2VsZXQtdGFnbGliIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICAgIHhtbG5zOmNvbXBvc2l0ZT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29tcG9zaXRlIgotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VsZXR0YWdsaWJhcnlfMl8wLnhzZCIKLSAgICAgICAgICAgICAgdmVyc2lvbj0iMi4wIj4KLSAgPG5hbWVzcGFjZT5odHRwOi8vZG9tYWluLmNvbS90ZXN0X3NjaGVtYTwvbmFtZXNwYWNlPgotICA8dGFnPgotICAgIDx0YWctbmFtZT50ZXN0U2NoZW1hPC90YWctbmFtZT4KLSAgICA8Y29tcG9uZW50PgotICAgICAgPGNvbXBvbmVudC10eXBlPmphdmF4LmZhY2VzLklucHV0PC9jb21wb25lbnQtdHlwZT4KLSAgICAgIDxyZW5kZXJlci10eXBlPmphdmF4LmZhY2VzLlRleHQ8L3JlbmRlcmVyLXR5cGU+Ci0gICAgICA8aGFuZGxlci1jbGFzcz5jb20uc3VuLmZhY2VzLmZhY2VsZXRzLnRhZy5qc2YuQ29tcG9uZW50SGFuZGxlcjwvaGFuZGxlci1jbGFzcz4KLSAgICAgIDxjb21wb25lbnQtZXh0ZW5zaW9uPgotCi0gICAgICAgIDxjb21wb3NpdGU6YXR0cmlidXRlIG5hbWU9ImZvbyIgZGVmYXVsdD0iYmFyIiAvPgotCi0gICAgICA8L2NvbXBvbmVudC1leHRlbnNpb24+Ci0gICAgPC9jb21wb25lbnQ+Ci0gIDwvdGFnPgotPC9mYWNlbGV0LXRhZ2xpYj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZAotICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIHVzaW5nIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUKLSAgICAgICAgICAgIGZvciBqYXZhZWUgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotICAgICAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc3VpY29tcG9uZW50XzJfMC54c2QKLQotICAgICAgICAgICAgXV0+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqYXZhZWVfNS54c2QiLz4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lID0gImF0dHJpYnV0ZSIgdHlwZT0iamF2YWVlOnVpY29tcG9uZW50LWF0dHJpYnV0ZVR5cGUiPgotICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVpY29tcG9uZW50LWF0dHJpYnV0ZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImF0dHJpYnV0ZSIgZWxlbWVudCBkZWNsYXJlcyBhbiBhdHRyaWJ1dGUgb2YgdGhpcyAKLSAgICAgICAgICAgICAgICB1aSBjb21wb25lbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIAotICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnVpY29tcG9uZW50LWF0dHJpYnV0ZVR5cGUiLz4KLSAgICAgICAgPC94c2Q6Y2hvaWNlPgotCi0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiLz4KLQotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNwbGF5TmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJvcHRpb25hbCIvPgotCi0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNob3J0RGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZT0ib3B0aW9uYWwiLz4KLQotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IgotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICB1c2U9Im9wdGlvbmFsIi8+Ci0KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLXNpZ25hdHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJvcHRpb25hbCI+Ci0KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPCFbQ0RBVEFbCi0KLQkgICAgUHJvdmlkZXMgdGhlIHNpZ25hdHVyZSBvZiB0aGUgSmF2YSBtZXRob2QuICBUaGUgc3ludGF4IG9mCi0JICAgIHRoZSBtZXRob2Qtc2lnbmF0dXJlIGVsZW1lbnQgaXMgYXMgZm9sbG93cyAodGFrZW4gZnJvbQotCSAgICBmdW5jdGlvbi1zaWduYXR1cmUgaW4gd2ViLWpzcHRhZ2xpYnJhcnlfMl8xLnhzZCk6Ci0KLQkJTWV0aG9kU2lnbmF0dXJlIDo6PSBSZXR1cm5UeXBlIFMgTWV0aG9kTmFtZSBTPwotCQkJCSAgICAgICcoJyBTPyBQYXJhbWV0ZXJzPyBTPyAnKScKLQotICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgICAgIDo6PSBUeXBlCi0KLQkJTWV0aG9kTmFtZSAgICAgICAgOjo9IElkZW50aWZpZXIKLQotCQlQYXJhbWV0ZXJzICAgICAgICA6Oj0gICBQYXJhbWV0ZXIKLQkJCQkgICAgICB8ICggUGFyYW1ldGVyIFM/ICcsJyBTPyBQYXJhbWV0ZXJzICkKLQotICAgICAgICAgICAgICAgIFBhcmFtZXRlciAgICAgICAgIDo6PSBUeXBlCi0KLQkJV2hlcmU6Ci0KLSAJCSAgICAqIFR5cGUgaXMgYSBiYXNpYyB0eXBlIG9yIGEgZnVsbHkgcXVhbGlmaWVkCi0JCSAgICAgIEphdmEgY2xhc3MgbmFtZSAoaW5jbHVkaW5nIHBhY2thZ2UgbmFtZSksCi0JCSAgICAgIGFzIHBlciB0aGUgJ1R5cGUnIHByb2R1Y3Rpb24gaW4gdGhlIEphdmEKLQkJICAgICAgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgU2Vjb25kIEVkaXRpb24sCi0JCSAgICAgIENoYXB0ZXIgMTguCi0KLSAgICAgICAgICAgICAgICAgICAgKiBJZGVudGlmaWVyIGlzIGEgSmF2YSBpZGVudGlmaWVyLCBhcyBwZXIKLQkJICAgICAgdGhlICdJZGVudGlmaWVyJyBwcm9kdWN0aW9uIGluIHRoZSBKYXZhCi0JCSAgICAgIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIFNlY29uZAotCQkgICAgICBFZGl0aW9uLCBDaGFwdGVyIDE4LgotCi0JICAgIEV4YW1wbGU6Ci0KLQkgICAgamF2YS5sYW5nLlN0cmluZyBuaWNrTmFtZSggamF2YS5sYW5nLlN0cmluZywgaW50ICkKLQotICAgICAgICAgICAgICAgIF1dPgotCSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDwveHNkOmF0dHJpYnV0ZT4KLQotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhcHBseVRvIgotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICB1c2U9Im9wdGlvbmFsIi8+Ci0KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICB1c2U9Im9wdGlvbmFsIi8+Ci0KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlZmVycmVkIgotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJvcHRpb25hbCIvPgotCi0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4cGVydCIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZT0ib3B0aW9uYWwiLz4KLQotICAgICAgICAKLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZnJhZ21lbnRfM18wLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWZyYWdtZW50XzNfMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZDQyMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZnJhZ21lbnRfM18wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgICAgICAgIHZlcnNpb249IjMuMCI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0gICAgICAKLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICAgCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24KLSAgICAgIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZQotICAgICAgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICAgdGhlIExpY2Vuc2UuIFlvdSBjYW4gb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sIG9yCi0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0gICAgICBMaWNlbnNlLgotICAgICAgCi0gICAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlcgotICAgICAgTm90aWNlIGluIGVhY2ggZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0Ci0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICAgICAgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcwotICAgICAgcHJvdmlkZWQgYnkgU3VuIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UgZmlsZQotICAgICAgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZwotICAgICAgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10KLSAgICAgIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICAgIlBvcnRpb25zIENvcHlyaWdodGVkIFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotICAgICAgCi0gICAgICBDb250cmlidXRvcihzKToKLSAgICAgIAotICAgICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZQotICAgICAgQ0RETCBvciBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZwotICAgICAgIltDb250cmlidXRvcl0gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTCBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91Ci0gICAgICBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYSByZWNpcGllbnQgaGFzIHRoZQotICAgICAgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlCi0gICAgICBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvIGl0cwotICAgICAgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyCi0gICAgICBjb2RlIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUKLSAgICAgIG9wdGlvbiBhcHBsaWVzIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoCi0gICAgICBvcHRpb24gYnkgdGhlIGNvcHlyaWdodCBob2xkZXIuCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVtbCi0gICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgU2VydmxldCAzLjAgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotICAgICAgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkICJNRVRBLUlORi93ZWItZnJhZ21lbnQueG1sIgotICAgICAgaW4gdGhlIHdlYiBmcmFnbWVudCdzIGphciBmaWxlLiAgQWxsIFNlcnZsZXQgZGVwbG95bWVudCBkZXNjcmlwdG9ycwotICAgICAgbXVzdCBpbmRpY2F0ZSB0aGUgd2ViIGFwcGxpY2F0aW9uIHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRQotICAgICAgbmFtZXNwYWNlOgotICAgICAgCi0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgCi0gICAgICAKLSAgICAgIGFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkgCi0gICAgICB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OiAKLSAgICAgIAotICAgICAgPHdlYi1mcmFnbWVudCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iLi4uIgotICAgICAgdmVyc2lvbj0iMy4wIj4gCi0gICAgICAuLi4KLSAgICAgIDwvd2ViLWZyYWdtZW50PgotICAgICAgCi0gICAgICBUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLSAgICAgIHRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIEphdmEgRUUKLSAgICAgIG5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0gICAgICAKLSAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZnJhZ21lbnRfM18wLnhzZAotICAgICAgCi0gICAgICBdXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLSAgICAgIAotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotICAgICAgc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICAgICAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotICAgICAgc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAgICAgIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gICAgICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgICAgIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249IndlYi1jb21tb25fM18wLnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLWZyYWdtZW50IgotICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOndlYi1mcmFnbWVudFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgd2ViLWZyYWdtZW50IGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQKLSAgICAgICAgZGVzY3JpcHRvciBmb3IgYSB3ZWIgZnJhZ21lbnQuICBOb3RlIHRoYXQgdGhlIHN1Yi1lbGVtZW50cwotICAgICAgICBvZiB0aGlzIGVsZW1lbnQgY2FuIGJlIGluIHRoZSBhcmJpdHJhcnkgb3JkZXIuIEJlY2F1c2Ugb2YKLSAgICAgICAgdGhhdCwgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgZWxlbWVudHMgb2YgZGlzdHJpYnV0YWJsZSwKLSAgICAgICAgc2Vzc2lvbi1jb25maWcsIHdlbGNvbWUtZmlsZS1saXN0LCBqc3AtY29uZmlnLCBsb2dpbi1jb25maWcsCi0gICAgICAgIGFuZCBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IHdhcyBjaGFuZ2VkIGZyb20gIj8iIHRvICIqIgotICAgICAgICBpbiB0aGlzIHNjaGVtYS4gIEhvd2V2ZXIsIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaW5zdGFuY2UKLSAgICAgICAgZmlsZSBtdXN0IG5vdCBjb250YWluIG11bHRpcGxlIGVsZW1lbnRzIG9mIHNlc3Npb24tY29uZmlnLAotICAgICAgICBqc3AtY29uZmlnLCBhbmQgbG9naW4tY29uZmlnLiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cyBvZgotICAgICAgICB3ZWxjb21lLWZpbGUtbGlzdCBvciBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0LCB0aGUgY29udGFpbmVyCi0gICAgICAgIG11c3QgY29uY2F0ZW5hdGUgdGhlIGVsZW1lbnQgY29udGVudHMuICBUaGUgbXVsdGlwbGUgb2NjdXJlbmNlCi0gICAgICAgIG9mIHRoZSBlbGVtZW50IGRpc3RyaWJ1dGFibGUgaXMgcmVkdW5kYW50IGFuZCB0aGUgY29udGFpbmVyCi0gICAgICAgIHRyZWF0cyB0aGF0IGNhc2UgZXhhY3RseSBpbiB0aGUgc2FtZSB3YXkgd2hlbiB0aGVyZSBpcyBvbmx5Ci0gICAgICAgIG9uZSBkaXN0cmlidXRhYmxlLiAKLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWNvbW1vbi1zZXJ2bGV0LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBzZXJ2bGV0IGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZXJ2bGV0LgotICAgICAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpzZXJ2bGV0Ii8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6c2VydmxldC1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1jb21tb24tZmlsdGVyLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBmaWx0ZXIgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbHRlci4KLSAgICAgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZmlsdGVyIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6ZmlsdGVyLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWNvbW1vbi1lamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSBlamItbG9jYWwtcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLSAgICAgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSB3ZWIKLSAgICAgICAgICBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLSAgICAgICAgICB0aGUgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgIAotICAgICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLWxvY2FsLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItY29tbW9uLWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotICAgICAgICAgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIHdlYgotICAgICAgICAgIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotICAgICAgICAgIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgICAgCi0gICAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1jb21tb24tcmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZgotICAgICAgICAgIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0gICAgICAgICAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gY29kZS4KLSAgICAgICAgICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudgotICAgICAgICAgIGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItY29tbW9uLW1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZgotICAgICAgICAgIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUKLSAgICAgICAgICBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlLgotICAgICAgICAgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52Ci0gICAgICAgICAgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgIAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWNvbW1vbi1yZXMtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotICAgICAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0gICAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLSAgICAgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgICAgCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnJlcy1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItY29tbW9uLWVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHdlYgotICAgICAgICAgIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLSAgICAgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZQotICAgICAgICAgIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5Ii8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5LW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPHhzZDprZXkgbmFtZT0id2ViLWNvbW1vbi1yb2xlLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgQSByb2xlLW5hbWUta2V5IGlzIHNwZWNpZmllZCB0byBhbGxvdyB0aGUgcmVmZXJlbmNlcwotICAgICAgICAgIGZyb20gdGhlIHNlY3VyaXR5LXJvbGUtcmVmcy4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6c2VjdXJpdHktcm9sZSIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnJvbGUtbmFtZSIvPgotICAgIDwveHNkOmtleT4KLSAgICA8eHNkOmtleXJlZiBuYW1lPSJ3ZWItY29tbW9uLXJvbGUtbmFtZS1yZWZlcmVuY2VzIgotICAgICAgICAgICAgICAgIHJlZmVyPSJqYXZhZWU6d2ViLWNvbW1vbi1yb2xlLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIGtleXJlZiBpbmRpY2F0ZXMgdGhlIHJlZmVyZW5jZXMgZnJvbQotICAgICAgICAgIHNlY3VyaXR5LXJvbGUtcmVmIHRvIGEgc3BlY2lmaWVkIHJvbGUtbmFtZS4KLSAgICAgICAgICAKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6c2VydmxldC9qYXZhZWU6c2VjdXJpdHktcm9sZS1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpyb2xlLWxpbmsiLz4KLSAgICA8L3hzZDprZXlyZWY+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMV8xLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMV8xLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjOGU4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMS5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotPCEtLQotQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiA5MDEgU2FuIEFudG9uaW8gUm9hZCwKLVBhbG8gQWx0bywgQ0EgIDk0MzAzLCBVLlMuQS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gCi1UaGlzIHByb2R1Y3Qgb3IgZG9jdW1lbnQgaXMgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBhbmQgZGlzdHJpYnV0ZWQKLXVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIGl0cyB1c2UsIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiwgYW5kCi1kZWNvbXBpbGF0aW9uLiAgTm8gcGFydCBvZiB0aGlzIHByb2R1Y3Qgb3IgZG9jdW1lbnRhdGlvbiBtYXkgYmUKLXJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uCi1vZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4gIAotCi1UaGlyZCBwYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMgY29weXJpZ2h0ZWQgYW5kIAotbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLiAKLQotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIExvZ28sIFNvbGFyaXMsIEphdmEsIEphdmFTZXJ2ZXIgUGFnZXMsIEphdmEgCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsIEpEQkMsIEpESywgSmF2YU1haWwgYW5kIEVudGVycHJpc2UgSmF2YUJlYW5zLCAKLWFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMgaW4gdGhlIFUuUy4gCi1hbmQgb3RoZXIgY291bnRyaWVzLgotCi1BbGwgU1BBUkMgdHJhZGVtYXJrcyBhcmUgdXNlZCB1bmRlciBsaWNlbnNlIGFuZCBhcmUgdHJhZGVtYXJrcwotb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFNQQVJDIEludGVybmF0aW9uYWwsIEluYy4KLWluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuIFByb2R1Y3RzIGJlYXJpbmcgU1BBUkMKLXRyYWRlbWFya3MgYXJlIGJhc2VkIHVwb24gYW4gYXJjaGl0ZWN0dXJlIGRldmVsb3BlZCBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIAotCi1Qb3N0U2NyaXB0IGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcywgSW5jLiAKLQotIAotRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzIFN1YmplY3QgdG8gCi1TdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0KLSAKLURPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQUxMIEVYUFJFU1MgT1IgSU1QTElFRAotQ09ORElUSU9OUywgUkVQUkVTRU5UQVRJT05TIEFORCBXQVJSQU5USUVTLCBJTkNMVURJTkcgQU5ZCi1JTVBMSUVEIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFIE9SIE5PTi1JTkZSSU5HRU1FTlQsIEFSRSBESVNDTEFJTUVELCBFWENFUFQKLVRPIFRIRSBFWFRFTlQgVEhBVCBTVUNIIERJU0NMQUlNRVJTIEFSRSBIRUxEIFRPIEJFIExFR0FMTFkKLUlOVkFMSUQuCi0KLV9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLUNvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIAotOTAxIFNhbiBBbnRvbmlvIFJvYWQsIFBhbG8gQWx0bywgQ0EgIDk0MzAzLCBFdGF0cy1VbmlzLiAKLVRvdXMgZHJvaXRzIHJlJ3NlcnZlJ3MuCi0gCi0KLUNlIHByb2R1aXQgb3UgZG9jdW1lbnQgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IGV0IGRpc3RyaWJ1ZScgYXZlYyAKLWRlcyBsaWNlbmNlcyBxdWkgZW4gcmVzdHJlaWduZW50IGwndXRpbGlzYXRpb24sIGxhIGNvcGllLCBsYSBkaXN0cmlidXRpb24sCi1ldCBsYSBkZSdjb21waWxhdGlvbi4gIEF1Y3VuZSBwYXJ0aWUgZGUgY2UgcHJvZHVpdCBvdSBkZSBzYSBkb2N1bWVudGF0aW9uCi1hc3NvY2llJ2UgbmUgcGV1dCBlXnRyZSByZXByb2R1aXRlIHNvdXMgYXVjdW5lIGZvcm1lLCBwYXIgcXVlbHF1ZSBtb3llbiAKLXF1ZSBjZSBzb2l0LCBzYW5zIGwnYXV0b3Jpc2F0aW9uIHByZSdhbGFibGUgZXQgZSdjcml0ZSBkZSBTdW4gZXQgZGUgc2VzIAotYmFpbGxldXJzIGRlIGxpY2VuY2UsIHMnaWwgeSBlbiBhLiAgCi0KLUxlIGxvZ2ljaWVsIGRlJ3RlbnUgcGFyIGRlcyB0aWVycywgZXQgcXVpIGNvbXByZW5kIGxhIHRlY2hub2xvZ2llIAotcmVsYXRpdmUgYXV4IHBvbGljZXMgZGUgY2FyYWN0ZWByZXMsIGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCAKLWV0IGxpY2VuY2llJyBwYXIgZGVzIGZvdXJuaXNzZXVycyBkZSBTdW4uCi0gCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIGxlIGxvZ28gU3VuLCBTb2xhcmlzLCBKYXZhLCBKYXZhU2VydmVyIFBhZ2VzLCBKYXZhIAotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCBKREJDLCBKREssIEphdmFNYWlsLCBldCBFbnRlcnByaXNlIEphdmFCZWFucywgIAotc29udCBkZXMgbWFycXVlcyBkZSBmYWJyaXF1ZSBvdSBkZXMgbWFycXVlcyBkZSdwb3NlJ2VzIGRlIFN1biAKLU1pY3Jvc3lzdGVtcywgSW5jLiBhdXggRXRhdHMtVW5pcyBldCBkYW5zIGQnYXV0cmVzIHBheXMuCi0gCi1Ub3V0ZXMgbGVzIG1hcnF1ZXMgU1BBUkMgc29udCB1dGlsaXNlJ2VzIHNvdXMgbGljZW5jZSBldCBzb250Ci1kZXMgbWFycXVlcyBkZSBmYWJyaXF1ZSBvdSBkZXMgbWFycXVlcyBkZSdwb3NlJ2VzIGRlIFNQQVJDCi1JbnRlcm5hdGlvbmFsLCBJbmMuIGF1eCBFdGF0cy1VbmlzIGV0ICBkYW5zCi1kJ2F1dHJlcyBwYXlzLiBMZXMgcHJvZHVpdHMgcG9ydGFudCBsZXMgbWFycXVlcyBTUEFSQyBzb250Ci1iYXNlJ3Mgc3VyIHVuZSBhcmNoaXRlY3R1cmUgZGUndmVsb3BwZSdlIHBhciBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICAKLQotUG9zdGNyaXB0IGVzdCB1bmUgbWFycXVlIGVucmVnaXN0cmUnZSBkJ0Fkb2JlIFN5c3RlbXMgSW5jLiAKLSAKLUxBIERPQ1VNRU5UQVRJT04gRVNUIEZPVVJOSUUgIkVOIEwnRVRBVCIgRVQgVE9VVEVTIEFVVFJFUyBDT05ESVRJT05TLAotREVDTEFSQVRJT05TIEVUIEdBUkFOVElFUyBFWFBSRVNTRVMgT1UgVEFDSVRFUyBTT05UIEZPUk1FTExFTUVOVCBFWENMVUVTLAotREFOUyBMQSBNRVNVUkUgQVVUT1JJU0VFIFBBUiBMQSBMT0kgQVBQTElDQUJMRSwgWSBDT01QUklTIE5PVEFNTUVOVAotVE9VVEUgR0FSQU5USUUgSU1QTElDSVRFIFJFTEFUSVZFIEEgTEEgUVVBTElURSBNQVJDSEFOREUsIEEgTCdBUFRJVFVERQotQSBVTkUgVVRJTElTQVRJT04gUEFSVElDVUxJRVJFIE9VIEEgTCdBQlNFTkNFIERFIENPTlRSRUZBQ09OLgotLS0+Ci0KLTwhLS0KLQotICAgVGhpcyBpcyB0aGUgRFREIGRlZmluaW5nIHRoZSBKYXZhU2VydmVyIFBhZ2VzIDEuMSBUYWcgTGlicmFyeQotICAgZGVzY3JpcHRvciAoLnRsZCkgKFhNTCkgZmlsZSBmb3JtYXQvc3ludGF4LgotCi0gICBBIFRhZyBMaWJyYXJ5IGlzIGEgSkFSIGZpbGUgY29udGFpbmluZyBhIHZhbGlkIGluc3RhbmNlIG9mIGEgVGFnIExpYnJhcnkKLSAgIERlc2NyaXB0b3IgKHRhZ2xpYi50bGQpIGZpbGUgaW4gdGhlIE1FVEEtSU5GIHN1YmRpcmVjdG9yeSwgYWxvbmcgd2l0aCB0aGUKLSAgIGFwcHJvcHJpYXRlIGltcGxlbWVudGluZyBjbGFzc2VzLCBhbmQgb3RoZXIgcmVzb3VyY2VzIHJlcXVpcmVkIHRvCi0gICBpbXBsZW1lbnQgdGhlIHRhZ3MgZGVmaW5lZCB0aGVyZWluLgotCi0gIC0tPgotCi08IS0tCi1UaGUgdGFnbGliIHRhZyBpcyB0aGUgZG9jdW1lbnQgcm9vdCwgaXQgZGVmaW5lczoKLQotdGxpYnZlcnNpb24JdGhlIHZlcnNpb24gb2YgdGhlIHRhZyBsaWJyYXJ5IGltcGxlbWVudGF0aW9uCi1qc3B2ZXJzaW9uCXRoZSB2ZXJzaW9uIG9mIEpTUCB0aGUgdGFnIGxpYnJhcnkgZGVwZW5kcyB1cG9uCi0KLXNob3J0bmFtZQlhIHNpbXBsZSBkZWZhdWx0IHNob3J0IG5hbWUgdGhhdCBjb3VsZCBiZSB1c2VkIGJ5Ci0JCWEgSlNQIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZSBuYW1lcyB3aXRoIGEgbW5lbW9uaWMKLQkJdmFsdWU7IGZvciBleGFtcGxlLCB0aGUgaXQgbWF5IGJlIHVzZWQgYXMgdGhlIHByZWZlcmVkCi0JCXByZWZpeCB2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcwotdXJpCQlhIHVyaSB1bmlxdWVseSBpZGVudGlmeWluZyB0aGlzIHRhZ2xpYgotaW5mbwkJYSBzaW1wbGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlICJ1c2UiIG9mIHRoaXMgdGFnbGliLAotCQlzaG91bGQgYmUgdXNlciBkaXNjZXJuYWJsZQotLS0+Ci0KLTwhRUxFTUVOVCB0YWdsaWIgKHRsaWJ2ZXJzaW9uLCBqc3B2ZXJzaW9uPywgc2hvcnRuYW1lLCB1cmk/LCBpbmZvPywgdGFnKykgPgotPCFBVFRMSVNUIHRhZ2xpYiBpZCBJRCAjSU1QTElFRAotCSAgeG1sbnMgQ0RBVEEgI0ZJWEVECi0JCSJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy93ZWItanNwdGFnbGlicmFyeV8xXzEuZHRkIgotPgotCi08IS0tCi1EZXNjcmliZXMgdGhpcyB2ZXJzaW9uIChudW1iZXIpIG9mIHRoZSB0YWdsaWJyYXJ5IChkZXdleSBkZWNpbWFsKQotCi0jUENEQVRBIDo6PSBbMC05XSp7ICIuIlswLTldIH0wLi4zCi0tLT4KLQotPCFFTEVNRU5UIHRsaWJ2ZXJzaW9uICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlc2NyaWJlcyB0aGUgSlNQIHZlcnNpb24gKG51bWJlcikgdGhpcyB0YWdsaWJyYXJ5IHJlcXVpcmVzIGluCi1vcmRlciB0byBmdW5jdGlvbiAoZGV3ZXkgZGVjaW1hbCkKLQotVGhlIGRlZmF1bHQgaXMgMS4xCi0KLSNQQ0RBVEEgOjo9IFswLTldKnsgIi4iWzAtOV0gfTAuLjMKLS0tPgotCi08IUVMRU1FTlQganNwdmVyc2lvbiAgKCNQQ0RBVEEpID4KLQotPCEtLQotRGVmaW5lcyBhIHNob3J0IChkZWZhdWx0KSBzaG9ydG5hbWUgdG8gYmUgdXNlZCBmb3IgdGFncyBhbmQKLXZhcmlhYmxlIG5hbWVzIHVzZWQvY3JlYXRlZCBieSB0aGlzIHRhZyBsaWJyYXJ5LiAgRG8gbm90IHVzZQotd2hpdGUgc3BhY2UsIGFuZCBkbyBub3Qgc3RhcnQgd2l0aCBkaWdpdHMgb3IgdW5kZXJzY29yZS4KLQotI1BDREFUQSA6Oj0gTk1UT0tFTgotLS0+Ci0KLTwhRUxFTUVOVCBzaG9ydG5hbWUgICAgICAoI1BDREFUQSkgPgotCi08IS0tCi1EZWZpbmVzIGEgcHVibGljIFVSSSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyB2ZXJzaW9uIG9mCi10aGUgdGFnbGlicmFyeSBMZWF2ZSBpdCBlbXB0eSBpZiBpdCBkb2VzIG5vdCBhcHBseS4KLS0tPgotCi08IUVMRU1FTlQgdXJpCSAoI1BDREFUQSkgPgotCi08IS0tCi1EZWZpbmVzIGFuIGFyYml0cmFyeSB0ZXh0IHN0cmluZyBkZXNjaXJiaW5nIHRoZSB0YWcgbGlicmFyeQotLS0+Ci0KLTwhRUxFTUVOVCBpbmZvCSgjUENEQVRBKSA+Ci0KLTwhLS0KLVRoZSB0YWcgZGVmaW5lcyBhIHVuaXF1ZSB0YWcgaW4gdGhpcyB0YWcgbGlicmFyeSwgZGVmaW5pbmc6Ci0KLS0gdGhlIHVuaXF1ZSB0YWcvZWxlbWVudCBuYW1lCi0tIHRoZSBzdWJjbGFzcyBvZiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnIGltcGxlbWVudGF0aW9uIGNsYXNzCi0tIGFuIG9wdGlvbmFsIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8KLS0gdGhlIGJvZHkgY29udGVudCB0eXBlIChoaW50KQotLSBvcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KLS0gYW55IGF0dHJpYnV0ZXMKLS0tPgotCi08IUVMRU1FTlQgdGFnIChuYW1lLCB0YWdjbGFzcywgdGVpY2xhc3M/LCBib2R5Y29udGVudD8sIGluZm8/LCBhdHRyaWJ1dGUqKSA+Ci0KLTwhLS0KLURlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcmx2ZXQuanNwLnRhZ2V4dC5UYWcgdGhhdCBpbXBsZW1lbnRzCi10aGUgcmVxdWVzdCB0aW1lIHNlbWFudGljcyBmb3IgdGhpcyB0YWcuIChyZXF1aXJlZCkKLQotI1BDREFUQSA6Oj0gZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQotLS0+Ci0KLTwhRUxFTUVOVCB0YWdjbGFzcyAoI1BDREFUQSkgPgotCi08IS0tCi1EZWZpbmVzIHRoZSBzdWJjbGFzcyBvZiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvIGZvcgotdGhpcyB0YWcuIChvcHRpb25hbCkKLQotSWYgdGhpcyBpcyBub3QgZ2l2ZW4sIHRoZSBjbGFzcyBpcyBub3QgY29uc3VsdGVkIGF0IHRyYW5zbGF0aW9uIHRpbWUuCi0KLSNQQ0RBVEEgOjo9IGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUKLS0tPgotCi08IUVMRU1FTlQgdGVpY2xhc3MgKCNQQ0RBVEEpID4KLQotPCEtLQotUHJvdmlkZXMgYSBoaW50IGFzIHRvIHRoZSBjb250ZW50IG9mIHRoZSBib2R5IG9mIHRoaXMgdGFnLiBQcmltYXJpbHkKLWludGVuZGVkIGZvciB1c2UgYnkgcGFnZSBjb21wb3NpdGlvbiB0b29scy4KLQotVGhlcmUgYXJlIGN1cnJlbnRseSB0aHJlZSB2YWx1ZXMgc3BlY2lmaWVkOgotCi10YWdkZXBlbmRlbnQJVGhlIGJvZHkgb2YgdGhlIHRhZyBpcyBpbnRlcnByZXRlZCBieSB0aGUgdGFnCi0JCWltcGxlbWVudGF0aW9uIGl0c2VsZiwgYW5kIGlzIG1vc3QgbGlrZWx5IGluIGEKLQkJZGlmZmVyZW50ICJsYW5nYWdlIiwgZS5nIGVtYmVkZGVkIFNRTCBzdGF0ZW1lbnRzLgotCi1KU1AJCVRoZSBib2R5IG9mIHRoZSB0YWcgY29udGFpbnMgbmVzdGVkIEpTUCBzeW50YXgKLQotZW1wdHkJCVRoZSBib2R5IG11c3QgYmUgZW1wdHkKLQotVGhlIGRlZmF1bHQgKGlmIG5vdCBkZWZpbmVkKSBpcyBKU1AKLQotI1BDREFUQSA6Oj0gIHRhZ2RlcGVuZGVudCB8IEpTUCB8IGVtcHR5Ci0KLS0tPgotCi08IUVMRU1FTlQgYm9keWNvbnRlbnQgKCNQQ0RBVEEpID4KLQotPCEtLQotVGhlIGF0dHJpYnV0ZSB0YWcgZGVmaW5lcyBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBuZXN0aW5nIHRhZwotCi1BbiBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBpcyBjb21wb3NlZCBvZjoKLQotLSB0aGUgYXR0cmlidXRlcyBuYW1lIChyZXF1aXJlZCkKLS0gaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvciBvcHRpb25hbCAob3B0aW9uYWwpCi0tIGlmIHRoZSBhdHRyaWJ1dGVzIHZhbHVlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkIGF0IHJ1bnRpbWUKLSAgYnkgYSBzY3JpcHRsZXQgZXhwcmVzc2lvbiAob3B0aW9uYWwpCi0KLS0tPgotCi08IUVMRU1FTlQgYXR0cmlidXRlIChuYW1lLCByZXF1aXJlZD8gLCBydGV4cHJ2YWx1ZT8pID4KLQotPCEtLQotRGVmaW5lcyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgYSB0YWcgb3IgYXR0cmlidXRlIGJlaW5nIGRlZmluZWQKLQotI1BDREFUQSA6Oj0gTk1UT0tFTgotLS0+Ci0KLTwhRUxFTUVOVCBuYW1lCSgjUENEQVRBKSA+Ci0KLTwhLS0KLURlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsLgotCi0jUENEQVRBIDo6PSB0cnVlIHwgZmFsc2UgfCB5ZXMgfCBubwotCi1JZiBub3QgcHJlc2VudCB0aGVuIHRoZSBkZWZhdWx0IGlzICJmYWxzZSIsIGkuZSB0aGUgYXR0cmlidXRlCi1pcyBvcHRpb25hbC4KLS0tPgotCi08IUVMRU1FTlQgcmVxdWlyZWQgICAgKCNQQ0RBVEEpID4KLQotPCEtLQotRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgY2FuIGhhdmUgc2NyaXB0bGV0IGV4cHJlc3Npb25zIGFzCi1hIHZhbHVlLCBpLmUgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQKLWF0IHJlcXVlc3QgdGltZSwgYXMgb3Bwb3NlZCB0byBhIHN0YXRpYyB2YWx1ZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9uCi10aW1lLgotCi0jUENEQVRBIDo6PSB0cnVlIHwgZmFsc2UgfCB5ZXMgfCBubwotCi1JZiBub3QgcHJlc2VudCB0aGVuIHRoZSBkZWZhdWx0IGlzICJmYWxzZSIsIGkuZSB0aGUgYXR0cmlidXRlCi1oYXMgYSBzdGF0aWMgdmFsdWUKLS0tPgotCi08IUVMRU1FTlQgcnRleHBydmFsdWUgKCNQQ0RBVEEpID4KLQotPCFBVFRMSVNUIHRsaWJ2ZXJzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGpzcHZlcnNpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2hvcnRuYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHVyaSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBpbmZvIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRhZyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0YWdjbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0ZWljbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBib2R5Y29udGVudCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhdHRyaWJ1dGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXF1aXJlZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBydGV4cHJ2YWx1ZSBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAyZWI1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotCi08IS0tCi0gICBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcy4KLSAgLS0+Ci0KLTwhLS0KLQotICAgVGhpcyBpcyB0aGUgRFREIGRlZmluaW5nIHRoZSBKYXZhU2VydmVyIFBhZ2VzIDEuMiBUYWcgTGlicmFyeQotICAgZGVzY3JpcHRvciAoLnRsZCkgKFhNTCkgZmlsZSBmb3JtYXQvc3ludGF4LgotCi0gICBBIFRhZyBMaWJyYXJ5IGlzIGEgSkFSIGZpbGUgY29udGFpbmluZyBhIHZhbGlkIGluc3RhbmNlIG9mIGEgVGFnIExpYnJhcnkKLSAgIERlc2NyaXB0b3IgKHRhZ2xpYi50bGQpIGZpbGUgaW4gdGhlIE1FVEEtSU5GIHN1YmRpcmVjdG9yeSwgYWxvbmcgd2l0aCB0aGUKLSAgIGFwcHJvcHJpYXRlIGltcGxlbWVudGluZyBjbGFzc2VzLCBhbmQgb3RoZXIgcmVzb3VyY2VzIHJlcXVpcmVkIHRvCi0gICBpbXBsZW1lbnQgdGhlIHRhZ3MgZGVmaW5lZCB0aGVyZWluLgotCi0gICBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zLgotICAtLT4KLSAgCi08IU5PVEFUSU9OIFdFQi1KU1BUQUdMSUIuMV8yIFBVQkxJQwotICAgICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSlNQIFRhZyBMaWJyYXJ5IDEuMi8vRU4iPgotCi08IS0tCi1UaGlzIGlzIHRoZSBYTUwgRFREIGZvciB0aGUgSlNQIDEuMiBUYWcgTGlicmFyeSBEZXNjcmlwdG9yLgotQWxsIEpTUCAxLjIgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcnMgbXVzdCBpbmNsdWRlIGEgRE9DVFlQRQotb2YgdGhlIGZvbGxvd2luZyBmb3JtOgotCi0gIDwhRE9DVFlQRSB0YWdsaWIKLSAgICAgICAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSlNQIFRhZyBMaWJyYXJ5IDEuMi8vRU4iCi0JImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQiPgotCi0tLT4KLQotPCEtLQotVGhlIHRhZ2xpYiB0YWcgaXMgdGhlIGRvY3VtZW50IHJvb3QsIGl0IGRlZmluZXM6Ci0KLXRsaWItdmVyc2lvbgl0aGUgdmVyc2lvbiBvZiB0aGUgdGFnIGxpYnJhcnkgaW1wbGVtZW50YXRpb24KLQotanNwLXZlcnNpb24JdGhlIHZlcnNpb24gb2YgSlNQIHRoZSB0YWcgbGlicmFyeSBkZXBlbmRzIHVwb24KLQotc2hvcnQtbmFtZQlhIHNpbXBsZSBkZWZhdWx0IHNob3J0IG5hbWUgdGhhdCBjb3VsZCBiZSB1c2VkIGJ5Ci0JCWEgSlNQIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZSBuYW1lcyB3aXRoIGEgbW5lbW9uaWMKLQkJdmFsdWU7IGZvciBleGFtcGxlLCB0aGUgaXQgbWF5IGJlIHVzZWQgYXMgdGhlIHByZWZlcmVkCi0JCXByZWZpeCB2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcwotCi11cmkJCWEgdXJpIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoaXMgdGFnbGliCi0KLWRpc3BsYXktbmFtZSAgICB0aGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQKLSAgICAgICAgICAgICAgICBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMKLXNtYWxsLWljb24gICAgICBvcHRpb25hbCBzbWFsbC1pY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKLQotbGFyZ2UtaWNvbiAgICAgIG9wdGlvbmFsIGxhcmdlLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotCi1kZXNjcmlwdGlvbglhIHNpbXBsZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgInVzZSIgb2YgdGhpcyB0YWdsaWIsCi0JCXNob3VsZCBiZSB1c2VyIGRpc2Nlcm5hYmxlCi0KLXZhbGlkYXRvciAgICAgICBvcHRpb25hbCBUYWdMaWJyYXJ5VmFsaWRhdG9yIGluZm9ybWF0aW9uCi0KLWxpc3RlbmVyICAgICAgICBvcHRpb25hbCBldmVudCBsaXN0ZW5lciBzcGVjaWZpY2F0aW9uCi0KLQotLS0+Ci0KLTwhRUxFTUVOVCB0YWdsaWIgKHRsaWItdmVyc2lvbiwganNwLXZlcnNpb24sIHNob3J0LW5hbWUsIHVyaT8sCi0gICAgICAgICAgICAgICAgICBkaXNwbGF5LW5hbWU/LCBzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8sIGRlc2NyaXB0aW9uPywKLSAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcj8sIGxpc3RlbmVyKiwgdGFnKykgPgotCi08IUFUVExJU1QgdGFnbGliIGlkIElEICNJTVBMSUVECi0JICB4bWxucyBDREFUQSAjRklYRUQKLQkJImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1RhZ0xpYnJhcnlEZXNjcmlwdG9yIgotPgotCi08IS0tCi1EZXNjcmliZXMgdGhpcyB2ZXJzaW9uIChudW1iZXIpIG9mIHRoZSB0YWdsaWJyYXJ5IChkZXdleSBkZWNpbWFsKQotCi0jUENEQVRBIDo6PSBbMC05XSp7ICIuIlswLTldIH0wLi4zCi0tLT4KLQotPCFFTEVNRU5UIHRsaWItdmVyc2lvbiAoI1BDREFUQSkgPgotCi08IS0tCi1EZXNjcmliZXMgdGhlIEpTUCB2ZXJzaW9uIChudW1iZXIpIHRoaXMgdGFnbGlicmFyeSByZXF1aXJlcyBpbgotb3JkZXIgdG8gZnVuY3Rpb24gKGRld2V5IGRlY2ltYWwpCi0KLVRoZSBkZWZhdWx0IGlzIDEuMgotCi0jUENEQVRBIDo6PSBbMC05XSp7ICIuIlswLTldIH0wLi4zCi0tLT4KLQotPCFFTEVNRU5UIGpzcC12ZXJzaW9uICAoI1BDREFUQSkgPgotCi08IS0tCi1EZWZpbmVzIGEgc2hvcnQgKGRlZmF1bHQpIHNob3J0LW5hbWUgdG8gYmUgdXNlZCBmb3IgdGFncyBhbmQKLXZhcmlhYmxlIG5hbWVzIHVzZWQvY3JlYXRlZCBieSB0aGlzIHRhZyBsaWJyYXJ5LiAgRG8gbm90IHVzZQotd2hpdGUgc3BhY2UsIGFuZCBkbyBub3Qgc3RhcnQgd2l0aCBkaWdpdHMgb3IgdW5kZXJzY29yZS4KLQotI1BDREFUQSA6Oj0gTk1UT0tFTgotLS0+Ci0KLTwhRUxFTUVOVCBzaG9ydC1uYW1lICAgICAgKCNQQ0RBVEEpID4KLQotPCEtLQotRGVmaW5lcyBhIHB1YmxpYyBVUkkgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgdmVyc2lvbiBvZgotdGhlIHRhZ2xpYnJhcnkuICBMZWF2ZSBpdCBlbXB0eSBpZiBpdCBkb2VzIG5vdCBhcHBseS4KLS0tPgotCi08IUVMRU1FTlQgdXJpCSAoI1BDREFUQSkgPgotCi08IS0tCi1EZWZpbmVzIGFuIGFyYml0cmFyeSB0ZXh0IHN0cmluZyBkZXNjaXJiaW5nIHRoZSB0YWcgbGlicmFyeQotLS0+Ci0KLTwhRUxFTUVOVCBkZXNjcmlwdGlvbgkoI1BDREFUQSkgPgotCi08IS0tCi0KLURlZmluZXMgYW4gb3B0aW9uYWwgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8KLXZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkuCi0tLT4KLQotPCFFTEVNRU5UIHZhbGlkYXRvciAodmFsaWRhdG9yLWNsYXNzLCBpbml0LXBhcmFtKiwgZGVzY3JpcHRpb24/KSA+Ci0KLQotPCEtLQotCi1EZWZpbmVzIHRoZSBUYWdMaWJyYXJ5VmFsaWRhdG9yIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8KLXZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkuCi0tLT4KLQotPCFFTEVNRU5UIHZhbGlkYXRvci1jbGFzcyAoI1BDREFUQSkgPgotCi0KLTwhLS0KLQotVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcyBhbgotaW5pdGlhbGl6YXRpb24gcGFyYW0KLS0tPgotCi08IUVMRU1FTlQgaW5pdC1wYXJhbSAocGFyYW0tbmFtZSwgcGFyYW0tdmFsdWUsIGRlc2NyaXB0aW9uPyk+Ci0KLTwhLS0KLQotVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4KLS0tPgotCi08IUVMRU1FTlQgcGFyYW0tbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLQotVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLgotLS0+Ci0KLTwhRUxFTUVOVCBwYXJhbS12YWx1ZSAoI1BDREFUQSk+Ci0KLQotPCEtLQotCi1EZWZpbmVzIGFuIG9wdGlvbmFsIGV2ZW50IGxpc3RlbmVyIG9iamVjdCB0byBiZSBpbnN0YW50aWF0ZWQgYW5kCi1yZWdpc3RlcmVkIGF1dG9tYXRpY2FsbHkuCi0tLT4KLQotPCFFTEVNRU5UIGxpc3RlbmVyIChsaXN0ZW5lci1jbGFzcykgPgotCi08IS0tCi0KLVRoZSBsaXN0ZW5lci1jbGFzcyBlbGVtZW50IGRlY2xhcmVzIGEgY2xhc3MgaW4gdGhlIGFwcGxpY2F0aW9uIHRoYXQKLW11c3QgYmUgcmVnaXN0ZXJlZCBhcyBhIHdlYiBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLiAgU2VlIHRoZQotU2VydmxldCAyLjMgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KLS0tPgotCi08IUVMRU1FTlQgbGlzdGVuZXItY2xhc3MgKCNQQ0RBVEEpID4KLQotCi08IS0tCi1UaGUgdGFnIGRlZmluZXMgYSB1bmlxdWUgdGFnIGluIHRoaXMgdGFnIGxpYnJhcnkuICBJdCBoYXMgb25lCi1hdHRyaWJ1dGUsIGlkLgotCi1UaGUgdGFnIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoKLQotbmFtZSAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBhY3Rpb24gbmFtZQotCi10YWctY2xhc3MgICAgICAgICBUaGUgdGFnIGhhbmRsZXIgY2xhc3MgaW1wbGVtZW50aW5nCi0gICAgICAgICAgICAgICAgICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnCi0KLXRlaS1jbGFzcyAgICAgICAgIEFuIG9wdGlvbmFsIHN1YmNsYXNzIG9mCi0gICAgICAgICAgICAgICAgICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvCi0KLWJvZHktY29udGVudCAgICAgIFRoZSBib2R5IGNvbnRlbnQgdHlwZQotCi1kaXNwbGF5LW5hbWUgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQKLSAgICAgICAgICAgICAgICAgIGJ5IHRvb2xzCi0KLXNtYWxsLWljb24gICAgICAgIE9wdGlvbmFsIHNtYWxsLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotCi1sYXJnZS1pY29uICAgICAgICBPcHRpb25hbCBsYXJnZS1pY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKLQotZGVzY3JpcHRpb24gICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0KLXZhcmlhYmxlICAgICAgICAgIE9wdGlvbmFsIHNjcmlwdGluZyB2YXJpYWJsZSBpbmZvcm1hdGlvbgotCi1hdHRyaWJ1dGUgICAgICAgICBBbGwgYXR0cmlidXRlcyBvZiB0aGlzIGFjdGlvbgotCi1leGFtcGxlICAgICAgICAgICBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbiBleGFtcGxlIG9mIGEKLSAgICAgICAgICAgICAgICAgIHVzZSBvZiB0aGlzIHRhZwotCi0tLT4KLQotPCFFTEVNRU5UIHRhZyAobmFtZSwgdGFnLWNsYXNzLCB0ZWktY2xhc3M/LCBib2R5LWNvbnRlbnQ/LCBkaXNwbGF5LW5hbWU/LAotICAgICAgICAgICAgICAgc21hbGwtaWNvbj8sIGxhcmdlLWljb24/LCBkZXNjcmlwdGlvbj8sIHZhcmlhYmxlKiwgYXR0cmlidXRlKiwKLSAgICAgICAgICAgICAgIGV4YW1wbGU/KSA+Ci0KLTwhLS0KLURlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcmx2ZXQuanNwLnRhZ2V4dC5UYWcgdGhhdCBpbXBsZW1lbnRzCi10aGUgcmVxdWVzdCB0aW1lIHNlbWFudGljcyBmb3IgdGhpcyB0YWcuIChyZXF1aXJlZCkKLQotI1BDREFUQSA6Oj0gZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQotLS0+Ci0KLTwhRUxFTUVOVCB0YWctY2xhc3MgKCNQQ0RBVEEpID4KLQotPCEtLQotRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbyBmb3IKLXRoaXMgdGFnLiAob3B0aW9uYWwpCi0KLUlmIHRoaXMgaXMgbm90IGdpdmVuLCB0aGUgY2xhc3MgaXMgbm90IGNvbnN1bHRlZCBhdCB0cmFuc2xhdGlvbiB0aW1lLgotCi0jUENEQVRBIDo6PSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCi0tLT4KLQotPCFFTEVNRU5UIHRlaS1jbGFzcyAoI1BDREFUQSkgPgotCi08IS0tCi1Qcm92aWRlcyBhIGhpbnQgYXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGJvZHkgb2YgdGhpcyB0YWcuIFByaW1hcmlseQotaW50ZW5kZWQgZm9yIHVzZSBieSBwYWdlIGNvbXBvc2l0aW9uIHRvb2xzLgotCi1UaGVyZSBhcmUgY3VycmVudGx5IHRocmVlIHZhbHVlcyBzcGVjaWZpZWQ6Ci0KLXRhZ2RlcGVuZGVudAlUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcKLQkJaW1wbGVtZW50YXRpb24gaXRzZWxmLCBhbmQgaXMgbW9zdCBsaWtlbHkgaW4gYQotCQlkaWZmZXJlbnQgImxhbmdhZ2UiLCBlLmcgZW1iZWRkZWQgU1FMIHN0YXRlbWVudHMuCi0KLUpTUAkJVGhlIGJvZHkgb2YgdGhlIHRhZyBjb250YWlucyBuZXN0ZWQgSlNQIHN5bnRheAotCi1lbXB0eQkJVGhlIGJvZHkgbXVzdCBiZSBlbXB0eQotCi1UaGUgZGVmYXVsdCAoaWYgbm90IGRlZmluZWQpIGlzIEpTUAotCi0jUENEQVRBIDo6PSAgdGFnZGVwZW5kZW50IHwgSlNQIHwgZW1wdHkKLQotLS0+Ci0KLTwhRUxFTUVOVCBib2R5LWNvbnRlbnQgKCNQQ0RBVEEpID4KLQotPCEtLQotCi1UaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQKLXRvIGJlIGRpc3BsYXllZCBieSB0b29scy4KLS0tPgotCi08IUVMRU1FTlQgZGlzcGxheS1uYW1lICgjUENEQVRBKSA+Ci0KLQotPCEtLQotCi1UaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGEgbGFyZ2UKLSgzMiB4IDMyKSBpY29uIGltYWdlLiAgVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZQotdGFnIGxpYnJhcnkuICBUaGUgaW1hZ2UgbXVzdCBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdCwgYW5kCi10aGUgZmlsZSBuYW1lIG11c3QgZW5kIHdpdGggdGhlIHN1ZmZpeCAiLmpwZyIgb3IgIi5naWYiIHJlc3BlY3RpdmVseS4KLVRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotLS0+Ci0KLTwhRUxFTUVOVCBsYXJnZS1pY29uICgjUENEQVRBKSA+Ci0KLTwhLS0KLQotVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgY29udGFpbmluZyBhIGxhcmdlCi0oMzIgeCAzMikgaWNvbiBpbWFnZS4gIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUKLXRhZyBsaWJyYXJ5LiAgVGhlIGltYWdlIG11c3QgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQsIGFuZAotdGhlIGZpbGUgbmFtZSBtdXN0IGVuZCB3aXRoIHRoZSBzdWZmaXggIi5qcGciIG9yICIuZ2lmIiByZXNwZWN0aXZlbHkuCi1UaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLS0tPgotCi08IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSkgPgotCi08IS0tCi0KLVRoZSBleGFtcGxlIGVsZW1lbnQgY29udGFpbnMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4gZXhhbXBsZQotb2YgdGhlIHVzZSBvZiBhIHRhZy4KLS0tPgotCi08IUVMRU1FTlQgZXhhbXBsZSAoI1BDREFUQSkgPgotCi08IS0tCi0KLVRoZSB2YXJpYWJsZSB0YWcgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZyB2YXJpYWJsZXMKLWRlZmluZWQgYnkgdGhpcyB0YWcuICBJdCBpcyBhICh0cmFuc2xhdGlvbiB0aW1lKSBlcnJvciBmb3IgYSB0YWcKLXRoYXQgaGFzIG9uZSBvciBtb3JlIHZhcmlhYmxlIHN1YmVsZW1lbnRzIHRvIGhhdmUgYSBUYWdFeHRyYUluZm8KLWNsYXNzIHRoYXQgcmV0dXJucyBhIG5vbi1udWxsIG9iamVjdC4KLQotVGhlIHN1YmVsZW1lbnRzIG9mIHZhcmlhYmxlIGFyZSBvZiB0aGUgZm9ybToKLQotbmFtZS1naXZlbiAgICAgICAgICAgICAgIFRoZSB2YXJpYWJsZSBuYW1lIGFzIGEgY29uc3RhbnQKLQotbmFtZS1mcm9tLWF0dHJpYnV0ZSAgICAgIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lKSB2YWx1ZSB3aWxsIGdpdmUgdGhlIG5hbWUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuICBPbmUgb2YgbmFtZS1naXZlbiBvcgotICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUtZnJvbS1hdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCi0KLXZhcmlhYmxlLWNsYXNzICAgICAgICAgICBOYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGUgdmFyaWFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBpcyBkZWZhdWx0LgotCi1kZWNsYXJlICAgICAgICAgICAgICAgICAgV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQgb3Igbm90LgotICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUgaXMgdGhlIGRlZmF1bHQuCi0KLXNjb3BlICAgICAgICAgICAgICAgICAgICBUaGUgc2NvcGUgb2YgdGhlIHNjcmlwdGluZyB2YXJhaWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQuICBORVNURUQgaXMgZGVmYXVsdC4KLQotZGVzY3JpcHRpb24gICAgICAgICAgICAgIE9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoaXMgdmFyaWFibGUKLQotLS0+Ci0KLTwhRUxFTUVOVCB2YXJpYWJsZSAoIChuYW1lLWdpdmVuIHwgbmFtZS1mcm9tLWF0dHJpYnV0ZSksIHZhcmlhYmxlLWNsYXNzPywKLSAgICAgICAgICAgICAgICAgICAgZGVjbGFyZT8sIHNjb3BlPywgZGVzY3JpcHRpb24/KSA+Ci0KLTwhLS0KLQotVGhlIG5hbWUgZm9yIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuICBPbmUgb2YgbmFtZS1naXZlbiBvcgotbmFtZS1mcm9tLWF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KLS0tPgotCi08IUVMRU1FTlQgbmFtZS1naXZlbiAoI1BDREFUQSkgPgotCi08IS0tCi0KLVRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24tdGltZSkgdmFsdWUgd2lsbCBnaXZlCi10aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuICBPbmUgb2YgbmFtZS1naXZlbiBvciBuYW1lLWZyb20tYXR0cmlidXRlCi1pcyByZXF1aXJlZC4KLS0tPgotCi08IUVMRU1FTlQgbmFtZS1mcm9tLWF0dHJpYnV0ZSAoI1BDREFUQSkgPgotCi08IS0tCi0KLVRoZSBvcHRpb25hbCBuYW1lIG9mIHRoZSBjbGFzcyBmb3IgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4gIFRoZQotZGVmYXVsdCBpcyBqYXZhLmxhbmcuU3RyaW5nLgotLS0+Ci0KLTwhRUxFTUVOVCB2YXJpYWJsZS1jbGFzcyAoI1BDREFUQSkgPgotCi08IS0tCi0KLVdoZXRoZXIgdGhlIHNjcmlwdGluZyB2YXJpYWJsZSBpcyB0byBiZSBkZWZpbmVkIG9yIG5vdC4gIFNlZQotVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLiAgVGhpcyBlbGVtZW50IGlzIG9wdGlvbmFsIGFuZCAidHJ1ZSIKLWlzIHRoZSBkZWZhdWx0LgotLS0+Ci0KLTwhRUxFTUVOVCBkZWNsYXJlICgjUENEQVRBKSA+Ci0KLTwhLS0KLQotVGhlIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuICBTZWUgVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLgotVGhlIGVsZW1lbnQgaXMgb3B0aW9uYWwgYW5kICJORVNURUQiIGlzIHRoZSBkZWZhdWx0LiAgT3RoZXIgbGVnYWwKLXZhbHVlcyBhcmUgIkFUX0JFR0lOIiBhbmQgIkFUX0VORCIuCi0tLT4KLQotPCFFTEVNRU5UIHNjb3BlICgjUENEQVRBKSA+Ci0KLTwhLS0KLQotVGhlIGF0dHJpYnV0ZSB0YWcgZGVmaW5lcyBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBuZXN0aW5nIHRhZwotCi1BbiBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBpcyBjb21wb3NlZCBvZjoKLQkKLS0gdGhlIGF0dHJpYnV0ZXMgbmFtZSAocmVxdWlyZWQpCi0tIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwgKG9wdGlvbmFsKQotLSBpZiB0aGUgYXR0cmlidXRlcyB2YWx1ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBhdCBydW50aW1lCi0gIGJ5IGEgc2NyaXB0bGV0IGV4cHJlc3Npb24gKG9wdGlvbmFsKQotLSB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlcyB2YWx1ZSAob3B0aW9uYWwpCi0tIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBtZWFuaW5nIG9mIHRoZSBhdHRyaWJ1dGUgKG9wdGlvbmFsKQotCi0tLT4KLQotCi08IS0tCi1UaGUgYXR0cmlidXRlIHRhZyBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcgdGFnCi0KLUFuIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGlzIGNvbXBvc2VkIG9mOgotCi0tIHRoZSBhdHRyaWJ1dGVzIG5hbWUgKHJlcXVpcmVkKQotCi0tIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwgKG9wdGlvbmFsKQotCi0tIGlmIHRoZSBhdHRyaWJ1dGVzIHZhbHVlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkIGF0IHJ1bnRpbWUKLSAgYnkgYSBzY3JpcHRsZXQgZXhwcmVzc2lvbiAob3B0aW9uYWwpCi0KLS0gdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMgdmFsdWUgKG9wdGlvbmFsKQotCi0tIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBtZWFuaW5nIG9mIHRoZSBhdHRyaWJ1dGUgKG9wdGlvbmFsKQotLS0+Ci0KLTwhRUxFTUVOVCBhdHRyaWJ1dGUgKG5hbWUsIHJlcXVpcmVkPyAsIHJ0ZXhwcnZhbHVlPywgdHlwZT8sIGRlc2NyaXB0aW9uPykgPgotCi08IS0tCi1EZWZpbmVzIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhIHRhZyBvciBhdHRyaWJ1dGUgYmVpbmcgZGVmaW5lZAotCi0jUENEQVRBIDo6PSBOTVRPS0VOCi0tLT4KLQotPCFFTEVNRU5UIG5hbWUJKCNQQ0RBVEEpID4KLQotPCEtLQotRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwuCi0KLSNQQ0RBVEEgOjo9IHRydWUgfCBmYWxzZSB8IHllcyB8IG5vCi0KLUlmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZSBhdHRyaWJ1dGUKLWlzIG9wdGlvbmFsLgotLS0+Ci0KLTwhRUxFTUVOVCByZXF1aXJlZCAgICAoI1BDREFUQSkgPgotCi08IS0tCi1EZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBjYW4gaGF2ZSBzY3JpcHRsZXQgZXhwcmVzc2lvbnMgYXMKLWEgdmFsdWUsIGkuZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZAotYXQgcmVxdWVzdCB0aW1lLCBhcyBvcHBvc2VkIHRvIGEgc3RhdGljIHZhbHVlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb24KLXRpbWUuCi0KLSNQQ0RBVEEgOjo9IHRydWUgfCBmYWxzZSB8IHllcyB8IG5vCi0KLUlmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZSBhdHRyaWJ1dGUKLWhhcyBhIHN0YXRpYyB2YWx1ZQotLS0+Ci0KLTwhRUxFTUVOVCBydGV4cHJ2YWx1ZSAoI1BDREFUQSkgPgotCi0KLTwhLS0KLQotRGVmaW5lcyB0aGUgSmF2YSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzIHZhbHVlLiAgRm9yIHN0YXRpYyB2YWx1ZXMKLSh0aG9zZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9uIHRpbWUpIHRoZSB0eXBlIGlzIGFsd2F5cwotamF2YS5sYW5nLlN0cmluZy4KLS0tPgotCi08IUVMRU1FTlQgdHlwZSAoI1BDREFUQSkgPgotCi0KLTwhLS0gSUQgYXR0cmlidXRlcyAtLT4KLQotPCFBVFRMSVNUIHRsaWItdmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBqc3AtdmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzaG9ydC1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHVyaSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBleGFtcGxlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRhZyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0YWctY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdGVpLWNsYXNzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGJvZHktY29udGVudCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhdHRyaWJ1dGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXF1aXJlZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBydGV4cHJ2YWx1ZSBpZCBJRCAjSU1QTElFRD4KLQotCi08IUFUVExJU1QgcGFyYW0tbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwYXJhbS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsaXN0ZW5lciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsaXN0ZW5lci1jbGFzcyBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMl8wLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMl8wLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI1ODY0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgeG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjIuMCI+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIyl3ZWItanNwdGFnbGlicmFyeV8yXzAueHNkcwkxLjM2IDA4LzE4LzAzCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLSAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLSAgICAgIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgSlNQIFRhZ2xpYnJhcnkKLQlkZXNjcmlwdG9yLiAgQWxsIFRhZ2xpYnJhcnkgZGVzY3JpcHRvcnMgbXVzdAotCWluZGljYXRlIHRoZSB0YWcgbGlicmFyeSBzY2hlbWEgYnkgdXNpbmcgdGhlIFRhZ2xpYnJhcnkKLQluYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0KLQlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8dGFnbGliIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSIuLi4iCi0JICAgICAgdmVyc2lvbj0iMi4wIj4KLQkgICAgICAuLi4KLQkgICAgPC90YWdsaWI+Ci0KLQlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkCi0JdmVyc2lvbiBvZiB0aGUgc2NoZW1hIHVzaW5nIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUKLQlmb3IgSjJFRSBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItanNwdGFnbGlicmFyeV8yXzAueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLSAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYiIgdHlwZT0iajJlZTp0bGRUYWdsaWJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdGFnbGliIHRhZyBpcyB0aGUgZG9jdW1lbnQgcm9vdC4KLQlUaGUgZGVmaW5pdGlvbiBvZiB0YWdsaWIgaXMgcHJvdmlkZWQKLQlieSB0aGUgdGxkVGFnbGliVHlwZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InRhZy1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHRhZ2xpYiBlbGVtZW50IGNvbnRhaW5zLCBhbW9uZyBvdGhlciB0aGluZ3MsIHRhZyBhbmQKLQkgIHRhZy1maWxlIGVsZW1lbnRzLgotCSAgVGhlIG5hbWUgc3ViZWxlbWVudHMgb2YgdGhlc2UgZWxlbWVudHMgbXVzdCBlYWNoIGJlIHVuaXF1ZS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTp0YWd8ajJlZTp0YWctZmlsZSIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpuYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0iZnVuY3Rpb24tbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSB0YWdsaWIgZWxlbWVudCBjb250YWlucyBmdW5jdGlvbiBlbGVtZW50cy4KLQkgIFRoZSBuYW1lIHN1YmVsZW1lbnRzIG9mIHRoZXNlIGVsZW1lbnRzIG11c3QgZWFjaCBiZSB1bmlxdWUuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZnVuY3Rpb24iLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6bmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICA8L3hzZDplbGVtZW50PgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJvZHktY29udGVudFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgYm9keSB0aGF0IGlzIHZhbGlkIGZvciBhIHRhZy4KLQlUaGlzIHZhbHVlIGlzIHVzZWQgYnkgdGhlIEpTUCBjb250YWluZXIgdG8gdmFsaWRhdGUKLQl0aGF0IGEgdGFnIGludm9jYXRpb24gaGFzIHRoZSBjb3JyZWN0IGJvZHkgc3ludGF4IGFuZAotCWJ5IHBhZ2UgY29tcG9zaXRpb24gdG9vbHMgdG8gYXNzaXN0IHRoZSBwYWdlIGF1dGhvcgotCWluIHByb3ZpZGluZyBhIHZhbGlkIHRhZyBib2R5LgotCi0JVGhlcmUgYXJlIGN1cnJlbnRseSBmb3VyIHZhbHVlcyBzcGVjaWZpZWQ6Ci0KLQl0YWdkZXBlbmRlbnQgICAgVGhlIGJvZHkgb2YgdGhlIHRhZyBpcyBpbnRlcnByZXRlZCBieSB0aGUgdGFnCi0JCQlpbXBsZW1lbnRhdGlvbiBpdHNlbGYsIGFuZCBpcyBtb3N0IGxpa2VseQotCQkJaW4gYSBkaWZmZXJlbnQgImxhbmd1YWdlIiwgZS5nIGVtYmVkZGVkIFNRTAotCQkJc3RhdGVtZW50cy4KLQotCUpTUCAgICAgICAgICAgICBUaGUgYm9keSBvZiB0aGUgdGFnIGNvbnRhaW5zIG5lc3RlZCBKU1AKLQkJCXN5bnRheC4KLQotCWVtcHR5ICAgICAgICAgICBUaGUgYm9keSBtdXN0IGJlIGVtcHR5Ci0KLQlzY3JpcHRsZXNzICAgICAgVGhlIGJvZHkgYWNjZXB0cyBvbmx5IHRlbXBsYXRlIHRleHQsIEVMCi0JCQlFeHByZXNzaW9ucywgYW5kIEpTUCBhY3Rpb24gZWxlbWVudHMuICBObwotCQkJc2NyaXB0aW5nIGVsZW1lbnRzIGFyZSBhbGxvd2VkLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0YWdkZXBlbmRlbnQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKU1AiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlbXB0eSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNjcmlwdGxlc3MiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJleHRlbnNpYmxlVHlwZSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBleHRlbnNpYmxlVHlwZSBpcyBhbiBhYnN0cmFjdCBiYXNlIHR5cGUgdGhhdCBpcyB1c2VkIHRvCi0JZGVmaW5lIHRoZSB0eXBlIG9mIGV4dGVuc2lvbi1lbGVtZW50cy4gSW5zdGFuY2UgZG9jdW1lbnRzCi0JbXVzdCBzdWJzdGl0dXRlIGEga25vd24gdHlwZSB0byBkZWZpbmUgdGhlIGV4dGVuc2lvbiBieQotCXVzaW5nIHhzaTp0eXBlIGF0dHJpYnV0ZSB0byBkZWZpbmUgdGhlIGFjdHVhbCB0eXBlIG9mCi0JZXh0ZW5zaW9uLWVsZW1lbnRzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZnVuY3Rpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZnVuY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gZWFjaAotCWZ1bmN0aW9uIGluIHRoZSB0YWcgbGlicmFyeSB0aGF0IGlzIHRvIGJlIGV4cG9zZWQgdG8gdGhlIEVMLgotCi0JVGhlIGZ1bmN0aW9uIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoKLQotCWRlc2NyaXB0aW9uICAgICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0KLQlkaXNwbGF5LW5hbWUgICAgICAgIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi0JCQkgICAgZGlzcGxheWVkIGJ5IHRvb2xzCi0KLQlpY29uICAgICAgICAgICAgICAgIE9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkCi0JCQkgICAgYnkgdG9vbHMKLQotCW5hbWUgICAgICAgICAgICAgICAgQSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbgotCi0JZnVuY3Rpb24tY2xhc3MgICAgICBQcm92aWRlcyB0aGUgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0Ci0JCQkgICAgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb24KLQotCWZ1bmN0aW9uLXNpZ25hdHVyZSAgUHJvdmlkZXMgdGhlIHNpZ25hdHVyZSwgYXMgaW4gdGhlIEphdmEKLQkJCSAgICBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCBvZiB0aGUgSmF2YQotCQkJICAgIG1ldGhvZCB0aGF0IGlzIHRvIGJlIHVzZWQgdG8gaW1wbGVtZW50Ci0JCQkgICAgdGhlIGZ1bmN0aW9uLgotCi0JZXhhbXBsZSAgICAgICAgICAgICBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbgotCQkJICAgIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyBmdW5jdGlvbgotCi0JZnVuY3Rpb24tZXh0ZW5zaW9uICBaZXJvIG9yIG1vcmUgZXh0ZW5zaW9ucyB0aGF0IHByb3ZpZGUgZXh0cmEKLQkJCSAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGZ1bmN0aW9uLCBmb3IgdG9vbAotCQkJICAgIGNvbnN1bXB0aW9uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKLQkJICAgdHlwZT0iajJlZTp0bGQtY2Fub25pY2FsLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgQSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgUHJvdmlkZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBKYXZhCi0JICAgIGNsYXNzIGNvbnRhaW5pbmcgdGhlIHN0YXRpYyBtZXRob2QgdGhhdCBpbXBsZW1lbnRzCi0JICAgIHRoZSBmdW5jdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLXNpZ25hdHVyZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBQcm92aWRlcyB0aGUgc2lnbmF0dXJlLCBvZiB0aGUgc3RhdGljIEphdmEgbWV0aG9kIHRoYXQgaXMKLQkgICAgdG8gYmUgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9uLiAgVGhlIHN5bnRheCBvZiB0aGUKLQkgICAgZnVuY3Rpb24tc2lnbmF0dXJlIGVsZW1lbnQgaXMgYXMgZm9sbG93czoKLQotCQlGdW5jdGlvblNpZ25hdHVyZSA6Oj0gUmV0dXJuVHlwZSBTIE1ldGhvZE5hbWUgUz8KLQkJCQkgICAgICAnKCcgUz8gUGFyYW1ldGVycz8gUz8gJyknCi0KLSAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICAgICA6Oj0gVHlwZQotCi0JCU1ldGhvZE5hbWUgICAgICAgIDo6PSBJZGVudGlmaWVyCi0KLQkJUGFyYW1ldGVycyAgICAgICAgOjo9ICAgUGFyYW1ldGVyCi0JCQkJICAgICAgfCAoIFBhcmFtZXRlciBTPyAnLCcgUz8gUGFyYW1ldGVycyApCi0KLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgICAgICAgICA6Oj0gVHlwZQotCi0JCVdoZXJlOgotCi0gCQkgICAgKiBUeXBlIGlzIGEgYmFzaWMgdHlwZSBvciBhIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUKLQkJICAgICAgKGluY2x1ZGluZyBwYWNrYWdlIG5hbWUpLCBhcyBwZXIgdGhlICdUeXBlJyBwcm9kdWN0aW9uCi0JCSAgICAgIGluIHRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIFNlY29uZCBFZGl0aW9uLAotCQkgICAgICBDaGFwdGVyIDE4LgotCi0gICAgICAgICAgICAgICAgICAgICogSWRlbnRpZmllciBpcyBhIEphdmEgaWRlbnRpZmllciwgYXMgcGVyIHRoZSAnSWRlbnRpZmllcicKLQkJICAgICAgcHJvZHVjdGlvbiBpbiB0aGUgSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCBTZWNvbmQKLQkJICAgICAgRWRpdGlvbiwgQ2hhcHRlciAxOC4KLQotCSAgICBFeGFtcGxlOgotCi0JICAgIGphdmEubGFuZy5TdHJpbmcgbmlja05hbWUoIGphdmEubGFuZy5TdHJpbmcsIGludCApCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGFtcGxlIgotCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBleGFtcGxlIGVsZW1lbnQgY29udGFpbnMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24KLQkgICAgb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1leHRlbnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6dGxkLWV4dGVuc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBGdW5jdGlvbiBleHRlbnNpb25zIGFyZSBmb3IgdG9vbCB1c2Ugb25seSBhbmQgbXVzdCBub3QgYWZmZWN0Ci0JICAgIHRoZSBiZWhhdmlvciBvZiBhIGNvbnRhaW5lci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWdGaWxlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JRGVmaW5lcyBhbiBhY3Rpb24gaW4gdGhpcyB0YWcgbGlicmFyeSB0aGF0IGlzIGltcGxlbWVudGVkCi0JYXMgYSAudGFnIGZpbGUuCi0KLQlUaGUgdGFnLWZpbGUgZWxlbWVudCBoYXMgdHdvIHJlcXVpcmVkIHN1YmVsZW1lbnRzOgotCi0JZGVzY3JpcHRpb24gICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0KLQlkaXNwbGF5LW5hbWUgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQotCQkJICBkaXNwbGF5ZWQgYnkgdG9vbHMKLQotCWljb24gICAgICAgICAgICAgIE9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkCi0JCQkgIGJ5IHRvb2xzCi0KLQluYW1lICAgICAgICAgICAgICBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lCi0KLQlwYXRoICAgICAgICAgICAgICBXaGVyZSB0byBmaW5kIHRoZSAudGFnIGZpbGUgaW1wbGVtZW50aW5nIHRoaXMKLQkJCSAgYWN0aW9uLCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViCi0JCQkgIGFwcGxpY2F0aW9uIG9yIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSBmb3IgYQotCQkJICB0YWcgbGlicmFyeSBwYWNrYWdlZCBpbiBhIEpBUi4gIFRoaXMgbXVzdAotCQkJICBiZWdpbiB3aXRoIC9XRUItSU5GL3RhZ3MgaWYgdGhlIC50YWcgZmlsZQotCQkJICByZXNpZGVzIGluIHRoZSBXQVIsIG9yIC9NRVRBLUlORi90YWdzIGlmIHRoZQotCQkJICAudGFnIGZpbGUgcmVzaWRlcyBpbiBhIEpBUi4KLQotCWV4YW1wbGUgICAgICAgICAgIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuCi0JCQkgIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyB0YWcKLQotCXRhZy1leHRlbnNpb24gICAgIFplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYQotCQkJICBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZywgZm9yIHRvb2wKLQkJCSAgY29uc3VtcHRpb24KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotCQkgICB0eXBlPSJqMmVlOnRsZC1jYW5vbmljYWwtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXRoIgotCQkgICB0eXBlPSJqMmVlOnBhdGhUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhhbXBsZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZXhhbXBsZSBlbGVtZW50IGNvbnRhaW5zIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uCi0JICAgIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiBhIHRhZy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1leHRlbnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6dGxkLWV4dGVuc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUYWcgZXh0ZW5zaW9ucyBhcmUgZm9yIHRvb2wgdXNlIG9ubHkgYW5kIG11c3Qgbm90IGFmZmVjdAotCSAgICB0aGUgYmVoYXZpb3Igb2YgYSBjb250YWluZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRhZyBkZWZpbmVzIGEgdW5pcXVlIHRhZyBpbiB0aGlzIHRhZyBsaWJyYXJ5LiAgSXQgaGFzIG9uZQotCWF0dHJpYnV0ZSwgaWQuCi0KLQlUaGUgdGFnIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoKLQotCWRlc2NyaXB0aW9uICAgICAgIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgotCi0JZGlzcGxheS1uYW1lICAgICAgQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKLQkJCSAgZGlzcGxheWVkIGJ5IHRvb2xzCi0KLQlpY29uICAgICAgICAgICAgICBPcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZAotCQkJICBieSB0b29scwotCi0JbmFtZSAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBhY3Rpb24gbmFtZQotCi0JdGFnLWNsYXNzICAgICAgICAgVGhlIHRhZyBoYW5kbGVyIGNsYXNzIGltcGxlbWVudGluZwotCQkJICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuSnNwVGFnCi0KLQl0ZWktY2xhc3MgICAgICAgICBBbiBvcHRpb25hbCBzdWJjbGFzcyBvZgotCQkJICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvCi0KLQlib2R5LWNvbnRlbnQgICAgICBUaGUgYm9keSBjb250ZW50IHR5cGUKLQotCXZhcmlhYmxlICAgICAgICAgIE9wdGlvbmFsIHNjcmlwdGluZyB2YXJpYWJsZSBpbmZvcm1hdGlvbgotCi0JYXR0cmlidXRlICAgICAgICAgQWxsIGF0dHJpYnV0ZXMgb2YgdGhpcyBhY3Rpb24gdGhhdCBhcmUKLQkJCSAgZXZhbHVhdGVkIHByaW9yIHRvIGludm9jYXRpb24uCi0KLQlkeW5hbWljLWF0dHJpYnV0ZXMgV2hldGhlciB0aGlzIHRhZyBzdXBwb3J0cyBhZGRpdGlvbmFsCi0JCQkgICBhdHRyaWJ1dGVzIHdpdGggZHluYW1pYyBuYW1lcy4gIElmCi0JCQkgICB0cnVlLCB0aGUgdGFnLWNsYXNzIG11c3QgaW1wbGVtZW50IHRoZQotCQkJICAgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkR5bmFtaWNBdHRyaWJ1dGVzCi0JCQkgICBpbnRlcmZhY2UuICBEZWZhdWx0cyB0byBmYWxzZS4KLQotCWV4YW1wbGUgICAgICAgICAgIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuCi0JCQkgIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyB0YWcKLQotCXRhZy1leHRlbnNpb24gICAgIFplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYQotCQkJICBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZywgZm9yIHRvb2wKLQkJCSAgY29uc3VtcHRpb24KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotCQkgICB0eXBlPSJqMmVlOnRsZC1jYW5vbmljYWwtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWctY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcmx2ZXQuanNwLnRhZ2V4dC5Kc3BUYWcKLQkgICAgdGhhdCBpbXBsZW1lbnRzIHRoZSByZXF1ZXN0IHRpbWUgc2VtYW50aWNzIGZvcgotCSAgICB0aGlzIHRhZy4gKHJlcXVpcmVkKQotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVpLWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8KLQkgICAgZm9yIHRoaXMgdGFnLiAob3B0aW9uYWwpCi0KLQkgICAgSWYgdGhpcyBpcyBub3QgZ2l2ZW4sIHRoZSBjbGFzcyBpcyBub3QgY29uc3VsdGVkIGF0Ci0JICAgIHRyYW5zbGF0aW9uIHRpbWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYm9keS1jb250ZW50IgotCQkgICB0eXBlPSJqMmVlOmJvZHktY29udGVudFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBTcGVjaWZpZXMgdGhlIGZvcm1hdCBmb3IgdGhlIGJvZHkgb2YgdGhpcyB0YWcuCi0JICAgIFRoZSBkZWZhdWx0IGluIEpTUCAxLjIgd2FzICJKU1AiIGJ1dCBiZWNhdXNlIHRoaXMKLQkgICAgaXMgYW4gaW52YWxpZCBzZXR0aW5nIGZvciBzaW1wbGUgdGFnIGhhbmRsZXJzLCB0aGVyZQotCSAgICBpcyBubyBsb25nZXIgYSBkZWZhdWx0IGluIEpTUCAyLjAuICBBIHJlYXNvbmFibGUKLQkgICAgZGVmYXVsdCBmb3Igc2ltcGxlIHRhZyBoYW5kbGVycyBpcyAic2NyaXB0bGVzcyIgaWYKLQkgICAgdGhlIHRhZyBjYW4gaGF2ZSBhIGJvZHkuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUiCi0JCSAgIHR5cGU9ImoyZWU6dmFyaWFibGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIgotCQkgICB0eXBlPSJqMmVlOnRsZC1hdHRyaWJ1dGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZHluYW1pYy1hdHRyaWJ1dGVzIgotCQkgICB0eXBlPSJqMmVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4YW1wbGUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGV4YW1wbGUgZWxlbWVudCBjb250YWlucyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbgotCSAgICBvZiBhbiBleGFtcGxlIG9mIHRoZSB1c2Ugb2YgYSB0YWcuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWctZXh0ZW5zaW9uIgotCQkgICB0eXBlPSJqMmVlOnRsZC1leHRlbnNpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGFnIGV4dGVuc2lvbnMgYXJlIGZvciB0b29sIHVzZSBvbmx5IGFuZCBtdXN0IG5vdCBhZmZlY3QKLQkgICAgdGhlIGJlaGF2aW9yIG9mIGEgY29udGFpbmVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZC1hdHRyaWJ1dGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXR0cmlidXRlIGVsZW1lbnQgZGVmaW5lcyBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBuZXN0aW5nCi0JdGFnLiAgVGhlIGF0dHJpYnV0cmUgZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzCi0JZGVmaW5pbmc6Ci0KLQlkZXNjcmlwdGlvbiAgICAgYSBkZXNjcmlwdGlvbiBvZiB0aGUgYXR0cmlidXRlCi0KLQluYW1lICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotCi0JcmVxdWlyZWQgICAgICAgIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvcgotCQkJb3B0aW9uYWwKLQotCXJ0ZXhwcnZhbHVlICAgICB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgYSBydW50aW1lIGF0dHJpYnV0ZQotCi0JdHlwZSAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzCi0KLQlmcmFnbWVudCAgICAgICAgd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyBhIGZyYWdtZW50Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6amF2YS1pZGVudGlmaWVyVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVkIgotCQkgICB0eXBlPSJqMmVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yCi0JICAgIG9wdGlvbmFsLgotCi0JICAgIElmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lCi0JICAgIHRoZSBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6c2VxdWVuY2U+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0icnRleHBydmFsdWUiCi0JCSAgICAgICB0eXBlPSJqMmVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCi0JCSAgICAgICBtaW5PY2N1cnM9IjAiPgotCSAgICA8eHNkOmFubm90YXRpb24+Ci0JICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JCURlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGNhbiBoYXZlIHNjcmlwdGxldAotCQlleHByZXNzaW9ucyBhcyBhIHZhbHVlLCBpLmUgdGhlIHZhbHVlIG9mIHRoZQotCQlhdHRyaWJ1dGUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQgYXQgcmVxdWVzdAotCQl0aW1lLCBhcyBvcHBvc2VkIHRvIGEgc3RhdGljIHZhbHVlIGRldGVybWluZWQgYXQKLQkJdHJhbnNsYXRpb24gdGltZS4KLQotCQlJZiBub3QgcHJlc2VudCB0aGVuIHRoZSBkZWZhdWx0IGlzICJmYWxzZSIsIGkuZSB0aGUKLQkJYXR0cmlidXRlIGhhcyBhIHN0YXRpYyB2YWx1ZQotCi0JICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotCSAgPC94c2Q6ZWxlbWVudD4KLQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlIgotCQkgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICAgICAgbWluT2NjdXJzPSIwIj4KLQkgICAgPHhzZDphbm5vdGF0aW9uPgotCSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQlEZWZpbmVzIHRoZSBKYXZhIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMgdmFsdWUuICBGb3IKLQkJc3RhdGljIHZhbHVlcyAodGhvc2UgZGV0ZXJtaW5lZCBhdCB0cmFuc2xhdGlvbiB0aW1lKQotCQl0aGUgdHlwZSBpcyBhbHdheXMgamF2YS5sYW5nLlN0cmluZy4KLQotCSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwveHNkOmFubm90YXRpb24+Ci0JICA8L3hzZDplbGVtZW50PgotCTwveHNkOnNlcXVlbmNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJmcmFnbWVudCIKLQkJICAgICB0eXBlPSJqMmVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCi0JCSAgICAgbWluT2NjdXJzPSIwIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgInRydWUiIGlmIHRoaXMgYXR0cmlidXRlIGlzIG9mIHR5cGUKLQkgICAgICBqYXZheC5qc3AudGFnZXh0LkpzcEZyYWdtZW50LCByZXByZXNlbnRpbmcgZHluYW1pYwotCSAgICAgIGNvbnRlbnQgdGhhdCBjYW4gYmUgcmUtZXZhbHVhdGVkIGFzIG1hbnkgdGltZXMKLQkgICAgICBhcyBuZWVkZWQgYnkgdGhlIHRhZyBoYW5kbGVyLiAgSWYgb21pdHRlZCBvciAiZmFsc2UiLAotCSAgICAgIHRoZSBkZWZhdWx0IGlzIHN0aWxsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0bGQtY2Fub25pY2FsLW5hbWVUeXBlIj4KLQotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCURlZmluZXMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEgdGFnIG9yIGF0dHJpYnV0ZSBiZWluZwotCWRlZmluZWQuCi0KLQlUaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTp4c2ROTVRPS0VOVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0bGQtZXh0ZW5zaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRsZC1leHRlbnNpb25UeXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUKLQlleHRlbnNpb25zIHRvIGEgc3BlY2lmaWMgVExEIGVsZW1lbnQuCi0KLQlJdCBpcyB1c2VkIGJ5IGVsZW1lbnRzIHRvIGRlc2lnbmF0ZSBhbiBleHRlbnNpb24gYmxvY2sKLQl0aGF0IGlzIHRhcmdldGVkIHRvIGEgc3BlY2lmaWMgZXh0ZW5zaW9uIGRlc2lnbmF0ZWQgYnkKLQlhIHNldCBvZiBleHRlbnNpb24gZWxlbWVudHMgdGhhdCBhcmUgZGVjbGFyZWQgYnkgYQotCW5hbWVzcGFjZS4gVGhlIG5hbWVzcGFjZSBpZGVudGlmaWVzIHRoZSBleHRlbnNpb24gdG8KLQl0aGUgdG9vbCB0aGF0IHByb2Nlc3NlcyB0aGUgZXh0ZW5zaW9uLgotCi0JVGhlIHR5cGUgb2YgdGhlIGV4dGVuc2lvbi1lbGVtZW50IGlzIGFic3RyYWN0LiBUaGVyZWZvcmUsCi0JYSBjb25jcmV0ZSB0eXBlIG11c3QgYmUgc3BlY2lmaWVkIGJ5IHRoZSBUTEQgdXNpbmcKLQl4c2k6dHlwZSBhdHRyaWJ1dGUgZm9yIGVhY2ggZXh0ZW5zaW9uLWVsZW1lbnQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uLWVsZW1lbnQiCi0JCSAgIHR5cGU9ImoyZWU6ZXh0ZW5zaWJsZVR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiCi0JCSAgIHVzZT0icmVxdWlyZWQiCi0JCSAgIHR5cGU9InhzZDphbnlVUkkiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZFRhZ2xpYlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LCBpdCBkZWZpbmVzOgotCi0JZGVzY3JpcHRpb24gICAgIGEgc2ltcGxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSAidXNlIiBvZiB0aGlzIHRhZ2xpYiwKLQkJCXNob3VsZCBiZSB1c2VyIGRpc2Nlcm5hYmxlCi0KLQlkaXNwbGF5LW5hbWUgICAgdGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEKLQkJCXNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQKLQkJCWJ5IHRvb2xzCi0KLQlpY29uICAgICAgICAgICAgb3B0aW9uYWwgaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0KLQl0bGliLXZlcnNpb24gICAgdGhlIHZlcnNpb24gb2YgdGhlIHRhZyBsaWJyYXJ5IGltcGxlbWVudGF0aW9uCi0KLQlzaG9ydC1uYW1lICAgICAgYSBzaW1wbGUgZGVmYXVsdCBzaG9ydCBuYW1lIHRoYXQgY291bGQgYmUKLQkJCXVzZWQgYnkgYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlCi0JCQluYW1lcyB3aXRoIGEgbW5lbW9uaWMgdmFsdWU7IGZvciBleGFtcGxlLAotCQkJdGhlIGl0IG1heSBiZSB1c2VkIGFzIHRoZSBwcmVmZXJlZCBwcmVmaXgKLQkJCXZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzCi0KLQl1cmkgICAgICAgICAgICAgYSB1cmkgdW5pcXVlbHkgaWRlbnRpZnlpbmcgdGhpcyB0YWdsaWIKLQotCXZhbGlkYXRvciAgICAgICBvcHRpb25hbCBUYWdMaWJyYXJ5VmFsaWRhdG9yIGluZm9ybWF0aW9uCi0KLQlsaXN0ZW5lciAgICAgICAgb3B0aW9uYWwgZXZlbnQgbGlzdGVuZXIgc3BlY2lmaWNhdGlvbgotCi0JdGFnICAgICAgICAgICAgIHRhZ3MgaW4gdGhpcyB0YWcgbGlicmFyeQotCi0JdGFnLWZpbGUgICAgICAgIHRhZyBmaWxlcyBpbiB0aGlzIHRhZyBsaWJyYXJ5Ci0KLQlmdW5jdGlvbiAgICAgICAgemVybyBvciBtb3JlIEVMIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoaXMKLQkJCXRhZyBsaWJyYXJ5Ci0KLQl0YWdsaWItZXh0ZW5zaW9uIHplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYQotCQkJaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0YWdsaWIsIGZvciB0b29sCi0JCQljb25zdW1wdGlvbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0bGliLXZlcnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZXNjcmliZXMgdGhpcyB2ZXJzaW9uIChudW1iZXIpIG9mIHRoZSB0YWdsaWJyYXJ5LgotCSAgICBJdCBpcyBkZXNjcmliZWQgYXMgYSBkZXdleSBkZWNpbWFsLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzaG9ydC1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnRsZC1jYW5vbmljYWwtbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIGEgc2ltcGxlIGRlZmF1bHQgbmFtZSB0aGF0IGNvdWxkIGJlIHVzZWQgYnkKLQkgICAgYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlIG5hbWVzIHdpdGggYQotCSAgICBtbmVtb25pY3ZhbHVlOyBmb3IgZXhhbXBsZSwgaXQgbWF5IGJlIHVzZWQgYXMgdGhlCi0JICAgIHByZWZlcnJlZCBwcmVmaXggdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMuICBEbwotCSAgICBub3QgdXNlIHdoaXRlIHNwYWNlLCBhbmQgZG8gbm90IHN0YXJ0IHdpdGggZGlnaXRzCi0JICAgIG9yIHVuZGVyc2NvcmUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmkiCi0JCSAgIHR5cGU9ImoyZWU6eHNkQW55VVJJVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyBhIHB1YmxpYyBVUkkgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMKLQkgICAgdmVyc2lvbiBvZiB0aGUgdGFnbGlicmFyeS4gIExlYXZlIGl0IGVtcHR5IGlmIGl0Ci0JICAgIGRvZXMgbm90IGFwcGx5LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yIgotCQkgICB0eXBlPSJqMmVlOnZhbGlkYXRvclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3RlbmVyIgotCQkgICB0eXBlPSJqMmVlOmxpc3RlbmVyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZyIKLQkJICAgdHlwZT0iajJlZTp0YWdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnLWZpbGUiCi0JCSAgIHR5cGU9ImoyZWU6dGFnRmlsZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbiIKLQkJICAgdHlwZT0iajJlZTpmdW5jdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItZXh0ZW5zaW9uIgotCQkgICB0eXBlPSJqMmVlOnRsZC1leHRlbnNpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGFnbGliIGV4dGVuc2lvbnMgYXJlIGZvciB0b29sIHVzZSBvbmx5IGFuZCBtdXN0IG5vdCBhZmZlY3QKLQkgICAgdGhlIGJlaGF2aW9yIG9mIGEgY29udGFpbmVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0JCSAgIGZpeGVkPSIyLjAiCi0JCSAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgRGVzY3JpYmVzIHRoZSBKU1AgdmVyc2lvbiAobnVtYmVyKSB0aGlzIHRhZ2xpYnJhcnkKLQkgIHJlcXVpcmVzIGluIG9yZGVyIHRvIGZ1bmN0aW9uIChkZXdleSBkZWNpbWFsKQotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsaWRhdG9yVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JQSB2YWxpZGF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZQotCXRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkgaXMKLQlkZWZpbmVkIGJ5IGEgdmFsaWRhdG9yVHlwZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3ItY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgdGhlIFRhZ0xpYnJhcnlWYWxpZGF0b3IgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZAotCSAgICB0byB2YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzCi0JICAgIHRhZyBsaWJyYXJ5LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iCi0JCSAgIHR5cGU9ImoyZWU6cGFyYW0tdmFsdWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcyBhbgotCSAgICBpbml0aWFsaXphdGlvbiBwYXJhbS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtc2NvcGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgZGVmaW5lcyBzY29wZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlLiAgU2VlCi0JVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLiAgVGhlIGFsbG93ZWQgdmFsdWVzIGFyZSwKLQkiTkVTVEVEIiwgIkFUX0JFR0lOIiBhbmQgIkFUX0VORCIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5FU1RFRCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUX0JFR0lOIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRfRU5EIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdmFyaWFibGVUeXBlIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBzY3JpcHRpbmcKLQl2YXJpYWJsZXMgZGVmaW5lZCBieSB1c2luZyB0aGlzIHRhZy4gIEl0IGlzIGEgKHRyYW5zbGF0aW9uCi0JdGltZSkgZXJyb3IgZm9yIGEgdGFnIHRoYXQgaGFzIG9uZSBvciBtb3JlIHZhcmlhYmxlCi0Jc3ViZWxlbWVudHMgdG8gaGF2ZSBhIFRhZ0V4dHJhSW5mbyBjbGFzcyB0aGF0IHJldHVybnMgYQotCW5vbi1udWxsIHZhbHVlIGZyb20gYSBjYWxsIHRvIGdldFZhcmlhYmxlSW5mbygpLgotCi0JVGhlIHN1YmVsZW1lbnRzIG9mIHZhcmlhYmxlVHlwZSBhcmUgb2YgdGhlIGZvcm06Ci0KLQlkZXNjcmlwdGlvbiAgICAgICAgICAgICAgT3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhpcwotCQkJCSB2YXJpYWJsZQotCi0JbmFtZS1naXZlbiAgICAgICAgICAgICAgIFRoZSB2YXJpYWJsZSBuYW1lIGFzIGEgY29uc3RhbnQKLQotCW5hbWUtZnJvbS1hdHRyaWJ1dGUgICAgICBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgd2hvc2UKLQkJCQkgKHRyYW5zbGF0aW9uIHRpbWUpIHZhbHVlIHdpbGwKLQkJCQkgZ2l2ZSB0aGUgbmFtZSBvZiB0aGUKLQkJCQkgdmFyaWFibGUuICBPbmUgb2YgbmFtZS1naXZlbiBvcgotCQkJCSBuYW1lLWZyb20tYXR0cmlidXRlIGlzIHJlcXVpcmVkLgotCi0JdmFyaWFibGUtY2xhc3MgICAgICAgICAgIE5hbWUgb2YgdGhlIGNsYXNzIG9mIHRoZSB2YXJpYWJsZS4KLQkJCQkgamF2YS5sYW5nLlN0cmluZyBpcyBkZWZhdWx0LgotCi0JZGVjbGFyZSAgICAgICAgICAgICAgICAgIFdoZXRoZXIgdGhlIHZhcmlhYmxlIGlzIGRlY2xhcmVkCi0JCQkJIG9yIG5vdC4gIFRydWUgaXMgdGhlIGRlZmF1bHQuCi0KLQlzY29wZSAgICAgICAgICAgICAgICAgICAgVGhlIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyYWlibGUKLQkJCQkgZGVmaW5lZC4gIE5FU1RFRCBpcyBkZWZhdWx0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZ2l2ZW4iCi0JCSAgICAgdHlwZT0iajJlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG5hbWUgZm9yIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lLWZyb20tYXR0cmlidXRlIgotCQkgICAgIHR5cGU9ImoyZWU6amF2YS1pZGVudGlmaWVyVHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZQotCSAgICAgICh0cmFuc2xhdGlvbi10aW1lKSB2YWx1ZSB3aWxsIGdpdmUgdGhlIG5hbWUgb2YKLQkgICAgICB0aGUgdmFyaWFibGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZS1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgb3B0aW9uYWwgbmFtZSBvZiB0aGUgY2xhc3MgZm9yIHRoZSBzY3JpcHRpbmcKLQkgICAgdmFyaWFibGUuICBUaGUgZGVmYXVsdCBpcyBqYXZhLmxhbmcuU3RyaW5nLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWNsYXJlIgotCQkgICB0eXBlPSJqMmVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgV2hldGhlciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGlzIHRvIGJlIGRlZmluZWQKLQkgICAgb3Igbm90LiAgU2VlIFRhZ0V4dHJhSW5mbyBmb3IgZGV0YWlscy4gIFRoaXMKLQkgICAgZWxlbWVudCBpcyBvcHRpb25hbCBhbmQgInRydWUiIGlzIHRoZSBkZWZhdWx0LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjb3BlIgotCQkgICB0eXBlPSJqMmVlOnZhcmlhYmxlLXNjb3BlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVsZW1lbnQgaXMgb3B0aW9uYWwgYW5kICJORVNURUQiIGlzIHRoZSBkZWZhdWx0LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8yXzEueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8yXzEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWE4ZTliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMl8xLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEKLSAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICB2ZXJzaW9uPSIyLjEiPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpd2ViLWpzcHRhZ2xpYnJhcnlfMl8xLnhzZHMJMS4xCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gICAgICBVLlMuQQotICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBWwotCi0JVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIEpTUCBUYWdsaWJyYXJ5Ci0JZGVzY3JpcHRvci4gIEFsbCBUYWdsaWJyYXJ5IGRlc2NyaXB0b3JzIG11c3QKLQlpbmRpY2F0ZSB0aGUgdGFnIGxpYnJhcnkgc2NoZW1hIGJ5IHVzaW5nIHRoZSBUYWdsaWJyYXJ5Ci0JbmFtZXNwYWNlOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0KLQlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8dGFnbGliIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Ii4uLiIKLQkgICAgICB2ZXJzaW9uPSIyLjEiPgotCSAgICAgIC4uLgotCSAgICA8L3RhZ2xpYj4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQKLQl2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgdXNpbmcgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZQotCWZvciBKYXZhIEVFIG5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWpzcHRhZ2xpYnJhcnlfMl8xLnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV81LnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliIiB0eXBlPSJqYXZhZWU6dGxkVGFnbGliVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRhZ2xpYiB0YWcgaXMgdGhlIGRvY3VtZW50IHJvb3QuCi0JVGhlIGRlZmluaXRpb24gb2YgdGFnbGliIGlzIHByb3ZpZGVkCi0JYnkgdGhlIHRsZFRhZ2xpYlR5cGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ0YWctbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSB0YWdsaWIgZWxlbWVudCBjb250YWlucywgYW1vbmcgb3RoZXIgdGhpbmdzLCB0YWcgYW5kCi0JICB0YWctZmlsZSBlbGVtZW50cy4KLQkgIFRoZSBuYW1lIHN1YmVsZW1lbnRzIG9mIHRoZXNlIGVsZW1lbnRzIG11c3QgZWFjaCBiZSB1bmlxdWUuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTp0YWd8amF2YWVlOnRhZy1maWxlIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6bmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImZ1bmN0aW9uLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgdGFnbGliIGVsZW1lbnQgY29udGFpbnMgZnVuY3Rpb24gZWxlbWVudHMuCi0JICBUaGUgbmFtZSBzdWJlbGVtZW50cyBvZiB0aGVzZSBlbGVtZW50cyBtdXN0IGVhY2ggYmUgdW5pcXVlLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZnVuY3Rpb24iLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpuYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gIDwveHNkOmVsZW1lbnQ+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYm9keS1jb250ZW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBib2R5IHRoYXQgaXMgdmFsaWQgZm9yIGEgdGFnLgotCVRoaXMgdmFsdWUgaXMgdXNlZCBieSB0aGUgSlNQIGNvbnRhaW5lciB0byB2YWxpZGF0ZQotCXRoYXQgYSB0YWcgaW52b2NhdGlvbiBoYXMgdGhlIGNvcnJlY3QgYm9keSBzeW50YXggYW5kCi0JYnkgcGFnZSBjb21wb3NpdGlvbiB0b29scyB0byBhc3Npc3QgdGhlIHBhZ2UgYXV0aG9yCi0JaW4gcHJvdmlkaW5nIGEgdmFsaWQgdGFnIGJvZHkuCi0KLQlUaGVyZSBhcmUgY3VycmVudGx5IGZvdXIgdmFsdWVzIHNwZWNpZmllZDoKLQotCXRhZ2RlcGVuZGVudCAgICBUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcKLQkJCWltcGxlbWVudGF0aW9uIGl0c2VsZiwgYW5kIGlzIG1vc3QgbGlrZWx5Ci0JCQlpbiBhIGRpZmZlcmVudCAibGFuZ3VhZ2UiLCBlLmcgZW1iZWRkZWQgU1FMCi0JCQlzdGF0ZW1lbnRzLgotCi0JSlNQICAgICAgICAgICAgIFRoZSBib2R5IG9mIHRoZSB0YWcgY29udGFpbnMgbmVzdGVkIEpTUAotCQkJc3ludGF4LgotCi0JZW1wdHkgICAgICAgICAgIFRoZSBib2R5IG11c3QgYmUgZW1wdHkKLQotCXNjcmlwdGxlc3MgICAgICBUaGUgYm9keSBhY2NlcHRzIG9ubHkgdGVtcGxhdGUgdGV4dCwgRUwKLQkJCUV4cHJlc3Npb25zLCBhbmQgSlNQIGFjdGlvbiBlbGVtZW50cy4gIE5vCi0JCQlzY3JpcHRpbmcgZWxlbWVudHMgYXJlIGFsbG93ZWQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGFnZGVwZW5kZW50Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlNQIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZW1wdHkiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzY3JpcHRsZXNzIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXh0ZW5zaWJsZVR5cGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZXh0ZW5zaWJsZVR5cGUgaXMgYW4gYWJzdHJhY3QgYmFzZSB0eXBlIHRoYXQgaXMgdXNlZCB0bwotCWRlZmluZSB0aGUgdHlwZSBvZiBleHRlbnNpb24tZWxlbWVudHMuIEluc3RhbmNlIGRvY3VtZW50cwotCW11c3Qgc3Vic3RpdHV0ZSBhIGtub3duIHR5cGUgdG8gZGVmaW5lIHRoZSBleHRlbnNpb24gYnkKLQl1c2luZyB4c2k6dHlwZSBhdHRyaWJ1dGUgdG8gZGVmaW5lIHRoZSBhY3R1YWwgdHlwZSBvZgotCWV4dGVuc2lvbi1lbGVtZW50cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZ1bmN0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGZ1bmN0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBwcm92aWRlIGluZm9ybWF0aW9uIG9uIGVhY2gKLQlmdW5jdGlvbiBpbiB0aGUgdGFnIGxpYnJhcnkgdGhhdCBpcyB0byBiZSBleHBvc2VkIHRvIHRoZSBFTC4KLQotCVRoZSBmdW5jdGlvbiBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMgZGVmaW5pbmc6Ci0KLQlkZXNjcmlwdGlvbiAgICAgICAgIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgotCi0JZGlzcGxheS1uYW1lICAgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQotCQkJICAgIGRpc3BsYXllZCBieSB0b29scwotCi0JaWNvbiAgICAgICAgICAgICAgICBPcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZAotCQkJICAgIGJ5IHRvb2xzCi0KLQluYW1lICAgICAgICAgICAgICAgIEEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgZnVuY3Rpb24KLQotCWZ1bmN0aW9uLWNsYXNzICAgICAgUHJvdmlkZXMgdGhlIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdAotCQkJICAgIGltcGxlbWVudHMgdGhlIGZ1bmN0aW9uCi0KLQlmdW5jdGlvbi1zaWduYXR1cmUgIFByb3ZpZGVzIHRoZSBzaWduYXR1cmUsIGFzIGluIHRoZSBKYXZhCi0JCQkgICAgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgb2YgdGhlIEphdmEKLQkJCSAgICBtZXRob2QgdGhhdCBpcyB0byBiZSB1c2VkIHRvIGltcGxlbWVudAotCQkJICAgIHRoZSBmdW5jdGlvbi4KLQotCWV4YW1wbGUgICAgICAgICAgICAgT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4KLQkJCSAgICBleGFtcGxlIG9mIGEgdXNlIG9mIHRoaXMgZnVuY3Rpb24KLQotCWZ1bmN0aW9uLWV4dGVuc2lvbiAgWmVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhCi0JCQkgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBmdW5jdGlvbiwgZm9yIHRvb2wKLQkJCSAgICBjb25zdW1wdGlvbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnRsZC1jYW5vbmljYWwtbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBBIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFByb3ZpZGVzIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgSmF2YQotCSAgICBjbGFzcyBjb250YWluaW5nIHRoZSBzdGF0aWMgbWV0aG9kIHRoYXQgaW1wbGVtZW50cwotCSAgICB0aGUgZnVuY3Rpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1zaWduYXR1cmUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBQcm92aWRlcyB0aGUgc2lnbmF0dXJlLCBvZiB0aGUgc3RhdGljIEphdmEgbWV0aG9kIHRoYXQgaXMKLQkgICAgdG8gYmUgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9uLiAgVGhlIHN5bnRheCBvZiB0aGUKLQkgICAgZnVuY3Rpb24tc2lnbmF0dXJlIGVsZW1lbnQgaXMgYXMgZm9sbG93czoKLQotCQlGdW5jdGlvblNpZ25hdHVyZSA6Oj0gUmV0dXJuVHlwZSBTIE1ldGhvZE5hbWUgUz8KLQkJCQkgICAgICAnKCcgUz8gUGFyYW1ldGVycz8gUz8gJyknCi0KLSAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICAgICA6Oj0gVHlwZQotCi0JCU1ldGhvZE5hbWUgICAgICAgIDo6PSBJZGVudGlmaWVyCi0KLQkJUGFyYW1ldGVycyAgICAgICAgOjo9ICAgUGFyYW1ldGVyCi0JCQkJICAgICAgfCAoIFBhcmFtZXRlciBTPyAnLCcgUz8gUGFyYW1ldGVycyApCi0KLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgICAgICAgICA6Oj0gVHlwZQotCi0JCVdoZXJlOgotCi0gCQkgICAgKiBUeXBlIGlzIGEgYmFzaWMgdHlwZSBvciBhIGZ1bGx5IHF1YWxpZmllZAotCQkgICAgICBKYXZhIGNsYXNzIG5hbWUgKGluY2x1ZGluZyBwYWNrYWdlIG5hbWUpLAotCQkgICAgICBhcyBwZXIgdGhlICdUeXBlJyBwcm9kdWN0aW9uIGluIHRoZSBKYXZhCi0JCSAgICAgIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIFNlY29uZCBFZGl0aW9uLAotCQkgICAgICBDaGFwdGVyIDE4LgotCi0gICAgICAgICAgICAgICAgICAgICogSWRlbnRpZmllciBpcyBhIEphdmEgaWRlbnRpZmllciwgYXMgcGVyCi0JCSAgICAgIHRoZSAnSWRlbnRpZmllcicgcHJvZHVjdGlvbiBpbiB0aGUgSmF2YQotCQkgICAgICBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCBTZWNvbmQKLQkJICAgICAgRWRpdGlvbiwgQ2hhcHRlciAxOC4KLQotCSAgICBFeGFtcGxlOgotCi0JICAgIGphdmEubGFuZy5TdHJpbmcgbmlja05hbWUoIGphdmEubGFuZy5TdHJpbmcsIGludCApCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGFtcGxlIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGV4YW1wbGUgZWxlbWVudCBjb250YWlucyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbgotCSAgICBvZiBhbiBleGFtcGxlIG9mIHRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLWV4dGVuc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOnRsZC1leHRlbnNpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRnVuY3Rpb24gZXh0ZW5zaW9ucyBhcmUgZm9yIHRvb2wgdXNlIG9ubHkgYW5kIG11c3Qgbm90Ci0gICAgICAgICAgICBhZmZlY3QgdGhlIGJlaGF2aW9yIG9mIGEgY29udGFpbmVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhZ0ZpbGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlEZWZpbmVzIGFuIGFjdGlvbiBpbiB0aGlzIHRhZyBsaWJyYXJ5IHRoYXQgaXMgaW1wbGVtZW50ZWQKLQlhcyBhIC50YWcgZmlsZS4KLQotCVRoZSB0YWctZmlsZSBlbGVtZW50IGhhcyB0d28gcmVxdWlyZWQgc3ViZWxlbWVudHM6Ci0KLQlkZXNjcmlwdGlvbiAgICAgICBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KLQotCWRpc3BsYXktbmFtZSAgICAgIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi0JCQkgIGRpc3BsYXllZCBieSB0b29scwotCi0JaWNvbiAgICAgICAgICAgICAgT3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQKLQkJCSAgYnkgdG9vbHMKLQotCW5hbWUgICAgICAgICAgICAgIFRoZSB1bmlxdWUgYWN0aW9uIG5hbWUKLQotCXBhdGggICAgICAgICAgICAgIFdoZXJlIHRvIGZpbmQgdGhlIC50YWcgZmlsZSBpbXBsZW1lbnRpbmcgdGhpcwotCQkJICBhY3Rpb24sIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIKLQkJCSAgYXBwbGljYXRpb24gb3IgdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlIGZvciBhCi0JCQkgIHRhZyBsaWJyYXJ5IHBhY2thZ2VkIGluIGEgSkFSLiAgVGhpcyBtdXN0Ci0JCQkgIGJlZ2luIHdpdGggL1dFQi1JTkYvdGFncyBpZiB0aGUgLnRhZyBmaWxlCi0JCQkgIHJlc2lkZXMgaW4gdGhlIFdBUiwgb3IgL01FVEEtSU5GL3RhZ3MgaWYgdGhlCi0JCQkgIC50YWcgZmlsZSByZXNpZGVzIGluIGEgSkFSLgotCi0JZXhhbXBsZSAgICAgICAgICAgT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4KLQkJCSAgZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIHRhZwotCi0JdGFnLWV4dGVuc2lvbiAgICAgWmVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhCi0JCQkgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnLCBmb3IgdG9vbAotCQkJICBjb25zdW1wdGlvbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnRsZC1jYW5vbmljYWwtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXRoIgotCQkgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGFtcGxlIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGV4YW1wbGUgZWxlbWVudCBjb250YWlucyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbgotCSAgICBvZiBhbiBleGFtcGxlIG9mIHRoZSB1c2Ugb2YgYSB0YWcuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWctZXh0ZW5zaW9uIgotCQkgICB0eXBlPSJqYXZhZWU6dGxkLWV4dGVuc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUYWcgZXh0ZW5zaW9ucyBhcmUgZm9yIHRvb2wgdXNlIG9ubHkgYW5kIG11c3Qgbm90IGFmZmVjdAotCSAgICB0aGUgYmVoYXZpb3Igb2YgYSBjb250YWluZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRhZyBkZWZpbmVzIGEgdW5pcXVlIHRhZyBpbiB0aGlzIHRhZyBsaWJyYXJ5LiAgSXQgaGFzIG9uZQotCWF0dHJpYnV0ZSwgaWQuCi0KLQlUaGUgdGFnIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoKLQotCWRlc2NyaXB0aW9uICAgICAgIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgotCi0JZGlzcGxheS1uYW1lICAgICAgQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKLQkJCSAgZGlzcGxheWVkIGJ5IHRvb2xzCi0KLQlpY29uICAgICAgICAgICAgICBPcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZAotCQkJICBieSB0b29scwotCi0JbmFtZSAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBhY3Rpb24gbmFtZQotCi0JdGFnLWNsYXNzICAgICAgICAgVGhlIHRhZyBoYW5kbGVyIGNsYXNzIGltcGxlbWVudGluZwotCQkJICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuSnNwVGFnCi0KLQl0ZWktY2xhc3MgICAgICAgICBBbiBvcHRpb25hbCBzdWJjbGFzcyBvZgotCQkJICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvCi0KLQlib2R5LWNvbnRlbnQgICAgICBUaGUgYm9keSBjb250ZW50IHR5cGUKLQotCXZhcmlhYmxlICAgICAgICAgIE9wdGlvbmFsIHNjcmlwdGluZyB2YXJpYWJsZSBpbmZvcm1hdGlvbgotCi0JYXR0cmlidXRlICAgICAgICAgQWxsIGF0dHJpYnV0ZXMgb2YgdGhpcyBhY3Rpb24gdGhhdCBhcmUKLQkJCSAgZXZhbHVhdGVkIHByaW9yIHRvIGludm9jYXRpb24uCi0KLQlkeW5hbWljLWF0dHJpYnV0ZXMgV2hldGhlciB0aGlzIHRhZyBzdXBwb3J0cyBhZGRpdGlvbmFsCi0JCQkgICBhdHRyaWJ1dGVzIHdpdGggZHluYW1pYyBuYW1lcy4gIElmCi0JCQkgICB0cnVlLCB0aGUgdGFnLWNsYXNzIG11c3QgaW1wbGVtZW50IHRoZQotCQkJICAgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkR5bmFtaWNBdHRyaWJ1dGVzCi0JCQkgICBpbnRlcmZhY2UuICBEZWZhdWx0cyB0byBmYWxzZS4KLQotCWV4YW1wbGUgICAgICAgICAgIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuCi0JCQkgIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyB0YWcKLQotCXRhZy1leHRlbnNpb24gICAgIFplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYQotCQkJICBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZywgZm9yIHRvb2wKLQkJCSAgY29uc3VtcHRpb24KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp0bGQtY2Fub25pY2FsLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnLWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcmx2ZXQuanNwLnRhZ2V4dC5Kc3BUYWcKLQkgICAgdGhhdCBpbXBsZW1lbnRzIHRoZSByZXF1ZXN0IHRpbWUgc2VtYW50aWNzIGZvcgotCSAgICB0aGlzIHRhZy4gKHJlcXVpcmVkKQotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVpLWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbwotCSAgICBmb3IgdGhpcyB0YWcuIChvcHRpb25hbCkKLQotCSAgICBJZiB0aGlzIGlzIG5vdCBnaXZlbiwgdGhlIGNsYXNzIGlzIG5vdCBjb25zdWx0ZWQgYXQKLQkgICAgdHJhbnNsYXRpb24gdGltZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJib2R5LWNvbnRlbnQiCi0JCSAgIHR5cGU9ImphdmFlZTpib2R5LWNvbnRlbnRUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgU3BlY2lmaWVzIHRoZSBmb3JtYXQgZm9yIHRoZSBib2R5IG9mIHRoaXMgdGFnLgotCSAgICBUaGUgZGVmYXVsdCBpbiBKU1AgMS4yIHdhcyAiSlNQIiBidXQgYmVjYXVzZSB0aGlzCi0JICAgIGlzIGFuIGludmFsaWQgc2V0dGluZyBmb3Igc2ltcGxlIHRhZyBoYW5kbGVycywgdGhlcmUKLQkgICAgaXMgbm8gbG9uZ2VyIGEgZGVmYXVsdCBpbiBKU1AgMi4wLiAgQSByZWFzb25hYmxlCi0JICAgIGRlZmF1bHQgZm9yIHNpbXBsZSB0YWcgaGFuZGxlcnMgaXMgInNjcmlwdGxlc3MiIGlmCi0JICAgIHRoZSB0YWcgY2FuIGhhdmUgYSBib2R5LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlIgotCQkgICB0eXBlPSJqYXZhZWU6dmFyaWFibGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIgotCQkgICB0eXBlPSJqYXZhZWU6dGxkLWF0dHJpYnV0ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkeW5hbWljLWF0dHJpYnV0ZXMiCi0JCSAgIHR5cGU9ImphdmFlZTpnZW5lcmljLWJvb2xlYW5UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGFtcGxlIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGV4YW1wbGUgZWxlbWVudCBjb250YWlucyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbgotCSAgICBvZiBhbiBleGFtcGxlIG9mIHRoZSB1c2Ugb2YgYSB0YWcuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWctZXh0ZW5zaW9uIgotCQkgICB0eXBlPSJqYXZhZWU6dGxkLWV4dGVuc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUYWcgZXh0ZW5zaW9ucyBhcmUgZm9yIHRvb2wgdXNlIG9ubHkgYW5kIG11c3Qgbm90IGFmZmVjdAotCSAgICB0aGUgYmVoYXZpb3Igb2YgYSBjb250YWluZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGxkLWF0dHJpYnV0ZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhdHRyaWJ1dGUgZWxlbWVudCBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcKLQl0YWcuICBUaGUgYXR0cmlidXRlIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cwotCWRlZmluaW5nOgotCi0JZGVzY3JpcHRpb24gICAgIGEgZGVzY3JpcHRpb24gb2YgdGhlIGF0dHJpYnV0ZQotCi0JbmFtZSAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLQotCXJlcXVpcmVkICAgICAgICB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3IKLQkJCW9wdGlvbmFsCi0KLQlydGV4cHJ2YWx1ZSAgICAgd2hldGhlciB0aGUgYXR0cmlidXRlIGlzIGEgcnVudGltZSBhdHRyaWJ1dGUKLQotCXR5cGUgICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlcwotCi0JZnJhZ21lbnQgICAgICAgIHdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUgaXMgYSBmcmFnbWVudAotCi0gICAgICAgIGRlZmVycmVkLXZhbHVlICBwcmVzZW50IGlmIHRoaXMgYXR0cmlidXRlIGlzIHRvIGJlIHBhcnNlZCBhcyBhCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24KLQotICAgICAgICBkZWZlcnJlZC1tZXRob2QgcHJlc2VudCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyB0byBiZSBwYXJzZWQgYXMgYQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguZWwuTWV0aG9kRXhwcmVzc2lvbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1aXJlZCIKLQkJICAgdHlwZT0iamF2YWVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yCi0JICAgIG9wdGlvbmFsLgotCi0JICAgIElmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lCi0JICAgIHRoZSBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2UgbWluT2NjdXJzPSIwIj4KLQkgICAgPHhzZDplbGVtZW50IG5hbWU9InJ0ZXhwcnZhbHVlIgotCQkgICAgICAgICB0eXBlPSJqYXZhZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSI+Ci0JICAgICAgPHhzZDphbm5vdGF0aW9uPgotCSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JCSAgRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgY2FuIGhhdmUgc2NyaXB0bGV0Ci0JCSAgZXhwcmVzc2lvbnMgYXMgYSB2YWx1ZSwgaS5lIHRoZSB2YWx1ZSBvZiB0aGUKLQkJICBhdHRyaWJ1dGUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQgYXQgcmVxdWVzdAotCQkgIHRpbWUsIGFzIG9wcG9zZWQgdG8gYSBzdGF0aWMgdmFsdWUgZGV0ZXJtaW5lZCBhdAotCQkgIHRyYW5zbGF0aW9uIHRpbWUuCi0JCSAgSWYgbm90IHByZXNlbnQgdGhlbiB0aGUgZGVmYXVsdCBpcyAiZmFsc2UiLCBpLmUgdGhlCi0JCSAgYXR0cmlidXRlIGhhcyBhIHN0YXRpYyB2YWx1ZQotCi0JICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0JICAgIDwveHNkOmVsZW1lbnQ+Ci0JICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlIgotCQkgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgICAgICAgbWluT2NjdXJzPSIwIj4KLQkgICAgICA8eHNkOmFubm90YXRpb24+Ci0JICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkJICBEZWZpbmVzIHRoZSBKYXZhIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMgdmFsdWUuCi0gICAgICAgICAgICAgICAgICBJZiB0aGlzIGVsZW1lbnQgaXMgb21pdHRlZCwgdGhlIGV4cGVjdGVkIHR5cGUgaXMKLSAgICAgICAgICAgICAgICAgIGFzc3VtZWQgdG8gYmUgImphdmEubGFuZy5PYmplY3QiLgotCi0JICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0JICAgIDwveHNkOmVsZW1lbnQ+Ci0JICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotCSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmZXJyZWQtdmFsdWUiCi0JCSAgICAgICAgIHR5cGU9ImphdmFlZTp0bGQtZGVmZXJyZWQtdmFsdWVUeXBlIgotCQkgICAgICAgICBtaW5PY2N1cnM9IjAiPgotCSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgUHJlc2VudCBpZiB0aGUgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlIGlzIHRvIGJlCi0gICAgICAgICAgICAgICAgICBwYXNzZWQgdG8gdGhlIHRhZyBoYW5kbGVyIGFzIGEKLSAgICAgICAgICAgICAgICAgIGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbi4gVGhpcyBhbGxvd3MgZm9yIGRlZmVycmVkCi0gICAgICAgICAgICAgICAgICBldmFsdWF0aW9uIG9mIEVMIGV4cHJlc3Npb25zLiBBbiBvcHRpb25hbCBzdWJlbGVtZW50Ci0gICAgICAgICAgICAgICAgICB3aWxsIGNvbnRhaW4gdGhlIGV4cGVjdGVkIHR5cGUgdGhhdCB0aGUgdmFsdWUgd2lsbAotICAgICAgICAgICAgICAgICAgYmUgY29lcmNlZCB0byBhZnRlciBldmFsdWF0aW9uIG9mIHRoZSBleHByZXNzaW9uLgotICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgZGVmYXVsdHMgdG8gT2JqZWN0IGlmIG9uZSBpcyBub3QgcHJvdmlkZWQuCi0KLQkgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgICAgPC94c2Q6ZWxlbWVudD4KLQkgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmVycmVkLW1ldGhvZCIKLQkJICAgICAgIHR5cGU9ImphdmFlZTp0bGQtZGVmZXJyZWQtbWV0aG9kVHlwZSIKLQkJICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0JICAgICAgPHhzZDphbm5vdGF0aW9uPgotCSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgUHJlc2VudCBpZiB0aGUgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlIGlzIHRvIGJlCi0gICAgICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSB0YWcgaGFuZGxlciBhcyBhCi0gICAgICAgICAgICAgICAgamF2YXguZWwuTWV0aG9kRXhwcmVzc2lvbi4gVGhpcyBhbGxvd3MgZm9yIGRlZmVycmVkCi0gICAgICAgICAgICAgICAgZXZhbHVhdGlvbiBvZiBhbiBFTCBleHByZXNzaW9uIHRoYXQgaWRlbnRpZmllcyBhCi0gICAgICAgICAgICAgICAgbWV0aG9kIHRvIGJlIGludm9rZWQgb24gYW4gT2JqZWN0LiBBbiBvcHRpb25hbAotICAgICAgICAgICAgICAgIHN1YmVsZW1lbnQgd2lsbCBjb250YWluIHRoZSBleHBlY3RlZCBtZXRob2QKLSAgICAgICAgICAgICAgICBzaWduYXR1cmUuIFRoZSBzaWduYXR1cmUgZGVmYXVsdHMgdG8gInZvaWQgbWV0aG9kKCkiCi0gICAgICAgICAgICAgICAgaWYgb25lIGlzIG5vdCBwcm92aWRlZC4KLQotCSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCSAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0KLQk8eHNkOmVsZW1lbnQgbmFtZT0iZnJhZ21lbnQiCi0JCSAgICAgdHlwZT0iamF2YWVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCi0JCSAgICAgbWluT2NjdXJzPSIwIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgInRydWUiIGlmIHRoaXMgYXR0cmlidXRlIGlzIG9mIHR5cGUKLQkgICAgICBqYXZheC5qc3AudGFnZXh0LkpzcEZyYWdtZW50LCByZXByZXNlbnRpbmcgZHluYW1pYwotCSAgICAgIGNvbnRlbnQgdGhhdCBjYW4gYmUgcmUtZXZhbHVhdGVkIGFzIG1hbnkgdGltZXMKLQkgICAgICBhcyBuZWVkZWQgYnkgdGhlIHRhZyBoYW5kbGVyLiAgSWYgb21pdHRlZCBvciAiZmFsc2UiLAotCSAgICAgIHRoZSBkZWZhdWx0IGlzIHN0aWxsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZC1jYW5vbmljYWwtbmFtZVR5cGUiPgotCi0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JRGVmaW5lcyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgYSB0YWcgb3IgYXR0cmlidXRlIGJlaW5nCi0JZGVmaW5lZC4KLQotCVRoZSBuYW1lIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYW4gTk1UT0tFTi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6eHNkTk1UT0tFTlR5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGxkLWRlZmVycmVkLW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBwcm92aWRlIHRoZSB2YWx1ZSBmb3IgYQotICAgICAgICB0YWcgaGFuZGxlciBhdHRyaWJ1dGUgdGhhdCBhY2NlcHRzIGEgamF2YXguZWwuTWV0aG9kRXhwcmVzc2lvbi4KLQotCVRoZSBkZWZlcnJlZC1tZXRob2QgZWxlbWVudCBoYXMgb25lIG9wdGlvbmFsIHN1YmVsZW1lbnQ6Ci0KLQltZXRob2Qtc2lnbmF0dXJlICBQcm92aWRlcyB0aGUgc2lnbmF0dXJlLCBhcyBpbiB0aGUgSmF2YQotICAgICAgICAgICAgICAgICAgICAgICAgICBMYW5ndWFnZSBTcGVjaWZpZXMsIHRoYXQgaXMgZXhwZWN0ZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZXRob2QgYmVpbmcgaWRlbnRpZmllZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2Qtc2lnbmF0dXJlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgUHJvdmlkZXMgdGhlIGV4cGVjdGVkIHNpZ25hdHVyZSBvZiB0aGUgbWV0aG9kIGlkZW50aWZpZWQKLSAgICAgICAgICAgIGJ5IHRoZSBqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uLgotCi0gICAgICAgICAgICBUaGlzIGRpc2FtYmlndWF0ZXMgb3ZlcmxvYWRlZCBtZXRob2RzIGFuZCBlbnN1cmVzIHRoYXQKLSAgICAgICAgICAgIHRoZSByZXR1cm4gdmFsdWUgaXMgb2YgdGhlIGV4cGVjdGVkIHR5cGUuCi0KLSAgICAgICAgICAgIFRoZSBzeW50YXggb2YgdGhlIG1ldGhvZC1zaWduYXR1cmUgZWxlbWVudCBpcyBpZGVudGljYWwKLSAgICAgICAgICAgIHRvIHRoYXQgb2YgdGhlIGZ1bmN0aW9uLXNpZ25hdHVyZSBlbGVtZW50LiAgU2VlIHRoZQotICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiBmb3IgZnVuY3Rpb24tc2lnbmF0dXJlIGZvciBtb3JlIGRldGFpbHMuCi0KLQkgICAgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBpcyBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcyBvbmx5Ci0JICAgIGFuZCBpcyBpZ25vcmVkIGJ5IHRoZSBKU1AgY29udGFpbmVyLgotCi0gICAgICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgICAgICAgIGJvb2xlYW4gdmFsaWRhdGUoamF2YS5sYW5nLlN0cmluZykKLQotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGxkLWRlZmVycmVkLXZhbHVlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIHByb3ZpZGUgdGhlIHZhbHVlIGZvciBhCi0gICAgICAgIHRhZyBoYW5kbGVyIGF0dHJpYnV0ZSB0aGF0IGFjY2VwdHMgYSBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24uCi0KLQlUaGUgZGVmZXJyZWQtdmFsdWUgZWxlbWVudCBoYXMgb25lIG9wdGlvbmFsIHN1YmVsZW1lbnQ6Ci0KLQl0eXBlICAgICAgICAgICAgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIHR5cGUgdGhhdCBpcyB0aGUKLSAgICAgICAgICAgIGV4cGVjdGVkIHR5cGUgZm9yIHRoaXMgZGVmZXJyZWQgZXhwcmVzc2lvbi4gIElmIHRoaXMKLSAgICAgICAgICAgIGVsZW1lbnQgaXMgb21pdHRlZCwgdGhlIGV4cGVjdGVkIHR5cGUgaXMgYXNzdW1lZCB0byBiZQotICAgICAgICAgICAgImphdmEubGFuZy5PYmplY3QiLgotCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0bGQtZXh0ZW5zaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRsZC1leHRlbnNpb25UeXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUKLQlleHRlbnNpb25zIHRvIGEgc3BlY2lmaWMgVExEIGVsZW1lbnQuCi0KLQlJdCBpcyB1c2VkIGJ5IGVsZW1lbnRzIHRvIGRlc2lnbmF0ZSBhbiBleHRlbnNpb24gYmxvY2sKLQl0aGF0IGlzIHRhcmdldGVkIHRvIGEgc3BlY2lmaWMgZXh0ZW5zaW9uIGRlc2lnbmF0ZWQgYnkKLQlhIHNldCBvZiBleHRlbnNpb24gZWxlbWVudHMgdGhhdCBhcmUgZGVjbGFyZWQgYnkgYQotCW5hbWVzcGFjZS4gVGhlIG5hbWVzcGFjZSBpZGVudGlmaWVzIHRoZSBleHRlbnNpb24gdG8KLQl0aGUgdG9vbCB0aGF0IHByb2Nlc3NlcyB0aGUgZXh0ZW5zaW9uLgotCi0JVGhlIHR5cGUgb2YgdGhlIGV4dGVuc2lvbi1lbGVtZW50IGlzIGFic3RyYWN0LiBUaGVyZWZvcmUsCi0JYSBjb25jcmV0ZSB0eXBlIG11c3QgYmUgc3BlY2lmaWVkIGJ5IHRoZSBUTEQgdXNpbmcKLQl4c2k6dHlwZSBhdHRyaWJ1dGUgZm9yIGVhY2ggZXh0ZW5zaW9uLWVsZW1lbnQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uLWVsZW1lbnQiCi0JCSAgIHR5cGU9ImphdmFlZTpleHRlbnNpYmxlVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIKLQkJICAgdXNlPSJyZXF1aXJlZCIKLQkJICAgdHlwZT0ieHNkOmFueVVSSSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLQotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGxkVGFnbGliVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRhZ2xpYiB0YWcgaXMgdGhlIGRvY3VtZW50IHJvb3QsIGl0IGRlZmluZXM6Ci0KLQlkZXNjcmlwdGlvbiAgICAgYSBzaW1wbGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlICJ1c2UiIG9mIHRoaXMKLQkJCXRhZ2xpYiwgc2hvdWxkIGJlIHVzZXIgZGlzY2VybmFibGUKLQotCWRpc3BsYXktbmFtZSAgICB0aGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYQotCQkJc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZAotCQkJYnkgdG9vbHMKLQotCWljb24gICAgICAgICAgICBvcHRpb25hbCBpY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKLQotCXRsaWItdmVyc2lvbiAgICB0aGUgdmVyc2lvbiBvZiB0aGUgdGFnIGxpYnJhcnkgaW1wbGVtZW50YXRpb24KLQotCXNob3J0LW5hbWUgICAgICBhIHNpbXBsZSBkZWZhdWx0IHNob3J0IG5hbWUgdGhhdCBjb3VsZCBiZQotCQkJdXNlZCBieSBhIEpTUCBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUKLQkJCW5hbWVzIHdpdGggYSBtbmVtb25pYyB2YWx1ZTsgZm9yIGV4YW1wbGUsCi0JCQl0aGUgaXQgbWF5IGJlIHVzZWQgYXMgdGhlIHByZWZlcmVkIHByZWZpeAotCQkJdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMKLQotCXVyaSAgICAgICAgICAgICBhIHVyaSB1bmlxdWVseSBpZGVudGlmeWluZyB0aGlzIHRhZ2xpYgotCi0JdmFsaWRhdG9yICAgICAgIG9wdGlvbmFsIFRhZ0xpYnJhcnlWYWxpZGF0b3IgaW5mb3JtYXRpb24KLQotCWxpc3RlbmVyICAgICAgICBvcHRpb25hbCBldmVudCBsaXN0ZW5lciBzcGVjaWZpY2F0aW9uCi0KLQl0YWcgICAgICAgICAgICAgdGFncyBpbiB0aGlzIHRhZyBsaWJyYXJ5Ci0KLQl0YWctZmlsZSAgICAgICAgdGFnIGZpbGVzIGluIHRoaXMgdGFnIGxpYnJhcnkKLQotCWZ1bmN0aW9uICAgICAgICB6ZXJvIG9yIG1vcmUgRUwgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcwotCQkJdGFnIGxpYnJhcnkKLQotCXRhZ2xpYi1leHRlbnNpb24gemVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhCi0JCQlpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZ2xpYiwgZm9yIHRvb2wKLQkJCWNvbnN1bXB0aW9uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGxpYi12ZXJzaW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGV3ZXktdmVyc2lvblR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZXNjcmliZXMgdGhpcyB2ZXJzaW9uIChudW1iZXIpIG9mIHRoZSB0YWdsaWJyYXJ5LgotCSAgICBJdCBpcyBkZXNjcmliZWQgYXMgYSBkZXdleSBkZWNpbWFsLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzaG9ydC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgYSBzaW1wbGUgZGVmYXVsdCBuYW1lIHRoYXQgY291bGQgYmUgdXNlZCBieQotCSAgICBhIEpTUCBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUgbmFtZXMgd2l0aCBhCi0JICAgIG1uZW1vbmljdmFsdWU7IGZvciBleGFtcGxlLCBpdCBtYXkgYmUgdXNlZCBhcyB0aGUKLQkgICAgcHJlZmVycmVkIHByZWZpeCB2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcy4gIERvCi0JICAgIG5vdCB1c2Ugd2hpdGUgc3BhY2UsIGFuZCBkbyBub3Qgc3RhcnQgd2l0aCBkaWdpdHMKLQkgICAgb3IgdW5kZXJzY29yZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVyaSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZEFueVVSSVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgYSBwdWJsaWMgVVJJIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzCi0JICAgIHZlcnNpb24gb2YgdGhlIHRhZ2xpYnJhcnkuICBMZWF2ZSBpdCBlbXB0eSBpZiBpdAotCSAgICBkb2VzIG5vdCBhcHBseS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbGlkYXRvciIKLQkJICAgdHlwZT0iamF2YWVlOnZhbGlkYXRvclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3RlbmVyIgotCQkgICB0eXBlPSJqYXZhZWU6bGlzdGVuZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnIgotCQkgICB0eXBlPSJqYXZhZWU6dGFnVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1maWxlIgotCQkgICB0eXBlPSJqYXZhZWU6dGFnRmlsZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bmN0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYi1leHRlbnNpb24iCi0JCSAgIHR5cGU9ImphdmFlZTp0bGQtZXh0ZW5zaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRhZ2xpYiBleHRlbnNpb25zIGFyZSBmb3IgdG9vbCB1c2Ugb25seSBhbmQgbXVzdCBub3QKLSAgICAgICAgICAgIGFmZmVjdCB0aGUgYmVoYXZpb3Igb2YgYSBjb250YWluZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRld2V5LXZlcnNpb25UeXBlIgotCQkgICBmaXhlZD0iMi4xIgotCQkgICB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIERlc2NyaWJlcyB0aGUgSlNQIHZlcnNpb24gKG51bWJlcikgdGhpcyB0YWdsaWJyYXJ5Ci0JICByZXF1aXJlcyBpbiBvcmRlciB0byBmdW5jdGlvbiAoZGV3ZXkgZGVjaW1hbCkKLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhbGlkYXRvclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCUEgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUKLQl0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzIHRhZyBsaWJyYXJ5IGlzCi0JZGVmaW5lZCBieSBhIHZhbGlkYXRvclR5cGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3ItY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgVGFnTGlicmFyeVZhbGlkYXRvciBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkCi0JICAgIHRvIHZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMKLQkgICAgdGFnIGxpYnJhcnkuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLQkJICAgdHlwZT0iamF2YWVlOnBhcmFtLXZhbHVlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMgYW4KLQkgICAgaW5pdGlhbGl6YXRpb24gcGFyYW0uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlLXNjb3BlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGRlZmluZXMgc2NvcGUgb2YgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4gIFNlZQotCVRhZ0V4dHJhSW5mbyBmb3IgZGV0YWlscy4gIFRoZSBhbGxvd2VkIHZhbHVlcyBhcmUsCi0JIk5FU1RFRCIsICJBVF9CRUdJTiIgYW5kICJBVF9FTkQiLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5FU1RFRCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUX0JFR0lOIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRfRU5EIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdmFyaWFibGVUeXBlIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBzY3JpcHRpbmcKLQl2YXJpYWJsZXMgZGVmaW5lZCBieSB1c2luZyB0aGlzIHRhZy4gIEl0IGlzIGEgKHRyYW5zbGF0aW9uCi0JdGltZSkgZXJyb3IgZm9yIGEgdGFnIHRoYXQgaGFzIG9uZSBvciBtb3JlIHZhcmlhYmxlCi0Jc3ViZWxlbWVudHMgdG8gaGF2ZSBhIFRhZ0V4dHJhSW5mbyBjbGFzcyB0aGF0IHJldHVybnMgYQotCW5vbi1udWxsIHZhbHVlIGZyb20gYSBjYWxsIHRvIGdldFZhcmlhYmxlSW5mbygpLgotCi0JVGhlIHN1YmVsZW1lbnRzIG9mIHZhcmlhYmxlVHlwZSBhcmUgb2YgdGhlIGZvcm06Ci0KLQlkZXNjcmlwdGlvbiAgICAgICAgICAgICAgT3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhpcwotCQkJCSB2YXJpYWJsZQotCi0JbmFtZS1naXZlbiAgICAgICAgICAgICAgIFRoZSB2YXJpYWJsZSBuYW1lIGFzIGEgY29uc3RhbnQKLQotCW5hbWUtZnJvbS1hdHRyaWJ1dGUgICAgICBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgd2hvc2UKLQkJCQkgKHRyYW5zbGF0aW9uIHRpbWUpIHZhbHVlIHdpbGwKLQkJCQkgZ2l2ZSB0aGUgbmFtZSBvZiB0aGUKLQkJCQkgdmFyaWFibGUuICBPbmUgb2YgbmFtZS1naXZlbiBvcgotCQkJCSBuYW1lLWZyb20tYXR0cmlidXRlIGlzIHJlcXVpcmVkLgotCi0JdmFyaWFibGUtY2xhc3MgICAgICAgICAgIE5hbWUgb2YgdGhlIGNsYXNzIG9mIHRoZSB2YXJpYWJsZS4KLQkJCQkgamF2YS5sYW5nLlN0cmluZyBpcyBkZWZhdWx0LgotCi0JZGVjbGFyZSAgICAgICAgICAgICAgICAgIFdoZXRoZXIgdGhlIHZhcmlhYmxlIGlzIGRlY2xhcmVkCi0JCQkJIG9yIG5vdC4gIFRydWUgaXMgdGhlIGRlZmF1bHQuCi0KLQlzY29wZSAgICAgICAgICAgICAgICAgICAgVGhlIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyYWlibGUKLQkJCQkgZGVmaW5lZC4gIE5FU1RFRCBpcyBkZWZhdWx0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1naXZlbiIKLQkJICAgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBuYW1lIGZvciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0KLQk8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1mcm9tLWF0dHJpYnV0ZSIKLQkJICAgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZQotCSAgICAgICh0cmFuc2xhdGlvbi10aW1lKSB2YWx1ZSB3aWxsIGdpdmUgdGhlIG5hbWUgb2YKLQkgICAgICB0aGUgdmFyaWFibGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZS1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBvcHRpb25hbCBuYW1lIG9mIHRoZSBjbGFzcyBmb3IgdGhlIHNjcmlwdGluZwotCSAgICB2YXJpYWJsZS4gIFRoZSBkZWZhdWx0IGlzIGphdmEubGFuZy5TdHJpbmcuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlY2xhcmUiCi0JCSAgIHR5cGU9ImphdmFlZTpnZW5lcmljLWJvb2xlYW5UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCi0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFdoZXRoZXIgdGhlIHNjcmlwdGluZyB2YXJpYWJsZSBpcyB0byBiZSBkZWZpbmVkCi0JICAgIG9yIG5vdC4gIFNlZSBUYWdFeHRyYUluZm8gZm9yIGRldGFpbHMuICBUaGlzCi0JICAgIGVsZW1lbnQgaXMgb3B0aW9uYWwgYW5kICJ0cnVlIiBpcyB0aGUgZGVmYXVsdC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY29wZSIKLQkJICAgdHlwZT0iamF2YWVlOnZhcmlhYmxlLXNjb3BlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVsZW1lbnQgaXMgb3B0aW9uYWwgYW5kICJORVNURUQiIGlzIHRoZSBkZWZhdWx0LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItcGFydGlhbHJlc3BvbnNlXzJfMC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1wYXJ0aWFscmVzcG9uc2VfMl8wLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkyNDliZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1wYXJ0aWFscmVzcG9uc2VfMl8wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uID0gIjEuMCIgZW5jb2RpbmcgPSAiVVRGLTgiPz4KLQotCi08eHNkOnNjaGVtYQotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIHhtbG5zOnhtbD0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICB2ZXJzaW9uPSIyLjAiPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0gICAgICAKLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICAgCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24KLSAgICAgIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZQotICAgICAgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICAgdGhlIExpY2Vuc2UuIFlvdSBjYW4gb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sIG9yCi0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0gICAgICBMaWNlbnNlLgotICAgICAgCi0gICAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlcgotICAgICAgTm90aWNlIGluIGVhY2ggZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0Ci0gICAgICBnbGFzc2Zpc2gvYm9vdHN0cmFwL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU3VuIGRlc2lnbmF0ZXMgdGhpcwotICAgICAgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcwotICAgICAgcHJvdmlkZWQgYnkgU3VuIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UgZmlsZQotICAgICAgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZwotICAgICAgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10KLSAgICAgIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICAgIlBvcnRpb25zIENvcHlyaWdodGVkIFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotICAgICAgCi0gICAgICBDb250cmlidXRvcihzKToKLSAgICAgIAotICAgICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZQotICAgICAgQ0RETCBvciBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZwotICAgICAgIltDb250cmlidXRvcl0gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTCBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91Ci0gICAgICBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYSByZWNpcGllbnQgaGFzIHRoZQotICAgICAgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlCi0gICAgICBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvIGl0cwotICAgICAgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyCi0gICAgICBjb2RlIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUKLSAgICAgIG9wdGlvbiBhcHBsaWVzIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoCi0gICAgICBvcHRpb24gYnkgdGhlIGNvcHlyaWdodCBob2xkZXIuCi0gICAgICAKLSAgICAgIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzCi0gICAgICBkaXN0cmlidXRpb24gdW5kZXIgdGhlIENEREwgbGljZW5zZS4KLSAgICAgIAotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgPCFbQ0RBVEFbCi0KLSAgICAgICAgICAgIFRoZSBYTUwgU2NoZW1hIGZvciB0aGUgSmF2YVNlcnZlciBGYWNlcyAoVmVyc2lvbiAyLjApICAKLSAgICAgICAgICAgIFBhcnRpYWwgUmVzcG9uc2UgdXNlZCBpbiBKU0YgQWpheCBmcmFtZXdvcmtzLgotCi0gICAgICAgICAgICBdXT4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV81LnhzZCIvPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDplbGVtZW50IG5hbWUgPSAicGFydGlhbC1yZXNwb25zZSIgdHlwZT0iamF2YWVlOnBhcnRpYWwtcmVzcG9uc2VUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJwYXJ0aWFsLXJlc3BvbnNlIiBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBwYXJ0aWFsIAotICAgICAgICAgICAgICAgIHJlc3BvbnNlIGluZm9ybWF0aW9uIGhpZXJhcmNoeSwgYW5kIGNvbnRhaW5zIG5lc3RlZCBlbGVtZW50cyBmb3IgYWxsCi0gICAgICAgICAgICAgICAgcG9zc2libGUgZWxlbWVudHMgdGhhdCBjYW4gZXhpc3QgaW4gdGhlIHJlc3BvbnNlLiAKLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJ0aWFsLXJlc3BvbnNlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAicGFydGlhbC1yZXNwb25zZSIgZWxlbWVudCBpcyB0aGUgcm9vdCBvZiB0aGVpIHBhcnRpYWwgCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UgaW5mb3JtYXRpb24gaGllcmFyY2h5LCBhbmQgY29udGFpbnMgbmVzdGVkIGVsZW1lbnRzIGZvciBhbGwKLSAgICAgICAgICAgICAgICBwb3NzaWJsZSBlbGVtZW50cyB0aGF0IGNhbiBleGlzdCBpbiB0aGUgcmVzcG9uc2UuIAotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2VzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGFydGlhbC1yZXNwb25zZS1jaGFuZ2VzVHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWRpcmVjdCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhcnRpYWwtcmVzcG9uc2UtcmVkaXJlY3RUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXJyb3IiIAotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwYXJ0aWFsLXJlc3BvbnNlLWVycm9yVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIAotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcnRpYWwtcmVzcG9uc2UtY2hhbmdlc1R5cGUiPgotICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cGRhdGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhcnRpYWwtcmVzcG9uc2UtdXBkYXRlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc2VydCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cGFydGlhbC1yZXNwb25zZS1pbnNlcnRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVsZXRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwYXJ0aWFsLXJlc3BvbnNlLWRlbGV0ZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwYXJ0aWFsLXJlc3BvbnNlLWF0dHJpYnV0ZXNUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZhbCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiZXZhbCIgZWxlbWVudCBlbmFibGVzIHRoaXMgZWxlbWVudCdzIGNvbnRlbnRzIHRvIGJlIGV4ZWN1dGVkIGFzIEphdmFTY3JpcHQuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBhcnRpYWwtcmVzcG9uc2UtZXh0ZW5zaW9uVHlwZSIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFydGlhbC1yZXNwb25zZS11cGRhdGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPiAKLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAidXBkYXRlIiBlbGVtZW50IGVuYWJsZXMgRE9NIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSAiaWQiCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlIHRvIGJlIHVwZGF0ZWQgd2l0aCB0aGUgY29udGVudHMgb2YgdGhpcyBlbGVtZW50LiAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJ0aWFsLXJlc3BvbnNlLWluc2VydFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+IAotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgImluc2VydCIgZWxlbWVudCBlbmFibGVzIGNvbnRlbnQgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NCi0gICAgICAgICAgICAgICAgYmVmb3JlIG9yIGFmdGVyIGFuIGV4aXN0aW5nIERPTSBlbGVtZW50IGFzIHNwZWNpZmllZCBieSB0aGUKLSAgICAgICAgICAgICAgICBuZXN0ZWQgImJlZm9yZSIgb3IgImFmdGVyIiBlbGVtZW50cy4gIFRoZSBlbGVtZW50cyAiYmVmb3JlIiBhbmQKLSAgICAgICAgICAgICAgICAiYWZ0ZXIiIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgLSBvbmUgb2YgdGhlbSBtdXN0IGJlIHNwZWNpZmllZC4gCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJlZm9yZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWZ0ZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcnRpYWwtcmVzcG9uc2UtZGVsZXRlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4gCi0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAiZGVsZXRlIiBlbGVtZW50IGVuYWJsZXMgRE9NIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSAiaWQiCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlIHRvIGJlIHJlbW92ZWQuIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFydGlhbC1yZXNwb25zZS1hdHRyaWJ1dGVzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4gCi0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAiYXR0cmlidXRlcyIgZWxlbWVudCBlbmFibGVzIGF0dHJpYnV0ZXMgb2YgRE9NIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSAiaWQiCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlIHRvIGJlIHVwZGF0ZWQuICBJZiB0aGlzIGVsZW1lbnQgaXMgdXNlZCwgdGhlbiBpdCBtdXN0IGNvbnRhaW4gYXQKLSAgICAgICAgICAgICAgICBsZWFzdCBvbmUgImF0dHJpYnV0ZSIgZWxlbWVudC4gCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJ0aWFsLXJlc3BvbnNlLXJlZGlyZWN0VHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4gCi0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAicmVkaXJlY3QiIGVsZW1lbnQgZW5hYmxlcyBhIHJlZGlyZWN0IHRvIHRoZSBsb2NhdGlvbiBhcyBzcGVjaWZpZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgInVybCIgYXR0cmlidXRlLiAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cmwiIHR5cGU9InhzZDphbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFydGlhbC1yZXNwb25zZS1lcnJvclR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+IAotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgImVycm9yIiBlbGVtZW50IGNvbnRhaW5zIGVycm9yIGluZm9ybWF0aW9uIGZyb20gdGhlIHNlcnZlci4gCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlcnJvci1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVycm9yLW1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJ0aWFsLXJlc3BvbnNlLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIHBhcnRpYWwgcmVzcG9uc2UuICBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDk3YjlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgcHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcwotQnVuZGxlLU5hbWUuMCA9IEphdmEgRUUgUmVsYXRlZCBTY2hlbWFzCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiMDY5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQotICAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgICA8IS0tIENhdGFsb2cgQ29udHJpYnV0aW9ucyAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBSZWdpc3RlciB3ZWxsIGtub3duIFdlYiBEVERzIGFuZCBYU0RzICAgIC0tPgotICAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jYXRhbG9nQ29udHJpYnV0aW9ucyI+Ci0gICAgICAgIDxjYXRhbG9nQ29udHJpYnV0aW9uIGlkPSJkZWZhdWx0Ij4KLQotCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuMi8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl8xXzIuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvYXBwbGljYXRpb25fMV8yLmR0ZCIgLz4KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4zLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzFfMy5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzMuZHRkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzFfNC54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uXzUueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fNS54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uXzYueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fNi54c2QiIC8+Ci0KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiBDbGllbnQgMS4yLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzIuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvYXBwbGljYXRpb24tY2xpZW50XzFfMi5kdGQiIC8+Ci0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIENsaWVudCAxLjMvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzFfMy5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbi1jbGllbnRfMV8zLmR0ZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb24tY2xpZW50XzYueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzYueHNkIiAvPgotCi0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIENvbm5lY3RvciAxLjAvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvY29ubmVjdG9yXzFfMC5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9jb25uZWN0b3JfMV8wLmR0ZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvY29ubmVjdG9yXzFfNS54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9jb25uZWN0b3JfMV82LnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2Nvbm5lY3Rvcl8xXzYueHNkIiAvPgotCi0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9lamItamFyXzFfMS5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy9lamItamFyXzFfMS5kdGQiIC8+Ci0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8yXzAuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZWpiLWphcl8yXzAuZHRkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvZWpiLWphcl8yXzEueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8yXzEueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9lamItamFyXzNfMC54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9lamItamFyXzNfMC54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2VqYi1qYXJfM18xLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfM18xLnhzZCIgLz4KLQotCi0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS8iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qMmVlXzFfNC54c2QiIC8+Ci0KLQotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkIiAvPgotCi0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL3hzZC9qMmVlX2pheHJwY19tYXBwaW5nXzFfMS54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qMmVlX2pheHJwY19tYXBwaW5nXzFfMS54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL3hzZC9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2QiIC8+Ci0KLQotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfNS54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qYXZhZWVfNS54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2phdmFlZV82LnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2phdmFlZV82LnhzZCIgLz4KLQotCi0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2phdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2phdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzMueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzMueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8yLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8zLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2phdmFlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMy54c2QiIC8+Ci0KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2pzcF8yXzAueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvanNwXzJfMC54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9qc3BfMl8xLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2pzcF8yXzEueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvanNwXzJfMi54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qc3BfMl8yLnhzZCIgLz4KLQotCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4yLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl8yLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL3dlYi1hcHBfMi4yLmR0ZCIgLz4KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzMuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIiAvPgotCi0KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl80LnhzZCIgLz4KLQotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy93ZWItYXBwXzJfNS54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfM18wLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWNvbW1vbl8zXzAueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWNvbW1vbl8zXzAueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZnJhZ21lbnRfM18wLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3dlYi1mcmFnbWVudF8zXzAueHNkIiAvPgotCi0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjEvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMV8xLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMS5kdGQiIC8+Ci0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItanNwdGFnbGlicmFyeV8yXzAueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMl8wLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWpzcHRhZ2xpYnJhcnlfMl8xLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMS54c2QiIC8+Ci0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8wLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzAuZHRkIiAvPgotCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjEvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgLz4KLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIiAvPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybV8xXzAueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvb3JtXzFfMC54c2QiIC8+Ci0gICAKLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZV8xXzAueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvcGVyc2lzdGVuY2VfMV8wLnhzZCIgLz4gICAKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm1fMl8wLnhzZCIKLSAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvb3JtXzJfMC54c2QiIC8+Ci0gICAgICAgCi0gICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlXzJfMC54c2QiCi0gICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3BlcnNpc3RlbmNlXzJfMC54c2QiIC8+Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEZhY2VsZXQgVGFnbGliIDEuMC8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9mYWNlbGV0LXRhZ2xpYl8xXzAuZHRkIi8+Ci0KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VsZXR0YWdsaWJyYXJ5XzJfMC54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy93ZWItZmFjZWxldHRhZ2xpYnJhcnlfMl8wLnhzZCIvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMl8wLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc2NvbmZpZ18yXzAueHNkIi8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc3VpY29tcG9uZW50XzJfMC54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy93ZWItZmFjZXN1aWNvbXBvbmVudF8yXzAueHNkIi8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1wYXJ0aWFscmVzcG9uc2VfMl8wLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3dlYi1wYXJ0aWFscmVzcG9uc2VfMl8wLnhzZCIvPgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDwvY2F0YWxvZ0NvbnRyaWJ1dGlvbj4KLQotICAgIDwvZXh0ZW5zaW9uPgotCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNGYxMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy93M2MvZG9tL2Nzcy8qKi8qIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC94bWwvY29yZS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiZjY3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1jc3Ntb2RlbC5qYXIKLWJ1aWxkLnhtbAotZGV2LnByb3BlcnRpZXMKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MDk3NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9kZWJ1Zz10cnVlCi1vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvZGVidWcvdHJhY2VmaWx0ZXI9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIwNDZlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jc3MuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkYzIwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0jV2VkIE1hciAyOCAwMzoxMzo1MiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2Q1NWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjUwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXA7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50aW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkiLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRhc2tzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXh0Ci1JbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudXRpbDsgdmVyc2lvbj0iMy44IgotUmVxdWlyZS1CdW5kbGU6IG9yZy5hcGFjaGUueGVyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMi45LjAsMy4wLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjUwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eTtleGNsdWRlOj0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlMjJmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBjc3Nwcm9maWxlLyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbAotc291cmNlLi4gPSBzcmMvCi0gICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzYwMzNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY3NzIj4KLQk8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vZWNsaXBzZS5vcmcvd2VidG9vbHMvd3N0L2NvbXBvbmVudHMvY3NzL292ZXJ2aWV3Lmh0bWwiPjwvZGVzY3JpcHRpb24+Ci0JPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5wcm9wZXJ0aWVzIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUyIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iQ1NTQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3MtcHJvZmlsZS5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzcy1wcm9maWxlLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmViM2VmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzcy1wcm9maWxlLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi08IS0tIERURCBmb3IgQ1NTIE1ldGEgTW9kZWwgUHJvZmlsZSAtLT4KLTwhLS0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAtLT4KLTwhLS0gRW50aXRpZXMgLS0+Ci0KLTwhLS0gbmFtZS1kZWZpbml0aW9uCTogSW4gZGVmaW5pbmcgbWV0YSBtb2RlbCBvYmplY3QsIG9iamVjdCBuYW1lIC0tPgotPCEtLSBpcyBnaXZlbiBieSB1c2luZyB0aGlzIGF0dHJpYnV0ZS4gLS0+Ci0KLTwhRU5USVRZICUgbmFtZS1kZWZpbml0aW9uICduYW1lIENEQVRBICNSRVFVSVJFRCcgPgotCi08IS0tIG5hbWUtcmVmZXJlbmNlCQk6IHVzZWQgdG8gcmVmZXIgbWV0YSBtb2RlbCBvYmplY3QgdGhhdCBkZWZpbmVkIC0tPgotPCEtLSBieSBuYW1lLWRlZmluaXRpb24gLS0+Ci0KLTwhRU5USVRZICUgbmFtZS1yZWZlcmVuY2UgJ25hbWUgQ0RBVEEgI1JFUVVJUkVEJyA+Ci0KLTwhLS0gYXZhaWxhYmlsaXR5CQk6IENTUyBNZXRhIE1vZGVsIFByb2ZpbGUgcGVybWl0IGltcG9ydGluZyAtLT4KLTwhLS0gb3RoZXIgcHJvZmlsZSBhbmQgZGVzY3JpYmUgZGlmZmVyZW5jZSBmb3IgaXQuIC0tPgotCi08IUVOVElUWSAlIGF2YWlsYWJpbGl0eSAnZW5hYmxlZCAodHJ1ZSB8IGZhbHNlKSAidHJ1ZSInID4KLTwhRU5USVRZICUgb3ZlcndyaXRlICdvdmVyd3JpdGUgKHRydWUgfCBmYWxzZSkgImZhbHNlIicgPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqIC0tPgotPCEtLSAgZWxtZW50cy9hdHRyaWJ1dGVzICAtLT4KLTwhLS0gKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTwhRUxFTUVOVCBjc3MtcHJvZmlsZSAocHJvZmlsZS1pbXBvcnQ/ICwgKHN0eWxlc2hlZXQtZGVmIHwgY2hhcnNldC1ydWxlLWRlZiB8IGltcG9ydC1ydWxlLWRlZiB8IHBhZ2UtcnVsZS1kZWYgfCBtZWRpYS1ydWxlLWRlZiB8IGZvbnRmYWNlLXJ1bGUtZGVmIHwgc3R5bGUtcnVsZS1kZWYgfCBwcm9wZXJ0eS1kZWYgfCBkZXNjcmlwdG9yLWRlZiB8IGNvbnRhaW5lci1kZWYgfCBmdW5jdGlvbi1kZWYgfCBudW1iZXItZGVmIHwgdW5pdC1kZWYgfCBrZXl3b3JkLWRlZiB8IGNhdGVnb3J5LWRlZiB8IHBzZXVkby1lbGVtZW50LWRlZiB8IHBzZXVkby1jbGFzcy1kZWYpKikgPgotCi08IS0tIGEgcHJvZmlsZSBjYW4gaW5jbHVkZSBvdGhlciBwcm9maWxlIC0tPgotCi08IUVMRU1FTlQgcHJvZmlsZS1pbXBvcnQgRU1QVFkgPgotPCFBVFRMSVNUIHByb2ZpbGUtaW1wb3J0IG5hbWUgQ0RBVEEgI1JFUVVJUkVEID4KLQotPCEtLSB3aGljaCB0eXBlIG9mIHJ1bGUgY2FuIGJlIHVzZWQ/IC0tPgotCi08IUVMRU1FTlQgc3R5bGVzaGVldC1kZWYgKGRlc2NyaXB0aW9uPyAsIChjaGFyc2V0LXJ1bGUgfCBpbXBvcnQtcnVsZSB8IHBhZ2UtcnVsZSB8IG1lZGlhLXJ1bGUgfCBmb250ZmFjZS1ydWxlIHwgc3R5bGUtcnVsZSkqKSA+Ci08IUFUVExJU1Qgc3R5bGVzaGVldC1kZWYgJW92ZXJ3cml0ZTsgPgotCi08IUVMRU1FTlQgY2hhcnNldC1ydWxlIEVNUFRZID4KLTwhQVRUTElTVCBjaGFyc2V0LXJ1bGUgJWF2YWlsYWJpbGl0eTsgPgotPCFFTEVNRU5UIGltcG9ydC1ydWxlIEVNUFRZID4KLTwhQVRUTElTVCBpbXBvcnQtcnVsZSAlYXZhaWxhYmlsaXR5OyA+Ci08IUVMRU1FTlQgcGFnZS1ydWxlIEVNUFRZID4KLTwhQVRUTElTVCBwYWdlLXJ1bGUgJWF2YWlsYWJpbGl0eTsgPgotPCFFTEVNRU5UIG1lZGlhLXJ1bGUgRU1QVFkgPgotPCFBVFRMSVNUIG1lZGlhLXJ1bGUgJWF2YWlsYWJpbGl0eTsgPgotPCFFTEVNRU5UIGZvbnRmYWNlLXJ1bGUgRU1QVFkgPgotPCFBVFRMSVNUIGZvbnRmYWNlLXJ1bGUgJWF2YWlsYWJpbGl0eTsgPgotPCFFTEVNRU5UIHN0eWxlLXJ1bGUgRU1QVFkgPgotPCFBVFRMSVNUIHN0eWxlLXJ1bGUgJWF2YWlsYWJpbGl0eTsgPgotCi08IUVMRU1FTlQgY2hhcnNldC1ydWxlLWRlZiAoZGVzY3JpcHRpb24/KSA+Ci08IUFUVExJU1QgY2hhcnNldC1ydWxlLWRlZiAlb3ZlcndyaXRlOyA+Ci0KLTwhRUxFTUVOVCBpbXBvcnQtcnVsZS1kZWYgKGRlc2NyaXB0aW9uPykgPgotPCFBVFRMSVNUIGltcG9ydC1ydWxlLWRlZiAlb3ZlcndyaXRlOyA+Ci0KLTwhRUxFTUVOVCBwYWdlLXJ1bGUtZGVmIChkZXNjcmlwdGlvbj8gLCAocHJvcGVydHkgfCBwc2V1ZG8tY2xhc3MpKikgPgotPCFBVFRMSVNUIHBhZ2UtcnVsZS1kZWYgJW92ZXJ3cml0ZTsgPgotCi08IUVMRU1FTlQgbWVkaWEtcnVsZS1kZWYgKGRlc2NyaXB0aW9uPykgPgotPCFBVFRMSVNUIG1lZGlhLXJ1bGUtZGVmICVvdmVyd3JpdGU7ID4KLQotPCFFTEVNRU5UIGZvbnRmYWNlLXJ1bGUtZGVmIChkZXNjcmlwdGlvbj8gLCBkZXNjcmlwdG9yKikgPgotPCFBVFRMSVNUIGZvbnRmYWNlLXJ1bGUtZGVmICVvdmVyd3JpdGU7ID4KLQotPCFFTEVNRU5UIHN0eWxlLXJ1bGUtZGVmIChkZXNjcmlwdGlvbj8gLCAocHJvcGVydHkgfCBzZWxlY3Rvci1leHByZXNzaW9uIHwgcHNldWRvLWNsYXNzIHwgcHNldWRvLWVsZW1lbnQpKikgPgotPCFBVFRMSVNUIHN0eWxlLXJ1bGUtZGVmICVvdmVyd3JpdGU7ID4KLQotPCFFTEVNRU5UIHNlbGVjdG9yLWV4cHJlc3Npb24gRU1QVFkgPgotPCFBVFRMSVNUIHNlbGVjdG9yLWV4cHJlc3Npb24gbmFtZSAoZGVzY2VuZGFudCB8IGNoaWxkIHwgYWRqYWNlbnQgfCB1bml2ZXJzYWwgfCBhdHRyaWJ1dGUpICNSRVFVSVJFRCAlYXZhaWxhYmlsaXR5OyA+Ci0KLTwhRUxFTUVOVCBwc2V1ZG8tY2xhc3MgRU1QVFkgPgotPCFBVFRMSVNUIHBzZXVkby1jbGFzcyAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4KLQotPCFFTEVNRU5UIHBzZXVkby1lbGVtZW50IEVNUFRZID4KLTwhQVRUTElTVCBwc2V1ZG8tZWxlbWVudCAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4KLQotPCFFTEVNRU5UIHBzZXVkby1jbGFzcy1kZWYgKGRlc2NyaXB0aW9uPywgc2VsZWN0b3ItdmFsdWUpID4KLTwhQVRUTElTVCBwc2V1ZG8tY2xhc3MtZGVmICVuYW1lLWRlZmluaXRpb247ICVvdmVyd3JpdGU7ID4KLTwhRUxFTUVOVCBzZWxlY3Rvci12YWx1ZSAoI1BDREFUQSkgPgotCi08IUVMRU1FTlQgcHNldWRvLWVsZW1lbnQtZGVmIChkZXNjcmlwdGlvbj8sIHNlbGVjdG9yLXZhbHVlKSA+Ci08IUFUVExJU1QgcHNldWRvLWVsZW1lbnQtZGVmICVuYW1lLWRlZmluaXRpb247ICVvdmVyd3JpdGU7ID4KLQotPCFFTEVNRU5UIGtleXdvcmQtZGVmIChkZXNjcmlwdGlvbj8gLCBrZXl3b3JkLXZhbHVlKSA+Ci08IUFUVExJU1Qga2V5d29yZC1kZWYgJW5hbWUtZGVmaW5pdGlvbjsgJW92ZXJ3cml0ZTsgPgotPCFFTEVNRU5UIGtleXdvcmQtdmFsdWUgKCNQQ0RBVEEpID4KLTwhRUxFTUVOVCBkZXNjcmlwdGlvbiAoI1BDREFUQSkgPgotCi08IUVMRU1FTlQgZnVuY3Rpb24tZGVmIChkZXNjcmlwdGlvbj8gLCBmdW5jdGlvbi12YWx1ZSkgPgotPCFBVFRMSVNUIGZ1bmN0aW9uLWRlZiAlbmFtZS1kZWZpbml0aW9uOyAlb3ZlcndyaXRlOyA+Ci08IUVMRU1FTlQgZnVuY3Rpb24tdmFsdWUgKCNQQ0RBVEEpID4KLQotPCFFTEVNRU5UIG51bWJlci1kZWYgKGRlc2NyaXB0aW9uPyAsIHVuaXQqKSA+Ci08IUFUVExJU1QgbnVtYmVyLWRlZiAlbmFtZS1kZWZpbml0aW9uOyAlb3ZlcndyaXRlOyA+Ci08IUVMRU1FTlQgdW5pdCBFTVBUWSA+Ci08IUFUVExJU1QgdW5pdCAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4KLQotPCFFTEVNRU5UIHVuaXQtZGVmIChkZXNjcmlwdGlvbj8gLCB1bml0LXZhbHVlKSA+Ci08IUFUVExJU1QgdW5pdC1kZWYgJW5hbWUtZGVmaW5pdGlvbjsgJW92ZXJ3cml0ZTsgPgotPCFFTEVNRU5UIHVuaXQtdmFsdWUgKCNQQ0RBVEEpID4KLQotPCFFTEVNRU5UIGNvbnRhaW5lci1kZWYgKGRlc2NyaXB0aW9uPyAsIChudW1iZXIgfCBrZXl3b3JkIHwgZnVuY3Rpb24gfCBjb250YWluZXIpKikgPgotPCFBVFRMSVNUIGNvbnRhaW5lci1kZWYgJW5hbWUtZGVmaW5pdGlvbjsgJW92ZXJ3cml0ZTsgPgotCi08IUVMRU1FTlQgY2F0ZWdvcnktZGVmIChkZXNjcmlwdGlvbj8sIGNhcHRpb24pID4KLTwhQVRUTElTVCBjYXRlZ29yeS1kZWYgJW5hbWUtZGVmaW5pdGlvbjsgJW92ZXJ3cml0ZTsgPgotPCFFTEVNRU5UIGNhcHRpb24gKCNQQ0RBVEEpID4KLQotPCFFTEVNRU5UIHByb3BlcnR5LWRlZiAoZGVzY3JpcHRpb24/ICwgKG51bWJlciB8IGtleXdvcmQgfCBmdW5jdGlvbiB8IGNvbnRhaW5lciB8IHN0cmluZyB8IHNlcGFyYXRvciB8IHByb3BlcnR5KSopID4KLTwhQVRUTElTVCBwcm9wZXJ0eS1kZWYgJW5hbWUtZGVmaW5pdGlvbjsgJW92ZXJ3cml0ZTsKLQkJCQkJICAgaW5oZXJpdGVkICh5ZXMgfCBubyB8IG5hKSAibmEiCi0JCQkJCSAgIG1lZGlhZ3JvdXAgQ0RBVEEgI0lNUExJRUQKLQkJCQkJICAgY2F0ZWdvcnkgQ0RBVEEgI0lNUExJRUQgPgotPCFFTEVNRU5UIGRlc2NyaXB0b3ItZGVmIChkZXNjcmlwdGlvbj8sIChudW1iZXIgfCBrZXl3b3JkIHwgZnVuY3Rpb24gfCBjb250YWluZXIgfCBzdHJpbmcgfCBzZXBhcmF0b3IgfCBwcm9wZXJ0eSkqKSA+Ci08IUFUVExJU1QgZGVzY3JpcHRvci1kZWYgJW5hbWUtZGVmaW5pdGlvbjsgJW92ZXJ3cml0ZTsgPgotCi08IUVMRU1FTlQgbnVtYmVyIEVNUFRZID4KLTwhQVRUTElTVCBudW1iZXIgJW5hbWUtcmVmZXJlbmNlOyAlYXZhaWxhYmlsaXR5OyA+IAotPCFFTEVNRU5UIGtleXdvcmQgRU1QVFkgPgotPCFBVFRMSVNUIGtleXdvcmQgJW5hbWUtcmVmZXJlbmNlOyAlYXZhaWxhYmlsaXR5OyA+IAotPCFFTEVNRU5UIGZ1bmN0aW9uIEVNUFRZID4KLTwhQVRUTElTVCBmdW5jdGlvbiAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4KLTwhRUxFTUVOVCBjb250YWluZXIgRU1QVFkgPgotPCFBVFRMSVNUIGNvbnRhaW5lciAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4gCi08IUVMRU1FTlQgc3RyaW5nIEVNUFRZID4KLTwhQVRUTElTVCBzdHJpbmcgJW5hbWUtcmVmZXJlbmNlOyAlYXZhaWxhYmlsaXR5OyA+Ci08IUVMRU1FTlQgc2VwYXJhdG9yIEVNUFRZID4KLTwhQVRUTElTVCBzZXBhcmF0b3IgbmFtZSAoY29tbWEgfCBzbGFzaCkgI1JFUVVJUkVEICVhdmFpbGFiaWxpdHk7ID4KLTwhRUxFTUVOVCBwcm9wZXJ0eSBFTVBUWSA+Ci08IUFUVExJU1QgcHJvcGVydHkgJW5hbWUtcmVmZXJlbmNlOyAlYXZhaWxhYmlsaXR5OyA+IAotPCFFTEVNRU5UIGRlc2NyaXB0b3IgRU1QVFkgPgotPCFBVFRMSVNUIGRlc2NyaXB0b3IgJW5hbWUtcmVmZXJlbmNlOyAlYXZhaWxhYmlsaXR5OyA+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYTBlZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLWNzczEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPCEtLTwhRE9DVFlQRSBjc3MtcHJvZmlsZSBTWVNURU0gImNzcy1wcm9maWxlLmR0ZCIgPi0tPgotPGNzcy1wcm9maWxlPgotCTxzdHlsZXNoZWV0LWRlZj4KLQkJPGRlc2NyaXB0aW9uPiVjc3MxLnN0eWxlc2hlZXQtZGVmLmRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLQkJPGltcG9ydC1ydWxlLz4KLQkJPHN0eWxlLXJ1bGUvPgotCTwvc3R5bGVzaGVldC1kZWY+Ci0KLQk8aW1wb3J0LXJ1bGUtZGVmPgotCTwvaW1wb3J0LXJ1bGUtZGVmPgotCi0JPHN0eWxlLXJ1bGUtZGVmPgotCQk8c2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lPSJkZXNjZW5kYW50Ii8+Ci0JCTxwc2V1ZG8tZWxlbWVudCBuYW1lPSJmaXJzdC1saW5lIi8+Ci0JCTxwc2V1ZG8tZWxlbWVudCBuYW1lPSJmaXJzdC1sZXR0ZXIiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJsaW5rIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0idmlzaXRlZCIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImFjdGl2ZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1hdHRhY2htZW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWNvbG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWltYWdlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLXBvc2l0aW9uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLXJlcGVhdCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItYm90dG9tIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItYm90dG9tLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1sZWZ0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItbGVmdC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXJpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItcmlnaHQtd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXRvcCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXRvcC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjbGVhciIvPgotCQk8cHJvcGVydHkgbmFtZT0iY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRpc3BsYXkiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZsb2F0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LWZhbWlseSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zaXplIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXZhcmlhbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtd2VpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJoZWlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxldHRlci1zcGFjaW5nIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaW5lLWhlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZS1pbWFnZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZS1wb3NpdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZS10eXBlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJnaW4iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbi1ib3R0b20iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbi1sZWZ0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJnaW4tcmlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbi10b3AiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZGRpbmciLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZGRpbmctYm90dG9tIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWRkaW5nLWxlZnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZGRpbmctcmlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZGRpbmctdG9wIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LWFsaWduIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LWRlY29yYXRpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtaW5kZW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LXRyYW5zZm9ybSIvPgotCQk8cHJvcGVydHkgbmFtZT0idmVydGljYWwtYWxpZ24iLz4KLQkJPHByb3BlcnR5IG5hbWU9IndoaXRlLXNwYWNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0id29yZC1zcGFjaW5nIi8+Ci0JPC9zdHlsZS1ydWxlLWRlZj4KLQotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9ImxpbmsiPgotCQk8c2VsZWN0b3ItdmFsdWU+bGluazwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9InZpc2l0ZWQiPgotCQk8c2VsZWN0b3ItdmFsdWU+dmlzaXRlZDwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9ImFjdGl2ZSI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5hY3RpdmU8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQotCTxwc2V1ZG8tZWxlbWVudC1kZWYgbmFtZT0iZmlyc3QtbGluZSI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5maXJzdC1saW5lPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1lbGVtZW50LWRlZj4KLQk8cHNldWRvLWVsZW1lbnQtZGVmIG5hbWU9ImZpcnN0LWxldHRlciI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5maXJzdC1sZXR0ZXI8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWVsZW1lbnQtZGVmPgotCi0JPCEtLSBwcm9wZXJ0eSBkZWZpbml0aW9uIC0tPgotCi0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtY29sb3IiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtaW1hZ2UiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtcmVwZWF0Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtcG9zaXRpb24iLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtYXR0YWNobWVudCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InNjcm9sbCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJmaXhlZCIvPgotICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZC1jb2xvciIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0gICAgICAgIDxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0idHJhbnNwYXJlbnQiLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtaW1hZ2UiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotICAgICAgICA8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtcG9zaXRpb24iIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPGtleXdvcmQgbmFtZT0idG9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNlbnRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJib3R0b20iLz4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZC1yZXBlYXQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotCQk8a2V5d29yZCBuYW1lPSJyZXBlYXQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmVwZWF0LXgiLz4KLQkJPGtleXdvcmQgbmFtZT0icmVwZWF0LXkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm8tcmVwZWF0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXIiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWNvbG9yIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXN0eWxlIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJkb3R0ZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iZGFzaGVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNvbGlkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImRvdWJsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJncm9vdmUiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlkZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5zZXQiLz4KLQkJPGtleXdvcmQgbmFtZT0ib3V0c2V0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItdG9wIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci10b3Atd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItcmlnaHQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXJpZ2h0LXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWJvdHRvbSIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItYm90dG9tLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWxlZnQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWxlZnQtd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItdG9wLXdpZHRoIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGtleXdvcmQgbmFtZT0idGhpbiIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0idGhpY2siLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1yaWdodC13aWR0aCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxrZXl3b3JkIG5hbWU9InRoaW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibWVkaXVtIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRoaWNrIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItYm90dG9tLXdpZHRoIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGtleXdvcmQgbmFtZT0idGhpbiIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0idGhpY2siLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1sZWZ0LXdpZHRoIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGtleXdvcmQgbmFtZT0idGhpbiIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0idGhpY2siLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci13aWR0aCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxrZXl3b3JkIG5hbWU9InRoaW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibWVkaXVtIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRoaWNrIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjbGVhciIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJib3RoIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjb2xvciIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJkaXNwbGF5IiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iY2xhc3NpZmljYXRpb24iPgotCQk8a2V5d29yZCBuYW1lPSJibG9jayIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmxpbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGlzdC1pdGVtIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZsb2F0IiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250IgotCQlpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC12YXJpYW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXdlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zaXplIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaW5lLWhlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1mYW1pbHkiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJzbGFzaCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC1mYW1pbHkiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxzdHJpbmcgbmFtZT0iZmFtaWx5LW5hbWUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJnZW5lcmljLWZhbWlseSIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LXNpemUiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYWJzb2x1dGUtc2l6ZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9InJlbGF0aXZlLXNpemUiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LXN0eWxlIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iaXRhbGljIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im9ibGlxdWUiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtdmFyaWFudCIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJmb250Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNtYWxsLWNhcHMiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtd2VpZ2h0IiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iYm9sZCIvPgotCQk8a2V5d29yZCBuYW1lPSJib2xkZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGlnaHRlciIvPgotCQk8a2V5d29yZCBuYW1lPSIxMDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iMjAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjMwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI0MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNTAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjYwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI3MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iODAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjkwMCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iaGVpZ2h0IiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImxldHRlci1zcGFjaW5nIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImxpbmUtaGVpZ2h0IiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImNsYXNzaWZpY2F0aW9uIj4KLQkJPGtleXdvcmQgbmFtZT0iZGlzYyIvPgotCQk8a2V5d29yZCBuYW1lPSJjaXJjbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3F1YXJlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImRlY2ltYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItcm9tYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItcm9tYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItYWxwaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItYWxwaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbnNpZGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ib3V0c2lkZSIvPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Imxpc3Qtc3R5bGUtaW1hZ2UiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iY2xhc3NpZmljYXRpb24iPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Imxpc3Qtc3R5bGUtcG9zaXRpb24iIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iY2xhc3NpZmljYXRpb24iPgotCQk8a2V5d29yZCBuYW1lPSJpbnNpZGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ib3V0c2lkZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS10eXBlIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImNsYXNzaWZpY2F0aW9uIj4KLQkJPGtleXdvcmQgbmFtZT0iZGlzYyIvPgotCQk8a2V5d29yZCBuYW1lPSJjaXJjbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3F1YXJlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImRlY2ltYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItcm9tYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItcm9tYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItYWxwaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItYWxwaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1hcmdpbi10b3AiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luLXJpZ2h0IiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1hcmdpbi1ib3R0b20iIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luLWxlZnQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFkZGluZyIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFkZGluZy10b3AiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmctcmlnaHQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmctYm90dG9tIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWRkaW5nLWxlZnQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtYWxpZ24iIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2VudGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imp1c3RpZnkiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtZGVjb3JhdGlvbiIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVuZGVybGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJvdmVybGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJsaW5lLXRocm91Z2giLz4KLQkJPGtleXdvcmQgbmFtZT0iYmxpbmsiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtaW5kZW50IiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9InRleHQiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtdHJhbnNmb3JtIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJjYXBpdGFsaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyY2FzZSIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlcmNhc2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idmVydGljYWwtYWxpZ24iIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0iYmFzZWxpbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3ViIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InN1cGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRvcCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0ZXh0LXRvcCIvPgotCQk8a2V5d29yZCBuYW1lPSJtaWRkbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iYm90dG9tIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRleHQtYm90dG9tIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0id2hpdGUtc3BhY2UiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iY2xhc3NpZmljYXRpb24iPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0icHJlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vd3JhcCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0id2lkdGgiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0id29yZC1zcGFjaW5nIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQotCTwhLS0gY29udGFpbmVyIGRlZmluaXRpb24gOiBDb250YWluZXIgaXMgdGhlIGx1bXAgb2YgdmFsdWVzLgotCUl0IGNhbiBiZSB1c2VkIGxpa2UgbWFjcm9zLiAtLT4KLSAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJhYnNvbHV0ZS1zaXplIj4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ieHgtc21hbGwiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ieC1zbWFsbCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJzbWFsbCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibGFyZ2UiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ieC1sYXJnZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ4eC1sYXJnZSIvPgotICAgIDwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJjb2xvciI+Ci0JCTxrZXl3b3JkIG5hbWU9ImFxdWEiLz4KLQkJPGtleXdvcmQgbmFtZT0iYmxhY2siLz4KLQkJPGtleXdvcmQgbmFtZT0iYmx1ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJmdWNoc2lhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImdyYXkiLz4KLQkJPGtleXdvcmQgbmFtZT0iZ3JlZW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibGltZSIvPgotCQk8a2V5d29yZCBuYW1lPSJtYXJvb24iLz4KLQkJPGtleXdvcmQgbmFtZT0ibmF2eSIvPgotCQk8a2V5d29yZCBuYW1lPSJvbGl2ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJwdXJwbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0icmVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNpbHZlciIvPgotCQk8a2V5d29yZCBuYW1lPSJ0ZWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IndoaXRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InllbGxvdyIvPgotCQk8ZnVuY3Rpb24gbmFtZT0icmdiIi8+Ci0JCTxudW1iZXIgbmFtZT0iaGFzaCIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJnZW5lcmljLWZhbWlseSI+Ci0JCTxrZXl3b3JkIG5hbWU9InNlcmlmIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNhbnMtc2VyaWYiLz4KLQkJPGtleXdvcmQgbmFtZT0iY3Vyc2l2ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJmYW50YXN5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1vbm9zcGFjZSIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJyZWxhdGl2ZS1zaXplIj4KLQkJPGtleXdvcmQgbmFtZT0ic21hbGxlciIvPgotCQk8a2V5d29yZCBuYW1lPSJsYXJnZXIiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0KLQk8IS0tIGNhdGVnb3J5IGRlZmluaXRpb24gOiBUaGlzIGlzIHVzZWQgdG8gY2F0ZWdvcml6ZSBwcm9wZXJ0aWVzCi0JaW4gUHJvcGVydGllcyBWaWV3LiAtLT4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9ImJveCI+Ci0JCTxjYXB0aW9uPiVjc3MxLmNhdGVnb3J5LWRlZi5ib3guY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0JCTxjYXB0aW9uPiVjc3MxLmNhdGVnb3J5LWRlZi5jb2xvcmFuZGJhY2tncm91bmQuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9ImNsYXNzaWZpY2F0aW9uIj4KLQkJPGNhcHRpb24+JWNzczEuY2F0ZWdvcnktZGVmLmNsYXNzaWZpY2F0aW9uLmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJmb250Ij4KLQkJPGNhcHRpb24+JWNzczEuY2F0ZWdvcnktZGVmLmZvbnQuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9InRleHQiPgotCQk8Y2FwdGlvbj4lY3NzMS5jYXRlZ29yeS1kZWYudGV4dC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCi0JPGZ1bmN0aW9uLWRlZiBuYW1lPSJyZ2IiPgotCQk8ZnVuY3Rpb24tdmFsdWU+cmdiPC9mdW5jdGlvbi12YWx1ZT4KLQk8L2Z1bmN0aW9uLWRlZj4KLQk8ZnVuY3Rpb24tZGVmIG5hbWU9InVyaSI+Ci0JCTxmdW5jdGlvbi12YWx1ZT51cmw8L2Z1bmN0aW9uLXZhbHVlPgotCTwvZnVuY3Rpb24tZGVmPgotCQotCTwhLS0gbnVtYmVyIGRlZmluaXRpb24gOiBXaGF0IHVuaXQgdHlwZXMgYmUgYWNjZXB0YWJsZSBmb3IgZWFjaAotCW51bWJlciB0eXBlPyAtLT4KLSAgICA8bnVtYmVyLWRlZiBuYW1lPSJoYXNoIj4KLSAgICAgICAgPHVuaXQgbmFtZT0iaGFzaCIvPgotICAgIDwvbnVtYmVyLWRlZj4KLSAgICA8bnVtYmVyLWRlZiBuYW1lPSJsZW5ndGgiPgotICAgICAgICA8dW5pdCBuYW1lPSJlbSIvPgotICAgICAgICA8dW5pdCBuYW1lPSJleCIvPgotICAgICAgICA8dW5pdCBuYW1lPSJweCIvPgotICAgICAgICA8dW5pdCBuYW1lPSJpbiIvPgotICAgICAgICA8dW5pdCBuYW1lPSJjbSIvPgotICAgICAgICA8dW5pdCBuYW1lPSJtbSIvPgotICAgICAgICA8dW5pdCBuYW1lPSJwdCIvPgotICAgICAgICA8dW5pdCBuYW1lPSJwYyIvPgotICAgIDwvbnVtYmVyLWRlZj4KLQk8bnVtYmVyLWRlZiBuYW1lPSJudW1iZXIiPgotCTwvbnVtYmVyLWRlZj4KLQk8bnVtYmVyLWRlZiBuYW1lPSJwZXJjZW50YWdlIj4KLQkJPHVuaXQgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvbnVtYmVyLWRlZj4KLQotCTx1bml0LWRlZiBuYW1lPSJjbSI+Ci0JCTx1bml0LXZhbHVlPmNtPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9ImVtIj4KLQkJPHVuaXQtdmFsdWU+ZW08L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iZXgiPgotCQk8dW5pdC12YWx1ZT5leDwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJoYXNoIj4KLQkJPHVuaXQtdmFsdWU+IzwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJpbiI+Ci0JCTx1bml0LXZhbHVlPmluPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9Im1tIj4KLQkJPHVuaXQtdmFsdWU+bW08L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0icGMiPgotCQk8dW5pdC12YWx1ZT5wYzwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJwZXJjZW50YWdlIj4KLQkJPHVuaXQtdmFsdWU+JTwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJwdCI+Ci0JCTx1bml0LXZhbHVlPnB0PC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InB4Ij4KLQkJPHVuaXQtdmFsdWU+cHg8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQotICAgIDwhLS0ga2V5d29yZHMgOiBzdHJpbmcgY29uc3RhbnRzICh0aGlzIGlzIGxhc3QgcGFydC4uKSAtLT4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iMTAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+MTAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjIwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjIwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSIzMDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT4zMDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iNDAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+NDAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjUwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjUwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI2MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT42MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iNzAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+NzAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjgwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjgwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI5MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT45MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYXF1YSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmFxdWE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYXV0byI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmF1dG88L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmFzZWxpbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5iYXNlbGluZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJibGFjayI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJsYWNrPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJsaW5rIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ymxpbms8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmxvY2siPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ibG9jazwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJibHVlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ymx1ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJib2xkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ym9sZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJib2xkZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ib2xkZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYm90aCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJvdGg8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYm90dG9tIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ym90dG9tPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNhcGl0YWxpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jYXBpdGFsaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNlbnRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNlbnRlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjaXJjbGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jaXJjbGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY3Vyc2l2ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmN1cnNpdmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGFzaGVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZGFzaGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRlY2ltYWwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kZWNpbWFsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRpc2MiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kaXNjPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRvdHRlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRvdHRlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkb3VibGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kb3VibGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZmFudGFzeSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZhbnRhc3k8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZml4ZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5maXhlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmdWNoc2lhIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZnVjaHNpYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJncmF5Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Z3JheTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJncmVlbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmdyZWVuPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imdyb292ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmdyb292ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbmxpbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pbmxpbmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaW5zZXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pbnNldDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbnNpZGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pbnNpZGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaXRhbGljIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aXRhbGljPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imp1c3RpZnkiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5qdXN0aWZ5PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxhcmdlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGFyZ2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGFyZ2VyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGFyZ2VyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxlZnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sZWZ0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxpZ2h0ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5saWdodGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxpbWUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5saW1lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxpbmUtdGhyb3VnaCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxpbmUtdGhyb3VnaDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsaXN0LWl0ZW0iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5saXN0LWl0ZW08L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG93ZXItYWxwaGEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3dlci1hbHBoYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3dlci1yb21hbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvd2VyLXJvbWFuPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxvd2VyY2FzZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvd2VyY2FzZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtYXJvb24iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5tYXJvb248L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWVkaXVtIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bWVkaXVtPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1pZGRsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1pZGRsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtb25vc3BhY2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5tb25vc3BhY2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibmF2eSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5hdnk8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibm8tcmVwZWF0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bm8tcmVwZWF0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5vbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ub25lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5vcm1hbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5vcm1hbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJub3dyYXAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ub3dyYXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib2JsaXF1ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm9ibGlxdWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib2xpdmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vbGl2ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvdXRzZXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vdXRzZXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib3V0c2lkZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm91dHNpZGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib3ZlcmxpbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vdmVybGluZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwcmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5wcmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icHVycGxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cHVycGxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyZXBlYXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yZXBlYXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmVwZWF0LXgiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yZXBlYXQteDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyZXBlYXQteSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlcGVhdC15PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJpZGdlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmlkZ2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmlnaHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yaWdodDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzYW5zLXNlcmlmIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2Fucy1zZXJpZjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzY3JvbGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zY3JvbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2VyaWYiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zZXJpZjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzaWx2ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zaWx2ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic21hbGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbWFsbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzbWFsbC1jYXBzIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c21hbGwtY2Fwczwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzbWFsbGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c21hbGxlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzb2xpZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNvbGlkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNxdWFyZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNxdWFyZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzdWIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zdWI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3VwZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zdXBlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0ZWFsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGVhbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0ZXh0LXRvcCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRleHQtdG9wPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRleHQtYm90dG9tIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGV4dC1ib3R0b208L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGhpY2siPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50aGljazwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0aGluIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGhpbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0b3AiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50b3A8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idHJhbnNwYXJlbnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50cmFuc3BhcmVudDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1bmRlcmxpbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT51bmRlcmxpbmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idXBwZXItYWxwaGEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT51cHBlci1hbHBoYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1cHBlci1yb21hbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVwcGVyLXJvbWFuPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVwcGVyY2FzZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVwcGVyY2FzZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ3aGl0ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPndoaXRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IngtbGFyZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LWxhcmdlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Ingtc21hbGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LXNtYWxsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Inh4LXNtYWxsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eHgtc21hbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieHgtbGFyZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54eC1sYXJnZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ5ZWxsb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT55ZWxsb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLTwvY3NzLXByb2ZpbGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLWNzczIueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLWNzczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODFhY2JlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gLS0+Ci08IS0tPCFET0NUWVBFIGNzcy1wcm9maWxlIFNZU1RFTSAiY3NzLXByb2ZpbGUuZHRkIiA+LS0+Ci08Y3NzLXByb2ZpbGU+Ci0JPHN0eWxlc2hlZXQtZGVmPgotCQk8ZGVzY3JpcHRpb24+JWNzczIuc3R5bGVzaGVldC1kZWYuZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotCQk8Y2hhcnNldC1ydWxlLz4KLQkJPGltcG9ydC1ydWxlLz4KLQkJPHBhZ2UtcnVsZS8+Ci0JCTxtZWRpYS1ydWxlLz4KLQkJPGZvbnRmYWNlLXJ1bGUvPgotCQk8c3R5bGUtcnVsZS8+Ci0JPC9zdHlsZXNoZWV0LWRlZj4KLQotCTxjaGFyc2V0LXJ1bGUtZGVmPgotCTwvY2hhcnNldC1ydWxlLWRlZj4KLQk8aW1wb3J0LXJ1bGUtZGVmPgotCTwvaW1wb3J0LXJ1bGUtZGVmPgotCTxtZWRpYS1ydWxlLWRlZj4KLQk8L21lZGlhLXJ1bGUtZGVmPgotCi0JPHBhZ2UtcnVsZS1kZWY+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0ibGVmdCIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9InJpZ2h0Ii8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0iZmlyc3QiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNpemUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmtzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWFmdGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWJlZm9yZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1pbnNpZGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im9ycGhhbnMiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndpZG93cyIvPgotCTwvcGFnZS1ydWxlLWRlZj4KLQotCTxmb250ZmFjZS1ydWxlLWRlZj4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iYXNjZW50Ii8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImJhc2VsaW5lIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImJib3giLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iY2FwLWhlaWdodCIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJjZW50ZXJsaW5lIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImRlZmluaXRpb24tc3JjIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImRlc2NlbnQiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iZm9udC1mYW1pbHkiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iZm9udC1zaXplIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImZvbnQtc3RyZXRjaCIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJmb250LXN0eWxlIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImZvbnQtdmFyaWFudCIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJmb250LXdlaWdodCIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJtYXRobGluZSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJwYW5vc2UtMSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJzbG9wZSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJzbG9wZSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJzcmMiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0ic3RlbWgiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0ic3RlbXYiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0idG9wbGluZSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJ1bmljb2RlLXJhbmdlIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9InVuaXRzLXBlci1lbSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJ3aWR0aHMiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0ieC1oZWlnaHQiLz4KLQk8L2ZvbnRmYWNlLXJ1bGUtZGVmPgotCi0JPCEtLSBXaGljaCBwcm9wZXJ0aWVzIGNhbiBzdHlsZSBydWxlIGluY2x1ZGUgPyAtLT4KLQotCTxzdHlsZS1ydWxlLWRlZj4KLQkJPHNlbGVjdG9yLWV4cHJlc3Npb24gbmFtZT0iZGVzY2VuZGFudCIvPgotCQk8c2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lPSJjaGlsZCIvPgotCQk8c2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lPSJhZGphY2VudCIvPgotCQk8c2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lPSJ1bml2ZXJzYWwiLz4KLQkJPHNlbGVjdG9yLWV4cHJlc3Npb24gbmFtZT0iYXR0cmlidXRlIi8+Ci0JCTxwc2V1ZG8tZWxlbWVudCBuYW1lPSJmaXJzdC1saW5lIi8+Ci0JCTxwc2V1ZG8tZWxlbWVudCBuYW1lPSJmaXJzdC1sZXR0ZXIiLz4KLQkJPHBzZXVkby1lbGVtZW50IG5hbWU9ImJlZm9yZSIvPgotCQk8cHNldWRvLWVsZW1lbnQgbmFtZT0iYWZ0ZXIiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJmaXJzdC1jaGlsZCIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImxpbmsiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJ2aXNpdGVkIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0iaG92ZXIiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJhY3RpdmUiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJmb2N1cyIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImxhbmciLz4KLQkJPHByb3BlcnR5IG5hbWU9ImF6aW11dGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtYXR0YWNobWVudCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1pbWFnZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1wb3NpdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1yZXBlYXQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWNvbGxhcHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zcGFjaW5nIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci10b3AiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1yaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWJvdHRvbSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWxlZnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci10b3AtY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1yaWdodC1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWJvdHRvbS1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWxlZnQtY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci10b3Atc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1yaWdodC1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWJvdHRvbS1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWxlZnQtc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci10b3Atd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1yaWdodC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWJvdHRvbS13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWxlZnQtd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm90dG9tIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjYXB0aW9uLXNpZGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNsZWFyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjbGlwIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iY29udGVudCIvPgotCQk8cHJvcGVydHkgbmFtZT0iY291bnRlci1pbmNyZW1lbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNvdW50ZXItcmVzZXQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImN1ZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlLWFmdGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdWUtYmVmb3JlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdXJzb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRpcmVjdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0iZGlzcGxheSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZWxldmF0aW9uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJlbXB0eS1jZWxscyIvPgotCQk8cHJvcGVydHkgbmFtZT0iZmxvYXQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtZmFtaWx5Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXNpemUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc2l6ZS1hZGp1c3QiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc3RyZXRjaCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC12YXJpYW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXdlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0iaGVpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsZWZ0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsZXR0ZXItc3BhY2luZyIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGluZS1oZWlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUtaW1hZ2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUtcG9zaXRpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUtdHlwZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFyZ2luIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJnaW4tdG9wIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJnaW4tcmlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbi1ib3R0b20iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbi1sZWZ0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJrZXItb2Zmc2V0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJrcyIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWF4LWhlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWF4LXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtaW4taGVpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtaW4td2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im9ycGhhbnMiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im92ZXJmbG93Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWRkaW5nIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWRkaW5nLXRvcCIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFkZGluZy1yaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFkZGluZy1ib3R0b20iLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZGRpbmctbGVmdCIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1hZnRlciIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1iZWZvcmUiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstaW5zaWRlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYXVzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGF1c2UtYWZ0ZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhdXNlLWJlZm9yZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGl0Y2giLz4KLQkJPHByb3BlcnR5IG5hbWU9InBpdGNoLXJhbmdlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbGF5LWR1cmluZyIvPgotCQk8cHJvcGVydHkgbmFtZT0icG9zaXRpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9InF1b3RlcyIvPgotCQk8cHJvcGVydHkgbmFtZT0icmljaG5lc3MiLz4KLQkJPHByb3BlcnR5IG5hbWU9InJpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzaXplIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVhayIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3BlYWstaGVhZGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVhay1udW1lcmFsIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVhay1wdW5jdHVhdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3BlZWNoLXJhdGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9InN0cmVzcyIvPgotCQk8cHJvcGVydHkgbmFtZT0idGFibGUtbGF5b3V0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LWFsaWduIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LWRlY29yYXRpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtaW5kZW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LXNoYWRvdyIvPgotCQk8cHJvcGVydHkgbmFtZT0idGV4dC10cmFuc2Zvcm0iLz4KLQkJPHByb3BlcnR5IG5hbWU9InRvcCIvPgotCQk8cHJvcGVydHkgbmFtZT0idW5pY29kZS1iaWRpIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2ZXJ0aWNhbC1hbGlnbiIvPgotCQk8cHJvcGVydHkgbmFtZT0idmlzaWJpbGl0eSIvPgotCQk8cHJvcGVydHkgbmFtZT0idm9pY2UtZmFtaWx5Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2b2x1bWUiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndoaXRlLXNwYWNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3aWRvd3MiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3b3JkLXNwYWNpbmciLz4KLQkJPHByb3BlcnR5IG5hbWU9InotaW5kZXgiLz4KLQk8L3N0eWxlLXJ1bGUtZGVmPgotCi0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0iZmlyc3QtY2hpbGQiPgotCQk8c2VsZWN0b3ItdmFsdWU+Zmlyc3QtY2hpbGQ8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJsaW5rIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmxpbms8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJ2aXNpdGVkIj4KLQkJPHNlbGVjdG9yLXZhbHVlPnZpc2l0ZWQ8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJob3ZlciI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5ob3Zlcjwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9ImFjdGl2ZSI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5hY3RpdmU8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJmb2N1cyI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5mb2N1czwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9ImxhbmciPgotCQk8c2VsZWN0b3ItdmFsdWU+bGFuZzwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9ImxlZnQiPgotCQk8c2VsZWN0b3ItdmFsdWU+bGVmdDwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9InJpZ2h0Ij4KLQkJPHNlbGVjdG9yLXZhbHVlPnJpZ2h0PC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0iZmlyc3QiPgotCQk8c2VsZWN0b3ItdmFsdWU+Zmlyc3Q8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQotCTxwc2V1ZG8tZWxlbWVudC1kZWYgbmFtZT0iZmlyc3QtbGluZSI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5maXJzdC1saW5lPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1lbGVtZW50LWRlZj4KLQk8cHNldWRvLWVsZW1lbnQtZGVmIG5hbWU9ImZpcnN0LWxldHRlciI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5maXJzdC1sZXR0ZXI8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWVsZW1lbnQtZGVmPgotCTxwc2V1ZG8tZWxlbWVudC1kZWYgbmFtZT0iYmVmb3JlIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmJlZm9yZTwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tZWxlbWVudC1kZWY+Ci0JPHBzZXVkby1lbGVtZW50LWRlZiBuYW1lPSJhZnRlciI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5hZnRlcjwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tZWxlbWVudC1kZWY+Ci0KLQk8IS0tIHByb3BlcnR5IGRlZmluaXRpb24gLS0+Ci0KLQk8cHJvcGVydHktZGVmIG5hbWU9ImF6aW11dGgiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcHJvdmlkZXMgc3BhdGlhbCBhdWRpbyBwcm9wZXJ0eSBmb3IgYXVyYWwKLSAgICAgICAgcHJlc2VudGF0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPG51bWJlciBuYW1lPSJhbmdsZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJsZWZ0LXNpZGUiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iZmFyLWxlZnQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJjZW50ZXItbGVmdCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJjZW50ZXIiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iY2VudGVyLXJpZ2h0Ii8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImZhci1yaWdodCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJyaWdodC1zaWRlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImJlaGluZCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJsZWZ0d2FyZHMiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0icmlnaHR3YXJkcyIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1jb2xvciIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1pbWFnZSIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1yZXBlYXQiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtYXR0YWNobWVudCIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1wb3NpdGlvbiIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InNjcm9sbCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJmaXhlZCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kLWNvbG9yIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotICAgICAgICA8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InRyYW5zcGFyZW50Ii8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtaW1hZ2UiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0gICAgICAgIDxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kLXBvc2l0aW9uIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPGtleXdvcmQgbmFtZT0idG9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNlbnRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJib3R0b20iLz4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kLXJlcGVhdCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLQkJPGtleXdvcmQgbmFtZT0icmVwZWF0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJlcGVhdC14Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJlcGVhdC15Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vLXJlcGVhdCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXIiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1jb2xsYXBzZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRhYmxlcyI+Ci0JCTxrZXl3b3JkIG5hbWU9ImNvbGxhcHNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNlcGFyYXRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1jb2xvciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8a2V5d29yZCBuYW1lPSJ0cmFuc3BhcmVudCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItc3BhY2luZyIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRhYmxlcyI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1zdHlsZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXRvcCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci10b3Atd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1yaWdodCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1yaWdodC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWJvdHRvbSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1ib3R0b20td2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1sZWZ0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWxlZnQtd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci10b3AtY29sb3IiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXJpZ2h0LWNvbG9yIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1ib3R0b20tY29sb3IiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWxlZnQtY29sb3IiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXRvcC1zdHlsZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXJpZ2h0LXN0eWxlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItYm90dG9tLXN0eWxlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItbGVmdC1zdHlsZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXRvcC13aWR0aCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXJpZ2h0LXdpZHRoIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItYm90dG9tLXdpZHRoIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItbGVmdC13aWR0aCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXdpZHRoIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3R0b20iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImNhcHRpb24tc2lkZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRhYmxlcyI+Ci0JCTxrZXl3b3JkIG5hbWU9InRvcCIvPgotCQk8a2V5d29yZCBuYW1lPSJib3R0b20iLz4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjbGVhciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY2xpcCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGNvbnRhaW5lciBuYW1lPSJzaGFwZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImNvbG9yIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjb250ZW50IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhbGwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLQkJPHN0cmluZyBuYW1lPSJhbnkiLz4KLQkJPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotCQk8ZnVuY3Rpb24gbmFtZT0iY291bnRlciIvPgotCQk8ZnVuY3Rpb24gbmFtZT0iYXR0ciIvPgotCQk8a2V5d29yZCBuYW1lPSJvcGVuLXF1b3RlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNsb3NlLXF1b3RlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vLW9wZW4tcXVvdGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm8tY2xvc2UtcXVvdGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY291bnRlci1pbmNyZW1lbnQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImFsbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8c3RyaW5nIG5hbWU9ImNvdW50ZXItaWRlbnRpZmllciIvPgotCQk8bnVtYmVyIG5hbWU9ImludGVnZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjb3VudGVyLXJlc2V0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhbGwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLQkJPHN0cmluZyBuYW1lPSJjb3VudGVyLWlkZW50aWZpZXIiLz4KLQkJPG51bWJlciBuYW1lPSJpbnRlZ2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY3VlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPHByb3BlcnR5IG5hbWU9ImN1ZS1iZWZvcmUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImN1ZS1hZnRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjdWUtYWZ0ZXIiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY3VlLWJlZm9yZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjdXJzb3IiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwsaW50ZXJhY3RpdmUiIGNhdGVnb3J5PSJ1aSI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJjcm9zc2hhaXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iZGVmYXVsdCIvPgotCQk8a2V5d29yZCBuYW1lPSJwb2ludGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1vdmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZS1yZXNpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibmUtcmVzaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im53LXJlc2l6ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJuLXJlc2l6ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzZS1yZXNpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3ctcmVzaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InMtcmVzaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InctcmVzaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRleHQiLz4KLQkJPGtleXdvcmQgbmFtZT0id2FpdCIvPgotCQk8a2V5d29yZCBuYW1lPSJoZWxwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZGlyZWN0aW9uIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0ibHRyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InJ0bCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJkaXNwbGF5IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhbGwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJpbmxpbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iYmxvY2siLz4KLQkJPGtleXdvcmQgbmFtZT0ibGlzdC1pdGVtIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InJ1bi1pbiIvPgotCQk8a2V5d29yZCBuYW1lPSJjb21wYWN0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1hcmtlciIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmxpbmUtdGFibGUiLz4KLQkJPGtleXdvcmQgbmFtZT0idGFibGUtcm93LWdyb3VwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRhYmxlLWhlYWRlci1ncm91cCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZS1mb290ZXItZ3JvdXAiLz4KLQkJPGtleXdvcmQgbmFtZT0idGFibGUtcm93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InRhYmxlLWNvbHVtbi1ncm91cCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZS1jb2x1bW4iLz4KLQkJPGtleXdvcmQgbmFtZT0idGFibGUtY2VsbCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZS1jYXB0aW9uIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZWxldmF0aW9uIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxudW1iZXIgbmFtZT0iYW5nbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iYmVsb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0ibGV2ZWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iYWJvdmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaGlnaGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImVtcHR5LWNlbGxzIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGFibGVzIj4KLQkJPGtleXdvcmQgbmFtZT0ic2hvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJoaWRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZsb2F0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udCIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC12YXJpYW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXdlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zaXplIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaW5lLWhlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1mYW1pbHkiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2FwdGlvbiIvPgotCQk8a2V5d29yZCBuYW1lPSJpY29uIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lbnUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibWVzc2FnZS1ib3giLz4KLQkJPGtleXdvcmQgbmFtZT0ic21hbGwtY2FwdGlvbiIvPgotCQk8a2V5d29yZCBuYW1lPSJzdGF0dXMtYmFyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJzbGFzaCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC1mYW1pbHkiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJmb250Ij4KLQkJPHN0cmluZyBuYW1lPSJmYW1pbHktbmFtZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImdlbmVyaWMtZmFtaWx5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC1zaXplIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYWJzb2x1dGUtc2l6ZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9InJlbGF0aXZlLXNpemUiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtc2l6ZS1hZGp1c3QiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJmb250Ij4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LXN0cmV0Y2giCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJmb250Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IndpZGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5hcnJvd2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVsdHJhLWNvbmRlbnNlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJleHRyYS1jb25kZW5zZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iY29uZGVuc2VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNlbWktY29uZGVuc2VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNlbWktZXhwYW5kZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iZXhwYW5kZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iZXh0cmEtZXhwYW5kZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0idWx0cmEtZXhwYW5kZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC1zdHlsZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iaXRhbGljIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im9ibGlxdWUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC12YXJpYW50IgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJzbWFsbC1jYXBzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtd2VpZ2h0IgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJib2xkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvbGRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJsaWdodGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjEwMCIvPgotCQk8a2V5d29yZCBuYW1lPSIyMDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iMzAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjQwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI1MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNjAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjcwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI4MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iOTAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImhlaWdodCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGVmdCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGV0dGVyLXNwYWNpbmciCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImxpbmUtaGVpZ2h0IgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaXN0LXN0eWxlLXR5cGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUtcG9zaXRpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUtaW1hZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS1pbWFnZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS1wb3NpdGlvbiIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8a2V5d29yZCBuYW1lPSJpbnNpZGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ib3V0c2lkZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlLXR5cGUiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLQkJPGtleXdvcmQgbmFtZT0iZGlzYyIvPgotCQk8a2V5d29yZCBuYW1lPSJjaXJjbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3F1YXJlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImRlY2ltYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iZGVjaW1hbC1sZWFkaW5nLXplcm8iLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItcm9tYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItcm9tYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItZ3JlZWsiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItYWxwaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItbGF0aW4iLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItYWxwaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItbGF0aW4iLz4KLQkJPGtleXdvcmQgbmFtZT0iaGVicmV3Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImFybWVuaWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imdlb3JnaWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNqay1pZGVvZ3JhcGhpYyIvPgotCQk8a2V5d29yZCBuYW1lPSJoaXJhZ2FuYSIvPgotCQk8a2V5d29yZCBuYW1lPSJrYXRha2FuYSIvPgotCQk8a2V5d29yZCBuYW1lPSJoaXJhZ2FuYS1pcm9oYSIvPgotCQk8a2V5d29yZCBuYW1lPSJrYXRha2FuYS1pcm9oYSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1hcmdpbiIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJtYXJnaW4td2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luLXRvcCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJtYXJnaW4td2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luLXJpZ2h0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9Im1hcmdpbi13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4tYm90dG9tIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9Im1hcmdpbi13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4tbGVmdCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJtYXJnaW4td2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFya2VyLW9mZnNldCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFya3MiCi0JCWluaGVyaXRlZD0ibmEiIG1lZGlhZ3JvdXA9InZpc3VhbCxwYWdlZCIgY2F0ZWdvcnk9InBhZ2UiPgotCQk8a2V5d29yZCBuYW1lPSJjcm9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNyb3NzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWF4LWhlaWdodCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWF4LXdpZHRoIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtaW4taGVpZ2h0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtaW4td2lkdGgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im9ycGhhbnMiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwscGFnZWQiIGNhdGVnb3J5PSJwYWdlIj4KLQkJPG51bWJlciBuYW1lPSJpbnRlZ2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im91dGxpbmUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCxpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9InVpIj4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ib3V0bGluZS1jb2xvciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsLGludGVyYWN0aXZlIiBjYXRlZ29yeT0idWkiPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImludmVydCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJvdXRsaW5lLXN0eWxlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwsaW50ZXJhY3RpdmUiIGNhdGVnb3J5PSJ1aSI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im91dGxpbmUtd2lkdGgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCxpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9InVpIj4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ib3ZlcmZsb3ciCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9InZpc2libGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaGlkZGVuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNjcm9sbCIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmciCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0icGFkZGluZy13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWRkaW5nLXRvcCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJwYWRkaW5nLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmctcmlnaHQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0icGFkZGluZy13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWRkaW5nLWJvdHRvbSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJwYWRkaW5nLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmctbGVmdCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJwYWRkaW5nLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZ2UiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwscGFnZWQiIGNhdGVnb3J5PSJwYWdlIj4KLQkJPHN0cmluZyBuYW1lPSJwYWdlLWlkZW50aWZpZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFnZS1icmVhay1hZnRlciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsLHBhZ2VkIiBjYXRlZ29yeT0icGFnZSI+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iYWx3YXlzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF2b2lkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFnZS1icmVhay1iZWZvcmUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCxwYWdlZCIgY2F0ZWdvcnk9InBhZ2UiPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImFsd2F5cyIvPgotCQk8a2V5d29yZCBuYW1lPSJhdm9pZCIvPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZ2UtYnJlYWstaW5zaWRlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsLHBhZ2VkIiBjYXRlZ29yeT0icGFnZSI+Ci0JCTxrZXl3b3JkIG5hbWU9ImF2b2lkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGF1c2UiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9InRpbWUiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhdXNlLWFmdGVyIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJ0aW1lIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYXVzZS1iZWZvcmUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9InRpbWUiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBpdGNoIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxudW1iZXIgbmFtZT0iZnJlcXVlbmN5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IngtbG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0iaGlnaCIvPgotCQk8a2V5d29yZCBuYW1lPSJ4LWhpZ2giLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGl0Y2gtcmFuZ2UiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGxheS1kdXJpbmciCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1peCIvPgotCQk8a2V5d29yZCBuYW1lPSJyZXBlYXQiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBvc2l0aW9uIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJzdGF0aWMiLz4KLQkJPGtleXdvcmQgbmFtZT0icmVsYXRpdmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iYWJzb2x1dGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZml4ZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icXVvdGVzIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxzdHJpbmcgbmFtZT0iYW55Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icmljaG5lc3MiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icmlnaHQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InNpemUiCi0JCWluaGVyaXRlZD0ibmEiIG1lZGlhZ3JvdXA9InZpc3VhbCxwYWdlZCIgY2F0ZWdvcnk9InBhZ2UiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InBvcnRyYWl0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxhbmRzY2FwZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJzcGVhayIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzcGVsbC1vdXQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ic3BlYWstaGVhZGVyIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJ0YWJsZXMiPgotCQk8a2V5d29yZCBuYW1lPSJvbmNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImFsd2F5cyIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJzcGVhay1udW1lcmFsIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImRpZ2l0cyIvPgotCQk8a2V5d29yZCBuYW1lPSJjb250aW51b3VzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InNwZWFrLXB1bmN0dWF0aW9uIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImNvZGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJzcGVlY2gtcmF0ZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCQk8a2V5d29yZCBuYW1lPSJ4LXNsb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0ic2xvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0iZmFzdCIvPgotCQk8a2V5d29yZCBuYW1lPSJ4LWZhc3QiLz4KLQkJPGtleXdvcmQgbmFtZT0iZmFzdGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNsb3dlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJzdHJlc3MiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGFibGUtbGF5b3V0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0YWJsZXMiPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZpeGVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtYWxpZ24iCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJjZW50ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ianVzdGlmeSIvPgotCQk8c3RyaW5nIG5hbWU9ImFueSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LWRlY29yYXRpb24iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVuZGVybGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJvdmVybGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJsaW5lLXRocm91Z2giLz4KLQkJPGtleXdvcmQgbmFtZT0iYmxpbmsiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1pbmRlbnQiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtc2hhZG93IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC10cmFuc2Zvcm0iCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0iY2FwaXRhbGl6ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlcmNhc2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXJjYXNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idG9wIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ1bmljb2RlLWJpZGkiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJlbWJlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJiaWRpLW92ZXJyaWRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InZlcnRpY2FsLWFsaWduIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJiYXNlbGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzdWIiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3VwZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0idG9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRleHQtdG9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1pZGRsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJib3R0b20iLz4KLQkJPGtleXdvcmQgbmFtZT0idGV4dC1ib3R0b20iLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InZpc2liaWxpdHkiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9InZpc2libGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaGlkZGVuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNvbGxhcHNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InZvaWNlLWZhbWlseSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8c3RyaW5nIG5hbWU9InNwZWNpZmljLXZvaWNlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iZ2VuZXJpYy12b2ljZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ2b2x1bWUiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNpbGVudCIvPgotCQk8a2V5d29yZCBuYW1lPSJ4LXNvZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic29mdCIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0ibG91ZCIvPgotCQk8a2V5d29yZCBuYW1lPSJ4LWxvdWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0id2hpdGUtc3BhY2UiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InByZSIvPgotCQk8a2V5d29yZCBuYW1lPSJub3dyYXAiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0id2lkb3dzIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsLHBhZ2VkIiBjYXRlZ29yeT0icGFnZSI+Ci0JCTxudW1iZXIgbmFtZT0iaW50ZWdlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ3aWR0aCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0id29yZC1zcGFjaW5nIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ6LWluZGV4IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxudW1iZXIgbmFtZT0iaW50ZWdlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0KLQk8IS0tIGRlc2NyaXB0b3IgZGVmaW5pdGlvbiA6IFRoZXNlIGFyZSBmb3IgQGZvbnQtZmFjZSAtLT4KLQotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJhc2NlbnQiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImJhc2VsaW5lIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJiYm94Ij4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImNhcC1oZWlnaHQiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImNlbnRlcmxpbmUiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImRlZmluaXRpb24tc3JjIj4KLQkJPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImRlc2NlbnQiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImZvbnQtZmFtaWx5Ij4KLQkJPHN0cmluZyBuYW1lPSJmYW1pbHktbmFtZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImdlbmVyaWMtZmFtaWx5Ii8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0iY29tbWEiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJmb250LXNpemUiPgotCQk8a2V5d29yZCBuYW1lPSJhbGwiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImZvbnQtc3RyZXRjaCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImFsbCIvPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0idWx0cmEtY29uZGVuc2VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImV4dHJhLWNvbmRlbnNlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJjb25kZW5zZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2VtaS1jb25kZW5zZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2VtaS1leHBhbmRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJleHBhbmRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJleHRyYS1leHBhbmRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJ1bHRyYS1leHBhbmRlZCIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iZm9udC1zdHlsZSI+Ci0JCTxrZXl3b3JkIG5hbWU9ImFsbCIvPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iaXRhbGljIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im9ibGlxdWUiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImZvbnQtdmFyaWFudCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJzbWFsbC1jYXBzIi8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0iY29tbWEiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJmb250LXdlaWdodCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImFsbCIvPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iYm9sZCIvPgotCQk8a2V5d29yZCBuYW1lPSIxMDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iMjAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjMwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI0MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNTAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjYwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI3MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iODAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjkwMCIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0ibWF0aGxpbmUiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9InBhbm9zZS0xIj4KLQkJPG51bWJlciBuYW1lPSJpbnRlZ2VyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0ic2xvcGUiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9InNyYyI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGZ1bmN0aW9uIG5hbWU9ImZvcm1hdCIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImZvbnQtZmFjZS1uYW1lIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0ic3RlbWgiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9InN0ZW12Ij4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJ0b3BsaW5lIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJ1bmljb2RlLXJhbmdlIj4KLQkJPHN0cmluZyBuYW1lPSJ1cmFuZ2UiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJ1bml0cy1wZXItZW0iPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9IndpZHRocyI+Ci0JCTxzdHJpbmcgbmFtZT0idXJhbmdlIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0ieC1oZWlnaHQiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0KLQk8IS0tIGNvbnRhaW5lciBkZWZpbml0aW9uIDogQ29udGFpbmVyIGlzIHRoZSBsdW1wIG9mIHZhbHVlcy4KLQlJdCBjYW4gYmUgdXNlZCBsaWtlIG1hY3Jvcy4gLS0+Ci0gICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iYWJzb2x1dGUtc2l6ZSI+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Inh4LXNtYWxsIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Ingtc21hbGwiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ic21hbGwiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibWVkaXVtIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImxhcmdlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9IngtbGFyZ2UiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ieHgtbGFyZ2UiLz4KLSAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iYm9yZGVyLXN0eWxlIj4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJoaWRkZW4iLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iZG90dGVkIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImRhc2hlZCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJzb2xpZCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJkb3VibGUiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iZ3Jvb3ZlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InJpZGdlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Imluc2V0Ii8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Im91dHNldCIvPgotICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJib3JkZXItd2lkdGgiPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ0aGluIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ0aGljayIvPgotICAgICAgICA8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotICAgIDwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJjb2xvciI+Ci0JCTxrZXl3b3JkIG5hbWU9ImFxdWEiLz4KLQkJPGtleXdvcmQgbmFtZT0iYmxhY2siLz4KLQkJPGtleXdvcmQgbmFtZT0iYmx1ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJmdWNoc2lhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImdyYXkiLz4KLQkJPGtleXdvcmQgbmFtZT0iZ3JlZW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibGltZSIvPgotCQk8a2V5d29yZCBuYW1lPSJtYXJvb24iLz4KLQkJPGtleXdvcmQgbmFtZT0ibmF2eSIvPgotCQk8a2V5d29yZCBuYW1lPSJvbGl2ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJwdXJwbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0icmVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNpbHZlciIvPgotCQk8a2V5d29yZCBuYW1lPSJ0ZWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IndoaXRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InllbGxvdyIvPgotCQk8Y29udGFpbmVyIG5hbWU9InN5c3RlbS1jb2xvciIvPgotCQk8ZnVuY3Rpb24gbmFtZT0icmdiIi8+Ci0JCTxudW1iZXIgbmFtZT0iaGFzaCIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJnZW5lcmljLWZhbWlseSI+Ci0JCTxrZXl3b3JkIG5hbWU9InNlcmlmIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNhbnMtc2VyaWYiLz4KLQkJPGtleXdvcmQgbmFtZT0iY3Vyc2l2ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJmYW50YXN5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1vbm9zcGFjZSIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJmb250LWZhY2UtbmFtZSI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJsb2NhbCIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJnZW5lcmljLXZvaWNlIj4KLQkJPGtleXdvcmQgbmFtZT0ibWFsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJmZW1hbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2hpbGQiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0ibWFyZ2luLXdpZHRoIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0icGFkZGluZy13aWR0aCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJyZWxhdGl2ZS1zaXplIj4KLQkJPGtleXdvcmQgbmFtZT0ic21hbGxlciIvPgotCQk8a2V5d29yZCBuYW1lPSJsYXJnZXIiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0ic2hhcGUiPgotCQk8ZnVuY3Rpb24gbmFtZT0icmVjdCIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJzeXN0ZW0tY29sb3IiPgotCQk8a2V5d29yZCBuYW1lPSJBY3RpdmVCb3JkZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iQWN0aXZlQ2FwdGlvbiIvPgotCQk8a2V5d29yZCBuYW1lPSJBcHBXb3Jrc3BhY2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iQmFja2dyb3VuZCIvPgotCQk8a2V5d29yZCBuYW1lPSJCdXR0b25GYWNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IkJ1dHRvbkhpZ2hsaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJCdXR0b25TaGFkb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0iQnV0dG9uVGV4dCIvPgotCQk8a2V5d29yZCBuYW1lPSJDYXB0aW9uVGV4dCIvPgotCQk8a2V5d29yZCBuYW1lPSJHcmF5VGV4dCIvPgotCQk8a2V5d29yZCBuYW1lPSJIaWdobGlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iSGlnaGxpZ2h0VGV4dCIvPgotCQk8a2V5d29yZCBuYW1lPSJJbmFjdGl2ZUJvcmRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJJbmFjdGl2ZUNhcHRpb24iLz4KLQkJPGtleXdvcmQgbmFtZT0iSW5hY3RpdmVDYXB0aW9uVGV4dCIvPgotCQk8a2V5d29yZCBuYW1lPSJJbmZvQmFja2dyb3VuZCIvPgotCQk8a2V5d29yZCBuYW1lPSJJbmZvVGV4dCIvPgotCQk8a2V5d29yZCBuYW1lPSJNZW51Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Ik1lbnVUZXh0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IlNjcm9sbGJhciIvPgotCQk8a2V5d29yZCBuYW1lPSJUaHJlZUREYXJrU2hhZG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IlRocmVlREZhY2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iVGhyZWVESGlnaGxpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IlRocmVlRExpZ2h0U2hhZG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IlRocmVlRFNoYWRvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJXaW5kb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0iV2luZG93RnJhbWUiLz4KLQkJPGtleXdvcmQgbmFtZT0iV2luZG93VGV4dCIvPgotCTwvY29udGFpbmVyLWRlZj4KLQotCTwhLS0gY2F0ZWdvcnkgZGVmaW5pdGlvbiA6IFRoaXMgaXMgdXNlZCB0byBjYXRlZ29yaXplIHByb3BlcnRpZXMKLQlpbiBQcm9wZXJ0aWVzIFZpZXcuIC0tPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iYXVyYWwiPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYuYXVyYWwuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9ImJveCI+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi5ib3guY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi5jb2xvcmFuZGJhY2tncm91bmQuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9ImNvbnRlbnQiPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYuY29udGVudC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iZm9udCI+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi5mb250LmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJwYWdlIj4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLnBhZ2UuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9InRhYmxlcyI+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi50YWJsZXMuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9InRleHQiPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYudGV4dC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0idWkiPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYudWkuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9InZpc3VhbCI+Ci08IS0tCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYudmlzdWFsLmNhcHRpb248L2NhcHRpb24+LS0+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi52aXN1YWwuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQkKLQk8IS0tIGZ1bmN0aW9uIGRlZmluaXRpb24gLS0+Ci0JPGZ1bmN0aW9uLWRlZiBuYW1lPSJhdHRyIj4KLQkJPGZ1bmN0aW9uLXZhbHVlPmF0dHI8L2Z1bmN0aW9uLXZhbHVlPgotCTwvZnVuY3Rpb24tZGVmPgotCTxmdW5jdGlvbi1kZWYgbmFtZT0iY291bnRlciI+Ci0JCTxmdW5jdGlvbi12YWx1ZT5jb3VudGVyPC9mdW5jdGlvbi12YWx1ZT4KLQk8L2Z1bmN0aW9uLWRlZj4KLQk8ZnVuY3Rpb24tZGVmIG5hbWU9InJlY3QiPgotCQk8ZnVuY3Rpb24tdmFsdWU+cmVjdDwvZnVuY3Rpb24tdmFsdWU+Ci0JPC9mdW5jdGlvbi1kZWY+Ci0JPGZ1bmN0aW9uLWRlZiBuYW1lPSJyZ2IiPgotCQk8ZnVuY3Rpb24tdmFsdWU+cmdiPC9mdW5jdGlvbi12YWx1ZT4KLQk8L2Z1bmN0aW9uLWRlZj4KLQk8ZnVuY3Rpb24tZGVmIG5hbWU9InVyaSI+Ci0JCTxmdW5jdGlvbi12YWx1ZT51cmw8L2Z1bmN0aW9uLXZhbHVlPgotCTwvZnVuY3Rpb24tZGVmPgotCTxmdW5jdGlvbi1kZWYgbmFtZT0iZm9ybWF0Ij4KLQkJPGZ1bmN0aW9uLXZhbHVlPmZvcm1hdDwvZnVuY3Rpb24tdmFsdWU+Ci0JPC9mdW5jdGlvbi1kZWY+Ci0JPGZ1bmN0aW9uLWRlZiBuYW1lPSJsb2NhbCI+Ci0JCTxmdW5jdGlvbi12YWx1ZT5sb2NhbDwvZnVuY3Rpb24tdmFsdWU+Ci0JPC9mdW5jdGlvbi1kZWY+Ci0KLQk8IS0tIG51bWJlciBkZWZpbml0aW9uIDogV2hhdCB1bml0IHR5cGVzIGJlIGFjY2VwdGFibGUgZm9yIGVhY2gKLQludW1iZXIgdHlwZT8gLS0+Ci0gICAgPG51bWJlci1kZWYgbmFtZT0iYW5nbGUiPgotICAgICAgICA8dW5pdCBuYW1lPSJkZWciLz4KLSAgICAgICAgPHVuaXQgbmFtZT0iZ3JhZCIvPgotICAgICAgICA8dW5pdCBuYW1lPSJyYWQiLz4KLSAgICA8L251bWJlci1kZWY+Ci0gICAgPG51bWJlci1kZWYgbmFtZT0iZnJlcXVlbmN5Ij4KLSAgICAgICAgPHVuaXQgbmFtZT0iaHoiLz4KLSAgICAgICAgPHVuaXQgbmFtZT0ia2h6Ii8+Ci0gICAgPC9udW1iZXItZGVmPgotICAgIDxudW1iZXItZGVmIG5hbWU9Imhhc2giPgotICAgICAgICA8dW5pdCBuYW1lPSJoYXNoIi8+Ci0gICAgPC9udW1iZXItZGVmPgotCTxudW1iZXItZGVmIG5hbWU9ImludGVnZXIiPgotCTwvbnVtYmVyLWRlZj4KLSAgICA8bnVtYmVyLWRlZiBuYW1lPSJsZW5ndGgiPgotICAgICAgICA8dW5pdCBuYW1lPSJlbSIvPgotICAgICAgICA8dW5pdCBuYW1lPSJleCIvPgotICAgICAgICA8dW5pdCBuYW1lPSJweCIvPgotICAgICAgICA8dW5pdCBuYW1lPSJpbiIvPgotICAgICAgICA8dW5pdCBuYW1lPSJjbSIvPgotICAgICAgICA8dW5pdCBuYW1lPSJtbSIvPgotICAgICAgICA8dW5pdCBuYW1lPSJwdCIvPgotICAgICAgICA8dW5pdCBuYW1lPSJwYyIvPgotICAgIDwvbnVtYmVyLWRlZj4KLQk8bnVtYmVyLWRlZiBuYW1lPSJudW1iZXIiPgotCTwvbnVtYmVyLWRlZj4KLQk8bnVtYmVyLWRlZiBuYW1lPSJwZXJjZW50YWdlIj4KLQkJPHVuaXQgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvbnVtYmVyLWRlZj4KLQk8bnVtYmVyLWRlZiBuYW1lPSJ0aW1lIj4KLQkJPHVuaXQgbmFtZT0ibXMiLz4KLQkJPHVuaXQgbmFtZT0icyIvPgotCTwvbnVtYmVyLWRlZj4KLQotCTx1bml0LWRlZiBuYW1lPSJjbSI+Ci0JCTx1bml0LXZhbHVlPmNtPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9ImRlZyI+Ci0JCTx1bml0LXZhbHVlPmRlZzwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJlbSI+Ci0JCTx1bml0LXZhbHVlPmVtPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9ImV4Ij4KLQkJPHVuaXQtdmFsdWU+ZXg8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iZ3JhZCI+Ci0JCTx1bml0LXZhbHVlPmdyYWQ8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iaGFzaCI+Ci0JCTx1bml0LXZhbHVlPiM8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iaHoiPgotCQk8dW5pdC12YWx1ZT5IejwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJpbiI+Ci0JCTx1bml0LXZhbHVlPmluPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9ImtoeiI+Ci0JCTx1bml0LXZhbHVlPmtIejwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJtbSI+Ci0JCTx1bml0LXZhbHVlPm1tPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9Im1zIj4KLQkJPHVuaXQtdmFsdWU+bXM8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0icGMiPgotCQk8dW5pdC12YWx1ZT5wYzwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJwZXJjZW50YWdlIj4KLQkJPHVuaXQtdmFsdWU+JTwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJwdCI+Ci0JCTx1bml0LXZhbHVlPnB0PC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InB4Ij4KLQkJPHVuaXQtdmFsdWU+cHg8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0icmFkIj4KLQkJPHVuaXQtdmFsdWU+cmFkPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InMiPgotCQk8dW5pdC12YWx1ZT5zPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0KLSAgICA8IS0tIGtleXdvcmRzIDogc3RyaW5nIGNvbnN0YW50cyAodGhpcyBpcyBsYXN0IHBhcnQuLikgLS0+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjEwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjEwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSIyMDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT4yMDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iMzAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+MzAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjQwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjQwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI1MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT41MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iNjAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+NjAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjcwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjcwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI4MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT44MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iOTAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+OTAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImFib3ZlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YWJvdmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYWJzb2x1dGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5hYnNvbHV0ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJBY3RpdmVCb3JkZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5BY3RpdmVCb3JkZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iQWN0aXZlQ2FwdGlvbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkFjdGl2ZUNhcHRpb248L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYWxsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YWxsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImFsd2F5cyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmFsd2F5czwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJBcHBXb3Jrc3BhY2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5BcHBXb3Jrc3BhY2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYXF1YSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmFxdWE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYXJtZW5pYW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5hcm1lbmlhbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhdXRvIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YXV0bzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhdm9pZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmF2b2lkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkJhY2tncm91bmQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5CYWNrZ3JvdW5kPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJhc2VsaW5lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YmFzZWxpbmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmVoaW5kIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YmVoaW5kPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJlbG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YmVsb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmlkaS1vdmVycmlkZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJpZGktb3ZlcnJpZGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmxhY2siPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ibGFjazwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJibGluayI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJsaW5rPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJsb2NrIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YmxvY2s8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmx1ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJsdWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYm9sZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJvbGQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYm9sZGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ym9sZGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJvdGgiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ib3RoPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJvdHRvbSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJvdHRvbTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJCdXR0b25GYWNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+QnV0dG9uRmFjZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJCdXR0b25IaWdobGlnaHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5CdXR0b25IaWdobGlnaHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iQnV0dG9uU2hhZG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+QnV0dG9uU2hhZG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkJ1dHRvblRleHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5CdXR0b25UZXh0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNhcGl0YWxpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jYXBpdGFsaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNhcHRpb24iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jYXB0aW9uPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkNhcHRpb25UZXh0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Q2FwdGlvblRleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2VudGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2VudGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNlbnRlci1sZWZ0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2VudGVyLWxlZnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2VudGVyLXJpZ2h0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2VudGVyLXJpZ2h0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNoaWxkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2hpbGQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2lyY2xlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2lyY2xlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNqay1pZGVvZ3JhcGhpYyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNqay1pZGVvZ3JhcGhpYzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjbG9zZS1xdW90ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNsb3NlLXF1b3RlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNvZGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jb2RlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNvbmRlbnNlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNvbmRlbnNlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjb2xsYXBzZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNvbGxhcHNlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNvbXBhY3QiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jb21wYWN0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNvbnRpbnVvdXMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jb250aW51b3VzPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNyb3AiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jcm9wPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNyb3NzIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y3Jvc3M8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY3Jvc3NoYWlyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y3Jvc3NoYWlyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImN1cnNpdmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jdXJzaXZlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRhc2hlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRhc2hlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkZWNpbWFsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZGVjaW1hbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkZWNpbWFsLWxlYWRpbmctemVybyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRlY2ltYWwtbGVhZGluZy16ZXJvPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRlZmF1bHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kZWZhdWx0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRpZ2l0cyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRpZ2l0czwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkaXNjIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZGlzYzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkb3R0ZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kb3R0ZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZG91YmxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZG91YmxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImUtcmVzaXplIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZS1yZXNpemU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZW1iZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5lbWJlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJleHBhbmRlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmV4cGFuZGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImV4dHJhLWNvbmRlbnNlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmV4dHJhLWNvbmRlbnNlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJleHRyYS1leHBhbmRlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmV4dHJhLWV4cGFuZGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZhbnRhc3kiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5mYW50YXN5PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZhci1sZWZ0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZmFyLWxlZnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZmFyLXJpZ2h0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZmFyLXJpZ2h0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZhc3QiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5mYXN0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZhc3RlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZhc3Rlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmZW1hbGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5mZW1hbGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZml4ZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5maXhlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmdWNoc2lhIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZnVjaHNpYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJnZW9yZ2lhbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmdlb3JnaWFuPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImdyYXkiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ncmF5PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkdyYXlUZXh0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+R3JheVRleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZ3JlZW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ncmVlbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJncm9vdmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ncm9vdmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaGVicmV3Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aGVicmV3PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImhlbHAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5oZWxwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImhpZGRlbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmhpZGRlbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJoaWRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aGlkZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJoaWdoIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aGlnaDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJIaWdobGlnaHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5IaWdobGlnaHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iSGlnaGxpZ2h0VGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkhpZ2hsaWdodFRleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaGlnaGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aGlnaGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImhpcmFnYW5hIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aGlyYWdhbmE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaGlyYWdhbmEtaXJvaGEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5oaXJhZ2FuYS1pcm9oYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpY29uIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aWNvbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJJbmFjdGl2ZUJvcmRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkluYWN0aXZlQm9yZGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkluYWN0aXZlQ2FwdGlvbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkluYWN0aXZlQ2FwdGlvbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJJbmFjdGl2ZUNhcHRpb25UZXh0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+SW5hY3RpdmVDYXB0aW9uVGV4dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJJbmZvQmFja2dyb3VuZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkluZm9CYWNrZ3JvdW5kPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkluZm9UZXh0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+SW5mb1RleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaW5oZXJpdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmluaGVyaXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaW5saW5lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aW5saW5lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImlubGluZS10YWJsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmlubGluZS10YWJsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbnNldCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmluc2V0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imluc2lkZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmluc2lkZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbnZlcnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pbnZlcnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaXRhbGljIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aXRhbGljPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imp1c3RpZnkiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5qdXN0aWZ5PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImthdGFrYW5hIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+a2F0YWthbmE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ia2F0YWthbmEtaXJvaGEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5rYXRha2FuYS1pcm9oYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsYW5kc2NhcGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sYW5kc2NhcGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGFyZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sYXJnZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsYXJnZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sYXJnZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGVmdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxlZnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGVmdC1zaWRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGVmdC1zaWRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxlZnR3YXJkcyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxlZnR3YXJkczwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsZXZlbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxldmVsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxpZ2h0ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5saWdodGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxpbWUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5saW1lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxpbmUtdGhyb3VnaCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxpbmUtdGhyb3VnaDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsaXN0LWl0ZW0iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5saXN0LWl0ZW08L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG91ZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvdWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxvd2VyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bG93ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG93ZXItYWxwaGEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3dlci1hbHBoYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3dlci1ncmVlayI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvd2VyLWdyZWVrPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxvd2VyLWxhdGluIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bG93ZXItbGF0aW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG93ZXItcm9tYW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3dlci1yb21hbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3dlcmNhc2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3dlcmNhc2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibHRyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bHRyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1hbGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5tYWxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1hcmtlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1hcmtlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtYXJvb24iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5tYXJvb248L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWVkaXVtIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bWVkaXVtPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Ik1lbnUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5NZW51PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Ik1lbnVUZXh0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+TWVudVRleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWVzc2FnZS1ib3giPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5tZXNzYWdlLWJveDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtaWRkbGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5taWRkbGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWl4Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bWl4PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1vbm9zcGFjZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1vbm9zcGFjZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtb3ZlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bW92ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJuLXJlc2l6ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm4tcmVzaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5hcnJvd2VyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bmFycm93ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibmF2eSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5hdnk8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibmUtcmVzaXplIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bmUtcmVzaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5vLWNsb3NlLXF1b3RlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bm8tY2xvc2UtcXVvdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibm8tb3Blbi1xdW90ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5vLW9wZW4tcXVvdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibm8tcmVwZWF0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bm8tcmVwZWF0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5vbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ub25lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5vcm1hbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5vcm1hbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJub3dyYXAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ub3dyYXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibnctcmVzaXplIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bnctcmVzaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im9ibGlxdWUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vYmxpcXVlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im9saXZlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b2xpdmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib25jZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm9uY2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib3Blbi1xdW90ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm9wZW4tcXVvdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib3V0c2V0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b3V0c2V0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im91dHNpZGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vdXRzaWRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im92ZXJsaW5lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b3ZlcmxpbmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icG9pbnRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnBvaW50ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icG9ydHJhaXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5wb3J0cmFpdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwcmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5wcmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icHVycGxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cHVycGxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyZWxhdGl2ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlbGF0aXZlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlcGVhdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlcGVhdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyZXBlYXQteCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlcGVhdC14PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlcGVhdC15Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmVwZWF0LXk8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmlkZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yaWRnZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyaWdodCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJpZ2h0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJpZ2h0LXNpZGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yaWdodC1zaWRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJpZ2h0d2FyZHMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yaWdodHdhcmRzPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJ0bCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJ0bDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJydW4taW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ydW4taW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icy1yZXNpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zLXJlc2l6ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzYW5zLXNlcmlmIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2Fucy1zZXJpZjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzY3JvbGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zY3JvbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iU2Nyb2xsYmFyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+U2Nyb2xsYmFyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNlLXJlc2l6ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNlLXJlc2l6ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzZW1pLWNvbmRlbnNlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNlbWktY29uZGVuc2VkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNlbWktZXhwYW5kZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zZW1pLWV4cGFuZGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNlcGFyYXRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2VwYXJhdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2VyaWYiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zZXJpZjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzaG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2hvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzaWxlbnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zaWxlbnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2lsdmVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2lsdmVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNsb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNsb3dlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNsb3dlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzbWFsbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNtYWxsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNtYWxsLWNhcHMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbWFsbC1jYXBzPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNtYWxsLWNhcHRpb24iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbWFsbC1jYXB0aW9uPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNtYWxsZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbWFsbGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNvZnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zb2Z0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNvbGlkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c29saWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3BlbGwtb3V0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3BlbGwtb3V0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNxdWFyZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNxdWFyZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzdGF0aWMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zdGF0aWM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3RhdHVzLWJhciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnN0YXR1cy1iYXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3ViIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3ViPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InN1cGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3VwZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3ctcmVzaXplIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3ctcmVzaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYmxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUtY2FwdGlvbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlLWNhcHRpb248L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUtY2VsbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlLWNlbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUtY29sdW1uIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGUtY29sdW1uPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYmxlLWNvbHVtbi1ncm91cCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlLWNvbHVtbi1ncm91cDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0YWJsZS1mb290ZXItZ3JvdXAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50YWJsZS1mb290ZXItZ3JvdXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUtaGVhZGVyLWdyb3VwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGUtaGVhZGVyLWdyb3VwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYmxlLXJvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlLXJvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0YWJsZS1yb3ctZ3JvdXAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50YWJsZS1yb3ctZ3JvdXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGVhbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRlYWw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGV4dC10b3AiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50ZXh0LXRvcDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0ZXh0LWJvdHRvbSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRleHQtYm90dG9tPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRoaWNrIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGhpY2s8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGhpbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRoaW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iVGhyZWVERGFya1NoYWRvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPlRocmVlRERhcmtTaGFkb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iVGhyZWVERmFjZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPlRocmVlREZhY2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iVGhyZWVESGlnaGxpZ2h0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+VGhyZWVESGlnaGxpZ2h0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IlRocmVlRExpZ2h0U2hhZG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+VGhyZWVETGlnaHRTaGFkb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iVGhyZWVEU2hhZG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+VGhyZWVEU2hhZG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRvcCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRvcDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0cmFuc3BhcmVudCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRyYW5zcGFyZW50PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVsdHJhLWNvbmRlbnNlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVsdHJhLWNvbmRlbnNlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1bHRyYS1leHBhbmRlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVsdHJhLWV4cGFuZGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVuZGVybGluZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVuZGVybGluZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1cHBlci1hbHBoYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVwcGVyLWFscGhhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVwcGVyLWxhdGluIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dXBwZXItbGF0aW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idXBwZXItcm9tYW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT51cHBlci1yb21hbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1cHBlcmNhc2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT51cHBlcmNhc2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idmlzaWJsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnZpc2libGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idy1yZXNpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT53LXJlc2l6ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ3YWl0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+d2FpdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ3aGl0ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPndoaXRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IndpZGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+d2lkZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iV2luZG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+V2luZG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IldpbmRvd0ZyYW1lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+V2luZG93RnJhbWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iV2luZG93VGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPldpbmRvd1RleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1mYXN0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eC1mYXN0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IngtaGlnaCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtaGlnaDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LWxhcmdlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eC1sYXJnZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LWxvdWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LWxvdWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1sb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LWxvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LXNsb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LXNsb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1zbWFsbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtc21hbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1zb2Z0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eC1zb2Z0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Inh4LXNtYWxsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eHgtc21hbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieHgtbGFyZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54eC1sYXJnZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ5ZWxsb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT55ZWxsb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLTwvY3NzLXByb2ZpbGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLW1vYmlsZTFfMC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtbW9iaWxlMV8wLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ1ZDc2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtbW9iaWxlMV8wLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAtLT4KLTwhLS08IURPQ1RZUEUgY3NzLXByb2ZpbGUgU1lTVEVNICJjc3MtcHJvZmlsZS5kdGQiID4tLT4KLTxjc3MtcHJvZmlsZT4KLQk8cHJvZmlsZS1pbXBvcnQgbmFtZT0iY3NzcHJvZmlsZS1jc3MyLnhtbCIvPgotCTxzdHlsZXNoZWV0LWRlZj4KLQkJPGRlc2NyaXB0aW9uPiVtb2JpbGUxXzAuc3R5bGVzaGVldC1kZWYuZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotCQk8Y2hhcnNldC1ydWxlLz4KLQkJPGltcG9ydC1ydWxlLz4KLQkJPG1lZGlhLXJ1bGUvPgotCQk8c3R5bGUtcnVsZS8+Ci0JPC9zdHlsZXNoZWV0LWRlZj4KLQotCTwhLS0gV2hpY2ggcHJvcGVydGllcyBjYW4gc3R5bGUgcnVsZSBpbmNsdWRlID8gLS0+Ci0JPCEtLSB1c2luZyAib3ZlcndyaXRlIiBtZXRob2Q6IG9ubHkgZGlzYWJsZWQgcHJvcGVydGllcyBhcmUgd3JpdHRlbi4gLS0+Ci0KLQk8c3R5bGUtcnVsZS1kZWYgb3ZlcndyaXRlPSJ0cnVlIj4KLQkJPHNlbGVjdG9yLWV4cHJlc3Npb24gbmFtZT0iY2hpbGQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxzZWxlY3Rvci1leHByZXNzaW9uIG5hbWU9ImFkamFjZW50IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8c2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lPSJhdHRyaWJ1dGUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0iZmlyc3QtY2hpbGQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0ibGluayIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJhY3RpdmUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0ibGFuZyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImF6aW11dGgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItY29sbGFwc2UiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3BhY2luZyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvdHRvbSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNhcHRpb24tc2lkZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNsaXAiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb250ZW50IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY291bnRlci1pbmNyZW1lbnQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb3VudGVyLXJlc2V0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlLWFmdGVyIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlLWJlZm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImN1cnNvciIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRpcmVjdGlvbiIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImVsZXZhdGlvbiIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImVtcHR5LWNlbGxzIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zaXplLWFkanVzdCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc3RyZXRjaCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxlZnQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsZXR0ZXItc3BhY2luZyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxpbmUtaGVpZ2h0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFya2VyLW9mZnNldCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmtzIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWF4LWhlaWdodCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1heC13aWR0aCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1pbi1oZWlnaHQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtaW4td2lkdGgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvcnBoYW5zIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtY29sb3IiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLXN0eWxlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS13aWR0aCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im92ZXJmbG93IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstYWZ0ZXIiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWJlZm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstaW5zaWRlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGF1c2UiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYXVzZS1hZnRlciIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhdXNlLWJlZm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBpdGNoIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGl0Y2gtcmFuZ2UiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbGF5LWR1cmluZyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBvc2l0aW9uIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icXVvdGVzIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icmljaG5lc3MiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJyaWdodCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNpemUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVhayIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWFrLWhlYWRlciIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWFrLW51bWVyYWwiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVhay1wdW5jdHVhdGlvbiIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWVjaC1yYXRlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3RyZXNzIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0idGFibGUtbGF5b3V0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0idGV4dC1zaGFkb3ciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0b3AiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ1bmljb2RlLWJpZGkiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2b2ljZS1mYW1pbHkiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2b2x1bWUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3aWRvd3MiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3b3JkLXNwYWNpbmciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ6LWluZGV4IiBlbmFibGVkPSJmYWxzZSIvPgotCTwvc3R5bGUtcnVsZS1kZWY+Ci0KLQk8IS0tIHByb3BlcnR5IGRlZmluaXRpb24gLS0+Ci0JPCEtLSB1c2luZyAicmVkaWZpbmUiIG1ldGhvZDogaWYgIm92ZXJ3cml0ZSIgYXR0cmlidXRlIGlzIHNldCB0bwotCSJmYWxzZSIJb3Igbm90IHNldCwgaXQgbWVhbnMgdGhlIG5vZGUgaXMgY2xlYW5seSByZWRpZmluZWQgLS0+Ci0KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtYXR0YWNobWVudCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ic2Nyb2xsIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImRpc3BsYXkiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImFsbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImlubGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJibG9jayIvPgotCQk8a2V5d29yZCBuYW1lPSJsaXN0LWl0ZW0iLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS10eXBlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImRpc2MiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2lyY2xlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNxdWFyZSIvPgotCQk8a2V5d29yZCBuYW1lPSJkZWNpbWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLXJvbWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyLXJvbWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLWdyZWVrIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLWFscGhhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyLWFscGhhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1hbGlnbiIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNlbnRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJqdXN0aWZ5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtZGVjb3JhdGlvbiIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0idW5kZXJsaW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InZlcnRpY2FsLWFsaWduIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJiYXNlbGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzdWIiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3VwZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCi0JPCEtLSBjb250YWluZXIgZGVmaW5pdGlvbiA6IENvbnRhaW5lciBpcyB0aGUgbHVtcCBvZiB2YWx1ZXMuCi0JSXQgY2FuIGJlIHVzZWQgbGlrZSBtYWNyb3MuIC0tPgotCTxjb250YWluZXItZGVmIG5hbWU9ImNvbG9yIiBvdmVyd3JpdGU9InRydWUiPgotCQk8Y29udGFpbmVyIG5hbWU9InN5c3RlbS1jb2xvciIgZW5hYmxlZD0iZmFsc2UiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci08L2Nzcy1wcm9maWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS13YXAueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLXdhcC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNDAxYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLXdhcC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gLS0+Ci08IS0tPCFET0NUWVBFIGNzcy1wcm9maWxlIFNZU1RFTSAiY3NzLXByb2ZpbGUuZHRkIiA+LS0+Ci08Y3NzLXByb2ZpbGU+Ci0gICAgICAgIDxwcm9maWxlLWltcG9ydCBuYW1lPSJjc3Nwcm9maWxlLWNzczIueG1sIi8+Ci0gICAgICAgIDxzdHlsZXNoZWV0LWRlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+JXdhcC5zdHlsZXNoZWV0LWRlZi5kZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGNoYXJzZXQtcnVsZS8+Ci0gICAgICAgICAgICAgICAgPGltcG9ydC1ydWxlLz4KLSAgICAgICAgICAgICAgICA8bWVkaWEtcnVsZS8+Ci0gICAgICAgICAgICAgICAgPHN0eWxlLXJ1bGUvPgotICAgICAgICA8L3N0eWxlc2hlZXQtZGVmPgotCi0gICAgICAgIDwhLS0gV2hpY2ggcHJvcGVydGllcyBjYW4gc3R5bGUgcnVsZSBpbmNsdWRlID8gLS0+Ci0gICAgICAgIDwhLS0gdXNpbmcgIm92ZXJ3cml0ZSIgbWV0aG9kOiBvbmx5IGRpc2FibGVkIHByb3BlcnRpZXMgYXJlIHdyaXR0ZW4uIC0tPgotCi0gICAgICAgIDxzdHlsZS1ydWxlLWRlZiBvdmVyd3JpdGU9InRydWUiPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhemltdXRoIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3JkZXItY29sbGFwc2UiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zcGFjaW5nIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b20iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNhcHRpb24tc2lkZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2xpcCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY29udGVudCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY3VlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjdWUtYWZ0ZXIiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImN1ZS1iZWZvcmUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImN1cnNvciIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGlyZWN0aW9uIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbGV2YXRpb24iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImVtcHR5LWNlbGxzIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb250LXNpemUtYWRqdXN0IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb250LXN0cmV0Y2giIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxlZnQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxldHRlci1zcGFjaW5nIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsaW5lLWhlaWdodCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWFya2VyLW9mZnNldCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWFya3MiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heC1oZWlnaHQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heC13aWR0aCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWluLWhlaWdodCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWluLXdpZHRoIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcnBoYW5zIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLWNvbG9yIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLXN0eWxlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLXdpZHRoIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdmVyZmxvdyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGFnZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1hZnRlciIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1iZWZvcmUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstaW5zaWRlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYXVzZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGF1c2UtYWZ0ZXIiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBhdXNlLWJlZm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGl0Y2giIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBpdGNoLXJhbmdlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbGF5LWR1cmluZyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icG9zaXRpb24iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InF1b3RlcyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmljaG5lc3MiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJpZ2h0IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaXplIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGVhayIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3BlYWstaGVhZGVyIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGVhay1udW1lcmFsIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGVhay1wdW5jdHVhdGlvbiIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3BlZWNoLXJhdGUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InN0cmVzcyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFibGUtbGF5b3V0IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LXNoYWRvdyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1bmljb2RlLWJpZGkiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZvaWNlLWZhbWlseSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idm9sdW1lIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ3aWRvd3MiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IndvcmQtc3BhY2luZyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iei1pbmRleCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iLXdhcC1tYXJxdWVlLXN0eWxlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Ii13YXAtbWFycXVlZS1sb29wIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Ii13YXAtbWFycXVlZS1kaXIiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iLXdhcC1tYXJxdWVlLXNwZWVkIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Ii13YXAtYWNjZXNza2V5Ii8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Ii13YXAtaW5wdXQtZm9ybWF0Ii8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Ii13YXAtaW5wdXQtcmVxdWlyZWQiLz4KLSAgICAgICAgPC9zdHlsZS1ydWxlLWRlZj4KLQotICAgICAgICA8IS0tIHByb3BlcnR5IGRlZmluaXRpb24gLS0+Ci0gICAgICAgIDwhLS0gdXNpbmcgInJlZGlmaW5lIiBtZXRob2Q6IGlmICJvdmVyd3JpdGUiIGF0dHJpYnV0ZSBpcyBzZXQgdG8KLSAgICAgICAgImZhbHNlIiBvciBub3Qgc2V0LCBpdCBtZWFucyB0aGUgbm9kZSBpcyBjbGVhbmx5IHJlZGlmaW5lZCAtLT4KLQotICAgICAgICA8cHJvcGVydHktZGVmIG5hbWU9ImRpc3BsYXkiCi0gICAgICAgICAgICAgICAgaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYWxsIiBjYXRlZ29yeT0idmlzdWFsIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmxpbmUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJibG9jayIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Imxpc3QtaXRlbSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Ii13YXAtbWFycXVlZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS10eXBlIgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJkaXNjIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iY2lyY2xlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic3F1YXJlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZGVjaW1hbCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Imxvd2VyLXJvbWFuIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idXBwZXItcm9tYW4iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsb3dlci1hbHBoYSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InVwcGVyLWFscGhhIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1hbGlnbiIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iY2VudGVyIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ianVzdGlmeSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1kZWNvcmF0aW9uIgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ1bmRlcmxpbmUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJibGluayIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0idmVydGljYWwtYWxpZ24iCi0gICAgICAgICAgICAgICAgaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJiYXNlbGluZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InN1YiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InN1cGVyIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idG9wIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibWlkZGxlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iYm90dG9tIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9Ii13YXAtbWFycXVlZS1zdHlsZSIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ3YXAiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InNjcm9sbCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InNsaWRlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iYWx0ZXJuYXRlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9Ii13YXAtbWFycXVlZS1sb29wIgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9IndhcCI+Ci0gICAgICAgICAgICAgICAgPG51bWJlciBuYW1lPSJpbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5maW5pdGUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iLXdhcC1tYXJxdWVlLWRpciIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ3YXAiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Imx0ciIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJ0bCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSItd2FwLW1hcnF1ZWUtc3BlZWQiCi0gICAgICAgICAgICAgICAgaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0id2FwIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzbG93Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZmFzdCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSItd2FwLWFjY2Vzc2tleSIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9IndhcCI+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJrZXljb21iaW5hdGlvbiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSItd2FwLWlucHV0LWZvcm1hdCIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9IndhcCI+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJmb3JtYXQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iLXdhcC1pbnB1dC1yZXF1aXJlZCIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9IndhcCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLQotICAgICAgICA8IS0tIGNvbnRhaW5lciBkZWZpbml0aW9uIDogQ29udGFpbmVyIGlzIHRoZSBsdW1wIG9mIHZhbHVlcy4KLSAgICAgICAgSXQgY2FuIGJlIHVzZWQgbGlrZSBtYWNyb3MuIC0tPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJjb2xvciIgb3ZlcndyaXRlPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9InN5c3RlbS1jb2xvciIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJmb3JtYXQiPgotICAgICAgICAgICAgICAgIDxzdHJpbmcgbmFtZT0iYW55Ii8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0ia2V5Y29tYmluYXRpb24iPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0ia2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iLSIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9ImtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic3BhY2UiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9InNwZWNpYWxrZXkiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJzcGVjaWFsa2V5Ij4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9Im1vZGlmaWVya2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJmdW5jdGlvbmtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0ibmF2aWdhdGlvbmtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0iZWRpdGtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0ibWlzY2tleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0idm9sdW1lY29udHJvbGtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0iYXBwbGljYXRpb25rZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9InBob25la2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJ2ZW5kb3JrZXkiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJtb2RpZmllcmtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iYWNjZXNza2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJjbWRrZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9Im9wdGtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0iY3RybGtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0ic2hpZnRrZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9ImFsdGtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0id2lua2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJtZXRha2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZm4iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmY24iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJjYXBzIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iY21ka2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJjbWQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJyY21kIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibGNtZCIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9Im9wdGtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ib3B0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icm9wdCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImxvcHQiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJjdHJsa2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJjdHJsIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icmN0cmwiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsY3RybCIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9InNoaWZ0a2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzaGlmdCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJzaGlmdCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImxzaGlmdCIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9ImFsdGtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iYWx0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icmFsdCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImxhbHQiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJ3aW5rZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9IndpbiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJ3aW4iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsd2luIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0ibWV0YWtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibWV0YSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJtZXRhIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibG1ldGEiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJmdW5jdGlvbmtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjEiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmMiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImYzIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmNSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImY2Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjciLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmOCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImY5Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjEwIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjExIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjEyIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjEzIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjE0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjE1Ii8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0ibmF2aWdhdGlvbmtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idGFiIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZXNjIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZW50ZXIiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJyZXR1cm4iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJtZW51Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaGVscCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im5hbWVtZW51Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icmNsIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic25kIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iYXJyb3drZXkiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwYWdla2V5Ii8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iYXJyb3drZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InVwIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZG93biIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9InBhZ2VrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImhvbWUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJlbmQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwZ3VwIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icGdkbiIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9ImVkaXRrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImJzIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZGVsIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5zIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idW5kbyIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImN1dCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImNvcHkiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwYXN0ZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImNsciIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InN0byIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9Im1pc2NrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InBydHNjIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic3lzcnEiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzY3Jsb2NrIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icGF1c2UiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJicmsiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJudW1sb2NrIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icHdyIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0idm9sdW1lY29udHJvbGtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idm9sdW1ldXAiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ2b2x1bWVkb3duIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iYXBwbGljYXRpb25rZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im1lbW8iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ0b2RvIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iY2FsZW5kYXIiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJtYWlsIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iYWRkcmVzcyIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9InBob25la2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwaG9uZS1zZW5kIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icGhvbmUtZW5kIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icGhvbmUtYWNjZXB0Ii8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0idmVuZG9ya2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ2bmQuIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLQotICAgICAgICA8Y2F0ZWdvcnktZGVmIG5hbWU9IndhcCI+Ci0gICAgICAgICAgICAgICAgPGNhcHRpb24+JXdhcC5jYXRlZ29yeS1kZWYud2FwLmNhcHRpb248L2NhcHRpb24+Ci0gICAgICAgIDwvY2F0ZWdvcnktZGVmPgotCi0gICAgICAgIDxudW1iZXItZGVmIG5hbWU9Imxlbmd0aCI+Ci0gICAgICAgIDx1bml0IG5hbWU9ImVtIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImV4Ii8+Ci0gICAgICAgIDx1bml0IG5hbWU9InB4Ii8+Ci0gICAgICAgIDwvbnVtYmVyLWRlZj4KLQotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSItd2FwLW1hcnF1ZWUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT4td2FwLW1hcnF1ZWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InNsaWRlIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5zbGlkZTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImFsdGVybmF0ZSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+YWx0ZXJuYXRlPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iaW5maW5pdGUiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmluZmluaXRlPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iLSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+LTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InNwYWNlIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5zcGFjZTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImFjY2Vzc2tleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+YWNjZXNza2V5PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZm4iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmZuPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZmNuIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mY248L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjYXBzIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5jYXBzPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iY21kIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5jbWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyY21kIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5yY21kPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGNtZCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bGNtZDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9Im9wdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+b3B0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icm9wdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cm9wdDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImxvcHQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvcHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjdHJsIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5jdHJsPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icmN0cmwiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnJjdHJsPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGN0cmwiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmxjdHJsPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2hpZnQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnNoaWZ0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icnNoaWZ0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5yc2hpZnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsc2hpZnQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmxzaGlmdDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImFsdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+YWx0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icmFsdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cmFsdDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImxhbHQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmxhbHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ3aW4iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPndpbjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InJ3aW4iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnJ3aW48L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsd2luIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5sd2luPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWV0YSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bWV0YTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InJtZXRhIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5ybWV0YTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImxtZXRhIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5sbWV0YTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImYxIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mMTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImYyIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mMjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImYzIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mMzwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImY0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mNDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImY1Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mNTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImY2Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mNjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImY3Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mNzwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImY4Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mODwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImY5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mOTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImYxMCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZjEwPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjExIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mMTE8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmMTIiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmYxMjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImYxMyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZjEzPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjE0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mMTQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmMTUiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmYxNTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFiPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZXNjIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5lc2M8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJlbnRlciI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZW50ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyZXR1cm4iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnJldHVybjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9Im5hbWVtZW51Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5uYW1lbWVudTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InJjbCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cmNsPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ic25kIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5zbmQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhcnJvd2tleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+YXJyb3drZXk8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwYWdla2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5wYWdla2V5PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0idXAiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnVwPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZG93biI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZG93bjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImhvbWUiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmhvbWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJlbmQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmVuZDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InBndXAiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnBndXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwZ2RuIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5wZ2RuPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iYnMiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmJzPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGVsIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5kZWw8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbnMiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmluczwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InVuZG8iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnVuZG88L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjdXQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmN1dDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImNvcHkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmNvcHk8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwYXN0ZSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cGFzdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjbHIiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmNscjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InN0byI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+c3RvPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icHJ0c2MiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnBydHNjPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3lzcnEiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnN5c3JxPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2NybG9jayI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+c2NybG9jazwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImJyayI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+YnJrPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibnVtbG9jayI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bnVtbG9jazwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InB3ciI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cHdyPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0idm9sdW1ldXAiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnZvbHVtZXVwPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0idm9sdW1lZG93biI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+dm9sdW1lZG93bjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9Im1lbW8iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPm1lbW88L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0b2RvIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT50b2RvPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2FsZW5kYXIiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmNhbGVuZGFyPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWFpbCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bWFpbDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImFkZHJlc3MiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmFkZHJlc3M8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwaG9uZS1zZW5kIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5waG9uZS1zZW5kPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icGhvbmUtZW5kIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5waG9uZS1lbmQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwaG9uZS1hY2NlcHQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnBob25lLWFjY2VwdDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InZuZC4iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnZuZC48L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT50cnVlPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZmFsc2UiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmZhbHNlPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icGF1c2UiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnBhdXNlPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotCi08L2Nzcy1wcm9maWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkN2UzOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBjc3Nwcm9maWxlLWNzczEueG1sCi1jc3MxLnN0eWxlc2hlZXQtZGVmLmRlc2NyaXB0aW9uPUNhc2NhZGluZyBTdHlsZSBTaGVldHMsIGxldmVsIDEKLWNzczEuY2F0ZWdvcnktZGVmLmJveC5jYXB0aW9uPUJveCBtb2RlbAotY3NzMS5jYXRlZ29yeS1kZWYuY29sb3JhbmRiYWNrZ3JvdW5kLmNhcHRpb249Q29sb3JzIGFuZCBCYWNrZ3JvdW5kcwotY3NzMS5jYXRlZ29yeS1kZWYuY2xhc3NpZmljYXRpb24uY2FwdGlvbj1DbGFzc2lmaWNhdGlvbgotY3NzMS5jYXRlZ29yeS1kZWYuZm9udC5jYXB0aW9uPUZvbnQKLWNzczEuY2F0ZWdvcnktZGVmLnRleHQuY2FwdGlvbj1UZXh0Ci0jIGNzc3Byb2ZpbGUtY3NzMi54bWwKLWNzczIuc3R5bGVzaGVldC1kZWYuZGVzY3JpcHRpb249Q2FzY2FkaW5nIFN0eWxlIFNoZWV0cywgbGV2ZWwgMgotY3NzMi5jYXRlZ29yeS1kZWYuYXVyYWwuY2FwdGlvbj1BdXJhbAotY3NzMi5jYXRlZ29yeS1kZWYuYm94LmNhcHRpb249Qm94IG1vZGVsCi1jc3MyLmNhdGVnb3J5LWRlZi5jb2xvcmFuZGJhY2tncm91bmQuY2FwdGlvbj1Db2xvcnMgYW5kIEJhY2tncm91bmRzCi1jc3MyLmNhdGVnb3J5LWRlZi5jb250ZW50LmNhcHRpb249R2VuZXJhdGVkIGNvbnRlbnQvTGlzdAotY3NzMi5jYXRlZ29yeS1kZWYuZm9udC5jYXB0aW9uPUZvbnRzCi1jc3MyLmNhdGVnb3J5LWRlZi5wYWdlLmNhcHRpb249UGFnZWQgbWVkaWEKLWNzczIuY2F0ZWdvcnktZGVmLnRhYmxlcy5jYXB0aW9uPVRhYmxlcwotY3NzMi5jYXRlZ29yeS1kZWYudGV4dC5jYXB0aW9uPVRleHQKLWNzczIuY2F0ZWdvcnktZGVmLnZpc3VhbC5jYXB0aW9uPVZpc3VhbAotY3NzMi5jYXRlZ29yeS1kZWYudWkuY2FwdGlvbj1Vc2VyIGludGVyZmFjZQotIyBjc3Nwcm9maWxlLW1vYmlsZTFfMC54bWwKLW1vYmlsZTFfMC5zdHlsZXNoZWV0LWRlZi5kZXNjcmlwdGlvbj1DU1MgTW9iaWxlIFByb2ZpbGUgMS4wCi0jIGNzc3Byb2ZpbGUtd2FwLnhtbAotd2FwLnN0eWxlc2hlZXQtZGVmLmRlc2NyaXB0aW9uPVdDU1MgMS4wCi13YXAuY2F0ZWdvcnktZGVmLndhcC5jYXB0aW9uPVdDU1MgRXh0ZW5zaW9ucwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9kZXNjcmlwdGlvbi50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Rlc2NyaXB0aW9uLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YzMWYxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Rlc2NyaXB0aW9uLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0KLSAqIE5vbmUgb2YgdGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IAotICogbmVlZCB0byBiZSB0cmFuc2xhdGVkIAotICogZXhjZXB0IGZvciBjc3Nwcm9maWxlLnByb3BlcnRpZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5M2E0ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLXBsdWdpbk5hbWU9U3RydWN0dXJlZCBTb3VyY2UgQ1NTIE1vZGVsCi1jc3Nwcm9maWxlX2NzczIubmFtZT1DU1MyOiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzLCBsZXZlbCAyCi1jc3Nwcm9maWxlX2NzczEubmFtZT1DU1MxOiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzLCBsZXZlbCAxCi1jc3Nwcm9maWxlX21vYmlsZTFfMC5uYW1lPUNTUyBNb2JpbGUgUHJvZmlsZSAxLjAKLWNzc3Byb2ZpbGVfd2FwLm5hbWU9V0NTUyAxLjAKLVN0cnVjdHVyZWRfQ1NTX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWU9U3RydWN0dXJlZCBDU1MgRG9jdW1lbnQgRmFjdG9yeSBFeHRlbnNpb24KLUNTU19Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1DU1MKLV90YXNrTWFya2VyLm5hbWU9Q1NTIFRhc2sKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzY0YjUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jc3Nwcm9maWxlIj4KLQkJPHByb2ZpbGUKLQkJCW5hbWU9IiVjc3Nwcm9maWxlX2NzczIubmFtZSIKLQkJCWRlZmF1bHQ9InRydWUiCi0JCQl1cmk9ImNzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MyLnhtbCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3NzcHJvZmlsZS5jc3MyIj4KLQkJPC9wcm9maWxlPgotCQk8cHJvZmlsZQotCQkJbmFtZT0iJWNzc3Byb2ZpbGVfY3NzMS5uYW1lIgotCQkJdXJpPSJjc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMS54bWwiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3Byb2ZpbGUuY3NzMSI+Ci0JCTwvcHJvZmlsZT4KLQkJPHByb2ZpbGUKLQkJCW5hbWU9IiVjc3Nwcm9maWxlX21vYmlsZTFfMC5uYW1lIgotCQkJdXJpPSJjc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtbW9iaWxlMV8wLnhtbCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3NzcHJvZmlsZS5tb2JpbGUxXzAiPgotCQk8L3Byb2ZpbGU+Ci0JCTxwcm9maWxlCi0JCQluYW1lPSIlY3NzcHJvZmlsZV93YXAubmFtZSIKLQkJCXVyaT0iY3NzcHJvZmlsZS9jc3Nwcm9maWxlLXdhcC54bWwiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3Byb2ZpbGUud2FwIj4KLQkJPC9wcm9maWxlPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsSGFuZGxlciI+Ci0JCTxtb2RlbEhhbmRsZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckNTUyIKLQkJCWFzc29jaWF0ZWRDb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50YXNrc2Nhbm5lciI+Ci0JCTxzY2FubmVyCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRhc2tzLkNTU0ZpbGVUYXNrU2Nhbm5lciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGFza3MuQ1NTRmlsZVRhc2tTY2FubmVyOm9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50YXNrTWFya2VyIgotCQkJY29udGVudFR5cGVJZHM9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlpZD0idGFza01hcmtlciIKLQkJbmFtZT0iJV90YXNrTWFya2VyLm5hbWUiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLQkJPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRhc2ttYXJrZXIiLz4KLQkJPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudGZhY3RvcmllcyIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfQ1NTX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlLmZpbGVUeXBlcyI+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249ImNzcyI+Ci0JCTwvZmlsZVR5cGVzPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdFByb2Nlc3NvcnMiPgotCQk8cHJvY2Vzc29yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JDU1MiCi0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIj4KLQkJPC9wcm9jZXNzb3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlLmNvbnRlbnRUeXBlcyI+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0iY3NzIgotCQkJcHJpb3JpdHk9ImhpZ2giCi0JCQluYW1lPSIlQ1NTX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0Ij4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkNvbnRlbnREZXNjcmliZXJGb3JDU1MiIC8+Ci0JCTwvY29udGVudC10eXBlPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBpbml0aWFsaXplIGNzcyBjb3JlIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk2N2E5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgQ1NTIENvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWW91X2Nhbm5vdF91c2VfQ1NTU3R5bGVTaGVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmc7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQ1NTQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvQ1NTQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTkyZWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvQ1NTQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIENTU0NvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTQ29yZVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIENTU0NvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ1NTQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQotCQkvLyBsaXN0ZW4gZm9yIHJlc291cmNlIGNoYW5nZXMgdG8gdXBkYXRlIGNvbnRlbnQgcHJvcGVydGllcyBrZXlzCi0JCUNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5zdGFydHVwKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBzdG9wIGxpc3Rlbm5pbmcgZm9yIHJlc291cmNlIGNoYW5nZXMgdG8gdXBkYXRlIGNvbnRlbnQgcHJvcGVydGllcwotCQkvLyBrZXlzCi0JCUNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5zaHV0ZG93bigpOwotCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE4ZDFmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVlvdV9jYW5ub3RfdXNlX0NTU1N0eWxlU2hlX1VJXz1Zb3UgY2Fubm90IHVzZSBDU1NTdHlsZVNoZWV0LmdldE93bmVyUnVsZSgpIGJlY2F1c2Ugb2YgbWFueSByZWZlcmVuY2VycyBvZiB0aGlzIHJ1bGVcblBsZWFzZSB1c2UgZ2V0T253ZXJSdWxlcygpCi0jCi1DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmc9VXBkYXRpbmcgQ1NTIENvbnRlbnQgU2V0dGluZ3MKLUNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZz1Qcm9ibGVtIHNhdmluZyBDU1MgQ29udGVudCBTZXR0aW5ncyBmb3IgezB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJmZmRhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYKLSAqIGRlc2lyZWQsIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzCi0gKiBwbHVnaW4uIE90aGVyIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NDbGVhbnVwU3RyYXRlZ3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NDbGVhbnVwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1NTFjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NsZWFudXAvQ1NTQ2xlYW51cFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NDbGVhbnVwU3RyYXRlZ3kgewotCi0Jc3RhdGljIGZpbmFsIHNob3J0IEFTSVMgPSAwOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBMT1dFUiA9IDE7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IFVQUEVSID0gMjsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlzaG9ydCBnZXRJZGVudENhc2UoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlzaG9ydCBnZXRQcm9wTmFtZUNhc2UoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlzaG9ydCBnZXRQcm9wVmFsdWVDYXNlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0Jc2hvcnQgZ2V0U2VsZWN0b3JUYWdDYXNlKCk7Ci0KLQlzaG9ydCBnZXRDbGFzc1NlbGVjdG9yQ2FzZSgpOwotCi0Jc2hvcnQgZ2V0SWRTZWxlY3RvckNhc2UoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNGb3JtYXRTb3VyY2UoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNRdW90ZVZhbHVlcygpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGZvcm1hdFNvdXJjZQotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXZvaWQgc2V0Rm9ybWF0U291cmNlKGJvb2xlYW4gZm9ybWF0U291cmNlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBpZGVudENhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0Jdm9pZCBzZXRJZGVudENhc2Uoc2hvcnQgaWRlbnRDYXNlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wTmFtZUNhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0Jdm9pZCBzZXRQcm9wTmFtZUNhc2Uoc2hvcnQgcHJvcE5hbWVDYXNlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wVmFsdWVDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXZvaWQgc2V0UHJvcFZhbHVlQ2FzZShzaG9ydCBwcm9wVmFsdWVDYXNlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBxdW90ZVZhbHVlcwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXZvaWQgc2V0UXVvdGVWYWx1ZXMoYm9vbGVhbiBxdW90ZVZhbHVlcyk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0b3JUYWdDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXZvaWQgc2V0U2VsZWN0b3JUYWdDYXNlKHNob3J0IHNlbGVjdG9yVGFnQ2FzZSk7Ci0KLQl2b2lkIHNldENsYXNzU2VsZWN0b3JDYXNlKHNob3J0IGNsYXNzU2VsZWN0b3JDYXNlKTsKLQotCXZvaWQgc2V0SWRTZWxlY3RvckNhc2Uoc2hvcnQgaWRTZWxlY3RvckNhc2UpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NTU0NsZWFudXBTdHJhdGVneUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NDbGVhbnVwU3RyYXRlZ3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMDE5MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NTU0NsZWFudXBTdHJhdGVneUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbCBpbXBsZW1lbnRzIENTU0NsZWFudXBTdHJhdGVneSB7Ci0KLQlzdGF0aWMgcHJpdmF0ZSBDU1NDbGVhbnVwU3RyYXRlZ3kgaW5zdGFuY2UgPSBudWxsOwotCS8vIGluaXRpYWxpemUgd2l0aCBkZWZhdWx0cwotCXByb3RlY3RlZCBzaG9ydCBmSWRlbnRDYXNlID0gQVNJUzsKLQlwcm90ZWN0ZWQgc2hvcnQgZlByb3BOYW1lQ2FzZSA9IEFTSVM7Ci0JcHJvdGVjdGVkIHNob3J0IGZQcm9wVmFsdWVDYXNlID0gQVNJUzsKLQlwcm90ZWN0ZWQgc2hvcnQgZlNlbGVjdG9yVGFnQ2FzZSA9IFVQUEVSOwotCXByb3RlY3RlZCBib29sZWFuIGZRdW90ZVZhbHVlcyA9IHRydWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZkZvcm1hdFNvdXJjZSA9IHRydWU7Ci0JcHJvdGVjdGVkIHNob3J0IGZDbGFzc0Nhc2UgPSBBU0lTOwotCXByb3RlY3RlZCBzaG9ydCBmSWRDYXNlID0gQVNJUzsKLQotCS8qKgotCSAqIENTU0NsZWFudXBTdHJhdGVneUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0SWRlbnRDYXNlKCkgewotCQlyZXR1cm4gZklkZW50Q2FzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENTU0NsZWFudXBTdHJhdGVneSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBDU1NDbGVhbnVwU3RyYXRlZ3lJbXBsKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldFByb3BOYW1lQ2FzZSgpIHsKLQkJcmV0dXJuIGZQcm9wTmFtZUNhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRQcm9wVmFsdWVDYXNlKCkgewotCQlyZXR1cm4gZlByb3BWYWx1ZUNhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRTZWxlY3RvclRhZ0Nhc2UoKSB7Ci0JCXJldHVybiBmU2VsZWN0b3JUYWdDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWZJZGVudENhc2UgPSBnZXRDbGVhbnVwQ2FzZVZhbHVlKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9JREVOVElGSUVSKSk7Ci0JCWZQcm9wTmFtZUNhc2UgPSBnZXRDbGVhbnVwQ2FzZVZhbHVlKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9QUk9QRVJUWV9OQU1FKSk7Ci0JCWZQcm9wVmFsdWVDYXNlID0gZ2V0Q2xlYW51cENhc2VWYWx1ZShwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfVkFMVUUpKTsKLQkJZlNlbGVjdG9yVGFnQ2FzZSA9IGdldENsZWFudXBDYXNlVmFsdWUocHJlZnMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX1NFTEVDVE9SKSk7Ci0JCWZJZENhc2UgPSBnZXRDbGVhbnVwQ2FzZVZhbHVlKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9JRF9TRUxFQ1RPUikpOwotCQlmQ2xhc3NDYXNlID0gZ2V0Q2xlYW51cENhc2VWYWx1ZShwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfQ0xBU1NfU0VMRUNUT1IpKTsKLQkJZlF1b3RlVmFsdWVzID0gcHJlZnMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTKTsKLQkJZkZvcm1hdFNvdXJjZSA9IHByZWZzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIENTU0NsZWFudXBTdHJhdGVneSBlcXVpdmFsZW50IGNhc2Ugc2hvcnQgdmFsdWUgd2hlbiBnaXZlbiBhbgotCSAqIGludAotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZXF1aXZhbGVudCBjYXNlIHNob3J0IG9yIEFTSVMgaWYgY2Fubm90IGJlIGRldGVybWluZWQKLQkgKi8KLQlwcml2YXRlIHNob3J0IGdldENsZWFudXBDYXNlVmFsdWUoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUiA6Ci0JCQkJcmV0dXJuIExPV0VSOwotCQkJY2FzZSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSIDoKLQkJCQlyZXR1cm4gVVBQRVI7Ci0JCX0KLQkJcmV0dXJuIEFTSVM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3JtYXRTb3VyY2UoKSB7Ci0JCXJldHVybiBmRm9ybWF0U291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUXVvdGVWYWx1ZXMoKSB7Ci0JCXJldHVybiBmUXVvdGVWYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGZvcm1hdFNvdXJjZQotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcm1hdFNvdXJjZShib29sZWFuIGZvcm1hdFNvdXJjZSkgewotCQlmRm9ybWF0U291cmNlID0gZm9ybWF0U291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBpZGVudENhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SWRlbnRDYXNlKHNob3J0IGlkZW50Q2FzZSkgewotCQlmSWRlbnRDYXNlID0gaWRlbnRDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wTmFtZUNhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcE5hbWVDYXNlKHNob3J0IHByb3BOYW1lQ2FzZSkgewotCQlmUHJvcE5hbWVDYXNlID0gcHJvcE5hbWVDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wVmFsdWVDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BWYWx1ZUNhc2Uoc2hvcnQgcHJvcFZhbHVlQ2FzZSkgewotCQlmUHJvcFZhbHVlQ2FzZSA9IHByb3BWYWx1ZUNhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHF1b3RlVmFsdWVzCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVvdGVWYWx1ZXMoYm9vbGVhbiBxdW90ZVZhbHVlcykgewotCQlmUXVvdGVWYWx1ZXMgPSBxdW90ZVZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0b3JUYWdDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdG9yVGFnQ2FzZShzaG9ydCBzZWxlY3RvclRhZ0Nhc2UpIHsKLQkJZlNlbGVjdG9yVGFnQ2FzZSA9IHNlbGVjdG9yVGFnQ2FzZTsKLQl9Ci0KLQkvLyBUT0RPOiBhIHNhdmVPcHRpb25zIHNob3VsZCBiZSBhZGRlZCB0byBDU1NDbGVhbnVwU3RyYXRlZ3kgaW50ZXJmYWNlCi0JcHVibGljIHZvaWQgc2F2ZU9wdGlvbnMoKSB7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfSURFTlRJRklFUiwgZklkZW50Q2FzZSk7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfTkFNRSwgZlByb3BOYW1lQ2FzZSk7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfVkFMVUUsIGZQcm9wVmFsdWVDYXNlKTsKLQkJQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9TRUxFQ1RPUiwgZlNlbGVjdG9yVGFnQ2FzZSk7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfSURfU0VMRUNUT1IsIGZJZENhc2UpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX0NMQVNTX1NFTEVDVE9SLCBmQ2xhc3NDYXNlKTsKLQkJQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTLCBmUXVvdGVWYWx1ZXMpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSwgZkZvcm1hdFNvdXJjZSk7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyBzaG9ydCBnZXRDbGFzc1NlbGVjdG9yQ2FzZSgpIHsKLQkJcmV0dXJuIGZDbGFzc0Nhc2U7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldElkU2VsZWN0b3JDYXNlKCkgewotCQlyZXR1cm4gZklkQ2FzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc1NlbGVjdG9yQ2FzZShzaG9ydCBjbGFzc1NlbGVjdG9yQ2FzZSkgewotCQlmQ2xhc3NDYXNlID0gY2xhc3NTZWxlY3RvckNhc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWRTZWxlY3RvckNhc2Uoc2hvcnQgaWRTZWxlY3RvckNhc2UpIHsKLQkJZklkQ2FzZSA9IGlkU2VsZWN0b3JDYXNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DbGVhbnVwUHJvY2Vzc29yQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NsZWFudXAvQ2xlYW51cFByb2Nlc3NvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmFkZjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DbGVhbnVwUHJvY2Vzc29yQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTRm9ybWF0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5BYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIENsZWFudXBQcm9jZXNzb3JDU1MgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIHsKLQotCXB1YmxpYyB2b2lkIGNsZWFudXBNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCUNTU0Zvcm1hdFV0aWwgZm9ybWF0VXRpbCA9IENTU0Zvcm1hdFV0aWwuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJSUNTU0RvY3VtZW50IGRvYyA9ICgoSUNTU01vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgZG9jKTsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBmb3JtYXR0ZXIuY2xlYW51cChkb2MpOwotCQkJaWYgKGJ1ZiAhPSBudWxsKSB7Ci0JCQkJaW50IHN0YXJ0T2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBkb2MpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGVuZE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgZG9jKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQlmb3JtYXRVdGlsLnJlcGxhY2VTb3VyY2UoZG9jLmdldE1vZGVsKCksIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgYnVmLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHN0cnVjdHVyZWRNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJTGlzdCBjc3Nub2RlcyA9IGZvcm1hdFV0aWwuY29sbGVjdENTU05vZGVzKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0JCQlpZiAoY3Nzbm9kZXMgIT0gbnVsbCAmJiAhY3Nzbm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJSUNTU01vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNzc25vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlDU1NOb2RlIG5vZGUgPSAoSUNTU05vZGUpIGNzc25vZGVzLmdldChpKTsKLQkJCQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIoKElOb2RlTm90aWZpZXIpIG5vZGUpOwotCQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gZm9ybWF0dGVyLmNsZWFudXAobm9kZSk7Ci0JCQkJCWlmIChidWYgIT0gbnVsbCkgewotCQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJaW50IGVuZE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQlpZiAobW9kZWwgPT0gbnVsbCkgewotCQkJCQkJCW1vZGVsID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJCQkJCX0KLQkJCQkJCWZvcm1hdFV0aWwucmVwbGFjZVNvdXJjZShtb2RlbCwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCBidWYudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW50IGxlbmd0aCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQotCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwRG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIHNob3VsZCBpbXBsZW1lbnQsIG9yIGRlbGV0ZT8KLQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBEb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBzaG91bGQgaW1wbGVtZW50LCBvciBkZWxldGU/Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBnZXRDbGVhbnVwSGFuZGxlcihOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGdldEZvcm1hdFByb2Nlc3NvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9JTWVkaWFHcm91cElELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9JTWVkaWFHcm91cElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMDJhYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSU1lZGlhR3JvdXBJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWVkaWFHcm91cElEIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQ09OVElOVU9VUyA9ICJjb250aW51b3VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fUEFHRUQgPSAicGFnZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX1ZJU1VBTCA9ICJ2aXN1YWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9BVVJBTCA9ICJhdXJhbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX1RBQ1RJTEUgPSAidGFjdGlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fR1JJRCA9ICJncmlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQklUTUFQID0gImJpdG1hcCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fSU5URVJBQ1RJVkUgPSAiaW50ZXJhY3RpdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9TVEFUSUMgPSAic3RhdGljIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9BTEwgPSAiYWxsIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0lWYWxJRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSVZhbElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OWMxYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSVZhbElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmFsSUQgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl8xMDAgPSAiMTAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfMjAwID0gIjIwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzMwMCA9ICIzMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl80MDAgPSAiNDAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfNTAwID0gIjUwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzYwMCA9ICI2MDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl83MDAgPSAiNzAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfODAwID0gIjgwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzkwMCA9ICI5MDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BQk9WRSA9ICJhYm92ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FCU09MVVRFID0gImFic29sdXRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQUNUSVZFQk9SREVSID0gIkFjdGl2ZUJvcmRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FDVElWRUNBUFRJT04gPSAiQWN0aXZlQ2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FMTCA9ICJhbGwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BTFdBWVMgPSAiYWx3YXlzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQVBQV09SS1NQQUNFID0gIkFwcFdvcmtzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FRVUEgPSAiYXF1YSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FSTUVOSUFOID0gImFybWVuaWFuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQVVUTyA9ICJhdXRvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQVZPSUQgPSAiYXZvaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CQUNLR1JPVU5EID0gIkJhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CQVNFTElORSA9ICJiYXNlbGluZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JFSElORCA9ICJiZWhpbmQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CRUxPVyA9ICJiZWxvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JJRElfT1ZFUlJJREUgPSAiYmlkaS1vdmVycmlkZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JMQUNLID0gImJsYWNrIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQkxJTksgPSAiYmxpbmsiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CTE9DSyA9ICJibG9jayI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JMVUUgPSAiYmx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JPTEQgPSAiYm9sZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JPTERFUiA9ICJib2xkZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CT1RIID0gImJvdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CT1RUT00gPSAiYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQlVUVE9ORkFDRSA9ICJCdXR0b25GYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQlVUVE9OSElHSExJR0hUID0gIkJ1dHRvbkhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JVVFRPTlNIQURPVyA9ICJCdXR0b25TaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CVVRUT05URVhUID0gIkJ1dHRvblRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DQVBJVEFMSVpFID0gImNhcGl0YWxpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DQVBUSU9OID0gImNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DQVBUSU9OVEVYVCA9ICJDYXB0aW9uVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NFTlRFUiA9ICJjZW50ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DRU5URVJfTEVGVCA9ICJjZW50ZXItbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NFTlRFUl9SSUdIVCA9ICJjZW50ZXItcmlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DSElMRCA9ICJjaGlsZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NJUkNMRSA9ICJjaXJjbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DSktfSURFT0dSQVBISUMgPSAiY2prLWlkZW9ncmFwaGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0xPU0VfUVVPVEUgPSAiY2xvc2UtcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DT0RFID0gImNvZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DT05ERU5TRUQgPSAiY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ09MTEFQU0UgPSAiY29sbGFwc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DT01QQUNUID0gImNvbXBhY3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DT05USU5VT1VTID0gImNvbnRpbnVvdXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DUk9QID0gImNyb3AiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DUk9TUyA9ICJjcm9zcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NST1NTSEFJUiA9ICJjcm9zc2hhaXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DVVJTSVZFID0gImN1cnNpdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9EQVNIRUQgPSAiZGFzaGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfREVDSU1BTCA9ICJkZWNpbWFsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfREVDSU1BTF9MRUFESU5HX1pFUk8gPSAiZGVjaW1hbC1sZWFkaW5nLXplcm8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ERUZBVUxUID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ESUdJVFMgPSAiZGlnaXRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRElTQyA9ICJkaXNjIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRE9UVEVEID0gImRvdHRlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0RPVUJMRSA9ICJkb3VibGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9FX1JFU0laRSA9ICJlLXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0VNQkVEID0gImVtYmVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRVhQQU5ERUQgPSAiZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9FWFRSQV9DT05ERU5TRUQgPSAiZXh0cmEtY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRVhUUkFfRVhQQU5ERUQgPSAiZXh0cmEtZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GQU5UQVNZID0gImZhbnRhc3kiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GQVJfTEVGVCA9ICJmYXItbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0ZBUl9SSUdIVCA9ICJmYXItcmlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GQVNUID0gImZhc3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GQVNURVIgPSAiZmFzdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRkVNQUxFID0gImZlbWFsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0ZJWEVEID0gImZpeGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRlVDSFNJQSA9ICJmdWNoc2lhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfR0VPUkdJQU4gPSAiZ2VvcmdpYW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9HUkFZID0gImdyYXkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9HUkFZVEVYVCA9ICJHcmF5VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0dSRUVOID0gImdyZWVuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfR1JPT1ZFID0gImdyb292ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hFQlJFVyA9ICJoZWJyZXciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9IRUxQID0gImhlbHAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ISURERU4gPSAiaGlkZGVuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElERSA9ICJoaWRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElHSCA9ICJoaWdoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElHSExJR0hUID0gIkhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJR0hMSUdIVFRFWFQgPSAiSGlnaGxpZ2h0VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJR0hFUiA9ICJoaWdoZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ISVJBR0FOQSA9ICJoaXJhZ2FuYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJUkFHQU5BX0lST0hBID0gImhpcmFnYW5hLWlyb2hhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSUNPTiA9ICJpY29uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5BQ1RJVkVCT1JERVIgPSAiSW5hY3RpdmVCb3JkZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTkFDVElWRUNBUFRJT04gPSAiSW5hY3RpdmVDYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5BQ1RJVkVDQVBUSU9OVEVYVCA9ICJJbmFjdGl2ZUNhcHRpb25UZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5GT0JBQ0tHUk9VTkQgPSAiSW5mb0JhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTkZPVEVYVCA9ICJJbmZvVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOTElORSA9ICJpbmxpbmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTkxJTkVfVEFCTEUgPSAiaW5saW5lLXRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5TRVQgPSAiaW5zZXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTlNJREUgPSAiaW5zaWRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5WRVJUID0gImludmVydCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lUQUxJQyA9ICJpdGFsaWMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9KVVNUSUZZID0gImp1c3RpZnkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9LQVRBS0FOQSA9ICJrYXRha2FuYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0tBVEFLQU5BX0lST0hBID0gImthdGFrYW5hLWlyb2hhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTEFORFNDQVBFID0gImxhbmRzY2FwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xBUkdFID0gImxhcmdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTEFSR0VSID0gImxhcmdlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xFRlQgPSAibGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xFRlRfU0lERSA9ICJsZWZ0LXNpZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MRUZUV0FSRFMgPSAibGVmdHdhcmRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTEVWRUwgPSAibGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MSUdIVEVSID0gImxpZ2h0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MSU1FID0gImxpbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MSU5FX1RIUk9VR0ggPSAibGluZS10aHJvdWdoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTElTVF9JVEVNID0gImxpc3QtaXRlbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xPVUQgPSAibG91ZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xPVyA9ICJsb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1dFUiA9ICJsb3dlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xPV0VSX0FMUEhBID0gImxvd2VyLWFscGhhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTE9XRVJfR1JFRUsgPSAibG93ZXItZ3JlZWsiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1dFUl9MQVRJTiA9ICJsb3dlci1sYXRpbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xPV0VSX1JPTUFOID0gImxvd2VyLXJvbWFuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTE9XRVJDQVNFID0gImxvd2VyY2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xUUiA9ICJsdHIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NQUxFID0gIm1hbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NQVJLRVIgPSAibWFya2VyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUFST09OID0gIm1hcm9vbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01FRElVTSA9ICJtZWRpdW0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NRU5VID0gIm1lbnUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NRU5VVEVYVCA9ICJNZW51VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01FU1NBR0VfQk9YID0gIm1lc3NhZ2UtYm94IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUlERExFID0gIm1pZGRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01JWCA9ICJtaXgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NT05PU1BBQ0UgPSAibW9ub3NwYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTU9WRSA9ICJtb3ZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTl9SRVNJWkUgPSAibi1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OQVJST1dFUiA9ICJuYXJyb3dlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05BVlkgPSAibmF2eSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05FX1JFU0laRSA9ICJuZS1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OT19DTE9TRV9RVU9URSA9ICJuby1jbG9zZS1xdW90ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05PX09QRU5fUVVPVEUgPSAibm8tb3Blbi1xdW90ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05PX1JFUEVBVCA9ICJuby1yZXBlYXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OT05FID0gIm5vbmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OT1JNQUwgPSAibm9ybWFsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTk9XUkFQID0gIm5vd3JhcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05XX1JFU0laRSA9ICJudy1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9PQkxJUVVFID0gIm9ibGlxdWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9PTElWRSA9ICJvbGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX09OQ0UgPSAib25jZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX09QRU5fUVVPVEUgPSAib3Blbi1xdW90ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX09VVFNFVCA9ICJvdXRzZXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9PVVRTSURFID0gIm91dHNpZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9PVkVSTElORSA9ICJvdmVybGluZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1BPSU5URVIgPSAicG9pbnRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1BPUlRSQUlUID0gInBvcnRyYWl0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUFJFID0gInByZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1BVUlBMRSA9ICJwdXJwbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SRUQgPSAicmVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUkVMQVRJVkUgPSAicmVsYXRpdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SRVBFQVQgPSAicmVwZWF0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUkVQRUFUX1ggPSAicmVwZWF0LXgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SRVBFQVRfWSA9ICJyZXBlYXQteSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JJREdFID0gInJpZGdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUklHSFQgPSAicmlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SSUdIVF9TSURFID0gInJpZ2h0LXNpZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SSUdIVFdBUkRTID0gInJpZ2h0d2FyZHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SVEwgPSAicnRsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUlVOX0lOID0gInJ1bi1pbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NfUkVTSVpFID0gInMtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0FOU19TRVJJRiA9ICJzYW5zLXNlcmlmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0NST0xMID0gInNjcm9sbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NDUk9MTEJBUiA9ICJTY3JvbGxiYXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TRV9SRVNJWkUgPSAic2UtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0VNSV9DT05ERU5TRUQgPSAic2VtaS1jb25kZW5zZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TRU1JX0VYUEFOREVEID0gInNlbWktZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TRVBBUkFURSA9ICJzZXBhcmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NFUklGID0gInNlcmlmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0hPVyA9ICJzaG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0lMRU5UID0gInNpbGVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NJTFZFUiA9ICJzaWx2ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TTE9XID0gInNsb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TTE9XRVIgPSAic2xvd2VyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU01BTEwgPSAic21hbGwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TTUFMTF9DQVBTID0gInNtYWxsLWNhcHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TTUFMTF9DQVBUSU9OID0gInNtYWxsLWNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TTUFMTEVSID0gInNtYWxsZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TT0ZUID0gInNvZnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TT0xJRCA9ICJzb2xpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NQRUxMX09VVCA9ICJzcGVsbC1vdXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TUVVBUkUgPSAic3F1YXJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU1RBVElDID0gInN0YXRpYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NUQVRVU19CQVIgPSAic3RhdHVzLWJhciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NVQiA9ICJzdWIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TVVBFUiA9ICJzdXBlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NXX1JFU0laRSA9ICJzdy1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRSA9ICJ0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFX0NBUFRJT04gPSAidGFibGUtY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFX0NFTEwgPSAidGFibGUtY2VsbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFX0NPTFVNTiA9ICJ0YWJsZS1jb2x1bW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRV9DT0xVTU5fR1JPVVAgPSAidGFibGUtY29sdW1uLWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfRk9PVEVSX0dST1VQID0gInRhYmxlLWZvb3Rlci1ncm91cCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFX0hFQURFUl9HUk9VUCA9ICJ0YWJsZS1oZWFkZXItZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRV9ST1cgPSAidGFibGUtcm93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfUk9XX0dST1VQID0gInRhYmxlLXJvdy1ncm91cCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RFQUwgPSAidGVhbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RFWFQgPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RFWFRfVE9QID0gInRleHQtdG9wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEVYVF9CT1RUT00gPSAidGV4dC1ib3R0b20iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9USElDSyA9ICJ0aGljayI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RISU4gPSAidGhpbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RIUkVFRERBUktTSEFET1cgPSAiVGhyZWVERGFya1NoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RIUkVFREZBQ0UgPSAiVGhyZWVERmFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RIUkVFREhJR0hMSUdIVCA9ICJUaHJlZURIaWdobGlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9USFJFRURMSUdIVFNIQURPVyA9ICJUaHJlZURMaWdodFNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RIUkVFRFNIQURPVyA9ICJUaHJlZURTaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UT1AgPSAidG9wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVFJBTlNQQVJFTlQgPSAidHJhbnNwYXJlbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9VTFRSQV9DT05ERU5TRUQgPSAidWx0cmEtY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVUxUUkFfRVhQQU5ERUQgPSAidWx0cmEtZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9VTkRFUkxJTkUgPSAidW5kZXJsaW5lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVVBQRVJfQUxQSEEgPSAidXBwZXItYWxwaGEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9VUFBFUl9MQVRJTiA9ICJ1cHBlci1sYXRpbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1VQUEVSX1JPTUFOID0gInVwcGVyLXJvbWFuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVVBQRVJDQVNFID0gInVwcGVyY2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1ZJU0lCTEUgPSAidmlzaWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1dfUkVTSVpFID0gInctcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfV0FJVCA9ICJ3YWl0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfV0hJVEUgPSAid2hpdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9XSURFUiA9ICJ3aWRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1dJTkRPVyA9ICJXaW5kb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9XSU5ET1dGUkFNRSA9ICJXaW5kb3dGcmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1dJTkRPV1RFWFQgPSAiV2luZG93VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hfRkFTVCA9ICJ4LWZhc3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX0hJR0ggPSAieC1oaWdoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9MQVJHRSA9ICJ4LWxhcmdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9MT1VEID0gIngtbG91ZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hfTE9XID0gIngtbG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9TTE9XID0gIngtc2xvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hfU01BTEwgPSAieC1zbWFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hfU09GVCA9ICJ4LXNvZnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YWF9TTUFMTCA9ICJ4eC1zbWFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hYX0xBUkdFID0gInh4LWxhcmdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWUVMTE9XID0gInllbGxvdyI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDEzZjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTUNvbnRhaW5lciBleHRlbmRzIFByb3BDTU5vZGUgewotCi0JcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIG5vZGVzID0gbmV3IFZlY3RvcigpOwotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgaW5zdGFuY2VzID0gbnVsbDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfQUJTT0xVVEVfU0laRSA9ICJhYnNvbHV0ZS1zaXplIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0JPUkRFUl9TVFlMRSA9ICJib3JkZXItc3R5bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfQk9SREVSX1dJRFRIID0gImJvcmRlci13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9DT0xPUiA9ICJjb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9TWVNURU1fQ09MT1IgPSAic3lzdGVtLWNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0dFTkVSSUNfRkFNSUxZID0gImdlbmVyaWMtZmFtaWx5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0dFTkVSSUNfVk9JQ0UgPSAiZ2VuZXJpYy12b2ljZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9NQVJHSU5fV0lEVEggPSAibWFyZ2luLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX1BBRERJTkdfV0lEVEggPSAicGFkZGluZy13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9SRUxBVElWRV9TSVpFID0gInJlbGF0aXZlLXNpemUiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01Db250YWluZXIoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JT2JqZWN0IGFwcGVuZENoaWxkKE9iamVjdCBub2RlKSB7Ci0JCWlmICghbm9kZXMuY29udGFpbnMobm9kZSkpCi0JCQlub2Rlcy5hZGQobm9kZSk7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkhhdmUoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJaW50IG5DaGlsZCA9IGdldE51bUNoaWxkKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkNoaWxkOyBpKyspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGdldENoaWxkQXQoaSk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBTdHJpbmcgJiYgaWRlbnRpZmllci5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpIGNoaWxkKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFByb3BDTUNvbnRhaW5lciAmJiAoKFByb3BDTUNvbnRhaW5lcikgY2hpbGQpLmNhbkhhdmUoaWRlbnRpZmllcikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q2hpbGRBdChpbnQgaW5kZXgpIHsKLQkJaWYgKG5vZGVzID09IG51bGwgfHwgaW5kZXggPCAwIHx8IG5vZGVzLnNpemUoKSA8PSBpbmRleCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgUHJvcENNQ29udGFpbmVyIGdldENvbnRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBpbml0aWFsaXplCi0JCWlmIChpbnN0YW5jZXMgPT0gbnVsbCkKLQkJCWluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoMjApOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBxdWVyeQotCQlPYmplY3Qgbm9kZSA9IGluc3RhbmNlcy5nZXQobmFtZSk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKFByb3BDTUNvbnRhaW5lcikgbm9kZTsKLQotCQlpZiAoUHJvcENNTm9kZS5pc0xvYWRpbmcoKSkgewotCQkJLy8gcmVnaXN0ZXIKLQkJCW5vZGUgPSBuZXcgUHJvcENNQ29udGFpbmVyKG5hbWUpOwotCQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQkJfQotCi0JCXJldHVybiAoUHJvcENNQ29udGFpbmVyKSBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0SWRlbnRpZmllcnMoU2V0IGlkZW50cykgewotCQlpZiAoaWRlbnRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBuQ2hpbGRyZW4gPSBub2Rlcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkNoaWxkcmVuOyBpKyspIHsKLQkJCU9iamVjdCBub2RlID0gbm9kZXMuZWxlbWVudEF0KGkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBQcm9wQ01Ob2RlKQotCQkJCSgoUHJvcENNTm9kZSkgbm9kZSkuZ2V0SWRlbnRpZmllcnMoaWRlbnRzKTsKLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQkJaWRlbnRzLmFkZChub2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtQ2hpbGQoKSB7Ci0JCWlmIChub2RlcyA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBub2Rlcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBWQUxfQ09OVEFJTkVSOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0VmFsdWVzKENvbGxlY3Rpb24gdmFsdWVzKSB7Ci0JCWlmICh2YWx1ZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IG5DaGlsZHJlbiA9IG5vZGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hpbGRyZW47IGkrKykgewotCQkJT2JqZWN0IG5vZGUgPSBub2Rlcy5lbGVtZW50QXQoaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFByb3BDTU5vZGUpCi0JCQkJKChQcm9wQ01Ob2RlKSBub2RlKS5nZXRWYWx1ZXModmFsdWVzKTsKLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlpZiAoIXZhbHVlcy5jb250YWlucyhub2RlKSkKLQkJCQkJdmFsdWVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCU9iamVjdCByZW1vdmVDaGlsZChPYmplY3Qgbm9kZSkgewotCQlub2Rlcy5yZW1vdmUobm9kZSk7Ci0JCXJldHVybiBub2RlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Gb250UHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUZvbnRQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjhlMjFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUZvbnRQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTUZvbnRQcm9wZXJ0eSBleHRlbmRzIFByb3BDTVByb3BlcnR5IHsKLQotCS8vIHN0YXRpYyBmaWVsZHMKLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGluc3RhbmNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBjYWNoZWRJZE1hcCA9IG51bGw7Ci0JLy8gc2VsZWN0aW5nIHByb3BlcnRpZXMKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9GT05UX0ZBTUlMWSA9ICJmb250LWZhbWlseSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0ZPTlRfU1RZTEUgPSAiZm9udC1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0ZPTlRfVkFSSUFOVCA9ICJmb250LXZhcmlhbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9GT05UX1dFSUdIVCA9ICJmb250LXdlaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0ZPTlRfU1RSRVRDSCA9ICJmb250LXN0cmV0Y2giOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9GT05UX1NJWkUgPSAiZm9udC1zaXplIjsvLyROT04tTkxTLTEkCi0JLy8gcXVhbGlmaWNhdGlvbiBwcm9wZXJ0aWVzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfVU5JQ09ERV9SQU5HRSA9ICJ1bmljb2RlLXJhbmdlIjsvLyROT04tTkxTLTEkCi0JLy8gbnVtZXJpYyBwcm9wZXJ0aWVzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfVU5JVFNfUEVSX0VNID0gInVuaXRzLXBlci1lbSI7Ly8kTk9OLU5MUy0xJAotCS8vIHJlZmVyZW5jaW5nIHByb3BlcnRpZXMKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9TUkMgPSAic3JjIjsvLyROT04tTkxTLTEkCi0JLy8gbWF0Y2hpbmcgcHJvcGVydGllcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1BBTk9TRV8xID0gInBhbm9zZS0xIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfU1RFTVYgPSAic3RlbXYiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9TVEVNSCA9ICJzdGVtaCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1NMT1BFID0gInNsb3BlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfQ0FQX0hFSUdIVCA9ICJjYXAtaGVpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfWF9IRUlHSFQgPSAieC1oZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9BU0NFTlQgPSAiYXNjZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfREVTQ0VOVCA9ICJkZXNjZW50IjsvLyROT04tTkxTLTEkCi0JLy8gc3ludGhlc2lzIHByb3BlcnRpZXMKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9XSURUSFMgPSAid2lkdGhzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfQkJPWCA9ICJiYm94IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfREVGSU5JVElPTl9TUkMgPSAiZGVmaW5pdGlvbi1zcmMiOy8vJE5PTi1OTFMtMSQKLQkvLyBhbGlnbm1lbnQgcHJvcGVydGllcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0JBU0VMSU5FID0gImJhc2VsaW5lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfQ0VOVEVSTElORSA9ICJjZW50ZXJsaW5lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfTUFUSExJTkUgPSAibWF0aGxpbmUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9UT1BMSU5FID0gInRvcGxpbmUiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01Gb250UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wQ01Qcm9wZXJ0eSBnZXRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNUHJvcGVydHkpIG5vZGU7Ci0KLQkJLy8gcmVnaXN0ZXIKLQkJaWYgKFByb3BDTU5vZGUuaXNMb2FkaW5nKCkpIHsKLQkJCW5vZGUgPSBuZXcgUHJvcENNRm9udFByb3BlcnR5KG5hbWUpOwotCQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQkJfQotCi0JCXJldHVybiAoUHJvcENNUHJvcGVydHkpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnVtZXJhdGlvbiBnZXROYW1lRW51bSgpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBpbnN0YW5jZXMua2V5cygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gZ2V0UHJvcGVydHlFbnVtKCkgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJcmV0dXJuIGluc3RhbmNlcy5lbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gVkFMX0ZPTlRQUk9QRVJUWTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBuYW1lcygpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBuZXcgVmVjdG9yKGluc3RhbmNlcy5rZXlTZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IG5hbWVzKE9iamVjdCBtZWRpYUdyb3VwKSB7Ci0JCWlmIChtZWRpYUdyb3VwID09IG51bGwpCi0JCQlyZXR1cm4gbmFtZXMoKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJVmVjdG9yIHByb3BlcnRpZXMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJSXRlcmF0b3IgaXQgPSBpbnN0YW5jZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJUHJvcENNUHJvcGVydHkgcHJvcCA9IChQcm9wQ01Qcm9wZXJ0eSkgaXQubmV4dCgpOwotCQkJaWYgKHByb3AuZ2V0TWVkaWFHcm91cHMoKS5jb250YWlucyhtZWRpYUdyb3VwKSkKLQkJCQlwcm9wZXJ0aWVzLmFkZChwcm9wLmdldE5hbWUoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBJZiBpdGVudGlmaWVyIGlzIG51bGwsIGdldCBhbGwgcHJvcGVydGllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmVjdG9yIHByb3BlcnRpZXNGb3IoU3RyaW5nIGlkZW50aWZpZXIsIGJvb2xlYW4gc2hvcnRoYW5kcykgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gaWYgaWRlbnRpZmllciBpcyBudWxsLCBnZXQgYWxsIHByb3BlcnRpZXMKLQkJaWYgKGlkZW50aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgVmVjdG9yKGluc3RhbmNlcy52YWx1ZXMoKSk7Ci0KLQkJaWYgKGNhY2hlZElkTWFwID09IG51bGwpIHsKLQkJCS8vIHN0YXJ0IGNhY2hlaW5nCi0JCQljYWNoZWRJZE1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHNlYXJjaCBjYWNoZWQKLQkJCU9iamVjdCByZXQgPSBjYWNoZWRJZE1hcC5nZXQoaWRlbnRpZmllciArIFN0cmluZy52YWx1ZU9mKHNob3J0aGFuZHMpKTsKLQkJCWlmIChyZXQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IFZlY3RvcigoQ29sbGVjdGlvbikgcmV0KTsKLQkJfQotCi0JCS8vIGNyZWF0ZQotCQlFbnVtZXJhdGlvbiBwcm9wZXJ0aWVzID0gZ2V0UHJvcGVydHlFbnVtKCk7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJd2hpbGUgKHByb3BlcnRpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVByb3BDTVByb3BlcnR5IHByb3AgPSAoUHJvcENNUHJvcGVydHkpIHByb3BlcnRpZXMubmV4dEVsZW1lbnQoKTsKLQkJCWlmICghc2hvcnRoYW5kcyAmJiBwcm9wLmlzU2hvcnRoYW5kKCkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAocHJvcC5jYW5IYXZlKGlkZW50aWZpZXIpKQotCQkJCXNldC5hZGQocHJvcCk7Ci0JCX0KLQotCQkvLyBjYWNoZQotCQljYWNoZWRJZE1hcC5wdXQoaWRlbnRpZmllciArIFN0cmluZy52YWx1ZU9mKHNob3J0aGFuZHMpLCBzZXQpOwotCi0JCXJldHVybiBuZXcgVmVjdG9yKHNldCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUZ1bmN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01GdW5jdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2VmYzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUZ1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNRnVuY3Rpb24gZXh0ZW5kcyBQcm9wQ01Ob2RlIHsKLQotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgaW5zdGFuY2VzID0gbnVsbDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfQVRUUiA9ICJhdHRyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0NPVU5URVIgPSAiY291bnRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9SR0IgPSAicmdiIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX1NIQVBFID0gInJlY3QiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfVVJJID0gInVybCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9GT1JNQVQgPSAiZm9ybWF0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0xPQ0FMID0gImxvY2FsIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcENNRnVuY3Rpb24oU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRJZGVudGlmaWVycyhTZXQgaW5kZW50cykgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBwdWJsaWMgUHJvcENNRnVuY3Rpb24gZ2V0SW5zdGFuY2VPZihTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gaW5pdGlhbGl6ZQotCQlpZiAoaW5zdGFuY2VzID09IG51bGwpCi0JCQlpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKDEwKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gcXVlcnkKLQkJT2JqZWN0IG5vZGUgPSBpbnN0YW5jZXMuZ2V0KG5hbWUpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChQcm9wQ01GdW5jdGlvbikgbm9kZTsKLQotCQkvLyByZWdpc3RlcgotCQlpZiAoUHJvcENNTm9kZS5pc0xvYWRpbmcoKSkgewotCQkJbm9kZSA9IG5ldyBQcm9wQ01GdW5jdGlvbihuYW1lKTsKLQkJCWluc3RhbmNlcy5wdXQobmFtZSwgbm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gKFByb3BDTUZ1bmN0aW9uKSBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gVkFMX0ZVTkM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRWYWx1ZXMoQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcyAhPSBudWxsICYmICF2YWx1ZXMuY29udGFpbnModGhpcykpCi0JCQl2YWx1ZXMuYWRkKHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYTg0ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvcENNTm9kZSB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9JREVOVElGSUVSID0gMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9QUk9QRVJUWSA9IDE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfTlVNQkVSID0gMjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9TVFJJTkcgPSAzOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX0ZVTkMgPSA0OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX0NPTlRBSU5FUiA9IDU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfU1VCUFJPUEVSVFkgPSA2OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX0ZPTlRQUk9QRVJUWSA9IDc7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfVU5JQ09ERV9SQU5HRSA9IDg7Ci0JcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgbmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgc2hvcnQgTE9BRElORyA9IDA7IC8vIDAgOiBub3QgaW5pdGlhbGl6ZWQsIDEgOiB1bmRlcgotCQkJCQkJCQkJCS8vIGluaXRpYWxpemluZywgMiA6IGluaXRpYWxpemUtZG9uZQotCQkJCQkJCQkJCS8vIGFuZCBmaXggREIKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBQcm9wQ01Ob2RlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFNldCBnZXRJZGVudGlmaWVycygpIHsKLQkJSGFzaFNldCBpZHMgPSBuZXcgSGFzaFNldCgpOwotCQlnZXRJZGVudGlmaWVycyhpZHMpOwotCQlyZXR1cm4gaWRzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWFic3RyYWN0IHZvaWQgZ2V0SWRlbnRpZmllcnMoU2V0IGluZGVudHMpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgc2hvcnQgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0VmFsdWVzKCkgewotCQlWZWN0b3IgdmFscyA9IG5ldyBWZWN0b3IoKTsKLQkJZ2V0VmFsdWVzKHZhbHMpOwotCQlyZXR1cm4gdmFsczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlhYnN0cmFjdCB2b2lkIGdldFZhbHVlcyhDb2xsZWN0aW9uIHZhbHVlcyk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdFByb3BlcnR5Q00oKSB7Ci0JCWlmICghaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJcmV0dXJuOwotCQlMT0FESU5HID0gMTsKLQotCQlQcm9wQ01OdW1iZXIuaW5pdE51bWJlckNNRGltKCk7Ci0KLQkJLy8gYXppbXV0aAotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0FaSU1VVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfQU5HTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUX1NJREUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0ZBUl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DRU5URVJfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0VOVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DRU5URVJfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GQVJfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUX1NJREUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JFSElORCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVFdBUkRTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVFdBUkRTKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgyKTsKLQotCQkvLyBiYWNrZ3JvdW5kCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkcpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19JTUFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19SRVBFQVQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQVRUQUNITUVOVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg2KTsKLQotCQkvLyBiYWNrZ3JvdW5kLWF0dGFjaG1lbnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19BVFRBQ0hNRU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TQ1JPTEwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0ZJWEVEKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJhY2tncm91bmQtY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19DT0xPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UUkFOU1BBUkVOVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBiYWNrZ3JvdW5kLWltYWdlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfSU1BR0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYmFja2dyb3VuZC1wb3NpdGlvbiAtLS0tIHN1Yi1wcm9wZXJ0aWVzIGhvcml6b250YWwKLQkJcHJvcCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NFTlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYmFja2dyb3VuZC1wb3NpdGlvbiAtLS0tIHN1Yi1wcm9wZXJ0aWVzIHZlcnRpY2FsCi0JCXByb3AgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NFTlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJhY2tncm91bmQtcG9zaXRpb24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMik7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBiYWNrZ3JvdW5kLXJlcGVhdAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1JFUEVBVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUkVQRUFUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SRVBFQVRfWCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUkVQRUFUX1kpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PX1JFUEVBVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXIKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NUWUxFKSk7Ci0JCS8vIHByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTE9SKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg5KTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1jb2xsYXBzZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xMQVBTRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ09MTEFQU0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NFUEFSQVRFKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1jb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpKTsKLQkJLy8gcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RSQU5TUEFSRU5UKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXNwYWNpbmcKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1BBQ0lORyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDIpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSkpOwotCQkvLyBwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9TVFlMRSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItdG9wCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgzKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1yaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX0NPTE9SKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgzKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1ib3R0b20KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWxlZnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX0NPTE9SKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgzKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci10b3AtY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXRvcC1zdHlsZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXRvcC13aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXJpZ2h0LWNvbG9yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXJpZ2h0LXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1yaWdodC13aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItYm90dG9tLWNvbG9yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1ib3R0b20tc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1ib3R0b20td2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1sZWZ0LWNvbG9yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItbGVmdC1zdHlsZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1sZWZ0LXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1dJRFRIKTsKLQkJLy8gcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3R0b20KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBjYXB0aW9uLXNpZGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DQVBUSU9OX1NJREUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBjbGVhcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMRUFSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQk9USCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1RBVElDKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNsaXAgLS0tLSBzdWItcHJvcGVydGllcyB0b3AKLQkJcHJvcCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJKChQcm9wQ01TdWJQcm9wZXJ0eSkgcHJvcCkuc2V0Q29udGFpbmVyKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBjbGlwIC0tLS0gc3ViLXByb3BlcnRpZXMgcmlnaHQKLQkJcHJvcCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQkoKFByb3BDTVN1YlByb3BlcnR5KSBwcm9wKS5zZXRDb250YWluZXIoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNsaXAgLS0tLSBzdWItcHJvcGVydGllcyBib3R0b20KLQkJcHJvcCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJKChQcm9wQ01TdWJQcm9wZXJ0eSkgcHJvcCkuc2V0Q29udGFpbmVyKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBjbGlwIC0tLS0gc3ViLXByb3BlcnRpZXMgbGVmdAotCQlwcm9wID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJKChQcm9wQ01TdWJQcm9wZXJ0eSkgcHJvcCkuc2V0Q29udGFpbmVyKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBjbGlwCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfU0hBUEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNvbG9yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBjb250ZW50Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09OVEVOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9BTlkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9DT1VOVEVSKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfQVRUUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX09QRU5fUVVPVEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NMT1NFX1FVT1RFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT19PUEVOX1FVT1RFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT19DTE9TRV9RVU9URSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7IC8vIGluZmluaXRlCi0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQUxMKTsKLQotCQkvLyBjb3VudGVyLWluY3JlbWVudAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPVU5URVJfSU5DUkVNRU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX0NPVU5URVJfSUQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0lOVEVHRVIpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BTEwpOwotCi0JCS8vIGNvdW50ZXItcmVzZXQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT1VOVEVSX1JFU0VUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX0NPVU5URVJfSUQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0lOVEVHRVIpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BTEwpOwotCi0JCS8vIGN1ZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9CRUZPUkUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFX0FGVEVSKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgyKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gY3VlLWFmdGVyCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFX0FGVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gY3VlLWJlZm9yZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9CRUZPUkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBjdXJzb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVVJTT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NST1NTSEFJUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfREVGQVVMVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUE9JTlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTU9WRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRV9SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05FX1JFU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTldfUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OX1JFU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0VfUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TV19SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NfUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9XX1JFU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEVYVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfV0FJVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSEVMUCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7IC8vIGluZmluaXRlCi0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9JTlRFUkFDVElWRSk7Ci0KLQkJLy8gZGlyZWN0aW9uCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRElSRUNUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MVFIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JUTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBkaXNwbGF5Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRElTUExBWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5MSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CTE9DSyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTElTVF9JVEVNKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SVU5fSU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NPTVBBQ1QpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX01BUktFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0lOTElORV9UQUJMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEVfUk9XX0dST1VQKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRV9IRUFERVJfR1JPVVApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX0ZPT1RFUl9HUk9VUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEVfUk9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRV9DT0xVTU5fR1JPVVApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX0NPTFVNTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEVfQ0VMTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEVfQ0FQVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQUxMKTsKLQotCQkvLyBlbGV2YXRpb24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9FTEVWQVRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfQU5HTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CRUxPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVWRUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FCT1ZFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISUdIRVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPV0VSKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gZW1wdHktY2VsbHMKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9FTVBUWV9DRUxMUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0hPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElERSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmbG9hdAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZMT0FUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9WQVJJQU5UKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfV0VJR0hUKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSU5FX0hFSUdIVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX0ZBTUlMWSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NBUFRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0lDT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX01FTlUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX01FU1NBR0VfQk9YKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TTUFMTF9DQVBUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TVEFUVVNfQkFSKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZvbnQtZmFtaWx5Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9GQU1JTFkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfRk9OVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0dFTkVSSUNfRkFNSUxZKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250LXNpemUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0FCU09MVVRFX1NJWkUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9SRUxBVElWRV9TSVpFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZvbnQtc2l6ZS1hZGp1c3QKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkVfQURKVVNUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZm9udC1zdHJldGNoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFJFVENIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1dJREVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OQVJST1dFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVUxUUkFfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FWFRSQV9DT05ERU5TRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NPTkRFTlNFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0VNSV9DT05ERU5TRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NFTUlfRVhQQU5ERUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FWFRSQV9FWFBBTkRFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVUxUUkFfRVhQQU5ERUQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZm9udC1zdHlsZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0lUQUxJQyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfT0JMSVFVRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZvbnQtdmFyaWFudAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfVkFSSUFOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU01BTExfQ0FQUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZvbnQtd2VpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9XRUlHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JPTEQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzEwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfMjAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl8zMDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzQwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfNTAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl82MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzcwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfODAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl85MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xJR0hURVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JPTERFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGhlaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0hFSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGxlZnR0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGxldHRlci1zcGFjaW5nCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTEVUVEVSX1NQQUNJTkcpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGxpbmUtaGVpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElORV9IRUlHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbGlzdC1zdHlsZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1RZUEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9QT1NJVElPTikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX0lNQUdFKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgzKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGxpc3Qtc3R5bGUtaW1hZ2UKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX0lNQUdFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGxpc3Qtc3R5bGUtcG9zaXRpb24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1BPU0lUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTlNJREUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX09VVFNJREUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbGlzdC1zdHlsZS10eXBlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9UWVBFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ESVNDKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DSVJDTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NRVUFSRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfREVDSU1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfREVDSU1BTF9MRUFESU5HX1pFUk8pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPV0VSX1JPTUFOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VUFBFUl9ST01BTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTE9XRVJfR1JFRUspOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPV0VSX0FMUEhBKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1dFUl9MQVRJTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVVBQRVJfQUxQSEEpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VQUEVSX0xBVElOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9IRUJSRVcpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FSTUVOSUFOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9HRU9SR0lBTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0pLX0lERU9HUkFQSElDKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISVJBR0FOQSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfS0FUQUtBTkEpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hJUkFHQU5BX0lST0hBKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9LQVRBS0FOQV9JUk9IQSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXJnaW4KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU4pOwotCQkvLyBwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX01BUkdJTl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fVE9QKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9SSUdIVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fQk9UVE9NKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9MRUZUKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1hcmdpbi10b3AKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9NQVJHSU5fV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1hcmdpbi1yaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfTUFSR0lOX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXJnaW4tYm90dG9tCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfTUFSR0lOX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXJnaW4tbGVmdAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9NQVJHSU5fV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1hcmtlci1vZmZzZXQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJLRVJfT0ZGU0VUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWFya3MKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJLUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ1JPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ1JPU1MpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMik7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9QQUdFRCk7Ci0KLQkJLy8gbWF4LWhlaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BWF9IRUlHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXgtd2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVhfV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtaW4taGVpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUlOX0hFSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1pbi13aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01JTl9XSURUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG9ycGhhbnMKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PUlBIQU5TKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0lOVEVHRVIpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1BBR0VEKTsKLQotCQkvLyBvdXRsaW5lCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX1dJRFRIKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgzKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0lOVEVSQUNUSVZFKTsKLQotCQkvLyBvdXRsaW5lLWNvbG9yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9DT0xPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTlZFUlQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fSU5URVJBQ1RJVkUpOwotCi0JCS8vIG91dGxpbmUtc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0lOVEVSQUNUSVZFKTsKLQotCQkvLyBvdXRsaW5lLXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9XSURUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9JTlRFUkFDVElWRSk7Ci0KLQkJLy8gb3ZlcmZsb3cKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVkVSRkxPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVklTSUJMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElEREVOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TQ1JPTEwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gcGFkZGluZwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkcpOwotCQkvLyBwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1BBRERJTkdfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1ApKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19SSUdIVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0JPVFRPTSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0xFRlQpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gcGFkZGluZy10b3AKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUEFERElOR19XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gcGFkZGluZy1yaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1BBRERJTkdfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHBhZGRpbmctYm90dG9tCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1BBRERJTkdfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHBhZGRpbmctbGVmdAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUEFERElOR19XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gcGFnZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfUEFHRV9JRCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIHBhZ2UtYnJlYWstYWZ0ZXIKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0FGVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BTFdBWVMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FWT0lEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9QQUdFRCk7Ci0KLQkJLy8gcGFnZS1icmVhay1iZWZvcmUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0JFRk9SRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUxXQVlTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVk9JRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIHBhZ2UtYnJlYWstaW5zaWRlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19JTlNJREUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FWT0lEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1BBR0VEKTsKLQotCQkvLyBwYXVzZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1RJTUUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDIpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBwYXVzZS1hZnRlcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFX0FGVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1RJTUUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gcGF1c2UtYmVmb3JlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFVU0VfQkVGT1JFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1RJTUUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gcGl0Y2gKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QSVRDSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9GUkVRVUVOQ1kpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YX0xPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRURJVU0pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hJR0gpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1hfSElHSCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHBpdGNoLXJhbmdlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUElUQ0hfUkFOR0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHBsYXktZHVyaW5nCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUExBWV9EVVJJTkcpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX01JWCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUkVQRUFUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBwb3NpdGlvbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BPU0lUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BQlNPTFVURSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUkVMQVRJVkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0ZJWEVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TVEFUSUMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gcXVvdGVzCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUVVPVEVTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX0FOWSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gcmljaG5lc3MKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9SSUNITkVTUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gcmlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHNpemUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1BPUlRSQUlUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MQU5EU0NBUEUpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMik7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9QQUdFRCk7Ci0KLQkJLy8gc3BlYWsKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBSyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TUEVMTF9PVVQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBzcGVhay1oZWFkZXIKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19IRUFERVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX09OQ0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FMV0FZUyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHNwZWFrLW51bWVyYWwKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19OVU1FUkFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ESUdJVFMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NPTlRJTlVPVVMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBzcGVhay1wdW5jdHVhdGlvbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX1BVTkNUVUFUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT0RFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gc3BlZWNoLXJhdGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVFQ0hfUkFURSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YX1NMT1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NMT1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX01FRElVTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRkFTVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9GQVNUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gc3RyZXNzCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1RSRVNTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyB0YWJsZS1sYXlvdXQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9UQUJMRV9MQVlPVVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0ZJWEVEKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHRleHQtYWxpZ24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0FMSUdOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DRU5URVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9KVVNUSUZZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX0FOWSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdGV4dC1kZWNvcmF0aW9uCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9ERUNPUkFUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VTkRFUkxJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX09WRVJMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MSU5FX1RIUk9VR0gpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JMSU5LKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdGV4dC1pbmRlbnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0lOREVOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHRleHQtc2hhZG93Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9TSEFET1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHRleHQtdHJhbnNmb3JtCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9UUkFOU0ZPUk0pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NBUElUQUxJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VQUEVSQ0FTRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTE9XRVJDQVNFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHRvcAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHVuaWNvZGUtYmlkaQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1VOSUNPREVfQklESSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FTUJFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQklESV9PVkVSUklERSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB2ZXJ0aWNhbC1hbGlnbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZFUlRJQ0FMX0FMSUdOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RFWFRfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TVUIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JBU0VMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NSURETEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NVUEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9URVhUX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdmlzaWJpbGl0eQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZJU0lCSUxJVFkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1ZJU0lCTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hJRERFTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ09MTEFQU0UpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdm9pY2UtZmFtaWx5Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVk9JQ0VfRkFNSUxZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX1ZPSUNFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfR0VORVJJQ19WT0lDRSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyB2b2x1bWUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WT0xVTUUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0lMRU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YX1NPRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NPRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX01FRElVTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTE9VRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9MT1VEKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gd2hpdGUtc3BhY2UKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSElURV9TUEFDRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9QUkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PV1JBUCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB3aWRvd3MKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSURPV1MpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfSU5URUdFUikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIHdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB3b3JkLXNwYWNpbmcKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XT1JEX1NQQUNJTkcpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHotaW5kZXgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9aX0lOREVYKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0lOVEVHRVIpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8qKiAqKioqKioqKiBmb250IHByb3BlcnRpZXMgKioqKioqKioqICovCi0JCS8vIGZvbnQtZmFtaWx5Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfRk9OVF9GQU1JTFkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfRk9OVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0dFTkVSSUNfRkFNSUxZKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gZm9udC1zdHlsZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0ZPTlRfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0lUQUxJQyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfT0JMSVFVRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BTEwpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIGZvbnQtdmFyaWFudAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0ZPTlRfVkFSSUFOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU01BTExfQ0FQUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyBmb250LXdlaWdodAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0ZPTlRfV0VJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT0xEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl8xMDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzIwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfMzAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl80MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzUwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfNjAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl83MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzgwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfOTAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FMTCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gZm9udC1zdHJldGNoCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfRk9OVF9TVFJFVENIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VMVFJBX0NPTkRFTlNFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRVhUUkFfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT05ERU5TRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NFTUlfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TRU1JX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FWFBBTkRFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRVhUUkFfRVhQQU5ERUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VMVFJBX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BTEwpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIGZvbnQtc2l6ZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0ZPTlRfU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQUJTT0xVVEVfU0laRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1JFTEFUSVZFX1NJWkUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FMTCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gdW5pY29kZS1yYW5nZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1VOSUNPREVfUkFOR0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVVSYW5nZS5nZXRJbnN0YW5jZU9mKFByb3BDTVVSYW5nZS5WQUxfVVJBTkdFKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gdW5pdHMtcGVyLWVtCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfVU5JVFNfUEVSX0VNKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIHNyYwotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1NSQyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfRk9STUFUKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfTE9DQUwpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyBwYW5vc2UtMQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1BBTk9TRV8xKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0lOVEVHRVIpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDEwKTsKLQotCQkvLyBzdGVtdgotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1NURU1WKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIHN0ZW1oCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfU1RFTUgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gc2xvcGUKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9TTE9QRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBjYXAtaGVpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfQ0FQX0hFSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyB4LWhlaWdodAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1hfSEVJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIGFzY2VudAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0FTQ0VOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBkZXNjZW50Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfREVTQ0VOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyB3aWR0aHMKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9XSURUSFMpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNVVJhbmdlLmdldEluc3RhbmNlT2YoUHJvcENNVVJhbmdlLlZBTF9VUkFOR0UpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyBiYm94Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfQkJPWCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDQpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0KLQkJLy8gZGVmaW5pdGlvbi1zcmMKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9ERUZJTklUSU9OX1NSQyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0KLQkJLy8gYmFzZWxpbmUKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9CQVNFTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBjZW50ZXJsaW5lCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfQ0VOVEVSTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBtYXRobGluZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX01BVEhMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIHRvcGxpbmUKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9UT1BMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8qKiAqKioqKioqKiBjb250YWluZXJzICoqKioqKioqKiAqLwotCi0JCS8vIGFic29sdXRlLXNpemUKLQkJUHJvcENNQ29udGFpbmVyIGNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9BQlNPTFVURV9TSVpFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YWF9TTUFMTCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9TTUFMTCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfU01BTEwpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX01FRElVTSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEFSR0UpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1hfTEFSR0UpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1hYX0xBUkdFKTsKLQotCQkvLyBib3JkZXItc3R5bGUKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9TVFlMRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfU09MSUQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0RBU0hFRCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfRE9UVEVEKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ET1VCTEUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0dST09WRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklER0UpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0lOU0VUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PVVRTRVQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0hJRERFTik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0KLQkJLy8gYm9yZGVyLXdpZHRoCi0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfV0lEVEgpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1RISU4pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX01FRElVTSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhJQ0spOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0KLQkJLy8gY29sb3IKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BUVVBKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CTEFDSyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkxVRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfRlVDSFNJQSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfR1JBWSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfR1JFRU4pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0xJTUUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX01BUk9PTik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTkFWWSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfT0xJVkUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1BVUlBMRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfUkVEKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TSUxWRVIpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1RFQUwpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1dISVRFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ZRUxMT1cpOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1NZU1RFTV9DT0xPUikpOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1JHQikpOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfSEFTSCkpOwotCi0JCS8vIHN5c3RlbSBjb2xvcgotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfU1lTVEVNX0NPTE9SKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BQ1RJVkVCT1JERVIpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0FDVElWRUNBUFRJT04pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0FQUFdPUktTUEFDRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkFDS0dST1VORCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQlVUVE9ORkFDRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQlVUVE9OSElHSExJR0hUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CVVRUT05TSEFET1cpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0JVVFRPTlRFWFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0NBUFRJT05URVhUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9HUkFZVEVYVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElHSExJR0hUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISUdITElHSFRURVhUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTkFDVElWRUJPUkRFUik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5BQ1RJVkVDQVBUSU9OKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTkFDVElWRUNBUFRJT05URVhUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTkZPQkFDS0dST1VORCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5GT1RFWFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX01FTlUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX01FTlVURVhUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TQ1JPTExCQVIpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1RIUkVFRERBUktTSEFET1cpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1RIUkVFREZBQ0UpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1RIUkVFREhJR0hMSUdIVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhSRUVETElHSFRTSEFET1cpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1RIUkVFRFNIQURPVyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfV0lORE9XKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9XSU5ET1dGUkFNRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfV0lORE9XVEVYVCk7Ci0KLQkJLy8gZ2VuZXJpYy1mYW1pbHkKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0dFTkVSSUNfRkFNSUxZKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TRVJJRik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0FOU19TRVJJRik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ1VSU0lWRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfRkFOVEFTWSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTU9OT1NQQUNFKTsKLQotCQkvLyBnZW5lcmljLXZvaWNlCi0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9HRU5FUklDX1ZPSUNFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NQUxFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GRU1BTEUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0NISUxEKTsKLQotCQkvLyBtYXJnaW4td2lkdGgKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX01BUkdJTl9XSURUSCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJY29udC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQotCQkvLyBwYWRkaW5nLXdpZHRoCi0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9QQURESU5HX1dJRFRIKTsKLQkJY29udC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCi0JCS8vIHJlbGF0aXZlLXNpemUKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1JFTEFUSVZFX1NJWkUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1NNQUxMRVIpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0xBUkdFUik7Ci0KLQkJTE9BRElORyA9IDI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzTG9hZGluZygpIHsKLQkJcmV0dXJuIExPQURJTkcgPT0gMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNOZWVkSW5pdGlhbGl6ZSgpIHsKLQkJcmV0dXJuIExPQURJTkcgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01OdW1iZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTU51bWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODk2YmI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTU51bWJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01OdW1iZXIgZXh0ZW5kcyBQcm9wQ01Ob2RlIHsKLQotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgaW5zdGFuY2VzID0gbnVsbDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0FOR0xFID0gImFuZ2xlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9GUkVRVUVOQ1kgPSAiZnJlcXVlbmN5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9JTlRFR0VSID0gImludGVnZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0xFTkdUSCA9ICJsZW5ndGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX1BFUkNFTlRBR0UgPSAicGVyY2VudGFnZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfVElNRSA9ICJ0aW1lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9IQVNIID0gImhhc2giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9OVU0gPSAibnVtYmVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX0NNID0gImNtIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX0RFRyA9ICJkZWciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fRU1TID0gImVtIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX0VYUyA9ICJleCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9HUkFEID0gImdyYWQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fSEFTSCA9ICIjIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX0haID0gIkh6IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX0lOID0gImluIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX0lOVEVHRVIgPSAiSU5URUdFUiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9LSFogPSAia0h6IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX01NID0gIm1tIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX01TID0gIm1zIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX05VTUJFUiA9ICJOVU1CRVIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fUEMgPSAicGMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fUEVSQ0VOVEFHRSA9ICIlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX1BUID0gInB0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX1BYID0gInB4IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX1JBRCA9ICJyYWQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fUyA9ICJzIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIGZEaW1zID0gbmV3IFZlY3RvcigpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFByb3BDTU51bWJlcihTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaW1lbnNpb24oc2hvcnQgcHJpbWl0aXZlVHlwZSkgewotCQlzd2l0Y2ggKHByaW1pdGl2ZVR5cGUpIHsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NNIDoKLQkJCQlyZXR1cm4gRElNX0NNOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfREVHIDoKLQkJCQlyZXR1cm4gRElNX0RFRzsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VNUyA6Ci0JCQkJcmV0dXJuIERJTV9FTVM7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FWFMgOgotCQkJCXJldHVybiBESU1fRVhTOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfR1JBRCA6Ci0JCQkJcmV0dXJuIERJTV9HUkFEOwotCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0hBU0ggOgotCQkJCXJldHVybiBESU1fSEFTSDsgLy8gcHJlZml4IGRpbWVuc2lvbiAuLi4uCi0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19IWiA6Ci0JCQkJcmV0dXJuIERJTV9IWjsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOIDoKLQkJCQlyZXR1cm4gRElNX0lOOwotCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOVEVHRVIgOgotCQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19LSFogOgotCQkJCXJldHVybiBESU1fS0haOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTU0gOgotCQkJCXJldHVybiBESU1fTU07Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NUyA6Ci0JCQkJcmV0dXJuIERJTV9NUzsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX05VTUJFUiA6Ci0JCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BDIDoKLQkJCQlyZXR1cm4gRElNX1BDOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEVSQ0VOVEFHRSA6Ci0JCQkJcmV0dXJuIERJTV9QRVJDRU5UQUdFOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFQgOgotCQkJCXJldHVybiBESU1fUFQ7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QWCA6Ci0JCQkJcmV0dXJuIERJTV9QWDsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JBRCA6Ci0JCQkJcmV0dXJuIERJTV9SQUQ7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19TIDoKLQkJCQlyZXR1cm4gRElNX1M7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU2V0IGdldERpbWVuc2lvbnMoKSB7Ci0JCUhhc2hTZXQgdmFscyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUl0ZXJhdG9yIGl0ID0gZkRpbXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJdmFscy5hZGQoaXQubmV4dCgpKTsKLQkJfQotCi0JCXJldHVybiB2YWxzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0SWRlbnRpZmllcnMoU2V0IGluZGVudHMpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgcHVibGljIFByb3BDTU51bWJlciBnZXRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBpbml0aWFsaXplCi0JCWlmIChpbnN0YW5jZXMgPT0gbnVsbCkKLQkJCWluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoMjApOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBxdWVyeQotCQlPYmplY3Qgbm9kZSA9IGluc3RhbmNlcy5nZXQobmFtZSk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKFByb3BDTU51bWJlcikgbm9kZTsKLQotCQkvLyByZWdpc3RlcgotCQlpZiAoUHJvcENNTm9kZS5pc0xvYWRpbmcoKSkgewotCQkJbm9kZSA9IG5ldyBQcm9wQ01OdW1iZXIobmFtZSk7Ci0JCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIChQcm9wQ01OdW1iZXIpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBWQUxfTlVNQkVSOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0VmFsdWVzKENvbGxlY3Rpb24gdmFsdWVzKSB7Ci0JCWlmICh2YWx1ZXMgIT0gbnVsbCAmJiAhdmFsdWVzLmNvbnRhaW5zKHRoaXMpKQotCQkJdmFsdWVzLmFkZCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgdm9pZCBpbml0TnVtYmVyQ01EaW0oKSB7Ci0JCVByb3BDTU51bWJlciBudW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9BTkdMRSk7Ci0JCW51bS5mRGltcy5hZGQoRElNX0RFRyk7Ci0JCW51bS5mRGltcy5hZGQoRElNX0dSQUQpOwotCQludW0uZkRpbXMuYWRkKERJTV9SQUQpOwotCi0JCW51bSA9IGdldEluc3RhbmNlT2YoVkFMX0ZSRVFVRU5DWSk7Ci0JCW51bS5mRGltcy5hZGQoRElNX0haKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fS0haKTsKLQotCQludW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9IQVNIKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fSEFTSCk7Ci0KLQkJLy8gbnVtID0gZ2V0SW5zdGFuY2VPZihWQUxfSU5URUdFUik7Ci0JCS8vIG51bS5mRGltcy5hZGQoRElNX0lOVEVHRVIpOwotCi0JCW51bSA9IGdldEluc3RhbmNlT2YoVkFMX0xFTkdUSCk7Ci0JCW51bS5mRGltcy5hZGQoRElNX0NNKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fRU1TKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fRVhTKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fSU4pOwotCQludW0uZkRpbXMuYWRkKERJTV9NTSk7Ci0JCW51bS5mRGltcy5hZGQoRElNX1BDKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fUFQpOwotCQludW0uZkRpbXMuYWRkKERJTV9QWCk7Ci0KLQkJLy8gbnVtID0gZ2V0SW5zdGFuY2VPZihWQUxfTlVNQkVSKTsKLQkJLy8gbnVtLmZEaW1zLmFkZChESU1fTlVNQkVSKTsKLQotCQludW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9QRVJDRU5UQUdFKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fUEVSQ0VOVEFHRSk7Ci0KLQkJbnVtID0gZ2V0SW5zdGFuY2VPZihWQUxfVElNRSk7Ci0JCW51bS5mRGltcy5hZGQoRElNX01TKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fUyk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Qcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJhYjM4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Qcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01Qcm9wZXJ0eSBleHRlbmRzIFByb3BDTUNvbnRhaW5lciB7Ci0KLQkvLyBzdGF0aWMgZmllbGRzCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgY2FjaGVkSWRNYXAgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQVpJTVVUSCA9ICJhemltdXRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CRyA9ICJiYWNrZ3JvdW5kIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19BVFRBQ0hNRU5UID0gImJhY2tncm91bmQtYXR0YWNobWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfQ09MT1IgPSAiYmFja2dyb3VuZC1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfSU1BR0UgPSAiYmFja2dyb3VuZC1pbWFnZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfUE9TSVRJT04gPSAiYmFja2dyb3VuZC1wb3NpdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfUkVQRUFUID0gImJhY2tncm91bmQtcmVwZWF0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVIgPSAiYm9yZGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQ09MTEFQU0UgPSAiYm9yZGVyLWNvbGxhcHNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQ09MT1IgPSAiYm9yZGVyLWNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfU1BBQ0lORyA9ICJib3JkZXItc3BhY2luZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1NUWUxFID0gImJvcmRlci1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUCA9ICJib3JkZXItdG9wIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFQgPSAiYm9yZGVyLXJpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NID0gImJvcmRlci1ib3R0b20iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUID0gImJvcmRlci1sZWZ0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QX0NPTE9SID0gImJvcmRlci10b3AtY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVF9DT0xPUiA9ICJib3JkZXItcmlnaHQtY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT01fQ09MT1IgPSAiYm9yZGVyLWJvdHRvbS1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlRfQ09MT1IgPSAiYm9yZGVyLWxlZnQtY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9UT1BfU1RZTEUgPSAiYm9yZGVyLXRvcC1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1JJR0hUX1NUWUxFID0gImJvcmRlci1yaWdodC1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0JPVFRPTV9TVFlMRSA9ICJib3JkZXItYm90dG9tLXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfTEVGVF9TVFlMRSA9ICJib3JkZXItbGVmdC1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUF9XSURUSCA9ICJib3JkZXItdG9wLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFRfV0lEVEggPSAiYm9yZGVyLXJpZ2h0LXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NX1dJRFRIID0gImJvcmRlci1ib3R0b20td2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUX1dJRFRIID0gImJvcmRlci1sZWZ0LXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfV0lEVEggPSAiYm9yZGVyLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1RUT00gPSAiYm90dG9tIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DQVBUSU9OX1NJREUgPSAiY2FwdGlvbi1zaWRlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DTEVBUiA9ICJjbGVhciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ0xJUCA9ICJjbGlwIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT0xPUiA9ICJjb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ09OVEVOVCA9ICJjb250ZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT1VOVEVSX0lOQ1JFTUVOVCA9ICJjb3VudGVyLWluY3JlbWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ09VTlRFUl9SRVNFVCA9ICJjb3VudGVyLXJlc2V0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVUUgPSAiY3VlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVUVfQUZURVIgPSAiY3VlLWFmdGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVUVfQkVGT1JFID0gImN1ZS1iZWZvcmUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NVUlNPUiA9ICJjdXJzb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0RJUkVDVElPTiA9ICJkaXJlY3Rpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0RJU1BMQVkgPSAiZGlzcGxheSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRUxFVkFUSU9OID0gImVsZXZhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRU1QVFlfQ0VMTFMgPSAiZW1wdHktY2VsbHMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZMT0FUID0gImZsb2F0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UID0gImZvbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfRkFNSUxZID0gImZvbnQtZmFtaWx5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1NJWkUgPSAiZm9udC1zaXplIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1NJWkVfQURKVVNUID0gImZvbnQtc2l6ZS1hZGp1c3QiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU1RSRVRDSCA9ICJmb250LXN0cmV0Y2giOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU1RZTEUgPSAiZm9udC1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9WQVJJQU5UID0gImZvbnQtdmFyaWFudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9XRUlHSFQgPSAiZm9udC13ZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0hFSUdIVCA9ICJoZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0xFRlQgPSAibGVmdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTEVUVEVSX1NQQUNJTkcgPSAibGV0dGVyLXNwYWNpbmciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0xJTkVfSEVJR0hUID0gImxpbmUtaGVpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFID0gImxpc3Qtc3R5bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEVfSU1BR0UgPSAibGlzdC1zdHlsZS1pbWFnZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElTVF9TVFlMRV9QT1NJVElPTiA9ICJsaXN0LXN0eWxlLXBvc2l0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFX1RZUEUgPSAibGlzdC1zdHlsZS10eXBlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU4gPSAibWFyZ2luIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU5fVE9QID0gIm1hcmdpbi10b3AiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9SSUdIVCA9ICJtYXJnaW4tcmlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9CT1RUT00gPSAibWFyZ2luLWJvdHRvbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX0xFRlQgPSAibWFyZ2luLWxlZnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BUktFUl9PRkZTRVQgPSAibWFya2VyLW9mZnNldCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSS1MgPSAibWFya3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BWF9IRUlHSFQgPSAibWF4LWhlaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFYX1dJRFRIID0gIm1heC13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUlOX0hFSUdIVCA9ICJtaW4taGVpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NSU5fV0lEVEggPSAibWluLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PUlBIQU5TID0gIm9ycGhhbnMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkUgPSAib3V0bGluZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORV9DT0xPUiA9ICJvdXRsaW5lLWNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVVRMSU5FX1NUWUxFID0gIm91dGxpbmUtc3R5bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkVfV0lEVEggPSAib3V0bGluZS13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1ZFUkZMT1cgPSAib3ZlcmZsb3ciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkcgPSAicGFkZGluZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19UT1AgPSAicGFkZGluZy10b3AiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkdfUklHSFQgPSAicGFkZGluZy1yaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19CT1RUT00gPSAicGFkZGluZy1ib3R0b20iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkdfTEVGVCA9ICJwYWRkaW5nLWxlZnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBR0UgPSAicGFnZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRV9CUkVBS19BRlRFUiA9ICJwYWdlLWJyZWFrLWFmdGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFX0JSRUFLX0JFRk9SRSA9ICJwYWdlLWJyZWFrLWJlZm9yZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRV9CUkVBS19JTlNJREUgPSAicGFnZS1icmVhay1pbnNpZGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBVVNFID0gInBhdXNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQVVTRV9BRlRFUiA9ICJwYXVzZS1hZnRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFVU0VfQkVGT1JFID0gInBhdXNlLWJlZm9yZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUElUQ0ggPSAicGl0Y2giOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BJVENIX1JBTkdFID0gInBpdGNoLXJhbmdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QTEFZX0RVUklORyA9ICJwbGF5LWR1cmluZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUE9TSVRJT04gPSAicG9zaXRpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1FVT1RFUyA9ICJxdW90ZXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1JJQ0hORVNTID0gInJpY2huZXNzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9SSUdIVCA9ICJyaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU0laRSA9ICJzaXplIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBSyA9ICJzcGVhayI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFQUtfSEVBREVSID0gInNwZWFrLWhlYWRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFQUtfTlVNRVJBTCA9ICJzcGVhay1udW1lcmFsIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBS19QVU5DVFVBVElPTiA9ICJzcGVhay1wdW5jdHVhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFRUNIX1JBVEUgPSAic3BlZWNoLXJhdGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1NUUkVTUyA9ICJzdHJlc3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1RBQkxFX0xBWU9VVCA9ICJ0YWJsZS1sYXlvdXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfQUxJR04gPSAidGV4dC1hbGlnbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9ERUNPUkFUSU9OID0gInRleHQtZGVjb3JhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9JTkRFTlQgPSAidGV4dC1pbmRlbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfU0hBRE9XID0gInRleHQtc2hhZG93IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX1RSQU5TRk9STSA9ICJ0ZXh0LXRyYW5zZm9ybSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVE9QID0gInRvcCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVU5JQ09ERV9CSURJID0gInVuaWNvZGUtYmlkaSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVkVSVElDQUxfQUxJR04gPSAidmVydGljYWwtYWxpZ24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1ZJU0lCSUxJVFkgPSAidmlzaWJpbGl0eSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVk9JQ0VfRkFNSUxZID0gInZvaWNlLWZhbWlseSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVk9MVU1FID0gInZvbHVtZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV0hJVEVfU1BBQ0UgPSAid2hpdGUtc3BhY2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1dJRE9XUyA9ICJ3aWRvd3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1dJRFRIID0gIndpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9XT1JEX1NQQUNJTkcgPSAid29yZC1zcGFjaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9aX0lOREVYID0gInotaW5kZXgiOy8vJE5PTi1OTFMtMSQKLQkvLyBpbnN0YW5jZSBmaWVsZHMKLQlwcml2YXRlIGludCBmTWluVmFsdWVDb3VudCA9IDE7Ci0JcHJpdmF0ZSBpbnQgZk1heFZhbHVlQ291bnQgPSAxOwotCXByaXZhdGUgT2JqZWN0W10gbWVkaWFHcm91cHM7Ci0JcHJvdGVjdGVkIExpc3QgY29udGFpbmVyczsKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01Qcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlPYmplY3QgYXBwZW5kQ2hpbGQoT2JqZWN0IG5vZGUpIHsKLQkJT2JqZWN0IHJldCA9IHN1cGVyLmFwcGVuZENoaWxkKG5vZGUpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFByb3BDTVByb3BlcnR5KSB7Ci0JCQkvLyByZWdpc3RlciBzaG9ydGhhbmQgY29udGFpbmVyCi0JCQlQcm9wQ01Qcm9wZXJ0eSBjbSA9IChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQkJCWlmIChjbS5jb250YWluZXJzID09IG51bGwpCi0JCQkJY20uY29udGFpbmVycyA9IG5ldyBWZWN0b3IoKTsKLQkJCWlmICghY20uY29udGFpbmVycy5jb250YWlucyh0aGlzKSkKLQkJCQljbS5jb250YWluZXJzLmFkZCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYXBwZW5kTWVkaWFHcm91cChPYmplY3QgbWcpIHsKLQkJaWYgKG1lZGlhR3JvdXBzID09IG51bGwpCi0JCQltZWRpYUdyb3VwcyA9IG5ldyBPYmplY3RbMV07Ci0JCWVsc2UgewotCQkJT2JqZWN0W10gb2xkTWVkaWFHcm91cHMgPSBtZWRpYUdyb3VwczsKLQkJCW1lZGlhR3JvdXBzID0gbmV3IE9iamVjdFtvbGRNZWRpYUdyb3Vwcy5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkob2xkTWVkaWFHcm91cHMsIDAsIG1lZGlhR3JvdXBzLCAwLCBvbGRNZWRpYUdyb3Vwcy5sZW5ndGgpOwotCQl9Ci0JCW1lZGlhR3JvdXBzW21lZGlhR3JvdXBzLmxlbmd0aCAtIDFdID0gbWc7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wQ01Qcm9wZXJ0eSBnZXRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgyMDApOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBxdWVyeQotCQlPYmplY3Qgbm9kZSA9IGluc3RhbmNlcy5nZXQobmFtZSk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKFByb3BDTVByb3BlcnR5KSBub2RlOwotCi0JCS8vIHJlZ2lzdGVyCi0JCWlmIChQcm9wQ01Ob2RlLmlzTG9hZGluZygpKSB7Ci0JCQlub2RlID0gbmV3IFByb3BDTVByb3BlcnR5KG5hbWUpOwotCQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQkJfQotCi0JCXJldHVybiAoUHJvcENNUHJvcGVydHkpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRNYXhWYWx1ZUNvdW50KCkgewotCQlyZXR1cm4gZk1heFZhbHVlQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWVkaWFHcm91cHMoKSB7Ci0JCWlmIChtZWRpYUdyb3VwcyAhPSBudWxsKQotCQkJcmV0dXJuIEFycmF5cy5hc0xpc3QobWVkaWFHcm91cHMpOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWluVmFsdWVDb3VudCgpIHsKLQkJcmV0dXJuIGZNaW5WYWx1ZUNvdW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gZ2V0TmFtZUVudW0oKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gaW5zdGFuY2VzLmtleXMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIGdldFByb3BlcnR5RW51bSgpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBpbnN0YW5jZXMuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNob3J0aGFuZENvbnRhaW5lckNvdW50KCkgewotCQlyZXR1cm4gKGNvbnRhaW5lcnMgPT0gbnVsbCkgPyAwIDogY29udGFpbmVycy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBWQUxfUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaG9ydGhhbmQoKSB7Ci0JCWludCBuQ2hpbGQgPSBnZXROdW1DaGlsZCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5DaGlsZDsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gZ2V0Q2hpbGRBdChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9wQ01Qcm9wZXJ0eSAmJiAhKG9iaiBpbnN0YW5jZW9mIFByb3BDTVN1YlByb3BlcnR5KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBWZWN0b3IgbmFtZXMoKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gbmV3IFZlY3RvcihpbnN0YW5jZXMua2V5U2V0KCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBuYW1lcyhPYmplY3QgbWVkaWFHcm91cCkgewotCQlpZiAobWVkaWFHcm91cCA9PSBudWxsKQotCQkJcmV0dXJuIG5hbWVzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCVZlY3RvciBwcm9wZXJ0aWVzID0gbmV3IFZlY3RvcigpOwotCi0JCUl0ZXJhdG9yIGl0ID0gaW5zdGFuY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVByb3BDTVByb3BlcnR5IHByb3AgPSAoUHJvcENNUHJvcGVydHkpIGl0Lm5leHQoKTsKLQkJCWlmIChwcm9wLmdldE1lZGlhR3JvdXBzKCkuY29udGFpbnMobWVkaWFHcm91cCkpCi0JCQkJcHJvcGVydGllcy5hZGQocHJvcC5nZXROYW1lKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogSWYgaWRlbnRpZmllciBpcyBudWxsLCBnZXQgYWxsIHByb3BlcnRpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBwcm9wZXJ0aWVzRm9yKFN0cmluZyBpZGVudGlmaWVyLCBib29sZWFuIHNob3J0aGFuZHMpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIGlmIGlkZW50aWZpZXIgaXMgbnVsbCwgZ2V0IGFsbCBwcm9wZXJ0aWVzCi0JCWlmIChpZGVudGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFZlY3RvcihpbnN0YW5jZXMudmFsdWVzKCkpOwotCi0JCWlmIChjYWNoZWRJZE1hcCA9PSBudWxsKSB7Ci0JCQkvLyBzdGFydCBjYWNoZWluZwotCQkJY2FjaGVkSWRNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBzZWFyY2ggY2FjaGVkCi0JCQlPYmplY3QgcmV0ID0gY2FjaGVkSWRNYXAuZ2V0KGlkZW50aWZpZXIgKyBTdHJpbmcudmFsdWVPZihzaG9ydGhhbmRzKSk7Ci0JCQlpZiAocmV0ICE9IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBWZWN0b3IoKENvbGxlY3Rpb24pIHJldCk7Ci0JCX0KLQotCQkvLyBjcmVhdGUKLQkJRW51bWVyYXRpb24gcHJvcGVydHlFbnVtID0gZ2V0UHJvcGVydHlFbnVtKCk7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJd2hpbGUgKHByb3BlcnR5RW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJUHJvcENNUHJvcGVydHkgcHJvcCA9IChQcm9wQ01Qcm9wZXJ0eSkgcHJvcGVydHlFbnVtLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoIXNob3J0aGFuZHMgJiYgcHJvcC5pc1Nob3J0aGFuZCgpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHByb3AuY2FuSGF2ZShpZGVudGlmaWVyKSkKLQkJCQlzZXQuYWRkKHByb3ApOwotCQl9Ci0KLQkJLy8gY2FjaGUKLQkJY2FjaGVkSWRNYXAucHV0KGlkZW50aWZpZXIgKyBTdHJpbmcudmFsdWVPZihzaG9ydGhhbmRzKSwgc2V0KTsKLQotCQlyZXR1cm4gbmV3IFZlY3RvcihzZXQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1heFZhbHVlQ291bnQoaW50IG5ld01heFZhbHVlQ291bnQpIHsKLQkJZk1heFZhbHVlQ291bnQgPSBuZXdNYXhWYWx1ZUNvdW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1pblZhbHVlQ291bnQoaW50IG5ld01pblZhbHVlQ291bnQpIHsKLQkJZk1pblZhbHVlQ291bnQgPSBuZXdNaW5WYWx1ZUNvdW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBQcm9wQ01Qcm9wZXJ0eSBzaG9ydGhhbmRDb250YWluZXJBdChpbnQgaSkgewotCQlpZiAoY29udGFpbmVycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChpIDwgMCB8fCBjb250YWluZXJzLnNpemUoKSA8PSBpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoUHJvcENNUHJvcGVydHkpIGNvbnRhaW5lcnMuZ2V0KGkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBzaG9ydGhhbmRDb250YWluZXJJdGVyYXRvcigpIHsKLQkJaWYgKGNvbnRhaW5lcnMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gY29udGFpbmVycy5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01TdHJpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGExZTgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNU3RyaW5nIGV4dGVuZHMgUHJvcENNTm9kZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGluc3RhbmNlcyA9IG51bGw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9GT05UID0gImZvbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0NPVU5URVJfSUQgPSAiY291bnRlcklkIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9QQUdFX0lEID0gInBhZ2VJZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfVk9JQ0UgPSAidm9pY2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0FOWSA9ICJhbnkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcENNU3RyaW5nKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0SWRlbnRpZmllcnMoU2V0IGluZGVudHMpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgcHVibGljIFByb3BDTVN0cmluZyBnZXRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBpbml0aWFsaXplCi0JCWlmIChpbnN0YW5jZXMgPT0gbnVsbCkKLQkJCWluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoMTApOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBxdWVyeQotCQlPYmplY3Qgbm9kZSA9IGluc3RhbmNlcy5nZXQobmFtZSk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKFByb3BDTVN0cmluZykgbm9kZTsKLQotCQkvLyByZWdpc3RlcgotCQlub2RlID0gbmV3IFByb3BDTVN0cmluZyhuYW1lKTsKLQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQotCQlyZXR1cm4gKFByb3BDTVN0cmluZykgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9TVFJJTkc7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRWYWx1ZXMoQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcyAhPSBudWxsICYmICF2YWx1ZXMuY29udGFpbnModGhpcykpCi0JCQl2YWx1ZXMuYWRkKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVN1YlByb3BlcnR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01TdWJQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWViYjM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVN1YlByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01TdWJQcm9wZXJ0eSBleHRlbmRzIFByb3BDTVByb3BlcnR5IHsKLQotCS8vIHN0YXRpYyBmaWVsZHMKLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGluc3RhbmNlcyA9IG51bGw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFNVQl9CR19QT1NJVElPTl9YID0gImJhY2tncm91bmQtcG9zaXRpb25IIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFNVQl9CR19QT1NJVElPTl9ZID0gImJhY2tncm91bmQtcG9zaXRpb25WIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFNVQl9DTElQX1RPUCA9ICJjbGlwVG9wIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFNVQl9DTElQX1JJR0hUID0gImNsaXBSaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBTVUJfQ0xJUF9CT1RUT00gPSAiY2xpcEJvdHRvbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBTVUJfQ0xJUF9MRUZUID0gImNsaXBMZWZ0IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcENNU3ViUHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFByb3BDTVByb3BlcnR5IGdldENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHNob3J0aGFuZENvbnRhaW5lckF0KDApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcENNUHJvcGVydHkgZ2V0SW5zdGFuY2VPZihTdHJpbmcgbmFtZSkgewotCQkvLyBpbml0aWFsaXplCi0JCWlmIChpbnN0YW5jZXMgPT0gbnVsbCkKLQkJCWluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoMTApOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBxdWVyeQotCQlPYmplY3Qgbm9kZSA9IGluc3RhbmNlcy5nZXQobmFtZSk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKFByb3BDTVByb3BlcnR5KSBub2RlOwotCi0JCS8vIHJlZ2lzdGVyCi0JCWlmIChQcm9wQ01Ob2RlLmlzTG9hZGluZygpKSB7Ci0JCQlub2RlID0gbmV3IFByb3BDTVN1YlByb3BlcnR5KG5hbWUpOwotCQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQkJfQotCi0JCXJldHVybiAoUHJvcENNUHJvcGVydHkpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnVtZXJhdGlvbiBnZXROYW1lRW51bSgpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBpbnN0YW5jZXMua2V5cygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gZ2V0UHJvcGVydHlFbnVtKCkgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJcmV0dXJuIGluc3RhbmNlcy5lbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gVkFMX1NVQlBST1BFUlRZOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmVjdG9yIG5hbWVzKCkgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJcmV0dXJuIG5ldyBWZWN0b3IoaW5zdGFuY2VzLmtleVNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoUHJvcENNUHJvcGVydHkgcHJvcCkgewotCQlpZiAoY29udGFpbmVycyA9PSBudWxsKQotCQkJY29udGFpbmVycyA9IG5ldyBWZWN0b3IoKTsKLQkJY29udGFpbmVycy5jbGVhcigpOwotCQljb250YWluZXJzLmFkZChwcm9wKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNVVJhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01VUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3NTcxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01VUmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01VUmFuZ2UgZXh0ZW5kcyBQcm9wQ01Ob2RlIHsKLQotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgaW5zdGFuY2VzID0gbnVsbDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfVVJBTkdFID0gInVyYW5nZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFByb3BDTVVSYW5nZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldElkZW50aWZpZXJzKFNldCBpbmRlbnRzKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wQ01VUmFuZ2UgZ2V0SW5zdGFuY2VPZihTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gaW5pdGlhbGl6ZQotCQlpZiAoaW5zdGFuY2VzID09IG51bGwpCi0JCQlpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKDEwKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gcXVlcnkKLQkJT2JqZWN0IG5vZGUgPSBpbnN0YW5jZXMuZ2V0KG5hbWUpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChQcm9wQ01VUmFuZ2UpIG5vZGU7Ci0KLQkJLy8gcmVnaXN0ZXIKLQkJbm9kZSA9IG5ldyBQcm9wQ01VUmFuZ2UobmFtZSk7Ci0JCWluc3RhbmNlcy5wdXQobmFtZSwgbm9kZSk7Ci0KLQkJcmV0dXJuIChQcm9wQ01VUmFuZ2UpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBWQUxfVU5JQ09ERV9SQU5HRTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldFZhbHVlcyhDb2xsZWN0aW9uIHZhbHVlcykgewotCQlpZiAodmFsdWVzICE9IG51bGwgJiYgIXZhbHVlcy5jb250YWlucyh0aGlzKSkKLQkJCXZhbHVlcy5hZGQodGhpcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2YmEzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNVXRpbCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWludXMoQ29sbGVjdGlvbiBzcmMsIENvbGxlY3Rpb24gcmVmKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gcmVmLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAoc3JjLmNvbnRhaW5zKG9iaikpCi0JCQkJc3JjLnJlbW92ZShvYmopOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGx1cyhDb2xsZWN0aW9uIHNyYywgQ29sbGVjdGlvbiByZWYpIHsKLQkJSXRlcmF0b3IgaXQgPSByZWYuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCWlmICghc3JjLmNvbnRhaW5zKG9iaikpCi0JCQkJc3JjLmFkZChvYmopOwotCQl9Ci0JCXJldHVybjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9DU1NDb250ZW50UHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9DU1NDb250ZW50UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmJjNTgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ1NTQ29udGVudFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5QcmVmZXJlbmNlczsKLQotLyoqCi0gKiBQcm9wZXJ0aWVzIGNvbnN0YW50cyB1c2VkIGJ5IENTUy4gQ2xpZW50cyBzaG91bGQgb25seSByZWFkIGFuZCBtb2RpZnkgdGhlCi0gKiBDU1MgcHJvcGVydGllcyBwcm9ncmFtbWF0aWNhbGx5IHVzaW5nIHRoaXMgY2xhc3MuCi0gKiAKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGNsYXNzIENTU0NvbnRlbnRQcm9wZXJ0aWVzIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENTU0NPUkVfSUQgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9LRVkgPSAiPHByb2plY3Q+IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgY3NzIHByb2ZpbGUgdG8gdXNlIHdoZW4gbm9uZSBpcyBzcGVjaWZpZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfUFJPRklMRSA9ICJjc3MtcHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEdlbmVyYXRlcyBhIHByZWZlcmVuY2Uga2V5IGJhc2VkIG9uIHJlc291cmNlUGF0aAotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRoZSBrZXkgd2lsbCBiZSBiYXNlZCBvZmYgb2YKLQkgKiBAcmV0dXJuIHByZWZlcmVuY2Uga2V5IGJhc2VkIG9uIHJlc291cmNlUGF0aCAoYmFzaWNhbGx5IHRoZQotCSAqICAgICAgICAgcmVzb3VyY2VQYXRoIHdpdGhvdXQgdGhlIGZpbGVuYW1lKTsgUFJPSkVDVF9LRVkgaWYgcmVzb3VyY2VQYXRoCi0JICogICAgICAgICBpcyBudWxsCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRLZXlGb3IoSVBhdGggcmVzb3VyY2VQYXRoKSB7Ci0JCVN0cmluZyBrZXkgPSBQUk9KRUNUX0tFWTsKLQkJaWYgKHJlc291cmNlUGF0aCAhPSBudWxsICYmIHJlc291cmNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCWtleSA9IHJlc291cmNlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByZWZlcmVuY2VzIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm9qZWN0IHNjb3BlIGFuZAotCSAqIHByZWZlcmVuY2Uga2V5IChzdWJOb2RlKSBJZiBjcmVhdGUgaXMgdHJ1ZSwgdGhlIHByZWZlcmVuY2Ugbm9kZSB3aWxsIGJlCi0JICogY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB0aGUgcHJlZmVyZW5jZSBub2RlIGlzIHVuZGVyCi0JICogQHBhcmFtIHByZWZlcmVuY2VLZXkKLQkgKiAgICAgICAgICAgIHRoZSBzdWJub2RlL2NhdGVnb3J5IHRoZSBwcmVmZXJlbmNlIG5vZGUgaXMgbG9jYXRlZCBpbgotCSAqIEBwYXJhbSBjcmVhdGUKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIGEgcHJlZmVyZW5jZSBub2RlIHdpbGwgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QKLQkgKiAgICAgICAgICAgIGFscmVhZHkgZXhpc3QKLQkgKiBAcmV0dXJuIFByZWZlcmVuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvamVjdCBzY29wZSBhbmQKLQkgKiAgICAgICAgIHByZWZlcmVuY2Uga2V5LiBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgZm91bmQgYW5kIGNyZWF0ZSBpcwotCSAqICAgICAgICAgZmFsc2UKLQkgKi8KLQlzdGF0aWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHByZWZlcmVuY2VLZXksIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCWlmIChjcmVhdGUpCi0JCQkvLyBjcmVhdGUgYWxsIG5vZGVzIGRvd24gdG8gdGhlIG9uZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbgotCQkJcmV0dXJuIG5ldyBQcm9qZWN0U2NvcGUocHJvamVjdCkuZ2V0Tm9kZShDU1NDT1JFX0lEKS5ub2RlKHByZWZlcmVuY2VLZXkpOwotCQkvLyBiZSBjYXJlZnVsIGxvb2tpbmcgdXAgZm9yIG91ciBub2RlIHNvIG5vdCB0byBjcmVhdGUgYW55IG5vZGVzIGFzCi0JCS8vIHNpZGUgZWZmZWN0Ci0JCVByZWZlcmVuY2VzIG5vZGUgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRSb290Tm9kZSgpLm5vZGUoUHJvamVjdFNjb3BlLlNDT1BFKTsKLQkJdHJ5IHsKLQkJCS8vIFRPRE8gb25jZSBidWcgOTA1MDAgaXMgZml4ZWQsIHNob3VsZCBiZSBhcyBzaW1wbGUgYXMgdGhpczoKLQkJCS8vIFN0cmluZyBwYXRoID0gcHJvamVjdC5nZXROYW1lKCkgKyBJUGF0aC5TRVBBUkFUT1IgKwotCQkJLy8gUmVzb3VyY2VzUGx1Z2luLlBJX1JFU09VUkNFUyArIElQYXRoLlNFUEFSQVRPUiArCi0JCQkvLyBFTkNPRElOR19QUkVGX05PREU7Ci0JCQkvLyByZXR1cm4gbm9kZS5ub2RlRXhpc3RzKHBhdGgpID8gbm9kZS5ub2RlKHBhdGgpIDogbnVsbDsKLQkJCS8vIGZvciBub3csIHRha2UgdGhlIGxvbmcgd2F5Ci0JCQlpZiAoIW5vZGUubm9kZUV4aXN0cyhwcm9qZWN0LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlub2RlID0gbm9kZS5ub2RlKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKENTU0NPUkVfSUQpKQotCQkJCXJldHVybiBudWxsOwotCQkJbm9kZSA9IG5vZGUubm9kZShDU1NDT1JFX0lEKTsKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKHByZWZlcmVuY2VLZXkpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIG5vZGUubm9kZShwcmVmZXJlbmNlS2V5KTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG5vZGVFeGlzdHMgZmFpbGVkCi0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IHJldHJpZXZlIHByZWZlcmVuY2Ugbm9kZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgaW4gdGhlIGdpdmVuIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHByb3BlcnR5IGtleQotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgY29udGV4dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBjb250ZXh0IGlzCi0JICogICAgICAgICAgICBhdmFpbGFibGUgYW5kIHRoZSB3b3Jrc3BhY2Ugc2V0dGluZyBzaG91bGQgYmUgdGFrZW4uIE5vdGUKLQkgKiAgICAgICAgICAgIHRoYXQgcGFzc2luZyA8Y29kZT5udWxsPC9jb2RlPiBzaG91bGQgYmUgYXZvaWRlZC4KLQkgKiBAcGFyYW0gcmVjdXJzZQotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgcGFyZW50IHNob3VsZCBiZSBxdWVyaWVkIHRpbGwgcHJvcGVydHkgaXMgZm91bmQKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBrZXkuCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXksIElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiByZWN1cnNlKSB7Ci0JCVN0cmluZyB2YWwgPSBudWxsOwotCQkvLyBib29sZWFuIHByZWZlcmVuY2VGb3VuZCA9IGZhbHNlOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKHByb2plY3QsIGtleSwgZmFsc2UpOwotCQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJCXZhbCA9IGludGVybmFsR2V0UHJvcGVydHkocmVzb3VyY2UsIHJlY3Vyc2UsIHByZWZlcmVuY2VzKTsKLQkJCQkJLy8gcHJlZmVyZW5jZUZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gV29ya2JlbmNoIHByZWZlcmVuY2UgbWF5IG5vdCBiZSBuZWVkZWQgc28gbGVhdmUgb3V0IGZvciBub3cKLQkJLy8gLy8gbm8gcHJlZmVyZW5jZXMgZm91bmQgLSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywKLQkJLy8gLy8gc2hvcnQtY2lyY3VpdAotCQkvLyAvLyBsb29rdXAgYnkgZmFsbGluZyBiYWNrIHRvIHdvcmtzcGFjZSdzIGRlZmF1bHQKLQkJLy8gLy8gc2V0dGluZwotCQkvLyBpZiAoIXByZWZlcmVuY2VGb3VuZCkKLQkJLy8gdmFsID0gZ2V0V29ya2JlbmNoUHJlZmVyZW5jZShrZXkpOwotCQlyZXR1cm4gdmFsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBpbnRlcm5hbEdldFByb3BlcnR5KElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiByZWN1cnNlLCBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcykgewotCQlTdHJpbmcgdmFsdWUgPSBwcmVmZXJlbmNlcy5nZXQoZ2V0S2V5Rm9yKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpLCBudWxsKTsKLQkJaWYgKHZhbHVlID09IG51bGwgJiYgcmVzb3VyY2UgIT0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpICYmIHJlY3Vyc2UpIHsKLQkJCXZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0KGdldEtleUZvcihudWxsKSwgbnVsbCk7Ci0JCX0KLQotCQkvLyBXb3JrYmVuY2ggcHJlZmVyZW5jZSBtYXkgbm90IGJlIG5lZWRlZCBzbyBsZWF2ZSBvdXQgZm9yIG5vdwotCQkvLyAvLyBlbnN1cmUgd2UgZGVmYXVsdCB0byB0aGUgd29ya3NwYWNlIHByZWZlcmVuY2UgaWYgbm9uZSBpcyBmb3VuZAotCQkvLyByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IGdldFdvcmtiZW5jaFByZWZlcmVuY2Uoa2V5KSA6IHZhbHVlOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgaW4gdGhlIGdpdmVuIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHByb3BlcnR5IGtleQotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgY29udGV4dC4gTm90ZSBjb250ZXh0IGNhbm5vdCBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgdmFsdWUgdG8gc2V0IGZvciB0aGUga2V5LiBJZiB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgICAgdGhlIGtleSBpcyByZW1vdmVkIGZyb20gcHJvcGVydGllcy4KLQkgKiBAc2luY2UgMS4xCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMocHJvamVjdCwga2V5LCB0cnVlKTsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQkJcHJlZmVyZW5jZXMucmVtb3ZlKGdldEtleUZvcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSk7Ci0JCQkJZWxzZQotCQkJCQlwcmVmZXJlbmNlcy5wdXQoZ2V0S2V5Rm9yKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpLCB2YWx1ZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gc2F2ZSBjaGFuZ2VzCi0JCQkJCXByZWZlcmVuY2VzLmZsdXNoKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENTU0NPUkVfSUQsIElTdGF0dXMuRVJST1IsICJVbmFibGUgdG8gc2V0IHByb3BlcnR5IiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIFdvcmtiZW5jaCBwcmVmZXJlbmNlIG1heSBub3QgYmUgbmVlZGVkIHNvIGxlYXZlIG91dCBmb3Igbm93Ci0JCS8vIGp1c3Qgc2V0IGEgcHJlZmVyZW5jZSBpbiB0aGUgaW5zdGFuY2Ugc2NvcGUKLQkJLy8gaWYgKCFwcmVmZXJlbmNlRm91bmQpIHsKLQkJLy8gc2V0V29ya2JlbmNoUHJlZmVyZW5jZShrZXkpOwotCQkvLyB9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YTRiOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOwotCi1wdWJsaWMgY2xhc3MgQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyIHsKLQlwdWJsaWMgQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQlmUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCWZKb2IgPSBuZXcgQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyIF9pbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBmUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLQlDb250ZW50UHJvcGVydGllc01hbmFnZXJKb2IgZkpvYjsKLQotCS8qKgotCSAqIFRoaXMgam9iIGltcGxlbWVudGF0aW9uIGlzIHVzZWQgdG8gYWxsb3cgdGhlIHJlc291cmNlIGNoYW5nZSBsaXN0ZW5lcgotCSAqIHRvIHNjaGVkdWxlIG9wZXJhdGlvbnMgdGhhdCBuZWVkIHRvIG1vZGlmeSB0aGUgd29ya3NwYWNlLgotCSAqLwotCXByaXZhdGUgY2xhc3MgQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iIGV4dGVuZHMgSm9iIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRJRVNfVVBEQVRFX0RFTEFZID0gNTAwOwotCQlwcml2YXRlIExpc3QgYXN5bmNDaGFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXB1YmxpYyBDb250ZW50UHJvcGVydGllc01hbmFnZXJKb2IoKSB7Ci0JCQlzdXBlcihDU1NDb3JlTWVzc2FnZXMuQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nKTsKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJCXNldFByaW9yaXR5KEpvYi5JTlRFUkFDVElWRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VzKFNldCBuZXdDaGFuZ2VzKSB7Ci0JCQlpZiAobmV3Q2hhbmdlcy5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuOwotCQkJc3luY2hyb25pemVkIChhc3luY0NoYW5nZXMpIHsKLQkJCQlhc3luY0NoYW5nZXMuYWRkQWxsKG5ld0NoYW5nZXMpOwotCQkJCWFzeW5jQ2hhbmdlcy5ub3RpZnkoKTsKLQkJCX0KLQkJCXNjaGVkdWxlKFBST1BFUlRJRVNfVVBEQVRFX0RFTEFZKTsKLQkJfQotCi0JCXB1YmxpYyBJUHJvamVjdCBnZXROZXh0Q2hhbmdlKCkgewotCQkJc3luY2hyb25pemVkIChhc3luY0NoYW5nZXMpIHsKLQkJCQlyZXR1cm4gYXN5bmNDaGFuZ2VzLmlzRW1wdHkoKSA/IG51bGwgOiAoSVByb2plY3QpIGFzeW5jQ2hhbmdlcy5yZW1vdmUoYXN5bmNDaGFuZ2VzLnNpemUoKSAtIDEpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJTXVsdGlTdGF0dXMgcmVzdWx0ID0gbmV3IE11bHRpU3RhdHVzKENTU0NvbnRlbnRQcm9wZXJ0aWVzLkNTU0NPUkVfSUQsIElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VULCBDU1NDb3JlTWVzc2FnZXMuQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nLCBudWxsKTsKLQkJCW1vbml0b3IgPSBtb25pdG9yID09IG51bGwgPyBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpIDogbW9uaXRvcjsKLQkJCXRyeSB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soQ1NTQ29yZU1lc3NhZ2VzLkNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZywgYXN5bmNDaGFuZ2VzLnNpemUoKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJSVByb2plY3QgbmV4dDsKLQkJCQkJd2hpbGUgKChuZXh0ID0gZ2V0TmV4dENoYW5nZSgpKSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBqdXN0IGV4aXQgaWYgdGhlIHN5c3RlbSBpcyBzaHV0dGluZyBkb3duIG9yIGhhcwotCQkJCQkJLy8gYmVlbiBzaHV0IGRvd24KLQkJCQkJCS8vIGl0IGlzIHRvbyBsYXRlIHRvIGNoYW5nZSB0aGUgd29ya3NwYWNlIGF0IHRoaXMKLQkJCQkJCS8vIHBvaW50IGFueXdheQotCQkJCQkJaWYgKFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uub3NnaSIpLmdldFN0YXRlKCkgIT0gQnVuZGxlLkFDVElWRSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBzYXZlIHRoZSBwcmVmZXJlbmNlcyBub2RlcwotCQkJCQkJCWlmIChuZXh0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQkJCS8vIHNhdmUgY3NzIHByb2ZpbGUgcHJlZmVyZW5jZXMKLQkJCQkJCQkJUHJlZmVyZW5jZXMgcHJvamVjdFByZWZzID0gQ1NTQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXMobmV4dCwgQ1NTQ29udGVudFByb3BlcnRpZXMuQ1NTX1BST0ZJTEUsIGZhbHNlKTsKLQkJCQkJCQkJaWYgKHByb2plY3RQcmVmcyAhPSBudWxsKQotCQkJCQkJCQkJcHJvamVjdFByZWZzLmZsdXNoKCk7Ci0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyB3ZSBnb3QgYW4gZXJyb3Igc2F2aW5nCi0JCQkJCQkJU3RyaW5nIGRldGFpbE1lc3NhZ2UgPSBOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1Byb2JsZW1zX1VwZGF0aW5nLCBuZXh0LmdldEZ1bGxQYXRoKCkpOwotCQkJCQkJCXJlc3VsdC5hZGQobmV3IFN0YXR1cygxIDw8IChJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX1NFVFRJTkdfQ0hBUlNFVCAlIDEwMCAvIDMzKSwgUmVzb3VyY2VzUGx1Z2luLlBJX1JFU09VUkNFUywgSVJlc291cmNlU3RhdHVzLkZBSUxFRF9TRVRUSU5HX0NIQVJTRVQsIGRldGFpbE1lc3NhZ2UsIGUpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNzaG91bGRSdW4oKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gc2hvdWxkUnVuKCkgewotCQkJc3luY2hyb25pemVkIChhc3luY0NoYW5nZXMpIHsKLQkJCQlyZXR1cm4gIWFzeW5jQ2hhbmdlcy5pc0VtcHR5KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc0VudHJ5Q2hhbmdlcyhJUmVzb3VyY2VEZWx0YSBwcm9qZWN0RGVsdGEsIFNldCBwcm9qZWN0c1RvU2F2ZSkgewotCQkJLy8gY2hlY2sgZWFjaCByZXNvdXJjZSB3aXRoIGNzcyBjb250ZW50IHNldHRpbmcgdG8gc2VlIGlmIGl0IGhhcwotCQkJLy8gYmVlbiBtb3ZlZC9kZWxldGVkCi0JCQlib29sZWFuIHJlc291cmNlQ2hhbmdlcyA9IGZhbHNlOwotCi0JCQkvLyBwcm9qZWN0IGFmZmVjdGVkCi0JCQlJUHJvamVjdCBjdXJyZW50UHJvamVjdCA9IChJUHJvamVjdCkgcHJvamVjdERlbHRhLmdldFJlc291cmNlKCk7Ci0KLQkJCXJlc291cmNlQ2hhbmdlcyA9IHByb2Nlc3NQcmVmZXJlbmNlcyhjdXJyZW50UHJvamVjdCwgQ1NTQ29udGVudFByb3BlcnRpZXMuQ1NTX1BST0ZJTEUsIHByb2plY3REZWx0YSwgcHJvamVjdHNUb1NhdmUpOwotCi0JCQkvLyBpZiB0aGVyZSB3YXMgYSBwcmVmZXJlbmNlIGtleSBjaGFuZ2UsIG5lZWQgdG8gc2F2ZSBwcmVmZXJlbmNlcwotCQkJaWYgKHJlc291cmNlQ2hhbmdlcykKLQkJCQlwcm9qZWN0c1RvU2F2ZS5hZGQoY3VycmVudFByb2plY3QpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdvZXMgdGhyb3VnaCBhbGwgdGhlIHJlc291cmNlLWRlcGVuZGVudCBwcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGgKLQkJICogY3VycmVudFByb2plY3QgJiBrZXkgYW5kIHVwZGF0ZXMgdGhlIHByZWZlcmVuY2Uga2V5cyBpZiBuZWVkZWQKLQkJICogYmFzZWQgb24gcHJvamVjdERlbHRhCi0JCSAqIAotCQkgKiBAcGFyYW0gY3VycmVudFByb2plY3QKLQkJICogICAgICAgICAgICBjdXJyZW50IHByb2plY3Qgb2YgdGhlIHByZWZlcmVuY2VzIHRvIGJlIGxvb2tlZCBhdAotCQkgKiBAcGFyYW0ga2V5Ci0JCSAqICAgICAgICAgICAgY3VycmVudCBrZXkvc3ViY2F0ZWdvcnkgb2YgdGhlIHByZWZlcmVuY2VzIHRvIGJlIGxvb2tlZAotCQkgKiAgICAgICAgICAgIGF0Ci0JCSAqIEBwYXJhbSBwcm9qZWN0RGVsdGEKLQkJICogICAgICAgICAgICB0aGUgY2hhbmdlcyB0byBwcm9jZXNzIHRoZSBwcmVmZXJlbmNlIGtleXMgYWdhaW5zdAotCQkgKiBAcGFyYW0gcHJvamVjdHNUb1NhdmUKLQkJICogICAgICAgICAgICB0aGUgcHJvamVjdHMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQvc2F2ZWQKLQkJICogQHJldHVybiB0cnVlIGlmIGN1cnJlbnRQcm9qZWN0J3MgcHJlZmVyZW5jZXMgd2VyZSBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NQcmVmZXJlbmNlcyhJUHJvamVjdCBjdXJyZW50UHJvamVjdCwgU3RyaW5nIGtleSwgSVJlc291cmNlRGVsdGEgcHJvamVjdERlbHRhLCBTZXQgcHJvamVjdHNUb1NhdmUpIHsKLQkJCWJvb2xlYW4gcmVzb3VyY2VDaGFuZ2VzID0gZmFsc2U7Ci0KLQkJCS8vIGdldCB0aGUgcHJvamVjdC1rZXkgcHJlZmVyZW5jZSBub2RlCi0JCQlQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZnMgPSBDU1NDb250ZW50UHJvcGVydGllcy5nZXRQcmVmZXJlbmNlcyhjdXJyZW50UHJvamVjdCwga2V5LCBmYWxzZSk7Ci0JCQlpZiAocHJvamVjdFByZWZzID09IG51bGwpCi0JCQkJLy8gbm8gcHJlZmVyZW5jZXMgZm9yIHRoaXMgcHJvamVjdC1rZXksIGp1c3QgYmFpbAotCQkJCXJldHVybiBmYWxzZTsKLQkJCVN0cmluZ1tdIGFmZmVjdGVkUmVzb3VyY2VzOwotCQkJdHJ5IHsKLQkJCQlhZmZlY3RlZFJlc291cmNlcyA9IHByb2plY3RQcmVmcy5rZXlzKCk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBwcm9ibGVtcyB3aXRoIHRoZSBwcm9qZWN0IHNjb3BlLi4uIHdlIGdvbm5hIG1pc3MgdGhlCi0JCQkJLy8gY2hhbmdlcyAoYnV0IHdpbGwgbG9nKQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJQcm9ibGVtIHJldHJlaXZpbmcgSlNQIEZyYWdtZW50IHByZWZlcmVuY2VzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCS8vIGdvIHRocm91Z2ggZWFjaCBwcmVmZXJlbmNlIGtleSAod2hpY2ggaXMgcmVhbGx5IGEgZmlsZSBuYW1lKQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZmZlY3RlZFJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCS8vIHNlZSBpZiBwcmVmZXJlbmNlIGtleS9maWxlIG5hbWUgd2FzIGZpbGUgdGhhdCB3YXMgY2hhbmdlZAotCQkJCUlSZXNvdXJjZURlbHRhIG1lbWJlckRlbHRhID0gcHJvamVjdERlbHRhLmZpbmRNZW1iZXIobmV3IFBhdGgoYWZmZWN0ZWRSZXNvdXJjZXNbaV0pKTsKLQkJCQkvLyBubyBjaGFuZ2VzIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UKLQkJCQlpZiAobWVtYmVyRGVsdGEgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKG1lbWJlckRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7Ci0JCQkJCXJlc291cmNlQ2hhbmdlcyA9IHRydWU7Ci0JCQkJCS8vIHJlbW92ZSB0aGUgc2V0dGluZyBmb3IgdGhlIG9yaWdpbmFsIGxvY2F0aW9uCi0JCQkJCVN0cmluZyBjdXJyZW50VmFsdWUgPSBwcm9qZWN0UHJlZnMuZ2V0KGFmZmVjdGVkUmVzb3VyY2VzW2ldLCBudWxsKTsKLQkJCQkJcHJvamVjdFByZWZzLnJlbW92ZShhZmZlY3RlZFJlc291cmNlc1tpXSk7Ci0JCQkJCWlmICgobWVtYmVyRGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX1RPKSAhPSAwKSB7Ci0JCQkJCQkvLyBpZiBtb3ZpbmcsIGNvcHkgdGhlIHNldHRpbmcgZm9yIHRoZSBuZXcgbG9jYXRpb24KLQkJCQkJCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobWVtYmVyRGVsdGEuZ2V0TW92ZWRUb1BhdGgoKS5zZWdtZW50KDApKTsKLQkJCQkJCVByZWZlcmVuY2VzIHRhcmdldFByZWZzID0gQ1NTQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXModGFyZ2V0UHJvamVjdCwga2V5LCB0cnVlKTsKLQkJCQkJCXRhcmdldFByZWZzLnB1dChDU1NDb250ZW50UHJvcGVydGllcy5nZXRLZXlGb3IobWVtYmVyRGVsdGEuZ2V0TW92ZWRUb1BhdGgoKSksIGN1cnJlbnRWYWx1ZSk7Ci0JCQkJCQlpZiAodGFyZ2V0UHJvamVjdCAhPSBjdXJyZW50UHJvamVjdCkKLQkJCQkJCQlwcm9qZWN0c1RvU2F2ZS5hZGQodGFyZ2V0UHJvamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzb3VyY2VDaGFuZ2VzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEZvciBhbnkgY2hhbmdlIHRvIHRoZSBlbmNvZGluZyBmaWxlIG9yIGFueSByZXNvdXJjZSB3aXRoIGVuY29kaW5nCi0JCSAqIHNldCwganVzdCBkaXNjYXJkIHRoZSBjYWNoZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcHJvamVjdC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSVJlc291cmNlRGVsdGFbXSBwcm9qZWN0RGVsdGFzID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJLy8gcHJvY2VzcyBlYWNoIHByb2plY3QgaW4gdGhlIGRlbHRhCi0JCQlTZXQgcHJvamVjdHNUb1NhdmUgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0RGVsdGFzLmxlbmd0aDsgaSsrKQotCQkJCS8vIG5vdGhpbmcgdG8gZG8gaWYgYSBwcm9qZWN0IGhhcyBiZWVuIGFkZGVkL3JlbW92ZWQvbW92ZWQKLQkJCQlpZiAocHJvamVjdERlbHRhc1tpXS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiAocHJvamVjdERlbHRhc1tpXS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgPT0gMCkKLQkJCQkJcHJvY2Vzc0VudHJ5Q2hhbmdlcyhwcm9qZWN0RGVsdGFzW2ldLCBwcm9qZWN0c1RvU2F2ZSk7Ci0JCQlmSm9iLmFkZENoYW5nZXMocHJvamVjdHNUb1NhdmUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzdGFydHVwKCkgewotCQlfaW5zdGFuY2UgPSBuZXcgQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyKCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKF9pbnN0YW5jZS5mUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKF9pbnN0YW5jZS5mUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCV9pbnN0YW5jZSA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0J5dGVSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiODc2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0J5dGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci0KLS8qKgotICogVGhpcyBpcyBhbiAiYWRhcHRlciIgY2xhc3MsIHNpbXBseSB0byBnZXQgaW4gaW5wdXQgc3RyZWFtIHRvIGFjdCBsaWtlIGEKLSAqIHJlYWRlci4gV2UgY291bGQgbm90IHVzZSBJbnB1dFN0cmVhbVJlYWRlciBkaXJlY3RseSBiZWNhdXNlIGl0cyBpbnRlcm5hbAotICogYnVmZmVycyBhcmUgbm90IGNvbnRyb2xsYWJsZSwgYW5kIGl0IHNvbWV0aW1lcyBwdWxscyB0b28gbXVjaCBvdXQgb2YgaW5wdXQKLSAqIHN0cmVhbSAoZXZlbiB3aGVuIGl0IHdhc24ndCBuZWVkZWQgZm9yIG91ciBwdXJwb3NlcykuCi0gKiAKLSAqIFRoZSB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBoaWdobHkgc3BlY2lhbGl6ZWQgYW5kIGJ5IG5vIG1lYW5zIG1lYW50IHRvIGJlCi0gKiBnZW5lcmFsIHB1cnBvc2UuIEl0cyB1c2UgaXMgcmVzdHJpY3RlZCB0byB0aG9zZSBjYXNlcyB3aGVyZSB0aGUgaW5wdXQKLSAqIHN0cmVhbSBjYW4gYmUgcmVnYXJkZWQgYXMgYXNjaWkganVzdCBsb25nIGVub3VnaCB0byBkZXRlcm1pbmUgd2hhdCB0aGUgcmVhbAotICogZW5jb2Rpbmcgc2hvdWxkIGJlLgotICovCi0KLXB1YmxpYyBjbGFzcyBCeXRlUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKLQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSBDb2RlZElPLk1BWF9CVUZfU0laRTsKLQotCXByb3RlY3RlZCBieXRlW10gZkJ1ZmZlcjsKLQotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBmSW5wdXRTdHJlYW07Ci0KLQlwcm90ZWN0ZWQgQnl0ZVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQl0aGlzKGlucHV0U3RyZWFtLCBERUZBVUxUX0JVRkZFUl9TSVpFKTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBpbnQgc2l6ZSkgewotCQl0aGlzLmZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuZkJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZJbnB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRBaGVhZExpbWl0KSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLm1hcmsocmVhZEFoZWFkTGltaXQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBiMCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQoKTsKLQkJcmV0dXJuIChiMCAmIDB4MDBGRik7Ci0JfQotCi0JcHVibGljIGludCByZWFkKGNoYXIgY2hbXSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGxlbmd0aCA+IHRoaXMuZkJ1ZmZlci5sZW5ndGgpIHsKLQkJCWxlbmd0aCA9IHRoaXMuZkJ1ZmZlci5sZW5ndGg7Ci0JCX0KLQotCQlpbnQgY291bnQgPSB0aGlzLmZJbnB1dFN0cmVhbS5yZWFkKHRoaXMuZkJ1ZmZlciwgMCwgbGVuZ3RoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWludCBiMCA9IHRoaXMuZkJ1ZmZlcltpXTsKLQkJCS8vIHRoZSAweDAwRkYgaXMgdG8gImxvc2UiIHRoZSBuZWdhdGl2ZSBiaXRzIGZpbGxlZCBpbiB0aGUgYnl0ZSB0bwotCQkJLy8gaW50IGNvbnZlcnNpb24KLQkJCS8vIChhbmQgd2hpY2ggd291bGQgYmUgdGhlcmUgaWYgY2FzdCBkaXJlY3RseSBmcm9tIGJ5dGUgdG8gY2hhcikuCi0JCQljaGFyIGMwID0gKGNoYXIpIChiMCAmIDB4MDBGRik7Ci0JCQljaFtvZmZzZXQgKyBpXSA9IGMwOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZJbnB1dFN0cmVhbS5yZXNldCgpOwotCX0KLQotCXB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5mSW5wdXRTdHJlYW0uc2tpcChuKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ1NTSGVhZFRva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9DU1NIZWFkVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZGZmZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9DU1NIZWFkVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQwICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDcvMjgvMDggNToxOSBQTSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXg8L2E+IDEuMi4yCi0gKiBvbiA3LzI4LzA4IDU6MTkgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovd29ya3NwYWNlcy93dHAzMDEvd29ya3NwYWNlL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuakZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgQ1NTSGVhZFRva2VuaXplciB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFVuRGVsaW1pdGVkU3RyaW5nID0gMTI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IERRX1NUUklORyA9IDg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNRX1NUUklORyA9IDEwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxEZWNsID0gMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgUXVvdGVkQXR0cmlidXRlVmFsdWUgPSA2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBDSEFSU0VUX1JVTEUgPSA0OwotCi0gIC8qKgotICAgKiBZWV9MRVhTVEFURVtsXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiBZWV9MRVhTVEFURVtsKzFdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICogbCBpcyBvZiB0aGUgZm9ybSBsID0gMiprLCBrIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIKLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBZWV9MRVhTVEFURVtdID0geyAKLSAgICAgMCwgIDEsICAyLCAgMiwgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNywgNwotICB9OwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9IAotICAgICJcMVwxMVwxMFwwXDFcNlwxXDEwXDJcMFwxXDdcMjJcMFwxXDZcMVwwXDFcMzciKwotICAgICJcMlwwXDFcNDJcMVwwXDFcNDBcN1wwXDFcNDFcMTNcMFwxXDM2XDFcMTNcMVwxMiIrCi0gICAgIlwxXDM1XDFcMTRcMVwyMFwxXDIzXDFcMFwxXDIxXDFcMzJcMVwyNlwxXDBcMVwzNCIrCi0gICAgIlwxXDIyXDFcMzNcMlwwXDFcMTdcMVwxNlwxXDMwXDFcMzFcMlwwXDFcMjRcMVwyNSIrCi0gICAgIlwxXDI3XDNcMFwxXDE1XDEwXDBcMVwyM1wxXDBcMVwyMVwxXDMyXDFcMjZcMVwwIisKLSAgICAiXDFcMzRcMVwyMlwxXDMzXDJcMFwxXDE3XDFcMTZcMVwzMFwxXDMxXDJcMFwxXDI0IisKLSAgICAiXDFcMjVcMVwyN1wzXDBcMVwxNVwxMDJcMFwxXDRcM1wwXDFcNVwxN1wwXDFcMyIrCi0gICAgIlwxNlwwXDFcMVwyMFwwXDFcM1wxNlwwXDFcMVwxXDJcMTcwXDBcMVwyXHVmZTg3XDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotLy8gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0vLyAgcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDgwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0KLQotCi0JcHVibGljIENTU0hlYWRUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7Ci0JICAJLyogdGhlIGlucHV0IGRldmljZSAqLwotCSAgCXl5X3JlYWRlciA9IGluOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICAJCXl5X3N0YXRlID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIAkJLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAJCSB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIAkJeXlfbWFya2VkUG9zID0gMDsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIAkJeXlfcHVzaGJhY2tQb3MgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfY3VycmVudFBvcyA9IDA7Ci0KLSAgCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9zdGFydFJlYWQgPSAwOwotCi0gIAkJLyoqIAotICAJCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAJCSAqIGZyb20gaW5wdXQgCi0gIAkJICovCi0gIAkJeXlfZW5kUmVhZCA9IDA7Ci0KLSAgCQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLS8vICAJCXl5bGluZSA9IDA7Ci0KLSAgCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWNoYXIgPSAwOwotCi0gIAkJLyoqCi0gIAkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgCQkgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gIAkJICovCi0vLyAgCQl5eWNvbHVtbiA9IDA7IAotCi0gIAkJLyoqIAotICAJCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIAotICAJCSAqIG9mIGEgbGluZQotICAJCSAqLwotICAJCXl5X2F0Qk9MID0gZmFsc2U7Ci0KLSAgCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIAkJeXlfYXRFT0YgPSBmYWxzZTsKLQotICAJCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAJCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotICAJCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0gIAkJCi0gIAkJaGFzTW9yZSA9IHRydWU7Ci0gIAkJCi0JCS8vIGl0cyBhIGxpdHRsZSB3YXN0ZWZ1bCB0byAidGhyb3cgYXdheSIgZmlyc3QgY2hhciBhcnJheSBnZW5lcmF0ZWQKLQkJLy8gYnkgY2xhc3MgaW5pdCAodmlhIGF1dG8gZ2VuZXJhdGVkIGNvZGUpLCBidXQgd2UgcmVhbGx5IGRvIHdhbnQKLQkJLy8gYSBzbWFsbCBidWZmZXIgZm9yIG91ciBoZWFkIHBhcnNlcnMuCi0JCWlmICh5eV9idWZmZXIubGVuZ3RoICE9IE1BWF9UT19TQ0FOKSB7Ci0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltNQVhfVE9fU0NBTl07Ci0JCX0KLSAgCQkKLQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQotCQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgQ1NTSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBDU1NIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTYwKSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotCi0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9kb19lb2YoKSB7Ci0gICAgaWYgKCF5eV9lb2ZfZG9uZSkgewotICAgICAgeXlfZW9mX2RvbmUgPSB0cnVlOwotICAgIAloYXNNb3JlPWZhbHNlOwotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICB5eV9hdEJPTCA9IHl5X21hcmtlZFBvcyA8PSAwIHx8IHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MtMV0gPT0gJ1xuJzsKLSAgICAgIGlmICgheXlfYXRCT0wgJiYgeXlfYnVmZmVyW3l5X21hcmtlZFBvcy0xXSA9PSAnXHInKSB7Ci0gICAgICAgIHl5X2F0Qk9MID0geXlfYWR2YW5jZSgpICE9ICdcbic7Ci0gICAgICAgIGlmICgheXlfYXRFT0YpIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIGlmICh5eV9hdEJPTCkKLSAgICAgICAgeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlKzFdOwotICAgICAgZWxzZQotICAgICAgICB5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGVdOwotCi0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eWNtYXBbeXlfaW5wdXRdOwotCi0gICAgICAgICAgYm9vbGVhbiB5eV9pc0ZpbmFsID0gZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiB5eV9ub0xvb2tBaGVhZCA9IGZhbHNlOwotCi0gICAgICAgICAgeXlfZm9yTmV4dDogeyBzd2l0Y2ggKHl5X3N0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDogeXlfc3RhdGUgPSA0MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDQ0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gNDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSA0NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDQ5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDUwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gNTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDUyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHl5X3N0YXRlID0gNTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSA1NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA1OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA2MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA2NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9zdGF0ZSA9IDY1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDY2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDY3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDY4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X3N0YXRlID0gNjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogeXlfc3RhdGUgPSA2OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA3MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X3N0YXRlID0gNjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA2OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDQ0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gNDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSA0NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDQ5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDUwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gNTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDQ5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDc1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHl5X3N0YXRlID0gNzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDUxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDc3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gNzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSA1NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDU1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDc5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSA1NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA4MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDgxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDgyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA2MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDYxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA4MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA3MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogeXlfc3RhdGUgPSA3NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA4NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB5eV9zdGF0ZSA9IDg1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA3ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA4NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDg3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA4MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA4ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9zdGF0ZSA9IDg5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogeXlfc3RhdGUgPSA4NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA5MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9zdGF0ZSA9IDkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA4NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA5MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDkzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfc3RhdGUgPSA4OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA5NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB5eV9zdGF0ZSA9IDk1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA5MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA5NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gOTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gOTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSA5OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHl5X3N0YXRlID0gOTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTAwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHl5X3N0YXRlID0gMTAxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTAzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSA5OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfc3RhdGUgPSAxMDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogeXlfc3RhdGUgPSAxMDE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEwNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9zdGF0ZSA9IDEwNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTAzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHl5X3N0YXRlID0gMTA1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X3N0YXRlID0gMTA3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSAxMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSAxMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDExMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX0lMTEVHQUxfU1RBVEUpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9IH0KLQotICAgICAgICAgIGlmICggeXlfaXNGaW5hbCApIHsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCB5eV9ub0xvb2tBaGVhZCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICBjYXNlIDY0OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDExOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICBjYXNlIDgzOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotICAgICAgICBjYXNlIDEyMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICBjYXNlIDU5OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFlZSU5JVElBTCk7ICBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBDU1NIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlJ1bGVFbmQ7IH0KLSAgICAgICAgY2FzZSAxMjE6IGJyZWFrOwotICAgICAgICBjYXNlIDM5OiAKLSAgICAgICAgY2FzZSA3MzogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSAxMjI6IGJyZWFrOwotICAgICAgICBjYXNlIDEwOTogCi0gICAgICAgIGNhc2UgMTEyOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApICB7eXliZWdpbihDSEFSU0VUX1JVTEUpOyByZXR1cm4gQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5DSEFSU0VUX1JVTEU7fSB9Ci0gICAgICAgIGNhc2UgMTIzOiBicmVhazsKLSAgICAgICAgY2FzZSA5NjogCi0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fSB9Ci0gICAgICAgIGNhc2UgMTI0OiBicmVhazsKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgIGNhc2UgMTE6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgIGNhc2UgMzc6IAotICAgICAgICAgIHsgaWYoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fSB9Ci0gICAgICAgIGNhc2UgMTI1OiBicmVhazsKLSAgICAgICAgY2FzZSA1NTogCi0gICAgICAgIGNhc2UgNzk6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyAgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDsgfQotICAgICAgICBjYXNlIDEyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE0OiAKLSAgICAgICAgY2FzZSAxMTY6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7IH0KLSAgICAgICAgY2FzZSAxMjc6IGJyZWFrOwotICAgICAgICBjYXNlIDM6IAotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSA1ODogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyB9Ci0gICAgICAgIGNhc2UgMTI4OiBicmVhazsKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFOyB9Ci0gICAgICAgIGNhc2UgMTI5OiBicmVhazsKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFOyB9Ci0gICAgICAgIGNhc2UgMTMwOiBicmVhazsKLSAgICAgICAgY2FzZSA3NDogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007IH0KLSAgICAgICAgY2FzZSAxMzE6IGJyZWFrOwotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgIGNhc2UgMzU6IAotICAgICAgICAgIHsgIHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7ICB9Ci0gICAgICAgIGNhc2UgMTMyOiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgIGNhc2UgNjM6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgIH0KLSAgICAgICAgY2FzZSAxMzM6IGJyZWFrOwotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgY2FzZSA2MjogCi0gICAgICAgICAgeyAgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDEzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICBjYXNlIDY3OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMTM1OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICAgIHsgIHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMTM2OiBicmVhazsKLSAgICAgICAgY2FzZSAzNjogCi0gICAgICAgIGNhc2UgNzE6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDEzNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzg6IAotICAgICAgICBjYXNlIDcyOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMTM4OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB5eV9kb19lb2YoKTsKLSAgICAgICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7IH0KLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0gIC8qKgotICAgKiBSdW5zIHRoZSBzY2FubmVyIG9uIGlucHV0IGZpbGVzLgotICAgKgotICAgKiBUaGlzIG1haW4gbWV0aG9kIGlzIHRoZSBkZWJ1Z2dpbmcgcm91dGluZSBmb3IgdGhlIHNjYW5uZXIuCi0gICAqIEl0IHByaW50cyBlYWNoIHJldHVybmVkIHRva2VuIHRvIFN5c3RlbS5vdXQgdW50aWwgdGhlIGVuZCBvZgotICAgKiBmaWxlIGlzIHJlYWNoZWQsIG9yIGFuIGVycm9yIG9jY3VyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBhcmd2ICAgdGhlIGNvbW1hbmQgbGluZSwgY29udGFpbnMgdGhlIGZpbGVuYW1lcyB0byBydW4KLSAgICogICAgICAgICAgICAgICB0aGUgc2Nhbm5lciBvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHsKLSAgICAgIENTU0hlYWRUb2tlbml6ZXIgc2Nhbm5lciA9IG51bGw7Ci0gICAgICB0cnkgewotICAgICAgICBzY2FubmVyID0gbmV3IENTU0hlYWRUb2tlbml6ZXIoIG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJndltpXSkgKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQgOiBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb3BlbmluZyBmaWxlIFwiIithcmd2W2ldKyJcIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIDogamF2YSBDU1NIZWFkVG9rZW5pemVyIDxpbnB1dGZpbGU+Iik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotCi0gICAgICB0cnkgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNjYW5uZXIucHJpbUdldE5leHRUb2tlbigpKTsKLSAgICAgICAgfSB3aGlsZSAoIXNjYW5uZXIueXlfYXRFT0YpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9DU1NIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OTFhMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9DU1NIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cyB7Ci0KLQlTdHJpbmcgUnVsZUVuZCA9ICJSdWxlRW5kIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDSEFSU0VUX1JVTEUgPSAiQ0hBUlNFVF9SVUxFIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU1Jlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9DU1NSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmNWZiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU1Jlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLk5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotCi0KLQotcHVibGljIGNsYXNzIENTU1Jlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciB7Ci0JY2xhc3MgTnVsbE1lbWVudG8gZXh0ZW5kcyBFbmNvZGluZ01lbWVudG8gewotCQkvKioKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgTnVsbE1lbWVudG8oKSB7Ci0JCQlzdXBlcigpOwotCQkJU3RyaW5nIGRlZmF1bHRDaGFyc2V0ID0gTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy51c2VEZWZhdWx0TmFtZVJ1bGVzKG51bGwpOwotCQkJc2V0SmF2YUNoYXJzZXROYW1lKGRlZmF1bHRDaGFyc2V0KTsKLQkJCXNldEFwcHJvcHJpYXRlRGVmYXVsdChkZWZhdWx0Q2hhcnNldCk7Ci0JCQlzZXREZXRlY3RlZENoYXJzZXROYW1lKG51bGwpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIENTU0hlYWRUb2tlbml6ZXIgZlRva2VuaXplcjsKLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBmRW5jb2RpbmdNZW1lbnRvOwotCXByaXZhdGUgYm9vbGVhbiBmSGVhZGVyUGFyc2VkOwotCXByaXZhdGUgUmVhZGVyIGZSZWFkZXI7Ci0KLQkvKioKLQkgKiBUaGVyZSBpcyBubyBzcGVjIGRlZmluZWQgZW5jb2RpbmcgZm9yIENTUywgc28gTnVsbCBpcyByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIHNob3VsZCBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luLnhtbCAob3IgbG9vayBpdCB1cCBmcm9tIHRoZXJlKS4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbShTdHJpbmcgdG9rZW5UeXBlKSB7Ci0JCWJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gZmFsc2U7Ci0JCWlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0VVRGODNCeXRlQk9NVXNlZCh0cnVlKTsKLQkJfQotCQllbHNlIGlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRSB8fCB0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTE2IjsgLy8kTk9OLU5MUy0xJAotCQkJYnl0ZVtdIGJvbSA9ICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRSkgPyBJQ29udGVudERlc2NyaXB0aW9uLkJPTV9VVEZfMTZCRSA6IElDb250ZW50RGVzY3JpcHRpb24uQk9NX1VURl8xNkxFOwotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRVbmljb2RlU3RyZWFtKHRydWUpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRVbmljb2RlQk9NKGJvbSk7Ci0JCX0KLQkJcmV0dXJuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRva2VuaXplci4KLQkgKi8KLQlwcml2YXRlIENTU0hlYWRUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCQlmVG9rZW5pemVyID0gbmV3IENTU0hlYWRUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNMZWdhbFN0cmluZyhTdHJpbmcgdmFsdWVUb2tlblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKHZhbHVlVG9rZW5UeXBlICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNoZWNrSW5Db250ZW50cygpOwotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQljaGVja0hldXJpc3RpY3MoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0luQ29udGVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlDU1NIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQl0b2tlbml6ZXIucmVzZXQoZlJlYWRlcik7Ci0JCUhlYWRQYXJzZXJUb2tlbiB0b2tlbiA9IG51bGw7Ci0JCVN0cmluZyB0b2tlblR5cGUgPSBudWxsOwotCQlkbyB7Ci0JCQl0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCXRva2VuVHlwZSA9IHRva2VuLmdldFR5cGUoKTsKLQkJCWlmIChjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0odG9rZW5UeXBlKSkgewotCQkJCS8vIHNpZGUgZWZmZWN0IG9mIGNhbkhhbmRsZSBpcyB0byBjcmVhdGUgYXBwcm9wcmlhdGUgbWVtZW50bwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5UeXBlID09IENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuQ0hBUlNFVF9SVUxFKSB7Ci0JCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJSGVhZFBhcnNlclRva2VuIHZhbHVlVG9rZW4gPSB0b2tlbml6ZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCQkJCVN0cmluZyB2YWx1ZVRva2VuVHlwZSA9IHZhbHVlVG9rZW4uZ2V0VHlwZSgpOwotCQkJCQlpZiAoaXNMZWdhbFN0cmluZyh2YWx1ZVRva2VuVHlwZSkpIHsKLQkJCQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byh2YWx1ZVRva2VuLmdldFRleHQoKSwgRW5jb2RpbmdNZW1lbnRvLkZPVU5EX0VOQ09ESU5HX0lOX0NPTlRFTlQpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrSGV1cmlzdGljcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gbm9IZXVyaXN0aWMgPSBmYWxzZTsKLQkJU3RyaW5nIGhldXJpc3RpY0VuY29kaW5nID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIucmVzZXQoKTsKLQkJCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzNdOwotCQkJaW50IG5SZWFkID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZlJlYWRlci5yZWFkeSgpKSB7Ci0JCQkJCWludCBvbmVCeXRlID0gZlJlYWRlci5yZWFkKCk7Ci0JCQkJCW5SZWFkKys7Ci0JCQkJCWlmIChvbmVCeXRlIDw9IDB4RkYpIHsKLQkJCQkJCWJ5dGVzW2ldID0gKGJ5dGUpIG9uZUJ5dGU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlub0hldXJpc3RpYyA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5vSGV1cmlzdGljID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFub0hldXJpc3RpYyAmJiBuUmVhZCA9PSAzKSB7Ci0JCQkJaGV1cmlzdGljRW5jb2RpbmcgPSBFbmNvZGluZ0d1ZXNzZXIuZ3Vlc3NFbmNvZGluZyhieXRlcywgMyk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIGFueSBJTyBleGNlcHRpb24sIHRoZW4gbm90IGEgaGV1cmlzdGljIGNhc2UKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWZSZWFkZXIucmVzZXQoKTsKLQkJfQotCQlpZiAoaGV1cmlzdGljRW5jb2RpbmcgIT0gbnVsbCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGhldXJpc3RpY0VuY29kaW5nLCBFbmNvZGluZ01lbWVudG8uR1VFU1NFRF9FTkNPRElOR19GUk9NX1NUUkVBTSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGRldGVjdGVkQ2hhcnNldE5hbWUpKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXREZXRlY3RlZENoYXJzZXROYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyBUT0RPOiBpZiBkZXRlY3RlZENoYXJzZXQgYW5kIHNwZWMgZGVmYXVsdCBpcwotCQkvLyBudWxsLCBuZWVkIHRvIHVzZSAid29yawotCQkvLyBiZW5jaCBiYXNlZCIgZGVmYXVsdHMuCi0JCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHBhcmFtIHJlYXNvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUsIFN0cmluZyByZWFzb24pIHsKLQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCX0KLQotCS8qKgotCSAqIGNvbnZpZW5jZSBtZXRob2QgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSAoYnV0IG5vdCBvdmVycmlkZSkKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgZW5zdXJlSW5wdXRTZXQoKSB7Ci0JCWlmIChmUmVhZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImlucHV0IG11c3QgYmUgc2V0IGJlZm9yZSB1c2UiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIHJldHVybiBudWxsLCBpZiBpbnZhbGlkIGNoYXJzZXQgbmFtZSAoaW4gd2hpY2ggY2FzZQotCSAqICJhcHByb3ByaWF0ZURlZmF1bHQiIHNob3VsZCBiZSB1c2VkLCBpZiBhIG5hbWUgaXMgcmVhbGx5IG5lZWQgZm9yIHNvbWUKLQkgKiAic2F2ZSBhbnl3YXkiIGNhc2VzKS4KLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyAxLiBDaGVjayBleHBsaWNpdCBtYXBwaW5nIG92ZXJyaWRlcyBmcm9tCi0JCS8vIHByb3BlcnR5IGZpbGUgLS0gaXRzIGhlcmUgd2UgcGljayB1cCAicnVsZXMiIGZvciBjYXNlcwotCQkvLyB0aGF0IGFyZSBub3QgZXZlbiBpbiBKYXZhCi0JCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyAyLiBVc2UgdGhlICJjYW5vbmljYWwiIG5hbWUgZnJvbSBKUkUgbWFwcGluZ3MKLQkJLy8gTm90ZTogc2VlIENoYXJzZXQgSmF2YURvYywgdGhlIG5hbWUgeW91IGdldCBvbmUKLQkJLy8gd2l0aCBjYW4gYmUgYWxpYXMsCi0JCS8vIHRoZSBuYW1lIHlvdSBnZXQgYmFjayBpcyAic3RhbmRhcmQiIG5hbWUuCi0JCUNoYXJzZXQgamF2YUNoYXJzZXQgPSBudWxsOwotCQl0cnkgewotCQkJamF2YUNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCS8vIGdpdmUgcHJpb3JpdHkgdG8gamF2YSBjb25vbmljYWwgbmFtZSwgaWYgcHJlc2VudAotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gamF2YUNoYXJzZXQubmFtZSgpOwotCQkJLy8gYnV0IHN0aWxsIGFsbG93IG92ZXJyaWRlcwotCQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMocmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RW5jb2RpbmdNZW1lbnRvKCkuZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbgotCQkJLy8gcGFyc2UsIHNvIGNhbiBtYWtlCi0JCQkvLyBtdWx0aXBsZSAnZ2V0JyBjYWxscywgd2l0aG91dCBjYXVzaW5nCi0JCQkvLyByZXBhcnNpbmcuCi0JCQlmSGVhZGVyUGFyc2VkID0gdHJ1ZTsKLQkJCS8vIE5vdGU6IHRoZXJlIGlzIGEgImhpZGRlbiBhc3N1bXB0aW9uIiBoZXJlCi0JCQkvLyB0aGF0IGFuIGVtcHR5Ci0JCQkvLyBzdHJpbmcgaW4gY29udGVudCBzaG91bGQgYmUgdHJlYXRlZCBzYW1lIGFzCi0JCQkvLyBub3QgcHJlc2VudC4KLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQloYW5kbGVTcGVjRGVmYXVsdCgpOwotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCS8vIHNhZnR5IG5ldAotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBOdWxsTWVtZW50bygpOwotCQl9Ci0JCXJldHVybiBmRW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgZW5jID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmMpOwotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTcGVjRGVmYXVsdCgpIHsKLQkJU3RyaW5nIGVuY29kaW5nTmFtZTsKLQkJZW5jb2RpbmdOYW1lID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jb2RpbmdOYW1lICE9IG51bGwpIHsKLQkJCS8vIGNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmNvZGluZ05hbWUsCi0JCQkvLyBFbmNvZGluZ01lbWVudG8uVVNFRF9DT05URU5UX1RZUEVfREVGQVVMVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZW5jb2RpbmdOYW1lKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuY29kaW5nTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRBbGwoKSB7Ci0JCWZSZWFkZXIgPSBudWxsOwotCQlmSGVhZGVyUGFyc2VkID0gZmFsc2U7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gbmV3IEJ5dGVSZWFkZXIoaW5wdXRTdHJlYW0pOwotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGtub3cgQnl0ZVJlYWRlcgotCQkJLy8gc3VwcG9ydHMgbWFya2luZwotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9yQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0ODYzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRlbnREZXNjcmliZXJGb3JDU1MgaW1wbGVtZW50cyBJVGV4dENvbnRlbnREZXNjcmliZXIgewotCWZpbmFsIHByaXZhdGUgc3RhdGljIFF1YWxpZmllZE5hbWVbXSBTVVBQT1JURURfT1BUSU9OUyA9IHtJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUfTsKLQotCXB1YmxpYyBpbnQgZGVzY3JpYmUoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCWVsc2UgewotCQkJY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgZGVzY3JpYmUoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCQllbHNlIHsKLQkJCWNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZVtdIGdldFN1cHBvcnRlZE9wdGlvbnMoKSB7Ci0KLQkJcmV0dXJuIFNVUFBPUlRFRF9PUFRJT05TOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCQlkZXRlY3Rvci5zZXQoY29udGVudHMpOwotCQkJaGFuZGxlQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29udGVudHMKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCQlkZXRlY3Rvci5zZXQoY29udGVudHMpOwotCQkJaGFuZGxlQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBjb21wdXRlVmFsaWRpdHkoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJLy8gY3VycmVudGx5IG5vIHNwZWNpZmljIGNoZWNrIGZvciB2YWxpZGlsdHkKLQkJLy8gYmFzZWQgb24gY29udGVudHMuCi0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotCXByaXZhdGUgaW50IGNvbXB1dGVWYWxpZGl0eShSZWFkZXIgcmVhZGVyKSB7Ci0JCS8vIGN1cnJlbnRseSBubyBzcGVjaWZpYyBjaGVjayBmb3IgdmFsaWRpbHR5Ci0JCS8vIGJhc2VkIG9uIGNvbnRlbnRzLgotCQlyZXR1cm4gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBnZXREZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBDU1NSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGV0ZWN0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNhbGN1bGF0aW9ucyhJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGU6IGlmIHdlJ3JlIGFza2VkIGZvciBvbmUsIHdlIHNldCB0aGVtIGFsbC4gSSBuZWVkIHRvIGJlIHN1cmUgaWYKLQkJLy8gY2FsbGVkCi0JCS8vIG11bGl0aXBsZSB0aW1lcyAob25lIGZvciBlYWNoLCBzYXkpIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgdGltZQotCQkvLyBwcm9jZXNzaW5nIHNhbWUKLQkJLy8gY29udGVudCBhZ2Fpbi4KLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9ICgoQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcikuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCS8vIFRPRE86IEkgbmVlZCB0byB2ZXJpZnkgdG8gc2VlIGlmIHRoaXMgQk9NIHdvcmsgaXMgYWx3YXlzIGRvbmUKLQkJLy8gYnkgdGV4dCB0eXBlLgotCQlPYmplY3QgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrID0gZW5jb2RpbmdNZW1lbnRvLmdldFVuaWNvZGVCT00oKTsKLQkJaWYgKGRldGVjdGVkQnl0ZU9yZGVyTWFyayAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdCeXRlT3JkZXJNYXJrID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspOwotCQkJLy8gbm90IHN1cmUgd2h5IHdvdWxkIGV2ZXIgYmUgZGlmZmVyZW50LCBzbyBpZiBpcyBkaWZmZXJlbnQsIG1heQotCQkJLy8gbmVlZCB0byAicHVzaCIgdXAgaW50byBiYXNlLgotCQkJaWYgKCFkZXRlY3RlZEJ5dGVPcmRlck1hcmsuZXF1YWxzKGV4aXN0aW5nQnl0ZU9yZGVyTWFyaykpCi0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIGRldGVjdGVkQnl0ZU9yZGVyTWFyayk7Ci0JCX0KLQotCi0JCWlmICghZW5jb2RpbmdNZW1lbnRvLmlzVmFsaWQoKSkgewotCQkJLy8gbm90ZTogYWZ0ZXIgc2V0dGluZyBoZXJlLCBpdHMgdGhlIG1lcmUgcHJlc2VuY2Ugb2YKLQkJCS8vIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUCi0JCQkvLyBpbiB0aGUgcmVzb3VyY2UncyBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZgotCQkJLy8gaW52YWxpZAotCQkJLy8gaW4gdGhvc2UgY2FzZXMsIHRoZSAiZGV0ZWN0ZWQiIHByb3BlcnR5IGNvbnRhaW5zIGFuCi0JCQkvLyAiYXBwcm9wcmlhdGUgZGVmYXVsdCIgdG8gdXNlLgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIGVuY29kaW5nTWVtZW50by5nZXRJbnZhbGlkRW5jb2RpbmcoKSk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCwgZW5jb2RpbmdNZW1lbnRvLmdldEFwcHJvcHJpYXRlRGVmYXVsdCgpKTsKLQkJfQotCi0JCU9iamVjdCBkZXRlY3RlZENoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQlPYmplY3QgamF2YUNoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0KLQkJLy8gd2UgYWx3YXlzIGluY2x1ZGUgZGV0ZWN0ZWQsIGlmIGl0cyBkaWZmZXJlbnQgdGhhbiBqYXZhCi0JCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCi0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdDaGFyc2V0ID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKTsKLQkJCWlmIChqYXZhQ2hhcnNldC5lcXVhbHMoZXhpc3RpbmdDaGFyc2V0KSkgewotCQkJCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gd2UgbWF5IG5lZWQgdG8gYWRkIHdoYXQgd2UgZm91bmQsIGJ1dCBvbmx5IG5lZWQgdG8gYWRkCi0JCQkJLy8gaWYgZGlmZmVyZW50IGZyb20gZGVmYXVsdC50aGUKLQkJCQlPYmplY3QgZGVmYXVsdENoYXJzZXQgPSBnZXREZXRlY3RvcigpLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQlpZiAoZGVmYXVsdENoYXJzZXQgIT0gbnVsbCkgewotCQkJCQlpZiAoIWRlZmF1bHRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBhc3N1bWluZyBpZiB0aGVyZSBpcyBubyBzcGVjIGRlZmF1bHQsIHdlIGFsd2F5cyBuZWVkIHRvCi0JCQkJCS8vIGFkZCwgSSdtIGFzc3VtaW5nCi0JCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgT2JqZWN0IGRldGVjdGVkQ2hhcnNldCwgT2JqZWN0IGphdmFDaGFyc2V0KSB7Ci0JCS8vIHNpbmNlIGVxdWFsLCB3ZSBkb24ndCBuZWVkIHRvIGFkZCwgYnV0IGlmIG91ciBkZXRlY3RlZCB2ZXJzaW9uIGlzCi0JCS8vIGRpZmZlcmVudCB0aGFuIGphdmFDaGFyc2V0LCB0aGVuIHdlIHNob3VsZCBhZGQgaXQuIFRoaXMgd2lsbAotCQkvLyBoYXBwZW4sIGZvciBleGFtcGxlLCBpZiB0aGVyZSdzIGRpZmZlcmVuY2VzIGluIGNhc2UsIG9yIGRpZmZlcmVuY2VzCi0JCS8vIGR1ZSB0byBvdmVycmlkZSBwcm9wZXJ0aWVzCi0JCWlmIChkZXRlY3RlZENoYXJzZXQgIT0gbnVsbCkgewotCi0JCQkvLyBPbmNlIHdlIGRldGVjdGVkIGEgY2hhcnNldCwgd2Ugc2hvdWxkIHNldCB0aGUgcHJvcGVydHkgZXZlbgotCQkJLy8gdGhvdWdoIGl0J3MgdGhlIHNhbWUgYXMgamF2YUNoYXJzZXQKLQkJCS8vIGJlY2F1c2UgdGhlcmUgYXJlIGNsaWVudHMgdGhhdCByZWx5IG9uIHRoaXMgcHJvcGVydHkgdG8KLQkJCS8vIGRldGVybWluZSBpZiB0aGUgY2hhcnNldCBpcyBhY3R1YWxseSBkZXRlY3RlZCBpbiBmaWxlIG9yIG5vdC4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBkZXRlY3RlZENoYXJzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1JlbGV2ZW50KElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCS8vIGVsc2UgaWYKLQkJLy8gKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5FTkNPRElOR19NRU1FTlRPKSkKLQkJLy8gcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0VuY29kaW5nR3Vlc3Nlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ0d1ZXNzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMwODAwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0VuY29kaW5nR3Vlc3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLS8qKgotICogCi0gKiBUaGlzIGlzIHBvcnRlZCBmcm9tIFBhZ2VEZXNpZ25lcidzIGhwYmNvbS9LYW5qaS5jcHAncwotICogS2Fuamk6Omd1ZXNzX2thbmppX2NvZGUoKSwKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEVuY29kaW5nR3Vlc3NlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTQ0lJID0gMDsgLy8gQVNDSUkKLQkvLyBJU08tMjAyMi1KUAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBU0NJSV9JTiA9IDg7IC8vIFRoaXMgaXMgYWZ0ZXIgSVNPMjAyMidzIGNoYW5nZQotCS8vIFNoaWZ0LUpJUwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVUNfSEFMRktBTkEgPSA2OyAvLyBUaGlzIGlzIEhhbGYgS2FuYSBpbiBFVUMtSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVVDX0pQID0gMzsgLy8gVGhpcyBpcyBFVUMtSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVNPMjAyMl9KUCA9IDQ7IC8vIFRoaXMgaXMgSVNPLTIwMjItSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSklTX0hBTEZLQU5BID0gNzsgLy8gVEhpcyBpcyBIYWxmIEthbmEgaW4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0VVQzEgPSAweDQwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfRVVDMiA9IChieXRlKSAweDgwOwotCS8vIEFTQ0lJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9KSU4gPSAweDAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfSk9VVCA9IDB4MDI7Ci0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9FU0MgPSAweDA0OwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfSklTID0gMHgwODsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX1NGVDEgPSAweDEwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfU0ZUMiA9IDB4MjA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBrdHlwZVtdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDAwICovCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMTAgKi8KLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDA4LCAweDA5LCAweDA4LCAweDA4LCAweDA4LCAvKiAhIiMkJSYnICovLyogIiAqLwotCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIC8qICgpKissLS4vICovCi0JMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgLyogMDEyMzQ1NjcgKi8KLQkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAvKiA4OTo7IDw9Pj8gKi8KLQkweDI5LCAweDI4LCAweDJiLCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBAQUJDREVGRyAqLwotCTB4MmEsIDB4MjgsIDB4MmEsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIEhJSktMTU5PICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogUFFSU1RVVlcgKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBYWVpbXF1eXyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIGFiY2RlZmcgKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBoaWprbG1ubyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIHBxcnN0dXZ3ICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgwMCwgLyogeHl6e3x9fiAqLwotCTB4MjAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIC8qIDgwICovCi0JMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgLyogOTAgKi8KLQkweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDIwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogQTAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogQjAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogQzAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogRDAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgLyogRTAgKi8KLQkoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgLyogRjAgKi8KLQkoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGMwLCAoYnl0ZSkgMHhjMCwgMHgwMCx9OwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJU084ODU5XzEgPSAxOyAvLyBJU08tMQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSElGVF9KSVMgPSAyOyAvLyBUaGlzIGlzIFNoaWZ0LUpJUwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSklTX0hBTEZLQU5BID0gNTsgLy8gVGhpcyBpcyBIYWxmIEthbmEgaW4KLQotCS8qKgotCSAqIEN1cnJlbnRseSwgb25seSBKYXBhbmVzZSBlbmNvZGluZ3MgYXJlIHN1cHBvcnRlZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTiA9IC0xOyAvLyBVbmtub3duCi0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29kZQotCSAqICAgICAgICAgICAgaW50Ci0JICogCi0JICogQ29udmVydCBwcml2YXRlIGludCB0byBJQU5BIEVuY29kaW5nIG5hbWUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0lBTkFFbmNvZGluZ05hbWUoaW50IGNvZGUpIHsKLQkJU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKLQotCQlzd2l0Y2ggKGNvZGUpIHsKLQkJCWNhc2UgU0hJRlRfSklTIDoKLQkJCWNhc2UgU0pJU19IQUxGS0FOQSA6Ci0JCQkJZW5jb2RpbmcgPSAiU2hpZnRfSklTIjsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEVVQ19KUCA6Ci0JCQljYXNlIEVVQ19IQUxGS0FOQSA6Ci0JCQkJZW5jb2RpbmcgPSAiRVVDLUpQIjsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIElTTzIwMjJfSlAgOgotCQkJY2FzZSBKSVNfSEFMRktBTkEgOgotCQkJCWVuY29kaW5nID0gIklTTy0yMDIyLUpQIjsvLyROT04tTkxTLTEkCi0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBlbmNvZGluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZ3Vlc3NlZCBKYXZhIEVuY29kaW5nIG5hbWUgdGFyZ2V0OiBieXRlcyB0byBiZSBpbnNwZWN0ZWQgbGVuZ3RoOgotCSAqIGxlbmd0aCBvZiB0YXJnZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWVzc0VuY29kaW5nKGJ5dGVbXSB0YXJnZXQsIGludCBsZW5ndGgpIHsKLQkJaW50IGNvZGUgPSBVTktOT1dOOwotCi0JCS8vIEN1cnJlbnRseSwgb25seSBKYXBhbmVzZSBpcyBzdXBwb3J0ZWQuCi0JCVN0cmluZyBzeXN0ZW1fY3R5cGUgPSBqYXZhLnV0aWwuTG9jYWxlLmdldERlZmF1bHQoKS5nZXRMYW5ndWFnZSgpOwotCQlTdHJpbmcganBfY3R5cGUgPSBqYXZhLnV0aWwuTG9jYWxlLkpBUEFORVNFLmdldExhbmd1YWdlKCk7Ci0JCWlmIChzeXN0ZW1fY3R5cGUuY29tcGFyZVRvKGpwX2N0eXBlKSA9PSAwKSB7Ci0JCQkvLyBPaywgSSdtIHVuZGVyIGphX0pQLgotCQkJY29kZSA9IEFTQ0lJOwotCQkJaW50IHBvcyA9IDA7Ci0JCQl3aGlsZSAoKGNvZGUgPT0gQVNDSUkpICYmIChsZW5ndGggPiAwKSkgewotCQkJCWludCBjaDEgPSB0YXJnZXRbcG9zXTsKLQkJCQljaDEgPSBjaDEgJiAweDAwMDAwMEZGOwotCQkJCWludCBjaDIgPSAobGVuZ3RoID49IDIpID8gdGFyZ2V0W3BvcyArIDFdIDogMDsKLQkJCQljaDIgPSBjaDIgJiAweDAwMDAwMEZGOwotCQkJCWludCBjaDMgPSAobGVuZ3RoID49IDMpID8gdGFyZ2V0W3BvcyArIDJdIDogMDsKLQkJCQljaDMgPSBjaDMgJiAweDAwMDAwMEZGOwotCQkJCWNvZGUgPSBndWVzc0phcGFuZXNlS2FuamlDb2RlKGNoMSwgY2gyLCBjaDMsIDApOwotCQkJCXBvcysrOwotCQkJCWxlbmd0aC0tOwotCQkJfQotCQkJc3dpdGNoIChjb2RlKSB7Ci0JCQkJY2FzZSBJU08yMDIyX0pQIDoKLQkJCQljYXNlIEpJU19IQUxGS0FOQSA6Ci0JCQkJCWNvZGUgPSBJU08yMDIyX0pQOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEVVQ19KUCA6Ci0JCQkJCWNvZGUgPSBFVUNfSlA7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQljb2RlID0gU0hJRlRfSklTOwotCQkJfQotCQl9Ci0JCXJldHVybiAoY29udmVydFRvSUFOQUVuY29kaW5nTmFtZShjb2RlKSk7Ci0JfQotCi0JLyoqCi0JICogR3Vlc3MgdGhlIGVuY29kaW5nLiBoYWxma2FuYV9mbGFnID0gMHgwMSAoIGRldGVjdCBTSklTIGhhbGYga2FuYSApCi0JICogaGFsZmthbmFfZmxhZyA9IDB4MDIgKCBkZXRlY3QgRVVDIGhhbGYga2FuYSApCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGd1ZXNzSmFwYW5lc2VLYW5qaUNvZGUoaW50IGNoMSwgaW50IGNoMiwgaW50IGNoMywgaW50IGhhbGZrYW5hX2ZsYWcpIHsKLQkJYm9vbGVhbiBzamlzX2hhbmtha3VfZmxhZyA9ICgoaGFsZmthbmFfZmxhZyAmIDB4MDEpICE9IDApID8gdHJ1ZSA6IGZhbHNlOwotCQlib29sZWFuIGV1Y19oYW5rYWt1X2ZsYWcgPSAoKGhhbGZrYW5hX2ZsYWcgJiAweDAyKSAhPSAwKSA/IHRydWUgOiBmYWxzZTsKLQotCQlpZiAoY2gxID09IDApCi0JCQlyZXR1cm4gVU5LTk9XTjsKLQkJaWYgKHNqaXNfaGFua2FrdV9mbGFnICYmIGNoMSA+PSAweGExICYmIGNoMSA8PSAweGRmKQotCQkJcmV0dXJuIFNKSVNfSEFMRktBTkE7Ci0JCWVsc2UgaWYgKGV1Y19oYW5rYWt1X2ZsYWcgJiYgY2gxID09IDB4OGUgJiYgY2gyID49IDB4YTEgJiYgY2gyIDw9IDB4ZGYpCi0JCQlyZXR1cm4gRVVDX0hBTEZLQU5BOwotCQllbHNlIGlmICgoKGt0eXBlW2NoMV0gJiBLVF9TRlQxKSAhPSAwKSAmJiAoKGt0eXBlW2NoMl0gJiBLVF9TRlQyKSAhPSAwKSkKLQkJCXJldHVybiBTSElGVF9KSVM7Ci0JCWVsc2UgaWYgKCgoa3R5cGVbY2gxXSAmIEtUX0VVQzEpICE9IDApICYmICgoa3R5cGVbY2gyXSAmIEtUX0VVQzIpICE9IDApKQotCQkJcmV0dXJuIEVVQ19KUDsKLQkJZWxzZSBpZiAoY2gxID09IDB4MWIgJiYgKChrdHlwZVtjaDJdICYgS1RfSklOKSAhPSAwKSkKLQkJCXJldHVybiBJU08yMDIyX0pQOwotCQllbHNlIGlmIChjaDEgPj0gMHhhMSAmJiBjaDEgPD0gMHhkZikKLQkJCXJldHVybiBTSklTX0hBTEZLQU5BOwotCQllbHNlIGlmIChjaDEgPT0gMHgxYiAmJiBjaDIgPT0gMHgyOC8qICcoJyAqLyYmIGNoMyA9PSAweDQ5LyogJ0knICovKQotCQkJcmV0dXJuIEpJU19IQUxGS0FOQTsKLQkJZWxzZSBpZiAoY2gxID09IDB4MWIgJiYgY2gyID09IDB4MjgvKiAnKCcgKi8mJiAoKGt0eXBlW2NoM10gJiBLVF9KT1VUKSAhPSAwKSkKLQkJCXJldHVybiBBU0NJSV9JTjsKLQotCQlyZXR1cm4gQVNDSUk7Ci0JfQotCi0JcHVibGljIEVuY29kaW5nR3Vlc3NlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFkYzAxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotcHVibGljIGNsYXNzIEhlYWRQYXJzZXJUb2tlbiB7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCi0JcHJpdmF0ZSBTdHJpbmcgZlRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZlR5cGU7Ci0KLQlwcm90ZWN0ZWQgSGVhZFBhcnNlclRva2VuKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBIZWFkUGFyc2VyVG9rZW4oU3RyaW5nIHR5cGUsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcygpOwotCQlmVHlwZSA9IHR5cGU7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dCA9IHRleHQ7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBmVGV4dDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gKCJ0ZXh0OiAiICsgZlRleHQgKyAiIG9mZnNldDogIiArIGZTdGFydCArICIgdHlwZTogIiArIGZUeXBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyODMwYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLS8qCi0gKiAKLSAqIEEgbm9uLXJlc2l6YWJsZSBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIGJlaGF2aW9yIG9mIGphdmEudXRpbC5TdGFjaywgYnV0Ci0gKiBkaXJlY3RseSBmb3IgdGhlIDxjb2RlPiBpbnRlZ2VyIDwvY29kZT4gcHJpbWl0aXZlLgotICovCi1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbnRTdGFjayB7Ci0JcHJpdmF0ZSBpbnRbXSBsaXN0ID0gbnVsbDsKLQotCXByaXZhdGUgaW50IHNpemUgPSAwOwotCi0JcHVibGljIEludFN0YWNrKCkgewotCQl0aGlzKDEwMCk7Ci0JfQotCi0JcHVibGljIEludFN0YWNrKGludCBtYXhkZXB0aCkgewotCQlzdXBlcigpOwotCQlsaXN0ID0gbmV3IGludFttYXhkZXB0aF07Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVtcHR5KCkgewotCQlyZXR1cm4gc2l6ZSA9PSAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0KGludCBzbG90KSB7Ci0JCXJldHVybiBsaXN0W3Nsb3RdOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspCi0JCQlsaXN0W2ldID0gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBlZWsoKSB7Ci0JCWlmIChzaXplID09IDApCi0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQlyZXR1cm4gbGlzdFtzaXplIC0gMV07Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwb3AoKSB7Ci0JCWludCB2YWx1ZSA9IHBlZWsoKTsKLQkJbGlzdFtzaXplIC0gMV0gPSAtMTsKLQkJc2l6ZS0tOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUHVzaGVzIGFuIGl0ZW0gb250byB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlIC0KLQkgKiAgICAgICAgICAgIHRoZSBpbnQgdG8gYmUgcHVzaGVkIG9udG8gdGhpcyBzdGFjay4KLQkgKiBAcmV0dXJuIHRoZSA8Y29kZT5uZXdWYWx1ZTwvY29kZT4gYXJndW1lbnQuCi0JICovCi0JcHVibGljIGludCBwdXNoKGludCBuZXdWYWx1ZSkgewotCQlpZiAoc2l6ZSA9PSBsaXN0Lmxlbmd0aCkgewotCQkJdGhyb3cgbmV3IFN0YWNrT3ZlcmZsb3dFcnJvcigpOwotCQl9Ci0JCWxpc3Rbc2l6ZSsrXSA9IG5ld1ZhbHVlOwotCQlyZXR1cm4gbmV3VmFsdWU7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjoiICtzaXplICsgIiBbIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlzLmFwcGVuZChsaXN0W2ldKTsKLQkJCWlmKGkgPCBzaXplIC0gMSkgewotCQkJCXMuYXBwZW5kKCIsICIpOwotCQkJfQotCQl9Ci0JCXMuYXBwZW5kKCJdIik7Ci0JCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9BYnN0cmFjdENTU05vZGVMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0Fic3RyYWN0Q1NTTm9kZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3OTkxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0Fic3RyYWN0Q1NTTm9kZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0KLS8qKgotICogCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q1NTTm9kZUxpc3QgewotCi0JcHJvdGVjdGVkIFZlY3RvciBub2RlcyA9IG51bGw7Ci0KLQlJQ1NTTm9kZSBhcHBlbmROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5ub2RlcyA9PSBudWxsKQotCQkJdGhpcy5ub2RlcyA9IG5ldyBWZWN0b3IoKTsKLQkJdGhpcy5ub2Rlcy5hZGRFbGVtZW50KG5vZGUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpZiAodGhpcy5ub2RlcyA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiB0aGlzLm5vZGVzLnNpemUoKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBJQ1NTTm9kZSBpdGVtSW1wbChpbnQgaW5kZXgpIHsKLQkJaWYgKHRoaXMubm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMubm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSUNTU05vZGUpIHRoaXMubm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQotCUlDU1NOb2RlIHJlbW92ZU5vZGUoaW50IGluZGV4KSB7Ci0JCWlmICh0aGlzLm5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm8gbm9kZQotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMubm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7IC8vIGludmFsaWQgcGFyYW1ldGVyCi0KLQkJSUNTU05vZGUgcmVtb3ZlZCA9IChJQ1NTTm9kZSkgdGhpcy5ub2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCQl0aGlzLm5vZGVzLnJlbW92ZUVsZW1lbnRBdChpbmRleCk7Ci0JCXJldHVybiByZW1vdmVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTQXR0ckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTQXR0ckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwNGE0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0F0dHJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTQXR0ckltcGwgZXh0ZW5kcyBDU1NSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBJQ1NTQXR0ciB7Ci0KLQlwcml2YXRlIFN0cmluZyBmTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZlZhbHVlID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIG93bmVyQ1NTTm9kZSA9IG51bGw7Ci0KLQlDU1NBdHRySW1wbChDU1NBdHRySW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCQl0aGlzLmZOYW1lID0gdGhhdC5mTmFtZTsKLQkJdGhpcy5zZXRWYWx1ZSh0aGF0LmZWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ1NTQXR0ciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU0F0dHJJbXBsKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZk5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCXJldHVybiBuZXcgQ1NTQXR0ckltcGwodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTmFtZWROb2RlTWFwCi0JICovCi0JcHVibGljIElDU1NOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZOYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBBVFRSX05PREU7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGdldE93bmVyQ1NTTm9kZSgpIHsKLQkJcmV0dXJuIG93bmVyQ1NTTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIGZWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIC8qICh0aGlzLm5hbWUgPT0gbnVsbCkgKi9mYWxzZTsKLQkJaWYgKHRoaXMuZk5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRoaXMuZk5hbWUuZXF1YWxzKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVZhbHVlQ2hhbmdlZChTdHJpbmcgb2xkVmFsdWUpIHsKLQkJaWYgKHRoaXMub3duZXJDU1NOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZm9yIG1vZGVsCi0JCUlDU1NEb2N1bWVudCBkb2MgPSBvd25lckNTU05vZGUuZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDU1NNb2RlbEltcGwgbW9kZWwgPSAoQ1NTTW9kZWxJbXBsKSBkb2MuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLnZhbHVlQ2hhbmdlZCh0aGlzLCBvbGRWYWx1ZSk7Ci0KLQkJLy8gZm9yIGFkYXB0ZXJzCi0JCVN0cmluZyB2YWx1ZSA9IGdldFZhbHVlKCk7Ci0JCXRoaXMub3duZXJDU1NOb2RlLm5vdGlmeShDSEFOR0UsIHRoaXMsIG9sZFZhbHVlLCB2YWx1ZSwgdGhpcy5vd25lckNTU05vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3TmFtZSkgewotCQlmTmFtZSA9IG5ld05hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJDU1NOb2RlKENTU05vZGVJbXBsIG5ld093bmVyQ1NTTm9kZSkgewotCQlvd25lckNTU05vZGUgPSBuZXdPd25lckNTU05vZGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoamF2YS5sYW5nLlN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSBmVmFsdWU7Ci0JCWZWYWx1ZSA9IG5ld1ZhbHVlOwotCi0JCW5vdGlmeVZhbHVlQ2hhbmdlZChvbGRWYWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NDaGFyc2V0UnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTQ2hhcnNldFJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NmMzMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NDaGFyc2V0UnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NDaGFyc2V0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NDaGFyc2V0UnVsZUltcGwgZXh0ZW5kcyBDU1NSdWxlSW1wbCBpbXBsZW1lbnRzIElDU1NDaGFyc2V0UnVsZSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NDaGFyc2V0UnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ1NTQ2hhcnNldFJ1bGVJbXBsKENTU0NoYXJzZXRSdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU0NoYXJzZXRSdWxlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTQ2hhcnNldFJ1bGVJbXBsKHRoaXMpOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIGVuY29kaW5nIGluZm9ybWF0aW9uIHVzZWQgaW4gdGhpcyA8Y29kZT5AY2hhcnNldDwvY29kZT4gcnVsZS4KLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIHZhbHVlIGhhcyBhCi0JICogICAgICAgICAgICAgICAgc3ludGF4IGVycm9yIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBlbmNvZGluZwotCSAqICAgICAgICAgICAgICAgIHJ1bGUgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJcmV0dXJuIENTU1V0aWwuZXh0cmFjdFN0cmluZ0NvbnRlbnRzKGdldEF0dHJpYnV0ZShFTkNPRElORykpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDSEFSU0VUUlVMRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIENIQVJTRVRfUlVMRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlTdHJpbmcgcXVvdGUgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCVN0cmluZyBlbmMgPSBDU1NVdGlsLmV4dHJhY3RTdHJpbmdDb250ZW50cyhlbmNvZGluZyk7Ci0JCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShlbmMsIHF1b3RlKTsKLQkJc2V0QXR0cmlidXRlKEVOQ09ESU5HLCBxdW90ZSArIGVuYyArIHF1b3RlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0RlY2xhcmF0aW9uSXRlbVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NEZWNsYXJhdGlvbkl0ZW1QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0NTA0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0RlY2xhcmF0aW9uSXRlbVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ291bnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlRleHRSZWdpb25MaXN0SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlmaW5hbCBjbGFzcyBGbG9hdEluZm8gewotCQkvKioKLQkJICogCi0JCSAqLwotCQlGbG9hdEluZm8oU3RyaW5nIHRleHQpIHsKLQkJCXBhcnNlKHRleHQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJdm9pZCBwYXJzZShTdHJpbmcgdGV4dCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZlZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZklkZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYm9vbGVhbiBiTnVtID0gdHJ1ZTsKLQkJCWludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KGkpOwotCQkJCWlmIChiTnVtKSB7Ci0JCQkJCS8vIE9ubHkgYWRkICsvLSBpZiBpdCdzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHZhbHVlIGJ1ZmZlcgotCQkJCQlpZiAoJzAnIDw9IGMgJiYgYyA8PSAnOScgfHwgYyA9PSAnLicgfHwgKChjID09ICcrJyB8fCBjID09ICctJykgJiYgaSA9PSAwKSkgewotCQkJCQkJYnVmVmFsdWUuYXBwZW5kKGMpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYnVmSWRlbnQuYXBwZW5kKGMpOwotCQkJCQkJYk51bSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlidWZJZGVudC5hcHBlbmQoYyk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIHZhbHVlU3RyID0gYnVmVmFsdWUudG9TdHJpbmcoKTsKLQkJCXRyeSB7Ci0JCQkJZlZhbHVlID0gRmxvYXQudmFsdWVPZih2YWx1ZVN0cikuZmxvYXRWYWx1ZSgpOwotCQkJfQotCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJYnVmSWRlbnQuaW5zZXJ0KDAsIHZhbHVlU3RyKTsKLQkJCX0KLQkJCWZJZGVudGlmaWVyID0gYnVmSWRlbnQudG9TdHJpbmcoKTsKLQkJCWZUeXBlID0gZ2V0RmxvYXRWYWx1ZVR5cGUodmFsdWVTdHIsIGZJZGVudGlmaWVyKTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCWZsb2F0IGdldFZhbHVlKCkgewotCQkJcmV0dXJuIGZWYWx1ZTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCVN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotCQkJcmV0dXJuIGZJZGVudGlmaWVyOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJc2hvcnQgZ2V0VmFsdWVUeXBlKCkgewotCQkJcmV0dXJuIGZUeXBlOwotCQl9Ci0KLQkJcHJpdmF0ZSBmbG9hdCBmVmFsdWUgPSAwLjBmOwotCQlwcml2YXRlIFN0cmluZyBmSWRlbnRpZmllciA9IG51bGw7Ci0JCXByaXZhdGUgc2hvcnQgZlR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVU5LTk9XTjsKLQl9Ci0KLQlmaW5hbCBzdGF0aWMgaW50IFNfTk9STUFMID0gMDsKLQlmaW5hbCBzdGF0aWMgaW50IFNfRlVOQ1RJT04gPSAxOwotCWZpbmFsIHN0YXRpYyBpbnQgU19GT05UX1NMQVNIID0gMjsKLQlmaW5hbCBzdGF0aWMgaW50IFNfQ09NTUFfU0VQQVJBVElPTiA9IDM7Ci0JcHJpdmF0ZSBJQ1NTRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZlBhcmVudFJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZUZW1wU3RydWN0dXJlZERvY3VtZW50ID0gZmFsc2U7Ci0JcHJpdmF0ZSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQgZlVwZGF0ZUNvbnRleHQgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyKElDU1NEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIoKTsKLQkJZkRvY3VtZW50ID0gZG9jOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZUF0dHJWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygiYXR0ciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBhY2NlcHRzW10gPSB7Q1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UfTsKLQkJSVRleHRSZWdpb25MaXN0IHZhbHVlUmVnaW9ucyA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhyZWdpb25zLCBhY2NlcHRzKTsKLQkJaWYgKHZhbHVlUmVnaW9ucy5zaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUgPSBnZXRDU1NQcmltaXRpdmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQVRUUik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHZhbHVlUmVnaW9ucy5nZXQoMCk7Ci0JCXZhbHVlLnNldFZhbHVlKGdldFRleHQocmVnaW9uKSk7Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZUNvdW50ZXJzVmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIGZ1bmNOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKHJlZ2lvbnMpOwotCQlpZiAoZnVuY05hbWUgPT0gbnVsbCB8fCAhZnVuY05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoImNvdW50ZXJzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgYWNjZXB0c1tdID0ge0NTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklOR307Ci0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCWludCBzaXplID0gdmFsdWVSZWdpb25zLnNpemUoKTsKLQkJaWYgKHNpemUgIT0gMiAmJiBzaXplICE9IDMpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ291bnRlckltcGwgdmFsdWUgPSBnZXRDb3VudGVyKCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSB2YWx1ZVJlZ2lvbnMuZ2V0KGkpOwotCQkJU3RyaW5nIHRleHQgPSBnZXRUZXh0KHJlZ2lvbik7Ci0JCQlDU1NBdHRySW1wbCBhdHRyID0gbnVsbDsKLQkJCXN3aXRjaCAoaSkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCXZhbHVlLnNldElkZW50aWZpZXIodGV4dCk7Ci0JCQkJCWF0dHIgPSB2YWx1ZS5nZXRBdHRyaWJ1dGVOb2RlKElDb3VudGVyLklERU5USUZJRVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDEgOgotCQkJCQl2YWx1ZS5zZXRTZXBhcmF0b3IodGV4dCk7Ci0JCQkJCWF0dHIgPSB2YWx1ZS5nZXRBdHRyaWJ1dGVOb2RlKElDb3VudGVyLlNFUEFSQVRPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMiA6Ci0JCQkJCXZhbHVlLnNldExpc3RTdHlsZSh0ZXh0KTsKLQkJCQkJYXR0ciA9IHZhbHVlLmdldEF0dHJpYnV0ZU5vZGUoSUNvdW50ZXIuTElTVFNUWUxFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24oZlBhcmVudFJlZ2lvbiwgcmVnaW9uLCByZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZUNvdW50ZXJWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygiY291bnRlciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIGFjY2VwdHNbXSA9IHtDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlR9OwotCQlJVGV4dFJlZ2lvbkxpc3QgdmFsdWVSZWdpb25zID0gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKHJlZ2lvbnMsIGFjY2VwdHMpOwotCQlpbnQgc2l6ZSA9IHZhbHVlUmVnaW9ucy5zaXplKCk7Ci0JCWlmIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNvdW50ZXJJbXBsIHZhbHVlID0gZ2V0Q291bnRlcigpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gdmFsdWVSZWdpb25zLmdldChpKTsKLQkJCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChyZWdpb24pOwotCQkJQ1NTQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCQlzd2l0Y2ggKGkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQl2YWx1ZS5zZXRJZGVudGlmaWVyKHRleHQpOwotCQkJCQlhdHRyID0gdmFsdWUuZ2V0QXR0cmlidXRlTm9kZShJQ291bnRlci5JREVOVElGSUVSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJdmFsdWUuc2V0TGlzdFN0eWxlKHRleHQpOwotCQkJCQlhdHRyID0gdmFsdWUuZ2V0QXR0cmlidXRlTm9kZShJQ291bnRlci5MSVNUU1RZTEUpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJYXR0ci5zZXRSYW5nZVJlZ2lvbihmUGFyZW50UmVnaW9uLCByZWdpb24sIHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NTdHlsZURlY2xJdGVtSW1wbCBjcmVhdGVEZWNsYXJhdGlvbkl0ZW0oSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zKSB7Ci0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGl0ZW0gPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9IGdldFByb3BlcnR5TmFtZShub2RlUmVnaW9ucyk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCWl0ZW0gPSBnZXRDU1NTdHlsZURlY2xJdGVtKG5hbWUpOwotCQl9Ci0JCXJldHVybiBpdGVtOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZUZsb2F0VmFsdWUoU3RyaW5nIHRleHQsIFN0cmluZyB0eXBlKSB7Ci0JCUZsb2F0SW5mbyBpbmZvID0gbmV3IEZsb2F0SW5mbyh0ZXh0KTsKLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gZ2V0Q1NTUHJpbWl0aXZlVmFsdWUoaW5mby5nZXRWYWx1ZVR5cGUoKSk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQl2YWx1ZS5zZXRWYWx1ZShpbmZvLmdldFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVGb3JtYXRWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygiZm9ybWF0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGFjY2VwdHNbXSA9IHtDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HfTsKLQkJSVRleHRSZWdpb25MaXN0IHZhbHVlUmVnaW9ucyA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhyZWdpb25zLCBhY2NlcHRzKTsKLQkJLy8gZm9ybWF0IGNhbiB0YWtlIHZhcmlhYmxlIGFyZ3MuCi0JCWlmICh2YWx1ZVJlZ2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gZ2V0Q1NTUHJpbWl0aXZlVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19GT1JNQVQpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSB2YWx1ZVJlZ2lvbnMuZ2V0KDApOwotCQl2YWx1ZS5zZXRWYWx1ZShDU1NVdGlsLmV4dHJhY3RTdHJpbmdDb250ZW50cyhnZXRUZXh0KHJlZ2lvbikpKTsKLQotCQlyZXR1cm4gdmFsdWU7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVMb2NhbFZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCVN0cmluZyBmdW5jTmFtZSA9IGdldEZ1bmN0aW9uTmFtZShyZWdpb25zKTsKLQkJaWYgKGZ1bmNOYW1lID09IG51bGwgfHwgIWZ1bmNOYW1lLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJsb2NhbCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBhY2NlcHRzW10gPSB7Q1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklOR307Ci0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCWlmICh2YWx1ZVJlZ2lvbnMuc2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gZ2V0Q1NTUHJpbWl0aXZlVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19MT0NBTCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHZhbHVlUmVnaW9ucy5nZXQoMCk7Ci0JCXZhbHVlLnNldFZhbHVlKENTU1V0aWwuZXh0cmFjdFN0cmluZ0NvbnRlbnRzKGdldFRleHQocmVnaW9uKSkpOwotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVQcmltaXRpdmVWYWx1ZShJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUgPSBudWxsOwotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChyZWdpb24pOwotCQlpZiAoaXNCbGFuayh0eXBlKSkgewotCQkJdmFsdWUgPSBudWxsOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04gfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkgewotCQkJdmFsdWUgPSBjcmVhdGVGbG9hdFZhbHVlKHRleHQsIHR5cGUpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJdmFsdWUgPSBjcmVhdGVTdHJpbmdWYWx1ZSh0ZXh0LCB0eXBlKTsKLQkJfQotCi0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl2YWx1ZSA9IGNyZWF0ZVN0cmluZ1ZhbHVlKHRleHQsIHR5cGUpOwotCQl9Ci0KLQkJaWYgKCFmVGVtcFN0cnVjdHVyZWREb2N1bWVudCAmJiB2YWx1ZSAhPSBudWxsKSB7Ci0JCQl2YWx1ZS5zZXRSYW5nZVJlZ2lvbihmUGFyZW50UmVnaW9uLCByZWdpb24sIHJlZ2lvbik7Ci0JCX0KLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlUHJpbWl0aXZlVmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gbnVsbDsKLQkJQ1NTVXRpbC5zdHJpcFN1cnJvdW5kaW5nU3BhY2UocmVnaW9ucyk7Ci0JCWlmIChyZWdpb25zLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChyZWdpb24pLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAodGV4dC5lcXVhbHMoInJnYigiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmFsdWUgPSBjcmVhdGVSZ2JWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuZXF1YWxzKCJjb3VudGVyKCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl2YWx1ZSA9IGNyZWF0ZUNvdW50ZXJWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuZXF1YWxzKCJjb3VudGVycygiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmFsdWUgPSBjcmVhdGVDb3VudGVyc1ZhbHVlKHJlZ2lvbnMpOwotCQkJfQotCQkJZWxzZSBpZiAodGV4dC5lcXVhbHMoImF0dHIoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlQXR0clZhbHVlKHJlZ2lvbnMpOwotCQkJfQotCQkJZWxzZSBpZiAodGV4dC5lcXVhbHMoImZvcm1hdCgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmFsdWUgPSBjcmVhdGVGb3JtYXRWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuZXF1YWxzKCJsb2NhbCgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmFsdWUgPSBjcmVhdGVMb2NhbFZhbHVlKHJlZ2lvbnMpOwotCQkJfQotCQkJZWxzZSBpZiAodGV4dC5lcXVhbHMoInJlY3QoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlUmVjdFZhbHVlKHJlZ2lvbnMpOwotCQkJfQotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQl2YWx1ZSA9IGNyZWF0ZVN0cmluZ1ZhbHVlKHJlZ2lvbnMpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdmFsdWUgPSBjcmVhdGVTdHJpbmdWYWx1ZShyZWdpb25zKTsKLQkJfQotCi0JCWlmICghZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgdmFsdWUgIT0gbnVsbCkgewotCQkJdmFsdWUuc2V0UmFuZ2VSZWdpb24oZlBhcmVudFJlZ2lvbiwgcmVnaW9ucy5nZXQoMCksIHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSkpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZVJlY3RWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygicmVjdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBhY2NlcHRzW10gPSB7Q1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTiwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UfTsgLy8gSURFTlQ6Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZvcgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnYXV0bycKLQkJSVRleHRSZWdpb25MaXN0IHZhbHVlUmVnaW9ucyA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhyZWdpb25zLCBhY2NlcHRzKTsKLQkJaWYgKHZhbHVlUmVnaW9ucy5zaXplKCkgIT0gNCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlSZWN0SW1wbCB2YWx1ZSA9IGdldFJlY3QoKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHZhbHVlUmVnaW9ucy5nZXQoaSk7Ci0JCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgY2hpbGRWYWx1ZSA9IG51bGw7Ci0JCQlzd2l0Y2ggKGkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0VG9wKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMSA6Ci0JCQkJCWNoaWxkVmFsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB2YWx1ZS5nZXRSaWdodCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDIgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0Qm90dG9tKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMyA6Ci0JCQkJCWNoaWxkVmFsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB2YWx1ZS5nZXRMZWZ0KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjaGlsZFZhbHVlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChyZWdpb24pOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJc2V0U3RyaW5nVmFsdWUoY2hpbGRWYWx1ZSwgdGV4dCwgdHlwZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRGbG9hdFZhbHVlKGNoaWxkVmFsdWUsIHRleHQsIHR5cGUpOwotCQkJfQotCQkJaWYgKCFmVGVtcFN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCWNoaWxkVmFsdWUuc2V0UmFuZ2VSZWdpb24oZlBhcmVudFJlZ2lvbiwgcmVnaW9uLCByZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZVJnYlZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCVN0cmluZyBmdW5jTmFtZSA9IGdldEZ1bmN0aW9uTmFtZShyZWdpb25zKTsKLQkJaWYgKGZ1bmNOYW1lID09IG51bGwgfHwgIWZ1bmNOYW1lLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJyZ2IiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgYWNjZXB0c1tdID0ge0NTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIsIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFfTsKLQkJSVRleHRSZWdpb25MaXN0IHZhbHVlUmVnaW9ucyA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhyZWdpb25zLCBhY2NlcHRzKTsKLQkJaWYgKHZhbHVlUmVnaW9ucy5zaXplKCkgIT0gMykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlSR0JDb2xvckltcGwgdmFsdWUgPSBnZXRSR0JDb2xvcigpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gdmFsdWVSZWdpb25zLmdldChpKTsKLQkJCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjaGlsZFZhbHVlID0gbnVsbDsKLQkJCXN3aXRjaCAoaSkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCWNoaWxkVmFsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB2YWx1ZS5nZXRSZWQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJY2hpbGRWYWx1ZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHZhbHVlLmdldEdyZWVuKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMiA6Ci0JCQkJCWNoaWxkVmFsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB2YWx1ZS5nZXRCbHVlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjaGlsZFZhbHVlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXNldEZsb2F0VmFsdWUoY2hpbGRWYWx1ZSwgZ2V0VGV4dChyZWdpb24pLCByZWdpb24uZ2V0VHlwZSgpKTsKLQkJCWlmICghZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQljaGlsZFZhbHVlLnNldFJhbmdlUmVnaW9uKGZQYXJlbnRSZWdpb24sIHJlZ2lvbiwgcmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVTdHJpbmdWYWx1ZShTdHJpbmcgdGV4dCwgU3RyaW5nIHR5cGUpIHsKLQkJc2hvcnQgdmFsdWVUeXBlID0gZ2V0U3RyaW5nVmFsdWVUeXBlKHRleHQsIHR5cGUpOwotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUgPSBnZXRDU1NQcmltaXRpdmVWYWx1ZSh2YWx1ZVR5cGUpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKHZhbHVlVHlwZSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJJKSB7Ci0JCQkJdGV4dCA9IENTU1V0aWwuZXh0cmFjdFVyaUNvbnRlbnRzKHRleHQpOwotCQkJfQotCQkJZWxzZSBpZiAodmFsdWVUeXBlID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19TVFJJTkcpIHsKLQkJCQl0ZXh0ID0gQ1NTVXRpbC5leHRyYWN0U3RyaW5nQ29udGVudHModGV4dCk7Ci0JCQl9Ci0JCQl2YWx1ZS5zZXRWYWx1ZSh0ZXh0KTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlU3RyaW5nVmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIHR5cGUgPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQ7Ci0JCWlmIChyZWdpb25zLnNpemUoKSA9PSAxKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJCXR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQl9Ci0JCXJldHVybiBjcmVhdGVTdHJpbmdWYWx1ZShtYWtlU3RyaW5nKHJlZ2lvbnMpLCB0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENvdW50ZXJJbXBsIGdldENvdW50ZXIoKSB7Ci0JCUNvdW50ZXJJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dCAhPSBudWxsICYmIGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDb3VudGVyKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENvdW50ZXJJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPVU5URVIpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGdldENTU1ByaW1pdGl2ZVZhbHVlKHNob3J0IHR5cGUpIHsKLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dCAhPSBudWxsICYmIGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NQcmltaXRpdmVWYWx1ZSh0eXBlKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUodHlwZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NTdHlsZURlY2xJdGVtSW1wbCBnZXRDU1NTdHlsZURlY2xJdGVtKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJQ1NTU3R5bGVEZWNsSXRlbUltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0ICE9IG51bGwgJiYgZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENTU1N0eWxlRGVjbEl0ZW0ocHJvcGVydHlOYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NTdHlsZURlY2xJdGVtKHByb3BlcnR5TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHNob3J0IGdldEZsb2F0VmFsdWVUeXBlKFN0cmluZyBpZGVudCkgewotCQlpZGVudCA9IGlkZW50LnRvTG93ZXJDYXNlKCk7Ci0JCXNob3J0IHZhbHVlVHlwZTsKLQkJaWYgKGlkZW50Lmxlbmd0aCgpID09IDApIHsKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19OVU1CRVI7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BFUkNFTlRBR0U7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImV4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VYUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJweCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QWDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJjbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DTTsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJtbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NTTsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJpbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTjsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJwdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QVDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJwYyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QQzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJkZWciKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfREVHOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoInJhZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SQUQ7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZ3JhZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19HUkFEOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoIm1zIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01TOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoInMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJoeiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19IWjsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJraHoiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfS0haOwotCQl9Ci0JCWVsc2UgewotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RJTUVOU0lPTjsKLQkJfQotCQlyZXR1cm4gdmFsdWVUeXBlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBzaG9ydCBnZXRGbG9hdFZhbHVlVHlwZShTdHJpbmcgdmFsdWUsIFN0cmluZyBpZGVudCkgewotCQlpZGVudCA9IGlkZW50LnRvTG93ZXJDYXNlKCk7Ci0JCXNob3J0IHZhbHVlVHlwZTsKLQkJaWYgKGlkZW50Lmxlbmd0aCgpID09IDApIHsKLQkJCWlmICgwIDw9IHZhbHVlLmluZGV4T2YoJy4nKSkgewotCQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19OVU1CRVI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2YWx1ZVR5cGUgPSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOVEVHRVI7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BFUkNFTlRBR0U7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImV4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VYUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJweCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QWDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJjbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DTTsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJtbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NTTsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJpbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTjsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJwdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QVDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJwYyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QQzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJkZWciKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfREVHOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoInJhZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SQUQ7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZ3JhZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19HUkFEOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoIm1zIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01TOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoInMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJoeiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19IWjsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJraHoiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfS0haOwotCQl9Ci0JCWVsc2UgewotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RJTUVOU0lPTjsKLQkJfQotCQlyZXR1cm4gdmFsdWVUeXBlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEZ1bmN0aW9uTmFtZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpIDwgMikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVRleHRSZWdpb24gZmlyc3RSZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJaWYgKGZpcnN0UmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgdGV4dCA9IGdldFRleHQoZmlyc3RSZWdpb24pOwotCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGgoKSAtIDEpOwotCX0KLQotCS8qKgotCSAqIHRoaXMgbWV0aG9kIGhhcyBubyB2YWxpZGF0aW9uIGNoZWNrLCB0aGVuIHJlZ2lvbnMgbXVzdCBiZSBwYXNzZWQKLQkgKiBnZXRGdW5jdGlvbk5hbWUoKS4uLgotCSAqLwotCXByaXZhdGUgSVRleHRSZWdpb25MaXN0IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucywgU3RyaW5nW10gYWNjZXB0cykgewotCQlJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQkJaW50IG5BY2NlcHRzID0gKGFjY2VwdHMgIT0gbnVsbCkgPyBhY2NlcHRzLmxlbmd0aCA6IDA7Ci0JCUl0ZXJhdG9yIGkgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCWkubmV4dCgpOyAvLyBza2lwIEZVTkNUSU9OCi0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBpLm5leHQoKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKGlzQmxhbmsodHlwZSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChuQWNjZXB0cyA9PSAwKSB7Ci0JCQkJbmV3UmVnaW9ucy5hZGQocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGlBY2NlcHQgPSAwOyBpQWNjZXB0IDwgbkFjY2VwdHM7IGlBY2NlcHQrKykgewotCQkJCQlpZiAodHlwZSA9PSBhY2NlcHRzW2lBY2NlcHRdKSB7Ci0JCQkJCQluZXdSZWdpb25zLmFkZChyZWdpb24pOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbnM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JLy8gcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkvLyBWZWN0b3Igbm9kZVJlZ2lvbnMgPSBuZXcgVmVjdG9yKGZsYXROb2RlLmdldFJlZ2lvbnMoKSk7Ci0JLy8gcmV0dXJuIGdldFByb3BlcnR5TmFtZShub2RlUmVnaW9ucyk7Ci0JLy8gfQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFByb3BlcnR5TmFtZShJVGV4dFJlZ2lvbkxpc3Qgbm9kZVJlZ2lvbnMpIHsKLQkJSVRleHRSZWdpb25MaXN0IG5hbWVSZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCXdoaWxlICghbm9kZVJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBub2RlUmVnaW9ucy5yZW1vdmUoMCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IpIHsKLQkJCQlDU1NVdGlsLnN0cmlwU3Vycm91bmRpbmdTcGFjZShuYW1lUmVnaW9ucyk7Ci0JCQkJbmFtZSA9IG1ha2VTdHJpbmcobmFtZVJlZ2lvbnMpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmFtZVJlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBSZWN0SW1wbCBnZXRSZWN0KCkgewotCQlSZWN0SW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQgIT0gbnVsbCAmJiBmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0UmVjdCgpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChSZWN0SW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SRUNUKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFJHQkNvbG9ySW1wbCBnZXRSR0JDb2xvcigpIHsKLQkJUkdCQ29sb3JJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dCAhPSBudWxsICYmIGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRSR0JDb2xvcigpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChSR0JDb2xvckltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkdCQ09MT1IpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc2hvcnQgZ2V0U3RyaW5nVmFsdWVUeXBlKFN0cmluZyB0ZXh0LCBTdHJpbmcgdHlwZSkgewotCQlzaG9ydCB2YWx1ZVR5cGU7Ci0JCWlmICh0ZXh0LnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJpbmhlcml0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTkhFUklUX1BSSU1JVElWRTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkpIHsKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HKSB7Ci0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU1RSSU5HOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCXZhbHVlVHlwZSA9IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSEFTSDsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiAmJiB0ZXh0LmVxdWFscygiLCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09NTUE7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgJiYgdGV4dC5lcXVhbHMoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NMQVNIOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0UpIHsKLQkJCXZhbHVlVHlwZSA9IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJBTkdFOwotCQl9Ci0JCWVsc2UgewotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lERU5UOwotCQl9Ci0JCXJldHVybiB2YWx1ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbWFrZVN0cmluZyhJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlib29sZWFuIGJTcGFjZSA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSByZWdpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBpLm5leHQoKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICghYlNwYWNlICYmIGlzQmxhbmsodHlwZSkpIHsKLQkJCQlidWYuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQliU3BhY2UgPSB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gWzI3NDk0NV0gTXVsdGlwbGUgcmVnaW9ucyBzaG91bGQgaGF2ZSB0aGUgc3BhY2VzIGJldHdlZW4gY29sbGFwc2VkCi0JCQkJU3RyaW5nIHRleHQgPSBpLmhhc05leHQoKSA/IGdldENvbGxhcHNlZFRleHQocmVnaW9uKSA6IGdldFRleHQocmVnaW9uKTsKLQkJCQlidWYuYXBwZW5kKHRleHQpOwotCQkJCWJTcGFjZSA9IGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50VGVtcG9yYXJ5KGJvb2xlYW4gYlRlbXApIHsKLQkJZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBiVGVtcDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RmxvYXRWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUsIFN0cmluZyB0ZXh0LCBTdHJpbmcgdHlwZSkgewotCQlGbG9hdEluZm8gaW5mbyA9IG5ldyBGbG9hdEluZm8odGV4dCk7Ci0JCXZhbHVlLnNldEZsb2F0VmFsdWUoaW5mby5nZXRWYWx1ZVR5cGUoKSwgaW5mby5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0U3RyaW5nVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlLCBTdHJpbmcgdGV4dCwgU3RyaW5nIHR5cGUpIHsKLQkJc2hvcnQgdmFsdWVUeXBlID0gZ2V0U3RyaW5nVmFsdWVUeXBlKHRleHQsIHR5cGUpOwotCQl2YWx1ZS5zZXRTdHJpbmdWYWx1ZSh2YWx1ZVR5cGUsIHRleHQpOwotCX0KLQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRVcGRhdGVDb250ZXh0KENTU01vZGVsVXBkYXRlQ29udGV4dCB1cGRhdGVDb250ZXh0KSB7Ci0JCWZVcGRhdGVDb250ZXh0ID0gdXBkYXRlQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ29sb25TZXBhcmF0b3IoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGkubmV4dCgpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTU3R5bGVEZWNsSXRlbUltcGwgc2V0dXBEZWNsYXJhdGlvbkl0ZW0oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKCFoYXNDb2xvblNlcGFyYXRvcihmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZlBhcmVudFJlZ2lvbiA9IGZsYXROb2RlOwotCi0JCUlUZXh0UmVnaW9uTGlzdCBub2RlUmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoZmxhdE5vZGUuZ2V0UmVnaW9ucygpKTsgLy8gbWFrZQotCQkvLyBjb3B5Ci0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIG5ld0l0ZW0gPSBjcmVhdGVEZWNsYXJhdGlvbkl0ZW0obm9kZVJlZ2lvbnMpOwotCQlpZiAobmV3SXRlbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoIWZUZW1wU3RydWN0dXJlZERvY3VtZW50ICYmIGZsYXROb2RlICE9IG51bGwpIHsKLQkJCW5ld0l0ZW0uc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUsIGZsYXROb2RlKTsKLQkJfQotCi0JCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKG5vZGVSZWdpb25zKTsKLQkJLy8gTm93LCBub2RlUmVnaW9ucyBqdXN0IGhhcyByZWdpb25zIGZvciB2YWx1ZS4KLQkJc2V0dXBWYWx1ZXMobmV3SXRlbSwgbm9kZVJlZ2lvbnMpOwotCQlyZXR1cm4gbmV3SXRlbTsKLQl9Ci0KLQl2b2lkIHNldHVwVmFsdWVzKElDU1NTdHlsZURlY2xJdGVtIGl0ZW0sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50UmVnaW9uLCBJVGV4dFJlZ2lvbkxpc3Qgbm9kZVJlZ2lvbnMpIHsKLQkJZlBhcmVudFJlZ2lvbiA9IHBhcmVudFJlZ2lvbjsKLQkJc2V0dXBWYWx1ZXMoaXRlbSwgbm9kZVJlZ2lvbnMpOwotCX0KLQotCS8qKgotCSAqIG5vZGVSZWdpb25zIG11c3QgYmUgYnJva2VuLiBJZiB5b3UgbmVlZCBhZnRlciwgbWFrZSBjb3B5IG9mIHRoZW0uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldHVwVmFsdWVzKElDU1NTdHlsZURlY2xJdGVtIGl0ZW0sIElUZXh0UmVnaW9uTGlzdCBub2RlUmVnaW9ucykgewotCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWU7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25CdWYgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7Ci0KLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGl0ZW0uZ2V0UHJvcGVydHlOYW1lKCkudG9Mb3dlckNhc2UoKTsKLQkJYm9vbGVhbiBiRm9udCA9IChwcm9wZXJ0eU5hbWUuZXF1YWxzKFByb3BDTVByb3BlcnR5LlBfRk9OVCkpOwotCQkvLyAoc2hvcnQtaGFuZCkgZm9udAotCQlpbnQgc3RhdHVzID0gKHByb3BlcnR5TmFtZS5lcXVhbHMoUHJvcENNUHJvcGVydHkuUF9WT0lDRV9GQU1JTFkpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUHJvcENNUHJvcGVydHkuUF9GT05UX0ZBTUlMWSkpID8gU19DT01NQV9TRVBBUkFUSU9OIDogU19OT1JNQUw7Ci0JCXdoaWxlICghbm9kZVJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBub2RlUmVnaW9ucy5yZW1vdmUoMCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCS8vIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIgfHwgdHlwZQotCQkJLy8gPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJLy8gYnJlYWs7Ci0JCQkvLyB9Ci0JCQlzd2l0Y2ggKHN0YXR1cykgewotCQkJCWNhc2UgU19OT1JNQUwgOgotCQkJCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQkJCXJlZ2lvbkJ1Zi5hZGQocmVnaW9uKTsKLQkJCQkJCXN0YXR1cyA9IFNfRlVOQ1RJT047Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoYkZvbnQgJiYgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgJiYgZlBhcmVudFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbikuZXF1YWxzKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdmFsdWUgPSBjcmVhdGVQcmltaXRpdmVWYWx1ZShyZWdpb24pOwotCQkJCQkJc3RhdHVzID0gU19GT05UX1NMQVNIOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKCFpc0JsYW5rKHR5cGUpKSB7Ci0JCQkJCQl2YWx1ZSA9IGNyZWF0ZVByaW1pdGl2ZVZhbHVlKHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTX0ZVTkNUSU9OIDoKLQkJCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKSB7Ci0JCQkJCQlyZWdpb25CdWYuYWRkKHJlZ2lvbik7Ci0JCQkJCQl2YWx1ZSA9IGNyZWF0ZVByaW1pdGl2ZVZhbHVlKHJlZ2lvbkJ1Zik7Ci0JCQkJCQlyZWdpb25CdWYuY2xlYXIoKTsKLQkJCQkJCXN0YXR1cyA9IFNfTk9STUFMOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKCFpc0JsYW5rKHR5cGUpKSB7Ci0JCQkJCQlyZWdpb25CdWYuYWRkKHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTX0ZPTlRfU0xBU0ggOgotCQkJCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OKSB7Ci0JCQkJCQl2YWx1ZSA9IGNyZWF0ZVByaW1pdGl2ZVZhbHVlKHJlZ2lvbik7Ci0JCQkJCQlzdGF0dXMgPSBTX0NPTU1BX1NFUEFSQVRJT047Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoIWlzQmxhbmsodHlwZSkpIHsKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNfQ09NTUFfU0VQQVJBVElPTiA6Ci0JCQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiAmJiBmUGFyZW50UmVnaW9uLmdldFRleHQocmVnaW9uKS5lcXVhbHMoIiwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQl2YWx1ZSA9IGNyZWF0ZVByaW1pdGl2ZVZhbHVlKHJlZ2lvbkJ1Zik7Ci0JCQkJCQlyZWdpb25CdWYuY2xlYXIoKTsKLQkJCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKGZVcGRhdGVDb250ZXh0ID09IG51bGwgfHwgIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCQkJCQkJaXRlbS5hcHBlbmRWYWx1ZSh2YWx1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJdmFsdWUgPSBjcmVhdGVQcmltaXRpdmVWYWx1ZShyZWdpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmVnaW9uQnVmLmFkZChyZWdpb24pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGZVcGRhdGVDb250ZXh0ID09IG51bGwgfHwgIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCQkJaXRlbS5hcHBlbmRWYWx1ZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghcmVnaW9uQnVmLmlzRW1wdHkoKSkgewotCQkJdmFsdWUgPSBjcmVhdGVQcmltaXRpdmVWYWx1ZShyZWdpb25CdWYpOwotCQkJaWYgKGZVcGRhdGVDb250ZXh0ID09IG51bGwgfHwgIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCQlpdGVtLmFwcGVuZFZhbHVlKHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldENvbGxhcHNlZFRleHQoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChmUGFyZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIHRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKGZQYXJlbnRSZWdpb24uZ2V0RnVsbFRleHQocmVnaW9uKSk7Ci0JCWlmIChyZWdpb24uZ2V0TGVuZ3RoKCkgPiByZWdpb24uZ2V0VGV4dExlbmd0aCgpKQotCQkJdGV4dC5yZXBsYWNlKHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIHJlZ2lvbi5nZXRMZW5ndGgoKSwgIiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdGV4dC50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFRleHQoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiAoZlBhcmVudFJlZ2lvbiAhPSBudWxsKSA/IGZQYXJlbnRSZWdpb24uZ2V0VGV4dChyZWdpb24pIDogIiI7IC8vJE5PTi1OTFMtMSQgCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0JsYW5rKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NEb2N1bWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRG9jdW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYTU0M2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NEb2N1bWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1Vua25vd25SdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdDsKLQotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBDU1NEb2N1bWVudEltcGwgZXh0ZW5kcyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBJQ1NTRG9jdW1lbnQgewotCi0JcHJpdmF0ZSBDU1NNb2RlbEltcGwgZk1vZGVsID0gbnVsbDsKLQotCS8qKgotCSAqIENTU0RvY3VtZW50SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU0RvY3VtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCUNTU0RvY3VtZW50SW1wbChDU1NEb2N1bWVudEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlJQ1NTTm9kZSBjcmVhdGVDU1NBdHRyKFN0cmluZyBuYW1lKSB7Ci0JCUNTU0F0dHJJbXBsIGF0dHIgPSBuZXcgQ1NTQXR0ckltcGwobmFtZSk7Ci0JCWF0dHIuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NDaGFyc2V0UnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTQ2hhcnNldFJ1bGUgY3JlYXRlQ1NTQ2hhcnNldFJ1bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZQotCSAqLwotCXB1YmxpYyBDU1NGb250RmFjZVJ1bGUgY3JlYXRlQ1NTRm9udEZhY2VSdWxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NJbXBvcnRSdWxlCi0JICovCi0JcHVibGljIElDU1NJbXBvcnRSdWxlIGNyZWF0ZUNTU0ltcG9ydFJ1bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLklDU1NNZWRpYVJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU01lZGlhUnVsZSBjcmVhdGVDU1NNZWRpYVJ1bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1BhZ2VSdWxlCi0JICovCi0JcHVibGljIElDU1NQYWdlUnVsZSBjcmVhdGVDU1NQYWdlUnVsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlwdWJsaWMgSUNTU1ByaW1pdGl2ZVZhbHVlIGNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKHNob3J0IHByaW1pdGl2ZVR5cGUpIHsKLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gbnVsbDsKLQkJaWYgKHByaW1pdGl2ZVR5cGUgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPVU5URVIpCi0JCQl2YWx1ZSA9IG5ldyBDb3VudGVySW1wbCgpOwotCQllbHNlIGlmIChwcmltaXRpdmVUeXBlID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SRUNUKQotCQkJdmFsdWUgPSBuZXcgUmVjdEltcGwoKTsKLQkJZWxzZSBpZiAocHJpbWl0aXZlVHlwZSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkdCQ09MT1IpCi0JCQl2YWx1ZSA9IG5ldyBSR0JDb2xvckltcGwoKTsKLQkJZWxzZQotCQkJdmFsdWUgPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHByaW1pdGl2ZVR5cGUpOwotCQl2YWx1ZS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZSBjcmVhdGVDU1NSdWxlKFN0cmluZyBydWxlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbGFyYXRpb24gY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDU1NTdHlsZURlY2xJdGVtIGNyZWF0ZUNTU1N0eWxlRGVjbEl0ZW0oU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlDU1NTdHlsZURlY2xJdGVtSW1wbCBpdGVtID0gbmV3IENTU1N0eWxlRGVjbEl0ZW1JbXBsKHByb3BlcnR5TmFtZSk7Ci0JCWl0ZW0uc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gaXRlbTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlUnVsZSBjcmVhdGVDU1NTdHlsZVJ1bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1Vua25vd25SdWxlCi0JICovCi0JcHVibGljIENTU1Vua25vd25SdWxlIGNyZWF0ZUNTU1Vua25vd25SdWxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdAotCSAqLwotCXB1YmxpYyBNZWRpYUxpc3QgY3JlYXRlTWVkaWFMaXN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNTU01vZGVsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gZk1vZGVsOwotCX0KLQotCXZvaWQgc2V0TW9kZWwoQ1NTTW9kZWxJbXBsIG1vZGVsKSB7Ci0JCXRoaXMuZk1vZGVsID0gbW9kZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NGb250RmFjZVJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0ZvbnRGYWNlUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjZDlmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0ZvbnRGYWNlUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTRm9udEZhY2VSdWxlSW1wbCBleHRlbmRzIENTU1J1bGVEZWNsQ29udGFpbmVyIGltcGxlbWVudHMgQ1NTRm9udEZhY2VSdWxlIHsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU0ZvbnRGYWNlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ1NTRm9udEZhY2VSdWxlSW1wbChDU1NGb250RmFjZVJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTRm9udEZhY2VSdWxlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTRm9udEZhY2VSdWxlSW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGV4dHJhY3RQcmVTdHJpbmcoKSB7Ci0JCXJldHVybiAiQGZvbnQtZmFjZSI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBGT05URkFDRVJVTEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBGT05UX0ZBQ0VfUlVMRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0ltcG9ydFJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0ltcG9ydFJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYTM4NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NJbXBvcnRSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSU1vZGVsUHJvdmlkZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuVVJMTW9kZWxQcm92aWRlckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdDsKLQotCi0vKioKLSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NJbXBvcnRSdWxlSW1wbCBleHRlbmRzIENTU1J1bGVJbXBsIGltcGxlbWVudHMgSUNTU0ltcG9ydFJ1bGUgewotCi0JcHJpdmF0ZSBib29sZWFuIGZEaXJ0eSA9IHRydWU7Ci0JcHJpdmF0ZSBJQ1NTU3R5bGVTaGVldCBmU3R5bGVTaGVldDsKLQotCS8qKgotICAgICAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0gICAgICovCi0JcHVibGljIENTU0ltcG9ydFJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXB1YmxpYyBDU1NJbXBvcnRSdWxlSW1wbChDU1NJbXBvcnRSdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU0ltcG9ydFJ1bGVJbXBsIGNsb25lZCA9IG5ldyBDU1NJbXBvcnRSdWxlSW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBjbG9zZVN0eWxlU2hlZXQoKSB7Ci0JCWlmIChmU3R5bGVTaGVldCAhPSBudWxsKSB7Ci0JCQlJQ1NTU3R5bGVTaGVldCBzaGVldCA9IGZTdHlsZVNoZWV0OwotCQkJZlN0eWxlU2hlZXQgPSBudWxsOyAvLyB0byBwcmV2ZW50IGxvb3AsIHdlIG11c3QgcmVzZXQgZlN0eWxlU2hlZXQKLQkJCQkJCQkJLy8gYmVmb3JlIGFsbCBjbG9zaW5nIGFjdGlvbgotCi0JCQlzaGVldC5nZXRNb2RlbCgpLnJlbW92ZVN0eWxlTGlzdGVuZXIoZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkpOwotCQkJLy8gZ2V0IE1vZGVsUHJvdmlkZUFkYXB0ZXIKLQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpIGdldEFkYXB0ZXJGb3IoSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCQkJLy8gaWYgKGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0KLQkJCS8vIElDU1NNb2RlbC5FTUJFRERFRCkgeyAvLyBjYXNlIFNUWUxFIHRhZwotCQkJLy8gYWRhcHRlciA9IChNb2RlbFByb3ZpZGVBZGFwdGVyKQotCQkJLy8gKChJTm9kZU5vdGlmaWVyKWdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldE93bmVyRE9NTm9kZSgpKS5nZXRBZGFwdGVyRm9yKE1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCQkJLy8gfQotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQlhZGFwdGVyLm1vZGVsUmVtb3ZlZChzaGVldC5nZXRNb2RlbCgpKTsKLQotCQkJc2hlZXQuZ2V0TW9kZWwoKS5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgc3R5bGUgc2hlZXQgdG8gYmUgaW1wb3J0ZWQuIFRoZSBhdHRyaWJ1dGUgd2lsbCBub3QKLQkgKiBjb250YWluIHRoZSA8Y29kZT4idXJsKC4uLikiPC9jb2RlPiBzcGVjaWZpZXIgYXJvdW5kIHRoZSBVUkkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIcmVmKCkgewotCQlyZXR1cm4gQ1NTVXRpbC5leHRyYWN0VXJpQ29udGVudHMoZ2V0QXR0cmlidXRlKEhSRUYpKTsKLQl9Ci0KLQkvKioKLQkgKiBBIGxpc3Qgb2YgbWVkaWEgdHlwZXMgZm9yIHdoaWNoIHRoaXMgc3R5bGUgc2hlZXQgbWF5IGJlIHVzZWQuCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdCBnZXRNZWRpYSgpIHsKLQkJSUNTU05vZGUgbWVkaWEgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChtZWRpYSAhPSBudWxsKSB7Ci0JCQlpZiAobWVkaWEgaW5zdGFuY2VvZiBNZWRpYUxpc3QpIHsKLQkJCQlyZXR1cm4gKE1lZGlhTGlzdCkgbWVkaWE7Ci0JCQl9Ci0JCX0KLQotCQkvLyBUSElTIENBU0UgSVMgRVJST1IgQ0FTRQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gSU1QT1JUUlVMRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdHlsZSBzaGVldCByZWZlcnJlZCB0byBieSB0aGlzIHJ1bGUsIGlmIGl0IGhhcyBiZWVuIGxvYWRlZC4gVGhlCi0JICogdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHN0eWxlIHNoZWV0IGhhcwotCSAqIG5vdCB5ZXQgYmVlbiBsb2FkZWQgb3IgaWYgaXQgd2lsbCBub3QgYmUgbG9hZGVkIChlLmcuIGlmIHRoZSBzdHlsZQotCSAqIHNoZWV0IGlzIGZvciBhIG1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZCBieSB0aGUgdXNlciBhZ2VudCkuCi0JICovCi0JcHVibGljIENTU1N0eWxlU2hlZXQgZ2V0U3R5bGVTaGVldCgpIHsKLQotCQlpZiAoZkRpcnR5KSB7Ci0JCQkvLyBOT1RFOiB0cnkvY2F0Y2ggYmxvY2sgaXMgYSBURU1QIGZpeCB0byBhdm9pZCBjb21waWxlIGVycm9yczoKLQkJCXRyeSB7Ci0JCQkJY2xvc2VTdHlsZVNoZWV0KCk7Ci0KLQkJCQlpZiAoZ2V0SHJlZigpID09IG51bGwgfHwgZ2V0SHJlZigpLmxlbmd0aCgpIDw9IDApIHsKLQkJCQkJZkRpcnR5ID0gZmFsc2U7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsID0gZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCQkJaWYgKGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVNQkVEREVEKSB7IC8vIGNhc2UKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIFNUWUxFCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0YWcKLQkJCQkJYmFzZU1vZGVsID0gKChJRE9NTm9kZSkgZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0T3duZXJET01Ob2RlKCkpLmdldE1vZGVsKCk7Ci0JCQkJfQotCQkJCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkJLy8gaWYgKGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0KLQkJCQkvLyBJQ1NTTW9kZWwuRU1CRURERUQpIHsgLy8gY2FzZSBTVFlMRSB0YWcKLQkJCQkvLyBhZGFwdGVyID0gKE1vZGVsUHJvdmlkZUFkYXB0ZXIpCi0JCQkJLy8gKChJTm9kZU5vdGlmaWVyKWdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldE93bmVyRE9NTm9kZSgpKS5nZXRBZGFwdGVyRm9yKE1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCQkJCS8vIH0KLQotCQkJCS8vIGxvYWQgbW9kZWwgZnJvbSBJTW9kZWxNYW5hZ2VyCi0JCQkJVVJMTW9kZWxQcm92aWRlckNTUyBwcm92aWRlciA9IG5ldyBVUkxNb2RlbFByb3ZpZGVyQ1NTKCk7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCA9IHByb3ZpZGVyLmdldE1vZGVsRm9yUmVhZChiYXNlTW9kZWwsIGdldEhyZWYoKSk7Ci0JCQkJZkRpcnR5ID0gZmFsc2U7Ci0KLQkJCQlpZiAobmV3TW9kZWwgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJaWYgKCEobmV3TW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpKSB7Ci0JCQkJCW5ld01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQkvLyBub3RpZnkgYWRhcHRlcgotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJCWFkYXB0ZXIubW9kZWxQcm92aWRlZChuZXdNb2RlbCk7Ci0KLQkJCQlmU3R5bGVTaGVldCA9IChJQ1NTU3R5bGVTaGVldCkgKChJQ1NTTW9kZWwpIG5ld01vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCWlmIChmU3R5bGVTaGVldCAhPSBudWxsKQotCQkJCQlmU3R5bGVTaGVldC5nZXRNb2RlbCgpLmFkZFN0eWxlTGlzdGVuZXIoZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZTdHlsZVNoZWV0OwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIElNUE9SVF9SVUxFOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hTdHlsZVNoZWV0KCkgewotCQlpZiAoIWZEaXJ0eSkgewotCQkJY2xvc2VTdHlsZVNoZWV0KCk7Ci0JCQlmRGlydHkgPSB0cnVlOwotCQkJbm90aWZ5KElOb2RlTm90aWZpZXIuQ0hBTkdFLCBnZXRBdHRyaWJ1dGVOb2RlKEhSRUYpLCBudWxsLCBudWxsLCBnZXRTdGFydE9mZnNldCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgcmVsZWFzZVJ1bGUoKSB7Ci0JCWlmIChmU3R5bGVTaGVldCAhPSBudWxsKSB7Ci0JCQlJQ1NTU3R5bGVTaGVldCBzaGVldCA9IGZTdHlsZVNoZWV0OwotCQkJZlN0eWxlU2hlZXQgPSBudWxsOyAvLyB0byBwcmV2ZW50IGxvb3AsIHdlIG11c3QgcmVzZXQgZlN0eWxlU2hlZXQKLQkJCQkJCQkJLy8gYmVmb3JlIGFsbCBjbG9zaW5nIGFjdGlvbgotCi0JCQlzaGVldC5nZXRNb2RlbCgpLnJlbW92ZVN0eWxlTGlzdGVuZXIoZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkpOwotCQkJLy8gZ2V0IE1vZGVsUHJvdmlkZUFkYXB0ZXIKLQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpIGdldEFkYXB0ZXJGb3IoSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCQkJLy8gaWYgKGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0KLQkJCS8vIElDU1NNb2RlbC5FTUJFRERFRCkgeyAvLyBjYXNlIFNUWUxFIHRhZwotCQkJLy8gYWRhcHRlciA9IChNb2RlbFByb3ZpZGVBZGFwdGVyKQotCQkJLy8gKChJTm9kZU5vdGlmaWVyKWdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldE93bmVyRE9NTm9kZSgpKS5nZXRBZGFwdGVyRm9yKE1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCQkJLy8gfQotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQlhZGFwdGVyLm1vZGVsUmVsZWFzZWQoc2hlZXQuZ2V0TW9kZWwoKSk7Ci0KLQkJCXNoZWV0LmdldE1vZGVsKCkucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaHJlZgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhyZWYoU3RyaW5nIGhyZWYpIHRocm93cyBET01FeGNlcHRpb24gewotCQlmRGlydHkgPSB0cnVlOwotCQlzZXRBdHRyaWJ1dGUoSFJFRiwgQ1NTTGlua0NvbnZlcnRlci5hZGRGdW5jKGhyZWYpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01lZGlhUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTWVkaWFSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTc1Yzg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTWVkaWFSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU01lZGlhUnVsZUltcGwgZXh0ZW5kcyBDU1NSdWxlSW1wbCBpbXBsZW1lbnRzIElDU1NNZWRpYVJ1bGUgewotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTTWVkaWFSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NNZWRpYVJ1bGVJbXBsKENTU01lZGlhUnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBhcHBlbmRSdWxlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAocnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgYXBwZW5kQ2hpbGQoKENTU05vZGVJbXBsKSBydWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NNZWRpYVJ1bGVJbXBsIGNsb25lZCA9IG5ldyBDU1NNZWRpYVJ1bGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGRlbGV0ZSBhIHJ1bGUgZnJvbSB0aGUgbWVkaWEgYmxvY2suCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBUaGUgaW5kZXggd2l0aGluIHRoZSBtZWRpYSBibG9jaydzIHJ1bGUgY29sbGVjdGlvbiBvZiB0aGUKLQkgKiAgICAgICAgICAgIHJ1bGUgdG8gcmVtb3ZlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGRvZXMgbm90Ci0JICogICAgICAgICAgICAgICAgY29ycmVzcG9uZCB0byBhIHJ1bGUgaW4gdGhlIG1lZGlhIHJ1bGUgbGlzdC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbWVkaWEgcnVsZQotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVJ1bGUoaW50IGluZGV4KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJQ1NTTm9kZUltcGwgbm9kZSA9IGdldEluZGV4ZWRSdWxlKGluZGV4KTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIEEgbGlzdCBvZiBhbGwgQ1NTIHJ1bGVzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIG1lZGlhIGJsb2NrLgotCSAqLwotCXB1YmxpYyBDU1NSdWxlTGlzdCBnZXRDc3NSdWxlcygpIHsKLQkJQ1NTUnVsZUxpc3RJbXBsIGxpc3QgPSBuZXcgQ1NTUnVsZUxpc3RJbXBsKCk7Ci0KLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUnVsZSkKLQkJCQlsaXN0LmFwcGVuZE5vZGUobm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlDU1NSdWxlSW1wbCBnZXRJbmRleGVkUnVsZShpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBpID0gMDsKLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUnVsZSkgewotCQkJCWlmIChpKysgPT0gaW5kZXgpCi0JCQkJCXJldHVybiAoQ1NTUnVsZUltcGwpIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQSBsaXN0IG9mIG1lZGlhIHR5cGVzIGZvciB0aGlzIHJ1bGUuCi0JICovCi0JcHVibGljIE1lZGlhTGlzdCBnZXRNZWRpYSgpIHsKLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgTWVkaWFMaXN0SW1wbCkKLQkJCQlyZXR1cm4gKE1lZGlhTGlzdCkgbm9kZTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBNRURJQVJVTEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBNRURJQV9SVUxFOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gaW5zZXJ0IGEgbmV3IHJ1bGUgaW50byB0aGUgbWVkaWEgYmxvY2suCi0JICogCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIFRoZSBwYXJzYWJsZSB0ZXh0IHJlcHJlc2VudGluZyB0aGUgcnVsZS4gRm9yIHJ1bGUgc2V0cyB0aGlzCi0JICogICAgICAgICAgICBjb250YWlucyBib3RoIHRoZSBzZWxlY3RvciBhbmQgdGhlIHN0eWxlIGRlY2xhcmF0aW9uLiBGb3IKLQkgKiAgICAgICAgICAgIGF0LXJ1bGVzLCB0aGlzIHNwZWNpZmllcyBib3RoIHRoZSBhdC1pZGVudGlmaWVyIGFuZCB0aGUgcnVsZQotCSAqICAgICAgICAgICAgY29udGVudC4KLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIFRoZSBpbmRleCB3aXRoaW4gdGhlIG1lZGlhIGJsb2NrJ3MgcnVsZSBjb2xsZWN0aW9uIG9mIHRoZQotCSAqICAgICAgICAgICAgcnVsZSBiZWZvcmUgd2hpY2ggdG8gaW5zZXJ0IHRoZSBzcGVjaWZpZWQgcnVsZS4gSWYgdGhlCi0JICogICAgICAgICAgICBzcGVjaWZpZWQgaW5kZXggaXMgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGUgbWVkaWEgYmxvY2tzJ3MKLQkgKiAgICAgICAgICAgIHJ1bGUgY29sbGVjdGlvbiwgdGhlIHJ1bGUgd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZQotCSAqICAgICAgICAgICAgbWVkaWEgYmxvY2suCi0JICogQHJldHVybiBUaGUgaW5kZXggd2l0aGluIHRoZSBtZWRpYSBibG9jaydzIHJ1bGUgY29sbGVjdGlvbiBvZiB0aGUgbmV3bHkKLQkgKiAgICAgICAgIGluc2VydGVkIHJ1bGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBISUVSQVJDSFlfUkVRVUVTVF9FUlI6IFJhaXNlZCBpZiB0aGUgcnVsZSBjYW5ub3QgYmUKLQkgKiAgICAgICAgICAgICAgICBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBlLmcuLCBpZiBhbgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkBpbXBvcnQ8L2NvZGU+IHJ1bGUgaXMgaW5zZXJ0ZWQgYWZ0ZXIgYSBzdGFuZGFyZCBydWxlIHNldCBvciBvdGhlcgotCSAqICAgICAgICAgYXQtcnVsZS4gPGJyPgotCSAqICAgICAgICAgSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGlzIG5vdCBhIHZhbGlkCi0JICogICAgICAgICBpbnNlcnRpb24gcG9pbnQuIDxicj4KLQkgKiAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbWVkaWEgcnVsZSBpcwotCSAqICAgICAgICAgcmVhZG9ubHkuIDxicj4KLQkgKiAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHJ1bGUgaGFzIGEgc3ludGF4IGVycm9yIGFuZAotCSAqICAgICAgICAgaXMgdW5wYXJzYWJsZS4KLQkgKi8KLQlwdWJsaWMgaW50IGluc2VydFJ1bGUoU3RyaW5nIHJ1bGUsIGludCBpbmRleCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWludCBsZW5ndGggPSBnZXRDc3NSdWxlcygpLmdldExlbmd0aCgpOwotCQlpZiAoaW5kZXggPCAwIHx8IGxlbmd0aCA8IGluZGV4KQotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0KLQkJQ1NTUnVsZUltcGwgcmVmUnVsZSA9IChsZW5ndGggIT0gaW5kZXgpID8gZ2V0SW5kZXhlZFJ1bGUoaW5kZXgpIDogbnVsbDsKLQotCQlDU1NSdWxlSW1wbCBuZXdSdWxlID0gKENTU1J1bGVJbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTUnVsZShydWxlKTsKLQotCQkvLyBwcmV2ZW50IGZyb20gbmVzdGluZyBAbWVkaWEgcnVsZQotCQlpZiAobmV3UnVsZS5nZXRUeXBlKCkgPT0gQ1NTUnVsZS5NRURJQV9SVUxFKQotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uU1lOVEFYX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQotCQlpbnNlcnRCZWZvcmUobmV3UnVsZSwgcmVmUnVsZSk7Ci0KLQkJcmV0dXJuIGluZGV4OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gbmV3UnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcmVmUnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgaW5zZXJ0UnVsZUJlZm9yZShvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBuZXdSdWxlLCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSByZWZSdWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld1J1bGUgPT0gbnVsbCAmJiByZWZSdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDU1NSdWxlIHJldCA9IChDU1NSdWxlKSBpbnNlcnRCZWZvcmUoKENTU05vZGVJbXBsKSBuZXdSdWxlLCAoQ1NTTm9kZUltcGwpIHJlZlJ1bGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJlbW92ZVJ1bGUob3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChydWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDU1NSdWxlIHJldCA9IChDU1NSdWxlKSByZW1vdmVDaGlsZCgoQ1NTTm9kZUltcGwpIHJ1bGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcmVwbGFjZVJ1bGUob3JnLnczYy5kb20uY3NzLkNTU1J1bGUgbmV3UnVsZSwgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgb2xkUnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdSdWxlID09IG51bGwgJiYgb2xkUnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgcmVwbGFjZUNoaWxkKChDU1NOb2RlSW1wbCkgbmV3UnVsZSwgKENTU05vZGVJbXBsKSBvbGRSdWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsQ3JlYXRpb25Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsQ3JlYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0OTRhMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbENyZWF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotLyoqCi0gKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotICovCi1wdWJsaWMgY2xhc3MgQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQgewotCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmUm9vdE5vZGUgPSBudWxsOwotCXByaXZhdGUgQ1NTTm9kZUltcGwgZlRhcmdldE5vZGUgPSBudWxsOwotCXByaXZhdGUgQ1NTTm9kZUltcGwgZk5leHROb2RlID0gbnVsbDsKLQlwcml2YXRlIGludCBmUmVwYXJzZVN0YXJ0ID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZlJlcGFyc2VFbmQgPSAtMTsKLQotCS8qKgotCSAqIENTU01vZGVsQ29udGV4dCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU01vZGVsQ3JlYXRpb25Db250ZXh0KENTU05vZGVJbXBsIHJvb3ROb2RlKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJZlJvb3ROb2RlID0gcm9vdE5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBjbGVhcigpIHsKLQkJZk5leHROb2RlID0gbnVsbDsKLQkJZlRhcmdldE5vZGUgPSBudWxsOwotCQlyZXNldFJlcGFyc2VSYW5nZSgpOwotCX0KLQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIENTU05vZGVJbXBsIGdldE5leHROb2RlKCkgewotCQlyZXR1cm4gZk5leHROb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXRSZXBhcnNlRW5kKCkgewotCQlyZXR1cm4gZlJlcGFyc2VFbmQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldFJlcGFyc2VTdGFydCgpIHsKLQkJcmV0dXJuIGZSZXBhcnNlU3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTTm9kZUltcGwgZ2V0Um9vdE5vZGUoKSB7Ci0JCXJldHVybiBmUm9vdE5vZGU7Ci0JfQotCi0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTTm9kZUltcGwgZ2V0VGFyZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIGZUYXJnZXROb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNUb1JlcGFyc2UoKSB7Ci0JCXJldHVybiAoMCA8PSBnZXRSZXBhcnNlU3RhcnQoKSAmJiAwIDw9IGdldFJlcGFyc2VFbmQoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZXNldFJlcGFyc2VSYW5nZSgpIHsKLQkJZlJlcGFyc2VTdGFydCA9IGZSZXBhcnNlRW5kID0gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRMYXN0KCkgewotCQlmTmV4dE5vZGUgPSBudWxsOwotCi0JCWlmICghKGZSb290Tm9kZSBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCWZUYXJnZXROb2RlID0gZlJvb3ROb2RlOwotCQl9Ci0JCWVsc2UgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZSb290Tm9kZSkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJQ1NTTm9kZUltcGwgbm9kZSA9IGZSb290Tm9kZTsKLQkJCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCQlJQ1NTTm9kZSBsYXN0Q2hpbGQgPSBub2RlLmdldExhc3RDaGlsZCgpOwotCQkJCWlmIChsYXN0Q2hpbGQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgJiYgKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGxhc3RDaGlsZCkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJbm9kZSA9IChDU1NOb2RlSW1wbCkgbGFzdENoaWxkOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJZlRhcmdldE5vZGUgPSBub2RlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXROZXh0Tm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWZOZXh0Tm9kZSA9IChDU1NOb2RlSW1wbCkgbm9kZTsKLQkJaWYgKGZOZXh0Tm9kZSAhPSBudWxsKSB7Ci0JCQlmVGFyZ2V0Tm9kZSA9IChDU1NOb2RlSW1wbCkgZk5leHROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0UmVwYXJzZUVuZChpbnQgZW5kKSB7Ci0JCWZSZXBhcnNlRW5kID0gZW5kOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0UmVwYXJzZVN0YXJ0KGludCBzdGFydCkgewotCQlmUmVwYXJzZVN0YXJ0ID0gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRUYXJnZXROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJZlRhcmdldE5vZGUgPSAoQ1NTTm9kZUltcGwpIG5vZGU7Ci0JCWlmIChmTmV4dE5vZGUgIT0gbnVsbCAmJiBmTmV4dE5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IGZUYXJnZXROb2RlKSB7Ci0JCQlmTmV4dE5vZGUgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbERlbGV0aW9uQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbERlbGV0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODU4YmVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxEZWxldGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NNb2RlbERlbGV0aW9uQ29udGV4dCB7Ci0KLQlwcml2YXRlIGludCBmT2xkU3RhcnQgPSAtMTsKLQlwcml2YXRlIGludCBmT2xkTGVuZ3RoID0gMDsKLQlwcml2YXRlIGludCBmTmV3U3RhcnQgPSAtMTsKLQlwcml2YXRlIGludCBmTmV3TGVuZ3RoID0gMDsKLQlwcml2YXRlIGludCBmTGVuZ3RoRGlmZmVyZW5jZSA9IDA7Ci0JLy8gcHJpdmF0ZSBJQ1NTTm9kZSBmUm9vdE5vZGUgPSBudWxsOwotCXByaXZhdGUgaW50IGZSZW1vdmVkUmFuZ2VCZWdpbiA9IC0xOwotCXByaXZhdGUgaW50IGZSZW1vdmVkUmFuZ2VFbmQgPSAtMTsKLQlwcml2YXRlIENTU05vZGVMaXN0SW1wbCBmTm9kZXNUb0JlUmVtb3ZlZCA9IG5ldyBDU1NOb2RlTGlzdEltcGwoKTsKLQlwcml2YXRlIFNldCBmT2xkUmVnaW9uc0xpc3Q7Ci0KLQkvKioKLQkgKiBDU1NNb2RlbERlbGV0aW9uQ29udGV4dCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU01vZGVsRGVsZXRpb25Db250ZXh0KElDU1NOb2RlIHJvb3ROb2RlKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy8gZlJvb3ROb2RlID0gcm9vdE5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBhZGROb2RlVG9CZVJlbW92ZWQoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbk5vZGVzID0gZk5vZGVzVG9CZVJlbW92ZWQuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbk5vZGVzOyBpKyspIHsKLQkJCUlDU1NOb2RlIHBhcmVudCA9IGZOb2Rlc1RvQmVSZW1vdmVkLml0ZW0oaSk7Ci0JCQlpZiAoQ1NTTW9kZWxVdGlsLmlzUGFyZW50T2YocGFyZW50LCBub2RlKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlmTm9kZXNUb0JlUmVtb3ZlZC5hcHBlbmROb2RlKG5vZGUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGV4cGFuZFJlbW92ZWRSYW5nZUJlZ2luKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgbmV3QmVnaW4gPSBmbGF0Tm9kZS5nZXRTdGFydCgpOyAvLyBmT2xkU3RhcnQgPT0gZk5ld1N0YXJ0LCByaWdodD8/Ci0JCWlmIChmUmVtb3ZlZFJhbmdlQmVnaW4gPCAwIHx8IG5ld0JlZ2luIDwgZlJlbW92ZWRSYW5nZUJlZ2luKSB7Ci0JCQlmUmVtb3ZlZFJhbmdlQmVnaW4gPSBuZXdCZWdpbjsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZXhwYW5kUmVtb3ZlZFJhbmdlRW5kKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgbmV3RW5kID0gZmxhdE5vZGUuZ2V0RW5kKCkgKyAoKGlzT2xkTm9kZShmbGF0Tm9kZSkpID8gZkxlbmd0aERpZmZlcmVuY2UgOiAwKTsKLQkJaWYgKGZSZW1vdmVkUmFuZ2VFbmQgPCAwIHx8IGZSZW1vdmVkUmFuZ2VFbmQgPCBuZXdFbmQpIHsKLQkJCWZSZW1vdmVkUmFuZ2VFbmQgPSBuZXdFbmQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBmaW5kQ29udGFpbmVyKENTU05vZGVJbXBsIHBhcmVudCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkvLyBBbSBpIGEgY29udGFpbmVyIG9mIGZsYXROb2RlPwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50KS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWludCBmaXJzdFN0YXJ0ID0gZ2V0T3JpZ2luYWxPZmZzZXQoZmlyc3ROb2RlKTsKLQkJCWludCBsYXN0U3RhcnQgPSBnZXRPcmlnaW5hbE9mZnNldChsYXN0Tm9kZSk7Ci0JCQlpbnQgc3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCi0JCQlpZiAoZmlyc3RTdGFydCA8PSBzdGFydCAmJiBzdGFydCA8PSBsYXN0U3RhcnQpIHsKLQkJCQkvLyBJIGFtIGEgY29udGFpbmVyLCBpcyBteSBjaGlsZCBhIGNvbnRhaW5lciA/Ci0JCQkJZm9yIChJQ1NTTm9kZSBub2RlID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTTm9kZUltcGwpIHsKLQkJCQkJCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSBmaW5kQ29udGFpbmVyKChDU1NOb2RlSW1wbCkgbm9kZSwgZmxhdE5vZGUpOwotCQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGZpbmREZWxldGlvblRhcmdldChDU1NOb2RlSW1wbCBwYXJlbnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHRhcmdldCA9IGZpbmRDb250YWluZXIocGFyZW50LCBmbGF0Tm9kZSk7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50KGZsYXROb2RlLnRvU3RyaW5nKCkgKyAiOiAiKTsKLQotCQkvLyBjaGlsZCBhKD09PT09KWIoPT09PT0pYwotCQkvLyBwYXJlbnQgKD09PT09PT09PT09PT09PT0pIGEsYyBjYW4gcmVtb3ZlIHBhcmVudCwgYnV0IGIgY2Fubm90LgotCi0JCUlDU1NOb2RlIGNoaWxkOwotCi0JCWZvciAoY2hpbGQgPSB0YXJnZXQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsICYmICEoY2hpbGQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCS8vIGp1c3QgYWR2YW5jaW5nCi0JCX0KLQotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ0YXJnZXQgaGFzIG5vIGNoaWxkcmVuLiIpOyAvLyBURVNUQllDT1pZCi0JCQlyZXR1cm4gdGFyZ2V0OyAvLyBoYXMgbm8gY2hpbGQgY29udGFpbmVycy4KLQkJfQotCQllbHNlIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGNoaWxkKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlLmdldFN0YXJ0KCkgPCBnZXRPcmlnaW5hbE9mZnNldChmaXJzdE5vZGUpKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJmbGF0Tm9kZSBpcyBpbiBmcm9udCBvZiBmaXJzdCBjaGlsZCIpOwotCQkJCS8vIC8vIFRFU1RCWUNPWlkKLQkJCQlyZXR1cm4gdGFyZ2V0OyAvLyBhCi0JCQl9Ci0JCX0KLQotCQlmb3IgKGNoaWxkID0gdGFyZ2V0LmdldExhc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsICYmICEoY2hpbGQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpOyBjaGlsZCA9IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpKSB7Ci0JCQkvLyBqdXN0IGFkdmFuY2luZwotCQl9Ci0KLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidGFyZ2V0IGhhcyBubyBjaGlsZHJlbi4iKTsgLy8gVEVTVEJZQ09aWQotCQkJcmV0dXJuIHRhcmdldDsgLy8gaGFzIG5vIGNoaWxkIGNvbnRhaW5lcnMuCi0JCX0KLQkJZWxzZSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBjaGlsZCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChnZXRPcmlnaW5hbE9mZnNldChmaXJzdE5vZGUpIDwgZmxhdE5vZGUuZ2V0U3RhcnQoKSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZmxhdE5vZGUgaXMgaW4gYWZ0ZXIgb2YgbGFzdCBjaGlsZCIpOwotCQkJCS8vIC8vIFRFU1RCWUNPWlkKLQkJCQlyZXR1cm4gdGFyZ2V0OyAvLyBjCi0JCQl9Ci0JCX0KLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImZsYXROb2RlIGlubmVyIG9mIGNoaWxkcmVuIik7IC8vIFRFU1RCWUNPWlkKLQkJcmV0dXJuIG51bGw7IC8vIGIKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlJdGVyYXRvciBnZXROb2Rlc1RvQmVSZW1vdmVkKCkgewotCQlDb2xsZWN0aW9uIG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbnQgbk5vZGVzID0gZk5vZGVzVG9CZVJlbW92ZWQuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbk5vZGVzOyBpKyspIHsKLQkJCW5vZGVzLmFkZChmTm9kZXNUb0JlUmVtb3ZlZC5pdGVtKGkpKTsKLQkJfQotCQlyZXR1cm4gbm9kZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGludCBnZXRPcmlnaW5hbE9mZnNldChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJCWlmICgwIDw9IGZMZW5ndGhEaWZmZXJlbmNlKSB7Ci0JCQkJaWYgKGZOZXdTdGFydCArIGZOZXdMZW5ndGggPCBvZmZzZXQpIHsKLQkJCQkJb2Zmc2V0IC09IGZMZW5ndGhEaWZmZXJlbmNlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChmT2xkU3RhcnQgKyBmT2xkTGVuZ3RoIDw9IG9mZnNldCB8fCAoZk5ld1N0YXJ0IDwgMCAmJiBmT2xkU3RhcnQgPD0gb2Zmc2V0ICYmICFpc09sZE5vZGUoZmxhdE5vZGUpKSB8fCAoMCA8PSBmTmV3U3RhcnQgJiYgZk5ld1N0YXJ0ICsgZk5ld0xlbmd0aCA8PSBvZmZzZXQgJiYgIWlzT2xkTm9kZShmbGF0Tm9kZSkpKSB7Ci0JCQkJCW9mZnNldCAtPSBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gb2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXRSZW1vdmVkUmFuZ2VCZWdpbigpIHsKLQkJcmV0dXJuIGZSZW1vdmVkUmFuZ2VCZWdpbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0UmVtb3ZlZFJhbmdlRW5kKCkgewotCQlyZXR1cm4gZlJlbW92ZWRSYW5nZUVuZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNPbGROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJcmV0dXJuIGZPbGRSZWdpb25zTGlzdC5jb250YWlucyhmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXR1cENvbnRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucykgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQkJZk9sZExlbmd0aCA9IENTU1V0aWwuZ2V0VGV4dExlbmd0aChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCAmJiAwIDwgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKSAmJiAoZmxhdE5vZGUgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oMCkpICE9IG51bGwpIHsKLQkJCWZPbGRTdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmT2xkU3RhcnQgPSAtMTsKLQkJfQotCQlmTmV3TGVuZ3RoID0gQ1NTVXRpbC5nZXRUZXh0TGVuZ3RoKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsICYmIDAgPCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpICYmIChmbGF0Tm9kZSA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbSgwKSkgIT0gbnVsbCkgewotCQkJZk5ld1N0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJCWZSZW1vdmVkUmFuZ2VCZWdpbiA9IGZOZXdTdGFydDsKLQkJCWZSZW1vdmVkUmFuZ2VFbmQgPSBmTmV3U3RhcnQgKyBmTmV3TGVuZ3RoOwotCQl9Ci0JCWVsc2UgewotCQkJZk5ld1N0YXJ0ID0gLTE7Ci0JCQlmUmVtb3ZlZFJhbmdlQmVnaW4gPSBmUmVtb3ZlZFJhbmdlRW5kID0gLTE7Ci0JCX0KLQkJZkxlbmd0aERpZmZlcmVuY2UgPSBmTmV3TGVuZ3RoIC0gZk9sZExlbmd0aDsKLQotCQlmT2xkUmVnaW9uc0xpc3QgPSBuZXcgSGFzaFNldCgpOyAKLQkJZmluYWwgRW51bWVyYXRpb24gZWxlbWVudHMgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmVsZW1lbnRzKCk7Ci0JCXdoaWxlIChlbGVtZW50cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJZk9sZFJlZ2lvbnNMaXN0LmFkZChlbGVtZW50cy5uZXh0RWxlbWVudCgpKTsKLQkJfQotCQkvLyBjbGVhbnVwIG5vZGVzCi0JCXdoaWxlICgwIDwgZk5vZGVzVG9CZVJlbW92ZWQuZ2V0TGVuZ3RoKCkpIHsKLQkJCWZOb2Rlc1RvQmVSZW1vdmVkLnJlbW92ZU5vZGUoMCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlN2I1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQuSUNTU1N0eWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50aW1wbC5DU1NFbWJlZGVkU3R5bGVOb3RpZnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudGltcGwuQ1NTU3R5bGVOb3RpZnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkltcG9ydFJ1bGVDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuSW1wb3J0ZWRDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuU2VsZWN0b3JzQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLQotcHVibGljIGNsYXNzIENTU01vZGVsSW1wbCBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsIGltcGxlbWVudHMgSUNTU01vZGVsLCBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBDU1NEb2N1bWVudEltcGwgZG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgb3JnLnczYy5kb20uTm9kZSBvd25lck5vZGUgPSBudWxsOwotCXByaXZhdGUgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyIHN0eWxlTm90aWZpZXIgPSBudWxsOwotCXByaXZhdGUgQ1NTTW9kZWxQYXJzZXIgZlBhcnNlciA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NNb2RlbFVwZGF0ZXIgZlVwZGF0ZXIgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIElEX05PTl9FWFRFUk5BTF9DU1MgPSAiKipfTk9OX0VYVEVSTkFMX0NTU18qKioiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENTU01vZGVsSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NNb2RlbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZXZlbnQuQ1NTU3R5bGVMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFN0eWxlTGlzdGVuZXIoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZ2V0U3R5bGVOb3RpZmllcigpLmFkZFN0eWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXZvaWQgYXR0clJlcGxhY2VkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5ld0F0dHIsIENTU05vZGVJbXBsIG9sZEF0dHIpIHsKLQkJaWYgKCFmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlKSB7Ci0JCQlDU1NNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldFVwZGF0ZXIoKTsKLQkJCXVwZGF0ZXIuYXR0clJlcGxhY2VkKHBhcmVudE5vZGUsIG5ld0F0dHIsIG9sZEF0dHIpOwotCQl9Ci0KLQkJSUNTU1NlbGVjdG9yIHJlbW92ZWRbXSA9IG51bGwsIGFkZGVkW10gPSBudWxsOwotCQlpZiAob2xkQXR0ciAhPSBudWxsICYmIG9sZEF0dHIuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgb2xkQXR0cikuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTU3R5bGVSdWxlLlNFTEVDVE9SKSkgewotCQkJQ1NTQXR0ckltcGwgYXR0ciA9IChDU1NBdHRySW1wbCkgb2xkQXR0cjsKLQkJCS8vIGNvbGxlY3QgY2hhbmdlZCBzZWxlY3RvcgotCQkJSUNTU1NlbGVjdG9yTGlzdCBsaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCXJlbW92ZWQgPSBuZXcgSUNTU1NlbGVjdG9yW2xpc3QuZ2V0TGVuZ3RoKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0JCQkJcmVtb3ZlZFtpXSA9IGxpc3QuZ2V0U2VsZWN0b3IoaSk7Ci0JCX0KLQkJaWYgKG5ld0F0dHIgIT0gbnVsbCAmJiBuZXdBdHRyLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuQVRUUl9OT0RFICYmICgoQ1NTQXR0ckltcGwpIG5ld0F0dHIpLmdldE5hbWUoKS5lcXVhbHMoSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUikpIHsKLQkJCUNTU0F0dHJJbXBsIGF0dHIgPSAoQ1NTQXR0ckltcGwpIG5ld0F0dHI7Ci0JCQkvLyBjb2xsZWN0IGNoYW5nZWQgc2VsZWN0b3IKLQkJCUlDU1NTZWxlY3Rvckxpc3QgbGlzdCA9IG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQlhZGRlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbbGlzdC5nZXRMZW5ndGgoKV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQlhZGRlZFtpXSA9IGxpc3QuZ2V0U2VsZWN0b3IoaSk7Ci0JCX0KLQkJaWYgKHJlbW92ZWQgIT0gbnVsbCB8fCBhZGRlZCAhPSBudWxsIHx8IGdldERvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpIHsKLQkJCWdldFN0eWxlTm90aWZpZXIoKS5maXJlKHJlbW92ZWQsIGFkZGVkLCBudWxsKTsKLQkJfQotCQkvLyBmb3IgaHJlZiBhdHRyaWJ1dGUKLQkJaWYgKGdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCAmJiBnZXRTdHlsZUxpc3RlbmVycygpLnNpemUoKSA+IDApIHsKLQkJCWJvb2xlYW4gdXBkYXRlID0gZmFsc2U7Ci0JCQlpZiAob2xkQXR0ciAhPSBudWxsICYmIG9sZEF0dHIuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgb2xkQXR0cikuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTSW1wb3J0UnVsZS5IUkVGKSkgewotCQkJCXVwZGF0ZSA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAobmV3QXR0ciAhPSBudWxsICYmIG5ld0F0dHIuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgbmV3QXR0cikuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTSW1wb3J0UnVsZS5IUkVGKSkgewotCQkJCXVwZGF0ZSA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAodXBkYXRlKQotCQkJCSgoSUNTU0ltcG9ydFJ1bGUpIHBhcmVudE5vZGUpLmdldFN0eWxlU2hlZXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCWdldFN0eWxlTm90aWZpZXIoKS5iZWdpblJlY29yZGluZygpOwotCi0JCU5vZGUgbm9kZSA9IGdldE93bmVyRE9NTm9kZSgpOwotCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldE1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCXZvaWQgY2hpbGRSZXBsYWNlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBuZXdDaGlsZCwgQ1NTTm9kZUltcGwgb2xkQ2hpbGQpIHsKLQkJaWYgKCFmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlKSB7Ci0JCQlDU1NNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldFVwZGF0ZXIoKTsKLQkJCXVwZGF0ZXIuY2hpbGRSZXBsYWNlZChwYXJlbnROb2RlLCBuZXdDaGlsZCwgb2xkQ2hpbGQpOwotCQl9Ci0KLQkJLy8gYWx3YXlzIGNoZWNrIGFuZCBzZW5kIHNlbGVjdG9yIGV2ZW50Ci0JCUlDU1NTZWxlY3RvciByZW1vdmVkW10gPSBudWxsLCBhZGRlZFtdID0gbnVsbDsKLQkJaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUgfHwgcGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBUlVMRV9OT0RFKSB7Ci0JCQkvLyBjb2xsZWN0IG9sZCBzZWxlY3RvcnMKLQkJCVNlbGVjdG9yc0NvbGxlY3RvciBzZWxUcmF2ID0gbmV3IFNlbGVjdG9yc0NvbGxlY3RvcigpOwotCQkJc2VsVHJhdi5hcHBseShvbGRDaGlsZCk7Ci0JCQlpbnQgblNlbCA9IHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuc2l6ZSgpOwotCQkJaWYgKG5TZWwgPiAwKSB7Ci0JCQkJcmVtb3ZlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbblNlbF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuU2VsOyBpKyspCi0JCQkJCXJlbW92ZWRbaV0gPSAoSUNTU1NlbGVjdG9yKSBzZWxUcmF2LmdldFNlbGVjdG9ycygpLmdldChpKTsKLQkJCX0KLQkJCS8vIGNvbGxlY3QgbmV3IHNlbGVjdG9ycwotCQkJc2VsVHJhdiA9IG5ldyBTZWxlY3RvcnNDb2xsZWN0b3IoKTsKLQkJCXNlbFRyYXYuYXBwbHkobmV3Q2hpbGQpOwotCQkJblNlbCA9IHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuc2l6ZSgpOwotCQkJaWYgKG5TZWwgPiAwKSB7Ci0JCQkJYWRkZWQgPSBuZXcgSUNTU1NlbGVjdG9yW25TZWxdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblNlbDsgaSsrKQotCQkJCQlhZGRlZFtpXSA9IChJQ1NTU2VsZWN0b3IpIHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuZ2V0KGkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gbW9kaWZpY2F0aW9uCi0JCQlJQ1NTTm9kZSBydWxlID0gcGFyZW50Tm9kZTsKLQkJCXdoaWxlIChydWxlICE9IG51bGwpIHsKLQkJCQlpZiAocnVsZSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpCi0JCQkJCWJyZWFrOwotCQkJCXJ1bGUgPSBydWxlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCWlmIChydWxlICE9IG51bGwpIHsKLQkJCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSAoKElDU1NTdHlsZVJ1bGUpIHJ1bGUpLmdldFNlbGVjdG9ycygpOwotCQkJCWFkZGVkID0gbmV3IElDU1NTZWxlY3RvcltsaXN0LmdldExlbmd0aCgpXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQkJYWRkZWRbaV0gPSBsaXN0LmdldFNlbGVjdG9yKGkpOwotCQkJfQotCQl9Ci0JCWlmIChyZW1vdmVkICE9IG51bGwgfHwgYWRkZWQgIT0gbnVsbCB8fCBnZXREb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSB7Ci0JCQkvLyBzZW5kIHNlbGVjdG9yIGNoYW5nZWQgZXZlbnQKLQkJCWdldFN0eWxlTm90aWZpZXIoKS5maXJlKHJlbW92ZWQsIGFkZGVkLCBudWxsKTsKLQkJfQotCQkvLyBjbG9zZSByZW1vdmVkIGltcG9ydC1ydWxlJ3MgZXh0ZXJuYWwgc3R5bGUgc2hlZXRzCi0JCXsKLQkJCUltcG9ydFJ1bGVDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRSdWxlQ29sbGVjdG9yKCk7Ci0JCQl0cmF2LmFwcGx5KG9sZENoaWxkKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdHJhdi5nZXRSdWxlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJKChDU1NJbXBvcnRSdWxlSW1wbCkgaXQubmV4dCgpKS5jbG9zZVN0eWxlU2hlZXQoKTsKLQkJCX0KLQkJfQotCQkvLyBzZW5kIGV2ZW50cyB0byBsaXN0ZW5lciBmb3IgbmV3IGltcG9ydC1ydWxlcwotCQlpZiAoZ2V0U3R5bGVMaXN0ZW5lcnMoKSAhPSBudWxsICYmIGdldFN0eWxlTGlzdGVuZXJzKCkuc2l6ZSgpID4gMCkgewotCQkJSW1wb3J0ZWRDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRlZENvbGxlY3RvcigpOwotCQkJdHJhdi5hcHBseShuZXdDaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xvc2VJbXBvcnRlZCgpIHsKLQkJaWYgKCFpc1NoYXJlZCgpKSB7Ci0JCQkvLyByZWxlYXNlIGxpc3RlbmVycwotCQkJaWYgKGdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCkgewotCQkJCVZlY3RvciB0b1JlbW92ZSA9IG5ldyBWZWN0b3IoZ2V0U3R5bGVMaXN0ZW5lcnMoKSk7Ci0JCQkJSXRlcmF0b3IgaXQgPSB0b1JlbW92ZS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJcmVtb3ZlU3R5bGVMaXN0ZW5lcigoSUNTU1N0eWxlTGlzdGVuZXIpIGl0Lm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gY2xvc2UgaW1wb3J0IHJ1bGVzCi0JCQlJbXBvcnRSdWxlQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0UnVsZUNvbGxlY3RvcigpOwotCQkJdHJhdi5hcHBseShnZXREb2N1bWVudCgpKTsKLQkJCUl0ZXJhdG9yIGl0MiA9IHRyYXYuZ2V0UnVsZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Mi5oYXNOZXh0KCkpIHsKLQkJCQkoKENTU0ltcG9ydFJ1bGVJbXBsKSBpdDIubmV4dCgpKS5yZWxlYXNlUnVsZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDU1NEb2N1bWVudEltcGwgY3JlYXRlRG9jdW1lbnQoKSB7Ci0JCUNTU0RvY3VtZW50SW1wbCBkb2MgPSBudWxsOwotCQlpbnQgcGFyc2VyTW9kZSA9IENTU1NvdXJjZVBhcnNlci5NT0RFX1NUWUxFU0hFRVQ7Ci0JCWlmIChvd25lck5vZGUgPT0gbnVsbCkgewotCQkJLy8gdGhpcyBjYXNlIGlzIGV4dGVybmFsIENTUyBmaWxlCi0JCQlkb2MgPSAoQ1NTU3R5bGVTaGVldEltcGwpIERPTUNTU0ltcGwuY3JlYXRlQ1NTU3R5bGVTaGVldChudWxsLCBudWxsKTsgLy8gcGFyYW1ldGVycwotCQkJLy8gYXJlCi0JCQkvLyBmb3IKLQkJCS8vIFNUWUxFLXRhZwotCQkJcGFyc2VyTW9kZSA9IENTU1NvdXJjZVBhcnNlci5NT0RFX1NUWUxFU0hFRVQ7Ci0JCX0KLQkJZWxzZSBpZiAob3duZXJOb2RlIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uRWxlbWVudCAmJiAoKEVsZW1lbnQpIG93bmVyTm9kZSkuZ2V0VGFnTmFtZSgpLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCJTVFlMRSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJLy8gdGhpcyBjYXNlIGlzIFNUWUxFLXRhZwotCQkJRWxlbWVudCBzdHlsZSA9IChFbGVtZW50KSBvd25lck5vZGU7Ci0JCQlkb2MgPSAoQ1NTU3R5bGVTaGVldEltcGwpIERPTUNTU0ltcGwuY3JlYXRlQ1NTU3R5bGVTaGVldChzdHlsZS5nZXRBdHRyaWJ1dGUoIlRJVExFIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXN0eWxlLmdldEF0dHJpYnV0ZSgiTUVESUEiKSk7Ly8kTk9OLU5MUy0xJAotCQkJcGFyc2VyTW9kZSA9IENTU1NvdXJjZVBhcnNlci5NT0RFX1NUWUxFU0hFRVQ7Ci0JCX0KLQkJZWxzZSBpZiAob3duZXJOb2RlIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uRWxlbWVudCB8fCBvd25lck5vZGUgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5BdHRyKSB7Ci0JCQkvLyBJbmxpbmUgYXR0cmlidXRlcwotCQkJZG9jID0gKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSBET01DU1NJbXBsLmNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKTsKLQkJCXBhcnNlck1vZGUgPSBDU1NTb3VyY2VQYXJzZXIuTU9ERV9ERUNMQVJBVElPTjsKLQkJfQotCQlSZWdpb25QYXJzZXIgcmVnaW9uUGFyc2VyID0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UGFyc2VyKCk7Ci0JCWlmIChyZWdpb25QYXJzZXIgaW5zdGFuY2VvZiBDU1NTb3VyY2VQYXJzZXIpIHsKLQkJCSgoQ1NTU291cmNlUGFyc2VyKSByZWdpb25QYXJzZXIpLnNldFBhcnNlck1vZGUocGFyc2VyTW9kZSk7Ci0JCX0KLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlcikgewotCQlOb2RlIG5vZGUgPSBnZXRPd25lckRPTU5vZGUoKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSAoKElET01Ob2RlKSBub2RlKS5nZXRNb2RlbCgpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5lbmRSZWNvcmRpbmcocmVxdWVzdGVyKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuZW5kUmVjb3JkaW5nKHJlcXVlc3Rlcik7Ci0KLQkJZ2V0U3R5bGVOb3RpZmllcigpLmVuZFJlY29yZGluZygpOwotCX0KLQotCXB1YmxpYyBJQ1NTRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKSB7Ci0JCQl0aGlzLmRvY3VtZW50ID0gY3JlYXRlRG9jdW1lbnQoKTsKLQkJCXRoaXMuZG9jdW1lbnQuc2V0TW9kZWwodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG51bGw7Ci0JCXN0cnVjdHVyZWREb2N1bWVudCA9IHN1cGVyLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCi0JCS8vIHRoZSBmaXJzdCB0aW1lCi0JCUFzc2VydC5pc05vdE51bGwoZ2V0TW9kZWxIYW5kbGVyKCkpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZ2V0TW9kZWxIYW5kbGVyKCkuZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oaW50IG9mZnNldCkgewotCQlpZiAoZ2V0RG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZ2V0RG9jdW1lbnQoKSkuZ2V0Q29udGFpbmVyTm9kZShvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldE93bmVyRE9NTm9kZSgpIHsKLQkJcmV0dXJuIG93bmVyTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb3duZXJOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIGlmIHRoZSBjYXNlIG9mIGV4dGVybmFsIENTUyBtb2RlbCwgeW91Ci0JICogICAgICAgICAgICBzaG91bGQgc2V0IG51bGwsIGVsc2UgaWYgaW50ZXJuYWwgY3NzLCB5b3Ugc2hvdWxkIHNldAotCSAqICAgICAgICAgICAgU1RZTEUtdGFnIG5vZGUsIGVsc2UgaWYgaW5saW5lIGNzcywgeW91IHNob3VsZCBzZXQgdGhlCi0JICogICAgICAgICAgICBlbGVtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHN0eWxlLWF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPd25lckRPTU5vZGUoTm9kZSBub2RlKSB7Ci0JCS8vIHByb2hpYml0IG93bmVyIGNoYW5nZQotCQlBc3NlcnQuaXNUcnVlKG93bmVyTm9kZSA9PSBudWxsKTsKLQkJb3duZXJOb2RlID0gbm9kZTsKLQkJaWYgKG93bmVyTm9kZSAhPSBudWxsKSB7IC8vIGZvciBpbnRlcm5hbC9pbmxpbmUgQ1NTIGNvbnRleHQKLQkJCXRyeSB7Ci0JCQkJc2V0SWQoSURfTk9OX0VYVEVSTkFMX0NTUyk7Ci0JCQl9Ci0JCQljYXRjaCAoUmVzb3VyY2VJblVzZSBlKSB7Ci0JCQkJLy8gaW1wb3NzaWJsZQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTTW9kZWxQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAoZlBhcnNlciA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJZlBhcnNlciA9IG5ldyBDU1NNb2RlbFBhcnNlcihkb2N1bWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFN0eWxlTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gZ2V0U3R5bGVOb3RpZmllcigpLmdldFN0eWxlTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0U3R5bGVTaGVldFR5cGUoKSB7Ci0JCWlmIChnZXREb2N1bWVudCgpIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbGFyYXRpb24pCi0JCQlyZXR1cm4gSU5MSU5FOwotCQlpZiAoZ2V0T3duZXJET01Ob2RlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBFTUJFRERFRDsKLQkJZWxzZQotCQkJcmV0dXJuIEVYVEVSTkFMOwotCX0KLQotCXByaXZhdGUgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyIGdldFN0eWxlTm90aWZpZXIoKSB7Ci0JCWlmIChzdHlsZU5vdGlmaWVyID09IG51bGwpIHsKLQkJCXN0eWxlTm90aWZpZXIgPSAob3duZXJOb2RlICE9IG51bGwpID8gbmV3IENTU0VtYmVkZWRTdHlsZU5vdGlmeUFkYXB0ZXIodGhpcykgOiBuZXcgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBzdHlsZU5vdGlmaWVyOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTW9kZWxVcGRhdGVyIGdldFVwZGF0ZXIoKSB7Ci0JCWlmIChmVXBkYXRlciA9PSBudWxsKSB7Ci0JCQlmVXBkYXRlciA9IG5ldyBDU1NNb2RlbFVwZGF0ZXIodGhpcyk7Ci0JCQlmVXBkYXRlci5zZXRQYXJzZXIoZ2V0UGFyc2VyKCkpOwotCQl9Ci0JCXJldHVybiBmVXBkYXRlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlY29yZGluZygpIHsKLQkJcmV0dXJuIGdldFN0eWxlTm90aWZpZXIoKS5pc1JlY29yZGluZygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7Ci0JCXJldHVybiAoZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBFWFRFUk5BTCkgJiYgc3VwZXIuaXNTaGFyZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCBmb3IgdGhlIGNhc2UKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSkKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmbGF0Tm9kZXMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uTGlzdCgpOwotCQlpZiAoZmxhdE5vZGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IHRydWU7Ci0KLQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGdldERvY3VtZW50KCkpLnJlbW92ZUNoaWxkTm9kZXMoKTsKLQotCQlDU1NNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJcGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJcGFyc2VyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGZsYXROb2RlcywgbnVsbCk7Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIG5vQ2hhbmdlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJLy8gbm9wCi0JfQotCi0JcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID09IG51bGwgJiYgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gdHJ1ZTsKLQotCQlDU1NNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJcGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmlzRW50aXJlRG9jdW1lbnRSZXBsYWNlZCgpKQotCQkJcGFyc2VyLnJlcGxhY2VEb2N1bWVudChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQkJZWxzZQotCQkJcGFyc2VyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBjbGVhbnVwIC0+IHJlYnVpbGQgQ1NTIE5vZGVzIFRoaXMgaXMgcHJlLWJldGEgZml4IGZvciAxNzgxNzYuCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaE5vZGVzKCkgewotCQkvLyBjbGVhbnVwIG9sZCBub2RlcwotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gdHJ1ZTsKLQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGdldERvY3VtZW50KCkpLnJlbW92ZUNoaWxkTm9kZXMoKTsKLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IGZhbHNlOwotCi0JCWdldFBhcnNlcigpLmNsZWFudXBVcGRhdGVDb250ZXh0KCk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJU3RyaW5nIHNvdXJjZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRUZXh0KCk7Ci0KLQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHRoaXMsIDAsIHNvdXJjZS5sZW5ndGgoKSwgbnVsbCk7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dCh0aGlzLCAwLCAwLCBzb3VyY2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFJlZ2lvbigpOwotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSB0cnVlOwotCi0JCUNTU01vZGVsUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQlwYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50RXZlbnQoc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCQlwYXJzZXIuY2hhbmdlUmVnaW9uKGZsYXROb2RlLCByZWdpb24pOwotCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T2xkUmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE5ld1JlZ2lvbnMoKTsKLQkJaWYgKG9sZFJlZ2lvbnMgPT0gbnVsbCAmJiBuZXdSZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IHRydWU7Ci0KLQkJQ1NTTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCXBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0JCXBhcnNlci5yZXBsYWNlUmVnaW9ucyhmbGF0Tm9kZSwgbmV3UmVnaW9ucywgb2xkUmVnaW9ucyk7Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IGZhbHNlOwotCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21FZGl0KCkgewotCQljbG9zZUltcG9ydGVkKCk7Ci0JCWlmIChnZXRTdHlsZVNoZWV0VHlwZSgpID09IEVYVEVSTkFMKSB7Ci0JCQlzdXBlci5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQkJY2xvc2VJbXBvcnRlZCgpOwotCQlpZiAoZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBFWFRFUk5BTCkgewotCQkJc3VwZXIucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5ldmVudC5DU1NTdHlsZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU3R5bGVMaXN0ZW5lcihJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlnZXRTdHlsZU5vdGlmaWVyKCkucmVtb3ZlU3R5bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgb2xkU3RydWN0dXJlZERvY3VtZW50ID0gc3VwZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50KQotCQkJcmV0dXJuOyAvLyBub3RpbmcgdG8gZG8KLQotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpCi0JCQlvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQobmV3U3RydWN0dXJlZERvY3VtZW50KTsKLQotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJbmV3TW9kZWwobmV3IE5ld0RvY3VtZW50RXZlbnQobmV3U3RydWN0dXJlZERvY3VtZW50LCB0aGlzKSk7Ci0JCQl9Ci0JCQluZXdTdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNyY01vZGVsCi0JICogICAgICAgICAgICBjb20uaW1iLnNlZC5jc3MubW9kZS5pbnRlZmFjZXMuSUNTU01vZGVsCi0JICogQHBhcmFtIHJlbW92ZWQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NTZWxlY3RvcltdCi0JICogQHBhcmFtIGFkZGVkCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU2VsZWN0b3JbXQotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlQ2hhbmdlZChJQ1NTTW9kZWwgc3JjTW9kZWwsIElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpIHsKLQkJZ2V0U3R5bGVOb3RpZmllcigpLnN0eWxlQ2hhbmdlZChzcmNNb2RlbCwgcmVtb3ZlZCwgYWRkZWQsIG1lZGlhKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3JjTW9kZWwKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NNb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlVXBkYXRlKElDU1NNb2RlbCBzcmNNb2RlbCkgewotCQlnZXRTdHlsZU5vdGlmaWVyKCkuc3R5bGVVcGRhdGUoc3JjTW9kZWwpOwotCX0KLQotCXZvaWQgdmFsdWVDaGFuZ2VkKENTU05vZGVJbXBsIG5vZGUsIFN0cmluZyBvbGRWYWx1ZSkgewotCQlpZiAoIWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUpIHsKLQkJCUNTU01vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0VXBkYXRlcigpOwotCQkJdXBkYXRlci52YWx1ZUNoYW5nZWQobm9kZSwgb2xkVmFsdWUpOwotCQl9Ci0KLQkJSUNTU1NlbGVjdG9yIHJlbW92ZWRbXSA9IG51bGwsIGFkZGVkW10gPSBudWxsOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSAmJiAoKENTU0F0dHJJbXBsKSBub2RlKS5nZXROYW1lKCkuZXF1YWxzKElDU1NTdHlsZVJ1bGUuU0VMRUNUT1IpKSB7Ci0JCQkJQ1NTQXR0ckltcGwgYXR0ciA9IChDU1NBdHRySW1wbCkgbm9kZTsKLQkJCQkvLyBjb2xsZWN0IGNoYW5nZWQgc2VsZWN0b3IKLQkJCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChhdHRyLmdldFZhbHVlKCkpOwotCQkJCWFkZGVkID0gbmV3IElDU1NTZWxlY3RvcltsaXN0LmdldExlbmd0aCgpXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQkJYWRkZWRbaV0gPSBsaXN0LmdldFNlbGVjdG9yKGkpOwotCi0JCQkJLy8gZ2V0IG9sZCB2YWx1ZQotCQkJCWxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChvbGRWYWx1ZSk7Ci0JCQkJcmVtb3ZlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbbGlzdC5nZXRMZW5ndGgoKV07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0JCQkJCXJlbW92ZWRbaV0gPSBsaXN0LmdldFNlbGVjdG9yKGkpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgewotCQkJCUlDU1NOb2RlIHJ1bGUgPSBub2RlOwotCQkJCXdoaWxlIChydWxlICE9IG51bGwpIHsKLQkJCQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKQotCQkJCQkJYnJlYWs7Ci0JCQkJCXJ1bGUgPSBydWxlLmdldFBhcmVudE5vZGUoKTsKLQkJCQl9Ci0JCQkJaWYgKHJ1bGUgIT0gbnVsbCkgewotCQkJCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSAoKElDU1NTdHlsZVJ1bGUpIHJ1bGUpLmdldFNlbGVjdG9ycygpOwotCQkJCQlhZGRlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbbGlzdC5nZXRMZW5ndGgoKV07Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotCQkJCQkJYWRkZWRbaV0gPSBsaXN0LmdldFNlbGVjdG9yKGkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAocmVtb3ZlZCAhPSBudWxsIHx8IGFkZGVkICE9IG51bGwgfHwgZ2V0RG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkgewotCQkJLy8gc2VuZCBzZWxlY3RvciBjaGFuZ2VkIGV2ZW50Ci0JCQlnZXRTdHlsZU5vdGlmaWVyKCkuZmlyZShyZW1vdmVkLCBhZGRlZCwgbnVsbCk7Ci0JCX0KLQkJLy8gZm9yIGhyZWYgYXR0cmlidXRlCi0JCWlmIChnZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwgJiYgZ2V0U3R5bGVMaXN0ZW5lcnMoKS5zaXplKCkgPiAwKSB7Ci0JCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgbm9kZSkuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTSW1wb3J0UnVsZS5IUkVGKSkgewotCQkJCSgoSUNTU0ltcG9ydFJ1bGUpICgoSUNTU0F0dHIpIG5vZGUpLmdldE93bmVyQ1NTTm9kZSgpKS5nZXRTdHlsZVNoZWV0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsTm9kZUZlZWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbE5vZGVGZWVkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlNjQ4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsTm9kZUZlZWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU01vZGVsTm9kZUZlZWRlciB7Ci0JLyoqCi0JICogY3VycmVudGx5IElDU1NEb2N1bWVudCBpcyB1c2VkIGJ1dCBtYXkgZ28gYmFjayB0byBDU1NEb2N1bWVudEltcGwgaW4gZnV0dXJlLgotCSAqLwotCUlDU1NEb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCUNTU01vZGVsVXBkYXRlQ29udGV4dCBmVXBkYXRlQ29udGV4dCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NNb2RlbE5vZGVGZWVkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NNb2RlbE5vZGVGZWVkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ1NTTW9kZWxOb2RlRmVlZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogY3VycmVudGx5IElDU1NEb2N1bWVudCBpcyB1c2VkIGJ1dCBtYXkgZ28gYmFjayB0byBDU1NEb2N1bWVudEltcGwgaW4gZnV0dXJlLgotCSAqLwotCUNTU01vZGVsTm9kZUZlZWRlcihJQ1NTRG9jdW1lbnQgZG9jdW1lbnQsIENTU01vZGVsVXBkYXRlQ29udGV4dCB1cGRhdGVDb250ZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmVXBkYXRlQ29udGV4dCA9IHVwZGF0ZUNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTQ2hhcnNldFJ1bGVJbXBsIGdldENTU0NoYXJzZXRSdWxlKCkgewotCQlDU1NDaGFyc2V0UnVsZUltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NDaGFyc2V0UnVsZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDU1NDaGFyc2V0UnVsZUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NDaGFyc2V0UnVsZSgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU0ZvbnRGYWNlUnVsZUltcGwgZ2V0Q1NTRm9udEZhY2VSdWxlKCkgewotCQlDU1NGb250RmFjZVJ1bGVJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q1NTRm9udEZhY2VSdWxlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU0ZvbnRGYWNlUnVsZUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NGb250RmFjZVJ1bGUoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NJbXBvcnRSdWxlSW1wbCBnZXRDU1NJbXBvcnRSdWxlKCkgewotCQlDU1NJbXBvcnRSdWxlSW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENTU0ltcG9ydFJ1bGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTSW1wb3J0UnVsZUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NJbXBvcnRSdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTTWVkaWFSdWxlSW1wbCBnZXRDU1NNZWRpYVJ1bGUoKSB7Ci0JCUNTU01lZGlhUnVsZUltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NNZWRpYVJ1bGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTTWVkaWFSdWxlSW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU01lZGlhUnVsZSgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1BhZ2VSdWxlSW1wbCBnZXRDU1NQYWdlUnVsZSgpIHsKLQkJQ1NTUGFnZVJ1bGVJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q1NTUGFnZVJ1bGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTUGFnZVJ1bGVJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTUGFnZVJ1bGUoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTdHlsZVJ1bGVJbXBsIGdldENTU1N0eWxlUnVsZSgpIHsKLQkJQ1NTU3R5bGVSdWxlSW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENTU1N0eWxlUnVsZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDU1NTdHlsZVJ1bGVJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTU3R5bGVSdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWU5NzFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTWVkaWFSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NSdWxlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQ29yZU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlRleHRSZWdpb25MaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotCi0vKioKLSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NNb2RlbFBhcnNlciB7Ci0KLQlwcml2YXRlIElDU1NEb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQgZkNyZWF0aW9uQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NNb2RlbERlbGV0aW9uQ29udGV4dCBmRGVsZXRpb25Db250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIENTU01vZGVsVXBkYXRlQ29udGV4dCBmVXBkYXRlQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NNb2RlbE5vZGVGZWVkZXIgZkZlZWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIgZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlciA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZQYXJzZUZsb2F0aW5nID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDU1NNb2RlbFBhcnNlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgQ1NTTW9kZWxQYXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogY3VycmVudGx5IHByb3ZkZWQgdGhpcyBtZXRob2QgYnV0IG1heSBiZSByZW1vdmVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhcnNlRmxvYXRpbmcoKXsKLQkJcmV0dXJuIGZQYXJzZUZsb2F0aW5nOwotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHJvdmRlZCB0aGlzIG1ldGhvZCBidXQgbWF5IGJlIHJlbW92ZWQgaW4gZnV0dXJlLgotCSAqLwotCXByb3RlY3RlZCBDU1NNb2RlbENyZWF0aW9uQ29udGV4dCBnZXRDcmVhdGlvbkNvbnRleHQoKXsKLQkJcmV0dXJuIGZDcmVhdGlvbkNvbnRleHQ7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwcm92ZGVkIHRoaXMgbWV0aG9kIGJ1dCBtYXkgYmUgcmVtb3ZlZCBpbiBmdXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNVcGRhdGVDb250ZXh0QWN0aXZlKCl7Ci0JCXJldHVybiBmVXBkYXRlQ29udGV4dCAhPSBudWxsID8gZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSA6IGZhbHNlOwotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXB1YmxpYyBDU1NNb2RlbFBhcnNlcihJQ1NTRG9jdW1lbnQgZG9jKSB7Ci0JCXRoaXMoKTsKLQkJZkRvY3VtZW50ID0gZG9jOwotCQlmQ3JlYXRpb25Db250ZXh0ID0gbmV3IENTU01vZGVsQ3JlYXRpb25Db250ZXh0KChDU1NOb2RlSW1wbClkb2MpOwotCQlmRGVsZXRpb25Db250ZXh0ID0gbmV3IENTU01vZGVsRGVsZXRpb25Db250ZXh0KGRvYyk7Ci0JCWZVcGRhdGVDb250ZXh0ID0gbmV3IENTU01vZGVsVXBkYXRlQ29udGV4dCgpOwotCQlmRmVlZGVyID0gbmV3IENTU01vZGVsTm9kZUZlZWRlcihkb2MsIGZVcGRhdGVDb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG5ldyBDb3JlTm9kZUxpc3QoZmxhdE5vZGUsIGZsYXROb2RlKSwgbmV3IENvcmVOb2RlTGlzdChmbGF0Tm9kZSwgZmxhdE5vZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGNoYW5nZVJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwgfHwgcmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZkRvY3VtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTmV4dE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgU3RyaW5nIHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0ID0gQ1NTVXRpbC5maW5kTmV4dFNpZ25pZmljYW50Tm9kZShmbGF0Tm9kZSk7Ci0JCWlmIChDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUobmV4dCkgPT0gdHlwZSkgewotCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRSZXBhcnNlU3RhcnQoZmxhdE5vZGUuZ2V0RW5kKCkpOwotCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRSZXBhcnNlRW5kKG5leHQuZ2V0RW5kKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXBEZWxldGlvbkNvbnRleHQoKSB7Ci0JCS8vIHNldHVwRGVsZXRpb25Db250ZXh0KG51bGwpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gY2xlYW51cEZpcnN0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSwgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHRhcmdldCkgewotCQlpZiAoZmlyc3ROb2RlID09IG51bGwgfHwgdGFyZ2V0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChmaXJzdE5vZGUgPT0gdGFyZ2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dE5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmdldE5leHROb2RlSW5DdXJyZW50KGZpcnN0Tm9kZSk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gdGFyZ2V0LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChsYXN0Tm9kZSA9PSBudWxsIHx8IGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuaXNPbGROb2RlKGxhc3ROb2RlKSB8fCBuZXh0Tm9kZSA9PSBudWxsIHx8IGxhc3ROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPCBuZXh0Tm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJdGFyZ2V0LnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwsIG51bGwpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGFyZ2V0LnNldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5leHROb2RlKTsKLQkJCX0KLQkJCUlDU1NOb2RlIHBhcmVudCA9IHRhcmdldC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJY2xlYW51cEZpcnN0Tm9kZShmaXJzdE5vZGUsIChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBjbGVhbnVwTGFzdE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSwgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHRhcmdldCkgewotCQlpZiAobGFzdE5vZGUgPT0gbnVsbCB8fCB0YXJnZXQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGxhc3ROb2RlID09IHRhcmdldC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldk5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmdldFByZXZOb2RlSW5DdXJyZW50KGxhc3ROb2RlKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gdGFyZ2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmlyc3ROb2RlID09IG51bGwgfHwgZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5pc09sZE5vZGUoZmlyc3ROb2RlKSB8fCBwcmV2Tm9kZSA9PSBudWxsIHx8IHByZXZOb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPCBmaXJzdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCXRhcmdldC5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsLCBudWxsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRhcmdldC5zZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHByZXZOb2RlKTsKLQkJCX0KLQkJCUlDU1NOb2RlIHBhcmVudCA9IHRhcmdldC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJY2xlYW51cExhc3ROb2RlKGxhc3ROb2RlLCAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBjbGVhbnVwVXBkYXRlQ29udGV4dCgpIHsKLQkJaW50IHJlbWFpbnMgPSBmVXBkYXRlQ29udGV4dC5nZXROb2RlQ291bnQoKTsKLQkJZlVwZGF0ZUNvbnRleHQuY2xlYW51cENvbnRleHQoKTsKLQkJcmV0dXJuIHJlbWFpbnM7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGZsb2F0aW5nIENTUyBydWxlIChvd25lciBkb2N1bWVudCB3aWxsIGJlIHNldCkgdGhpcyBpcyBmb3IKLQkgKiBDU1NTdHlsZVNoZWV0LmNyZWF0ZUNTU1J1bGUoU3RyaW5nKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKi8KLQlDU1NSdWxlIGNyZWF0ZUNTU1J1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzKSB7Ci0JCWlmIChmbGF0Tm9kZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmUGFyc2VGbG9hdGluZyA9IHRydWU7Ci0KLQkJLy8gc2V0dXAgY3JlYXRpb24gY29udGV4dAotCQlmQ3JlYXRpb25Db250ZXh0LmNsZWFyKCk7Ci0JCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShudWxsKTsKLQkJZkNyZWF0aW9uQ29udGV4dC5zZXROZXh0Tm9kZShudWxsKTsKLQkJQ1NTUnVsZUltcGwgcGFyZW50UnVsZSA9IG51bGw7Ci0KLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gZmxhdE5vZGVzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlDU1NOb2RlSW1wbCBtb2RpZmllZCA9IGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlpZiAocGFyZW50UnVsZSA9PSBudWxsICYmIG1vZGlmaWVkIGluc3RhbmNlb2YgQ1NTUnVsZUltcGwpIHsKLQkJCQlwYXJlbnRSdWxlID0gKENTU1J1bGVJbXBsKSBtb2RpZmllZDsKLQkJCX0KLQkJfQotCi0JCWZQYXJzZUZsb2F0aW5nID0gZmFsc2U7Ci0KLQkJaWYgKHBhcmVudFJ1bGUgIT0gbnVsbCkgewotCQkJQ1NTTW9kZWxVdGlsLmNsZWFudXBDb250YWluZXIocGFyZW50UnVsZSk7Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50UnVsZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZEJyYWNlQ2xvc2UoaW50IGRlcHRoLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0LCBib29sZWFuIGJCcmVha1NpYmxpbmcpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXN1bHQgPSBudWxsOwotCQlpbnQgYnJhY2VMZXZlbCA9IDA7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldk5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IHN0YXJ0LmdldE5leHQoKTsKLQkJZm9yICg7IHJlZ2lvbiAhPSBudWxsOyByZWdpb24gPSByZWdpb24uZ2V0TmV4dCgpKSB7Ci0JCQlpbnQgb2Zmc2V0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQlpZiAob2Zmc2V0IDwgMCkgewotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJQ1NTTm9kZUltcGwgbm9kZSA9IGdldE5vZGVBdChvZmZzZXQpOwotCQkJaW50IGRlcHRoSGl0ID0gKG5vZGUgIT0gbnVsbCkgPyBDU1NNb2RlbFV0aWwuZ2V0RGVwdGgobm9kZSkgOiAtMTsKLQkJCWlmIChkZXB0aCA8PSBkZXB0aEhpdCkgewotCQkJCS8vIHNpYmxpbmcgaXMgZm91bmQgYmVmb3JlICJ9IgotCQkJCWlmIChiQnJlYWtTaWJsaW5nKSB7Ci0JCQkJCUNTU05vZGVJbXBsIHBhcmVudCA9IChDU1NOb2RlSW1wbCkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCXdoaWxlIChkZXB0aCA8PSBDU1NNb2RlbFV0aWwuZ2V0RGVwdGgocGFyZW50KSkgewotCQkJCQkJbm9kZSA9IHBhcmVudDsKLQkJCQkJCXBhcmVudCA9IChDU1NOb2RlSW1wbCkgcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJfQotCQkJCQlpZiAocGFyZW50ICE9IG51bGwgJiYgbm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IHByZXZOb2RlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgdHlwZSA9IENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShyZWdpb24pOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCWJyYWNlTGV2ZWwrKzsKLQkJCX0KLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCQlicmFjZUxldmVsLS07Ci0JCQkJaWYgKGJyYWNlTGV2ZWwgPCAwKSB7Ci0JCQkJCXJlc3VsdCA9IHJlZ2lvbjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcHJldk5vZGUgPSByZWdpb247Ci0JCX0KLQotCQlpZiAocmVzdWx0ID09IG51bGwgJiYgcmVnaW9uID09IG51bGwpIHsKLQkJCS8vIHJlYWNoIHRoZSBlbmQgb2YgZG9jdW1lbnQKLQkJCXJlc3VsdCA9IHByZXZOb2RlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5vZGVMaXN0ID0gbnVsbDsKLQkJaWYgKDAgPD0gc3RhcnQgJiYgc3RhcnQgPD0gZW5kKSB7Ci0JCQlJQ1NTTW9kZWwgbW9kZWwgPSBmRG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIENTU01vZGVsSW1wbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKChDU1NNb2RlbEltcGwpIG1vZGVsKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZW5kIC0gMSk7Ci0JCQkJCWlmIChzdGFydE5vZGUgIT0gbnVsbCAmJiBlbmROb2RlICE9IG51bGwpIHsKLQkJCQkJCW5vZGVMaXN0ID0gbmV3IENvcmVOb2RlTGlzdChzdGFydE5vZGUsIGVuZE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5vZGVMaXN0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgZ2V0Tm9kZUF0KGludCBvZmZzZXQpIHsKLQkJQ1NTTm9kZUltcGwgcm9vdE5vZGUgPSBmQ3JlYXRpb25Db250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCUlDU1NOb2RlIHRhcmdldCA9IHJvb3ROb2RlLmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgQ1NTTm9kZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTTm9kZUltcGwpIHRhcmdldDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRCcmFjZUNsb3NlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCUlDU1NOb2RlIHRhcmdldCA9IENTU01vZGVsVXRpbC5maW5kQnJhY2VDb250YWluZXIoZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCkpOwotCi0JCWlmICghKHRhcmdldCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHBhcmVudCA9IChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHRhcmdldDsKLQkJaWYgKENTU01vZGVsVXRpbC5pc0ludGVycnVwdGlvbihwYXJlbnQsIHJlZ2lvbikpIHsKLQkJCUlDU1NOb2RlIG5vZGUgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NOb2RlSW1wbCkgewotCQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0UmVwYXJzZVN0YXJ0KHBhcmVudC5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlmQ3JlYXRpb25Db250ZXh0LnNldFJlcGFyc2VFbmQocGFyZW50LmdldEVuZE9mZnNldCgpKTsKLQkJCQkoKENTU05vZGVJbXBsKSBub2RlKS5yZW1vdmVDaGlsZChwYXJlbnQpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSUNTU1BhZ2VSdWxlIHx8IHBhcmVudCBpbnN0YW5jZW9mIElDU1NNZWRpYVJ1bGUgfHwgcGFyZW50IGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlIHx8IHBhcmVudCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCUNTU01vZGVsVXRpbC5leHBhbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIocGFyZW50LCByZWdpb24pOwotCQkJaWYgKCFDU1NNb2RlbFV0aWwuaXNCcmFjZUNsb3NlZCh0YXJnZXQpKSB7Ci0JCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHBhcmVudC5nZXRQYXJlbnROb2RlKCkpOwotCQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0TmV4dE5vZGUocGFyZW50LmdldE5leHRTaWJsaW5nKCkpOwotCQkJCXJldHVybiBwYXJlbnQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydEJyYWNlT3BlbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGtleVJlZ2lvbiA9IENTU1V0aWwuZmluZFByZXZpb3VzU2lnbmlmaWNhbnROb2RlKHJlZ2lvbik7Ci0JCWlmIChrZXlSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKCFmUGFyc2VGbG9hdGluZykgewotCQkJQ1NTTm9kZUltcGwgbm9kZSA9IGdldE5vZGVBdChrZXlSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpZiAobm9kZSAhPSBudWxsICYmICEobm9kZSBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCVN0cmluZyB0eXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGtleVJlZ2lvbik7Ci0KLQkJQ1NTTm9kZUltcGwgaW5zZXJ0ZWQgPSBudWxsOwotCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSkgewotCQkJaW5zZXJ0ZWQgPSBpbnNlcnRQYWdlUnVsZShrZXlSZWdpb24sIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEpIHsKLQkJCWluc2VydGVkID0gaW5zZXJ0TWVkaWFSdWxlKGtleVJlZ2lvbiwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT05UX0ZBQ0UpIHsKLQkJCWluc2VydGVkID0gaW5zZXJ0Rm9udEZhY2VSdWxlKGtleVJlZ2lvbiwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChDU1NVdGlsLmlzU2VsZWN0b3JUZXh0KGtleVJlZ2lvbikpIHsKLQkJCWluc2VydGVkID0gaW5zZXJ0U3R5bGVSdWxlKGtleVJlZ2lvbiwgcmVnaW9uKTsKLQkJfQotCi0JCWlmIChpbnNlcnRlZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJLy8gQ1NTTW9kZWxVdGlsLmV4cGFuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcigoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKWluc2VydGVkLAotCQkJLy8gZmxhdE5vZGUpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBicmFjZUNsb3NlID0gZmluZEJyYWNlQ2xvc2UoQ1NTTW9kZWxVdGlsLmdldERlcHRoKGluc2VydGVkKSwgcmVnaW9uLCAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEpKTsKLQkJCWlmIChicmFjZUNsb3NlICE9IG51bGwpIHsKLQkJCQlmQ3JlYXRpb25Db250ZXh0LnNldFJlcGFyc2VTdGFydChyZWdpb24uZ2V0RW5kKCkpOwotCQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0UmVwYXJzZUVuZChicmFjZUNsb3NlLmdldEVuZCgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpbnNlcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydENoYXJzZXRSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYmVnaW5Eb2NSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kRG9jUmVnaW9uKSB7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAoIWZQYXJzZUZsb2F0aW5nICYmICEocGFyZW50IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbChiZWdpbkRvY1JlZ2lvbi5nZXRSZWdpb25zKCkpOwotCQlyZWdpb25zLnJlbW92ZSgwKTsgLy8gbXVzdCBiZSAiQGNoYXJzZXQiCi0JCUlUZXh0UmVnaW9uIGVuY29kaW5nUmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKCFyZWdpb25zLmlzRW1wdHkoKSkgewotCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IHJlZ2lvbnMucmVtb3ZlKDApOwotCQkJaWYgKHRleHRSZWdpb24gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIHR5cGUgPSB0ZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcpIHsKLQkJCQllbmNvZGluZ1JlZ2lvbiA9IHRleHRSZWdpb247Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZW5jb2RpbmdSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NDaGFyc2V0UnVsZUltcGwgcnVsZSA9IGZGZWVkZXIuZ2V0Q1NTQ2hhcnNldFJ1bGUoKTsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCXJ1bGUuc2V0QXR0cmlidXRlKElDU1NDaGFyc2V0UnVsZS5FTkNPRElORywgYmVnaW5Eb2NSZWdpb24uZ2V0VGV4dChlbmNvZGluZ1JlZ2lvbikpOwotCQl9Ci0KLQkJLy8gc2V0dXAgZmxhdCBjb250YWluZXIKLQkJcnVsZS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihiZWdpbkRvY1JlZ2lvbiwgZW5kRG9jUmVnaW9uKTsKLQkJQ1NTQXR0ckltcGwgYXR0ciA9IHJ1bGUuZ2V0QXR0cmlidXRlTm9kZShJQ1NTQ2hhcnNldFJ1bGUuRU5DT0RJTkcpOwotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRyLnNldFJhbmdlUmVnaW9uKGJlZ2luRG9jUmVnaW9uLCBlbmNvZGluZ1JlZ2lvbiwgZW5jb2RpbmdSZWdpb24pOwotCQl9Ci0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHJ1bGUsIG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFyZW50LmFwcGVuZENoaWxkKHJ1bGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTTm9kZUltcGwgaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChmQ3JlYXRpb25Db250ZXh0ID09IG51bGwgfHwgcmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIHR5cGUgPSAoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSByZWdpb24pLmdldFR5cGUoKTsKLQkJQ1NTTm9kZUltcGwgbW9kaWZpZWQgPSBudWxsOwotCi0JCUlDU1NOb2RlIHRhcmdldCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCi0JCWlmICgoZlBhcnNlRmxvYXRpbmcgJiYgdGFyZ2V0ID09IG51bGwpIHx8IHRhcmdldCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSB7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSKSB7Ci0JCQkJbW9kaWZpZWQgPSBpbnNlcnRTZW1pQ29sb25Gb3JSdWxlKHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCQltb2RpZmllZCA9IGluc2VydEJyYWNlT3BlbihyZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkJbW9kaWZpZWQgPSBpbnNlcnRCcmFjZUNsb3NlKHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSB8fCBDU1NVdGlsLmlzU2VsZWN0b3JUZXh0KHJlZ2lvbikpIHsKLQkJCQljaGVja05leHROb2RlKHJlZ2lvbiwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19JTVBPUlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCkgewotCQkJCWNoZWNrTmV4dE5vZGUocmVnaW9uLCBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICgodGFyZ2V0IGluc3RhbmNlb2YgQ1NTUnVsZURlY2xDb250YWluZXIgfHwgdGFyZ2V0IGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbikgJiYgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fUFJPUEVSVFkpIHsKLQkJCW1vZGlmaWVkID0gaW5zZXJ0U3R5bGVEZWNsYXJhdGlvbkl0ZW0ocmVnaW9uKTsKLQkJfQotCQllbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSAmJiB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCW1vZGlmaWVkID0gaW5zZXJ0U2VtaUNvbG9uRm9yU3R5bGVEZWNsYXJhdGlvbkl0ZW0ocmVnaW9uKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCW1vZGlmaWVkID0gaW5zZXJ0QnJhY2VDbG9zZShyZWdpb24pOwotCQl9Ci0KLQkJLy8gcG9zdCBwcm9jZXNzCi0JCWlmIChtb2RpZmllZCAhPSBudWxsKSB7Ci0JCQlpZiAobW9kaWZpZWQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbW9kaWZpZWQpLnByb3BhZ2F0ZVJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCkgewotCQlmb3IgKEVudW1lcmF0aW9uIGUgPSByZWdpb25MaXN0LmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihyZWdpb24pOwotCQkJaWYgKGZDcmVhdGlvbkNvbnRleHQuaXNUb1JlcGFyc2UoKSkgewotCQkJCWludCBvcmlnU3RhcnQgPSByZWdpb24uZ2V0RW5kKCk7Ci0JCQkJaW50IG9yaWdFbmQgPSByZWdpb25MaXN0Lml0ZW0ocmVnaW9uTGlzdC5nZXRMZW5ndGgoKSAtIDEpLmdldEVuZCgpOwotCQkJCWludCBuZXdTdGFydCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0UmVwYXJzZVN0YXJ0KCk7Ci0JCQkJaW50IG5ld0VuZCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0UmVwYXJzZUVuZCgpOwotCQkJCWlmIChuZXdTdGFydCA8IG9yaWdTdGFydCB8fCBvcmlnRW5kIDwgbmV3RW5kKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld05vZGVMaXN0ID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdChuZXdTdGFydCwgbmV3RW5kKTsKLQkJCQkJc2V0dXBDcmVhdGlvbkNvbnRleHQobmV3Tm9kZUxpc3QuaXRlbSgwKSk7Ci0JCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobmV3Tm9kZUxpc3QpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmQ3JlYXRpb25Db250ZXh0LnJlc2V0UmVwYXJzZVJhbmdlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRGb250RmFjZVJ1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYnJhY2VOb2RlKSB7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAoIWZQYXJzZUZsb2F0aW5nICYmICEocGFyZW50IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU0ZvbnRGYWNlUnVsZUltcGwgcnVsZSA9IGZGZWVkZXIuZ2V0Q1NTRm9udEZhY2VSdWxlKCk7Ci0JCWlmIChydWxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gc2V0dXAgZmxhdCBjb250YWluZXIKLQkJcnVsZS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihyZWdpb24sIGJyYWNlTm9kZSk7Ci0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHJ1bGUsIG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFyZW50LmFwcGVuZENoaWxkKHJ1bGUpOwotCQkJfQotCQl9Ci0KLQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHJ1bGUpOwotCQkvLyBUYXJnZXROZXh0IGlzIHNldCB0byBudWxsIGF1dG9tYXRpY2FsbHkKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydEltcG9ydFJ1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBiZWdpbkRvY1JlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmREb2NSZWdpb24pIHsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWlmICghZlBhcnNlRmxvYXRpbmcgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lcikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKGJlZ2luRG9jUmVnaW9uLmdldFJlZ2lvbnMoKSk7Ci0JCXJlZ2lvbnMucmVtb3ZlKDApOyAvLyBtdXN0IGJlICJAaW1wb3J0IgotCQlJVGV4dFJlZ2lvbiBocmVmUmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKCFyZWdpb25zLmlzRW1wdHkoKSkgewotCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IHJlZ2lvbnMucmVtb3ZlKDApOwotCQkJaWYgKHRleHRSZWdpb24gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIHR5cGUgPSB0ZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VUkkgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HKSB7Ci0JCQkJaHJlZlJlZ2lvbiA9IHRleHRSZWdpb247Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoaHJlZlJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU0ltcG9ydFJ1bGVJbXBsIHJ1bGUgPSBmRmVlZGVyLmdldENTU0ltcG9ydFJ1bGUoKTsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NVdGlsLnN0cmlwU3Vycm91bmRpbmdTcGFjZShyZWdpb25zKTsKLQkJTWVkaWFMaXN0SW1wbCBtZWRpYUxpc3QgPSAoTWVkaWFMaXN0SW1wbCkgcnVsZS5nZXRNZWRpYSgpOwotCQlzZXRNZWRpYUxpc3QobWVkaWFMaXN0LCBiZWdpbkRvY1JlZ2lvbiwgcmVnaW9ucyk7Ci0KLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlydWxlLnNldEF0dHJpYnV0ZShJQ1NTSW1wb3J0UnVsZS5IUkVGLCBiZWdpbkRvY1JlZ2lvbi5nZXRUZXh0KGhyZWZSZWdpb24pKTsKLQkJfQotCi0JCS8vIHNldHVwIGZsYXQgY29udGFpbmVyCi0JCXJ1bGUuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oYmVnaW5Eb2NSZWdpb24sIGVuZERvY1JlZ2lvbik7Ci0JCUNTU0F0dHJJbXBsIGF0dHIgPSBydWxlLmdldEF0dHJpYnV0ZU5vZGUoSUNTU0ltcG9ydFJ1bGUuSFJFRik7Ci0JCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24oYmVnaW5Eb2NSZWdpb24sIGhyZWZSZWdpb24sIGhyZWZSZWdpb24pOwotCQl9Ci0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHJ1bGUsIG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFyZW50LmFwcGVuZENoaWxkKHJ1bGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRNZWRpYVJ1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBicmFjZU5vZGUpIHsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWlmICghZlBhcnNlRmxvYXRpbmcgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lcikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTTWVkaWFSdWxlSW1wbCBydWxlID0gZkZlZWRlci5nZXRDU1NNZWRpYVJ1bGUoKTsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoZmxhdE5vZGUuZ2V0UmVnaW9ucygpKTsKLQkJcmVnaW9ucy5yZW1vdmUoMCk7IC8vIG11c3QgYmUgIkBtZWRpYSIKLQotCQlDU1NVdGlsLnN0cmlwU3Vycm91bmRpbmdTcGFjZShyZWdpb25zKTsKLQkJTWVkaWFMaXN0SW1wbCBtZWRpYUxpc3QgPSAoTWVkaWFMaXN0SW1wbCkgcnVsZS5nZXRNZWRpYSgpOwotCQlzZXRNZWRpYUxpc3QobWVkaWFMaXN0LCBmbGF0Tm9kZSwgcmVnaW9ucyk7Ci0KLQkJLy8gc2V0dXAgZmxhdCBjb250YWluZXIKLQkJcnVsZS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSwgYnJhY2VOb2RlKTsKLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KHBhcmVudCwgcnVsZSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQotCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocnVsZSk7Ci0JCS8vIFRhcmdldE5leHQgaXMgc2V0IHRvIG51bGwgYXV0b21hdGljYWxseQotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0UGFnZVJ1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBicmFjZU5vZGUpIHsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWlmICghZlBhcnNlRmxvYXRpbmcgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lcikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gZ2V0IHNlbGVjdG9yIHJlZ2lvbnMKLQkJSVRleHRSZWdpb25MaXN0IHNlbGVjdG9yUmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoZmxhdE5vZGUuZ2V0UmVnaW9ucygpKTsKLQkJc2VsZWN0b3JSZWdpb25zLnJlbW92ZSgwKTsgLy8gbXVzdCBiZSAiQHBhZ2UiCi0JCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKHNlbGVjdG9yUmVnaW9ucyk7Ci0KLQkJQ1NTUGFnZVJ1bGVJbXBsIHJ1bGUgPSBmRmVlZGVyLmdldENTU1BhZ2VSdWxlKCk7Ci0JCWlmIChydWxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlTdHJpbmcgc2VsZWN0b3JTdHIgPSBDU1NVdGlsLmdldFJlZ2lvblRleHQoZmxhdE5vZGUsIHNlbGVjdG9yUmVnaW9ucyk7Ci0JCQlpZiAoMCA8IHNlbGVjdG9yU3RyLmxlbmd0aCgpKSB7Ci0JCQkJcnVsZS5zZXRTZWxlY3RvclRleHQoc2VsZWN0b3JTdHIpOwotCQkJfQotCQl9Ci0KLQkJLy8gc2V0dXAgZmxhdCBjb250YWluZXIKLQkJcnVsZS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSwgYnJhY2VOb2RlKTsKLQkJQ1NTQXR0ckltcGwgYXR0ciA9IHJ1bGUuZ2V0QXR0cmlidXRlTm9kZShJQ1NTUGFnZVJ1bGUuU0VMRUNUT1IpOwotCQlpZiAoYXR0ciAhPSBudWxsICYmIHNlbGVjdG9yUmVnaW9ucyAhPSBudWxsICYmICFzZWxlY3RvclJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQlhdHRyLnNldFJhbmdlUmVnaW9uKGZsYXROb2RlLCBzZWxlY3RvclJlZ2lvbnMuZ2V0KDApLCBzZWxlY3RvclJlZ2lvbnMuZ2V0KHNlbGVjdG9yUmVnaW9ucy5zaXplKCkgLSAxKSk7Ci0JCX0KLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KHBhcmVudCwgcnVsZSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQotCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocnVsZSk7Ci0JCS8vIFRhcmdldE5leHQgaXMgc2V0IHRvIG51bGwgYXV0b21hdGljYWxseQotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0U2VtaUNvbG9uRm9yUnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGtleVJlZ2lvbiA9IENTU1V0aWwuZmluZFByZXZpb3VzU2lnbmlmaWNhbnROb2RlKHJlZ2lvbik7Ci0JCVN0cmluZyB0eXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGtleVJlZ2lvbik7Ci0KLQkJQ1NTTm9kZUltcGwgaW5zZXJ0ZWQgPSBudWxsOwotCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUKSB7Ci0JCQlpbnNlcnRlZCA9IGluc2VydEltcG9ydFJ1bGUoa2V5UmVnaW9uLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVQpIHsKLQkJCWluc2VydGVkID0gaW5zZXJ0Q2hhcnNldFJ1bGUoa2V5UmVnaW9uLCByZWdpb24pOwotCQl9Ci0KLQkJcmV0dXJuIGluc2VydGVkOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0U2VtaUNvbG9uRm9yU3R5bGVEZWNsYXJhdGlvbkl0ZW0oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJLy8gb25seSB0YXJnZXQvbmV0IG5vZGUgaXMgY2hhbmdlZC4gbm90aGluZyB0byBkby4KLQotCQlDU1NOb2RlSW1wbCB0YXJnZXROb2RlID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWlmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pIHsKLQkJCWludCBvZmZzZXQgPSB0YXJnZXROb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkvLyB3aWRlbiBkb2N1bWVudCByZWdpb24gcmFuZ2UKLQkJCS8vICgoQ1NTU3R5bGVEZWNsSXRlbUltcGwpdGFyZ2V0Tm9kZSkuc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihyZWdpb24pOwotCQkJQ1NTTW9kZWxVdGlsLmV4cGFuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcigoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIHRhcmdldE5vZGUsIHJlZ2lvbik7Ci0JCQkvLyBwc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbmRpY2F0ZXMgQ1NTU3R5bGVEZWNsSXRlbQotCQkJSUNTU05vZGUgcGFyZW50Tm9kZSA9IHRhcmdldE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHBhcmVudE5vZGUpOwotCQkJSUNTU05vZGUgbmV4dCA9IG51bGw7Ci0JCQlpZiAocGFyZW50Tm9kZS5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gdGFyZ2V0Tm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgJiYgb2Zmc2V0IDwgKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCQluZXh0ID0gY2hpbGQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0KLQkJCXJldHVybiB0YXJnZXROb2RlOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRTdHlsZURlY2xhcmF0aW9uSXRlbShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY1JlZ2lvbikgewotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBwYXJlbnQgPSBudWxsOwotCQlDU1NOb2RlSW1wbCBub2RlID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUnVsZURlY2xDb250YWluZXIpIHsKLQkJCUNTU1J1bGVEZWNsQ29udGFpbmVyIGRlY2xDb250YWluZXIgPSAoQ1NTUnVsZURlY2xDb250YWluZXIpIG5vZGU7Ci0JCQlwYXJlbnQgPSAoQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwpIGRlY2xDb250YWluZXIuZ2V0U3R5bGUoKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwpIHsKLQkJCXBhcmVudCA9IChDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgbm9kZTsKLQkJfQotCi0JCUNTU0RlY2xhcmF0aW9uSXRlbVBhcnNlciBpdGVtUGFyc2VyID0gbmV3IENTU0RlY2xhcmF0aW9uSXRlbVBhcnNlcihwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJaXRlbVBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRUZW1wb3JhcnkoZmFsc2UpOwotCQlpdGVtUGFyc2VyLnNldFVwZGF0ZUNvbnRleHQoZlVwZGF0ZUNvbnRleHQpOwotCQlDU1NTdHlsZURlY2xJdGVtSW1wbCBkZWNsSXRlbSA9IGl0ZW1QYXJzZXIuc2V0dXBEZWNsYXJhdGlvbkl0ZW0oZG9jUmVnaW9uKTsKLQkJaWYgKGRlY2xJdGVtID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gc2V0dXAgZmxhdCBjb250YWluZXIKLQkJZGVjbEl0ZW0uc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jUmVnaW9uLCBkb2NSZWdpb24pOwotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQocGFyZW50LCBkZWNsSXRlbSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUoZGVjbEl0ZW0sIG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFyZW50LmFwcGVuZENoaWxkKGRlY2xJdGVtKTsKLQkJCX0KLQkJfQotCi0JCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShkZWNsSXRlbSk7Ci0JCS8vIFRhcmdldE5leHQgaXMgc2V0IHRvIG51bGwgYXV0b21hdGljYWxseQotCi0JCXJldHVybiBkZWNsSXRlbTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydFN0eWxlUnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJyYWNlTm9kZSkgewotCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKCFmUGFyc2VGbG9hdGluZyAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBnZXQgc2VsZWN0b3IgcmVnaW9ucwotCQlJVGV4dFJlZ2lvbkxpc3Qgc2VsZWN0b3JSZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbChmbGF0Tm9kZS5nZXRSZWdpb25zKCkpOwotCQlDU1NVdGlsLnN0cmlwU3Vycm91bmRpbmdTcGFjZShzZWxlY3RvclJlZ2lvbnMpOwotCi0JCUNTU1N0eWxlUnVsZUltcGwgcnVsZSA9IGZGZWVkZXIuZ2V0Q1NTU3R5bGVSdWxlKCk7Ci0JCWlmIChydWxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlTdHJpbmcgc2VsZWN0b3JTdHIgPSBDU1NVdGlsLmdldFJlZ2lvblRleHQoZmxhdE5vZGUsIHNlbGVjdG9yUmVnaW9ucyk7Ci0JCQlpZiAoc2VsZWN0b3JTdHIgIT0gbnVsbCAmJiAwIDwgc2VsZWN0b3JTdHIubGVuZ3RoKCkpIHsKLQkJCQlydWxlLnNldFNlbGVjdG9yVGV4dChzZWxlY3RvclN0cik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlLCBicmFjZU5vZGUpOwotCQlDU1NBdHRySW1wbCBhdHRyID0gcnVsZS5nZXRBdHRyaWJ1dGVOb2RlKElDU1NQYWdlUnVsZS5TRUxFQ1RPUik7Ci0JCWlmIChhdHRyICE9IG51bGwgJiYgc2VsZWN0b3JSZWdpb25zICE9IG51bGwgJiYgIXNlbGVjdG9yUmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24oZmxhdE5vZGUsIHNlbGVjdG9yUmVnaW9ucy5nZXQoMCksIHNlbGVjdG9yUmVnaW9ucy5nZXQoc2VsZWN0b3JSZWdpb25zLnNpemUoKSAtIDEpKTsKLQkJfQotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQocGFyZW50LCBydWxlKTsKLQkJCUNTU05vZGVJbXBsIG5leHQgPSBmQ3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChydWxlKTsKLQkJCX0KLQkJfQotCi0JCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShydWxlKTsKLQkJLy8gVGFyZ2V0TmV4dCBpcyBzZXQgdG8gbnVsbCBhdXRvbWF0aWNhbGx5Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByZXRlbmRSZW1vdmVOb2RlKCkgewotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgbm9kZSA9IChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZVcGRhdGVDb250ZXh0LmdldERlbGV0aW9uVGFyZ2V0KCk7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmlyc3ROb2RlICE9IG51bGwpIHsKLQkJCWZEZWxldGlvbkNvbnRleHQuZXhwYW5kUmVtb3ZlZFJhbmdlQmVnaW4oZmlyc3ROb2RlKTsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gbm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQlmRGVsZXRpb25Db250ZXh0LmV4cGFuZFJlbW92ZWRSYW5nZUVuZChsYXN0Tm9kZSk7Ci0JCX0KLQotCQlzaHJpbmtDb250YWluZXIoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZlVwZGF0ZUNvbnRleHQuZ2V0RGVsZXRpb25UYXJnZXRQYXJlbnQoKSwgbm9kZSk7Ci0JfQotCi0JLyoqCi0JICoJY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBjaGlsZAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQoQ1NTTm9kZUltcGwgcGFyZW50LCBDU1NOb2RlSW1wbCBjaGlsZCkgewotCQlpZiAoIShjaGlsZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgfHwgIShwYXJlbnQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgcGFyZW50Q29udGFpbmVyID0gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50OwotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY2hpbGRDb250YWluZXIgPSAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBjaGlsZDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSBjaGlsZENvbnRhaW5lci5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gY2hpbGRDb250YWluZXIuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmlyc3ROb2RlID09IG51bGwgfHwgbGFzdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiBiTW9kaWZpZWQgPSBwYXJlbnRDb250YWluZXIuaW5jbHVkZVJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZpcnN0Tm9kZSwgbGFzdE5vZGUpOwotCQlpZiAoYk1vZGlmaWVkKSB7Ci0JCQlwYXJlbnRDb250YWluZXIucHJvcGFnYXRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlTdHJpbmcgdHlwZSA9IENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQlkbyB7Ci0JCQkJZmxhdE5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmdldFByZXZOb2RlKGZsYXROb2RlKTsKLQkJCQl0eXBlID0gKGZsYXROb2RlICE9IG51bGwpID8gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKSA6IG51bGw7Ci0JCQl9Ci0JCQl3aGlsZSAodHlwZSAhPSBudWxsICYmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpKTsKLQkJfQotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gaWYgKGZEZWxldGlvbkNvbnRleHQuaXNJblJlbW92ZWRSYW5nZShmbGF0Tm9kZSkpIHsgLy8gYWxyZWFkeQotCQkvLyByZW1vdmVkCi0JCS8vIHJldHVybjsKLQkJLy8gfQotCi0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBub2RlID0gZkRlbGV0aW9uQ29udGV4dC5maW5kRGVsZXRpb25UYXJnZXQoKENTU05vZGVJbXBsKWZEb2N1bWVudCwgZmxhdE5vZGUpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUgPT0gZkRvY3VtZW50KSB7Ci0JCQlyZXR1cm47IC8vIG5vdCBhdHRhY2hlZCB3aXRoIGFueSB0cmVlTm9kZQotCQl9Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgewotCQkJSUNTU05vZGUgcnVsZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBDU1NTdHlsZVJ1bGVJbXBsKSB7Ci0JCQkJbm9kZSA9IChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHJ1bGU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBJQ1NTTm9kZSBwID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCS8vIGlmIChwID09IG51bGwgfHwgISAocCBpbnN0YW5jZW9mCi0JCS8vIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJLy8gcmV0dXJuOwotCQkvLyB9Ci0JCS8vIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQgPQotCQkvLyAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKXA7Ci0KLQkJaWYgKGZEZWxldGlvbkNvbnRleHQuYWRkTm9kZVRvQmVSZW1vdmVkKG5vZGUpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmaXJzdE5vZGUgIT0gbnVsbCkgewotCQkJCWZEZWxldGlvbkNvbnRleHQuZXhwYW5kUmVtb3ZlZFJhbmdlQmVnaW4oZmlyc3ROb2RlKTsKLQkJCX0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSBub2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJZkRlbGV0aW9uQ29udGV4dC5leHBhbmRSZW1vdmVkUmFuZ2VFbmQobGFzdE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gc2hyaW5rQ29udGFpbmVyKG5vZGUpOwotCQkvLyBwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzKSB7Ci0JCWZvciAoRW51bWVyYXRpb24gZSA9IGZsYXROb2Rlcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJfQotCi0JCUl0ZXJhdG9yIGkgPSBmRGVsZXRpb25Db250ZXh0LmdldE5vZGVzVG9CZVJlbW92ZWQoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NOb2RlSW1wbCBub2RlID0gKENTU05vZGVJbXBsKSBpLm5leHQoKTsKLQkJCWlmICghKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSAoQ1NTTm9kZUltcGwpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKCEocGFyZW50IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJc2hyaW5rQ29udGFpbmVyKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudCwgKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSk7Ci0JCQlwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlcGxhY2VEb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCWlmIChmRG9jdW1lbnQgPT0gbnVsbCB8fCBmQ3JlYXRpb25Db250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCSgoQ1NTRG9jdW1lbnRJbXBsKSBmRG9jdW1lbnQpLnJlbW92ZUNoaWxkTm9kZXMoKTsKLQotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsICYmIDAgPCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpKSB7Ci0JCQlzZXR1cENyZWF0aW9uQ29udGV4dChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oMCkpOwotCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpZkRvY3VtZW50KS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgc3RydWN0dXJlZERvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCWlmIChmRG9jdW1lbnQgPT0gbnVsbCB8fCBmQ3JlYXRpb25Db250ZXh0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgJiYgMCA8IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCkpIHsKLQkJCXNldHVwRGVsZXRpb25Db250ZXh0KG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQkJc2hvcnQgdXBkYXRlTW9kZSA9IGZVcGRhdGVDb250ZXh0LmdldFVwZGF0ZU1vZGUoKTsKLQkJCWlmICh1cGRhdGVNb2RlID09IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfSURMRSkgewotCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwcmV0ZW5kUmVtb3ZlTm9kZSgpOwotCQkJfQotCQkJbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QoZkRlbGV0aW9uQ29udGV4dC5nZXRSZW1vdmVkUmFuZ2VCZWdpbigpLCBmRGVsZXRpb25Db250ZXh0LmdldFJlbW92ZWRSYW5nZUVuZCgpKTsKLQkJCWNsZWFudXBEZWxldGlvbkNvbnRleHQoKTsKLQkJfQotCi0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgJiYgMCA8IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCkpIHsKLQkJCS8qIHdoZW4gcmVtb3Zpbmcgb2xkIG5vZGVzIHRoZSBjcmVhdGlvbiBjb250ZXh0IHNob3VsZCBiZSBzZXQgdXAgYmFzZWQgb24gdGhlbQotCQkJICogZWxzZSBjcmVhdGlvbiBjb250ZXh0IGlzIHRoYXQgb2YgdGhlIG5ldyBub2RlcwotCQkJICovCi0JCQlpZiggb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsICYmIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCkgPCAwKSB7Ci0JCQkJc2V0dXBDcmVhdGlvbkNvbnRleHQob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKDApKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0dXBDcmVhdGlvbkNvbnRleHQobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKDApKTsKLQkJCX0KLQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JCX0KLQotCQkvLyBtYWtlIGRvY3VtZW50IGhvbGQgd2hvbGUgc3RydWN0dXJlZERvY3VtZW50Ci0JCS8qCi0JCSAqIGJvb2xlYW4gYlVwZGF0ZSA9IGZhbHNlOyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCQkgKiBmbGF0Tm9kZSA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOyBiVXBkYXRlID0KLQkJICogYlVwZGF0ZSB8fCAoZmxhdE5vZGUgPT0gbnVsbCB8fAotCQkgKiBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmlzT2xkTm9kZShmbGF0Tm9kZSkgfHwKLQkJICogZmxhdE5vZGUuZ2V0UHJldmlvdXMoKSAhPSBudWxsKTsgZmxhdE5vZGUgPQotCQkgKiBmRG9jdW1lbnQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOyBiVXBkYXRlID0gYlVwZGF0ZSB8fAotCQkgKiAoZmxhdE5vZGUgPT0gbnVsbCB8fCBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmlzT2xkTm9kZShmbGF0Tm9kZSkgfHwKLQkJICogZmxhdE5vZGUuZ2V0TmV4dCgpICE9IG51bGwpOwotCQkgKi8KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcilmRG9jdW1lbnQpLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHN0cnVjdHVyZWREb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJLyogfSAqLwotCi0JCS8vIHJlbW92ZSBpbiBvZmZpY2lhbCByZWxlYXNlCi0JCS8vIENTU01vZGVsVXRpbC5kaWFnbm9zZVRyZWUoZkRvY3VtZW50LAotCQkvLyBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHJlcGxhY2VSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucykgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChuZXdSZWdpb25zID09IG51bGwgfHwgb2xkUmVnaW9ucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGZEb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldENyZWF0aW9uVGFyZ2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCB8fCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSA8PSAwKSB7Ci0JCQkvLyB0b3Agb2YgZG9jdW1lbnQKLQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShmRG9jdW1lbnQpOwotCQkJZkNyZWF0aW9uQ29udGV4dC5zZXROZXh0Tm9kZShmRG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBjdXJzb3JQb3MgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJQ1NTTm9kZUltcGwgY3Vyc29yTm9kZSA9IGdldE5vZGVBdChjdXJzb3JQb3MpOwotCQlpZiAoY3Vyc29yTm9kZSA9PSBudWxsKSB7IC8vIGVuZCBvZiBkb2N1bWVudAotCQkJY3Vyc29yTm9kZSA9IChDU1NOb2RlSW1wbClmRG9jdW1lbnQ7Ci0JCX0KLQotCQkvLyBmaW5kIGVkZ2Ugb2YgdHJlZSBub2RlCi0JCUNTU05vZGVJbXBsIG5vZGUgPSBudWxsOwotCQkvLyBib29sZWFuIGJPdmVyU2VtaUNvbG9uID0gZmFsc2U7Ci0JCWJvb2xlYW4gYk92ZXJPcGVuQnJhY2UgPSBmYWxzZTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQkJZm9yIChmbGF0Tm9kZSA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsgZmxhdE5vZGUgIT0gbnVsbDsgZmxhdE5vZGUgPSBmbGF0Tm9kZS5nZXRQcmV2aW91cygpKSB7Ci0JCQlub2RlID0gZ2V0Tm9kZUF0KGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCW5vZGUgPSAoQ1NTTm9kZUltcGwpZkRvY3VtZW50OwotCQkJfQotCQkJaWYgKG5vZGUgIT0gY3Vyc29yTm9kZSB8fCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkgPT0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGZsYXROb2RlICE9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCVN0cmluZyB0eXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJCQkvLyBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8Ci0JCQkJLy8gdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkJLy8gYk92ZXJTZW1pQ29sb24gPSB0cnVlOwotCQkJCS8vIH0gZWxzZQotCQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCQkJYk92ZXJPcGVuQnJhY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUNTU05vZGVJbXBsIHRhcmdldE5vZGUgPSBudWxsOwotCi0JCS8vIGlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCS8vIHY8LS18Ci0JCS8vIEFBQUFBQQotCQkvLyBCQkJCQkJCQkJCIGN1cnNvck5vZGU6QSAsIG5vZGU6QiAtPiB0YXJnZXQgaXMgQQotCQkvLyB0YXJnZXROb2RlID0gKG5vZGUgPT0gbnVsbCkgPyBmRG9jdW1lbnQgOiBub2RlOwotCQkvLyB9IGVsc2UKLQkJaWYgKGN1cnNvck5vZGUgPT0gbm9kZSkgewotCQkJLy8gdjwtLXwKLQkJCS8vIEFBQUFBQQotCQkJLy8gQkJCQkJCQkJCQiBjdXJzb3JOb2RlOkEgLCBub2RlOkIgLT4gdGFyZ2V0IGlzIEEKLQkJCWlmIChiT3Zlck9wZW5CcmFjZSAmJiBjdXJzb3JOb2RlIGluc3RhbmNlb2YgQ1NTUnVsZURlY2xDb250YWluZXIpIHsKLQkJCQl0YXJnZXROb2RlID0gKENTU05vZGVJbXBsKSAoKENTU1J1bGVEZWNsQ29udGFpbmVyKSBjdXJzb3JOb2RlKS5nZXRTdHlsZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGFyZ2V0Tm9kZSA9IGN1cnNvck5vZGU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB2PC0tfAotCQkJLy8gQUFBCi0JCQkvLyBCQkJCQkJCQkJCIGN1cnNvck5vZGU6QiAsIG5vZGU6QSAtPiBkZXBlbmQgb24gQSdzIG5vZGUgdHlwZQotCQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQlpZiAobm9kZVR5cGUgPT0gSUNTU05vZGUuU1RZTEVERUNMSVRFTV9OT0RFIHx8IG5vZGVUeXBlID09IElDU1NOb2RlLkNIQVJTRVRSVUxFX05PREUgfHwgbm9kZVR5cGUgPT0gSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFKSB7Ci0JCQkJLy8gdGFyZ2V0Tm9kZSA9IChDU1NOb2RlSW1wbCkoKGJPdmVyU2VtaUNvbG9uKSA/Ci0JCQkJLy8gbm9kZS5nZXRQYXJlbnROb2RlKCkgOiBub2RlKTsgLy8gTlAKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCByZWdpb25UeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQkJdGFyZ2V0Tm9kZSA9IChDU1NOb2RlSW1wbCkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0YXJnZXROb2RlID0gbm9kZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCQl0YXJnZXROb2RlID0gKENTU05vZGVJbXBsKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRhcmdldE5vZGUgPSBub2RlOwotCQkJfQotCQl9Ci0KLQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHRhcmdldE5vZGUpOwotCQlJQ1NTTm9kZSBuZXh0ID0gbnVsbDsKLQkJaWYgKHRhcmdldE5vZGUuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gdGFyZ2V0Tm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciAmJiBjdXJzb3JQb3MgPCAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJbmV4dCA9IGNoaWxkOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZkNyZWF0aW9uQ29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldFJlcGFyc2VSYW5nZSgpIHsKLQkJZkNyZWF0aW9uQ29udGV4dC5jbGVhcigpOwotCX0KLQotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50RXZlbnQoU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIgPT0gbnVsbCkgewotCQkJZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIoKTsKLQkJfQotCQlmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmluaXRpYWxpemUoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIHJlZ2lvbnM6IHN1cnJvdW5kaW5nIHNwYWNlcyBzaG91bGQgYmUgcmVtb3ZlZC4gUS4gV2h5IGRpZCB5b3Ugc2V0Ci0JICogbWVkaWFUYWJsZSA/IEEuIE1lZGlhTGlzdCBtYXkgaGF2ZSB0d28gb3IgbW9yZSBtZWRpdW0gdGhhdCBoYXZlIHNhbWUKLQkgKiB2YWx1ZSwgdGhlbiBzZWFyY2luZyBpbiBNZWRpYUxpc3QgaXMgbm90IHBlcmZlY3QuIFEuCi0JICogZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSBpcyBub3QgY2FyZS4gQXJlIHlvdSBPSz8gQS4gT0suCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldE1lZGlhTGlzdChNZWRpYUxpc3RJbXBsIG1lZGlhTGlzdCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIElUZXh0UmVnaW9uTGlzdCB0ZXh0UmVnaW9ucykgewotCQlpZiAobWVkaWFMaXN0ID09IG51bGwgfHwgdGV4dFJlZ2lvbnMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUNvbGxlY3Rpb24gbWVkaWFUYWJsZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCUNTU05vZGVMaXN0SW1wbCBhdHRycyA9IG1lZGlhTGlzdC5nZXRNZWRpYSgpOwotCQlmb3IgKGludCBpID0gMDsgaSAhPSBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQltZWRpYVRhYmxlLmFkZChhdHRycy5pdGVtKGkpKTsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIHN0YXJ0ID0gbnVsbDsKLQkJSVRleHRSZWdpb24gZW5kID0gbnVsbDsKLQotCQlJdGVyYXRvciBpID0gdGV4dFJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgKChpLmhhc05leHQoKSkgPyBpLm5leHQoKSA6IG51bGwpOwotCQl3aGlsZSAodGV4dFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElVTSkgewotCQkJCVN0cmluZyBtZWRpdW1TdHIgPSByZWdpb24uZ2V0VGV4dCh0ZXh0UmVnaW9uKTsKLQkJCQlpZiAoMCA8IG1lZGl1bVN0ci5sZW5ndGgoKSkgewotCQkJCQlDU1NBdHRySW1wbCBhdHRyID0gbnVsbDsKLQkJCQkJLy8gaXMgdGhlIG1lZGl1bSBhbHJlYWR5IHNldCA/Ci0JCQkJCUl0ZXJhdG9yIGlUYWJsZSA9IG1lZGlhVGFibGUuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGlUYWJsZS5oYXNOZXh0KCkpIHsKLQkJCQkJCUNTU0F0dHJJbXBsIGNhaSA9IChDU1NBdHRySW1wbCkgaVRhYmxlLm5leHQoKTsKLQkJCQkJCWlmIChtZWRpdW1TdHIuZXF1YWxzSWdub3JlQ2FzZShjYWkuZ2V0VmFsdWUoKSkpIHsKLQkJCQkJCQlhdHRyID0gY2FpOwotCQkJCQkJCW1lZGlhVGFibGUucmVtb3ZlKGNhaSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGF0dHIgPT0gbnVsbCkgewotCQkJCQkJLy8gaXMgbm90IHNldC4gY3JlYXRlIG5ldyBhdHRyaWJ1dGUKLQkJCQkJCVN0cmluZyBrZXkgPSAibWVkaXVtUCIgKyBtZWRpYUxpc3QubWVkaXVtQ291bnRlcisrOyAvLyROT04tTkxTLTEkCi0JCQkJCQltZWRpYUxpc3Quc2V0QXR0cmlidXRlKGtleSwgbWVkaXVtU3RyKTsKLQkJCQkJCWF0dHIgPSBtZWRpYUxpc3QuZ2V0QXR0cmlidXRlTm9kZShrZXkpOwotCQkJCQl9Ci0JCQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24ocmVnaW9uLCB0ZXh0UmVnaW9uLCB0ZXh0UmVnaW9uKTsKLQkJCQkJaWYgKHN0YXJ0ID09IG51bGwpIHsKLQkJCQkJCXN0YXJ0ID0gdGV4dFJlZ2lvbjsKLQkJCQkJfQotCQkJCQllbmQgPSB0ZXh0UmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJCXRleHRSZWdpb24gPSAoSVRleHRSZWdpb24pICgoaS5oYXNOZXh0KCkpID8gaS5uZXh0KCkgOiBudWxsKTsKLQkJfQotCi0JCWlmIChzdGFydCAhPSBudWxsICYmIGVuZCAhPSBudWxsKSB7Ci0JCQltZWRpYUxpc3Quc2V0UmFuZ2VSZWdpb24ocmVnaW9uLCBzdGFydCwgZW5kKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cENyZWF0aW9uQ29udGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlyZXNldFJlcGFyc2VSYW5nZSgpOwotCQlyZXNldENyZWF0aW9uVGFyZ2V0KHJlZ2lvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldHVwRGVsZXRpb25Db250ZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpIHsKLQkJZkRlbGV0aW9uQ29udGV4dC5zZXR1cENvbnRleHQobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXR1cFVwZGF0ZUNvbnRleHQoc2hvcnQgdXBkYXRlTW9kZSwgSUNTU05vZGUgcGFyZW50Tm9kZSwgSUNTU05vZGUgdGFyZ2V0Tm9kZSkgewotCQlmVXBkYXRlQ29udGV4dC5zZXR1cENvbnRleHQodXBkYXRlTW9kZSwgcGFyZW50Tm9kZSwgdGFyZ2V0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzaHJpbmtDb250YWluZXIoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHBhcmVudCwgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlib29sZWFuIGJNb2RpZmllZCA9IGZhbHNlOwotCQliTW9kaWZpZWQgPSBiTW9kaWZpZWQgfHwgY2xlYW51cExhc3ROb2RlKGNoaWxkLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgcGFyZW50KTsKLQkJYk1vZGlmaWVkID0gYk1vZGlmaWVkIHx8IGNsZWFudXBGaXJzdE5vZGUoY2hpbGQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgcGFyZW50KTsKLQotCQlpZiAoYk1vZGlmaWVkKSB7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJaWYgKGNoaWxkICE9IG5vZGUgJiYgbm9kZSBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG5vZGUpLnByb3BhZ2F0ZVJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQljaGlsZC5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsLCBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXBkYXRlQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFVwZGF0ZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdmNGU5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXBkYXRlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5BYnN0cmFjdENzc1RyYXZlcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTTW9kZWxVcGRhdGVDb250ZXh0IHsKLQotCi0JY2xhc3MgQ1NTTm9kZVVwZGF0ZVRyYXZlcnNlciBleHRlbmRzIEFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQkJcHVibGljIENTU05vZGVVcGRhdGVUcmF2ZXJzZXIoKSB7Ci0JCQlzdXBlcigpOwotCQkJc2V0VHJhdmVyc2VJbXBvcnRlZChmYWxzZSk7Ci0JCQlzZXRUcmF2ZXJzZUltcG9ydEZpcnN0KGZhbHNlKTsKLQkJfQotCi0JCXB1YmxpYyBMaW5rZWRMaXN0IGdldE5vZGVMaXN0KCkgewotCQkJcmV0dXJuIGZUcmF2Tm9kZUxpc3Q7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBiZWdpbihJQ1NTTm9kZSBub2RlKSB7Ci0JCQlmVHJhdk5vZGVMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgfHwgbm9kZSBpbnN0YW5jZW9mIENTU0F0dHJJbXBsIHx8IG5vZGUgaW5zdGFuY2VvZiBNZWRpYUxpc3RJbXBsKSB7Ci0JCQkJLy8gc2tpcAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZlRyYXZOb2RlTGlzdC5hZGQobm9kZSk7Ci0JCQl9Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZUNvbnRhaW5lcikgewotCQkJCXJldHVybiBUUkFWX1BSVU5FOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJCX0KLQkJfQotCi0JCUxpbmtlZExpc3QgZlRyYXZOb2RlTGlzdCA9IG51bGw7Ci0JfQotCi0JSUNTU05vZGUgZkxhc3ROb2RlID0gbnVsbDsKLQlJQ1NTTm9kZSBmRGVsZXRpb25UYXJnZXRQYXJlbnQgPSBudWxsOwotCUlDU1NOb2RlIGZEZWxldGlvblRhcmdldCA9IG51bGw7Ci0JTGlua2VkTGlzdCBmTm9kZUxpc3QgPSBudWxsOwotCXByaXZhdGUgc2hvcnQgZlVwZGF0ZU1vZGUgPSBVUERBVEVfSURMRTsKLQlzdGF0aWMgZmluYWwgc2hvcnQgVVBEQVRFX0lETEUgPSAwOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBVUERBVEVfSU5TRVJUX0ZOQ09OVEFJTkVSID0gMTsKLQlzdGF0aWMgZmluYWwgc2hvcnQgVVBEQVRFX0lOU0VSVF9SQ09OVEFJTkVSID0gMjsKLQlzdGF0aWMgZmluYWwgc2hvcnQgVVBEQVRFX1JFTU9WRV9GTkNPTlRBSU5FUiA9IDM7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IFVQREFURV9SRU1PVkVfUkNPTlRBSU5FUiA9IDQ7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IFVQREFURV9DSEFOR0VfUkNPTlRBSU5FUiA9IDU7Ci0KLQkvKioKLQkgKiBDU1NOb2RlVXBkYXRlUXVldWUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NNb2RlbFVwZGF0ZUNvbnRleHQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBjbGVhbnVwQ29udGV4dCgpIHsKLQkJZk5vZGVMaXN0ID0gbnVsbDsKLQkJZkRlbGV0aW9uVGFyZ2V0ID0gbnVsbDsKLQkJZkRlbGV0aW9uVGFyZ2V0UGFyZW50ID0gbnVsbDsKLQkJZlVwZGF0ZU1vZGUgPSBVUERBVEVfSURMRTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDb3VudGVySW1wbCBnZXRDb3VudGVyKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENvdW50ZXJJbXBsKSB7Ci0JCQlyZXR1cm4gKENvdW50ZXJJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ291bnRlckltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU0NoYXJzZXRSdWxlSW1wbCBnZXRDU1NDaGFyc2V0UnVsZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NDaGFyc2V0UnVsZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTQ2hhcnNldFJ1bGVJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTQ2hhcnNldFJ1bGVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NGb250RmFjZVJ1bGVJbXBsIGdldENTU0ZvbnRGYWNlUnVsZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NGb250RmFjZVJ1bGVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU0ZvbnRGYWNlUnVsZUltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NGb250RmFjZVJ1bGVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NJbXBvcnRSdWxlSW1wbCBnZXRDU1NJbXBvcnRSdWxlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU0ltcG9ydFJ1bGVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU0ltcG9ydFJ1bGVJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTSW1wb3J0UnVsZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU01lZGlhUnVsZUltcGwgZ2V0Q1NTTWVkaWFSdWxlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU01lZGlhUnVsZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTTWVkaWFSdWxlSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU01lZGlhUnVsZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1BhZ2VSdWxlSW1wbCBnZXRDU1NQYWdlUnVsZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NQYWdlUnVsZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTUGFnZVJ1bGVJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTUGFnZVJ1bGVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgZ2V0Q1NTUHJpbWl0aXZlVmFsdWUoc2hvcnQgdHlwZSkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgewotCQkJc2hvcnQgbm9kZVR5cGUgPSAoKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgbm9kZSkuZ2V0UHJpbWl0aXZlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IHR5cGUgfHwgKChub2RlVHlwZSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSIHx8IG5vZGVUeXBlID09IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUikgJiYgKHR5cGUgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX05VTUJFUiB8fCB0eXBlID09IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUikpKSB7Ci0JCQkJcmV0dXJuIChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIG5vZGU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgewotCQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgbm9kZTsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU1ByaW1pdGl2ZVZhbHVlSW1wbCBbIiArIHR5cGUgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkiXSBpcyBleHBlY3RlZCwgYnV0IHR5cGUgaXMgWyIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQl2YWx1ZS5nZXRQcmltaXRpdmVUeXBlKCkgKyAiXTogXCIiICsgdmFsdWUuZ2VuZXJhdGVTb3VyY2UoKSArICJcIiIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NQcmltaXRpdmVWYWx1ZUltcGwoIiArIHR5cGUgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkiKSBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJfQotCi0JCXVuZ2V0Tm9kZSgpOwotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGdldENTU1ByaW1pdGl2ZVZhbHVlQW55KCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgewotCQkJcmV0dXJuIChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NQcmltaXRpdmVWYWx1ZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGdldENTU1N0eWxlRGVjbEl0ZW0oU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbEl0ZW1JbXBsICYmICgoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIG5vZGUpLmdldFByb3BlcnR5TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIChDU1NTdHlsZURlY2xJdGVtSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU1N0eWxlRGVjbEl0ZW1JbXBsKCIgKyBwcm9wZXJ0eU5hbWUgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkiKSBpcyBleHBlY3RlZCwgYnV0ICIgKyBDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsvLyROT04tTkxTLTEkCi0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1N0eWxlUnVsZUltcGwgZ2V0Q1NTU3R5bGVSdWxlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlUnVsZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTU3R5bGVSdWxlSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU1N0eWxlUnVsZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKi8KLQlJQ1NTTm9kZSBnZXREZWxldGlvblRhcmdldCgpIHsKLQkJcmV0dXJuIGZEZWxldGlvblRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0JSUNTU05vZGUgZ2V0RGVsZXRpb25UYXJnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBmRGVsZXRpb25UYXJnZXRQYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBJQ1NTTm9kZSBnZXROb2RlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKGZOb2RlTGlzdCAhPSBudWxsICYmIDAgPCBmTm9kZUxpc3Quc2l6ZSgpKSB7Ci0JCQlub2RlID0gKElDU1NOb2RlKSBmTm9kZUxpc3QucmVtb3ZlRmlyc3QoKTsKLQkJfQotCQlmTGFzdE5vZGUgPSBub2RlOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0Tm9kZUNvdW50KCkgewotCQlpZiAoZk5vZGVMaXN0ICE9IG51bGwpIHsKLQkJCXJldHVybiBmTm9kZUxpc3Quc2l6ZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JLy8gSUNTU05vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkvLyByZXR1cm4gZlBhcmVudE5vZGU7Ci0JLy8gfQotCS8qKgotCSAqIAotCSAqLwotCVJlY3RJbXBsIGdldFJlY3QoKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgUmVjdEltcGwpIHsKLQkJCXJldHVybiAoUmVjdEltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJSZWN0SW1wbCBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJCXVuZ2V0Tm9kZSgpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JUkdCQ29sb3JJbXBsIGdldFJHQkNvbG9yKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFJHQkNvbG9ySW1wbCkgewotCQkJcmV0dXJuIChSR0JDb2xvckltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJSR0JDb2xvckltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlzaG9ydCBnZXRVcGRhdGVNb2RlKCkgewotCQlyZXR1cm4gZlVwZGF0ZU1vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIChmTm9kZUxpc3QgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXR1cENvbnRleHQoc2hvcnQgdXBkYXRlTW9kZSwgSUNTU05vZGUgcGFyZW50Tm9kZSwgSUNTU05vZGUgdGFyZ2V0Tm9kZSkgewotCQlmVXBkYXRlTW9kZSA9IHVwZGF0ZU1vZGU7Ci0KLQkJSUNTU05vZGUgdHJhdmVyc2VSb290OwotCQlpZiAodXBkYXRlTW9kZSA9PSBVUERBVEVfUkVNT1ZFX1JDT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfSU5TRVJUX1JDT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfQ0hBTkdFX1JDT05UQUlORVIpIHsKLQkJCXRyYXZlcnNlUm9vdCA9IHBhcmVudE5vZGU7Ci0JCQl3aGlsZSAodHJhdmVyc2VSb290IGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJdHJhdmVyc2VSb290ID0gdHJhdmVyc2VSb290LmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRyYXZlcnNlUm9vdCA9IHRhcmdldE5vZGU7Ci0JCX0KLQotCQlpZiAodXBkYXRlTW9kZSA9PSBVUERBVEVfUkVNT1ZFX1JDT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfSU5TRVJUX1JDT05UQUlORVIgfHwgLy8gcmVnaW9uCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpbnNlcnQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vID0+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyByZXBsYWNlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmbGF0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBub2RlCi0JCQkJCXVwZGF0ZU1vZGUgPT0gVVBEQVRFX0NIQU5HRV9SQ09OVEFJTkVSIHx8IHVwZGF0ZU1vZGUgPT0gVVBEQVRFX1JFTU9WRV9GTkNPTlRBSU5FUikgewotCQkJZkRlbGV0aW9uVGFyZ2V0ID0gdHJhdmVyc2VSb290OwotCQkJaWYgKGZEZWxldGlvblRhcmdldCA9PSB0YXJnZXROb2RlKSB7Ci0JCQkJZkRlbGV0aW9uVGFyZ2V0UGFyZW50ID0gcGFyZW50Tm9kZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZEZWxldGlvblRhcmdldFBhcmVudCA9IGZEZWxldGlvblRhcmdldC5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmRGVsZXRpb25UYXJnZXQgPSBudWxsOwotCQkJZkRlbGV0aW9uVGFyZ2V0UGFyZW50ID0gbnVsbDsKLQkJfQotCi0JCWlmICh1cGRhdGVNb2RlID09IFVQREFURV9JTlNFUlRfUkNPTlRBSU5FUiB8fCB1cGRhdGVNb2RlID09IFVQREFURV9JTlNFUlRfRk5DT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfUkVNT1ZFX1JDT05UQUlORVIgfHwgLy8gcmVnaW9uCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHJlbW92ZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyA9PgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyByZS1pbnNlcnQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZmxhdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBub2RlCi0JCQkJCXVwZGF0ZU1vZGUgPT0gVVBEQVRFX0NIQU5HRV9SQ09OVEFJTkVSKSB7Ci0JCQlDU1NOb2RlVXBkYXRlVHJhdmVyc2VyIHRyYXZlcnNlciA9IG5ldyBDU1NOb2RlVXBkYXRlVHJhdmVyc2VyKCk7Ci0JCQl0cmF2ZXJzZXIuYXBwbHkodHJhdmVyc2VSb290KTsKLQkJCWZOb2RlTGlzdCA9IHRyYXZlcnNlci5nZXROb2RlTGlzdCgpOwotCQl9Ci0JCWVsc2UgewotCQkJZk5vZGVMaXN0ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB1bmdldE5vZGUoKSB7Ci0JCWlmIChmTm9kZUxpc3QgIT0gbnVsbCAmJiBmTGFzdE5vZGUgIT0gbnVsbCkgewotCQkJZk5vZGVMaXN0LmFkZEZpcnN0KGZMYXN0Tm9kZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXBkYXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFVwZGF0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiOGE4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5BdHRyQ2hhbmdlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NNb2RlbFVwZGF0ZXIgewotCi0JcHJpdmF0ZSBDU1NNb2RlbEltcGwgZk1vZGVsID0gbnVsbDsKLQlwcml2YXRlIENTU01vZGVsUGFyc2VyIGZQYXJzZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTTW9kZWxVcGRhdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTTW9kZWxVcGRhdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU01vZGVsVXBkYXRlcihDU1NNb2RlbEltcGwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJZk1vZGVsID0gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXR0ckluc2VydGVkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU0F0dHJJbXBsIGF0dHIpIHsKLQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIocGFyZW50Tm9kZSk7Ci0KLQkJaWYgKGZvcm1hdHRlciA9PSBudWxsKSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDYW5ub3QgZ2V0IGZvcm1hdCBhZGFwdGVyIDogIiArIHBhcmVudE5vZGUuZ2V0Q2xhc3MoKS50b1N0cmluZygpKTsvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlzaG9ydCB1cGRhdGVNb2RlID0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9JTlNFUlRfUkNPTlRBSU5FUjsKLQkJZlBhcnNlci5zZXR1cFVwZGF0ZUNvbnRleHQodXBkYXRlTW9kZSwgcGFyZW50Tm9kZSwgYXR0cik7Ci0KLQkJLy8gZ2V0IGZvcm1hdHRlZCBpbmZvCi0JCUF0dHJDaGFuZ2VDb250ZXh0IHJlZ2lvbiA9IG5ldyBBdHRyQ2hhbmdlQ29udGV4dCgpOwotCQlTdHJpbmcgdGV4dCA9IG5ldyBTdHJpbmcoZm9ybWF0dGVyLmZvcm1hdEF0dHJDaGFuZ2VkKHBhcmVudE5vZGUsIGF0dHIsIHRydWUsIHJlZ2lvbikpOwotCi0JCS8vIHNldCB0ZXh0Ci0JCWluc2VydFRleHQocmVnaW9uLnN0YXJ0LCByZWdpb24uZW5kIC0gcmVnaW9uLnN0YXJ0LCB0ZXh0KTsKLQotCQlmUGFyc2VyLmNsZWFudXBVcGRhdGVDb250ZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXR0clJlbW92ZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTQXR0ckltcGwgYXR0cikgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcihwYXJlbnROb2RlKTsKLQotCQlpZiAoZm9ybWF0dGVyID09IG51bGwpIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNhbm5vdCBnZXQgZm9ybWF0IGFkYXB0ZXIgOiAiICsgcGFyZW50Tm9kZS5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOy8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXNob3J0IHVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX1JFTU9WRV9SQ09OVEFJTkVSOwotCQlmUGFyc2VyLnNldHVwVXBkYXRlQ29udGV4dCh1cGRhdGVNb2RlLCBwYXJlbnROb2RlLCBhdHRyKTsKLQotCQkvLyBnZXQgZm9ybWF0dGVkIGluZm8KLQkJQXR0ckNoYW5nZUNvbnRleHQgcmVnaW9uID0gbmV3IEF0dHJDaGFuZ2VDb250ZXh0KCk7Ci0JCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZyhmb3JtYXR0ZXIuZm9ybWF0QXR0ckNoYW5nZWQocGFyZW50Tm9kZSwgYXR0ciwgZmFsc2UsIHJlZ2lvbikpOwotCi0JCS8vIHNldCB0ZXh0Ci0JCWluc2VydFRleHQocmVnaW9uLnN0YXJ0LCByZWdpb24uZW5kIC0gcmVnaW9uLnN0YXJ0LCB0ZXh0KTsKLQotCQlmUGFyc2VyLmNsZWFudXBVcGRhdGVDb250ZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhdHRyUmVwbGFjZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbmV3QXR0ciwgQ1NTTm9kZUltcGwgb2xkQXR0cikgewotCQlpZiAocGFyZW50Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2xkQXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRyUmVtb3ZlZChwYXJlbnROb2RlLCAoQ1NTQXR0ckltcGwpIG9sZEF0dHIpOwotCQl9Ci0KLQkJaWYgKG5ld0F0dHIgIT0gbnVsbCkgewotCQkJYXR0ckluc2VydGVkKHBhcmVudE5vZGUsIChDU1NBdHRySW1wbCkgbmV3QXR0cik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hpbGRJbnNlcnRlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBub2RlKSB7Ci0JCXNob3J0IHVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX0lETEU7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCXVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX0lOU0VSVF9GTkNPTlRBSU5FUjsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQl1cGRhdGVNb2RlID0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9JTlNFUlRfUkNPTlRBSU5FUjsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIldoYXQncyB0aGlzIG5vZGU/IDogIiArIG5vZGUuZ2V0Q2xhc3MoKS50b1N0cmluZygpKTsvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlmUGFyc2VyLnNldHVwVXBkYXRlQ29udGV4dCh1cGRhdGVNb2RlLCBwYXJlbnROb2RlLCBub2RlKTsKLQotCQlkZWZhdWx0SW5zZXJ0ZWQocGFyZW50Tm9kZSwgbm9kZSk7Ci0KLQkJZlBhcnNlci5jbGVhbnVwVXBkYXRlQ29udGV4dCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGlsZFJlbW92ZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbm9kZSkgewotCQlzaG9ydCB1cGRhdGVNb2RlID0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9JRExFOwotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQl1cGRhdGVNb2RlID0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9SRU1PVkVfRk5DT05UQUlORVI7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikgewotCQkJdXBkYXRlTW9kZSA9IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfUkVNT1ZFX1JDT05UQUlORVI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJXaGF0J3MgdGhpcyBub2RlPyA6ICIgKyBub2RlLmdldENsYXNzKCkudG9TdHJpbmcoKSk7Ly8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZlBhcnNlci5zZXR1cFVwZGF0ZUNvbnRleHQodXBkYXRlTW9kZSwgcGFyZW50Tm9kZSwgbm9kZSk7Ci0KLQkJQ1NTTm9kZUltcGwgcHJldiA9IGdldE9sZFByZXZpb3VzKHBhcmVudE5vZGUsIG5vZGUpOwotCQlDU1NOb2RlSW1wbCBuZXh0ID0gZ2V0T2xkTmV4dChwYXJlbnROb2RlLCBub2RlKTsKLQkJaW50IGluc2VydFBvcyA9IC0xLCBlbmRQb3MgPSAtMTsKLQkJU3RyaW5nIHNvdXJjZSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJaW5zZXJ0UG9zID0gcHJldi5nZXRFbmRPZmZzZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCWluc2VydFBvcyA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWluc2VydFBvcyAtPSBuZWFyZXN0U3BhY2VMZW5ndGhCZWZvcmUocGFyZW50Tm9kZSwgaW5zZXJ0UG9zKTsKLQkJfQotCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQllbmRQb3MgPSBuZXh0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQllbmRQb3MgPSBub2RlLmdldEVuZE9mZnNldCgpOwotCQkJZW5kUG9zICs9IG5lYXJlc3RTcGFjZUxlbmd0aEFmdGVyKHBhcmVudE5vZGUsIGVuZFBvcyk7Ci0JCX0KLQkJc291cmNlID0gZ2V0U3BhY2VCZWZvcmUocGFyZW50Tm9kZSwgbmV4dCwgbm9kZSk7Ci0JCWlmIChzb3VyY2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpbnNlcnRUZXh0KGluc2VydFBvcywgZW5kUG9zIC0gaW5zZXJ0UG9zLCBzb3VyY2UpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVtb3ZlVGV4dChpbnNlcnRQb3MsIGVuZFBvcyAtIGluc2VydFBvcyk7Ci0JCX0KLQotCQlmUGFyc2VyLmNsZWFudXBVcGRhdGVDb250ZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBjaGlsZFJlcGxhY2VkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5ld0NoaWxkLCBDU1NOb2RlSW1wbCBvbGRDaGlsZCkgewotCQlpZiAocGFyZW50Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2xkQ2hpbGQgIT0gbnVsbCkgewotCQkJY2hpbGRSZW1vdmVkKHBhcmVudE5vZGUsIG9sZENoaWxkKTsKLQkJfQotCi0JCWlmIChuZXdDaGlsZCAhPSBudWxsKSB7Ci0JCQljaGlsZEluc2VydGVkKHBhcmVudE5vZGUsIG5ld0NoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZGVmYXVsdEluc2VydGVkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5vZGUpIHsKLQkJaW50IGluc2VydFBvcyA9IC0xOwotCQlJQ1NTTm9kZSBzaWJsaW5nOwotCQlTdHJpbmcgcHJlU3BhY2UgPSAiIiwgcG9zdFNwYWNlID0gIiI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJaW50IGxlbmd0aCA9IDA7Ci0KLQkJaWYgKGluc2VydFBvcyA8IDApIHsKLQkJCWlmICgoc2libGluZyA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkpICE9IG51bGwpIHsKLQkJCQkvLyBhZnRlciBwcmV2aW91cyBjaGlsZAotCQkJCWluc2VydFBvcyA9IGdldFRleHRFbmQoc2libGluZyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaW5zZXJ0UG9zIDwgMCkgewotCQkJaWYgKChzaWJsaW5nID0gbm9kZS5nZXROZXh0U2libGluZygpKSAhPSBudWxsKSB7Ci0JCQkJLy8gYmVmb3JlIG5leHQgY2hpbGQKLQkJCQlpbnNlcnRQb3MgPSBnZXRUZXh0U3RhcnQoc2libGluZyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaW5zZXJ0UG9zIDwgMCkgewotCQkJLy8gcG9zaXRpb24gb2YgcGFyZW50Ci0JCQlpbnNlcnRQb3MgPSBnZXRDaGlsZEluc2VydFBvcyhwYXJlbnROb2RlKTsKLQkJfQotCi0JCWlmIChpbnNlcnRQb3MgPCAwKSB7Ci0JCQkvLyBmaXJzdHRpbWUKLQkJCWluc2VydFBvcyA9IDA7Ci0JCX0KLQotCQkvLyBmb3JtYXQgcHJldmlvdXMgc3BhY2VzCi0JCWxlbmd0aCA9IG5lYXJlc3RTcGFjZUxlbmd0aEJlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRQb3MpOwotCQlpbnNlcnRQb3MgLT0gbGVuZ3RoOwotCQlwcmVTcGFjZSA9IGdldFNwYWNlQmVmb3JlKHBhcmVudE5vZGUsIG5vZGUsIG51bGwpOwotCQkvLyBmb3JtYXQgcG9zdCBzcGFjZXMKLQkJbGVuZ3RoICs9IG5lYXJlc3RTcGFjZUxlbmd0aEFmdGVyKHBhcmVudE5vZGUsIGluc2VydFBvcyArIGxlbmd0aCk7Ci0JCXBvc3RTcGFjZSA9IGdldFNwYWNlQmVmb3JlKHBhcmVudE5vZGUsIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSwgbnVsbCk7Ci0KLQkJLy8gc2V0IHRleHQKLQkJU3RyaW5nIHRleHQgPSBwcmVTcGFjZSArIG5vZGUuZ2VuZXJhdGVTb3VyY2UoKS50cmltKCkgKyBwb3N0U3BhY2U7Ci0JCXJldHVybiBpbnNlcnRUZXh0KGluc2VydFBvcywgbGVuZ3RoLCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKi8KLQlwcml2YXRlIGludCBnZXRDaGlsZEluc2VydFBvcyhDU1NOb2RlSW1wbCBub2RlKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKG5vZGUpOwotCQlpZiAoZm9ybWF0dGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZm9ybWF0dGVyLmdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQllbHNlCi0JCQlyZXR1cm4gbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBnZXRPbGROZXh0KENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5vZGUpIHsKLQkJQ1NTTm9kZUltcGwgY2hpbGQgPSAoQ1NTTm9kZUltcGwpIHBhcmVudE5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCUNTU05vZGVJbXBsIHJldCA9IG51bGw7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZS5nZXRFbmRPZmZzZXQoKSA8IGNoaWxkLmdldEVuZE9mZnNldCgpKQotCQkJCXJldCA9IGNoaWxkOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQkJY2hpbGQgPSAoQ1NTTm9kZUltcGwpIGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgZ2V0T2xkUHJldmlvdXMoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbm9kZSkgewotCQlDU1NOb2RlSW1wbCBjaGlsZCA9IChDU1NOb2RlSW1wbCkgcGFyZW50Tm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCUNTU05vZGVJbXBsIHJldCA9IG51bGw7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0U3RhcnRPZmZzZXQoKSA8IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkKLQkJCQlyZXQgPSBjaGlsZDsKLQkJCWVsc2UKLQkJCQlicmVhazsKLQkJCWNoaWxkID0gKENTU05vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRTcGFjZUJlZm9yZShJQ1NTTm9kZSBwYXJlbnROb2RlLCBJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSB0b1JlbW92ZSkgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgcGFyZW50Tm9kZSk7Ci0KLQkJaWYgKGZvcm1hdHRlciAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24gZXhjZXB0Rm9yID0gbnVsbDsKLQkJCWlmICh0b1JlbW92ZSAhPSBudWxsKSB7Ci0JCQkJQ1NTTm9kZUltcGwgcmVtb3ZlID0gKENTU05vZGVJbXBsKSB0b1JlbW92ZTsKLQkJCQlleGNlcHRGb3IgPSBuZXcgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb24ocmVtb3ZlLmdldFN0YXJ0T2Zmc2V0KCksIHJlbW92ZS5nZXRFbmRPZmZzZXQoKSAtIHJlbW92ZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCX0KLQkJCXJldHVybiBmb3JtYXR0ZXIuZm9ybWF0QmVmb3JlKHBhcmVudE5vZGUsIG5vZGUsIGV4Y2VwdEZvcikudG9TdHJpbmcoKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgaW50IGdldFRleHRFbmQoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgZW5kID0gLTE7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJZW5kID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikgewotCQkJCWVuZCA9ICgoQ1NTUmVnaW9uQ29udGFpbmVyKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW5kOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgaW50IGdldFRleHRTdGFydChJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBzdGFydCA9IC0xOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCXN0YXJ0ID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJc3RhcnQgPSAoKENTU1JlZ2lvbkNvbnRhaW5lcikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBpbnNlcnRUZXh0KGludCBzdGFydCwgaW50IG9sZExlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBmTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKHRleHQgIT0gbnVsbCAmJiAwIDwgb2xkTGVuZ3RoICYmIHN0YXJ0ICsgb2xkTGVuZ3RoIDw9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJCS8vIG1pbmltaXplIHRleHQgY2hhbmdlCi0JCQkJU3RyaW5nIGRlbFRleHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KHN0YXJ0LCBvbGRMZW5ndGgpOwotCQkJCWludCBuZXdMZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOwotCQkJCWludCBzaG9ydGVyTGVuID0gTWF0aC5taW4ob2xkTGVuZ3RoLCBuZXdMZW5ndGgpOwotCQkJCWludCBzdE1hdGNoTGVuOwotCQkJCWZvciAoc3RNYXRjaExlbiA9IDA7IHN0TWF0Y2hMZW4gPCBzaG9ydGVyTGVuICYmIHRleHQuY2hhckF0KHN0TWF0Y2hMZW4pID09IGRlbFRleHQuY2hhckF0KHN0TWF0Y2hMZW4pOyBzdE1hdGNoTGVuKyspIHsKLQkJCQkJLy8gCi0JCQkJfQotCQkJCWlmICgwIDwgc3RNYXRjaExlbiAmJiBzdE1hdGNoTGVuIDwgc2hvcnRlckxlbiAmJiB0ZXh0LmNoYXJBdChzdE1hdGNoTGVuIC0gMSkgPT0gMHgwMDBkICYmICh0ZXh0LmNoYXJBdChzdE1hdGNoTGVuKSA9PSAweDAwMGEgfHwgZGVsVGV4dC5jaGFyQXQoc3RNYXRjaExlbikgPT0gMHgwMDBhKSkgewotCQkJCQkvLyBtdXN0IG5vdCBkaXZpZGUgMGQtPjBhIHNlcXVlbmNlCi0JCQkJCXN0TWF0Y2hMZW4tLTsKLQkJCQl9Ci0JCQkJaWYgKHN0TWF0Y2hMZW4gPT0gc2hvcnRlckxlbikgewotCQkJCQlpZiAob2xkTGVuZ3RoIDwgbmV3TGVuZ3RoKSB7IC8vIGp1c3QgaW5zZXJ0Ci0JCQkJCQlvbGRMZW5ndGggPSAwOwotCQkJCQkJc3RhcnQgKz0gc3RNYXRjaExlbjsKLQkJCQkJCXRleHQgPSB0ZXh0LnN1YnN0cmluZyhzdE1hdGNoTGVuKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChuZXdMZW5ndGggPCBvbGRMZW5ndGgpIHsgLy8ganVzdCByZW1vdmUKLQkJCQkJCW9sZExlbmd0aCAtPSBzdE1hdGNoTGVuOwotCQkJCQkJc3RhcnQgKz0gc3RNYXRjaExlbjsKLQkJCQkJCXRleHQgPSBudWxsOwotCQkJCQl9Ci0JCQkJCWVsc2UgeyAvLyBub3RoaW5nIHRvIGRvCi0JCQkJCQlvbGRMZW5ndGggPSAwOwotCQkJCQkJdGV4dCA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBlZE1hdGNoTGVuOwotCQkJCQlmb3IgKGVkTWF0Y2hMZW4gPSAwOyBzdE1hdGNoTGVuICsgZWRNYXRjaExlbiA8IHNob3J0ZXJMZW4gJiYgdGV4dC5jaGFyQXQobmV3TGVuZ3RoIC0gZWRNYXRjaExlbiAtIDEpID09IGRlbFRleHQuY2hhckF0KG9sZExlbmd0aCAtIGVkTWF0Y2hMZW4gLSAxKTsgZWRNYXRjaExlbisrKSB7Ci0JCQkJCQkvLwotCQkJCQl9Ci0JCQkJCWlmICgwIDwgZWRNYXRjaExlbiAmJiB0ZXh0LmNoYXJBdChuZXdMZW5ndGggLSBlZE1hdGNoTGVuKSA9PSAweDAwMGEgJiYgKChlZE1hdGNoTGVuIDwgbmV3TGVuZ3RoICYmIHRleHQuY2hhckF0KG5ld0xlbmd0aCAtIGVkTWF0Y2hMZW4gLSAxKSA9PSAweDAwMGQpIHx8IChlZE1hdGNoTGVuIDwgb2xkTGVuZ3RoICYmIGRlbFRleHQuY2hhckF0KG9sZExlbmd0aCAtIGVkTWF0Y2hMZW4gLSAxKSA9PSAweDAwMGQpKSkgewotCQkJCQkJLy8gbXVzdCBub3QgZGl2aWRlIDBkLT4wYSBzZXF1ZW5jZQotCQkJCQkJZWRNYXRjaExlbi0tOwotCQkJCQl9Ci0JCQkJCW9sZExlbmd0aCAtPSBzdE1hdGNoTGVuICsgZWRNYXRjaExlbjsKLQkJCQkJc3RhcnQgKz0gc3RNYXRjaExlbjsKLQkJCQkJaWYgKHN0TWF0Y2hMZW4gKyBlZE1hdGNoTGVuIDwgbmV3TGVuZ3RoKSB7Ci0JCQkJCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoc3RNYXRjaExlbiwgbmV3TGVuZ3RoIC0gZWRNYXRjaExlbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl0ZXh0ID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICgwIDwgb2xkTGVuZ3RoIHx8IHRleHQgIT0gbnVsbCkgewotCQkJCS8vIFN0cmluZyBkZWxUZXh0ID0gc3RydWN0dXJlZERvY3VtZW50LmdldChzdGFydCwgb2xkTGVuZ3RoKTsKLQkJCQlyZXN1bHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoZk1vZGVsLCBzdGFydCwgb2xkTGVuZ3RoLCB0ZXh0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHJpdmF0ZSBpbnQgbmVhcmVzdFNwYWNlTGVuZ3RoQWZ0ZXIoQ1NTTm9kZUltcGwgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcihub2RlKTsKLQkJaWYgKGZvcm1hdHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZm9ybWF0dGVyLmdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihub2RlLCBpbnNlcnRQb3MpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHJpdmF0ZSBpbnQgbmVhcmVzdFNwYWNlTGVuZ3RoQmVmb3JlKENTU05vZGVJbXBsIG5vZGUsIGludCBpbnNlcnRQb3MpIHsKLQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIobm9kZSk7Ci0JCWlmIChmb3JtYXR0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZvcm1hdHRlci5nZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKG5vZGUsIGluc2VydFBvcyk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZW1vdmVUZXh0KGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGZNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoZk1vZGVsLCBzdGFydCwgbGVuZ3RoLCBuZXcgU3RyaW5nKCIiKSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRQYXJzZXIoQ1NTTW9kZWxQYXJzZXIgcGFyc2VyKSB7Ci0JCWZQYXJzZXIgPSBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCB2YWx1ZUNoYW5nZWQoQ1NTTm9kZUltcGwgbm9kZSwgU3RyaW5nIG9sZFZhbHVlKSB7Ci0JCWlmICghKG5vZGUgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpKSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJUb28gQmFkLi4iICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJKChub2RlID09IG51bGwpID8gIm51bGwiIDogbm9kZS5nZXRDbGFzcygpLnRvU3RyaW5nKCkpKTsvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc3RhcnQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUpIHsKLQkJCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGU7Ci0JCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgYXR0ci5nZXRPd25lckNTU05vZGUoKSk7Ci0JCQlpZiAoZm9ybWF0dGVyICE9IG51bGwpCi0JCQkJc3RhcnQgPSBmb3JtYXR0ZXIuZ2V0QXR0ckluc2VydFBvcyhhdHRyLmdldE93bmVyQ1NTTm9kZSgpLCBhdHRyLmdldE5hbWUoKSk7Ci0JCX0KLQotCQlpbnQgb2xkTGVuZ3RoID0gKG9sZFZhbHVlID09IG51bGwpID8gMCA6IG9sZFZhbHVlLmxlbmd0aCgpOwotCQkvLyBmbGFzaCBvbGQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi9JVGV4dFJlZ2lvbgotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG5vZGUpLnNldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG5vZGUpLnNldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikgewotCQkJKChDU1NSZWdpb25Db250YWluZXIpIG5vZGUpLnNldFJhbmdlUmVnaW9uKG51bGwsIG51bGwsIG51bGwpOwotCQl9Ci0JCS8vIGdlbmVyYXRlIG5ldyBzb3VyY2UKLQkJU3RyaW5nIG5ld1ZhbHVlID0gbm9kZS5nZW5lcmF0ZVNvdXJjZSgpOwotCi0JCUlDU1NOb2RlIHBhcmVudDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUpIHsKLQkJCXBhcmVudCA9ICgoSUNTU0F0dHIpIG5vZGUpLmdldE93bmVyQ1NTTm9kZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQotCQlmUGFyc2VyLnNldHVwVXBkYXRlQ29udGV4dChDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX0NIQU5HRV9SQ09OVEFJTkVSLCBwYXJlbnQsIG5vZGUpOwotCi0JCWluc2VydFRleHQoc3RhcnQsIG9sZExlbmd0aCwgbmV3VmFsdWUpOwotCi0JCWZQYXJzZXIuY2xlYW51cFVwZGF0ZUNvbnRleHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3YjAxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1J1bGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU01vZGVsVXRpbCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBjYW5Db250YWluQnJhY2UoSUNTU05vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUgIT0gbnVsbCAmJiAobm9kZSBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyIHx8IG5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlRGVjbENvbnRhaW5lcikpID8gdHJ1ZSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0Jc3RhdGljIHZvaWQgY2xlYW51cENvbnRhaW5lcihJQ1NTTm9kZSBwYXJlbnQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJQ1NTTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJY2xlYW51cENvbnRhaW5lcihjaGlsZCk7Ci0JCX0KLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudCkuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkoKENTU1JlZ2lvbkNvbnRhaW5lcikgcGFyZW50KS5zZXRSYW5nZVJlZ2lvbihudWxsLCBudWxsLCBudWxsKTsKLQkJfQotCX0KLQotCXN0YXRpYyBib29sZWFuIGRpYWdub3NlTm9kZShJQ1NTTm9kZSBwYXJlbnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCS8vIGNoZWNrIHRoaXMKLQkJVmVjdG9yIGVycm9ycyA9IG5ldyBWZWN0b3IoKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIG5vZGUgPSAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQ7Ci0JCQlTdHJpbmcgbm9kZVRleHQgPSBDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpICsgIjogIjsvLyROT04tTkxTLTEkCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwgJiYgKCEobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHx8IG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZVNoZWV0SW1wbCkgfHwgbm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCkpIHsKLQkJCQllcnJvcnMuYWRkKG5vZGVUZXh0ICsgImZpcnN0IGZsYXQgbm9kZSBpcyBudWxsLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtb2RlbE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZmxhdE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJaWYgKGZsYXROb2RlICE9IG1vZGVsTm9kZSkgewotCQkJCQllcnJvcnMuYWRkKG5vZGVUZXh0ICsgImZpcnN0IGZsYXQgbm9kZSBpcyBub3QgaW4gbW9kZWwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwgJiYgKCEobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHx8IG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZVNoZWV0SW1wbCkgfHwgbm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCkpIHsKLQkJCQllcnJvcnMuYWRkKG5vZGVUZXh0ICsgImxhc3QgZmxhdCBub2RlIGlzIG51bGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1vZGVsTm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmbGF0Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gbW9kZWxOb2RlKSB7Ci0JCQkJCWVycm9ycy5hZGQobm9kZVRleHQgKyAibGFzdCBmbGF0IG5vZGUgaXMgbm90IGluIG1vZGVsLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikgewotCQkJQ1NTUmVnaW9uQ29udGFpbmVyIG5vZGUgPSAoQ1NTUmVnaW9uQ29udGFpbmVyKSBwYXJlbnQ7Ci0JCQlTdHJpbmcgbm9kZVRleHQgPSBDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpICsgIjogIjsvLyROT04tTkxTLTEkCi0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBub2RlLmdldEZpcnN0UmVnaW9uKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudFJlZ2lvbiA9IG5vZGUuZ2V0RG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCAmJiAoIShub2RlIGluc3RhbmNlb2YgTWVkaWFMaXN0SW1wbCkgfHwgbm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCkpIHsKLQkJCQllcnJvcnMuYWRkKG5vZGVUZXh0ICsgImZpcnN0IHJlZ2lvbiBpcyBudWxsLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCWludCBvZmZzZXQgPSBwYXJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1vZGVsTm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCUlUZXh0UmVnaW9uIG1vZGVsUmVnaW9uID0gbW9kZWxOb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBtb2RlbFJlZ2lvbikgewotCQkJCQllcnJvcnMuYWRkKG5vZGVUZXh0ICsgImZpcnN0IHJlZ2lvbiBpcyBub3QgaW4gbW9kZWwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlyZWdpb24gPSBub2RlLmdldExhc3RSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCAmJiAoIShub2RlIGluc3RhbmNlb2YgTWVkaWFMaXN0SW1wbCkgfHwgbm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCkpIHsKLQkJCQllcnJvcnMuYWRkKG5vZGVUZXh0ICsgImxhc3QgcmVnaW9uIGlzIG51bGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaW50IG9mZnNldCA9IHBhcmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbW9kZWxOb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJSVRleHRSZWdpb24gbW9kZWxSZWdpb24gPSBtb2RlbE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlpZiAocmVnaW9uICE9IG1vZGVsUmVnaW9uKSB7Ci0JCQkJCWVycm9ycy5hZGQobm9kZVRleHQgKyAibGFzdCByZWdpb24gaXMgbm90IGluIG1vZGVsLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSUNTU05vZGVMaXN0IGF0dHJzID0gcGFyZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IG5BdHRycyA9IGF0dHJzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5BdHRyczsgaSsrKSB7Ci0JCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBhdHRycy5pdGVtKGkpOwotCQkJQ1NTUmVnaW9uQ29udGFpbmVyIG5vZGUgPSAoQ1NTUmVnaW9uQ29udGFpbmVyKSBhdHRyOwotCQkJU3RyaW5nIG5vZGVUZXh0ID0gQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSArICIoIiArIGF0dHIuZ2V0TmFtZSgpICsgIik6ICI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG5vZGUuZ2V0Rmlyc3RSZWdpb24oKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50UmVnaW9uID0gbm9kZS5nZXREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsICYmIDAgPCBhdHRyLmdldFZhbHVlKCkubGVuZ3RoKCkpIHsKLQkJCQllcnJvcnMuYWRkKG5vZGVUZXh0ICsgImZpcnN0IHJlZ2lvbiBpcyBudWxsLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCWludCBvZmZzZXQgPSBwYXJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1vZGVsTm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCUlUZXh0UmVnaW9uIG1vZGVsUmVnaW9uID0gbW9kZWxOb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBtb2RlbFJlZ2lvbikgewotCQkJCQllcnJvcnMuYWRkKG5vZGVUZXh0ICsgImZpcnN0IHJlZ2lvbiBpcyBub3QgaW4gbW9kZWwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlyZWdpb24gPSBub2RlLmdldExhc3RSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCAmJiAwIDwgYXR0ci5nZXRWYWx1ZSgpLmxlbmd0aCgpKSB7Ci0JCQkJZXJyb3JzLmFkZChub2RlVGV4dCArICJsYXN0IHJlZ2lvbiBpcyBudWxsLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCWludCBvZmZzZXQgPSBwYXJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1vZGVsTm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCUlUZXh0UmVnaW9uIG1vZGVsUmVnaW9uID0gbW9kZWxOb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBtb2RlbFJlZ2lvbikgewotCQkJCQllcnJvcnMuYWRkKG5vZGVUZXh0ICsgImxhc3QgcmVnaW9uIGlzIG5vdCBpbiBtb2RlbC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghZXJyb3JzLmlzRW1wdHkoKSkgewotCQkJSXRlcmF0b3IgaSA9IGVycm9ycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ1NTVXRpbC5kZWJ1Z091dCgoU3RyaW5nKSBpLm5leHQoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCXN0YXRpYyBib29sZWFuIGRpYWdub3NlVHJlZShJQ1NTTm9kZSBwYXJlbnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIGNoZWNrIGNoaWxkcmVuCi0JCWZvciAoSUNTU05vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWRpYWdub3NlVHJlZShjaGlsZCwgc3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCi0JCWRpYWdub3NlTm9kZShwYXJlbnQsIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogSWYgbmVlZGVkLCBtb2RpZnkgbGFzdCBmbGF0IG5vZGUKLQkgKi8KLQlzdGF0aWMgdm9pZCBleHBhbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHRhcmdldCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAodGFyZ2V0ID09IG51bGwgfHwgZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IHRhcmdldC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChsYXN0Tm9kZSA9PSBmbGF0Tm9kZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChsYXN0Tm9kZSA9PSBudWxsIHx8IGxhc3ROb2RlLmdldFN0YXJ0KCkgPCBmbGF0Tm9kZS5nZXRTdGFydCgpKSB7Ci0JCQl0YXJnZXQuc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXN0YXRpYyBJQ1NTTm9kZSBmaW5kQnJhY2VDb250YWluZXIoSUNTU05vZGUgbm9kZSkgewotCQlmb3IgKElDU1NOb2RlIGkgPSBub2RlOyBpICE9IG51bGw7IGkgPSBpLmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKENTU01vZGVsVXRpbC5jYW5Db250YWluQnJhY2UoaSkpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgaW50IGdldERlcHRoKElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IGRlcHRoID0gLTE7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWRlcHRoKys7Ci0JCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBib29sZWFuIGlzQnJhY2VDbG9zZWQoSUNTU05vZGUgbm9kZSkgewotCQlib29sZWFuIGJDbG9zZWQgPSB0cnVlOwotCQlpZiAoIShub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIGJDbG9zZWQ7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0ID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG5vZGUpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdCA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBub2RlKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmaXJzdCA9PSBudWxsIHx8IGxhc3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGJDbG9zZWQ7Ci0JCX0KLQkJaWYgKGxhc3QuZ2V0U3RhcnQoKSA8IGZpcnN0LmdldFN0YXJ0KCkpIHsKLQkJCXJldHVybiBiQ2xvc2VkOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGZpcnN0OwotCQlpbnQgbk9wZW4gPSAwOwotCQlpbnQgbkNsb3NlID0gMDsKLQkJZG8gewotCQkJU3RyaW5nIHR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCW5PcGVuKys7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCQluQ2xvc2UrKzsKLQkJCX0KLQkJCWZsYXROb2RlID0gZmxhdE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXdoaWxlIChmbGF0Tm9kZSAhPSBudWxsICYmIGZsYXROb2RlICE9IGxhc3QpOwotCi0JCWlmICgobk9wZW4gPT0gMCAmJiBuQ2xvc2UgPT0gMCkgfHwgbkNsb3NlIDwgbk9wZW4pIHsKLQkJCWJDbG9zZWQgPSBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBiQ2xvc2VkOwotCX0KLQotCS8qKgotCSAqIG9ubHkgZm9yIGluc2VydGlvbi4uCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaXNJbnRlcnJ1cHRpb24oQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHRhcmdldCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAodGFyZ2V0ID09IG51bGwgfHwgZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBzdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gdGFyZ2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSB0YXJnZXQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmlyc3ROb2RlICE9IG51bGwgJiYgZmlyc3ROb2RlLmdldFN0YXJ0KCkgPCBzdGFydCAmJiBsYXN0Tm9kZSAhPSBudWxsICYmIHN0YXJ0IDwgbGFzdE5vZGUuZ2V0U3RhcnQoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBib29sZWFuIGlzUGFyZW50T2YoSUNTU05vZGUgcGFyZW50LCBJQ1NTTm9kZSBjaGlsZCkgewotCQlpZiAocGFyZW50ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gY2hpbGQ7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAocGFyZW50ID09IG5vZGUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05hbWVkTm9kZU1hcEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTmFtZWROb2RlTWFwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDIxMTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTmFtZWROb2RlTWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU05hbWVkTm9kZU1hcEltcGwgZXh0ZW5kcyBDU1NOb2RlTGlzdEltcGwgaW1wbGVtZW50cyBJQ1NTTmFtZWROb2RlTWFwIHsKLQotCS8qKgotCSAqIENTU05hbWVkTm9kZU1hcEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NOYW1lZE5vZGVNYXBJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBJQ1NTTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXQgPSBub2Rlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENTU0F0dHJJbXBsICYmICgoQ1NTQXR0ckltcGwpIG9iaikuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UobmFtZSkgPT0gMCkgewotCQkJCXJldHVybiAoSUNTU05vZGUpIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMzdkYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5JbXBvcnRSdWxlQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0Tm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDU1NOb2RlSW1wbCBleHRlbmRzIEFic3RyYWN0Tm90aWZpZXIgaW1wbGVtZW50cyBJQ1NTTm9kZSwgSW5kZXhlZFJlZ2lvbiB7Ci0KLQlwcml2YXRlIENTU0RvY3VtZW50SW1wbCBmT3duZXJEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmUGFyZW50Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmTmV4dFNpYmxpbmcgPSBudWxsOwotCXByaXZhdGUgQ1NTTm9kZUltcGwgZlByZXZpb3VzU2libGluZyA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmRmlyc3RDaGlsZCA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmTGFzdENoaWxkID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ1NTTmFtZWROb2RlTWFwSW1wbCBmQXR0cnMgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTTm9kZUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NOb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NOb2RlSW1wbChDU1NOb2RlSW1wbCB0aGF0KSB7Ci0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMuZk93bmVyRG9jdW1lbnQgPSB0aGF0LmZPd25lckRvY3VtZW50OwotCQkJaWYgKHRoYXQuZkF0dHJzICE9IG51bGwpIHsKLQkJCQlpbnQgbkF0dHJzID0gdGhhdC5mQXR0cnMuZ2V0TGVuZ3RoKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQXR0cnM7IGkrKykgewotCQkJCQlDU1NBdHRySW1wbCBhdHRyID0gKENTU0F0dHJJbXBsKSB0aGF0LmZBdHRycy5pdGVtKGkpOwotCQkJCQlzZXRBdHRyaWJ1dGUoYXR0ci5nZXROYW1lKCksIGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIENTU05vZGVJbXBsIGFwcGVuZENoaWxkKENTU05vZGVJbXBsIG5ld0NoaWxkKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGluc2VydEJlZm9yZShuZXdDaGlsZCwgbnVsbCk7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xvbmVDaGlsZE5vZGVzKElDU1NOb2RlIG5ld1BhcmVudCwgYm9vbGVhbiBkZWVwKSB7Ci0JCWlmIChuZXdQYXJlbnQgPT0gbnVsbCB8fCBuZXdQYXJlbnQgPT0gdGhpcykKLQkJCXJldHVybjsKLQotCQlDU1NOb2RlSW1wbCBjb250YWluZXIgPSAoQ1NTTm9kZUltcGwpIG5ld1BhcmVudDsKLQkJY29udGFpbmVyLnJlbW92ZUNoaWxkTm9kZXMoKTsKLQotCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCUNTU05vZGVJbXBsIGNsb25lZCA9IChDU1NOb2RlSW1wbCkgY2hpbGQuY2xvbmVOb2RlKGRlZXApOwotCQkJaWYgKGNsb25lZCAhPSBudWxsKQotCQkJCWNvbnRhaW5lci5hcHBlbmRDaGlsZChjbG9uZWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IG9mZnNldCkgewotCQlyZXR1cm4gKGdldFN0YXJ0T2Zmc2V0KCkgPD0gb2Zmc2V0ICYmIG9mZnNldCA8IGdldEVuZE9mZnNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRlU291cmNlKCkgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcih0aGlzKTsKLQkJcmV0dXJuIGZvcm1hdHRlci5mb3JtYXQodGhpcykudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0JCUNTU0F0dHJJbXBsIGF0dHIgPSBnZXRBdHRyaWJ1dGVOb2RlKG5hbWUpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIENTU0F0dHJJbXBsIGdldEF0dHJpYnV0ZU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGZBdHRycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IG5BdHRycyA9IGZBdHRycy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQXR0cnM7IGkrKykgewotCQkJQ1NTQXR0ckltcGwgYXR0ciA9IChDU1NBdHRySW1wbCkgZkF0dHJzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ci5tYXRjaE5hbWUobmFtZSkpCi0JCQkJcmV0dXJuIGF0dHI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTmFtZWROb2RlTWFwCi0JICovCi0JcHVibGljIElDU1NOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJaWYgKGZBdHRycyA9PSBudWxsKQotCQkJZkF0dHJzID0gbmV3IENTU05hbWVkTm9kZU1hcEltcGwoKTsKLQkJcmV0dXJuIGZBdHRyczsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCUNTU05vZGVMaXN0SW1wbCBsaXN0ID0gbmV3IENTU05vZGVMaXN0SW1wbCgpOwotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJbGlzdC5hcHBlbmROb2RlKG5vZGUpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCUlDU1NOb2RlIGdldENvbW1vbkFuY2VzdG9yKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWZvciAoSUNTU05vZGUgbmEgPSBub2RlOyBuYSAhPSBudWxsOyBuYSA9IG5hLmdldFBhcmVudE5vZGUoKSkgewotCQkJZm9yIChJQ1NTTm9kZSB0YSA9IHRoaXM7IHRhICE9IG51bGw7IHRhID0gdGEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQkJaWYgKHRhID09IG5hKQotCQkJCQlyZXR1cm4gdGE7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JQ1NTRG9jdW1lbnRJbXBsIGdldENvbnRhaW5lckRvY3VtZW50KCkgewotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSB0aGlzOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NEb2N1bWVudEltcGwpIHsKLQkJCQlDU1NEb2N1bWVudEltcGwgZG9jID0gKENTU0RvY3VtZW50SW1wbCkgbm9kZTsKLQkJCQlpZiAoZG9jLmlzRG9jdW1lbnQoKSkKLQkJCQkJcmV0dXJuIGRvYzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlDU1NOb2RlSW1wbCBnZXRDb250YWluZXJOb2RlKGludCBvZmZzZXQpIHsKLQkJaWYgKCFjb250YWlucyhvZmZzZXQpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChJQ1NTTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlJQ1NTTm9kZSBmb3VuZCA9ICgoQ1NTTm9kZUltcGwpIGNoaWxkKS5nZXRDb250YWluZXJOb2RlKG9mZnNldCk7Ci0JCQlpZiAoZm91bmQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gKENTU05vZGVJbXBsKSBmb3VuZDsKLQkJfQotCi0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBGYWN0b3J5UmVnaXN0cnkgZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCUZhY3RvcnlSZWdpc3RyeSByZWcgPSBtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCWlmIChyZWcgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVnOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBnZXRGaXJzdENoaWxkKCkgewotCQlyZXR1cm4gdGhpcy5mRmlyc3RDaGlsZDsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgZ2V0TGFzdENoaWxkKCkgewotCQlyZXR1cm4gdGhpcy5mTGFzdENoaWxkOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBnZXROZXh0U2libGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZk5leHRTaWJsaW5nOwotCX0KLQotCUlDU1NOb2RlIGdldE5vZGVBdChpbnQgb2Zmc2V0KSB7Ci0JCS8vIHRoZSBzYW1lIGFzIGdldENvbnRhaW5lck5vZGUoKQotCQlyZXR1cm4gZ2V0Q29udGFpbmVyTm9kZShvZmZzZXQpOwotCX0KLQotCXB1YmxpYyBJQ1NTRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZk93bmVyRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGdldFBhcmVudE5vZGUoKSB7Ci0JCXJldHVybiB0aGlzLmZQYXJlbnROb2RlOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBnZXRQcmV2aW91c1NpYmxpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmZQcmV2aW91c1NpYmxpbmc7Ci0JfQotCi0JSUNTU05vZGUgZ2V0Um9vdE5vZGUoKSB7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IChDU1NOb2RlSW1wbCkgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gdGhpczsKLQkJcmV0dXJuIHBhcmVudC5nZXRSb290Tm9kZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkTm9kZXMoKSB7Ci0JCXJldHVybiAodGhpcy5mRmlyc3RDaGlsZCAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIENTU05vZGVJbXBsIGluc2VydEJlZm9yZShDU1NOb2RlSW1wbCBuZXdDaGlsZCwgQ1NTTm9kZUltcGwgcmVmQ2hpbGQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAobmV3Q2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU05vZGVJbXBsIGNoaWxkID0gbmV3Q2hpbGQ7Ci0JCUNTU05vZGVJbXBsIG5leHQgPSByZWZDaGlsZDsKLQkJQ1NTTm9kZUltcGwgcHJldiA9IG51bGw7Ci0JCWlmIChuZXh0ID09IG51bGwpIHsKLQkJCXByZXYgPSB0aGlzLmZMYXN0Q2hpbGQ7Ci0JCQl0aGlzLmZMYXN0Q2hpbGQgPSBjaGlsZDsKLQkJfQotCQllbHNlIHsKLQkJCXByZXYgPSAoQ1NTTm9kZUltcGwpIG5leHQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQluZXh0LnNldFByZXZpb3VzU2libGluZyhjaGlsZCk7Ci0JCX0KLQotCQlpZiAocHJldiA9PSBudWxsKQotCQkJdGhpcy5mRmlyc3RDaGlsZCA9IGNoaWxkOwotCQllbHNlCi0JCQlwcmV2LnNldE5leHRTaWJsaW5nKGNoaWxkKTsKLQkJY2hpbGQuc2V0UHJldmlvdXNTaWJsaW5nKHByZXYpOwotCQljaGlsZC5zZXROZXh0U2libGluZyhuZXh0KTsKLQkJY2hpbGQuc2V0UGFyZW50Tm9kZSh0aGlzKTsKLQotCQlub3RpZnlDaGlsZFJlcGxhY2VkKGNoaWxkLCBudWxsKTsKLQotCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5QXR0clJlcGxhY2VkKENTU05vZGVJbXBsIG5ld0F0dHIsIENTU05vZGVJbXBsIG9sZEF0dHIpIHsKLQkJLy8gZm9yIG1vZGVsCi0JCUlDU1NEb2N1bWVudCBkb2MgPSBnZXRDb250YWluZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUNTU01vZGVsSW1wbCBtb2RlbCA9IChDU1NNb2RlbEltcGwpIGRvYy5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuYXR0clJlcGxhY2VkKHRoaXMsIG5ld0F0dHIsIG9sZEF0dHIpOwotCi0JCS8vIGZvciBhZGFwdGVycwotCQlpbnQgdHlwZSA9IENIQU5HRTsKLQkJaWYgKG5ld0F0dHIgPT0gbnVsbCkKLQkJCXR5cGUgPSBSRU1PVkU7Ci0JCWVsc2UgaWYgKG9sZEF0dHIgPT0gbnVsbCkKLQkJCXR5cGUgPSBBREQ7Ci0JCW5vdGlmeSh0eXBlLCBvbGRBdHRyLCBvbGRBdHRyLCBuZXdBdHRyLCBnZXRTdGFydE9mZnNldCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlDaGlsZFJlcGxhY2VkKENTU05vZGVJbXBsIG5ld0NoaWxkLCBDU1NOb2RlSW1wbCBvbGRDaGlsZCkgewotCQkvLyBmb3IgbW9kZWwKLQkJSUNTU0RvY3VtZW50IGRvYyA9IGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ1NTTW9kZWxJbXBsIG1vZGVsID0gKENTU01vZGVsSW1wbCkgZG9jLmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5jaGlsZFJlcGxhY2VkKHRoaXMsIG5ld0NoaWxkLCBvbGRDaGlsZCk7Ci0KLQkJLy8gZm9yIGFkYXB0ZXJzCi0JCWludCB0eXBlID0gQ0hBTkdFOwotCQlpZiAobmV3Q2hpbGQgPT0gbnVsbCkKLQkJCXR5cGUgPSBSRU1PVkU7Ci0JCWVsc2UgaWYgKG9sZENoaWxkID09IG51bGwpCi0JCQl0eXBlID0gQUREOwotCQlub3RpZnkodHlwZSwgb2xkQ2hpbGQsIG9sZENoaWxkLCBuZXdDaGlsZCwgZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JfQotCi0Jdm9pZCByZW1vdmVBdHRyaWJ1dGVOb2RlKENTU05vZGVJbXBsIGF0dHIpIHsKLQkJLy8gZmluZAotCQlpbnQgbkF0dHJzID0gZkF0dHJzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5BdHRyczsgaSsrKSB7Ci0JCQlpZiAoZkF0dHJzLml0ZW0oaSkgPT0gYXR0cikgewotCQkJCWZBdHRycy5yZW1vdmVOb2RlKGkpOwotCQkJCW5vdGlmeUF0dHJSZXBsYWNlZChudWxsLCBhdHRyKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ1NTTm9kZUltcGwgcmVtb3ZlQ2hpbGQoQ1NTTm9kZUltcGwgb2xkQ2hpbGQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAob2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAob2xkQ2hpbGQuZ2V0UGFyZW50Tm9kZSgpICE9IHRoaXMpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBjbG9zZSBpbXBvcnQgcnVsZXMKLQkJSW1wb3J0UnVsZUNvbGxlY3RvciB0cmF2ID0gbmV3IEltcG9ydFJ1bGVDb2xsZWN0b3IoKTsKLQkJdHJhdi5hcHBseShvbGRDaGlsZCk7Ci0JCUl0ZXJhdG9yIGl0ID0gdHJhdi5nZXRSdWxlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCSgoQ1NTSW1wb3J0UnVsZUltcGwpIGl0Lm5leHQoKSkuY2xvc2VTdHlsZVNoZWV0KCk7Ci0JCX0KLQotCQlDU1NOb2RlSW1wbCBjaGlsZCA9IG9sZENoaWxkOwotCQlDU1NOb2RlSW1wbCBwcmV2ID0gKENTU05vZGVJbXBsKSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJQ1NTTm9kZUltcGwgbmV4dCA9IChDU1NOb2RlSW1wbCkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQlpZiAocHJldiA9PSBudWxsKQotCQkJdGhpcy5mRmlyc3RDaGlsZCA9IG5leHQ7Ci0JCWVsc2UKLQkJCXByZXYuc2V0TmV4dFNpYmxpbmcobmV4dCk7Ci0KLQkJaWYgKG5leHQgPT0gbnVsbCkKLQkJCXRoaXMuZkxhc3RDaGlsZCA9IHByZXY7Ci0JCWVsc2UKLQkJCW5leHQuc2V0UHJldmlvdXNTaWJsaW5nKHByZXYpOwotCi0JCWNoaWxkLnNldFByZXZpb3VzU2libGluZyhudWxsKTsKLQkJY2hpbGQuc2V0TmV4dFNpYmxpbmcobnVsbCk7Ci0JCWNoaWxkLnNldFBhcmVudE5vZGUobnVsbCk7Ci0KLQkJbm90aWZ5Q2hpbGRSZXBsYWNlZChudWxsLCBjaGlsZCk7Ci0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgcmVtb3ZlQ2hpbGROb2RlcygpIHsKLQkJSUNTU05vZGUgbmV4dENoaWxkID0gbnVsbDsKLQkJZm9yIChJQ1NTTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBuZXh0Q2hpbGQpIHsKLQkJCW5leHRDaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlyZW1vdmVDaGlsZCgoQ1NTTm9kZUltcGwpIGNoaWxkKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDU1NOb2RlSW1wbCByZXBsYWNlQ2hpbGQoQ1NTTm9kZUltcGwgbmV3Q2hpbGQsIENTU05vZGVJbXBsIG9sZENoaWxkKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG9sZENoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JCWlmIChuZXdDaGlsZCAhPSBudWxsKQotCQkJaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCBvbGRDaGlsZCk7Ci0JCXJldHVybiByZW1vdmVDaGlsZChvbGRDaGlsZCk7Ci0JfQotCi0JLyoqCi0JICoKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUNTU0F0dHJJbXBsIGF0dHIgPSBnZXRBdHRyaWJ1dGVOb2RlKG5hbWUpOwotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgb2xkVmFsdWUgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMob2xkVmFsdWUpKQotCQkJCXJldHVybjsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKLQkJCQkJcmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGZBdHRycyA9PSBudWxsKQotCQkJCWZBdHRycyA9IG5ldyBDU1NOYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCQlDU1NEb2N1bWVudEltcGwgZG9jID0gKENTU0RvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvYyA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWF0dHIgPSAoQ1NTQXR0ckltcGwpIGRvYy5jcmVhdGVDU1NBdHRyKG5hbWUpOwotCQkJYXR0ci5zZXRPd25lckNTU05vZGUodGhpcyk7Ci0JCQlmQXR0cnMuYXBwZW5kTm9kZShhdHRyKTsKLQkJCW5vdGlmeUF0dHJSZXBsYWNlZChhdHRyLCBudWxsKTsKLQkJfQotCQlhdHRyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY3NzVGV4dAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENzc1RleHQoU3RyaW5nIGNzc1RleHQpIHsKLQkJLy8gVE9ETyA6IGNhbGwgZmxhdCBtb2RlbCBwYXJzZXIgYW5kIHJlcGxhY2UgbXlzZWxmIHdpdGggbmV3IHRocmVlISEKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROZXh0U2libGluZyhJQ1NTTm9kZSBuZXh0U2libGluZykgewotCQl0aGlzLmZOZXh0U2libGluZyA9IChDU1NOb2RlSW1wbCkgbmV4dFNpYmxpbmc7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3duZXJEb2N1bWVudChJQ1NTRG9jdW1lbnQgb3duZXJEb2N1bWVudCkgewotCQl0aGlzLmZPd25lckRvY3VtZW50ID0gKENTU0RvY3VtZW50SW1wbCkgb3duZXJEb2N1bWVudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UGFyZW50Tm9kZShJQ1NTTm9kZSBwYXJlbnROb2RlKSB7Ci0JCXRoaXMuZlBhcmVudE5vZGUgPSAoQ1NTTm9kZUltcGwpIHBhcmVudE5vZGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFByZXZpb3VzU2libGluZyhJQ1NTTm9kZSBwcmV2aW91c1NpYmxpbmcpIHsKLQkJdGhpcy5mUHJldmlvdXNTaWJsaW5nID0gKENTU05vZGVJbXBsKSBwcmV2aW91c1NpYmxpbmc7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaW50IHN0YXJ0ID0gZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaWYgKHN0YXJ0ID49IDApIHsKLQkJCWludCBlbmQgPSBnZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChlbmQgPj0gMCkgewotCQkJCXJlc3VsdCA9IGVuZCAtIHN0YXJ0OwotCQkJCWlmIChyZXN1bHQgPCAtMSkgewotCQkJCQlyZXN1bHQgPSAtMTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOb2RlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQxMzg3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlTGlzdDsKLQotY2xhc3MgQ1NTTm9kZUxpc3RJbXBsIGV4dGVuZHMgQWJzdHJhY3RDU1NOb2RlTGlzdCBpbXBsZW1lbnRzIElDU1NOb2RlTGlzdCB7Ci0KLQlDU1NOb2RlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCXJldHVybiBpdGVtSW1wbChpbmRleCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQYWdlUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUGFnZVJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OWQ1NzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQYWdlUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTUGFnZVJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZURlY2xDb250YWluZXIgaW1wbGVtZW50cyBJQ1NTUGFnZVJ1bGUgewotCi0JSUNTU1NlbGVjdG9yTGlzdCBmU2VsZWN0b3JMaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwobnVsbCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NQYWdlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ1NTUGFnZVJ1bGVJbXBsKENTU1BhZ2VSdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU1BhZ2VSdWxlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTUGFnZVJ1bGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZXh0cmFjdFByZVN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHByZVN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoIkBwYWdlICIpOy8vJE5PTi1OTFMtMSQKLQkJcHJlU3RyLmFwcGVuZChnZXRTZWxlY3RvclRleHQoKSk7Ci0KLQkJcmV0dXJuIHByZVN0ci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBQQUdFUlVMRV9OT0RFOwotCX0KLQotCXB1YmxpYyBJQ1NTU2VsZWN0b3JMaXN0IGdldFNlbGVjdG9ycygpIHsKLQkJcmV0dXJuIGZTZWxlY3Rvckxpc3Q7Ci0JfQotCi0JLyoqCi0JICogVGhlIHBhcnNhYmxlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhZ2Ugc2VsZWN0b3IgZm9yIHRoZSBydWxlLgotCSAqIAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgQ1NTIHN0cmluZyB2YWx1ZSBoYXMKLQkgKiAgICAgICAgICAgICAgICBhIHN5bnRheCBlcnJvciBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcnVsZSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0b3JUZXh0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFNFTEVDVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBQQUdFX1JVTEU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0b3JUZXh0KFN0cmluZyBzZWxlY3RvclRleHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXRBdHRyaWJ1dGUoU0VMRUNUT1IsIHNlbGVjdG9yVGV4dCk7Ci0JCWZTZWxlY3Rvckxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChzZWxlY3RvclRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUHJpbWl0aXZlQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1ByaW1pdGl2ZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDFmMTg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUHJpbWl0aXZlQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci0KLS8qKgotICogCi0gKi8KLWFic3RyYWN0IGNsYXNzIENTU1ByaW1pdGl2ZUNvbnRhaW5lciBleHRlbmRzIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCB7Ci0KLQlDU1NQcmltaXRpdmVDb250YWluZXIoQ1NTUHJpbWl0aXZlQ29udGFpbmVyIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JQ1NTUHJpbWl0aXZlQ29udGFpbmVyKHNob3J0IHByaW1pdGl2ZVR5cGUpIHsKLQkJc3VwZXIocHJpbWl0aXZlVHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdFByaW1pdGl2ZXMoKTsKLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE93bmVyRG9jdW1lbnQoSUNTU0RvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQotCQlpbml0UHJpbWl0aXZlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUHJpbWl0aXZlVmFsdWVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1ByaW1pdGl2ZVZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmJjMDk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUHJpbWl0aXZlVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ291bnRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuUkdCQ29sb3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLlJlY3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGV4dGVuZHMgQ1NTUmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgSUNTU1ByaW1pdGl2ZVZhbHVlIHsKLQotCXByb3RlY3RlZCBzaG9ydCBmUHJpbWl0aXZlVHlwZSA9IENTU19VTktOT1dOOwotCXByaXZhdGUgZmxvYXQgZkZsb2F0VmFsdWUgPSAwLjBmOwotCXByaXZhdGUgU3RyaW5nIGZTdHJpbmdWYWx1ZSA9IG51bGw7Ci0KLQlDU1NQcmltaXRpdmVWYWx1ZUltcGwoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJdGhpcy5mUHJpbWl0aXZlVHlwZSA9IHRoYXQuZlByaW1pdGl2ZVR5cGU7Ci0JCXRoaXMuZkZsb2F0VmFsdWUgPSB0aGF0LmZGbG9hdFZhbHVlOwotCQl0aGlzLmZTdHJpbmdWYWx1ZSA9IHRoYXQuZlN0cmluZ1ZhbHVlOwotCX0KLQotCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbChzaG9ydCBwcmltaXRpdmVUeXBlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZQcmltaXRpdmVUeXBlID0gcHJpbWl0aXZlVHlwZTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgY2xvbmVkID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGlzKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBDb3VudGVyIHZhbHVlLiBJZiB0aGlzIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogY29udGFpbiBhIGNvdW50ZXIgdmFsdWUsIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBpcyByYWlzZWQuCi0JICogTW9kaWZpY2F0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHByb3BlcnR5IGNhbiBiZSBhY2hpZXZlZCB1c2luZwotCSAqIHRoZSA8Y29kZT5Db3VudGVyPC9jb2RlPiBpbnRlcmZhY2UuCi0JICogCi0JICogQHJldHVybiBUaGUgQ291bnRlciB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBDb3VudGVyIHZhbHVlIChlLmcuIHRoaXMgaXMgbm90Ci0JICogICAgICAgICAgICAgICAgPGNvZGU+Q1NTX0NPVU5URVI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgQ291bnRlciBnZXRDb3VudGVyVmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENTU1ZhbHVlVGV4dCgpIHsKLQkJcmV0dXJuIGdldENzc1RleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBBIGNvZGUgZGVmaW5pbmcgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIGFzIGRlZmluZWQgYWJvdmUuCi0JICovCi0JcHVibGljIHNob3J0IGdldENzc1ZhbHVlVHlwZSgpIHsKLQkJaWYgKGdldFByaW1pdGl2ZVR5cGUoKSA9PSBDU1NfSU5IRVJJVF9QUklNSVRJVkUpIHsKLQkJCXJldHVybiBDU1NfSU5IRVJJVDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDU1NfUFJJTUlUSVZFX1ZBTFVFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgYSBmbG9hdCB2YWx1ZSBpbiBhIHNwZWNpZmllZCB1bml0LiBJZiB0aGlzCi0JICogQ1NTIHZhbHVlIGRvZXNuJ3QgY29udGFpbiBhIGZsb2F0IHZhbHVlIG9yIGNhbid0IGJlIGNvbnZlcnRlZCBpbnRvIHRoZQotCSAqIHNwZWNpZmllZCB1bml0LCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gaXMgcmFpc2VkLgotCSAqIAotCSAqIEBwYXJhbSB1bml0VHlwZQotCSAqICAgICAgICAgICAgQSB1bml0IGNvZGUgdG8gZ2V0IHRoZSBmbG9hdCB2YWx1ZS4gVGhlIHVuaXQgY29kZSBjYW4gb25seQotCSAqICAgICAgICAgICAgYmUgYSBmbG9hdCB1bml0IHR5cGUgKGkuZS4gPGNvZGU+Q1NTX05VTUJFUjwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfUEVSQ0VOVEFHRTwvY29kZT4sPGNvZGU+Q1NTX0VNUzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfRVhTPC9jb2RlPiw8Y29kZT5DU1NfUFg8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0NNPC9jb2RlPiw8Y29kZT5DU1NfTU08L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0lOPC9jb2RlPiw8Y29kZT5DU1NfUFQ8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX1BDPC9jb2RlPiw8Y29kZT5DU1NfREVHPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19SQUQ8L2NvZGU+LDxjb2RlPkNTU19HUkFEPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19NUzwvY29kZT4sPGNvZGU+Q1NTX1M8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0haPC9jb2RlPiw8Y29kZT5DU1NfS0haPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19ESU1FTlNJT048L2NvZGU+KS4KLQkgKiBAcmV0dXJuIFRoZSBmbG9hdCB2YWx1ZSBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiAgICAgICAgICAgICAgICBjb250YWluIGEgZmxvYXQgdmFsdWUgb3IgaWYgdGhlIGZsb2F0IHZhbHVlIGNhbid0IGJlCi0JICogICAgICAgICAgICAgICAgY29udmVydGVkIGludG8gdGhlIHNwZWNpZmllZCB1bml0LgotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRGbG9hdFZhbHVlKHNob3J0IHVuaXRUeXBlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc3dpdGNoIChmUHJpbWl0aXZlVHlwZSkgewotCQkJY2FzZSBDU1NfTlVNQkVSIDoKLQkJCWNhc2UgQ1NTX1BFUkNFTlRBR0UgOgotCQkJY2FzZSBDU1NfRU1TIDoKLQkJCWNhc2UgQ1NTX0VYUyA6Ci0JCQljYXNlIENTU19QWCA6Ci0JCQljYXNlIENTU19DTSA6Ci0JCQljYXNlIENTU19NTSA6Ci0JCQljYXNlIENTU19JTiA6Ci0JCQljYXNlIENTU19QVCA6Ci0JCQljYXNlIENTU19QQyA6Ci0JCQljYXNlIENTU19ERUcgOgotCQkJY2FzZSBDU1NfUkFEIDoKLQkJCWNhc2UgQ1NTX0dSQUQgOgotCQkJY2FzZSBDU1NfTVMgOgotCQkJY2FzZSBDU1NfUyA6Ci0JCQljYXNlIENTU19IWiA6Ci0JCQljYXNlIENTU19LSFogOgotCQkJY2FzZSBDU1NfRElNRU5TSU9OIDoKLQkJCWNhc2UgQ1NTX0lOVEVHRVIgOgotCQkJY2FzZSBDU1NfSEFTSCA6Ci0JCQkJcmV0dXJuIGZGbG9hdFZhbHVlOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMjAwMS8wMS8xNwotCSAqIDEyOjEyOjE4KQotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBQUklNSVRJVkVWQUxVRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSBjb25zdGFudHMgc3BlY2lmaWVkIGFib3ZlLgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRQcmltaXRpdmVUeXBlKCkgewotCQlyZXR1cm4gZlByaW1pdGl2ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIFJlY3QgdmFsdWUuIElmIHRoaXMgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiBjb250YWluIGEgcmVjdCB2YWx1ZSwgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IGlzIHJhaXNlZC4KLQkgKiBNb2RpZmljYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgY2FuIGJlIGFjaGlldmVkIHVzaW5nCi0JICogdGhlIDxjb2RlPlJlY3Q8L2NvZGU+IGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBSZWN0IHZhbHVlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogICAgICAgICAgICAgICAgY29udGFpbiBhIFJlY3QgdmFsdWUuIChlLmcuIHRoaXMgaXMgbm90Ci0JICogICAgICAgICAgICAgICAgPGNvZGU+Q1NTX1JFQ1Q8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgUmVjdCBnZXRSZWN0VmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBSR0IgY29sb3IuIElmIHRoaXMgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiBjb250YWluIGEgUkdCIGNvbG9yIHZhbHVlLCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gaXMgcmFpc2VkLgotCSAqIE1vZGlmaWNhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcKLQkgKiB0aGUgPGNvZGU+UkdCQ29sb3I8L2NvZGU+IGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBSR0IgY29sb3IgdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgYXR0YWNoZWQgcHJvcGVydHkKLQkgKiAgICAgICAgICAgICAgICBjYW4ndCByZXR1cm4gYSBSR0IgY29sb3IgdmFsdWUgKGUuZy4gdGhpcyBpcyBub3QKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5DU1NfUkdCQ09MT1I8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgUkdCQ29sb3IgZ2V0UkdCQ29sb3JWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0FDQ0VTU19FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIHN0cmluZyB2YWx1ZS4gSWYgdGhlIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogY29udGFpbiBhIHN0cmluZyB2YWx1ZSwgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IGlzIHJhaXNlZC4gU29tZQotCSAqIHByb3BlcnRpZXMgKGxpa2UgJ2ZvbnQtZmFtaWx5JyBvciAndm9pY2UtZmFtaWx5JykgY29udmVydCBhIHdoaXRlc3BhY2UKLQkgKiBzZXBhcmF0ZWQgbGlzdCBvZiBpZGVudHMgdG8gYSBzdHJpbmcuCi0JICogCi0JICogQHJldHVybiBUaGUgc3RyaW5nIHZhbHVlIGluIHRoZSBjdXJyZW50IHVuaXQuIFRoZSBjdXJyZW50Ci0JICogICAgICAgICA8Y29kZT5wcmltaXRpdmVUeXBlPC9jb2RlPiBjYW4gb25seSBiZSBhIHN0cmluZyB1bml0IHR5cGUKLQkgKiAgICAgICAgIChpLmUuIDxjb2RlPkNTU19TVFJJTkc8L2NvZGU+LDxjb2RlPkNTU19VUkk8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+Q1NTX0lERU5UPC9jb2RlPiBhbmQgPGNvZGU+Q1NTX0FUVFI8L2NvZGU+KS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBzdHJpbmcgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzd2l0Y2ggKGZQcmltaXRpdmVUeXBlKSB7Ci0JCQljYXNlIENTU19TVFJJTkcgOgotCQkJY2FzZSBDU1NfVVJJIDoKLQkJCWNhc2UgQ1NTX0lERU5UIDoKLQkJCWNhc2UgQ1NTX0FUVFIgOgotCQkJY2FzZSBDU1NfVVJBTkdFIDoKLQkJCWNhc2UgQ1NTX0ZPUk1BVCA6Ci0JCQljYXNlIENTU19MT0NBTCA6Ci0JCQljYXNlIENTU19IQVNIIDoKLQkJCWNhc2UgQ1NTX0NPTU1BIDoKLQkJCWNhc2UgQ1NTX1NMQVNIIDoKLQkJCWNhc2UgQ1NTX0lOSEVSSVRfUFJJTUlUSVZFIDoKLQkJCQlyZXR1cm4gZlN0cmluZ1ZhbHVlOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5VmFsdWVDaGFuZ2VkKFN0cmluZyBvbGRWYWx1ZSkgewotCQkvLyBmb3IgbW9kZWwKLQkJSUNTU0RvY3VtZW50IGRvYyA9IGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ1NTTW9kZWxJbXBsIG1vZGVsID0gKENTU01vZGVsSW1wbCkgZG9jLmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC52YWx1ZUNoYW5nZWQodGhpcywgb2xkVmFsdWUpOwotCi0JCS8vIGZvciBhZGFwdGVycwotCQlub3RpZnkoQ0hBTkdFLCBuZXcgU2hvcnQoZlByaW1pdGl2ZVR5cGUpLCBudWxsLCBudWxsLCBnZXRTdGFydE9mZnNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBIG1ldGhvZCB0byBzZXQgdGhlIGZsb2F0IHZhbHVlIHdpdGggYSBzcGVjaWZpZWQgdW5pdC4gSWYgdGhlIHByb3BlcnR5Ci0JICogYXR0YWNoZWQgd2l0aCB0aGlzIHZhbHVlIGNhbiBub3QgYWNjZXB0IHRoZSBzcGVjaWZpZWQgdW5pdCBvciB0aGUgZmxvYXQKLQkgKiB2YWx1ZSwgdGhlIHZhbHVlIHdpbGwgYmUgdW5jaGFuZ2VkIGFuZCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4KLQkgKiB3aWxsIGJlIHJhaXNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdW5pdFR5cGUKLQkgKiAgICAgICAgICAgIEEgdW5pdCBjb2RlIGFzIGRlZmluZWQgYWJvdmUuIFRoZSB1bml0IGNvZGUgY2FuIG9ubHkgYmUgYQotCSAqICAgICAgICAgICAgZmxvYXQgdW5pdCB0eXBlIChpLmUuIDxjb2RlPkNTU19OVU1CRVI8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX1BFUkNFTlRBR0U8L2NvZGU+LDxjb2RlPkNTU19FTVM8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0VYUzwvY29kZT4sPGNvZGU+Q1NTX1BYPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19DTTwvY29kZT4sPGNvZGU+Q1NTX01NPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19JTjwvY29kZT4sPGNvZGU+Q1NTX1BUPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19QQzwvY29kZT4sPGNvZGU+Q1NTX0RFRzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfUkFEPC9jb2RlPiw8Y29kZT5DU1NfR1JBRDwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfTVM8L2NvZGU+LDxjb2RlPkNTU19TPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19IWjwvY29kZT4sPGNvZGU+Q1NTX0tIWjwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfRElNRU5TSU9OPC9jb2RlPikuCi0JICogQHBhcmFtIGZsb2F0VmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgZmxvYXQgdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgYXR0YWNoZWQgcHJvcGVydHkKLQkgKiAgICAgICAgICAgICAgICBkb2Vzbid0IHN1cHBvcnQgdGhlIGZsb2F0IHZhbHVlIG9yIHRoZSB1bml0IHR5cGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmxvYXRWYWx1ZShzaG9ydCB1bml0VHlwZSwgZmxvYXQgZmxvYXRWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXN3aXRjaCAodW5pdFR5cGUpIHsKLQkJCWNhc2UgQ1NTX05VTUJFUiA6Ci0JCQljYXNlIENTU19QRVJDRU5UQUdFIDoKLQkJCWNhc2UgQ1NTX0VNUyA6Ci0JCQljYXNlIENTU19FWFMgOgotCQkJY2FzZSBDU1NfUFggOgotCQkJY2FzZSBDU1NfQ00gOgotCQkJY2FzZSBDU1NfTU0gOgotCQkJY2FzZSBDU1NfSU4gOgotCQkJY2FzZSBDU1NfUFQgOgotCQkJY2FzZSBDU1NfUEMgOgotCQkJY2FzZSBDU1NfREVHIDoKLQkJCWNhc2UgQ1NTX1JBRCA6Ci0JCQljYXNlIENTU19HUkFEIDoKLQkJCWNhc2UgQ1NTX01TIDoKLQkJCWNhc2UgQ1NTX1MgOgotCQkJY2FzZSBDU1NfSFogOgotCQkJY2FzZSBDU1NfS0haIDoKLQkJCWNhc2UgQ1NTX0RJTUVOU0lPTiA6Ci0JCQljYXNlIENTU19JTlRFR0VSIDoKLQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBnZXRDU1NWYWx1ZVRleHQoKTsKLQkJCQlmUHJpbWl0aXZlVHlwZSA9IHVuaXRUeXBlOwotCQkJCWZGbG9hdFZhbHVlID0gZmxvYXRWYWx1ZTsKLQkJCQlub3RpZnlWYWx1ZUNoYW5nZWQob2xkVmFsdWUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBtZXRob2QgdG8gc2V0IHRoZSBzdHJpbmcgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIHVuaXQuIElmIHRoZQotCSAqIHByb3BlcnR5IGF0dGFjaGVkIHRvIHRoaXMgdmFsdWUgY2FuJ3QgYWNjZXB0IHRoZSBzcGVjaWZpZWQgdW5pdCBvciB0aGUKLQkgKiBzdHJpbmcgdmFsdWUsIHRoZSB2YWx1ZSB3aWxsIGJlIHVuY2hhbmdlZCBhbmQgYQotCSAqIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSByYWlzZWQuCi0JICogCi0JICogQHBhcmFtIHN0cmluZ1R5cGUKLQkgKiAgICAgICAgICAgIEEgc3RyaW5nIGNvZGUgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIHN0cmluZyBjb2RlIGNhbiBvbmx5IGJlCi0JICogICAgICAgICAgICBhIHN0cmluZyB1bml0IHR5cGUgKGkuZS4gPGNvZGU+Q1NTX1NUUklORzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfVVJJPC9jb2RlPiw8Y29kZT5DU1NfSURFTlQ8L2NvZGU+LCBhbmQKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19BVFRSPC9jb2RlPikuCi0JICogQHBhcmFtIHN0cmluZ1ZhbHVlCi0JICogICAgICAgICAgICBUaGUgbmV3IHN0cmluZyB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBzdHJpbmcgdmFsdWUgb3IgaWYgdGhlIHN0cmluZyB2YWx1ZSBjYW4ndCBiZQotCSAqICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgdW5pdC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJpbmdWYWx1ZShzaG9ydCBzdHJpbmdUeXBlLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzd2l0Y2ggKHN0cmluZ1R5cGUpIHsKLQkJCWNhc2UgQ1NTX1NUUklORyA6Ci0JCQljYXNlIENTU19VUkkgOgotCQkJY2FzZSBDU1NfSURFTlQgOgotCQkJY2FzZSBDU1NfQVRUUiA6Ci0JCQljYXNlIENTU19VUkFOR0UgOgotCQkJY2FzZSBDU1NfRk9STUFUIDoKLQkJCWNhc2UgQ1NTX0xPQ0FMIDoKLQkJCWNhc2UgQ1NTX0hBU0ggOgotCQkJY2FzZSBDU1NfQ09NTUEgOgotCQkJY2FzZSBDU1NfU0xBU0ggOgotCQkJY2FzZSBDU1NfSU5IRVJJVF9QUklNSVRJVkUgOgotCQkJCVN0cmluZyBvbGRWYWx1ZSA9IGdldENTU1ZhbHVlVGV4dCgpOwotCQkJCWZQcmltaXRpdmVUeXBlID0gc3RyaW5nVHlwZTsKLQkJCQlmU3RyaW5nVmFsdWUgPSBzdHJpbmdWYWx1ZTsKLQkJCQlub3RpZnlWYWx1ZUNoYW5nZWQob2xkVmFsdWUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMjAwMS8wMS8yNAotCSAqIDE1OjA2OjI1KQotCSAqIAotCSAqIEBwYXJhbSBmbG9hdFZhbHVlCi0JICogICAgICAgICAgICBmbG9hdAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShmbG9hdCBmbG9hdFZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0RmxvYXRWYWx1ZShnZXRQcmltaXRpdmVUeXBlKCksIGZsb2F0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIwMDEvMDEvMjQKLQkgKiAxNTowNjoyNSkKLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nVmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoamF2YS5sYW5nLlN0cmluZyBzdHJpbmdWYWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldFN0cmluZ1ZhbHVlKGdldFByaW1pdGl2ZVR5cGUoKSwgc3RyaW5nVmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUmVnaW9uQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1JlZ2lvbkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTVjYWVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUmVnaW9uQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ1NTUmVnaW9uQ29udGFpbmVyIGV4dGVuZHMgQ1NTTm9kZUltcGwgewotCi0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBmRmlyc3RSZWdpb24gPSBudWxsOwotCXByaXZhdGUgSVRleHRSZWdpb24gZkxhc3RSZWdpb24gPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmUGFyZW50UmVnaW9uID0gbnVsbDsKLQotCS8qKgotCSAqIENTU1JlZ2lvbkNvbnRhaW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU1JlZ2lvbkNvbnRhaW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NSZWdpb25Db250YWluZXIoQ1NTUmVnaW9uQ29udGFpbmVyIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDc3NUZXh0KCkgewotCQlpZiAoZkZpcnN0UmVnaW9uID09IG51bGwgfHwgZkxhc3RSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBnZW5lcmF0ZVNvdXJjZSgpOwotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZlBhcmVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJvb2xlYW4gYkluID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gY3VycmVudCA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKGJJbikgewotCQkJCXNvdXJjZS5hcHBlbmQoZlBhcmVudFJlZ2lvbi5nZXRGdWxsVGV4dChjdXJyZW50KSk7Ci0JCQkJaWYgKGN1cnJlbnQgPT0gZkxhc3RSZWdpb24pCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGN1cnJlbnQgPT0gZkZpcnN0UmVnaW9uKSB7Ci0JCQkJCWJJbiA9IHRydWU7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZlBhcmVudFJlZ2lvbi5nZXRGdWxsVGV4dChjdXJyZW50KSk7Ci0JCQkJCWlmIChjdXJyZW50ID09IGZMYXN0UmVnaW9uKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2UudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldExhc3RSZWdpb24oKTsKLQkJaWYgKCEocmVnaW9uID09IG51bGwgfHwgZlBhcmVudFJlZ2lvbiA9PSBudWxsKSkgewotCQkJcmVzdWx0ID0gZlBhcmVudFJlZ2lvbi5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBmUGFyZW50UmVnaW9uOwotCX0KLQotCUlUZXh0UmVnaW9uIGdldEZpcnN0UmVnaW9uKCkgewotCQlyZXR1cm4gZkZpcnN0UmVnaW9uOwotCX0KLQotCUlUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKSB7Ci0JCXJldHVybiBmTGFzdFJlZ2lvbjsKLQl9Ci0KLQlJVGV4dFJlZ2lvbiBnZXRSZWdpb24oaW50IGluZGV4KSB7Ci0JCWlmIChnZXRGaXJzdFJlZ2lvbigpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmUGFyZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChyZWdpb25zLmdldChpKSA9PSBnZXRGaXJzdFJlZ2lvbigpKSB7Ci0JCQkJaWYgKGkgKyBpbmRleCA8IHJlZ2lvbnMuc2l6ZSgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHRhcmdldCA9IHJlZ2lvbnMuZ2V0KGkgKyBpbmRleCk7Ci0JCQkJCWlmICh0YXJnZXQuZ2V0U3RhcnQoKSA8PSBnZXRMYXN0UmVnaW9uKCkuZ2V0U3RhcnQoKSkKLQkJCQkJCXJldHVybiB0YXJnZXQ7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldFJlZ2lvbkNvdW50KCkgewotCQl2YWxpZGF0ZVJhbmdlKCk7Ci0KLQkJaWYgKGdldEZpcnN0UmVnaW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlpZiAoZ2V0Rmlyc3RSZWdpb24oKSA9PSBnZXRMYXN0UmVnaW9uKCkpCi0JCQlyZXR1cm4gMTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmUGFyZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gY3VycmVudCA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKGogIT0gMCB8fCBjdXJyZW50ID09IGdldEZpcnN0UmVnaW9uKCkpCi0JCQkJaisrOwotCQkJaWYgKGN1cnJlbnQgPT0gZ2V0TGFzdFJlZ2lvbigpKQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBqOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRGaXJzdFJlZ2lvbigpOwotCQlpZiAoIShyZWdpb24gPT0gbnVsbCB8fCBmUGFyZW50UmVnaW9uID09IG51bGwpKSB7Ci0JCQlyZXN1bHQgPSBmUGFyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlJVGV4dFJlZ2lvbiBzZXRGaXJzdFJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJdGhpcy5mRmlyc3RSZWdpb24gPSByZWdpb247Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlJVGV4dFJlZ2lvbiBzZXRMYXN0UmVnaW9uKElUZXh0UmVnaW9uIGxhc3RSZWdpb24pIHsKLQkJdGhpcy5mTGFzdFJlZ2lvbiA9IGxhc3RSZWdpb247Ci0JCXJldHVybiBsYXN0UmVnaW9uOwotCX0KLQotCXZvaWQgc2V0UmFuZ2VSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnRSZWdpb24sIElUZXh0UmVnaW9uIGZpcnN0UmVnaW9uLCBJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uKSB7Ci0JCXRoaXMuZlBhcmVudFJlZ2lvbiA9IHBhcmVudFJlZ2lvbjsKLQkJdGhpcy5mRmlyc3RSZWdpb24gPSBmaXJzdFJlZ2lvbjsKLQkJdGhpcy5mTGFzdFJlZ2lvbiA9IGxhc3RSZWdpb247Ci0KLQkJaWYgKGZpcnN0UmVnaW9uID09IG51bGwgJiYgbGFzdFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlzZXRGaXJzdFJlZ2lvbihudWxsKTsKLQkJCXNldExhc3RSZWdpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSB7IC8vIHJhbmdlIHZhbGlkYXRpb24KLQkJCXZhbGlkYXRlUmFuZ2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVJhbmdlKCkgewotCQlib29sZWFuIGJNb2RpZmllZCA9IGZhbHNlOwotCi0JCWlmICh0aGlzLmZGaXJzdFJlZ2lvbiAhPSBudWxsIHx8IHRoaXMuZkxhc3RSZWdpb24gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZkZpcnN0UmVnaW9uID09IG51bGwpIHsKLQkJCQl0aGlzLmZGaXJzdFJlZ2lvbiA9IHRoaXMuZkxhc3RSZWdpb247Ci0JCQkJYk1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRoaXMuZkxhc3RSZWdpb24gPT0gbnVsbCkgewotCQkJCXRoaXMuZkxhc3RSZWdpb24gPSB0aGlzLmZGaXJzdFJlZ2lvbjsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAodGhpcy5mRmlyc3RSZWdpb24uZ2V0U3RhcnQoKSA+IHRoaXMuZkxhc3RSZWdpb24uZ2V0U3RhcnQoKSkgewotCQkJCS8vIG5lZWQgdG8gc3dhcCBmaXJzdCBmb3IgbGFzdAotCQkJCUlUZXh0UmVnaW9uIHJlZyA9IGZGaXJzdFJlZ2lvbjsKLQkJCQlmRmlyc3RSZWdpb24gPSBmTGFzdFJlZ2lvbjsKLQkJCQlmTGFzdFJlZ2lvbiA9IHJlZzsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBiTW9kaWZpZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlRGVjbENvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlRGVjbENvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDM4MTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZURlY2xDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uOwotCi0KLS8qKgotICogCi0gKi8KLWFic3RyYWN0IGNsYXNzIENTU1J1bGVEZWNsQ29udGFpbmVyIGV4dGVuZHMgQ1NTUnVsZUltcGwgewotCi0JLyoqCi0JICogQ1NTUnVsZURlY2xDb250YWluZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NSdWxlRGVjbENvbnRhaW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDU1NSdWxlRGVjbENvbnRhaW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqLwotCUNTU1J1bGVEZWNsQ29udGFpbmVyKENTU1J1bGVEZWNsQ29udGFpbmVyIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JYWJzdHJhY3QgU3RyaW5nIGV4dHJhY3RQcmVTdHJpbmcoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRTdHlsZSgpIHsKLQotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uKQotCQkJCXJldHVybiAoQ1NTU3R5bGVEZWNsYXJhdGlvbikgbm9kZTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJlNmUzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1J1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVTaGVldDsKLQotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBDU1NSdWxlSW1wbCBleHRlbmRzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIENTU1J1bGUgewotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ1NTUnVsZUltcGwoQ1NTUnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHJ1bGUgaXMgY29udGFpbmVkIGluc2lkZSBhbm90aGVyIHJ1bGUgKGUuZy4gYSBzdHlsZSBydWxlIGluc2lkZQotCSAqIGFuCi0JICogCi0JICogQG1lZGlhIGJsb2NrKSwgdGhpcyBpcyB0aGUgY29udGFpbmluZyBydWxlLiBJZiB0aGlzIHJ1bGUgaXMgbm90IG5lc3RlZAotCSAqICAgICAgICBpbnNpZGUgYW55IG90aGVyIHJ1bGVzLCB0aGlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIENTU1J1bGUgZ2V0UGFyZW50UnVsZSgpIHsKLQkJSUNTU05vZGUgcnVsZSA9IGdldFBhcmVudE5vZGUoKTsKLQotCQkvLyBwYXJlbnQgcnVsZSBpcyB1c2VkIG9ubHkgaWYgcGFyZW50IGlzIG1lZGlhIHJ1bGUKLQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBDU1NNZWRpYVJ1bGVJbXBsKQotCQkJcmV0dXJuIChDU1NSdWxlKSBydWxlOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdHlsZSBzaGVldCB0aGF0IGNvbnRhaW5zIHRoaXMgcnVsZS4KLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVTaGVldCBnZXRQYXJlbnRTdHlsZVNoZWV0KCkgewotCQlJQ1NTTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXRJbXBsKQotCQkJCXJldHVybiAoQ1NTU3R5bGVTaGVldCkgcGFyZW50OwotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHNob3J0IGdldFR5cGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1J1bGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWYxNWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZUxpc3Q7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NSdWxlTGlzdEltcGwgZXh0ZW5kcyBBYnN0cmFjdENTU05vZGVMaXN0IGltcGxlbWVudHMgQ1NTUnVsZUxpc3QgewotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTUnVsZUxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gcmV0cmlldmUgYSBDU1MgcnVsZSBieSBvcmRpbmFsIGluZGV4LiBUaGUgb3JkZXIgaW4gdGhpcwotCSAqIGNvbGxlY3Rpb24gcmVwcmVzZW50cyB0aGUgb3JkZXIgb2YgdGhlIHJ1bGVzIGluIHRoZSBDU1Mgc3R5bGUgc2hlZXQuIElmCi0JICogaW5kZXggaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcnVsZXMgaW4gdGhlIGxpc3QsIHRoaXMKLQkgKiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleEluZGV4Ci0JICogICAgICAgICAgICBpbnRvIHRoZSBjb2xsZWN0aW9uCi0JICogQHJldHVybiBUaGUgc3R5bGUgcnVsZSBhdCB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+IHBvc2l0aW9uIGluIHRoZQotCSAqICAgICAgICAgPGNvZGU+Q1NTUnVsZUxpc3Q8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGF0IGlzCi0JICogICAgICAgICBub3QgYSB2YWxpZCBpbmRleC4KLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZSBpdGVtKGludCBpbmRleCkgewotCQlyZXR1cm4gKENTU1J1bGUpIGl0ZW1JbXBsKGluZGV4KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWU3ZThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNlbGVjdG9yQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JDb21iaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLk5hbWVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTU2VsZWN0b3IgaW1wbGVtZW50cyBJQ1NTU2VsZWN0b3IgewotCi0JcHJpdmF0ZSBpbnQgZlNwZWNpZmljaXR5ID0gLTE7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNhY2hlZFN0cmluZyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZUb2tlbnMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmSXRlbXMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmUGFyc2VFcnJvcnMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmTmFtZUVycm9ycyA9IG51bGw7Ci0KLQlDU1NTZWxlY3RvcihMaXN0IHRva2VucykgewotCQlmVG9rZW5zID0gbmV3IEFycmF5TGlzdCh0b2tlbnMpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAob2JqID09IG51bGwgfHwgdGhpcy5nZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNTU1NlbGVjdG9yIGZvcmVpZ24gPSAoQ1NTU2VsZWN0b3IpIG9iajsKLQotCQkvLyBpZiAoZlNwZWNpZmljaXR5ICE9IGZvcmVpZ24uZlNwZWNpZmljaXR5KSByZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGdldExlbmd0aCgpICE9IGZvcmVpZ24uZ2V0TGVuZ3RoKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoIWdldEl0ZW0oaSkuZXF1YWxzKGZvcmVpZ24uZ2V0SXRlbShpKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElDU1NTZWxlY3Rvckl0ZW0gZ2V0SXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKGZJdGVtcyA9PSBudWxsKSB7Ci0JCQlmSXRlbXMgPSBwYXJzZVNlbGVjdG9yKGZUb2tlbnMpOwotCQl9Ci0JCWlmIChmSXRlbXMgIT0gbnVsbCAmJiAwIDw9IGluZGV4ICYmIGluZGV4IDwgZkl0ZW1zLnNpemUoKSkgewotCQkJcmV0dXJuIChJQ1NTU2VsZWN0b3JJdGVtKSBmSXRlbXMuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0SXRlcmF0b3IoKSB7Ci0JCWlmIChmSXRlbXMgPT0gbnVsbCkgewotCQkJZkl0ZW1zID0gcGFyc2VTZWxlY3RvcihmVG9rZW5zKTsKLQkJfQotCQlyZXR1cm4gKGZJdGVtcyAhPSBudWxsKSA/IGZJdGVtcy5pdGVyYXRvcigpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpZiAoZkl0ZW1zID09IG51bGwpIHsKLQkJCWZJdGVtcyA9IHBhcnNlU2VsZWN0b3IoZlRva2Vucyk7Ci0JCX0KLQkJcmV0dXJuIChmSXRlbXMgIT0gbnVsbCkgPyBmSXRlbXMuc2l6ZSgpIDogMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIEVsZW1lbnQgZ2V0UGFyZW50RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJTm9kZSBub2RlID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlyZXR1cm4gKEVsZW1lbnQpIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIEVsZW1lbnQgZ2V0UHJldmlvdXNFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlFbGVtZW50IHAgPSBudWxsOwotCQlmb3IgKE5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlwID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIGEgc2VsZWN0b3IncyBzcGVjaWZpY2l0eSBhID0gdGhlIG51bWJlciBvZiBJRCBhdHRyaWJ1dGVzIGluCi0JICogdGhlIHNlbGVjdG9yIGIgPSB0aGUgbnVtYmVyIG9mIG90aGVyIGF0dHJpYnV0ZXMgYW5kIHBzZXVkby1jbGFzc2VzIGluCi0JICogdGhlIHNlbGVjdG9yIGMgPSB0aGUgbnVtYmVyIG9mIGVsZW1lbnQgbmFtZXMgaW4gdGhlIHNlbGVjdG9yIChpZ25vcmUKLQkgKiBwc2V1ZG8tZWxlbWVudHMpIENvbmNhdGVuYXRpbmcgdGhlIHRocmVlIG51bWJlcnMgYS1iLWMgKGluIGEgbnVtYmVyCi0JICogc3lzdGVtIHdpdGggYSBsYXJnZSBiYXNlKSBnaXZlcyB0aGUgc3BlY2lmaWNpdHkuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNwZWNpZmljaXR5KCkgewotCQlpZiAoZlNwZWNpZmljaXR5IDwgMCkgewotCQkJaW50IG5JRHMgPSAwOwotCQkJaW50IG5BdHRyaWJ1dGVzID0gMDsKLQkJCWludCBuRWxlbWVudHMgPSAwOwotCQkJSXRlcmF0b3IgaSA9IGdldEl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0gPSAoSUNTU1NlbGVjdG9ySXRlbSkgaS5uZXh0KCk7Ci0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDU1NTaW1wbGVTZWxlY3RvcikgewotCQkJCQlDU1NTaW1wbGVTZWxlY3RvciBzZWxlY3RvciA9IChDU1NTaW1wbGVTZWxlY3RvcikgaXRlbTsKLQkJCQkJbklEcyArPSBzZWxlY3Rvci5nZXROdW1PZklEcygpOwotCQkJCQluQXR0cmlidXRlcyArPSBzZWxlY3Rvci5nZXROdW1PZkF0dHJpYnV0ZXMoKTsKLQkJCQkJbkF0dHJpYnV0ZXMgKz0gc2VsZWN0b3IuZ2V0TnVtT2ZDbGFzc2VzKCk7Ci0JCQkJCW5BdHRyaWJ1dGVzICs9IHNlbGVjdG9yLmdldE51bU9mUHNldWRvTmFtZXMoKTsKLQkJCQkJaWYgKCFzZWxlY3Rvci5pc1VuaXZlcnNhbCgpKSB7Ci0JCQkJCQluRWxlbWVudHMrKzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZTcGVjaWZpY2l0eSA9IG5JRHMgKiAxMDAwMCArIG5BdHRyaWJ1dGVzICogMTAwICsgbkVsZW1lbnRzOwotCQl9Ci0KLQkJcmV0dXJuIGZTcGVjaWZpY2l0eTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJaWYgKGZDYWNoZWRTdHJpbmcgPT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCUl0ZXJhdG9yIGkgPSBnZXRJdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJSUNTU1NlbGVjdG9ySXRlbSBpdGVtID0gKElDU1NTZWxlY3Rvckl0ZW0pIGkubmV4dCgpOwotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ1NTU2VsZWN0b3JDb21iaW5hdG9yKSB7Ci0JCQkJCS8vIElmIGl0ZW0gaXMgREVTQ0VOREFOVCBjb21iaW5hdG9yLCBpdCBpcyBqdXN0IHNpbmdsZQotCQkJCQkvLyBzcGFjZS4KLQkJCQkJLy8gVGhlbiwgeW91IGRvbnQgaGF2ZSB0byBhcHBlbmQgc3RyaW5nLi4KLQkJCQkJaWYgKCgoQ1NTU2VsZWN0b3JDb21iaW5hdG9yKSBpdGVtKS5nZXRDb21iaW5hdG9yVHlwZSgpICE9IElDU1NTZWxlY3RvckNvbWJpbmF0b3IuREVTQ0VOREFOVCkgewotCQkJCQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCWJ1Zi5hcHBlbmQoaXRlbS5nZXRTdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJ1Zi5hcHBlbmQoaXRlbS5nZXRTdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQkJZkNhY2hlZFN0cmluZyA9IGJ1Zi50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIGZDYWNoZWRTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaChvcmcudzNjLmRvbS5FbGVtZW50IGVsZW1lbnQsIGphdmEubGFuZy5TdHJpbmcgcHNldWRvTmFtZSkgewotCQlFbGVtZW50IHRhcmdldCA9IGVsZW1lbnQ7Ci0JCWNoYXIgY29tYmluYXRvclR5cGUgPSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLlVOS05PV047Ci0JCUVsZW1lbnQgY2h1bmtTdGFydEVsZW1lbnQgPSBudWxsOyAvLyBmb3IgQ0hJTEQgYW5kIEFESkFDRU5UCi0JCQkJCQkJCQkJCS8vIGNvbWJpbmF0b3IKLQkJaW50IGNodW5rU3RhcnRJdGVtID0gLTE7IC8vIGZvciBDSElMRCBhbmQgQURKQUNFTlQgY29tYmluYXRvcgotCQlpbnQgbnVtSXRlbXMgPSBnZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaUl0ZW0gPSBudW1JdGVtcyAtIDE7IGlJdGVtID49IDA7IGlJdGVtLS0pIHsKLQkJCS8vIENoZWNrIFNlbGVjdG9yIEl0ZW1zCi0JCQlJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0gPSBnZXRJdGVtKGlJdGVtKTsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgSUNTU1NpbXBsZVNlbGVjdG9yKSB7Ci0JCQkJLy8gU2ltcGxlIFNlbGVjdG9yCi0JCQkJaWYgKHRhcmdldCA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKCFtYXRjaEV4YWN0bHkoKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbSwgdGFyZ2V0LCBwc2V1ZG9OYW1lKSkgewotCQkJCQlzd2l0Y2ggKGNvbWJpbmF0b3JUeXBlKSB7Ci0JCQkJCQljYXNlIElDU1NTZWxlY3RvckNvbWJpbmF0b3IuREVTQ0VOREFOVCA6Ci0JCQkJCQkJZG8gewotCQkJCQkJCQl0YXJnZXQgPSBnZXRQYXJlbnRFbGVtZW50KHRhcmdldCk7Ci0JCQkJCQkJCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQkJd2hpbGUgKCFtYXRjaEV4YWN0bHkoKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbSwgdGFyZ2V0LCBwc2V1ZG9OYW1lKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElDU1NTZWxlY3RvckNvbWJpbmF0b3IuQ0hJTEQgOgotCQkJCQkJY2FzZSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkFESkFDRU5UIDoKLQkJCQkJCQlpZiAoY2h1bmtTdGFydEVsZW1lbnQgIT0gbnVsbCAmJiBjaHVua1N0YXJ0RWxlbWVudCAhPSBlbGVtZW50KSB7Ci0JCQkJCQkJCS8vIHByZXZpb3VzIGNvbmJpbmF0b3IgbXVzdCBiZSBERVNDRU5ERU5ULgotCQkJCQkJCQkvLyBnb3RvIHBhcmVudAotCQkJCQkJCQl0YXJnZXQgPSBnZXRQYXJlbnRFbGVtZW50KGNodW5rU3RhcnRFbGVtZW50KTsKLQkJCQkJCQkJaUl0ZW0gPSBjaHVua1N0YXJ0SXRlbSArIDE7Ci0JCQkJCQkJCWNodW5rU3RhcnRFbGVtZW50ID0gbnVsbDsKLQkJCQkJCQkJY2h1bmtTdGFydEl0ZW0gPSAtMTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJLy8gb3RoZXIgY29tYmluYXRvcnMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yKSB7Ci0JCQkJLy8gQ29tYmluYXRvciAoICIrIiwgIj4iLCAiICIsIC4uLikKLQkJCQlpZiAoaUl0ZW0gPT0gbnVtSXRlbXMgLSAxKQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGxhc3QgaXRlbSBpcyBjb21iaW5hdG9yCi0KLQkJCQlJQ1NTU2VsZWN0b3JDb21iaW5hdG9yIHNjID0gKElDU1NTZWxlY3RvckNvbWJpbmF0b3IpIGl0ZW07Ci0JCQkJY29tYmluYXRvclR5cGUgPSBzYy5nZXRDb21iaW5hdG9yVHlwZSgpOwotCQkJCXN3aXRjaCAoY29tYmluYXRvclR5cGUpIHsKLQkJCQkJY2FzZSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkRFU0NFTkRBTlQgOgotCQkJCQkJdGFyZ2V0ID0gZ2V0UGFyZW50RWxlbWVudCh0YXJnZXQpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSUNTU1NlbGVjdG9yQ29tYmluYXRvci5DSElMRCA6Ci0JCQkJCWNhc2UgSUNTU1NlbGVjdG9yQ29tYmluYXRvci5BREpBQ0VOVCA6Ci0JCQkJCQlpZiAoY2h1bmtTdGFydEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQkJCWNodW5rU3RhcnRFbGVtZW50ID0gdGFyZ2V0OwotCQkJCQkJCWNodW5rU3RhcnRJdGVtID0gaUl0ZW0gKyAxOyAvLyBzYWZlIGJlY2F1c2UgdGhpcwotCQkJCQkJCQkJCQkJCQkvLyBpcyBub3QgYSBsYXN0IGl0ZW0uCi0JCQkJCQl9Ci0JCQkJCQlpZiAoY29tYmluYXRvclR5cGUgPT0gSUNTU1NlbGVjdG9yQ29tYmluYXRvci5DSElMRCkgewotCQkJCQkJCXRhcmdldCA9IGdldFBhcmVudEVsZW1lbnQodGFyZ2V0KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXRhcmdldCA9IGdldFByZXZpb3VzRWxlbWVudCh0YXJnZXQpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gd2hhdCBpcyB0aGlzIGl0ZW0gPz8/Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCS8vIE9LIHRoaXMgc2VsZWN0b3IgbWFjaGVzIHRoZSBlbGVtZW50LgotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBtYXRjaEV4YWN0bHkoSUNTU1NpbXBsZVNlbGVjdG9yIHNlbGVjdG9yLCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKSB7Ci0JCUlTdHlsZVNlbGVjdG9yQWRhcHRlciBhZGFwdGVyID0gKElTdHlsZVNlbGVjdG9yQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBlbGVtZW50KS5nZXRBZGFwdGVyRm9yKElTdHlsZVNlbGVjdG9yQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBhZGFwdGVyLm1hdGNoKHNlbGVjdG9yLCBlbGVtZW50LCBwc2V1ZG9OYW1lKTsKLQkJfQotCi0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBpOwotCQlTdHJpbmcga2V5OwotCi0JCS8vIFRPRE86IFBzZXVkb05hbWUKLQotCQkvLyBjaGVjayB0YWcgbmFtZQotCQlpZiAoIXNlbGVjdG9yLmlzVW5pdmVyc2FsKCkgJiYgIWVsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoc2VsZWN0b3IuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBjaGVjayBpZAotCQlpID0gc2VsZWN0b3IuZ2V0TnVtT2ZJRHMoKTsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlpZiAoaSA+IDEpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgiaWQiKSB8fCAoa2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIikpLmxlbmd0aCgpID09IDApLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKCFzZWxlY3Rvci5nZXRJRCgwKS5lcXVhbHMoa2V5KSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBjaGVjayBjbGFzcwotCQlpID0gc2VsZWN0b3IuZ2V0TnVtT2ZDbGFzc2VzKCk7Ci0JCWlmIChpID4gMCkgewotCQkJaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgiY2xhc3MiKSB8fCAoa2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIikpLmxlbmd0aCgpID09IDApIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihrZXkpOwotCQkJZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJYm9vbGVhbiBvayA9IGZhbHNlOwotCQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCWlmIChzZWxlY3Rvci5nZXRDbGFzcyhpKS5lcXVhbHModG9rZW5pemVyLm5leHRUb2tlbigpKSkgewotCQkJCQkJb2sgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFvaykKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgYXR0cmlidXRlcwotCQlmb3IgKGkgPSBzZWxlY3Rvci5nZXROdW1PZkF0dHJpYnV0ZXMoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzZWxlY3Rvci5nZXRBdHRyaWJ1dGUoaSksICI9fnwgXHRcclxuXGYiKTsvLyROT04tTkxTLTEkCi0JCQlpbnQgY291bnRUb2tlbnMgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJCWlmIChjb3VudFRva2VucyA+IDApIHsKLQkJCQlTdHJpbmcgYXR0ck5hbWUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IG51bGw7Ci0JCQkJaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyTmFtZSkgfHwgKGF0dHJWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKSkubGVuZ3RoKCkgPT0gMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChjb3VudFRva2VucyA+IDEpIHsKLQkJCQkJU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigiPSBcdFxyXG5cZiIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nVG9rZW5pemVyIGF0dHJWYWx1ZVRva2VuaXplciA9IG51bGw7Ci0JCQkJCWlmICh0b2tlbi5lcXVhbHMoIn4iKSkgey8vJE5PTi1OTFMtMSQKLQkJCQkJCWF0dHJWYWx1ZVRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0clZhbHVlKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICh0b2tlbi5lcXVhbHMoInwiKSkgey8vJE5PTi1OTFMtMSQKLQkJCQkJCWF0dHJWYWx1ZVRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0clZhbHVlLCAiLSIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAoYXR0clZhbHVlVG9rZW5pemVyICE9IG51bGwpIHsKLQkJCQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQkJCQkJYm9vbGVhbiBvayA9IGZhbHNlOwotCQkJCQkJCXdoaWxlIChhdHRyVmFsdWVUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJCWlmICh0b2tlbi5lcXVhbHMoYXR0clZhbHVlVG9rZW5pemVyLm5leHRUb2tlbigpKSkgewotCQkJCQkJCQkJb2sgPSB0cnVlOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCFvaykKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKCFhdHRyVmFsdWUuZXF1YWxzKHRva2VuKSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgcGFyc2VTZWxlY3RvcihMaXN0IHRva2VucykgewotCQlDU1NTZWxlY3RvclBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTU2VsZWN0b3JQYXJzZXIodG9rZW5zKTsKLQkJTGlzdCBzZWxlY3RvciA9IHBhcnNlci5nZXRTZWxlY3RvcigpOwotCQlJdGVyYXRvciBpID0gcGFyc2VyLmdldEVycm9ycygpOwotCQlmUGFyc2VFcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJZlBhcnNlRXJyb3JzLmFkZChpLm5leHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdG9yOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRFcnJvcnMoKSB7Ci0JCWlmIChmTmFtZUVycm9ycyA9PSBudWxsKSB7Ci0JCQlmTmFtZUVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUl0ZXJhdG9yIGlJdGVtID0gZ2V0SXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpSXRlbS5oYXNOZXh0KCkpIHsKLQkJCQlJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0gPSAoSUNTU1NlbGVjdG9ySXRlbSkgaUl0ZW0ubmV4dCgpOwotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgSUNTU1NpbXBsZVNlbGVjdG9yKSB7Ci0JCQkJCWlmICghKChJQ1NTU2ltcGxlU2VsZWN0b3IpIGl0ZW0pLmlzVW5pdmVyc2FsKCkpIHsKLQkJCQkJCVN0cmluZyBuYW1lID0gKChJQ1NTU2ltcGxlU2VsZWN0b3IpIGl0ZW0pLmdldE5hbWUoKTsKLQkJCQkJCWlmICghTmFtZVZhbGlkYXRvci5pc1ZhbGlkKG5hbWUpKSB7Ci0JCQkJCQkJZk5hbWVFcnJvcnMuYWRkKGl0ZW0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUxpc3QgZXJyb3JzID0gbmV3IEFycmF5TGlzdChmUGFyc2VFcnJvcnMpOwotCQllcnJvcnMuYWRkQWxsKGZOYW1lRXJyb3JzKTsKLQkJcmV0dXJuIGVycm9ycy5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRTdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDU1NTZWxlY3RvciNnZXRFcnJvckNvdW50KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVycm9yQ291bnQoKSB7Ci0JCWludCBuRXJyb3JzID0gMDsKLQkJSXRlcmF0b3IgaSA9IGdldEVycm9ycygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCW5FcnJvcnMrKzsKLQkJCWkubmV4dCgpOwotCQl9Ci0JCXJldHVybiBuRXJyb3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JDb21iaW5hdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yQ29tYmluYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDE1YWE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JDb21iaW5hdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JDb21iaW5hdG9yOwotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NTZWxlY3RvckNvbWJpbmF0b3IgZXh0ZW5kcyBDU1NTZWxlY3Rvckl0ZW0gaW1wbGVtZW50cyBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yIHsKLQotCWNoYXIgZlR5cGUgPSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLlVOS05PV047Ci0KLQkvKioKLQkgKiBDU1NTZWxlY3RvckNvbWJpbmF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ1NTU2VsZWN0b3JDb21iaW5hdG9yKGNoYXIgdHlwZSkgewotCQlzdXBlcigpOwotCQlzZXRDb21iaW5hdG9yVHlwZSh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKG9iaiA9PSBudWxsIHx8IHRoaXMuZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDU1NTZWxlY3RvckNvbWJpbmF0b3IgZm9yZWlnbiA9IChDU1NTZWxlY3RvckNvbWJpbmF0b3IpIG9iajsKLQotCQlyZXR1cm4gKGdldENvbWJpbmF0b3JUeXBlKCkgPT0gZm9yZWlnbi5nZXRDb21iaW5hdG9yVHlwZSgpKTsKLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGNoYXIgZ2V0Q29tYmluYXRvclR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SXRlbVR5cGUoKSB7Ci0JCXJldHVybiBDT01CSU5BVE9SOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKGZUeXBlKTsKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCXZvaWQgc2V0Q29tYmluYXRvclR5cGUoY2hhciB0eXBlKSB7Ci0JCWZUeXBlID0gdHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9ySXRlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvckl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQzNjY2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9ySXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9ySXRlbTsKLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ1NTU2VsZWN0b3JJdGVtIGltcGxlbWVudHMgSUNTU1NlbGVjdG9ySXRlbSB7Ci0KLQkvKioKLQkgKiBDU1NTZWxlY3Rvckl0ZW0gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ1NTU2VsZWN0b3JJdGVtKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRJdGVtVHlwZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvckxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMjMxZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvckxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTU2VsZWN0b3JMaXN0SW1wbCBpbXBsZW1lbnRzIElDU1NTZWxlY3Rvckxpc3QgewotCi0JcHJpdmF0ZSBTdHJpbmcgZlRleHQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZDYWNoZWRTdHJpbmcgPSBudWxsOyAvLyBub3JtYWxpemVkIHN0cmluZwotCXByaXZhdGUgTGlzdCBmU2VsZWN0b3JzID0gbnVsbDsKLQotCXB1YmxpYyBDU1NTZWxlY3Rvckxpc3RJbXBsKFN0cmluZyBjc3NUZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZUZXh0ID0gY3NzVGV4dDsKLQkJcGFyc2VTZWxlY3RvclRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKG9iaiA9PSBudWxsIHx8IHRoaXMuZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDU1NTZWxlY3Rvckxpc3RJbXBsIGZvcmVpZ24gPSAoQ1NTU2VsZWN0b3JMaXN0SW1wbCkgb2JqOwotCi0JCWlmIChnZXRMZW5ndGgoKSAhPSBmb3JlaWduLmdldExlbmd0aCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKCFnZXRTZWxlY3RvcihpKS5lcXVhbHMoZm9yZWlnbi5nZXRTZWxlY3RvcihpKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBnZXRTZWxlY3RvcnMoKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRTZWxlY3RvcnMoKS5zaXplKCk7Ci0JfQotCi0JcHVibGljIElDU1NTZWxlY3RvciBnZXRTZWxlY3RvcihpbnQgaW5kZXgpIHsKLQkJTGlzdCBzZWxlY3RvcnMgPSBnZXRTZWxlY3RvcnMoKTsKLQkJaWYgKDAgPD0gaW5kZXggJiYgaW5kZXggPCBzZWxlY3RvcnMuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gKElDU1NTZWxlY3Rvcikgc2VsZWN0b3JzLmdldChpbmRleCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRTZWxlY3RvcnMoKSB7Ci0JCWlmIChmU2VsZWN0b3JzID09IG51bGwpIHsKLQkJCXBhcnNlU2VsZWN0b3JUZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIGZTZWxlY3RvcnM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCWlmIChmQ2FjaGVkU3RyaW5nID09IG51bGwpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlib29sZWFuIGJGaXJzdCA9IHRydWU7Ci0JCQkvLyBncm91cHMgaXMgbGlzdCBvZiBjb21tYS1zZXBhcmF0ZWQgc2VsZWN0b3JzCi0JCQlJdGVyYXRvciBpID0gZ2V0U2VsZWN0b3JzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCWlmICghYkZpcnN0KSB7Ci0JCQkJCWJ1Zi5hcHBlbmQoIiwgIik7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlJQ1NTU2VsZWN0b3IgaXRlbSA9IChJQ1NTU2VsZWN0b3IpIGkubmV4dCgpOwotCQkJCWJ1Zi5hcHBlbmQoaXRlbS5nZXRTdHJpbmcoKSk7Ci0JCQkJYkZpcnN0ID0gZmFsc2U7Ci0JCQl9Ci0JCQlmQ2FjaGVkU3RyaW5nID0gYnVmLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGZDYWNoZWRTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKSB7Ci0JCWludCBuU2VsZWN0b3JzID0gZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGlTZWxlY3RvciA9IDA7IGlTZWxlY3RvciA8IG5TZWxlY3RvcnM7IGlTZWxlY3RvcisrKSB7Ci0JCQkvLyBDaGVjayBlYWNoIFNlbGVjdG9yIExpc3RzCi0JCQlJQ1NTU2VsZWN0b3Igc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihpU2VsZWN0b3IpOwotCQkJaWYgKHNlbGVjdG9yLm1hdGNoKGVsZW1lbnQsIHBzZXVkb05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFyc2VTZWxlY3RvclRleHQoKSB7Ci0JCWZTZWxlY3RvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChmVGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9TVFlMRVNIRUVULCBmVGV4dCk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCB0b2tlbkdyb3VwID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJQ1NTVGV4dFRva2VuIHRva2VuID0gdG9rZW5zW2ldOwotCQkJaWYgKHRva2VuLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1NFUEFSQVRPUiAmJiAwIDwgdG9rZW5Hcm91cC5zaXplKCkpIHsKLQkJCQlJQ1NTU2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgQ1NTU2VsZWN0b3IodG9rZW5Hcm91cCk7Ci0JCQkJaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLQkJCQkJZlNlbGVjdG9ycy5hZGQoc2VsZWN0b3IpOwotCQkJCX0KLQkJCQl0b2tlbkdyb3VwLmNsZWFyKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0b2tlbkdyb3VwLmFkZCh0b2tlbnNbaV0pOwotCQkJfQotCQl9Ci0JCWlmICgwIDwgdG9rZW5Hcm91cC5zaXplKCkpIHsKLQkJCUlDU1NTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBDU1NTZWxlY3Rvcih0b2tlbkdyb3VwKTsKLQkJCWlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0JCQkJZlNlbGVjdG9ycy5hZGQoc2VsZWN0b3IpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFN0cmluZygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRFcnJvcnMoKSB7Ci0JCUxpc3QgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpU2VsZWN0b3IgPSBnZXRTZWxlY3RvcnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaVNlbGVjdG9yLmhhc05leHQoKSkgewotCQkJSXRlcmF0b3IgaUVycm9yID0gKChJQ1NTU2VsZWN0b3IpIGlTZWxlY3Rvci5uZXh0KCkpLmdldEVycm9ycygpOwotCQkJd2hpbGUgKGlFcnJvci5oYXNOZXh0KCkpIHsKLQkJCQllcnJvcnMuYWRkKGlFcnJvci5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlcnJvcnMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVycm9yQ291bnQoKSB7Ci0JCWludCBuRXJyb3JzID0gMDsKLQkJSXRlcmF0b3IgaSA9IGdldEVycm9ycygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCW5FcnJvcnMrKzsKLQkJCWkubmV4dCgpOwotCQl9Ci0JCXJldHVybiBuRXJyb3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYwNTYxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yQ29tYmluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9ySXRlbTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTU2VsZWN0b3JQYXJzZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElETEUgPSAwOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBBVFRSSUJVVEUgPSAxOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTSU1QTEUgPSAyOwotCi0JcHJpdmF0ZSBMaXN0IGZUb2tlbnMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmSXRlbXMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmRXJyb3JzID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1NlbGVjdG9yUGFyc2VyKExpc3QgdG9rZW5zKSB7Ci0JCXN1cGVyKCk7Ci0JCWZUb2tlbnMgPSBuZXcgQXJyYXlMaXN0KHRva2Vucyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JTGlzdCBnZXRTZWxlY3RvcigpIHsKLQkJaWYgKGZJdGVtcyA9PSBudWxsKSB7Ci0JCQlwYXJzZVNlbGVjdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGZJdGVtczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFyc2VTZWxlY3RvcigpIHsKLQkJZkl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUxpc3QgYXR0ckJ1ZiA9IG51bGw7Ci0JCUNTU1NpbXBsZVNlbGVjdG9yIGl0ZW0gPSBudWxsOwotCi0JCWludCBzdGF0dXMgPSBJRExFOwotCQlJdGVyYXRvciBpID0gZlRva2Vucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU1RleHRUb2tlbiB0b2tlbiA9IChDU1NUZXh0VG9rZW4pIGkubmV4dCgpOwotCQkJaWYgKHRva2VuID09IG51bGwgfHwgdG9rZW4ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0b2tlbi5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlzd2l0Y2ggKHN0YXR1cykgewotCQkJCWNhc2UgSURMRSA6Ci0JCQkJCWlmIChpc1RhZyh0b2tlbikpIHsKLQkJCQkJCWl0ZW0gPSBjcmVhdGVTaW1wbGUoKTsKLQkJCQkJCWFwcGVuZFRhZyhpdGVtLCB0b2tlbik7Ci0JCQkJCQlzdGF0dXMgPSBTSU1QTEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNJRCh0b2tlbikpIHsKLQkJCQkJCWl0ZW0gPSBjcmVhdGVTaW1wbGUoKTsKLQkJCQkJCWFwcGVuZElEKGl0ZW0sIHRva2VuKTsKLQkJCQkJCXN0YXR1cyA9IFNJTVBMRTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0NsYXNzKHRva2VuKSkgewotCQkJCQkJaXRlbSA9IGNyZWF0ZVNpbXBsZSgpOwotCQkJCQkJYXBwZW5kQ2xhc3MoaXRlbSwgdG9rZW4pOwotCQkJCQkJc3RhdHVzID0gU0lNUExFOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzUHNldWRvKHRva2VuKSkgewotCQkJCQkJaXRlbSA9IGNyZWF0ZVNpbXBsZSgpOwotCQkJCQkJYXBwZW5kUHNldWRvKGl0ZW0sIHRva2VuKTsKLQkJCQkJCXN0YXR1cyA9IFNJTVBMRTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0F0dHJpYnV0ZUJlZ2luKHRva2VuKSkgewotCQkJCQkJaXRlbSA9IGNyZWF0ZVNpbXBsZSgpOwotCQkJCQkJc3RhdHVzID0gQVRUUklCVVRFOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYWRkRXJyb3IodG9rZW4pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU0lNUExFIDoKLQkJCQkJaWYgKGlzSUQodG9rZW4pKSB7Ci0JCQkJCQlhcHBlbmRJRChpdGVtLCB0b2tlbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNDbGFzcyh0b2tlbikpIHsKLQkJCQkJCWFwcGVuZENsYXNzKGl0ZW0sIHRva2VuKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc1BzZXVkbyh0b2tlbikpIHsKLQkJCQkJCWFwcGVuZFBzZXVkbyhpdGVtLCB0b2tlbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNBdHRyaWJ1dGVCZWdpbih0b2tlbikpIHsKLQkJCQkJCXN0YXR1cyA9IEFUVFJJQlVURTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0NvbWJpbmF0b3IodG9rZW4pKSB7IC8vIGNvbWJpbmF0b3IKLQkJCQkJCWNsb3NlSXRlbShpdGVtKTsKLQkJCQkJCWNsb3NlSXRlbShjcmVhdGVDb21iaW5hdG9yKHRva2VuKSk7Ci0JCQkJCQlzdGF0dXMgPSBJRExFOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYWRkRXJyb3IodG9rZW4pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQVRUUklCVVRFIDoKLQkJCQkJaWYgKGlzQXR0cmlidXRlRW5kKHRva2VuKSkgewotCQkJCQkJYXBwZW5kQXR0cmlidXRlKGl0ZW0sIGF0dHJCdWYpOwotCQkJCQkJYXR0ckJ1ZiA9IG51bGw7Ci0JCQkJCQlzdGF0dXMgPSBTSU1QTEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoYXR0ckJ1ZiA9PSBudWxsKSB7Ci0JCQkJCQkJYXR0ckJ1ZiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCX0KLQkJCQkJCWF0dHJCdWYuYWRkKHRva2VuKTsKLQkJCQkJCWlmICghaXNBdHRyaWJ1dGVDb250ZW50KHRva2VuKSkgewotCQkJCQkJCWFkZEVycm9yKHRva2VuKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQljbG9zZUl0ZW0oaXRlbSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0F0dHJpYnV0ZUNvbnRlbnQoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQXR0cmlidXRlRW5kKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdHlwZSA9IHRva2VuLmtpbmQ7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0F0dHJpYnV0ZUJlZ2luKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdHlwZSA9IHRva2VuLmtpbmQ7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tYmluYXRvcihDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1IpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNQc2V1ZG8oQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDbGFzcyhDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSUQoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1RhZyhDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9VTklWRVJTQUwgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTik7Ci0JfQotCi0JcHJpdmF0ZSBDU1NTaW1wbGVTZWxlY3RvciBjcmVhdGVTaW1wbGUoKSB7Ci0JCXJldHVybiBuZXcgQ1NTU2ltcGxlU2VsZWN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBpZiAiICIgb3IgIisiIG9yICI+IiBhcHBlYXJlZCwgY2xvc2Ugc2ltcGxlc2VsZWN0b3IgYW5kIGFkZCBuZXcKLQkgKiBjb21iaW5hdG9yCi0JICovCi0JcHJpdmF0ZSBDU1NTZWxlY3RvckNvbWJpbmF0b3IgY3JlYXRlQ29tYmluYXRvcihDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJY2hhciB0eXBlID0gMDsKLQotCQlTdHJpbmcgc3RyID0gdG9rZW4uaW1hZ2U7Ci0JCWlmIChzdHIudHJpbSgpLmxlbmd0aCgpID09IDApIHsgLy8gc3BhY2UKLQkJCXR5cGUgPSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkRFU0NFTkRBTlQ7Ci0JCX0KLQkJZWxzZSBpZiAoc3RyLmVxdWFscygiKyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXR5cGUgPSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkFESkFDRU5UOwotCQl9Ci0JCWVsc2UgaWYgKHN0ci5lcXVhbHMoIj4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0eXBlID0gSUNTU1NlbGVjdG9yQ29tYmluYXRvci5DSElMRDsKLQkJfQotCi0JCWlmICgwIDwgdHlwZSkgewotCQkJcmV0dXJuIG5ldyBDU1NTZWxlY3RvckNvbWJpbmF0b3IodHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjbG9zZUl0ZW0oSUNTU1NlbGVjdG9ySXRlbSBpdGVtKSB7Ci0JCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCWZJdGVtcy5hZGQoaXRlbSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXBwZW5kVGFnKENTU1NpbXBsZVNlbGVjdG9yIGl0ZW0sIENTU1RleHRUb2tlbiB0b2tlbikgewotCQlpdGVtLnNldE5hbWUodG9rZW4uaW1hZ2UpOwotCQlpZiAodG9rZW4ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTikgewotCQkJYWRkRXJyb3IodG9rZW4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaWYgIiN4eHh4IiBhcHBlYXJlZCwgYWRkIElEIHRvIGN1cnJlbnQgc2VsZWN0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kSUQoQ1NTU2ltcGxlU2VsZWN0b3IgaXRlbSwgQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0ZXh0ID0gdG9rZW4udG9TdHJpbmcoKTsKLQkJU3RyaW5nIGlkQ29udGVudCA9IHRleHQuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkpOwotCQlpdGVtLmFkZElEKGlkQ29udGVudCk7Ci0JfQotCi0JLyoqCi0JICogaWYgIi54eHh4IiBhcHBlYXJlZCwgYWRkIENsYXNzIHRvIGN1cnJlbnQgc2VsZWN0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kQ2xhc3MoQ1NTU2ltcGxlU2VsZWN0b3IgaXRlbSwgQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0ZXh0ID0gdG9rZW4udG9TdHJpbmcoKTsKLQkJU3RyaW5nIGNsYXNzQ29udGVudCA9IHRleHQuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkpOwotCQlpdGVtLmFkZENsYXNzKGNsYXNzQ29udGVudCk7Ci0JCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChjbGFzc0NvbnRlbnQuY2hhckF0KDApKSkgewotCQkJYWRkRXJyb3IodG9rZW4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaWYgIjp4eHh4IiBhcHBlYXJlZCwgYWRkIFBzZXVkbyhlbGVtZW50L2NsYXNzKSB0byBjdXJyZW50IHNlbGVjdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZFBzZXVkbyhDU1NTaW1wbGVTZWxlY3RvciBpdGVtLCBDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHRleHQgPSB0b2tlbi50b1N0cmluZygpOwotCQlTdHJpbmcgcHNldWRvQ29udGVudCA9IHRleHQuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkpOwotCQlpdGVtLmFkZFBzZXVkb05hbWUocHNldWRvQ29udGVudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZEF0dHJpYnV0ZShDU1NTaW1wbGVTZWxlY3RvciBpdGVtLCBMaXN0IHRva2VucykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCUNTU1RleHRUb2tlbiB0b2tlbjsKLQkJSXRlcmF0b3IgaSA9IHRva2Vucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCXRva2VuID0gKENTU1RleHRUb2tlbikgaS5uZXh0KCk7Ci0JCQlidWYuYXBwZW5kKHRva2VuLmltYWdlKTsKLQkJfQotCi0JCWl0ZW0uYWRkQXR0cmlidXRlKGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlMaXN0IGdldFNlbGVjdG9yVGFncygpIHsKLQkJTGlzdCB0YWdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gdGFnTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRXJyb3IoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCWlmIChmRXJyb3JzID09IG51bGwpIHsKLQkJCWZFcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJZkVycm9ycy5hZGQodG9rZW4pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUl0ZXJhdG9yIGdldEVycm9ycygpIHsKLQkJcmV0dXJuIChmRXJyb3JzID09IG51bGwpID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpIDogZkVycm9ycy5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2ltcGxlU2VsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2ltcGxlU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkyOGU5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NpbXBsZVNlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NpbXBsZVNlbGVjdG9yOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU1NpbXBsZVNlbGVjdG9yIGV4dGVuZHMgQ1NTU2VsZWN0b3JJdGVtIGltcGxlbWVudHMgSUNTU1NpbXBsZVNlbGVjdG9yIHsKLQotCXByaXZhdGUgU3RyaW5nIGZOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmQ2FjaGVkU3RyaW5nID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBmU3RyaW5nQnVmID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZlBzZXVkb05hbWUgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmQXR0cmlidXRlID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZkNsYXNzID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZklEID0gbnVsbDsKLQotCS8qKgotCSAqIENTU1NpbXBsZVNlbGVjdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENTU1NpbXBsZVNlbGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYWRkQXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGUpIHsKLQkJaWYgKGZBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJZkF0dHJpYnV0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlmQXR0cmlidXRlLmFkZChhdHRyaWJ1dGUpOwotCQlhZGRUb0J1ZigiWyIpOy8vJE5PTi1OTFMtMSQKLQkJYWRkVG9CdWYoYXR0cmlidXRlKTsKLQkJYWRkVG9CdWYoIl0iKTsvLyROT04tTkxTLTEkCi0JCWZDYWNoZWRTdHJpbmcgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYWRkQ2xhc3MoU3RyaW5nIGNscykgewotCQlpZiAoZkNsYXNzID09IG51bGwpIHsKLQkJCWZDbGFzcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlmQ2xhc3MuYWRkKGNscyk7Ci0JCWFkZFRvQnVmKCIuIik7Ly8kTk9OLU5MUy0xJAotCQlhZGRUb0J1ZihjbHMpOwotCQlmQ2FjaGVkU3RyaW5nID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGFkZElEKFN0cmluZyBpZCkgewotCQlpZiAoZklEID09IG51bGwpIHsKLQkJCWZJRCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlmSUQuYWRkKGlkKTsKLQkJYWRkVG9CdWYoIiMiKTsvLyROT04tTkxTLTEkCi0JCWFkZFRvQnVmKGlkKTsKLQkJZkNhY2hlZFN0cmluZyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhZGRQc2V1ZG9OYW1lKFN0cmluZyBjbHMpIHsKLQkJaWYgKGZQc2V1ZG9OYW1lID09IG51bGwpIHsKLQkJCWZQc2V1ZG9OYW1lID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZQc2V1ZG9OYW1lLmFkZChjbHMpOwotCQlhZGRUb0J1ZigiOiIpOy8vJE5PTi1OTFMtMSQKLQkJYWRkVG9CdWYoY2xzKTsKLQkJZkNhY2hlZFN0cmluZyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRvQnVmKFN0cmluZyBzdHIpIHsKLQkJaWYgKGZTdHJpbmdCdWYgPT0gbnVsbCkgewotCQkJZlN0cmluZ0J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJfQotCQlmU3RyaW5nQnVmLmFwcGVuZChzdHIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAob2JqID09IG51bGwgfHwgdGhpcy5nZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNTU1NpbXBsZVNlbGVjdG9yIGZvcmVpZ24gPSAoQ1NTU2ltcGxlU2VsZWN0b3IpIG9iajsKLQotCQlpZiAoZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UoZm9yZWlnbi5nZXROYW1lKCkpICE9IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IGk7Ci0KLQkJLy8gY29tcGFyZSBwc2V1ZG8tY2xhc3NlcyAvIHBzZXVkby1lbGVtZW50cwotCQlpZiAoZ2V0TnVtT2ZQc2V1ZG9OYW1lcygpICE9IGZvcmVpZ24uZ2V0TnVtT2ZQc2V1ZG9OYW1lcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGkgPSAwOyBpIDwgZ2V0TnVtT2ZQc2V1ZG9OYW1lcygpOyBpKyspIHsKLQkJCWlmIChnZXRQc2V1ZG9OYW1lKGkpLmNvbXBhcmVUb0lnbm9yZUNhc2UoZm9yZWlnbi5nZXRQc2V1ZG9OYW1lKGkpKSAhPSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNvbXBhcmUgY2xhc3NlcwotCQlpZiAoZ2V0TnVtT2ZDbGFzc2VzKCkgIT0gZm9yZWlnbi5nZXROdW1PZkNsYXNzZXMoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpID0gMDsgaSA8IGdldE51bU9mQ2xhc3NlcygpOyBpKyspIHsKLQkJCWlmIChnZXRDbGFzcyhpKS5jb21wYXJlVG9JZ25vcmVDYXNlKGZvcmVpZ24uZ2V0Q2xhc3MoaSkpICE9IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY29tcGFyZSBJRHMKLQkJaWYgKGdldE51bU9mSURzKCkgIT0gZm9yZWlnbi5nZXROdW1PZklEcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGkgPSAwOyBpIDwgZ2V0TnVtT2ZJRHMoKTsgaSsrKSB7Ci0JCQlpZiAoZ2V0SUQoaSkuY29tcGFyZVRvSWdub3JlQ2FzZShmb3JlaWduLmdldElEKGkpKSAhPSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNvbXBhcmUgQXR0cmlidXRlcwotCQlpZiAoZ2V0TnVtT2ZBdHRyaWJ1dGVzKCkgIT0gZm9yZWlnbi5nZXROdW1PZkF0dHJpYnV0ZXMoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpID0gMDsgaSA8IGdldE51bU9mQXR0cmlidXRlcygpOyBpKyspIHsKLQkJCWlmIChnZXRBdHRyaWJ1dGUoaSkuY29tcGFyZVRvSWdub3JlQ2FzZShmb3JlaWduLmdldEF0dHJpYnV0ZShpKSkgIT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShpbnQgaW5kZXgpIHsKLQkJaWYgKGZBdHRyaWJ1dGUgIT0gbnVsbCAmJiAwIDw9IGluZGV4ICYmIGluZGV4IDwgZkF0dHJpYnV0ZS5zaXplKCkpIHsKLQkJCXJldHVybiAoU3RyaW5nKSBmQXR0cmlidXRlLmdldChpbmRleCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzKGludCBpbmRleCkgewotCQlpZiAoZkNsYXNzICE9IG51bGwgJiYgMCA8PSBpbmRleCAmJiBpbmRleCA8IGZDbGFzcy5zaXplKCkpIHsKLQkJCXJldHVybiAoU3RyaW5nKSBmQ2xhc3MuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoaW50IGluZGV4KSB7Ci0JCWlmIChmSUQgIT0gbnVsbCAmJiAwIDw9IGluZGV4ICYmIGluZGV4IDwgZklELnNpemUoKSkgewotCQkJcmV0dXJuIChTdHJpbmcpIGZJRC5nZXQoaW5kZXgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRJdGVtVHlwZSgpIHsKLQkJcmV0dXJuIFNJTVBMRTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAoZk5hbWUgIT0gbnVsbCkgPyBmTmFtZSA6ICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE51bU9mQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIChmQXR0cmlidXRlICE9IG51bGwpID8gZkF0dHJpYnV0ZS5zaXplKCkgOiAwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtT2ZDbGFzc2VzKCkgewotCQlyZXR1cm4gKGZDbGFzcyAhPSBudWxsKSA/IGZDbGFzcy5zaXplKCkgOiAwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtT2ZJRHMoKSB7Ci0JCXJldHVybiAoZklEICE9IG51bGwpID8gZklELnNpemUoKSA6IDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGludCBnZXROdW1PZlBzZXVkb05hbWVzKCkgewotCQlyZXR1cm4gKGZQc2V1ZG9OYW1lICE9IG51bGwpID8gZlBzZXVkb05hbWUuc2l6ZSgpIDogMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHNldWRvTmFtZShpbnQgaW5kZXgpIHsKLQkJaWYgKGZQc2V1ZG9OYW1lICE9IG51bGwgJiYgMCA8PSBpbmRleCAmJiBpbmRleCA8IGZQc2V1ZG9OYW1lLnNpemUoKSkgewotCQkJcmV0dXJuIChTdHJpbmcpIGZQc2V1ZG9OYW1lLmdldChpbmRleCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCWlmIChmQ2FjaGVkU3RyaW5nID09IG51bGwpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKGdldE5hbWUoKSk7Ci0JCQlpZiAoZlN0cmluZ0J1ZiAhPSBudWxsKSB7Ci0JCQkJYnVmLmFwcGVuZChmU3RyaW5nQnVmLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJZkNhY2hlZFN0cmluZyA9IGJ1Zi50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBmQ2FjaGVkU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVW5pdmVyc2FsKCkgewotCQlyZXR1cm4gKGZOYW1lID09IG51bGwgfHwgZk5hbWUuZXF1YWxzKCIqIikpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZk5hbWUgPSBuYW1lOwotCQlmQ2FjaGVkU3RyaW5nID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiZjM4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotLyoqCi0gKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGV4dGVuZHMgQ1NTTm9kZUltcGwgewotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NDb250YWluZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXB1YmxpYyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcihDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENzc1RleHQoKSB7Ci0JCWlmIChnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpCi0JCQlyZXR1cm4gZ2VuZXJhdGVTb3VyY2UoKTsKLQotCQlTdHJpbmdCdWZmZXIgc3RyID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKSk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJd2hpbGUgKG5vZGUgIT0gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKSB7Ci0JCQlub2RlID0gbm9kZS5nZXROZXh0KCk7Ci0JCQlzdHIuYXBwZW5kKG5vZGUuZ2V0VGV4dCgpKTsKLQkJfQotCi0JCXJldHVybiBzdHIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiBmbGF0Tm9kZS5nZXRFbmQoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbnQgaW5kZXgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCWZvciAoaW50IGkgPSBpbmRleDsgaSA+IDA7IGktLSkgewotCQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCW5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpIHsKLQkJaWYgKGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJaW50IGkgPSAwOwotCQlmb3IgKDsgbm9kZSAhPSBudWxsOyBpKyspCi0JCQlub2RlID0gbm9kZS5nZXROZXh0KCk7Ci0JCXJldHVybiBpOwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQlyZXR1cm4gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWJvb2xlYW4gaW5jbHVkZVJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3QsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdCkgewotCQlib29sZWFuIGJNb2RpZmllZCA9IGZhbHNlOwotCi0JCS8vIHZhbGlkYXRlIHJhbmdlIG9mIHBhcmFtZXRlcnMKLQkJaWYgKGZpcnN0ICE9IG51bGwgJiYgbGFzdCAhPSBudWxsKSB7Ci0JCQlpZiAoZmlyc3QuZ2V0U3RhcnQoKSA+IGxhc3QuZ2V0U3RhcnQoKSkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZpcnN0OwotCQkJCWZpcnN0ID0gbGFzdDsKLQkJCQlsYXN0ID0gbm9kZTsKLQkJCX0KLQkJfQotCi0JCS8vIHZhbGlkYXRlIG1pbmUKLQkJYm9vbGVhbiBiID0gdmFsaWRhdGVSYW5nZSgpOwotCQliTW9kaWZpZWQgPSBiIHx8IGJNb2RpZmllZDsKLQotCQlpZiAoZmlyc3QgIT0gbnVsbCkgewotCQkJaWYgKGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCB8fCBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0KCkgPiBmaXJzdC5nZXRTdGFydCgpKSB7Ci0JCQkJc2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmlyc3QpOwotCQkJCWJNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobGFzdCAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwgfHwgZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0KCkgPCBsYXN0LmdldFN0YXJ0KCkpIHsKLQkJCQlzZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGxhc3QpOwotCQkJCWJNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZS12YWxpZGF0ZQotCQlpZiAoYk1vZGlmaWVkKQotCQkJdmFsaWRhdGVSYW5nZSgpOwotCi0JCXJldHVybiBiTW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvcGFnYXRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCWJvb2xlYW4gYk1vZGlmaWVkID0gZmFsc2U7Ci0KLQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHBhcmVudCA9IChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGJNb2RpZmllZDsKLQotCQlib29sZWFuIGIgPSBwYXJlbnQuaW5jbHVkZVJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCWJNb2RpZmllZCA9IGIgfHwgYk1vZGlmaWVkOwotCi0JCWlmIChiKQotCQkJcGFyZW50LnByb3BhZ2F0ZVJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCS8vIGVsc2UgbmVlZCBub3QgdXBkYXRlIHJhbmdlIG9mIGFuY2VzdG9ycwotCi0JCXJldHVybiBiTW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNzc1RleHQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDc3NUZXh0KFN0cmluZyBjc3NUZXh0KSB7Ci0JCWlmIChmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpLCBnZXRFbmRPZmZzZXQoKSAtIGdldFN0YXJ0T2Zmc2V0KCksIGNzc1RleHQpOwotCQl9Ci0JCWVsc2UKLQkJCXN1cGVyLnNldENzc1RleHQoY3NzVGV4dCk7Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCWxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSkgewotCQlpZiAoZmlyc3ROb2RlICE9IG51bGwpCi0JCQlzZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmaXJzdE5vZGUpOwotCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkKLQkJCXNldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obGFzdE5vZGUpOwotCi0JCWlmIChmaXJzdE5vZGUgPT0gbnVsbCAmJiBsYXN0Tm9kZSA9PSBudWxsKSB7Ci0JCQlzZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJCXNldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSB7IC8vIHJhbmdlIHZhbGlkYXRpb24KLQkJCXZhbGlkYXRlUmFuZ2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVJhbmdlKCkgewotCQlib29sZWFuIGJNb2RpZmllZCA9IGZhbHNlOwotCi0JCWlmIChmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsIHx8IGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCXRoaXMuZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSB0aGlzLmxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJYk1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRoaXMubGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJdGhpcy5sYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gdGhpcy5maXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAodGhpcy5maXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpID4gdGhpcy5sYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCkpIHsKLQkJCQkvLyBuZWVkIHRvIHN3YXAgZmlyc3QgZm9yIGxhc3QKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQlmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGU7Ci0JCQkJYk1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBiTW9kaWZpZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xJdGVtSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xJdGVtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGE1Y2M2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVEZWNsSXRlbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkNTU0RvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLlN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5UZXh0UmVnaW9uTGlzdEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NTdHlsZURlY2xJdGVtSW1wbCBleHRlbmRzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIElDU1NTdHlsZURlY2xJdGVtIHsKLQotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBmUHJvcGVydHlOYW1lOwotCi0JLyoqCi0JICogQ1NTU3R5bGVEZWNsSXRlbUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKi8KLQlDU1NTdHlsZURlY2xJdGVtSW1wbChDU1NTdHlsZURlY2xJdGVtSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCQl0aGlzLmZQcm9wZXJ0eU5hbWUgPSB0aGF0LmZQcm9wZXJ0eU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQ1NTU3R5bGVEZWNsSXRlbUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NTdHlsZURlY2xJdGVtSW1wbChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZlByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICovCi0JcHVibGljIElDU1NQcmltaXRpdmVWYWx1ZSBhcHBlbmRWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gaW5zZXJ0VmFsdWVCZWZvcmUodmFsdWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTU3R5bGVEZWNsSXRlbUltcGwgY2xvbmVkID0gbmV3IENTU1N0eWxlRGVjbEl0ZW1JbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVWYWx1ZVNvdXJjZSgpIHsKLQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIodGhpcyk7Ci0JCWlmIChmb3JtYXR0ZXIgIT0gbnVsbCAmJiBmb3JtYXR0ZXIgaW5zdGFuY2VvZiBTdHlsZURlY2xJdGVtRm9ybWF0dGVyKQotCQkJcmV0dXJuICgoU3R5bGVEZWNsSXRlbUZvcm1hdHRlcikgZm9ybWF0dGVyKS5mb3JtYXRWYWx1ZSh0aGlzKS50b1N0cmluZygpOwotCQllbHNlCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlCi0JICovCi0JcHVibGljIENTU1ZhbHVlIGdldENTU1ZhbHVlKCkgewotCQlpbnQgblZhbHVlID0gZ2V0TGVuZ3RoKCk7Ci0JCWlmIChuVmFsdWUgPD0gMCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChuVmFsdWUgPT0gMSkKLQkJCXJldHVybiBpdGVtKDApOwotCQllbHNlCi0JCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDU1NWYWx1ZVRleHQoKSB7Ci0JCWlmIChnZXRGaXJzdENoaWxkKCkgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCS8vIGNoZWNrIHdoZXRoZXIgY2hpbGRyZW4gaGFzIGZsYXRub2RlcwotCQlJQ1NTTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmICgoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRFbmRPZmZzZXQoKSA8PSAwKQotCQkJCXJldHVybiBnZW5lcmF0ZVZhbHVlU291cmNlKCk7Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIGdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSAtIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpIC0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlyZXR1cm4gbm9kZS5nZXRUZXh0KCkuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Q3NzVmFsdWVUeXBlKCkgewotCQlyZXR1cm4gQ1NTX1ZBTFVFX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NQcmltaXRpdmVWYWx1ZUltcGwpCi0JCQkJaSsrOwotCQl9Ci0JCXJldHVybiBpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBTVFlMRURFQ0xJVEVNX05PREU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UHJpb3JpdHkoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoSU1QT1JUQU5UKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBmUHJvcGVydHlOYW1lLnRyaW0oKTsKLQkJcmV0dXJuIFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YobmFtZSkgIT0gbnVsbCA/IGZQcm9wZXJ0eU5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCkgOiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gcmVmVmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCUlDU1NQcmltaXRpdmVWYWx1ZSBpbnNlcnRWYWx1ZUJlZm9yZShJQ1NTUHJpbWl0aXZlVmFsdWUgbmV3VmFsdWUsIElDU1NQcmltaXRpdmVWYWx1ZSByZWZWYWx1ZSkgewotCQlJQ1NTTm9kZSBub2RlID0gaW5zZXJ0QmVmb3JlKChDU1NOb2RlSW1wbCkgbmV3VmFsdWUsIChDU1NOb2RlSW1wbCkgcmVmVmFsdWUpOwotCQlyZXR1cm4gKElDU1NQcmltaXRpdmVWYWx1ZSkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZQotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIENTU1ZhbHVlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB7Ci0JCQkJaWYgKGkrKyA9PSBpbmRleCkKLQkJCQkJcmV0dXJuIChDU1NWYWx1ZSkgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICovCi0JcHVibGljIElDU1NQcmltaXRpdmVWYWx1ZSByZW1vdmVWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlJQ1NTTm9kZSBub2RlID0gcmVtb3ZlQ2hpbGQoKENTU05vZGVJbXBsKSB2YWx1ZSk7Ci0JCXJldHVybiAoSUNTU1ByaW1pdGl2ZVZhbHVlKSBub2RlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCXB1YmxpYyBJQ1NTUHJpbWl0aXZlVmFsdWUgcmVwbGFjZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSBuZXdWYWx1ZSwgSUNTU1ByaW1pdGl2ZVZhbHVlIG9sZFZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG9sZFZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3VmFsdWU7Ci0JCWlmIChuZXdWYWx1ZSAhPSBudWxsKQotCQkJaW5zZXJ0VmFsdWVCZWZvcmUobmV3VmFsdWUsIG9sZFZhbHVlKTsKLQkJcmV0dXJuIHJlbW92ZVZhbHVlKG9sZFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3NzVmFsdWVUZXh0KFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUlDU1NOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJSUNTU05vZGUgbmV4dCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUpIHsKLQkJCQlyZW1vdmVDaGlsZCgoQ1NTTm9kZUltcGwpIGNoaWxkKTsKLQkJCX0KLQkJCWNoaWxkID0gbmV4dDsKLQkJfQotCQlzZXRDc3NWYWx1ZVRleHRDb3JlKHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q3NzVmFsdWVUZXh0Q29yZShTdHJpbmcgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyB1c2UgdGVtcG9yYXJ5IGRvY3VtZW50Ci0JCXN5bmNocm9uaXplZCAoQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwuY2xhc3MpIHsKLQkJCWlmIChzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJCUlEb2N1bWVudExvYWRlciBsb2FkZXIgPSBuZXcgQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLQkJCQlzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCSgoQ1NTU291cmNlUGFyc2VyKSBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpLnNldFBhcnNlck1vZGUoQ1NTU291cmNlUGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUpOwotCi0JCQl9Ci0JCQlzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0KHZhbHVlKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKG5vZGUuZ2V0TmV4dCgpICE9IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCUNTU0RlY2xhcmF0aW9uSXRlbVBhcnNlciBpdGVtUGFyc2VyID0gbmV3IENTU0RlY2xhcmF0aW9uSXRlbVBhcnNlcihnZXRPd25lckRvY3VtZW50KCkpOwotCQkJaXRlbVBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRUZW1wb3JhcnkodHJ1ZSk7Ci0JCQkvLyBtYWtlIGEgY29weSBvZiBub2RlbGlzdCBiZWNhdXNlIHNldHVwVmFsdWVzIHdpbGwgZGVzdHJveSBsaXN0Ci0JCQlJVGV4dFJlZ2lvbkxpc3Qgbm9kZUxpc3QgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKG5vZGUuZ2V0UmVnaW9ucygpKTsKLQkJCWl0ZW1QYXJzZXIuc2V0dXBWYWx1ZXModGhpcywgbm9kZSwgbm9kZUxpc3QpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudCBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3UHJpb3JpdHkKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmlvcml0eShqYXZhLmxhbmcuU3RyaW5nIG5ld1ByaW9yaXR5KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKElNUE9SVEFOVCwgbmV3UHJpb3JpdHkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnlDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDU2NDgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnlDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5Q29udGV4dCB7Ci0KLQlwcm90ZWN0ZWQgSUNTU0RvY3VtZW50IGZPd25lckRvY3VtZW50ID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsb25lQ2hpbGROb2RlcyhJQ1NTTm9kZSBzcmMsIElDU1NOb2RlIGRlc3QpIHsKLQkJaWYgKGZPd25lckRvY3VtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIShkZXN0IGluc3RhbmNlb2YgQ1NTTm9kZUltcGwpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlDU1NOb2RlSW1wbCBjb250YWluZXIgPSAoQ1NTTm9kZUltcGwpIGRlc3Q7Ci0JCWNvbnRhaW5lci5yZW1vdmVDaGlsZE5vZGVzKCk7Ci0KLQkJZm9yIChJQ1NTTm9kZSBjaGlsZCA9IHNyYy5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsSXRlbUltcGwpIHsKLQkJCQkvLyBleHRyYWN0IHNob3J0aGFuZCBwcm9wZXJ0eSAuLgotCQkJCS8vIC0tPiBUZW1wCi0JCQkJSUNTU05vZGUgY2xvbmVkID0gY2hpbGQuY2xvbmVOb2RlKGZhbHNlKTsKLQkJCQlpZiAoY2xvbmVkIGluc3RhbmNlb2YgQ1NTTm9kZUltcGwpIHsKLQkJCQkJKChDU1NOb2RlSW1wbCkgY2xvbmVkKS5zZXRPd25lckRvY3VtZW50KGZPd25lckRvY3VtZW50KTsKLQkJCQkJY29udGFpbmVyLmFwcGVuZENoaWxkKChDU1NOb2RlSW1wbCkgY2xvbmVkKTsKLQkJCQkJY2xvbmVDaGlsZE5vZGVzKGNoaWxkLCBjbG9uZWQpOwotCQkJCX0KLQkJCQkvLyA8LS0gVGVtcAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSUNTU05vZGUgY2xvbmVkID0gY2hpbGQuY2xvbmVOb2RlKGZhbHNlKTsKLQkJCQlpZiAoY2xvbmVkIGluc3RhbmNlb2YgQ1NTTm9kZUltcGwpIHsKLQkJCQkJKChDU1NOb2RlSW1wbCkgY2xvbmVkKS5zZXRPd25lckRvY3VtZW50KGZPd25lckRvY3VtZW50KTsKLQkJCQkJY29udGFpbmVyLmFwcGVuZENoaWxkKChDU1NOb2RlSW1wbCkgY2xvbmVkKTsKLQkJCQkJY2xvbmVDaGlsZE5vZGVzKGNoaWxkLCBjbG9uZWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU1N0eWxlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbGFyYXRpb24gY3JlYXRlU3R5bGVEZWNsYXJhdGlvbigpIHsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgZGVjbCA9IG5ldyBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCh0cnVlKTsKLQkJZGVjbC5zZXRPd25lckRvY3VtZW50KGRlY2wpOwotCQlyZXR1cm4gZGVjbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBhZWQ0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbGFyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgZXh0ZW5kcyBDU1NEb2N1bWVudEltcGwgaW1wbGVtZW50cyBJQ1NTU3R5bGVEZWNsYXJhdGlvbiB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZklzRG9jdW1lbnQ7Ci0KLQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbChDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCQl0aGlzLmZJc0RvY3VtZW50ID0gdGhhdC5mSXNEb2N1bWVudDsKLQkJaWYgKGZJc0RvY3VtZW50KSB7Ci0JCQlzZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQl9Ci0JfQotCi0JQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwoYm9vbGVhbiBpc0RvY3VtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCWZJc0RvY3VtZW50ID0gaXNEb2N1bWVudDsKLQkJaWYgKGZJc0RvY3VtZW50KSB7Ci0JCQlzZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQl9Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgY2xvbmVkID0gbmV3IENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbEl0ZW0gZ2V0RGVjbEl0ZW1Ob2RlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldExhc3RDaGlsZCgpOwotCQlwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUudHJpbSgpOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbEl0ZW1JbXBsKSB7Ci0JCQkJSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSA9IChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZTsKLQkJCQlpZiAocHJvcGVydHlOYW1lLmNvbXBhcmVUb0lnbm9yZUNhc2UoaXRlbS5nZXRQcm9wZXJ0eU5hbWUoKS50cmltKCkpID09IDApCi0JCQkJCXJldHVybiBpdGVtOwotCQkJfQotCQkJbm9kZSA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaW50IGkgPSAwOwotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbEl0ZW1JbXBsKQotCQkJCWkrKzsKLQkJCW5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFNUWUxFREVDTEFSQVRJT05fTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgQ1NTIHJ1bGUgdGhhdCBjb250YWlucyB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgdGhpcyA8Y29kZT5DU1NTdHlsZURlY2xhcmF0aW9uPC9jb2RlPiBpcyBub3QgYXR0YWNoZWQgdG8gYQotCSAqIDxjb2RlPkNTU1J1bGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDU1NSdWxlIGdldFBhcmVudFJ1bGUoKSB7Ci0JCUlDU1NOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1J1bGUpCi0JCQlyZXR1cm4gKENTU1J1bGUpIHBhcmVudDsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byByZXRyaWV2ZSB0aGUgb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBvZiBhIENTUwotCSAqIHByb3BlcnR5IGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0IHdpdGhpbiB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrLgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByb3BlcnR5IGlzIGEgc2hvcnRoYW5kCi0JICogcHJvcGVydHkuIFNob3J0aGFuZCBwcm9wZXJ0eSB2YWx1ZXMgY2FuIG9ubHkgYmUgYWNjZXNzZWQgYW5kIG1vZGlmaWVkCi0JICogYXMgc3RyaW5ncywgdXNpbmcgdGhlIDxjb2RlPmdldFByb3BlcnR5VmFsdWU8L2NvZGU+IGFuZAotCSAqIDxjb2RlPnNldFByb3BlcnR5PC9jb2RlPiBtZXRob2RzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBDU1MgcHJvcGVydHkuIFNlZSB0aGUgQ1NTIHByb3BlcnR5IGluZGV4LgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0Ci0JICogICAgICAgICBmb3IgdGhpcyBkZWNsYXJhdGlvbiBibG9jay4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIHByb3BlcnR5IGhhcyBub3QgYmVlbiBzZXQuCi0JICovCi0JcHVibGljIENTU1ZhbHVlIGdldFByb3BlcnR5Q1NTVmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtID0gZ2V0RGVjbEl0ZW1Ob2RlKHByb3BlcnR5TmFtZSk7Ci0JCWlmIChpdGVtICE9IG51bGwpCi0JCQlyZXR1cm4gaXRlbS5nZXRDU1NWYWx1ZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJldHJpZXZlIHRoZSBwcmlvcml0eSBvZiBhIENTUyBwcm9wZXJ0eSAoZS5nLiB0aGUKLQkgKiA8Y29kZT4iaW1wb3J0YW50IjwvY29kZT4gcXVhbGlmaWVyKSBpZiB0aGUgcHJvcGVydHkgaGFzIGJlZW4KLQkgKiBleHBsaWNpdGx5IHNldCBpbiB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBDU1MgcHJvcGVydHkuIFNlZSB0aGUgQ1NTIHByb3BlcnR5IGluZGV4LgotCSAqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwcmlvcml0eSAoZS5nLgotCSAqICAgICAgICAgPGNvZGU+ImltcG9ydGFudCI8L2NvZGU+KSBpZiBvbmUgZXhpc3RzLiBUaGUgZW1wdHkgc3RyaW5nIGlmCi0JICogICAgICAgICBub25lIGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5UHJpb3JpdHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtID0gZ2V0RGVjbEl0ZW1Ob2RlKHByb3BlcnR5TmFtZSk7Ci0JCWlmIChpdGVtICE9IG51bGwpCi0JCQlyZXR1cm4gaXRlbS5nZXRQcmlvcml0eSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBvZiBhIENTUyBwcm9wZXJ0eSBpZiBpdCBoYXMgYmVlbiBleHBsaWNpdGx5Ci0JICogc2V0IHdpdGhpbiB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBDU1MgcHJvcGVydHkuIFNlZSB0aGUgQ1NTIHByb3BlcnR5IGluZGV4LgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0Ci0JICogICAgICAgICBmb3IgdGhpcyBkZWNsYXJhdGlvbiBibG9jay4gUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZQotCSAqICAgICAgICAgcHJvcGVydHkgaGFzIG5vdCBiZWVuIHNldC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlDU1NWYWx1ZSB2YWx1ZSA9IGdldFByb3BlcnR5Q1NTVmFsdWUocHJvcGVydHlOYW1lKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQlyZXR1cm4gKChJQ1NTVmFsdWUpIHZhbHVlKS5nZXRDU1NWYWx1ZVRleHQoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZJc0RvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gcmV0cmlldmUgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gZXhwbGljaXRseSBzZXQgaW4gdGhpcwotCSAqIGRlY2xhcmF0aW9uIGJsb2NrLiBUaGUgb3JkZXIgb2YgdGhlIHByb3BlcnRpZXMgcmV0cmlldmVkIHVzaW5nIHRoaXMKLQkgKiBtZXRob2QgZG9lcyBub3QgaGF2ZSB0byBiZSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIHNldC4gVGhpcwotCSAqIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBpdGVyYXRlIG92ZXIgYWxsIHByb3BlcnRpZXMgaW4gdGhpcyBkZWNsYXJhdGlvbgotCSAqIGJsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgSW5kZXggb2YgdGhlIHByb3BlcnR5IG5hbWUgdG8gcmV0cmlldmUuCi0JICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYXQgdGhpcyBvcmRpbmFsIHBvc2l0aW9uLiBUaGUgZW1wdHkKLQkgKiAgICAgICAgIHN0cmluZyBpZiBubyBwcm9wZXJ0eSBleGlzdHMgYXQgdGhpcyBwb3NpdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgaSA9IDA7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsSXRlbUltcGwpIHsKLQkJCQlpZiAoaSAhPSBpbmRleCkKLQkJCQkJaSsrOwotCQkJCWVsc2UgewotCQkJCQlDU1NTdHlsZURlY2xJdGVtSW1wbCBpdGVtID0gKENTU1N0eWxlRGVjbEl0ZW1JbXBsKSBub2RlOwotCQkJCQlyZXR1cm4gaXRlbS5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsSXRlbSByZW1vdmVEZWNsSXRlbU5vZGUoSUNTU1N0eWxlRGVjbEl0ZW0gb2xkRGVjbCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoSUNTU1N0eWxlRGVjbEl0ZW0pIHJlbW92ZUNoaWxkKChDU1NOb2RlSW1wbCkgb2xkRGVjbCk7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byByZW1vdmUgYSBDU1MgcHJvcGVydHkgaWYgaXQgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQgd2l0aGluIHRoaXMKLQkgKiBkZWNsYXJhdGlvbiBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQ1NTIHByb3BlcnR5LiBTZWUgdGhlIENTUyBwcm9wZXJ0eSBpbmRleC4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpZiBpdCBoYXMgYmVlbiBleHBsaWNpdGx5IHNldAotCSAqICAgICAgICAgZm9yIHRoaXMgZGVjbGFyYXRpb24gYmxvY2suIFJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGUKLQkgKiAgICAgICAgIHByb3BlcnR5IGhhcyBub3QgYmVlbiBzZXQgb3IgdGhlIHByb3BlcnR5IG5hbWUgZG9lcyBub3QKLQkgKiAgICAgICAgIGNvcnJlc3BvbmQgdG8gYSBrbm93biBDU1MgcHJvcGVydHkuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIGRlY2xhcmF0aW9uCi0JICogICAgICAgICAgICAgICAgaXMgcmVhZG9ubHkgb3IgdGhlIHByb3BlcnR5IGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW0gPSBnZXREZWNsSXRlbU5vZGUocHJvcGVydHlOYW1lKTsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJcmVtb3ZlQ2hpbGQoKENTU05vZGVJbXBsKSBpdGVtKTsKLQkJCXJldHVybiBpdGVtLmdldENzc1RleHQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbEl0ZW0gc2V0RGVjbEl0ZW1Ob2RlKElDU1NTdHlsZURlY2xJdGVtIG5ld0RlY2wpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobmV3RGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSA9IGdldERlY2xJdGVtTm9kZShuZXdEZWNsLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkKLQkJCXJldHVybiAoSUNTU1N0eWxlRGVjbEl0ZW0pIHJlcGxhY2VDaGlsZCgoQ1NTTm9kZUltcGwpIG5ld0RlY2wsIChDU1NOb2RlSW1wbCkgaXRlbSk7Ci0JCWVsc2UKLQkJCXJldHVybiAoSUNTU1N0eWxlRGVjbEl0ZW0pIGFwcGVuZENoaWxkKChDU1NOb2RlSW1wbCkgbmV3RGVjbCk7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byBzZXQgYSBwcm9wZXJ0eSB2YWx1ZSBhbmQgcHJpb3JpdHkgd2l0aGluIHRoaXMgZGVjbGFyYXRpb24KLQkgKiBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQ1NTIHByb3BlcnR5LiBTZWUgdGhlIENTUyBwcm9wZXJ0eSBpbmRleC4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotCSAqIEBwYXJhbSBwcmlvcml0eQotCSAqICAgICAgICAgICAgVGhlIG5ldyBwcmlvcml0eSBvZiB0aGUgcHJvcGVydHkgKGUuZy4KLQkgKiAgICAgICAgICAgIDxjb2RlPiJpbXBvcnRhbnQiPC9jb2RlPikuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBoYXMgYSBzeW50YXgKLQkgKiAgICAgICAgICAgICAgICBlcnJvciBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgZGVjbGFyYXRpb24KLQkgKiAgICAgICAgICAgICAgICBpcyByZWFkb25seSBvciB0aGUgcHJvcGVydHkgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgcHJpb3JpdHkpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gWW91IGNhbiB1c2UgdGhpcyBvbmx5IGlmIENTU1ZhbHVlLnNldENzc1RleHQoKSBpcyBpbXBsZW1lbnRlZAotCQlDU1NTdHlsZURlY2xJdGVtSW1wbCBpdGVtID0gKENTU1N0eWxlRGVjbEl0ZW1JbXBsKSBnZXREZWNsSXRlbU5vZGUocHJvcGVydHlOYW1lKTsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJaXRlbSA9IChDU1NTdHlsZURlY2xJdGVtSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1N0eWxlRGVjbEl0ZW0ocHJvcGVydHlOYW1lKTsKLQkJCWFwcGVuZENoaWxkKGl0ZW0pOwotCQl9Ci0KLQkJLy8gSUNTU05vZGUgbmV4dCA9IGl0ZW0uZ2V0TmV4dFNpYmxpbmcoKTsKLQkJLy8gcmVtb3ZlQ2hpbGQoaXRlbSk7Ci0KLQkJaXRlbS5zZXRDc3NWYWx1ZVRleHQodmFsdWUpOwotCQlpdGVtLnNldFByaW9yaXR5KHByaW9yaXR5KTsKLQotCQkvLyBpbnNlcnRCZWZvcmUoaXRlbSwgKENTU05vZGVJbXBsKW5leHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZVJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNjZmMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZVJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTU3R5bGVSdWxlSW1wbCBleHRlbmRzIENTU1J1bGVEZWNsQ29udGFpbmVyIGltcGxlbWVudHMgSUNTU1N0eWxlUnVsZSB7Ci0KLQlJQ1NTU2VsZWN0b3JMaXN0IGZTZWxlY3Rvckxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChudWxsKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1N0eWxlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ1NTU3R5bGVSdWxlSW1wbChDU1NTdHlsZVJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTU3R5bGVSdWxlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTU3R5bGVSdWxlSW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGV4dHJhY3RQcmVTdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRTZWxlY3RvclRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gU1RZTEVSVUxFX05PREU7Ci0JfQotCi0JcHVibGljIElDU1NTZWxlY3Rvckxpc3QgZ2V0U2VsZWN0b3JzKCkgewotCQlyZXR1cm4gZlNlbGVjdG9yTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2VsZWN0b3IgZm9yIHRoZSBydWxlIHNldC4gVGhlCi0JICogaW1wbGVtZW50YXRpb24gbWF5IGhhdmUgc3RyaXBwZWQgb3V0IGluc2lnbmlmaWNhbnQgd2hpdGVzcGFjZSB3aGlsZQotCSAqIHBhcnNpbmcgdGhlIHNlbGVjdG9yLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgQ1NTIHN0cmluZyB2YWx1ZSBoYXMKLQkgKiAgICAgICAgICAgICAgICBhIHN5bnRheCBlcnJvciBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcnVsZSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0b3JUZXh0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFNFTEVDVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBTVFlMRV9SVUxFOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdG9yVGV4dChTdHJpbmcgc2VsZWN0b3JUZXh0KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKFNFTEVDVE9SLCBzZWxlY3RvclRleHQpOwotCQlmU2VsZWN0b3JMaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwoc2VsZWN0b3JUZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlU2hlZXRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlU2hlZXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNjZhZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZVNoZWV0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5DU1NEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTWVkaWFSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5JbXBvcnRSdWxlQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1Vua25vd25SdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0OwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0OwotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NTdHlsZVNoZWV0SW1wbCBleHRlbmRzIENTU0RvY3VtZW50SW1wbCBpbXBsZW1lbnRzIElDU1NTdHlsZVNoZWV0IHsKLQotCi0JY2xhc3MgSW50ZXJuYWxOb2RlTGlzdCBpbXBsZW1lbnRzIE5vZGVMaXN0IHsKLQotCQlWZWN0b3Igbm9kZXMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlpZiAobm9kZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gMDsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbm9kZXMuc2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIE5vZGUgaXRlbShpbnQgaSkgewotCQkJaWYgKG5vZGVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoaSA8IDAgfHwgbm9kZXMuc2l6ZSgpIDw9IGkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gKE5vZGUpIG5vZGVzLmdldChpKTsKLQkJfQotCX0KLQotCWNsYXNzIEludGVybmFsU3R5bGVTaGVldExpc3QgZXh0ZW5kcyBBYnN0cmFjdENTU05vZGVMaXN0IGltcGxlbWVudHMgU3R5bGVTaGVldExpc3QgewotCi0JCXB1YmxpYyBJQ1NTTm9kZSBhcHBlbmROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJCWlmIChub2RlcyA9PSBudWxsIHx8ICFub2Rlcy5jb250YWlucyhub2RlKSkKLQkJCQlyZXR1cm4gc3VwZXIuYXBwZW5kTm9kZShub2RlKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbm9kZTsKLQkJfQotCi0JCXB1YmxpYyBTdHlsZVNoZWV0IGl0ZW0oaW50IGkpIHsKLQkJCXJldHVybiAoU3R5bGVTaGVldCkgaXRlbUltcGwoaSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkRpc2FibGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTdHlsZVNoZWV0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQl9Ci0KLQlDU1NTdHlsZVNoZWV0SW1wbChDU1NTdHlsZVNoZWV0SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCQlzZXRPd25lckRvY3VtZW50KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIGFwcGVuZFJ1bGUob3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChydWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDU1NSdWxlIHJldCA9IChDU1NSdWxlKSBhcHBlbmRDaGlsZCgoQ1NTTm9kZUltcGwpIHJ1bGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU1N0eWxlU2hlZXRJbXBsIGNsb25lZCA9IG5ldyBDU1NTdHlsZVNoZWV0SW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTQ2hhcnNldFJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU0NoYXJzZXRSdWxlIGNyZWF0ZUNTU0NoYXJzZXRSdWxlKCkgewotCQlDU1NDaGFyc2V0UnVsZUltcGwgcnVsZSA9IG5ldyBDU1NDaGFyc2V0UnVsZUltcGwoKTsKLQkJcnVsZS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGUKLQkgKi8KLQlwdWJsaWMgQ1NTRm9udEZhY2VSdWxlIGNyZWF0ZUNTU0ZvbnRGYWNlUnVsZSgpIHsKLQkJQ1NTRm9udEZhY2VSdWxlSW1wbCBydWxlID0gbmV3IENTU0ZvbnRGYWNlUnVsZUltcGwoKTsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgc3R5bGUgPSAoQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwpIGNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKTsKLQotCQlydWxlLmFwcGVuZENoaWxkKHN0eWxlKTsKLQkJcnVsZS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0ltcG9ydFJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU0ltcG9ydFJ1bGUgY3JlYXRlQ1NTSW1wb3J0UnVsZSgpIHsKLQkJQ1NTSW1wb3J0UnVsZUltcGwgcnVsZSA9IG5ldyBDU1NJbXBvcnRSdWxlSW1wbCgpOwotCQlNZWRpYUxpc3RJbXBsIG1lZGlhID0gKE1lZGlhTGlzdEltcGwpIGNyZWF0ZU1lZGlhTGlzdCgpOwotCi0JCXJ1bGUuYXBwZW5kQ2hpbGQobWVkaWEpOwotCQlydWxlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuSUNTU01lZGlhUnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTTWVkaWFSdWxlIGNyZWF0ZUNTU01lZGlhUnVsZSgpIHsKLQkJQ1NTTWVkaWFSdWxlSW1wbCBydWxlID0gbmV3IENTU01lZGlhUnVsZUltcGwoKTsKLQkJTWVkaWFMaXN0SW1wbCBtZWRpYSA9IChNZWRpYUxpc3RJbXBsKSBjcmVhdGVNZWRpYUxpc3QoKTsKLQotCQlydWxlLmluc2VydEJlZm9yZShtZWRpYSwgKENTU05vZGVJbXBsKSBydWxlLmdldEZpcnN0Q2hpbGQoKSk7IC8vIG1lZGlhCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBtdXN0Ci0JCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQotCQkJCQkJCQkJCQkJCQkJCQkJLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyB0b3AKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBjaGlsZHJlbgotCQkJCQkJCQkJCQkJCQkJCQkJLy8gbGlzdAotCQlydWxlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUGFnZVJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU1BhZ2VSdWxlIGNyZWF0ZUNTU1BhZ2VSdWxlKCkgewotCQlDU1NQYWdlUnVsZUltcGwgcnVsZSA9IG5ldyBDU1NQYWdlUnVsZUltcGwoKTsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgc3R5bGUgPSAoQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwpIGNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKTsKLQotCQlydWxlLmFwcGVuZENoaWxkKHN0eWxlKTsKLQkJcnVsZS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDU1NSdWxlIGNyZWF0ZUNTU1J1bGUoU3RyaW5nIHJ1bGUpIHsKLQkJQ1NTRG9jdW1lbnRMb2FkZXIgbG9hZGVyID0gbmV3IENTU0RvY3VtZW50TG9hZGVyKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJc3RydWN0dXJlZERvY3VtZW50LnNldChydWxlKTsKLQotCQkvL0NTU01vZGVsUGFyc2VyIG1vZGVsUGFyc2VyID0gbmV3IENTU01vZGVsUGFyc2VyKChDU1NEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCUNTU01vZGVsUGFyc2VyIG1vZGVsUGFyc2VyID0gbmV3IENTU01vZGVsUGFyc2VyKGdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCXJldHVybiBtb2RlbFBhcnNlci5jcmVhdGVDU1NSdWxlKHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25MaXN0KCkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbGFyYXRpb24gY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpIHsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgZGVjbCA9IG5ldyBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbChmYWxzZSk7Ci0JCWRlY2wuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gZGVjbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlUnVsZSBjcmVhdGVDU1NTdHlsZVJ1bGUoKSB7Ci0JCUNTU1N0eWxlUnVsZUltcGwgcnVsZSA9IG5ldyBDU1NTdHlsZVJ1bGVJbXBsKCk7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHN0eWxlID0gKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCk7Ci0KLQkJcnVsZS5hcHBlbmRDaGlsZChzdHlsZSk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZQotCSAqLwotCXB1YmxpYyBDU1NVbmtub3duUnVsZSBjcmVhdGVDU1NVbmtub3duUnVsZSgpIHsKLQkJQ1NTVW5rbm93blJ1bGVJbXBsIHJ1bGUgPSBuZXcgQ1NTVW5rbm93blJ1bGVJbXBsKCk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdAotCSAqLwotCXB1YmxpYyBNZWRpYUxpc3QgY3JlYXRlTWVkaWFMaXN0KCkgewotCQlNZWRpYUxpc3RJbXBsIG1lZGlhID0gbmV3IE1lZGlhTGlzdEltcGwoKTsKLQkJbWVkaWEuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gbWVkaWE7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byBkZWxldGUgYSBydWxlIGZyb20gdGhlIHN0eWxlIHNoZWV0LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgVGhlIGluZGV4IHdpdGhpbiB0aGUgc3R5bGUgc2hlZXQncyBydWxlIGxpc3Qgb2YgdGhlIHJ1bGUgdG8KLQkgKiAgICAgICAgICAgIHJlbW92ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBpbmRleCBkb2VzIG5vdAotCSAqICAgICAgICAgICAgICAgIGNvcnJlc3BvbmQgdG8gYSBydWxlIGluIHRoZSBzdHlsZSBzaGVldCdzIHJ1bGUgbGlzdC4KLQkgKiAgICAgICAgICAgICAgICA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBzdHlsZSBzaGVldAotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVJ1bGUoaW50IGluZGV4KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJQ1NTTm9kZUltcGwgbm9kZSA9IGdldEluZGV4ZWRSdWxlKGluZGV4KTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIFRoZSBsaXN0IG9mIGFsbCBDU1MgcnVsZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgc3R5bGUgc2hlZXQuIFRoaXMKLQkgKiBpbmNsdWRlcyBib3RoIHJ1bGUgc2V0cyBhbmQgYXQtcnVsZXMuCi0JICovCi0JcHVibGljIENTU1J1bGVMaXN0IGdldENzc1J1bGVzKCkgewotCQlDU1NSdWxlTGlzdEltcGwgbGlzdCA9IG5ldyBDU1NSdWxlTGlzdEltcGwoKTsKLQotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlKSB7Ci0JCQkJbGlzdC5hcHBlbmROb2RlKG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIENTU1J1bGVMaXN0IGdldENzc1J1bGVzKGJvb2xlYW4gc2hvdWxkSW1wb3J0KSB7Ci0JCWlmICghc2hvdWxkSW1wb3J0KQotCQkJcmV0dXJuIGdldENzc1J1bGVzKCk7Ci0KLQkJQ1NTUnVsZUxpc3RJbXBsIGxpc3QgPSBuZXcgQ1NTUnVsZUxpc3RJbXBsKCk7Ci0JCVN0YWNrIHJlZnMgPSBuZXcgU3RhY2soKTsKLQkJZ2V0UnVsZXMobGlzdCwgdGhpcywgcmVmcyk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRSdWxlcyhDU1NSdWxlTGlzdEltcGwgbGlzdCwgSUNTU1N0eWxlU2hlZXQgc2hlZXQsIFN0YWNrIHJlZnMpIHsKLQkJU3RyaW5nIGhyZWYgPSBzaGVldC5nZXRIcmVmKCk7Ci0JCWlmIChocmVmICE9IG51bGwpIHsKLQkJCS8vIEF2b2lkIGNpcmN1bGFyIEBpbXBvcnRzCi0JCQlpZiAocmVmcy5jb250YWlucyhocmVmKSkKLQkJCQlyZXR1cm47Ci0JCQlyZWZzLnB1c2goaHJlZik7Ci0JCX0KLQkJYm9vbGVhbiBhY2NlcHRJbXBvcnRzID0gdHJ1ZTsKLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gc2hlZXQuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCS8vIEltcG9ydCB0aGUgc3R5bGVzaGVldCBpbnRvIHRoZSBsaXN0Ci0JCQkvLyBAaW1wb3J0IHJ1bGVzIG11c3QgcHJlY2VkZSBhbGwgb3RoZXIgcnVsZXMsIGFjY29yZGluZyB0byB0aGUgc3BlYwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUgJiYgYWNjZXB0SW1wb3J0cykgewotCQkJCUNTU1N0eWxlU2hlZXQgaW1wb3J0U2hlZXQgPSAoKElDU1NJbXBvcnRSdWxlKSBub2RlKS5nZXRTdHlsZVNoZWV0KCk7Ci0JCQkJaWYgKGltcG9ydFNoZWV0IGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpCi0JCQkJCWdldFJ1bGVzKGxpc3QsIChJQ1NTU3R5bGVTaGVldCkgaW1wb3J0U2hlZXQsIHJlZnMpOwotCQkJCWVsc2UKLQkJCQkJbGlzdC5hcHBlbmROb2RlKG5vZGUpOwotCQkJfQotCQkJLy8gQWRkIHRoZSBydWxlIHRvIHRoZSBsaXN0Ci0JCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUnVsZSkgewotCQkJCWxpc3QuYXBwZW5kTm9kZShub2RlKTsKLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLkNIQVJTRVRSVUxFX05PREUpCi0JCQkJCWFjY2VwdEltcG9ydHMgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQlpZiAoaHJlZiAhPSBudWxsKQotCQkJcmVmcy5wb3AoKTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHN0eWxlIHNoZWV0IGlzIGFwcGxpZWQgdG8gdGhlIGRvY3VtZW50LgotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGlzIG5vdC4gTW9kaWZ5aW5nIHRoaXMgYXR0cmlidXRlIG1heSBjYXVzZSBhCi0JICogbmV3IHJlc29sdXRpb24gb2Ygc3R5bGUgZm9yIHRoZSBkb2N1bWVudC4gQSBzdHlsZXNoZWV0IG9ubHkgYXBwbGllcyBpZgotCSAqIGJvdGggYW4gYXBwcm9wcmlhdGUgbWVkaXVtIGRlZmluaXRpb24gaXMgcHJlc2VudCBhbmQgdGhlIGRpc2FibGVkCi0JICogYXR0cmlidXRlIGlzIGZhbHNlLiBTbywgaWYgdGhlIG1lZGlhIGRvZXNuJ3QgYXBwbHkgdG8gdGhlIGN1cnJlbnQgdXNlcgotCSAqIGFnZW50LCB0aGUgPGNvZGU+ZGlzYWJsZWQ8L2NvZGU+IGF0dHJpYnV0ZSBpcyBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldERpc2FibGVkKCkgewotCQlyZXR1cm4gZkRpc2FibGVkOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBzdHlsZSBzaGVldCBpcyBhIGxpbmtlZCBzdHlsZSBzaGVldCwgdGhlIHZhbHVlIG9mIGl0cyBhdHRyaWJ1dGUKLQkgKiBpcyBpdHMgbG9jYXRpb24uIEZvciBpbmxpbmUgc3R5bGUgc2hlZXRzLCB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUKLQkgKiBpcyA8Y29kZT5udWxsPC9jb2RlPi4gU2VlIHRoZSBocmVmIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGZvciB0aGUKLQkgKiA8Y29kZT5MSU5LPC9jb2RlPiBlbGVtZW50IGluIEhUTUwgNC4wLCBhbmQgdGhlIGhyZWYgcHNldWRvLWF0dHJpYnV0ZQotCSAqIGZvciB0aGUgWE1MIHN0eWxlIHNoZWV0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIcmVmKCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FWFRFUk5BTCkgewotCQkJcmV0dXJuIG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJLyoKLQkJCSAqIE9iamVjdCBpZCA9IG1vZGVsLmdldElkKCk7IGlmIChpZCAhPSBudWxsKSB7IGlmIChpZCBpbnN0YW5jZW9mCi0JCQkgKiBJUmVzb3VyY2UpIHsgLy8gVE9ETzogbmVlZCB0byBjaGVjayB3aGV0aGVyIHRoaXMgaXMgY29ycmVjdCBvcgotCQkJICogbm90LCBsYXRlci4gcmV0dXJuICgoSVJlc291cmNlKWlkKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7IH0KLQkJCSAqIHJldHVybiBpZC50b1N0cmluZygpOyB9Ci0JCQkgKi99Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUNTU1J1bGVJbXBsIGdldEluZGV4ZWRSdWxlKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IGkgPSAwOwotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlKSB7Ci0JCQkJaWYgKGkrKyA9PSBpbmRleCkKLQkJCQkJcmV0dXJuIChDU1NSdWxlSW1wbCkgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgaW50ZW5kZWQgZGVzdGluYXRpb24gbWVkaWEgZm9yIHN0eWxlIGluZm9ybWF0aW9uLiBUaGUgbWVkaWEgaXMKLQkgKiBvZnRlbiBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPm93bmVyTm9kZTwvY29kZT4uIElmIG5vIG1lZGlhIGhhcyBiZWVuCi0JICogc3BlY2lmaWVkLCB0aGUgPGNvZGU+TWVkaWFMaXN0PC9jb2RlPiB3aWxsIGJlIGVtcHR5LiBTZWUgdGhlIG1lZGlhCi0JICogYXR0cmlidXRlIGRlZmluaXRpb24gZm9yIHRoZSA8Y29kZT5MSU5LPC9jb2RlPiBlbGVtZW50IGluIEhUTUwgNC4wLAotCSAqIGFuZCB0aGUgbWVkaWEgcHNldWRvLWF0dHJpYnV0ZSBmb3IgdGhlIFhNTCBzdHlsZSBzaGVldCBwcm9jZXNzaW5nCi0JICogaW5zdHJ1Y3Rpb24gLiBNb2RpZnlpbmcgdGhlIG1lZGlhIGxpc3QgbWF5IGNhdXNlIGEgY2hhbmdlIHRvIHRoZQotCSAqIGF0dHJpYnV0ZSA8Y29kZT5kaXNhYmxlZDwvY29kZT4uCi0JICovCi0JcHVibGljIE1lZGlhTGlzdCBnZXRNZWRpYSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFNUWUxFU0hFRVRfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbm9kZSB0aGF0IGFzc29jaWF0ZXMgdGhpcyBzdHlsZSBzaGVldCB3aXRoIHRoZSBkb2N1bWVudC4gRm9yIEhUTUwsCi0JICogdGhpcyBtYXkgYmUgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+TElOSzwvY29kZT4gb3IgPGNvZGU+U1RZTEU8L2NvZGU+Ci0JICogZWxlbWVudC4gRm9yIFhNTCwgaXQgbWF5IGJlIHRoZSBsaW5raW5nIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIEZvcgotCSAqIHN0eWxlIHNoZWV0cyB0aGF0IGFyZSBpbmNsdWRlZCBieSBvdGhlciBzdHlsZSBzaGVldHMsIHRoZSB2YWx1ZSBvZiB0aGlzCi0JICogYXR0cmlidXRlIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBOb2RlIGdldE93bmVyTm9kZSgpIHsKLQkJLy8gZm9yIDxMSU5LPiB0YWcgb3IgPFNUWUxFPiB0YWcKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQlyZXR1cm4gbW9kZWwuZ2V0T3duZXJET01Ob2RlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uTm9kZUxpc3QgZ2V0T3duZXJOb2RlcygpIHsKLQkJTGlzdCBsaXN0ID0gKGdldE1vZGVsKCkuZ2V0U3R5bGVMaXN0ZW5lcnMoKSAhPSBudWxsKSA/IG5ldyBWZWN0b3IoZ2V0TW9kZWwoKS5nZXRTdHlsZUxpc3RlbmVycygpKSA6IG51bGw7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSW50ZXJuYWxOb2RlTGlzdCBub2RlcyA9IG5ldyBJbnRlcm5hbE5vZGVMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTdHlsZVNoZWV0QWRhcHRlcikgewotCQkJCW5vZGVzLm5vZGVzLmFkZCgoKElTdHlsZVNoZWV0QWRhcHRlcikgb2JqKS5nZXRFbGVtZW50KCkpOwotCQkJfQotCQl9Ci0JCWlmIChub2Rlcy5nZXRMZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gbm9kZXM7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKiBAcGFyYW0gZG9jCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRPd25lck5vZGVzKERvY3VtZW50IGRvYykgewotCQlMaXN0IGxpc3QgPSAoZ2V0TW9kZWwoKS5nZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwpID8gbmV3IFZlY3RvcihnZXRNb2RlbCgpLmdldFN0eWxlTGlzdGVuZXJzKCkpIDogbnVsbDsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJbnRlcm5hbE5vZGVMaXN0IG5vZGVzID0gbmV3IEludGVybmFsTm9kZUxpc3QoKTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVN0eWxlU2hlZXRBZGFwdGVyKSB7Ci0JCQkJRWxlbWVudCBlbGUgPSAoKElTdHlsZVNoZWV0QWRhcHRlcikgb2JqKS5nZXRFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZS5nZXRPd25lckRvY3VtZW50KCkgPT0gZG9jKQotCQkJCQlub2Rlcy5ub2Rlcy5hZGQoZWxlKTsKLQkJCX0KLQkJfQotCQlpZiAobm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIG5vZGVzOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHN0eWxlIHNoZWV0IGNvbWVzIGZyb20gYW4gPGNvZGU+QGltcG9ydDwvY29kZT4gcnVsZSwgdGhlIDxjb2RlPm93bmVyUnVsZTwvY29kZT4gYXR0cmlidXRlIHdpbGwKLQkgKiAgICAgICAgIGNvbnRhaW4gdGhlIDxjb2RlPkNTU0ltcG9ydFJ1bGU8L2NvZGU+LiBJbiB0aGF0IGNhc2UsIHRoZQotCSAqICAgICAgICAgPGNvZGU+b3duZXJOb2RlPC9jb2RlPiBhdHRyaWJ1dGUgaW4gdGhlCi0JICogICAgICAgICA8Y29kZT5TdHlsZVNoZWV0PC9jb2RlPiBpbnRlcmZhY2Ugd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAgICAgICAgIElmIHRoZSBzdHlsZSBzaGVldCBjb21lcyBmcm9tIGFuIGVsZW1lbnQgb3IgYSBwcm9jZXNzaW5nCi0JICogICAgICAgICBpbnN0cnVjdGlvbiwgdGhlIDxjb2RlPm93bmVyUnVsZTwvY29kZT4gYXR0cmlidXRlIHdpbGwgYmUKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGFuZCB0aGUgPGNvZGU+b3duZXJOb2RlPC9jb2RlPiBhdHRyaWJ1dGUKLQkgKiAgICAgICAgIHdpbGwgY29udGFpbiB0aGUgPGNvZGU+Tm9kZTwvY29kZT4uCi0JICovCi0JcHVibGljIENTU1J1bGUgZ2V0T3duZXJSdWxlKCkgewotCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCBDU1NDb3JlTWVzc2FnZXMuWW91X2Nhbm5vdF91c2VfQ1NTU3R5bGVTaGVfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJZb3UgY2Fubm90IHVzZSBDU1NTdHlsZVNoZWV0LmdldE93bmVyUnVsZSgpIGJlY2F1c2Ugb2YgbWFueSByZWZlcmVuY2VycyBvZiB0aGlzIHJ1bGVcblBsZWFzZSB1c2UgZ2V0T253ZXJSdWxlcygpIgotCQkvLyBmb3IgQGltcG9ydAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdAotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZUxpc3QgZ2V0T3duZXJSdWxlcygpIHsKLQkJU3R5bGVTaGVldExpc3QgbGlzdCA9IGdldFBhcmVudFN0eWxlU2hlZXRzKCk7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ1NTUnVsZUxpc3RJbXBsIHJ1bGVMaXN0ID0gbmV3IENTU1J1bGVMaXN0SW1wbCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJSW1wb3J0UnVsZUNvbGxlY3RvciB0cmF2ID0gbmV3IEltcG9ydFJ1bGVDb2xsZWN0b3IodGhpcyk7Ci0JCQl0cmF2LmFwcGx5KChJQ1NTU3R5bGVTaGVldCkgbGlzdC5pdGVtKGkpKTsKLQkJCXJ1bGVMaXN0Lm5vZGVzLmFkZEFsbCh0cmF2LmdldFJ1bGVzKCkpOwotCQl9Ci0JCXJldHVybiBydWxlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBGb3Igc3R5bGUgc2hlZXQgbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydCB0aGUgY29uY2VwdCBvZiBzdHlsZSBzaGVldAotCSAqIGluY2x1c2lvbiwgdGhpcyBhdHRyaWJ1dGUgcmVwcmVzZW50cyB0aGUgaW5jbHVkaW5nIHN0eWxlIHNoZWV0LCBpZiBvbmUKLQkgKiBleGlzdHMuIElmIHRoZSBzdHlsZSBzaGVldCBpcyBhIHRvcC1sZXZlbCBzdHlsZSBzaGVldCwgb3IgdGhlIHN0eWxlCi0JICogc2hlZXQgbGFuZ3VhZ2UgZG9lcyBub3Qgc3VwcG9ydCBpbmNsdXNpb24sIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZQotCSAqIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHlsZVNoZWV0IGdldFBhcmVudFN0eWxlU2hlZXQoKSB7Ci0JCUNTU1J1bGUgb3duZXIgPSBnZXRPd25lclJ1bGUoKTsKLQkJaWYgKG93bmVyICE9IG51bGwpCi0JCQlyZXR1cm4gb3duZXIuZ2V0UGFyZW50U3R5bGVTaGVldCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0Ci0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0IGdldFBhcmVudFN0eWxlU2hlZXRzKCkgewotCQlMaXN0IGxpc3QgPSAoZ2V0TW9kZWwoKS5nZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwpID8gbmV3IFZlY3RvcihnZXRNb2RlbCgpLmdldFN0eWxlTGlzdGVuZXJzKCkpIDogbnVsbDsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJbnRlcm5hbFN0eWxlU2hlZXRMaXN0IHNoZWV0cyA9IG5ldyBJbnRlcm5hbFN0eWxlU2hlZXRMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJCXNoZWV0cy5hcHBlbmROb2RlKCgoSUNTU01vZGVsKSBvYmopLmdldERvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0JCWlmIChzaGVldHMuZ2V0TGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIHNoZWV0czsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIGFkdmlzb3J5IHRpdGxlLiBUaGUgdGl0bGUgaXMgb2Z0ZW4gc3BlY2lmaWVkIGluIHRoZQotCSAqIDxjb2RlPm93bmVyTm9kZTwvY29kZT4uIFNlZSB0aGUgdGl0bGUgYXR0cmlidXRlIGRlZmluaXRpb24gZm9yIHRoZQotCSAqIDxjb2RlPkxJTks8L2NvZGU+IGVsZW1lbnQgaW4gSFRNTCA0LjAsIGFuZCB0aGUgdGl0bGUgcHNldWRvLWF0dHJpYnV0ZQotCSAqIGZvciB0aGUgWE1MIHN0eWxlIHNoZWV0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJTm9kZSBub2RlID0gZ2V0T3duZXJOb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJcmV0dXJuICgoRWxlbWVudCkgbm9kZSkuaGFzQXR0cmlidXRlKCJUSVRMRSIpID8gKChFbGVtZW50KSBub2RlKS5nZXRBdHRyaWJ1dGUoIlRJVExFIikgOiBudWxsOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIHRoZSBzdHlsZSBzaGVldCBsYW5ndWFnZSBmb3IgdGhpcyBzdHlsZSBzaGVldC4gVGhlIHN0eWxlCi0JICogc2hlZXQgbGFuZ3VhZ2UgaXMgc3BlY2lmaWVkIGFzIGEgY29udGVudCB0eXBlIChlLmcuICJ0ZXh0L2NzcyIpLiBUaGUKLQkgKiBjb250ZW50IHR5cGUgaXMgb2Z0ZW4gc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5vd25lck5vZGU8L2NvZGU+LiBBbHNvCi0JICogc2VlIHRoZSB0eXBlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGZvciB0aGUgPGNvZGU+TElOSzwvY29kZT4gZWxlbWVudAotCSAqIGluIEhUTUwgNC4wLCBhbmQgdGhlIHR5cGUgcHNldWRvLWF0dHJpYnV0ZSBmb3IgdGhlIFhNTCBzdHlsZSBzaGVldAotCSAqIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlOb2RlIG5vZGUgPSBnZXRPd25lck5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChFbGVtZW50KSBub2RlKS5oYXNBdHRyaWJ1dGUoIlRZUEUiKSA/ICgoRWxlbWVudCkgbm9kZSkuZ2V0QXR0cmlidXRlKCJUWVBFIikgOiBudWxsOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gaW5zZXJ0IGEgbmV3IHJ1bGUgaW50byB0aGUgc3R5bGUgc2hlZXQuIFRoZSBuZXcgcnVsZSBub3cKLQkgKiBiZWNvbWVzIHBhcnQgb2YgdGhlIGNhc2NhZGUuCi0JICogCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIFRoZSBwYXJzYWJsZSB0ZXh0IHJlcHJlc2VudGluZyB0aGUgcnVsZS4gRm9yIHJ1bGUgc2V0cyB0aGlzCi0JICogICAgICAgICAgICBjb250YWlucyBib3RoIHRoZSBzZWxlY3RvciBhbmQgdGhlIHN0eWxlIGRlY2xhcmF0aW9uLiBGb3IKLQkgKiAgICAgICAgICAgIGF0LXJ1bGVzLCB0aGlzIHNwZWNpZmllcyBib3RoIHRoZSBhdC1pZGVudGlmaWVyIGFuZCB0aGUgcnVsZQotCSAqICAgICAgICAgICAgY29udGVudC4KLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIFRoZSBpbmRleCB3aXRoaW4gdGhlIHN0eWxlIHNoZWV0J3MgcnVsZSBsaXN0IG9mIHRoZSBydWxlCi0JICogICAgICAgICAgICBiZWZvcmUgd2hpY2ggdG8gaW5zZXJ0IHRoZSBzcGVjaWZpZWQgcnVsZS4gSWYgdGhlIHNwZWNpZmllZAotCSAqICAgICAgICAgICAgaW5kZXggaXMgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3R5bGUgc2hlZXQncyBydWxlCi0JICogICAgICAgICAgICBjb2xsZWN0aW9uLCB0aGUgcnVsZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHN0eWxlCi0JICogICAgICAgICAgICBzaGVldC4KLQkgKiBAcmV0dXJuIFRoZSBpbmRleCB3aXRoaW4gdGhlIHN0eWxlIHNoZWV0J3MgcnVsZSBjb2xsZWN0aW9uIG9mIHRoZSBuZXdseQotCSAqICAgICAgICAgaW5zZXJ0ZWQgcnVsZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIHRoZSBydWxlIGNhbm5vdCBiZQotCSAqICAgICAgICAgICAgICAgIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZS5nLiBpZiBhbgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkBpbXBvcnQ8L2NvZGU+IHJ1bGUgaXMgaW5zZXJ0ZWQgYWZ0ZXIgYSBzdGFuZGFyZCBydWxlIHNldCBvciBvdGhlcgotCSAqICAgICAgICAgYXQtcnVsZS4gPGJyPgotCSAqICAgICAgICAgSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGlzIG5vdCBhIHZhbGlkCi0JICogICAgICAgICBpbnNlcnRpb24gcG9pbnQuIDxicj4KLQkgKiAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgc3R5bGUgc2hlZXQgaXMKLQkgKiAgICAgICAgIHJlYWRvbmx5LiA8YnI+Ci0JICogICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBydWxlIGhhcyBhIHN5bnRheCBlcnJvciBhbmQKLQkgKiAgICAgICAgIGlzIHVucGFyc2FibGUuCi0JICovCi0JcHVibGljIGludCBpbnNlcnRSdWxlKFN0cmluZyBydWxlLCBpbnQgaW5kZXgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpbnQgbGVuZ3RoID0gZ2V0Q3NzUnVsZXMoKS5nZXRMZW5ndGgoKTsKLQkJaWYgKGluZGV4IDwgMCB8fCBsZW5ndGggPCBpbmRleCkKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ1NTUnVsZUltcGwgcmVmUnVsZSA9IChsZW5ndGggIT0gaW5kZXgpID8gZ2V0SW5kZXhlZFJ1bGUoaW5kZXgpIDogbnVsbDsKLQkJaW50IG9mZnNldCA9IChyZWZSdWxlICE9IG51bGwpID8gcmVmUnVsZS5nZXRTdGFydE9mZnNldCgpIDogZG9jLmdldExlbmd0aCgpOwotCQlkb2MucmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCAwLCBydWxlKTsKLQotCQkvLyBpbnNlcnRCZWZvcmUoKENTU05vZGVJbXBsKSBjcmVhdGVDU1NSdWxlKHJ1bGUpLHJlZlJ1bGUpOwotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBuZXdSdWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSByZWZSdWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBpbnNlcnRSdWxlQmVmb3JlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIG5ld1J1bGUsIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJlZlJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAobmV3UnVsZSA9PSBudWxsICYmIHJlZlJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIGluc2VydEJlZm9yZSgoQ1NTTm9kZUltcGwpIG5ld1J1bGUsIChDU1NOb2RlSW1wbCkgcmVmUnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEb2N1bWVudCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcmVtb3ZlUnVsZShvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBydWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIHJlbW92ZUNoaWxkKChDU1NOb2RlSW1wbCkgcnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSByZXBsYWNlUnVsZShvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBuZXdSdWxlLCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBvbGRSdWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld1J1bGUgPT0gbnVsbCAmJiBvbGRSdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDU1NSdWxlIHJldCA9IChDU1NSdWxlKSByZXBsYWNlQ2hpbGQoKENTU05vZGVJbXBsKSBuZXdSdWxlLCAoQ1NTTm9kZUltcGwpIG9sZFJ1bGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIHNldERpc2FibGVkIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc2FibGVkKGJvb2xlYW4gZGlzYWJsZWQpIHsKLQkJdGhpcy5mRGlzYWJsZWQgPSBkaXNhYmxlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1Vua25vd25SdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NVbmtub3duUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzZWQ3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1Vua25vd25SdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1Vua25vd25SdWxlOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU1Vua25vd25SdWxlSW1wbCBleHRlbmRzIENTU1J1bGVJbXBsIGltcGxlbWVudHMgQ1NTVW5rbm93blJ1bGUgewotCi0JLy8gVE9ETzogVGhpcyBmaWVsZCBpcyBuZXZlciByZWFkCi0JU3RyaW5nIGZDc3NUZXh0ID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1Vua25vd25SdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NVbmtub3duUnVsZUltcGwoQ1NTVW5rbm93blJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTVW5rbm93blJ1bGVJbXBsIGNsb25lZCA9IG5ldyBDU1NVbmtub3duUnVsZUltcGwodGhpcyk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gVU5LTk9XTlJVTEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBVTktOT1dOX1JVTEU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNzc1RleHQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDc3NUZXh0KFN0cmluZyBjc3NUZXh0KSB7Ci0JCXRoaXMuZkNzc1RleHQgPSBjc3NUZXh0OwotCi0JCXN1cGVyLnNldENzc1RleHQoY3NzVGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Db3VudGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Db3VudGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjkyMWY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ291bnRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNvdW50ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5Db3VudGVyOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENvdW50ZXJJbXBsIGV4dGVuZHMgQ1NTUHJpbWl0aXZlQ29udGFpbmVyIGltcGxlbWVudHMgSUNvdW50ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JQ291bnRlckltcGwoKSB7Ci0JCXN1cGVyKENTU19DT1VOVEVSKTsKLQl9Ci0KLQlDb3VudGVySW1wbChDb3VudGVySW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNvdW50ZXJJbXBsIGNsb25lZCA9IG5ldyBDb3VudGVySW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIENvdW50ZXIgdmFsdWUuIElmIHRoaXMgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiBjb250YWluIGEgY291bnRlciB2YWx1ZSwgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IGlzIHJhaXNlZC4KLQkgKiBNb2RpZmljYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgY2FuIGJlIGFjaGlldmVkIHVzaW5nCi0JICogdGhlIDxjb2RlPkNvdW50ZXI8L2NvZGU+IGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBDb3VudGVyIHZhbHVlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogICAgICAgICAgICAgICAgY29udGFpbiBhIENvdW50ZXIgdmFsdWUgKGUuZy4gdGhpcyBpcyBub3QKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5DU1NfQ09VTlRFUjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBDb3VudGVyIGdldENvdW50ZXJWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgaWRlbnRpZmllciBvZiB0aGUgY291bnRlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoSURFTlRJRklFUik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIHN0eWxlIG9mIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlzdFN0eWxlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKExJU1RTVFlMRSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIHNlcGFyYXRvciBvZiB0aGUgbmVzdGVkIGNvdW50ZXJzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VwYXJhdG9yKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFNFUEFSQVRPUik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFByaW1pdGl2ZXMoKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWRlbnRpZmllcgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKElERU5USUZJRVIsIGlkZW50aWZpZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0U3R5bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdFN0eWxlKFN0cmluZyBsaXN0U3R5bGUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXRBdHRyaWJ1dGUoTElTVFNUWUxFLCBsaXN0U3R5bGUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBTZXBhcmF0b3IKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VwYXJhdG9yKFN0cmluZyBTZXBhcmF0b3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXRBdHRyaWJ1dGUoU0VQQVJBVE9SLCBTZXBhcmF0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NQ1NTSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01DU1NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNzkwN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01DU1NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVTaGVldDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRE9NQ1NTSW1wbCB7Ci0KLQkvKioKLQkgKiBET01DU1NJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIERPTUNTU0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsIGRvY3VtZW50ID0gbmV3IENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKHRydWUpOwotCi0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVNoZWV0Ci0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG1lZGlhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ1NTU3R5bGVTaGVldCBjcmVhdGVDU1NTdHlsZVNoZWV0KFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lZGlhKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBDU1NTdHlsZVNoZWV0SW1wbCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTWVkaWFMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9NZWRpYUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NGIzYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9NZWRpYUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBNZWRpYUxpc3RJbXBsIGV4dGVuZHMgQ1NTUmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgTWVkaWFMaXN0IHsKLQotCWludCBtZWRpdW1Db3VudGVyOwotCi0JLyoqCi0JICogTWVkaWFMaXN0SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCU1lZGlhTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTWVkaWFMaXN0SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCU1lZGlhTGlzdEltcGwoTWVkaWFMaXN0SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIG1lZGl1bSA8Y29kZT5uZXdNZWRpdW08L2NvZGU+IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuIElmIHRoZQotCSAqIDxjb2RlPm5ld01lZGl1bTwvY29kZT4gaXMgYWxyZWFkeSB1c2VkLCBpdCBpcyBmaXJzdCByZW1vdmVkLgotCSAqIAotCSAqIEBwYXJhbSBuZXdNZWRpdW1UaGUKLQkgKiAgICAgICAgICAgIG5ldyBtZWRpdW0gdG8gYWRkLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9DSEFSQUNURVJfRVJSOiBJZiB0aGUgbWVkaXVtIGNvbnRhaW5zIGNoYXJhY3RlcnMKLQkgKiAgICAgICAgICAgICAgICB0aGF0IGFyZSBpbnZhbGlkIGluIHRoZSB1bmRlcmx5aW5nIHN0eWxlIGxhbmd1YWdlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBsaXN0IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIHZvaWQgYXBwZW5kTWVkaXVtKFN0cmluZyBuZXdNZWRpdW0pIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobmV3TWVkaXVtID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQ1NTTm9kZUxpc3RJbXBsIG0gPSBnZXRNZWRpYSgpOwotCQlmb3IgKGludCBpID0gMDsgaSAhPSBtLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChuZXdNZWRpdW0uZXF1YWxzKGl0ZW0oaSkpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCXNldEF0dHJpYnV0ZSgibWVkaXVtIiArIEludGVnZXIudG9TdHJpbmcobWVkaXVtQ291bnRlcisrKSwgbmV3TWVkaXVtKTsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJTWVkaWFMaXN0SW1wbCBjbG9uZWQgPSBuZXcgTWVkaWFMaXN0SW1wbCh0aGlzKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBtZWRpdW0gaW5kaWNhdGVkIGJ5IDxjb2RlPm9sZE1lZGl1bTwvY29kZT4gZnJvbSB0aGUgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkTWVkaXVtVGhlCi0JICogICAgICAgICAgICBtZWRpdW0gdG8gZGVsZXRlIGluIHRoZSBtZWRpYSBsaXN0LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBsaXN0IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT1RfRk9VTkRfRVJSOiBSYWlzZWQgaWYgPGNvZGU+b2xkTWVkaXVtPC9jb2RlPiBpcyBub3QKLQkgKiAgICAgICAgICAgICAgICBpbiB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVNZWRpdW0oU3RyaW5nIG9sZE1lZGl1bSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWZvciAoaW50IGkgPSAwOyBpICE9IGdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChvbGRNZWRpdW0uZXF1YWxzKGl0ZW0oaSkpKSB7Ci0JCQkJcmVtb3ZlQXR0cmlidXRlTm9kZSgoQ1NTQXR0ckltcGwpIGZBdHRycy5pdGVtKGkpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgbWVkaWEgaW4gdGhlIGxpc3QuIFRoZSByYW5nZSBvZiB2YWxpZCBtZWRpYSBpcwotCSAqIDxjb2RlPjA8L2NvZGU+IHRvIDxjb2RlPmxlbmd0aC0xPC9jb2RlPiBpbmNsdXNpdmUuCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRNZWRpYSgpLmdldExlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gQ1NTTm9kZUxpc3RJbXBsCi0JICovCi0JQ1NTTm9kZUxpc3RJbXBsIGdldE1lZGlhKCkgewotCQlpZiAoZkF0dHJzID09IG51bGwpCi0JCQlmQXR0cnMgPSBuZXcgQ1NTTmFtZWROb2RlTWFwSW1wbCgpOwotCQlyZXR1cm4gZkF0dHJzOwotCX0KLQotCS8qKgotCSAqIFRoZSBwYXJzYWJsZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZWRpYSBsaXN0LiBUaGlzIGlzIGEKLQkgKiBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYS4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHN0cmluZyB2YWx1ZSBoYXMgYQotCSAqICAgICAgICAgICAgICAgIHN5bnRheCBlcnJvciBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbWVkaWEgbGlzdAotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVkaWFUZXh0KCkgewotCQlyZXR1cm4gZ2V0Q3NzVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIwMDEvMDEvMTcKLQkgKiAxODo1MDoyOSkKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gTUVESUFMSVNUX05PREU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+IHRoIGluIHRoZSBsaXN0LiBJZiA8Y29kZT5pbmRleDwvY29kZT4KLQkgKiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBtZWRpYSBpbiB0aGUgbGlzdCwgdGhpcwotCSAqIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBJbmRleCBpbnRvIHRoZSBjb2xsZWN0aW9uLgotCSAqIEByZXR1cm4gVGhlIG1lZGl1bSBhdCB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+IHRoIHBvc2l0aW9uIGluIHRoZQotCSAqICAgICAgICAgPGNvZGU+TWVkaWFMaXN0PC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhhdCBpcwotCSAqICAgICAgICAgbm90IGEgdmFsaWQgaW5kZXguCi0JICovCi0JcHVibGljIFN0cmluZyBpdGVtKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwIHx8IGdldExlbmd0aCgpIDw9IGluZGV4KQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuICgoQ1NTQXR0ckltcGwpIGdldE1lZGlhKCkuaXRlbShpbmRleCkpLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogc2V0TWVkaWFUZXh0IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lZGlhVGV4dChTdHJpbmcgbWVkaWFUZXh0KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0Q3NzVGV4dChtZWRpYVRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUkdCQ29sb3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JHQkNvbG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTU1MDI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUkdCQ29sb3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5SR0JDb2xvcjsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBSR0JDb2xvckltcGwgZXh0ZW5kcyBDU1NQcmltaXRpdmVDb250YWluZXIgaW1wbGVtZW50cyBSR0JDb2xvciB7Ci0KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBmUmVkOwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGZHcmVlbjsKLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBmQmx1ZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVJHQkNvbG9ySW1wbCgpIHsKLQkJc3VwZXIoQ1NTX1JHQkNPTE9SKTsKLQl9Ci0KLQlSR0JDb2xvckltcGwoUkdCQ29sb3JJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJZlJlZCA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwodGhhdC5mUmVkKTsKLQkJYXBwZW5kQ2hpbGQoZlJlZCk7Ci0KLQkJZkdyZWVuID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGF0LmZHcmVlbik7Ci0JCWFwcGVuZENoaWxkKGZHcmVlbik7Ci0KLQkJZkJsdWUgPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoYXQuZkJsdWUpOwotCQlhcHBlbmRDaGlsZChmQmx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJUkdCQ29sb3JJbXBsIGNsb25lZCA9IG5ldyBSR0JDb2xvckltcGwodGhpcyk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgYmx1ZSB2YWx1ZSBvZiB0aGUgUkdCIGNvbG9yLgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRCbHVlKCkgewotCQlyZXR1cm4gZkJsdWU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIGdyZWVuIHZhbHVlIG9mIHRoZSBSR0IgY29sb3IuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldEdyZWVuKCkgewotCQlyZXR1cm4gZkdyZWVuOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSByZWQgdmFsdWUgb2YgdGhlIFJHQiBjb2xvci4KLQkgKi8KLQlwdWJsaWMgQ1NTUHJpbWl0aXZlVmFsdWUgZ2V0UmVkKCkgewotCQlyZXR1cm4gZlJlZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5SR0JDb2xvcgotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgUkdCQ29sb3IgZ2V0UkdCQ29sb3JWYWx1ZSgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0UHJpbWl0aXZlcygpIHsKLQotCQlmUmVkID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU19OVU1CRVIpOwotCQlhcHBlbmRDaGlsZChmUmVkKTsKLQotCQlmR3JlZW4gPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTX05VTUJFUik7Ci0JCWFwcGVuZENoaWxkKGZHcmVlbik7Ci0KLQkJZkJsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTX05VTUJFUik7Ci0JCWFwcGVuZENoaWxkKGZCbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JlY3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JlY3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOTVlYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SZWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuUmVjdDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBSZWN0SW1wbCBleHRlbmRzIENTU1ByaW1pdGl2ZUNvbnRhaW5lciBpbXBsZW1lbnRzIFJlY3QgewotCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZlRvcDsKLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBmUmlnaHQ7Ci0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZkJvdHRvbTsKLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBmTGVmdDsKLQotCS8qKgotCSAqIAotCSAqLwotCVJlY3RJbXBsKCkgewotCQlzdXBlcihDU1NfUkVDVCk7Ci0JfQotCi0JUmVjdEltcGwoUmVjdEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlmVG9wID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGF0LmZUb3ApOwotCQlhcHBlbmRDaGlsZChmVG9wKTsKLQotCQlmUmlnaHQgPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoYXQuZlJpZ2h0KTsKLQkJYXBwZW5kQ2hpbGQoZlJpZ2h0KTsKLQotCQlmQm90dG9tID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGF0LmZCb3R0b20pOwotCQlhcHBlbmRDaGlsZChmQm90dG9tKTsKLQotCQlmTGVmdCA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwodGhhdC5mTGVmdCk7Ci0JCWFwcGVuZENoaWxkKGZMZWZ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlSZWN0SW1wbCBjbG9uZWQgPSBuZXcgUmVjdEltcGwodGhpcyk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgYm90dG9tIG9mIHRoZSByZWN0LgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRCb3R0b20oKSB7Ci0JCXJldHVybiBmQm90dG9tOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBsZWZ0IG9mIHRoZSByZWN0LgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRMZWZ0KCkgewotCQlyZXR1cm4gZkxlZnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuUmVjdAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgUmVjdCBnZXRSZWN0VmFsdWUoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIHJpZ2h0IG9mIHRoZSByZWN0LgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRSaWdodCgpIHsKLQkJcmV0dXJuIGZSaWdodDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgdG9wIG9mIHRoZSByZWN0LgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRUb3AoKSB7Ci0JCXJldHVybiBmVG9wOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQcmltaXRpdmVzKCkgewotCi0JCWZUb3AgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTX05VTUJFUik7Ci0JCWFwcGVuZENoaWxkKGZUb3ApOwotCi0JCWZSaWdodCA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NfTlVNQkVSKTsKLQkJYXBwZW5kQ2hpbGQoZlJpZ2h0KTsKLQotCQlmQm90dG9tID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU19OVU1CRVIpOwotCQlhcHBlbmRDaGlsZChmQm90dG9tKTsKLQotCQlmTGVmdCA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NfTlVNQkVSKTsKLQkJYXBwZW5kQ2hpbGQoZkxlZnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3R5bGVTaGVldExpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0eWxlU2hlZXRMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWExYmZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3R5bGVTaGVldExpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0OwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0OwotCi0vKioKLSAqIAotICovCi1jbGFzcyBTdHlsZVNoZWV0TGlzdEltcGwgZXh0ZW5kcyBBYnN0cmFjdENTU05vZGVMaXN0IGltcGxlbWVudHMgU3R5bGVTaGVldExpc3QgewotCi0JLyoqCi0JICogU3R5bGVTaGVldExpc3RJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JU3R5bGVTaGVldExpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gcmV0cmlldmUgYSBzdHlsZSBzaGVldCBieSBvcmRpbmFsIGluZGV4LiBJZiBpbmRleCBpcyBncmVhdGVyCi0JICogdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHN0eWxlIHNoZWV0cyBpbiB0aGUgbGlzdCwgdGhpcyByZXR1cm5zCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGluZGV4SW5kZXgKLQkgKiAgICAgICAgICAgIGludG8gdGhlIGNvbGxlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSBzdHlsZSBzaGVldCBhdCB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+IHBvc2l0aW9uIGluIHRoZQotCSAqICAgICAgICAgPGNvZGU+U3R5bGVTaGVldExpc3Q8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGF0Ci0JICogICAgICAgICBpcyBub3QgYSB2YWxpZCBpbmRleC4KLQkgKi8KLQlwdWJsaWMgU3R5bGVTaGVldCBpdGVtKGludCBpbmRleCkgewotCQlyZXR1cm4gKFN0eWxlU2hlZXQpIGl0ZW1JbXBsKGluZGV4KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9DU1NEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9DU1NEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWE1MWUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ1NTRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkNTU1Jlc291cmNlRW5jb2RpbmdEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZXh0ZW5kcyBDU1NSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgewotCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZ05hbWUoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIHRoZSBkb2N1bWVudCBpcyBlbXB0eSwgdGhlbiB0aGVyZSB3aWxsIGJlIG5vIG5vZGVzLAotCQkvLyBzbyBubyBuZWVkIHRvIGNvbnRpbnVlLgotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBub2RlcyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25MaXN0KCk7Ci0JCWlmIChub2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IG51bGw7Ci0JCQkvLyBza2lwIGFueSBpbml0aWFsIHdoaXRlc3BhY2UKLQkJCS8vIE5vdGUgdGhhdCBAY2hhcnNldCAiZW5jb2RpbmduYW1lIjsKLQkJCS8vIG11c3QgYXBwZWFyIGF0IHZlcnkgYmVnaW5uaW5nIG9mIGRvY3VtZW50LAotCQkJLy8gdG8gYmUgdmFsaWQuCi0JCQkvLyBNYXkgaGF2ZSB0byB0ZXN0IHdpdGggImRhbWFnZWQiIGZpbGVzIChlLmcuCi0JCQkvLyBiZWdpbm5pbmcgRU9McywgZXRjLiwgdG8gdmVyaWZ5IHRoaXMgd29ya3MKLQkJCS8vIGFzIGV4cGVjdGVkLgotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0JCQkJaWYgKGdldFR5cGUobm9kZSkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJSXRlcmF0b3IgcmVnaW9ucyA9IG5vZGUuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXROZXh0UmVnaW9uT2ZUeXBlKENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VULCByZWdpb25zKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gZ2V0TmV4dFJlZ2lvbk9mVHlwZShDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HLCByZWdpb25zKTsKLQkJCQlpZiAodmFsdWVSZWdpb24gPT0gbnVsbCkgewotCQkJCQkvLyBpZiBkaWRuJ3QgZmluZCB0aGUgcmVnaW9uLCBpdHMgcHJvYmFibHkgZHVlIHRvIGlsbAotCQkJCQkvLyBmb3JtZWQgaW5wdXQsIHN1Y2ggYXMKLQkJCQkJLy8gQGNoYXJzZXQgIklTTy04ODU5LTY7Ci0JCQkJCS8vIHNvIHdlJ2xsIHRyeSBhZ2FpbiBmb3IgInVua25vd24iIHJlZ2lvbi4KLQkJCQkJLy8gSWYgdGhhdCBmYWlscywgd2UnbGwgZ2l2ZSB1cD8KLQkJCQkJcmVnaW9ucyA9IG5vZGUuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJCXJlZ2lvbiA9IGdldE5leHRSZWdpb25PZlR5cGUoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVQsIHJlZ2lvbnMpOwotCQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCXZhbHVlUmVnaW9uID0gZ2V0TmV4dFJlZ2lvbk9mVHlwZShDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTiwgcmVnaW9ucyk7Ci0JCQkJCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCXJlc3VsdCA9IG5vZGUuZ2V0VGV4dCh2YWx1ZVJlZ2lvbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IG5vZGUuZ2V0VGV4dCh2YWx1ZVJlZ2lvbik7Ci0JCQkJfQotCQkJCXJlc3VsdCA9IFN0cmluZ1V0aWxzLnN0cmlwTm9uTGV0dGVyRGlnaXRzKHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nTmFtZShJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJU3RyaW5nIGVuYyA9IG51bGw7Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCWVuYyA9IGdldEVuY29kaW5nTmFtZSgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gVE9ETyBJbXBvcnRhbnQ6IG5lZWQgdG8gaW1wbGVtZW50IHNvbWUgInJhdyIgcGFyc2VyIGZvcgotCQkJLy8gSURvY3VtZW50IGxldmVsCi0JCX0KLQkJcmV0dXJuIGVuYzsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRUeXBlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gbm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJU3RyaW5nIHJlc3VsdCA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBnZXROZXh0UmVnaW9uT2ZUeXBlKFN0cmluZyB0eXBlLCBJdGVyYXRvciByZWdpb25zKSB7Ci0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbiByZXN1bHQgPSBudWxsOwotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSB0eXBlKSB7Ci0JCQkJcmVzdWx0ID0gcmVnaW9uOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0KLQlwdWJsaWMgdm9pZCBzZXQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXNldChuZXcgRG9jdW1lbnRSZWFkZXIoZG9jdW1lbnQsIDApKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9DU1NEb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9DU1NEb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDZmZjA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ1NTRG9jdW1lbnRMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nR3Vlc3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1NvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dC5DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBDU1NEb2N1bWVudExvYWRlciBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRMb2FkZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDU1NfSUQgPSBDb250ZW50VHlwZUlkRm9yQ1NTLkNvbnRlbnRUeXBlSURfQ1NTOwotCXByaXZhdGUgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGRvY3VtZW50RW5jb2RpbmdEZXRlY3RvcjsKLQotCi0JcHVibGljIENTU0RvY3VtZW50TG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RW5jb2RpbmdOYW1lQnlHdWVzcyhieXRlW10gc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZyBpYW5hRW5jID0gbnVsbDsKLQkJaWFuYUVuYyA9IEVuY29kaW5nR3Vlc3Nlci5ndWVzc0VuY29kaW5nKHN0cmluZywgbGVuZ3RoKTsKLQkJcmV0dXJuIGlhbmFFbmM7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBlbmNvZGluZy4gRm9yIENTUyB0aGVyZSBpcyBubyBzcGVjJ2QgZGVmYXVsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJRW5jb2RlZERvY3VtZW50IG5ld0VuY29kZWREb2N1bWVudCgpIHsKLQkJLy8gRE1XOiBJIGNvcGllZCB0aGlzIGZyb20gQ1NTTW9kZWxJbXBsZSAuLi4KLQkJLy8gYnV0IGFtIG5vdCBzdXJlIGl0cyByaWdodAotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkpOwotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciByZVBhcnNlciA9IG5ldyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpOwotCQlyZVBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KS5zZXRSZVBhcnNlcihyZVBhcnNlcik7Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCS8vIHJldHVybiBuZXcgQ1NTUmVnaW9uUGFyc2VyKCk7Ci0JCXJldHVybiBuZXcgQ1NTU291cmNlUGFyc2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKElGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIGRlbGltaXRlciA9IENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKENTU19JRCk7Ci0JCWlmIChkZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCWRlbGltaXRlciA9IHN1cGVyLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoZmlsZSk7Ci0JCXJldHVybiBkZWxpbWl0ZXI7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCWlmIChkb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPT0gbnVsbCkgewotCQkJZG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID0gbmV3IENTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50RW5jb2RpbmdEZXRlY3RvcjsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUygpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnQvSUNTU1N0eWxlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnQvSUNTU1N0eWxlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM3NzExOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50L0lDU1NTdHlsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU3R5bGVMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHN0eWxlQ2hhbmdlZChJQ1NTTW9kZWwgc3JjTW9kZWwsIElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzdHlsZVVwZGF0ZShJQ1NTTW9kZWwgc3JjTW9kZWwpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudC9JQ1NTU3R5bGVOb3RpZmllci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudC9JQ1NTU3R5bGVOb3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTQ5ZWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnQvSUNTU1N0eWxlTm90aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1N0eWxlTm90aWZpZXIgZXh0ZW5kcyBJQ1NTU3R5bGVMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGFkZFN0eWxlTGlzdGVuZXIoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogCi0JICovCi0JTGlzdCBnZXRTdHlsZUxpc3RlbmVycygpOwotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBpc1JlY29yZGluZygpOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZW1vdmVTdHlsZUxpc3RlbmVyKElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU0VtYmVkZWRTdHlsZU5vdGlmeUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU0VtYmVkZWRTdHlsZU5vdGlmeUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgwMzFiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50aW1wbC9DU1NFbWJlZGVkU3R5bGVOb3RpZnlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50aW1wbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQuSUNTU1N0eWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLQotcHVibGljIGNsYXNzIENTU0VtYmVkZWRTdHlsZU5vdGlmeUFkYXB0ZXIgZXh0ZW5kcyBDU1NTdHlsZU5vdGlmeUFkYXB0ZXIgewotCi0JLyoqCi0JICogQ1NTRW1iZWRkZWRTdHlsZU5vdGlmeUFkYXB0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NNb2RlbAotCSAqLwotCXB1YmxpYyBDU1NFbWJlZGVkU3R5bGVOb3RpZnlBZGFwdGVyKElDU1NNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc3R5bGVDaGFuZ2VkKElDU1NNb2RlbCBzcmNNb2RlbCwgSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgSUNTU1NlbGVjdG9yW10gYWRkZWQsIFN0cmluZyBtZWRpYSkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBtb2RlbC5nZXRPd25lckRPTU5vZGUoKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub2RlLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ1NTU3R5bGVMaXN0ZW5lcikgewotCQkJKChJQ1NTU3R5bGVMaXN0ZW5lcikgYWRhcHRlcikuc3R5bGVDaGFuZ2VkKHNyY01vZGVsLCByZW1vdmVkLCBhZGRlZCwgbWVkaWEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc3R5bGVVcGRhdGUoSUNTU01vZGVsIHNyY01vZGVsKSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIG1vZGVsLmdldE93bmVyRE9NTm9kZSgpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vZGUuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDU1NTdHlsZUxpc3RlbmVyKSB7Ci0JCQkoKElDU1NTdHlsZUxpc3RlbmVyKSBhZGFwdGVyKS5zdHlsZVVwZGF0ZShzcmNNb2RlbCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50aW1wbC9DU1NTdHlsZUV2ZW50RGVsaXZlcmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50aW1wbC9DU1NTdHlsZUV2ZW50RGVsaXZlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NjAxODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudGltcGwvQ1NTU3R5bGVFdmVudERlbGl2ZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnRpbXBsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQuSUNTU1N0eWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50LklDU1NTdHlsZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTU3R5bGVFdmVudERlbGl2ZXJlciB7Ci0KLQlwcml2YXRlIFZlY3RvciBmVmlzaXRlZCA9IG5ldyBWZWN0b3IoKTsKLQlwcml2YXRlIElDU1NNb2RlbCBmU3JjTW9kZWw7Ci0JcHJpdmF0ZSBJQ1NTU2VsZWN0b3JbXSBmUmVtb3ZlZDsKLQlwcml2YXRlIElDU1NTZWxlY3RvcltdIGZBZGRlZDsKLQlwcml2YXRlIFN0cmluZyBmTWVkaWE7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVFdmVudERlbGl2ZXJlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlKElDU1NNb2RlbCBzcmNNb2RlbCwgSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgSUNTU1NlbGVjdG9yW10gYWRkZWQsIFN0cmluZyBtZWRpYSkgewotCQlpZiAoc3JjTW9kZWwgPT0gbnVsbCB8fCBzcmNNb2RlbC5nZXRTdHlsZUxpc3RlbmVycygpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5mU3JjTW9kZWwgPSBzcmNNb2RlbDsKLQkJdGhpcy5mUmVtb3ZlZCA9IHJlbW92ZWQ7Ci0JCXRoaXMuZkFkZGVkID0gYWRkZWQ7Ci0JCXRoaXMuZk1lZGlhID0gbWVkaWE7Ci0KLQkJLy8gcHJvaGliaXQgZGVsaXZlcmluZyB0byBzcmNNb2RlbAotCQlmVmlzaXRlZC5jbGVhcigpOwotCQlmVmlzaXRlZC5hZGQoc3JjTW9kZWwpOwotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBzcmNNb2RlbC5nZXRTdHlsZUxpc3RlbmVycygpLnRvQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCXZpc2l0KChJQ1NTU3R5bGVMaXN0ZW5lcikgbGlzdGVuZXJzW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVUbyhJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciwgSUNTU01vZGVsIHNyY01vZGVsLCBJQ1NTU2VsZWN0b3JbXSByZW1vdmVkLCBJQ1NTU2VsZWN0b3JbXSBhZGRlZCwgU3RyaW5nIG1lZGlhKSB7Ci0JCXRoaXMuZlNyY01vZGVsID0gc3JjTW9kZWw7Ci0JCXRoaXMuZlJlbW92ZWQgPSByZW1vdmVkOwotCQl0aGlzLmZBZGRlZCA9IGFkZGVkOwotCQl0aGlzLmZNZWRpYSA9IG1lZGlhOwotCi0JCS8vIHByb2hpYml0IGRlbGl2ZXJpbmcgdG8gc3JjTW9kZWwKLQkJZlZpc2l0ZWQuY2xlYXIoKTsKLQkJLy8gdmlzaXRlZC5hZGQoc3JjTW9kZWwpOyA6IGJlY2F1c2UgbG9vcGluZyBwcm9ibGVtCi0JCXZpc2l0KGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVXBkYXRlKElDU1NNb2RlbCBzcmNNb2RlbCkgewotCQlpZiAoc3JjTW9kZWwgPT0gbnVsbCB8fCBzcmNNb2RlbC5nZXRTdHlsZUxpc3RlbmVycygpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5mU3JjTW9kZWwgPSBzcmNNb2RlbDsKLQotCQkvLyBwcm9oaWJpdCBkZWxpdmVyaW5nIHRvIHNyY01vZGVsCi0JCWZWaXNpdGVkLmNsZWFyKCk7Ci0JCWZWaXNpdGVkLmFkZChzcmNNb2RlbCk7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHNyY01vZGVsLmdldFN0eWxlTGlzdGVuZXJzKCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJdmlzaXRVcGRhdGUoKElDU1NTdHlsZUxpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVVwZGF0ZVRvKElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyLCBJQ1NTTW9kZWwgc3JjTW9kZWwpIHsKLQkJaWYgKHNyY01vZGVsID09IG51bGwgfHwgc3JjTW9kZWwuZ2V0U3R5bGVMaXN0ZW5lcnMoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRoaXMuZlNyY01vZGVsID0gc3JjTW9kZWw7Ci0KLQkJLy8gcHJvaGliaXQgZGVsaXZlcmluZyB0byBzcmNNb2RlbAotCQlmVmlzaXRlZC5jbGVhcigpOwotCQkvLyB2aXNpdGVkLmFkZChzcmNNb2RlbCk7Ci0JCXZpc2l0VXBkYXRlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdChJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCB8fCBmVmlzaXRlZC5jb250YWlucyhsaXN0ZW5lcikpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZmlyZSBldmVudCB0byBsaXN0ZW5lcgotCQlsaXN0ZW5lci5zdHlsZUNoYW5nZWQoZlNyY01vZGVsLCBmUmVtb3ZlZCwgZkFkZGVkLCBmTWVkaWEpOwotCQlmVmlzaXRlZC5hZGQobGlzdGVuZXIpOwotCi0JCS8vIHRyYXZlcnNlIG5vdGlmaWVyCi0JCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElDU1NTdHlsZU5vdGlmaWVyKSB7Ci0JCQlJQ1NTU3R5bGVOb3RpZmllciBub3RpZmllciA9IChJQ1NTU3R5bGVOb3RpZmllcikgbGlzdGVuZXI7Ci0JCQlpZiAobm90aWZpZXIuZ2V0U3R5bGVMaXN0ZW5lcnMoKSAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0W10gbGlzdGVuZXJzID0gbm90aWZpZXIuZ2V0U3R5bGVMaXN0ZW5lcnMoKS50b0FycmF5KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJdmlzaXQoKElDU1NTdHlsZUxpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0VXBkYXRlKElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsIHx8IGZWaXNpdGVkLmNvbnRhaW5zKGxpc3RlbmVyKSkKLQkJCXJldHVybjsKLQotCQkvLyBmaXJlIGV2ZW50IHRvIGxpc3RlbmVyCi0JCWxpc3RlbmVyLnN0eWxlVXBkYXRlKGZTcmNNb2RlbCk7Ci0JCWZWaXNpdGVkLmFkZChsaXN0ZW5lcik7Ci0KLQkJLy8gdHJhdmVyc2Ugbm90aWZpZXIKLQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUNTU1N0eWxlTm90aWZpZXIpIHsKLQkJCUlDU1NTdHlsZU5vdGlmaWVyIG5vdGlmaWVyID0gKElDU1NTdHlsZU5vdGlmaWVyKSBsaXN0ZW5lcjsKLQkJCWlmIChub3RpZmllci5nZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwpIHsKLQkJCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBub3RpZmllci5nZXRTdHlsZUxpc3RlbmVycygpLnRvQXJyYXkoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQl2aXNpdFVwZGF0ZSgoSUNTU1N0eWxlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudGltcGwvQ1NTU3R5bGVOb3RpZnlBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50aW1wbC9DU1NTdHlsZU5vdGlmeUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYzM2IxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50aW1wbC9DU1NTdHlsZU5vdGlmeUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50aW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudC5JQ1NTU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQuSUNTU1N0eWxlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5JbXBvcnRlZENvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5TZWxlY3RvcnNDb2xsZWN0b3I7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1N0eWxlTm90aWZ5QWRhcHRlciBpbXBsZW1lbnRzIElDU1NTdHlsZU5vdGlmaWVyIHsKLQotCXByb3RlY3RlZCBqYXZhLnV0aWwuVmVjdG9yIGxpc3RlbmVyczsKLQlwcm90ZWN0ZWQgZmluYWwgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbCBtb2RlbDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWNvcmRpbmcgPSBmYWxzZTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NTdHlsZU5vdGlmeUFkYXB0ZXIoSUNTU01vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTdHlsZUxpc3RlbmVyKElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCWxpc3RlbmVycyA9IG5ldyBWZWN0b3IoKTsKLQkJaWYgKCFsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0KLQkJCS8vIHNlbmQgbmV3IHNlbGVjdG9ycyBldmVudCB0byBsaXN0ZW5lcgotCQkJSW1wb3J0ZWRDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRlZENvbGxlY3RvcigpOwotCQkJdHJhdi5hcHBseShtb2RlbC5nZXREb2N1bWVudCgpKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdHJhdi5nZXRFeHRlcm5hbHMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlDU1NTdHlsZVNoZWV0IHNoZWV0ID0gKElDU1NTdHlsZVNoZWV0KSBpdC5uZXh0KCk7Ci0JCQkJLy8gY29sbGVjdCBzZWxlY3RvcnMKLQkJCQlTZWxlY3RvcnNDb2xsZWN0b3Igc2VsVHJhdiA9IG5ldyBTZWxlY3RvcnNDb2xsZWN0b3IoKTsKLQkJCQlzZWxUcmF2LmFwcGx5KHNoZWV0KTsKLQkJCQlpbnQgblNlbCA9IHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuc2l6ZSgpOwotCQkJCUlDU1NTZWxlY3RvcltdIGFkZGVkID0gbmV3IElDU1NTZWxlY3RvcltuU2VsXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5TZWw7IGkrKykKLQkJCQkJYWRkZWRbaV0gPSAoSUNTU1NlbGVjdG9yKSBzZWxUcmF2LmdldFNlbGVjdG9ycygpLmdldChpKTsKLQotCQkJCS8vIGZpcmUgZXZlbnQKLQkJCQlDU1NTdHlsZUV2ZW50RGVsaXZlcmVyIGRlbGl2ZXJlciA9IG5ldyBDU1NTdHlsZUV2ZW50RGVsaXZlcmVyKCk7Ci0JCQkJZGVsaXZlcmVyLmZpcmVUbyhsaXN0ZW5lciwgc2hlZXQuZ2V0TW9kZWwoKSwgbnVsbCwgYWRkZWQsIG51bGwvKgotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBtZWRpYQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiB3aWxsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGJlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGltcGxlbWVudGVkCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGluCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBmdXR1cmUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICovKTsKLQkJCX0KLQotCQkJLy8gYWRkIGxpc3RlbmVyCi0JCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKCkgewotCQlyZWNvcmRpbmcgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZygpIHsKLQkJcmVjb3JkaW5nID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZmlyZShJQ1NTU2VsZWN0b3JbXSByZW1vdmVkLCBJQ1NTU2VsZWN0b3JbXSBhZGRlZCwgU3RyaW5nIG1lZGlhKSB7Ci0JCS8vIHNlbmQgc2VsZWN0b3IgY2hhbmdlZCBldmVudAotCQlDU1NTdHlsZUV2ZW50RGVsaXZlcmVyIGRlbGl2ID0gbmV3IENTU1N0eWxlRXZlbnREZWxpdmVyZXIoKTsKLQkJZGVsaXYuZmlyZShtb2RlbCwgcmVtb3ZlZCwgYWRkZWQsIG51bGwpOwotCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldFN0eWxlTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbGlzdGVuZXJzOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVjb3JkaW5nKCkgewotCQlyZXR1cm4gcmVjb3JkaW5nOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVN0eWxlTGlzdGVuZXIoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCi0JCQkvLyBzZW5kIG9sZCBzZWxlY3RvcnMgZXZlbnQgdG8gbGlzdGVuZXIKLQkJCUltcG9ydGVkQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0ZWRDb2xsZWN0b3IoKTsKLQkJCXRyYXYuYXBwbHkobW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlJdGVyYXRvciBpdCA9IHRyYXYuZ2V0RXh0ZXJuYWxzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlJQ1NTU3R5bGVTaGVldCBzaGVldCA9IChJQ1NTU3R5bGVTaGVldCkgaXQubmV4dCgpOwotCQkJCS8vIGNvbGxlY3Qgc2VsZWN0b3JzCi0JCQkJU2VsZWN0b3JzQ29sbGVjdG9yIHNlbFRyYXYgPSBuZXcgU2VsZWN0b3JzQ29sbGVjdG9yKCk7Ci0JCQkJc2VsVHJhdi5hcHBseShzaGVldCk7Ci0JCQkJaW50IG5TZWwgPSBzZWxUcmF2LmdldFNlbGVjdG9ycygpLnNpemUoKTsKLQkJCQlJQ1NTU2VsZWN0b3JbXSByZW1vdmVkID0gbmV3IElDU1NTZWxlY3RvcltuU2VsXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5TZWw7IGkrKykKLQkJCQkJcmVtb3ZlZFtpXSA9IChJQ1NTU2VsZWN0b3IpIHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuZ2V0KGkpOwotCi0JCQkJLy8gZmlyZSBldmVudAotCQkJCUNTU1N0eWxlRXZlbnREZWxpdmVyZXIgZGVsaXZlcmVyID0gbmV3IENTU1N0eWxlRXZlbnREZWxpdmVyZXIoKTsKLQkJCQlkZWxpdmVyZXIuZmlyZVRvKGxpc3RlbmVyLCBzaGVldC5nZXRNb2RlbCgpLCByZW1vdmVkLCBudWxsLCBudWxsLyoKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogbWVkaWEKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogd2lsbAotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBiZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBpbXBsZW1lbnRlZAotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBpbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogZnV0dXJlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqLyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdHlsZUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbCBzcmNNb2RlbCwgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcltdIHJlbW92ZWQsIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JbXSBhZGRlZCwgamF2YS5sYW5nLlN0cmluZyBtZWRpYSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlVXBkYXRlKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWwgc3JjTW9kZWwpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdC9Gb3JtYXRQcm9jZXNzb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0Zvcm1hdFByb2Nlc3NvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYThmYjE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0Zvcm1hdFByb2Nlc3NvckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NGb3JtYXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBGb3JtYXRQcm9jZXNzb3JDU1MgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgewotCS8qCi0JICogTWF4IGxlbmd0aCBvZiB0ZXh0IHRvIGJlIGZvcm1hdHRlZCB0byBiZSBjb25zaWRlcmVkIGEgInNtYWxsIGNoYW5nZSIKLQkgKiBVc2VkIGZvciBkb2N1bWVudCByZXdyaXRlIHNlc3Npb24gdHlwZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBNQVhfU01BTExfRk9STUFUX1NJWkUgPSAxMDAwOwotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gImNzcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCUNTU0Zvcm1hdFV0aWwgZm9ybWF0VXRpbCA9IENTU0Zvcm1hdFV0aWwuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJLy8gQlVHMTAyODIyIHRha2UgYWR2YW50YWdlIG9mIElEb2N1bWVudEV4dGVuc2lvbjQKLQkJCUlEb2N1bWVudEV4dGVuc2lvbjQgZG9jRXh0NCA9IG51bGw7Ci0JCQlpZiAoc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpIGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uNCkgewotCQkJCWRvY0V4dDQgPSAoSURvY3VtZW50RXh0ZW5zaW9uNCkgc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJfQotCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiByZXdyaXRlU2Vzc2lvbiA9IG51bGw7Ci0KLQkJCXRyeSB7Ci0JCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUgcmV3cml0ZVR5cGUgPSAobGVuZ3RoID4gTUFYX1NNQUxMX0ZPUk1BVF9TSVpFKSA/IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRCA6IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRF9TTUFMTDsKLQkJCQlyZXdyaXRlU2Vzc2lvbiA9IChkb2NFeHQ0ID09IG51bGwgfHwgZG9jRXh0NC5nZXRBY3RpdmVSZXdyaXRlU2Vzc2lvbigpICE9IG51bGwpID8gbnVsbCA6IGRvY0V4dDQuc3RhcnRSZXdyaXRlU2Vzc2lvbihyZXdyaXRlVHlwZSk7Ci0KLQkJCQlJQ1NTRG9jdW1lbnQgZG9jID0gKChJQ1NTTW9kZWwpIHN0cnVjdHVyZWRNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0UmVnaW9uID0gCi0JCQkJCXN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRSZWdpb24gPSAKLQkJCQkJc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0ICsgbGVuZ3RoKTsKLQkJCQlzdGFydCA9IHN0YXJ0UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIoKElOb2RlTm90aWZpZXIpIGRvYyk7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IGZvcm1hdHRlci5mb3JtYXQoZG9jLCBuZXcgUmVnaW9uKHN0YXJ0LCAoZW5kUmVnaW9uLmdldEVuZCgpIC0gc3RhcnQpKSk7Ci0JCQkJaWYgKGJ1ZiAhPSBudWxsKSB7Ci0JCQkJCWZvcm1hdFV0aWwucmVwbGFjZVNvdXJjZShkb2MuZ2V0TW9kZWwoKSwgc3RhcnQsIGVuZFJlZ2lvbi5nZXRFbmQoKSAtIHN0YXJ0LCBidWYudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy8gQlVHMTAyODIyIHRha2UgYWR2YW50YWdlIG9mIElEb2N1bWVudEV4dGVuc2lvbjQKLQkJCQlpZiAoZG9jRXh0NCAhPSBudWxsICYmIHJld3JpdGVTZXNzaW9uICE9IG51bGwpCi0JCQkJCWRvY0V4dDQuc3RvcFJld3JpdGVTZXNzaW9uKHJld3JpdGVTZXNzaW9uKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCUxpc3QgY3Nzbm9kZXMgPSBmb3JtYXRVdGlsLmNvbGxlY3RDU1NOb2RlcyhzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCQkJaWYgKGNzc25vZGVzICE9IG51bGwgJiYgIWNzc25vZGVzLmlzRW1wdHkoKSkgewotCQkJCUlDU1NNb2RlbCBtb2RlbCA9IG51bGw7Ci0KLQkJCQkvLyBCVUcxMDI4MjIgdGFrZSBhZHZhbnRhZ2Ugb2YgSURvY3VtZW50RXh0ZW5zaW9uNAotCQkJCUlEb2N1bWVudEV4dGVuc2lvbjQgZG9jRXh0NCA9IG51bGw7Ci0JCQkJaWYgKHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjQpIHsKLQkJCQkJZG9jRXh0NCA9IChJRG9jdW1lbnRFeHRlbnNpb240KSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJfQotCQkJCURvY3VtZW50UmV3cml0ZVNlc3Npb24gcmV3cml0ZVNlc3Npb24gPSBudWxsOwotCi0JCQkJdHJ5IHsKLQkJCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUgcmV3cml0ZVR5cGUgPSAobGVuZ3RoID4gTUFYX1NNQUxMX0ZPUk1BVF9TSVpFKSA/IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRCA6IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRF9TTUFMTDsKLQkJCQkJcmV3cml0ZVNlc3Npb24gPSAoZG9jRXh0NCA9PSBudWxsIHx8IGRvY0V4dDQuZ2V0QWN0aXZlUmV3cml0ZVNlc3Npb24oKSAhPSBudWxsKSA/IG51bGwgOiBkb2NFeHQ0LnN0YXJ0UmV3cml0ZVNlc3Npb24ocmV3cml0ZVR5cGUpOwotCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3Nzbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCUlDU1NOb2RlIG5vZGUgPSAoSUNTU05vZGUpIGNzc25vZGVzLmdldChpKTsKLQkJCQkJCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBub2RlKTsKLQkJCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBmb3JtYXR0ZXIuZm9ybWF0KG5vZGUpOwotCQkJCQkJaWYgKGJ1ZiAhPSBudWxsKSB7Ci0JCQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJCWludCBlbmRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJCQkJCWlmIChtb2RlbCA9PSBudWxsKSB7Ci0JCQkJCQkJCW1vZGVsID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZm9ybWF0VXRpbC5yZXBsYWNlU291cmNlKG1vZGVsLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsIGJ1Zi50b1N0cmluZygpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJLy8gQlVHMTAyODIyIHRha2UgYWR2YW50YWdlIG9mIElEb2N1bWVudEV4dGVuc2lvbjQKLQkJCQkJaWYgKGRvY0V4dDQgIT0gbnVsbCAmJiByZXdyaXRlU2Vzc2lvbiAhPSBudWxsKQotCQkJCQkJZG9jRXh0NC5zdG9wUmV3cml0ZVNlc3Npb24ocmV3cml0ZVNlc3Npb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGdldEZvcm1hdFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZ2V0Rm9ybWF0dGVyKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0Fic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZWIxMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0TGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlciBpbXBsZW1lbnRzIENTU1NvdXJjZUdlbmVyYXRvciB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIHNob3J0IEdFTkVSQVRFID0gMDsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIHNob3J0IEZPUk1BVCA9IDE7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBzaG9ydCBDTEVBTlVQID0gMjsKLQlwcm90ZWN0ZWQgc3RhdGljIHNob3J0IHN0cmF0ZWd5OwotCi0JLyoqCi0JICogCi0JICovCi0JQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXBwZW5kRGVsaW1CZWZvcmUoSUNTU05vZGUgbm9kZSwgQ29tcG91bmRSZWdpb24gdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzQ2xlYW51cCgpICYmICFnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkuaXNGb3JtYXRTb3VyY2UoKSkKLQkJCXJldHVybjsgLy8gZm9yIG5vdCBmb3JtYXR0aW5nIGNhc2Ugb24gY2xlYW51cCBhY3Rpb24KLQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQotCQlib29sZWFuIG5lZWRJbmRlbnQgPSAhKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCk7Ci0JCWlmICh0b0FwcGVuZCA9PSBudWxsKSB7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCWlmIChuZWVkSW5kZW50KQotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIHR5cGUgPSB0b0FwcGVuZC5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKHRvQXBwZW5kLmdldERvY3VtZW50UmVnaW9uKCksIHRvQXBwZW5kLmdldFRleHRSZWdpb24oKSk7Ci0JCQkJaXQucHJldigpOwotCQkJCUlUZXh0UmVnaW9uIHByZXYgPSBpdC5wcmV2KCk7Ci0JCQkJaW50W10gcmVzdWx0ID0gbnVsbDsKLQkJCQlpZiAocHJldiA9PSBudWxsIHx8IChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiAocmVzdWx0ID0gVGV4dFV0aWxpdGllcy5pbmRleE9mKERlZmF1bHRMaW5lVHJhY2tlci5ERUxJTUlURVJTLCBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHByZXYpLCAwKSlbMF0gPj0gMCkpIHsKLQkJCQkJLy8gQ29sbGFwc2UgdG8gb25lIGVtcHR5IGxpbmUgaWYgdGhlcmUncyBtb3JlIHRoYW4gb25lLgotCQkJCQlpbnQgb2Zmc2V0ID0gcmVzdWx0WzBdICsgRGVmYXVsdExpbmVUcmFja2VyLkRFTElNSVRFUlNbcmVzdWx0WzFdXS5sZW5ndGgoKTsKLQkJCQkJaWYgKG9mZnNldCA8IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocHJldikubGVuZ3RoKCkgKSB7Ci0JCQkJCQlpZiAoVGV4dFV0aWxpdGllcy5pbmRleE9mKERlZmF1bHRMaW5lVHJhY2tlci5ERUxJTUlURVJTLCBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHByZXYpLCBvZmZzZXQpWzBdID49IDApIHsKLQkJCQkJCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCQlpZiAobmVlZEluZGVudCkKLQkJCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQlTdHJpbmcgZnVsbFRleHQgPSB0b0FwcGVuZC5nZXREb2N1bWVudFJlZ2lvbigpLmdldEZ1bGxUZXh0KHByZXYpOwotCQkJCQlTdHJpbmcgdHJpbW1lZFRleHQgPSB0b0FwcGVuZC5nZXREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocHJldik7Ci0JCQkJCVN0cmluZyB3aGl0ZVNwYWNlcyA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGZ1bGxUZXh0ICE9IG51bGwgJiYgdHJpbW1lZFRleHQgIT0gbnVsbCkKLQkJCQkJICAgIHdoaXRlU3BhY2VzID0gZnVsbFRleHQuc3Vic3RyaW5nKHRyaW1tZWRUZXh0Lmxlbmd0aCgpKTsKLQkJCQkJaW50W10gZGVsaW1pdGVyRm91bmQgPSBUZXh0VXRpbGl0aWVzLmluZGV4T2YoRGVmYXVsdExpbmVUcmFja2VyLkRFTElNSVRFUlMsIHdoaXRlU3BhY2VzLCAwKTsKLQkJCQkJaWYgKGRlbGltaXRlckZvdW5kWzBdICE9IC0xKSB7Ci0JCQkJCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsJCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZC5nZXRUZXh0KCksIHNvdXJjZSk7Ci0JCQkJCQkKLQkJCQkJCS8qSWYgdHdvIGNvbW1lbnRzIGNhbid0IGJlIGFkanVzdGVkIGluIG9uZSBsaW5lKGNvbWJpbmVkIGxlbmd0aCBleGNlZWRzIGxpbmUgd2lkdGgpLAotCQkJCQkJICogYSB0YWIgaXMgYWxzbyBhcHBlbmRlZCBhbG9uZyB3aXRoIG5leHQgbGluZSBkZWxpbWl0ZXIgLCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGF0LiAKLQkJCQkJCSAqLwotCQkJCQkJaWYgKHNvdXJjZS50b1N0cmluZygpLmVuZHNXaXRoKGdldEluZGVudFN0cmluZygpKSkgewotCQkJCQkJCXNvdXJjZS5kZWxldGUoKHNvdXJjZS5sZW5ndGgoKSAtIGdldEluZGVudFN0cmluZygpLmxlbmd0aCgpKSwgc291cmNlLmxlbmd0aCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQuZ2V0VGV4dCgpLCBzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcih0b0FwcGVuZC5nZXREb2N1bWVudFJlZ2lvbigpLCB0b0FwcGVuZC5nZXRUZXh0UmVnaW9uKCkpOwotCQkJCWl0LnByZXYoKTsKLQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCi0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCQkJaWYgKHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIFRleHRVdGlsaXRpZXMuaW5kZXhPZihEZWZhdWx0TGluZVRyYWNrZXIuREVMSU1JVEVSUywgaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChwcmV2KSwgMClbMF0gPj0gMCkgewotCQkJCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCQlpZiAobmVlZEluZGVudCkKLQkJCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSA+IDAgJiYgKCFwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKSB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkpIHsKLQkJCQkJaW50IGxlbmd0aCA9IGdldExhc3RMaW5lTGVuZ3RoKG5vZGUsIHNvdXJjZSk7Ci0JCQkJCWludCBhcHBlbmQgPSAxOwotCQkJCQlpZiAobGVuZ3RoICsgYXBwZW5kID4gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpIHsKLQkJCQkJCXNvdXJjZS5hcHBlbmQoZ2V0TGluZURlbGltaXRlcihub2RlKSk7Ci0JCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJCQlpZiAobmVlZEluZGVudCkKLQkJCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJaWYgKG5lZWRJbmRlbnQpCi0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXBwZW5kU3BhY2VCZWZvcmUoSUNTU05vZGUgbm9kZSwgQ29tcG91bmRSZWdpb24gdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCB0b0FwcGVuZCA9PSBudWxsIHx8IHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaXNDbGVhbnVwKCkgJiYgIWdldENsZWFudXBTdHJhdGVneShub2RlKS5pc0Zvcm1hdFNvdXJjZSgpKQotCQkJcmV0dXJuOyAvLyBmb3Igbm90IGZvcm1hdHRpbmcgY2FzZSBvbiBjbGVhbnVwIGFjdGlvbgotCQlTdHJpbmcgdHlwZSA9IHRvQXBwZW5kLmdldFR5cGUoKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJYm9vbGVhbiBuZWVkSW5kZW50ID0gIShub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpOwotCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJLy8gY2hlY2sgd2hldGhlciBwcmV2aW91cyByZWdpb24gaXMgJ1MnIGFuZCBoYXMgQ1ItTEYKLQkJCVN0cmluZyBkZWxpbSA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSk7Ci0JCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcih0b0FwcGVuZC5nZXREb2N1bWVudFJlZ2lvbigpLCB0b0FwcGVuZC5nZXRUZXh0UmVnaW9uKCkpOwotCQkJaXQucHJldigpOwotCQkJSVRleHRSZWdpb24gcHJldiA9IGl0LnByZXYoKTsKLQkJCWlmIChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBUZXh0VXRpbGl0aWVzLmluZGV4T2YoRGVmYXVsdExpbmVUcmFja2VyLkRFTElNSVRFUlMsIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocHJldiksIDApWzBdID49IDApIHsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJaWYgKG5lZWRJbmRlbnQpCi0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQuZ2V0VGV4dCgpLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSAmJiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfTkVXTElORV9PTl9PUEVOX0JSQUNFKSkgewotCQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJLy8gfSBlbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DVVJMWV9CUkFDRV9DTE9TRSkgewotCQkJLy8gfSBlbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19JTkNMVURFUyB8fCB0eXBlID09Ci0JCQkvLyBDU1NSZWdpb25Db250ZXh0cy5DU1NfREFTSE1BVENIKSB7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SICYmIG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJaW50IG4gPSBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QUkVfREVMSU0pOwotCQkJLy8gbm8gZGVsaW1pdGVyIGNhc2UKLQkJCXdoaWxlIChuLS0gPiAwKQotCQkJCXNvdXJjZS5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpIHsKLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSA+IDAgJiYgKCFwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKSB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkpIHsKLQkJCQlpbnQgbGVuZ3RoID0gZ2V0TGFzdExpbmVMZW5ndGgobm9kZSwgc291cmNlKTsKLQkJCQlpbnQgYXBwZW5kID0gMTsKLQkJCQlpZiAobGVuZ3RoICsgYXBwZW5kID4gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpIHsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRMaW5lRGVsaW1pdGVyKG5vZGUpKTsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCQlpZiAobmVlZEluZGVudCkKLQkJCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9SRUlHTl9FTEVNRU5UID09IHR5cGUgfHwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiA9PSB0eXBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxzZQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQuZ2V0VGV4dCgpLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGVuZFNwYWNlQmVmb3JlKElDU1NOb2RlIG5vZGUsIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaXNDbGVhbnVwKCkgJiYgIWdldENsZWFudXBTdHJhdGVneShub2RlKS5pc0Zvcm1hdFNvdXJjZSgpKQotCQkJcmV0dXJuOyAvLyBmb3Igbm90IGZvcm1hdHRpbmcgY2FzZSBvbiBjbGVhbnVwIGFjdGlvbgotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHRvQXBwZW5kICE9IG51bGwgJiYgdG9BcHBlbmQuc3RhcnRzV2l0aCgieyIpICYmIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19ORVdMSU5FX09OX09QRU5fQlJBQ0UpKSB7Ly8kTk9OLU5MUy0xJAotCQkJc291cmNlLmFwcGVuZChnZXRMaW5lRGVsaW1pdGVyKG5vZGUpKTsKLQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCXJldHVybjsKLQkJfQotCQllbHNlIGlmICgvKiAhIG1nci5pc09uZVByb3BlcnR5UGVyTGluZSgpICYmICovcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkgPiAwICYmICghcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUikgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpKSB7Ci0JCQlpbnQgbiA9IGdldExhc3RMaW5lTGVuZ3RoKG5vZGUsIHNvdXJjZSk7Ci0JCQlpbnQgYXBwZW5kID0gKHRvQXBwZW5kICE9IG51bGwpID8gVGV4dFV0aWxpdGllcy5pbmRleE9mKERlZmF1bHRMaW5lVHJhY2tlci5ERUxJTUlURVJTLCB0b0FwcGVuZCwgMClbMF0gOiAwOwotCQkJaWYgKHRvQXBwZW5kICE9IG51bGwpCi0JCQkJYXBwZW5kID0gKGFwcGVuZCA8IDApID8gdG9BcHBlbmQubGVuZ3RoKCkgOiBhcHBlbmQ7Ci0JCQlpZiAobiArIGFwcGVuZCArIDEgPiBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSkgewotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0TGluZURlbGltaXRlcihub2RlKSk7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzb3VyY2UuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmdCdWZmZXIgY2xlYW51cChJQ1NTTm9kZSBub2RlKSB7Ci0JCXNob3J0IG9sZFN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0JCXN0cmF0ZWd5ID0gQ0xFQU5VUDsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IGZvcm1hdFByb2Mobm9kZSk7Ci0JCXN0cmF0ZWd5ID0gb2xkU3RyYXRlZ3k7Ci0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nQnVmZmVyIGNsZWFudXAoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pIHsKLQkJc2hvcnQgb2xkU3RyYXRlZ3kgPSBzdHJhdGVneTsKLQkJc3RyYXRlZ3kgPSBDTEVBTlVQOwotCQlTdHJpbmdCdWZmZXIgc291cmNlID0gZm9ybWF0UHJvYyhub2RlLCByZWdpb24pOwotCQlzdHJhdGVneSA9IG9sZFN0cmF0ZWd5OwotCi0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWNvcmF0ZWRJZGVudFJlZ2lvbihDb21wb3VuZFJlZ2lvbiByZWdpb24sIENTU0NsZWFudXBTdHJhdGVneSBzdGd5KSB7Ci0JCWlmIChpc0Zvcm1hdCgpKQotCQkJcmV0dXJuIHJlZ2lvbi5nZXRUZXh0KCk7Ci0KLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoIXN0Z3kuaXNGb3JtYXRTb3VyY2UoKSkKLQkJCXRleHQgPSByZWdpb24uZ2V0RnVsbFRleHQoKTsKLQkJZWxzZQotCQkJdGV4dCA9IHJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQotCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VSSSkKLQkJCXJldHVybiBkZWNvcmF0ZWRSZWdpb24ocmVnaW9uLCAwLCBzdGd5KTsKLQotCQlpZiAoaXNDbGVhbnVwKCkpIHsKLQkJCWlmIChzdGd5LmdldElkZW50Q2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5BU0lTIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJcmV0dXJuIHRleHQ7Ci0JCQllbHNlIGlmIChzdGd5LmdldElkZW50Q2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5VUFBFUikKLQkJCQlyZXR1cm4gdGV4dC50b1VwcGVyQ2FzZSgpOwotCQkJZWxzZQotCQkJCXJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJcmV0dXJuIHRleHQ7Ci0JCWVsc2UgaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCXJldHVybiB0ZXh0LnRvVXBwZXJDYXNlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWNvcmF0ZWRQcm9wTmFtZVJlZ2lvbihDb21wb3VuZFJlZ2lvbiByZWdpb24sIENTU0NsZWFudXBTdHJhdGVneSBzdGd5KSB7Ci0JCWlmIChpc0Zvcm1hdCgpKQotCQkJcmV0dXJuIHJlZ2lvbi5nZXRUZXh0KCk7Ci0KLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoIXN0Z3kuaXNGb3JtYXRTb3VyY2UoKSkKLQkJCXRleHQgPSByZWdpb24uZ2V0RnVsbFRleHQoKTsKLQkJZWxzZQotCQkJdGV4dCA9IHJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQotCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VSSSkKLQkJCXJldHVybiBkZWNvcmF0ZWRSZWdpb24ocmVnaW9uLCAxLCBzdGd5KTsKLQkJaWYgKGlzQ2xlYW51cCgpKSB7Ci0JCQlpZiAoc3RneS5nZXRQcm9wTmFtZUNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuQVNJUyB8fCByZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSkKLQkJCQlyZXR1cm4gdGV4dDsKLQkJCWVsc2UgaWYgKHN0Z3kuZ2V0UHJvcE5hbWVDYXNlKCkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKQotCQkJCXJldHVybiB0ZXh0LnRvVXBwZXJDYXNlKCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHRleHQudG9Mb3dlckNhc2UoKTsKLQkJfQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZKQotCQkJcmV0dXJuIHRleHQ7Ci0JCWVsc2UgaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCXJldHVybiB0ZXh0LnRvVXBwZXJDYXNlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24oQ29tcG91bmRSZWdpb24gcmVnaW9uLCBDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSkgewotCQlpZiAoaXNGb3JtYXQoKSkKLQkJCXJldHVybiByZWdpb24uZ2V0VGV4dCgpOwotCi0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKCFzdGd5LmlzRm9ybWF0U291cmNlKCkpCi0JCQl0ZXh0ID0gcmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0JCWVsc2UKLQkJCXRleHQgPSByZWdpb24uZ2V0VGV4dCgpOwotCQkKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VSSSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkpCi0JCQlyZXR1cm4gZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbiwgMiwgc3RneSk7Ci0JCWlmIChpc0NsZWFudXAoKSkgewotCQkJaWYgKHN0Z3kuZ2V0UHJvcFZhbHVlQ2FzZSgpICE9IENTU0NsZWFudXBTdHJhdGVneS5BU0lTKSB7Ci0JCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChzdGd5LmdldFByb3BWYWx1ZUNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJCQl0ZXh0ID0gdGV4dC50b1VwcGVyQ2FzZSgpOwotCQkJCQllbHNlCi0JCQkJCQl0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29yYXRlZFJlZ2lvbihDb21wb3VuZFJlZ2lvbiByZWdpb24sIGludCB0eXBlLCBDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSkgewotCQlpZiAoaXNGb3JtYXQoKSkKLQkJCXJldHVybiByZWdpb24uZ2V0VGV4dCgpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmICghc3RneS5pc0Zvcm1hdFNvdXJjZSgpKQotCQkJdGV4dCA9IHJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQllbHNlCi0JCQl0ZXh0ID0gcmVnaW9uLmdldFRleHQoKTsKLQkJCi0JCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VSSSB8fCByZWdpb25UeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkpIHsKLQkJCVN0cmluZyB1cmkgPSBDU1NMaW5rQ29udmVydGVyLnN0cmlwRnVuYyh0ZXh0KTsKLQotCQkJYm9vbGVhbiBwcmVmSXNVcHBlciA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUjsKLQkJCWJvb2xlYW4gdXBwZXIgPSAodHlwZSA9PSAwKSA/IHByZWZJc1VwcGVyIDogKCh0eXBlID09IDEpID8gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSIDogcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCQlTdHJpbmcgZnVuYyA9IHRleHQuc3Vic3RyaW5nKDAsIDQpOwotCQkJaWYgKGlzQ2xlYW51cCgpKSB7Ci0JCQkJdXBwZXIgPSAoKHR5cGUgPT0gMCkgPyBzdGd5LmdldElkZW50Q2FzZSgpIDogKCh0eXBlID09IDEpID8gc3RneS5nZXRQcm9wTmFtZUNhc2UoKSA6IHN0Z3kuZ2V0UHJvcFZhbHVlQ2FzZSgpKSkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSOwotCQkJCWZ1bmMgPSAoKHR5cGUgPT0gMCkgPyBzdGd5LmdldElkZW50Q2FzZSgpIDogKCh0eXBlID09IDEpID8gc3RneS5nZXRQcm9wTmFtZUNhc2UoKSA6IHN0Z3kuZ2V0UHJvcFZhbHVlQ2FzZSgpKSkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LkFTSVMgPyB0ZXh0LnN1YnN0cmluZygwLCA0KSA6ICh1cHBlciA/ICJVUkwoIiA6ICJ1cmwoIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICgoIWlzQ2xlYW51cCgpICYmIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEVfSU5fVVJJKSkgfHwgKGlzQ2xlYW51cCgpICYmIHN0Z3kuaXNRdW90ZVZhbHVlcygpKSkgewotCQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHVyaSwgcXVvdGUpOwotCQkJCXRleHQgPSBmdW5jICsgcXVvdGUgKyB1cmkgKyBxdW90ZSArICIpIjsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmIChpc0NsZWFudXAoKSAmJiAhc3RneS5pc1F1b3RlVmFsdWVzKCkpIHsKLQkJCQl0ZXh0ID0gZnVuYyArIENTU0xpbmtDb252ZXJ0ZXIucmVtb3ZlRnVuYyh0ZXh0KSArICIpIjsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0ZXh0ID0gZnVuYyArIHVyaSArICIpIjsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HICYmICghaXNDbGVhbnVwKCkgfHwgc3RneS5pc1F1b3RlVmFsdWVzKCkpKSB7Ci0JCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQkJLy8gYmVnZ2lubmluZwotCQkJaWYgKCF0ZXh0LnN0YXJ0c1dpdGgocXVvdGUpKSB7Ci0JCQkJaWYgKHRleHQuc3RhcnRzV2l0aCgiXCIiKSB8fCB0ZXh0LnN0YXJ0c1dpdGgoIlwnIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl0ZXh0ID0gcXVvdGUgKyB0ZXh0LnN1YnN0cmluZygxKTsKLQkJCQllbHNlCi0JCQkJCXRleHQgPSBxdW90ZSArIHRleHQ7Ci0JCQl9Ci0JCQkvLyBlbmRpbmcKLQkJCWlmICghdGV4dC5lbmRzV2l0aChxdW90ZSkpIHsKLQkJCQlpZiAodGV4dC5lbmRzV2l0aCgiXCIiKSB8fCB0ZXh0LmVuZHNXaXRoKCJcJyIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHRleHQubGVuZ3RoKCkgLSAxKSArIHF1b3RlOwotCQkJCWVsc2UKLQkJCQkJdGV4dCA9IHRleHQgKyBxdW90ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nQnVmZmVyIGZvcm1hdChJQ1NTTm9kZSBub2RlKSB7Ci0JCXNob3J0IG9sZFN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0JCXN0cmF0ZWd5ID0gRk9STUFUOwotCQlTdHJpbmdCdWZmZXIgc291cmNlID0gZm9ybWF0UHJvYyhub2RlKTsKLQkJc3RyYXRlZ3kgPSBvbGRTdHJhdGVneTsKLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmdCdWZmZXIgZm9ybWF0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKSB7Ci0JCXNob3J0IG9sZFN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0JCXN0cmF0ZWd5ID0gRk9STUFUOwotCQlTdHJpbmdCdWZmZXIgc291cmNlID0gZm9ybWF0UHJvYyhub2RlLCByZWdpb24pOwotCQlzdHJhdGVneSA9IG9sZFN0cmF0ZWd5OwotCi0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcihpbnNlcnQgJiYgKGF0dHIgIT0gbnVsbCkgPyBhdHRyLmdldFZhbHVlKCkgOiAiIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlIG9yIGZvcm1hdCBzb3VyY2UgYmV0d2VlbiBjaGlsZHJlbignY2hpbGQnIGFuZCBpdHMgcHJldmlvdXMKLQkgKiBzaWJsaW5nKSBhbmQgYXBwZW5kIHRvIHN0cmluZyBidWZmZXIKLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSwgSVJlZ2lvbiBleGNlcHRGb3IpOwotCi0JLyoqCi0JICogR2VuZXJhdGUgb3IgZm9ybWF0IHNvdXJjZSBiZXR3ZWVuIGNoaWxkcmVuKCdjaGlsZCcgYW5kIGl0cyBwcmV2aW91cwotCSAqIHNpYmxpbmcpIGFuZCBhcHBlbmQgdG8gc3RyaW5nIGJ1ZmZlcgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmdCdWZmZXIgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIGV4Y2VwdEZvcikgewotCQlBc3NlcnQuaXNUcnVlKGNoaWxkID09IG51bGwgfHwgY2hpbGQuZ2V0UGFyZW50Tm9kZSgpID09IG5vZGUpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3JtYXRCZWZvcmUobm9kZSwgY2hpbGQsIC8qIChjaGlsZCAhPSBudWxsKSA/IChjaGlsZC5nZXRDc3NUZXh0KCkpIDogKi8iIiwgYnVmLCBleGNlcHRGb3IpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1ZjsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBvciBmb3JtYXQgc291cmNlIGJldHdlZW4gY2hpbGRyZW4oJ2NoaWxkJyBhbmQgaXRzIHByZXZpb3VzCi0JICogc2libGluZykgYW5kIGFwcGVuZCB0byBzdHJpbmcgYnVmZmVyCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZvcm1hdENoaWxkcmVuKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJSUNTU05vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkvLyBhcHBlbmQgY2hpbGQKLQkJCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSAoQ1NTU291cmNlRm9ybWF0dGVyKSAoKElOb2RlTm90aWZpZXIpIGNoaWxkKS5nZXRBZGFwdGVyRm9yKENTU1NvdXJjZUZvcm1hdHRlci5jbGFzcyk7Ci0JCQlpZiAoZm9ybWF0dGVyID09IG51bGwpIHsKLQkJCQlmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBjaGlsZCk7Ci0JCQl9Ci0JCQlTdHJpbmdCdWZmZXIgY2hpbGRTb3VyY2UgPSAoKEFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyKSBmb3JtYXR0ZXIpLmZvcm1hdFByb2MoY2hpbGQpOwotCQkJaWYgKCFmaXJzdCkgewotCQkJCWZvcm1hdEJlZm9yZShub2RlLCBjaGlsZCwgbmV3IFN0cmluZyhjaGlsZFNvdXJjZSksIHNvdXJjZSwgbnVsbCk7Ci0JCQl9Ci0JCQlzb3VyY2UuYXBwZW5kKGNoaWxkU291cmNlKTsKLQkJCS8vIGFwcGVuZCBiZXR3ZWVuIGNoaWxkcmVuCi0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlmaXJzdCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZm9ybWF0Q2hpbGRyZW4oSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJSUNTU05vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJaW50IHN0YXJ0ID0gcmVnaW9uLmdldE9mZnNldCgpOwotCQlpbnQgZW5kID0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpOwotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWludCBjdXJFbmQgPSAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRFbmRPZmZzZXQoKTsKLQkJCVN0cmluZ0J1ZmZlciBjaGlsZFNvdXJjZSA9IG51bGw7Ci0JCQlib29sZWFuIHRvRmluaXNoID0gZmFsc2U7Ci0JCQlpZiAoc3RhcnQgPCBjdXJFbmQpIHsKLQkJCQlpbnQgY3VyU3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCWlmIChjdXJTdGFydCA8IGVuZCkgewotCQkJCQkvLyBhcHBlbmQgY2hpbGQKLQkJCQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IChDU1NTb3VyY2VGb3JtYXR0ZXIpICgoSU5vZGVOb3RpZmllcikgY2hpbGQpLmdldEFkYXB0ZXJGb3IoQ1NTU291cmNlRm9ybWF0dGVyLmNsYXNzKTsKLQkJCQkJaWYgKGZvcm1hdHRlciA9PSBudWxsKSB7Ci0JCQkJCQlmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGluY2x1ZGVzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpCi0JCQkJCQljaGlsZFNvdXJjZSA9ICgoQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIpIGZvcm1hdHRlcikuZm9ybWF0UHJvYyhjaGlsZCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNoaWxkU291cmNlID0gKChBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlcikgZm9ybWF0dGVyKS5mb3JtYXRQcm9jKGNoaWxkLCBvdmVybGFwcGVkUmVnaW9uKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXRvRmluaXNoID0gdHJ1ZTsKLQkJCX0KLQkJCS8vIGFwcGVuZCBiZXR3ZWVuIGNoaWxkcmVuCi0JCQlpZiAoIWZpcnN0KSB7Ci0JCQkJY3VyRW5kID0gKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKTsgLy8gY2hhbmdlCi0JCQkJLy8gb25seQotCQkJCS8vIHN0YXJ0Ci0JCQkJaWYgKHN0YXJ0IDwgY3VyRW5kKSB7Ci0JCQkJCWludCBjdXJTdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkpLmdldEVuZE9mZnNldCgpOwotCQkJCQlpZiAoY3VyU3RhcnQgPCBlbmQpIHsKLQkJCQkJCVN0cmluZyB0b0FwcGVuZCA9IChjaGlsZFNvdXJjZSAhPSBudWxsKSA/IG5ldyBTdHJpbmcoY2hpbGRTb3VyY2UpIDogIiI7Ly8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKGluY2x1ZGVzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpCi0JCQkJCQkJZm9ybWF0QmVmb3JlKG5vZGUsIGNoaWxkLCB0b0FwcGVuZCwgc291cmNlLCBudWxsKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlmb3JtYXRCZWZvcmUobm9kZSwgY2hpbGQsIG92ZXJsYXBwZWRSZWdpb24ocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY2hpbGRTb3VyY2UgIT0gbnVsbCkgewotCQkJCXNvdXJjZS5hcHBlbmQoY2hpbGRTb3VyY2UpOwotCQkJfQotCQkJZmlyc3QgPSBmYWxzZTsKLQkJCWlmICh0b0ZpbmlzaCkKLQkJCQlicmVhazsKLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlIG9yIGZvcm1hdCBzb3VyY2UgYWZ0ZXIgdGhlIGxhc3QgY2hpbGQgYW5kIGFwcGVuZCB0byBzdHJpbmcKLQkgKiBidWZmZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpOwotCi0JLyoqCi0JICogR2VuZXJhdGUgb3IgZm9ybWF0IHNvdXJjZSBhZnRlciB0aGUgbGFzdCBjaGlsZCBhbmQgYXBwZW5kIHRvIHN0cmluZwotCSAqIGJ1ZmZlcgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpOwotCi0JLyoqCi0JICogR2VuZXJhdGUgb3IgZm9ybWF0IHNvdXJjZSBiZWZvcmUgdGhlIGZpcnN0IGNoaWxkIGFuZCBhcHBlbmQgdG8gc3RyaW5nCi0JICogYnVmZmVyCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpOwotCi0JLyoqCi0JICogR2VuZXJhdGUgb3IgZm9ybWF0IHNvdXJjZSBiZWZvcmUgdGhlIGZpcnN0IGNoaWxkIGFuZCBhcHBlbmQgdG8gc3RyaW5nCi0JICogYnVmZmVyCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdCdWZmZXIgZm9ybWF0UHJvYyhJQ1NTTm9kZSBub2RlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvcm1hdFByZShub2RlLCBzb3VyY2UpOwotCQlmb3JtYXRDaGlsZHJlbihub2RlLCBzb3VyY2UpOwotCQlmb3JtYXRQb3N0KG5vZGUsIHNvdXJjZSk7Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ0J1ZmZlciBmb3JtYXRQcm9jKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBjdXJTdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGN1ckVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChub2RlLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCWN1ckVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpZiAob3ZlcmxhcHMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkgewotCQkJCWlmIChpbmNsdWRlcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKQotCQkJCQlmb3JtYXRQcmUobm9kZSwgc291cmNlKTsKLQkJCQllbHNlCi0JCQkJCWZvcm1hdFByZShub2RlLCBvdmVybGFwcGVkUmVnaW9uKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCksIHNvdXJjZSk7Ci0JCQl9Ci0JCQljdXJTdGFydCA9IGN1ckVuZDsKLQkJCWN1ckVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAob3ZlcmxhcHMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkgewotCQkJCWlmIChpbmNsdWRlcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKQotCQkJCQlmb3JtYXRDaGlsZHJlbihub2RlLCBzb3VyY2UpOwotCQkJCWVsc2UKLQkJCQkJZm9ybWF0Q2hpbGRyZW4obm9kZSwgb3ZlcmxhcHBlZFJlZ2lvbihyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpLCBzb3VyY2UpOwotCQkJfQotCQkJY3VyU3RhcnQgPSBjdXJFbmQ7Ci0JCQljdXJFbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKG92ZXJsYXBzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpIHsKLQkJCQlpZiAoaW5jbHVkZXMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkKLQkJCQkJZm9ybWF0UG9zdChub2RlLCBzb3VyY2UpOwotCQkJCWVsc2UKLQkJCQkJZm9ybWF0UG9zdChub2RlLCBvdmVybGFwcGVkUmVnaW9uKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCksIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQljdXJFbmQgPSBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJCWlmIChvdmVybGFwcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKSB7Ci0JCQkJaWYgKGluY2x1ZGVzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpCi0JCQkJCWZvcm1hdFByZShub2RlLCBzb3VyY2UpOwotCQkJCWVsc2UKLQkJCQkJZm9ybWF0UHJlKG5vZGUsIG92ZXJsYXBwZWRSZWdpb24ocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSwgc291cmNlKTsKLQkJCX0KLQkJCWN1clN0YXJ0ID0gY3VyRW5kOwotCQkJY3VyRW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChvdmVybGFwcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKSB7Ci0JCQkJaWYgKGluY2x1ZGVzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpCi0JCQkJCWZvcm1hdFBvc3Qobm9kZSwgc291cmNlKTsKLQkJCQllbHNlCi0JCQkJCWZvcm1hdFBvc3Qobm9kZSwgb3ZlcmxhcHBlZFJlZ2lvbihyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0JcHJvdGVjdGVkIENTU0NsZWFudXBTdHJhdGVneSBnZXRDbGVhbnVwU3RyYXRlZ3koSUNTU05vZGUgbm9kZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgY3VycmVudFN0cmF0ZWd5ID0gQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbC5nZXRJbnN0YW5jZSgpOwotCQlJQ1NTRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybiBjdXJyZW50U3RyYXRlZ3k7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGRvYy5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBjdXJyZW50U3RyYXRlZ3k7Ci0JCWlmIChtb2RlbC5nZXRTdHlsZVNoZWV0VHlwZSgpICE9IElDU1NNb2RlbC5FWFRFUk5BTCkgewotCQkJLy8gVE9ETyAtIFRSQU5TSVRJT04gTmFrYW1vcmktc2FuLCBvciBLaXQsIGhvdyBjYW4gd2UgbW92ZSB0bwotCQkJLy8gIkhUTUwiIHBsdWdpbj8KLQkJCS8vIGNhbiB3ZSBzdWJjbGFzcz8KLQkJCS8vIGN1cnJlbnRTdHJhdGVneSA9IENTU0luSFRNTENsZWFudXBTdHJhdGVneUltcGwuZ2V0SW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gY3VycmVudFN0cmF0ZWd5OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5kZW50KElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCUlDU1NOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NBdHRyKQotCQkJcGFyZW50ID0gKChJQ1NTQXR0cikgbm9kZSkuZ2V0T3duZXJDU1NOb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCWlmIChub2RlIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb24pCi0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBwYXJlbnRJbmRlbnQgPSBnZXRJbmRlbnQocGFyZW50KTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlKQotCQkJcmV0dXJuIHBhcmVudEluZGVudCArIGdldEluZGVudFN0cmluZygpOwotCQlpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbikKLQkJCXJldHVybiBwYXJlbnRJbmRlbnQgKyBnZXRJbmRlbnRTdHJpbmcoKTsKLQkJcmV0dXJuIHBhcmVudEluZGVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldExhc3RMaW5lTGVuZ3RoKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCQlTdHJpbmcgc3RyID0gbmV3IFN0cmluZyhzb3VyY2UpOwotCQlpbnQgbiA9IHN0ci5sYXN0SW5kZXhPZihkZWxpbSk7Ci0JCWlmIChuIDwgMCkKLQkJCXJldHVybiBzdHIubGVuZ3RoKCk7Ci0KLQkJcmV0dXJuIHN0ci5sZW5ndGgoKSAtIG4gLSBkZWxpbS5sZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJbmRleGVkUmVnaW9uIG5ub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpbnNlcnRQb3MgPCAwIHx8ICFubm9kZS5jb250YWlucyhpbnNlcnRQb3MpKQotCQkJcmV0dXJuIDA7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5zZXJ0UG9zKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5zZXJ0UG9zKTsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXJlZ2lvbiA9IGl0Lm5leHQoKTsKLQkJCS8vIGlmIChyZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmCi0JCQkvLyByZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgJiYKLQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgIT0KLQkJCS8vIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWludCBwb3MgPSAoZm91bmQgPyBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pIDogaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pKSAtIGluc2VydFBvczsKLQkJcmV0dXJuIChwb3MgPj0gMCkgPyBwb3MgOiAwOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJbmRleGVkUmVnaW9uIG5ub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpbnNlcnRQb3MgPD0gMCB8fCAhbm5vZGUuY29udGFpbnMoaW5zZXJ0UG9zIC0gMSkpCi0JCQlyZXR1cm4gMDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRQb3MgLSAxKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5zZXJ0UG9zIC0gMSk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQlyZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQkvLyBpZiAocmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJgotCQkJLy8gcmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSICYmCi0JCQkvLyByZWdpb24uZ2V0VHlwZSgpICE9Ci0JCQkvLyBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpbnQgcG9zID0gaW5zZXJ0UG9zIC0gKGZvdW5kID8gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pIDogaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSk7Ci0JCS8vIGZsYXROb2RlID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCS8vIGlmIChmb3VuZCkgewotCQkvLyBpZiAocmVnaW9uLmdldExlbmd0aCgpICE9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpIHsKLQkJLy8gcG9zID0gaW5zZXJ0UG9zIC0gZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pOwotCQkvLyB9IGVsc2UgewotCQkvLyBwb3MgPSBpbnNlcnRQb3MgLSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJLy8gfQotCQkvLyB9IGVsc2UgewotCQkvLyBwb3MgPSBpbnNlcnRQb3MgLSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkvLyB9Ci0JCXJldHVybiAocG9zID49IDApID8gcG9zIDogMDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0TGluZURlbGltaXRlcihJQ1NTTm9kZSBub2RlKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IChub2RlICE9IG51bGwpID8gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSA6IG51bGw7Ci0JCXJldHVybiAobW9kZWwgIT0gbnVsbCkgPyBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lRGVsaW1pdGVyKCkgOiAiXG4iOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gVE9ETyA6IGNoZWNrIHdoZXRoZXIgdG8gdXNlIG1vZGVsLmdldExpbmVEZWxpbWl0ZXIoKSBvcgotCQkvLyBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lRGVsaW1pdGVyKCkKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRSZWdpb25bXSBnZXRPdXRzaWRlUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50IG1vZGVsLCBJUmVnaW9uIHJlZykgewotCQlDb21wb3VuZFJlZ2lvbltdIHJldCA9IG5ldyBDb21wb3VuZFJlZ2lvblsyXTsKLQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IobW9kZWwsIHJlZy5nZXRPZmZzZXQoKSk7Ci0JCWl0LnByZXYoKTsKLQkJaWYgKGl0Lmhhc1ByZXYoKSkgewotCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IGl0LnByZXYoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCXJldFswXSA9IG5ldyBDb21wb3VuZFJlZ2lvbihkb2N1bWVudFJlZ2lvbiwgdGV4dFJlZ2lvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXRbMF0gPSBudWxsOwotCQl9Ci0JCWl0LnJlc2V0KG1vZGVsLCByZWcuZ2V0T2Zmc2V0KCkgKyByZWcuZ2V0TGVuZ3RoKCkpOwotCQlpZiAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gaXQubmV4dCgpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJcmV0WzFdID0gbmV3IENvbXBvdW5kUmVnaW9uKGRvY3VtZW50UmVnaW9uLCB0ZXh0UmVnaW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldFsxXSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTU291cmNlR2VuZXJhdG9yIGdldFBhcmVudEZvcm1hdHRlcihJQ1NTTm9kZSBub2RlKSB7Ci0JCUlDU1NOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSAoQ1NTU291cmNlR2VuZXJhdG9yKSAoKElOb2RlTm90aWZpZXIpIHBhcmVudCkuZ2V0QWRhcHRlckZvcihDU1NTb3VyY2VGb3JtYXR0ZXIuY2xhc3MpOwotCQkJaWYgKGZvcm1hdHRlciA9PSBudWxsKSB7Ci0JCQkJZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgcGFyZW50KTsKLQkJCX0KLQkJCXJldHVybiBmb3JtYXR0ZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIENvbXBvdW5kUmVnaW9uW10gZ2V0UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50IG1vZGVsLCBJUmVnaW9uIHJlZywgSVJlZ2lvbiBleGNlcHRGb3IsIFN0cmluZyBwaWNrdXBUeXBlKSB7Ci0JCWludCBzdGFydCA9IHJlZy5nZXRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IHJlZy5nZXRPZmZzZXQoKSArIHJlZy5nZXRMZW5ndGgoKTsKLQkJaW50IHN0YXJ0RSA9IChleGNlcHRGb3IgIT0gbnVsbCkgPyBleGNlcHRGb3IuZ2V0T2Zmc2V0KCkgOiAtMTsKLQkJaW50IGVuZEUgPSAoZXhjZXB0Rm9yICE9IG51bGwpID8gZXhjZXB0Rm9yLmdldE9mZnNldCgpICsgZXhjZXB0Rm9yLmdldExlbmd0aCgpIDogMDsKLQotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG1vZGVsLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0KTsKLQkJYm9vbGVhbiBwaWNrdXBlZCA9IGZhbHNlOwotCQl3aGlsZSAoZmxhdE5vZGUgIT0gbnVsbCAmJiBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpIDwgZW5kKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCUl0ZXJhdG9yIGl0ID0gcmVnaW9uTGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaXQubmV4dCgpOwotCQkJCWlmIChmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pIDwgc3RhcnQpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChlbmQgPD0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSkKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKHN0YXJ0RSA+PSAwICYmIHN0YXJ0RSA8PSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pICYmIGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pIDw9IGVuZEUpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQyB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DRE8pCi0JCQkJCWxpc3QuYWRkKG5ldyBDb21wb3VuZFJlZ2lvbihmbGF0Tm9kZSwgcmVnaW9uKSk7Ci0JCQkJZWxzZSBpZiAoIXBpY2t1cGVkICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gcGlja3VwVHlwZSkgewotCQkJCQlsaXN0LmFkZChuZXcgQ29tcG91bmRSZWdpb24oZmxhdE5vZGUsIHJlZ2lvbikpOwotCQkJCQlwaWNrdXBlZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJZmxhdE5vZGUgPSBmbGF0Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKGxpc3Quc2l6ZSgpID4gMCkgewotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbmV3IENvbXBvdW5kUmVnaW9uW2xpc3Quc2l6ZSgpXTsKLQkJCWxpc3QudG9BcnJheShyZWdpb25zKTsKLQkJCXJldHVybiByZWdpb25zOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tcG91bmRSZWdpb25bMF07Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIENvbXBvdW5kUmVnaW9uW10gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhJU3RydWN0dXJlZERvY3VtZW50IG1vZGVsLCBJUmVnaW9uIHJlZywgQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kpIHsKLQkJaW50IHN0YXJ0ID0gcmVnLmdldE9mZnNldCgpOwotCQlpbnQgZW5kID0gcmVnLmdldE9mZnNldCgpICsgcmVnLmdldExlbmd0aCgpIC0gMTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBtb2RlbC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCXdoaWxlIChmbGF0Tm9kZSAhPSBudWxsICYmIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPD0gZW5kKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCUl0ZXJhdG9yIGl0ID0gcmVnaW9uTGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaXQubmV4dCgpOwotCQkJCWlmIChmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pIDwgc3RhcnQpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChlbmQgPCBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pKQotCQkJCQlicmVhazsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCAoaXNDbGVhbnVwKCkgJiYgIXN0Z3kuaXNGb3JtYXRTb3VyY2UoKSkpIC8vIGZvcgotCQkJCQkvLyBub3QKLQkJCQkJLy8gZm9ybWF0dGluZwotCQkJCQkvLyBjYXNlCi0JCQkJCS8vIG9uCi0JCQkJCS8vIGNsZWFudXAKLQkJCQkJLy8gYWN0aW9uCi0JCQkJCWxpc3QuYWRkKG5ldyBDb21wb3VuZFJlZ2lvbihmbGF0Tm9kZSwgcmVnaW9uKSk7Ci0JCQl9Ci0JCQlmbGF0Tm9kZSA9IGZsYXROb2RlLmdldE5leHQoKTsKLQkJfQotCQlpZiAobGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBuZXcgQ29tcG91bmRSZWdpb25bbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHJlZ2lvbnMpOwotCQkJcmV0dXJuIHJlZ2lvbnM7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21wb3VuZFJlZ2lvblswXTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5jbHVkZXMoSVJlZ2lvbiByZWdpb24sIGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIChyZWdpb24uZ2V0T2Zmc2V0KCkgPD0gc3RhcnQpICYmIChlbmQgPD0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNDbGVhbnVwKCkgewotCQlyZXR1cm4gc3RyYXRlZ3kgPT0gQ0xFQU5VUDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNGb3JtYXQoKSB7Ci0JCXJldHVybiBzdHJhdGVneSA9PSBGT1JNQVQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmNsdWRlc1ByZUVuZChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA9PSAocmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHByb3RlY3RlZCBib29sZWFuIG5lZWRTKENvbXBvdW5kUmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJlZ2lvbiBvdmVybGFwcGVkUmVnaW9uKElSZWdpb24gcmVnaW9uLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaWYgKG92ZXJsYXBzKHJlZ2lvbiwgc3RhcnQsIGVuZCkpIHsKLQkJCWludCBvZmZzZXQgPSAocmVnaW9uLmdldE9mZnNldCgpIDw9IHN0YXJ0KSA/IHN0YXJ0IDogcmVnaW9uLmdldE9mZnNldCgpOwotCQkJaW50IGxlbmd0aCA9ICgoZW5kIDw9IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkgPyBlbmQgOiByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpIC0gb2Zmc2V0OwotCQkJcmV0dXJuIG5ldyBGb3JtYXRSZWdpb24ob2Zmc2V0LCBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvdmVybGFwcyhJUmVnaW9uIHJlZ2lvbiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gKHN0YXJ0IDwgcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSAmJiAocmVnaW9uLmdldE9mZnNldCgpIDwgZW5kKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnRTdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCQlpZiAoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGluZGVudENoYXJQcmVmKSkgewotCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJfQotCQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRlbnQudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQXR0ckNoYW5nZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0F0dHJDaGFuZ2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNGE3M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQXR0ckNoYW5nZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyQ2hhbmdlQ29udGV4dCB7Ci0KLQlwdWJsaWMgaW50IHN0YXJ0LCBlbmQ7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQXR0ckNoYW5nZUNvbnRleHQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXN0YXJ0ID0gZW5kID0gMDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQXR0ckZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQXR0ckZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDFhOWQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0F0dHJGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NDaGFyc2V0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQXR0ckZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgQXR0ckZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCUF0dHJGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZTsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCi0JCQlpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NTdHlsZVJ1bGUuU0VMRUNUT1IpIHx8IGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTUGFnZVJ1bGUuU0VMRUNUT1IpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICE9IDApCi0JCQkJCQlhcHBlbmRTcGFjZUJldHdlZW4obm9kZSwgcmVnaW9uc1tpIC0gMV0sIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU0ltcG9ydFJ1bGUuSFJFRikpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgIT0gMCkKLQkJCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU0NoYXJzZXRSdWxlLkVOQ09ESU5HKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwKQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NTdHlsZURlY2xJdGVtLklNUE9SVEFOVCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgIT0gMCkKLQkJCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyLmdldE5hbWUoKSA9PSBudWxsIHx8IGF0dHIuZ2V0TmFtZSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgIT0gMCkKLQkJCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGNvdW50ZXIgYXR0cmlidXRlcwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwKQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQkKLQkJCVN0cmluZyB2YWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCXZhbHVlID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTU3R5bGVSdWxlLlNFTEVDVE9SKSB8fCBhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU1BhZ2VSdWxlLlNFTEVDVE9SKSkgewotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NJbXBvcnRSdWxlLkhSRUYpKSB7Ci0JCQkJU3RyaW5nIHVyaSA9IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU0xpbmtDb252ZXJ0ZXIuc3RyaXBGdW5jKHZhbHVlKTsKLQkJCQlTdHJpbmcgZnVuYyA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIgPyAiVVJMKCIgOiAidXJsKCI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URV9JTl9VUkkpKSB7Ci0JCQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZSh1cmksIHF1b3RlKTsKLQkJCQkJdmFsdWUgPSBmdW5jICsgcXVvdGUgKyB1cmkgKyBxdW90ZSArICIpIjsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl2YWx1ZSA9IGZ1bmMgKyB1cmkgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTQ2hhcnNldFJ1bGUuRU5DT0RJTkcpKSB7Ci0JCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJCQlpZiAoIXZhbHVlLnN0YXJ0c1dpdGgoIlwiIikgJiYgIXZhbHVlLnN0YXJ0c1dpdGgoIlwnIikpLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSBxdW90ZSArIHZhbHVlOwotCQkJCWlmICghdmFsdWUuZW5kc1dpdGgoIlwiIikgJiYgIXZhbHVlLmVuZHNXaXRoKCJcJyIpKS8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCXZhbHVlID0gdmFsdWUgKyBxdW90ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTU3R5bGVEZWNsSXRlbS5JTVBPUlRBTlQpKSB7Ci0JCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJCXZhbHVlID0gdmFsdWUudG9VcHBlckNhc2UoKTsKLQkJCQllbHNlCi0JCQkJCXZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHIuZ2V0TmFtZSgpID09IG51bGwgfHwgYXR0ci5nZXROYW1lKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWlmIChDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQkJdmFsdWUgPSB2YWx1ZS50b1VwcGVyQ2FzZSgpOwotCQkJCWVsc2UKLQkJCQkJdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJCXZhbHVlID0gdmFsdWUudG9VcHBlckNhc2UoKTsKLQkJCQllbHNlCi0JCQkJCXZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTsKLQkJCX0KLQkJCXNvdXJjZS5hcHBlbmQodmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWZvcm1hdFByZShub2RlLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEF0dHJGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBBdHRyRm9ybWF0dGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU0Zvcm1hdFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU0Zvcm1hdFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwODUxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NGb3JtYXRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklDU1NNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZURlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBDU1NGb3JtYXRVdGlsIHsKLQlwdWJsaWMgTGlzdCBjb2xsZWN0Q1NTTm9kZXMoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJSW5kZXhlZFJlZ2lvbiBzdGFydE5vZGUgPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0KTsKLQkJSW5kZXhlZFJlZ2lvbiBlbmROb2RlID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydCArIGxlbmd0aCAtIDEpOwotCi0JCWlmIChzdGFydE5vZGUgPT0gbnVsbCB8fCBlbmROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBub2RlczsKLQkJfQotCi0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCAmJiBzdGFydE5vZGUgaW5zdGFuY2VvZiBJQ1NTTm9kZSAmJiBlbmROb2RlIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCS8vIENTUyBtb2RlbAotCQkJSUNTU05vZGUgY2EgPSBnZXRDb21tb25BbmNlc3RvcigoSUNTU05vZGUpIHN0YXJ0Tm9kZSwgKElDU1NOb2RlKSBlbmROb2RlKTsKLQkJCWlmIChjYSAhPSBudWxsKSB7Ci0JCQkJZm9yIChJQ1NTTm9kZSBub2RlID0gY2EuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGwgJiYgc3RhcnQgKyBsZW5ndGggPCAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJaWYgKHN0YXJ0IDwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsICYmIHN0YXJ0Tm9kZSBpbnN0YW5jZW9mIElET01Ob2RlICYmIGVuZE5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJaWYgKHN0YXJ0Tm9kZSBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQlzdGFydE5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgKChUZXh0KSBzdGFydE5vZGUpLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCWlmIChlbmROb2RlIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCWVuZE5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgKChUZXh0KSBlbmROb2RlKS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQkvLyBIVE1MIG1vZGVsLCBtYXliZQotCQkJSURPTU5vZGUgY2EgPSAoSURPTU5vZGUpIGdldENvbW1vbkFuY2VzdG9yKChOb2RlKSBzdGFydE5vZGUsIChOb2RlKSBlbmROb2RlKTsKLQkJCWZpbmRDU1Mobm9kZXMsIGNhKTsKLQkJfQotCi0JCXJldHVybiBub2RlczsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDb21tb25BbmNlc3RvciBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByaXZhdGUgTm9kZSBnZXRDb21tb25BbmNlc3RvcihOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB7Ci0JCWlmIChub2RlMSA9PSBudWxsIHx8IG5vZGUyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlmb3IgKE5vZGUgbmEgPSBub2RlMjsgbmEgIT0gbnVsbDsgbmEgPSBuYS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWZvciAoTm9kZSB0YSA9IG5vZGUxOyB0YSAhPSBudWxsOyB0YSA9IHRhLmdldFBhcmVudE5vZGUoKSkgewotCQkJCWlmICh0YSA9PSBuYSkKLQkJCQkJcmV0dXJuIHRhOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmluZENTUyhMaXN0IGNzc05vZGVzLCBJRE9NTm9kZSBub2RlKSB7Ci0JCUlDU1NNb2RlbEFkYXB0ZXIgYWRhcHRlcjsKLQkJYWRhcHRlciA9IChJQ1NTTW9kZWxBZGFwdGVyKSBub2RlLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJSUNTU01vZGVsIG1vZGVsID0gYWRhcHRlci5nZXRNb2RlbCgpOwotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpIHsKLQkJCQljc3NOb2Rlcy5hZGQobW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhZGFwdGVyID0gKElDU1NNb2RlbEFkYXB0ZXIpIG5vZGUuZ2V0QWRhcHRlckZvcihJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCUlDU1NNb2RlbCBtb2RlbCA9IGFkYXB0ZXIuZ2V0TW9kZWwoKTsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5JTkxJTkUpIHsKLQkJCQkJY3NzTm9kZXMuYWRkKG1vZGVsLmdldERvY3VtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWZvciAoSURPTU5vZGUgY2hpbGQgPSAoSURPTU5vZGUpIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IChJRE9NTm9kZSkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJZmluZENTUyhjc3NOb2RlcywgY2hpbGQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJQ1NTTm9kZSBnZXRDb21tb25BbmNlc3RvcihJQ1NTTm9kZSBub2RlQSwgSUNTU05vZGUgbm9kZUIpIHsKLQkJaWYgKG5vZGVBID09IG51bGwgfHwgbm9kZUIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKElDU1NOb2RlIG5hID0gbm9kZUE7IG5hICE9IG51bGw7IG5hID0gbmEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlmb3IgKElDU1NOb2RlIHRhID0gbm9kZUI7IHRhICE9IG51bGw7IHRhID0gdGEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQkJaWYgKHRhID09IG5hKSB7Ci0JCQkJCXJldHVybiB0YTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZVNvdXJjZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChvZmZzZXQgPj0gMCAmJiBsZW5ndGggPj0gMCAmJiBvZmZzZXQgKyBsZW5ndGggPD0gc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50LmNvbnRhaW5zUmVhZE9ubHkob2Zmc2V0LCBsZW5ndGgpKQotCQkJCXJldHVybjsKLQkJCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCQlzb3VyY2UgPSBuZXcgU3RyaW5nKCk7Ci0JCQkvLyBXZSB1c2UgJ3N0cnVjdHVyZWREb2N1bWVudCcgYXMgdGhlIHJlcXVlc3RlciBvYmplY3QganVzdCBzbwotCQkJLy8gdGhpcyBhbmQgdGhlIG90aGVyCi0JCQkvLyBmb3JtYXQtcmVsYXRlZCAncmVwYWxjZVRleHQnIChpbiByZXBsYWNlU291cmNlKSBjYW4gdXNlIHRoZQotCQkJLy8gc2FtZSByZXF1ZXN0ZXIuCi0JCQkvLyBPdGhlcndpc2UsIGlmIHJlcXVlc3RlciBpcyBub3QgaWRlbnRpY2FsLAotCQkJLy8gdGhlIHVuZG8gZ3JvdXAgZ2V0cyAiYnJva2VuIiBpbnRvIG11bHRpcGxlIHBpZWNlcyBiYXNlZAotCQkJLy8gb24gdGhlIHJlcXVlc3RlcnMgYmVpbmcgZGlmZmVyZW50LiBUZWNobmljYWxseSwgYW55IHVuaXF1ZSwKLQkJCS8vIGNvbW1vbgotCQkJLy8gcmVxdWVzdGVyIG9iamVjdCB3b3VsZCB3b3JrLgotCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDU1NGb3JtYXRVdGlsIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NGb3JtYXRVdGlsKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIENTU0Zvcm1hdFV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTRm9ybWF0VXRpbCBmSW5zdGFuY2U7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NTb3VyY2VGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDQ3M2EwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmdCdWZmZXIgY2xlYW51cChJQ1NTTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSByZWdpb24KLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbgotCSAqLwotCVN0cmluZ0J1ZmZlciBjbGVhbnVwKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZ0J1ZmZlciBmb3JtYXQoSUNTU05vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmdCdWZmZXIgZm9ybWF0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY2ODljNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5IHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENTU1NvdXJjZUdlbmVyYXRvciBnZXRTb3VyY2VGb3JtYXR0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJSUNTU05vZGUgbm9kZSA9IChJQ1NTTm9kZSkgdGFyZ2V0OwotCQlzaG9ydCB0eXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgSUNTU05vZGUuQ0hBUlNFVFJVTEVfTk9ERSA6Ci0JCQkJcmV0dXJuIENoYXJzZXRSdWxlRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLkZPTlRGQUNFUlVMRV9OT0RFIDoKLQkJCQlyZXR1cm4gRm9udEZhY2VSdWxlRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSA6Ci0JCQkJcmV0dXJuIEltcG9ydFJ1bGVGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuTUVESUFMSVNUX05PREUgOgotCQkJCXJldHVybiBNZWRpYUxpc3RGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuTUVESUFSVUxFX05PREUgOgotCQkJCXJldHVybiBNZWRpYVJ1bGVGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuUFJJTUlUSVZFVkFMVUVfTk9ERSA6Ci0JCQkJSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlID0gKElDU1NQcmltaXRpdmVWYWx1ZSkgbm9kZTsKLQkJCQlpZiAodmFsdWUuZ2V0UHJpbWl0aXZlVHlwZSgpID09IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09VTlRFUikKLQkJCQkJcmV0dXJuIENvdW50ZXJGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCQllbHNlIGlmICh2YWx1ZS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlLkNTU19SRUNUKQotCQkJCQlyZXR1cm4gUmVjdEZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJCWVsc2UgaWYgKHZhbHVlLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JHQkNPTE9SKQotCQkJCQlyZXR1cm4gUkdCRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuUEFHRVJVTEVfTk9ERSA6Ci0JCQkJcmV0dXJuIFBhZ2VSdWxlRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSA6Ci0JCQkJcmV0dXJuIFN0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVERUNMSVRFTV9OT0RFIDoKLQkJCQlyZXR1cm4gU3R5bGVEZWNsSXRlbUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRVJVTEVfTk9ERSA6Ci0JCQkJcmV0dXJuIFN0eWxlUnVsZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUgOgotCQkJCXJldHVybiBTdHlsZVNoZWV0Rm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLkFUVFJfTk9ERSA6Ci0JCQkJcmV0dXJuIEF0dHJGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBVbmtub3duUnVsZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeSBmSW5zdGFuY2U7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NTb3VyY2VHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTJlOGFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBDU1NTb3VyY2VHZW5lcmF0b3IgZXh0ZW5kcyBDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCByZWdpb24pOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nQnVmZmVyIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiBleGNlcHRGb3IpOwotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JaW50IGdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JaW50IGdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgaW50IGluc2VydFBvcyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DaGFyc2V0UnVsZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ2hhcnNldFJ1bGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ0ZWVkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DaGFyc2V0UnVsZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ2hhcnNldFJ1bGVGb3JtYXR0ZXIgZXh0ZW5kcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBDSEFSU0VUID0gIkBjaGFyc2V0IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldFJ1bGVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDaGFyc2V0UnVsZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQlpZiAoIUlDU1NDaGFyc2V0UnVsZS5FTkNPRElORy5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBidWY7Ci0KLQkJLy8gZ2V0IHJlZ2lvbiB0byByZXBsYWNlCi0JCWlmIChjb250ZXh0ICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJaXQucHJldigpOwotCQkJCWlmIChpdC5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcHJldiA9IGl0LnByZXYoKTsKLQkJCQkJaWYgKHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKQotCQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHByZXYpOwotCQkJCQllbHNlCi0JCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQl9IGVsc2UKLQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKSArIDE7Ci0JCQkJCWNvbnRleHQuZW5kID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGdlbmVyYXRlIHRleHQKLQkJaWYgKGluc2VydCkgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgYXR0ci5nZXRWYWx1ZSgpLCBidWYpOwotCQkJYnVmLmFwcGVuZChhdHRyLmdldFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWZvcm1hdFByZShub2RlLCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHNvdXJjZSk7Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQkJU3RyaW5nIHN0ciA9IENIQVJTRVQ7Ci0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCXN0ciA9IENIQVJTRVQudG9VcHBlckNhc2UoKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCVN0cmluZyBlbmMgPSAoKElDU1NDaGFyc2V0UnVsZSkgbm9kZSkuZ2V0RW5jb2RpbmcoKTsKLQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShlbmMsIHF1b3RlKTsKLQkJCXN0ciA9IHF1b3RlICsgKChlbmMgIT0gbnVsbCkgPyBlbmMgOiAiIikgKyBxdW90ZSArICI7IjsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHN0ciwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpICYmICFyZWdpb25zW2ldLmdldFR5cGUoKS5lcXVhbHMoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUikpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAhaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ck5hbWUgPT0gbnVsbCB8fCBhdHRyTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpZiAoIUlDU1NDaGFyc2V0UnVsZS5FTkNPRElORy5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkKLQkJCXJldHVybiAtMTsKLQotCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNTU0NoYXJzZXRSdWxlLkVOQ09ESU5HKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCUluZGV4ZWRSZWdpb24gaU5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGlOb2RlLmdldEVuZE9mZnNldCgpIDw9IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJQ29tcG91bmRSZWdpb24gcmVnaW9uc1tdID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBuZXcgRm9ybWF0UmVnaW9uKGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGlOb2RlLmdldEVuZE9mZnNldCgpIC0gaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSksIHN0Z3kpOwotCQlmb3IgKGludCBpID0gcmVnaW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCXJldHVybiByZWdpb25zW2ldLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGlOb2RlLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUikKLQkJCQlyZXR1cm4gbiAtIDE7Ci0JCQlyZXR1cm4gbjsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ2hhcnNldFJ1bGVGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgQ2hhcnNldFJ1bGVGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NvbXBvdW5kUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Db21wb3VuZFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjYyZmViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NvbXBvdW5kUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLWNsYXNzIENvbXBvdW5kUmVnaW9uIHsKLQotCUNvbXBvdW5kUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mRG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbjsKLQkJdGhpcy5mVGV4dFJlZ2lvbiA9IHRleHRSZWdpb247Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZEb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQlJVGV4dFJlZ2lvbiBnZXRUZXh0UmVnaW9uKCkgewotCQlyZXR1cm4gZlRleHRSZWdpb247Ci0JfQotCi0JU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVGV4dFJlZ2lvbi5nZXRUeXBlKCk7Ci0JfQotCi0JU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChmVGV4dFJlZ2lvbik7Ci0JfQotCQotCS8vIEJ1ZyAyMTg5OTM6IEFkZGVkIHRvIGdldCB0ZXh0IHdpdGggd2hpdGVzcGFjZSBmb3IgY2xlYW51cAotCS8vIHdpdGhvdXQgZm9ybWF0dGluZwotCVN0cmluZyBnZXRGdWxsVGV4dCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudFJlZ2lvbi5nZXRGdWxsVGV4dChmVGV4dFJlZ2lvbik7Ci0JfQotCi0JaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gZkRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKTsKLQl9Ci0KLQlpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZkRvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldChmVGV4dFJlZ2lvbik7Ci0JfQotCi0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZkRvY3VtZW50UmVnaW9uOwotCXByaXZhdGUgSVRleHRSZWdpb24gZlRleHRSZWdpb247Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NvdW50ZXJGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NvdW50ZXJGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMxNzI1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Db3VudGVyRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNvdW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvdW50ZXJGb3JtYXR0ZXIgZXh0ZW5kcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIENvdW50ZXJGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDb3VudGVyRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IGNvbnRleHQpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gc291cmNlOwotCi0JCWlmICghSUNvdW50ZXIuSURFTlRJRklFUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSAmJiAhSUNvdW50ZXIuTElTVFNUWUxFLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpICYmICFJQ291bnRlci5TRVBBUkFUT1IuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gc291cmNlOwotCi0JCS8vIGdldCByZWdpb24gdG8gcmVwbGFjZQotCQlJbmRleGVkUmVnaW9uIGlOb2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWNvbnRleHQuc3RhcnQgPSBpTm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQljb250ZXh0LmVuZCA9IGlOb2RlLmdldEVuZE9mZnNldCgpOwotCi0JCUlDb3VudGVyIGNvdW50ZXIgPSAoSUNvdW50ZXIpIG5vZGU7Ci0JCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCVN0cmluZyBzZXAgPSBjb3VudGVyLmdldFNlcGFyYXRvcigpOwotCQlTdHJpbmcgaWRlbnQgPSBjb3VudGVyLmdldElkZW50aWZpZXIoKTsKLQkJU3RyaW5nIHN0eWxlID0gY291bnRlci5nZXRMaXN0U3R5bGUoKTsKLQotCQlpZiAoSUNvdW50ZXIuSURFTlRJRklFUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkgewotCQkJaWYgKGluc2VydCkKLQkJCQlpZGVudCA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWVsc2UKLQkJCQlpZGVudCA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChJQ291bnRlci5MSVNUU1RZTEUuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpIHsKLQkJCWlmIChpbnNlcnQpCi0JCQkJc3R5bGUgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCQllbHNlCi0JCQkJc3R5bGUgPSBudWxsOwotCQl9Ci0JCWVsc2UgaWYgKElDb3VudGVyLlNFUEFSQVRPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkgewotCQkJaWYgKGluc2VydCkKLQkJCQlzZXAgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCQllbHNlCi0JCQkJc2VwID0gbnVsbDsKLQkJfQotCi0JCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShzZXAsIHF1b3RlKTsKLQkJc2VwID0gKHNlcCA9PSBudWxsIHx8IHNlcC5sZW5ndGgoKSA9PSAwKSA/IG51bGwgOiAocXVvdGUgKyBzZXAgKyBxdW90ZSk7Ci0KLQkJU3RyaW5nIGZ1bmMgPSAoc2VwID09IG51bGwgfHwgc2VwLmxlbmd0aCgpID09IDApID8gImNvdW50ZXIoIiA6ICJjb3VudGVycygiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKSB7Ci0JCQlpZGVudCA9IGlkZW50LnRvVXBwZXJDYXNlKCk7Ci0JCQlzdHlsZSA9IHN0eWxlLnRvVXBwZXJDYXNlKCk7Ci0JCQlmdW5jID0gZnVuYy50b1VwcGVyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJaWRlbnQgPSBpZGVudC50b0xvd2VyQ2FzZSgpOwotCQkJc3R5bGUgPSBzdHlsZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWlmIChzZXAgPT0gbnVsbCB8fCBzZXAubGVuZ3RoKCkgPT0gMCkgewotCQkJc291cmNlLmFwcGVuZChmdW5jKTsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIGlkZW50LCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChpZGVudCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzb3VyY2UuYXBwZW5kKGZ1bmMpOwotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgaWRlbnQsIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGlkZW50KTsKLQkJCXNvdXJjZS5hcHBlbmQoIiwiKTsvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBzZXAsIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKHNlcCk7Ci0JCX0KLQotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBzdHlsZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlzb3VyY2UuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgc3R5bGUsIHNvdXJjZSk7Ci0JCX0KLQkJc291cmNlLmFwcGVuZCgiKSIpOy8vJE5PTi1OTFMtMSQKLQotCQkvKgotCQkgKiBJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9Ci0JCSAqIG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCSAqIElUZXh0UmVnaW9uW10gcmVnaW9ucyA9Ci0JCSAqIGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcKLQkJICogRm9ybWF0UmVnaW9uKGNvbnRleHQuc3RhcnQsIGNvbnRleHQuZW5kIC0gY29udGV4dC5zdGFydCArIDEpKTsgaW50Ci0JCSAqIGNvbW1hc1syXTsgaW50IG51bUNvbW1hID0gMDsgZm9yKGludCBqID0gMDsgaiA8cmVnaW9ucy5sZW5ndGg7IGorKykgewotCQkgKiBpZiAocmVnaW9uc1tqXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ09NTUEpIHsKLQkJICogY29tbWFzW251bUNvbW1hKytdID0gajsgaWYgKG51bUNvbW1hID4gMSkgYnJlYWs7IH0gfQotCQkgKiAKLQkJICogaWYgKElDb3VudGVyLklERU5USUZJRVIuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpIHsgfSBlbHNlCi0JCSAqIGlmIChJQ291bnRlci5MSVNUU1RZTEUuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpIHsgfSBlbHNlCi0JCSAqIGlmIChJQ291bnRlci5TRVBBUkFUT1IuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpIHsgYm9vbGVhbgotCQkgKiBza2lwU3BhY2UgPSBmYWxzZTsgU3RyaW5nIGZ1bmMgPSBpbnNlcnQgPyAiY291bnRlcnMoIiA6ICJjb3VudGVyKCI7Ci0JCSAqIGlmIChtZ3IuaXNQcm9wVmFsdWVVcHBlckNhc2UoKSkgZnVuYyA9IGZ1bmMudG9VcHBlckNhc2UoKTsKLQkJICogCi0JCSAqIGZvcihpbnQgaT0wOyBpIDxyZWdpb25zLmxlbmd0aDsgaSsrKSB7IGlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PQotCQkgKiBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pCi0JCSAqIHNvdXJjZS5hcHBlbmQoZnVuYyk7IGVsc2UgeyBpZiAobnVtQ29tbWEgPT0gMiAmJiBjb21tYXNbMV0gPCBpKSB7Ci0JCSAqICB9IGVsc2UgaWYgKG51bUNvbW1hID09IDEgJiYgY29tbWFzWzBdIDwgaSAmJiBpbnNlcnQpIHsKLQkJICogIH0gZWxzZSBpZiAobnVtQ29tbWEgPT0gMSAmJiBjb21tYXNbMF0gPCBpICYmICEgaW5zZXJ0KSB7IH0gZWxzZSBpZgotCQkgKiAobnVtQ29tbWEgPT0gMCAmJiBpbnNlcnQgJiYgcmVnaW9uc1tpXS5nZXRUeXBlID09Ci0JCSAqIENTU1JlZ2lvbkNvbnRleHRzLlBBUkVOVEhFU0lTX0NMT1NFKSB7IHNvdXJjZS5hcHBlbmQoIiwiKTsKLQkJICogYXBwZW5kU3BhY2VCZWZvcmUobm9kZSxhdHRyLmdldFZhbHVlKCksc291cmNlKTsKLQkJICogc291cmNlLmFwcGVuZChhdHRyLmdldFZhbHVlKCkpOyB9Ci0JCSAqIAotCQkgKiBpZiAoaSAhPSAwICYmICFza2lwU3BhY2UpCi0JCSAqIGFwcGVuZFNwYWNlQmVmb3JlKG5vZGUscmVnaW9uc1tpXSxzb3VyY2UpOwotCQkgKiBzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldKSk7IH0gc2tpcFNwYWNlID0KLQkJICogZmFsc2U7Ci0JCSAqIAotCQkgKiBpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0KLQkJICogQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSBza2lwU3BhY2UgPSB0cnVlOyB9IH0KLQkJICovCi0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJYm9vbGVhbiBza2lwU3BhY2UgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDAgJiYgIXNraXBTcGFjZSkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlza2lwU3BhY2UgPSBmYWxzZTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikKLQkJCQkJc2tpcFNwYWNlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlJQ291bnRlciBjb3VudGVyID0gKElDb3VudGVyKSBub2RlOwotCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJCVN0cmluZyBzZXBhcmF0b3IgPSBjb3VudGVyLmdldFNlcGFyYXRvcigpOwotCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHNlcGFyYXRvciwgcXVvdGUpOwotCQkJU3RyaW5nIHNlcCA9IChzZXBhcmF0b3IgPT0gbnVsbCB8fCBzZXBhcmF0b3IubGVuZ3RoKCkgPT0gMCkgPyBudWxsIDogKHF1b3RlICsgc2VwYXJhdG9yICsgcXVvdGUpOwotCQkJU3RyaW5nIGlkZW50ID0gY291bnRlci5nZXRJZGVudGlmaWVyKCk7Ci0JCQlTdHJpbmcgc3R5bGUgPSBjb3VudGVyLmdldExpc3RTdHlsZSgpOwotCQkJU3RyaW5nIGZ1bmMgPSAoc2VwID09IG51bGwgfHwgc2VwLmxlbmd0aCgpID09IDApID8gImNvdW50ZXIoIiA6ICJjb3VudGVycygiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkvLyBub3JtYWxpemUKLQkJCWlmIChpZGVudCA9PSBudWxsKQotCQkJCWlkZW50ID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKHN0eWxlID09IG51bGwpCi0JCQkJc3R5bGUgPSAiIjsvLyROT04tTkxTLTEkCi0KLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKSB7Ci0JCQkJaWRlbnQgPSBpZGVudC50b1VwcGVyQ2FzZSgpOwotCQkJCXN0eWxlID0gc3R5bGUudG9VcHBlckNhc2UoKTsKLQkJCQlmdW5jID0gZnVuYy50b1VwcGVyQ2FzZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWRlbnQgPSBpZGVudC50b0xvd2VyQ2FzZSgpOwotCQkJCXN0eWxlID0gc3R5bGUudG9Mb3dlckNhc2UoKTsKLQkJCX0KLQkJCWlmIChzZXAgPT0gbnVsbCB8fCBzZXAubGVuZ3RoKCkgPT0gMCkgewotCQkJCXNvdXJjZS5hcHBlbmQoZnVuYyk7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgaWRlbnQsIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChpZGVudCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzb3VyY2UuYXBwZW5kKGZ1bmMpOwotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIGlkZW50LCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoaWRlbnQpOwotCQkJCXNvdXJjZS5hcHBlbmQoIiwiKTsvLyROT04tTkxTLTEkCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgc2VwLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoc2VwKTsKLQkJCX0KLQotCQkJaWYgKHN0eWxlICE9IG51bGwgJiYgc3R5bGUubGVuZ3RoKCkgIT0gMCkgewotCQkJCXNvdXJjZS5hcHBlbmQoIiwiKTsvLyROT04tTkxTLTEkCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgc3R5bGUsIHNvdXJjZSk7Ci0JCQl9Ci0JCQlzb3VyY2UuYXBwZW5kKCIpIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyTmFtZSA9PSBudWxsIHx8IGF0dHJOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJSW5kZXhlZFJlZ2lvbiBpTm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoSUNvdW50ZXIuSURFTlRJRklFUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkgewotCQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElDb3VudGVyLklERU5USUZJRVIpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCQkJaWYgKGlOb2RlLmdldEVuZE9mZnNldCgpIDw9IDApCi0JCQkJcmV0dXJuIC0xOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGlOb2RlLmdldEVuZE9mZnNldCgpIC0gMSkpOwotCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0LnByZXYoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pCi0JCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCX0KLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQl9Ci0JCWVsc2UgaWYgKElDb3VudGVyLkxJU1RTVFlMRS5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkgewotCQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElDb3VudGVyLkxJU1RTVFlMRSk7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGlOb2RlLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSAxKSk7Ci0JCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXQucHJldigpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUikKLQkJCQkJcmV0dXJuIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKQotCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJfQotCQllbHNlIGlmIChJQ291bnRlci5TRVBBUkFUT1IuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpIHsKLQkJCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ291bnRlci5TRVBBUkFUT1IpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGlOb2RlLmdldEVuZE9mZnNldCgpIC0gMSkpOwotCQkJYm9vbGVhbiBoYXNDb21tYSA9IGZhbHNlOwotCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0LnByZXYoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IpIHsKLQkJCQkJaWYgKCFoYXNDb21tYSkKLQkJCQkJCWhhc0NvbW1hID0gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikKLQkJCQkJcmV0dXJuIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJfQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENvdW50ZXJGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgQ291bnRlckZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVjbENvbnRhaW5lckZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVjbENvbnRhaW5lckZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGI0ZTJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlY2xDb250YWluZXJGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlY2xDb250YWluZXJGb3JtYXR0ZXIgZXh0ZW5kcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCURlY2xDb250YWluZXJGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWNvcmF0ZWRTZWxlY3RvclJlZ2lvbihDb21wb3VuZFJlZ2lvbiByZWdpb24sIENvbXBvdW5kUmVnaW9uIHByZXZSZWdpb24sIENTU0NsZWFudXBTdHJhdGVneSBzdGd5KSB7Ci0JCWlmIChpc0Zvcm1hdCgpKQotCQkJcmV0dXJuIHJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmICghc3RneS5pc0Zvcm1hdFNvdXJjZSgpKQotCQkJdGV4dCA9IHJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQllbHNlCi0JCQl0ZXh0ID0gcmVnaW9uLmdldFRleHQoKTsKLQkJCi0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJc2hvcnQgc2VsQ2FzZSA9IC0xOwotCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8pIHsKLQkJCXNlbENhc2UgPSBzdGd5LmdldFNlbGVjdG9yVGFnQ2FzZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTKSB7Ci0JCQlzZWxDYXNlID0gc3RneS5nZXRDbGFzc1NlbGVjdG9yQ2FzZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lEKSB7Ci0JCQlzZWxDYXNlID0gc3RneS5nZXRJZFNlbGVjdG9yQ2FzZSgpOwotCQl9Ci0KLQkJaWYgKHNlbENhc2UgPT0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKSB7Ci0JCQlyZXR1cm4gdGV4dC50b1VwcGVyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbENhc2UgPT0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5LkxPV0VSKSB7Ci0JCQlyZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbENhc2UgPT0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5LkFTSVMpIHsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0KLQkJcmV0dXJuIGRlY29yYXRlZFJlZ2lvbihyZWdpb24sIDAsIHN0Z3kpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gKG5vZGUuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJc291cmNlLmFwcGVuZCgifSIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkKLQkJCQlyZXR1cm4gbiAtIDE7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG47Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIyNzgwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9EZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGVuZFNwYWNlQmV0d2VlbihJQ1NTTm9kZSBub2RlLCBDb21wb3VuZFJlZ2lvbiBwcmV2LCBDb21wb3VuZFJlZ2lvbiBuZXh0LCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWlmIChpc0NsZWFudXAoKSAmJiAhZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpLmlzRm9ybWF0U291cmNlKCkpCi0JCQlyZXR1cm47IC8vIGZvciBub3QgZm9ybWF0dGluZyBjYXNlIG9uIGNsZWFudXAgYWN0aW9uCi0KLQkJLy8gaW4gc2VsZWN0b3IKLQkJU3RyaW5nIHByZXZUeXBlID0gcHJldi5nZXRUeXBlKCk7Ci0JCVN0cmluZyBuZXh0VHlwZSA9IG5leHQuZ2V0VHlwZSgpOwotCi0JCWlmIChwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQVRLRVlXT1JEIHx8IHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT05UX0ZBQ0UgfHwgcHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEpIHsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG5leHQsIHNvdXJjZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAocHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV04gJiYgbmV4dFR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCWlmIChwcmV2LmdldEVuZE9mZnNldCgpICE9IG5leHQuZ2V0U3RhcnRPZmZzZXQoKSkgeyAvLyBub3QKLQkJCQkJCQkJCQkJCQkJCQkvLyBzZXF1ZW50aWFsCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgbmV4dCwgc291cmNlKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgfHwgcHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgfHwgbmV4dFR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgfHwgbmV4dFR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCBuZXh0VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTikgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgbmV4dCwgc291cmNlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlLCBJUmVnaW9uIGV4Y2VwdEZvcikgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuID4gMCkKLQkJCXJldHVybiBuOwotCQlyZXR1cm4gLTE7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0ZvbnRGYWNlUnVsZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9udEZhY2VSdWxlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNDZlZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9udEZhY2VSdWxlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBGb250RmFjZVJ1bGVGb3JtYXR0ZXIgZXh0ZW5kcyBEZWNsQ29udGFpbmVyRm9ybWF0dGVyIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBGT05UX0ZBQ0UgPSAiQGZvbnQtZmFjZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEZvbnRGYWNlUnVsZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCUZvbnRGYWNlUnVsZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBzdHIgPSBGT05UX0ZBQ0U7Ci0JCQlpZiAoQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJc3RyID0gRk9OVF9GQUNFLnRvVXBwZXJDYXNlKCk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAieyIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQkJc291cmNlLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQllbHNlCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEZvbnRGYWNlUnVsZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBGb250RmFjZVJ1bGVGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0Zvcm1hdFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9ybWF0UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMGM5ZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9ybWF0UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotCi0vKioKLSAqIAotICovCi1jbGFzcyBGb3JtYXRSZWdpb24gaW1wbGVtZW50cyBJUmVnaW9uIHsKLQotCXByaXZhdGUgaW50IGZPZmZzZXQsIGZMZW5ndGg7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlGb3JtYXRSZWdpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlzdXBlcigpOwotCQlzZXQob2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcmVnaW9uCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgcmVnaW9uCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBmT2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJdGhpcy5mT2Zmc2V0ID0gb2Zmc2V0OwotCQl0aGlzLmZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRMZW5ndGgoaW50IG5ld0xlbmd0aCkgewotCQlmTGVuZ3RoID0gbmV3TGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0T2Zmc2V0KGludCBuZXdPZmZzZXQpIHsKLQkJZk9mZnNldCA9IG5ld09mZnNldDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRnVuY3Rpb25Gb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0Z1bmN0aW9uRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDdmMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRnVuY3Rpb25Gb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEZ1bmN0aW9uRm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JRnVuY3Rpb25Gb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWludCBzdGFydCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCWludCBlbmQgPSAoY2hpbGQgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogMDsKLQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJLy8gZ2V0IG1lYW5pbmcgcmVnaW9ucwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCWlmIChleGNlcHRGb3IgPT0gbnVsbCkKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgcGlja3VwVHlwZSA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUjsKLQkJCQlpZiAocHJldiA9PSBudWxsIHx8IGNoaWxkID09IG51bGwpCi0JCQkJCXBpY2t1cFR5cGUgPSBudWxsOwotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBleGNlcHRGb3IsIHBpY2t1cFR5cGUpOwotCQkJfQotCQkJLy8gZXh0cmFjdCBzb3VyY2UKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMiwgc3RneSkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByZXYgIT0gbnVsbCAmJiBjaGlsZCAhPSBudWxsKSB7IC8vIGdlbmVyYXRlIHNvdXJjZSBiZXR3ZWVuCi0JCQkvLyBwYXJhbWV0ZXJzCi0JCQlzb3VyY2UuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMiwgc3RneSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGUgbm9kZSwgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IChub2RlLmdldExhc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAoZW5kID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMiwgc3RneSkpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCXNvdXJjZS5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAyLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCi0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCVN0cmluZyBmdW5jID0gZ2V0RnVuYygpOwotCQkJaWYgKENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlmdW5jID0gZnVuYy50b1VwcGVyQ2FzZSgpOwotCQkJc291cmNlLmFwcGVuZChmdW5jKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAhaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoaWxkSW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IG4gPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAobiA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSkuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQlyZXR1cm4gbiAtIDE7Ci0JCQlyZXR1cm4gbjsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRGdW5jKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9JbXBvcnRSdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9JbXBvcnRSdWxlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzU4NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvSW1wb3J0UnVsZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRSdWxlRm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIElNUE9SVCA9ICJAaW1wb3J0IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgSW1wb3J0UnVsZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCUltcG9ydFJ1bGVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBidWY7Ci0KLQkJaWYgKCFJQ1NTSW1wb3J0UnVsZS5IUkVGLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQkvLyBnZXQgcmVnaW9uIHRvIHJlcGxhY2UKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQkJaWYgKGl0Lmhhc1ByZXYoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocHJldik7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQlpdC5uZXh0KCk7Ci0JCQkJfSBlbHNlCi0JCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCWl0Lm5leHQoKTsKLQkJCQlpdC5uZXh0KCk7Ci0JCQkJaWYgKGl0Lmhhc05leHQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBuZXh0ID0gaXQubmV4dCgpOwotCQkJCQlpZiAobmV4dC5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuZXh0KTsKLQkJCQkJZWxzZQotCQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl9IGVsc2UKLQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSUNTU05vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQkJCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQkJCWZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJCXJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSAtIDEpOwotCQkJCQlyZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIC0gMSk7Ci0JCQkJfQotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQljb250ZXh0LmVuZCA9IGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgdGV4dAotCQlpZiAoaW5zZXJ0ICYmIGF0dHIuZ2V0VmFsdWUoKSAhPSBudWxsICYmIGF0dHIuZ2V0VmFsdWUoKS5sZW5ndGgoKSA+IDApIHsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIGF0dHIuZ2V0VmFsdWUoKSwgYnVmKTsKLQkJCWJ1Zi5hcHBlbmQoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICIiLCBidWYpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYnVmOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlLCBJUmVnaW9uIGV4Y2VwdEZvcikgewotCQkvLyBmb3IgbWVkaWEtdHlwZQotCQlJQ1NTTm9kZSBwcmV2ID0gKGNoaWxkICE9IG51bGwpID8gY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgOiBub2RlLmdldExhc3RDaGlsZCgpOwotCQlpbnQgc3RhcnQgPSAocHJldiAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgcHJldikuZ2V0RW5kT2Zmc2V0KCkgOiAwOwotCQlpbnQgZW5kID0gKGNoaWxkICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA6IDA7Ci0JCWlmIChzdGFydCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCS8vIGdldCBtZWFuaW5nIHJlZ2lvbnMKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG51bGw7Ci0JCQlpZiAoZXhjZXB0Rm9yID09IG51bGwpCi0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIHBpY2t1cFR5cGUgPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUFfU0VQQVJBVE9SOwotCQkJCWlmIChwcmV2ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCQkJcGlja3VwVHlwZSA9IG51bGw7Ci0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIGV4Y2VwdEZvciwgcGlja3VwVHlwZSk7Ci0JCQl9Ci0JCQkvLyBleHRyYWN0IHNvdXJjZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkvLyBiZQotCQkJCS8vIGNvbW1lbnRzCi0JCQl9Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJfSBlbHNlIGlmIChwcmV2ICE9IG51bGwgJiYgY2hpbGQgIT0gbnVsbCkgeyAvLyBnZW5lcmF0ZSBzb3VyY2UgOiA/Pz8/Ci0JCQlzb3VyY2UuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCX0gZWxzZSBpZiAoY2hpbGQgIT0gbnVsbCkgeyAvLyBnZW5lcmF0ZSBzb3VyY2UgOiBiZXR3ZWVuICd1cmwoKScgYW5kCi0JCQkvLyBtZWRpYSB0eXBlcwotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gcmVnaW9uLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdCBiZQotCQkJLy8gY29tbWVudHMKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmICgoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpID09IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJCWVsc2UKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzb3VyY2UuYXBwZW5kKCI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKSAmJiAhcmVnaW9uc1tpXS5nZXRUeXBlKCkuZXF1YWxzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCi0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBzdHIgPSByZWdpb25zW2ldLmdldFRleHQoKTsKLQkJCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCkKLQkJCQkJc3RyID0gZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSk7Ci0JCQkJZWxzZQotCQkJCQlzdHIgPSBkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSk7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCQlTdHJpbmcgc3RyID0gSU1QT1JUOwotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlzdHIgPSBJTVBPUlQudG9VcHBlckNhc2UoKTsKLQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQlzdHIgPSAidXJsKCI7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJc3RyID0gc3RyLnRvVXBwZXJDYXNlKCk7Ci0JCQlTdHJpbmcgaHJlZiA9ICgoSUNTU0ltcG9ydFJ1bGUpIG5vZGUpLmdldEhyZWYoKTsKLQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShocmVmLCBxdW90ZSk7Ci0JCQlzdHIgPSBzdHIgKyBxdW90ZSArIGhyZWYgKyBxdW90ZSArICIpIjsvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBzdHIsIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCX0KLQkJSUNTU05vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkICE9IG51bGwgJiYgKGNoaWxkIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0KSAmJiAoKG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdCkgY2hpbGQpLmdldExlbmd0aCgpID4gMCkgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgIiIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgc3RyID0gcmVnaW9uc1tpXS5nZXRUZXh0KCk7Ci0JCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCkKLQkJCQlzdHIgPSBkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KTsKLQkJCWVsc2UKLQkJCQlzdHIgPSBkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSk7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyTmFtZSA9PSBudWxsIHx8IGF0dHJOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaWYgKCFJQ1NTSW1wb3J0UnVsZS5IUkVGLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKQotCQkJcmV0dXJuIC0xOwotCi0JCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ1NTSW1wb3J0UnVsZS5IUkVGKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCUluZGV4ZWRSZWdpb24gaU5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGlOb2RlLmdldEVuZE9mZnNldCgpIDw9IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJRm9ybWF0UmVnaW9uIGZvcm1hdFJlZ2lvbiA9IG51bGw7Ci0JCUlDU1NOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChjaGlsZCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCWZvcm1hdFJlZ2lvbiA9IG5ldyBGb3JtYXRSZWdpb24oaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSAtIGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQllbHNlCi0JCQlmb3JtYXRSZWdpb24gPSBuZXcgRm9ybWF0UmVnaW9uKGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGlOb2RlLmdldEVuZE9mZnNldCgpIC0gaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCUNvbXBvdW5kUmVnaW9uIHJlZ2lvbnNbXSA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMobm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgZm9ybWF0UmVnaW9uLCBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkpOwotCi0JCWJvb2xlYW4gYXRydWxlID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19JTVBPUlQpIHsKLQkJCQlhdHJ1bGUgPSB0cnVlOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmICghYXRydWxlKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCXJldHVybiByZWdpb25zW2ldLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIChjaGlsZCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogaU5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSKQotCQkJCXJldHVybiBuIC0gMTsKLQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBJbXBvcnRSdWxlRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEltcG9ydFJ1bGVGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL01lZGlhTGlzdEZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvTWVkaWFMaXN0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NGViMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvTWVkaWFMaXN0Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhTGlzdEZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgTWVkaWFMaXN0Rm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JTWVkaWFMaXN0Rm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IGNvbnRleHQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gYnVmOwotCi0JCWJvb2xlYW4gZmlyc3QgPSBmYWxzZSwgbGFzdCA9IGZhbHNlOwotCQkvLyBnZXQgcmVnaW9uIHRvIHJlcGxhY2UKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgcHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBX1NFUEFSQVRPUiB8fCBwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChwcmV2KTsKLQkJCQkJZWxzZQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChjb250ZXh0LnN0YXJ0IDwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWZpcnN0ID0gdHJ1ZTsKLQotCQkJCX0KLQkJCQlpdC5yZXNldChmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gbmV4dCA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKG5leHQuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IG5leHQuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQV9TRVBBUkFUT1IgfHwgbmV4dC5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuZXh0KTsKLQkJCQkJZWxzZQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIDwgY29udGV4dC5lbmQpIHsKLQkJCQkJY29udGV4dC5lbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJCQlsYXN0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWxhc3QgPSB0cnVlOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgcHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBX1NFUEFSQVRPUiB8fCBwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChwcmV2KTsKLQkJCQkJZWxzZQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChjb250ZXh0LnN0YXJ0IDwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWZpcnN0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgdGV4dAotCQlpZiAoaW5zZXJ0ICYmIGF0dHIuZ2V0VmFsdWUoKSAhPSBudWxsICYmIGF0dHIuZ2V0VmFsdWUoKS5sZW5ndGgoKSA+IDApIHsKLQkJCWlmICghZmlyc3QpCi0JCQkJYnVmLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBhdHRyLmdldFZhbHVlKCksIGJ1Zik7Ci0JCQlidWYuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQlpZiAoIWxhc3QpIHsKLQkJCQlidWYuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAiIiwgYnVmKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgaWYgKCFmaXJzdCAmJiAhbGFzdCkgewotCQkJYnVmLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAiIiwgYnVmKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJTWVkaWFMaXN0IGxpc3QgPSAoTWVkaWFMaXN0KSBub2RlOwotCQkJaW50IG4gPSBsaXN0LmdldExlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCQlTdHJpbmcgbWVkaXVtID0gbGlzdC5pdGVtKGkpOwotCQkJCWlmIChDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQkJbWVkaXVtID0gbWVkaXVtLnRvVXBwZXJDYXNlKCk7Ci0JCQkJZWxzZQotCQkJCQltZWRpdW0gPSBtZWRpdW0udG9Mb3dlckNhc2UoKTsKLQotCQkJCWlmIChpICE9IDApIHsKLQkJCQkJc291cmNlLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG1lZGl1bSwgc291cmNlKTsKLQkJCQl9Ci0JCQkJc291cmNlLmFwcGVuZChtZWRpdW0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgIWlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHJOYW1lID09IG51bGwgfHwgYXR0ck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCi0JCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCQlJbmRleGVkUmVnaW9uIGlOb2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpTm9kZS5nZXRFbmRPZmZzZXQoKSA8PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCS8qCi0JCSAqIElUZXh0UmVnaW9uIHJlZ2lvbnNbXSA9Ci0JCSAqIGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMobm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwKLQkJICogbmV3IEZvcm1hdFJlZ2lvbihpTm9kZS5nZXRTdGFydE9mZnNldCgpLCBpTm9kZS5nZXRFbmRPZmZzZXQoKSAtCi0JCSAqIGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyAxKSk7IGZvcihpbnQgaT1yZWdpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsKLQkJICogaS0tKSB7IGlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5JTVBPUlRBTlRfU1lNKQotCQkgKiByZXR1cm4gcmVnaW9uc1tpXS5nZXRTdGFydE9mZnNldCgpOyB9Ci0JCSAqLwotCQlyZXR1cm4gaU5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgTWVkaWFMaXN0Rm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IE1lZGlhTGlzdEZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvTWVkaWFSdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9NZWRpYVJ1bGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0Njg5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9NZWRpYVJ1bGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJ1bGVGb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgTUVESUEgPSAiQG1lZGlhIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgTWVkaWFSdWxlRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JTWVkaWFSdWxlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlLCBJUmVnaW9uIGV4Y2VwdEZvcikgewotCQlJQ1NTTm9kZSBwcmV2ID0gKGNoaWxkICE9IG51bGwpID8gY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgOiBub2RlLmdldExhc3RDaGlsZCgpOwotCQlpbnQgc3RhcnQgPSAocHJldiAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgcHJldikuZ2V0RW5kT2Zmc2V0KCkgOiAwOwotCQlpbnQgZW5kID0gKGNoaWxkICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA6IDA7Ci0JCWlmIChzdGFydCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsgLy8gc291cmNlIGZvcm1hdHRpbmcKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkvLyBnZXQgbWVhbmluZyByZWdpb25zCi0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBudWxsOwotCQkJaWYgKGV4Y2VwdEZvciA9PSBudWxsKQotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWVsc2UgewotCQkJCVN0cmluZyBwaWNrdXBUeXBlID0gbnVsbDsKLQkJCQlpZiAoKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpIHx8IChwcmV2ID09IG51bGwgJiYgKGNoaWxkID09IG51bGwgfHwgY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkpKSB7Ci0JCQkJCXBpY2t1cFR5cGUgPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFOwotCQkJCX0KLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgZXhjZXB0Rm9yLCBwaWNrdXBUeXBlKTsKLQkJCX0KLQkJCS8vIGV4dHJhY3Qgc291cmNlCi0JCQlpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFICYmICgoTWVkaWFMaXN0KSBjaGlsZCkuZ2V0TGVuZ3RoKCkgPiAwKSB7IC8vIGJldHdlZW4KLQkJCQkvLyAiQG1lZGlhIiBhbmQgbWVkaWF0eXBlCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCQkvLyBiZSBjb21tZW50cwotCQkJCX0KLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJCX0gZWxzZSBpZiAoY2hpbGQgIT0gbnVsbCAmJiAoY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgPT0gbnVsbCB8fCBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSkgeyAvLyBiZXR3ZWVuCi0JCQkJLy8gbWVkaWF0eXBlIGFuZCB0aGUgZmlyc3Qgc3R5bGUgcnVsZQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkJLy8gYmUgY29tbWVudHMKLQkJCQl9Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCX0gZWxzZSB7IC8vIGJldHdlZW4gc3R5bGVzCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCQkvLyBiZSBjb21tZW50cwotCQkJCX0KLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBzb3VyY2UgZ2VuZXJhdGlvbgotCQkJaWYgKGNoaWxkID09IG51bGwgJiYgcHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgeyAvLyBhZnRlcgotCQkJCS8vIHRoZSBsYXN0IHN0eWxlIHJ1bGUKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLmdldFBhcmVudE5vZGUoKSwgbnVsbCwgc291cmNlKTsKLQkJCX0gZWxzZSBpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFICYmICgoTWVkaWFMaXN0KSBjaGlsZCkuZ2V0TGVuZ3RoKCkgPiAwKSB7IC8vIGJldHdlZW4KLQkJCQkvLyAiQG1lZGlhIiBhbmQgbWVkaWF0eXBlCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCQl9IGVsc2UgaWYgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUgJiYgKChNZWRpYUxpc3QpIHByZXYpLmdldExlbmd0aCgpID4gMCkgeyAvLyBiZXR3ZWVuCi0JCQkJLy8gbWVkaWF0eXBlIGFuZCB0aGUgZmlyc3Qgc3R5bGUgcnVsZQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICJ7Iiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCQkJc291cmNlLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCQllbHNlCi0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBudWxsLCBzb3VyY2UpOwotCQkJfSBlbHNlIHsgLy8gbm9ybWFsIGNhc2UKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gcmVnaW9uLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7IC8vIGJldHdlZW4KLQkJCS8vICJAbWVkaWEiIGFuZCBtZWRpYXR5cGUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJLy8gYmUgY29tbWVudHMKLQkJCX0KLQkJCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpID09IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQkJfQotCQl9IGVsc2UgaWYgKGNoaWxkICE9IG51bGwgJiYgKGNoaWxkLmdldFByZXZpb3VzU2libGluZygpID09IG51bGwgfHwgY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkpIHsgLy8gYmV0d2VlbgotCQkJLy8gbWVkaWF0eXBlIGFuZCB0aGUgZmlyc3Qgc3R5bGUgcnVsZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkvLyBiZSBjb21tZW50cwotCQkJfQotCQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gYmV0d2VlbiBzdHlsZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJLy8gYmUgY29tbWVudHMKLQkJCX0KLQkJCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpID09IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IChub2RlLmdldExhc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAoZW5kID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBzb3VyY2UgZm9ybWF0dGluZwotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJaWYgKG5vZGUuZ2V0TGFzdENoaWxkKCkgPT0gbnVsbCB8fCBub2RlLmdldExhc3RDaGlsZCgpLmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJYm9vbGVhbiBiSW5DdXJseUJyYWNlID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICghYkluQ3VybHlCcmFjZSkKLQkJCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpCi0JCQkJCQliSW5DdXJseUJyYWNlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIHNvdXJjZSBnZW5lcmF0aW9uCi0JCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCQkJaWYgKG5vZGUuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiBub2RlLmdldExhc3RDaGlsZCgpLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpIHsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAieyIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQkJCXNvdXJjZS5hcHBlbmQoInsiKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJc291cmNlLmFwcGVuZCgifSIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCUlDU1NOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChjaGlsZCAhPSBudWxsICYmIChjaGlsZCBpbnN0YW5jZW9mIE1lZGlhTGlzdCkgJiYgKChNZWRpYUxpc3QpIGNoaWxkKS5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSAhPSBudWxsKQotCQkJCWVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWVsc2UKLQkJCQllbmQgPSAtMTsKLQkJfQotCQkKLQkJaWYgKGVuZCA+IDApIHsgLy8gc291cmNlIGZvcm1hdHRpbmcKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIHNvdXJjZSBnZW5lcmF0aW9uCi0JCQlTdHJpbmcgc3RyID0gTUVESUE7Ci0JCQlpZiAoQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJc3RyID0gTUVESUEudG9VcHBlckNhc2UoKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJfQotCi0JCWlmIChjaGlsZCAhPSBudWxsICYmIChjaGlsZCBpbnN0YW5jZW9mIE1lZGlhTGlzdCkgJiYgKChNZWRpYUxpc3QpIGNoaWxkKS5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICIiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkKLQkJCQlyZXR1cm4gbiAtIDE7Ci0JCQlyZXR1cm4gbjsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgTWVkaWFSdWxlRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IE1lZGlhUnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJSW5kZXhlZFJlZ2lvbiBubm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaW5zZXJ0UG9zIDw9IDAgfHwgIW5ub2RlLmNvbnRhaW5zKGluc2VydFBvcyAtIDEpKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWYgKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLmdldE5leHRTaWJsaW5nKCkgPT0gbm9kZS5nZXRMYXN0Q2hpbGQoKSkgeyAvLyBpbnNlcnRlZAotCQkJLy8gZmlyc3Qgc3R5bGUgcnVsZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5zZXJ0UG9zKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCXJldHVybiAwOwotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5zZXJ0UG9zKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCQlyZXR1cm4gMDsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXJlZ2lvbiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKQotCQkJCQlicmVhazsKLQkJCQlpZiAobm5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbikpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaW50IHBvcyA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgLSBpbnNlcnRQb3M7Ci0JCQlyZXR1cm4gKHBvcyA+PSAwKSA/IHBvcyA6IDA7Ci0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKG5vZGUsIGluc2VydFBvcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCUluZGV4ZWRSZWdpb24gbm5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGluc2VydFBvcyA8PSAwIHx8ICFubm9kZS5jb250YWlucyhpbnNlcnRQb3MgLSAxKSkKLQkJCXJldHVybiAwOwotCi0JCWlmIChub2RlLmdldEZpcnN0Q2hpbGQoKS5nZXROZXh0U2libGluZygpID09IG5vZGUuZ2V0TGFzdENoaWxkKCkpIHsgLy8gaW5zZXJ0ZWQKLQkJCS8vIGZpcnN0IHN0eWxlIHJ1bGUKLQkJCWludCBwb3MgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChwb3MgPD0gMCkKLQkJCQlwb3MgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkgKyA2IC8qCi0JCQkJCQkJCQkJCQkJCQkJCSAqIGxlbmd0aAotCQkJCQkJCQkJCQkJCQkJCQkgKiBvZgotCQkJCQkJCQkJCQkJCQkJCQkgKiAiQG1lZGlhIgotCQkJCQkJCQkJCQkJCQkJCQkgKi87Ci0JCQlyZXR1cm4gaW5zZXJ0UG9zIC0gcG9zOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKG5vZGUsIGluc2VydFBvcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUGFnZVJ1bGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1BhZ2VSdWxlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMWY3YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUGFnZVJ1bGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBhZ2VSdWxlRm9ybWF0dGVyIGV4dGVuZHMgRGVjbENvbnRhaW5lckZvcm1hdHRlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgUEFHRSA9ICJAcGFnZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFBhZ2VSdWxlRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JUGFnZVJ1bGVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBidWY7Ci0KLQkJaWYgKCFJQ1NTUGFnZVJ1bGUuU0VMRUNUT1IuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gYnVmOwotCi0JCS8vIGdldCByZWdpb24gdG8gcmVwbGFjZQotCQlpZiAoY29udGV4dCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQlpdC5uZXh0KCk7Ci0JCQkJaWYgKGl0Lmhhc05leHQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBuZXh0ID0gaXQubmV4dCgpOwotCQkJCQlpZiAobmV4dC5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuZXh0KTsKLQkJCQkJZWxzZQotCQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IHBvcyA9IGdldEF0dHJJbnNlcnRQb3Mobm9kZSwgYXR0ci5nZXROYW1lKCkpOwotCQkJCWNvbnRleHQuc3RhcnQgPSBwb3M7Ci0JCQkJY29udGV4dC5lbmQgPSBwb3M7Ci0JCQkJLyoKLQkJCQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0KLQkJCQkgKiBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldE5vZGVBdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJICogSVRleHRSZWdpb24gcmVnaW9uID0KLQkJCQkgKiBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJICogaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuUykgewotCQkJCSAqIGNvbnRleHQuc3RhcnQgPSByZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsgY29udGV4dC5lbmQgPQotCQkJCSAqIHJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsgfSBlbHNlIHsgY29udGV4dC5zdGFydCA9Ci0JCQkJICogZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCkgKyAxOyBjb250ZXh0LmVuZCA9Ci0JCQkJICogZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7IH0KLQkJCQkgKi99Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgdGV4dAotCQlpZiAoaW5zZXJ0KSB7Ci0JCQlTdHJpbmcgdmFsID0gYXR0ci5nZXRWYWx1ZSgpOwotCQkJaWYgKHZhbCAhPSBudWxsICYmIHZhbC5sZW5ndGgoKSA+IDApIHsKLQkJCQlidWYuYXBwZW5kKHZhbCk7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgIiIsIGJ1Zik7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCByZWdpb25zW2kgLSAxXSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlTdHJpbmcgc3RyID0gUEFHRTsKLQkJCWlmIChDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlzdHIgPSBQQUdFLnRvVXBwZXJDYXNlKCk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQlzdHIgPSAoKElDU1NQYWdlUnVsZSkgbm9kZSkuZ2V0U2VsZWN0b3JUZXh0KCk7Ci0JCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHN0ciwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQl9Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAieyIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQkJc291cmNlLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJldHdlZW4obm9kZSwgKGkgPT0gMCkgPyBvdXRzaWRlWzBdIDogcmVnaW9uc1tpIC0gMV0sIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmIChpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCWVsc2UKLQkJCQlhcHBlbmRTcGFjZUJldHdlZW4obm9kZSwgcmVnaW9uc1tyZWdpb25zLmxlbmd0aCAtIDFdLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHJOYW1lID09IG51bGwgfHwgYXR0ck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlpZiAoIUlDU1NQYWdlUnVsZS5TRUxFQ1RPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkKLQkJCXJldHVybiAtMTsKLQotCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNTU1BhZ2VSdWxlLlNFTEVDVE9SKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWVsc2UgaWYgKCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXJlZ2lvbiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCQlpZiAoaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbikgPj0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBQYWdlUnVsZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBQYWdlUnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1ByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMTVjOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVWYWx1ZUZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlQcmltaXRpdmVWYWx1ZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJYm9vbGVhbiBhcHBlbmRRdW90ZSA9IHJlZ2lvbnMubGVuZ3RoID4gMSAmJiBub2RlLmdldFBhcmVudE5vZGUoKSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtICYmIGlzQ2xlYW51cCgpICYmIGdldENsZWFudXBTdHJhdGVneShub2RlKS5pc1F1b3RlVmFsdWVzKCkgJiYgKCgoSUNTU1N0eWxlRGVjbEl0ZW0pIG5vZGUuZ2V0UGFyZW50Tm9kZSgpKS5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoUHJvcENNUHJvcGVydHkuUF9GT05UKSB8fCAoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlLmdldFBhcmVudE5vZGUoKSkuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKFByb3BDTVByb3BlcnR5LlBfRk9OVF9GQU1JTFkpIHx8ICgoSUNTU1N0eWxlRGVjbEl0ZW0pIG5vZGUuZ2V0UGFyZW50Tm9kZSgpKS5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoUHJvcENNUHJvcGVydHkuUF9WT0lDRV9GQU1JTFkpKTsKLQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0KLQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlib29sZWFuIHNraXBTcGFjZSA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCAmJiAhc2tpcFNwYWNlKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzdHJCdWYpOwotCQkJCXNraXBTcGFjZSA9IGZhbHNlOwotCQkJCXN0ckJ1Zi5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKQotCQkJCQlza2lwU3BhY2UgPSB0cnVlOwotCQkJfQotCi0JCQlpZiAoYXBwZW5kUXVvdGUpIHsKLQkJCQlzb3VyY2UuYXBwZW5kKHF1b3RlKTsKLQkJCQlTdHJpbmcgc3RyID0gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JCQkJc3RyID0gc3RyLnJlcGxhY2UoJ1wnJywgJyAnKTsKLQkJCQlzdHIgPSBzdHIucmVwbGFjZSgnXCInLCAnICcpOwotCQkJCXN0ciA9IHN0ci50cmltKCk7Ci0JCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQkJCXNvdXJjZS5hcHBlbmQocXVvdGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc291cmNlLmFwcGVuZChzdHJCdWYpOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCUlDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSA9IChJQ1NTUHJpbWl0aXZlVmFsdWUpIG5vZGU7Ci0JCQlzaG9ydCB0eXBlID0gdmFsdWUuZ2V0UHJpbWl0aXZlVHlwZSgpOwotCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQotCQkJU3RyaW5nIHN0ciA9IG51bGw7Ci0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19OVU1CRVIgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BFUkNFTlRBR0UgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VNUyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRVhTIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QWCA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ00gOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01NIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFQgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BDIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ERUcgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JBRCA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfR1JBRCA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTVMgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1MgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0haIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19LSFogOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RJTUVOU0lPTiA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOVEVHRVIgOgotCQkJCQlpZiAodmFsdWUuZ2V0RmxvYXRWYWx1ZSh0eXBlKSA9PSAoKGludCkgdmFsdWUuZ2V0RmxvYXRWYWx1ZSh0eXBlKSkpIHsKLQkJCQkJCXN0ciA9IEludGVnZXIudG9TdHJpbmcoKGludCkgdmFsdWUuZ2V0RmxvYXRWYWx1ZSh0eXBlKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlzdHIgPSBGbG9hdC50b1N0cmluZyh2YWx1ZS5nZXRGbG9hdFZhbHVlKHR5cGUpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVCA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0hBU0ggOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTkhFUklUX1BSSU1JVElWRSA6Ci0JCQkJCXN0ciA9IHZhbHVlLmdldFN0cmluZ1ZhbHVlKCk7Ci0JCQkJCWlmIChzdHIgIT0gbnVsbCkgewotCQkJCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJCQkJc3RyID0gc3RyLnRvVXBwZXJDYXNlKCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJc3RyLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU1RSSU5HIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkkgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0FUVFIgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkFOR0UgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19GT1JNQVQgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19MT0NBTCA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPTU1BIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU0xBU0ggOgotCQkJCQlzdHIgPSB2YWx1ZS5nZXRTdHJpbmdWYWx1ZSgpOwotCQkJfQotCi0JCQlTdHJpbmcgcHJlU3RyID0gbnVsbCwgcG9zdFN0ciA9IG51bGw7Ci0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19BVFRSIDoKLQkJCQkJcHJlU3RyID0gImF0dHIoIjsvLyROT04tTkxTLTEkCi0JCQkJCXBvc3RTdHIgPSAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DTSA6Ci0JCQkJCXBvc3RTdHIgPSAiY20iOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJLy8gY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPVU5URVI6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfREVHIDoKLQkJCQkJcG9zdFN0ciA9ICJkZWciOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TIDoKLQkJCQkJcG9zdFN0ciA9ICJlbSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FWFMgOgotCQkJCQlwb3N0U3RyID0gImV4IjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0dSQUQgOgotCQkJCQlwb3N0U3RyID0gImdyYWQiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSFogOgotCQkJCQlwb3N0U3RyID0gIkh6IjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOIDoKLQkJCQkJcG9zdFN0ciA9ICJpbiI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19LSFogOgotCQkJCQlwb3N0U3RyID0gImtIeiI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NTSA6Ci0JCQkJCXBvc3RTdHIgPSAibW0iOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTVMgOgotCQkJCQlwb3N0U3RyID0gIm1zIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BDIDoKLQkJCQkJcG9zdFN0ciA9ICJwYyI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QRVJDRU5UQUdFIDoKLQkJCQkJcG9zdFN0ciA9ICIlIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BUIDoKLQkJCQkJcG9zdFN0ciA9ICJwdCI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QWCA6Ci0JCQkJCXBvc3RTdHIgPSAicHgiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEIDoKLQkJCQkJcG9zdFN0ciA9ICJyYWQiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJLy8gY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JFQ1Q6Ci0JCQkJLy8gY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JHQkNPTE9SOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1MgOgotCQkJCQlwb3N0U3RyID0gInMiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU1RSSU5HIDoKLQkJCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHN0ciwgcXVvdGUpOwotCQkJCQlwcmVTdHIgPSBxdW90ZTsKLQkJCQkJcG9zdFN0ciA9IHF1b3RlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkkgOgotCQkJCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoc3RyLCBxdW90ZSk7Ci0JCQkJCXByZVN0ciA9ICJ1cmwoIiArIHF1b3RlOy8vJE5PTi1OTFMtMSQKLQkJCQkJcG9zdFN0ciA9IHF1b3RlICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJLy8gdGhlIGZvbGxvd2luZ3MgYXJlIG9yaWdpbmFsIHByaW1pdGl2ZSB2YWx1ZXMKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVCA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVU5LTk9XTiA6Ci0JCQkJLy8gdXNlIHN0cgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTlRFR0VSIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSEFTSCA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NMQVNIIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09NTUEgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RJTUVOU0lPTiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5IRVJJVF9QUklNSVRJVkUgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJBTkdFIDoKLQkJCQkJcHJlU3RyID0gIlUrIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19GT1JNQVQgOgotCQkJCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoc3RyLCBxdW90ZSk7Ci0JCQkJCXByZVN0ciA9ICJmb3JtYXQoIiArIHF1b3RlOy8vJE5PTi1OTFMtMSQKLQkJCQkJcG9zdFN0ciA9IHF1b3RlICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0xPQ0FMIDoKLQkJCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHN0ciwgcXVvdGUpOwotCQkJCQlwcmVTdHIgPSAibG9jYWwoIiArIHF1b3RlOy8vJE5PTi1OTFMtMSQKLQkJCQkJcG9zdFN0ciA9IHF1b3RlICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikgewotCQkJCWlmIChwcmVTdHIgIT0gbnVsbCkKLQkJCQkJcHJlU3RyID0gcHJlU3RyLnRvVXBwZXJDYXNlKCk7Ci0JCQkJaWYgKHBvc3RTdHIgIT0gbnVsbCkKLQkJCQkJcG9zdFN0ciA9IHBvc3RTdHIudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJCWlmIChwcmVTdHIgIT0gbnVsbCkKLQkJCQlzb3VyY2UuYXBwZW5kKHByZVN0cik7Ci0JCQlpZiAoc3RyICE9IG51bGwpCi0JCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQkJaWYgKHBvc3RTdHIgIT0gbnVsbCkKLQkJCQlzb3VyY2UuYXBwZW5kKHBvc3RTdHIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9SR0JGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1JHQkZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjkwOWRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1JHQkZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJHQkZvcm1hdHRlciBleHRlbmRzIEZ1bmN0aW9uRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJHQkZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVJHQkZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bmMoKSB7Ci0JCXJldHVybiAicmdiKCI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFJHQkZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBSR0JGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9SZWN0Rm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9SZWN0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZWM4MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUmVjdEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJlY3RGb3JtYXR0ZXIgZXh0ZW5kcyBGdW5jdGlvbkZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZWN0Rm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JUmVjdEZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bmMoKSB7Ci0JCXJldHVybiAicmVjdCgiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBSZWN0Rm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFJlY3RGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZURlY2xJdGVtRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZURlY2xJdGVtRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2N2M2ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVEZWNsSXRlbUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZURlY2xJdGVtRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHlsZURlY2xJdGVtRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JU3R5bGVEZWNsSXRlbUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kQWZ0ZXJDb2xvblNwYWNlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpbnQgbiA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BPU1RfREVMSU0pOwotCi0JCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSA+IDAgJiYgKCFwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKSB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkpIHsKLQkJCWludCBsZW5ndGggPSBnZXRMYXN0TGluZUxlbmd0aChub2RlLCBzb3VyY2UpOwotCQkJaW50IGFwcGVuZCA9IGdldEZpcnN0Q2hpbGRSZWdpb25MZW5ndGgobm9kZSk7Ci0JCQlpZiAobGVuZ3RoICsgbiArIGFwcGVuZCA+IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKSB7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRMaW5lRGVsaW1pdGVyKG5vZGUpKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJbiA9IDA7IC8vIG5vIHNwYWNlIGlzIG5lY2Vzc2FyeQotCQkJfQotCQl9Ci0JCS8vIG5vIGRlbGltaXRlciBjYXNlCi0JCXdoaWxlIChuLS0gPiAwKQotCQkJc291cmNlLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGludCBnZXRGaXJzdENoaWxkUmVnaW9uTGVuZ3RoKElDU1NOb2RlIG5vZGUpIHsKLQkJSUNTU05vZGUgZmlyc3RDaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoZmlyc3RDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIDE7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgZmlyc3RDaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJUmVnaW9uSXRlcmF0b3IgaXRyID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIHN0YXJ0KTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZyA9IGl0ci5uZXh0KCk7Ci0JCQlpZiAocmVnICE9IG51bGwgJiYgcmVnLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQlyZXR1cm4gcmVnLmdldFRleHRMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQlpZiAoIUlDU1NTdHlsZURlY2xJdGVtLklNUE9SVEFOVC5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBidWY7Ci0KLQkJLy8gZ2V0IHJlZ2lvbiB0byByZXBsYWNlCi0JCWlmIChjb250ZXh0ICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJaXQucHJldigpOwotCQkJCWlmIChpdC5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcHJldiA9IGl0LnByZXYoKTsKLQkJCQkJaWYgKHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKQotCQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHByZXYpOwotCQkJCQllbHNlCi0JCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQl9IGVsc2UKLQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCWNvbnRleHQuZW5kID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGdlbmVyYXRlIHRleHQKLQkJaWYgKGluc2VydCAmJiBhdHRyLmdldFZhbHVlKCkgIT0gbnVsbCAmJiBhdHRyLmdldFZhbHVlKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBhdHRyLmdldFZhbHVlKCksIGJ1Zik7Ci0JCQlidWYuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSwgSVJlZ2lvbiBleGNlcHRGb3IpIHsKLQkJSUNTU05vZGUgcHJldiA9IChjaGlsZCAhPSBudWxsKSA/IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpIDogbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaW50IHN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldEVuZE9mZnNldCgpIDogMDsKLQkJaW50IGVuZCA9IChjaGlsZCAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCQlpZiAoc3RhcnQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7Ci0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJLy8gZ2V0IG1lYW5pbmcgcmVnaW9ucwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCWlmIChleGNlcHRGb3IgPT0gbnVsbCkKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQllbHNlIHsKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgZXhjZXB0Rm9yLCBudWxsKTsKLQkJCX0KLQkJCS8vIGdlbmVyYXRlIHNvdXJjZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAyLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkvLyBiZQotCQkJCS8vIGNvbW1lbnRzCi0JCQl9Ci0JCX0KLQkJaWYoY2hpbGQgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBhcHBlbmQgPSB0cnVlOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSUNTU1ByaW1pdGl2ZVZhbHVlKSB7Ci0JCQkJaWYgKCgoSUNTU1ByaW1pdGl2ZVZhbHVlKSBjaGlsZCkuZ2V0UHJpbWl0aXZlVHlwZSgpID09IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09NTUEpCi0JCQkJCXRvQXBwZW5kID0gIiwiOy8vJE5PTi1OTFMtMSQKLQkJCQllbHNlIGlmICgoKElDU1NQcmltaXRpdmVWYWx1ZSkgY2hpbGQpLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NMQVNIKQotCQkJCQl0b0FwcGVuZCA9ICIvIjsvLyROT04tTkxTLTEkCi0JCQkJSUNTU05vZGUgcHJldlNpYmxpbmcgPSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCQlpZiAocHJldlNpYmxpbmcgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUgJiYgKChJQ1NTUHJpbWl0aXZlVmFsdWUpcHJldlNpYmxpbmcpLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NMQVNIKQotCQkJCQlhcHBlbmQgPSBmYWxzZTsKLQkJCX0KLQkJCWlmICh0b0FwcGVuZCAhPSBudWxsICYmICF0b0FwcGVuZC5lcXVhbHMoIiwiKSAmJiAhdG9BcHBlbmQuZXF1YWxzKCIvIikgJiYgYXBwZW5kKSB7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gcmVnaW9uLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDIsIHN0Z3kpKTsgLy8gbXVzdCBiZQotCQkJLy8gY29tbWVudHMKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmICgoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpID09IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJCWlmICh0b0FwcGVuZCAhPSAiLCIgJiYgdG9BcHBlbmQgIT0gIi8iKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IChub2RlLmdldExhc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAoZW5kID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJLy8gYXBwZW5kICIhaW1wb3J0YW50IgotCQkJU3RyaW5nIHByaW9yaXR5ID0gKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJpb3JpdHkoKTsKLQkJCWlmIChwcmlvcml0eSAhPSBudWxsICYmIHByaW9yaXR5Lmxlbmd0aCgpID4gMCkgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHByaW9yaXR5LCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQocHJpb3JpdHkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wTmFtZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRvZSBzb3VyY2UKLQkJCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW0gPSAoSUNTU1N0eWxlRGVjbEl0ZW0pIG5vZGU7Ci0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCXNvdXJjZS5hcHBlbmQoaXRlbS5nZXRQcm9wZXJ0eU5hbWUoKS50b1VwcGVyQ2FzZSgpKTsKLQkJCWVsc2UKLQkJCQlzb3VyY2UuYXBwZW5kKGl0ZW0uZ2V0UHJvcGVydHlOYW1lKCkpOwotCi0JCQlpbnQgayA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BSRV9ERUxJTSk7Ci0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkgPiAwICYmICghcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUikgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpKSB7Ci0JCQkJaW50IGxlbmd0aCA9IGdldExhc3RMaW5lTGVuZ3RoKG5vZGUsIHNvdXJjZSk7Ci0JCQkJaW50IGFwcGVuZCA9IDE7Ci0JCQkJaWYgKGxlbmd0aCArIGsgKyBhcHBlbmQgPiBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSkgewotCQkJCQlzb3VyY2UuYXBwZW5kKGdldExpbmVEZWxpbWl0ZXIobm9kZSkpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJCQlrID0gMDsgLy8gbm8gc3BhY2UgaXMgbmVjZXNzYXJ5Ci0JCQkJfQotCQkJfQotCQkJLy8gbm8gZGVsaW1pdGVyIGNhc2UKLQkJCXdoaWxlIChrLS0gPiAwKQotCQkJCXNvdXJjZS5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQlzb3VyY2UuYXBwZW5kKCI6Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICghaXNDbGVhbnVwKCkgfHwgZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpLmlzRm9ybWF0U291cmNlKCkpIHsKLQkJCWFwcGVuZEFmdGVyQ29sb25TcGFjZShub2RlLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BOYW1lUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmIChpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikgJiYgKCFpc0NsZWFudXAoKSB8fCBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkuaXNGb3JtYXRTb3VyY2UoKSkpIHsKLQkJCQlhcHBlbmRBZnRlckNvbG9uU3BhY2Uobm9kZSwgc291cmNlKTsKLQkJCX0gZWxzZQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdFZhbHVlKElDU1NOb2RlIG5vZGUpIHsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9ybWF0Q2hpbGRyZW4obm9kZSwgc291cmNlKTsKLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyTmFtZSA9PSBudWxsIHx8IGF0dHJOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaWYgKCFJQ1NTU3R5bGVEZWNsSXRlbS5JTVBPUlRBTlQuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElDU1NTdHlsZURlY2xJdGVtLklNUE9SVEFOVCk7Ci0JCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCQlJbmRleGVkUmVnaW9uIGlOb2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpTm9kZS5nZXRFbmRPZmZzZXQoKSA8PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCUNvbXBvdW5kUmVnaW9uIHJlZ2lvbnNbXSA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMobm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgbmV3IEZvcm1hdFJlZ2lvbihpTm9kZS5nZXRTdGFydE9mZnNldCgpLCBpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpLCBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkpOwotCQlmb3IgKGludCBpID0gcmVnaW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQpCi0JCQkJcmV0dXJuIHJlZ2lvbnNbaV0uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gaU5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPCAwKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCAmJiBmbGF0Tm9kZS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJbiAtPSBmbGF0Tm9kZS5nZXRMZW5ndGgoKTsKLQkJfQotCQlpZiAobiA+IDApIHsKLQkJCVN0cmluZyBpbXBvcnRhbnQgPSAoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlKS5nZXRQcmlvcml0eSgpOwotCQkJaWYgKGltcG9ydGFudCAhPSBudWxsICYmIGltcG9ydGFudC5sZW5ndGgoKSA+IDApIHsKLQkJCQkvLyBmaW5kIGJlZm9yZSAiIWltcG9ydGFudCIgcG9zaXRpb24KLQkJCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSkpOwotCQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXQucHJldigpOwotCQkJCQlpZiAoaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gZmxhdE5vZGUpCi0JCQkJCQlicmVhazsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCkKLQkJCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCS8vIHNraXAgbGFzdCBzcGFjZQotCQkJZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCW4gLT0gcmVnaW9uLmdldExlbmd0aCgpIC0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCX0KLQotCQkJcmV0dXJuIG47Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgU3R5bGVEZWNsSXRlbUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJaWYgKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQlpbmRlbnRDaGFyID0gJ1x0JzsKLQkJCX0KLQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZW50LnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmM5Mjg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSwgSVJlZ2lvbiBleGNlcHRGb3IpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSUNTU05vZGUgcHJldiA9IChjaGlsZCAhPSBudWxsKSA/IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpIDogbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaW50IHN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldEVuZE9mZnNldCgpIDogMDsKLQkJaW50IGVuZCA9IChjaGlsZCAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCi0JCS8vIGNoZWNrIG5vIGNoaWxkCi0JCWlmIChjaGlsZCA9PSBudWxsICYmIHByZXYgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoc3RhcnQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlDU1NNb2RlbCBjc3NNb2RlbCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCQkvLyBCVUcyMDI2MTUgLSBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3R5bGUgZGVjbGFyYXRpb24gd2l0aCBubwotCQkJLy8gbW9kZWwgYXNzb2NpYXRlZCB3aXRoIGl0Ci0JCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gY3NzTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCS8vIGdldCBtZWFuaW5nIHJlZ2lvbnMKLQkJCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCQkJaWYgKGV4Y2VwdEZvciA9PSBudWxsKQotCQkJCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJCQllbHNlIHsKLQkJCQkJCVN0cmluZyBwaWNrdXBUeXBlID0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUjsKLQkJCQkJCWlmIChwcmV2ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCQkJCQlwaWNrdXBUeXBlID0gbnVsbDsKLQkJCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBleGNlcHRGb3IsIHBpY2t1cFR5cGUpOwotCQkJCQl9Ci0JCQkJCS8vIGV4dHJhY3Qgc291cmNlCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCQkJLy8gYmUgY29tbWVudHMKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChwcmV2ICE9IG51bGwgJiYgY2hpbGQgIT0gbnVsbCkgeyAvLyBnZW5lcmF0ZSBzb3VyY2UgOgotCQkJLy8gYmV0d2VlbiB0d28gZGVjbGFyYXRpb25zCi0JCQkvLyBCVUc5MzAzNy1wcm9wZXJ0aWVzIHZpZXcgYWRkcyBleHRyYSA7IHdoZW4gYWRkIG5ldyBwcm9wZXJ0eQotCQkJYm9vbGVhbiBzZW1pY29sb25Gb3VuZCA9IGZhbHNlOwotCi0JCQlJQ1NTTW9kZWwgY3NzTW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJLy8gQlVHMjAyNjE1IC0gaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIHN0eWxlIGRlY2xhcmF0aW9uIHdpdGggbm8KLQkJCS8vIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCBpdAotCQkJaWYgKGNzc01vZGVsICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNzc01vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQlpbnQgcHJldlN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCQkJCQlpbnQgcHJldkVuZCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHByZXZTdGFydCwgcHJldkVuZCAtIHByZXZTdGFydCksIHN0Z3kpOwotCQkJCQlpbnQgaSA9IHJlZ2lvbnMubGVuZ3RoIC0gMTsKLQkJCQkJd2hpbGUgKGkgPj0gMCAmJiAhc2VtaWNvbG9uRm91bmQpIHsKLQkJCQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKQotCQkJCQkJCXNlbWljb2xvbkZvdW5kID0gdHJ1ZTsKLQkJCQkJCS0taTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICghc2VtaWNvbG9uRm91bmQpCi0JCQkJc291cmNlLmFwcGVuZCgiOyIpOy8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwcmV2ID09IG51bGwpIHsgLy8gZ2VuZXJhdGUgc291cmNlIDogYmVmb3JlIHRoZSBmaXJzdAotCQkJLy8gZGVjbGFyYXRpb24KLQkJCW9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yIGl0ID0gbnVsbDsKLQkJCWlmIChlbmQgPiAwKSB7Ci0JCQkJSUNTU01vZGVsIGNzc01vZGVsID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJCQkvLyBCVUcyMDI2MTUgLSBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3R5bGUgZGVjbGFyYXRpb24gd2l0aAotCQkJCS8vIG5vIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCBpdAotCQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gY3NzTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkJaXQgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3Ioc3RydWN0dXJlZERvY3VtZW50LCBlbmQgLSAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW50IHBvcyA9IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQkJCWlmIChwb3MgPj0gMCkgewotCQkJCQlJQ1NTTW9kZWwgY3NzTW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJCQkvLyBCVUcyMDI2MTUgLSBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3R5bGUgZGVjbGFyYXRpb24KLQkJCQkJLy8gd2l0aCBubyBtb2RlbCBhc3NvY2lhdGVkIHdpdGggaXQKLQkJCQkJaWYgKGNzc01vZGVsICE9IG51bGwpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gY3NzTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJCQlpdCA9IG5ldyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvcyAtIDEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGl0ICE9IG51bGwpIHsKLQkJCQlpbnQgbGltaXQgPSAoKEluZGV4ZWRSZWdpb24pICgobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkgPyBub2RlLmdldFBhcmVudE5vZGUoKSA6IG5vZGUpKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gY3VyUmVnID0gaXQucHJldigpOwotCQkJCQlpZiAoY3VyUmVnLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IGN1clJlZy5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikKLQkJCQkJCWJyZWFrOwotCQkJCQlpZiAoY3VyUmVnLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBjdXJSZWcuZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlzb3VyY2UuYXBwZW5kKCI7Iik7Ly8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGN1clJlZykgPD0gbGltaXQpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY2hpbGQgPT0gbnVsbCkgeyAvLyBnZW5lcmF0ZSBzb3VyY2UgOiBhZnRlciB0aGUgbGFzdAotCQkJLy8gZGVjbGFyYXRpb24KLQkJCW9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yIGl0ID0gbnVsbDsKLQkJCWlmIChzdGFydCA+IDApIHsKLQkJCQlJQ1NTTW9kZWwgY3NzTW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJCS8vIEJVRzIwMjYxNSAtIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBzdHlsZSBkZWNsYXJhdGlvbiB3aXRoCi0JCQkJLy8gbm8gbW9kZWwgYXNzb2NpYXRlZCB3aXRoIGl0Ci0JCQkJaWYgKGNzc01vZGVsICE9IG51bGwpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjc3NNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCQlpdCA9IG5ldyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW50IHBvcyA9IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQkJCWlmIChwb3MgPj0gMCkgewotCQkJCQlJQ1NTTW9kZWwgY3NzTW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJCQkvLyBCVUcyMDI2MTUgLSBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3R5bGUgZGVjbGFyYXRpb24KLQkJCQkJLy8gd2l0aCBubyBtb2RlbCBhc3NvY2lhdGVkIHdpdGggaXQKLQkJCQkJaWYgKGNzc01vZGVsICE9IG51bGwpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gY3NzTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJCQlpdCA9IG5ldyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXQgIT0gbnVsbCkgewotCQkJCWludCBsaW1pdCA9ICgoSW5kZXhlZFJlZ2lvbikgKChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSA/IG5vZGUuZ2V0UGFyZW50Tm9kZSgpIDogbm9kZSkpLmdldEVuZE9mZnNldCgpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gY3VyUmVnID0gaXQubmV4dCgpOwotCQkJCQlpZiAoY3VyUmVnLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IGN1clJlZy5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikKLQkJCQkJCWJyZWFrOwotCQkJCQlpZiAoY3VyUmVnLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBjdXJSZWcuZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQkvLyBCdWcgMjE5MDA0IC0gQmVmb3JlIGFwcGVuZGluZyBhIDssIG1ha2Ugc3VyZSB0aGF0IHRoZXJlCi0JCQkJCQkvLyBpc24ndCBvbmUgYWxyZWFkeQotCQkJCQkJYm9vbGVhbiBzZW1pY29sb25Gb3VuZCA9IGZhbHNlOwotCQkJCQkJd2hpbGUoaXQuaGFzTmV4dCgpICYmICFzZW1pY29sb25Gb3VuZCkgewotCQkJCQkJCWlmKGl0Lm5leHQoKS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikKLQkJCQkJCQkJc2VtaWNvbG9uRm91bmQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZighc2VtaWNvbG9uRm91bmQpCi0JCQkJCQkJc291cmNlLmFwcGVuZCgiOyIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChsaW1pdCA8PSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoY3VyUmVnKSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJaWYgKCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkgewotCQkJCS8vIGdldCBuZXh0IHJlZ2lvbgotCQkJCWludCBwb3MgPSBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJCQlDb21wb3VuZFJlZ2lvbiB0b0FwcGVuZFJlZ2lvbiA9IG51bGw7Ci0JCQkJaWYgKHBvcyA+PSAwKSB7Ci0JCQkJCUlDU1NNb2RlbCBjc3NNb2RlbCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCQkJCS8vIEJVRzIwMjYxNSAtIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBzdHlsZSBkZWNsYXJhdGlvbgotCQkJCQkvLyB3aXRoIG5vIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCBpdAotCQkJCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjc3NNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocG9zKTsKLQkJCQkJCQl0b0FwcGVuZFJlZ2lvbiA9IG5ldyBDb21wb3VuZFJlZ2lvbihmbGF0Tm9kZSwgZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocG9zKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZS5nZXRQYXJlbnROb2RlKCksIHRvQXBwZW5kUmVnaW9uLCBzb3VyY2UpOwotCQkJfQotCQl9IGVsc2UgaWYgKChwcmV2ICE9IG51bGwgfHwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA8PSAwKSkgewotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSkgJiYgKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpICE9IG5vZGUgfHwgIXByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJZWxzZSBpZiAocHJldiAhPSBudWxsIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpICE9IG5vZGUpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gcmVnaW9uLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSUNTU01vZGVsIGNzc01vZGVsID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJLy8gQlVHMjAyNjE1IC0gaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIHN0eWxlIGRlY2xhcmF0aW9uCi0JCS8vIHdpdGggbm8gbW9kZWwgYXNzb2NpYXRlZCB3aXRoIGl0Ci0JCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNzc01vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNvbW1lbnRzCi0JCQkJfQotCQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCQkJaWYgKCgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpICYmIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUpICYmIChub2RlLmdldE93bmVyRG9jdW1lbnQoKSAhPSBub2RlIHx8ICFwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKSkpIHsKLQkJCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlpbnQgcG9zID0gc3VwZXIuZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChwb3MgPCAwKSB7Ci0JCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gZ2V0UGFyZW50Rm9ybWF0dGVyKG5vZGUpOwotCQkJcmV0dXJuIChmb3JtYXR0ZXIgIT0gbnVsbCkgPyBmb3JtYXR0ZXIuZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZS5nZXRQYXJlbnROb2RlKCkpIDogLTE7Ci0JCX0KLQkJcmV0dXJuIHBvczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFN0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGhUb1JlZm9ybWF0QWZ0ZXIoSUNTU05vZGUgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCUluZGV4ZWRSZWdpb24gbm5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGluc2VydFBvcyA8IDAgfHwgIW5ub2RlLmNvbnRhaW5zKGluc2VydFBvcykpIHsKLQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsICYmIG5ub2RlLmdldEVuZE9mZnNldCgpIDw9IDApIHsKLQkJCQlDU1NTb3VyY2VHZW5lcmF0b3IgcG50Rm9ybWF0dGVyID0gZ2V0UGFyZW50Rm9ybWF0dGVyKG5vZGUpOwotCQkJCWlmIChwbnRGb3JtYXR0ZXIgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHBudEZvcm1hdHRlci5nZXRMZW5ndGhUb1JlZm9ybWF0QWZ0ZXIobm9kZS5nZXRQYXJlbnROb2RlKCksIGluc2VydFBvcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKG5vZGUsIGluc2VydFBvcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCUluZGV4ZWRSZWdpb24gbm5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGluc2VydFBvcyA8PSAwIHx8ICFubm9kZS5jb250YWlucyhpbnNlcnRQb3MgLSAxKSkgewotCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwgJiYgbm5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkgewotCQkJCUNTU1NvdXJjZUdlbmVyYXRvciBwbnRGb3JtYXR0ZXIgPSBnZXRQYXJlbnRGb3JtYXR0ZXIobm9kZSk7Ci0JCQkJaWYgKHBudEZvcm1hdHRlciAhPSBudWxsKQotCQkJCQlyZXR1cm4gcG50Rm9ybWF0dGVyLmdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUobm9kZS5nZXRQYXJlbnROb2RlKCksIGluc2VydFBvcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TGVuZ3RoVG9SZWZvcm1hdEJlZm9yZShub2RlLCBpbnNlcnRQb3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZVJ1bGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlUnVsZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2E5OGI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlUnVsZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlUnVsZUZvcm1hdHRlciBleHRlbmRzIERlY2xDb250YWluZXJGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3R5bGVSdWxlRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JU3R5bGVSdWxlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IGNvbnRleHQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gYnVmOwotCi0JCWlmICghSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBidWY7Ci0KLQkJLy8gZ2V0IHJlZ2lvbiB0byByZXBsYWNlCi0JCWlmIChjb250ZXh0ICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJCWl0Lm5leHQoKTsKLQkJCQlpZiAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIG5leHQgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChuZXh0LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5leHQpOwotCQkJCQllbHNlCi0JCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWNvbnRleHQuZW5kID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCWNvbnRleHQuZW5kID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGdlbmVyYXRlIHRleHQKLQkJaWYgKGluc2VydCkgewotCQkJYnVmLmFwcGVuZChhdHRyLmdldFZhbHVlKCkpOwotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgIiIsIGJ1Zik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRTcGFjZUJldHdlZW4obm9kZSwgcmVnaW9uc1tpIC0gMV0sIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRTZWxlY3RvclJlZ2lvbihyZWdpb25zW2ldLCAoaSAhPSAwKSA/IHJlZ2lvbnNbaSAtIDFdIDogbnVsbCwgc3RneSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCVN0cmluZyBzdHIgPSAoKElDU1NTdHlsZVJ1bGUpIG5vZGUpLmdldFNlbGVjdG9yVGV4dCgpOwotCQkJLy8gYXBwZW5kU3BhY2VCZWZvcmUobm9kZSxzdHIsc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICJ7Iiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCQlzb3VyY2UuYXBwZW5kKCJ7Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCAoaSA9PSAwKSA/IG91dHNpZGVbMF0gOiByZWdpb25zW2kgLSAxXSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkU2VsZWN0b3JSZWdpb24ocmVnaW9uc1tpXSwgKGkgIT0gMCkgPyByZWdpb25zW2kgLSAxXSA6IG51bGwsIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmIChpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCWVsc2UKLQkJCQlhcHBlbmRTcGFjZUJldHdlZW4obm9kZSwgcmVnaW9uc1tyZWdpb25zLmxlbmd0aCAtIDFdLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHJOYW1lID09IG51bGwgfHwgYXR0ck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlpZiAoIUlDU1NTdHlsZVJ1bGUuU0VMRUNUT1IuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElDU1NTdHlsZVJ1bGUuU0VMRUNUT1IpOwotCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJZWxzZQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTdHlsZVJ1bGVGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgU3R5bGVSdWxlRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZVNoZWV0Rm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZVNoZWV0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYjk1YzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVTaGVldEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZVNoZWV0Rm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3R5bGVTaGVldEZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0eWxlU2hlZXRGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCVN0cmluZyBkZWxpbSA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSk7Ci0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWlmIChwcmV2ID09IG51bGwgJiYgY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IHN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldEVuZE9mZnNldCgpIDogMDsKLQkJaW50IGVuZCA9IChjaGlsZCAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCQlpZiAoc3RhcnQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7Ci0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJLy8gZ2V0IG1lYW5pbmcgcmVnaW9ucwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCWlmIChleGNlcHRGb3IgPT0gbnVsbCkKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgcGlja3VwVHlwZSA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVI7Ci0JCQkJaWYgKHByZXYgPT0gbnVsbCkKLQkJCQkJcGlja3VwVHlwZSA9IG51bGw7Ci0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIGV4Y2VwdEZvciwgcGlja3VwVHlwZSk7Ci0JCQl9Ci0JCQkvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCQlpZiAocmVnaW9ucy5sZW5ndGggPiAwICYmICFyZWdpb25zWzBdLmdldFR5cGUoKS5lcXVhbHMoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpKQotCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zWzBdLCBzb3VyY2UpOwotCQkJCWVsc2UgaWYgKHJlZ2lvbnMubGVuZ3RoID09IDApIHsKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCQkJCQkJCQkJCQkJCQkJLy8gYmUKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNvbW1lbnRzCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBvcgotCQkJCQkJCQkJCQkJCQkJCQkJLy8gc2VtaV9jb2xvbgotCQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSKSB7Ci0JCQkJCS8vIGFwcGVuZCBkZWxpbSBhZnRlcgotCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChwcmV2ICE9IG51bGwpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJfQotCQllbHNlIGlmIChwcmV2ICE9IG51bGwgJiYgY2hpbGQgIT0gbnVsbCkgeyAvLyBzb3VyY2UgZ2VuZXJhdGlvbiA6Ci0JCQkJCQkJCQkJCQkJLy8gYmV0d2VlbiB0d28gcnVsZXMKLQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCX0KLQkJZWxzZSBpZiAoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCWlmIChwcmV2ID09IG51bGwpIHsgLy8gc291cmNlIGZvcm1hdHRpbmcgOiBiZWZvcmUgdGhlIGZpcnN0IHJ1bGUKLQkJCQlJQ1NTTm9kZSBuZXh0ID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpbnQgcG9zID0gZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCQkJaWYgKG5leHQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5leHQpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCQkJcG9zID0gKChJbmRleGVkUmVnaW9uKSBuZXh0KS5nZXRTdGFydE9mZnNldCgpOwotCQkJCWlmIChwb3MgIT0gMCkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCUNvbXBvdW5kUmVnaW9uW10gcHJldlJlZ2lvbnMgPSBnZXRSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbigwLCBwb3MpLCBudWxsLCBudWxsKTsKLQkJCQkJaWYgKHByZXZSZWdpb25zICE9IG51bGwgJiYgcHJldlJlZ2lvbnMubGVuZ3RoID4gMCkKLQkJCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoY2hpbGQgPT0gbnVsbCkgeyAvLyBzb3VyY2UgZm9ybWF0dGluZyA6IGFmdGVyIHRoZSBsYXN0Ci0JCQkJCQkJCQkJLy8gcnVsZQotCQkJCWlmIChzdGFydCA+IDAgJiYgc3RhcnQgPD0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJCX0KLQkJCQllbHNlIGlmIChzdGFydCA8PSAwKSB7Ci0JCQkJCWludCBwb3MgPSBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJCQkJaWYgKHBvcyA8ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gcmVnaW9uLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdCBiZQotCQkJCQkJCQkJCQkJCQkJCQkvLyBjb21tZW50cwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJaWYgKCgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IChub2RlLmdldExhc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAoZW5kID4gMCAmJiBzdGFydCA8IGVuZCkgewotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCQl9Ci0JCQlpZiAoKHJlZ2lvbnMgIT0gbnVsbCAmJiByZWdpb25zLmxlbmd0aCA+IDAgJiYgcmVnaW9uc1tyZWdpb25zLmxlbmd0aCAtIDFdLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RDKSB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVNQkVEREVEKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCX0KLQkJZWxzZSB7IC8vIHNvdXJjZSBnZW5lcmF0aW9uCi0JCQlpZiAobm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSAhPSBudWxsICYmIG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCXJldHVybjsgLy8gbm90aGluZwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZSBub2RlLCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAoZW5kID4gMCkgewotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCB8fCByZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RPIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpCi0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQkJfQotCQkJaWYgKG5vZGUuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiAoc291cmNlLmxlbmd0aCgpID4gMCB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVNQkVEREVEKSkgewotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSAhPSBudWxsICYmIG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpIHsKLQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQkvLyBzb3VyY2UuYXBwZW5kKCI8IS0tIik7Ci0JCQkvLyBhcHBlbmREZWxpbUJlZm9yZShub2RlLG51bGwsIHNvdXJjZSk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuOyAvLyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSB8fCByZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RPIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmIChpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpIHsKLQkJCQlpZiAoc291cmNlLmxlbmd0aCgpID4gMCB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVNQkVEREVEKSB7Ci0JCQkJCVN0cmluZyBkZWxpbSA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWcgPSBpdC5wcmV2KCk7Ci0JCQkJaWYgKHJlZy5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQykKLQkJCQkJcmV0dXJuIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbjsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgU3R5bGVTaGVldEZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBTdHlsZVNoZWV0Rm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Vbmtub3duUnVsZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvVW5rbm93blJ1bGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhYmVmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Vbmtub3duUnVsZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVW5rbm93blJ1bGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFVua25vd25SdWxlRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBVbmtub3duUnVsZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVVua25vd25SdWxlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJQ1NTVW5rbm93blJ1bGUgcnVsZSA9IChDU1NVbmtub3duUnVsZSkgbm9kZTsKLQkJCXNvdXJjZS5hcHBlbmQocnVsZS5nZXRDc3NUZXh0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFVua25vd25SdWxlRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFVua25vd25SdWxlRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNhdGVnb3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYWMxNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1DYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1DYXRlZ29yeSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQlTdHJpbmcgZ2V0Q2FwdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1DaGFyc2V0UnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1DaGFyc2V0UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODZkNDY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ2hhcnNldFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTUNoYXJzZXRSdWxlIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkYjVkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NQ29udGFpbmVyIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODc5NzkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NRGVzY3JpcHRvciBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQlJdGVyYXRvciBnZXRWYWx1ZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRm9udEZhY2VSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUZvbnRGYWNlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZThkZmYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRm9udEZhY2VSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1Gb250RmFjZVJ1bGUgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRnVuY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRnVuY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJlNzA2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUZ1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1GdW5jdGlvbiBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQlTdHJpbmcgZ2V0RnVuY3Rpb25TdHJpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NSW1wb3J0UnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1JbXBvcnRSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YmQyYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1JbXBvcnRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1JbXBvcnRSdWxlIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUtleXdvcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NS2V5d29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDgzN2ZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NS2V5d29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NS2V5d29yZCBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQlTdHJpbmcgZ2V0S2V5d29yZFN0cmluZygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1NZWRpYVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTWVkaWFSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNmI3ZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1NZWRpYVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTU1lZGlhUnVsZSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhNTg2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGludGVyZmFjZSBDU1NNTU5vZGUgewotCVN0cmluZyBnZXRUeXBlKCk7Ci0KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQlTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKTsKLQotCUl0ZXJhdG9yIGdldENoaWxkTm9kZXMoKTsKLQotCUl0ZXJhdG9yIGdldERlc2NlbmRhbnRzKCk7Ci0KLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgX1BSRUZJWCA9ICJDU1NNTS4iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0tFWVdPUkQgPSBfUFJFRklYICsgIktleXdvcmQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1VOSVQgPSBfUFJFRklYICsgIlVuaXQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0ZVTkNUSU9OID0gX1BSRUZJWCArICJGdW5jdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU1RSSU5HID0gX1BSRUZJWCArICJTdHJpbmciOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1NUWUxFX1NIRUVUID0gX1BSRUZJWCArICJTdHlsZVNoZWV0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9QUk9QRVJUWSA9IF9QUkVGSVggKyAiUHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0RFU0NSSVBUT1IgPSBfUFJFRklYICsgIkRlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0NPTlRBSU5FUiA9IF9QUkVGSVggKyAiQ29udGFpbmVyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9OVU1CRVIgPSBfUFJFRklYICsgIk51bWJlciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU0VQQVJBVE9SID0gX1BSRUZJWCArICJTZXBhcmF0b3IiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0NIQVJTRVRfUlVMRSA9IF9QUkVGSVggKyAiQ2hhcnNldFJ1bGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0lNUE9SVF9SVUxFID0gX1BSRUZJWCArICJJbXBvcnRSdWxlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TVFlMRV9SVUxFID0gX1BSRUZJWCArICJTdHlsZVJ1bGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01FRElBX1JVTEUgPSBfUFJFRklYICsgIk1lZGlhUnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfUEFHRV9SVUxFID0gX1BSRUZJWCArICJQYWdlUnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRk9OVF9GQUNFX1JVTEUgPSBfUFJFRklYICsgIkZvbnRGYWNlUnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQ0FURUdPUlkgPSBfUFJFRklYICsgIkNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NRVRBX01PREVMID0gX1BSRUZJWCArICJNZXRhTW9kZWwiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1NFTEVDVE9SID0gX1BSRUZJWCArICJTZWxlY3RvciI7IC8vJE5PTi1OTFMtMSQJCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU51bWJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1OdW1iZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjMGY1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU51bWJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NTnVtYmVyIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVBhZ2VSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVBhZ2VSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YTA4NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1QYWdlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NUGFnZVJ1bGUgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NUHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkyZjcyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1Qcm9wZXJ0eSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQlTdHJpbmcgZ2V0Q2F0ZWdvcnlOYW1lKCk7Ci0KLQlJdGVyYXRvciBnZXRWYWx1ZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU2VsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQzYmJjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVNlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotcHVibGljIGludGVyZmFjZSBDU1NNTVNlbGVjdG9yIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQlTdHJpbmcgZ2V0U2VsZWN0b3JUeXBlKCk7Ci0KLQlTdHJpbmcgZ2V0U2VsZWN0b3JTdHJpbmcoKTsKLQotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VYUFJFU1NJT04gPSAiRXhwcmVzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfUFNFVURPX0NMQVNTID0gIlBzZXVkb0NsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9QU0VVRE9fRUxFTUVOVCA9ICJQc2V1ZG9FbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gZW1iZWRkZWQgZXhwcmVzc2lvbiB0eXBlCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX0RFU0NFTkRBTlQgPSAiZGVzY2VuZGFudCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fQ0hJTEQgPSAiY2hpbGQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX0FESkFDRU5UID0gImFkamFjZW50IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9VTklWRVJTQUwgPSAidW5pdmVyc2FsIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9BVFRSSUJVVEUgPSAiYXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHJpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkODM3NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTVN0cmluZyBleHRlbmRzIENTU01NTm9kZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU3R5bGVSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0eWxlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWQ3NDliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU3R5bGVSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1TdHlsZVJ1bGUgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU3R5bGVTaGVldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHlsZVNoZWV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOGIyYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHlsZVNoZWV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1TdHlsZVNoZWV0IGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVVuaXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDdkMTA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NVW5pdCBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQlTdHJpbmcgZ2V0VW5pdFN0cmluZygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTWV0YU1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNZXRhTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3MDQ4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNZXRhTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGludGVyZmFjZSBDU1NNZXRhTW9kZWwgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0JLy8gcHVibGljIGludGVyZmFjZSBDU1NNZXRhTW9kZWwgewotCUNTU01NU3R5bGVTaGVldCBnZXRTdHlsZVNoZWV0KCk7Ci0KLQkvKgotCSAqIFNob3J0Y3V0IHRvIGFjY2VzcyBwcm9wZXJ0eSBub2RlCi0JICovCi0JLy8gSXRlcmF0b3IgZ2V0UHJvcGVydGllcygpOwotCS8vIEl0ZXJhdG9yIGdldERlc2NyaXB0b3JzKCk7Ci0JLy8gQ1NTTU1Qcm9wZXJ0eSBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQkvKgotCSAqIGFjY2VzcyB0byBjYXRlZ29yeSBpbmZvcm1hdGlvbgotCSAqLwotCUl0ZXJhdG9yIGdldENhdGVnb3JpZXMoKTsKLQotCS8qCi0JICogVXRpbGl0aWVzCi0JICovCi0JLy8gSXRlcmF0b3IgY29sbGVjdE5vZGVzQnlUeXBlKFN0cmluZyB0eXBlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU1Byb2ZpbGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU1Byb2ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJkYzlmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NQcm9maWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLQotcHVibGljIGludGVyZmFjZSBDU1NQcm9maWxlIHsKLQotCVN0cmluZyBnZXRQcm9maWxlSUQoKTsKLQotCVN0cmluZyBnZXRQcm9maWxlTmFtZSgpOwotCi0JVVJMIGdldFByb2ZpbGVVUkwoKTsKLQotCUNTU01ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKTsKLQotCWJvb2xlYW4gaXNEZWZhdWx0KCk7Ci0KLQlTdHJpbmcgZ2V0T3duZXJQbHVnaW5JRCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTUHJvZmlsZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NQcm9maWxlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzNmE5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NQcm9maWxlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGwuUmVnaXN0cnlSZWFkZXI7Ci0KLXB1YmxpYyBjbGFzcyBDU1NQcm9maWxlUmVnaXN0cnkgewotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENTU1Byb2ZpbGVSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTUHJvZmlsZVJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0JCi0Jc3RhdGljIGNsYXNzIFByb2ZpbGVOYW1lQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlzdGF0aWMgQ29sbGF0b3IgZGVsZWdhdGUgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJaWYgKG8xIGluc3RhbmNlb2YgQ1NTUHJvZmlsZSAmJiBvMiBpbnN0YW5jZW9mIENTU1Byb2ZpbGUpIHsKLQkJCQlpZiAoKChDU1NQcm9maWxlKSBvMSkuZ2V0UHJvZmlsZU5hbWUoKSAhPSBudWxsICYmICgoQ1NTUHJvZmlsZSkgbzIpLmdldFByb2ZpbGVOYW1lKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZGVsZWdhdGUuY29tcGFyZSgoKENTU1Byb2ZpbGUpIG8xKS5nZXRQcm9maWxlTmFtZSgpLCAoKENTU1Byb2ZpbGUpIG8yKS5nZXRQcm9maWxlTmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRQcm9maWxlcygpIHsKLQkJTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KGZQcm9maWxlcy52YWx1ZXMoKSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQodmFsdWVzLCBuZXcgUHJvZmlsZU5hbWVDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbih2YWx1ZXMpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIENTU1Byb2ZpbGUgZ2V0UHJvZmlsZShTdHJpbmcgcHJvZmlsZUlEKSB7Ci0JCXJldHVybiAoQ1NTUHJvZmlsZSkgZlByb2ZpbGVzLmdldChwcm9maWxlSUQpOwotCX0KLQotCXB1YmxpYyBDU1NQcm9maWxlIGdldERlZmF1bHRQcm9maWxlKCkgewotCQlJdGVyYXRvciBpID0gZ2V0UHJvZmlsZXMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NQcm9maWxlIHByb2ZpbGUgPSAoQ1NTUHJvZmlsZSkgaS5uZXh0KCk7Ci0JCQlpZiAocHJvZmlsZS5pc0RlZmF1bHQoKSkgewotCQkJCXJldHVybiBwcm9maWxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NQcm9maWxlUmVnaXN0cnkuCi0JICovCi0JcHJpdmF0ZSBDU1NQcm9maWxlUmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZQcm9maWxlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCUl0ZXJhdG9yIGkgPSBuZXcgUmVnaXN0cnlSZWFkZXIoKS5lbnVtUHJvZmlsZXMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgcHJvZmlsZSA9IGkubmV4dCgpOwotCQkJaWYgKHByb2ZpbGUgaW5zdGFuY2VvZiBDU1NQcm9maWxlKSB7Ci0JCQkJZlByb2ZpbGVzLnB1dCgoKENTU1Byb2ZpbGUpIHByb2ZpbGUpLmdldFByb2ZpbGVJRCgpLCBwcm9maWxlKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTUHJvZmlsZVJlZ2lzdHJ5IGZJbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZlByb2ZpbGVzID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTRnVuY3Rpb25JRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NGdW5jdGlvbklELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNGUxNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NGdW5jdGlvbklELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU0Z1bmN0aW9uSUQgewotCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX0FUVFIgPSAiYXR0ciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZfQ09VTlRFUiA9ICJjb3VudGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRl9SR0IgPSAicmdiIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRl9SRUNUID0gInJlY3QiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX1VSSSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX0ZPUk1BVCA9ICJmb3JtYXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX0xPQ0FMID0gImxvY2FsIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NLZXl3b3JkSUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTS2V5d29yZElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4Zjg5OGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NLZXl3b3JkSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU0tleXdvcmRJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfMTAwID0gIjEwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfMjAwID0gIjIwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfMzAwID0gIjMwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfNDAwID0gIjQwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfNTAwID0gIjUwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfNjAwID0gIjYwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfNzAwID0gIjcwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfODAwID0gIjgwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfOTAwID0gIjkwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQUJPVkUgPSAiYWJvdmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FCU09MVVRFID0gImFic29sdXRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19BQ1RJVkVCT1JERVIgPSAiQWN0aXZlQm9yZGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19BQ1RJVkVDQVBUSU9OID0gIkFjdGl2ZUNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FMTCA9ICJhbGwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FMV0FZUyA9ICJhbHdheXMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FQUFdPUktTUEFDRSA9ICJBcHBXb3Jrc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FRVUEgPSAiYXF1YSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQVJNRU5JQU4gPSAiYXJtZW5pYW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FVVE8gPSAiYXV0byI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQVZPSUQgPSAiYXZvaWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JBQ0tHUk9VTkQgPSAiQmFja2dyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkFTRUxJTkUgPSAiYmFzZWxpbmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JFSElORCA9ICJiZWhpbmQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JFTE9XID0gImJlbG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CSURJX09WRVJSSURFID0gImJpZGktb3ZlcnJpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JMQUNLID0gImJsYWNrIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CTElOSyA9ICJibGluayI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkxPQ0sgPSAiYmxvY2siOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JMVUUgPSAiYmx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQk9MRCA9ICJib2xkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CT0xERVIgPSAiYm9sZGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CT1RIID0gImJvdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JPVFRPTSA9ICJib3R0b20iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JVVFRPTkZBQ0UgPSAiQnV0dG9uRmFjZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQlVUVE9OSElHSExJR0hUID0gIkJ1dHRvbkhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQlVUVE9OU0hBRE9XID0gIkJ1dHRvblNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQlVUVE9OVEVYVCA9ICJCdXR0b25UZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DQVBJVEFMSVpFID0gImNhcGl0YWxpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NBUFRJT04gPSAiY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0FQVElPTlRFWFQgPSAiQ2FwdGlvblRleHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NFTlRFUiA9ICJjZW50ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NFTlRFUl9MRUZUID0gImNlbnRlci1sZWZ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DRU5URVJfUklHSFQgPSAiY2VudGVyLXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DSElMRCA9ICJjaGlsZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0lSQ0xFID0gImNpcmNsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0pLX0lERU9HUkFQSElDID0gImNqay1pZGVvZ3JhcGhpYyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0xPU0VfUVVPVEUgPSAiY2xvc2UtcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NPREUgPSAiY29kZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ09OREVOU0VEID0gImNvbmRlbnNlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ09MTEFQU0UgPSAiY29sbGFwc2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NPTVBBQ1QgPSAiY29tcGFjdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ09OVElOVU9VUyA9ICJjb250aW51b3VzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DUk9QID0gImNyb3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NST1NTID0gImNyb3NzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DUk9TU0hBSVIgPSAiY3Jvc3NoYWlyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DVVJTSVZFID0gImN1cnNpdmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0RBU0hFRCA9ICJkYXNoZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0RFQ0lNQUwgPSAiZGVjaW1hbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfREVDSU1BTF9MRUFESU5HX1pFUk8gPSAiZGVjaW1hbC1sZWFkaW5nLXplcm8iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0RFRkFVTFQgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRElHSVRTID0gImRpZ2l0cyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRElTQyA9ICJkaXNjIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ET1RURUQgPSAiZG90dGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ET1VCTEUgPSAiZG91YmxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19FX1JFU0laRSA9ICJlLXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRU1CRUQgPSAiZW1iZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0VYUEFOREVEID0gImV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19FWFRSQV9DT05ERU5TRUQgPSAiZXh0cmEtY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19FWFRSQV9FWFBBTkRFRCA9ICJleHRyYS1leHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRkFOVEFTWSA9ICJmYW50YXN5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GQVJfTEVGVCA9ICJmYXItbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRkFSX1JJR0hUID0gImZhci1yaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRkFTVCA9ICJmYXN0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GQVNURVIgPSAiZmFzdGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GRU1BTEUgPSAiZmVtYWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GSVhFRCA9ICJmaXhlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRlVDSFNJQSA9ICJmdWNoc2lhIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19HRU9SR0lBTiA9ICJnZW9yZ2lhbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfR1JBWSA9ICJncmF5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19HUkFZVEVYVCA9ICJHcmF5VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfR1JFRU4gPSAiZ3JlZW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0dST09WRSA9ICJncm9vdmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hFQlJFVyA9ICJoZWJyZXciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hFTFAgPSAiaGVscCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElEREVOID0gImhpZGRlbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElERSA9ICJoaWRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISUdIID0gImhpZ2giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hJR0hMSUdIVCA9ICJIaWdobGlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hJR0hMSUdIVFRFWFQgPSAiSGlnaGxpZ2h0VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElHSEVSID0gImhpZ2hlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElSQUdBTkEgPSAiaGlyYWdhbmEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hJUkFHQU5BX0lST0hBID0gImhpcmFnYW5hLWlyb2hhIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JQ09OID0gImljb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lOQUNUSVZFQk9SREVSID0gIkluYWN0aXZlQm9yZGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTkFDVElWRUNBUFRJT04gPSAiSW5hY3RpdmVDYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTkFDVElWRUNBUFRJT05URVhUID0gIkluYWN0aXZlQ2FwdGlvblRleHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lORk9CQUNLR1JPVU5EID0gIkluZm9CYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTkZPVEVYVCA9ICJJbmZvVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5MSU5FID0gImlubGluZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5MSU5FX1RBQkxFID0gImlubGluZS10YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5TRVQgPSAiaW5zZXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lOU0lERSA9ICJpbnNpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lOVkVSVCA9ICJpbnZlcnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lUQUxJQyA9ICJpdGFsaWMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0pVU1RJRlkgPSAianVzdGlmeSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfS0FUQUtBTkEgPSAia2F0YWthbmEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0tBVEFLQU5BX0lST0hBID0gImthdGFrYW5hLWlyb2hhIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MQU5EU0NBUEUgPSAibGFuZHNjYXBlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MQVJHRSA9ICJsYXJnZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTEFSR0VSID0gImxhcmdlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTEVGVCA9ICJsZWZ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MRUZUX1NJREUgPSAibGVmdC1zaWRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MRUZUV0FSRFMgPSAibGVmdHdhcmRzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MRVZFTCA9ICJsZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTElHSFRFUiA9ICJsaWdodGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MSU1FID0gImxpbWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xJTkVfVEhST1VHSCA9ICJsaW5lLXRocm91Z2giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xJU1RfSVRFTSA9ICJsaXN0LWl0ZW0iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xPVUQgPSAibG91ZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9XID0gImxvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9XRVIgPSAibG93ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xPV0VSX0FMUEhBID0gImxvd2VyLWFscGhhIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MT1dFUl9HUkVFSyA9ICJsb3dlci1ncmVlayI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9XRVJfTEFUSU4gPSAibG93ZXItbGF0aW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xPV0VSX1JPTUFOID0gImxvd2VyLXJvbWFuIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MT1dFUkNBU0UgPSAibG93ZXJjYXNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MVFIgPSAibHRyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NQUxFID0gIm1hbGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01BUktFUiA9ICJtYXJrZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01BUk9PTiA9ICJtYXJvb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01FRElVTSA9ICJtZWRpdW0iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01FTlUgPSAibWVudSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUVOVVRFWFQgPSAiTWVudVRleHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01FU1NBR0VfQk9YID0gIm1lc3NhZ2UtYm94IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NSURETEUgPSAibWlkZGxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NSVggPSAibWl4IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NT05PU1BBQ0UgPSAibW9ub3NwYWNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NT1ZFID0gIm1vdmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05fUkVTSVpFID0gIm4tcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OQVJST1dFUiA9ICJuYXJyb3dlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTkFWWSA9ICJuYXZ5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ORV9SRVNJWkUgPSAibmUtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OT19DTE9TRV9RVU9URSA9ICJuby1jbG9zZS1xdW90ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTk9fT1BFTl9RVU9URSA9ICJuby1vcGVuLXF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OT19SRVBFQVQgPSAibm8tcmVwZWF0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OT05FID0gIm5vbmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05PUk1BTCA9ICJub3JtYWwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05PV1JBUCA9ICJub3dyYXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05XX1JFU0laRSA9ICJudy1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX09CTElRVUUgPSAib2JsaXF1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfT0xJVkUgPSAib2xpdmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX09OQ0UgPSAib25jZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfT1BFTl9RVU9URSA9ICJvcGVuLXF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19PVVRTRVQgPSAib3V0c2V0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19PVVRTSURFID0gIm91dHNpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX09WRVJMSU5FID0gIm92ZXJsaW5lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19QT0lOVEVSID0gInBvaW50ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1BPUlRSQUlUID0gInBvcnRyYWl0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19QUkUgPSAicHJlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19QVVJQTEUgPSAicHVycGxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SRUQgPSAicmVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SRUxBVElWRSA9ICJyZWxhdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUkVQRUFUID0gInJlcGVhdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUkVQRUFUX1ggPSAicmVwZWF0LXgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JFUEVBVF9ZID0gInJlcGVhdC15IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SSURHRSA9ICJyaWRnZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUklHSFQgPSAicmlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JJR0hUX1NJREUgPSAicmlnaHQtc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUklHSFRXQVJEUyA9ICJyaWdodHdhcmRzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SVEwgPSAicnRsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SVU5fSU4gPSAicnVuLWluIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TX1JFU0laRSA9ICJzLXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0FOU19TRVJJRiA9ICJzYW5zLXNlcmlmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TQ1JPTEwgPSAic2Nyb2xsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TQ1JPTExCQVIgPSAiU2Nyb2xsYmFyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TRV9SRVNJWkUgPSAic2UtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TRU1JX0NPTkRFTlNFRCA9ICJzZW1pLWNvbmRlbnNlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0VNSV9FWFBBTkRFRCA9ICJzZW1pLWV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TRVBBUkFURSA9ICJzZXBhcmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0VSSUYgPSAic2VyaWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NIT1cgPSAic2hvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0lMRU5UID0gInNpbGVudCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0lMVkVSID0gInNpbHZlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0xPVyA9ICJzbG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TTE9XRVIgPSAic2xvd2VyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TTUFMTCA9ICJzbWFsbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU01BTExfQ0FQUyA9ICJzbWFsbC1jYXBzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TTUFMTF9DQVBUSU9OID0gInNtYWxsLWNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NNQUxMRVIgPSAic21hbGxlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU09GVCA9ICJzb2Z0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TT0xJRCA9ICJzb2xpZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU1BFTExfT1VUID0gInNwZWxsLW91dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU1FVQVJFID0gInNxdWFyZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU1RBVElDID0gInN0YXRpYyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU1RBVFVTX0JBUiA9ICJzdGF0dXMtYmFyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TVUIgPSAic3ViIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TVVBFUiA9ICJzdXBlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU1dfUkVTSVpFID0gInN3LXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEFCTEUgPSAidGFibGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0NBUFRJT04gPSAidGFibGUtY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEFCTEVfQ0VMTCA9ICJ0YWJsZS1jZWxsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9DT0xVTU4gPSAidGFibGUtY29sdW1uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9DT0xVTU5fR1JPVVAgPSAidGFibGUtY29sdW1uLWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9GT09URVJfR1JPVVAgPSAidGFibGUtZm9vdGVyLWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9IRUFERVJfR1JPVVAgPSAidGFibGUtaGVhZGVyLWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9ST1cgPSAidGFibGUtcm93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9ST1dfR1JPVVAgPSAidGFibGUtcm93LWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19URUFMID0gInRlYWwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RFWFQgPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEVYVF9UT1AgPSAidGV4dC10b3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RFWFRfQk9UVE9NID0gInRleHQtYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19USElDSyA9ICJ0aGljayI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEhJTiA9ICJ0aGluIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19USFJFRUREQVJLU0hBRE9XID0gIlRocmVlRERhcmtTaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RIUkVFREZBQ0UgPSAiVGhyZWVERmFjZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEhSRUVESElHSExJR0hUID0gIlRocmVlREhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEhSRUVETElHSFRTSEFET1cgPSAiVGhyZWVETGlnaHRTaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RIUkVFRFNIQURPVyA9ICJUaHJlZURTaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RPUCA9ICJ0b3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RSQU5TUEFSRU5UID0gInRyYW5zcGFyZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VTFRSQV9DT05ERU5TRUQgPSAidWx0cmEtY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VTFRSQV9FWFBBTkRFRCA9ICJ1bHRyYS1leHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVU5ERVJMSU5FID0gInVuZGVybGluZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVVBQRVJfQUxQSEEgPSAidXBwZXItYWxwaGEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1VQUEVSX0xBVElOID0gInVwcGVyLWxhdGluIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VUFBFUl9ST01BTiA9ICJ1cHBlci1yb21hbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVVBQRVJDQVNFID0gInVwcGVyY2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVklTSUJMRSA9ICJ2aXNpYmxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19XX1JFU0laRSA9ICJ3LXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfV0FJVCA9ICJ3YWl0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19XSElURSA9ICJ3aGl0ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfV0lERVIgPSAid2lkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1dJTkRPVyA9ICJXaW5kb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1dJTkRPV0ZSQU1FID0gIldpbmRvd0ZyYW1lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19XSU5ET1dURVhUID0gIldpbmRvd1RleHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1hfRkFTVCA9ICJ4LWZhc3QiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1hfSElHSCA9ICJ4LWhpZ2giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1hfTEFSR0UgPSAieC1sYXJnZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9MT1VEID0gIngtbG91ZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9MT1cgPSAieC1sb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1hfU0xPVyA9ICJ4LXNsb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1hfU01BTEwgPSAieC1zbWFsbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9TT0ZUID0gIngtc29mdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWFhfU01BTEwgPSAieHgtc21hbGwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1hYX0xBUkdFID0gInh4LWxhcmdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ZRUxMT1cgPSAieWVsbG93IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNTVR5cGVDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTU1UeXBlQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNjgwNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNTVR5cGVDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NNTVR5cGVDb2xsZWN0b3IgZXh0ZW5kcyBDU1NNZXRhTW9kZWxUcmF2ZXJzZXIgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFR5cGVDb2xsZWN0b3IuCi0JICovCi0JcHVibGljIENTU01NVHlwZUNvbGxlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhcHBseShDU1NNTU5vZGUgbm9kZSwgU3RyaW5nIHR5cGUpIHsKLQkJZlR5cGUgPSB0eXBlOwotCQlmTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFwcGx5KG5vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3ROZXN0ZWRUeXBlKGJvb2xlYW4gbmVzdGVkKSB7Ci0JCWZOZXN0ZWQgPSBuZXN0ZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJc2hvcnQgcmMgPSBUUkFWX0NPTlQ7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChmVHlwZSA9PSBub2RlLmdldFR5cGUoKSkgewotCQkJCWlmICghZk5vZGVzLmNvbnRhaW5zKG5vZGUpKSB7Ci0JCQkJCWZOb2Rlcy5hZGQobm9kZSk7Ci0JCQkJfQotCQkJCWlmICghZk5lc3RlZCkgewotCQkJCQlyYyA9IFRSQVZfUFJVTkU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Tm9kZXMoKSB7Ci0JCXJldHVybiBmTm9kZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBmTmVzdGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZlR5cGUgPSBudWxsOwotCUxpc3QgZk5vZGVzID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWVkaWFHcm91cElELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01lZGlhR3JvdXBJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzhjZjdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWVkaWFHcm91cElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01lZGlhR3JvdXBJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQ09OVElOVU9VUyA9ICJjb250aW51b3VzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9QQUdFRCA9ICJwYWdlZCI7IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9WSVNVQUwgPSAidmlzdWFsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9BVVJBTCA9ICJhdXJhbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fVEFDVElMRSA9ICJ0YWN0aWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JZmluYWwgc3RhdGljIFN0cmluZyBNX0dSSUQgPSAiZ3JpZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQklUTUFQID0gImJpdG1hcCI7IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9JTlRFUkFDVElWRSA9ICJpbnRlcmFjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fU1RBVElDID0gInN0YXRpYyI7IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9BTEwgPSAiYWxsIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZGE2OTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotcHVibGljIGNsYXNzIENTU01ldGFNb2RlbEZpbmRlciB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01ldGFNb2RlbEZpbmRlci4KLQkgKi8KLQlwcml2YXRlIENTU01ldGFNb2RlbEZpbmRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlzdGF0aWMgc3luY2hyb25pemVkIHB1YmxpYyBDU1NNZXRhTW9kZWxGaW5kZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU01ldGFNb2RlbEZpbmRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIENTU01ldGFNb2RlbCBmaW5kTWV0YU1vZGVsRm9yKElDU1NOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIENTU1Byb2ZpbGVGaW5kZXIuZ2V0SW5zdGFuY2UoKS5maW5kUHJvZmlsZUZvcihub2RlKS5nZXRNZXRhTW9kZWwoKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTTWV0YU1vZGVsIGZpbmRNZXRhTW9kZWxGb3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlyZXR1cm4gQ1NTUHJvZmlsZUZpbmRlci5nZXRJbnN0YW5jZSgpLmZpbmRQcm9maWxlRm9yKG1vZGVsKS5nZXRNZXRhTW9kZWwoKTsKLQotCX0KLQotCS8vIGZpbmRNZXRhTW9kZWxGb3IoTm9kZSkgaXMgbm90IHVzZWQuCi0JLy8gRXZlbiBpZiBpdCBpcyB1c2VkLCBpdCBjYW4gYmUgcmVwbGFjZWQgd2l0aAotCS8vIGZpbmRNZXRhTW9kZWxGb3IoSVN0cnVjdHVyZWRNb2RlbCkgZWFzaWx5Ci0KLQlwdWJsaWMgQ1NTTWV0YU1vZGVsIGZpbmRNZXRhTW9kZWxGb3IoU3RyaW5nIGJhc2VMb2NhdGlvbikgewotCQlyZXR1cm4gQ1NTUHJvZmlsZUZpbmRlci5nZXRJbnN0YW5jZSgpLmZpbmRQcm9maWxlRm9yKGJhc2VMb2NhdGlvbikuZ2V0TWV0YU1vZGVsKCk7Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgQ1NTTWV0YU1vZGVsRmluZGVyIGZJbnN0YW5jZSA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbFRyYXZlcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxUcmF2ZXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiZWRmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbFRyYXZlcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotCi0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBDU1NNZXRhTW9kZWxUcmF2ZXJzZXIgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRyYXZlcnNlci4KLQkgKi8KLQlwdWJsaWMgQ1NTTWV0YU1vZGVsVHJhdmVyc2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIGFwcGx5KENTU01NTm9kZSBub2RlKSB7Ci0JCWZUcmF2U3RhY2sgPSBuZXcgU3RhY2soKTsKLQotCQliZWdpbihub2RlKTsKLQkJdHJhdmVyc2Uobm9kZSk7Ci0JCWVuZChub2RlKTsKLQl9Ci0KLQlwcml2YXRlIGZpbmFsIHNob3J0IHRyYXZlcnNlKENTU01NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybiBUUkFWX0NPTlQ7Ci0JCX0KLQotCQlmVHJhdlN0YWNrLnB1c2gobm9kZSk7Ci0KLQkJc2hvcnQgcmM7Ci0JCXJjID0gcHJlTm9kZShub2RlKTsKLQotCQlpZiAocmMgPT0gVFJBVl9DT05UKSB7Ci0JCQlJdGVyYXRvciBpID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlDU1NNTU5vZGUgY2hpbGQgPSAoQ1NTTU1Ob2RlKSBpLm5leHQoKTsKLQkJCQlzaG9ydCByY0NoaWxkID0gdHJhdmVyc2UoY2hpbGQpOwotCQkJCWlmIChyY0NoaWxkID09IFRSQVZfU1RPUCkgewotCQkJCQlmVHJhdlN0YWNrLnBvcCgpOwotCQkJCQlyZXR1cm4gVFJBVl9TVE9QOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChyYyA9PSBUUkFWX1NUT1ApIHsKLQkJCWZUcmF2U3RhY2sucG9wKCk7Ci0JCQlyZXR1cm4gVFJBVl9TVE9QOwotCQl9Ci0KLQkJcmMgPSBwb3N0Tm9kZShub2RlKTsKLQotCQlmVHJhdlN0YWNrLnBvcCgpOwotCQlyZXR1cm4gKHJjID09IFRSQVZfUFJVTkUpID8gVFJBVl9DT05UIDogcmM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYmVnaW4oQ1NTTU1Ob2RlIG5vZGUpIHsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZChDU1NNTU5vZGUgbm9kZSkgewotCi0JfQotCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIFRSQVZfQ09OVDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc2hvcnQgcG9zdE5vZGUoQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIFRSQVZfQ09OVDsKLQl9Ci0KLQotCVN0YWNrIGZUcmF2U3RhY2sgPSBudWxsOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBzaG9ydCBUUkFWX0NPTlQgPSAwOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgc2hvcnQgVFJBVl9TVE9QID0gMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIHNob3J0IFRSQVZfUFJVTkUgPSAyOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2E3NWNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NNZXRhTW9kZWxVdGlsIHsKLQlwdWJsaWMgQ1NTTWV0YU1vZGVsVXRpbChDU1NNZXRhTW9kZWwgbWV0YW1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCWZNZXRhTW9kZWwgPSBtZXRhbW9kZWw7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBjb2xsZWN0Tm9kZXNCeVR5cGUoQ1NTTU1Ob2RlLlRZUEVfUFJPUEVSVFkpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXREZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGNvbGxlY3ROb2Rlc0J5VHlwZShDU1NNTU5vZGUuVFlQRV9ERVNDUklQVE9SKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgY29sbGVjdE5vZGVzQnlUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCUNTU01NVHlwZUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgQ1NTTU1UeXBlQ29sbGVjdG9yKCk7Ci0JCWNvbGxlY3Rvci5hcHBseShmTWV0YU1vZGVsLCB0eXBlKTsKLQkJcmV0dXJuIGNvbGxlY3Rvci5nZXROb2RlcygpOwotCX0KLQotCXB1YmxpYyBDU1NNTVByb3BlcnR5IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSXRlcmF0b3IgaVByb3BlcnR5ID0gZ2V0UHJvcGVydGllcygpOwotCQl3aGlsZSAoaVByb3BlcnR5Lmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpUHJvcGVydHkubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UocHJvcGVydHlOYW1lKSkgewotCQkJCXJldHVybiAoQ1NTTU1Qcm9wZXJ0eSkgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ1NTTU1EZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoU3RyaW5nIGRlc2NyaXB0b3JOYW1lKSB7Ci0JCUl0ZXJhdG9yIGlEZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcnMoKTsKLQkJd2hpbGUgKGlEZXNjcmlwdG9yLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpRGVzY3JpcHRvci5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShkZXNjcmlwdG9yTmFtZSkpIHsKLQkJCQlyZXR1cm4gKENTU01NRGVzY3JpcHRvcikgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ1NTTU1Ob2RlIGdldE1ldGFNb2RlbE5vZGVGb3IoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xhcmF0aW9uKSB7Ci0JCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJSUNTU05vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydHkoKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQkJfQotCQkJZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlKSB7Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0b3IoKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQkJfQotCQl9Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGZUeXBlTWFwID09IG51bGwpIHsKLQkJCWZUeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZUeXBlTWFwLnB1dChuZXcgU2hvcnQoSUNTU05vZGUuU1RZTEVSVUxFX05PREUpLCBDU1NNTU5vZGUuVFlQRV9TVFlMRV9SVUxFKTsKLQkJCWZUeXBlTWFwLnB1dChuZXcgU2hvcnQoSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUpLCBDU1NNTU5vZGUuVFlQRV9GT05UX0ZBQ0VfUlVMRSk7Ci0JCQlmVHlwZU1hcC5wdXQobmV3IFNob3J0KElDU1NOb2RlLlBBR0VSVUxFX05PREUpLCBDU1NNTU5vZGUuVFlQRV9QQUdFX1JVTEUpOwotCQl9Ci0KLQkJU3RyaW5nIG5vZGVUeXBlID0gKFN0cmluZykgZlR5cGVNYXAuZ2V0KG5ldyBTaG9ydChub2RlLmdldE5vZGVUeXBlKCkpKTsKLQkJaWYgKG5vZGVUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSXRlcmF0b3IgaU5vZGVzID0gY29sbGVjdE5vZGVzQnlUeXBlKG5vZGVUeXBlKTsKLQkJaWYgKGlOb2Rlcy5oYXNOZXh0KCkpIHsKLQkJCUNTU01NTm9kZSB0YXJnZXROb2RlID0gKENTU01NTm9kZSkgaU5vZGVzLm5leHQoKTsKLQkJCWlmICghaU5vZGVzLmhhc05leHQoKSkgeyAvLyBpdCdzIG9ubHkgb25lCi0JCQkJcmV0dXJuIHRhcmdldE5vZGU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ1NTTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKLQkJcmV0dXJuIGZNZXRhTW9kZWw7Ci0JfQotCi0KLQlwcml2YXRlIENTU01ldGFNb2RlbCBmTWV0YU1vZGVsID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmVHlwZU1hcCA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU051bWJlcklELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU051bWJlcklELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjY5ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NOdW1iZXJJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBDU1NOdW1iZXJJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX0FOR0xFID0gImFuZ2xlIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgTl9GUkVRVUVOQ1kgPSAiZnJlcXVlbmN5IjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgTl9JTlRFR0VSID0gImludGVnZXIiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX0xFTkdUSCA9ICJsZW5ndGgiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX1BFUkNFTlRBR0UgPSAicGVyY2VudGFnZSI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIE5fVElNRSA9ICJ0aW1lIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgTl9IQVNIID0gImhhc2giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgTl9OVU0gPSAibnVtYmVyIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1Byb2ZpbGVGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvZmlsZUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDdmNTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvZmlsZUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5DU1NDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTUHJvZmlsZUZpbmRlciB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU1Byb2ZpbGVGaW5kZXIuCi0JICovCi0JcHJpdmF0ZSBDU1NQcm9maWxlRmluZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgcHVibGljIENTU1Byb2ZpbGVGaW5kZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU1Byb2ZpbGVGaW5kZXIoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBDU1NQcm9maWxlIGZpbmRQcm9maWxlRm9yKElDU1NOb2RlIG5vZGUpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gbnVsbDsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJSUNTU0RvY3VtZW50IGRvYyA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJbW9kZWwgPSBkb2MuZ2V0TW9kZWwoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmluZFByb2ZpbGVGb3IobW9kZWwpOwotCX0KLQotCXB1YmxpYyBDU1NQcm9maWxlIGZpbmRQcm9maWxlRm9yKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJT2JqZWN0IG1vZGVsVHlwZSA9ICgoSUNTU01vZGVsKSBtb2RlbCkuZ2V0U3R5bGVTaGVldFR5cGUoKTsKLQkJCWlmIChtb2RlbFR5cGUgPT0gSUNTU01vZGVsLkVYVEVSTkFMKSB7Ci0JCQkJYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChtb2RlbFR5cGUgPT0gSUNTU01vZGVsLkVNQkVEREVEIHx8IG1vZGVsVHlwZSA9PSBJQ1NTTW9kZWwuSU5MSU5FKSB7Ci0JCQkJYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7IC8vIG1heSBiZSBudWxsCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGZpbmRQcm9maWxlRm9yKGJhc2VMb2NhdGlvbik7Ci0JfQotCi0JcHVibGljIENTU1Byb2ZpbGUgZmluZFByb2ZpbGVGb3IoU3RyaW5nIGJhc2VMb2NhdGlvbikgewotCQlDU1NQcm9maWxlUmVnaXN0cnkgcmVnID0gQ1NTUHJvZmlsZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IG51bGw7Ci0KLQkJaWYgKGJhc2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoYmFzZUxvY2F0aW9uKTsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJaWYgKHJlc291cmNlID09IG51bGwgJiYgcGF0aC5zZWdtZW50Q291bnQoKSA+IDEpCi0JCQkJcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCVN0cmluZyBwcm9maWxlSUQgPSBDU1NDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShDU1NDb250ZW50UHJvcGVydGllcy5DU1NfUFJPRklMRSwgcmVzb3VyY2UsIHRydWUpOwotCQkJCWlmIChwcm9maWxlSUQgIT0gbnVsbCAmJiAwIDwgcHJvZmlsZUlELmxlbmd0aCgpKSB7Ci0JCQkJCXByb2ZpbGUgPSByZWcuZ2V0UHJvZmlsZShwcm9maWxlSUQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiAocHJvZmlsZSAhPSBudWxsKSA/IHByb2ZpbGUgOiByZWcuZ2V0RGVmYXVsdFByb2ZpbGUoKTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBDU1NQcm9maWxlRmluZGVyIGZJbnN0YW5jZSA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1Byb3BlcnR5SUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvcGVydHlJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTBlOGU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvcGVydHlJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTUHJvcGVydHlJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQVpJTVVUSCA9ICJhemltdXRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CRyA9ICJiYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19BVFRBQ0hNRU5UID0gImJhY2tncm91bmQtYXR0YWNobWVudCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfQ09MT1IgPSAiYmFja2dyb3VuZC1jb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfSU1BR0UgPSAiYmFja2dyb3VuZC1pbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfUE9TSVRJT04gPSAiYmFja2dyb3VuZC1wb3NpdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfUkVQRUFUID0gImJhY2tncm91bmQtcmVwZWF0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVIgPSAiYm9yZGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQ09MTEFQU0UgPSAiYm9yZGVyLWNvbGxhcHNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQ09MT1IgPSAiYm9yZGVyLWNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfU1BBQ0lORyA9ICJib3JkZXItc3BhY2luZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1NUWUxFID0gImJvcmRlci1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUCA9ICJib3JkZXItdG9wIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFQgPSAiYm9yZGVyLXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NID0gImJvcmRlci1ib3R0b20iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUID0gImJvcmRlci1sZWZ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QX0NPTE9SID0gImJvcmRlci10b3AtY29sb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVF9DT0xPUiA9ICJib3JkZXItcmlnaHQtY29sb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT01fQ09MT1IgPSAiYm9yZGVyLWJvdHRvbS1jb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlRfQ09MT1IgPSAiYm9yZGVyLWxlZnQtY29sb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9UT1BfU1RZTEUgPSAiYm9yZGVyLXRvcC1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1JJR0hUX1NUWUxFID0gImJvcmRlci1yaWdodC1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0JPVFRPTV9TVFlMRSA9ICJib3JkZXItYm90dG9tLXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfTEVGVF9TVFlMRSA9ICJib3JkZXItbGVmdC1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUF9XSURUSCA9ICJib3JkZXItdG9wLXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFRfV0lEVEggPSAiYm9yZGVyLXJpZ2h0LXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NX1dJRFRIID0gImJvcmRlci1ib3R0b20td2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUX1dJRFRIID0gImJvcmRlci1sZWZ0LXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfV0lEVEggPSAiYm9yZGVyLXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1RUT00gPSAiYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DQVBUSU9OX1NJREUgPSAiY2FwdGlvbi1zaWRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DTEVBUiA9ICJjbGVhciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ0xJUCA9ICJjbGlwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT0xPUiA9ICJjb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ09OVEVOVCA9ICJjb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT1VOVEVSX0lOQ1JFTUVOVCA9ICJjb3VudGVyLWluY3JlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ09VTlRFUl9SRVNFVCA9ICJjb3VudGVyLXJlc2V0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVUUgPSAiY3VlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVUVfQUZURVIgPSAiY3VlLWFmdGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVUVfQkVGT1JFID0gImN1ZS1iZWZvcmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NVUlNPUiA9ICJjdXJzb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0RJUkVDVElPTiA9ICJkaXJlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0RJU1BMQVkgPSAiZGlzcGxheSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRUxFVkFUSU9OID0gImVsZXZhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRU1QVFlfQ0VMTFMgPSAiZW1wdHktY2VsbHMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZMT0FUID0gImZsb2F0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UID0gImZvbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfRkFNSUxZID0gImZvbnQtZmFtaWx5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1NJWkUgPSAiZm9udC1zaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1NJWkVfQURKVVNUID0gImZvbnQtc2l6ZS1hZGp1c3QiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU1RSRVRDSCA9ICJmb250LXN0cmV0Y2giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU1RZTEUgPSAiZm9udC1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9WQVJJQU5UID0gImZvbnQtdmFyaWFudCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9XRUlHSFQgPSAiZm9udC13ZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0hFSUdIVCA9ICJoZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0xFRlQgPSAibGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTEVUVEVSX1NQQUNJTkcgPSAibGV0dGVyLXNwYWNpbmciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0xJTkVfSEVJR0hUID0gImxpbmUtaGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFID0gImxpc3Qtc3R5bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEVfSU1BR0UgPSAibGlzdC1zdHlsZS1pbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElTVF9TVFlMRV9QT1NJVElPTiA9ICJsaXN0LXN0eWxlLXBvc2l0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFX1RZUEUgPSAibGlzdC1zdHlsZS10eXBlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU4gPSAibWFyZ2luIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU5fVE9QID0gIm1hcmdpbi10b3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9SSUdIVCA9ICJtYXJnaW4tcmlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9CT1RUT00gPSAibWFyZ2luLWJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX0xFRlQgPSAibWFyZ2luLWxlZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BUktFUl9PRkZTRVQgPSAibWFya2VyLW9mZnNldCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSS1MgPSAibWFya3MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BWF9IRUlHSFQgPSAibWF4LWhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFYX1dJRFRIID0gIm1heC13aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUlOX0hFSUdIVCA9ICJtaW4taGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NSU5fV0lEVEggPSAibWluLXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PUlBIQU5TID0gIm9ycGhhbnMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkUgPSAib3V0bGluZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORV9DT0xPUiA9ICJvdXRsaW5lLWNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVVRMSU5FX1NUWUxFID0gIm91dGxpbmUtc3R5bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkVfV0lEVEggPSAib3V0bGluZS13aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1ZFUkZMT1cgPSAib3ZlcmZsb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkcgPSAicGFkZGluZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19UT1AgPSAicGFkZGluZy10b3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkdfUklHSFQgPSAicGFkZGluZy1yaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19CT1RUT00gPSAicGFkZGluZy1ib3R0b20iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkdfTEVGVCA9ICJwYWRkaW5nLWxlZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBR0UgPSAicGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRV9CUkVBS19BRlRFUiA9ICJwYWdlLWJyZWFrLWFmdGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFX0JSRUFLX0JFRk9SRSA9ICJwYWdlLWJyZWFrLWJlZm9yZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRV9CUkVBS19JTlNJREUgPSAicGFnZS1icmVhay1pbnNpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBVVNFID0gInBhdXNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQVVTRV9BRlRFUiA9ICJwYXVzZS1hZnRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFVU0VfQkVGT1JFID0gInBhdXNlLWJlZm9yZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUElUQ0ggPSAicGl0Y2giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BJVENIX1JBTkdFID0gInBpdGNoLXJhbmdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QTEFZX0RVUklORyA9ICJwbGF5LWR1cmluZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUE9TSVRJT04gPSAicG9zaXRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1FVT1RFUyA9ICJxdW90ZXMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1JJQ0hORVNTID0gInJpY2huZXNzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9SSUdIVCA9ICJyaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU0laRSA9ICJzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBSyA9ICJzcGVhayI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFQUtfSEVBREVSID0gInNwZWFrLWhlYWRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFQUtfTlVNRVJBTCA9ICJzcGVhay1udW1lcmFsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBS19QVU5DVFVBVElPTiA9ICJzcGVhay1wdW5jdHVhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFRUNIX1JBVEUgPSAic3BlZWNoLXJhdGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1NUUkVTUyA9ICJzdHJlc3MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1RBQkxFX0xBWU9VVCA9ICJ0YWJsZS1sYXlvdXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfQUxJR04gPSAidGV4dC1hbGlnbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9ERUNPUkFUSU9OID0gInRleHQtZGVjb3JhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9JTkRFTlQgPSAidGV4dC1pbmRlbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfU0hBRE9XID0gInRleHQtc2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX1RSQU5TRk9STSA9ICJ0ZXh0LXRyYW5zZm9ybSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVE9QID0gInRvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVU5JQ09ERV9CSURJID0gInVuaWNvZGUtYmlkaSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVkVSVElDQUxfQUxJR04gPSAidmVydGljYWwtYWxpZ24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1ZJU0lCSUxJVFkgPSAidmlzaWJpbGl0eSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVk9JQ0VfRkFNSUxZID0gInZvaWNlLWZhbWlseSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVk9MVU1FID0gInZvbHVtZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV0hJVEVfU1BBQ0UgPSAid2hpdGUtc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1dJRE9XUyA9ICJ3aWRvd3MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1dJRFRIID0gIndpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9XT1JEX1NQQUNJTkcgPSAid29yZC1zcGFjaW5nIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9aX0lOREVYID0gInotaW5kZXgiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1N0cmluZ0lELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1N0cmluZ0lELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MjJjZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NTdHJpbmdJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBDU1NTdHJpbmdJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNfQU5ZID0gImFueSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNfQ09VTlRFUl9JREVOVElGSUVSID0gImNvdW50ZXItaWRlbnRpZmllciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNfRkFNSUxZX05BTUUgPSAiZmFtaWx5LW5hbWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTX0ZPTlRfRkFDRV9OQU1FID0gImZvbnQtZmFjZS1uYW1lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19QQUdFX0lERU5USUZJRVIgPSAicGFnZS1pZGVudGlmaWVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19TUEVDSUZJQ19WT0lDRSA9ICJzcGVjaWZpYy12b2ljZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNfVVJBTkdFID0gInVyYW5nZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTVW5pdElELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1VuaXRJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjQ2ZDMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTVW5pdElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU1VuaXRJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfQ00gPSAiY20iOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfREVHID0gImRlZyI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9FTVMgPSAiZW0iOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfRVhTID0gImV4IjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX0dSQUQgPSAiZ3JhZCI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9IQVNIID0gIiMiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfSFogPSAiSHoiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfSU4gPSAiaW4iOy8vJE5PTi1OTFMtMSQKLQkvLyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVfSU5URUdFUiA9ICJJTlRFR0VSIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX0tIWiA9ICJrSHoiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfTU0gPSAibW0iOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfTVMgPSAibXMiOy8vJE5PTi1OTFMtMSQKLQkvLyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVfTlVNQkVSID0gIk5VTUJFUiI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9QQyA9ICJwYyI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9QRVJDRU5UQUdFID0gIiUiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfUFQgPSAicHQiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfUFggPSAicHgiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfUkFEID0gInJhZCI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9TID0gInMiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUNhdGVnb3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ2F0ZWdvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YjBlNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ2F0ZWdvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NQ2F0ZWdvcnlJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NQ2F0ZWdvcnkgewotCi0JcHVibGljIENTU01NQ2F0ZWdvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfQ0FURUdPUlk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENhcHRpb24oKSB7Ci0JCXJldHVybiBmQ2FwdGlvbjsKLQl9Ci0KLQl2b2lkIHNldENhcHRpb24oU3RyaW5nIGNhcHRpb24pIHsKLQkJZkNhcHRpb24gPSBjYXB0aW9uOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldENhcHRpb24oKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRDYXB0aW9uKCk7Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBmQ2FwdGlvbiA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1DaGFyc2V0UnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUNoYXJzZXRSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDY0YjUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUNoYXJzZXRSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTUNoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTUNoYXJzZXRSdWxlSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTUNoYXJzZXRSdWxlIHsKLQotCi0JcHVibGljIENTU01NQ2hhcnNldFJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfQ0hBUlNFVF9SVUxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNnZXRFcnJvcigpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Db250YWluZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Db250YWluZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZTc5ZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ29udGFpbmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotY2xhc3MgQ1NTTU1Db250YWluZXJJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NQ29udGFpbmVyIHsKLQotCi0JcHVibGljIENTU01NQ29udGFpbmVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX0NPTlRBSU5FUjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IGNoaWxkLmdldFR5cGUoKTsKLQkJcmV0dXJuICh0eXBlID09IFRZUEVfTlVNQkVSIHx8IHR5cGUgPT0gVFlQRV9LRVlXT1JEIHx8IHR5cGUgPT0gVFlQRV9GVU5DVElPTiB8fCB0eXBlID09IFRZUEVfQ09OVEFJTkVSKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNnZXRFcnJvcigpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIGlmIChnZXRDaGlsZENvdW50KCkgPT0gMCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTURlc2NyaXB0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1EZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTFkNjY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTURlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotCi1jbGFzcyBDU1NNTURlc2NyaXB0b3JJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NRGVzY3JpcHRvciB7Ci0KLQotCXB1YmxpYyBDU1NNTURlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfREVTQ1JJUFRPUjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IGNoaWxkLmdldFR5cGUoKTsKLQkJcmV0dXJuICh0eXBlID09IFRZUEVfTlVNQkVSIHx8IHR5cGUgPT0gVFlQRV9LRVlXT1JEIHx8IHR5cGUgPT0gVFlQRV9GVU5DVElPTiB8fCB0eXBlID09IFRZUEVfQ09OVEFJTkVSIHx8IHR5cGUgPT0gVFlQRV9TVFJJTkcgfHwgdHlwZSA9PSBUWVBFX1NFUEFSQVRPUik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjZ2V0RXJyb3IoKQotCSAqLwotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0Q2hpbGRDb3VudCgpID09IDApIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NRGVzY3JpcHRvciNnZXRWYWx1ZXMoKQotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRWYWx1ZXMoKSB7Ci0JCVZhbHVlQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBWYWx1ZUNvbGxlY3RvcigpOwotCQljb2xsZWN0b3IuYXBwbHkodGhpcyk7Ci0JCXJldHVybiBjb2xsZWN0b3IuZ2V0Tm9kZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUZvbnRGYWNlUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUZvbnRGYWNlUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkMWNhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Gb250RmFjZVJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NRm9udEZhY2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTUZvbnRGYWNlUnVsZUltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1Gb250RmFjZVJ1bGUgewotCi0KLQlwdWJsaWMgQ1NTTU1Gb250RmFjZVJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfRk9OVF9GQUNFX1JVTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLmdldFR5cGUoKSA9PSBUWVBFX0RFU0NSSVBUT1IpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUZ1bmN0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRnVuY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2N2YyMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRnVuY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NRnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NRnVuY3Rpb25JbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NRnVuY3Rpb24gewotCi0JcHVibGljIENTU01NRnVuY3Rpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfRlVOQ1RJT047Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bmN0aW9uU3RyaW5nKCkgewotCQlyZXR1cm4gZlZhbHVlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI3Bvc3RTZXRBdHRyaWJ1dGUoKQotCSAqLwotCS8vIHZvaWQgcG9zdFNldEF0dHJpYnV0ZSgpIHRocm93cyBCYWRJbml0aWFsaXphdGlvbkV4Y2VwdGlvbiB7Ci0JLy8gc3VwZXIucG9zdFNldEF0dHJpYnV0ZSgpOwotCS8vIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCS8vIGlmIChuYW1lID09IG51bGwpIHsgdGhyb3cgbmV3IEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKCk7IH0KLQkvLwotCS8vIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBsaXN0LmFkZChDU1NGdW5jdGlvbklELkZfQVRUUik7Ci0JLy8gbGlzdC5hZGQoQ1NTRnVuY3Rpb25JRC5GX0NPVU5URVIpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9SR0IpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9SRUNUKTsKLQkvLyBsaXN0LmFkZChDU1NGdW5jdGlvbklELkZfVVJJKTsKLQkvLyBsaXN0LmFkZChDU1NGdW5jdGlvbklELkZfRk9STUFUKTsKLQkvLyBsaXN0LmFkZChDU1NGdW5jdGlvbklELkZfTE9DQUwpOwotCS8vCi0JLy8gaWYgKCEgbGlzdC5jb250YWlucyhuYW1lLnRvTG93ZXJDYXNlKCkpKSB7Ci0JLy8gdGhyb3cgbmV3IEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKCk7Ci0JLy8gfQotCS8vIH0KLQkvKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0RnVuY3Rpb25TdHJpbmcoKTsKLQl9Ci0KLQl2b2lkIHNldEZ1bmN0aW9uU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQlmVmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNnZXRFcnJvcigpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIGlmIChnZXRGdW5jdGlvblN0cmluZygpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBmVmFsdWUgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NSW1wb3J0UnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUltcG9ydFJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZGZlODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NSW1wb3J0UnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1JbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTUltcG9ydFJ1bGVJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NSW1wb3J0UnVsZSB7Ci0KLQotCXB1YmxpYyBDU1NNTUltcG9ydFJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfSU1QT1JUX1JVTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1LZXl3b3JkSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NS2V5d29yZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiNTU5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1LZXl3b3JkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTUtleXdvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NS2V5d29yZEltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1LZXl3b3JkIHsKLQotCXB1YmxpYyBDU1NNTUtleXdvcmRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfS0VZV09SRDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTUtleXdvcmQjZ2V0S2V5d29yZFN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRLZXl3b3JkU3RyaW5nKCkgewotCQlyZXR1cm4gZlZhbHVlOwotCX0KLQotCS8qCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRLZXl3b3JkU3RyaW5nKCk7Ci0JfQotCi0Jdm9pZCBzZXRLZXl3b3JkU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQlmVmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldEtleXdvcmRTdHJpbmcoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBTdHJpbmcgZlZhbHVlID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTU1lZGlhUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTU1lZGlhUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTkwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1NZWRpYVJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTWVkaWFSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTU1lZGlhUnVsZUltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1NZWRpYVJ1bGUgewotCi0KLQlwdWJsaWMgQ1NTTU1NZWRpYVJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfTUVESUFfUlVMRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FX05PVF9BVkFJTEFCTEU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTU5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyM2Q3ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi0KLWFic3RyYWN0IGNsYXNzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTU5vZGUgewotCi0JcHVibGljIENTU01NTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUeXBlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZkRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChmQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKFN0cmluZykgZkF0dHJpYnV0ZXMuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZE5vZGVzKCkgewotCQlpZiAoZkNoaWxkTm9kZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGZDaGlsZE5vZGVzKS5pdGVyYXRvcigpOwotCQl9Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldERlc2NlbmRhbnRzKCkgewotCQlMaXN0IGRlc2NlbmRhbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpQ2hpbGQgPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCXdoaWxlIChpQ2hpbGQuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgY2hpbGQgPSAoQ1NTTU1Ob2RlKSBpQ2hpbGQubmV4dCgpOwotCQkJSXRlcmF0b3IgaURlc2NlbmRhbnQgPSBjaGlsZC5nZXREZXNjZW5kYW50cygpOwotCQkJaWYgKGlEZXNjZW5kYW50Lmhhc05leHQoKSkgewotCQkJCXdoaWxlIChpRGVzY2VuZGFudC5oYXNOZXh0KCkpIHsKLQkJCQkJQ1NTTU1Ob2RlIGRlc2NlbmRhbnQgPSAoQ1NTTU1Ob2RlKSBpRGVzY2VuZGFudC5uZXh0KCk7Ci0JCQkJCWlmICghZGVzY2VuZGFudHMuY29udGFpbnMoZGVzY2VuZGFudCkpIHsKLQkJCQkJCWRlc2NlbmRhbnRzLmFkZChkZXNjZW5kYW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghZGVzY2VuZGFudHMuY29udGFpbnMoY2hpbGQpKSB7Ci0JCQkJCWRlc2NlbmRhbnRzLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGRlc2NlbmRhbnRzKS5pdGVyYXRvcigpOwotCX0KLQotCXZvaWQgYXBwZW5kQ2hpbGQoQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGZDaGlsZE5vZGVzID09IG51bGwpIHsKLQkJCWZDaGlsZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWlmICghZkNoaWxkTm9kZXMuY29udGFpbnMoY2hpbGQpKSB7Ci0JCQlmQ2hpbGROb2Rlcy5hZGQoY2hpbGQpOwotCQkJKChDU1NNTU5vZGVJbXBsKSBjaGlsZCkuZlJlZkNvdW50Kys7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZUNoaWxkKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCB8fCBmQ2hpbGROb2RlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSXRlcmF0b3IgaSA9IGZDaGlsZE5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJaWYgKGkubmV4dCgpID09IGNoaWxkKSB7Ci0JCQkJaS5yZW1vdmUoKTsKLQkJCQkoKENTU01NTm9kZUltcGwpIGNoaWxkKS5mUmVmQ291bnQtLTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZUFsbENoaWxkTm9kZXMoKSB7Ci0JCWlmIChmQ2hpbGROb2RlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSXRlcmF0b3IgaSA9IGZDaGlsZE5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJKChDU1NNTU5vZGVJbXBsKSBpLm5leHQoKSkuZlJlZkNvdW50LS07Ci0JCX0KLQkJZkNoaWxkTm9kZXMuY2xlYXIoKTsKLQl9Ci0KLQlhYnN0cmFjdCBib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKTsKLQotCXZvaWQgaW5pdGlhbGl6ZUF0dHJpYnV0ZShNYXAgYXR0cmlidXRlcykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCWlmIChmQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlmQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJZkF0dHJpYnV0ZXMucHV0QWxsKGF0dHJpYnV0ZXMpOwotCQlwb3N0U2V0QXR0cmlidXRlKCk7Ci0JfQotCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0Jdm9pZCBwb3N0U2V0QXR0cmlidXRlKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCS8vIGRlZmF1bHQgOiBub3AKLQl9Ci0KLQlhYnN0cmFjdCBzaG9ydCBnZXRFcnJvcigpOwotCi0JaW50IGdldENoaWxkQ291bnQoKSB7Ci0JCXJldHVybiAoZkNoaWxkTm9kZXMgIT0gbnVsbCkgPyBmQ2hpbGROb2Rlcy5zaXplKCkgOiAwOwotCX0KLQotCWludCBnZXRSZWZlcmVuY2VDb3VudCgpIHsKLQkJcmV0dXJuIGZSZWZDb3VudDsKLQl9Ci0KLQotCXByaXZhdGUgTGlzdCBmQ2hpbGROb2RlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmQXR0cmlidXRlcyA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZlJlZkNvdW50ID0gMDsgLy8gZm9yIGVycm9yIGNoZWNrCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9OT1RfQVZBSUxBQkxFID0gIiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTU51bWJlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTU51bWJlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FhZTNlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1OdW1iZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTnVtYmVyOwotCi1jbGFzcyBDU1NNTU51bWJlckltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1OdW1iZXIgewotCi0KLQlwdWJsaWMgQ1NTTU1OdW1iZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfTlVNQkVSOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0VHlwZSgpID09IFRZUEVfVU5JVCk7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1QYWdlUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVBhZ2VSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjhjY2VjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVBhZ2VSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVBhZ2VSdWxlOwotCi1jbGFzcyBDU1NNTVBhZ2VSdWxlSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTVBhZ2VSdWxlIHsKLQotCi0JcHVibGljIENTU01NUGFnZVJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfUEFHRV9SVUxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBjaGlsZC5nZXRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBUWVBFX1BST1BFUlRZIHx8IHR5cGUgPT0gVFlQRV9TRUxFQ1RPUik7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXRDaGlsZENvdW50KCkgPT0gMCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Qcm9wZXJ0eUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVByb3BlcnR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjUyOWZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVByb3BlcnR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVByb3BlcnR5OwotCi0KLWNsYXNzIENTU01NUHJvcGVydHlJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NUHJvcGVydHkgewotCXB1YmxpYyBDU1NNTVByb3BlcnR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1BST1BFUlRZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9OVU1CRVIgfHwgdHlwZSA9PSBUWVBFX0tFWVdPUkQgfHwgdHlwZSA9PSBUWVBFX0ZVTkNUSU9OIHx8IHR5cGUgPT0gVFlQRV9DT05UQUlORVIgfHwgdHlwZSA9PSBUWVBFX1NUUklORyB8fCB0eXBlID09IFRZUEVfU0VQQVJBVE9SIHx8IHR5cGUgPT0gVFlQRV9QUk9QRVJUWSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NUHJvcGVydHkjZ2V0Q2F0ZWdvcnlOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5TmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShBVFRSX0NBVEVHT1JZKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0VmFsdWVzKCkgewotCQlWYWx1ZUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgVmFsdWVDb2xsZWN0b3IoKTsKLQkJY29sbGVjdG9yLmFwcGx5KHRoaXMpOwotCQlyZXR1cm4gY29sbGVjdG9yLmdldE5vZGVzKCk7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIGlmIChnZXRDaGlsZENvdW50KCkgPT0gMCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DQVRFR09SWSA9ICJjYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVBzZXVkb0NsYXNzSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHNldWRvQ2xhc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OTU5ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHNldWRvQ2xhc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWNsYXNzIENTU01NUHNldWRvQ2xhc3NJbXBsIGV4dGVuZHMgQ1NTTU1TZWxlY3RvckltcGwgewotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwuCi0JICovCi0JcHVibGljIENTU01NUHNldWRvQ2xhc3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTVNlbGVjdG9yI2dldFNlbGVjdG9yVHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RvclR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1BTRVVET19DTEFTUzsKLQl9Ci0KLQl2b2lkIHNldFNlbGVjdG9yU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQlmVmFsdWUgPSAiOiIgKyB2YWx1ZTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHNldWRvRWxlbWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVBzZXVkb0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYmU5MTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHNldWRvRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotcHVibGljIGNsYXNzIENTU01NUHNldWRvRWxlbWVudEltcGwgZXh0ZW5kcyBDU1NNTVNlbGVjdG9ySW1wbCB7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NNTVBzZXVkb0VsZW1lbnRJbXBsLgotCSAqLwotCXB1YmxpYyBDU1NNTVBzZXVkb0VsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTVNlbGVjdG9yI2dldFNlbGVjdG9yVHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RvclR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1BTRVVET19FTEVNRU5UOwotCX0KLQotCXZvaWQgc2V0U2VsZWN0b3JTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCWZWYWx1ZSA9ICI6IiArIHZhbHVlOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU2VsZWN0b3JFeHByZXNzaW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU2VsZWN0b3JFeHByZXNzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDViNGNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVNlbGVjdG9yRXhwcmVzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotY2xhc3MgQ1NTTU1TZWxlY3RvckV4cHJlc3Npb25JbXBsIGV4dGVuZHMgQ1NTTU1TZWxlY3RvckltcGwgewotCi0JcHVibGljIENTU01NU2VsZWN0b3JFeHByZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1TZWxlY3RvciNnZXRTZWxlY3RvclR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0b3JUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9FWFBSRVNTSU9OOwotCX0KLQotCXZvaWQgcG9zdFNldEF0dHJpYnV0ZSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlzdXBlci5wb3N0U2V0QXR0cmlidXRlKCk7Ci0JCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJbWFwLnB1dChFWFBSRVNTSU9OX0FESkFDRU5ULnRvTG93ZXJDYXNlKCksICIrIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFwLnB1dChFWFBSRVNTSU9OX0FUVFJJQlVURS50b0xvd2VyQ2FzZSgpLCAiW10iKTsgLy8kTk9OLU5MUy0xJAotCQltYXAucHV0KEVYUFJFU1NJT05fQ0hJTEQudG9Mb3dlckNhc2UoKSwgIj4iKTsgLy8kTk9OLU5MUy0xJAotCQltYXAucHV0KEVYUFJFU1NJT05fREVTQ0VOREFOVC50b0xvd2VyQ2FzZSgpLCAiJyAnIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFwLnB1dChFWFBSRVNTSU9OX1VOSVZFUlNBTC50b0xvd2VyQ2FzZSgpLCAiKiIpOyAvLyROT04tTkxTLTEkCi0KLQkJZlZhbHVlID0gKFN0cmluZykgbWFwLmdldChuYW1lLnRvTG93ZXJDYXNlKCkpOwotCQlpZiAoZlZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVNlbGVjdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU2VsZWN0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZjI0M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU2VsZWN0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NU2VsZWN0b3I7Ci0KLQotYWJzdHJhY3QgY2xhc3MgQ1NTTU1TZWxlY3RvckltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1TZWxlY3RvciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTTU1TZWxlY3RvckltcGwuCi0JICovCi0JcHVibGljIENTU01NU2VsZWN0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGUjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlI2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfU0VMRUNUT1I7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjZ2V0RXJyb3IoKQotCSAqLwotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NU2VsZWN0b3IjZ2V0U2VsZWN0b3JTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0b3JTdHJpbmcoKSB7Ci0JCXJldHVybiBmVmFsdWU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFNlbGVjdG9yU3RyaW5nKCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZWYWx1ZSA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHJpbmdJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHJpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Y2RlNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU3RyaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVN0cmluZzsKLQotY2xhc3MgQ1NTTU1TdHJpbmdJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NU3RyaW5nIHsKLQotCi0JcHVibGljIENTU01NU3RyaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1NUUklORzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI3Bvc3RTZXRBdHRyaWJ1dGUoKQotCSAqLwotCS8vIHZvaWQgcG9zdFNldEF0dHJpYnV0ZSgpIHRocm93cyBCYWRJbml0aWFsaXphdGlvbkV4Y2VwdGlvbiB7Ci0JLy8gc3VwZXIucG9zdFNldEF0dHJpYnV0ZSgpOwotCS8vIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCS8vIGlmIChuYW1lID09IG51bGwpIHsgdGhyb3cgbmV3IEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKCk7IH0KLQkvLwotCS8vIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCS8vIG1hcC5wdXQoQ1NTU3RyaW5nSUQuU19BTlkudG9Mb3dlckNhc2UoKSwgIjxhbnk+Iik7IC8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1N0cmluZ0lELlNfQ09VTlRFUl9JREVOVElGSUVSLnRvTG93ZXJDYXNlKCksICI8Y291bnRlcj4iKTsKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NTdHJpbmdJRC5TX0ZBTUlMWV9OQU1FLnRvTG93ZXJDYXNlKCksICI8ZmFtaWx5LW5hbWU+Iik7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTU3RyaW5nSUQuU19GT05UX0ZBQ0VfTkFNRS50b0xvd2VyQ2FzZSgpLAotCS8vICI8Zm9udC1mYWNlLW5hbWU+Iik7IC8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1N0cmluZ0lELlNfUEFHRV9JREVOVElGSUVSLnRvTG93ZXJDYXNlKCksCi0JLy8gIjxwYWdlLWlkZW50aWZpZXI+Iik7IC8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1N0cmluZ0lELlNfU1BFQ0lGSUNfVk9JQ0UudG9Mb3dlckNhc2UoKSwKLQkvLyAiPHNwZWNpZmljLXZvaWNlPiIpOyAvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NTdHJpbmdJRC5TX1VSQU5HRS50b0xvd2VyQ2FzZSgpLCAiPHVyYW5nZT4iKTsgLy8kTk9OLU5MUy0xJAotCS8vCi0JLy8gZlZhbHVlID0gKFN0cmluZyltYXAuZ2V0KG5hbWUudG9Mb3dlckNhc2UoKSk7Ci0JLy8gaWYgKGZWYWx1ZSA9PSBudWxsKSB7IHRocm93IG5ldyBCYWRJbml0aWFsaXphdGlvbkV4Y2VwdGlvbigpOyB9Ci0JLy8gfQotCS8vCi0JLy8gLyoKLQkvLyAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkvLyAqLwotCS8vIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JLy8gcmV0dXJuIGZWYWx1ZTsKLQkvLyB9Ci0JLy8KLQkvLyBwcml2YXRlIFN0cmluZyBmVmFsdWUgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU3R5bGVSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU3R5bGVSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzI1N2MzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVN0eWxlUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1TdHlsZVJ1bGU7Ci0KLWNsYXNzIENTU01NU3R5bGVSdWxlSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTVN0eWxlUnVsZSB7Ci0KLQotCXB1YmxpYyBDU1NNTVN0eWxlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9TVFlMRV9SVUxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBjaGlsZC5nZXRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBUWVBFX1BST1BFUlRZIHx8IHR5cGUgPT0gVFlQRV9TRUxFQ1RPUik7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXRDaGlsZENvdW50KCkgPT0gMCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHlsZVNoZWV0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU3R5bGVTaGVldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3ZmQwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHlsZVNoZWV0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVN0eWxlU2hlZXQ7Ci0KLWNsYXNzIENTU01NU3R5bGVTaGVldEltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1TdHlsZVNoZWV0IHsKLQotCi0JcHVibGljIENTU01NU3R5bGVTaGVldEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9TVFlMRV9TSEVFVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FX05PVF9BVkFJTEFCTEU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9DSEFSU0VUX1JVTEUgfHwgdHlwZSA9PSBUWVBFX0lNUE9SVF9SVUxFIHx8IHR5cGUgPT0gVFlQRV9QQUdFX1JVTEUgfHwgdHlwZSA9PSBUWVBFX01FRElBX1JVTEUgfHwgdHlwZSA9PSBUWVBFX0ZPTlRfRkFDRV9SVUxFIHx8IHR5cGUgPT0gVFlQRV9TVFlMRV9SVUxFKTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldENoaWxkQ291bnQoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVVuaXRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Vbml0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzE1NGE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVVuaXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVVuaXQ7Ci0KLS8qKgotICogQ1NTTU1Vbml0IDogZW1iZWRkZWQgdHlwZQotICovCi1jbGFzcyBDU1NNTVVuaXRJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NVW5pdCB7Ci0KLQlwdWJsaWMgQ1NTTU1Vbml0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1VOSVQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Vbml0I2dldFVuaXRTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VW5pdFN0cmluZygpIHsKLQkJcmV0dXJuIGZWYWx1ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNwb3N0U2V0QXR0cmlidXRlKCkKLQkgKi8KLQkvLyB2b2lkIHBvc3RTZXRBdHRyaWJ1dGUoKSB0aHJvd3MgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24gewotCS8vIHN1cGVyLnBvc3RTZXRBdHRyaWJ1dGUoKTsKLQkvLyBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkvLyBpZiAobmFtZSA9PSBudWxsKSB7IHRocm93IG5ldyBCYWRJbml0aWFsaXphdGlvbkV4Y2VwdGlvbigpOyB9Ci0JLy8gTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9DTS50b0xvd2VyQ2FzZSgpLCAiY20iKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9ERUcudG9Mb3dlckNhc2UoKSwgImRlZyIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0VNUy50b0xvd2VyQ2FzZSgpLCAiZW0iKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9FWFMudG9Mb3dlckNhc2UoKSwgImV4Iik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfR1JBRC50b0xvd2VyQ2FzZSgpLCAiZ3JhZCIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0hBU0gudG9Mb3dlckNhc2UoKSwgIiMiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9IWi50b0xvd2VyQ2FzZSgpLCAiSHoiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9JTi50b0xvd2VyQ2FzZSgpLCAiaW4iKTsvLyROT04tTkxTLTEkCi0JLy8gLy8gbWFwLnB1dChDU1NVbml0SUQuVV9JTlRFR0VSLnRvTG93ZXJDYXNlKCksCi0JLy8gIihpbnRlZ2VyKSIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0tIWi50b0xvd2VyQ2FzZSgpLCAia0h6Iik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfTU0udG9Mb3dlckNhc2UoKSwgIm1tIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfTVMudG9Mb3dlckNhc2UoKSwgIm1zIik7Ly8kTk9OLU5MUy0xJAotCS8vIC8vIG1hcC5wdXQoQ1NTVW5pdElELlVfTlVNQkVSLnRvTG93ZXJDYXNlKCksICIobnVtYmVyKSIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX1BDLnRvTG93ZXJDYXNlKCksICJwYyIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX1BFUkNFTlRBR0UudG9Mb3dlckNhc2UoKSwgIiUiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9QVC50b0xvd2VyQ2FzZSgpLCAicHQiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9QWC50b0xvd2VyQ2FzZSgpLCAicHgiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9SQUQudG9Mb3dlckNhc2UoKSwgInJhZCIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX1MudG9Mb3dlckNhc2UoKSwgInMiKTsvLyROT04tTkxTLTEkCi0JLy8gZlZhbHVlID0gKFN0cmluZyltYXAuZ2V0KG5hbWUudG9Mb3dlckNhc2UoKSk7Ci0JLy8gaWYgKGZWYWx1ZSA9PSBudWxsKSB7IHRocm93IG5ldyBCYWRJbml0aWFsaXphdGlvbkV4Y2VwdGlvbigpOyB9Ci0JLy8gfQotCS8qCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRVbml0U3RyaW5nKCk7Ci0JfQotCi0Jdm9pZCBzZXRVbml0U3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQlmVmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldFVuaXRTdHJpbmcoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGZWYWx1ZSA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTWV0YU1vZGVsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01ldGFNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0MGRiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTWV0YU1vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLQotCi1jbGFzcyBDU1NNZXRhTW9kZWxJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01ldGFNb2RlbCB7Ci0JLy8gY2xhc3MgQ1NTTWV0YU1vZGVsSW1wbCBpbXBsZW1lbnRzIENTU01ldGFNb2RlbCB7Ci0JcHVibGljIENTU01ldGFNb2RlbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZOb2RlUG9vbCA9IG5ldyBOb2RlUG9vbCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfTUVUQV9NT0RFTDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FX05PVF9BVkFJTEFCTEU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9TVFlMRV9TSEVFVCB8fCB0eXBlID09IFRZUEVfQ0FURUdPUlkpOwotCX0KLQotCXB1YmxpYyBDU1NNTVN0eWxlU2hlZXQgZ2V0U3R5bGVTaGVldCgpIHsKLQkJSXRlcmF0b3IgaSA9IGdldENoaWxkTm9kZXMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGkubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0VHlwZSgpID09IFRZUEVfU1RZTEVfU0hFRVQpIHsKLQkJCQlyZXR1cm4gKENTU01NU3R5bGVTaGVldCkgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQkJLy8gcmV0dXJuIGZTdHlsZVNoZWV0OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDYXRlZ29yaWVzKCkgewotCQlMaXN0IGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpLm5leHQoKTsKLQkJCWlmIChub2RlLmdldFR5cGUoKSA9PSBUWVBFX0NBVEVHT1JZKSB7Ci0JCQkJY2F0ZWdvcmllcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhdGVnb3JpZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQl2b2lkIGxvYWRDb21wbGV0ZWQoKSB7Ci0JCWZOb2RlUG9vbCA9IG51bGw7Ci0JfQotCi0JLy8gTGlzdCBmQ2F0ZWdvcmllcyA9IG51bGw7Ci0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjaXNWYWxpZCgpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXRTdHlsZVNoZWV0KCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQlOb2RlUG9vbCBnZXROb2RlUG9vbCgpIHsKLQkJcmV0dXJuIGZOb2RlUG9vbDsKLQl9Ci0KLQotCXByaXZhdGUgTm9kZVBvb2wgZk5vZGVQb29sID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NQcm9maWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU1Byb2ZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNDVmNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU1Byb2ZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydHlSZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNZXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotCi1jbGFzcyBDU1NQcm9maWxlSW1wbCBpbXBsZW1lbnRzIENTU1Byb2ZpbGUgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01ldGFNb2RlbFByb2ZpbGVJbmZvSW1wbC4KLQkgKi8KLQlwcml2YXRlIENTU1Byb2ZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NNZXRhTW9kZWxQcm9maWxlSW5mb0ltcGwuCi0JICovCi0JcHVibGljIENTU1Byb2ZpbGVJbXBsKFN0cmluZyBpZCwgVVJMIHVybCkgewotCQl0aGlzKCk7Ci0JCWZJRCA9IGlkOwotCQlmVVJMID0gdXJsOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NNZXRhTW9kZWxQcm9maWxlSW5mb0ltcGwuCi0JICovCi0JQ1NTUHJvZmlsZUltcGwoU3RyaW5nIGlkLCBVUkwgdXJsLCBTdHJpbmcgcmVsYXRpdmVVUkkpIHsKLQkJc3VwZXIoKTsKLQkJZklEID0gaWQ7Ci0JCWZVUkwgPSB1cmw7Ci0JCWZSZWxhdGl2ZVVSSSA9IHJlbGF0aXZlVVJJOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNZXRhTW9kZWxQcm9maWxlSW5mbyNnZXRQcm9maWxlSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZmlsZUlEKCkgewotCQlyZXR1cm4gZklEOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNZXRhTW9kZWxQcm9maWxlSW5mbyNnZXRQcm9maWxlTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuIChmTmFtZSA9PSBudWxsKSA/IGZJRCA6IGZOYW1lOwotCX0KLQotCXB1YmxpYyBDU1NNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgewotCQlpZiAoZk1ldGFNb2RlbCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlucHV0U3RyZWFtIGlucHV0ID0gZ2V0UHJvZmlsZVVSTCgpLm9wZW5TdHJlYW0oKTsKLQkJCQlQcm9maWxlTG9hZGVyIGxvYWRlciA9IG5ldyBQcm9maWxlTG9hZGVyKGdldFJlc291cmNlQnVuZGxlKCksIGdldExvZ2dpbmcoKSk7Ci0JCQkJZk1ldGFNb2RlbCA9IGxvYWRlci5sb2FkUHJvZmlsZShpbnB1dCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkNhbm5vdCBvcGVuIHN0cmVhbSBmb3IgcHJvZmlsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZNZXRhTW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCi0JCUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQlTdHJpbmcgcGx1Z2luSUQgPSBnZXRPd25lclBsdWdpbklEKCk7Ci0JCWlmIChwbHVnaW5JRCAhPSBudWxsKSB7Ci0JCQlidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJLy8gbmVlZGVkIHRvIHdvcmsgYXJvdW5kIEZpbGVMb2NhdG9yLm9wZW5TdHJlYW0gbm90IGxvb2tpbmcgZm9yCi0JCQkJLy8gZmlsZXMgd2l0aCBKYXZhIG5hbWluZyBjb252ZW50aW9ucyAoQlVHMTAzMzQ1KQotCQkJCUlQYXRoW10gcGF0aHMgPSBnZXRSZXNvdXJjZUJ1bmRsZVBhdGhzKCk7Ci0JCQkJaWYgKHBhdGhzICE9IG51bGwpIHsKLQkJCQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOwotCQkJCQlpbnQgaSA9IDA7Ci0JCQkJCXdoaWxlIChpIDwgcGF0aHMubGVuZ3RoICYmIGluU3RyZWFtID09IG51bGwpIHsKLQkJCQkJCUlQYXRoIHBhdGggPSBwYXRoc1tpXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW5TdHJlYW0gPSBGaWxlTG9jYXRvci5vcGVuU3RyZWFtKGJ1bmRsZSwgcGF0aCwgdHJ1ZSk7Ci0JCQkJCQkJaWYgKGluU3RyZWFtICE9IG51bGwpCi0JCQkJCQkJCXJlc291cmNlQnVuZGxlID0gbmV3IFByb3BlcnR5UmVzb3VyY2VCdW5kbGUoaW5TdHJlYW0pOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJKytpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyB1bmFibGUgdG8gb3BlbiBzdHJlYW0gd2l0aCBjdXJyZW50IHBhdGggc28ganVzdAotCQkJCQkJCS8vIHRyeSBuZXh0IHBhdGgKLQkJCQkJCQkrK2k7Ci0JCQkJCQl9Ci0JCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQlpZiAoaW5TdHJlYW0gIT0gbnVsbCkKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHBvdGVudGlhbCByZXNvdXJjZSBidW5kbGUgcGF0aHMgb3IgbnVsbCBpZiB0aGVyZQotCSAqIGFyZSBub25lCi0JICogCi0JICogQHJldHVybiBJUGF0aFtdIG9yIG51bGwKLQkgKi8KLQlwcml2YXRlIElQYXRoW10gZ2V0UmVzb3VyY2VCdW5kbGVQYXRocygpIHsKLQkJSVBhdGhbXSBwYXRocyA9IG5ldyBJUGF0aFswXTsKLQotCQlpZiAoZlJlbGF0aXZlVVJJICE9IG51bGwpIHsKLQkJCS8vIG9yaWdpbmFsIHBhdGggPSBsb2NhdGlvbiBvZiBwcm9maWxlLnhtbCAtIHByb2ZpbGUueG1sCi0JCQlJUGF0aCBvcmlnaW5hbFBhdGggPSBQYXRoLmZyb21PU1N0cmluZyhmUmVsYXRpdmVVUkkpLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQotCQkJU3RyaW5nIGJhc2VOYW1lID0gImNzc3Byb2ZpbGUiOyAvLyROT04tTkxTLTEkIAotCQkJVmVjdG9yIG5hbWVzID0gY2FsY3VsYXRlQnVuZGxlTmFtZXMoYmFzZU5hbWUsIExvY2FsZS5nZXREZWZhdWx0KCkpOwotCi0JCQlpbnQgYSA9IDA7Ci0JCQlwYXRocyA9IG5ldyBJUGF0aFtuYW1lcy5zaXplKCldOwotCQkJZm9yIChpbnQgaSA9IG5hbWVzLnNpemUoKTsgaSA+IDA7IC0taSkgewotCQkJCVN0cmluZyBidW5kbGVOYW1lID0gKFN0cmluZykgbmFtZXMuZ2V0KGkgLSAxKTsKLQkJCQlJUGF0aCBwYXRoID0gb3JpZ2luYWxQYXRoLmFwcGVuZChidW5kbGVOYW1lKS5hZGRGaWxlRXh0ZW5zaW9uKCJwcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlwYXRoc1thXSA9IHBhdGg7Ci0JCQkJKythOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXRoczsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgdGhlIGJ1bmRsZXMgYWxvbmcgdGhlIHNlYXJjaCBwYXRoIGZyb20gdGhlIGJhc2UgYnVuZGxlIHRvIHRoZQotCSAqIGJ1bmRsZSBzcGVjaWZpZWQgYnkgYmFzZU5hbWUgYW5kIGxvY2FsZS48YnIgLz4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBiYXNlIGJ1bmRsZSBuYW1lCi0JICogQHBhcmFtIGxvY2FsZQotCSAqICAgICAgICAgICAgdGhlIGxvY2FsZQotCSAqIEBwYXJhbSBuYW1lcwotCSAqICAgICAgICAgICAgdGhlIHZlY3RvciB1c2VkIHRvIHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGJ1bmRsZXMgYWxvbmcgdGhlCi0JICogICAgICAgICAgICBzZWFyY2ggcGF0aC4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIFZlY3RvciBjYWxjdWxhdGVCdW5kbGVOYW1lcyhTdHJpbmcgYmFzZU5hbWUsIExvY2FsZSBsb2NhbGUpIHsKLQkgICAgLy8gdGhpcyBtZXRob2QgY2FuIGJlIGRlbGV0ZWQgYWZ0ZXIgQlVHMTAzMzQ1IGlzIGZpeGVkCi0JCWZpbmFsIFZlY3RvciByZXN1bHQgPSBuZXcgVmVjdG9yKDQpOyAvLyBkZWZhdWx0IHNpemUgNAotCQlmaW5hbCBTdHJpbmcgbGFuZ3VhZ2UgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKLQkJZmluYWwgaW50IGxhbmd1YWdlTGVuZ3RoID0gbGFuZ3VhZ2UubGVuZ3RoKCk7Ci0JCWZpbmFsIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKLQkJZmluYWwgaW50IGNvdW50cnlMZW5ndGggPSBjb3VudHJ5Lmxlbmd0aCgpOwotCQlmaW5hbCBTdHJpbmcgdmFyaWFudCA9IGxvY2FsZS5nZXRWYXJpYW50KCk7Ci0JCWZpbmFsIGludCB2YXJpYW50TGVuZ3RoID0gdmFyaWFudC5sZW5ndGgoKTsKLQotCQlyZXN1bHQuYWRkRWxlbWVudChiYXNlTmFtZSk7IC8vIGF0IGxlYXN0IGFkZCBiYXNlIG5hbWUKLQkJaWYgKGxhbmd1YWdlTGVuZ3RoICsgY291bnRyeUxlbmd0aCArIHZhcmlhbnRMZW5ndGggPT0gMCkgewotCQkJLy8gVGhlIGxvY2FsZSBpcyAiIiwgIiIsICIiLgotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlmaW5hbCBTdHJpbmdCdWZmZXIgdGVtcCA9IG5ldyBTdHJpbmdCdWZmZXIoYmFzZU5hbWUpOwotCQl0ZW1wLmFwcGVuZCgnXycpOwotCQl0ZW1wLmFwcGVuZChsYW5ndWFnZSk7Ci0JCWlmIChsYW5ndWFnZUxlbmd0aCA+IDApIHsKLQkJCXJlc3VsdC5hZGRFbGVtZW50KHRlbXAudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlpZiAoY291bnRyeUxlbmd0aCArIHZhcmlhbnRMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQl0ZW1wLmFwcGVuZCgnXycpOwotCQl0ZW1wLmFwcGVuZChjb3VudHJ5KTsKLQkJaWYgKGNvdW50cnlMZW5ndGggPiAwKSB7Ci0JCQlyZXN1bHQuYWRkRWxlbWVudCh0ZW1wLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJaWYgKHZhcmlhbnRMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQl0ZW1wLmFwcGVuZCgnXycpOwotCQl0ZW1wLmFwcGVuZCh2YXJpYW50KTsKLQkJcmVzdWx0LmFkZEVsZW1lbnQodGVtcC50b1N0cmluZygpKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNZXRhTW9kZWxQcm9maWxlSW5mbyNnZXRQcm9maWxlVVJMKCkKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFByb2ZpbGVVUkwoKSB7Ci0JCXJldHVybiBmVVJMOwotCX0KLQotCXZvaWQgc2V0UHJvZmlsZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZk5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIGZEZWZhdWx0OwotCX0KLQotCXZvaWQgc2V0RGVmYXVsdChib29sZWFuIGlzRGVmYXVsdCkgewotCQlmRGVmYXVsdCA9IGlzRGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE93bmVyUGx1Z2luSUQoKSB7Ci0JCXJldHVybiBmT3duZXJQbHVnaW5JRDsKLQl9Ci0KLQl2b2lkIHNldE93bmVyUGx1Z2luSUQoU3RyaW5nIHBsdWdpbklEKSB7Ci0JCWZPd25lclBsdWdpbklEID0gcGx1Z2luSUQ7Ci0JfQotCi0JLyoqCi0JICogaGlkZGVuIG9wdGlvbiA6IGxvZ2dpbmcKLQkgKi8KLQl2b2lkIHNldExvZ2dpbmcoYm9vbGVhbiBsb2dnaW5nKSB7Ci0JCWZMb2dnaW5nID0gbG9nZ2luZzsKLQl9Ci0KLQlib29sZWFuIGdldExvZ2dpbmcoKSB7Ci0JCXJldHVybiBmTG9nZ2luZzsKLQl9Ci0KLQotCVN0cmluZyBmSUQgPSBudWxsOwotCVN0cmluZyBmTmFtZSA9IG51bGw7Ci0JVVJMIGZVUkwgPSBudWxsOwotCUNTU01ldGFNb2RlbCBmTWV0YU1vZGVsID0gbnVsbDsKLQlTdHJpbmcgZk93bmVyUGx1Z2luSUQgPSBudWxsOwotCWJvb2xlYW4gZkRlZmF1bHQgPSBmYWxzZTsKLQlib29sZWFuIGZMb2dnaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZlJlbGF0aXZlVVJJID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NQcm9maWxlVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU1Byb2ZpbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYjVlMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU1Byb2ZpbGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGU7Ci0KLQotY2xhc3MgQ1NTUHJvZmlsZVRlc3QgewotCi0KLQkvKioKLQkgKiBUZXN0IHVzZSBvbmx5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpZiAoYXJncy5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkJQ1NTTWV0YU1vZGVsIG1ldGFtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlDU1NQcm9maWxlIHByb2ZpbGUgPSBuZXcgQ1NTUHJvZmlsZUltcGwoInRlc3QiLCBuZXcgVVJMKGFyZ3NbMF0pKTsgLy8kTk9OLU5MUy0xJAotCQkJbWV0YW1vZGVsID0gcHJvZmlsZS5nZXRNZXRhTW9kZWwoKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJaWYgKG1ldGFtb2RlbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyoKLQkJICogQ1NTTU1UeXBlQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBDU1NNTVR5cGVDb2xsZWN0b3IoKTsKLQkJICogY29sbGVjdG9yLmFwcGx5KG1ldGFtb2RlbCwgQ1NTTU1Ob2RlLlRZUEVfUFJPUEVSVFkpOyBJdGVyYXRvcgotCQkgKiBpUHJvcGVydHkgPSBjb2xsZWN0b3IuZ2V0Tm9kZXMoKTsgd2hpbGUgKGlQcm9wZXJ0eS5oYXNOZXh0KCkpIHsKLQkJICogQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKWlQcm9wZXJ0eS5uZXh0KCk7Ci0JCSAqIFN5c3RlbS5vdXQucHJpbnRsbigiUHJvcGVydHkgIiArIG5vZGUuZ2V0TmFtZSgpICsgIiBjYW4gY29udGFpbjoiKTsKLQkJICogLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkIEl0ZXJhdG9yIGlWYWx1ZSA9Ci0JCSAqIG5vZGUuZ2V0RGVzY2VuZGFudHMoKTsgd2hpbGUgKGlWYWx1ZS5oYXNOZXh0KCkpIHsKLQkJICogZGVidWdPdXQoKENTU01NTm9kZSlpVmFsdWUubmV4dCgpLCAwLCBmYWxzZSk7IH0gfQotCQkgKi8KLQkJZGVidWdPdXQobWV0YW1vZGVsLCAwLCB0cnVlKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBkZWJ1Z091dChDU1NNTU5vZGUgbm9kZSwgaW50IGRlcHRoLCBib29sZWFuIHJlY3Vyc2l2ZSkgewotCQlTdHJpbmcgdHlwZSA9IG5vZGUuZ2V0VHlwZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50KCJbICIgKyBub2RlLmdldE5hbWUoKSArICIoIiArIHR5cGUgKyAiKSBdIik7IC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCWlmICh0eXBlID09IENTU01NTm9kZS5UWVBFX1VOSVQgfHwgdHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9LRVlXT1JEIHx8IHR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfRlVOQ1RJT04gfHwgdHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9TRUxFQ1RPUikgewotCQkJU3lzdGVtLm91dC5wcmludCgiIC0+ICIgKyBub2RlLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0KLQkJaWYgKHJlY3Vyc2l2ZSkgewotCQkJamF2YS51dGlsLkl0ZXJhdG9yIGlOb2RlID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQl3aGlsZSAoaU5vZGUuaGFzTmV4dCgpKSB7Ci0JCQkJZGVidWdPdXQoKENTU01NTm9kZSkgaU5vZGUubmV4dCgpLCBkZXB0aCArIDEsIHRydWUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL01ldGFNb2RlbEVycm9ycy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL01ldGFNb2RlbEVycm9ycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2EzODFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9NZXRhTW9kZWxFcnJvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW50ZXJmYWNlIE1ldGFNb2RlbEVycm9ycyB7Ci0KLQlzdGF0aWMgZmluYWwgc2hvcnQgTk9fRVJST1IgPSAwOwotCi0JLy8gTUFTSwotCXN0YXRpYyBmaW5hbCBzaG9ydCBNQVNLX1dBUk5JTkcgPSAweDEwMDA7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IE1BU0tfRVJST1IgPSAweDIwMDA7Ci0KLQkvLyBFUlJPUgotCXN0YXRpYyBmaW5hbCBzaG9ydCBFUlJPUl9OT1RfREVGSU5FRCA9IE1BU0tfRVJST1IgKyAweDAxOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBFUlJPUl9JTlZBTElEX05BTUUgPSBNQVNLX0VSUk9SICsgMHgwNDsKLQlzdGF0aWMgZmluYWwgc2hvcnQgRVJST1JfSU5WQUlMRF9DSElMRCA9IE1BU0tfRVJST1IgKyAweDAyOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBFUlJPUl9OT19DSElMRCA9IE1BU0tfRVJST1IgKyAweDA4OwotCS8vIHN0YXRpYyBmaW5hbCBzaG9ydCBFUlJPUl9OT19FU1NFTlRJQUxfQ0hJTEQgPSBNQVNLX0VSUk9SICsgMHgxMAotCi0JLy8gV0FSTklORwotCXN0YXRpYyBmaW5hbCBzaG9ydCBXQVJOSU5HX0hBU19OT19DSElMRCA9IE1BU0tfV0FSTklORyArIDB4MDE7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvTm9kZVBvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Ob2RlUG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWNiNTY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Ob2RlUG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLQotY2xhc3MgTm9kZVBvb2wgewotCi0JTm9kZVBvb2woKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemVDbGFzc05hbWVUYWJsZSgpOwotCX0KLQotCUNTU01NTm9kZUltcGwgZ2V0Tm9kZShTdHJpbmcgdGFnTmFtZSwgU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCWlmIChub2RlTmFtZSAhPSBudWxsKSB7Ci0JCQlub2RlTmFtZSA9IG5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGNsYXNzTmFtZXMuZ2V0KHRhZ05hbWUpOwotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCU1hcCBub2RlcyA9IChNYXApIG5vZGVSZWdpc3RyeS5nZXQoY2xhc3NOYW1lKTsKLQkJaWYgKG5vZGVzID09IG51bGwpIHsKLQkJCW5vZGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCW5vZGVSZWdpc3RyeS5wdXQoY2xhc3NOYW1lLCBub2Rlcyk7Ci0JCX0KLQkJQ1NTTU1Ob2RlSW1wbCBub2RlID0gKENTU01NTm9kZUltcGwpIG5vZGVzLmdldChub2RlTmFtZSk7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCW5vZGUgPSBjcmVhdGVOZXdOb2RlKGNsYXNzTmFtZSk7Ci0JCQlub2Rlcy5wdXQobm9kZU5hbWUsIG5vZGUpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXByaXZhdGUgQ1NTTU1Ob2RlSW1wbCBjcmVhdGVOZXdOb2RlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJQ1NTTU1Ob2RlSW1wbCBub2RlID0gbnVsbDsKLQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQljbGFzc05hbWUgPSBnZXRQYWNrYWdlTmFtZSgpICsgIi4iICsgY2xhc3NOYW1lOyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCW5vZGUgPSAoQ1NTTU1Ob2RlSW1wbCkgQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCWNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGNsYXNzTmFtZSArICIgaXMgQ3JlYXRlZCIpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBFcnJvciBjaGVjayBmdW5jdGlvbjogZmluZCBub2RlcyB0aGF0IGFyZSBub3QgcmVmZXJyZWQgYnkgYW55IG5vZGUKLQkgKi8KLQlJdGVyYXRvciBnZXRTdHJheU5vZGVzKCkgewotCQlMaXN0IHN0cmF5Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGlNYXAgPSBub2RlUmVnaXN0cnkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGlNYXAuaGFzTmV4dCgpKSB7Ci0JCQlNYXAgbm9kZXMgPSAoTWFwKSBpTWFwLm5leHQoKTsKLQkJCUl0ZXJhdG9yIGlOb2RlID0gbm9kZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpTm9kZS5oYXNOZXh0KCkpIHsKLQkJCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSAoQ1NTTU1Ob2RlSW1wbCkgaU5vZGUubmV4dCgpOwotCQkJCWlmIChub2RlLmdldFJlZmVyZW5jZUNvdW50KCkgPT0gMCkgewotCQkJCQlzdHJheU5vZGVzLmFkZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0cmF5Tm9kZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvLyBUaGlzIGNsYXNzIG11c3Qgbm90IGJlIGlubmVyIGNsYXNzIDopCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0JCWlmIChmUGFja2FnZU5hbWUgPT0gbnVsbCkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJaW50IHBvcyA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKDAgPCBwb3MpIHsKLQkJCQlmUGFja2FnZU5hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIHBvcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmUGFja2FnZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBmUGFja2FnZU5hbWU7Ci0JfQotCi0Jdm9pZCBpbml0aWFsaXplQ2xhc3NOYW1lVGFibGUoKSB7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5TVFlMRVNIRUVUX0RFRiwgQ0xBU1NfU1RZTEVfU0hFRVQpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuQ0hBUlNFVF9SVUxFX0RFRiwgQ0xBU1NfQ0hBUlNFVF9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkNIQVJTRVRfUlVMRSwgQ0xBU1NfQ0hBUlNFVF9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkZPTlRGQUNFX1JVTEVfREVGLCBDTEFTU19GT05UX0ZBQ0VfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5GT05URkFDRV9SVUxFLCBDTEFTU19GT05UX0ZBQ0VfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5JTVBPUlRfUlVMRV9ERUYsIENMQVNTX0lNUE9SVF9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLklNUE9SVF9SVUxFLCBDTEFTU19JTVBPUlRfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5NRURJQV9SVUxFX0RFRiwgQ0xBU1NfTUVESUFfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5NRURJQV9SVUxFLCBDTEFTU19NRURJQV9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlBBR0VfUlVMRV9ERUYsIENMQVNTX1BBR0VfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QQUdFX1JVTEUsIENMQVNTX1BBR0VfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5TVFlMRV9SVUxFX0RFRiwgQ0xBU1NfU1RZTEVfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5TVFlMRV9SVUxFLCBDTEFTU19TVFlMRV9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlBST1BFUlRZX0RFRiwgQ0xBU1NfUFJPUEVSVFkpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuUFJPUEVSVFksIENMQVNTX1BST1BFUlRZKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkRFU0NSSVBUT1JfREVGLCBDTEFTU19ERVNDUklQVE9SKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkRFU0NSSVBUT1IsIENMQVNTX0RFU0NSSVBUT1IpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuQ09OVEFJTkVSX0RFRiwgQ0xBU1NfQ09OVEFJTkVSKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkNPTlRBSU5FUiwgQ0xBU1NfQ09OVEFJTkVSKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLk5VTUJFUl9ERUYsIENMQVNTX05VTUJFUik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5OVU1CRVIsIENMQVNTX05VTUJFUik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5LRVlXT1JEX0RFRiwgQ0xBU1NfS0VZV09SRCk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5LRVlXT1JELCBDTEFTU19LRVlXT1JEKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlVOSVQsIENMQVNTX1VOSVQpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuVU5JVF9ERUYsIENMQVNTX1VOSVQpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuRlVOQ1RJT04sIENMQVNTX0ZVTkNUSU9OKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkZVTkNUSU9OX0RFRiwgQ0xBU1NfRlVOQ1RJT04pOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuU0VMRUNUT1JfRVhQUkVTU0lPTiwgQ0xBU1NfU0VMRUNUT1JfRVhQUkVTU0lPTik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QU0VVRE9fRUxFTUVOVCwgQ0xBU1NfUFNFVURPX0VMRU1FTlQpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuUFNFVURPX0VMRU1FTlRfREVGLCBDTEFTU19QU0VVRE9fRUxFTUVOVCk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QU0VVRE9fQ0xBU1MsIENMQVNTX1BTRVVET19DTEFTUyk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QU0VVRE9fQ0xBU1NfREVGLCBDTEFTU19QU0VVRE9fQ0xBU1MpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuU1RSSU5HLCBDTEFTU19TVFJJTkcpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuQ0FURUdPUllfREVGLCBDTEFTU19DQVRFR09SWSk7Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBmUGFja2FnZU5hbWU7Ci0JLyoKLQkgKiBDb252ZXJzaW9uIFRhYmxlcyBub2RlUmVnaXN0cnkgOiBjbGFzcyBuYW1lIC0+IGhhc2ggb2Ygbm9kZSBpbnN0YW5jZXMKLQkgKiBjbGFzc05hbWVzIDogUHJvZmlsZSBUYWcgbmFtZSAtPiBqYXZhIGNsYXNzIG5hbWUKLQkgKi8KLQlwcml2YXRlIE1hcCBub2RlUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgTWFwIGNsYXNzTmFtZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1NUWUxFX1NIRUVUID0gIkNTU01NU3R5bGVTaGVldEltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0NIQVJTRVRfUlVMRSA9ICJDU1NNTUNoYXJzZXRSdWxlSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfRk9OVF9GQUNFX1JVTEUgPSAiQ1NTTU1Gb250RmFjZVJ1bGVJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19JTVBPUlRfUlVMRSA9ICJDU1NNTUltcG9ydFJ1bGVJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19NRURJQV9SVUxFID0gIkNTU01NTWVkaWFSdWxlSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfUEFHRV9SVUxFID0gIkNTU01NUGFnZVJ1bGVJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19TVFlMRV9SVUxFID0gIkNTU01NU3R5bGVSdWxlSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfUFJPUEVSVFkgPSAiQ1NTTU1Qcm9wZXJ0eUltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0RFU0NSSVBUT1IgPSAiQ1NTTU1EZXNjcmlwdG9ySW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfQ09OVEFJTkVSID0gIkNTU01NQ29udGFpbmVySW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfTlVNQkVSID0gIkNTU01NTnVtYmVySW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfS0VZV09SRCA9ICJDU1NNTUtleXdvcmRJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19VTklUID0gIkNTU01NVW5pdEltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0ZVTkNUSU9OID0gIkNTU01NRnVuY3Rpb25JbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19TVFJJTkcgPSAiQ1NTTU1TdHJpbmdJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19DQVRFR09SWSA9ICJDU1NNTUNhdGVnb3J5SW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfU0VMRUNUT1JfRVhQUkVTU0lPTiA9ICJDU1NNTVNlbGVjdG9yRXhwcmVzc2lvbkltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1BTRVVET19DTEFTUyA9ICJDU1NNTVBzZXVkb0NsYXNzSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfUFNFVURPX0VMRU1FTlQgPSAiQ1NTTU1Qc2V1ZG9FbGVtZW50SW1wbCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Qcm9maWxlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1Byb2ZpbGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYTZiMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1Byb2ZpbGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVNlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGVSZWdpc3RyeTsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0KLWNsYXNzIFByb2ZpbGVIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCi0JcHVibGljIFByb2ZpbGVIYW5kbGVyKENTU01ldGFNb2RlbEltcGwgbWV0YW1vZGVsLCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwgYm9vbGVhbiBsb2dnaW5nKSB7Ci0JCXN1cGVyKCk7Ci0JCWZNZXRhTW9kZWwgPSBtZXRhbW9kZWw7Ci0JCWZOb2RlUG9vbCA9IG1ldGFtb2RlbC5nZXROb2RlUG9vbCgpOwotCQlmUmVzb3VyY2VCdW5kbGUgPSByZXNvdXJjZUJ1bmRsZTsKLQkJZkxvZ2dpbmcgPSBsb2dnaW5nOwotCX0KLQotCXB1YmxpYyBQcm9maWxlSGFuZGxlcihDU1NNZXRhTW9kZWxJbXBsIG1ldGFtb2RlbCwgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUpIHsKLQkJc3VwZXIoKTsKLQkJZk1ldGFNb2RlbCA9IG1ldGFtb2RlbDsKLQkJZk5vZGVQb29sID0gbWV0YW1vZGVsLmdldE5vZGVQb29sKCk7Ci0JCWZSZXNvdXJjZUJ1bmRsZSA9IHJlc291cmNlQnVuZGxlOwotCQlmTG9nZ2luZyA9IGZhbHNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGtleS5lcXVhbHMoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JCWlmICgha2V5LnN0YXJ0c1dpdGgoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JCWlmIChrZXkuc3RhcnRzV2l0aCgiJSUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4ga2V5LnN1YnN0cmluZygxKTsKLQkJfQotCi0JCWlmIChmUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5LnN1YnN0cmluZygxKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInN0YXJ0RG9jdW1lbnQiKTsKLQkJLy8gZk5vZGVTdGFjay5wdXNoKG1ldGFtb2RlbCk7Ci0JCS8vIGZDdXJyZW50Tm9kZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJbmV3IEVycm9yQ29ycmVjdG9yKCkuZG9Db3JyZWN0KGZNZXRhTW9kZWwpOwotCQlpZiAoZkxvZ2dpbmcpIHsKLQkJCUl0ZXJhdG9yIGkgPSBmTm9kZVBvb2wuZ2V0U3RyYXlOb2RlcygpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpLm5leHQoKTsKLQkJCQlTdHJpbmcgc3RyID0gIltDU1NQcm9maWxlIFdhcm5pbmddICIgKyBub2RlLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN0ciArPSAiKCIgKyBub2RlLmdldFR5cGUoKSArICIpIGlzIG5vdCByZWZlcnJlZCBieSBhbnkgbm9kZS4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCBzdHIpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihzdHIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJVGFnTm9kZSB0YWdOb2RlID0gbnVsbDsKLQkJQ1NTTU1Ob2RlSW1wbCBwYXJlbnROb2RlID0gbnVsbDsKLQkJaWYgKDAgPCBmTm9kZVN0YWNrLnNpemUoKSkgewotCQkJdGFnTm9kZSA9IChUYWdOb2RlKSBmTm9kZVN0YWNrLnBlZWsoKTsKLQkJCXBhcmVudE5vZGUgPSB0YWdOb2RlLm5vZGU7Ci0JCX0KLQotCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSBudWxsOwotCQlpZiAocU5hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5QUk9GSUxFX0lNUE9SVCkpIHsgLy8gaW1wb3J0Ci0JCQlTdHJpbmcgcHJvZmlsZU5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfTkFNRV9SRUZFUkVOQ0UpOwotCQkJaW1wb3J0UHJvZmlsZShwcm9maWxlTmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNEZWZpbml0aW9uKHFOYW1lKSkgeyAvLyBub2RlIGNyZWF0aW9uCi0JCQlTdHJpbmcgbm9kZU5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfTkFNRV9ERUZJTklUSU9OKTsKLQkJCW5vZGUgPSBmTm9kZVBvb2wuZ2V0Tm9kZShxTmFtZSwgbm9kZU5hbWUpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBvdmVyd3JpdGUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfT1ZFUldSSVRFKTsKLQkJCQlpZiAob3ZlcndyaXRlID09IG51bGwgfHwgb3ZlcndyaXRlLmVxdWFscyhBVFRSX1ZBTFVFX09WRVJXUklURV9GQUxTRSkpIHsKLQkJCQkJbm9kZS5yZW1vdmVBbGxDaGlsZE5vZGVzKCk7Ci0JCQkJfQotCQkJCU1hcCBhdHRyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlhdHRyTWFwLnB1dChhdHRyaWJ1dGVzLmdldFFOYW1lKGkpLCBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpKTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJbm9kZS5pbml0aWFsaXplQXR0cmlidXRlKGF0dHJNYXApOwotCQkJCX0KLQkJCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSA9PSBudWxsKSB7IC8vIG5vZGUgcmVmZXJlbmNlCi0JCQlTdHJpbmcgbm9kZU5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfTkFNRV9SRUZFUkVOQ0UpOwotCQkJbm9kZSA9IGZOb2RlUG9vbC5nZXROb2RlKHFOYW1lLCBub2RlTmFtZSk7Ci0JCX0KLQotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50Tm9kZSAhPSBudWxsICYmIHBhcmVudE5vZGUuY2FuQ29udGFpbihub2RlKSkgewotCQkJCVN0cmluZyBlbmFibGVkID0gYXR0cmlidXRlcy5nZXRWYWx1ZShBVFRSX0VOQUJMRUQpOwotCQkJCWlmIChlbmFibGVkICE9IG51bGwgJiYgZW5hYmxlZC5lcXVhbHMoQVRUUl9WQUxVRV9FTkFCTEVEX0ZBTFNFKSkgewotCQkJCQlwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9TVFlMRV9TSEVFVCB8fCBub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9DQVRFR09SWSkgewotCQkJCWZNZXRhTW9kZWwuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZkxvZ2dpbmcgJiYgcGFyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBwYXJlbnROb2RlLmdldFR5cGUoKSArICIgY2Fubm90IGNvbnRhaW4gIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJbm9kZS5nZXRUeXBlKCkgKyAiICgiICsgcU5hbWUgKyAiKSIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWZOb2RlU3RhY2sucHVzaChuZXcgVGFnTm9kZShxTmFtZSwgKG5vZGUgIT0gbnVsbCkgPyBub2RlIDogcGFyZW50Tm9kZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJZk5vZGVTdGFjay5wb3AoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJVGFnTm9kZSB0YWdOb2RlID0gKFRhZ05vZGUpIGZOb2RlU3RhY2sucGVlaygpOwotCQlTdHJpbmcgdGFnTmFtZSA9IHRhZ05vZGUudGFnOwotCQlpZiAodGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLktFWVdPUkRfVkFMVUUpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5VTklUX1ZBTFVFKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuRlVOQ1RJT05fVkFMVUUpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5TRUxFQ1RPUl9WQUxVRSkgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLkRFU0NSSVBUSU9OKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuQ0FQVElPTikpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJYnVmLmFwcGVuZChjaFtzdGFydCArIGldKTsKLQkJCX0KLQkJCVN0cmluZyB2YWx1ZSA9IGdldFJlc291cmNlU3RyaW5nKGJ1Zi50b1N0cmluZygpLnRyaW0oKSk7Ci0JCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSB0YWdOb2RlLm5vZGU7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX0tFWVdPUkQgJiYgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLktFWVdPUkRfVkFMVUUpKSB7Ci0JCQkJCSgoQ1NTTU1LZXl3b3JkSW1wbCkgbm9kZSkuc2V0S2V5d29yZFN0cmluZyh2YWx1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX1VOSVQgJiYgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlVOSVRfVkFMVUUpKSB7Ci0JCQkJCSgoQ1NTTU1Vbml0SW1wbCkgbm9kZSkuc2V0VW5pdFN0cmluZyh2YWx1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX0ZVTkNUSU9OICYmIHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5GVU5DVElPTl9WQUxVRSkpIHsKLQkJCQkJKChDU1NNTUZ1bmN0aW9uSW1wbCkgbm9kZSkuc2V0RnVuY3Rpb25TdHJpbmcodmFsdWUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9TRUxFQ1RPUiAmJiAoKENTU01NU2VsZWN0b3IpIG5vZGUpLmdldFNlbGVjdG9yVHlwZSgpID09IENTU01NU2VsZWN0b3IuVFlQRV9QU0VVRE9fRUxFTUVOVCkgewotCQkJCQkoKENTU01NUHNldWRvRWxlbWVudEltcGwpIG5vZGUpLnNldFNlbGVjdG9yU3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfU0VMRUNUT1IgJiYgKChDU1NNTVNlbGVjdG9yKSBub2RlKS5nZXRTZWxlY3RvclR5cGUoKSA9PSBDU1NNTVNlbGVjdG9yLlRZUEVfUFNFVURPX0NMQVNTKSB7Ci0JCQkJCSgoQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwpIG5vZGUpLnNldFNlbGVjdG9yU3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfQ0FURUdPUlkgJiYgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLkNBUFRJT04pKSB7Ci0JCQkJCSgoQ1NTTU1DYXRlZ29yeUltcGwpIG5vZGUpLnNldENhcHRpb24odmFsdWUpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuREVTQ1JJUFRJT04pKSB7Ci0JCQkJCW5vZGUuc2V0RGVzY3JpcHRpb24odmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RlZmluaXRpb24oU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuICh0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuU1RZTEVTSEVFVF9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5DSEFSU0VUX1JVTEVfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuSU1QT1JUX1JVTEVfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuUEFHRV9SVUxFX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLk1FRElBX1JVTEVfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuRk9OVEZBQ0VfUlVMRV9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5TVFlMRV9SVUxFX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLktFWVdPUkRfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuTlVNQkVSX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlBST1BFUlRZX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLkRFU0NSSVBUT1JfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuQ09OVEFJTkVSX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlVOSVRfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuRlVOQ1RJT05fREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuU1RSSU5HKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuQ0FURUdPUllfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuUFNFVURPX0NMQVNTX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlBTRVVET19FTEVNRU5UX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlNFTEVDVE9SX0VYUFJFU1NJT04pIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5TRVBBUkFUT1IpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW1wb3J0UHJvZmlsZShTdHJpbmcgcHJvZmlsZU5hbWUpIHsKLQkJVVJMIHByb2ZpbGVVUkwgPSBudWxsOwotCQlDU1NQcm9maWxlUmVnaXN0cnkgcmVnID0gQ1NTUHJvZmlsZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IHJlZy5nZXRQcm9maWxlKHByb2ZpbGVOYW1lKTsKLQkJaWYgKHByb2ZpbGUgIT0gbnVsbCkgewotCQkJLy8gZmlyc3Q6IGZpbmQgVVJMIGJ5IElECi0JCQlwcm9maWxlVVJMID0gcHJvZmlsZS5nZXRQcm9maWxlVVJMKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBzZWNvbmQ6IGZpbmQgVVJMIGJ5IGZpbGVuYW1lIG9mIHByb2ZpbGUgVVJMCi0JCQlJdGVyYXRvciBpID0gcmVnLmdldFByb2ZpbGVzKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlwcm9maWxlID0gKENTU1Byb2ZpbGUpIGkubmV4dCgpOwotCQkJCVVSTCB1cmwgPSBwcm9maWxlLmdldFByb2ZpbGVVUkwoKTsKLQkJCQlpZiAodXJsLmdldEZpbGUoKS5lbmRzV2l0aChwcm9maWxlTmFtZSkpIHsKLQkJCQkJcHJvZmlsZVVSTCA9IHVybDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChwcm9maWxlVVJMID09IG51bGwpIHsKLQkJCS8vIGZpbmFsOiBpdCBtYXkgYmUgdXJsIGl0c2VsZgotCQkJdHJ5IHsKLQkJCQlwcm9maWxlVVJMID0gbmV3IFVSTChwcm9maWxlTmFtZSk7Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCWlmIChwcm9maWxlVVJMICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJUHJvZmlsZUxvYWRlci5sb2FkUHJvZmlsZShmTWV0YU1vZGVsLCBwcm9maWxlVVJMLm9wZW5TdHJlYW0oKSwgZlJlc291cmNlQnVuZGxlLCBmTG9nZ2luZyk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkNhbm5vdCBvcGVuIHN0cmVhbSBmb3IgcHJvZmlsZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQllKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFRhZ05vZGUgewotCi0JCVN0cmluZyB0YWcgPSBudWxsOwotCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSBudWxsOwotCi0JCVRhZ05vZGUoU3RyaW5nIHRhZywgQ1NTTU1Ob2RlSW1wbCBub2RlKSB7Ci0JCQl0aGlzLnRhZyA9IHRhZzsKLQkJCXRoaXMubm9kZSA9IG5vZGU7Ci0JCX0KLQl9Ci0KLQljbGFzcyBFcnJvckNvcnJlY3RvciB7Ci0KLQkJdm9pZCBkb0NvcnJlY3QoQ1NTTU1Ob2RlSW1wbCBub2RlKSB7Ci0JCQlJdGVyYXRvciBpID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlBcnJheUxpc3QgZXJyb3JOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUNTU01NTm9kZUltcGwgY2hpbGQgPSAoQ1NTTU1Ob2RlSW1wbCkgaS5uZXh0KCk7Ci0JCQkJZG9Db3JyZWN0KGNoaWxkKTsKLQkJCQlzaG9ydCBlcnJvciA9IGNoaWxkLmdldEVycm9yKCk7Ci0JCQkJaWYgKGVycm9yICE9IE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUikgewotCQkJCQkvLyBub2RlLnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQkJZXJyb3JOb2Rlcy5hZGQoY2hpbGQpOwotCi0JCQkJCVN0cmluZyBzdHIgPSAiW0NTU1Byb2ZpbGUgRXJyb3JdICIgKyBub2RlLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHIgKz0gIigiICsgbm9kZS5nZXRUeXBlKCkgKyAiKSBjb250YWlucyBlcnJvciBub2RlOiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJc3RyICs9IGNoaWxkLmdldE5hbWUoKSArICIoIiArIGNoaWxkLmdldFR5cGUoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXN0ciArPSAiIC0gZXJyb3IgY29kZSA9ICIgKyBlcnJvcjsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZkxvZ2dpbmcpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBzdHIpOwotCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHN0cik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpbnQgZXJyb3JTaXplID0gZXJyb3JOb2Rlcy5zaXplKCk7Ci0JCQlpZiAoZXJyb3JTaXplID4gMCkgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXJyb3JTaXplOyBqKyspIHsKLQkJCQkJQ1NTTU1Ob2RlSW1wbCBlcnJvck5vZGUgPSAoQ1NTTU1Ob2RlSW1wbCkgZXJyb3JOb2Rlcy5nZXQoaik7Ci0JCQkJCW5vZGUucmVtb3ZlQ2hpbGQoZXJyb3JOb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgQ1NTTWV0YU1vZGVsSW1wbCBmTWV0YU1vZGVsID0gbnVsbDsKLQlwcml2YXRlIE5vZGVQb29sIGZOb2RlUG9vbCA9IG51bGw7Ci0JcHJpdmF0ZSBTdGFjayBmTm9kZVN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JYm9vbGVhbiBmTG9nZ2luZyA9IGZhbHNlOwotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgZlJlc291cmNlQnVuZGxlID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX05BTUVfREVGSU5JVElPTiA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX05BTUVfUkVGRVJFTkNFID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfT1ZFUldSSVRFID0gIm92ZXJ3cml0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9FTkFCTEVEID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfVkFMVUVfT1ZFUldSSVRFX0ZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX1ZBTFVFX0VOQUJMRURfRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUtleXdvcmRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUtleXdvcmRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNzcxMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1Byb2ZpbGVLZXl3b3Jkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbnRlcmZhY2UgUHJvZmlsZUtleXdvcmRzIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQ1NTX1BST0ZJTEUgPSAiY3NzLXByb2ZpbGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQUk9GSUxFX0lNUE9SVCA9ICJwcm9maWxlLWltcG9ydCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNUWUxFU0hFRVRfREVGID0gInN0eWxlc2hlZXQtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQ0hBUlNFVF9SVUxFID0gImNoYXJzZXQtcnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIElNUE9SVF9SVUxFID0gImltcG9ydC1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUEFHRV9SVUxFID0gInBhZ2UtcnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1FRElBX1JVTEUgPSAibWVkaWEtcnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZPTlRGQUNFX1JVTEUgPSAiZm9udGZhY2UtcnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNUWUxFX1JVTEUgPSAic3R5bGUtcnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIENIQVJTRVRfUlVMRV9ERUYgPSAiY2hhcnNldC1ydWxlLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIElNUE9SVF9SVUxFX0RFRiA9ICJpbXBvcnQtcnVsZS1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQQUdFX1JVTEVfREVGID0gInBhZ2UtcnVsZS1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBNRURJQV9SVUxFX0RFRiA9ICJtZWRpYS1ydWxlLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZPTlRGQUNFX1JVTEVfREVGID0gImZvbnRmYWNlLXJ1bGUtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RZTEVfUlVMRV9ERUYgPSAic3R5bGUtcnVsZS1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGVU5DVElPTl9ERUYgPSAiZnVuY3Rpb24tZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRlVOQ1RJT05fVkFMVUUgPSAiZnVuY3Rpb24tdmFsdWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLRVlXT1JEX0RFRiA9ICJrZXl3b3JkLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtFWVdPUkRfVkFMVUUgPSAia2V5d29yZC12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTlVNQkVSX0RFRiA9ICJudW1iZXItZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVU5JVCA9ICJ1bml0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVU5JVF9ERUYgPSAidW5pdC1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVTklUX1ZBTFVFID0gInVuaXQtdmFsdWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBDT05UQUlORVJfREVGID0gImNvbnRhaW5lci1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBDQVRFR09SWV9ERUYgPSAiY2F0ZWdvcnktZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FQVElPTiA9ICJjYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUEVSVFlfREVGID0gInByb3BlcnR5LWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIERFU0NSSVBUT1JfREVGID0gImRlc2NyaXB0b3ItZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU0VMRUNUT1JfRVhQUkVTU0lPTiA9ICJzZWxlY3Rvci1leHByZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUFNFVURPX0NMQVNTID0gInBzZXVkby1jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBTRVVET19FTEVNRU5UID0gInBzZXVkby1lbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUFNFVURPX0NMQVNTX0RFRiA9ICJwc2V1ZG8tY2xhc3MtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUFNFVURPX0VMRU1FTlRfREVGID0gInBzZXVkby1lbGVtZW50LWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNFTEVDVE9SX1ZBTFVFID0gInNlbGVjdG9yLXZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTlVNQkVSID0gIm51bWJlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtFWVdPUkQgPSAia2V5d29yZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZVTkNUSU9OID0gImZ1bmN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OVEFJTkVSID0gImNvbnRhaW5lciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNUUklORyA9ICJzdHJpbmciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTRVBBUkFUT1IgPSAic2VwYXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUEVSVFkgPSAicHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBERVNDUklQVE9SID0gImRlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUxvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1Byb2ZpbGVMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ0MmFiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTWV0YU1vZGVsOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci0KLQotCi1jbGFzcyBQcm9maWxlTG9hZGVyIHsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFByb2ZpbGVMb2FkZXIuCi0JICovCi0JcHJpdmF0ZSBQcm9maWxlTG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCVByb2ZpbGVMb2FkZXIoUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUsIGJvb2xlYW4gbG9nZ2luZykgewotCQl0aGlzKCk7Ci0JCWZSZXNvdXJjZUJ1bmRsZSA9IHJlc291cmNlQnVuZGxlOwotCQlmTG9nZ2luZyA9IGxvZ2dpbmc7Ci0JfQotCi0Jc3RhdGljIHZvaWQgbG9hZFByb2ZpbGUoQ1NTTWV0YU1vZGVsSW1wbCBtZXRhbW9kZWwsIElucHV0U3RyZWFtIGlucHV0LCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwgYm9vbGVhbiBsb2dnaW5nKSB7Ci0JCXRyeSB7Ci0JCQlYTUxSZWFkZXIgeG1sUmVhZGVyID0gWE1MUmVhZGVyVXRpbC5jcmVhdGVYTUxSZWFkZXIoUEFSU0VSX05BTUUpOwotCQkJLy8gWE1MUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxSZWFkZXIoUEFSU0VSX05BTUUpOwotCQkJeG1sUmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKG5ldyBQcm9maWxlSGFuZGxlcihtZXRhbW9kZWwsIHJlc291cmNlQnVuZGxlLCBsb2dnaW5nKSk7Ci0JCQl4bWxSZWFkZXIucGFyc2UobmV3IElucHV0U291cmNlKGlucHV0KSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JQ1NTTWV0YU1vZGVsIGxvYWRQcm9maWxlKElucHV0U3RyZWFtIGlucHV0KSB7Ci0JCWlmIChmTWV0YU1vZGVsID09IG51bGwpIHsKLQkJCWZNZXRhTW9kZWwgPSBuZXcgQ1NTTWV0YU1vZGVsSW1wbCgpOwotCQl9Ci0JCWxvYWRQcm9maWxlKGZNZXRhTW9kZWwsIGlucHV0LCBmUmVzb3VyY2VCdW5kbGUsIGZMb2dnaW5nKTsKLQkJZk1ldGFNb2RlbC5sb2FkQ29tcGxldGVkKCk7Ci0JCXJldHVybiBmTWV0YU1vZGVsOwotCX0KLQotCi0JQ1NTTWV0YU1vZGVsSW1wbCBmTWV0YU1vZGVsID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSU0VSX05BTUUgPSAib3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmTG9nZ2luZyA9IGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1JlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0ODNkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLQotcHVibGljIGNsYXNzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCS8vCi0JcHJpdmF0ZSBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiY3NzcHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBUQUdfTkFNRSA9ICJwcm9maWxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBBVFRfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIEFUVF9VUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIEFUVF9ERUZBVUxUID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgQVRUX0xPR0dJTkcgPSAibG9nZ2luZyI7IC8vIEhpZGRlbiBPcHRpb24gLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01ldGFNb2RlbFJlZ2lzdHJ5UmVhZGVyLgotCSAqLwotCXB1YmxpYyBSZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTUHJvZmlsZSByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlDU1NQcm9maWxlSW1wbCBpbmZvID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTkFNRSkpIHsKLQkJCVN0cmluZyBzdHJJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCQlTdHJpbmcgc3RyTkFNRSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FKTsKLQkJCVN0cmluZyBzdHJVUkkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVVJJKTsKLQotCQkJaWYgKHN0cklEICE9IG51bGwgfHwgc3RyVVJJICE9IG51bGwpIHsKLQkJCQlCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotCQkJCWJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKHN0clVSSSk7Ci0JCQkJCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5maW5kKGJ1bmRsZSwgcGF0aCwgbnVsbCk7Ci0JCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl1cmwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwodXJsKTsKLQkJCQkJCQlpbmZvID0gbmV3IENTU1Byb2ZpbGVJbXBsKHN0cklELCB1cmwsIHN0clVSSSk7Ci0JCQkJCQkJaW5mby5zZXRQcm9maWxlTmFtZShzdHJOQU1FKTsKLQkJCQkJCQlpbmZvLnNldERlZmF1bHQoKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ERUZBVUxUKSAhPSBudWxsKSk7Ci0JCQkJCQkJaW5mby5zZXRMb2dnaW5nKChlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTE9HR0lORykgIT0gbnVsbCkpOwotCQkJCQkJCWluZm8uc2V0T3duZXJQbHVnaW5JRChwbHVnaW5JZCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gdGhyb3VnaAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJFcnJvciByZWFkaW5nIENTUyBQcm9maWxlOiAiICsgc3RySUQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JLyoqCi0JICogV2Ugc2ltcGx5IHJlcXVpcmUgYW4gJ2FkZCcgbWV0aG9kLCBvZiB3aGF0IGV2ZXIgaXQgaXMgd2UgYXJlIHRvIHJlYWQKLQkgKiBpbnRvCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGVudW1Qcm9maWxlcygpIHsKLQkJU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ1NTUHJvZmlsZSBpbmZvID0gcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQkJCS8vIG51bGwgY2FuIGJlIHJldHVybmVkIGlmIHRoZXJlJ3MgYW4gZXJyb3IgcmVhZGluZyB0aGUKLQkJCQkvLyBlbGVtZW50Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQlzZXQuYWRkKGluZm8pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2V0Lml0ZXJhdG9yKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvVmFsdWVDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9WYWx1ZUNvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmI0N2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9WYWx1ZUNvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsVHJhdmVyc2VyOwotCi0KLQotY2xhc3MgVmFsdWVDb2xsZWN0b3IgZXh0ZW5kcyBDU1NNZXRhTW9kZWxUcmF2ZXJzZXIgewotCXB1YmxpYyB2b2lkIGJlZ2luKENTU01NTm9kZSBub2RlKSB7Ci0JCWZOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShDU1NNTU5vZGUgbm9kZSkgewotCQlzaG9ydCByYyA9IFRSQVZfQ09OVDsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGUgPSBub2RlLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU01NTm9kZS5UWVBFX1BST1BFUlRZIHx8IHR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfREVTQ1JJUFRPUiB8fCB0eXBlID09IENTU01NTm9kZS5UWVBFX0NPTlRBSU5FUikgewotCQkJCXJjID0gVFJBVl9DT05UOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKCFmTm9kZXMuY29udGFpbnMobm9kZSkpIHsKLQkJCQkJZk5vZGVzLmFkZChub2RlKTsKLQkJCQkJcmMgPSBUUkFWX1BSVU5FOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldE5vZGVzKCkgewotCQlyZXR1cm4gZk5vZGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0KLQlwcml2YXRlIExpc3QgZk5vZGVzID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9YTUxSZWFkZXJVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvWE1MUmVhZGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzAzMTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9YTUxSZWFkZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLQotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci0KLQotY2xhc3MgWE1MUmVhZGVyVXRpbCB7Ci0KLQlzdGF0aWMgcHVibGljIFhNTFJlYWRlciBjcmVhdGVYTUxSZWFkZXIoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1NBWFBhcnNlcigpLmdldFhNTFJlYWRlcigpOwotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9DU1NNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvQ1NTTW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIyYTMwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9DU1NNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkNTU0RvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTTW9kZWxMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsTG9hZGVyIHsKLQkvKioKLQkgKiBDU1NMb2FkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ1NTTW9kZWxMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNb2RlbExvYWRlciNuZXdNb2RlbCgpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwoKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBuZXcgQ1NTTW9kZWxJbXBsKCk7Ci0JCS8vIG5vdyBkb25lIGluIGNyZWF0ZQotCQkvLyBtb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkvLyBtb2RlbC5zZXRGYWN0b3J5UmVnaXN0cnkoZGVmYXVsdEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgQ1NTTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCkgewotCQlpZiAoZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbmV3IENTU0RvY3VtZW50TG9hZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50TG9hZGVySW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIwMDNiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkNTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5DU1NEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuQWJzdHJhY3RNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJGb3JDU1MgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIEFzc29jaWF0ZWRDb250ZW50VHlwZUlEID0gIm9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTW9kZWxIYW5kbGVySUQgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsaGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBNb2RlbEhhbmRsZXJGb3JDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldElkKE1vZGVsSGFuZGxlcklEKTsKLQkJc2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBDU1NEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ29udGVudFR5cGVEZXNjcmlwdGlvbiNnZXRNb2RlbExvYWRlcigpCi0JICovCi0JcHVibGljIElNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBDU1NNb2RlbExvYWRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTUmVnaW9uVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTUmVnaW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjEyYjk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1JlZ2lvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci0KLQotcHVibGljIGNsYXNzIENTU1JlZ2lvblV0aWwgewotCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVjbGFyYXRpb25WYWx1ZVR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04gfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04gfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkcgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkpOwotCX0KLQotCS8qKgotCSAqIHRoZXNlIHR5cGUgY2FuIGJlIGJlZ2dpbmluZyBvZiBzZWxlY3RvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlbGVjdG9yQmVnZ2luaW5nVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9VTklWRVJTQUwgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lEIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCk7Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWNsYXJhdGlvblR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IgfHwgaXNEZWNsYXJhdGlvblZhbHVlVHlwZSh0eXBlKSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpOwotCX0KLQotCS8qKgotCSAqIFRoZXNlIHR5cGVzIGNvbnNpc3Qgc2VsZWN0b3IgcmVnaW9uCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VsZWN0b3JUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DTEFTUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DT01CSU5BVE9SIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8gfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfU0VQQVJBVE9SIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NTb3VyY2VQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1NvdXJjZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzEzMzZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1NvdXJjZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NTb3VyY2VQYXJzZXIgaW1wbGVtZW50cyBSZWdpb25QYXJzZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfU1RZTEVTSEVFVCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9ERUNMQVJBVElPTiA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9ERUNMQVJBVElPTl9WQUxVRSA9IDI7Ci0KLQlwcml2YXRlIGxvbmcgZlN0YXJ0VGltZTsKLQlwcml2YXRlIGxvbmcgZlN0b3BUaW1lOwotCXByaXZhdGUgSUNTU1Rva2VuaXplciBmVG9rZW5pemVyOwotCi0JcHVibGljIHZvaWQgc2V0UGFyc2VyTW9kZShpbnQgbW9kZSkgewotCQlpbnQgaW5pdGlhbFN0YXRlOwotCQlpbnQgYnVmc2l6ZTsKLQkJc3dpdGNoIChtb2RlKSB7Ci0JCQljYXNlIE1PREVfU1RZTEVTSEVFVCA6Ci0JCQkJaW5pdGlhbFN0YXRlID0gQ1NTVG9rZW5pemVyLllZSU5JVElBTDsKLQkJCQlidWZzaXplID0gQ1NTVG9rZW5pemVyLkJVRkZFUl9TSVpFX05PUk1BTDsKLQkJCQlicmVhazsKLQkJCWNhc2UgTU9ERV9ERUNMQVJBVElPTiA6Ci0JCQkJaW5pdGlhbFN0YXRlID0gQ1NTVG9rZW5pemVyLlNUX0RFQ0xBUkFUSU9OOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfTk9STUFMOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFIDoKLQkJCQlpbml0aWFsU3RhdGUgPSBDU1NUb2tlbml6ZXIuU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfU01BTEw7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm47Ci0JCX0KLQkJaWYgKDAgPCBpbml0aWFsU3RhdGUpIHsKLQkJCUlDU1NUb2tlbml6ZXIgdG9rZW5pemVyID0gZ2V0VG9rZW5pemVyKCk7Ci0JCQl0b2tlbml6ZXIuc2V0SW5pdGlhbFN0YXRlKGluaXRpYWxTdGF0ZSk7Ci0JCQl0b2tlbml6ZXIuc2V0SW5pdGlhbEJ1ZmZlclNpemUoYnVmc2l6ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZG5vZGUgPSBudWxsOwotCQlpZiAoaGVhZG5vZGUgPT0gbnVsbCkgewotCQkJaWYgKERlYnVnLnBlcmZUZXN0KSB7Ci0JCQkJZlN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJaGVhZG5vZGUgPSBwYXJzZU5vZGVzKCk7Ci0JCQlpZiAoRGVidWcucGVyZlRlc3QpIHsKLQkJCQlmU3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAtLSBjcmVhdGluZyBub2RlcyBvZiBJU3RydWN0dXJlZERvY3VtZW50IC0tICIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgVGltZSBwYXJzZSBhbmQgaW5pdCBhbGwgcmVnaW9uczogIiArIChmU3RvcFRpbWUgLSBmU3RhcnRUaW1lKSArICIgKG1zZWNzKSIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGZvciAiICsgZlJlZ2lvbnMuc2l6ZSgpICsgIgotCQkJCS8vIFJlZ2lvbnMiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgYW5kICIgKyBfY291bnROb2RlcyhoZWFkbm9kZSkgKyAiIE5vZGVzIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhlYWRub2RlOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUgPSBudWxsOwotCQlpZiAoIWdldFRva2VuaXplcigpLmlzRU9GKCkpIHsKLQkJCWhlYWROb2RlID0gZ2V0RG9jdW1lbnRSZWdpb25zKCk7Ci0JCQkvLyB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwYXJzaW5nIGhhcyBub3QgZmluaXNoZWQiKTsKLQkJfQotCQkvLyBmb3IgbWVtb3J5IHJlY292ZXJ5LCB3ZSBhc3N1bWUgaWYgc29tZW9uZQotCQkvLyByZXF1ZXN0cyBhbGwgcmVnaW9ucywgd2UgY2FuIHJlc2V0IG91ciBiaWcKLQkJLy8gbWVtb3J5IGNvbnN1bWluZyBvYmplY3RzCi0JCS8vIGJ1dCB0aGUgbmV3ICJnZXRSZWdpb25zIiBtZXRob2QgaXMgdGhlbiBtb3JlIGV4cGVuc2l2ZS4KLQkJLy8gSSBkb24ndCB0aGluayBpdHMgdXNlZCBtdWNoLCB0aG91Z2guCi0JCUxpc3QgbG9jYWxSZWdpb25zTGlzdCA9IGdldFJlZ2lvbnMoaGVhZE5vZGUpOwotCQlwcmltUmVzZXQoKTsKLQkJcmV0dXJuIGxvY2FsUmVnaW9uc0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldFJlZ2lvbnMuCi0JICogCi0JICogQHBhcmFtIGhlYWROb2RlCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlKSB7Ci0JCUxpc3QgYWxsUmVnaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IGhlYWROb2RlOwotCQl3aGlsZSAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zID0gY3VycmVudE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlUmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCWFsbFJlZ2lvbnMuYWRkKG5vZGVSZWdpb25zLmdldChpKSk7Ci0JCQl9Ci0JCQljdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gYWxsUmVnaW9uczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChSZWFkZXIgcmVhZGVyKSB7Ci0JCXByaW1SZXNldCgpOwotCQlnZXRUb2tlbml6ZXIoKS5yZXNldChyZWFkZXIsIDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIsIGludCBvZmZzZXQpIHsKLQkJcmVzZXQocmVhZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgaW5wdXQpIHsKLQkJcmVzZXQobmV3IFN0cmluZ1JlYWRlcihpbnB1dCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFN0cmluZyBpbnB1dCwgaW50IG9mZnNldCkgewotCQlyZXNldChpbnB1dCk7Ci0JfQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBDU1NTb3VyY2VQYXJzZXIoKTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyc2VOb2RlcygpIHsKLQkJLy8gcmVnaW9ucyBhcmUgaW5pdGlhbGx5IHJlcG9ydGVkIGFzIGNvbXBsZXRlIG9mZnNldHMgd2l0aGluIHRoZQotCQkvLyBzY2FubmVkIGlucHV0Ci0JCS8vIHRoZXkgYXJlIGFkanVzdGVkIGhlcmUgdG8gYmUgaW5kZXhlcyBmcm9tIHRoZSBjdXJyZW50Tm9kZSdzIHN0YXJ0Ci0JCS8vIG9mZnNldAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBudWxsOwotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCVN0cmluZyBjdXJyZW50UmVnaW9uVHlwZSA9IG51bGw7Ci0KLQkJd2hpbGUgKChyZWdpb24gPSBnZXROZXh0UmVnaW9uKCkpICE9IG51bGwpIHsKLQkJCXR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKG11c3RCZVN0YXJ0KHR5cGUsIGN1cnJlbnRSZWdpb25UeXBlKSAmJiBjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJY3VycmVudE5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0JCQl9Ci0KLQkJCWlmICgoY3VycmVudE5vZGUgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHx8IGN1cnJlbnROb2RlID09IG51bGwpIHsKLQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCAmJiAhY3VycmVudE5vZGUuaXNFbmRlZCgpKSB7Ci0JCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJCX0KLQkJCQlsYXN0Tm9kZSA9IGN1cnJlbnROb2RlOwotCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCWN1cnJlbnRSZWdpb25UeXBlID0gdHlwZTsKLQkJCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCQlsYXN0Tm9kZS5zZXROZXh0KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQkJY3VycmVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCWN1cnJlbnROb2RlLnNldFN0YXJ0KHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCX0KLQotCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0KLQkJCWlmIChtdXN0QmVFbmQodHlwZSkpIHsKLQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCX0KLQotCQkJaWYgKGhlYWROb2RlID09IG51bGwgJiYgY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCWhlYWROb2RlID0gY3VycmVudE5vZGU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCAmJiAhY3VycmVudE5vZGUuaXNFbmRlZCgpKSB7Ci0JCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJfQotCi0JCXByaW1SZXNldCgpOwotCQlyZXR1cm4gaGVhZE5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24odHlwZSk7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbXVzdEJlU3RhcnQoU3RyaW5nIHR5cGUsIFN0cmluZyBkb2NSZWdpb25UeXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VUIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0FUS0VZV09SRCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHx8IChkb2NSZWdpb25UeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSAmJiB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB8fCAoIUNTU1JlZ2lvblV0aWwuaXNTZWxlY3RvckJlZ2dpbmluZ1R5cGUoZG9jUmVnaW9uVHlwZSkgJiYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9VTklWRVJTQUwgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lEIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCkpKTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtdXN0QmVFbmQoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpOwotCX0KLQotCXByaXZhdGUgSVRleHRSZWdpb24gZ2V0TmV4dFJlZ2lvbigpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZ2lvbiA9IGdldFRva2VuaXplcigpLmdldE5leHRUb2tlbigpOwotCQkJLy8gRE1XOiAyLzEyLzAzIFJlbW92ZWQgc3RhdGUKLQkJCS8vIGlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJLy8gZlJlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JCQkvLyB9Ci0JCQlyZXR1cm4gcmVnaW9uOwotCQl9Ci0JCWNhdGNoIChTdGFja092ZXJmbG93RXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSArICI6IGlucHV0IGNvdWxkIG5vdCBiZSBwYXJzZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRUb2tlbml6ZXIoKS5nZXRPZmZzZXQoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IGU7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogaW5wdXQgY291bGQgbm90IGJlIHBhcnNlZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldFRva2VuaXplcigpLmdldE9mZnNldCgpICsgIiAoIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICsgIikiLCBlKTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW1SZXNldCgpIHsKLQotCQlnZXRUb2tlbml6ZXIoKS5yZXNldChuZXcgY2hhclswXSk7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIElDU1NUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCQlmVG9rZW5pemVyID0gbmV3IENTU1Rva2VuaXplcigpOwotCQl9Ci0JCXJldHVybiBmVG9rZW5pemVyOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBpcyBhIHNpbXBsZSB1dGlsaXR5IHRvIGNvdW50IG5vZGVzLiBVc2VkIG9ubHkgZm9yIGRlYnVnCi0JICogc3RhdGVtZW50cy4KLQkgKi8KLQlwcml2YXRlIGludCBfY291bnROb2RlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGVzKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvdW50Tm9kZSA9IG5vZGVzOwotCQl3aGlsZSAoY291bnROb2RlICE9IG51bGwpIHsKLQkJCXJlc3VsdCsrOwotCQkJY291bnROb2RlID0gY291bnROb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDlmMjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjcmVhdGVSZWdpb24oU3RyaW5nIHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZSA9IG51bGw7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliN2U2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NzkgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS40LjIgb24gOC8xMy8xMCAyOjIzIFBNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5DU1NUZXh0UmVnaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmpmbGV4LmRlLyI+SkZsZXg8L2E+IDEuNC4yCi0gKiBvbiA4LzEzLzEwIDI6MjMgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+RDovZGV2L3dvcmtzcGFjZXMvaGVsaW9zL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvQ1NTVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIENTU1Rva2VuaXplciBpbXBsZW1lbnRzIENTU1JlZ2lvbkNvbnRleHRzLCBJQ1NTVG9rZW5pemVyIHsKLQotICAvKiogVGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogaW5pdGlhbCBzaXplIG9mIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9CVUZGRVJTSVpFID0gMTYzODQ7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FID0gMjY7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0lNUE9SVF9ERUxJTUlURVIgPSAxMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFID0gMzg7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1NFTEVDVE9SID0gMjI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0NIQVJTRVRfREVMSU1JVEVSID0gNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfREVDTEFSQVRJT05fVkFMVUUgPSA0MDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfUEFHRV9QU0VVRE9fUEFHRSA9IDE2OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9JTVBPUlRfVVJJID0gNjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORCA9IDMyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IgPSAyODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfREVDTEFSQVRJT04gPSAzNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfUEFHRV9ERUxJTUlURVIgPSAxODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFID0gMzA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX01FRElBX01FRElVTSA9IDEyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9DSEFSU0VUX05BTUUgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9JTVBPUlRfTUVESVVNID0gODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SID0gMzY7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0ZPTlRfRkFDRV9ERUxJTUlURVIgPSAyMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfTUVESUFfREVMSU1JVEVSID0gMTQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1NFTEVDVE9SX01PRElGSUVSID0gMjQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlZSU5JVElBTCA9IDA7Ci0KLSAgLyoqCi0gICAqIFpaX0xFWFNUQVRFW2xdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqIFpaX0xFWFNUQVRFW2wrMV0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogICAgICAgICAgICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKiBsIGlzIG9mIHRoZSBmb3JtIGwgPSAyKmssIGsgYSBub24gbmVnYXRpdmUgaW50ZWdlcgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX0xFWFNUQVRFW10gPSB7IAotICAgICAwLCAgMCwgIDEsICAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsICA3LCAKLSAgICAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgMCwgIDAsIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEzLCAxMywgCi0gICAgMTQsIDE0LCAxNSwgMTUsIDE2LCAxNiwgMTcsIDE3LCAxOCwgMTgKLSAgfTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0NNQVBfUEFDS0VEID0gCi0gICAgIlwxMVwwXDFcMTJcMVwxN1wxXDBcMVw0XDFcMjBcMjJcMFwxXDZcMVwzMVwxXDExIisKLSAgICAiXDFcMjFcMVwxNlwxXDcyXDFcMTZcMVw1XDFcMjVcMVwxM1wxXDM1XDFcMTVcMVw1NSIrCi0gICAgIlwxXDEwXDFcMTRcMVwzNFwxMlwxXDFcNjJcMVw1MFwxXDMwXDFcNjdcMVwzMlwxXDI3IisKLSAgICAiXDFcMzZcMVw0M1wxXDI2XDFcNDBcMVw1N1wxXDQ2XDFcNjRcMVw2MVwxXDQxXDFcNTEiKwotICAgICJcMlwyXDFcMjRcMVw1MlwxXDY1XDFcNTRcMVw1M1wxXDJcMVwyM1wxXDQ0XDFcNDciKwotICAgICJcMVwyMlw1XDJcMVw2NlwxXDNcMVw3MVwxXDE2XDFcMlwxXDE2XDFcNDJcMVw3IisKLSAgICAiXDFcMzdcMVw1NlwxXDQ1XDFcNjNcMVw2MVwxXDQxXDFcNTFcMlwyXDFcMjRcMVw1MiIrCi0gICAgIlwxXDY1XDFcNTRcMVw1M1wxXDJcMVwyM1wxXDQ0XDFcNDdcMVwyMlw1XDJcMVw2MCIrCi0gICAgIlwxXDcwXDFcMzNcMVw3MFwxXDBcdWZmODBcMiI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgW10gWlpfQ01BUCA9IHp6VW5wYWNrQ01hcChaWl9DTUFQX1BBQ0tFRCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIERGQSBzdGF0ZXMgdG8gYWN0aW9uIHN3aXRjaCBsYWJlbHMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfQUNUSU9OID0genpVbnBhY2tBY3Rpb24oKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQUNUSU9OX1BBQ0tFRF8wID0KLSAgICAiXDIzXDBcMVwxXDFcMlwxXDFcMVwzXDRcMVwxXDRcMVwxIisKLSAgICAiXDFcNVwxXDFcMVw2XDFcN1wzXDFcMVwxMFwzXDFcMVwxMSIrCi0gICAgIlwyXDFcMVwxMlwxXDEzXDJcMVwxXDE0XDFcMTVcMVwxNlwyXDEiKwotICAgICJcMVwxN1wxXDFcMVwzXDFcMjBcMVwyMVwxXDIyXDJcMVwxXDIzIisKLSAgICAiXDFcMVwxXDI0XDFcMjVcNFwxXDFcMjZcM1wxXDFcMjdcMVwzMCIrCi0gICAgIlwxXDMxXDFcMzJcNFwxXDFcMzNcM1wxXDFcMzJcMVwxXDJcMzQiKwotICAgICJcMVwzXDFcMFwxXDJcMVwwXDFcMzVcMVwwXDFcMzZcMTBcMCIrCi0gICAgIlwxXDZcNFwwXDFcMzdcNFwwXDFcNDBcNFwwXDFcMTFcMVwwIisKLSAgICAiXDFcMTNcMVwwXDFcMTZcMVwwXDFcNDFcMVwwXDFcMjJcMVwwIisKLSAgICAiXDFcMjVcMlwwXDFcMjVcM1wwXDFcMjZcMVwwXDFcNDJcM1wwIisKLSAgICAiXDFcNDNcMVwwXDFcMzJcMVw0NFwxXDMyXDJcMFwxXDQ1XDJcMCIrCi0gICAgIlwxXDMxXDFcNDZcMlwwXDFcMzJcMlwwXDFcNDdcMVwyXDFcNTAiKwotICAgICJcMVwzNVwxXDM2XDEwXDBcMVw2XDFcMFwxXDM3XDJcMFwxXDM3IisKLSAgICAiXDJcMFwxXDQwXDJcMFwxXDQwXDJcMFwxXDExXDFcMTNcMVwxNiIrCi0gICAgIlwxXDIyXDFcMjVcMVwwXDFcMjVcMlwwXDFcMjVcMVwwXDFcMjYiKwotICAgICJcMVw0MlwxXDMyXDFcMFwxXDMyXDFcMFwxXDQ1XDJcMFwxXDQ1IisKLSAgICAiXDFcMFwxXDQ2XDFcNTFcMVwzMlwxXDBcMVwyXDFcMzVcMVwzNiIrCi0gICAgIlwxXDUyXDFcNTNcMTBcMFwxXDZcNVwwXDFcMTFcMVwxM1wxXDE2IisKLSAgICAiXDFcMjJcMVwyNVwyXDBcMVwyNlwxXDQyXDJcMzJcMlwwXDFcNDYiKwotICAgICJcMVw1MVwxXDBcMVw0NFwxXDBcMVwyXDFcMzVcMVwzNlwzXDAiKwotICAgICJcMVw1NFwyXDBcMVw2XDFcMFwxXDZcMTBcMFwxXDU1XDFcMTEiKwotICAgICJcMVwxM1wxXDE2XDFcMjJcMVwyNVwyXDBcMVwyNlwxXDQyXDJcMzIiKwotICAgICJcMlwwXDFcNDZcMlw1MVw1XDBcMVw1NlwxXDBcMVwyXDFcMzUiKwotICAgICJcMVwzNlwyXDBcMVw1N1wyXDBcMVw2XDZcMFwxXDU1XDJcMCIrCi0gICAgIlwxXDExXDFcMTNcMVwxNlwxXDIyXDFcMjVcMlwwXDFcMjZcMVw0MiIrCi0gICAgIlwyXDMyXDJcMFwxXDQ2XDJcNTFcMlwwXDFcNTZcM1wwXDFcMiIrCi0gICAgIlwxXDM1XDFcMzZcMVwwXDFcNjBcMlwwXDFcNlwxM1wwXDFcMTEiKwotICAgICJcMVwxM1wxXDE2XDFcMjJcMVwyNVwyXDBcMVwyNlwxXDQyXDJcMzIiKwotICAgICJcMlwwXDFcNDZcMlw1MVwxMFwwXDFcMzVcMVwzNlwxXDYxXDJcMCIrCi0gICAgIlwxXDZcNlwwXDFcNTVcMVwwXDFcNTVcMlwwXDFcNDJcMVwzMiIrCi0gICAgIlwyXDBcMVw0NlwyXDUxXDJcMFwxXDU2XDFcMFwxXDU2XDZcMCIrCi0gICAgIlwxXDMyXDFcNTFcNFwwXDFcNjJcNFwwXDFcNTFcM1wwXDFcNjMiKwotICAgICJcMTJcMCI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrQWN0aW9uKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzQzNl07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tBY3Rpb24oWlpfQUNUSU9OX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja0FjdGlvbihTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgYSBzdGF0ZSB0byBhIHJvdyBpbmRleCBpbiB0aGUgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX1JPV01BUCA9IHp6VW5wYWNrUm93TWFwKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX1JPV01BUF9QQUNLRURfMCA9Ci0gICAgIlwwXDBcMFw3M1wwXDE2NlwwXDI2MVwwXDM1NFwwXHUwMTI3XDBcdTAxNjJcMFx1MDE5ZCIrCi0gICAgIlwwXHUwMWQ4XDBcdTAyMTNcMFx1MDI0ZVwwXHUwMjg5XDBcdTAyYzRcMFx1MDJmZlwwXHUwMzNhXDBcdTAzNzUiKwotICAgICJcMFx1MDNiMFwwXHUwM2ViXDBcdTA0MjZcMFx1MDQ2MVwwXHUwNDljXDBcdTA0ZDdcMFx1MDUxMlwwXHUwNTRkIisKLSAgICAiXDBcdTA1ODhcMFx1MDVjM1wwXHUwNWZlXDBcdTA0NjFcMFx1MDYzOVwwXHUwNDYxXDBcdTA2NzRcMFx1MDZhZiIrCi0gICAgIlwwXHUwNDYxXDBcdTA2ZWFcMFx1MDcyNVwwXHUwNzYwXDBcdTA0NjFcMFx1MDc5YlwwXHUwN2Q2XDBcdTA4MTEiKwotICAgICJcMFx1MDg0Y1wwXHUwODg3XDBcdTA4YzJcMFx1MDQ2MVwwXHUwOGZkXDBcdTA5MzhcMFx1MDk3M1wwXHUwNDYxIisKLSAgICAiXDBcdTA0NjFcMFx1MDlhZVwwXHUwOWU5XDBcdTBhMjRcMFx1MDQ2MVwwXHUwYTVmXDBcdTBhOWFcMFx1MDQ2MSIrCi0gICAgIlwwXHUwNDYxXDBcdTBhZDVcMFx1MGIxMFwwXHUwYjRiXDBcdTA0NjFcMFx1MGI4NlwwXHUwNDYxXDBcdTBiYzEiKwotICAgICJcMFx1MGJmY1wwXHUwYzM3XDBcdTBjNzJcMFx1MGNhZFwwXHUwY2U4XDBcdTBkMjNcMFx1MGQ1ZVwwXHUwZDk5IisKLSAgICAiXDBcdTA0NjFcMFx1MDQ2MVwwXHUwZGQ0XDBcdTBlMGZcMFx1MGU0YVwwXHUwZTg1XDBcdTBlYzBcMFx1MGVmYiIrCi0gICAgIlwwXHUwNDYxXDBcdTBmMzZcMFx1MGY3MVwwXHUwZmFjXDBcdTBmZTdcMFx1MTAyMlwwXHUwNjM5XDBcdTA0NjEiKwotICAgICJcMFx1MTA1ZFwwXHUwNGQ3XDBcdTEwOThcMFx1MTBkM1wwXHUwNTg4XDBcdTExMGVcMFx1MDVjM1wwXHUxMTQ5IisKLSAgICAiXDBcdTExODRcMFx1MTFiZlwwXHUxMWZhXDBcdTEyMzVcMFx1MTI3MFwwXHUxMmFiXDBcdTEyZTZcMFx1MTMyMSIrCi0gICAgIlwwXHUxMzVjXDBcdTEzOTdcMFx1MDZlYVwwXHUxM2QyXDBcdTA0NjFcMFx1MDc2MFwwXHUxNDBkXDBcdTA3OWIiKwotICAgICJcMFx1MTQ0OFwwXHUwNDYxXDBcdTA3ZDZcMFx1MTQ4M1wwXHUxNGJlXDBcdTA4ODdcMFx1MTRmOVwwXHUwOTM4IisKLSAgICAiXDBcdTE1MzRcMFx1MDllOVwwXHUxNTZmXDBcdTE1YWFcMFx1MDQ2MVwwXHUwYjEwXDBcdTE1ZTVcMFx1MGJmYyIrCi0gICAgIlwwXHUxNjIwXDBcdTBjMzdcMFx1MTY1YlwwXHUwNDYxXDBcdTBjYWRcMFx1MTY5NlwwXHUwZDIzXDBcdTE2ZDEiKwotICAgICJcMFx1MTcwY1wwXHUxNzQ3XDBcdTE3ODJcMFx1MTdiZFwwXHUwZjM2XDBcdTA0NjFcMFx1MGU0YVwwXHUxN2Y4IisKLSAgICAiXDBcdTA0NjFcMFx1MTgzM1wwXHUwZTg1XDBcdTE4NmVcMFx1MDQ2MVwwXHUwZWZiXDBcdTE4YTlcMFx1MThlNCIrCi0gICAgIlwwXHUwZmFjXDBcdTE5MWZcMFx1MTk1YVwwXHUxOTk1XDBcdTEwMjJcMFx1MTlkMFwwXHUwNDYxXDBcdTFhMGIiKwotICAgICJcMFx1MDQ2MVwwXHUxYTQ2XDBcdTFhODFcMFx1MWFiY1wwXHUxYWY3XDBcdTFiMzJcMFx1MWI2ZFwwXHUxYmE4IisKLSAgICAiXDBcdTFiZTNcMFx1MWMxZVwwXHUxYzU5XDBcdTFjOTRcMFx1MWNjZlwwXHUwNmVhXDBcdTFkMGFcMFx1MWQ0NSIrCi0gICAgIlwwXHUwNzYwXDBcdTFkODBcMFx1MWRiYlwwXHUwNzliXDBcdTFkZjZcMFx1MWUzMVwwXHUwN2Q2XDBcdTFlNmMiKwotICAgICJcMFx1MWVhN1wwXHUxZWUyXDBcdTFmMWRcMFx1MWY1OFwwXHUxZjkzXDBcdTFmY2VcMFx1MjAwOVwwXHUwYzM3IisKLSAgICAiXDBcdTIwNDRcMFx1MjA3ZlwwXHUwY2FkXDBcdTIwYmFcMFx1MjBmNVwwXHUyMTMwXDBcdTIxNmJcMFx1MjFhNiIrCi0gICAgIlwwXHUyMWUxXDBcdTIyMWNcMFx1MGU4NVwwXHUyMjU3XDBcdTIyOTJcMFx1MGVmYlwwXHUyMmNkXDBcdTIzMDgiKwotICAgICJcMFx1MjM0M1wwXHUyMzdlXDBcdTIzYjlcMFx1MjNmNFwwXHUyNDJmXDBcdTI0NmFcMFx1MDQ2MVwwXHUwNDYxIisKLSAgICAiXDBcdTI0YTVcMFx1MjRlMFwwXHUyNTFiXDBcdTI1NTZcMFx1MjU5MVwwXHUyNWNjXDBcdTI2MDdcMFx1MjY0MiIrCi0gICAgIlwwXHUyNjdkXDBcdTI2YjhcMFx1MjZmM1wwXHUyNzJlXDBcdTI3NjlcMFx1MjdhNFwwXHUyN2RmXDBcdTI4MWEiKwotICAgICJcMFx1Mjg1NVwwXHUyODkwXDBcdTI4Y2JcMFx1MjkwNlwwXHUyOTQxXDBcdTI5N2NcMFx1MjliN1wwXHUyOWYyIisKLSAgICAiXDBcdTJhMmRcMFx1MmE2OFwwXHUyYWEzXDBcdTJhZGVcMFx1MmIxOVwwXHUyYjU0XDBcdTJiOGZcMFx1MmJjYSIrCi0gICAgIlwwXHUyYzA1XDBcdTJjNDBcMFx1MmM3YlwwXHUyY2I2XDBcdTJjZjFcMFx1MmQyY1wwXHUwNDYxXDBcdTJkNjciKwotICAgICJcMFx1MmRhMlwwXHUwNDYxXDBcdTJkZGRcMFx1MmUxOFwwXHUyZTUzXDBcdTJlOGVcMFx1MmVjOVwwXHUyZjA0IisKLSAgICAiXDBcdTJmM2ZcMFx1MmY3YVwwXHUyZmI1XDBcdTJmZjBcMFx1MDQ2MVwwXHUzMDJiXDBcdTMwNjZcMFx1MzBhMSIrCi0gICAgIlwwXHUzMGRjXDBcdTMxMTdcMFx1MzE1MlwwXHUzMThkXDBcdTMxYzhcMFx1MzIwM1wwXHUzMjNlXDBcdTMyNzkiKwotICAgICJcMFx1MzJiNFwwXHUzMmVmXDBcdTMzMmFcMFx1MzM2NVwwXHUzM2EwXDBcdTMzZGJcMFx1MzQxNlwwXHUyYjhmIisKLSAgICAiXDBcdTM0NTFcMFx1MzQ4Y1wwXHUwNDYxXDBcdTM0YzdcMFx1MzUwMlwwXHUzNTNkXDBcdTM1NzhcMFx1MzViMyIrCi0gICAgIlwwXHUzNWVlXDBcdTA0NjFcMFx1MzYyOVwwXHUzNjY0XDBcdTM2OWZcMFx1MzZkYVwwXHUzNzE1XDBcdTM3NTAiKwotICAgICJcMFx1Mzc4YlwwXHUzN2M2XDBcdTM4MDFcMFx1MmYzZlwwXHUzODNjXDBcdTM4NzdcMFx1MzhiMlwwXHUzOGVkIisKLSAgICAiXDBcdTM5MjhcMFx1Mzk2M1wwXHUzOTllXDBcdTM5ZDlcMFx1M2ExNFwwXHUzYTRmXDBcdTNhOGFcMFx1M2FjNSIrCi0gICAgIlwwXHUzYjAwXDBcdTNiM2JcMFx1M2I3NlwwXHUzYmIxXDBcdTNiZWNcMFx1M2MyN1wwXHUzYzYyXDBcdTNjOWQiKwotICAgICJcMFx1MzNkYlwwXHUzY2Q4XDBcdTNkMTNcMFx1M2Q0ZVwwXHUzZDg5XDBcdTNkYzRcMFx1M2RmZlwwXHUzZTNhIisKLSAgICAiXDBcdTA0NjFcMFx1M2U3NVwwXHUzZWIwXDBcdTNlZWJcMFx1M2YyNlwwXHUzZjYxXDBcdTNmOWNcMFx1M2ZkNyIrCi0gICAgIlwwXHU0MDEyXDBcdTQwNGRcMFx1NDA4OFwwXHU0MGMzXDBcdTQwZmVcMFx1NDEzOVwwXHU0MTc0XDBcdTQxYWYiKwotICAgICJcMFx1NDFlYVwwXHU0MjI1XDBcdTQyNjBcMFx1NDI5YlwwXHU0MmQ2XDBcdTQzMTFcMFx1NDM0Y1wwXHU0Mzg3IisKLSAgICAiXDBcdTQzYzJcMFx1NDNmZFwwXHU0NDM4XDBcdTQ0NzNcMFx1NDRhZVwwXHU0NGU5XDBcdTQ1MjRcMFx1NDU1ZiIrCi0gICAgIlwwXHU0NTlhXDBcdTQ1ZDVcMFx1NDYxMFwwXHU0NjRiXDBcdTQ2ODZcMFx1NDZjMVwwXHU0NmZjXDBcdTQ3MzciKwotICAgICJcMFx1NDc3MlwwXHUwNDYxXDBcdTQ3YWRcMFx1NDdlOFwwXHU0ODIzXDBcdTQ4NWVcMFx1NDg5OVwwXHU0OGQ0IisKLSAgICAiXDBcdTQ5MGZcMFx1NDk0YVwwXHU0OTg1XDBcdTJmYjVcMFx1NDljMFwwXHUyZmYwXDBcdTQ5ZmJcMFx1NGEzNiIrCi0gICAgIlwwXHU0YTcxXDBcdTRhYWNcMFx1NGFlN1wwXHU0YjIyXDBcdTRiNWRcMFx1NGI5OFwwXHU0YmQzXDBcdTRjMGUiKwotICAgICJcMFx1NGM0OVwwXHUzNDUxXDBcdTRjODRcMFx1MzQ4Y1wwXHU0Y2JmXDBcdTRjZmFcMFx1NGQzNVwwXHU0ZDcwIisKLSAgICAiXDBcdTRkYWJcMFx1NGRlNlwwXHU0ZTIxXDBcdTRlNWNcMFx1NGU5N1wwXHU0ZWQyXDBcdTRmMGRcMFx1NGY0OCIrCi0gICAgIlwwXHUwNDYxXDBcdTRmODNcMFx1NGZiZVwwXHU0ZmY5XDBcdTUwMzRcMFx1MDQ2MVwwXHU1MDZmXDBcdTUwYWEiKwotICAgICJcMFx1NTBlNVwwXHUwNDYxXDBcdTUxMjBcMFx1NTE1YlwwXHU1MTk2XDBcdTUxZDFcMFx1NTIwY1wwXHU1MjQ3IisKLSAgICAiXDBcdTUyODJcMFx1NTJiZFwwXHU1MmY4XDBcdTUzMzMiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja1Jvd01hcCgpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs0MzZdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrUm93TWFwKFpaX1JPV01BUF9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tSb3dNYXAoU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGhpZ2ggPSBwYWNrZWQuY2hhckF0KGkrKykgPDwgMTY7Ci0gICAgICByZXN1bHRbaisrXSA9IGhpZ2ggfCBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLSAgLyoqIAotICAgKiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfVFJBTlMgPSB6elVucGFja1RyYW5zKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX1RSQU5TX1BBQ0tFRF8wID0KLSAgICAiXDJcMjRcMVwyNVwxXDI2XDFcMjdcMVwyNFwxXDI3XDFcMjVcMVwzMCIrCi0gICAgIlwxXDI0XDFcMjdcMVwyNFwxXDMxXDJcMjRcMlwyN1wxXDMyXDNcMjUiKwotICAgICJcMVwyNFwxXDI1XDFcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDM2IisKLSAgICAiXDFcMzdcMTFcMjVcMVwyNFw0XDI1XDFcMjRcMlwyNVwxXDI0XDFcMjUiKwotICAgICJcMVw0MFwzXDI1XDFcNDFcMTBcMjRcMVwyN1wxXDQyXDFcMjdcMVwyNCIrCi0gICAgIlwxXDQzXDFcNDRcMVwyN1w0XDI0XDJcMjdcN1wyNFwxXDMzXDJcMjQiKwotICAgICJcMVwzNFwxXDM1XDFcMjRcMVwzN1w0MFwyNFwxXDI3XDFcMjRcMVwyNyIrCi0gICAgIlwxXDI0XDFcNDNcMVwyNFwxXDI3XDRcMjRcMlwyN1w3XDI0XDFcMzMiKwotICAgICJcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDI0XDFcNDVcMjZcMjQiKwotICAgICJcMVwyN1wxXDQ2XDFcMjdcMVwyNFwxXDQzXDFcNDdcMVwyN1w0XDI0IisKLSAgICAiXDJcMjdcMVwyNFwxXDUwXDVcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNSIrCi0gICAgIlwxXDI0XDFcMzdcMTFcMjRcMVw0NVwyNFwyNFwxXDUxXDFcNTJcMVwyNyIrCi0gICAgIlwxXDI0XDFcMjdcMVw1MVwxXDUzXDFcMjRcMVwyN1w0XDI0XDJcMjciKwotICAgICJcMVwyNFwzXDUxXDFcMjRcMVw1MVwxXDI0XDFcMzNcMlwyNFwxXDM0IisKLSAgICAiXDFcMzVcMVwyNFwxXDM3XDExXDUxXDFcNDVcNFw1MVwxXDI0XDJcNTEiKwotICAgICJcMVwyNFwxXDUxXDFcMjRcM1w1MVwxMVwyNFwxXDI3XDFcMjRcMVwyNyIrCi0gICAgIlwxXDI0XDFcNDNcMVwyNFwxXDI3XDRcMjRcMlwyN1w3XDI0XDFcMzMiKwotICAgICJcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDI0XDFcNDVcNFwyNCIrCi0gICAgIlwxXDU0XDE3XDI0XDFcNTVcMVw1NlwxXDI3XDFcMjRcMVwyN1wxXDU1IisKLSAgICAiXDFcNTdcMVwyNFwxXDI3XDRcMjRcMlwyN1wxXDI0XDNcNTVcMVwyNCIrCi0gICAgIlwxXDU1XDFcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzciKwotICAgICJcMTFcNTVcMVwyNFw0XDU1XDFcMjRcMlw1NVwxXDYwXDFcNTVcMVwyNCIrCi0gICAgIlwzXDU1XDExXDI0XDFcMjdcMVwyNFwxXDI3XDFcMjRcMVw0M1wxXDI0IisKLSAgICAiXDFcMjdcNFwyNFwyXDI3XDdcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNSIrCi0gICAgIlwxXDI0XDFcMzdcMTZcMjRcMVw2MVwyXDI0XDFcNjBcMTRcMjRcMVw2MiIrCi0gICAgIlwxXDYzXDFcMjdcMVwyNFwxXDI3XDFcNjJcMVw2NFwxXDI0XDFcMjciKwotICAgICJcNFwyNFwyXDI3XDFcMjRcM1w2MlwxXDI0XDFcNjJcMVwyNFwxXDMzIisKLSAgICAiXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzN1wxMVw2MlwxXDI0XDRcNjIiKwotICAgICJcMVwyNFwyXDYyXDFcNjVcMVw2MlwxXDY2XDNcNjJcMTFcMjRcMVwyNyIrCi0gICAgIlwxXDI0XDFcMjdcMVwyNFwxXDQzXDFcMjRcMVwyN1w0XDI0XDJcMjciKwotICAgICJcN1wyNFwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzN1wyMVwyNCIrCi0gICAgIlwxXDY1XDE2XDI0XDFcNjdcMVwyNFwxXDY3XDFcMjRcMVw0M1wxXDI0IisKLSAgICAiXDFcNjdcMVwyNFwxXDMxXDFcNzBcMVwyNFwyXDY3XDFcMzJcNlwyNCIrCi0gICAgIlwxXDMzXDFcMjRcMVw3MFwxXDM0XDFcMzVcMVwzNlwxXDM3XDE2XDI0IisKLSAgICAiXDFcNzFcMlwyNFwxXDY1XDFcMjRcMVw0MFwzXDI0XDFcNDFcNlwyNCIrCi0gICAgIlwxXDcyXDFcNzNcMVwyN1wxXDI0XDFcMjdcMVw3MlwxXDc0XDFcMjQiKwotICAgICJcMVwyN1w0XDI0XDJcMjdcMVwyNFwzXDcyXDFcMjRcMVw3MlwxXDI0IisKLSAgICAiXDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDcyXDFcMjQiKwotICAgICJcNFw3MlwxXDI0XDJcNzJcMVwyNFwxXDcyXDFcMjRcM1w3MlwxMVwyNCIrCi0gICAgIlwxXDI3XDFcMjRcMVwyN1wxXDI0XDFcNDNcMVwyNFwxXDI3XDRcMjQiKwotICAgICJcMlwyN1w3XDI0XDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3IisKLSAgICAiXDMwXDI0XDFcNzVcMVw3NlwxXDc3XDNcMjRcMVwxMDBcMVwxMDFcMVwyNyIrCi0gICAgIlwxXDEwMlwxXDI3XDFcMTAwXDFcMTAzXDFcMTA0XDFcMjdcNFwyNFwyXDI3IisKLSAgICAiXDFcMjRcM1wxMDBcMVwyNFwxXDEwMFwxXDI0XDFcMzNcMlwyNFwxXDM0IisKLSAgICAiXDFcMzVcMVwyNFwxXDM3XDExXDEwMFwxXDI0XDRcMTAwXDFcMjRcMlwxMDAiKwotICAgICJcMVwyNFwxXDEwMFwxXDI0XDNcMTAwXDExXDI0XDFcMjdcMVwyNFwxXDI3IisKLSAgICAiXDFcMjRcMVw0M1wxXDI0XDFcMjdcNFwyNFwyXDI3XDdcMjRcMVwzMyIrCi0gICAgIlwyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMzJcMjRcMVw3N1wzXDI0IisKLSAgICAiXDFcMTA1XDFcMTA2XDFcMjdcMVwyNFwxXDI3XDFcMTA1XDFcMTA3XDFcMjQiKwotICAgICJcMVwyN1w0XDI0XDJcMjdcMVwyNFwzXDEwNVwxXDI0XDFcMTA1XDFcMjQiKwotICAgICJcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDExMFwxXDM3XDExXDEwNVwxXDExMSIrCi0gICAgIlw0XDEwNVwxXDI0XDJcMTA1XDFcMjRcMVwxMDVcMVwyNFwzXDEwNVwxMVwyNCIrCi0gICAgIlwxXDI3XDFcMjRcMVwyN1wxXDI0XDFcNDNcMVwyNFwxXDI3XDRcMjQiKwotICAgICJcMlwyN1w3XDI0XDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3IisKLSAgICAiXDExXDI0XDFcMTExXDExXDI0XDFcMTEyXDExXDI0XDFcMTEzXDFcMTE0XDFcMTE1IisKLSAgICAiXDFcMjdcMVwxMTZcMVwyN1wxXDExNFwxXDExN1wxXDEyMFwxXDI3XDFcMTIxIisKLSAgICAiXDFcMTIyXDFcMTIzXDFcMjRcMlwyN1wxXDEyNFwxXDEyNVwyXDExNFwxXDI0IisKLSAgICAiXDFcMTE0XDFcMjRcMVwzM1wxXDEyNlwxXDI0XDFcMzRcMVwxMjdcMVwyNCIrCi0gICAgIlwxXDM3XDExXDExNFwxXDExMVw0XDExNFwxXDEzMFwyXDExNFwxXDI0XDFcMTE0IisKLSAgICAiXDFcMjRcM1wxMTRcNlwyNFwxXDExM1wxXDExNFwxXDExNVwxXDEzMVwxXDExNiIrCi0gICAgIlwxXDEzMVwxXDExNFwxXDExN1wxXDEyMFwxXDEzMVwxXDEyMVwxXDEyMlwxXDEyMyIrCi0gICAgIlwxXDI0XDJcMTMxXDFcMTI0XDFcMTI1XDJcMTE0XDFcMjRcMVwxMTRcMVwyNCIrCi0gICAgIlwxXDMzXDFcMTI2XDFcMjRcMVwzNFwxXDEyN1wxXDI0XDFcMzdcMTFcMTE0IisKLSAgICAiXDFcMTExXDRcMTE0XDFcMTMwXDJcMTE0XDFcMjRcMVwxMTRcMVwyNFwzXDExNCIrCi0gICAgIlw1XDI0XDc0XDBcMlwyNVwxXDEzMlwzXDBcMlwyNVwxMVwwXDNcMjUiKwotICAgICJcMVwwXDFcMjVcMTBcMFwxMVwyNVwxXDBcNFwyNVwxXDBcMlwyNSIrCi0gICAgIlwxXDBcMVwyNVwxXDBcM1wyNVw2XDBcMVwxMzNcMlwyNVwxXDAiKwotICAgICJcMlwyNVwxXDEzM1wyXDI1XDFcMFw0XDI1XDJcMFwxNlwyNVwxXDEzMyIrCi0gICAgIlwyXDI1XDFcMTMzXDJcMjVcMVwxMzNcMTBcMjVcMVwxMzNcNFwyNVwxXDEzMyIrCi0gICAgIlw3XDI1XDRcMFwxXDI3XDFcMFwxXDI3XDNcMFwxXDI3XDRcMCIrCi0gICAgIlwyXDI3XDU0XDBcMVwyNVwxXDEzMlwzXDBcMVwyNVwxXDEzNFwxMVwwIisKLSAgICAiXDNcMjVcMVwwXDFcMjVcMTBcMFwxMVwyNVwxXDBcNFwyNVwxXDAiKwotICAgICJcMlwyNVwxXDBcMVwyNVwxXDBcM1wyNVw2XDBcMlwxMzVcMVwxMzYiKwotICAgICJcM1wwXDJcMTM1XDExXDBcM1wxMzVcMVwwXDFcMTM1XDEwXDBcMTFcMTM1IisKLSAgICAiXDFcMFw0XDEzNVwxXDBcMlwxMzVcMVwwXDFcMTM1XDFcMFwzXDEzNSIrCi0gICAgIlw2XDBcMlwxMzdcMVwxNDBcM1wwXDJcMTM3XDExXDBcM1wxMzdcMVwwIisKLSAgICAiXDFcMTM3XDEwXDBcMTFcMTM3XDFcMFw0XDEzN1wxXDBcMlwxMzdcMVwwIisKLSAgICAiXDFcMTM3XDFcMFwzXDEzN1wzNlwwXDFcMTQxXDc2XDBcMVwxNDJcNzRcMCIrCi0gICAgIlwyXDE0M1wxMFwwXDFcMTQ0XDFcMTQ1XDFcMTQ2XDdcMFwyXDE0N1wxMFwwIisKLSAgICAiXDFcMTUwXDFcMTUxXDNcMFwxXDE1MFwxXDE1MlwxMVwwXDNcMTUwXDFcMCIrCi0gICAgIlwxXDE1MFwxMFwwXDExXDE1MFwxXDBcNFwxNTBcMVwwXDJcMTUwXDFcMCIrCi0gICAgIlwxXDE1MFwxXDBcM1wxNTBcNlwwXDJcMTUzXDFcMTU0XDFcMFwxXDE1NSIrCi0gICAgIlwxMVwxNTNcMlwwXDUyXDE1M1wxMFwwXDFcMTM0XDYzXDBcMlwxNTZcMVwxNTciKwotICAgICJcMVwwXDRcMTU2XDFcMTU1XDVcMTU2XDJcMFw1MlwxNTZcMVwwXDJcMTYwIisKLSAgICAiXDFcMTYxXDFcMFwxXDE2MlwxMVwxNjBcMlwwXDUyXDE2MFwxXDBcMlwxNjMiKwotICAgICJcMVwxNjRcMVwwXDRcMTYzXDFcMTYyXDVcMTYzXDJcMFw1MlwxNjNcMjNcMCIrCi0gICAgIlwxXDE2NVw1MFwwXDJcNTFcMVwxNjZcM1wwXDJcNTFcMTFcMFwzXDUxIisKLSAgICAiXDFcMFwxXDUxXDEwXDBcMTFcNTFcMVwwXDRcNTFcMVwwXDJcNTEiKwotICAgICJcMVwwXDFcNTFcMVwwXDNcNTFcNlwwXDFcMTY3XDJcNTFcMVwwIisKLSAgICAiXDJcNTFcMVwxNjdcMlw1MVwxXDBcNFw1MVwyXDBcMTZcNTFcMVwxNjciKwotICAgICJcMlw1MVwxXDE2N1wyXDUxXDFcMTY3XDEwXDUxXDFcMTY3XDRcNTFcMVwxNjciKwotICAgICJcN1w1MVwyXDBcMVw1MVwxXDE2NlwzXDBcMVw1MVwxXDEzNFwxMVwwIisKLSAgICAiXDNcNTFcMVwwXDFcNTFcMTBcMFwxMVw1MVwxXDBcNFw1MVwxXDAiKwotICAgICJcMlw1MVwxXDBcMVw1MVwxXDBcM1w1MVw2XDBcMlw1NVwxXDE3MCIrCi0gICAgIlwzXDBcMlw1NVwxMVwwXDNcNTVcMVwwXDFcNTVcMTBcMFwxMVw1NSIrCi0gICAgIlwxXDBcNFw1NVwxXDBcMlw1NVwxXDBcMVw1NVwxXDBcM1w1NSIrCi0gICAgIlw2XDBcMVwxNzFcMlw1NVwxXDBcMlw1NVwxXDE3MVwyXDU1XDFcMCIrCi0gICAgIlw0XDU1XDJcMFwxNlw1NVwxXDE3MVwyXDU1XDFcMTcxXDJcNTVcMVwxNzEiKwotICAgICJcMTBcNTVcMVwxNzFcNFw1NVwxXDE3MVw3XDU1XDJcMFwxXDU1XDFcMTcwIisKLSAgICAiXDNcMFwxXDU1XDFcMTM0XDExXDBcM1w1NVwxXDBcMVw1NVwxMFwwIisKLSAgICAiXDExXDU1XDFcMFw0XDU1XDFcMFwyXDU1XDFcMFwxXDU1XDFcMCIrCi0gICAgIlwzXDU1XDZcMFwyXDYyXDFcMTcyXDNcMFwyXDYyXDExXDBcM1w2MiIrCi0gICAgIlwxXDBcMVw2MlwxMFwwXDExXDYyXDFcMFw0XDYyXDFcMFwyXDYyIisKLSAgICAiXDFcMFwxXDYyXDFcMFwzXDYyXDZcMFwxXDE3M1wyXDYyXDFcMCIrCi0gICAgIlwyXDYyXDFcMTczXDJcNjJcMVwwXDRcNjJcMlwwXDE2XDYyXDFcMTczIisKLSAgICAiXDJcNjJcMVwxNzNcMlw2MlwxXDE3M1wxMFw2MlwxXDE3M1w0XDYyXDFcMTczIisKLSAgICAiXDdcNjJcMlwwXDFcNjJcMVwxNzJcM1wwXDFcNjJcMVwxMzRcMTFcMCIrCi0gICAgIlwzXDYyXDFcMFwxXDYyXDEwXDBcMTFcNjJcMVwwXDRcNjJcMVwwIisKLSAgICAiXDJcNjJcMVwwXDFcNjJcMVwwXDNcNjJcN1wwXDFcNjJcMVwxNzIiKwotICAgICJcM1wwXDFcNjJcMVwxNzRcMTFcMFwzXDYyXDFcMFwxXDYyXDEwXDAiKwotICAgICJcMTFcNjJcMVwwXDRcNjJcMVwwXDJcNjJcMVwwXDFcNjJcMVwwIisKLSAgICAiXDNcNjJcNVwwXDRcMTc1XDFcNjdcMVwxNzVcMVw2N1wzXDE3NVwxXDY3IisKLSAgICAiXDJcMTc1XDFcMFwxXDE3NVwyXDY3XDExXDE3NVwxXDBcMVwxNzVcMVwwIisKLSAgICAiXDIwXDE3NVwxXDBcMlwxNzVcMVwwXDEyXDE3NVwxXDBcMlw3MlwxXDE3NiIrCi0gICAgIlwzXDBcMlw3MlwxMVwwXDNcNzJcMVwwXDFcNzJcMTBcMFwxMVw3MiIrCi0gICAgIlwxXDBcNFw3MlwxXDBcMlw3MlwxXDBcMVw3MlwxXDBcM1w3MiIrCi0gICAgIlw2XDBcMVwxNzdcMlw3MlwxXDBcMlw3MlwxXDE3N1wyXDcyXDFcMCIrCi0gICAgIlw0XDcyXDJcMFwxNlw3MlwxXDE3N1wyXDcyXDFcMTc3XDJcNzJcMVwxNzciKwotICAgICJcMTBcNzJcMVwxNzdcNFw3MlwxXDE3N1w3XDcyXDJcMFwxXDcyXDFcMTc2IisKLSAgICAiXDNcMFwxXDcyXDFcMTM0XDExXDBcM1w3MlwxXDBcMVw3MlwxMFwwIisKLSAgICAiXDExXDcyXDFcMFw0XDcyXDFcMFwyXDcyXDFcMFwxXDcyXDFcMCIrCi0gICAgIlwzXDcyXDc0XDBcMVw3NVw0XDBcMlwxMDBcMVwyMDBcM1wwXDJcMTAwIisKLSAgICAiXDExXDBcM1wxMDBcMVwwXDFcMTAwXDEwXDBcMTFcMTAwXDFcMFw0XDEwMCIrCi0gICAgIlwxXDBcMlwxMDBcMVwwXDFcMTAwXDFcMFwzXDEwMFw2XDBcMVwyMDEiKwotICAgICJcMlwxMDBcMVwwXDJcMTAwXDFcMjAxXDJcMTAwXDFcMFw0XDEwMFwyXDAiKwotICAgICJcMTZcMTAwXDFcMjAxXDJcMTAwXDFcMjAxXDJcMTAwXDFcMjAxXDEwXDEwMFwxXDIwMSIrCi0gICAgIlw0XDEwMFwxXDIwMVw3XDEwMFwxXDBcMlwyMDJcMVwyMDNcMVwwXDFcMjA0IisKLSAgICAiXDExXDIwMlwyXDBcNTJcMjAyXDJcMFwxXDEwMFwxXDIwMFwzXDBcMVwxMDAiKwotICAgICJcMVwxMzRcMTFcMFwzXDEwMFwxXDBcMVwxMDBcMTBcMFwxMVwxMDBcMVwwIisKLSAgICAiXDRcMTAwXDFcMFwyXDEwMFwxXDBcMVwxMDBcMVwwXDNcMTAwXDZcMCIrCi0gICAgIlwyXDIwNVwxXDIwNlwxXDBcNFwyMDVcMVwyMDRcNVwyMDVcMlwwXDUyXDIwNSIrCi0gICAgIlwxXDBcMlwxMDVcMVwyMDdcM1wwXDJcMTA1XDExXDBcM1wxMDVcMVwwIisKLSAgICAiXDFcMTA1XDEwXDBcMTFcMTA1XDFcMFw0XDEwNVwxXDBcMlwxMDVcMVwwIisKLSAgICAiXDFcMTA1XDFcMFwzXDEwNVw2XDBcMVwyMTBcMlwxMDVcMVwwXDJcMTA1IisKLSAgICAiXDFcMjEwXDJcMTA1XDFcMFw0XDEwNVwyXDBcMTZcMTA1XDFcMjEwXDJcMTA1IisKLSAgICAiXDFcMjEwXDJcMTA1XDFcMjEwXDEwXDEwNVwxXDIxMFw0XDEwNVwxXDIxMFw3XDEwNSIrCi0gICAgIlwyXDBcMVwxMDVcMVwyMDdcM1wwXDFcMTA1XDFcMTM0XDExXDBcM1wxMDUiKwotICAgICJcMVwwXDFcMTA1XDEwXDBcMTFcMTA1XDFcMFw0XDEwNVwxXDBcMlwxMDUiKwotICAgICJcMVwwXDFcMTA1XDFcMFwzXDEwNVw3XDBcMVwxMDVcMVwyMDdcM1wwIisKLSAgICAiXDFcMTA1XDFcMjExXDExXDBcM1wxMDVcMVwwXDFcMTA1XDEwXDBcMTFcMTA1IisKLSAgICAiXDFcMFw0XDEwNVwxXDBcMlwxMDVcMVwwXDFcMTA1XDFcMFwzXDEwNSIrCi0gICAgIlw2XDBcMVwxMTNcMVwyMTJcMVwyMTNcM1wwXDFcMjEyXDFcMjE0XDNcMCIrCi0gICAgIlwxXDIxNVw1XDBcM1wyMTJcMVwwXDFcMjEyXDEwXDBcMTFcMjEyXDFcMCIrCi0gICAgIlw0XDIxMlwxXDBcMlwyMTJcMVwwXDFcMjEyXDFcMFwzXDIxMlw0XDAiKwotICAgICJcMVwyMTZcMVwwXDJcMTE0XDFcMjE3XDNcMFwyXDExNFwzXDBcMVwyMjAiKwotICAgICJcNVwwXDNcMTE0XDFcMjIxXDFcMTE0XDEwXDBcMTFcMTE0XDFcMFw0XDExNCIrCi0gICAgIlwxXDBcMlwxMTRcMVwwXDFcMTE0XDFcMFwzXDExNFw2XDBcMVwyMjIiKwotICAgICJcMlwxMTRcMVwwXDJcMTE0XDFcMjIyXDJcMTE0XDFcMFw0XDExNFwyXDAiKwotICAgICJcMTZcMTE0XDFcMjIyXDJcMTE0XDFcMjIyXDJcMTE0XDFcMjIyXDEwXDExNFwxXDIyMiIrCi0gICAgIlw0XDExNFwxXDIyMlw3XDExNFwxXDBcMlwyMjNcMVwyMjRcMVwwXDFcMjI1IisKLSAgICAiXDExXDIyM1wyXDBcNTJcMjIzXDFcMFwxXDExM1wxXDExNFwxXDIxN1wzXDAiKwotICAgICJcMVwxMTRcMVwxMzRcM1wwXDFcMjE1XDVcMFwzXDExNFwxXDBcMVwxMTQiKwotICAgICJcMTBcMFwxMVwxMTRcMVwwXDRcMTE0XDFcMFwyXDExNFwxXDBcMVwxMTQiKwotICAgICJcMVwwXDNcMTE0XDZcMFwyXDIyNlwxXDIyN1wxXDBcNFwyMjZcMVwyMjUiKwotICAgICJcNVwyMjZcMlwwXDUyXDIyNlwxXDBcMVwyMzBcNzJcMFwxXDExM1wxMlwwIisKLSAgICAiXDFcMjE1XDU3XDBcMlwyMzFcMVwyMzJcM1wwXDJcMjMxXDExXDBcM1wyMzEiKwotICAgICJcMVwwXDFcMjMxXDEwXDBcMTFcMjMxXDFcMFw0XDIzMVwxXDBcMlwyMzEiKwotICAgICJcMVwwXDFcMjMxXDFcMFwzXDIzMVw2XDBcMlwxMTRcMVwyMTdcM1wwIisKLSAgICAiXDJcMTE0XDNcMFwxXDIyMFwxXDIzM1w0XDBcMVwxMTRcMVwyMzRcMVwxMTQiKwotICAgICJcMVwyMjFcMVwxMTRcMTBcMFwxMVwxMTRcMVwwXDRcMTE0XDFcMFwyXDExNCIrCi0gICAgIlwxXDBcMVwxMTRcMVwwXDNcMTE0XDExXDBcMVwyMzVcMVwwXDFcMjM1IisKLSAgICAiXDNcMFwxXDIzNVw0XDBcMlwyMzVcMzBcMFwxXDIzNlwyMVwwXDRcMjM3IisKLSAgICAiXDFcMTMxXDFcMjM3XDFcMTMxXDNcMjM3XDFcMTMxXDRcMjM3XDJcMTMxXDEyXDIzNyIrCi0gICAgIlwxXDBcMTRcMjM3XDFcMFwyMlwyMzdcMVwwXDFcMjQwXDFcMjVcMVwxMzIiKwotICAgICJcMVwyNVwxXDBcMVwyNVwxXDI0MFwxXDI1XDFcMFwxXDI1XDRcMCIrCi0gICAgIlwyXDI1XDFcMFwzXDI1XDFcMFwxXDI1XDEwXDBcMVwyNDBcMlwyNSIrCi0gICAgIlwxXDI0MFwyXDI1XDFcMjQwXDJcMjVcMVwwXDRcMjVcMVwwXDFcMjQwIisKLSAgICAiXDFcMjVcMVwwXDFcMjVcMVwwXDFcMjQwXDJcMjVcMzdcMFwxXDI0MSIrCi0gICAgIlw0MVwwXDFcMjQyXDJcMTM1XDFcMFwyXDEzNVwxXDI0MlwyXDEzNVwxXDAiKwotICAgICJcNFwxMzVcMlwwXDE2XDEzNVwxXDI0MlwyXDEzNVwxXDI0MlwyXDEzNVwxXDI0MiIrCi0gICAgIlwxMFwxMzVcMVwyNDJcNFwxMzVcMVwyNDJcN1wxMzVcMVwwXDFcMjQzXDJcMTM3IisKLSAgICAiXDFcMFwyXDEzN1wxXDI0M1wyXDEzN1wxXDBcNFwxMzdcMlwwXDE2XDEzNyIrCi0gICAgIlwxXDI0M1wyXDEzN1wxXDI0M1wyXDEzN1wxXDI0M1wxMFwxMzdcMVwyNDNcNFwxMzciKwotICAgICJcMVwyNDNcN1wxMzdcMTBcMFwxXDI0NFw2MlwwXDM1XDE0MlwxXDI0NVwzNVwxNDIiKwotICAgICJcNDFcMFwxXDI0NlwxMDNcMFwxXDI0N1w2NVwwXDJcMjUwXDY2XDBcMlwyNTEiKwotICAgICJcMTAzXDBcMVwyNTJcMTdcMFwyXDE1MFwxXDE1MVwzXDBcMlwxNTBcMTFcMCIrCi0gICAgIlwzXDE1MFwxXDI1M1wxXDE1MFwxMFwwXDExXDE1MFwxXDBcNFwxNTBcMVwwIisKLSAgICAiXDJcMTUwXDFcMFwxXDE1MFwxXDBcM1wxNTBcNlwwXDFcMjU0XDJcMTUwIisKLSAgICAiXDFcMFwyXDE1MFwxXDI1NFwyXDE1MFwxXDBcNFwxNTBcMlwwXDE2XDE1MCIrCi0gICAgIlwxXDI1NFwyXDE1MFwxXDI1NFwyXDE1MFwxXDI1NFwxMFwxNTBcMVwyNTRcNFwxNTAiKwotICAgICJcMVwyNTRcN1wxNTBcMlwwXDFcMTUwXDFcMTUxXDNcMFwxXDE1MFwxMlwwIisKLSAgICAiXDNcMTUwXDFcMFwxXDE1MFwxMFwwXDExXDE1MFwxXDBcNFwxNTBcMVwwIisKLSAgICAiXDJcMTUwXDFcMFwxXDE1MFwxXDBcM1wxNTBcNlwwXDFcMjU1XDFcMTUzIisKLSAgICAiXDFcMTU0XDFcMTUzXDFcMjU2XDFcMTUzXDFcMjU1XDEwXDE1M1wxXDI1N1wxNlwxNTMiKwotICAgICJcMVwyNTVcMlwxNTNcMVwyNTVcMlwxNTNcMVwyNTVcMTBcMTUzXDFcMjU1XDRcMTUzIisKLSAgICAiXDFcMjU1XDdcMTUzXDFcMFwxXDI2MFwxXDE1NlwxXDE1N1wzXDE1NlwxXDI2MCIrCi0gICAgIlwxXDE1NlwxXDI2MVw2XDE1NlwxXDI2MlwxNlwxNTZcMVwyNjBcMlwxNTZcMVwyNjAiKwotICAgICJcMlwxNTZcMVwyNjBcMTBcMTU2XDFcMjYwXDRcMTU2XDFcMjYwXDdcMTU2XDFcMCIrCi0gICAgIlwxXDI2M1wxXDE2MFwxXDE2MVwxXDE2MFwxXDI2NFwxXDE2MFwxXDI2M1wxMFwxNjAiKwotICAgICJcMVwyNjVcMTZcMTYwXDFcMjYzXDJcMTYwXDFcMjYzXDJcMTYwXDFcMjYzXDEwXDE2MCIrCi0gICAgIlwxXDI2M1w0XDE2MFwxXDI2M1w3XDE2MFwxXDBcMVwyNjZcMVwxNjNcMVwxNjQiKwotICAgICJcM1wxNjNcMVwyNjZcMVwxNjNcMVwyNjdcNlwxNjNcMVwyNzBcMTZcMTYzXDFcMjY2IisKLSAgICAiXDJcMTYzXDFcMjY2XDJcMTYzXDFcMjY2XDEwXDE2M1wxXDI2Nlw0XDE2M1wxXDI2NiIrCi0gICAgIlw3XDE2M1wyNFwwXDFcMjcxXDQ3XDBcMVwyNzJcMVw1MVwxXDE2NlwxXDUxIisKLSAgICAiXDFcMFwxXDUxXDFcMjcyXDFcNTFcMVwwXDFcNTFcNFwwXDJcNTEiKwotICAgICJcMVwwXDNcNTFcMVwwXDFcNTFcMTBcMFwxXDI3MlwyXDUxXDFcMjcyIisKLSAgICAiXDJcNTFcMVwyNzJcMlw1MVwxXDBcNFw1MVwxXDBcMVwyNzJcMVw1MSIrCi0gICAgIlwxXDBcMVw1MVwxXDBcMVwyNzJcMlw1MVw2XDBcMVwyNzNcMVw1NSIrCi0gICAgIlwxXDE3MFwxXDU1XDFcMFwxXDU1XDFcMjczXDFcNTVcMVwwXDFcNTUiKwotICAgICJcNFwwXDJcNTVcMVwwXDNcNTVcMVwwXDFcNTVcMTBcMFwxXDI3MyIrCi0gICAgIlwyXDU1XDFcMjczXDJcNTVcMVwyNzNcMlw1NVwxXDBcNFw1NVwxXDAiKwotICAgICJcMVwyNzNcMVw1NVwxXDBcMVw1NVwxXDBcMVwyNzNcMlw1NVw2XDAiKwotICAgICJcMVwyNzRcMVw2MlwxXDE3MlwxXDYyXDFcMFwxXDYyXDFcMjc0XDFcNjIiKwotICAgICJcMVwwXDFcNjJcNFwwXDJcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMTBcMFwxXDI3NFwyXDYyXDFcMjc0XDJcNjJcMVwyNzRcMlw2MlwxXDAiKwotICAgICJcNFw2MlwxXDBcMVwyNzRcMVw2MlwxXDBcMVw2MlwxXDBcMVwyNzQiKwotICAgICJcMlw2Mlw3XDBcMVw2MlwxXDE3MlwzXDBcMVw2MlwxMlwwXDNcNjIiKwotICAgICJcMVwwXDFcNjJcMTBcMFwxMVw2MlwxXDBcNFw2MlwxXDBcMlw2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDBcM1w2Mlw2XDBcMVwyNzVcMVw3MlwxXDE3NiIrCi0gICAgIlwxXDcyXDFcMFwxXDcyXDFcMjc1XDFcNzJcMVwwXDFcNzJcNFwwIisKLSAgICAiXDJcNzJcMVwwXDNcNzJcMVwwXDFcNzJcMTBcMFwxXDI3NVwyXDcyIisKLSAgICAiXDFcMjc1XDJcNzJcMVwyNzVcMlw3MlwxXDBcNFw3MlwxXDBcMVwyNzUiKwotICAgICJcMVw3MlwxXDBcMVw3MlwxXDBcMVwyNzVcMlw3Mlw2XDBcMVwyNzYiKwotICAgICJcMVwxMDBcMVwyMDBcMVwxMDBcMVwwXDFcMTAwXDFcMjc2XDFcMTAwXDFcMCIrCi0gICAgIlwxXDEwMFw0XDBcMlwxMDBcMVwwXDNcMTAwXDFcMFwxXDEwMFwxMFwwIisKLSAgICAiXDFcMjc2XDJcMTAwXDFcMjc2XDJcMTAwXDFcMjc2XDJcMTAwXDFcMFw0XDEwMCIrCi0gICAgIlwxXDBcMVwyNzZcMVwxMDBcMVwwXDFcMTAwXDFcMFwxXDI3NlwyXDEwMCIrCi0gICAgIlw2XDBcMVwyNzdcMVwyMDJcMVwyMDNcMVwyMDJcMVwzMDBcMVwyMDJcMVwyNzciKwotICAgICJcMTBcMjAyXDFcMzAxXDE2XDIwMlwxXDI3N1wyXDIwMlwxXDI3N1wyXDIwMlwxXDI3NyIrCi0gICAgIlwxMFwyMDJcMVwyNzdcNFwyMDJcMVwyNzdcN1wyMDJcMVwwXDFcMzAyXDFcMjA1IisKLSAgICAiXDFcMjA2XDNcMjA1XDFcMzAyXDFcMjA1XDFcMzAzXDZcMjA1XDFcMzA0XDE2XDIwNSIrCi0gICAgIlwxXDMwMlwyXDIwNVwxXDMwMlwyXDIwNVwxXDMwMlwxMFwyMDVcMVwzMDJcNFwyMDUiKwotICAgICJcMVwzMDJcN1wyMDVcMVwwXDFcMzA1XDFcMTA1XDFcMjA3XDFcMTA1XDFcMCIrCi0gICAgIlwxXDEwNVwxXDMwNVwxXDEwNVwxXDBcMVwxMDVcNFwwXDJcMTA1XDFcMCIrCi0gICAgIlwzXDEwNVwxXDBcMVwxMDVcMTBcMFwxXDMwNVwyXDEwNVwxXDMwNVwyXDEwNSIrCi0gICAgIlwxXDMwNVwyXDEwNVwxXDBcNFwxMDVcMVwwXDFcMzA1XDFcMTA1XDFcMCIrCi0gICAgIlwxXDEwNVwxXDBcMVwzMDVcMlwxMDVcN1wwXDFcMTA1XDFcMjA3XDNcMCIrCi0gICAgIlwxXDEwNVwxMlwwXDNcMTA1XDFcMFwxXDEwNVwxMFwwXDExXDEwNVwxXDAiKwotICAgICJcNFwxMDVcMVwwXDJcMTA1XDFcMFwxXDEwNVwxXDBcM1wxMDVcNlwwIisKLSAgICAiXDJcMjEyXDFcMjEzXDNcMFwyXDIxMlwxMVwwXDNcMjEyXDFcMFwxXDIxMiIrCi0gICAgIlwxMFwwXDExXDIxMlwxXDBcNFwyMTJcMVwwXDJcMjEyXDFcMFwxXDIxMiIrCi0gICAgIlwxXDBcM1wyMTJcNlwwXDFcMzA2XDJcMjEyXDFcMFwyXDIxMlwxXDMwNiIrCi0gICAgIlwyXDIxMlwxXDBcNFwyMTJcMlwwXDE2XDIxMlwxXDMwNlwyXDIxMlwxXDMwNiIrCi0gICAgIlwyXDIxMlwxXDMwNlwxMFwyMTJcMVwzMDZcNFwyMTJcMVwzMDZcN1wyMTJcMlwwIisKLSAgICAiXDFcMjEyXDFcMjEzXDNcMFwxXDIxMlwxMlwwXDNcMjEyXDFcMFwxXDIxMiIrCi0gICAgIlwxMFwwXDExXDIxMlwxXDBcNFwyMTJcMVwwXDJcMjEyXDFcMFwxXDIxMiIrCi0gICAgIlwxXDBcM1wyMTJcNlwwXDJcMzA3XDFcMzEwXDNcMFwyXDMwN1wxMVwwIisKLSAgICAiXDNcMzA3XDFcMFwxXDMwN1wxMFwwXDExXDMwN1wxXDBcNFwzMDdcMVwwIisKLSAgICAiXDJcMzA3XDFcMFwxXDMwN1wxXDBcM1wzMDdcNlwwXDFcMzExXDFcMTE0IisKLSAgICAiXDFcMjE3XDFcMTE0XDFcMFwxXDExNFwxXDMxMVwxXDExNFwxXDBcMVwxMTQiKwotICAgICJcMVwwXDFcMjIwXDJcMFwyXDExNFwxXDBcM1wxMTRcMVwyMjFcMVwxMTQiKwotICAgICJcMTBcMFwxXDMxMVwyXDExNFwxXDMxMVwyXDExNFwxXDMxMVwyXDExNFwxXDAiKwotICAgICJcNFwxMTRcMVwwXDFcMzExXDFcMTE0XDFcMFwxXDExNFwxXDBcMVwzMTEiKwotICAgICJcMlwxMTRcNlwwXDFcMzEyXDFcMjIzXDFcMjI0XDFcMjIzXDFcMzEzXDFcMjIzIisKLSAgICAiXDFcMzEyXDEwXDIyM1wxXDMxNFwxNlwyMjNcMVwzMTJcMlwyMjNcMVwzMTJcMlwyMjMiKwotICAgICJcMVwzMTJcMTBcMjIzXDFcMzEyXDRcMjIzXDFcMzEyXDdcMjIzXDFcMFwxXDMxNSIrCi0gICAgIlwxXDIyNlwxXDIyN1wzXDIyNlwxXDMxNVwxXDIyNlwxXDMxNlw2XDIyNlwxXDMxNyIrCi0gICAgIlwxNlwyMjZcMVwzMTVcMlwyMjZcMVwzMTVcMlwyMjZcMVwzMTVcMTBcMjI2XDFcMzE1IisKLSAgICAiXDRcMjI2XDFcMzE1XDdcMjI2XDFcMFwxXDIzMFwxXDIxMlwxXDIxM1wzXDAiKwotICAgICJcMVwyMTJcMVwyMTRcMTFcMFwzXDIxMlwxXDBcMVwyMTJcMTBcMFwxMVwyMTIiKwotICAgICJcMVwwXDRcMjEyXDFcMFwyXDIxMlwxXDBcMVwyMTJcMVwwXDNcMjEyIisKLSAgICAiXDRcMFwxXDIxNlwxXDBcMVwzMjBcMlwyMzFcMVwwXDJcMjMxXDFcMzIwIisKLSAgICAiXDJcMjMxXDFcMFw0XDIzMVwyXDBcMTZcMjMxXDFcMzIwXDJcMjMxXDFcMzIwIisKLSAgICAiXDJcMjMxXDFcMzIwXDEwXDIzMVwxXDMyMFw0XDIzMVwxXDMyMFw3XDIzMVwxXDAiKwotICAgICJcMVwzMjFcNVwwXDFcMzIxXDE2XDBcMlwzMjFcN1wwXDJcMzIxXDFcMCIrCi0gICAgIlwyXDMyMVwxXDBcMlwzMjFcN1wwXDJcMzIxXDNcMFwyXDMyMVw3XDAiKwotICAgICJcMlwxMTRcMVwyMTdcM1wwXDJcMTE0XDNcMFwxXDIyMFw1XDBcMlwxMTQiKwotICAgICJcMVwzMjJcMVwyMjFcMVwxMTRcMTBcMFwxMVwxMTRcMVwwXDRcMTE0XDFcMCIrCi0gICAgIlwyXDExNFwxXDBcMVwxMTRcMVwwXDNcMTE0XDU3XDBcMVwzMjNcMjFcMCIrCi0gICAgIlwxXDMyNFwxXDI1XDFcMTMyXDFcMjVcMVwwXDFcMjVcMVwzMjRcMVwyNSIrCi0gICAgIlwxXDBcMVwyNVw0XDBcMlwyNVwxXDBcM1wyNVwxXDBcMVwyNSIrCi0gICAgIlwxMFwwXDFcMzI0XDJcMjVcMVwzMjRcMlwyNVwxXDMyNFwyXDI1XDFcMCIrCi0gICAgIlw0XDI1XDFcMFwxXDMyNFwxXDI1XDFcMFwxXDI1XDFcMFwxXDMyNCIrCi0gICAgIlwyXDI1XDZcMFwxXDMyNVwxXDEzNVwxXDEzNlwxXDEzNVwxXDBcMVwxMzUiKwotICAgICJcMVwzMjVcMVwxMzVcMVwwXDFcMTM1XDRcMFwyXDEzNVwxXDBcM1wxMzUiKwotICAgICJcMVwwXDFcMTM1XDEwXDBcMVwzMjVcMlwxMzVcMVwzMjVcMlwxMzVcMVwzMjUiKwotICAgICJcMlwxMzVcMVwwXDRcMTM1XDFcMFwxXDMyNVwxXDEzNVwxXDBcMVwxMzUiKwotICAgICJcMVwwXDFcMzI1XDJcMTM1XDZcMFwxXDMyNlwxXDEzN1wxXDE0MFwxXDEzNyIrCi0gICAgIlwxXDBcMVwxMzdcMVwzMjZcMVwxMzdcMVwwXDFcMTM3XDRcMFwyXDEzNyIrCi0gICAgIlwxXDBcM1wxMzdcMVwwXDFcMTM3XDEwXDBcMVwzMjZcMlwxMzdcMVwzMjYiKwotICAgICJcMlwxMzdcMVwzMjZcMlwxMzdcMVwwXDRcMTM3XDFcMFwxXDMyNlwxXDEzNyIrCi0gICAgIlwxXDBcMVwxMzdcMVwwXDFcMzI2XDJcMTM3XDE1XDBcMVwzMjdcNjJcMCIrCi0gICAgIlwzNFwxNDJcMVwzMzBcMVwyNDVcMzVcMTQyXDQyXDBcMlwzMzFcMTAyXDBcMVwzMzIiKwotICAgICJcNzVcMFwyXDMzM1w3NFwwXDFcMzM0XDc2XDBcMVwzMzVcN1wwXDFcMzM2IisKLSAgICAiXDFcMzM3XDFcMjUzXDFcMFwxXDI1M1wxXDMzNlwxXDM0MFwxXDBcMVwyNTMiKwotICAgICJcNFwwXDJcMjUzXDFcMFwzXDMzNlwxXDBcMVwzMzZcMTBcMFwxMVwzMzYiKwotICAgICJcMVwwXDRcMzM2XDFcMFwyXDMzNlwxXDBcMVwzMzZcMVwwXDNcMzM2IisKLSAgICAiXDZcMFwxXDM0MVwxXDE1MFwxXDE1MVwxXDE1MFwxXDBcMVwxNTBcMVwzNDEiKwotICAgICJcMVwxNTBcMVwwXDFcMTUwXDRcMFwyXDE1MFwxXDBcM1wxNTBcMVwyNTMiKwotICAgICJcMVwxNTBcMTBcMFwxXDM0MVwyXDE1MFwxXDM0MVwyXDE1MFwxXDM0MVwyXDE1MCIrCi0gICAgIlwxXDBcNFwxNTBcMVwwXDFcMzQxXDFcMTUwXDFcMFwxXDE1MFwxXDAiKwotICAgICJcMVwzNDFcMlwxNTBcNlwwXDFcMzQyXDFcMTUzXDFcMTU0XDFcMTUzXDFcMTU1IisKLSAgICAiXDFcMTUzXDFcMzQyXDI3XDE1M1wxXDM0MlwyXDE1M1wxXDM0MlwyXDE1M1wxXDM0MiIrCi0gICAgIlwxMFwxNTNcMVwzNDJcNFwxNTNcMVwzNDJcN1wxNTNcMVwwXDJcMTUzXDFcMTU0IisKLSAgICAiXDFcMFwxXDE1NVwxMlwxNTNcMVwwXDUyXDE1M1wxXDBcMVwzNDNcMVwxNTYiKwotICAgICJcMVwxNTdcM1wxNTZcMVwzNDNcMVwxNTZcMVwxNTVcMjVcMTU2XDFcMzQzXDJcMTU2IisKLSAgICAiXDFcMzQzXDJcMTU2XDFcMzQzXDEwXDE1NlwxXDM0M1w0XDE1NlwxXDM0M1w3XDE1NiIrCi0gICAgIlwxXDBcMlwxNTZcMVwxNTdcMVwwXDRcMTU2XDFcMTU1XDZcMTU2XDFcMCIrCi0gICAgIlw1MlwxNTZcMVwwXDFcMzQ0XDFcMTYwXDFcMTYxXDFcMTYwXDFcMTYyXDFcMTYwIisKLSAgICAiXDFcMzQ0XDI3XDE2MFwxXDM0NFwyXDE2MFwxXDM0NFwyXDE2MFwxXDM0NFwxMFwxNjAiKwotICAgICJcMVwzNDRcNFwxNjBcMVwzNDRcN1wxNjBcMVwwXDJcMTYwXDFcMTYxXDFcMCIrCi0gICAgIlwxXDE2MlwxMlwxNjBcMVwwXDUyXDE2MFwxXDBcMVwzNDVcMVwxNjNcMVwxNjQiKwotICAgICJcM1wxNjNcMVwzNDVcMVwxNjNcMVwxNjJcMjVcMTYzXDFcMzQ1XDJcMTYzXDFcMzQ1IisKLSAgICAiXDJcMTYzXDFcMzQ1XDEwXDE2M1wxXDM0NVw0XDE2M1wxXDM0NVw3XDE2M1wxXDAiKwotICAgICJcMlwxNjNcMVwxNjRcMVwwXDRcMTYzXDFcMTYyXDZcMTYzXDFcMFw1MlwxNjMiKwotICAgICJcMjVcMFwxXDM0Nlw0NlwwXDFcMzQ3XDFcNTFcMVwxNjZcMVw1MVwxXDAiKwotICAgICJcMVw1MVwxXDM0N1wxXDUxXDFcMFwxXDUxXDRcMFwyXDUxXDFcMCIrCi0gICAgIlwzXDUxXDFcMFwxXDUxXDEwXDBcMVwzNDdcMlw1MVwxXDM0N1wyXDUxIisKLSAgICAiXDFcMzQ3XDJcNTFcMVwwXDRcNTFcMVwwXDFcMzQ3XDFcNTFcMVwwIisKLSAgICAiXDFcNTFcMVwwXDFcMzQ3XDJcNTFcNlwwXDFcMzUwXDFcNTVcMVwxNzAiKwotICAgICJcMVw1NVwxXDBcMVw1NVwxXDM1MFwxXDU1XDFcMFwxXDU1XDRcMCIrCi0gICAgIlwyXDU1XDFcMFwzXDU1XDFcMFwxXDU1XDEwXDBcMVwzNTBcMlw1NSIrCi0gICAgIlwxXDM1MFwyXDU1XDFcMzUwXDJcNTVcMVwwXDRcNTVcMVwwXDFcMzUwIisKLSAgICAiXDFcNTVcMVwwXDFcNTVcMVwwXDFcMzUwXDJcNTVcNlwwXDFcMzUxIisKLSAgICAiXDFcNjJcMVwxNzJcMVw2MlwxXDBcMVw2MlwxXDM1MVwxXDYyXDFcMCIrCi0gICAgIlwxXDYyXDRcMFwyXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDEwXDAiKwotICAgICJcMVwzNTFcMlw2MlwxXDM1MVwyXDYyXDFcMzUxXDJcNjJcMVwwXDRcNjIiKwotICAgICJcMVwwXDFcMzUxXDFcNjJcMVwwXDFcNjJcMVwwXDFcMzUxXDJcNjIiKwotICAgICJcNlwwXDFcMzUyXDFcNzJcMVwxNzZcMVw3MlwxXDBcMVw3MlwxXDM1MiIrCi0gICAgIlwxXDcyXDFcMFwxXDcyXDRcMFwyXDcyXDFcMFwzXDcyXDFcMCIrCi0gICAgIlwxXDcyXDEwXDBcMVwzNTJcMlw3MlwxXDM1MlwyXDcyXDFcMzUyXDJcNzIiKwotICAgICJcMVwwXDRcNzJcMVwwXDFcMzUyXDFcNzJcMVwwXDFcNzJcMVwwIisKLSAgICAiXDFcMzUyXDJcNzJcNlwwXDFcMzUzXDFcMTAwXDFcMjAwXDFcMTAwXDFcMCIrCi0gICAgIlwxXDEwMFwxXDM1M1wxXDEwMFwxXDBcMVwxMDBcNFwwXDJcMTAwXDFcMCIrCi0gICAgIlwzXDEwMFwxXDBcMVwxMDBcMTBcMFwxXDM1M1wyXDEwMFwxXDM1M1wyXDEwMCIrCi0gICAgIlwxXDM1M1wyXDEwMFwxXDBcNFwxMDBcMVwwXDFcMzUzXDFcMTAwXDFcMCIrCi0gICAgIlwxXDEwMFwxXDBcMVwzNTNcMlwxMDBcNlwwXDFcMzU0XDFcMjAyXDFcMjAzIisKLSAgICAiXDFcMjAyXDFcMjA0XDFcMjAyXDFcMzU0XDI3XDIwMlwxXDM1NFwyXDIwMlwxXDM1NCIrCi0gICAgIlwyXDIwMlwxXDM1NFwxMFwyMDJcMVwzNTRcNFwyMDJcMVwzNTRcN1wyMDJcMVwwIisKLSAgICAiXDJcMjAyXDFcMjAzXDFcMFwxXDIwNFwxMlwyMDJcMVwwXDUyXDIwMlwxXDAiKwotICAgICJcMVwzNTVcMVwyMDVcMVwyMDZcM1wyMDVcMVwzNTVcMVwyMDVcMVwyMDRcMjVcMjA1IisKLSAgICAiXDFcMzU1XDJcMjA1XDFcMzU1XDJcMjA1XDFcMzU1XDEwXDIwNVwxXDM1NVw0XDIwNSIrCi0gICAgIlwxXDM1NVw3XDIwNVwxXDBcMlwyMDVcMVwyMDZcMVwwXDRcMjA1XDFcMjA0IisKLSAgICAiXDZcMjA1XDFcMFw1MlwyMDVcMVwwXDFcMzU2XDFcMTA1XDFcMjA3XDFcMTA1IisKLSAgICAiXDFcMFwxXDEwNVwxXDM1NlwxXDEwNVwxXDBcMVwxMDVcNFwwXDJcMTA1IisKLSAgICAiXDFcMFwzXDEwNVwxXDBcMVwxMDVcMTBcMFwxXDM1NlwyXDEwNVwxXDM1NiIrCi0gICAgIlwyXDEwNVwxXDM1NlwyXDEwNVwxXDBcNFwxMDVcMVwwXDFcMzU2XDFcMTA1IisKLSAgICAiXDFcMFwxXDEwNVwxXDBcMVwzNTZcMlwxMDVcNlwwXDFcMzU3XDFcMjEyIisKLSAgICAiXDFcMjEzXDFcMjEyXDFcMFwxXDIxMlwxXDM1N1wxXDIxMlwxXDBcMVwyMTIiKwotICAgICJcNFwwXDJcMjEyXDFcMFwzXDIxMlwxXDBcMVwyMTJcMTBcMFwxXDM1NyIrCi0gICAgIlwyXDIxMlwxXDM1N1wyXDIxMlwxXDM1N1wyXDIxMlwxXDBcNFwyMTJcMVwwIisKLSAgICAiXDFcMzU3XDFcMjEyXDFcMFwxXDIxMlwxXDBcMVwzNTdcMlwyMTJcNlwwIisKLSAgICAiXDJcMzA3XDFcMzEwXDNcMFwyXDMwN1wzXDBcMVwyMjBcNVwwXDNcMzA3IisKLSAgICAiXDFcMFwxXDMwN1wxMFwwXDExXDMwN1wxXDBcNFwzMDdcMVwwXDJcMzA3IisKLSAgICAiXDFcMFwxXDMwN1wxXDBcM1wzMDdcNlwwXDFcMzYwXDJcMzA3XDFcMCIrCi0gICAgIlwyXDMwN1wxXDM2MFwyXDMwN1wxXDBcNFwzMDdcMlwwXDE2XDMwN1wxXDM2MCIrCi0gICAgIlwyXDMwN1wxXDM2MFwyXDMwN1wxXDM2MFwxMFwzMDdcMVwzNjBcNFwzMDdcMVwzNjAiKwotICAgICJcN1wzMDdcMVwwXDFcMzYxXDFcMTE0XDFcMjE3XDFcMTE0XDFcMFwxXDExNCIrCi0gICAgIlwxXDM2MVwxXDExNFwxXDBcMVwxMTRcMVwwXDFcMjIwXDJcMFwyXDExNCIrCi0gICAgIlwxXDBcM1wxMTRcMVwyMjFcMVwxMTRcMTBcMFwxXDM2MVwyXDExNFwxXDM2MSIrCi0gICAgIlwyXDExNFwxXDM2MVwyXDExNFwxXDBcNFwxMTRcMVwwXDFcMzYxXDFcMTE0IisKLSAgICAiXDFcMFwxXDExNFwxXDBcMVwzNjFcMlwxMTRcNlwwXDFcMzYyXDFcMjIzIisKLSAgICAiXDFcMjI0XDFcMjIzXDFcMjI1XDFcMjIzXDFcMzYyXDI3XDIyM1wxXDM2MlwyXDIyMyIrCi0gICAgIlwxXDM2MlwyXDIyM1wxXDM2MlwxMFwyMjNcMVwzNjJcNFwyMjNcMVwzNjJcN1wyMjMiKwotICAgICJcMVwwXDJcMjIzXDFcMjI0XDFcMFwxXDIyNVwxMlwyMjNcMVwwXDUyXDIyMyIrCi0gICAgIlwxXDBcMVwzNjNcMVwyMjZcMVwyMjdcM1wyMjZcMVwzNjNcMVwyMjZcMVwyMjUiKwotICAgICJcMjVcMjI2XDFcMzYzXDJcMjI2XDFcMzYzXDJcMjI2XDFcMzYzXDEwXDIyNlwxXDM2MyIrCi0gICAgIlw0XDIyNlwxXDM2M1w3XDIyNlwxXDBcMlwyMjZcMVwyMjdcMVwwXDRcMjI2IisKLSAgICAiXDFcMjI1XDZcMjI2XDFcMFw1MlwyMjZcMVwwXDFcMzY0XDFcMjMxXDFcMjMyIisKLSAgICAiXDFcMjMxXDFcMFwxXDIzMVwxXDM2NFwxXDIzMVwxXDBcMVwyMzFcNFwwIisKLSAgICAiXDJcMjMxXDFcMFwzXDIzMVwxXDBcMVwyMzFcMTBcMFwxXDM2NFwyXDIzMSIrCi0gICAgIlwxXDM2NFwyXDIzMVwxXDM2NFwyXDIzMVwxXDBcNFwyMzFcMVwwXDFcMzY0IisKLSAgICAiXDFcMjMxXDFcMFwxXDIzMVwxXDBcMVwzNjRcMlwyMzFcNlwwXDFcMzY1IisKLSAgICAiXDVcMFwxXDM2NVwxXDM2NlwxNVwwXDJcMzY1XDdcMFwyXDM2NVwxXDAiKwotICAgICJcMlwzNjVcMVwwXDJcMzY1XDdcMFwyXDM2NVwzXDBcMlwzNjVcN1wwIisKLSAgICAiXDJcMTE0XDFcMjE3XDNcMFwyXDExNFwzXDBcMVwyMjBcNVwwXDNcMTE0IisKLSAgICAiXDFcMzY3XDFcMTE0XDEwXDBcMTFcMTE0XDFcMFw0XDExNFwxXDBcMlwxMTQiKwotICAgICJcMVwwXDFcMTE0XDFcMFwzXDExNFw2MFwwXDFcMzcwXDIwXDBcMVwzNzEiKwotICAgICJcMVwyNVwxXDEzMlwxXDI1XDFcMFwxXDI1XDFcMzcxXDFcMjVcMVwwIisKLSAgICAiXDFcMjVcNFwwXDJcMjVcMVwwXDNcMjVcMVwwXDFcMjVcMTBcMCIrCi0gICAgIlwxXDM3MVwyXDI1XDFcMzcxXDJcMjVcMVwzNzFcMlwyNVwxXDBcNFwyNSIrCi0gICAgIlwxXDBcMVwzNzFcMVwyNVwxXDBcMVwyNVwxXDBcMVwzNzFcMlwyNSIrCi0gICAgIlw2XDBcMVwzNzJcMVwxMzVcMVwxMzZcMVwxMzVcMVwwXDFcMTM1XDFcMzcyIisKLSAgICAiXDFcMTM1XDFcMFwxXDEzNVw0XDBcMlwxMzVcMVwwXDNcMTM1XDFcMCIrCi0gICAgIlwxXDEzNVwxMFwwXDFcMzcyXDJcMTM1XDFcMzcyXDJcMTM1XDFcMzcyXDJcMTM1IisKLSAgICAiXDFcMFw0XDEzNVwxXDBcMVwzNzJcMVwxMzVcMVwwXDFcMTM1XDFcMCIrCi0gICAgIlwxXDM3MlwyXDEzNVw2XDBcMVwzNzNcMVwxMzdcMVwxNDBcMVwxMzdcMVwwIisKLSAgICAiXDFcMTM3XDFcMzczXDFcMTM3XDFcMFwxXDEzN1w0XDBcMlwxMzdcMVwwIisKLSAgICAiXDNcMTM3XDFcMFwxXDEzN1wxMFwwXDFcMzczXDJcMTM3XDFcMzczXDJcMTM3IisKLSAgICAiXDFcMzczXDJcMTM3XDFcMFw0XDEzN1wxXDBcMVwzNzNcMVwxMzdcMVwwIisKLSAgICAiXDFcMTM3XDFcMFwxXDM3M1wyXDEzN1wzMFwwXDFcMzc0XDEyM1wwXDFcMzc1IisKLSAgICAiXDY3XDBcMVwzNzZcNjZcMFwyXDM3N1w3M1wwXDFcdTAxMDBcMjRcMFwyXDMzNiIrCi0gICAgIlwxXDMzN1wxXHUwMTAxXDFcMFwxXHUwMTAxXDJcMzM2XDFcMFwxXHUwMTAxXDFcdTAxMDIiKwotICAgICJcM1wwXDJcdTAxMDFcMVwwXDNcMzM2XDFcMFwxXDMzNlwxMFwwXDExXDMzNiIrCi0gICAgIlwxXDBcNFwzMzZcMVwwXDJcMzM2XDFcMFwxXDMzNlwxXDBcM1wzMzYiKwotICAgICJcNlwwXDFcdTAxMDNcMlwzMzZcMVwwXDJcMzM2XDFcdTAxMDNcMlwzMzZcMVwwIisKLSAgICAiXDRcMzM2XDJcMFwxNlwzMzZcMVx1MDEwM1wyXDMzNlwxXHUwMTAzXDJcMzM2XDFcdTAxMDMiKwotICAgICJcMTBcMzM2XDFcdTAxMDNcNFwzMzZcMVx1MDEwM1w3XDMzNlwyXDBcMVwzMzZcMVwzMzciKwotICAgICJcM1wwXDFcMzM2XDEyXDBcM1wzMzZcMVwwXDFcMzM2XDEwXDBcMTFcMzM2IisKLSAgICAiXDFcMFw0XDMzNlwxXDBcMlwzMzZcMVwwXDFcMzM2XDFcMFwzXDMzNiIrCi0gICAgIlw2XDBcMVx1MDEwNFwxXDE1MFwxXDE1MVwxXDE1MFwxXDBcMVwxNTBcMVx1MDEwNCIrCi0gICAgIlwxXDE1MFwxXDBcMVwxNTBcNFwwXDJcMTUwXDFcMFwzXDE1MFwxXDI1MyIrCi0gICAgIlwxXDE1MFwxMFwwXDFcdTAxMDRcMlwxNTBcMVx1MDEwNFwyXDE1MFwxXHUwMTA0XDJcMTUwIisKLSAgICAiXDFcMFw0XDE1MFwxXDBcMVx1MDEwNFwxXDE1MFwxXDBcMVwxNTBcMVwwIisKLSAgICAiXDFcdTAxMDRcMlwxNTBcNlwwXDFcdTAxMDVcMVwxNTNcMVwxNTRcMVwxNTNcMVwxNTUiKwotICAgICJcMVwxNTNcMVx1MDEwNVwyN1wxNTNcMVx1MDEwNVwyXDE1M1wxXHUwMTA1XDJcMTUzXDFcdTAxMDUiKwotICAgICJcMTBcMTUzXDFcdTAxMDVcNFwxNTNcMVx1MDEwNVw3XDE1M1wxXDBcMVx1MDEwNlwxXDE1NiIrCi0gICAgIlwxXDE1N1wzXDE1NlwxXHUwMTA2XDFcMTU2XDFcMTU1XDI1XDE1NlwxXHUwMTA2XDJcMTU2IisKLSAgICAiXDFcdTAxMDZcMlwxNTZcMVx1MDEwNlwxMFwxNTZcMVx1MDEwNlw0XDE1NlwxXHUwMTA2XDdcMTU2IisKLSAgICAiXDFcMFwxXHUwMTA3XDFcMTYwXDFcMTYxXDFcMTYwXDFcMTYyXDFcMTYwXDFcdTAxMDciKwotICAgICJcMjdcMTYwXDFcdTAxMDdcMlwxNjBcMVx1MDEwN1wyXDE2MFwxXHUwMTA3XDEwXDE2MFwxXHUwMTA3IisKLSAgICAiXDRcMTYwXDFcdTAxMDdcN1wxNjBcMVwwXDFcdTAxMDhcMVwxNjNcMVwxNjRcM1wxNjMiKwotICAgICJcMVx1MDEwOFwxXDE2M1wxXDE2MlwyNVwxNjNcMVx1MDEwOFwyXDE2M1wxXHUwMTA4XDJcMTYzIisKLSAgICAiXDFcdTAxMDhcMTBcMTYzXDFcdTAxMDhcNFwxNjNcMVx1MDEwOFw3XDE2M1wxXDBcMlx1MDEwOSIrCi0gICAgIlwxXHUwMTBhXDFcMzQ2XDFcdTAxMGJcMVwzNDZcMlx1MDEwOVwxXHUwMTBjXDFcMzQ2XDFcdTAxMGQiKwotICAgICJcM1x1MDEwOVwyXDM0Nlw0XHUwMTA5XDFcMFw0NVx1MDEwOVwxXDBcMVx1MDEwZVwxXDUxIisKLSAgICAiXDFcMTY2XDFcNTFcMVwwXDFcNTFcMVx1MDEwZVwxXDUxXDFcMFwxXDUxIisKLSAgICAiXDRcMFwyXDUxXDFcMFwzXDUxXDFcMFwxXDUxXDEwXDBcMVx1MDEwZSIrCi0gICAgIlwyXDUxXDFcdTAxMGVcMlw1MVwxXHUwMTBlXDJcNTFcMVwwXDRcNTFcMVwwIisKLSAgICAiXDFcdTAxMGVcMVw1MVwxXDBcMVw1MVwxXDBcMVx1MDEwZVwyXDUxXDZcMCIrCi0gICAgIlwxXHUwMTBmXDFcNTVcMVwxNzBcMVw1NVwxXDBcMVw1NVwxXHUwMTBmXDFcNTUiKwotICAgICJcMVwwXDFcNTVcNFwwXDJcNTVcMVwwXDNcNTVcMVwwXDFcNTUiKwotICAgICJcMTBcMFwxXHUwMTBmXDJcNTVcMVx1MDEwZlwyXDU1XDFcdTAxMGZcMlw1NVwxXDAiKwotICAgICJcNFw1NVwxXDBcMVx1MDEwZlwxXDU1XDFcMFwxXDU1XDFcMFwxXHUwMTBmIisKLSAgICAiXDJcNTVcNlwwXDFcdTAxMTBcMVw2MlwxXDE3MlwxXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcdTAxMTBcMVw2MlwxXDBcMVw2Mlw0XDBcMlw2MlwxXDBcM1w2MiIrCi0gICAgIlwxXDBcMVw2MlwxMFwwXDFcdTAxMTBcMlw2MlwxXHUwMTEwXDJcNjJcMVx1MDExMCIrCi0gICAgIlwyXDYyXDFcMFw0XDYyXDFcMFwxXHUwMTEwXDFcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDFcdTAxMTBcMlw2Mlw2XDBcMVx1MDExMVwxXDcyXDFcMTc2XDFcNzIiKwotICAgICJcMVwwXDFcNzJcMVx1MDExMVwxXDcyXDFcMFwxXDcyXDRcMFwyXDcyIisKLSAgICAiXDFcMFwzXDcyXDFcMFwxXDcyXDEwXDBcMVx1MDExMVwyXDcyXDFcdTAxMTEiKwotICAgICJcMlw3MlwxXHUwMTExXDJcNzJcMVwwXDRcNzJcMVwwXDFcdTAxMTFcMVw3MiIrCi0gICAgIlwxXDBcMVw3MlwxXDBcMVx1MDExMVwyXDcyXDZcMFwxXHUwMTEyXDFcMTAwIisKLSAgICAiXDFcMjAwXDFcMTAwXDFcMFwxXDEwMFwxXHUwMTEyXDFcMTAwXDFcMFwxXDEwMCIrCi0gICAgIlw0XDBcMlwxMDBcMVwwXDNcMTAwXDFcMFwxXDEwMFwxMFwwXDFcdTAxMTIiKwotICAgICJcMlwxMDBcMVx1MDExMlwyXDEwMFwxXHUwMTEyXDJcMTAwXDFcMFw0XDEwMFwxXDAiKwotICAgICJcMVx1MDExMlwxXDEwMFwxXDBcMVwxMDBcMVwwXDFcdTAxMTJcMlwxMDBcNlwwIisKLSAgICAiXDFcdTAxMTNcMVwyMDJcMVwyMDNcMVwyMDJcMVwyMDRcMVwyMDJcMVx1MDExM1wyN1wyMDIiKwotICAgICJcMVx1MDExM1wyXDIwMlwxXHUwMTEzXDJcMjAyXDFcdTAxMTNcMTBcMjAyXDFcdTAxMTNcNFwyMDIiKwotICAgICJcMVx1MDExM1w3XDIwMlwxXDBcMVx1MDExNFwxXDIwNVwxXDIwNlwzXDIwNVwxXHUwMTE0IisKLSAgICAiXDFcMjA1XDFcMjA0XDI1XDIwNVwxXHUwMTE0XDJcMjA1XDFcdTAxMTRcMlwyMDVcMVx1MDExNCIrCi0gICAgIlwxMFwyMDVcMVx1MDExNFw0XDIwNVwxXHUwMTE0XDdcMjA1XDFcMFwxXHUwMTE1XDFcMTA1IisKLSAgICAiXDFcMjA3XDFcMTA1XDFcMFwxXDEwNVwxXHUwMTE1XDFcMTA1XDFcMFwxXDEwNSIrCi0gICAgIlw0XDBcMlwxMDVcMVwwXDNcMTA1XDFcMFwxXDEwNVwxMFwwXDFcdTAxMTUiKwotICAgICJcMlwxMDVcMVx1MDExNVwyXDEwNVwxXHUwMTE1XDJcMTA1XDFcMFw0XDEwNVwxXDAiKwotICAgICJcMVx1MDExNVwxXDEwNVwxXDBcMVwxMDVcMVwwXDFcdTAxMTVcMlwxMDVcNlwwIisKLSAgICAiXDFcdTAxMTZcMVwyMTJcMVwyMTNcMVwyMTJcMVwwXDFcMjEyXDFcdTAxMTZcMVwyMTIiKwotICAgICJcMVwwXDFcMjEyXDRcMFwyXDIxMlwxXDBcM1wyMTJcMVwwXDFcMjEyIisKLSAgICAiXDEwXDBcMVx1MDExNlwyXDIxMlwxXHUwMTE2XDJcMjEyXDFcdTAxMTZcMlwyMTJcMVwwIisKLSAgICAiXDRcMjEyXDFcMFwxXHUwMTE2XDFcMjEyXDFcMFwxXDIxMlwxXDBcMVx1MDExNiIrCi0gICAgIlwyXDIxMlw2XDBcMVx1MDExN1wxXDMwN1wxXDMxMFwxXDMwN1wxXDBcMVwzMDciKwotICAgICJcMVx1MDExN1wxXDMwN1wxXDBcMVwzMDdcMVwwXDFcMjIwXDJcMFwyXDMwNyIrCi0gICAgIlwxXDBcM1wzMDdcMVwwXDFcMzA3XDEwXDBcMVx1MDExN1wyXDMwN1wxXHUwMTE3IisKLSAgICAiXDJcMzA3XDFcdTAxMTdcMlwzMDdcMVwwXDRcMzA3XDFcMFwxXHUwMTE3XDFcMzA3IisKLSAgICAiXDFcMFwxXDMwN1wxXDBcMVx1MDExN1wyXDMwN1w2XDBcMVx1MDExOFwxXDExNCIrCi0gICAgIlwxXDIxN1wxXDExNFwxXDBcMVwxMTRcMVx1MDExOFwxXDExNFwxXDBcMVwxMTQiKwotICAgICJcMVwwXDFcMjIwXDJcMFwyXDExNFwxXDBcM1wxMTRcMVwyMjFcMVwxMTQiKwotICAgICJcMTBcMFwxXHUwMTE4XDJcMTE0XDFcdTAxMThcMlwxMTRcMVx1MDExOFwyXDExNFwxXDAiKwotICAgICJcNFwxMTRcMVwwXDFcdTAxMThcMVwxMTRcMVwwXDFcMTE0XDFcMFwxXHUwMTE4IisKLSAgICAiXDJcMTE0XDZcMFwxXHUwMTE5XDFcMjIzXDFcMjI0XDFcMjIzXDFcMjI1XDFcMjIzIisKLSAgICAiXDFcdTAxMTlcMjdcMjIzXDFcdTAxMTlcMlwyMjNcMVx1MDExOVwyXDIyM1wxXHUwMTE5XDEwXDIyMyIrCi0gICAgIlwxXHUwMTE5XDRcMjIzXDFcdTAxMTlcN1wyMjNcMVwwXDFcdTAxMWFcMVwyMjZcMVwyMjciKwotICAgICJcM1wyMjZcMVx1MDExYVwxXDIyNlwxXDIyNVwyNVwyMjZcMVx1MDExYVwyXDIyNlwxXHUwMTFhIisKLSAgICAiXDJcMjI2XDFcdTAxMWFcMTBcMjI2XDFcdTAxMWFcNFwyMjZcMVx1MDExYVw3XDIyNlwxXDAiKwotICAgICJcMVx1MDExYlwxXDIzMVwxXDIzMlwxXDIzMVwxXDBcMVwyMzFcMVx1MDExYlwxXDIzMSIrCi0gICAgIlwxXDBcMVwyMzFcNFwwXDJcMjMxXDFcMFwzXDIzMVwxXDBcMVwyMzEiKwotICAgICJcMTBcMFwxXHUwMTFiXDJcMjMxXDFcdTAxMWJcMlwyMzFcMVx1MDExYlwyXDIzMVwxXDAiKwotICAgICJcNFwyMzFcMVwwXDFcdTAxMWJcMVwyMzFcMVwwXDFcMjMxXDFcMFwxXHUwMTFiIisKLSAgICAiXDJcMjMxXDZcMFwxXHUwMTFjXDVcMFwxXHUwMTFjXDFcMzY2XDE1XDBcMlx1MDExYyIrCi0gICAgIlw3XDBcMlx1MDExY1wxXDBcMlx1MDExY1wxXDBcMlx1MDExY1w3XDBcMlx1MDExYyIrCi0gICAgIlwzXDBcMlx1MDExY1w3XDBcMVx1MDExZFw1XDBcMVx1MDExZFwxNlwwXDJcdTAxMWQiKwotICAgICJcN1wwXDJcdTAxMWRcMVwwXDJcdTAxMWRcMVwwXDJcdTAxMWRcN1wwXDJcdTAxMWQiKwotICAgICJcM1wwXDJcdTAxMWRcN1wwXDJcdTAxMWVcMVx1MDExZlwxXHUwMTIwXDFcdTAxMjFcMVx1MDEyMCIrCi0gICAgIlwyXHUwMTFlXDFcdTAxMjJcMVx1MDEyMFwxXHUwMTIzXDNcdTAxMWVcMlx1MDEyMFw0XHUwMTFlXDFcMCIrCi0gICAgIlw0NVx1MDExZVw1NFwwXDFcdTAxMjRcMTdcMFwxXHUwMTI1XDFcMjVcMVwxMzJcMVwyNSIrCi0gICAgIlwxXDBcMVwyNVwxXHUwMTI1XDFcMjVcMVwwXDFcMjVcNFwwXDJcMjUiKwotICAgICJcMVwwXDNcMjVcMVwwXDFcMjVcMTBcMFwxXHUwMTI1XDJcMjVcMVx1MDEyNSIrCi0gICAgIlwyXDI1XDFcdTAxMjVcMlwyNVwxXDBcNFwyNVwxXDBcMVx1MDEyNVwxXDI1IisKLSAgICAiXDFcMFwxXDI1XDFcMFwxXHUwMTI1XDJcMjVcNlwwXDFcdTAxMjZcMVwxMzUiKwotICAgICJcMVwxMzZcMVwxMzVcMVwwXDFcMTM1XDFcdTAxMjZcMVwxMzVcMVwwXDFcMTM1IisKLSAgICAiXDRcMFwyXDEzNVwxXDBcM1wxMzVcMVwwXDFcMTM1XDEwXDBcMVx1MDEyNiIrCi0gICAgIlwyXDEzNVwxXHUwMTI2XDJcMTM1XDFcdTAxMjZcMlwxMzVcMVwwXDRcMTM1XDFcMCIrCi0gICAgIlwxXHUwMTI2XDFcMTM1XDFcMFwxXDEzNVwxXDBcMVx1MDEyNlwyXDEzNVw2XDAiKwotICAgICJcMVx1MDEyN1wxXDEzN1wxXDE0MFwxXDEzN1wxXDBcMVwxMzdcMVx1MDEyN1wxXDEzNyIrCi0gICAgIlwxXDBcMVwxMzdcNFwwXDJcMTM3XDFcMFwzXDEzN1wxXDBcMVwxMzciKwotICAgICJcMTBcMFwxXHUwMTI3XDJcMTM3XDFcdTAxMjdcMlwxMzdcMVx1MDEyN1wyXDEzN1wxXDAiKwotICAgICJcNFwxMzdcMVwwXDFcdTAxMjdcMVwxMzdcMVwwXDFcMTM3XDFcMFwxXHUwMTI3IisKLSAgICAiXDJcMTM3XDUxXDBcMVx1MDEyOFw1MVwwXDFcdTAxMjlcMTExXDBcMlx1MDEyYVwzN1wwIisKLSAgICAiXDFcdTAxMmJcNjZcMFwxXHUwMTAxXDFcMFwxXHUwMTAxXDNcMFwxXHUwMTAxXDFcdTAxMDIiKwotICAgICJcM1wwXDJcdTAxMDFcNTNcMFwxXHUwMTJjXDFcMzM2XDFcMzM3XDFcMzM2XDFcMCIrCi0gICAgIlwxXDMzNlwxXHUwMTJjXDFcMzM2XDFcMFwxXDMzNlwxXHUwMTAyXDNcMFwyXDMzNiIrCi0gICAgIlwxXDBcM1wzMzZcMVwwXDFcMzM2XDEwXDBcMVx1MDEyY1wyXDMzNlwxXHUwMTJjIisKLSAgICAiXDJcMzM2XDFcdTAxMmNcMlwzMzZcMVwwXDRcMzM2XDFcMFwxXHUwMTJjXDFcMzM2IisKLSAgICAiXDFcMFwxXDMzNlwxXDBcMVx1MDEyY1wyXDMzNlw2XDBcMVx1MDEyZFwxXDE1MCIrCi0gICAgIlwxXDE1MVwxXDE1MFwxXDBcMVwxNTBcMVx1MDEyZFwxXDE1MFwxXDBcMVwxNTAiKwotICAgICJcNFwwXDJcMTUwXDFcMFwzXDE1MFwxXDI1M1wxXDE1MFwxMFwwXDFcdTAxMmQiKwotICAgICJcMlwxNTBcMVx1MDEyZFwyXDE1MFwxXHUwMTJkXDJcMTUwXDFcMFw0XDE1MFwxXDAiKwotICAgICJcMVx1MDEyZFwxXDE1MFwxXDBcMVwxNTBcMVwwXDFcdTAxMmRcMlwxNTBcNlwwIisKLSAgICAiXDFcdTAxMmVcMVwxNTNcMVwxNTRcMVwxNTNcMVwxNTVcMVwxNTNcMVx1MDEyZVwyN1wxNTMiKwotICAgICJcMVx1MDEyZVwyXDE1M1wxXHUwMTJlXDJcMTUzXDFcdTAxMmVcMTBcMTUzXDFcdTAxMmVcNFwxNTMiKwotICAgICJcMVx1MDEyZVw3XDE1M1wxXDBcMVx1MDEyZlwxXDE1NlwxXDE1N1wzXDE1NlwxXHUwMTJmIisKLSAgICAiXDFcMTU2XDFcMTU1XDI1XDE1NlwxXHUwMTJmXDJcMTU2XDFcdTAxMmZcMlwxNTZcMVx1MDEyZiIrCi0gICAgIlwxMFwxNTZcMVx1MDEyZlw0XDE1NlwxXHUwMTJmXDdcMTU2XDFcMFwxXHUwMTMwXDFcMTYwIisKLSAgICAiXDFcMTYxXDFcMTYwXDFcMTYyXDFcMTYwXDFcdTAxMzBcMjdcMTYwXDFcdTAxMzBcMlwxNjAiKwotICAgICJcMVx1MDEzMFwyXDE2MFwxXHUwMTMwXDEwXDE2MFwxXHUwMTMwXDRcMTYwXDFcdTAxMzBcN1wxNjAiKwotICAgICJcMVwwXDFcdTAxMzFcMVwxNjNcMVwxNjRcM1wxNjNcMVx1MDEzMVwxXDE2M1wxXDE2MiIrCi0gICAgIlwyNVwxNjNcMVx1MDEzMVwyXDE2M1wxXHUwMTMxXDJcMTYzXDFcdTAxMzFcMTBcMTYzXDFcdTAxMzEiKwotICAgICJcNFwxNjNcMVx1MDEzMVw3XDE2M1wxXDBcMlx1MDEwOVwxXHUwMTBhXDFcdTAxMzJcMVwwIisKLSAgICAiXDNcdTAxMDlcMVwwXDFcdTAxMzJcMVx1MDEwZFwzXHUwMTA5XDJcdTAxMzJcNFx1MDEwOVwxXDAiKwotICAgICJcNDVcdTAxMDlcMVwwXDFcdTAxMzNcMVx1MDEwOVwxXHUwMTBhXDFcdTAxMzJcMlx1MDEwOVwxXHUwMTMzIisKLSAgICAiXDJcdTAxMDlcMVx1MDEzMlwxXHUwMTM0XDNcdTAxMDlcMlx1MDEzMlwxNlx1MDEwOVwxXHUwMTMzXDJcdTAxMDkiKwotICAgICJcMVx1MDEzM1wyXHUwMTA5XDFcdTAxMzNcMTBcdTAxMDlcMVx1MDEzM1w0XHUwMTA5XDFcdTAxMzNcN1x1MDEwOSIrCi0gICAgIlwxXDBcMlx1MDEwYlwxXHUwMTM1XDFcMFwxXHUwMTMyXDExXHUwMTBiXDJcMFw1Mlx1MDEwYiIrCi0gICAgIlwxXDBcMlx1MDEwY1wxXHUwMTM2XDFcMFw0XHUwMTBjXDFcdTAxMzJcNVx1MDEwY1wyXDAiKwotICAgICJcNTJcdTAxMGNcMVwwXDFcdTAxMzdcMVw1MVwxXDE2NlwxXDUxXDFcMFwxXDUxIisKLSAgICAiXDFcdTAxMzdcMVw1MVwxXDBcMVw1MVw0XDBcMlw1MVwxXDBcM1w1MSIrCi0gICAgIlwxXDBcMVw1MVwxMFwwXDFcdTAxMzdcMlw1MVwxXHUwMTM3XDJcNTFcMVx1MDEzNyIrCi0gICAgIlwyXDUxXDFcMFw0XDUxXDFcMFwxXHUwMTM3XDFcNTFcMVwwXDFcNTEiKwotICAgICJcMVwwXDFcdTAxMzdcMlw1MVw2XDBcMVx1MDEzOFwxXDU1XDFcMTcwXDFcNTUiKwotICAgICJcMVwwXDFcNTVcMVx1MDEzOFwxXDU1XDFcMFwxXDU1XDRcMFwyXDU1IisKLSAgICAiXDFcMFwzXDU1XDFcMFwxXDU1XDEwXDBcMVx1MDEzOFwyXDU1XDFcdTAxMzgiKwotICAgICJcMlw1NVwxXHUwMTM4XDJcNTVcMVwwXDRcNTVcMVwwXDFcdTAxMzhcMVw1NSIrCi0gICAgIlwxXDBcMVw1NVwxXDBcMVx1MDEzOFwyXDU1XDZcMFwxXHUwMTM5XDFcNjIiKwotICAgICJcMVwxNzJcMVw2MlwxXDBcMVw2MlwxXHUwMTM5XDFcNjJcMVwwXDFcNjIiKwotICAgICJcNFwwXDJcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMTBcMFwxXHUwMTM5IisKLSAgICAiXDJcNjJcMVx1MDEzOVwyXDYyXDFcdTAxMzlcMlw2MlwxXDBcNFw2MlwxXDAiKwotICAgICJcMVx1MDEzOVwxXDYyXDFcMFwxXDYyXDFcMFwxXHUwMTM5XDJcNjJcNlwwIisKLSAgICAiXDFcdTAxM2FcMVw3MlwxXDE3NlwxXDcyXDFcMFwxXDcyXDFcdTAxM2FcMVw3MiIrCi0gICAgIlwxXDBcMVw3Mlw0XDBcMlw3MlwxXDBcM1w3MlwxXDBcMVw3MiIrCi0gICAgIlwxMFwwXDFcdTAxM2FcMlw3MlwxXHUwMTNhXDJcNzJcMVx1MDEzYVwyXDcyXDFcMCIrCi0gICAgIlw0XDcyXDFcMFwxXHUwMTNhXDFcNzJcMVwwXDFcNzJcMVwwXDFcdTAxM2EiKwotICAgICJcMlw3Mlw2XDBcMVx1MDEzYlwxXDEwMFwxXDIwMFwxXDEwMFwxXDBcMVwxMDAiKwotICAgICJcMVx1MDEzYlwxXDEwMFwxXDBcMVwxMDBcNFwwXDJcMTAwXDFcMFwzXDEwMCIrCi0gICAgIlwxXDBcMVwxMDBcMTBcMFwxXHUwMTNiXDJcMTAwXDFcdTAxM2JcMlwxMDBcMVx1MDEzYiIrCi0gICAgIlwyXDEwMFwxXDBcNFwxMDBcMVwwXDFcdTAxM2JcMVwxMDBcMVwwXDFcMTAwIisKLSAgICAiXDFcMFwxXHUwMTNiXDJcMTAwXDZcMFwxXHUwMTNjXDFcMjAyXDFcMjAzXDFcMjAyIisKLSAgICAiXDFcMjA0XDFcMjAyXDFcdTAxM2NcMjdcMjAyXDFcdTAxM2NcMlwyMDJcMVx1MDEzY1wyXDIwMiIrCi0gICAgIlwxXHUwMTNjXDEwXDIwMlwxXHUwMTNjXDRcMjAyXDFcdTAxM2NcN1wyMDJcMVwwXDFcdTAxM2QiKwotICAgICJcMVwyMDVcMVwyMDZcM1wyMDVcMVx1MDEzZFwxXDIwNVwxXDIwNFwyNVwyMDVcMVx1MDEzZCIrCi0gICAgIlwyXDIwNVwxXHUwMTNkXDJcMjA1XDFcdTAxM2RcMTBcMjA1XDFcdTAxM2RcNFwyMDVcMVx1MDEzZCIrCi0gICAgIlw3XDIwNVwxXDBcMVx1MDEzZVwxXDEwNVwxXDIwN1wxXDEwNVwxXDBcMVwxMDUiKwotICAgICJcMVx1MDEzZVwxXDEwNVwxXDBcMVwxMDVcNFwwXDJcMTA1XDFcMFwzXDEwNSIrCi0gICAgIlwxXDBcMVwxMDVcMTBcMFwxXHUwMTNlXDJcMTA1XDFcdTAxM2VcMlwxMDVcMVx1MDEzZSIrCi0gICAgIlwyXDEwNVwxXDBcNFwxMDVcMVwwXDFcdTAxM2VcMVwxMDVcMVwwXDFcMTA1IisKLSAgICAiXDFcMFwxXHUwMTNlXDJcMTA1XDZcMFwxXHUwMTNmXDFcMjEyXDFcMjEzXDFcMjEyIisKLSAgICAiXDFcMFwxXDIxMlwxXHUwMTNmXDFcMjEyXDFcMFwxXDIxMlw0XDBcMlwyMTIiKwotICAgICJcMVwwXDNcMjEyXDFcMFwxXDIxMlwxMFwwXDFcdTAxM2ZcMlwyMTJcMVx1MDEzZiIrCi0gICAgIlwyXDIxMlwxXHUwMTNmXDJcMjEyXDFcMFw0XDIxMlwxXDBcMVx1MDEzZlwxXDIxMiIrCi0gICAgIlwxXDBcMVwyMTJcMVwwXDFcdTAxM2ZcMlwyMTJcNlwwXDFcdTAxNDBcMVwzMDciKwotICAgICJcMVwzMTBcMVwzMDdcMVwwXDFcMzA3XDFcdTAxNDBcMVwzMDdcMVwwXDFcMzA3IisKLSAgICAiXDFcMFwxXDIyMFwyXDBcMlwzMDdcMVwwXDNcMzA3XDFcMFwxXDMwNyIrCi0gICAgIlwxMFwwXDFcdTAxNDBcMlwzMDdcMVx1MDE0MFwyXDMwN1wxXHUwMTQwXDJcMzA3XDFcMCIrCi0gICAgIlw0XDMwN1wxXDBcMVx1MDE0MFwxXDMwN1wxXDBcMVwzMDdcMVwwXDFcdTAxNDAiKwotICAgICJcMlwzMDdcNlwwXDFcdTAxNDFcMVwxMTRcMVwyMTdcMVwxMTRcMVwwXDFcMTE0IisKLSAgICAiXDFcdTAxNDFcMVwxMTRcMVwwXDFcMTE0XDFcMFwxXDIyMFwyXDBcMlwxMTQiKwotICAgICJcMVwwXDNcMTE0XDFcMjIxXDFcMTE0XDEwXDBcMVx1MDE0MVwyXDExNFwxXHUwMTQxIisKLSAgICAiXDJcMTE0XDFcdTAxNDFcMlwxMTRcMVwwXDRcMTE0XDFcMFwxXHUwMTQxXDFcMTE0IisKLSAgICAiXDFcMFwxXDExNFwxXDBcMVx1MDE0MVwyXDExNFw2XDBcMVx1MDE0MlwxXDIyMyIrCi0gICAgIlwxXDIyNFwxXDIyM1wxXDIyNVwxXDIyM1wxXHUwMTQyXDI3XDIyM1wxXHUwMTQyXDJcMjIzIisKLSAgICAiXDFcdTAxNDJcMlwyMjNcMVx1MDE0MlwxMFwyMjNcMVx1MDE0Mlw0XDIyM1wxXHUwMTQyXDdcMjIzIisKLSAgICAiXDFcMFwxXHUwMTQzXDFcMjI2XDFcMjI3XDNcMjI2XDFcdTAxNDNcMVwyMjZcMVwyMjUiKwotICAgICJcMjVcMjI2XDFcdTAxNDNcMlwyMjZcMVx1MDE0M1wyXDIyNlwxXHUwMTQzXDEwXDIyNlwxXHUwMTQzIisKLSAgICAiXDRcMjI2XDFcdTAxNDNcN1wyMjZcMVwwXDFcdTAxNDRcMVwyMzFcMVwyMzJcMVwyMzEiKwotICAgICJcMVwwXDFcMjMxXDFcdTAxNDRcMVwyMzFcMVwwXDFcMjMxXDRcMFwyXDIzMSIrCi0gICAgIlwxXDBcM1wyMzFcMVwwXDFcMjMxXDEwXDBcMVx1MDE0NFwyXDIzMVwxXHUwMTQ0IisKLSAgICAiXDJcMjMxXDFcdTAxNDRcMlwyMzFcMVwwXDRcMjMxXDFcMFwxXHUwMTQ0XDFcMjMxIisKLSAgICAiXDFcMFwxXDIzMVwxXDBcMVx1MDE0NFwyXDIzMVw2XDBcMVx1MDE0NVw1XDAiKwotICAgICJcMVx1MDE0NVwxXDM2NlwxNVwwXDJcdTAxNDVcN1wwXDJcdTAxNDVcMVwwXDJcdTAxNDUiKwotICAgICJcMVwwXDJcdTAxNDVcN1wwXDJcdTAxNDVcM1wwXDJcdTAxNDVcN1wwXDFcdTAxNDYiKwotICAgICJcNVwwXDFcdTAxNDZcMTZcMFwyXHUwMTQ2XDdcMFwyXHUwMTQ2XDFcMFwyXHUwMTQ2IisKLSAgICAiXDFcMFwyXHUwMTQ2XDdcMFwyXHUwMTQ2XDNcMFwyXHUwMTQ2XDdcMFwyXHUwMTFlIisKLSAgICAiXDFcdTAxMWZcMVx1MDE0N1wxXDBcM1x1MDExZVwxXDBcMVx1MDE0N1wxXHUwMTIzXDNcdTAxMWUiKwotICAgICJcMlx1MDE0N1w0XHUwMTFlXDFcMFw0NVx1MDExZVwxXDBcMVx1MDE0OFwxXHUwMTFlXDFcdTAxMWYiKwotICAgICJcMVx1MDE0N1wyXHUwMTFlXDFcdTAxNDhcMlx1MDExZVwxXHUwMTQ3XDFcdTAxNDlcM1x1MDExZVwyXHUwMTQ3IisKLSAgICAiXDE2XHUwMTFlXDFcdTAxNDhcMlx1MDExZVwxXHUwMTQ4XDJcdTAxMWVcMVx1MDE0OFwxMFx1MDExZVwxXHUwMTQ4IisKLSAgICAiXDRcdTAxMWVcMVx1MDE0OFw3XHUwMTFlXDFcMFwyXHUwMTIxXDFcdTAxNGFcMVwwXDFcdTAxNDciKwotICAgICJcMTFcdTAxMjFcMlwwXDUyXHUwMTIxXDFcMFwyXHUwMTIyXDFcdTAxNGJcMVwwXDRcdTAxMjIiKwotICAgICJcMVx1MDE0N1w1XHUwMTIyXDJcMFw1Mlx1MDEyMlwyM1wwXDFcdTAxNGNcNTBcMFwxXHUwMTRkIisKLSAgICAiXDFcMjVcMVwxMzJcMVwyNVwxXDBcMVwyNVwxXHUwMTRkXDFcMjVcMVwwIisKLSAgICAiXDFcMjVcNFwwXDJcMjVcMVwwXDNcMjVcMVwwXDFcMjVcMTBcMCIrCi0gICAgIlwxXHUwMTRkXDJcMjVcMVx1MDE0ZFwyXDI1XDFcdTAxNGRcMlwyNVwxXDBcNFwyNSIrCi0gICAgIlwxXDBcMVx1MDE0ZFwxXDI1XDFcMFwxXDI1XDFcMFwxXHUwMTRkXDJcMjUiKwotICAgICJcNlwwXDFcdTAxNGVcMVwxMzVcMVwxMzZcMVwxMzVcMVwwXDFcMTM1XDFcdTAxNGUiKwotICAgICJcMVwxMzVcMVwwXDFcMTM1XDRcMFwyXDEzNVwxXDBcM1wxMzVcMVwwIisKLSAgICAiXDFcMTM1XDEwXDBcMVx1MDE0ZVwyXDEzNVwxXHUwMTRlXDJcMTM1XDFcdTAxNGVcMlwxMzUiKwotICAgICJcMVwwXDRcMTM1XDFcMFwxXHUwMTRlXDFcMTM1XDFcMFwxXDEzNVwxXDAiKwotICAgICJcMVx1MDE0ZVwyXDEzNVw2XDBcMVx1MDE0ZlwxXDEzN1wxXDE0MFwxXDEzN1wxXDAiKwotICAgICJcMVwxMzdcMVx1MDE0ZlwxXDEzN1wxXDBcMVwxMzdcNFwwXDJcMTM3XDFcMCIrCi0gICAgIlwzXDEzN1wxXDBcMVwxMzdcMTBcMFwxXHUwMTRmXDJcMTM3XDFcdTAxNGZcMlwxMzciKwotICAgICJcMVx1MDE0ZlwyXDEzN1wxXDBcNFwxMzdcMVwwXDFcdTAxNGZcMVwxMzdcMVwwIisKLSAgICAiXDFcMTM3XDFcMFwxXHUwMTRmXDJcMTM3XDUyXDBcMlx1MDE1MFw3M1wwXDFcdTAxNTEiKwotICAgICJcMTA2XDBcMlx1MDE1Mlw3XDBcMVx1MDE1M1wxXDMzNlwxXDMzN1wxXDMzNlwxXDAiKwotICAgICJcMVwzMzZcMVx1MDE1M1wxXDMzNlwxXDBcMVwzMzZcMVx1MDEwMlwzXDBcMlwzMzYiKwotICAgICJcMVwwXDNcMzM2XDFcMFwxXDMzNlwxMFwwXDFcdTAxNTNcMlwzMzZcMVx1MDE1MyIrCi0gICAgIlwyXDMzNlwxXHUwMTUzXDJcMzM2XDFcMFw0XDMzNlwxXDBcMVx1MDE1M1wxXDMzNiIrCi0gICAgIlwxXDBcMVwzMzZcMVwwXDFcdTAxNTNcMlwzMzZcNlwwXDFcdTAxNTRcMVwxNTAiKwotICAgICJcMVwxNTFcMVwxNTBcMVwwXDFcMTUwXDFcdTAxNTRcMVwxNTBcMVwwXDFcMTUwIisKLSAgICAiXDRcMFwyXDE1MFwxXDBcM1wxNTBcMVwyNTNcMVwxNTBcMTBcMFwxXHUwMTU0IisKLSAgICAiXDJcMTUwXDFcdTAxNTRcMlwxNTBcMVx1MDE1NFwyXDE1MFwxXDBcNFwxNTBcMVwwIisKLSAgICAiXDFcdTAxNTRcMVwxNTBcMVwwXDFcMTUwXDFcMFwxXHUwMTU0XDJcMTUwXDZcMCIrCi0gICAgIlwxXHUwMTU1XDFcMTUzXDFcMTU0XDFcMTUzXDFcMTU1XDFcMTUzXDFcdTAxNTVcMjdcMTUzIisKLSAgICAiXDFcdTAxNTVcMlwxNTNcMVx1MDE1NVwyXDE1M1wxXHUwMTU1XDEwXDE1M1wxXHUwMTU1XDRcMTUzIisKLSAgICAiXDFcdTAxNTVcN1wxNTNcMVwwXDFcdTAxNTZcMVwxNTZcMVwxNTdcM1wxNTZcMVx1MDE1NiIrCi0gICAgIlwxXDE1NlwxXDE1NVwyNVwxNTZcMVx1MDE1NlwyXDE1NlwxXHUwMTU2XDJcMTU2XDFcdTAxNTYiKwotICAgICJcMTBcMTU2XDFcdTAxNTZcNFwxNTZcMVx1MDE1Nlw3XDE1NlwxXDBcMVx1MDE1N1wxXDE2MCIrCi0gICAgIlwxXDE2MVwxXDE2MFwxXDE2MlwxXDE2MFwxXHUwMTU3XDI3XDE2MFwxXHUwMTU3XDJcMTYwIisKLSAgICAiXDFcdTAxNTdcMlwxNjBcMVx1MDE1N1wxMFwxNjBcMVx1MDE1N1w0XDE2MFwxXHUwMTU3XDdcMTYwIisKLSAgICAiXDFcMFwxXHUwMTU4XDFcMTYzXDFcMTY0XDNcMTYzXDFcdTAxNThcMVwxNjNcMVwxNjIiKwotICAgICJcMjVcMTYzXDFcdTAxNThcMlwxNjNcMVx1MDE1OFwyXDE2M1wxXHUwMTU4XDEwXDE2M1wxXHUwMTU4IisKLSAgICAiXDRcMTYzXDFcdTAxNThcN1wxNjNcNFwwXDFcdTAxMzJcMVwwXDFcdTAxMzJcM1wwIisKLSAgICAiXDFcdTAxMzJcMVx1MDEwZFwzXDBcMlx1MDEzMlw1M1wwXDFcdTAxNTlcMVx1MDEwOVwxXHUwMTBhIisKLSAgICAiXDFcdTAxMDlcMVwwXDFcdTAxMDlcMVx1MDE1OVwxXHUwMTA5XDFcMFwxXHUwMTA5XDFcdTAxMGQiKwotICAgICJcMTFcdTAxMDlcMVwwXDExXHUwMTA5XDFcdTAxNTlcMlx1MDEwOVwxXHUwMTU5XDJcdTAxMDlcMVx1MDE1OSIrCi0gICAgIlwxMFx1MDEwOVwxXHUwMTU5XDRcdTAxMDlcMVx1MDE1OVw3XHUwMTA5XDFcMFwxXHUwMTVhXDFcdTAxMGIiKwotICAgICJcMVx1MDEzNVwxXHUwMTBiXDFcdTAxNWJcMVx1MDEwYlwxXHUwMTVhXDEwXHUwMTBiXDFcdTAxNWNcMTZcdTAxMGIiKwotICAgICJcMVx1MDE1YVwyXHUwMTBiXDFcdTAxNWFcMlx1MDEwYlwxXHUwMTVhXDEwXHUwMTBiXDFcdTAxNWFcNFx1MDEwYiIrCi0gICAgIlwxXHUwMTVhXDdcdTAxMGJcMVwwXDFcdTAxNWRcMVx1MDEwY1wxXHUwMTM2XDNcdTAxMGNcMVx1MDE1ZCIrCi0gICAgIlwxXHUwMTBjXDFcdTAxNWVcNlx1MDEwY1wxXHUwMTVmXDE2XHUwMTBjXDFcdTAxNWRcMlx1MDEwY1wxXHUwMTVkIisKLSAgICAiXDJcdTAxMGNcMVx1MDE1ZFwxMFx1MDEwY1wxXHUwMTVkXDRcdTAxMGNcMVx1MDE1ZFw3XHUwMTBjXDFcMCIrCi0gICAgIlwxXHUwMTYwXDFcNTFcMVwxNjZcMVw1MVwxXDBcMVw1MVwxXHUwMTYwXDFcNTEiKwotICAgICJcMVwwXDFcNTFcNFwwXDJcNTFcMVwwXDNcNTFcMVwwXDFcNTEiKwotICAgICJcMTBcMFwxXHUwMTYwXDJcNTFcMVx1MDE2MFwyXDUxXDFcdTAxNjBcMlw1MVwxXDAiKwotICAgICJcNFw1MVwxXDBcMVx1MDE2MFwxXDUxXDFcMFwxXDUxXDFcMFwxXHUwMTYwIisKLSAgICAiXDJcNTFcNlwwXDFcdTAxNjFcMVw1NVwxXDE3MFwxXDU1XDFcMFwxXDU1IisKLSAgICAiXDFcdTAxNjFcMVw1NVwxXDBcMVw1NVw0XDBcMlw1NVwxXDBcM1w1NSIrCi0gICAgIlwxXDBcMVw1NVwxMFwwXDFcdTAxNjFcMlw1NVwxXHUwMTYxXDJcNTVcMVx1MDE2MSIrCi0gICAgIlwyXDU1XDFcMFw0XDU1XDFcMFwxXHUwMTYxXDFcNTVcMVwwXDFcNTUiKwotICAgICJcMVwwXDFcdTAxNjFcMlw1NVw2XDBcMVx1MDE2MlwxXDYyXDFcMTcyXDFcNjIiKwotICAgICJcMVwwXDFcNjJcMVx1MDE2MlwxXDYyXDFcMFwxXDYyXDRcMFwyXDYyIisKLSAgICAiXDFcMFwzXDYyXDFcMFwxXDYyXDEwXDBcMVx1MDE2MlwyXDYyXDFcdTAxNjIiKwotICAgICJcMlw2MlwxXHUwMTYyXDJcNjJcMVwwXDRcNjJcMVwwXDFcdTAxNjJcMVw2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDBcMVx1MDE2MlwyXDYyXDZcMFwxXHUwMTYzXDFcNzIiKwotICAgICJcMVwxNzZcMVw3MlwxXDBcMVw3MlwxXHUwMTYzXDFcNzJcMVwwXDFcNzIiKwotICAgICJcNFwwXDJcNzJcMVwwXDNcNzJcMVwwXDFcNzJcMTBcMFwxXHUwMTYzIisKLSAgICAiXDJcNzJcMVx1MDE2M1wyXDcyXDFcdTAxNjNcMlw3MlwxXDBcNFw3MlwxXDAiKwotICAgICJcMVx1MDE2M1wxXDcyXDFcMFwxXDcyXDFcMFwxXHUwMTYzXDJcNzJcNlwwIisKLSAgICAiXDFcdTAxNjRcMVwxMDBcMVwyMDBcMVwxMDBcMVwwXDFcMTAwXDFcdTAxNjRcMVwxMDAiKwotICAgICJcMVwwXDFcMTAwXDRcMFwyXDEwMFwxXDBcM1wxMDBcMVwwXDFcMTAwIisKLSAgICAiXDEwXDBcMVx1MDE2NFwyXDEwMFwxXHUwMTY0XDJcMTAwXDFcdTAxNjRcMlwxMDBcMVwwIisKLSAgICAiXDRcMTAwXDFcMFwxXHUwMTY0XDFcMTAwXDFcMFwxXDEwMFwxXDBcMVx1MDE2NCIrCi0gICAgIlwyXDEwMFw2XDBcMVx1MDE2NVwxXDIwMlwxXDIwM1wxXDIwMlwxXDIwNFwxXDIwMiIrCi0gICAgIlwxXHUwMTY1XDI3XDIwMlwxXHUwMTY1XDJcMjAyXDFcdTAxNjVcMlwyMDJcMVx1MDE2NVwxMFwyMDIiKwotICAgICJcMVx1MDE2NVw0XDIwMlwxXHUwMTY1XDdcMjAyXDFcMFwxXHUwMTY2XDFcMjA1XDFcMjA2IisKLSAgICAiXDNcMjA1XDFcdTAxNjZcMVwyMDVcMVwyMDRcMjVcMjA1XDFcdTAxNjZcMlwyMDVcMVx1MDE2NiIrCi0gICAgIlwyXDIwNVwxXHUwMTY2XDEwXDIwNVwxXHUwMTY2XDRcMjA1XDFcdTAxNjZcN1wyMDVcMVwwIisKLSAgICAiXDFcdTAxNjdcMVwxMDVcMVwyMDdcMVwxMDVcMVwwXDFcMTA1XDFcdTAxNjdcMVwxMDUiKwotICAgICJcMVwwXDFcMTA1XDRcMFwyXDEwNVwxXDBcM1wxMDVcMVwwXDFcMTA1IisKLSAgICAiXDEwXDBcMVx1MDE2N1wyXDEwNVwxXHUwMTY3XDJcMTA1XDFcdTAxNjdcMlwxMDVcMVwwIisKLSAgICAiXDRcMTA1XDFcMFwxXHUwMTY3XDFcMTA1XDFcMFwxXDEwNVwxXDBcMVx1MDE2NyIrCi0gICAgIlwyXDEwNVw2XDBcMVx1MDE2OFwxXDIxMlwxXDIxM1wxXDIxMlwxXDBcMVwyMTIiKwotICAgICJcMVx1MDE2OFwxXDIxMlwxXDBcMVwyMTJcNFwwXDJcMjEyXDFcMFwzXDIxMiIrCi0gICAgIlwxXDBcMVwyMTJcMTBcMFwxXHUwMTY4XDJcMjEyXDFcdTAxNjhcMlwyMTJcMVx1MDE2OCIrCi0gICAgIlwyXDIxMlwxXDBcNFwyMTJcMVwwXDFcdTAxNjhcMVwyMTJcMVwwXDFcMjEyIisKLSAgICAiXDFcMFwxXHUwMTY4XDJcMjEyXDZcMFwxXHUwMTY5XDFcMzA3XDFcMzEwXDFcMzA3IisKLSAgICAiXDFcMFwxXDMwN1wxXHUwMTY5XDFcMzA3XDFcMFwxXDMwN1wxXDBcMVwyMjAiKwotICAgICJcMlwwXDJcMzA3XDFcMFwzXDMwN1wxXDBcMVwzMDdcMTBcMFwxXHUwMTY5IisKLSAgICAiXDJcMzA3XDFcdTAxNjlcMlwzMDdcMVx1MDE2OVwyXDMwN1wxXDBcNFwzMDdcMVwwIisKLSAgICAiXDFcdTAxNjlcMVwzMDdcMVwwXDFcMzA3XDFcMFwxXHUwMTY5XDJcMzA3XDZcMCIrCi0gICAgIlwxXHUwMTZhXDFcMTE0XDFcMjE3XDFcMTE0XDFcMFwxXDExNFwxXHUwMTZhXDFcMTE0IisKLSAgICAiXDFcMFwxXDExNFwxXDBcMVwyMjBcMlwwXDJcMTE0XDFcMFwzXDExNCIrCi0gICAgIlwxXDIyMVwxXDExNFwxMFwwXDFcdTAxNmFcMlwxMTRcMVx1MDE2YVwyXDExNFwxXHUwMTZhIisKLSAgICAiXDJcMTE0XDFcMFw0XDExNFwxXDBcMVx1MDE2YVwxXDExNFwxXDBcMVwxMTQiKwotICAgICJcMVwwXDFcdTAxNmFcMlwxMTRcNlwwXDFcdTAxNmJcMVwyMjNcMVwyMjRcMVwyMjMiKwotICAgICJcMVwyMjVcMVwyMjNcMVx1MDE2YlwyN1wyMjNcMVx1MDE2YlwyXDIyM1wxXHUwMTZiXDJcMjIzIisKLSAgICAiXDFcdTAxNmJcMTBcMjIzXDFcdTAxNmJcNFwyMjNcMVx1MDE2Ylw3XDIyM1wxXDBcMVx1MDE2YyIrCi0gICAgIlwxXDIyNlwxXDIyN1wzXDIyNlwxXHUwMTZjXDFcMjI2XDFcMjI1XDI1XDIyNlwxXHUwMTZjIisKLSAgICAiXDJcMjI2XDFcdTAxNmNcMlwyMjZcMVx1MDE2Y1wxMFwyMjZcMVx1MDE2Y1w0XDIyNlwxXHUwMTZjIisKLSAgICAiXDdcMjI2XDFcMFwxXHUwMTZkXDFcMjMxXDFcMjMyXDFcMjMxXDFcMFwxXDIzMSIrCi0gICAgIlwxXHUwMTZkXDFcMjMxXDFcMFwxXDIzMVw0XDBcMlwyMzFcMVwwXDNcMjMxIisKLSAgICAiXDFcMFwxXDIzMVwxMFwwXDFcdTAxNmRcMlwyMzFcMVx1MDE2ZFwyXDIzMVwxXHUwMTZkIisKLSAgICAiXDJcMjMxXDFcMFw0XDIzMVwxXDBcMVx1MDE2ZFwxXDIzMVwxXDBcMVwyMzEiKwotICAgICJcMVwwXDFcdTAxNmRcMlwyMzFcNlwwXDFcdTAxNmVcNVwwXDFcdTAxNmVcMVwzNjYiKwotICAgICJcMTVcMFwyXHUwMTZlXDdcMFwyXHUwMTZlXDFcMFwyXHUwMTZlXDFcMFwyXHUwMTZlIisKLSAgICAiXDdcMFwyXHUwMTZlXDNcMFwyXHUwMTZlXDdcMFwxXHUwMTZmXDVcMFwxXHUwMTZmIisKLSAgICAiXDE2XDBcMlx1MDE2Zlw3XDBcMlx1MDE2ZlwxXDBcMlx1MDE2ZlwxXDBcMlx1MDE2ZiIrCi0gICAgIlw3XDBcMlx1MDE2ZlwzXDBcMlx1MDE2ZlwxMlwwXDFcdTAxNDdcMVwwXDFcdTAxNDciKwotICAgICJcM1wwXDFcdTAxNDdcMVx1MDEyM1wzXDBcMlx1MDE0N1w1M1wwXDFcdTAxNzBcMVx1MDExZSIrCi0gICAgIlwxXHUwMTFmXDFcdTAxMWVcMVwwXDFcdTAxMWVcMVx1MDE3MFwxXHUwMTFlXDFcMFwxXHUwMTFlIisKLSAgICAiXDFcdTAxMjNcMTFcdTAxMWVcMVwwXDExXHUwMTFlXDFcdTAxNzBcMlx1MDExZVwxXHUwMTcwXDJcdTAxMWUiKwotICAgICJcMVx1MDE3MFwxMFx1MDExZVwxXHUwMTcwXDRcdTAxMWVcMVx1MDE3MFw3XHUwMTFlXDFcMFwxXHUwMTcxIisKLSAgICAiXDFcdTAxMjFcMVx1MDE0YVwxXHUwMTIxXDFcdTAxNzJcMVx1MDEyMVwxXHUwMTcxXDEwXHUwMTIxXDFcdTAxNzMiKwotICAgICJcMTZcdTAxMjFcMVx1MDE3MVwyXHUwMTIxXDFcdTAxNzFcMlx1MDEyMVwxXHUwMTcxXDEwXHUwMTIxXDFcdTAxNzEiKwotICAgICJcNFx1MDEyMVwxXHUwMTcxXDdcdTAxMjFcMVwwXDFcdTAxNzRcMVx1MDEyMlwxXHUwMTRiXDNcdTAxMjIiKwotICAgICJcMVx1MDE3NFwxXHUwMTIyXDFcdTAxNzVcNlx1MDEyMlwxXHUwMTc2XDE2XHUwMTIyXDFcdTAxNzRcMlx1MDEyMiIrCi0gICAgIlwxXHUwMTc0XDJcdTAxMjJcMVx1MDE3NFwxMFx1MDEyMlwxXHUwMTc0XDRcdTAxMjJcMVx1MDE3NFw3XHUwMTIyIisKLSAgICAiXDQ3XDBcMVx1MDE3N1wyNFwwXDJcMjVcMVwxMzJcMVwyNVwxXDBcM1wyNSIrCi0gICAgIlwxXDBcMVwyNVw0XDBcMlwyNVwxXDBcM1wyNVwxXDBcMVwyNSIrCi0gICAgIlwxMFwwXDExXDI1XDFcMFw0XDI1XDFcMFwyXDI1XDFcMFwxXDI1IisKLSAgICAiXDFcMFwzXDI1XDZcMFwxXHUwMTc4XDFcMTM1XDFcMTM2XDFcMTM1XDFcMCIrCi0gICAgIlwxXDEzNVwxXHUwMTc4XDFcMTM1XDFcMFwxXDEzNVw0XDBcMlwxMzVcMVwwIisKLSAgICAiXDNcMTM1XDFcMFwxXDEzNVwxMFwwXDFcdTAxNzhcMlwxMzVcMVx1MDE3OFwyXDEzNSIrCi0gICAgIlwxXHUwMTc4XDJcMTM1XDFcMFw0XDEzNVwxXDBcMVx1MDE3OFwxXDEzNVwxXDAiKwotICAgICJcMVwxMzVcMVwwXDFcdTAxNzhcMlwxMzVcNlwwXDFcdTAxNzlcMVwxMzdcMVwxNDAiKwotICAgICJcMVwxMzdcMVwwXDFcMTM3XDFcdTAxNzlcMVwxMzdcMVwwXDFcMTM3XDRcMCIrCi0gICAgIlwyXDEzN1wxXDBcM1wxMzdcMVwwXDFcMTM3XDEwXDBcMVx1MDE3OVwyXDEzNyIrCi0gICAgIlwxXHUwMTc5XDJcMTM3XDFcdTAxNzlcMlwxMzdcMVwwXDRcMTM3XDFcMFwxXHUwMTc5IisKLSAgICAiXDFcMTM3XDFcMFwxXDEzN1wxXDBcMVx1MDE3OVwyXDEzN1w1NFwwXDFcdTAxN2EiKwotICAgICJcNjVcMFwyXHUwMTdiXDMwXDBcMVx1MDE3Y1wxXDMzNlwxXDMzN1wxXDMzNlwxXDAiKwotICAgICJcMVwzMzZcMVx1MDE3Y1wxXDMzNlwxXDBcMVwzMzZcMVx1MDEwMlwzXDBcMlwzMzYiKwotICAgICJcMVwwXDNcMzM2XDFcMFwxXDMzNlwxMFwwXDFcdTAxN2NcMlwzMzZcMVx1MDE3YyIrCi0gICAgIlwyXDMzNlwxXHUwMTdjXDJcMzM2XDFcMFw0XDMzNlwxXDBcMVx1MDE3Y1wxXDMzNiIrCi0gICAgIlwxXDBcMVwzMzZcMVwwXDFcdTAxN2NcMlwzMzZcNlwwXDFcdTAxN2RcMVwxNTAiKwotICAgICJcMVwxNTFcMVwxNTBcMVwwXDFcMTUwXDFcdTAxN2RcMVwxNTBcMVwwXDFcMTUwIisKLSAgICAiXDRcMFwyXDE1MFwxXDBcM1wxNTBcMVwyNTNcMVwxNTBcMTBcMFwxXHUwMTdkIisKLSAgICAiXDJcMTUwXDFcdTAxN2RcMlwxNTBcMVx1MDE3ZFwyXDE1MFwxXDBcNFwxNTBcMVwwIisKLSAgICAiXDFcdTAxN2RcMVwxNTBcMVwwXDFcMTUwXDFcMFwxXHUwMTdkXDJcMTUwXDZcMCIrCi0gICAgIlwxXHUwMTdlXDFcMTUzXDFcMTU0XDFcMTUzXDFcMTU1XDFcMTUzXDFcdTAxN2VcMjdcMTUzIisKLSAgICAiXDFcdTAxN2VcMlwxNTNcMVx1MDE3ZVwyXDE1M1wxXHUwMTdlXDEwXDE1M1wxXHUwMTdlXDRcMTUzIisKLSAgICAiXDFcdTAxN2VcN1wxNTNcMVwwXDFcdTAxN2ZcMVwxNTZcMVwxNTdcM1wxNTZcMVx1MDE3ZiIrCi0gICAgIlwxXDE1NlwxXDE1NVwyNVwxNTZcMVx1MDE3ZlwyXDE1NlwxXHUwMTdmXDJcMTU2XDFcdTAxN2YiKwotICAgICJcMTBcMTU2XDFcdTAxN2ZcNFwxNTZcMVx1MDE3Zlw3XDE1NlwxXDBcMVx1MDE4MFwxXDE2MCIrCi0gICAgIlwxXDE2MVwxXDE2MFwxXDE2MlwxXDE2MFwxXHUwMTgwXDI3XDE2MFwxXHUwMTgwXDJcMTYwIisKLSAgICAiXDFcdTAxODBcMlwxNjBcMVx1MDE4MFwxMFwxNjBcMVx1MDE4MFw0XDE2MFwxXHUwMTgwXDdcMTYwIisKLSAgICAiXDFcMFwxXHUwMTgxXDFcMTYzXDFcMTY0XDNcMTYzXDFcdTAxODFcMVwxNjNcMVwxNjIiKwotICAgICJcMjVcMTYzXDFcdTAxODFcMlwxNjNcMVx1MDE4MVwyXDE2M1wxXHUwMTgxXDEwXDE2M1wxXHUwMTgxIisKLSAgICAiXDRcMTYzXDFcdTAxODFcN1wxNjNcMVwwXDFcdTAxODJcMVx1MDEwOVwxXHUwMTBhXDFcdTAxMDkiKwotICAgICJcMVwwXDFcdTAxMDlcMVx1MDE4MlwxXHUwMTA5XDFcMFwxXHUwMTA5XDFcdTAxMGRcMTFcdTAxMDkiKwotICAgICJcMVwwXDExXHUwMTA5XDFcdTAxODJcMlx1MDEwOVwxXHUwMTgyXDJcdTAxMDlcMVx1MDE4MlwxMFx1MDEwOSIrCi0gICAgIlwxXHUwMTgyXDRcdTAxMDlcMVx1MDE4Mlw3XHUwMTA5XDFcMFwxXHUwMTgzXDFcdTAxMGJcMVx1MDEzNSIrCi0gICAgIlwxXHUwMTBiXDFcdTAxMzJcMVx1MDEwYlwxXHUwMTgzXDI3XHUwMTBiXDFcdTAxODNcMlx1MDEwYlwxXHUwMTgzIisKLSAgICAiXDJcdTAxMGJcMVx1MDE4M1wxMFx1MDEwYlwxXHUwMTgzXDRcdTAxMGJcMVx1MDE4M1w3XHUwMTBiXDFcMCIrCi0gICAgIlwyXHUwMTBiXDFcdTAxMzVcMlx1MDEzMlwxXHUwMTViXDNcdTAxMGJcMVx1MDE1YlwxXHUwMTg0XDNcdTAxMGIiKwotICAgICJcMlx1MDEzMlw1Mlx1MDEwYlwxXDBcMlx1MDEwYlwxXHUwMTM1XDFcMFwxXHUwMTMyXDEyXHUwMTBiIisKLSAgICAiXDFcMFw1Mlx1MDEwYlwxXDBcMVx1MDE4NVwxXHUwMTBjXDFcdTAxMzZcM1x1MDEwY1wxXHUwMTg1IisKLSAgICAiXDFcdTAxMGNcMVx1MDEzMlwyNVx1MDEwY1wxXHUwMTg1XDJcdTAxMGNcMVx1MDE4NVwyXHUwMTBjXDFcdTAxODUiKwotICAgICJcMTBcdTAxMGNcMVx1MDE4NVw0XHUwMTBjXDFcdTAxODVcN1x1MDEwY1wxXDBcMlx1MDEwY1wxXHUwMTM2IisKLSAgICAiXDFcdTAxMzJcMVx1MDEwY1wxXHUwMTVlXDJcdTAxMGNcMVx1MDEzMlwxXHUwMTVlXDFcdTAxODZcM1x1MDEwYyIrCi0gICAgIlwyXHUwMTMyXDUyXHUwMTBjXDFcMFwyXHUwMTBjXDFcdTAxMzZcMVwwXDRcdTAxMGNcMVx1MDEzMiIrCi0gICAgIlw2XHUwMTBjXDFcMFw1Mlx1MDEwY1wxXDBcMlw1MVwxXDE2NlwxXDUxXDFcMCIrCi0gICAgIlwzXDUxXDFcMFwxXDUxXDRcMFwyXDUxXDFcMFwzXDUxXDFcMCIrCi0gICAgIlwxXDUxXDEwXDBcMTFcNTFcMVwwXDRcNTFcMVwwXDJcNTFcMVwwIisKLSAgICAiXDFcNTFcMVwwXDNcNTFcNlwwXDJcNTVcMVwxNzBcMVw1NVwxXDAiKwotICAgICJcM1w1NVwxXDBcMVw1NVw0XDBcMlw1NVwxXDBcM1w1NVwxXDAiKwotICAgICJcMVw1NVwxMFwwXDExXDU1XDFcMFw0XDU1XDFcMFwyXDU1XDFcMCIrCi0gICAgIlwxXDU1XDFcMFwzXDU1XDZcMFwyXDYyXDFcMTcyXDFcNjJcMVwwIisKLSAgICAiXDNcNjJcMVwwXDFcNjJcNFwwXDJcNjJcMVwwXDNcNjJcMVwwIisKLSAgICAiXDFcNjJcMTBcMFwxMVw2MlwxXDBcNFw2MlwxXDBcMlw2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcM1w2Mlw2XDBcMlw3MlwxXDE3NlwxXDcyXDFcMCIrCi0gICAgIlwzXDcyXDFcMFwxXDcyXDRcMFwyXDcyXDFcMFwzXDcyXDFcMCIrCi0gICAgIlwxXDcyXDEwXDBcMTFcNzJcMVwwXDRcNzJcMVwwXDJcNzJcMVwwIisKLSAgICAiXDFcNzJcMVwwXDNcNzJcNlwwXDJcMTAwXDFcMjAwXDFcMTAwXDFcMCIrCi0gICAgIlwzXDEwMFwxXDBcMVwxMDBcNFwwXDJcMTAwXDFcMFwzXDEwMFwxXDAiKwotICAgICJcMVwxMDBcMTBcMFwxMVwxMDBcMVwwXDRcMTAwXDFcMFwyXDEwMFwxXDAiKwotICAgICJcMVwxMDBcMVwwXDNcMTAwXDZcMFwxXHUwMTg3XDFcMjAyXDFcMjAzXDFcMjAyIisKLSAgICAiXDFcMjA0XDFcMjAyXDFcdTAxODdcMjdcMjAyXDFcdTAxODdcMlwyMDJcMVx1MDE4N1wyXDIwMiIrCi0gICAgIlwxXHUwMTg3XDEwXDIwMlwxXHUwMTg3XDRcMjAyXDFcdTAxODdcN1wyMDJcMVwwXDFcdTAxODgiKwotICAgICJcMVwyMDVcMVwyMDZcM1wyMDVcMVx1MDE4OFwxXDIwNVwxXDIwNFwyNVwyMDVcMVx1MDE4OCIrCi0gICAgIlwyXDIwNVwxXHUwMTg4XDJcMjA1XDFcdTAxODhcMTBcMjA1XDFcdTAxODhcNFwyMDVcMVx1MDE4OCIrCi0gICAgIlw3XDIwNVwxXDBcMlwxMDVcMVwyMDdcMVwxMDVcMVwwXDNcMTA1XDFcMCIrCi0gICAgIlwxXDEwNVw0XDBcMlwxMDVcMVwwXDNcMTA1XDFcMFwxXDEwNVwxMFwwIisKLSAgICAiXDExXDEwNVwxXDBcNFwxMDVcMVwwXDJcMTA1XDFcMFwxXDEwNVwxXDAiKwotICAgICJcM1wxMDVcNlwwXDFcdTAxODlcMVwyMTJcMVwyMTNcMVwyMTJcMVwwXDFcMjEyIisKLSAgICAiXDFcdTAxODlcMVwyMTJcMVwwXDFcMjEyXDRcMFwyXDIxMlwxXDBcM1wyMTIiKwotICAgICJcMVwwXDFcMjEyXDEwXDBcMVx1MDE4OVwyXDIxMlwxXHUwMTg5XDJcMjEyXDFcdTAxODkiKwotICAgICJcMlwyMTJcMVwwXDRcMjEyXDFcMFwxXHUwMTg5XDFcMjEyXDFcMFwxXDIxMiIrCi0gICAgIlwxXDBcMVx1MDE4OVwyXDIxMlw2XDBcMVx1MDE4YVwxXDMwN1wxXDMxMFwxXDMwNyIrCi0gICAgIlwxXDBcMVwzMDdcMVx1MDE4YVwxXDMwN1wxXDBcMVwzMDdcMVwwXDFcMjIwIisKLSAgICAiXDJcMFwyXDMwN1wxXDBcM1wzMDdcMVwwXDFcMzA3XDEwXDBcMVx1MDE4YSIrCi0gICAgIlwyXDMwN1wxXHUwMThhXDJcMzA3XDFcdTAxOGFcMlwzMDdcMVwwXDRcMzA3XDFcMCIrCi0gICAgIlwxXHUwMThhXDFcMzA3XDFcMFwxXDMwN1wxXDBcMVx1MDE4YVwyXDMwN1w2XDAiKwotICAgICJcMlwxMTRcMVwyMTdcMVwxMTRcMVwwXDNcMTE0XDFcMFwxXDExNFwxXDAiKwotICAgICJcMVwyMjBcMlwwXDJcMTE0XDFcMFwzXDExNFwxXDIyMVwxXDExNFwxMFwwIisKLSAgICAiXDExXDExNFwxXDBcNFwxMTRcMVwwXDJcMTE0XDFcMFwxXDExNFwxXDAiKwotICAgICJcM1wxMTRcNlwwXDFcdTAxOGJcMVwyMjNcMVwyMjRcMVwyMjNcMVwyMjVcMVwyMjMiKwotICAgICJcMVx1MDE4YlwyN1wyMjNcMVx1MDE4YlwyXDIyM1wxXHUwMThiXDJcMjIzXDFcdTAxOGJcMTBcMjIzIisKLSAgICAiXDFcdTAxOGJcNFwyMjNcMVx1MDE4Ylw3XDIyM1wxXDBcMVx1MDE4Y1wxXDIyNlwxXDIyNyIrCi0gICAgIlwzXDIyNlwxXHUwMThjXDFcMjI2XDFcMjI1XDI1XDIyNlwxXHUwMThjXDJcMjI2XDFcdTAxOGMiKwotICAgICJcMlwyMjZcMVx1MDE4Y1wxMFwyMjZcMVx1MDE4Y1w0XDIyNlwxXHUwMThjXDdcMjI2XDFcMCIrCi0gICAgIlwxXHUwMThkXDFcMjMxXDFcMjMyXDFcMjMxXDFcMFwxXDIzMVwxXHUwMThkXDFcMjMxIisKLSAgICAiXDFcMFwxXDIzMVw0XDBcMlwyMzFcMVwwXDNcMjMxXDFcMFwxXDIzMSIrCi0gICAgIlwxMFwwXDFcdTAxOGRcMlwyMzFcMVx1MDE4ZFwyXDIzMVwxXHUwMThkXDJcMjMxXDFcMCIrCi0gICAgIlw0XDIzMVwxXDBcMVx1MDE4ZFwxXDIzMVwxXDBcMVwyMzFcMVwwXDFcdTAxOGQiKwotICAgICJcMlwyMzFcNlwwXDFcdTAxOGVcNVwwXDFcdTAxOGVcMVwzNjZcMTVcMFwyXHUwMThlIisKLSAgICAiXDdcMFwyXHUwMThlXDFcMFwyXHUwMThlXDFcMFwyXHUwMThlXDdcMFwyXHUwMThlIisKLSAgICAiXDNcMFwyXHUwMThlXDdcMFwxXHUwMThmXDVcMFwxXHUwMThmXDE2XDBcMlx1MDE4ZiIrCi0gICAgIlw3XDBcMlx1MDE4ZlwxXDBcMlx1MDE4ZlwxXDBcMlx1MDE4Zlw3XDBcMlx1MDE4ZiIrCi0gICAgIlwzXDBcMlx1MDE4Zlw3XDBcMVx1MDE5MFwxXHUwMTFlXDFcdTAxMWZcMVx1MDExZVwxXDAiKwotICAgICJcMVx1MDExZVwxXHUwMTkwXDFcdTAxMWVcMVwwXDFcdTAxMWVcMVx1MDEyM1wxMVx1MDExZVwxXDAiKwotICAgICJcMTFcdTAxMWVcMVx1MDE5MFwyXHUwMTFlXDFcdTAxOTBcMlx1MDExZVwxXHUwMTkwXDEwXHUwMTFlXDFcdTAxOTAiKwotICAgICJcNFx1MDExZVwxXHUwMTkwXDdcdTAxMWVcMVwwXDFcdTAxOTFcMVx1MDEyMVwxXHUwMTRhXDFcdTAxMjEiKwotICAgICJcMVx1MDE0N1wxXHUwMTIxXDFcdTAxOTFcMjdcdTAxMjFcMVx1MDE5MVwyXHUwMTIxXDFcdTAxOTFcMlx1MDEyMSIrCi0gICAgIlwxXHUwMTkxXDEwXHUwMTIxXDFcdTAxOTFcNFx1MDEyMVwxXHUwMTkxXDdcdTAxMjFcMVwwXDJcdTAxMjEiKwotICAgICJcMVx1MDE0YVwyXHUwMTQ3XDFcdTAxNzJcM1x1MDEyMVwxXHUwMTcyXDFcdTAxOTJcM1x1MDEyMVwyXHUwMTQ3IisKLSAgICAiXDUyXHUwMTIxXDFcMFwyXHUwMTIxXDFcdTAxNGFcMVwwXDFcdTAxNDdcMTJcdTAxMjFcMVwwIisKLSAgICAiXDUyXHUwMTIxXDFcMFwxXHUwMTkzXDFcdTAxMjJcMVx1MDE0YlwzXHUwMTIyXDFcdTAxOTNcMVx1MDEyMiIrCi0gICAgIlwxXHUwMTQ3XDI1XHUwMTIyXDFcdTAxOTNcMlx1MDEyMlwxXHUwMTkzXDJcdTAxMjJcMVx1MDE5M1wxMFx1MDEyMiIrCi0gICAgIlwxXHUwMTkzXDRcdTAxMjJcMVx1MDE5M1w3XHUwMTIyXDFcMFwyXHUwMTIyXDFcdTAxNGJcMVx1MDE0NyIrCi0gICAgIlwxXHUwMTIyXDFcdTAxNzVcMlx1MDEyMlwxXHUwMTQ3XDFcdTAxNzVcMVx1MDE5NFwzXHUwMTIyXDJcdTAxNDciKwotICAgICJcNTJcdTAxMjJcMVwwXDJcdTAxMjJcMVx1MDE0YlwxXDBcNFx1MDEyMlwxXHUwMTQ3XDZcdTAxMjIiKwotICAgICJcMVwwXDUyXHUwMTIyXDQyXDBcMlx1MDE5NVwzMFwwXDJcMTM1XDFcMTM2XDFcMTM1IisKLSAgICAiXDFcMFwzXDEzNVwxXDBcMVwxMzVcNFwwXDJcMTM1XDFcMFwzXDEzNSIrCi0gICAgIlwxXDBcMVwxMzVcMTBcMFwxMVwxMzVcMVwwXDRcMTM1XDFcMFwyXDEzNSIrCi0gICAgIlwxXDBcMVwxMzVcMVwwXDNcMTM1XDZcMFwyXDEzN1wxXDE0MFwxXDEzNyIrCi0gICAgIlwxXDBcM1wxMzdcMVwwXDFcMTM3XDRcMFwyXDEzN1wxXDBcM1wxMzciKwotICAgICJcMVwwXDFcMTM3XDEwXDBcMTFcMTM3XDFcMFw0XDEzN1wxXDBcMlwxMzciKwotICAgICJcMVwwXDFcMTM3XDFcMFwzXDEzN1w0NFwwXDJcdTAxOTZcMzNcMFwxXHUwMTk3IisKLSAgICAiXDFcMzM2XDFcMzM3XDFcMzM2XDFcMFwxXDMzNlwxXHUwMTk3XDFcMzM2XDFcMCIrCi0gICAgIlwxXDMzNlwxXHUwMTAyXDNcMFwyXDMzNlwxXDBcM1wzMzZcMVwwXDFcMzM2IisKLSAgICAiXDEwXDBcMVx1MDE5N1wyXDMzNlwxXHUwMTk3XDJcMzM2XDFcdTAxOTdcMlwzMzZcMVwwIisKLSAgICAiXDRcMzM2XDFcMFwxXHUwMTk3XDFcMzM2XDFcMFwxXDMzNlwxXDBcMVx1MDE5NyIrCi0gICAgIlwyXDMzNlw2XDBcMlwxNTBcMVwxNTFcMVwxNTBcMVwwXDNcMTUwXDFcMCIrCi0gICAgIlwxXDE1MFw0XDBcMlwxNTBcMVwwXDNcMTUwXDFcMjUzXDFcMTUwXDEwXDAiKwotICAgICJcMTFcMTUwXDFcMFw0XDE1MFwxXDBcMlwxNTBcMVwwXDFcMTUwXDFcMCIrCi0gICAgIlwzXDE1MFw2XDBcMlwxNTNcMVwxNTRcMVwxNTNcMVwxNTVcNjVcMTUzXDFcMCIrCi0gICAgIlwyXDE1NlwxXDE1N1w1XDE1NlwxXDE1NVw2MVwxNTZcMVwwXDJcMTYwXDFcMTYxIisKLSAgICAiXDFcMTYwXDFcMTYyXDY1XDE2MFwxXDBcMlwxNjNcMVwxNjRcNVwxNjNcMVwxNjIiKwotICAgICJcNjFcMTYzXDFcMFwxXHUwMTk4XDFcdTAxMDlcMVx1MDEwYVwxXHUwMTA5XDFcMFwxXHUwMTA5IisKLSAgICAiXDFcdTAxOThcMVx1MDEwOVwxXDBcMVx1MDEwOVwxXHUwMTBkXDExXHUwMTA5XDFcMFwxMVx1MDEwOSIrCi0gICAgIlwxXHUwMTk4XDJcdTAxMDlcMVx1MDE5OFwyXHUwMTA5XDFcdTAxOThcMTBcdTAxMDlcMVx1MDE5OFw0XHUwMTA5IisKLSAgICAiXDFcdTAxOThcN1x1MDEwOVwxXDBcMVx1MDE5OVwxXHUwMTBiXDFcdTAxMzVcMVx1MDEwYlwxXHUwMTMyIisKLSAgICAiXDFcdTAxMGJcMVx1MDE5OVwyN1x1MDEwYlwxXHUwMTk5XDJcdTAxMGJcMVx1MDE5OVwyXHUwMTBiXDFcdTAxOTkiKwotICAgICJcMTBcdTAxMGJcMVx1MDE5OVw0XHUwMTBiXDFcdTAxOTlcN1x1MDEwYlwxXDBcMVx1MDE5YVwxXHUwMTBjIisKLSAgICAiXDFcdTAxMzZcM1x1MDEwY1wxXHUwMTlhXDFcdTAxMGNcMVx1MDEzMlwyNVx1MDEwY1wxXHUwMTlhXDJcdTAxMGMiKwotICAgICJcMVx1MDE5YVwyXHUwMTBjXDFcdTAxOWFcMTBcdTAxMGNcMVx1MDE5YVw0XHUwMTBjXDFcdTAxOWFcN1x1MDEwYyIrCi0gICAgIlwxXDBcMlwyMDJcMVwyMDNcMVwyMDJcMVwyMDRcNjVcMjAyXDFcMFwyXDIwNSIrCi0gICAgIlwxXDIwNlw1XDIwNVwxXDIwNFw2MVwyMDVcMVwwXDJcMjEyXDFcMjEzXDFcMjEyIisKLSAgICAiXDFcMFwzXDIxMlwxXDBcMVwyMTJcNFwwXDJcMjEyXDFcMFwzXDIxMiIrCi0gICAgIlwxXDBcMVwyMTJcMTBcMFwxMVwyMTJcMVwwXDRcMjEyXDFcMFwyXDIxMiIrCi0gICAgIlwxXDBcMVwyMTJcMVwwXDNcMjEyXDZcMFwxXHUwMTliXDFcMzA3XDFcMzEwIisKLSAgICAiXDFcMzA3XDFcMFwxXDMwN1wxXHUwMTliXDFcMzA3XDFcMFwxXDMwN1wxXDAiKwotICAgICJcMVwyMjBcMlwwXDJcMzA3XDFcMFwzXDMwN1wxXDBcMVwzMDdcMTBcMCIrCi0gICAgIlwxXHUwMTliXDJcMzA3XDFcdTAxOWJcMlwzMDdcMVx1MDE5YlwyXDMwN1wxXDBcNFwzMDciKwotICAgICJcMVwwXDFcdTAxOWJcMVwzMDdcMVwwXDFcMzA3XDFcMFwxXHUwMTliXDJcMzA3IisKLSAgICAiXDZcMFwyXDIyM1wxXDIyNFwxXDIyM1wxXDIyNVw2NVwyMjNcMVwwXDJcMjI2IisKLSAgICAiXDFcMjI3XDVcMjI2XDFcMjI1XDYxXDIyNlwxXDBcMlwyMzFcMVwyMzJcMVwyMzEiKwotICAgICJcMVwwXDNcMjMxXDFcMFwxXDIzMVw0XDBcMlwyMzFcMVwwXDNcMjMxIisKLSAgICAiXDFcMFwxXDIzMVwxMFwwXDExXDIzMVwxXDBcNFwyMzFcMVwwXDJcMjMxIisKLSAgICAiXDFcMFwxXDIzMVwxXDBcM1wyMzFcMTVcMFwxXDM2Nlw2M1wwXDFcdTAxOWMiKwotICAgICJcNVwwXDFcdTAxOWNcMTZcMFwyXHUwMTljXDdcMFwyXHUwMTljXDFcMFwyXHUwMTljIisKLSAgICAiXDFcMFwyXHUwMTljXDdcMFwyXHUwMTljXDNcMFwyXHUwMTljXDdcMFwxXHUwMTlkIisKLSAgICAiXDFcdTAxMWVcMVx1MDExZlwxXHUwMTFlXDFcMFwxXHUwMTFlXDFcdTAxOWRcMVx1MDExZVwxXDAiKwotICAgICJcMVx1MDExZVwxXHUwMTIzXDExXHUwMTFlXDFcMFwxMVx1MDExZVwxXHUwMTlkXDJcdTAxMWVcMVx1MDE5ZCIrCi0gICAgIlwyXHUwMTFlXDFcdTAxOWRcMTBcdTAxMWVcMVx1MDE5ZFw0XHUwMTFlXDFcdTAxOWRcN1x1MDExZVwxXDAiKwotICAgICJcMVx1MDE5ZVwxXHUwMTIxXDFcdTAxNGFcMVx1MDEyMVwxXHUwMTQ3XDFcdTAxMjFcMVx1MDE5ZVwyN1x1MDEyMSIrCi0gICAgIlwxXHUwMTllXDJcdTAxMjFcMVx1MDE5ZVwyXHUwMTIxXDFcdTAxOWVcMTBcdTAxMjFcMVx1MDE5ZVw0XHUwMTIxIisKLSAgICAiXDFcdTAxOWVcN1x1MDEyMVwxXDBcMVx1MDE5ZlwxXHUwMTIyXDFcdTAxNGJcM1x1MDEyMlwxXHUwMTlmIisKLSAgICAiXDFcdTAxMjJcMVx1MDE0N1wyNVx1MDEyMlwxXHUwMTlmXDJcdTAxMjJcMVx1MDE5ZlwyXHUwMTIyXDFcdTAxOWYiKwotICAgICJcMTBcdTAxMjJcMVx1MDE5Zlw0XHUwMTIyXDFcdTAxOWZcN1x1MDEyMlw2NVwwXDFcdTAxYTBcNTJcMCIrCi0gICAgIlwyXHUwMWExXDI1XDBcMVx1MDFhMlwxXDMzNlwxXDMzN1wxXDMzNlwxXDBcMVwzMzYiKwotICAgICJcMVx1MDFhMlwxXDMzNlwxXDBcMVwzMzZcMVx1MDEwMlwzXDBcMlwzMzZcMVwwIisKLSAgICAiXDNcMzM2XDFcMFwxXDMzNlwxMFwwXDFcdTAxYTJcMlwzMzZcMVx1MDFhMlwyXDMzNiIrCi0gICAgIlwxXHUwMWEyXDJcMzM2XDFcMFw0XDMzNlwxXDBcMVx1MDFhMlwxXDMzNlwxXDAiKwotICAgICJcMVwzMzZcMVwwXDFcdTAxYTJcMlwzMzZcNlwwXDFcdTAxYTNcMVx1MDEwOVwxXHUwMTBhIisKLSAgICAiXDFcdTAxMDlcMVwwXDFcdTAxMDlcMVx1MDFhM1wxXHUwMTA5XDFcMFwxXHUwMTA5XDFcdTAxMGQiKwotICAgICJcMTFcdTAxMDlcMVwwXDExXHUwMTA5XDFcdTAxYTNcMlx1MDEwOVwxXHUwMWEzXDJcdTAxMDlcMVx1MDFhMyIrCi0gICAgIlwxMFx1MDEwOVwxXHUwMWEzXDRcdTAxMDlcMVx1MDFhM1w3XHUwMTA5XDFcMFwxXHUwMWE0XDFcdTAxMGIiKwotICAgICJcMVx1MDEzNVwxXHUwMTBiXDFcdTAxMzJcMVx1MDEwYlwxXHUwMWE0XDI3XHUwMTBiXDFcdTAxYTRcMlx1MDEwYiIrCi0gICAgIlwxXHUwMWE0XDJcdTAxMGJcMVx1MDFhNFwxMFx1MDEwYlwxXHUwMWE0XDRcdTAxMGJcMVx1MDFhNFw3XHUwMTBiIisKLSAgICAiXDFcMFwxXHUwMWE1XDFcdTAxMGNcMVx1MDEzNlwzXHUwMTBjXDFcdTAxYTVcMVx1MDEwY1wxXHUwMTMyIisKLSAgICAiXDI1XHUwMTBjXDFcdTAxYTVcMlx1MDEwY1wxXHUwMWE1XDJcdTAxMGNcMVx1MDFhNVwxMFx1MDEwY1wxXHUwMWE1IisKLSAgICAiXDRcdTAxMGNcMVx1MDFhNVw3XHUwMTBjXDFcMFwyXDMwN1wxXDMxMFwxXDMwN1wxXDAiKwotICAgICJcM1wzMDdcMVwwXDFcMzA3XDFcMFwxXDIyMFwyXDBcMlwzMDdcMVwwIisKLSAgICAiXDNcMzA3XDFcMFwxXDMwN1wxMFwwXDExXDMwN1wxXDBcNFwzMDdcMVwwIisKLSAgICAiXDJcMzA3XDFcMFwxXDMwN1wxXDBcM1wzMDdcNlwwXDFcdTAxYTZcNVwwIisKLSAgICAiXDFcdTAxYTZcMTZcMFwyXHUwMWE2XDdcMFwyXHUwMWE2XDFcMFwyXHUwMWE2XDFcMCIrCi0gICAgIlwyXHUwMWE2XDdcMFwyXHUwMWE2XDNcMFwyXHUwMWE2XDdcMFwxXHUwMWE3XDFcdTAxMWUiKwotICAgICJcMVx1MDExZlwxXHUwMTFlXDFcMFwxXHUwMTFlXDFcdTAxYTdcMVx1MDExZVwxXDBcMVx1MDExZSIrCi0gICAgIlwxXHUwMTIzXDExXHUwMTFlXDFcMFwxMVx1MDExZVwxXHUwMWE3XDJcdTAxMWVcMVx1MDFhN1wyXHUwMTFlIisKLSAgICAiXDFcdTAxYTdcMTBcdTAxMWVcMVx1MDFhN1w0XHUwMTFlXDFcdTAxYTdcN1x1MDExZVwxXDBcMVx1MDFhOCIrCi0gICAgIlwxXHUwMTIxXDFcdTAxNGFcMVx1MDEyMVwxXHUwMTQ3XDFcdTAxMjFcMVx1MDFhOFwyN1x1MDEyMVwxXHUwMWE4IisKLSAgICAiXDJcdTAxMjFcMVx1MDFhOFwyXHUwMTIxXDFcdTAxYThcMTBcdTAxMjFcMVx1MDFhOFw0XHUwMTIxXDFcdTAxYTgiKwotICAgICJcN1x1MDEyMVwxXDBcMVx1MDFhOVwxXHUwMTIyXDFcdTAxNGJcM1x1MDEyMlwxXHUwMWE5XDFcdTAxMjIiKwotICAgICJcMVx1MDE0N1wyNVx1MDEyMlwxXHUwMWE5XDJcdTAxMjJcMVx1MDFhOVwyXHUwMTIyXDFcdTAxYTlcMTBcdTAxMjIiKwotICAgICJcMVx1MDFhOVw0XHUwMTIyXDFcdTAxYTlcN1x1MDEyMlw0N1wwXDFcdTAxYWFcMjRcMFwyXDMzNiIrCi0gICAgIlwxXDMzN1wxXDMzNlwxXDBcM1wzMzZcMVwwXDFcMzM2XDFcdTAxMDJcM1wwIisKLSAgICAiXDJcMzM2XDFcMFwzXDMzNlwxXDBcMVwzMzZcMTBcMFwxMVwzMzZcMVwwIisKLSAgICAiXDRcMzM2XDFcMFwyXDMzNlwxXDBcMVwzMzZcMVwwXDNcMzM2XDZcMCIrCi0gICAgIlwxXHUwMWFiXDFcdTAxMDlcMVx1MDEwYVwxXHUwMTA5XDFcMFwxXHUwMTA5XDFcdTAxYWJcMVx1MDEwOSIrCi0gICAgIlwxXDBcMVx1MDEwOVwxXHUwMTBkXDExXHUwMTA5XDFcMFwxMVx1MDEwOVwxXHUwMWFiXDJcdTAxMDkiKwotICAgICJcMVx1MDFhYlwyXHUwMTA5XDFcdTAxYWJcMTBcdTAxMDlcMVx1MDFhYlw0XHUwMTA5XDFcdTAxYWJcN1x1MDEwOSIrCi0gICAgIlwxXDBcMVx1MDFhY1wxXHUwMTBiXDFcdTAxMzVcMVx1MDEwYlwxXHUwMTMyXDFcdTAxMGJcMVx1MDFhYyIrCi0gICAgIlwyN1x1MDEwYlwxXHUwMWFjXDJcdTAxMGJcMVx1MDFhY1wyXHUwMTBiXDFcdTAxYWNcMTBcdTAxMGJcMVx1MDFhYyIrCi0gICAgIlw0XHUwMTBiXDFcdTAxYWNcN1x1MDEwYlwxXDBcMVx1MDFhZFwxXHUwMTBjXDFcdTAxMzZcM1x1MDEwYyIrCi0gICAgIlwxXHUwMWFkXDFcdTAxMGNcMVx1MDEzMlwyNVx1MDEwY1wxXHUwMWFkXDJcdTAxMGNcMVx1MDFhZFwyXHUwMTBjIisKLSAgICAiXDFcdTAxYWRcMTBcdTAxMGNcMVx1MDFhZFw0XHUwMTBjXDFcdTAxYWRcN1x1MDEwY1wxXDBcMVx1MDFhZSIrCi0gICAgIlwxXHUwMTFlXDFcdTAxMWZcMVx1MDExZVwxXDBcMVx1MDExZVwxXHUwMWFlXDFcdTAxMWVcMVwwIisKLSAgICAiXDFcdTAxMWVcMVx1MDEyM1wxMVx1MDExZVwxXDBcMTFcdTAxMWVcMVx1MDFhZVwyXHUwMTFlXDFcdTAxYWUiKwotICAgICJcMlx1MDExZVwxXHUwMWFlXDEwXHUwMTFlXDFcdTAxYWVcNFx1MDExZVwxXHUwMWFlXDdcdTAxMWVcMVwwIisKLSAgICAiXDFcdTAxYWZcMVx1MDEyMVwxXHUwMTRhXDFcdTAxMjFcMVx1MDE0N1wxXHUwMTIxXDFcdTAxYWZcMjdcdTAxMjEiKwotICAgICJcMVx1MDFhZlwyXHUwMTIxXDFcdTAxYWZcMlx1MDEyMVwxXHUwMWFmXDEwXHUwMTIxXDFcdTAxYWZcNFx1MDEyMSIrCi0gICAgIlwxXHUwMWFmXDdcdTAxMjFcMVwwXDFcdTAxYjBcMVx1MDEyMlwxXHUwMTRiXDNcdTAxMjJcMVx1MDFiMCIrCi0gICAgIlwxXHUwMTIyXDFcdTAxNDdcMjVcdTAxMjJcMVx1MDFiMFwyXHUwMTIyXDFcdTAxYjBcMlx1MDEyMlwxXHUwMWIwIisKLSAgICAiXDEwXHUwMTIyXDFcdTAxYjBcNFx1MDEyMlwxXHUwMWIwXDdcdTAxMjJcMVwwXDJcdTAxMDlcMVx1MDEwYSIrCi0gICAgIlwxXHUwMTA5XDFcMFwzXHUwMTA5XDFcMFwxXHUwMTA5XDFcdTAxMGRcMTFcdTAxMDlcMVwwIisKLSAgICAiXDQ1XHUwMTA5XDFcMFwxXHUwMWIxXDFcdTAxMGJcMVx1MDEzNVwxXHUwMTBiXDFcdTAxMzJcMVx1MDEwYiIrCi0gICAgIlwxXHUwMWIxXDI3XHUwMTBiXDFcdTAxYjFcMlx1MDEwYlwxXHUwMWIxXDJcdTAxMGJcMVx1MDFiMVwxMFx1MDEwYiIrCi0gICAgIlwxXHUwMWIxXDRcdTAxMGJcMVx1MDFiMVw3XHUwMTBiXDFcMFwxXHUwMWIyXDFcdTAxMGNcMVx1MDEzNiIrCi0gICAgIlwzXHUwMTBjXDFcdTAxYjJcMVx1MDEwY1wxXHUwMTMyXDI1XHUwMTBjXDFcdTAxYjJcMlx1MDEwY1wxXHUwMWIyIisKLSAgICAiXDJcdTAxMGNcMVx1MDFiMlwxMFx1MDEwY1wxXHUwMWIyXDRcdTAxMGNcMVx1MDFiMlw3XHUwMTBjXDFcMCIrCi0gICAgIlwyXHUwMTFlXDFcdTAxMWZcMVx1MDExZVwxXDBcM1x1MDExZVwxXDBcMVx1MDExZVwxXHUwMTIzIisKLSAgICAiXDExXHUwMTFlXDFcMFw0NVx1MDExZVwxXDBcMVx1MDFiM1wxXHUwMTIxXDFcdTAxNGFcMVx1MDEyMSIrCi0gICAgIlwxXHUwMTQ3XDFcdTAxMjFcMVx1MDFiM1wyN1x1MDEyMVwxXHUwMWIzXDJcdTAxMjFcMVx1MDFiM1wyXHUwMTIxIisKLSAgICAiXDFcdTAxYjNcMTBcdTAxMjFcMVx1MDFiM1w0XHUwMTIxXDFcdTAxYjNcN1x1MDEyMVwxXDBcMVx1MDFiNCIrCi0gICAgIlwxXHUwMTIyXDFcdTAxNGJcM1x1MDEyMlwxXHUwMWI0XDFcdTAxMjJcMVx1MDE0N1wyNVx1MDEyMlwxXHUwMWI0IisKLSAgICAiXDJcdTAxMjJcMVx1MDFiNFwyXHUwMTIyXDFcdTAxYjRcMTBcdTAxMjJcMVx1MDFiNFw0XHUwMTIyXDFcdTAxYjQiKwotICAgICJcN1x1MDEyMlwxXDBcMlx1MDEwYlwxXHUwMTM1XDFcdTAxMGJcMVx1MDEzMlw2NVx1MDEwYlwxXDAiKwotICAgICJcMlx1MDEwY1wxXHUwMTM2XDVcdTAxMGNcMVx1MDEzMlw2MVx1MDEwY1wxXDBcMlx1MDEyMVwxXHUwMTRhIisKLSAgICAiXDFcdTAxMjFcMVx1MDE0N1w2NVx1MDEyMVwxXDBcMlx1MDEyMlwxXHUwMTRiXDVcdTAxMjJcMVx1MDE0NyIrCi0gICAgIlw2MVx1MDEyMiI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrVHJhbnMoKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbMjEzNThdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrVHJhbnMoWlpfVFJBTlNfUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrVHJhbnMoU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICB2YWx1ZS0tOwotICAgICAgZG8gcmVzdWx0W2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9VTktOT1dOX0VSUk9SID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX05PX01BVENIID0gMTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1BVU0hCQUNLXzJCSUcgPSAyOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotICAvKioKLSAgICogWlpfQVRUUklCVVRFW2FTdGF0ZV0gY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgb2Ygc3RhdGUgPGNvZGU+YVN0YXRlPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX0FUVFJJQlVURSA9IHp6VW5wYWNrQXR0cmlidXRlKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0FUVFJJQlVURV9QQUNLRURfMCA9Ci0gICAgIlwyM1wwXDFcMTFcN1wxXDFcMTFcMVwxXDFcMTFcMlwxXDFcMTEiKwotICAgICJcM1wxXDFcMTFcNlwxXDFcMTFcM1wxXDJcMTFcM1wxXDFcMTEiKwotICAgICJcMlwxXDJcMTFcM1wxXDFcMTFcMVwxXDFcMTFcMTFcMVwyXDExIisKLSAgICAiXDZcMVwxXDExXDZcMVwxXDExXDFcMVwxXDBcMVwxXDFcMCIrCi0gICAgIlwxXDFcMVwwXDFcMVwxMFwwXDFcMVw0XDBcMVwxMVw0XDAiKwotICAgICJcMVwxMVw0XDBcMVwxXDFcMFwxXDFcMVwwXDFcMVwxXDAiKwotICAgICJcMVwxMVwxXDBcMVwxXDFcMFwxXDFcMlwwXDFcMTFcM1wwIisKLSAgICAiXDFcMVwxXDBcMVwxXDNcMFwxXDExXDFcMFwxXDFcMVwxMSIrCi0gICAgIlwxXDFcMlwwXDFcMTFcMlwwXDJcMVwyXDBcMVwxXDJcMCIrCi0gICAgIlwxXDExXDFcMVwxXDExXDJcMVwxMFwwXDFcMVwxXDBcMVwxIisKLSAgICAiXDJcMFwxXDFcMlwwXDFcMVwyXDBcMVwxXDJcMFw1XDEiKwotICAgICJcMVwwXDFcMVwyXDBcMVwxXDFcMFwzXDFcMVwwXDFcMSIrCi0gICAgIlwxXDBcMVwxXDJcMFwxXDFcMVwwXDNcMVwxXDBcM1wxIisKLSAgICAiXDJcMTFcMTBcMFwxXDFcNVwwXDVcMVwyXDBcNFwxXDJcMCIrCi0gICAgIlwyXDFcMVwwXDFcMVwxXDBcM1wxXDNcMFwxXDExXDJcMCIrCi0gICAgIlwxXDExXDFcMFwxXDFcMTBcMFwxXDExXDVcMVwyXDBcNFwxIisKLSAgICAiXDJcMFwzXDFcNVwwXDFcMTFcMVwwXDNcMVwyXDBcMVwxMSIrCi0gICAgIlwyXDBcMVwxXDZcMFwxXDFcMlwwXDVcMVwyXDBcNFwxIisKLSAgICAiXDJcMFwzXDFcMlwwXDFcMVwzXDBcM1wxXDFcMFwxXDExIisKLSAgICAiXDJcMFwxXDFcMTNcMFw1XDFcMlwwXDRcMVwyXDBcM1wxIisKLSAgICAiXDEwXDBcMlwxXDFcMTFcMlwwXDFcMVw2XDBcMVwxXDFcMCIrCi0gICAgIlwxXDFcMlwwXDJcMVwyXDBcM1wxXDJcMFwxXDFcMVwwIisKLSAgICAiXDFcMVw2XDBcMlwxXDRcMFwxXDExXDRcMFwxXDExXDNcMCIrCi0gICAgIlwxXDExXDEyXDAiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja0F0dHJpYnV0ZSgpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs0MzZdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQXR0cmlidXRlKFpaX0FUVFJJQlVURV9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBdHRyaWJ1dGUoU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgenpSZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB6ekJ1ZmZlcltdID0gbmV3IGNoYXJbWlpfQlVGRkVSU0laRV07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TWFya2VkUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpDdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB6ekVuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICBwcml2YXRlIGludCB5eWNvbHVtbjsKLQotICAvKiogCi0gICAqIHp6QXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4genpBdEJPTCA9IHRydWU7Ci0KLSAgLyoqIHp6QXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgYXQgdGhlIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4genpBdEVPRjsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOREVGSU5FRCA9ICJ1bmRlZmluZWQiOwotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0OwotLy8JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkVGV4dExlbmd0aDsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGg7Ci0vLwlwcml2YXRlIFN0cmluZ0J1ZmZlciBmQnVmZmVyZWRUZXh0ID0gbnVsbDsKLQlwcml2YXRlIENTU1RleHRSZWdpb25GYWN0b3J5IGZSZWdpb25GYWN0b3J5ID0gQ1NTVGV4dFJlZ2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQlwcml2YXRlIGludCBmSW5pdGlhbFN0YXRlID0gWVlJTklUSUFMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFX05PUk1BTCA9IDE2Mzg0OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFX1NNQUxMID0gMjU2OwotCXByaXZhdGUgaW50IGZJbml0aWFsQnVmZmVyU2l6ZSA9IEJVRkZFUl9TSVpFX05PUk1BTDsKLQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxTdGF0ZShpbnQgc3RhdGUpIHsKLQkJZkluaXRpYWxTdGF0ZSA9IHN0YXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsQnVmZmVyU2l6ZShpbnQgc2l6ZSkgewotCQlmSW5pdGlhbEJ1ZmZlclNpemUgPSBzaXplOwotCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0gIAlwdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQ7Ci0JCVN0cmluZyBuZXh0VG9rZW5UeXBlOwotCQlib29sZWFuIHNwYWNlRm9sbG93czsKLS8vCQlTdHJpbmdCdWZmZXIgdGV4dDsKLQkJaW50IHN0YXJ0OwotCQlpbnQgdGV4dExlbmd0aDsKLQkJaW50IGxlbmd0aDsKLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgIT0gbnVsbCkgewotCQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0vLwkJCXRleHQgPSBmQnVmZmVyZWRUZXh0OwotCQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7Ci0KLQkJCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLS8vCQkJdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOwotCQkJc3RhcnQgPSB5eWNoYXI7Ci0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJfQotCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgewotCQkJCS8vIHVuZGVmIC0+IGNvbmNhdGVuYXRlIHVuZGVmJ3MKLQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlID09IFVOREVGSU5FRCkgewotLy8JCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCX0KLQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsKLS8vCQkJCWZCdWZmZXJlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsKLQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOwotCQkJfSBlbHNlIHsKLQkJCQluZXh0VG9rZW5UeXBlID0gbnVsbDsKLQkJCQlzcGFjZUZvbGxvd3MgPSBmYWxzZTsKLQkJCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc0RlY2xhcmF0aW9uVmFsdWVUeXBlKGNvbnRleHQpKSB7IC8vIGRlY2xhcmF0aW9uIHZhbHVlIGNhbiBjb250YWluIFZBTFVFX1MKLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpOwotCQkJCX0gZWxzZSBpZiAoY2FuQ29udGFpblNwYWNlKGNvbnRleHQpKSB7Ci0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19TKTsKLQkJCQl9Ci0JCQkJaWYgKG5leHRUb2tlblR5cGUgIT0gbnVsbCkgeyAvLyBuZXh0VG9rZW4gaXMgcmV0cmlldmVkCi0JCQkJCWlmIChzcGFjZUZvbGxvd3MgJiYgKGNvbnRleHQgIT0gQ1NTX0NPTU1FTlQpKSB7Ci0JCQkJCQkvLyBuZXh0IGlzIHNwYWNlIC0+IGFwcGVuZAotLy8JCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7Ci0JCQkJCQlsZW5ndGggKz0geXlsZW5ndGgoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIG5leHQgaXMgTk9UIHNwYWNlIC0+IHB1c2ggdGhpcyBmb3IgbmV4dCB0aW1lLCByZXR1cm4gaXRzZWxmCi0JCQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsKLS8vCQkJCQkJZkJ1ZmZlcmVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOwotCQkJCQkJZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7Ci0JCQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRleHQgPT0gVU5ERUZJTkVEKSB7Ci0JCQkJY29udGV4dCA9IENTU19VTktOT1dOOwotCQkJfQotCQkJcmV0dXJuIGZSZWdpb25GYWN0b3J5LmNyZWF0ZVJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0gIAl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCS8qIGZvciBzdGFuZGFsb25lIHVzZSAqLwotICAJcHVibGljIGZpbmFsIExpc3QgcGFyc2VUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgCQlMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAJCUNTU1RleHRUb2tlbiB0b2tlbjsKLQkJZm9yIChTdHJpbmcga2luZCA9IHByaW1HZXROZXh0VG9rZW4oKTsga2luZCAhPSBudWxsOyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpKSB7Ci0JCQl0b2tlbiA9IG5ldyBDU1NUZXh0VG9rZW4oKTsKLQkJCXRva2VuLmtpbmQgPSBraW5kOyAgCQkJCQotCQkJdG9rZW4uc3RhcnQgPSB5eWNoYXI7Ci0JCQl0b2tlbi5sZW5ndGggPSB5eWxlbmd0aCgpOwotCQkJdG9rZW4uaW1hZ2UgPSB5eXRleHQoKTsKLQkJCXRva2Vucy5hZGQodG9rZW4pOwotCQl9Ci0KLSAgCQlyZXR1cm4gdG9rZW5zOwotICAJfQotICAJCi0gIAkvKiB1c2VyIG1ldGhvZCAqLwotICAJcHJpdmF0ZSBib29sZWFuIGNhbkNvbnRhaW5TcGFjZShTdHJpbmcgdHlwZSkgewotICAJCWlmICh0eXBlID09IENTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotICAJCQlyZXR1cm4gZmFsc2U7Ci0gIAkJfSBlbHNlIHsKLSAgCQkJcmV0dXJuIHRydWU7Ci0gIAkJfQotICAJfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIHl5Y2hhcjsKLQl9Ci0JCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VPRigpIHsKLQkJcmV0dXJuIHp6QXRFT0Y7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCQkvKiogdGhlIGlucHV0IGRldmljZSAqLwotCQl6elJlYWRlciA9IGluOwotCi0JCS8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JCXp6U3RhdGUgPSAwOwotCi0JCS8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0JCXp6TGV4aWNhbFN0YXRlID0gZkluaXRpYWxTdGF0ZTsgLy9ZWUlOSVRJQUw7Ci0KLQkJLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLQkJCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotCQlpZiAoenpCdWZmZXIubGVuZ3RoICE9IGZJbml0aWFsQnVmZmVyU2l6ZSkgewotCQkJenpCdWZmZXIgPSBuZXcgY2hhcltmSW5pdGlhbEJ1ZmZlclNpemVdOwotCQl9Ci0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh6ekJ1ZmZlciwgKGNoYXIpMCk7Ci0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JCXp6TWFya2VkUG9zID0gMDsKLQotCQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLS8vCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLQkJLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCQl6ekN1cnJlbnRQb3MgPSAwOwotCi0JCS8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQkJenpTdGFydFJlYWQgPSAwOwotCi0JCS8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLQkJCWZyb20gaW5wdXQgKi8KLQkJenpFbmRSZWFkID0gMDsKLQotCQkvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5bGluZSA9IDA7Ci0KLQkJLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQl5eWNoYXIgPSAwOwotCi0JCS8qKgotCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0JCSAqIG1hdGNoZWQgdGV4dAotCQkgKi8KLS8vCQl5eWNvbHVtbiA9IDA7IAotCi0JCS8qKiAKLQkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0JCSAqLwotLy8JCXl5X2F0Qk9MID0gZmFsc2U7Ci0JCQotCQkvKiogenpBdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JCXp6QXRFT0YgPSBmYWxzZTsKLQotCQkvKiB1c2VyIHZhcmlhYmxlcyAqLwotCQkvLwkJZlVuZGVmaW5lZC5kZWxldGUoMCwgZlVuZGVmaW5lZC5sZW5ndGgoKSk7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgQ1NTVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFkZGVkIHRvIHdvcmthcm91bmQgc3RyaWN0ZXIgY29tcGlsYXRpb24gb3B0aW9ucyB3aXRob3V0IGNyZWF0aW5nCi0JICogYW4gYWx0ZXJuYXRlIHNrZWxldG9uIGZpbGUKLQkgKi8KLQl2b2lkIF91c2VQcml2YXRlcygpIHsKLQkJU3lzdGVtLm91dC5wcmludCh5eWNvbHVtbik7Ci0JCVN5c3RlbS5vdXQucHJpbnQoeXlsaW5lKTsKLQkJU3lzdGVtLm91dC5wcmludChCb29sZWFuLnRvU3RyaW5nKHp6QXRCT0wpKTsKLQl9Ci0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgQ1NTVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy56elJlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgQ1NTVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10genpVbnBhY2tDTWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE3MCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLSAgICogCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6UmVmaWxsKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoenpTdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6RW5kUmVhZC16elN0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB6ekVuZFJlYWQtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6Q3VycmVudFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpNYXJrZWRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6U3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHp6Q3VycmVudFBvcyA+PSB6ekJ1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3p6Q3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgenpCdWZmZXIubGVuZ3RoKTsKLSAgICAgIHp6QnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0genpSZWFkZXIucmVhZCh6ekJ1ZmZlciwgenpFbmRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlci5sZW5ndGgtenpFbmRSZWFkKTsKLQotICAgIGlmIChudW1SZWFkID4gMCkgewotICAgICAgenpFbmRSZWFkKz0gbnVtUmVhZDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy8gdW5saWtlbHkgYnV0IG5vdCBpbXBvc3NpYmxlOiByZWFkIDAgY2hhcmFjdGVycywgYnV0IG5vdCBhdCBlbmQgb2Ygc3RyZWFtICAgIAotICAgIGlmIChudW1SZWFkID09IDApIHsKLSAgICAgIGludCBjID0genpSZWFkZXIucmVhZCgpOwotICAgICAgaWYgKGMgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB6ekJ1ZmZlclt6ekVuZFJlYWQrK10gPSAoY2hhcikgYzsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSAgICAgCi0gICAgfQotCi0JLy8gbnVtUmVhZCA8IDAKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gICAgCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgenpBdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0KLSAgICBpZiAoenpSZWFkZXIgIT0gbnVsbCkKLSAgICAgIHp6UmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXNldHMgdGhlIHNjYW5uZXIgdG8gcmVhZCBmcm9tIGEgbmV3IGlucHV0IHN0cmVhbS4KLSAgICogRG9lcyBub3QgY2xvc2UgdGhlIG9sZCByZWFkZXIuCi0gICAqCi0gICAqIEFsbCBpbnRlcm5hbCB2YXJpYWJsZXMgYXJlIHJlc2V0LCB0aGUgb2xkIGlucHV0IHN0cmVhbSAKLSAgICogPGI+Y2Fubm90PC9iPiBiZSByZXVzZWQgKGludGVybmFsIGJ1ZmZlciBpcyBkaXNjYXJkZWQgYW5kIGxvc3QpLgotICAgKiBMZXhpY2FsIHN0YXRlIGlzIHNldCB0byA8dHQ+WlpfSU5JVElBTDwvdHQ+LgotICAgKgotICAgKiBAcGFyYW0gcmVhZGVyICAgdGhlIG5ldyBpbnB1dCBzdHJlYW0gCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB5eXJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlcikgewotICAgIHp6UmVhZGVyID0gcmVhZGVyOwotICAgIHp6QXRCT0wgID0gdHJ1ZTsKLSAgICB6ekF0RU9GICA9IGZhbHNlOwotICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkID0gMDsKLSAgICB6ekN1cnJlbnRQb3MgPSB6ek1hcmtlZFBvcyA9IDA7Ci0gICAgeXlsaW5lID0geXljaGFyID0geXljb2x1bW4gPSAwOwotICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB6ekxleGljYWxTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBwdWJsaWMgZmluYWwgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggenpCdWZmZXIsIHp6U3RhcnRSZWFkLCB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZCApOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIDx0dD5wb3M8L3R0PiBmcm9tIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0LiAKLSAgICogCi0gICAqIEl0IGlzIGVxdWl2YWxlbnQgdG8geXl0ZXh0KCkuY2hhckF0KHBvcyksIGJ1dCBmYXN0ZXIKLSAgICoKLSAgICogQHBhcmFtIHBvcyB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciB0byBmZXRjaC4gCi0gICAqICAgICAgICAgICAgQSB2YWx1ZSBmcm9tIDAgdG8geXlsZW5ndGgoKS0xLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gcG9zCi0gICAqLwotICBwdWJsaWMgZmluYWwgY2hhciB5eWNoYXJhdChpbnQgcG9zKSB7Ci0gICAgcmV0dXJuIHp6QnVmZmVyW3p6U3RhcnRSZWFkK3Bvc107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBJbiBhIHdlbGxmb3JtZWQgc2Nhbm5lciAobm8gb3Igb25seSBjb3JyZWN0IHVzYWdlIG9mIAotICAgKiB5eXB1c2hiYWNrKGludCkgYW5kIGEgbWF0Y2gtYWxsIGZhbGxiYWNrIHJ1bGUpIHRoaXMgbWV0aG9kIAotICAgKiB3aWxsIG9ubHkgYmUgY2FsbGVkIHdpdGggdGhpbmdzIHRoYXQgIkNhbid0IFBvc3NpYmx5IEhhcHBlbiIuCi0gICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZwotICAgKiAoZS5nLiBhIEpGbGV4IGJ1ZyBwcm9kdWNpbmcgYSBmYXVsdHkgc2Nhbm5lciBldGMuKS4KLSAgICoKLSAgICogVXN1YWwgc3ludGF4L3NjYW5uZXIgbGV2ZWwgZXJyb3IgaGFuZGxpbmcgc2hvdWxkIGJlIGRvbmUKLSAgICogaW4gZXJyb3IgZmFsbGJhY2sgcnVsZXMuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgenpTY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIFN0cmluZyBtZXNzYWdlOwotICAgIHRyeSB7Ci0gICAgICBtZXNzYWdlID0gWlpfRVJST1JfTVNHW2Vycm9yQ29kZV07Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1taWl9VTktOT1dOX0VSUk9SXTsKLSAgICB9Ci0KLSAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHVibGljIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSAgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB6elNjYW5FcnJvcihaWl9QVVNIQkFDS18yQklHKTsKLQotICAgIHp6TWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB6eklucHV0OwotICAgIGludCB6ekFjdGlvbjsKLQotICAgIC8vIGNhY2hlZCBmaWVsZHM6Ci0gICAgaW50IHp6Q3VycmVudFBvc0w7Ci0gICAgaW50IHp6TWFya2VkUG9zTDsKLSAgICBpbnQgenpFbmRSZWFkTCA9IHp6RW5kUmVhZDsKLSAgICBjaGFyIFtdIHp6QnVmZmVyTCA9IHp6QnVmZmVyOwotICAgIGNoYXIgW10genpDTWFwTCA9IFpaX0NNQVA7Ci0KLSAgICBpbnQgW10genpUcmFuc0wgPSBaWl9UUkFOUzsKLSAgICBpbnQgW10genpSb3dNYXBMID0gWlpfUk9XTUFQOwotICAgIGludCBbXSB6ekF0dHJMID0gWlpfQVRUUklCVVRFOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHp6TWFya2VkUG9zTCA9IHp6TWFya2VkUG9zOwotCi0gICAgICB5eWNoYXIrPSB6ek1hcmtlZFBvc0wtenpTdGFydFJlYWQ7Ci0KLSAgICAgIHp6QWN0aW9uID0gLTE7Ci0KLSAgICAgIHp6Q3VycmVudFBvc0wgPSB6ekN1cnJlbnRQb3MgPSB6elN0YXJ0UmVhZCA9IHp6TWFya2VkUG9zTDsKLSAgCi0gICAgICB6elN0YXRlID0gWlpfTEVYU1RBVEVbenpMZXhpY2FsU3RhdGVdOwotCi0KLSAgICAgIHp6Rm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgaWYgKHp6Q3VycmVudFBvc0wgPCB6ekVuZFJlYWRMKQotICAgICAgICAgICAgenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotICAgICAgICAgIGVsc2UgaWYgKHp6QXRFT0YpIHsKLSAgICAgICAgICAgIHp6SW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9ucwotICAgICAgICAgICAgenpDdXJyZW50UG9zICA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvcyAgID0genpNYXJrZWRQb3NMOwotICAgICAgICAgICAgYm9vbGVhbiBlb2YgPSB6elJlZmlsbCgpOwotICAgICAgICAgICAgLy8gZ2V0IHRyYW5zbGF0ZWQgcG9zaXRpb25zIGFuZCBwb3NzaWJseSBuZXcgYnVmZmVyCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3NMICA9IHp6Q3VycmVudFBvczsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCAgID0genpNYXJrZWRQb3M7Ci0gICAgICAgICAgICB6ekJ1ZmZlckwgICAgICA9IHp6QnVmZmVyOwotICAgICAgICAgICAgenpFbmRSZWFkTCAgICAgPSB6ekVuZFJlYWQ7Ci0gICAgICAgICAgICBpZiAoZW9mKSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpbnQgenpOZXh0ID0genpUcmFuc0xbIHp6Um93TWFwTFt6elN0YXRlXSArIHp6Q01hcExbenpJbnB1dF0gXTsKLSAgICAgICAgICBpZiAoenpOZXh0ID09IC0xKSBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB6elN0YXRlID0genpOZXh0OwotCi0gICAgICAgICAgaW50IHp6QXR0cmlidXRlcyA9IHp6QXR0ckxbenpTdGF0ZV07Ci0gICAgICAgICAgaWYgKCAoenpBdHRyaWJ1dGVzICYgMSkgPT0gMSApIHsKLSAgICAgICAgICAgIHp6QWN0aW9uID0genpTdGF0ZTsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICBpZiAoICh6ekF0dHJpYnV0ZXMgJiA4KSA9PSA4ICkgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb24KLSAgICAgIHp6TWFya2VkUG9zID0genpNYXJrZWRQb3NMOwotCi0gICAgICBzd2l0Y2ggKHp6QWN0aW9uIDwgMCA/IHp6QWN0aW9uIDogWlpfQUNUSU9OW3p6QWN0aW9uXSkgewotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfU1RSSU5HOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA1MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA1MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzk6IAotICAgICAgICAgIC8vIGxvb2thaGVhZCBleHByZXNzaW9uIHdpdGggZml4ZWQgbG9va2FoZWFkIGxlbmd0aAotICAgICAgICAgIHl5cHVzaGJhY2soMSk7Ci0gICAgICAgICAgeyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1M7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDU0OiBicmVhazsKLSAgICAgICAgY2FzZSAzNjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNTU6IGJyZWFrOwotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDU2OiBicmVhazsKLSAgICAgICAgY2FzZSAxOiAKLSAgICAgICAgICB7IHJldHVybiBVTkRFRklORUQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDU3OiBicmVhazsKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSU1QT1JUX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA1ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA1OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ0xBU1M7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDYwOiBicmVhazsKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfTEJSQUNFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfUkJSQUNFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9NRURJQV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX01FRElVTTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjM6IGJyZWFrOwotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjU6IGJyZWFrOwotICAgICAgICBjYXNlIDUwOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfRk9OVF9GQUNFX0RFTElNSVRFUik7IHJldHVybiBDU1NfRk9OVF9GQUNFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDk6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9DSEFSU0VUX05BTUUpOyByZXR1cm4gQ1NTX0NIQVJTRVQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY3OiBicmVhazsKLSAgICAgICAgY2FzZSA0NTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX1VSSTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjg6IGJyZWFrOwotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY5OiBicmVhazsKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgICAgeyByZXR1cm4gQ1NTX0NEQzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzA6IGJyZWFrOwotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0xCUkFDRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzE6IGJyZWFrOwotICAgICAgICBjYXNlIDU6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfVU5JVkVSU0FMOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDczOiBicmVhazsKLSAgICAgICAgY2FzZSA0MjogCi0gICAgICAgICAgeyByZXR1cm4gQ1NTX0NETzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDg6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzU6IGJyZWFrOwotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzY6IGJyZWFrOwotICAgICAgICBjYXNlIDM4OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0g7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDc3OiBicmVhazsKLSAgICAgICAgY2FzZSA0NDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1BBR0VfUFNFVURPX1BBR0UpOyByZXR1cm4gQ1NTX1BBR0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDc4OiBicmVhazsKLSAgICAgICAgY2FzZSAyOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzk6IGJyZWFrOwotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfQ0hBUlNFVF9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX1NUUklORzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODA6IGJyZWFrOwotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODE6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDgyOiBicmVhazsKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgICAgLy8gbG9va2FoZWFkIGV4cHJlc3Npb24gd2l0aCBmaXhlZCBsb29rYWhlYWQgbGVuZ3RoCi0gICAgICAgICAgeXlwdXNoYmFjaygxKTsKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDgzOiBicmVhazsKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9VTklDT0RFX1JBTkdFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzU6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODU6IGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfTUVESUFfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQV9TRVBBUkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDg2OiBicmVhazsKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODc6IGJyZWFrOwotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfUEFHRV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX1BBR0VfU0VMRUNUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDg4OiBicmVhazsKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODk6IGJyZWFrOwotICAgICAgICBjYXNlIDQzOiAKLSAgICAgICAgICB7IHJldHVybiBDU1NfQ09NTUVOVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTA6IGJyZWFrOwotICAgICAgICBjYXNlIDUxOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTE6IGJyZWFrOwotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORCk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfU0VQQVJBVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogCi0gICAgICAgICAgeyByZXR1cm4gQ1NTX1M7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDk0OiBicmVhazsKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9JRDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTU6IGJyZWFrOwotICAgICAgICBjYXNlIDQ4OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSU1QT1JUX1VSSSk7IHJldHVybiBDU1NfSU1QT1JUOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDk3OiBicmVhazsKLSAgICAgICAgY2FzZSA0NzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUE7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDk4OiBicmVhazsKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9ERUxJTUlURVI7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDk5OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fUFJPUEVSVFk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9QU0VVRE87Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDY6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMDI6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoenpJbnB1dCA9PSBZWUVPRiAmJiB6elN0YXJ0UmVhZCA9PSB6ekN1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHp6QXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHp6U2NhbkVycm9yKFpaX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvSUNTU1Rva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvSUNTU1Rva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzE1ZWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0lDU1NUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotLyoqCi0gKiBjdXJyZW50bHkgcHJvdmlkZSB0aGlzIGludGVyZmFjZSBidXQgbWF5IGJlIHJlbW92ZWQgaW4gZnV0dXJlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NUb2tlbml6ZXIgewotCi0Jdm9pZCBzZXRJbml0aWFsU3RhdGUoaW50IGluaXRpYWxTdGF0ZSk7Ci0KLQl2b2lkIHNldEluaXRpYWxCdWZmZXJTaXplKGludCBidWZzaXplKTsKLQotCWJvb2xlYW4gaXNFT0YoKTsKLQotCXZvaWQgcmVzZXQoUmVhZGVyIHJlYWRlciwgaW50IGkpOwotCi0JSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXZvaWQgcmVzZXQoY2hhcltdIGNzKTsKLQotCWludCBnZXRPZmZzZXQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9DU1NUZXh0UmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9DU1NUZXh0UmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjdmZjQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQ1NTVGV4dFJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLXB1YmxpYyBjbGFzcyBDU1NUZXh0UmVnaW9uRmFjdG9yeSB7Ci0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU1RleHRSZWdpb25GYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlUmVnaW9uKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXJlZ2lvbiA9IG5ldyBDb250ZXh0UmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCXByaXZhdGUgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZkluc3RhbmNlID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9DU1NSZWdpb25Db250ZXh0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0NTU1JlZ2lvbkNvbnRleHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMjczNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0NTU1JlZ2lvbkNvbnRleHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcno7Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENTU1JlZ2lvbkNvbnRleHRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfQ09NTUVOVCA9ICJDT01NRU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DRE8gPSAiQ0RPIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DREMgPSAiQ0RDIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TID0gIlMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVMSU1JVEVSID0gIkRFTElNSVRFUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfTEJSQUNFID0gIkxCUkFDRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfUkJSQUNFID0gIlJCUkFDRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19JTVBPUlQgPSAiSU1QT1JUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19QQUdFID0gIlBBR0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX01FRElBID0gIk1FRElBIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19GT05UX0ZBQ0UgPSAiRk9OVF9GQUNFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DSEFSU0VUID0gIkNIQVJTRVQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0FUS0VZV09SRCA9ICJBVEtFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU1RSSU5HID0gIlNUUklORyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfVVJJID0gIlVSSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfTUVESVVNID0gIk1FRElVTSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfTUVESUFfU0VQQVJBVE9SID0gIk1FRElBX1NFUEFSQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DSEFSU0VUX05BTUUgPSAiQ0hBUlNFVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1BBR0VfU0VMRUNUT1IgPSAiQ1NTX1BBR0VfU0VMRUNUT1IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FID0gIlNFTEVDVE9SX0VMRU1FTlRfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfVU5JVkVSU0FMID0gIlNFTEVDVE9SX1VOSVZFUlNBTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfUFNFVURPID0gIlNFTEVDVE9SX1BTRVVETyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfQ0xBU1MgPSAiU0VMRUNUT1JfQ0xBU1MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX0lEID0gIlNFTEVDVE9SX0lEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9DT01CSU5BVE9SID0gIlNFTEVDVE9SX0NPTUJJTkFUT1IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX1NFUEFSQVRPUiA9ICJTRUxFQ1RPUl9TRVBBUkFUT1IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUID0gIlNFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCA9ICJTRUxFQ1RPUl9BVFRSSUJVVEVfRU5EIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSA9ICJTRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFID0gIlNFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SID0gIlNFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9QUk9QRVJUWSA9ICJERUNMQVJBVElPTl9QUk9QRVJUWSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SID0gIkRFQ0xBUkFUSU9OX1NFUEFSQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSID0gIkRFQ0xBUkFUSU9OX0RFTElNSVRFUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQgPSAiREVDTEFSQVRJT05fVkFMVUVfSURFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTiA9ICJERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UgPSAiREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04gPSAiREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkcgPSAiREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkgPSAiREVDTEFSQVRJT05fVkFMVUVfVVJJIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX0hBU0giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0UgPSAiREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UID0gIkNTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9TID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX1MiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfVU5LTk9XTiA9ICJVTktOT1dOIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gRm9yIG51bGwgb2JqZWN0IDogQ1NTVG9rZW5pemVyIG5ldmVyIHNldCB0aGlzIHZhbHVlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1VOREVGSU5FRCA9ICJVTkRFRklORUQiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0gCSAqIGN1cnJlbnRseSBwcm92aWRlZCB0aGlzIGZpZWxkIGJ1dCBtYXkgYmUgcmVtb3ZlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0ZPUkVJR05fRUxFTUVOVCA9ICJGT1JFSUdOX0VMRU1FTlQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovQ1NTVGV4dFBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0NTU1RleHRQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1MzYxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovQ1NTVGV4dFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyejsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NUb2tlbml6ZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ1NTVGV4dFBhcnNlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9TVFlMRVNIRUVUID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RFQ0xBUkFUSU9OID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFID0gMjsKLQotCXB1YmxpYyBDU1NUZXh0UGFyc2VyKGludCBwYXJzZXJNb2RlKSB7Ci0JCWluaXRpYWxpemVQYXJzZXJNb2RlKHBhcnNlck1vZGUpOwotCX0KLQotCXB1YmxpYyBDU1NUZXh0UGFyc2VyKGludCBwYXJzZXJNb2RlLCBSZWFkZXIgcmVhZGVyKSB7Ci0JCWluaXRpYWxpemVQYXJzZXJNb2RlKHBhcnNlck1vZGUpOwotCQlyZXNldChyZWFkZXIpOwotCX0KLQotCXB1YmxpYyBDU1NUZXh0UGFyc2VyKGludCBwYXJzZXJNb2RlLCBTdHJpbmcgaW5wdXQpIHsKLQkJaW5pdGlhbGl6ZVBhcnNlck1vZGUocGFyc2VyTW9kZSk7Ci0JCXJlc2V0KGlucHV0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChSZWFkZXIgcmVhZGVyKSB7Ci0JCWdldFRva2VuaXplcigpLnJlc2V0KHJlYWRlciwgMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIGlucHV0KSB7Ci0JCWdldFRva2VuaXplcigpLnJlc2V0KG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQpLCAwKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTVGV4dFRva2VuW10gZ2V0VG9rZW5zKCkgewotCQlMaXN0IHRva2VuTGlzdCA9IGdldFRva2VuTGlzdCgpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBuZXcgQ1NTVGV4dFRva2VuW3Rva2VuTGlzdC5zaXplKCldOwotCQlyZXR1cm4gKENTU1RleHRUb2tlbltdKSB0b2tlbkxpc3QudG9BcnJheSh0b2tlbnMpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFRva2VuTGlzdCgpIHsKLQkJTGlzdCB0b2tlbnM7Ci0JCXRyeSB7Ci0JCQl0b2tlbnMgPSBnZXRUb2tlbml6ZXIoKS5wYXJzZVRleHQoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdG9rZW5zID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlyZXR1cm4gdG9rZW5zOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplUGFyc2VyTW9kZShpbnQgcGFyc2VyTW9kZSkgewotCQlpbnQgaW5pdGlhbFN0YXRlOwotCQlpbnQgYnVmc2l6ZTsKLQkJc3dpdGNoIChwYXJzZXJNb2RlKSB7Ci0JCQljYXNlIE1PREVfU1RZTEVTSEVFVCA6Ci0JCQkJaW5pdGlhbFN0YXRlID0gQ1NTVG9rZW5pemVyLllZSU5JVElBTDsKLQkJCQlidWZzaXplID0gQ1NTVG9rZW5pemVyLkJVRkZFUl9TSVpFX05PUk1BTDsKLQkJCQlicmVhazsKLQkJCWNhc2UgTU9ERV9ERUNMQVJBVElPTiA6Ci0JCQkJaW5pdGlhbFN0YXRlID0gQ1NTVG9rZW5pemVyLlNUX0RFQ0xBUkFUSU9OOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfTk9STUFMOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFIDoKLQkJCQlpbml0aWFsU3RhdGUgPSBDU1NUb2tlbml6ZXIuU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfU01BTEw7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm47Ci0JCX0KLQkJaWYgKDAgPCBpbml0aWFsU3RhdGUpIHsKLQkJCUNTU1Rva2VuaXplciB0b2tlbml6ZXIgPSBnZXRUb2tlbml6ZXIoKTsKLQkJCXRva2VuaXplci5zZXRJbml0aWFsU3RhdGUoaW5pdGlhbFN0YXRlKTsKLQkJCXRva2VuaXplci5zZXRJbml0aWFsQnVmZmVyU2l6ZShidWZzaXplKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ1NTVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBDU1NUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQlwcml2YXRlIENTU1Rva2VuaXplciBmVG9rZW5pemVyID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9DU1NUZXh0VG9rZW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9DU1NUZXh0VG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNjOTA3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovQ1NTVGV4dFRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcno7Ci0KLQotcHVibGljIGNsYXNzIENTU1RleHRUb2tlbiB7Ci0JcHVibGljIFN0cmluZyBraW5kOwotCXB1YmxpYyBTdHJpbmcgaW1hZ2U7Ci0JcHVibGljIGludCBzdGFydDsKLQlwdWJsaWMgaW50IGxlbmd0aDsKLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAoaW1hZ2UgIT0gbnVsbCkgPyBpbWFnZSA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DU1NDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYyNGQxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkNoYXJzZXROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgQ1NTIENvcmUgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIENTU0NvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0KLQkJLy8gZm9ybWF0dGluZyBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgsIDcyKTsKLQkJbm9kZS5wdXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTLCBmYWxzZSk7Ci0JCW5vZGUucHV0KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUiwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIpOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUsIDEpOwotCi0JCS8vIGNsZWFudXAgcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFLCB0cnVlKTsKLQotCQkvLyBjb2RlIGdlbmVyYXRpb24gcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkZWZhdWx0RW5jID0gIlVURi04IjsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzeXN0ZW1FbmMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuZW5jb2RpbmciKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc3lzdGVtRW5jICE9IG51bGwpIHsKLQkJCWRlZmF1bHRFbmMgPSBDb21tb25DaGFyc2V0TmFtZXMuZ2V0UHJlZmVycmVkRGVmYXVsdElhbmFOYW1lKHN5c3RlbUVuYywgIlVURi04Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VULCBkZWZhdWx0RW5jKTsKLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuRU5EX09GX0xJTkVfQ09ERSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gdGhpcyBjb3VsZCBiZSBtYWRlIHNtYXJ0ZXIgYnkgYWN0dWFsbHkgbG9va2luZyB1cCB0aGUgY29udGVudAotCQkvLyB0eXBlJ3MgdmFsaWQgZXh0ZW5zaW9ucwotCQlub2RlLnB1dChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCAiY3NzIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBhZGRpdGlvbmFsIGNzcyBjb3JlIHByZWZlcmVuY2VzCi0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUFJFX0RFTElNLCAwKTsKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QT1NUX0RFTElNLCAxKTsKLQkJbm9kZS5wdXQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUsICJcIiIpOy8vJE5PTi1OTFMtMSQKLQkJbm9kZS5wdXQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfQkVUV0VFTl9WQUxVRSwgIiAiKTsvLyROT04tTkxTLTEkCi0JCW5vZGUucHV0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URV9JTl9VUkksIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19ORVdMSU5FX09OX09QRU5fQlJBQ0UsIGZhbHNlKTsKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIsIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfU0VMRUNUT1IsIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0KLQkJLy8gQ1NTIGNsZWFudXAgcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfSURFTlRJRklFUiwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfTkFNRSwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfVkFMVUUsIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQVNJUyk7Ci0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX1NFTEVDVE9SLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DU1NDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNlMTdkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBDU1MgY29yZSBwcmVmZXJlbmNlIGtleXMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBlbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIHVzZXJzIGNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0VfSURFTlRJRklFUiA9ICJpZGVudGlmaWVyQ2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVNFX1NFTEVDVE9SID0gInNlbGVjdG9yQ2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVNFX1BST1BFUlRZX05BTUUgPSAicHJvcE5hbWVDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0VfUFJPUEVSVFlfVkFMVUUgPSAicHJvcFZhbHVlQ2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfQkVUV0VFTl9WQUxVRSA9ICJiZXR3ZWVuVmFsdWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1BST1BfUE9TVF9ERUxJTSA9ICJwb3N0RGVsaW0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1BST1BfUFJFX0RFTElNID0gInByZURlbGltIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9RVU9URSA9ICJxdW90ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfUVVPVEVfSU5fVVJJID0gInF1b3RlSW5VUkkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JBUFBJTkdfTkVXTElORV9PTl9PUEVOX0JSQUNFID0gIm5ld0xpbmVPbk9wZW5CcmFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUElOR19PTkVfUEVSX0xJTkUgPSAib25lUHJvcGVydHlQZXJMaW5lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUiA9ICJwcm9oaWJpdFdyYXBPbkF0dHIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDU1MgY2xlYW51cCBwcmVmZXJlbmNlIG5hbWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9DQVNFX0lERU5USUZJRVIgPSAiY2xlYW51cElkZW50aWZpZXJDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOVVBfQ0FTRV9QUk9QRVJUWV9OQU1FID0gImNsZWFudXBQcm9wTmFtZUNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9DQVNFX1BST1BFUlRZX1ZBTFVFID0gImNsZWFudXBQcm9wVmFsdWVDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOVVBfQ0FTRV9TRUxFQ1RPUiA9ICJjbGVhbnVwU2VsZWN0b3JDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOVVBfQ0FTRV9JRF9TRUxFQ1RPUiA9ICJjbGVhbnVwSWRTZWxlY3RvckNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9DQVNFX0NMQVNTX1NFTEVDVE9SID0gImNsZWFudXBDbGFzc1NlbGVjdG9yQ2FzZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGV4dGVuc2lvbiB0byB1c2Ugd2hlbiBub25lIGlzIHNwZWNpZmllZCBpbiB0aGUgTmV3IENTUyBGaWxlCi0JICogV2l6YXJkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWFRFTlNJT04gPSAiZGVmYXVsdEV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgbWF4aW11bSB3aWR0aCBvZiBhIGxpbmUgYmVmb3JlIGEgbGluZSBzcGxpdCBpcyBuZWVkZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9XSURUSCA9ICJsaW5lV2lkdGgiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiBhbGwgYmxhbmtzIGxpbmVzIHNob3VsZCBiZSBjbGVhcmVkIGR1cmluZyBmb3JtYXR0aW5nLgotCSAqIEJsYW5rIGxpbmVzIHdpbGwgYmUga2VwdCB3aGVuIGZhbHNlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSX0FMTF9CTEFOS19MSU5FUyA9ICJjbGVhckFsbEJsYW5rTGluZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgI0lOREVOVEFUSU9OX0NIQVIgZm9yIDEgaW5kZW50YXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UQVRJT05fU0laRSA9ICJpbmRlbnRhdGlvblNpemUiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjaGFyYWN0ZXIgdXNlZCBmb3IgaW5kZW50YXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge1RBQiwgU1BBQ0V9Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVEFUSU9OX0NIQVIgPSAiaW5kZW50YXRpb25DaGFyIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UgI0lOREVOVEFUSU9OX0NIQVIuIEluZGljYXRlcyB0byB1c2UKLQkgKiB0YWIgY2hhcmFjdGVyIHdoZW4gZm9ybWF0dGluZy4KLQkgKiAKLQkgKiBAc2VlICNTUEFDRQotCSAqIEBzZWUgI0lOREVOVEFUSU9OX0NIQVIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUIgPSAidGFiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlICNJTkRFTlRBVElPTl9DSEFSLiBJbmRpY2F0ZXMgdG8gdXNlCi0JICogc3BhY2UgY2hhcmFjdGVyIHdoZW4gZm9ybWF0dGluZy4KLQkgKiAKLQkgKiBAc2VlICNUQUIKLQkgKiBAc2VlICNJTkRFTlRBVElPTl9DSEFSCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0UgPSAic3BhY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gcXVvdGUgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVPVEVfQVRUUl9WQUxVRVMgPSAicXVvdGVBdHRyVmFsdWVzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgY2xlYW51cCBwcm9jZXNzb3Igc2hvdWxkIGZvcm1hdCBzb3VyY2UuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1NPVVJDRSA9ICJmb3JtYXRTb3VyY2UiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgY2FzZSBwcmVmZXJlbmNlcyBJbmRpY2F0ZXMgdG8gbGVhdmUgY2FzZSBhcyBpcy4KLQkgKiAKLQkgKiBAc2VlICNMT1dFUgotCSAqIEBzZWUgI1VQUEVSCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNJUyA9IDA7Ci0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIGNhc2UgcHJlZmVyZW5jZXMgSW5kaWNhdGVzIHRvIG1ha2UgbmFtZQotCSAqIGxvd2VyY2FzZS4KLQkgKiAKLQkgKiBAc2VlICNBU0lTCi0JICogQHNlZSAjVVBQRVIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT1dFUiA9IDE7Ci0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIGNhc2UgcHJlZmVyZW5jZXMgSW5kaWNhdGVzIHRvIG1ha2UgbmFtZQotCSAqIHVwcGVyY2FzZS4KLQkgKiAKLQkgKiBAc2VlICNMT1dFUgotCSAqIEBzZWUgI0FTSVMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUFBFUiA9IDI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lDU1NNb2RlbEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSUNTU01vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDE4ODE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSUNTU01vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVyczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU01vZGVsQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQlJQ1NTTW9kZWwgZ2V0TW9kZWwoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSU1vZGVsUHJvdmlkZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSU1vZGVsUHJvdmlkZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmOTRkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lNb2RlbFByb3ZpZGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsUHJvdmlkZUFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBtb2RlbFByb3ZpZGVkKElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpOwotCi0JLyoqCi0JICovCi0Jdm9pZCBtb2RlbFJlbGVhc2VkKElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpOwotCi0JLyoqCi0JICovCi0Jdm9pZCBtb2RlbFJlbW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM2YTkzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVyczsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBJQ1NTTW9kZWxBZGFwdGVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZURlY2xhcmF0aW9uIGdldFN0eWxlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZVNlbGVjdG9yQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVTZWxlY3RvckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlMjk3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZVNlbGVjdG9yQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVyczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NpbXBsZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZVNlbGVjdG9yQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSBwc2V1ZG9OYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JYm9vbGVhbiBtYXRjaChJQ1NTU2ltcGxlU2VsZWN0b3Igc2VsZWN0b3IsIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVTaGVldEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlU2hlZXRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNDc1MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVTaGVldEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnM7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0OwotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVTaGVldEFkYXB0ZXIgZXh0ZW5kcyBJQ1NTTW9kZWxBZGFwdGVyIHsKLQotCS8qKgotCSAqIFJldHVybnMgSFRNTC9YTUwgZWxlbWVudCB0aGF0IGlzIHRoZSBvd25lciBvZiB0aGlzIGFkYXB0ZXIKLQkgKi8KLQlFbGVtZW50IGdldEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgQ1NTIGRvY3VtZW50IHRoYXQgaXMgcmVsYXRlZCB0byB0aGlzIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU3R5bGVTaGVldCBnZXRTaGVldCgpOwotCi0JLyoqCi0JICogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIHRpbWUgb2YgcmVsZWFzaW5nIEhUTUwvWE1MIG1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZWQoKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSB0aW1lIG9mIHJlbW92aW5nIHRoaXMgRWxlbWVudCBmcm9tIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVTaGVldExpc3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNjM4ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVTaGVldExpc3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdDsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlU2hlZXRMaXN0QWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKi8KLQlFbnVtZXJhdGlvbiBnZXRDbGFzc2VzKCk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRPdmVycmlkZVN0eWxlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpOwotCi0JLyoqCi0JICovCi0JcHVibGljIFN0eWxlU2hlZXRMaXN0IGdldFN0eWxlU2hlZXRzKCk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlU3R5bGVTaGVldHMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NjIyY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MsIHdpdGggaXRzIG9uZSBmaWVsZCwgaXMgYSBjb252aWVuY2UgdG8gcHJvdmlkZSBjb21waWxlLXRpbWUKLSAqIHNhZmV0eSB3aGVuIHJlZmVyaW5nIHRvIGEgY29udGVudFR5cGUgSUQuIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQKLSAqIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4gcGx1Z2luLnhtbCBmaWxlLgotICovCi0KLXB1YmxpYyBjbGFzcyBDb250ZW50VHlwZUlkRm9yQ1NTIHsKLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4KLQkgKiBwbHVnaW4ueG1sIGZpbGUuIE5vdGU6IHRoaXMgdmFsdWUgaXMgaW50ZW50aWFsbHkgc2V0IHdpdGggZGVmYXVsdAotCSAqIHByb3RlY3RlZCBtZXRob2Qgc28gaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDb250ZW50VHlwZUlEX0NTUyA9IGdldENvbnN0YW50U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBEb24ndCBhbGxvdyBpbnN0YW50aWF0aW9uLgotCSAqLwotCXByaXZhdGUgQ29udGVudFR5cGVJZEZvckNTUygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0Jc3RhdGljIFN0cmluZyBnZXRDb25zdGFudFN0cmluZygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTQWNjZXNzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NBY2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyYWZhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NBY2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTQWNjZXNzIHsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLlZlY3RvcgotCSAqLwotCVZlY3RvciBnZXRDbGFzc05hbWVzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NBdHRyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NBdHRyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkODBhOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTQXR0ci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU0F0dHIgZXh0ZW5kcyBJQ1NTTm9kZSB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCUlDU1NOb2RlIGdldE93bmVyQ1NTTm9kZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NDaGFyc2V0UnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTQ2hhcnNldFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzNGVkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NDaGFyc2V0UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTQ2hhcnNldFJ1bGU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU0NoYXJzZXRSdWxlIGV4dGVuZHMgSUNTU05vZGUsIENTU0NoYXJzZXRSdWxlIHsKLQotCWphdmEubGFuZy5TdHJpbmcgRU5DT0RJTkcgPSAiZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NEb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2YzBkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU0RvY3VtZW50IGV4dGVuZHMgSUNTU05vZGUgewotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTQ2hhcnNldFJ1bGUKLQkgKi8KLQlJQ1NTQ2hhcnNldFJ1bGUgY3JlYXRlQ1NTQ2hhcnNldFJ1bGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZQotCSAqLwotCUNTU0ZvbnRGYWNlUnVsZSBjcmVhdGVDU1NGb250RmFjZVJ1bGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0ltcG9ydFJ1bGUKLQkgKi8KLQlJQ1NTSW1wb3J0UnVsZSBjcmVhdGVDU1NJbXBvcnRSdWxlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5JQ1NTTWVkaWFSdWxlCi0JICovCi0JSUNTU01lZGlhUnVsZSBjcmVhdGVDU1NNZWRpYVJ1bGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1BhZ2VSdWxlCi0JICovCi0JSUNTU1BhZ2VSdWxlIGNyZWF0ZUNTU1BhZ2VSdWxlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCUlDU1NQcmltaXRpdmVWYWx1ZSBjcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShzaG9ydCBwcmltaXRpdmVUeXBlKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUNTU1J1bGUgY3JlYXRlQ1NTUnVsZShTdHJpbmcgcnVsZSk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uCi0JICovCi0JSUNTU1N0eWxlRGVjbGFyYXRpb24gY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUlDU1NTdHlsZURlY2xJdGVtIGNyZWF0ZUNTU1N0eWxlRGVjbEl0ZW0oU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVJ1bGUKLQkgKi8KLQlJQ1NTU3R5bGVSdWxlIGNyZWF0ZUNTU1N0eWxlUnVsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTVW5rbm93blJ1bGUKLQkgKi8KLQlDU1NVbmtub3duUnVsZSBjcmVhdGVDU1NVbmtub3duUnVsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3QKLQkgKi8KLQlNZWRpYUxpc3QgY3JlYXRlTWVkaWFMaXN0KCk7Ci0KLQlJQ1NTTW9kZWwgZ2V0TW9kZWwoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNEb2N1bWVudCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTSW1wb3J0UnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTSW1wb3J0UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWQ5MGQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0ltcG9ydFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ltcG9ydFJ1bGU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU0ltcG9ydFJ1bGUgZXh0ZW5kcyBJQ1NTTm9kZSwgQ1NTSW1wb3J0UnVsZSB7Ci0KLQlqYXZhLmxhbmcuU3RyaW5nIEhSRUYgPSAiaHJlZiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgcmVmcmVzaFN0eWxlU2hlZXQoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBocmVmCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0Jdm9pZCBzZXRIcmVmKFN0cmluZyBocmVmKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU01lZGlhUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTWVkaWFSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NDAzMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTWVkaWFSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NNZWRpYVJ1bGU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU01lZGlhUnVsZSBleHRlbmRzIElDU1NOb2RlLCBJQ1NTUnVsZUNvbnRhaW5lciwgQ1NTTWVkaWFSdWxlIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU01vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NmU1NzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50LklDU1NTdHlsZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTTW9kZWwgZXh0ZW5kcyBJQ1NTU3R5bGVOb3RpZmllciwgSVN0cnVjdHVyZWRNb2RlbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTCA9ICJleHRlcm5hbENTUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERFRCA9ICJlbWJlZGRlZENTUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkxJTkUgPSAiaW5saW5lQ1NTIjsgLy8kTk9OLU5MUy0xJAotCi0JSUNTU0RvY3VtZW50IGdldERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlOb2RlIGdldE93bmVyRE9NTm9kZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JT2JqZWN0IGdldFN0eWxlU2hlZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBjbGVhbnVwIC0+IHJlYnVpbGQgQ1NTIE5vZGVzIFRoaXMgaXMgcHJlLWJldGEgZml4IGZvciAxNzgxNzYuCi0JICovCi0Jdm9pZCByZWZyZXNoTm9kZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU05hbWVkTm9kZU1hcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTmFtZWROb2RlTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyODY5YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTmFtZWROb2RlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTTmFtZWROb2RlTWFwIGV4dGVuZHMgSUNTU05vZGVMaXN0IHsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUlDU1NOb2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMTdlNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU05vZGUgewotCi0Jc2hvcnQgQVRUUl9OT0RFID0gLTE7Ci0Jc2hvcnQgVU5LTk9XTlJVTEVfTk9ERSA9IDA7Ci0Jc2hvcnQgU1RZTEVSVUxFX05PREUgPSAxOwotCXNob3J0IENIQVJTRVRSVUxFX05PREUgPSAyOwotCXNob3J0IElNUE9SVFJVTEVfTk9ERSA9IDM7Ci0Jc2hvcnQgTUVESUFSVUxFX05PREUgPSA0OwotCXNob3J0IEZPTlRGQUNFUlVMRV9OT0RFID0gNTsKLQlzaG9ydCBQQUdFUlVMRV9OT0RFID0gNjsKLQlzaG9ydCBTVFlMRVNIRUVUX05PREUgPSA3OwotCXNob3J0IFNUWUxFREVDTEFSQVRJT05fTk9ERSA9IDg7Ci0Jc2hvcnQgU1RZTEVERUNMSVRFTV9OT0RFID0gOTsKLQlzaG9ydCBWQUxVRUxJU1RfTk9ERSA9IDEwOwotCXNob3J0IFBSSU1JVElWRVZBTFVFX05PREUgPSAxMTsKLQlzaG9ydCBNRURJQUxJU1RfTk9ERSA9IDEyOwotCXNob3J0IERPQ1VNRU5UQ1NTU1RZTEVfTk9ERSA9IDEzOwotCXNob3J0IExJTktTVFlMRV9OT0RFID0gMTQ7Ci0Jc2hvcnQgRUxFTUVOVENTU0lOTElORVNUWUxFX05PREUgPSAxNTsKLQotCUlDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTmFtZWROb2RlTWFwCi0JICovCi0JSUNTU05hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCk7Ci0KLQlJQ1NTTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpOwotCi0JSUNTU05vZGUgZ2V0Rmlyc3RDaGlsZCgpOwotCi0JSUNTU05vZGUgZ2V0TGFzdENoaWxkKCk7Ci0KLQlJQ1NTTm9kZSBnZXROZXh0U2libGluZygpOwotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXNob3J0IGdldE5vZGVUeXBlKCk7Ci0KLQlJQ1NTRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpOwotCi0JSUNTU05vZGUgZ2V0UGFyZW50Tm9kZSgpOwotCi0JSUNTU05vZGUgZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGhhc0NoaWxkTm9kZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU05vZGVMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NOb2RlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTBkZmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU05vZGVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTTm9kZUxpc3QgewotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQlJQ1NTTm9kZSBpdGVtKGludCBpbmRleCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NQYWdlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUGFnZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZhMjRhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NQYWdlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUGFnZVJ1bGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1BhZ2VSdWxlIGV4dGVuZHMgSUNTU05vZGUsIENTU1BhZ2VSdWxlIHsKLQotCWphdmEubGFuZy5TdHJpbmcgU0VMRUNUT1IgPSAic2VsZWN0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlJQ1NTU2VsZWN0b3JMaXN0IGdldFNlbGVjdG9ycygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUHJpbWl0aXZlVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1ByaW1pdGl2ZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZWFjYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUHJpbWl0aXZlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NQcmltaXRpdmVWYWx1ZSBleHRlbmRzIElDU1NOb2RlLCBJQ1NTVmFsdWUsIENTU1ByaW1pdGl2ZVZhbHVlIHsKLQotCXNob3J0IENTU19JTlRFR0VSID0gMjY7Ci0Jc2hvcnQgQ1NTX0hBU0ggPSAyNzsKLQlzaG9ydCBDU1NfVVJBTkdFID0gMjg7Ci0Jc2hvcnQgQ1NTX0ZPUk1BVCA9IDI5OwotCXNob3J0IENTU19MT0NBTCA9IDMwOwotCXNob3J0IENTU19TTEFTSCA9IDMxOwotCXNob3J0IENTU19DT01NQSA9IDMyOwotCXNob3J0IENTU19JTkhFUklUX1BSSU1JVElWRSA9IDMzOwotCi0JLyoqCi0JICogQHBhcmFtIGZsb2F0VmFsdWUKLQkgKiAgICAgICAgICAgIGZsb2F0Ci0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXZvaWQgc2V0VmFsdWUoZmxvYXQgZmxvYXRWYWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmdWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyBzdHJpbmdWYWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1J1bGVDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1J1bGVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlhZTU5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NSdWxlQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTUnVsZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCUNTU1J1bGUgYXBwZW5kUnVsZShDU1NSdWxlIHJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG5ld1J1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJlZlJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICovCi0JQ1NTUnVsZSBpbnNlcnRSdWxlQmVmb3JlKENTU1J1bGUgbmV3UnVsZSwgQ1NTUnVsZSByZWZSdWxlKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlDU1NSdWxlIHJlbW92ZVJ1bGUoQ1NTUnVsZSBydWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCUNTU1J1bGUgcmVwbGFjZVJ1bGUoQ1NTUnVsZSBuZXdSdWxlLCBDU1NSdWxlIG9sZFJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U5NTQxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTZWxlY3RvciB7Ci0KLQlJQ1NTU2VsZWN0b3JJdGVtIGdldEl0ZW0oaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JSXRlcmF0b3IgZ2V0SXRlcmF0b3IoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldExlbmd0aCgpOwotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0U3BlY2lmaWNpdHkoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXRTdHJpbmcoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JYm9vbGVhbiBtYXRjaChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUl0ZXJhdG9yIGdldEVycm9ycygpOwotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldEVycm9yQ291bnQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9yQ29tYmluYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3JDb21iaW5hdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNDQzYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3JDb21iaW5hdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yIGV4dGVuZHMgSUNTU1NlbGVjdG9ySXRlbSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgREVTQ0VOREFOVCA9ICcgJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0hJTEQgPSAnPic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEFESkFDRU5UID0gJysnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBVTktOT1dOID0gJz8nOyAvLyBlcnJvciBjYXNlCi0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWNoYXIgZ2V0Q29tYmluYXRvclR5cGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9ySXRlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3JJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZmU4ZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3JJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU2VsZWN0b3JJdGVtIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTVBMRSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NQklOQVRPUiA9IDI7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRJdGVtVHlwZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldFN0cmluZygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3JMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc3ZmQwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU2VsZWN0b3JMaXN0IHsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JSXRlcmF0b3IgZ2V0SXRlcmF0b3IoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldExlbmd0aCgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuVmVjdG9yCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlJQ1NTU2VsZWN0b3IgZ2V0U2VsZWN0b3IoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXRTdHJpbmcoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXRFcnJvckNvdW50KCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlJdGVyYXRvciBnZXRFcnJvcnMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JYm9vbGVhbiBtYXRjaChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NpbXBsZVNlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTaW1wbGVTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDlmYjgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NpbXBsZVNlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU2ltcGxlU2VsZWN0b3IgZXh0ZW5kcyBJQ1NTU2VsZWN0b3JJdGVtIHsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JU3RyaW5nIGdldEF0dHJpYnV0ZShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xhc3MoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JU3RyaW5nIGdldElEKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JaW50IGdldE51bU9mQXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JaW50IGdldE51bU9mQ2xhc3NlcygpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JaW50IGdldE51bU9mSURzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlpbnQgZ2V0TnVtT2ZQc2V1ZG9OYW1lcygpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlTdHJpbmcgZ2V0UHNldWRvTmFtZShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc1VuaXZlcnNhbCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVEZWNsSXRlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVEZWNsSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjljZDZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlRGVjbEl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTdHlsZURlY2xJdGVtIGV4dGVuZHMgSUNTU05vZGUsIElDU1NWYWx1ZUxpc3QgewotCi0JamF2YS5sYW5nLlN0cmluZyBJTVBPUlRBTlQgPSAiaW1wb3J0YW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlJQ1NTUHJpbWl0aXZlVmFsdWUgYXBwZW5kVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWUKLQkgKi8KLQlDU1NWYWx1ZSBnZXRDU1NWYWx1ZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldFByaW9yaXR5KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCUlDU1NQcmltaXRpdmVWYWx1ZSByZW1vdmVWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JSUNTU1ByaW1pdGl2ZVZhbHVlIHJlcGxhY2VWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgbmV3VmFsdWUsIElDU1NQcmltaXRpdmVWYWx1ZSBvbGRWYWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBwcmlvcml0eQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXZvaWQgc2V0UHJpb3JpdHkoU3RyaW5nIHByaW9yaXR5KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlRGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlRGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U4NzM2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZURlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTdHlsZURlY2xhcmF0aW9uIGV4dGVuZHMgSUNTU0RvY3VtZW50LCBDU1NTdHlsZURlY2xhcmF0aW9uIHsKLQotCUlDU1NTdHlsZURlY2xJdGVtIGdldERlY2xJdGVtTm9kZShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCUlDU1NTdHlsZURlY2xJdGVtIHJlbW92ZURlY2xJdGVtTm9kZShJQ1NTU3R5bGVEZWNsSXRlbSBvbGREZWNsKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JSUNTU1N0eWxlRGVjbEl0ZW0gc2V0RGVjbEl0ZW1Ob2RlKElDU1NTdHlsZURlY2xJdGVtIG5ld0RlY2wpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzRlMWE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVSdWxlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTdHlsZVJ1bGUgZXh0ZW5kcyBJQ1NTTm9kZSwgQ1NTU3R5bGVSdWxlIHsKLQotCWphdmEubGFuZy5TdHJpbmcgU0VMRUNUT1IgPSAic2VsZWN0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlJQ1NTU2VsZWN0b3JMaXN0IGdldFNlbGVjdG9ycygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVTaGVldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVTaGVldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWE4MmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlU2hlZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTdHlsZVNoZWV0IGV4dGVuZHMgSUNTU0RvY3VtZW50LCBJQ1NTUnVsZUNvbnRhaW5lciwgQ1NTU3R5bGVTaGVldCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGVMaXN0Ci0JICovCi0JTm9kZUxpc3QgZ2V0T3duZXJOb2RlcygpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqIEBwYXJhbSBkb2MKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0JICovCi0JTm9kZUxpc3QgZ2V0T3duZXJOb2RlcyhEb2N1bWVudCBkb2MpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZUxpc3QKLQkgKi8KLQlDU1NSdWxlTGlzdCBnZXRPd25lclJ1bGVzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0Ci0JICovCi0JU3R5bGVTaGVldExpc3QgZ2V0UGFyZW50U3R5bGVTaGVldHMoKTsKLQotCS8qKgotCSAqIFRoZSBsaXN0IG9mIGFsbCBDU1MgcnVsZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgc3R5bGVzaGVldCBhbmQsIGlmIHJlcXVlc3RlZCwgdGhlIHJ1bGVzCi0JICogZnJvbSBpbXBvcnRlZCBzdHlsZXNoZWV0cyBhcmUgbWVyZ2VkIGludG8gdGhlIHJ1bGUgbGlzdC4KLQkgKiBAcGFyYW0gc2hvdWxkSW1wb3J0IGluZGljYXRlcyBpZiBydWxlcyBmcm9tIGltcG9ydGVkIHN0eWxlc2hlZXRzIHNob3VsZCBiZSByZXR1cm5lZAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIG9mIHRoZSBydWxlcyBpbiB0aGUgc3R5bGVzaGVldCwgYW5kIGlmIHJlcXVlc3RlZCwKLQkgKiBhbnkgcnVsZXMgZnJvbSBpbXBvcnRlZCBzdHlsZXNoZWV0cwotCSAqLwotCUNTU1J1bGVMaXN0IGdldENzc1J1bGVzKGJvb2xlYW4gc2hvdWxkSW1wb3J0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1ZhbHVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzY5MTQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1ZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTVmFsdWUgZXh0ZW5kcyBDU1NWYWx1ZSB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0Q1NTVmFsdWVUZXh0KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NWYWx1ZUxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1ZhbHVlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDljNTc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1ZhbHVlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWVMaXN0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NWYWx1ZUxpc3QgZXh0ZW5kcyBJQ1NTVmFsdWUsIENTU1ZhbHVlTGlzdCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICovCi0JSUNTU1ByaW1pdGl2ZVZhbHVlIGFwcGVuZFZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICovCi0JSUNTU1ByaW1pdGl2ZVZhbHVlIHJlbW92ZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDb3VudGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDb3VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmODI0YjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ291bnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ291bnRlcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ291bnRlciBleHRlbmRzIElDU1NOb2RlLCBDb3VudGVyIHsKLQotCWphdmEubGFuZy5TdHJpbmcgSURFTlRJRklFUiA9ICJpZGVudGlmaWVyIjsgLy8kTk9OLU5MUy0xJAotCWphdmEubGFuZy5TdHJpbmcgTElTVFNUWUxFID0gImxpc3RzdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlqYXZhLmxhbmcuU3RyaW5nIFNFUEFSQVRPUiA9ICJzZXBhcmF0b3IiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gaWRlbnRpZmllcgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQl2b2lkIHNldElkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdFN0eWxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXZvaWQgc2V0TGlzdFN0eWxlKFN0cmluZyBsaXN0U3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gU2VwYXJhdG9yCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXZvaWQgc2V0U2VwYXJhdG9yKFN0cmluZyBzZXBhcmF0b3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01JbXBsZW1lbnRhdGlvbkNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NSW1wbGVtZW50YXRpb25DU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0NGU5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01JbXBsZW1lbnRhdGlvbkNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuRE9NSW1wbGVtZW50YXRpb25DU1M7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURPTUltcGxlbWVudGF0aW9uQ1NTIGV4dGVuZHMgRE9NSW1wbGVtZW50YXRpb25DU1MgewotCi0JSUNTU1N0eWxlRGVjbGFyYXRpb24gY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lEb2N1bWVudFN0eWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lEb2N1bWVudFN0eWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNDYwNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRG9jdW1lbnRTdHlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5Eb2N1bWVudFN0eWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURvY3VtZW50U3R5bGUgZXh0ZW5kcyBEb2N1bWVudFN0eWxlIHsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBwYXJhbSBuZXdTaGVldAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlTdHlsZVNoZWV0IGFwcGVuZFNoZWV0KFN0eWxlU2hlZXQgbmV3U2hlZXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAcGFyYW0gbmV3U2hlZXQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAcGFyYW0gcmVmU2hlZXQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JU3R5bGVTaGVldCBpbnNlcnRTaGVldEJlZm9yZShTdHlsZVNoZWV0IG5ld1NoZWV0LCBTdHlsZVNoZWV0IHJlZlNoZWV0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQHBhcmFtIG9sZFNoZWV0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCVN0eWxlU2hlZXQgcmVtb3ZlU2hlZXQoU3R5bGVTaGVldCBvbGRTaGVldCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBwYXJhbSBuZXdTaGVldAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBwYXJhbSBvbGRTaGVldAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlTdHlsZVNoZWV0IHJlcGxhY2VTaGVldChTdHlsZVNoZWV0IG5ld1NoZWV0LCBTdHlsZVNoZWV0IG9sZFNoZWV0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9wcmVmZXJlbmNlcy9DU1NQcmVmZXJlbmNlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3ByZWZlcmVuY2VzL0NTU1ByZWZlcmVuY2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmYWZlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3ByZWZlcmVuY2VzL0NTU1ByZWZlcmVuY2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQganVzdCBhY2Nlc3MgcHJlZmVyZW5jZXMgZGlyZWN0bHkKLSAqLwotcHVibGljIGNsYXNzIENTU1ByZWZlcmVuY2VIZWxwZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ1NTUHJlZmVyZW5jZUhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTUHJlZmVyZW5jZUhlbHBlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCZXR3ZWVuVmFsdWVTdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9CRVRXRUVOX1ZBTFVFKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluZGVudFN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJaWYgKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQlpbmRlbnRDaGFyID0gJ1x0JzsKLQkJCX0KLQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0JCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4TGluZVdpZHRoKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1b3RlU3RyaW5nKElDU1NNb2RlbCBtb2RlbCkgewotCQkvLyBuYWthbW9yaV9UT0RPIGNzcyBwcmVmIHRyYW5zaXRpb24KLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNwYWNlc1Bvc3REZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BPU1RfREVMSU0pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3BhY2VzUHJlRGVsaW1pdGVyKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QUkVfREVMSU0pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSWRlbnRVcHBlckNhc2UoKSB7Ci0JCWlmIChnZXRQcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXdMaW5lT25PcGVuQnJhY2UoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19ORVdMSU5FX09OX09QRU5fQlJBQ0UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT25lUHJvcGVydHlQZXJMaW5lKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfT05FX1BFUl9MSU5FKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb2hpYml0V3JhcE9uQXR0cigpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wTmFtZVVwcGVyQ2FzZSgpIHsKLQkJaWYgKGdldFByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BWYWx1ZVVwcGVyQ2FzZSgpIHsKLQkJaWYgKGdldFByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNRdW90ZUluVVJJKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFX0lOX1VSSSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0QmV0d2VlblZhbHVlU3RyaW5nKFN0cmluZyBuZXdCZXR3ZWVuVmFsdWVTdHJpbmcpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9CRVRXRUVOX1ZBTFVFLCBuZXdCZXR3ZWVuVmFsdWVTdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldElkZW50VXBwZXJDYXNlKGJvb2xlYW4gbmV3SWRlbnRVcHBlckNhc2UpIHsKLQkJaW50IHRoZUNhc2UgPSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSOwotCQlpZiAobmV3SWRlbnRVcHBlckNhc2UpCi0JCQl0aGVDYXNlID0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUjsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUiwgdGhlQ2FzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0T25lUHJvcGVydHlQZXJMaW5lKGJvb2xlYW4gbmV3T25lUHJvcGVydHlQZXJMaW5lKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUsIG5ld09uZVByb3BlcnR5UGVyTGluZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvaGliaXRXcmFwT25BdHRyKGJvb2xlYW4gbmV3UHJvaGliaXRXcmFwT25BdHRyKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIsIG5ld1Byb2hpYml0V3JhcE9uQXR0cik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcE5hbWVVcHBlckNhc2UoYm9vbGVhbiBuZXdQcm9wTmFtZVVwcGVyQ2FzZSkgewotCQlpbnQgdGhlQ2FzZSA9IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVI7Ci0JCWlmIChuZXdQcm9wTmFtZVVwcGVyQ2FzZSkKLQkJCXRoZUNhc2UgPSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSOwotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FLCB0aGVDYXNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wVmFsdWVVcHBlckNhc2UoYm9vbGVhbiBuZXdQcm9wVmFsdWVVcHBlckNhc2UpIHsKLQkJaW50IHRoZUNhc2UgPSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSOwotCQlpZiAobmV3UHJvcFZhbHVlVXBwZXJDYXNlKQotCQkJdGhlQ2FzZSA9IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVI7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFLCB0aGVDYXNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRRdW90ZVN0cmluZyhTdHJpbmcgcXVvdGUpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSwgcXVvdGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwYWNlc1Bvc3REZWxpbWl0ZXIoaW50IG51bSkgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUE9TVF9ERUxJTSwgbnVtKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGFjZXNQcmVEZWxpbWl0ZXIoaW50IG51bSkgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUFJFX0RFTElNLCBudW0pOwotCX0KLQotCXByaXZhdGUgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7Ci0JCUNTU0NvcmVQbHVnaW4gY3NzTW9kZWxQbHVnaW4gPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJcmV0dXJuIGNzc01vZGVsUGx1Z2luLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSBDU1NQcmVmZXJlbmNlSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENTU1ByZWZlcmVuY2VIZWxwZXIgZkluc3RhbmNlID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JQ1NTUGFydGl0aW9uVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JQ1NTUGFydGl0aW9uVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmY2Y0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUNTU1BhcnRpdGlvblR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvblR5cGVzOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4gSXQgZGVmaW5lcyB0aGUKLSAqIHBhcnRpdGlvbmluZyBmb3IgQ1NTIGFuZCBhbGwgaXRzIHBhcnRpdGlvbnMuIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUKLSAqIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAZGVwcmVjYXRlZCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGV4dC5JQ1NTUGFydGl0aW9ucwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NQYXJ0aXRpb25UeXBlcyBleHRlbmRzIElTdHJ1Y3R1cmVkUGFydGl0aW9uVHlwZXMgewotCi0JU3RyaW5nIFNUWUxFID0gIm9yZy5lY2xpcHNlLndzdC5jc3MuU1RZTEUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Rhc2tzL0NTU0ZpbGVUYXNrU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90YXNrcy9DU1NGaWxlVGFza1NjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI5YmZjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Rhc2tzL0NTU0ZpbGVUYXNrU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3MuU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lcjsKLQotcHVibGljIGNsYXNzIENTU0ZpbGVUYXNrU2Nhbm5lciBleHRlbmRzIFN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXIgewotCXB1YmxpYyBDU1NGaWxlVGFza1NjYW5uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21tZW50ZWRUZXh0KElEb2N1bWVudCBkb2N1bWVudCwgaW50IGJlZ2luLCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmcgdGV4dCA9IHN1cGVyLmdldENvbW1lbnRlZFRleHQoZG9jdW1lbnQsIGJlZ2luLCBsZW5ndGgpOwotCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQuZW5kc1dpdGgoIiovIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHRleHQubGVuZ3RoKCkgLSAyKTsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJcmV0dXJuIHRleHRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRhNDIzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTUmVnaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFRleHRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBjZW50cmFsaXplZCBwbGFjZSB0byBwdXQgInJlcGFyc2luZyIgbG9naWMuIFRoaXMgaXMKLSAqIHRoZSBsb2dpYyB0aGF0IHJlcGFyc2VzIHRoZSB0ZXh0IGluY3JlbWVudGFsbHksIGFzIGEgdXNlciB0eXBlcyBpbiBuZXcKLSAqIGNoYXJhY3RlcnMsIG9yIERPTSBub2RlcyBhcmUgaW5zZXJ0ZWQgb3IgZGVsZXRlZC4gTm90ZTogaXQgaXMgbm90IGEgdGhyZWFkCi0gKiBzYWZlIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciB7Ci0KLQljbGFzcyBSZXBhcnNlUmFuZ2UgewotCQlSZXBhcnNlUmFuZ2UoKSB7Ci0JCQlyZXNldCgpOwotCQl9Ci0KLQkJUmVwYXJzZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgewotCQkJZlJhbmdlU3RhcnQgPSBzdGFydDsKLQkJCWZSYW5nZUVuZCA9IGVuZDsKLQkJfQotCi0JCXZvaWQgc2V0U3RhcnQoaW50IHN0YXJ0KSB7Ci0JCQlmUmFuZ2VTdGFydCA9IHN0YXJ0OwotCQl9Ci0KLQkJdm9pZCBzZXRFbmQoaW50IGVuZCkgewotCQkJZlJhbmdlRW5kID0gZW5kOwotCQl9Ci0KLQkJaW50IGdldFN0YXJ0KCkgewotCQkJcmV0dXJuIGZSYW5nZVN0YXJ0OwotCQl9Ci0KLQkJaW50IGdldEVuZCgpIHsKLQkJCXJldHVybiBmUmFuZ2VFbmQ7Ci0JCX0KLQotCQlib29sZWFuIGlzVmFsaWQoKSB7Ci0JCQlyZXR1cm4gKDAgPCBmUmFuZ2VFbmQgLSBmUmFuZ2VTdGFydCkgPyB0cnVlIDogZmFsc2U7Ci0JCX0KLQotCQl2b2lkIHJlc2V0KCkgewotCQkJZlJhbmdlU3RhcnQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJCWZSYW5nZUVuZCA9IDA7Ci0JCX0KLQotCQl2b2lkIGV4cGFuZChSZXBhcnNlUmFuZ2UgcmFuZ2UpIHsKLQkJCWlmIChyYW5nZSA9PSBudWxsIHx8ICFyYW5nZS5pc1ZhbGlkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpbnQgc3RhcnQgPSByYW5nZS5nZXRTdGFydCgpOwotCQkJaWYgKHN0YXJ0IDwgZlJhbmdlU3RhcnQpIHsKLQkJCQlmUmFuZ2VTdGFydCA9IHN0YXJ0OwotCQkJfQotCQkJaW50IGVuZCA9IHJhbmdlLmdldEVuZCgpOwotCQkJaWYgKGZSYW5nZUVuZCA8IGVuZCkgewotCQkJCWZSYW5nZUVuZCA9IGVuZDsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgaW50IGZSYW5nZVN0YXJ0OwotCQlwcml2YXRlIGludCBmUmFuZ2VFbmQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCS8vIHB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudAotCS8vIGNoZWNrRm9yQ3Jvc3NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Cb3VuZHJ5Q2FzZXMyKCkgewotCS8vIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IHNwZWNpYWxQb3NpdGlvblVwZGF0ZShmU3RhcnQsIGZTdGFydCArCi0JLy8gZkxlbmd0aFRvUmVwbGFjZSAtIDEpOwotCS8vIGlmIChyZXN1bHQgPT0gbnVsbCkgewotCS8vIHJlc3VsdCA9IGNoZWNrSW5zaWRlQnJhY2UoKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIHJlc3VsdDsKLQkvLyB9Ci0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ3Jvc3NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25TeW50YXgoKSB7Ci0JCWludCBjaGVja1N0YXJ0ID0gZlN0YXJ0OwotCQlpbnQgY2hlY2tFbmQgPSBmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlIC0gMTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRSZWdpb24gPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGNoZWNrRW5kKTsKLQkJaWYgKGVuZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQljaGVja0VuZCA9IGVuZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJfQotCi0JCVJlcGFyc2VSYW5nZSByYW5nZSA9IG5ldyBSZXBhcnNlUmFuZ2UoY2hlY2tTdGFydCwgY2hlY2tFbmQpOwotCi0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvckRlbGltaXRlcihyYW5nZS5nZXRTdGFydCgpLCByYW5nZS5nZXRFbmQoKSkpOwotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JVbmtub3duUmVnaW9uKHJhbmdlLmdldFN0YXJ0KCksIHJhbmdlLmdldEVuZCgpKSk7Ci0KLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUXVvdGVzKHJhbmdlLmdldFN0YXJ0KCksIHJhbmdlLmdldEVuZCgpKSk7Ci0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvckNvbW1lbnRzKHJhbmdlLmdldFN0YXJ0KCksIHJhbmdlLmdldEVuZCgpKSk7Ci0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvckJyYWNlcyhyYW5nZS5nZXRTdGFydCgpLCByYW5nZS5nZXRFbmQoKSkpOwotCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdDsKLQotCQlyZXN1bHQgPSBjaGVja0luc2lkZUJyYWNlKHJhbmdlLmdldFN0YXJ0KCksIHJhbmdlLmdldEVuZCgpKTsKLQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IHJlcGFyc2UocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFJlcGFyc2VSYW5nZSBnZXRVcGRhdGVSYW5nZUZvclVua25vd25SZWdpb24oaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWludCBuZXdTdGFydCA9IHN0YXJ0OwotCQlSZWdpb25JdGVyYXRvciBpdGVyYXRvciA9IG5ldyBSZWdpb25JdGVyYXRvcihmU3RydWN0dXJlZERvY3VtZW50LCBzdGFydCAtIDEpOwotCQlpZiAoaXRlcmF0b3IuaGFzUHJldigpKSB7Ci0JCQlpdGVyYXRvci5wcmV2KCk7IC8vIHNraXAgbXlzZWxmCi0JCX0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc1ByZXYoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlcmF0b3IucHJldigpOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV04pIHsKLQkJCQluZXdTdGFydCA9IGl0ZXJhdG9yLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChzdGFydCAhPSBuZXdTdGFydCkgewotCQkJcmV0dXJuIG5ldyBSZXBhcnNlUmFuZ2UobmV3U3RhcnQsIGVuZCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFJlcGFyc2VSYW5nZSBnZXRVcGRhdGVSYW5nZUZvckRlbGltaXRlcihpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaWYgKGRpcnR5U3RhcnQgIT0gbnVsbCAmJiBkaXJ0eVN0YXJ0LmdldFN0YXJ0KCkgPCBzdGFydCkgewotCQkJc3RhcnQgPSBkaXJ0eVN0YXJ0LmdldFN0YXJ0KCk7Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2NSZWdpb24gPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0KTsKLQkJaWYgKGRvY1JlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoZG9jUmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZSZWdpb24gPSBkb2NSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCWlmIChwcmV2UmVnaW9uICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFJlcGFyc2VSYW5nZShwcmV2UmVnaW9uLmdldFN0YXJ0KCksIGVuZCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFJlcGFyc2VSYW5nZSBnZXRVcGRhdGVSYW5nZUZvclF1b3RlcyhpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJUmVwYXJzZVJhbmdlIHJhbmdlID0gbmV3IFJlcGFyc2VSYW5nZSgpOwotCi0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclBhaXIoc3RhcnQsIGVuZCwgIlwiIiwgIlwiIikpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKHN0YXJ0LCBlbmQsICJcJyIsICJcJyIpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gKHJhbmdlLmlzVmFsaWQoKSkgPyByYW5nZSA6IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBSZXBhcnNlUmFuZ2UgZ2V0VXBkYXRlUmFuZ2VGb3JDb21tZW50cyhpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJUmVwYXJzZVJhbmdlIHJhbmdlID0gbmV3IFJlcGFyc2VSYW5nZSgpOwotCi0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclBhaXIoc3RhcnQsIGVuZCwgIi8qIiwgIiovIikpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKHN0YXJ0LCBlbmQsICI8JSIsICIlPiIpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gKHJhbmdlLmlzVmFsaWQoKSkgPyByYW5nZSA6IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBSZXBhcnNlUmFuZ2UgZ2V0VXBkYXRlUmFuZ2VGb3JCcmFjZXMoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCVJlcGFyc2VSYW5nZSByYW5nZSA9IG5ldyBSZXBhcnNlUmFuZ2UoKTsKLQotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKHN0YXJ0LCBlbmQsICJbIiwgIl0iKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclBhaXIoc3RhcnQsIGVuZCwgIigiLCAiKSIpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAieyIsICJ9IikpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiAocmFuZ2UuaXNWYWxpZCgpKSA/IHJhbmdlIDogbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrSW5zaWRlQnJhY2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJYm9vbGVhbiBiRGVjbGFyYXRpb24gPSBmYWxzZTsKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc0RlY2xhcmF0aW9uVHlwZSh0eXBlKSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQliRGVjbGFyYXRpb24gPSB0cnVlOwotCQl9Ci0JCWlmICghYkRlY2xhcmF0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZSZWdpb24gPSBDU1NVdGlsLmZpbmRQcmV2aW91c1NpZ25pZmljYW50Tm9kZShyZWdpb24pOwotCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCkgewotCQkJCXR5cGUgPSBwcmV2UmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc0RlY2xhcmF0aW9uVHlwZSh0eXBlKSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCQkJYkRlY2xhcmF0aW9uID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFiRGVjbGFyYXRpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFJlZ2lvbiA9IENTU1V0aWwuZmluZE5leHRTaWduaWZpY2FudE5vZGUocmVnaW9uKTsKLQkJCWlmIChuZXh0UmVnaW9uICE9IG51bGwpIHsKLQkJCQl0eXBlID0gbmV4dFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKENTU1JlZ2lvblV0aWwuaXNEZWNsYXJhdGlvblR5cGUodHlwZSkgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkJCWJEZWNsYXJhdGlvbiA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGJEZWNsYXJhdGlvbikgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFJlZ2lvbiA9IGZpbmRSdWxlU3RhcnQocmVnaW9uKTsKLQkJCWlmIChzdGFydFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRSZWdpb24gPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGVuZCk7Ci0JCQkJaWYgKGVuZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IHJlcGFyc2Uoc3RhcnRSZWdpb24sIGVuZFJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpbmRSdWxlU3RhcnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFJlZ2lvbikgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IHN0YXJ0UmVnaW9uOwotCQkvLyBmaW5kICd7JwotCQl3aGlsZSAocmVnaW9uICE9IG51bGwgJiYgcmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQlyZWdpb24gPSByZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJfQotCQkvLyBpZiAocmVnaW9uID09IHN0YXJ0UmVnaW9uKSB7Ci0JCS8vIHJldHVybiBudWxsOwotCQkvLyB9Ci0JCS8vIGVsc2UKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7IC8vICd7JyBpcyBmb3VuZAotCQkJcmVnaW9uID0gcmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCQlpZiAoaXNMZWFkaW5nRGVjbGFyYXRpb25UeXBlKHJlZ2lvbi5nZXRUeXBlKCkpKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNMZWFkaW5nRGVjbGFyYXRpb25UeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT05UX0ZBQ0UgfHwgQ1NTUmVnaW9uVXRpbC5pc1NlbGVjdG9yVHlwZSh0eXBlKSk7Ci0JfQotCi0JLy8gcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50Ci0JLy8gY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJvdW5kcnlDYXNlcygpIHsKLQkvLyByZXR1cm4gc3BlY2lhbFBvc2l0aW9uVXBkYXRlKGZTdGFydCwgZlN0YXJ0ICsgZkxlbmd0aFRvUmVwbGFjZSAtIDEpOwotCS8vIH0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFJlcGFyc2VSYW5nZSBnZXRVcGRhdGVSYW5nZUZvclBhaXIoaW50IHN0YXJ0LCBpbnQgZW5kLCBTdHJpbmcgb3BlbmVyLCBTdHJpbmcgY2xvc2VyKSB7Ci0JCVN0cmluZ0J1ZmZlciBkZWxldGlvbkJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nQnVmZmVyIGluc2VydGlvbkJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IHF1b3RlTGVuID0gTWF0aC5tYXgob3BlbmVyLmxlbmd0aCgpLCBjbG9zZXIubGVuZ3RoKCkpOwotCQlpZiAoMSA8IHF1b3RlTGVuKSB7Ci0JCQkvKioKLQkJCSAqIGV4KSBvcGVuZXIgPSAiQUJDIiwgY2xvc2VyID0gIlhZWiIgbW9kZWw6IEFCQ0RFRi4uLi4uLi5VVldYWVoKLQkJCSAqIGRlbGV0aW9uOiBDREVGLi4uLi4uLlVWV1ggcHJlL3Bvc3Q6IEFCIC8gWVoKLQkJCSAqLwotCQkJaW50IGFkZFN0YXJ0ID0gc3RhcnQgLSAocXVvdGVMZW4gLSAxKTsKLQkJCWlmICgwIDw9IGFkZFN0YXJ0KSB7Ci0JCQkJU3RyaW5nIGFkZFN0ciA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KGFkZFN0YXJ0LCBxdW90ZUxlbiAtIDEpOwotCQkJCWRlbGV0aW9uQnVmLmFwcGVuZChhZGRTdHIpOwotCQkJCWluc2VydGlvbkJ1Zi5hcHBlbmQoYWRkU3RyKTsKLQkJCX0KLQkJCWRlbGV0aW9uQnVmLmFwcGVuZChmRGVsZXRlZFRleHQpOwotCQkJaW5zZXJ0aW9uQnVmLmFwcGVuZChmQ2hhbmdlcyk7Ci0JCQlpZiAoZW5kICsgKHF1b3RlTGVuIC0gMSkgPCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQkJU3RyaW5nIGFkZFN0ciA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KGVuZCArIDEsIHF1b3RlTGVuIC0gMSk7Ci0JCQkJZGVsZXRpb25CdWYuYXBwZW5kKGFkZFN0cik7Ci0JCQkJaW5zZXJ0aW9uQnVmLmFwcGVuZChhZGRTdHIpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJZGVsZXRpb25CdWYuYXBwZW5kKGZEZWxldGVkVGV4dCk7Ci0JCQlpbnNlcnRpb25CdWYuYXBwZW5kKGZDaGFuZ2VzKTsKLQkJfQotCQlTdHJpbmcgZGVsZXRpb24gPSBkZWxldGlvbkJ1Zi50b1N0cmluZygpOwotCQlTdHJpbmcgaW5zZXJ0aW9uID0gaW5zZXJ0aW9uQnVmLnRvU3RyaW5nKCk7Ci0KLQkJaW50IHJhbmdlU3RhcnQgPSBzdGFydDsKLQkJaW50IHJhbmdlRW5kID0gZW5kOwotCi0JCWlmICgwIDw9IGRlbGV0aW9uLmluZGV4T2Yob3BlbmVyKSB8fCAwIDw9IGRlbGV0aW9uLmluZGV4T2YoY2xvc2VyKSB8fCAwIDw9IGluc2VydGlvbi5pbmRleE9mKG9wZW5lcikgfHwgMCA8PSBpbnNlcnRpb24uaW5kZXhPZihjbG9zZXIpKSB7Ci0JCQlpbnQgcywgZTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHN0YXJ0IDw9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCQkJSVJlZ2lvbiBzdGFydFJlZ2lvbiA9IGdldEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyKCkuZmluZChzdGFydCAtIDEsIG9wZW5lciwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCQlpZiAoc3RhcnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJcyA9IHN0YXJ0UmVnaW9uLmdldE9mZnNldCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcyA9IC0xOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzID0gLTE7Ci0JCQkJfQotCQkJCWlmIChlbmQgPCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpIC0gMSkgewotCQkJCQlJUmVnaW9uIGVuZFJlZ2lvbiA9IGdldEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyKCkuZmluZChlbmQgKyAxLCBjbG9zZXIsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCQlpZiAoZW5kUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCWUgPSBlbmRSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQllID0gLTE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWUgPSAtMTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWlmICgwIDw9IHMpIHsKLQkJCQlyYW5nZVN0YXJ0ID0gTWF0aC5taW4ocmFuZ2VTdGFydCwgcyk7Ci0JCQl9Ci0JCQlpZiAoMCA8PSBlKSB7Ci0JCQkJcmFuZ2VFbmQgPSBNYXRoLm1heChyYW5nZUVuZCwgZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocmFuZ2VTdGFydCA8IHN0YXJ0IHx8IGVuZCA8IHJhbmdlRW5kKSB7Ci0JCQlyZXR1cm4gbmV3IFJlcGFyc2VSYW5nZShyYW5nZVN0YXJ0LCByYW5nZUVuZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGM4M2ExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1NTX0dFTkVSSUMgPSAxMDExMDk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGludCB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2UgPSBudWxsOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgQ1NTX0dFTkVSSUMgOgotCQkJCWluc3RhbmNlID0gbmV3IEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFdhbGtlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFdhbGtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2NmYzNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIgewotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgPSBudWxsOwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZlN0cnVjdHVyZWREb2N1bWVudCA9IG51bGw7Ci0JU3RyaW5nIGZPcmlnaW5hbENoYW5nZXMgPSBudWxsOwotCWludCBmT3JpZ2luYWxPZmZzZXQgPSAwOwotCWludCBmT3JpZ2luYWxMZW5ndGhUb1JlcGxhY2UgPSAwOwotCWludCBmTGVuZ3RoRGlmZmVyZW5jZSA9IDA7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyKCkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIoU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJaW5pdGlhbGl6ZShldmVudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQlyZXR1cm4gZlN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBPbGQgTm9kZXM6IC0tW08xXS0tW08yXS0tW08zXS0tLSA6IC8gXCBDdXJyZW50IE5vZGVzOgotCSAqIC0tLVtDMV0tLS0tLVtDMl0tLS0tLVtDM10tLS0tLVtDNF0tLS0KLQkgKiAKLQkgKiBJbnB1dDogTzEgLT4gT3V0cHV0OiBPMiBJbnB1dDogTzIgLT4gT3V0cHV0OiBPMyBJbnB1dDogTzMgLT4gT3V0cHV0OiBDNAotCSAqIElucHV0OiBDbiAtPiBPdXRwdXQ6IENuKzEKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXROZXh0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0Tm9kZSA9IG51bGw7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCW5leHROb2RlID0gbm9kZS5nZXROZXh0KCk7Ci0JCQlpZiAobmV4dE5vZGUgPT0gbnVsbCkgewotCQkJCWlmIChpc09sZE5vZGUobm9kZSkpIHsKLQkJCQkJLy8gdGhpcyBtYXkgYmUgdGhlIGVuZCBvZiBvbGQgZmxhdG5vZGVzCi0JCQkJCWludCBuZXdTdGFydCA9IG5vZGUuZ2V0RW5kKCkgKyBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJCQkJbmV4dE5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG5ld1N0YXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5leHROb2RlOwotCX0KLQotCS8qKgotCSAqIE9sZCBOb2RlczogLS1bTzFdLS1bTzJdLS1bTzNdLS0tIDogLyBcIEN1cnJlbnQgTm9kZXM6Ci0JICogLS0tW0MxXS0tLS0tW0MyXS0tLS0tW0MzXS0tLS0tW0M0XS0tLQotCSAqIAotCSAqIElucHV0OiBPKiAtPiBPdXRwdXQ6IEM0IElucHV0OiBDbiAtPiBPdXRwdXQ6IENuKzEKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXROZXh0Tm9kZUluQ3VycmVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0Tm9kZSA9IG51bGw7Ci0JCWlmIChpc09sZE5vZGUobm9kZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkRW5kTm9kZSA9IGZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0Lml0ZW0oZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJCWludCBuZXdTdGFydCA9IG9sZEVuZE5vZGUuZ2V0RW5kKCkgKyBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJCW5leHROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuZXdTdGFydCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQluZXh0Tm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBuZXh0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBPbGQgTm9kZXM6IC0tW08xXS0tW08yXS0tW08zXS0tLSA6IC8gXCBDdXJyZW50IE5vZGVzOgotCSAqIC0tLVtDMV0tLS0tLVtDMl0tLS0tLVtDM10tLS0tLVtDNF0tLS0KLQkgKiAKLQkgKiBJbnB1dDogTzEgLT4gT3V0cHV0OiBDMSBJbnB1dDogTzIgLT4gT3V0cHV0OiBPMSBJbnB1dDogTzMgLT4gT3V0cHV0OiBPMgotCSAqIElucHV0OiBDbiAtPiBPdXRwdXQ6IENuLTEKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2Tm9kZSA9IG51bGw7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXByZXZOb2RlID0gbm9kZS5nZXRQcmV2aW91cygpOwotCQkJaWYgKHByZXZOb2RlID09IG51bGwpIHsKLQkJCQlpZiAoaXNPbGROb2RlKG5vZGUpKSB7Ci0JCQkJCS8vIHRoaXMgbWF5IGJlIHRoZSBzdGFydCBvZiBvbGQgZmxhdG5vZGVzCi0JCQkJCWludCBuZXdFbmQgPSBub2RlLmdldFN0YXJ0KCkgLSAxOwotCQkJCQlwcmV2Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV3RW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZXZOb2RlOwotCX0KLQotCS8qKgotCSAqIE9sZCBOb2RlczogLS1bTzFdLS1bTzJdLS1bTzNdLS0tIDogLyBcIEN1cnJlbnQgTm9kZXM6Ci0JICogLS0tW0MxXS0tLS0tW0MyXS0tLS0tW0MzXS0tLS0tW0M0XS0tLQotCSAqIAotCSAqIElucHV0OiBPKiAtPiBPdXRwdXQ6IEMxIElucHV0OiBDbiAtPiBPdXRwdXQ6IENuLTEKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2Tm9kZUluQ3VycmVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2Tm9kZSA9IG51bGw7Ci0JCWlmIChpc09sZE5vZGUobm9kZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RhcnROb2RlID0gZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuaXRlbSgwKTsKLQkJCWludCBuZXdFbmQgPSBvbGRTdGFydE5vZGUuZ2V0U3RhcnQoKSAtIDE7Ci0JCQlwcmV2Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV3RW5kKTsKLQkJfQotCQllbHNlIGlmIChub2RlICE9IG51bGwpIHsKLQkJCXByZXZOb2RlID0gbm9kZS5nZXRQcmV2aW91cygpOwotCQl9Ci0JCXJldHVybiBwcmV2Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJZk9yaWdpbmFsQ2hhbmdlcyA9IGV2ZW50LmdldFRleHQoKTsKLQkJZk9yaWdpbmFsT2Zmc2V0ID0gZXZlbnQuZ2V0T2Zmc2V0KCk7Ci0JCWZPcmlnaW5hbExlbmd0aFRvUmVwbGFjZSA9IGV2ZW50LmdldExlbmd0aCgpOwotCQlmTGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGZPcmlnaW5hbENoYW5nZXMsIGZPcmlnaW5hbExlbmd0aFRvUmVwbGFjZSk7Ci0KLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIHsKLQkJCWZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0ID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkgZXZlbnQpLmdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJfQotCQllbHNlIHsKLQkJCWZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT2xkTm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJYm9vbGVhbiBiT2xkID0gZmFsc2U7Ci0JCWlmIChmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCAhPSBudWxsKSB7Ci0JCQlFbnVtZXJhdGlvbiBlID0gZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuZWxlbWVudHMoKTsKLQkJCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJaWYgKGUubmV4dEVsZW1lbnQoKSA9PSBub2RlKSB7Ci0JCQkJCWJPbGQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJPbGQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OGFjMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRleHQuSUNTU1BhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTIGV4dGVuZHMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciB7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBsZWdhbFR5cGVzID0gbmV3IFN0cmluZ1tde0lDU1NQYXJ0aXRpb25zLlNUWUxFLCBJQ1NTUGFydGl0aW9ucy5DT01NRU5ULCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuREVGQVVMVF9QQVJUSVRJT059OwotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIElDU1NQYXJ0aXRpb25zLlNUWUxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJcmV0dXJuIGxlZ2FsVHlwZXM7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1MoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+VGhpcyBwYXJ0aXRpb25lciBicmVha3MgQ1NTIGludG8gb25seSB0d28gdHlwZXMgb2YgcGFydGl0aW9ucyBkZXBlbmRpbmcgb24gdGhlIHJlZ2lvbiB0eXBlOjxiciAvPgotCSAqIDxjb2RlPkNPTU1FTlQ8L2NvZGU+PGJyIC8+Ci0JICogPGNvZGU+U1RZTEU8L2NvZGU+PC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciNnZXRQYXJ0aXRpb25UeXBlKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uLCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlTdHJpbmcgcGFydGl0aW9uVHlwZTsKLQkJCi0JCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCi0JCWlmKHJlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCXBhcnRpdGlvblR5cGUgPSBJQ1NTUGFydGl0aW9ucy5DT01NRU5UOwotCQl9IGVsc2UgewotCQkJcGFydGl0aW9uVHlwZSA9IHN1cGVyLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCQl9Ci0JCQotCQlyZXR1cm4gcGFydGl0aW9uVHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQWJzdHJhY3RDc3NUcmF2ZXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9BYnN0cmFjdENzc1RyYXZlcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjExYjU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9BYnN0cmFjdENzc1RyYXZlcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgc2hvcnQgVFJBVl9DT05UID0gMDsKLQlwdWJsaWMgc3RhdGljIHNob3J0IFRSQVZfUFJVTkUgPSAxOwotCXB1YmxpYyBzdGF0aWMgc2hvcnQgVFJBVl9TVE9QID0gMjsKLQlwcm90ZWN0ZWQgamF2YS51dGlsLlN0YWNrIHRyYXZTdGFjazsKLQlwcml2YXRlIGJvb2xlYW4gZlRyYXZlcnNlSW1wb3J0ZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZlRyYXZlcnNlSW1wb3J0Rmlyc3QgPSBmYWxzZTsKLQlwcml2YXRlIGphdmEudXRpbC5WZWN0b3IgdHJhdmVyc2VkU2hlZXRzOwotCi0JLyoqCi0JICogQ3NzUHJvcENNTm9kZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdENzc1RyYXZlcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NNb2RlbAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFwcGx5KElDU1NNb2RlbCBtb2RlbCkgewotCQlhcHBseShtb2RlbC5nZXREb2N1bWVudCgpKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBhcHBseShJQ1NTTm9kZSByb290KSB7Ci0JCXRyYXZTdGFjayA9IG5ldyBTdGFjaygpOwotCQlpZiAoZlRyYXZlcnNlSW1wb3J0ZWQpIHsKLQkJCXRyYXZlcnNlZFNoZWV0cyA9IG5ldyBWZWN0b3IoKTsKLQkJCWlmIChyb290ICE9IG51bGwgJiYgcm9vdC5nZXRPd25lckRvY3VtZW50KCkgIT0gbnVsbCAmJiByb290LmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFU0hFRVRfTk9ERSkgewotCQkJCXRyYXZlcnNlZFNoZWV0cy5hZGQocm9vdC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gZmlyc3QgY2FsbCBiZWdpbigpCi0JCWJlZ2luKHJvb3QpOwotCi0JCS8vIHRyYXZlcnNlCi0JCXRyYXZlcnNlKHJvb3QpOwotCi0JCS8vIGxhc3QgY2FsbCBlbmQoKQotCQllbmQocm9vdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBiZWdpbihJQ1NTTm9kZSBub2RlKSB7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBlbmQoSUNTU05vZGUgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzVHJhdmVyc2VJbXBvcnRlZCgpIHsKLQkJcmV0dXJuIGZUcmF2ZXJzZUltcG9ydGVkOwotCX0KLQotCi0JcHJvdGVjdGVkIHNob3J0IHBvc3ROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChzaG9ydCkgMDsKLQl9Ci0KLQotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChzaG9ydCkgMDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VHJhdmVyc2VJbXBvcnRlZAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFRyYXZlcnNlSW1wb3J0ZWQoYm9vbGVhbiBuZXdUcmF2ZXJzZUltcG9ydGVkKSB7Ci0JCWZUcmF2ZXJzZUltcG9ydGVkID0gbmV3VHJhdmVyc2VJbXBvcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VHJhdmVyc2VJbXBvcnRGaXJzdAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFRyYXZlcnNlSW1wb3J0Rmlyc3QoYm9vbGVhbiBuZXdUcmF2ZXJzZUltcG9ydEZpcnN0KSB7Ci0JCWZUcmF2ZXJzZUltcG9ydEZpcnN0ID0gbmV3VHJhdmVyc2VJbXBvcnRGaXJzdDsKLQl9Ci0KLQotCXByaXZhdGUgZmluYWwgc2hvcnQgdHJhdmVyc2UoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQotCQl0cmF2U3RhY2sucHVzaChub2RlKTsKLQotCQkvLyBwcmUtYWN0aW9uCi0JCXNob3J0IHJldCA9IHByZU5vZGUobm9kZSk7Ci0KLQkJaWYgKHJldCA9PSBUUkFWX0NPTlQpIHsKLQkJCWlmIChmVHJhdmVyc2VJbXBvcnRlZCAmJiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSkpIHsKLQkJCQlJQ1NTSW1wb3J0UnVsZSBydWxlID0gKElDU1NJbXBvcnRSdWxlKSBub2RlOwotCQkJCS8vIHRyYXZlcnNlIGV4dGVybmFsIHN0eWxlLXNoZWV0Ci0JCQkJSUNTU1N0eWxlU2hlZXQgc2hlZXQgPSAoSUNTU1N0eWxlU2hlZXQpIHJ1bGUuZ2V0U3R5bGVTaGVldCgpOwotCQkJCWlmIChzaGVldCAhPSBudWxsICYmICF0cmF2ZXJzZWRTaGVldHMuY29udGFpbnMoc2hlZXQpKSB7IC8vIHByZXZlbnQKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBsb29wCi0JCQkJCXRyYXZlcnNlZFNoZWV0cy5hZGQoc2hlZXQpOwotCQkJCQlzaG9ydCByZXRFeHQgPSB0cmF2ZXJzZShzaGVldCk7Ci0JCQkJCWlmIChyZXRFeHQgPT0gVFJBVl9TVE9QKSB7Ci0JCQkJCQl0cmF2U3RhY2sucG9wKCk7Ci0JCQkJCQlyZXR1cm4gcmV0RXh0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBjb2xsZWN0IGNoaWxkcmVuCi0JCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJQ1NTTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJaWYgKGZUcmF2ZXJzZUltcG9ydEZpcnN0KSB7Ci0JCQkJQXJyYXlMaXN0IG90aGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSkKLQkJCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJCWVsc2UKLQkJCQkJCW90aGVycy5hZGQoY2hpbGQpOwotCQkJCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJCWNoaWxkcmVuLmFkZEFsbChvdGhlcnMpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gdHJhdmVyc2UgY2hpbGRyZW4KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCQljaGlsZCA9IChJQ1NTTm9kZSkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJCXNob3J0IHJldENoaWxkID0gdHJhdmVyc2UoY2hpbGQpOwotCQkJCWlmIChyZXRDaGlsZCA9PSBUUkFWX1NUT1ApIHsKLQkJCQkJdHJhdlN0YWNrLnBvcCgpOwotCQkJCQlyZXR1cm4gcmV0Q2hpbGQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHJldCA9PSBUUkFWX1NUT1ApIHsKLQkJCXRyYXZTdGFjay5wb3AoKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQkvLyBwb3N0LWFjdGlvbgotCQlyZXQgPSBwb3N0Tm9kZShub2RlKTsKLQotCQl0cmF2U3RhY2sucG9wKCk7Ci0JCXJldHVybiAocmV0ID09IFRSQVZfUFJVTkUpID8gVFJBVl9DT05UIDogcmV0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NDbGFzc1RyYXZlcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU0NsYXNzVHJhdmVyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YTM1M2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU0NsYXNzVHJhdmVyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01lZGlhUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9ySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NpbXBsZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVTaGVldDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ2xhc3NUcmF2ZXJzZXIgZXh0ZW5kcyBBYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0KLQlBcnJheUxpc3QgZkNsYXNzTmFtZXM7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTQ2xhc3NUcmF2ZXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZENsYXNzTmFtZXMoSUNTU1N0eWxlUnVsZSBydWxlKSB7Ci0JCUlDU1NTZWxlY3Rvckxpc3Qgc2VsZWN0b3JMaXN0ID0gcnVsZS5nZXRTZWxlY3RvcnMoKTsKLQkJSXRlcmF0b3IgaVNlbGVjdG9yID0gc2VsZWN0b3JMaXN0LmdldEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpU2VsZWN0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJQ1NTU2VsZWN0b3Igc2VsZWN0b3IgPSAoSUNTU1NlbGVjdG9yKSBpU2VsZWN0b3IubmV4dCgpOwotCQkJSXRlcmF0b3IgaUl0ZW0gPSBzZWxlY3Rvci5nZXRJdGVyYXRvcigpOwotCQkJd2hpbGUgKGlJdGVtLmhhc05leHQoKSkgewotCQkJCUlDU1NTZWxlY3Rvckl0ZW0gaXRlbSA9IChJQ1NTU2VsZWN0b3JJdGVtKSBpSXRlbS5uZXh0KCk7Ci0JCQkJaWYgKGl0ZW0uZ2V0SXRlbVR5cGUoKSA9PSBJQ1NTU2VsZWN0b3JJdGVtLlNJTVBMRSkgewotCQkJCQlJQ1NTU2ltcGxlU2VsZWN0b3Igc2VsID0gKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbTsKLQkJCQkJaW50IG5DbGFzc2VzID0gc2VsLmdldE51bU9mQ2xhc3NlcygpOwotCQkJCQlmb3IgKGludCBpQ2xhc3MgPSAwOyBpQ2xhc3MgPCBuQ2xhc3NlczsgaUNsYXNzKyspIHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBzZWwuZ2V0Q2xhc3MoaUNsYXNzKTsKLQkJCQkJCWlmICghZkNsYXNzTmFtZXMuY29udGFpbnMoY2xhc3NOYW1lKSkKLQkJCQkJCQlmQ2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJlZ2luKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKGZDbGFzc05hbWVzID09IG51bGwpCi0JCQlmQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmQoSUNTU05vZGUgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENsYXNzTmFtZXMoKSB7Ci0JCXJldHVybiAoZkNsYXNzTmFtZXMgIT0gbnVsbCkgPyBmQ2xhc3NOYW1lcyA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IHBvc3ROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIFRSQVZfQ09OVDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCXNob3J0IHJldDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQlhZGRDbGFzc05hbWVzKChJQ1NTU3R5bGVSdWxlKSBub2RlKTsKLQkJCXJldCA9IFRSQVZfUFJVTkU7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0IHx8IG5vZGUgaW5zdGFuY2VvZiBJQ1NTTWVkaWFSdWxlIHx8IG5vZGUgaW5zdGFuY2VvZiBJQ1NTSW1wb3J0UnVsZSkgewotCQkJcmV0ID0gVFJBVl9DT05UOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0ID0gVFJBVl9QUlVORTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NMaW5rQ29udmVydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTTGlua0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzdkY2QzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NMaW5rQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTTGlua0NvbnZlcnRlciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0JFR0lOID0gInVybCgiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTkQgPSAiKSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEX1FVT1RFID0gIlwiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTX1FVT1RFID0gIlwnIjsgLy8kTk9OLU5MUy0xJAotCi0JSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTTGlua0NvbnZlcnRlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCWJhc2VNb2RlbCA9IG1vZGVsOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwgJiYgKChJQ1NTTW9kZWwpIG1vZGVsKS5nZXRTdHlsZVNoZWV0VHlwZSgpICE9IElDU1NNb2RlbC5FWFRFUk5BTCkgewotCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgKChJQ1NTTW9kZWwpIG1vZGVsKS5nZXRPd25lckRPTU5vZGUoKTsKLQkJCWJhc2VNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZEZ1bmMoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICghdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChVUkxfQkVHSU4pKSB7Ci0JCQkvLyBwYV9UT0RPIGNzcyBwcmVmCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCQl2YWx1ZSA9IENTU1V0aWwuc3RyaXBRdW90ZXModmFsdWUpOwotCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHZhbHVlLCBxdW90ZSk7Ci0JCQlTdHJpbmcgc3RyID0gVVJMX0JFR0lOOwotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJc3RyID0gc3RyLnRvVXBwZXJDYXNlKCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihzdHIpOwotCQkJYnVmLmFwcGVuZChxdW90ZSk7Ci0JCQlidWYuYXBwZW5kKHZhbHVlKTsKLQkJCWJ1Zi5hcHBlbmQocXVvdGUpOwotCQkJYnVmLmFwcGVuZChVUkxfRU5EKTsKLQkJCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJlZ2luKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKGJhc2VNb2RlbCA9PSBudWxsKSB7Ci0JCQliYXNlTW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJaWYgKGJhc2VNb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCAmJiAoKElDU1NNb2RlbCkgYmFzZU1vZGVsKS5nZXRTdHlsZVNoZWV0VHlwZSgpICE9IElDU1NNb2RlbC5FWFRFUk5BTCkgewotCQkJCUlET01Ob2RlIHhtbE5vZGUgPSAoSURPTU5vZGUpICgoSUNTU01vZGVsKSBiYXNlTW9kZWwpLmdldE93bmVyRE9NTm9kZSgpOwotCQkJCWJhc2VNb2RlbCA9IHhtbE5vZGUuZ2V0TW9kZWwoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVcmwoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXNvdXJjZSA9IHNvdXJjZS50cmltKCkudG9Mb3dlckNhc2UoKTsKLQkJcmV0dXJuIHNvdXJjZS5zdGFydHNXaXRoKFVSTF9CRUdJTik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlBSSU1JVElWRVZBTFVFX05PREUpIHsKLQkJCXRvQWJzb2x1dGUoKENTU1ZhbHVlKSBub2RlKTsKLQkJfSBlbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFKSB7Ci0JCQlJQ1NTSW1wb3J0UnVsZSBpUnVsZSA9IChJQ1NTSW1wb3J0UnVsZSkgbm9kZTsKLQkJCWlSdWxlLnNldEhyZWYodG9BYnNvbHV0ZShhZGRGdW5jKGlSdWxlLmdldEhyZWYoKSkpKTsKLQkJfQotCQlyZXR1cm4gVFJBVl9DT05UOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUZ1bmMoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIEVNUFRZOwotCQlTdHJpbmcgZmllbGQgPSB2YWx1ZS50cmltKCk7Ci0JCS8vIGZpcnN0IDogdGVhciAidXJsKC4uLi4pIgotCQlpZiAoZmllbGQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFVSTF9CRUdJTikpIHsKLQkJCWludCB1cmwgPSBmaWVsZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoVVJMX0JFR0lOKTsKLQkJCWludCBlbmRQYXJlbnRoZXNpcyA9IGZpZWxkLmxhc3RJbmRleE9mKFVSTF9FTkQpOwotCQkJaWYgKGVuZFBhcmVudGhlc2lzID4gdXJsKSB7Ci0JCQkJZmllbGQgPSBmaWVsZC5zdWJzdHJpbmcodXJsICsgNCwgZW5kUGFyZW50aGVzaXMpOwotCQkJfSBlbHNlCi0JCQkJZmllbGQgPSBmaWVsZC5zdWJzdHJpbmcodXJsICsgNCk7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpcEZ1bmMoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIEVNUFRZOwotCQkvLyBmaXJzdCA6IHRlYXIgInVybCguLi4uKSIKLQkJU3RyaW5nIGZpZWxkID0gcmVtb3ZlRnVuYyh2YWx1ZSk7Ci0JCS8vIHNlY29uZCA6IHRlYXIgcXVvdGF0aW9ucwotCQlpZiAoZmllbGQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKERfUVVPVEUpKSB7Ci0JCQlpbnQgcXVvdGUgPSBmaWVsZC5pbmRleE9mKERfUVVPVEUpOwotCQkJaW50IGVuZCA9IGZpZWxkLmxhc3RJbmRleE9mKERfUVVPVEUpOwotCQkJaWYgKGVuZCA+IHF1b3RlKSB7Ci0JCQkJZmllbGQgPSBmaWVsZC5zdWJzdHJpbmcocXVvdGUgKyAxLCBlbmQpOwotCQkJfSBlbHNlCi0JCQkJZmllbGQgPSBmaWVsZC5zdWJzdHJpbmcocXVvdGUgKyAxKTsKLQkJfSBlbHNlIGlmIChmaWVsZC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoU19RVU9URSkpIHsKLQkJCWludCBxdW90ZSA9IGZpZWxkLmluZGV4T2YoU19RVU9URSk7Ci0JCQlpbnQgZW5kID0gZmllbGQubGFzdEluZGV4T2YoU19RVU9URSk7Ci0JCQlpZiAoZW5kID4gcXVvdGUpIHsKLQkJCQlmaWVsZCA9IGZpZWxkLnN1YnN0cmluZyhxdW90ZSArIDEsIGVuZCk7Ci0JCQl9IGVsc2UKLQkJCQlmaWVsZCA9IGZpZWxkLnN1YnN0cmluZyhxdW90ZSArIDEpOwotCQl9Ci0KLQkJcmV0dXJuIGZpZWxkLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvQWJzb2x1dGUoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoaXNVcmwoc291cmNlKSkgewotCQkJU3RyaW5nIHVybCA9IENTU1BhdGhTZXJ2aWNlLmdldEFic29sdXRlVVJMKGJhc2VNb2RlbCwgc3RyaXBGdW5jKHNvdXJjZSkpOwotCQkJcmV0dXJuICh1cmwgIT0gbnVsbCkgPyBhZGRGdW5jKHVybCkgOiAoVVJMX0JFR0lOICsgVVJMX0VORCk7Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB0b0Fic29sdXRlKENTU1ZhbHVlIG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUpIHsKLQkJCUlDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSA9IChJQ1NTUHJpbWl0aXZlVmFsdWUpIG5vZGU7Ci0JCQlpZiAodmFsdWUuZ2V0UHJpbWl0aXZlVHlwZSgpID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkkpIHsKLQkJCQl2YWx1ZS5zZXRWYWx1ZShzdHJpcEZ1bmModG9BYnNvbHV0ZShVUkxfQkVHSU4gKyB2YWx1ZS5nZXRTdHJpbmdWYWx1ZSgpICsgVVJMX0VORCkpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1BhdGhTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTUGF0aFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUzMjgxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTUGF0aFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTUGF0aFNlcnZpY2UgewotCi0JLy8gQ29uc3RhbnRzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVVUkxTQ0hFTUUgPSAiZmlsZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxDT0xPTiA9ICI6IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFVVJMUFJFRklYID0gRklMRVVSTFNDSEVNRSArIFVSTENPTE9OICsgIi8vIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTFNFUEFSQVRPUiA9ICIvIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWJzb2x1dGVVUkwoSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIFN0cmluZyByZWYpIHsKLQkJU3RyaW5nIGFic0xpbmsgPSBVUkxNb2RlbFByb3ZpZGVyQ1NTLnJlc29sdmVVUkkoYmFzZU1vZGVsLCByZWYsIHRydWUpOwotCQlTdHJpbmcgdXJsID0gYWJzTGluazsKLQkJaWYgKGFic0xpbmsgIT0gbnVsbCkgeyAvLyBpZiBpdCBoYXMgbm90IHNjaGVtZSwgd2UgbXVzdCBhZGQgImZpbGUiCi0JCQkJCQkJCS8vIHNjaGVtZQotCQkJdHJ5IHsKLQkJCQluZXcgamF2YS5uZXQuVVJMKGFic0xpbmspOwotCQkJfQotCQkJY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGFic0xpbmspOwotCQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJCXVybCA9IHRvVVJMKHBhdGgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZQotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbGUgbG9jYXRpb24yRmlsZShTdHJpbmcgbG9jYXRpb24pIHsKLQkJUGF0aCBwYXRoID0gbmV3IFBhdGgobG9jYXRpb24pOwotCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCWlmIChmaWxlID09IG51bGwgJiYgcGF0aC5zZWdtZW50Q291bnQoKSA+IDEpCi0JCQlmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgZmlsZSBVUkwgZm9yIHRoZSBwYXRoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b1VSTChJUGF0aCBwYXRoKSB7Ci0JCXBhdGggPSBuZXcgUGF0aChwYXRoLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpKTsKLQkJaWYgKHBhdGguaXNVTkMoKSA9PSB0cnVlKSB7Ci0JCQkvLyBpdCdzIFVOQy4gcmV0dXJuIGZpbGU6Ly9ob3N0L2Zvby9iYXIvYmF6Lmh0bWwKLQkJCXJldHVybiBGSUxFVVJMU0NIRU1FICsgVVJMQ09MT04gKyBwYXRoLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIEZJTEVVUkxQUkVGSVggKyBVUkxTRVBBUkFUT1IgKyBwYXRoLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1NlbGVjdG9yTGlzdEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NTZWxlY3Rvckxpc3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzdiODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1NlbGVjdG9yTGlzdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NTZWxlY3Rvckxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBDU1NTZWxlY3Rvckxpc3RGYWN0b3J5IHsKLQlzdGF0aWMgc3luY2hyb25pemVkIHB1YmxpYyBDU1NTZWxlY3Rvckxpc3RGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NTZWxlY3Rvckxpc3RGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgSUNTU1NlbGVjdG9yTGlzdCBjcmVhdGVTZWxlY3Rvckxpc3QoU3RyaW5nIHNlbGVjdG9yU3RyaW5nKSB7Ci0JCXJldHVybiBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChzZWxlY3RvclN0cmluZyk7Ci0JfQotCi0KLQlwcml2YXRlIENTU1NlbGVjdG9yTGlzdEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTU2VsZWN0b3JMaXN0RmFjdG9yeSBmSW5zdGFuY2U7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjk4YTA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeSBleHRlbmRzIENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5Q29udGV4dCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeSBmSW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU1N0eWxlRGVjbGFyYXRpb24KLQkgKiBAcGFyYW0gZGVjbAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU1N0eWxlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbGFyYXRpb24gY3JlYXRlU3R5bGVEZWNsYXJhdGlvbihJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmIChkZWNsID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlDU1NTdHlsZURlY2xhcmF0aW9uIG5ld05vZGUgPSBjcmVhdGVTdHlsZURlY2xhcmF0aW9uKCk7Ci0KLQkJaWYgKG5ld05vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZk93bmVyRG9jdW1lbnQgPSBuZXdOb2RlOwotCQljbG9uZUNoaWxkTm9kZXMoZGVjbCwgbmV3Tm9kZSk7Ci0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1V0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzN2MxYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NSZWdpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTVXRpbCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVidWdPdXQoU3RyaW5nIHN0cikgewotCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiY3NzIHdhcm5pbmc6ICIgKyBzdHIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JLy8gcHVibGljIHN0YXRpYyBWZWN0b3IgZXh0cmFjdE1lZGlhQ29udGVudHMoVmVjdG9yIHJlZ2lvbnMpIHsKLQkvLyBWZWN0b3IgbWVkaWEgPSBuZXcgVmVjdG9yKCk7Ci0JLy8gaWYgKHJlZ2lvbnMgPT0gbnVsbCkgeyByZXR1cm4gbWVkaWE7IH0KLQkvLwotCS8vIGJvb2xlYW4gYlJlYWR5ID0gdHJ1ZTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGkgPSByZWdpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkvLyBJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24paS5uZXh0KCk7Ci0JLy8gaWYgKHJlZ2lvbiA9PSBudWxsKSB7IGNvbnRpbnVlOyB9Ci0JLy8gU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCS8vIGlmIChiUmVhZHkpIHsKLQkvLyBpZiAodHlwZSA9PSBJREVOVCkgewotCS8vIG1lZGlhLmFkZEVsZW1lbnQocmVnaW9uLmdldFRleHQoKSk7Ci0JLy8gYlJlYWR5ID0gZmFsc2U7Ci0JLy8gfQotCS8vIH0gZWxzZSB7Ci0JLy8gaWYgKHR5cGUgPT0gQ09NTUEpIHsKLQkvLyBiUmVhZHkgPSB0cnVlOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8gcmV0dXJuIG1lZGlhOwotCS8vIH0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRyYWN0U3RyaW5nQ29udGVudHMoU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIHN0cmlwUXVvdGVzKHRleHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dHJhY3RVcmlDb250ZW50cyhTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgY29udGVudHMgPSB0ZXh0LnRyaW0oKTsKLQkJaWYgKGNvbnRlbnRzLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgidXJsKCIpICYmIC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGVudHMudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiKSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJLy8gc3RyaXAgInVybCgiLCAiKSIKLQkJCWNvbnRlbnRzID0gY29udGVudHMuc3Vic3RyaW5nKDQsIGNvbnRlbnRzLmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJY29udGVudHMgPSBzdHJpcFF1b3Rlcyhjb250ZW50cyk7Ci0KLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kTmV4dFNpZ25pZmljYW50Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0Tm9kZSkgewotCQlpZiAoc3RhcnROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IHN0YXJ0Tm9kZS5nZXROZXh0KCk7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShub2RlKTsKLQkJCWlmICh0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RPICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQykgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kTm9kZUJhY2t3YXJkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZE5vZGUsIFN0cmluZyB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZTsKLQkJZm9yIChub2RlID0gc3RhcnROb2RlOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFByZXZpb3VzKCkpIHsKLQkJCWlmIChub2RlLmdldFN0YXJ0T2Zmc2V0KCkgPCBlbmROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQlub2RlID0gbnVsbDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUobm9kZSkgPT0gdHlwZSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kTm9kZUZvcndhcmQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kTm9kZSwgU3RyaW5nIHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlOwotCQlmb3IgKG5vZGUgPSBzdGFydE5vZGU7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dCgpKSB7Ci0JCQlpZiAoZW5kTm9kZS5nZXRTdGFydE9mZnNldCgpIDwgbm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJbm9kZSA9IG51bGw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKG5vZGUpID09IHR5cGUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZFByZXZpb3VzU2lnbmlmaWNhbnROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnROb2RlKSB7Ci0JCWlmIChzdGFydE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gc3RhcnROb2RlLmdldFByZXZpb3VzKCk7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShub2RlKTsKLQkJCWlmICh0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RPICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQykgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQkJbm9kZSA9IG5vZGUuZ2V0UHJldmlvdXMoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc1N0cmluZyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIG5hbWUgPSBvYmplY3QuZ2V0Q2xhc3MoKS50b1N0cmluZygpOwotCQkJaW50IGxhc3RQZXJpb2QgPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcobGFzdFBlcmlvZCArIDEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOREVGSU5FRDsKLQkJfQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOREVGSU5FRDsKLQkJfQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJcmV0dXJuIHJlZ2lvbi5nZXRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TGVuZ3RoRGlmZmVyZW5jZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdOb2RlcywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkTm9kZXMpIHsKLQkJaW50IG5ld0xlbiA9IGdldFRleHRMZW5ndGgobmV3Tm9kZXMpOwotCQlpbnQgb2xkTGVuID0gZ2V0VGV4dExlbmd0aChvbGROb2Rlcyk7Ci0JCXJldHVybiBuZXdMZW4gLSBvbGRMZW47Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVnaW9uVGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAocmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByZWdpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlidWYuYXBwZW5kKGZsYXROb2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VGV4dExlbmd0aChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBub2RlcykgewotCQlpbnQgbGVuZ3RoID0gMDsKLQotCQlpZiAobm9kZXMgIT0gbnVsbCkgewotCQkJZm9yIChFbnVtZXJhdGlvbiBlID0gbm9kZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCQlsZW5ndGggKz0gZmxhdE5vZGUuZ2V0VGV4dCgpLmxlbmd0aCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlbmd0aChDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJaWYgKHRva2VuID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0b2tlbi5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04pCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHRva2VuLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJZG91YmxlIG51bWJlciA9IERvdWJsZS5wYXJzZURvdWJsZSh0b2tlbi5pbWFnZSk7Ci0JCQlpZiAobnVtYmVyID09IDAuMCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VsZWN0b3JUZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyB0eXBlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShyZWdpb24pOwotCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc1NlbGVjdG9yQmVnZ2luaW5nVHlwZSh0eXBlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTikgewotCQkJLy8gU3RyaW5nIHRleHQgPSBmbGF0Tm9kZS5nZXRUZXh0KCk7Ci0JCQkvLyBpZiAodGV4dCAhPSBudWxsICYmIHRleHQuaW5kZXhPZignLicpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQkJLy8gfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwUXVvdGVzKFN0cmluZyB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRzID0gdGV4dC50cmltKCk7Ci0JCWlmICgyIDw9IGNvbnRlbnRzLmxlbmd0aCgpKSB7Ci0JCQljaGFyIGZpcnN0ID0gY29udGVudHMuY2hhckF0KDApOwotCQkJY2hhciBsYXN0ID0gY29udGVudHMuY2hhckF0KGNvbnRlbnRzLmxlbmd0aCgpIC0gMSk7Ci0JCQlpZiAoKGZpcnN0ID09ICdcIicgJiYgbGFzdCA9PSAnXCInKSB8fCAoZmlyc3QgPT0gJ1wnJyAmJiBsYXN0ID09ICdcJycpKSB7Ci0JCQkJY29udGVudHMgPSBjb250ZW50cy5zdWJzdHJpbmcoMSwgY29udGVudHMubGVuZ3RoKCkgLSAxKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGV0ZWN0UXVvdGUoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGRlZmF1bHRRdW90ZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gZGVmYXVsdFF1b3RlOwotCQlmaW5hbCBTdHJpbmcgRF9RVU9URSA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIFNfUVVPVEUgPSAiXCciOyAvLyROT04tTkxTLTEkCi0KLQkJaW50IGRJbmRleCA9IHNvdXJjZS5pbmRleE9mKERfUVVPVEUpOwotCQlpbnQgc0luZGV4ID0gc291cmNlLmluZGV4T2YoU19RVU9URSk7Ci0JCWlmIChkSW5kZXggPCAwICYmIHNJbmRleCA8IDApIHsKLQkJCXJldHVybiBkZWZhdWx0UXVvdGU7Ci0JCX0KLQkJZWxzZSBpZiAoZEluZGV4IDwgMCkgewotCQkJcmV0dXJuIERfUVVPVEU7Ci0JCX0KLQkJZWxzZSBpZiAoc0luZGV4IDwgMCkgewotCQkJcmV0dXJuIFNfUVVPVEU7Ci0JCX0KLQkJZWxzZSBpZiAoZEluZGV4IDwgc0luZGV4KSB7Ci0JCQlyZXR1cm4gU19RVU9URTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBEX1FVT1RFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0cmlwU3Vycm91bmRpbmdTcGFjZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlpZiAocmVnaW9ucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd2hpbGUgKCFyZWdpb25zLmlzRW1wdHkoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJcmVnaW9ucy5yZW1vdmUoMCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQl3aGlsZSAoIXJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCXJlZ2lvbnMucmVtb3ZlKHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9JbXBvcnRSdWxlQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvSW1wb3J0UnVsZUNvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmM5MTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9JbXBvcnRSdWxlQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRSdWxlQ29sbGVjdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQWJzdHJhY3RDc3NUcmF2ZXJzZXIgewotCi0JcHJvdGVjdGVkIGphdmEudXRpbC5WZWN0b3IgcnVsZXMgPSBuZXcgVmVjdG9yKCk7Ci0JcHJvdGVjdGVkIElDU1NTdHlsZVNoZWV0IHRhcmdldCA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSW1wb3J0UnVsZUNvbGxlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VHJhdmVyc2VJbXBvcnRlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEltcG9ydFJ1bGVDb2xsZWN0b3IoSUNTU1N0eWxlU2hlZXQgc2hlZXQpIHsKLQkJc3VwZXIoKTsKLQkJdGFyZ2V0ID0gc2hlZXQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGphdmEudXRpbC5WZWN0b3IgZ2V0UnVsZXMoKSB7Ci0JCXJldHVybiBydWxlczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFSVUxFX05PREUgfHwgbm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFU0hFRVRfTk9ERSkgewotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJfQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSkgewotCQkJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0JCQkJSUNTU0ltcG9ydFJ1bGUgaW1wID0gKElDU1NJbXBvcnRSdWxlKSBub2RlOwotCQkJCWlmIChpbXAuZ2V0U3R5bGVTaGVldCgpICE9IHRhcmdldCkKLQkJCQkJcmV0dXJuIFRSQVZfUFJVTkU7Ci0JCQl9Ci0JCQlpZiAoIXJ1bGVzLmNvbnRhaW5zKG5vZGUpKQotCQkJCXJ1bGVzLmFkZChub2RlKTsKLQkJfQotCQlyZXR1cm4gVFJBVl9QUlVORTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvSW1wb3J0ZWRDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9JbXBvcnRlZENvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjJhN2FhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9JbXBvcnRlZENvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydGVkQ29sbGVjdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQWJzdHJhY3RDc3NUcmF2ZXJzZXIgewotCi0JcHJvdGVjdGVkIGphdmEudXRpbC5WZWN0b3IgZXh0ZXJuYWxzID0gbmV3IFZlY3RvcigpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEltcG9ydGVkQ29sbGVjdG9yKCkgewotCQlzdXBlcigpOwotCQlzZXRUcmF2ZXJzZUltcG9ydGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4dGVybmFscygpIHsKLQkJcmV0dXJuIGV4dGVybmFsczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFSVUxFX05PREUpIHsKLQkJCXJldHVybiBUUkFWX0NPTlQ7Ci0JCX0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUpIHsKLQkJCWlmICghZXh0ZXJuYWxzLmNvbnRhaW5zKG5vZGUpKSB7Ci0JCQkJZXh0ZXJuYWxzLmFkZChub2RlKTsKLQkJCX0KLQkJCXJldHVybiBUUkFWX0NPTlQ7Ci0JCX0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUpIHsKLQkJCXJldHVybiBUUkFWX0NPTlQ7Ci0JCX0KLQkJcmV0dXJuIFRSQVZfUFJVTkU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1JlZ2lvbkl0ZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvUmVnaW9uSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkMDAyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvUmVnaW9uSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVnaW9uSXRlcmF0b3IgewotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VyRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCXByaXZhdGUgaW50IGN1cnJlbnQgPSAtMTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBSZWdpb25JdGVyYXRvcihJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgaW50IGluZGV4KSB7Ci0JCXN1cGVyKCk7Ci0KLQkJcmVzZXQoc3RydWN0dXJlZERvY3VtZW50LCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFJlZ2lvbkl0ZXJhdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlzdXBlcigpOwotCQlyZXNldChmbGF0Tm9kZSwgcmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBjdXJEb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlpZiAoZG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGN1cnJlbnQgPCAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY3VycmVudCA8IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1ByZXYoKSB7Ci0JCS8vIHRoZSBzYW1lIGFzIGhhc05leHQoKQotCQlyZXR1cm4gaGFzTmV4dCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBuZXh0KCkgewotCQlpZiAoZG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoY3VycmVudCA8IDAgfHwgZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpID09IG51bGwgfHwgZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA8PSBjdXJyZW50KQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmdldChjdXJyZW50KTsKLQkJY3VyRG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbjsKLQotCQlpZiAoY3VycmVudCA+PSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpIC0gMSkgewotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCQljdXJyZW50ID0gLTE7Ci0JCX0KLQkJY3VycmVudCsrOwotCi0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIHByZXYoKSB7Ci0JCWlmIChkb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChjdXJyZW50IDwgMCB8fCBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkgPT0gbnVsbCB8fCBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpIDw9IGN1cnJlbnQpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KGN1cnJlbnQpOwotCQljdXJEb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uOwotCi0JCWlmIChjdXJyZW50ID09IDApIHsKLQkJCWRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCWlmIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJCWN1cnJlbnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpOwotCQkJZWxzZQotCQkJCWN1cnJlbnQgPSAwOwotCQl9Ci0JCWN1cnJlbnQtLTsKLQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBpbnQgaW5kZXgpIHsKLQkJZG9jdW1lbnRSZWdpb24gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXgpOwotCQljdXJEb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uOwotCQlpZiAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXgpOwotCQkJY3VycmVudCA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5pbmRleE9mKHJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIGZsYXROb2RlICE9IG51bGwpIHsKLQkJCXRoaXMuZG9jdW1lbnRSZWdpb24gPSBmbGF0Tm9kZTsKLQkJCWN1ckRvY3VtZW50UmVnaW9uID0gZmxhdE5vZGU7Ci0JCQljdXJyZW50ID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmluZGV4T2YocmVnaW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3Rpb25Db2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3Rpb25Db2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU0NGNhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvU2VsZWN0aW9uQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdGlvbkNvbGxlY3RvciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQotCWludCBzdGFydCwgZW5kOwotCUxpc3Qgc2VsZWN0ZWROb2RlczsKLQotCS8qKgotCSAqIFNlbGVjdGlvbkNvbGxlY3RvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTZWxlY3Rpb25Db2xsZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmVnaW4oSUNTU05vZGUgbm9kZSkgewotCQlzZWxlY3RlZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlbGVjdGVkTm9kZXMoKSB7Ci0JCWlmIChzZWxlY3RlZE5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdChzZWxlY3RlZE5vZGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCUluZGV4ZWRSZWdpb24gaU5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPD0gZW5kICYmIHN0YXJ0IDwgaU5vZGUuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuU1RZTEVTSEVFVF9OT0RFKSB7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBpRmlyc3RDaGlsZCA9IChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlJbmRleGVkUmVnaW9uIGlMYXN0Q2hpbGQgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJCQlpZiAoaUZpcnN0Q2hpbGQgPT0gbnVsbCB8fCBzdGFydCA8IGlGaXJzdENoaWxkLmdldFN0YXJ0T2Zmc2V0KCkgfHwgaUxhc3RDaGlsZC5nZXRFbmRPZmZzZXQoKSA8PSBlbmQpCi0JCQkJCXNlbGVjdGVkTm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJfQotCQlpZiAoaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA+IGVuZCkKLQkJCXJldHVybiBUUkFWX1NUT1A7Ci0JCWVsc2UKLQkJCXJldHVybiBUUkFWX1BSVU5FOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ2lvbihpbnQgbmV3U3RhcnQsIGludCBuZXdFbmQpIHsKLQkJc3RhcnQgPSBuZXdTdGFydDsKLQkJZW5kID0gbmV3RW5kOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3RvclZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1NlbGVjdG9yVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNTJlMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1NlbGVjdG9yVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU1NlbGVjdG9yTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9ySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NpbXBsZVNlbGVjdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBTZWxlY3RvclZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgU2VsZWN0b3JWYWxpZGF0b3IuCi0JICovCi0JcHVibGljIFNlbGVjdG9yVmFsaWRhdG9yKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZUZXh0ID0gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRleHQgY29uc2lzdHMgb2Ygb25lIENMQVNTIHNlbGVjdG9yLiBzeW50YXggY2hlY2sKLQkgKiBpcyBhIGxpdHRsZSBsb29zZSAoLjEyMyBpcyBwYXNzZWQpCi0JICogCi0JICogIi5jbGFzcyIgLT4gdHJ1ZSAiLjEyMyIgLT4gdHJ1ZSAiLmNsYXNzICwgLmNsYXNzMiIgLT4gZmFsc2UKLQkgKiAiLmNsYXNzLmNsYXNzMiIgLT4gZmFsc2UgIi4xMjN7fSIgLT4gZmFsc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NsYXNzKCkgewotCQlJQ1NTU2ltcGxlU2VsZWN0b3Igc2VsZWN0b3IgPSBnZXRPbmx5T25lU2ltcGxlU2VsZWN0b3IoKTsKLQkJaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLQkJCXJldHVybiAoc2VsZWN0b3IuZ2V0TmFtZSgpLmxlbmd0aCgpID09IDAgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZBdHRyaWJ1dGVzKCkgPT0gMCAmJiBzZWxlY3Rvci5nZXROdW1PZkNsYXNzZXMoKSA9PSAxICYmIHNlbGVjdG9yLmdldE51bU9mSURzKCkgPT0gMCAmJiBzZWxlY3Rvci5nZXROdW1PZlBzZXVkb05hbWVzKCkgPT0gMCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGV4dCBjb25zaXN0cyBvZiBvbmUgSUQgc2VsZWN0b3IuCi0JICogCi0JICogIiNJRCIgLT4gdHJ1ZSAiSDEjbXlJRCIgLT4gZmFsc2UgIiNhYmN7fSIgLT4gZmFsc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lEKCkgewotCQlJQ1NTU2ltcGxlU2VsZWN0b3Igc2VsZWN0b3IgPSBnZXRPbmx5T25lU2ltcGxlU2VsZWN0b3IoKTsKLQkJaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLQkJCXJldHVybiAoc2VsZWN0b3IuZ2V0TmFtZSgpLmxlbmd0aCgpID09IDAgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZBdHRyaWJ1dGVzKCkgPT0gMCAmJiBzZWxlY3Rvci5nZXROdW1PZkNsYXNzZXMoKSA9PSAwICYmIHNlbGVjdG9yLmdldE51bU9mSURzKCkgPT0gMSAmJiBzZWxlY3Rvci5nZXROdW1PZlBzZXVkb05hbWVzKCkgPT0gMCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIG92ZXJhbGwgY2hlY2sKLQkgKiAKLQkgKiAiUCNob2dlOTggKyAqOmhvdmVyID4gQTpsaW5rLCBBLmV4dGVybmFsOnZpc2l0ZWQiIC0+IHRydWUgIkgxIEgyIHt9IiAtPgotCSAqIGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcGFyc2UoKTsKLQkJcmV0dXJuIChmU2VsZWN0b3JMaXN0ICE9IG51bGwgJiYgZlNlbGVjdG9yTGlzdC5nZXRFcnJvckNvdW50KCkgPT0gMCk7Ci0JfQotCi0JcHJpdmF0ZSBJQ1NTU2ltcGxlU2VsZWN0b3IgZ2V0T25seU9uZVNpbXBsZVNlbGVjdG9yKCkgewotCQlwYXJzZSgpOwotCQlpZiAoZlNlbGVjdG9yTGlzdCAhPSBudWxsICYmIGZTZWxlY3Rvckxpc3QuZ2V0TGVuZ3RoKCkgPT0gMSkgewotCQkJSUNTU1NlbGVjdG9yIHNlbGVjdG9yID0gZlNlbGVjdG9yTGlzdC5nZXRTZWxlY3RvcigwKTsKLQkJCWludCBuSXRlbSA9IHNlbGVjdG9yLmdldExlbmd0aCgpOwotCQkJaWYgKG5JdGVtID09IDEpIHsKLQkJCQlJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0gPSBzZWxlY3Rvci5nZXRJdGVtKDApOwotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgSUNTU1NpbXBsZVNlbGVjdG9yKSB7Ci0JCQkJCXJldHVybiAoSUNTU1NpbXBsZVNlbGVjdG9yKSBpdGVtOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2UoKSB7Ci0JCWlmIChmU2VsZWN0b3JMaXN0ID09IG51bGwpIHsKLQkJCWlmIChmVGV4dCAhPSBudWxsKSB7Ci0JCQkJZlNlbGVjdG9yTGlzdCA9IG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKGZUZXh0KTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBTdHJpbmcgZlRleHQgPSBudWxsOwotCXByaXZhdGUgSUNTU1NlbGVjdG9yTGlzdCBmU2VsZWN0b3JMaXN0ID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3RvcnNDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3RvcnNDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU5M2ZmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvU2VsZWN0b3JzQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdG9yc0NvbGxlY3RvciBleHRlbmRzIEFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQotCXByb3RlY3RlZCBWZWN0b3Igc2VsZWN0b3JzID0gbmV3IFZlY3RvcigpOwotCXByb3RlY3RlZCBWZWN0b3Igc2VsZWN0b3JzVG9Bdm9pZCA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU2VsZWN0b3JzQ29sbGVjdG9yKCkgewotCQlzdXBlcigpOwotCQlzZXRUcmF2ZXJzZUltcG9ydGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3RvclRvQXZvaWQoSUNTU1NlbGVjdG9yIHNlbFRvQXZvaWQpIHsKLQkJaWYgKHNlbFRvQXZvaWQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHNlbGVjdG9yc1RvQXZvaWQgPT0gbnVsbCkKLQkJCXNlbGVjdG9yc1RvQXZvaWQgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJaWYgKCFzZWxlY3RvcnNUb0F2b2lkLmNvbnRhaW5zKHNlbFRvQXZvaWQpKQotCQkJc2VsZWN0b3JzVG9Bdm9pZC5hZGQoc2VsVG9Bdm9pZCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0b3JUb0F2b2lkKElDU1NTdHlsZVJ1bGUgcnVsZSkgewotCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSBydWxlLmdldFNlbGVjdG9ycygpOwotCQlJdGVyYXRvciBpdCA9IGxpc3QuZ2V0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSUNTU1NlbGVjdG9yIHNlbCA9IChJQ1NTU2VsZWN0b3IpIGl0Lm5leHQoKTsKLQkJCWFkZFNlbGVjdG9yVG9Bdm9pZChzZWwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldFNlbGVjdG9ycygpIHsKLQkJcmV0dXJuIHNlbGVjdG9yczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVSVUxFX05PREUpIHsKLQkJCUlDU1NTdHlsZVJ1bGUgcnVsZSA9IChJQ1NTU3R5bGVSdWxlKSBub2RlOwotCQkJSUNTU1NlbGVjdG9yTGlzdCBsaXN0ID0gcnVsZS5nZXRTZWxlY3RvcnMoKTsKLQkJCUl0ZXJhdG9yIGl0ID0gbGlzdC5nZXRJdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHNlbGVjdG9yc1RvQXZvaWQgIT0gbnVsbCAmJiBzZWxlY3RvcnNUb0F2b2lkLmNvbnRhaW5zKG9iaikpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmICghc2VsZWN0b3JzLmNvbnRhaW5zKG9iaikpCi0JCQkJCXNlbGVjdG9ycy5hZGQob2JqKTsKLQkJCX0KLQkJCXJldHVybiBUUkFWX1BSVU5FOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUpIHsKLQkJCXJldHVybiBUUkFWX0NPTlQ7Ci0JCX0KLQkJcmV0dXJuIFRSQVZfUFJVTkU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0b3JzVG9Bdm9pZChqYXZhLnV0aWwuVmVjdG9yIG5ld1NlbGVjdG9yc1RvQXZvaWQpIHsKLQkJc2VsZWN0b3JzVG9Bdm9pZCA9IG5ld1NlbGVjdG9yc1RvQXZvaWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1VSTEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1VSTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDVlMTA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9VUkxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5QYXRoSGVscGVyOwotCi0vKioKLSAqIEh5cGVybGluayBtYW5hZ2VyLiBQcm92ZWQgdXNlZnVsIHNlcnZpY2VzIGxpa2UgbGluayBjb252ZXJzaW9uIEFuIHV0aWxpdHkKLSAqIGNsYXNzIHRvIGhlbHAgb3RoZXIgcGFyc3JlIG1vZHVsZXMgdG8gY29udmVydCBsaW5rcwotICovCi1wdWJsaWMgY2xhc3MgVVJMSGVscGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MX1NFQVJDSF9TSUcgPSAiZmlsZTovIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0xfU0lHID0gImZpbGU6Ly8vIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJFTEFUSVZFX1BBVEhfU0lHID0gIi4uIjsvLyROT04tTkxTLTEkCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JXQVJEX1NMQVNIID0gIi8iOy8vJE5PTi1OTFMtMSQJCi0JcHJpdmF0ZSBVUkwgZkJhc2VVcmwgPSBudWxsOyAvLyBiYXNlIHVybC4gYXNzdW1lZCB0byBhIGFic3VsdXRlIHVybAotCXByaXZhdGUgU3RyaW5nIGZCYXNlVXJsU3RyaW5nID0gbnVsbDsKLQlwcml2YXRlIFVSTCBmRG9jUm9vdCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRvY1Jvb3RTdHJpbmcgPSBudWxsOwotCi0JcHVibGljIFVSTEhlbHBlcihTdHJpbmcgYmFzZVVybCkgewotCQlpbml0aWFsaXplKGJhc2VVcmwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBVUkxIZWxwZXIoU3RyaW5nIGJhc2VVcmwsIFN0cmluZyBkb2NSb290KSB7Ci0JCWluaXRpYWxpemUoYmFzZVVybCwgZG9jUm9vdCk7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lhbCBhZHVqdXN0IGZvciBmaWxlIHVybAotCSAqLwotCXB1YmxpYyBTdHJpbmcgYWRqdXN0RmlsZVByb3RvY29sVXJsKFN0cmluZyB1cmwpIHsKLQkJaWYgKHVybC5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0xfU0VBUkNIX1NJRykpIHsKLQkJCXVybCA9IEZJTEVfUFJPVE9DT0xfU0lHICsgdXJsLnN1YnN0cmluZyhGSUxFX1BST1RPQ09MX1NFQVJDSF9TSUcubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY29udmVydChTdHJpbmcgdXJsLCBVUkwgYmFzZVVybCwgU3RyaW5nIHVybFN0cmluZykgewotCQlTdHJpbmcgYWJzVXJsID0gdXJsOwotCQlpZiAoYmFzZVVybCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCS8vIGRvIHNwZWNpYWwgdGhpbmcgZmlsZSBwcm90b2NvbAotCQkJCWlmIChiYXNlVXJsLmdldFByb3RvY29sKCkuZXF1YWxzSWdub3JlQ2FzZSgiZmlsZSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQkvLyByZW1vdmUgdGhlIGZpc3QKLQkJCQkJaWYgKHVybC5zdGFydHNXaXRoKCIvIikpLy8kTk9OLU5MUy0xJAotCQkJCQkJdXJsID0gdXJsLnN1YnN0cmluZygxKTsKLQkJCQkJLy8gZW1wdHkgc3RyaW5nIGNhdXNlcyBtYWxmb3JtZWQgZXhjZXB0aW9uCi0JCQkJCVN0cmluZyB0ZW1wVXJsID0gdXJsOwotCQkJCQlpZiAoIiIuZXF1YWxzKHVybCkpLy8kTk9OLU5MUy0xJAotCQkJCQkJdGVtcFVybCA9ICIgIjsvLyROT04tTkxTLTEkCi0JCQkJCVVSTCBuZXdVcmwgPSBuZXcgVVJMKGJhc2VVcmwsIHRlbXBVcmwpOwotCQkJCQkvLyBkbyBleHRyYSBtYXRoIGZvciBmaWxlIHByb3RvY29sIHRvIHN1cHBvcnQgaWUgYmFzZWQKLQkJCQkJYWJzVXJsID0gYWRqdXN0RmlsZVByb3RvY29sVXJsKG5ld1VybC50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVVSTCBuZXdVcmwgPSBuZXcgVVJMKGZCYXNlVXJsLCB1cmwpOwotCQkJCQlhYnNVcmwgPSBuZXdVcmwudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1lKSB7Ci0JCQl9Ci0JCQkvLyBjb252ZXJ0IGV2ZXJ5dGhpbmcgdG8gZm9yd2FyZCBzbGFzaAotCQkJYWJzVXJsID0gUGF0aEhlbHBlci5zd2l0Y2hUb0ZvcndhcmRTbGFzaGVzKGFic1VybCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB0aGUgZ2l2ZW4gbWF5IGJlIGJhc2VkIG9uIGZpbGUKLQkJCWlmICh1cmxTdHJpbmcgIT0gbnVsbCkgewotCQkJCS8vIHN3aWNoIHRoZSB1cmwgdG8gcHJvcGVyIGRpcmVjdGlvbgotCQkJCXVybCA9IFBhdGhIZWxwZXIucmVtb3ZlTGVhZGluZ1NlcGFyYXRvcih1cmwpOwotCQkJCUZpbGUgZmxlID0gbmV3IEZpbGUodXJsU3RyaW5nLCB1cmwpOwotCQkJCWFic1VybCA9IGZsZS5nZXRQYXRoKCk7Ci0KLQkJCX0KLQkJCS8vIGNvbnZlcnQgZXZlcnl0aGluZyB0byBmb3J3YXJkIHNsYXNoCi0JCQlhYnNVcmwgPSBQYXRoSGVscGVyLnN3aXRjaFRvRm9yd2FyZFNsYXNoZXMoYWJzVXJsKTsKLQotCQkJLy8gaWYgdGhlIHBhdGggZW5kcyB3aXRoICIuLiIgd2UgbmVlZCB0byBhZGQgYSB0ZXJtaW5hdGluZyBzbGFzaAotCQkJLy8gb3IKLQkJCS8vIGVsc2UgdGhlIGxpbmsgd2lsbCBub3QgYmUgcmVzb2x2ZWQgY29ycmVjdGx5LiAoaXQgd2lsbCBsb29rCi0JCQkvLyBsaWtlCi0JCQkvLyAvdXJsL3BhdGgvdG8vc29tZXdoZXJlLy4uIGluc3RlYWQgb2YgL3VybC9wYXRoL3RvLwotCQkJaWYgKGFic1VybC5lbmRzV2l0aChGT1JXQVJEX1NMQVNIICsgUkVMQVRJVkVfUEFUSF9TSUcpKSB7Ci0JCQkJYWJzVXJsICs9IEZPUldBUkRfU0xBU0g7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZXNvbHZlIHJlbGF0aXZlIHBhdGggdG8gYWJzb2x1dGUKLQkJYWJzVXJsID0gUGF0aEhlbHBlci5hZGp1c3RQYXRoKGFic1VybCk7Ci0JCXJldHVybiBhYnNVcmw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoU3RyaW5nIGJhc2VVcmwsIFN0cmluZyBkb2NSb290KSB7Ci0JCS8vCi0JCS8vIEZpbmQgb3V0IHdoZXRoZXIgYmFlcyB1cmwgaXMgYSB1cmwgb3IgZmlsZSBuYW1lCi0JCS8vCi0JCXRyeSB7Ci0JCQlTdHJpbmcgdGVtcCA9IFBhdGhIZWxwZXIuYXBwZW5kVHJhaWxpbmdVUkxTbGFzaChiYXNlVXJsKTsKLQkJCWZCYXNlVXJsID0gbmV3IFVSTCh0ZW1wKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgewotCQl9Ci0JCWlmIChmQmFzZVVybCA9PSBudWxsKSB7Ci0JCQkvLyBpdCBpcyBhIGZpbGUgYmFzZWQgdXJsCi0JCQlmQmFzZVVybFN0cmluZyA9IGJhc2VVcmw7Ci0JCX0KLQotCQkvLyBkbyB0aGUgc2FtZSBmb3IgZG9jIHJvb3QKLQkJaWYgKGRvY1Jvb3QgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgdGVtcCA9IFBhdGhIZWxwZXIuYXBwZW5kVHJhaWxpbmdVUkxTbGFzaChkb2NSb290KTsKLQkJCQlmRG9jUm9vdCA9IG5ldyBVUkwodGVtcCk7Ci0KLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7Ci0JCQl9Ci0JCQlpZiAoZkRvY1Jvb3QgPT0gbnVsbCkgewotCQkJCS8vIGl0IGlzIGEgZmlsZSBiYXNlZCB1cmwKLQkJCQlmRG9jUm9vdFN0cmluZyA9IGRvY1Jvb3Q7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBnaXZlbiB1cmwgdG8gYSBhYm9sdXRlIHVybCB1c2luZyB0aGUgYmFzZSB1cmwgSW5wdXQgdXJsIGNhbgotCSAqIGJlIG9mIGFueSBvdGhlIGZvbGxvd2luZyBmb3JtYXQgQWJzb2x1dGUgdXJscyAtLS0tLS0tLS0tLS0tLSAuCi0JICogaHR0cDovL3d3dy5mb28uY29tLyAuIGh0dHA6Ly93d3cuZm9vLmNvbSAuIGh0dHA6Ly93d3cuZm9vLmNvbS9mb2xkZXIgLgotCSAqIGh0dHA6Ly93d3cuZm9vLmNvbS9mb2xkZXIvIC4gaHR0cDovL3d3dy5mb28uY29tL2luZGV4Lmh0bWwgLgotCSAqIGh0dHA6Ly93d3cuZm9vLmNvbS9mb2xkZXIvaW5kZXguaHRtbCAuCi0JICogaHR0cDovL3d3dy5mb28uY29tL2ZvbGRlci8uLi9pbmRleC5odG1sIFVybCByZWxhdGl2ZSBvbiBkb2N1bWVudCByb290Ci0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAuIC8gLiAvZm9sZGVyIC4gL2luZGV4Lmh0bWwgLgotCSAqIC9mb2xkZXIvaW5kZXguaHRtbCAuIC9mb2xkZXIvLi4vaW5kZXguaHRtbAotCSAqIAotCSAqIFNlbGYgcmVsYXRpdmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAuIGluZGV4Lmh0bWwgLiAuL2luZGV4Lmh0bWwgLgotCSAqIC4uL2luZGV4Lmh0bWwgLiBmb2xkZXIvaW5kZXguaHRtbCAuIGZvbGRlci8uLi9pbmRleC5odG1sCi0JICogCi0JICogZmlsZSBiYXNlZCB1cmwgYWRkcyBhbm90aGVyIGRpbWVuc2lvbiBzaW5jZSBpdCBkb2Vzbid0IGhhdmUgYSBkb2N1bWVudAotCSAqIHJvb3QgU28gdXNlcyBmRG9jUm9vdCBpZiBwcm92aWRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9BYnNvbHV0ZShTdHJpbmcgdXJsKSB7Ci0JCVN0cmluZyBhYnNVcmwgPSB1cmw7Ci0KLQkJVVJMIG5ld1VybCA9IG51bGw7Ci0JCS8vIHRyeSB0byBzZWUgaXQgaXMgYSBhYnNvbHV0ZSB1cmwKLQkJdHJ5IHsKLQkJCW5ld1VybCA9IG5ldyBVUkwodXJsKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1lKSB7Ci0JCX0KLQkJLy8gaWYgZG9jdW1lbnQgcm9vdCBpcyBwcm92aWRlZAotCQkvLyBkbyBzcGVjaWFsIGNhc2UKLQkJaWYgKG5ld1VybCA9PSBudWxsKSB7Ci0JCQlpZiAoZkRvY1Jvb3QgPT0gbnVsbCAmJiBmRG9jUm9vdFN0cmluZyA9PSBudWxsKSB7Ci0JCQkJLy8gdHJ5IHRvIGNoZWNrIHJlbGF0aXZlIHVybAotCQkJCWFic1VybCA9IGNvbnZlcnQodXJsLCBmQmFzZVVybCwgZkJhc2VVcmxTdHJpbmcpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gZG9jIHJvb3QgaXMgcHJvdmlkZWQKLQkJCQkvLyBpZiB0aGUgdXJsIGlzIGEgZG9jIHJvb3QgYmFzZWQgdXNlIGRvYyByb290Ci0KLQkJCQlpZiAodXJsLnN0YXJ0c1dpdGgoIi8iKSkvLyROT04tTkxTLTEkCi0JCQkJCWFic1VybCA9IGNvbnZlcnQodXJsLCBmRG9jUm9vdCwgZkRvY1Jvb3RTdHJpbmcpOwotCQkJCWVsc2UKLQkJCQkJYWJzVXJsID0gY29udmVydCh1cmwsIGZCYXNlVXJsLCBmQmFzZVVybFN0cmluZyk7Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYWJzVXJsOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgZnJvbSBhbiBhYnNvbHV0ZSB1cmwgdG8gcmVsYXRpdmUgdXJsIGJhc2VkIG9uIHRoZSBnaXZlbiB1cmwKLQkgKiBCb3RoIGFyZSBhc3N1bWVkIHRvIGJlIGFibHN1dGUgdXJsCi0JICovCi0JcHVibGljIFN0cmluZyB0b1JlbGF0aXZlKFN0cmluZyB1cmwsIFN0cmluZyBkb2N1bWVudFVybCkgewotCQlTdHJpbmcgb3V0cHV0ID0gdXJsOwotCQkvLyBhc3N1bWluZyBib3RoIHVybHMgYXJlIGFic29sdXRlCi0JCXRyeSB7Ci0JCQlVUkwgaW5wdXRVcmwgPSBuZXcgVVJMKHVybCk7Ci0JCQlVUkwgZG9jVXJsID0gbmV3IFVSTChkb2N1bWVudFVybCk7Ci0JCQkvLyBmaWx0ZXIgb3V0IGlmIHRoZSB1cmxzIGFyZSBub3QgZnJvIHRoZSBzYW1lIGRvbWFpbgotCQkJaWYgKCFpbnB1dFVybC5nZXRQcm90b2NvbCgpLmVxdWFscyhkb2NVcmwuZ2V0UHJvdG9jb2woKSkgfHwgIWlucHV0VXJsLmdldEhvc3QoKS5lcXVhbHMoZG9jVXJsLmdldEhvc3QoKSkgfHwgaW5wdXRVcmwuZ2V0UG9ydCgpICE9IGRvY1VybC5nZXRQb3J0KCkpCi0JCQkJcmV0dXJuIG91dHB1dDsKLQkJCS8vIGJvdGggdXJsIGFyZSBjb21pbmcgZm9ybSB0aGUgc2FtZSBwbGFjZQotCQkJLy8gc3RyaXAgb2ZmIHRoZSBkb21haW4gcGFydHMKLQkJCVN0cmluZyBpbnB1dE5hbWUgPSBpbnB1dFVybC5nZXRGaWxlKCk7Ci0JCQlTdHJpbmcgZG9jTmFtZSA9IGRvY1VybC5nZXRGaWxlKCk7Ci0JCQlvdXRwdXQgPSBQYXRoSGVscGVyLmNvbnZlcnRUb1JlbGF0aXZlKGlucHV0TmFtZSwgZG9jTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZSkgewotCQkJb3V0cHV0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gb3V0cHV0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9VUkxNb2RlbFByb3ZpZGVyQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvVVJMTW9kZWxQcm92aWRlckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjE4MGQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9VUkxNb2RlbFByb3ZpZGVyQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VBbHJlYWR5RXhpc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuUGF0aEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Qcm9qZWN0UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgVVJMTW9kZWxQcm92aWRlckNTUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX01PREVMX0ZPUl9SRUFEID0gMTsKLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX05FV19NT0RFTF9GT1JfUkVBRCA9IDI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9NT0RFTF9GT1JfRURJVCA9IDM7Ci0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9ORVdfTU9ERUxfRk9SX0VESVQgPSA0OwotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUFEX0JVRkZFUl9TSVpFID0gNDA5NjsKLQkvLyBJTW9kZWxNYW5hZ2VyCi0JcHJpdmF0ZSBJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgVVJMTW9kZWxQcm92aWRlckNTUygpIHsKLQkJc3VwZXIoKTsKLQotCQkvLyBvYnRhaW4gbW9kZWwgbWFuYWdlcgotCQltb2RlbE1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSBJRCBmcm9tIGEgZmlsZW5hbWUuIFRoaXMgbXVzdCBiZSBzYW1lIGFzCi0JICogRmlsZU1vZGVsUHJvdmlkZXIuY2FsY3VsYXRlSWQoSUZpbGUpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNhbGN1bGF0ZUlkKElQYXRoIGZ1bGxJUGF0aCkgewotCQlyZXR1cm4gZnVsbElQYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+YmFzZU1vZGVsPC9jb2RlPjogdGhlIG1vZGVsIGNvbnRhaW5pbmcgdGhlIGxpbmsKLQkgKiA8Y29kZT5yZWY8L2NvZGU+OiB0aGUgbGluayBVUkwgc3RyaW5nCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldENvbW1vbk1vZGVsRm9yKGZpbmFsIElTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsLCBmaW5hbCBTdHJpbmcgcmVmLCBmaW5hbCBpbnQgd2hpY2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGZpcnN0LCBjcmVhdGUgYWJzb2x1dGUgdXJsCi0JCVN0cmluZyBhYnNVUkwgPSByZXNvbHZlVVJJKGJhc2VNb2RlbCwgcmVmLCB0cnVlKTsKLQkJaWYgKChhYnNVUkwgPT0gbnVsbCkgfHwgKGFic1VSTC5sZW5ndGgoKSA9PSAwKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBuZWVkIHRvIHJlbW92ZSBmaWxlOi8vIHNjaGVtZSBpZiBuZWNlc3NhcnkKLQkJdHJ5IHsKLQkJCWZpbmFsIFVSTCBhVVJMID0gbmV3IFVSTChhYnNVUkwpOwotCQkJLy8gQW4gYWN0dWFsIFVSTCB3YXMgZ2l2ZW4sIG9ubHkgZmlsZTovLy8gaXMgc3VwcG9ydGVkCi0JCQkvLyByZXNvbHZlIGl0IGJ5IGZpbmRpbmcgdGhlIGZpbGUgaXQgcG9pbnRzIHRvCi0JCQlpZiAoIWFVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoInBsYXRmb3JtIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikgJiYgKGFVUkwuZ2V0SG9zdCgpLmVxdWFscygibG9jYWxob3N0IikgfHwgYVVSTC5nZXRIb3N0KCkubGVuZ3RoKCkgPT0gMCkpIHsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJYWJzVVJMID0gYVVSTC5nZXRGaWxlKCk7Ci0JCQkJCWZpbmFsIElQYXRoIGlwYXRoID0gbmV3IFBhdGgoYWJzVVJMKTsKLQkJCQkJLy8gaWYgcGF0aCBoYXMgYSBkZXZpY2UsIGFuZCBpZiBpdCBiZWdpbnMgd2l0aAotCQkJCQkvLyBJUGF0aC5TRVBBUkFUT1IsIHJlbW92ZSBpdAotCQkJCQlmaW5hbCBTdHJpbmcgZGV2aWNlID0gaXBhdGguZ2V0RGV2aWNlKCk7Ci0JCQkJCWlmICgoZGV2aWNlICE9IG51bGwpICYmIChkZXZpY2UubGVuZ3RoKCkgPiAwKSkgewotCQkJCQkJaWYgKGRldmljZS5jaGFyQXQoMCkgPT0gSVBhdGguU0VQQVJBVE9SKSB7Ci0JCQkJCQkJZmluYWwgU3RyaW5nIG5ld0RldmljZSA9IGRldmljZS5zdWJzdHJpbmcoMSk7Ci0JCQkJCQkJYWJzVVJMID0gaXBhdGguc2V0RGV2aWNlKG5ld0RldmljZSkudG9TdHJpbmcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWZ1RXhjKSB7Ci0JCX0KLQotCQkvLyBuZXh0LCBkZWNpZGUgcHJvamVjdAotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJZmluYWwgSVBhdGggZnVsbElQYXRoID0gbmV3IFBhdGgoYWJzVVJMKTsKLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSB3b3Jrc3BhY2UuZ2V0Q29udGFpbmVyRm9yTG9jYXRpb24oZnVsbElQYXRoKTsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkvLyBmdWxsSVBhdGggZG9lc24ndCBleGlzdCBpbiB3b3Jrc3BhY2UKLQkJCXByb2plY3QgPSBjb250YWluZXIuZ2V0UHJvamVjdCgpOwotCQl9Ci0KLQkJLy8gSWYgSFRNTCBkb2N1bWVudCBoYXMgYSBsaW5rIHRvIGFuIGV4dGVybiBDU1Mgd2hpY2ggaXMgbm90IGluCi0JCS8vIElQcm9qZWN0Ci0JCS8vIHdvcmtzcGFjZS5nZXRDb250YWluZXJGb3JMb2F0aW9uKCkgbWF5IHJldHVybiBudWxsLiBXZSBuZWVkIHRvIHRha2UKLQkJLy8gY2FyZQotCQkvLyBvZiB0aGlzIGNhc2UKLQotCQkvLyBub3csIGdldCBhYnNVUkwncyBJRmlsZQotCQlpZiAoKHByb2plY3QgIT0gbnVsbCkgJiYgKHByb2plY3QuZ2V0TG9jYXRpb24oKS5pc1ByZWZpeE9mKGZ1bGxJUGF0aCkgPT0gZmFsc2UpKSB7Ci0JCQkvLyBpdCdzIGF0IG91dHNpZGUgb2YgUHJvamVjdAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJSVBhdGggZmlsZVBhdGggPSBmdWxsSVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhwcm9qZWN0LmdldExvY2F0aW9uKCkuc2VnbWVudENvdW50KCkpOwotCQkJSUZpbGUgZmlsZSA9IChmaWxlUGF0aCAhPSBudWxsICYmICFmaWxlUGF0aC5pc0VtcHR5KCkpID8gcHJvamVjdC5nZXRGaWxlKGZpbGVQYXRoKSA6IG51bGw7Ci0JCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCS8vIG9idGFpbiBtb2RlbAotCQkJaWYgKHdoaWNoID09IEdFVF9NT0RFTF9GT1JfRURJVCkgewotCQkJCW1vZGVsID0gZ2V0TW9kZWxGb3JFZGl0KGZpbGUpOwotCQkJfQotCQkJZWxzZSBpZiAod2hpY2ggPT0gR0VUX01PREVMX0ZPUl9SRUFEKSB7Ci0JCQkJbW9kZWwgPSBnZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0JCQl9Ci0KLQkJCS8vIHNldHRpbmcgc3luY2hyb25pemF0aW9uIHN0YW1wIGlzIElNb2RlbE1hbmFnZXIncyBjbGllbnQncwotCQkJLy8gcmVzcG9uc2liaWxpdHkKLQkJCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldFN5bmNocm9uaXphdGlvblN0YW1wKCkgPT0gSVJlc291cmNlLk5VTExfU1RBTVApCi0JCQkJbW9kZWwucmVzZXRTeW5jaHJvbml6YXRpb25TdGFtcChmaWxlKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBpZCA9IG51bGw7Ci0JCQlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG51bGw7Ci0JCQkvLyBvYnRhaW4gcmVzb2x2ZXIKLQkJCVVSSVJlc29sdmVyIHJlc29sdmVyID0gKHByb2plY3QgIT0gbnVsbCkgPyAoVVJJUmVzb2x2ZXIpIHByb2plY3QuZ2V0QWRhcHRlcihVUklSZXNvbHZlci5jbGFzcykgOiBudWxsOwotCQkJaWYgKHJlc29sdmVyID09IG51bGwpIHsKLQkJCQkvLyBQcm9qZWN0UmVzb2x2ZXIgY2FuIHRha2UgY2FyZSBvZiB0aGUgY2FzZSBpZiBwcm9qZWN0IGlzCi0JCQkJLy8gbnVsbC4KLQkJCQlyZXNvbHZlciA9IG5ldyBQcm9qZWN0UmVzb2x2ZXIocHJvamVjdCk7Ci0JCQl9Ci0JCQlpZiAocmVzb2x2ZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyB0aGVyZSBpcyBubyBwcm9qZWN0LiB3ZSBjYW4ndCBleHBlY3QgSVByb2plY3QgaGVscCB0byBjcmVhdGUKLQkJCS8vIGlkL2lucHV0U3RyZWFtCi0JCQlGaWxlIGZpbGUgPSBmdWxsSVBhdGgudG9GaWxlKCk7Ci0KLQkJCS8vIG9iYXRpbiBpZAotCQkJaWQgPSBjYWxjdWxhdGVJZChmdWxsSVBhdGgpOwotCi0JCQkvLyBvYnRhaW4gSW5wdXRTdHJlYW0KLQkJCXRyeSB7Ci0JCQkJaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJfQotCQkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7Ci0JCQkJLy8gdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIG9yIHdlIGRvbid0IGhhdmUgcmVhZCBwZXJtaXNzaW9uCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCS8vIG9idGFpbiBtb2RlbAotCQkJdHJ5IHsKLQkJCQlpZiAod2hpY2ggPT0gR0VUX01PREVMX0ZPUl9FRElUKSB7Ci0JCQkJCW1vZGVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KGlkLCBpblN0cmVhbSwgcmVzb2x2ZXIpOwotCQkJCX0KLQkJCQllbHNlIGlmICh3aGljaCA9PSBHRVRfTU9ERUxfRk9SX1JFQUQpIHsKLQkJCQkJbW9kZWwgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoaWQsIGluU3RyZWFtLCByZXNvbHZlcik7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWUpIHsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vIGNsb3NlIG5vdyAhCi0JCQkJaWYgKGluU3RyZWFtICE9IG51bGwpIHsKLQkJCQkJaW5TdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZXQgbG9jYXRpb25pZAotCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSA9PSBudWxsKSB7Ci0JCQltb2RlbC5zZXRCYXNlTG9jYXRpb24oZnVsbElQYXRoLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgU3RyaW5nIHJlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldENvbW1vbk1vZGVsRm9yKGJhc2VNb2RlbCwgcmVmLCBHRVRfTU9ERUxfRk9SX0VESVQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNb2RlbE1hbmFnZXIoKTsKLQotCQkvLyBjcmVhdGUgYSBmYWtlIElucHV0U3RyZWFtCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvckVkaXQoZmlsZSwgRW5jb2RpbmdSdWxlLkZPUkNFX0RFRkFVTFQpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5iYXNlTW9kZWw8L2NvZGU+OiB0aGUgbW9kZWwgY29udGFpbmluZyB0aGUgbGluawotCSAqIDxjb2RlPnJlZjwvY29kZT46IHRoZSBsaW5rIFVSTCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIFN0cmluZyByZWYpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRDb21tb25Nb2RlbEZvcihiYXNlTW9kZWwsIHJlZiwgR0VUX01PREVMX0ZPUl9SRUFEKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0KLQkJLy8gY3JlYXRlIGEgZmFrZSBJbnB1dFN0cmVhbQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBleCkgewotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGZpbGUsIEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJcmV0dXJuIG1vZGVsTWFuYWdlcjsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUpIHsKLQkJaWYgKGlGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXROZXdNb2RlbEZvckVkaXQoaUZpbGUsIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VJblVzZSByaXUpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VBbHJlYWR5RXhpc3RzIHJhZSkgewotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSkgewotCQlpZiAoaUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNb2RlbE1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE5ld01vZGVsRm9yRWRpdChpRmlsZSwgZmFsc2UpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUluVXNlIHJpdSkgewotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUFscmVhZHlFeGlzdHMgcmFlKSB7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+YmFzZU1vZGVsPC9jb2RlPjogdGhlIG1vZGVsIGNvbnRhaW5pbmcgdGhlIGxpbmsKLQkgKiA8Y29kZT5yZWY8L2NvZGU+OiB0aGUgbGluayBVUkwgc3RyaW5nCi0JICogPGNvZGU+cmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzPC9jb2RlPjogSWYgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzCi0JICogaXMgc2V0IHRvIHRydWUsIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCBwcm9wZXJseSByZXNvbHZlIHRoZSBVUkkgaWYgaXQgaXMKLQkgKiBhIHZhbGlkIFVSSSBwb2ludGluZyB0byBhbm90aGVyIChhcHByb3ByaWF0ZSkgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlVVJJKElTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsLCBTdHJpbmcgcmVmLCBib29sZWFuIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcykgewotCQlpZiAoYmFzZU1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBnZXQgcmVzb2x2ZXIgaW4gTW9kZWwKLQkJZmluYWwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBiYXNlTW9kZWwuZ2V0UmVzb2x2ZXIoKTsKLQotCQkvLyByZXNvbHZlIHRvIGFic29sdXRlIHVybAotCQlmaW5hbCBTdHJpbmcgYWJzdXJsID0gKHJlc29sdmVyICE9IG51bGwpID8gcmVzb2x2ZXIuZ2V0TG9jYXRpb25CeVVSSShyZWYsIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcykgOiBudWxsOwotCQlpZiAoKHJlc29sdmVyICE9IG51bGwpICYmIChhYnN1cmwgPT0gbnVsbCkgJiYgKHJlZiAhPSBudWxsKSAmJiAocmVmLnRyaW0oKS5sZW5ndGgoKSA+IDApICYmIChyZWYudHJpbSgpLmNoYXJBdCgwKSA9PSAnLycpKSB7Ci0JCQkvLyB0byByZWFjaCBoZXJlIG1lYW5zIDoKLQkJCS8vIHJlZiBpcyBhIERvY3Jvb3QgcmVsYXRpdmUKLQkJCS8vIHJlc29sdmVyIGNhbid0IHJlc29sdmUgcmVmCi0JCQkvLyBzbyB0aGF0IGhyZWYgaXMgYSBicm9rZW4gYW5kIHNob3VsZCBub3QgY3JlYXRlIG1vZGVsCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoKGFic3VybCAhPSBudWxsKSAmJiAoYWJzdXJsLmxlbmd0aCgpID4gMCkpIHsKLQkJCXJldHVybiBhYnN1cmw7Ci0JCX0KLQotCQkvLyBtYXliZSByZWYgaXMgYXQgb3V0c2lkZSBvZiB0aGUgUHJvamVjdAotCQkvLyBvYnRhaW4gZG9jcm9vdDsKLQkJZmluYWwgSUNvbnRhaW5lciBjb250YWluZXIgPSAocmVzb2x2ZXIgIT0gbnVsbCkgPyByZXNvbHZlci5nZXRSb290TG9jYXRpb24oKSA6IG51bGw7Ci0JCVN0cmluZyBkb2Nyb290ID0gbnVsbDsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQlkb2Nyb290ID0gY29udGFpbmVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAoZG9jcm9vdCA9PSBudWxsKSB7Ci0JCQlkb2Nyb290ID0gYmFzZU1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQl9Ci0JCWlmIChkb2Nyb290ID09IG51bGwpIHsKLQkJCS8vIHNob3VsZCBub3QgYmUKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gb2J0YWluIGRvY3VtZW50IHVybAotCQlTdHJpbmcgbW9kZWxCYXNlTG9jYXRpb24gPSBiYXNlTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCWlmICgobW9kZWxCYXNlTG9jYXRpb24gPT0gbnVsbCkgfHwgKG1vZGVsQmFzZUxvY2F0aW9uLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBmYWxsYmFjay4uLgotCQkJbW9kZWxCYXNlTG9jYXRpb24gPSBiYXNlTW9kZWwuZ2V0SWQoKTsKLQkJfQotCQlpZiAoKG1vZGVsQmFzZUxvY2F0aW9uID09IG51bGwpIHx8IChtb2RlbEJhc2VMb2NhdGlvbi5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gaSBjYW4ndCByZXNvbHZlIHVyaSAhCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIHJlc29sdmUgdXJsCi0JCVVSTEhlbHBlciBoZWxwZXIgPSBuZXcgVVJMSGVscGVyKFBhdGhIZWxwZXIuZ2V0Q29udGFpbmluZ0ZvbGRlclBhdGgobW9kZWxCYXNlTG9jYXRpb24pLCBQYXRoSGVscGVyLmdldENvbnRhaW5pbmdGb2xkZXJQYXRoKFBhdGhIZWxwZXIuYXBwZW5kVHJhaWxpbmdVUkxTbGFzaChkb2Nyb290KSkpOwotCQlyZXR1cm4gaGVscGVyLnRvQWJzb2x1dGUocmVmKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kUG9zaXRpb25YU3ViU3R5bGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFBvc2l0aW9uWFN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjgwMTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kUG9zaXRpb25YU3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSVZhbElEOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLQotLyoqCi0gKiBmb3IgaG9yaXpvbnRhbCB2YWx1ZSBvZiAnYmFja2dyb3VuZC1wb3NpdGlvbicKLSAqLwotcHVibGljIGNsYXNzIEJhY2tncm91bmRQb3NpdGlvblhTdWJTdHlsZUFkYXB0ZXIgaW1wbGVtZW50cyBJU3ViUHJvcGVydHlBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCYWNrZ3JvdW5kUG9zaXRpb25YU3ViU3R5bGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDU1NUZXh0VG9rZW5bXSBjb3JyZWN0TWVhbmluZ1Rva2VuKENTU1RleHRUb2tlbltdIHNyYykgewotCQlqYXZhLnV0aWwuQXJyYXlMaXN0IGxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNyYy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TICYmIHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCWxpc3QuYWRkKHNyY1tpXSk7Ci0JCX0KLQkJQ1NTVGV4dFRva2VuW10gcmV0ID0gbmV3IENTU1RleHRUb2tlbltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCVN0cmluZyBzdHIgPSBudWxsOwotCQlPYmplY3Qgb2JqID0gcHJvcGVydGllcy5nZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKSk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJUHJvcENNUHJvcGVydHkgcHJvcFggPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCk7Ci0JCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wWSA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWVMaXN0KSB7Ci0JCQkJSUNTU1ZhbHVlTGlzdCBsaXN0ID0gKElDU1NWYWx1ZUxpc3QpIG9iajsKLQkJCQlJQ1NTVmFsdWUgdmFsdWUgPSAoSUNTU1ZhbHVlKSBsaXN0Lml0ZW0oMCk7Ci0JCQkJaWYgKHZhbHVlLmdldENzc1ZhbHVlVHlwZSgpID09IENTU1ZhbHVlLkNTU19QUklNSVRJVkVfVkFMVUUpIHsKLQkJCQkJSUNTU1ByaW1pdGl2ZVZhbHVlIHByaW0gPSAoSUNTU1ByaW1pdGl2ZVZhbHVlKSB2YWx1ZTsKLQkJCQkJaWYgKHByaW0uZ2V0UHJpbWl0aXZlVHlwZSgpID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVCkgewotCQkJCQkJLy8gY2hlY2sgbm90IHRvcCBvciBib3R0b20KLQkJCQkJCWlmICghcHJvcFguY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpICYmIHByb3BZLmNhbkhhdmUocHJpbS5nZXRTdHJpbmdWYWx1ZSgpKSkgewotCQkJCQkJCS8vIGNhc2Ugb3JkZXIgaXMgdmVydGljYWwgLT4gaG9yaXpvbnRhbAotCQkJCQkJCXZhbHVlID0gKElDU1NWYWx1ZSkgbGlzdC5pdGVtKDEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXN0ciA9IHZhbHVlLmdldENTU1ZhbHVlVGV4dCgpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSB7Ci0JCQkJc3RyID0gKChJQ1NTVmFsdWUpIG9iaikuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQkJaWYgKHN0ci5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0JPVFRPTSkgfHwgc3RyLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfVE9QKSkKLQkJCQkJc3RyID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RyID0gb2JqLnRvU3RyaW5nKCk7Ci0JCQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHN0cik7Ci0JCQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCi0JCQkJdG9rZW5zID0gY29ycmVjdE1lYW5pbmdUb2tlbih0b2tlbnMpOwotCQkJCWlmICh0b2tlbnMubGVuZ3RoID09IDApCi0JCQkJCXN0ciA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCQllbHNlIGlmICh0b2tlbnMubGVuZ3RoID09IDEgJiYgKHRva2Vuc1swXS5pbWFnZS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0JPVFRPTSkgfHwgdG9rZW5zWzBdLmltYWdlLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfVE9QKSkpCi0JCQkJCXN0ciA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCQllbHNlCi0JCQkJCXN0ciA9IHRva2Vuc1swXS5pbWFnZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKHN0ciAhPSBudWxsKSA/IHN0ciA6ICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IG51bGw7Ci0JCVN0cmluZyB2YWxIID0gdmFsdWU7Ci0JCVN0cmluZyB2YWxWID0gcHJvcGVydGllcy5nZXRCYWNrZ3JvdW5kUG9zaXRpb25ZKCk7Ci0JCWlmICh2YWxWID09IG51bGwgfHwgdmFsVi5sZW5ndGgoKSA9PSAwKQotCQkJbmV3VmFsdWUgPSB2YWxIOwotCQllbHNlIGlmICh2YWxIID09IG51bGwgfHwgdmFsSC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlDb2xsZWN0aW9uIHZhbFggPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCkuZ2V0VmFsdWVzKCk7Ci0JCQlDb2xsZWN0aW9uIHZhbFkgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSkuZ2V0VmFsdWVzKCk7Ci0JCQlQcm9wQ01VdGlsLm1pbnVzKHZhbFksIHZhbFgpOwotCQkJSXRlcmF0b3IgaXQgPSB2YWxZLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqLnRvU3RyaW5nKCkuZXF1YWxzKHZhbFYudG9Mb3dlckNhc2UoKSkpIHsKLQkJCQkJLy8gbmVlZCBub3QgY29tcGVuc2F0ZSBmb3IgLi4uCi0JCQkJCW5ld1ZhbHVlID0gdmFsVjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJLy8gY29tcGVuc2F0ZSBmb3IgSG9yaXpvbnRhbCB2YWx1ZQotCQkJaWYgKG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkvLyBjaGVjayB2YWxWIGlzIGxlbmd0aCBvciBub3QKLQkJCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgdmFsVi50cmltKCkpOwotCQkJCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJCQlpZiAodG9rZW5zICE9IG51bGwgJiYgdG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zWzBdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJCW5ld1ZhbHVlID0gSVZhbElELlZfTEVGVCArICIgIiArIHZhbFY7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlCi0JCQkJCW5ld1ZhbHVlID0gIjAlICIgKyB2YWxWOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQllbHNlCi0JCQluZXdWYWx1ZSA9IHZhbEggKyAiICIgKyB2YWxWOy8vJE5PTi1OTFMtMSQKLQkJcHJvcGVydGllcy5zZXRCYWNrZ3JvdW5kUG9zaXRpb24obmV3VmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kUG9zaXRpb25ZU3ViU3R5bGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFBvc2l0aW9uWVN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDhkZjliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kUG9zaXRpb25ZU3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSVZhbElEOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLQotLyoqCi0gKiBmb3IgdmVydGljYWwgdmFsdWUgb2YgJ2JhY2tncm91bmQtcG9zaXRpb24nCi0gKi8KLXB1YmxpYyBjbGFzcyBCYWNrZ3JvdW5kUG9zaXRpb25ZU3ViU3R5bGVBZGFwdGVyIGltcGxlbWVudHMgSVN1YlByb3BlcnR5QWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQmFja2dyb3VuZFBvc2l0aW9uWVN1YlN0eWxlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTVGV4dFRva2VuW10gY29ycmVjdE1lYW5pbmdUb2tlbihDU1NUZXh0VG9rZW5bXSBzcmMpIHsKLQkJamF2YS51dGlsLkFycmF5TGlzdCBsaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcmMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChzcmNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBzcmNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUyAmJiBzcmNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQlsaXN0LmFkZChzcmNbaV0pOwotCQl9Ci0JCUNTU1RleHRUb2tlbltdIHJldCA9IG5ldyBDU1NUZXh0VG9rZW5bbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlTdHJpbmcgc3RyID0gbnVsbDsKLQkJT2JqZWN0IG9iaiA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTikpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCVByb3BDTVByb3BlcnR5IHByb3BYID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpOwotCQkJUHJvcENNUHJvcGVydHkgcHJvcFkgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlTGlzdCkgewotCQkJCUlDU1NWYWx1ZUxpc3QgbGlzdCA9IChJQ1NTVmFsdWVMaXN0KSBvYmo7Ci0JCQkJaW50IGluZGV4ID0gMTsKLQkJCQlJQ1NTVmFsdWUgdmFsdWUgPSAoSUNTU1ZhbHVlKSBsaXN0Lml0ZW0oMCk7Ci0JCQkJaWYgKHZhbHVlLmdldENzc1ZhbHVlVHlwZSgpID09IENTU1ZhbHVlLkNTU19QUklNSVRJVkVfVkFMVUUpIHsKLQkJCQkJSUNTU1ByaW1pdGl2ZVZhbHVlIHByaW0gPSAoSUNTU1ByaW1pdGl2ZVZhbHVlKSB2YWx1ZTsKLQkJCQkJaWYgKHByaW0uZ2V0UHJpbWl0aXZlVHlwZSgpID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVCkgewotCQkJCQkJLy8gY2hlY2sgbm90IHRvcCBvciBib3R0b20KLQkJCQkJCWlmICghcHJvcFguY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpICYmIHByb3BZLmNhbkhhdmUocHJpbS5nZXRTdHJpbmdWYWx1ZSgpKSkgewotCQkJCQkJCS8vIGNhc2Ugb3JkZXIgaXMgdmVydGljYWwgLT4gaG9yaXpvbnRhbAotCQkJCQkJCWluZGV4ID0gMDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlzdHIgPSAoKElDU1NWYWx1ZSkgbGlzdC5pdGVtKGluZGV4KSkuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWUpIHsKLQkJCQlzdHIgPSAoKElDU1NWYWx1ZSkgb2JqKS5nZXRDU1NWYWx1ZVRleHQoKTsKLQkJCQlpZiAoIXN0ci5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0JPVFRPTSkgJiYgIXN0ci5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX1RPUCkpCi0JCQkJCXN0ciA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0ciA9IG9iai50b1N0cmluZygpOwotCQkJCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzdHIpOwotCQkJCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQotCQkJCXRva2VucyA9IGNvcnJlY3RNZWFuaW5nVG9rZW4odG9rZW5zKTsKLQkJCQlpZiAodG9rZW5zLmxlbmd0aCA9PSAxICYmICh0b2tlbnNbMF0uaW1hZ2UuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9CT1RUT00pIHx8IHRva2Vuc1swXS5pbWFnZS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX1RPUCkpKQotCQkJCQlzdHIgPSB0b2tlbnNbMF0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAodG9rZW5zLmxlbmd0aCA+IDEpCi0JCQkJCXN0ciA9IHRva2Vuc1sxXS5pbWFnZTsKLQkJCQllbHNlCi0JCQkJCXN0ciA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gKHN0ciAhPSBudWxsKSA/IHN0ciA6ICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IG51bGw7Ci0JCVN0cmluZyB2YWxIID0gcHJvcGVydGllcy5nZXRCYWNrZ3JvdW5kUG9zaXRpb25YKCk7Ci0JCVN0cmluZyB2YWxWID0gdmFsdWU7Ci0JCWlmICh2YWxIICE9IG51bGwgJiYgKHZhbEgudHJpbSgpLmVxdWFscygiMCUiKSAvKiBkZWZhdWx0IHZhbHVlICovfHwgLy8kTk9OLU5MUy0xJAotCQkJCQl2YWxILnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0xFRlQpIC8qCi0JCQkJCQkJCQkJCQkJCQkJICogYW5vdGhlcgotCQkJCQkJCQkJCQkJCQkJCSAqIGRlZmF1bHQKLQkJCQkJCQkJCQkJCQkJCQkgKiB2YWx1ZQotCQkJCQkJCQkJCQkJCQkJCSAqLykpCi0JCQl2YWxIID0gbnVsbDsKLQkJaWYgKHZhbFYgPT0gbnVsbCB8fCB2YWxWLmxlbmd0aCgpID09IDApCi0JCQluZXdWYWx1ZSA9IHZhbEg7Ci0JCWVsc2UgaWYgKHZhbEggPT0gbnVsbCB8fCB2YWxILmxlbmd0aCgpID09IDApIHsKLQkJCUNvbGxlY3Rpb24gdmFsWCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKS5nZXRWYWx1ZXMoKTsKLQkJCUNvbGxlY3Rpb24gdmFsWSA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKS5nZXRWYWx1ZXMoKTsKLQkJCVByb3BDTVV0aWwubWludXModmFsWSwgdmFsWCk7Ci0JCQlJdGVyYXRvciBpdCA9IHZhbFkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCWlmIChvYmoudG9TdHJpbmcoKS5lcXVhbHModmFsVi50b0xvd2VyQ2FzZSgpKSkgewotCQkJCQkvLyBuZWVkIG5vdCBjb21wZW5zYXRlIGZvciAuLi4KLQkJCQkJbmV3VmFsdWUgPSB2YWxWOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjb21wZW5zYXRlIGZvciBIb3Jpem9udGFsIHZhbHVlCi0JCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCS8vIGNoZWNrIHZhbFYgaXMgbGVuZ3RoIG9yIG5vdAotCQkJCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCB2YWxWLnRyaW0oKSk7Ci0JCQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQkJCWlmICh0b2tlbnMgIT0gbnVsbCAmJiB0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQkJbmV3VmFsdWUgPSBJVmFsSUQuVl9MRUZUICsgIiAiICsgdmFsVjsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UKLQkJCQkJbmV3VmFsdWUgPSAiMCUgIiArIHZhbFY7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCW5ld1ZhbHVlID0gdmFsSCArICIgIiArIHZhbFY7Ly8kTk9OLU5MUy0xJAotCQlwcm9wZXJ0aWVzLnNldEJhY2tncm91bmRQb3NpdGlvbihuZXdWYWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhZDI5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnYmFja2dyb3VuZCcgcHJvcGVydHkgJ2JhY2tncm91bmQnIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdiYWNrZ3JvdW5kLWF0dGFjaG1lbnQnLCAnYmFja2dyb3VuZC1jb2xvcicsICdiYWNrZ3JvdW5kLWltYWdlJywKLSAqICdiYWNrZ3JvdW5kLXBvc2l0aW9uJywgJ2JhY2tncm91bmQtcmVwZWF0JywKLSAqLwotcHVibGljIGNsYXNzIEJhY2tncm91bmRTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJhY2tncm91bmRTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gIiIsIGltYWdlID0gIiIsIHJlcGVhdCA9ICIiLCBhdHRhY2ggPSAiIiwgcG9zID0gIiI7Ly8kTk9OLU5MUy01JC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEltYWdlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0lNQUdFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFJlcGVhdCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19SRVBFQVQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQXR0YWNoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0FUVEFDSE1FTlQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wUG9zID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wSW1hZ2UuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wUmVwZWF0LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJcmVwZWF0ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BBdHRhY2guY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlhdHRhY2ggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFBvcy5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpIHsKLQkJCQkJaWYgKHBvcyA9PSBudWxsIHx8IHBvcy5sZW5ndGgoKSA8PSAwKQotCQkJCQkJcG9zID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlCi0JCQkJCQlwb3MgPSBwb3MgKyAiICIgKyB0b2tlbnNbaV0uaW1hZ2U7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKSB7Ci0JCQkJaWYgKHBvcyA9PSBudWxsIHx8IHBvcy5sZW5ndGgoKSA8PSAwKQotCQkJCQlwb3MgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZQotCQkJCQlwb3MgPSBwb3MgKyAiICIgKyB0b2tlbnNbaV0uaW1hZ2U7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSkgewotCQkJCWltYWdlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlkZXN0LnNldChwcm9wQ29sb3IuZ2V0TmFtZSgpLCBjb2xvcik7Ci0JCWRlc3Quc2V0KHByb3BJbWFnZS5nZXROYW1lKCksIGltYWdlKTsKLQkJZGVzdC5zZXQocHJvcFJlcGVhdC5nZXROYW1lKCksIHJlcGVhdCk7Ci0JCWRlc3Quc2V0KHByb3BBdHRhY2guZ2V0TmFtZSgpLCBhdHRhY2gpOwotCQlkZXN0LnNldChwcm9wUG9zLmdldE5hbWUoKSwgcG9zKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gbnVsbCwgaW1hZ2UgPSBudWxsLCByZXBlYXQgPSBudWxsLCBhdHRhY2ggPSBudWxsLCBwb3MgPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wSW1hZ2UgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfSU1BR0UpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wUmVwZWF0ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1JFUEVBVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BBdHRhY2ggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQVRUQUNITUVOVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BQb3MgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUE9TSVRJT04pOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BJbWFnZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWltYWdlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BSZXBlYXQuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlyZXBlYXQgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcEF0dGFjaC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWF0dGFjaCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wUG9zLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkgewotCQkJCQlpZiAocG9zID09IG51bGwpCi0JCQkJCQlwb3MgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWVsc2UKLQkJCQkJCXBvcyA9IHBvcyArICIgIiArIHRva2Vuc1tpXS5pbWFnZTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpIHsKLQkJCQlpZiAocG9zID09IG51bGwpCi0JCQkJCXBvcyA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlCi0JCQkJCXBvcyA9IHBvcyArICIgIiArIHRva2Vuc1tpXS5pbWFnZTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJKSB7Ci0JCQkJaW1hZ2UgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wQ29sb3IgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gY29sb3I7Ci0JCWVsc2UgaWYgKHByb3BJbWFnZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBpbWFnZTsKLQkJZWxzZSBpZiAocHJvcFJlcGVhdCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiByZXBlYXQ7Ci0JCWVsc2UgaWYgKHByb3BBdHRhY2ggPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gYXR0YWNoOwotCQllbHNlIGlmIChwcm9wUG9zID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHBvczsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckJvdHRvbVNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJCb3R0b21TaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMDdlMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckJvdHRvbVNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnYm9yZGVyLWJvdHRvbScgcHJvcGVydHkgJ2JvcmRlci1ib3R0b20nIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItYm90dG9tLWNvbG9yJywgJ2JvcmRlci1ib3R0b20tc3R5bGUnLCAnYm9yZGVyLWJvdHRvbS13aWR0aCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJCb3R0b21TaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJvcmRlckJvdHRvbVNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSAiIiwgc3R5bGUgPSAiIiwgd2lkdGggPSAiIjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWRlc3Quc2V0KHByb3BDb2xvci5nZXROYW1lKCksIGNvbG9yKTsKLQkJZGVzdC5zZXQocHJvcFN0eWxlLmdldE5hbWUoKSwgc3R5bGUpOwotCQlkZXN0LnNldChwcm9wV2lkdGguZ2V0TmFtZSgpLCB3aWR0aCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9IG51bGwsIHN0eWxlID0gbnVsbCwgd2lkdGggPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BDb2xvciA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBjb2xvcjsKLQkJZWxzZSBpZiAocHJvcFN0eWxlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHN0eWxlOwotCQllbHNlIGlmIChwcm9wV2lkdGggPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gd2lkdGg7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJDb2xvclNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJDb2xvclNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjYzY3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyQ29sb3JTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlci1jb2xvcicgcHJvcGVydHkgJ2JvcmRlci1jb2xvcicgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2JvcmRlci10b3AtY29sb3InLCAnYm9yZGVyLXJpZ2h0LWNvbG9yJywgJ2JvcmRlci1ib3R0b20tY29sb3InLAotICogJ2JvcmRlci1sZWZ0LWNvbG9yJywKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlckNvbG9yU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJDb2xvclNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJaWRlbnRzW2orK10gPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlTdHJpbmdbXSBkZXN0cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoaiA9PSAxKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzFdID0gZGVzdHNbMl0gPSBkZXN0c1szXSA9IGlkZW50c1swXTsKLQkJfQotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMl0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJZGVzdHNbMF0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQkJZGVzdHNbMl0gPSBpZGVudHNbMl07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykKLQkJCQlkZXN0c1trXSA9IGlkZW50c1trXTsKLQkJfQotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IsIGRlc3RzWzBdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IsIGRlc3RzWzFdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SLCBkZXN0c1syXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IsIGRlc3RzWzNdKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWlkZW50c1tqKytdID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChqID09IDEpCi0JCQlyZXR1cm4gaWRlbnRzWzBdOwotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SIHx8IHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpCi0JCQkJcmV0dXJuIGlkZW50c1szXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckxlZnRTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyTGVmdFNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiNzIzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyTGVmdFNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnYm9yZGVyLWxlZnQnIHByb3BlcnR5ICdib3JkZXItbGVmdCcgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2JvcmRlci1sZWZ0LWNvbG9yJywgJ2JvcmRlci1sZWZ0LXN0eWxlJywgJ2JvcmRlci1sZWZ0LXdpZHRoJywKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlckxlZnRTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJvcmRlckxlZnRTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gIiIsIHN0eWxlID0gIiIsIHdpZHRoID0gIiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlkZXN0LnNldChwcm9wQ29sb3IuZ2V0TmFtZSgpLCBjb2xvcik7Ci0JCWRlc3Quc2V0KHByb3BTdHlsZS5nZXROYW1lKCksIHN0eWxlKTsKLQkJZGVzdC5zZXQocHJvcFdpZHRoLmdldE5hbWUoKSwgd2lkdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSBudWxsLCBzdHlsZSA9IG51bGwsIHdpZHRoID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wQ29sb3IgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gY29sb3I7Ci0JCWVsc2UgaWYgKHByb3BTdHlsZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBzdHlsZTsKLQkJZWxzZSBpZiAocHJvcFdpZHRoID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHdpZHRoOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyUmlnaHRTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyUmlnaHRTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYTVmYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclJpZ2h0U2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXItcmlnaHQnIHByb3BlcnR5ICdib3JkZXItcmlnaHQnIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItcmlnaHQtY29sb3InLCAnYm9yZGVyLXJpZ2h0LXN0eWxlJywgJ2JvcmRlci1yaWdodC13aWR0aCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJSaWdodFNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyUmlnaHRTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gIiIsIHN0eWxlID0gIiIsIHdpZHRoID0gIiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlkZXN0LnNldChwcm9wQ29sb3IuZ2V0TmFtZSgpLCBjb2xvcik7Ci0JCWRlc3Quc2V0KHByb3BTdHlsZS5nZXROYW1lKCksIHN0eWxlKTsKLQkJZGVzdC5zZXQocHJvcFdpZHRoLmdldE5hbWUoKSwgd2lkdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSBudWxsLCBzdHlsZSA9IG51bGwsIHdpZHRoID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wQ29sb3IgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gY29sb3I7Ci0JCWVsc2UgaWYgKHByb3BTdHlsZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBzdHlsZTsKLQkJZWxzZSBpZiAocHJvcFdpZHRoID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHdpZHRoOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI3MThhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXInIHByb3BlcnR5ICdib3JkZXInIHdpbGwgYmUgZXhwYW5kZWQgdG8gJ2JvcmRlci1jb2xvcicsCi0gKiAnYm9yZGVyLXN0eWxlJywgJ2JvcmRlci13aWR0aCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJvcmRlclNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSAiIiwgc3R5bGUgPSAiIiwgd2lkdGggPSAiIjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWRlc3Quc2V0KHByb3BDb2xvci5nZXROYW1lKCksIGNvbG9yKTsKLQkJZGVzdC5zZXQocHJvcFN0eWxlLmdldE5hbWUoKSwgc3R5bGUpOwotCQlkZXN0LnNldChwcm9wV2lkdGguZ2V0TmFtZSgpLCB3aWR0aCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9IG51bGwsIHN0eWxlID0gbnVsbCwgd2lkdGggPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BDb2xvciA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBjb2xvcjsKLQkJZWxzZSBpZiAocHJvcFN0eWxlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHN0eWxlOwotCQllbHNlIGlmIChwcm9wV2lkdGggPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gd2lkdGg7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJTdHlsZVNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJTdHlsZVNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU0MDljMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyU3R5bGVTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlci1zdHlsZScgcHJvcGVydHkgJ2JvcmRlci1zdHlsZScgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2JvcmRlci10b3Atc3R5bGUnLCAnYm9yZGVyLXJpZ2h0LXN0eWxlJywgJ2JvcmRlci1ib3R0b20tc3R5bGUnLAotICogJ2JvcmRlci1sZWZ0LXN0eWxlJywKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlclN0eWxlU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJTdHlsZVNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCVN0cmluZ1tdIGRlc3RzID0gbmV3IFN0cmluZ1s0XTsKLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChqID09IDEpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMV0gPSBkZXN0c1syXSA9IGRlc3RzWzNdID0gaWRlbnRzWzBdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJZGVzdHNbMF0gPSBkZXN0c1syXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlkZXN0c1swXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCQlkZXN0c1syXSA9IGlkZW50c1syXTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKQotCQkJCWRlc3RzW2tdID0gaWRlbnRzW2tdOwotCQl9Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSwgZGVzdHNbMF0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSwgZGVzdHNbMV0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUsIGRlc3RzWzJdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSwgZGVzdHNbM10pOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoaiA9PSAxKQotCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSB8fCBwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJfQotCQllbHNlIGlmIChqID09IDMpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUpCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFKQotCQkJCXJldHVybiBpZGVudHNbM107Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJUb3BTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyVG9wU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODczOGY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJUb3BTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlci10b3AnIHByb3BlcnR5ICdib3JkZXItdG9wJyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYm9yZGVyLXRvcC1jb2xvcicsICdib3JkZXItdG9wLXN0eWxlJywgJ2JvcmRlci10b3Atd2lkdGgnLAotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyVG9wU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJUb3BTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gIiIsIHN0eWxlID0gIiIsIHdpZHRoID0gIiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlkZXN0LnNldChwcm9wQ29sb3IuZ2V0TmFtZSgpLCBjb2xvcik7Ci0JCWRlc3Quc2V0KHByb3BTdHlsZS5nZXROYW1lKCksIHN0eWxlKTsKLQkJZGVzdC5zZXQocHJvcFdpZHRoLmdldE5hbWUoKSwgd2lkdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSBudWxsLCBzdHlsZSA9IG51bGwsIHdpZHRoID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wQ29sb3IgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gY29sb3I7Ci0JCWVsc2UgaWYgKHByb3BTdHlsZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBzdHlsZTsKLQkJZWxzZSBpZiAocHJvcFdpZHRoID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHdpZHRoOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyV2lkdGhTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyV2lkdGhTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOThlYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlcldpZHRoU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXItd2lkdGgnIHByb3BlcnR5ICdib3JkZXItd2lkdGgnIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItdG9wLXdpZHRoJywgJ2JvcmRlci1yaWdodC13aWR0aCcsICdib3JkZXItYm90dG9tLXdpZHRoJywKLSAqICdib3JkZXItbGVmdC13aWR0aCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJXaWR0aFNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyV2lkdGhTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlTdHJpbmdbXSBkZXN0cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoaiA9PSAxKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzFdID0gZGVzdHNbMl0gPSBkZXN0c1szXSA9IGlkZW50c1swXTsKLQkJfQotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMl0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJZGVzdHNbMF0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQkJZGVzdHNbMl0gPSBpZGVudHNbMl07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykKLQkJCQlkZXN0c1trXSA9IGlkZW50c1trXTsKLQkJfQotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEgsIGRlc3RzWzBdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgsIGRlc3RzWzFdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRILCBkZXN0c1syXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgsIGRlc3RzWzNdKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGogPT0gMSkKLQkJCXJldHVybiBpZGVudHNbMF07Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEggfHwgcHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCkKLQkJCQlyZXR1cm4gaWRlbnRzWzNdOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ1NTUHJvcGVydHlDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ1NTUHJvcGVydHlDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiODNhOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NTU1Byb3BlcnR5Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVN1YlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTUHJvcGVydHlDb250ZXh0IGltcGxlbWVudHMgSUNTUzJQcm9wZXJ0aWVzIHsKLQotCXByb3RlY3RlZCBIYXNodGFibGUgZlByb3BlcnRpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JSGFzaFNldCBmTW9kaWZpZWQgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgc3ViUHJvcGVydHlBZGFwdGVyczsKLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIHNob3J0aGFuZEFkYXB0ZXJzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENTU1Byb3BlcnR5Q29udGV4dCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdFNob3J0aGFuZEFkYXB0ZXJzKCk7Ci0JCWluaXRTdWJQcm9wZXJ0eUFkYXB0ZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENTU1Byb3BlcnR5Q29udGV4dChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRTaG9ydGhhbmRBZGFwdGVycygpOwotCQlpbml0U3ViUHJvcGVydHlBZGFwdGVycygpOwotCQlpbml0aWFsaXplKGRlY2wpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gZXhwb3J0cyBhbGwgcHJvcGVydHkvdmFsdWUgcGFpcnMgdG8gJ2RlY2wnIGRlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHlGdWxsKElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRW51bWVyYXRpb24ga2V5cyA9IGZQcm9wZXJ0aWVzLmtleXMoKTsKLQkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCU9iamVjdCBrZXkgPSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCQlPYmplY3QgdmFsID0gZlByb3BlcnRpZXMuZ2V0KGtleSk7Ci0JCQlTdHJpbmcgdmFsdWUgPSAodmFsIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSA/ICgoSUNTU1ZhbHVlKSB2YWwpLmdldENTU1ZhbHVlVGV4dCgpIDogdmFsLnRvU3RyaW5nKCk7Ci0KLQkJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpIDw9IDApCi0JCQkJZGVjbC5yZW1vdmVQcm9wZXJ0eShrZXkudG9TdHJpbmcoKSk7Ci0JCQllbHNlCi0JCQkJZGVjbC5zZXRQcm9wZXJ0eShrZXkudG9TdHJpbmcoKSwgdmFsdWUudHJpbSgpLCAodmFsIGluc3RhbmNlb2YgVmFsdWVEYXRhICYmICgoVmFsdWVEYXRhKSB2YWwpLmltcG9ydGFudCkgPyAiIWltcG9ydGFudCIgOiAiIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gZXhwb3J0cyBtb2RpZmllZCBwcm9wZXJ0eS92YWx1ZSBwYWlycyB0byAnZGVjbCcKLQkgKiBkZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5TW9kaWZpZWQoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsIHx8IGZNb2RpZmllZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBpdCA9IGZNb2RpZmllZC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qga2V5ID0gaXQubmV4dCgpOwotCQkJT2JqZWN0IHZhbCA9IGZQcm9wZXJ0aWVzLmdldChrZXkpOwotCQkJU3RyaW5nIHZhbHVlID0gKHZhbCBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgPyAoKElDU1NWYWx1ZSkgdmFsKS5nZXRDU1NWYWx1ZVRleHQoKSA6ICgodmFsICE9IG51bGwpID8gdmFsLnRvU3RyaW5nKCkgOiBudWxsKTsKLQotCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPD0gMCkKLQkJCQlkZWNsLnJlbW92ZVByb3BlcnR5KGtleS50b1N0cmluZygpKTsKLQkJCWVsc2UKLQkJCQlkZWNsLnNldFByb3BlcnR5KGtleS50b1N0cmluZygpLCB2YWx1ZS50cmltKCksICh2YWwgaW5zdGFuY2VvZiBWYWx1ZURhdGEgJiYgKChWYWx1ZURhdGEpIHZhbCkuaW1wb3J0YW50KSA/ICIhaW1wb3J0YW50IiA6ICIiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGNsb25lIG9mIHRoaXMgY29udGV4dAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCUNTU1Byb3BlcnR5Q29udGV4dCBjbG9uZSA9IG5ldyBDU1NQcm9wZXJ0eUNvbnRleHQoKTsKLQkJaWYgKHRoaXMuZk1vZGlmaWVkICE9IG51bGwpCi0JCQljbG9uZS5mTW9kaWZpZWQgPSAoSGFzaFNldCkgdGhpcy5mTW9kaWZpZWQuY2xvbmUoKTsKLQkJZWxzZQotCQkJY2xvbmUuZk1vZGlmaWVkID0gbnVsbDsKLQkJY2xvbmUuZlByb3BlcnRpZXMgPSAoSGFzaHRhYmxlKSB0aGlzLmZQcm9wZXJ0aWVzLmNsb25lKCk7Ci0JCXJldHVybiBjbG9uZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgYSBzaG9ydC1oYW5kIHByb3BlcnR5J3MgdmFsdWUgdG8gZWFjaCBsZWFmCi0JICogcHJvcGVydHkncyB2YWx1ZSBhbmQgc2V0IHRoZW0gdG8gJ2ZvcmVpZ24nCi0JICogCi0JICogRm9yIGV4YW1wbGUsIGdpdmVuIFtwcm9wPWJvcmRlci10b3AsIHZhbHVlPSJzb2xpZCAxcHggeWVsbG93Il0gd2lsbCBiZQotCSAqIGV4cGFuZGVkIHRvIFtib3JkZXItdG9wLWNvbG9yPXllbGxvdywgYm9yZGVyLXRvcC1zdHlsZT1zb2xpZCwKLQkgKiBib3JkZXItdG9wLXdpZHRoPTFweF0gYW5kIHRoZXkgYXJlIHN0b3JlZCB0byAnZm9yZWlnbicgY29udGV4dC4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgcmVjdXJzaXZlbHkgc2hvcnRoYW5kZWQgcHJvcGVydHkgbGlrZSAnYm9yZGVyJyB3aWxsIGJlCi0JICogZXhwYW5kZWQgdG8gYWxsIGRlc2NlbmRhbnQgbGVhZiBwcm9wZXJ0aWVzIGxpa2UKLQkgKiAnYm9yZGVyLVt0b3AvcmlnaHQvYm90dG9tL2xlZnRdLVtjb2xvci9zdHlsZS93aWR0aF0nCi0JICogCi0JICogQHBhcmFtIHByb3AKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHkKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZm9yZWlnbgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuZGVjbGFyYXRpb24uQ1NTUHJvcGVydHlDb250ZXh0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGV4cGFuZFRvTGVhZihQcm9wQ01Qcm9wZXJ0eSBwcm9wLCBTdHJpbmcgdmFsdWUsIENTU1Byb3BlcnR5Q29udGV4dCBmb3JlaWduKSB7Ci0JCS8vIGV4cGFuZCBzaG9ydGhhbmQgcHJvcGVydHkKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJSVNob3J0aGFuZEFkYXB0ZXIgYWRhcHRlciA9IChJU2hvcnRoYW5kQWRhcHRlcikgc2hvcnRoYW5kQWRhcHRlcnMuZ2V0KHByb3ApOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXIuZXhwYW5kKHZhbHVlLCBmb3JlaWduKTsKLQkJCQlmb3JlaWduLnNldChwcm9wLmdldE5hbWUoKSwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3AuZ2V0TnVtQ2hpbGQoKTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBvYmogPSBwcm9wLmdldENoaWxkQXQoaSk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9wQ01Qcm9wZXJ0eSAmJiAhKG9iaiBpbnN0YW5jZW9mIFByb3BDTVN1YlByb3BlcnR5KSkgewotCQkJCQkJUHJvcENNUHJvcGVydHkgZXhwYW5kZWRQcm9wID0gKFByb3BDTVByb3BlcnR5KSBvYmo7Ci0JCQkJCQl2YWx1ZSA9IGZvcmVpZ24uZ2V0KGV4cGFuZGVkUHJvcC5nZXROYW1lKCkpOwotCQkJCQkJZXhwYW5kVG9MZWFmKGV4cGFuZGVkUHJvcCwgdmFsdWUsIGZvcmVpZ24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoIXZhbHVlLmVxdWFscyhmb3JlaWduLmdldChwcm9wLmdldE5hbWUoKSkpKSB7Ci0JCQkJZm9yZWlnbi5zZXQocHJvcC5nZXROYW1lKCksIHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB2YWx1ZSBvZiAncHJvcCcuIFF1ZXJ5aW5nIHZhbHVlIG1lY2hhbmlzbSBjaGVja3MKLQkgKiBzaG9ydC1oYW5kIHByb3BlcnRpZXMuCi0JICogCi0JICogRm9yIGV4YW1wbGUsIGdpdmVuICJiYWNrZ3JvdW5kPWZpeGVkIHdoaXRlIiBpcyBzZXQgaW4gdGhpcyBpbnNhdG5jZSBhbmQKLQkgKiBwYXJhbSAicHJvcD1iYWNrZ3JvdW5kLWNvbG9yIiwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlICJ3aGl0ZSIuCi0JICogCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0KG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHkgcHJvcCkgewotCQlpZiAocHJvcCBpbnN0YW5jZW9mIFByb3BDTVN1YlByb3BlcnR5KSB7Ci0JCQlJU3ViUHJvcGVydHlBZGFwdGVyIGFkYXB0ZXIgPSAoSVN1YlByb3BlcnR5QWRhcHRlcikgc3ViUHJvcGVydHlBZGFwdGVycy5nZXQocHJvcC5nZXROYW1lKCkpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYWRhcHRlci5nZXQodGhpcyk7Ci0JCX0KLQkJU3RyaW5nIHN0ciA9IGdldChwcm9wLmdldE5hbWUoKSk7Ci0JCWlmICgoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApICYmIHByb3AuZ2V0U2hvcnRoYW5kQ29udGFpbmVyQ291bnQoKSA+IDApIHsKLQkJCS8vIGdldCBleHBhbmRlZCBwcm9wZXJ0eQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wLmdldFNob3J0aGFuZENvbnRhaW5lckNvdW50KCk7IGkrKykgewotCQkJCVByb3BDTVByb3BlcnR5IHByb3BQYXJlbnQgPSBwcm9wLnNob3J0aGFuZENvbnRhaW5lckF0KGkpOwotCQkJCVN0cmluZyBzdHJQYXJlbnQgPSBnZXQocHJvcFBhcmVudCk7Ci0JCQkJaWYgKHN0clBhcmVudCAhPSBudWxsICYmIHN0clBhcmVudC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCUlTaG9ydGhhbmRBZGFwdGVyIGFkYXB0ZXIgPSAoSVNob3J0aGFuZEFkYXB0ZXIpIHNob3J0aGFuZEFkYXB0ZXJzLmdldChwcm9wUGFyZW50KTsKLQkJCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGV4dHJhY3RlZFZhbHVlID0gYWRhcHRlci5leHRyYWN0KHN0clBhcmVudCwgcHJvcCk7Ci0JCQkJCQlyZXR1cm4gKGV4dHJhY3RlZFZhbHVlICE9IG51bGwpID8gZXh0cmFjdGVkVmFsdWUgOiAiIjsvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdmFsdWUgb2YgJ3Byb3AnLiBRdWVyeWluZyB2YWx1ZSBtZWNoYW5pc20gZG9lcwotCSAqIG5vdCBjYXJlIHNob3J0aGFuZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0KFN0cmluZyBwcm9wTmFtZSkgewotCQlTdHJpbmcgc3RyID0gbnVsbDsKLQkJT2JqZWN0IG9iaiA9IGZQcm9wZXJ0aWVzLmdldChwcm9wTmFtZSk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NWYWx1ZSkKLQkJCQlzdHIgPSAoKElDU1NWYWx1ZSkgb2JqKS5nZXRDU1NWYWx1ZVRleHQoKTsKLQkJCWVsc2UKLQkJCQlzdHIgPSBvYmoudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gKHN0ciAhPSBudWxsKSA/IHN0ciA6ICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGF6aW11dGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBemltdXRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9BWklNVVRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBiYWNrZ3JvdW5kIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkcpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJhY2tncm91bmQtYXR0YWNobWVudCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmRBdHRhY2htZW50KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19BVFRBQ0hNRU5UKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBiYWNrZ3JvdW5kLWNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kQ29sb3IoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0NPTE9SKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBiYWNrZ3JvdW5kLWltYWdlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kSW1hZ2UoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBiYWNrZ3JvdW5kLXBvc2l0aW9uIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kUG9zaXRpb24oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QmFja2dyb3VuZFBvc2l0aW9uWCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCkpOwotCQkvKgotCQkgKiBTdHJpbmcgc3RyID0gbnVsbDsgT2JqZWN0IG9iaiA9Ci0JCSAqIGZQcm9wZXJ0aWVzLmdldChQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKTsgaWYgKG9iaiAhPSBudWxsKSB7Ci0JCSAqIFByb3BDTVByb3BlcnR5IHByb3BYID0KLQkJICogUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpOwotCQkgKiBQcm9wQ01Qcm9wZXJ0eSBwcm9wWSA9Ci0JCSAqIFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKTsKLQkJICogaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NWYWx1ZUxpc3QpIHsgSUNTU1ZhbHVlTGlzdCBsaXN0ID0KLQkJICogKElDU1NWYWx1ZUxpc3QpIG9iajsgSUNTU1ZhbHVlIHZhbHVlID0gKElDU1NWYWx1ZSkgbGlzdC5pdGVtKDApOyBpZgotCQkgKiAodmFsdWUuZ2V0Q3NzVmFsdWVUeXBlKCkgPT0gQ1NTVmFsdWUuQ1NTX1BSSU1JVElWRV9WQUxVRSkgewotCQkgKiBJQ1NTUHJpbWl0aXZlVmFsdWUgcHJpbSA9IChJQ1NTUHJpbWl0aXZlVmFsdWUpIHZhbHVlOyBpZgotCQkgKiAocHJpbS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lERU5UKSB7IC8vIGNoZWNrCi0JCSAqIG5vdCB0b3Agb3IgYm90dG9tIGlmICghcHJvcFguY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpICYmCi0JCSAqIHByb3BZLmNhbkhhdmUocHJpbS5nZXRTdHJpbmdWYWx1ZSgpKSkgeyAvLyBjYXNlIG9yZGVyIGlzIHZlcnRpY2FsIC0+Ci0JCSAqIGhvcml6b250YWwgdmFsdWUgPSAoSUNTU1ZhbHVlKSBsaXN0Lml0ZW0oMSk7IH0gfSB9IHN0ciA9Ci0JCSAqIHZhbHVlLmdldENTU1ZhbHVlVGV4dCgpOyB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgeyBzdHIgPQotCQkgKiAoKElDU1NWYWx1ZSlvYmopLmdldENTU1ZhbHVlVGV4dCgpOyB9IGVsc2Ugc3RyID0gb2JqLnRvU3RyaW5nKCk7IH0KLQkJICogcmV0dXJuIChzdHIgIT0gbnVsbCkgPyBzdHIgOiAiIjsKLQkJICovCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QmFja2dyb3VuZFBvc2l0aW9uWSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSkpOwotCQkvKgotCQkgKiBTdHJpbmcgc3RyID0gbnVsbDsgT2JqZWN0IG9iaiA9Ci0JCSAqIGZQcm9wZXJ0aWVzLmdldChQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKTsgaWYgKG9iaiAhPSBudWxsKSB7Ci0JCSAqIFByb3BDTVByb3BlcnR5IHByb3BYID0KLQkJICogUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpOwotCQkgKiBQcm9wQ01Qcm9wZXJ0eSBwcm9wWSA9Ci0JCSAqIFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKTsKLQkJICogaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NWYWx1ZUxpc3QpIHsgSUNTU1ZhbHVlTGlzdCBsaXN0ID0KLQkJICogKElDU1NWYWx1ZUxpc3QpIG9iajsgaW50IGluZGV4ID0gMTsgSUNTU1ZhbHVlIHZhbHVlID0gKElDU1NWYWx1ZSkKLQkJICogbGlzdC5pdGVtKDApOyBpZiAodmFsdWUuZ2V0Q3NzVmFsdWVUeXBlKCkgPT0KLQkJICogQ1NTVmFsdWUuQ1NTX1BSSU1JVElWRV9WQUxVRSkgeyBJQ1NTUHJpbWl0aXZlVmFsdWUgcHJpbSA9Ci0JCSAqIChJQ1NTUHJpbWl0aXZlVmFsdWUpIHZhbHVlOyBpZiAocHJpbS5nZXRQcmltaXRpdmVUeXBlKCkgPT0KLQkJICogQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lERU5UKSB7IC8vIGNoZWNrIG5vdCB0b3Agb3IgYm90dG9tIGlmCi0JCSAqICghcHJvcFguY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpICYmCi0JCSAqIHByb3BZLmNhbkhhdmUocHJpbS5nZXRTdHJpbmdWYWx1ZSgpKSkgeyAvLyBjYXNlIG9yZGVyIGlzIHZlcnRpY2FsIC0+Ci0JCSAqIGhvcml6b250YWwgaW5kZXggPSAwOyB9IH0gfSBzdHIgPQotCQkgKiAoKElDU1NWYWx1ZSlsaXN0Lml0ZW0oaW5kZXgpKS5nZXRDU1NWYWx1ZVRleHQoKTsgfSBlbHNlIGlmIChvYmoKLQkJICogaW5zdGFuY2VvZiBJQ1NTVmFsdWUpIHsgLy8gZG8gbm90aGluZyAtLS0gdmFsdWUgaXMgbnVsbCB9IGVsc2Ugc3RyID0KLQkJICogb2JqLnRvU3RyaW5nKCk7IH0gcmV0dXJuIChzdHIgIT0gbnVsbCkgPyBzdHIgOiAiIjsKLQkJICovCi0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBiYWNrZ3JvdW5kLXJlcGVhdCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmRSZXBlYXQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1JFUEVBVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXIoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWJvdHRvbSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyQm90dG9tKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItYm90dG9tLWNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJCb3R0b21Db2xvcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWJvdHRvbS1zdHlsZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyQm90dG9tU3R5bGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1ib3R0b20td2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckJvdHRvbVdpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItY29sbGFwc2UgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckNvbGxhcHNlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MTEFQU0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1jb2xvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyQ29sb3IoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xPUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWxlZnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckxlZnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItbGVmdC1jb2xvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyTGVmdENvbG9yKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWxlZnQtc3R5bGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckxlZnRTdHlsZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1sZWZ0LXdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJMZWZ0V2lkdGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItcmlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclJpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1yaWdodC1jb2xvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyUmlnaHRDb2xvcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX0NPTE9SKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItcmlnaHQtc3R5bGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclJpZ2h0U3R5bGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXJpZ2h0LXdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJSaWdodFdpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1zcGFjaW5nIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJTcGFjaW5nKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1BBQ0lORykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJTdHlsZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NUWUxFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItdG9wIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJUb3AoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1ApKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci10b3AtY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclRvcENvbG9yKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItdG9wLXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJUb3BTdHlsZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXRvcC13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyVG9wV2lkdGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyV2lkdGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm90dG9tIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3R0b20oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPVFRPTSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY2FwdGlvbi1zaWRlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXB0aW9uU2lkZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0FQVElPTl9TSURFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjbGVhciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xlYXIoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMRUFSKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjbGlwIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGlwKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGlwQm90dG9tKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0JPVFRPTSkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xpcExlZnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfTEVGVCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xpcFJpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1JJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGlwVG9wKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbG9yKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT0xPUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY29udGVudCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09OVEVOVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY291bnRlci1pbmNyZW1lbnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvdW50ZXJJbmNyZW1lbnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPVU5URVJfSU5DUkVNRU5UKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjb3VudGVyLXJlc2V0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb3VudGVyUmVzZXQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPVU5URVJfUkVTRVQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZsb2F0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDc3NGbG9hdCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRkxPQVQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGN1ZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGN1ZS1hZnRlciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VlQWZ0ZXIoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9BRlRFUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY3VlLWJlZm9yZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VlQmVmb3JlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQkVGT1JFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjdXJzb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnNvcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VSU09SKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBkaXJlY3Rpb24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpcmVjdGlvbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRElSRUNUSU9OKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBkaXNwbGF5IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9ESVNQTEFZKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBlbGV2YXRpb24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZXZhdGlvbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRUxFVkFUSU9OKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBlbXB0eS1jZWxscyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW1wdHlDZWxscygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRU1QVFlfQ0VMTFMpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQtZmFtaWx5IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250RmFtaWx5KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX0ZBTUlMWSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZm9udC1zaXplIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250U2l6ZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBmb250LXNpemUtYWRqdXN0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250U2l6ZUFkanVzdCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFX0FESlVTVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZm9udC1zdHJldGNoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250U3RyZXRjaCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFJFVENIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBmb250LXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250U3R5bGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RZTEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQtdmFyaWFudCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udFZhcmlhbnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfVkFSSUFOVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZm9udC13ZWlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRXZWlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfV0VJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBoZWlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhlaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfSEVJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBsZWZ0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMZWZ0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MRUZUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBsZXR0ZXItc3BhY2luZyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGV0dGVyU3BhY2luZygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTEVUVEVSX1NQQUNJTkcpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGxpbmUtaGVpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaW5lSGVpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSU5FX0hFSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbGlzdC1zdHlsZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlzdFN0eWxlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBsaXN0LXN0eWxlLWltYWdlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXN0U3R5bGVJbWFnZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbGlzdC1zdHlsZS1wb3NpdGlvbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlzdFN0eWxlUG9zaXRpb24oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfUE9TSVRJT04pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGxpc3Qtc3R5bGUtdHlwZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlzdFN0eWxlVHlwZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9UWVBFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtYXJnaW4gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmdpbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtYXJnaW4tYm90dG9tIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJnaW5Cb3R0b20oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1hcmdpbi1sZWZ0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJnaW5MZWZ0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fTEVGVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWFyZ2luLXJpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJnaW5SaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1JJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtYXJnaW4tdG9wIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJnaW5Ub3AoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9UT1ApKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1hcmtlci1vZmZzZXQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmtlck9mZnNldCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSS0VSX09GRlNFVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWFya3MgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmtzKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJLUykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWF4LWhlaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWF4SGVpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVhfSEVJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtYXgtd2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1heFdpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVhfV0lEVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1pbi1oZWlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1pbkhlaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUlOX0hFSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWluLXdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNaW5XaWR0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUlOX1dJRFRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBvcnBoYW5zIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcnBoYW5zKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PUlBIQU5TKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBvdXRsaW5lIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPdXRsaW5lKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBvdXRsaW5lLWNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPdXRsaW5lQ29sb3IoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfQ09MT1IpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG91dGxpbmUtc3R5bGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE91dGxpbmVTdHlsZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9TVFlMRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgb3V0bGluZS13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0bGluZVdpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX1dJRFRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBvdmVyZmxvdyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3ZlcmZsb3coKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09WRVJGTE9XKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYWRkaW5nIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWRkaW5nKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYWRkaW5nLWJvdHRvbSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFkZGluZ0JvdHRvbSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZGRpbmctbGVmdCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFkZGluZ0xlZnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfTEVGVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGFkZGluZy1yaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFkZGluZ1JpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1JJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYWRkaW5nLXRvcCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFkZGluZ1RvcCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1ApKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZ2UgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2UoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZ2UtYnJlYWstYWZ0ZXIgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VCcmVha0FmdGVyKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0FGVEVSKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYWdlLWJyZWFrLWJlZm9yZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUJyZWFrQmVmb3JlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0JFRk9SRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGFnZS1icmVhay1pbnNpZGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VCcmVha0luc2lkZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19JTlNJREUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhdXNlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXVzZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFVU0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhdXNlLWFmdGVyIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXVzZUFmdGVyKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRV9BRlRFUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGF1c2UtYmVmb3JlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXVzZUJlZm9yZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFVU0VfQkVGT1JFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwaXRjaCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGl0Y2goKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BJVENIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwaXRjaC1yYW5nZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGl0Y2hSYW5nZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUElUQ0hfUkFOR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBsYXktZHVyaW5nIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbGF5RHVyaW5nKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QTEFZX0RVUklORykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcG9zaXRpb24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvc2l0aW9uKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QT1NJVElPTikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcXVvdGVzIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdW90ZXMoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1FVT1RFUykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcmljaG5lc3MgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJpY2huZXNzKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9SSUNITkVTUykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcmlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9SSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuZGVjbGFyYXRpb24uSVNob3J0aGFuZEFkYXB0ZXIKLQkgKiBAcGFyYW0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNob3J0aGFuZEFkYXB0ZXIgZ2V0U2hvcnRoYW5kQWRhcHRlcihQcm9wQ01Qcm9wZXJ0eSBwcm9wKSB7Ci0JCXJldHVybiAoSVNob3J0aGFuZEFkYXB0ZXIpIHNob3J0aGFuZEFkYXB0ZXJzLmdldChwcm9wKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHNpemUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNpemUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NJWkUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHNwZWFrIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVhaygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUspKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHNwZWFrLWhlYWRlciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlYWtIZWFkZXIoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX0hFQURFUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgc3BlYWstbnVtZXJhbCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlYWtOdW1lcmFsKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19OVU1FUkFMKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBzcGVhay1wdW5jdHVhdGlvbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlYWtQdW5jdHVhdGlvbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfUFVOQ1RVQVRJT04pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHNwZWVjaC1yYXRlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVlY2hSYXRlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVFQ0hfUkFURSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgc3RyZXNzIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJlc3MoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NUUkVTUykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdGFibGUtbGF5b3V0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZUxheW91dCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEFCTEVfTEFZT1VUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB0ZXh0LWFsaWduIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0QWxpZ24oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfQUxJR04pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHRleHQtZGVjb3JhdGlvbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dERlY29yYXRpb24oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfREVDT1JBVElPTikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdGV4dC1pbmRlbnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRJbmRlbnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfSU5ERU5UKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB0ZXh0LXNoYWRvdyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dFNoYWRvdygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9TSEFET1cpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHRleHQtdHJhbnNmb3JtIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0VHJhbnNmb3JtKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX1RSQU5TRk9STSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdG9wIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb3AoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RPUCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdW5pY29kZS1iaWRpIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVbmljb2RlQmlkaSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVU5JQ09ERV9CSURJKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB2ZXJ0aWNhbC1hbGlnbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVydGljYWxBbGlnbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVkVSVElDQUxfQUxJR04pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHZpc2liaWxpdHkgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZpc2liaWxpdHkoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZJU0lCSUxJVFkpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHZvaWNlLWZhbWlseSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Vm9pY2VGYW1pbHkoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZPSUNFX0ZBTUlMWSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdm9sdW1lIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWb2x1bWUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZPTFVNRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgd2hpdGUtc3BhY2UgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdoaXRlU3BhY2UoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dISVRFX1NQQUNFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB3aWRvd3MgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpZG93cygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0lET1dTKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB3aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dJRFRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB3b3JkLXNwYWNpbmcgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdvcmRTcGFjaW5nKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XT1JEX1NQQUNJTkcpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHotaW5kZXggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFpJbmRleCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfWl9JTkRFWCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCkgewotCQlmUHJvcGVydGllcy5jbGVhcigpOwotCQlpZiAoZk1vZGlmaWVkICE9IG51bGwpCi0JCQlmTW9kaWZpZWQuY2xlYXIoKTsKLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpbnQgblByb3BlcnRpZXMgPSBkZWNsLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5Qcm9wZXJ0aWVzOyBpKyspIHsKLQkJCVN0cmluZyBwcm9wTmFtZSA9IGRlY2wuaXRlbShpKTsKLQkJCWlmIChwcm9wTmFtZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHByb3BOID0gcHJvcE5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaWYgKHByb3BOLmxlbmd0aCgpICE9IDApIHsKLQkJCQkJQ1NTVmFsdWUgdmFsID0gZGVjbC5nZXRQcm9wZXJ0eUNTU1ZhbHVlKHByb3BOYW1lKTsKLQkJCQkJaWYgKHZhbCAhPSBudWxsKQotCQkJCQkJZlByb3BlcnRpZXMucHV0KHByb3BOLCB2YWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyB2b2lkIGluaXRTaG9ydGhhbmRBZGFwdGVycygpIHsKLQkJaWYgKHNob3J0aGFuZEFkYXB0ZXJzID09IG51bGwpIHsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzID0gbmV3IEhhc2h0YWJsZSgpOwotCQkJLy8gcmVnaXN0ZXIKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkcpLCBuZXcgQmFja2dyb3VuZFNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUiksIG5ldyBCb3JkZXJTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MT1IpLCBuZXcgQm9yZGVyQ29sb3JTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1RZTEUpLCBuZXcgQm9yZGVyU3R5bGVTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfV0lEVEgpLCBuZXcgQm9yZGVyV2lkdGhTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QKSwgbmV3IEJvcmRlclRvcFNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVCksIG5ldyBCb3JkZXJSaWdodFNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT00pLCBuZXcgQm9yZGVyQm90dG9tU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlQpLCBuZXcgQm9yZGVyTGVmdFNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpLCBuZXcgRm9udFNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEUpLCBuZXcgTGlzdFN0eWxlU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOKSwgbmV3IE1hcmdpblNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkcpLCBuZXcgUGFkZGluZ1Nob3J0aGFuZEFkYXB0ZXIoKSk7Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyB2b2lkIGluaXRTdWJQcm9wZXJ0eUFkYXB0ZXJzKCkgewotCQlpZiAoc3ViUHJvcGVydHlBZGFwdGVycyA9PSBudWxsKSB7Ci0JCQlzdWJQcm9wZXJ0eUFkYXB0ZXJzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCQkvLyByZWdpc3RlcgotCQkJc3ViUHJvcGVydHlBZGFwdGVycy5wdXQoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YLCBuZXcgQmFja2dyb3VuZFBvc2l0aW9uWFN1YlN0eWxlQWRhcHRlcigpKTsKLQkJCXN1YlByb3BlcnR5QWRhcHRlcnMucHV0KFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSwgbmV3IEJhY2tncm91bmRQb3NpdGlvbllTdWJTdHlsZUFkYXB0ZXIoKSk7Ci0JCQlzdWJQcm9wZXJ0eUFkYXB0ZXJzLnB1dChQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfVE9QLCBuZXcgQ2xpcFRvcFN1YlN0eWxlQWRhcHRlcigpKTsKLQkJCXN1YlByb3BlcnR5QWRhcHRlcnMucHV0KFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCwgbmV3IENsaXBSaWdodFN1YlN0eWxlQWRhcHRlcigpKTsKLQkJCXN1YlByb3BlcnR5QWRhcHRlcnMucHV0KFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9CT1RUT00sIG5ldyBDbGlwQm90dG9tU3ViU3R5bGVBZGFwdGVyKCkpOwotCQkJc3ViUHJvcGVydHlBZGFwdGVycy5wdXQoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0xFRlQsIG5ldyBDbGlwTGVmdFN1YlN0eWxlQWRhcHRlcigpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWQoKSB7Ci0JCXJldHVybiAoZk1vZGlmaWVkICE9IG51bGwgJiYgZk1vZGlmaWVkLnNpemUoKSAhPSAwKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gcHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGZQcm9wZXJ0aWVzLmtleXMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgcHJvcGVydGllc01vZGlmaWVkKCkgewotCQlpZiAoZk1vZGlmaWVkICE9IG51bGwpIHsKLQkJCXJldHVybiAoKENvbGxlY3Rpb24pIGZNb2RpZmllZC5jbG9uZSgpKS5pdGVyYXRvcigpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJCX0KLQkJCX07Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBleHBhbmRzIHRoZSB2YWx1ZSBvZiBzaG9ydGhhbmQgJ3Byb3AnIHRvICdmb3JlaWduJwotCSAqIGNvbnRleHQuIE5vdGUgdGhhdCBpZiB0aGlzIGhhcyBwYXJlbnQgc2hvcnRoYW5kIHByb3BlcnRpZXMgb2YgJ3Byb3AnLAotCSAqIHRoZXkgYXJlIGFsbCBleHBhbmRlZCB0byAnZm9yZWlnbicgY29udGV4dC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWN1cnNpdmVFeHRyYWN0KFByb3BDTVByb3BlcnR5IHByb3AsIENTU1Byb3BlcnR5Q29udGV4dCBmb3JlaWduKSB7Ci0JCS8vIGV4cGFuZCBzaG9ydGhhbmQgcHJvcGVydHkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wLmdldFNob3J0aGFuZENvbnRhaW5lckNvdW50KCk7IGkrKykgewotCQkJcmVjdXJzaXZlRXh0cmFjdChwcm9wLnNob3J0aGFuZENvbnRhaW5lckF0KGkpLCBmb3JlaWduKTsKLQkJfQotCQlTdHJpbmcgc3RyID0gZ2V0KHByb3AuZ2V0TmFtZSgpKTsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCXN0ciA9IGZvcmVpZ24uZ2V0KHByb3AuZ2V0TmFtZSgpKTsKLQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlJU2hvcnRoYW5kQWRhcHRlciBhZGFwdGVyID0gKElTaG9ydGhhbmRBZGFwdGVyKSBzaG9ydGhhbmRBZGFwdGVycy5nZXQocHJvcCk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlci5leHBhbmQoc3RyLCBmb3JlaWduKTsKLQkJCQlmb3JlaWduLnNldChwcm9wLmdldE5hbWUoKSwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZURlc2NlbmRhbnRzKFByb3BDTVByb3BlcnR5IHByb3ApIHsKLQkJaWYgKHByb3AuaXNTaG9ydGhhbmQoKSkgewotCQkJLy8gcmVtb3ZlIHByb3BlcnRpZXMKLQkJCWludCBuID0gcHJvcC5nZXROdW1DaGlsZCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gcHJvcC5nZXRDaGlsZEF0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9wQ01Qcm9wZXJ0eSkgewotCQkJCQlyZW1vdmVEZXNjZW5kYW50cygoUHJvcENNUHJvcGVydHkpIG9iaik7Ci0KLQkJCQkJU3RyaW5nIHN0ciA9IGdldChvYmoudG9TdHJpbmcoKSk7Ci0JCQkJCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKQotCQkJCQkJc2V0KG9iai50b1N0cmluZygpLCAiIik7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0TW9kaWZpZWQoKSB7Ci0JCWlmIChmTW9kaWZpZWQgIT0gbnVsbCkKLQkJCWZNb2RpZmllZC5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgcGFpciBvZiAncHJvcCcvJ3ZhbHVlJy4gSWYgc2hvcnRoYW5kIHByb3BlcnRpZXMKLQkgKiByZWxhdGVkIHRvICdwcm9wJyBhcmUgYWxyZWFkeSBkZWZpbmVkLCB0aGV5IHdpbGwgYmUgZXhwYW5kZWQgdG8gYXZvaWQKLQkgKiBwcm9wZXJ0eSBjb25mbGljdGlvbi4gSWYgZGVzY2VuZGFudCBwcm9wZXJ0aWVzIG9mICdwcm9wJyBhcmUgYWxyZWFkeQotCSAqIGRlZmluZWQsIHRoZXkgd2lsbCBiZSByZW1vdmVkIHRvIGF2b2lkIHByb3BlcnR5IGNvbmZsaWN0aW9uLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5IHByb3AsIGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAocHJvcCBpbnN0YW5jZW9mIFByb3BDTVN1YlByb3BlcnR5KSB7Ci0JCQlJU3ViUHJvcGVydHlBZGFwdGVyIGFkYXB0ZXIgPSAoSVN1YlByb3BlcnR5QWRhcHRlcikgc3ViUHJvcGVydHlBZGFwdGVycy5nZXQocHJvcC5nZXROYW1lKCkpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXIuc2V0KHRoaXMsIHZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJaWYgKHByb3AuZ2V0U2hvcnRoYW5kQ29udGFpbmVyQ291bnQoKSA+IDApIHsKLQkJCS8vIGV4cGFuZCBzaG9ydGhhbmQgcHJvcGVydHkKLQkJCUNTU1Byb3BlcnR5Q29udGV4dCBjb250ZXh0ID0gbmV3IENTU1Byb3BlcnR5Q29udGV4dCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wLmdldFNob3J0aGFuZENvbnRhaW5lckNvdW50KCk7IGkrKykgewotCQkJCXJlY3Vyc2l2ZUV4dHJhY3QocHJvcC5zaG9ydGhhbmRDb250YWluZXJBdChpKSwgY29udGV4dCk7Ci0JCQl9Ci0JCQlFbnVtZXJhdGlvbiBwcm9wZXJ0aWVzID0gY29udGV4dC5wcm9wZXJ0aWVzKCk7Ci0JCQl3aGlsZSAocHJvcGVydGllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVN0cmluZyBwcm9wRm9yZWlnbiA9IHByb3BlcnRpZXMubmV4dEVsZW1lbnQoKS50b1N0cmluZygpOwotCQkJCXNldChwcm9wRm9yZWlnbiwgY29udGV4dC5nZXQocHJvcEZvcmVpZ24pKTsKLQkJCX0KLQkJfQotCi0JCXJlbW92ZURlc2NlbmRhbnRzKHByb3ApOwotCi0JCXNldChwcm9wLmdldE5hbWUoKSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgcGFpciBvZiAncHJvcE5hbWUnLyd2YWx1ZScgcmVnYXJkbGVzcyBvZiBpdHMKLQkgKiBzaG9ydGhhbmQgcHJvcGVydGllcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXQoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlTdHJpbmcga2V5ID0gcHJvcE5hbWU7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJZlByb3BlcnRpZXMucmVtb3ZlKGtleSk7Ci0JCWVsc2UKLQkJCWZQcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLQkJaWYgKGZNb2RpZmllZCA9PSBudWxsKQotCQkJZk1vZGlmaWVkID0gbmV3IEhhc2hTZXQoKTsKLQkJZk1vZGlmaWVkLmFkZChrZXkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF6aW11dGgoU3RyaW5nIGF6aW11dGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0FaSU1VVEgpLCBhemltdXRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKFN0cmluZyBiYWNrZ3JvdW5kKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CRyksIGJhY2tncm91bmQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRBdHRhY2htZW50KFN0cmluZyBiYWNrZ3JvdW5kQXR0YWNobWVudCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQVRUQUNITUVOVCksIGJhY2tncm91bmRBdHRhY2htZW50KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoU3RyaW5nIGJhY2tncm91bmRDb2xvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQ09MT1IpLCBiYWNrZ3JvdW5kQ29sb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRJbWFnZShTdHJpbmcgYmFja2dyb3VuZEltYWdlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19JTUFHRSksIGJhY2tncm91bmRJbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZFBvc2l0aW9uKFN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKSwgYmFja2dyb3VuZFBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kUG9zaXRpb25YKGphdmEubGFuZy5TdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uWCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCksIGJhY2tncm91bmRQb3NpdGlvblgpOwotCQkvKgotCQkgKiBTdHJpbmcgbmV3VmFsdWUgPSBudWxsOyBTdHJpbmcgdmFsSCA9IGJhY2tncm91bmRQb3NpdGlvblg7IFN0cmluZwotCQkgKiB2YWxWID0gZ2V0QmFja2dyb3VuZFBvc2l0aW9uWSgpOyBpZiAodmFsViA9PSBudWxsIHx8Ci0JCSAqIHZhbFYubGVuZ3RoKCk9PSAwKSBuZXdWYWx1ZSA9IHZhbEg7IGVsc2UgaWYgKHZhbEggPT0gbnVsbCB8fAotCQkgKiB2YWxILmxlbmd0aCgpID09IDApIHsgQ29sbGVjdGlvbiB2YWxYID0KLQkJICogUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpLmdldFZhbHVlcygpOwotCQkgKiBDb2xsZWN0aW9uIHZhbFkgPQotCQkgKiBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSkuZ2V0VmFsdWVzKCk7Ci0JCSAqIFByb3BDTVV0aWwubWludXModmFsWSx2YWxYKTsgSXRlcmF0b3IgaXQgPSB2YWxZLml0ZXJhdG9yKCk7Ci0JCSAqIHdoaWxlKGl0Lmhhc05leHQoKSkgeyBPYmplY3Qgb2JqID0gaXQubmV4dCgpOyBpZgotCQkgKiAob2JqLnRvU3RyaW5nKCkuZXF1YWxzKHZhbFYudG9Mb3dlckNhc2UoKSkpIHsgLy8gbmVlZCBub3QKLQkJICogY29tcGVuc2F0ZSBmb3IgLi4uIG5ld1ZhbHVlID0gdmFsVjsgYnJlYWs7IH0gfSAvLyBjb21wZW5zYXRlIGZvcgotCQkgKiBIb3Jpem9udGFsIHZhbHVlIGlmIChuZXdWYWx1ZSA9PSBudWxsKSBuZXdWYWx1ZSA9ICIwJSAiICsgdmFsVjsgfQotCQkgKiBlbHNlIG5ld1ZhbHVlID0gdmFsSCArICIgIiArIHZhbFY7IHNldEJhY2tncm91bmRQb3NpdGlvbihuZXdWYWx1ZSk7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRQb3NpdGlvblkoamF2YS5sYW5nLlN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb25ZKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKSwgYmFja2dyb3VuZFBvc2l0aW9uWSk7Ci0JCS8qCi0JCSAqIFN0cmluZyBuZXdWYWx1ZSA9IG51bGw7IFN0cmluZyB2YWxIID0gZ2V0QmFja2dyb3VuZFBvc2l0aW9uWCgpOwotCQkgKiBTdHJpbmcgdmFsViA9IGJhY2tncm91bmRQb3NpdGlvblk7IGlmICh2YWxWID09IG51bGwgfHwKLQkJICogdmFsVi5sZW5ndGgoKT09IDApIG5ld1ZhbHVlID0gdmFsSDsgZWxzZSBpZiAodmFsSCA9PSBudWxsIHx8Ci0JCSAqIHZhbEgubGVuZ3RoKCkgPT0gMCkgeyBDb2xsZWN0aW9uIHZhbFggPQotCQkgKiBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCkuZ2V0VmFsdWVzKCk7Ci0JCSAqIENvbGxlY3Rpb24gdmFsWSA9Ci0JCSAqIFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKS5nZXRWYWx1ZXMoKTsKLQkJICogUHJvcENNVXRpbC5taW51cyh2YWxZLHZhbFgpOyBJdGVyYXRvciBpdCA9IHZhbFkuaXRlcmF0b3IoKTsKLQkJICogd2hpbGUoaXQuaGFzTmV4dCgpKSB7IE9iamVjdCBvYmogPSBpdC5uZXh0KCk7IGlmCi0JCSAqIChvYmoudG9TdHJpbmcoKS5lcXVhbHModmFsVi50b0xvd2VyQ2FzZSgpKSkgeyAvLyBuZWVkIG5vdAotCQkgKiBjb21wZW5zYXRlIGZvciAuLi4gbmV3VmFsdWUgPSB2YWxWOyBicmVhazsgfSB9IC8vIGNvbXBlbnNhdGUgZm9yCi0JCSAqIEhvcml6b250YWwgdmFsdWUgaWYgKG5ld1ZhbHVlID09IG51bGwpIG5ld1ZhbHVlID0gIjAlICIgKyB2YWxWOyB9Ci0JCSAqIGVsc2UgbmV3VmFsdWUgPSB2YWxIICsgIiAiICsgdmFsVjsgc2V0QmFja2dyb3VuZFBvc2l0aW9uKG5ld1ZhbHVlKTsKLQkJICovCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZFJlcGVhdChTdHJpbmcgYmFja2dyb3VuZFJlcGVhdCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUkVQRUFUKSwgYmFja2dyb3VuZFJlcGVhdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyKFN0cmluZyBib3JkZXIpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUiksIGJvcmRlcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyQm90dG9tKFN0cmluZyBib3JkZXJCb3R0b20pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT00pLCBib3JkZXJCb3R0b20pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckJvdHRvbUNvbG9yKFN0cmluZyBib3JkZXJCb3R0b21Db2xvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUiksIGJvcmRlckJvdHRvbUNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJCb3R0b21TdHlsZShTdHJpbmcgYm9yZGVyQm90dG9tU3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpLCBib3JkZXJCb3R0b21TdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyQm90dG9tV2lkdGgoU3RyaW5nIGJvcmRlckJvdHRvbVdpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKSwgYm9yZGVyQm90dG9tV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckNvbGxhcHNlKFN0cmluZyBib3JkZXJDb2xsYXBzZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTExBUFNFKSwgYm9yZGVyQ29sbGFwc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckNvbG9yKFN0cmluZyBib3JkZXJDb2xvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTE9SKSwgYm9yZGVyQ29sb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckxlZnQoU3RyaW5nIGJvcmRlckxlZnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUKSwgYm9yZGVyTGVmdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyTGVmdENvbG9yKFN0cmluZyBib3JkZXJMZWZ0Q29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX0NPTE9SKSwgYm9yZGVyTGVmdENvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJMZWZ0U3R5bGUoU3RyaW5nIGJvcmRlckxlZnRTdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpLCBib3JkZXJMZWZ0U3R5bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckxlZnRXaWR0aChTdHJpbmcgYm9yZGVyTGVmdFdpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCksIGJvcmRlckxlZnRXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyUmlnaHQoU3RyaW5nIGJvcmRlclJpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFQpLCBib3JkZXJSaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyUmlnaHRDb2xvcihTdHJpbmcgYm9yZGVyUmlnaHRDb2xvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX0NPTE9SKSwgYm9yZGVyUmlnaHRDb2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyUmlnaHRTdHlsZShTdHJpbmcgYm9yZGVyUmlnaHRTdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKSwgYm9yZGVyUmlnaHRTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyUmlnaHRXaWR0aChTdHJpbmcgYm9yZGVyUmlnaHRXaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKSwgYm9yZGVyUmlnaHRXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyU3BhY2luZyhTdHJpbmcgYm9yZGVyU3BhY2luZykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NQQUNJTkcpLCBib3JkZXJTcGFjaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJTdHlsZShTdHJpbmcgYm9yZGVyU3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TVFlMRSksIGJvcmRlclN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJUb3AoU3RyaW5nIGJvcmRlclRvcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUCksIGJvcmRlclRvcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyVG9wQ29sb3IoU3RyaW5nIGJvcmRlclRvcENvbG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SKSwgYm9yZGVyVG9wQ29sb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclRvcFN0eWxlKFN0cmluZyBib3JkZXJUb3BTdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSksIGJvcmRlclRvcFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJUb3BXaWR0aChTdHJpbmcgYm9yZGVyVG9wV2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEgpLCBib3JkZXJUb3BXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyV2lkdGgoU3RyaW5nIGJvcmRlcldpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfV0lEVEgpLCBib3JkZXJXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm90dG9tKFN0cmluZyBib3R0b20pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPVFRPTSksIGJvdHRvbSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FwdGlvblNpZGUoU3RyaW5nIGNhcHRpb25TaWRlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DQVBUSU9OX1NJREUpLCBjYXB0aW9uU2lkZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xlYXIoU3RyaW5nIGNsZWFyKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTEVBUiksIGNsZWFyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGlwKFN0cmluZyBjbGlwKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSwgY2xpcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xpcEJvdHRvbShqYXZhLmxhbmcuU3RyaW5nIGNsaXApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfQk9UVE9NKSwgY2xpcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xpcExlZnQoamF2YS5sYW5nLlN0cmluZyBjbGlwKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0xFRlQpLCBjbGlwKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGlwUmlnaHQoamF2YS5sYW5nLlN0cmluZyBjbGlwKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1JJR0hUKSwgY2xpcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xpcFRvcChqYXZhLmxhbmcuU3RyaW5nIGNsaXApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfVE9QKSwgY2xpcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sb3IoU3RyaW5nIGNvbG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT0xPUiksIGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KFN0cmluZyBjb250ZW50KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT05URU5UKSwgY29udGVudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q291bnRlckluY3JlbWVudChTdHJpbmcgY291bnRlckluY3JlbWVudCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09VTlRFUl9JTkNSRU1FTlQpLCBjb3VudGVySW5jcmVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3VudGVyUmVzZXQoU3RyaW5nIGNvdW50ZXJSZXNldCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09VTlRFUl9SRVNFVCksIGNvdW50ZXJSZXNldCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3NzRmxvYXQoU3RyaW5nIGNzc0Zsb2F0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GTE9BVCksIGNzc0Zsb2F0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdWUoU3RyaW5nIGN1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFKSwgY3VlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdWVBZnRlcihTdHJpbmcgY3VlQWZ0ZXIpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9BRlRFUiksIGN1ZUFmdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdWVCZWZvcmUoU3RyaW5nIGN1ZUJlZm9yZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFX0JFRk9SRSksIGN1ZUJlZm9yZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3Vyc29yKFN0cmluZyBjdXJzb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVUlNPUiksIGN1cnNvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlyZWN0aW9uKFN0cmluZyBkaXJlY3Rpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0RJUkVDVElPTiksIGRpcmVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheShTdHJpbmcgZGlzcGxheSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRElTUExBWSksIGRpc3BsYXkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsZXZhdGlvbihTdHJpbmcgZWxldmF0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9FTEVWQVRJT04pLCBlbGV2YXRpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVtcHR5Q2VsbHMoU3RyaW5nIGVtcHR5Q2VsbHMpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0VNUFRZX0NFTExTKSwgZW1wdHlDZWxscyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udChTdHJpbmcgZm9udCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVCksIGZvbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnRGYW1pbHkoU3RyaW5nIGZvbnRGYW1pbHkpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKSwgZm9udEZhbWlseSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udFNpemUoU3RyaW5nIGZvbnRTaXplKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkUpLCBmb250U2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udFNpemVBZGp1c3QoU3RyaW5nIGZvbnRTaXplQWRqdXN0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkVfQURKVVNUKSwgZm9udFNpemVBZGp1c3QpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnRTdHJldGNoKFN0cmluZyBmb250U3RyZXRjaCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFJFVENIKSwgZm9udFN0cmV0Y2gpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnRTdHlsZShTdHJpbmcgZm9udFN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUWUxFKSwgZm9udFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250VmFyaWFudChTdHJpbmcgZm9udFZhcmlhbnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfVkFSSUFOVCksIGZvbnRWYXJpYW50KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250V2VpZ2h0KFN0cmluZyBmb250V2VpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1dFSUdIVCksIGZvbnRXZWlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhlaWdodChTdHJpbmcgaGVpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9IRUlHSFQpLCBoZWlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlZnQoU3RyaW5nIGxlZnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xFRlQpLCBsZWZ0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXR0ZXJTcGFjaW5nKFN0cmluZyBsZXR0ZXJTcGFjaW5nKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MRVRURVJfU1BBQ0lORyksIGxldHRlclNwYWNpbmcpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmVIZWlnaHQoU3RyaW5nIGxpbmVIZWlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJTkVfSEVJR0hUKSwgbGluZUhlaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdFN0eWxlKFN0cmluZyBsaXN0U3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEUpLCBsaXN0U3R5bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RTdHlsZUltYWdlKFN0cmluZyBsaXN0U3R5bGVJbWFnZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9JTUFHRSksIGxpc3RTdHlsZUltYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0U3R5bGVQb3NpdGlvbihTdHJpbmcgbGlzdFN0eWxlUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfUE9TSVRJT04pLCBsaXN0U3R5bGVQb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdFN0eWxlVHlwZShTdHJpbmcgbGlzdFN0eWxlVHlwZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9UWVBFKSwgbGlzdFN0eWxlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luKFN0cmluZyBtYXJnaW4pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTiksIG1hcmdpbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luQm90dG9tKFN0cmluZyBtYXJnaW5Cb3R0b20pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00pLCBtYXJnaW5Cb3R0b20pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmdpbkxlZnQoU3RyaW5nIG1hcmdpbkxlZnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9MRUZUKSwgbWFyZ2luTGVmdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luUmlnaHQoU3RyaW5nIG1hcmdpblJpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fUklHSFQpLCBtYXJnaW5SaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luVG9wKFN0cmluZyBtYXJnaW5Ub3ApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9UT1ApLCBtYXJnaW5Ub3ApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmtlck9mZnNldChTdHJpbmcgbWFya2VyT2Zmc2V0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJLRVJfT0ZGU0VUKSwgbWFya2VyT2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXJrcyhTdHJpbmcgbWFya3MpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUktTKSwgbWFya3MpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heEhlaWdodChTdHJpbmcgbWF4SGVpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVhfSEVJR0hUKSwgbWF4SGVpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXhXaWR0aChTdHJpbmcgbWF4V2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BWF9XSURUSCksIG1heFdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaW5IZWlnaHQoU3RyaW5nIG1pbkhlaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUlOX0hFSUdIVCksIG1pbkhlaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWluV2lkdGgoU3RyaW5nIG1pbldpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NSU5fV0lEVEgpLCBtaW5XaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3JwaGFucyhTdHJpbmcgb3JwaGFucykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1JQSEFOUyksIG9ycGhhbnMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dGxpbmUoU3RyaW5nIG91dGxpbmUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkUpLCBvdXRsaW5lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRsaW5lQ29sb3IoU3RyaW5nIG91dGxpbmVDb2xvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9DT0xPUiksIG91dGxpbmVDb2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0bGluZVN0eWxlKFN0cmluZyBvdXRsaW5lU3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfU1RZTEUpLCBvdXRsaW5lU3R5bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dGxpbmVXaWR0aChTdHJpbmcgb3V0bGluZVdpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX1dJRFRIKSwgb3V0bGluZVdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVyZmxvdyhTdHJpbmcgb3ZlcmZsb3cpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09WRVJGTE9XKSwgb3ZlcmZsb3cpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZGRpbmcoU3RyaW5nIHBhZGRpbmcpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkcpLCBwYWRkaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nQm90dG9tKFN0cmluZyBwYWRkaW5nQm90dG9tKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0JPVFRPTSksIHBhZGRpbmdCb3R0b20pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZGRpbmdMZWZ0KFN0cmluZyBwYWRkaW5nTGVmdCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19MRUZUKSwgcGFkZGluZ0xlZnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZGRpbmdSaWdodChTdHJpbmcgcGFkZGluZ1JpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1JJR0hUKSwgcGFkZGluZ1JpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nVG9wKFN0cmluZyBwYWRkaW5nVG9wKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1RPUCksIHBhZGRpbmdUb3ApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZ2UoU3RyaW5nIHBhZ2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0UpLCBwYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWdlQnJlYWtBZnRlcihTdHJpbmcgcGFnZUJyZWFrQWZ0ZXIpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfQUZURVIpLCBwYWdlQnJlYWtBZnRlcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFnZUJyZWFrQmVmb3JlKFN0cmluZyBwYWdlQnJlYWtCZWZvcmUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfQkVGT1JFKSwgcGFnZUJyZWFrQmVmb3JlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWdlQnJlYWtJbnNpZGUoU3RyaW5nIHBhZ2VCcmVha0luc2lkZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19JTlNJREUpLCBwYWdlQnJlYWtJbnNpZGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhdXNlKFN0cmluZyBwYXVzZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFVU0UpLCBwYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGF1c2VBZnRlcihTdHJpbmcgcGF1c2VBZnRlcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFVU0VfQUZURVIpLCBwYXVzZUFmdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXVzZUJlZm9yZShTdHJpbmcgcGF1c2VCZWZvcmUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFX0JFRk9SRSksIHBhdXNlQmVmb3JlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQaXRjaChTdHJpbmcgcGl0Y2gpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BJVENIKSwgcGl0Y2gpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBpdGNoUmFuZ2UoU3RyaW5nIHBpdGNoUmFuZ2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BJVENIX1JBTkdFKSwgcGl0Y2hSYW5nZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGxheUR1cmluZyhTdHJpbmcgcGxheUR1cmluZykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUExBWV9EVVJJTkcpLCBwbGF5RHVyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3NpdGlvbihTdHJpbmcgcG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BPU0lUSU9OKSwgcG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1b3RlcyhTdHJpbmcgcXVvdGVzKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9RVU9URVMpLCBxdW90ZXMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJpY2huZXNzKFN0cmluZyByaWNobmVzcykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUklDSE5FU1MpLCByaWNobmVzcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmlnaHQoU3RyaW5nIHJpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9SSUdIVCksIHJpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXplKFN0cmluZyBzaXplKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TSVpFKSwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BlYWsoU3RyaW5nIHNwZWFrKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBSyksIHNwZWFrKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGVha0hlYWRlcihTdHJpbmcgc3BlYWtIZWFkZXIpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX0hFQURFUiksIHNwZWFrSGVhZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGVha051bWVyYWwoU3RyaW5nIHNwZWFrTnVtZXJhbCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfTlVNRVJBTCksIHNwZWFrTnVtZXJhbCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BlYWtQdW5jdHVhdGlvbihTdHJpbmcgc3BlYWtQdW5jdHVhdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfUFVOQ1RVQVRJT04pLCBzcGVha1B1bmN0dWF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGVlY2hSYXRlKFN0cmluZyBzcGVlY2hSYXRlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVFQ0hfUkFURSksIHNwZWVjaFJhdGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cmVzcyhTdHJpbmcgc3RyZXNzKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TVFJFU1MpLCBzdHJlc3MpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlTGF5b3V0KFN0cmluZyB0YWJsZUxheW91dCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEFCTEVfTEFZT1VUKSwgdGFibGVMYXlvdXQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRBbGlnbihTdHJpbmcgdGV4dEFsaWduKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0FMSUdOKSwgdGV4dEFsaWduKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0RGVjb3JhdGlvbihTdHJpbmcgdGV4dERlY29yYXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfREVDT1JBVElPTiksIHRleHREZWNvcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0SW5kZW50KFN0cmluZyB0ZXh0SW5kZW50KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0lOREVOVCksIHRleHRJbmRlbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRTaGFkb3coU3RyaW5nIHRleHRTaGFkb3cpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfU0hBRE9XKSwgdGV4dFNoYWRvdyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFRyYW5zZm9ybShTdHJpbmcgdGV4dFRyYW5zZm9ybSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9UUkFOU0ZPUk0pLCB0ZXh0VHJhbnNmb3JtKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb3AoU3RyaW5nIHRvcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVE9QKSwgdG9wKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmljb2RlQmlkaShTdHJpbmcgdW5pY29kZUJpZGkpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1VOSUNPREVfQklESSksIHVuaWNvZGVCaWRpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJ0aWNhbEFsaWduKFN0cmluZyB2ZXJ0aWNhbEFsaWduKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WRVJUSUNBTF9BTElHTiksIHZlcnRpY2FsQWxpZ24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2liaWxpdHkoU3RyaW5nIHZpc2liaWxpdHkpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZJU0lCSUxJVFkpLCB2aXNpYmlsaXR5KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWb2ljZUZhbWlseShTdHJpbmcgdm9pY2VGYW1pbHkpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZPSUNFX0ZBTUlMWSksIHZvaWNlRmFtaWx5KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWb2x1bWUoU3RyaW5nIHZvbHVtZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVk9MVU1FKSwgdm9sdW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaGl0ZVNwYWNlKFN0cmluZyB3aGl0ZVNwYWNlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSElURV9TUEFDRSksIHdoaXRlU3BhY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdpZG93cyhTdHJpbmcgd2lkb3dzKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSURPV1MpLCB3aWRvd3MpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdpZHRoKFN0cmluZyB3aWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0lEVEgpLCB3aWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29yZFNwYWNpbmcoU3RyaW5nIHdvcmRTcGFjaW5nKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XT1JEX1NQQUNJTkcpLCB3b3JkU3BhY2luZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0WkluZGV4KFN0cmluZyB6SW5kZXgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1pfSU5ERVgpLCB6SW5kZXgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwQm90dG9tU3ViU3R5bGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcEJvdHRvbVN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzBkYWUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwQm90dG9tU3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLQotLyoqCi0gKiBGb3IgYm90dG9tIHZhbHVlIG9mICdjbGlwJyBwcm9wZXJ0eSdzIHJlY3QoKSBmdW5jdGlvbgotICovCi1wdWJsaWMgY2xhc3MgQ2xpcEJvdHRvbVN1YlN0eWxlQWRhcHRlciBleHRlbmRzIENsaXBTdWJTdHlsZUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENsaXBCb3R0b21TdWJTdHlsZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldChvcmcudzNjLmRvbS5jc3MuUmVjdCByZWN0KSB7Ci0JCXJldHVybiByZWN0LmdldEJvdHRvbSgpLmdldENzc1RleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgaW5kZXgoKSB7Ci0JCXJldHVybiAyOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvcCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCkpOwotCQlTdHJpbmcgcmlnaHQgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCkpOwotCQlTdHJpbmcgbGVmdCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0xFRlQpKTsKLQotCQlzZXQocHJvcGVydGllcywgdG9wLCByaWdodCwgdmFsdWUsIGxlZnQsIHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBMZWZ0U3ViU3R5bGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcExlZnRTdWJTdHlsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyYjk5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcExlZnRTdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVN1YlByb3BlcnR5OwotCi0vKioKLSAqIEZvciBsZWZ0IHZhbHVlIG9mICdjbGlwJyBwcm9wZXJ0eSdzIHJlY3QoKSBmdW5jdGlvbgotICovCi1wdWJsaWMgY2xhc3MgQ2xpcExlZnRTdWJTdHlsZUFkYXB0ZXIgZXh0ZW5kcyBDbGlwU3ViU3R5bGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDbGlwTGVmdFN1YlN0eWxlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0KG9yZy53M2MuZG9tLmNzcy5SZWN0IHJlY3QpIHsKLQkJcmV0dXJuIHJlY3QuZ2V0TGVmdCgpLmdldENzc1RleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgaW5kZXgoKSB7Ci0JCXJldHVybiAzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvcCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCkpOwotCQlTdHJpbmcgcmlnaHQgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCkpOwotCQlTdHJpbmcgYm90dG9tID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfQk9UVE9NKSk7Ci0KLQkJc2V0KHByb3BlcnRpZXMsIHRvcCwgcmlnaHQsIGJvdHRvbSwgdmFsdWUsIHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBSaWdodFN1YlN0eWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBSaWdodFN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmQxZTIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwUmlnaHRTdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVN1YlByb3BlcnR5OwotCi0vKioKLSAqIEZvciByaWdodCB2YWx1ZSBvZiAnY2xpcCcgcHJvcGVydHkncyByZWN0KCkgZnVuY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIENsaXBSaWdodFN1YlN0eWxlQWRhcHRlciBleHRlbmRzIENsaXBTdWJTdHlsZUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENsaXBSaWdodFN1YlN0eWxlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0KG9yZy53M2MuZG9tLmNzcy5SZWN0IHJlY3QpIHsKLQkJcmV0dXJuIHJlY3QuZ2V0UmlnaHQoKS5nZXRDc3NUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGluZGV4KCkgewotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b3AgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9UT1ApKTsKLQkJU3RyaW5nIGJvdHRvbSA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0JPVFRPTSkpOwotCQlTdHJpbmcgbGVmdCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0xFRlQpKTsKLQotCQlzZXQocHJvcGVydGllcywgdG9wLCB2YWx1ZSwgYm90dG9tLCBsZWZ0LCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpID09IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwU3ViU3R5bGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcFN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmU5NmJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwU3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSVZhbElEOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuUmVjdDsKLQotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIGZvciBjbGlwIHN1Yi1wcm9wZXJ0aWVzCi0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBDbGlwU3ViU3R5bGVBZGFwdGVyIGltcGxlbWVudHMgSVN1YlByb3BlcnR5QWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ2xpcFN1YlN0eWxlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlTdHJpbmcgc3RyID0gbnVsbDsKLQkJT2JqZWN0IG9iaiA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLmNzcy5SZWN0KSB7Ci0JCQkJc3RyID0gZ2V0KChvcmcudzNjLmRvbS5jc3MuUmVjdCkgb2JqKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWUpIHsKLQkJCQkJc3RyID0gKChJQ1NTVmFsdWUpIG9iaikuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzdHIgPSBvYmoudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJc3RyID0gc3RyLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwotCQkJCWludCBwb3MgPSBzdHIuaW5kZXhPZigicmVjdCgiKTsvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBvcyA+PSAwKSB7Ci0JCQkJCVN0cmluZyBzdWJTdHIgPSBudWxsOwotCQkJCQlwb3MgKz0gNTsKLQkJCQkJaW50IGkgPSAwOwotCQkJCQlkbyB7Ci0JCQkJCQlpbnQgcG9zRW5kID0gc3RyLmluZGV4T2YoIiwiLCBwb3MpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChwb3NFbmQgPCAwKQotCQkJCQkJCXBvc0VuZCA9IHN0ci5pbmRleE9mKCIpIiwgcG9zKTsvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAocG9zRW5kIDwgMCAmJiBwb3MgPCBzdHIubGVuZ3RoKCkpCi0JCQkJCQkJcG9zRW5kID0gc3RyLmxlbmd0aCgpOwotCQkJCQkJaWYgKHBvc0VuZCA+PSBwb3MpIHsKLQkJCQkJCQlzdWJTdHIgPSBzdHIuc3Vic3RyaW5nKHBvcywgcG9zRW5kKTsKLQkJCQkJCQlwb3MgPSBwb3NFbmQgKyAxOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCXBvcyA9IC0xOwotCQkJCQl9Ci0JCQkJCXdoaWxlIChpKysgPCBpbmRleCgpICYmIHBvcyA+IDApOwotCi0JCQkJCWlmIChwb3MgPiAwKQotCQkJCQkJc3RyID0gc3ViU3RyLnRyaW0oKTsKLQkJCQkJZWxzZQotCQkJCQkJc3RyID0gbnVsbDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlzdHIgPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiAoc3RyICE9IG51bGwpID8gc3RyIDogIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWFic3RyYWN0IFN0cmluZyBnZXQoUmVjdCByZWN0KTsKLQotCS8qKgotCSAqIAotCSAqLwotCWFic3RyYWN0IGludCBpbmRleCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIwMDEvMTAvMDQKLQkgKiAxOToyNTo0NikKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydGllcwotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnV0aWwuZGVjbGFyYXRpb24uSUNTUzJQcm9wZXJ0aWVzCi0JICogQHBhcmFtIHRvcAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByaWdodAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBib3R0b20KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbGVmdAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByZW1vdmVDaGVjawotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdG9wLCBTdHJpbmcgcmlnaHQsIFN0cmluZyBib3R0b20sIFN0cmluZyBsZWZ0LCBib29sZWFuIHJlbW92ZUNoZWNrKSB7Ci0JCWlmICh0b3AgPT0gbnVsbCB8fCB0b3AubGVuZ3RoKCkgPT0gMCkKLQkJCXRvcCA9IElWYWxJRC5WX0FVVE87Ci0JCWlmIChyaWdodCA9PSBudWxsIHx8IHJpZ2h0Lmxlbmd0aCgpID09IDApCi0JCQlyaWdodCA9IElWYWxJRC5WX0FVVE87Ci0JCWlmIChib3R0b20gPT0gbnVsbCB8fCBib3R0b20ubGVuZ3RoKCkgPT0gMCkKLQkJCWJvdHRvbSA9IElWYWxJRC5WX0FVVE87Ci0JCWlmIChsZWZ0ID09IG51bGwgfHwgbGVmdC5sZW5ndGgoKSA9PSAwKQotCQkJbGVmdCA9IElWYWxJRC5WX0FVVE87Ci0KLQkJaWYgKHJlbW92ZUNoZWNrICYmIHRvcC50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9BVVRPKSAmJiByaWdodC50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9BVVRPKSAmJiBib3R0b20udHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfQVVUTykgJiYgbGVmdC50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9BVVRPKSkgewotCQkJcHJvcGVydGllcy5zZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApLCBudWxsKTsKLQkJfQotCQllbHNlCi0JCQlwcm9wZXJ0aWVzLnNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCksICJyZWN0KCIgKyB0b3AgKyAiLCAiICsgcmlnaHQgKyAiLCAiICsgYm90dG9tICsgIiwgIiArIGxlZnQgKyAiKSIpOy8vJE5PTi1OTFMtNSQvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBUb3BTdWJTdHlsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwVG9wU3ViU3R5bGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNWMxMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBUb3BTdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVN1YlByb3BlcnR5OwotCi0vKioKLSAqIEZvciB0b3AgdmFsdWUgb2YgJ2NsaXAnIHByb3BlcnR5J3MgcmVjdCgpIGZ1bmN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGlwVG9wU3ViU3R5bGVBZGFwdGVyIGV4dGVuZHMgQ2xpcFN1YlN0eWxlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ2xpcFRvcFN1YlN0eWxlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0KG9yZy53M2MuZG9tLmNzcy5SZWN0IHJlY3QpIHsKLQkJcmV0dXJuIHJlY3QuZ2V0VG9wKCkuZ2V0Q3NzVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBpbmRleCgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlTdHJpbmcgcmlnaHQgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCkpOwotCQlTdHJpbmcgYm90dG9tID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfQk9UVE9NKSk7Ci0JCVN0cmluZyBsZWZ0ID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfTEVGVCkpOwotCi0JCXNldChwcm9wZXJ0aWVzLCB2YWx1ZSwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vRm9udFNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Gb250U2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTg0OGUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Gb250U2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLklWYWxJRDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdmb250JyBwcm9wZXJ0eSAnZm9udCcgd2lsbCBiZSBleHBhbmRlZCB0byAnZm9udC1mYW1pbHknLCAnZm9udC1zaXplJywKLSAqICdmb250LXN0eWxlJywgJ2ZvbnQtdmFyaWFudCcsICdmb250LXdlaWdodCcsICdsaW5lLWhlaWdodCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBGb250U2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBGb250U2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBzdHlsZSA9IG51bGwsIHZhcmlhbnQgPSBudWxsLCB3ZWlnaHQgPSBudWxsLCBzaXplID0gbnVsbCwgaGVpZ2h0ID0gbnVsbCwgZmFtaWx5ID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEZvbnQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFZhcmlhbnQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9WQVJJQU5UKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdlaWdodCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1dFSUdIVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTaXplID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRSk7Ci0JCWJvb2xlYW4gYk5vcm1hbFNwZWNpZmllZCA9IGZhbHNlOwotCi0JCWludCBpID0gMDsKLQkJZm9yICg7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQkvLyBmaXJzdCBvZiBhbGwsIGNoZWNrIGZvbnQgaWRlbnRzCi0JCQkJaWYgKGkgPT0gMCkgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHByb3BGb250LmdldE51bUNoaWxkKCk7IGorKykgewotCQkJCQkJT2JqZWN0IG9iaiA9IHByb3BGb250LmdldENoaWxkQXQoaSk7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nICYmIHRva2Vuc1tpXS5pbWFnZS5jb21wYXJlVG9JZ25vcmVDYXNlKG9iai50b1N0cmluZygpKSA9PSAwKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyB2YWx1ZSAibm9ybWFsIiBpcyBzaGFyZWQgISEKLQkJCQlpZiAodG9rZW5zW2ldLmltYWdlLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfTk9STUFMKSkgewotCQkJCQliTm9ybWFsU3BlY2lmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWVsc2UgaWYgKHByb3BWYXJpYW50LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXZhcmlhbnQgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWVsc2UgaWYgKHByb3BXZWlnaHQuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJd2VpZ2h0ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlIGlmIChwcm9wU2l6ZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpIHsKLQkJCQkJCXNpemUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCQlicmVhazsgLy8gaWYgc2l6ZSBmb3VuZCwgYnJlYWsgbG9vcAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiAmJiB3ZWlnaHQgPT0gbnVsbCAmJiBwcm9wV2VpZ2h0LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkgewotCQkJCXdlaWdodCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKSB7Ci0JCQkJc2l6ZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQlicmVhazsgLy8gaWYgc2l6ZSBmb3VuZCwgYnJlYWsgbG9vcAotCQkJfQotCQl9Ci0KLQkJaWYgKGJOb3JtYWxTcGVjaWZpZWQpIHsKLQkJCWlmIChzdHlsZSA9PSBudWxsKQotCQkJCXN0eWxlID0gSVZhbElELlZfTk9STUFMOwotCQkJaWYgKHZhcmlhbnQgPT0gbnVsbCkKLQkJCQl2YXJpYW50ID0gSVZhbElELlZfTk9STUFMOwotCQkJaWYgKHdlaWdodCA9PSBudWxsKQotCQkJCXdlaWdodCA9IElWYWxJRC5WX05PUk1BTDsKLQkJfQotCi0JCS8vIHNraXAgd2hpdGVzcGFjZQotCQlmb3IgKGkrKzsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHRva2Vuc1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gbGluZS1oZWlnaHQgPwotCQlpZiAoaSA8IHRva2Vucy5sZW5ndGggJiYgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SICYmIHRva2Vuc1tpXS5pbWFnZS5lcXVhbHMoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGkrKzsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQkJaGVpZ2h0ID0gdG9rZW5zW2krK10uaW1hZ2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGZvbnQtZmFtaWx5Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCX0KLQkJZmFtaWx5ID0gYnVmLnRvU3RyaW5nKCkudHJpbSgpOwotCi0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFlMRSwgc3R5bGUpOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfVkFSSUFOVCwgdmFyaWFudCk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfRk9OVF9XRUlHSFQsIHdlaWdodCk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFLCBzaXplKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9MSU5FX0hFSUdIVCwgaGVpZ2h0KTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9GT05UX0ZBTUlMWSwgZmFtaWx5KTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIHN0eWxlID0gbnVsbCwgdmFyaWFudCA9IG51bGwsIHdlaWdodCA9IG51bGwsIHNpemUgPSBudWxsLCBoZWlnaHQgPSBudWxsLCBmYW1pbHkgPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wRm9udCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wVmFyaWFudCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1ZBUklBTlQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2VpZ2h0ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfV0VJR0hUKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFNpemUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEhlaWdodCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSU5FX0hFSUdIVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BGYW1pbHkgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9GQU1JTFkpOwotCQlib29sZWFuIGJOb3JtYWxTcGVjaWZpZWQgPSBmYWxzZTsKLQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJLy8gZmlyc3Qgb2YgYWxsLCBjaGVjayBmb250IGlkZW50cwotCQkJCWlmIChpID09IDApIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm9wRm9udC5nZXROdW1DaGlsZCgpOyBqKyspIHsKLQkJCQkJCU9iamVjdCBvYmogPSBwcm9wRm9udC5nZXRDaGlsZEF0KGkpOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZyAmJiB0b2tlbnNbaV0uaW1hZ2UuY29tcGFyZVRvSWdub3JlQ2FzZShvYmoudG9TdHJpbmcoKSkgPT0gMCkKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyB2YWx1ZSAibm9ybWFsIiBpcyBzaGFyZWQgISEKLQkJCQlpZiAodG9rZW5zW2ldLmltYWdlLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfTk9STUFMKSkgewotCQkJCQliTm9ybWFsU3BlY2lmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWVsc2UgaWYgKHByb3BWYXJpYW50LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXZhcmlhbnQgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWVsc2UgaWYgKHByb3BXZWlnaHQuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJd2VpZ2h0ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlIGlmIChwcm9wU2l6ZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpIHsKLQkJCQkJCXNpemUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCQlicmVhazsgLy8gaWYgc2l6ZSBmb3VuZCwgYnJlYWsgbG9vcAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiAmJiB3ZWlnaHQgPT0gbnVsbCAmJiBwcm9wV2VpZ2h0LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkgewotCQkJCXdlaWdodCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKSB7Ci0JCQkJc2l6ZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQlicmVhazsgLy8gaWYgc2l6ZSBmb3VuZCwgYnJlYWsgbG9vcAotCQkJfQotCQl9Ci0KLQkJaWYgKGJOb3JtYWxTcGVjaWZpZWQpIHsKLQkJCWlmIChzdHlsZSA9PSBudWxsKQotCQkJCXN0eWxlID0gSVZhbElELlZfTk9STUFMOwotCQkJaWYgKHZhcmlhbnQgPT0gbnVsbCkKLQkJCQl2YXJpYW50ID0gSVZhbElELlZfTk9STUFMOwotCQkJaWYgKHdlaWdodCA9PSBudWxsKQotCQkJCXdlaWdodCA9IElWYWxJRC5WX05PUk1BTDsKLQkJfQotCi0JCS8vIHNraXAgd2hpdGVzcGFjZQotCQlmb3IgKGkrKzsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHRva2Vuc1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gbGluZS1oZWlnaHQgPwotCQlpZiAoaSA8IHRva2Vucy5sZW5ndGggJiYgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SICYmIHRva2Vuc1tpXS5pbWFnZS5lcXVhbHMoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGkrKzsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQkJaGVpZ2h0ID0gdG9rZW5zW2krK10uaW1hZ2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGZvbnQtZmFtaWx5Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCX0KLQkJZmFtaWx5ID0gYnVmLnRvU3RyaW5nKCkudHJpbSgpOwotCi0JCWlmIChwcm9wU3R5bGUgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gc3R5bGU7Ci0JCWVsc2UgaWYgKHByb3BWYXJpYW50ID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHZhcmlhbnQ7Ci0JCWVsc2UgaWYgKHByb3BXZWlnaHQgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gd2VpZ2h0OwotCQllbHNlIGlmIChwcm9wU2l6ZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBzaXplOwotCQllbHNlIGlmIChwcm9wSGVpZ2h0ID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGhlaWdodDsKLQkJZWxzZSBpZiAocHJvcEZhbWlseSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBmYW1pbHk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JQ1NTMlByb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JQ1NTMlByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmNjQzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vSUNTUzJQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTMlByb3BlcnRpZXM7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTMlByb3BlcnRpZXMgZXh0ZW5kcyBDU1MyUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGFwcGx5RnVsbChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYXBwbHlNb2RpZmllZChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXQoUHJvcENNUHJvcGVydHkgcHJvcCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0QmFja2dyb3VuZFBvc2l0aW9uWCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldEJhY2tncm91bmRQb3NpdGlvblkoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRDbGlwQm90dG9tKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xpcExlZnQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRDbGlwUmlnaHQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRDbGlwVG9wKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzTW9kaWZpZWQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUVudW1lcmF0aW9uIHByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUl0ZXJhdG9yIHByb3BlcnRpZXNNb2RpZmllZCgpOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZXNldE1vZGlmaWVkKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldChQcm9wQ01Qcm9wZXJ0eSBwcm9wLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldEJhY2tncm91bmRQb3NpdGlvblgoU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0QmFja2dyb3VuZFBvc2l0aW9uWShTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRDbGlwQm90dG9tKFN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldENsaXBMZWZ0KFN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldENsaXBSaWdodChTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRDbGlwVG9wKFN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vSVNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWQ0MDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0lTdWJQcm9wZXJ0eUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JU3ViUHJvcGVydHlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNjlmMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0lTdWJQcm9wZXJ0eUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN1YlByb3BlcnR5QWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vTGlzdFN0eWxlU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0xpc3RTdHlsZVNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcxMzI3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vTGlzdFN0eWxlU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdsaXN0LXN0eWxlJyBwcm9wZXJ0eSAnbGlzdC1zdHlsZScgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2xpc3Qtc3R5bGUtaW1hZ2UnLCAnbGlzdC1zdHlsZS1wb3NpdGlvbicsICdsaXN0LXN0eWxlLXR5cGUnLAotICovCi1wdWJsaWMgY2xhc3MgTGlzdFN0eWxlU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBMaXN0U3R5bGVTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGltYWdlID0gIiIsIHBvcyA9ICIiLCB0eXBlID0gIiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BQb3MgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9QT1NJVElPTik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BUeXBlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfVFlQRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BJbWFnZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX0lNQUdFKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wUG9zLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJcG9zID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgeyAvLyB2YWx1ZT0ibm9uZSIgaXMgc2hhcmVkICEhCi0JCQkJCWlmIChwcm9wVHlwZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQl0eXBlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQlpZiAocHJvcEltYWdlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCWltYWdlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkpIHsKLQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJfQotCi0JCWRlc3Quc2V0KHByb3BQb3MuZ2V0TmFtZSgpLCBwb3MpOwotCQlkZXN0LnNldChwcm9wVHlwZS5nZXROYW1lKCksIHR5cGUpOwotCQlkZXN0LnNldChwcm9wSW1hZ2UuZ2V0TmFtZSgpLCBpbWFnZSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBpbWFnZSA9IG51bGwsIHBvcyA9IG51bGwsIHR5cGUgPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wUG9zID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfUE9TSVRJT04pOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wVHlwZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1RZUEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wSW1hZ2UgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9JTUFHRSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFBvcy5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXBvcyA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIHsgLy8gdmFsdWU9Im5vbmUiIGlzIHNoYXJlZCAhIQotCQkJCQlpZiAocHJvcFR5cGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJdHlwZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJaWYgKHByb3BJbWFnZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJKSB7Ci0JCQkJaW1hZ2UgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcFBvcyA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBwb3M7Ci0JCWVsc2UgaWYgKHByb3BUeXBlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHR5cGU7Ci0JCWVsc2UgaWYgKHByb3BJbWFnZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBpbWFnZTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL01hcmdpblNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9NYXJnaW5TaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzY2YxZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL01hcmdpblNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnbWFyZ2luJyBwcm9wZXJ0eSAnbWFyZ2luJyB3aWxsIGJlIGV4cGFuZGVkIHRvICdtYXJnaW4tdG9wJywKLSAqICdtYXJnaW4tcmlnaHQnLCAnbWFyZ2luLWJvdHRvbScsICdtYXJnaW4tbGVmdCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJnaW5TaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE1hcmdpblNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCVN0cmluZ1tdIGRlc3RzID0gbmV3IFN0cmluZ1s0XTsKLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChqID09IDEpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMV0gPSBkZXN0c1syXSA9IGRlc3RzWzNdID0gaWRlbnRzWzBdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJZGVzdHNbMF0gPSBkZXN0c1syXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlkZXN0c1swXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCQlkZXN0c1syXSA9IGlkZW50c1syXTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKQotCQkJCWRlc3RzW2tdID0gaWRlbnRzW2tdOwotCQl9Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCwgZGVzdHNbMF0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9SSUdIVCwgZGVzdHNbMV0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00sIGRlc3RzWzJdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fTEVGVCwgZGVzdHNbM10pOwotCi0JCXJldHVybiB0cnVlOwotCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChqID09IDEpCi0JCQlyZXR1cm4gaWRlbnRzWzBdOwotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fVE9QIHx8IHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00pCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9UT1ApCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00pCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9UT1ApCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9SSUdIVCkKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0xFRlQpCi0JCQkJcmV0dXJuIGlkZW50c1szXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9QYWRkaW5nU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL1BhZGRpbmdTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMjQzNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL1BhZGRpbmdTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ3BhZGRpbmcnIHByb3BlcnR5ICdwYWRkaW5nJyB3aWxsIGJlIGV4cGFuZGVkIHRvICdwYWRkaW5nLXRvcCcsCi0gKiAncGFkZGluZy1yaWdodCcsICdwYWRkaW5nLWJvdHRvbScsICdwYWRkaW5nLWxlZnQnLAotICovCi1wdWJsaWMgY2xhc3MgUGFkZGluZ1Nob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUGFkZGluZ1Nob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJU3RyaW5nW10gZGVzdHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKGogPT0gMSkgewotCQkJZGVzdHNbMF0gPSBkZXN0c1sxXSA9IGRlc3RzWzJdID0gZGVzdHNbM10gPSBpZGVudHNbMF07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzJdID0gaWRlbnRzWzBdOwotCQkJZGVzdHNbMV0gPSBkZXN0c1szXSA9IGlkZW50c1sxXTsKLQkJfQotCQllbHNlIGlmIChqID09IDMpIHsKLQkJCWRlc3RzWzBdID0gaWRlbnRzWzBdOwotCQkJZGVzdHNbMV0gPSBkZXN0c1szXSA9IGlkZW50c1sxXTsKLQkJCWRlc3RzWzJdID0gaWRlbnRzWzJdOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChpbnQgayA9IDA7IGsgPCA0OyBrKyspCi0JCQkJZGVzdHNba10gPSBpZGVudHNba107Ci0JCX0KLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1RPUCwgZGVzdHNbMF0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfUklHSFQsIGRlc3RzWzFdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0JPVFRPTSwgZGVzdHNbMl0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfTEVGVCwgZGVzdHNbM10pOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChqID09IDEpCi0JCQlyZXR1cm4gaWRlbnRzWzBdOwotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1RPUCB8fCBwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0JPVFRPTSkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1ApCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfQk9UVE9NKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1RPUCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19SSUdIVCkKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00pCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfTEVGVCkKLQkJCQlyZXR1cm4gaWRlbnRzWzNdOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vVmFsdWVEYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vVmFsdWVEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MjgyZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL1ZhbHVlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFZhbHVlRGF0YSB7Ci0KLQlwdWJsaWMgU3RyaW5nIHZhbHVlOwotCXB1YmxpYyBib29sZWFuIGltcG9ydGFudCA9IGZhbHNlOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFZhbHVlRGF0YSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgVmFsdWVEYXRhKFN0cmluZyB2YWwsIGJvb2xlYW4gaW1wKSB7Ci0JCXN1cGVyKCk7Ci0JCXZhbHVlID0gdmFsOwotCQlpbXBvcnRhbnQgPSBpbXA7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdGV4dC9JQ1NTUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS90ZXh0L0lDU1NQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNzNkNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS90ZXh0L0lDU1NQYXJ0aXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuIEl0IGRlZmluZXMgdGhlCi0gKiBwYXJ0aXRpb25pbmcgZm9yIENTUyBhbmQgYWxsIGl0cyBwYXJ0aXRpb25zLiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlCi0gKiBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQgaGVyZSBkaXJlY3RseS4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NQYXJ0aXRpb25zIHsKLQotCVN0cmluZyBTVFlMRSA9ICJvcmcuZWNsaXBzZS53c3QuY3NzLlNUWUxFIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC5jc3MuQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjODYyOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIKLQkJcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvdzNjL2RvbS9jc3MvKiovKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlLyoqIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvKioiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC94bWwvY29yZS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS91aS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3htbC91aS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlQWRhcHRlckZhY3RvcnkiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5ncyIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSU1vZHVsZUNvbnN0YW50cyIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9ubHMvRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyIiAvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIKLQkJcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iIC8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMzdmOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWNzc2VkaXRvci5qYXIKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWRldi5wcm9wZXJ0aWVzCi1iaW4KLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmMGI1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3Byb2plY3Rpb25wZXJmPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MjAzNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNzcy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTc0YzE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jV2VkIE1hciAyOCAwMzoyMDo0MSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdiZTQ5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNzcy51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjYwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jc3MudWksCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuYXV0b2VkaXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXQudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaGFuZGxlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb3BlcnRpZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnJlZ2lzdHJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zZWxlY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnN0eWxlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLndpemFyZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MuY29udGVudG91dGxpbmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5wcm9wZXJ0aWVzCi1JbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudXRpbDsgdmVyc2lvbj0iMy44IiwKLSBjb20uaWJtLmljdS50ZXh0OyB2ZXJzaW9uPSIzLjgiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjEwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS40MDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuNC4wLDIuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbAotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNmOWI0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIHRlbXBsYXRlcy8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdjc3Nfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3Y3NzX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NGY3NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdjc3Nfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3Y3NzX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2Nzc193aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjI4N2E1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3Y3NzX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9hdXJhbF9wcm9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9hdXJhbF9wcm9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMTcwNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXVyYWxfcHJvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvYm94bW9kZWxfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvYm94bW9kZWxfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzA1MGY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2JveG1vZGVsX3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NoYXJzZXRfcnVsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jaGFyc2V0X3J1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTkzODQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NoYXJzZXRfcnVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc19zZWxlY3Rvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc19zZWxlY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MjRkN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2xhc3Nfc2VsZWN0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29sYmFja19wcm9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jb2xiYWNrX3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhMjMwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jb2xiYWNrX3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NvbnRlbnRfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29udGVudF9wcm9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzNkZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29udGVudF9wcm9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHluYW1lLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eW5hbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGU1OGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eW5hbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5dmFsdWVfZnVuY3Rpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5dmFsdWVfZnVuY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2QxMmRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX2Z1bmN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX2lkZW50aWZpZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5dmFsdWVfaWRlbnRpZmllci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZGJkZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5dmFsdWVfaWRlbnRpZmllci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV91bml0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX3VuaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDhhM2FlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX3VuaXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvZm9udF9wcm9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9mb250X3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhNWY4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9mb250X3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2ZvbnRmYWNlX3J1bGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvZm9udGZhY2VfcnVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZjU5ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvZm9udGZhY2VfcnVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9pZF9zZWxlY3Rvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9pZF9zZWxlY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwODU3ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvaWRfc2VsZWN0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvbGlua19ydWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2xpbmtfcnVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZDg5Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvbGlua19ydWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2xpbmtfc2VsZWN0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvbGlua19zZWxlY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NWI3OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvbGlua19zZWxlY3Rvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9tZWRpYV9ydWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L21lZGlhX3J1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzkxZjE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L21lZGlhX3J1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvb3RoZXJfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvb3RoZXJfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjBjMjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L290aGVyX3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3BhZ2VfcnVsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWdlX3J1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjVmNjRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3BhZ2VfcnVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWdlZG1lZGlhX3Byb3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3BhZ2VkbWVkaWFfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjYzNWIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3BhZ2VkbWVkaWFfcHJvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHNldWRvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3BzZXVkby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNmE2ZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHNldWRvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3NvcnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzVkMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlYmRiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc3R5bGVfcnVsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9zdHlsZV9ydWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE3NmZmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9zdHlsZV9ydWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3N0eWxlc2hlZXQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc3R5bGVzaGVldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZmRlMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc3R5bGVzaGVldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90YWJsZV9wcm9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90YWJsZV9wcm9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYzc2Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFibGVfcHJvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLXRlbXBsYXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMWY4MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLXRlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RhZ19zZWxlY3Rvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90YWdfc2VsZWN0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTg1MGZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RhZ19zZWxlY3Rvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0X3Byb3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RleHRfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmY2M2Y4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RleHRfcHJvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdWlfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdWlfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWE4Yjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3VpX3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3Vua25vd25fcnVsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi91bmtub3duX3J1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTdlNGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3Vua25vd25fcnVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi92aXN1YWxfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdmlzdWFsX3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhOGIzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi92aXN1YWxfcHJvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2Nzc2ZpbGVfd2l6LnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdjc3NmaWxlX3dpei5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OGU2M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2Nzc2ZpbGVfd2l6LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjM2I4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi1wbHVnaW5OYW1lPVNTRSBDU1MgU291cmNlIEVkaXRvcgotQ1NTX1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lPUNTUyBFZGl0b3IKLUNTU19GaWxlcy5uYW1lPUNTUyBGaWxlcwotQ1NTX1NvdXJjZS5uYW1lPUVkaXRvcgotQ1NTX0NvbnRlbnRfQXNzaXN0Lm5hbWU9Q29udGVudCBBc3Npc3QKLUNTU19TdHlsZXMubmFtZT1TdHlsZXMKLUNTU19UZW1wbGF0ZXMubmFtZT1UZW1wbGF0ZXMKLUNTU19TeW50YXhfQ29sb3Jpbmc9U3ludGF4IENvbG9yaW5nCi1XZWJDb250ZW50U2V0dGluZ3MubmFtZT1XZWIgQ29udGVudCBTZXR0aW5ncwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUaGUgZm9sbG93aW5nIHByb3BlcnR5IGtleXMgbWF5YmUgdW51c2VkLiBDb21tZW50ZWQgb3V0IG9uIDEyLzcvMjAwNC4gVW5jb21tZW50IGlmIG5lZWRlZC4KLSNDU1NfQW5ub3RhdGlvbnMubmFtZT1DU1MgQW5ub3RhdGlvbnMKLQotCi0jb3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyBleHRlbnNpb24gcG9pbnQKLV9VSV9XSVpBUkRfTkFNRSA9IENTUyBGaWxlCi1fVUlfV0laQVJEX0NSRUFURV9ORVdfRklMRSA9IENyZWF0ZSBhIG5ldyBDU1MgZmlsZQotIyMKLUFkZFRhc2subGFiZWw9QWRkICZUYXNrLi4uCi1BZGRUYXNrLnRvb2x0aXA9QWRkIFRhc2suLi4KLUFkZEJvb2ttYXJrLmxhYmVsPUFkZCBCb28ma21hcmsuLi4KLUFkZEJvb2ttYXJrLnRvb2x0aXA9QWRkIEJvb2ttYXJrLi4uCi1TZWxlY3RSdWxlci5sYWJlbD1TZWxlY3QgUnVsZXIKLSMjCi1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsPUVuY2xvc2luZyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWw9TmV4dCBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIG5leHQgc2libGluZwotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWw9UHJldmlvdXMgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgcHJldmlvdXMgc2libGluZwotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbD1SZXN0b3JlIExhc3QgU2VsZWN0aW9uCi1TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXA9UmVzdG9yZSBsYXN0IHNlbGVjdGlvbgotIyMKLUFsbF9DU1NfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9QWxsIENTUwotQ1NTX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1OZXcgQ1NTCi0jIwotcHJlZmVyZW5jZUtleXdvcmRzLmZpbGVzPWVkaXRvciBjc3MgY3JlYXRpbmcgc2F2aW5nIGZpbGVzIHN1ZmZpeCBzcGVjaWZpZWQgZW5jb2RpbmcgaWFuYQotcHJlZmVyZW5jZUtleXdvcmRzLnNvdXJjZT1lZGl0b3IgY3NzIHNvdXJjZSBmb3JtYXR0aW5nIGxpbmUgd2lkdGggaW5zZXJ0IGJyZWFrIHByb3BlcnRpZXMgd3JhcHBpbmcgc3R5bGUgYXR0cmlidXRlIGh0bWwgaW5kZW50IHRhYnMgc3BhY2VzIHNpemUgY2FwaXRhbGl6YXRpb24gaWRlbnRpZmllciBwcm9wZXJ0eSBuYW1lIHZhbHVlIHVwcGVyY2FzZSBsb3dlcmNhc2UKLXByZWZlcmVuY2VLZXl3b3Jkcy5jb250ZW50YXNzaXN0PWVkaXRvciBjc3MgY29udGVudCBjb2RlIGFzc2lzdCBjb21wbGV0ZSBjb21wbGV0aW9uIGluc2VydCBvdmVyd3JpdGUgc2luZ2xlIHByb3Bvc2FsIGNvbW1vbiBwcmVmaXggYXV0b21hdGljYWxseSBpbXBvcnQgZmlsbCBhcmd1bWVudCBuYW1lIGd1ZXNzIGFscGhhYmV0aWNhbCBoaWRlIGF1dG8gYWN0aXZhdGlvbiB0cmlnZ2VyIGNhdGVnb3J5IGNhdGVnb3JpZXMgc2VwYXJhdGUgc3BlY2lmaWMKLXByZWZlcmVuY2VLZXl3b3Jkcy50ZW1wbGF0ZXM9ZWRpdG9yIGNzcyB0ZW1wbGF0ZXMgc25pcHBldCBtYWNyb3MKLXByZWZlcmVuY2VLZXl3b3Jkcy5zdHlsZXM9ZWRpdG9yIGNzcyBzdHlsZSBjdXN0b21pemUgc3ludGF4IGhpZ2hsaWdodGluZyB0eXBlIHRleHQgY29udGVudCBmb3JlZ3JvdW5kIGJhY2tncm91bmQgYm9sZCBjb2xvcgotcHJlZmVyZW5jZUtleXdvcmRzLndlYmNvbnRlbnQ9ZWRpdG9yIGNzcyB3ZWIgY29udGVudCBzZXR0aW5ncyBwcm9maWxlIHN0eWxlCi0KLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuY3NzLm5hbWU9RWRpdGluZyBDU1MgU291cmNlCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmNzcy5kZXNjcmlwdGlvbj1FZGl0aW5nIENTUyBTb3VyY2UKLQotY29tbWFuZC50b2dnbGUuY29tbWVudC5tbmVtb25pYz1UCi1jb21tYW5kLnJlbW92ZS5ibG9jay5jb21tZW50Lm1uZW1vbmljPVIKLWNvbW1hbmQuYWRkLmJsb2NrLmNvbW1lbnQubW5lbW9uaWM9QQotCi1Db2xvcnMuYXRtYXJrUnVsZT1BdCBNYXJrIFJ1bGUKLUNvbG9ycy5zZWxlY3Rvcj1TZWxlY3RvcgotQ29sb3JzLm1lZGlhPU1lZGlhCi1Db2xvcnMuY29tbWVudD1Db21tZW50Ci1Db2xvcnMucHJvcGVydHlOYW1lPVByb3BlcnR5IE5hbWUKLUNvbG9ycy5wcm9wZXJ0eVZhbHVlPVByb3BlcnR5IFZhbHVlCi1Db2xvcnMudXJpPVVSSQotQ29sb3JzLnN0cmluZz1TdHJpbmcKLUNvbG9ycy5lcnJvcj1FcnJvcgotQ29sb3JzLmNvbWJpbmF0b3I9Q29tYmluYXRvcgotQ29sb3JzLnBzZXVkbz1Qc2V1ZG8tY2xhc3MKLUNvbG9ycy5hdHRyVmFsdWU9QXR0cmlidXRlIFZhbHVlCi1Db2xvcnMuYXR0ck9wPUF0dHJpYnV0ZSBPcGVyYXRvcgotQ29sb3JzLmF0dHJOYW1lPUF0dHJpYnV0ZSBOYW1lCi1Db2xvcnMuYXR0ckRlbGltPUF0dHJpYnV0ZSBEZWxpbWl0ZXIKLUNvbG9ycy51bml2ZXJzYWw9VW5pdmVyc2FsIFNlbGVjdG9yCi1Db2xvcnMuY2xhc3M9Q2xhc3Mgc2VsZWN0b3IKLUNvbG9ycy5pZD1JRCBTZWxlY3RvcgotCi1wcm9wb3NhbENhdGVnb3J5LmNzcz1DU1MgUHJvcG9zYWxzCi1wcm9wb3NhbENhdGVnb3J5LmNzc1RlbXBsYXRlcz1DU1MgVGVtcGxhdGUgUHJvcG9zYWxzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjcyZDE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0JCTxlZGl0b3IKLQkJCW5hbWU9IiVDU1NfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWUiCi0JCQlpY29uPSIkbmwkL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZiIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQWN0aW9uQ29udHJpYnV0b3JDU1MiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIKLQkJCXN5bWJvbGljRm9udE5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZS5zb3VyY2UiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JCTwvZWRpdG9yPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPGNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MuY29udGVudG91dGxpbmUuQ1NTQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIiAvPgotCQk8cXVpY2tPdXRsaW5lQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MuY29udGVudG91dGxpbmUuQ1NTUXVpY2tPdXRsaW5lQ29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIgLz4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIgLz4KLQkJPHByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5wcm9wZXJ0aWVzLkNTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJjaGFyYWN0ZXJwYWlybWF0Y2hlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRleHQuQ1NTRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0iZm9sZGluZ3N0cmF0ZWd5IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvamVjdGlvbi5DU1NGb2xkaW5nU3RyYXRlZ3kiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImF1dG9lZGl0c3RyYXRlZ3kiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5hdXRvZWRpdC5TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUNTUyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5TVFlMRSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkucHJlZmVyZW5jZXMuY3NzIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzLnNvdXJjZSwgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5wcmVmZXJlbmNlcy50ZW1wbGF0ZXMsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzLnN0eWxlcywgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3MuY29udGVudGFzc2lzdCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0ic3BlbGxpbmdyZWdpb25zIgotCQkJdmFsdWU9IkNPTU1FTlQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9ImFjdGl2ZWNvbnRleHRzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMiPgotCQk8Y29udGV4dAotCQkJbmFtZT0iJXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuY3NzLm5hbWUiCi0JCQlwYXJlbnRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJZGVzY3JpcHRpb249IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmNzcy5kZXNjcmlwdGlvbiIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIj4KLQkJPC9jb250ZXh0PgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbiI+Ci0JCTxhZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyQ1NTIj4KLQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIgLz4KLQkJPC9hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5hbm5vdGF0aW9uTW9kZWxDcmVhdGlvbiI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JCTxwYWdlCi0JCQluYW1lPSIlQ1NTX0ZpbGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMud2ViIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ1NTRmlsZXNQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByZWZlcmVuY2VzLmNzcyI+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5maWxlcyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlQ1NTX1NvdXJjZS5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkucHJlZmVyZW5jZXMuY3NzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ1NTU291cmNlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3Muc291cmNlIj4KLQkJCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnNvdXJjZSIvPgotCQk8L3BhZ2U+Ci0gIDxwYWdlCi0gICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmNzcy5zb3VyY2UiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNTU0NvbnRlbnRBc3Npc3RQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzLmNvbnRlbnRhc3Npc3QiCi0gICAgICAgIG5hbWU9IiVDU1NfQ29udGVudF9Bc3Npc3QubmFtZSI+Ci0gICAgIDxrZXl3b3JkUmVmZXJlbmNlCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNvbnRlbnRhc3Npc3QiPgotICAgICA8L2tleXdvcmRSZWZlcmVuY2U+Ci0gIDwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVDU1NfVGVtcGxhdGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3Muc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ1NTVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByZWZlcmVuY2VzLnRlbXBsYXRlcyI+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS50ZW1wbGF0ZXMiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUNTU19TeW50YXhfQ29sb3JpbmciCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3Muc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ1NTU3ludGF4Q29sb3JpbmdQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzLnN0eWxlcyI+Ci0gICAgICAgICAJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuc3R5bGVzIi8+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gQ1NTIENvbnRlbnQgU2V0dGluZ3MgUHJvcGVydHkgUGFnZSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVXZWJDb250ZW50U2V0dGluZ3MubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLkNTU1dlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkNTU1dlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5jc3MiPgotICAgICAgICAgCTxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgIAk8YW5kPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotCQkJCQkJPG9yPiAKLQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29udGVudFR5cGVJZCIKLQkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvYW5kPiAKLQkJCTwvZW5hYmxlZFdoZW4+Ci0gICAgICAgICAJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkud2ViY29udGVudCIvPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIEtleXdvcmRzIGZvciBwcmVmZXJlbmNlIGFuZCBwcm9wZXJ0aWVzIHBhZ2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmtleXdvcmRzIj4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLmZpbGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuZmlsZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnNvdXJjZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnNvdXJjZSIvPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMudGVtcGxhdGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkudGVtcGxhdGVzIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5zdHlsZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5zdHlsZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLndlYmNvbnRlbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS53ZWJjb250ZW50Ii8+Ci0gIDxrZXl3b3JkCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNvbnRlbnRhc3Npc3QiCi0gICAgICAgIGxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLmNvbnRlbnRhc3Npc3QiPgotICA8L2tleXdvcmQ+Ci0gICAgPC9leHRlbnNpb24+Ci0KLQk8IS0tIEVkaXRvciBhY3Rpb25zZXRzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMiPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LmFjdGlvblNldC5hbm5vdGF0aW9uTmF2aWdhdGlvbiI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZS5zb3VyY2UiPjwvcGFydD4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5OYXZpZ2F0ZUFjdGlvblNldCI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZS5zb3VyY2UiPjwvcGFydD4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotCQk8ZmFjdG9yeQotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5DU1NTZWxlY3Rpb25Db252ZXJ0ZXJGYWN0b3J5Ij4KLQkJCTxhZGFwdGVyCi0JCQkJdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuU2VsZWN0aW9uQ29udmVydG9yIi8+Ci0JCTwvZmFjdG9yeT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gaW5pdGlhbGl6ZSBjc3MgdWkgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NVSVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gTmV3IENTUyB3aXphcmQgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0JCTx3aXphcmQKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLndpemFyZC5OZXdDU1NXaXphcmQiCi0JCQluYW1lPSIlX1VJX1dJWkFSRF9OQU1FIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwud2l6YXJkLk5ld0NTU1dpemFyZCIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIgotCQkJaWNvbj0iJG5sJC9pY29ucy9mdWxsL2V0b29sMTYvbmV3Y3NzX3dpei5naWYiPgotCQkJPGRlc2NyaXB0aW9uPiVfVUlfV0laQVJEX0NSRUFURV9ORVdfRklMRTwvZGVzY3JpcHRpb24+Ci0JCQk8c2VsZWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiIC8+Ci0JCTwvd2l6YXJkPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLQkJPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9Im1lbnU6ZWRpdD9hZnRlcj1hZGRpdGlvbnMiPgotCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5lZGl0LnRleHQuY29udGVudEFzc2lzdC5wcm9wb3NhbHMiIGlkPSJDU1NDb250ZW50QXNzaXN0IiBzdHlsZT0icHVzaCI+Ci0JCQkgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNzc1NvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4KLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JCTx2aWV3ZXJDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlLnNvdXJjZS5SdWxlckNvbnRleHQiCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5ydWxlci5jb250ZXh0LmFjdGlvbnMiPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkVGFzay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5BZGRUYXNrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkVGFzay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkQm9va21hcmsudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCTwvdmlld2VyQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBUZW1wbGF0ZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZW1wbGF0ZXMiPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVBbGxfQ1NTX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVDU1MiCi0JCQlpZD0iY3NzX2FsbCI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUNTU19OZXdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUNTUyIKLQkJCWlkPSJjc3NfbmV3Ij4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGluY2x1ZGUKLQkJCWZpbGU9InRlbXBsYXRlcy9jc3NkZWZhdWx0LXRlbXBsYXRlcy54bWwiCi0JCQl0cmFuc2xhdGlvbnM9IiRubCQvdGVtcGxhdGVzL2Nzc2RlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMiPgotCQk8L2luY2x1ZGU+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0gCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgotCQk8aGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaGFuZGxlcnMuQ2xlYW51cERvY3VtZW50SGFuZGxlciIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jbGVhbnVwLmRvY3VtZW50Ij4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNzc1NvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiIvPgotCQkJPC9hY3RpdmVXaGVuPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNzc1NvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiIvPgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9oYW5kbGVyPgotCQk8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmhhbmRsZXJzLlRvZ2dsZUNvbW1lbnRIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50b2dnbGUuY29tbWVudCI+Ci0gICAgICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgCTxyZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNzc1NvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+Ci0gICAgICAgICAgICAgCTwvcmVmZXJlbmNlPgotICAgICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgCTxyZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNzc1NvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+Ci0gICAgICAgICAgICAgCTwvcmVmZXJlbmNlPgotICAgICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaGFuZGxlcnMuQWRkQmxvY2tDb21tZW50SGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRkLmJsb2NrLmNvbW1lbnQiPgotICAgICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgIAk8cmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iPgotICAgICAgICAgICAgIAk8L3JlZmVyZW5jZT4KLSAgICAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgIAk8cmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iPgotICAgICAgICAgICAgIAk8L3JlZmVyZW5jZT4KLSAgICAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmhhbmRsZXJzLlJlbW92ZUJsb2NrQ29tbWVudEhhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnJlbW92ZS5ibG9jay5jb21tZW50Ij4KLSAgICAgICAgICAgICA8YWN0aXZlV2hlbj4KLSAgICAgICAgICAgICAJPHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuY3NzU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj4KLSAgICAgICAgICAgICAJPC9yZWZlcmVuY2U+Ci0gICAgICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAJPHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuY3NzU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj4KLSAgICAgICAgICAgICAJPC9yZWZlcmVuY2U+Ci0gICAgICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0JCTxoYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5oYW5kbGVycy5TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nSGFuZGxlciIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LmVuY2xvc2luZyI+Ci0JCQk8YWN0aXZlV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iLz4KLQkJCTwvYWN0aXZlV2hlbj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iLz4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQkJPGhhbmRsZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmhhbmRsZXJzLlN0cnVjdHVyZWRTZWxlY3ROZXh0SGFuZGxlciIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiPgotCQkJPGFjdGl2ZVdoZW4+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuY3NzU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIi8+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuY3NzU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIi8+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L2hhbmRsZXI+Ci0JCTxoYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5oYW5kbGVycy5TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNIYW5kbGVyIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QucHJldmlvdXMiPgotCQkJPGFjdGl2ZVdoZW4+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuY3NzU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIi8+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuY3NzU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIi8+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L2hhbmRsZXI+Ci0JCTwhLS0gVE9ETyBVc2UgdGhlIGhhbmRsZXIgZnJvbSBTU0Ugb3IgWE1MJ3MgZGVjbGFyYXRpb24gLS0+Ci0JCTxoYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVycy5TdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUhhbmRsZXIiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0Ij4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNzc1NvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiIvPgotCQkJPC9hY3RpdmVXaGVuPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNzc1NvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiIvPgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9oYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgotCQk8bWVudUNvbnRyaWJ1dGlvbgotCSAgICAgICBsb2NhdGlvblVSST0icG9wdXA6c291cmNlUG9wdXBNZW51SWQ/YmVmb3JlPXNvdXJjZUJlZ2luIj4KLQkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50b2dnbGUuY29tbWVudCIgaWQ9IlRvZ2dsZUNvbW1lbnQiIHN0eWxlPSJwdXNoIj4KLQkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNzc1NvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiIvPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRkLmJsb2NrLmNvbW1lbnQiIGlkPSJBZGRCbG9ja0NvbW1lbnQiIHN0eWxlPSJwdXNoIj4KLQkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNzc1NvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiIgLz4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkJPC9jb21tYW5kPgotCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnJlbW92ZS5ibG9jay5jb21tZW50IiBpZD0iUmVtb3ZlQmxvY2tDb21tZW50IiBzdHlsZT0icHVzaCI+Ci0JCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iIC8+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4KLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCi0JCTxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51OnNvdXJjZU1lbnVJZD9iZWZvcmU9c291cmNlQmVnaW4iPgotCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZ2dsZS5jb21tZW50IgotCQkJICAgICAgICAgaWQ9IlRvZ2dsZUNvbW1lbnQiCi0JCQkgICAgICAgICBtbmVtb25pYz0iJWNvbW1hbmQudG9nZ2xlLmNvbW1lbnQubW5lbW9uaWMiCi0JCQkgICAgICAgICBzdHlsZT0icHVzaCI+Ci0JCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iLz4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkJPC9jb21tYW5kPgotCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkZC5ibG9jay5jb21tZW50IgotCQkJICAgICAgICAgaWQ9IkFkZEJsb2NrQ29tbWVudCIKLQkJCSAgICAgICAgIG1uZW1vbmljPSIlY29tbWFuZC5hZGQuYmxvY2suY29tbWVudC5tbmVtb25pYyIKLQkJCSAgICAgICAgIHN0eWxlPSJwdXNoIj4KLQkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNzc1NvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiIvPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucmVtb3ZlLmJsb2NrLmNvbW1lbnQiCi0JCQkgICAgICAgICBpZD0iUmVtb3ZlQmxvY2tDb21tZW50IgotCQkJICAgICAgICAgbW5lbW9uaWM9IiVjb21tYW5kLnJlbW92ZS5ibG9jay5jb21tZW50Lm1uZW1vbmljIgotCQkJICAgICAgICAgc3R5bGU9InB1c2giPgotCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuY3NzU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIi8+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4KLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gQ1NTIGVkaXRvciBhY3Rpb25zIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotCQk8IS0tPGVkaXRvckNvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2Uuc291cmNlLmVkaXRvckFjdGlvbnMiCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZS5zb3VyY2UiPgotCQkJPGFjdGlvbgotCQkJCWlkPSJDbGVhbnVwRG9jdW1lbnQiCi0JCQkJbGFiZWw9IiVDbGVhbnVwRG9jdW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNsZWFudXAuZG9jdW1lbnQiCi0JCQkJdG9vbHRpcD0iJUNsZWFudXBEb2N1bWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXQudWkuQ2xlYW51cEFjdGlvbkNTU0RlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJDbGVhbnVwRG9jdW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5lbmNsb3NpbmciCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nQ1NTQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0TmV4dCIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0TmV4dENTU0FjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3ROZXh0Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LnByZXZpb3VzIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNDU1NBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0SGlzdG9yeSI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9lZGl0b3JDb250cmlidXRpb24+LS0+Ci0gICAgICAgIDxlZGl0b3JDb250cmlidXRpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlLnNvdXJjZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlLnJ1bGVyLmFjdGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckRvdWJsZUNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIvPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVTZWxlY3RSdWxlci5sYWJlbCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIvPgotICAgICAgICA8L2VkaXRvckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuY3NzU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj4KLSAgICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJhY3RpdmVDb250ZXh0cyI+Ci0JICAgICAgICAgICA8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCSAgICAgICAgICAgICAgPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIvPgotCSAgICAgICAgICAgPC9pdGVyYXRlPgotICAgICAgICAgICAgPC93aXRoPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBEZWZpbmUgdGhlbWUgLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkudGhlbWVzIj4KLQkJPHRoZW1lCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkuaWRlLnN5c3RlbURlZmF1bHQiPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iQVRNQVJLX1JVTEUiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJTRUxFQ1RPUiIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9Ik1FRElBIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iQ09NTUVOVCIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9TRUxFQ1RJT04iPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iUFJPUEVSVFlfTkFNRSIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9IlBST1BFUlRZX1ZBTFVFIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iVVJJIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iU1RSSU5HIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iRVJST1IiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJVTklWRVJTQUwiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJJRCIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9IkNMQVNTIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iQVRUUklCVVRFX0RFTElNIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iQVRUUklCVVRFX05BTUUiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJBVFRSSUJVVEVfT1BFUkFUT1IiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJBVFRSSUJVVEVfVkFMVUUiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJQU0VVRE8iCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJDT01CSU5BVE9SIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQk8L3RoZW1lPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iQVRNQVJLX1JVTEUiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmF0bWFya1J1bGUiCi0JCQl2YWx1ZT0iNjMsIDEyNywgMTI3Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJTRUxFQ1RPUiIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuc2VsZWN0b3IiCi0JCQl2YWx1ZT0iNjMsIDEyNywgMTI3Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJNRURJQSIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMubWVkaWEiCi0JCQl2YWx1ZT0iNDIsIDAsIDIyNSI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iQ09NTUVOVCIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuY29tbWVudCIKLQkJCXZhbHVlPSI2MywgOTUsIDE5MSI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iUFJPUEVSVFlfTkFNRSIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMucHJvcGVydHlOYW1lIgotCQkJdmFsdWU9IjEyNywgMCwgMTI3Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJQUk9QRVJUWV9WQUxVRSIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMucHJvcGVydHlWYWx1ZSIKLQkJCXZhbHVlPSI0MiwgMCwgMjI1Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJVUkkiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLnVyaSIKLQkJCXZhbHVlPSI0MiwgMCwgMjI1Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJTVFJJTkciCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLnN0cmluZyIKLQkJCXZhbHVlPSI0MiwgMCwgMjI1Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJFUlJPUiIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuZXJyb3IiCi0JCQl2YWx1ZT0iMTkxLCA2MywgNjMiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9IlVOSVZFUlNBTCIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMudW5pdmVyc2FsIgotCQkJdmFsdWU9IjYzLCAxMjcsIDEyNyI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iSUQiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmlkIgotCQkJdmFsdWU9IjYzLCAxMjcsIDEyNyI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iQ0xBU1MiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmNsYXNzIgotCQkJdmFsdWU9IjYzLCAxMjcsIDEyNyI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iQVRUUklCVVRFX0RFTElNIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5hdHRyRGVsaW0iCi0JCQl2YWx1ZT0iNjMsIDEyNywgMTI3Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJBVFRSSUJVVEVfTkFNRSIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuYXR0ck5hbWUiCi0JCQl2YWx1ZT0iNjMsIDEyNywgMTI3Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJBVFRSSUJVVEVfT1BFUkFUT1IiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmF0dHJPcCIKLQkJCXZhbHVlPSI2MywgMTI3LCAxMjciPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9IkFUVFJJQlVURV9WQUxVRSIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuYXR0clZhbHVlIgotCQkJdmFsdWU9IjYzLCAxMjcsIDEyNyI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iUFNFVURPIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5wc2V1ZG8iCi0JCQl2YWx1ZT0iNjMsIDEyNywgMTI3Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJDT01CSU5BVE9SIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5jb21iaW5hdG9yIgotCQkJdmFsdWU9IjYzLCAxMjcsIDEyNyI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gRW5hYmxlIHRoZSBGb3JtYXRIYW5kbGVyIGZvciBDU1MgQ29udGVudCBUeXBlIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KLQkJPGhhbmRsZXIgCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVycy5Gb3JtYXRIYW5kbGVyIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmZvcm1hdCI+Ci0JCQk8YWN0aXZlV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NDb250ZW50VHlwZS5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCTwvYWN0aXZlV2hlbj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NDb250ZW50VHlwZS5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIFNldCB1cCBhIGRlZmluaXRpb24gZm9yIENTUyBDb250ZW50IFR5cGVzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NDb250ZW50VHlwZS5kZWZpbml0aW9uIj4KLQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotCQkJCQk8IS0tIEZvcmNlIHByb3BlcnR5IHRlc3RlciB0byBsb2FkLCBzaG91bGQgbm90IGNhdXNlIGVudGlyZSBwbHVnLWluIHRvIHN0YXJ0IC0tPgotCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnJlc291cmNlcy5jb250ZW50VHlwZUlkIgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgotCQkJCTwvYWRhcHQ+Ci0JCQk8L2l0ZXJhdGU+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2hhcmFjdGVyUGFpcmluZyI+Ci0JCTxpbnNlcnRlciBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZXh0LkNTU0NoYXJhY3RlclBhaXJJbnNlcnRlciIgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNzcy51aS5pbnNlcnRlciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIKLQkJCQlwYXJ0aXRpb25zPSJvcmcuZWNsaXBzZS53c3QuY3NzLlNUWUxFIj4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L2luc2VydGVyPgotCQk8aW5zZXJ0ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGV4dC5DU1NDaGFyYWN0ZXJQYWlySW5zZXJ0ZXIiIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmluc2VydGVyIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIKLQkJCQlwYXJ0aXRpb25zPSJvcmcuZWNsaXBzZS53c3QuY3NzLlNUWUxFIj4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L2luc2VydGVyPgotCTwvZXh0ZW5zaW9uPgotIDxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21wbGV0aW9uUHJvcG9zYWwiPgotICAgIDxwcm9wb3NhbENhdGVnb3J5Ci0gICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi90YWdfc2VsZWN0b3IuZ2lmIgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByb3Bvc2FsQ2F0ZWdvcnkuY3NzIgotICAgICAgICAgIG5hbWU9IiVwcm9wb3NhbENhdGVnb3J5LmNzcyI+Ci0gICAgPC9wcm9wb3NhbENhdGVnb3J5PgotICAgIDxwcm9wb3NhbENhdGVnb3J5Ci0gICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi90YWctdGVtcGxhdGUuZ2lmIgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByb3Bvc2FsQ2F0ZWdvcnkuY3NzVGVtcGxhdGVzIgotICAgICAgICAgIG5hbWU9IiVwcm9wb3NhbENhdGVnb3J5LmNzc1RlbXBsYXRlcyI+Ci0gICAgPC9wcm9wb3NhbENhdGVnb3J5PgotICAgIDxwcm9wb3NhbENvbXB1dGVyCi0gICAgICAgICAgYWN0aXZhdGU9ImZhbHNlIgotICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkucHJvcG9zYWxDYXRlZ29yeS5jc3MiCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DU1NDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5wcm9wb3NhbENvbXB1dGVyLmNzcyI+Ci0gICAgICAgPGNvbnRlbnRUeXBlCi0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiPgotICAgICAgIDwvY29udGVudFR5cGU+Ci0gICAgPC9wcm9wb3NhbENvbXB1dGVyPgotICAgIDxwcm9wb3NhbENvbXB1dGVyCi0gICAgICAgICAgYWN0aXZhdGU9ImZhbHNlIgotICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkucHJvcG9zYWxDYXRlZ29yeS5jc3NUZW1wbGF0ZXMiCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DU1NUZW1wbGF0ZXNDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5wcm9wb3NhbENvbXB1dGVyLmNzc1RlbXBsYXRlcyI+Ci0gICAgICAgPGNvbnRlbnRUeXBlCi0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiPgotICAgICAgIDwvY29udGVudFR5cGU+Ci0gICAgPC9wcm9wb3NhbENvbXB1dGVyPgotIDwvZXh0ZW5zaW9uPgotIDxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbiI+Ci0gICAgPGNhdGVnb3JpZXNDb25maWd1cmF0aW9uCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24iCi0gICAgICAgICAgY29udGVudFR5cGVJRD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSI+Ci0gICAgPC9jYXRlZ29yaWVzQ29uZmlndXJhdGlvbj4KLSA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWZlYTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JQ29udGVudEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5NdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRleHQuSUNTU1BhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNTU1N0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBhIHNvdXJjZSB2aWV3ZXIgd2hpY2ggc2hvd3MgQ1NTLgotICogPHA+Ci0gKiBDbGllbnRzIGNhbiBzdWJjbGFzcyBhbmQgb3ZlcnJpZGUganVzdCB0aG9zZSBtZXRob2RzIHdoaWNoIG11c3QgYmUgc3BlY2lmaWMKLSAqIHRvIHRoZWlyIG5lZWRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gewotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uIGJlY2F1c2Ugbm90IHNvdXJjZXZpZXdlci1zcGVjaWZpYyBhbmQKLQkgKiBpdCdzIGEgU3RyaW5nIGFycmF5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZkxpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTOwotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJQXV0b0VkaXRTdHJhdGVneVtdIGdldEF1dG9FZGl0U3RyYXRlZ2llcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCUxpc3QgYWxsU3RyYXRlZ2llcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0KLQkJSUF1dG9FZGl0U3RyYXRlZ3lbXSBzdXBlclN0cmF0ZWdpZXMgPSBzdXBlci5nZXRBdXRvRWRpdFN0cmF0ZWdpZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJTdHJhdGVnaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhbGxTdHJhdGVnaWVzLmFkZChzdXBlclN0cmF0ZWdpZXNbaV0pOwotCQl9Ci0KLQkJcmV0dXJuIChJQXV0b0VkaXRTdHJhdGVneVtdKSBhbGxTdHJhdGVnaWVzLnRvQXJyYXkobmV3IElBdXRvRWRpdFN0cmF0ZWd5WzBdKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlpZiAoZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPT0gbnVsbCkgewotCQkJZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW117SUNTU1BhcnRpdGlvbnMuU1RZTEUsIElDU1NQYXJ0aXRpb25zLkNPTU1FTlQsIElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTiwgSVN0cnVjdHVyZWRQYXJ0aXRpb25zLlVOS05PV05fUEFSVElUSU9OfTsKLQkJfQotCQlyZXR1cm4gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24jZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcnMoCi0JICogCW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIElDb250ZW50QXNzaXN0UHJvY2Vzc29yW10gZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBDU1NTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvcigKLQkJCQl0aGlzLmdldENvbnRlbnRBc3Npc3RhbnQoKSwgcGFydGl0aW9uVHlwZSwgc291cmNlVmlld2VyKTsKLQkJcmV0dXJuIG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde3Byb2Nlc3Nvcn07Ci0JfQotCi0JcHVibGljIElDb250ZW50Rm9ybWF0dGVyIGdldENvbnRlbnRGb3JtYXR0ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJSUNvbnRlbnRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gc3VwZXIuZ2V0Q29udGVudEZvcm1hdHRlcihzb3VyY2VWaWV3ZXIpOwotCQkvLyBzdXBlciB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBhIGZvcm1hdHRlciwgcHJvYmFibHkgYmVjYXVzZQotCQkvLyBzb3VyY2VWaWV3ZXIgZG9lcyBub3QgaGF2ZSBkb2N1bWVudCBzZXQgeWV0LCBzbyBqdXN0IGNyZWF0ZSBhCi0JCS8vIGdlbmVyaWMgb25lCi0JCWlmICghKGZvcm1hdHRlciBpbnN0YW5jZW9mIE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIpKQotCQkJZm9ybWF0dGVyID0gbmV3IE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIoZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHNvdXJjZVZpZXdlciksIElDU1NQYXJ0aXRpb25zLlNUWUxFKTsKLQotCQkoKE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIpIGZvcm1hdHRlcikuc2V0TWFzdGVyU3RyYXRlZ3kobmV3IFN0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3kobmV3IEZvcm1hdFByb2Nlc3NvckNTUygpKSk7Ci0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0SW5kZW50UHJlZml4ZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlWZWN0b3IgdmVjdG9yID0gbmV3IFZlY3RvcigpOwotCi0JCS8vIHByZWZpeFswXSBpcyBlaXRoZXIgJ1x0JyBvciAnICcgeCB0YWJXaWR0aCwgZGVwZW5kaW5nIG9uIHByZWZlcmVuY2UKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJYm9vbGVhbiB1c2VTcGFjZXMgPSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFLmVxdWFscyhpbmRlbnRDaGFyUHJlZik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQlTdHJpbmdCdWZmZXIgcHJlZml4ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYm9vbGVhbiBhcHBlbmRUYWIgPSBmYWxzZTsKLQotCQkJaWYgKHVzZVNwYWNlcykgewotCQkJCWZvciAoaW50IGogPSAwOyBqICsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGorKykKLQkJCQkJcHJlZml4LmFwcGVuZCgnICcpOwotCi0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kVGFiID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKQotCQkJCQlwcmVmaXguYXBwZW5kKCcgJyk7Ci0KLQkJCQlpZiAoaSAhPSBpbmRlbnRhdGlvbldpZHRoKQotCQkJCQlhcHBlbmRUYWIgPSB0cnVlOwotCQkJfQotCi0JCQlpZiAoYXBwZW5kVGFiKSB7Ci0JCQkJcHJlZml4LmFwcGVuZCgnXHQnKTsKLQkJCQl2ZWN0b3IuYWRkKHByZWZpeC50b1N0cmluZygpKTsKLQkJCQkvLyByZW1vdmUgdGhlIHRhYiBzbyB0aGF0IGluZGVudGF0aW9uIC0gdGFiIGlzIGFsc28gYW4gaW5kZW50Ci0JCQkJLy8gcHJlZml4Ci0JCQkJcHJlZml4LmRlbGV0ZUNoYXJBdChwcmVmaXgubGVuZ3RoKCkgLSAxKTsKLQkJCX0KLQkJCXZlY3Rvci5hZGQocHJlZml4LnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJdmVjdG9yLmFkZCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gKFN0cmluZ1tdKSB2ZWN0b3IudG9BcnJheShuZXcgU3RyaW5nW3ZlY3Rvci5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUxpbmVTdHlsZVByb3ZpZGVyW10gcHJvdmlkZXJzID0gbnVsbDsKLQotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBJQ1NTUGFydGl0aW9ucy5TVFlMRSB8fCBwYXJ0aXRpb25UeXBlID09IElDU1NQYXJ0aXRpb25zLkNPTU1FTlQpIHsKLQkJCXByb3ZpZGVycyA9IG5ldyBMaW5lU3R5bGVQcm92aWRlcltde2dldExpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTKCl9OwotCQl9Ci0KLQkJcmV0dXJuIHByb3ZpZGVyczsKLQl9Ci0KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGdldExpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTKCkgewotCQlpZiAoZkxpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvckNTUyA9IG5ldyBMaW5lU3R5bGVQcm92aWRlckZvckNTUygpOwotCQl9Ci0JCXJldHVybiBmTGluZVN0eWxlUHJvdmlkZXJGb3JDU1M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0FjdGlvbkNvbnRyaWJ1dG9yQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQWN0aW9uQ29udHJpYnV0b3JDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiNDVhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQWN0aW9uQ29udHJpYnV0b3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5SZXRhcmdldFRleHRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25EZWZpbml0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5TdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLQotLyoqCi0gKiBBY3Rpb25Db250cmlidXRvckNTUwotICogCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgdXNlZCBpbnNpZGUgbXVsdGkgcGFnZSBlZGl0b3IncwotICogQWN0aW9uQmFyQ29udHJpYnV0b3IsIHNpbmNlIGNhc2NhZGVkIGluaXQoKSBjYWxsIGZyb20gdGhlCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciB3aWxsIGNhdXNlcyBleGNlcHRpb24gYW5kIGl0IGxlYWRzIHRvIGxvc2Ugd2hvbGUKLSAqIHRvb2xiYXJzLgotICogCi0gKiBJbnN0ZWFkLCB1c2UgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yIGZvciBzb3VyY2UgcGFnZSBjb250cmlidXRvciBvZgotICogbXVsdGkgcGFnZSBlZGl0b3IuCi0gKiAKLSAqIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIHN0aWxsIHZhbGlkIGZvciBzaW5nbGUgcGFnZSBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Db250cmlidXRvckNTUyBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFRElUT1JfSURTID0geyJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlLnNvdXJjZSIsICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmQ29udGVudEFzc2lzdCA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmQ2xlYW51cERvY3VtZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZGb3JtYXREb2N1bWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmRm9ybWF0QWN0aXZlRWxlbWVudHMgPSBudWxsOwotCi0JcHVibGljIEFjdGlvbkNvbnRyaWJ1dG9yQ1NTKCkgewotCQlzdXBlcigpOwotCi0JCVJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gQ1NTVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCi0JCS8vIGVkaXQgY29tbWFuZHMKLQkJZkNvbnRlbnRBc3Npc3QgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZkNvbnRlbnRBc3Npc3Quc2V0QWN0aW9uRGVmaW5pdGlvbklkKElUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5DT05URU5UX0FTU0lTVF9QUk9QT1NBTFMpOwotCi0JCS8vIHNvdXJjZSBjb21tYW5kcwotCQlmQ2xlYW51cERvY3VtZW50ID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWZDbGVhbnVwRG9jdW1lbnQuc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuQ0xFQU5VUF9ET0NVTUVOVCk7Ci0KLQkJZkZvcm1hdERvY3VtZW50ID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWZGb3JtYXREb2N1bWVudC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5GT1JNQVRfRE9DVU1FTlQpOwotCi0JCWZGb3JtYXRBY3RpdmVFbGVtZW50cyA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlmRm9ybWF0QWN0aXZlRWxlbWVudHMuc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuRk9STUFUX0FDVElWRV9FTEVNRU5UUyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEV4dGVuc2lvbklEcygpIHsKLQkJcmV0dXJuIEVESVRPUl9JRFM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCS8vIGVkaXQgY29tbWFuZHMKLQkJSU1lbnVNYW5hZ2VyIGVkaXRNZW51ID0gbWVudS5maW5kTWVudVVzaW5nUGF0aChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCk7Ci0JCWlmIChlZGl0TWVudSAhPSBudWxsKSB7Ci0JCQllZGl0TWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCWVkaXRNZW51LmFkZChmVG9nZ2xlSW5zZXJ0TW9kZUFjdGlvbik7Ci0JCQllZGl0TWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCWVkaXRNZW51LmFkZChmRXhwYW5kU2VsZWN0aW9uVG9NZW51KTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZDb250ZW50QXNzaXN0KTsKLQkJCWVkaXRNZW51LmFkZChmTWVudUFkZGl0aW9uc0dyb3VwTWFya2VyKTsKLQkJfQotCi0JCS8vIHNvdXJjZSBjb21tYW5kcwotCQlTdHJpbmcgc291cmNlTWVudUxhYmVsID0gQ1NTVUlNZXNzYWdlcy5Tb3VyY2VNZW51X2xhYmVsOwotCQlTdHJpbmcgc291cmNlTWVudUlkID0gInNvdXJjZU1lbnVJZCI7IC8vJE5PTi1OTFMtMSQKLQkJSU1lbnVNYW5hZ2VyIHNvdXJjZU1lbnUgPSBuZXcgTWVudU1hbmFnZXIoc291cmNlTWVudUxhYmVsLCBzb3VyY2VNZW51SWQpOwotCQltZW51Lmluc2VydEFmdGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElULCBzb3VyY2VNZW51KTsKLQkJaWYgKHNvdXJjZU1lbnUgIT0gbnVsbCkgewotCQkJc291cmNlTWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZTaGlmdFJpZ2h0KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZTaGlmdExlZnQpOwotCQkJc291cmNlTWVudS5hZGQoZkNsZWFudXBEb2N1bWVudCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmRm9ybWF0RG9jdW1lbnQpOwotCQkJc291cmNlTWVudS5hZGQoZkZvcm1hdEFjdGl2ZUVsZW1lbnRzKTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCX0KLQkJSU1lbnVNYW5hZ2VyIG5hdmlnYXRlTWVudSA9IG1lbnUuZmluZE1lbnVVc2luZ1BhdGgoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX05BVklHQVRFKTsKLQkJaWYgKG5hdmlnYXRlTWVudSAhPSBudWxsKSB7Ci0JCQlJTWVudU1hbmFnZXIgZ290b0dyb3VwID0gbmF2aWdhdGVNZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuR09fVE8pOwotCQkJaWYgKGdvdG9Hcm91cCAhPSBudWxsKSB7Ci0JCQkJZ290b0dyb3VwLmFkZChmR290b01hdGNoaW5nQnJhY2tldEFjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0JCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCi0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBnZXRUZXh0RWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0KLQkJZkNvbnRlbnRBc3Npc3Quc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX1BST1BPU0FMUykpOwotCi0JCWZDbGVhbnVwRG9jdW1lbnQuc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DTEVBTlVQX0RPQ1VNRU5UKSk7Ci0JCWZGb3JtYXREb2N1bWVudC5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9ET0NVTUVOVCkpOwotCQlmRm9ybWF0QWN0aXZlRWxlbWVudHMuc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfQUNUSVZFX0VMRU1FTlRTKSk7Ci0JCWZDbGVhbnVwRG9jdW1lbnQuc2V0RW5hYmxlZCh0ZXh0RWRpdG9yICE9IG51bGwgJiYgdGV4dEVkaXRvci5pc0VkaXRhYmxlKCkpOwotCQlmRm9ybWF0RG9jdW1lbnQuc2V0RW5hYmxlZCh0ZXh0RWRpdG9yICE9IG51bGwgJiYgdGV4dEVkaXRvci5pc0VkaXRhYmxlKCkpOwotCQlmRm9ybWF0QWN0aXZlRWxlbWVudHMuc2V0RW5hYmxlZCh0ZXh0RWRpdG9yICE9IG51bGwgJiYgdGV4dEVkaXRvci5pc0VkaXRhYmxlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQ1NTVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0NTU1VJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyZmVkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQ1NTVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBDU1NVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZTsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBDU1NVSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKGZSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCWZSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlmUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiBmUmVzb3VyY2VCdW5kbGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEX1NlbGVjdG9yX0Nhc2VfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTkZPX05vdF9DYXRlZ29yaXplZF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfV3JhcHBpbmdXaXRob3V0QXR0cjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX1dyYXBwaW5nSW5zZXJ0TGluZUJyZWFrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZUdyb3VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZUlkZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZVByb3BOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0Nhc2VJZGVudFVwcGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZUlkZW50TG93ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9TZWxlY3RvclRhZ05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9DYXNlUHJvcE5hbWVVcHBlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0Nhc2VQcm9wTmFtZUxvd2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZVVwcGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZUxvd2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfU2VsZWN0b3JUYWdOYW1lVXBwZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9TZWxlY3RvclRhZ05hbWVMb3dlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yU2FtcGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JOb3JtYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvckF0bWFya1J1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvclNlbGVjdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JDb21iaW5hdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JVbml2ZXJzYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvcklkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JQc2V1ZG9DbGFzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yQ2xhc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvck1lZGlhOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JDb21tZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JQcm9wZXJ0eU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvclByb3BlcnR5VmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvclVyaTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yU3RyaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JDb2xvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yU2VtaUNvbG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JDdXJseUJyYWNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yQXR0ckRlbGltaXRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yQXR0ck5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvckF0dHJWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yQXR0ck9wZXJhdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRBY3Rpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX0RFU0NSSVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9DU1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1dBUk5JTkdfRk9MREVSX01VU1RfQkVfSU5TSURFX1dFQl9DT05URU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRpdGxlX0ludmFsaWRWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXNzYWdlX0ludmFsaWRWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRNZW51X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzX1NlbGVjdG9yX0Nhc2VfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX25vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ1NTX0NsZWFudXBfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJZGVudGlmaWVyX2Nhc2VfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9wZXJ0eV9uYW1lX2Nhc2VfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9wZXJ0eV92YWx1ZV9jYXNlX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0b3JfdGFnX25hbWVfY2FzZV9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1b3RlX3ZhbHVlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0X3NvdXJjZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXNfaXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvd2VyX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcHBlcl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU291cmNlTWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXR0aW5nX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMaW5lX3dpZHRoX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kZW50X3VzaW5nX3RhYnNfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZGVudF91c2luZ19zcGFjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kZW50YXRpb25fc2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRlbnRhdGlvbl9zaXplX3RpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdE5leHRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19maWxlc19lbmNvZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUdyb3VwX25hbWVFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDU1NDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDU1NDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0NTU1VJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQ1NTVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZjZWY5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQ1NTVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0NTUzsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIENTU1VJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy51aSI7IC8vJE5PTi1OTFMtMSQKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTVUlQbHVnaW4gcGx1Z2luOwkKLQkKLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBjc3MgdWkuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgY3NzIHVpLgotCSAqLwotCXByaXZhdGUgQ29udGV4dFR5cGVSZWdpc3RyeSBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ1NTVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ1NTVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBjc3MgZWRpdG9yIHRlbXBsYXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGNzcyBlZGl0b3IgdGVtcGxhdGVzCi0JICovCi0JcHVibGljIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJaWYgKGZUZW1wbGF0ZVN0b3JlID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVN0b3JlID0gbmV3IENvbnRyaWJ1dGlvblRlbXBsYXRlU3RvcmUoZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSwgZ2V0UHJlZmVyZW5jZVN0b3JlKCksIENTU1VJUHJlZmVyZW5jZU5hbWVzLlRFTVBMQVRFU19LRVkpOwotCi0JCQl0cnkgewotCQkJCWZUZW1wbGF0ZVN0b3JlLmxvYWQoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmVGVtcGxhdGVTdG9yZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBjc3MgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGNzcyBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpIHsKLQkJaWYgKGZDb250ZXh0VHlwZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCUNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSgpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0NTUy5BTEwpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0NTUy5ORVcpOwotCi0JCQlmQ29udGV4dFR5cGVSZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQl9Ci0KLQkJcmV0dXJuIGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9DU1NVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0NTU1VJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOGM1NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0NTU1VJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1JRF9TZWxlY3Rvcl9DYXNlX19VSV89SUQgU2VsZWN0b3IgY2FzZToKLUlORk9fTm90X0NhdGVnb3JpemVkXzE9Tm90IENhdGVnb3JpemVkCi0KLSMjIENTUyBQcmVmZXJlbmNlcyAtLSBzb3VyY2UgIyMKLVByZWZzTGFiZWxfV3JhcHBpbmdXaXRob3V0QXR0cj1EaXNhYmxlIHdyYXBwaW5nIGluIHN0eWxlICZhdHRyaWJ1dGUgb2YgSFRNTAotUHJlZnNMYWJlbF9XcmFwcGluZ0luc2VydExpbmVCcmVhaz1JbnNlcnQgJmxpbmUgYnJlYWsgYmV0d2VlbiBwcm9wZXJ0aWVzCi0KLVByZWZzTGFiZWxfQ2FzZUdyb3VwPUNhcGl0YWxpemF0aW9uIHN0eWxlCi1QcmVmc0xhYmVsX0Nhc2VJZGVudD1JZGVudGlmaWVyOgotUHJlZnNMYWJlbF9DYXNlUHJvcE5hbWU9UHJvcGVydHkgbmFtZToKLVByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZT1Qcm9wZXJ0eSB2YWx1ZToKLVByZWZzTGFiZWxfU2VsZWN0b3JUYWdOYW1lPVR5cGUgc2VsZWN0b3I6Ci0KLVByZWZzTGFiZWxfQ2FzZUlkZW50VXBwZXI9JlVwcGVyY2FzZQotUHJlZnNMYWJlbF9DYXNlSWRlbnRMb3dlcj1MJm93ZXJjYXNlCi1QcmVmc0xhYmVsX0Nhc2VQcm9wTmFtZVVwcGVyPVUmcHBlcmNhc2UKLVByZWZzTGFiZWxfQ2FzZVByb3BOYW1lTG93ZXI9TG8md2VyY2FzZQotUHJlZnNMYWJlbF9DYXNlUHJvcFZhbHVlVXBwZXI9VXBwJmVyY2FzZQotUHJlZnNMYWJlbF9DYXNlUHJvcFZhbHVlTG93ZXI9TG93ZSZyY2FzZQotUHJlZnNMYWJlbF9TZWxlY3RvclRhZ05hbWVVcHBlcj1VcHBlciZjYXNlCi1QcmVmc0xhYmVsX1NlbGVjdG9yVGFnTmFtZUxvd2VyPUxvd2VyY2Emc2UKLQotIyMgQ1NTIFByZWZlcmVuY2VzIC0tIGNvbG9yICMjCi0KLSMjIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBhIHNhbXBsZSBDU1MgZG9jdW1lbnQuICBQbGVhc2UgdHJhbnNsYXRlIG9ubHkgdGhlIGZvbGxvd2luZyBwYXJ0czoKLSMjIFNhbXBsZSBTdHlsZXMKLVByZWZzTGFiZWxfQ29sb3JTYW1wbGU9QGltcG9ydCB1cmwoIi4uL3NhbXBsZTIuY3NzIik7XG5cbi8qIFNhbXBsZSBTdHlsZXMgKi9cblxuQk9EWSB7XG5cdGNvbG9yIDogYmxhY2s7XG5cdGJhY2tncm91bmQtY29sb3IgOiByZ2IoMTgxLCAyNTMsIDIxMSk7XG5cdHRleHQtYWxpZ24gOiBjZW50ZXI7XG5cdGZvbnQtZmFtaWx5IDogIkhlaXNlaSBNaW5jaG8gVzMiLCBzZXJpZlxufVxuXG4jY29udGVudCA+IGRpdiAqLmxpbmtzIGFbaHJlZn49Imh0dHA6Ly8iXTpob3ZlciB7XG5cdHRleHQtZGVjb3JhdGlvbiA6IHVuZGVybGluZTtcbn1cblxuQHBhZ2UgOmxlZnQgeyBtYXJnaW4tbGVmdCA6IDRjbSB9XG5cbkBtZWRpYSBhdXJhbCB7XG5cdFAuaGVpZGkge1xuXHRcdGF6aW11dGggOiBjZW50ZXItbGVmdDtcblx0XHRlbGV2YXRpb24gOiAxMi4zZGVnO1xuXHRcdHBhdXNlIDogMzBtcyAxLjZzXG5cdH1cbn1cbgotCi1QcmVmc0xhYmVsX0NvbG9yTm9ybWFsPURlZmF1bHQKLVByZWZzTGFiZWxfQ29sb3JBdG1hcmtSdWxlPUF0LVJ1bGUKLVByZWZzTGFiZWxfQ29sb3JTZWxlY3Rvcj1UeXBlIFNlbGVjdG9yCi1QcmVmc0xhYmVsX0NvbG9yQ29tYmluYXRvcj1Db21iaW5hdG9yCi1QcmVmc0xhYmVsX0NvbG9yVW5pdmVyc2FsPVVuaXZlcnNhbCBTZWxlY3RvcgotUHJlZnNMYWJlbF9Db2xvcklkPUlkIFNlbGVjdG9yCi1QcmVmc0xhYmVsX0NvbG9yUHNldWRvQ2xhc3M9UHNldWRvLWNsYXNzCi1QcmVmc0xhYmVsX0NvbG9yQ2xhc3M9Q2xhc3MgU2VsZWN0b3IKLVByZWZzTGFiZWxfQ29sb3JNZWRpYT1NZWRpYSBOYW1lCi1QcmVmc0xhYmVsX0NvbG9yQ29tbWVudD1Db21tZW50Ci1QcmVmc0xhYmVsX0NvbG9yUHJvcGVydHlOYW1lPVByb3BlcnR5IE5hbWUKLVByZWZzTGFiZWxfQ29sb3JQcm9wZXJ0eVZhbHVlPVByb3BlcnR5IFZhbHVlCi1QcmVmc0xhYmVsX0NvbG9yVXJpPVVSSQotUHJlZnNMYWJlbF9Db2xvclN0cmluZz1RdW90ZWQgU3RyaW5nCi1QcmVmc0xhYmVsX0NvbG9yQ29sb249UHJvcGVydHkgRGVsaW1pdGVyCi1QcmVmc0xhYmVsX0NvbG9yU2VtaUNvbG9uPVNlbWljb2xvbgotUHJlZnNMYWJlbF9Db2xvckN1cmx5QnJhY2U9Q3VybHkgQnJhY2UKLVByZWZzTGFiZWxfQ29sb3JFcnJvcj1FcnJvcgotUHJlZnNMYWJlbF9Db2xvckF0dHJEZWxpbWl0ZXI9QXR0cmlidXRlIFNlbGVjdG9yIERlbGltaXRlcgotUHJlZnNMYWJlbF9Db2xvckF0dHJOYW1lPUF0dHJpYnV0ZSBOYW1lCi1QcmVmc0xhYmVsX0NvbG9yQXR0clZhbHVlPUF0dHJpYnV0ZSBWYWx1ZQotUHJlZnNMYWJlbF9Db2xvckF0dHJPcGVyYXRvcj1BdHRyaWJ1dGUgU2VsZWN0b3IgT3BlcmF0b3IKLSMKLVNvcnRBY3Rpb25fMD1Tb3J0Ci0jCi1fVUlfV0laQVJEX05FV19USVRMRSA9IE5ldyBDU1MgRmlsZQotX1VJX1dJWkFSRF9ORVdfSEVBRElORyA9IENTUwotX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT04gPSBDcmVhdGUgYSBuZXcgQ1NTIGZpbGUuCi1fRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfQ1NTID0gVGhlIGZpbGUgbmFtZSBtdXN0IGVuZCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zIHswfS4KLV9XQVJOSU5HX0ZPTERFUl9NVVNUX0JFX0lOU0lERV9XRUJfQ09OVEVOVCA9IEZpbGVzIGNyZWF0ZWQgb3V0c2lkZSBvZiB0aGUgV2ViIENvbnRlbnQgZm9sZGVyIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHlvdXIgZGVwbG95ZWQgV2ViIGFwcGxpY2F0aW9uLiAKLSMKLVRpdGxlX0ludmFsaWRWYWx1ZT1JbnZhbGlkIFZhbHVlCi1NZXNzYWdlX0ludmFsaWRWYWx1ZT1JbnZhbGlkIHByb3BlcnR5IHZhbHVlLgotIyBDb3BpZWQgZnJvbSBzc2UudWkKLUZvcm1hdE1lbnVfbGFiZWw9RiZvcm1hdAotQ2xhc3NfU2VsZWN0b3JfQ2FzZV9fVUlfPUNsYXNzIFNlbGVjdG9yIGNhc2U6Ci1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9QyZsZWFudXAgRG9jdW1lbnQuLi4KLUNsZWFudXBEb2N1bWVudF90b29sdGlwPUNsZWFudXAgRG9jdW1lbnQKLUNsZWFudXBEb2N1bWVudF9kZXNjcmlwdGlvbj1DbGVhbnVwIERvY3VtZW50Ci1VSV9ub25lPW5vbmUKLUNsZWFudXBfVUlfPUNsZWFudXAKLUNTU19DbGVhbnVwX1VJXz1DU1MgQ2xlYW51cAotQWRkQmxvY2tDb21tZW50X3Rvb2x0aXA9QWRkIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1Ub2dnbGVDb21tZW50X3Rvb2x0aXA9VG9nZ2xlIENvbW1lbnQKLUlkZW50aWZpZXJfY2FzZV9fVUlfPUlkZW50aWZpZXIgY2FzZToKLVByb3BlcnR5X25hbWVfY2FzZV9fVUlfPVByb3BlcnR5IG5hbWUgY2FzZToKLVByb3BlcnR5X3ZhbHVlX2Nhc2VfX1VJXz1Qcm9wZXJ0eSB2YWx1ZSBjYXNlOgotU2VsZWN0b3JfdGFnX25hbWVfY2FzZV9fVUlfPVNlbGVjdG9yIHRhZyBuYW1lIGNhc2U6Ci1RdW90ZV92YWx1ZXNfVUlfPVF1b3RlIHZhbHVlcwotRm9ybWF0X3NvdXJjZV9VSV89JkZvcm1hdCBzb3VyY2UKLUFzX2lzX1VJXz1Bcy1pcwotTG93ZXJfVUlfPUxvd2VyCi1VcHBlcl9VSV89VXBwZXIKLVNvdXJjZU1lbnVfbGFiZWw9JlNvdXJjZQotRm9ybWF0dGluZ19VSV89Rm9ybWF0dGluZwotTGluZV93aWR0aF9fVUlfPUxpbmUgJndpZHRoOgotSW5kZW50X3VzaW5nX3RhYnNfPSZJbmRlbnQgdXNpbmcgdGFicwotSW5kZW50X3VzaW5nX3NwYWNlcz1JJm5kZW50IHVzaW5nIHNwYWNlcwotSW5kZW50YXRpb25fc2l6ZT1JbiZkZW50YXRpb24gc2l6ZToKLUluZGVudGF0aW9uX3NpemVfdGlwPUluZGVudGF0aW9uIHNpemUKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbD0mRW5jbG9zaW5nIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBlbmNsb3NpbmcgZWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2Rlc2NyaXB0aW9uPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBlbmNsb3NpbmcgZWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbD0mTmV4dCBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIG5leHQgc2libGluZwotU3RydWN0dXJlU2VsZWN0TmV4dF9kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgbmV4dCBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbD0mUHJldmlvdXMgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgcHJldmlvdXMgc2libGluZwotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfZGVzY3JpcHRpb249RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLSMjCi1DcmVhdGluZ19maWxlc19lbmNvZGluZz1DcmVhdGluZyBmaWxlcyBlbmNvZGluZyBwcmVmZXJlbmNlCi1SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHMgPSBUaGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8wPVNlbGVjdCBDU1MgVGVtcGxhdGUKLU5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfMT1TZWxlY3QgYSB0ZW1wbGF0ZSBhcyBpbml0aWFsIGNvbnRlbnQgaW4gdGhlIENTUyBwYWdlLgotTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8yPU5hbWUKLU5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfMz1EZXNjcmlwdGlvbgotTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV80PSZVc2UgQ1NTIFRlbXBsYXRlCi1OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzU9JlByZXZpZXc6Ci1OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzY9VGVtcGxhdGVzIGFyZSAnTmV3IENTUycgdGVtcGxhdGVzIGZvdW5kIGluIHRoZSA8YT5DU1MgVGVtcGxhdGVzPC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi1OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzc9JlRlbXBsYXRlczoKLSMgQ1NTIENvbnRlbnQgU2V0dGluZ3MKLUNTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wPVRoZSB0eXBlIG9mIENTUyB0byB1c2UuICBUaGUgcHJvamVjdCBzZXR0aW5nIGlzIHVzZWQgaWYgeW91IHNwZWNpZnkgIm5vbmUuIgotQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzE9Q1NTIFByb2ZpbGU6Ci1TeW50YXhDb2xvcmluZ1BhZ2VfMD1TeW50YXggRWxlbWVudDoKLVN5bnRheENvbG9yaW5nUGFnZV8yPUVuYWJsZQotU3ludGF4Q29sb3JpbmdQYWdlXzM9JkJvbGQKLVN5bnRheENvbG9yaW5nUGFnZV80PSZJdGFsaWMKLVN5bnRheENvbG9yaW5nUGFnZV81PSZTdHJpa2V0aHJvdWdoCi1TeW50YXhDb2xvcmluZ1BhZ2VfNj0mVW5kZXJsaW5lCi1fVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LPUNTUyBlZGl0aW5nIHByZWZlcmVuY2VzLiAgTm90ZSB0aGF0IHNvbWUgcHJlZmVyZW5jZXMgbWF5IGJlIHNldCBvbiB0aGUgPGE+ezB9PC9hPiBwcmVmZXJlbmNlIHBhZ2UuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZWJhNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmCi0gKiBkZXNpcmVkLCB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcwotICogcGx1Z2luLiBPdGhlciBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jc3MudWkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5Q1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyY2Q3NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5Q1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuYXV0b2VkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lDU1MgaW1wbGVtZW50cyBJQXV0b0VkaXRTdHJhdGVneSB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQotCWNsYXNzIENvbXBvdW5kUmVnaW9uIHsKLQotCQkvKiB0ZXh0UmVnaW9uIGNhbiBiZSBudWxsIGlmIHRoZSBvZmZzZXQgaXMgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQgKi8KLQkJQ29tcG91bmRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gdGV4dFJlZ2lvbikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbjsKLQkJCXRoaXMudGV4dFJlZ2lvbiA9IHRleHRSZWdpb247Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldERvY3VtZW50UmVnaW9uKCkgewotCQkJcmV0dXJuIGRvY3VtZW50UmVnaW9uOwotCQl9Ci0KLQkJSVRleHRSZWdpb24gZ2V0VGV4dFJlZ2lvbigpIHsKLQkJCXJldHVybiB0ZXh0UmVnaW9uOwotCQl9Ci0KLQkJaW50IGdldFN0YXJ0KCkgewotCQkJcmV0dXJuICh0ZXh0UmVnaW9uICE9IG51bGwpID8gdGV4dFJlZ2lvbi5nZXRTdGFydCgpIDogZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJfQotCi0JCWludCBnZXRFbmQoKSB7Ci0JCQlyZXR1cm4gKHRleHRSZWdpb24gIT0gbnVsbCkgPyB0ZXh0UmVnaW9uLmdldEVuZCgpIDogZG9jdW1lbnRSZWdpb24uZ2V0RW5kKCk7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJCXJldHVybiAodGV4dFJlZ2lvbiAhPSBudWxsKSA/IHRleHRSZWdpb24uZ2V0VHlwZSgpIDogQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV047Ci0JCX0KLQotCQlTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJCXJldHVybiAodGV4dFJlZ2lvbiAhPSBudWxsKSA/IGRvY3VtZW50UmVnaW9uLmdldFRleHQodGV4dFJlZ2lvbikgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQkJcmV0dXJuICh0ZXh0UmVnaW9uICE9IG51bGwpID8gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQodGV4dFJlZ2lvbikgOiBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQl9Ci0KLQkJaW50IGdldEVuZE9mZnNldCgpIHsKLQkJCXJldHVybiAodGV4dFJlZ2lvbiAhPSBudWxsKSA/IGRvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCh0ZXh0UmVnaW9uKSA6IGRvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uOwotCQlwcml2YXRlIElUZXh0UmVnaW9uIHRleHRSZWdpb247Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhdXRvSW5kZW50QWZ0ZXJDbG9zZShEb2N1bWVudENvbW1hbmQgY29tbWFuZCwgU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJaWYgKCFzZXRSYW5nZUZvckNsb3NlKGNvbW1hbmQpKQotCQkJcmV0dXJuOwotCi0JCWludCBwb3NpdGlvbiA9IGNvbW1hbmQub2Zmc2V0ICsgY29tbWFuZC5sZW5ndGg7Ci0KLQkJaWYgKHBvc2l0aW9uID09IC0xIHx8IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBnZXQgb3BlbiBicmFjZSByZWdpb24KLQkJQ29tcG91bmRSZWdpb24gcmVnaW9uID0gcHJldkNvcnJlc3BvbmRlbmNlKHBvc2l0aW9uLCByZWdpb25UeXBlKTsKLQotCQkvLyBnZXQgaW5kZW50YXRpb24KLQkJU3RyaW5nIHN0ciA9IGdldEluZGVudEZvcihyZWdpb24sIGZhbHNlKTsKLQotCQkvLyBhcHBlbmQgdG8gaW5wdXQKLQkJaWYgKHN0ciAhPSBudWxsKQotCQkJY29tbWFuZC50ZXh0ID0gc3RyICsgY29tbWFuZC50ZXh0OwotCX0KLQotCS8qKgotCSAqIENvcGllcyB0aGUgaW5kZW50YXRpb24gb2YgdGhlIHByZXZpb3VzIGxpbmUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXV0b0luZGVudEFmdGVyTmV3TGluZShEb2N1bWVudENvbW1hbmQgY29tbWFuZCkgewotCQkvLyBzZWxlY3QgbmVhcmVzdCB3aGl0ZSBzcGFjZXMgdG8gcmVwbGFjZSB3aXRoIG5ldy1saW5lCi0JCXNldFJhbmdlRm9yTmV3TGluZShjb21tYW5kKTsKLQotCQkvLyBnZXQgcG9zaXRpb24KLQkJaW50IHBvc2l0aW9uID0gY29tbWFuZC5vZmZzZXQ7Ci0KLQkJaWYgKHBvc2l0aW9uID09IC0xIHx8IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXYgPSBnZXRQcmV2aW91c1JlZ2lvbihwb3NpdGlvbik7Ci0JCWlmIChwcmV2ID09IG51bGwgfHwgIUNTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UuZXF1YWxzKHByZXYuZ2V0VHlwZSgpKSkKLQkJCXJldHVybjsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHQgPSBwcmV2LmdldE5leHQoKTsKLQotCQkvLyBjcmVhdGUgdGV4dCB0byByZXBsYWNlCi0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKGNvbW1hbmQudGV4dCk7Ci0JCXRyeSB7Ci0JCQlJUmVnaW9uIGxpbmUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQocG9zaXRpb24pOwotCQkJaW50IGNvbnRlbnRTdGFydCA9IGZpbmRFbmRPZldoaXRlU3BhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBwb3NpdGlvbiwgbGluZS5nZXRPZmZzZXQoKSArIGxpbmUuZ2V0TGVuZ3RoKCkpOwotCQkJY29tbWFuZC5sZW5ndGggPSAgTWF0aC5tYXgoY29udGVudFN0YXJ0IC0gcG9zaXRpb24sIDApOwotCQkJYnVmLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQlpZiAobmV4dCAhPSBudWxsICYmIENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UuZXF1YWxzKG5leHQuZ2V0VHlwZSgpKSAmJiAhaXNPbmVMaW5lKHByZXYpKSB7Ci0JCQkJY29tbWFuZC5zaGlmdHNDYXJldCA9IGZhbHNlOwotCQkJCWNvbW1hbmQuY2FyZXRPZmZzZXQgPSBjb250ZW50U3RhcnQgKyBidWYubGVuZ3RoKCk7Ci0JCQkJYnVmLmFwcGVuZChUZXh0VXRpbGl0aWVzLmdldERlZmF1bHRMaW5lRGVsaW1pdGVyKHN0cnVjdHVyZWREb2N1bWVudCkpOwotCQkJfQotCQkJY29tbWFuZC50ZXh0ID0gYnVmLnRvU3RyaW5nKCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzT25lTGluZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXYpIHsKLQkJcmV0dXJuIGVuZHNXaXRoKHN0cnVjdHVyZWREb2N1bWVudC5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCksIHByZXYuZ2V0RnVsbFRleHQoKSkgIT0gLTE7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFByZXZpb3VzUmVnaW9uKGludCBvZmZzZXQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2ID0gbnVsbDsKLQkJaWYgKG9mZnNldCA+IDApCi0JCQlwcmV2ID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCAtIDEpOwotCQlyZXR1cm4gcHJldjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBjdXN0b21pemVEb2N1bWVudENvbW1hbmQoSURvY3VtZW50IGRvY3VtZW50LCBEb2N1bWVudENvbW1hbmQgY29tbWFuZCkgewotCQlPYmplY3QgdGV4dEVkaXRvciA9IGdldEFjdGl2ZVRleHRFZGl0b3IoKTsKLQkJaWYgKCEodGV4dEVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yRXh0ZW5zaW9uMyAmJiAoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpKQotCQkJcmV0dXJuOwotCi0JCS8vIHJldHVybjsKLQkJLy8gLyoKLQkJc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50OwotCi0JCWlmIChjb21tYW5kLmxlbmd0aCA9PSAwICYmIGNvbW1hbmQudGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoZW5kc1dpdGgoZG9jdW1lbnQuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpLCBjb21tYW5kLnRleHQpICE9IC0xKSB7Ci0JCQkJYXV0b0luZGVudEFmdGVyTmV3TGluZShjb21tYW5kKTsKLQkJCX0gZWxzZSBpZiAoY29tbWFuZC50ZXh0LmVxdWFscygifSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCWF1dG9JbmRlbnRBZnRlckNsb3NlKGNvbW1hbmQsIENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpOwotCQkJfSBlbHNlIGlmIChjb21tYW5kLnRleHQuZXF1YWxzKCJdIikpIHsvLyROT04tTkxTLTEkCi0JCQkJYXV0b0luZGVudEFmdGVyQ2xvc2UoY29tbWFuZCwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQpOwotCQkJfSBlbHNlIGlmIChjb21tYW5kLnRleHQuZXF1YWxzKCIpIikpIHsvLyROT04tTkxTLTEkCi0JCQkJYXV0b0luZGVudEFmdGVyQ2xvc2UoY29tbWFuZCwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKTsKLQkJCX0KLQkJfQotCQkvLyAqLwotCQkKLQkJLy8gc3BhY2VzIGZvciB0YWIgY2hhcmFjdGVyCi0JCWlmIChjb21tYW5kLnRleHQgIT0gbnVsbCAmJiBjb21tYW5kLnRleHQubGVuZ3RoKCkgPiAwICYmIGNvbW1hbmQudGV4dC5jaGFyQXQoMCkgPT0gJ1x0JykKLQkJCXNtYXJ0SW5zZXJ0Rm9yVGFiKGNvbW1hbmQsIGRvY3VtZW50KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluZGVudEZvcihDb21wb3VuZFJlZ2lvbiByZWdpb24sIGJvb2xlYW4gaW5kZW50Rm9yTmV4dFJlZ2lvbikgewotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHJlZ2lvbi5nZXREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXRyeSB7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQkvLyBnZXQgbWVhbmZ1bCBmbGF0IG5vZGUKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uLmdldFRleHRSZWdpb24oKSk7Ci0JCQkJaXQucHJldigpOwotCQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gciA9IGl0LnByZXYoKTsKLQkJCQkJcmVnaW9uID0gbmV3IENvbXBvdW5kUmVnaW9uKGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCByKTsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZmxhdE5vZGUgPSByZWdpb24uZ2V0RG9jdW1lbnRSZWdpb24oKTsKLQkJCQkvLyBnZXQgaW5kZW50IHN0cmluZwotCQkJCWludCBwb3NpdGlvbiA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCQkJaW50IGxpbmUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHBvc2l0aW9uKTsKLQkJCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCQlpbnQgZW5kID0gZmluZEVuZE9mV2hpdGVTcGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0LCBwb3NpdGlvbik7Ci0JCQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudC5nZXQoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCX0gZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUIHx8Ci0JCQkvLyByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQVJFTlRIRVNJU19PUEVOIHx8Ci0JCQkJCQlyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTiB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IpIHsKLQkJCQlpbnQgcG9zaXRpb24gPSBmbGF0Tm9kZS5nZXRTdGFydCgpICsgcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJaW50IGxpbmUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHBvc2l0aW9uKTsKLQkJCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCQlpbnQgZW5kID0gZmluZEVuZE9mV2hpdGVTcGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0LCBwb3NpdGlvbik7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoc3RydWN0dXJlZERvY3VtZW50LmdldChzdGFydCwgZW5kIC0gc3RhcnQpKTsKLQkJCQlwb3NpdGlvbiArPSByZWdpb24uZ2V0VGV4dCgpLmxlbmd0aCgpOwotCQkJCWlmIChpbmRlbnRGb3JOZXh0UmVnaW9uKSB7Ci0JCQkJCWludCB0b2tlblN0YXJ0ID0gZmluZEVuZE9mV2hpdGVTcGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvc2l0aW9uLCBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKSArIHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lTGVuZ3RoKGxpbmUpIC0gMSk7Ci0JCQkJCWlmICh0b2tlblN0YXJ0IDwgc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSkgKyBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZUxlbmd0aChsaW5lKSAtIDEpIHsKLQkJCQkJCXBvc2l0aW9uID0gdG9rZW5TdGFydDsKLQkJCQkJfQotCQkJCX0KLQkJCQl3aGlsZSAocG9zaXRpb24gLSBlbmQgPiAwKSB7Ci0JCQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQkJCWVuZCsrOwotCQkJCX0KLQkJCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleGNwKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y3ApOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDb21wb3VuZFJlZ2lvbiBnZXRQcmV2S2V5UmVnaW9uKGludCBwb3NpdGlvbiwgQ29tcG91bmRSZWdpb24gY3VycmVudFJlZ2lvbikgewotCQlpZiAoY3VycmVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGN1cnJlbnRSZWdpb24gIT0gbnVsbCAmJiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCB8fCBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpKSB7Ci0JCQlyZXR1cm4gcHJldkNvcnJlc3BvbmRlbmNlKGN1cnJlbnRSZWdpb24pOwotCQl9Ci0KLQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3Ioc3RydWN0dXJlZERvY3VtZW50LCBwb3NpdGlvbiAtIDEpOwotCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByID0gaXQucHJldigpOwotCQkJQ29tcG91bmRSZWdpb24gcmVnaW9uID0gbmV3IENvbXBvdW5kUmVnaW9uKGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCByKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwKLQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fAotCQkJCQkJcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUIHx8Ci0JCQkJCQkvLyByZWdpb24uZ2V0VHlwZSgpID09Ci0JCQkJCQkvLyBDU1NSZWdpb25Db250ZXh0cy5DU1NfQlJBQ0tFVF9DTE9TRSB8fAotCQkJCQkJLy8gLy8gcmVnaW9uLmdldFR5cGUoKSA9PQotCQkJCQkJLy8gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBUkVOVEhFU0lTX09QRU4gfHwKLQkJCQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgPT0KLQkJCQkJCS8vIENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQVJFTlRIRVNJU19DTE9TRSB8fAotCQkJCQkJcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiB8fAotCQkJCQkJLy8gcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09MT04gfHwKLQkJCQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQKLQkJCQkJCS8vIHx8Ci0JCQkJCQlyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKSB7Ci0JCQkJLy8gc2tpcCB0byBMQlJBQ0UKLQkJCQlDb21wb3VuZFJlZ2lvbiBwYyA9IHByZXZDb3JyZXNwb25kZW5jZShyZWdpb24pOwotCQkJCS8vIGd1YXJkIGZvciBOUEUKLQkJCQkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTEzMTgKLQkJCQlpZiAocGMgPT0gbnVsbCkgYnJlYWs7Ci0JCQkJaXQucmVzZXQocGMuZ2V0RG9jdW1lbnRSZWdpb24oKSwgcGMuZ2V0VGV4dFJlZ2lvbigpKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORykgewotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0VG1wID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgcG9zaXRpb24pOwotCQkJCWlmIChyZWdpb24gPT0gaXRUbXAucHJldigpKQotCQkJCQlyZXR1cm4gcmVnaW9uOyAvLyBwb3NpdGlvbiBpcyBpbnNpZGUgb2Ygc3RyaW5nCi0JCQl9IGVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQlSZWdpb25JdGVyYXRvciBpdFRtcCA9IG5ldyBSZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvc2l0aW9uKTsKLQkJCQlpZiAocmVnaW9uID09IGl0VG1wLnByZXYoKSkKLQkJCQkJcmV0dXJuIHJlZ2lvbjsgLy8gcG9zaXRpb24gaXMgaW5zaWRlIG9mIGNvbW1lbnQKLQkJCX0gZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTikgewotCQkJCVN0cmluZyBzdHIgPSByZWdpb24uZ2V0VGV4dCgpOwotCQkJCWlmIChzdHIuY2hhckF0KHN0ci5sZW5ndGgoKSAtIDEpID09ICdcXCcpCi0JCQkJCXJldHVybiByZWdpb247Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUikgewotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0UHJldiA9IG5ldyBSZWdpb25JdGVyYXRvcihyZWdpb24uZ2V0RG9jdW1lbnRSZWdpb24oKSwgcmVnaW9uLmdldFRleHRSZWdpb24oKSk7Ci0JCQkJd2hpbGUgKGl0UHJldi5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uUHJldiA9IGl0UHJldi5wcmV2KCk7Ci0JCQkJCWlmIChyZWdpb25QcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlIGlmIChyZWdpb25QcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHJlZ2lvblByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQkJCXJldHVybiByZWdpb247Ci0JCQkJCX0gZWxzZSBpZiAocmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCQkJd2hpbGUgKGl0UHJldi5oYXNQcmV2KCkpIHsKLQkJCQkJCQlyZWdpb25QcmV2ID0gaXRQcmV2LnByZXYoKTsKLQkJCQkJCQlpZiAocmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBKQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlpZiAocmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCByZWdpb25QcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IHJlZ2lvblByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgcmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikKLQkJCQkJCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCQkJCX0KLQkJCQkJCWlmIChyZWdpb25QcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRSZWdpb24gZ2V0UmVnaW9uKGludCBwb3NpdGlvbikgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHBvc2l0aW9uKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IENvbXBvdW5kUmVnaW9uKGZsYXROb2RlLCBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3NpdGlvbikpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IG5lZWRTaGlmdChDb21wb3VuZFJlZ2lvbiByZWdpb24sIGludCBwb3NpdGlvbikgewotCQlpbnQgc2hpZnQgPSAwOwotCQlpZiAocmVnaW9uID09IG51bGwgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCS8vIGdldCBub24gc3BhY2UgcmVnaW9uCi0JCQlDb21wb3VuZFJlZ2lvbiBjciA9IGdldFJlZ2lvbihwb3NpdGlvbiAtIDEpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoY3IuZ2V0RG9jdW1lbnRSZWdpb24oKSwgY3IuZ2V0VGV4dFJlZ2lvbigpKTsKLQkJCUlUZXh0UmVnaW9uIG5lYXJlc3RSZWdpb24gPSBudWxsOwotCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCW5lYXJlc3RSZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQkJaWYgKG5lYXJlc3RSZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIG5lYXJlc3RSZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChuZWFyZXN0UmVnaW9uICE9IG51bGwgJiYgKG5lYXJlc3RSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwgbmVhcmVzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCBuZWFyZXN0UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IG5lYXJlc3RSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpKQotCQkJCXNoaWZ0LS07Ci0JCQllbHNlIGlmIChyZWdpb24gPT0gbnVsbCkKLQkJCQlzaGlmdC0tOwotCQkJc2hpZnQrKzsKLQkJfQotCQlpZiAocmVnaW9uICE9IG51bGwgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvc2l0aW9uKTsKLQkJCWlmICghaXQuaGFzUHJldigpIHx8IGl0LnByZXYoKS5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkKLQkJCQlzaGlmdCsrOwotCQkJZWxzZQotCQkJCXNoaWZ0ID0gMDsKLQkJfQotCQlyZXR1cm4gc2hpZnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIENvbXBvdW5kUmVnaW9uIHByZXZDb3JyZXNwb25kZW5jZShpbnQgcG9zaXRpb24sIFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgcG9zaXRpb24gLSAxKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaW50IG5lc3QgPSAxOwotCQlpZiAocmVnaW9uVHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkvLyBza2lwIHRvIExCUkFDRQotCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCXJlZ2lvbiA9IGl0LnByZXYoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKQotCQkJCQluZXN0LS07Ci0JCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKQotCQkJCQluZXN0Kys7Ci0JCQkJaWYgKG5lc3QgPD0gMCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAobmVzdCA9PSAwKQotCQkJCXJldHVybiBuZXcgQ29tcG91bmRSZWdpb24oaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIHJlZ2lvbik7Ci0JCX0KLQkJaWYgKHJlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQpIHsKLQkJCS8vIHNraXAgdG8gQlJBQ0tFVF9PUEVOCi0JCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJcmVnaW9uID0gaXQucHJldigpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQpCi0JCQkJCW5lc3QtLTsKLQkJCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EKQotCQkJCQluZXN0Kys7Ci0JCQkJaWYgKG5lc3QgPD0gMCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAobmVzdCA9PSAwKQotCQkJCXJldHVybiBuZXcgQ29tcG91bmRSZWdpb24oaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIHJlZ2lvbik7Ci0JCX0KLQkJaWYgKHJlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKSB7Ci0JCQkvLyBza2lwIHRvIFBBUkVOVEhFU0lTX09QRU4KLQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQlyZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQkJaWYgKC8vIHJlZ2lvbi5nZXRUeXBlKCkgPT0KLQkJCQkvLyBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFSRU5USEVTSVNfT1BFTiB8fAotCQkJCXJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKQotCQkJCQluZXN0LS07Ci0JCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCW5lc3QrKzsKLQkJCQlpZiAobmVzdCA8PSAwKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChuZXN0ID09IDApCi0JCQkJcmV0dXJuIG5ldyBDb21wb3VuZFJlZ2lvbihpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgcmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRSZWdpb24gcHJldkNvcnJlc3BvbmRlbmNlKENvbXBvdW5kUmVnaW9uIHJlZ2lvbikgewotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gcmVnaW9uLmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCWludCBwb3NpdGlvbiA9IGZsYXROb2RlLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0U3RhcnQoKTsKLQkJcmV0dXJuIHByZXZDb3JyZXNwb25kZW5jZShwb3NpdGlvbiwgcmVnaW9uLmdldFR5cGUoKSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNldFJhbmdlRm9yQ2xvc2UoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJaW50IHBvc2l0aW9uID0gY29tbWFuZC5vZmZzZXQ7Ci0KLQkJaWYgKHBvc2l0aW9uID09IC0xIHx8IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gZmluZCBzdGFydCBvZiBsaW5lCi0JCQlpbnQgcCA9IChwb3NpdGlvbiA9PSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPyBwb3NpdGlvbiAtIDEgOiBwb3NpdGlvbik7Ci0KLQkJCWludCBsaW5lID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZk9mZnNldChwKTsKLQkJCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3Ioc3RydWN0dXJlZERvY3VtZW50LCBzdGFydCk7Ci0JCQlib29sZWFuIGFsbFdoaXRlU3BhY2UgPSBmYWxzZTsKLQkJCS8vIGNoZWNrIHdoZXRoZXIgdGhlIHRleHQgZnJvbSBsU3RhcnQgdG8gcG9zaXRpb24gaXMgd2hpdGUgc3BhY2UKLQkJCS8vIG9yIG5vdAotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pID4gcCkgewotCQkJCQlhbGxXaGl0ZVNwYWNlID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFsbFdoaXRlU3BhY2UpIHsKLQkJCQljb21tYW5kLmxlbmd0aCA9IGNvbW1hbmQubGVuZ3RoIC0gKHN0YXJ0IC0gY29tbWFuZC5vZmZzZXQpOwotCQkJCWNvbW1hbmQub2Zmc2V0ID0gc3RhcnQ7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4Y3ApIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjcCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJhbmdlRm9yTmV3TGluZShEb2N1bWVudENvbW1hbmQgY29tbWFuZCkgewotCQlpbnQgcG9zaXRpb24gPSBjb21tYW5kLm9mZnNldDsKLQotCQlpZiAocG9zaXRpb24gPT0gLTEgfHwgc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7Ci0JCQkvLyBhZGQgcHJlLW5lYXJlc3Qgd2hpdGUgc3BhY2VzIHRvIHJlcGxhY2UgdGFyZ2V0Ci0JCQlpZiAocG9zaXRpb24gPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3NpdGlvbiAtIDEpOwotCQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHBvc2l0aW9uIC0gMSk7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJCQlpbnQgZW5kID0gY29tbWFuZC5vZmZzZXQgKyBjb21tYW5kLmxlbmd0aDsKLQkJCQkJCWludCBuTGluZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQocG9zaXRpb24pOwotCQkJCQkJaW50IG5TdGFydFBvcyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lT2Zmc2V0KG5MaW5lKTsKLQkJCQkJCWlmIChuU3RhcnRQb3MgPCBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pKQotCQkJCQkJCW5TdGFydFBvcyA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCQljb21tYW5kLm9mZnNldCA9IG5TdGFydFBvczsKLQkJCQkJCWNvbW1hbmQubGVuZ3RoID0gZW5kIC0gY29tbWFuZC5vZmZzZXQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGFkZCBwb3N0LW5lYXJlc3Qgd2hpdGUgc3BhY2VzIHRvIHJlcGxhY2UgdGFyZ2V0Ci0JCQlpZiAocG9zaXRpb24gPCBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHBvc2l0aW9uKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3NpdGlvbik7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJCQlpbnQgbkxpbmUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHBvc2l0aW9uKTsKLQkJCQkJCVN0cmluZyBjdXJyZW50TGluZURlbGltID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIobkxpbmUpOwotCQkJCQkJaW50IG5FbmRQb3MgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChuTGluZSkgKyBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZUxlbmd0aChuTGluZSkgLSAoKGN1cnJlbnRMaW5lRGVsaW0gIT0gbnVsbCkgPyBjdXJyZW50TGluZURlbGltLmxlbmd0aCgpIDogMCk7Ci0JCQkJCQlpZiAobkVuZFBvcyA+IGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pKQotCQkJCQkJCW5FbmRQb3MgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQkJCWNvbW1hbmQubGVuZ3RoID0gbkVuZFBvcyAtIGNvbW1hbmQub2Zmc2V0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkbyBub3QgY3VzdG9taXplIGNvbW1hbmQKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGVuZHNXaXRoKFN0cmluZ1tdIHNlYXJjaFN0cmluZ3MsIFN0cmluZyB0ZXh0KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRleHQuZW5kc1dpdGgoc2VhcmNoU3RyaW5nc1tpXSkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBmaW5kRW5kT2ZXaGl0ZVNwYWNlKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGVuZCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKG9mZnNldCA8IGVuZCkgewotCQkJY2hhciBjID0gZG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQpOwotCQkJaWYgKGMgIT0gJyAnICYmIGMgIT0gJ1x0JykgewotCQkJCXJldHVybiBvZmZzZXQ7Ci0JCQl9Ci0JCQlvZmZzZXQrKzsKLQkJfQotCQlyZXR1cm4gZW5kOwotCX0KLQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJaWYgKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQlpbmRlbnRDaGFyID0gJ1x0JzsKLQkJCX0KLQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZW50LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgYWN0aXZlIHRleHQgZWRpdG9yIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgdGhlIGFjdGl2ZSBlZGl0b3IKLQkgKiBwYXJ0LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRBY3RpdmVUZXh0RWRpdG9yKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkJcmV0dXJuIGVkaXRvcjsKLQkJCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHRleHRFZGl0b3I7Ci0JCQkJCXJldHVybiBlZGl0b3I7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBJbnNlcnQgc3BhY2VzIGZvciB0YWJzCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JUYWIoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyB0YWIga2V5IHdhcyBwcmVzc2VkLiBub3cgY2hlY2sgcHJlZmVyZW5jZXMgdG8gc2VlIGlmIG5lZWQgdG8gaW5zZXJ0Ci0JCS8vIHNwYWNlcyBpbnN0ZWFkIG9mIHRhYgotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFLmVxdWFscyhwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKSkpIHsKLQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpZiAoaW5kZW50YXRpb25XaWR0aCAhPSAwKSB7Ci0JCQkJaW50IGluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoOwotCQkJCXRyeSB7Ci0JCQkJCUlSZWdpb24gZmlyc3RMaW5lID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoY29tbWFuZC5vZmZzZXQpOwotCQkJCQlpbnQgb2Zmc2V0SW5MaW5lID0gY29tbWFuZC5vZmZzZXQgLSBmaXJzdExpbmUuZ2V0T2Zmc2V0KCk7Ci0JCQkJCWludCByZW1haW5kZXIgPSBvZmZzZXRJbkxpbmUgJSBpbmRlbnRhdGlvbldpZHRoOwotCi0JCQkJCWluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoIC0gcmVtYWluZGVyOwotCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0KLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50U2l6ZTsgaSsrKQotCQkJCQlpbmRlbnQuYXBwZW5kKCcgJyk7Ci0JCQl9Ci0KLQkJCS8vIHJlcGxhY2UgXHQgY2hhcmFjdGVycyB3aXRoIHNwYWNlcwotCQkJY29tbWFuZC50ZXh0ID0gaW5kZW50LnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDQUNhbmRpZGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ0FDYW5kaWRhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2ZjRlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDQUNhbmRpZGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5pbWFnZS5DU1NJbWFnZVR5cGU7Ci0KLWNsYXNzIENTU0NBQ2FuZGlkYXRlIHsKLQotCXByaXZhdGUgU3RyaW5nIGZSZXBsYWNlbWVudFN0cmluZyA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkN1cnNvclBvc2l0aW9uID0gMDsKLQlwcml2YXRlIFN0cmluZyBmRGlzcGxheVN0cmluZyA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NJbWFnZVR5cGUgZkltYWdlVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NDQUNhbmRpZGF0ZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU0NBQ2FuZGlkYXRlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlpbnQgZ2V0Q3Vyc29yUG9zaXRpb24oKSB7Ci0JCXJldHVybiBmQ3Vyc29yUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCVN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gZkRpc3BsYXlTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCUNTU0ltYWdlVHlwZSBnZXRJbWFnZVR5cGUoKSB7Ci0JCXJldHVybiBmSW1hZ2VUeXBlOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlTdHJpbmcgZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSB7Ci0JCXJldHVybiBmUmVwbGFjZW1lbnRTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgc2V0Q3Vyc29yUG9zaXRpb24oaW50IGN1cnNvclBvc2l0aW9uKSB7Ci0JCWZDdXJzb3JQb3NpdGlvbiA9IGN1cnNvclBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIHNldERpc3BsYXlTdHJpbmcoU3RyaW5nIGRpc3BsYXlTdHJpbmcpIHsKLQkJZkRpc3BsYXlTdHJpbmcgPSBkaXNwbGF5U3RyaW5nOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIHNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUgaW1hZ2VUeXBlKSB7Ci0JCWZJbWFnZVR5cGUgPSBpbWFnZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgc2V0UmVwbGFjZW1lbnRTdHJpbmcoU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nKSB7Ci0JCWZSZXBsYWNlbWVudFN0cmluZyA9IHJlcGxhY2VtZW50U3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNlaXZlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSk7Ci0JCWJ1Zi5hcHBlbmQoIlwiIik7Ly8kTk9OLU5MUy0xJAotCQlidWYuYXBwZW5kKGdldERpc3BsYXlTdHJpbmcoKSk7Ci0JCWJ1Zi5hcHBlbmQoIlwiIik7Ly8kTk9OLU5MUy0xJAotCQlidWYuYXBwZW5kKCIoIik7Ly8kTk9OLU5MUy0xJAotCQlidWYuYXBwZW5kKGdldEN1cnNvclBvc2l0aW9uKCkpOwotCQlidWYuYXBwZW5kKCIpIik7Ly8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFmNjgxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklDU1NNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3MuU3R5bGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotCi0vKioKLSAqIDxwPkNvbXBsZXRpb24gY29tcHV0ZXIgZm9yIENTUzwvcD4KLSAqLwotcHVibGljIGNsYXNzIENTU0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIGltcGxlbWVudHMgSUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIHsKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVRleHRWaWV3ZXIgdmlld2VyID0gY29udGV4dC5nZXRWaWV3ZXIoKTsKLQkJaW50IGRvY3VtZW50UG9zaXRpb24gPSBjb250ZXh0LmdldEludm9jYXRpb25PZmZzZXQoKTsKLQkJCi0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZE5vZGUgPSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCUlET01Ob2RlIHhOb2RlID0gbnVsbDsKLQkJSURPTU5vZGUgcGFyZW50ID0gbnVsbDsKLQkJQ1NTUHJvcG9zYWxBcnJhbmdlciBhcnJhbmdlciA9IG51bGw7Ci0KLQkJLy8gSWYgdGhlcmUgaXMgYSBzZWxlY3RlZCByZWdpb24sIHdlJ2xsIG5lZWQgdG8gcmVwbGFjZSB0aGUgdGV4dAotCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCi0JCS8vIGJhaWwgaWYgd2UgY291bGRuJ3QgZ2V0IGFuIGluZGV4ZWQgbm9kZQotCQkvLyBpZihpbmRleGVkTm9kZSA9PSBudWxsKSByZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCWlmIChpbmRleGVkTm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQl4Tm9kZSA9IChJRE9NTm9kZSkgaW5kZXhlZE5vZGU7Ci0JCQlwYXJlbnQgPSAoSURPTU5vZGUpIHhOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQkvLyBuZWVkIHRvIGdldCBpbiBoZXJlIGlmIHRoZXJlIGluIHRoZSBubyAwIHJlZ2lvbiA8c3R5bGU+fDwvc3R5bGU+Ci0JCS8vIGNhc2UKLQkJaWYgKCh4Tm9kZSAhPSBudWxsKSAmJiB4Tm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFKSkgewotCQkJLy8gbm93IHdlIGtub3cgdGhlIGN1cnNvciBpcyBpbiBhIDxzdHlsZT4gdGFnIHcvb3V0IHJlZ2lvbgotCQkJSVN0cnVjdHVyZWRNb2RlbCBjc3NNb2RlbCA9IGdldENTU01vZGVsKHhOb2RlKTsKLQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gYWRqdXN0IG9mZnNldHMgZm9yIGVtYmVkZGVkIHN0eWxlCi0JCQkJaW50IG9mZnNldCA9IGRvY3VtZW50UG9zaXRpb247Ci0JCQkJaW50IHBvcyA9IDA7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBrZXlJbmRleGVkTm9kZSA9IGNzc01vZGVsLmdldEluZGV4ZWRSZWdpb24ocG9zKTsKLQkJCQlpZiAoa2V5SW5kZXhlZE5vZGUgPT0gbnVsbCkgewotCQkJCQlrZXlJbmRleGVkTm9kZSA9IChJbmRleGVkUmVnaW9uKSAoKElDU1NNb2RlbCkgY3NzTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJfQotCQkJCWFycmFuZ2VyID0gbmV3IENTU1Byb3Bvc2FsQXJyYW5nZXIocG9zLCAoSUNTU05vZGUpIGtleUluZGV4ZWROb2RlLCBvZmZzZXQsIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSwgKGNoYXIpIDApOwotCQkJfQotCQl9IGVsc2UgaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgcGFyZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpKSB7Ci0JCQkvLyBub3cgd2Uga25vdyB0aGUgY3Vyc29yIGlzIGluIGEgPHN0eWxlPiB0YWcgd2l0aCBhIHJlZ2lvbgotCQkJLy8gdXNlIHRoZSBwYXJlbnQgYmVjYXVzZSB0aGF0IHdpbGwgYmUgdGhlIDxzdHlsZT4gdGFnCi0JCQlJU3RydWN0dXJlZE1vZGVsIGNzc01vZGVsID0gZ2V0Q1NTTW9kZWwocGFyZW50KTsKLQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gYWRqdXN0IG9mZnNldHMgZm9yIGVtYmVkZGVkIHN0eWxlCi0JCQkJaW50IG9mZnNldCA9IGluZGV4ZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IHBvcyA9IGRvY3VtZW50UG9zaXRpb24gLSBvZmZzZXQ7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBrZXlJbmRleGVkTm9kZSA9IGNzc01vZGVsLmdldEluZGV4ZWRSZWdpb24ocG9zKTsKLQkJCQlpZiAoa2V5SW5kZXhlZE5vZGUgPT0gbnVsbCkgewotCQkJCQlrZXlJbmRleGVkTm9kZSA9IChJbmRleGVkUmVnaW9uKSAoKElDU1NNb2RlbCkgY3NzTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJfQotCQkJCWFycmFuZ2VyID0gbmV3IENTU1Byb3Bvc2FsQXJyYW5nZXIocG9zLCAoSUNTU05vZGUpIGtleUluZGV4ZWROb2RlLCBvZmZzZXQsIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSwgKGNoYXIpIDApOwotCQkJfQotCQl9IGVsc2UgaWYgKGluZGV4ZWROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlET01Ob2RlIGRvbU5vZGUgPSAoKElET01Ob2RlKWluZGV4ZWROb2RlKTsKLQkJCS8vIGdldCBtb2RlbCBmb3Igbm9kZSB3LyBzdHlsZSBhdHRyaWJ1dGUKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgY3NzTW9kZWwgPSBnZXRDU1NNb2RlbChkb21Ob2RlKTsKLQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gYWRqdXN0IG9mZnNldHMgZm9yIGVtYmVkZGVkIHN0eWxlCi0JCQkJaW50IHRleHRSZWdpb25TdGFydE9mZnNldCA9IGdldFRleHRSZWdpb25TdGFydE9mZnNldChkb21Ob2RlLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQlpbnQgcG9zID0gZG9jdW1lbnRQb3NpdGlvbiAtIHRleHRSZWdpb25TdGFydE9mZnNldDsKLQkJCQkKLQkJCQljaGFyIHF1b3RlID0gKGNoYXIpIDA7Ci0JCQkJdHJ5IHsKLQkJCQkJcXVvdGUgPSBjb250ZXh0LmdldERvY3VtZW50KCkuZ2V0KHRleHRSZWdpb25TdGFydE9mZnNldCwgMSkuY2hhckF0KDApOwotCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXJyb3IgZ2V0dGluZyBxdW90ZSBjaGFyYWN0ZXIiLCBlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy9nZXQgY3NzIGluZGV4ZWQgcmVnaW9uCi0JCQkJSW5kZXhlZFJlZ2lvbiBjc3NJbmRleGVkTm9kZSA9IGNzc01vZGVsLmdldEluZGV4ZWRSZWdpb24ocG9zKTsKLQkJCQlpZiAoY3NzSW5kZXhlZE5vZGUgPT0gbnVsbCkgewotCQkJCQljc3NJbmRleGVkTm9kZSA9IChJbmRleGVkUmVnaW9uKSAoKElDU1NNb2RlbCkgY3NzTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJfQotCQkJCWlmIChjc3NJbmRleGVkTm9kZSBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJCS8vIGlubGluZSBzdHlsZSBmb3IgYSB0YWcsIG5vdCBlbWJlZGRlZAotCQkJCQlhcnJhbmdlciA9IG5ldyBDU1NQcm9wb3NhbEFycmFuZ2VyKHBvcywgKElDU1NOb2RlKSBjc3NJbmRleGVkTm9kZSwgdGV4dFJlZ2lvblN0YXJ0T2Zmc2V0LCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCksIHF1b3RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaW5kZXhlZE5vZGUgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJLy8gd2hlbiBlZGl0aW5nIGV4dGVybmFsIENTUyB1c2luZyBDU1MgRGVzaWduZXIsIElDU1NOb2RlIGlzIHBhc3NlZC4KLQkJCUlDU1NEb2N1bWVudCBjc3Nkb2MgPSAoKElDU1NOb2RlKSBpbmRleGVkTm9kZSkuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGNzc2RvYyAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBjc3NNb2RlbCA9IGNzc2RvYy5nZXRNb2RlbCgpOwotCQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCUluZGV4ZWRSZWdpb24ga2V5SW5kZXhlZE5vZGUgPSBjc3NNb2RlbC5nZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQlpZiAoa2V5SW5kZXhlZE5vZGUgPT0gbnVsbCkgewotCQkJCQkJa2V5SW5kZXhlZE5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgKChJQ1NTTW9kZWwpIGNzc01vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCQl9Ci0JCQkJCWlmIChrZXlJbmRleGVkTm9kZSBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJCQkvLyBpbmxpbmUgc3R5bGUgZm9yIGEgdGFnLCBub3QgZW1iZWRkZWQKLQkJCQkJCWFycmFuZ2VyID0gbmV3IENTU1Byb3Bvc2FsQXJyYW5nZXIoZG9jdW1lbnRQb3NpdGlvbiwgKElDU1NOb2RlKSBrZXlJbmRleGVkTm9kZSwgMCwgc2VsZWN0aW9uLmdldExlbmd0aCgpLCAoY2hhcikwKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmICgoaW5kZXhlZE5vZGUgPT0gbnVsbCkgJiYgQ29udGVudEFzc2lzdFV0aWxzLmlzVmlld2VyRW1wdHkodmlld2VyKSkgewotCQkJLy8gdGhlIHRvcCBvZiBlbXB0eSBDU1MgRG9jdW1lbnQKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgY3NzTW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQljc3NNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQodmlld2VyLmdldERvY3VtZW50KCkpOwotCQkJCWlmIChjc3NNb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJCQlJbmRleGVkUmVnaW9uIGtleUluZGV4ZWROb2RlID0gY3NzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQkJaWYgKGtleUluZGV4ZWROb2RlID09IG51bGwpIHsKLQkJCQkJCWtleUluZGV4ZWROb2RlID0gKEluZGV4ZWRSZWdpb24pICgoSUNTU01vZGVsKSBjc3NNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJfQotCQkJCQlpZiAoa2V5SW5kZXhlZE5vZGUgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJCQkJLy8gaW5saW5lIHN0eWxlIGZvciBhIHRhZywgbm90IGVtYmVkZGVkCi0JCQkJCQlhcnJhbmdlciA9IG5ldyBDU1NQcm9wb3NhbEFycmFuZ2VyKGRvY3VtZW50UG9zaXRpb24sIChJQ1NTTm9kZSkga2V5SW5kZXhlZE5vZGUsIDAsIChjaGFyKTApOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkKLQkJCQkJY3NzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCWlmIChhcnJhbmdlciAhPSBudWxsKSB7Ci0JCQlwcm9wb3NhbHMgPSBhcnJhbmdlci5nZXRQcm9wb3NhbHMoKTsKLQotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIG5ld2ZpbGVwcm9wb3NhbHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBhbnlwcm9wb3NhbHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQotCQkJLy8gYWRkIGVuZCB0YWcgaWYgcGFyZW50IGlzIG5vdCBjbG9zZWQKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWwgZW5kVGFnID0gWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5jb21wdXRlWE1MRW5kVGFnUHJvcG9zYWwodmlld2VyLCBkb2N1bWVudFBvc2l0aW9uLCBpbmRleGVkTm9kZSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFLCBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX1RBR19HRU5FUklDKTsgCi0KLQkJCS8vIGFkZCB0aGUgYWRkaXRpb25hbCBwcm9wb3NhbHMKLQkJCWludCBhZGRpdGlvbmFsTGVuZ3RoID0gbmV3ZmlsZXByb3Bvc2Fscy5sZW5ndGggKyBhbnlwcm9wb3NhbHMubGVuZ3RoOwotCQkJYWRkaXRpb25hbExlbmd0aCA9IChlbmRUYWcgIT0gbnVsbCkgPyArK2FkZGl0aW9uYWxMZW5ndGggOiBhZGRpdGlvbmFsTGVuZ3RoOwotCQkJaWYgKGFkZGl0aW9uYWxMZW5ndGggPiAwKSB7Ci0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHBsdXNPbmVzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLmxlbmd0aCArIGFkZGl0aW9uYWxMZW5ndGhdOwotCQkJCWludCBhcHBlbmRQb3MgPSBwcm9wb3NhbHMubGVuZ3RoOwotCQkJCS8vIGFkZCBlbmQgdGFnIHByb3Bvc2FsCi0JCQkJaWYgKGVuZFRhZyAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkocHJvcG9zYWxzLCAwLCBwbHVzT25lcywgMSwgcHJvcG9zYWxzLmxlbmd0aCk7Ci0JCQkJCXBsdXNPbmVzWzBdID0gZW5kVGFnOwotCQkJCQkrK2FwcGVuZFBvczsKLQkJCQl9IGVsc2UgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHByb3Bvc2FscywgMCwgcGx1c09uZXMsIDAsIHByb3Bvc2Fscy5sZW5ndGgpOwotCQkJCX0KLQkJCQkvLyBhZGQgaXRlbXMgaW4gbmV3ZmlsZXByb3Bvc2FscwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3ZmlsZXByb3Bvc2Fscy5sZW5ndGg7ICsraSkgewotCQkJCQlwbHVzT25lc1thcHBlbmRQb3MgKyBpXSA9IG5ld2ZpbGVwcm9wb3NhbHNbaV07Ci0JCQkJfQotCQkJCS8vIGFkZCBpdGVtcyBpbiBhbnlwcm9wb3NhbHMKLQkJCQlhcHBlbmRQb3MgPSBhcHBlbmRQb3MgKyBuZXdmaWxlcHJvcG9zYWxzLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFueXByb3Bvc2Fscy5sZW5ndGg7ICsraSkgewotCQkJCQlwbHVzT25lc1thcHBlbmRQb3MgKyBpXSA9IGFueXByb3Bvc2Fsc1tpXTsKLQkJCQl9Ci0JCQkJcHJvcG9zYWxzID0gcGx1c09uZXM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QocHJvcG9zYWxzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBMaXN0IGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2dldEVycm9yTWVzc2FnZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNzZXNzaW9uU3RhcnRlZCgpCi0JICovCi0JcHVibGljIHZvaWQgc2Vzc2lvblN0YXJ0ZWQoKSB7Ci0JCS8vZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI3Nlc3Npb25FbmRlZCgpCi0JICovCi0JcHVibGljIHZvaWQgc2Vzc2lvbkVuZGVkKCkgewotCQkvL2RlZmF1bHQgaXMgdG8gZG8gbm90aGluZwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDU1Ntb2RlbCBmb3IgYSBnaXZlbiBYTUwgbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWRNb2RlbAotCSAqLwotCXByaXZhdGUgc3RhdGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0Q1NTTW9kZWwoSURPTU5vZGUgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IFN0eWxlQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChlbGVtZW50KTsKLQkJaWYgKChhZGFwdGVyID09IG51bGwpIHx8ICEoYWRhcHRlciBpbnN0YW5jZW9mIElDU1NNb2RlbEFkYXB0ZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJQ1NTTW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IChJQ1NTTW9kZWxBZGFwdGVyKSBhZGFwdGVyOwotCQlyZXR1cm4gbW9kZWxBZGFwdGVyLmdldE1vZGVsKCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPkdldCB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSB0ZXh0IHJlZ2lvbiBjb250YWluaW5nIHRoZSBnaXZlbiBkb2N1bWVudCBwb3NpdGlvbjwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZG9tTm9kZSB7QGxpbmsgSURPTU5vZGV9IGNvbnRhaW5pbmcgdGhlIGRvY3VtZW50IHBvc2l0aW9uCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24gdGhlIGRvY3VtZW50IHJlbGF0aXZlIHBvc2l0aW9uIHRvIGdldCB0aGUgc3RhcnQKLQkgKiBvZmZzZXQgb2YgdGhlIGNvbnRhaW5pbmcge0BsaW5rIElUZXh0UmVnaW9ufSBmb3IKLQkgKiBAcmV0dXJuIHN0YXJ0IG9mZnNldCBvZiB0aGUge0BsaW5rIElUZXh0UmVnaW9ufSBjb250YWluaW5nIHRoZSBnaXZlbiBkb2N1bWVudCBwb3NpdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRUZXh0UmVnaW9uU3RhcnRPZmZzZXQoSURPTU5vZGUgZG9tTm9kZSwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3RSZWdpb24gPSBkb21Ob2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCXJldHVybiBzdHJ1Y3RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoc3RydWN0UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDb250ZW50QXNzaXN0Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ29udGVudEFzc2lzdENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlZGFiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDb250ZW50QXNzaXN0Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsRmluZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLWNsYXNzIENTU0NvbnRlbnRBc3Npc3RDb250ZXh0IHsKLQotCXByaXZhdGUgaW50IGZSZXBsYWNlQmVnaW4gPSAtMTsKLQlwcml2YXRlIFN0cmluZyBmVGV4dFRvUmVwbGFjZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRleHRUb0NvbXBhcmUgPSBudWxsOwotCXByaXZhdGUgaW50IGZUYXJnZXRQb3MgPSAtMTsKLQlwcml2YXRlIElDU1NOb2RlIGZUYXJnZXROb2RlID0gbnVsbDsKLQlwcml2YXRlIGludCBmQ3Vyc29yUG9zID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aCA9IC0xOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmU3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIGludCBmRG9jdW1lbnRPZmZzZXQgPSAwOwotCXByaXZhdGUgY2hhciBmUXVvdGUgPSAwOwotCXByaXZhdGUgSUNTU01vZGVsIGZNb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZTZWxlY3RlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgQ1NTQ29udGVudEFzc2lzdENvbnRleHQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCUNTU0NvbnRlbnRBc3Npc3RDb250ZXh0KGludCBkb2N1bWVudFBvc2l0aW9uLCBJQ1NTTm9kZSBub2RlLCBpbnQgZG9jdW1lbnRPZmZzZXQsIGNoYXIgcXVvdGUpIHsKLQkJdGhpcygpOwotCQlmQ3Vyc29yUG9zID0gZG9jdW1lbnRQb3NpdGlvbjsKLQkJZkRvY3VtZW50T2Zmc2V0ID0gZG9jdW1lbnRPZmZzZXQ7Ci0JCWZRdW90ZSA9IHF1b3RlOwotCQlpbml0aWFsaXplKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQl9Ci0KLQlDU1NDb250ZW50QXNzaXN0Q29udGV4dChpbnQgZG9jdW1lbnRQb3NpdGlvbiwgSUNTU05vZGUgbm9kZSwgaW50IGRvY3VtZW50T2Zmc2V0LCBpbnQgbGVuZ3RoLCBjaGFyIHF1b3RlKSB7Ci0JCXRoaXMoKTsKLQkJZkN1cnNvclBvcyA9IGRvY3VtZW50UG9zaXRpb247Ci0JCWZEb2N1bWVudE9mZnNldCA9IGRvY3VtZW50T2Zmc2V0OwotCQlmUXVvdGUgPSBxdW90ZTsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQkJaW5pdGlhbGl6ZShub2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JfQotCi0JQ1NTQ29udGVudEFzc2lzdENvbnRleHQoaW50IGRvY3VtZW50UG9zaXRpb24sIElDU1NOb2RlIG5vZGUsIGludCBkb2N1bWVudE9mZnNldCwgY2hhciBxdW90ZSwgYm9vbGVhbiBzZWxlY3RlZCkgewotCQl0aGlzKCk7Ci0JCWZDdXJzb3JQb3MgPSBkb2N1bWVudFBvc2l0aW9uOwotCQlmRG9jdW1lbnRPZmZzZXQgPSBkb2N1bWVudE9mZnNldDsKLQkJZlF1b3RlID0gcXVvdGU7Ci0JCWZTZWxlY3RlZCA9IHNlbGVjdGVkOwotCQlpbml0aWFsaXplKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRDdXJzb3JQb3MoKSB7Ci0JCXJldHVybiBmQ3Vyc29yUG9zOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldERvY3VtZW50T2Zmc2V0KCkgewotCQlyZXR1cm4gZkRvY3VtZW50T2Zmc2V0OwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQlyZXR1cm4gZlN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlJQ1NTTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiBmTW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBJQ1NTTm9kZSBnZXROb2RlQXQoaW50IG9mZnNldCkgewotCQlyZXR1cm4gKElDU1NOb2RlKSAoKGZNb2RlbCAhPSBudWxsKSA/IGZNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCkgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGNoYXIKLQkgKi8KLQljaGFyIGdldFF1b3RlT2ZTdHlsZUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGZRdW90ZTsKLQl9Ci0KLQlJVGV4dFJlZ2lvbiBnZXRSZWdpb25CeU9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCS8vaWYgaXRzIGEgcXVvdGVkIHJlZ2lvbiBhbmQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIG5vZGUgdGhlbiBnZXQgdGhlIG5vZGUgYmVmb3JlIGl0Ci0JCQkJaWYob2Zmc2V0ID09IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgJiYgZlF1b3RlICE9IDApIHsKLQkJCQkJZmxhdE5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldC0xKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy9pZiBpdHMgdGhlIGVuZCBvZmZzZXQgb2YgdGhlIG5vZGUgdGhlbiB0byBnZXQgdGhlIHJlZ2lvbiBuZWVkIHRvIHN0ZXAgYmFjayBvbmUKLQkJCQlpZihvZmZzZXQgPT0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0LTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCS8vCVN0cmluZyBnZXRSZWdpb25UZXh0KCkgewotCS8vCQlJVGV4dFJlZ2lvbiB0YXJnZXRSZWdpb24gPSBnZXRUYXJnZXRSZWdpb24oKTsKLQkvLwkJaWYgKHRhcmdldFJlZ2lvbiAhPSBudWxsKSB7Ci0JLy8JCQlyZXR1cm4gdGFyZ2V0UmVnaW9uLmdldFRleHQoKTsKLQkvLwkJfSBlbHNlIHsKLQkvLwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCS8vCQl9Ci0JLy8JfQotCS8qKgotCSAqICAKLQkgKi8KLQlpbnQgZ2V0UmVwbGFjZUJlZ2luKCkgewotCQlyZXR1cm4gZlJlcGxhY2VCZWdpbjsKLQl9Ci0KLQlJQ1NTTm9kZSBnZXRUYXJnZXROb2RlKCkgewotCQlyZXR1cm4gZlRhcmdldE5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0VGFyZ2V0UG9zKCkgewotCQlyZXR1cm4gZlRhcmdldFBvczsKLQl9Ci0KLQlJVGV4dFJlZ2lvbiBnZXRUYXJnZXRSZWdpb24oKSB7Ci0JCXJldHVybiBnZXRSZWdpb25CeU9mZnNldChnZXRUYXJnZXRQb3MoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFRhcmdldERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0RG9jdW1lbnRSZWdpb25CeU9mZnNldChnZXRUYXJnZXRQb3MoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldERvY3VtZW50UmVnaW9uQnlPZmZzZXQoaW50IG9mZnNldCkgewotCQlyZXR1cm4gKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgPyBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCkgOiBudWxsOwotCX0KLQotCUlUZXh0UmVnaW9uIGdldFRhcmdldFJlZ2lvblByZXZpb3VzKCkgewotCQlJVGV4dFJlZ2lvbiBwcmV2aW91c1JlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHRhcmdldFJlZ2lvbiA9IGdldFRhcmdldFJlZ2lvbigpOwotCQlSZWdpb25JdGVyYXRvciBpdGVyYXRvciA9IG51bGw7Ci0JCWlmICh0YXJnZXRSZWdpb24gPT0gbnVsbCkgewotCQkJaWYgKDAgPCBmQ3Vyc29yUG9zKSB7Ci0JCQkJaXRlcmF0b3IgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZlN0cnVjdHVyZWREb2N1bWVudCwgZkN1cnNvclBvcyAtIDEpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaXRlcmF0b3IgPSBnZXRSZWdpb25JdGVyYXRvcigpOwotCQkJaWYgKGl0ZXJhdG9yLmhhc1ByZXYoKSkgewotCQkJCWl0ZXJhdG9yLnByZXYoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaXRlcmF0b3IgPSBudWxsOwotCQkJfQotCQl9Ci0JCWlmIChpdGVyYXRvciAhPSBudWxsKSB7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzUHJldigpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlcmF0b3IucHJldigpOwotCQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAodHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETyAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMpIHsKLQkJCQkJcHJldmlvdXNSZWdpb24gPSByZWdpb247Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBwcmV2aW91c1JlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0VGV4dFRvQ29tcGFyZSgpIHsKLQkJcmV0dXJuIGZUZXh0VG9Db21wYXJlOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlTdHJpbmcgZ2V0VGV4dFRvUmVwbGFjZSgpIHsKLQkJcmV0dXJuIGZUZXh0VG9SZXBsYWNlOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShJQ1NTRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGRvYy5nZXRNb2RlbCgpOwotCQlmTW9kZWwgPSBtb2RlbDsKLQkJZlN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCWluaXRpYWxpemVUYXJnZXRQb3MoKTsKLQkJaW5pdGlhbGl6ZVRhcmdldFRleHQoKTsKLQkJaW5pdGlhbGl6ZVRhcmdldE5vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVUYXJnZXROb2RlKCkgewotCQlpZiAoZkN1cnNvclBvcyA9PSAwKSB7Ci0JCQlmVGFyZ2V0Tm9kZSA9IGZNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZmluZCBlZGdlIG9mIHRyZWUgbm9kZQotCQlJQ1NTTm9kZSBjdXJzb3JOb2RlID0gZ2V0Tm9kZUF0KGZDdXJzb3JQb3MpOwotCQlpZiAoY3Vyc29yTm9kZSA9PSBudWxsKSB7IC8vIGVuZCBvZiBkb2N1bWVudAotCQkJY3Vyc29yTm9kZSA9IGZNb2RlbC5nZXREb2N1bWVudCgpOwotCQl9Ci0JCUlDU1NOb2RlIG5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmQ3Vyc29yUG9zIC0gMSk7Ci0JCXdoaWxlIChmbGF0Tm9kZSAhPSBudWxsICYmIChub2RlID0gZ2V0Tm9kZUF0KGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpKSA9PSBjdXJzb3JOb2RlICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSAhPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQlmbGF0Tm9kZSA9IGZsYXROb2RlLmdldFByZXZpb3VzKCk7Ci0JCX0KLQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsgLy8gdG9wIG9mIGRvY3VtZW50Ci0JCQlmVGFyZ2V0Tm9kZSA9IChub2RlID09IG51bGwpID8gZk1vZGVsLmdldERvY3VtZW50KCkgOiBub2RlOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8vICAgdjwtLXwKLQkJLy8gICBBQUFBQUEKLQkJLy8gQkJCQkJCQkJCQiBjdXJzb3JOb2RlOkEgLCBub2RlOkIgLT4gdGFyZ2V0IGlzIEEKLQkJaWYgKGN1cnNvck5vZGUgIT0gbnVsbCkgewotCQkJZm9yIChJQ1NTTm9kZSBwYXJlbnQgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCQlpZiAocGFyZW50ID09IGN1cnNvck5vZGUpIHsKLQkJCQkJZlRhcmdldE5vZGUgPSBjdXJzb3JOb2RlOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vICAgICB2PC0tfAotCQkvLyAgIEFBQQotCQkvLyBCQkJCQkJCQkJCIGN1cnNvck5vZGU6QiAsIG5vZGU6QSAtPiBkZXBlbmQgb24gQSdzIG5vZGUgdHlwZQotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSB8fCBub2RlVHlwZSA9PSBJQ1NTTm9kZS5DSEFSU0VUUlVMRV9OT0RFIHx8IG5vZGVUeXBlID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSkgewotCQkJU3RyaW5nIHR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQlmVGFyZ2V0Tm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlmVGFyZ2V0Tm9kZSA9IG5vZGU7Ci0JCQl9Ci0JCQkvLwkJCWZUYXJnZXROb2RlID0gKGJPdmVyU2VtaUNvbG9uKSA/IG5vZGUuZ2V0UGFyZW50Tm9kZSgpIDogbm9kZTsKLQkJfSBlbHNlIGlmIChDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCWZUYXJnZXROb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlmVGFyZ2V0Tm9kZSA9IG5vZGU7Ci0JCX0KLQotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVGFyZ2V0UG9zKCkgewotCQlpZiAoZkN1cnNvclBvcyA9PSAwIHx8IGlzU3BlY2lhbERlbGltaXRlclJlZ2lvbihmQ3Vyc29yUG9zIC0gMSkpIHsKLQkJCWZUYXJnZXRQb3MgPSBmQ3Vyc29yUG9zOwotCQl9IGVsc2UgewotCQkJZlRhcmdldFBvcyA9IGZDdXJzb3JQb3MgLSAxOwotCQl9Ci0JCQotCQkvL2RlYWwgd2l0aCB0aGUgbGVhZGluZyBxdW90ZQotCQlpZihmUXVvdGUgIT0gMCkgewotCQkJZlRhcmdldFBvcy0tOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVGFyZ2V0VGV4dCgpIHsKLQkJSVRleHRSZWdpb24gdGFyZ2V0UmVnaW9uID0gZ2V0VGFyZ2V0UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBnZXRUYXJnZXREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAodGFyZ2V0UmVnaW9uID09IG51bGwpIHsKLQkJCWZSZXBsYWNlQmVnaW4gPSBmQ3Vyc29yUG9zOwotCQkJZlRleHRUb1JlcGxhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZlRleHRUb0NvbXBhcmUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJU3RyaW5nIHJlZ2lvblRleHQgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHRhcmdldFJlZ2lvbik7Ci0JCQlpbnQgcmVnaW9uU3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCh0YXJnZXRSZWdpb24pOwotCQkJaWYgKCFmU2VsZWN0ZWQgJiYgKHJlZ2lvblN0YXJ0ID09IGZDdXJzb3JQb3MgfHwgcmVnaW9uVGV4dC50cmltKCkubGVuZ3RoKCkgPT0gMCB8fCByZWdpb25TdGFydCArIHJlZ2lvblRleHQubGVuZ3RoKCkgLSAxIDwgdGhpcy5mVGFyZ2V0UG9zKSkgewotCQkJCS8vIHRvIGluc2VydGlvbgotCQkJCWZSZXBsYWNlQmVnaW4gPSBmQ3Vyc29yUG9zOwotCQkJCWZUZXh0VG9SZXBsYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlmVGV4dFRvQ29tcGFyZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJdHJ5IHsKLQkJCQkJaWYgKGZMZW5ndGggPiAwKQotCQkJCQkJZlRleHRUb1JlcGxhY2UgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldChmUmVwbGFjZUJlZ2luLCBmTGVuZ3RoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIHRvIHJlcGxhY2UKLQkJCQlmUmVwbGFjZUJlZ2luID0gcmVnaW9uU3RhcnQ7Ci0JCQkJZlRleHRUb1JlcGxhY2UgPSByZWdpb25UZXh0OwotCi0JCQkJLy9tYXRoIHRvIGRlYWwgd2l0aCBsZWFkaW5nIHF1b3RlCi0JCQkJaW50IG1hdGNoTGVuZ3RoID0gZkN1cnNvclBvcyAtIGZSZXBsYWNlQmVnaW47Ci0JCQkJaWYoZlF1b3RlICE9IDApIHsKLQkJCQkJbWF0Y2hMZW5ndGgtLTsKLQkJCQkJZlJlcGxhY2VCZWdpbisrOwotCQkJCX0KLQkJCQkKLQkJCQlpZihmQ3Vyc29yUG9zID49IGZSZXBsYWNlQmVnaW4gJiYgcmVnaW9uVGV4dC50cmltKCkubGVuZ3RoKCkgPj0gKG1hdGNoTGVuZ3RoKSkKLQkJCQkJZlRleHRUb0NvbXBhcmUgPSByZWdpb25UZXh0LnN1YnN0cmluZygwLCBtYXRjaExlbmd0aCk7Ci0JCQkJZWxzZQotCQkJCQlmVGV4dFRvQ29tcGFyZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzU3BlY2lhbERlbGltaXRlclJlZ2lvbihpbnQgcG9zKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldFJlZ2lvbkJ5T2Zmc2V0KHBvcyk7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJaWYocmVnaW9uICE9IG51bGwpIHsKLQkJCXR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQl9Ci0JCXJldHVybiAodHlwZSAhPSBudWxsKSAmJigodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8Ci0JCQkJdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8Ci0JCQkJdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8Ci0JCQkJdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SIHx8Ci0JCQkJdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSIHx8Ci0JCQkJdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgfHwKLQkJCQl0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSk7Ci0JfQotCS8qKgotCSAqICAKLQkgKi8KLQlib29sZWFuIGlzVGFyZ2V0UG9zQWZ0ZXJPZihTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIGZUYXJnZXROb2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpZiAoc3RhcnQgPCAwIHx8ICgoSW5kZXhlZFJlZ2lvbikgZlRhcmdldE5vZGUpLmdldEVuZE9mZnNldCgpIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVJlZ2lvbkl0ZXJhdG9yIGlSZWdpb24gPSBuZXcgUmVnaW9uSXRlcmF0b3IoZlN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnQpOwotCQl3aGlsZSAoaVJlZ2lvbi5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGlSZWdpb24ubmV4dCgpOwotCQkJaWYgKGZUYXJnZXRQb3MgPCBpUmVnaW9uLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gcmVnaW9uVHlwZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlib29sZWFuIGlzVGFyZ2V0UG9zQmVmb3JlT2YoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJcmV0dXJuICFpc1RhcmdldFBvc0FmdGVyT2YocmVnaW9uVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIHJlZ2lvblR5cGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlib29sZWFuIHRhcmdldEZvbGxvd3MoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaVJlZ2lvbjsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPD0gZlRhcmdldFBvcykgewotCQkJaVJlZ2lvbiA9IG5ldyBSZWdpb25JdGVyYXRvcihmU3RydWN0dXJlZERvY3VtZW50LCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7Ci0JCX0gZWxzZSB7Ci0JCQlpUmVnaW9uID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZUYXJnZXRQb3MpOwotCQkJdHJ5IHsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDaGFyKGZUYXJnZXRQb3MpKSAmJiBpUmVnaW9uLmhhc1ByZXYoKSkgewotCQkJCQlyZWdpb24gPSBpUmVnaW9uLnByZXYoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJaVJlZ2lvbiA9IG5ldyBSZWdpb25JdGVyYXRvcihmU3RydWN0dXJlZERvY3VtZW50LCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKGlSZWdpb24uaGFzUHJldigpKSB7Ci0JCQlyZWdpb24gPSBpUmVnaW9uLnByZXYoKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gcmVnaW9uVHlwZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JYm9vbGVhbiB0YXJnZXRIYXMoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgZlRhcmdldE5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAoZ2V0VGFyZ2V0UG9zKCkgPCAwIHx8IGVuZCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJUmVnaW9uSXRlcmF0b3IgaVJlZ2lvbiA9IG5ldyBSZWdpb25JdGVyYXRvcihmU3RydWN0dXJlZERvY3VtZW50LCBnZXRUYXJnZXRQb3MoKSk7Ci0JCXdoaWxlIChpUmVnaW9uLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaVJlZ2lvbi5uZXh0KCk7Ci0JCQlpZiAoZW5kIDw9IGlSZWdpb24uZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gcmVnaW9uVHlwZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlSZWdpb25JdGVyYXRvciBnZXRSZWdpb25JdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWdpb25JdGVyYXRvcihnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgZ2V0VGFyZ2V0UG9zKCkpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlDU1NNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgewotCQlDU1NNZXRhTW9kZWxGaW5kZXIgZmluZGVyID0gQ1NTTWV0YU1vZGVsRmluZGVyLmdldEluc3RhbmNlKCk7Ci0JCXJldHVybiBmaW5kZXIuZmluZE1ldGFNb2RlbEZvcihnZXRNb2RlbCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YWYzZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSUNTU01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzLlN0eWxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MQ29udGVudEFzc2lzdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWwuU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyBpcyBubyBsb25nZXIgdXNlZCBsb2NhbGx5IGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZQotICogQHNlZSBDU1NTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvcgotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQotCXByaXZhdGUgaW50IGZEb2N1bWVudE9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBjaGFyIGZRdW90ZSA9IDA7Ci0JcHJpdmF0ZSBDU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZlRlbXBsYXRlUHJvY2Vzc29yID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgcHJvcG9zZWQgY29kZSBjb21wbGV0aW9ucyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0JICogbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dC1lZGl0b3IgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgYSBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50Ci0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb2RlLWFzc2lzdCBpdGVtcwotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCi0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZE5vZGUgPSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbiArIGZEb2N1bWVudE9mZnNldCk7Ci0JCUlET01Ob2RlIHhOb2RlID0gbnVsbDsKLQkJSURPTU5vZGUgcGFyZW50ID0gbnVsbDsKLQkJQ1NTUHJvcG9zYWxBcnJhbmdlciBhcnJhbmdlciA9IG51bGw7Ci0JCWJvb2xlYW4gaXNFbXB0eURvY3VtZW50ID0gZmFsc2U7Ci0JCS8vIElmIHRoZXJlIGlzIGEgc2VsZWN0ZWQgcmVnaW9uLCB3ZSdsbCBuZWVkIHRvIHJlcGxhY2UgdGhlIHRleHQKLQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSB2aWV3ZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJYm9vbGVhbiBzZWxlY3RlZCA9IChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uZ2V0VGV4dCgpICE9IG51bGwgJiYgc2VsZWN0aW9uLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsKLQkJCi0JCS8vIGJhaWwgaWYgd2UgY291bGRuJ3QgZ2V0IGFuIGluZGV4ZWQgbm9kZQotCQkvLyBpZihpbmRleGVkTm9kZSA9PSBudWxsKSByZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCWlmIChpbmRleGVkTm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQl4Tm9kZSA9IChJRE9NTm9kZSkgaW5kZXhlZE5vZGU7Ci0JCQlwYXJlbnQgPSAoSURPTU5vZGUpIHhOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQkvLyBuZWVkIHRvIGdldCBpbiBoZXJlIGlmIHRoZXJlIGluIHRoZSBubyAwIHJlZ2lvbiA8c3R5bGU+fDwvc3R5bGU+Ci0JCS8vIGNhc2UKLQkJaWYgKCh4Tm9kZSAhPSBudWxsKSAmJiB4Tm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFKSkgewotCQkJLy8gbm93IHdlIGtub3cgdGhlIGN1cnNvciBpcyBpbiBhIDxzdHlsZT4gdGFnIHcvb3V0IHJlZ2lvbgotCQkJSVN0cnVjdHVyZWRNb2RlbCBjc3NNb2RlbCA9IGdldENTU01vZGVsKHhOb2RlKTsKLQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gYWRqdXN0IG9mZnNldHMgZm9yIGVtYmVkZGVkIHN0eWxlCi0JCQkJaW50IG9mZnNldCA9IGRvY3VtZW50UG9zaXRpb24gKyBmRG9jdW1lbnRPZmZzZXQ7Ci0JCQkJaW50IHBvcyA9IDA7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBrZXlJbmRleGVkTm9kZSA9IGNzc01vZGVsLmdldEluZGV4ZWRSZWdpb24ocG9zKTsKLQkJCQlpZiAoa2V5SW5kZXhlZE5vZGUgPT0gbnVsbCkgewotCQkJCQlrZXlJbmRleGVkTm9kZSA9IChJbmRleGVkUmVnaW9uKSAoKElDU1NNb2RlbCkgY3NzTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJfQotCQkJCWFycmFuZ2VyID0gbmV3IENTU1Byb3Bvc2FsQXJyYW5nZXIocG9zLCAoSUNTU05vZGUpIGtleUluZGV4ZWROb2RlLCBvZmZzZXQsIChjaGFyKSAwLCBzZWxlY3RlZCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKHBhcmVudCAhPSBudWxsKSAmJiBwYXJlbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSkpIHsKLQkJCS8vIG5vdyB3ZSBrbm93IHRoZSBjdXJzb3IgaXMgaW4gYSA8c3R5bGU+IHRhZyB3aXRoIGEgcmVnaW9uCi0JCQkvLyB1c2UgdGhlIHBhcmVudCBiZWNhdXNlIHRoYXQgd2lsbCBiZSB0aGUgPHN0eWxlPiB0YWcKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgY3NzTW9kZWwgPSBnZXRDU1NNb2RlbChwYXJlbnQpOwotCQkJaWYgKGNzc01vZGVsICE9IG51bGwpIHsKLQkJCQkvLyBhZGp1c3Qgb2Zmc2V0cyBmb3IgZW1iZWRkZWQgc3R5bGUKLQkJCQlpbnQgb2Zmc2V0ID0gaW5kZXhlZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgcG9zID0gZG9jdW1lbnRQb3NpdGlvbiAtIG9mZnNldDsKLQkJCQlJbmRleGVkUmVnaW9uIGtleUluZGV4ZWROb2RlID0gY3NzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihwb3MpOwotCQkJCWlmIChrZXlJbmRleGVkTm9kZSA9PSBudWxsKSB7Ci0JCQkJCWtleUluZGV4ZWROb2RlID0gKEluZGV4ZWRSZWdpb24pICgoSUNTU01vZGVsKSBjc3NNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQkJYXJyYW5nZXIgPSBuZXcgQ1NTUHJvcG9zYWxBcnJhbmdlcihwb3MsIChJQ1NTTm9kZSkga2V5SW5kZXhlZE5vZGUsIG9mZnNldCwgKGNoYXIpIDAsIHNlbGVjdGVkKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChpbmRleGVkTm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkvLyBnZXQgbW9kZWwgZm9yIG5vZGUgdy8gc3R5bGUgYXR0cmlidXRlCi0JCQlJU3RydWN0dXJlZE1vZGVsIGNzc01vZGVsID0gZ2V0Q1NTTW9kZWwoKElET01Ob2RlKSBpbmRleGVkTm9kZSk7Ci0JCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkgewotCQkJCUluZGV4ZWRSZWdpb24ga2V5SW5kZXhlZE5vZGUgPSBjc3NNb2RlbC5nZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50UG9zaXRpb24gLSBmRG9jdW1lbnRPZmZzZXQpOwotCQkJCWlmIChrZXlJbmRleGVkTm9kZSA9PSBudWxsKSB7Ci0JCQkJCWtleUluZGV4ZWROb2RlID0gKEluZGV4ZWRSZWdpb24pICgoSUNTU01vZGVsKSBjc3NNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQkJaWYgKGtleUluZGV4ZWROb2RlIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCQkJLy8gaW5saW5lIHN0eWxlIGZvciBhIHRhZywgbm90IGVtYmVkZGVkCi0JCQkJCWFycmFuZ2VyID0gbmV3IENTU1Byb3Bvc2FsQXJyYW5nZXIoZG9jdW1lbnRQb3NpdGlvbiwgKElDU1NOb2RlKSBrZXlJbmRleGVkTm9kZSwgZkRvY3VtZW50T2Zmc2V0LCBmUXVvdGUsIHNlbGVjdGVkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaW5kZXhlZE5vZGUgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJLy8gd2hlbiBlZGl0aW5nIGV4dGVybmFsIENTUyB1c2luZyBDU1MgRGVzaWduZXIsIElDU1NOb2RlIGlzCi0JCQkvLyBwYXNzZWQuCi0JCQlJQ1NTRG9jdW1lbnQgY3NzZG9jID0gKChJQ1NTTm9kZSkgaW5kZXhlZE5vZGUpLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChjc3Nkb2MgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgY3NzTW9kZWwgPSBjc3Nkb2MuZ2V0TW9kZWwoKTsKLQkJCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlJbmRleGVkUmVnaW9uIGtleUluZGV4ZWROb2RlID0gY3NzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uIC0gZkRvY3VtZW50T2Zmc2V0KTsKLQkJCQkJaWYgKGtleUluZGV4ZWROb2RlID09IG51bGwpIHsKLQkJCQkJCWtleUluZGV4ZWROb2RlID0gKEluZGV4ZWRSZWdpb24pICgoSUNTU01vZGVsKSBjc3NNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJfQotCQkJCQlpZiAoa2V5SW5kZXhlZE5vZGUgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJCQkJLy8gaW5saW5lIHN0eWxlIGZvciBhIHRhZywgbm90IGVtYmVkZGVkCi0JCQkJCQlhcnJhbmdlciA9IG5ldyBDU1NQcm9wb3NhbEFycmFuZ2VyKGRvY3VtZW50UG9zaXRpb24sIChJQ1NTTm9kZSkga2V5SW5kZXhlZE5vZGUsIGZEb2N1bWVudE9mZnNldCwgZlF1b3RlLCBzZWxlY3RlZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKGluZGV4ZWROb2RlID09IG51bGwpICYmIGlzVmlld2VyRW1wdHkodmlld2VyKSkgewotCQkJaXNFbXB0eURvY3VtZW50ID0gdHJ1ZTsKLQkJCS8vIHRoZSB0b3Agb2YgZW1wdHkgQ1NTIERvY3VtZW50Ci0JCQlJU3RydWN0dXJlZE1vZGVsIGNzc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY3NzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJCQlpZiAoY3NzTW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBrZXlJbmRleGVkTm9kZSA9IGNzc01vZGVsLmdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbiAtIGZEb2N1bWVudE9mZnNldCk7Ci0JCQkJCWlmIChrZXlJbmRleGVkTm9kZSA9PSBudWxsKSB7Ci0JCQkJCQlrZXlJbmRleGVkTm9kZSA9IChJbmRleGVkUmVnaW9uKSAoKElDU1NNb2RlbCkgY3NzTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGtleUluZGV4ZWROb2RlIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCQkJCS8vIGlubGluZSBzdHlsZSBmb3IgYSB0YWcsIG5vdCBlbWJlZGRlZAotCQkJCQkJYXJyYW5nZXIgPSBuZXcgQ1NTUHJvcG9zYWxBcnJhbmdlcihkb2N1bWVudFBvc2l0aW9uLCAoSUNTU05vZGUpIGtleUluZGV4ZWROb2RlLCBmRG9jdW1lbnRPZmZzZXQsIGZRdW90ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKQotCQkJCQljc3NNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCi0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJaWYgKGFycmFuZ2VyICE9IG51bGwpIHsKLQkJCWZEb2N1bWVudE9mZnNldCA9IDA7Ci0JCQlwcm9wb3NhbHMgPSBhcnJhbmdlci5nZXRQcm9wb3NhbHMoKTsKLQotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIG5ld2ZpbGVwcm9wb3NhbHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBhbnlwcm9wb3NhbHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJCS8vIGFkZCB0ZW1wbGF0ZSBwcm9wb3NhbHMKLQkJCWlmIChnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKGlzRW1wdHlEb2N1bWVudCkgewotCQkJCQlnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5zZXRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTLk5FVyk7Ci0JCQkJCW5ld2ZpbGVwcm9wb3NhbHMgPSBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCX0KLQkJCQlnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5zZXRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTLkFMTCk7Ci0JCQkJYW55cHJvcG9zYWxzID0gZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCX0KLQotCQkJLy8gYWRkIGVuZCB0YWcgaWYgcGFyZW50IGlzIG5vdCBjbG9zZWQKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWwgZW5kVGFnID0gWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5jb21wdXRlWE1MRW5kVGFnUHJvcG9zYWwodmlld2VyLCBkb2N1bWVudFBvc2l0aW9uLCBpbmRleGVkTm9kZSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFLCBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX1RBR19HRU5FUklDKTsgCi0KLQkJCS8vIGFkZCB0aGUgYWRkaXRpb25hbCBwcm9wb3NhbHMKLQkJCWludCBhZGRpdGlvbmFsTGVuZ3RoID0gbmV3ZmlsZXByb3Bvc2Fscy5sZW5ndGggKyBhbnlwcm9wb3NhbHMubGVuZ3RoOwotCQkJYWRkaXRpb25hbExlbmd0aCA9IChlbmRUYWcgIT0gbnVsbCkgPyArK2FkZGl0aW9uYWxMZW5ndGggOiBhZGRpdGlvbmFsTGVuZ3RoOwotCQkJaWYgKGFkZGl0aW9uYWxMZW5ndGggPiAwKSB7Ci0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHBsdXNPbmVzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLmxlbmd0aCArIGFkZGl0aW9uYWxMZW5ndGhdOwotCQkJCWludCBhcHBlbmRQb3MgPSBwcm9wb3NhbHMubGVuZ3RoOwotCQkJCS8vIGFkZCBlbmQgdGFnIHByb3Bvc2FsCi0JCQkJaWYgKGVuZFRhZyAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkocHJvcG9zYWxzLCAwLCBwbHVzT25lcywgMSwgcHJvcG9zYWxzLmxlbmd0aCk7Ci0JCQkJCXBsdXNPbmVzWzBdID0gZW5kVGFnOwotCQkJCQkrK2FwcGVuZFBvczsKLQkJCQl9IGVsc2UgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHByb3Bvc2FscywgMCwgcGx1c09uZXMsIDAsIHByb3Bvc2Fscy5sZW5ndGgpOwotCQkJCX0KLQkJCQkvLyBhZGQgaXRlbXMgaW4gbmV3ZmlsZXByb3Bvc2FscwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3ZmlsZXByb3Bvc2Fscy5sZW5ndGg7ICsraSkgewotCQkJCQlwbHVzT25lc1thcHBlbmRQb3MgKyBpXSA9IG5ld2ZpbGVwcm9wb3NhbHNbaV07Ci0JCQkJfQotCQkJCS8vIGFkZCBpdGVtcyBpbiBhbnlwcm9wb3NhbHMKLQkJCQlhcHBlbmRQb3MgPSBhcHBlbmRQb3MgKyBuZXdmaWxlcHJvcG9zYWxzLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFueXByb3Bvc2Fscy5sZW5ndGg7ICsraSkgewotCQkJCQlwbHVzT25lc1thcHBlbmRQb3MgKyBpXSA9IGFueXByb3Bvc2Fsc1tpXTsKLQkJCQl9Ci0JCQkJcHJvcG9zYWxzID0gcGx1c09uZXM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3Bvc2FsczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgbm8gdGV4dCBvciBpdCdzIGFsbCB3aGl0ZSBzcGFjZSwgb3RoZXJ3aXNlCi0JICogcmV0dXJucyBmYWxzZQotCSAqIAotCSAqIEBwYXJhbSB0cmVlTm9kZQotCSAqIEBwYXJhbSB0ZXh0Vmlld2VyCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmlld2VyRW1wdHkoSVRleHRWaWV3ZXIgdGV4dFZpZXdlcikgewotCQlib29sZWFuIGlzRW1wdHkgPSBmYWxzZTsKLQkJU3RyaW5nIHRleHQgPSB0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRUZXh0KCk7Ci0JCWlmICgodGV4dCA9PSBudWxsKSB8fCAoKHRleHQgIT0gbnVsbCkgJiYgdGV4dC50cmltKCkuZXF1YWxzKCIiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCWlzRW1wdHkgPSB0cnVlOwotCQlyZXR1cm4gaXNFbXB0eTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgQ1NTTW9kZWwgZm9yIGFuIGluZGV4ZWQgbm9kZQotCSAqIAotCSAqIEBwYXJhbSBpbmRleGVkTm9kZQotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWRNb2RlbAotCSAqLwotCS8vIHByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRDU1NNb2RlbChJbmRleGVkUmVnaW9uIGluZGV4ZWROb2RlKSB7Ci0JLy8gaWYgKGluZGV4ZWROb2RlID09IG51bGwpIHJldHVybiBudWxsOwotCS8vIE5vZGUgbm9kZSA9IChOb2RlKWluZGV4ZWROb2RlOwotCS8vIElOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcilub2RlLmdldFBhcmVudE5vZGUoKTsKLQkvLyBpZiAobm90aWZpZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JLy8gSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPQotCS8vIFN0eWxlQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChub3RpZmllcik7Ci0JLy8gaWYgKGFkYXB0ZXIgPT0gbnVsbCB8fCAhKGFkYXB0ZXIgaW5zdGFuY2VvZiBDU1NNb2RlbEFkYXB0ZXIpKSByZXR1cm4KLQkvLyBudWxsOwotCS8vIENTU01vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSAoQ1NTTW9kZWxBZGFwdGVyKWFkYXB0ZXI7Ci0JLy8gcmV0dXJuIG1vZGVsQWRhcHRlci5nZXRNb2RlbCgpOwotCS8vIH0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDU1Ntb2RlbCBmb3IgYSBnaXZlbiBYTUwgbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWRNb2RlbAotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRDU1NNb2RlbChJRE9NTm9kZSBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBTdHlsZUFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZWxlbWVudCk7Ci0JCWlmICgoYWRhcHRlciA9PSBudWxsKSB8fCAhKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ1NTTW9kZWxBZGFwdGVyKSkKLQkJCXJldHVybiBudWxsOwotCQlJQ1NTTW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IChJQ1NTTW9kZWxBZGFwdGVyKSBhZGFwdGVyOwotCQlyZXR1cm4gbW9kZWxBZGFwdGVyLmdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBwb3NzaWJsZSBjb250ZXh0cyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0JICogbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlciB3aG9zZSBkb2N1bWVudCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIHBvc3NpYmxlCi0JICogICAgICAgICAgICBjb250ZXh0cwotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogICAgICAgICAgICBhbiBvZmZzZXQgd2l0aGluIHRoZSBkb2N1bWVudCBmb3Igd2hpY2ggY29udGV4dCBpbmZvcm1hdGlvbgotCSAqICAgICAgICAgICAgc2hvdWxkIGJlIGNvbXB1dGVkCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb250ZXh0IGluZm9ybWF0aW9uIG9iamVjdHMgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgIGlmIG5vIGNvbnRleHQgY291bGQgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcmFjdGVycyB3aGljaCB3aGVuIGVudGVyZWQgYnkgdGhlIHVzZXIgc2hvdWxkCi0JICogYXV0b21hdGljYWxseSB0cmlnZ2VyIHRoZSBwcmVzZW50YXRpb24gb2YgcG9zc2libGUgY29tcGxldGlvbnMuCi0JICogCi0JICogQHJldHVybiB0aGUgYXV0byBhY3RpdmF0aW9uIGNoYXJhY3RlcnMgZm9yIGNvbXBsZXRpb24gcHJvcG9zYWwgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGF1dG8gYWN0aXZhdGlvbiBpcyBkZXNpcmVkCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIGNvbnRleHQgaW5mb3JtYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgYXV0byBhY3RpdmF0aW9uIGNoYXJhY3RlcnMgZm9yIHByZXNlbnRpbmcgY29udGV4dAotCSAqICAgICAgICAgaW5mb3JtYXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXV0byBhY3RpdmF0aW9uIGlzCi0JICogICAgICAgICBkZXNpcmVkCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB2YWxpZGF0b3IgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiBkaXNwbGF5ZWQgY29udGV4dAotCSAqIGluZm9ybWF0aW9uIHNob3VsZCBiZSBkaXNtaXNzZWQuIE1heSBvbmx5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoZSBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb250ZXh0IGluZm9ybWF0aW9uIHZhbGlkYXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWFzb24gd2h5IGNvbXB1dGVQcm9wb3NhbHMgd2FzIG5vdCBhYmxlIHRvIGZpbmQgYW55Ci0JICogY29tcGxldGlvbnMuCi0JICogCi0JICogQHJldHVybiBhbiBlcnJvciBtZXNzYWdlIG9yIG51bGwgaWYgbm8gZXJyb3Igb2NjdXJyZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMjAwMS8wNS8yMgotCSAqIDEwOjM3OjA1KQotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJZkRvY3VtZW50T2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBxdW90ZQotCSAqICAgICAgICAgICAgY2hhcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1b3RlQ2hhck9mU3R5bGVBdHRyaWJ1dGUoY2hhciBxdW90ZSkgewotCQlmUXVvdGUgPSBxdW90ZTsKLQl9Ci0KLQlwcml2YXRlIENTU1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChmVGVtcGxhdGVQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZlRlbXBsYXRlUHJvY2Vzc29yID0gbmV3IENTU1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpOwotCQl9Ci0JCXJldHVybiBmVGVtcGxhdGVQcm9jZXNzb3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxBcnJhbmdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxBcnJhbmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGY0MzUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsQXJyYW5nZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01lZGlhUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci0KLWNsYXNzIENTU1Byb3Bvc2FsQXJyYW5nZXIgewotCi0JcHJpdmF0ZSBMaXN0IGZQcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBDU1NDb250ZW50QXNzaXN0Q29udGV4dCBmQ29udGV4dCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NQcm9wb3NhbEFycmFuZ2VyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBDU1NQcm9wb3NhbEFycmFuZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENTU1Byb3Bvc2FsQXJyYW5nZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NQcm9wb3NhbEFycmFuZ2VyKGludCBkb2N1bWVudFBvc2l0aW9uLCBJQ1NTTm9kZSBub2RlLCBpbnQgZG9jdW1lbnRPZmZzZXQsIGNoYXIgcXVvdGUpIHsKLQkJdGhpcygpOwotCQlmQ29udGV4dCA9IG5ldyBDU1NDb250ZW50QXNzaXN0Q29udGV4dChkb2N1bWVudFBvc2l0aW9uLCBub2RlLCBkb2N1bWVudE9mZnNldCwgcXVvdGUpOwotCX0KLQotCUNTU1Byb3Bvc2FsQXJyYW5nZXIoaW50IGRvY3VtZW50UG9zaXRpb24sIElDU1NOb2RlIG5vZGUsIGludCBkb2N1bWVudE9mZnNldCwgaW50IGxlbmd0aCwgY2hhciBxdW90ZSkgewotCQl0aGlzKCk7Ci0JCWZDb250ZXh0ID0gbmV3IENTU0NvbnRlbnRBc3Npc3RDb250ZXh0KGRvY3VtZW50UG9zaXRpb24sIG5vZGUsIGRvY3VtZW50T2Zmc2V0LCBsZW5ndGgsIHF1b3RlKTsKLQl9Ci0KLQlDU1NQcm9wb3NhbEFycmFuZ2VyKGludCBkb2N1bWVudFBvc2l0aW9uLCBJQ1NTTm9kZSBub2RlLCBpbnQgZG9jdW1lbnRPZmZzZXQsIGNoYXIgcXVvdGUsIGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJdGhpcygpOwotCQlmQ29udGV4dCA9IG5ldyBDU1NDb250ZW50QXNzaXN0Q29udGV4dChkb2N1bWVudFBvc2l0aW9uLCBub2RlLCBkb2N1bWVudE9mZnNldCwgcXVvdGUsIHNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0Jdm9pZCBidWlsZFByb3Bvc2FscygpIHsKLQkJZlByb3Bvc2Fscy5jbGVhcigpOwotCi0JCS8qCi0JCSAqIFN0cmluZyB0ZXh0OyBJQ29tcGxldGlvblByb3Bvc2FsIGl0ZW07IHRleHQgPSAiLS0tLSBUZXN0Ci0JCSAqIEluZm9ybWF0aW9uIC0tLS0iOyBpdGVtID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwKLQkJICogZkNvbnRleHQuZ2V0UmVwbGFjZUJlZ2luKCksIDAsIDAsIG51bGwsIHRleHQsIG51bGwsIG51bGwpOwotCQkgKiBmUHJvcG9zYWxzLmFkZChpdGVtKTsKLQkJICogCi0JCSAqIHRleHQgPSAiVGFyZ2V0OiBcIiIgKyBmQ29udGV4dC5nZXRSZWdpb25UZXh0KCkgKyAiXCIiOwotCQkgKiAKLQkJICogaXRlbSA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGZDb250ZXh0LmdldFJlcGxhY2VCZWdpbigpLCAwLCAwLAotCQkgKiBudWxsLCB0ZXh0LCBudWxsLCBudWxsKTsgZlByb3Bvc2Fscy5hZGQoaXRlbSk7Ci0JCSAqIAotCQkgKiB0ZXh0ID0gZkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpLmdldENsYXNzKCkudG9TdHJpbmcoKTsgaW50Ci0JCSAqIGxhc3RQZXJpb2RQb3MgPSB0ZXh0Lmxhc3RJbmRleE9mKCcuJyk7IHRleHQgPSAiTm9kZTogIiArCi0JCSAqIHRleHQuc3Vic3RyaW5nKGxhc3RQZXJpb2RQb3MgKyAxKTsgaXRlbSA9IG5ldwotCQkgKiBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGZDb250ZXh0LmdldFJlcGxhY2VCZWdpbigpLCAwLCAwLCBudWxsLAotCQkgKiB0ZXh0LCBudWxsLCBudWxsKTsgZlByb3Bvc2Fscy5hZGQoaXRlbSk7Ci0JCSAqLwotCi0JCUlDU1NOb2RlIHRhcmdldE5vZGUgPSBmQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCS8vaW50IHRhcmdldFBvcyA9IGZDb250ZXh0LmdldFRhcmdldFBvcygpOwotCQlpZiAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KSB7Ci0JCQlidWlsZFByb3Bvc2Fsc0ZvckFueVJ1bGUoKTsKLQkJfSBlbHNlIGlmICgodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NNZWRpYVJ1bGUgJiYgZkNvbnRleHQuaXNUYXJnZXRQb3NBZnRlck9mKENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpKSB8fCAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUgJiYgZkNvbnRleHQuaXNUYXJnZXRQb3NCZWZvcmVPZihDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSkpIHsKLQkJCWJ1aWxkUHJvcG9zYWxzRm9yQW55UnVsZSgpOwotCQkJLy8JCWJ1aWxkUHJvcG9zYWxzRm9yU3R5bGVSdWxlKCk7Ci0JCX0gZWxzZSBpZiAoKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUGFnZVJ1bGUgJiYgZkNvbnRleHQuaXNUYXJnZXRQb3NCZWZvcmVPZihDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSkpIHsKLQkJCWJ1aWxkUHJvcG9zYWxzRm9yUGFnZVJ1bGVQc2V1ZG9DbGFzcygpOwotCQl9IGVsc2UgaWYgKCh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSB8fCB0YXJnZXROb2RlIGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlIHx8IHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUGFnZVJ1bGUgfHwgdGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xhcmF0aW9uKSAmJiAodGFyZ2V0Tm9kZS5nZXRPd25lckRvY3VtZW50KCkgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbiB8fCBmQ29udGV4dC50YXJnZXRGb2xsb3dzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHx8IGZDb250ZXh0LnRhcmdldEZvbGxvd3MoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkpKSB7Ci0JCQlidWlsZFByb3Bvc2Fsc0ZvckRlY2xhcmF0aW9uTmFtZSgpOwotCQl9IGVsc2UgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJaWYgKGZDb250ZXh0LmlzVGFyZ2V0UG9zQWZ0ZXJPZihDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SKSkgewotCQkJCWJ1aWxkUHJvcG9zYWxzRm9yRGVjbGFyYXRpb25WYWx1ZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlidWlsZFByb3Bvc2Fsc0ZvckRlY2xhcmF0aW9uTmFtZSgpOwotCQkJfQotCQl9IGVsc2UgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUpIHsKLQkJCWJ1aWxkUHJvcG9zYWxzRm9yRGVjbGFyYXRpb25WYWx1ZSgpOwotCQl9Ci0JCS8qCi0JCSAqIGVsc2UgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUgfHwgKCh0YXJnZXROb2RlCi0JCSAqIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSB8fCB0YXJnZXROb2RlIGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlIHx8Ci0JCSAqIHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbiB8fCB0YXJnZXROb2RlIGluc3RhbmNlb2YKLQkJICogSUNTU1N0eWxlRGVjbEl0ZW0pICYmCi0JCSAqIGZDb250ZXh0LmlzVGFyZ2V0UG9zQWZ0ZXJPZihDU1NSZWdpb25Db250ZXh0cy5DT0xPTikpKSB7Ci0JCSAqIGJ1aWxkUHJvcG9zYWxzRm9yRGVjbGFyYXRpb25WYWx1ZSgpOyB9Ci0JCSAqLwotCi0JCS8vIGZvciBUZXN0Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgYnVpbGRQcm9wb3NhbHNGb3JBbnlSdWxlKCkgewotCQlDU1NQcm9wb3NhbEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0JCWlmIChpc0ZpcnN0UmVnaW9uKCkpewotCQkJZ2VuZXJhdG9yID0gbmV3IENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yQXRtYXJrUnVsZShmQ29udGV4dCk7Ci0JCQlmUHJvcG9zYWxzLmFkZEFsbChnZW5lcmF0b3IuZ2V0UHJvcG9zYWxzKCkpOwotCQl9Ci0JCWdlbmVyYXRvciA9IG5ldyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckhUTUxUYWcoZkNvbnRleHQpOwotCQlmUHJvcG9zYWxzLmFkZEFsbChnZW5lcmF0b3IuZ2V0UHJvcG9zYWxzKCkpOwotCQlnZW5lcmF0b3IgPSBuZXcgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JQc2V1ZG9TZWxlY3RvcihmQ29udGV4dCk7Ci0JCWZQcm9wb3NhbHMuYWRkQWxsKGdlbmVyYXRvci5nZXRQcm9wb3NhbHMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRmlyc3RSZWdpb24oKXsKLQkJaWYgKGZDb250ZXh0LmdldEN1cnNvclBvcygpID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmQ29udGV4dC5nZXRUYXJnZXRSZWdpb24oKTsKLQkJSVRleHRSZWdpb24gY3VyclJlZ2lvbiA9IGZDb250ZXh0LmdldFJlZ2lvbkJ5T2Zmc2V0KGZDb250ZXh0LmdldEN1cnNvclBvcygpKTsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCSAgICBTdHJpbmcgY3JUeXBlID0gbnVsbDsKLQkJaWYocmVnaW9uICE9IG51bGwpIHsKLQkJCXR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQl9Ci0JCWlmKGN1cnJSZWdpb24gIT0gbnVsbCkgewotCQkJY3JUeXBlID0gY3VyclJlZ2lvbi5nZXRUeXBlKCk7Ci0JCX0KLQkJaWYgKHR5cGUgPT0gbnVsbCB8fCBjclR5cGUgPT0gbnVsbCB8fCAoY3JUeXBlID09IHR5cGUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIGJ1aWxkUHJvcG9zYWxzRm9yRGVjbGFyYXRpb25OYW1lKCkgewotCQlDU1NQcm9wb3NhbEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0JCWdlbmVyYXRvciA9IG5ldyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uTmFtZShmQ29udGV4dCk7Ci0JCWZQcm9wb3NhbHMuYWRkQWxsKGdlbmVyYXRvci5nZXRQcm9wb3NhbHMoKSk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgYnVpbGRQcm9wb3NhbHNGb3JEZWNsYXJhdGlvblZhbHVlKCkgewotCQlDU1NQcm9wb3NhbEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0JCWdlbmVyYXRvciA9IG5ldyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uVmFsdWUoZkNvbnRleHQpOwotCQlmUHJvcG9zYWxzLmFkZEFsbChnZW5lcmF0b3IuZ2V0UHJvcG9zYWxzKCkpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIGJ1aWxkUHJvcG9zYWxzRm9yUGFnZVJ1bGVQc2V1ZG9DbGFzcygpIHsKLQkJQ1NTUHJvcG9zYWxHZW5lcmF0b3IgZ2VuZXJhdG9yOwotCQlnZW5lcmF0b3IgPSBuZXcgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JQc2V1ZG9TZWxlY3RvcihmQ29udGV4dCk7Ci0JCWZQcm9wb3NhbHMuYWRkQWxsKGdlbmVyYXRvci5nZXRQcm9wb3NhbHMoKSk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgYnVpbGRQcm9wb3NhbHNGb3JTdHlsZVJ1bGUoKSB7Ci0JCUNTU1Byb3Bvc2FsR2VuZXJhdG9yIGdlbmVyYXRvcjsKLQkJZ2VuZXJhdG9yID0gbmV3IENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9ySFRNTFRhZyhmQ29udGV4dCk7Ci0JCWZQcm9wb3NhbHMuYWRkQWxsKGdlbmVyYXRvci5nZXRQcm9wb3NhbHMoKSk7Ci0JCWdlbmVyYXRvciA9IG5ldyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvclBzZXVkb1NlbGVjdG9yKGZDb250ZXh0KTsKLQkJZlByb3Bvc2Fscy5hZGRBbGwoZ2VuZXJhdG9yLmdldFByb3Bvc2FscygpKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFByb3Bvc2FscygpIHsKLQkJYnVpbGRQcm9wb3NhbHMoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FsQXJyYXkgPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsW2ZQcm9wb3NhbHMuc2l6ZSgpXTsKLQkJSXRlcmF0b3IgaUl0ZW0gPSBmUHJvcG9zYWxzLml0ZXJhdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpSXRlbS5oYXNOZXh0KCk7IGkrKykgewotCQkJcHJvcG9zYWxBcnJheVtpXSA9IChJQ29tcGxldGlvblByb3Bvc2FsKSBpSXRlbS5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHByb3Bvc2FsQXJyYXk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNTIxNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLWFic3RyYWN0IGNsYXNzIENTU1Byb3Bvc2FsR2VuZXJhdG9yIHsKLQotCi0JcHJvdGVjdGVkIGNsYXNzIFN0cmluZ0FuZE9mZnNldCB7Ci0JCVN0cmluZ0FuZE9mZnNldChTdHJpbmcgc3RyaW5nLCBpbnQgb2Zmc2V0KSB7Ci0JCQl0aGlzLmZTdHJpbmcgPSBzdHJpbmc7Ci0JCQl0aGlzLmZPZmZzZXQgPSBvZmZzZXQ7Ci0JCX0KLQotCQlTdHJpbmcgZlN0cmluZzsKLQkJaW50IGZPZmZzZXQ7Ci0JfQotCi0JcHJvdGVjdGVkIENTU0NvbnRlbnRBc3Npc3RDb250ZXh0IGZDb250ZXh0ID0gbnVsbDsKLQotCS8qKgotCSAqIENTU1Byb3Bvc2FsR2VuZXJhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBDU1NQcm9wb3NhbEdlbmVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NQcm9wb3NhbEdlbmVyYXRvcihDU1NDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0KSB7Ci0JCXRoaXMoKTsKLQkJZkNvbnRleHQgPSBjb250ZXh0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrTGVhZGluZ0NvbG9uKCkgewotCQlib29sZWFuIGhhc0xlYWRpbmdDb2xvbiA9IGZhbHNlOwotCQlJVGV4dFJlZ2lvbiB0YXJnZXRSZWdpb24gPSBmQ29udGV4dC5nZXRUYXJnZXRSZWdpb24oKTsKLQkJaWYgKHRhcmdldFJlZ2lvbiA9PSBudWxsICYmIDAgPCBmQ29udGV4dC5nZXRDdXJzb3JQb3MoKSkgewotCQkJdGFyZ2V0UmVnaW9uID0gZkNvbnRleHQuZ2V0UmVnaW9uQnlPZmZzZXQoZkNvbnRleHQuZ2V0Q3Vyc29yUG9zKCkgLSAxKTsKLQkJCWlmICh0YXJnZXRSZWdpb24gIT0gbnVsbCAmJiB0YXJnZXRSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8pIHsKLQkJCQloYXNMZWFkaW5nQ29sb24gPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHRhcmdldFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBCVUcgOTI4NDggLSBDaGFuZ2VkIGhvdyBwc2V1ZG8tc2VsZWN0b3JzIGFyZSBkZWZpbmVkIGluIHRoZQotCQkJLy8gdG9rZW5pemVyCi0JCQkvLyBUaGUgdGFyZ2V0IHJlZ2lvbiBzaG91bGQgYmUgdGhlIENTU19TRUxFQ1RPUl9QU0VVRE8gbm93Ci0JCQlpZiAodGFyZ2V0UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPKSB7Ci0JCQkJaGFzTGVhZGluZ0NvbG9uID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFzTGVhZGluZ0NvbG9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdBbmRPZmZzZXQgZ2VuZXJhdGVCcmFjZXMoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZkNvbnRleHQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZURlbGltaXRlcigpOwotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBpbmRlbnRTdHIgPSBnZXRJbmRlbnRTdHJpbmcoKTsKLQkJaWYgKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19ORVdMSU5FX09OX09QRU5fQlJBQ0UpKSB7Ci0JCQlidWYuYXBwZW5kKGxpbmVEZWxpbWl0ZXIpOwotCQl9Ci0JCWJ1Zi5hcHBlbmQoInsiKTsvLyROT04tTkxTLTEkCi0JCWlmIChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfT05FX1BFUl9MSU5FKSkgewotCQkJYnVmLmFwcGVuZChsaW5lRGVsaW1pdGVyKTsKLQkJCWJ1Zi5hcHBlbmQoaW5kZW50U3RyKTsKLQkJfSBlbHNlIHsKLQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaW50IG9mZnNldCA9IGJ1Zi5sZW5ndGgoKTsKLQkJaWYgKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUpKSB7Ci0JCQlidWYuYXBwZW5kKGxpbmVEZWxpbWl0ZXIpOwotCQl9IGVsc2UgewotCQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlidWYuYXBwZW5kKCJ9Iik7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IFN0cmluZ0FuZE9mZnNldChidWYudG9TdHJpbmcoKSwgb2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nQW5kT2Zmc2V0IGdlbmVyYXRlUGFyZW50aGVzaXMoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBvZmZzZXQ7Ci0JCWJ1Zi5hcHBlbmQoIigiKTsvLyROT04tTkxTLTEkCi0JCW9mZnNldCA9IDE7Ci0JCWJ1Zi5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgU3RyaW5nQW5kT2Zmc2V0KGJ1Zi50b1N0cmluZygpLCBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdBbmRPZmZzZXQgZ2VuZXJhdGVRdW90ZXMoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNoYXIgcXVvdGVDaGFyID0gZ2V0UXVvdGVDaGFyKCk7Ci0JCWJ1Zi5hcHBlbmQocXVvdGVDaGFyKTsKLQkJYnVmLmFwcGVuZChxdW90ZUNoYXIpOwotCQlyZXR1cm4gbmV3IFN0cmluZ0FuZE9mZnNldChidWYudG9TdHJpbmcoKSwgMSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0FuZE9mZnNldCBnZW5lcmF0ZVNlbWljb2xvbigpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG9mZnNldDsKLQkJYnVmLmFwcGVuZCgiOyIpOy8vJE5PTi1OTFMtMSQKLQkJb2Zmc2V0ID0gMDsKLQkJcmV0dXJuIG5ldyBTdHJpbmdBbmRPZmZzZXQoYnVmLnRvU3RyaW5nKCksIG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0FuZE9mZnNldCBnZW5lcmF0ZVVSSSgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlib29sZWFuIGlzUXVvdGVJblVSSSA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URV9JTl9VUkkpOwotCQljaGFyIHF1b3RlQ2hhciA9IGdldFF1b3RlQ2hhcigpOwotCQlidWYuYXBwZW5kKCJ1cmwoIik7Ly8kTk9OLU5MUy0xJAotCQlpZiAoaXNRdW90ZUluVVJJKSB7Ci0JCQlidWYuYXBwZW5kKHF1b3RlQ2hhcik7Ci0JCX0KLQkJaW50IG9mZnNldCA9IGJ1Zi5sZW5ndGgoKTsKLQkJaWYgKGlzUXVvdGVJblVSSSkgewotCQkJYnVmLmFwcGVuZChxdW90ZUNoYXIpOwotCQl9Ci0JCWJ1Zi5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgU3RyaW5nQW5kT2Zmc2V0KGJ1Zi50b1N0cmluZygpLCBvZmZzZXQpOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBJdGVyYXRvciBnZXRDYW5kaWRhdGVzKCk7Ci0KLQlMaXN0IGdldFByb3Bvc2FscygpIHsKLQkJTGlzdCBwcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJQ1NTSW1hZ2VIZWxwZXIgaW1hZ2VIZWxwZXIgPSBDU1NJbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpOwotCQlJdGVyYXRvciBpID0gZ2V0Q2FuZGlkYXRlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU0NBQ2FuZGlkYXRlIGNhbmRpZGF0ZSA9IChDU1NDQUNhbmRpZGF0ZSkgaS5uZXh0KCk7Ci0JCQlJbWFnZSBpbWFnZSA9IGltYWdlSGVscGVyLmdldEltYWdlKGNhbmRpZGF0ZS5nZXRJbWFnZVR5cGUoKSk7Ci0JCQlJQ29tcGxldGlvblByb3Bvc2FsIGl0ZW0gPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsKGNhbmRpZGF0ZS5nZXRSZXBsYWNlbWVudFN0cmluZygpLCBmQ29udGV4dC5nZXRSZXBsYWNlQmVnaW4oKSArIGZDb250ZXh0LmdldERvY3VtZW50T2Zmc2V0KCksIGZDb250ZXh0LmdldFRleHRUb1JlcGxhY2UoKS5sZW5ndGgoKSwgY2FuZGlkYXRlLmdldEN1cnNvclBvc2l0aW9uKCksIGltYWdlLCBjYW5kaWRhdGUuZ2V0RGlzcGxheVN0cmluZygpLCBudWxsLCBudWxsKTsKLQkJCXByb3Bvc2Fscy5hZGQoaXRlbSk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvcG9zYWxzOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gY2hhcgotCSAqLwotCXByaXZhdGUgY2hhciBnZXRRdW90ZUNoYXIoKSB7Ci0KLQkJU3RyaW5nIHF1b3RlU3RyID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQljaGFyIHF1b3RlQ2hhciA9IChxdW90ZVN0ciAhPSBudWxsICYmIDAgPCBxdW90ZVN0ci5sZW5ndGgoKSkgPyBxdW90ZVN0ci5jaGFyQXQoMCkgOiAnIic7Ci0JCWNoYXIgYXR0clF1b3RlID0gZkNvbnRleHQuZ2V0UXVvdGVPZlN0eWxlQXR0cmlidXRlKCk7Ci0JCWlmIChhdHRyUXVvdGUgIT0gMCkgewotCQkJaWYgKGF0dHJRdW90ZSA9PSAnIicgJiYgcXVvdGVDaGFyID09ICciJykgewotCQkJCXF1b3RlQ2hhciA9ICdcJyc7Ci0JCQl9IGVsc2UgaWYgKGF0dHJRdW90ZSA9PSAnXCcnICYmIHF1b3RlQ2hhciA9PSAnXCcnKSB7Ci0JCQkJcXVvdGVDaGFyID0gJyInOwotCQkJfQotCQl9Ci0JCXJldHVybiBxdW90ZUNoYXI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNNYXRjaChTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgdGV4dFRvQ29tcGFyZSA9IGZDb250ZXh0LmdldFRleHRUb0NvbXBhcmUoKTsKLQkJaWYgKHRleHRUb0NvbXBhcmUubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKHRleHQudG9VcHBlckNhc2UoKS5pbmRleE9mKHRleHRUb0NvbXBhcmUudG9VcHBlckNhc2UoKSkgPT0gMCk7Ci0JCX0KLQkJLyoKLQkJICogU3RyaW5nIHRleHRUb1JlcGxhY2UgPSBmQ29udGV4dC5nZXRUZXh0VG9SZXBsYWNlKCk7IGlmCi0JCSAqICh0ZXh0VG9SZXBsYWNlLmxlbmd0aCgpID09IDApIHsgcmV0dXJuIHRydWU7IH0gZWxzZSB7IHJldHVybgotCQkgKiAodGV4dC50b1VwcGVyQ2FzZSgpLmluZGV4T2YodGV4dFRvUmVwbGFjZS50b1VwcGVyQ2FzZSgpKSA9PSAwKTsgfQotCQkgKi8KLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGdldEluZGVudFN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCWlmIChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQl9Ci0JCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yQXRtYXJrUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JBdG1hcmtSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YmEwMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JBdG1hcmtSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNZXRhTW9kZWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuU2VsZWN0aW9uQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi1jbGFzcyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckF0bWFya1J1bGUgZXh0ZW5kcyBDU1NQcm9wb3NhbEdlbmVyYXRvciB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlVzZVVwcGVyQ2FzZSA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSU0VUID0gIkBjaGFyc2V0IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTlRfRkFDRSA9ICJAZm9udC1mYWNlIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVCA9ICJAaW1wb3J0IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBID0gIkBtZWRpYSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFID0gIkBwYWdlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDU1NBdG1hcmtSdWxlUHJvcG9zYWxHZW5lcmF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKi8KLQlDU1NQcm9wb3NhbEdlbmVyYXRvckZvckF0bWFya1J1bGUoQ1NTQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihjb250ZXh0KTsKLQkJZlVzZVVwcGVyQ2FzZSA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIENTU0NBQ2FuZGlkYXRlIGdldENhbmRpZGF0ZUNoYXJzZXRSdWxlKCkgewotCQkvLyBjaGVjayBjb250ZW50IG1vZGVsCi0JCUNTU01ldGFNb2RlbFV0aWwgdXRpbCA9IG5ldyBDU1NNZXRhTW9kZWxVdGlsKGZDb250ZXh0LmdldE1ldGFNb2RlbCgpKTsKLQkJaWYgKCF1dGlsLmNvbGxlY3ROb2Rlc0J5VHlwZShDU1NNTU5vZGUuVFlQRV9DSEFSU0VUX1JVTEUpLmhhc05leHQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBjaGVjayBpZiBlbWJlZGRlZCBvciBub3QKLQkJaWYgKGZDb250ZXh0LmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgY2FyZXQgcHJlY2VkZSBhbGwgb3RoZXIgcnVsZXMuCi0JCWludCBvZmZzZXQgPSBmQ29udGV4dC5nZXRDdXJzb3JQb3MoKTsKLQkJaWYgKDAgPCBvZmZzZXQpIHsKLQkJCVNlbGVjdGlvbkNvbGxlY3RvciB0cmF2ID0gbmV3IFNlbGVjdGlvbkNvbGxlY3RvcigpOwotCQkJdHJhdi5zZXRSZWdpb24oMCwgb2Zmc2V0IC0gMSk7Ci0JCQl0cmF2LmFwcGx5KGZDb250ZXh0LmdldE1vZGVsKCkuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlJdGVyYXRvciBpID0gdHJhdi5nZXRTZWxlY3RlZE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU05vZGUgJiYgIShvYmogaW5zdGFuY2VvZiBJQ1NTRG9jdW1lbnQpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWludCBjdXJzb3JQb3MgPSAwOwotCQlTdHJpbmcgaWRlbnQgPSAoZlVzZVVwcGVyQ2FzZSkgPyBDSEFSU0VULnRvVXBwZXJDYXNlKCkgOiBDSEFSU0VULnRvTG93ZXJDYXNlKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoaWRlbnQpOwotCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQljdXJzb3JQb3MgPSBidWYubGVuZ3RoKCk7Ci0JCVN0cmluZ0FuZE9mZnNldCBzYW87Ci0JCXNhbyA9IGdlbmVyYXRlUXVvdGVzKCk7Ci0JCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCQljdXJzb3JQb3MgKz0gc2FvLmZPZmZzZXQ7Ci0JCXNhbyA9IGdlbmVyYXRlU2VtaWNvbG9uKCk7Ci0JCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCi0JCVN0cmluZyB0ZXh0ID0gYnVmLnRvU3RyaW5nKCk7Ci0KLQkJaWYgKGlzTWF0Y2godGV4dCkpIHsKLQkJCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcodGV4dCk7Ci0JCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvcyk7Ci0JCQlpdGVtLnNldERpc3BsYXlTdHJpbmcoaWRlbnQpOwotCQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlJVTEVfQ0hBUlNFVCk7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgQ1NTQ0FDYW5kaWRhdGUgZ2V0Q2FuZGlkYXRlRm9udEZhY2VSdWxlKCkgewotCQlDU1NNZXRhTW9kZWxVdGlsIHV0aWwgPSBuZXcgQ1NTTWV0YU1vZGVsVXRpbChmQ29udGV4dC5nZXRNZXRhTW9kZWwoKSk7Ci0JCWlmICghdXRpbC5jb2xsZWN0Tm9kZXNCeVR5cGUoQ1NTTU1Ob2RlLlRZUEVfRk9OVF9GQUNFX1JVTEUpLmhhc05leHQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpbnQgY3Vyc29yUG9zID0gMDsKLQkJU3RyaW5nIGlkZW50ID0gKGZVc2VVcHBlckNhc2UpID8gRk9OVF9GQUNFLnRvVXBwZXJDYXNlKCkgOiBGT05UX0ZBQ0UudG9Mb3dlckNhc2UoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZChpZGVudCk7Ci0JCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCWN1cnNvclBvcyA9IGJ1Zi5sZW5ndGgoKTsKLQkJU3RyaW5nQW5kT2Zmc2V0IHNhbzsKLQkJc2FvID0gZ2VuZXJhdGVCcmFjZXMoKTsKLQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0JCWN1cnNvclBvcyArPSBzYW8uZk9mZnNldDsKLQotCQlTdHJpbmcgdGV4dCA9IGJ1Zi50b1N0cmluZygpOwotCi0JCWlmIChpc01hdGNoKHRleHQpKSB7Ci0JCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKGJ1Zi50b1N0cmluZygpKTsKLQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zKTsKLQkJCWl0ZW0uc2V0RGlzcGxheVN0cmluZyhpZGVudCk7Ci0JCQlpdGVtLnNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUuUlVMRV9GT05URkFDRSk7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgQ1NTQ0FDYW5kaWRhdGUgZ2V0Q2FuZGlkYXRlSW1wb3J0UnVsZSgpIHsKLQkJLy8gY2hlY2sgY29udGVudCBtb2RlbAotCQlDU1NNZXRhTW9kZWxVdGlsIHV0aWwgPSBuZXcgQ1NTTWV0YU1vZGVsVXRpbChmQ29udGV4dC5nZXRNZXRhTW9kZWwoKSk7Ci0JCWlmICghdXRpbC5jb2xsZWN0Tm9kZXNCeVR5cGUoQ1NTTU1Ob2RlLlRZUEVfSU1QT1JUX1JVTEUpLmhhc05leHQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBjaGFyc2V0IGFuZCBpbXBvcnQgY2FuIHByZWNlZGUgaW1wb3J0IHJ1bGUuCi0JCWludCBvZmZzZXQgPSBmQ29udGV4dC5nZXRDdXJzb3JQb3MoKTsKLQkJaWYgKDAgPCBvZmZzZXQpIHsKLQkJCVNlbGVjdGlvbkNvbGxlY3RvciB0cmF2ID0gbmV3IFNlbGVjdGlvbkNvbGxlY3RvcigpOwotCQkJdHJhdi5zZXRSZWdpb24oMCwgb2Zmc2V0IC0gMSk7Ci0JCQl0cmF2LmFwcGx5KGZDb250ZXh0LmdldE1vZGVsKCkuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlJdGVyYXRvciBpID0gdHJhdi5nZXRTZWxlY3RlZE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU05vZGUgJiYgIShvYmogaW5zdGFuY2VvZiBJQ1NTRG9jdW1lbnQgfHwgb2JqIGluc3RhbmNlb2YgSUNTU0NoYXJzZXRSdWxlIHx8IG9iaiBpbnN0YW5jZW9mIElDU1NJbXBvcnRSdWxlKSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpbnQgY3Vyc29yUG9zID0gMDsKLQkJU3RyaW5nIGlkZW50ID0gKGZVc2VVcHBlckNhc2UpID8gSU1QT1JULnRvVXBwZXJDYXNlKCkgOiBJTVBPUlQudG9Mb3dlckNhc2UoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZChpZGVudCk7Ci0JCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCWN1cnNvclBvcyA9IGJ1Zi5sZW5ndGgoKTsKLQkJU3RyaW5nQW5kT2Zmc2V0IHNhbzsKLQkJc2FvID0gZ2VuZXJhdGVVUkkoKTsKLQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0JCWN1cnNvclBvcyArPSBzYW8uZk9mZnNldDsKLQkJc2FvID0gZ2VuZXJhdGVTZW1pY29sb24oKTsKLQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0KLQkJU3RyaW5nIHRleHQgPSBidWYudG9TdHJpbmcoKTsKLQotCQlpZiAoaXNNYXRjaCh0ZXh0KSkgewotCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyhidWYudG9TdHJpbmcoKSk7Ci0JCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvcyk7Ci0JCQlpdGVtLnNldERpc3BsYXlTdHJpbmcoaWRlbnQpOwotCQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlJVTEVfSU1QT1JUKTsKLQkJCXJldHVybiBpdGVtOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBDU1NDQUNhbmRpZGF0ZSBnZXRDYW5kaWRhdGVNZWRpYVJ1bGUoKSB7Ci0JCUNTU01ldGFNb2RlbFV0aWwgdXRpbCA9IG5ldyBDU1NNZXRhTW9kZWxVdGlsKGZDb250ZXh0LmdldE1ldGFNb2RlbCgpKTsKLQkJaWYgKCF1dGlsLmNvbGxlY3ROb2Rlc0J5VHlwZShDU1NNTU5vZGUuVFlQRV9NRURJQV9SVUxFKS5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaW50IGN1cnNvclBvcyA9IDA7Ci0JCVN0cmluZyBpZGVudCA9IChmVXNlVXBwZXJDYXNlKSA/IE1FRElBLnRvVXBwZXJDYXNlKCkgOiBNRURJQS50b0xvd2VyQ2FzZSgpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKGlkZW50KTsKLQkJYnVmLmFwcGVuZCgiICAiKTsvLyROT04tTkxTLTEkCi0JCWN1cnNvclBvcyA9IGJ1Zi5sZW5ndGgoKSAtIDE7Ci0JCVN0cmluZ0FuZE9mZnNldCBzYW87Ci0JCXNhbyA9IGdlbmVyYXRlQnJhY2VzKCk7Ci0JCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCi0JCVN0cmluZyB0ZXh0ID0gYnVmLnRvU3RyaW5nKCk7Ci0KLQkJaWYgKGlzTWF0Y2godGV4dCkpIHsKLQkJCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcoYnVmLnRvU3RyaW5nKCkpOwotCQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbihjdXJzb3JQb3MpOwotCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKGlkZW50KTsKLQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5SVUxFX01FRElBKTsKLQkJCXJldHVybiBpdGVtOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBDU1NDQUNhbmRpZGF0ZSBnZXRDYW5kaWRhdGVQYWdlUnVsZSgpIHsKLQkJQ1NTTWV0YU1vZGVsVXRpbCB1dGlsID0gbmV3IENTU01ldGFNb2RlbFV0aWwoZkNvbnRleHQuZ2V0TWV0YU1vZGVsKCkpOwotCQlpZiAoIXV0aWwuY29sbGVjdE5vZGVzQnlUeXBlKENTU01NTm9kZS5UWVBFX1BBR0VfUlVMRSkuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWludCBjdXJzb3JQb3MgPSAwOwotCQlTdHJpbmcgaWRlbnQgPSAoZlVzZVVwcGVyQ2FzZSkgPyBQQUdFLnRvVXBwZXJDYXNlKCkgOiBQQUdFLnRvTG93ZXJDYXNlKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoaWRlbnQpOwotCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQljdXJzb3JQb3MgPSBidWYubGVuZ3RoKCk7Ci0JCVN0cmluZ0FuZE9mZnNldCBzYW87Ci0JCXNhbyA9IGdlbmVyYXRlQnJhY2VzKCk7Ci0JCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCQljdXJzb3JQb3MgKz0gc2FvLmZPZmZzZXQ7Ci0KLQkJU3RyaW5nIHRleHQgPSBidWYudG9TdHJpbmcoKTsKLQotCQlpZiAoaXNNYXRjaCh0ZXh0KSkgewotCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyhidWYudG9TdHJpbmcoKSk7Ci0JCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvcyk7Ci0JCQlpdGVtLnNldERpc3BsYXlTdHJpbmcoaWRlbnQpOwotCQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlJVTEVfUEFHRSk7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0Q2FuZGlkYXRlcyBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2FuZGlkYXRlcygpIHsKLQkJTGlzdCBjYW5kaWRhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZDb250ZXh0LmdldFRhcmdldFJlZ2lvblByZXZpb3VzKCk7Ci0JCS8vCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZDb250ZXh0LmdldFNpZ25pZmljYW50VGFyZ2V0UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpIHsKLQkJCQlyZXR1cm4gY2FuZGlkYXRlcy5pdGVyYXRvcigpOwotCQkJfQotCQl9Ci0KLQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbTsKLQkJaWYgKChpdGVtID0gZ2V0Q2FuZGlkYXRlSW1wb3J0UnVsZSgpKSAhPSBudWxsKSB7Ci0JCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQkJfQotCQlpZiAoKGl0ZW0gPSBnZXRDYW5kaWRhdGVDaGFyc2V0UnVsZSgpKSAhPSBudWxsKSB7Ci0JCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQkJfQotCQlpZiAoKGl0ZW0gPSBnZXRDYW5kaWRhdGVNZWRpYVJ1bGUoKSkgIT0gbnVsbCkgewotCQkJY2FuZGlkYXRlcy5hZGQoaXRlbSk7Ci0JCX0KLQkJaWYgKChpdGVtID0gZ2V0Q2FuZGlkYXRlUGFnZVJ1bGUoKSkgIT0gbnVsbCkgewotCQkJY2FuZGlkYXRlcy5hZGQoaXRlbSk7Ci0JCX0KLQkJaWYgKChpdGVtID0gZ2V0Q2FuZGlkYXRlRm9udEZhY2VSdWxlKCkpICE9IG51bGwpIHsKLQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQl9Ci0JCXJldHVybiBjYW5kaWRhdGVzLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvbk5hbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25OYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZjg5MDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvbk5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlVHlwZTsKLQotY2xhc3MgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvbk5hbWUgZXh0ZW5kcyBDU1NQcm9wb3NhbEdlbmVyYXRvciB7Ci0KLQkvKioKLQkgKiBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICovCi0JQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvbk5hbWUoQ1NTQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDYW5kaWRhdGVzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDYW5kaWRhdGVzKCkgewotCQlMaXN0IGNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIHByZURlbGltID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BSRV9ERUxJTSk7IGkrKykgewotCQkJcHJlRGVsaW0gKz0gJyAnOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmcgcG9zdERlbGltID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BPU1RfREVMSU0pOyBpKyspIHsKLQkJCXBvc3REZWxpbSArPSAnICc7Ly8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSUNTU05vZGUgdGFyZ2V0Tm9kZSA9IGZDb250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJYm9vbGVhbiBiRm9udFJ1bGUgPSBmYWxzZTsKLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gdGFyZ2V0Tm9kZTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZSkgewotCQkJCWJGb250UnVsZSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlDU1NNZXRhTW9kZWxVdGlsIHV0aWwgPSBuZXcgQ1NTTWV0YU1vZGVsVXRpbChmQ29udGV4dC5nZXRNZXRhTW9kZWwoKSk7Ci0JCUl0ZXJhdG9yIGlOYW1lcyA9IHV0aWwuY29sbGVjdE5vZGVzQnlUeXBlKChiRm9udFJ1bGUpID8gQ1NTTU1Ob2RlLlRZUEVfREVTQ1JJUFRPUiA6IENTU01NTm9kZS5UWVBFX1BST1BFUlRZKTsKLQkJd2hpbGUgKGlOYW1lcy5oYXNOZXh0KCkpIHsKLQkJCUNTU01NTm9kZSBub2RlID0gKENTU01NTm9kZSkgaU5hbWVzLm5leHQoKTsKLQkJCW5hbWVzLmFkZChub2RlKTsKLQkJfQotCQlzb3J0TmFtZXMobmFtZXMpOwotCQkvLyBDb2xsZWN0aW9ucy5zb3J0KG5hbWVzKTsKLQotCQlib29sZWFuIGJBZGRDb2xvbiA9IHRydWU7Ci0JCWlmICgodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUgfHwgdGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtIHx8IHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbikgJiYgZkNvbnRleHQudGFyZ2V0SGFzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IpKSB7Ci0JCQliQWRkQ29sb24gPSBmYWxzZTsKLQkJfQotCi0JCUl0ZXJhdG9yIGkgPSBuYW1lcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU01NTm9kZSBub2RlID0gKENTU01NTm9kZSkgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgdGV4dCA9IG5vZGUuZ2V0TmFtZSgpOwotCQkJdGV4dCA9IChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpID8gdGV4dC50b1VwcGVyQ2FzZSgpIDogdGV4dC50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKCFpc01hdGNoKHRleHQpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWludCBjdXJzb3JQb3MgPSAwOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJ1Zi5hcHBlbmQodGV4dCk7Ci0JCQlidWYuYXBwZW5kKHByZURlbGltKTsKLQkJCWN1cnNvclBvcyA9IGJ1Zi5sZW5ndGgoKTsKLQkJCWlmIChiQWRkQ29sb24pIHsKLQkJCQlidWYuYXBwZW5kKCc6Jyk7Ly8kTk9OLU5MUy0xJAotCQkJCWJ1Zi5hcHBlbmQocG9zdERlbGltKTsKLQkJCQljdXJzb3JQb3MgKz0gMSArIHBvc3REZWxpbS5sZW5ndGgoKTsKLQkJCX0KLQkJCS8vIGlmICghICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pKSB7Ci0JCQkvLyBidWYuYXBwZW5kKCc7Jyk7Ly8kTk9OLU5MUy0xJAotCQkJLy8gfQotCi0JCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKGJ1Zi50b1N0cmluZygpKTsKLQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zKTsKLQkJCWl0ZW0uc2V0RGlzcGxheVN0cmluZyh0ZXh0KTsKLQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKGdldENhdGVnb3J5SW1hZ2VUeXBlKG5vZGUpKTsKLQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQl9Ci0KLQkJcmV0dXJuIGNhbmRpZGF0ZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQl2b2lkIHNvcnROYW1lcyhMaXN0IG5hbWVzKSB7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobmFtZXMsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJQ1NTTU1Ob2RlIG5vZGUxID0gKENTU01NTm9kZSkgbzE7Ci0JCQkJQ1NTTU1Ob2RlIG5vZGUyID0gKENTU01NTm9kZSkgbzI7Ci0JCQkJaWYgKG5vZGUxID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfSBlbHNlIGlmIChub2RlMiA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJaW50IGRpZmYgPSAwOwotCQkJCVN0cmluZyBjYXRlZ29yeTEgPSBub2RlMS5nZXRBdHRyaWJ1dGUoImNhdGVnb3J5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgY2F0ZWdvcnkyID0gbm9kZTIuZ2V0QXR0cmlidXRlKCJjYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGNhdGVnb3J5MSA9PSBudWxsKSB7Ci0JCQkJCWlmIChjYXRlZ29yeTIgPT0gbnVsbCkgewotCQkJCQkJZGlmZiA9IDA7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gMTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoY2F0ZWdvcnkyID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRpZmYgPSBjYXRlZ29yeTEuY29tcGFyZVRvKGNhdGVnb3J5Mik7Ci0JCQkJfQotCQkJCWlmIChkaWZmID09IDApIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBub2RlMS5nZXROYW1lKCk7Ci0JCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJCXJldHVybiAxOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIG5hbWUuY29tcGFyZVRvKG5vZGUyLmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZGlmZjsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qCi0JICogcmV0cmlldmUgZGVmYXVsdCBjYXRlZ29yeSBpY29uIG5hbWUgVE9ETzogaWYgbm9kZSBoYXMgImljb24iKD8pLCB1c2UKLQkgKiBpdC4KLQkgKi8KLQlDU1NJbWFnZVR5cGUgZ2V0Q2F0ZWdvcnlJbWFnZVR5cGUoQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJQ1NTSW1hZ2VUeXBlIGltYWdlVHlwZSA9IG51bGw7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyBjYXRlZ29yeSA9IG5vZGUuZ2V0QXR0cmlidXRlKCJjYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoY2F0ZWdvcnkgIT0gbnVsbCkgewotCQkJCWltYWdlVHlwZSA9IENTU0ltYWdlVHlwZS5nZXRJbWFnZVR5cGUoY2F0ZWdvcnkpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoaW1hZ2VUeXBlID09IG51bGwpID8gQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX0RFRkFVTFQgOiBpbWFnZVR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvblZhbHVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlkOTkzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1GdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTnVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTRnVuY3Rpb25JRDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci0KLWNsYXNzIENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25WYWx1ZSBleHRlbmRzIENTU1Byb3Bvc2FsR2VuZXJhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRBTlQgPSAiIWltcG9ydGFudCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGJvb2xlYW4gZlVzZVVwcGVyQ2FzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkFwcGVuZFNlbWlDb2xvbjsKLQotCS8qKgotCSAqIENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25WYWx1ZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqLwotCUNTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25WYWx1ZShDU1NDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyKGNvbnRleHQpOwotCQlmVXNlVXBwZXJDYXNlID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRnVuY3Rpb24oTGlzdCBjYW5kaWRhdGVzLCBDU1NNTUZ1bmN0aW9uIHByb3ApIHsKLQkJU3RyaW5nIHRleHQgPSBwcm9wLnRvU3RyaW5nKCk7Ci0JCWlmICghaXNNYXRjaCh0ZXh0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IGN1cnNvclBvcyA9IDA7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChwcm9wLmdldE5hbWUoKS5lcXVhbHMoQ1NTRnVuY3Rpb25JRC5GX1VSSSkpIHsKLQkJCVN0cmluZ0FuZE9mZnNldCBzYW8gPSBnZW5lcmF0ZVVSSSgpOwotCQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0JCQljdXJzb3JQb3MgPSBzYW8uZk9mZnNldDsKLQkJfSBlbHNlIHsKLQkJCWJ1Zi5hcHBlbmQocHJvcC50b1N0cmluZygpKTsKLQkJCWN1cnNvclBvcyA9IGJ1Zi5sZW5ndGgoKTsKLQkJCVN0cmluZ0FuZE9mZnNldCBzYW8gPSBnZW5lcmF0ZVBhcmVudGhlc2lzKCk7Ci0JCQlidWYuYXBwZW5kKHNhby5mU3RyaW5nKTsKLQkJCWN1cnNvclBvcyArPSBzYW8uZk9mZnNldDsKLQkJfQotCi0JCXRleHQgPSBidWYudG9TdHJpbmcoKTsKLQkJdGV4dCA9IChmVXNlVXBwZXJDYXNlKSA/IHRleHQudG9VcHBlckNhc2UoKSA6IHRleHQudG9Mb3dlckNhc2UoKTsKLQotCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcodGV4dCk7Ci0JCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zKTsKLQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKHRleHQpOwotCQlpdGVtLnNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUuVkFMVUVfRlVOQ1RJT04pOwotCQlhcHBlbmRTZW1pQ29sb24oaXRlbSk7Ci0JCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTnVtYmVyKExpc3QgY2FuZGlkYXRlcywgQ1NTTU1OdW1iZXIgcHJvcCkgewotCQlTdHJpbmcgZnVsbFRleHQgPSBmQ29udGV4dC5nZXRUZXh0VG9SZXBsYWNlKCk7Ci0JCS8vIHNraXAgbnVtYmVyCi0JCWludCB1bml0SW5kZXggPSAtMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmdWxsVGV4dC5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoZnVsbFRleHQuY2hhckF0KGkpKSkgewotCQkJCXVuaXRJbmRleCA9IGkgKyAxOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyB1bml0U3ViVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBudW1TdWJUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKDAgPD0gdW5pdEluZGV4KSB7Ci0JCQludW1TdWJUZXh0ID0gZnVsbFRleHQuc3Vic3RyaW5nKDAsIHVuaXRJbmRleCk7Ci0JCQlpZiAodW5pdEluZGV4IDwgZnVsbFRleHQubGVuZ3RoKCkpIHsKLQkJCQl1bml0U3ViVGV4dCA9IGZ1bGxUZXh0LnN1YnN0cmluZyh1bml0SW5kZXgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdW5pdFN1YlRleHQgPSBmdWxsVGV4dDsKLQkJfQotCi0JCUl0ZXJhdG9yIGkgPSBwcm9wLmdldERlc2NlbmRhbnRzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTTU1Vbml0IHVuaXQgPSAoQ1NTTU1Vbml0KSBpLm5leHQoKTsKLQkJCVN0cmluZyB1bml0U3RyaW5nID0gdW5pdC5nZXRVbml0U3RyaW5nKCk7Ci0JCQlpZiAoKDAgPCB1bml0U3ViVGV4dC5sZW5ndGgoKSAmJiB1bml0U3RyaW5nLmluZGV4T2YodW5pdFN1YlRleHQpICE9IDApIHx8ICgwIDwgbnVtU3ViVGV4dC5sZW5ndGgoKSAmJiB1bml0U3RyaW5nLmVxdWFscygiIyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCVN0cmluZyB0ZXh0ID0gbnVtU3ViVGV4dCArIHVuaXRTdHJpbmc7Ci0JCQl0ZXh0ID0gKGZVc2VVcHBlckNhc2UpID8gdGV4dC50b1VwcGVyQ2FzZSgpIDogdGV4dC50b0xvd2VyQ2FzZSgpOwotCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyh0ZXh0KTsKLQkJCWlmICgwIDwgbnVtU3ViVGV4dC5sZW5ndGgoKSB8fCB0ZXh0LmVxdWFscygiIyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKHRleHQubGVuZ3RoKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKDApOwotCQkJfQotCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKHRleHQpOwotCQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlZBTFVFX05VTUJFUik7Ci0JCQlhcHBlbmRTZW1pQ29sb24oaXRlbSk7Ci0JCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tTZW1pQ29sb24oKSB7Ci0JCWZBcHBlbmRTZW1pQ29sb24gPSBmYWxzZTsKLQotCQlJVGV4dFJlZ2lvbiB0YXJnZXRSZWdpb24gPSBmQ29udGV4dC5nZXRUYXJnZXRSZWdpb24oKTsKLQkJaWYgKHRhcmdldFJlZ2lvbiAhPSBudWxsICYmIHRhcmdldFJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJLy8gZmluZCB0cmFpbGluZyAiOiIgb3IgIjsiCi0JCQkvLyBpZiAiOiIgYmVmb3JlICI7IiBpcyBmb3VuZCwgYWRkICI7IgotCQkJUmVnaW9uSXRlcmF0b3IgaXRlcmF0b3IgPSBmQ29udGV4dC5nZXRSZWdpb25JdGVyYXRvcigpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250YWluZXIgPSBpdGVyYXRvci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGl0ZXJhdG9yLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IGNvbnRhaW5lcikgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUikgewotCQkJCQlmQXBwZW5kU2VtaUNvbG9uID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmQXBwZW5kU2VtaUNvbG9uKSB7Ci0JCQkJLy8gc2Vjb25kIGNoYW5jZToKLQkJCQkvLyBsZWFkaW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgbm90ICI7IgotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IENTU1V0aWwuZmluZE5leHRTaWduaWZpY2FudE5vZGUoY29udGFpbmVyKTsKLQkJCQlpZiAoQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQkJZkFwcGVuZFNlbWlDb2xvbiA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRTZW1pQ29sb24oQ1NTQ0FDYW5kaWRhdGUgaXRlbSkgewotCQlpZiAoZkFwcGVuZFNlbWlDb2xvbikgewotCQkJU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nID0gaXRlbS5nZXRSZXBsYWNlbWVudFN0cmluZygpOwotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyhyZXBsYWNlbWVudFN0cmluZyArICI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBjdXJzb3JQb3NpdGlvbiA9IGl0ZW0uZ2V0Q3Vyc29yUG9zaXRpb24oKTsKLQkJCWlmIChyZXBsYWNlbWVudFN0cmluZy5sZW5ndGgoKSA8PSBjdXJzb3JQb3NpdGlvbikgewotCQkJCS8vIGN1cnNvcnBvcyBpcyB0YWlsIG9mIHN0cmluZwotCQkJCWN1cnNvclBvc2l0aW9uKys7Ci0JCQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbihjdXJzb3JQb3NpdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFNlbWlDb2xvbihMaXN0IGNhbmRpZGF0ZXMpIHsKLQkJSUNTU05vZGUgdGFyZ2V0Tm9kZSA9IGZDb250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJSUNTU05vZGUgZmlyc3RDaGlsZCA9IHRhcmdldE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJaWYgKGZpcnN0Q2hpbGQgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChmaXJzdENoaWxkIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCWludCBzdGFydE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgZmlyc3RDaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpZiAoZkNvbnRleHQuZ2V0Q3Vyc29yUG9zKCkgPD0gc3RhcnRPZmZzZXQpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWJvb2xlYW4gYkFkZENsb3NlciA9IGZhbHNlOwotCi0JCUlUZXh0UmVnaW9uIHRhcmdldFJlZ2lvbiA9IGZDb250ZXh0LmdldFRhcmdldFJlZ2lvbigpOwotCQlpZiAodGFyZ2V0UmVnaW9uICE9IG51bGwgJiYgdGFyZ2V0UmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkvLyBmaW5kIHRyYWlsaW5nICI6IiBvciAiOyIKLQkJCS8vIGlmICI6IiBiZWZvcmUgIjsiIGlzIGZvdW5kLCBhZGQgIjsiCi0JCQlSZWdpb25JdGVyYXRvciBpdGVyYXRvciA9IGZDb250ZXh0LmdldFJlZ2lvbkl0ZXJhdG9yKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRhaW5lciA9IGl0ZXJhdG9yLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoaXRlcmF0b3IuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gY29udGFpbmVyKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SKSB7Ci0JCQkJCWJBZGRDbG9zZXIgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWJBZGRDbG9zZXIpIHsKLQkJCQkvLyBzZWNvbmQgY2hhbmNlOgotCQkJCS8vIGxlYWRpbmcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBub3QgIjsiCi0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gQ1NTVXRpbC5maW5kTmV4dFNpZ25pZmljYW50Tm9kZShjb250YWluZXIpOwotCQkJCWlmIChDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUobmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJCQliQWRkQ2xvc2VyID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYkFkZENsb3NlcikgewotCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJU3RyaW5nIHRleHQgPSBmQ29udGV4dC5nZXRUZXh0VG9SZXBsYWNlKCkgKyAiOyI7Ly8kTk9OLU5MUy0xJAotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyh0ZXh0KTsKLQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24odGV4dC5sZW5ndGgoKSk7Ci0JCQlpdGVtLnNldERpc3BsYXlTdHJpbmcoIjsiKTsvLyROT04tTkxTLTEkCi0JCQlpdGVtLnNldEltYWdlVHlwZShudWxsKTsKLQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTdHJpbmcoTGlzdCBjYW5kaWRhdGVzLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoIWlzTWF0Y2godGV4dCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRleHQgPSAoZlVzZVVwcGVyQ2FzZSkgPyB0ZXh0LnRvVXBwZXJDYXNlKCkgOiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0KLQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKHRleHQpOwotCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKHRleHQubGVuZ3RoKCkpOwotCQlpdGVtLnNldERpc3BsYXlTdHJpbmcodGV4dCk7Ci0JCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5WQUxVRV9TVFJJTkcpOwotCQlhcHBlbmRTZW1pQ29sb24oaXRlbSk7Ci0JCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRJbXBvcnRhbnQoTGlzdCBjYW5kaWRhdGVzKSB7Ci0JCUlDU1NOb2RlIHRhcmdldE5vZGUgPSBmQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCXdoaWxlICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1ByaW1pdGl2ZVZhbHVlKSB7Ci0JCQl0YXJnZXROb2RlID0gdGFyZ2V0Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKCEodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIDEuIGhhcyBubyBwcmlvcml0eSByZWdpb24KLQkJLy8gMi4gY3Vyc29yIHBvc2l0aW9uIGlzIGFmdGVyIG9mIGxhc3QgY2hpbGQKLQkJLy8gMy4gbm9ybWFsIGlzTWF0Y2ggbWV0aG9kCi0JCVN0cmluZyBwcmlvcml0eSA9ICgoSUNTU1N0eWxlRGVjbEl0ZW0pIHRhcmdldE5vZGUpLmdldFByaW9yaXR5KCk7Ci0JCWlmIChwcmlvcml0eSA9PSBudWxsIHx8IHByaW9yaXR5Lmxlbmd0aCgpID09IDApIHsKLQkJCUlDU1NOb2RlIGxhc3RDaGlsZCA9IHRhcmdldE5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCQlpZiAobGFzdENoaWxkIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCWludCBzdGFydE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgbGFzdENoaWxkKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCS8vCWludCBlbmRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pbGFzdENoaWxkKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQlpZiAoc3RhcnRPZmZzZXQgPCBmQ29udGV4dC5nZXRDdXJzb3JQb3MoKSAmJiBpc01hdGNoKElNUE9SVEFOVCkpIHsKLQkJCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKElNUE9SVEFOVCk7Ci0JCQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oSU1QT1JUQU5ULmxlbmd0aCgpKTsKLQkJCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKElNUE9SVEFOVCk7Ci0JCQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5WQUxVRV9TVFJJTkcpOwotCQkJCQlhcHBlbmRTZW1pQ29sb24oaXRlbSk7Ci0JCQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGdldENhbmRpZGF0ZXMgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENhbmRpZGF0ZXMoKSB7Ci0JCUxpc3QgY2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQljaGVja1NlbWlDb2xvbigpOyAvLyBjaGVjayBzaG91bGQgYWRkIHNlbWktY29sb24gb3Igbm90Ci0KLQkJU3RyaW5nIG5hbWUgPSBnZXRQcm9wZXJ0eU5hbWUoKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJQ1NTTWV0YU1vZGVsVXRpbCB1dGlsID0gbmV3IENTU01ldGFNb2RlbFV0aWwoZkNvbnRleHQuZ2V0TWV0YU1vZGVsKCkpOwotCQkJSXRlcmF0b3IgaSA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCWlmIChpc0ZvbnRGYWNlUnVsZSgpKSB7Ci0JCQkJQ1NTTU1EZXNjcmlwdG9yIGRlc2MgPSB1dGlsLmdldERlc2NyaXB0b3IobmFtZSk7Ci0JCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQlpID0gZGVzYy5nZXRWYWx1ZXMoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUNTU01NUHJvcGVydHkgcHJvcCA9IHV0aWwuZ2V0UHJvcGVydHkobmFtZSk7Ci0JCQkJaWYgKHByb3AgIT0gbnVsbCkgewotCQkJCQlpID0gcHJvcC5nZXRWYWx1ZXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlDU1NNTU5vZGUgdmFsID0gKENTU01NTm9kZSkgaS5uZXh0KCk7Ci0JCQkJU3RyaW5nIHZhbHVlVHlwZSA9IHZhbC5nZXRUeXBlKCk7Ci0JCQkJaWYgKHZhbHVlVHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9LRVlXT1JEKSB7Ci0JCQkJCWFkZFN0cmluZyhjYW5kaWRhdGVzLCB2YWwudG9TdHJpbmcoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfTlVNQkVSKSB7Ci0JCQkJCWFkZE51bWJlcihjYW5kaWRhdGVzLCAoQ1NTTU1OdW1iZXIpIHZhbCk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfRlVOQ1RJT04pIHsKLQkJCQkJYWRkRnVuY3Rpb24oY2FuZGlkYXRlcywgKENTU01NRnVuY3Rpb24pIHZhbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJYWRkSW1wb3J0YW50KGNhbmRpZGF0ZXMpOwotCQlhZGRTZW1pQ29sb24oY2FuZGlkYXRlcyk7Ci0KLQkJcmV0dXJuIGNhbmRpZGF0ZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0JCUlDU1NOb2RlIHRhcmdldE5vZGUgPSBmQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCXdoaWxlICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1ByaW1pdGl2ZVZhbHVlKSB7Ci0JCQl0YXJnZXROb2RlID0gdGFyZ2V0Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJcmV0dXJuICgoSUNTU1N0eWxlRGVjbEl0ZW0pIHRhcmdldE5vZGUpLmdldFByb3BlcnR5TmFtZSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRm9udEZhY2VSdWxlKCkgewotCQlJQ1NTTm9kZSB0YXJnZXROb2RlID0gZkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQl3aGlsZSAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NQcmltaXRpdmVWYWx1ZSkgewotCQkJdGFyZ2V0Tm9kZSA9IHRhcmdldE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pIHsKLQkJCXRhcmdldE5vZGUgPSB0YXJnZXROb2RlLmdldFBhcmVudE5vZGUoKTsgLy8gZ2V0IERlY2xhcmF0aW9uCi0JCQlpZiAodGFyZ2V0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJLy8gaW5saW5lIHN0eWxlIGhhcyBubyBydWxlIG5vZGUKLQkJCQl0YXJnZXROb2RlID0gdGFyZ2V0Tm9kZS5nZXRQYXJlbnROb2RlKCk7IC8vIGdldCBydWxlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICh0YXJnZXROb2RlIGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvckZvckhUTUxUYWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9ySFRNTFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzAyY2IxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9ySFRNTFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNRG9jVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWNsYXNzIENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9ySFRNTFRhZyBleHRlbmRzIENTU1Byb3Bvc2FsR2VuZXJhdG9yIHsKLQotCS8qKgotCSAqIENTU1N0eWxlUnVsZVByb3Bvc2FsR2VuZXJhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICovCi0JQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JIVE1MVGFnKENTU0NvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIoY29udGV4dCk7Ci0KLQkJaWYgKGZIVE1MVGFncyA9PSBudWxsKSB7Ci0JCQlmSFRNTFRhZ3MgPSBzZXR1cEhUTUxUYWdzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXRDYW5kaWRhdGVzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDYW5kaWRhdGVzKCkgewotCQlMaXN0IGNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKGNoZWNrTGVhZGluZ0NvbG9uKCkpIHsKLQkJCXJldHVybiBjYW5kaWRhdGVzLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlib29sZWFuIGJMb3dlckNhc2UgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfU0VMRUNUT1IpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVI7Ci0JCS8vIFhIVE1MIHJlcXVpcmVzIGxvd2VyIGNhc2UKLQkJaWYgKGZDb250ZXh0LmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpIHsKLQkJCU5vZGUgZG9tTm9kZSA9IGZDb250ZXh0LmdldE1vZGVsKCkuZ2V0T3duZXJET01Ob2RlKCk7Ci0JCQlpZiAoZG9tTm9kZSAhPSBudWxsICYmICEoZG9tTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSkgewotCQkJCWRvbU5vZGUgPSBkb21Ob2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCQlpZiAoZG9tTm9kZSBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkgewotCQkJCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgKChJRE9NRG9jdW1lbnQpIGRvbU5vZGUpLmdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJCQliTG93ZXJDYXNlID0gKGFkYXB0ZXIuZ2V0VGFnTmFtZUNhc2UoKSA9PSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0UpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0KLQkJaW50IGxlbmd0aCA9IGZIVE1MVGFncy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB0YWdUZXh0ID0gZkhUTUxUYWdzW2ldOwotCQkJaWYgKGJMb3dlckNhc2UpIHsKLQkJCQl0YWdUZXh0ID0gdGFnVGV4dC50b0xvd2VyQ2FzZSgpOwotCQkJfQotCQkJaWYgKCFpc01hdGNoKHRhZ1RleHQpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWludCBjdXJzb3JQb3MgPSAwOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJ1Zi5hcHBlbmQodGFnVGV4dCk7Ci0JCQljdXJzb3JQb3MgKz0gdGFnVGV4dC5sZW5ndGgoKTsKLQkJCWJvb2xlYW4gaW5SdWxlID0gKGZDb250ZXh0LmdldFRhcmdldE5vZGUoKSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpOwotCQkJaWYgKCFpblJ1bGUgfHwgZkNvbnRleHQuZ2V0VGV4dFRvUmVwbGFjZSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQkJCWN1cnNvclBvcyArPSAxOwotCQkJfQotCQkJaWYgKCFpblJ1bGUpIHsKLQkJCQlTdHJpbmdBbmRPZmZzZXQgc2FvID0gZ2VuZXJhdGVCcmFjZXMoKTsKLQkJCQlidWYuYXBwZW5kKHNhby5mU3RyaW5nKTsKLQkJCQljdXJzb3JQb3MgKz0gc2FvLmZPZmZzZXQ7Ci0JCQl9Ci0KLQkJCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcoYnVmLnRvU3RyaW5nKCkpOwotCQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbihjdXJzb3JQb3MpOwotCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKHRhZ1RleHQpOwotCQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlNFTEVDVE9SX1RBRyk7Ci0JCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQkJfQotCi0JCXJldHVybiBjYW5kaWRhdGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHNldHVwSFRNTFRhZ3MoKSB7Ci0JCUNNRG9jdW1lbnQgY21kb2MgPSBIVE1MQ01Eb2N1bWVudEZhY3RvcnkuZ2V0Q01Eb2N1bWVudChDTURvY1R5cGUuSFRNTF9ET0NfVFlQRSk7Ci0JCUNNTmFtZWROb2RlTWFwIGVsZW1lbnRzID0gY21kb2MuZ2V0RWxlbWVudHMoKTsKLQkJVmVjdG9yIG5hbWVzID0gbmV3IFZlY3RvcigpOwotCQlpbnQgbkVsZW1lbnRzID0gZWxlbWVudHMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkVsZW1lbnRzOyBpKyspIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWMgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRzLml0ZW0oaSk7Ci0JCQlpZiAoaXNBdHRyRGVmaW5lZChlZGVjLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NUWUxFKSkgewotCQkJCW5hbWVzLmFkZChlZGVjLmdldEVsZW1lbnROYW1lKCkpOwotCQkJfQotCQl9Ci0JCUNvbGxlY3Rpb25zLnNvcnQobmFtZXMpOwotCQlTdHJpbmdbXSB0YWdzID0gbmV3IFN0cmluZ1tuYW1lcy5zaXplKCldOwotCQlJdGVyYXRvciBpTmFtZXMgPSBuYW1lcy5pdGVyYXRvcigpOwotCQlmb3IgKGludCBpID0gMDsgaU5hbWVzLmhhc05leHQoKTsgaSsrKSB7Ci0JCQl0YWdzW2ldID0gKFN0cmluZykgaU5hbWVzLm5leHQoKTsKLQkJfQotCQlyZXR1cm4gdGFnczsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0F0dHJEZWZpbmVkKENNRWxlbWVudERlY2xhcmF0aW9uIGVkZWMsIFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAoZWRlYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQ01OYW1lZE5vZGVNYXAgYXR0cnMgPSBlZGVjLmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJzID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRycy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGF0dHIuZ2V0QXR0ck5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmSFRNTFRhZ3MgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JQc2V1ZG9TZWxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JQc2V1ZG9TZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGFmNjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yUHNldWRvU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1TZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTU1UeXBlQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTUmVnaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotLyoqCi0gKiAgCi0gKi8KLWNsYXNzIENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yUHNldWRvU2VsZWN0b3IgZXh0ZW5kcyBDU1NQcm9wb3NhbEdlbmVyYXRvciB7Ci0KLQkvKioKLQkgKiBDU1NQcm9wb3NhbEdlbmVyYXRvckZvclBzZXVkb1NlbGVjdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICovCi0JQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JQc2V1ZG9TZWxlY3RvcihDU1NDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIGdldENhbmRpZGF0ZXMgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENhbmRpZGF0ZXMoKSB7Ci0JCUxpc3QgY2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlib29sZWFuIGhhc0xlYWRpbmdDb2xvbiA9IGNoZWNrTGVhZGluZ0NvbG9uKCk7Ci0JCVN0cmluZyB0ZXh0VG9SZXBsYWNlID0gZkNvbnRleHQuZ2V0VGV4dFRvUmVwbGFjZSgpOwotCQlpZiAoIWhhc0xlYWRpbmdDb2xvbiAmJiAwIDwgdGV4dFRvUmVwbGFjZS5sZW5ndGgoKSAmJiAhdGV4dFRvUmVwbGFjZS5lcXVhbHMoZkNvbnRleHQuZ2V0VGV4dFRvQ29tcGFyZSgpKSkgewotCQkJLy8gY3Vyc29yIHBsYWNlZCBtaWRwb2ludCBvZiB0aGUgcmVnaW9uCi0JCQlyZXR1cm4gY2FuZGlkYXRlcy5pdGVyYXRvcigpOwotCQl9Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZDb250ZXh0LmdldFRhcmdldFJlZ2lvbigpOwotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmICFDU1NSZWdpb25VdGlsLmlzU2VsZWN0b3JCZWdnaW5pbmdUeXBlKHR5cGUpKSB7Ci0JCQkJcmV0dXJuIGNhbmRpZGF0ZXMuaXRlcmF0b3IoKTsKLQkJCX0KLQkJfQotCi0JCWJvb2xlYW4gdXNlVXBwZXJDYXNlID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVI7Ci0KLQkJTGlzdCB0YWdzID0gZ2V0U2VsZWN0b3JUYWdzKCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQodGFncyk7Ci0JCUl0ZXJhdG9yIGkgPSB0YWdzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJU3RyaW5nIHRleHQgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCWlmIChoYXNMZWFkaW5nQ29sb24gJiYgIWlzTWF0Y2godGV4dCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXRleHQgPSAodXNlVXBwZXJDYXNlKSA/IHRleHQudG9VcHBlckNhc2UoKSA6IHRleHQudG9Mb3dlckNhc2UoKTsKLQotCQkJaW50IGN1cnNvclBvcyA9IDA7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCi0JCQlpZiAoIWhhc0xlYWRpbmdDb2xvbikKLQkJCQlidWYuYXBwZW5kKHRleHRUb1JlcGxhY2UpOwotCQkJCi0JCQlidWYuYXBwZW5kKHRleHQpOwotCQkJY3Vyc29yUG9zICs9IGJ1Zi5sZW5ndGgoKTsKLQotCQkJaWYgKDAgPCBidWYubGVuZ3RoKCkpIHsKLQkJCQlib29sZWFuIGluUnVsZSA9IChmQ29udGV4dC5nZXRUYXJnZXROb2RlKCkgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlIHx8IGZDb250ZXh0LmdldFRhcmdldE5vZGUoKSBpbnN0YW5jZW9mIElDU1NQYWdlUnVsZSk7Ci0JCQkJaWYgKCFpblJ1bGUgfHwgKHRleHRUb1JlcGxhY2UubGVuZ3RoKCkgPT0gMCAmJiAhaGFzTGVhZGluZ0NvbG9uKSkgewotCQkJCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQkJCQljdXJzb3JQb3MgKz0gMTsKLQkJCQl9Ci0JCQkJaWYgKCFpblJ1bGUpIHsKLQkJCQkJU3RyaW5nQW5kT2Zmc2V0IHNhbyA9IGdlbmVyYXRlQnJhY2VzKCk7Ci0JCQkJCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCQkJCQljdXJzb3JQb3MgKz0gc2FvLmZPZmZzZXQ7Ci0JCQkJfQotCQkJCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKGJ1Zi50b1N0cmluZygpKTsKLQkJCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvcyk7Ci0JCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKHRleHQpOwotCQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5TRUxFQ1RPUl9QU0VVRE8pOwotCQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNhbmRpZGF0ZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JTGlzdCBnZXRTZWxlY3RvclRhZ3MoKSB7Ci0JCUxpc3QgdGFnTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUNTU05vZGUgdGFyZ2V0Tm9kZSA9IGZDb250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJU3RyaW5nIHJvb3RUeXBlID0gKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUGFnZVJ1bGUpID8gQ1NTTU1Ob2RlLlRZUEVfUEFHRV9SVUxFIDogQ1NTTU1Ob2RlLlRZUEVfU1RZTEVfUlVMRTsKLQotCQlDU1NNTVR5cGVDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IENTU01NVHlwZUNvbGxlY3RvcigpOwotCQljb2xsZWN0b3IuY29sbGVjdE5lc3RlZFR5cGUoZmFsc2UpOwotCQljb2xsZWN0b3IuYXBwbHkoZkNvbnRleHQuZ2V0TWV0YU1vZGVsKCksIHJvb3RUeXBlKTsKLQkJSXRlcmF0b3IgaTsKLQkJaSA9IGNvbGxlY3Rvci5nZXROb2RlcygpOwotCQlpZiAoIWkuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gdGFnTGlzdDsKLQkJfQotCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGkubmV4dCgpOwotCQlpID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIGNoaWxkID0gKENTU01NTm9kZSkgaS5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX1NFTEVDVE9SKSB7Ci0JCQkJU3RyaW5nIHNlbFR5cGUgPSAoKENTU01NU2VsZWN0b3IpIGNoaWxkKS5nZXRTZWxlY3RvclR5cGUoKTsKLQkJCQlpZiAoc2VsVHlwZSA9PSBDU1NNTVNlbGVjdG9yLlRZUEVfUFNFVURPX0NMQVNTIHx8IHNlbFR5cGUgPT0gQ1NTTU1TZWxlY3Rvci5UWVBFX1BTRVVET19FTEVNRU5UKSB7Ci0JCQkJCXRhZ0xpc3QuYWRkKCgoQ1NTTU1TZWxlY3RvcikgY2hpbGQpLmdldFNlbGVjdG9yU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdGFnTGlzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzN2VkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5TdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQotLyoqCi0gKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3J9IGZvciBDU1MgZG9jdW1lbnRzPC9wPgotICogCi0gKiA8cD5DdXJyZW50bHkgdGhlIENTUyBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3IgZG9lcyBub3QgZG8gYW55dGhpbmcgZGlmZmVyZW50IHRoZW4KLSAqIHRoZSB7QGxpbmsgU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3J9IGJ1dCBhdCBzb21lIHBvaW50IGl0IG1heSBoYXZlIHRvCi0gKiByZWFjdCB0byB1c2VyIHByZWZlcmVuY2UgY2hhbmdlczwvcD4KLSAqIAotICogQHNlZSBTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvcgotICovCi1wdWJsaWMgY2xhc3MgQ1NTU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZXh0ZW5kcyBTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0JLyoqCi0JICogPHA+Q29uc3RydWN0b3I8L3A+Ci0JICogCi0JICogQHBhcmFtIGFzc2lzdGFudCB7QGxpbmsgQ29udGVudEFzc2lzdGFudH0gdG8gdXNlCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGVJRCB0aGUgcGFydGl0aW9uIHR5cGUgdGhpcyBwcm9jZXNzb3IgaXMgZm9yCi0JICogQHBhcmFtIHZpZXdlciB7QGxpbmsgSVRleHRWaWV3ZXJ9IHRoaXMgcHJvY2Vzc29yIGlzIGFjdGluZyBpbgotCSAqLwotCXB1YmxpYyBDU1NTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvcihDb250ZW50QXNzaXN0YW50IGFzc2lzdGFudCwKLQkJCVN0cmluZyBwYXJ0aXRpb25UeXBlSUQsIElUZXh0Vmlld2VyIHZpZXdlcikgewotCQkKLQkJc3VwZXIoYXNzaXN0YW50LCBwYXJ0aXRpb25UeXBlSUQsIHZpZXdlciwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwNWJkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3IuQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VIZWxwZXI7Ci0KLQotLyoqCi0gKiBDb21wbGV0aW9uIHByb2Nlc3NvciBmb3IgQ1NTIFRlbXBsYXRlcy4gTW9zdCBvZiB0aGUgd29yayBpcyBhbHJlYWR5IGRvbmUKLSAqIGJ5IHRoZSBDU1MgQ29udGVudCBBc3Npc3QgcHJvY2Vzc29yLCBzbyBieSB0aGUgdGltZSB0aGUKLSAqIENTU1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBpcyBhc2tlZCBmb3IgY29udGVudCBhc3Npc3QgcHJvcG9zYWxzLCB0aGUKLSAqIENTUyBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3IgaGFzIGFscmVhZHkgc2V0IHRoZSBjb250ZXh0IHR5cGUgZm9yCi0gKiB0ZW1wbGF0ZXMuCi0gKi8KLWNsYXNzIENTU1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBleHRlbmRzIFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNvbnRleHRUeXBlSWQgPSBudWxsOwotCi0JcHJvdGVjdGVkIFRlbXBsYXRlQ29udGV4dFR5cGUgZ2V0Q29udGV4dFR5cGUoSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIHJlZ2lvbikgewotCQlUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUgPSBudWxsOwotCi0JCUNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpOwotCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkKLQkJCXR5cGUgPSByZWdpc3RyeS5nZXRDb250ZXh0VHlwZShmQ29udGV4dFR5cGVJZCk7Ci0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKFRlbXBsYXRlIHRlbXBsYXRlKSB7Ci0JCS8vIGp1c3QgcmV0dXJuIHRoZSBzYW1lIGltYWdlIGZvciBub3cKLQkJcmV0dXJuIENTU0ltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEVNUExBVEUpOwotCX0KLQotCXByaXZhdGUgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpOwotCX0KLQotCXByb3RlY3RlZCBUZW1wbGF0ZVtdIGdldFRlbXBsYXRlcyhTdHJpbmcgY29udGV4dFR5cGVJZCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZXNbXSA9IG51bGw7Ci0KLQkJVGVtcGxhdGVTdG9yZSBzdG9yZSA9IGdldFRlbXBsYXRlU3RvcmUoKTsKLQkJaWYgKHN0b3JlICE9IG51bGwpCi0JCQl0ZW1wbGF0ZXMgPSBzdG9yZS5nZXRUZW1wbGF0ZXMoY29udGV4dFR5cGVJZCk7Ci0KLQkJcmV0dXJuIHRlbXBsYXRlczsKLQl9Ci0KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJcmV0dXJuIENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JfQotCi0Jdm9pZCBzZXRDb250ZXh0VHlwZShTdHJpbmcgY29udGV4dFR5cGVJZCkgewotCQlmQ29udGV4dFR5cGVJZCA9IGNvbnRleHRUeXBlSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTVGVtcGxhdGVzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1RlbXBsYXRlc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNThkYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTVGVtcGxhdGVzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLQotLyoqCi0gKiA8cD5Db21wbGV0aW9uIGNvbXB1dGVyIGZvciBDU1MgdGVtcGxhdGVzPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ1NTVGVtcGxhdGVzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgaW1wbGVtZW50cyBJQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgewotCS8qKiA8cD5UaGUgdGVtcGxhdGUgcHJvY2Vzc29yIHVzZWQgdG8gY3JlYXRlIHRoZSBwcm9wb3NhbHM8L3A+ICovCi0JcHJpdmF0ZSBDU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZlRlbXBsYXRlUHJvY2Vzc29yID0gbnVsbDsKLQkKLQkvKioKLQkgKiA8cD5DcmVhdGUgdGhlIGNvbXB1dGVyPC9wPgotCSAqLwotCXB1YmxpYyBDU1NUZW1wbGF0ZXNDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcigpIHsKLQkJZlRlbXBsYXRlUHJvY2Vzc29yID0gbmV3IENTU1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBMaXN0IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkKLQkJTGlzdCBwcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlib29sZWFuIGlzRW1wdHlEb2N1bWVudCA9Ci0JCQlDb250ZW50QXNzaXN0VXRpbHMuaXNWaWV3ZXJFbXB0eShjb250ZXh0LmdldFZpZXdlcigpKTsKLQkJaWYgKGlzRW1wdHlEb2N1bWVudCkgewotCQkJcHJvcG9zYWxzLmFkZEFsbChnZXRUZW1wbGF0ZXMoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0NTUy5ORVcsIGNvbnRleHQpKTsKLQkJfQotCQlwcm9wb3NhbHMuYWRkQWxsKGdldFRlbXBsYXRlcyhUZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTLkFMTCwgY29udGV4dCkpOwotCQkKLQkJCi0JCXJldHVybiBwcm9wb3NhbHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNnZXRFcnJvck1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjc2Vzc2lvblN0YXJ0ZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlc3Npb25TdGFydGVkKCkgewotCQkvL2RlZmF1bHQgaXMgdG8gZG8gbm90aGluZwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjc2Vzc2lvbkVuZGVkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXNzaW9uRW5kZWQoKSB7Ci0JCS8vZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0JfQotCQotCi0JLyoqCi0JICogPHA+R2V0cyB0ZW1wbGF0ZSBwcm9wb3NhbHMgZm9yIHRoZSBnaXZlbiB0ZW1wbGF0ZSBhbmQgcHJvcG9zYWwgY29udGV4dHM8L3A+Ci0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlQ29udGV4dCB0aGUgdGVtcGxhdGUgY29udGV4dAotCSAqIEBwYXJhbSBjb250ZXh0IHRoZSBwcm9wb3NhbCBjb250ZXh0Ci0JICogQHJldHVybiB7QGxpbmsgTGlzdH0gb2YgdGVtcGxhdGUgcHJvcG9zYWxzIGZvciB0aGUgZ2l2ZW4gY29udGV4dHMKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VGVtcGxhdGVzKFN0cmluZyB0ZW1wbGF0ZUNvbnRleHQsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCi0JCWZUZW1wbGF0ZVByb2Nlc3Nvci5zZXRDb250ZXh0VHlwZSh0ZW1wbGF0ZUNvbnRleHQpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZlRlbXBsYXRlUHJvY2Vzc29yLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKAotCQkJCWNvbnRleHQuZ2V0Vmlld2VyKCksIGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpKTsKLQkJCi0JCXJldHVybiBBcnJheXMuYXNMaXN0KHByb3Bvc2Fscyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MNDBOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUw0ME5hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGMwZTMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUw0ME5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi0vKioKLSAqIFByb3ZpZGUgYWxsIG5hbWVzIGRlZmluZWQgaW4gdGhlIEhUTUwgNC4wPyBzcGVjaWZpY2F0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUw0ME5hbWVzcGFjZSB7Ci0KLQkvLyBFbGVtZW50IG5hbWVzCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRWxlbWVudE5hbWUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBID0gIkEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQlIgPSAiQUJCUiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNST05ZTSA9ICJBQ1JPTllNIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERSRVNTID0gIkFERFJFU1MiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExFVCA9ICJBUFBMRVQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSRUEgPSAiQVJFQSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQiA9ICJCIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFID0gIkJBU0UiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VGT05UID0gIkJBU0VGT05UIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRE8gPSAiQkRPIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCR1NPVU5EID0gIkJHU09VTkQiOyAvLyBEMjA1NTEzCi0JCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklHID0gIkJJRyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxJTksgPSAiQkxJTksiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJMT0NLUVVPVEUgPSAiQkxPQ0tRVU9URSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9EWSA9ICJCT0RZIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUiA9ICJCUiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVUVE9OID0gIkJVVFRPTiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQVElPTiA9ICJDQVBUSU9OIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRU5URVIgPSAiQ0VOVEVSIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSVRFID0gIkNJVEUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPREUgPSAiQ09ERSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MID0gIkNPTCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MR1JPVVAgPSAiQ09MR1JPVVAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEREID0gIkREIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUwgPSAiREVMIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERk4gPSAiREZOIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVIgPSAiRElSIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVYgPSAiRElWIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBETCA9ICJETCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFQgPSAiRFQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNID0gIkVNIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRCA9ICJFTUJFRCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERTRVQgPSAiRklFTERTRVQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTlQgPSAiRk9OVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STSA9ICJGT1JNIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFNRSA9ICJGUkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBTUVTRVQgPSAiRlJBTUVTRVQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEgxID0gIkgxIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIMiA9ICJIMiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDMgPSAiSDMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEg0ID0gIkg0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBINSA9ICJINSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDYgPSAiSDYiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQUQgPSAiSEVBRCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFIgPSAiSFIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUwgPSAiSFRNTCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSSA9ICJJIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRlJBTUUgPSAiSUZSQU1FIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUcgPSAiSU1HIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVCA9ICJJTlBVVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TID0gIklOUyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNJTkRFWCA9ICJJU0lOREVYIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLQkQgPSAiS0JEIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJMQUJFTCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHRU5EID0gIkxFR0VORCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEkgPSAiTEkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTksgPSAiTElOSyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQID0gIk1BUCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVOVSA9ICJNRU5VIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBID0gIk1FVEEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PQlIgPSAiTk9CUiI7IC8vIEQyMDU1MTMgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0VNQkVEID0gIk5PRU1CRUQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PRlJBTUVTID0gIk5PRlJBTUVTIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1NDUklQVCA9ICJOT1NDUklQVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUID0gIk9CSkVDVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0wgPSAiT0wiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVEdST1VQID0gIk9QVEdST1VQIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT04gPSAiT1BUSU9OIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQID0gIlAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNID0gIlBBUkFNIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkUgPSAiUFJFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRID0gIlEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFMgPSAiUyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FNUCA9ICJTQU1QIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFQgPSAiU0NSSVBUIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1QgPSAiU0VMRUNUIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTTUFMTCA9ICJTTUFMTCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBTiA9ICJTUEFOIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJS0UgPSAiU1RSSUtFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJPTkcgPSAiU1RST05HIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFlMRSA9ICJTVFlMRSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCID0gIlNVQiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQID0gIlNVUCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEUgPSAiVEFCTEUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRCT0RZID0gIlRCT0RZIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURCA9ICJURCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVEFSRUEgPSAiVEVYVEFSRUEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRGT09UID0gIlRGT09UIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSCA9ICJUSCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhFQUQgPSAiVEhFQUQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gIlRJVExFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUiA9ICJUUiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFQgPSAiVFQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFUgPSAiVSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUwgPSAiVUwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUiA9ICJWQVIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdCUiA9ICJXQlIiOyAvLyBEMjA1NTEzIC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSUVVFRSA9ICJNQVJRVUVFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfQ09ORklHID0gIlNTSTpDT05GSUciOyAvLyBEMjEwMzkzCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0VDSE8gPSAiU1NJOkVDSE8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9FWEVDID0gIlNTSTpFWEVDIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfRlNJWkUgPSAiU1NJOkZTSVpFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfRkxBU1RNT0QgPSAiU1NJOkZMQVNUTU9EIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfSU5DTFVERSA9ICJTU0k6SU5DTFVERSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX1BSSU5URU5WID0gIlNTSTpQUklOVEVOViI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX1NFVCA9ICJTU0k6U0VUIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfV01MID0gIndtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0NBUkQgPSAiY2FyZCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX1RFTVBMQVRFID0gInRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQUNDRVNTID0gImFjY2VzcyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0RPID0gImRvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfT05FVkVOVCA9ICJvbmV2ZW50IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfVElNRVIgPSAidGltZXIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BTkNIT1IgPSAiYW5jaG9yIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfUFJFViA9ICJwcmV2IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfUkVGUkVTSCA9ICJyZWZyZXNoIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfR08gPSAiZ28iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9OT09QID0gIm5vb3AiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9TRVRWQVIgPSAic2V0dmFyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfUE9TVEZJRUxEID0gInBvc3RmaWVsZCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBDaGFyYWN0ZXIgRW50aXRpZXMKLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFbnRpdHlOYW1lIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUFDVVRFX1UgPSAiQWFjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQUNVVEVfTCA9ICJhYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDSVJDX1UgPSAiQWNpcmMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDSVJDX0wgPSAiYWNpcmMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVVRFID0gImFjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRUxJR19VID0gIkFFbGlnIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRUxJR19MID0gImFlbGlnIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBR1JBVkVfVSA9ICJBZ3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFHUkFWRV9MID0gImFncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxFRlNZTSA9ICJhbGVmc3ltIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTFBIQV9VID0gIkFscGhhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTFBIQV9MID0gImFscGhhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTVAgPSAiYW1wIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTkQgPSAiYW5kIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTkcgPSAiYW5nIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUklOR19VID0gIkFyaW5nIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUklOR19MID0gImFyaW5nIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1lNUCA9ICJhc3ltcCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRJTERFX1UgPSAiQXRpbGRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVElMREVfTCA9ICJhdGlsZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVTUxfVSA9ICJBdW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVU1MX0wgPSAiYXVtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkRRVU8gPSAiYmRxdW8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFVEFfVSA9ICJCZXRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRVRBX0wgPSAiYmV0YSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJWQkFSID0gImJydmJhciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVMTCA9ICJidWxsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVAgPSAiY2FwIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQ0VESUxfVSA9ICJDY2VkaWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENDRURJTF9MID0gImNjZWRpbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0VESUwgPSAiY2VkaWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENFTlQgPSAiY2VudCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hJX1UgPSAiQ2hpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSElfTCA9ICJjaGkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENJUkMgPSAiY2lyYyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xVQlMgPSAiY2x1YnMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkcgPSAiY29uZyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWSA9ICJjb3B5IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkFSUiA9ICJjcmFyciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VQID0gImN1cCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSUkVOID0gImN1cnJlbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFHR0VSX1UgPSAiRGFnZ2VyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQUdHRVJfTCA9ICJkYWdnZXIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBUlJfVSA9ICJkQXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVJSX0wgPSAiZGFyciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVHID0gImRlZyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMVEFfVSA9ICJEZWx0YSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMVEFfTCA9ICJkZWx0YSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTVMgPSAiZGlhbXMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJVklERSA9ICJkaXZpZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBQ1VURV9VID0gIkVhY3V0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFDVVRFX0wgPSAiZWFjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0lSQ19VID0gIkVjaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0lSQ19MID0gImVjaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFR1JBVkVfVSA9ICJFZ3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVHUkFWRV9MID0gImVncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFkgPSAiZW1wdHkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNU1AgPSAiZW1zcCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5TUCA9ICJlbnNwIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUFNJTE9OX1UgPSAiRXBzaWxvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVBTSUxPTl9MID0gImVwc2lsb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVRVUlWID0gImVxdWl2IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVEFfVSA9ICJFdGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVUQV9MID0gImV0YSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVRIX1UgPSAiRVRIIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVEhfTCA9ICJldGgiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVVTUxfVSA9ICJFdW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVU1MX0wgPSAiZXVtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVVSTyA9ICJldXJvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWElTVCA9ICJleGlzdCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk5PRiA9ICJmbm9mIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JBTEwgPSAiZm9yYWxsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFDMTIgPSAiZnJhYzEyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFDMTQgPSAiZnJhYzE0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFDMzQgPSAiZnJhYzM0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFTTCA9ICJmcmFzbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0FNTUFfVSA9ICJHYW1tYSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0FNTUFfTCA9ICJnYW1tYSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0UgPSAiZ2UiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdUID0gImd0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQVJSX1UgPSAiaEFyciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFSUl9MID0gImhhcnIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQVJUUyA9ICJoZWFydHMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFTExJUCA9ICJoZWxsaXAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElBQ1VURV9VID0gIklhY3V0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUFDVVRFX0wgPSAiaWFjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ0lSQ19VID0gIkljaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ0lSQ19MID0gImljaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRVhDTCA9ICJpZXhjbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUdSQVZFX1UgPSAiSWdyYXZlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJR1JBVkVfTCA9ICJpZ3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFID0gImltYWdlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZJTiA9ICJpbmZpbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5UID0gImludCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU9UQV9VID0gIklvdGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElPVEFfTCA9ICJpb3RhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJUVVFU1QgPSAiaXF1ZXN0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU0lOID0gImlzaW4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElVTUxfVSA9ICJJdW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVU1MX0wgPSAiaXVtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0FQUEFfVSA9ICJLYXBwYSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0FQUEFfTCA9ICJrYXBwYSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFNQkRBX1UgPSAiTGFtYmRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQU1CREFfTCA9ICJsYW1iZGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBTkcgPSAibGFuZyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFRVU8gPSAibGFxdW8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBUlJfVSA9ICJsQXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVJSX0wgPSAibGFyciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTENFSUwgPSAibGNlaWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExEUVVPID0gImxkcXVvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRSA9ICJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEZMT09SID0gImxmbG9vciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9XQVNUID0gImxvd2FzdCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9aID0gImxveiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFJNID0gImxybSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFNBUVVPID0gImxzYXF1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFNRVU8gPSAibHNxdW8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExUID0gImx0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQUNSID0gIm1hY3IiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1EQVNIID0gIm1kYXNoIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSUNSTyA9ICJtaWNybyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlERE9UID0gIm1pZGRvdCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOVVMgPSAibWludXMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VX1UgPSAiTXUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VX0wgPSAibXUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BQkxBID0gIm5hYmxhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQlNQID0gIm5ic3AiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5EQVNIID0gIm5kYXNoIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORSA9ICJuZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkkgPSAibmkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVCA9ICJub3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElOID0gIm5vdGluIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU1VCID0gIm5zdWIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5USUxERV9VID0gIk50aWxkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlRJTERFX0wgPSAibnRpbGRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVV9VID0gIk51IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVV9MID0gIm51IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQUNVVEVfVSA9ICJPYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9BQ1VURV9MID0gIm9hY3V0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0NJUkNfVSA9ICJPY2lyYyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0NJUkNfTCA9ICJvY2lyYyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0VMSUdfVSA9ICJPRWxpZyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0VMSUdfTCA9ICJvZWxpZyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0dSQVZFX1UgPSAiT2dyYXZlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPR1JBVkVfTCA9ICJvZ3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9MSU5FID0gIm9saW5lIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTUVHQV9VID0gIk9tZWdhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTUVHQV9MID0gIm9tZWdhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTUlDUk9OX1UgPSAiT21pY3JvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT01JQ1JPTl9MID0gIm9taWNyb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QTFVTID0gIm9wbHVzIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUiA9ICJvciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERiA9ICJvcmRmIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRNID0gIm9yZG0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9TTEFTSF9VID0gIk9zbGFzaCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NMQVNIX0wgPSAib3NsYXNoIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVElMREVfVSA9ICJPdGlsZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9USUxERV9MID0gIm90aWxkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1RJTUVTID0gIm90aW1lcyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VNTF9VID0gIk91bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VTUxfTCA9ICJvdW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBID0gInBhcmEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlQgPSAicGFydCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSTUlMID0gInBlcm1pbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSUCA9ICJwZXJwIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSElfVSA9ICJQaGkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBISV9MID0gInBoaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfVSA9ICJQaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfTCA9ICJwaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElWID0gInBpdiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVU01OID0gInBsdXNtbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9VTkQgPSAicG91bmQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1FX1UgPSAiUHJpbWUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1FX0wgPSAicHJpbWUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0QgPSAicHJvZCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUCA9ICJwcm9wIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQU0lfVSA9ICJQc2kiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBTSV9MID0gInBzaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVPVCA9ICJxdW90IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQURJQyA9ICJyYWRpYyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFORyA9ICJyYW5nIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQVFVTyA9ICJyYXF1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFSUl9VID0gInJBcnIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBUlJfTCA9ICJyYXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQ0VJTCA9ICJyY2VpbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkRRVU8gPSAicmRxdW8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQUwgPSAicmVhbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHID0gInJlZyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkZMT09SID0gInJmbG9vciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkhPX1UgPSAiUmhvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSSE9fTCA9ICJyaG8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJMTSA9ICJybG0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJTQVFVTyA9ICJyc2FxdW8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJTUVVPID0gInJzcXVvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQlFVTyA9ICJzYnF1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NBUk9OX1UgPSAiU2Nhcm9uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FST05fTCA9ICJzY2Fyb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNET1QgPSAic2RvdCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDVCA9ICJzZWN0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSFkgPSAic2h5IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdNQV9VID0gIlNpZ21hIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdNQV9MID0gInNpZ21hIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdNQUYgPSAic2lnbWFmIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSU0gPSAic2ltIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFERVMgPSAic3BhZGVzIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUIgPSAic3ViIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJFID0gInN1YmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVTSA9ICJzdW0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUCA9ICJzdXAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUDEgPSAic3VwMSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQMiA9ICJzdXAyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVAzID0gInN1cDMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUEUgPSAic3VwZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1pMSUcgPSAic3psaWciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBVV9VID0gIlRhdSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFVX0wgPSAidGF1IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVSRTQgPSAidGhlcmU0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVUQV9VID0gIlRoZXRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVUQV9MID0gInRoZXRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVUQVNZTSA9ICJ0aGV0YXN5bSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhJTlNQID0gInRoaW5zcCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhPUk5fVSA9ICJUSE9STiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhPUk5fTCA9ICJ0aG9ybiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElMREUgPSAidGlsZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVTID0gInRpbWVzIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFERSA9ICJ0cmFkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUFDVVRFX1UgPSAiVWFjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVQUNVVEVfTCA9ICJ1YWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVBUlJfVSA9ICJ1QXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVQVJSX0wgPSAidWFyciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUNJUkNfVSA9ICJVY2lyYyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUNJUkNfTCA9ICJ1Y2lyYyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUdSQVZFX1UgPSAiVWdyYXZlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVR1JBVkVfTCA9ICJ1Z3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNTCA9ICJ1bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVQU0lIID0gInVwc2loIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUFNJTE9OX1UgPSAiVXBzaWxvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBTSUxPTl9MID0gInVwc2lsb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVVTUxfVSA9ICJVdW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVVU1MX0wgPSAidXVtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VJRVJQID0gIndlaWVycCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWElfVSA9ICJYaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWElfTCA9ICJ4aSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUFDVVRFX1UgPSAiWWFjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZQUNVVEVfTCA9ICJ5YWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlFTiA9ICJ5ZW4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlVTUxfVSA9ICJZdW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZVU1MX0wgPSAieXVtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVUQV9VID0gIlpldGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpFVEFfTCA9ICJ6ZXRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaV0ogPSAiendqIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaV05KID0gInp3bmoiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTDQwX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2ZyYW1lc2V0LmR0ZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MNDBfVEFHX1BSRUZJWCA9ICIiOyAvLyROT04tTkxTLTEkCi0JLy8gZ2xvYmFsIGF0dHJpYnV0ZSBuYW1lcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JRCA9ICJpZCI7IC8vICVjb3JlYXR0cnM7Ci0JCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTEFTUyA9ICJjbGFzcyI7IC8vICVjb3JlYXR0cnM7Ci0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TVFlMRSA9ICJzdHlsZSI7IC8vICVjb3JlYXR0cnM7Ci0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9USVRMRSA9ICJ0aXRsZSI7IC8vICVjb3JlYXR0cnM7Ci0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9MQU5HID0gImxhbmciOyAvLyAlaTE4bjsKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9ESVIgPSAiZGlyIjsgLy8gJWkxOG47IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05DTElDSyA9ICJvbmNsaWNrIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTkRCTENMSUNLID0gIm9uZGJsY2xpY2siOyAvLyAlZXZlbnRzOwotCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OTU9VU0VET1dOID0gIm9ubW91c2Vkb3duIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OTU9VU0VVUCA9ICJvbm1vdXNldXAiOyAvLyAlZXZlbnRzOwotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTk1PVVNFT1ZFUiA9ICJvbm1vdXNlb3ZlciI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTk1PVVNFTU9WRSA9ICJvbm1vdXNlbW92ZSI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTk1PVVNFT1VUID0gIm9ubW91c2VvdXQiOyAvLyAlZXZlbnRzOwotCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OS0VZUFJFU1MgPSAib25rZXlwcmVzcyI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05LRVlET1dOID0gIm9ua2V5ZG93biI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OS0VZVVAgPSAib25rZXl1cCI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05IRUxQID0gIm9uaGVscCI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0JHQ09MT1IgPSAiYmdjb2xvciI7IC8vICVib2R5Y29sb3I7LAotCQkJCQkJCQkJCQkJCQkJICAvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RFWFQgPSAidGV4dCI7IC8vICVib2R5Y29sb3I7Ci0JCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTElOSyA9ICJsaW5rIjsgLy8gJWJvZHljb2xvcjsKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WTElOSyA9ICJ2bGluayI7IC8vICVib2R5Y29sb3I7Ci0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BTElOSyA9ICJhbGluayI7IC8vICVib2R5Y29sb3I7Ci0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WRVJTSU9OID0gInZlcnNpb24iOyAvLyBIVE1MCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUFJPRklMRSA9ICJwcm9maWxlIjsgLy8gSEVBRAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OTE9BRCA9ICJvbmxvYWQiOyAvLyBCT0RZCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OVU5MT0FEID0gIm9udW5sb2FkIjsgLy8gQk9EWQotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQkFDS0dST1VORCA9ICJiYWNrZ3JvdW5kIjsgLy8gQk9EWSwKLQkJCQkJCQkJCQkJCQkJCQkJLy8gVEFCTEUKLQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TUkMgPSAic3JjIjsgLy8gSU1HIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUxUID0gImFsdCI7IC8vIElNRyxBUkVBCi0JCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0xPTkdERVNDID0gImxvbmdkZXNjIjsgLy8gSU1HCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OQU1FID0gIm5hbWUiOyAvLyBJTUcgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9IRUlHSFQgPSAiaGVpZ2h0IjsgLy8gSU1HLCBUQUJMRQotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9XSURUSCA9ICJ3aWR0aCI7IC8vIElNRywgVEFCTEUsSFIKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1VTRU1BUCA9ICJ1c2VtYXAiOyAvLyBJTUcKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSVNNQVAgPSAiaXNtYXAiOyAvLyBJTUcgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BTElHTiA9ICJhbGlnbiI7IC8vIElNRywgVEFCTEUsSFIKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0JPUkRFUiA9ICJib3JkZXIiOyAvLyBJTUcsIFRBQkxFCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hTUEFDRSA9ICJoc3BhY2UiOyAvLyBJTUcKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVlNQQUNFID0gInZzcGFjZSI7IC8vIElNRwotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NQVBGSUxFID0gIm1hcGZpbGUiOyAvLyBJTUcKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TVU1NQVJZID0gInN1bW1hcnkiOyAvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0ZSQU1FID0gImZyYW1lIjsgLy8gVEFCTEUKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JVTEVTID0gInJ1bGVzIjsgLy8gVEFCTEUKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NFTExTUEFDSU5HID0gImNlbGxzcGFjaW5nIjsgLy8gVEFCTEUKLQkJCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NFTExQQURESU5HID0gImNlbGxwYWRkaW5nIjsgLy8gVEFCTEUKLQkJCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RBVEFQQUdFU0laRSA9ICJkYXRhcGFnZXNpemUiOyAvLyBUQUJMRSxIUgotCQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT0xPUiA9ICJjb2xvciI7IC8vIEJBU0VGT05ULEZPTlQKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0ZBQ0UgPSAiZmFjZSI7IC8vIEJBU0VGT05ULEZPTlQKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TSVpFID0gInNpemUiOyAvLyBCQVNFRk9OVCxGT05UCi0JCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0xFQVIgPSAiY2xlYXIiOyAvLyBCUiAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NIQVBFID0gInNoYXBlIjsgLy8gQVJFQQotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09PUkRTID0gImNvb3JkcyI7IC8vIEFSRUEKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFJFRiA9ICJocmVmIjsgLy8gQVJFQSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RBUkdFVCA9ICJ0YXJnZXQiOyAvLyBBUkVBCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05PSFJFRiA9ICJub2hyZWYiOyAvLyBBUkVBCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RBQklOREVYID0gInRhYmluZGV4IjsgLy8gQVJFQQotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUNDRVNTS0VZID0gImFjY2Vzc2tleSI7IC8vIEFSRUEKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05GT0NVUyA9ICJvbmZvY3VzIjsgLy8gQVJFQQotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OQkxVUiA9ICJvbmJsdXIiOyAvLyBBUkVBCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NIQVJTRVQgPSAiY2hhcnNldCI7IC8vIExJTksKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9IUkVGTEFORyA9ICJocmVmbGFuZyI7IC8vIExJTksKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RZUEUgPSAidHlwZSI7IC8vIExJTksgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9SRUwgPSAicmVsIjsgLy8gTElOSyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JFViA9ICJyZXYiOyAvLyBMSU5LIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTUVESUEgPSAibWVkaWEiOyAvLyBMSU5LCi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WQUxVRSA9ICJ2YWx1ZSI7IC8vIFBBUkFNCi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WQUxVRVRZUEUgPSAidmFsdWV0eXBlIjsgLy8gUEFSQU0KLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTk9TSEFERSA9ICJub3NoYWRlIjsgLy8gSFIKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DSEVDS0VEID0gImNoZWNrZWQiOyAvLyBJTlBVVAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RJU0FCTEVEID0gImRpc2FibGVkIjsgLy8gSU5QVVQKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JFQURPTkxZID0gInJlYWRvbmx5IjsgLy8gSU5QVVQKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX01BWExFTkdUSCA9ICJtYXhsZW5ndGgiOyAvLyBJTlBVVAotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTlNFTEVDVCA9ICJvbnNlbGVjdCI7IC8vIElOUFVUCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTkNIQU5HRSA9ICJvbmNoYW5nZSI7IC8vIElOUFVUCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BQ0NFUFQgPSAiYWNjZXB0IjsgLy8gSU5QVVQKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSVNUWUxFID0gImlzdHlsZSI7IC8vIElOUFVUCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NIQVIgPSAiY2hhciI7IC8vIENPTCAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NIQVJPRkYgPSAiY2hhcm9mZiI7IC8vIENPTAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZBTElHTiA9ICJ2YWxpZ24iOyAvLyBDT0wKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU1BBTiA9ICJzcGFuIjsgLy8gQ09MIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRlJBTUVCT1JERVIgPSAiZnJhbWVib3JkZXIiOyAvLyBGUkFNRQotCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTUFSR0lOV0lEVEggPSAibWFyZ2lud2lkdGgiOyAvLyBGUkFNRQotCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTUFSR0lOSEVJR0hUID0gIm1hcmdpbmhlaWdodCI7IC8vIEZSQU1FCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05PUkVTSVpFID0gIm5vcmVzaXplIjsgLy8gRlJBTUUKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NDUk9MTElORyA9ICJzY3JvbGxpbmciOyAvLyBGUkFNRQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QUk9NUFQgPSAicHJvbXB0IjsgLy8gSVNJTkRFWAotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9IVFRQX0VRVUlWID0gImh0dHAtZXF1aXYiOyAvLyBNRVRBCi0JCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09OVEVOVCA9ICJjb250ZW50IjsgLy8gTUVUQQotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NDSEVNRSA9ICJzY2hlbWUiOyAvLyBNRVRBCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VSUk1TRyA9ICJlcnJtc2ciOyAvLyBzc2k6Y29uZmlnCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NJWkVGTVQgPSAic2l6ZWZtdCI7IC8vIHNzaTpjb25maWcKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9USU1FRk1UID0gInRpbWVmbXQiOyAvLyBzc2k6Y29uZmlnCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkFSID0gInZhciI7IC8vIHNzaTplY2hvCi0JCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NHSSA9ICJjZ2kiOyAvLyBzc2k6ZXhlYwotCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTUQgPSAiY21kIjsgLy8gc3NpOmV4ZWMKLQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRklMRSA9ICJmaWxlIjsgLy8gc3NpOmZzaXplCi0JCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVklSVFVBTCA9ICJ2aXJ0dWFsIjsgLy8gc3NpOmZzaXplCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0VMRUNURUQgPSAic2VsZWN0ZWQiOyAvLyBPUFRJT04KLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0xBQkVMID0gImxhYmVsIjsgLy8gT1BUSU9OCi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9ST1dTID0gInJvd3MiOyAvLyBURVhUQVJFQQotCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPTFMgPSAiY29scyI7IC8vIFRFWFRBUkVBCi0JCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTEFOR1VBR0UgPSAibGFuZ3VhZ2UiOyAvLyBTQ1JJUFQKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RFRkVSID0gImRlZmVyIjsgLy8gU0NSSVBUCi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9FVkVOVCA9ICJldmVudCI7IC8vIFNDUklQVAotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRk9SID0gImZvciI7IC8vIFNDUklQVCAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPTVBBQ1QgPSAiY29tcGFjdCI7IC8vIE9ML1VMCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU1RBUlQgPSAic3RhcnQiOyAvLyBPTC9VTAotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRElSRUNUS0VZID0gImRpcmVjdGtleSI7IC8vIEEKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09ERUJBU0UgPSAiY29kZWJhc2UiOyAvLyBBUFBMRVQKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FSQ0hJVkUgPSAiYXJjaGl2ZSI7IC8vIEFQUExFVAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPREUgPSAiY29kZSI7IC8vIEFQUExFVAotCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09CSkVDVCA9ICJvYmplY3QiOyAvLyBBUFBMRVQKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTUFZU0NSSVBUID0gIm1heXNjcmlwdCI7IC8vIEFQUExFVAotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DSVRFID0gImNpdGUiOyAvLyBCTE9DS1FVT1RFCi0JCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTUFDUk8gPSAibWFjcm8iOyAvLyBEMlcgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9EQVRFVElNRSA9ICJkYXRldGltZSI7IC8vIElOUy9ERUwKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0xPT1AgPSAibG9vcCI7IC8vIEVNQkVEIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSElEREVOID0gImhpZGRlbiI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZPTFVNRSA9ICJ2b2x1bWUiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BVVRPU1RBUlQgPSAiYXV0b3N0YXJ0IjsgLy8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQVVUT1BMQVkgPSAiYXV0b3BsYXkiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQVVUT1NJWkUgPSAiYXV0b3NpemUiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09OVFJPTExFUiA9ICJjb250cm9sbGVyIjsvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0NBTEUgPSAic2NhbGUiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0hPV0NPTlRST0xTID0gInNob3djb250cm9scyI7Ly8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QTEFZQ09VTlQgPSAicGxheWNvdW50IjsgLy8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUkVQRUFUID0gInJlcGVhdCI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BBTkVMID0gInBhbmVsIjsgLy8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BBTEVUVEUgPSAicGFsZXR0ZSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVEVYVEZPQ1VTID0gInRleHRmb2N1cyI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FDVElPTiA9ICJhY3Rpb24iOyAvLyBGT1JNCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX01FVEhPRCA9ICJtZXRob2QiOyAvLyBGT1JNCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VOQ1RZUEUgPSAiZW5jdHlwZSI7IC8vIEZPUk0KLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTlNVQk1JVCA9ICJvbnN1Ym1pdCI7IC8vIEZPUk0KLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OUkVTRVQgPSAib25yZXNldCI7IC8vIEZPUk0KLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BQ0NFUFRfQ0hBUlNFVCA9ICJhY2NlcHQtY2hhcnNldCI7Ly8gRk9STQotCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9CRUhBVklPUiA9ICJiZWhhdmlvciI7IC8vIE1BUlFVRUUKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RJUkVDVElPTiA9ICJkaXJlY3Rpb24iOyAvLyBNQVJRVUVFCi0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NDUk9MTEFNT1VOVCA9ICJzY3JvbGxhbW91bnQiOy8vIE1BUlFVRUUKLQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TQ1JPTExERUxBWSA9ICJzY3JvbGxkZWxheSI7Ly8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9UUlVFU1BFRUQgPSAidHJ1ZXNwZWVkIjsgLy8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9ERUNMQVJFID0gImRlY2xhcmUiOyAvLyBPQkpFQ1QKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTEFTU0lEID0gImNsYXNzaWQiOyAvLyBPQkpFQ1QKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9EQVRBID0gImRhdGEiOyAvLyBPQkpFQ1QKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT0RFVFlQRSA9ICJjb2RldHlwZSI7IC8vIE9CSkVDVAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU1RBTkRCWSA9ICJzdGFuZGJ5IjsgLy8gT0JKRUNUCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTVVMVElQTEUgPSAibXVsdGlwbGUiOyAvLyBTRUxFQ1QKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FCQlIgPSAiYWJiciI7IC8vIFRIL1REIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQVhJUyA9ICJheGlzIjsgLy8gVEgvVEQgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9IRUFERVJTID0gImhlYWRlcnMiOyAvLyBUSC9URAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NDT1BFID0gInNjb3BlIjsgLy8gVEgvVEQKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JPV1NQQU4gPSAicm93c3BhbiI7IC8vIFRIL1RECi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09MU1BBTiA9ICJjb2xzcGFuIjsgLy8gVEgvVEQKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OT1dSQVAgPSAibm93cmFwIjsgLy8gVEgvVEQKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkvLyA8PEQyMDU1MTQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVE9QTUFSR0lOID0gInRvcG1hcmdpbiI7IC8vIEJPRFkKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQk9UVE9NTUFSR0lOID0gImJvdHRvbW1hcmdpbiI7IC8vIEJPRFkKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTEVGVE1BUkdJTiA9ICJsZWZ0bWFyZ2luIjsgLy8gQk9EWQotCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JJR0hUTUFSR0lOID0gInJpZ2h0bWFyZ2luIjsgLy8gQk9EWQotCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQk9SREVSQ09MT1IgPSAiYm9yZGVyY29sb3IiOyAvLyBUQUJMRS9UUi9USC9URC9GUkFNRVNFVC9GUkFNRQotCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyBmb3IgV01MCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9USVRMRSA9ICJ0aXRsZSI7IC8vIGNhcmQKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfRE9NQUlOID0gImRvbWFpbiI7IC8vIGFjY2VzcwotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX1BBVEggPSAicGF0aCI7IC8vIGFjY2VzcwotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfT05FTlRFUkZPUldBUkQgPSAib25lbnRlcmZvcndhcmQiOyAvLyB0ZW1wbGF0ZSxjYXJkCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX09ORU5URVJCQUNLV0FSRCA9ICJvbmVudGVyYmFja3dhcmQiOyAvLyB0ZW1wbGF0ZSxjYXJkCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfT05QSUNLID0gIm9ucGljayI7IC8vIG9wdGlvbgotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX09OVElNRVIgPSAib250aW1lciI7IC8vIHRlbXBsYXRlLGNhcmQKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX05FV0NPTlRFWFQgPSAibmV3Y29udGV4dCI7IC8vIGNhcmQKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX09SREVSRUQgPSAib3JkZXJlZCI7IC8vIGNhcmQKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX09QVElPTkFMID0gIm9wdGlvbmFsIjsgLy8gZG8KLQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfQ0FDSEVfQ09OVFJPTCA9ICJjYWNoZS1jb250cm9sIjsgLy8gZ28KLQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX1NFTkRSRUZFUkVSID0gInNlbmRyZWZlcmVyIjsgLy8gZ28KLQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfTUVUSE9EID0gIm1ldGhvZCI7IC8vIGdvCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfRU5DVFlQRSA9ICJlbmN0eXBlIjsgLy8gZ28KLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX0FDQ0VQVF9DSEFSU0VUID0gImFjY2VwdC1jaGFyc2V0IjsgLy8gZ28KLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfQ09MVU1OUyA9ICJjb2x1bW5zIjsgLy8gdGFibGUKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyBEMjA1NTE0Ci0JLy88PEQyMTU2ODQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRlJBTUVTUEFDSU5HID0gImZyYW1lc3BhY2luZyI7IC8vIEZSQU1FU0VUCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JLy9EMjE1Njg0Ci0JLy8gZ2xvYmFsIGF0dHJpYnV0ZSB2YWx1ZXM7IG1haW5seSB1c2VkIGluIGVudW1lcmF0aW9uLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVkVSU0lPTl9UUkFOU0lUSU9OQUwgPSAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9WRVJTSU9OX0ZSQU1FU0VUID0gIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9MVFIgPSAibHRyIjsgLy8gZGlyIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JUTCA9ICJydGwiOyAvLyBkaXIgLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIGFsaWduICh0b3B8bWlkZGxlfGJvdHRvbXxsZWZ0fHJpZ2h0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVE9QID0gInRvcCI7IC8vIGFsaWduIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX01JRERMRSA9ICJtaWRkbGUiOyAvLyBhbGlnbgotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JPVFRPTSA9ICJib3R0b20iOyAvLyBhbGlnbgotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0xFRlQgPSAibGVmdCI7IC8vIGFsaWduCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DRU5URVIgPSAiY2VudGVyIjsgLy8gYWxpZ24KLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SSUdIVCA9ICJyaWdodCI7IC8vIGFsaWduCi0JCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0pVU1RJRlkgPSAianVzdGlmeSI7IC8vIGFsaWduCi0JCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DSEFSID0gImNoYXIiOyAvLyBhbGlnbgotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIHZhbGlnbiAoYmFzZWxpbmUpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CQVNFTElORSA9ICJiYXNlbGluZSI7IC8vIHZhbGlnbgotCQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgY2xlYXIgKGxlZnR8YWxsfHJpZ2h0fG5vbmUpOiBsZWZ0IGFuZCByaWdodCBhcmUgYWxyZWFkeSBkZWZpbmVkCi0JLy8gYWJvdmUuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9BTEwgPSAiYWxsIjsgLy8gY2xlYXIgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTk9ORSA9ICJub25lIjsgLy8gY2xlYXIKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBzaGFwZSAocmVjdHxjaXJjbGV8cG9seXxkZWZhdWx0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUkVDVCA9ICJyZWN0IjsgLy8gc2hhcGUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NJUkNMRSA9ICJjaXJjbGUiOyAvLyBzaGFwZQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1BPTFkgPSAicG9seSI7IC8vIHNoYXBlCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9ERUZBVUxUID0gImRlZmF1bHQiOyAvLyBzaGFwZQotCQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIHZhbHVldHlwZSAoZGF0YXxyZWZ8b2JqZWN0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfREFUQSA9ICJkYXRhIjsgLy8gdmFsdWV0eXBlCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SRUYgPSAicmVmIjsgLy8gdmFsdWV0eXBlCi0JCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfT0JKRUNUID0gIm9iamVjdCI7IC8vIHZhbHVldHlwZQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciB0eXBlIG9mIElOUFVUCi0JLy8gICAgICAgKHRleHQgfCBwYXNzd29yZCB8IGNoZWNrYm94IHwgcmFkaW8gfCBzdWJtaXQgfCByZXNldCB8Ci0JLy8gICAgICAgIGZpbGUgfCBoaWRkZW4gfCBpbWFnZSB8IGJ1dHRvbikKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1RFWFQgPSAidGV4dCI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1BBU1NXT1JEID0gInBhc3N3b3JkIjsgLy8gSU5QVVQ6dHlwZQotCQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DSEVDS0JPWCA9ICJjaGVja2JveCI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUkFESU8gPSAicmFkaW8iOyAvLyBJTlBVVDp0eXBlCi0JCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NVQk1JVCA9ICJzdWJtaXQiOyAvLyBJTlBVVDp0eXBlCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUkVTRVQgPSAicmVzZXQiOyAvLyBJTlBVVDp0eXBlCi0JCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0ZJTEUgPSAiZmlsZSI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0hJRERFTiA9ICJoaWRkZW4iOyAvLyBJTlBVVDp0eXBlCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSU1BR0UgPSAiaW1hZ2UiOyAvLyBJTlBVVDp0eXBlCi0JCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JVVFRPTiA9ICJidXR0b24iOyAvLyBJTlBVVDp0eXBlCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIHNwYW4sIGNvbHNwYW4sIHJvd3NwYW4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFXzEgPSAiMSI7IC8vIHNwYW4gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIGZyYW1lYm9yZGVyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV8wID0gIjAiOyAvLyBGUkFNRSAvLyROT04tTkxTLTEkCi0JLy8gICBmb3Igc2Nyb2xsaW5nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9ZRVMgPSAieWVzIjsgLy8gRlJBTUUgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTk8gPSAibm8iOyAvLyBGUkFNRSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9BVVRPID0gImF1dG8iOyAvLyBGUkFNRQotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIFVMCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9ESVNDID0gImRpc2MiOyAvLyBVTDp0eXBlCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9TUVVBUkUgPSAic3F1YXJlIjsgLy8gVUw6dHlwZQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBmcmFtZSBvZiBUQUJMRQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVk9JRCA9ICJ2b2lkIjsgLy8gVEFCTEU6ZnJhbWUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0FCT1ZFID0gImFib3ZlIjsgLy8gVEFCTEU6ZnJhbWUKLQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQkVMT1cgPSAiYmVsb3ciOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9IU0lERVMgPSAiaHNpZGVzIjsgLy8gVEFCTEU6ZnJhbWUKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9MSFMgPSAibGhzIjsgLy8gVEFCTEU6ZnJhbWUKLQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SSFMgPSAicmhzIjsgLy8gVEFCTEU6ZnJhbWUKLQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9WU0lERVMgPSAidnNpZGVzIjsgLy8gVEFCTEU6ZnJhbWUKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CT1ggPSAiYm94IjsgLy8gVEFCTEU6ZnJhbWUKLQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CT1JERVIgPSAiYm9yZGVyIjsgLy8gVEFCTEU6ZnJhbWUKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgcnVsZXMgb2YgVEFCTEUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0dST1VQUyA9ICJncm91cHMiOyAvLyBUQUJMRTpydWxlcwotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JPV1MgPSAicm93cyI7IC8vIFRFWFRBUkVBCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DT0xTID0gImNvbHMiOyAvLyBURVhUQVJFQQotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIG1ldGhvZCBvZiBGT1JNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9HRVQgPSAiZ2V0IjsgLy8gRk9STSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9QT1NUID0gInBvc3QiOyAvLyBGT1JNIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1dXV19GT1JNX1VSTEVOQ09ERUQgPSAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIHNjb3BlIG9mIChUSCB8IFREKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUk9XID0gInJvdyI7IC8vIChUSHxURCk6c2NvcGUKLQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DT0wgPSAiY29sIjsgLy8gKFRIfFREKTpzY29wZQotCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JPV0dST1VQID0gInJvd2dyb3VwIjsvLyAoVEh8VEQpOnNjb3BlCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQ09MR1JPVVAgPSAiY29sZ3JvdXAiOy8vIChUSHxURCk6c2NvcGUKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgYXV0bz8/IG9mIEVNQkVECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9UUlVFID0gInRydWUiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfRkFMU0UgPSAiZmFsc2UiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgYmVoYXZpcm8gb2YgTUFSUVVFRQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfU0NST0xMID0gInNjcm9sbCI7IC8vIE1BUlFVRUUKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9TTElERSA9ICJzbGlkZSI7IC8vIE1BUlFVRUUKLQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQUxURVJOQVRFID0gImFsdGVybmF0ZSI7IC8vIE1BUlFVRUUKLQkJCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgZGlyZWN0aW9uIG9mIE1BUlFVRUUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1VQID0gInVwIjsgLy8gTUFSUVVFRSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9ET1dOID0gImRvd24iOyAvLyBNQVJRVUVFCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgdHlwZSBvZiBMSSAoRDE5OTI0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTlVNQkVSID0gIjEiOyAvLyBMSSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9MT1dFUl9BTFBIQSA9ICJhIjsgLy8gTEkKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvQ1NTTm9kZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9DU1NOb2RlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODk4YzU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9DU1NOb2RlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01lZGlhUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5pbWFnZS5DU1NJbWFnZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdDsKLQotLyoqCi0gKiBBZGFwdHMgdGhlIENTUyBET00gbm9kZSB0byBhIEpGYWNlIHZpZXdlci4KLSAqLwotY2xhc3MgQ1NTTm9kZUFkYXB0ZXIgaW1wbGVtZW50cyBJSkZhY2VOb2RlQWRhcHRlciwgSU5vZGVBZGFwdGVyLCBSdW5uYWJsZSB7Ci0JLyoqCi0JICogZGVidWcgLm9wdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBnZXREZWJ1Z1ZhbHVlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGdldERlYnVnVmFsdWUoKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2RlYnVnL291dGxpbmUiKTsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIHJlc3VsdCA9ICh2YWx1ZSAhPSBudWxsKSAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQljbGFzcyBOb3RpZnlDb250ZXh0IHsKLQkJTm90aWZ5Q29udGV4dChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCQl0aGlzLm5vdGlmaWVyID0gbm90aWZpZXI7Ci0JCQl0aGlzLmV2ZW50VHlwZSA9IGV2ZW50VHlwZTsKLQkJCXRoaXMuY2hhbmdlZEZlYXR1cmUgPSBjaGFuZ2VkRmVhdHVyZTsKLQkJCXRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTsKLQkJCXRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKLQkJCXRoaXMucG9zID0gcG9zOwotCQl9Ci0KLQkJdm9pZCBmaXJlKCkgewotCQkJaW50ZXJuYWxOb3RpZnlDaGFuZ2VkKG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcyk7Ci0JCX0KLQotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyOwotCQlpbnQgZXZlbnRUeXBlOwotCQlPYmplY3QgY2hhbmdlZEZlYXR1cmU7Ci0JCU9iamVjdCBvbGRWYWx1ZTsKLQkJT2JqZWN0IG5ld1ZhbHVlOwotCQlpbnQgcG9zOwotCX0KLQotCWNsYXNzIFN0eWxlVmlld1VwZGF0ZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmIChsYXN0VXBkYXRlciA9PSB0aGlzKSB7Ci0JCQkJaW50ZXJuYWxBY3Rpb25QZXJmb3JtZWQoKTsKLQkJCQlsYXN0VXBkYXRlciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIFZlY3RvciBub3RpZnlRdWV1ZTsKLQlTdHlsZVZpZXdVcGRhdGVyIGxhc3RVcGRhdGVyOwotCXByb3RlY3RlZCBpbnQgZGVsYXlNU2VjcyA9IDUwMDsKLQlSZWZyZXNoU3RydWN0dXJlSm9iIGZSZWZyZXNoSm9iID0gbnVsbDsKLQlmaW5hbCBzdGF0aWMgQ2xhc3MgQURBUFRFUl9LRVkgPSBJSkZhY2VOb2RlQWRhcHRlci5jbGFzczsKLQotCXB1YmxpYyBDU1NOb2RlQWRhcHRlcihJTm9kZUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBSZWZyZXNoU3RydWN0dXJlSm9iIGdldFJlZnJlc2hKb2IoKSB7Ci0JCWlmIChmUmVmcmVzaEpvYiA9PSBudWxsKSB7Ci0JCQlmUmVmcmVzaEpvYiA9IG5ldyBSZWZyZXNoU3RydWN0dXJlSm9iKCk7Ci0JCX0KLQkJcmV0dXJuIGZSZWZyZXNoSm9iOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbEFjdGlvblBlcmZvcm1lZCgpIHsKLQkJaWYgKG5vdGlmeVF1ZXVlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlib29sZWFuIHJlZnJlc2hfYWxsID0gZmFsc2U7Ci0JCWJvb2xlYW4gcmVmcmVzaF9ydWxlID0gZmFsc2U7Ci0JCWludCBwb3NfYWxsID0gMDsKLQkJTGlzdCB0YXJnZXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vdGlmeVF1ZXVlLnNpemUoKTsgaSsrKSB7Ci0JCQlOb3RpZnlDb250ZXh0IGNvbnRleHQgPSAoTm90aWZ5Q29udGV4dCkgbm90aWZ5UXVldWUuZ2V0KGkpOwotCQkJaWYgKGNvbnRleHQubm90aWZpZXIgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCkgewotCQkJCXJlZnJlc2hfYWxsID0gdHJ1ZTsKLQkJCQlwb3NfYWxsID0gaTsKLQkJCX0KLQkJCWlmIChjb250ZXh0Lm5vdGlmaWVyIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbGFyYXRpb24pIHsKLQkJCQlyZWZyZXNoX3J1bGUgPSB0cnVlOwotCQkJCXRhcmdldHMuYWRkKGNvbnRleHQpOwotCQkJCS8vIHBvc19ydWxlID0gaTsKLQkJCX0KLQkJCS8vICgoTm90aWZ5Q29udGV4dCkgbm90aWZ5UXVldWUuZ2V0KGkpKS5maXJlKCk7Ci0JCX0KLQkJaWYgKHJlZnJlc2hfYWxsKSB7Ci0JCQkoKE5vdGlmeUNvbnRleHQpIG5vdGlmeVF1ZXVlLmdldChwb3NfYWxsKSkuZmlyZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZnJlc2hfcnVsZSkgewotCQkJSXRlcmF0b3IgaSA9IHRhcmdldHMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCSgoTm90aWZ5Q29udGV4dCkgaS5uZXh0KCkpLmZpcmUoKTsKLQkJCX0KLQkJCS8vIGVsc2UgaWYgKHJlZnJlc2hfcnVsZSkgaW50ZXJuYWxSZWZyZXNoQWxsKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vdGlmeVF1ZXVlLnNpemUoKTsgaSsrKSB7Ci0JCQkJKChOb3RpZnlDb250ZXh0KSBub3RpZnlRdWV1ZS5nZXQoaSkpLmZpcmUoKTsKLQkJCX0KLQkJfQotCQlub3RpZnlRdWV1ZS5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSB0aGUgb2JqZWN0IGJlaW5nIGFkYXB0ZXIgKHRoZSBub3RpZmllcikgd2hlbiBzb21ldGhpbmcgaGFzCi0JICogY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnRlcm5hbE5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlJdGVyYXRvciBpdGVyYXRvciA9ICgoSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0TGlzdGVuZXJzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGxpc3RlbmVyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikgewotCQkJCW5vdGlmeUNoYW5nZWRGb3JTdHJ1Y3R1cmVkVmlld2VyKChTdHJ1Y3R1cmVkVmlld2VyKSBsaXN0ZW5lciwgbm90aWZpZXIsIGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgUHJvcGVydHlTaGVldFBhZ2UpIHsKLQkJCQlub3RpZnlDaGFuZ2VkRm9yUHJvcGVydHlTaGVldFBhZ2UoKFByb3BlcnR5U2hlZXRQYWdlKSBsaXN0ZW5lciwgbm90aWZpZXIsIGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlDaGFuZ2VkRm9yUHJvcGVydHlTaGVldFBhZ2UoUHJvcGVydHlTaGVldFBhZ2UgcGFnZSwgSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAocGFnZS5nZXRDb250cm9sKCkgPT0gbnVsbCB8fCBwYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ0hBTkdFIHx8IGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCB8fCBldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpIHsKLQkJCXBhZ2UucmVmcmVzaCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUNoYW5nZWRGb3JTdHJ1Y3R1cmVkVmlld2VyKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyLCBJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmICh2aWV3ZXIuZ2V0Q29udHJvbCgpID09IG51bGwgfHwgdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ0hBTkdFKSB7Ci0JCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCkgewotCQkJCUlDU1NOb2RlIHRlbXAgPSAoY2hhbmdlZEZlYXR1cmUgIT0gbnVsbCkgPyAoSUNTU05vZGUpIGNoYW5nZWRGZWF0dXJlIDogKElDU1NOb2RlKSBuZXdWYWx1ZTsKLQkJCQlpZiAodGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZvciAoOzspIHsKLQkJCQkJCWlmICh0ZW1wIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJdGVtcCA9IHRlbXAuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKHRlbXAgPT0gbnVsbCkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh0ZW1wID09IG51bGwgfHwgdGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KSB7Ci0JCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdmlld2VyLnJlZnJlc2godGVtcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJQ1NTTm9kZSB0ZW1wID0gKElDU1NOb2RlKSBub3RpZmllcjsKLQkJCQlpZiAodGVtcCAhPSBudWxsKSB7Ci0JCQkJCXRlbXAgPSB0ZW1wLmdldFBhcmVudE5vZGUoKTsKLQkJCQl9Ci0JCQkJaWYgKHRlbXAgPT0gbnVsbCB8fCB0ZW1wIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpIHsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKHRlbXApOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQUREKSB7Ci0JCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCkgewotCQkJCUlDU1NOb2RlIHRlbXAgPSAoY2hhbmdlZEZlYXR1cmUgIT0gbnVsbCkgPyAoSUNTU05vZGUpIGNoYW5nZWRGZWF0dXJlIDogKElDU1NOb2RlKSBuZXdWYWx1ZTsKLQkJCQlpZiAodGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZvciAoOzspIHsKLQkJCQkJCWlmICh0ZW1wIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJdGVtcCA9IHRlbXAuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKHRlbXAgPT0gbnVsbCkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh0ZW1wID09IG51bGwgfHwgKHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCkpIHsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKHRlbXApOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChuZXdWYWx1ZSAhPSBudWxsICYmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSkgewotCQkJCQl2aWV3ZXIucmVmcmVzaCgoKElDU1NOb2RlKSBuZXdWYWx1ZSkuZ2V0UGFyZW50Tm9kZSgpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUlDU1NOb2RlIHRlbXAgPSAoSUNTU05vZGUpIG5vdGlmaWVyOwotCQkJCQlpZiAodGVtcCAhPSBudWxsKSB7Ci0JCQkJCQl0ZW1wID0gdGVtcC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHRlbXAgPT0gbnVsbCB8fCAodGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KSkgewotCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZpZXdlci5yZWZyZXNoKHRlbXApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSkgewotCQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpIHsKLQkJCQlJQ1NTTm9kZSB0ZW1wID0gKGNoYW5nZWRGZWF0dXJlICE9IG51bGwpID8gKElDU1NOb2RlKSBjaGFuZ2VkRmVhdHVyZSA6IChJQ1NTTm9kZSkgbmV3VmFsdWU7Ci0JCQkJaWYgKHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmb3IgKDs7KSB7Ci0JCQkJCQlpZiAodGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCXRlbXAgPSB0ZW1wLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmICh0ZW1wID09IG51bGwpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAodGVtcCA9PSBudWxsIHx8ICh0ZW1wIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpKSB7Ci0JCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdmlld2VyLnJlZnJlc2godGVtcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB2aWV3ZXIucmVmcmVzaChub3RpZmllcik7Ci0JCQkJSUNTU05vZGUgdGVtcCA9IChJQ1NTTm9kZSkgbm90aWZpZXI7Ci0JCQkJaWYgKHRlbXAgIT0gbnVsbCkgewotCQkJCQl0ZW1wID0gdGVtcC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJfQotCQkJCWlmICh0ZW1wID09IG51bGwgfHwgKHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCkpIHsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKHRlbXApOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyB9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgaW50ZXJuYWxSZWZyZXNoQWxsKCkgewotCQlDb2xsZWN0aW9uIGxpc3RlbmVycyA9ICgoSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlDU1MpIGFkYXB0ZXJGYWN0b3J5KS5nZXRMaXN0ZW5lcnMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGxpc3RlbmVyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikgewotCQkJCVN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIGxpc3RlbmVyOwotCQkJCWlmICh2aWV3ZXIuZ2V0Q29udHJvbCgpICE9IG51bGwgJiYgIXZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQkJCVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UgPSAoUHJvcGVydHlTaGVldFBhZ2UpIGxpc3RlbmVyOwotCQkJCWlmIChwYWdlLmdldENvbnRyb2woKSAhPSBudWxsICYmICFwYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJcGFnZS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlLmVxdWFscyhBREFQVEVSX0tFWSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHRoZSBvYmplY3QgYmVpbmcgYWRhcHRlciAodGhlIG5vdGlmaWVyKSB3aGVuIHNvbWV0aGluZyBoYXMKLQkgKiBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAobm90aWZ5UXVldWUgPT0gbnVsbCkKLQkJCW5vdGlmeVF1ZXVlID0gbmV3IFZlY3RvcigpOwotLy8JCW5vdGlmeVF1ZXVlLmFkZChuZXcgTm90aWZ5Q29udGV4dChub3RpZmllciwgZXZlbnRUeXBlLCBjaGFuZ2VkRmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwb3MpKTsKLQkJLy8gVE9ETy1mdXR1cmU6IHRoZXJlJ3MgcHJvYmFibHkgYSBiZXR0ZXIgd2F5IHRoYW4gcmVseWluZyBvbiBhc3luYwotCQkvLyBleGVjCi0JCWlmIChub3RpZmllciBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQlDb2xsZWN0aW9uIGxpc3RlbmVycyA9ICgoSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlDU1MpIGFkYXB0ZXJGYWN0b3J5KS5nZXRMaXN0ZW5lcnMoKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0KLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbGlzdGVuZXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwNjM3Ci0JCQkJLy8gaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgTm9kZSAmJiAobGlzdGVuZXIgaW5zdGFuY2VvZgotCQkJCS8vIFN0cnVjdHVyZWRWaWV3ZXIpICYmIChldmVudFR5cGUgPT0KLQkJCQkvLyBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEIHx8IChldmVudFR5cGUgPT0KLQkJCQkvLyBJTm9kZU5vdGlmaWVyLkNIQU5HRSAmJiBjaGFuZ2VkRmVhdHVyZSA9PSBudWxsKSkpIHsKLQkJCQlpZiAoKGxpc3RlbmVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikgJiYgKChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkgfHwgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNPTlRFTlRfQ0hBTkdFRCkgfHwgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSB8fCAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQUREKSB8fCAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuUkVNT1ZFKSkpKSB7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJKRmFjZU5vZGVBZGFwdGVyIG5vdGlmaWVkIG9uIGV2ZW50IHR5cGUgPiAiICsgZXZlbnRUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJLy8gcmVmcmVzaCBvbiBzdHJ1Y3R1cmFsIGFuZCAidW5rbm93biIgY2hhbmdlcwotCQkJCQlTdHJ1Y3R1cmVkVmlld2VyIHN0cnVjdHVyZWRWaWV3ZXIgPSAoU3RydWN0dXJlZFZpZXdlcikgbGlzdGVuZXI7Ci0JCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MjMwCi0JCQkJCWlmIChzdHJ1Y3R1cmVkVmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsKSB7Ci0JCQkJCQlnZXRSZWZyZXNoSm9iKCkucmVmcmVzaChzdHJ1Y3R1cmVkVmlld2VyLCAoSUNTU05vZGUpIG5vdGlmaWVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCURpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCX0KLQotCS8qKgotCSAqIHRoaXMgbWV0aG9kIGlzIGludGVuZGVkIG9ubHkgZm9yIHRpbWVyRXhlYygpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlsYXN0VXBkYXRlciA9IG5ldyBTdHlsZVZpZXdVcGRhdGVyKCk7Ci0JCWdldERpc3BsYXkoKS5hc3luY0V4ZWMobGFzdFVwZGF0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gY29udGFpbmluZyBhbGwgY2hpbGQgbm9kZXMgb2YgdGhlIGdpdmVuIGVsZW1lbnQsCi0JICogd2hpY2ggcmVwcmVzZW50cyBhIG5vZGUgaW4gYSB0cmVlLiBUaGUgZGlmZmVyZW5jZSB0bwotCSAqIDxjb2RlPklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzKE9iamVjdCk8L2NvZGU+IGlzIGFzCi0JICogZm9sbG93czogPGNvZGU+Z2V0RWxlbWVudHM8L2NvZGU+IGlzIGNhbGxlZCB0byBvYnRhaW4gdGhlIHRyZWUKLQkgKiB2aWV3ZXIncyByb290IGVsZW1lbnRzLiBNZXRob2QgPGNvZGU+Z2V0Q2hpbGRyZW48L2NvZGU+IGlzIHVzZWQgdG8KLQkgKiBvYnRhaW4gdGhlIGNoaWxkcmVuIG9mIGEgZ2l2ZW4gbm9kZSBpbiB0aGUgdHJlZSwgd2hpY2ggY2FuIGNhbiBiZSBhCi0JICogcm9vdCBub2RlLCB0b28uCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQlJQ1NTTm9kZSBub2RlID0gKElDU1NOb2RlKSBvYmplY3Q7Ci0KLQkJCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IElDU1NOb2RlLlNUWUxFUlVMRV9OT0RFIHx8IG5vZGVUeXBlID09IElDU1NOb2RlLlBBR0VSVUxFX05PREUgfHwgbm9kZVR5cGUgPT0gSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUpIHsKLQkJCQlmb3IgKG5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsICYmICEobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xhcmF0aW9uKTsgbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCS8vIG5vcAotCQkJCX0KLQkJCX0KLQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJQ1NTTm9kZSBjaGlsZCA9IChub2RlICE9IG51bGwpID8gbm9kZS5nZXRGaXJzdENoaWxkKCkgOiBudWxsOwotCQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCQlpZiAoIShjaGlsZCBpbnN0YW5jZW9mIElDU1NQcmltaXRpdmVWYWx1ZSkgJiYgIShjaGlsZCBpbnN0YW5jZW9mIE1lZGlhTGlzdCkpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQkJLyoKLQkJCQkgKiBSZXF1aXJlZCB0byBjb3JyZWN0bHkgY29ubmVjdCB0aGUgcmVmcmVzaGluZyBiZWhhdmlvciB0bwotCQkJCSAqIHRoZSB0cmVlCi0JCQkJICovCi0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkoKElOb2RlTm90aWZpZXIpIGNoaWxkKS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQl9Ci0JCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJfQotCQkJcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIHdpdGggdGhlIGVsZW1lbnRzIGJlbG9uZ2luZyB0byB0aGUgcGFzc2VkCi0JICogZWxlbWVudC4gVGhlc2UgZWxlbWVudHMgY2FuIGJlIHByZXNlbnRlZCBhcyByb3dzIGluIGEgdGFibGUsIGl0ZW1zIGluIGEKLQkgKiBsaXN0IGV0Yy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkvLyBUaGUgcm9vdCBpcyB1c3VhbGx5IGFuIGluc3RhbmNlIG9mIGFuIFhNTFN0cnVjdHVyZWRNb2RlbCBpbgotCQkvLyB3aGljaCBjYXNlIHdlIHdhbnQgdG8gZXh0cmFjdCB0aGUgZG9jdW1lbnQuCi0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJQXJyYXlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvLyBpbnRlcm5hbEdldEVsZW1lbnRzKG9iamVjdCwgdik7Ci0JCQlhZGRFbGVtZW50cyhvYmplY3QsIHYpOwotCQkJT2JqZWN0W10gZWxlbWVudHMgPSB2LnRvQXJyYXkoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCS8qCi0JCQkJICogUmVxdWlyZWQgdG8gY29ycmVjdGx5IGNvbm5lY3QgdGhlIHJlZnJlc2hpbmcgYmVoYXZpb3IgdG8KLQkJCQkgKiB0aGUgdHJlZQotCQkJCSAqLwotCQkJCWlmIChlbGVtZW50c1tpXSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJKChJTm9kZU5vdGlmaWVyKSBlbGVtZW50c1tpXSkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gZWxlbWVudHM7Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50LCBmb3IgdXNlIGluIHRoZQotCSAqIGdpdmVuIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICBUaGUgdmlld2VyIHRoYXQgZGlzcGxheXMgdGhlIGVsZW1lbnQuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IGZvciB3aGljaCB0byBwcm92aWRlIHRoZSBsYWJlbCBpbWFnZS4gRWxlbWVudAotCSAqICAgICAgICAgICAgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgbm8gaW5wdXQgb2JqZWN0IGlzIHNldAotCSAqICAgICAgICAgICAgdG8gdGhlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0TGFiZWxJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQlDU1NJbWFnZUhlbHBlciBoZWxwZXIgPSBDU1NJbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpOwotCQkJcmV0dXJuIGhlbHBlci5nZXRJbWFnZShDU1NJbWFnZVR5cGUuZ2V0SW1hZ2VUeXBlKChJQ1NTTm9kZSkgZWxlbWVudCkpOwotCQkJLy8gSW1hZ2UgaW1hZ2UgPSBnZXRDU1NOb2RlSW1hZ2UoZWxlbWVudCk7Ci0JCQkvLyByZXR1cm4gaW1hZ2U7Ci0JCQkvLyByZXR1cm4gZ2V0QWRhcHRlcihlbGVtZW50KS5nZXRMYWJlbEltYWdlKChJQ1NTTm9kZSkgZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50LCBmb3IgdXNlIGluIHRoZQotCSAqIGdpdmVuIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICBUaGUgdmlld2VyIHRoYXQgZGlzcGxheXMgdGhlIGVsZW1lbnQuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50IGZvciB3aGljaCB0byBwcm92aWRlIHRoZSBsYWJlbCB0ZXh0LiBFbGVtZW50IGNhbgotCSAqICAgICAgICAgICAgYmUgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGluZyBubyBpbnB1dCBvYmplY3QgaXMgc2V0IHRvCi0JICogICAgICAgICAgICB0aGUgdmlld2VyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCS8vIFRoaXMgd2FzIHJldHVybmluZyBudWxsLCBvbiBvY2Nhc2lvbiAuLi4gcHJvYmFibHkgc2hvdWxkIG5vdCBiZSwKLQkJLy8gYnV0Ci0JCS8vIHRvb2sgdGhlIHF1aWNrIGFuZCBlYXN5IHdheSBvdXQgZm9yIG5vdy4gKGRtdyAzLzgvMDEpCi0KLQkJU3RyaW5nIHJlc3VsdCA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG1lZGlhVGV4dDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJc3dpdGNoICgoKElDU1NOb2RlKSBlbGVtZW50KS5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRVJVTEVfTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICgoSUNTU1N0eWxlUnVsZSkgZWxlbWVudCkuZ2V0U2VsZWN0b3JzKCkuZ2V0U3RyaW5nKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUgOgotCQkJCQlyZXN1bHQgPSAiQGZvbnQtZmFjZSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICgoQ1NTSW1wb3J0UnVsZSkgZWxlbWVudCkuZ2V0SHJlZigpOwotCQkJCQltZWRpYVRleHQgPSBnZXRNZWRpYVRleHQoKENTU0ltcG9ydFJ1bGUpIGVsZW1lbnQpOwotCQkJCQlpZiAobWVkaWFUZXh0ICE9IG51bGwgJiYgMCA8IG1lZGlhVGV4dC5sZW5ndGgoKSkgewotCQkJCQkJcmVzdWx0ICs9ICIgKCIgKyBtZWRpYVRleHQgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNTU05vZGUuUEFHRVJVTEVfTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICJAcGFnZSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICJwcm9wZXJ0aWVzIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNTU05vZGUuU1RZTEVERUNMSVRFTV9OT0RFIDoKLQkJCQkJcmVzdWx0ID0gKChJQ1NTU3R5bGVEZWNsSXRlbSkgZWxlbWVudCkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNTU05vZGUuUFJJTUlUSVZFVkFMVUVfTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICgoSUNTU1ByaW1pdGl2ZVZhbHVlKSBlbGVtZW50KS5nZXRTdHJpbmdWYWx1ZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLk1FRElBUlVMRV9OT0RFIDoKLQkJCQkJcmVzdWx0ID0gIkBtZWRpYSI7Ly8kTk9OLU5MUy0xJAotCQkJCQltZWRpYVRleHQgPSBnZXRNZWRpYVRleHQoKElDU1NNZWRpYVJ1bGUpIGVsZW1lbnQpOwotCQkJCQlpZiAobWVkaWFUZXh0ICE9IG51bGwgJiYgMCA8IG1lZGlhVGV4dC5sZW5ndGgoKSkgewotCQkJCQkJcmVzdWx0ICs9ICIgKCIgKyBtZWRpYVRleHQgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNTU05vZGUuQ0hBUlNFVFJVTEVfTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICJAY2hhcnNldCI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLk1FRElBTElTVF9OT0RFIDoKLQkJCQkJcmVzdWx0ID0gKChNZWRpYUxpc3QpIGVsZW1lbnQpLmdldE1lZGlhVGV4dCgpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCS8vIElDU1NOb2RlIG5vZGUgPSAoKElDU1NOb2RlKWVsZW1lbnQpOwotCQkvLyByZXN1bHQgPSBnZXRBZGFwdGVyKGVsZW1lbnQpLmdldExhYmVsVGV4dCgoSUNTU05vZGUpIGVsZW1lbnQpOwotCQkvLyB9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyZW50IGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4gVGhpcyBtZXRob2QgY2FuIHJldHVybgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgdGhhdCB0aGUgcGFyZW50IGNhbid0IGJlIGNvbXB1dGVkLiBJbgotCSAqIHRoaXMgY2FzZSB0aGUgdHJlZSB2aWV3ZXIgY2FuJ3QgZXhwYW5kIGEgZ2l2ZW4gbm9kZSBjb3JyZWN0bHkgaWYKLQkgKiByZXF1ZXN0ZWQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCUlDU1NOb2RlIG5vZGUgPSAoKElDU1NOb2RlKSBvYmplY3QpLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkgewotCQkJCS8qCi0JCQkJICogUmVxdWlyZWQgdG8gYWxzbyBjb3JyZWN0bHkgY29ubmVjdCBzdHlsZSBkZWNsYXJhdGlvbiB0byB0aGUKLQkJCQkgKiByZWZyZXNoaW5nIGJlaGF2aW9yIGluIHRoZSB0cmVlCi0JCQkJICovCi0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkJCSgoSU5vZGVOb3RpZmllcikgbm9kZSkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQkJfQotCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGVsZW1lbnQgaGFzIGNoaWxkcmVuLgotCSAqIE90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyByZXR1cm4gZ2V0QWRhcHRlcihvYmplY3QpLmhhc0NoaWxkcmVuKChJQ1NTTm9kZSkgb2JqZWN0KTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkvKgotCQkJICogUmVxdWlyZWQgdG8gY29ycmVjdGx5IGNvbm5lY3QgdGhlIHJlZnJlc2hpbmcgYmVoYXZpb3IgdG8gdGhlCi0JCQkgKiB0cmVlCi0JCQkgKi8KLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkJKChJTm9kZU5vdGlmaWVyKSBvYmplY3QpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJfQotCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZWxzZSB7Ci0JCQkJaWYoKChJQ1NTTm9kZSkgb2JqZWN0KS5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJSUNTU05vZGUgY2hpbGQgPSAoKElDU1NOb2RlKSBvYmplY3QpLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJCi0JCQkJCXdoaWxlKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCQkJU3RyaW5nIGNoaWxkVGV4dCA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBjaGlsZCkuZ2V0Q3NzVGV4dCgpOwotCQkJCQkJCWlmKGNoaWxkVGV4dCAhPSBudWxsICYmIGNoaWxkVGV4dC5sZW5ndGgoKSA+IDApCi0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRWxlbWVudHMoT2JqZWN0IGVsZW1lbnQsIEFycmF5TGlzdCB2KSB7Ci0KLQkJSUNTU05vZGUgbm9kZTsKLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJSUNTU01vZGVsIG1vZGVsID0gKElDU1NNb2RlbCkgZWxlbWVudDsKLQkJCUlDU1NEb2N1bWVudCBkb2MgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQkJbm9kZSA9IGRvYy5nZXRGaXJzdENoaWxkKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQlub2RlID0gKChJQ1NTTm9kZSkgZWxlbWVudCkuZ2V0Rmlyc3RDaGlsZCgpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybjsKLQotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1J1bGUpIHsKLQkJCQl2LmFkZChub2RlKTsKLQkJCX0KLQotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWVkaWFUZXh0KENTU1J1bGUgcnVsZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJSUNTU05vZGUgY2hpbGQgPSAocnVsZSAhPSBudWxsKSA/ICgoSUNTU05vZGUpIHJ1bGUpLmdldEZpcnN0Q2hpbGQoKSA6IG51bGw7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgewotCQkJCXJlc3VsdCA9ICgoTWVkaWFMaXN0KSBjaGlsZCkuZ2V0TWVkaWFUZXh0KCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODdlOGVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTIGV4dGVuZHMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgewotCXB1YmxpYyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUNTUygpIHsKLQkJdGhpcyhJSkZhY2VOb2RlQWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciBub2RlKSB7Ci0JCWlmIChzaW5nbGV0b25BZGFwdGVyID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSB0aGUgSkZhY2VOb2RlQWRhcHRlcgotCQkJc2luZ2xldG9uQWRhcHRlciA9IG5ldyBDU1NOb2RlQWRhcHRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uQWRhcHRlcjsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1JlZnJlc2hTdHJ1Y3R1cmVKb2IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9SZWZyZXNoU3RydWN0dXJlSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMTE0Y2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1JlZnJlc2hTdHJ1Y3R1cmVKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgUmVmcmVzaFN0cnVjdHVyZUpvYiBleHRlbmRzIEpvYiB7Ci0JLyoqIGRlYnVnIGZsYWcgKi8KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVQREFURV9ERUxBWSA9IDMwMDsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWZyZXNoU3RydWN0dXJlIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSAodmFsdWUgIT0gbnVsbCkgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKiBMaXN0IG9mIHJlZnJlc2ggcmVxdWVzdHMgKE5vZGVzKSAqLwotCXByaXZhdGUgZmluYWwgTGlzdCBmUmVmcmVzaGVzOwotCS8qKiBMaXN0IG9mIHVwZGF0ZSByZXF1ZXN0cyAoTm9kZXMpICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0IGZVcGRhdGVzOwotCS8qKiBMaXN0IG9mIHVwZGF0ZSByZXF1ZXN0cyAoTm9kZXMpICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0IGZVcGRhdGVQcm9wZXJ0aWVzOwotCS8qKiB0aGUgc3RydWN0dXJlZCB2aWV3ZXJzICovCi0JU2V0IGZSZWZyZXNoVmlld2VycyA9IG5ldyBIYXNoU2V0KDMpOwotCVNldCBmVXBkYXRlVmlld2VycyA9IG5ldyBIYXNoU2V0KDMpOwotCi0JcHVibGljIFJlZnJlc2hTdHJ1Y3R1cmVKb2IoKSB7Ci0JCXN1cGVyKFhNTFVJTWVzc2FnZXMucmVmcmVzaG91dGxpbmVfMCk7Ci0JCXNldFByaW9yaXR5KEpvYi5MT05HKTsKLQkJc2V0U3lzdGVtKHRydWUpOwotCQlmUmVmcmVzaGVzID0gbmV3IEFycmF5TGlzdCg1KTsKLQkJZlVwZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KDUpOwotCQlmVXBkYXRlUHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3QoNSk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRVcGRhdGVSZXF1ZXN0KElDU1NOb2RlIG5ld05vZGVSZXF1ZXN0LCBTdHJpbmdbXSB1cGRhdGVQcm9wZXJ0aWVzKSB7Ci0JCS8qCi0JCSAqIElmIHdlIGdldCB0byBoZXJlLCBlaXRoZXIgZnJvbSBleGlzdGluZyByZXF1ZXN0IGxpc3QgYmVpbmcgemVybwotCQkgKiBsZW5ndGgsIG9yIG5vIGV4aXNpdG5nIHJlcXVlc3RzICJtYXRjaGVkIiBuZXcgcmVxdWVzdCwgdGhlbiBhZGQgdGhlCi0JCSAqIG5ldyByZXF1ZXN0LgotCQkgKi8KLQkJZlVwZGF0ZXMuYWRkKG5ld05vZGVSZXF1ZXN0KTsKLQkJZlVwZGF0ZVByb3BlcnRpZXMuYWRkKHVwZGF0ZVByb3BlcnRpZXMpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkVXBkYXRlVmlld2VyKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7Ci0JCWZVcGRhdGVWaWV3ZXJzLmFkZCh2aWV3ZXIpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkUmVmcmVzaFJlcXVlc3QoSUNTU05vZGUgbmV3Tm9kZVJlcXVlc3QpIHsKLQkJLyoKLQkJICogbm90ZTogdGhlIGNhbGxlciBtdXN0IE5PVCBwYXNzIGluIG51bGwgbm9kZSByZXF1ZXN0ICh3aGljaCwgc2luY2UKLQkJICogcHJpdmF0ZSBtZXRob2QsIHdlIGRvIG5vdCBuZWVkIHRvIGdhdXJkIGFnYWluc3QgaGVyZSwgYXMgbG9uZyBhcyB3ZQotCQkgKiBnYXVyZCBhZ2FpbnN0IGl0IGluIGNhbGxpbmcgbWV0aG9kLgotCQkgKi8KLQkJaW50IHNpemUgPSBmUmVmcmVzaGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlDU1NOb2RlIGV4aXN0aW5nTm9kZVJlcXVlc3QgPSAoSUNTU05vZGUpIGZSZWZyZXNoZXMuZ2V0KGkpOwotCQkJLyoKLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTc0MjcgSWYgd2UKLQkJCSAqIGFscmVhZHkgaGF2ZSBhIHJlcXVlc3Qgd2hpY2ggZXF1YWxzIHRoZSBuZXcgcmVxdWVzdCwgZGlzY2FyZAotCQkJICogdGhlIG5ldyByZXF1ZXN0Ci0JCQkgKi8KLQkJCWlmIChleGlzdGluZ05vZGVSZXF1ZXN0LmVxdWFscyhuZXdOb2RlUmVxdWVzdCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvKgotCQkJICogSWYgd2UgYWxyZWFkeSBoYXZlIGEgcmVxdWVzdCB3aGljaCBjb250YWlucyB0aGUgbmV3IHJlcXVlc3QsCi0JCQkgKiBkaXNjYXJkIHRoZSBuZXcgcmVxdWVzdAotCQkJICovCi0JCQlpZiAoY29udGFpbnMoZXhpc3RpbmdOb2RlUmVxdWVzdCwgbmV3Tm9kZVJlcXVlc3QpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLyoKLQkJCSAqIElmIG5ldyByZXF1ZXN0IGNvbnRhaW5zIGFueSBleGlzdGluZyByZXF1ZXN0cywgcmVwbGFjZSBpdCB3aXRoCi0JCQkgKiBuZXcgcmVxdWVzdC4gSVNTVUU6IHRlY2huaWNhbGx5LCB3ZSBzaG91bGQgcmVwbGFjZSBBTEwKLQkJCSAqIGNvbnRhaW5lZCwgZXhpc3RpbmcgcmVxdWVzdHMgKHN1Y2ggYXMgaWYgbWFueSBzaWJsaW5ncyBhbHJlYWR5Ci0JCQkgKiBxdWUnZCB1cCB3aGVuIHRoZWlyIGNvbW1vbiBwYXJlbnQgaXMgdGhlbiByZXF1ZXN0ZWQsIGJ1dCwgSSdtCi0JCQkgKiBub3Qgc3VyZSBpZiB0aGF0IG9jY3VycyBtdWNoLCBpbiBwcmFjdGljZSwgb3IgaWYgdGhlcmUncyBhbgotCQkJICogYWxnb3JpdGhtIHRvIHF1aWNrbHkgZmluZCB0aGVtIGFsbC4gQWN0dWFsbHksIEkgZ3Vlc3Mgd2UgY291bGQKLQkJCSAqIGp1c3QgZ28gdGhyb3VnaCB0aGUgX3Jlc3RfIG9mIHRoZSBsaXN0IChpKzEgdG8gc2l6ZSkgYW5kIHJlbW92ZQotCQkJICogYW55IHRoYXQgYXJlIGNvbnRhaW5lZCBieSBuZXcgcmVxdWVzdCAuLi4gaW4gZnV0dXJlIDopIC4KLQkJCSAqLwotCQkJaWYgKGNvbnRhaW5zKG5ld05vZGVSZXF1ZXN0LCBleGlzdGluZ05vZGVSZXF1ZXN0KSkgewotCQkJCWZSZWZyZXNoZXMuc2V0KGksIG5ld05vZGVSZXF1ZXN0KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJLyoKLQkJICogSWYgd2UgZ2V0IHRvIGhlcmUsIGVpdGhlciBmcm9tIGV4aXN0aW5nIHJlcXVlc3QgbGlzdCBiZWluZyB6ZXJvCi0JCSAqIGxlbmd0aCwgb3Igbm8gZXhpc2l0bmcgcmVxdWVzdHMgIm1hdGNoZWQiIG5ldyByZXF1ZXN0LCB0aGVuIGFkZCB0aGUKLQkJICogbmV3IHJlcXVlc3QuCi0JCSAqLwotCQlmUmVmcmVzaGVzLmFkZChuZXdOb2RlUmVxdWVzdCk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRSZWZyZXNoVmlld2VyKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7Ci0JCWZSZWZyZXNoVmlld2Vycy5hZGQodmlld2VyKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI2NhbmNlbGluZygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2FuY2VsaW5nKCkgewotCQlmVXBkYXRlcy5jbGVhcigpOwotCQlmVXBkYXRlVmlld2Vycy5jbGVhcigpOwotCQlzdXBlci5jYW5jZWxpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBTaW1wbGUgaGllcmFyY2hpY2FsIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcC4gTm90ZSwgdGhpcyBtZXRob2QgcmV0dXJucwotCSAqICJmYWxzZSIgaWYgdGhlIHR3byBub2RlcyBhcmUgZXF1YWwhCi0JICogCi0JICogQHBhcmFtIHJvb3QKLQkgKiBAcGFyYW0gcG9zc2libGUKLQkgKiBAcmV0dXJuIGlmIHRoZSByb290IGlzIHBhcmVudCBvZiBwb3NzaWJsZSwgcmV0dXJuIHRydWUsIG90aGVyd2lzZQotCSAqICAgICAgICAgcmV0dXJuIGZhbHNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zKElDU1NOb2RlIHJvb3QsIElDU1NOb2RlIHBvc3NpYmxlKSB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlY3Vyc2l2ZSBjYWxsIHcvIHJvb3Q6ICIgKyByb290ICsgIiBhbmQgcG9zc2libGU6ICIgKyBwb3NzaWJsZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyB0aGUgZm9sbG93aW5nIGNoZWNrcyBhcmUgaW1wb3J0YW50Ci0JCS8vICNkb2N1bWVudCBub2RlIHdpbGwgYnJlYWsgdGhlIGFsZ29yaXRobSBvdGhlcndpc2UKLQotCQkvLyBjYW4ndCBjb250YWluIHRoZSBjaGlsZCBpZiBpdCdzIG51bGwKLQkJaWYgKHJvb3QgPT0gbnVsbCkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXR1cm5pbmcgZmFsc2U6IHJvb3QgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gbm90aGluZyBjYW4gYmUgcGFyZW50IG9mIERvY3VtZW50IG5vZGUKLQkJaWYgKHBvc3NpYmxlIGluc3RhbmNlb2YgSUNTU0RvY3VtZW50KSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJldHVybmluZyBmYWxzZTogcG9zc2libGUgaXMgRG9jdW1lbnQgbm9kZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gZG9jdW1lbnQgY29udGFpbnMgZXZlcnl0aGluZwotCQlpZiAocm9vdCBpbnN0YW5jZW9mIElDU1NEb2N1bWVudCkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXR1cm5pbmcgdHJ1ZTogcm9vdCBpcyBEb2N1bWVudCBub2RlIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gY2hlY2sgcGFyZW50YWdlCi0JCUlDU1NOb2RlIGN1cnJlbnQgPSBwb3NzaWJsZTsKLQkJLy8gbG9vcCBwYXJlbnRzCi0JCXdoaWxlICgoY3VycmVudCAhPSBudWxsKSAmJiAoY3VycmVudC5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLlNUWUxFU0hFRVRfTk9ERSB8fCBjdXJyZW50LmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSkgewotCQkJLy8gZm91bmQgaXQKLQkJCWlmIChyb290LmVxdWFscyhjdXJyZW50KSkgewotCQkJCWlmIChERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICEhISBmb3VuZDogIiArIHBvc3NpYmxlICsgIiBpbiBzdWJlbGVtZW50IG9mOiAiICsgcm9vdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWN1cnJlbnQgPSBjdXJyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQkvLyBuZXZlciBmb3VuZCBpdAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCBtdXN0IGJlIG9uIFVJIHRocmVhZCBiZWNhdXNlIGl0J3Mgb24gYSBTV1Qgd2lkZ2V0LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvUmVmcmVzaChmaW5hbCBJQ1NTTm9kZSBub2RlLCBmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyW10gdmlld2VycykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlZnJlc2ggb246IFsiICsgbm9kZSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmlld2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIXZpZXdlcnNbaV0uZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUgfHwgbm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkgewotCQkJCQkJCXZpZXdlcnNbaV0ucmVmcmVzaChmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQl2aWV3ZXJzW2ldLnJlZnJlc2gobm9kZSwgZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAhISEgc2tpcHBlZCByZWZyZXNoaW5nIGRpc3Bvc2VkIHZpZXdlcjogIiArIHZpZXdlcnNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBtdXN0IGJlIG9uIFVJIHRocmVhZCBiZWNhdXNlIGl0J3Mgb24gYSBTV1Qgd2lkZ2V0LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvVXBkYXRlKGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXJbXSB2aWV3ZXJzLCBmaW5hbCBJQ1NTTm9kZSBub2RlLCBmaW5hbCBTdHJpbmdbXSBwcm9wZXJ0aWVzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVmcmVzaCBvbjogWyIgKyBub2RlICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2aWV3ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICghdmlld2Vyc1tpXS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQl2aWV3ZXJzW2ldLnVwZGF0ZShub2RlLCBwcm9wZXJ0aWVzKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgISEhIHNraXBwZWQgcmVmcmVzaGluZyBkaXNwb3NlZCB2aWV3ZXI6ICIgKyB2aWV3ZXJzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhbHNvIHN5bmNocm9uaXplZCBiZWNhdXNlIGl0IGFjY2Vzc2VzIHRoZSBmUmVmcmVzaGVzIHF1ZXVlCi0JICogYW5kIGZSZWZyZXNoVmlld2VycyBsaXN0Ci0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGFuZCBhcnJheSBvZiB0aGUgY3VycmVudGx5IHJlcXVlc3RlZCBOb2RlcwotCSAqICAgICAgICAgdG8gcmVmcmVzaCBhbmQgdGhlIHZpZXdlcnMgaW4gd2hpY2ggdG8gcmVmcmVzaCB0aGVtCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgT2JqZWN0W10gZ2V0UmVmcmVzaFJlcXVlc3RzKCkgewotCQlJQ1NTTm9kZVtdIHRvUmVmcmVzaCA9IChJQ1NTTm9kZVtdKSBmUmVmcmVzaGVzLnRvQXJyYXkobmV3IElDU1NOb2RlW2ZSZWZyZXNoZXMuc2l6ZSgpXSk7Ci0JCWZSZWZyZXNoZXMuY2xlYXIoKTsKLQotCQlTdHJ1Y3R1cmVkVmlld2VyW10gdmlld2VycyA9IChTdHJ1Y3R1cmVkVmlld2VyW10pIGZSZWZyZXNoVmlld2Vycy50b0FycmF5KG5ldyBTdHJ1Y3R1cmVkVmlld2VyW2ZSZWZyZXNoVmlld2Vycy5zaXplKCldKTsKLQkJZlJlZnJlc2hWaWV3ZXJzLmNsZWFyKCk7Ci0KLQkJcmV0dXJuIG5ldyBPYmplY3RbXXt0b1JlZnJlc2gsIHZpZXdlcnN9OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFsc28gc3luY2hyb25pemVkIGJlY2F1c2UgaXQgYWNjZXNzZXMgdGhlIGZVcGRhdGVzIHF1ZXVlCi0JICogYW5kIGZVcGRhdGVWaWV3ZXJzIGxpc3QKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgYW5kIGFycmF5IG9mIHRoZSBjdXJyZW50bHkgcmVxdWVzdGVkIE5vZGVzCi0JICogICAgICAgICB0byByZWZyZXNoIGFuZCB0aGUgdmlld2VycyBpbiB3aGljaCB0byByZWZyZXNoIHRoZW0KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBPYmplY3RbXSBnZXRVcGRhdGVSZXF1ZXN0cygpIHsKLQkJSUNTU05vZGVbXSB0b1VwZGF0ZSA9IChJQ1NTTm9kZVtdKSBmVXBkYXRlcy50b0FycmF5KG5ldyBJQ1NTTm9kZVtmVXBkYXRlcy5zaXplKCldKTsKLQkJZlVwZGF0ZXMuY2xlYXIoKTsKLQotCQlTdHJ1Y3R1cmVkVmlld2VyW10gdmlld2VycyA9IChTdHJ1Y3R1cmVkVmlld2VyW10pIGZVcGRhdGVWaWV3ZXJzLnRvQXJyYXkobmV3IFN0cnVjdHVyZWRWaWV3ZXJbZlVwZGF0ZVZpZXdlcnMuc2l6ZSgpXSk7Ci0JCWZVcGRhdGVWaWV3ZXJzLmNsZWFyKCk7Ci0KLQkJU3RyaW5nW11bXSBwcm9wZXJ0aWVzID0gKFN0cmluZ1tdW10pIGZVcGRhdGVQcm9wZXJ0aWVzLnRvQXJyYXkobmV3IFN0cmluZ1tmVXBkYXRlUHJvcGVydGllcy5zaXplKCldW10pOwotCQlmVXBkYXRlUHJvcGVydGllcy5jbGVhcigpOwotCi0JCXJldHVybiBuZXcgT2JqZWN0W117dG9VcGRhdGUsIHZpZXdlcnMsIHByb3BlcnRpZXN9OwotCX0KLQotCS8qKgotCSAqIEludm9rZSBhIHJlZnJlc2ggb24gdGhlIHZpZXdlciBvbiB0aGUgZ2l2ZW4gbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIsIElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYWRkUmVmcmVzaFZpZXdlcih2aWV3ZXIpOwotCQlhZGRSZWZyZXNoUmVxdWVzdChub2RlKTsKLQkJc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnZva2UgYSByZWZyZXNoIG9uIHRoZSB2aWV3ZXIgb24gdGhlIGdpdmVuIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIsIElDU1NOb2RlIG5vZGUsIFN0cmluZ1tdIHByb3BlcnRpZXMpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYWRkVXBkYXRlVmlld2VyKHZpZXdlcik7Ci0JCWFkZFVwZGF0ZVJlcXVlc3Qobm9kZSwgcHJvcGVydGllcyk7Ci0JCXNjaGVkdWxlKFVQREFURV9ERUxBWSk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCXRyeSB7Ci0JCQlwZXJmb3JtVXBkYXRlcygpOwotCQkJCi0JCQlwZXJmb3JtUmVmcmVzaGVzKG1vbml0b3IpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybVJlZnJlc2hlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gUmV0cmlldmUgQk9USCB2aWV3ZXJzIGFuZCBOb2RlcyBvbiBvbmUgYmxvY2sKLQkJT2JqZWN0W10gcmVxdWVzdHMgPSBnZXRSZWZyZXNoUmVxdWVzdHMoKTsKLQkJSUNTU05vZGVbXSBub2RlcyA9IChJQ1NTTm9kZVtdKSByZXF1ZXN0c1swXTsKLQkJU3RydWN0dXJlZFZpZXdlcltdIHZpZXdlcnMgPSAoU3RydWN0dXJlZFZpZXdlcltdKSByZXF1ZXN0c1sxXTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWRvUmVmcmVzaChub2Rlc1tpXSwgdmlld2Vycyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybVVwZGF0ZXMoKSB7Ci0JCS8vIFJldHJpZXZlIEJPVEggdmlld2VycyBhbmQgTm9kZXMgb24gb25lIGJsb2NrCi0JCU9iamVjdFtdIHJlcXVlc3RzID0gZ2V0VXBkYXRlUmVxdWVzdHMoKTsKLQkJSUNTU05vZGVbXSBub2RlcyA9IChJQ1NTTm9kZVtdKSByZXF1ZXN0c1swXTsKLQkJU3RydWN0dXJlZFZpZXdlcltdIHZpZXdlcnMgPSAoU3RydWN0dXJlZFZpZXdlcltdKSByZXF1ZXN0c1sxXTsKLQkJU3RyaW5nW11bXSBwcm9wZXJ0aWVzID0gKFN0cmluZ1tdW10pIHJlcXVlc3RzWzJdOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKLQkJCWRvVXBkYXRlKHZpZXdlcnMsIG5vZGVzW2ldLCBwcm9wZXJ0aWVzW2ldKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzE1NWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuQ29tYm9MaXN0OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFRoaXMgY2xhc3Mgb25seSBjb250YWlucyBoZWxwZXIgbWV0aG9kcyB0aGF0IHlvdSBzaG91bGQKLSAqICAgICAgICAgICAgIGFjdHVhbGx5IGltcGxlbWVudCB5b3Vyc2VsZi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9IENTU1VJTWVzc2FnZXMuVUlfbm9uZTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDU1NNZXRhTW9kZWxSZWdpc3RyeUludG8oQ29tYm9MaXN0IGNvbWJvKSB7Ci0JCWNvbWJvLmFkZChOT05FLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJQ1NTUHJvZmlsZVJlZ2lzdHJ5IHJlZyA9IENTU1Byb2ZpbGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlJdGVyYXRvciBpID0gcmVnLmdldFByb2ZpbGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gKENTU1Byb2ZpbGUpIGkubmV4dCgpOwotCQkJU3RyaW5nIGlkID0gcHJvZmlsZS5nZXRQcm9maWxlSUQoKTsKLQkJCVN0cmluZyBuYW1lID0gcHJvZmlsZS5nZXRQcm9maWxlTmFtZSgpOwotCQkJY29tYm8uYWRkKG5hbWUsIGlkKTsKLQkJfQotCQljb21iby5zb3J0QnlLZXkoMSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZjBmMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkNvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLklDb250ZW50U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Db21ib0xpc3RPblByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2UgQ1NTV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGluc3RlYWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBleHRlbmRzIENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSB7Ci0KLQlwcml2YXRlIGZpbmFsIGludCBOX0NTU19QUk9GSUxFID0gMDsKLQotCi0KLQlwdWJsaWMgQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCQludW1iZXJPZkNvbWJvID0gMTsKLQkJbnVtQ29scyA9IDI7Ci0JCW51bVJvd3MgPSAxOwotCQljb21ibyA9IG5ldyBDb21ib0xpc3RPblByb3BlcnR5UGFnZVtzdXBlci5udW1iZXJPZkNvbWJvXTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNTU0NvbWJvQm94KCkgewotCQlzdXBlci5jb21ib1tOX0NTU19QUk9GSUxFXSA9IHN1cGVyLmNyZWF0ZUNvbWJvQm94T2YoQ1NTX0xBQkVMKTsKLQkJQ29udGVudFNldHRpbmdzUmVnaXN0cnkuc2V0Q1NTTWV0YU1vZGVsUmVnaXN0cnlJbnRvKGNvbWJvW05fQ1NTX1BST0ZJTEVdKTsKLQkJaWYgKGNvbWJvW05fQ1NTX1BST0ZJTEVdLmdldEl0ZW1Db3VudCgpIDw9IDApCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBpbml0VmFsdWUgPSBjb250ZW50U2V0dGluZ3MuZ2V0UHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFKTsKLQkJLy8gd2hlbiBlaXRoZXIgLmNvbnRlbnRzZXR0aW5ncyBvciBlbGVtZW50IGRvZXNuJ3QgZXhpc3QKLQkJLy8gd2hlbiBhdHRyaWJ1dGUgZG9lc24ndCBleGlzdHMsZ2V0UHJvcGVydHkgcmV0dXJucyBlbXB0eSBzdHJpbmcuCi0JCWlmIChpbml0VmFsdWUgPT0gbnVsbCkKLQkJCWluaXRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIHNldCBpbml0IHNlbGVjdGlvbkl0ZW0gaW4gQ29tYm8KLQkJc3VwZXIuc2V0U2VsZWN0aW9uSXRlbShjb21ib1tOX0NTU19QUk9GSUxFXSwgaW5pdFZhbHVlKTsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2V0dGluZ3NQYWdlR1VJKCkgewotCi0JCWludCB0eXBlID0gKChJUmVzb3VyY2UpIGdldEVsZW1lbnQoKSkuZ2V0VHlwZSgpOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCS8vY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHByb3BlcnR5UGFnZSxudW1Db2xzLG51bVJvd3MpOwotCQkJCWNyZWF0ZUNTU0NvbWJvQm94KCk7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcm9wZXJ0eVBhZ2UsIElIZWxwQ29udGV4dElkcy5DU1NfQ09OVEVOVF9TRVRUSU5HU19IRUxQSUQpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGlzIGluc3RhbnRpYXRlZCBieSByZXNvdXJjZSBleGNlcHQgRklMRSIpOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCi0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBwdXRTZWxlY3RlZFByb3BlcnR5SW50byhNYXAgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlSW5Db21ibywgaW50IGluZGV4KSB7Ci0KLQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSBOX0NTU19QUk9GSUxFIDoKLQkJCQkvLyBjc3MKLQkJCQlwcm9wZXJ0aWVzLnB1dChJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFLCB2YWx1ZUluQ29tYm8pOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gcHV0U2VsZWN0ZWRQcm9wZXJ0eUludG8oKSBpbiBjbGFzcyBDU1NDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiKTsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZU5vbmVQcm9wZXJ0eShpbnQgaW5kZXgpIHsKLQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSBOX0NTU19QUk9GSUxFIDoKLQkJCQkvLyBjc3MKLQkJCQljb250ZW50U2V0dGluZ3MuZGVsZXRlUHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gZGVsZXRlTm9uZVByb3BlcnR5KCkgaW4gY2xhc3MgQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIik7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9DU1NXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9DU1NXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UxZGZmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ1NTV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuQ1NTQ29udGVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDU1NXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfTk9ORSA9IENTU1VJTWVzc2FnZXMuVUlfbm9uZTsKLQotCXByaXZhdGUgQ29tYm8gZlByb2ZpbGVDb21ibzsKLQlwcml2YXRlIExpc3QgZlByb2ZpbGVJZHM7Ci0KLQlwdWJsaWMgQ1NTV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCQlzZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLkNTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHByb3BlcnR5UGFnZSA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDIpOwotCi0JCS8vIENTUyBQcm9maWxlIGNvbnRyb2wKLQkJVGV4dCBsYW5ndWFnZUxhYmVsID0gbmV3IFRleHQocHJvcGVydHlQYWdlLCBTV1QuUkVBRF9PTkxZKTsKLQkJbGFuZ3VhZ2VMYWJlbC5zZXRUZXh0KENTU1VJTWVzc2FnZXMuQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzEpOwotCQlmUHJvZmlsZUNvbWJvID0gbmV3IENvbWJvKHByb3BlcnR5UGFnZSwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlmUHJvZmlsZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcG9wdWxhdGVWYWx1ZXMoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlcygpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocHJvcGVydHlQYWdlLCBJSGVscENvbnRleHRJZHMuQ1NTX0NPTlRFTlRfU0VUVElOR1NfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gcHJvcGVydHlQYWdlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVzb3VyY2UgdGhpcyBwcm9wZXJ0aWVzIHBhZ2UgaXMgZm9yCi0JICogCi0JICogQHJldHVybiBJUmVzb3VyY2UgZm9yIHRoaXMgcHJvcGVydGllcyBwYWdlIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgIElSZXNvdXJjZQotCSAqLwotCXByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWludCBpbmRleCA9IDA7Ci0JCVN0cmluZyBwcm9maWxlID0gQ1NTQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoQ1NTQ29udGVudFByb3BlcnRpZXMuQ1NTX1BST0ZJTEUsIGdldFJlc291cmNlKCksIGZhbHNlKTsKLQkJaWYgKHByb2ZpbGUgIT0gbnVsbCAmJiBwcm9maWxlLmxlbmd0aCgpID4gMCkgewotCQkJLyoKLQkJCSAqIElmIGl0ZW0gaXMgYWxyZWFkeSBwYXJ0IG9mIGNvbWJvLCBzZWxlY3QgaXQuIE90aGVyd2lzZSwgc2VsZWN0Ci0JCQkgKiBub25lLgotCQkJICovCi0JCQlpbmRleCA9IGZQcm9maWxlSWRzLmluZGV4T2YocHJvZmlsZSk7Ci0JCX0KLQkJaW5kZXggPSBpbmRleCA+PSAwID8gaW5kZXggOiAwOwotCQlmUHJvZmlsZUNvbWJvLnNlbGVjdChpbmRleCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVmFsdWVzKCkgewotCQlmUHJvZmlsZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gYWRkIG5vbmUgZmlyc3QKLQkJZlByb2ZpbGVDb21iby5hZGQoU0VMRUNUX05PTkUpOwotCQlmUHJvZmlsZUlkcy5hZGQobnVsbCk7Ci0KLQkJQ1NTUHJvZmlsZVJlZ2lzdHJ5IHJlZyA9IENTU1Byb2ZpbGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlJdGVyYXRvciBpID0gcmVnLmdldFByb2ZpbGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gKENTU1Byb2ZpbGUpIGkubmV4dCgpOwotCQkJU3RyaW5nIGlkID0gcHJvZmlsZS5nZXRQcm9maWxlSUQoKTsKLQkJCVN0cmluZyBuYW1lID0gcHJvZmlsZS5nZXRQcm9maWxlTmFtZSgpOwotCQkJZlByb2ZpbGVDb21iby5hZGQobmFtZSk7Ci0JCQlmUHJvZmlsZUlkcy5hZGQoaWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlpbnQgaW5kZXggPSBmUHJvZmlsZUNvbWJvLmluZGV4T2YoU0VMRUNUX05PTkUpOwotCQlpZiAoaW5kZXggPiAtMSkKLQkJCWZQcm9maWxlQ29tYm8uc2VsZWN0KGluZGV4KTsKLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWludCBpbmRleCA9IGZQcm9maWxlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGluZGV4ID4gLTEpIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGZQcm9maWxlSWRzLmdldChpbmRleCk7Ci0JCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwIHx8IGlkLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUX05PTkUpKSB7Ci0JCQkJLy8gaWYgbm9uZSwgdXNlIG51bGwKLQkJCQlpZCA9IG51bGw7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCUNTU0NvbnRlbnRQcm9wZXJ0aWVzLnNldFByb3BlcnR5KENTU0NvbnRlbnRQcm9wZXJ0aWVzLkNTU19QUk9GSUxFLCBnZXRSZXNvdXJjZSgpLCBpZCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbWF5YmUgaW4gZnV0dXJlLCBsZXQgdXNlciBrbm93IHRoZXJlIHdhcyBhIHByb2JsZW0gc2F2aW5nCi0JCQkJLy8gZmlsZQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cEFjdGlvbkNTU0RlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwQWN0aW9uQ1NTRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyZDZkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwQWN0aW9uQ1NTRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DbGVhbnVwUHJvY2Vzc29yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi0vKioKLSAqIENsZWFudXAgYWN0aW9uIGRlbGVnYXRlIGZvciBDU1MgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGVhbnVwQWN0aW9uQ1NTRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElBY3Rpb25EZWxlZ2F0ZTIsIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSUVkaXRvclBhcnQgZkVkaXRvcjsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBmQ2xlYW51cFByb2Nlc3NvcjsKLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCWZFZGl0b3IgPSB0YXJnZXRFZGl0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbnVsbGluZyBvdXQganVzdCBpbiBjYXNlCi0JCWZFZGl0b3IgPSBudWxsOwotCQlmQ2xlYW51cFByb2Nlc3NvciA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KENTU1VJTWVzc2FnZXMuQ2xlYW51cERvY3VtZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChDU1NVSU1lc3NhZ2VzLkNsZWFudXBEb2N1bWVudF90b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLkNsZWFudXBEb2N1bWVudF9kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoZkVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQlmaW5hbCBJVGV4dEVkaXRvciBlZGl0b3IgPSAoSVRleHRFZGl0b3IpIGZFZGl0b3I7Ci0JCQlEaWFsb2cgY2xlYW51cERpYWxvZyA9IG5ldyBDbGVhbnVwRGlhbG9nQ1NTKGVkaXRvci5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQlpZiAoY2xlYW51cERpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJLy8gc2V0dXAgcnVubmFibGUKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IgPSBnZXRDbGVhbnVwUHJvY2Vzc29yKCk7Ci0JCQkJCQlpZiAoY2xlYW51cFByb2Nlc3NvciAhPSBudWxsKSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCQkJCQljbGVhbnVwUHJvY2Vzc29yLmNsZWFudXBNb2RlbChtb2RlbCk7Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0KLQkJCQkvLyBUT0RPOiBtYWtlIGluZGVwZW5kZW50IG9mICdtb2RlbCcuCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vIGJlZ2luIHJlY29yZGluZwotCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcKLQkJCQkJCS8vIG1vZGVsIGNoYW5nZQotCQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQkJCS8vIHJ1bgotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZkVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIHJ1bm5hYmxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnCi0JCQkJCQkvLyBtb2RlbAotCQkJCQkJLy8gY2hhbmdlCi0JCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQotCQkJCQkJLy8gZW5kIHJlY29yZGluZwotCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCW1vZGVsLmVuZFJlY29yZGluZyh0aGlzLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZ2V0Q2xlYW51cFByb2Nlc3NvcigpIHsKLQkJaWYgKGZDbGVhbnVwUHJvY2Vzc29yID09IG51bGwpCi0JCQlmQ2xlYW51cFByb2Nlc3NvciA9IG5ldyBDbGVhbnVwUHJvY2Vzc29yQ1NTKCk7Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJvY2Vzc29yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0L3VpL0NsZWFudXBEaWFsb2dDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0L3VpL0NsZWFudXBEaWFsb2dDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJhYjRmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwRGlhbG9nQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotCi1wdWJsaWMgY2xhc3MgQ2xlYW51cERpYWxvZ0NTUyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyewotCi0JcHJpdmF0ZSBib29sZWFuIGVtYmVkZGVkQ1NTOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uSWRlbnRDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbklkZW50Q2FzZUxvd2VyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uSWRlbnRDYXNlVXBwZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VBc2lzOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlTG93ZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VVcHBlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VBc2lzOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZUxvd2VyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZVVwcGVyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZUxvd2VyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlVXBwZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25TZWxlY3RvcklkQ2FzZUFzaXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25TZWxlY3RvcklkQ2FzZUxvd2VyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uU2VsZWN0b3JJZENhc2VVcHBlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblNlbGVjdG9yQ2xhc3NDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblNlbGVjdG9yQ2xhc3NDYXNlTG93ZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25TZWxlY3RvckNsYXNzQ2FzZVVwcGVyOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94UXVvdGVWYWx1ZXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hGb3JtYXRTb3VyY2U7Ci0KLQkvKioKLQkgKiBDU1NDbGVhbnVwRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbAotCSAqLwotCXB1YmxpYyBDbGVhbnVwRGlhbG9nQ1NTKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGlzRW1iZWRkZWRDU1MoKSkKLQkJCWdldFNoZWxsKCkuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkNTU19DbGVhbnVwX1VJXyk7Ci0JCWVsc2UKLQkJCWdldFNoZWxsKCkuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkNsZWFudXBfVUlfKTsKLQotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCXBhbmVsLnNldExheW91dChsYXlvdXQpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFuZWwsIElIZWxwQ29udGV4dElkcy5DU1NfQ0xFQU5VUF9IRUxQSUQpOwotCi0JCS8vIENvbnZlcnQgaWRlbnQgY2FzZQotCQkvLyBBQ0M6IEdyb3VwIHJhZGlvIGJ1dHRvbnMgdG9nZXRoZXIgc28gYXNzb2NpYXRlZCBsYWJlbCBpcyByZWFkCi0JCS8vCQlMYWJlbCBpZGVudENhc2VMYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5VTEwpOwotCQkvLwkJaWRlbnRDYXNlTGFiZWwuc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJJZGVudGlmaWVyX2Nhc2VfX1VJXyIpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJCA9ICJJZGVudGlmaWVyIGNhc2U6IgotCQkvLwkJQ2FudmFzIGlkZW50Q2FzZSA9IG5ldyBDYW52YXMocGFuZWwsIFNXVC5OVUxMKTsKLQkJR3JvdXAgaWRlbnRDYXNlID0gbmV3IEdyb3VwKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCWlkZW50Q2FzZS5zZXRUZXh0KENTU1VJTWVzc2FnZXMuSWRlbnRpZmllcl9jYXNlX19VSV8pOwotCQlHcmlkTGF5b3V0IGhMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQloTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlpZGVudENhc2Uuc2V0TGF5b3V0KGhMYXlvdXQpOwotCQlmUmFkaW9CdXR0b25JZGVudENhc2VBc2lzID0gbmV3IEJ1dHRvbihpZGVudENhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbklkZW50Q2FzZUFzaXMuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkFzX2lzX1VJXyk7Ci0JCWZSYWRpb0J1dHRvbklkZW50Q2FzZUFzaXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZSYWRpb0J1dHRvbklkZW50Q2FzZUxvd2VyID0gbmV3IEJ1dHRvbihpZGVudENhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbklkZW50Q2FzZUxvd2VyLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Mb3dlcl9VSV8pOwotCQlmUmFkaW9CdXR0b25JZGVudENhc2VMb3dlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlJhZGlvQnV0dG9uSWRlbnRDYXNlVXBwZXIgPSBuZXcgQnV0dG9uKGlkZW50Q2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uSWRlbnRDYXNlVXBwZXIuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlVwcGVyX1VJXyk7Ci0JCWZSYWRpb0J1dHRvbklkZW50Q2FzZVVwcGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIENvbnZlcnQgcHJvcGVydHkgbmFtZSBjYXNlCi0JCS8vIEFDQzogR3JvdXAgcmFkaW8gYnV0dG9ucyB0b2dldGhlciBzbyBhc3NvY2lhdGVkIGxhYmVsIGlzIHJlYWQKLQkJLy8JCUxhYmVsIHByb3BOYW1lQ2FzZUxhYmVsID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCS8vCQlwcm9wTmFtZUNhc2VMYWJlbC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlByb3BlcnR5X25hbWVfY2FzZV9fVUlfIikpOwotCQkvLyAvLyROT04tTkxTLTEkID0gIlByb3BlcnR5IG5hbWUgY2FzZToiCi0JCS8vCQlDYW52YXMgcHJvcE5hbWVDYXNlID0gbmV3IENhbnZhcyhwYW5lbCwgU1dULk5VTEwpOwotCQlHcm91cCBwcm9wTmFtZUNhc2UgPSBuZXcgR3JvdXAocGFuZWwsIFNXVC5OVUxMKTsKLQkJcHJvcE5hbWVDYXNlLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Qcm9wZXJ0eV9uYW1lX2Nhc2VfX1VJXyk7Ci0JCWhMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQloTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlwcm9wTmFtZUNhc2Uuc2V0TGF5b3V0KGhMYXlvdXQpOwotCQlmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VBc2lzID0gbmV3IEJ1dHRvbihwcm9wTmFtZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUFzaXMuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkFzX2lzX1VJXyk7Ci0JCWZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUFzaXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUxvd2VyID0gbmV3IEJ1dHRvbihwcm9wTmFtZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUxvd2VyLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Mb3dlcl9VSV8pOwotCQlmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VMb3dlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXIgPSBuZXcgQnV0dG9uKHByb3BOYW1lQ2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXIuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlVwcGVyX1VJXyk7Ci0JCWZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZVVwcGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIENvbnZlcnQgcHJvcGVydHkgVmFsdWUgY2FzZQotCQkvLyBBQ0M6IEdyb3VwIHJhZGlvIGJ1dHRvbnMgdG9nZXRoZXIgc28gYXNzb2NpYXRlZCBsYWJlbCBpcyByZWFkCi0JCS8vCQlMYWJlbCBwcm9wVmFsdWVDYXNlTGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5OVUxMKTsKLQkJLy8JCXByb3BWYWx1ZUNhc2VMYWJlbC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlByb3BlcnR5X3ZhbHVlX2Nhc2VfX1VJXyIpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJCA9ICJQcm9wZXJ0eSB2YWx1ZSBjYXNlOiIKLQkJLy8JCUNhbnZhcyBwcm9wVmFsdWVDYXNlID0gbmV3IENhbnZhcyhwYW5lbCwgU1dULk5VTEwpOwotCQlHcm91cCBwcm9wVmFsdWVDYXNlID0gbmV3IEdyb3VwKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCXByb3BWYWx1ZUNhc2Uuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlByb3BlcnR5X3ZhbHVlX2Nhc2VfX1VJXyk7Ci0JCWhMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQloTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlwcm9wVmFsdWVDYXNlLnNldExheW91dChoTGF5b3V0KTsKLQkJZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZUFzaXMgPSBuZXcgQnV0dG9uKHByb3BWYWx1ZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VBc2lzLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Bc19pc19VSV8pOwotCQlmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlQXNpcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZUxvd2VyID0gbmV3IEJ1dHRvbihwcm9wVmFsdWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlTG93ZXIuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkxvd2VyX1VJXyk7Ci0JCWZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VMb3dlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZVVwcGVyID0gbmV3IEJ1dHRvbihwcm9wVmFsdWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlVXBwZXIuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlVwcGVyX1VJXyk7Ci0JCWZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VVcHBlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlpZiAoIWlzRW1iZWRkZWRDU1MoKSkgewotCQkJLy8gQ29udmVydCBzZWxlY3RvciB0YWcgY2FzZQotCQkJLy8gQUNDOiBHcm91cCByYWRpbyBidXR0b25zIHRvZ2V0aGVyIHNvIGFzc29jaWF0ZWQgbGFiZWwgaXMgcmVhZAotCQkJLy8JCQlMYWJlbCBzZWxlY3RvclRhZ0Nhc2VMYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5VTEwpOwotCQkJLy8JCQlzZWxlY3RvclRhZ0Nhc2VMYWJlbC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlbGVjdG9yX3RhZ19uYW1lX2Nhc2VfX1VJXyIpKTsKLQkJCS8vIC8vJE5PTi1OTFMtMSQgPSAiU2VsZWN0b3IgdGFnIG5hbWUgY2FzZToiCi0JCQkvLwkJCUNhbnZhcyBzZWxlY3RvclRhZ0Nhc2UgPSBuZXcgQ2FudmFzKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCQlHcm91cCBzZWxlY3RvclRhZ0Nhc2UgPSBuZXcgR3JvdXAocGFuZWwsIFNXVC5OVUxMKTsKLQkJCXNlbGVjdG9yVGFnQ2FzZS5zZXRUZXh0KENTU1VJTWVzc2FnZXMuU2VsZWN0b3JfdGFnX25hbWVfY2FzZV9fVUlfKTsKLQkJCWhMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJaExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJCXNlbGVjdG9yVGFnQ2FzZS5zZXRMYXlvdXQoaExheW91dCk7Ci0JCQlmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VBc2lzID0gbmV3IEJ1dHRvbihzZWxlY3RvclRhZ0Nhc2UsIFNXVC5SQURJTyk7Ci0JCQlmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VBc2lzLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Bc19pc19VSV8pOwotCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlQXNpcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZUxvd2VyID0gbmV3IEJ1dHRvbihzZWxlY3RvclRhZ0Nhc2UsIFNXVC5SQURJTyk7Ci0JCQlmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VMb3dlci5zZXRUZXh0KENTU1VJTWVzc2FnZXMuTG93ZXJfVUlfKTsKLQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZUxvd2VyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlVXBwZXIgPSBuZXcgQnV0dG9uKHNlbGVjdG9yVGFnQ2FzZSwgU1dULlJBRElPKTsKLQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZVVwcGVyLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5VcHBlcl9VSV8pOwotCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlVXBwZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJCUdyb3VwIHNlbGVjdG9ySWRDYXNlID0gbmV3IEdyb3VwKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCQlzZWxlY3RvcklkQ2FzZS5zZXRUZXh0KENTU1VJTWVzc2FnZXMuSURfU2VsZWN0b3JfQ2FzZV9fVUlfKTsKLQkJCWhMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJaExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJCXNlbGVjdG9ySWRDYXNlLnNldExheW91dChoTGF5b3V0KTsKLQkJCWZSYWRpb0J1dHRvblNlbGVjdG9ySWRDYXNlQXNpcyA9IG5ldyBCdXR0b24oc2VsZWN0b3JJZENhc2UsIFNXVC5SQURJTyk7Ci0JCQlmUmFkaW9CdXR0b25TZWxlY3RvcklkQ2FzZUFzaXMuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkFzX2lzX1VJXyk7Ci0JCQlmUmFkaW9CdXR0b25TZWxlY3RvcklkQ2FzZUFzaXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlmUmFkaW9CdXR0b25TZWxlY3RvcklkQ2FzZUxvd2VyID0gbmV3IEJ1dHRvbihzZWxlY3RvcklkQ2FzZSwgU1dULlJBRElPKTsKLQkJCWZSYWRpb0J1dHRvblNlbGVjdG9ySWRDYXNlTG93ZXIuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkxvd2VyX1VJXyk7Ci0JCQlmUmFkaW9CdXR0b25TZWxlY3RvcklkQ2FzZUxvd2VyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JJZENhc2VVcHBlciA9IG5ldyBCdXR0b24oc2VsZWN0b3JJZENhc2UsIFNXVC5SQURJTyk7Ci0JCQlmUmFkaW9CdXR0b25TZWxlY3RvcklkQ2FzZVVwcGVyLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5VcHBlcl9VSV8pOwotCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JJZENhc2VVcHBlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkJR3JvdXAgc2VsZWN0b3JDbGFzc0Nhc2UgPSBuZXcgR3JvdXAocGFuZWwsIFNXVC5OVUxMKTsKLQkJCXNlbGVjdG9yQ2xhc3NDYXNlLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5DbGFzc19TZWxlY3Rvcl9DYXNlX19VSV8pOwotCQkJaExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQloTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQkJc2VsZWN0b3JDbGFzc0Nhc2Uuc2V0TGF5b3V0KGhMYXlvdXQpOwotCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JDbGFzc0Nhc2VBc2lzID0gbmV3IEJ1dHRvbihzZWxlY3RvckNsYXNzQ2FzZSwgU1dULlJBRElPKTsKLQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yQ2xhc3NDYXNlQXNpcy5zZXRUZXh0KENTU1VJTWVzc2FnZXMuQXNfaXNfVUlfKTsKLQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yQ2xhc3NDYXNlQXNpcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yQ2xhc3NDYXNlTG93ZXIgPSBuZXcgQnV0dG9uKHNlbGVjdG9yQ2xhc3NDYXNlLCBTV1QuUkFESU8pOwotCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JDbGFzc0Nhc2VMb3dlci5zZXRUZXh0KENTU1VJTWVzc2FnZXMuTG93ZXJfVUlfKTsKLQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yQ2xhc3NDYXNlTG93ZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlmUmFkaW9CdXR0b25TZWxlY3RvckNsYXNzQ2FzZVVwcGVyID0gbmV3IEJ1dHRvbihzZWxlY3RvckNsYXNzQ2FzZSwgU1dULlJBRElPKTsKLQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yQ2xhc3NDYXNlVXBwZXIuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlVwcGVyX1VJXyk7Ci0JCQlmUmFkaW9CdXR0b25TZWxlY3RvckNsYXNzQ2FzZVVwcGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJLy8gUXVvdGUgYXR0cmlidXRlIHZhbHVlcwotCQlmQ2hlY2tCb3hRdW90ZVZhbHVlcyA9IG5ldyBCdXR0b24ocGFuZWwsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveFF1b3RlVmFsdWVzLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5RdW90ZV92YWx1ZXNfVUlfKTsKLQkJZkNoZWNrQm94UXVvdGVWYWx1ZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJaWYgKCFpc0VtYmVkZGVkQ1NTKCkpIHsKLQkJCS8vIEZvcm1hdCBzb3VyY2UKLQkJCWZDaGVja0JveEZvcm1hdFNvdXJjZSA9IG5ldyBCdXR0b24ocGFuZWwsIFNXVC5DSEVDSyk7Ci0JCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2Uuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkZvcm1hdF9zb3VyY2VfVUlfKTsKLQkJCWZDaGVja0JveEZvcm1hdFNvdXJjZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCXNldENsZWFudXBPcHRpb25zKCk7Ci0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtYmVkZGVkQ1NTKCkgewotCQlyZXR1cm4gZW1iZWRkZWRDU1M7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJdXBkYXRlQ2xlYW51cE9wdGlvbnMoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldENsZWFudXBPcHRpb25zKCkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IENTU0NsZWFudXBTdHJhdGVneUltcGwuZ2V0SW5zdGFuY2UoKTsKLQotCQlpZiAoZlJhZGlvQnV0dG9uSWRlbnRDYXNlQXNpcyAhPSBudWxsKSB7Ci0JCQlpZiAoc3RneS5nZXRJZGVudENhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJZlJhZGlvQnV0dG9uSWRlbnRDYXNlVXBwZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZSBpZiAoc3RneS5nZXRJZGVudENhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuTE9XRVIpCi0JCQkJZlJhZGlvQnV0dG9uSWRlbnRDYXNlTG93ZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZQotCQkJCWZSYWRpb0J1dHRvbklkZW50Q2FzZUFzaXMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0KLQkJaWYgKGZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUFzaXMgIT0gbnVsbCkgewotCQkJaWYgKHN0Z3kuZ2V0UHJvcE5hbWVDYXNlKCkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKQotCQkJCWZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZVVwcGVyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWVsc2UgaWYgKHN0Z3kuZ2V0UHJvcE5hbWVDYXNlKCkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LkxPV0VSKQotCQkJCWZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUxvd2VyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWVsc2UKLQkJCQlmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VBc2lzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCi0JCWlmIChmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlQXNpcyAhPSBudWxsKSB7Ci0JCQlpZiAoc3RneS5nZXRQcm9wVmFsdWVDYXNlKCkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKQotCQkJCWZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VVcHBlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlIGlmIChzdGd5LmdldFByb3BWYWx1ZUNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuTE9XRVIpCi0JCQkJZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZUxvd2VyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWVsc2UKLQkJCQlmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlQXNpcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQotCQlpZiAoZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlQXNpcyAhPSBudWxsKSB7Ci0JCQlpZiAoc3RneS5nZXRTZWxlY3RvclRhZ0Nhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlVXBwZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZSBpZiAoc3RneS5nZXRTZWxlY3RvclRhZ0Nhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuTE9XRVIpCi0JCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlTG93ZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZQotCQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZUFzaXMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0KLQkJaWYgKGZSYWRpb0J1dHRvblNlbGVjdG9ySWRDYXNlQXNpcyAhPSBudWxsKSB7Ci0JCQlpZiAoc3RneS5nZXRJZFNlbGVjdG9yQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5VUFBFUikKLQkJCQlmUmFkaW9CdXR0b25TZWxlY3RvcklkQ2FzZVVwcGVyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWVsc2UgaWYgKHN0Z3kuZ2V0SWRTZWxlY3RvckNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuTE9XRVIpCi0JCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JJZENhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlCi0JCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JJZENhc2VBc2lzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCi0JCWlmIChmUmFkaW9CdXR0b25TZWxlY3RvckNsYXNzQ2FzZUFzaXMgIT0gbnVsbCkgewotCQkJaWYgKHN0Z3kuZ2V0Q2xhc3NTZWxlY3RvckNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JDbGFzc0Nhc2VVcHBlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlIGlmIChzdGd5LmdldENsYXNzU2VsZWN0b3JDYXNlKCkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LkxPV0VSKQotCQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yQ2xhc3NDYXNlTG93ZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZQotCQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yQ2xhc3NDYXNlQXNpcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQotCQlpZiAoZkNoZWNrQm94UXVvdGVWYWx1ZXMgIT0gbnVsbCkKLQkJCWZDaGVja0JveFF1b3RlVmFsdWVzLnNldFNlbGVjdGlvbihzdGd5LmlzUXVvdGVWYWx1ZXMoKSk7Ci0KLQkJaWYgKGZDaGVja0JveEZvcm1hdFNvdXJjZSAhPSBudWxsKQotCQkJZkNoZWNrQm94Rm9ybWF0U291cmNlLnNldFNlbGVjdGlvbihzdGd5LmlzRm9ybWF0U291cmNlKCkpOwotCi0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdFbWJlZGRlZENTUwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVtYmVkZGVkQ1NTKGJvb2xlYW4gbmV3RW1iZWRkZWRDU1MpIHsKLQkJZW1iZWRkZWRDU1MgPSBuZXdFbWJlZGRlZENTUzsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2xlYW51cE9wdGlvbnMoKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbC5nZXRJbnN0YW5jZSgpOwotCi0JCWlmIChmUmFkaW9CdXR0b25JZGVudENhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChmUmFkaW9CdXR0b25JZGVudENhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkKLQkJCQlzdGd5LnNldElkZW50Q2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpOwotCQkJZWxzZSBpZiAoZlJhZGlvQnV0dG9uSWRlbnRDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRJZGVudENhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LkxPV0VSKTsKLQkJCWVsc2UKLQkJCQlzdGd5LnNldElkZW50Q2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuQVNJUyk7Ci0JCX0KLQotCQlpZiAoZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlQXNpcyAhPSBudWxsKSB7Ci0JCQlpZiAoZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRQcm9wTmFtZUNhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKTsKLQkJCWVsc2UgaWYgKGZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKQotCQkJCXN0Z3kuc2V0UHJvcE5hbWVDYXNlKENTU0NsZWFudXBTdHJhdGVneS5MT1dFUik7Ci0JCQllbHNlCi0JCQkJc3RneS5zZXRQcm9wTmFtZUNhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LkFTSVMpOwotCQl9Ci0KLQkJaWYgKGZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRQcm9wVmFsdWVDYXNlKENTU0NsZWFudXBTdHJhdGVneS5VUFBFUik7Ci0JCQllbHNlIGlmIChmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRQcm9wVmFsdWVDYXNlKENTU0NsZWFudXBTdHJhdGVneS5MT1dFUik7Ci0JCQllbHNlCi0JCQkJc3RneS5zZXRQcm9wVmFsdWVDYXNlKENTU0NsZWFudXBTdHJhdGVneS5BU0lTKTsKLQkJfQotCi0JCWlmIChmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkKLQkJCQlzdGd5LnNldFNlbGVjdG9yVGFnQ2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpOwotCQkJZWxzZSBpZiAoZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRTZWxlY3RvclRhZ0Nhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LkxPV0VSKTsKLQkJCWVsc2UKLQkJCQlzdGd5LnNldFNlbGVjdG9yVGFnQ2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuQVNJUyk7Ci0JCX0KLQotCQlpZiAoZlJhZGlvQnV0dG9uU2VsZWN0b3JJZENhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChmUmFkaW9CdXR0b25TZWxlY3RvcklkQ2FzZVVwcGVyLmdldFNlbGVjdGlvbigpKQotCQkJCXN0Z3kuc2V0SWRTZWxlY3RvckNhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKTsKLQkJCWVsc2UgaWYgKGZSYWRpb0J1dHRvblNlbGVjdG9ySWRDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRJZFNlbGVjdG9yQ2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuTE9XRVIpOwotCQkJZWxzZQotCQkJCXN0Z3kuc2V0SWRTZWxlY3RvckNhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LkFTSVMpOwotCQl9Ci0KLQkJaWYgKGZSYWRpb0J1dHRvblNlbGVjdG9yQ2xhc3NDYXNlQXNpcyAhPSBudWxsKSB7Ci0JCQlpZiAoZlJhZGlvQnV0dG9uU2VsZWN0b3JDbGFzc0Nhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkKLQkJCQlzdGd5LnNldENsYXNzU2VsZWN0b3JDYXNlKENTU0NsZWFudXBTdHJhdGVneS5VUFBFUik7Ci0JCQllbHNlIGlmIChmUmFkaW9CdXR0b25TZWxlY3RvckNsYXNzQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKQotCQkJCXN0Z3kuc2V0Q2xhc3NTZWxlY3RvckNhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LkxPV0VSKTsKLQkJCWVsc2UKLQkJCQlzdGd5LnNldENsYXNzU2VsZWN0b3JDYXNlKENTU0NsZWFudXBTdHJhdGVneS5BU0lTKTsKLQkJfQotCi0JCWlmIChmQ2hlY2tCb3hRdW90ZVZhbHVlcyAhPSBudWxsKQotCQkJc3RneS5zZXRRdW90ZVZhbHVlcyhmQ2hlY2tCb3hRdW90ZVZhbHVlcy5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJaWYgKGZDaGVja0JveEZvcm1hdFNvdXJjZSAhPSBudWxsKQotCQkJc3RneS5zZXRGb3JtYXRTb3VyY2UoZkNoZWNrQm94Rm9ybWF0U291cmNlLmdldFNlbGVjdGlvbigpKTsKLQotCQkvLyBzYXZlIHRoZXNlIHZhbHVlcyB0byBwcmVmZXJlbmNlcwotCQkoKENTU0NsZWFudXBTdHJhdGVneUltcGwpIHN0Z3kpLnNhdmVPcHRpb25zKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlib29sZWFuIG9rRW5hYmxlZCA9IGZDaGVja0JveEZvcm1hdFNvdXJjZS5nZXRTZWxlY3Rpb24oKQotCQl8fCBmQ2hlY2tCb3hRdW90ZVZhbHVlcy5nZXRTZWxlY3Rpb24oKQotCQl8fCAoKGZSYWRpb0J1dHRvbklkZW50Q2FzZUxvd2VyICE9IG51bGwgJiYgZlJhZGlvQnV0dG9uSWRlbnRDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpIHx8IChmUmFkaW9CdXR0b25JZGVudENhc2VVcHBlciAhPSBudWxsICYmIGZSYWRpb0J1dHRvbklkZW50Q2FzZVVwcGVyLmdldFNlbGVjdGlvbigpKSkKLQkJfHwgKChmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VMb3dlciAhPSBudWxsICYmIGZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKSB8fCAoZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXIgIT0gbnVsbCAmJiBmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkpCi0JCXx8ICgoZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZUxvd2VyICE9IG51bGwgJiYgZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKSB8fCAoZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZVVwcGVyICE9IG51bGwgJiYgZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZVVwcGVyLmdldFNlbGVjdGlvbigpKSkKLQkJfHwgKChmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VMb3dlciAhPSBudWxsICYmIGZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKSB8fCAoZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlVXBwZXIgIT0gbnVsbCAmJiBmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkpCi0JCXx8ICgoZlJhZGlvQnV0dG9uU2VsZWN0b3JJZENhc2VMb3dlciAhPSBudWxsICYmIGZSYWRpb0J1dHRvblNlbGVjdG9ySWRDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpIHx8IChmUmFkaW9CdXR0b25TZWxlY3RvcklkQ2FzZVVwcGVyICE9IG51bGwgJiYgZlJhZGlvQnV0dG9uU2VsZWN0b3JJZENhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkpCi0JCXx8ICgoZlJhZGlvQnV0dG9uU2VsZWN0b3JDbGFzc0Nhc2VMb3dlciAhPSBudWxsICYmIGZSYWRpb0J1dHRvblNlbGVjdG9yQ2xhc3NDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpIHx8IChmUmFkaW9CdXR0b25TZWxlY3RvckNsYXNzQ2FzZVVwcGVyICE9IG51bGwgJiYgZlJhZGlvQnV0dG9uU2VsZWN0b3JDbGFzc0Nhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkpCi0JCTsKLQkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKG9rRW5hYmxlZCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCXdpZGdldFNlbGVjdGVkKGUpOwotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdG9yL0NTU0VkaXRvclBsdWdpbkltYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXRvci9DU1NFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU1OWU5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdG9yL0NTU0VkaXRvclBsdWdpbkltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvcjsKLQotCi0vKioKLSAqIEJ1bmRsZSBvZiBtb3N0IGltYWdlcyB1c2VkIGJ5IHRoZSBDU1MgU291cmNlIEVkaXRvciBwbHVnLWluLgotICovCi1wdWJsaWMgY2xhc3MgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1NPUlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9zb3J0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfU1RZTEVTSEVFVCA9ICJpY29ucy9mdWxsL29iajE2L3N0eWxlc2hlZXQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfUlVMRV9DSEFSU0VUID0gImljb25zL2Z1bGwvb2JqMTYvY2hhcnNldF9ydWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1JVTEVfRk9OVEZBQ0UgPSAiaWNvbnMvZnVsbC9vYmoxNi9mb250ZmFjZV9ydWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1JVTEVfSU1QT1JUID0gImljb25zL2Z1bGwvb2JqMTYvbGlua19ydWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1JVTEVfTUVESUEgPSAiaWNvbnMvZnVsbC9vYmoxNi9tZWRpYV9ydWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1JVTEVfUEFHRSA9ICJpY29ucy9mdWxsL29iajE2L3BhZ2VfcnVsZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9SVUxFX1NUWUxFID0gImljb25zL2Z1bGwvb2JqMTYvc3R5bGVfcnVsZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9SVUxFX1VOS05PV04gPSAiaWNvbnMvZnVsbC9vYmoxNi91bmtub3duX3J1bGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9TRUxFQ1RPUl9DTEFTUyA9ICJpY29ucy9mdWxsL29iajE2L2NsYXNzX3NlbGVjdG9yLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1NFTEVDVE9SX0lEID0gImljb25zL2Z1bGwvb2JqMTYvaWRfc2VsZWN0b3IuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfU0VMRUNUT1JfUFNFVURPID0gImljb25zL2Z1bGwvb2JqMTYvcHNldWRvLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1NFTEVDVE9SX1RBRyA9ICJpY29ucy9mdWxsL29iajE2L3RhZ19zZWxlY3Rvci5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9TRUxFQ1RPUl9MSU5LID0gImljb25zL2Z1bGwvb2JqMTYvbGlua19zZWxlY3Rvci5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9TRUxFQ1RPUl9ERUZBVUxUID0gImljb25zL2Z1bGwvb2JqMTYvdGFnX3NlbGVjdG9yLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVkFMVUVfRlVOQ1RJT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV9mdW5jdGlvbi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9WQUxVRV9OVU1CRVIgPSAiaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV91bml0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1ZBTFVFX1NUUklORyA9ICJpY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX2lkZW50aWZpZXIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9BVVJBTCA9ICJpY29ucy9mdWxsL29iajE2L2F1cmFsX3Byb3BzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NBVEVHT1JZX0JPWCA9ICJpY29ucy9mdWxsL29iajE2L2JveG1vZGVsX3Byb3BzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NBVEVHT1JZX0NPTE9SQU5EQkFDS0dST1VORCA9ICJpY29ucy9mdWxsL29iajE2L2NvbGJhY2tfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfQ09OVEVOVCA9ICJpY29ucy9mdWxsL29iajE2L2NvbnRlbnRfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfRk9OVCA9ICJpY29ucy9mdWxsL29iajE2L2ZvbnRfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfUEFHRSA9ICJpY29ucy9mdWxsL29iajE2L3BhZ2VkbWVkaWFfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfVEFCTEVTID0gImljb25zL2Z1bGwvb2JqMTYvdGFibGVfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfVEVYVCA9ICJpY29ucy9mdWxsL29iajE2L3RleHRfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfVUkgPSAiaWNvbnMvZnVsbC9vYmoxNi91aV9wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9WSVNVQUwgPSAiaWNvbnMvZnVsbC9vYmoxNi92aXN1YWxfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfREVGQVVMVCA9ICJpY29ucy9mdWxsL29iajE2L290aGVyX3Byb3BzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RFTVBMQVRFID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLXRlbXBsYXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laQkFOX05FV0NTU0ZJTEUgPSAiaWNvbnMvZnVsbC93aXpiYW4vbmV3Y3NzZmlsZV93aXoucG5nIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0b3IvQ1NTU2VsZWN0aW9uQ29udmVydGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXRvci9DU1NTZWxlY3Rpb25Db252ZXJ0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZGUwOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXRvci9DU1NTZWxlY3Rpb25Db252ZXJ0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU05vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5TZWxlY3Rpb25Db252ZXJ0b3I7Ci0KLS8qKgotICogPHA+RmFjdG9yeSB0byBhZGFwdCBmcm9tIHtAbGluayBJQ1NTTW9kZWx9IHRvIHtAbGluayBTZWxlY3Rpb25Db252ZXJ0b3J9PC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ1NTU2VsZWN0aW9uQ29udmVydGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKiogdGhlIGxpc3Qgb2YgY2xhc3NlcyB0aGlzIGZhY3RvcnkgY2FuIGFkYXB0IHRvICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBREFQVEVSX0xJU1QgPSBuZXcgQ2xhc3NbXXtTZWxlY3Rpb25Db252ZXJ0b3IuY2xhc3N9OwotCQotCS8qKiB0aGUgYWRhcHRlZCBjbGFzcyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBzZWxlY3Rpb25Db252ZXJ0b3IgPSBuZXcgQ1NTU2VsZWN0aW9uQ29udmVydGVyKCk7Ci0JCi0JLyoqCi0JICogPHA+RGVmYXVsdCBjb25zdHJ1Y3RvcjwvcD4KLQkgKi8KLQlwdWJsaWMgQ1NTU2VsZWN0aW9uQ29udmVydGVyRmFjdG9yeSgpIHsKLQl9Ci0JCi0JLyoqCi0JICogPHA+QWRhcHRzIHtAbGluayBJQ1NTTW9kZWx9IHRvIHtAbGluayBTZWxlY3Rpb25Db252ZXJ0b3J9PC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBudWxsOwotCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSUNTU01vZGVsICYmIFNlbGVjdGlvbkNvbnZlcnRvci5jbGFzcy5lcXVhbHMoYWRhcHRlclR5cGUpKSB7Ci0JCQlhZGFwdGVyID0gc2VsZWN0aW9uQ29udmVydG9yOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIDxwPkFkYXB0cyB0byB7QGxpbmsgU2VsZWN0aW9uQ29udmVydG9yfTwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlckxpc3QoKQotCSAqLwotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gQURBUFRFUl9MSVNUOwotCX0KLQkKLQkvKioKLQkgKiA8cD57QGxpbmsgU2VsZWN0aW9uQ29udmVydG9yfSBzcGVjaWZpYyB0byBDU1M8L3A+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ1NTU2VsZWN0aW9uQ29udmVydGVyIGV4dGVuZHMgU2VsZWN0aW9uQ29udmVydG9yIHsKLQkJLyoqCi0JCSAqIDxwPkRlZmF1bHQgY29uc3RydWN0b3I8L3A+Ci0JCSAqLwotCQlwdWJsaWMgQ1NTU2VsZWN0aW9uQ29udmVydGVyKCkgewotCQl9Ci0JCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5TZWxlY3Rpb25Db252ZXJ0b3IjZ2V0RWxlbWVudHMob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWwsIGludCwgaW50KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGludCBzdGFydCwgaW50IGVuZCkgewotCQkJT2JqZWN0W10gbG9jYWxTZWxlY3RlZFN0cnVjdHVyZXMgPSBudWxsOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlJbmRleGVkUmVnaW9uIHJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnQpOwotCQkJCQotCQkJCS8qIGluIENTUyBkb2NzIHdoaXRlc3BhY2UgaXMgb3duZWQgYnkgdGhlIHN0eWxlIHNoZWV0Ci0JCQkJICogdGhpcyBpcyB0byBmaW5kIHRoZSBmaXJzdCBub25lIHdoaXRlc3BhY2UgcmVnaW9uCi0JCQkJICovCi0JCQkJaWYocmVnaW9uIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBzZWxlY3Rpb24gPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXQoc3RhcnQsIGVuZCk7Ci0JCQkJCQlpbnQgd2hpdGVzcGFjZUxlbmd0aCA9IGJlZ2luaW5nV2hpdGVzcGFjZUxlbmd0aChzZWxlY3Rpb24pOwotCQkJCQkJcmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydCt3aGl0ZXNwYWNlTGVuZ3RoKzEpOwotCQkJCQl9IGNhdGNoKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vc2hvdWxkIG5ldmVyIGJlIGFibGUgdG8gaGFwcGVuCi0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJCYWQgbG9jYXRpb24gb24gc2VsZWN0aW9uLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4iLCBlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQkvLyBpZiBzaW5nbGUgc2VsZWN0aW9uIHNwYW5zIHNlbGVjdGVkIHJlZ2lvbgotCQkJCQkvLyBlbHNlIG11bHRpcGxlIHNlbGVjdGlvbgotCQkJCQlpZiAoZW5kIDw9IHJlZ2lvbi5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkJLy8gc2luZ2xlIHNlbGVjdGlvbgotCQkJCQkJbG9jYWxTZWxlY3RlZFN0cnVjdHVyZXMgPSBuZXcgT2JqZWN0WzFdOwotCQkJCQkJbG9jYWxTZWxlY3RlZFN0cnVjdHVyZXNbMF0gPSByZWdpb247Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpbnQgbWF4TGVuZ3RoID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQlMaXN0IHN0cnVjdHVyZXMgPSBuZXcgQXJyYXlMaXN0KDIpOwotCQkJCQkJd2hpbGUgKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRFbmRPZmZzZXQoKSA8PSBlbmQgJiYgcmVnaW9uLmdldEVuZE9mZnNldCgpIDw9IG1heExlbmd0aCkgewotCQkJCQkJCXN0cnVjdHVyZXMuYWRkKHJlZ2lvbik7Ci0JCQkJCQkJCi0JCQkJCQkJLy91c2UgdGhlIENTUyBtb2RlbCB0byBmaW5kIHRoZSBuZXh0IHNpYmxpbmcKLQkJCQkJCQlib29sZWFuIGZvdW5kTmV4dFNpYmxpbmcgPSBmYWxzZTsKLQkJCQkJCQlpZihyZWdpb24gaW5zdGFuY2VvZiBDU1NOb2RlSW1wbCApIHsKLQkJCQkJCQkJSUNTU05vZGUgbm9kZSA9ICgoSUNTU05vZGUpcmVnaW9uKS5nZXROZXh0U2libGluZygpOwotCQkJCQkJCQlpZihub2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJCQkJcmVnaW9uID0gKEluZGV4ZWRSZWdpb24pbm9kZTsKLQkJCQkJCQkJCWZvdW5kTmV4dFNpYmxpbmcgPSB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCWlmKCFmb3VuZE5leHRTaWJsaW5nKSB7Ci0JCQkJCQkJCXJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24ocmVnaW9uLmdldEVuZE9mZnNldCgpICsgMSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJbG9jYWxTZWxlY3RlZFN0cnVjdHVyZXMgPSBzdHJ1Y3R1cmVzLnRvQXJyYXkoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChsb2NhbFNlbGVjdGVkU3RydWN0dXJlcyA9PSBudWxsKSB7Ci0JCQkJbG9jYWxTZWxlY3RlZFN0cnVjdHVyZXMgPSBuZXcgT2JqZWN0WzBdOwotCQkJfQotCQkJcmV0dXJuIGxvY2FsU2VsZWN0ZWRTdHJ1Y3R1cmVzOwotCQl9Ci0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHMgZmluZCB0aGUgbGVuZ3RoIG9mIHRoZSB3aGl0ZXNwYWNlIHByZWNlZGluZyB0aGlzIHtAbGluayBTdHJpbmd9Ci0JICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSB3aGl0ZXNwYWNlIHByZWNlZGluZyB0aGUgZ2l2ZW4ge0BsaW5rIFN0cmluZ30KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgYmVnaW5pbmdXaGl0ZXNwYWNlTGVuZ3RoKFN0cmluZyBzKSB7Ci0JCWludCBsZW5ndGggPSAwOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpICYmIGxlbmd0aCA9PSAwOyArK2kpIHsKLQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzLmNoYXJBdChpKSkpIHsKLQkJCQlsZW5ndGggPSBpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbGVuZ3RoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGM2MjJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotCi0vKioKLSAqIEhlbHAgY29udGV4dCBpZHMgZm9yIHRoZSBDU1MgU291cmNlIEVkaXRvci4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQotICogaW1wbGVtZW50ZWQuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSGVscENvbnRleHRJZHMgewotCS8vIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gQ1NTVUlQbHVnaW4uSUQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIC8vIGZpZ3VyZWQgb3V0IG9uIHRoZSBmbHkKLQkvLyAvLyBDU1MgU291cmNlIHBhZ2UgZWRpdG9yCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NPVVJDRVZJRVdfSEVMUElEID0KLQkvLyBDb250ZW50VHlwZUlkRm9yQ1NTLkNvbnRlbnRUeXBlSURfQ1NTICsiX3NvdXJjZV9IZWxwSWQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDU1MgRmlsZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAxMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBDU1MgU291cmNlIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19QUkVGV0VCWF9TT1VSQ0VfSEVMUElEID0gUFJFRklYICsgIndlYngwMDExIjsgLy8kTk9OLU5MUy0xJAotCS8vIENTUyBTdHlsZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMTIiOyAvLyROT04tTkxTLTEkCi0JLy8gQ1NTIFRlbXBsYXRlIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19QUkVGV0VCWF9URU1QTEFURVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDEzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gQ1NTIENsZWFudXAgZGlhbG9nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0NMRUFOVVBfSEVMUElEID0gUFJFRklYICsgInhtbG0xMzAwIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gQ1NTIENvbnRlbnQgU2V0dGluZ3MKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfQ09OVEVOVF9TRVRUSU5HU19IRUxQSUQgPSBQUkVGSVggKyAibWlzYzAxODAiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gQ1NTIE5ldyBGaWxlIFdpemFyZCAtIFRlbXBsYXRlIFBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfTkVXV0laQVJEX1RFTVBMQVRFX0hFTFBJRCA9IFBSRUZJWCArICJjc3N3MDAxMCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9oYW5kbGVycy9BYnN0cmFjdENvbW1lbnRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQWJzdHJhY3RDb21tZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDEyMmZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9oYW5kbGVycy9BYnN0cmFjdENvbW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdENvbW1lbnRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9DT01NRU5UID0gIi8qIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU0VfQ09NTUVOVCA9ICIqLyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBnZXRUZXh0RWRpdG9yKGV2ZW50KTsKLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24KLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gZ2V0Q3VycmVudFNlbGVjdGlvbih0ZXh0RWRpdG9yKTsKLQkJCQlpZiAodGV4dFNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHJvY2Vzc0FjdGlvbih0ZXh0RWRpdG9yLCBkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQWN0aW9uKElUZXh0RWRpdG9yIGVkaXRvciwgSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JfQotCi0JcHJvdGVjdGVkIElUZXh0RWRpdG9yIGdldFRleHRFZGl0b3IoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSGFuZGxlclV0aWwuZ2V0QWN0aXZlRWRpdG9yKGV2ZW50KTsKLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvcjsKLQkJZWxzZSB7Ci0JCQlPYmplY3QgbyA9IGVkaXRvci5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJCWlmIChvICE9IG51bGwpCi0JCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgbzsKLQkJfQotCQlyZXR1cm4gdGV4dEVkaXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yKSB7Ci0JCUlTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gcHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQlyZXR1cm4gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFRleHRTZWxlY3Rpb24uZW1wdHlTZWxlY3Rpb24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVPcGVuQ2xvc2VDb21tZW50cyhJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJdHJ5IHsKLQkJCWludCBhZGp1c3RlZF9sZW5ndGggPSBsZW5ndGg7Ci0KLQkJCS8vIHJlbW92ZSBvcGVuIGNvbW1lbnRzCi0JCQlTdHJpbmcgc3RyaW5nID0gZG9jdW1lbnQuZ2V0KG9mZnNldCwgbGVuZ3RoKTsKLQkJCWludCBpbmRleCA9IHN0cmluZy5sYXN0SW5kZXhPZihPUEVOX0NPTU1FTlQpOwotCQkJd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0JCQkJZG9jdW1lbnQucmVwbGFjZShvZmZzZXQgKyBpbmRleCwgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmRleCA9IHN0cmluZy5sYXN0SW5kZXhPZihPUEVOX0NPTU1FTlQsIGluZGV4IC0gMSk7Ci0JCQkJYWRqdXN0ZWRfbGVuZ3RoIC09IE9QRU5fQ09NTUVOVC5sZW5ndGgoKTsKLQkJCX0KLQotCQkJLy8gcmVtb3ZlIGNsb3NlIGNvbW1lbnRzCi0JCQlzdHJpbmcgPSBkb2N1bWVudC5nZXQob2Zmc2V0LCBhZGp1c3RlZF9sZW5ndGgpOwotCQkJaW5kZXggPSBzdHJpbmcubGFzdEluZGV4T2YoQ0xPU0VfQ09NTUVOVCk7Ci0JCQl3aGlsZSAoaW5kZXggIT0gLTEpIHsKLQkJCQlkb2N1bWVudC5yZXBsYWNlKG9mZnNldCArIGluZGV4LCBDTE9TRV9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmRleCA9IHN0cmluZy5sYXN0SW5kZXhPZihDTE9TRV9DT01NRU5ULCBpbmRleCAtIDEpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQWRkQmxvY2tDb21tZW50SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL0FkZEJsb2NrQ29tbWVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyYjBkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQWRkQmxvY2tDb21tZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQWRkQmxvY2tDb21tZW50SGFuZGxlciBleHRlbmRzIEFic3RyYWN0Q29tbWVudEhhbmRsZXIgewotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0FjdGlvbihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwotCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCXRyeSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFJlZ2lvbiA9IGRvYy5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFJlZ2lvbiA9IGRvYy5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0KLQkJCQlpZiAoc3RhcnRSZWdpb24gPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICgoZW5kUmVnaW9uID09IG51bGwpICYmICh0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpID4gMCkpIHsKLQkJCQkJZW5kUmVnaW9uID0gZG9jLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpIC0gMSk7Ci0JCQkJfQotCQkJCWlmIChlbmRSZWdpb24gPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaW50IG9wZW5Db21tZW50T2Zmc2V0ID0gc3RhcnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgY2xvc2VDb21tZW50T2Zmc2V0ID0gZW5kUmVnaW9uLmdldEVuZE9mZnNldCgpICsgQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKTsKLQotCQkJCWlmICgodGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSA9PSAwKSAmJiAoc3RhcnRSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgQ1NTVUlNZXNzYWdlcy5BZGRCbG9ja0NvbW1lbnRfdG9vbHRpcCk7Ci0JCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQl0cnkgewotCQkJCQlkb2N1bWVudC5yZXBsYWNlKG9wZW5Db21tZW50T2Zmc2V0LCAwLCBPUEVOX0NPTU1FTlQpOwotCQkJCQlkb2N1bWVudC5yZXBsYWNlKGNsb3NlQ29tbWVudE9mZnNldCwgMCwgQ0xPU0VfQ09NTUVOVCk7Ci0JCQkJCXN1cGVyLnJlbW92ZU9wZW5DbG9zZUNvbW1lbnRzKGRvY3VtZW50LCBvcGVuQ29tbWVudE9mZnNldCArIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgY2xvc2VDb21tZW50T2Zmc2V0IC0gb3BlbkNvbW1lbnRPZmZzZXQgLSBDTE9TRV9DT01NRU5ULmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCW1vZGVsLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL0NsZWFudXBEb2N1bWVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9oYW5kbGVycy9DbGVhbnVwRG9jdW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjNiM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL0NsZWFudXBEb2N1bWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DbGVhbnVwUHJvY2Vzc29yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdC51aS5DbGVhbnVwRGlhbG9nQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwRG9jdW1lbnRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgewotCXByaXZhdGUgSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGZDbGVhbnVwUHJvY2Vzc29yOwotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbnVsbGluZyBvdXQganVzdCBpbiBjYXNlCi0JCWZDbGVhbnVwUHJvY2Vzc29yID0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZUVkaXRvcihldmVudCk7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yUGFydDsKLQkJZWxzZSB7Ci0JCQlPYmplY3QgbyA9IGVkaXRvclBhcnQuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQlpZiAobyAhPSBudWxsKQotCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIG87Ci0JCX0KLQkJCi0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCWZpbmFsIElUZXh0RWRpdG9yIGVkaXRvciA9IHRleHRFZGl0b3I7Ci0JCQlEaWFsb2cgY2xlYW51cERpYWxvZyA9IG5ldyBDbGVhbnVwRGlhbG9nQ1NTKGVkaXRvci5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQlpZiAoY2xlYW51cERpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJLy8gc2V0dXAgcnVubmFibGUKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IgPSBnZXRDbGVhbnVwUHJvY2Vzc29yKCk7Ci0JCQkJCQlpZiAoY2xlYW51cFByb2Nlc3NvciAhPSBudWxsKSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCQkJCQljbGVhbnVwUHJvY2Vzc29yLmNsZWFudXBNb2RlbChtb2RlbCk7Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0KLQkJCQkvLyBUT0RPOiBtYWtlIGluZGVwZW5kZW50IG9mICdtb2RlbCcuCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vIGJlZ2luIHJlY29yZGluZwotCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcKLQkJCQkJCS8vIG1vZGVsIGNoYW5nZQotCQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQkJCS8vIHJ1bgotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgcnVubmFibGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcKLQkJCQkJCS8vIG1vZGVsCi0JCQkJCQkvLyBjaGFuZ2UKLQkJCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCi0JCQkJCQkvLyBlbmQgcmVjb3JkaW5nCi0JCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMsIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZ2V0Q2xlYW51cFByb2Nlc3NvcigpIHsKLQkJaWYgKGZDbGVhbnVwUHJvY2Vzc29yID09IG51bGwpCi0JCQlmQ2xlYW51cFByb2Nlc3NvciA9IG5ldyBDbGVhbnVwUHJvY2Vzc29yQ1NTKCk7Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJvY2Vzc29yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9oYW5kbGVycy9SZW1vdmVCbG9ja0NvbW1lbnRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaGFuZGxlcnMvUmVtb3ZlQmxvY2tDb21tZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDA3OTA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9oYW5kbGVycy9SZW1vdmVCbG9ja0NvbW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVCbG9ja0NvbW1lbnRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RDb21tZW50SGFuZGxlciB7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQWN0aW9uKElUZXh0RWRpdG9yIHRleHRFZGl0b3IsIElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsICYmIGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJdHJ5IHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudDsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0UmVnaW9uID0gZG9jLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0gZG9jLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQotCQkJCWlmICgoc3RhcnRSZWdpb24gPT0gbnVsbCkgfHwgKGVuZFJlZ2lvbiA9PSBudWxsKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaW50IG9wZW5Db21tZW50T2Zmc2V0ID0gc3RhcnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgY2xvc2VDb21tZW50T2Zmc2V0ID0gZW5kUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gT1BFTl9DT01NRU5ULmxlbmd0aCgpIC0gQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKTsKLQotCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIENTU1VJTWVzc2FnZXMuUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXApOwotCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQkJdHJ5IHsKLQkJCQkJaWYgKHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJaWYgKHN0YXJ0UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJCWRvY3VtZW50LnJlcGxhY2Uob3BlbkNvbW1lbnRPZmZzZXQsIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZG9jdW1lbnQucmVwbGFjZShjbG9zZUNvbW1lbnRPZmZzZXQsIENMT1NFX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKHN0YXJ0UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJCWRvY3VtZW50LnJlcGxhY2Uob3BlbkNvbW1lbnRPZmZzZXQsIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0KLQkJCQkJCWlmIChlbmRSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQkJZG9jdW1lbnQucmVwbGFjZShjbG9zZUNvbW1lbnRPZmZzZXQsIENMT1NFX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJlbW92ZU9wZW5DbG9zZUNvbW1lbnRzKGRvY3VtZW50LCBvcGVuQ29tbWVudE9mZnNldCArIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgY2xvc2VDb21tZW50T2Zmc2V0IC0gb3BlbkNvbW1lbnRPZmZzZXQgLSBDTE9TRV9DT01NRU5ULmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCW1vZGVsLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaGFuZGxlcnMvU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZkNDcxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaGFuZGxlcnMvU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuaGFuZGxlcnMuQWJzdHJhY3RTdHJ1Y3R1cmVkU2VsZWN0SGFuZGxlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkU2VsZWN0SGFuZGxlciB7Ci0JCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbmRleGVkUmVnaW9uID0gZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQlJQ1NTTm9kZSBjdXJzb3JOb2RlID0gKElDU1NOb2RlKSBpbmRleGVkUmVnaW9uOwotCQkJUmVnaW9uIGN1cnNvck5vZGVSZWdpb24gPSBuZXcgUmVnaW9uKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgaW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpbnQgY3VycmVudE9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgY3VycmVudEVuZE9mZnNldCA9IGN1cnJlbnRPZmZzZXQgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpOwotCQkJaWYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPj0gY3VycmVudE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gY3VycmVudE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA8PSBjdXJyZW50RW5kT2Zmc2V0KSB7Ci0JCQkJSUNTU05vZGUgbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmKG5ld05vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uKSB7Ci0JCQkJCW5ld05vZGUgPSBuZXdOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQl9Ci0KLQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0TmV4dEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0TmV4dEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjY2IyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaGFuZGxlcnMvU3RydWN0dXJlZFNlbGVjdE5leHRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzLkFic3RyYWN0U3RydWN0dXJlZFNlbGVjdEhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0TmV4dEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRTZWxlY3RIYW5kbGVyIHsKLQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCWludCBvZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSAtIDE7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJb2Zmc2V0ID0gMDsKLQotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCi0JCWluZGV4ZWRSZWdpb24gPSBnZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50LCBvZmZzZXQpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQotCQlpZiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQlJQ1NTTm9kZSBjdXJzb3JOb2RlID0gKElDU1NOb2RlKSBpbmRleGVkUmVnaW9uOwotCi0JCQlSZWdpb24gY3Vyc29yTm9kZVJlZ2lvbiA9IG5ldyBSZWdpb24oaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBpbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCWludCBjdXJyZW50T2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKTsKLQkJCWludCBjdXJyZW50RW5kT2Zmc2V0ID0gY3VycmVudE9mZnNldCArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA+PSBjdXJyZW50T2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPD0gY3VycmVudEVuZE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PSBjdXJyZW50T2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQpIHsKLQkJCQlJQ1NTTm9kZSBuZXdOb2RlID0gY3Vyc29yTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCWlmIChuZXdOb2RlID09IG51bGwpIHsKLQkJCQkJbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKGN1cnJlbnRPZmZzZXQsIG5ld0luZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBjdXJyZW50T2Zmc2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCQluZXdSZWdpb24gPSBjdXJzb3JOb2RlUmVnaW9uOwotCQl9Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3RQcmV2aW91c0hhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MjdhNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3RQcmV2aW91c0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuaGFuZGxlcnMuQWJzdHJhY3RTdHJ1Y3R1cmVkU2VsZWN0SGFuZGxlcjsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RQcmV2aW91c0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRTZWxlY3RIYW5kbGVyIHsKLQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW5kZXhlZFJlZ2lvbiA9IGdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJSUNTU05vZGUgY3Vyc29yTm9kZSA9IChJQ1NTTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQotCQkJUmVnaW9uIGN1cnNvck5vZGVSZWdpb24gPSBuZXcgUmVnaW9uKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgaW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpbnQgY3VycmVudE9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgY3VycmVudEVuZE9mZnNldCA9IGN1cnJlbnRPZmZzZXQgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpOwotCQkJaWYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPj0gY3VycmVudE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gY3VycmVudE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA8PSBjdXJyZW50RW5kT2Zmc2V0KSB7Ci0JCQkJSUNTU05vZGUgbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJaWYgKG5ld05vZGUgPT0gbnVsbCkgewotCQkJCQluZXdOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBjdXJyZW50RW5kT2Zmc2V0IC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCQluZXdSZWdpb24gPSBjdXJzb3JOb2RlUmVnaW9uOwotCQl9Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL1RvZ2dsZUNvbW1lbnRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaGFuZGxlcnMvVG9nZ2xlQ29tbWVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E3ZGQ5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaGFuZGxlcnMvVG9nZ2xlQ29tbWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBUb2dnbGVDb21tZW50SGFuZGxlciBleHRlbmRzIEFic3RyYWN0Q29tbWVudEhhbmRsZXIgewotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0FjdGlvbihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJLy8gZ2V0IHRleHQgc2VsZWN0aW9uIGxpbmVzIGluZm8KLQkJaW50IHNlbGVjdGlvblN0YXJ0TGluZSA9IHRleHRTZWxlY3Rpb24uZ2V0U3RhcnRMaW5lKCk7Ci0JCWludCBzZWxlY3Rpb25FbmRMaW5lID0gdGV4dFNlbGVjdGlvbi5nZXRFbmRMaW5lKCk7Ci0JCXRyeSB7Ci0JCQlpbnQgc2VsZWN0aW9uRW5kTGluZU9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoc2VsZWN0aW9uRW5kTGluZSk7Ci0JCQlpbnQgc2VsZWN0aW9uRW5kT2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0KLQkJCS8vIGFkanVzdCBzZWxlY3Rpb24gZW5kIGxpbmUKLQkJCWlmICgoc2VsZWN0aW9uRW5kTGluZSA+IHNlbGVjdGlvblN0YXJ0TGluZSkgJiYgKHNlbGVjdGlvbkVuZExpbmVPZmZzZXQgPT0gc2VsZWN0aW9uRW5kT2Zmc2V0KSkgewotCQkJCXNlbGVjdGlvbkVuZExpbmUtLTsKLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQotCQkvLyBzYXZlIHRoZSBzZWxlY3Rpb24gcG9zaXRpb24gc2luY2UgaXQgd2lsbCBiZSBjaGFuZ2luZwotCQlQb3NpdGlvbiBzZWxlY3Rpb25Qb3NpdGlvbiA9IG51bGw7Ci0JCWJvb2xlYW4gdXBkYXRlU3RhcnRPZmZzZXQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXNlbGVjdGlvblBvc2l0aW9uID0gbmV3IFBvc2l0aW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJZG9jdW1lbnQuYWRkUG9zaXRpb24oc2VsZWN0aW9uUG9zaXRpb24pOwotCi0JCQkvLyBleHRyYSBjaGVjayBpZiBjb21tZW50aW5nIGZyb20gYmVnaW5uaW5nIG9mIGxpbmUKLQkJCWludCBzZWxlY3Rpb25TdGFydExpbmVPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KHNlbGVjdGlvblN0YXJ0TGluZSk7Ci0JCQlpZiAoKHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgPiAwKSAmJiAoc2VsZWN0aW9uU3RhcnRMaW5lT2Zmc2V0ID09IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpICYmICFpc0NvbW1lbnRMaW5lKGRvY3VtZW50LCBzZWxlY3Rpb25TdGFydExpbmUpKSB7Ci0JCQkJdXBkYXRlU3RhcnRPZmZzZXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQotCQlwcm9jZXNzQWN0aW9uKGRvY3VtZW50LCBzZWxlY3Rpb25TdGFydExpbmUsIHNlbGVjdGlvbkVuZExpbmUpOwotCi0JCXVwZGF0ZUN1cnJlbnRTZWxlY3Rpb24odGV4dEVkaXRvciwgc2VsZWN0aW9uUG9zaXRpb24sIGRvY3VtZW50LCB1cGRhdGVTdGFydE9mZnNldCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NBY3Rpb24oSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc2VsZWN0aW9uU3RhcnRMaW5lLCBpbnQgc2VsZWN0aW9uRW5kTGluZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIENTU1VJTWVzc2FnZXMuVG9nZ2xlQ29tbWVudF90b29sdGlwKTsKLQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCWZvciAoaW50IGkgPSBzZWxlY3Rpb25TdGFydExpbmU7IGkgPD0gc2VsZWN0aW9uRW5kTGluZTsgaSsrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoZG9jdW1lbnQuZ2V0TGluZUxlbmd0aChpKSA+IDApIHsKLQkJCQkJCQlpZiAoaXNDb21tZW50TGluZShkb2N1bWVudCwgaSkpIHsKLQkJCQkJCQkJaW50IGxpbmVPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGkpOwotCQkJCQkJCQlJUmVnaW9uIHJlZ2lvbiA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihpKTsKLQkJCQkJCQkJU3RyaW5nIHN0cmluZyA9IGRvY3VtZW50LmdldChyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQkJCWludCBvcGVuQ29tbWVudE9mZnNldCA9IGxpbmVPZmZzZXQgKyBzdHJpbmcuaW5kZXhPZihPUEVOX0NPTU1FTlQpOwotCQkJCQkJCQlpbnQgY2xvc2VDb21tZW50T2Zmc2V0ID0gbGluZU9mZnNldCArIHN0cmluZy5pbmRleE9mKENMT1NFX0NPTU1FTlQpIC0gT1BFTl9DT01NRU5ULmxlbmd0aCgpOwotCQkJCQkJCQl1bmNvbW1lbnQoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0LCBjbG9zZUNvbW1lbnRPZmZzZXQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJaW50IG9wZW5Db21tZW50T2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChpKTsKLQkJCQkJCQkJaW50IGxpbmVEZWxpbWl0ZXJMZW5ndGggPSBkb2N1bWVudC5nZXRMaW5lRGVsaW1pdGVyKGkpID09IG51bGwgPyAwIDogZG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcihpKS5sZW5ndGgoKTsKLQkJCQkJCQkJaW50IGNsb3NlQ29tbWVudE9mZnNldCA9IG9wZW5Db21tZW50T2Zmc2V0ICsgZG9jdW1lbnQuZ2V0TGluZUxlbmd0aChpKSAtIGxpbmVEZWxpbWl0ZXJMZW5ndGggKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCk7Ci0JCQkJCQkJCWNvbW1lbnQoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0LCBjbG9zZUNvbW1lbnRPZmZzZXQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUN1cnJlbnRTZWxlY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvciwgUG9zaXRpb24gc2VsZWN0aW9uUG9zaXRpb24sIElEb2N1bWVudCBkb2N1bWVudCwgYm9vbGVhbiB1cGRhdGVTdGFydE9mZnNldCkgewotCQkvLyB1cGRhdGUgdGhlIHNlbGVjdGlvbiBpZiB0ZXh0IHNlbGVjdGlvbiBjaGFuZ2VkCi0JCWlmIChzZWxlY3Rpb25Qb3NpdGlvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCQkJaWYgKHVwZGF0ZVN0YXJ0T2Zmc2V0KSB7Ci0JCQkJc2VsZWN0aW9uID0gbmV3IFRleHRTZWxlY3Rpb24oZG9jdW1lbnQsIHNlbGVjdGlvblBvc2l0aW9uLmdldE9mZnNldCgpIC0gT1BFTl9DT01NRU5ULmxlbmd0aCgpLCBzZWxlY3Rpb25Qb3NpdGlvbi5nZXRMZW5ndGgoKSArIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZWxlY3Rpb24gPSBuZXcgVGV4dFNlbGVjdGlvbihkb2N1bWVudCwgc2VsZWN0aW9uUG9zaXRpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvblBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJcHJvdmlkZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCQlkb2N1bWVudC5yZW1vdmVQb3NpdGlvbihzZWxlY3Rpb25Qb3NpdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNDb21tZW50TGluZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBsaW5lKSB7Ci0JCWJvb2xlYW4gaXNDb21tZW50ID0gZmFsc2U7Ci0KLQkJdHJ5IHsKLQkJCUlSZWdpb24gcmVnaW9uID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGxpbmUpOwotCQkJU3RyaW5nIHN0cmluZyA9IGRvY3VtZW50LmdldChyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSkudHJpbSgpOwotCQkJaXNDb21tZW50ID0gKHN0cmluZy5sZW5ndGgoKSA+PSBPUEVOX0NPTU1FTlQubGVuZ3RoKCkgKyBDTE9TRV9DT01NRU5ULmxlbmd0aCgpKSAmJiBzdHJpbmcuc3RhcnRzV2l0aChPUEVOX0NPTU1FTlQpICYmIHN0cmluZy5lbmRzV2l0aChDTE9TRV9DT01NRU5UKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JCXJldHVybiBpc0NvbW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb3BlbkNvbW1lbnRPZmZzZXQsIGludCBjbG9zZUNvbW1lbnRPZmZzZXQpIHsKLQkJdHJ5IHsKLQkJCWRvY3VtZW50LnJlcGxhY2Uob3BlbkNvbW1lbnRPZmZzZXQsIDAsIE9QRU5fQ09NTUVOVCk7Ci0JCQlkb2N1bWVudC5yZXBsYWNlKGNsb3NlQ29tbWVudE9mZnNldCwgMCwgQ0xPU0VfQ09NTUVOVCk7Ci0JCQlyZW1vdmVPcGVuQ2xvc2VDb21tZW50cyhkb2N1bWVudCwgb3BlbkNvbW1lbnRPZmZzZXQgKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCksIGNsb3NlQ29tbWVudE9mZnNldCAtIG9wZW5Db21tZW50T2Zmc2V0IC0gQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1bmNvbW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb3BlbkNvbW1lbnRPZmZzZXQsIGludCBjbG9zZUNvbW1lbnRPZmZzZXQpIHsKLQkJdHJ5IHsKLQkJCWRvY3VtZW50LnJlcGxhY2Uob3BlbkNvbW1lbnRPZmZzZXQsIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQlkb2N1bWVudC5yZXBsYWNlKGNsb3NlQ29tbWVudE9mZnNldCwgQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9pbWFnZS9DU1NJbWFnZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2ltYWdlL0NTU0ltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMmJlODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2ltYWdlL0NTU0ltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2U7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLkNTU0VkaXRvclBsdWdpbkltYWdlczsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTSW1hZ2VIZWxwZXIgewotCXByaXZhdGUgc3RhdGljIENTU0ltYWdlSGVscGVyIGZJbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDU1NJbWFnZUhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTSW1hZ2VIZWxwZXIoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgSGFzaE1hcCBmSW1hZ2VEZXNjUmVnaXN0cnkgPSBudWxsOwkvLyBzYXZlIGEgZGVzY3JpcHRvciBmb3IgZWFjaCBpbWFnZQotCXByaXZhdGUgTWFwIGZUeXBlTWFwID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTSW1hZ2VIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBjcmVhdGVJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oQ1NTVUlQbHVnaW4uSUQsIHJlc291cmNlKTsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCi0JCWlmIChkZXNjID09IG51bGwpIHsKLQkJCWRlc2MgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQocmVzb3VyY2UsIGltYWdlKTsKLQkJfQotCi0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGRlc2NyaXB0b3IgZnJvbSB0aGUgZ2l2ZW4gaW1hZ2VGaWxlUGF0aCBhbmQgYWRkcyB0aGUKLQkgKiBpbWFnZSBkZXNjcmlwdG9yIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiBhbiBpbWFnZQotCSAqIGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGNyZWF0ZWQsIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yCi0JICogaXMgcmV0dXJuZWQgYnV0IG5vdCBhZGRlZCB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2VGaWxlUGF0aAotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIGltYWdlIGRlc2NyaXB0b3IgZm9yIGltYWdlRmlsZVBhdGggb3IgZGVmYXVsdAotCSAqICAgICAgICAgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgcmVzb3VyY2UgY291bGQgbm90IGJlIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpbWFnZUZpbGVQYXRoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oQ1NTVUlQbHVnaW4uSUQsIGltYWdlRmlsZVBhdGgpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCWdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkucHV0KGltYWdlRmlsZVBhdGgsIGltYWdlRGVzY3JpcHRvcik7Ci0JCX0gZWxzZSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBieSB0eXBlCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKENTU0ltYWdlVHlwZSB0eXBlKSB7Ci0JCWlmIChmVHlwZU1hcCA9PSBudWxsKSB7Ci0JCQlmVHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlNUWUxFU0hFRVQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1NUWUxFU0hFRVQpOwotCi0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlJVTEVfQ0hBUlNFVCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUlVMRV9DSEFSU0VUKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuUlVMRV9GT05URkFDRSwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUlVMRV9GT05URkFDRSk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlJVTEVfSU1QT1JULCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9SVUxFX0lNUE9SVCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlJVTEVfTUVESUEsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1JVTEVfTUVESUEpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5SVUxFX1BBR0UsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1JVTEVfUEFHRSk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlJVTEVfU1RZTEUsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1JVTEVfU1RZTEUpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5SVUxFX1VOS05PV04sIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1JVTEVfVU5LTk9XTik7Ci0KLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuU0VMRUNUT1JfQ0xBU1MsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1NFTEVDVE9SX0NMQVNTKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuU0VMRUNUT1JfSUQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1NFTEVDVE9SX0lEKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuU0VMRUNUT1JfUFNFVURPLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TRUxFQ1RPUl9QU0VVRE8pOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5TRUxFQ1RPUl9UQUcsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1NFTEVDVE9SX1RBRyk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlNFTEVDVE9SX0xJTkssIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1NFTEVDVE9SX0xJTkspOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5TRUxFQ1RPUl9ERUZBVUxULCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TRUxFQ1RPUl9ERUZBVUxUKTsKLQotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5WQUxVRV9GVU5DVElPTiwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVkFMVUVfRlVOQ1RJT04pOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5WQUxVRV9OVU1CRVIsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1ZBTFVFX05VTUJFUik7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlZBTFVFX1NUUklORywgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVkFMVUVfU1RSSU5HKTsKLQotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5DQVRFR09SWV9BVVJBTCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfQVVSQUwpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5DQVRFR09SWV9CT1gsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NBVEVHT1JZX0JPWCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX0NPTE9SQU5EQkFDS0dST1VORCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfQ09MT1JBTkRCQUNLR1JPVU5EKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfQ09OVEVOVCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfQ09OVEVOVCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX0ZPTlQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NBVEVHT1JZX0ZPTlQpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5DQVRFR09SWV9QQUdFLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DQVRFR09SWV9QQUdFKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfVEFCTEVTLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DQVRFR09SWV9UQUJMRVMpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5DQVRFR09SWV9URVhULCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DQVRFR09SWV9URVhUKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfVUksIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NBVEVHT1JZX1VJKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfVklTVUFMLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DQVRFR09SWV9WSVNVQUwpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5DQVRFR09SWV9ERUZBVUxULCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DQVRFR09SWV9ERUZBVUxUKTsKLQkJfQotCQlyZXR1cm4gZ2V0SW1hZ2UoKFN0cmluZykgZlR5cGVNYXAuZ2V0KHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBieSByZWxhdGl2ZSBwYXRoKGZyb20gaGVyZSkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZShyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UgZnJvbSB0aGUgaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiB0aGUgaW1hZ2UgZGVzY3JpcHRvciBjYW5ub3QgYmUgcmV0cmlldmVkLAotCSAqIGF0dGVtcHQgdG8gZmluZCBhbmQgbG9hZCB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkCi0JICogaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgZGVzY3JpcHRvciB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jYXRlZCB3aXRoIHJlc291cmNlIG9yCi0JICogICAgICAgICB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiBvbmUgY291bGQgbm90IGJlCi0JICogICAgICAgICBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkJT2JqZWN0IG8gPSBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSBhIGRlc2NyaXB0b3IKLQkJCWltYWdlRGVzY3JpcHRvciA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSAoSW1hZ2VEZXNjcmlwdG9yKSBvOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBIYXNoTWFwIC0gaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSB7Ci0JCWlmIChmSW1hZ2VEZXNjUmVnaXN0cnkgPT0gbnVsbCkKLQkJCWZJbWFnZURlc2NSZWdpc3RyeSA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBmSW1hZ2VEZXNjUmVnaXN0cnk7Ci0JfQotCi0JcHJpdmF0ZSBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2ltYWdlL0NTU0ltYWdlVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2ltYWdlL0NTU0ltYWdlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjJiZjkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9pbWFnZS9DU1NJbWFnZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5pbWFnZTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTWV0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNZXRhTW9kZWxGaW5kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsLkNTU01ldGFNb2RlbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTaW1wbGVTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU01lZGlhUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENTU0ltYWdlVHlwZSB7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmTmFtZTsKLQotCXByaXZhdGUgQ1NTSW1hZ2VUeXBlKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMuZk5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBmTmFtZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBTVFlMRVNIRUVUID0gbmV3IENTU0ltYWdlVHlwZSgiU1RZTEVTSEVFVCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBSVUxFX0NIQVJTRVQgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJSVUxFX0NIQVJTRVQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFJVTEVfRk9OVEZBQ0UgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJSVUxFX0ZPTlRGQUNFIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBSVUxFX0lNUE9SVCA9IG5ldyBDU1NJbWFnZVR5cGUoIlJVTEVfSU1QT1JUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBSVUxFX01FRElBID0gbmV3IENTU0ltYWdlVHlwZSgiUlVMRV9NRURJQSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgUlVMRV9QQUdFID0gbmV3IENTU0ltYWdlVHlwZSgiUlVMRV9QQUdFIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBSVUxFX1NUWUxFID0gbmV3IENTU0ltYWdlVHlwZSgiUlVMRV9TVFlMRSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgUlVMRV9VTktOT1dOID0gbmV3IENTU0ltYWdlVHlwZSgiUlVMRV9VTktOT1dOIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFNFTEVDVE9SX0NMQVNTID0gbmV3IENTU0ltYWdlVHlwZSgiU0VMRUNUT1JfQ0xBU1MiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFNFTEVDVE9SX0lEID0gbmV3IENTU0ltYWdlVHlwZSgiU0VMRUNUT1JfSUQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFNFTEVDVE9SX0RFRkFVTFQgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJTRUxFQ1RPUl9ERUZBVUxUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBTRUxFQ1RPUl9QU0VVRE8gPSBuZXcgQ1NTSW1hZ2VUeXBlKCJTRUxFQ1RPUl9QU0VVRE8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFNFTEVDVE9SX1RBRyA9IG5ldyBDU1NJbWFnZVR5cGUoIlNFTEVDVE9SX1RBRyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgU0VMRUNUT1JfTElOSyA9IG5ldyBDU1NJbWFnZVR5cGUoIlNFTEVDVE9SX0xJTksiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgVkFMVUVfRlVOQ1RJT04gPSBuZXcgQ1NTSW1hZ2VUeXBlKCJWQUxVRV9GVU5DVElPTiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgVkFMVUVfTlVNQkVSID0gbmV3IENTU0ltYWdlVHlwZSgiVkFMVUVfTlVNQkVSIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBWQUxVRV9TVFJJTkcgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJWQUxVRV9TVFJJTkciKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgQ0FURUdPUllfQVVSQUwgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9BVVJBTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgQ0FURUdPUllfQk9YID0gbmV3IENTU0ltYWdlVHlwZSgiQ0FURUdPUllfQk9YIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBDQVRFR09SWV9DT0xPUkFOREJBQ0tHUk9VTkQgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9DT0xPUkFOREJBQ0tHUk9VTkQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX0NPTlRFTlQgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9DT05URU5UIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBDQVRFR09SWV9GT05UID0gbmV3IENTU0ltYWdlVHlwZSgiQ0FURUdPUllfRk9OVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgQ0FURUdPUllfUEFHRSA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX1BBR0UiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX1RBQkxFUyA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX1RBQkxFUyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgQ0FURUdPUllfVEVYVCA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX1RFWFQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX1VJID0gbmV3IENTU0ltYWdlVHlwZSgiQ0FURUdPUllfVUkiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX1ZJU1VBTCA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX1ZJU1VBTCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgQ0FURUdPUllfREVGQVVMVCA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX0RFRkFVTFQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogYnkgbm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ1NTSW1hZ2VUeXBlIGdldEltYWdlVHlwZShJQ1NTTm9kZSBub2RlKSB7Ci0JCUNTU0ltYWdlVHlwZSBpbWFnZVR5cGUgPSBudWxsOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU0NoYXJzZXRSdWxlKSB7Ci0JCQlpbWFnZVR5cGUgPSBSVUxFX0NIQVJTRVQ7Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU0ZvbnRGYWNlUnVsZSkgewotCQkJaW1hZ2VUeXBlID0gUlVMRV9GT05URkFDRTsKLQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTSW1wb3J0UnVsZSkgewotCQkJaW1hZ2VUeXBlID0gUlVMRV9JTVBPUlQ7Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU01lZGlhUnVsZSkgewotCQkJaW1hZ2VUeXBlID0gUlVMRV9NRURJQTsKLQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUGFnZVJ1bGUpIHsKLQkJCWltYWdlVHlwZSA9IFJVTEVfUEFHRTsKLQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVSdWxlKSB7Ci0JCQlpbWFnZVR5cGUgPSBnZXRJbWFnZVR5cGUoKChJQ1NTU3R5bGVSdWxlKSBub2RlKS5nZXRTZWxlY3RvcnMoKSk7Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb24pIHsKLQkJCUlDU1NOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldEltYWdlVHlwZShwYXJlbnQpOwotCQkJfQotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJU3RyaW5nIG5hbWUgPSAoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlKS5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJCUlDU1NEb2N1bWVudCBkb2MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCUlDU1NNb2RlbCBtb2RlbCA9IChkb2MgIT0gbnVsbCkgPyBkb2MuZ2V0TW9kZWwoKSA6IG51bGw7Ci0JCQlDU1NNZXRhTW9kZWxGaW5kZXIgZmluZGVyID0gQ1NTTWV0YU1vZGVsRmluZGVyLmdldEluc3RhbmNlKCk7Ci0JCQlDU1NNZXRhTW9kZWwgbWV0YU1vZGVsID0gZmluZGVyLmZpbmRNZXRhTW9kZWxGb3IobW9kZWwpOwotCQkJLy8gaXMgZm9udC1mYWNlIHJ1bGUgPwotCQkJSUNTU05vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NGb250RmFjZVJ1bGUpIHsKLQkJCQkJaW1hZ2VUeXBlID0gQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX0ZPTlQ7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGltYWdlVHlwZSA9PSBudWxsKSB7Ci0JCQkJQ1NTTU1Qcm9wZXJ0eSBwcm9wID0gbmV3IENTU01ldGFNb2RlbFV0aWwobWV0YU1vZGVsKS5nZXRQcm9wZXJ0eShuYW1lKTsKLQkJCQlpZiAocHJvcCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBjYXRlZ29yeSA9IHByb3AuZ2V0QXR0cmlidXRlKCJjYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWltYWdlVHlwZSA9IGdldEltYWdlVHlwZShjYXRlZ29yeSk7Ci0JCQkJfQotCQkJCWlmIChpbWFnZVR5cGUgPT0gbnVsbCkgewotCQkJCQlpbWFnZVR5cGUgPSBDU1NJbWFnZVR5cGUuQ0FURUdPUllfREVGQVVMVDsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ZhbHVlKSB7Ci0JCQlzd2l0Y2ggKCgoQ1NTVmFsdWUpIG5vZGUpLmdldENzc1ZhbHVlVHlwZSgpKSB7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QRVJDRU5UQUdFIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FTVMgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VYUyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFggOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NNIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NTSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU4gOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BUIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QQyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfREVHIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SQUQgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0dSQUQgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01TIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19TIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19IWiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfS0haIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ESU1FTlNJT04gOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTlRFR0VSIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSEFTSCA6Ci0JCQkJCWltYWdlVHlwZSA9IFZBTFVFX05VTUJFUjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQVRUUiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09VTlRFUiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkVDVCA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkdCQ09MT1IgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSSSA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0ZPUk1BVCA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0xPQ0FMIDoKLQkJCQkJaW1hZ2VUeXBlID0gVkFMVUVfRlVOQ1RJT047Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlpbWFnZVR5cGUgPSBWQUxVRV9TVFJJTkc7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZVR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDU1NJbWFnZVR5cGUgZ2V0SW1hZ2VUeXBlKElDU1NTZWxlY3Rvckxpc3Qgc2VsZWN0b3JMaXN0KSB7Ci0JCWlmIChzZWxlY3Rvckxpc3QgPT0gbnVsbCB8fCBzZWxlY3Rvckxpc3QuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIFNFTEVDVE9SX0RFRkFVTFQ7Ci0JCX0KLQkJQ1NTSW1hZ2VUeXBlIGltYWdlVHlwZSA9IG51bGw7Ci0JCWludCBuU2VsZWN0b3JzID0gc2VsZWN0b3JMaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5TZWxlY3RvcnM7IGkrKykgewotCQkJQ1NTSW1hZ2VUeXBlIGNhbmRpZGF0ZSA9IGdldEltYWdlVHlwZShzZWxlY3Rvckxpc3QuZ2V0U2VsZWN0b3IoaSkpOwotCQkJaWYgKGltYWdlVHlwZSA9PSBudWxsKSB7Ci0JCQkJaW1hZ2VUeXBlID0gY2FuZGlkYXRlOwotCQkJfSBlbHNlIGlmIChpbWFnZVR5cGUgIT0gY2FuZGlkYXRlKSB7Ci0JCQkJaW1hZ2VUeXBlID0gbnVsbDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAoaW1hZ2VUeXBlID09IG51bGwpID8gU0VMRUNUT1JfREVGQVVMVCA6IGltYWdlVHlwZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENTU0ltYWdlVHlwZSBnZXRJbWFnZVR5cGUoSUNTU1NlbGVjdG9yIHNlbGVjdG9yKSB7Ci0JCUNTU0ltYWdlVHlwZSBpbWFnZVR5cGUgPSBTRUxFQ1RPUl9ERUZBVUxUOwotCQlpZiAoc2VsZWN0b3IgPT0gbnVsbCB8fCBzZWxlY3Rvci5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gaW1hZ2VUeXBlOwotCQl9Ci0JCUlDU1NTZWxlY3Rvckl0ZW0gaXRlbSA9IHNlbGVjdG9yLmdldEl0ZW0oc2VsZWN0b3IuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJaWYgKGl0ZW0uZ2V0SXRlbVR5cGUoKSA9PSBJQ1NTU2VsZWN0b3JJdGVtLlNJTVBMRSkgewotCQkJSUNTU1NpbXBsZVNlbGVjdG9yIHNzID0gKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbTsKLQkJCWlmICgwIDwgc3MuZ2V0TnVtT2ZJRHMoKSkgewotCQkJCWltYWdlVHlwZSA9IFNFTEVDVE9SX0lEOwotCQkJfSBlbHNlIGlmICgwIDwgc3MuZ2V0TnVtT2ZDbGFzc2VzKCkpIHsKLQkJCQlpbWFnZVR5cGUgPSBTRUxFQ1RPUl9DTEFTUzsKLQkJCX0gZWxzZSBpZiAoMCA8IHNzLmdldE51bU9mUHNldWRvTmFtZXMoKSkgewotCQkJCWltYWdlVHlwZSA9IFNFTEVDVE9SX1BTRVVETzsKLQkJCX0gZWxzZSB7Ci0JCQkJaW1hZ2VUeXBlID0gU0VMRUNUT1JfVEFHOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZVR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDU1NJbWFnZVR5cGUgZ2V0SW1hZ2VUeXBlKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoZkNhdGVnb3J5TWFwID09IG51bGwpIHsKLQkJCWZDYXRlZ29yeU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmQ2F0ZWdvcnlNYXAucHV0KCJhdXJhbCIsIENBVEVHT1JZX0FVUkFMKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNhdGVnb3J5TWFwLnB1dCgiYm94IiwgQ0FURUdPUllfQk9YKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNhdGVnb3J5TWFwLnB1dCgiY29sb3JhbmRiYWNrZ3JvdW5kIiwgQ0FURUdPUllfQ09MT1JBTkRCQUNLR1JPVU5EKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNhdGVnb3J5TWFwLnB1dCgiY29udGVudCIsIENBVEVHT1JZX0NPTlRFTlQpOyAvLyROT04tTkxTLTEkCi0JCQlmQ2F0ZWdvcnlNYXAucHV0KCJmb250IiwgQ0FURUdPUllfRk9OVCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoInBhZ2UiLCBDQVRFR09SWV9QQUdFKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNhdGVnb3J5TWFwLnB1dCgidGFibGVzIiwgQ0FURUdPUllfVEFCTEVTKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNhdGVnb3J5TWFwLnB1dCgidGV4dCIsIENBVEVHT1JZX1RFWFQpOyAvLyROT04tTkxTLTEkCi0JCQlmQ2F0ZWdvcnlNYXAucHV0KCJ1aSIsIENBVEVHT1JZX1VJKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNhdGVnb3J5TWFwLnB1dCgidmlzdWFsIiwgQ0FURUdPUllfVklTVUFMKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUNTU0ltYWdlVHlwZSBpbWFnZVR5cGUgPSAoQ1NTSW1hZ2VUeXBlKSBmQ2F0ZWdvcnlNYXAuZ2V0KGNhdGVnb3J5KTsKLQkJcmV0dXJuIChpbWFnZVR5cGUgPT0gbnVsbCkgPyBDQVRFR09SWV9ERUZBVUxUIDogaW1hZ2VUeXBlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE1hcCBmQ2F0ZWdvcnlNYXAgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY5MWM3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiA8cD5UaGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlIGNvbXBsZXRpb24gcHJvcG9zYWwgY2F0ZWdvcmllcyBjb25maWd1cmF0aW9uCi0gKiBmb3IgdGhlIENTUyBjb250ZW50IHR5cGU8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDU1NDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbiBleHRlbmRzCi0JCUFic3RyYWN0Q29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24gewotCi0JLyoqIHRoZSBJRCBvZiB0aGUgcHJlZmVyZW5jZSBwYWdlIHdoZXJlIHVzZXJzIGNhbiBjaGFuZ2UgdGhlIHByZWZlcmVuY2VzICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VTX1BBR0VfSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5wcmVmZXJlbmNlcy5jb250ZW50YXNzaXN0IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIDxwPkNyZWF0ZXMgdGhlIGNvbmZpZ3VyYXRpb248L3A+Ci0JICovCi0JcHVibGljIENTU0NvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uKCkgewotCQkvL25vdGhpbmcgdG8gZG8uCi0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5BYnN0cmFjdENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uI2dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyI2hhc0Fzc29jaWF0ZWRQcm9wZXJ0aWVzUGFnZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQXNzb2NpYXRlZFByb3BlcnRpZXNQYWdlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLklDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlciNnZXRQcm9wZXJ0aWVzUGFnZUlEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNQYWdlSUQoKSB7Ci0JCXJldHVybiBQUkVGRVJFTkNFU19QQUdFX0lEOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbiNnZXRTaG91bGROb3REaXNwbGF5T25EZWZhdWx0UGFnZVByZWZLZXkoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2hvdWxkTm90RGlzcGxheU9uRGVmYXVsdFBhZ2VQcmVmS2V5KCkgewotCQlyZXR1cm4gQ1NTVUlQcmVmZXJlbmNlTmFtZXMuQ09OVEVOVF9BU1NJU1RfRE9fTk9UX0RJU1BMQVlfT05fREVGQVVMVF9QQUdFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5BYnN0cmFjdENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uI2dldFNob3VsZE5vdERpc3BsYXlPbk93blBhZ2VQcmVmS2V5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNob3VsZE5vdERpc3BsYXlPbk93blBhZ2VQcmVmS2V5KCkgewotCQlyZXR1cm4gQ1NTVUlQcmVmZXJlbmNlTmFtZXMuQ09OVEVOVF9BU1NJU1RfRE9fTk9UX0RJU1BMQVlfT05fT1dOX1BBR0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLkFic3RyYWN0Q29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24jZ2V0UGFnZVNvcnRPcmRlclByZWZLZXkoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFnZVNvcnRPcmRlclByZWZLZXkoKSB7Ci0JCXJldHVybiBDU1NVSVByZWZlcmVuY2VOYW1lcy5DT05URU5UX0FTU0lTVF9PV05fUEFHRV9TT1JUX09SREVSOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbiNnZXREZWZhdWx0UGFnZVNvcnRPcmRlclByZWZLZXkoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFBhZ2VTb3J0T3JkZXJQcmVmS2V5KCkgewotCQlyZXR1cm4gQ1NTVUlQcmVmZXJlbmNlTmFtZXMuQ09OVEVOVF9BU1NJU1RfREVGQVVMVF9QQUdFX1NPUlRfT1JERVI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU1VJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhYjIxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5Db2xvckhlbHBlcjsKLQotLyoqCi0gKiBTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBDU1MgVUkgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIENTU1VJUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCUNvbG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFRoZW1lTWFuYWdlcigpLmdldEN1cnJlbnRUaGVtZSgpLmdldENvbG9yUmVnaXN0cnkoKTsKLQkJCi0JCS8vIENTUyBTdHlsZSBQcmVmZXJlbmNlcwotCQlTdHJpbmcgTk9CQUNLR1JPVU5EQk9MRCA9ICIgfCBudWxsIHwgZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBKVVNUSVRBTElDID0gIiB8IG51bGwgfCBmYWxzZSB8IHRydWUiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBKVVNUQk9MRCA9ICIgfCBudWxsIHwgdHJ1ZSI7Ci0JCVN0cmluZyBzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUsIDYzLCAxMjcsIDEyNykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSwgc3R5bGVWYWx1ZSk7Ci0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IsIDYzLCAxMjcsIDEyNykgKyBKVVNUQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IsIHN0eWxlVmFsdWUpOwotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlVOSVZFUlNBTCwgNjMsIDEyNywgMTI3KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLlVOSVZFUlNBTCwgc3R5bGVWYWx1ZSk7Ci0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNDU1MuQ09NQklOQVRPUiwgNjMsIDEyNywgMTI3KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTUJJTkFUT1IsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1JfQ0xBU1MsIDYzLCAxMjcsIDEyNykgKyBKVVNUSVRBTElDOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUl9DTEFTUywgc3R5bGVWYWx1ZSk7Ci0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNDU1MuSUQsIDYzLCAxMjcsIDEyNykgKyBKVVNUSVRBTElDOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5JRCwgc3R5bGVWYWx1ZSk7Ci0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNDU1MuUFNFVURPLCA2MywgMTI3LCAxMjcpICsgSlVTVElUQUxJQzsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuUFNFVURPLCBzdHlsZVZhbHVlKTsKLQotCQkvKiBBdHRyaWJ1dGUgc2VsZWN0b3IgKi8KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0NTUy5BVFRSSUJVVEVfREVMSU0sIDYzLCAxMjcsIDEyNykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5BVFRSSUJVVEVfREVMSU0sIHN0eWxlVmFsdWUpOwotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUVFJJQlVURV9OQU1FLCA2MywgMTI3LCAxMjcpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuQVRUUklCVVRFX05BTUUsIHN0eWxlVmFsdWUpOwotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUVFJJQlVURV9PUEVSQVRPUiwgNjMsIDEyNywgMTI3KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLkFUVFJJQlVURV9PUEVSQVRPUiwgc3R5bGVWYWx1ZSk7Ci0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNDU1MuQVRUUklCVVRFX1ZBTFVFLCA2MywgMTI3LCAxMjcpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuQVRUUklCVVRFX1ZBTFVFLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBLCA0MiwgMCwgMjI1KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQsIDYzLCA5NSwgMTkxKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRSwgMTI3LCAwLCAxMjcpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSwgNDIsIDAsIDIyNSkgKyBKVVNUSVRBTElDOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSwgc3R5bGVWYWx1ZSk7Ci0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNDU1MuVVJJLCA0MiwgMCwgMjI1KSArIEpVU1RJVEFMSUM7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSwgc3R5bGVWYWx1ZSk7Ci0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HLCA0MiwgMCwgMjI1KSArIEpVU1RJVEFMSUM7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORywgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9ICJudWxsIiArIE5PQkFDS0dST1VOREJPTEQ7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuQ09MT04sIHN0eWxlVmFsdWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OLCBzdHlsZVZhbHVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNDU1MuRVJST1IsIDE5MSwgNjMsIDYzKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLkVSUk9SLCBzdHlsZVZhbHVlKTsKLQkJCi0JCS8vIHNldCBkZWZhdWx0IG5ldyBjc3MgZmlsZSB0ZW1wbGF0ZSB0byB1c2UgaW4gbmV3IGZpbGUgd2l6YXJkCi0JCS8qCi0JCSAqIE5lZWQgdG8gZmluZCB0ZW1wbGF0ZSBuYW1lIHRoYXQgZ29lcyB3aXRoIGRlZmF1bHQgdGVtcGxhdGUgaWQgKG5hbWUKLQkJICogbWF5IGNoYW5nZSBmb3IgZGlmZmVyZW50IGxhbmd1YWdlKQotCQkgKi8KLQkJc3RvcmUuc2V0RGVmYXVsdChDU1NVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9JRCwgIm9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzLm5ld2NzcyIpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyBEZWZhdWx0cyBmb3IgQ29udGVudCBBc3Npc3QgcHJlZmVyZW5jZSBwYWdlCi0JCXN0b3JlLnNldERlZmF1bHQoQ1NTVUlQcmVmZXJlbmNlTmFtZXMuQ09OVEVOVF9BU1NJU1RfRE9fTk9UX0RJU1BMQVlfT05fREVGQVVMVF9QQUdFLCAiIik7Ci0JCXN0b3JlLnNldERlZmF1bHQoQ1NTVUlQcmVmZXJlbmNlTmFtZXMuQ09OVEVOVF9BU1NJU1RfRE9fTk9UX0RJU1BMQVlfT05fT1dOX1BBR0UsICIiKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChDU1NVSVByZWZlcmVuY2VOYW1lcy5DT05URU5UX0FTU0lTVF9ERUZBVUxUX1BBR0VfU09SVF9PUkRFUiwKLQkJCQkib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5wcm9wb3NhbENhdGVnb3J5LmNzc1wwIiArCi0JCQkJIm9yZy5lY2xpcHNlLndzdC5jc3MudWkucHJvcG9zYWxDYXRlZ29yeS5jc3NUZW1wbGF0ZXMiKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChDU1NVSVByZWZlcmVuY2VOYW1lcy5DT05URU5UX0FTU0lTVF9PV05fUEFHRV9TT1JUX09SREVSLAotCQkJCSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByb3Bvc2FsQ2F0ZWdvcnkuY3NzVGVtcGxhdGVzXDAiKyAKLQkJCQkib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5wcm9wb3NhbENhdGVnb3J5LmNzcyIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU1VJUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTVUlQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRjNTEyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTVUlQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIGtleXMgZm9yIENTUyBVSQotICovCi1wdWJsaWMgY2xhc3MgQ1NTVUlQcmVmZXJlbmNlTmFtZXMgewotCXByaXZhdGUgQ1NTVUlQcmVmZXJlbmNlTmFtZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgaW5zdGFuY2UKLQl9Ci0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSBjdXN0b21pemVkIHRlbXBsYXRlcy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFU19LRVkgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jdXN0b21fdGVtcGxhdGVzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIGxhc3QgdGVtcGxhdGUgbmFtZSB1c2VkIGluIG5ldyBDU1MgZmlsZSB3aXphcmQuCi0JICogVGVtcGxhdGUgbmFtZSBpcyBzdG9yZWQgaW5zdGVhZCBvZiB0ZW1wbGF0ZSBpZCBiZWNhdXNlIHVzZXItY3JlYXRlZAotCSAqIHRlbXBsYXRlcyBkbyBub3QgaGF2ZSB0ZW1wbGF0ZSBpZHMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRklMRV9URU1QTEFURV9OQU1FID0gIm5ld0ZpbGVUZW1wbGF0ZU5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaW5pdGlhbCB0ZW1wbGF0ZSBJRCB0byBiZSB1c2VkIGluIHRoZSBuZXcgQ1NTIGZpbGUgd2l6YXJkLiBJbiB0aGUgYWJzZW5jZQotCSAqIG9mIHtAbGluayBORVdfRklMRV9URU1QTEFURV9OQU1FfSwgdGhpcyBJRCBpcyB1c2VkIHRvIGZpbmQgYSB0ZW1wbGF0ZSBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0ZJTEVfVEVNUExBVEVfSUQgPSAibmV3RmlsZVRlbXBsYXRlSWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiA8cD5wcmVmZXJlbmNlIGtleSB1c2VkIGZvciBzYXZpbmcgd2hpY2ggY2F0ZWdvcmllcyBzaG91bGQgbm90IGRpc3BsYXkgb24gdGhlIGRlZmF1bHQgcGFnZTwvcD4KLQkgKiAKLQkgKiA8cD5WYWx1ZSBpcyBvZiB0eXBlIHtAbGluayBTdHJpbmd9IGNvbnNpc3Rpbmcgb2YKLQkgKiA8dHQ+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21wbGV0aW9uUHJvcG9zYWwvcHJvcG9zYWxDYXRlZ29yeS9AaWQ8L3R0PnMgc2VwYXJhdGVkIGJ5IHRoZSBudWxsCi0JICogY2hhcmFjdGVyICg8dHQ+XDA8L3R0PiksIG9yZGVyZWQgaXMgaWdub3JlZDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0FTU0lTVF9ET19OT1RfRElTUExBWV9PTl9ERUZBVUxUX1BBR0UgPSAiY3NzX2NvbnRlbnRfYXNzaXN0X2Rpc3BsYXlfb25fZGVmYXVsdF9wYWdlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIDxwPnByZWZlcmVuY2Uga2V5IHVzZWQgZm9yIHNhdmluZyB3aGljaCBjYXRlZ29yaWVzIHNob3VsZCBub3QgZGlzcGxheSBvbiB0aGVpciBvd24gcGFnZTwvcD4KLQkgKiAKLQkgKiA8cD5WYWx1ZSBpcyBvZiB0eXBlIHtAbGluayBTdHJpbmd9IGNvbnNpc3Rpbmcgb2YKLQkgKiA8dHQ+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21wbGV0aW9uUHJvcG9zYWwvcHJvcG9zYWxDYXRlZ29yeS9AaWQ8L3R0PnMgc2VwYXJhdGVkIGJ5IHRoZSBudWxsCi0JICogY2hhcmFjdGVyICg8dHQ+XDA8L3R0PiksIG9yZGVyIGlzIGlnbm9yZWQ8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9BU1NJU1RfRE9fTk9UX0RJU1BMQVlfT05fT1dOX1BBR0UgPSAiY3NzX2NvbnRlbnRfYXNzaXN0X2Rpc3BsYXlfb25fb3duX3BhZ2UiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogPHA+cHJlZmVyZW5jZSBrZXkgZm9yIHNhdmluZyB0aGUgc29ydCBvcmRlciBvZiB0aGUgY2F0ZWdvcmllcyB3aGVuIGRpc3BsYXlpbmcgdGhlbSBvbiB0aGVpciBvd24gcGFnZTwvcD4KLQkgKiAKLQkgKiA8cD5WYWx1ZSBpcyBvZiB0eXBlIHtAbGluayBTdHJpbmd9IGNvbnNpc3Rpbmcgb2YKLQkgKiA8dHQ+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21wbGV0aW9uUHJvcG9zYWwvcHJvcG9zYWxDYXRlZ29yeS9AaWQ8L3R0PnMgc2VwYXJhdGVkIGJ5IHRoZSBudWxsCi0JICogY2hhcmFjdGVyICg8dHQ+XDA8L3R0PikgaW4gdGhlIGRlc2lyZWQgc29ydCBvcmRlci48L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9BU1NJU1RfT1dOX1BBR0VfU09SVF9PUkRFUj0gImNzc19jb250ZW50X2Fzc2lzdF9vd25fcGFnZV9zb3J0X29yZGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIDxwPnByZWZlcmVuY2Uga2V5IGZvciBzYXZpbmcgdGhlIHNvcnQgb3JkZXIgb2YgdGhlIGNhdGVnb3JpZXMgd2hlbiBkaXNwbGF5aW5nIHRoZW0gb24gdGhlIGRlZmF1bHQgcGFnZTwvcD4KLQkgKiAKLQkgKiA8cD5WYWx1ZSBpcyBvZiB0eXBlIHtAbGluayBTdHJpbmd9IGNvbnNpc3Rpbmcgb2YKLQkgKiA8dHQ+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21wbGV0aW9uUHJvcG9zYWwvcHJvcG9zYWxDYXRlZ29yeS9AaWQ8L3R0PnMgc2VwYXJhdGVkIGJ5IHRoZSBudWxsCi0JICogY2hhcmFjdGVyICg8dHQ+XDA8L3R0PikgaW4gdGhlIGRlc2lyZWQgc29ydCBvcmRlci48L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9BU1NJU1RfREVGQVVMVF9QQUdFX1NPUlRfT1JERVI9ICJjc3NfY29udGVudF9hc3Npc3RfZGVmYXVsdF9wYWdlX3NvcnRfb3JkZXIiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTQ29sb3JQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTQ29sb3JQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNjNiZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU0NvbG9yUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0NTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdENvbG9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlN0eWxlZFRleHRDb2xvclBpY2tlcjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29sb3JQYWdlIGV4dGVuZHMgQWJzdHJhY3RDb2xvclBhZ2UgewotCi0JLyoqCi0JICogU2V0IHVwIGFsbCB0aGUgc3R5bGUgcHJlZmVyZW5jZSBrZXlzIGluIHRoZSBvdmVybGF5IHN0b3JlCi0JICovCi0JcHJvdGVjdGVkIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlBcnJheUxpc3Qgb3ZlcmxheUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCQlJdGVyYXRvciBpID0gc3R5bGVMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIChTdHJpbmcpIGkubmV4dCgpKSk7Ci0JCX0KLQotCQlPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBrZXlzID0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtvdmVybGF5S2V5cy5zaXplKCldOwotCQlvdmVybGF5S2V5cy50b0FycmF5KGtleXMpOwotCQlyZXR1cm4ga2V5czsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCSgoR3JpZERhdGEpIHBhZ2VDb21wb25lbnQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOwotCi0JCXN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhZ2VDb21wb25lbnQpOwotCi0JCS8vIGFzc2lnbmluZyBvbmUgaGVscCBmb3Igd2hvbGUgZ3JvdXAKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYWdlQ29tcG9uZW50LCBJSGVscENvbnRleHRJZHMuQ1NTX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCi0JCXJldHVybiBwYWdlQ29tcG9uZW50OwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQ29sb3JpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29sb3JpbmdDb21wb3NpdGUgPSBzdXBlci5jcmVhdGVDb2xvcmluZ0NvbXBvc2l0ZShwYXJlbnQpOwotCi0JCS8vIGFzc2lnbmluZyBvbmUgaGVscCBmb3Igd2hvbGUgZ3JvdXAKLQkJcmV0dXJuIGNvbG9yaW5nQ29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIGdldFNhbXBsZVRleHQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTYW1wbGVUZXh0KCkgewotCQlyZXR1cm4gQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yU2FtcGxlOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGNvbnRleHRTdHlsZU1hcAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkRpY3Rpb25hcnkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGV4dFN0eWxlTWFwKERpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwKSB7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQsIElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RPLCBJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQywgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TLCBJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIsIElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFLCBJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UsIElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRSk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JULCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFLCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9OVF9GQUNFLCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VULCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19BVEtFWVdPUkQsIElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HLCBJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJLCBJU3R5bGVDb25zdGFudHNDU1MuVVJJKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESVVNLCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQV9TRVBBUkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5NRURJQSk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVF9OQU1FLCBJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFX1NFTEVDVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfVU5JVkVSU0FMLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8sIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DT01CSU5BVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9TRVBBUkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5ULCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04sIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04sIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkcsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5ULCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUywgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuQ09MT04pOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIsIElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOLCBJU3R5bGVDb25zdGFudHNDU1MuRVJST1IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbnMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5EaWN0aW9uYXJ5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlc2NyaXB0aW9ucyhEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucykgewotCQkvLyBjcmVhdGUgZGVzY3JpcHRpb25zIGZvciBoaWxpZ2h0aW5nIHR5cGVzCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLk5PUk1BTCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yTm9ybWFsKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JBdG1hcmtSdWxlKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JTZWxlY3Rvcik7Ly8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5NRURJQSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yTWVkaWEpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yQ29tbWVudCk7Ly8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JQcm9wZXJ0eU5hbWUpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvclByb3BlcnR5VmFsdWUpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuVVJJLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JVcmkpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JTdHJpbmcpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuQ09MT04sIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvckNvbG9uKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTUlfQ09MT04sIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvclNlbWlDb2xvbik7Ly8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yQ3VybHlCcmFjZSk7Ly8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5FUlJPUiwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yRXJyb3IpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRTdHlsZUxpc3QoQXJyYXlMaXN0IGxpc3QpIHsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLk5PUk1BTCk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5NRURJQSk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX05BTUUpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuVVJJKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORyk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5DT0xPTik7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLkNVUkxZX0JSQUNFKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLkVSUk9SKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXR1cFBpY2tlciBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFBpY2tlcihTdHlsZWRUZXh0Q29sb3JQaWNrZXIgcGlja2VyKSB7Ci0JCUlNb2RlbE1hbmFnZXIgbW1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlwaWNrZXIuc2V0UGFyc2VyKG1tYW5hZ2VyLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9yQ1NTLkNvbnRlbnRUeXBlSURfQ1NTKS5nZXRQYXJzZXIoKSk7Ci0KLQkJRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWluaXREZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQotCQlEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW5pdENvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCi0JCUFycmF5TGlzdCBzdHlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQotCQlwaWNrZXIuc2V0Q29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0JCXBpY2tlci5zZXREZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJcGlja2VyLnNldFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlI3NhdmVQcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NDb250ZW50QXNzaXN0UHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NDb250ZW50QXNzaXN0UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmMThhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTQ29udGVudEFzc2lzdFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zb2FsQ2F0aWdvcmllc0NvbmZpZ3VyYXRpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5Db2RlQXNzaXN0Q3ljbGluZ0NvbmZpZ3VyYXRpb25CbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLklDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlcjsKLQotLyoqCi0gKiA8cD5EZWZpbmVzIHRoZSBwcmVmZXJlbmNlIHBhZ2UgZm9yIGFsbG93aW5nIHRoZSB1c2VyIHRvIGNoYW5nZSB0aGUgY29udGVudAotICogYXNzaXN0IHByZWZlcmVuY2VzPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29udGVudEFzc2lzdFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0JCUlXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0NPTlRFTlRfVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBjb25maWd1cmF0aW9uIGJsb2NrIGZvciBjaGFuZ2luZyBwcmVmZXJlbmNlIGhhdmluZyB0byBkbyB3aXRoIHRoZSBjb250ZW50IGFzc2lzdCBjYXRlZ29yaWVzICovCi0JcHJpdmF0ZSBDb2RlQXNzaXN0Q3ljbGluZ0NvbmZpZ3VyYXRpb25CbG9jayBmQ29uZmlndXJhdGlvbkJsb2NrOwotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQkJCi0JCWNyZWF0ZUNvbnRlbnRzRm9yQ3ljbGluZ0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCQotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCWxvYWRQcmVmZXJlbmNlcygpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2UjcGVyZm9ybURlZmF1bHRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXBlcmZvcm1EZWZhdWx0c0ZvckN5Y2xpbmdHcm91cCgpOwotCi0JCXZhbGlkYXRlVmFsdWVzKCk7Ci0JCWVuYWJsZVZhbHVlcygpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSNpbml0aWFsaXplVmFsdWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlpbml0aWFsaXplVmFsdWVzRm9yQ3ljbGluZ0dyb3VwKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlI3N0b3JlVmFsdWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJc3RvcmVWYWx1ZXNGb3JDeWNsaW5nR3JvdXAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Q3JlYXRlIHRoZSBjb250ZW50cyBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IGN5Y2xpbmcgcHJlZmVyZW5jZSBncm91cDwvcD4KLQkgKiBAcGFyYW0gcGFyZW50IHtAbGluayBDb21wb3NpdGV9IHBhcmVudCBvZiB0aGUgZ3JvdXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHNGb3JDeWNsaW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25Xcml0ZXIgY29uZmlndXJhdGlvbldyaXRlciA9IENvbXBsZXRpb25Qcm9wb3NvYWxDYXRpZ29yaWVzQ29uZmlndXJhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRXcml0YWJsZUNvbmZpZ3VyYXRpb24oQ1NTX0NPTlRFTlRfVFlQRV9JRCk7Ci0JCQotCQlpZihjb25maWd1cmF0aW9uV3JpdGVyICE9IG51bGwpIHsKLQkJCWZDb25maWd1cmF0aW9uQmxvY2sgPSBuZXcgQ29kZUFzc2lzdEN5Y2xpbmdDb25maWd1cmF0aW9uQmxvY2soQ1NTX0NPTlRFTlRfVFlQRV9JRCwgY29uZmlndXJhdGlvbldyaXRlcik7Ci0JCQlmQ29uZmlndXJhdGlvbkJsb2NrLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiVGhlcmUgc2hvdWxkIGJlIGFuIElDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlciIgKyAvLyROT04tTkxTLTEkCi0JCQkJCSIgc3BlY2lmaWVkIGZvciB0aGUgQ1NTIGNvbnRlbnQgdHlwZSwgYnV0IGNhbid0IGZpbmUgaXQsIHRodXMgY2FuJ3QgY3JlYXRlIHVzZXIiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiIHByZWZlcmVuY2UgYmxvY2sgZm9yIGVkaXRpbmcgcHJvcG9zYWwgY2F0ZWdvcmllcyBwcmVmZXJlbmNlcy4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPlN0b3JlIHRoZSB2YWx1ZXMgZm9yIHRoZSBjeWNsaW5nIGdyb3VwPC9wPgotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlc0ZvckN5Y2xpbmdHcm91cCgpIHsKLQkJaWYgKGZDb25maWd1cmF0aW9uQmxvY2sgIT0gbnVsbCkgewotCQkJZkNvbmZpZ3VyYXRpb25CbG9jay5zdG9yZVZhbHVlcygpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPkluaXRpYWxpemUgdGhlIHZhbHVlcyBmb3IgdGhlIGN5Y2xpbmcgZ3JvdXA8L3A+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXNGb3JDeWNsaW5nR3JvdXAoKSB7Ci0JCWlmKGZDb25maWd1cmF0aW9uQmxvY2sgIT0gbnVsbCkgewotCQkJZkNvbmZpZ3VyYXRpb25CbG9jay5pbml0aWFsaXplVmFsdWVzKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+TG9hZCB0aGUgZGVmYXVsdHMgb2YgdGhlIGN5Y2xpbmcgZ3JvdXA8L3A+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckN5Y2xpbmdHcm91cCgpIHsKLQkJaWYoZkNvbmZpZ3VyYXRpb25CbG9jayAhPSBudWxsKSB7Ci0JCQlmQ29uZmlndXJhdGlvbkJsb2NrLnBlcmZvcm1EZWZhdWx0cygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU0ZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3Y2JlN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU0ZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxGaWxlc1ByZWZlcmVuY2VQYWdlOwotCi1wdWJsaWMgY2xhc3MgQ1NTRmlsZXNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFhNTEZpbGVzUHJlZmVyZW5jZVBhZ2UgewotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7IC8vIG1vZGVsCi0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHNjcm9sbGVkQ29tcG9zaXRlID0gY3JlYXRlU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50KTsKLQkJY3JlYXRlQ29udGVudHNGb3JDcmVhdGluZ0dyb3VwKHNjcm9sbGVkQ29tcG9zaXRlKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNjcm9sbGVkQ29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuQ1NTX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCk7Ci0JCQotCQlzZXRTaXplKHNjcm9sbGVkQ29tcG9zaXRlKTsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBzY3JvbGxlZENvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWluaXRpYWxpemVWYWx1ZXNGb3JDcmVhdGluZ0dyb3VwKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJcGVyZm9ybURlZmF1bHRzRm9yQ3JlYXRpbmdHcm91cCgpOwotCi0gICAgICAgIHVwZGF0ZUFwcGx5QnV0dG9uKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlzdG9yZVZhbHVlc0ZvckNyZWF0aW5nR3JvdXAoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTU291cmNlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGMxMGNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5HcmlkRGF0YUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZUxpbmtBcmVhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VzLklXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ1NTU291cmNlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VQYWdlIHsKLQkvLyBDb250ZW50IEFzc2lzdAotCXByb3RlY3RlZCBCdXR0b24gZkF1dG9Qcm9wb3NlOwotCXByb3RlY3RlZCBMYWJlbCBmQXV0b1Byb3Bvc2VMYWJlbDsKLQotCXByb3RlY3RlZCBUZXh0IGZBdXRvUHJvcG9zZVRleHQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2xlYXJBbGxCbGFua0xpbmVzOwotCXByb3RlY3RlZCBCdXR0b24gZklkZW50TG93ZXI7Ci0JLy8gY2FzZSBvZiBvdXRwdXQgY2hhcmFjdGVyCi0JLy8gY2FzZSBvZiBpZGVudGlmaWVyCi0JcHJvdGVjdGVkIEJ1dHRvbiBmSWRlbnRVcHBlcjsKLQlwcml2YXRlIFNwaW5uZXIgZkluZGVudGF0aW9uU2l6ZTsKLQlwcml2YXRlIEJ1dHRvbiBmSW5kZW50VXNpbmdTcGFjZXM7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gZkluZGVudFVzaW5nVGFiczsKLQkvLyBGb3JtYXR0aW5nCi0JcHJvdGVjdGVkIExhYmVsIGZMaW5lV2lkdGhMYWJlbDsKLQkKLQlwcm90ZWN0ZWQgVGV4dCBmTGluZVdpZHRoVGV4dDsKLQkvLyBwcm9oaWJpdCB3cmFwcGluZyBpZiBzdHlsZSBhdHRyaWJ1dGUKLQlwcm90ZWN0ZWQgQnV0dG9uIGZOb3dyYXBBdHRyOwotCS8vIG9uZSBwcm9wZXJ0eSBwZXIgb25lIGxpbmUKLQlwcm90ZWN0ZWQgQnV0dG9uIGZQcm9wZXJ0eVBlckxpbmU7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUHJvcE5hbWVMb3dlcjsKLQotCS8vIGNhc2Ugb2YgcHJvcGVydHkgbmFtZQotCXByb3RlY3RlZCBCdXR0b24gZlByb3BOYW1lVXBwZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUHJvcFZhbHVlTG93ZXI7Ci0JLy8gY2FzZSBvZiBwcm9wZXJ0eSB2YWx1ZQotCXByb3RlY3RlZCBCdXR0b24gZlByb3BWYWx1ZVVwcGVyOwotCi0JLy8gU2VsZWN0b3IgY2FzZQotCXByb3RlY3RlZCBCdXR0b24gZlNlbGVjdG9yVXBwZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmU2VsZWN0b3JMb3dlcjsKLQotCXByb3RlY3RlZCBCdXR0b24gZlNwbGl0TXVsdGlBdHRyczsKLQlwcml2YXRlIGZpbmFsIGludCBNQVhfSU5ERU5UQVRJT05fU0laRSA9IDE2OwotCXByaXZhdGUgZmluYWwgaW50IE1JTl9JTkRFTlRBVElPTl9TSVpFID0gMDsKLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIElIZWxwQ29udGV4dElkcy5DU1NfUFJFRldFQlhfU09VUkNFX0hFTFBJRCk7Ci0KLQkJbmV3IFByZWZlcmVuY2VMaW5rQXJlYShjb21wb3NpdGUsIFNXVC5XUkFQIHwgU1dULk1VTFRJLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5lZGl0b3IiLCBDU1NVSU1lc3NhZ2VzLl9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTkssLy8kTk9OLU5MUy0xJAotCQkJCQkoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLCBudWxsKS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuaGludCgxNTAsIFNXVC5ERUZBVUxUKS5jcmVhdGUoKSk7Ci0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5zd3REZWZhdWx0cygpLmNyZWF0ZSgpKTsKLQotCQljcmVhdGVDb250ZW50c0ZvckZvcm1hdHRpbmdHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVDb250ZW50c0ZvckNvbnRlbnRBc3Npc3RHcm91cChjb21wb3NpdGUpOwotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCWxvYWRQcmVmZXJlbmNlcygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yQ29udGVudEFzc2lzdEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gbm90IGNvbnRlbnQgYXNzaXN0LCBidXQgcHJlZmVycmVkIGNhc2UKLQkJR3JvdXAgY2FzZUdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCA0KTsKLQkJY2FzZUdyb3VwLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0Nhc2VHcm91cCk7Ci0KLQkJLy8gdXNlIGdyb3VwIGZvciByYWRpbyBidXR0b25zIHNvIHRoYXQgYXNzb2NpYXRlZCBsYWJlbCBpcyByZWFkCi0JCUdyb3VwIGlkZW50R3JvdXAgPSBjcmVhdGVHcm91cChjYXNlR3JvdXAsIDEpOwotCQlpZGVudEdyb3VwLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0Nhc2VJZGVudCk7Ci0JCWZJZGVudFVwcGVyID0gY3JlYXRlUmFkaW9CdXR0b24oaWRlbnRHcm91cCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0Nhc2VJZGVudFVwcGVyKTsKLQkJZklkZW50TG93ZXIgPSBjcmVhdGVSYWRpb0J1dHRvbihpZGVudEdyb3VwLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZUlkZW50TG93ZXIpOwotCi0JCS8vIHVzZSBncm91cCBmb3IgcmFkaW8gYnV0dG9ucyBzbyB0aGF0IGFzc29jaWF0ZWQgbGFiZWwgaXMgcmVhZAotCQlHcm91cCBzZWxlY3Rvckdyb3VwID0gY3JlYXRlR3JvdXAoY2FzZUdyb3VwLCAxKTsKLQkJc2VsZWN0b3JHcm91cC5zZXRUZXh0KENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9TZWxlY3RvclRhZ05hbWUpOwotCQlmU2VsZWN0b3JVcHBlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKHNlbGVjdG9yR3JvdXAsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9TZWxlY3RvclRhZ05hbWVVcHBlcik7Ci0JCWZTZWxlY3Rvckxvd2VyID0gY3JlYXRlUmFkaW9CdXR0b24oc2VsZWN0b3JHcm91cCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX1NlbGVjdG9yVGFnTmFtZUxvd2VyKTsKLQotCQkvLyB1c2UgZ3JvdXAgZm9yIHJhZGlvIGJ1dHRvbnMgc28gdGhhdCBhc3NvY2lhdGVkIGxhYmVsIGlzIHJlYWQKLQkJR3JvdXAgcHJvcE5hbWVHcm91cCA9IGNyZWF0ZUdyb3VwKGNhc2VHcm91cCwgMSk7Ci0JCXByb3BOYW1lR3JvdXAuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZVByb3BOYW1lKTsKLQkJZlByb3BOYW1lVXBwZXIgPSBjcmVhdGVSYWRpb0J1dHRvbihwcm9wTmFtZUdyb3VwLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZVByb3BOYW1lVXBwZXIpOwotCQlmUHJvcE5hbWVMb3dlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKHByb3BOYW1lR3JvdXAsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9DYXNlUHJvcE5hbWVMb3dlcik7Ci0KLQkJLy8gdXNlIGdyb3VwIGZvciByYWRpbyBidXR0b25zIHNvIHRoYXQgYXNzb2NpYXRlZCBsYWJlbCBpcyByZWFkCi0JCUdyb3VwIHByb3BWYWx1ZUdyb3VwID0gY3JlYXRlR3JvdXAoY2FzZUdyb3VwLCAxKTsKLQkJcHJvcFZhbHVlR3JvdXAuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZSk7Ci0JCWZQcm9wVmFsdWVVcHBlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKHByb3BWYWx1ZUdyb3VwLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZVVwcGVyKTsKLQkJZlByb3BWYWx1ZUxvd2VyID0gY3JlYXRlUmFkaW9CdXR0b24ocHJvcFZhbHVlR3JvdXAsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9DYXNlUHJvcFZhbHVlTG93ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50c0ZvckZvcm1hdHRpbmdHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGZvcm1hdHRpbmdHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCWZvcm1hdHRpbmdHcm91cC5zZXRUZXh0KENTU1VJTWVzc2FnZXMuRm9ybWF0dGluZ19VSV8pOwotCi0JCWZMaW5lV2lkdGhMYWJlbCA9IGNyZWF0ZUxhYmVsKGZvcm1hdHRpbmdHcm91cCwgQ1NTVUlNZXNzYWdlcy5MaW5lX3dpZHRoX19VSV8pOwotCQlmTGluZVdpZHRoVGV4dCA9IG5ldyBUZXh0KGZvcm1hdHRpbmdHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWdEYXRhLndpZHRoSGludCA9IDI1OwotCQlmTGluZVdpZHRoVGV4dC5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQkJZkxpbmVXaWR0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0KLQkJZlByb3BlcnR5UGVyTGluZSA9IGNyZWF0ZUNoZWNrQm94KGZvcm1hdHRpbmdHcm91cCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX1dyYXBwaW5nSW5zZXJ0TGluZUJyZWFrKTsKLQkJKChHcmlkRGF0YSkgZlByb3BlcnR5UGVyTGluZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQlmTm93cmFwQXR0ciA9IGNyZWF0ZUNoZWNrQm94KGZvcm1hdHRpbmdHcm91cCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX1dyYXBwaW5nV2l0aG91dEF0dHIpOwotCQkoKEdyaWREYXRhKSBmTm93cmFwQXR0ci5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQkvLyBbMjY5MjI0XSAtIFBsYWNlIHRoZSBpbmRlbnQgY29udHJvbHMgaW4gdGhlaXIgb3duIGNvbXBvc2l0ZSBmb3IgcHJvcGVyIHRhYiBvcmRlcmluZwotCQlDb21wb3NpdGUgaW5kZW50Q29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKGZvcm1hdHRpbmdHcm91cCwgMSk7Ci0JCSgoR3JpZERhdGEpIGluZGVudENvbXBvc2l0ZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJKChHcmlkTGF5b3V0KSBpbmRlbnRDb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm1hcmdpbldpZHRoID0gMDsKLQkJKChHcmlkTGF5b3V0KSBpbmRlbnRDb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm1hcmdpbkhlaWdodCA9IDA7Ci0KLQkJZkluZGVudFVzaW5nVGFicyA9IGNyZWF0ZVJhZGlvQnV0dG9uKGluZGVudENvbXBvc2l0ZSwgQ1NTVUlNZXNzYWdlcy5JbmRlbnRfdXNpbmdfdGFic18pOwotCQkoKEdyaWREYXRhKSBmSW5kZW50VXNpbmdUYWJzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlmSW5kZW50VXNpbmdTcGFjZXMgPSBjcmVhdGVSYWRpb0J1dHRvbihpbmRlbnRDb21wb3NpdGUsIENTU1VJTWVzc2FnZXMuSW5kZW50X3VzaW5nX3NwYWNlcyk7Ci0JCSgoR3JpZERhdGEpIGZJbmRlbnRVc2luZ1NwYWNlcy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMTsKLQotCQljcmVhdGVMYWJlbChmb3JtYXR0aW5nR3JvdXAsIENTU1VJTWVzc2FnZXMuSW5kZW50YXRpb25fc2l6ZSk7Ci0JCWZJbmRlbnRhdGlvblNpemUgPSBuZXcgU3Bpbm5lcihmb3JtYXR0aW5nR3JvdXAsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0VG9vbFRpcFRleHQoQ1NTVUlNZXNzYWdlcy5JbmRlbnRhdGlvbl9zaXplX3RpcCk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0TWluaW11bShNSU5fSU5ERU5UQVRJT05fU0laRSk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0TWF4aW11bShNQVhfSU5ERU5UQVRJT05fU0laRSk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0SW5jcmVtZW50KDEpOwotCQlmSW5kZW50YXRpb25TaXplLnNldFBhZ2VJbmNyZW1lbnQoNCk7Ci0JCWZJbmRlbnRhdGlvblNpemUuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLQl9Ci0JCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWluaXRpYWxpemVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpIHsKLQkJLy8gbm90IGNvbnRlbnQgYXNzaXN0LCBidXQgcHJlZmVycmVkIGNhc2UKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCWZJZGVudFVwcGVyLnNldFNlbGVjdGlvbihwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmSWRlbnRMb3dlci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJZlNlbGVjdG9yVXBwZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfU0VMRUNUT1IpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmU2VsZWN0b3JMb3dlci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9TRUxFQ1RPUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCWZQcm9wTmFtZVVwcGVyLnNldFNlbGVjdGlvbihwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmUHJvcE5hbWVMb3dlci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJZlByb3BWYWx1ZVVwcGVyLnNldFNlbGVjdGlvbihwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZlByb3BWYWx1ZUxvd2VyLnNldFNlbGVjdGlvbihwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckZvcm1hdHRpbmdHcm91cCgpIHsKLQkJLy8gRm9ybWF0dGluZwotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJZkxpbmVXaWR0aFRleHQuc2V0VGV4dChwcmVmcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCWZQcm9wZXJ0eVBlckxpbmUuc2V0U2VsZWN0aW9uKHByZWZzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUpKTsKLQkJZk5vd3JhcEF0dHIuc2V0U2VsZWN0aW9uKHByZWZzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpKTsKLQkJCi0JCWlmIChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpKSkgewotCQkJZkluZGVudFVzaW5nVGFicy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmSW5kZW50VXNpbmdTcGFjZXMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWZJbmRlbnRVc2luZ1NwYWNlcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmSW5kZW50VXNpbmdUYWJzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJCQotCQlmSW5kZW50YXRpb25TaXplLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXBlcmZvcm1EZWZhdWx0c0ZvckZvcm1hdHRpbmdHcm91cCgpOwotCQlwZXJmb3JtRGVmYXVsdHNGb3JDb250ZW50QXNzaXN0R3JvdXAoKTsKLQotCQl2YWxpZGF0ZVZhbHVlcygpOwotCQllbmFibGVWYWx1ZXMoKTsKLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpIHsKLQkJLy8gbm90IGNvbnRlbnQgYXNzaXN0LCBidXQgcHJlZmVycmVkIGNhc2UKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCWZJZGVudFVwcGVyLnNldFNlbGVjdGlvbihwcmVmcy5nZXREZWZhdWx0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZklkZW50TG93ZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldERlZmF1bHRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlmU2VsZWN0b3JVcHBlci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0RGVmYXVsdEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfU0VMRUNUT1IpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmU2VsZWN0b3JMb3dlci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0RGVmYXVsdEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfU0VMRUNUT1IpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlmUHJvcE5hbWVVcHBlci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0RGVmYXVsdEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWZQcm9wTmFtZUxvd2VyLnNldFNlbGVjdGlvbihwcmVmcy5nZXREZWZhdWx0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJZlByb3BWYWx1ZVVwcGVyLnNldFNlbGVjdGlvbihwcmVmcy5nZXREZWZhdWx0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWZQcm9wVmFsdWVMb3dlci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0RGVmYXVsdEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGVmYXVsdHNGb3JGb3JtYXR0aW5nR3JvdXAoKSB7Ci0JCS8vIEZvcm1hdHRpbmcKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCWZMaW5lV2lkdGhUZXh0LnNldFRleHQocHJlZnMuZ2V0RGVmYXVsdFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKTsKLQkJZlByb3BlcnR5UGVyTGluZS5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0RGVmYXVsdEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUpKTsKLQkJZk5vd3JhcEF0dHIuc2V0U2VsZWN0aW9uKHByZWZzLmdldERlZmF1bHRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKSk7Ci0JCQotCQlpZiAoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUikpKSB7Ci0JCQlmSW5kZW50VXNpbmdUYWJzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZJbmRlbnRVc2luZ1NwYWNlcy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9IGVsc2UgewotCQkJZkluZGVudFVzaW5nU3BhY2VzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZJbmRlbnRVc2luZ1RhYnMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQkJCi0JCWZJbmRlbnRhdGlvblNpemUuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQotCQlkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlzdG9yZVZhbHVlc0ZvckZvcm1hdHRpbmdHcm91cCgpOwotCQlzdG9yZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpIHsKLQkJLy8gbm90IGNvbnRlbnQgYXNzaXN0LCBidXQgcHJlZmVycmVkIGNhc2UKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCXByZWZzLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSLCAoZklkZW50VXBwZXIuZ2V0U2VsZWN0aW9uKCkpID8gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA6IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlwcmVmcy5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfU0VMRUNUT1IsIChmU2VsZWN0b3JVcHBlci5nZXRTZWxlY3Rpb24oKSkgPyBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSIDogQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCXByZWZzLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FLCAoZlByb3BOYW1lVXBwZXIuZ2V0U2VsZWN0aW9uKCkpID8gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA6IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlwcmVmcy5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUsIChmUHJvcFZhbHVlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpID8gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA6IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCX0KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKSB7Ci0JCS8vIEZvcm1hdHRpbmcKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCXByZWZzLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCwgZkxpbmVXaWR0aFRleHQuZ2V0VGV4dCgpKTsKLQkJcHJlZnMuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUsIGZQcm9wZXJ0eVBlckxpbmUuZ2V0U2VsZWN0aW9uKCkpOwotCQlwcmVmcy5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUiwgZk5vd3JhcEF0dHIuZ2V0U2VsZWN0aW9uKCkpOwotCQkKLQkJaWYgKGZJbmRlbnRVc2luZ1RhYnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVEFCKTsKLQkJfSBlbHNlIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UpOwotCQl9Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUsIGZJbmRlbnRhdGlvblNpemUuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NTeW50YXhDb2xvcmluZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NTeW50YXhDb2xvcmluZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0MDk5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTU3ludGF4Q29sb3JpbmdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuQ29sb3JTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0NTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotLyoqCi0gKiBBIHByZWZlcmVuY2UgcGFnZSB0byBjb25maWd1cmUgb3VyIFhNTCBzeW50YXggY29sb3IuIEl0IHJlc2VtYmxlcyB0aGUgSkRUCi0gKiBhbmQgQ0RUIHBhZ2VzIGZhciBtb3JlIHRoYW4gb3VyIG9yaWdpbmFsIGNvbG9yIHBhZ2Ugd2hpbGUgcmV0YWluaW5nIHRoZQotICogZXh0cmEgImNsaWNrLXRvLWZpbmQiIGZ1bmN0aW9uYWxpdHkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDU1NTeW50YXhDb2xvcmluZ1BhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmQm9sZDsKLQlwcml2YXRlIExhYmVsIGZGb3JlZ3JvdW5kTGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCBmQmFja2dyb3VuZExhYmVsOwotCXByaXZhdGUgQnV0dG9uIGZDbGVhclN0eWxlOwotCXByaXZhdGUgTWFwIGZDb250ZXh0VG9TdHlsZU1hcDsKLQlwcml2YXRlIENvbG9yIGZEZWZhdWx0Rm9yZWdyb3VuZCA9IG51bGw7Ci0JcHJpdmF0ZSBDb2xvciBmRGVmYXVsdEJhY2tncm91bmQgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBCdXR0b24gZkl0YWxpYzsKLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZk92ZXJsYXlTdG9yZTsKLQlwcml2YXRlIEJ1dHRvbiBmU3RyaWtlOwotCXByaXZhdGUgQ29sbGVjdGlvbiBmU3R5bGVQcmVmZXJlbmNlS2V5czsKLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgZlN0eWxlc1ZpZXdlciA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZlN0eWxlVG9EZXNjcmlwdGlvbk1hcDsKLQlwcml2YXRlIFN0eWxlZFRleHQgZlRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gZlVuZGVybGluZTsKLQotCS8vIGFjdGl2YXRlIGNvbnRyb2xzIGJhc2VkIG9uIHRoZSBnaXZlbiBsb2NhbCBjb2xvciB0eXBlCi0JcHJpdmF0ZSB2b2lkIGFjdGl2YXRlKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCUNvbG9yIGZvcmVncm91bmQgPSBmRGVmYXVsdEZvcmVncm91bmQ7Ci0JCUNvbG9yIGJhY2tncm91bmQgPSBmRGVmYXVsdEJhY2tncm91bmQ7Ci0JCWlmIChuYW1lZFN0eWxlID09IG51bGwpIHsKLQkJCWZDbGVhclN0eWxlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZlN0cmlrZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZVbmRlcmxpbmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZJdGFsaWMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZTdHJpa2Uuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZVbmRlcmxpbmUuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCVRleHRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlRm9yKG5hbWVkU3R5bGUpOwotCQkJZkNsZWFyU3R5bGUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCb2xkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmU3RyaWtlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQm9sZC5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOwotCQkJZkl0YWxpYy5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7Ci0JCQlmU3RyaWtlLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0gpICE9IDApOwotCQkJZlVuZGVybGluZS5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkUpICE9IDApOwotCQkJaWYgKGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWZvcmVncm91bmQgPSBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJfQotCQkJaWYgKGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWJhY2tncm91bmQgPSBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpOwotCQkJfQotCQl9Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRDb2xvclZhbHVlKGZvcmVncm91bmQuZ2V0UkdCKCkpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldENvbG9yVmFsdWUoYmFja2dyb3VuZC5nZXRSR0IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29sb3IgdGhlIHRleHQgaW4gdGhlIHNhbXBsZSBhcmVhIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwcmVmZXJlbmNlcwotCSAqLwotCXZvaWQgYXBwbHlTdHlsZXMoKSB7Ci0JCWlmIChmVGV4dCA9PSBudWxsIHx8IGZUZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJLy8gbG9va3VwIHRoZSBsb2NhbCBjb2xvcmluZyB0eXBlIGFuZCBhcHBseSBpdAotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZkNvbnRleHRUb1N0eWxlTWFwLmdldChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSk7Ci0JCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVGb3IobmFtZWRTdHlsZSk7Ci0JCQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY3VycmVudFJlZ2lvbiksIGN1cnJlbnRSZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0U3R5bGUoKSk7Ci0JCQkJc3R5bGUuc3RyaWtlb3V0ID0gKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwOwotCQkJCXN0eWxlLnVuZGVybGluZSA9IChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwOwotCQkJCWZUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCQkJfQotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQl9Ci0KLQlCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tcG9zaXRlIGNvbnRyb2wgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCWZEZWZhdWx0Rm9yZWdyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCk7Ci0JCWZEZWZhdWx0QmFja2dyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLkNTU19QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhwYWdlQ29tcG9uZW50LCBTV1QuV1JBUCk7Ci0JCWxpbmsuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nX0xpbmspOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24ocGFyZW50LmdldFNoZWxsKCksIGUudGV4dCwgbnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyaWREYXRhIGxpbmtEYXRhPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGlua0RhdGEud2lkdGhIaW50PSAxNTA7IC8vIG9ubHkgZXhwYW5kIGZ1cnRoZXIgaWYgYW55b25lIGVsc2UgcmVxdWlyZXMgaXQKLQkJbGluay5zZXRMYXlvdXREYXRhKGxpbmtEYXRhKTsKLQotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCVNhc2hGb3JtIGVkaXRvciA9IG5ldyBTYXNoRm9ybShwYWdlQ29tcG9uZW50LCBTV1QuVkVSVElDQUwpOwotCQlHcmlkRGF0YSBncmlkRGF0YTIgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEyLmhvcml6b250YWxTcGFuID0gMjsKLQkJZWRpdG9yLnNldExheW91dERhdGEoZ3JpZERhdGEyKTsKLQkJU2FzaEZvcm0gdG9wID0gbmV3IFNhc2hGb3JtKGVkaXRvciwgU1dULkhPUklaT05UQUwpOwotCQlDb21wb3NpdGUgc3R5bGVFZGl0b3IgPSBjcmVhdGVDb21wb3NpdGUodG9wLCAxKTsKLQkJKChHcmlkTGF5b3V0KSBzdHlsZUVkaXRvci5nZXRMYXlvdXQoKSkubWFyZ2luUmlnaHQgPSA1OwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gMDsKLQkJY3JlYXRlTGFiZWwoc3R5bGVFZGl0b3IsIENTU1VJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzApOwotCQlmU3R5bGVzVmlld2VyID0gY3JlYXRlU3R5bGVzVmlld2VyKHN0eWxlRWRpdG9yKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBNYXRoLm1heChncmlkRGF0YS53aWR0aEhpbnQsIGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhpdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKS5sZW5ndGgoKSkpOwotCQl9Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQlmU3R5bGVzVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlDb21wb3NpdGUgZWRpdGluZ0NvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b3AsIDEpOwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gNTsKLQkJY3JlYXRlTGFiZWwoZWRpdGluZ0NvbXBvc2l0ZSwgIiIpOwotCQlCdXR0b24gZW5hYmxlciA9IGNyZWF0ZUNoZWNrYm94KGVkaXRpbmdDb21wb3NpdGUsIENTU1VJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzIpOwotCQllbmFibGVyLnNldEVuYWJsZWQoZmFsc2UpOwotCQllbmFibGVyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJQ29tcG9zaXRlIGVkaXRDb250cm9scyA9IGNyZWF0ZUNvbXBvc2l0ZShlZGl0aW5nQ29tcG9zaXRlLCAyKTsKLQkJKChHcmlkTGF5b3V0KSBlZGl0Q29udHJvbHMuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSAyMDsKLQotCQlmRm9yZWdyb3VuZExhYmVsID0gY3JlYXRlTGFiZWwoZWRpdENvbnRyb2xzLCBTU0VVSU1lc3NhZ2VzLkZvcmVncm91bmRfVUlfKTsKLQkJKChHcmlkRGF0YSkgZkZvcmVncm91bmRMYWJlbC5nZXRMYXlvdXREYXRhKCkpLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJZkZvcmVncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yID0gbmV3IENvbG9yU2VsZWN0b3IoZWRpdENvbnRyb2xzKTsKLQkJQnV0dG9uIGZGb3JlZ3JvdW5kQ29sb3IgPSBmRm9yZWdyb3VuZENvbG9yRWRpdG9yLmdldEJ1dHRvbigpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJZkZvcmVncm91bmRDb2xvci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmQmFja2dyb3VuZExhYmVsID0gY3JlYXRlTGFiZWwoZWRpdENvbnRyb2xzLCBTU0VVSU1lc3NhZ2VzLkJhY2tncm91bmRfVUlfKTsKLQkJKChHcmlkRGF0YSkgZkJhY2tncm91bmRMYWJlbC5nZXRMYXlvdXREYXRhKCkpLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yID0gbmV3IENvbG9yU2VsZWN0b3IoZWRpdENvbnRyb2xzKTsKLQkJQnV0dG9uIGZCYWNrZ3JvdW5kQ29sb3IgPSBmQmFja2dyb3VuZENvbG9yRWRpdG9yLmdldEJ1dHRvbigpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJZkJhY2tncm91bmRDb2xvci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmQm9sZCA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgQ1NTVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMyk7Ci0JCWZCb2xkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmQm9sZC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkl0YWxpYyA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgQ1NTVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfNCk7Ci0JCWZJdGFsaWMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZJdGFsaWMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZTdHJpa2UgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIENTU1VJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzUpOwotCQlmU3RyaWtlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmU3RyaWtlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmVW5kZXJsaW5lID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBDU1NVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV82KTsKLQkJZlVuZGVybGluZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJKChHcmlkRGF0YSkgZlVuZGVybGluZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkNsZWFyU3R5bGUgPSBuZXcgQnV0dG9uKGVkaXRpbmdDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJZkNsZWFyU3R5bGUuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlJlc3RvcmVfRGVmYXVsdF9VSV8pOyAvLyROT04tTkxTLTEkID0gIlJlc3RvcmUgRGVmYXVsdCIKLQkJZkNsZWFyU3R5bGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORykpOwotCQkoKEdyaWREYXRhKWZDbGVhclN0eWxlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlDb21wb3NpdGUgc2FtcGxlQXJlYSA9IGNyZWF0ZUNvbXBvc2l0ZShlZGl0b3IsIDEpOwotCi0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDU7Ci0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luVG9wID0gNTsKLQkJY3JlYXRlTGFiZWwoc2FtcGxlQXJlYSwgU1NFVUlNZXNzYWdlcy5TYW1wbGVfdGV4dF9fVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICImU2FtcGxlIHRleHQ6IgotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFNvdXJjZVZpZXdlcihzYW1wbGVBcmVhLCBudWxsLCBTV1QuQk9SREVSIHwgU1dULkxFRlRfVE9fUklHSFQgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZlRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlHcmlkRGF0YSBncmlkRGF0YTMgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEzLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyMCk7Ci0JCWdyaWREYXRhMy5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJZ3JpZERhdGEzLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YTMpOwotCQlmVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWZUZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsKLQkJZlRleHQuYWRkS2V5TGlzdGVuZXIoZ2V0VGV4dEtleUxpc3RlbmVyKCkpOwotCQlmVGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRUZXh0U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZE1vdXNlTGlzdGVuZXIoZ2V0VGV4dE1vdXNlTGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFRyYXZlcnNlTGlzdGVuZXIoZ2V0VHJhdmVyc2VMaXN0ZW5lcigpKTsKLQkJc2V0QWNjZXNzaWJsZShmVGV4dCwgU1NFVUlNZXNzYWdlcy5TYW1wbGVfdGV4dF9fVUlfKTsKLQkJZkRvY3VtZW50ID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUyk7Ci0JCWZEb2N1bWVudC5zZXQoZ2V0RXhhbXBsZVRleHQoKSk7Ci0JCXZpZXdlci5zZXREb2N1bWVudChmRG9jdW1lbnQpOwotCi0JCXRvcC5zZXRXZWlnaHRzKG5ldyBpbnRbXXsxLCAxfSk7Ci0JCWVkaXRvci5zZXRXZWlnaHRzKG5ldyBpbnRbXXsxLCAxfSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLkNTU19QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlmU3R5bGVzVmlld2VyLnNldElucHV0KGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKSk7Ci0KLQkJYXBwbHlTdHlsZXMoKTsKLQotCQlmU3R5bGVzVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFldmVudC5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQkJCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuYWRkTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhDb2xvclNlbGVjdG9yLlBST1BfQ09MT1JDSEFOR0UpKSB7Ci0JCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMF07Ci0JCQkJCQkvLyBvcGVuIGNvbG9yIGRpYWxvZyB0byBnZXQgbmV3IGNvbG9yCi0JCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBDb2xvckhlbHBlci50b1JHQlN0cmluZyhmRm9yZWdyb3VuZENvbG9yRWRpdG9yLmdldENvbG9yVmFsdWUoKSk7Ci0KLQkJCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJCXN0eWxlUHJlZnNbMF0gPSBuZXdWYWx1ZTsKLQkJCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuYWRkTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhDb2xvclNlbGVjdG9yLlBST1BfQ09MT1JDSEFOR0UpKSB7Ci0JCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMV07Ci0JCQkJCQkvLyBvcGVuIGNvbG9yIGRpYWxvZyB0byBnZXQgbmV3IGNvbG9yCi0JCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBDb2xvckhlbHBlci50b1JHQlN0cmluZyhmQmFja2dyb3VuZENvbG9yRWRpdG9yLmdldENvbG9yVmFsdWUoKSk7Ci0KLQkJCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJCXN0eWxlUHJlZnNbMV0gPSBuZXdWYWx1ZTsKLQkJCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZCb2xkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMl07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZCb2xkLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzJdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZJdGFsaWMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1szXTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZkl0YWxpYy5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1szXSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmU3RyaWtlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbNF07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZTdHJpa2UuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbNF0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZlVuZGVybGluZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzVdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmVW5kZXJsaW5lLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzVdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZkNsZWFyU3R5bGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm47Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKS50b1N0cmluZygpOwotCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFRvRGVmYXVsdChuYW1lZFN0eWxlKTsKLQkJCQlhcHBseVN0eWxlcygpOwotCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gcGFnZUNvbXBvbmVudDsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGFiZWwuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8vIHByb3RlY3RlZCBMYWJlbCBjcmVhdGVEZXNjcmlwdGlvbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYWxsIHRoZSBzdHlsZSBwcmVmZXJlbmNlIGtleXMgaW4gdGhlIG92ZXJsYXkgc3RvcmUKLQkgKi8KLQlwcml2YXRlIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUl0ZXJhdG9yIGkgPSBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgKFN0cmluZykgaS5uZXh0KCkpKTsKLQkJfQotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIExpc3Qgdmlld2VyIHdoZXJlIHdlIHNlZSB0aGUgdmFyaW91cyBzeW50YXggZWxlbWVudCBkaXNwbGF5Ci0JICogbmFtZXMtLXdvdWxkIGl0IGV2ZXIgYmUgYSBUcmVlIGxpa2UgSkRUJ3M/Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgY3JlYXRlU3R5bGVzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RydWN0dXJlZFZpZXdlciBzdHlsZXNWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVzVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKSkpOwotCQlzdHlsZXNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCU9iamVjdCBkZXNjcmlwdGlvbiA9IGZTdHlsZVRvRGVzY3JpcHRpb25NYXAuZ2V0KGVsZW1lbnQpOwotCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJCQlyZXR1cm4gZGVzY3JpcHRpb24udG9TdHJpbmcoKTsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXN0eWxlc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKS50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHN0eWxlc1ZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQlmT3ZlcmxheVN0b3JlLnN0b3AoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihTdHJpbmcgbmFtZWRTdHlsZSkgewotCQlUZXh0QXR0cmlidXRlIHRhID0gbmV3IFRleHRBdHRyaWJ1dGUoZkRlZmF1bHRGb3JlZ3JvdW5kLCBmRGVmYXVsdEJhY2tncm91bmQsIFNXVC5OT1JNQUwpOwotCi0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwgJiYgZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQkvLyBub3RlOiAibmFtZWRTdHlsZSIgKmlzKiB0aGUgcHJlZmVyZW5jZSBrZXkKLQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCi0JCQkJaW50IGZvbnRNb2RpZmllciA9IFNXVC5OT1JNQUw7Ci0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAyKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAzKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1szXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDQpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzRdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiA1KSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1s1XSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXRhID0gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgZm9udE1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGE7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RXhhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JTYW1wbGU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJLy8gZW5zdXJlIHRoZSBvZmZzZXQgaXMgY2xlYW4KLQkJaWYgKG9mZnNldCA+PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0JCQlyZXR1cm4gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIDEpOwotCQllbHNlIGlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuIGdldE5hbWVkU3R5bGVBdE9mZnNldCgwKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiAhZG9jdW1lbnRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKGRvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIGZpbmQgdGhlIElUZXh0UmVnaW9uJ3MgQ29udGV4dCBhdCB0aGlzIG9mZnNldAotCQkJSVRleHRSZWdpb24gaW50ZXJlc3QgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKGludGVyZXN0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAob2Zmc2V0ID4gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChpbnRlcmVzdCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlTdHJpbmcgcmVnaW9uQ29udGV4dCA9IGludGVyZXN0LmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25Db250ZXh0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkvLyBmaW5kIHRoZSBuYW1lZCBzdHlsZSAoaW50ZXJuYWwvc2VsZWN0YWJsZSBuYW1lKSBmb3IgdGhhdAotCQkJLy8gY29udGV4dAotCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoU3RyaW5nKSBmQ29udGV4dFRvU3R5bGVNYXAuZ2V0KHJlZ2lvbkNvbnRleHQpOwotCQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBuYW1lZFN0eWxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBnZXRPdmVybGF5U3RvcmUoKSB7Ci0JCXJldHVybiBmT3ZlcmxheVN0b3JlOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkgewotCQlpZiAoZlN0eWxlUHJlZmVyZW5jZUtleXMgPT0gbnVsbCkgewotCQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuVU5JVkVSU0FMKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTUJJTkFUT1IpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1JfQ0xBU1MpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuSUQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuUFNFVURPKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLkFUVFJJQlVURV9ERUxJTSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5BVFRSSUJVVEVfTkFNRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5BVFRSSUJVVEVfT1BFUkFUT1IpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuQVRUUklCVVRFX1ZBTFVFKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5VUkkpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTE9OKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTUlfQ09MT04pOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuRVJST1IpOwotCQkJZlN0eWxlUHJlZmVyZW5jZUtleXMgPSBzdHlsZXM7Ci0JCX0KLQkJcmV0dXJuIGZTdHlsZVByZWZlcmVuY2VLZXlzOwotCX0KLQotCXByaXZhdGUgS2V5TGlzdGVuZXIgZ2V0VGV4dEtleUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEtleUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW91c2VMaXN0ZW5lciBnZXRUZXh0TW91c2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb3VzZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJaW50IHggPSAoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5nZXRDYXJldE9mZnNldCgpOwotCQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KHgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0Q29sb3JBdE9mZnNldChlLngpOwotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0Q29sb3JBdE9mZnNldChlLngpOwotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhdmVyc2VMaXN0ZW5lciBnZXRUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyI2tleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpZiAoKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCkgfHwgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVMpKQotCQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQlzZXREZXNjcmlwdGlvbihTU0VVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nX0Rlc2NyaXB0aW9uKTsKLQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlpbml0U3R5bGVUb0Rlc2NyaXB0aW9uTWFwKCk7Ci0JCWluaXRSZWdpb25Db250ZXh0VG9TdHlsZU1hcCgpOwotCi0JCWZPdmVybGF5U3RvcmUgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZShnZXRQcmVmZXJlbmNlU3RvcmUoKSwgY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpKTsKLQkJZk92ZXJsYXlTdG9yZS5sb2FkKCk7Ci0JCWZPdmVybGF5U3RvcmUuc3RhcnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFJlZ2lvbkNvbnRleHRUb1N0eWxlTWFwKCkgewotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5ULCBJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETywgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMsIElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUywgSVN0eWxlQ29uc3RhbnRzQ1NTLk5PUk1BTCk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSLCBJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkNVUkxZX0JSQUNFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFLCBJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEsIElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQVRLRVlXT1JELCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORywgSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORyk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VSSSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElVTSwgSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUFfU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVRfTkFNRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORyk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRV9TRUxFQ1RPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlVOSVZFUlNBTCk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPLCBJU3R5bGVDb25zdGFudHNDU1MuUFNFVURPKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUl9DTEFTUyk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lELCBJU3R5bGVDb25zdGFudHNDU1MuSUQpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5DT01CSU5BVE9SKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCi0JCS8qIEF0dHJpYnV0ZSBzZWxlY3RvciAqLwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQsIElTdHlsZUNvbnN0YW50c0NTUy5BVFRSSUJVVEVfREVMSU0pOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5ELCBJU3R5bGVDb25zdGFudHNDU1MuQVRUUklCVVRFX0RFTElNKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUsIElTdHlsZUNvbnN0YW50c0NTUy5BVFRSSUJVVEVfTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUVFJJQlVURV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUVFJJQlVURV9PUEVSQVRPUik7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fUFJPUEVSVFksIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORywgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNILCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VTklDT0RFX1JBTkdFLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5DT0xPTik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTUlfQ09MT04pOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV04sIElTdHlsZUNvbnN0YW50c0NTUy5FUlJPUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRTdHlsZVRvRGVzY3JpcHRpb25NYXAoKSB7Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvck5vcm1hbCk7Ly8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvckF0bWFya1J1bGUpOy8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JTZWxlY3Rvcik7Ly8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNDU1MuQ09NQklOQVRPUiwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yQ29tYmluYXRvcik7Ly8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNDU1MuVU5JVkVSU0FMLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JVbml2ZXJzYWwpOy8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLklELCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JJZCk7Ly8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNDU1MuUFNFVURPLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JQc2V1ZG9DbGFzcyk7Ly8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1JfQ0xBU1MsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvckNsYXNzKTsvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0NTUy5BVFRSSUJVVEVfREVMSU0sIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvckF0dHJEZWxpbWl0ZXIpOy8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLkFUVFJJQlVURV9OQU1FLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JBdHRyTmFtZSk7Ly8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNDU1MuQVRUUklCVVRFX09QRVJBVE9SLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JBdHRyT3BlcmF0b3IpOy8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLkFUVFJJQlVURV9WQUxVRSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yQXR0clZhbHVlKTsvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0NTUy5NRURJQSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yTWVkaWEpOy8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvckNvbW1lbnQpOy8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX05BTUUsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvclByb3BlcnR5TmFtZSk7Ly8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvclByb3BlcnR5VmFsdWUpOy8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yVXJpKTsvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0NTUy5TVFJJTkcsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvclN0cmluZyk7Ly8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNDU1MuQ09MT04sIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvckNvbG9uKTsvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JTZW1pQ29sb24pOy8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLkNVUkxZX0JSQUNFLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JDdXJseUJyYWNlKTsvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0NTUy5FUlJPUiwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yRXJyb3IpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlnZXRPdmVybGF5U3RvcmUoKS5sb2FkRGVmYXVsdHMoKTsKLQkJYXBwbHlTdHlsZXMoKTsKLQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCWFjdGl2YXRlKG51bGwpOwotCQlmVGV4dC5yZWRyYXcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWdldE92ZXJsYXlTdG9yZSgpLnByb3BhZ2F0ZSgpOwotCi0JCUNTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0Q29sb3JBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyBuYW1lZFN0eWxlID0gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KG9mZnNldCk7Ci0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwpIHsKLQkJCWZTdHlsZXNWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5hbWVkU3R5bGUpKTsKLQkJCWZTdHlsZXNWaWV3ZXIucmV2ZWFsKG5hbWVkU3R5bGUpOwotCQl9Ci0JCWVsc2UgewotCQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCX0KLQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lmaWNhbGx5IHNldCB0aGUgcmVwb3J0aW5nIG5hbWUgb2YgYSBjb250cm9sIGZvciBhY2Nlc3NpYmlsaXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFjY2Vzc2libGUoQ29udHJvbCBjb250cm9sLCBTdHJpbmcgbmFtZSkgewotCQlpZiAoY29udHJvbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmaW5hbCBTdHJpbmcgbiA9IG5hbWU7Ci0JCWNvbnRyb2wuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKQotCQkJCQllLnJlc3VsdCA9IG47Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWY3ZmQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSBmb3IgQ1NTIHRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgQ1NTVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UgewotCi0JY2xhc3MgQ1NTRWRpdFRlbXBsYXRlRGlhbG9nIGV4dGVuZHMgRWRpdFRlbXBsYXRlRGlhbG9nIHsKLQkJcHVibGljIENTU0VkaXRUZW1wbGF0ZURpYWxvZyhTaGVsbCBwYXJlbnQsIFRlbXBsYXRlIHRlbXBsYXRlLCBib29sZWFuIGVkaXQsIGJvb2xlYW4gaXNOYW1lTW9kaWZpYWJsZSwgQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSkgewotCQkJc3VwZXIocGFyZW50LCB0ZW1wbGF0ZSwgZWRpdCwgaXNOYW1lTW9kaWZpYWJsZSwgcmVnaXN0cnkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewkJCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQotCQkJcHVibGljIElDb250ZW50QXNzaXN0YW50IGdldENvbnRlbnRBc3Npc3RhbnQoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlDb250ZW50QXNzaXN0YW50IGFzc2lzdGFudCA9IG5ldyBDb250ZW50QXNzaXN0YW50KCk7Ci0JCQkJYXNzaXN0YW50LmVuYWJsZUF1dG9BY3RpdmF0aW9uKHRydWUpOwotCQkJCWFzc2lzdGFudC5lbmFibGVBdXRvSW5zZXJ0KHRydWUpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGdldFRlbXBsYXRlUHJvY2Vzc29yKCksIElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRSk7Ci0JCQkJcmV0dXJuIGFzc2lzdGFudDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGRvQ3JlYXRlVmlld2VyKHBhcmVudCwgc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci19Ci0JfQotCi0JcHVibGljIENTU1RlbXBsYXRlUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCUNTU1VJUGx1Z2luIGNzc1VJUGx1Z2luID0gQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCi0JCXNldFByZWZlcmVuY2VTdG9yZShjc3NVSVBsdWdpbi5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCXNldFRlbXBsYXRlU3RvcmUoY3NzVUlQbHVnaW4uZ2V0VGVtcGxhdGVTdG9yZSgpKTsKLQkJc2V0Q29udGV4dFR5cGVSZWdpc3RyeShjc3NVSVBsdWdpbi5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIG9rID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0JCUNTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIG9rOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSNpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkgewotCQkvLyB0ZW1wbGF0ZSBmb3JtYXR0aW5nIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgYW5jZXN0b3IpIHsKLQkJQ29udHJvbCBjID0gc3VwZXIuY3JlYXRlQ29udGVudHMoYW5jZXN0b3IpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGMsIElIZWxwQ29udGV4dElkcy5DU1NfUFJFRldFQlhfVEVNUExBVEVTX0hFTFBJRCk7Ci0JCXJldHVybiBjOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSNjcmVhdGVWaWV3ZXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MoKTsKLQotCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQl9OwotCQlyZXR1cm4gZG9DcmVhdGVWaWV3ZXIocGFyZW50LCBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQl9Ci0KLQlTb3VyY2VWaWV3ZXIgZG9DcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiB2aWV3ZXJDb25maWd1cmF0aW9uKSB7Ci0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBudWxsOwotCQlTdHJpbmcgY29udGVudFR5cGVJRCA9IENvbnRlbnRUeXBlSWRGb3JDU1MuQ29udGVudFR5cGVJRF9DU1M7Ci0JCXZpZXdlciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlcihwYXJlbnQsIG51bGwsIG51bGwsIGZhbHNlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJdmlld2VyLmdldFRleHRXaWRnZXQoKS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihjb250ZW50VHlwZUlEKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gc2NyYXRjaE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl2aWV3ZXIuY29uZmlndXJlKHZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGVkaXQgZGlhbG9nLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCi0JICogYSBjdXN0b20gZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZQotCSAqICAgICAgICAgICAgdGhlIHRlbXBsYXRlIGJlaW5nIGVkaXRlZAotCSAqIEBwYXJhbSBlZGl0Ci0JICogICAgICAgICAgICB3aGV0aGVyIHRoZSBkaWFsb2cgc2hvdWxkIGJlIGVkaXRhYmxlCi0JICogQHBhcmFtIGlzTmFtZU1vZGlmaWFibGUKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIHRlbXBsYXRlIG5hbWUgbWF5IGJlIG1vZGlmaWVkCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBvciBtb2RpZmllZCB0ZW1wbGF0ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICBlZGl0aW9uIGZhaWxlZAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcm90ZWN0ZWQgVGVtcGxhdGUgZWRpdFRlbXBsYXRlKFRlbXBsYXRlIHRlbXBsYXRlLCBib29sZWFuIGVkaXQsIGJvb2xlYW4gaXNOYW1lTW9kaWZpYWJsZSkgewotCQlFZGl0VGVtcGxhdGVEaWFsb2cgZGlhbG9nID0gbmV3IENTU0VkaXRUZW1wbGF0ZURpYWxvZyhnZXRTaGVsbCgpLCB0ZW1wbGF0ZSwgZWRpdCwgaXNOYW1lTW9kaWZpYWJsZSwgZ2V0Q29udGV4dFR5cGVSZWdpc3RyeSgpKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gZGlhbG9nLmdldFRlbXBsYXRlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vQ1NTRm9sZGluZ1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9DU1NGb2xkaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwMzdlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9DU1NGb2xkaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uQWJzdHJhY3RTdHJ1Y3R1cmVkRm9sZGluZ1N0cmF0ZWd5OwotCi0vKioKLSAqIEEgZm9sZGluZyBzdHJhdGVneSBmb3IgQ1NTIHN0cnVjdHVyZWQgZG9jdW1lbnRzLgotICogU2VlIEFic3RyYWN0U3RydWN0dXJlZEZvbGRpbmdTdHJhdGVneSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi1wdWJsaWMgY2xhc3MgQ1NTRm9sZGluZ1N0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkRm9sZGluZ1N0cmF0ZWd5IHsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZm9sZGluZyBzdHJhdGVneS4KLQkgKiBCZSBzdXJlIHRvIHNldCB0aGUgdmlld2VyIGFuZCBkb2N1bWVudCBhZnRlciBjcmVhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ1NTRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5BYnN0cmFjdEZvbGRpbmdTdHJhdGVneSNjYWxjTmV3Rm9sZFBvc2l0aW9uKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uKQotCSAqLwotCXByb3RlY3RlZCBQb3NpdGlvbiBjYWxjTmV3Rm9sZFBvc2l0aW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbikgewotCQlQb3NpdGlvbiBuZXdQb3MgPSBudWxsOwotCQkKLQkJLy9vbmx5IHdhbnQgdG8gZm9sZCByZWdpb25zIHdpdGggYSB2YWxpZCByYW5nZQotCQlpZihpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgPj0gMCAmJiBpbmRleGVkUmVnaW9uLmdldExlbmd0aCgpID49IDApIHsKLQkJCW5ld1BvcyA9IG5ldyBDU1NSdWxlRm9sZGluZ1Bvc2l0aW9uKGluZGV4ZWRSZWdpb24pOwotCQl9Ci0JCXJldHVybiBuZXdQb3M7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBzYW1lIGFzIHRoZSBBYnN0cmFjdEZvbGRpbmdTdHJhdGVneSBpbXBsZW1lbnRhdGlvbiBleGNlcHQgZm9yIHRoZSBuZXcgcG9zaXRpb24gaXMKLQkgKiBjYWxjdWxhdGVkIG9uIHRoZSBnaXZlbiBJbmRleFJlZ2lvbiBhbmQgbm90IHRoZSBhbm5vdGF0aW9ucyBzdG9yZWQgSW5kZXhlZFJlZ2lvbiBiZWNhdXNlCi0JICogb2YgdGhlIHdheSBDU1MgcmVnaW9ucyBhcmUgcmVwbGFjZWQgd2hlbiB0aGV5IGFyZSB1cGRhdGVkLgotCSAqIAotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5BYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nU3RyYXRlZ3kjdXBkYXRlQW5ub3RhdGlvbnMoamF2YS51dGlsLkl0ZXJhdG9yLCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbiwgamF2YS51dGlsLkxpc3QsIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFubm90YXRpb25zKEl0ZXJhdG9yIGV4aXN0aW5nQW5ub3RhdGlvbnNJdGVyLCBJbmRleGVkUmVnaW9uIGRpcnR5UmVnaW9uLAotCQkJTGlzdCBtb2RpZmljYXRpb25zLCBMaXN0IGRlbGV0aW9ucykgewotCQkKLQkJd2hpbGUoZXhpc3RpbmdBbm5vdGF0aW9uc0l0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gZXhpc3RpbmdBbm5vdGF0aW9uc0l0ZXIubmV4dCgpOwotCQkJaWYob2JqIGluc3RhbmNlb2YgRm9sZGluZ0Fubm90YXRpb24pIHsKLQkJCQlGb2xkaW5nQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEZvbGRpbmdBbm5vdGF0aW9uKW9iajsKLQkJCQkKLQkJCQkvL05PVEUgY2FuIG5vdCB1c2UgdGhlIGFubm90YXRpb25zIHN0b3JlZCByZWdpb24gYmVjYXVzZSB0aGUgQ1NTU3RydWN0dXJlZERvY3VtZW50Ci0JCQkJLy8JcmVwbGFjZXMgdGhlIG9sZCByZWdpb24gd2l0aCBhIG5ldyBvbmUgd2hlbiBpdCBpcyBtb2RpZmllZAotCQkJCVBvc2l0aW9uIG5ld1BvcyA9IGNhbGNOZXdGb2xkUG9zaXRpb24oYW5ub3RhdGlvbi5nZXRSZWdpb24oKSk7Ci0JCQkJaWYobmV3UG9zICE9IG51bGwpIHsKLQkJCQkJUG9zaXRpb24gb2xkUG9zID0gZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwuZ2V0UG9zaXRpb24oYW5ub3RhdGlvbik7Ci0JCQkJCWlmKCFuZXdQb3MuZXF1YWxzKG9sZFBvcykpIHsKLQkJCQkJCW9sZFBvcy5zZXRPZmZzZXQobmV3UG9zLm9mZnNldCk7Ci0JCQkJCQlvbGRQb3Muc2V0TGVuZ3RoKG5ld1Bvcy5sZW5ndGgpOwotCQkJCQkJbW9kaWZpY2F0aW9ucy5hZGQoYW5ub3RhdGlvbik7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlkZWxldGlvbnMuYWRkKGFubm90YXRpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5BYnN0cmFjdEZvbGRpbmdTdHJhdGVneSNpbmRleGVkUmVnaW9uVmFsaWRUeXBlKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluZGV4ZWRSZWdpb25WYWxpZFR5cGUoSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uKSB7Ci0JCXJldHVybiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL0NTU1J1bGVGb2xkaW5nUG9zaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL0NTU1J1bGVGb2xkaW5nUG9zaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZjMDk4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9DU1NSdWxlRm9sZGluZ1Bvc2l0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5BYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nUG9zaXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlUnVsZTsKLQotLyoqCi0gKiBBbiB7QGxpbmsgQWJzdHJhY3RTdHJ1Y3R1cmVkRm9sZGluZ1Bvc2l0aW9ufSB1c2VkIHRvIGNvdmVyIENTUyByZWdpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NSdWxlRm9sZGluZ1Bvc2l0aW9uIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkRm9sZGluZ1Bvc2l0aW9uIHsKLQotCS8qKgotCSAqIHRoZSByZWdpb24gdGhhdCB3aWxsIGJlIGZvbGRlZAotCSAqLwotCXByaXZhdGUgSW5kZXhlZFJlZ2lvbiBmUmVnaW9uOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBmb2xkaW5nIHBvc2l0aW9uIHRoYXQgY292ZXJzIHtAbGluayBJbmRleGVkUmVnaW9ufXMKLQkgKiBpbiBhIENTUyBkb2N1bWVudAotCSAqIAotCSAqIEBwYXJhbSByZWdpb24gdGhlIHtAbGluayBJbmRleGVkUmVnaW9ufSB0aGF0IHRoaXMgZm9sZGluZyBwb3NpdGlvbiBjb3ZlcnMKLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZUZvbGRpbmdQb3NpdGlvbihJbmRleGVkUmVnaW9uIHJlZ2lvbikgewotCQlzdXBlcihyZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpKTsKLQkJdGhpcy5mUmVnaW9uID0gcmVnaW9uOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5BYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nUG9zaXRpb24jZ2V0U3RhcnRPZmZzZXQoKQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCWludCBzdGFydE9mZnNldCA9IGZSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCi0JCS8vc28gdGhhdCBtdWx0aS1saW5lIENTUyBzZWxlY3RvciB0ZXh0IGRvZXMgbm90IGdldCBmb2xkZWQKLQkJaWYodGhpcy5mUmVnaW9uIGluc3RhbmNlb2YgQ1NTU3R5bGVSdWxlKSB7Ci0JCQlDU1NTdHlsZVJ1bGUgcnVsZSA9IChDU1NTdHlsZVJ1bGUpdGhpcy5mUmVnaW9uOwotCQkJc3RhcnRPZmZzZXQgKz0gcnVsZS5nZXRTZWxlY3RvclRleHQoKS5sZW5ndGgoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN0YXJ0T2Zmc2V0OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5BYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nUG9zaXRpb24jZ2V0RW5kT2Zmc2V0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGZSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ1NTUHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0NTU1Byb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiY2IyZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ1NTUHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsRmluZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNZXRhTW9kZWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBBIElQcm9wZXJ0eVNvdXJjZSBpbXBsZW1lbnRhdGlvbiBmb3IgYSBKRmFjZSB2aWV3ZXIgdXNlZCB0byBkaXNwbGF5Ci0gKiBwcm9wZXJ0aWVzIG9mIENTUyBub2Rlcy4KLSAqLwotcHVibGljIGNsYXNzIENTU1Byb3BlcnR5U291cmNlIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlLCBJUHJvcGVydHlTb3VyY2VFeHRlbnNpb24gewotCXByb3RlY3RlZCBJQ1NTTm9kZSBmTm9kZSA9IG51bGw7Ci0JLy8gZm9yIHBlcmZvcm1hbmNlLi4uCi0JZmluYWwgc3RhdGljIENsYXNzIEFEQVBURVJfS0VZID0gSVByb3BlcnR5U291cmNlLmNsYXNzOwotCWZpbmFsIGJvb2xlYW4gUEVSRl9HRVRERVNDUklQVE9SUyA9IGZhbHNlOwotCXByaXZhdGUgbG9uZyB0aW1lMDsKLQotCXB1YmxpYyBDU1NQcm9wZXJ0eVNvdXJjZShJQ1NTTm9kZSB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJZk5vZGUgPSAgdGFyZ2V0OwotCX0KLQotCXByb3RlY3RlZCBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJLy8gdGhlIGRpc3BsYXlOYW1lIE1VU1QgYmUgc2V0Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWUsIGZOb2RlKTsKLQkJLy8gSVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3Ci0JCS8vIFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZSk7Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCXByb3RlY3RlZCBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihDU1NNTU5vZGUgbm9kZSwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCXJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3Iobm9kZS5nZXROYW1lKCksIGNhdGVnb3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIG5hbWUsIFN0cmluZyBjYXRlZ29yeSkgewotCQlJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBudWxsOwotCQlpZiAobmFtZSAhPSBudWxsICYmIDAgPCBuYW1lLmxlbmd0aCgpKSB7Ci0JCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKLQkJCQljYXRlZ29yeSA9IENTU1VJTWVzc2FnZXMuSU5GT19Ob3RfQ2F0ZWdvcml6ZWRfMTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZGVzY3JpcHRvciA9IG5ldyBDU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIG5hbWUsIGZOb2RlLCBjYXRlZ29yeSk7Ci0JCQkvLyBpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgewotCQkJLy8gZGVzY3JpcHRvciA9IG5ldyBDU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIG5hbWUsIGZOb2RlKTsKLQkJCS8vIH0gZWxzZSB7Ci0JCQkvLyBkZXNjcmlwdG9yID0gbmV3IENTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwgbmFtZSwgZk5vZGUsCi0JCQkvLyBjYXRlZ29yeSk7Ci0JCQkvLyB9Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHZhbHVlIGZvciB0aGlzIG9iamVjdCB0aGF0IGNhbiBiZSBlZGl0dGVkIGluIGEgcHJvcGVydHkKLQkgKiBzaGVldC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgdmFsdWUgdGhhdCBjYW4gYmUgZWRpdHRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBjb2xsZWN0aW9uIG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzLgotCSAqIAotCSAqIEByZXR1cm4gYSB2ZWN0b3IgY29udGFpbmluZyBhbGwgZGVzY3JpcHRvcnMuCi0JICovCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCUNTU01ldGFNb2RlbCBtZXRhbW9kZWwgPSBDU1NNZXRhTW9kZWxGaW5kZXIuZ2V0SW5zdGFuY2UoKS5maW5kTWV0YU1vZGVsRm9yKGZOb2RlKTsKLQkJSXRlcmF0b3IgaVByb3BlcnRpZXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCXN3aXRjaCAoZk5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRVJVTEVfTk9ERSA6Ci0JCQljYXNlIElDU1NOb2RlLkZPTlRGQUNFUlVMRV9OT0RFIDoKLQkJCWNhc2UgSUNTU05vZGUuUEFHRVJVTEVfTk9ERSA6Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSA6Ci0JCQkJQ1NTTU1Ob2RlIG1tUGFyZW50ID0gbmV3IENTU01ldGFNb2RlbFV0aWwobWV0YW1vZGVsKS5nZXRNZXRhTW9kZWxOb2RlRm9yKGZOb2RlKTsKLQkJCQlpZiAobW1QYXJlbnQgIT0gbnVsbCkgewotCQkJCQlpUHJvcGVydGllcyA9IG1tUGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSA6Ci0JCQkJQ1NTTU1Ob2RlIG1tTm9kZSA9IG5ldyBDU1NNZXRhTW9kZWxVdGlsKG1ldGFtb2RlbCkuZ2V0TWV0YU1vZGVsTm9kZUZvcihmTm9kZSk7Ci0JCQkJaWYgKG1tTm9kZSAhPSBudWxsKSB7Ci0JCQkJCWlQcm9wZXJ0aWVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtbU5vZGUpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQkvLyBzZXR1cCBjYXRlZ29yaWVzCi0JCU1hcCBjYXRlZ29yaWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJSXRlcmF0b3IgaUNhdGVnb3JpZXMgPSBtZXRhbW9kZWwuZ2V0Q2F0ZWdvcmllcygpOwotCQl3aGlsZSAoaUNhdGVnb3JpZXMuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTUNhdGVnb3J5IGNhdGVnb3J5ID0gKENTU01NQ2F0ZWdvcnkpIGlDYXRlZ29yaWVzLm5leHQoKTsKLQkJCWNhdGVnb3JpZXMucHV0KGNhdGVnb3J5LmdldE5hbWUoKSwgY2F0ZWdvcnkuZ2V0Q2FwdGlvbigpKTsKLQkJfQotCi0JCS8vIGNvbGxlY3QgcHJvcGVydHkgbmFtZXMKLQkJU2V0IGRlY2xhcmVkUHJvcGVydGllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChpUHJvcGVydGllcy5oYXNOZXh0KCkpIHsKLQkJCUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBnZXREZWNsYXJhdGlvbk5vZGUoKTsKLQkJCWlmIChkZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJSUNTU05vZGVMaXN0IG5vZGVMaXN0ID0gKChJQ1NTTm9kZSkgZGVjbGFyYXRpb24pLmdldENoaWxkTm9kZXMoKTsKLQkJCQlpbnQgblByb3BzID0gKG5vZGVMaXN0ICE9IG51bGwpID8gbm9kZUxpc3QuZ2V0TGVuZ3RoKCkgOiAwOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblByb3BzOyBpKyspIHsKLQkJCQkJSUNTU05vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQkJCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pIHsKLQkJCQkJCVN0cmluZyBuYW1lID0gKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCQkJCQlpZiAobmFtZSAhPSBudWxsICYmIDAgPCBuYW1lLmxlbmd0aCgpKSB7Ci0JCQkJCQkJZGVjbGFyZWRQcm9wZXJ0aWVzLmFkZChuYW1lLnRvTG93ZXJDYXNlKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJTGlzdCBkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBmaXJzdDogcHJvcGVydGllcyBmcm9tIGNvbnRlbnQgbW9kZWwKLQkJd2hpbGUgKGlQcm9wZXJ0aWVzLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpUHJvcGVydGllcy5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfUFJPUEVSVFkgfHwgbm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfREVTQ1JJUFRPUikgewotCQkJCVN0cmluZyBjYXRlZ29yeSA9IChTdHJpbmcpIGNhdGVnb3JpZXMuZ2V0KG5vZGUuZ2V0QXR0cmlidXRlKCJjYXRlZ29yeSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKLQkJCQlpZiAoZGVjbGFyZWRQcm9wZXJ0aWVzLmNvbnRhaW5zKG5hbWUpKSB7Ci0JCQkJCWRlY2xhcmVkUHJvcGVydGllcy5yZW1vdmUobmFtZSk7Ci0JCQkJfQotCQkJCUlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBjYXRlZ29yeSk7Ci0JCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQlkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gc2Vjb25kOiBleGlzdGluZyBwcm9wZXJ0aWVzIGJ1dCBub3QgaW4gY29udGVudCBtb2RlbAotCQlJdGVyYXRvciBpUmVtYWlucyA9IGRlY2xhcmVkUHJvcGVydGllcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaVJlbWFpbnMuaGFzTmV4dCgpKSB7Ci0JCQlJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoKFN0cmluZykgaVJlbWFpbnMubmV4dCgpLCBudWxsKTsKLQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQlkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCQl9Ci0JCX0KLQotCQlJUHJvcGVydHlEZXNjcmlwdG9yW10gcmVzdWx0QXJyYXkgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltkZXNjcmlwdG9ycy5zaXplKCldOwotCQlpZiAoUEVSRl9HRVRERVNDUklQVE9SUykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzOiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiAoSVByb3BlcnR5RGVzY3JpcHRvcltdKSBkZXNjcmlwdG9ycy50b0FycmF5KHJlc3VsdEFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgbmFtZWQgcHJvcGVydHkuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBhcyBuYW1lZCBieSBpdHMgcHJvcGVydHkgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RyaW5nIHZhbHVlU3RyaW5nID0gbnVsbDsKLQkJU3RyaW5nIG5hbWVTdHJpbmcgPSBuYW1lLnRvU3RyaW5nKCk7Ci0KLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IG51bGw7Ci0KLQkJc3dpdGNoIChmTm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSA6Ci0JCQkJdmFsdWVTdHJpbmcgPSAoKElDU1NTdHlsZURlY2xJdGVtKSBmTm9kZSkuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFUlVMRV9OT0RFIDoKLQkJCWNhc2UgSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUgOgotCQkJY2FzZSBJQ1NTTm9kZS5QQUdFUlVMRV9OT0RFIDoKLQkJCQlkZWNsYXJhdGlvbiA9IChDU1NTdHlsZURlY2xhcmF0aW9uKSBmTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQkJdmFsdWVTdHJpbmcgPSBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKG5hbWVTdHJpbmcpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFIDoKLQkJCQl2YWx1ZVN0cmluZyA9ICgoQ1NTU3R5bGVEZWNsYXJhdGlvbikgZk5vZGUpLmdldFByb3BlcnR5VmFsdWUobmFtZVN0cmluZyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlBSSU1JVElWRVZBTFVFX05PREUgOgotCQkJCUlDU1NOb2RlIHBhcmVudCA9IGZOb2RlOwotCQkJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSkgewotCQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCX0KLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJdmFsdWVTdHJpbmcgPSAoKElDU1NTdHlsZURlY2xJdGVtKSBwYXJlbnQpLmdldENTU1ZhbHVlVGV4dCgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHZhbHVlU3RyaW5nID09IG51bGwpIHsKLQkJCXZhbHVlU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiB2YWx1ZVN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHByb3BlcnR5IHZhbHVlIGhhcyBjaGFuZ2VkIGZyb20gdGhlIGRlZmF1bHQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBoYXMKLQkgKiAgICAgICAgIGNoYW5nZWQgZnJvbSBpdHMgb3JpZ2luYWwgZGVmYXVsdCB2YWx1ZTsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgcHJvcGVydHkpIHsKLQkJaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gZ2V0RGVjbGFyYXRpb25Ob2RlKCk7Ci0JCWlmIChkZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5LnRvU3RyaW5nKCkpOwotCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgMCA8IHZhbHVlLmxlbmd0aCgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkncyB2YWx1ZSB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB0byByZXNldAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3Qgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBnZXREZWNsYXJhdGlvbk5vZGUoKTsKLQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCWRlY2xhcmF0aW9uLnJlbW92ZVByb3BlcnR5KHN0ci50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWVkIHByb3BlcnR5IHRvIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIHNldAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgdmFsdWVTdHJpbmcgPSAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZS50b1N0cmluZygpIDogbnVsbDsKLQkJU3RyaW5nIG5hbWVTdHJpbmcgPSBuYW1lLnRvU3RyaW5nKCk7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBnZXREZWNsYXJhdGlvbk5vZGUoKTsKLQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHZhbHVlU3RyaW5nID09IG51bGwgfHwgdmFsdWVTdHJpbmcubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlkZWNsYXJhdGlvbi5yZW1vdmVQcm9wZXJ0eShuYW1lU3RyaW5nKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cmluZyBwcmlvcml0eSA9IGRlY2xhcmF0aW9uLmdldFByb3BlcnR5UHJpb3JpdHkobmFtZVN0cmluZyk7Ci0JCQkJCWRlY2xhcmF0aW9uLnNldFByb3BlcnR5KG5hbWVTdHJpbmcsIHZhbHVlU3RyaW5nLCAocHJpb3JpdHkgPT0gbnVsbCB8fCBwcmlvcml0eS5sZW5ndGgoKSA9PSAwKSA/ICIiIDogIiAiICsgcHJpb3JpdHkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJU3RyaW5nIHRpdGxlID0gQ1NTVUlNZXNzYWdlcy5UaXRsZV9JbnZhbGlkVmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IENTU1VJTWVzc2FnZXMuTWVzc2FnZV9JbnZhbGlkVmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKHdpbmRvdy5nZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb25Ob2RlKCkgewotCQlDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gbnVsbDsKLQotCQlzd2l0Y2ggKGZOb2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVERUNMSVRFTV9OT0RFIDoKLQkJCQlkZWNsYXJhdGlvbiA9IChDU1NTdHlsZURlY2xhcmF0aW9uKSBmTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFUlVMRV9OT0RFIDoKLQkJCWNhc2UgSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUgOgotCQkJY2FzZSBJQ1NTTm9kZS5QQUdFUlVMRV9OT0RFIDoKLQkJCQlkZWNsYXJhdGlvbiA9IChDU1NTdHlsZURlY2xhcmF0aW9uKSBmTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSA6Ci0JCQkJZGVjbGFyYXRpb24gPSAoQ1NTU3R5bGVEZWNsYXJhdGlvbikgZk5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlBSSU1JVElWRVZBTFVFX05PREUgOgotCQkJCUlDU1NOb2RlIHBhcmVudCA9IGZOb2RlOwotCQkJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb24pKSB7Ci0JCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJfQotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlkZWNsYXJhdGlvbiA9IChDU1NTdHlsZURlY2xhcmF0aW9uKSBwYXJlbnQ7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gZGVjbGFyYXRpb247Ci0JfQotCi0JLy8gQnVnIDEzMDAzOSAtIEltcGxlbWVudCBJUHJvcGVydHlTb3VyY2VFeHRlbnNpb24KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5UmVtb3ZhYmxlKE9iamVjdCBuYW1lKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KE9iamVjdCBuYW1lKSB7Ci0JCWlmKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBnZXREZWNsYXJhdGlvbk5vZGUoKTsKLQkJCi0JCWlmKGRlY2xhcmF0aW9uICE9IG51bGwpCi0JCQlkZWNsYXJhdGlvbi5yZW1vdmVQcm9wZXJ0eShuYW1lLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0NTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0NTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjMjdhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9DU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5UZXh0UHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1BhdGhTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgVGV4dFByb3BlcnR5RGVzY3JpcHRvciB7Ci0JcHJpdmF0ZSBmaW5hbCBJQ1NTTm9kZSBmTm9kZTsKLQotCS8qKgotCSAqIENTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGlzcGxheU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ1NTVGV4dFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSwgSUNTU05vZGUgbm9kZSkgewotCQlzdXBlcihpZCwgZGlzcGxheU5hbWUpOwotCQl0aGlzLmZOb2RlID0gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgQ1NTVGV4dFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSwgSUNTU05vZGUgbm9kZSwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCXN1cGVyKGlkLCBkaXNwbGF5TmFtZSk7Ci0JCXRoaXMuZk5vZGUgPSBub2RlOwotCQlzZXRDYXRlZ29yeShjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3IKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgQ2VsbEVkaXRvciBjcmVhdGVQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGZOb2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAobW9kZWwuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRVhURVJOQUwgJiYgZmluZEVkaXRvcihtb2RlbCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBjaGVjayB3aGV0aGVyIElGaWxlIGlzIHJlYWRvbmx5IHRvIHByb2hpYml0IGVkaXRpbmcgYmVmb3JlCi0JCS8vIHZhbGlkYXRlRWRpdCgpCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbW9kZWw7Ci0JCWlmIChtb2RlbC5nZXRTdHlsZVNoZWV0VHlwZSgpICE9IElDU1NNb2RlbC5FWFRFUk5BTCkgewotCQkJc3RydWN0dXJlZE1vZGVsID0gKChJRE9NTm9kZSkgbW9kZWwuZ2V0T3duZXJET01Ob2RlKCkpLmdldE1vZGVsKCk7Ci0JCQlpZiAoc3RydWN0dXJlZE1vZGVsID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IENTU1BhdGhTZXJ2aWNlLmxvY2F0aW9uMkZpbGUoc3RydWN0dXJlZE1vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCBmaWxlLmlzUmVhZE9ubHkoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBzdXBlci5jcmVhdGVQcm9wZXJ0eUVkaXRvcihwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElFZGl0b3JQYXJ0IGZpbmRFZGl0b3IoSUNTU01vZGVsIG1vZGVsKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSB3b3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspIHsKLQkJCUlXb3JrYmVuY2hQYWdlW10gcGFnZXMgPSB3aW5kb3dzW2ldLmdldFBhZ2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHBhZ2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvcnMgPSBwYWdlc1tqXS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBlZGl0b3JzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCUlFZGl0b3JQYXJ0IGVkaXRQYXJ0ID0gZWRpdG9yc1trXS5nZXRFZGl0b3IoZmFsc2UpOwotCQkJCQlpZiAoZWRpdFBhcnQgIT0gbnVsbCkgewotCQkJCQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZWRpdFBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCQkJCQlJRmlsZSBmaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dCkuZ2V0RmlsZSgpOwotCQkJCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJCQkJLy9UT0RPIFVyZ2VudCBuZWVkcyB0byBiZSBmaXhlZAotCQkJCQkJCQkvLyBJIHRoaW5rIHdlIG5lZWQgJ2VxdWFscycgKG9yICdlcXVpdmFsZW50JwotCQkJCQkJCQkvLyBvbiBtb2RlbCkgZm9yIGNhc2VzIGxpa2UgdGhpcwotCQkJCQkJCQlpZiAoU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jYWxjdWxhdGVJZChmaWxlKS5lcXVhbHMobW9kZWwuZ2V0SWQoKSkpIHsKLQkJCQkJCQkJCXJldHVybiBlZGl0UGFydDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE3ZGNiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJDU1MgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihJRG9jdW1lbnRUeXBlSGFuZGxlciBjb250ZW50VHlwZURlc2NyaXB0aW9uKSB7Ci0JCXJldHVybiAoY29udGVudFR5cGVEZXNjcmlwdGlvbiBpbnN0YW5jZW9mIE1vZGVsSGFuZGxlckZvckNTUyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQWRhcHRlckZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBhZGQgdGhlIG5vcm1hbCBjb250ZW50IGJhc2VkIGZhY3RvcmllcyB0byBtb2RlbCdzIHJlZ2lzdHJ5Ci0JCWFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhzdHJ1Y3R1cmVkTW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gc3RydWN0dXJlZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZhY3RvcnlSZWdpc3RyeSwgIlByb2dyYW0gRXJyb3I6IGNsaWVudCBjYWxsZXIgbXVzdCBlbnN1cmUgbW9kZWwgaGFzIGZhY3RvcnkgcmVnaXN0cnkiKTsgLy8kTk9OLU5MUy0xJAotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCi0JCWZhY3RvcnkgPSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3RvcnkgPSBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlDU1MoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCQkJZmFjdG9yeVJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWluaXRpYWxpemVGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nQ1NTQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ0NTU0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMWE3MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nQ1NTQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogU2VsZWN0cyBlbmNsb3NpbmcgQ1NTIGVsZW1lbnQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdDU1NBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIFN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KENTU1VJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCi0JCWluZGV4ZWRSZWdpb24gPSBnZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQotCQlyZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbihJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24sIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJUmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0JCWlmIChpbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCUlDU1NOb2RlIGN1cnNvck5vZGUgPSAoSUNTU05vZGUpIGluZGV4ZWRSZWdpb247Ci0JCQlSZWdpb24gY3Vyc29yTm9kZVJlZ2lvbiA9IG5ldyBSZWdpb24oaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBpbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCWludCBjdXJyZW50T2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKTsKLQkJCWludCBjdXJyZW50RW5kT2Zmc2V0ID0gY3VycmVudE9mZnNldCArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA+PSBjdXJyZW50T2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPD0gY3VycmVudEVuZE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PSBjdXJyZW50T2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQpIHsKLQkJCQlJQ1NTTm9kZSBuZXdOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdE5leHRDU1NBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0TmV4dENTU0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMTIyYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0TmV4dENTU0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlOwotCi0vKioKLSAqIFNlbGVjdHMgbmV4dCBDU1MgZWxlbWVudAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFNlbGVjdE5leHRDU1NBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIFN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlpbnQgb2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgLSAxOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCW9mZnNldCA9IDA7Ci0KLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbmRleGVkUmVnaW9uID0gZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudCwgb2Zmc2V0KTsKLQotCQlyZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbihJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24sIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJUmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0KLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJSUNTU05vZGUgY3Vyc29yTm9kZSA9IChJQ1NTTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQotCQkJUmVnaW9uIGN1cnNvck5vZGVSZWdpb24gPSBuZXcgUmVnaW9uKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgaW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpbnQgY3VycmVudE9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgY3VycmVudEVuZE9mZnNldCA9IGN1cnJlbnRPZmZzZXQgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpOwotCQkJaWYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPj0gY3VycmVudE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gY3VycmVudE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA8PSBjdXJyZW50RW5kT2Zmc2V0KSB7Ci0JCQkJSUNTU05vZGUgbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV3Tm9kZSA9PSBudWxsKSB7Ci0JCQkJCW5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJCUluZGV4ZWRSZWdpb24gbmV3SW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBuZXdOb2RlOwotCQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIG5ld0luZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJCUluZGV4ZWRSZWdpb24gbmV3SW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBuZXdOb2RlOwotCQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihjdXJyZW50T2Zmc2V0LCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gY3VycmVudE9mZnNldCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KENTU1VJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdE5leHRfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RQcmV2aW91c0NTU0FjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RQcmV2aW91c0NTU0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Mjg5YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNDU1NBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBTZWxlY3RzIHByZXZpb3VzIENTUyBlbGVtZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNDU1NBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIFN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCi0JCWluZGV4ZWRSZWdpb24gPSBnZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQotCQlyZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbihJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24sIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJUmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0JCWlmIChpbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCUlDU1NOb2RlIGN1cnNvck5vZGUgPSAoSUNTU05vZGUpIGluZGV4ZWRSZWdpb247Ci0KLQkJCVJlZ2lvbiBjdXJzb3JOb2RlUmVnaW9uID0gbmV3IFJlZ2lvbihpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaW50IGN1cnJlbnRPZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotCQkJaW50IGN1cnJlbnRFbmRPZmZzZXQgPSBjdXJyZW50T2Zmc2V0ICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQkJCWlmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBjdXJyZW50RW5kT2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPD0gY3VycmVudEVuZE9mZnNldCkgewotCQkJCUlDU1NOb2RlIG5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCWlmIChuZXdOb2RlID09IG51bGwpIHsKLQkJCQkJbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgY3VycmVudEVuZE9mZnNldCAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKENTU1VJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyODdhNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0NTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIHN5bWJvbGljIG5hbWUgb2Ygc3R5bGVzIHVzZWQgYnkgTGluZVN0eWxlUHJvdmlkZXIsCi0gKiBDb2xvck1hbmFnZXIsIGFuZCBhbnkgb3RoZXJzIHdobyBtYXkgYmUgaW50ZXJlc3RlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZUNvbnN0YW50c0NTUyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9STUFMID0gIk5PUk1BTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVE1BUktfUlVMRSA9ICJBVE1BUktfUlVMRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RPUiA9ICJTRUxFQ1RPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTklWRVJTQUwgPSAiVU5JVkVSU0FMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBTRVVETyA9ICJQU0VVRE8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUT1JfQ0xBU1MgPSAiQ0xBU1MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiSUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUEgPSAiTUVESUEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVCA9ICJDT01NRU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAiUFJPUEVSVFlfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9WQUxVRSA9ICJQUk9QRVJUWV9WQUxVRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkkgPSAiVVJJIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklORyA9ICJTVFJJTkciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT04gPSAiQ09MT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VNSV9DT0xPTiA9ICJTRU1JX0NPTE9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVUkxZX0JSQUNFID0gIkNVUkxZX0JSQUNFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9ERUxJTSA9ICJBVFRSSUJVVEVfREVMSU0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSAiQVRUUklCVVRFX05BTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09QRVJBVE9SID0gIkFUVFJJQlVURV9PUEVSQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVkFMVUUgPSAiQVRUUklCVVRFX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTUJJTkFUT1IgPSAiQ09NQklOQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUiA9ICJFUlJPUiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZmZhOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5lU3R5bGVQcm92aWRlckZvckNTUyBleHRlbmRzIEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIgaW1wbGVtZW50cyBMaW5lU3R5bGVQcm92aWRlciB7Ci0JLyoqIENvbnRhaW5zIHJlZ2lvbiB0byBzdHlsZSBtYXBwaW5nICovCi0JcHJpdmF0ZSBNYXAgZkNvbG9yVHlwZXM7Ci0KLQkvKioKLQkgKiBMaW5lU3R5bGVQcm92aWRlckZvckVtYmVkZGVkQ1NTIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZUZvcih0eXBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwpOwotCX0KLQotCS8qKgotCSAqIExvb2sgdXAgdGhlIFRleHRBdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiByZWdpb24gY29udGV4dC4gTWlnaHQgcmV0dXJuCi0JICogbnVsbCBmb3IgdW51c3VhbCB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KGZDb2xvclR5cGVzLmdldCh0eXBlKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRBdHRyaWJ1dGVzKCkgewotCQlpZiAoZkNvbG9yVHlwZXMgPT0gbnVsbCkgewotCQkJZkNvbG9yVHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETywgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQywgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MsIElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwpOwotCi0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSLCBJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFLCBJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkNVUkxZX0JSQUNFKTsKLQotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFLCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBLCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VULCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0FUS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORywgSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORyk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJLCBJU3R5bGVDb25zdGFudHNDU1MuVVJJKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJVU0sIElTdHlsZUNvbnN0YW50c0NTUy5NRURJQSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUFfU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCi0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVF9OQU1FLCBJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HKTsKLQotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBR0VfU0VMRUNUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5NRURJQSk7Ci0KLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfVU5JVkVSU0FMLCBJU3R5bGVDb25zdGFudHNDU1MuVU5JVkVSU0FMKTsKLQotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETywgSVN0eWxlQ29uc3RhbnRzQ1NTLlBTRVVETyk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUl9DTEFTUyk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQsIElTdHlsZUNvbnN0YW50c0NTUy5JRCk7Ci0KLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DT01CSU5BVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuQ09NQklOQVRPUik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCi0JCS8qIEF0dHJpYnV0ZSBzZWxlY3RvciAqLwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUVFJJQlVURV9ERUxJTSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUVFJJQlVURV9ERUxJTSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUsIElTdHlsZUNvbnN0YW50c0NTUy5BVFRSSUJVVEVfTkFNRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFLCBJU3R5bGVDb25zdGFudHNDU1MuQVRUUklCVVRFX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5BVFRSSUJVVEVfT1BFUkFUT1IpOwotCi0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fUFJPUEVSVFksIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04sIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04sIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNILCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0UsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5ULCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuQ09MT04pOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTUlfQ09MT04pOwotCi0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTiwgSVN0eWxlQ29uc3RhbnRzQ1NTLk5PUk1BTCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCi0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkvLyBjaGVjayBpZiBwcmVmZXJlbmNlIGNoYW5nZWQgaXMgYSBzdHlsZSBwcmVmZXJlbmNlCi0JCQlpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuQ09MT04uZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuQ09MT047Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5ULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQ7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRTsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLkVSUk9SLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLkVSUk9SOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuTUVESUEuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuTUVESUE7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuQVRUUklCVVRFX0RFTElNLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLkFUVFJJQlVURV9ERUxJTTsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLkFUVFJJQlVURV9OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLkFUVFJJQlVURV9OQU1FOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuQVRUUklCVVRFX09QRVJBVE9SLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLkFUVFJJQlVURV9PUEVSQVRPUjsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLkFUVFJJQlVURV9WQUxVRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5BVFRSSUJVVEVfVkFMVUU7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5DT01CSU5BVE9SLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTUJJTkFUT1I7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX05BTUU7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRTsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuVU5JVkVSU0FMLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLlVOSVZFUlNBTDsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLklELmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLklEOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuUFNFVURPLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLlBTRVVETzsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SX0NMQVNTLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SX0NMQVNTOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORzsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5VUkk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyB0aGlzIGlzIGFyb3VuZCBmb3Igb2xkIGRlcHJlY2F0ZWQgcHJlZmVyZW5jZXNDaGFuZ2VkKCkgbWV0aG9kCi0JCQkvLyBUT0RPIHJlbW92ZSB3aGVuIHByZWZlcmVuY2VzQ2hhbmdlZCgpIGlzIHJlbW92ZWQKLQkJCWxvYWRDb2xvcnMoKTsKLQkJCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJfQotCi0JCWlmIChzdHlsZUtleSAhPSBudWxsKSB7Ci0JCQkvLyBvdmVyd3JpdGUgc3R5bGUgcHJlZmVyZW5jZSB3aXRoIG5ldyB2YWx1ZQotCQkJYWRkVGV4dEF0dHJpYnV0ZShzdHlsZUtleSk7Ci0JCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoZkNvbG9yVHlwZXMgIT0gbnVsbCkgewotCQkJZkNvbG9yVHlwZXMuY2xlYXIoKTsKLQkJCWZDb2xvclR5cGVzID0gbnVsbDsKLQkJfQotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZENvbG9ycygpIHsKLQkJaW5pdEF0dHJpYnV0ZXMoKTsKLQkJCi0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuQ09MT04pOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5FUlJPUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5VTklWRVJTQUwpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5BVFRSSUJVVEVfREVMSU0pOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5BVFRSSUJVVEVfTkFNRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLkFUVFJJQlVURV9PUEVSQVRPUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLkFUVFJJQlVURV9WQUxVRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTUJJTkFUT1IpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5JRCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SX0NMQVNTKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuUFNFVURPKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORyk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0Q29sb3JQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyOGY2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnN0eWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1MgZXh0ZW5kcyBMaW5lU3R5bGVQcm92aWRlckZvckNTUyB7Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcmVwYXJlUmVnaW9ucyhJVHlwZWRSZWdpb24gdHlwZWRSZWdpb24sIGludCBsaW5lUmVxdWVzdFN0YXJ0LCBpbnQgbGluZVJlcXVlc3RMZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJaW50IHJlZ2lvblN0YXJ0ID0gdHlwZWRSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCWludCByZWdpb25FbmQgPSByZWdpb25TdGFydCArIHR5cGVkUmVnaW9uLmdldExlbmd0aCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHdob2xlUmVnaW9uID0gZ2V0RG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChyZWdpb25TdGFydCk7Ci0KLQkJaWYgKHdob2xlUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJTGlzdCB0b2tlbnMgPSBudWxsOwotCQlpbnQgb2Zmc2V0ID0gdHlwZWRSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0KLQkJTGlzdCBjYWNoZSA9IGdldENhY2hlZFBhcnNpbmdSZXN1bHQod2hvbGVSZWdpb24pOwotCQlpZiAoY2FjaGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgY29udGVudCA9IGdldERvY3VtZW50KCkuZ2V0KHR5cGVkUmVnaW9uLmdldE9mZnNldCgpLCB0eXBlZFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCi0JCQkJLy9pZiByZWdpb24gaXMgYW4gWE1MIHRhZyB0aGVuIGluIENTUyBzdHlsZSBhdHRyaWJ1dGUsIGVsc2UgaW4gc3R5bGUgdGFnCi0gCQkJCWludCBtb2RlOwotCQkJCWlmKHdob2xlUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCQltb2RlID0gQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1vZGUgPSBDU1NUZXh0UGFyc2VyLk1PREVfU1RZTEVTSEVFVDsKLQkJCQl9Ci0JCQkJCi0JCQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihtb2RlLCBjb250ZW50KTsKLQkJCQl0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5MaXN0KCk7Ci0JCQkJY2FjaGVQYXJzaW5nUmVzdWx0KHdob2xlUmVnaW9uLCB0b2tlbnMpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkdpdmVuIGEgYmFkIElUeXBlZFJlZ2lvbjogIiArIHR5cGVkUmVnaW9uLCBlKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRva2VucyA9IGNhY2hlOwotCQl9Ci0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAodG9rZW5zICE9IG51bGwgJiYgMCA8IHRva2Vucy5zaXplKCkpIHsKLQkJCWludCBzdGFydCA9IG9mZnNldDsKLQkJCWludCBlbmQgPSBzdGFydDsKLQkJCUl0ZXJhdG9yIGkgPSB0b2tlbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUNTU1RleHRUb2tlbiB0b2tlbiA9IChDU1NUZXh0VG9rZW4pIGkubmV4dCgpOwotCQkJCWVuZCA9IHN0YXJ0ICsgdG9rZW4ubGVuZ3RoOwotCQkJCWludCBzdHlsZUxlbmd0aCA9IHRva2VuLmxlbmd0aDsKLQkJCQkvKiBUaGUgdG9rZW4gc3RhcnRzIGluIHRoZSByZWdpb24gKi8KLQkJCQlpZiAocmVnaW9uU3RhcnQgPD0gc3RhcnQgJiYgc3RhcnQgPCByZWdpb25FbmQpIHsKLQkJCQkJLyogWzIzOTQxNV0gVGhlIHJlZ2lvbiBtYXkgbm90IHNwYW4gdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgdG9rZW4gLQotCQkJCQkgKiBBZGp1c3QgdGhlIGxlbmd0aCBzbyB0aGF0IGl0IGRvZXNuJ3Qgb3ZlcmxhcCB3aXRoIG90aGVyIHN0eWxlIHJhbmdlcyAqLwotCQkJCQlpZiAocmVnaW9uRW5kIDwgZW5kKQotCQkJCQkJc3R5bGVMZW5ndGggPSByZWdpb25FbmQgLSBzdGFydDsKLQkJCQkJYWRkU3R5bGVSYW5nZShob2xkUmVzdWx0cywgZ2V0QXR0cmlidXRlRm9yKHRva2VuLmtpbmQpLCBzdGFydCwgc3R5bGVMZW5ndGgpOwotCQkJCX0KLQkJCQkvKiBUaGUgcmVnaW9uIHN0YXJ0cyBpbiB0aGUgdG9rZW4gKi8KLQkJCQllbHNlIGlmIChzdGFydCA8PSByZWdpb25TdGFydCAmJiByZWdpb25TdGFydCA8IGVuZCApIHsKLQkJCQkJLyogVGhlIHRva2VuIG1heSBub3Qgc3BhbiB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSByZWdpb24gKi8KLQkJCQkJaWYgKGVuZCA8IHJlZ2lvbkVuZCkKLQkJCQkJCXN0eWxlTGVuZ3RoID0gZW5kIC0gcmVnaW9uU3RhcnQ7Ci0JCQkJCWVsc2UgLyogQnVnemlsbGEgMjgyMjE4ICovIAotCQkJCQkJc3R5bGVMZW5ndGggPSByZWdpb25FbmQgLSByZWdpb25TdGFydDsKLQkJCQkJYWRkU3R5bGVSYW5nZShob2xkUmVzdWx0cywgZ2V0QXR0cmlidXRlRm9yKHRva2VuLmtpbmQpLCByZWdpb25TdGFydCwgc3R5bGVMZW5ndGgpOwotCQkJCX0KLQkJCQlzdGFydCArPSB0b2tlbi5sZW5ndGg7Ci0JCQl9Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFN0eWxlUmFuZ2UoQ29sbGVjdGlvbiBob2xkUmVzdWx0cywgVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAoYXR0cmlidXRlICE9IG51bGwpCi0JCQlob2xkUmVzdWx0cy5hZGQobmV3IFN0eWxlUmFuZ2Uoc3RhcnQsIGVuZCwgYXR0cmlidXRlLmdldEZvcmVncm91bmQoKSwgYXR0cmlidXRlLmdldEJhY2tncm91bmQoKSwgYXR0cmlidXRlLmdldFN0eWxlKCkpKTsKLQkJZWxzZQotCQkJaG9sZFJlc3VsdHMuYWRkKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBlbmQsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhbnVwQ2FjaGUoKSB7Ci0JCWZDYWNoZUtleSA9IC0xOwotCQlmQ2FjaGVSZXN1bHQgPSBudWxsOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRDYWNoZWRQYXJzaW5nUmVzdWx0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChmQ2FjaGVLZXkgPT0gcmVnaW9uLmdldFRleHQoKS5oYXNoQ29kZSgpKSB7Ci0JCQlyZXR1cm4gZkNhY2hlUmVzdWx0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWNoZVBhcnNpbmdSZXN1bHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIExpc3QgcmVzdWx0KSB7Ci0JCWZDYWNoZUtleSA9IHJlZ2lvbi5nZXRUZXh0KCkuaGFzaENvZGUoKTsKLQkJZkNhY2hlUmVzdWx0ID0gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQkJY2xlYW51cENhY2hlKCk7Ci0JfQotCi0JaW50IGZDYWNoZUtleSA9IC0xOwotCUxpc3QgZkNhY2hlUmVzdWx0ID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3ZGE2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuU2ltcGxlVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotCi0KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckNTUyBleHRlbmRzIFNpbXBsZVRlbXBsYXRlVmFyaWFibGVSZXNvbHZlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX1RZUEUgPSBnZXRFbmNvZGluZ1R5cGUoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFbmNvZGluZ1R5cGUoKSB7Ci0JCXJldHVybiAiZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlbmNvZGluZyB2YXJpYWJsZQotCSAqLwotCXB1YmxpYyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckNTUygpIHsKLQkJc3VwZXIoRU5DT0RJTkdfVFlQRSwgQ1NTVUlNZXNzYWdlcy5DcmVhdGluZ19maWxlc19lbmNvZGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlKFRlbXBsYXRlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5ODFjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5HbG9iYWxUZW1wbGF0ZVZhcmlhYmxlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIENTUyB0ZW1wbGF0ZSBjb250ZXh0IHR5cGVzLiBUZW1wbGF0ZXMgb2YgdGhpcyBjb250ZXh0IHR5cGUKLSAqIGFwcGx5IHRvIGFueSBwbGFjZSB3aXRoaW4gQ1NTIGNvbnRlbnQgdHlwZS4KLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVDU1MgZXh0ZW5kcyBUZW1wbGF0ZUNvbnRleHRUeXBlIHsKLQotCXB1YmxpYyBUZW1wbGF0ZUNvbnRleHRUeXBlQ1NTKCkgewotCQlzdXBlcigpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuQ3Vyc29yKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuRGF0ZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRvbGxhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkxpbmVTZWxlY3Rpb24oKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5UaW1lKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVXNlcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLldvcmRTZWxlY3Rpb24oKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5ZZWFyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJDU1MoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhMTM0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLQotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMID0gImNzc19hbGwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVcgPSAiY3NzX25ldyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZXh0L0NTU0NoYXJhY3RlclBhaXJJbnNlcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3RleHQvQ1NTQ2hhcmFjdGVyUGFpckluc2VydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNzVjN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3RleHQvQ1NTQ2hhcmFjdGVyUGFpckluc2VydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGV4dDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5JTGlua2VkTW9kZUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZVVJLkV4aXRGbGFnczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVVSS5JRXhpdFBvbGljeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS50eXBpbmcuQWJzdHJhY3RDaGFyYWN0ZXJQYWlySW5zZXJ0ZXI7DQotDQotcHVibGljIGNsYXNzIENTU0NoYXJhY3RlclBhaXJJbnNlcnRlciBleHRlbmRzIEFic3RyYWN0Q2hhcmFjdGVyUGFpckluc2VydGVyIHsNCi0NCi0JcHVibGljIGJvb2xlYW4gaGFzUGFpcihjaGFyIGMpIHsNCi0JCXN3aXRjaCAoYykgew0KLQkJCWNhc2UgJyInOg0KLQkJCWNhc2UgJ1wnJzoNCi0JCQljYXNlICdbJzoNCi0JCQljYXNlICcoJzoNCi0JCQljYXNlICd7JzoNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJZGVmYXVsdDoNCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCBjaGFyIGdldFBhaXIoY2hhciBjKSB7DQotCQlzd2l0Y2ggKGMpIHsNCi0JCQljYXNlICdcJyc6DQotCQkJY2FzZSAnIic6DQotCQkJCXJldHVybiBjOw0KLQkJCWNhc2UgJygnOg0KLQkJCQlyZXR1cm4gJyknOw0KLQkJCWNhc2UgJ1snOg0KLQkJCQlyZXR1cm4gJ10nOw0KLQkJCWNhc2UgJ3snOg0KLQkJCQlyZXR1cm4gJ30nOw0KLQkJCWRlZmF1bHQ6DQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsNCi0JCX0NCi0JfQ0KLQ0KLQljbGFzcyBFeGl0UG9saWN5IGltcGxlbWVudHMgSUV4aXRQb2xpY3kgew0KLQ0KLQkJcHJpdmF0ZSBjaGFyIGZFeGl0Ow0KLQkJcHJpdmF0ZSBjaGFyIGZFc2NhcGU7DQotCQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7DQotDQotCQlwdWJsaWMgRXhpdFBvbGljeShjaGFyIGV4aXQsIGNoYXIgZXNjYXBlLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsNCi0JCQlmRXhpdCA9IGV4aXQ7DQotCQkJZkVzY2FwZSA9IGVzY2FwZTsNCi0JCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsNCi0JCX0NCi0NCi0JCXB1YmxpYyBFeGl0RmxhZ3MgZG9FeGl0KExpbmtlZE1vZGVNb2RlbCBtb2RlbCwgVmVyaWZ5RXZlbnQgZXZlbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsNCi0JCQlpZighaXNNYXNrZWQob2Zmc2V0KSkgew0KLQkJCQlpZiAoZXZlbnQuY2hhcmFjdGVyID09IGZFeGl0KQ0KLQkJCQkJcmV0dXJuIG5ldyBFeGl0RmxhZ3MoSUxpbmtlZE1vZGVMaXN0ZW5lci5VUERBVEVfQ0FSRVQsIGZhbHNlKTsNCi0JCQkJaWYgKGV2ZW50LmNoYXJhY3RlciA9PSAnXHInIHx8IGV2ZW50LmNoYXJhY3RlciA9PSAnXG4nICYmIG9mZnNldCA+IDApIHsNCi0JCQkJCXRyeSB7DQotCQkJCQkJaWYgKGZEb2N1bWVudC5nZXRDaGFyKG9mZnNldCAtIDEpID09ICd7Jykgew0KLQkJCQkJCQlyZXR1cm4gbmV3IEV4aXRGbGFncyhJTGlua2VkTW9kZUxpc3RlbmVyLkVYSVRfQUxMLCB0cnVlKTsNCi0JCQkJCQl9DQotCQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQlwcml2YXRlIGJvb2xlYW4gaXNNYXNrZWQoaW50IG9mZnNldCkgew0KLQkJCXRyeSB7DQotCQkJCXJldHVybiBmRXNjYXBlID09IGZEb2N1bWVudC5nZXRDaGFyKG9mZnNldCAtIDEpOw0KLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsNCi0JCQl9DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCBJRXhpdFBvbGljeSBnZXRFeGl0UG9saWN5KGNoYXIgZXhpdCwgY2hhciBlc2NhcGUsIElEb2N1bWVudCBkb2N1bWVudCkgew0KLQkJcmV0dXJuIG5ldyBFeGl0UG9saWN5KGV4aXQsIGVzY2FwZSwgZG9jdW1lbnQpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZXh0L0NTU0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZXh0L0NTU0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWExMDM3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGV4dC9DU1NEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLXB1YmxpYyBjbGFzcyBDU1NEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIGltcGxlbWVudHMgSUNoYXJhY3RlclBhaXJNYXRjaGVyIHsKLQotCXByaXZhdGUgaW50IGZBbmNob3IgPSBJQ2hhcmFjdGVyUGFpck1hdGNoZXIuTEVGVDsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWxpZENvbnRleHRzCi0JICogQHBhcmFtIG5leHRNYXRjaGVyCi0JICovCi0JcHVibGljIENTU0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjY2xlYXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjZ2V0QW5jaG9yKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFuY2hvcigpIHsKLQkJcmV0dXJuIGZBbmNob3I7Ci0JfQotCi0JcHVibGljIElSZWdpb24gbWF0Y2goSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCXNob3J0IGJyYWNlQ291bnQgPSAxOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHIgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKHIgIT0gbnVsbCkgewotCQkJCWlmIChyLmdldFByZXZpb3VzKCkgIT0gbnVsbCAmJiByLmdldFN0YXJ0T2Zmc2V0KCkgPT0gb2Zmc2V0ICYmIHIuZ2V0UHJldmlvdXMoKS5nZXRUeXBlKCkuZXF1YWxzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpKSB7Ci0JCQkJCXIgPSByLmdldFByZXZpb3VzKCk7Ci0JCQkJfQotCQkJCWlmIChyLmdldFR5cGUoKS5lcXVhbHMoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkpIHsKLQkJCQkJd2hpbGUgKHIgIT0gbnVsbCAmJiAoYnJhY2VDb3VudCAhPSAwKSkgewotCQkJCQkJciA9IHIuZ2V0UHJldmlvdXMoKTsKLQkJCQkJCWlmIChyLmdldFR5cGUoKS5lcXVhbHMoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkpIHsKLQkJCQkJCSAgICAgICBicmFjZUNvdW50Kys7Ci0JCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoci5nZXRUeXBlKCkuZXF1YWxzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpKSB7Ci0JCQkJCQkgICBicmFjZUNvdW50LS07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHIgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIG5ldyBSZWdpb24oci5nZXRTdGFydE9mZnNldCgpLCAxKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoci5nZXRUeXBlKCkuZXF1YWxzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpKSB7Ci0JCQkJCXdoaWxlIChyICE9IG51bGwgJiYgKGJyYWNlQ291bnQgIT0gMCkpIHsKLQkJCQkJCXIgPSByLmdldE5leHQoKTsKLQkJCQkJCWlmIChyLmdldFR5cGUoKS5lcXVhbHMoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkpIHsKLQkJCQkJICAgICAgIGJyYWNlQ291bnQrKzsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHIuZ2V0VHlwZSgpLmVxdWFscyhDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSkgewotCQkJCQkJICAgYnJhY2VDb3VudC0tOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChyICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBuZXcgUmVnaW9uKHIuZ2V0RW5kT2Zmc2V0KCkgLSAxLCAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL0ZhY2V0TW9kdWxlQ29yZVN1cHBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC93aXphcmQvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzZjNjkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC93aXphcmQvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyBhbnkgdXNlZCBNb2R1bGUgQ29yZSBhbmQgRmFjZXRzIEFQSXMgYWxvbmcgd2l0aAotICogZmFsbGJhY2tzIGZvciB1c2Ugb24gbm9uLWNvbXBsaWFudCBwcm9qZWN0cyBhbmQgd2hlbiB0aG9zZSBzZXJ2aWNlcyBhcmUgbm90Ci0gKiBhdmFpbGFibGUgYXQgcnVudGltZS4KLSAqIAotICogQmVjYXVzZSBNb2R1bGVDb3JlIEFQSSBjYWxscyBjYW4gcmVzdWx0IGluIGxvY2tzIG5lZWRpbmcgdG8gYmUgYWNxdWlyZWQsCi0gKiBub25lIG9mIHRoZXNlIG1ldGhvZHMgc2hvdWxkIGJlIGNhbGxlZCB3aGlsZSBvdGhlciB0aHJlYWQgbG9ja3MgaGF2ZQotICogYWxyZWFkeSBiZWVuIGFjcXVpcmVkLgotICovCi1maW5hbCBjbGFzcyBGYWNldE1vZHVsZUNvcmVTdXBwb3J0IHsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZHVtcF9OQ0RGRSA9IGZhbHNlOwotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHRoZSBJUGF0aCB0byB0aGUgInJvb3QiIG9mIHRoZSB3ZWIgY29udGVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFdlYkNvbnRlbnRSb290UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhdGggPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuZ2V0V2ViQ29udGVudFJvb3RQYXRoKHByb2plY3QpOwotCQl9Ci0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQlpZiAoX2R1bXBfTkNERkUpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2ViUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBGYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuaXNXZWJQcm9qZWN0KHByb2plY3QpOwotCQl9Ci0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQlpZiAoX2R1bXBfTkNERkUpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC93aXphcmQvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZjE5MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIFdyYXBwZXIgY2xhc3MgZm9yIGFsbCBGYWNldC1yZWxhdGVkIGNhbGxzLiBJZiB0aGUgRmFjZXQgb3IgTW9kdWxlQ29yZQotICogYnVuZGxlcyBhcmUgbm90IGF2YWlsYWJsZSwgdGhpcyBjbGFzcyB3aWxsIG5vdCBsb2FkLCBvciBpZiBpdCBkb2VzLCBpdHMKLSAqIG1ldGhvZHMgd2lsbCBjYXVzZSBOb0NsYXNzRGVmRm91bmRFcnJvcnMuIFRoaXMgYWxsb3dzIHVzIHRvCi0gKiBjb21wYXJ0bWVudGFsaXplIHRoZSBkZXBlbmRlbmNpZXMuCi0gKiAKLSAqLwotZmluYWwgY2xhc3MgRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlIHsKLQkvKioKLQkgKiBDb3BpZWQgdG8gYXZvaWQgdW5uZWVkZWQgZXh0cmEgZGVwZW5kZW5jeSAocGx1cyBpdCdzIHVuY2xlYXIgd2h5IHRoZQotCSAqIHZhbHVlIGlzIGluIHRoYXQgcGx1Zy1pbikuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTVF9XRUJfTU9EVUxFID0gImpzdC53ZWIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NUX1dFQl9NT0RVTEUgPSAid3N0LndlYiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiB0aGUgSVBhdGggdG8gdGhlICJyb290IiBvZiB0aGUgd2ViIGNvbnRlbnRzCi0JICovCi0Jc3RhdGljIElQYXRoIGdldFdlYkNvbnRlbnRSb290UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmICghTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0KLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlpZiAoY29tcG9uZW50ICE9IG51bGwgJiYgY29tcG9uZW50LmV4aXN0cygpKSB7Ci0JCQlwYXRoID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKTsKLQkJfQotCQllbHNlIHsKLQkJCXBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaXNXZWJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJYm9vbGVhbiBpcyA9IGZhbHNlOwotCQl0cnkgewotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcm9qZWN0RmFjZXREZWZpbmVkKEpTVF9XRUJfTU9EVUxFKSkgewotCQkJCUlQcm9qZWN0RmFjZXQgZmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSlNUX1dFQl9NT0RVTEUpOwotCQkJCWlzID0gaXMgfHwgKGZhY2V0ZWQgIT0gbnVsbCAmJiBmYWNldGVkLmhhc1Byb2plY3RGYWNldChmYWNldCkpOwotCQkJfQotCQkJaWYgKFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZChXU1RfV0VCX01PRFVMRSkpIHsKLQkJCQlJUHJvamVjdEZhY2V0IGZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KFdTVF9XRUJfTU9EVUxFKTsKLQkJCQlpcyA9IGlzIHx8IChmYWNldGVkICE9IG51bGwgJiYgZmFjZXRlZC5oYXNQcm9qZWN0RmFjZXQoZmFjZXQpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBpczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU0ZpbGVXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU0ZpbGVXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYzY0MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9OZXdDU1NGaWxlV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotCi1jbGFzcyBOZXdDU1NGaWxlV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgewotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkNvbnRlbnRUeXBlOwotCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQkKLQlwdWJsaWMgTmV3Q1NTRmlsZVdpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgc3VwZXIocGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0gICAgfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiB0byBzZXQgdGhlIHNlbGVjdGVkIGZvbGRlciB0byB3ZWIgY29udGVudHMgCi0JICogZm9sZGVyIGlmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyBvdXRzaWRlIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyLiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsUG9wdWxhdGVDb250YWluZXJOYW1lRmllbGQoKSB7Ci0JCXN1cGVyLmluaXRpYWxQb3B1bGF0ZUNvbnRhaW5lck5hbWVGaWVsZCgpOwotCQkKLQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21QYXRoKGZ1bGxQYXRoKTsKLQkJSVBhdGggd2ViQ29udGVudFBhdGggPSBnZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KTsKLQkJCi0JCWlmICh3ZWJDb250ZW50UGF0aCAhPSBudWxsICYmICF3ZWJDb250ZW50UGF0aC5pc1ByZWZpeE9mKGZ1bGxQYXRoKSkgewotCQkJc2V0Q29udGFpbmVyRnVsbFBhdGgod2ViQ29udGVudFBhdGgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiB0byBzZXQgYWRkaXRpb25hbCB2YWxpZGF0aW9uIHNwZWNpZmljIHRvIAotCSAqIGNzcyBmaWxlcy4gCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlzZXRNZXNzYWdlKG51bGwpOwotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQotCQlpZiAoIXN1cGVyLnZhbGlkYXRlUGFnZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCUlQYXRoIGZ1bGxQYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJaWYgKChmdWxsUGF0aCAhPSBudWxsKSAmJiAoZnVsbFBhdGguaXNFbXB0eSgpID09IGZhbHNlKSAmJiAoZmlsZU5hbWUgIT0gbnVsbCkpIHsKLQkJCS8vIGNoZWNrIHRoYXQgZmlsZW5hbWUgZG9lcyBub3QgY29udGFpbiBpbnZhbGlkIGV4dGVuc2lvbgotCQkJaWYgKCFleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKGZpbGVOYW1lKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChDU1NVSU1lc3NhZ2VzLl9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9DU1MsIGdldFZhbGlkRXh0ZW5zaW9ucygpLnRvU3RyaW5nKCkpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBubyBmaWxlIGV4dGVuc2lvbiBzcGVjaWZpZWQgc28gY2hlY2sgYWRkaW5nIGRlZmF1bHQKLQkJCS8vIGV4dGVuc2lvbiBkb2Vzbid0IGVxdWFsIGEgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzCi0JCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PSAtMSkgewotCQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGFkZERlZmF1bHRFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkJCUlQYXRoIHJlc291cmNlUGF0aCA9IGZ1bGxQYXRoLmFwcGVuZChuZXdGaWxlTmFtZSk7Ci0KLQkJCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCQlJU3RhdHVzIHJlc3VsdCA9IHdvcmtzcGFjZS52YWxpZGF0ZVBhdGgocmVzb3VyY2VQYXRoLnRvU3RyaW5nKCksIElSZXNvdXJjZS5GT0xERVIpOwotCQkJCWlmICghcmVzdWx0LmlzT0soKSkgewotCQkJCQkvLyBwYXRoIGludmFsaWQKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKHJlc3VsdC5nZXRNZXNzYWdlKCkpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJaWYgKCh3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZvbGRlcihyZXNvdXJjZVBhdGgpLmV4aXN0cygpIHx8IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShyZXNvdXJjZVBhdGgpLmV4aXN0cygpKSkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoQ1NTVUlNZXNzYWdlcy5SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHMpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBnZXQgdGhlIElQcm9qZWN0IGZvciB0aGUgc2VsZWN0aW9uIHBhdGgKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0RnJvbVBhdGgoZnVsbFBhdGgpOwotCQkJLy8gaWYgaW5zaWRlIHdlYiBwcm9qZWN0LCBjaGVjayBpZiBpbnNpZGUgd2ViQ29udGVudCBmb2xkZXIKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgaXNXZWJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJLy8gY2hlY2sgdGhhdCB0aGUgcGF0aCBpcyBpbnNpZGUgdGhlIHdlYkNvbnRlbnQgZm9sZGVyCi0JCQkJSVBhdGggd2ViQ29udGVudFBhdGggPSBnZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KTsKLQkJCQlpZiAoIXdlYkNvbnRlbnRQYXRoLmlzUHJlZml4T2YoZnVsbFBhdGgpKSB7Ci0JCQkJCXNldE1lc3NhZ2UoQ1NTVUlNZXNzYWdlcy5fV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQsIFdBUk5JTkcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgY29udGVudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldyBmaWxlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gSUNvbnRlbnRUeXBlCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCWlmIChmQ29udGVudFR5cGUgPT0gbnVsbCkKLQkJCWZDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JDU1MuQ29udGVudFR5cGVJRF9DU1MpOwotCQlyZXR1cm4gZkNvbnRlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIEdldCBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMgZm9yIENTUyBDb250ZW50IHR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFZhbGlkRXh0ZW5zaW9ucygpIHsKLQkJaWYgKGZWYWxpZEV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkJZlZhbGlkRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdCh0eXBlLmdldEZpbGVTcGVjcyhJQ29udGVudFR5cGUuRklMRV9FWFRFTlNJT05fU1BFQykpKTsKLQkJfQotCQlyZXR1cm4gZlZhbGlkRXh0ZW5zaW9uczsKLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZpZXMgaWYgZmlsZU5hbWUgaXMgdmFsaWQgbmFtZSBmb3IgY29udGVudCB0eXBlLiBUYWtlcyBiYXNlIGNvbnRlbnQKLQkgKiB0eXBlIGludG8gY29uc2lkZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgZXh0ZW5zaW9uIGlzIHZhbGlkIGZvciB0aGlzIGNvbnRlbnQgdHlwZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKFN0cmluZyBmaWxlTmFtZSkgewotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgYW4gZXh0ZW5zaW9uCi0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSB7Ci0JCQkvLyBjaGVjayB3aGF0IGNvbnRlbnQgdHlwZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IGV4dGVuc2lvbgotCQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKGZpbGVOYW1lKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNLaW5kT2YodHlwZSk7Ci0JCQkJKytpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXZhbGlkID0gdHJ1ZTsgLy8gbm8gZXh0ZW5zaW9uIHNvIHZhbGlkCi0JCXJldHVybiB2YWxpZDsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGRlZmF1bHQgZXh0ZW5zaW9uIHRvIHRoZSBmaWxlbmFtZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgYWRkRGVmYXVsdEV4dGVuc2lvbihTdHJpbmcgZmlsZW5hbWUpIHsKLQkJU3RyaW5nQnVmZmVyIG5ld0ZpbGVOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihmaWxlbmFtZSk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBleHQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQotCQluZXdGaWxlTmFtZS5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQluZXdGaWxlTmFtZS5hcHBlbmQoZXh0KTsKLQotCQlyZXR1cm4gbmV3RmlsZU5hbWUudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHdoaWNoIHByb2plY3QgaXMgbmVlZGVkCi0JICogQHJldHVybiBJUHJvamVjdCBvYmplY3QuIElmIHBhdGggaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlIHJldHVybiB2YWx1ZSAKLQkgKiAJCSAgIGlzIGFsc28gPGNvZGU+bnVsbDwvY29kZT4uIAotCSAqLwotCXByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdEZyb21QYXRoKElQYXRoIHBhdGgpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJaWYgKHdvcmtzcGFjZS52YWxpZGF0ZVBhdGgocGF0aC50b1N0cmluZygpLCBJUmVzb3VyY2UuUFJPSkVDVCkuaXNPSygpKSB7Ci0JCQkJcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnRvU3RyaW5nKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpLmdldFByb2plY3QoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgaXMgYSB3ZWIgcHJvamVjdC4gCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgcHJvamVjdCB0byBiZSBjaGVja2VkCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9qZWN0IGlzIHdlYiBwcm9qZWN0LCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNXZWJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQuaXNXZWJQcm9qZWN0KHByb2plY3QpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHdoaWNoIHdlYiBjb250ZW50cyBwYXRoIGlzIG5lZWRlZAotCSAqIEByZXR1cm4gSVBhdGggb2YgdGhlIHdlYiBjb250ZW50cyBmb2xkZXIKLQkgKi8KLQlwcml2YXRlIElQYXRoIGdldFdlYkNvbnRlbnRQYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQuZ2V0V2ViQ29udGVudFJvb3RQYXRoKHByb2plY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIwYWZhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkRvY3VtZW50VGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkNTU1VJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0vKioKLSAqIFRlbXBsYXRlcyBwYWdlIGluIG5ldyBmaWxlIHdpemFyZC4gQWxsb3dzIHVzZXJzIHRvIHNlbGVjdCBhIG5ldyBmaWxlCi0gKiB0ZW1wbGF0ZSB0byBiZSBhcHBsaWVkIGluIG5ldyBmaWxlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBDb250ZW50IHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQkvKiogVGhlIHRlbXBsYXRlIHN0b3JlLiAqLwotCQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlN0b3JlOwotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlmU3RvcmUgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlyZXR1cm4gZlN0b3JlLmdldFRlbXBsYXRlcyhUZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTLk5FVyk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCWZTdG9yZSA9IChUZW1wbGF0ZVN0b3JlKSBuZXdJbnB1dDsKLQkJfQotCX0KLQotCS8qKgotCSAqIExhYmVsIHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gKFRlbXBsYXRlKSBlbGVtZW50OwotCi0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJCQljYXNlIDEgOgotCQkJCQlyZXR1cm4gdGVtcGxhdGUuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiogTGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZSBuYW1lICovCi0JcHJpdmF0ZSBTdHJpbmcgZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZTsKLQkvKiogVGhlIHZpZXdlciBkaXNwbGF5cyB0aGUgcGF0dGVybiBvZiBzZWxlY3RlZCB0ZW1wbGF0ZS4gKi8KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBmUGF0dGVyblZpZXdlcjsKLQkvKiogVGhlIHRhYmxlIHByZXNlbnRpbmcgdGhlIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIFRhYmxlVmlld2VyIGZUYWJsZVZpZXdlcjsKLQkvKiogVGVtcGxhdGUgc3RvcmUgdXNlZCBieSB0aGlzIHdpemFyZCBwYWdlICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCS8qKiBDaGVja2JveCBmb3IgdXNpbmcgdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgQnV0dG9uIGZVc2VUZW1wbGF0ZUJ1dHRvbjsKLQotCXB1YmxpYyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlKCkgewotCQlzdXBlcigiTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZSIsIENTU1VJTWVzc2FnZXMuTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8wLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLk5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfMSk7Ci0JfQotCi0JLyoqCi0JICogQ29ycmVjdGx5IHJlc2l6ZXMgdGhlIHRhYmxlIHNvIG5vIHBoYW50b20gY29sdW1ucyBhcHBlYXIKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcGFyYW0gYnV0dG9ucwotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbnMKLQkgKiBAcGFyYW0gdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSB0YWJsZQotCSAqIEBwYXJhbSBjb2x1bW4xCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbjIKLQkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbjMKLQkgKiAgICAgICAgICAgIHRoZSB0aGlyZCBjb2x1bW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlVGFibGVSZXNpemluZyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBUYWJsZSB0YWJsZSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMikgewotCQlwYXJlbnQuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJUmVjdGFuZ2xlIGFyZWEgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCVBvaW50IHByZWZlcnJlZFNpemUgPSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCWludCB3aWR0aCA9IGFyZWEud2lkdGggLSAyICogdGFibGUuZ2V0Qm9yZGVyV2lkdGgoKTsKLQkJCQlpZiAocHJlZmVycmVkU2l6ZS55ID4gYXJlYS5oZWlnaHQpIHsKLQkJCQkJLy8gU3VidHJhY3QgdGhlIHNjcm9sbGJhciB3aWR0aCBmcm9tIHRoZSB0b3RhbCBjb2x1bW4KLQkJCQkJLy8gd2lkdGgKLQkJCQkJLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotCQkJCQlQb2ludCB2QmFyU2l6ZSA9IHRhYmxlLmdldFZlcnRpY2FsQmFyKCkuZ2V0U2l6ZSgpOwotCQkJCQl3aWR0aCAtPSB2QmFyU2l6ZS54OwotCQkJCX0KLQotCQkJCVBvaW50IG9sZFNpemUgPSB0YWJsZS5nZXRTaXplKCk7Ci0JCQkJaWYgKG9sZFNpemUueCA+IHdpZHRoKSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgc21hbGxlciBzbyBtYWtlIHRoZSBjb2x1bW5zCi0JCQkJCS8vIHNtYWxsZXIgZmlyc3QgYW5kIHRoZW4gcmVzaXplIHRoZSB0YWJsZSB0bwotCQkJCQkvLyBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgYmlnZ2VyIHNvIG1ha2UgdGhlIHRhYmxlCi0JCQkJCS8vIGJpZ2dlciBmaXJzdCBhbmQgdGhlbiBtYWtlIHRoZSBjb2x1bW5zIHdpZGVyCi0JCQkJCS8vIHRvIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQl0YWJsZS5zZXRTaXplKHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgYW5jZXN0b3IpIHsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoYW5jZXN0b3IsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBjcmVhdGUgY2hlY2tib3ggZm9yIHVzZXIgdG8gdXNlIENTUyBUZW1wbGF0ZQotCQlmVXNlVGVtcGxhdGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVuYWJsZVRlbXBsYXRlcygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlIGZvciBUZW1wbGF0ZXMgdGFibGUKLQkJQ29tcG9zaXRlIGlubmVyUGFyZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBpbm5lckxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWlubmVyTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlpbm5lckxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlpbm5lckxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWlubmVyUGFyZW50LnNldExheW91dChpbm5lckxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSk7Ci0JCWlubmVyUGFyZW50LnNldExheW91dERhdGEoZ2QpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGlubmVyUGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzcpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRlbXBsYXRlcwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShpbm5lclBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzIpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMi5zZXRUZXh0KENTU1VJTWVzc2FnZXMuTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8zKTsKLQotCQlmVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQlmVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVGVtcGxhdGVMYWJlbFByb3ZpZGVyKCkpOwotCQlmVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlcigpKTsKLQotCQlmVGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyKSB7Ci0JCQkJaWYgKChvYmplY3QxIGluc3RhbmNlb2YgVGVtcGxhdGUpICYmIChvYmplY3QyIGluc3RhbmNlb2YgVGVtcGxhdGUpKSB7Ci0JCQkJCVRlbXBsYXRlIGxlZnQgPSAoVGVtcGxhdGUpIG9iamVjdDE7Ci0JCQkJCVRlbXBsYXRlIHJpZ2h0ID0gKFRlbXBsYXRlKSBvYmplY3QyOwotCQkJCQlpbnQgcmVzdWx0ID0gbGVmdC5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXROYW1lKCkpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApCi0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQlyZXR1cm4gbGVmdC5nZXREZXNjcmlwdGlvbigpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgb2JqZWN0MSwgb2JqZWN0Mik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzU29ydGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9KTsKLQotCQlmVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgewotCQkJCXVwZGF0ZVZpZXdlcklucHV0KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB2aWV3ZXIgdGhhdCBkaXNwbGF5cyBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUncyBjb250ZW50cwotCQlmUGF0dGVyblZpZXdlciA9IGRvQ3JlYXRlVmlld2VyKHBhcmVudCk7Ci0KLQkJZlRlbXBsYXRlU3RvcmUgPSBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCQlmVGFibGVWaWV3ZXIuc2V0SW5wdXQoZlRlbXBsYXRlU3RvcmUpOwotCi0JCS8vIENyZWF0ZSBsaW5rZWQgdGV4dCB0byBqdXN0IHRvIHRlbXBsYXRlcyBwcmVmZXJlbmNlIHBhZ2UKLQkJTGluayBsaW5rID0gbmV3IExpbmsocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxpbmsuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLk5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfNik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWxpbmtDbGlja2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNvbmZpZ3VyZVRhYmxlUmVzaXppbmcoaW5uZXJQYXJlbnQsIHRhYmxlLCBjb2x1bW4xLCBjb2x1bW4yKTsKLQkJbG9hZExhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElIZWxwQ29udGV4dElkcy5DU1NfTkVXV0laQVJEX1RFTVBMQVRFX0hFTFBJRCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJc2V0Q29udHJvbChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMsIGNvbmZpZ3VyZXMgYW5kIHJldHVybnMgYSBzb3VyY2Ugdmlld2VyIHRvIHByZXNlbnQgdGhlIHRlbXBsYXRlCi0JICogcGF0dGVybiBvbiB0aGUgcHJlZmVyZW5jZSBwYWdlLiBDbGllbnRzIG1heSBvdmVycmlkZSB0byBwcm92aWRlIGEKLQkgKiBjdXN0b20gc291cmNlIHZpZXdlciBmZWF0dXJpbmcgZS5nLiBzeW50YXggY29sb3JpbmcuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHJldHVybiBhIGNvbmZpZ3VyZWQgc291cmNlIHZpZXdlcgotCSAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQkJfTsKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlcihwYXJlbnQsIG51bGwsIG51bGwsIGZhbHNlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJdmlld2VyLmdldFRleHRXaWRnZXQoKS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDb250ZW50VHlwZUlkRm9yQ1NTLkNvbnRlbnRUeXBlSURfQ1NTKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gc2NyYXRjaE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl2aWV3ZXIuY29uZmlndXJlKHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCXByaXZhdGUgU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBjcmVhdGVWaWV3ZXIocGFyZW50KTsKLQkJdmlld2VyLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQlDb250cm9sIGNvbnRyb2wgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQkvLyBbMjYxMjc0XSAtIHNvdXJjZSB2aWV3ZXIgd2FzIGdyb3dpbmcgdG8gZml0IHRoZSBtYXggbGluZSB3aWR0aCBvZiB0aGUgdGVtcGxhdGUKLQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoMik7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZS9kaXNhYmxlIGNvbnRyb2xzIGluIHBhZ2UgYmFzZWQgb24gZlVzZVRlbXBsYXRlQnV0dG9uJ3MgY3VycmVudAotCSAqIHN0YXRlLgotCSAqLwotCXZvaWQgZW5hYmxlVGVtcGxhdGVzKCkgewotCQlib29sZWFuIGVuYWJsZWQgPSBmVXNlVGVtcGxhdGVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJaWYgKCFlbmFibGVkKSB7Ci0JCQkvLyBzYXZlIGxhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQkJaWYgKHRlbXBsYXRlICE9IG51bGwpCi0JCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJCWVsc2UKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihudWxsKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldFNlbGVjdGVkVGVtcGxhdGUoZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSk7Ci0JCX0KLQotCQlmVGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZQYXR0ZXJuVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGVtcGxhdGUgcHJlZmVyZW5jZSBwYWdlIGlkCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFByZWZlcmVuY2VQYWdlSWQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5wcmVmZXJlbmNlcy50ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGUgZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBudWxsOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQl0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiB0ZW1wbGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRlbXBsYXRlIHN0cmluZyB0byBpbnNlcnQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdG8gaW5zZXJ0IG9yIG51bGwgaWYgbm9uZSBpcyB0byBiZSBpbnNlcnRlZAotCSAqLwotCVN0cmluZyBnZXRUZW1wbGF0ZVN0cmluZygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gbnVsbDsKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKS5nZXRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTLk5FVyk7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoKTsKLQkJCVRlbXBsYXRlQ29udGV4dCBjb250ZXh0ID0gbmV3IERvY3VtZW50VGVtcGxhdGVDb250ZXh0KGNvbnRleHRUeXBlLCBkb2N1bWVudCwgMCwgMCk7Ci0JCQl0cnkgewotCQkJCVRlbXBsYXRlQnVmZmVyIGJ1ZmZlciA9IGNvbnRleHQuZXZhbHVhdGUodGVtcGxhdGUpOwotCQkJCXRlbXBsYXRlU3RyaW5nID0gYnVmZmVyLmdldFN0cmluZygpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgdGVtcGxhdGUgZm9yIG5ldyBjc3MiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRlbXBsYXRlU3RyaW5nOwotCX0KLQotCXZvaWQgbGlua0NsaWNrZWQoKSB7Ci0JCVN0cmluZyBwYWdlSWQgPSBnZXRQcmVmZXJlbmNlUGFnZUlkKCk7Ci0JCVByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBwYWdlSWQsIG5ldyBTdHJpbmdbXXtwYWdlSWR9LCBudWxsKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBOZXcgQ1NTIEZpbGUgd2l6YXJkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKSB7Ci0JCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIHNldFNlbGVjdGlvbiA9IGZhbHNlOwotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhDU1NVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9OQU1FKTsKLQkJaWYgKHRlbXBsYXRlTmFtZSA9PSBudWxsIHx8IHRlbXBsYXRlTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZW1wbGF0ZU5hbWUgPSBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKENTU1VJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX0lEKTsKLQkJCWlmICh0ZW1wbGF0ZU5hbWUgIT0gbnVsbCAmJiB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBmVGVtcGxhdGVTdG9yZS5maW5kVGVtcGxhdGVCeUlkKHRlbXBsYXRlTmFtZSk7Ci0JCQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJCQkJc2V0U2VsZWN0aW9uID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lOwotCQkJc2V0U2VsZWN0aW9uID0gdHJ1ZTsKLQkJfQotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKHNldFNlbGVjdGlvbik7Ci0JCWVuYWJsZVRlbXBsYXRlcygpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGVtcGxhdGUgbmFtZSB1c2VkIGZvciBuZXh0IGNhbGwgdG8gTmV3IENTUyBGaWxlIHdpemFyZC4KLQkgKi8KLQl2b2lkIHNhdmVMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQl0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoQ1NTVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQkJQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCBhIHRlbXBsYXRlIGluIHRoZSB0YWJsZSB2aWV3ZXIgZ2l2ZW4gdGhlIHRlbXBsYXRlIG5hbWUuIElmCi0JICogdGVtcGxhdGUgbmFtZSBjYW5ub3QgYmUgZm91bmQgb3IgdGVtcGxhdGVOYW1lIGlzIG51bGwsIGp1c3Qgc2VsZWN0Ci0JICogZmlyc3QgaXRlbSBpbiB0YWJsZS4gSWYgbm8gaXRlbXMgaW4gdGFibGUgc2VsZWN0IG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFRlbXBsYXRlKFN0cmluZyB0ZW1wbGF0ZU5hbWUpIHsKLQkJT2JqZWN0IHRlbXBsYXRlID0gbnVsbDsKLQotCQlpZiAodGVtcGxhdGVOYW1lICE9IG51bGwgJiYgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJLy8gcGljayB0aGUgbGFzdCB1c2VkIHRlbXBsYXRlCi0JCQl0ZW1wbGF0ZSA9IGZUZW1wbGF0ZVN0b3JlLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuTkVXKTsKLQkJfQotCi0JCS8vIG5vIHJlY29yZCBvZiBsYXN0IHVzZWQgdGVtcGxhdGUgc28ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJaWYgKHRlbXBsYXRlID09IG51bGwpIHsKLQkJCS8vIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCQl0ZW1wbGF0ZSA9IGZUYWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCk7Ci0JCX0KLQotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGVtcGxhdGUpOwotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgcGF0dGVybiB2aWV3ZXIuCi0JICovCi0Jdm9pZCB1cGRhdGVWaWV3ZXJJbnB1dCgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU1dpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9OZXdDU1NXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiNDU2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3IuQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotcHVibGljIGNsYXNzIE5ld0NTU1dpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCXByaXZhdGUgTmV3Q1NTRmlsZVdpemFyZFBhZ2UgZk5ld0ZpbGVQYWdlOwotCXByaXZhdGUgTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZSBmTmV3RmlsZVRlbXBsYXRlc1BhZ2U7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWZOZXdGaWxlUGFnZSA9IG5ldyBOZXdDU1NGaWxlV2l6YXJkUGFnZSgiQ1NTV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSIsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKElERS5jb21wdXRlU2VsZWN0ZWRSZXNvdXJjZXMoZlNlbGVjdGlvbikpKTsgLy8kTk9OLU5MUy0xJAotCQlmTmV3RmlsZVBhZ2Uuc2V0VGl0bGUoQ1NTVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19IRUFESU5HKTsgLy8kTk9OLU5MUy0xJAotCQlmTmV3RmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oQ1NTVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19ERVNDUklQVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkUGFnZShmTmV3RmlsZVBhZ2UpOwotCi0JCWZOZXdGaWxlVGVtcGxhdGVzUGFnZSA9IG5ldyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlKCk7Ci0JCWFkZFBhZ2UoZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBhcHBseUxpbmVEZWxpbWl0ZXIoSUZpbGUgZmlsZSwgU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRTdHJpbmcoUGxhdGZvcm0uUElfUlVOVElNRSwgUGxhdGZvcm0uUFJFRl9MSU5FX1NFUEFSQVRPUiwgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpLCBuZXcgSVNjb3BlQ29udGV4dFtdIHtuZXcgUHJvamVjdFNjb3BlKGZpbGUuZ2V0UHJvamVjdCgpKSwgbmV3IEluc3RhbmNlU2NvcGUoKSB9KTsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBjb252ZXJ0ZWRUZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZSh0ZXh0LCAiXHJcbiIsICJcbiIpOwotCQljb252ZXJ0ZWRUZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZShjb252ZXJ0ZWRUZXh0LCAiXHIiLCAiXG4iKTsKLQkJY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoY29udmVydGVkVGV4dCwgIlxuIiwgbGluZURlbGltaXRlcik7Ci0JCXJldHVybiBjb252ZXJ0ZWRUZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCWZTZWxlY3Rpb24gPSBhU2VsZWN0aW9uOwotCQlzZXRXaW5kb3dUaXRsZShDU1NVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX1RJVExFKTsgLy8kTk9OLU5MUy0xJAotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IENTU0ltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfV0laQkFOX05FV0NTU0ZJTEUpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJYm9vbGVhbiBwZXJmb3JtZWRPSyA9IGZhbHNlOwotCi0JCS8vIHNhdmUgdXNlciBvcHRpb25zIGZvciBuZXh0IHVzZQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2Uuc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGFkZCBkZWZhdWx0IGV4dGVuc2lvbgotCQlTdHJpbmcgZmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGZOZXdGaWxlUGFnZS5hZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCWZOZXdGaWxlUGFnZS5zZXRGaWxlTmFtZShuZXdGaWxlTmFtZSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSBuZXcgZW1wdHkgZmlsZQotCQlJRmlsZSBmaWxlID0gZk5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQkvLyBpZiB0aGVyZSB3YXMgcHJvYmxlbSB3aXRoIGNyZWF0aW5nIGZpbGUsIGl0IHdpbGwgYmUgbnVsbCwgc28gbWFrZQotCQkvLyBzdXJlIHRvIGNoZWNrCi0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCS8vIHB1dCB0ZW1wbGF0ZSBjb250ZW50cyBpbnRvIGZpbGUKLQkJCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IGZOZXdGaWxlVGVtcGxhdGVzUGFnZS5nZXRUZW1wbGF0ZVN0cmluZygpOwotCQkJaWYgKHRlbXBsYXRlU3RyaW5nICE9IG51bGwpIHsKLQkJCQl0ZW1wbGF0ZVN0cmluZyA9IGFwcGx5TGluZURlbGltaXRlcihmaWxlLCB0ZW1wbGF0ZVN0cmluZyk7Ci0JCQkJLy8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZyBmb3IgdGhlIG5ldyBmaWxlCi0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0KLQkJCQl0cnkgewotCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0U3RyZWFtV3JpdGVyID0gbnVsbDsKLQkJCQkJaWYgKGNoYXJTZXQgPT0gbnVsbCB8fCBjaGFyU2V0LnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIGp1c3QgdXNlIGRlZmF1bHQgZW5jb2RpbmcKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyU2V0KTsKLQkJCQkJfQotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIud3JpdGUodGVtcGxhdGVTdHJpbmcpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmNsb3NlKCk7Ci0JCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgY29udGVudHMgZm9yIG5ldyBDU1MgZmlsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJLy8gb3BlbiB0aGUgZmlsZSBpbiBlZGl0b3IKLQkJCW9wZW5FZGl0b3IoZmlsZSk7Ci0KLQkJCS8vIGV2ZXJ5dGhpbmcncyBmaW5lCi0JCQlwZXJmb3JtZWRPSyA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1lZE9LOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9DU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9DU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjOWQ4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvQ1NTQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBvdXRsaW5lIHZpZXcgcGFnZSB3aGljaCBzaG93cyBDU1MgY29udGVudC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGV4dGVuZHMgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgZkNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBmTGFiZWxQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT1VUTElORV9TT1JUX1BSRUYgPSAib3V0bGluZS1zb3J0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBDU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ1NTQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJQ29udHJpYnV0aW9uSXRlbVtdIGNyZWF0ZVRvb2xiYXJDb250cmlidXRpb25zKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBzdXBlci5jcmVhdGVUb29sYmFyQ29udHJpYnV0aW9ucyh2aWV3ZXIpOwotCi0JCVNvcnRBY3Rpb24gc29ydEFjdGlvbiA9IG5ldyBTb3J0QWN0aW9uKHZpZXdlciwgQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLCBPVVRMSU5FX1NPUlRfUFJFRik7Ci0JCUlDb250cmlidXRpb25JdGVtIHNvcnRJdGVtID0gbmV3IFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbShzb3J0QWN0aW9uKTsKLQotCQlpZiAoaXRlbXMgPT0gbnVsbCkgewotCQkJaXRlbXMgPSBuZXcgSUNvbnRyaWJ1dGlvbkl0ZW1bMV07Ci0JCQlpdGVtc1swXSA9IHNvcnRJdGVtOwotCQl9Ci0JCWVsc2UgewotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBjb21iaW5lZEl0ZW1zID0gbmV3IElDb250cmlidXRpb25JdGVtW2l0ZW1zLmxlbmd0aCArIDFdOwotCQkJY29tYmluZWRJdGVtc1swXSA9IHNvcnRJdGVtOwotCQkJU3lzdGVtLmFycmF5Y29weShpdGVtcywgMCwgY29tYmluZWRJdGVtcywgMSwgaXRlbXMubGVuZ3RoKTsKLQkJCWl0ZW1zID0gY29tYmluZWRJdGVtczsKLQkJfQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JcHVibGljIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmQ29udGVudFByb3ZpZGVyID09IG51bGwpCi0JCQlmQ29udGVudFByb3ZpZGVyID0gbmV3IEpGYWNlTm9kZUNvbnRlbnRQcm92aWRlckNTUygpOwotCQlyZXR1cm4gZkNvbnRlbnRQcm92aWRlcjsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRGaWx0ZXJlZE5vZGUoT2JqZWN0IG8pIHsKLQkJSUNTU05vZGUgbm9kZSA9IG51bGw7Ci0JCWlmIChvIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCW5vZGUgPSAoSUNTU05vZGUpIG87Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSB7Ci0JCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiAhKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkpIHsKLQkJCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGVUeXBlID09IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkgewotCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGVUeXBlID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7Ci0JCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gZ2V0RmlsdGVyZWROb2RlcyhPYmplY3RbXSBvYmplY3RzKSB7Ci0JCU9iamVjdFtdIGZpbHRlcmVkID0gbmV3IE9iamVjdFtvYmplY3RzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVyZWQubGVuZ3RoOyBpKyspIHsKLQkJCWZpbHRlcmVkW2ldID0gZ2V0RmlsdGVyZWROb2RlKG9iamVjdHNbaV0pOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJlZDsKLQl9Ci0KLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZkxhYmVsUHJvdmlkZXIgPT0gbnVsbCkKLQkJCWZMYWJlbFByb3ZpZGVyID0gbmV3IEpGYWNlTm9kZUxhYmVsUHJvdmlkZXJDU1MoKTsKLQkJcmV0dXJuIGZMYWJlbFByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5TdHJ1Y3R1cmVkQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbihUcmVlVmlld2VyIHZpZXdlciwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVNlbGVjdGlvbiBmaWx0ZXJlZFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3RbXSBmaWx0ZXJlZE5vZGVzID0gZ2V0RmlsdGVyZWROb2RlcygoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKSk7Ci0JCQlmaWx0ZXJlZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbHRlcmVkTm9kZXMpOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJlZFNlbGVjdGlvbjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0NTU0NvbnRlbnRTZWxlY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0NTU0NvbnRlbnRTZWxlY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2YwYmU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9DU1NDb250ZW50U2VsZWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuSUNvbnRlbnRTZWxlY3Rpb25Qcm92aWRlcjsKLQotY2xhc3MgQ1NTQ29udGVudFNlbGVjdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSUNvbnRlbnRTZWxlY3Rpb25Qcm92aWRlciB7Ci0KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oVHJlZVZpZXdlciB2aWV3ZXIsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlTZWxlY3Rpb24gZmlsdGVyZWRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJT2JqZWN0W10gZmlsdGVyZWROb2RlcyA9IGdldEZpbHRlcmVkTm9kZXMoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0FycmF5KCkpOwotCQkJZmlsdGVyZWRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaWx0ZXJlZE5vZGVzKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyZWRTZWxlY3Rpb247Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBnZXRGaWx0ZXJlZE5vZGVzKE9iamVjdFtdIGZpbHRlcmVkTm9kZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJlZE5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaWx0ZXJlZE5vZGVzW2ldID0gZ2V0RmlsdGVyZWROb2RlKGZpbHRlcmVkTm9kZXNbaV0pOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJlZE5vZGVzOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldEZpbHRlcmVkTm9kZShPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIElmIHRoZSBzZWxlY3Rpb24gaXMgYSBwcmltaXRpdmUgdmFsdWUsIGdldCB0aGUgcHJvcGVydHkgdGhhdCBjb250YWlucyBpdCAqLwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNTU1ByaW1pdGl2ZVZhbHVlKSB7Ci0JCQlJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUgPSAoSUNTU1ByaW1pdGl2ZVZhbHVlKSBvYmplY3Q7Ci0JCQlvYmplY3QgPSB2YWx1ZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9DU1NRdWlja091dGxpbmVDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvQ1NTUXVpY2tPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjI2MTY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9DU1NRdWlja091dGxpbmVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLklDb250ZW50U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5xdWlja291dGxpbmUuQWJzdHJhY3RRdWlja091dGxpbmVDb25maWd1cmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ1NTUXVpY2tPdXRsaW5lQ29uZmlndXJhdGlvbiBleHRlbmRzIEFic3RyYWN0UXVpY2tPdXRsaW5lQ29uZmlndXJhdGlvbiB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnF1aWNrb3V0bGluZS5BYnN0cmFjdFF1aWNrT3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0Q29udGVudFByb3ZpZGVyKCkKLQkgKi8KLQlwdWJsaWMgSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEpGYWNlTm9kZUNvbnRlbnRQcm92aWRlckNTUygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucXVpY2tvdXRsaW5lLkFic3RyYWN0UXVpY2tPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRDb250ZW50U2VsZWN0aW9uUHJvdmlkZXIoKQotCSAqLwotCXB1YmxpYyBJQ29udGVudFNlbGVjdGlvblByb3ZpZGVyIGdldENvbnRlbnRTZWxlY3Rpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBDU1NDb250ZW50U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnF1aWNrb3V0bGluZS5BYnN0cmFjdFF1aWNrT3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0TGFiZWxQcm92aWRlcigpCi0JICovCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSkZhY2VOb2RlTGFiZWxQcm92aWRlckNTUygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUNvbnRlbnRQcm92aWRlckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUNvbnRlbnRQcm92aWRlckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGYzNTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVDb250ZW50UHJvdmlkZXJDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotCi0vKioKLSAqIEEgQ29udGVudCBwcm92aWRlciBmb3IgYSBKRmFjZSB2aWV3ZXIgdXNlZCB0byBkaXNwbGF5IENTUyBub2Rlcy4gVGhpcwotICogY29udGVudCBwcm92aWRlciBkb2VzIG5vdCB1c2UgYWRhcHRlcnMuCi0gKi8KLWNsYXNzIEpGYWNlTm9kZUNvbnRlbnRQcm92aWRlckNTUyBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCXB1YmxpYyBKRmFjZU5vZGVDb250ZW50UHJvdmlkZXJDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbGVtZW50cyhPYmplY3QgZWxlbWVudCwgQXJyYXlMaXN0IHYpIHsKLQotCQlJQ1NTTm9kZSBub2RlOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQlJQ1NTTW9kZWwgbW9kZWwgPSAoSUNTU01vZGVsKSBlbGVtZW50OwotCQkJSUNTU0RvY3VtZW50IGRvYyA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQlub2RlID0gZG9jLmdldEZpcnN0Q2hpbGQoKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCW5vZGUgPSAoKElDU1NOb2RlKSBlbGVtZW50KS5nZXRGaXJzdENoaWxkKCk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuOwotCi0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUnVsZSkgewotCQkJCXYuYWRkKG5vZGUpOwotCQkJfQotCi0JCQlub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdmlzdWFsIHBhcnQgdGhhdCBpcyB1c2luZyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgaXMgYWJvdXQgdG8gYmUKLQkgKiBkaXNwb3NlZC4gRGVhbGxvY2F0ZSBhbGwgYWxsb2NhdGVkIFNXVCByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIGNvbnRhaW5pbmcgYWxsIGNoaWxkIG5vZGVzIG9mIHRoZSBnaXZlbiBlbGVtZW50LAotCSAqIHdoaWNoIHJlcHJlc2VudHMgYSBub2RlIGluIGEgdHJlZS4gVGhlIGRpZmZlcmVuY2UgdG8KLQkgKiA8Y29kZT5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhPYmplY3QpPC9jb2RlPiBpcyBhcwotCSAqIGZvbGxvd3M6IDxjb2RlPmdldEVsZW1lbnRzPC9jb2RlPiBpcyBjYWxsZWQgdG8gb2J0YWluIHRoZSB0cmVlCi0JICogdmlld2VyJ3Mgcm9vdCBlbGVtZW50cy4gTWV0aG9kIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiBpcyB1c2VkIHRvCi0JICogb2J0YWluIHRoZSBjaGlsZHJlbiBvZiBhIGdpdmVuIG5vZGUgaW4gdGhlIHRyZWUsIHdoaWNoIGNhbiBjYW4gYmUgYQotCSAqIHJvb3Qgbm9kZSwgdG9vLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKG9iamVjdCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCi0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gd2l0aCB0aGUgZWxlbWVudHMgYmVsb25naW5nIHRvIHRoZSBwYXNzZWQKLQkgKiBlbGVtZW50LiBUaGVzZSBlbGVtZW50cyBjYW4gYmUgcHJlc2VudGVkIGFzIHJvd3MgaW4gYSB0YWJsZSwgaXRlbXMgaW4gYQotCSAqIGxpc3QgZXRjLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKG9iamVjdCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCi0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIHRoYXQgdGhlIHBhcmVudCBjYW4ndCBiZSBjb21wdXRlZC4gSW4KLQkgKiB0aGlzIGNhc2UgdGhlIHRyZWUgdmlld2VyIGNhbid0IGV4cGFuZCBhIGdpdmVuIG5vZGUgY29ycmVjdGx5IGlmCi0JICogcmVxdWVzdGVkLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqZWN0KTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyLmdldFBhcmVudChvYmplY3QpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGVsZW1lbnQgaGFzIGNoaWxkcmVuLgotCSAqIE90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihvYmplY3QpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuaGFzQ2hpbGRyZW4ob2JqZWN0KTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG9sZElucHV0ICE9IG51bGwgJiYgb2xkSW5wdXQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZE1vZGVsKSB7Ci0JCQlJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkpICgoSVN0cnVjdHVyZWRNb2RlbCkgb2xkSW5wdXQpLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkucmVtb3ZlTGlzdGVuZXIodmlld2VyKTsKLQkJCX0KLQkJfQotCQlpZiAobmV3SW5wdXQgIT0gbnVsbCAmJiBuZXdJbnB1dCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCUlKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSkgKChJU3RydWN0dXJlZE1vZGVsKSBuZXdJbnB1dCkuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJZmFjdG9yeS5hZGRMaXN0ZW5lcih2aWV3ZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGVsZW1lbnQgaXMgZGVsZXRlZCBvciBub3QuCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEpGYWNlIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGFibGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QgVGhlIG9iamVjdCB0byBnZXQgdGhlIGFkYXB0ZXIgZm9yCi0JICovCi0JcHJpdmF0ZSBJSkZhY2VOb2RlQWRhcHRlciBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGUpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0JCWlmIChhZGFwdGFibGUgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpIHsKLQkJCWFkYXB0YWJsZSA9ICgoSUNTU01vZGVsKSBhZGFwdGFibGUpLmdldERvY3VtZW50KCk7Ci0JCX0KLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElDU1NOb2RlICYmIGFkYXB0YWJsZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9ICgoSU5vZGVOb3RpZmllcikgYWRhcHRhYmxlKS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChub2RlQWRhcHRlciBpbnN0YW5jZW9mIElKRmFjZU5vZGVBZGFwdGVyKQotCQkJCWFkYXB0ZXIgPSAoSUpGYWNlTm9kZUFkYXB0ZXIpIG5vZGVBZGFwdGVyOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVMYWJlbFByb3ZpZGVyQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvSkZhY2VOb2RlTGFiZWxQcm92aWRlckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjRkZTJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVMYWJlbFByb3ZpZGVyQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotCi1jbGFzcyBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyQ1NTIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXJDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSkZhY2UgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGFkYXB0YWJsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCBUaGUgb2JqZWN0IHRvIGdldCB0aGUgYWRhcHRlciBmb3IKLQkgKi8KLQlwcml2YXRlIElKRmFjZU5vZGVBZGFwdGVyIGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZSkgewotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJYWRhcHRhYmxlID0gKChJQ1NTTW9kZWwpIGFkYXB0YWJsZSkuZ2V0RG9jdW1lbnQoKTsKLQkJfQotCQlpZiAoYWRhcHRhYmxlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJSU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gKChJTm9kZU5vdGlmaWVyKSBhZGFwdGFibGUpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKG5vZGVBZGFwdGVyIGluc3RhbmNlb2YgSUpGYWNlTm9kZUFkYXB0ZXIpCi0JCQkJYWRhcHRlciA9IChJSkZhY2VOb2RlQWRhcHRlcikgbm9kZUFkYXB0ZXI7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgZm9yIHVzZSBpbiB0aGUKLQkgKiBnaXZlbiB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgVGhlIHZpZXdlciB0aGF0IGRpc3BsYXlzIHRoZSBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgaW1hZ2UuIEVsZW1lbnQKLQkgKiAgICAgICAgICAgIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIG5vIGlucHV0IG9iamVjdCBpcyBzZXQKLQkgKiAgICAgICAgICAgIHRvIHRoZSB2aWV3ZXIuCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIoZWxlbWVudCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlpbWFnZSA9IGFkYXB0ZXIuZ2V0TGFiZWxJbWFnZShlbGVtZW50KTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgZm9yIHVzZSBpbiB0aGUKLQkgKiBnaXZlbiB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgVGhlIHZpZXdlciB0aGF0IGRpc3BsYXlzIHRoZSBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgdGV4dC4gRWxlbWVudCBjYW4KLQkgKiAgICAgICAgICAgIGJlIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgbm8gaW5wdXQgb2JqZWN0IGlzIHNldCB0bwotCSAqICAgICAgICAgICAgdGhlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihlbGVtZW50KTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJdGV4dCA9IGFkYXB0ZXIuZ2V0TGFiZWxUZXh0KGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgbGFiZWwgcHJvdmlkZXIgaXMgYWZmZWN0ZWQgYnkgdGhlIGdpdmVuIGRvbWFpbgotCSAqIGV2ZW50LgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZmZlY3RlZChPYmplY3QgZHVtbXkpIHsvLyBEb21haW5FdmVudCBldmVudCkgewotCQkvLyByZXR1cm4gZXZlbnQuaXNNb2RpZmllcihEb21haW5FdmVudC5OT05fU1RSVUNUVVJFX0NIQU5HRSk7Ci0JCXJldHVybiB0cnVlOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCBieSBhIGNoYW5nZSB0byB0aGUgZ2l2ZW4KLQkgKiBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBvcHRpbWl6ZSBhCi0JICogbm9uLXN0cnVjdHVyYWwgdmlld2VyIHVwZGF0ZS4gSWYgdGhlIHByb3BlcnR5IG1lbnRpb25lZCBpbiB0aGUgdXBkYXRlCi0JICogZG9lcyBub3QgYWZmZWN0IHRoZSBsYWJlbCwgdGhlbiB0aGUgdmlld2VyIG5lZWQgbm90IHVwZGF0ZSB0aGUgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIHByb3BlcnR5Ci0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCwgYW5kCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgd291bGQgYmUgdW5hZmZlY3RlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvU29ydEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL1NvcnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcwZGJmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvU29ydEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5DU1NFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbjsKLQotLyoKLSAqIEJhc2VkIG9uIERURENvbnRlbnRPdXRsaW5lUGFnZSNTb3J0QWN0aW9uCi0gKi8KLWNsYXNzIFNvcnRBY3Rpb24gZXh0ZW5kcyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbiB7Ci0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwdWJsaWMgU29ydEFjdGlvbihUcmVlVmlld2VyIHZpZXdlciwgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIHByZWZlcmVuY2VLZXkpIHsKLQkJc3VwZXIoQ1NTVUlNZXNzYWdlcy5Tb3J0QWN0aW9uXzAsIHN0b3JlLCBwcmVmZXJlbmNlS2V5LCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oQ1NTVUlQbHVnaW4uSUQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1NPUlQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoZGVzYyk7Ci0JCXNldFRvb2xUaXBUZXh0KGdldFRleHQoKSk7Ci0JCXRyZWVWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWlmIChpc0NoZWNrZWQoKSkgewotCQkJdHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKG5ldyBWaWV3ZXJDb21wYXJhdG9yKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KGZhbHNlKTsKLQkJT2JqZWN0W10gZXhwYW5kZWRFbGVtZW50cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOwotCQlpZiAoaXNDaGVja2VkKCkpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgVmlld2VyQ29tcGFyYXRvcigpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihudWxsKTsKLQkJfQotCQl0cmVlVmlld2VyLnNldElucHV0KHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRFbGVtZW50cyhleHBhbmRlZEVsZW1lbnRzKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9wcm9wZXJ0aWVzL0NTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvcHJvcGVydGllcy9DU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGMxZmE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9wcm9wZXJ0aWVzL0NTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb3BlcnRpZXMuQ1NTUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIHByb3BlcnR5IHNoZWV0IHBhZ2Ugd2hpY2ggc2hvd3MgQ1NTIGNvbnRlbnQuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBleHRlbmRzIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIGNsYXNzIENTU1Byb3BlcnR5U2hlZXRSZWZyZXNoQWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkJaWYgKGZQcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQkJZ2V0UHJvcGVydGllc1JlZnJlc2hKb2IoKS5hZGRQcm9wZXJ0eVNoZWV0UGFnZShmUHJvcGVydHlTaGVldFBhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDU1NQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgewotCQlwcml2YXRlIElQcm9wZXJ0eVNvdXJjZSBmUHJvcGVydHlTb3VyY2UgPSBudWxsOwotCQlwcml2YXRlIElDU1NOb2RlIGZTb3VyY2UgPSBudWxsOwotCi0JCXB1YmxpYyBJUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKGZTb3VyY2UgIT0gbnVsbCAmJiBvYmplY3QuZXF1YWxzKGZTb3VyY2UpKSB7Ci0JCQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZTsKLQkJCX0KLQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJZlNvdXJjZSA9IChJQ1NTTm9kZSlvYmplY3Q7Ci0JCQkJZlByb3BlcnR5U291cmNlID0gbmV3IENTU1Byb3BlcnR5U291cmNlKGZTb3VyY2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZlNvdXJjZSA9IG51bGw7Ci0JCQkJZlByb3BlcnR5U291cmNlID0gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBmUHJvcGVydHlTb3VyY2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFByb3BlcnRpZXNSZWZyZXNoSm9iIGV4dGVuZHMgVUlKb2IgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUERBVEVfREVMQVkgPSAyMDA7Ci0KLQkJcHJpdmF0ZSBTZXQgcHJvcGVydHlTaGVldFBhZ2VzID0gbnVsbDsKLQotCQlwdWJsaWMgUHJvcGVydGllc1JlZnJlc2hKb2IoKSB7Ci0JCQlzdXBlcihYTUxVSU1lc3NhZ2VzLkpGYWNlTm9kZUFkYXB0ZXJfMSk7Ci0JCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCQlzZXRQcmlvcml0eShKb2IuU0hPUlQpOwotCQkJcHJvcGVydHlTaGVldFBhZ2VzID0gbmV3IEhhc2hTZXQoMSk7Ci0JCX0KLQotCQl2b2lkIGFkZFByb3BlcnR5U2hlZXRQYWdlKElQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZXMuYWRkKHBhZ2UpOwotCQkJc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlPYmplY3RbXSBwYWdlcyA9IHByb3BlcnR5U2hlZXRQYWdlcy50b0FycmF5KCk7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZXMuY2xlYXIoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UgPSAoUHJvcGVydHlTaGVldFBhZ2UpIHBhZ2VzW2ldOwotCQkJCWlmIChwYWdlLmdldENvbnRyb2woKSAhPSBudWxsICYmICFwYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJcGFnZS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCX0KLQotCXByaXZhdGUgUHJvcGVydGllc1JlZnJlc2hKb2IgZlByb3BlcnRpZXNSZWZyZXNoSm9iID0gbnVsbDsKLQotCUlQcm9wZXJ0eVNoZWV0UGFnZSBmUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQlwcml2YXRlIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyID0gbnVsbDsKLQotCXByaXZhdGUgSU5vZGVBZGFwdGVyIGZSZWZyZXNoQWRhcHRlciA9IG5ldyBDU1NQcm9wZXJ0eVNoZWV0UmVmcmVzaEFkYXB0ZXIoKTsKLQotCXByaXZhdGUgSU5vZGVOb3RpZmllcltdIGZTZWxlY3RlZE5vdGlmaWVyczsKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0SW5wdXRTZWxlY3Rpb24oSVdvcmtiZW5jaFBhcnQgc2VsZWN0aW5nUGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gcmVtb3ZlIFVJIHJlZnJlc2ggYWRhcHRlcnMKLQkJaWYgKGZTZWxlY3RlZE5vdGlmaWVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZTZWxlY3RlZE5vdGlmaWVycy5sZW5ndGg7IGkrKykgewotCQkJCWZTZWxlY3RlZE5vdGlmaWVyc1tpXS5yZW1vdmVBZGFwdGVyKGZSZWZyZXNoQWRhcHRlcik7Ci0JCQl9Ci0JCQlmU2VsZWN0ZWROb3RpZmllcnMgPSBudWxsOwotCQl9Ci0KLQkJSVNlbGVjdGlvbiBwcmVmZXJyZWRTZWxlY3Rpb24gPSBzdXBlci5nZXRJbnB1dFNlbGVjdGlvbihzZWxlY3RpbmdQYXJ0LCBzZWxlY3Rpb24pOwotCQlpZiAocHJlZmVycmVkU2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdFtdIHNlbGVjdGVkT2JqZWN0cyA9IG5ldyBPYmplY3RbKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5zaXplKCldOwotCQkJU3lzdGVtLmFycmF5Y29weSgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKSwgMCwgc2VsZWN0ZWRPYmplY3RzLCAwLCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHNlbGVjdGVkT2JqZWN0c1tpXSBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJCUlDU1NOb2RlIG5vZGUgPSAoSUNTU05vZGUpIHNlbGVjdGVkT2JqZWN0c1tpXTsKLQkJCQkJd2hpbGUgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5QUklNSVRJVkVWQUxVRV9OT0RFIHx8IG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xJVEVNX05PREUpIHsKLQkJCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCXNlbGVjdGVkT2JqZWN0c1tpXSA9IG5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBBZGQgVUkgcmVmcmVzaCBhZGFwdGVycyBhbmQgcmVtZW1iZXIgbm90aWZpZXJzIGZvciBsYXRlcgotCQkJICogcmVtb3ZhbAotCQkJICovCi0JCQlpZiAoc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCA+IDApIHsKLQkJCQlMaXN0IHNlbGVjdGVkTm90aWZpZXJzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkT2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoc2VsZWN0ZWRPYmplY3RzW2ldIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkJc2VsZWN0ZWROb3RpZmllcnMuYWRkKHNlbGVjdGVkT2JqZWN0c1tpXSk7Ci0JCQkJCQkoKElOb2RlTm90aWZpZXIpIHNlbGVjdGVkT2JqZWN0c1tpXSkuYWRkQWRhcHRlcihmUmVmcmVzaEFkYXB0ZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZTZWxlY3RlZE5vdGlmaWVycyA9IChJTm9kZU5vdGlmaWVyW10pIHNlbGVjdGVkTm90aWZpZXJzLnRvQXJyYXkobmV3IElOb2RlTm90aWZpZXJbc2VsZWN0ZWROb3RpZmllcnMuc2l6ZSgpXSk7Ci0JCQl9Ci0JCQlwcmVmZXJyZWRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZE9iamVjdHMpOwotCQl9Ci0JCXJldHVybiBwcmVmZXJyZWRTZWxlY3Rpb247Ci0JfQotCi0JUHJvcGVydGllc1JlZnJlc2hKb2IgZ2V0UHJvcGVydGllc1JlZnJlc2hKb2IoKSB7Ci0JCWlmIChmUHJvcGVydGllc1JlZnJlc2hKb2IgPT0gbnVsbCkgewotCQkJZlByb3BlcnRpZXNSZWZyZXNoSm9iID0gbmV3IFByb3BlcnRpZXNSZWZyZXNoSm9iKCk7Ci0JCX0KLQkJcmV0dXJuIGZQcm9wZXJ0aWVzUmVmcmVzaEpvYjsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgZ2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihJUHJvcGVydHlTaGVldFBhZ2UgcGFnZSkgewotCQlpZiAoZlByb3BlcnR5U291cmNlUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZlByb3BlcnR5U291cmNlUHJvdmlkZXIgPSBuZXcgQ1NTUHJvcGVydHlTb3VyY2VQcm92aWRlcigpOwotCQkJZlByb3BlcnR5U2hlZXRQYWdlID0gcGFnZTsKLQkJfQotCQlyZXR1cm4gZlByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmUoKSB7Ci0JCXN1cGVyLnVuY29uZmlndXJlKCk7Ci0JCWlmIChmU2VsZWN0ZWROb3RpZmllcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmU2VsZWN0ZWROb3RpZmllcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmU2VsZWN0ZWROb3RpZmllcnNbaV0ucmVtb3ZlQWRhcHRlcihmUmVmcmVzaEFkYXB0ZXIpOwotCQkJfQotCQkJZlNlbGVjdGVkTm90aWZpZXJzID0gbnVsbDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvdGVtcGxhdGVzL2Nzc2RlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvdGVtcGxhdGVzL2Nzc2RlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjgyZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3RlbXBsYXRlcy9jc3NkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRlbXBsYXRlcy5uZXdjc3MubmFtZT1OZXcgQ1NTIEZpbGUKLVRlbXBsYXRlcy5uZXdjc3MuZGVzYz1uZXcgY3NzIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS90ZW1wbGF0ZXMvY3NzZGVmYXVsdC10ZW1wbGF0ZXMueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3RlbXBsYXRlcy9jc3NkZWZhdWx0LXRlbXBsYXRlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZTBmMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3RlbXBsYXRlcy9jc3NkZWZhdWx0LXRlbXBsYXRlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPHRlbXBsYXRlcz4KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLm5ld2Nzcy5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5uZXdjc3MuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzLm5ld2NzcyIgY29udGV4dD0iY3NzX25ldyIgZW5hYmxlZD0idHJ1ZSI+QENIQVJTRVQgIiR7ZW5jb2Rpbmd9Ijs8L3RlbXBsYXRlPgotPC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1NWViYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbnRlbnRtb2RlbC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJlbWZtb2RlbC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzYXhwYXJzZXIvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXZhbGlkYXRpb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmExMzk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotcnVudGltZQotZHRkY29yZS5qYXIKLSouemlwCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1AZG90Ci1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjI0OWU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmY5YjM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSNTYXQgTWFyIDI0IDAyOjE2OjMyIEVEVCAyMDA3DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzgwOTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNXZWQgTm92IDE1IDAyOjA4OjQ1IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjE5ODgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jV2VkIE5vdiAxNSAwMjowODo0NSBFU1QgMjAwNg0KLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MA0KLWNvbXBpbGVycy5wLmJ1aWxkPTANCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTENCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wDQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTANCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wDQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MA0KLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xDQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wDQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTANCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlDQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWY2ZjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjUwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50YXNrczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50b2tlbml6ZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS50ZXh0LAotIHJvc2UKLUltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS51dGlsOyB2ZXJzaW9uPSIzLjgiLAotIGNvbS5pYm0uaWN1LnRleHQ7IHZlcnNpb249IjMuOCIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMSwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eTsgZXhjbHVkZTo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50IgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzMzJhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICBjb250ZW50bW9kZWwvLFwKLSAgICAgICAgICAgZW1mbW9kZWwvLFwKLSAgICAgICAgICAgc2F4cGFyc2VyLyxcCi0gICAgICAgICAgIHNyYy12YWxpZGF0aW9uLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZGMxMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5kdGQiPgotCTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlciIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vZWNsaXBzZS5vcmcvd2VidG9vbHMvd3N0L2NvbXBvbmVudHMvZHRkL292ZXJ2aWV3Lmh0bWwiIC8+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURCIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iRFREQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcCIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50RmFjdG9yeURURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudEZhY3RvcnlEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlNjRiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50RmFjdG9yeURURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmZhY3RvcnkuQ01Eb2N1bWVudEZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBidWlsZGVyIGhhbmRsZXMgYnVpbGRpbmcgLmR0ZCBncmFtbWFyIGZpbGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50RmFjdG9yeURURCBpbXBsZW1lbnRzIENNRG9jdW1lbnRGYWN0b3J5IHsKLQlwdWJsaWMgQ01Eb2N1bWVudEZhY3RvcnlEVEQoKSB7Ci0JfQotCi0KLQlwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KFN0cmluZyB1cmkpIHsKLQkJLy8gd29yayBhcm91bmQgYSBidWcgaW4gb3VyIHBhcnNlcnMKLQkJLy8gdG9kby4uLiByZXZpc2l0IHRoaXMKLQkJLy8KLS8vCQlodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAwNDgxCi0vLwkJU3RyaW5nIGZpbGVQcm90b2NvbCA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLS8vCQlpZiAodXJpLnN0YXJ0c1dpdGgoZmlsZVByb3RvY29sKSkgewotLy8JCQl1cmkgPSB1cmkuc3Vic3RyaW5nKGZpbGVQcm90b2NvbC5sZW5ndGgoKSk7Ci0vLwkJfQotCi0JCUNNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IERUREltcGwuYnVpbGRDTURvY3VtZW50KHVyaSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJjb3VsZCBub3QgY3JlYXRlIGNvbnRlbnQgbW9kZWwgZm9yIFVSSTogIiArIHVyaSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlN2M1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTU5vZGVJbXBsIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBDTU5vZGUgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RPQ1VNRU5UQVRJT04gPSAiZG9jdW1lbnRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OX1NPVVJDRSA9ICJkb2N1bWVudGF0aW9uU291cmNlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RPQ1VNRU5UQVRJT05fTEFOR1VBR0UgPSAiZG9jdW1lbnRhdGlvbkxhbmd1YWdlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX01PRl9OT1RJRklFUiA9ICJrZXkiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVGSU5JVElPTl9JTkZPID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9kZWZpbml0aW9uSW5mbyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERUZJTklUSU9OID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9kZWZpbml0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRLZXkoKTsKLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfTU9GX05PVElGSUVSKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9iamVjdCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0RUREltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0RUREltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwYjA2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9EVERJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsLkRUREJhc2ljVHlwZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsLkRURFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVudGl0eURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01EYXRhVHlwZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTUVudGl0eURlY2xhcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTmFtZWROb2RlTWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTm9kZUxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURlc2NyaXB0aW9uQnVpbGRlcjsKLQotCi1wdWJsaWMgY2xhc3MgRFRESW1wbCB7Ci0Jc3RhdGljIHsKLQkJLy8gQ2FsbCBpbml0IG9uIHRoZSBEVEQgcGFja2FnZSB0byBhdm9pZCBzdHJhbmdlIGluaXRpYWxpemF0aW9uIGJ1Z3MKLQkJLy8KLQkJRFREUGFja2FnZUltcGwuaW5pdCgpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRFREQWRhcHRlckZhY3RvcnlJbXBsIGR0ZEFkYXB0ZXJGYWN0b3J5SW1wbCA9IG5ldyBEVERBZGFwdGVyRmFjdG9yeUltcGwoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIENNRGF0YVR5cGVJbmZvVGFibGUgY21EYXRhVHlwZUluZm9UYWJsZSA9IG5ldyBDTURhdGFUeXBlSW5mb1RhYmxlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50KFN0cmluZyB1cmkpIHsKLQkJRFRERmlsZSBkdGRGaWxlID0gYnVpbGREVERNb2RlbCh1cmkpOwotCQlDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCkgZ2V0QWRhcHRlcihkdGRGaWxlKTsKLQkJCi0JCXJldHVybiBjbURvY3VtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRFRERmlsZSBidWlsZERURE1vZGVsKFN0cmluZyB1cmkpIHsKLQkJRFREVXRpbCBkdGRVdGlsID0gbmV3IERURFV0aWwoKTsKLQkJZHRkVXRpbC5zZXRleHBhbmRFbnRpdHlSZWZlcmVuY2VzKHRydWUpOwotCQlkdGRVdGlsLnBhcnNlKG5ldyBSZXNvdXJjZVNldEltcGwoKSwgdXJpKTsKLQkJcmV0dXJuIGR0ZFV0aWwuZ2V0RFRERmlsZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCXJldHVybiAoQ01Eb2N1bWVudCkgZ2V0QWRhcHRlcihkdGRGaWxlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENNTm9kZSBnZXRBZGFwdGVyKE5vdGlmaWVyIG8pIHsKLQkJcmV0dXJuIChDTU5vZGUpIGR0ZEFkYXB0ZXJGYWN0b3J5SW1wbC5hZGFwdChvKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRNaW5PY2N1ckhlbHBlcihEVERSZXBlYXRhYmxlQ29udGVudCBjb250ZW50KSB7Ci0JCWludCBvY2N1cmVuY2UgPSBjb250ZW50LmdldE9jY3VycmVuY2UoKS5nZXRWYWx1ZSgpOwotCQlib29sZWFuIGlzT3B0aW9uYWwgPSAob2NjdXJlbmNlID09IERURE9jY3VycmVuY2VUeXBlLk9QVElPTkFMIHx8IG9jY3VyZW5jZSA9PSBEVERPY2N1cnJlbmNlVHlwZS5aRVJPX09SX01PUkUpOwotCQlyZXR1cm4gaXNPcHRpb25hbCA/IDAgOiAxOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGdldE1heE9jY3VySGVscGVyKERURFJlcGVhdGFibGVDb250ZW50IGNvbnRlbnQpIHsKLQkJaW50IG9jY3VyZW5jZSA9IGNvbnRlbnQuZ2V0T2NjdXJyZW5jZSgpLmdldFZhbHVlKCk7Ci0JCWJvb2xlYW4gaXNNdWx0aSA9IChvY2N1cmVuY2UgPT0gRFRET2NjdXJyZW5jZVR5cGUuT05FX09SX01PUkUgfHwgb2NjdXJlbmNlID09IERURE9jY3VycmVuY2VUeXBlLlpFUk9fT1JfTU9SRSk7Ci0JCXJldHVybiBpc011bHRpID8gLTEgOiAxOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRFREQWRhcHRlckZhY3RvcnlJbXBsIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJCUFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLQkJCWlmICh0YXJnZXQgIT0gbnVsbCkgewotCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBEVERBdHRyaWJ1dGUpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IERUREF0dHJpYnV0ZUFkYXB0ZXIoKERUREF0dHJpYnV0ZSkgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRFRERWxlbWVudCkgewotCQkJCQlyZXN1bHQgPSBuZXcgRFRERWxlbWVudEFkYXB0ZXIoKERUREVsZW1lbnQpIHRhcmdldCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEFkYXB0ZXIoKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB0YXJnZXQpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBEVERGaWxlKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBEVERGaWxlQWRhcHRlcigoRFRERmlsZSkgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRFRER3JvdXBDb250ZW50KSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBEVERHcm91cENvbnRlbnRBZGFwdGVyKChEVERHcm91cENvbnRlbnQpIHRhcmdldCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIERUREVudGl0eSkgewotCQkJCQlyZXN1bHQgPSBuZXcgRFRERW50aXR5QWRhcHRlcigoRFRERW50aXR5KSB0YXJnZXQpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCQlyZXR1cm4gYWRhcHQodGFyZ2V0LCB0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERUREJhc2VBZGFwdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBEVERCYXNlQWRhcHRlciBleHRlbmRzIENNTm9kZUltcGwgewotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gdHlwZSA9PSBkdGRBZGFwdGVyRmFjdG9yeUltcGw7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIkNNRG9jdW1lbnQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gZ2V0Q01Eb2N1bWVudCgpOwotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ET0NVTUVOVEFUSU9OKSkgewotCQkJCXJlc3VsdCA9IGdldERvY3VtZW50YXRpb24oKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfREVGSU5JVElPTl9JTkZPKSkgewotCQkJCXJlc3VsdCA9IGdldERlZmluaXRpb25JbmZvKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFRklOSVRJT04pKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0RGVmaW5pdGlvbigpOwotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9NT0ZfTk9USUZJRVIpKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0S2V5KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJzcGVjIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IGdldFNwZWMoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENNRG9jdW1lbnQoKTsKLQkJCQkJaWYgKGNtRG9jdW1lbnQgaW5zdGFuY2VvZiBEVERGaWxlQWRhcHRlcikgewotCQkJCQkJQW5ub3RhdGlvbk1hcCBtYXAgPSAoKERUREZpbGVBZGFwdGVyKSBjbURvY3VtZW50KS5hbm5vdGF0aW9uTWFwOwotCQkJCQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIHNwZWMgPSBnZXRTcGVjKCk7Ci0JCQkJCQkJaWYgKHNwZWMgIT0gbnVsbCkgewotCQkJCQkJCQlyZXN1bHQgPSBtYXAuZ2V0UHJvcGVydHkoZ2V0U3BlYygpLCBwcm9wZXJ0eU5hbWUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQkJCU1hcCBnbG9iYWxQcm9wZXJ0eU1hcCA9ICgoRFRERmlsZUFkYXB0ZXIpIGNtRG9jdW1lbnQpLmdsb2JhbFByb3BlcnR5TWFwOwotCQkJCQkJCXJlc3VsdCA9IGdsb2JhbFByb3BlcnR5TWFwLmdldChwcm9wZXJ0eU5hbWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByb3RlY3RlZCBDTU5vZGVMaXN0IGdldERvY3VtZW50YXRpb24oKSB7Ci0JCQlyZXR1cm4gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldERlZmluaXRpb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3BlYygpIHsKLQkJCXJldHVybiBnZXROb2RlTmFtZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRFREQXR0cmlidXRlQWRhcHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRFREQXR0cmlidXRlQWRhcHRlciBleHRlbmRzIERUREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiB7Ci0JCXByb3RlY3RlZCBEVERBdHRyaWJ1dGUgYXR0cmlidXRlOwotCQlwcm90ZWN0ZWQgQ01EYXRhVHlwZSBkYXRhVHlwZTsKLQotCQlwdWJsaWMgRFREQXR0cmlidXRlQWRhcHRlcihEVERBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQl0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKLQkJCWRhdGFUeXBlID0gbmV3IERhdGFUeXBlSW1wbCgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0JCQlyZXR1cm4gYXR0cmlidXRlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRTcGVjKCkgewotCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXREVERFbGVtZW50KCkuZ2V0TmFtZSgpICsgIi9AIiArIGF0dHJpYnV0ZS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gQVRUUklCVVRFX0RFQ0xBUkFUSU9OOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBdHRyTmFtZSgpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIENNRGF0YVR5cGUgZ2V0QXR0clR5cGUoKSB7Ci0JCQlyZXR1cm4gZGF0YVR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oYXR0cmlidXRlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFVzYWdlKCkgewotCQkJaW50IHVzYWdlID0gT1BUSU9OQUw7Ci0JCQlzd2l0Y2ggKGF0dHJpYnV0ZS5nZXREZWZhdWx0S2luZCgpLmdldFZhbHVlKCkpIHsKLQkJCQljYXNlIERURERlZmF1bHRLaW5kLlJFUVVJUkVEIDogewotCQkJCQl1c2FnZSA9IFJFUVVJUkVEOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBEVEREZWZhdWx0S2luZC5GSVhFRCA6IHsKLQkJCQkJdXNhZ2UgPSBGSVhFRDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHVzYWdlOwotCQl9Ci0KLQkJcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpIHsKLQkJCURUREZpbGUgZHRkRmlsZSA9IGF0dHJpYnV0ZS5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpOwotCQkJcmV0dXJuIGR0ZEZpbGUgIT0gbnVsbCA/IChDTURvY3VtZW50KSBnZXRBZGFwdGVyKGR0ZEZpbGUpIDogbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBjbGFzcyBEYXRhVHlwZUltcGwgaW1wbGVtZW50cyBDTURhdGFUeXBlIHsKLQkJCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQkJcmV0dXJuIENNTm9kZS5EQVRBX1RZUEU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQkJcmV0dXJuIGdldERhdGFUeXBlTmFtZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscygiaXNWYWxpZEVtcHR5VmFsdWUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBkYXRhVHlwZU5hbWUgPSBnZXREYXRhVHlwZU5hbWUoKTsKLQkJCQkJcmVzdWx0ID0gKGRhdGFUeXBlTmFtZSA9PSBudWxsIHx8IGRhdGFUeXBlTmFtZS5lcXVhbHMoQ01EYXRhVHlwZS5DREFUQSkpID8gInRydWUiIDogImZhbHNlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKCkgewotCQkJCXJldHVybiBjbURhdGFUeXBlSW5mb1RhYmxlLmdldERhdGFUeXBlTmFtZShhdHRyaWJ1dGUuZ2V0RFREVHlwZSgpKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZW5lcmF0ZUluc3RhbmNlVmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGNtRGF0YVR5cGVJbmZvVGFibGUuZ2V0SW5zdGFuY2VWYWx1ZShhdHRyaWJ1dGUuZ2V0RFREVHlwZSgpKTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRJbXBsaWVkVmFsdWVLaW5kKCkgewotCQkJCWludCByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0JCQkJaW50IGRlZmF1bHRWYWx1ZUtpbmQgPSBhdHRyaWJ1dGUuZ2V0RGVmYXVsdEtpbmQoKS5nZXRWYWx1ZSgpOwotCQkJCWlmIChkZWZhdWx0VmFsdWVLaW5kID09IERURERlZmF1bHRLaW5kLk5PRklYRUQpIHsKLQkJCQkJcmVzdWx0ID0gSU1QTElFRF9WQUxVRV9ERUZBVUxUOwotCQkJCX0KLQkJCQllbHNlIGlmIChkZWZhdWx0VmFsdWVLaW5kID09IERURERlZmF1bHRLaW5kLkZJWEVEKSB7Ci0JCQkJCXJlc3VsdCA9IElNUExJRURfVkFMVUVfRklYRUQ7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SW1wbGllZFZhbHVlKCkgewotCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRFbnVtZXJhdGVkVmFsdWVzKCkgewotCQkJCU9iamVjdFtdIG9iamVjdExpc3QgPSBhdHRyaWJ1dGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpLnRvQXJyYXkoKTsKLQkJCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW29iamVjdExpc3QubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdExpc3QubGVuZ3RoOyBpKyspIHsKLQkJCQkJcmVzdWx0W2ldID0gb2JqZWN0TGlzdFtpXS50b1N0cmluZygpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBEVERFbGVtZW50QmFzZUFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIERUREVsZW1lbnRCYXNlQWRhcHRlciBleHRlbmRzIERUREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01FbGVtZW50RGVjbGFyYXRpb24gewotCQlwcm90ZWN0ZWQgQ01EYXRhVHlwZSBkYXRhVHlwZTsKLQotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgRFRERWxlbWVudCBnZXREVERFbGVtZW50KCk7Ci0KLQkJcHJvdGVjdGVkIENNRG9jdW1lbnRhdGlvbiBkb2N1bWVudGF0aW9uID0gbnVsbDsKLQotCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJcmV0dXJuIEVMRU1FTlRfREVDTEFSQVRJT047Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuIGdldERUREVsZW1lbnQoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJCUNNTmFtZWROb2RlTWFwSW1wbCByZXN1bHQgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCQlMaXN0IGF0dHJpYnV0ZUxpc3QgPSBnZXREVERFbGVtZW50KCkuZ2V0RFREQXR0cmlidXRlKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBhdHRyaWJ1dGVMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCURUREF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoRFREQXR0cmlidXRlKSBpLm5leHQoKTsKLQkJCQlyZXN1bHQuZ2V0SGFzaHRhYmxlKCkucHV0KGF0dHJpYnV0ZS5nZXROYW1lKCksIGdldEFkYXB0ZXIoYXR0cmlidXRlKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQkJcmV0dXJuIChDTUNvbnRlbnQpIGdldEFkYXB0ZXIoZ2V0RFRERWxlbWVudCgpLmdldENvbnRlbnQoKSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQkJLy8gdG9kbwotCQkJaW50IHJlc3VsdCA9IEVMRU1FTlQ7Ci0JCQlEVERFbGVtZW50Q29udGVudCBkdGRFbGVtZW50Q29udGVudCA9IGdldERUREVsZW1lbnQoKS5nZXRDb250ZW50KCk7Ci0JCQlpZiAoZHRkRWxlbWVudENvbnRlbnQgaW5zdGFuY2VvZiBEVERQQ0RhdGFDb250ZW50KSB7Ci0JCQkJcmVzdWx0ID0gUENEQVRBOwotCQkJfQotCQkJZWxzZSBpZiAoZHRkRWxlbWVudENvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpIHsKLQkJCQlEVERHcm91cENvbnRlbnQgZ3JvdXBDb250ZW50ID0gKERUREdyb3VwQ29udGVudCkgZHRkRWxlbWVudENvbnRlbnQ7Ci0JCQkJaW50IGdyb3VwS2luZCA9IGdyb3VwQ29udGVudC5nZXRHcm91cEtpbmQoKS5nZXRWYWx1ZSgpOwotCQkJCWlmIChncm91cEtpbmQgPT0gRFRER3JvdXBLaW5kLkNIT0lDRSkgewotCQkJCQlMaXN0IGxpc3QgPSBncm91cENvbnRlbnQuZ2V0Q29udGVudCgpOwotCQkJCQlpZiAobGlzdC5zaXplKCkgPiAwICYmIGxpc3QuZ2V0KDApIGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCkgewotCQkJCQkJcmVzdWx0ID0gTUlYRUQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChkdGRFbGVtZW50Q29udGVudCBpbnN0YW5jZW9mIERUREFueUNvbnRlbnQpIHsKLQkJCQlyZXN1bHQgPSBBTlk7Ci0JCQl9Ci0JCQllbHNlIGlmIChkdGRFbGVtZW50Q29udGVudCBpbnN0YW5jZW9mIERUREVtcHR5Q29udGVudCkgewotCQkJCXJlc3VsdCA9IEVNUFRZOwotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJCXJldHVybiBnZXREVERFbGVtZW50KCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7Ci0JCQlpbnQgY29udGVudFR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkJYm9vbGVhbiBoYXNEYXRhVHlwZSA9IGNvbnRlbnRUeXBlID09IFBDREFUQSB8fCBjb250ZW50VHlwZSA9PSBNSVhFRDsKLQkJCXJldHVybiBoYXNEYXRhVHlwZSA/IGRhdGFUeXBlIDogbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRMb2NhbEVsZW1lbnRzKCkgewotCQkJcmV0dXJuIENNTmFtZWROb2RlTWFwSW1wbC5FTVBUWV9OQU1FRF9OT0RFX01BUDsKLQkJfQotCi0JCXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCQlEVERGaWxlIGR0ZEZpbGUgPSBnZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpOwotCQkJcmV0dXJuIGR0ZEZpbGUgIT0gbnVsbCA/IChDTURvY3VtZW50KSBnZXRBZGFwdGVyKGR0ZEZpbGUpIDogbnVsbDsKLQkJfQotCi0JCXByb3RlY3RlZCBDTU5vZGVMaXN0IGdldERvY3VtZW50YXRpb24oKSB7Ci0JCQlDTU5vZGVMaXN0SW1wbCBub2RlTGlzdCA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotCQkJaWYgKGRvY3VtZW50YXRpb24gPT0gbnVsbCkgewotCQkJCVN0cmluZyBjb21tZW50ID0gZ2V0RFRERWxlbWVudCgpLmdldENvbW1lbnQoKTsKLQkJCQlpZiAoY29tbWVudCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY29tbWVudCwgIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJdmFsdWUgKz0gc3QubmV4dFRva2VuKCkudHJpbSgpICsgIlxuIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWRvY3VtZW50YXRpb24gPSBuZXcgQ01Eb2N1bWVudGF0aW9uSW1wbCh2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRvY3VtZW50YXRpb24gIT0gbnVsbCkgewotCQkJCW5vZGVMaXN0LmdldExpc3QoKS5hZGQoZG9jdW1lbnRhdGlvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9kZUxpc3Q7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ01Eb2N1bWVudGF0aW9uSW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnRhdGlvbiB7Ci0JCXByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0KLQkJcHVibGljIENNRG9jdW1lbnRhdGlvbkltcGwoU3RyaW5nIHZhbHVlKSB7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJcmV0dXJuIERPQ1VNRU5UQVRJT047Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIERUREVsZW1lbnRBZGFwdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEVERFbGVtZW50QWRhcHRlciBleHRlbmRzIERUREVsZW1lbnRCYXNlQWRhcHRlciB7Ci0JCXByb3RlY3RlZCBEVERFbGVtZW50IGVsZW1lbnQ7Ci0KLQkJcHVibGljIERUREVsZW1lbnRBZGFwdGVyKERUREVsZW1lbnQgZWxlbWVudCkgewotCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJCWRhdGFUeXBlID0gbmV3IENNRGF0YVR5cGVJbXBsKCIjUENEQVRBIiwgZ2V0RFRERWxlbWVudCgpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgRFRERWxlbWVudCBnZXREVERFbGVtZW50KCkgewotCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1heE9jY3VyKCkgewotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCkgewotCQkJcmV0dXJuICJnbG9iYWwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldERlZmluaXRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEFkYXB0ZXIgZXh0ZW5kcyBEVERFbGVtZW50QmFzZUFkYXB0ZXIgewotCQlwcm90ZWN0ZWQgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgY29udGVudDsKLQotCQlwdWJsaWMgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGNvbnRlbnQpIHsKLQkJCXRoaXMuY29udGVudCA9IGNvbnRlbnQ7Ci0JCQlkYXRhVHlwZSA9IG5ldyBDTURhdGFUeXBlSW1wbCgiI1BDREFUQSIsIGdldERUREVsZW1lbnQoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJCXJldHVybiBjb250ZW50OwotCQl9Ci0KLQkJcHJvdGVjdGVkIERUREVsZW1lbnQgZ2V0RFRERWxlbWVudCgpIHsKLQkJCXJldHVybiBjb250ZW50LmdldFJlZmVyZW5jZWRFbGVtZW50KCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQkJcmV0dXJuIGdldE1pbk9jY3VySGVscGVyKGNvbnRlbnQpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJCXJldHVybiBnZXRNYXhPY2N1ckhlbHBlcihjb250ZW50KTsKLQkJfQotCi0KLQkJcHVibGljIENNTm9kZSBnZXREZWZpbml0aW9uKCkgewotCQkJcmV0dXJuIGdldEFkYXB0ZXIoZ2V0RFRERWxlbWVudCgpKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogRFRERW50aXR5QWRhcHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRFRERW50aXR5QWRhcHRlciBleHRlbmRzIERUREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01FbnRpdHlEZWNsYXJhdGlvbiB7Ci0JCXByb3RlY3RlZCBEVERFbnRpdHkgZHRkRW50aXR5OwotCi0JCXB1YmxpYyBEVERFbnRpdHlBZGFwdGVyKERUREVudGl0eSBkdGRFbnRpdHkpIHsKLQkJCXRoaXMuZHRkRW50aXR5ID0gZHRkRW50aXR5OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBFTlRJVFlfREVDTEFSQVRJT047Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJCXJldHVybiBkdGRFbnRpdHk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gZHRkRW50aXR5LmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGR0ZEVudGl0eS5nZXRDb250ZW50KCkgaW5zdGFuY2VvZiBEVERJbnRlcm5hbEVudGl0eSkgewotCQkJCURUREludGVybmFsRW50aXR5IGNvbnRlbnQgPSAoRFRESW50ZXJuYWxFbnRpdHkpIGR0ZEVudGl0eS5nZXRDb250ZW50KCk7Ci0JCQkJdmFsdWUgPSBjb250ZW50LmdldFZhbHVlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIERUREdyb3VwQ29udGVudEFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERUREdyb3VwQ29udGVudEFkYXB0ZXIgZXh0ZW5kcyBEVERCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNR3JvdXAgewotCQlwcm90ZWN0ZWQgRFRER3JvdXBDb250ZW50IGNvbnRlbnQ7Ci0KLQkJcHVibGljIERUREdyb3VwQ29udGVudEFkYXB0ZXIoRFRER3JvdXBDb250ZW50IGNvbnRlbnQpIHsKLQkJCXRoaXMuY29udGVudCA9IGNvbnRlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJCXJldHVybiBjb250ZW50OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBHUk9VUDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlDTURlc2NyaXB0aW9uQnVpbGRlciBkZXNjcmlwdGlvbkJ1aWxkZXIgPSBuZXcgQ01EZXNjcmlwdGlvbkJ1aWxkZXIoKTsKLQkJCXJldHVybiBkZXNjcmlwdGlvbkJ1aWxkZXIuYnVpbGREZXNjcmlwdGlvbih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCQlMaXN0IGxpc3QgPSBjb250ZW50LmdldENvbnRlbnQoKTsKLQkJCUNNTm9kZUxpc3RJbXBsIHJlc3VsdCA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotCQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlDTU5vZGUgbm9kZSA9IGdldEFkYXB0ZXIoKE5vdGlmaWVyKSBpLm5leHQoKSk7Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQuZ2V0TGlzdCgpLmFkZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQotCQlwdWJsaWMgaW50IGdldE1heE9jY3VyKCkgewotCQkJcmV0dXJuIGdldE1heE9jY3VySGVscGVyKGNvbnRlbnQpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJCXJldHVybiBnZXRNaW5PY2N1ckhlbHBlcihjb250ZW50KTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0T3BlcmF0b3IoKSB7Ci0JCQkvLyB0b2RvLi4uIGhhbmRsZSBBTE9ORSBjYXNlIGJ5IGNoZWNraWcgaWYgY2hpbGQgY291bnQgPT0gMQotCQkJaW50IGdyb3VwS2luZCA9IGNvbnRlbnQuZ2V0R3JvdXBLaW5kKCkuZ2V0VmFsdWUoKTsKLQkJCXJldHVybiAoZ3JvdXBLaW5kID09IERUREdyb3VwS2luZC5DSE9JQ0UpID8gQ0hPSUNFIDogU0VRVUVOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEVERGaWxlQWRhcHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRFRERmlsZUFkYXB0ZXIgZXh0ZW5kcyBEVERCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNRG9jdW1lbnQgewotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIERFRkFVTFRfUk9PVF9OQU1FID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9kZWZhdWx0Um9vdE5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkJcHJvdGVjdGVkIERUREZpbGUgZHRkRmlsZTsKLQkJcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBuYW1lZE5vZGVNYXA7Ci0JCXByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgZW50aXR5Tm9kZU1hcDsKLQotCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbk1hcCBhbm5vdGF0aW9uTWFwID0gbmV3IEFubm90YXRpb25NYXAoKTsKLQkJcHJvdGVjdGVkIE1hcCBnbG9iYWxQcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJcHVibGljIERUREZpbGVBZGFwdGVyKERUREZpbGUgZHRkRmlsZSkgewotCQkJdGhpcy5kdGRGaWxlID0gZHRkRmlsZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQkJcmV0dXJuIGR0ZEZpbGU7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbk1hcCBnZXRBbm5vdGF0aW9uTWFwKCkgewotCQkJcmV0dXJuIGFubm90YXRpb25NYXA7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCQlpZiAobmFtZWROb2RlTWFwID09IG51bGwpIHsKLQkJCQluYW1lZE5vZGVNYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGR0ZEZpbGUubGlzdERUREVsZW1lbnQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCURUREVsZW1lbnQgZHRkRWxlbWVudCA9IChEVERFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCW5hbWVkTm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoZHRkRWxlbWVudC5nZXROYW1lKCksIGdldEFkYXB0ZXIoZHRkRWxlbWVudCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuYW1lZE5vZGVNYXA7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCQlpZiAoZW50aXR5Tm9kZU1hcCA9PSBudWxsKSB7Ci0JCQkJZW50aXR5Tm9kZU1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkJCS8vIGFkZCB0aGUgYnVpbHQgaW4gZW50aXR5IGRlY2xhcmF0aW9ucwotCQkJCS8vCi0JCQkJZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoImFtcCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgiYW1wIiwgIiYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoImx0IiwgbmV3IENNRW50aXR5RGVjbGFyYXRpb25JbXBsKCJsdCIsICI8IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCWVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJndCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgiZ3QiLCAiPiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQllbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgicXVvdCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgicXVvdCIsICJcIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQllbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgiYXBvcyIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgiYXBvcyIsICInIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCQkJZm9yIChJdGVyYXRvciBpID0gZHRkRmlsZS5saXN0RFRERW50aXR5KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCURUREVudGl0eSBkdGRFbnRpdHkgPSAoRFRERW50aXR5KSBpLm5leHQoKTsKLQkJCQkJaWYgKCFkdGRFbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiBkdGRFbnRpdHkuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQkJCS8vIGZvciBub3cuLi4ganVzdCBoYW5kbGUgRFRESW50ZXJuYWxFbnRpdHkKLQkJCQkJCS8vCi0JCQkJCQlpZiAoZHRkRW50aXR5LmdldENvbnRlbnQoKSBpbnN0YW5jZW9mIERUREludGVybmFsRW50aXR5KSB7Ci0JCQkJCQkJZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoZHRkRW50aXR5LmdldE5hbWUoKSwgZ2V0QWRhcHRlcihkdGRFbnRpdHkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBlbnRpdHlOb2RlTWFwOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBET0NVTUVOVDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlyZXR1cm4gZHRkRmlsZS5nZXROYW1lKCkgKyAiLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhERUZBVUxUX1JPT1RfTkFNRSkpIHsKLQkJCQlEVERNZXRyaWNzIG1ldHJpY3MgPSBuZXcgRFRETWV0cmljcyhkdGRGaWxlKTsKLQkJCQlEVERFbGVtZW50IGR0ZEVsZW1lbnQgPSBtZXRyaWNzLmdldExlYXN0UmVmZXJlbmNlZEVsZW1lbnQoKTsKLQkJCQlpZiAoZHRkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IGR0ZEVsZW1lbnQuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImFubm90YXRpb25NYXAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gYW5ub3RhdGlvbk1hcDsKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImdsb2JhbFByb3BlcnR5TWFwIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IGdsb2JhbFByb3BlcnR5TWFwOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ01EYXRhVHlwZUluZm9UYWJsZSB7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSBpbnN0YW5jZVZhbHVlVGFibGU7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSBkYXRhVHlwZU5hbWVUYWJsZTsKLQotCQlwdWJsaWMgQ01EYXRhVHlwZUluZm9UYWJsZSgpIHsKLQkJCS8vIGhhc2h0YWJsZS5wdXQoRFREVHlwZS5DREFUQSwgbnVsbCkpOwotCQkJaW5zdGFuY2VWYWx1ZVRhYmxlID0gbmV3IFN0cmluZ1tEVERCYXNpY1R5cGVJbXBsLmJhc2ljVHlwZUtpbmRzLmxlbmd0aF07Ci0JCQlpbnN0YW5jZVZhbHVlVGFibGVbRFREQmFzaWNUeXBlS2luZC5FTlRJVFldID0gImVudGl0eSI7IC8vJE5PTi1OTFMtMSQKLQkJCWluc3RhbmNlVmFsdWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLkVOVElUSUVTXSA9ICJlbnRpdGllcyI7IC8vJE5PTi1OTFMtMSQKLQkJCWluc3RhbmNlVmFsdWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU5dID0gIm5tdG9rZW4iOyAvLyROT04tTkxTLTEkCi0JCQlpbnN0YW5jZVZhbHVlVGFibGVbRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOU10gPSAibm10b2tlbnMiOyAvLyROT04tTkxTLTEkCi0KLQkJCWRhdGFUeXBlTmFtZVRhYmxlID0gbmV3IFN0cmluZ1tEVERCYXNpY1R5cGVJbXBsLmJhc2ljVHlwZUtpbmRzLmxlbmd0aF07Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLkNEQVRBXSA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLklEXSA9IENNRGF0YVR5cGUuSUQ7Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLklEUkVGXSA9IENNRGF0YVR5cGUuSURSRUY7Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLklEUkVGU10gPSBDTURhdGFUeXBlLklEUkVGUzsKLQkJCWRhdGFUeXBlTmFtZVRhYmxlW0RUREJhc2ljVHlwZUtpbmQuRU5USVRZXSA9IENNRGF0YVR5cGUuRU5USVRZOwotCQkJZGF0YVR5cGVOYW1lVGFibGVbRFREQmFzaWNUeXBlS2luZC5FTlRJVElFU10gPSBDTURhdGFUeXBlLkVOVElUSUVTOwotCQkJZGF0YVR5cGVOYW1lVGFibGVbRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOXSA9IENNRGF0YVR5cGUuTk1UT0tFTjsKLQkJCWRhdGFUeXBlTmFtZVRhYmxlW0RUREJhc2ljVHlwZUtpbmQuTk1UT0tFTlNdID0gQ01EYXRhVHlwZS5OTVRPS0VOUzsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SW5zdGFuY2VWYWx1ZShEVERUeXBlIGR0ZFR5cGUpIHsKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkJaWYgKGR0ZFR5cGUgaW5zdGFuY2VvZiBEVERCYXNpY1R5cGUpIHsKLQkJCQlpbnQga2luZCA9ICgoRFREQmFzaWNUeXBlKSBkdGRUeXBlKS5nZXRLaW5kKCkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoa2luZCA+PSAwICYmIGtpbmQgPCBEVERCYXNpY1R5cGVJbXBsLmJhc2ljVHlwZURlc2NyaXB0aW9ucy5sZW5ndGgpIHsKLQkJCQkJcmVzdWx0ID0gaW5zdGFuY2VWYWx1ZVRhYmxlW2tpbmRdOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlTmFtZShEVERUeXBlIGR0ZFR5cGUpIHsKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkJaWYgKGR0ZFR5cGUgaW5zdGFuY2VvZiBEVERCYXNpY1R5cGUpIHsKLQkJCQlpbnQga2luZCA9ICgoRFREQmFzaWNUeXBlKSBkdGRUeXBlKS5nZXRLaW5kKCkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoa2luZCA+PSAwICYmIGtpbmQgPCBEVERCYXNpY1R5cGVJbXBsLmJhc2ljVHlwZURlc2NyaXB0aW9ucy5sZW5ndGgpIHsKLQkJCQkJcmVzdWx0ID0gZGF0YVR5cGVOYW1lVGFibGVba2luZF07Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZHRkVHlwZSBpbnN0YW5jZW9mIERUREVudW1lcmF0aW9uVHlwZSkgewotCQkJCXJlc3VsdCA9IENNRGF0YVR5cGUuRU5VTTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREFueUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQW55Q29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTEzYmY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQW55Q29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BbnkgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREFueUNvbnRlbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFREQW55Q29udGVudCBleHRlbmRzIERUREVsZW1lbnRDb250ZW50IHsKLX0gLy8gRFREQW55Q29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERBdHRyaWJ1dGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhOTg0MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdHRyaWJ1dGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RGVmYXVsdEtpbmQgPGVtPkRlZmF1bHQgS2luZDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERlZmF1bHRWYWx1ZVN0cmluZyA8ZW0+RGVmYXVsdCBWYWx1ZSBTdHJpbmc8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREVERFbGVtZW50IDxlbT5EVEQgRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERBdHRyaWJ1dGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFREQXR0cmlidXRlIGV4dGVuZHMgRUF0dHJpYnV0ZSwgRFRET2JqZWN0LCBEVERTb3VyY2VPZmZzZXQgewotCS8vIE5PTi1HRU4gaW50ZXJmYWNlcyBEVERPYmplY3QsIERURFNvdXJjZU9mZnNldAotCi0JcHVibGljIERURFR5cGUgZ2V0RFREVHlwZSgpOwotCi0JcHVibGljIHZvaWQgc2V0RFREVHlwZShEVERUeXBlIHR5cGUpOwotCi0JcHVibGljIHZvaWQgc2V0RFREQmFzaWNUeXBlKGludCB2YWx1ZSk7Ci0KLQlwdWJsaWMgRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uKFN0cmluZ1tdIGVudW1WYWx1ZXMsIGludCBlbnVtS2luZCk7Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29tbWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQXR0cmlidXRlX0NvbW1lbnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IEtpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVmYXVsdCBLaW5kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgS2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kCi0JICogQHNlZSAjc2V0RGVmYXVsdEtpbmQoRFRERGVmYXVsdEtpbmQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQXR0cmlidXRlX0RlZmF1bHRLaW5kKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERGVmYXVsdEtpbmQgZ2V0RGVmYXVsdEtpbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERlZmF1bHRLaW5kIDxlbT5EZWZhdWx0IEtpbmQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBLaW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQKLQkgKiBAc2VlICNnZXREZWZhdWx0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdEtpbmQoRFRERGVmYXVsdEtpbmQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZSBTdHJpbmc8L2I+PC9lbT4nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT4nIGF0dHJpYnV0ZQotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0VmFsdWVTdHJpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREF0dHJpYnV0ZV9EZWZhdWx0VmFsdWVTdHJpbmcoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREZWZhdWx0VmFsdWVTdHJpbmcgPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT4nCi0JICogICAgICAgICAgICBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0VmFsdWVTdHJpbmcoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nCi0JICogcmVmZXJlbmNlIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbgotCSAqIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicKLQkgKiAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQXR0cmlidXRlX0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudGl0eSBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqIHJlZmVyZW5jZSBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24KLQkgKiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nCi0JICogICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlCi0JICogQG1vZGVsIG9wcG9zaXRlPSJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnRpdHkgZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RFREIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldERUREF0dHJpYnV0ZSA8ZW0+RFREIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EVEQgRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlCi0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyCi0JICogICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RFRERWxlbWVudChEVERFbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREF0dHJpYnV0ZV9EVERFbGVtZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXREVERBdHRyaWJ1dGUKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9IkRUREF0dHJpYnV0ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERWxlbWVudCBnZXREVERFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREVERFbGVtZW50IDxlbT5EVEQgRWxlbWVudDwvZW0+fScKLQkgKiBjb250YWluZXIgcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RFRERWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RFRERWxlbWVudChEVERFbGVtZW50IHZhbHVlKTsKLQotfSAvLyBEVERBdHRyaWJ1dGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQmFzaWNUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREJhc2ljVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDAzMjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQmFzaWNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmFzaWMgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlI2dldEtpbmQgPGVtPktpbmQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQmFzaWNUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREJhc2ljVHlwZSBleHRlbmRzIEVDbGFzcywgRFREVHlwZSB7Ci0JLy8gTk9OLUdFTiBpbnRlcmZhY2VzIERURFR5cGUKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIFRoZQotCSAqIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsIHRoZXJlCi0JICogcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5LaW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZAotCSAqIEBzZWUgI3NldEtpbmQoRFREQmFzaWNUeXBlS2luZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERCYXNpY1R5cGVfS2luZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREJhc2ljVHlwZUtpbmQgZ2V0S2luZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGUjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5LaW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEtpbmQoRFREQmFzaWNUeXBlS2luZCB2YWx1ZSk7Ci19IC8vIERUREJhc2ljVHlwZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERCYXNpY1R5cGVLaW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREJhc2ljVHlwZUtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmZTljZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREJhc2ljVHlwZUtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5CYXNpYyBUeXBlIEtpbmQ8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERCYXNpY1R5cGVLaW5kKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFREQmFzaWNUeXBlS2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOT05FX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNEQVRBPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0NEQVRBX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDREFUQSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJRF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUQgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SURSRUY8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSURSRUZfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEUkVGID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklEUkVGUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJRFJFRlNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEUkVGUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FTlRJVFk8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRU5USVRZX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFkgPSA1OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RU5USVRJRVM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRU5USVRJRVNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUSUVTID0gNjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5NVE9LRU48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk1UT0tFTl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk1UT0tFTiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OTVRPS0VOUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOTVRPS0VOU19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk1UT0tFTlMgPSA4OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05PTkUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgTk9ORV9MSVRFUkFMID0gbmV3IERUREJhc2ljVHlwZUtpbmQoTk9ORSwgIk5PTkUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0RBVEE8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DREFUQTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNDREFUQQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBDREFUQV9MSVRFUkFMID0gbmV3IERUREJhc2ljVHlwZUtpbmQoQ0RBVEEsICJDREFUQSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBJRF9MSVRFUkFMID0gbmV3IERUREJhc2ljVHlwZUtpbmQoSUQsICJJRCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JRFJFRjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklEUkVGPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lEUkVGCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIElEUkVGX0xJVEVSQUwgPSBuZXcgRFREQmFzaWNUeXBlS2luZChJRFJFRiwgIklEUkVGIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklEUkVGUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklEUkVGUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJRFJFRlMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgSURSRUZTX0xJVEVSQUwgPSBuZXcgRFREQmFzaWNUeXBlS2luZChJRFJFRlMsICJJRFJFRlMiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RU5USVRZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RU5USVRZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0VOVElUWQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBFTlRJVFlfTElURVJBTCA9IG5ldyBEVERCYXNpY1R5cGVLaW5kKEVOVElUWSwgIkVOVElUWSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FTlRJVElFUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkVOVElUSUVTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0VOVElUSUVTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIEVOVElUSUVTX0xJVEVSQUwgPSBuZXcgRFREQmFzaWNUeXBlS2luZChFTlRJVElFUywgIkVOVElUSUVTIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5NVE9LRU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OTVRPS0VOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05NVE9LRU4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgTk1UT0tFTl9MSVRFUkFMID0gbmV3IERUREJhc2ljVHlwZUtpbmQoTk1UT0tFTiwgIk5NVE9LRU4iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk1UT0tFTlM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OTVRPS0VOUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOTVRPS0VOUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBOTVRPS0VOU19MSVRFUkFMID0gbmV3IERUREJhc2ljVHlwZUtpbmQoTk1UT0tFTlMsICJOTVRPS0VOUyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+QmFzaWMgVHlwZSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZFtdIFZBTFVFU19BUlJBWSA9IG5ldyBEVERCYXNpY1R5cGVLaW5kW117Tk9ORV9MSVRFUkFMLCBDREFUQV9MSVRFUkFMLCBJRF9MSVRFUkFMLCBJRFJFRl9MSVRFUkFMLCBJRFJFRlNfTElURVJBTCwgRU5USVRZX0xJVEVSQUwsIEVOVElUSUVTX0xJVEVSQUwsIE5NVE9LRU5fTElURVJBTCwgTk1UT0tFTlNfTElURVJBTCx9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkJhc2ljIFR5cGUgS2luZDwvYj48L2VtPicKLQkgKiBlbnVtZXJhdG9ycy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkJhc2ljIFR5cGUgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERCYXNpY1R5cGVLaW5kIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRFREQmFzaWNUeXBlS2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkJhc2ljIFR5cGUgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFREQmFzaWNUeXBlS2luZCBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgTk9ORSA6Ci0JCQkJcmV0dXJuIE5PTkVfTElURVJBTDsKLQkJCWNhc2UgQ0RBVEEgOgotCQkJCXJldHVybiBDREFUQV9MSVRFUkFMOwotCQkJY2FzZSBJRCA6Ci0JCQkJcmV0dXJuIElEX0xJVEVSQUw7Ci0JCQljYXNlIElEUkVGIDoKLQkJCQlyZXR1cm4gSURSRUZfTElURVJBTDsKLQkJCWNhc2UgSURSRUZTIDoKLQkJCQlyZXR1cm4gSURSRUZTX0xJVEVSQUw7Ci0JCQljYXNlIEVOVElUWSA6Ci0JCQkJcmV0dXJuIEVOVElUWV9MSVRFUkFMOwotCQkJY2FzZSBFTlRJVElFUyA6Ci0JCQkJcmV0dXJuIEVOVElUSUVTX0xJVEVSQUw7Ci0JCQljYXNlIE5NVE9LRU4gOgotCQkJCXJldHVybiBOTVRPS0VOX0xJVEVSQUw7Ci0JCQljYXNlIE5NVE9LRU5TIDoKLQkJCQlyZXR1cm4gTk1UT0tFTlNfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRFREQmFzaWNUeXBlS2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy8gRFREQmFzaWNUeXBlS2luZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmM2ZiNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLXB1YmxpYyBjbGFzcyBEVERDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURF9FUlJPUl9MSU5FX1BSRUZJWCA9ICI8IS0tRVJST1IgIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURF9FUlJPUl9MSU5FX1NVRkZJWCA9ICIgLS0+IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9FWFRFTlNJT04gPSAiZHRkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FWFRFTlNJT04gPSAieG1sIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNSV9FWFRFTlNJT04gPSAieG1pIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9YTUlfRVhURU5TSU9OID0gImR0ZC54bWkiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURENvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQ29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDY2NzU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQjZ2V0RFRERmlsZSA8ZW0+RFREIEZpbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQ29udGVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFREQ29udGVudCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRURCBGaWxlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXREVERDb250ZW50IDxlbT5EVEQgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EVEQgRmlsZTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEZpbGU8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREVERGaWxlKERUREZpbGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQ29udGVudF9EVERGaWxlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXREVERDb250ZW50Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJEVERDb250ZW50IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERGaWxlIGdldERUREZpbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudCNnZXREVERGaWxlIDxlbT5EVEQgRmlsZTwvZW0+fScKLQkgKiBjb250YWluZXIgcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEZpbGU8L2VtPicgY29udGFpbmVyCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RFRERmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RFRERmlsZShEVERGaWxlIHZhbHVlKTsKLQotfSAvLyBEVERDb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURERlZmF1bHRLaW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURERlZmF1bHRLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNTdjNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVEREZWZhdWx0S2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkRlZmF1bHQgS2luZDwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURERlZmF1bHRLaW5kKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRERGVmYXVsdEtpbmQgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklNUExJRUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSU1QTElFRF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1QTElFRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRVFVSVJFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNSRVFVSVJFRF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUlSRUQgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RklYRUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRklYRURfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJWEVEID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PRklYRUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk9GSVhFRF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9GSVhFRCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTVBMSUVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU1QTElFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJTVBMSUVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVEREZWZhdWx0S2luZCBJTVBMSUVEX0xJVEVSQUwgPSBuZXcgRFRERGVmYXVsdEtpbmQoSU1QTElFRCwgIklNUExJRUQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVRVUlSRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SRVFVSVJFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNSRVFVSVJFRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRERGVmYXVsdEtpbmQgUkVRVUlSRURfTElURVJBTCA9IG5ldyBEVEREZWZhdWx0S2luZChSRVFVSVJFRCwgIlJFUVVJUkVEIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZJWEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RklYRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRklYRUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERURERlZmF1bHRLaW5kIEZJWEVEX0xJVEVSQUwgPSBuZXcgRFRERGVmYXVsdEtpbmQoRklYRUQsICJGSVhFRCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT0ZJWEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9GSVhFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOT0ZJWEVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVEREZWZhdWx0S2luZCBOT0ZJWEVEX0xJVEVSQUwgPSBuZXcgRFRERGVmYXVsdEtpbmQoTk9GSVhFRCwgIk5PRklYRUQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkRlZmF1bHQgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERURERlZmF1bHRLaW5kW10gVkFMVUVTX0FSUkFZID0gbmV3IERURERlZmF1bHRLaW5kW117SU1QTElFRF9MSVRFUkFMLCBSRVFVSVJFRF9MSVRFUkFMLCBGSVhFRF9MSVRFUkFMLCBOT0ZJWEVEX0xJVEVSQUwsfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5EZWZhdWx0IEtpbmQ8L2I+PC9lbT4nCi0JICogZW51bWVyYXRvcnMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5EZWZhdWx0IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFRERGVmYXVsdEtpbmQgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlEVEREZWZhdWx0S2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRlZmF1bHQgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFRERGVmYXVsdEtpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIElNUExJRUQgOgotCQkJCXJldHVybiBJTVBMSUVEX0xJVEVSQUw7Ci0JCQljYXNlIFJFUVVJUkVEIDoKLQkJCQlyZXR1cm4gUkVRVUlSRURfTElURVJBTDsKLQkJCWNhc2UgRklYRUQgOgotCQkJCXJldHVybiBGSVhFRF9MSVRFUkFMOwotCQkJY2FzZSBOT0ZJWEVEIDoKLQkJCQlyZXR1cm4gTk9GSVhFRF9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEVEREZWZhdWx0S2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy8gRFRERGVmYXVsdEtpbmQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MTA5N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0RFREQXR0cmlidXRlIDxlbT5EVEQgQXR0cmlidXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERWxlbWVudCBleHRlbmRzIEVDbGFzcywgRFREQ29udGVudCwgRFRET2JqZWN0LCBEVERTb3VyY2VPZmZzZXQgewotCi0JcHVibGljIHZvaWQgYWRkRFREQXR0cmlidXRlKERUREF0dHJpYnV0ZSBhdHRyaWJ1dGUpOwotCi0JLy8gcmV0dXJucyBhbGwgcmVmZXJlbmNlcyBpbiB0aGUgc2FtZSBEVERGaWxlIHRoYXQgcmVmZXJlbmNlIHRoaXMgZWxlbWVudAotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlZmVyZW5jZXMoKTsKLQotCS8vIHJldHVybiBhIGJyaWVmIHN0cmluZyBsaXN0aW5nIHRoZSBhdHRyaWJ1dGVzCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVEZXRhaWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29tbWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERWxlbWVudF9Db21tZW50KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbW1lbnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRlbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb250ZW50KERUREVsZW1lbnRDb250ZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRfQ29udGVudCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEVsZW1lbnQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERWxlbWVudENvbnRlbnQgZ2V0Q29udGVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nCi0JICogY29udGFpbm1lbnQgcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudAotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnRlbnQoRFRERWxlbWVudENvbnRlbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RFREIEF0dHJpYnV0ZTwvYj48L2VtPicKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUKLQkgKiB7QGxpbmsgRFREQXR0cmlidXRlfS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RFRERWxlbWVudCA8ZW0+RFREIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RFREIEF0dHJpYnV0ZTwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYQotCSAqIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEF0dHJpYnV0ZTwvZW0+JyBjb250YWlubWVudAotCSAqICAgICAgICAgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERWxlbWVudF9EVERBdHRyaWJ1dGUoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RFRERWxlbWVudAotCSAqIEBtb2RlbCB0eXBlPSJEVERBdHRyaWJ1dGUiIG9wcG9zaXRlPSJEVERFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RFREQXR0cmlidXRlKCk7Ci0KLX0gLy8gRFRERWxlbWVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbGVtZW50Q29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbGVtZW50Q29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzM2YWIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudENvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRDb250ZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERFbGVtZW50Q29udGVudCBleHRlbmRzIEVPYmplY3QsIERURE9iamVjdCwgRFREU291cmNlT2Zmc2V0IHsKLQotCS8vIGZvciBzaG93aW5nIG5hbWVzIHRvIGJlIHVzZWQgaW4gdGhlIHRyZWUKLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnROYW1lKCk7Ci0KLQkvLyBmb3Igc2hvd2luZyBpdGVtcyBpbiB0aGUgdGFibGUKLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnREZXRhaWwoKTsKLQotCXB1YmxpYyBEVERFbGVtZW50IGdldERUREVsZW1lbnQoKTsKLQotCS8vIGdldCB0aGUgbW9zdCBvdXRlciBEVERHcm91cENvbnRlbnQKLQlwdWJsaWMgRFRER3JvdXBDb250ZW50IGdldERUREdyb3VwQ29udGVudCgpOwotCi0JLy8gcmV0dXJucyB0cnVlIGlmIHRoaXMgZWxlbWVudCBjb250ZW50IGlzIHRoZSBmaXJzdAotCS8vIGluIHRoZSBlbGVtZW50Ci0JLy8gZWcgPCFFTEVNRU5UIGJsYWggZmlyc3RFbGVtZW50PgotCS8vIDwhRUxFTUVOVCBibGFoICgoZmlyc3RFbGVtZW50LCBzZWNvbmRFbGVtZW50KSB8IGxhc3RFbGVtZW50KQotCXB1YmxpYyBib29sZWFuIGlzRmlyc3RFbGVtZW50Q29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRHcm91cChEVERHcm91cENvbnRlbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERWxlbWVudENvbnRlbnRfR3JvdXAoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQjZ2V0Q29udGVudAotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iY29udGVudCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRER3JvdXBDb250ZW50IGdldEdyb3VwKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScKLQkgKiBjb250YWluZXIgcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgY29udGFpbmVyCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdyb3VwKERUREdyb3VwQ29udGVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFbGVtZW50KERUREVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERWxlbWVudENvbnRlbnRfRWxlbWVudCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29udGVudAotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iY29udGVudCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERWxlbWVudCBnZXRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nCi0JICogY29udGFpbmVyIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgY29udGFpbmVyCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWxlbWVudChEVERFbGVtZW50IHZhbHVlKTsKLQotfSAvLyBEVERFbGVtZW50Q29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGUxYmJlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQgUmVmZXJlbmNlIENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50I2dldFJlZmVyZW5jZWRFbGVtZW50IDxlbT5SZWZlcmVuY2VkIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgZXh0ZW5kcyBEVERSZXBlYXRhYmxlQ29udGVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBFbGVtZW50PC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkIEVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBFbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSZWZlcmVuY2VkRWxlbWVudChEVERFbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50X1JlZmVyZW5jZWRFbGVtZW50KCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVsZW1lbnQgZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQjZ2V0UmVmZXJlbmNlZEVsZW1lbnQgPGVtPlJlZmVyZW5jZWQgRWxlbWVudDwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkIEVsZW1lbnQ8L2VtPicKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVmZXJlbmNlZEVsZW1lbnQoRFRERWxlbWVudCB2YWx1ZSk7Ci0KLX0gLy8gRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW1wdHlDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVtcHR5Q29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjI2ODI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW1wdHlDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVtcHR5IENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbXB0eUNvbnRlbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERW1wdHlDb250ZW50IGV4dGVuZHMgRFRERWxlbWVudENvbnRlbnQgewotfSAvLyBEVERFbXB0eUNvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW50aXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDRiNDU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbnRpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjaXNQYXJhbWV0ZXJFbnRpdHkgPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0UGFybUVudGl0eVJlZiA8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0RW50aXR5UmVmZXJlbmNlIDxlbT5FbnRpdHkgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERFbnRpdHkgZXh0ZW5kcyBFTmFtZWRFbGVtZW50LCBEVERDb250ZW50LCBEVERPYmplY3QsIERURFNvdXJjZU9mZnNldCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb21tZW50KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlfQ29tbWVudCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb21tZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbW1lbnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmFtZXRlciBFbnRpdHk8L2I+PC9lbT4nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPicgYXR0cmlidXRlIGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW1ldGVyIEVudGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFyYW1ldGVyRW50aXR5KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5X1BhcmFtZXRlckVudGl0eSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNQYXJhbWV0ZXJFbnRpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2lzUGFyYW1ldGVyRW50aXR5IDxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPicKLQkgKiAgICAgICAgICAgIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1BhcmFtZXRlckVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFyYW1ldGVyRW50aXR5KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGVudDwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudCNnZXREVERFbnRpdHkgPGVtPkRURCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb250ZW50KERUREVudGl0eUNvbnRlbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5X0NvbnRlbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50I2dldERUREVudGl0eQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iRFRERW50aXR5IiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudGl0eUNvbnRlbnQgZ2V0Q29udGVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fScKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZW50PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29udGVudChEVERFbnRpdHlDb250ZW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcm0gRW50aXR5IFJlZjwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlI2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBhcm1FbnRpdHlSZWYoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlI2dldEVudGl0eQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZW50aXR5IiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGdldFBhcm1FbnRpdHlSZWYoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldFBhcm1FbnRpdHlSZWYgPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPicKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQYXJtRW50aXR5UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYXJtRW50aXR5UmVmKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnRpdHkgUmVmZXJlbmNlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZQotCSAqIHtAbGluayBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50fS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzCi0JICogb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQjZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgPGVtPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW50aXR5IFJlZmVyZW5jZTwvZW0+JyByZWZlcmVuY2UgbGlzdAotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBSZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlCi0JICogICAgICAgICBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eV9FbnRpdHlSZWZlcmVuY2UoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50I2dldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5Ci0JICogQG1vZGVsIHR5cGU9IkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQiCi0JICogICAgICAgIG9wcG9zaXRlPSJlbGVtZW50UmVmZXJlbmNlZEVudGl0eSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RW50aXR5UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2U8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBEVERBdHRyaWJ1dGV9LiBJdAotCSAqIGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2U8L2VtPicKLQkgKiAgICAgICAgIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5Ci0JICogQG1vZGVsIHR5cGU9IkRUREF0dHJpYnV0ZSIgb3Bwb3NpdGU9ImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBEVERBdHRyaWJ1dGV9LiBJdAotCSAqIGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2VtPicKLQkgKiAgICAgICAgIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5Ci0JICogQG1vZGVsIHR5cGU9IkRUREF0dHJpYnV0ZSIgb3Bwb3NpdGU9ImF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCk7Ci0KLX0gLy8gRFRERW50aXR5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudGl0eUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW50aXR5Q29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDYyNmM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW50aXR5Q29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbnRpdHkgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudCNnZXREVERFbnRpdHkgPGVtPkRURCBFbnRpdHk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5Q29udGVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERW50aXR5Q29udGVudCBleHRlbmRzIEVPYmplY3QsIERURE9iamVjdCB7Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRURCBFbnRpdHk8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EVEQgRW50aXR5PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EVEQgRW50aXR5PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RFRERW50aXR5KERUREVudGl0eSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlDb250ZW50X0RUREVudGl0eSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRDb250ZW50Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJjb250ZW50IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnRpdHkgZ2V0RFRERW50aXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQjZ2V0RFRERW50aXR5IDxlbT5EVEQgRW50aXR5PC9lbT59JwotCSAqIGNvbnRhaW5lciByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EVEQgRW50aXR5PC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERUREVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RFRERW50aXR5KERUREVudGl0eSB2YWx1ZSk7Ci0KLX0gLy8gRFRERW50aXR5Q29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViOTdmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudGl0eSBSZWZlcmVuY2UgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCNnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSA8ZW0+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgZXh0ZW5kcyBEVERSZXBlYXRhYmxlQ29udGVudCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0RW50aXR5UmVmZXJlbmNlIDxlbT5FbnRpdHkgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicKLQkgKiByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uCi0JICogaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nCi0JICogICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRfRWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0RW50aXR5UmVmZXJlbmNlCi0JICogQG1vZGVsIG9wcG9zaXRlPSJlbnRpdHlSZWZlcmVuY2UiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnRpdHkgZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCNnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSA8ZW0+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSB2YWx1ZSk7Ci0KLX0gLy8gRFRERW50aXR5UmVmZXJlbmNlQ29udGVudAotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudW1Hcm91cEtpbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW51bUdyb3VwS2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDAzZGMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW51bUdyb3VwS2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkVudW0gR3JvdXAgS2luZDwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudW1Hcm91cEtpbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVERFbnVtR3JvdXBLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OQU1FIFRPS0VOIEdST1VQPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05BTUVfVE9LRU5fR1JPVVBfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUVfVE9LRU5fR1JPVVAgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9UQVRJT04gR1JPVVA8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk9UQVRJT05fR1JPVVBfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVEFUSU9OX0dST1VQID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5BTUUgVE9LRU4gR1JPVVA8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OQU1FIFRPS0VOIEdST1VQPC9iPjwvZW0+JyBsaXRlcmFsCi0JICogb2JqZWN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbgotCSAqIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTkFNRV9UT0tFTl9HUk9VUAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRERW51bUdyb3VwS2luZCBOQU1FX1RPS0VOX0dST1VQX0xJVEVSQUwgPSBuZXcgRFRERW51bUdyb3VwS2luZChOQU1FX1RPS0VOX0dST1VQLCAiTkFNRV9UT0tFTl9HUk9VUCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT1RBVElPTiBHUk9VUDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5PVEFUSU9OIEdST1VQPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdAotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05PVEFUSU9OX0dST1VQCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERFbnVtR3JvdXBLaW5kIE5PVEFUSU9OX0dST1VQX0xJVEVSQUwgPSBuZXcgRFRERW51bUdyb3VwS2luZChOT1RBVElPTl9HUk9VUCwgIk5PVEFUSU9OX0dST1VQIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5FbnVtIEdyb3VwIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEVERFbnVtR3JvdXBLaW5kW10gVkFMVUVTX0FSUkFZID0gbmV3IERUREVudW1Hcm91cEtpbmRbXXtOQU1FX1RPS0VOX0dST1VQX0xJVEVSQUwsIE5PVEFUSU9OX0dST1VQX0xJVEVSQUwsfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5FbnVtIEdyb3VwIEtpbmQ8L2I+PC9lbT4nCi0JICogZW51bWVyYXRvcnMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FbnVtIEdyb3VwIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFRERW51bUdyb3VwS2luZCBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURUREVudW1Hcm91cEtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FbnVtIEdyb3VwIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERUREVudW1Hcm91cEtpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIE5BTUVfVE9LRU5fR1JPVVAgOgotCQkJCXJldHVybiBOQU1FX1RPS0VOX0dST1VQX0xJVEVSQUw7Ci0JCQljYXNlIE5PVEFUSU9OX0dST1VQIDoKLQkJCQlyZXR1cm4gTk9UQVRJT05fR1JPVVBfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRFRERW51bUdyb3VwS2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy8gRFRERW51bUdyb3VwS2luZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnVtZXJhdGlvblR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW51bWVyYXRpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MDFiMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnVtZXJhdGlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW51bWVyYXRpb24gVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlI2dldEtpbmQgPGVtPktpbmQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXREVERGaWxlIDxlbT5EVEQgRmlsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnVtZXJhdGlvblR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERW51bWVyYXRpb25UeXBlIGV4dGVuZHMgRUVudW0sIERURFR5cGUgewotCi0JcHVibGljIEVMaXN0IGdldEVudW1MaXRlcmFscygpOwotCi0JcHVibGljIFN0cmluZyBnZXRFbnVtZXJhdGlvblR5cGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgYXR0cmlidXRlLiBUaGUKLQkgKiBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLCB0aGVyZQotCSAqIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQKLQkgKiBAc2VlICNzZXRLaW5kKERUREVudW1Hcm91cEtpbmQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW51bWVyYXRpb25UeXBlX0tpbmQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnVtR3JvdXBLaW5kIGdldEtpbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlI2dldEtpbmQgPGVtPktpbmQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRLaW5kKERUREVudW1Hcm91cEtpbmQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RFREIEZpbGU8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldERUREVudW1lcmF0aW9uVHlwZSA8ZW0+RFREIEVudW1lcmF0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RFREIEZpbGU8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRURCBGaWxlPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RFRERmlsZShEVERGaWxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudW1lcmF0aW9uVHlwZV9EVERGaWxlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXREVERFbnVtZXJhdGlvblR5cGUKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9IkRUREVudW1lcmF0aW9uVHlwZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERmlsZSBnZXREVERGaWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXREVERGaWxlIDxlbT5EVEQgRmlsZTwvZW0+fScKLQkgKiBjb250YWluZXIgcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEZpbGU8L2VtPicgY29udGFpbmVyCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RFRERmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RFRERmlsZShEVERGaWxlIHZhbHVlKTsKLQotfSAvLyBEVERFbnVtZXJhdGlvblR5cGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERXJyb3JNZXNzYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVycm9yTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTNlOWM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERXJyb3JNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1wdWJsaWMgY2xhc3MgRFRERXJyb3JNZXNzYWdlIHsKLQlwdWJsaWMgU3RyaW5nIGVycm9yS2V5OwotCXB1YmxpYyBTdHJpbmcgZXJyb3JNZXNzYWdlOwotCXB1YmxpYyBTdHJpbmcgbGluZU5vOwotCXB1YmxpYyBTdHJpbmcgY2hhck9mZlNldDsKLQlwdWJsaWMgU3RyaW5nIGRlY2xhcmF0aW9uVHlwZTsKLQlwdWJsaWMgU3RyaW5nIGRlY2xhcmF0aW9uTmFtZTsKLQlwdWJsaWMgU3RyaW5nIHNvdXJjZUxpbmU7Ci0KLQotCXB1YmxpYyBEVERFcnJvck1lc3NhZ2UoU3RyaW5nIGRlY2xhcmF0aW9uVHlwZSwgU3RyaW5nIGRlY2xhcmF0aW9uTmFtZSwgU3RyaW5nIGxpbmVObywgU3RyaW5nIGNoYXJPZmZTZXQsIFN0cmluZyBlcnJvcktleSwgU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQl0aGlzKGRlY2xhcmF0aW9uVHlwZSwgZGVjbGFyYXRpb25OYW1lLCBsaW5lTm8sIGNoYXJPZmZTZXQsIGVycm9yS2V5LCBlcnJvck1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBEVERFcnJvck1lc3NhZ2UoU3RyaW5nIGRlY2xhcmF0aW9uVHlwZSwgU3RyaW5nIGRlY2xhcmF0aW9uTmFtZSwgU3RyaW5nIGxpbmVObywgU3RyaW5nIGNoYXJPZmZTZXQsIFN0cmluZyBlcnJvcktleSwgU3RyaW5nIGVycm9yTWVzc2FnZSwgU3RyaW5nIHNyY0xpbmUpIHsKLQkJdGhpcy5kZWNsYXJhdGlvblR5cGUgPSBkZWNsYXJhdGlvblR5cGU7Ci0JCXRoaXMuZGVjbGFyYXRpb25OYW1lID0gZGVjbGFyYXRpb25OYW1lOwotCQl0aGlzLmxpbmVObyA9IGxpbmVObzsKLQkJdGhpcy5jaGFyT2ZmU2V0ID0gY2hhck9mZlNldDsKLQkJdGhpcy5lcnJvcktleSA9IGVycm9yS2V5OwotCQl0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTsKLQkJdGhpcy5zb3VyY2VMaW5lID0gc3JjTGluZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIigiICsgZGVjbGFyYXRpb25UeXBlICsgIjoiICsgZGVjbGFyYXRpb25OYW1lICsgIikgIiArIGxpbmVObyArICI6IiArIGNoYXJPZmZTZXQgKyAiICIgKyBlcnJvck1lc3NhZ2U7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvU3RyaW5nR2VuKCkgewotCi0JCXJldHVybiAiKCIgKyBkZWNsYXJhdGlvblR5cGUgKyAiOiIgKyBkZWNsYXJhdGlvbk5hbWUgKyAiKSAiICsgbGluZU5vICsgIjoiICsgY2hhck9mZlNldCArICIgIiArIGVycm9yTWVzc2FnZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFeHRlbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFeHRlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWRlMzYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERXh0ZW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNhbiBiZSBpbXBsZW1lbnRlZCBieSBhbiBJRG9tYWluTW9kZWwgdG8gYXVnbWVudAotICogZ2V0RWxlbWVudFByb3BlcnR5IGZvciBhbnkgRFREIG9iamVjdC4KLSAqLwotcHVibGljIGludGVyZmFjZSBEVERFeHRlbmRlciB7Ci0JcHVibGljIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoRFRET2JqZWN0IGR0ZE9iamVjdCwgT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREV4dGVybmFsRW50aXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREV4dGVybmFsRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmOGIzNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFeHRlcm5hbEVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVybmFsIEVudGl0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0U3lzdGVtSUQgPGVtPlN5c3RlbSBJRDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0UHVibGljSUQgPGVtPlB1YmxpYyBJRDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0Tm90YXRpb24gPGVtPk5vdGF0aW9uPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlIDxlbT5FbnRpdHkgUmVmZXJlbmNlZCBGcm9tIEFub3RoZXIgRmlsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFeHRlcm5hbEVudGl0eSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERFeHRlcm5hbEVudGl0eSBleHRlbmRzIERUREVudGl0eUNvbnRlbnQgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3lzdGVtIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TeXN0ZW0gSUQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3lzdGVtIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTeXN0ZW1JRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERXh0ZXJuYWxFbnRpdHlfU3lzdGVtSUQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3lzdGVtSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0U3lzdGVtSUQgPGVtPlN5c3RlbSBJRDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TeXN0ZW0gSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN5c3RlbUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTeXN0ZW1JRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVibGljIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QdWJsaWMgSUQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHVibGljIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQdWJsaWNJRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERXh0ZXJuYWxFbnRpdHlfUHVibGljSUQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHVibGljSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0UHVibGljSUQgPGVtPlB1YmxpYyBJRDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QdWJsaWMgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFB1YmxpY0lEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQdWJsaWNJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm90YXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZS4gSXQKLQkgKiBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5vdGF0aW9uPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vdGF0aW9uPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXROb3RhdGlvbihEVEROb3RhdGlvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFeHRlcm5hbEVudGl0eV9Ob3RhdGlvbigpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldEVudGl0eQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZW50aXR5IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVEROb3RhdGlvbiBnZXROb3RhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm90YXRpb248L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb3RhdGlvbihEVEROb3RhdGlvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnRpdHkgUmVmZXJlbmNlZCBGcm9tIEFub3RoZXIgRmlsZTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW50aXR5IFJlZmVyZW5jZWQgRnJvbSBBbm90aGVyIEZpbGU8L2VtPicKLQkgKiByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uCi0JICogaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHkgUmVmZXJlbmNlZCBGcm9tIEFub3RoZXIgRmlsZTwvZW0+JwotCSAqICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoRFRERmlsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFeHRlcm5hbEVudGl0eV9FbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERmlsZSBnZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUgPGVtPkVudGl0eSBSZWZlcmVuY2VkIEZyb20gQW5vdGhlciBGaWxlPC9lbT59JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBSZWZlcmVuY2VkIEZyb20gQW5vdGhlciBGaWxlPC9lbT4nCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZShEVERGaWxlIHZhbHVlKTsKLQotfSAvLyBEVERFeHRlcm5hbEVudGl0eQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODI3NzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLiBJdCBwcm92aWRlcyBhCi0gKiBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuIDwhLS0gZW5kLXVzZXItZG9jCi0gKiAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsLkRUREZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyb3VwIENvbnRlbnQ8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Hcm91cCBDb250ZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERHcm91cENvbnRlbnQgY3JlYXRlRFRER3JvdXBDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF0dHJpYnV0ZTwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFREQXR0cmlidXRlIGNyZWF0ZURUREF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbGVtZW50PC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERWxlbWVudCBjcmVhdGVEVERFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVtcHR5IENvbnRlbnQ8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbXB0eSBDb250ZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbXB0eUNvbnRlbnQgY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFueSBDb250ZW50PC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QW55IENvbnRlbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREFueUNvbnRlbnQgY3JlYXRlRFREQW55Q29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QQyBEYXRhIENvbnRlbnQ8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QQyBEYXRhIENvbnRlbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURFBDRGF0YUNvbnRlbnQgY3JlYXRlRFREUENEYXRhQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbGVtZW50IFJlZmVyZW5jZSBDb250ZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxlbWVudCBSZWZlcmVuY2UgQ29udGVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgY3JlYXRlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RmlsZTwvZW0+Jy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZpbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREZpbGUgY3JlYXRlRFRERmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CYXNpYyBUeXBlPC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmFzaWMgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFREQmFzaWNUeXBlIGNyZWF0ZURUREJhc2ljVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnVtZXJhdGlvbiBUeXBlPC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW51bWVyYXRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Ob3RhdGlvbjwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5vdGF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVEROb3RhdGlvbiBjcmVhdGVEVEROb3RhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnRpdHk8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnRpdHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudGl0eSBjcmVhdGVEVERFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZXJuYWwgRW50aXR5PC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZXJuYWwgRW50aXR5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFeHRlcm5hbEVudGl0eSBjcmVhdGVEVERFeHRlcm5hbEVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnRlcm5hbCBFbnRpdHk8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnRlcm5hbCBFbnRpdHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREludGVybmFsRW50aXR5IGNyZWF0ZURUREludGVybmFsRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBjcmVhdGVEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW50aXR5IFJlZmVyZW5jZSBDb250ZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW50aXR5IFJlZmVyZW5jZSBDb250ZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGNyZWF0ZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURFBhY2thZ2UgZ2V0RFREUGFja2FnZSgpOwotCi19IC8vIERUREZhY3RvcnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERmlsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYWUyOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GaWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjaXNQYXJzZUVycm9yIDxlbT5QYXJzZSBFcnJvcjwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXREVERDb250ZW50IDxlbT5EVEQgQ29udGVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXREVERFbnVtZXJhdGlvblR5cGUgPGVtPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREZpbGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERmlsZSBleHRlbmRzIEVOYW1lZEVsZW1lbnQsIERURE9iamVjdCB7Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RFRET2JqZWN0KCk7Ci0KLQlwdWJsaWMgTGlzdCBsaXN0RFRERWxlbWVudCgpOwotCi0JcHVibGljIExpc3QgbGlzdERURE5vdGF0aW9uKCk7Ci0KLQlwdWJsaWMgTGlzdCBsaXN0RFRERW50aXR5KCk7Ci0KLQlwdWJsaWMgTGlzdCBsaXN0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCk7Ci0KLQlwdWJsaWMgTGlzdCBsaXN0RFRERWxlbWVudEFuZERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCi0JcHVibGljIERUREVsZW1lbnQgZmluZEVsZW1lbnQoU3RyaW5nIG5hbWUpOwotCi0JcHVibGljIERUREVudGl0eSBmaW5kRW50aXR5KFN0cmluZyBuYW1lKTsKLQotCXB1YmxpYyBEVEROb3RhdGlvbiBmaW5kTm90YXRpb24oU3RyaW5nIG5hbWUpOwotCi0JcHVibGljIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBmaW5kUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKFN0cmluZyBuYW1lKTsKLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZShib29sZWFuIGluY2x1ZGVFcnJvcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbW1lbnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREZpbGVfQ29tbWVudCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb21tZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJzZSBFcnJvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyc2UgRXJyb3I8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyc2UgRXJyb3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcnNlRXJyb3IoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERGaWxlX1BhcnNlRXJyb3IoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUGFyc2VFcnJvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2lzUGFyc2VFcnJvciA8ZW0+UGFyc2UgRXJyb3I8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFyc2UgRXJyb3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzUGFyc2VFcnJvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFyc2VFcnJvcihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRURCBDb250ZW50PC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgRFREQ29udGVudH0uIEl0Ci0JICogaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50I2dldERUREZpbGUgPGVtPkRURCBGaWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRURCBDb250ZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZQotCSAqIGxpc3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RFREIENvbnRlbnQ8L2VtPicgY29udGFpbm1lbnQKLQkgKiAgICAgICAgIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREZpbGVfRFREQ29udGVudCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQjZ2V0RFRERmlsZQotCSAqIEBtb2RlbCB0eXBlPSJEVERDb250ZW50IiBvcHBvc2l0ZT0iRFRERmlsZSIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERURENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9iPjwvZW0+JwotCSAqIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZQotCSAqIHtAbGluayBEVERFbnVtZXJhdGlvblR5cGV9LiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXREVERGaWxlIDxlbT5EVEQgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EVEQgRW51bWVyYXRpb24gVHlwZTwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYQotCSAqIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEVudW1lcmF0aW9uIFR5cGU8L2VtPicKLQkgKiAgICAgICAgIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREZpbGVfRFRERW51bWVyYXRpb25UeXBlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlI2dldERUREZpbGUKLQkgKiBAbW9kZWwgdHlwZT0iRFRERW51bWVyYXRpb25UeXBlIiBvcHBvc2l0ZT0iRFRERmlsZSIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERUREVudW1lcmF0aW9uVHlwZSgpOwotCi19IC8vIERUREZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRER3JvdXBDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREdyb3VwQ29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI3MjA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRER3JvdXBDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Hcm91cCBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQjZ2V0R3JvdXBLaW5kIDxlbT5Hcm91cCBLaW5kPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERHcm91cENvbnRlbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRER3JvdXBDb250ZW50IGV4dGVuZHMgRFREUmVwZWF0YWJsZUNvbnRlbnQgewotCi0JcHVibGljIGludCBnZXRDb250ZW50UG9zaXRpb24oRFRERWxlbWVudENvbnRlbnQgY29udGVudCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cCBLaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZH0uIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cCBLaW5kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwIEtpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQKLQkgKiBAc2VlICNzZXRHcm91cEtpbmQoRFRER3JvdXBLaW5kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREdyb3VwQ29udGVudF9Hcm91cEtpbmQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERHcm91cEtpbmQgZ2V0R3JvdXBLaW5kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCNnZXRHcm91cEtpbmQgPGVtPkdyb3VwIEtpbmQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAgS2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZAotCSAqIEBzZWUgI2dldEdyb3VwS2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R3JvdXBLaW5kKERUREdyb3VwS2luZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250ZW50PC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgRFRERWxlbWVudENvbnRlbnR9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRlbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZQotCSAqICAgICAgICAgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERHcm91cENvbnRlbnRfQ29udGVudCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEdyb3VwCi0JICogQG1vZGVsIHR5cGU9IkRUREVsZW1lbnRDb250ZW50IiBvcHBvc2l0ZT0iZ3JvdXAiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqICAgICAgICByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q29udGVudCgpOwotCi19IC8vIERUREdyb3VwQ29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERHcm91cEtpbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRER3JvdXBLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZDhiMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERHcm91cEtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkdyb3VwIEtpbmQ8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERHcm91cEtpbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVERHcm91cEtpbmQgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNFUVVFTkNFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1NFUVVFTkNFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVFVRU5DRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DSE9JQ0U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjQ0hPSUNFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0UgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0VRVUVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TRVFVRU5DRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNTRVFVRU5DRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRER3JvdXBLaW5kIFNFUVVFTkNFX0xJVEVSQUwgPSBuZXcgRFRER3JvdXBLaW5kKFNFUVVFTkNFLCAiU0VRVUVOQ0UiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0hPSUNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q0hPSUNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0NIT0lDRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRER3JvdXBLaW5kIENIT0lDRV9MSVRFUkFMID0gbmV3IERUREdyb3VwS2luZChDSE9JQ0UsICJDSE9JQ0UiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkdyb3VwIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEVERHcm91cEtpbmRbXSBWQUxVRVNfQVJSQVkgPSBuZXcgRFRER3JvdXBLaW5kW117U0VRVUVOQ0VfTElURVJBTCwgQ0hPSUNFX0xJVEVSQUwsfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5Hcm91cCBLaW5kPC9iPjwvZW0+JwotCSAqIGVudW1lcmF0b3JzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+R3JvdXAgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERHcm91cEtpbmQgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlEVERHcm91cEtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Hcm91cCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERHcm91cEtpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFNFUVVFTkNFIDoKLQkJCQlyZXR1cm4gU0VRVUVOQ0VfTElURVJBTDsKLQkJCWNhc2UgQ0hPSUNFIDoKLQkJCQlyZXR1cm4gQ0hPSUNFX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERUREdyb3VwS2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy8gRFRER3JvdXBLaW5kCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREludGVybmFsRW50aXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREludGVybmFsRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMjg3MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERJbnRlcm5hbEVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW50ZXJuYWwgRW50aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRESW50ZXJuYWxFbnRpdHkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRESW50ZXJuYWxFbnRpdHkgZXh0ZW5kcyBEVERFbnRpdHlDb250ZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLCB0aGVyZQotCSAqIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERJbnRlcm5hbEVudGl0eV9WYWx1ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIERUREludGVybmFsRW50aXR5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURExleGljYWxJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURExleGljYWxJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Nzk5N2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERMZXhpY2FsSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLXB1YmxpYyBjbGFzcyBEVERMZXhpY2FsSW5mbyBpbXBsZW1lbnRzIERURFNvdXJjZU9mZnNldCB7Ci0JLy8gQmVnaW4gVXNlciBEZWZpbmVkIE1ldGhvZHMKLQlpbnQgc3RhcnRPZmZzZXQ7Ci0JaW50IGVuZE9mZnNldDsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gc3RhcnRPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCB2KSB7Ci0JCXRoaXMuc3RhcnRPZmZzZXQgPSB2OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZW5kT2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZE9mZnNldChpbnQgdikgewotCi0JCXRoaXMuZW5kT2Zmc2V0ID0gdjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRTdGFydE9mZnNldEdlbigpIHsKLQotCQlyZXR1cm4gc3RhcnRPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFN0YXJ0T2Zmc2V0R2VuKGludCB2KSB7Ci0KLQkJdGhpcy5zdGFydE9mZnNldCA9IHY7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRFbmRPZmZzZXRHZW4oKSB7Ci0KLQkJcmV0dXJuIGVuZE9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGVuZE9mZnNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbmRPZmZzZXRHZW4oaW50IHYpIHsKLQotCi0JCXRoaXMuZW5kT2Zmc2V0ID0gdjsKLQl9Ci19Ly8gRFREU291cmNlT2Zmc2V0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURE5vdGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURE5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NmJiN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVEROb3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Tm90YXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldFN5c3RlbUlEIDxlbT5TeXN0ZW0gSUQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldFB1YmxpY0lEIDxlbT5QdWJsaWMgSUQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURE5vdGF0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERURE5vdGF0aW9uIGV4dGVuZHMgRU5hbWVkRWxlbWVudCwgRFREQ29udGVudCwgRFRET2JqZWN0LCBEVERTb3VyY2VPZmZzZXQgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb21tZW50KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVEROb3RhdGlvbl9Db21tZW50KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TeXN0ZW0gSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN5c3RlbSBJRDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TeXN0ZW0gSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN5c3RlbUlEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVEROb3RhdGlvbl9TeXN0ZW1JRCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTeXN0ZW1JRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRTeXN0ZW1JRCA8ZW0+U3lzdGVtIElEPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN5c3RlbSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3lzdGVtSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN5c3RlbUlEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdWJsaWMgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlB1YmxpYyBJRDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdWJsaWMgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1YmxpY0lEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVEROb3RhdGlvbl9QdWJsaWNJRCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdWJsaWNJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRQdWJsaWNJRCA8ZW0+UHVibGljIElEPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlB1YmxpYyBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVibGljSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFB1YmxpY0lEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnRpdHk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBEVERFeHRlcm5hbEVudGl0eX0uIEl0IGlzCi0JICogYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW50aXR5PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURE5vdGF0aW9uX0VudGl0eSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldE5vdGF0aW9uCi0JICogQG1vZGVsIHR5cGU9IkRUREV4dGVybmFsRW50aXR5IiBvcHBvc2l0ZT0ibm90YXRpb24iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEVudGl0eSgpOwotCi19IC8vIERURE5vdGF0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURE9iamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAzZGI3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLS8vIFJlZiBwYWNrYWdlCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRFRET2JqZWN0IGV4dGVuZHMgRU9iamVjdCB7Ci0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpOwotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpOwotCi19IC8vIERURE9iamVjdApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERPY2N1cnJlbmNlVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERPY2N1cnJlbmNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzhmYjQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRET2NjdXJyZW5jZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5PY2N1cnJlbmNlIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERPY2N1cnJlbmNlVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERURE9jY3VycmVuY2VUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjT05FX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTkUgPSA0OTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9QVElPTkFMPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI09QVElPTkFMX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05BTCA9IDYzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T05FIE9SIE1PUkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjT05FX09SX01PUkVfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9ORV9PUl9NT1JFID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5aRVJPIE9SIE1PUkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjWkVST19PUl9NT1JFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBaRVJPX09SX01PUkUgPSA0MjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjT05FCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERPY2N1cnJlbmNlVHlwZSBPTkVfTElURVJBTCA9IG5ldyBEVERPY2N1cnJlbmNlVHlwZShPTkUsICJPTkUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1BUSU9OQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PUFRJT05BTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNPUFRJT05BTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRET2NjdXJyZW5jZVR5cGUgT1BUSU9OQUxfTElURVJBTCA9IG5ldyBEVERPY2N1cnJlbmNlVHlwZShPUFRJT05BTCwgIk9QVElPTkFMIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9ORSBPUiBNT1JFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T05FIE9SIE1PUkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0Ci0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjT05FX09SX01PUkUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERURE9jY3VycmVuY2VUeXBlIE9ORV9PUl9NT1JFX0xJVEVSQUwgPSBuZXcgRFRET2NjdXJyZW5jZVR5cGUoT05FX09SX01PUkUsICJPTkVfT1JfTU9SRSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5aRVJPIE9SIE1PUkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5aRVJPIE9SIE1PUkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0Ci0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjWkVST19PUl9NT1JFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERPY2N1cnJlbmNlVHlwZSBaRVJPX09SX01PUkVfTElURVJBTCA9IG5ldyBEVERPY2N1cnJlbmNlVHlwZShaRVJPX09SX01PUkUsICJaRVJPX09SX01PUkUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPk9jY3VycmVuY2UgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERURE9jY3VycmVuY2VUeXBlW10gVkFMVUVTX0FSUkFZID0gbmV3IERURE9jY3VycmVuY2VUeXBlW117T05FX0xJVEVSQUwsIE9QVElPTkFMX0xJVEVSQUwsIE9ORV9PUl9NT1JFX0xJVEVSQUwsIFpFUk9fT1JfTU9SRV9MSVRFUkFMLH07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZSBUeXBlPC9iPjwvZW0+JwotCSAqIGVudW1lcmF0b3JzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERURE9jY3VycmVuY2VUeXBlIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRFRET2NjdXJyZW5jZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5PY2N1cnJlbmNlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERURE9jY3VycmVuY2VUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBPTkUgOgotCQkJCXJldHVybiBPTkVfTElURVJBTDsKLQkJCWNhc2UgT1BUSU9OQUwgOgotCQkJCXJldHVybiBPUFRJT05BTF9MSVRFUkFMOwotCQkJY2FzZSBPTkVfT1JfTU9SRSA6Ci0JCQkJcmV0dXJuIE9ORV9PUl9NT1JFX0xJVEVSQUw7Ci0JCQljYXNlIFpFUk9fT1JfTU9SRSA6Ci0JCQkJcmV0dXJuIFpFUk9fT1JfTU9SRV9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEVERPY2N1cnJlbmNlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy8gRFRET2NjdXJyZW5jZVR5cGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUENEYXRhQ29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERQQ0RhdGFDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYWY1ZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERQQ0RhdGFDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QQyBEYXRhIENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERQQ0RhdGFDb250ZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERURFBDRGF0YUNvbnRlbnQgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudCB7Ci19IC8vIERURFBDRGF0YUNvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUGFja2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZTg0YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuIEl0IGNvbnRhaW5zCi0gKiBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZhY3RvcnkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJkdGQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL2NvbS9pYm0vZXRvb2xzL2R0ZC5lY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFREUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGwuRFREUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERWxlbWVudENvbnRlbnRJbXBsIDxlbT5FbGVtZW50IENvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVsZW1lbnRDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREVsZW1lbnRDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX0NPTlRFTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVsZW1lbnQgQ29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFJlcGVhdGFibGVDb250ZW50SW1wbCA8ZW0+UmVwZWF0YWJsZSBDb250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERSZXBlYXRhYmxlQ29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERSZXBlYXRhYmxlQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfUkVQRUFUQUJMRV9DT05URU5UID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fR1JPVVAgPSBEVERfRUxFTUVOVF9DT05URU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UID0gRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PY2N1cnJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgPSBEVERfRUxFTUVOVF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5SZXBlYXRhYmxlIENvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IERURF9FTEVNRU5UX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERHcm91cENvbnRlbnRJbXBsIDxlbT5Hcm91cCBDb250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERHcm91cENvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRER3JvdXBDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9HUk9VUF9DT05URU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0dST1VQX0NPTlRFTlRfX0dST1VQID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0dST1VQX0NPTlRFTlRfX0VMRU1FTlQgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9jY3VycmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0dST1VQX0NPTlRFTlRfX09DQ1VSUkVOQ0UgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwIEtpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0dST1VQX0NPTlRFTlRfX0dST1VQX0tJTkQgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkdyb3VwIENvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9HUk9VUF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQXR0cmlidXRlSW1wbCA8ZW0+QXR0cmlidXRlPC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERBdHRyaWJ1dGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFREQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19OQU1FID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fRVRZUEUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fRVRZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19DSEFOR0VBQkxFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0NIQU5HRUFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Vm9sYXRpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fVk9MQVRJTEUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fVk9MQVRJTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX1RSQU5TSUVOVCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19UUkFOU0lFTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX1VOSVFVRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19VTklRVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZSBMaXRlcmFsPC9iPjwvZW0+JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfTElURVJBTCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG93ZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fTE9XRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fTE9XRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBwZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fVVBQRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fVVBQRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFueTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19NQU5ZID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX01BTlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fUkVRVUlSRUQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUNvbnRhaW5pbmcgQ2xhc3M8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fRUNPTlRBSU5JTkdfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fRUNPTlRBSU5JTkdfQ0xBU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5zZXR0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19VTlNFVFRBQkxFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1VOU0VUVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fSUQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0VBVFRSSUJVVEVfVFlQRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19FQVRUUklCVVRFX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19DT01NRU5UID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBLaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0RFRkFVTFRfS0lORCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9iPjwvZW0+JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfU1RSSU5HID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFkgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5BdHRyaWJ1dGU8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERWxlbWVudEltcGwgPGVtPkVsZW1lbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRUxFTUVOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19OQU1FID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBDbGFzcyBOYW1lPC9iPjwvZW0+JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTU19OQU1FID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5TVEFOQ0VfQ0xBU1NfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlNUQU5DRV9DTEFTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19ERUZBVUxUX1ZBTFVFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFja2FnZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VQQUNLQUdFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVBBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0FCU1RSQUNUID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19JTlRFUkZBQ0UgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlRFUkZBQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN1cGVyIFR5cGVzPC9iPjwvZW0+JyByZWZlcmVuY2UKLQkgKiBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VTVVBFUl9UWVBFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VTVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FT3BlcmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FT1BFUkFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VPUEVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgQXR0cmlidXRlczwvYj48L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FQUxMX0FUVFJJQlVURVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX0FUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UKLQkgKiBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VBTExfUkVGRVJFTkNFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUmVmZXJlbmNlczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FUkVGRVJFTkNFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VSRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VBVFRSSUJVVEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBDb250YWlubWVudHM8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRUFMTF9DT05UQUlOTUVOVFMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX0NPTlRBSU5NRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIE9wZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRUFMTF9PUEVSQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9PUEVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgU3RydWN0dXJhbCBGZWF0dXJlczwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBTdXBlciBUeXBlczwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FQUxMX1NVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9TVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FSUQgQXR0cmlidXRlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FSURfQVRUUklCVVRFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUlEX0FUVFJJQlVURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRmlsZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0RURF9GSUxFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19DT01NRU5UID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50PC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19DT05URU5UID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbGVtZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVtcHR5Q29udGVudEltcGwgPGVtPkVtcHR5IENvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVtcHR5Q29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFbXB0eUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VNUFRZX0NPTlRFTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU1QVFlfQ09OVEVOVF9fR1JPVVAgPSBEVERfRUxFTUVOVF9DT05URU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU1QVFlfQ09OVEVOVF9fRUxFTUVOVCA9IERURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVtcHR5IENvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTVBUWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSBEVERfRUxFTUVOVF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQW55Q29udGVudEltcGwgPGVtPkFueSBDb250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERBbnlDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREFueUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0FOWV9DT05URU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FOWV9DT05URU5UX19HUk9VUCA9IERURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BTllfQ09OVEVOVF9fRUxFTUVOVCA9IERURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkFueSBDb250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQU5ZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IERURF9FTEVNRU5UX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQQ0RhdGFDb250ZW50SW1wbCA8ZW0+UEMgRGF0YSBDb250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQQ0RhdGFDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERURFBDRGF0YUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX1BDX0RBVEFfQ09OVEVOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9QQ19EQVRBX0NPTlRFTlRfX0dST1VQID0gRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCA9IERURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBDIERhdGEgQ29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1BDX0RBVEFfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gRFREX0VMRU1FTlRfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50SW1wbCA8ZW0+RWxlbWVudCBSZWZlcmVuY2UgQ29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlQgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBFbGVtZW50PC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19SRUZFUkVOQ0VEX0VMRU1FTlQgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbGVtZW50IFJlZmVyZW5jZSBDb250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREZpbGVJbXBsIDxlbT5GaWxlPC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERGaWxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0ZJTEUgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0ZJTEVfX0NPTU1FTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnNlIEVycm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9GSUxFX19QQVJTRV9FUlJPUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIENvbnRlbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRklMRV9fRFREX0NPTlRFTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9iPjwvZW0+JwotCSAqIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5GaWxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRklMRV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREJhc2ljVHlwZUltcGwgPGVtPkJhc2ljIFR5cGU8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREJhc2ljVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERCYXNpY1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEUgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX05BTUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIENsYXNzIE5hbWU8L2I+PC9lbT4nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlNUQU5DRV9DTEFTU19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOU1RBTkNFX0NMQVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0RFRkFVTFRfVkFMVUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19ERUZBVUxUX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQYWNrYWdlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRVBBQ0tBR0UgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fQUJTVFJBQ1QgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0lOVEVSRkFDRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOVEVSRkFDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3VwZXIgVHlwZXM8L2I+PC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRVNVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVNVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVPcGVyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VPUEVSQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRU9QRVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBBdHRyaWJ1dGVzPC9iPjwvZW0+JyByZWZlcmVuY2UKLQkgKiBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VBTExfQVRUUklCVVRFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRUFMTF9SRUZFUkVOQ0VTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9SRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVSZWZlcmVuY2VzPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VSRUZFUkVOQ0VTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVJFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRUFUVFJJQlVURVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIENvbnRhaW5tZW50czwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FQUxMX0NPTlRBSU5NRU5UUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfQ09OVEFJTk1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgT3BlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FQUxMX09QRVJBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX09QRVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBTdHJ1Y3R1cmFsIEZlYXR1cmVzPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFN1cGVyIFR5cGVzPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VBTExfU1VQRVJfVFlQRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1NVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVJRCBBdHRyaWJ1dGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VJRF9BVFRSSUJVVEUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FSURfQVRUUklCVVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0tJTkQgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CYXNpYyBUeXBlPC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudW1lcmF0aW9uVHlwZUltcGwgPGVtPkVudW1lcmF0aW9uIFR5cGU8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudW1lcmF0aW9uVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFbnVtZXJhdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEUgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVFTlVNX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fTkFNRSA9IEVjb3JlUGFja2FnZS5FRU5VTV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBDbGFzcyBOYW1lPC9iPjwvZW0+JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FID0gRWNvcmVQYWNrYWdlLkVFTlVNX19JTlNUQU5DRV9DTEFTU19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTUyA9IEVjb3JlUGFja2FnZS5FRU5VTV9fSU5TVEFOQ0VfQ0xBU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fREVGQVVMVF9WQUxVRSA9IEVjb3JlUGFja2FnZS5FRU5VTV9fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFja2FnZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VQQUNLQUdFID0gRWNvcmVQYWNrYWdlLkVFTlVNX19FUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJpYWxpemFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX1NFUklBTElaQUJMRSA9IEVjb3JlUGFja2FnZS5FRU5VTV9fU0VSSUFMSVpBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVMaXRlcmFsczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19FTElURVJBTFMgPSBFY29yZVBhY2thZ2UuRUVOVU1fX0VMSVRFUkFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19LSU5EID0gRWNvcmVQYWNrYWdlLkVFTlVNX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBGaWxlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUgPSBFY29yZVBhY2thZ2UuRUVOVU1fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVudW1lcmF0aW9uIFR5cGU8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRUVOVU1fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERDb250ZW50SW1wbCA8ZW0+Q29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQ29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9DT05URU5UID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEZpbGU8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9DT05URU5UX19EVERfRklMRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkNvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRETm90YXRpb25JbXBsIDxlbT5Ob3RhdGlvbjwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRETm90YXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRETm90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX05PVEFUSU9OID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEZpbGU8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9OT1RBVElPTl9fRFREX0ZJTEUgPSBEVERfQ09OVEVOVF9fRFREX0ZJTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfTk9UQVRJT05fX0NPTU1FTlQgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TeXN0ZW0gSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX05PVEFUSU9OX19TWVNURU1fSUQgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdWJsaWMgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX05PVEFUSU9OX19QVUJMSUNfSUQgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdHk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfTk9UQVRJT05fX0VOVElUWSA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Ob3RhdGlvbjwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX05PVEFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwgPGVtPkVudGl0eTwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRU5USVRZID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEZpbGU8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfX0RURF9GSUxFID0gRFREX0NPTlRFTlRfX0RURF9GSUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9fQ09NTUVOVCA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmFtZXRlciBFbnRpdHk8L2I+PC9lbT4nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWSA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9fQ09OVEVOVCA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcm0gRW50aXR5IFJlZjwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgUmVmZXJlbmNlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbnRpdHk8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfRkVBVFVSRV9DT1VOVCA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5Q29udGVudEltcGwgPGVtPkVudGl0eSBDb250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREVudGl0eUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9DT05URU5UID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEVudGl0eTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RW50aXR5IENvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREV4dGVybmFsRW50aXR5SW1wbCA8ZW0+RXh0ZXJuYWwgRW50aXR5PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFeHRlcm5hbEVudGl0eUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFeHRlcm5hbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRVhURVJOQUxfRU5USVRZID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEVudGl0eTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA9IERURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TeXN0ZW0gSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VYVEVSTkFMX0VOVElUWV9fU1lTVEVNX0lEID0gRFREX0VOVElUWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1YmxpYyBJRDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRVhURVJOQUxfRU5USVRZX19QVUJMSUNfSUQgPSBEVERfRU5USVRZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm90YXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gPSBEVERfRU5USVRZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IFJlZmVyZW5jZWQgRnJvbSBBbm90aGVyIEZpbGU8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VYVEVSTkFMX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRURfRlJPTV9BTk9USEVSX0ZJTEUgPSBEVERfRU5USVRZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkV4dGVybmFsIEVudGl0eTwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VYVEVSTkFMX0VOVElUWV9GRUFUVVJFX0NPVU5UID0gRFREX0VOVElUWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRESW50ZXJuYWxFbnRpdHlJbXBsIDxlbT5JbnRlcm5hbCBFbnRpdHk8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREludGVybmFsRW50aXR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREludGVybmFsRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9JTlRFUk5BTF9FTlRJVFkgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRW50aXR5PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZID0gRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9JTlRFUk5BTF9FTlRJVFlfX1ZBTFVFID0gRFREX0VOVElUWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JbnRlcm5hbCBFbnRpdHk8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9JTlRFUk5BTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCA9IERURF9FTlRJVFlfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUltcGwgPGVtPlBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlPC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRSA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBGaWxlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFID0gRFREX0NPTlRFTlRfX0RURF9GSUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eTwvYj48L2VtPicgcmVmZXJlbmNlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QYXJhbWV0ZXIgRW50aXR5IFJlZmVyZW5jZTwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX0ZFQVRVUkVfQ09VTlQgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsIDxlbT5FbnRpdHkgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fT0NDVVJSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFkgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbnRpdHkgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGUgPGVtPk9jY3VycmVuY2UgVHlwZTwvZW0+fScKLQkgKiBlbnVtLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERPY2N1cnJlbmNlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfT0NDVVJSRU5DRV9UWVBFID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQgPGVtPkRlZmF1bHQgS2luZDwvZW0+fScKLQkgKiBlbnVtLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVEREZWZhdWx0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfREVGQVVMVF9LSU5EID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZCA8ZW0+QmFzaWMgVHlwZSBLaW5kPC9lbT59JwotCSAqIGVudW0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFREQmFzaWNUeXBlS2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9LSU5EID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZCA8ZW0+RW51bSBHcm91cCBLaW5kPC9lbT59JwotCSAqIGVudW0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERW51bUdyb3VwS2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRU5VTV9HUk9VUF9LSU5EID0gMjM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kIDxlbT5Hcm91cCBLaW5kPC9lbT59JwotCSAqIGVudW0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERHcm91cEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0dST1VQX0tJTkQgPSAyNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5YTUxTY2hlbWFEZWZpbmVkVHlwZSA8ZW0+WE1MIFNjaGVtYSBEZWZpbmVkIFR5cGU8L2VtPn0nCi0JICogZW51bS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLlhNTFNjaGVtYURlZmluZWRUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0WE1MU2NoZW1hRGVmaW5lZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgWE1MX1NDSEVNQV9ERUZJTkVEX1RZUEUgPSAyNTsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCA8ZW0+RWxlbWVudCBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbGVtZW50IENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERFbGVtZW50Q29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRHcm91cCgpCi0JICogQHNlZSAjZ2V0RFRERWxlbWVudENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVsZW1lbnRDb250ZW50X0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldERUREVsZW1lbnRDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbGVtZW50Q29udGVudF9FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCA8ZW0+R3JvdXAgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3JvdXAgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERHcm91cENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQjZ2V0R3JvdXBLaW5kIDxlbT5Hcm91cCBLaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdyb3VwIEtpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCNnZXRHcm91cEtpbmQoKQotCSAqIEBzZWUgI2dldERUREdyb3VwQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRER3JvdXBDb250ZW50X0dyb3VwS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQjZ2V0Q29udGVudCgpCi0JICogQHNlZSAjZ2V0RFRER3JvdXBDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERHcm91cENvbnRlbnRfQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUgPGVtPkF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRDb21tZW50KCkKLQkgKiBAc2VlICNnZXREVERBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREF0dHJpYnV0ZV9Db21tZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERlZmF1bHRLaW5kIDxlbT5EZWZhdWx0IEtpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBLaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RGVmYXVsdEtpbmQoKQotCSAqIEBzZWUgI2dldERUREF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFREQXR0cmlidXRlX0RlZmF1bHRLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERlZmF1bHRWYWx1ZVN0cmluZyA8ZW0+RGVmYXVsdCBWYWx1ZSBTdHJpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBWYWx1ZSBTdHJpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREZWZhdWx0VmFsdWVTdHJpbmcoKQotCSAqIEBzZWUgI2dldERUREF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFREQXR0cmlidXRlX0RlZmF1bHRWYWx1ZVN0cmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpCi0JICogQHNlZSAjZ2V0RFREQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERBdHRyaWJ1dGVfQXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBzZWUgI2dldERUREF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFREQXR0cmlidXRlX0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREVERFbGVtZW50IDxlbT5EVEQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+RFREIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREVERFbGVtZW50KCkKLQkgKiBAc2VlICNnZXREVERBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREF0dHJpYnV0ZV9EVERFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29tbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb21tZW50KCkKLQkgKiBAc2VlICNnZXREVERFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERFbGVtZW50X0NvbW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb250ZW50KCkKLQkgKiBAc2VlICNnZXREVERFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbGVtZW50X0NvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0RFREQXR0cmlidXRlIDxlbT5EVEQgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RFREIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXREVERBdHRyaWJ1dGUoKQotCSAqIEBzZWUgI2dldERUREVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVsZW1lbnRfRFREQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVtcHR5Q29udGVudCA8ZW0+RW1wdHkgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RW1wdHkgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERFbXB0eUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQW55Q29udGVudCA8ZW0+QW55IENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFueSBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERBbnlDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQgPGVtPlBDIERhdGEgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UEMgRGF0YSBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERQQ0RhdGFDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IDxlbT5FbGVtZW50IFJlZmVyZW5jZSBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbGVtZW50IFJlZmVyZW5jZSBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCNnZXRSZWZlcmVuY2VkRWxlbWVudCA8ZW0+UmVmZXJlbmNlZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlJlZmVyZW5jZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQjZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudF9SZWZlcmVuY2VkRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudCA8ZW0+UmVwZWF0YWJsZSBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXBlYXRhYmxlIENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERSZXBlYXRhYmxlQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50I2dldE9jY3VycmVuY2UgPGVtPk9jY3VycmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T2NjdXJyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQjZ2V0T2NjdXJyZW5jZSgpCi0JICogQHNlZSAjZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERURFJlcGVhdGFibGVDb250ZW50X09jY3VycmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSA8ZW0+RmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RmlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db21tZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldENvbW1lbnQoKQotCSAqIEBzZWUgI2dldERUREZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREZpbGVfQ29tbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjaXNQYXJzZUVycm9yIDxlbT5QYXJzZSBFcnJvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYXJzZSBFcnJvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNpc1BhcnNlRXJyb3IoKQotCSAqIEBzZWUgI2dldERUREZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREZpbGVfUGFyc2VFcnJvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXREVERDb250ZW50IDxlbT5EVEQgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRURCBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldERURENvbnRlbnQoKQotCSAqIEBzZWUgI2dldERUREZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREZpbGVfRFREQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXREVERFbnVtZXJhdGlvblR5cGUgPGVtPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RFREIEVudW1lcmF0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFRERW51bWVyYXRpb25UeXBlKCkKLQkgKiBAc2VlICNnZXREVERGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERGaWxlX0RUREVudW1lcmF0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGUgPGVtPkJhc2ljIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJhc2ljIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFREQmFzaWNUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlI2dldEtpbmQgPGVtPktpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlI2dldEtpbmQoKQotCSAqIEBzZWUgI2dldERUREJhc2ljVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFREQmFzaWNUeXBlX0tpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlIDxlbT5FbnVtZXJhdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbnVtZXJhdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREVudW1lcmF0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXRLaW5kIDxlbT5LaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPktpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXRLaW5kKCkKLQkgKiBAc2VlICNnZXREVERFbnVtZXJhdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREVudW1lcmF0aW9uVHlwZV9LaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXREVERGaWxlIDxlbT5EVEQgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+RFREIEZpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXREVERGaWxlKCkKLQkgKiBAc2VlICNnZXREVERFbnVtZXJhdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVudW1lcmF0aW9uVHlwZV9EVERGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Tm90YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVEROb3RhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29tbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0Q29tbWVudCgpCi0JICogQHNlZSAjZ2V0RFRETm90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERURE5vdGF0aW9uX0NvbW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRTeXN0ZW1JRCA8ZW0+U3lzdGVtIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN5c3RlbSBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0U3lzdGVtSUQoKQotCSAqIEBzZWUgI2dldERURE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVEROb3RhdGlvbl9TeXN0ZW1JRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldFB1YmxpY0lEIDxlbT5QdWJsaWMgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVibGljIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRQdWJsaWNJRCgpCi0JICogQHNlZSAjZ2V0RFRETm90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERURE5vdGF0aW9uX1B1YmxpY0lEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0RW50aXR5KCkKLQkgKiBAc2VlICNnZXREVEROb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRETm90YXRpb25fRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSA8ZW0+RW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29tbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbW1lbnQoKQotCSAqIEBzZWUgI2dldERUREVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRERW50aXR5X0NvbW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjaXNQYXJhbWV0ZXJFbnRpdHkgPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFyYW1ldGVyIEVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2lzUGFyYW1ldGVyRW50aXR5KCkKLQkgKiBAc2VlICNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29udGVudCgpCi0JICogQHNlZSAjZ2V0RFRERW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRQYXJtRW50aXR5UmVmIDxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0UGFybUVudGl0eVJlZigpCi0JICogQHNlZSAjZ2V0RFRERW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEVudGl0eVJlZmVyZW5jZSA8ZW0+RW50aXR5IFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkVudGl0eSBSZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRFbnRpdHlSZWZlcmVuY2UoKQotCSAqIEBzZWUgI2dldERUREVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X0VudGl0eVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKQotCSAqIEBzZWUgI2dldERUREVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlIDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkKLQkgKiBAc2VlICNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVudGl0eV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQgPGVtPkVudGl0eSBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbnRpdHkgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERW50aXR5Q29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50I2dldERUREVudGl0eSA8ZW0+RFREIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+RFREIEVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudCNnZXREVERFbnRpdHkoKQotCSAqIEBzZWUgI2dldERUREVudGl0eUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVudGl0eUNvbnRlbnRfRFRERW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5IDxlbT5FeHRlcm5hbCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4dGVybmFsIEVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREV4dGVybmFsRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0U3lzdGVtSUQgPGVtPlN5c3RlbSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TeXN0ZW0gSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldFN5c3RlbUlEKCkKLQkgKiBAc2VlICNnZXREVERFeHRlcm5hbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRERXh0ZXJuYWxFbnRpdHlfU3lzdGVtSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRQdWJsaWNJRCA8ZW0+UHVibGljIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlB1YmxpYyBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0UHVibGljSUQoKQotCSAqIEBzZWUgI2dldERUREV4dGVybmFsRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERFeHRlcm5hbEVudGl0eV9QdWJsaWNJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Ob3RhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0Tm90YXRpb24oKQotCSAqIEBzZWUgI2dldERUREV4dGVybmFsRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFeHRlcm5hbEVudGl0eV9Ob3RhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUgPGVtPkVudGl0eSBSZWZlcmVuY2VkIEZyb20gQW5vdGhlciBGaWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVudGl0eSBSZWZlcmVuY2VkIEZyb20gQW5vdGhlciBGaWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCkKLQkgKiBAc2VlICNnZXREVERFeHRlcm5hbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERXh0ZXJuYWxFbnRpdHlfRW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eSA8ZW0+SW50ZXJuYWwgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbnRlcm5hbCBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERJbnRlcm5hbEVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHkjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldERUREludGVybmFsRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERJbnRlcm5hbEVudGl0eV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgPGVtPlBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYXJhbWV0ZXIgRW50aXR5IFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UjZ2V0RW50aXR5IDxlbT5FbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UjZ2V0RW50aXR5KCkKLQkgKiBAc2VlICNnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCA8ZW0+RW50aXR5IFJlZmVyZW5jZSBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbnRpdHkgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50I2dldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5IDxlbT5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQjZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBzZWUgI2dldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRfRWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudCA8ZW0+Q29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFREQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50I2dldERUREZpbGUgPGVtPkRURCBGaWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5EVEQgRmlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudCNnZXREVERGaWxlKCkKLQkgKiBAc2VlICNnZXREVERDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERDb250ZW50X0RUREZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZSA8ZW0+T2NjdXJyZW5jZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPk9jY3VycmVuY2UgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0RFRET2NjdXJyZW5jZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZCA8ZW0+RGVmYXVsdCBLaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkRlZmF1bHQgS2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0RFRERGVmYXVsdEtpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kIDxlbT5CYXNpYyBUeXBlIEtpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+QmFzaWMgVHlwZSBLaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldERUREJhc2ljVHlwZUtpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kIDxlbT5FbnVtIEdyb3VwIEtpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+RW51bSBHcm91cCBLaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldERUREVudW1Hcm91cEtpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQgPGVtPkdyb3VwIEtpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+R3JvdXAgS2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldERUREdyb3VwS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLlhNTFNjaGVtYURlZmluZWRUeXBlIDxlbT5YTUwgU2NoZW1hIERlZmluZWQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5YTUwgU2NoZW1hIERlZmluZWQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuWE1MU2NoZW1hRGVmaW5lZFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0WE1MU2NoZW1hRGVmaW5lZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERGYWN0b3J5IGdldERUREZhY3RvcnkoKTsKLQotfSAvLyBEVERQYWNrYWdlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY0ZjkxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYXJhbWV0ZXIgRW50aXR5IFJlZmVyZW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlI2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZXh0ZW5kcyBFTmFtZWRFbGVtZW50LCBEVERDb250ZW50LCBEVERPYmplY3QsIERURFNvdXJjZU9mZnNldCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+JyByZWZlcmVuY2UuIEl0IGlzCi0JICogYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0UGFybUVudGl0eVJlZiA8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudGl0eTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHk8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVudGl0eShEVERFbnRpdHkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlX0VudGl0eSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRQYXJtRW50aXR5UmVmCi0JICogQG1vZGVsIG9wcG9zaXRlPSJwYXJtRW50aXR5UmVmIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW50aXR5IGdldEVudGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UjZ2V0RW50aXR5IDxlbT5FbnRpdHk8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVudGl0eShEVERFbnRpdHkgdmFsdWUpOwotCi19IC8vIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERSZXBlYXRhYmxlQ29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERSZXBlYXRhYmxlQ29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWI1MTIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUmVwZWF0YWJsZUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVwZWF0YWJsZSBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudCNnZXRPY2N1cnJlbmNlIDxlbT5PY2N1cnJlbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURFJlcGVhdGFibGVDb250ZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERSZXBlYXRhYmxlQ29udGVudCBleHRlbmRzIERUREVsZW1lbnRDb250ZW50IHsKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PY2N1cnJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9jY3VycmVuY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T2NjdXJyZW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlCi0JICogQHNlZSAjc2V0T2NjdXJyZW5jZShEVERPY2N1cnJlbmNlVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERSZXBlYXRhYmxlQ29udGVudF9PY2N1cnJlbmNlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRET2NjdXJyZW5jZVR5cGUgZ2V0T2NjdXJyZW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudCNnZXRPY2N1cnJlbmNlIDxlbT5PY2N1cnJlbmNlPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9jY3VycmVuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZQotCSAqIEBzZWUgI2dldE9jY3VycmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE9jY3VycmVuY2UoRFRET2NjdXJyZW5jZVR5cGUgdmFsdWUpOwotCi19IC8vIERURFJlcGVhdGFibGVDb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFJlc291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZGQxZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIERURFJlc291cmNlIHsKLQkvLyBFbnVtZXJhdGlvbiBDb25zdGFudHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTllJQ09OID0gImljb25zL2FueS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVElDT04gPSAiaWNvbnMvZWxlbWVudC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZSUNPTiA9ICJpY29ucy9lbnRpdHkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURUlDT04gPSAiaWNvbnMvYXR0cmlidXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTklDT04gPSAiaWNvbnMvbm90YXRpb24uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZSUNPTiA9ICJpY29ucy9lbXB0eWNvbnRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBDREFUQUlDT04gPSAiaWNvbnMvb25lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlSRUZFUkVOQ0VJQ09OID0gImljb25zL2VudGl0eV9yZWZlcmVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FSUNPTiA9ICJpY29ucy9vbmUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTkFMSUNPTiA9ICJpY29ucy9vcHRpb25hbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FT1JNT1JFSUNPTiA9ICJpY29ucy9vbmVvcm1vcmUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpFUk9PUk1PUkVJQ09OID0gImljb25zL3plcm9vcm1vcmUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FU0VRVUVOQ0VJQ09OID0gImljb25zL29uZXNlcXVlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05BTFNFUVVFTkNFSUNPTiA9ICJpY29ucy9vcHRpb25hbHNlcXVlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVPUk1PUkVTRVFVRU5DRUlDT04gPSAiaWNvbnMvb25lb3Jtb3Jlc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpFUk9PUk1PUkVTRVFVRU5DRUlDT04gPSAiaWNvbnMvemVyb29ybW9yZXNlcXVlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORUNIT0lDRUlDT04gPSAiaWNvbnMvb25lY2hvaWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05BTENIT0lDRUlDT04gPSAiaWNvbnMvb3B0aW9uYWxjaG9pY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORU9STU9SRUNIT0lDRUlDT04gPSAiaWNvbnMvb25lb3Jtb3JlY2hvaWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaRVJPT1JNT1JFQ0hPSUNFSUNPTiA9ICJpY29ucy96ZXJvb3Jtb3JlY2hvaWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUREZJTEVJQ09OID0gImljb25zL0RUREZpbGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXRFREID0gImljb25zL25ld2R0ZF93aXouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV0hUTUxGT1JNID0gImljb25zL2dlbmh0bWZvcm1fd2l6LmdpZiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREU291cmNlT2Zmc2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFNvdXJjZU9mZnNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjM2Mjg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREU291cmNlT2Zmc2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1wdWJsaWMgaW50ZXJmYWNlIERURFNvdXJjZU9mZnNldCB7Ci0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgdik7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpOwotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KTsKLQotfS8vIERURFNvdXJjZU9mZnNldApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3NDYyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRFREVHlwZSBleHRlbmRzIERURE9iamVjdCB7Ci0JLy8gY29uc3RhbnQgc3RyaW5ncyBmb3IgZHRkIGF0dHJpYnV0ZSB0eXBlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkUgPSAiTm9uZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBID0gIkNoYXJhY3RlciBEYXRhIChDREFUQSkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiSWRlbnRpZmllciAoSUQpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEUkVGID0gIklEIFJlZmVyZW5jZSAoSURSRUYpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEUkVGUyA9ICJJRCBSZWZlcmVuY2VzIChJRFJFRlMpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWSA9ICJFbnRpdHkgTmFtZSAoRU5USVRZKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVElFUyA9ICJFbnRpdHkgTmFtZXMgKEVOVElUSUVTKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOTVRPS0VOID0gIk5hbWUgVG9rZW4gKE5NVE9LRU4pIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU5TID0gIk5hbWUgVG9rZW5zIChOTVRPS0VOUykiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5VTV9OQU1FX1RPS0VOX0dST1VQID0gIkVudW1lcmF0ZWQgTmFtZSBUb2tlbnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5VTV9OT1RBVElPTl9HUk9VUCA9ICJFbnVtZXJhdGVkIE5PVEFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL1hNTFNjaGVtYURlZmluZWRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL1hNTFNjaGVtYURlZmluZWRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzY4YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9YTUxTY2hlbWFEZWZpbmVkVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlhNTCBTY2hlbWEgRGVmaW5lZCBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0WE1MU2NoZW1hRGVmaW5lZFR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxTY2hlbWFEZWZpbmVkVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOT05FX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FID0gLTE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TVFJJTkc8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjU1RSSU5HX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJJTkcgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Qk9PTEVBTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNCT09MRUFOX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT09MRUFOID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZMT0FUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0ZMT0FUX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTE9BVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5ET1VCTEU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRE9VQkxFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET1VCTEUgPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+REVDSU1BTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNERUNJTUFMX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUNJTUFMID0gNTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRJTUVJTlNUQU5UPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1RJTUVJTlNUQU5UX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FSU5TVEFOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5USU1FRFVSQVRJT048L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjVElNRURVUkFUSU9OX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FRFVSQVRJT04gPSA3OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVDVVJSSU5HSU5TVEFOVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNSRUNVUlJJTkdJTlNUQU5UX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUNVUlJJTkdJTlNUQU5UID0gODsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkJJTkFSWTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNCSU5BUllfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJTkFSWSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjVVJJX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUkkgPSAxMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOVEVHRVI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSU5URUdFUl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URUdFUiA9IDExOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+REFURTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNEQVRFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVRFID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5USU1FPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1RJTUVfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUUgPSAxMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOT05FCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBOT05FX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoTk9ORSwgIk5PTkUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U1RSSU5HPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U1RSSU5HPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1NUUklORwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgU1RSSU5HX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoU1RSSU5HLCAiU1RSSU5HIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkJPT0xFQU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5CT09MRUFOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0JPT0xFQU4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIEJPT0xFQU5fTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShCT09MRUFOLCAiQk9PTEVBTiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GTE9BVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkZMT0FUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0ZMT0FUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBGTE9BVF9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKEZMT0FULCAiRkxPQVQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RE9VQkxFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RE9VQkxFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0RPVUJMRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgRE9VQkxFX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoRE9VQkxFLCAiRE9VQkxFIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRFQ0lNQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5ERUNJTUFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0RFQ0lNQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIERFQ0lNQUxfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShERUNJTUFMLCAiREVDSU1BTCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5USU1FSU5TVEFOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlRJTUVJTlNUQU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdAotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1RJTUVJTlNUQU5UCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBUSU1FSU5TVEFOVF9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKFRJTUVJTlNUQU5ULCAiVElNRUlOU1RBTlQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VElNRURVUkFUSU9OPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VElNRURVUkFUSU9OPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdAotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1RJTUVEVVJBVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgVElNRURVUkFUSU9OX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoVElNRURVUkFUSU9OLCAiVElNRURVUkFUSU9OIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFQ1VSUklOR0lOU1RBTlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SRUNVUlJJTkdJTlNUQU5UPC9iPjwvZW0+JyBsaXRlcmFsCi0JICogb2JqZWN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbgotCSAqIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjUkVDVVJSSU5HSU5TVEFOVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgUkVDVVJSSU5HSU5TVEFOVF9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKFJFQ1VSUklOR0lOU1RBTlQsICJSRUNVUlJJTkdJTlNUQU5UIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkJJTkFSWTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkJJTkFSWTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNCSU5BUlkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIEJJTkFSWV9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKEJJTkFSWSwgIkJJTkFSWSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1VSSQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgVVJJX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoVVJJLCAiVVJJIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOVEVHRVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTlRFR0VSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lOVEVHRVIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIElOVEVHRVJfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShJTlRFR0VSLCAiSU5URUdFUiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5EQVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRBVEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjREFURQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgREFURV9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKERBVEUsICJEQVRFIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRJTUU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VElNRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNUSU1FCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBUSU1FX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoVElNRSwgIlRJTUUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlhNTCBTY2hlbWEgRGVmaW5lZCBUeXBlPC9iPjwvZW0+JwotCSAqIGVudW1lcmF0b3JzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGVbXSBWQUxVRVNfQVJSQVkgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGVbXXtOT05FX0xJVEVSQUwsIFNUUklOR19MSVRFUkFMLCBCT09MRUFOX0xJVEVSQUwsIEZMT0FUX0xJVEVSQUwsIERPVUJMRV9MSVRFUkFMLCBERUNJTUFMX0xJVEVSQUwsIFRJTUVJTlNUQU5UX0xJVEVSQUwsIFRJTUVEVVJBVElPTl9MSVRFUkFMLCBSRUNVUlJJTkdJTlNUQU5UX0xJVEVSQUwsIEJJTkFSWV9MSVRFUkFMLCBVUklfTElURVJBTCwgSU5URUdFUl9MSVRFUkFMLCBEQVRFX0xJVEVSQUwsIFRJTUVfTElURVJBTCx9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlhNTCBTY2hlbWEgRGVmaW5lZCBUeXBlPC9iPjwvZW0+JwotCSAqIGVudW1lcmF0b3JzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WE1MIFNjaGVtYSBEZWZpbmVkIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWE1MU2NoZW1hRGVmaW5lZFR5cGUgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlYTUxTY2hlbWFEZWZpbmVkVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhNTCBTY2hlbWEgRGVmaW5lZCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBYTUxTY2hlbWFEZWZpbmVkVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgTk9ORSA6Ci0JCQkJcmV0dXJuIE5PTkVfTElURVJBTDsKLQkJCWNhc2UgU1RSSU5HIDoKLQkJCQlyZXR1cm4gU1RSSU5HX0xJVEVSQUw7Ci0JCQljYXNlIEJPT0xFQU4gOgotCQkJCXJldHVybiBCT09MRUFOX0xJVEVSQUw7Ci0JCQljYXNlIEZMT0FUIDoKLQkJCQlyZXR1cm4gRkxPQVRfTElURVJBTDsKLQkJCWNhc2UgRE9VQkxFIDoKLQkJCQlyZXR1cm4gRE9VQkxFX0xJVEVSQUw7Ci0JCQljYXNlIERFQ0lNQUwgOgotCQkJCXJldHVybiBERUNJTUFMX0xJVEVSQUw7Ci0JCQljYXNlIFRJTUVJTlNUQU5UIDoKLQkJCQlyZXR1cm4gVElNRUlOU1RBTlRfTElURVJBTDsKLQkJCWNhc2UgVElNRURVUkFUSU9OIDoKLQkJCQlyZXR1cm4gVElNRURVUkFUSU9OX0xJVEVSQUw7Ci0JCQljYXNlIFJFQ1VSUklOR0lOU1RBTlQgOgotCQkJCXJldHVybiBSRUNVUlJJTkdJTlNUQU5UX0xJVEVSQUw7Ci0JCQljYXNlIEJJTkFSWSA6Ci0JCQkJcmV0dXJuIEJJTkFSWV9MSVRFUkFMOwotCQkJY2FzZSBVUkkgOgotCQkJCXJldHVybiBVUklfTElURVJBTDsKLQkJCWNhc2UgSU5URUdFUiA6Ci0JCQkJcmV0dXJuIElOVEVHRVJfTElURVJBTDsKLQkJCWNhc2UgREFURSA6Ci0JCQkJcmV0dXJuIERBVEVfTElURVJBTDsKLQkJCWNhc2UgVElNRSA6Ci0JCQkJcmV0dXJuIFRJTUVfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgWE1MU2NoZW1hRGVmaW5lZFR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vIFhNTFNjaGVtYURlZmluZWRUeXBlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQW55Q29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERBbnlDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWFlYjk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERBbnlDb250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFueSBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREFueUNvbnRlbnRJbXBsIGV4dGVuZHMgRFRERWxlbWVudENvbnRlbnRJbXBsIGltcGxlbWVudHMgRFREQW55Q29udGVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpIHsKLQkJcmV0dXJuICJBTlkiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERBbnlDb250ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERBbnlDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQoKSA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQoKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCgpLCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERBdHRyaWJ1dGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQXR0cmlidXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWRlODgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERBdHRyaWJ1dGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uQ2hhaW5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUF0dHJpYnV0ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURExleGljYWxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFR5cGU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXR0cmlidXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREF0dHJpYnV0ZUltcGwjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERBdHRyaWJ1dGVJbXBsI2dldERlZmF1bHRLaW5kIDxlbT5EZWZhdWx0IEtpbmQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQXR0cmlidXRlSW1wbCNnZXREZWZhdWx0VmFsdWVTdHJpbmcgPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREF0dHJpYnV0ZUltcGwjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREF0dHJpYnV0ZUltcGwjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREF0dHJpYnV0ZUltcGwjZ2V0RFRERWxlbWVudCA8ZW0+RFREIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFREQXR0cmlidXRlSW1wbCBleHRlbmRzIEVBdHRyaWJ1dGVJbXBsIGltcGxlbWVudHMgRFREQXR0cmlidXRlIHsKLQotCXB1YmxpYyBEVERBdHRyaWJ1dGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBEVERUeXBlIGdldERURFR5cGUoKSB7Ci0JCXJldHVybiAoRFREVHlwZSkgZ2V0RVR5cGUoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldERURFR5cGUoRFREVHlwZSB0eXBlKSB7Ci0JCXNldEVUeXBlKChFQ2xhc3NpZmllcikgdHlwZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RFREQmFzaWNUeXBlKGludCB2YWx1ZSkgewotCQlEVERGYWN0b3J5SW1wbCBmYWN0b3J5ID0gKERUREZhY3RvcnlJbXBsKSBEVERGYWN0b3J5SW1wbC5pbnN0YW5jZSgpOwotCQkvLyBzZXQgYXR0cmlidXRlIHR5cGUKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSAwIDoKLQkJCQlzZXREVERUeXBlKGZhY3RvcnkuZ2V0RFREQmFzaWNUeXBlX05PTkUoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDEgOgotCQkJCXNldERURFR5cGUoZmFjdG9yeS5nZXREVERCYXNpY1R5cGVfQ0RBVEEoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDIgOgotCQkJCXNldERURFR5cGUoZmFjdG9yeS5nZXREVERCYXNpY1R5cGVfSUQoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDMgOgotCQkJCXNldERURFR5cGUoZmFjdG9yeS5nZXREVERCYXNpY1R5cGVfSURSRUYoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQgOgotCQkJCXNldERURFR5cGUoZmFjdG9yeS5nZXREVERCYXNpY1R5cGVfSURSRUZTKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSA1IDoKLQkJCQlzZXREVERUeXBlKGZhY3RvcnkuZ2V0RFREQmFzaWNUeXBlX0VOVElUWSgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNiA6Ci0JCQkJc2V0RFREVHlwZShmYWN0b3J5LmdldERUREJhc2ljVHlwZV9FTlRJVElFUygpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNyA6Ci0JCQkJc2V0RFREVHlwZShmYWN0b3J5LmdldERUREJhc2ljVHlwZV9OTVRPS0VOKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSA4IDoKLQkJCQlzZXREVERUeXBlKGZhY3RvcnkuZ2V0RFREQmFzaWNUeXBlX05NVE9LRU5TKCkpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCkgewotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigxMjgpOwotCi0KLQkJcmVzdWx0LmFwcGVuZChnZXROYW1lKCkpOwotCi0KLQkJU3RyaW5nQnVmZmVyIHZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzd2l0Y2ggKGdldERlZmF1bHRLaW5kKCkuZ2V0VmFsdWUoKSkgewotCQkJY2FzZSBEVEREZWZhdWx0S2luZC5JTVBMSUVEIDoKLQkJCQl2YWx1ZS5hcHBlbmQoIiNJTVBMSUVEIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgRFRERGVmYXVsdEtpbmQuUkVRVUlSRUQgOgotCQkJCXZhbHVlLmFwcGVuZCgiI1JFUVVJUkVEIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgRFRERGVmYXVsdEtpbmQuRklYRUQgOgotCQkJCVN0cmluZyB0eXBlID0gZ2V0RFREVHlwZSgpLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKCEodHlwZS5lcXVhbHMoRFREVHlwZS5JRCkgfHwgdHlwZS5lcXVhbHMoRFREVHlwZS5JRFJFRikgfHwgdHlwZS5lcXVhbHMoRFREVHlwZS5FTlVNX05BTUVfVE9LRU5fR1JPVVApIHx8IHR5cGUuZXF1YWxzKERURFR5cGUuSURSRUZTKSkpIHsKLQkJCQkJdmFsdWUuYXBwZW5kKCIjRklYRUQgXCIiKS5hcHBlbmQoZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkpLmFwcGVuZCgiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEVEREZWZhdWx0S2luZC5OT0ZJWEVEIDoKLQkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCk7Ci0JCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKQotCQkJCQl2YWx1ZS5hcHBlbmQoIlwiIikuYXBwZW5kKGRlZmF1bHRWYWx1ZSkuYXBwZW5kKCJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlicmVhazsKLQkJfQotCi0KLQkJLy8gR2V0IHRoZSBhdHRyaWJ1dGUgdHlwZQotCQlEVERFbnRpdHkgdHlwZUVudCA9IGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCk7Ci0JCWlmICh0eXBlRW50ICE9IG51bGwpIHsKLQkJCXJlc3VsdC5hcHBlbmQoIiAlIiArIHR5cGVFbnQuZ2V0TmFtZSgpICsgIjsgIikuYXBwZW5kKHZhbHVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSB7Ci0JCQlEVERUeXBlIGR0ZFR5cGUgPSBnZXREVERUeXBlKCk7Ci0JCQlpZiAoZHRkVHlwZSBpbnN0YW5jZW9mIERUREJhc2ljVHlwZSkgewotCQkJCXN3aXRjaCAoKChEVERCYXNpY1R5cGUpIGR0ZFR5cGUpLmdldEtpbmQoKS5nZXRWYWx1ZSgpKSB7Ci0JCQkJCWNhc2UgRFREQmFzaWNUeXBlS2luZC5DREFUQSA6Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCIgQ0RBVEEgIikuYXBwZW5kKHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgRFREQmFzaWNUeXBlS2luZC5JRCA6Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCIgSUQgIikuYXBwZW5kKHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgRFREQmFzaWNUeXBlS2luZC5JRFJFRiA6Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCIgSURSRUYgIikuYXBwZW5kKHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgRFREQmFzaWNUeXBlS2luZC5JRFJFRlMgOgotCQkJCQkJcmVzdWx0LmFwcGVuZCgiIElEUkVGUyAiKS5hcHBlbmQodmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBEVERCYXNpY1R5cGVLaW5kLkVOVElUWSA6Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCIgRU5USVRZICIpLmFwcGVuZCh2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIERUREJhc2ljVHlwZUtpbmQuRU5USVRJRVMgOgotCQkJCQkJcmVzdWx0LmFwcGVuZCgiIEVOVElUSUVTICIpLmFwcGVuZCh2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTiA6Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCIgTk1UT0tFTiAiKS5hcHBlbmQodmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU5TIDoKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIiBOTVRPS0VOUyAiKS5hcHBlbmQodmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChkdGRUeXBlIGluc3RhbmNlb2YgRFRERW51bWVyYXRpb25UeXBlKSB7Ci0JCQkJcmVzdWx0LmFwcGVuZCgiICIpLmFwcGVuZChidWlsZEVudW1TdHJpbmcoKERUREVudW1lcmF0aW9uVHlwZSkgZHRkVHlwZSkpLmFwcGVuZCh2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRFbnVtU3RyaW5nKERUREVudW1lcmF0aW9uVHlwZSBlbnVtVHlwZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCi0JCWlmIChlbnVtVHlwZS5nZXRLaW5kKCkuZ2V0VmFsdWUoKSA9PSBEVERFbnVtR3JvdXBLaW5kLk5PVEFUSU9OX0dST1VQKQotCQkJcmVzdWx0ICs9ICJOT1RBVElPTiAiOyAvLyROT04tTkxTLTEkCi0KLQotCQlJdGVyYXRvciBpID0gZW51bVR5cGUuZ2V0RW51bUxpdGVyYWxzKCkuaXRlcmF0b3IoKTsKLQkJaWYgKGkuaGFzTmV4dCgpKSB7Ci0JCQlyZXN1bHQgKz0gIigiICsgKChFRW51bUxpdGVyYWwpIGkubmV4dCgpKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlyZXN1bHQgKz0gIiB8ICIgKyAoKEVFbnVtTGl0ZXJhbCkgaS5uZXh0KCkpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJlc3VsdCArPSAiKSAiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIERUREVudW1lcmF0aW9uVHlwZSBjcmVhdGVEVERFbnVtZXJhdGlvbihTdHJpbmdbXSBlbnVtVmFsdWVzLCBpbnQgZW51bUtpbmQpIHsKLQkJRFRERW51bWVyYXRpb25UeXBlIGVudW1lcmF0aW9uID0gRFRERmFjdG9yeUltcGwuaW5zdGFuY2UoKS5jcmVhdGVEVERFbnVtZXJhdGlvblR5cGUoKTsKLQkJLy8gZW51bS5zZXRJRCgiRW51bV8iICsgKChEVERFbGVtZW50KWdldE1PRkRvbWFpbigpKS5nZXROYW1lKCkgKyAiXyIgKwotCQkvLyBnZXROYW1lKCkpOwotCQlEVERFbnVtR3JvdXBLaW5kIGdyb3VwS2luZCA9IERUREVudW1Hcm91cEtpbmQuZ2V0KGVudW1LaW5kKTsKLQkJZW51bWVyYXRpb24uc2V0S2luZChncm91cEtpbmQpOwotCQkvLyBFbnVtZXJhdGlvbiB2YWx1ZXMKLQkJaWYgKGVudW1WYWx1ZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtVmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRWNvcmVQYWNrYWdlIGVQYWNrYWdlID0gKEVjb3JlUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOwotCQkJCUVFbnVtTGl0ZXJhbCBlbnVtTGl0ZXJhbCA9ICgoRWNvcmVGYWN0b3J5KSBlUGFja2FnZS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZUVFbnVtTGl0ZXJhbCgpOwotCQkJCS8vIE1PRjJFTUYgUG9ydAotCQkJCS8vIGVudW1MaXRlcmFsLnJlZlNldExpdGVyYWwoZW51bVZhbHVlc1tpXSk7Ci0JCQkJZW51bUxpdGVyYWwuc2V0TmFtZShlbnVtVmFsdWVzW2ldKTsKLQkJCQkvLyBNT0YyRU1GIFBvcnQKLQkJCQkvLyBlbnVtTGl0ZXJhbC5yZWZTZXRMaXRlcmFsKGkpOwotCQkJCWVudW1MaXRlcmFsLnNldFZhbHVlKGkpOwotCi0JCQkJZW51bWVyYXRpb24uZ2V0RW51bUxpdGVyYWxzKCkuYWRkKGVudW1MaXRlcmFsKTsKLQkJCX0KLQkJfQotCQlnZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpLmdldERUREVudW1lcmF0aW9uVHlwZSgpLmFkZChlbnVtZXJhdGlvbik7Ci0JCXJldHVybiBlbnVtZXJhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhuYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQkJLy8gVE9ETzogZmluaXNoIHBvcnQKLQkJLy8gcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChnZXREVERFbGVtZW50KCkuZ2V0UGF0aG5hbWUoKSwKLQkJLy8gIkF0dHIiLCBnZXROYW1lKCksIC0xKTsKLQl9Ci0KLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXJldHVybiBudWxsOwotCQkvLyBUT0RPOiBmaW5pc2ggcG9ydAotCQkvKgotCQkgKiBPYmplY3RbXSByZXN1bHQgPSBEVERQYXRobmFtZVV0aWwucGFyc2VQYXRoQ29tcG9uZW50KHJlbGF0aXZlUGF0aCk7Ci0JCSAqIAotCQkgKiAKLQkJICogU3RyaW5nIHR5cGUgPSAoU3RyaW5nKXJlc3VsdFswXTsKLQkJICogCi0JCSAqIAotCQkgKiBpZiAodHlwZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJICogCi0JCSAqIAotCQkgKiBEVERPYmplY3Qgb2JqID0gbnVsbDsgaWYgKHR5cGUuZXF1YWxzKCJUeXBlIikpIHsgb2JqID0KLQkJICogZ2V0RGF0YVR5cGUoKTsgfSBlbHNlIHsgcmV0dXJuIG51bGw7IH0KLQkJICogCi0JCSAqIAotCQkgKiBTdHJpbmcgcmVzdFBhdGggPSAoU3RyaW5nKXJlc3VsdFszXTsKLQkJICogCi0JCSAqIGlmICgocmVzdFBhdGggPT0gbnVsbCkgfHwgKG9iaiA9PSBudWxsKSkgeyByZXR1cm4gb2JqOyB9IGVsc2UgewotCQkgKiByZXR1cm4gb2JqLmZpbmRPYmplY3QocmVzdFBhdGgpOyB9Ci0JCSAqLwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVudW1lcmF0ZWRWYWx1ZXMoKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0KLQkJRFREVHlwZSB0eXBlID0gZ2V0RFREVHlwZSgpOwotCQlpZiAodHlwZSBpbnN0YW5jZW9mIERUREVudW1lcmF0aW9uVHlwZSkgewotCQkJRFRERW51bWVyYXRpb25UeXBlIGVudW1UeXBlID0gKERUREVudW1lcmF0aW9uVHlwZSkgdHlwZTsKLQkJCUl0ZXJhdG9yIGkgPSBlbnVtVHlwZS5nZXRFbnVtTGl0ZXJhbHMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJcmVzdWx0LmFkZCgoKEVFbnVtTGl0ZXJhbCkgaS5uZXh0KCkpLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyB1Z2x5IGhhY2sgZm9yIG5vdyBzaW5jZSB3ZSBkb24ndCBoYXZlIG11bHRpcGxlIGluaGVyaXRhbmNlLgotCS8vIFdvdWxkIHJhdGhlciBoYXZlIGFsbCB0aGlzIHN0dWZmIGluIGEgYmFzZSBjbGFzcyBidXQgdGhlc2UKLQkvLyBjbGFzc2VzIGFyZSBpbmhlcml0aW5nIGZyb20gc29tZXRpbWVzIGRpZmZlcmVudCBtb2YgY2xhc3NlcwotCURURExleGljYWxJbmZvIGxleEluZm8gPSBuZXcgRFRETGV4aWNhbEluZm8oKTsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0U3RhcnRPZmZzZXQodik7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRFbmRPZmZzZXQodik7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tbWVudCgpIDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21tZW50KCkgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbW1lbnQgPSBDT01NRU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRLaW5kKCkgPGVtPkRlZmF1bHQgS2luZDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldERlZmF1bHRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERURERlZmF1bHRLaW5kIERFRkFVTFRfS0lORF9FREVGQVVMVCA9IERURERlZmF1bHRLaW5kLklNUExJRURfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRLaW5kKCkgPGVtPkRlZmF1bHQgS2luZDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldERlZmF1bHRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRERGVmYXVsdEtpbmQgZGVmYXVsdEtpbmQgPSBERUZBVUxUX0tJTkRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkgPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1ZBTFVFX1NUUklOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0VmFsdWVTdHJpbmcoKSA8ZW0+RGVmYXVsdCBWYWx1ZSBTdHJpbmc8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXREZWZhdWx0VmFsdWVTdHJpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZhbHVlU3RyaW5nID0gREVGQVVMVF9WQUxVRV9TVFJJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpIDxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRERW50aXR5IGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCkgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEVERFbnRpdHkgYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREQXR0cmlidXRlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIG5ld0NvbW1lbnQpIHsKLQkJU3RyaW5nIG9sZENvbW1lbnQgPSBjb21tZW50OwotCQljb21tZW50ID0gbmV3Q29tbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19DT01NRU5ULCBvbGRDb21tZW50LCBjb21tZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVEREZWZhdWx0S2luZCBnZXREZWZhdWx0S2luZCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRLaW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0S2luZChEVEREZWZhdWx0S2luZCBuZXdEZWZhdWx0S2luZCkgewotCQlEVEREZWZhdWx0S2luZCBvbGREZWZhdWx0S2luZCA9IGRlZmF1bHRLaW5kOwotCQlkZWZhdWx0S2luZCA9IG5ld0RlZmF1bHRLaW5kID09IG51bGwgPyBERUZBVUxUX0tJTkRfRURFRkFVTFQgOiBuZXdEZWZhdWx0S2luZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX0tJTkQsIG9sZERlZmF1bHRLaW5kLCBkZWZhdWx0S2luZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZVN0cmluZygpIHsKLQkJcmV0dXJuIGRlZmF1bHRWYWx1ZVN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlU3RyaW5nKFN0cmluZyBuZXdEZWZhdWx0VmFsdWVTdHJpbmcpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRWYWx1ZVN0cmluZyA9IGRlZmF1bHRWYWx1ZVN0cmluZzsKLQkJZGVmYXVsdFZhbHVlU3RyaW5nID0gbmV3RGVmYXVsdFZhbHVlU3RyaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfU1RSSU5HLCBvbGREZWZhdWx0VmFsdWVTdHJpbmcsIGRlZmF1bHRWYWx1ZVN0cmluZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCkgewotCQlpZiAoYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbCAmJiBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eS5lSXNQcm94eSgpKSB7Ci0JCQlEVERFbnRpdHkgb2xkQXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgPSBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eTsKLQkJCWF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5ID0gKERUREVudGl0eSkgRWNvcmVVdGlsLnJlc29sdmUoYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHksIHRoaXMpOwotCQkJaWYgKGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5ICE9IG9sZEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSwgb2xkQXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHksIGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGJhc2ljR2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5IG5ld0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURUREVudGl0eSBvbGRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSA9IGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5OwotCQlhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSA9IG5ld0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5ldyBOb3RpZmljYXRpb25DaGFpbkltcGwoNCk7Ci0JCQltc2dzLmFkZChuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSwgb2xkQXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHksIG5ld0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KSk7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSBuZXdBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSkgewotCQlpZiAobmV3QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgIT0gYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KG5ld0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSwgbmV3QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHksIG5ld0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbnRpdHkgZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKSB7Ci0JCWlmIChhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSAhPSBudWxsICYmIGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5LmVJc1Byb3h5KCkpIHsKLQkJCURUREVudGl0eSBvbGRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSA9IGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5OwotCQkJYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgPSAoRFRERW50aXR5KSBFY29yZVV0aWwucmVzb2x2ZShhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSwgdGhpcyk7Ci0JCQlpZiAoYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgIT0gb2xkQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRURfRU5USVRZLCBvbGRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSwgYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbnRpdHkgYmFzaWNHZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkgbmV3QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRFRERW50aXR5IG9sZEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5ID0gYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHk7Ci0JCWF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5ID0gbmV3QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbmV3IE5vdGlmaWNhdGlvbkNoYWluSW1wbCg0KTsKLQkJCW1zZ3MuYWRkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRURfRU5USVRZLCBvbGRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSwgbmV3QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkpKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5IG5ld0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KSB7Ci0JCWlmIChuZXdBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSAhPSBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkpLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkobmV3QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRURfRU5USVRZLCBuZXdBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSwgbmV3QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVsZW1lbnQgZ2V0RFRERWxlbWVudCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQoKSAhPSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRFRERWxlbWVudCkgZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RFRERWxlbWVudChEVERFbGVtZW50IG5ld0RUREVsZW1lbnQpIHsKLQkJaWYgKG5ld0RUREVsZW1lbnQgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpICE9IERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQgJiYgbmV3RFRERWxlbWVudCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0RUREVsZW1lbnQpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdEVERFbGVtZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERFbGVtZW50KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfQVRUUklCVVRFLCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3RFRERWxlbWVudCwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQsIG5ld0RUREVsZW1lbnQsIG5ld0RUREVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQkJaWYgKGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCQkJcmV0dXJuIGJhc2ljU2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKERUREVudGl0eSkgb3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJCWlmIChhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSAhPSBudWxsKQotCQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FQU5OT1RBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJCXJldHVybiBiYXNpY1NldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJCXJldHVybiBiYXNpY1NldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQoKSA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQoKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUsIERUREVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQoKSwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FQU5OT1RBVElPTlMgOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VUWVBFIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldEVUeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RVR5cGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19DSEFOR0VBQkxFIDoKLQkJCQlyZXR1cm4gaXNDaGFuZ2VhYmxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1ZPTEFUSUxFIDoKLQkJCQlyZXR1cm4gaXNWb2xhdGlsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19UUkFOU0lFTlQgOgotCQkJCXJldHVybiBpc1RyYW5zaWVudCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VTklRVUUgOgotCQkJCXJldHVybiBpc1VuaXF1ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUwgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWVMaXRlcmFsKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRSA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0xPV0VSX0JPVU5EIDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0TG93ZXJCb3VuZCgpKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VUFBFUl9CT1VORCA6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFVwcGVyQm91bmQoKSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fTUFOWSA6Ci0JCQkJcmV0dXJuIGlzTWFueSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19SRVFVSVJFRCA6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRUNPTlRBSU5JTkdfQ0xBU1MgOgotCQkJCXJldHVybiBnZXRFQ29udGFpbmluZ0NsYXNzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVU5TRVRUQUJMRSA6Ci0JCQkJcmV0dXJuIGlzVW5zZXR0YWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19JRCA6Ci0JCQkJcmV0dXJuIGlzSUQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRUFUVFJJQlVURV9UWVBFIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldEVBdHRyaWJ1dGVUeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RUF0dHJpYnV0ZVR5cGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19DT01NRU5UIDoKLQkJCQlyZXR1cm4gZ2V0Q29tbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfS0lORCA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRLaW5kKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9TVFJJTkcgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWVTdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJaWYgKHJlc29sdmUpCi0JCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpOwotCQkJCXJldHVybiBiYXNpY0dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RFRERWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRUFOTk9UQVRJT05TIDoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19OQU1FIDoKLQkJCQlzZXROYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRVRZUEUgOgotCQkJCXNldEVUeXBlKChFQ2xhc3NpZmllcikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19DSEFOR0VBQkxFIDoKLQkJCQlzZXRDaGFuZ2VhYmxlKCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVk9MQVRJTEUgOgotCQkJCXNldFZvbGF0aWxlKCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVFJBTlNJRU5UIDoKLQkJCQlzZXRUcmFuc2llbnQoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VTklRVUUgOgotCQkJCXNldFVuaXF1ZSgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfTElURVJBTCA6Ci0JCQkJc2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0xPV0VSX0JPVU5EIDoKLQkJCQlzZXRMb3dlckJvdW5kKCgoSW50ZWdlcikgbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VUFBFUl9CT1VORCA6Ci0JCQkJc2V0VXBwZXJCb3VuZCgoKEludGVnZXIpIG5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVU5TRVRUQUJMRSA6Ci0JCQkJc2V0VW5zZXR0YWJsZSgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0lEIDoKLQkJCQlzZXRJRCgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX0tJTkQgOgotCQkJCXNldERlZmF1bHRLaW5kKChEVEREZWZhdWx0S2luZCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX1NUUklORyA6Ci0JCQkJc2V0RGVmYXVsdFZhbHVlU3RyaW5nKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCXNldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCXNldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQgOgotCQkJCXNldERUREVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FQU5OT1RBVElPTlMgOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX05BTUUgOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VUWVBFIDoKLQkJCQlzZXRFVHlwZSgoRUNsYXNzaWZpZXIpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19DSEFOR0VBQkxFIDoKLQkJCQlzZXRDaGFuZ2VhYmxlKENIQU5HRUFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19WT0xBVElMRSA6Ci0JCQkJc2V0Vm9sYXRpbGUoVk9MQVRJTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19UUkFOU0lFTlQgOgotCQkJCXNldFRyYW5zaWVudChUUkFOU0lFTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VTklRVUUgOgotCQkJCXNldFVuaXF1ZShVTklRVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUwgOgotCQkJCXNldERlZmF1bHRWYWx1ZUxpdGVyYWwoREVGQVVMVF9WQUxVRV9MSVRFUkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fTE9XRVJfQk9VTkQgOgotCQkJCXNldExvd2VyQm91bmQoTE9XRVJfQk9VTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VUFBFUl9CT1VORCA6Ci0JCQkJc2V0VXBwZXJCb3VuZChVUFBFUl9CT1VORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1VOU0VUVEFCTEUgOgotCQkJCXNldFVuc2V0dGFibGUoVU5TRVRUQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0lEIDoKLQkJCQlzZXRJRChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoQ09NTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfS0lORCA6Ci0JCQkJc2V0RGVmYXVsdEtpbmQoREVGQVVMVF9LSU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9TVFJJTkcgOgotCQkJCXNldERlZmF1bHRWYWx1ZVN0cmluZyhERUZBVUxUX1ZBTFVFX1NUUklOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlzZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgoRFRERW50aXR5KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCXNldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCA6Ci0JCQkJc2V0RFRERWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFnZXRFQW5ub3RhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fTkFNRSA6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FVFlQRSA6Ci0JCQkJcmV0dXJuIGVUeXBlICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQ0hBTkdFQUJMRSA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQ0hBTkdFQUJMRV9FRkxBRykgIT0gMCkgIT0gQ0hBTkdFQUJMRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19WT0xBVElMRSA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVk9MQVRJTEVfRUZMQUcpICE9IDApICE9IFZPTEFUSUxFX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1RSQU5TSUVOVCA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVFJBTlNJRU5UX0VGTEFHKSAhPSAwKSAhPSBUUkFOU0lFTlRfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVU5JUVVFIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBVTklRVUVfRUZMQUcpICE9IDApICE9IFVOSVFVRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUwgOgotCQkJCXJldHVybiBERUZBVUxUX1ZBTFVFX0xJVEVSQUxfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRWYWx1ZUxpdGVyYWwgIT0gbnVsbCA6ICFERUZBVUxUX1ZBTFVFX0xJVEVSQUxfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRWYWx1ZUxpdGVyYWwpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0xPV0VSX0JPVU5EIDoKLQkJCQlyZXR1cm4gbG93ZXJCb3VuZCAhPSBMT1dFUl9CT1VORF9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VUFBFUl9CT1VORCA6Ci0JCQkJcmV0dXJuIHVwcGVyQm91bmQgIT0gVVBQRVJfQk9VTkRfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fTUFOWSA6Ci0JCQkJcmV0dXJuIGlzTWFueSgpICE9IGZhbHNlOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1JFUVVJUkVEIDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpICE9IGZhbHNlOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VDT05UQUlOSU5HX0NMQVNTIDoKLQkJCQlyZXR1cm4gZ2V0RUNvbnRhaW5pbmdDbGFzcygpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVU5TRVRUQUJMRSA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVU5TRVRUQUJMRV9FRkxBRykgIT0gMCkgIT0gVU5TRVRUQUJMRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19JRCA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgSURfRUZMQUcpICE9IDApICE9IElEX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VBVFRSSUJVVEVfVFlQRSA6Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RUF0dHJpYnV0ZVR5cGUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0NPTU1FTlQgOgotCQkJCXJldHVybiBDT01NRU5UX0VERUZBVUxUID09IG51bGwgPyBjb21tZW50ICE9IG51bGwgOiAhQ09NTUVOVF9FREVGQVVMVC5lcXVhbHMoY29tbWVudCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9LSU5EIDoKLQkJCQlyZXR1cm4gZGVmYXVsdEtpbmQgIT0gREVGQVVMVF9LSU5EX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfU1RSSU5HIDoKLQkJCQlyZXR1cm4gREVGQVVMVF9WQUxVRV9TVFJJTkdfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRWYWx1ZVN0cmluZyAhPSBudWxsIDogIURFRkFVTFRfVkFMVUVfU1RSSU5HX0VERUZBVUxULmVxdWFscyhkZWZhdWx0VmFsdWVTdHJpbmcpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlyZXR1cm4gYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5ICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXREVERFbGVtZW50KCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29tbWVudDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjb21tZW50KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0S2luZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0S2luZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdFZhbHVlU3RyaW5nOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGRlZmF1bHRWYWx1ZVN0cmluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBEVERBdHRyaWJ1dGVJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQmFzaWNUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREJhc2ljVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UyODliNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQmFzaWNUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREVHlwZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CYXNpYyBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREJhc2ljVHlwZUltcGwjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERCYXNpY1R5cGVJbXBsIGV4dGVuZHMgRUNsYXNzSW1wbCBpbXBsZW1lbnRzIERUREJhc2ljVHlwZSwgRUNsYXNzIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIGJhc2ljVHlwZVN0cmluZ3NbXSA9IHtEVERUeXBlLk5PTkUsIERURFR5cGUuQ0RBVEEsIERURFR5cGUuSUQsIERURFR5cGUuSURSRUYsIERURFR5cGUuSURSRUZTLCBEVERUeXBlLkVOVElUWSwgRFREVHlwZS5FTlRJVElFUywgRFREVHlwZS5OTVRPS0VOLCBEVERUeXBlLk5NVE9LRU5TfTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIGJhc2ljVHlwZURlc2NyaXB0aW9uc1tdID0ge0RURENvcmVNZXNzYWdlcy5fVUlfTk9ORV9ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX0NIQVJBQ1RFUl9EQVRBX0RFU0MsIERURENvcmVNZXNzYWdlcy5fVUlfSURFTlRJRklFUl9ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX0lEX1JFRkVSRU5DRV9ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX0lEX1JFRkVSRU5DRVNfREVTQywgRFREQ29yZU1lc3NhZ2VzLl9VSV9FTlRJVFlfTkFNRV9ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVElUWV9OQU1FU19ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX05BTUVfVE9LRU5fREVTQywgRFREQ29yZU1lc3NhZ2VzLl9VSV9OQU1FX1RPS0VOU19ERVNDfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkIC8vJE5PTi1OTFMtOSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IGJhc2ljVHlwZUtpbmRzW10gPSB7RFREQmFzaWNUeXBlS2luZC5OT05FLCBEVERCYXNpY1R5cGVLaW5kLkNEQVRBLCBEVERCYXNpY1R5cGVLaW5kLklELCBEVERCYXNpY1R5cGVLaW5kLklEUkVGLCBEVERCYXNpY1R5cGVLaW5kLklEUkVGUywgRFREQmFzaWNUeXBlS2luZC5FTlRJVFksIERUREJhc2ljVHlwZUtpbmQuRU5USVRJRVMsIERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTiwgRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOU307Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2UoKSB7Ci0JCXJldHVybiBnZXRUeXBlU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKCkgewotCQlpbnQga2luZCA9IGdldEtpbmQoKS5nZXRWYWx1ZSgpOwotCQlpZiAoa2luZCA+PSAwICYmIGtpbmQgPCBiYXNpY1R5cGVTdHJpbmdzLmxlbmd0aCkgewotCQkJcmV0dXJuIGJhc2ljVHlwZVN0cmluZ3Nba2luZF07Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGdldFR5cGVEZXNjcmlwdGlvbihnZXRLaW5kKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlRGVzY3JpcHRpb24oaW50IHR5cGVLaW5kKSB7Ci0JCWlmICh0eXBlS2luZCA+PSAwICYmIHR5cGVLaW5kIDwgYmFzaWNUeXBlRGVzY3JpcHRpb25zLmxlbmd0aCkgewotCQkJcmV0dXJuIGJhc2ljVHlwZURlc2NyaXB0aW9uc1t0eXBlS2luZF07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJLy8gVEJECi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2luZCgpIDxlbT5LaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIEtJTkRfRURFRkFVTFQgPSBEVERCYXNpY1R5cGVLaW5kLk5PTkVfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtpbmQoKSA8ZW0+S2luZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGVLaW5kIGtpbmQgPSBLSU5EX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREJhc2ljVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREQmFzaWNUeXBlS2luZCBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2luZChEVERCYXNpY1R5cGVLaW5kIG5ld0tpbmQpIHsKLQkJRFREQmFzaWNUeXBlS2luZCBvbGRLaW5kID0ga2luZDsKLQkJa2luZCA9IG5ld0tpbmQgPT0gbnVsbCA/IEtJTkRfRURFRkFVTFQgOiBuZXdLaW5kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19LSU5ELCBvbGRLaW5kLCBraW5kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUEFDS0FHRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FT1BFUkFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVPcGVyYXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUEFDS0FHRSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVBBQ0tBR0UsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRU9QRVJBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFT3BlcmF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUkVGRVJFTkNFUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVSZWZlcmVuY2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBVFRSSUJVVEVTIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUF0dHJpYnV0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKCkpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FQ0xBU1NJRklFUlMsIEVQYWNrYWdlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlEKCksIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2VDbGFzc05hbWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVBBQ0tBR0UgOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19BQlNUUkFDVCA6Ci0JCQkJcmV0dXJuIGlzQWJzdHJhY3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOVEVSRkFDRSA6Ci0JCQkJcmV0dXJuIGlzSW50ZXJmYWNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FU1VQRVJfVFlQRVMgOgotCQkJCXJldHVybiBnZXRFU3VwZXJUeXBlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FT1BFUkFUSU9OUyA6Ci0JCQkJcmV0dXJuIGdldEVPcGVyYXRpb25zKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfUkVGRVJFTkNFUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VSRUZFUkVOQ0VTIDoKLQkJCQlyZXR1cm4gZ2V0RVJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFUVFJJQlVURVMgOgotCQkJCXJldHVybiBnZXRFQXR0cmlidXRlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX0NPTlRBSU5NRU5UUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxDb250YWlubWVudHMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9PUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX1NVUEVSX1RZUEVTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbFN1cGVyVHlwZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUlEX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGdldEVJREF0dHJpYnV0ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19LSU5EIDoKLQkJCQlyZXR1cm4gZ2V0S2luZCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX05BTUUgOgotCQkJCXNldE5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzc05hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXNldEluc3RhbmNlQ2xhc3MoKENsYXNzKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19BQlNUUkFDVCA6Ci0JCQkJc2V0QWJzdHJhY3QoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5URVJGQUNFIDoKLQkJCQlzZXRJbnRlcmZhY2UoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVNVUEVSX1RZUEVTIDoKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RVN1cGVyVHlwZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VPUEVSQVRJT05TIDoKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RU9wZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VSRUZFUkVOQ0VTIDoKLQkJCQlnZXRFUmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RVJlZmVyZW5jZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBVFRSSUJVVEVTIDoKLQkJCQlnZXRFQXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUF0dHJpYnV0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0tJTkQgOgotCQkJCXNldEtpbmQoKERUREJhc2ljVHlwZUtpbmQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fTkFNRSA6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXNldEluc3RhbmNlQ2xhc3NOYW1lKElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXNldEluc3RhbmNlQ2xhc3MoSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fQUJTVFJBQ1QgOgotCQkJCXNldEFic3RyYWN0KEFCU1RSQUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOVEVSRkFDRSA6Ci0JCQkJc2V0SW50ZXJmYWNlKElOVEVSRkFDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FU1VQRVJfVFlQRVMgOgotCQkJCWdldEVTdXBlclR5cGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VPUEVSQVRJT05TIDoKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUkVGRVJFTkNFUyA6Ci0JCQkJZ2V0RVJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFUVFJJQlVURVMgOgotCQkJCWdldEVBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0tJTkQgOgotCQkJCXNldEtpbmQoS0lORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZ2V0RUFubm90YXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19OQU1FIDoKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gaW5zdGFuY2VDbGFzc05hbWUgIT0gbnVsbCA6ICFJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxULmVxdWFscyhpbnN0YW5jZUNsYXNzTmFtZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGluc3RhbmNlQ2xhc3MgIT0gbnVsbCA6ICFJTlNUQU5DRV9DTEFTU19FREVGQVVMVC5lcXVhbHMoaW5zdGFuY2VDbGFzcyk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUEFDS0FHRSA6Ci0JCQkJcmV0dXJuIGdldEVQYWNrYWdlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fQUJTVFJBQ1QgOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEFCU1RSQUNUX0VGTEFHKSAhPSAwKSAhPSBBQlNUUkFDVF9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5URVJGQUNFIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBJTlRFUkZBQ0VfRUZMQUcpICE9IDApICE9IElOVEVSRkFDRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVNVUEVSX1RZUEVTIDoKLQkJCQlyZXR1cm4gZVN1cGVyVHlwZXMgIT0gbnVsbCAmJiAhZ2V0RVN1cGVyVHlwZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VPUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gZU9wZXJhdGlvbnMgIT0gbnVsbCAmJiAhZ2V0RU9wZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsQXR0cmlidXRlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9SRUZFUkVOQ0VTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxSZWZlcmVuY2VzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUkVGRVJFTkNFUyA6Ci0JCQkJcmV0dXJuIGVSZWZlcmVuY2VzICE9IG51bGwgJiYgIWdldEVSZWZlcmVuY2VzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuIGVBdHRyaWJ1dGVzICE9IG51bGwgJiYgIWdldEVBdHRyaWJ1dGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX0NPTlRBSU5NRU5UUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsQ29udGFpbm1lbnRzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX09QRVJBVElPTlMgOgotCQkJCXJldHVybiAhZ2V0RUFsbE9wZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX1NVUEVSX1RZUEVTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxTdXBlclR5cGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FSURfQVRUUklCVVRFIDoKLQkJCQlyZXR1cm4gZ2V0RUlEQXR0cmlidXRlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fS0lORCA6Ci0JCQkJcmV0dXJuIGtpbmQgIT0gS0lORF9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoa2luZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChraW5kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIERUREJhc2ljVHlwZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURENvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMTg1ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURENvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTmFtZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIERURENvbnRlbnRJbXBsIGV4dGVuZHMgRU5hbWVkRWxlbWVudEltcGwgaW1wbGVtZW50cyBEVERDb250ZW50LCBFT2JqZWN0IHsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFREQ29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREQ29udGVudCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBnZXREVERGaWxlKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpICE9IERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRFRERmlsZSkgZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RFRERmlsZShEVERGaWxlIG5ld0RUREZpbGUpIHsKLQkJaWYgKG5ld0RUREZpbGUgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpICE9IERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFICYmIG5ld0RUREZpbGUgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdEVERGaWxlKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpICsgIi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3RFRERmlsZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3RFRERmlsZSkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERGaWxlLCBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFLCBuZXdEVERGaWxlLCBuZXdEVERGaWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQoKSA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQoKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCgpLCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSA6Ci0JCQkJcmV0dXJuIGdldERUREZpbGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSA6Ci0JCQkJcmV0dXJuIGdldERUREZpbGUoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy8gRFREQ29udGVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50Q29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50Q29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlNzY3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERWxlbWVudENvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURExleGljYWxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUGF0aG5hbWVVdGlsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbGVtZW50Q29udGVudEltcGwjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVsZW1lbnRDb250ZW50SW1wbCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERUREVsZW1lbnRDb250ZW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRFRERWxlbWVudENvbnRlbnQgewotCi0JcHVibGljIERUREVsZW1lbnRDb250ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRFRERWxlbWVudCBnZXREVERFbGVtZW50KCkgewotCQlEVERFbGVtZW50Q29udGVudCBjID0gZ2V0RFRER3JvdXBDb250ZW50KCk7Ci0JCWlmIChjICE9IG51bGwpCi0JCQlyZXR1cm4gYy5nZXRFbGVtZW50KCk7Ci0JCWVsc2UKLQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JfQotCi0JLy8gZ2V0IHRoZSBtb3N0IG91dGVyIERUREdyb3VwQ29udGVudAotCXB1YmxpYyBEVERHcm91cENvbnRlbnQgZ2V0RFRER3JvdXBDb250ZW50KCkgewotCQlEVERFbGVtZW50Q29udGVudCBjID0gdGhpczsKLQkJd2hpbGUgKGMuZ2V0R3JvdXAoKSAhPSBudWxsKSB7Ci0JCQljID0gYy5nZXRHcm91cCgpOwotCQl9Ci0JCXJldHVybiAoKGMgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpID8gKERUREdyb3VwQ29udGVudCkgYyA6IG51bGwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7Ci0JCWludCBjbnQgPSAwOwotCQlEVERPYmplY3QgcGFyZW50ID0gZ2V0R3JvdXAoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlwYXJlbnQgPSBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlEVERHcm91cENvbnRlbnQgZ3JvdXAgPSAoRFRER3JvdXBDb250ZW50KSBwYXJlbnQ7Ci0JCQlJdGVyYXRvciBpID0gZ3JvdXAuZ2V0Q29udGVudCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlEVERFbGVtZW50Q29udGVudCBjb250ZW50ID0gKERUREVsZW1lbnRDb250ZW50KSBpLm5leHQoKTsKLQkJCQlpZiAoY29udGVudCA9PSB0aGlzKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgfHwgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJY250Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aCgoKHBhcmVudCA9PSBudWxsKSA/ICJOVUxMX1BBUkVOVCIgOiBwYXJlbnQuZ2V0UGF0aG5hbWUoKSksICJDb250ZW50IiwgbnVsbCwgY250KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaXJzdEVsZW1lbnRDb250ZW50KCkgewotCQlEVERFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0KLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJLy8gVGhpcyBtZWFucyB0aGlzIGlzIHRoZSBvbmx5IGVsZW1lbnQgY29udGVudCBpbiB0aGUgZWxlbWVudAotCQkJcmV0dXJuIHRydWU7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0KLQkJRFRER3JvdXBDb250ZW50IGdyb3VwID0gZ2V0R3JvdXAoKTsKLQkJaW50IHBvcyA9IGdyb3VwLmdldENvbnRlbnRQb3NpdGlvbih0aGlzKTsKLQkJaWYgKHBvcyA9PSAwKSB7Ci0JCQkvLyBub3cgcmVjdXJzZSBhbmQgZW5zdXJlIHRoaXMgZ3JvdXAgaXMgdGhlIGZpcnN0IGdyb3VwCi0JCQlyZXR1cm4gZ3JvdXAuaXNGaXJzdEVsZW1lbnRDb250ZW50KCk7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JCWVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50RGV0YWlsKCkgewotCQkvLyBtb3N0IHRpbWVzLCBjb250ZW50IG5hbWUgaXMgZmluZS4gSG93ZXZlciBmb3IgZ3JvdXBzLAotCQkvLyB3ZSBkaWRuJ3Qgd2FudCBhIGxvbmcgbmFtZSB0byBzaG93IHVwIGluIHRoZSB0cmVlLAotCQkvLyBzbyB3ZSBjcmVhdGVkIGEgZ2V0IGNvbnRlbnRkZXRhaWwgdG8gZ2V0IHRvIHRoZSBsb25nCi0JCS8vIG5hbWUgKGdldENvbnRlbnROYW1lIHdpbGwgZ2V0IHRoZSBzaG9ydCBvbmUuCi0JCXJldHVybiBnZXRDb250ZW50TmFtZSgpOwotCX0KLQotCS8vIHVnbHkgaGFjayBmb3Igbm93IHNpbmNlIHdlIGRvbid0IGhhdmUgbXVsdGlwbGUgaW5oZXJpdGFuY2UuCi0JLy8gV291bGQgcmF0aGVyIGhhdmUgYWxsIHRoaXMgc3R1ZmYgaW4gYSBiYXNlIGNsYXNzIGJ1dCB0aGVzZQotCS8vIGNsYXNzZXMgYXJlIGluaGVyaXRpbmcgZnJvbSBzb21ldGltZXMgZGlmZmVyZW50IG1vZiBjbGFzc2VzCi0JRFRETGV4aWNhbEluZm8gbGV4SW5mbyA9IG5ldyBEVERMZXhpY2FsSW5mbygpOwotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0U3RhcnRPZmZzZXQodik7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldEVuZE9mZnNldCh2KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRFRERWxlbWVudENvbnRlbnQjZ2V0Q29udGVudE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVsZW1lbnRDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERHcm91cENvbnRlbnQgZ2V0R3JvdXAoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgIT0gRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKERUREdyb3VwQ29udGVudCkgZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R3JvdXAoRFRER3JvdXBDb250ZW50IG5ld0dyb3VwKSB7Ci0JCWlmIChuZXdHcm91cCAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEKCkgIT0gRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCAmJiBuZXdHcm91cCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0dyb3VwKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpICsgIi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3R3JvdXAgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0dyb3VwKS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERHcm91cENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdHcm91cCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAsIG5ld0dyb3VwLCBuZXdHcm91cCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpICE9IERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKERUREVsZW1lbnQpIGVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRFRERWxlbWVudCBuZXdFbGVtZW50KSB7Ci0JCWlmIChuZXdFbGVtZW50ICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQoKSAhPSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgJiYgbmV3RWxlbWVudCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0VsZW1lbnQpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdFbGVtZW50KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3RWxlbWVudCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5ULCBuZXdFbGVtZW50LCBuZXdFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIERUREVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQoKSwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvLyBEVERFbGVtZW50Q29udGVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZjBiOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25DaGFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERMZXhpY2FsSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFBhdGhuYW1lVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREVmlzaXRvcjsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREVsZW1lbnRJbXBsIGV4dGVuZHMgRUNsYXNzSW1wbCBpbXBsZW1lbnRzIERUREVsZW1lbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21tZW50KCkgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCXB1YmxpYyBEVERFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbGVtZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRFREQXR0cmlidXRlKERUREF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJZ2V0RFREQXR0cmlidXRlKCkuYWRkKGF0dHJpYnV0ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChudWxsLCAiRWxlbSIsIGdldE5hbWUoKSwgLTEpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJT2JqZWN0W10gcmVzdWx0ID0gRFREUGF0aG5hbWVVdGlsLnBhcnNlUGF0aENvbXBvbmVudChyZWxhdGl2ZVBhdGgpOwotCi0JCVN0cmluZyB0eXBlID0gKFN0cmluZykgcmVzdWx0WzBdOwotCi0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlEVERPYmplY3Qgb2JqID0gbnVsbDsKLQkJaWYgKHR5cGUuZXF1YWxzKCJBdHRyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gVE9ETzogZml4IHBvcnQKLQkJCS8vIG9iaiA9IGZpbmRBdHRyaWJ1dGUobmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAoKHR5cGUuZXF1YWxzKCJDb250ZW50IikpIHx8ICh0eXBlLmVxdWFscygiRWxlbVJlZiIpKSB8fCAodHlwZS5lcXVhbHMoIkVudFJlZiIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJb2JqID0gZ2V0Q29udGVudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgcmVzdFBhdGggPSAoU3RyaW5nKSByZXN1bHRbM107Ci0KLQkJaWYgKChyZXN0UGF0aCA9PSBudWxsKSB8fCAob2JqID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gb2JqOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG9iai5maW5kT2JqZWN0KHJlc3RQYXRoKTsKLQkJfQotCX0KLQotCS8vIHJldHVybnMgYWxsIHJlZmVyZW5jZXMgaW4gdGhlIHNhbWUgRFRERmlsZSB0aGF0IHJlZmVyZW5jZSB0aGlzIGVsZW1lbnQKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZWZlcmVuY2VzKCkgewotCQlEVERGaWxlIGZpbGUgPSBnZXREVERGaWxlKCk7Ci0JCWZpbmFsIENvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCURURFZpc2l0b3IgdmlzaXRSZWZzID0gbmV3IERURFZpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VDb250ZW50LmdldFJlZmVyZW5jZWRFbGVtZW50KCkgPT0gRFRERWxlbWVudEltcGwudGhpcykgewotCQkJCQlyZXN1bHQuYWRkKGVsZW1lbnRSZWZlcmVuY2VDb250ZW50KTsKLQkJCQl9IC8vIGVuZCBvZiBpZiAoKQotCQkJfQotCQl9OwotCQl2aXNpdFJlZnMudmlzaXREVERGaWxlKGZpbGUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlRGV0YWlsKCkgewotCQlTdHJpbmcgYXR0cmlidXRlU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdGlvbiBhdHRyaWJ1dGVzID0gZ2V0RFREQXR0cmlidXRlKCk7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gc2Vlbk9uZSA9IGZhbHNlOwotCQkJZm9yIChqYXZhLnV0aWwuSXRlcmF0b3IgaSA9IGF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKHNlZW5PbmUpIHsKLQkJCQkJYXR0cmlidXRlU3RyaW5nID0gYXR0cmlidXRlU3RyaW5nICsgIiwgIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2Vlbk9uZSA9IHRydWU7Ci0JCQkJfSAvLyBlbmQgb2YgZWxzZQotCi0JCQkJYXR0cmlidXRlU3RyaW5nID0gYXR0cmlidXRlU3RyaW5nICsgKChEVERBdHRyaWJ1dGUpIGkubmV4dCgpKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JCXJldHVybiBhdHRyaWJ1dGVTdHJpbmc7Ci0JfQotCi0KLQkvLyB1Z2x5IGhhY2sgZm9yIG5vdyBzaW5jZSB3ZSBkb24ndCBoYXZlIG11bHRpcGxlIGluaGVyaXRhbmNlLgotCS8vIFdvdWxkIHJhdGhlciBoYXZlIGFsbCB0aGlzIHN0dWZmIGluIGEgYmFzZSBjbGFzcyBidXQgdGhlc2UKLQkvLyBjbGFzc2VzIGFyZSBpbmhlcml0aW5nIGZyb20gc29tZXRpbWVzIGRpZmZlcmVudCBtb2YgY2xhc3NlcwotCURURExleGljYWxJbmZvIGxleEluZm8gPSBuZXcgRFRETGV4aWNhbEluZm8oKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbW1lbnQgPSBDT01NRU5UX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBEVERFbGVtZW50Q29udGVudCBjb250ZW50ID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZHRkQXR0cmlidXRlID0gbnVsbDsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldFN0YXJ0T2Zmc2V0KHYpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRFbmRPZmZzZXQodik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIG5ld0NvbW1lbnQpIHsKLQkJU3RyaW5nIG9sZENvbW1lbnQgPSBjb21tZW50OwotCQljb21tZW50ID0gbmV3Q29tbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09NTUVOVCwgb2xkQ29tbWVudCwgY29tbWVudCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIERUREVsZW1lbnRDb250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb250ZW50KERUREVsZW1lbnRDb250ZW50IG5ld0NvbnRlbnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRFRERWxlbWVudENvbnRlbnQgb2xkQ29udGVudCA9IGNvbnRlbnQ7Ci0JCWNvbnRlbnQgPSBuZXdDb250ZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5ldyBOb3RpZmljYXRpb25DaGFpbkltcGwoNCk7Ci0JCQltc2dzLmFkZChuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgb2xkQ29udGVudCwgbmV3Q29udGVudCkpOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoRFRERWxlbWVudENvbnRlbnQgbmV3Q29udGVudCkgewotCQlpZiAobmV3Q29udGVudCAhPSBjb250ZW50KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBjb250ZW50KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQsIERUREVsZW1lbnRDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdDb250ZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdDb250ZW50KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQsIERUREVsZW1lbnRDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbnRlbnQobmV3Q29udGVudCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIG5ld0NvbnRlbnQsIG5ld0NvbnRlbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREVERBdHRyaWJ1dGUoKSB7Ci0JCWlmIChkdGRBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJZHRkQXR0cmlidXRlID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoRFREQXR0cmlidXRlLmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfQVRUUklCVVRFLCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UKTsKLQkJfQotCQlyZXR1cm4gZHRkQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUEFDS0FHRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVBBQ0tBR0UsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRU9QRVJBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFT3BlcmF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCA6Ci0JCQkJCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGNvbnRlbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBudWxsLCBtc2dzKTsKLQkJCQkJcmV0dXJuIGJhc2ljU2V0Q29udGVudCgoRFRERWxlbWVudENvbnRlbnQpIG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXREVERBdHRyaWJ1dGUoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFOTk9UQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VQQUNLQUdFIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUEFDS0FHRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FT1BFUkFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVPcGVyYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VSRUZFUkVOQ0VTIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RVJlZmVyZW5jZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFUVFJJQlVURVMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQXR0cmlidXRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCA6Ci0JCQkJCXJldHVybiBiYXNpY1NldENvbnRlbnQobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfQVRUUklCVVRFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RFREQXR0cmlidXRlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUEFDS0FHRSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fRUNMQVNTSUZJRVJTLCBFUGFja2FnZS5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5ULCBEVERGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlEKCksIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2VDbGFzc05hbWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVBBQ0tBR0UgOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19BQlNUUkFDVCA6Ci0JCQkJcmV0dXJuIGlzQWJzdHJhY3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOVEVSRkFDRSA6Ci0JCQkJcmV0dXJuIGlzSW50ZXJmYWNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FU1VQRVJfVFlQRVMgOgotCQkJCXJldHVybiBnZXRFU3VwZXJUeXBlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FT1BFUkFUSU9OUyA6Ci0JCQkJcmV0dXJuIGdldEVPcGVyYXRpb25zKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfUkVGRVJFTkNFUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VSRUZFUkVOQ0VTIDoKLQkJCQlyZXR1cm4gZ2V0RVJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFUVFJJQlVURVMgOgotCQkJCXJldHVybiBnZXRFQXR0cmlidXRlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX0NPTlRBSU5NRU5UUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxDb250YWlubWVudHMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9PUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX1NVUEVSX1RZUEVTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbFN1cGVyVHlwZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUlEX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGdldEVJREF0dHJpYnV0ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSA6Ci0JCQkJcmV0dXJuIGdldERUREZpbGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIGdldENvbW1lbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGdldERUREF0dHJpYnV0ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFOTk9UQVRJT05TIDoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWdldEVBbm5vdGF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fTkFNRSA6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJcmV0dXJuIElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGluc3RhbmNlQ2xhc3NOYW1lICE9IG51bGwgOiAhSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVC5lcXVhbHMoaW5zdGFuY2VDbGFzc05hbWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJcmV0dXJuIElOU1RBTkNFX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBpbnN0YW5jZUNsYXNzICE9IG51bGwgOiAhSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGluc3RhbmNlQ2xhc3MpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19ERUZBVUxUX1ZBTFVFIDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVBBQ0tBR0UgOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0FCU1RSQUNUIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBBQlNUUkFDVF9FRkxBRykgIT0gMCkgIT0gQUJTVFJBQ1RfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOVEVSRkFDRSA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgSU5URVJGQUNFX0VGTEFHKSAhPSAwKSAhPSBJTlRFUkZBQ0VfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VTVVBFUl9UWVBFUyA6Ci0JCQkJcmV0dXJuIGVTdXBlclR5cGVzICE9IG51bGwgJiYgIWdldEVTdXBlclR5cGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FT1BFUkFUSU9OUyA6Ci0JCQkJcmV0dXJuIGVPcGVyYXRpb25zICE9IG51bGwgJiYgIWdldEVPcGVyYXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX0FUVFJJQlVURVMgOgotCQkJCXJldHVybiAhZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfUkVGRVJFTkNFUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsUmVmZXJlbmNlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVJFRkVSRU5DRVMgOgotCQkJCXJldHVybiBlUmVmZXJlbmNlcyAhPSBudWxsICYmICFnZXRFUmVmZXJlbmNlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFUVFJJQlVURVMgOgotCQkJCXJldHVybiBlQXR0cmlidXRlcyAhPSBudWxsICYmICFnZXRFQXR0cmlidXRlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9DT05UQUlOTUVOVFMgOgotCQkJCXJldHVybiAhZ2V0RUFsbENvbnRhaW5tZW50cygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9PUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxPcGVyYXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVMgOgotCQkJCXJldHVybiAhZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9TVVBFUl9UWVBFUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsU3VwZXJUeXBlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUlEX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGdldEVJREF0dHJpYnV0ZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTU1FTlQgOgotCQkJCXJldHVybiBDT01NRU5UX0VERUZBVUxUID09IG51bGwgPyBjb21tZW50ICE9IG51bGwgOiAhQ09NTUVOVF9FREVGQVVMVC5lcXVhbHMoY29tbWVudCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQgOgotCQkJCXJldHVybiBjb250ZW50ICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUgOgotCQkJCXJldHVybiBkdGRBdHRyaWJ1dGUgIT0gbnVsbCAmJiAhZ2V0RFREQXR0cmlidXRlKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IERURENvbnRlbnQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEU7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBEVERDb250ZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNvbW1lbnQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY29tbWVudCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX05BTUUgOgotCQkJCXNldE5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzc05hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXNldEluc3RhbmNlQ2xhc3MoKENsYXNzKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19BQlNUUkFDVCA6Ci0JCQkJc2V0QWJzdHJhY3QoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5URVJGQUNFIDoKLQkJCQlzZXRJbnRlcmZhY2UoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVNVUEVSX1RZUEVTIDoKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RVN1cGVyVHlwZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VPUEVSQVRJT05TIDoKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RU9wZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VSRUZFUkVOQ0VTIDoKLQkJCQlnZXRFUmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RVJlZmVyZW5jZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBVFRSSUJVVEVTIDoKLQkJCQlnZXRFQXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUF0dHJpYnV0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQgOgotCQkJCXNldENvbnRlbnQoKERUREVsZW1lbnRDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfQVRUUklCVVRFIDoKLQkJCQlnZXREVERBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldERUREF0dHJpYnV0ZSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX05BTUUgOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzTmFtZShJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzKElOU1RBTkNFX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0FCU1RSQUNUIDoKLQkJCQlzZXRBYnN0cmFjdChBQlNUUkFDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlRFUkZBQ0UgOgotCQkJCXNldEludGVyZmFjZShJTlRFUkZBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVNVUEVSX1RZUEVTIDoKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FT1BFUkFUSU9OUyA6Ci0JCQkJZ2V0RU9wZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVJFRkVSRU5DRVMgOgotCQkJCWdldEVSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBVFRSSUJVVEVTIDoKLQkJCQlnZXRFQXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KENPTU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCA6Ci0JCQkJc2V0Q29udGVudCgoRFRERWxlbWVudENvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSA6Ci0JCQkJZ2V0RFREQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQoKSAhPSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKERUREZpbGUpIGVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RFRERmlsZShEVERGaWxlIG5ld0RUREZpbGUpIHsKLQkJaWYgKG5ld0RUREZpbGUgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpICE9IERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFICYmIG5ld0RUREZpbGUgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdEVERGaWxlKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpICsgIi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3RFRERmlsZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3RFRERmlsZSkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERGaWxlLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFLCBuZXdEVERGaWxlLCBuZXdEVERGaWxlKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MWY0YzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwgZXh0ZW5kcyBEVERSZXBlYXRhYmxlQ29udGVudEltcGwgaW1wbGVtZW50cyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRFRERWxlbWVudCByZWZlcmVuY2VkRWxlbWVudCA9IG51bGw7Ci0KLQlwdWJsaWMgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKSB7Ci0JCXJldHVybiBnZXRDb250ZW50TmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCURUREVsZW1lbnQgZSA9IGdldFJlZmVyZW5jZWRFbGVtZW50KCk7Ci0JCWlmIChlID09IG51bGwpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGUuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIERUREVsZW1lbnQgZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKSB7Ci0JCWlmIChyZWZlcmVuY2VkRWxlbWVudCAhPSBudWxsICYmIHJlZmVyZW5jZWRFbGVtZW50LmVJc1Byb3h5KCkpIHsKLQkJCURUREVsZW1lbnQgb2xkUmVmZXJlbmNlZEVsZW1lbnQgPSByZWZlcmVuY2VkRWxlbWVudDsKLQkJCXJlZmVyZW5jZWRFbGVtZW50ID0gKERUREVsZW1lbnQpIEVjb3JlVXRpbC5yZXNvbHZlKHJlZmVyZW5jZWRFbGVtZW50LCB0aGlzKTsKLQkJCWlmIChyZWZlcmVuY2VkRWxlbWVudCAhPSBvbGRSZWZlcmVuY2VkRWxlbWVudCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX1JFRkVSRU5DRURfRUxFTUVOVCwgb2xkUmVmZXJlbmNlZEVsZW1lbnQsIHJlZmVyZW5jZWRFbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlZmVyZW5jZWRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERWxlbWVudCBiYXNpY0dldFJlZmVyZW5jZWRFbGVtZW50KCkgewotCQlyZXR1cm4gcmVmZXJlbmNlZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZEVsZW1lbnQoRFRERWxlbWVudCBuZXdSZWZlcmVuY2VkRWxlbWVudCkgewotCQlEVERFbGVtZW50IG9sZFJlZmVyZW5jZWRFbGVtZW50ID0gcmVmZXJlbmNlZEVsZW1lbnQ7Ci0JCXJlZmVyZW5jZWRFbGVtZW50ID0gbmV3UmVmZXJlbmNlZEVsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX1JFRkVSRU5DRURfRUxFTUVOVCwgb2xkUmVmZXJlbmNlZEVsZW1lbnQsIHJlZmVyZW5jZWRFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKCkpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlEKCksIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJcmV0dXJuIGdldE9jY3VycmVuY2UoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5UIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldFJlZmVyZW5jZWRFbGVtZW50KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0UmVmZXJlbmNlZEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXJldHVybiBvY2N1cnJlbmNlICE9IE9DQ1VSUkVOQ0VfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX1JFRkVSRU5DRURfRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIHJlZmVyZW5jZWRFbGVtZW50ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlzZXRPY2N1cnJlbmNlKChEVERPY2N1cnJlbmNlVHlwZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5UIDoKLQkJCQlzZXRSZWZlcmVuY2VkRWxlbWVudCgoRFRERWxlbWVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJc2V0T2NjdXJyZW5jZShPQ0NVUlJFTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX1JFRkVSRU5DRURfRUxFTUVOVCA6Ci0JCQkJc2V0UmVmZXJlbmNlZEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbXB0eUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW1wdHlDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODdlZjA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbXB0eUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFbXB0eUNvbnRlbnRJbXBsIGV4dGVuZHMgRFRERWxlbWVudENvbnRlbnRJbXBsIGltcGxlbWVudHMgRFRERW1wdHlDb250ZW50IHsKLQotCXB1YmxpYyBEVERFbXB0eUNvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVtcHR5Q29udGVudCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQsIERUREdyb3VwQ29udGVudC5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCgpLCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnROYW1lKCkgewotCQlyZXR1cm4gIkVNUFRZIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudGl0eUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5Q29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmN2VlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5Q29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFBhdGhuYW1lVXRpbDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEVERFbnRpdHlDb250ZW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRFRERW50aXR5Q29udGVudCB7Ci0KLQlwdWJsaWMgRFRERW50aXR5Q29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5Q29udGVudCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7Ci0JCXJldHVybiBEVERQYXRobmFtZVV0aWwubWFrZVBhdGgoZ2V0RFRERW50aXR5KCkuZ2V0UGF0aG5hbWUoKSwgIkNvbnRlbnQiLCBudWxsLCAtMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBEVERFbnRpdHkgZ2V0RFRERW50aXR5KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpICE9IERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRFRERW50aXR5KSBlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERUREVudGl0eShEVERFbnRpdHkgbmV3RFRERW50aXR5KSB7Ci0JCWlmIChuZXdEVERFbnRpdHkgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpICE9IERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZICYmIG5ld0RUREVudGl0eSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0RUREVudGl0eSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSArICIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0RUREVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3RFRERW50aXR5KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREVudGl0eSwgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSwgbmV3RFRERW50aXR5LCBuZXdEVERFbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFksIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlEKCksIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZIDoKLQkJCQlyZXR1cm4gZ2V0RFRERW50aXR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGdldERUREVudGl0eSgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZIDoKLQkJCQlzZXREVERFbnRpdHkoKERUREVudGl0eSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZIDoKLQkJCQlzZXREVERFbnRpdHkoKERUREVudGl0eSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qCi0JICogQHNlZSBEVERFbnRpdHlDb250ZW50I3VucGFyc2UoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkMDc0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkNoYWluSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETGV4aWNhbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERQYXRobmFtZVV0aWw7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbnRpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5SW1wbCNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwjaXNQYXJhbWV0ZXJFbnRpdHkgPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5SW1wbCNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwjZ2V0UGFybUVudGl0eVJlZiA8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwjZ2V0RW50aXR5UmVmZXJlbmNlIDxlbT5FbnRpdHkgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREVudGl0eUltcGwgZXh0ZW5kcyBEVERDb250ZW50SW1wbCBpbXBsZW1lbnRzIERUREVudGl0eSwgRU5hbWVkRWxlbWVudCwgRFREQ29udGVudCB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhuYW1lKCkgewotCQlyZXR1cm4gRFREUGF0aG5hbWVVdGlsLm1ha2VQYXRoKG51bGwsICJFbnQiLCBnZXROYW1lKCksIC0xKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJT2JqZWN0W10gcmVzdWx0ID0gRFREUGF0aG5hbWVVdGlsLnBhcnNlUGF0aENvbXBvbmVudChyZWxhdGl2ZVBhdGgpOwotCi0KLQkJU3RyaW5nIHR5cGUgPSAoU3RyaW5nKSByZXN1bHRbMF07Ci0KLQotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQotCQlEVERPYmplY3Qgb2JqID0gbnVsbDsKLQkJaWYgKHR5cGUuZXF1YWxzKCJDb250ZW50IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJb2JqID0gZ2V0Q29udGVudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCi0JCVN0cmluZyByZXN0UGF0aCA9IChTdHJpbmcpIHJlc3VsdFszXTsKLQotCQlpZiAoKHJlc3RQYXRoID09IG51bGwpIHx8IChvYmogPT0gbnVsbCkpIHsKLQkJCXJldHVybiBvYmo7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gb2JqLmZpbmRPYmplY3QocmVzdFBhdGgpOwotCQl9Ci0JfQotCi0KLQkvLyB1Z2x5IGhhY2sgZm9yIG5vdyBzaW5jZSB3ZSBkb24ndCBoYXZlIG11bHRpcGxlIGluaGVyaXRhbmNlLgotCS8vIFdvdWxkIHJhdGhlciBoYXZlIGFsbCB0aGlzIHN0dWZmIGluIGEgYmFzZSBjbGFzcyBidXQgdGhlc2UKLQkvLyBjbGFzc2VzIGFyZSBpbmhlcml0aW5nIGZyb20gc29tZXRpbWVzIGRpZmZlcmVudCBtb2YgY2xhc3NlcwotCURURExleGljYWxJbmZvIGxleEluZm8gPSBuZXcgRFRETGV4aWNhbEluZm8oKTsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldFN0YXJ0T2Zmc2V0KHYpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRFbmRPZmZzZXQodik7Ci0JfQotCi0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21tZW50KCkgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW1lbnQoKSA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IENPTU1FTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQYXJhbWV0ZXJFbnRpdHkoKSA8ZW0+UGFyYW1ldGVyIEVudGl0eTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2lzUGFyYW1ldGVyRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUEFSQU1FVEVSX0VOVElUWV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQYXJhbWV0ZXJFbnRpdHkoKSA8ZW0+UGFyYW1ldGVyIEVudGl0eTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2lzUGFyYW1ldGVyRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwYXJhbWV0ZXJFbnRpdHkgPSBQQVJBTUVURVJfRU5USVRZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGVudCgpIDxlbT5Db250ZW50PC9lbT59JwotCSAqIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERUREVudGl0eUNvbnRlbnQgY29udGVudCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJtRW50aXR5UmVmKCkgPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFBhcm1FbnRpdHlSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eVJlZiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRpdHlSZWZlcmVuY2UoKSA8ZW0+RW50aXR5IFJlZmVyZW5jZTwvZW0+fScKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0RW50aXR5UmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZW50aXR5UmVmZXJlbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9lbT59JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXR0cmlidXRlTmFtZVJlZmVyZW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvZW0+fScKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERFbnRpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBuZXdDb21tZW50KSB7Ci0JCVN0cmluZyBvbGRDb21tZW50ID0gY29tbWVudDsKLQkJY29tbWVudCA9IG5ld0NvbW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVCwgb2xkQ29tbWVudCwgY29tbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlckVudGl0eSgpIHsKLQkJcmV0dXJuIHBhcmFtZXRlckVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyRW50aXR5KGJvb2xlYW4gbmV3UGFyYW1ldGVyRW50aXR5KSB7Ci0JCWJvb2xlYW4gb2xkUGFyYW1ldGVyRW50aXR5ID0gcGFyYW1ldGVyRW50aXR5OwotCQlwYXJhbWV0ZXJFbnRpdHkgPSBuZXdQYXJhbWV0ZXJFbnRpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWSwgb2xkUGFyYW1ldGVyRW50aXR5LCBwYXJhbWV0ZXJFbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVudGl0eUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbnRlbnQoRFRERW50aXR5Q29udGVudCBuZXdDb250ZW50LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURUREVudGl0eUNvbnRlbnQgb2xkQ29udGVudCA9IGNvbnRlbnQ7Ci0JCWNvbnRlbnQgPSBuZXdDb250ZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5ldyBOb3RpZmljYXRpb25DaGFpbkltcGwoNCk7Ci0JCQltc2dzLmFkZChuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5ULCBvbGRDb250ZW50LCBuZXdDb250ZW50KSk7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoRFRERW50aXR5Q29udGVudCBuZXdDb250ZW50KSB7Ci0JCWlmIChuZXdDb250ZW50ICE9IGNvbnRlbnQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGNvbnRlbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZLCBEVERFbnRpdHlDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdDb250ZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdDb250ZW50KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSwgRFRERW50aXR5Q29udGVudC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb250ZW50KG5ld0NvbnRlbnQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQsIG5ld0NvbnRlbnQsIG5ld0NvbnRlbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBnZXRQYXJtRW50aXR5UmVmKCkgewotCQlpZiAocGFybUVudGl0eVJlZiAhPSBudWxsICYmIHBhcm1FbnRpdHlSZWYuZUlzUHJveHkoKSkgewotCQkJRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIG9sZFBhcm1FbnRpdHlSZWYgPSBwYXJtRW50aXR5UmVmOwotCQkJcGFybUVudGl0eVJlZiA9IChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIEVjb3JlVXRpbC5yZXNvbHZlKHBhcm1FbnRpdHlSZWYsIHRoaXMpOwotCQkJaWYgKHBhcm1FbnRpdHlSZWYgIT0gb2xkUGFybUVudGl0eVJlZikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGLCBvbGRQYXJtRW50aXR5UmVmLCBwYXJtRW50aXR5UmVmKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcm1FbnRpdHlSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgYmFzaWNHZXRQYXJtRW50aXR5UmVmKCkgewotCQlyZXR1cm4gcGFybUVudGl0eVJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UGFybUVudGl0eVJlZihEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgbmV3UGFybUVudGl0eVJlZiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2Ugb2xkUGFybUVudGl0eVJlZiA9IHBhcm1FbnRpdHlSZWY7Ci0JCXBhcm1FbnRpdHlSZWYgPSBuZXdQYXJtRW50aXR5UmVmOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5ldyBOb3RpZmljYXRpb25DaGFpbkltcGwoNCk7Ci0JCQltc2dzLmFkZChuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYsIG9sZFBhcm1FbnRpdHlSZWYsIG5ld1Bhcm1FbnRpdHlSZWYpKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFybUVudGl0eVJlZihEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgbmV3UGFybUVudGl0eVJlZikgewotCQlpZiAobmV3UGFybUVudGl0eVJlZiAhPSBwYXJtRW50aXR5UmVmKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwYXJtRW50aXR5UmVmICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwYXJtRW50aXR5UmVmKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZLCBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld1Bhcm1FbnRpdHlSZWYgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1Bhcm1FbnRpdHlSZWYpLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFksIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQYXJtRW50aXR5UmVmKG5ld1Bhcm1FbnRpdHlSZWYsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiwgbmV3UGFybUVudGl0eVJlZiwgbmV3UGFybUVudGl0eVJlZikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RW50aXR5UmVmZXJlbmNlKCkgewotCQlpZiAoZW50aXR5UmVmZXJlbmNlID09IG51bGwpIHsKLQkJCWVudGl0eVJlZmVyZW5jZSA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdChEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50LmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UsIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSk7Ci0JCX0KLQkJcmV0dXJuIGVudGl0eVJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKSB7Ci0JCWlmIChhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlID09IG51bGwpIHsKLQkJCWF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3QoRFREQXR0cmlidXRlLmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSk7Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkgewotCQlpZiAoYXR0cmlidXRlVHlwZVJlZmVyZW5jZSA9PSBudWxsKSB7Ci0JCQlhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0KERUREF0dHJpYnV0ZS5jbGFzcywgdGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFkpOwotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEUgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5UIDoKLQkJCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgY29udGVudCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCwgbnVsbCwgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldENvbnRlbnQoKERUREVudGl0eUNvbnRlbnQpIG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGIDoKLQkJCQkJaWYgKHBhcm1FbnRpdHlSZWYgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcGFybUVudGl0eVJlZikuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSwgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmNsYXNzLCBtc2dzKTsKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UGFybUVudGl0eVJlZigoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFbnRpdHlSZWZlcmVuY2UoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCA6Ci0JCQkJCXJldHVybiBiYXNpY1NldENvbnRlbnQobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiA6Ci0JCQkJCXJldHVybiBiYXNpY1NldFBhcm1FbnRpdHlSZWYobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFbnRpdHlSZWZlcmVuY2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQoKSA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQoKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5ULCBEVERGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlEKCksIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIGdldENvbW1lbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZIDoKLQkJCQlyZXR1cm4gaXNQYXJhbWV0ZXJFbnRpdHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYgOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0UGFybUVudGl0eVJlZigpOwotCQkJCXJldHVybiBiYXNpY0dldFBhcm1FbnRpdHlSZWYoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFIDoKLQkJCQlyZXR1cm4gZ2V0RW50aXR5UmVmZXJlbmNlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFIDoKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSA6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZIDoKLQkJCQlzZXRQYXJhbWV0ZXJFbnRpdHkoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5UIDoKLQkJCQlzZXRDb250ZW50KChEVERFbnRpdHlDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiA6Ci0JCQkJc2V0UGFybUVudGl0eVJlZigoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCWdldEVudGl0eVJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RW50aXR5UmVmZXJlbmNlKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSA6Ci0JCQkJZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UgOgotCQkJCWdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCWdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoQ09NTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFkgOgotCQkJCXNldFBhcmFtZXRlckVudGl0eShQQVJBTUVURVJfRU5USVRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCA6Ci0JCQkJc2V0Q29udGVudCgoRFRERW50aXR5Q29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiA6Ci0JCQkJc2V0UGFybUVudGl0eVJlZigoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSA6Ci0JCQkJZ2V0RW50aXR5UmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFIDoKLQkJCQlnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFIDoKLQkJCQlnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UIDoKLQkJCQlyZXR1cm4gQ09NTUVOVF9FREVGQVVMVCA9PSBudWxsID8gY29tbWVudCAhPSBudWxsIDogIUNPTU1FTlRfRURFRkFVTFQuZXF1YWxzKGNvbW1lbnQpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFkgOgotCQkJCXJldHVybiBwYXJhbWV0ZXJFbnRpdHkgIT0gUEFSQU1FVEVSX0VOVElUWV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5UIDoKLQkJCQlyZXR1cm4gY29udGVudCAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiA6Ci0JCQkJcmV0dXJuIHBhcm1FbnRpdHlSZWYgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFIDoKLQkJCQlyZXR1cm4gZW50aXR5UmVmZXJlbmNlICE9IG51bGwgJiYgIWdldEVudGl0eVJlZmVyZW5jZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UgOgotCQkJCXJldHVybiBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlICE9IG51bGwgJiYgIWdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFIDoKLQkJCQlyZXR1cm4gYXR0cmlidXRlVHlwZVJlZmVyZW5jZSAhPSBudWxsICYmICFnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb21tZW50OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNvbW1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcmFtZXRlckVudGl0eTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwYXJhbWV0ZXJFbnRpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gRFRERW50aXR5SW1wbAotCi0vLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0vLwotCi0vLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0vLyAvL3B1YmxpYyBjbGFzcyBEVERFbnRpdHlJbXBsIGV4dGVuZHMgRU5hbWVzcGFjZUltcGwgaW1wbGVtZW50cyBEVERFbnRpdHksCi0vLyBFTmFtZXNwYWNlLCBEVERDb250ZW50ewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIEJvb2xlYW4gcGFyYW1ldGVyRW50aXR5ID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRFRERW50aXR5Q29udGVudCBjb250ZW50ID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHlSZWYgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBFTGlzdCBlbnRpdHlSZWZlcmVuY2UgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBFTGlzdCBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRUxpc3QgYXR0cmlidXRlVHlwZVJlZmVyZW5jZSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0Q29tbWVudCA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBib29sZWFuIHNldFBhcmFtZXRlckVudGl0eSA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBib29sZWFuIHNldENvbnRlbnQgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRQYXJtRW50aXR5UmVmID0gZmFsc2U7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJpdmF0ZSBEVERDb250ZW50SW1wbCBkdGRDb250ZW50RGVsZWdhdGUgPSBudWxsOwotCi0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVPYmplY3QgaW5pdEluc3RhbmNlKCkgewotLy8gc2V0RU1ldGFPYmooZUNsYXNzRFRERW50aXR5KCkpOwotLy8gaW5pdEluc3RhbmNlRGVsZWdhdGVzKCk7Ci0vLyByZXR1cm4gdGhpczsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgdm9pZCBpbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKSB7Ci0vLyBzdXBlci5pbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKTsKLS8vCi0vLyBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5yZWZTZXREZWxlZ2F0ZU93bmVyKHRoaXMpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBEVERQYWNrYWdlIGVQYWNrYWdlRFREKCkgewotLy8gcmV0dXJuCi0vLyAoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFQ2xhc3MgZUNsYXNzRFRERW50aXR5KCkgewotLy8gcmV0dXJuCi0vLyAoKERURFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRFREUGFja2FnZS5lTlNfVVJJKSkuZ2V0RFRERW50aXR5KCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0vLyBpZiAodGhpcy5zZXRDb21tZW50KSByZXR1cm4gdGhpcy5jb21tZW50OwotLy8gZWxzZSByZXR1cm4KLS8vIChTdHJpbmcpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbW1lbnQoKS5nZXREZWZhdWx0VmFsdWUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSkgewotLy8gcmVmU2V0VmFsdWVGb3JTaW1wbGVTRihEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQ29tbWVudCgpLHRoaXMuY29tbWVudCx2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRDb21tZW50KCkgewotLy8gZU5vdGlmeShyZWZCYXNpY1Vuc2V0VmFsdWUoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbW1lbnQoKSkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0Q29tbWVudCgpIHsKLS8vIHJldHVybiBzZXRDb21tZW50OwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIEJvb2xlYW4gZ2V0UGFyYW1ldGVyRW50aXR5KCkgewotLy8gaWYgKHRoaXMuc2V0UGFyYW1ldGVyRW50aXR5KSByZXR1cm4gdGhpcy5wYXJhbWV0ZXJFbnRpdHk7Ci0vLyBlbHNlIHJldHVybgotLy8gKEJvb2xlYW4pRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X1BhcmFtZXRlckVudGl0eSgpLmdldERlZmF1bHRWYWx1ZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJFbnRpdHkoKSB7Ci0vLyBCb29sZWFuIHJlc3VsdCA9IGdldFBhcmFtZXRlckVudGl0eSgpOwotLy8gcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0LmJvb2xlYW5WYWx1ZSgpIDogZmFsc2U7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyRW50aXR5KEJvb2xlYW4gdmFsdWUpIHsKLS8vIHJlZlNldFZhbHVlRm9yU2ltcGxlU0YoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X1BhcmFtZXRlckVudGl0eSgpLHRoaXMucGFyYW1ldGVyRW50aXR5LHZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJFbnRpdHkoYm9vbGVhbiB2YWx1ZSkgewotLy8gc2V0UGFyYW1ldGVyRW50aXR5KHZhbHVlP0Jvb2xlYW4uVFJVRTpCb29sZWFuLkZBTFNFKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldFBhcmFtZXRlckVudGl0eSgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKSkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0UGFyYW1ldGVyRW50aXR5KCkgewotLy8gcmV0dXJuIHNldFBhcmFtZXRlckVudGl0eTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBEVERFbnRpdHlDb250ZW50IGdldENvbnRlbnQoKSB7Ci0vLyB0cnkgewotLy8gaWYgKHRoaXMuY29udGVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLS8vIHRoaXMuY29udGVudCA9IChEVERFbnRpdHlDb250ZW50KQotLy8gKChJbnRlcm5hbEVPYmplY3QpdGhpcy5jb250ZW50KS5yZXNvbHZlKHRoaXMpOwotLy8gaWYgKHRoaXMuY29udGVudD09bnVsbCkgdGhpcy5zZXRDb250ZW50ID0gZmFsc2U7Ci0vLyByZXR1cm4gdGhpcy5jb250ZW50OwotLy8gfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBudWxsOwotLy8gfQotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldENvbnRlbnQoRFRERW50aXR5Q29udGVudCBsKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclJlZk9iamVjdFNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9Db250ZW50KCksdGhpcy5jb250ZW50LGwpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0Q29udGVudCgpIHsKLS8vIHJlZlVuc2V0VmFsdWVGb3JSZWZPYmplY3RTRihEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQ29udGVudCgpLHRoaXMuY29udGVudCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXRDb250ZW50KCkgewotLy8gcmV0dXJuIHNldENvbnRlbnQ7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGdldFBhcm1FbnRpdHlSZWYoKSB7Ci0vLyB0cnkgewotLy8gaWYgKHRoaXMucGFybUVudGl0eVJlZiA9PSBudWxsKSByZXR1cm4gbnVsbDsKLS8vIHRoaXMucGFybUVudGl0eVJlZiA9IChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpCi0vLyAoKEludGVybmFsRU9iamVjdCl0aGlzLnBhcm1FbnRpdHlSZWYpLnJlc29sdmUodGhpcywKLS8vIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCkpOwotLy8gaWYgKHRoaXMucGFybUVudGl0eVJlZj09bnVsbCkgdGhpcy5zZXRQYXJtRW50aXR5UmVmID0gZmFsc2U7Ci0vLyByZXR1cm4gdGhpcy5wYXJtRW50aXR5UmVmOwotLy8gfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBudWxsOwotLy8gfQotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldFBhcm1FbnRpdHlSZWYoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGwpIHsKLS8vIHJlZlNldFZhbHVlRm9yU1ZSZWZlcmVuY2UoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X1Bhcm1FbnRpdHlSZWYoKSx0aGlzLnBhcm1FbnRpdHlSZWYsbCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRQYXJtRW50aXR5UmVmKCkgewotLy8gcmVmVW5zZXRWYWx1ZUZvclNWUmVmZXJlbmNlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCksdGhpcy5wYXJtRW50aXR5UmVmKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldFBhcm1FbnRpdHlSZWYoKSB7Ci0vLyByZXR1cm4gc2V0UGFybUVudGl0eVJlZjsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBFTGlzdCBnZXRFbnRpdHlSZWZlcmVuY2UoKSB7Ci0vLyBpZiAodGhpcy5lbnRpdHlSZWZlcmVuY2U9PW51bGwpIHsKLS8vIHRoaXMuZW50aXR5UmVmZXJlbmNlPW5ld0NvbGxlY3Rpb24odGhpcyxEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfRW50aXR5UmVmZXJlbmNlKCksCi0vLyB0cnVlKTsKLS8vIH0KLS8vIHJldHVybiB0aGlzLmVudGl0eVJlZmVyZW5jZTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBFTGlzdCBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkgewotLy8gaWYgKHRoaXMuYXR0cmlidXRlTmFtZVJlZmVyZW5jZT09bnVsbCkgewotLy8gdGhpcy5hdHRyaWJ1dGVOYW1lUmVmZXJlbmNlPW5ld0NvbGxlY3Rpb24odGhpcyxEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpLAotLy8gdHJ1ZSk7Ci0vLyB9Ci0vLyByZXR1cm4gdGhpcy5hdHRyaWJ1dGVOYW1lUmVmZXJlbmNlOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIEVMaXN0IGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKSB7Ci0vLyBpZiAodGhpcy5hdHRyaWJ1dGVUeXBlUmVmZXJlbmNlPT1udWxsKSB7Ci0vLyB0aGlzLmF0dHJpYnV0ZVR5cGVSZWZlcmVuY2U9bmV3Q29sbGVjdGlvbih0aGlzLERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCksCi0vLyB0cnVlKTsKLS8vIH0KLS8vIHJldHVybiB0aGlzLmF0dHJpYnV0ZVR5cGVSZWZlcmVuY2U7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREVudGl0eSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVDogcmV0dXJuIGdldENvbW1lbnQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZOiByZXR1cm4gZ2V0UGFyYW1ldGVyRW50aXR5KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVDogcmV0dXJuIGdldENvbnRlbnQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUY6IHJldHVybiBnZXRQYXJtRW50aXR5UmVmKCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRTogcmV0dXJuIGdldEVudGl0eVJlZmVyZW5jZSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRTogcmV0dXJuCi0vLyBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFOiByZXR1cm4KLS8vIGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRTogcmV0dXJuIGdldERUREZpbGUoKTsKLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgT2JqZWN0IHJlZkJhc2ljVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERW50aXR5KCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UOgotLy8gcmV0dXJuIHRoaXMuc2V0Q29tbWVudD8gdGhpcy5jb21tZW50IDogbnVsbDsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZOgotLy8gcmV0dXJuIHRoaXMuc2V0UGFyYW1ldGVyRW50aXR5PyB0aGlzLnBhcmFtZXRlckVudGl0eSA6IG51bGw7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVDoKLS8vIGlmICghdGhpcy5zZXRDb250ZW50fHx0aGlzLmNvbnRlbnQ9PW51bGwpIHJldHVybiBudWxsOwotLy8gaWYgKCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMuY29udGVudCkucmVmSXNEZWxldGVkKCkpIHt0aGlzLmNvbnRlbnQ9bnVsbDsKLS8vIHRoaXMuc2V0Q29udGVudD1mYWxzZTt9Ci0vLyByZXR1cm4gdGhpcy5jb250ZW50OwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRjoKLS8vIGlmICghdGhpcy5zZXRQYXJtRW50aXR5UmVmfHx0aGlzLnBhcm1FbnRpdHlSZWY9PW51bGwpIHJldHVybiBudWxsOwotLy8gaWYgKCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMucGFybUVudGl0eVJlZikucmVmSXNEZWxldGVkKCkpCi0vLyB7dGhpcy5wYXJtRW50aXR5UmVmPW51bGw7IHRoaXMuc2V0UGFybUVudGl0eVJlZj1mYWxzZTt9Ci0vLyByZXR1cm4gdGhpcy5wYXJtRW50aXR5UmVmOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0U6Ci0vLyByZXR1cm4gdGhpcy5lbnRpdHlSZWZlcmVuY2U7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFOgotLy8gcmV0dXJuIHRoaXMuYXR0cmlidXRlTmFtZVJlZmVyZW5jZTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0U6Ci0vLyByZXR1cm4gdGhpcy5hdHRyaWJ1dGVUeXBlUmVmZXJlbmNlOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFOiByZXR1cm4KLS8vICgoSW50ZXJuYWxFT2JqZWN0KWdldER0ZENvbnRlbnREZWxlZ2F0ZSgpKS5yZWZCYXNpY1ZhbHVlKGZlYXR1cmUpOwotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1ZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREVudGl0eSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVDogcmV0dXJuIGlzU2V0Q29tbWVudCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFk6IHJldHVybgotLy8gaXNTZXRQYXJhbWV0ZXJFbnRpdHkoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5UOiByZXR1cm4gaXNTZXRDb250ZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGOiByZXR1cm4gaXNTZXRQYXJtRW50aXR5UmVmKCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEU6IHJldHVybiBpc1NldERUREZpbGUoKTsKLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERFbnRpdHkoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQ6IHsKLS8vIHNldENvbW1lbnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWTogewotLy8gc2V0UGFyYW1ldGVyRW50aXR5KChuZXdWYWx1ZSBpbnN0YW5jZW9mCi0vLyBTdHJpbmcpP0Jvb2xlYW4udmFsdWVPZigoU3RyaW5nKW5ld1ZhbHVlKTooQm9vbGVhbiluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVDogewotLy8gc2V0Q29udGVudCgoRFRERW50aXR5Q29udGVudCluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGOiB7Ci0vLyBzZXRQYXJtRW50aXR5UmVmKChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFOiB7Ci0vLyBzZXREVERGaWxlKChEVERGaWxlKW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vCi0vLyB9Ci0vLyBzdXBlci5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIGVCYXNpY1NldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotLy8gewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERFbnRpdHkoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29tbWVudDsKLS8vIHRoaXMuY29tbWVudCA9IChTdHJpbmcpbmV3VmFsdWU7Ci0vLyB0aGlzLnNldENvbW1lbnQgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQ29tbWVudCgpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnBhcmFtZXRlckVudGl0eTsKLS8vIHRoaXMucGFyYW1ldGVyRW50aXR5ID0gKEJvb2xlYW4pbmV3VmFsdWU7Ci0vLyB0aGlzLnNldFBhcmFtZXRlckVudGl0eSA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5jb250ZW50OwotLy8gdGhpcy5jb250ZW50ID0gKERUREVudGl0eUNvbnRlbnQpbmV3VmFsdWU7Ci0vLyB0aGlzLnNldENvbnRlbnQgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQ29udGVudCgpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUY6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMucGFybUVudGl0eVJlZjsKLS8vIHRoaXMucGFybUVudGl0eVJlZiA9IChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpbmV3VmFsdWU7Ci0vLyB0aGlzLnNldFBhcm1FbnRpdHlSZWYgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUJhc2ljU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyBzdXBlci5lVW5zZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREVudGl0eSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVDogewotLy8gdW5zZXRDb21tZW50KCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWTogewotLy8gdW5zZXRQYXJhbWV0ZXJFbnRpdHkoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5UOiB7Ci0vLyB1bnNldENvbnRlbnQoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUY6IHsKLS8vIHVuc2V0UGFybUVudGl0eVJlZigpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFOiB7Ci0vLyB1bnNldERUREZpbGUoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vCi0vLyB9Ci0vLyBzdXBlci5lVW5zZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE5vdGlmaWNhdGlvbiByZWZCYXNpY1Vuc2V0VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNVbnNldFZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERFbnRpdHkoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29tbWVudDsKLS8vIHRoaXMuY29tbWVudCA9IG51bGw7Ci0vLyB0aGlzLnNldENvbW1lbnQgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQ29tbWVudCgpLG9sZFZhbHVlLGdldENvbW1lbnQoKSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWTogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5wYXJhbWV0ZXJFbnRpdHk7Ci0vLyB0aGlzLnBhcmFtZXRlckVudGl0eSA9IG51bGw7Ci0vLyB0aGlzLnNldFBhcmFtZXRlckVudGl0eSA9IGZhbHNlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5VTlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKSxvbGRWYWx1ZSxnZXRQYXJhbWV0ZXJFbnRpdHkoKSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5jb250ZW50OwotLy8gdGhpcy5jb250ZW50ID0gbnVsbDsKLS8vIHRoaXMuc2V0Q29udGVudCA9IGZhbHNlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5VTlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9Db250ZW50KCksb2xkVmFsdWUsbnVsbCk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnBhcm1FbnRpdHlSZWY7Ci0vLyB0aGlzLnBhcm1FbnRpdHlSZWYgPSBudWxsOwotLy8gdGhpcy5zZXRQYXJtRW50aXR5UmVmID0gZmFsc2U7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlVOU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X1Bhcm1FbnRpdHlSZWYoKSxvbGRWYWx1ZSxudWxsKTsKLS8vIH0KLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNVbnNldFZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBEVERDb250ZW50SW1wbCBnZXREdGRDb250ZW50RGVsZWdhdGUoKSB7Ci0vLyBpZiAoZHRkQ29udGVudERlbGVnYXRlID09IG51bGwpIHsKLS8vIERURFBhY2thZ2UgcGtnID0KLS8vIChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyBkdGRDb250ZW50RGVsZWdhdGU9KERURENvbnRlbnRJbXBsKXBrZy5lQ3JlYXRlSW5zdGFuY2UocGtnLkRURF9DT05URU5UKTsKLS8vIGR0ZENvbnRlbnREZWxlZ2F0ZS5pbml0SW5zdGFuY2UoKTsKLS8vIH0KLS8vIHJldHVybiBkdGRDb250ZW50RGVsZWdhdGU7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVDbGFzcyBlQ2xhc3NEVERDb250ZW50KCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmVDbGFzcygpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuZ2V0RFRERmlsZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldERUREZpbGUoRFRERmlsZSB2YWx1ZSkgewotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuc2V0RFRERmlsZSh2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXREVERGaWxlKCkgewotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkudW5zZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXREVERGaWxlKCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmlzU2V0RFRERmlsZSgpOwotLy8gfQotLy8gfQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmZGU0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25DaGFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERMZXhpY2FsSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsIGV4dGVuZHMgRFREUmVwZWF0YWJsZUNvbnRlbnRJbXBsIGltcGxlbWVudHMgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCB7Ci0KLQlwdWJsaWMgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCURUREVudGl0eSBlID0gZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKTsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKSB7Ci0JCURUREVudGl0eSBlbnRpdHlSZWYgPSBnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpOwotCQlpZiAoZW50aXR5UmVmLmlzUGFyYW1ldGVyRW50aXR5KCkpIHsKLQkJCXJldHVybiAiJSIgKyBnZXRDb250ZW50TmFtZSgpICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAiJiIgKyBnZXRDb250ZW50TmFtZSgpICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8vIHVnbHkgaGFjayBmb3Igbm93IHNpbmNlIHdlIGRvbid0IGhhdmUgbXVsdGlwbGUgaW5oZXJpdGFuY2UuCi0JLy8gV291bGQgcmF0aGVyIGhhdmUgYWxsIHRoaXMgc3R1ZmYgaW4gYSBiYXNlIGNsYXNzIGJ1dCB0aGVzZQotCS8vIGNsYXNzZXMgYXJlIGluaGVyaXRpbmcgZnJvbSBzb21ldGltZXMgZGlmZmVyZW50IG1vZiBjbGFzc2VzCi0JRFRETGV4aWNhbEluZm8gbGV4SW5mbyA9IG5ldyBEVERMZXhpY2FsSW5mbygpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBEVERFbnRpdHkgZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgPSBudWxsOwotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0U3RhcnRPZmZzZXQodik7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldEVuZE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBEVERFbnRpdHkgZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKSB7Ci0JCWlmIChlbGVtZW50UmVmZXJlbmNlZEVudGl0eSAhPSBudWxsICYmIGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5LmVJc1Byb3h5KCkpIHsKLQkJCURUREVudGl0eSBvbGRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSA9IGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5OwotCQkJZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgPSAoRFRERW50aXR5KSBFY29yZVV0aWwucmVzb2x2ZShlbGVtZW50UmVmZXJlbmNlZEVudGl0eSwgdGhpcyk7Ci0JCQlpZiAoZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgIT0gb2xkRWxlbWVudFJlZmVyZW5jZWRFbnRpdHkpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFksIG9sZEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5LCBlbGVtZW50UmVmZXJlbmNlZEVudGl0eSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50UmVmZXJlbmNlZEVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVudGl0eSBiYXNpY0dldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCkgewotCQlyZXR1cm4gZWxlbWVudFJlZmVyZW5jZWRFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSBuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVERFbnRpdHkgb2xkRWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgPSBlbGVtZW50UmVmZXJlbmNlZEVudGl0eTsKLQkJZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgPSBuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBuZXcgTm90aWZpY2F0aW9uQ2hhaW5JbXBsKDQpOwotCQkJbXNncy5hZGQobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSwgb2xkRWxlbWVudFJlZmVyZW5jZWRFbnRpdHksIG5ld0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5KSk7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5IG5ld0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5KSB7Ci0JCWlmIChuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSAhPSBlbGVtZW50UmVmZXJlbmNlZEVudGl0eSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSwgbmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHksIG5ld0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCQlpZiAoZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKERUREVudGl0eSkgb3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIERUREVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQoKSwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gZ2V0T2NjdXJyZW5jZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJcmV0dXJuIG9jY3VycmVuY2UgIT0gT0NDVVJSRU5DRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlyZXR1cm4gZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoKERURE9jY3VycmVuY2VUeXBlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCXNldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoT0NDVVJSRU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCXNldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnVtZXJhdGlvblR5cGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW51bWVyYXRpb25UeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTYwNGI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnVtZXJhdGlvblR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVFbnVtSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRERW51bWVyYXRpb25UeXBlSW1wbCBleHRlbmRzIEVFbnVtSW1wbCBpbXBsZW1lbnRzIERUREVudW1lcmF0aW9uVHlwZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtpbmQoKSA8ZW0+S2luZDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRFRERW51bUdyb3VwS2luZCBLSU5EX0VERUZBVUxUID0gRFRERW51bUdyb3VwS2luZC5OQU1FX1RPS0VOX0dST1VQX0xJVEVSQUw7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBlbnVtZXJhdGlvblR5cGVEZXNjcmlwdGlvbnNbXSA9IHtEVERDb3JlTWVzc2FnZXMuX1VJX0VOVU1fTkFNRV9UT0tFTlNfREVTQywgRFREQ29yZU1lc3NhZ2VzLl9VSV9FTlVNX05PVEFUSU9OX0RFU0N9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IGVudW1lcmF0aW9uVHlwZUtpbmRzW10gPSB7RFRERW51bUdyb3VwS2luZC5OQU1FX1RPS0VOX0dST1VQLCBEVERFbnVtR3JvdXBLaW5kLk5PVEFUSU9OX0dST1VQfTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBEVERFbnVtR3JvdXBLaW5kIGtpbmQgPSBLSU5EX0VERUZBVUxUOwotCi0JcHVibGljIERUREVudW1lcmF0aW9uVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW51bWVyYXRpb25UeXBlKCk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEVudW1MaXRlcmFscygpIHsKLQkJcmV0dXJuIGdldEVMaXRlcmFscygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW51bWVyYXRpb25UeXBlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBnZXRFbnVtZXJhdGlvblR5cGVEZXNjcmlwdGlvbihnZXRLaW5kKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RW51bWVyYXRpb25UeXBlRGVzY3JpcHRpb24oaW50IGtpbmQpIHsKLQkJLy8gaXQgY2FuIG9ubHkgYmUgMSBvciAyLCBidXQgbWF5YmUgbGF0ZXIuLi4KLQkJaWYgKGtpbmQgPj0gMSAmJiBraW5kIDw9IDIpIHsKLQkJCS8vIHdlIHN1YnRyYWN0IDEgc2luY2UgdGhlIGtpbmQgaXMgMSAtIGJhc2VkIG5vdCB6ZXJvIGJhc2VkCi0JCQlyZXR1cm4gZW51bWVyYXRpb25UeXBlRGVzY3JpcHRpb25zW2tpbmQgLSAxXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhuYW1lKCkgewotCQkvLyBUQkQKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRERW51bUdyb3VwS2luZCBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2luZChEVERFbnVtR3JvdXBLaW5kIG5ld0tpbmQpIHsKLQkJRFRERW51bUdyb3VwS2luZCBvbGRLaW5kID0ga2luZDsKLQkJa2luZCA9IG5ld0tpbmQgPT0gbnVsbCA/IEtJTkRfRURFRkFVTFQgOiBuZXdLaW5kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19LSU5ELCBvbGRLaW5kLCBraW5kKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBnZXREVERGaWxlKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpICE9IERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRFRERmlsZSkgZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREVERGaWxlKERUREZpbGUgbmV3RFRERmlsZSkgewotCQlpZiAobmV3RFRERmlsZSAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEKCkgIT0gRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUgJiYgbmV3RFRERmlsZSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0RUREZpbGUpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdEVERGaWxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERGaWxlKS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREZpbGUsIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUsIG5ld0RUREZpbGUsIG5ld0RUREZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRVBBQ0tBR0UgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VQQUNLQUdFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VMSVRFUkFMUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVMaXRlcmFscygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FUEFDS0FHRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FTElURVJBTFMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFTGl0ZXJhbHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FUEFDS0FHRSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fRUNMQVNTSUZJRVJTLCBFUGFja2FnZS5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFLCBEVERGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlEKCksIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2VDbGFzc05hbWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRVBBQ0tBR0UgOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19TRVJJQUxJWkFCTEUgOgotCQkJCXJldHVybiBpc1NlcmlhbGl6YWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUxJVEVSQUxTIDoKLQkJCQlyZXR1cm4gZ2V0RUxpdGVyYWxzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0tJTkQgOgotCQkJCXJldHVybiBnZXRLaW5kKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWdldEVBbm5vdGF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fTkFNRSA6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJcmV0dXJuIElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGluc3RhbmNlQ2xhc3NOYW1lICE9IG51bGwgOiAhSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVC5lcXVhbHMoaW5zdGFuY2VDbGFzc05hbWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJcmV0dXJuIElOU1RBTkNFX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBpbnN0YW5jZUNsYXNzICE9IG51bGwgOiAhSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGluc3RhbmNlQ2xhc3MpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19ERUZBVUxUX1ZBTFVFIDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRVBBQ0tBR0UgOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX1NFUklBTElaQUJMRSA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgU0VSSUFMSVpBQkxFX0VGTEFHKSAhPSAwKSAhPSBTRVJJQUxJWkFCTEVfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VMSVRFUkFMUyA6Ci0JCQkJcmV0dXJuIGVMaXRlcmFscyAhPSBudWxsICYmICFnZXRFTGl0ZXJhbHMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0tJTkQgOgotCQkJCXJldHVybiBraW5kICE9IEtJTkRfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX05BTUUgOgotCQkJCXNldE5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzc05hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXNldEluc3RhbmNlQ2xhc3MoKENsYXNzKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19TRVJJQUxJWkFCTEUgOgotCQkJCXNldFNlcmlhbGl6YWJsZSgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FTElURVJBTFMgOgotCQkJCWdldEVMaXRlcmFscygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUxpdGVyYWxzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19LSU5EIDoKLQkJCQlzZXRLaW5kKChEVERFbnVtR3JvdXBLaW5kKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX05BTUUgOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzTmFtZShJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzKElOU1RBTkNFX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX1NFUklBTElaQUJMRSA6Ci0JCQkJc2V0U2VyaWFsaXphYmxlKFNFUklBTElaQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FTElURVJBTFMgOgotCQkJCWdldEVMaXRlcmFscygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19LSU5EIDoKLQkJCQlzZXRLaW5kKEtJTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGtpbmQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoa2luZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREV4dGVybmFsRW50aXR5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREV4dGVybmFsRW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWJkNGM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFeHRlcm5hbEVudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25DaGFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRERXh0ZXJuYWxFbnRpdHlJbXBsIGV4dGVuZHMgRFRERW50aXR5Q29udGVudEltcGwgaW1wbGVtZW50cyBEVERFeHRlcm5hbEVudGl0eSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN5c3RlbUlEKCkgPGVtPlN5c3RlbSBJRDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFN5c3RlbUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JRCA9IFNZU1RFTV9JRF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVibGljSUQoKSA8ZW0+UHVibGljIElEPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0UHVibGljSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lEID0gUFVCTElDX0lEX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBEVEROb3RhdGlvbiBub3RhdGlvbiA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERUREZpbGUgZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSA9IG51bGw7Ci0KLQlwdWJsaWMgRFRERXh0ZXJuYWxFbnRpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREV4dGVybmFsRW50aXR5KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCkgewotCQlTdHJpbmdCdWZmZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKLQkJaWYgKGdldFB1YmxpY0lEKCkgPT0gbnVsbCB8fCBnZXRQdWJsaWNJRCgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGV4dC5hcHBlbmQoIlNZU1RFTSAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJdGV4dC5hcHBlbmQoIlBVQkxJQyBcIiIpLmFwcGVuZChnZXRQdWJsaWNJRCgpKS5hcHBlbmQoIlwiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlTdHJpbmcgc3lzdGVtSWQgPSBnZXRTeXN0ZW1JRCgpOwotCi0JCXRleHQuYXBwZW5kKCJcIiIpLmFwcGVuZChzeXN0ZW1JZCkuYXBwZW5kKCJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlEVEROb3RhdGlvbiBub3RhdGlvbiA9IGdldE5vdGF0aW9uKCk7Ci0JCWlmIChub3RhdGlvbiAhPSBudWxsKQotCQkJdGV4dC5hcHBlbmQoIiBOREFUQSAiKS5hcHBlbmQobm90YXRpb24uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiB0ZXh0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlEKCkgewotCQlyZXR1cm4gc3lzdGVtSUQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSUQoU3RyaW5nIG5ld1N5c3RlbUlEKSB7Ci0JCVN0cmluZyBvbGRTeXN0ZW1JRCA9IHN5c3RlbUlEOwotCQlzeXN0ZW1JRCA9IG5ld1N5c3RlbUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCwgb2xkU3lzdGVtSUQsIHN5c3RlbUlEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lEKCkgewotCQlyZXR1cm4gcHVibGljSUQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSUQoU3RyaW5nIG5ld1B1YmxpY0lEKSB7Ci0JCVN0cmluZyBvbGRQdWJsaWNJRCA9IHB1YmxpY0lEOwotCQlwdWJsaWNJRCA9IG5ld1B1YmxpY0lEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCwgb2xkUHVibGljSUQsIHB1YmxpY0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRETm90YXRpb24gZ2V0Tm90YXRpb24oKSB7Ci0JCWlmIChub3RhdGlvbiAhPSBudWxsICYmIG5vdGF0aW9uLmVJc1Byb3h5KCkpIHsKLQkJCURURE5vdGF0aW9uIG9sZE5vdGF0aW9uID0gbm90YXRpb247Ci0JCQlub3RhdGlvbiA9IChEVEROb3RhdGlvbikgRWNvcmVVdGlsLnJlc29sdmUobm90YXRpb24sIHRoaXMpOwotCQkJaWYgKG5vdGF0aW9uICE9IG9sZE5vdGF0aW9uKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiwgb2xkTm90YXRpb24sIG5vdGF0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRETm90YXRpb24gYmFzaWNHZXROb3RhdGlvbigpIHsKLQkJcmV0dXJuIG5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXROb3RhdGlvbihEVEROb3RhdGlvbiBuZXdOb3RhdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVEROb3RhdGlvbiBvbGROb3RhdGlvbiA9IG5vdGF0aW9uOwotCQlub3RhdGlvbiA9IG5ld05vdGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5ldyBOb3RpZmljYXRpb25DaGFpbkltcGwoNCk7Ci0JCQltc2dzLmFkZChuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiwgb2xkTm90YXRpb24sIG5ld05vdGF0aW9uKSk7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm90YXRpb24oRFRETm90YXRpb24gbmV3Tm90YXRpb24pIHsKLQkJaWYgKG5ld05vdGF0aW9uICE9IG5vdGF0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChub3RhdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbm90YXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFksIERURE5vdGF0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdOb3RhdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Tm90YXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFksIERURE5vdGF0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE5vdGF0aW9uKG5ld05vdGF0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiwgbmV3Tm90YXRpb24sIG5ld05vdGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBnZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCkgewotCQlpZiAoZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSAhPSBudWxsICYmIGVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUuZUlzUHJveHkoKSkgewotCQkJRFRERmlsZSBvbGRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlID0gZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZTsKLQkJCWVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUgPSAoRFRERmlsZSkgRWNvcmVVdGlsLnJlc29sdmUoZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSwgdGhpcyk7Ci0JCQlpZiAoZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSAhPSBvbGRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFRF9GUk9NX0FOT1RIRVJfRklMRSwgb2xkRW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSwgZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBiYXNpY0dldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKSB7Ci0JCXJldHVybiBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoRFRERmlsZSBuZXdFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKSB7Ci0JCURUREZpbGUgb2xkRW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSA9IGVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGU7Ci0JCWVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUgPSBuZXdFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFLCBvbGRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlLCBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFksIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiA6Ci0JCQkJCWlmIChub3RhdGlvbiAhPSBudWxsKQotCQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBub3RhdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWSwgRFRETm90YXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXROb3RhdGlvbigoRFRETm90YXRpb24pIG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19EVERfRU5USVRZLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCQlyZXR1cm4gYmFzaWNTZXROb3RhdGlvbihudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCgpLCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXJldHVybiBnZXREVERFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19TWVNURU1fSUQgOgotCQkJCXJldHVybiBnZXRTeXN0ZW1JRCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCA6Ci0JCQkJcmV0dXJuIGdldFB1YmxpY0lEKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0Tm90YXRpb24oKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXROb3RhdGlvbigpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXJldHVybiBnZXREVERFbnRpdHkoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCA6Ci0JCQkJcmV0dXJuIFNZU1RFTV9JRF9FREVGQVVMVCA9PSBudWxsID8gc3lzdGVtSUQgIT0gbnVsbCA6ICFTWVNURU1fSURfRURFRkFVTFQuZXF1YWxzKHN5c3RlbUlEKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19QVUJMSUNfSUQgOgotCQkJCXJldHVybiBQVUJMSUNfSURfRURFRkFVTFQgPT0gbnVsbCA/IHB1YmxpY0lEICE9IG51bGwgOiAhUFVCTElDX0lEX0VERUZBVUxULmVxdWFscyhwdWJsaWNJRCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCXJldHVybiBub3RhdGlvbiAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFIDoKLQkJCQlyZXR1cm4gZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXNldERUREVudGl0eSgoRFRERW50aXR5KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCA6Ci0JCQkJc2V0U3lzdGVtSUQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19QVUJMSUNfSUQgOgotCQkJCXNldFB1YmxpY0lEKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCXNldE5vdGF0aW9uKChEVEROb3RhdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFRF9GUk9NX0FOT1RIRVJfRklMRSA6Ci0JCQkJc2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgoRFRERmlsZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJc2V0RFRERW50aXR5KChEVERFbnRpdHkpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19TWVNURU1fSUQgOgotCQkJCXNldFN5c3RlbUlEKFNZU1RFTV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCA6Ci0JCQkJc2V0UHVibGljSUQoUFVCTElDX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCXNldE5vdGF0aW9uKChEVEROb3RhdGlvbikgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFIDoKLQkJCQlzZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKChEVERGaWxlKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzeXN0ZW1JRDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzeXN0ZW1JRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHVibGljSUQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHVibGljSUQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZGVmYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5YTUxTY2hlbWFEZWZpbmVkVHlwZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIERUREZhY3RvcnkgewotCXByb3RlY3RlZCBEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlX05PTkU7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfQ0RBVEE7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfSUQ7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfSURSRUY7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfSURSRUZTOwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlX0VOVElUWTsKLQlwcm90ZWN0ZWQgRFREQmFzaWNUeXBlIGR0ZEJhc2ljVHlwZV9FTlRJVElFUzsKLQlwcm90ZWN0ZWQgRFREQmFzaWNUeXBlIGR0ZEJhc2ljVHlwZV9OTVRPS0VOOwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlX05NVE9LRU5TOwotCi0KLQotCXB1YmxpYyBzdGF0aWMgRFRERmFjdG9yeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIChEVERGYWN0b3J5KSBnZXRQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9OT05FLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfTk9ORSgpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9OT05FID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfTk9ORSA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuQ0RBVEFfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9OT05FOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9DREFUQS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBEVERUeXBlCi0JICovCi0JcHVibGljIERURFR5cGUgZ2V0RFREQmFzaWNUeXBlX0NEQVRBKCkgewotCQlpZiAoZHRkQmFzaWNUeXBlX0NEQVRBID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfQ0RBVEEgPSBjcmVhdGVEVERCYXNpY1R5cGUoKSkuc2V0S2luZChEVERCYXNpY1R5cGVLaW5kLkNEQVRBX0xJVEVSQUwpOwotCQl9Ci0JCXJldHVybiBkdGRCYXNpY1R5cGVfQ0RBVEE7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHRkQmFzaWNUeXBlX0lELgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfSUQoKSB7Ci0JCWlmIChkdGRCYXNpY1R5cGVfSUQgPT0gbnVsbCkgewotCQkJKGR0ZEJhc2ljVHlwZV9JRCA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuSURfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9JRDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkdGRCYXNpY1R5cGVfSURSRUYuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFREVHlwZQotCSAqLwotCXB1YmxpYyBEVERUeXBlIGdldERUREJhc2ljVHlwZV9JRFJFRigpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9JRFJFRiA9PSBudWxsKSB7Ci0JCQkoZHRkQmFzaWNUeXBlX0lEUkVGID0gY3JlYXRlRFREQmFzaWNUeXBlKCkpLnNldEtpbmQoRFREQmFzaWNUeXBlS2luZC5JRFJFRl9MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX0lEUkVGOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9JRFJFRlMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFREVHlwZQotCSAqLwotCXB1YmxpYyBEVERUeXBlIGdldERUREJhc2ljVHlwZV9JRFJFRlMoKSB7Ci0JCWlmIChkdGRCYXNpY1R5cGVfSURSRUZTID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfSURSRUZTID0gY3JlYXRlRFREQmFzaWNUeXBlKCkpLnNldEtpbmQoRFREQmFzaWNUeXBlS2luZC5JRFJFRlNfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9JRFJFRlM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHRkQmFzaWNUeXBlX0VOVElUWS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBEVERUeXBlCi0JICovCi0JcHVibGljIERURFR5cGUgZ2V0RFREQmFzaWNUeXBlX0VOVElUWSgpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9FTlRJVFkgPT0gbnVsbCkgewotCQkJKGR0ZEJhc2ljVHlwZV9FTlRJVFkgPSBjcmVhdGVEVERCYXNpY1R5cGUoKSkuc2V0S2luZChEVERCYXNpY1R5cGVLaW5kLkVOVElUWV9MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX0VOVElUWTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkdGRCYXNpY1R5cGVfRU5USVRJRVMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFREVHlwZQotCSAqLwotCXB1YmxpYyBEVERUeXBlIGdldERUREJhc2ljVHlwZV9FTlRJVElFUygpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9FTlRJVElFUyA9PSBudWxsKSB7Ci0JCQkoZHRkQmFzaWNUeXBlX0VOVElUSUVTID0gY3JlYXRlRFREQmFzaWNUeXBlKCkpLnNldEtpbmQoRFREQmFzaWNUeXBlS2luZC5FTlRJVElFU19MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX0VOVElUSUVTOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9OTVRPS0VOLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfTk1UT0tFTigpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9OTVRPS0VOID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfTk1UT0tFTiA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTl9MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX05NVE9LRU47Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHRkQmFzaWNUeXBlX05NVE9LRU5TLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfTk1UT0tFTlMoKSB7Ci0JCWlmIChkdGRCYXNpY1R5cGVfTk1UT0tFTlMgPT0gbnVsbCkgewotCQkJKGR0ZEJhc2ljVHlwZV9OTVRPS0VOUyA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTlNfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9OTVRPS0VOUzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRER3JvdXBDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURUREF0dHJpYnV0ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERWxlbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFREQW55Q29udGVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlQgOgotCQkJCXJldHVybiBjcmVhdGVEVERQQ0RhdGFDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlQgOgotCQkJCXJldHVybiBjcmVhdGVEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERmlsZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFREQmFzaWNUeXBlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEUgOgotCQkJCXJldHVybiBjcmVhdGVEVERFbnVtZXJhdGlvblR5cGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT04gOgotCQkJCXJldHVybiBjcmVhdGVEVEROb3RhdGlvbigpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFkgOgotCQkJCXJldHVybiBjcmVhdGVEVERFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERXh0ZXJuYWxFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRESW50ZXJuYWxFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCXJldHVybiBjcmVhdGVEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9PQ0NVUlJFTkNFX1RZUEUgOgotCQkJCXJldHVybiBEVERPY2N1cnJlbmNlVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfREVGQVVMVF9LSU5EIDoKLQkJCQlyZXR1cm4gRFRERGVmYXVsdEtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfS0lORCA6Ci0JCQkJcmV0dXJuIERUREJhc2ljVHlwZUtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1fR1JPVVBfS0lORCA6Ci0JCQkJcmV0dXJuIERUREVudW1Hcm91cEtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0tJTkQgOgotCQkJCXJldHVybiBEVERHcm91cEtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuWE1MX1NDSEVNQV9ERUZJTkVEX1RZUEUgOgotCQkJCXJldHVybiBYTUxTY2hlbWFEZWZpbmVkVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfT0NDVVJSRU5DRV9UWVBFIDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfREVGQVVMVF9LSU5EIDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9LSU5EIDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTV9HUk9VUF9LSU5EIDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfS0lORCA6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuWE1MX1NDSEVNQV9ERUZJTkVEX1RZUEUgOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRER3JvdXBDb250ZW50IGNyZWF0ZURUREdyb3VwQ29udGVudCgpIHsKLQkJRFRER3JvdXBDb250ZW50SW1wbCBkdGRHcm91cENvbnRlbnQgPSBuZXcgRFRER3JvdXBDb250ZW50SW1wbCgpOwotCQlyZXR1cm4gZHRkR3JvdXBDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREQXR0cmlidXRlIGNyZWF0ZURUREF0dHJpYnV0ZSgpIHsKLQkJRFREQXR0cmlidXRlSW1wbCBkdGRBdHRyaWJ1dGUgPSBuZXcgRFREQXR0cmlidXRlSW1wbCgpOwotCQlyZXR1cm4gZHRkQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERWxlbWVudCBjcmVhdGVEVERFbGVtZW50KCkgewotCQlEVERFbGVtZW50SW1wbCBkdGRFbGVtZW50ID0gbmV3IERUREVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW1wdHlDb250ZW50IGNyZWF0ZURUREVtcHR5Q29udGVudCgpIHsKLQkJRFRERW1wdHlDb250ZW50SW1wbCBkdGRFbXB0eUNvbnRlbnQgPSBuZXcgRFRERW1wdHlDb250ZW50SW1wbCgpOwotCQlyZXR1cm4gZHRkRW1wdHlDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREQW55Q29udGVudCBjcmVhdGVEVERBbnlDb250ZW50KCkgewotCQlEVERBbnlDb250ZW50SW1wbCBkdGRBbnlDb250ZW50ID0gbmV3IERUREFueUNvbnRlbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRBbnlDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREUENEYXRhQ29udGVudCBjcmVhdGVEVERQQ0RhdGFDb250ZW50KCkgewotCQlEVERQQ0RhdGFDb250ZW50SW1wbCBkdGRwY0RhdGFDb250ZW50ID0gbmV3IERURFBDRGF0YUNvbnRlbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRwY0RhdGFDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgY3JlYXRlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKSB7Ci0JCURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50SW1wbCBkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudCA9IG5ldyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwoKTsKLQkJcmV0dXJuIGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBjcmVhdGVEVERGaWxlKCkgewotCQlEVERGaWxlSW1wbCBkdGRGaWxlID0gbmV3IERUREZpbGVJbXBsKCk7Ci0JCXJldHVybiBkdGRGaWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREQmFzaWNUeXBlIGNyZWF0ZURUREJhc2ljVHlwZSgpIHsKLQkJRFREQmFzaWNUeXBlSW1wbCBkdGRCYXNpY1R5cGUgPSBuZXcgRFREQmFzaWNUeXBlSW1wbCgpOwotCQlyZXR1cm4gZHRkQmFzaWNUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uVHlwZSgpIHsKLQkJRFRERW51bWVyYXRpb25UeXBlSW1wbCBkdGRFbnVtZXJhdGlvblR5cGUgPSBuZXcgRFRERW51bWVyYXRpb25UeXBlSW1wbCgpOwotCQlyZXR1cm4gZHRkRW51bWVyYXRpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRETm90YXRpb24gY3JlYXRlRFRETm90YXRpb24oKSB7Ci0JCURURE5vdGF0aW9uSW1wbCBkdGROb3RhdGlvbiA9IG5ldyBEVEROb3RhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGR0ZE5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGNyZWF0ZURUREVudGl0eSgpIHsKLQkJRFRERW50aXR5SW1wbCBkdGRFbnRpdHkgPSBuZXcgRFRERW50aXR5SW1wbCgpOwotCQlyZXR1cm4gZHRkRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERXh0ZXJuYWxFbnRpdHkgY3JlYXRlRFRERXh0ZXJuYWxFbnRpdHkoKSB7Ci0JCURUREV4dGVybmFsRW50aXR5SW1wbCBkdGRFeHRlcm5hbEVudGl0eSA9IG5ldyBEVERFeHRlcm5hbEVudGl0eUltcGwoKTsKLQkJcmV0dXJuIGR0ZEV4dGVybmFsRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRESW50ZXJuYWxFbnRpdHkgY3JlYXRlRFRESW50ZXJuYWxFbnRpdHkoKSB7Ci0JCURUREludGVybmFsRW50aXR5SW1wbCBkdGRJbnRlcm5hbEVudGl0eSA9IG5ldyBEVERJbnRlcm5hbEVudGl0eUltcGwoKTsKLQkJcmV0dXJuIGR0ZEludGVybmFsRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGNyZWF0ZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpIHsKLQkJRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbCBkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgPSBuZXcgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbCgpOwotCQlyZXR1cm4gZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBjcmVhdGVEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCkgewotCQlEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbCBkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50ID0gbmV3IERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREUGFja2FnZSBnZXREVERQYWNrYWdlKCkgewotCQlyZXR1cm4gKERURFBhY2thZ2UpIGdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFREUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREZpbGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM4NDZkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5hbWVkRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERQYXRobmFtZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFByaW50ZXI7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GaWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREZpbGVJbXBsI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERmlsZUltcGwjaXNQYXJzZUVycm9yIDxlbT5QYXJzZSBFcnJvcjwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERGaWxlSW1wbCNnZXREVERDb250ZW50IDxlbT5EVEQgQ29udGVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERGaWxlSW1wbCNnZXREVERFbnVtZXJhdGlvblR5cGUgPGVtPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREZpbGVJbXBsIGV4dGVuZHMgRU5hbWVkRWxlbWVudEltcGwgaW1wbGVtZW50cyBEVERGaWxlLCBFTmFtZWRFbGVtZW50IHsKLQotCXB1YmxpYyBFTGlzdCBnZXREVERPYmplY3QoKSB7Ci0JCXJldHVybiBnZXREVERDb250ZW50KCk7Ci0JfQotCi0KLQlwdWJsaWMgTGlzdCBsaXN0RFRERWxlbWVudCgpIHsKLQkJcmV0dXJuIGdldENvbnRlbnRMaXN0T2YoRFRERWxlbWVudC5jbGFzcywgbnVsbCk7Ci0JfQotCi0KLQlwdWJsaWMgTGlzdCBsaXN0RFRETm90YXRpb24oKSB7Ci0JCXJldHVybiBnZXRDb250ZW50TGlzdE9mKERURE5vdGF0aW9uLmNsYXNzLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBsaXN0RFRERW50aXR5KCkgewotCQlyZXR1cm4gZ2V0Q29udGVudExpc3RPZihEVERFbnRpdHkuY2xhc3MsIG51bGwpOwotCX0KLQotCXB1YmxpYyBMaXN0IGxpc3REVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBnZXRDb250ZW50TGlzdE9mKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5jbGFzcywgbnVsbCk7Ci0JfQotCi0JcHVibGljIExpc3QgbGlzdERUREVsZW1lbnRBbmREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBnZXRDb250ZW50TGlzdE9mKERUREVsZW1lbnQuY2xhc3MsIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldENvbnRlbnRMaXN0T2YoQ2xhc3MgY2xhc3MxLCBDbGFzcyBjbGFzczIpIHsKLQkJTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpID0gZ2V0RFREQ29udGVudCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJaWYgKGNsYXNzMS5pc0luc3RhbmNlKG9iaikpIHsKLQkJCQl2LmFkZChvYmopOwotCQkJfQotCQkJZWxzZSBpZiAoKGNsYXNzMiAhPSBudWxsKSAmJiAoY2xhc3MyLmlzSW5zdGFuY2Uob2JqKSkpIHsKLQkJCQl2LmFkZChvYmopOwotCQkJfQotCQl9Ci0JCXJldHVybiB2OwotCX0KLQotCXB1YmxpYyBEVERFbGVtZW50IGZpbmRFbGVtZW50KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3REVERFbGVtZW50KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERFbGVtZW50IGUgPSAoRFRERWxlbWVudCkgaS5uZXh0KCk7Ci0JCQlpZiAoZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERUREVudGl0eSBmaW5kRW50aXR5KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3REVERFbnRpdHkoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCURUREVudGl0eSBlID0gKERUREVudGl0eSkgaS5uZXh0KCk7Ci0JCQlpZiAoZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERURE5vdGF0aW9uIGZpbmROb3RhdGlvbihTdHJpbmcgbmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0RFRETm90YXRpb24oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCURURE5vdGF0aW9uIGUgPSAoRFRETm90YXRpb24pIGkubmV4dCgpOwotCQkJaWYgKGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZmluZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZSA9IChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIGkubmV4dCgpOwotCQkJaWYgKGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZShib29sZWFuIGluY2x1ZGUpIHsKLQkJRFREUHJpbnRlciBwcmludGVyID0gbmV3IERURFByaW50ZXIodHJ1ZSk7Ci0JCXByaW50ZXIudmlzaXREVERGaWxlKHRoaXMpOwotCQlyZXR1cm4gcHJpbnRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlPYmplY3RbXSByZXN1bHQgPSBEVERQYXRobmFtZVV0aWwucGFyc2VQYXRoQ29tcG9uZW50KHJlbGF0aXZlUGF0aCk7Ci0KLQotCQlTdHJpbmcgdHlwZSA9IChTdHJpbmcpIHJlc3VsdFswXTsKLQotCi0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCi0JCVN0cmluZyBuYW1lID0gKFN0cmluZykgcmVzdWx0WzFdOwotCi0JCURURE9iamVjdCBvYmogPSBudWxsOwotCQlpZiAodHlwZS5lcXVhbHMoIkVsZW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlvYmogPSBmaW5kRWxlbWVudChuYW1lKTsKLQkJfQotCQllbHNlIGlmICh0eXBlLmVxdWFscygiRW50IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJb2JqID0gZmluZEVudGl0eShuYW1lKTsKLQkJfQotCQllbHNlIGlmICh0eXBlLmVxdWFscygiUEVudCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCW9iaiA9IGZpbmRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UobmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZS5lcXVhbHMoIk5vdGEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlvYmogPSBmaW5kTm90YXRpb24obmFtZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0KLQkJU3RyaW5nIHJlc3RQYXRoID0gKFN0cmluZykgcmVzdWx0WzNdOwotCi0JCWlmICgocmVzdFBhdGggPT0gbnVsbCkgfHwgKG9iaiA9PSBudWxsKSkgewotCQkJcmV0dXJuIG9iajsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBvYmouZmluZE9iamVjdChyZXN0UGF0aCk7Ci0JCX0KLQl9Ci0KLQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW1lbnQoKSA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tbWVudCgpIDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21tZW50ID0gQ09NTUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1BhcnNlRXJyb3IoKSA8ZW0+UGFyc2UgRXJyb3I8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNpc1BhcnNlRXJyb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQQVJTRV9FUlJPUl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQYXJzZUVycm9yKCkgPGVtPlBhcnNlIEVycm9yPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjaXNQYXJzZUVycm9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZUVycm9yID0gUEFSU0VfRVJST1JfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREVERDb250ZW50KCkgPGVtPkRURCBDb250ZW50PC9lbT59JwotCSAqIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldERURENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkdGRDb250ZW50ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERUREVudW1lcmF0aW9uVHlwZSgpIDxlbT5EVEQgRW51bWVyYXRpb24gVHlwZTwvZW0+fScKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXREVERFbnVtZXJhdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkdGRFbnVtZXJhdGlvblR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERGaWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIG5ld0NvbW1lbnQpIHsKLQkJU3RyaW5nIG9sZENvbW1lbnQgPSBjb21tZW50OwotCQljb21tZW50ID0gbmV3Q29tbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVCwgb2xkQ29tbWVudCwgY29tbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnNlRXJyb3IoKSB7Ci0JCXJldHVybiBwYXJzZUVycm9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJzZUVycm9yKGJvb2xlYW4gbmV3UGFyc2VFcnJvcikgewotCQlib29sZWFuIG9sZFBhcnNlRXJyb3IgPSBwYXJzZUVycm9yOwotCQlwYXJzZUVycm9yID0gbmV3UGFyc2VFcnJvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1IsIG9sZFBhcnNlRXJyb3IsIHBhcnNlRXJyb3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERURENvbnRlbnQoKSB7Ci0JCWlmIChkdGRDb250ZW50ID09IG51bGwpIHsKLQkJCWR0ZENvbnRlbnQgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChEVERDb250ZW50LmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCwgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUpOwotCQl9Ci0JCXJldHVybiBkdGRDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RFRERW51bWVyYXRpb25UeXBlKCkgewotCQlpZiAoZHRkRW51bWVyYXRpb25UeXBlID09IG51bGwpIHsKLQkJCWR0ZEVudW1lcmF0aW9uVHlwZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KERUREVudW1lcmF0aW9uVHlwZS5jbGFzcywgdGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUsIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFKTsKLQkJfQotCQlyZXR1cm4gZHRkRW51bWVyYXRpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5UIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RFREQ29udGVudCgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldERUREVudW1lcmF0aW9uVHlwZSgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldERURENvbnRlbnQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXREVERFbnVtZXJhdGlvblR5cGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQgOgotCQkJCXJldHVybiBnZXRDb21tZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SIDoKLQkJCQlyZXR1cm4gaXNQYXJzZUVycm9yKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGdldERURENvbnRlbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUgOgotCQkJCXJldHVybiBnZXREVERFbnVtZXJhdGlvblR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SIDoKLQkJCQlzZXRQYXJzZUVycm9yKCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5UIDoKLQkJCQlnZXREVERDb250ZW50KCkuY2xlYXIoKTsKLQkJCQlnZXREVERDb250ZW50KCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSA6Ci0JCQkJZ2V0RFRERW51bWVyYXRpb25UeXBlKCkuY2xlYXIoKTsKLQkJCQlnZXREVERFbnVtZXJhdGlvblR5cGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVCA6Ci0JCQkJc2V0Q29tbWVudChDT01NRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SIDoKLQkJCQlzZXRQYXJzZUVycm9yKFBBUlNFX0VSUk9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5UIDoKLQkJCQlnZXREVERDb250ZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFIDoKLQkJCQlnZXREVERFbnVtZXJhdGlvblR5cGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIENPTU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGNvbW1lbnQgIT0gbnVsbCA6ICFDT01NRU5UX0VERUZBVUxULmVxdWFscyhjb21tZW50KTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1IgOgotCQkJCXJldHVybiBwYXJzZUVycm9yICE9IFBBUlNFX0VSUk9SX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGR0ZENvbnRlbnQgIT0gbnVsbCAmJiAhZ2V0RFREQ29udGVudCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUgOgotCQkJCXJldHVybiBkdGRFbnVtZXJhdGlvblR5cGUgIT0gbnVsbCAmJiAhZ2V0RFRERW51bWVyYXRpb25UeXBlKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb21tZW50OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNvbW1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcnNlRXJyb3I6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocGFyc2VFcnJvcik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBEVERGaWxlSW1wbAotCi0vLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0vLwotCi0vLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0vLyAvL3B1YmxpYyBjbGFzcyBEVERGaWxlSW1wbCBleHRlbmRzIEVOYW1lc3BhY2VJbXBsIGltcGxlbWVudHMgRFRERmlsZSwKLS8vIEVOYW1lc3BhY2V7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbgotLy8gMjAwMi4iOwotLy8KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgU3RyaW5nIGNvbW1lbnQgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBCb29sZWFuIHBhcnNlRXJyb3IgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBFTGlzdCBkdGRDb250ZW50ID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRUxpc3QgZHRkRW51bWVyYXRpb25UeXBlID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRDb21tZW50ID0gZmFsc2U7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0UGFyc2VFcnJvciA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFT2JqZWN0IGluaXRJbnN0YW5jZSgpIHsKLS8vIHNldEVNZXRhT2JqKGVDbGFzc0RUREZpbGUoKSk7Ci0vLyBpbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKTsKLS8vIHJldHVybiB0aGlzOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBEVERQYWNrYWdlIGVQYWNrYWdlRFREKCkgewotLy8gcmV0dXJuCi0vLyAoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFQ2xhc3MgZUNsYXNzRFRERmlsZSgpIHsKLS8vIHJldHVybgotLy8gKChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSkpLmdldERUREZpbGUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLS8vIGlmICh0aGlzLnNldENvbW1lbnQpIHJldHVybiB0aGlzLmNvbW1lbnQ7Ci0vLyBlbHNlIHJldHVybgotLy8gKFN0cmluZylEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX0NvbW1lbnQoKS5nZXREZWZhdWx0VmFsdWUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSkgewotLy8gcmVmU2V0VmFsdWVGb3JTaW1wbGVTRihEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX0NvbW1lbnQoKSx0aGlzLmNvbW1lbnQsdmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0Q29tbWVudCgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfQ29tbWVudCgpKSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXRDb21tZW50KCkgewotLy8gcmV0dXJuIHNldENvbW1lbnQ7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgQm9vbGVhbiBnZXRQYXJzZUVycm9yKCkgewotLy8gaWYgKHRoaXMuc2V0UGFyc2VFcnJvcikgcmV0dXJuIHRoaXMucGFyc2VFcnJvcjsKLS8vIGVsc2UgcmV0dXJuCi0vLyAoQm9vbGVhbilEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX1BhcnNlRXJyb3IoKS5nZXREZWZhdWx0VmFsdWUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzUGFyc2VFcnJvcigpIHsKLS8vIEJvb2xlYW4gcmVzdWx0ID0gZ2V0UGFyc2VFcnJvcigpOwotLy8gcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0LmJvb2xlYW5WYWx1ZSgpIDogZmFsc2U7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0UGFyc2VFcnJvcihCb29sZWFuIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfUGFyc2VFcnJvcigpLHRoaXMucGFyc2VFcnJvcix2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0UGFyc2VFcnJvcihib29sZWFuIHZhbHVlKSB7Ci0vLyBzZXRQYXJzZUVycm9yKHZhbHVlP0Jvb2xlYW4uVFJVRTpCb29sZWFuLkZBTFNFKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldFBhcnNlRXJyb3IoKSB7Ci0vLyBlTm90aWZ5KHJlZkJhc2ljVW5zZXRWYWx1ZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX1BhcnNlRXJyb3IoKSkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0UGFyc2VFcnJvcigpIHsKLS8vIHJldHVybiBzZXRQYXJzZUVycm9yOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIEVMaXN0IGdldERURENvbnRlbnQoKSB7Ci0vLyBpZiAodGhpcy5kdGRDb250ZW50PT1udWxsKSB7Ci0vLyB0aGlzLmR0ZENvbnRlbnQ9bmV3Q29sbGVjdGlvbih0aGlzLERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfRFREQ29udGVudCgpLAotLy8gdHJ1ZSk7Ci0vLyB9Ci0vLyByZXR1cm4gdGhpcy5kdGRDb250ZW50OwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIEVMaXN0IGdldERUREVudW1lcmF0aW9uVHlwZSgpIHsKLS8vIGlmICh0aGlzLmR0ZEVudW1lcmF0aW9uVHlwZT09bnVsbCkgewotLy8gdGhpcy5kdGRFbnVtZXJhdGlvblR5cGU9bmV3Q29sbGVjdGlvbih0aGlzLERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfRFRERW51bWVyYXRpb25UeXBlKCksCi0vLyB0cnVlKTsKLS8vIH0KLS8vIHJldHVybiB0aGlzLmR0ZEVudW1lcmF0aW9uVHlwZTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERmlsZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQ6IHJldHVybiBnZXRDb21tZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SOiByZXR1cm4gZ2V0UGFyc2VFcnJvcigpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVDogcmV0dXJuIGdldERURENvbnRlbnQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEU6IHJldHVybgotLy8gZ2V0RFRERW51bWVyYXRpb25UeXBlKCk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCByZWZCYXNpY1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREZpbGUoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UOgotLy8gcmV0dXJuIHRoaXMuc2V0Q29tbWVudD8gdGhpcy5jb21tZW50IDogbnVsbDsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1I6Ci0vLyByZXR1cm4gdGhpcy5zZXRQYXJzZUVycm9yPyB0aGlzLnBhcnNlRXJyb3IgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVDoKLS8vIHJldHVybiB0aGlzLmR0ZENvbnRlbnQ7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFOgotLy8gcmV0dXJuIHRoaXMuZHRkRW51bWVyYXRpb25UeXBlOwotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1ZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREZpbGUoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UOiByZXR1cm4gaXNTZXRDb21tZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SOiByZXR1cm4gaXNTZXRQYXJzZUVycm9yKCk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyBzdXBlci5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERmlsZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQ6IHsKLS8vIHNldENvbW1lbnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SOiB7Ci0vLyBzZXRQYXJzZUVycm9yKChuZXdWYWx1ZSBpbnN0YW5jZW9mCi0vLyBTdHJpbmcpP0Jvb2xlYW4udmFsdWVPZigoU3RyaW5nKW5ld1ZhbHVlKTooQm9vbGVhbiluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotLy8gfQotLy8gc3VwZXIuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE5vdGlmaWNhdGlvbiBlQmFzaWNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLS8vIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUJhc2ljU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERmlsZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29tbWVudDsKLS8vIHRoaXMuY29tbWVudCA9IChTdHJpbmcpbmV3VmFsdWU7Ci0vLyB0aGlzLnNldENvbW1lbnQgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX0NvbW1lbnQoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnBhcnNlRXJyb3I7Ci0vLyB0aGlzLnBhcnNlRXJyb3IgPSAoQm9vbGVhbiluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0UGFyc2VFcnJvciA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfUGFyc2VFcnJvcigpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUJhc2ljU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyBzdXBlci5lVW5zZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREZpbGUoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UOiB7Ci0vLyB1bnNldENvbW1lbnQoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1I6IHsKLS8vIHVuc2V0UGFyc2VFcnJvcigpOwotLy8gcmV0dXJuOwotLy8gfQotLy8KLS8vIH0KLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIHJlZkJhc2ljVW5zZXRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREZpbGUoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNvbW1lbnQ7Ci0vLyB0aGlzLmNvbW1lbnQgPSBudWxsOwotLy8gdGhpcy5zZXRDb21tZW50ID0gZmFsc2U7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlVOU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERmlsZV9Db21tZW50KCksb2xkVmFsdWUsZ2V0Q29tbWVudCgpKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1I6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMucGFyc2VFcnJvcjsKLS8vIHRoaXMucGFyc2VFcnJvciA9IG51bGw7Ci0vLyB0aGlzLnNldFBhcnNlRXJyb3IgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX1BhcnNlRXJyb3IoKSxvbGRWYWx1ZSxnZXRQYXJzZUVycm9yKCkpOwotLy8gfQotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLS8vIFN0cmluZyBvdXQ9IigiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotLy8gYm9vbGVhbiBmaXJzdD10cnVlOwotLy8gYm9vbGVhbiBlbXB0eUxpc3Q9dHJ1ZTsKLS8vIGlmKGlzU2V0Q29tbWVudCgpKSB7Ci0vLyBpZighZW1wdHlMaXN0KSBvdXQrPSIsICI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0vLyBvdXQrPSJjb21tZW50OiAiK3RoaXMuY29tbWVudDsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLS8vIGZpcnN0PWZhbHNlOwotLy8gZW1wdHlMaXN0PWZhbHNlOwotLy8gfQotLy8gaWYoaXNTZXRQYXJzZUVycm9yKCkpIHsKLS8vIGlmKCFlbXB0eUxpc3QpIG91dCs9IiwgIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLS8vIG91dCs9InBhcnNlRXJyb3I6ICIrdGhpcy5wYXJzZUVycm9yOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotLy8gZmlyc3Q9ZmFsc2U7Ci0vLyBlbXB0eUxpc3Q9ZmFsc2U7Ci0vLyB9Ci0vLyBvdXQrPSIpIjsKLS8vIGlmICghZmlyc3QpIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIiAiICtvdXQ7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0vLyByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLS8vIH0KLS8vIH0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERHcm91cENvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRER3JvdXBDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmE4MjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERHcm91cENvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUHJpbnRlcjsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREdyb3VwQ29udGVudEltcGwgZXh0ZW5kcyBEVERSZXBlYXRhYmxlQ29udGVudEltcGwgaW1wbGVtZW50cyBEVERHcm91cENvbnRlbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cEtpbmQoKSA8ZW0+R3JvdXAgS2luZDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEdyb3VwS2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEVERHcm91cEtpbmQgR1JPVVBfS0lORF9FREVGQVVMVCA9IERUREdyb3VwS2luZC5TRVFVRU5DRV9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERUREdyb3VwS2luZCBncm91cEtpbmQgPSBHUk9VUF9LSU5EX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb250ZW50ID0gbnVsbDsKLQotCXB1YmxpYyBEVERHcm91cENvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREdyb3VwQ29udGVudCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFBvc2l0aW9uKERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpIHsKLQkJRUxpc3QgbGlzdCA9IGdldENvbnRlbnQoKTsKLQkJcmV0dXJuIGxpc3QuaW5kZXhPZihjb250ZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnROYW1lKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnREZXRhaWwoKSB7Ci0JCURURFByaW50ZXIgcHJpbnRlciA9IG5ldyBEVERQcmludGVyKGZhbHNlKTsKLQkJcHJpbnRlci52aXNpdERUREdyb3VwQ29udGVudCh0aGlzKTsKLQotCQlyZXR1cm4gcHJpbnRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBEVERHcm91cEtpbmQgZ2V0R3JvdXBLaW5kKCkgewotCQlyZXR1cm4gZ3JvdXBLaW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcm91cEtpbmQoRFRER3JvdXBLaW5kIG5ld0dyb3VwS2luZCkgewotCQlEVERHcm91cEtpbmQgb2xkR3JvdXBLaW5kID0gZ3JvdXBLaW5kOwotCQlncm91cEtpbmQgPSBuZXdHcm91cEtpbmQgPT0gbnVsbCA/IEdST1VQX0tJTkRfRURFRkFVTFQgOiBuZXdHcm91cEtpbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQX0tJTkQsIG9sZEdyb3VwS2luZCwgZ3JvdXBLaW5kKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkgewotCQkJY29udGVudCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KERUREVsZW1lbnRDb250ZW50LmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5UIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0Q29udGVudCgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5UIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0Q29udGVudCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQoKSA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQoKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERHcm91cENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIERUREVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQoKSwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gZ2V0T2NjdXJyZW5jZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUF9LSU5EIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXBLaW5kKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgOgotCQkJCXJldHVybiBnZXRDb250ZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gb2NjdXJyZW5jZSAhPSBPQ0NVUlJFTkNFX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUF9LSU5EIDoKLQkJCQlyZXR1cm4gZ3JvdXBLaW5kICE9IEdST1VQX0tJTkRfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgOgotCQkJCXJldHVybiBjb250ZW50ICE9IG51bGwgJiYgIWdldENvbnRlbnQoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlzZXRPY2N1cnJlbmNlKChEVERPY2N1cnJlbmNlVHlwZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVBfS0lORCA6Ci0JCQkJc2V0R3JvdXBLaW5kKChEVERHcm91cEtpbmQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgOgotCQkJCWdldENvbnRlbnQoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnQoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoT0NDVVJSRU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUF9LSU5EIDoKLQkJCQlzZXRHcm91cEtpbmQoR1JPVVBfS0lORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5UIDoKLQkJCQlnZXRDb250ZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cEtpbmQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZ3JvdXBLaW5kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRESWRIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERJZEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGRlZWIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERJZEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBEVERJZEhlbHBlciB7Ci0JcHVibGljIERURElkSGVscGVyKCkgewotCX0KLQotCXB1YmxpYyBTdHJpbmcgY29tcHV0ZUNvbnRlbnRJZChEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0JCVN0cmluZyBpZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW1wdHlDb250ZW50KSB7Ci0JCQlpZCA9ICIjRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFBDRGF0YUNvbnRlbnQpIHsKLQkJCWlkID0gIiNQQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVtcHR5Q29udGVudCkgewotCQkJaWQgPSAiI0VNUFRZIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJaWQgPSAiIyIgKyAoKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KS5nZXRSZWZlcmVuY2VkRWxlbWVudCgpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQlpZCA9ICIjIiArICgoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgY29udGVudCkuZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRER3JvdXBDb250ZW50KSB7Ci0JCQlpZCA9IGNvbXB1dGVHcm91cElkKChEVERHcm91cENvbnRlbnQpIGNvbnRlbnQpOwotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNvbXB1dGVHcm91cElkKERUREdyb3VwQ29udGVudCBncnApIHsKLQkJU3RyaW5nIGdyb3VwSWQgPSAiXyI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGdyb3VwSWQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZUNvbnRlbnRJZEdlbihEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0KLQkJU3RyaW5nIGlkID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbXB0eUNvbnRlbnQpIHsKLQkJCWlkID0gIiNFTVBUWSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCkgewotCQkJaWQgPSAiI1BDREFUQSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW1wdHlDb250ZW50KSB7Ci0JCQlpZCA9ICIjRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQlpZCA9ICIjIiArICgoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIGNvbnRlbnQpLmdldFJlZmVyZW5jZWRFbGVtZW50KCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCWlkID0gIiMiICsgKChEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KS5nZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpIHsKLQkJCWlkID0gY29tcHV0ZUdyb3VwSWQoKERUREdyb3VwQ29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVHcm91cElkR2VuKERUREdyb3VwQ29udGVudCBncnApIHsKLQotCQlTdHJpbmcgZ3JvdXBJZCA9ICJfIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZ3JvdXBJZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRESW50ZXJuYWxFbnRpdHlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRESW50ZXJuYWxFbnRpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMzYxNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREludGVybmFsRW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnRleHQuU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERJbnRlcm5hbEVudGl0eUltcGwgZXh0ZW5kcyBEVERFbnRpdHlDb250ZW50SW1wbCBpbXBsZW1lbnRzIERUREludGVybmFsRW50aXR5IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JcHVibGljIERUREludGVybmFsRW50aXR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERJbnRlcm5hbEVudGl0eSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZSgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcig2NCk7Ci0JCWlmIChnZXRWYWx1ZSgpID09IG51bGwpCi0JCQlzYi5hcHBlbmQoIlwiXCIiKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlIHsKLQkJCXNiLmFwcGVuZCgiXCIiKS5hcHBlbmQocmVwbGFjZURvdWJsZVF1b3RlcyhnZXRWYWx1ZSgpKSkuYXBwZW5kKCJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyB0aGlzIG1ldGhvZCByZXBsYWNlcyBhbnkgb2NjdXJyZW5jZSBvZiAnICIgJyB3aXRoIHRoZSBlcXVpdmFsZW50IHZhbHVlCi0JLy8gb2YgJiMzNDsKLQlwcml2YXRlIFN0cmluZyByZXBsYWNlRG91YmxlUXVvdGVzKFN0cmluZyBpbnB1dCkgewotCQlTdHJpbmdCdWZmZXIgbmV3VmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IgY2hhcmFjdGVycyA9IG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcihpbnB1dCk7Ci0KLQkJd2hpbGUgKGNoYXJhY3RlcnMuY3VycmVudCgpICE9IENoYXJhY3Rlckl0ZXJhdG9yLkRPTkUpIHsKLQkJCWNoYXIgY3VycmVudCA9IGNoYXJhY3RlcnMuY3VycmVudCgpOwotCi0JCQlpZiAoY3VycmVudCA9PSAnIicpIHsKLQkJCQluZXdWYWx1ZS5hcHBlbmQoIiYjMzQ7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld1ZhbHVlLmFwcGVuZChjdXJyZW50KTsKLQkJCX0KLQkJCWNoYXJhY3RlcnMubmV4dCgpOwotCQl9Ci0KLQkJcmV0dXJuIG5ld1ZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQoKSA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXJldHVybiBnZXREVERFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19WQUxVRSA6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXJldHVybiBnZXREVERFbnRpdHkoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX1ZBTFVFIDoKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQlzZXREVERFbnRpdHkoKERUREVudGl0eSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19WQUxVRSA6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJc2V0RFRERW50aXR5KChEVERFbnRpdHkpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19WQUxVRSA6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRETm90YXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRETm90YXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0Mzc0Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURE5vdGF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURExleGljYWxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERQYXRobmFtZVV0aWw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Tm90YXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRETm90YXRpb25JbXBsI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRETm90YXRpb25JbXBsI2dldFN5c3RlbUlEIDxlbT5TeXN0ZW0gSUQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRETm90YXRpb25JbXBsI2dldFB1YmxpY0lEIDxlbT5QdWJsaWMgSUQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRETm90YXRpb25JbXBsI2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERURE5vdGF0aW9uSW1wbCBleHRlbmRzIERURENvbnRlbnRJbXBsIGltcGxlbWVudHMgRFRETm90YXRpb24sIERURENvbnRlbnQgewotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChudWxsLCAiTm90YSIsIGdldE5hbWUoKSwgLTEpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vIHVnbHkgaGFjayBmb3Igbm93IHNpbmNlIHdlIGRvbid0IGhhdmUgbXVsdGlwbGUgaW5oZXJpdGFuY2UuCi0JLy8gV291bGQgcmF0aGVyIGhhdmUgYWxsIHRoaXMgc3R1ZmYgaW4gYSBiYXNlIGNsYXNzIGJ1dCB0aGVzZQotCS8vIGNsYXNzZXMgYXJlIGluaGVyaXRpbmcgZnJvbSBzb21ldGltZXMgZGlmZmVyZW50IG1vZiBjbGFzc2VzCi0JRFRETGV4aWNhbEluZm8gbGV4SW5mbyA9IG5ldyBEVERMZXhpY2FsSW5mbygpOwotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0U3RhcnRPZmZzZXQodik7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldEVuZE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tbWVudCgpIDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21tZW50KCkgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbW1lbnQgPSBDT01NRU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN5c3RlbUlEKCkgPGVtPlN5c3RlbSBJRDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFN5c3RlbUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3lzdGVtSUQoKSA8ZW0+U3lzdGVtIElEPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0U3lzdGVtSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3lzdGVtSUQgPSBTWVNURU1fSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVibGljSUQoKSA8ZW0+UHVibGljIElEPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0UHVibGljSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdWJsaWNJRCgpIDxlbT5QdWJsaWMgSUQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRQdWJsaWNJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwdWJsaWNJRCA9IFBVQkxJQ19JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudGl0eSgpIDxlbT5FbnRpdHk8L2VtPn0nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVudGl0eSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERURE5vdGF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBuZXdDb21tZW50KSB7Ci0JCVN0cmluZyBvbGRDb21tZW50ID0gY29tbWVudDsKLQkJY29tbWVudCA9IG5ld0NvbW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19DT01NRU5ULCBvbGRDb21tZW50LCBjb21tZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSUQoKSB7Ci0JCXJldHVybiBzeXN0ZW1JRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSUQoU3RyaW5nIG5ld1N5c3RlbUlEKSB7Ci0JCVN0cmluZyBvbGRTeXN0ZW1JRCA9IHN5c3RlbUlEOwotCQlzeXN0ZW1JRCA9IG5ld1N5c3RlbUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lELCBvbGRTeXN0ZW1JRCwgc3lzdGVtSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJRCgpIHsKLQkJcmV0dXJuIHB1YmxpY0lEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNJRChTdHJpbmcgbmV3UHVibGljSUQpIHsKLQkJU3RyaW5nIG9sZFB1YmxpY0lEID0gcHVibGljSUQ7Ci0JCXB1YmxpY0lEID0gbmV3UHVibGljSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQsIG9sZFB1YmxpY0lELCBwdWJsaWNJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RW50aXR5KCkgewotCQlpZiAoZW50aXR5ID09IG51bGwpIHsKLQkJCWVudGl0eSA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdChEVERFeHRlcm5hbEVudGl0eS5jbGFzcywgdGhpcywgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWSwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTik7Ci0JCX0KLQkJcmV0dXJuIGVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RW50aXR5KCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFkgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFbnRpdHkoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKCkpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5ULCBEVERGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlEKCksIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRSA6Ci0JCQkJcmV0dXJuIGdldERUREZpbGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQgOgotCQkJCXJldHVybiBnZXRDb21tZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQgOgotCQkJCXJldHVybiBnZXRTeXN0ZW1JRCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEIDoKLQkJCQlyZXR1cm4gZ2V0UHVibGljSUQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGdldEVudGl0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1NZU1RFTV9JRCA6Ci0JCQkJc2V0U3lzdGVtSUQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRCA6Ci0JCQkJc2V0UHVibGljSUQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWSA6Ci0JCQkJZ2V0RW50aXR5KCkuY2xlYXIoKTsKLQkJCQlnZXRFbnRpdHkoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KENPTU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1NZU1RFTV9JRCA6Ci0JCQkJc2V0U3lzdGVtSUQoU1lTVEVNX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQgOgotCQkJCXNldFB1YmxpY0lEKFBVQkxJQ19JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZIDoKLQkJCQlnZXRFbnRpdHkoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19DT01NRU5UIDoKLQkJCQlyZXR1cm4gQ09NTUVOVF9FREVGQVVMVCA9PSBudWxsID8gY29tbWVudCAhPSBudWxsIDogIUNPTU1FTlRfRURFRkFVTFQuZXF1YWxzKGNvbW1lbnQpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEIDoKLQkJCQlyZXR1cm4gU1lTVEVNX0lEX0VERUZBVUxUID09IG51bGwgPyBzeXN0ZW1JRCAhPSBudWxsIDogIVNZU1RFTV9JRF9FREVGQVVMVC5lcXVhbHMoc3lzdGVtSUQpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEIDoKLQkJCQlyZXR1cm4gUFVCTElDX0lEX0VERUZBVUxUID09IG51bGwgPyBwdWJsaWNJRCAhPSBudWxsIDogIVBVQkxJQ19JRF9FREVGQVVMVC5lcXVhbHMocHVibGljSUQpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZIDoKLQkJCQlyZXR1cm4gZW50aXR5ICE9IG51bGwgJiYgIWdldEVudGl0eSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29tbWVudDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjb21tZW50KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzeXN0ZW1JRDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzeXN0ZW1JRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHVibGljSUQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHVibGljSUQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gRFRETm90YXRpb25JbXBsCi0KLS8vICsrKysrKysrKysrKysrKysrKytHRU5FUklDUlVMRVMuSlNFRCsrKysrKysrKysrKysrKysrKysKLS8vCi0KLS8vICsrKysrKysrKysrKysrKysrKytHRU5FUklDUlVMRVMuSlNFRCsrKysrKysrKysrKysrKysrKysKLS8vIC8vcHVibGljIGNsYXNzIERURE5vdGF0aW9uSW1wbCBleHRlbmRzIEVOYW1lc3BhY2VJbXBsIGltcGxlbWVudHMKLS8vIERURE5vdGF0aW9uLCBFTmFtZXNwYWNlLCBEVERDb250ZW50ewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24KLS8vIDIwMDIuIjsKLS8vCi0vLyBwdWJsaWMgRFRETm90YXRpb25JbXBsKCkKLS8vIHsKLS8vIHN1cGVyKCk7Ci0vLyB9Ci0vLyBwdWJsaWMgU3RyaW5nIGdldFBhdGhuYW1lKCkKLS8vIHsKLS8vIHJldHVybiBEVERQYXRobmFtZVV0aWwubWFrZVBhdGgobnVsbCwgIk5vdGEiLCBnZXROYW1lKCksIC0xKTsKLS8vIH0KLS8vCi0vLyBwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkKLS8vIHsKLS8vIHJldHVybiBudWxsOwotLy8gfQotLy8KLS8vIC8vIHVnbHkgaGFjayBmb3Igbm93IHNpbmNlIHdlIGRvbid0IGhhdmUgbXVsdGlwbGUgaW5oZXJpdGFuY2UuCi0vLyAvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0vLyAvLyBjbGFzc2VzIGFyZSBpbmhlcml0aW5nIGZyb20gc29tZXRpbWVzIGRpZmZlcmVudCBtb2YgY2xhc3NlcwotLy8gRFRETGV4aWNhbEluZm8gbGV4SW5mbyA9IG5ldyBEVERMZXhpY2FsSW5mbygpOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgU3RyaW5nIGNvbW1lbnQgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBTdHJpbmcgc3lzdGVtSUQgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBTdHJpbmcgcHVibGljSUQgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBFTGlzdCBlbnRpdHkgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBib29sZWFuIHNldENvbW1lbnQgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRTeXN0ZW1JRCA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBib29sZWFuIHNldFB1YmxpY0lEID0gZmFsc2U7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJpdmF0ZSBEVERDb250ZW50SW1wbCBkdGRDb250ZW50RGVsZWdhdGUgPSBudWxsOwotLy8gLyoqCi0vLyAqIEdldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0vLyAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0vLyAqLwotLy8gcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpCi0vLyB7Ci0vLyByZXR1cm4gbGV4SW5mby5nZXRTdGFydE9mZnNldCgpOwotLy8gfQotLy8gIAotLy8gLyoqCi0vLyAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0vLyAqIEBwYXJhbSB2IFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgdikKLS8vIHsKLS8vIGxleEluZm8uc2V0U3RhcnRPZmZzZXQodik7Ci0vLyB9Ci0vLyAgCi0vLyAvKioKLS8vICogR2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0vLyAqIEByZXR1cm4gdmFsdWUgb2YgZW5kT2Zmc2V0LgotLy8gKi8KLS8vIHB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkKLS8vIHsKLS8vIHJldHVybiBsZXhJbmZvLmdldEVuZE9mZnNldCgpOwotLy8gfQotLy8gIAotLy8gLyoqCi0vLyAqIFNldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotLy8gKiBAcGFyYW0gdiBWYWx1ZSB0byBhc3NpZ24gdG8gZW5kT2Zmc2V0LgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldEVuZE9mZnNldChpbnQgdikKLS8vIHsKLS8vIGxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFT2JqZWN0IGluaXRJbnN0YW5jZSgpIHsKLS8vIHNldEVNZXRhT2JqKGVDbGFzc0RURE5vdGF0aW9uKCkpOwotLy8gaW5pdEluc3RhbmNlRGVsZWdhdGVzKCk7Ci0vLyByZXR1cm4gdGhpczsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgdm9pZCBpbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKSB7Ci0vLyBzdXBlci5pbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKTsKLS8vCi0vLyBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5yZWZTZXREZWxlZ2F0ZU93bmVyKHRoaXMpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBEVERQYWNrYWdlIGVQYWNrYWdlRFREKCkgewotLy8gcmV0dXJuCi0vLyAoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFQ2xhc3MgZUNsYXNzRFRETm90YXRpb24oKSB7Ci0vLyByZXR1cm4KLS8vICgoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpKS5nZXREVEROb3RhdGlvbigpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgewotLy8gaWYgKHRoaXMuc2V0Q29tbWVudCkgcmV0dXJuIHRoaXMuY29tbWVudDsKLS8vIGVsc2UgcmV0dXJuCi0vLyAoU3RyaW5nKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX0NvbW1lbnQoKS5nZXREZWZhdWx0VmFsdWUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSkgewotLy8gcmVmU2V0VmFsdWVGb3JTaW1wbGVTRihEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9Db21tZW50KCksdGhpcy5jb21tZW50LHZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldENvbW1lbnQoKSB7Ci0vLyBlTm90aWZ5KHJlZkJhc2ljVW5zZXRWYWx1ZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9Db21tZW50KCkpKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldENvbW1lbnQoKSB7Ci0vLyByZXR1cm4gc2V0Q29tbWVudDsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSUQoKSB7Ci0vLyBpZiAodGhpcy5zZXRTeXN0ZW1JRCkgcmV0dXJuIHRoaXMuc3lzdGVtSUQ7Ci0vLyBlbHNlIHJldHVybgotLy8gKFN0cmluZylEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9TeXN0ZW1JRCgpLmdldERlZmF1bHRWYWx1ZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldFN5c3RlbUlEKFN0cmluZyB2YWx1ZSkgewotLy8gcmVmU2V0VmFsdWVGb3JTaW1wbGVTRihEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9TeXN0ZW1JRCgpLHRoaXMuc3lzdGVtSUQsdmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0U3lzdGVtSUQoKSB7Ci0vLyBlTm90aWZ5KHJlZkJhc2ljVW5zZXRWYWx1ZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9TeXN0ZW1JRCgpKSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXRTeXN0ZW1JRCgpIHsKLS8vIHJldHVybiBzZXRTeXN0ZW1JRDsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSUQoKSB7Ci0vLyBpZiAodGhpcy5zZXRQdWJsaWNJRCkgcmV0dXJuIHRoaXMucHVibGljSUQ7Ci0vLyBlbHNlIHJldHVybgotLy8gKFN0cmluZylEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9QdWJsaWNJRCgpLmdldERlZmF1bHRWYWx1ZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldFB1YmxpY0lEKFN0cmluZyB2YWx1ZSkgewotLy8gcmVmU2V0VmFsdWVGb3JTaW1wbGVTRihEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9QdWJsaWNJRCgpLHRoaXMucHVibGljSUQsdmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0UHVibGljSUQoKSB7Ci0vLyBlTm90aWZ5KHJlZkJhc2ljVW5zZXRWYWx1ZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9QdWJsaWNJRCgpKSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXRQdWJsaWNJRCgpIHsKLS8vIHJldHVybiBzZXRQdWJsaWNJRDsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBFTGlzdCBnZXRFbnRpdHkoKSB7Ci0vLyBpZiAodGhpcy5lbnRpdHk9PW51bGwpIHsKLS8vIHRoaXMuZW50aXR5PW5ld0NvbGxlY3Rpb24odGhpcyxEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9FbnRpdHkoKSwKLS8vIHRydWUpOwotLy8gfQotLy8gcmV0dXJuIHRoaXMuZW50aXR5OwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVEROb3RhdGlvbigpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19DT01NRU5UOiByZXR1cm4gZ2V0Q29tbWVudCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEOiByZXR1cm4gZ2V0U3lzdGVtSUQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRDogcmV0dXJuIGdldFB1YmxpY0lEKCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFk6IHJldHVybiBnZXRFbnRpdHkoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFOiByZXR1cm4gZ2V0RFRERmlsZSgpOwotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBPYmplY3QgcmVmQmFzaWNWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1ZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVEROb3RhdGlvbigpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19DT01NRU5UOgotLy8gcmV0dXJuIHRoaXMuc2V0Q29tbWVudD8gdGhpcy5jb21tZW50IDogbnVsbDsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1NZU1RFTV9JRDoKLS8vIHJldHVybiB0aGlzLnNldFN5c3RlbUlEPyB0aGlzLnN5c3RlbUlEIDogbnVsbDsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRDoKLS8vIHJldHVybiB0aGlzLnNldFB1YmxpY0lEPyB0aGlzLnB1YmxpY0lEIDogbnVsbDsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWToKLS8vIHJldHVybiB0aGlzLmVudGl0eTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFOiByZXR1cm4KLS8vICgoSW50ZXJuYWxFT2JqZWN0KWdldER0ZENvbnRlbnREZWxlZ2F0ZSgpKS5yZWZCYXNpY1ZhbHVlKGZlYXR1cmUpOwotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1ZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURE5vdGF0aW9uKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQ6IHJldHVybiBpc1NldENvbW1lbnQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1NZU1RFTV9JRDogcmV0dXJuIGlzU2V0U3lzdGVtSUQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRDogcmV0dXJuIGlzU2V0UHVibGljSUQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFOiByZXR1cm4gaXNTZXREVERGaWxlKCk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyBzdXBlci5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRETm90YXRpb24oKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVDogewotLy8gc2V0Q29tbWVudCgoU3RyaW5nKW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1NZU1RFTV9JRDogewotLy8gc2V0U3lzdGVtSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQ6IHsKLS8vIHNldFB1YmxpY0lEKChTdHJpbmcpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEU6IHsKLS8vIHNldERUREZpbGUoKERUREZpbGUpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8KLS8vIH0KLS8vIHN1cGVyLmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBOb3RpZmljYXRpb24gZUJhc2ljU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0vLyB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVCYXNpY1NldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURE5vdGF0aW9uKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29tbWVudDsKLS8vIHRoaXMuY29tbWVudCA9IChTdHJpbmcpbmV3VmFsdWU7Ci0vLyB0aGlzLnNldENvbW1lbnQgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9Db21tZW50KCksb2xkVmFsdWUsbmV3VmFsdWUpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnN5c3RlbUlEOwotLy8gdGhpcy5zeXN0ZW1JRCA9IChTdHJpbmcpbmV3VmFsdWU7Ci0vLyB0aGlzLnNldFN5c3RlbUlEID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fU3lzdGVtSUQoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMucHVibGljSUQ7Ci0vLyB0aGlzLnB1YmxpY0lEID0gKFN0cmluZyluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0UHVibGljSUQgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9QdWJsaWNJRCgpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUJhc2ljU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyBzdXBlci5lVW5zZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURE5vdGF0aW9uKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQ6IHsKLS8vIHVuc2V0Q29tbWVudCgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEOiB7Ci0vLyB1bnNldFN5c3RlbUlEKCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQ6IHsKLS8vIHVuc2V0UHVibGljSUQoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFOiB7Ci0vLyB1bnNldERUREZpbGUoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vCi0vLyB9Ci0vLyBzdXBlci5lVW5zZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE5vdGlmaWNhdGlvbiByZWZCYXNpY1Vuc2V0VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNVbnNldFZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVEROb3RhdGlvbigpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19DT01NRU5UOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNvbW1lbnQ7Ci0vLyB0aGlzLmNvbW1lbnQgPSBudWxsOwotLy8gdGhpcy5zZXRDb21tZW50ID0gZmFsc2U7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlVOU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fQ29tbWVudCgpLG9sZFZhbHVlLGdldENvbW1lbnQoKSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuc3lzdGVtSUQ7Ci0vLyB0aGlzLnN5c3RlbUlEID0gbnVsbDsKLS8vIHRoaXMuc2V0U3lzdGVtSUQgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9TeXN0ZW1JRCgpLG9sZFZhbHVlLGdldFN5c3RlbUlEKCkpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnB1YmxpY0lEOwotLy8gdGhpcy5wdWJsaWNJRCA9IG51bGw7Ci0vLyB0aGlzLnNldFB1YmxpY0lEID0gZmFsc2U7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlVOU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fUHVibGljSUQoKSxvbGRWYWx1ZSxnZXRQdWJsaWNJRCgpKTsKLS8vIH0KLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNVbnNldFZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBEVERDb250ZW50SW1wbCBnZXREdGRDb250ZW50RGVsZWdhdGUoKSB7Ci0vLyBpZiAoZHRkQ29udGVudERlbGVnYXRlID09IG51bGwpIHsKLS8vIERURFBhY2thZ2UgcGtnID0KLS8vIChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyBkdGRDb250ZW50RGVsZWdhdGU9KERURENvbnRlbnRJbXBsKXBrZy5lQ3JlYXRlSW5zdGFuY2UocGtnLkRURF9DT05URU5UKTsKLS8vIGR0ZENvbnRlbnREZWxlZ2F0ZS5pbml0SW5zdGFuY2UoKTsKLS8vIH0KLS8vIHJldHVybiBkdGRDb250ZW50RGVsZWdhdGU7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVDbGFzcyBlQ2xhc3NEVERDb250ZW50KCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmVDbGFzcygpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuZ2V0RFRERmlsZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldERUREZpbGUoRFRERmlsZSB2YWx1ZSkgewotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuc2V0RFRERmlsZSh2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXREVERGaWxlKCkgewotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkudW5zZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXREVERGaWxlKCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmlzU2V0RFRERmlsZSgpOwotLy8gfQotLy8gfQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUENEYXRhQ29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERQQ0RhdGFDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmFlZGFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERQQ0RhdGFDb250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERURFBDRGF0YUNvbnRlbnRJbXBsIGV4dGVuZHMgRFRERWxlbWVudENvbnRlbnRJbXBsIGltcGxlbWVudHMgRFREUENEYXRhQ29udGVudCB7Ci0KLQlwdWJsaWMgRFREUENEYXRhQ29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREUENEYXRhQ29udGVudCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQoKSA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQoKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQsIERUREdyb3VwQ29udGVudC5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlEKCksIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnROYW1lKCkgewotCQlyZXR1cm4gIiNQQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFBhY2thZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFiMWQyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FY29yZVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQW55Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVtcHR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuWE1MU2NoZW1hRGVmaW5lZFR5cGU7Ci0KLQotLyoqCi0gKiBAbGFzdGdlbiBjbGFzcyBEVERQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIERURFBhY2thZ2UsCi0gKiAgICAgICAgICBFUGFja2FnZSB7fQotICovCi1wdWJsaWMgY2xhc3MgRFREUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBEVERQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkRWxlbWVudENvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEdyb3VwQ29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkQXR0cmlidXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRFbXB0eUNvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEFueUNvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZHBjRGF0YUNvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRSZXBlYXRhYmxlQ29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkRmlsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkQmFzaWNUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRFbnVtZXJhdGlvblR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZE5vdGF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRFbnRpdHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVudGl0eUNvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRJbnRlcm5hbEVudGl0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGR0ZE9jY3VycmVuY2VUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZHRkRGVmYXVsdEtpbmRFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBkdGRCYXNpY1R5cGVLaW5kRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZHRkRW51bUdyb3VwS2luZEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGR0ZEdyb3VwS2luZEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5Ci0JICogdGhlIHBhY2thZ2UgcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Ci0JICogTm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYyBmYWN0b3J5Ci0JICogbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zIGluaXRpYWxpemF0aW9uIG9mIHRoZQotCSAqIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwgaWYgb25lIGFscmVhZHkgZXhpc3RzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERURFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBEVERGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLy8gcHVibGljIERURFBhY2thZ2VJbXBsKCkKLQkvLyB7Ci0JLy8gc3VwZXIoZU5TX1VSSSk7Ci0JLy8gaW5pdGlhbGl6ZVBhY2thZ2UobnVsbCk7Ci0JLy8gfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsCi0JICogYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gU2ltcGxlIGRlcGVuZGVuY2llcyBhcmUKLQkgKiBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwgZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZwotCSAqIGFueXRoaW5nIGVsc2UuIFRoaXMgbWV0aG9kIGRyaXZlcyBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQKLQkgKiBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwgd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD4KLQkgKiBPZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoIGhhdmUgbm90Ci0JICogeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkIGFuZAotCSAqIHJlZ2lzdGVyZWQuIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6IG1ldGEtbW9kZWwKLQkgKiBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkgYXJlIGluaXRpYWxpemVkLAotCSAqIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0byB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPgotCSAqIEludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERURFBhY2thZ2UgaW5pdCgpIHsKLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZSBhbmQgaW50ZXJkZXBlbmRlbmNpZXMKLQkJRFREUGFja2FnZUltcGwgdGhlRFREUGFja2FnZSA9IChEVERQYWNrYWdlSW1wbCkgKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEVQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IERURFBhY2thZ2VJbXBsKCkpOwotCQlFY29yZVBhY2thZ2VJbXBsIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2VJbXBsKSAoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KEVjb3JlUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KEVjb3JlUGFja2FnZS5lTlNfVVJJKSA6IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIFN0ZXAgMTogY3JlYXRlIG1ldGEtbW9kZWwgb2JqZWN0cwotCQl0aGVEVERQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY29yZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gU3RlcCAyOiBjb21wbGV0ZSBpbml0aWFsaXphdGlvbgotCQl0aGVEVERQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNvcmVQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQlyZXR1cm4gdGhlRFREUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFbGVtZW50Q29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZEVsZW1lbnRDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbGVtZW50Q29udGVudF9Hcm91cCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbGVtZW50Q29udGVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERWxlbWVudENvbnRlbnRfRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbGVtZW50Q29udGVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERHcm91cENvbnRlbnQoKSB7Ci0JCXJldHVybiBkdGRHcm91cENvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREdyb3VwQ29udGVudF9Hcm91cEtpbmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkR3JvdXBDb250ZW50RUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERHcm91cENvbnRlbnRfQ29udGVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRHcm91cENvbnRlbnRFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFREQXR0cmlidXRlKCkgewotCQlyZXR1cm4gZHRkQXR0cmlidXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERBdHRyaWJ1dGVfQ29tbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRBdHRyaWJ1dGVFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREF0dHJpYnV0ZV9EZWZhdWx0S2luZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRBdHRyaWJ1dGVFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREF0dHJpYnV0ZV9EZWZhdWx0VmFsdWVTdHJpbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkQXR0cmlidXRlRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERBdHRyaWJ1dGVfQXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkQXR0cmlidXRlRUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERBdHRyaWJ1dGVfQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkQXR0cmlidXRlRUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERBdHRyaWJ1dGVfRFRERWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRERWxlbWVudCgpIHsKLQkJcmV0dXJuIGR0ZEVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREVsZW1lbnRfQ29tbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRFbGVtZW50RUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbGVtZW50X0NvbnRlbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRWxlbWVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERWxlbWVudF9EVERBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRWxlbWVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFbXB0eUNvbnRlbnQoKSB7Ci0JCXJldHVybiBkdGRFbXB0eUNvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFREQW55Q29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZEFueUNvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFREUENEYXRhQ29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZHBjRGF0YUNvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKSB7Ci0JCXJldHVybiBkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRfUmVmZXJlbmNlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnQoKSB7Ci0JCXJldHVybiBkdGRSZXBlYXRhYmxlQ29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnRfT2NjdXJyZW5jZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRSZXBlYXRhYmxlQ29udGVudEVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERGaWxlKCkgewotCQlyZXR1cm4gZHRkRmlsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRERmlsZV9Db21tZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEZpbGVFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREZpbGVfUGFyc2VFcnJvcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRGaWxlRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERGaWxlX0RURENvbnRlbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRmlsZUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERmlsZV9EVERFbnVtZXJhdGlvblR5cGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRmlsZUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERCYXNpY1R5cGUoKSB7Ci0JCXJldHVybiBkdGRCYXNpY1R5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREJhc2ljVHlwZV9LaW5kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEJhc2ljVHlwZUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFbnVtZXJhdGlvblR5cGUoKSB7Ci0JCXJldHVybiBkdGRFbnVtZXJhdGlvblR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREVudW1lcmF0aW9uVHlwZV9LaW5kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERW51bWVyYXRpb25UeXBlX0RUREZpbGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERURE5vdGF0aW9uKCkgewotCQlyZXR1cm4gZHRkTm90YXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERURE5vdGF0aW9uX0NvbW1lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkTm90YXRpb25FQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERURE5vdGF0aW9uX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZE5vdGF0aW9uRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVEROb3RhdGlvbl9QdWJsaWNJRCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGROb3RhdGlvbkVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRETm90YXRpb25fRW50aXR5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZE5vdGF0aW9uRUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREVudGl0eSgpIHsKLQkJcmV0dXJuIGR0ZEVudGl0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRERW50aXR5X0NvbW1lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkRW50aXR5RUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEVudGl0eUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X0NvbnRlbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRW50aXR5RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnRpdHlFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVudGl0eV9FbnRpdHlSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRW50aXR5RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfQXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnRpdHlFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVudGl0eV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVudGl0eUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFbnRpdHlDb250ZW50KCkgewotCQlyZXR1cm4gZHRkRW50aXR5Q29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERW50aXR5Q29udGVudF9EVERFbnRpdHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRW50aXR5Q29udGVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFeHRlcm5hbEVudGl0eSgpIHsKLQkJcmV0dXJuIGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERFeHRlcm5hbEVudGl0eV9TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRFeHRlcm5hbEVudGl0eUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRERXh0ZXJuYWxFbnRpdHlfUHVibGljSUQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREV4dGVybmFsRW50aXR5X05vdGF0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFeHRlcm5hbEVudGl0eV9FbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREludGVybmFsRW50aXR5KCkgewotCQlyZXR1cm4gZHRkSW50ZXJuYWxFbnRpdHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREludGVybmFsRW50aXR5X1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEludGVybmFsRW50aXR5RUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlX0VudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRfRWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERDb250ZW50KCkgewotCQlyZXR1cm4gZHRkQ29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFREQ29udGVudF9EVERGaWxlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZENvbnRlbnRFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXREVERPY2N1cnJlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIGR0ZE9jY3VycmVuY2VUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXREVEREZWZhdWx0S2luZCgpIHsKLQkJcmV0dXJuIGR0ZERlZmF1bHRLaW5kRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXREVERCYXNpY1R5cGVLaW5kKCkgewotCQlyZXR1cm4gZHRkQmFzaWNUeXBlS2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0RFRERW51bUdyb3VwS2luZCgpIHsKLQkJcmV0dXJuIGR0ZEVudW1Hcm91cEtpbmRFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldERUREdyb3VwS2luZCgpIHsKLQkJcmV0dXJuIGR0ZEdyb3VwS2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0WE1MU2NoZW1hRGVmaW5lZFR5cGUoKSB7Ci0JCXJldHVybiB4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERmFjdG9yeSBnZXREVERGYWN0b3J5KCkgewotCQlyZXR1cm4gKERUREZhY3RvcnkpIGdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gVGhpcyBtZXRob2QgaXMgZ3VhcmRlZAotCSAqIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkKLQkJCXJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJZHRkRWxlbWVudENvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0VMRU1FTlRfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRWxlbWVudENvbnRlbnRFQ2xhc3MsIERURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbGVtZW50Q29udGVudEVDbGFzcywgRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCk7Ci0KLQkJZHRkR3JvdXBDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9HUk9VUF9DT05URU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRHcm91cENvbnRlbnRFQ2xhc3MsIERURF9HUk9VUF9DT05URU5UX19HUk9VUF9LSU5EKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRHcm91cENvbnRlbnRFQ2xhc3MsIERURF9HUk9VUF9DT05URU5UX19DT05URU5UKTsKLQotCQlkdGRBdHRyaWJ1dGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0FUVFJJQlVURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkQXR0cmlidXRlRUNsYXNzLCBEVERfQVRUUklCVVRFX19DT01NRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRBdHRyaWJ1dGVFQ2xhc3MsIERURF9BVFRSSUJVVEVfX0RFRkFVTFRfS0lORCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkQXR0cmlidXRlRUNsYXNzLCBEVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX1NUUklORyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkQXR0cmlidXRlRUNsYXNzLCBEVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkQXR0cmlidXRlRUNsYXNzLCBEVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkQXR0cmlidXRlRUNsYXNzLCBEVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCk7Ci0KLQkJZHRkRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkRWxlbWVudEVDbGFzcywgRFREX0VMRU1FTlRfX0NPTU1FTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVsZW1lbnRFQ2xhc3MsIERURF9FTEVNRU5UX19DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbGVtZW50RUNsYXNzLCBEVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSk7Ci0KLQkJZHRkRW1wdHlDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9FTVBUWV9DT05URU5UKTsKLQotCQlkdGRBbnlDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9BTllfQ09OVEVOVCk7Ci0KLQkJZHRkcGNEYXRhQ29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfUENfREFUQV9DT05URU5UKTsKLQotCQlkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MsIERURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19SRUZFUkVOQ0VEX0VMRU1FTlQpOwotCi0JCWR0ZFJlcGVhdGFibGVDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9SRVBFQVRBQkxFX0NPTlRFTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZFJlcGVhdGFibGVDb250ZW50RUNsYXNzLCBEVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFKTsKLQotCQlkdGRGaWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9GSUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRGaWxlRUNsYXNzLCBEVERfRklMRV9fQ09NTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkRmlsZUVDbGFzcywgRFREX0ZJTEVfX1BBUlNFX0VSUk9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRGaWxlRUNsYXNzLCBEVERfRklMRV9fRFREX0NPTlRFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEZpbGVFQ2xhc3MsIERURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSk7Ci0KLQkJZHRkQmFzaWNUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9CQVNJQ19UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRCYXNpY1R5cGVFQ2xhc3MsIERURF9CQVNJQ19UWVBFX19LSU5EKTsKLQotCQlkdGRFbnVtZXJhdGlvblR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0VOVU1FUkFUSU9OX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzcywgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0tJTkQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzcywgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFKTsKLQotCQlkdGROb3RhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfTk9UQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZE5vdGF0aW9uRUNsYXNzLCBEVERfTk9UQVRJT05fX0NPTU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZE5vdGF0aW9uRUNsYXNzLCBEVERfTk9UQVRJT05fX1NZU1RFTV9JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkTm90YXRpb25FQ2xhc3MsIERURF9OT1RBVElPTl9fUFVCTElDX0lEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGROb3RhdGlvbkVDbGFzcywgRFREX05PVEFUSU9OX19FTlRJVFkpOwotCi0JCWR0ZEVudGl0eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRU5USVRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRFbnRpdHlFQ2xhc3MsIERURF9FTlRJVFlfX0NPTU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEVudGl0eUVDbGFzcywgRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRW50aXR5RUNsYXNzLCBEVERfRU5USVRZX19DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnRpdHlFQ2xhc3MsIERURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRW50aXR5RUNsYXNzLCBEVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnRpdHlFQ2xhc3MsIERURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRW50aXR5RUNsYXNzLCBEVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UpOwotCi0JCWR0ZEVudGl0eUNvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0VOVElUWV9DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnRpdHlDb250ZW50RUNsYXNzLCBEVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkpOwotCi0JCWR0ZEV4dGVybmFsRW50aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9FWFRFUk5BTF9FTlRJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLCBEVERfRVhURVJOQUxfRU5USVRZX19TWVNURU1fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLCBEVERfRVhURVJOQUxfRU5USVRZX19QVUJMSUNfSUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLCBEVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MsIERURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFKTsKLQotCQlkdGRJbnRlcm5hbEVudGl0eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfSU5URVJOQUxfRU5USVRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRJbnRlcm5hbEVudGl0eUVDbGFzcywgRFREX0lOVEVSTkFMX0VOVElUWV9fVkFMVUUpOwotCi0JCWR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUVDbGFzcywgRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFkpOwotCi0JCWR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudEVDbGFzcywgRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSk7Ci0KLQkJZHRkQ29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkQ29udGVudEVDbGFzcywgRFREX0NPTlRFTlRfX0RURF9GSUxFKTsKLQotCQkvLyBDcmVhdGUgZW51bXMKLQkJZHRkT2NjdXJyZW5jZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKERURF9PQ0NVUlJFTkNFX1RZUEUpOwotCQlkdGREZWZhdWx0S2luZEVFbnVtID0gY3JlYXRlRUVudW0oRFREX0RFRkFVTFRfS0lORCk7Ci0JCWR0ZEJhc2ljVHlwZUtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKERURF9CQVNJQ19UWVBFX0tJTkQpOwotCQlkdGRFbnVtR3JvdXBLaW5kRUVudW0gPSBjcmVhdGVFRW51bShEVERfRU5VTV9HUk9VUF9LSU5EKTsKLQkJZHRkR3JvdXBLaW5kRUVudW0gPSBjcmVhdGVFRW51bShEVERfR1JPVVBfS0lORCk7Ci0JCXhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0gPSBjcmVhdGVFRW51bShYTUxfU0NIRU1BX0RFRklORURfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpCi0JCQlyZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJRWNvcmVQYWNrYWdlSW1wbCB0aGVFY29yZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlSW1wbCkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJZHRkR3JvdXBDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnQoKSk7Ci0JCWR0ZEF0dHJpYnV0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RUF0dHJpYnV0ZSgpKTsKLQkJZHRkRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RUNsYXNzKCkpOwotCQlkdGRFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFREQ29udGVudCgpKTsKLQkJZHRkRW1wdHlDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFRERWxlbWVudENvbnRlbnQoKSk7Ci0JCWR0ZEFueUNvbnRlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERFbGVtZW50Q29udGVudCgpKTsKLQkJZHRkcGNEYXRhQ29udGVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERUREVsZW1lbnRDb250ZW50KCkpOwotCQlkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERURFJlcGVhdGFibGVDb250ZW50KCkpOwotCQlkdGRSZXBlYXRhYmxlQ29udGVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERUREVsZW1lbnRDb250ZW50KCkpOwotCQlkdGRCYXNpY1R5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVDbGFzcygpKTsKLQkJZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFRW51bSgpKTsKLQkJZHRkTm90YXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERDb250ZW50KCkpOwotCQlkdGRFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERDb250ZW50KCkpOwotCQlkdGRFeHRlcm5hbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERUREVudGl0eUNvbnRlbnQoKSk7Ci0JCWR0ZEludGVybmFsRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFRERW50aXR5Q29udGVudCgpKTsKLQkJZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFREQ29udGVudCgpKTsKLQkJZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERURFJlcGVhdGFibGVDb250ZW50KCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoZHRkRWxlbWVudENvbnRlbnRFQ2xhc3MsIERUREVsZW1lbnRDb250ZW50LmNsYXNzLCAiRFRERWxlbWVudENvbnRlbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERWxlbWVudENvbnRlbnRfR3JvdXAoKSwgdGhpcy5nZXREVERHcm91cENvbnRlbnQoKSwgdGhpcy5nZXREVERHcm91cENvbnRlbnRfQ29udGVudCgpLCAiZ3JvdXAiLCBudWxsLCAwLCAxLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERWxlbWVudENvbnRlbnRfRWxlbWVudCgpLCB0aGlzLmdldERUREVsZW1lbnQoKSwgdGhpcy5nZXREVERFbGVtZW50X0NvbnRlbnQoKSwgImVsZW1lbnQiLCBudWxsLCAwLCAxLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEdyb3VwQ29udGVudEVDbGFzcywgRFRER3JvdXBDb250ZW50LmNsYXNzLCAiRFRER3JvdXBDb250ZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERHcm91cENvbnRlbnRfR3JvdXBLaW5kKCksIHRoaXMuZ2V0RFRER3JvdXBLaW5kKCksICJncm91cEtpbmQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREdyb3VwQ29udGVudF9Db250ZW50KCksIHRoaXMuZ2V0RFRERWxlbWVudENvbnRlbnQoKSwgdGhpcy5nZXREVERFbGVtZW50Q29udGVudF9Hcm91cCgpLCAiY29udGVudCIsIG51bGwsIDEsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEF0dHJpYnV0ZUVDbGFzcywgRFREQXR0cmlidXRlLmNsYXNzLCAiRFREQXR0cmlidXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERBdHRyaWJ1dGVfQ29tbWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29tbWVudCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFREQXR0cmlidXRlX0RlZmF1bHRLaW5kKCksIHRoaXMuZ2V0RFRERGVmYXVsdEtpbmQoKSwgImRlZmF1bHRLaW5kIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERBdHRyaWJ1dGVfRGVmYXVsdFZhbHVlU3RyaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZWZhdWx0VmFsdWVTdHJpbmciLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpLCB0aGlzLmdldERUREVudGl0eSgpLCB0aGlzLmdldERUREVudGl0eV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCksICJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERBdHRyaWJ1dGVfQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKSwgdGhpcy5nZXREVERFbnRpdHkoKSwgdGhpcy5nZXREVERFbnRpdHlfQXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpLCAiYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFREQXR0cmlidXRlX0RUREVsZW1lbnQoKSwgdGhpcy5nZXREVERFbGVtZW50KCksIHRoaXMuZ2V0RFRERWxlbWVudF9EVERBdHRyaWJ1dGUoKSwgIkRUREVsZW1lbnQiLCBudWxsLCAwLCAxLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEVsZW1lbnRFQ2xhc3MsIERUREVsZW1lbnQuY2xhc3MsICJEVERFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERFbGVtZW50X0NvbW1lbnQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbW1lbnQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVsZW1lbnRfQ29udGVudCgpLCB0aGlzLmdldERUREVsZW1lbnRDb250ZW50KCksIHRoaXMuZ2V0RFRERWxlbWVudENvbnRlbnRfRWxlbWVudCgpLCAiY29udGVudCIsIG51bGwsIDEsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbGVtZW50X0RUREF0dHJpYnV0ZSgpLCB0aGlzLmdldERUREF0dHJpYnV0ZSgpLCB0aGlzLmdldERUREF0dHJpYnV0ZV9EVERFbGVtZW50KCksICJEVERBdHRyaWJ1dGUiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRFbXB0eUNvbnRlbnRFQ2xhc3MsIERUREVtcHR5Q29udGVudC5jbGFzcywgIkRUREVtcHR5Q29udGVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEFueUNvbnRlbnRFQ2xhc3MsIERUREFueUNvbnRlbnQuY2xhc3MsICJEVERBbnlDb250ZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkcGNEYXRhQ29udGVudEVDbGFzcywgRFREUENEYXRhQ29udGVudC5jbGFzcywgIkRURFBDRGF0YUNvbnRlbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudEVDbGFzcywgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQuY2xhc3MsICJEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRfUmVmZXJlbmNlZEVsZW1lbnQoKSwgdGhpcy5nZXREVERFbGVtZW50KCksIG51bGwsICJyZWZlcmVuY2VkRWxlbWVudCIsIG51bGwsIDEsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkUmVwZWF0YWJsZUNvbnRlbnRFQ2xhc3MsIERURFJlcGVhdGFibGVDb250ZW50LmNsYXNzLCAiRFREUmVwZWF0YWJsZUNvbnRlbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnRfT2NjdXJyZW5jZSgpLCB0aGlzLmdldERURE9jY3VycmVuY2VUeXBlKCksICJvY2N1cnJlbmNlIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRmlsZUVDbGFzcywgRFRERmlsZS5jbGFzcywgIkRUREZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREZpbGVfQ29tbWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29tbWVudCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRERmlsZV9QYXJzZUVycm9yKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicGFyc2VFcnJvciIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERmlsZV9EVERDb250ZW50KCksIHRoaXMuZ2V0RFREQ29udGVudCgpLCB0aGlzLmdldERURENvbnRlbnRfRFRERmlsZSgpLCAiRFREQ29udGVudCIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERmlsZV9EVERFbnVtZXJhdGlvblR5cGUoKSwgdGhpcy5nZXREVERFbnVtZXJhdGlvblR5cGUoKSwgdGhpcy5nZXREVERFbnVtZXJhdGlvblR5cGVfRFRERmlsZSgpLCAiRFRERW51bWVyYXRpb25UeXBlIiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkQmFzaWNUeXBlRUNsYXNzLCBEVERCYXNpY1R5cGUuY2xhc3MsICJEVERCYXNpY1R5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREJhc2ljVHlwZV9LaW5kKCksIHRoaXMuZ2V0RFREQmFzaWNUeXBlS2luZCgpLCAia2luZCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzcywgRFRERW51bWVyYXRpb25UeXBlLmNsYXNzLCAiRFRERW51bWVyYXRpb25UeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERFbnVtZXJhdGlvblR5cGVfS2luZCgpLCB0aGlzLmdldERUREVudW1Hcm91cEtpbmQoKSwgImtpbmQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVudW1lcmF0aW9uVHlwZV9EVERGaWxlKCksIHRoaXMuZ2V0RFRERmlsZSgpLCB0aGlzLmdldERUREZpbGVfRFRERW51bWVyYXRpb25UeXBlKCksICJEVERGaWxlIiwgbnVsbCwgMCwgMSwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGROb3RhdGlvbkVDbGFzcywgRFRETm90YXRpb24uY2xhc3MsICJEVEROb3RhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRETm90YXRpb25fQ29tbWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29tbWVudCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRETm90YXRpb25fU3lzdGVtSUQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInN5c3RlbUlEIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVEROb3RhdGlvbl9QdWJsaWNJRCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicHVibGljSUQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERURE5vdGF0aW9uX0VudGl0eSgpLCB0aGlzLmdldERUREV4dGVybmFsRW50aXR5KCksIHRoaXMuZ2V0RFRERXh0ZXJuYWxFbnRpdHlfTm90YXRpb24oKSwgImVudGl0eSIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEVudGl0eUVDbGFzcywgRFRERW50aXR5LmNsYXNzLCAiRFRERW50aXR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERFbnRpdHlfQ29tbWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29tbWVudCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRERW50aXR5X1BhcmFtZXRlckVudGl0eSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInBhcmFtZXRlckVudGl0eSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERW50aXR5X0NvbnRlbnQoKSwgdGhpcy5nZXREVERFbnRpdHlDb250ZW50KCksIHRoaXMuZ2V0RFRERW50aXR5Q29udGVudF9EVERFbnRpdHkoKSwgImNvbnRlbnQiLCBudWxsLCAxLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERW50aXR5X1Bhcm1FbnRpdHlSZWYoKSwgdGhpcy5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKSwgdGhpcy5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCksICJwYXJtRW50aXR5UmVmIiwgbnVsbCwgMSwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVudGl0eV9FbnRpdHlSZWZlcmVuY2UoKSwgdGhpcy5nZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCksIHRoaXMuZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudF9FbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpLCAiZW50aXR5UmVmZXJlbmNlIiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbnRpdHlfQXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpLCB0aGlzLmdldERUREF0dHJpYnV0ZSgpLCB0aGlzLmdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpLCAiYXR0cmlidXRlTmFtZVJlZmVyZW5jZSIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERW50aXR5X0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKSwgdGhpcy5nZXREVERBdHRyaWJ1dGUoKSwgdGhpcy5nZXREVERBdHRyaWJ1dGVfQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKSwgImF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRFbnRpdHlDb250ZW50RUNsYXNzLCBEVERFbnRpdHlDb250ZW50LmNsYXNzLCAiRFRERW50aXR5Q29udGVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbnRpdHlDb250ZW50X0RUREVudGl0eSgpLCB0aGlzLmdldERUREVudGl0eSgpLCB0aGlzLmdldERUREVudGl0eV9Db250ZW50KCksICJEVERFbnRpdHkiLCBudWxsLCAwLCAxLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLCBEVERFeHRlcm5hbEVudGl0eS5jbGFzcywgIkRUREV4dGVybmFsRW50aXR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERFeHRlcm5hbEVudGl0eV9TeXN0ZW1JRCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic3lzdGVtSUQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREV4dGVybmFsRW50aXR5X1B1YmxpY0lEKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwdWJsaWNJRCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERXh0ZXJuYWxFbnRpdHlfTm90YXRpb24oKSwgdGhpcy5nZXREVEROb3RhdGlvbigpLCB0aGlzLmdldERURE5vdGF0aW9uX0VudGl0eSgpLCAibm90YXRpb24iLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERXh0ZXJuYWxFbnRpdHlfRW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgpLCB0aGlzLmdldERUREZpbGUoKSwgbnVsbCwgImVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEludGVybmFsRW50aXR5RUNsYXNzLCBEVERJbnRlcm5hbEVudGl0eS5jbGFzcywgIkRUREludGVybmFsRW50aXR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERJbnRlcm5hbEVudGl0eV9WYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VFQ2xhc3MsIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5jbGFzcywgIkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlX0VudGl0eSgpLCB0aGlzLmdldERUREVudGl0eSgpLCB0aGlzLmdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCksICJlbnRpdHkiLCBudWxsLCAxLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MsIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQuY2xhc3MsICJEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50X0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5X0VudGl0eVJlZmVyZW5jZSgpLCAiZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkiLCBudWxsLCAxLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZENvbnRlbnRFQ2xhc3MsIERURENvbnRlbnQuY2xhc3MsICJEVERDb250ZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERURENvbnRlbnRfRFRERmlsZSgpLCB0aGlzLmdldERUREZpbGUoKSwgdGhpcy5nZXREVERGaWxlX0RURENvbnRlbnQoKSwgIkRUREZpbGUiLCBudWxsLCAwLCAxLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0oZHRkT2NjdXJyZW5jZVR5cGVFRW51bSwgRFRET2NjdXJyZW5jZVR5cGUuY2xhc3MsICJEVERPY2N1cnJlbmNlVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChkdGRPY2N1cnJlbmNlVHlwZUVFbnVtLCBEVERPY2N1cnJlbmNlVHlwZS5PTkVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRPY2N1cnJlbmNlVHlwZUVFbnVtLCBEVERPY2N1cnJlbmNlVHlwZS5PUFRJT05BTF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZE9jY3VycmVuY2VUeXBlRUVudW0sIERURE9jY3VycmVuY2VUeXBlLk9ORV9PUl9NT1JFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkT2NjdXJyZW5jZVR5cGVFRW51bSwgRFRET2NjdXJyZW5jZVR5cGUuWkVST19PUl9NT1JFX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShkdGREZWZhdWx0S2luZEVFbnVtLCBEVEREZWZhdWx0S2luZC5jbGFzcywgIkRURERlZmF1bHRLaW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZERlZmF1bHRLaW5kRUVudW0sIERURERlZmF1bHRLaW5kLklNUExJRURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGREZWZhdWx0S2luZEVFbnVtLCBEVEREZWZhdWx0S2luZC5SRVFVSVJFRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZERlZmF1bHRLaW5kRUVudW0sIERURERlZmF1bHRLaW5kLkZJWEVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkRGVmYXVsdEtpbmRFRW51bSwgRFRERGVmYXVsdEtpbmQuTk9GSVhFRF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLmNsYXNzLCAiRFREQmFzaWNUeXBlS2luZCIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuTk9ORV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5DREFUQV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5JRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5JRFJFRl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5JRFJFRlNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuRU5USVRZX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLkVOVElUSUVTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU5fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTlNfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGR0ZEVudW1Hcm91cEtpbmRFRW51bSwgRFRERW51bUdyb3VwS2luZC5jbGFzcywgIkRUREVudW1Hcm91cEtpbmQiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoZHRkRW51bUdyb3VwS2luZEVFbnVtLCBEVERFbnVtR3JvdXBLaW5kLk5BTUVfVE9LRU5fR1JPVVBfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRFbnVtR3JvdXBLaW5kRUVudW0sIERUREVudW1Hcm91cEtpbmQuTk9UQVRJT05fR1JPVVBfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGR0ZEdyb3VwS2luZEVFbnVtLCBEVERHcm91cEtpbmQuY2xhc3MsICJEVERHcm91cEtpbmQiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoZHRkR3JvdXBLaW5kRUVudW0sIERUREdyb3VwS2luZC5TRVFVRU5DRV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEdyb3VwS2luZEVFbnVtLCBEVERHcm91cEtpbmQuQ0hPSUNFX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bSh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5jbGFzcywgIlhNTFNjaGVtYURlZmluZWRUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLk5PTkVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5TVFJJTkdfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5CT09MRUFOX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuRkxPQVRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5ET1VCTEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5ERUNJTUFMX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuVElNRUlOU1RBTlRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5USU1FRFVSQVRJT05fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5SRUNVUlJJTkdJTlNUQU5UX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuQklOQVJZX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuVVJJX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuSU5URUdFUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLkRBVEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5USU1FX0xJVEVSQUwpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLQotfSAvLyBEVERQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZmQxYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25DaGFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERMZXhpY2FsSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFBhdGhuYW1lVXRpbDsKLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUltcGwjZ2V0RW50aXR5IDxlbT5FbnRpdHk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbCBleHRlbmRzIERURENvbnRlbnRJbXBsIGltcGxlbWVudHMgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLCBFTmFtZWRFbGVtZW50LCBEVERDb250ZW50IHsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJRFRERW50aXR5IGVudGl0eSA9IGdldEVudGl0eSgpOwotCQlpZiAoZW50aXR5ICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRFbnRpdHkoKS5nZXROYW1lKCk7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7Ci0JCXJldHVybiBEVERQYXRobmFtZVV0aWwubWFrZVBhdGgobnVsbCwgIlBFbnQiLCBnZXROYW1lKCksIC0xKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIHVnbHkgaGFjayBmb3Igbm93IHNpbmNlIHdlIGRvbid0IGhhdmUgbXVsdGlwbGUgaW5oZXJpdGFuY2UuCi0JLy8gV291bGQgcmF0aGVyIGhhdmUgYWxsIHRoaXMgc3R1ZmYgaW4gYSBiYXNlIGNsYXNzIGJ1dCB0aGVzZQotCS8vIGNsYXNzZXMgYXJlIGluaGVyaXRpbmcgZnJvbSBzb21ldGltZXMgZGlmZmVyZW50IG1vZiBjbGFzc2VzCi0JRFRETGV4aWNhbEluZm8gbGV4SW5mbyA9IG5ldyBEVERMZXhpY2FsSW5mbygpOwotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0U3RhcnRPZmZzZXQodik7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldEVuZE9mZnNldCh2KTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudGl0eSgpIDxlbT5FbnRpdHk8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEVERFbnRpdHkgZW50aXR5ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVudGl0eSBnZXRFbnRpdHkoKSB7Ci0JCWlmIChlbnRpdHkgIT0gbnVsbCAmJiBlbnRpdHkuZUlzUHJveHkoKSkgewotCQkJRFRERW50aXR5IG9sZEVudGl0eSA9IGVudGl0eTsKLQkJCWVudGl0eSA9IChEVERFbnRpdHkpIEVjb3JlVXRpbC5yZXNvbHZlKGVudGl0eSwgdGhpcyk7Ci0JCQlpZiAoZW50aXR5ICE9IG9sZEVudGl0eSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFksIG9sZEVudGl0eSwgZW50aXR5KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVudGl0eSBiYXNpY0dldEVudGl0eSgpIHsKLQkJcmV0dXJuIGVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RW50aXR5KERUREVudGl0eSBuZXdFbnRpdHksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRFRERW50aXR5IG9sZEVudGl0eSA9IGVudGl0eTsKLQkJZW50aXR5ID0gbmV3RW50aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5ldyBOb3RpZmljYXRpb25DaGFpbkltcGwoNCk7Ci0JCQltc2dzLmFkZChuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSwgb2xkRW50aXR5LCBuZXdFbnRpdHkpKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW50aXR5KERUREVudGl0eSBuZXdFbnRpdHkpIHsKLQkJaWYgKG5ld0VudGl0eSAhPSBlbnRpdHkpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgZW50aXR5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdFbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0VudGl0eSkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFbnRpdHkobmV3RW50aXR5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSwgbmV3RW50aXR5LCBuZXdFbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZIDoKLQkJCQkJaWYgKGVudGl0eSAhPSBudWxsKQotCQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBlbnRpdHkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXRFbnRpdHkoKERUREVudGl0eSkgb3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSA6Ci0JCQkJCXJldHVybiBiYXNpY1NldEVudGl0eShudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCgpLCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFkgOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0RW50aXR5KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RW50aXR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZIDoKLQkJCQlzZXRFbnRpdHkoKERUREVudGl0eSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSA6Ci0JCQkJc2V0RW50aXR5KChEVERFbnRpdHkpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFkgOgotCQkJCXJldHVybiBlbnRpdHkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUltcGwKLQotLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotLy8gLy9wdWJsaWMgY2xhc3MgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbCBleHRlbmRzIEVOYW1lc3BhY2VJbXBsCi0vLyBpbXBsZW1lbnRzIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSwgRU5hbWVzcGFjZSwgRFREQ29udGVudHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRFRERW50aXR5IGVudGl0eSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0RW50aXR5ID0gZmFsc2U7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJpdmF0ZSBEVERDb250ZW50SW1wbCBkdGRDb250ZW50RGVsZWdhdGUgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFT2JqZWN0IGluaXRJbnN0YW5jZSgpIHsKLS8vIHNldEVNZXRhT2JqKGVDbGFzc0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpKTsKLS8vIGluaXRJbnN0YW5jZURlbGVnYXRlcygpOwotLy8gcmV0dXJuIHRoaXM7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIHZvaWQgaW5pdEluc3RhbmNlRGVsZWdhdGVzKCkgewotLy8gc3VwZXIuaW5pdEluc3RhbmNlRGVsZWdhdGVzKCk7Ci0vLwotCi0vLyBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5yZWZTZXREZWxlZ2F0ZU93bmVyKHRoaXMpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBEVERQYWNrYWdlIGVQYWNrYWdlRFREKCkgewotLy8gcmV0dXJuCi0vLyAoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFQ2xhc3MgZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkgewotLy8gcmV0dXJuCi0vLyAoKERURFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRFREUGFja2FnZS5lTlNfVVJJKSkuZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgRFRERW50aXR5IGdldEVudGl0eSgpIHsKLS8vIHRyeSB7Ci0vLyBpZiAodGhpcy5lbnRpdHkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0vLyB0aGlzLmVudGl0eSA9IChEVERFbnRpdHkpICgoSW50ZXJuYWxFT2JqZWN0KXRoaXMuZW50aXR5KS5yZXNvbHZlKHRoaXMsCi0vLyBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCkpOwotLy8gaWYgKHRoaXMuZW50aXR5PT1udWxsKSB0aGlzLnNldEVudGl0eSA9IGZhbHNlOwotLy8gcmV0dXJuIHRoaXMuZW50aXR5OwotLy8gfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBudWxsOwotLy8gfQotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldEVudGl0eShEVERFbnRpdHkgbCkgewotLy8gcmVmU2V0VmFsdWVGb3JTVlJlZmVyZW5jZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCksdGhpcy5lbnRpdHksbCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRFbnRpdHkoKSB7Ci0vLyByZWZVbnNldFZhbHVlRm9yU1ZSZWZlcmVuY2UoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlX0VudGl0eSgpLHRoaXMuZW50aXR5KTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldEVudGl0eSgpIHsKLS8vIHJldHVybiBzZXRFbnRpdHk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFk6IHJldHVybiBnZXRFbnRpdHkoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFOiByZXR1cm4KLS8vIGdldERUREZpbGUoKTsKLS8vCi0KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBPYmplY3QgcmVmQmFzaWNWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1ZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZOgotLy8gaWYgKCF0aGlzLnNldEVudGl0eXx8dGhpcy5lbnRpdHk9PW51bGwpIHJldHVybiBudWxsOwotLy8gaWYgKCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMuZW50aXR5KS5yZWZJc0RlbGV0ZWQoKSkge3RoaXMuZW50aXR5PW51bGw7Ci0vLyB0aGlzLnNldEVudGl0eT1mYWxzZTt9Ci0vLyByZXR1cm4gdGhpcy5lbnRpdHk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRTogcmV0dXJuCi0vLyAoKEludGVybmFsRU9iamVjdClnZXREdGRDb250ZW50RGVsZWdhdGUoKSkucmVmQmFzaWNWYWx1ZShmZWF0dXJlKTsKLS8vCi0KLS8vIH0KLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1ZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFk6IHJldHVybgotLy8gaXNTZXRFbnRpdHkoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFOiByZXR1cm4KLS8vIGlzU2V0RFRERmlsZSgpOwotLy8KLQotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyBzdXBlci5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWTogewotLy8gc2V0RW50aXR5KChEVERFbnRpdHkpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEU6IHsKLS8vIHNldERUREZpbGUoKERUREZpbGUpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8KLQotLy8gfQotLy8gc3VwZXIuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE5vdGlmaWNhdGlvbiBlQmFzaWNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLS8vIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUJhc2ljU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWTogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5lbnRpdHk7Ci0vLyB0aGlzLmVudGl0eSA9IChEVERFbnRpdHkpbmV3VmFsdWU7Ci0vLyB0aGlzLnNldEVudGl0eSA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLwotCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUJhc2ljU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyBzdXBlci5lVW5zZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFk6IHsKLS8vIHVuc2V0RW50aXR5KCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRTogewotLy8gdW5zZXREVERGaWxlKCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotCi0vLyB9Ci0vLyBzdXBlci5lVW5zZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE5vdGlmaWNhdGlvbiByZWZCYXNpY1Vuc2V0VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNVbnNldFZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmVudGl0eTsKLS8vIHRoaXMuZW50aXR5ID0gbnVsbDsKLS8vIHRoaXMuc2V0RW50aXR5ID0gZmFsc2U7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlVOU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlX0VudGl0eSgpLG9sZFZhbHVlLG51bGwpOwotLy8gfQotLy8KLQotLy8gfQotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVW5zZXRWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRFREQ29udGVudEltcGwgZ2V0RHRkQ29udGVudERlbGVnYXRlKCkgewotLy8gaWYgKGR0ZENvbnRlbnREZWxlZ2F0ZSA9PSBudWxsKSB7Ci0vLyBEVERQYWNrYWdlIHBrZyA9Ci0vLyAoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpOwotLy8gZHRkQ29udGVudERlbGVnYXRlPShEVERDb250ZW50SW1wbClwa2cuZUNyZWF0ZUluc3RhbmNlKHBrZy5EVERfQ09OVEVOVCk7Ci0vLyBkdGRDb250ZW50RGVsZWdhdGUuaW5pdEluc3RhbmNlKCk7Ci0vLyB9Ci0vLyByZXR1cm4gZHRkQ29udGVudERlbGVnYXRlOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFQ2xhc3MgZUNsYXNzRFREQ29udGVudCgpIHsKLS8vIHJldHVybiBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5lQ2xhc3MoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRFRERmlsZSBnZXREVERGaWxlKCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmdldERUREZpbGUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXREVERGaWxlKERUREZpbGUgdmFsdWUpIHsKLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnNldERUREZpbGUodmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0RFRERmlsZSgpIHsKLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnVuc2V0RFRERmlsZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0RFRERmlsZSgpIHsKLS8vIHJldHVybiBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5pc1NldERUREZpbGUoKTsKLS8vIH0KLS8vIH0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERSZXBlYXRhYmxlQ29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERSZXBlYXRhYmxlQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkOGRiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUmVwZWF0YWJsZUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEVERSZXBlYXRhYmxlQ29udGVudEltcGwgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudEltcGwgaW1wbGVtZW50cyBEVERSZXBlYXRhYmxlQ29udGVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9jY3VycmVuY2UoKSA8ZW0+T2NjdXJyZW5jZTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldE9jY3VycmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRFRET2NjdXJyZW5jZVR5cGUgT0NDVVJSRU5DRV9FREVGQVVMVCA9IERURE9jY3VycmVuY2VUeXBlLk9ORV9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2UgPSBPQ0NVUlJFTkNFX0VERUZBVUxUOwotCi0JcHVibGljIERURFJlcGVhdGFibGVDb250ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERSZXBlYXRhYmxlQ29udGVudCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZSgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigxMjgpOwotCQlpZiAoZ2V0T2NjdXJyZW5jZSgpLmdldFZhbHVlKCkgIT0gRFRET2NjdXJyZW5jZVR5cGUuT05FKSB7Ci0JCQlpZiAodGhpcyBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCQlzYi5hcHBlbmQoIigiKS5hcHBlbmQodW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkpLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNiLmFwcGVuZCh1bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKSk7Ci0JCQl9Ci0KLQkJCS8vIE1PRjJFTUYgUG9ydAotCQkJLy8gRUVudW1MaXRlcmFsIGxpdCA9IGdldE9jY3VycmVuY2UoKTsKLQkJCURURE9jY3VycmVuY2VUeXBlIGxpdCA9IGdldE9jY3VycmVuY2UoKTsKLQkJCWlmIChsaXQgIT0gbnVsbCkgewotCQkJCXNiLmFwcGVuZCgoY2hhcikgbGl0LmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJc2IuYXBwZW5kKHVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpKTsKLQkJfQotCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogICAgICAgICAgICBKVVNUX09ORT0gLTEgT05FX09SX01PUkU9NDMgT1BUSU9OQUw9NjMgWkVST19PUl9NT1JFPTQyCi0JICovCi0JcHVibGljIERURE9jY3VycmVuY2VUeXBlIGdldE9jY3VycmVuY2UoKSB7Ci0JCXJldHVybiBvY2N1cnJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPY2N1cnJlbmNlKERURE9jY3VycmVuY2VUeXBlIG5ld09jY3VycmVuY2UpIHsKLQkJRFRET2NjdXJyZW5jZVR5cGUgb2xkT2NjdXJyZW5jZSA9IG9jY3VycmVuY2U7Ci0JCW9jY3VycmVuY2UgPSBuZXdPY2N1cnJlbmNlID09IG51bGwgPyBPQ0NVUlJFTkNFX0VERUZBVUxUIDogbmV3T2NjdXJyZW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFLCBvbGRPY2N1cnJlbmNlLCBvY2N1cnJlbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCgpID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCgpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIERUREVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQoKSwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gZ2V0T2NjdXJyZW5jZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJcmV0dXJuIG9jY3VycmVuY2UgIT0gT0NDVVJSRU5DRV9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoKERURE9jY3VycmVuY2VUeXBlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlzZXRPY2N1cnJlbmNlKE9DQ1VSUkVOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG9jY3VycmVuY2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQob2NjdXJyZW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogQHNlZSBEVERSZXBlYXRhYmxlQ29udGVudCN1bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRFRERWxlbWVudENvbnRlbnQjZ2V0Q29udGVudE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RUREFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhYjZiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudDsKLQotCi0KLXB1YmxpYyBjbGFzcyBEVERBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIERURFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIERUREFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IERURFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERTd2l0Y2ggbW9kZWxTd2l0Y2ggPSBuZXcgRFREU3dpdGNoKCkgewotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbGVtZW50Q29udGVudChEVERFbGVtZW50Q29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFbGVtZW50Q29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREdyb3VwQ29udGVudChEVERHcm91cENvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRER3JvdXBDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFREQXR0cmlidXRlKERUREF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERBdHRyaWJ1dGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbGVtZW50KERUREVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREVtcHR5Q29udGVudChEVERFbXB0eUNvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERW1wdHlDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFREQW55Q29udGVudChEVERBbnlDb250ZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREFueUNvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERQQ0RhdGFDb250ZW50KERURFBDRGF0YUNvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFREUENEYXRhQ29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFREUmVwZWF0YWJsZUNvbnRlbnQoRFREUmVwZWF0YWJsZUNvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFREUmVwZWF0YWJsZUNvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERGaWxlKERUREZpbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERmlsZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREJhc2ljVHlwZShEVERCYXNpY1R5cGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFREQmFzaWNUeXBlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRERW51bWVyYXRpb25UeXBlKERUREVudW1lcmF0aW9uVHlwZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFbnVtZXJhdGlvblR5cGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVEROb3RhdGlvbihEVEROb3RhdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVEROb3RhdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREVudGl0eShEVERFbnRpdHkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERW50aXR5QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRERW50aXR5Q29udGVudChEVERFbnRpdHlDb250ZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREVudGl0eUNvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFeHRlcm5hbEVudGl0eShEVERFeHRlcm5hbEVudGl0eSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFeHRlcm5hbEVudGl0eUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREludGVybmFsRW50aXR5KERUREludGVybmFsRW50aXR5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREludGVybmFsRW50aXR5QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURURENvbnRlbnQoRFREQ29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRU1vZGVsRWxlbWVudChFTW9kZWxFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVNb2RlbEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFTmFtZWRFbGVtZW50KEVOYW1lZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRU5hbWVkRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVUeXBlZEVsZW1lbnQoRVR5cGVkRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFVHlwZWRFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFU3RydWN0dXJhbEZlYXR1cmVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFQXR0cmlidXRlKEVBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRUF0dHJpYnV0ZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVDbGFzc2lmaWVyKEVDbGFzc2lmaWVyIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVDbGFzc2lmaWVyQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRUNsYXNzKEVDbGFzcyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFQ2xhc3NBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFRGF0YVR5cGUoRURhdGFUeXBlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVEYXRhVHlwZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVFbnVtKEVFbnVtIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVFbnVtQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKSBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCkgdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZQotCSAqIGNhc2VzLiBJdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlCi0JICogY2FzZXMgYW55d2F5LgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVEROb3RhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURURENvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERFbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERFbnRpdHlDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERXh0ZXJuYWxFbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERJbnRlcm5hbEVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERSZXBlYXRhYmxlQ29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREVsZW1lbnRDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERW1wdHlDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlCi0JICogY2FzZXMuIEl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUKLQkgKiBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERBbnlDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFREUENEYXRhQ29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREdyb3VwQ29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREF0dHJpYnV0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREVudW1lcmF0aW9uVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREJhc2ljVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVDbGFzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVBdHRyaWJ1dGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFRW51bUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVNb2RlbEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFTmFtZWRFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRVN0cnVjdHVyYWxGZWF0dXJlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRURhdGFUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVUeXBlZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFQ2xhc3NpZmllckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvLyBEVERBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE1ldHJpY3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERNZXRyaWNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMTg4ZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE1ldHJpY3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotCi0KLXB1YmxpYyBjbGFzcyBEVERNZXRyaWNzIHsKLQlwcm90ZWN0ZWQgRFRERmlsZSBkdGRGaWxlOwotCXByb3RlY3RlZCBIYXNodGFibGUgZWxlbWVudFJlZmVyZW5jZU1hcDsKLQotCXB1YmxpYyBEVERNZXRyaWNzKERUREZpbGUgZHRkRmlsZSkgewotCQl0aGlzLmR0ZEZpbGUgPSBkdGRGaWxlOwotCX0KLQotCXB1YmxpYyBIYXNodGFibGUgZ2V0RWxlbWVudFJlZmVyZW5jZXMoKSB7Ci0JCWlmIChlbGVtZW50UmVmZXJlbmNlTWFwID09IG51bGwpIHsKLQkJCWVsZW1lbnRSZWZlcmVuY2VNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCQluZXcgRFREVmlzaXRvcigpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHZpc2l0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgZWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCQkJRFRERWxlbWVudCBkdGRFbGVtZW50ID0gZWxlbWVudFJlZmVyZW5jZUNvbnRlbnQuZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKTsKLQkJCQkJT2JqZWN0IHZpc2l0YXRpb24gPSBlbGVtZW50UmVmZXJlbmNlTWFwLmdldChkdGRFbGVtZW50KTsKLQkJCQkJaWYgKHZpc2l0YXRpb24gPT0gbnVsbCkgewotCQkJCQkJZWxlbWVudFJlZmVyZW5jZU1hcC5wdXQoZHRkRWxlbWVudCwgdmlzaXRhdGlvbiA9IG5ldyBWZWN0b3IoKSk7Ci0JCQkJCX0KLQkJCQkJKChWZWN0b3IpIHZpc2l0YXRpb24pLmFkZEVsZW1lbnQoZWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCX0KLQkJCX0udmlzaXREVERGaWxlKGR0ZEZpbGUpOwotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRSZWZlcmVuY2VNYXA7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbGVtZW50UmVmZXJlbmNlQ291bnQoRFRERWxlbWVudCBkdGRFbGVtZW50KSB7Ci0JCU9iamVjdCBlbGVtZW50UmVmZXJlbmNlcyA9IGdldEVsZW1lbnRSZWZlcmVuY2VzKCkuZ2V0KGR0ZEVsZW1lbnQpOwotCQlyZXR1cm4gZWxlbWVudFJlZmVyZW5jZXMgPT0gbnVsbCA/IDAgOiAoKFZlY3RvcikgZWxlbWVudFJlZmVyZW5jZXMpLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgRFRERWxlbWVudCBnZXRMZWFzdFJlZmVyZW5jZWRFbGVtZW50KCkgewotCQlEVERFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0JCWludCBsb3dlc3RSZWZlcmVuY2VDb3VudCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCi0JCUNvbGxlY3Rpb24gZWxlbWVudHMgPSBkdGRGaWxlLmxpc3REVERFbGVtZW50KCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJRFRERWxlbWVudCBlbGVtZW50ID0gKERUREVsZW1lbnQpIGkubmV4dCgpOwotCQkJaW50IGNvdW50ID0gZ2V0RWxlbWVudFJlZmVyZW5jZUNvdW50KGVsZW1lbnQpOwotCQkJaWYgKGNvdW50IDwgbG93ZXN0UmVmZXJlbmNlQ291bnQpIHsKLQkJCQlyZXN1bHQgPSBlbGVtZW50OwotCQkJCWxvd2VzdFJlZmVyZW5jZUNvdW50ID0gY291bnQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSGFzaHRhYmxlIGdldEVsZW1lbnRSZWZlcmVuY2VzR2VuKCkgewotCi0JCWlmIChlbGVtZW50UmVmZXJlbmNlTWFwID09IG51bGwpIHsKLQkJCWVsZW1lbnRSZWZlcmVuY2VNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCQluZXcgRFREVmlzaXRvcigpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHZpc2l0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgZWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCQkJRFRERWxlbWVudCBkdGRFbGVtZW50ID0gZWxlbWVudFJlZmVyZW5jZUNvbnRlbnQuZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKTsKLQkJCQkJT2JqZWN0IHZpc2l0YXRpb24gPSBlbGVtZW50UmVmZXJlbmNlTWFwLmdldChkdGRFbGVtZW50KTsKLQkJCQkJaWYgKHZpc2l0YXRpb24gPT0gbnVsbCkgewotCQkJCQkJZWxlbWVudFJlZmVyZW5jZU1hcC5wdXQoZHRkRWxlbWVudCwgdmlzaXRhdGlvbiA9IG5ldyBWZWN0b3IoKSk7Ci0JCQkJCX0KLQkJCQkJKChWZWN0b3IpIHZpc2l0YXRpb24pLmFkZEVsZW1lbnQoZWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCX0KLQkJCX0udmlzaXREVERGaWxlKGR0ZEZpbGUpOwotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRSZWZlcmVuY2VNYXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RWxlbWVudFJlZmVyZW5jZUNvdW50R2VuKERUREVsZW1lbnQgZHRkRWxlbWVudCkgewotCi0JCU9iamVjdCBlbGVtZW50UmVmZXJlbmNlcyA9IGdldEVsZW1lbnRSZWZlcmVuY2VzKCkuZ2V0KGR0ZEVsZW1lbnQpOwotCQlyZXR1cm4gZWxlbWVudFJlZmVyZW5jZXMgPT0gbnVsbCA/IDAgOiAoKFZlY3RvcikgZWxlbWVudFJlZmVyZW5jZXMpLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERUREVsZW1lbnQgZ2V0TGVhc3RSZWZlcmVuY2VkRWxlbWVudEdlbigpIHsKLQotCQlEVERFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0JCWludCBsb3dlc3RSZWZlcmVuY2VDb3VudCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCi0JCUNvbGxlY3Rpb24gZWxlbWVudHMgPSBkdGRGaWxlLmxpc3REVERFbGVtZW50KCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJRFRERWxlbWVudCBlbGVtZW50ID0gKERUREVsZW1lbnQpIGkubmV4dCgpOwotCQkJaW50IGNvdW50ID0gZ2V0RWxlbWVudFJlZmVyZW5jZUNvdW50KGVsZW1lbnQpOwotCQkJaWYgKGNvdW50IDwgbG93ZXN0UmVmZXJlbmNlQ291bnQpIHsKLQkJCQlyZXN1bHQgPSBlbGVtZW50OwotCQkJCWxvd2VzdFJlZmVyZW5jZUNvdW50ID0gY291bnQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERNb2RlbEJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERNb2RlbEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkZDFkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFRETW9kZWxCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsLkRUREZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQXR0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkF0dGxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQ01Ob2RlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkNNUmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkNNUmVwZWF0YWJsZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5EVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5EVERTYXhBcnRpZmFjdFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5FbGVtZW50RGVjbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkVudGl0eURlY2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5FcnJvck1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5Ob3RhdGlvbkRlY2w7Ci0KLXB1YmxpYyBjbGFzcyBEVERNb2RlbEJ1aWxkZXIgZXh0ZW5kcyBEVERTYXhBcnRpZmFjdFZpc2l0b3IgewotCURURCBkdGQ7Ci0JRFREVXRpbCBkdGRVdGlsOwotCURUREZpbGUgZHRkRmlsZTsKLQlSZXNvdXJjZVNldCByZXNvdXJjZXM7Ci0KLQlwdWJsaWMgRFRETW9kZWxCdWlsZGVyKFJlc291cmNlU2V0IHJlc291cmNlcywgRFREVXRpbCBkdGRVdGlsLCBEVEQgZHRkLCBEVERGaWxlIGR0ZEZpbGUpIHsKLQkJdGhpcy5yZXNvdXJjZXMgPSByZXNvdXJjZXM7Ci0JCXRoaXMuZHRkVXRpbCA9IGR0ZFV0aWw7Ci0JCXRoaXMuZHRkID0gZHRkOwotCQl0aGlzLmR0ZEZpbGUgPSBkdGRGaWxlOwotCX0KLQotCXB1YmxpYyBEVERGYWN0b3J5SW1wbCBnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gKERUREZhY3RvcnlJbXBsKSBkdGRVdGlsLmdldEZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgRFRERmlsZSBnZXREVERGaWxlKCkgewotCQlyZXR1cm4gZHRkRmlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERURChEVEQgZHRkKSB7Ci0JCXN1cGVyLnZpc2l0RFREKGR0ZCk7Ci0KLQkJLy8gLSAybmQgcGFzcyAtCi0JCS8vIGRvIGZpbmFsIHByb2Nlc3NpbmcgZm9yIEF0dGxpc3RzIGFuZCBhZGRpbmcgY29udGVudE1vZGVsCi0JCWFkZEF0dGxpc3RBbmRDb250ZW50TW9kZWwoZHRkLCBkdGRGaWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsKEVsZW1lbnREZWNsIGVsZW1lbnQpIHsKLQkJLy8gRWxlbWVudCBtaWdodCBoYXZlIGJlZW4gYWRkZWQgZWFybGllciBiZWNhdXNlIGl0IGlzIHJlZmVyZW5jZWQKLQkJU3RyaW5nIGRlY2xOYW1lID0gZWxlbWVudC5nZXROb2RlTmFtZSgpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInByb2Nlc3MgRWxlbWVudERlY2w6IiArIGRlY2xOYW1lICk7Ci0JCURUREVsZW1lbnQgZHRkZWxlbWVudCA9IChEVERFbGVtZW50KSBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkuZ2V0KGRlY2xOYW1lKTsKLQkJaWYgKGR0ZGVsZW1lbnQgPT0gbnVsbCkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJwcm9jZXNzIEVsZW1lbnREZWNsIC0gbm90IGZvdW5kIC0gY3JlYXRlIgotCQkJLy8gKTsKLQkJCWR0ZGVsZW1lbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERWxlbWVudCgpOwotCQkJZHRkZWxlbWVudC5zZXROYW1lKGRlY2xOYW1lKTsKLQkJCWR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZGVsZW1lbnQpOwotCQkJZHRkVXRpbC5nZXRFbGVtZW50UG9vbCgpLnB1dChkZWNsTmFtZSwgZHRkZWxlbWVudCk7Ci0JCX0KLQotCQlzdXBlci52aXNpdEVsZW1lbnREZWNsKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Tm90YXRpb25EZWNsKE5vdGF0aW9uRGVjbCBub3RhdGlvbikgewotCQkvLyBOb3RhdGlvbiBtaWdodCBoYXZlIGJlZW4gYWRkZWQgZWFybGllciBiZWNhdXNlIGl0IGlzIHJlZmVyZW5jZWQKLQkJLy8gYnkgYW4gZW50aXR5Ci0JCURURE5vdGF0aW9uIGR0ZG5vdCA9IGR0ZEZpbGUuZmluZE5vdGF0aW9uKG5vdGF0aW9uLmdldE5vZGVOYW1lKCkpOwotCQlpZiAoZHRkbm90ID09IG51bGwpIHsKLQkJCWR0ZG5vdCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVEROb3RhdGlvbigpOwotCQkJZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoZHRkbm90KTsKLQkJfQotCQlkdGRub3Quc2V0TmFtZShub3RhdGlvbi5nZXROb2RlTmFtZSgpKTsKLQotCQlpZiAobm90YXRpb24uZ2V0U3lzdGVtSWQoKSAhPSBudWxsKQotCQkJZHRkbm90LnNldFN5c3RlbUlEKG5vdGF0aW9uLmdldFN5c3RlbUlkKCkpOwotCQlpZiAobm90YXRpb24uZ2V0UHVibGljSWQoKSAhPSBudWxsKQotCQkJZHRkbm90LnNldFB1YmxpY0lEKG5vdGF0aW9uLmdldFB1YmxpY0lkKCkpOwotCi0JCWlmIChub3RhdGlvbi5nZXRDb21tZW50KCkgIT0gbnVsbCkKLQkJCWR0ZG5vdC5zZXRDb21tZW50KG5vdGF0aW9uLmdldENvbW1lbnQoKSk7Ci0JCWlmIChub3RhdGlvbi5nZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlhZGRFcnJvck1lc3NhZ2Uobm90YXRpb24uZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZG5vdCk7Ci0JCX0KLQotCQlzdXBlci52aXNpdE5vdGF0aW9uRGVjbChub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VEZWNsKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JCS8vIFRoaXMgaXMgYSBwYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZS4KLQkJLy8gQWRkIHRoZSBsaW5rIHRvIHRoZSByZWFsIGVudGl0eSB0aGF0IGl0IHJlZmVyZW5jZXMKLQkJRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRSZWYgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCk7Ci0JCWR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKHBhcm1FbnRSZWYpOwotCi0JCVN0cmluZyBlbnRpdHlOYW1lID0gZW50aXR5LmdldE5vZGVOYW1lKCk7Ci0KLQkJLy8gQWRkIHRoZSByZWZlcmVuY2UgdG8gdGhlIERUREVudGl0eQotCQlEVERFbnRpdHkgZHRkZW50aXR5ID0gZ2V0RFRERmlsZSgpLmZpbmRFbnRpdHkoZW50aXR5TmFtZSk7Ci0JCWlmIChkdGRlbnRpdHkgIT0gbnVsbCkgewotCQkJcGFybUVudFJlZi5zZXRFbnRpdHkoZHRkZW50aXR5KTsKLQkJfQotCQlpZiAoZW50aXR5LmdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCWFkZEVycm9yTWVzc2FnZShlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZGVudGl0eSk7Ci0JCX0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgUEUgcmVmZXJlbmNlOiAiICsgZGVjbE5hbWUpOwotCi0JCXN1cGVyLnZpc2l0UGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRGVjbChlbnRpdHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RXh0ZXJuYWxFbnRpdHlEZWNsKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JCURUREVudGl0eSBkdGRFbnRpdHkgPSBjcmVhdGVEVERFbnRpdHkoZW50aXR5KTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgZW50aXR5OiAiICsgZGVjbE5hbWUpOwotCQlEVERFeHRlcm5hbEVudGl0eSBleHRFbnRpdHkgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERXh0ZXJuYWxFbnRpdHkoKTsKLQkJZHRkRW50aXR5LnNldENvbnRlbnQoZXh0RW50aXR5KTsKLQotCQlmaW5pc2hFeHRlcm5hbEVudGl0eShleHRFbnRpdHksIGVudGl0eSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGV4dCBlbnRpdHkgdG9Nb2Y6ICIgKTsKLQkJaWYgKGR0ZEVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKSB7Ci0KLQkJCWR0ZFV0aWwuZ2V0UEVQb29sKCkucHV0KCIlIiArIGVudGl0eS5nZXROb2RlTmFtZSgpICsgIjsiLCBkdGRFbnRpdHkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXN1cGVyLnZpc2l0RXh0ZXJuYWxFbnRpdHlEZWNsKGVudGl0eSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRJbnRlcm5hbEVudGl0eURlY2woRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkJRFRERW50aXR5IGR0ZEVudGl0eSA9IGNyZWF0ZURUREVudGl0eShlbnRpdHkpOwotCi0JCURUREludGVybmFsRW50aXR5IGludEVudGl0eSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERJbnRlcm5hbEVudGl0eSgpOwotCQlkdGRFbnRpdHkuc2V0Q29udGVudChpbnRFbnRpdHkpOwotCQlpbnRFbnRpdHkuc2V0VmFsdWUoZW50aXR5LmdldFZhbHVlKCkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBpbnQgZW50aXR5IHRvTW9mOiAiICk7Ci0JCWlmIChkdGRFbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkgewotCQkJZHRkVXRpbC5nZXRQRVBvb2woKS5wdXQoIiUiICsgZW50aXR5LmdldE5vZGVOYW1lKCkgKyAiOyIsIGR0ZEVudGl0eSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJc3VwZXIudmlzaXRJbnRlcm5hbEVudGl0eURlY2woZW50aXR5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQXR0bGlzdEFuZENvbnRlbnRNb2RlbChEVEQgZHRkLCBEVERGaWxlIGRGaWxlKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiYWRkQXR0TGlzdEFuZENvdGVudE1vZGVsIC0gZHRkOiIgKwotCQkvLyBkdGQuZ2V0TmFtZSgpKTsKLQkJRW51bWVyYXRpb24gZW4gPSBkdGQuZXh0ZXJuYWxFbGVtZW50cygpOwotCQl3aGlsZSAoZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCU9iamVjdCBlID0gZW4ubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgRWxlbWVudERlY2wpIHsKLQkJCQlEVERFbGVtZW50IGR0ZGVsZW1lbnQgPSAoRFRERWxlbWVudCkgZHRkVXRpbC5nZXRFbGVtZW50UG9vbCgpLmdldCgoKEVsZW1lbnREZWNsKSBlKS5nZXROb2RlTmFtZSgpKTsKLQkJCQlpZiAoZHRkZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJCWR0ZGVsZW1lbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERWxlbWVudCgpOwotCQkJCQlkdGRGaWxlLmdldERURE9iamVjdCgpLmFkZChkdGRlbGVtZW50KTsKLQkJCQl9Ci0JCQkJZmluaXNoRWxlbWVudERlY2woZHRkZWxlbWVudCwgKEVsZW1lbnREZWNsKSBlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBBdHRsaXN0KSB7Ci0JCQkJcHJvY2Vzc0F0dExpc3QoKEF0dGxpc3QpIGUpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0F0dExpc3QoQXR0bGlzdCBhdHRMaXN0KSB7Ci0JCURUREVsZW1lbnQgZSA9IChEVERFbGVtZW50KSBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkuZ2V0KGF0dExpc3QuZ2V0Tm9kZU5hbWUoKSk7Ci0JCWlmIChlICE9IG51bGwpIHsKLQkJCS8vIEVsZW1lbnQgaGFzIGJlZW4gYWRkZWQuIEFkZCB0aGUgYXR0cmlidXRlcwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgcHJvY2Vzc0F0dGxpc3QgLSBhZGRpbmcgQXR0bGlzdDoiICsKLQkJCS8vIGF0dExpc3QuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQljcmVhdGVBdHRyaWJ1dGVzKGUsIGF0dExpc3QpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIhISEhISEhISEgZWxlbWVudCBpcyBudWxsICIpOwotCQl9Ci0JfQotCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vCi0JLy8gTWV0aG9kcyBmb3IgZmluaXNoaW5nIHRoZSBpbXBvcnQgb2YgYSBEVERFeHRlcm5hbEVudGl0eQotCS8vCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCXZvaWQgZmluaXNoRXh0ZXJuYWxFbnRpdHkoRFRERXh0ZXJuYWxFbnRpdHkgZXh0RW50aXR5LCBFbnRpdHlEZWNsIGVudGl0eURlY2wpIHsKLQkJdXBkYXRlU3lzdGVtSUQoZXh0RW50aXR5LCBlbnRpdHlEZWNsKTsKLQkJZXh0RW50aXR5LnNldFB1YmxpY0lEKGVudGl0eURlY2wuZ2V0UHVibGljSWQoKSk7Ci0KLQkJU3RyaW5nIG5vdGF0aW9uTmFtZSA9IGVudGl0eURlY2wuZ2V0Tm90YXRpb25OYW1lKCk7Ci0JCWlmIChub3RhdGlvbk5hbWUgIT0gbnVsbCkgewotCQkJRFRETm90YXRpb24gZHRkTm90YXRpb24gPSBjcmVhdGVPckZpbmROb3RhdGlvbihleHRFbnRpdHksIG5vdGF0aW9uTmFtZSwgdHJ1ZSk7Ci0JCQlleHRFbnRpdHkuc2V0Tm90YXRpb24oZHRkTm90YXRpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIERURE5vdGF0aW9uIGNyZWF0ZU9yRmluZE5vdGF0aW9uKERUREV4dGVybmFsRW50aXR5IGV4dEVudGl0eSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCURURE5vdGF0aW9uIGFOb3RhdGlvbiA9IGV4dEVudGl0eS5nZXREVERFbnRpdHkoKS5nZXREVERGaWxlKCkuZmluZE5vdGF0aW9uKG5hbWUpOwotCQlpZiAoYU5vdGF0aW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBhTm90YXRpb247Ci0JCX0KLQotCQkvLwotCQkvLyBDcmVhdGUgYSBub3RhdGlvbiBmb3IgdGhlIHJlZmVyZW5jZQotCQkvLwotCQlpZiAoY3JlYXRlKSB7Ci0JCQlhTm90YXRpb24gPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRETm90YXRpb24oKTsKLQkJCWR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGFOb3RhdGlvbik7Ci0JCQlhTm90YXRpb24uc2V0TmFtZShuYW1lKTsKLQkJfQotCQlyZXR1cm4gYU5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIFRoZSBTeXN0ZW1JRCBhdHRyaWJ1dGUgaXMgc2V0IHRvIHdoYXRldmVyIHRoZSB1c2VyIGVudGVycyBlLmcuCi0JICogY29tL2libS9iMmIveG1pbW9kZWxzL3h4eC5kdGQueG1pCi0JICogCi0JICogSW4gdGhlIHVucGFyc2UoKSBtZXRob2QsIHBhcnNlIG91dCB0aGUgRFREIGZpbGUgbmFtZSBmcm9tIHRoZSBjbGFzc3BhdGgKLQkgKiBuYW1lLiBlLmcuIHJldHVybnMgeHh4LmR0ZAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVTeXN0ZW1JRChEVERFeHRlcm5hbEVudGl0eSBleHRFbnRpdHksIEVudGl0eURlY2wgZW50aXR5RGVjbCkgewotCQlTdHJpbmcgc3lzdGVtSWQgPSBlbnRpdHlEZWNsLmdldFN5c3RlbUlkKCk7Ci0JCVN0cmluZyBwdWJsaWNJZCA9IGVudGl0eURlY2wuZ2V0UHVibGljSWQoKTsKLQkJaWYgKHN5c3RlbUlkICE9IG51bGwpIHsKLQkJCVVSSVJlc29sdmVyIGlkUmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOwotCQkJU3RyaW5nIHVyaSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShkdGQuZ2V0TmFtZSgpLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQkJRXh0ZXJuYWxEVERNb2RlbCBlZCA9IGR0ZFV0aWwuZ2V0RXh0ZXJuYWxEVERNb2RlbChyZXNvdXJjZXMsIHVyaSk7Ci0JCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJCURUREZpbGUgcmVmZXJlbmNlRHRkRmlsZSA9IGVkLmdldEV4dGVybmFsRFRERmlsZSgpOwotCQkJCWV4dEVudGl0eS5zZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKHJlZmVyZW5jZUR0ZEZpbGUpOwotCQkJCWV4dEVudGl0eS5zZXRTeXN0ZW1JRChzeXN0ZW1JZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZW50aXR5RGVjbC5nZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsKSB7Ci0JCQkJCUVycm9yTWVzc2FnZSBkdGRFcnJvciA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQkJCQkJZHRkRXJyb3Iuc2V0RXJyb3JNZXNzYWdlKERURENvcmVNZXNzYWdlcy5fRVJST1JfSU5DTF9GSUxFX0xPQURfRkFJTFVSRSArICIgJyIgKyBzeXN0ZW1JZCArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWFkZEVycm9yTWVzc2FnZShkdGRFcnJvciwgZXh0RW50aXR5LmdldERUREVudGl0eSgpKTsKLQkJCQl9Ci0KLQkJCQlpZiAoc3lzdGVtSWQgIT0gbnVsbCkgewotCQkJCQlleHRFbnRpdHkuc2V0U3lzdGVtSUQoc3lzdGVtSWQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZXh0RW50aXR5LnNldFN5c3RlbUlEKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJZWxzZSB7Ci0JCQkvLyBzZXQgdGhlIHN5c3RlbSBpZCB0byBiZSAiIgotCQkJZXh0RW50aXR5LnNldFN5c3RlbUlEKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIERUREVudGl0eSBjcmVhdGVEVERFbnRpdHkoRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkJLy8gY3JlYXRlIGFuZCBkbyB3aGF0IHdlIGNhbiB0byBmaWxsIGluIHNvbWUgYmFzaWMgdGhpbmdzCi0JCURUREVudGl0eSBkdGRFbnRpdHkgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW50aXR5KCk7Ci0JCWR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZEVudGl0eSk7Ci0KLQkJZHRkRW50aXR5LnNldE5hbWUoZW50aXR5LmdldE5vZGVOYW1lKCkpOwotCQlkdGRFbnRpdHkuc2V0UGFyYW1ldGVyRW50aXR5KGVudGl0eS5pc1BhcmFtZXRlcigpKTsKLQkJaWYgKGVudGl0eS5nZXRDb21tZW50KCkgIT0gbnVsbCkgewotCQkJZHRkRW50aXR5LnNldENvbW1lbnQoZW50aXR5LmdldENvbW1lbnQoKSk7Ci0JCX0KLQkJaWYgKGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlhZGRFcnJvck1lc3NhZ2UoZW50aXR5LmdldEVycm9yTWVzc2FnZSgpLCBkdGRFbnRpdHkpOwotCQl9Ci0KLQkJcmV0dXJuIGR0ZEVudGl0eTsKLQl9Ci0KLQotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLwotCS8vIE1ldGhvZHMgZm9yIGZpbmlzaGluZyB0aGUgaW1wb3J0IG9mIGEgRFRERWxlbWVudAotCS8vCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCXB1YmxpYyB2b2lkIGZpbmlzaEVsZW1lbnREZWNsKERUREVsZW1lbnQgZHRkRWxlbWVudCwgRWxlbWVudERlY2wgZWQpIHsKLQkJZHRkRWxlbWVudC5zZXROYW1lKGVkLmdldE5vZGVOYW1lKCkpOwotCi0JCUNNTm9kZSBjbU5vZGUgPSBlZC5nZXRDb250ZW50TW9kZWxOb2RlKCk7Ci0KLQkJaWYgKGVkLmdldENvbW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlkdGRFbGVtZW50LnNldENvbW1lbnQoZWQuZ2V0Q29tbWVudCgpKTsKLQkJfQotCQlpZiAoZWQuZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJYWRkRXJyb3JNZXNzYWdlKGVkLmdldEVycm9yTWVzc2FnZSgpLCBkdGRFbGVtZW50KTsKLQkJfQotCi0JCWlmIChjbU5vZGUgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJQ01CYXNpY05vZGUgYm4gPSAoQ01CYXNpY05vZGUpIGNtTm9kZTsKLQkJCXN3aXRjaCAoYm4uZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBDTU5vZGVUeXBlLkVNUFRZIDoKLQkJCQkJRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQkJCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGVtcHR5Q29udGVudCk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBDTU5vZGVUeXBlLkFOWSA6Ci0JCQkJCURUREFueUNvbnRlbnQgYW55Q29udGVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERBbnlDb250ZW50KCk7Ci0JCQkJCWR0ZEVsZW1lbnQuc2V0Q29udGVudChhbnlDb250ZW50KTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIENNTm9kZVR5cGUuUENEQVRBIDoKLQkJCQkJRFREUENEYXRhQ29udGVudCBwY0RhdGEgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFREUENEYXRhQ29udGVudCgpOwotCQkJCQlkdGRFbGVtZW50LnNldENvbnRlbnQocGNEYXRhKTsKLQkJCX0KLQotCQl9Ci0JCWVsc2UgaWYgKGNtTm9kZSBpbnN0YW5jZW9mIENNUmVmZXJlbmNlTm9kZSkgewotCQkJQ01SZWZlcmVuY2VOb2RlIHJuID0gKENNUmVmZXJlbmNlTm9kZSkgY21Ob2RlOwotCQkJaWYgKHJuLmdldFR5cGUoKSA9PSBDTU5vZGVUeXBlLkVOVElUWV9SRUZFUkVOQ0UpIHsKLQkJCQlTdHJpbmcgZW50aXR5TmFtZSA9IHJuLmdldE5hbWUoKS50cmltKCk7Ci0KLQkJCQlEVERFbnRpdHkgYW5FbnRpdHkgPSAoRFRERW50aXR5KSBkdGRVdGlsLmdldFBFUG9vbCgpLmdldChlbnRpdHlOYW1lKTsKLQkJCQlpZiAoYW5FbnRpdHkgIT0gbnVsbCkgewotCQkJCQkvLwotCQkJCQkvLyBDcmVhdGUgYW4gRFRERW50aXR5UmVmZXJlbmNlIGFuZCBzZXQgaXRzIHJlZmVyZW5jZWQKLQkJCQkJLy8gZWxlbWVudAotCQkJCQkvLwotCQkJCQlEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGVuUmVmID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQkJCQkJZW5SZWYuc2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoYW5FbnRpdHkpOwotCi0JCQkJCURURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKHJuKSk7Ci0JCQkJCWVuUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCi0JCQkJCWR0ZEVsZW1lbnQuc2V0Q29udGVudChlblJlZik7Ci0JCQkJfQotCQkJCWVsc2UgeyAvLyBjcmVhdGUgZGVmYXVsdCBjb250ZW50Ci0JCQkJCURUREVtcHR5Q29udGVudCBlbXB0eUNvbnRlbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0JCQkJCWR0ZEVsZW1lbnQuc2V0Q29udGVudChlbXB0eUNvbnRlbnQpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vCi0JCQkJLy8gRmluZCB0aGUgcmVhbCBlbGVtZW50IGZvciB0aGlzIGVsZW1lbnQgcmVmZXJlbmNlcwotCQkJCS8vIElmIHRoZSByZWFsIGVsZW1lbnQgZG9lcyBub3QgeWV0IGV4aXN0LCBjcmVhdGUgaXQKLQkJCQkvLwotCQkJCURUREVsZW1lbnQgYW5FbGVtZW50ID0gY3JlYXRlT3JGaW5kRWxlbWVudChybi5nZXROYW1lKCksIGR0ZEVsZW1lbnQpOwotCi0JCQkJLy8KLQkJCQkvLyBDcmVhdGUgYW4gRFRERWxlbWVudFJlZmVyZW5jZSBhbmQgc2V0IGl0cyByZWZlcmVuY2VkCi0JCQkJLy8gZWxlbWVudAotCQkJCS8vCi0JCQkJRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgZWxlbVJlZiA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpOwotCQkJCWVsZW1SZWYuc2V0UmVmZXJlbmNlZEVsZW1lbnQoYW5FbGVtZW50KTsKLQotCQkJCURURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKHJuKSk7Ci0JCQkJZWxlbVJlZi5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQotCQkJCS8vIHNldENvbnRlbnQgdG8gRFRERWxlbWVudFJlZmVyZW5jZQotCQkJCWR0ZEVsZW1lbnQuc2V0Q29udGVudChlbGVtUmVmKTsKLQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGNtTm9kZSBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKSB7Ci0JCQlDTUdyb3VwTm9kZSBncnBOb2RlID0gKENNR3JvdXBOb2RlKSBjbU5vZGU7Ci0JCQlEVERHcm91cENvbnRlbnQgZ3JvdXBDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREdyb3VwQ29udGVudCgpOwotCQkJRFRER3JvdXBLaW5kIGdyb3VwS2luZCA9IERUREdyb3VwS2luZC5nZXQoY29tcHV0ZU1vZkdyb3VwS2luZChncnBOb2RlLmdldEdyb3VwS2luZCgpKSk7Ci0JCQlncm91cENvbnRlbnQuc2V0R3JvdXBLaW5kKGdyb3VwS2luZCk7Ci0JCQlEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9IERURE9jY3VycmVuY2VUeXBlLmdldChjb21wdXRlTW9mT2NjdXJyZW5jZShncnBOb2RlKSk7Ci0JCQlncm91cENvbnRlbnQuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0KLQkJCS8vIGp1c3QgdXNlIHRoZSBsb2NhdG9yIGZvciB0aGUgZWxlbWVudCBhcyB0aGUgY2xvc2VzdCBndWVzcwotCQkJcHJvY2Vzc0dyb3VwQ29udGVudChncm91cENvbnRlbnQsIGdycE5vZGUpOwotCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGdyb3VwQ29udGVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoY21Ob2RlID09IG51bGwpIHsKLQkJCS8vIGJhZCB0aGluZyBoYXBwZW5lZCBoZXJlLCBqdXN0IGNyZWF0ZSBhIHBjZGF0YQotCQkJRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQkJCWR0ZEVsZW1lbnQuc2V0Q29udGVudChlbXB0eUNvbnRlbnQpOwotCQl9Ci0KLQotCX0KLQotCi0JLyoqCi0JICogQWRkIGEgbmV3IGdyb3VwIHRvIHRoZSBjdXJyZW50IGdyb3VwCi0JICogCi0JICogQHBhcmFtIHBhcmVudCAtCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IG5vZGUgZm9yIHRoaXMgZ3JvdXAgZWxlbWVudAotCSAqIEBwYXJhbSBvcDFOb2RlIC0KLQkgKiAgICAgICAgICAgIHRoZSBncm91cCBlLmcuIChhLGIpCi0JICogQHBhcmFtIG9wMk5vZGUgLQotCSAqICAgICAgICAgICAgc2V0IG9ubHkgaWYgY2FsbGVkIGJ5IHByb2Nlc3NDTTFvcCBlLmcuIChhLGIpKwotCSAqLwotCXZvaWQgcHJvY2Vzc0dyb3VwQ29udGVudChEVERHcm91cENvbnRlbnQgcGFyZW50LCBDTUdyb3VwTm9kZSBncnBOb2RlKSB7Ci0JCUVudW1lcmF0aW9uIGNoaWxkcmVuID0gZ3JwTm9kZS5nZXRDaGlsZHJlbigpLmVsZW1lbnRzKCk7Ci0JCURUREZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkoKTsKLQkJd2hpbGUgKGNoaWxkcmVuLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlDTU5vZGUgY25vZGUgPSAoQ01Ob2RlKSBjaGlsZHJlbi5uZXh0RWxlbWVudCgpOwotCi0JCQlpZiAoY25vZGUgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkgewotCQkJCUNNR3JvdXBOb2RlIGdOb2RlID0gKENNR3JvdXBOb2RlKSBjbm9kZTsKLQkJCQlEVERHcm91cENvbnRlbnQgZ3JvdXBDb250ZW50ID0gZmFjdG9yeS5jcmVhdGVEVERHcm91cENvbnRlbnQoKTsKLQkJCQlEVERHcm91cEtpbmQgZ3JvdXBLaW5kID0gRFRER3JvdXBLaW5kLmdldChjb21wdXRlTW9mR3JvdXBLaW5kKGdOb2RlLmdldEdyb3VwS2luZCgpKSk7Ci0JCQkJZ3JvdXBDb250ZW50LnNldEdyb3VwS2luZChncm91cEtpbmQpOwotCQkJCURURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKGdOb2RlKSk7Ci0JCQkJZ3JvdXBDb250ZW50LnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCi0JCQkJcGFyZW50LmdldENvbnRlbnQoKS5hZGQoZ3JvdXBDb250ZW50KTsKLQkJCQlwcm9jZXNzR3JvdXBDb250ZW50KGdyb3VwQ29udGVudCwgZ05vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAoY25vZGUgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJCUNNQmFzaWNOb2RlIG4gPSAoQ01CYXNpY05vZGUpIGNub2RlOwotCQkJCWlmIChuLmdldFR5cGUoKSA9PSBDTU5vZGVUeXBlLlBDREFUQSkgewotCQkJCQkvLyBDcmVhdGUgYSBEVERQQ0RhdGFDb250ZW50IGZvciBhIGxlYWYgUENEYXRhIG5vZGUKLQkJCQkJLy8KLQkJCQkJRFREUENEYXRhQ29udGVudCBwY0RhdGEgPSBmYWN0b3J5LmNyZWF0ZURURFBDRGF0YUNvbnRlbnQoKTsKLQkJCQkJLy8gQWRkICNQQ0RBVEEgdG8gdGhlIEdyb3VwLCBpLmUgTWl4ZWQgY29udGVudCBtb2RlbAotCQkJCQlwYXJlbnQuZ2V0Q29udGVudCgpLmFkZChwY0RhdGEpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGNub2RlIGluc3RhbmNlb2YgQ01SZWZlcmVuY2VOb2RlKSB7Ci0JCQkJQ01SZWZlcmVuY2VOb2RlIHJuID0gKENNUmVmZXJlbmNlTm9kZSkgY25vZGU7Ci0JCQkJaWYgKHJuLmdldFR5cGUoKSA9PSBDTU5vZGVUeXBlLkVMRU1FTlRfUkVGRVJFTkNFKSB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ00gRWxlbWVudCBSZWYgbmFtZTogIiArCi0JCQkJCS8vIHJuLmdldE5hbWUoKSk7Ci0JCQkJCS8vCi0JCQkJCS8vIENyZWF0ZSBhbiBEVERFbGVtZW50UmVmZXJlbmNlIGFuZCBzZXQgaXRzIHJlZmVyZW5jZWQKLQkJCQkJLy8gZWxlbWVudAotCQkJCQkvLwotCQkJCQlEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtUmVmID0gZmFjdG9yeS5jcmVhdGVEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpOwotCi0JCQkJCS8vCi0JCQkJCS8vIEZpbmQgdGhlIHJlYWwgZWxlbWVudCBmb3IgdGhpcyBlbGVtZW50IHJlZmVyZW5jZXMKLQkJCQkJLy8gSWYgdGhlIHJlYWwgZWxlbWVudCBkb2VzIG5vdCB5ZXQgZXhpc3QsIGNyZWF0ZSBpdAotCQkJCQkvLwotCQkJCQlEVERFbGVtZW50IGFuRWxlbWVudCA9IGNyZWF0ZU9yRmluZEVsZW1lbnQocm4uZ2V0TmFtZSgpLCBlbGVtUmVmKTsKLQotCQkJCQllbGVtUmVmLnNldFJlZmVyZW5jZWRFbGVtZW50KGFuRWxlbWVudCk7Ci0KLQkJCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkJCQkJZWxlbVJlZi5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQotCQkJCQkvLyBBZGQgRFRERWxlbWVudFJlZmVyZW5jZSB0byB0aGUgR3JvdXAKLQkJCQkJcGFyZW50LmdldENvbnRlbnQoKS5hZGQoZWxlbVJlZik7Ci0JCQkJfQotCQkJCWVsc2UgLy8gUEUgUmVmZXJlbmNlCi0JCQkJewotCQkJCQlTdHJpbmcgZW50aXR5TmFtZSA9IHJuLmdldE5hbWUoKS50cmltKCk7Ci0KLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDTSBQRSBSZWYgbmFtZTogIiArIGVudGl0eU5hbWUpOwotCQkJCQlEVERFbnRpdHkgYW5FbnRpdHkgPSAoRFRERW50aXR5KSBkdGRVdGlsLmdldFBFUG9vbCgpLmdldChlbnRpdHlOYW1lKTsKLQkJCQkJaWYgKGFuRW50aXR5ICE9IG51bGwpIHsKLQkJCQkJCS8vCi0JCQkJCQkvLyBDcmVhdGUgYW4gRFRERW50aXR5UmVmZXJlbmNlIGFuZCBzZXQgaXRzIHJlZmVyZW5jZWQKLQkJCQkJCS8vIGVsZW1lbnQKLQkJCQkJCS8vCi0JCQkJCQlEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGVuUmVmID0gZmFjdG9yeS5jcmVhdGVEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCk7Ci0JCQkJCQllblJlZi5zZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShhbkVudGl0eSk7Ci0KLQkJCQkJCURURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKHJuKSk7Ci0JCQkJCQllblJlZi5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQotCQkJCQkJLy8gQWRkIERUREVudGl0eVJlZmVyZW5jZSB0byB0aGUgR3JvdXAKLQkJCQkJCXBhcmVudC5nZXRDb250ZW50KCkuYWRkKGVuUmVmKTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRmluZCB0aGUgcmVhbCBlbGVtZW50IHRoYXQgaXMgcmVmZXJlbmNlZCBieSB0aGUgY3VycmVudCBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSBEVERFbGVtZW50IGNyZWF0ZU9yRmluZEVsZW1lbnQoU3RyaW5nIG5hbWUsIE9iamVjdCBvYmopIHsKLQkJLy8gRFRERWxlbWVudCBhRWxlbWVudCA9IGdldERUREZpbGUoKS5maW5kRWxlbWVudChuYW1lKTsKLQotCQlEVERFbGVtZW50IGFFbGVtZW50ID0gKERUREVsZW1lbnQpIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQobmFtZSk7Ci0KLQkJaWYgKGFFbGVtZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBhRWxlbWVudDsKLQkJfQotCi0JCVN0cmluZyBlcnJvck1zZyA9IERURENvcmVNZXNzYWdlcy5fRVJST1JfVU5ERUNMQVJFRF9FTEVNRU5UXzE7IC8vJE5PTi1OTFMtMSQKLQkJZXJyb3JNc2cgKz0gIlwiIiArIG5hbWUgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZXJyb3JNc2cgKz0gRFREQ29yZU1lc3NhZ2VzLl9VSV9FUlJPUlBBUlRfVU5ERUNMQVJFRF9FTEVNRU5UXzI7IC8vJE5PTi1OTFMtMSQKLQotCQlFcnJvck1lc3NhZ2UgZHRkRXJyb3IgPSBuZXcgRXJyb3JNZXNzYWdlKCk7Ci0KLQkJZHRkRXJyb3Iuc2V0RXJyb3JNZXNzYWdlKGVycm9yTXNnKTsKLQkJYWRkRXJyb3JNZXNzYWdlKGR0ZEVycm9yLCBvYmopOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZXJyb3JNc2cpOwotCQkvLyBzZXREVERFcnJvck1lc3NhZ2UoZXJyb3JNc2cpOwotCQlnZXREVERGaWxlKCkuc2V0UGFyc2VFcnJvcih0cnVlKTsKLQotCQkvLwotCQkvLyBDcmVhdGUgYW4gZW1wdHkgZWxlbWVudCBmb3IgdGhlIHJlZmVyZW5jZSB0byBtYWtlIGl0IHZhbGlkCi0JCS8vCi0KLQkJRFRERmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSgpOwotCQlEVERFbGVtZW50IGR0ZGVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZURUREVsZW1lbnQoKTsKLQkJZHRkZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCi0JCURUREVtcHR5Q29udGVudCBlbXB0eUNvbnRlbnQgPSBmYWN0b3J5LmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCQlkdGRlbGVtZW50LnNldENvbnRlbnQoZW1wdHlDb250ZW50KTsKLQotCQlnZXREVERGaWxlKCkuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZGVsZW1lbnQpOwotCQlkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkucHV0KG5hbWUsIGR0ZGVsZW1lbnQpOwotCQlyZXR1cm4gZHRkZWxlbWVudDsKLQl9Ci0KLQotCS8qKgotCSAqIENvbXB1dGUgdGhlIE1PRiBvY2N1cnJlbmNlIGZyb20gdGhlIHhtbDRqIG9jY3VycmVuY2UKLQkgKi8KLQlwcml2YXRlIGludCBjb21wdXRlTW9mT2NjdXJyZW5jZShDTVJlcGVhdGFibGVOb2RlIHJub2RlKSB7Ci0JCWludCBvY2N1cnJlbmNlID0gcm5vZGUuZ2V0T2NjdXJyZW5jZSgpOwotCQlpbnQgbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5PTkU7Ci0KLQkJaWYgKG9jY3VycmVuY2UgPT0gQ01Ob2RlVHlwZS5aRVJPX09SX01PUkUpIHsKLQkJCW1vZm9jY3VyID0gRFRET2NjdXJyZW5jZVR5cGUuWkVST19PUl9NT1JFOwotCQl9Ci0JCWVsc2UgaWYgKG9jY3VycmVuY2UgPT0gQ01Ob2RlVHlwZS5PTkVfT1JfTU9SRSkgewotCQkJbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5PTkVfT1JfTU9SRTsKLQkJfQotCQllbHNlIGlmIChvY2N1cnJlbmNlID09IENNTm9kZVR5cGUuT1BUSU9OQUwpIHsKLQkJCW1vZm9jY3VyID0gRFRET2NjdXJyZW5jZVR5cGUuT1BUSU9OQUw7Ci0JCX0KLQkJcmV0dXJuIG1vZm9jY3VyOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGUgdGhlIE1PRiBtb2RlbCBncm91cCBmcm9tIHRoZSB4bWw0aiBtb2RlbCBncm91cAotCSAqLwotCXByaXZhdGUgaW50IGNvbXB1dGVNb2ZHcm91cEtpbmQoaW50IHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gQ01Ob2RlVHlwZS5HUk9VUF9DSE9JQ0UpIHsKLQkJCXJldHVybiBEVERHcm91cEtpbmQuQ0hPSUNFOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIERUREdyb3VwS2luZC5TRVFVRU5DRTsKLQkJfQotCX0KLQotCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vCi0JLy8gTWV0aG9kcyBmb3IgY3JlYXRpbmcgdGhlIGF0dHJpYnV0ZXMgb2YgYSBEVERFbGVtZW50Ci0JLy8KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JcHVibGljIHZvaWQgY3JlYXRlQXR0cmlidXRlcyhEVERFbGVtZW50IGVsZW1lbnQsIEF0dGxpc3QgYXR0TGlzdCkgewotCQlpZiAoYXR0TGlzdC5nZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlhZGRFcnJvck1lc3NhZ2UoYXR0TGlzdC5nZXRFcnJvck1lc3NhZ2UoKSwgZWxlbWVudCk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUF0dE5vZGUgYWQgPSBhdHRMaXN0LmVsZW1lbnRBdChpKTsKLQkJCS8vIERUREF0dHJpYnV0ZUVsZW1lbnQgZHRkQXR0PQotCQkJLy8gZ2V0RFREQXR0cmlidXRlRWxlbWVudChhLmdldE5hbWUoKSk7Ci0KLQkJCS8vIG9ubHkgYWRkIHRoZSBBdHREZWYgaWYgaXQgaXMgbm90IGFkZGVkIHlldAotCQkJLy8gaWdub3JlIHRoZSBkdXAgQXR0RGVmIGFzIGRvY3VtZW50ZWQgaW4gdGhlIFhNTCAxLjAgc3BlY3MKLQkJCS8vIGlmKCBkdGRBdHQ9PW51bGwpCi0JCQlhZGRBdHRyaWJ1dGUoZWxlbWVudCwgYWQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBEVERBdHRyaWJ1dGUgZnJvbSB0aGUgeG1sNGogYXR0cmlidXRlCi0JICovCi0JcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKERUREVsZW1lbnQgZHRkZWxlbWVudCwgQXR0Tm9kZSBhZCkgewotCQlEVERBdHRyaWJ1dGUgZHRkYXR0ciA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERBdHRyaWJ1dGUoKTsKLQkJZHRkZWxlbWVudC5nZXREVERBdHRyaWJ1dGUoKS5hZGQoZHRkYXR0cik7Ci0JCWZpbmlzaEF0dHJpYnV0ZShkdGRhdHRyLCBhZCk7Ci0JfQotCi0JLy8gU3R1ZmYgZm9yIHBvcHVsYXRpbmcgYXR0cmlidXRlCi0JcHVibGljIHZvaWQgZmluaXNoQXR0cmlidXRlKERUREF0dHJpYnV0ZSBkdGRhdHRyLCBBdHROb2RlIGF0dGRlZikgewotCQlib29sZWFuIHBhcnNlRXJyb3IgPSBmYWxzZTsKLQotCQlpZiAoYXR0ZGVmLm5hbWUuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBwZU5hbWUgPSBhdHRkZWYubmFtZS50cmltKCk7Ci0JCQlEVERFbnRpdHkgZW4gPSAoRFRERW50aXR5KSBkdGRVdGlsLmdldFBFUG9vbCgpLmdldChwZU5hbWUpOwotCQkJaWYgKGVuICE9IG51bGwpIHsKLQkJCQlkdGRhdHRyLnNldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KGVuKTsKLQkJCX0KLQkJfQotCi0JCWR0ZGF0dHIuc2V0TmFtZShhdHRkZWYubmFtZSk7Ci0KLQkJaW50IGF0dHJUeXBlID0gYXR0ZGVmLmdldERlY2xhcmVkVHlwZSgpOwotCi0JCWlmIChhdHRyVHlwZSA9PSBBdHROb2RlLlBFUkVGRVJFTkNFICYmIGF0dGRlZi50eXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBwZU5hbWUgPSBhdHRkZWYudHlwZS50cmltKCk7Ci0JCQlEVERFbnRpdHkgZW4gPSAoRFRERW50aXR5KSBkdGRVdGlsLmdldFBFUG9vbCgpLmdldChwZU5hbWUpOwotCQkJaWYgKGVuICE9IG51bGwpIHsKLQkJCQlkdGRhdHRyLnNldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KGVuKTsKLQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0NEQVRBKCkpOyAvLyBoYWNrLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzbwotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB3ZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYW4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZ2V0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGJhY2sKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGRlZmF1bHQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdmFsdWUKLQkJCX0KLQkJCWVsc2UKLQkJCQkvLyBzZXQgZGVmYXVsdCB0eXBlCi0JCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9DREFUQSgpKTsKLQotCQl9Ci0JCWVsc2UgewotCQkJc3dpdGNoIChhdHRyVHlwZSkgewotCQkJCWNhc2UgQXR0Tm9kZS5DREFUQSA6Ci0JCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfQ0RBVEEoKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBdHROb2RlLkVOVElUSUVTIDoKLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9FTlRJVElFUygpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEF0dE5vZGUuRU5USVRZIDoKLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9FTlRJVFkoKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBdHROb2RlLklEIDoKLQkJCQkJLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBJRCBhdHRyaWJ1dGUKLQkJCQkJaWYgKGhhc0lEQXR0cmlidXRlKGR0ZGF0dHIpKSB7Ci0JCQkJCQlTdHJpbmcgZXJyTXNnID0gRFREQ29yZU1lc3NhZ2VzLl9FUlJPUl9EVVBfSURfQVRUUklCVVRFXzE7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWVyck1zZyArPSBhdHRkZWYubmFtZSArIERURENvcmVNZXNzYWdlcy5fVUlfRVJST1JQQVJUX0RVUF9JRF9BVFRSSUJVVEVfMjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0SUVsZW1lbnQoKS5zZXREVERFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkJCQkJCS8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5zZXRQYXJzZUVycm9yKHRydWUpOwotCQkJCQkJcGFyc2VFcnJvciA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9JRCgpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEF0dE5vZGUuSURSRUYgOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0lEUkVGKCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5JRFJFRlMgOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0lEUkVGUygpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEF0dE5vZGUuRU5VTUVSQVRJT04gOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBjcmVhdGVEVERFbnVtZXJhdGlvbihkdGRhdHRyLCBhdHRkZWYsIERUREVudW1Hcm91cEtpbmQuTkFNRV9UT0tFTl9HUk9VUCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5OT1RBVElPTiA6Ci0JCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGNyZWF0ZURUREVudW1lcmF0aW9uKGR0ZGF0dHIsIGF0dGRlZiwgRFRERW51bUdyb3VwS2luZC5OT1RBVElPTl9HUk9VUCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5OTVRPS0VOIDoKLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9OTVRPS0VOKCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5OTVRPS0VOUyA6Ci0JCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfTk1UT0tFTlMoKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJZGVmYXVsdCA6Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRUREFUVFIgJyIgK2F0dGRlZi5uYW1lICsgIidVbmtub3duCi0JCQkvLyB0eXBlLi4uIiArIGF0dHJUeXBlKTsKLQkJCX0KLQkJfQotCi0JCWludCBhdHRyRGVmYXVsdCA9IGF0dGRlZi5nZXREZWZhdWx0VHlwZSgpOwotCQlpbnQgZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5JTVBMSUVEOwotCQlzd2l0Y2ggKGF0dHJEZWZhdWx0KSB7Ci0JCQljYXNlIEF0dE5vZGUuRklYRUQgOgotCQkJCWRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuRklYRUQ7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQXR0Tm9kZS5JTVBMSUVEIDoKLQkJCQlkZWZhdWx0S2luZCA9IERURERlZmF1bHRLaW5kLklNUExJRUQ7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQXR0Tm9kZS5SRVFVSVJFRCA6Ci0JCQkJZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5SRVFVSVJFRDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBdHROb2RlLk5PRklYRUQgOgotCQkJCWRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuTk9GSVhFRDsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRFREQVRUUiAnIiArYXR0ZGVmLm5hbWUgKyAiJyBVbmtub3duIGRlZmF1bHQKLQkJLy8gdHlwZS4uLiAiICsgYXR0ckRlZmF1bHQpOwotCQl9Ci0KLQkJRFRERGVmYXVsdEtpbmQgZGVmYXVsdEtpbmRPYmogPSBEVEREZWZhdWx0S2luZC5nZXQoZGVmYXVsdEtpbmQpOwotCQlkdGRhdHRyLnNldERlZmF1bHRLaW5kKGRlZmF1bHRLaW5kT2JqKTsKLQotCQlpZiAocGFyc2VFcnJvcikgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGF0dGRlZi5kZWZhdWx0VmFsdWU7Ci0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKGF0dHJUeXBlID09IEF0dE5vZGUuRU5VTUVSQVRJT04gfHwgYXR0clR5cGUgPT0gQXR0Tm9kZS5OT1RBVElPTikgewotCQkJCWlmICghaXNEZWZhdWx0RW51bVZhbHVlVmFsaWQoYXR0ZGVmLCBkZWZhdWx0VmFsdWUpKSB7Ci0JCQkJCVN0cmluZyB0eXBlU3RyaW5nID0gKGF0dHJUeXBlID09IEF0dE5vZGUuRU5VTUVSQVRJT04gPyAiZW51bWVyYXRpb24iIDogIm5vdGF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlTdHJpbmcgZXJyTXNnID0gRFREQ29yZU1lc3NhZ2VzLl9FUlJPUl9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8xOyAvLyROT04tTkxTLTEkCi0JCQkJCWVyck1zZyArPSB0eXBlU3RyaW5nICsgRFREQ29yZU1lc3NhZ2VzLl9VSV9FUlJPUlBBUlRfSU5WQUxJRF9ERUZBVUxUX0FUVFJfVkFMVUVfMjsgLy8kTk9OLU5MUy0xJAotCQkJCQllcnJNc2cgKz0gYXR0ZGVmLm5hbWUgKyAiJyI7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkvLyBkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXRJRWxlbWVudCgpLnNldERUREVycm9yTWVzc2FnZShlcnJNc2cpOwotCQkJCQkvLyBkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXREVERGaWxlKCkuc2V0UGFyc2VFcnJvcih0cnVlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWR0ZGF0dHIuc2V0RGVmYXVsdFZhbHVlU3RyaW5nKGRlZmF1bHRWYWx1ZSk7Ci0JCX0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJEVERBdHRyIC0gdG9Nb2YgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nICIgKwotCQkvLyBnZXREZWZhdWx0VmFsdWVTdHJpbmcoKSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRFREQXR0ciAtIHRvTW9mIGdldERlZmF1bHRWYWx1ZTogIiArCi0JCS8vIGdldERlZmF1bHRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNJREF0dHJpYnV0ZShEVERBdHRyaWJ1dGUgZHRkYXR0cikgewotCQlib29sZWFuIGhhc0lEID0gZmFsc2U7Ci0KLQkJRFRERWxlbWVudCBlbGVtZW50ID0gZHRkYXR0ci5nZXREVERFbGVtZW50KCk7Ci0JCUVMaXN0IGF0dHJzID0gZWxlbWVudC5nZXREVERBdHRyaWJ1dGUoKTsKLQotCQlJdGVyYXRvciBpID0gYXR0cnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlEVERBdHRyaWJ1dGUgYXR0ciA9IChEVERBdHRyaWJ1dGUpIGkubmV4dCgpOwotCQkJRFREVHlwZSBkVHlwZSA9IGF0dHIuZ2V0RFREVHlwZSgpOwotCQkJaWYgKGRUeXBlIGluc3RhbmNlb2YgRFREQmFzaWNUeXBlKSB7Ci0JCQkJaWYgKCgoRFREQmFzaWNUeXBlKSBkVHlwZSkuZ2V0S2luZCgpLmdldFZhbHVlKCkgPT0gRFREQmFzaWNUeXBlS2luZC5JRCkgewotCQkJCQloYXNJRCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFzSUQ7Ci0JfQotCi0JcHVibGljIERUREVudW1lcmF0aW9uVHlwZSBjcmVhdGVEVERFbnVtZXJhdGlvbihEVERBdHRyaWJ1dGUgZHRkYXR0ciwgU3RyaW5nW10gZW51bVZhbHVlcywgaW50IGVudW1LaW5kKSB7Ci0JCURUREVudW1lcmF0aW9uVHlwZSBlbnVtZXJhdGlvbiA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbnVtZXJhdGlvblR5cGUoKTsKLQkJRFRERW51bUdyb3VwS2luZCBncm91cEtpbmQgPSBEVERFbnVtR3JvdXBLaW5kLmdldChlbnVtS2luZCk7Ci0JCWVudW1lcmF0aW9uLnNldEtpbmQoZ3JvdXBLaW5kKTsKLQkJLy8gRW51bWVyYXRpb24gdmFsdWVzCi0JCWlmIChlbnVtVmFsdWVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW51bVZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCUVFbnVtTGl0ZXJhbCBlbnVtTGl0ZXJhbCA9IGNyZWF0ZUVFbnVtTGl0ZXJhbCgpOwotCQkJCS8vIGVudW1WYWwuc2V0WE1JRG9jdW1lbnQoZHRkYXR0ci5nZXRYTUlEb2N1bWVudCgpKTsKLQkJCQkvLyBNT0YyRU1GIFBvcnQKLQkJCQkvLyBlbnVtTGl0ZXJhbC5yZWZTZXRMaXRlcmFsKGVudW1WYWx1ZXNbaV0pOwotCQkJCWVudW1MaXRlcmFsLnNldE5hbWUoZW51bVZhbHVlc1tpXSk7Ci0KLQkJCQkvLyBlbnVtTGl0ZXJhbC5zZXROdW1iZXIoaSk7Ci0JCQkJZW51bWVyYXRpb24uZ2V0RW51bUxpdGVyYWxzKCkuYWRkKGVudW1MaXRlcmFsKTsKLQkJCX0KLQkJfQotCQlkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXREVERGaWxlKCkuZ2V0RFRERW51bWVyYXRpb25UeXBlKCkuYWRkKGVudW1lcmF0aW9uKTsKLQkJcmV0dXJuIGVudW1lcmF0aW9uOwotCX0KLQotCXByaXZhdGUgRUVudW1MaXRlcmFsIGNyZWF0ZUVFbnVtTGl0ZXJhbCgpIHsKLQkJRWNvcmVQYWNrYWdlIGVQYWNrYWdlID0gKEVjb3JlUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOwotCQkvLyBNT0YyRU1GIFBvcnQKLQkJLy8gcmV0dXJuICgoRWNvcmVGYWN0b3J5KWVQYWNrYWdlLmdldEZhY3RvcnkoKSkuY3JlYXRlRUVudW1MaXRlcmFsKCk7Ci0JCXJldHVybiBlUGFja2FnZS5nZXRFY29yZUZhY3RvcnkoKS5jcmVhdGVFRW51bUxpdGVyYWwoKTsKLQl9Ci0KLQlwcml2YXRlIERUREVudW1lcmF0aW9uVHlwZSBjcmVhdGVEVERFbnVtZXJhdGlvbihEVERBdHRyaWJ1dGUgZHRkYXR0ciwgQXR0Tm9kZSBhdHRkZWYsIGludCBlbnVtS2luZCkgewotCQlEVERFbnVtZXJhdGlvblR5cGUgZW51bWVyYXRpb24gPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW51bWVyYXRpb25UeXBlKCk7Ci0JCURUREVudW1Hcm91cEtpbmQgZ3JvdXBLaW5kID0gRFRERW51bUdyb3VwS2luZC5nZXQoZW51bUtpbmQpOwotCQllbnVtZXJhdGlvbi5zZXRLaW5kKGdyb3VwS2luZCk7Ci0JCWR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5nZXREVERFbnVtZXJhdGlvblR5cGUoKS5hZGQoZW51bWVyYXRpb24pOwotCi0JCS8vIEVudW1lcmF0aW9uIHZhbHVlcwotCQlFbnVtZXJhdGlvbiB0b2tlbkl0ZXIgPSBhdHRkZWYuZWxlbWVudHMoKTsKLQkJaWYgKHRva2VuSXRlciAhPSBudWxsKSB7Ci0JCQl3aGlsZSAodG9rZW5JdGVyLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIHZhbCA9IChTdHJpbmcpIHRva2VuSXRlci5uZXh0RWxlbWVudCgpOwotCQkJCUVFbnVtTGl0ZXJhbCBlbnVtTGl0ZXJhbCA9IGNyZWF0ZUVFbnVtTGl0ZXJhbCgpOwotCQkJCS8vIGVudW1MaXRlcmFsLnNldFhNSURvY3VtZW50KGR0ZGF0dHIuZ2V0WE1JRG9jdW1lbnQoKSk7Ci0JCQkJLy8gTU9GMkVNRiBQb3J0Ci0JCQkJLy8gZW51bUxpdGVyYWwucmVmU2V0TGl0ZXJhbCh2YWwpOwotCQkJCWVudW1MaXRlcmFsLnNldE5hbWUodmFsKTsKLQotCi0JCQkJLy8gZW51bUxpdGVyYWwuc2V0TnVtYmVyKGkrKyk7Ci0JCQkJZW51bWVyYXRpb24uZ2V0RW51bUxpdGVyYWxzKCkuYWRkKGVudW1MaXRlcmFsKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBlbnVtZXJhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0RW51bVZhbHVlVmFsaWQoQXR0Tm9kZSBhdHRkZWYsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCQlib29sZWFuIGNvbnRhaW5zUGVyY2VudCA9IGZhbHNlOwotCi0JCS8vIEVudW1lcmF0aW9uIHZhbHVlcwotCQlFbnVtZXJhdGlvbiBlbnVtVmFsdWVzID0gYXR0ZGVmLmVsZW1lbnRzKCk7Ci0JCXdoaWxlIChlbnVtVmFsdWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlTdHJpbmcgdmFsID0gKFN0cmluZykgZW51bVZhbHVlcy5uZXh0RWxlbWVudCgpOwotCQkJaWYgKHZhbC5lcXVhbHMoZGVmYXVsdFZhbHVlKSkgewotCQkJCXZhbGlkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICh2YWwuaW5kZXhPZignJScpID49IDApIHsKLQkJCQljb250YWluc1BlcmNlbnQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YWxpZCB8fCBjb250YWluc1BlcmNlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0ckRURFR5cGUoRFREQXR0cmlidXRlIGR0ZGF0dHIsIERURFR5cGUgdHlwZSkgewotCQlkdGRhdHRyLnNldERURFR5cGUodHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXJyb3JNZXNzYWdlKEVycm9yTWVzc2FnZSBlcnJNc2csIE9iamVjdCBvYmopIHsKLQkJZXJyTXNnLnNldE9iamVjdChvYmopOwotCQlkdGRVdGlsLmFkZEVycm9yTWVzc2FnZShlcnJNc2cpOwotCX0KLQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERUREZhY3RvcnlJbXBsIGdldEZhY3RvcnlHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gKERUREZhY3RvcnlJbXBsKWR0ZFV0aWwuZ2V0RmFjdG9yeSgpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBEVERGaWxlIGdldERUREZpbGVHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gZHRkRmlsZTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREdlbihEVEQgZHRkKSB7Ci0JLy8KLQkvLyBzdXBlci52aXNpdERURChkdGQpOwotCS8vCi0JLy8KLQkvLyAvLyAtIDJuZCBwYXNzIC0KLQkvLyAvLyBkbyBmaW5hbCBwcm9jZXNzaW5nIGZvciBBdHRsaXN0cyBhbmQgYWRkaW5nIGNvbnRlbnRNb2RlbAotCS8vIGFkZEF0dGxpc3RBbmRDb250ZW50TW9kZWwoZHRkLGR0ZEZpbGUpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0RWxlbWVudERlY2xHZW4oRWxlbWVudERlY2wgZWxlbWVudCkgewotCS8vCi0JLy8gLy8gRWxlbWVudCBtaWdodCBoYXZlIGJlZW4gYWRkZWQgZWFybGllciBiZWNhdXNlIGl0IGlzIHJlZmVyZW5jZWQKLQkvLyBTdHJpbmcgZGVjbE5hbWUgPSBlbGVtZW50LmdldE5vZGVOYW1lKCkgOwotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicHJvY2VzcyBFbGVtZW50RGVjbDoiICsgZGVjbE5hbWUgKTsKLQkvLyBEVERFbGVtZW50IGR0ZGVsZW1lbnQgPSAoRFRERWxlbWVudCkKLQkvLyBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkuZ2V0KGRlY2xOYW1lKTsKLQkvLyBpZiAoZHRkZWxlbWVudCA9PSBudWxsKQotCS8vIHsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInByb2Nlc3MgRWxlbWVudERlY2wgLSBub3QgZm91bmQgLSBjcmVhdGUiICk7Ci0JLy8gZHRkZWxlbWVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbGVtZW50KCk7Ci0JLy8gZHRkZWxlbWVudC5zZXROYW1lKGRlY2xOYW1lKTsKLQkvLyBkdGRGaWxlLmdldERURE9iamVjdCgpLmFkZChkdGRlbGVtZW50KTsKLQkvLyBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkucHV0KGRlY2xOYW1lLGR0ZGVsZW1lbnQpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gc3VwZXIudmlzaXRFbGVtZW50RGVjbChlbGVtZW50KTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdE5vdGF0aW9uRGVjbEdlbihOb3RhdGlvbkRlY2wgbm90YXRpb24pIHsKLQkvLwotCS8vIC8vIE5vdGF0aW9uIG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCBlYXJsaWVyIGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZAotCS8vIC8vIGJ5IGFuIGVudGl0eQotCS8vIERURE5vdGF0aW9uIGR0ZG5vdCA9IGR0ZEZpbGUuZmluZE5vdGF0aW9uKCBub3RhdGlvbi5nZXROb2RlTmFtZSgpICk7Ci0JLy8gaWYgKGR0ZG5vdCA9PSBudWxsKQotCS8vIHsKLQkvLyBkdGRub3QgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRETm90YXRpb24oKTsKLQkvLyBkdGRGaWxlLmdldERURE9iamVjdCgpLmFkZChkdGRub3QpOwotCS8vIH0KLQkvLyBkdGRub3Quc2V0TmFtZShub3RhdGlvbi5nZXROb2RlTmFtZSgpKTsKLQkvLwotCS8vCi0JLy8gaWYgKG5vdGF0aW9uLmdldFN5c3RlbUlkKCkhPSBudWxsICkKLQkvLyBkdGRub3Quc2V0U3lzdGVtSUQobm90YXRpb24uZ2V0U3lzdGVtSWQoKSk7Ci0JLy8gaWYgKG5vdGF0aW9uLmdldFB1YmxpY0lkKCkhPSBudWxsICkKLQkvLyBkdGRub3Quc2V0UHVibGljSUQobm90YXRpb24uZ2V0UHVibGljSWQoKSk7Ci0JLy8KLQkvLwotCS8vIGlmIChub3RhdGlvbi5nZXRDb21tZW50KCkhPW51bGwpCi0JLy8gZHRkbm90LnNldENvbW1lbnQobm90YXRpb24uZ2V0Q29tbWVudCgpKTsKLQkvLyBpZiAobm90YXRpb24uZ2V0RXJyb3JNZXNzYWdlKCkhPW51bGwpCi0JLy8gewotCS8vIGFkZEVycm9yTWVzc2FnZShub3RhdGlvbi5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkbm90KTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIHN1cGVyLnZpc2l0Tm90YXRpb25EZWNsKG5vdGF0aW9uKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZURlY2xHZW4oRW50aXR5RGVjbCBlbnRpdHkpCi0JLy8gewotCS8vCi0JLy8gLy8gVGhpcyBpcyBhIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlLgotCS8vIC8vIEFkZCB0aGUgbGluayB0byB0aGUgcmVhbCBlbnRpdHkgdGhhdCBpdCByZWZlcmVuY2VzCi0JLy8gRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRSZWYgPQotCS8vIGdldEZhY3RvcnkoKS5jcmVhdGVEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQkvLyBkdGRGaWxlLmdldERURE9iamVjdCgpLmFkZChwYXJtRW50UmVmKTsKLQkvLwotCS8vCi0JLy8gU3RyaW5nIGVudGl0eU5hbWUgPSBlbnRpdHkuZ2V0Tm9kZU5hbWUoKTsKLQkvLwotCS8vCi0JLy8gLy8gQWRkIHRoZSByZWZlcmVuY2UgdG8gdGhlIERUREVudGl0eQotCS8vIERUREVudGl0eSBkdGRlbnRpdHkgPSBnZXREVERGaWxlKCkuZmluZEVudGl0eShlbnRpdHlOYW1lKTsKLQkvLyBpZiAoZHRkZW50aXR5ICE9IG51bGwpCi0JLy8gewotCS8vIHBhcm1FbnRSZWYuc2V0RW50aXR5KGR0ZGVudGl0eSk7Ci0JLy8gfQotCS8vIGlmIChlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCkhPW51bGwpCi0JLy8gewotCS8vIGFkZEVycm9yTWVzc2FnZShlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZGVudGl0eSk7Ci0JLy8gfQotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiYWRkaW5nIFBFIHJlZmVyZW5jZTogIiArIGRlY2xOYW1lKTsKLQkvLwotCS8vCi0JLy8gc3VwZXIudmlzaXRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VEZWNsKGVudGl0eSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXRFeHRlcm5hbEVudGl0eURlY2xHZW4oRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkvLwotCS8vIERUREVudGl0eSBkdGRFbnRpdHkgPSBjcmVhdGVEVERFbnRpdHkoZW50aXR5KTsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyBlbnRpdHk6ICIgKyBkZWNsTmFtZSk7Ci0JLy8gRFRERXh0ZXJuYWxFbnRpdHkgZXh0RW50aXR5ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREV4dGVybmFsRW50aXR5KCk7Ci0JLy8gZHRkRW50aXR5LnNldENvbnRlbnQoZXh0RW50aXR5KTsKLQkvLwotCS8vCi0JLy8gZmluaXNoRXh0ZXJuYWxFbnRpdHkoZXh0RW50aXR5LCBlbnRpdHkpOwotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGV4dCBlbnRpdHkgdG9Nb2Y6ICIgKTsKLQkvLyBpZiAoZHRkRW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkpCi0JLy8gewotCS8vCi0JLy8KLQkvLyBkdGRVdGlsLmdldFBFUG9vbCgpLnB1dCgiJSIrZW50aXR5LmdldE5vZGVOYW1lKCkrIjsiLCBkdGRFbnRpdHkpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gc3VwZXIudmlzaXRFeHRlcm5hbEVudGl0eURlY2woZW50aXR5KTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdEludGVybmFsRW50aXR5RGVjbEdlbihFbnRpdHlEZWNsIGVudGl0eSkgewotCS8vCi0JLy8gRFRERW50aXR5IGR0ZEVudGl0eSA9IGNyZWF0ZURUREVudGl0eShlbnRpdHkpOwotCS8vCi0JLy8KLQkvLyBEVERJbnRlcm5hbEVudGl0eSBpbnRFbnRpdHkgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRESW50ZXJuYWxFbnRpdHkoKTsKLQkvLyBkdGRFbnRpdHkuc2V0Q29udGVudChpbnRFbnRpdHkpOwotCS8vIGludEVudGl0eS5zZXRWYWx1ZShlbnRpdHkuZ2V0VmFsdWUoKSk7Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCIgaW50IGVudGl0eSB0b01vZjogIiApOwotCS8vIGlmIChkdGRFbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkKLQkvLyB7Ci0JLy8gZHRkVXRpbC5nZXRQRVBvb2woKS5wdXQoIiUiK2VudGl0eS5nZXROb2RlTmFtZSgpKyI7IiwgZHRkRW50aXR5KTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIHN1cGVyLnZpc2l0SW50ZXJuYWxFbnRpdHlEZWNsKGVudGl0eSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgYWRkQXR0bGlzdEFuZENvbnRlbnRNb2RlbEdlbihEVEQgZHRkLCBEVERGaWxlIGRGaWxlKSB7Ci0JLy8KLQkvLyAvL1N5c3RlbS5vdXQucHJpbnRsbigiYWRkQXR0TGlzdEFuZENvdGVudE1vZGVsIC0gZHRkOiIgKwotCS8vIGR0ZC5nZXROYW1lKCkpOwotCS8vIEVudW1lcmF0aW9uIGVuID0gZHRkLmV4dGVybmFsRWxlbWVudHMoKTsKLQkvLyB3aGlsZSAoZW4uaGFzTW9yZUVsZW1lbnRzKCkpCi0JLy8gewotCS8vIE9iamVjdCBlID0gZW4ubmV4dEVsZW1lbnQoKTsKLQkvLyBpZiAoIGUgaW5zdGFuY2VvZiBFbGVtZW50RGVjbCApCi0JLy8gewotCS8vIERUREVsZW1lbnQgZHRkZWxlbWVudCA9IChEVERFbGVtZW50KSBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkuZ2V0KAotCS8vICgoRWxlbWVudERlY2wpZSkuZ2V0Tm9kZU5hbWUoKSApOwotCS8vIGlmIChkdGRlbGVtZW50ID09IG51bGwpCi0JLy8gewotCS8vIGR0ZGVsZW1lbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERWxlbWVudCgpOwotCS8vIGR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZGVsZW1lbnQpOwotCS8vIH0KLQkvLyBmaW5pc2hFbGVtZW50RGVjbChkdGRlbGVtZW50LCAoRWxlbWVudERlY2wpIGUpOwotCS8vIH0KLQkvLyBlbHNlIGlmICggZSBpbnN0YW5jZW9mIEF0dGxpc3QgKQotCS8vIHsKLQkvLyBwcm9jZXNzQXR0TGlzdCgoQXR0bGlzdCkgZSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQXR0TGlzdEdlbihBdHRsaXN0IGF0dExpc3QpIHsKLQkvLwotCS8vIERUREVsZW1lbnQgZSA9IChEVERFbGVtZW50KQotCS8vIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQoYXR0TGlzdC5nZXROb2RlTmFtZSgpKTsKLQkvLyBpZiAoIGUgIT0gbnVsbCApCi0JLy8gewotCS8vIC8vIEVsZW1lbnQgaGFzIGJlZW4gYWRkZWQuIEFkZCB0aGUgYXR0cmlidXRlcwotCS8vIC8vU3lzdGVtLm91dC5wcmludGxuKCIgcHJvY2Vzc0F0dGxpc3QgLSBhZGRpbmcgQXR0bGlzdDoiICsKLQkvLyBhdHRMaXN0LmdldE5vZGVOYW1lKCkpOwotCS8vIGNyZWF0ZUF0dHJpYnV0ZXMoZSwgYXR0TGlzdCk7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gLy9TeXN0ZW0ub3V0LnByaW50bG4oIiEhISEhISEhISBlbGVtZW50IGlzIG51bGwgIik7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGZpbmlzaEV4dGVybmFsRW50aXR5R2VuKERUREV4dGVybmFsRW50aXR5IGV4dEVudGl0eSwKLQkvLyBFbnRpdHlEZWNsIGVudGl0eURlY2wpIHsKLQkvLwotCS8vIHVwZGF0ZVN5c3RlbUlEKGV4dEVudGl0eSwgZW50aXR5RGVjbCk7Ci0JLy8gZXh0RW50aXR5LnNldFB1YmxpY0lEKGVudGl0eURlY2wuZ2V0UHVibGljSWQoKSk7Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBub3RhdGlvbk5hbWUgPSBlbnRpdHlEZWNsLmdldE5vdGF0aW9uTmFtZSgpOwotCS8vIGlmIChub3RhdGlvbk5hbWUgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gRFRETm90YXRpb24gZHRkTm90YXRpb24gPSBjcmVhdGVPckZpbmROb3RhdGlvbihleHRFbnRpdHksCi0JLy8gbm90YXRpb25OYW1lLHRydWUpOwotCS8vIGV4dEVudGl0eS5zZXROb3RhdGlvbihkdGROb3RhdGlvbik7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBEVEROb3RhdGlvbiBjcmVhdGVPckZpbmROb3RhdGlvbkdlbihEVERFeHRlcm5hbEVudGl0eQotCS8vIGV4dEVudGl0eSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JLy8KLQkvLyBEVEROb3RhdGlvbiBhTm90YXRpb24gPQotCS8vIGV4dEVudGl0eS5nZXREVERFbnRpdHkoKS5nZXREVERGaWxlKCkuZmluZE5vdGF0aW9uKG5hbWUpOwotCS8vIGlmIChhTm90YXRpb24gIT0gbnVsbCkKLQkvLyB7Ci0JLy8gcmV0dXJuIGFOb3RhdGlvbjsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIC8vCi0JLy8gLy8gQ3JlYXRlIGEgbm90YXRpb24gZm9yIHRoZSByZWZlcmVuY2UKLQkvLyAvLwotCS8vIGlmIChjcmVhdGUpCi0JLy8gewotCS8vIGFOb3RhdGlvbiA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVEROb3RhdGlvbigpOwotCS8vIGR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGFOb3RhdGlvbik7Ci0JLy8gYU5vdGF0aW9uLnNldE5hbWUobmFtZSk7Ci0JLy8gfQotCS8vIHJldHVybiBhTm90YXRpb247Ci0JLy8gfQotCS8vIC8qKgotCS8vICogVGhlIFN5c3RlbUlEIGF0dHJpYnV0ZSBpcyBzZXQgdG8gd2hhdGV2ZXIgdGhlIHVzZXIgZW50ZXJzCi0JLy8gKiBlLmcuIGNvbS9pYm0vYjJiL3htaW1vZGVscy94eHguZHRkLnhtaQotCS8vICoKLQkvLyAqIEluIHRoZSB1bnBhcnNlKCkgbWV0aG9kLCBwYXJzZSBvdXQgdGhlIERURCBmaWxlIG5hbWUgZnJvbQotCS8vICogdGhlIGNsYXNzcGF0aCBuYW1lLgotCS8vICogZS5nLiByZXR1cm5zIHh4eC5kdGQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVN5c3RlbUlER2VuKERUREV4dGVybmFsRW50aXR5IGV4dEVudGl0eSwKLQkvLyBFbnRpdHlEZWNsIGVudGl0eURlY2wpIHsKLQkvLwotCS8vIFN0cmluZyBzeXN0ZW1JZCA9IGVudGl0eURlY2wuZ2V0U3lzdGVtSWQoKTsKLQkvLyBTdHJpbmcgcHVibGljSWQgPSBlbnRpdHlEZWNsLmdldFB1YmxpY0lkKCk7Ci0JLy8gaWYgKHN5c3RlbUlkICE9IG51bGwpCi0JLy8gewotCS8vIElkUmVzb2x2ZXIgaWRSZXNvbHZlciA9IG5ldyBJZFJlc29sdmVySW1wbChkdGQuZ2V0TmFtZSgpKTsKLQkvLyBTdHJpbmcgdXJpID0gaWRSZXNvbHZlci5yZXNvbHZlSWQocHVibGljSWQsIHN5c3RlbUlkKTsKLQkvLyBFeHRlcm5hbERURE1vZGVsIGVkID0gZHRkVXRpbC5nZXRFeHRlcm5hbERURE1vZGVsKHJlc291cmNlcywgdXJpKTsKLQkvLyBpZiAoZWQgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gRFRERmlsZSByZWZlcmVuY2VEdGRGaWxlID0gZWQuZ2V0RXh0ZXJuYWxEVERGaWxlKCk7Ci0JLy8gZXh0RW50aXR5LnNldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUocmVmZXJlbmNlRHRkRmlsZSk7Ci0JLy8gZXh0RW50aXR5LnNldFN5c3RlbUlEKHN5c3RlbUlkKTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyBpZiAoZW50aXR5RGVjbC5nZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsKQotCS8vIHsKLQkvLyBFcnJvck1lc3NhZ2UgZHRkRXJyb3IgPSBuZXcgRXJyb3JNZXNzYWdlKCk7Ci0JLy8gZHRkRXJyb3Iuc2V0RXJyb3JNZXNzYWdlKERURENvcmVNZXNzYWdlcy5nZXRTdHJpbmcoIl9FUlJPUl9JTkNMX0ZJTEVfTE9BRF9GQUlMVVJFIikKLQkvLyArICIgJyIgKyBzeXN0ZW1JZCArICInIik7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGR0ZEVycm9yLCBleHRFbnRpdHkuZ2V0RFRERW50aXR5KCkpOwotCS8vIH0KLQkvLyAgICAgICAgCi0JLy8gaWYgKHN5c3RlbUlkICE9IG51bGwpCi0JLy8gewotCS8vIGV4dEVudGl0eS5zZXRTeXN0ZW1JRChzeXN0ZW1JZCk7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gZXh0RW50aXR5LnNldFN5c3RlbUlEKCIiKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gZWxzZQotCS8vIHsKLQkvLyAvLyBzZXQgdGhlIHN5c3RlbSBpZCB0byBiZSAiIgotCS8vIGV4dEVudGl0eS5zZXRTeXN0ZW1JRCgiIik7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBEVERFbnRpdHkgY3JlYXRlRFRERW50aXR5R2VuKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JLy8KLQkvLyAvLyBjcmVhdGUgYW5kIGRvIHdoYXQgd2UgY2FuIHRvIGZpbGwgaW4gc29tZSBiYXNpYyB0aGluZ3MKLQkvLyBEVERFbnRpdHkgZHRkRW50aXR5ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVudGl0eSgpOwotCS8vIGR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZEVudGl0eSk7Ci0JLy8KLQkvLwotCS8vIGR0ZEVudGl0eS5zZXROYW1lKGVudGl0eS5nZXROb2RlTmFtZSgpKTsKLQkvLyBkdGRFbnRpdHkuc2V0UGFyYW1ldGVyRW50aXR5KGVudGl0eS5pc1BhcmFtZXRlcigpKTsKLQkvLyBpZiAoZW50aXR5LmdldENvbW1lbnQoKSE9bnVsbCkKLQkvLyB7Ci0JLy8gZHRkRW50aXR5LnNldENvbW1lbnQoZW50aXR5LmdldENvbW1lbnQoKSk7Ci0JLy8gfQotCS8vIGlmIChlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCkhPW51bGwpCi0JLy8gewotCS8vIGFkZEVycm9yTWVzc2FnZShlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZEVudGl0eSk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyByZXR1cm4gZHRkRW50aXR5OwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGZpbmlzaEVsZW1lbnREZWNsR2VuKERUREVsZW1lbnQgZHRkRWxlbWVudCwgRWxlbWVudERlY2wKLQkvLyBlZCkgewotCS8vCi0JLy8gZHRkRWxlbWVudC5zZXROYW1lKGVkLmdldE5vZGVOYW1lKCkpOwotCS8vCi0JLy8KLQkvLyBDTU5vZGUgY21Ob2RlID0gZWQuZ2V0Q29udGVudE1vZGVsTm9kZSgpOwotCS8vCi0JLy8KLQkvLyBpZiAoZWQuZ2V0Q29tbWVudCgpIT1udWxsKQotCS8vIHsKLQkvLyBkdGRFbGVtZW50LnNldENvbW1lbnQoZWQuZ2V0Q29tbWVudCgpKTsKLQkvLyB9Ci0JLy8gaWYgKGVkLmdldEVycm9yTWVzc2FnZSgpIT1udWxsKQotCS8vIHsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZWQuZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZEVsZW1lbnQpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gaWYgKGNtTm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKQotCS8vIHsKLQkvLyBDTUJhc2ljTm9kZSBibiA9IChDTUJhc2ljTm9kZSljbU5vZGU7Ci0JLy8gc3dpdGNoIChibi5nZXRUeXBlKCkpCi0JLy8gewotCS8vIGNhc2UgQ01Ob2RlVHlwZS5FTVBUWSA6Ci0JLy8gRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQkvLyBkdGRFbGVtZW50LnNldENvbnRlbnQoZW1wdHlDb250ZW50KTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBDTU5vZGVUeXBlLkFOWSA6Ci0JLy8gRFREQW55Q29udGVudCBhbnlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREFueUNvbnRlbnQoKTsKLQkvLyBkdGRFbGVtZW50LnNldENvbnRlbnQoYW55Q29udGVudCk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQ01Ob2RlVHlwZS5QQ0RBVEE6Ci0JLy8gRFREUENEYXRhQ29udGVudCBwY0RhdGEgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFREUENEYXRhQ29udGVudCgpOwotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChwY0RhdGEpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gfQotCS8vIGVsc2UgaWYgKGNtTm9kZSBpbnN0YW5jZW9mIENNUmVmZXJlbmNlTm9kZSkKLQkvLyB7Ci0JLy8gQ01SZWZlcmVuY2VOb2RlIHJuID0gKENNUmVmZXJlbmNlTm9kZSkgY21Ob2RlOwotCS8vIGlmIChybi5nZXRUeXBlKCkgPT0gQ01Ob2RlVHlwZS5FTlRJVFlfUkVGRVJFTkNFKQotCS8vIHsKLQkvLyBTdHJpbmcgZW50aXR5TmFtZSA9IHJuLmdldE5hbWUoKS50cmltKCk7Ci0JLy8KLQkvLwotCS8vIERUREVudGl0eSBhbkVudGl0eSA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KGVudGl0eU5hbWUpOwotCS8vIGlmIChhbkVudGl0eSE9bnVsbCkKLQkvLyB7Ci0JLy8gLy8KLQkvLyAvLyBDcmVhdGUgYW4gRFRERW50aXR5UmVmZXJlbmNlIGFuZCBzZXQgaXRzIHJlZmVyZW5jZWQgZWxlbWVudAotCS8vIC8vCi0JLy8gRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBlblJlZiA9Ci0JLy8gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQkvLyBlblJlZi5zZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShhbkVudGl0eSk7Ci0JLy8KLQkvLyBEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9Ci0JLy8gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKHJuKSk7Ci0JLy8gZW5SZWYuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0JLy8KLQkvLyBkdGRFbGVtZW50LnNldENvbnRlbnQoZW5SZWYpOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8geyAvLyBjcmVhdGUgZGVmYXVsdCBjb250ZW50Ci0JLy8gRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQkvLyBkdGRFbGVtZW50LnNldENvbnRlbnQoZW1wdHlDb250ZW50KTsKLQkvLyB9Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gLy8KLQkvLyAvLyBGaW5kIHRoZSByZWFsIGVsZW1lbnQgZm9yIHRoaXMgZWxlbWVudCByZWZlcmVuY2VzCi0JLy8gLy8gSWYgdGhlIHJlYWwgZWxlbWVudCBkb2VzIG5vdCB5ZXQgZXhpc3QsIGNyZWF0ZSBpdAotCS8vIC8vCi0JLy8gRFRERWxlbWVudCBhbkVsZW1lbnQgPSBjcmVhdGVPckZpbmRFbGVtZW50KHJuLmdldE5hbWUoKSwgZHRkRWxlbWVudCk7Ci0JLy8KLQkvLwotCS8vIC8vCi0JLy8gLy8gQ3JlYXRlIGFuIERUREVsZW1lbnRSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZCBlbGVtZW50Ci0JLy8gLy8KLQkvLyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtUmVmID0KLQkvLyBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKTsKLQkvLyBlbGVtUmVmLnNldFJlZmVyZW5jZWRFbGVtZW50KGFuRWxlbWVudCk7Ci0JLy8KLQkvLyBEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9Ci0JLy8gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKHJuKSk7Ci0JLy8gZWxlbVJlZi5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQkvLwotCS8vIC8vIHNldENvbnRlbnQgdG8gRFRERWxlbWVudFJlZmVyZW5jZQotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChlbGVtUmVmKTsKLQkvLwotCS8vCi0JLy8gfQotCS8vIH0KLQkvLyBlbHNlIGlmIChjbU5vZGUgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkKLQkvLyB7Ci0JLy8gQ01Hcm91cE5vZGUgZ3JwTm9kZSA9IChDTUdyb3VwTm9kZSljbU5vZGU7Ci0JLy8gRFRER3JvdXBDb250ZW50IGdyb3VwQ29udGVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERHcm91cENvbnRlbnQoKTsKLQkvLyBEVERHcm91cEtpbmQgZ3JvdXBLaW5kID0KLQkvLyBEVERHcm91cEtpbmQuZ2V0KGNvbXB1dGVNb2ZHcm91cEtpbmQoZ3JwTm9kZS5nZXRHcm91cEtpbmQoKSkpOwotCS8vIGdyb3VwQ29udGVudC5zZXRHcm91cEtpbmQoZ3JvdXBLaW5kKTsKLQkvLyBEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9Ci0JLy8gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKGdycE5vZGUpKTsKLQkvLyBncm91cENvbnRlbnQuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0JLy8KLQkvLyAvLyBqdXN0IHVzZSB0aGUgbG9jYXRvciBmb3IgdGhlIGVsZW1lbnQgYXMgdGhlIGNsb3Nlc3QgZ3Vlc3MKLQkvLyBwcm9jZXNzR3JvdXBDb250ZW50KGdyb3VwQ29udGVudCwgZ3JwTm9kZSk7Ci0JLy8gZHRkRWxlbWVudC5zZXRDb250ZW50KGdyb3VwQ29udGVudCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKGNtTm9kZSA9PSBudWxsKQotCS8vIHsKLQkvLyAvLyBiYWQgdGhpbmcgaGFwcGVuZWQgaGVyZSwganVzdCBjcmVhdGUgYSBwY2RhdGEKLQkvLyBEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChlbXB0eUNvbnRlbnQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBBZGQgYSBuZXcgZ3JvdXAgdG8gdGhlIGN1cnJlbnQgZ3JvdXAKLQkvLyAqIEBwYXJhbSBwYXJlbnQgLSB0aGUgcGFyZW50IG5vZGUgZm9yIHRoaXMgZ3JvdXAgZWxlbWVudAotCS8vICogQHBhcmFtIG9wMU5vZGUgLSB0aGUgZ3JvdXAKLQkvLyAqIGUuZy4gKGEsYikKLQkvLyAqIEBwYXJhbSBvcDJOb2RlIC0gc2V0IG9ubHkgaWYgY2FsbGVkIGJ5IHByb2Nlc3NDTTFvcAotCS8vICogZS5nLiAoYSxiKSsKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NHcm91cENvbnRlbnRHZW4oRFRER3JvdXBDb250ZW50IHBhcmVudCwKLQkvLyBDTUdyb3VwTm9kZSBncnBOb2RlKSB7Ci0JLy8KLQkvLyBFbnVtZXJhdGlvbiBjaGlsZHJlbiA9IGdycE5vZGUuZ2V0Q2hpbGRyZW4oKS5lbGVtZW50cygpOwotCS8vIERUREZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkoKTsKLQkvLyB3aGlsZSAoY2hpbGRyZW4uaGFzTW9yZUVsZW1lbnRzKCkpCi0JLy8gewotCS8vIENNTm9kZSBjbm9kZSA9IChDTU5vZGUpIGNoaWxkcmVuLm5leHRFbGVtZW50KCk7Ci0JLy8KLQkvLwotCS8vIGlmIChjbm9kZSBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKQotCS8vIHsKLQkvLyBDTUdyb3VwTm9kZSBnTm9kZSA9IChDTUdyb3VwTm9kZSljbm9kZTsKLQkvLyBEVERHcm91cENvbnRlbnQgZ3JvdXBDb250ZW50ID0gZmFjdG9yeS5jcmVhdGVEVERHcm91cENvbnRlbnQoKTsKLQkvLyBEVERHcm91cEtpbmQgZ3JvdXBLaW5kID0KLQkvLyBEVERHcm91cEtpbmQuZ2V0KGNvbXB1dGVNb2ZHcm91cEtpbmQoZ05vZGUuZ2V0R3JvdXBLaW5kKCkpKTsKLQkvLyBncm91cENvbnRlbnQuc2V0R3JvdXBLaW5kKGdyb3VwS2luZCk7Ci0JLy8gRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPQotCS8vIERURE9jY3VycmVuY2VUeXBlLmdldChjb21wdXRlTW9mT2NjdXJyZW5jZShnTm9kZSkpOwotCS8vIGdyb3VwQ29udGVudC5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQkvLwotCS8vIHBhcmVudC5nZXRDb250ZW50KCkuYWRkKGdyb3VwQ29udGVudCk7Ci0JLy8gcHJvY2Vzc0dyb3VwQ29udGVudChncm91cENvbnRlbnQsZ05vZGUpOwotCS8vIH0KLQkvLyBlbHNlIGlmIChjbm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKQotCS8vIHsKLQkvLyBDTUJhc2ljTm9kZSBuID0gKENNQmFzaWNOb2RlKWNub2RlOwotCS8vIGlmIChuLmdldFR5cGUoKSA9PSBDTU5vZGVUeXBlLlBDREFUQSkKLQkvLyB7Ci0JLy8gLy8gQ3JlYXRlIGEgRFREUENEYXRhQ29udGVudCBmb3IgYSBsZWFmIFBDRGF0YSBub2RlCi0JLy8gLy8KLQkvLyBEVERQQ0RhdGFDb250ZW50IHBjRGF0YSA9IGZhY3RvcnkuY3JlYXRlRFREUENEYXRhQ29udGVudCgpOwotCS8vIC8vIEFkZCAjUENEQVRBIHRvIHRoZSBHcm91cCwgaS5lIE1peGVkIGNvbnRlbnQgbW9kZWwKLQkvLyBwYXJlbnQuZ2V0Q29udGVudCgpLmFkZChwY0RhdGEpOwotCS8vIH0KLQkvLyB9Ci0JLy8gZWxzZSBpZiAoY25vZGUgaW5zdGFuY2VvZiBDTVJlZmVyZW5jZU5vZGUpCi0JLy8gewotCS8vIENNUmVmZXJlbmNlTm9kZSBybiA9IChDTVJlZmVyZW5jZU5vZGUpY25vZGU7Ci0JLy8gaWYgKHJuLmdldFR5cGUoKT09Q01Ob2RlVHlwZS5FTEVNRU5UX1JFRkVSRU5DRSkKLQkvLyB7Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJDTSBFbGVtZW50IFJlZiBuYW1lOiAiICsgcm4uZ2V0TmFtZSgpKTsKLQkvLyAvLwotCS8vIC8vIENyZWF0ZSBhbiBEVERFbGVtZW50UmVmZXJlbmNlIGFuZCBzZXQgaXRzIHJlZmVyZW5jZWQgZWxlbWVudAotCS8vIC8vCi0JLy8gRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgZWxlbVJlZiA9Ci0JLy8gZmFjdG9yeS5jcmVhdGVEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpOwotCS8vCi0JLy8KLQkvLyAvLwotCS8vIC8vIEZpbmQgdGhlIHJlYWwgZWxlbWVudCBmb3IgdGhpcyBlbGVtZW50IHJlZmVyZW5jZXMKLQkvLyAvLyBJZiB0aGUgcmVhbCBlbGVtZW50IGRvZXMgbm90IHlldCBleGlzdCwgY3JlYXRlIGl0Ci0JLy8gLy8KLQkvLyBEVERFbGVtZW50IGFuRWxlbWVudCA9IGNyZWF0ZU9yRmluZEVsZW1lbnQocm4uZ2V0TmFtZSgpLCBlbGVtUmVmKTsKLQkvLwotCS8vCi0JLy8gZWxlbVJlZi5zZXRSZWZlcmVuY2VkRWxlbWVudChhbkVsZW1lbnQpOwotCS8vIERURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0KLQkvLyBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkvLyBlbGVtUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCS8vCi0JLy8gLy8gQWRkIERUREVsZW1lbnRSZWZlcmVuY2UgdG8gdGhlIEdyb3VwCi0JLy8gcGFyZW50LmdldENvbnRlbnQoKS5hZGQoZWxlbVJlZik7Ci0JLy8gfQotCS8vIGVsc2UgLy8gUEUgUmVmZXJlbmNlCi0JLy8gewotCS8vIFN0cmluZyBlbnRpdHlOYW1lID0gcm4uZ2V0TmFtZSgpLnRyaW0oKTsKLQkvLwotCS8vCi0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJDTSBQRSBSZWYgbmFtZTogIiArIGVudGl0eU5hbWUpOwotCS8vIERUREVudGl0eSBhbkVudGl0eSA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KGVudGl0eU5hbWUpOwotCS8vIGlmIChhbkVudGl0eSE9bnVsbCkKLQkvLyB7Ci0JLy8gLy8KLQkvLyAvLyBDcmVhdGUgYW4gRFRERW50aXR5UmVmZXJlbmNlIGFuZCBzZXQgaXRzIHJlZmVyZW5jZWQgZWxlbWVudAotCS8vIC8vCi0JLy8gRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBlblJlZiA9Ci0JLy8gZmFjdG9yeS5jcmVhdGVEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCk7Ci0JLy8gZW5SZWYuc2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoYW5FbnRpdHkpOwotCS8vICAgICAgICAgICAgIAotCS8vIERURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0KLQkvLyBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkvLyBlblJlZi5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQkvLwotCS8vCi0JLy8gLy8gQWRkIERUREVudGl0eVJlZmVyZW5jZSB0byB0aGUgR3JvdXAKLQkvLyBwYXJlbnQuZ2V0Q29udGVudCgpLmFkZChlblJlZik7Ci0JLy8KLQkvLwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBGaW5kIHRoZSByZWFsIGVsZW1lbnQgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IHRoZSBjdXJyZW50IGVsZW1lbnQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBEVERFbGVtZW50IGNyZWF0ZU9yRmluZEVsZW1lbnRHZW4oU3RyaW5nIG5hbWUsIE9iamVjdCBvYmopIHsKLQkvLwotCS8vIC8vIERUREVsZW1lbnQgYUVsZW1lbnQgPSBnZXREVERGaWxlKCkuZmluZEVsZW1lbnQobmFtZSk7Ci0JLy8KLQkvLwotCS8vIERUREVsZW1lbnQgYUVsZW1lbnQgPSAoRFRERWxlbWVudCkgZHRkVXRpbC5nZXRFbGVtZW50UG9vbCgpLmdldChuYW1lKTsKLQkvLwotCS8vCi0JLy8gaWYgKGFFbGVtZW50ICE9IG51bGwpCi0JLy8gewotCS8vIHJldHVybiBhRWxlbWVudDsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBlcnJvck1zZyA9Ci0JLy8gRFREQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiX0VSUk9SX1VOREVDTEFSRURfRUxFTUVOVF8xIik7Ci0JLy8gZXJyb3JNc2cgKz0gIlwiIiArIG5hbWUgKyAiXCIiOwotCS8vIGVycm9yTXNnICs9Ci0JLy8gRFREQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiX1VJX0VSUk9SUEFSVF9VTkRFQ0xBUkVEX0VMRU1FTlRfMiIpOwotCS8vCi0JLy8KLQkvLyBFcnJvck1lc3NhZ2UgZHRkRXJyb3IgPSBuZXcgRXJyb3JNZXNzYWdlKCk7Ci0JLy8gICAgIAotCS8vIGR0ZEVycm9yLnNldEVycm9yTWVzc2FnZShlcnJvck1zZyk7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGR0ZEVycm9yLCBvYmopOwotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbihlcnJvck1zZyk7Ci0JLy8gLy8gc2V0RFRERXJyb3JNZXNzYWdlKGVycm9yTXNnKTsKLQkvLyBnZXREVERGaWxlKCkuc2V0UGFyc2VFcnJvcih0cnVlKTsKLQkvLwotCS8vCi0JLy8gLy8KLQkvLyAvLyBDcmVhdGUgYW4gZW1wdHkgZWxlbWVudCBmb3IgdGhlIHJlZmVyZW5jZSB0byBtYWtlIGl0IHZhbGlkCi0JLy8gLy8KLQkvLwotCS8vCi0JLy8gRFRERmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSgpOwotCS8vIERUREVsZW1lbnQgZHRkZWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlRFRERWxlbWVudCgpOwotCS8vIGR0ZGVsZW1lbnQuc2V0TmFtZShuYW1lKTsKLQkvLwotCS8vCi0JLy8gRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGZhY3RvcnkuY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0JLy8gZHRkZWxlbWVudC5zZXRDb250ZW50KGVtcHR5Q29udGVudCk7Ci0JLy8KLQkvLwotCS8vIGdldERUREZpbGUoKS5nZXREVERPYmplY3QoKS5hZGQoZHRkZWxlbWVudCk7Ci0JLy8gZHRkVXRpbC5nZXRFbGVtZW50UG9vbCgpLnB1dChuYW1lLGR0ZGVsZW1lbnQpOwotCS8vIHJldHVybiBkdGRlbGVtZW50OwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIENvbXB1dGUgdGhlIE1PRiBvY2N1cnJlbmNlIGZyb20gdGhlIHhtbDRqIG9jY3VycmVuY2UKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBpbnQgY29tcHV0ZU1vZk9jY3VycmVuY2VHZW4oQ01SZXBlYXRhYmxlTm9kZSBybm9kZSkgewotCS8vCi0JLy8gaW50IG9jY3VycmVuY2UgPSBybm9kZS5nZXRPY2N1cnJlbmNlKCk7Ci0JLy8gaW50IG1vZm9jY3VyID0gRFRET2NjdXJyZW5jZVR5cGUuT05FOwotCS8vCi0JLy8KLQkvLyBpZiAob2NjdXJyZW5jZSA9PSBDTU5vZGVUeXBlLlpFUk9fT1JfTU9SRSkKLQkvLyB7Ci0JLy8gbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5aRVJPX09SX01PUkU7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKG9jY3VycmVuY2UgPT0gQ01Ob2RlVHlwZS5PTkVfT1JfTU9SRSkKLQkvLyB7Ci0JLy8gbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5PTkVfT1JfTU9SRTsKLQkvLyB9Ci0JLy8gZWxzZSBpZiAob2NjdXJyZW5jZSA9PSBDTU5vZGVUeXBlLk9QVElPTkFMKQotCS8vIHsKLQkvLyBtb2ZvY2N1ciA9IERURE9jY3VycmVuY2VUeXBlLk9QVElPTkFMOwotCS8vIH0KLQkvLyByZXR1cm4gbW9mb2NjdXI7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQ29tcHV0ZSB0aGUgTU9GIG1vZGVsIGdyb3VwIGZyb20gdGhlIHhtbDRqIG1vZGVsIGdyb3VwCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgaW50IGNvbXB1dGVNb2ZHcm91cEtpbmRHZW4oaW50IHR5cGUpIHsKLQkvLwotCS8vIGlmICh0eXBlID09IENNTm9kZVR5cGUuR1JPVVBfQ0hPSUNFKQotCS8vIHsKLQkvLyByZXR1cm4gRFRER3JvdXBLaW5kLkNIT0lDRTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyByZXR1cm4gRFRER3JvdXBLaW5kLlNFUVVFTkNFOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVzR2VuKERUREVsZW1lbnQgZWxlbWVudCwgQXR0bGlzdCBhdHRMaXN0KQotCS8vIHsKLQkvLwotCS8vIGlmIChhdHRMaXN0LmdldEVycm9yTWVzc2FnZSgpIT1udWxsKQotCS8vIHsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoYXR0TGlzdC5nZXRFcnJvck1lc3NhZ2UoKSwgZWxlbWVudCk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBmb3IgKGludCBpPTA7aTxhdHRMaXN0LnNpemUoKTtpKyspCi0JLy8gewotCS8vIEF0dE5vZGUgYWQgPSAoQXR0Tm9kZSkgYXR0TGlzdC5lbGVtZW50QXQoaSk7Ci0JLy8gLy8gRFREQXR0cmlidXRlRWxlbWVudCBkdGRBdHQ9IGdldERUREF0dHJpYnV0ZUVsZW1lbnQoYS5nZXROYW1lKCkpOwotCS8vCi0JLy8KLQkvLyAvLyBvbmx5IGFkZCB0aGUgQXR0RGVmIGlmIGl0IGlzIG5vdCBhZGRlZCB5ZXQKLQkvLyAvLyBpZ25vcmUgdGhlIGR1cCBBdHREZWYgYXMgZG9jdW1lbnRlZCBpbiB0aGUgWE1MIDEuMCBzcGVjcwotCS8vIC8vaWYoIGR0ZEF0dD09bnVsbCkKLQkvLyBhZGRBdHRyaWJ1dGUoZWxlbWVudCwgYWQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBDcmVhdGUgYSBEVERBdHRyaWJ1dGUgZnJvbSB0aGUgeG1sNGogYXR0cmlidXRlCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVHZW4oRFRERWxlbWVudCBkdGRlbGVtZW50LCBBdHROb2RlIGFkKSB7Ci0JLy8KLQkvLyBEVERBdHRyaWJ1dGUgZHRkYXR0ciA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERBdHRyaWJ1dGUoKTsKLQkvLyBkdGRlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpLmFkZChkdGRhdHRyKTsKLQkvLyBmaW5pc2hBdHRyaWJ1dGUoZHRkYXR0ciwgYWQpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGZpbmlzaEF0dHJpYnV0ZUdlbihEVERBdHRyaWJ1dGUgZHRkYXR0ciwgQXR0Tm9kZSBhdHRkZWYpCi0JLy8gewotCS8vCi0JLy8gYm9vbGVhbiBwYXJzZUVycm9yID0gZmFsc2U7Ci0JLy8KLQkvLwotCS8vIGlmIChhdHRkZWYubmFtZS5zdGFydHNXaXRoKCIlIikpCi0JLy8gewotCS8vIFN0cmluZyBwZU5hbWUgPSBhdHRkZWYubmFtZS50cmltKCk7Ci0JLy8gRFRERW50aXR5IGVuID0gKERUREVudGl0eSkgZHRkVXRpbC5nZXRQRVBvb2woKS5nZXQocGVOYW1lKTsKLQkvLyBpZiAoZW4hPW51bGwpCi0JLy8gewotCS8vIGR0ZGF0dHIuc2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoZW4pOwotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGR0ZGF0dHIuc2V0TmFtZShhdHRkZWYubmFtZSk7Ci0JLy8KLQkvLwotCS8vIGludCBhdHRyVHlwZSA9IGF0dGRlZi5nZXREZWNsYXJlZFR5cGUoKTsKLQkvLwotCS8vCi0JLy8gaWYgKGF0dHJUeXBlPT1BdHROb2RlLlBFUkVGRVJFTkNFICYmIGF0dGRlZi50eXBlIT1udWxsKQotCS8vIHsKLQkvLyBTdHJpbmcgcGVOYW1lID0gYXR0ZGVmLnR5cGUudHJpbSgpOwotCS8vIERUREVudGl0eSBlbiA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KHBlTmFtZSk7Ci0JLy8gaWYgKGVuIT1udWxsKQotCS8vIHsKLQkvLyBkdGRhdHRyLnNldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KGVuKTsKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0NEQVRBKCkpOyAvLyBoYWNrLAotCS8vIHNvIHdlIGNhbiBnZXQgYmFjayB0aGUgZGVmYXVsdCB2YWx1ZQotCS8vIH0KLQkvLyBlbHNlIC8vc2V0IGRlZmF1bHQgdHlwZQotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfQ0RBVEEoKSk7Ci0JLy8KLQkvLwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIHN3aXRjaCAoYXR0clR5cGUpCi0JLy8gewotCS8vIGNhc2UgQXR0Tm9kZS5DREFUQToKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0NEQVRBKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuRU5USVRJRVM6Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9FTlRJVElFUygpKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLkVOVElUWToKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0VOVElUWSgpKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLklEOgotCS8vIC8vIGNoZWNrIGZvciBkdXBsaWNhdGUgSUQgYXR0cmlidXRlCi0JLy8gaWYgKGhhc0lEQXR0cmlidXRlKGR0ZGF0dHIpKQotCS8vIHsKLQkvLyBTdHJpbmcgZXJyTXNnID0gRFREQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiX0VSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMSIpOwotCS8vIGVyck1zZyArPSBhdHRkZWYubmFtZSArCi0JLy8gRFREQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiX1VJX0VSUk9SUEFSVF9EVVBfSURfQVRUUklCVVRFXzIiKTsKLQkvLyAvLyBkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXRJRWxlbWVudCgpLnNldERUREVycm9yTWVzc2FnZShlcnJNc2cpOwotCS8vIC8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5zZXRQYXJzZUVycm9yKHRydWUpOwotCS8vIHBhcnNlRXJyb3IgPSB0cnVlOwotCS8vIH0KLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0lEKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuSURSRUY6Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9JRFJFRigpKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLklEUkVGUzoKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0lEUkVGUygpKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLkVOVU1FUkFUSU9OOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGNyZWF0ZURUREVudW1lcmF0aW9uKGR0ZGF0dHIsIGF0dGRlZiwKLQkvLyBEVERFbnVtR3JvdXBLaW5kLk5BTUVfVE9LRU5fR1JPVVApKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLk5PVEFUSU9OOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGNyZWF0ZURUREVudW1lcmF0aW9uKGR0ZGF0dHIsIGF0dGRlZiwKLQkvLyBEVERFbnVtR3JvdXBLaW5kLk5PVEFUSU9OX0dST1VQKSk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5OTVRPS0VOOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfTk1UT0tFTigpKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLk5NVE9LRU5TOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfTk1UT0tFTlMoKSk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGRlZmF1bHQ6Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJEVERBVFRSICciICthdHRkZWYubmFtZSArICInVW5rbm93biB0eXBlLi4uIiArCi0JLy8gYXR0clR5cGUpOwotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGludCBhdHRyRGVmYXVsdCA9IGF0dGRlZi5nZXREZWZhdWx0VHlwZSgpOwotCS8vIGludCBkZWZhdWx0S2luZCA9IERURERlZmF1bHRLaW5kLklNUExJRUQ7Ci0JLy8gc3dpdGNoIChhdHRyRGVmYXVsdCkKLQkvLyB7Ci0JLy8gY2FzZSBBdHROb2RlLkZJWEVEOgotCS8vIGRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuRklYRUQ7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5JTVBMSUVEOgotCS8vIGRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuSU1QTElFRDsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLlJFUVVJUkVEOgotCS8vIGRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuUkVRVUlSRUQ7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5OT0ZJWEVEOgotCS8vIGRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuTk9GSVhFRDsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gZGVmYXVsdDoKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRUREFUVFIgJyIgK2F0dGRlZi5uYW1lICsgIicgVW5rbm93biBkZWZhdWx0Ci0JLy8gdHlwZS4uLiAiICsgYXR0ckRlZmF1bHQpOwotCS8vIH0KLQkvLwotCS8vIERURERlZmF1bHRLaW5kIGRlZmF1bHRLaW5kT2JqID0gRFRERGVmYXVsdEtpbmQuZ2V0KGRlZmF1bHRLaW5kKTsKLQkvLyBkdGRhdHRyLnNldERlZmF1bHRLaW5kKGRlZmF1bHRLaW5kT2JqKTsKLQkvLwotCS8vIGlmIChwYXJzZUVycm9yKQotCS8vIHsKLQkvLyByZXR1cm47Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBTdHJpbmcgZGVmYXVsdFZhbHVlID0gYXR0ZGVmLmRlZmF1bHRWYWx1ZTsKLQkvLyBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpCi0JLy8gewotCS8vIGlmIChhdHRyVHlwZSA9PSBBdHROb2RlLkVOVU1FUkFUSU9OIHx8IGF0dHJUeXBlID09IEF0dE5vZGUuTk9UQVRJT04pCi0JLy8gewotCS8vIGlmICghIGlzRGVmYXVsdEVudW1WYWx1ZVZhbGlkKGF0dGRlZixkZWZhdWx0VmFsdWUpKQotCS8vIHsKLQkvLyBTdHJpbmcgdHlwZVN0cmluZyA9Ci0JLy8gKGF0dHJUeXBlPT1BdHROb2RlLkVOVU1FUkFUSU9OPyJlbnVtZXJhdGlvbiI6Im5vdGF0aW9uIik7Ci0JLy8gU3RyaW5nIGVyck1zZyA9Ci0JLy8gRFREQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiX0VSUk9SX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzEiKTsKLQkvLyBlcnJNc2cgKz0gdHlwZVN0cmluZyArCi0JLy8gRFREQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiX1VJX0VSUk9SUEFSVF9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8yIik7Ci0JLy8gZXJyTXNnICs9IGF0dGRlZi5uYW1lICsgIiciOwotCS8vCi0JLy8KLQkvLyAvLyBkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXRJRWxlbWVudCgpLnNldERUREVycm9yTWVzc2FnZShlcnJNc2cpOwotCS8vIC8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5zZXRQYXJzZUVycm9yKHRydWUpOwotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8gfQotCS8vIGR0ZGF0dHIuc2V0RGVmYXVsdFZhbHVlU3RyaW5nKGRlZmF1bHRWYWx1ZSk7Ci0JLy8gfQotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRFREQXR0ciAtIHRvTW9mIGdldERlZmF1bHRWYWx1ZVN0cmluZyAiICsKLQkvLyBnZXREZWZhdWx0VmFsdWVTdHJpbmcoKSk7Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJEVERBdHRyIC0gdG9Nb2YgZ2V0RGVmYXVsdFZhbHVlOiAiICsKLQkvLyBnZXREZWZhdWx0VmFsdWUoKSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gaGFzSURBdHRyaWJ1dGVHZW4oRFREQXR0cmlidXRlIGR0ZGF0dHIpIHsKLQkvLwotCS8vIGJvb2xlYW4gaGFzSUQgPSBmYWxzZTsKLQkvLwotCS8vCi0JLy8gRFRERWxlbWVudCBlbGVtZW50ID0gZHRkYXR0ci5nZXREVERFbGVtZW50KCk7Ci0JLy8gRUxpc3QgYXR0cnMgPSBlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpOwotCS8vCi0JLy8KLQkvLyBJdGVyYXRvciBpID0gYXR0cnMuaXRlcmF0b3IoKTsKLQkvLyB3aGlsZSAoaS5oYXNOZXh0KCkpCi0JLy8gewotCS8vIERUREF0dHJpYnV0ZSBhdHRyID0gKERUREF0dHJpYnV0ZSkgaS5uZXh0KCk7Ci0JLy8gRFREVHlwZSBkVHlwZSA9IGF0dHIuZ2V0RFREVHlwZSgpOwotCS8vIGlmIChkVHlwZSBpbnN0YW5jZW9mIERUREJhc2ljVHlwZSkKLQkvLyB7Ci0JLy8gaWYgKCAoKERUREJhc2ljVHlwZSlkVHlwZSkuZ2V0S2luZCgpLmdldFZhbHVlKCkgPT0gRFREQmFzaWNUeXBlS2luZC5JRCkKLQkvLyB7Ci0JLy8gaGFzSUQgPSB0cnVlOwotCS8vIGJyZWFrOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBoYXNJRDsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uR2VuKERUREF0dHJpYnV0ZQotCS8vIGR0ZGF0dHIsIFN0cmluZ1tdIGVudW1WYWx1ZXMsIGludCBlbnVtS2luZCkgewotCS8vCi0JLy8gRFRERW51bWVyYXRpb25UeXBlIGVudW0gPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW51bWVyYXRpb25UeXBlKCk7Ci0JLy8gLy8gVGhpcyBpcyBncm9zcywgYnV0IHRoaXMgaXMgd2hhdCB3YXMgZG9uZSBiZWZvcmUuCi0JLy8gRFREQXR0cmlidXRlSW1wbCBkdGRhdHRyaW1wbCA9IChEVERBdHRyaWJ1dGVJbXBsKSBkdGRhdHRyOwotCS8vIC8vIGVudW0uc2V0SUQoIkVudW1fIiArCi0JLy8gKChEVERFbGVtZW50KWR0ZGF0dHJpbXBsLmdldE1PRkRvbWFpbigpKS5nZXROYW1lKCkgKyAiXyIgKwotCS8vIGR0ZGF0dHIuZ2V0TmFtZSgpKTsKLQkvLyBEVERFbnVtR3JvdXBLaW5kIGdyb3VwS2luZCA9IERUREVudW1Hcm91cEtpbmQuZ2V0KGVudW1LaW5kKTsKLQkvLyBlbnVtLnNldEtpbmQoZ3JvdXBLaW5kKTsKLQkvLyAvLyBFbnVtZXJhdGlvbiB2YWx1ZXMKLQkvLyBpZiAoZW51bVZhbHVlcyE9bnVsbCkKLQkvLyB7Ci0JLy8gZm9yKGludCBpPTA7aTxlbnVtVmFsdWVzLmxlbmd0aDtpKyspCi0JLy8gewotCS8vIEVFbnVtTGl0ZXJhbCBlbnVtTGl0ZXJhbCA9IGNyZWF0ZUVFbnVtTGl0ZXJhbCgpOwotCS8vIC8vIGVudW1WYWwuc2V0WE1JRG9jdW1lbnQoZHRkYXR0ci5nZXRYTUlEb2N1bWVudCgpKTsKLQkvLyBlbnVtTGl0ZXJhbC5yZWZTZXRMaXRlcmFsKGVudW1WYWx1ZXNbaV0pOwotCS8vIC8vIGVudW1MaXRlcmFsLnNldE51bWJlcihpKTsKLQkvLyBlbnVtLmdldEVudW1MaXRlcmFscygpLmFkZChlbnVtTGl0ZXJhbCk7Ci0JLy8gfQotCS8vIH0KLQkvLyBkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXREVERGaWxlKCkuZ2V0RFRERW51bWVyYXRpb25UeXBlKCkuYWRkKGVudW0pOwotCS8vIHJldHVybiBlbnVtOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBFRW51bUxpdGVyYWwgY3JlYXRlRUVudW1MaXRlcmFsR2VuKCkgewotCS8vCi0JLy8gRWNvcmVQYWNrYWdlIGVQYWNrYWdlID0KLQkvLyAoRWNvcmVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKLQkvLyByZXR1cm4gKChFY29yZUZhY3RvcnkpZVBhY2thZ2UuZ2V0RmFjdG9yeSgpKS5jcmVhdGVFRW51bUxpdGVyYWwoKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uR2VuKERUREF0dHJpYnV0ZQotCS8vIGR0ZGF0dHIsIEF0dE5vZGUgYXR0ZGVmLCBpbnQgZW51bUtpbmQpIHsKLQkvLwotCS8vIERUREVudW1lcmF0aW9uVHlwZSBlbnVtID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVudW1lcmF0aW9uVHlwZSgpOwotCS8vIC8vIFRoaXMgaXMgZ3Jvc3MsIGJ1dCB0aGlzIGlzIHdoYXQgd2FzIGRvbmUgYmVmb3JlLgotCS8vIERUREF0dHJpYnV0ZUltcGwgZHRkYXR0cmltcGwgPSAoRFREQXR0cmlidXRlSW1wbCkgZHRkYXR0cjsKLQkvLyAvLyBlbnVtLnNldElEKCJFbnVtXyIgKwotCS8vICgoRFRERWxlbWVudClkdGRhdHRyaW1wbC5nZXRNT0ZEb21haW4oKSkuZ2V0TmFtZSgpICsgIl8iICsKLQkvLyBkdGRhdHRyLmdldE5hbWUoKSk7Ci0JLy8gRFRERW51bUdyb3VwS2luZCBncm91cEtpbmQgPSBEVERFbnVtR3JvdXBLaW5kLmdldChlbnVtS2luZCk7Ci0JLy8gZW51bS5zZXRLaW5kKGdyb3VwS2luZCk7Ci0JLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpLmdldERUREVudW1lcmF0aW9uVHlwZSgpLmFkZChlbnVtKTsKLQkvLwotCS8vCi0JLy8gLy8gRW51bWVyYXRpb24gdmFsdWVzCi0JLy8gRW51bWVyYXRpb24gdG9rZW5JdGVyID0gYXR0ZGVmLmVsZW1lbnRzKCk7Ci0JLy8gaWYgKHRva2VuSXRlciAhPSBudWxsKSB7Ci0JLy8gaW50IGk9MDsKLQkvLyB3aGlsZSAodG9rZW5JdGVyLmhhc01vcmVFbGVtZW50cygpKQotCS8vIHsKLQkvLyBTdHJpbmcgdmFsID0gKFN0cmluZyl0b2tlbkl0ZXIubmV4dEVsZW1lbnQoKTsKLQkvLyBFRW51bUxpdGVyYWwgZW51bUxpdGVyYWwgPSBjcmVhdGVFRW51bUxpdGVyYWwoKTsKLQkvLyAvLyBlbnVtTGl0ZXJhbC5zZXRYTUlEb2N1bWVudChkdGRhdHRyLmdldFhNSURvY3VtZW50KCkpOwotCS8vICAgICAgICAKLQkvLwotCS8vIGVudW1MaXRlcmFsLnJlZlNldExpdGVyYWwodmFsKTsKLQkvLyAvLyBlbnVtTGl0ZXJhbC5zZXROdW1iZXIoaSsrKTsKLQkvLyBlbnVtLmdldEVudW1MaXRlcmFscygpLmFkZChlbnVtTGl0ZXJhbCk7Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vCi0JLy8gcmV0dXJuIGVudW07Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWZhdWx0RW51bVZhbHVlVmFsaWRHZW4oQXR0Tm9kZSBhdHRkZWYsIFN0cmluZwotCS8vIGRlZmF1bHRWYWx1ZSkgewotCS8vCi0JLy8gYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCS8vIGJvb2xlYW4gY29udGFpbnNQZXJjZW50ID0gZmFsc2U7Ci0JLy8KLQkvLwotCS8vIC8vIEVudW1lcmF0aW9uIHZhbHVlcwotCS8vIEVudW1lcmF0aW9uIGVudW1WYWx1ZXMgPSBhdHRkZWYuZWxlbWVudHMoKTsKLQkvLyB3aGlsZSAoZW51bVZhbHVlcy5oYXNNb3JlRWxlbWVudHMoKSkKLQkvLyB7Ci0JLy8gU3RyaW5nIHZhbCA9IChTdHJpbmcpZW51bVZhbHVlcy5uZXh0RWxlbWVudCgpOwotCS8vIGlmICh2YWwuZXF1YWxzKGRlZmF1bHRWYWx1ZSkpCi0JLy8gewotCS8vIHZhbGlkID0gdHJ1ZTsKLQkvLyBicmVhazsKLQkvLyB9Ci0JLy8gaWYgKHZhbC5pbmRleE9mKCclJykgPj0gMCkKLQkvLyB7Ci0JLy8gY29udGFpbnNQZXJjZW50ID0gdHJ1ZTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiB2YWxpZCB8fCBjb250YWluc1BlcmNlbnQ7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgc2V0QXR0ckRURFR5cGVHZW4oRFREQXR0cmlidXRlIGR0ZGF0dHIsIERURFR5cGUgdHlwZSkgewotCS8vCi0JLy8gZHRkYXR0ci5zZXREVERUeXBlKHR5cGUpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGFkZEVycm9yTWVzc2FnZUdlbihFcnJvck1lc3NhZ2UgZXJyTXNnLCBPYmplY3Qgb2JqKSB7Ci0JLy8KLQkvLyBlcnJNc2cuc2V0T2JqZWN0KG9iaik7Ci0JLy8gZHRkVXRpbC5hZGRFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkvLyB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFRET2JqZWN0RmluZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFRET2JqZWN0RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNGEzMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE9iamVjdEZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERTb3VyY2VPZmZzZXQ7Ci0KLXB1YmxpYyBjbGFzcyBEVERPYmplY3RGaW5kZXIgZXh0ZW5kcyBEVERWaXNpdG9yIHsKLQlwdWJsaWMgY2xhc3MgU291cmNlT2Zmc2V0IHsKLQkJLy8gQ29udmVuaWVuY2UgY2xhc3MgdG8gZmluZCBjb250YWlubWVudCBvZiBvYmplY3QKLQkJcHJpdmF0ZSBpbnQgc3RhcnQsIGVuZDsKLQotCQlwdWJsaWMgU291cmNlT2Zmc2V0KGludCBzdGFydCwgaW50IGVuZCkgewotCQkJdGhpcy5zdGFydCA9IHN0YXJ0OwotCQkJdGhpcy5lbmQgPSBlbmQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTb3VyY2VPZmZzZXQgb3RoZXIpIHsKLQkJCWlmICh0aGlzLnN0YXJ0IDw9IG90aGVyLnN0YXJ0ICYmIG90aGVyLnN0YXJ0IDw9IHRoaXMuZW5kKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IC8vIGVuZCBvZiBpZiAoKQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQl9Ci0KLQlTb3VyY2VPZmZzZXQgc2VhcmNoTG9jYXRpb247Ci0KLQlwcml2YXRlIFNvdXJjZU9mZnNldCBvZmZzZXRPYmplY3RGb3IoRFREU291cmNlT2Zmc2V0IHMpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VPZmZzZXQocy5nZXRTdGFydE9mZnNldCgpLCBzLmdldEVuZE9mZnNldCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tDb250YWlubWVudChEVERPYmplY3QgbykgewotCQlpZiAob2Zmc2V0T2JqZWN0Rm9yKChEVERTb3VyY2VPZmZzZXQpIG8pLmNvbnRhaW5zKHNlYXJjaExvY2F0aW9uKSkgewotCQkJY2xvc2VzdE9iamVjdCA9IG87Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JfQotCi0JcHVibGljIERURE9iamVjdEZpbmRlcihpbnQgc3RhcnRPZmZzZXQsIGludCBlbmRPZmZzZXQpIHsKLQkJc2VhcmNoTG9jYXRpb24gPSBuZXcgU291cmNlT2Zmc2V0KHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRETm90YXRpb24oRFRETm90YXRpb24gbm90YXRpb24pIHsKLQkJY2hlY2tDb250YWlubWVudChub3RhdGlvbik7Ci0JCXN1cGVyLnZpc2l0RFRETm90YXRpb24obm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERW50aXR5KERUREVudGl0eSBlbnRpdHkpIHsKLQkJY2hlY2tDb250YWlubWVudChlbnRpdHkpOwotCQlzdXBlci52aXNpdERUREVudGl0eShlbnRpdHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERWxlbWVudChEVERFbGVtZW50IGVsZW1lbnQpIHsKLQkJY2hlY2tDb250YWlubWVudChlbGVtZW50KTsKLQkJc3VwZXIudmlzaXREVERFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREQXR0cmlidXRlKERUREF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJY2hlY2tDb250YWlubWVudChhdHRyaWJ1dGUpOwotCQlzdXBlci52aXNpdERUREF0dHJpYnV0ZShhdHRyaWJ1dGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5KSB7Ci0JCWNoZWNrQ29udGFpbm1lbnQocGFybUVudGl0eSk7Ci0JCXN1cGVyLnZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHBhcm1FbnRpdHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERWxlbWVudENvbnRlbnQoRFRERWxlbWVudENvbnRlbnQgY29udGVudCkgewotCQljaGVja0NvbnRhaW5tZW50KGNvbnRlbnQpOwotCQlzdXBlci52aXNpdERUREVsZW1lbnRDb250ZW50KGNvbnRlbnQpOwotCX0KLQotCXByaXZhdGUgRFRET2JqZWN0IGNsb3Nlc3RPYmplY3QgPSBudWxsOwotCi0JcHVibGljIERURE9iamVjdCBnZXRDbG9zZXN0T2JqZWN0KCkgewotCQlyZXR1cm4gY2xvc2VzdE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNvdXJjZU9mZnNldCBvZmZzZXRPYmplY3RGb3JHZW4oRFREU291cmNlT2Zmc2V0IHMpIHsKLQotCQlyZXR1cm4gbmV3IFNvdXJjZU9mZnNldChzLmdldFN0YXJ0T2Zmc2V0KCksIHMuZ2V0RW5kT2Zmc2V0KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja0NvbnRhaW5tZW50R2VuKERURE9iamVjdCBvKSB7Ci0KLQkJaWYgKG9mZnNldE9iamVjdEZvcigoRFREU291cmNlT2Zmc2V0KSBvKS5jb250YWlucyhzZWFyY2hMb2NhdGlvbikpIHsKLQkJCWNsb3Nlc3RPYmplY3QgPSBvOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERURE5vdGF0aW9uR2VuKERURE5vdGF0aW9uIG5vdGF0aW9uKSB7Ci0KLQkJY2hlY2tDb250YWlubWVudChub3RhdGlvbik7Ci0JCXN1cGVyLnZpc2l0RFRETm90YXRpb24obm90YXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVudGl0eUdlbihEVERFbnRpdHkgZW50aXR5KSB7Ci0KLQkJY2hlY2tDb250YWlubWVudChlbnRpdHkpOwotCQlzdXBlci52aXNpdERUREVudGl0eShlbnRpdHkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVsZW1lbnRHZW4oRFRERWxlbWVudCBlbGVtZW50KSB7Ci0KLQkJY2hlY2tDb250YWlubWVudChlbGVtZW50KTsKLQkJc3VwZXIudmlzaXREVERFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREF0dHJpYnV0ZUdlbihEVERBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0KLQkJY2hlY2tDb250YWlubWVudChhdHRyaWJ1dGUpOwotCQlzdXBlci52aXNpdERUREF0dHJpYnV0ZShhdHRyaWJ1dGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUdlbihEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eSkgewotCi0JCWNoZWNrQ29udGFpbm1lbnQocGFybUVudGl0eSk7Ci0JCXN1cGVyLnZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHBhcm1FbnRpdHkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVsZW1lbnRDb250ZW50R2VuKERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpIHsKLQotCQljaGVja0NvbnRhaW5tZW50KGNvbnRlbnQpOwotCQlzdXBlci52aXNpdERUREVsZW1lbnRDb250ZW50KGNvbnRlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRET2JqZWN0IGdldENsb3Nlc3RPYmplY3RHZW4oKSB7Ci0KLQkJcmV0dXJuIGNsb3Nlc3RPYmplY3Q7Ci0JfQotfS8vIERURE9iamVjdEZpbmRlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFBhdGhuYW1lVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFBhdGhuYW1lVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjA2M2M0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERQYXRobmFtZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRFREUGF0aG5hbWVVdGlsIHsKLQlzdGF0aWMgcHVibGljIFN0cmluZyBtYWtlUGF0aChTdHJpbmcgcGFyZW50UGF0aCwgU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lLCBpbnQgY250KSB7Ci0JCVN0cmluZyBwbiA9IG51bGw7Ci0JCW5hbWUgPSBlbmNvZGUobmFtZSk7Ci0JCWlmICgobmFtZSA9PSBudWxsKSAmJiAoY250IDw9IDApKSB7Ci0JCQlwbiA9IHR5cGU7Ci0JCX0KLQkJZWxzZSBpZiAoY250IDw9IDApIHsKLQkJCXBuID0gdHlwZSArICI6IiArICgobmFtZSA9PSBudWxsKSA/ICIiIDogbmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJcG4gPSB0eXBlICsgIjoiICsgKChuYW1lID09IG51bGwpID8gIiIgOiBuYW1lKSArICI6IiArIGNudDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCi0JCWlmIChwYXJlbnRQYXRoICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnRQYXRoICsgIi4iICsgcG47IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBwbjsKLQkJfQotCX0KLQotCXN0YXRpYyBwdWJsaWMgT2JqZWN0W10gcGFyc2VQYXRoQ29tcG9uZW50KFN0cmluZyBwYXRoKSB7Ci0JCS8qCi0JCSAqIFRoaXMgcm91dGluZSBwYXJzZSB0aGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSBwYXRoIGFuZCByZXR1cm5zIHRoZQotCQkgKiByZXN1bHQgaW4gYW4gYXJycmF5IG9mIFN0cmluZ3MuIHJlc3VsdFswXSA9IHR5cGUgKFN0cmluZykgcmVzdWx0WzFdID0KLQkJICogbmFtZSAoU3RyaW5nKSByZXN1bHRbMl0gPSBjb3VudCAoSW50ZWdlcikgcmVzdWx0WzNdID0gdGhlIHJlc3Qgb2YKLQkJICogdGhlIHBhdGggKFN0cmluZykKLQkJICogCi0JCSAqIEUuZy4gUGF0aENvbXBvbmVudCByZXN1bHRbMF0gcmVzdWx0WzFdIHJlc3VsdFsyXSByZXN1bHRbM10KLQkJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0eXBlCi0JCSAqIHR5cGUgPG51bGw+IDxudWxsPiA8bnVsbD4gdHlwZS5yZXN0IHR5cGUgPG51bGw+IDxudWxsPiByZXN0Ci0JCSAqIHR5cGU6bmFtZSB0eXBlIG5hbWUgPG51bGw+IDxudWxsPiB0eXBlOm5hbWUucmVzdCB0eXBlIG5hbWUgPG51bGw+Ci0JCSAqIHJlc3QgdHlwZTo6biB0eXBlIDxudWxsPiBuIDxudWxsPiB0eXBlOjpuLnJlc3QgdHlwZSA8bnVsbD4gbiByZXN0Ci0JCSAqIHR5cGU6bmFtZTpuIHR5cGUgbmFtZSBuIDxudWxsPiB0eXBlOm5hbWU6bi5yZXN0IHR5cGUgbmFtZSBuIHJlc3QKLQkJICovCi0KLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFs0XTsKLQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJaW50IGkgPSBwYXRoLmluZGV4T2YoJy4nKTsKLQkJaW50IGxlbmd0aCA9IHBhdGgubGVuZ3RoKCk7Ci0KLQkJaWYgKGkgPCAwKSB7Ci0JCQlpID0gbGVuZ3RoOwotCQl9Ci0KLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCUludGVnZXIgbiA9IG51bGw7Ci0JCVN0cmluZyByZXN0ID0gbnVsbDsKLQotCQkvLyBnZXQgdGhlIHR5cGUKLQkJaW50IGogPSBwYXRoLmluZGV4T2YoJzonKTsKLQkJaWYgKGogPiBpKQotCQkJaiA9IC0xOwotCQlpZiAoaiA8IDApIHsKLQkJCXR5cGUgPSBwYXRoLnN1YnN0cmluZygwLCBpKTsKLQkJfQotCQllbHNlIHsKLQkJCXR5cGUgPSBwYXRoLnN1YnN0cmluZygwLCBqKTsKLQotCQkJLy8gZ2V0IHRoZSBuYW1lCi0JCQlpbnQgayA9IHBhdGguaW5kZXhPZignOicsIGogKyAxKTsKLQkJCWlmIChrID4gaSkKLQkJCQlrID0gLTE7Ci0JCQlpZiAoayA8IDApIHsKLQkJCQluYW1lID0gcGF0aC5zdWJzdHJpbmcoaiArIDEsIGkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmFtZSA9IHBhdGguc3Vic3RyaW5nKGogKyAxLCBrKTsKLQotCQkJCS8vIGdldCB0aGUgY291bnQKLQkJCQl0cnkgewotCQkJCQluID0gbmV3IEludGVnZXIocGF0aC5zdWJzdHJpbmcoayArIDEsIGkpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCQl9Ci0JCQkJaWYgKChuICE9IG51bGwpICYmIChuLmludFZhbHVlKCkgPCAwKSkgewotCQkJCQluID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKG5hbWUgIT0gbnVsbCkgJiYgKG5hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCW5hbWUgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGkgPCBsZW5ndGgpIHsKLQkJCXJlc3QgPSBwYXRoLnN1YnN0cmluZyhpICsgMSk7Ci0JCX0KLQotCQlyZXN1bHRbMF0gPSB0eXBlOwotCQlyZXN1bHRbMV0gPSBkZWNvZGUobmFtZSk7Ci0JCXJlc3VsdFsyXSA9IG47Ci0JCXJlc3VsdFszXSA9IHJlc3Q7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgU3RyaW5nIGVuY29kZShTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBvID0gbmV3IFN0cmluZ0J1ZmZlcihzLmxlbmd0aCgpKTsKLQkJaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgYyA9IHMuY2hhckF0KGkpOwotCQkJaWYgKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoYykgfHwgKGMgPT0gJy0nKSkgewotCQkJCW8uYXBwZW5kKGMpOwotCQkJfQotCQkJZWxzZSB7IC8vIGlmICgoYyA9PSAnLicpIHx8IChjID09ICc6JykgfHwgKGMgPT0gJ18nKSB8fCAuLi4pCi0JCQkJLy8gY29udmVydCB0aGUgY2hhcmFjdGVyIHRvIGEgNCBkaWdpdCBoZXggY29kZSBwcmVmaXhlZCBieSAiXyIKLQkJCQlTdHJpbmcgaGV4ID0gSW50ZWdlci50b0hleFN0cmluZyhjKTsKLQkJCQlpbnQgbCA9IGhleC5sZW5ndGgoKTsKLQkJCQlpZiAobCA9PSAxKSB7Ci0JCQkJCW8uYXBwZW5kKCJfMDAwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJby5hcHBlbmQoaGV4KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobCA9PSAyKSB7Ci0JCQkJCW8uYXBwZW5kKCJfMDAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvLmFwcGVuZChoZXgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChsID09IDMpIHsKLQkJCQkJby5hcHBlbmQoIl8wIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJby5hcHBlbmQoaGV4KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW8uYXBwZW5kKCdfJyk7Ci0JCQkJCW8uYXBwZW5kKGhleCk7Ci0JCQkJfQotCQkJfQotCQl9IC8vIGZvcgotCQlyZXR1cm4gby50b1N0cmluZygpOwotCX0KLQotCXN0YXRpYyBwcml2YXRlIFN0cmluZyBkZWNvZGUoU3RyaW5nIHMpIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgbyA9IG5ldyBTdHJpbmdCdWZmZXIocy5sZW5ndGgoKSk7Ci0JCWludCBsZW4gPSBzLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzLmNoYXJBdChpKTsKLQkJCWlmIChjICE9ICdfJykgewotCQkJCW8uYXBwZW5kKGMpOwotCQkJfQotCQkJZWxzZSB7IC8vIG5leHQgNCBjaGFyYWN0ZXJzIGFyZSB0aGUgaGV4IGNvZGUKLQkJCQlTdHJpbmcgaGV4OwotCQkJCWlmIChsZW4gPiBpICsgNCkgewotCQkJCQloZXggPSBzLnN1YnN0cmluZyhpICsgMSwgaSArIDUpOwotCQkJCQlpICs9IDQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQloZXggPSBzLnN1YnN0cmluZyhpICsgMSk7Ci0JCQkJCWkgPSBsZW4gLSAxOwotCQkJCX0KLQkJCQlvLmFwcGVuZCgoY2hhcikgSW50ZWdlci5wYXJzZUludChoZXgsIDE2KSk7Ci0JCQl9Ci0JCX0gLy8gZm9yCi0JCXJldHVybiBvLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIG1ha2VQYXRoR2VuKFN0cmluZyBwYXJlbnRQYXRoLCBTdHJpbmcgdHlwZSwgU3RyaW5nIG5hbWUsIGludCBjbnQpIHsKLQotCQlTdHJpbmcgcG4gPSBudWxsOwotCQluYW1lID0gZW5jb2RlKG5hbWUpOwotCQlpZiAoKG5hbWUgPT0gbnVsbCkgJiYgKGNudCA8PSAwKSkgewotCQkJcG4gPSB0eXBlOwotCQl9Ci0JCWVsc2UgaWYgKGNudCA8PSAwKSB7Ci0JCQlwbiA9IHR5cGUgKyAiOiIgKyAoKG5hbWUgPT0gbnVsbCkgPyAiIiA6IG5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIHsKLQkJCXBuID0gdHlwZSArICI6IiArICgobmFtZSA9PSBudWxsKSA/ICIiIDogbmFtZSkgKyAiOiIgKyBjbnQ7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQotCQlpZiAocGFyZW50UGF0aCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50UGF0aCArICIuIiArIHBuOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gcG47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBPYmplY3RbXSBwYXJzZVBhdGhDb21wb25lbnRHZW4oU3RyaW5nIHBhdGgpIHsKLQotCQkvKgotCQkgKiBUaGlzIHJvdXRpbmUgcGFyc2UgdGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgcGF0aCBhbmQgcmV0dXJucyB0aGUKLQkJICogcmVzdWx0IGluIGFuIGFycnJheSBvZiBTdHJpbmdzLiByZXN1bHRbMF0gPSB0eXBlIChTdHJpbmcpIHJlc3VsdFsxXSA9Ci0JCSAqIG5hbWUgKFN0cmluZykgcmVzdWx0WzJdID0gY291bnQgKEludGVnZXIpIHJlc3VsdFszXSA9IHRoZSByZXN0IG9mCi0JCSAqIHRoZSBwYXRoIChTdHJpbmcpCi0JCSAqIAotCQkgKiBFLmcuIFBhdGhDb21wb25lbnQgcmVzdWx0WzBdIHJlc3VsdFsxXSByZXN1bHRbMl0gcmVzdWx0WzNdCi0JCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHlwZQotCQkgKiB0eXBlIDxudWxsPiA8bnVsbD4gPG51bGw+IHR5cGUucmVzdCB0eXBlIDxudWxsPiA8bnVsbD4gcmVzdAotCQkgKiB0eXBlOm5hbWUgdHlwZSBuYW1lIDxudWxsPiA8bnVsbD4gdHlwZTpuYW1lLnJlc3QgdHlwZSBuYW1lIDxudWxsPgotCQkgKiByZXN0IHR5cGU6Om4gdHlwZSA8bnVsbD4gbiA8bnVsbD4gdHlwZTo6bi5yZXN0IHR5cGUgPG51bGw+IG4gcmVzdAotCQkgKiB0eXBlOm5hbWU6biB0eXBlIG5hbWUgbiA8bnVsbD4gdHlwZTpuYW1lOm4ucmVzdCB0eXBlIG5hbWUgbiByZXN0Ci0JCSAqLwotCi0JCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbNF07Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCWludCBpID0gcGF0aC5pbmRleE9mKCcuJyk7Ci0JCWludCBsZW5ndGggPSBwYXRoLmxlbmd0aCgpOwotCi0JCWlmIChpIDwgMCkgewotCQkJaSA9IGxlbmd0aDsKLQkJfQotCi0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlJbnRlZ2VyIG4gPSBudWxsOwotCQlTdHJpbmcgcmVzdCA9IG51bGw7Ci0KLQkJLy8gZ2V0IHRoZSB0eXBlCi0JCWludCBqID0gcGF0aC5pbmRleE9mKCc6Jyk7Ci0JCWlmIChqID4gaSkKLQkJCWogPSAtMTsKLQkJaWYgKGogPCAwKSB7Ci0JCQl0eXBlID0gcGF0aC5zdWJzdHJpbmcoMCwgaSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0eXBlID0gcGF0aC5zdWJzdHJpbmcoMCwgaik7Ci0KLQkJCS8vIGdldCB0aGUgbmFtZQotCQkJaW50IGsgPSBwYXRoLmluZGV4T2YoJzonLCBqICsgMSk7Ci0JCQlpZiAoayA+IGkpCi0JCQkJayA9IC0xOwotCQkJaWYgKGsgPCAwKSB7Ci0JCQkJbmFtZSA9IHBhdGguc3Vic3RyaW5nKGogKyAxLCBpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5hbWUgPSBwYXRoLnN1YnN0cmluZyhqICsgMSwgayk7Ci0KLQkJCQkvLyBnZXQgdGhlIGNvdW50Ci0JCQkJdHJ5IHsKLQkJCQkJbiA9IG5ldyBJbnRlZ2VyKHBhdGguc3Vic3RyaW5nKGsgKyAxLCBpKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkJfQotCQkJCWlmICgobiAhPSBudWxsKSAmJiAobi5pbnRWYWx1ZSgpIDwgMCkpIHsKLQkJCQkJbiA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKChuYW1lICE9IG51bGwpICYmIChuYW1lLmxlbmd0aCgpID09IDApKSB7Ci0JCQluYW1lID0gbnVsbDsKLQkJfQotCi0JCWlmIChpIDwgbGVuZ3RoKSB7Ci0JCQlyZXN0ID0gcGF0aC5zdWJzdHJpbmcoaSArIDEpOwotCQl9Ci0KLQkJcmVzdWx0WzBdID0gdHlwZTsKLQkJcmVzdWx0WzFdID0gZGVjb2RlKG5hbWUpOwotCQlyZXN1bHRbMl0gPSBuOwotCQlyZXN1bHRbM10gPSByZXN0OwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBlbmNvZGVHZW4oU3RyaW5nIHMpIHsKLQotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBvID0gbmV3IFN0cmluZ0J1ZmZlcihzLmxlbmd0aCgpKTsKLQkJaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgYyA9IHMuY2hhckF0KGkpOwotCQkJaWYgKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoYykgfHwgKGMgPT0gJy0nKSkgewotCQkJCW8uYXBwZW5kKGMpOwotCQkJfQotCQkJZWxzZSB7IC8vIGlmICgoYyA9PSAnLicpIHx8IChjID09ICc6JykgfHwgKGMgPT0gJ18nKSB8fCAuLi4pCi0JCQkJLy8gY29udmVydCB0aGUgY2hhcmFjdGVyIHRvIGEgNCBkaWdpdCBoZXggY29kZSBwcmVmaXhlZCBieSAiXyIKLQkJCQlTdHJpbmcgaGV4ID0gSW50ZWdlci50b0hleFN0cmluZyhjKTsKLQkJCQlpbnQgbCA9IGhleC5sZW5ndGgoKTsKLQkJCQlpZiAobCA9PSAxKSB7Ci0JCQkJCW8uYXBwZW5kKCJfMDAwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJby5hcHBlbmQoaGV4KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobCA9PSAyKSB7Ci0JCQkJCW8uYXBwZW5kKCJfMDAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvLmFwcGVuZChoZXgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChsID09IDMpIHsKLQkJCQkJby5hcHBlbmQoIl8wIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJby5hcHBlbmQoaGV4KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW8uYXBwZW5kKCdfJyk7Ci0JCQkJCW8uYXBwZW5kKGhleCk7Ci0JCQkJfQotCQkJfQotCQl9IC8vIGZvcgotCQlyZXR1cm4gby50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBkZWNvZGVHZW4oU3RyaW5nIHMpIHsKLQotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBvID0gbmV3IFN0cmluZ0J1ZmZlcihzLmxlbmd0aCgpKTsKLQkJaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgYyA9IHMuY2hhckF0KGkpOwotCQkJaWYgKGMgIT0gJ18nKSB7Ci0JCQkJby5hcHBlbmQoYyk7Ci0JCQl9Ci0JCQllbHNlIHsgLy8gbmV4dCA0IGNoYXJhY3RlcnMgYXJlIHRoZSBoZXggY29kZQotCQkJCVN0cmluZyBoZXg7Ci0JCQkJaWYgKGxlbiA+IGkgKyA0KSB7Ci0JCQkJCWhleCA9IHMuc3Vic3RyaW5nKGkgKyAxLCBpICsgNSk7Ci0JCQkJCWkgKz0gNDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWhleCA9IHMuc3Vic3RyaW5nKGkgKyAxKTsKLQkJCQkJaSA9IGxlbiAtIDE7Ci0JCQkJfQotCQkJCW8uYXBwZW5kKChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50KGhleCwgMTYpKTsKLQkJCX0KLQkJfSAvLyBmb3IKLQkJcmV0dXJuIG8udG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUHJpbnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFByaW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0Zjg1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUHJpbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERTb3VyY2VPZmZzZXQ7Ci0KLQotcHVibGljIGNsYXNzIERURFByaW50ZXIgZXh0ZW5kcyBEVERWaXNpdG9yIHsKLQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JYm9vbGVhbiB1cGRhdGVPZmZzZXQgPSB0cnVlOwotCi0JcHVibGljIERURFByaW50ZXIoYm9vbGVhbiB1cGRhdGVPZmZzZXQpIHsKLQkJdGhpcy51cGRhdGVPZmZzZXQgPSB1cGRhdGVPZmZzZXQ7Ci0JfQotCi0JcHVibGljIFN0cmluZ0J1ZmZlciBnZXRCdWZmZXIoKSB7Ci0JCXJldHVybiBzYjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREZpbGUoRFRERmlsZSBmaWxlKSB7Ci0JCXN1cGVyLnZpc2l0RFRERmlsZShmaWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERURE5vdGF0aW9uKERURE5vdGF0aW9uIG5vdGF0aW9uKSB7Ci0JCWdlbmVyYXRlQ29tbWVudChub3RhdGlvbik7Ci0JCXVwZGF0ZVN0YXJ0T2Zmc2V0KG5vdGF0aW9uLCBzYi5sZW5ndGgoKSk7Ci0JCXNiLmFwcGVuZCgiPCFOT1RBVElPTiAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQobm90YXRpb24uZ2V0TmFtZSgpKS5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBwdWJsaWNJRCA9IG5vdGF0aW9uLmdldFB1YmxpY0lEKCk7Ci0JCVN0cmluZyBzeXN0ZW1JRCA9IG5vdGF0aW9uLmdldFN5c3RlbUlEKCk7Ci0JCWlmIChwdWJsaWNJRCA9PSBudWxsIHx8IHB1YmxpY0lELmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJc2IuYXBwZW5kKCJTWVNURU0gIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCXNiLmFwcGVuZCgiUFVCTElDIFwiIikuYXBwZW5kKHB1YmxpY0lEKS5hcHBlbmQoIlwiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWlmIChzeXN0ZW1JRCA9PSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQoIlwiXCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJc2IuYXBwZW5kKCJcIiIpLmFwcGVuZChzeXN0ZW1JRCkuYXBwZW5kKCJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbmRUYWcoKTsKLQkJdXBkYXRlRW5kT2Zmc2V0KG5vdGF0aW9uLCBzYi5sZW5ndGgoKSAtIDEpOyAvLyAtMSBmb3IgdGhlIG5ld2xpbmUgY2hhcgotCQlzdXBlci52aXNpdERURE5vdGF0aW9uKG5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVudGl0eShEVERFbnRpdHkgZW50aXR5KSB7Ci0JCWdlbmVyYXRlQ29tbWVudChlbnRpdHkpOwotCQl1cGRhdGVTdGFydE9mZnNldChlbnRpdHksIHNiLmxlbmd0aCgpKTsKLQkJc2IuYXBwZW5kKCI8IUVOVElUWSAiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkKLQkJCXNiLmFwcGVuZCgiJSAiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXNiLmFwcGVuZChlbnRpdHkuZ2V0TmFtZSgpKS5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQoZW50aXR5LmdldENvbnRlbnQoKS51bnBhcnNlKCkpOwotCi0JCWVuZFRhZygpOwotCQl1cGRhdGVFbmRPZmZzZXQoZW50aXR5LCBzYi5sZW5ndGgoKSAtIDEpOyAvLyAtMSBmb3IgdGhlIG5ld2xpbmUgY2hhcgotCQlzdXBlci52aXNpdERUREVudGl0eShlbnRpdHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERWxlbWVudChEVERFbGVtZW50IGVsZW1lbnQpIHsKLQkJZ2VuZXJhdGVDb21tZW50KGVsZW1lbnQpOwotCQl1cGRhdGVTdGFydE9mZnNldChlbGVtZW50LCBzYi5sZW5ndGgoKSk7Ci0JCXNiLmFwcGVuZCgiPCFFTEVNRU5UICIgKyBlbGVtZW50LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJRFRERWxlbWVudENvbnRlbnQgY29udGVudCA9IGVsZW1lbnQuZ2V0Q29udGVudCgpOwotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFBDRGF0YUNvbnRlbnQgfHwgY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQlzYi5hcHBlbmQoIiAoIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN1cGVyLnZpc2l0RFRERWxlbWVudChlbGVtZW50KTsKLQkJCXNiLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0JCX0gLy8gZW5kIG9mIGlmICgpCi0JCWVsc2UgewotCQkJc2IuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN1cGVyLnZpc2l0RFRERWxlbWVudChlbGVtZW50KTsKLQkJfSAvLyBlbmQgb2YgZWxzZQotCQllbmRUYWcoKTsKLQkJdXBkYXRlRW5kT2Zmc2V0KGVsZW1lbnQsIHNiLmxlbmd0aCgpIC0gMSk7IC8vIC0xIGZvciB0aGUgbmV3bGluZSBjaGFyCi0JCXZpc2l0QXR0cmlidXRlcyhlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eSkgewotCQlnZW5lcmF0ZUNvbW1lbnQocGFybUVudGl0eSk7Ci0JCXVwZGF0ZVN0YXJ0T2Zmc2V0KHBhcm1FbnRpdHksIHNiLmxlbmd0aCgpKTsKLQkJc2IuYXBwZW5kKCIlIiArIHBhcm1FbnRpdHkuZ2V0TmFtZSgpICsgIjtcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdXBkYXRlRW5kT2Zmc2V0KHBhcm1FbnRpdHksIHNiLmxlbmd0aCgpIC0gMSk7IC8vIC0xIGZvciB0aGUgbmV3bGluZQotCQkJCQkJCQkJCQkJCQkvLyBjaGFyCi0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50Q29udGVudChEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0JCXVwZGF0ZVN0YXJ0T2Zmc2V0KGNvbnRlbnQsIHNiLmxlbmd0aCgpKTsKLQkJU3RyaW5nIHRyYWlsaW5nQ2hhcnMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFJlcGVhdGFibGVDb250ZW50KSB7Ci0JCQlEVERSZXBlYXRhYmxlQ29udGVudCByZXBlYXRDb250ZW50ID0gKERURFJlcGVhdGFibGVDb250ZW50KSBjb250ZW50OwotCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSByZXBlYXRDb250ZW50LmdldE9jY3VycmVuY2UoKTsKLQkJCS8vIEludGVnZXIgb2NjdXJyZW5jZSA9IHJlcGVhdENvbnRlbnQuZ2V0T2NjdXJyZW5jZSgpOwotCQkJaWYgKG9jY3VycmVuY2VUeXBlICE9IG51bGwpIHsKLQkJCQlpbnQgb2NjdXJUeXBlID0gb2NjdXJyZW5jZVR5cGUuZ2V0VmFsdWUoKTsKLQkJCQlpZiAob2NjdXJUeXBlICE9IERURE9jY3VycmVuY2VUeXBlLk9ORSkgewotCQkJCQlpZiAocmVwZWF0Q29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCQkJCXNiLmFwcGVuZCgiKCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl0cmFpbGluZ0NoYXJzID0gIikiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJdHJhaWxpbmdDaGFycyArPSAoY2hhcikgb2NjdXJUeXBlOwotCQkJCX0KLQkJCX0gLy8gZW5kIG9mIGlmICgpCi0JCX0gLy8gZW5kIG9mIGlmICgpCi0KLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpIHsKLQkJCXN1cGVyLnZpc2l0RFRERWxlbWVudENvbnRlbnQoY29udGVudCk7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCB8fCBjb250ZW50IGluc3RhbmNlb2YgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgewotCQkJc2IuYXBwZW5kKCgoRFREUmVwZWF0YWJsZUNvbnRlbnQpIGNvbnRlbnQpLnVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpKTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJZWxzZSB7Ci0JCQkvLyBoYW5kbGUgRFREUENEYXRhQ29udGVudCwgRFREQW55Q29udGVudCBhbmQgRFRERW1wdHlDb250ZW50IGhlcmUKLQkJCXNiLmFwcGVuZChjb250ZW50LmdldENvbnRlbnROYW1lKCkpOwotCQl9IC8vIGVuZCBvZiBlbHNlCi0JCXNiLmFwcGVuZCh0cmFpbGluZ0NoYXJzKTsKLQkJdXBkYXRlRW5kT2Zmc2V0KGNvbnRlbnQsIHNiLmxlbmd0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREdyb3VwQ29udGVudChEVERHcm91cENvbnRlbnQgZ3JvdXApIHsKLQkJc2IuYXBwZW5kKCIoIik7IC8vJE5PTi1OTFMtMSQKLQkJRFRER3JvdXBLaW5kIGtpbmQgPSBncm91cC5nZXRHcm91cEtpbmQoKTsKLQkJLy8gTU9GMkVNRiBQb3J0Ci0JCS8vIEludGVnZXIgZ3JvdXBLaW5kID0gZ3JvdXAuZ2V0R3JvdXBLaW5kKCk7Ci0JCWlmIChraW5kID09IG51bGwpIHsKLQkJCWdyb3VwLnNldEdyb3VwS2luZChEVERHcm91cEtpbmQuZ2V0KERUREdyb3VwS2luZC5TRVFVRU5DRSkpOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCi0JCVN0cmluZyBjb24gPSBncm91cC5nZXRHcm91cEtpbmQoKS5nZXRWYWx1ZSgpID09IERUREdyb3VwS2luZC5DSE9JQ0UgPyAiIHwgIiA6ICIsICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCS8vIExvb3AgdGhydSB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgZ3JvdXAKLQkJQ29sbGVjdGlvbiBjb250ZW50ID0gZ3JvdXAuZ2V0Q29udGVudCgpOwotCQlpZiAoY29udGVudCAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGZpcnN0Q29udGVudCA9IHRydWU7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBjb250ZW50Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCWlmICghZmlyc3RDb250ZW50KSB7Ci0JCQkJCXNiLmFwcGVuZChjb24pOwotCQkJCX0gLy8gZW5kIG9mIGlmICgpCi0JCQkJZWxzZSB7Ci0JCQkJCWZpcnN0Q29udGVudCA9IGZhbHNlOwotCQkJCX0gLy8gZW5kIG9mIGVsc2UKLQkJCQl2aXNpdERUREVsZW1lbnRDb250ZW50KChEVERFbGVtZW50Q29udGVudCkgaS5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJc2IuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmlzaXRBdHRyaWJ1dGVzKERUREVsZW1lbnQgZWxlbSkgewotCQlDb2xsZWN0aW9uIGF0dHJzID0gZWxlbS5nZXREVERBdHRyaWJ1dGUoKTsKLQkJSXRlcmF0b3IgaSA9IGF0dHJzLml0ZXJhdG9yKCk7Ci0JCWlmIChhdHRycyAhPSBudWxsICYmIGkuaGFzTmV4dCgpKSB7Ci0JCQlEVERBdHRyaWJ1dGUgYXR0cmliID0gKERUREF0dHJpYnV0ZSkgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgY29tbWVudCA9IGF0dHJpYi5nZXRDb21tZW50KCk7Ci0JCQlpZiAoY29tbWVudCAhPSBudWxsICYmIGNvbW1lbnQubGVuZ3RoKCkgPiAwKQotCQkJCXNiLmFwcGVuZCgiPCEtLVxuICIpLmFwcGVuZChjb21tZW50KS5hcHBlbmQoIlxuLS0+XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlzYi5hcHBlbmQoIjwhQVRUTElTVCAiICsgZWxlbS5nZXROYW1lKCkgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJdXBkYXRlU3RhcnRPZmZzZXQoYXR0cmliLCBzYi5sZW5ndGgoKSk7Ci0JCQlzYi5hcHBlbmQoYXR0cmliLnVucGFyc2UoKSk7Ci0JCQl1cGRhdGVFbmRPZmZzZXQoYXR0cmliLCBzYi5sZW5ndGgoKSk7Ci0JCQlzYi5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoOyBpLmhhc05leHQoKTspIHsKLQkJCQlhdHRyaWIgPSAoRFREQXR0cmlidXRlKSBpLm5leHQoKTsKLQkJCQljb21tZW50ID0gYXR0cmliLmdldENvbW1lbnQoKTsKLQkJCQlpZiAoY29tbWVudCAhPSBudWxsICYmIGNvbW1lbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXNiLmFwcGVuZCgiPlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGNvbW1lbnQgIT0gbnVsbCAmJiBjb21tZW50Lmxlbmd0aCgpID4gMCkKLQkJCQkJCXNiLmFwcGVuZCgiPCEtLVxuICIpLmFwcGVuZChjb21tZW50KS5hcHBlbmQoIlxuLS0+XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXNiLmFwcGVuZCgiPCFBVFRMSVNUICIgKyBlbGVtLmdldE5hbWUoKSArICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJc2IuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl1cGRhdGVTdGFydE9mZnNldChhdHRyaWIsIHNiLmxlbmd0aCgpKTsKLQkJCQlzYi5hcHBlbmQoYXR0cmliLnVucGFyc2UoKSk7Ci0JCQkJdXBkYXRlRW5kT2Zmc2V0KGF0dHJpYiwgc2IubGVuZ3RoKCkpOwotCQkJCXNiLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc2IuYXBwZW5kKCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuZFRhZygpIHsKLQkJc2IuYXBwZW5kKCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVTdGFydE9mZnNldChEVERTb3VyY2VPZmZzZXQgbywgaW50IG9mZnNldCkgewotCQlpZiAodXBkYXRlT2Zmc2V0KSB7Ci0JCQlvLnNldFN0YXJ0T2Zmc2V0KG9mZnNldCk7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUVuZE9mZnNldChEVERTb3VyY2VPZmZzZXQgbywgaW50IG9mZnNldCkgewotCQlpZiAodXBkYXRlT2Zmc2V0KSB7Ci0JCQlvLnNldEVuZE9mZnNldChvZmZzZXQpOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUNvbW1lbnQoRFRET2JqZWN0IGR0ZE9iamVjdCkgewotCQlTdHJpbmcgY29tbWVudFN0cmluZyA9IG51bGw7Ci0KLQkJaWYgKGR0ZE9iamVjdCBpbnN0YW5jZW9mIERUREVsZW1lbnQpCi0JCQljb21tZW50U3RyaW5nID0gKChEVERFbGVtZW50KSBkdGRPYmplY3QpLmdldENvbW1lbnQoKTsKLQkJZWxzZSBpZiAoZHRkT2JqZWN0IGluc3RhbmNlb2YgRFRERW50aXR5KQotCQkJY29tbWVudFN0cmluZyA9ICgoRFRERW50aXR5KSBkdGRPYmplY3QpLmdldENvbW1lbnQoKTsKLQkJZWxzZSBpZiAoZHRkT2JqZWN0IGluc3RhbmNlb2YgRFRETm90YXRpb24pCi0JCQljb21tZW50U3RyaW5nID0gKChEVEROb3RhdGlvbikgZHRkT2JqZWN0KS5nZXRDb21tZW50KCk7Ci0KLQkJaWYgKGNvbW1lbnRTdHJpbmcgIT0gbnVsbCAmJiBjb21tZW50U3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJc2IuYXBwZW5kKCI8IS0tIikuYXBwZW5kKGNvbW1lbnRTdHJpbmcpLmFwcGVuZCgiLS0+XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBnZXRCdWZmZXJHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gc2I7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXREVERGaWxlR2VuKERUREZpbGUgZmlsZSkgewotCS8vCi0JLy8gc3VwZXIudmlzaXREVERGaWxlKGZpbGUpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0RFRETm90YXRpb25HZW4oRFRETm90YXRpb24gbm90YXRpb24pIHsKLQkvLwotCS8vIGdlbmVyYXRlQ29tbWVudChub3RhdGlvbik7Ci0JLy8gdXBkYXRlU3RhcnRPZmZzZXQobm90YXRpb24sIHNiLmxlbmd0aCgpKTsKLQkvLyBzYi5hcHBlbmQoIjwhTk9UQVRJT04gIik7Ci0JLy8gc2IuYXBwZW5kKG5vdGF0aW9uLmdldE5hbWUoKSkuYXBwZW5kKCIgIik7Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBwdWJsaWNJRCA9IG5vdGF0aW9uLmdldFB1YmxpY0lEKCk7Ci0JLy8gU3RyaW5nIHN5c3RlbUlEID0gbm90YXRpb24uZ2V0U3lzdGVtSUQoKTsKLQkvLyBpZiAocHVibGljSUQgPT0gbnVsbCB8fCBwdWJsaWNJRC5lcXVhbHMoIiIpKQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIlNZU1RFTSAiKTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIlBVQkxJQyBcIiIpLmFwcGVuZChwdWJsaWNJRCkuYXBwZW5kKCJcIiAiKTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGlmIChzeXN0ZW1JRD09bnVsbCkKLQkvLyB7Ci0JLy8gc2IuYXBwZW5kKCJcIlwiIik7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gc2IuYXBwZW5kKCJcIiIpLmFwcGVuZChzeXN0ZW1JRCkuYXBwZW5kKCJcIiIpOwotCS8vIH0KLQkvLyBlbmRUYWcoKTsKLQkvLyB1cGRhdGVFbmRPZmZzZXQobm90YXRpb24sIHNiLmxlbmd0aCgpIC0gMSk7IC8vIC0xIGZvciB0aGUgbmV3bGluZSBjaGFyCi0JLy8gc3VwZXIudmlzaXREVEROb3RhdGlvbihub3RhdGlvbik7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbnRpdHlHZW4oRFRERW50aXR5IGVudGl0eSkgewotCS8vCi0JLy8gZ2VuZXJhdGVDb21tZW50KGVudGl0eSk7Ci0JLy8gdXBkYXRlU3RhcnRPZmZzZXQoZW50aXR5LCBzYi5sZW5ndGgoKSk7Ci0JLy8gc2IuYXBwZW5kKCI8IUVOVElUWSAiKTsKLQkvLwotCS8vCi0JLy8gaWYgKGVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKQotCS8vIHNiLmFwcGVuZCgiJSAiKTsKLQkvLwotCS8vCi0JLy8gc2IuYXBwZW5kKGVudGl0eS5nZXROYW1lKCkpLmFwcGVuZCgiICIpOwotCS8vIHNiLmFwcGVuZChlbnRpdHkuZ2V0Q29udGVudCgpLnVucGFyc2UoKSk7Ci0JLy8KLQkvLwotCS8vIGVuZFRhZygpOwotCS8vIHVwZGF0ZUVuZE9mZnNldChlbnRpdHksIHNiLmxlbmd0aCgpIC0gMSk7IC8vIC0xIGZvciB0aGUgbmV3bGluZSBjaGFyCi0JLy8gc3VwZXIudmlzaXREVERFbnRpdHkoZW50aXR5KTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVsZW1lbnRHZW4oRFRERWxlbWVudCBlbGVtZW50KSB7Ci0JLy8KLQkvLyBnZW5lcmF0ZUNvbW1lbnQoZWxlbWVudCk7Ci0JLy8gdXBkYXRlU3RhcnRPZmZzZXQoZWxlbWVudCwgc2IubGVuZ3RoKCkpOwotCS8vIHNiLmFwcGVuZCgiPCFFTEVNRU5UICIgKyBlbGVtZW50LmdldE5hbWUoKSk7Ci0JLy8gRFRERWxlbWVudENvbnRlbnQgY29udGVudCA9IGVsZW1lbnQuZ2V0Q29udGVudCgpOwotCS8vIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCB8fAotCS8vIGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkKLQkvLyB7Ci0JLy8gc2IuYXBwZW5kKCIgKCIpOwotCS8vIHN1cGVyLnZpc2l0RFRERWxlbWVudChlbGVtZW50KTsKLQkvLyBzYi5hcHBlbmQoIikiKTsKLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gc2IuYXBwZW5kKCIgIik7Ci0JLy8gc3VwZXIudmlzaXREVERFbGVtZW50KGVsZW1lbnQpOwotCS8vIH0gLy8gZW5kIG9mIGVsc2UKLQkvLyBlbmRUYWcoKTsKLQkvLyB1cGRhdGVFbmRPZmZzZXQoZWxlbWVudCwgc2IubGVuZ3RoKCkgLSAxKTsgLy8gLTEgZm9yIHRoZSBuZXdsaW5lIGNoYXIKLQkvLyB2aXNpdEF0dHJpYnV0ZXMoZWxlbWVudCk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQKLQkvLyB2aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUdlbihEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UKLQkvLyBwYXJtRW50aXR5KSB7Ci0JLy8KLQkvLyBnZW5lcmF0ZUNvbW1lbnQocGFybUVudGl0eSk7Ci0JLy8gdXBkYXRlU3RhcnRPZmZzZXQocGFybUVudGl0eSwgc2IubGVuZ3RoKCkpOwotCS8vIHNiLmFwcGVuZCgiJSIgKyBwYXJtRW50aXR5LmdldE5hbWUoKSArICI7XG4iKTsKLQkvLyB1cGRhdGVFbmRPZmZzZXQocGFybUVudGl0eSwgc2IubGVuZ3RoKCkgLSAxKTsgLy8gLTEgZm9yIHRoZSBuZXdsaW5lCi0JLy8gY2hhcgotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0RFRERWxlbWVudENvbnRlbnRHZW4oRFRERWxlbWVudENvbnRlbnQgY29udGVudCkgewotCS8vCi0JLy8gdXBkYXRlU3RhcnRPZmZzZXQoY29udGVudCwgc2IubGVuZ3RoKCkpOwotCS8vIFN0cmluZyB0cmFpbGluZ0NoYXJzID0gIiI7Ci0JLy8gaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERSZXBlYXRhYmxlQ29udGVudCApCi0JLy8gewotCS8vIERURFJlcGVhdGFibGVDb250ZW50IHJlcGVhdENvbnRlbnQgPSAoRFREUmVwZWF0YWJsZUNvbnRlbnQpIGNvbnRlbnQ7Ci0JLy8gSW50ZWdlciBvY2N1cnJlbmNlID0gcmVwZWF0Q29udGVudC5nZXRPY2N1cnJlbmNlKCk7Ci0JLy8gaWYgKG9jY3VycmVuY2UgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gaW50IG9jY3VyVHlwZSA9IG9jY3VycmVuY2UuaW50VmFsdWUoKTsKLQkvLyBpZiAob2NjdXJUeXBlICE9IERURE9jY3VycmVuY2VUeXBlLk9ORSkKLQkvLyB7Ci0JLy8gaWYgKHJlcGVhdENvbnRlbnQgaW5zdGFuY2VvZiBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIigiKTsKLQkvLyB0cmFpbGluZ0NoYXJzID0gIikiOwotCS8vIH0KLQkvLyB0cmFpbGluZ0NoYXJzICs9IChjaGFyKSBvY2N1clR5cGU7Ci0JLy8gfQotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyAgICAKLQkvLyBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkKLQkvLyB7Ci0JLy8gc3VwZXIudmlzaXREVERFbGVtZW50Q29udGVudChjb250ZW50KTsKLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vIGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCB8fAotCS8vIGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoKChEVERSZXBlYXRhYmxlQ29udGVudCljb250ZW50KS51bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKSk7Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyBlbHNlCi0JLy8gewotCS8vIC8vIGhhbmRsZSBEVERQQ0RhdGFDb250ZW50LCBEVERBbnlDb250ZW50IGFuZCBEVERFbXB0eUNvbnRlbnQgaGVyZQotCS8vIHNiLmFwcGVuZChjb250ZW50LmdldENvbnRlbnROYW1lKCkpOwotCS8vIH0gLy8gZW5kIG9mIGVsc2UKLQkvLyBzYi5hcHBlbmQodHJhaWxpbmdDaGFycyk7Ci0JLy8gdXBkYXRlRW5kT2Zmc2V0KGNvbnRlbnQsIHNiLmxlbmd0aCgpKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREdyb3VwQ29udGVudEdlbihEVERHcm91cENvbnRlbnQgZ3JvdXApIHsKLQkvLwotCS8vIHNiLmFwcGVuZCgiKCIpOwotCS8vICAgIAotCS8vIEludGVnZXIgZ3JvdXBLaW5kID0gZ3JvdXAuZ2V0R3JvdXBLaW5kKCk7Ci0JLy8gaWYgKGdyb3VwS2luZCA9PSBudWxsKQotCS8vIHsKLQkvLyBncm91cC5zZXRHcm91cEtpbmQoRFRER3JvdXBLaW5kLlNFUVVFTkNFKTsKLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vICAgIAotCS8vIFN0cmluZyBjb24gPSBncm91cC5nZXRHcm91cEtpbmQoKS5pbnRWYWx1ZSgpID09IERUREdyb3VwS2luZC5DSE9JQ0UgPyAiCi0JLy8gfCAiIDogIiwgIjsKLQkvLwotCS8vCi0JLy8gLy8gTG9vcCB0aHJ1IHRoZSBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBncm91cAotCS8vIENvbGxlY3Rpb24gY29udGVudCA9IGdyb3VwLmdldENvbnRlbnQoKTsKLQkvLyBpZiAoY29udGVudCAhPSBudWxsKQotCS8vIHsKLQkvLyBib29sZWFuIGZpcnN0Q29udGVudCA9IHRydWU7Ci0JLy8gZm9yIChJdGVyYXRvciBpID0gY29udGVudC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCS8vIHsKLQkvLyBpZiAoIWZpcnN0Q29udGVudCkKLQkvLyB7Ci0JLy8gc2IuYXBwZW5kKGNvbik7Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyBlbHNlCi0JLy8gewotCS8vIGZpcnN0Q29udGVudCA9IGZhbHNlOwotCS8vIH0gLy8gZW5kIG9mIGVsc2UKLQkvLyB2aXNpdERUREVsZW1lbnRDb250ZW50KChEVERFbGVtZW50Q29udGVudCkgaS5uZXh0KCkpOwotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLwotCS8vIHNiLmFwcGVuZCgiKSIpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0QXR0cmlidXRlc0dlbihEVERFbGVtZW50IGVsZW0pIHsKLQkvLwotCS8vIENvbGxlY3Rpb24gYXR0cnMgPSBlbGVtLmdldERUREF0dHJpYnV0ZSgpOwotCS8vIEl0ZXJhdG9yIGkgPSBhdHRycy5pdGVyYXRvcigpOwotCS8vIGlmIChhdHRycyAhPSBudWxsICYmIGkuaGFzTmV4dCgpKQotCS8vIHsKLQkvLyBEVERBdHRyaWJ1dGUgYXR0cmliID0gKERUREF0dHJpYnV0ZSkgaS5uZXh0KCk7Ci0JLy8gU3RyaW5nIGNvbW1lbnQgPSBhdHRyaWIuZ2V0Q29tbWVudCgpOwotCS8vIGlmIChjb21tZW50IT1udWxsICYmIGNvbW1lbnQubGVuZ3RoKCk+MCkKLQkvLyBzYi5hcHBlbmQoIjwhLS1cbiAiKS5hcHBlbmQoY29tbWVudCkuYXBwZW5kKCJcbi0tPlxuIik7Ci0JLy8gc2IuYXBwZW5kKCI8IUFUVExJU1QgIiArIGVsZW0uZ2V0TmFtZSgpICsgIlxuIik7Ci0JLy8gc2IuYXBwZW5kKCIgIik7Ci0JLy8gdXBkYXRlU3RhcnRPZmZzZXQoYXR0cmliLCBzYi5sZW5ndGgoKSk7Ci0JLy8gc2IuYXBwZW5kKGF0dHJpYi51bnBhcnNlKCkpOwotCS8vIHVwZGF0ZUVuZE9mZnNldChhdHRyaWIsIHNiLmxlbmd0aCgpKTsKLQkvLyBzYi5hcHBlbmQoIlxuIik7Ci0JLy8gZm9yICg7IGkuaGFzTmV4dCgpOyApCi0JLy8gewotCS8vIGF0dHJpYiA9IChEVERBdHRyaWJ1dGUpIGkubmV4dCgpOwotCS8vIGNvbW1lbnQgPSBhdHRyaWIuZ2V0Q29tbWVudCgpOwotCS8vIGlmIChjb21tZW50IT1udWxsICYmIGNvbW1lbnQubGVuZ3RoKCk+MCkKLQkvLyB7Ci0JLy8gc2IuYXBwZW5kKCI+XG4iKTsKLQkvLyBpZiAoY29tbWVudCE9bnVsbCAmJiBjb21tZW50Lmxlbmd0aCgpPjApCi0JLy8gc2IuYXBwZW5kKCI8IS0tXG4gIikuYXBwZW5kKGNvbW1lbnQpLmFwcGVuZCgiXG4tLT5cbiIpOwotCS8vIHNiLmFwcGVuZCgiPCFBVFRMSVNUICIgKyBlbGVtLmdldE5hbWUoKSArICJcbiIpOwotCS8vIH0KLQkvLyBzYi5hcHBlbmQoIiAiKTsKLQkvLyB1cGRhdGVTdGFydE9mZnNldChhdHRyaWIsIHNiLmxlbmd0aCgpKTsKLQkvLyBzYi5hcHBlbmQoYXR0cmliLnVucGFyc2UoKSk7Ci0JLy8gdXBkYXRlRW5kT2Zmc2V0KGF0dHJpYiwgc2IubGVuZ3RoKCkpOwotCS8vIHNiLmFwcGVuZCgiXG4iKTsKLQkvLyB9Ci0JLy8gc2IuYXBwZW5kKCI+XG4iKTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgZW5kVGFnR2VuKCkgewotCS8vCi0JLy8gc2IuYXBwZW5kKCI+XG4iKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGFydE9mZnNldEdlbihEVERTb3VyY2VPZmZzZXQgbywgaW50IG9mZnNldCkgewotCS8vCi0JLy8gaWYgKHVwZGF0ZU9mZnNldCkKLQkvLyB7Ci0JLy8gby5zZXRTdGFydE9mZnNldChvZmZzZXQpOwotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdXBkYXRlRW5kT2Zmc2V0R2VuKERURFNvdXJjZU9mZnNldCBvLCBpbnQgb2Zmc2V0KSB7Ci0JLy8KLQkvLyBpZiAodXBkYXRlT2Zmc2V0KQotCS8vIHsKLQkvLyBvLnNldEVuZE9mZnNldChvZmZzZXQpOwotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVDb21tZW50R2VuKERURE9iamVjdCBkdGRPYmplY3QpIHsKLQkvLwotCS8vIFN0cmluZyBjb21tZW50U3RyaW5nID0gbnVsbDsKLQkvLwotCS8vCi0JLy8gaWYgKGR0ZE9iamVjdCBpbnN0YW5jZW9mIERUREVsZW1lbnQpCi0JLy8gY29tbWVudFN0cmluZyA9ICgoRFRERWxlbWVudClkdGRPYmplY3QpLmdldENvbW1lbnQoKTsKLQkvLyBlbHNlIGlmIChkdGRPYmplY3QgaW5zdGFuY2VvZiBEVERFbnRpdHkpCi0JLy8gY29tbWVudFN0cmluZyA9ICgoRFRERW50aXR5KWR0ZE9iamVjdCkuZ2V0Q29tbWVudCgpOwotCS8vIGVsc2UgaWYgKGR0ZE9iamVjdCBpbnN0YW5jZW9mIERURE5vdGF0aW9uKQotCS8vIGNvbW1lbnRTdHJpbmcgPSAoKERURE5vdGF0aW9uKWR0ZE9iamVjdCkuZ2V0Q29tbWVudCgpOwotCS8vCi0JLy8KLQkvLyBpZiAoIGNvbW1lbnRTdHJpbmchPW51bGwgJiYgY29tbWVudFN0cmluZy5sZW5ndGgoKT4wKQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIjwhLS0iKS5hcHBlbmQoY29tbWVudFN0cmluZykuYXBwZW5kKCItLT5cbiIpOwotCS8vIH0KLQkvLyB9Ci19Ly8gRFREUHJpbnRlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ODZjM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgRFREUmVzb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotCXB1YmxpYyBEVERSZXNvdXJjZUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShTdHJpbmcgZmlsZW5hbWUpIHsKLQkJcmV0dXJuIG5ldyBEVERSZXNvdXJjZUltcGwoZmlsZW5hbWUpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXJldHVybiBuZXcgRFREUmVzb3VyY2VJbXBsKHVyaSk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFJlc291cmNlU2V0IHJlc291cmNlcywgVVJJIHVyaSkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBEVERSZXNvdXJjZUltcGwodXJpKTsKLQkJcmVzb3VyY2VzLmdldFJlc291cmNlcygpLmFkZChyZXNvdXJjZSk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBTdHJpbmcgdXJpKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbmV3IERURFJlc291cmNlSW1wbCh1cmkpOwotCQlyZXNvdXJjZXMuZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBsb2FkKFN0cmluZyB1cmkpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCXJlc291cmNlLmxvYWQobmV3IEhhc2hNYXAoKSk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgbG9hZChVUkkgdXJpKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZSh1cmkpOwotCQlyZXNvdXJjZS5sb2FkKG5ldyBIYXNoTWFwKCkpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGxvYWQoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBTdHJpbmcgdXJpKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGxvYWQocmVzb3VyY2VzLCB1cmksIG5ldyBIYXNoTWFwKCkpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBsb2FkKFJlc291cmNlU2V0IHJlc291cmNlcywgVVJJIHVyaSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBsb2FkKHJlc291cmNlcywgdXJpLCBuZXcgSGFzaE1hcCgpKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgbG9hZChSZXNvdXJjZVNldCByZXNvdXJjZXMsIFN0cmluZyB1cmksIE1hcCBvcHRpb25zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZShyZXNvdXJjZXMsIHVyaSk7Ci0JCXJlc291cmNlLmxvYWQob3B0aW9ucyk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgbG9hZChSZXNvdXJjZVNldCByZXNvdXJjZXMsIFVSSSB1cmksIE1hcCBvcHRpb25zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZShyZXNvdXJjZXMsIHVyaSk7Ci0JCXJlc291cmNlLmxvYWQob3B0aW9ucyk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci19IC8vIERURFJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERSZXNvdXJjZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwODViZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci0KLQotcHVibGljIGNsYXNzIERURFJlc291cmNlSW1wbCBleHRlbmRzIFJlc291cmNlSW1wbCB7Ci0KLQlwdWJsaWMgRFREUmVzb3VyY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBEVERSZXNvdXJjZUltcGwoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCXN1cGVyKFVSSS5jcmVhdGVVUkkoZmlsZW5hbWUpKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCI+Pj4+IERURFJlc291cmNlSW1wbCBjdG9yIDEiKTsKLQl9Ci0KLQlwdWJsaWMgRFREUmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCI+Pj4+IERURFJlc291cmNlSW1wbCBjdG9yIDIiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBvYmplY3QgZm9yIHRoZSBnaXZlbiBVUkkKLQkgKiB7QGxpbmsgVVJJI2ZyYWdtZW50IGZyYWdtZW50fS4KLQkgKiA8cD4KLQkgKiBUaGUgZnJhZ21lbnQgZW5jb2Rpbmcgd2lsbCB0eXBpY2FsbHkgYmUgdGhhdCBwcm9kdWNlZCBieQotCSAqIHtAbGluayAjZ2V0VVJJRnJhZ21lbnQgZ2V0VVJJRnJhZ21lbnR9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpRnJhZ21lbnQKLQkgKiAgICAgICAgICAgIHRoZSBmcmFnbWVudCB0byByZXNvbHZlLgotCSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIG9iamVjdCBmb3IgdGhlIGdpdmVuIGZyYWdtZW50LgotCSAqIEBzZWUgI2dldFVSSUZyYWdtZW50KEVPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQjZ2V0RU9iamVjdChVUkksIGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWwjcmVzb2x2ZShFT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0I2VPYmplY3RGb3JVUklGcmFnbWVudFNlZ21lbnQoU3RyaW5nKQotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhIHByb2JsZW0gb2NjdXJzIG5hdmlnYXRpbmcgdGhlIGZyYWdtZW50LgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoamF2YS5sYW5nLlN0cmluZyB1cmlGcmFnbWVudCkgewotCQlFTGlzdCBjb250ZW50cyA9IGdldENvbnRlbnRzKCk7Ci0JCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpID0gY29udGVudHMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRFRERmlsZSkgewotCQkJCQkvLyB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgRFRERmlsZSBpbiBhIERURCBleHRlbnQKLQkJCQkJRU9iamVjdCByZXN1bHQgPSAoKERUREZpbGUpIG9iaikuZmluZE9iamVjdCh1cmlGcmFnbWVudCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiPj4+IERUREtleSBFcnJvcjogY2Fubm90IGZpbmQgb2JqZWN0ICIgKyB1cmlGcmFnbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHN1cGVyLmdldEVPYmplY3QodXJpRnJhZ21lbnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSSSB7QGxpbmsgVVJJI2ZyYWdtZW50IGZyYWdtZW50fSB0aGF0LCB3aGVuIHBhc3NlZCB0bwotCSAqIHtAbGluayAjZ2V0RU9iamVjdCBnZXRFT2JqZWN0fSB3aWxsIHJldHVybiB0aGUgZ2l2ZW4gb2JqZWN0LgotCSAqIDxwPgotCSAqIEluIG90aGVyIHdvcmRzLCB0aGUgZm9sbG93aW5nIGlzIDxjb2RlPnRydWU8L2NvZGU+IGZvciBhbnkgb2JqZWN0Ci0JICogY29udGFpbmVkIGJ5IGEgcmVzb3VyY2U6Ci0JICogCi0JICogPHByZT4KLQkgKiAKLQkgKiAgICBSZXNvdXJjZSByZXNvdXJjZSA9IGVPYmplY3QuZVJlc291cmNlKCk7Ci0JICogICAgZU9iamVjdCA9PSByZXNvdXJjZS5nZXRFT2JqZWN0KHJlc291cmNlLmdldFVSSUZyYWdtZW50KGVPYmplY3QpKQotCSAqIAotCSAqIDwvcHJlPgotCSAqIAotCSAqIEFuIGltcGxlbWVudGF0aW9uIG1heSBjaG9vc2UgdG8gdXNlIElEcyBvciB0byB1c2Ugc3RydWN0dXJlZCBVUkkKLQkgKiBmcmFnbWVudHMsIGFzIHN1cHBvcnRlZCBieQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0I2VVUklGcmFnbWVudFNlZ21lbnQgZVVSSUZyYWdtZW50U2VnbWVudH0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBlT2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGlkZW50aWZ5LgotCSAqIEByZXR1cm4gdGhlIFVSSSB7QGxpbmsgVVJJI2ZyYWdtZW50IGZyYWdtZW50fSBmb3IgdGhlIG9iamVjdC4KLQkgKiBAc2VlICNnZXRFT2JqZWN0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QjZVVSSUZyYWdtZW50U2VnbWVudChvcmcuZWNsaXBzZS5lbWYuY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsCi0JICogICAgICBFT2JqZWN0KQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFVSSUZyYWdtZW50KEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdCBpbnN0YW5jZW9mIERURE9iamVjdCkgewotCQkJcmV0dXJuICgoRFRET2JqZWN0KSBlT2JqZWN0KS5nZXRQYXRobmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRVUklGcmFnbWVudChlT2JqZWN0KTsKLQl9Ci0KLQlwcml2YXRlIERURFV0aWwgZHRkVXRpbDsKLQotCXB1YmxpYyBEVERVdGlsIGdldERURFV0aWwoKSB7Ci0JCXJldHVybiBkdGRVdGlsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERURFV0aWwoRFREVXRpbCBkdGRVdGlsKSB7Ci0JCXRoaXMuZHRkVXRpbCA9IGR0ZFV0aWw7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZChNYXAgb3B0aW9ucykgewotCi0JCVN0cmluZyB1cmlTdHJpbmcgPSBnZXRVUkkoKS50b1N0cmluZygpOwotCQl0cnkgewotCQkJRFREVXRpbCBkdGRVdGlsID0gbmV3IERURFV0aWwoKTsKLQkJCWR0ZFV0aWwucGFyc2UoZ2V0UmVzb3VyY2VTZXQoKSwgdXJpU3RyaW5nKTsKLQkJCWR0ZFV0aWwuc2V0UmVzb3VyY2UodGhpcyk7Ci0JCQlzZXREVERVdGlsKGR0ZFV0aWwpOwotCQkJZ2V0Q29udGVudHMoKS5hZGQoZHRkVXRpbC5nZXREVERGaWxlKCkpOwotCi0JCQkvLyBSZXNldCB0aGUgZGlydHkgZmxhZyBhZnRlciB0aGUgcmVzb3VyY2UgaXMgbG9hZGVkCi0JCQlzZXRNb2RpZmllZChmYWxzZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zLCBPYmplY3Qgb3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpID0gY29udGVudHMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRFRERmlsZSkgewotCQkJCQl0cnkgewotCQkJCQkJRFREUHJpbnRlciBwcmludGVyID0gbmV3IERURFByaW50ZXIodHJ1ZSk7Ci0JCQkJCQlwcmludGVyLnZpc2l0RFRERmlsZSgoRFRERmlsZSkgb2JqKTsKLQotCQkJCQkJU3RyaW5nIHMgPSBwcmludGVyLmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7Ci0JCQkJCQlvcy53cml0ZShzLmdldEJ5dGVzKCkpOwotCQkJCQkJLy8gUmVzZXQgdGhlIGRpcnR5IGZsYWcgYWZ0ZXIgdGhlIHJlc291cmNlIGlzIHNhdmVkCi0JCQkJCQlzZXRNb2RpZmllZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZShaaXBPdXRwdXRTdHJlYW0gem9zLCBTdHJpbmcgZW50cnksIFN0cmluZyBtZXRhTW9kZWxOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihEVERDb3JlTWVzc2FnZXMuX0VYQ19PUEVSQVRJT05fTk9UX1NVUFBPUlRFRCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREU3dpdGNoLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MDNiNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudDsKLQotCi0KLXB1YmxpYyBjbGFzcyBEVERTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBEVERQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBEVERTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gRFREUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlFQ2xhc3MgdGhlRUNsYXNzID0gdGhlRU9iamVjdC5lQ2xhc3MoKTsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlzd2l0Y2ggKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVCA6IHsKLQkJCQkJRFRER3JvdXBDb250ZW50IGR0ZEdyb3VwQ29udGVudCA9IChEVERHcm91cENvbnRlbnQpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRER3JvdXBDb250ZW50KGR0ZEdyb3VwQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERSZXBlYXRhYmxlQ29udGVudChkdGRHcm91cENvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFRERWxlbWVudENvbnRlbnQoZHRkR3JvdXBDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFIDogewotCQkJCQlEVERBdHRyaWJ1dGUgZHRkQXR0cmlidXRlID0gKERUREF0dHJpYnV0ZSkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERBdHRyaWJ1dGUoZHRkQXR0cmlidXRlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVBdHRyaWJ1dGUoZHRkQXR0cmlidXRlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVTdHJ1Y3R1cmFsRmVhdHVyZShkdGRBdHRyaWJ1dGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRVR5cGVkRWxlbWVudChkdGRBdHRyaWJ1dGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChkdGRBdHRyaWJ1dGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChkdGRBdHRyaWJ1dGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UIDogewotCQkJCQlEVERFbGVtZW50IGR0ZEVsZW1lbnQgPSAoRFRERWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERFbGVtZW50KGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRUNsYXNzKGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFREQ29udGVudChkdGRFbGVtZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVDbGFzc2lmaWVyKGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChkdGRFbGVtZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoZHRkRWxlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlQgOiB7Ci0JCQkJCURUREVtcHR5Q29udGVudCBkdGRFbXB0eUNvbnRlbnQgPSAoRFRERW1wdHlDb250ZW50KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREVtcHR5Q29udGVudChkdGRFbXB0eUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFRERWxlbWVudENvbnRlbnQoZHRkRW1wdHlDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlQgOiB7Ci0JCQkJCURUREFueUNvbnRlbnQgZHRkQW55Q29udGVudCA9IChEVERBbnlDb250ZW50KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREFueUNvbnRlbnQoZHRkQW55Q29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERFbGVtZW50Q29udGVudChkdGRBbnlDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UIDogewotCQkJCQlEVERQQ0RhdGFDb250ZW50IGR0ZHBjRGF0YUNvbnRlbnQgPSAoRFREUENEYXRhQ29udGVudCkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERQQ0RhdGFDb250ZW50KGR0ZHBjRGF0YUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFRERWxlbWVudENvbnRlbnQoZHRkcGNEYXRhQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlQgOiB7Ci0JCQkJCURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50ID0gKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURURFJlcGVhdGFibGVDb250ZW50KGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURUREVsZW1lbnRDb250ZW50KGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRSA6IHsKLQkJCQkJRFRERmlsZSBkdGRGaWxlID0gKERUREZpbGUpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERmlsZShkdGRGaWxlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRSA6IHsKLQkJCQkJRFREQmFzaWNUeXBlIGR0ZEJhc2ljVHlwZSA9IChEVERCYXNpY1R5cGUpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFREQmFzaWNUeXBlKGR0ZEJhc2ljVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFQ2xhc3MoZHRkQmFzaWNUeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVDbGFzc2lmaWVyKGR0ZEJhc2ljVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGR0ZEJhc2ljVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGR0ZEJhc2ljVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEUgOiB7Ci0JCQkJCURUREVudW1lcmF0aW9uVHlwZSBkdGRFbnVtZXJhdGlvblR5cGUgPSAoRFRERW51bWVyYXRpb25UeXBlKSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREVudW1lcmF0aW9uVHlwZShkdGRFbnVtZXJhdGlvblR5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRUVudW0oZHRkRW51bWVyYXRpb25UeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVEYXRhVHlwZShkdGRFbnVtZXJhdGlvblR5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRUNsYXNzaWZpZXIoZHRkRW51bWVyYXRpb25UeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoZHRkRW51bWVyYXRpb25UeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoZHRkRW51bWVyYXRpb25UeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT04gOiB7Ci0JCQkJCURURE5vdGF0aW9uIGR0ZE5vdGF0aW9uID0gKERURE5vdGF0aW9uKSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURURE5vdGF0aW9uKGR0ZE5vdGF0aW9uKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURURENvbnRlbnQoZHRkTm90YXRpb24pOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFkgOiB7Ci0JCQkJCURUREVudGl0eSBkdGRFbnRpdHkgPSAoRFRERW50aXR5KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREVudGl0eShkdGRFbnRpdHkpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFREQ29udGVudChkdGRFbnRpdHkpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFkgOiB7Ci0JCQkJCURUREV4dGVybmFsRW50aXR5IGR0ZEV4dGVybmFsRW50aXR5ID0gKERUREV4dGVybmFsRW50aXR5KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREV4dGVybmFsRW50aXR5KGR0ZEV4dGVybmFsRW50aXR5KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURUREVudGl0eUNvbnRlbnQoZHRkRXh0ZXJuYWxFbnRpdHkpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFkgOiB7Ci0JCQkJCURUREludGVybmFsRW50aXR5IGR0ZEludGVybmFsRW50aXR5ID0gKERUREludGVybmFsRW50aXR5KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREludGVybmFsRW50aXR5KGR0ZEludGVybmFsRW50aXR5KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURUREVudGl0eUNvbnRlbnQoZHRkSW50ZXJuYWxFbnRpdHkpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRSA6IHsKLQkJCQkJRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSA9IChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERDb250ZW50KGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVCA6IHsKLQkJCQkJRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50ID0gKERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudChkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURURFJlcGVhdGFibGVDb250ZW50KGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFRERWxlbWVudENvbnRlbnQoZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERGaWxlKERUREZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURURE5vdGF0aW9uKERURE5vdGF0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERDb250ZW50KERURENvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREVudGl0eShEVERFbnRpdHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREVudGl0eUNvbnRlbnQoRFRERW50aXR5Q29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERXh0ZXJuYWxFbnRpdHkoRFRERXh0ZXJuYWxFbnRpdHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREludGVybmFsRW50aXR5KERUREludGVybmFsRW50aXR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURURFJlcGVhdGFibGVDb250ZW50KERURFJlcGVhdGFibGVDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERWxlbWVudChEVERFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbGVtZW50Q29udGVudChEVERFbGVtZW50Q29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERW1wdHlDb250ZW50KERUREVtcHR5Q29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFREQW55Q29udGVudChEVERBbnlDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERQQ0RhdGFDb250ZW50KERURFBDRGF0YUNvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREdyb3VwQ29udGVudChEVERHcm91cENvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREF0dHJpYnV0ZShEVERBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREVudW1lcmF0aW9uVHlwZShEVERFbnVtZXJhdGlvblR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREJhc2ljVHlwZShEVERCYXNpY1R5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8vICsrKysrKysrKysrKysrKysrKytHRU5FUklDUlVMRVMuSlNFRCsrKysrKysrKysrKysrKysrKysKLQkvLwotCS8vICsrKysrKysrKysrKysrKysrKytHRU5FUklDUlVMRVMuSlNFRCsrKysrKysrKysrKysrKysrKysKLQkvLyAvLyBwdWJsaWMgT2JqZWN0IGNhc2VFTmFtZXNwYWNlKEVOYW1lc3BhY2Ugb2JqZWN0KSB7Ci0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUNsYXNzKEVDbGFzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUF0dHJpYnV0ZShFQXR0cmlidXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFRW51bShFRW51bSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRU1vZGVsRWxlbWVudChFTW9kZWxFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFTmFtZWRFbGVtZW50KEVOYW1lZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVTdHJ1Y3R1cmFsRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVEYXRhVHlwZShFRGF0YVR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVUeXBlZEVsZW1lbnQoRVR5cGVkRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUNsYXNzaWZpZXIoRUNsYXNzaWZpZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8vICsrKysrKysrKysrKysrKysrKytHRU5FUklDUlVMRVMuSlNFRCsrKysrKysrKysrKysrKysrKysKLQkvLwotCS8vICsrKysrKysrKysrKysrKysrKytHRU5FUklDUlVMRVMuSlNFRCsrKysrKysrKysrKysrKysrKysKLQkvLyAvLyBwdWJsaWMgT2JqZWN0IGNhc2VJbnRlcm5hbEVDbGFzc2lmaWVyKEludGVybmFsRUNsYXNzaWZpZXIgb2JqZWN0KSB7Ci0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy8gRFREU3dpdGNoCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREVW5pcXVlTmFtZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFVuaXF1ZU5hbWVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4ZmYzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREVW5pcXVlTmFtZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBEVERVbmlxdWVOYW1lSGVscGVyIHsKLQlwdWJsaWMgRFREVW5pcXVlTmFtZUhlbHBlcigpIHsKLQotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUVsZW1lbnROYW1lKERUREZpbGUgZHRkRmlsZSkgewotCQlMaXN0IGVsZW1lbnRzID0gZHRkRmlsZS5saXN0RFRERWxlbWVudCgpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShlbGVtZW50cywgIk5ld0VsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUVudGl0eU5hbWUoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCUxpc3QgZW50aXRpZXMgPSBkdGRGaWxlLmxpc3REVERFbnRpdHkoKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUoZW50aXRpZXMsICJOZXdFbnRpdHkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZU5vdGF0aW9uTmFtZShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGlzdCBub3RhdGlvbnMgPSBkdGRGaWxlLmxpc3REVEROb3RhdGlvbigpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShub3RhdGlvbnMsICJOZXdOb3RhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlQXR0cmlidXRlTmFtZShEVERFbGVtZW50IGVsZW1lbnQpIHsKLQkJTGlzdCBhdHRycyA9IGVsZW1lbnQuZ2V0RFREQXR0cmlidXRlKCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKGF0dHJzLCAiTmV3QXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVOYW1lKExpc3Qgb2JqcywgU3RyaW5nIHRva2VuKSB7Ci0JCWludCBjb3VudGVyID0gMTsKLQotCQlib29sZWFuIHVuaXF1ZU5hbWUgPSBmYWxzZTsKLQkJd2hpbGUgKCF1bmlxdWVOYW1lKSB7Ci0JCQlTdHJpbmcgbmV3TmFtZSA9IHRva2VuICsgbmV3IEludGVnZXIoY291bnRlcisrKTsKLQkJCXVuaXF1ZU5hbWUgPSB0cnVlOwotCQkJSXRlcmF0b3IgaXRlciA9IG9ianMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlTdHJpbmcgb2JqTmFtZSA9IGdldE5hbWUob2JqKTsKLQkJCQlpZiAob2JqTmFtZS5lcXVhbHMobmV3TmFtZSkpIHsKLQkJCQkJdW5pcXVlTmFtZSA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodW5pcXVlTmFtZSkgewotCQkJCXJldHVybiBuZXdOYW1lOwotCQkJfQotCQl9Ci0JCS8vIHdlIHNob3VsZG4ndCBnZXQgaGVyZQotCQlyZXR1cm4gIk5vIE5hbWUgZm91bmQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBEVERFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChEVERFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVERFbnRpdHkpIHsKLQkJCXJldHVybiAoKERUREVudGl0eSkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFRETm90YXRpb24pIHsKLQkJCXJldHVybiAoKERURE5vdGF0aW9uKSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVERBdHRyaWJ1dGUpIHsKLQkJCXJldHVybiAoKERUREF0dHJpYnV0ZSkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlRWxlbWVudE5hbWVHZW4oRFRERmlsZSBkdGRGaWxlKSB7Ci0KLQkJTGlzdCBlbGVtZW50cyA9IGR0ZEZpbGUubGlzdERUREVsZW1lbnQoKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUoZWxlbWVudHMsICJOZXdFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlRW50aXR5TmFtZUdlbihEVERGaWxlIGR0ZEZpbGUpIHsKLQotCQlMaXN0IGVudGl0aWVzID0gZHRkRmlsZS5saXN0RFRERW50aXR5KCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKGVudGl0aWVzLCAiTmV3RW50aXR5Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlTm90YXRpb25OYW1lR2VuKERUREZpbGUgZHRkRmlsZSkgewotCi0JCUxpc3Qgbm90YXRpb25zID0gZHRkRmlsZS5saXN0RFRETm90YXRpb24oKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUobm90YXRpb25zLCAiTmV3Tm90YXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVBdHRyaWJ1dGVOYW1lR2VuKERUREVsZW1lbnQgZWxlbWVudCkgewotCi0JCUxpc3QgYXR0cnMgPSBlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShhdHRycywgIk5ld0F0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZU5hbWVHZW4oTGlzdCBvYmpzLCBTdHJpbmcgdG9rZW4pIHsKLQotCQlpbnQgY291bnRlciA9IDE7Ci0KLQkJYm9vbGVhbiB1bmlxdWVOYW1lID0gZmFsc2U7Ci0JCXdoaWxlICghdW5pcXVlTmFtZSkgewotCQkJU3RyaW5nIG5ld05hbWUgPSB0b2tlbiArIG5ldyBJbnRlZ2VyKGNvdW50ZXIrKyk7Ci0JCQl1bmlxdWVOYW1lID0gdHJ1ZTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBvYmpzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJU3RyaW5nIG9iak5hbWUgPSBnZXROYW1lKG9iaik7Ci0JCQkJaWYgKG9iak5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJCXVuaXF1ZU5hbWUgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVuaXF1ZU5hbWUpIHsKLQkJCQlyZXR1cm4gbmV3TmFtZTsKLQkJCX0KLQkJfQotCQkvLyB3ZSBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJcmV0dXJuICJObyBOYW1lIGZvdW5kIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXROYW1lR2VuKE9iamVjdCBvYmopIHsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgRFRERWxlbWVudCkgewotCQkJcmV0dXJuICgoRFRERWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFRERW50aXR5KSB7Ci0JCQlyZXR1cm4gKChEVERFbnRpdHkpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERURE5vdGF0aW9uKSB7Ci0JCQlyZXR1cm4gKChEVEROb3RhdGlvbikgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFREQXR0cmlidXRlKSB7Ci0JCQlyZXR1cm4gKChEVERBdHRyaWJ1dGUpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0vLyBEVERVbmlxdWVOYW1lSGVscGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5YTdkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGwuRFRERmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5EVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5EVERQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5FcnJvck1lc3NhZ2U7Ci0KLS8qKgotICogQ3JlYXRlIE1PRiBvYmplY3RzIGZyb20gdGhlIHBhcnNlZCBEVEQgSWYgbm8gRFREIGZpbGUgaXMgc3BlY2lmZWQsIGNyZWF0ZQotICogdGhlIHJvb3QgTU9GIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgRFREVXRpbCB7Ci0JRFRERmFjdG9yeSBmYWN0b3J5OwotCUVMaXN0IGV4dGVudDsKLQlSZXNvdXJjZSByZXNvdXJjZTsKLQlEVERGaWxlIGR0ZEZpbGU7Ci0JU3RyaW5nIGR0ZE1vZGVsRmlsZTsKLQlib29sZWFuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXM7Ci0KLQlwcml2YXRlIEhhc2h0YWJsZSBleHRlcm5hbERURE1vZGVscyA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIEhhc2h0YWJsZSBwZVBvb2wgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJpdmF0ZSBIYXNodGFibGUgZWxlbWVudFBvb2wgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwcml2YXRlIERURFBhcnNlciBwYXJzZXI7Ci0KLQlwcml2YXRlIFZlY3RvciBlcnJvck1zZ3MgPSBuZXcgVmVjdG9yKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgdXRpbENhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0Jc3RhdGljIHB1YmxpYyBEVERVdGlsIGdldERURFV0aWxGb3IoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCURURFV0aWwgdXRpbCA9IChEVERVdGlsKSB1dGlsQ2FjaGUuZ2V0KGZpbGVuYW1lKTsKLQkJaWYgKHV0aWwgPT0gbnVsbCkgewotCQkJdXRpbCA9IG5ldyBEVERVdGlsKCk7Ci0JCQl1dGlsQ2FjaGUucHV0KGZpbGVuYW1lLCB1dGlsKTsKLQkJfQotCi0JCXJldHVybiB1dGlsOwotCX0KLQotCi0JcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIHVyaSkgewotCQlwYXJzZShuZXcgUmVzb3VyY2VTZXRJbXBsKCksIHVyaSk7Ci0JfQotCi0JLyoqCi0JICogSW52b2tlIHBhcnNlIHRvIHBhcnNlIGEgLmR0ZCBmaWxlIGludG8gYSBNT0Ygb2JqZWN0IG1vZGVsIFRoaXMgaXMKLQkgKiBpbnZva2VkIGJ5IHRoZSBSZWdpc3RlcmVkRFREUGFyc2VyIHRoYXQgcmVnaXN0ZXJzIHRoaXMgcGFyc2VyIGZvciBNT0YKLQkgKiB0byB1c2UgYWdhaW5zdCB0aGUgLmR0ZCB0eXBlCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lIC0KLQkgKiAgICAgICAgICAgIHRoZSBmdWxseSBxdWFsaWZlZCBuYW1lIG9mIGEgLmR0ZCBmaWxlCi0JICovCi0JcHVibGljIHZvaWQgcGFyc2UoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBTdHJpbmcgZmlsZW5hbWUpIHsKLQkJLy8gR2V0IHRoZSBkdGQgbmFtZSBmcm9tIHRoZSBmaWxlIG5hbWUKLQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZW5hbWUpOwotCQlJUGF0aCBpUGF0aCA9IHBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpOwotCQlTdHJpbmcgZHRkTmFtZSA9IGlQYXRoLnRvRmlsZSgpLmdldE5hbWUoKTsKLQotCQl0cnkgewotCQkJcGFyc2VyID0gbmV3IERURFBhcnNlcihmYWxzZSk7Ci0JCQlpZiAoZXhwYW5kRW50aXR5UmVmZXJlbmNlcykgewotCQkJCXBhcnNlci5zZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpOwotCQkJfQotCQkJcGFyc2VyLnBhcnNlKGZpbGVuYW1lKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQkJfQotCi0JCWR0ZE1vZGVsRmlsZSA9IGZpbGVuYW1lOwotCi0JCWZhY3RvcnkgPSBEVERGYWN0b3J5SW1wbC5pbnN0YW5jZSgpOwotCi0JCWV4dGVudCA9IG5ldyBCYXNpY0VMaXN0KCk7Ci0KLQkJZHRkRmlsZSA9IGZhY3RvcnkuY3JlYXRlRFRERmlsZSgpOwotCQlleHRlbnQuYWRkKGR0ZEZpbGUpOwotCi0JCWR0ZEZpbGUuc2V0TmFtZShkdGROYW1lKTsKLQotCQlwb3B1bGF0ZURURChyZXNvdXJjZXMsIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpOwotCX0KLQotCXB1YmxpYyBEVERGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0JCXJldHVybiBkdGRGaWxlOwotCX0KLQotCXB1YmxpYyBIYXNodGFibGUgZ2V0UEVQb29sKCkgewotCQlyZXR1cm4gcGVQb29sOwotCX0KLQotCXB1YmxpYyBIYXNodGFibGUgZ2V0RWxlbWVudFBvb2woKSB7Ci0JCXJldHVybiBlbGVtZW50UG9vbDsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0Q29udGVudHMoKSB7Ci0JCXJldHVybiBleHRlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0ZXhwYW5kRW50aXR5UmVmZXJlbmNlcyhib29sZWFuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpIHsKLQkJdGhpcy5leHBhbmRFbnRpdHlSZWZlcmVuY2VzID0gZXhwYW5kRW50aXR5UmVmZXJlbmNlczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gZXhwYW5kRW50aXR5UmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbW9kZWwgaGFzIGJlZW4gbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGVsRGlydHkoKSB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2UuaXNNb2RpZmllZCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSAuZHRkIGZpbGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYXZlKCkgewotCQl0cnkgewotCQkJTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJcmVzb3VyY2Uuc2F2ZShvcHRpb25zKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2F2ZSBtb2RlbCBleGNlcHRpb24gIiArIGV4KTsgLy8kTk9OLU5MUy0xJAotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYXZlQXMoU3RyaW5nIG5ld0ZpbGVuYW1lKSB7Ci0JCXJlc291cmNlLnNldFVSSShVUkkuY3JlYXRlVVJJKG5ld0ZpbGVuYW1lKSk7Ci0JCWJvb2xlYW4gb2sgPSBzYXZlKCk7Ci0KLQkJaWYgKG9rKSB7Ci0JCQlQYXRoIHBhdGggPSBuZXcgUGF0aChuZXdGaWxlbmFtZSk7Ci0JCQlJUGF0aCBpUGF0aCA9IHBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpOwotCQkJU3RyaW5nIGR0ZE5hbWUgPSBpUGF0aC50b0ZpbGUoKS5nZXROYW1lKCk7Ci0KLQkJCWR0ZEZpbGUuc2V0TmFtZShkdGROYW1lKTsKLQkJfQotCQlyZXR1cm4gb2s7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2F2ZURUREZpbGUoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlV3JpdGVyKGZpbGVuYW1lKSwgdHJ1ZSk7Ci0JCQlEVERQcmludGVyIHByaW50ZXIgPSBuZXcgRFREUHJpbnRlcih0cnVlKTsKLQkJCXByaW50ZXIudmlzaXREVERGaWxlKGR0ZEZpbGUpOwotCi0JCQlTdHJpbmcgcyA9IHByaW50ZXIuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLQkJCXB3LnByaW50bG4ocyk7Ci0JCQlwdy5jbG9zZSgpOwotCQl9Ci0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RFREU291cmNlKGJvb2xlYW4gaW5jbHVkZUVycm9yKSB7Ci0JCXJldHVybiBkdGRGaWxlLnVucGFyc2UoaW5jbHVkZUVycm9yKTsgLy8gdHJ1ZSA9IGluY2x1ZGUgZXJyb3IgbGluZXMKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgTU9GIG9iamVjdHMgZnJvbSBEVEQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVEVEQoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBib29sZWFuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpIHsKLQkJVmVjdG9yIGR0ZExpc3QgPSBwYXJzZXIuZ2V0RFRETGlzdCgpOwotCi0JCS8vIGNyZWF0ZSBYTUlNb2RlbCBmb3IgdGhlIGluY2x1ZGVkIERURHMKLQkJaWYgKGR0ZExpc3Quc2l6ZSgpID4gMCkgewotCQkJaWYgKCFleHBhbmRFbnRpdHlSZWZlcmVuY2VzKSB7Ci0JCQkJZm9yIChpbnQgaSA9IGR0ZExpc3Quc2l6ZSgpIC0gMTsgaSA+IDA7IGktLSkgewotCQkJCQlEVEQgZHRkID0gKERURCkgZHRkTGlzdC5lbGVtZW50QXQoaSk7Ci0JCQkJCWxvYWRJbmNsdWRlZERURChyZXNvdXJjZXMsIGR0ZCk7Ci0JCQkJfQotCi0JCQkJRFREIGR0ZCA9IChEVEQpIGR0ZExpc3QuZWxlbWVudEF0KDApOwotCQkJCXBvcHVsYXRlRFREKHJlc291cmNlcywgZHRkLCBkdGRGaWxlKTsgLy8gcG9wdWxhdGUgdGhlIG1haW4KLQkJCQkJCQkJCQkJCQkJLy8gRFRECi0JCQkJLy8gdmFsaWRhdGVXaXRoTW9kZWwoZHRkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGkgPSBkdGRMaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJCURURCBkdGQgPSAoRFREKSBkdGRMaXN0LmVsZW1lbnRBdChpKTsKLQkJCQkJcG9wdWxhdGVEVEQocmVzb3VyY2VzLCBkdGQsIGR0ZEZpbGUpOwotCQkJCQkvLyB2YWxpZGF0ZVdpdGhNb2RlbChkdGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8vIHJldHVybiB0aGUgaW5zdGFuY2UgdW5pcXVlIHRvIHRoaXMgRFREVXRpbCBmaWxlIHRoYXQgcmVwcmVzZW50cyBhbgotCS8vIGV4dGVybmFsbHkgbG9hZGVkIGR0ZCAod2lsbCBjcmVhdGUgaWYgb25lIGRvZXNuJ3QgZXhpc3QgeWV0KQotCXB1YmxpYyBFeHRlcm5hbERURE1vZGVsIGdldEV4dGVybmFsRFRETW9kZWwoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBTdHJpbmcgdXJpKSB7Ci0JCWlmIChleHBhbmRFbnRpdHlSZWZlcmVuY2VzKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIERlZmF1bHRNc2dMb2dnZXIud3JpdGUoIkV4dGVybmFsIERURCBuYW1lOiAiICsgdXJpKTsKLQotCQlpZiAoZXh0ZXJuYWxEVERNb2RlbHMuY29udGFpbnNLZXkodXJpKSkgewotCQkJcmV0dXJuIChFeHRlcm5hbERURE1vZGVsKSBleHRlcm5hbERURE1vZGVscy5nZXQodXJpKTsKLQkJfQotCQllbHNlIHsKLQkJCUV4dGVybmFsRFRETW9kZWwgZXh0TW9kZWwgPSBuZXcgRXh0ZXJuYWxEVERNb2RlbCgpOwotCQkJaWYgKGV4dE1vZGVsLmxvYWRNb2RlbChyZXNvdXJjZXMsIHVyaSkpIHsKLQkJCQlleHRlcm5hbERURE1vZGVscy5wdXQodXJpLCBleHRNb2RlbCk7Ci0JCQkJcmV0dXJuIGV4dE1vZGVsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIGxvYWQgeG1pTW9kZWxzIGZvciBpbmNsdWRlZCBEVERzCi0JcHJpdmF0ZSB2b2lkIGxvYWRJbmNsdWRlZERURChSZXNvdXJjZVNldCByZXNvdXJjZXMsIERURCBkdGQpIHsKLQkJRXh0ZXJuYWxEVERNb2RlbCBleHRNb2RlbCA9IGdldEV4dGVybmFsRFRETW9kZWwocmVzb3VyY2VzLCBkdGQuZ2V0TmFtZSgpKTsKLQkJaWYgKGV4dE1vZGVsICE9IG51bGwpIHsKLQkJCS8vIG5vdyBmaWxsIG91ciBoYXNoIHRhYmxlcyBmb3IgZWxlbWVudHMgYW5kIHBhcmFtZXRlciBlbnRpdGllcwotCQkJLy8gc28gdGhhdCB3ZSBrbm93IHdoYXQgY2FuIGJlIHJlZmVyZW5jZWQgYnkgb3VyIG1haW4gZHRkCi0JCQlEVERGaWxlIGZpbGUgPSBleHRNb2RlbC5nZXRFeHRlcm5hbERUREZpbGUoKTsKLQkJCUNvbGxlY3Rpb24gZWxlbWVudExpc3QgPSBmaWxlLmxpc3REVERFbGVtZW50KCk7Ci0JCQlDb2xsZWN0aW9uIGVudGl0eUxpc3QgPSBmaWxlLmxpc3REVERFbnRpdHkoKTsKLQotCQkJSXRlcmF0b3IgaSA9IGVsZW1lbnRMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlEVERPYmplY3Qgb2JqZWN0ID0gKERURE9iamVjdCkgaS5uZXh0KCk7Ci0JCQkJZWxlbWVudFBvb2wucHV0KGdldEJhc2VOYW1lKG9iamVjdCksIG9iamVjdCk7Ci0JCQl9Ci0KLQkJCWkgPSBlbnRpdHlMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlEVERFbnRpdHkgZW50aXR5ID0gKERUREVudGl0eSkgaS5uZXh0KCk7Ci0JCQkJaWYgKGVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKSB7Ci0JCQkJCXBlUG9vbC5wdXQoZ2V0QmFzZU5hbWUoZW50aXR5KSwgZW50aXR5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgTU9GIG9iamVjdHMgZnJvbSBEVEQKLQkgKiAKLQkgKiAxKSB3aWxsIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBEVEQgTW9mIG9iamVjdCBmb3IgRW50aXR5RGVjbCwKLQkgKiBOb3RhdGlvbkRlY2wgYW5kIEVsZW1lbnREZWNsIGRlY2xhcmF0aW9ucyBkdXJpbmcgdGhlIDFzdCBwYXNzIDIpIER1cmluZwotCSAqIHRoZSAybmQgcGFzcywgaXQgd2lsbCBhZGQgdGhlIGNvbnRlbnRNb2RlbCBhbmQgQXR0bGlzdCB0byBhbGwKLQkgKiBFbGVtZW50RGVjbC4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVEVEQoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBEVEQgZHRkLCBEVERGaWxlIGRGaWxlKSB7Ci0JCURURE1vZGVsQnVpbGRlciBtb2RlbEJ1aWxkZXIgPSBuZXcgRFRETW9kZWxCdWlsZGVyKHJlc291cmNlcywgdGhpcywgZHRkLCBkRmlsZSk7Ci0KLQkJbW9kZWxCdWlsZGVyLnZpc2l0RFREKGR0ZCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBlbXB0eUVycm9yTWVzc2FnZXMoKSB7Ci0JCWVycm9yTXNncy5yZW1vdmVBbGxFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVycm9yTWVzc2FnZShFcnJvck1lc3NhZ2UgZXJyb3IpIHsKLQkJaW50IHZlY3RvclNpemUgPSBlcnJvck1zZ3Muc2l6ZSgpOwotCQlib29sZWFuIGFkZCA9IHRydWU7Ci0KLQkJaWYgKHZlY3RvclNpemUgIT0gMCkgewotCQkJaW50IGluZGV4ID0gMDsKLQotCQkJd2hpbGUgKGFkZCA9PSB0cnVlICYmIGluZGV4IDwgdmVjdG9yU2l6ZSkgewotCQkJCWlmICgoKEVycm9yTWVzc2FnZSkgZXJyb3JNc2dzLmVsZW1lbnRBdChpbmRleCkpLmVxdWFscyhlcnJvcikpIHsKLQkJCQkJYWRkID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChhZGQpIHsKLQkJCWVycm9yTXNncy5hZGRFbGVtZW50KGVycm9yKTsKLQkJfQotCX0KLQotCXB1YmxpYyBWZWN0b3IgZ2V0RXJyb3JzKCkgewotCQlyZXR1cm4gZXJyb3JNc2dzOwotCX0KLQotCS8vIFRoaXMgZ2V0cyB0aGUgbmFtZSB3aXRob3V0IGFueSBwc2V1ZG8gbmFtZXNwYWNlIHByZWZpeAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJhc2VOYW1lKERURE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGdldE5hbWUob2JqLCBudWxsKTsKLQl9Ci0KLQkvLyBUaGlzIGdldHMgdGhlIG5hbWUgd2l0aCBwc2V1ZG8gbmFtZXNwYWNlIHByZWZpeGVzIGlmIGR0ZEZpbGUgaXMgbm90Ci0JLy8gbnVsbAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWUoRFRET2JqZWN0IG9iaiwgRFRERmlsZSBkdGRGaWxlKSB7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERUREVudGl0eSkgewotCQkJRFRERW50aXR5IGVudGl0eSA9IChEVERFbnRpdHkpIG9iajsKLQkJCWlmIChkdGRGaWxlICE9IG51bGwgJiYgIWVudGl0eS5nZXREVERGaWxlKCkuZXF1YWxzKGR0ZEZpbGUpKSB7Ci0JCQkJbmFtZSA9IG5ldyBQYXRoKGVudGl0eS5nZXREVERGaWxlKCkuZ2V0TmFtZSgpKS5sYXN0U2VnbWVudCgpICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJbmFtZSArPSAiJSIgKyAoKERUREVudGl0eSkgb2JqKS5nZXROYW1lKCkgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERUREVsZW1lbnQpIHsKLQkJCURUREVsZW1lbnQgZWxlbWVudCA9IChEVERFbGVtZW50KSBvYmo7Ci0JCQlpZiAoZHRkRmlsZSAhPSBudWxsICYmICFlbGVtZW50LmdldERUREZpbGUoKS5lcXVhbHMoZHRkRmlsZSkpIHsKLQkJCQluYW1lID0gbmV3IFBhdGgoZWxlbWVudC5nZXREVERGaWxlKCkuZ2V0TmFtZSgpKS5sYXN0U2VnbWVudCgpICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJbmFtZSArPSAoKERUREVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERUREVsZW1lbnRDb250ZW50KSB7Ci0JCQlyZXR1cm4gKChEVERFbGVtZW50Q29udGVudCkgb2JqKS5nZXRDb250ZW50TmFtZSgpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEdyb3VwVHlwZShpbnQgZ3JvdXBLaW5kLCBpbnQgb2NjdXJyZW5jZSkgewotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0KLQkJc3dpdGNoIChncm91cEtpbmQpIHsKLQkJCWNhc2UgRFRER3JvdXBLaW5kLlNFUVVFTkNFIDoKLQkJCQl0eXBlID0gIkRURFNlcXVlbmNlIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBEVERHcm91cEtpbmQuQ0hPSUNFIDoKLQkJCQl0eXBlID0gIkRURENob2ljZSI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCi0JCXR5cGUgKz0gZ2V0UmVwZWF0YWJsZVR5cGVTdWZmaXgob2NjdXJyZW5jZSk7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlZmVyZW5jZVR5cGUoaW50IG9jY3VycmVuY2UpIHsKLQkJU3RyaW5nIHR5cGUgPSAiRFREUmVmZXJlbmNlIjsgLy8kTk9OLU5MUy0xJAotCQl0eXBlICs9IGdldFJlcGVhdGFibGVUeXBlU3VmZml4KG9jY3VycmVuY2UpOwotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UmVwZWF0YWJsZVR5cGVTdWZmaXgoaW50IG9jY3VycmVuY2UpIHsKLQkJcmV0dXJuICIoIiArIChjaGFyKSBvY2N1cnJlbmNlICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG5TdGFydGluZyAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChhcmdzLmxlbmd0aCAhPSAxKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1c2FnZTogRHRkVXRpbCBpbnB1dGZpbGUuZHRkIik7IC8vJE5PTi1OTFMtMSQKLQotCQlqYXZhLmlvLkZpbGUgaW5wdXRGaWxlID0gbmV3IEZpbGUoYXJnc1swXSk7Ci0KLQkJU3RyaW5nIGR0ZEZpbGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWR0ZEZpbGVOYW1lID0gaW5wdXRGaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJfQotCi0JCVN0cmluZyBkdGRNb2RlbE5hbWUgPSBkdGRGaWxlTmFtZTsKLQotCQlpZiAoRFREQ29uc3RhbnRzLkRURF9FWFRFTlNJT04uZXF1YWxzKG5ldyBQYXRoKGR0ZEZpbGVOYW1lKS5nZXRGaWxlRXh0ZW5zaW9uKCkpKSB7Ci0JCQlkdGRNb2RlbE5hbWUgPSBuZXcgUGF0aChkdGRGaWxlTmFtZSkucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCk7Ci0JCX0KLQkJRFREVXRpbCBkMm0gPSBuZXcgRFREVXRpbCgpOwotCQkvLyBUT0RPOiBmaXggcG9ydAotCQkvLyBkMm0ucGFyc2UoZHRkRmlsZU5hbWUpOwotCQl0cnkgewotCQkJZDJtLnNhdmVBcyhkdGRNb2RlbE5hbWUgKyAiLiIgKyBEVERDb25zdGFudHMuRFREX1hNSV9FWFRFTlNJT04pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiB0aHJvd24gZHVyaW5nIG1vZGVsIHNhdmU6ICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiRG9uZS4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGggZ2V0UGF0aCgpIHsKLQkJUGF0aCBjdXJyZW50RFREUGF0aCA9IG5ldyBQYXRoKGR0ZE1vZGVsRmlsZSk7Ci0JCWlmIChjdXJyZW50RFREUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCXJldHVybiBjdXJyZW50RFREUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQkJfQotCi0JCXJldHVybiBuZXcgUGF0aCgiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBzdGF0aWMgRFREVXRpbCBnZXREVERVdGlsRm9yR2VuKFN0cmluZyBmaWxlbmFtZSkgewotCS8vCi0JLy8gRFREVXRpbCB1dGlsID0gKERURFV0aWwpIHV0aWxDYWNoZS5nZXQoZmlsZW5hbWUpOwotCS8vIGlmICh1dGlsID09IG51bGwpCi0JLy8gewotCS8vIHV0aWwgPSBuZXcgRFREVXRpbCgpOwotCS8vIHV0aWxDYWNoZS5wdXQoZmlsZW5hbWUsIHV0aWwpOwotCS8vIH0KLQkvLyAgICAKLQkvLyByZXR1cm4gdXRpbDsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBwYXJzZUdlbihTdHJpbmcgdXJpKSB7Ci0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkvLyBwYXJzZShuZXcgUmVzb3VyY2VTZXRJbXBsKCksIHVyaSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogSW52b2tlIHBhcnNlIHRvIHBhcnNlIGEgLmR0ZCBmaWxlIGludG8gYSBNT0Ygb2JqZWN0IG1vZGVsCi0JLy8gKiBUaGlzIGlzIGludm9rZWQgYnkgdGhlIFJlZ2lzdGVyZWREVERQYXJzZXIgdGhhdCByZWdpc3RlcnMgdGhpcyBwYXJzZXIKLQkvLyBmb3IgTU9GIHRvIHVzZQotCS8vICogYWdhaW5zdCB0aGUgLmR0ZCB0eXBlCi0JLy8gKiBAcGFyYW0gZmlsZW5hbWUgLSB0aGUgZnVsbHkgcXVhbGlmZWQgbmFtZSBvZiBhIC5kdGQgZmlsZQotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgcGFyc2VHZW4oUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBTdHJpbmcgZmlsZW5hbWUpIHsKLQkvLwotCS8vIC8vIEdldCB0aGUgZHRkIG5hbWUgZnJvbSB0aGUgZmlsZSBuYW1lCi0JLy8gUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZW5hbWUpOwotCS8vIElQYXRoIGlQYXRoID0gcGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCk7Ci0JLy8gU3RyaW5nIGR0ZE5hbWUgPSBpUGF0aC50b0ZpbGUoKS5nZXROYW1lKCk7Ci0JLy8KLQkvLwotCS8vIHRyeQotCS8vIHsKLQkvLyBwYXJzZXIgPSBuZXcgRFREUGFyc2VyKGZhbHNlKTsKLQkvLyBpZiAoZXhwYW5kRW50aXR5UmVmZXJlbmNlcykKLQkvLyB7Ci0JLy8gcGFyc2VyLnNldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoZXhwYW5kRW50aXR5UmVmZXJlbmNlcyk7Ci0JLy8gfQotCS8vIHBhcnNlci5wYXJzZShmaWxlbmFtZSk7Ci0JLy8gfQotCS8vIGNhdGNoKElPRXhjZXB0aW9uIGV4KQotCS8vIHsKLQkvLyBleC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBkdGRNb2RlbEZpbGUgPSBmaWxlbmFtZTsKLQkvLwotCS8vCi0JLy8gZmFjdG9yeSA9IERUREZhY3RvcnlJbXBsLmluc3RhbmNlKCk7Ci0JLy8KLQkvLwotCS8vIGV4dGVudCA9IG5ldyBCYXNpY0VMaXN0KCk7Ci0JLy8KLQkvLwotCS8vIGR0ZEZpbGUgPSBmYWN0b3J5LmNyZWF0ZURUREZpbGUoKTsKLQkvLyBleHRlbnQuYWRkKGR0ZEZpbGUpOwotCS8vCi0JLy8KLQkvLyBkdGRGaWxlLnNldE5hbWUoZHRkTmFtZSk7Ci0JLy8KLQkvLwotCS8vIHBvcHVsYXRlRFREKHJlc291cmNlcywgZXhwYW5kRW50aXR5UmVmZXJlbmNlcyk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERUREZhY3RvcnkgZ2V0RmFjdG9yeUdlbigpIHsKLQkvLwotCS8vIHJldHVybiBmYWN0b3J5OwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBEVERGaWxlIGdldERUREZpbGVHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gZHRkRmlsZTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgSGFzaHRhYmxlIGdldFBFUG9vbEdlbigpIHsKLQkvLwotCS8vIHJldHVybiBwZVBvb2w7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIEhhc2h0YWJsZSBnZXRFbGVtZW50UG9vbEdlbigpIHsKLQkvLwotCS8vIHJldHVybiBlbGVtZW50UG9vbDsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRUxpc3QgZ2V0RXh0ZW50R2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIGV4dGVudDsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBzZXRSZXNvdXJjZUdlbihSZXNvdXJjZSByZXNvdXJjZSkgewotCS8vCi0JLy8gdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBSZXNvdXJjZSBnZXRSZXNvdXJjZUdlbihSZXNvdXJjZSByZXNvdXJjZSkgewotCS8vCi0JLy8gcmV0dXJuIHJlc291cmNlOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHNldGV4cGFuZEVudGl0eVJlZmVyZW5jZXNHZW4oYm9vbGVhbgotCS8vIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpIHsKLQkvLwotCS8vIHRoaXMuZXhwYW5kRW50aXR5UmVmZXJlbmNlcyA9IGV4cGFuZEVudGl0eVJlZmVyZW5jZXM7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gZ2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlc0dlbigpIHsKLQkvLwotCS8vIHJldHVybiBleHBhbmRFbnRpdHlSZWZlcmVuY2VzOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIFJldHVybiB0cnVlIGlmIHRoZSBtb2RlbCBoYXMgYmVlbiBtb2RpZmllZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gaXNNb2RlbERpcnR5R2VuKCkgewotCS8vCi0JLy8gaWYgKHJlc291cmNlICE9IG51bGwpCi0JLy8gewotCS8vIHJldHVybiByZXNvdXJjZS5pc01vZGlmaWVkKCk7Ci0JLy8gfQotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBTYXZlIHRoZSAuZHRkIGZpbGUKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBib29sZWFuIHNhdmVHZW4oKSB7Ci0JLy8KLQkvLyB0cnkKLQkvLyB7Ci0JLy8gcmVzb3VyY2Uuc2F2ZSgpOwotCS8vIHJldHVybiB0cnVlOwotCS8vIH0KLQkvLyBjYXRjaCAoRXhjZXB0aW9uIGV4KQotCS8vIHsKLQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNhdmUgbW9kZWwgZXhjZXB0aW9uICIgKyBleCk7Ci0JLy8gZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBzYXZlQXNHZW4oU3RyaW5nIG5ld0ZpbGVuYW1lKSB7Ci0JLy8KLQkvLyByZXNvdXJjZS5zZXRVUkkobmV3RmlsZW5hbWUpOwotCS8vIGJvb2xlYW4gb2sgPSBzYXZlKCk7Ci0JLy8KLQkvLwotCS8vIGlmIChvaykKLQkvLyB7Ci0JLy8gUGF0aCBwYXRoID0gbmV3IFBhdGgobmV3RmlsZW5hbWUpOwotCS8vIElQYXRoIGlQYXRoID0gcGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCk7Ci0JLy8gU3RyaW5nIGR0ZE5hbWUgPSBpUGF0aC50b0ZpbGUoKS5nZXROYW1lKCk7Ci0JLy8KLQkvLwotCS8vIGR0ZEZpbGUuc2V0TmFtZShkdGROYW1lKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIG9rOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBib29sZWFuIHNhdmVEVERGaWxlR2VuKFN0cmluZyBmaWxlbmFtZSkgewotCS8vCi0JLy8gYm9vbGVhbiByZXN1bHQ9dHJ1ZTsKLQkvLyB0cnkKLQkvLyB7Ci0JLy8gUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZmlsZW5hbWUpLHRydWUpOwotCS8vIERURFByaW50ZXIgcHJpbnRlciA9IG5ldyBEVERQcmludGVyKHRydWUpOwotCS8vIHByaW50ZXIudmlzaXREVERGaWxlKGR0ZEZpbGUpOwotCS8vCi0JLy8KLQkvLyBTdHJpbmcgcyA9IHByaW50ZXIuZ2V0QnVmZmVyKCkuZ2V0TmFtZSgpLnRvU3RyaW5nKCk7Ci0JLy8gcHcucHJpbnRsbihzKTsKLQkvLyBwdy5jbG9zZSgpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCS8vIHsKLQkvLyByZXN1bHQgPSBmYWxzZTsKLQkvLyB9Ci0JLy8gcmV0dXJuIHJlc3VsdDsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgU3RyaW5nIGdldERURFNvdXJjZUdlbihib29sZWFuIGluY2x1ZGVFcnJvcikgewotCS8vCi0JLy8gcmV0dXJuIGR0ZEZpbGUudW5wYXJzZShpbmNsdWRlRXJyb3IpOyAvLyB0cnVlID0gaW5jbHVkZSBlcnJvciBsaW5lcwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIENyZWF0ZSBNT0Ygb2JqZWN0cyBmcm9tIERURAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVEVERHZW4oUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBib29sZWFuCi0JLy8gZXhwYW5kRW50aXR5UmVmZXJlbmNlcykgewotCS8vCi0JLy8gVmVjdG9yIGR0ZExpc3QgPSBwYXJzZXIuZ2V0RFRETGlzdCgpOwotCS8vCi0JLy8KLQkvLyAvLyBjcmVhdGUgWE1JTW9kZWwgZm9yIHRoZSBpbmNsdWRlZCBEVERzCi0JLy8gaWYgKCBkdGRMaXN0LnNpemUoKSA+IDApCi0JLy8gewotCS8vIGlmICghZXhwYW5kRW50aXR5UmVmZXJlbmNlcykKLQkvLyB7Ci0JLy8gZm9yIChpbnQgaT1kdGRMaXN0LnNpemUoKSAtIDE7IGkgPiAwOyBpLS0pCi0JLy8gewotCS8vIERURCBkdGQgPSAoRFREKSBkdGRMaXN0LmVsZW1lbnRBdChpKTsKLQkvLyBsb2FkSW5jbHVkZWREVEQocmVzb3VyY2VzLCBkdGQpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gRFREIGR0ZCA9IChEVEQpIGR0ZExpc3QuZWxlbWVudEF0KDApOwotCS8vIHBvcHVsYXRlRFREKHJlc291cmNlcywgZHRkLCBkdGRGaWxlKTsgLy8gcG9wdWxhdGUgdGhlIG1haW4gRFRECi0JLy8gLy8gdmFsaWRhdGVXaXRoTW9kZWwoZHRkKTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyBmb3IgKGludCBpID0gZHRkTGlzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkKLQkvLyB7Ci0JLy8gRFREIGR0ZCA9IChEVEQpIGR0ZExpc3QuZWxlbWVudEF0KGkpOwotCS8vIHBvcHVsYXRlRFREKHJlc291cmNlcywgZHRkLCBkdGRGaWxlKTsKLQkvLyAvLyB2YWxpZGF0ZVdpdGhNb2RlbChkdGQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBFeHRlcm5hbERURE1vZGVsIGdldEV4dGVybmFsRFRETW9kZWxHZW4oUmVzb3VyY2VTZXQKLQkvLyByZXNvdXJjZXMsIFN0cmluZyB1cmkpIHsKLQkvLwotCS8vIGlmIChleHBhbmRFbnRpdHlSZWZlcmVuY2VzKQotCS8vIHsKLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0JLy8gICAgICAgCi0JLy8gRGVmYXVsdE1zZ0xvZ2dlci53cml0ZSgiRXh0ZXJuYWwgRFREIG5hbWU6ICIgKyB1cmkpOwotCS8vCi0JLy8KLQkvLyBpZiAoZXh0ZXJuYWxEVERNb2RlbHMuY29udGFpbnNLZXkodXJpKSkKLQkvLyB7Ci0JLy8gcmV0dXJuIChFeHRlcm5hbERURE1vZGVsKSBleHRlcm5hbERURE1vZGVscy5nZXQodXJpKTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyBFeHRlcm5hbERURE1vZGVsIGV4dE1vZGVsID0gbmV3IEV4dGVybmFsRFRETW9kZWwoKTsKLQkvLyBpZiAoZXh0TW9kZWwubG9hZE1vZGVsKHJlc291cmNlcywgdXJpKSkKLQkvLyB7Ci0JLy8gZXh0ZXJuYWxEVERNb2RlbHMucHV0KHVyaSwgZXh0TW9kZWwpOwotCS8vIHJldHVybiBleHRNb2RlbDsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGxvYWRJbmNsdWRlZERUREdlbihSZXNvdXJjZVNldCByZXNvdXJjZXMsIERURCBkdGQpIHsKLQkvLwotCS8vIEV4dGVybmFsRFRETW9kZWwgZXh0TW9kZWwgPSBnZXRFeHRlcm5hbERURE1vZGVsKHJlc291cmNlcywKLQkvLyBkdGQuZ2V0TmFtZSgpKTsKLQkvLyBpZiAoZXh0TW9kZWwgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gLy8gbm93IGZpbGwgb3VyIGhhc2ggdGFibGVzIGZvciBlbGVtZW50cyBhbmQgcGFyYW1ldGVyIGVudGl0aWVzCi0JLy8gLy8gc28gdGhhdCB3ZSBrbm93IHdoYXQgY2FuIGJlIHJlZmVyZW5jZWQgYnkgb3VyIG1haW4gZHRkCi0JLy8gRFRERmlsZSBmaWxlID0gZXh0TW9kZWwuZ2V0RXh0ZXJuYWxEVERGaWxlKCk7Ci0JLy8gQ29sbGVjdGlvbiBlbGVtZW50TGlzdCA9IGZpbGUubGlzdERUREVsZW1lbnQoKTsKLQkvLyBDb2xsZWN0aW9uIGVudGl0eUxpc3QgPSBmaWxlLmxpc3REVERFbnRpdHkoKTsKLQkvLwotCS8vCi0JLy8gSXRlcmF0b3IgaSA9IGVsZW1lbnRMaXN0Lml0ZXJhdG9yKCk7Ci0JLy8gd2hpbGUgKGkuaGFzTmV4dCgpKQotCS8vIHsKLQkvLyBEVERPYmplY3Qgb2JqZWN0ID0gKERURE9iamVjdCkgaS5uZXh0KCk7Ci0JLy8gZWxlbWVudFBvb2wucHV0KGdldEJhc2VOYW1lKG9iamVjdCksIG9iamVjdCk7Ci0JLy8gfQotCS8vICAgICAgCi0JLy8gaSA9IGVudGl0eUxpc3QuaXRlcmF0b3IoKTsKLQkvLyB3aGlsZSAoaS5oYXNOZXh0KCkpCi0JLy8gewotCS8vIERUREVudGl0eSBlbnRpdHkgPSAoRFRERW50aXR5KSBpLm5leHQoKTsKLQkvLyBpZiAoZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkpCi0JLy8gewotCS8vIHBlUG9vbC5wdXQoZ2V0QmFzZU5hbWUoZW50aXR5KSwgZW50aXR5KTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBDcmVhdGUgTU9GIG9iamVjdHMgZnJvbSBEVEQKLQkvLyAqCi0JLy8gKiAxKSB3aWxsIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBEVEQgTW9mIG9iamVjdCBmb3IgRW50aXR5RGVjbCwKLQkvLyBOb3RhdGlvbkRlY2wKLQkvLyAqIGFuZCBFbGVtZW50RGVjbCBkZWNsYXJhdGlvbnMgZHVyaW5nIHRoZSAxc3QgcGFzcwotCS8vICogMikgRHVyaW5nIHRoZSAybmQgcGFzcywgaXQgd2lsbCBhZGQgdGhlIGNvbnRlbnRNb2RlbCBhbmQgQXR0bGlzdCB0bwotCS8vIGFsbAotCS8vICogRWxlbWVudERlY2wuCi0JLy8gKgotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVEVERHZW4oUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBEVEQgZHRkLCBEVERGaWxlCi0JLy8gZEZpbGUpIHsKLQkvLwotCS8vIERURE1vZGVsQnVpbGRlciBtb2RlbEJ1aWxkZXIgPSBuZXcgRFRETW9kZWxCdWlsZGVyKHJlc291cmNlcywgdGhpcywKLQkvLyBkdGQsIGRGaWxlKTsKLQkvLwotCS8vCi0JLy8gbW9kZWxCdWlsZGVyLnZpc2l0RFREKGR0ZCk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgZW1wdHlFcnJvck1lc3NhZ2VzR2VuKCkgewotCS8vCi0JLy8gZXJyb3JNc2dzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgYWRkRXJyb3JNZXNzYWdlR2VuKEVycm9yTWVzc2FnZSBlcnJvcikgewotCS8vCi0JLy8gaW50IHZlY3RvclNpemUgPSBlcnJvck1zZ3Muc2l6ZSgpOwotCS8vIGJvb2xlYW4gYWRkID0gdHJ1ZTsKLQkvLwotCS8vCi0JLy8gaWYgKHZlY3RvclNpemUgIT0gMCkKLQkvLyB7Ci0JLy8gaW50IGluZGV4ID0gMDsKLQkvLwotCS8vCi0JLy8gd2hpbGUgKGFkZCA9PSB0cnVlICYmIGluZGV4IDwgdmVjdG9yU2l6ZSkKLQkvLyB7Ci0JLy8gaWYgKCgoRXJyb3JNZXNzYWdlKSBlcnJvck1zZ3MuZWxlbWVudEF0KGluZGV4KSkuZXF1YWxzKGVycm9yKSkKLQkvLyB7Ci0JLy8gYWRkID1mYWxzZTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyBpbmRleCsrOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBpZiAoYWRkKQotCS8vIHsKLQkvLyBlcnJvck1zZ3MuYWRkRWxlbWVudChlcnJvcik7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBWZWN0b3IgZ2V0RXJyb3JzR2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIGVycm9yTXNnczsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZURUREdlbigpIHsKLQkvLwotCS8vIFN0cmluZyB0ZW1wRFRERmlsZT1nZXRQYXRoKCkudG9PU1N0cmluZygpKyJ0ZW1wVmFsaWRhdGluZ0ZpbGVOYW1lLmR0ZCI7Ci0JLy8gdHJ5Ci0JLy8gewotCS8vIHNhdmVEVERGaWxlKHRlbXBEVERGaWxlKTsKLQkvLwotCS8vCi0JLy8gcGFyc2VyID0gbmV3IERURFBhcnNlcihmYWxzZSk7Ci0JLy8gaWYgKEZpbGVVdGlsaXR5LmZpbGVFeGlzdHModGVtcERUREZpbGUpKQotCS8vIHsKLQkvLyBwYXJzZXIucGFyc2UodGVtcERUREZpbGUpOwotCS8vIH0KLQkvLyBWZWN0b3IgZHRkTGlzdCA9IHBhcnNlci5nZXREVERMaXN0KCk7Ci0JLy8gaWYgKCBkdGRMaXN0LnNpemUoKSA+IDApCi0JLy8gewotCS8vIC8vIHJlc2V0IHRoZSBlcnJvcnMgYW5kIHVwZGF0ZSB3aGF0IHdlIGhhdmUgaW4gdGhlIGVsZW1lbnQgcG9vbAotCS8vIGVtcHR5RXJyb3JNZXNzYWdlcygpOwotCS8vIHVwZGF0ZUVsZW1lbnRIYXNodGFibGUoKTsKLQkvLwotCS8vCi0JLy8gLy8gVE9ETzogZG8gd2UganVzdCB2YWxpZGF0ZSB0aGUgY3VycmVudCBvbmU/Ci0JLy8gdmFsaWRhdGVXaXRoTW9kZWwoKERURClkdGRMaXN0LmVsZW1lbnRBdCgwKSk7Ci0JLy8gfQotCS8vIH0KLQkvLyBjYXRjaChJT0V4Y2VwdGlvbiBleCkKLQkvLyB7Ci0JLy8gZXgucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCS8vIEZpbGVVdGlsaXR5LmRlbGV0ZSh0ZW1wRFRERmlsZSk7Ci0JLy8gfQotCS8vIEZpbGVVdGlsaXR5LmRlbGV0ZSh0ZW1wRFRERmlsZSk7Ci0JLy8KLQkvLwotCS8vIHJldHVybiBkdGRGaWxlLmlzUGFyc2VFcnJvcigpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlV2l0aE1vZGVsR2VuKERURCBkdGQpIHsKLQkvLwotCS8vIEVudW1lcmF0aW9uIGVuID0gZHRkLmV4dGVybmFsRWxlbWVudHMoKTsKLQkvLyB3aGlsZSAoZW4uaGFzTW9yZUVsZW1lbnRzKCkpCi0JLy8gewotCS8vIE9iamVjdCBlID0gZW4ubmV4dEVsZW1lbnQoKTsKLQkvLwotCS8vCi0JLy8gaWYgKCBlIGluc3RhbmNlb2YgRW50aXR5RGVjbCApCi0JLy8gewotCS8vIEVudGl0eURlY2wgZW50aXR5ID0gKEVudGl0eURlY2wpIGU7Ci0JLy8gRXJyb3JNZXNzYWdlIGVyck1zZyA9IGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKTsKLQkvLyBpZiAoIGVyck1zZyE9IG51bGwpCi0JLy8gewotCS8vIGFkZEVycm9yTWVzc2FnZShlcnJNc2cpOwotCS8vIC8vIGR0ZEZpbGUuc2V0UGFyc2VFcnJvcih0cnVlKTsKLQkvLyB9Ci0JLy8gfQotCS8vIGVsc2UgaWYgKCBlIGluc3RhbmNlb2YgRWxlbWVudERlY2wgKQotCS8vIHsKLQkvLyBFbGVtZW50RGVjbCBlbGVtID0gKEVsZW1lbnREZWNsKSBlOwotCS8vIEVycm9yTWVzc2FnZSBlcnJNc2cgPSBlbGVtLmdldEVycm9yTWVzc2FnZSgpOwotCS8vIERUREVsZW1lbnQgZHRkZWxlbWVudCA9IChEVERFbGVtZW50KQotCS8vIGdldEVsZW1lbnRQb29sKCkuZ2V0KGVsZW0uZ2V0Tm9kZU5hbWUoKSk7Ci0JLy8KLQkvLwotCS8vIGlmICggZXJyTXNnIT0gbnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JLy8gfQotCS8vIGNoZWNrRm9yTWlzc2luZ0VsZW1lbnRSZWZlcmVuY2VzKGR0ZGVsZW1lbnQpOwotCS8vIH0KLQkvLyBlbHNlIGlmICggZSBpbnN0YW5jZW9mIE5vdGF0aW9uRGVjbCApCi0JLy8gewotCS8vIE5vdGF0aW9uRGVjbCBub3RhdGlvbiA9IChOb3RhdGlvbkRlY2wpIGU7Ci0JLy8gRXJyb3JNZXNzYWdlIGVyck1zZyA9IG5vdGF0aW9uLmdldEVycm9yTWVzc2FnZSgpOwotCS8vIGlmICggZXJyTXNnIT0gbnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JLy8gfQotCS8vIH0KLQkvLyBlbHNlIGlmICggZSBpbnN0YW5jZW9mIEF0dGxpc3QgKQotCS8vIHsKLQkvLyBBdHRsaXN0IGF0dExpc3QgPSAoQXR0bGlzdCkgZTsKLQkvLyBFcnJvck1lc3NhZ2UgZXJyTXNnID0gYXR0TGlzdC5nZXRFcnJvck1lc3NhZ2UoKTsKLQkvLyBpZiAoIGVyck1zZyE9IG51bGwpCi0JLy8gewotCS8vIGFkZEVycm9yTWVzc2FnZShlcnJNc2cpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBjaGVja0ZvckR1cGxpY2F0ZUlEQXR0cmlidXRlKCk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdXBkYXRlRWxlbWVudEhhc2h0YWJsZUdlbigpIHsKLQkvLwotCS8vIGVsZW1lbnRQb29sLmNsZWFyKCk7Ci0JLy8gQ3JlYXRlTGlzdEl0ZW1zIGl0ZW1zSGVscGVyID0gbmV3IENyZWF0ZUxpc3RJdGVtcyhkdGRGaWxlKTsKLQkvLwotCS8vCi0JLy8gVmVjdG9yIGFsbEVsZW1lbnRzID0gaXRlbXNIZWxwZXIuZ2V0RWxlbWVudHMoKTsKLQkvLyAvLyBnbyB0aHJvdWdoIGFsbCB0aGUgZHRkRmlsZXMgYW5kIGxpc3QgdGhlIGVsZW1lbnRzCi0JLy8gaW50IG51bUVsZW1lbnRzID0gYWxsRWxlbWVudHMuc2l6ZSgpOwotCS8vCi0JLy8KLQkvLyBmb3IgKGludCBpID0gMDsgaSA8IG51bUVsZW1lbnRzOyBpKyspCi0JLy8gewotCS8vIERUREVsZW1lbnQgZWxlbWVudCA9IChEVERFbGVtZW50KSBhbGxFbGVtZW50cy5lbGVtZW50QXQoaSk7Ci0JLy8gZWxlbWVudFBvb2wucHV0KGdldEJhc2VOYW1lKGVsZW1lbnQpLCBlbGVtZW50KTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdXBkYXRlRW50aXR5SGFzaHRhYmxlR2VuKCkgewotCS8vCi0JLy8gdXBkYXRlSGFzaFRhYmxlKHBlUG9vbCwgZHRkRmlsZS5saXN0RFRERW50aXR5KCkpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUhhc2hUYWJsZUdlbihIYXNodGFibGUgaCwgQ29sbGVjdGlvbiBkdGRPYmplY3RzKSB7Ci0JLy8KLQkvLyBoLmNsZWFyKCk7Ci0JLy8gSXRlcmF0b3IgaSA9IGR0ZE9iamVjdHMuaXRlcmF0b3IoKTsKLQkvLyB3aGlsZSAoaS5oYXNOZXh0KCkpCi0JLy8gewotCS8vIFN0cmluZyBuYW1lID0gIiI7Ci0JLy8gRFRET2JqZWN0IG8gPSAoRFRET2JqZWN0KSBpLm5leHQoKTsKLQkvLyBuYW1lID0gZ2V0QmFzZU5hbWUobyk7Ci0JLy8gaC5wdXQobmFtZSxvKTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0QmFzZU5hbWVHZW4oRFRET2JqZWN0IG9iaikgewotCS8vCi0JLy8gcmV0dXJuIGdldE5hbWUob2JqLCBudWxsKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXROYW1lR2VuKERURE9iamVjdCBvYmosIERUREZpbGUgZHRkRmlsZSkgewotCS8vCi0JLy8gU3RyaW5nIG5hbWUgPSAiIjsKLQkvLyBpZiAob2JqIGluc3RhbmNlb2YgRFRERW50aXR5KQotCS8vIHsKLQkvLyBEVERFbnRpdHkgZW50aXR5ID0gKERUREVudGl0eSkgb2JqOwotCS8vIGlmIChkdGRGaWxlICE9IG51bGwgJiYKLQkvLyAhZW50aXR5LmdldERUREZpbGUoKS5lcXVhbHMoZHRkRmlsZSkpCi0JLy8gewotCS8vIG5hbWUgPSBuZXcgUGF0aChlbnRpdHkuZ2V0RFRERmlsZSgpLmdldE5hbWUoKSkubGFzdFNlZ21lbnQoKSArICI6ICI7Ci0JLy8gfQotCS8vIG5hbWUgKz0gIiUiICsgKChEVERFbnRpdHkpb2JqKS5nZXROYW1lKCkgKyAiOyI7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERUREVsZW1lbnQpCi0JLy8gewotCS8vIERUREVsZW1lbnQgZWxlbWVudCA9IChEVERFbGVtZW50KSBvYmo7Ci0JLy8gaWYgKGR0ZEZpbGUgIT0gbnVsbCAmJgotCS8vICFlbGVtZW50LmdldERUREZpbGUoKS5lcXVhbHMoZHRkRmlsZSkpCi0JLy8gewotCS8vIG5hbWUgPSBuZXcgUGF0aChlbGVtZW50LmdldERUREZpbGUoKS5nZXROYW1lKCkpLmxhc3RTZWdtZW50KCkgKyAiOiAiOwotCS8vIH0KLQkvLyBuYW1lICs9ICgoRFRERWxlbWVudClvYmopLmdldE5hbWUoKTsKLQkvLyB9Ci0JLy8gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFRERWxlbWVudENvbnRlbnQpCi0JLy8gewotCS8vIHJldHVybiAoKERUREVsZW1lbnRDb250ZW50KSBvYmopLmdldENvbnRlbnROYW1lKCk7Ci0JLy8gfQotCS8vIHJldHVybiBuYW1lOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGNoZWNrRm9yTWlzc2luZ0VsZW1lbnRSZWZlcmVuY2VzR2VuKERUREVsZW1lbnQgZWxlbWVudCkKLQkvLyB7Ci0JLy8KLQkvLyBTdHJpbmcgZHRkU3RyaW5nID0gbnVsbDsKLQkvLyBpZiAoIGVsZW1lbnQgPT0gbnVsbCApCi0JLy8gcmV0dXJuOwotCS8vCi0JLy8KLQkvLyBWZWN0b3IgZWxlbWVudFJlZnMgPSBuZXcgVmVjdG9yKCk7Ci0JLy8gZmluZEVsZW1lbnRSZWZlcmVuY2VzKGVsZW1lbnQuZ2V0Q29udGVudCgpLGVsZW1lbnRSZWZzKTsKLQkvLwotCS8vCi0JLy8gRW51bWVyYXRpb24gZW4gPSBlbGVtZW50UmVmcy5lbGVtZW50cygpOwotCS8vIHdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkKLQkvLyB7Ci0JLy8gU3RyaW5nIGVsZW1lbnRSZWZOYW1lID0gIiI7Ci0JLy8gRFRET2JqZWN0IGR0ZE9iamVjdCA9IChEVERPYmplY3QpIGVuLm5leHRFbGVtZW50KCk7Ci0JLy8KLQkvLwotCS8vIGlmICggZHRkT2JqZWN0IGluc3RhbmNlb2YgRFRERWxlbWVudCkKLQkvLyB7Ci0JLy8gZWxlbWVudFJlZk5hbWUgPSAoKERUREVsZW1lbnQpZHRkT2JqZWN0KS5nZXROYW1lKCk7Ci0JLy8gaWYgKCBnZXRFbGVtZW50UG9vbCgpLmdldChlbGVtZW50UmVmTmFtZSkgPT0gbnVsbCkKLQkvLyB7Ci0JLy8gaWYgKGR0ZFN0cmluZyA9PSBudWxsKQotCS8vIHsKLQkvLyBkdGRTdHJpbmcgPSBnZXREVERTb3VyY2UoZmFsc2UpOwotCS8vIH0KLQkvLyBTdHJpbmcgZXJyb3JNc2cgPSAiRWxlbWVudCBcIiIgKyBlbGVtZW50LmdldE5hbWUoKSArICJcIiwgcmVmZXJzIHRvCi0JLy8gdW5kZWNsYXJlZCBlbGVtZW50ICIKLQkvLyArICJcIiIgKyBlbGVtZW50UmVmTmFtZSArICJcIiwgaW4gY29udGVudCBtb2RlbC5cbiI7Ci0JLy8gRXJyb3JNZXNzYWdlIGR0ZEVycm9yID0gbmV3IEVycm9yTWVzc2FnZSgpOwotCS8vIGR0ZEVycm9yLnNldEVycm9yTWVzc2FnZShlcnJvck1zZyk7Ci0JLy8gU291cmNlTG9jYXRpb25IZWxwZXIuTGluZUNvbHVtbiBsaW5lQ29sdW1uID0KLQkvLyBTb3VyY2VMb2NhdGlvbkhlbHBlci5vZmZzZXRUb0xpbmVDb2x1bW4oZHRkU3RyaW5nLAotCS8vIGVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JLy8gZHRkRXJyb3Iuc2V0RXJyb3JMaW5lKGxpbmVDb2x1bW4uZ2V0TGluZSgpKTsKLQkvLyBkdGRFcnJvci5zZXRFcnJvckNvbHVtbihsaW5lQ29sdW1uLmdldENvbHVtbigpKTsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZHRkRXJyb3IpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGZpbmRFbGVtZW50UmVmZXJlbmNlc0dlbihEVERFbGVtZW50Q29udGVudCBjb250ZW50LAotCS8vIFZlY3RvciByZXN1bHQpIHsKLQkvLwotCS8vCi0JLy8gaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkKLQkvLyB7Ci0JLy8gcmVzdWx0LmFkZEVsZW1lbnQoKChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCljb250ZW50KS5nZXRSZWZlcmVuY2VkRWxlbWVudCgpKTsKLQkvLyB9Ci0JLy8gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpCi0JLy8gewotCS8vIHJlc3VsdC5hZGRFbGVtZW50KCgoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCljb250ZW50KS5nZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpKTsKLQkvLyB9Ci0JLy8gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkKLQkvLyB7Ci0JLy8gRFRER3JvdXBDb250ZW50IGdyb3VwID0gKERUREdyb3VwQ29udGVudCljb250ZW50OwotCS8vIEVMaXN0IGNvbnRlbnRzID0gZ3JvdXAuZ2V0Q29udGVudCgpOwotCS8vIEl0ZXJhdG9yIGkgPSBjb250ZW50cy5pdGVyYXRvcigpOwotCS8vIHdoaWxlIChpLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gZmluZEVsZW1lbnRSZWZlcmVuY2VzKChEVERFbGVtZW50Q29udGVudCkgaS5uZXh0KCksIHJlc3VsdCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBjaGVja0ZvckR1cGxpY2F0ZUlEQXR0cmlidXRlR2VuKCkgewotCS8vCi0JLy8gU3RyaW5nIGR0ZFN0cmluZyA9IG51bGw7Ci0JLy8gQ29sbGVjdGlvbiBlbGVtZW50cyA9IGR0ZEZpbGUubGlzdERUREVsZW1lbnQoKTsKLQkvLyBJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsKLQkvLyB3aGlsZSAoaS5oYXNOZXh0KCkpCi0JLy8gewotCS8vIERUREVsZW1lbnQgZWxlbWVudCA9IChEVERFbGVtZW50KSBpLm5leHQoKTsKLQkvLyBJdGVyYXRvciBrID0gZWxlbWVudC5nZXREVERBdHRyaWJ1dGUoKS5pdGVyYXRvcigpOwotCS8vIGJvb2xlYW4gc2F3MXN0SUQgPSBmYWxzZTsKLQkvLyB3aGlsZSAoay5oYXNOZXh0KCkpCi0JLy8gewotCS8vIERUREF0dHJpYnV0ZSBhdHRyID0gKERUREF0dHJpYnV0ZSkgay5uZXh0KCk7Ci0JLy8gRFREVHlwZSBkVHlwZSA9IGF0dHIuZ2V0RFREVHlwZSgpOwotCS8vIGlmIChkVHlwZSBpbnN0YW5jZW9mIERUREJhc2ljVHlwZSkKLQkvLyB7Ci0JLy8gaWYgKCAoKERUREJhc2ljVHlwZSlkVHlwZSkuZ2V0S2luZCgpLmludFZhbHVlKCkgPT0gRFREQmFzaWNUeXBlS2luZC5JRCkKLQkvLyB7Ci0JLy8gaWYgKHNhdzFzdElEKQotCS8vIHsKLQkvLyBpZiAoZHRkU3RyaW5nID09IG51bGwpCi0JLy8gewotCS8vIGR0ZFN0cmluZyA9IGdldERURFNvdXJjZShmYWxzZSk7Ci0JLy8gfQotCS8vIFN0cmluZyBlcnJNc2cgPSBEVERQbHVnaW4uZ2V0RFREU3RyaW5nKCJfRVJST1JfRFVQX0lEX0FUVFJJQlVURV8xIik7Ci0JLy8gZXJyTXNnICs9IGF0dHIuZ2V0TmFtZSgpICsKLQkvLyBEVERQbHVnaW4uZ2V0RFREU3RyaW5nKCJfVUlfRVJST1JQQVJUX0RVUF9JRF9BVFRSSUJVVEVfMiIpOwotCS8vICAgICAgICAgICAgICAKLQkvLyBFcnJvck1lc3NhZ2UgZHRkRXJyb3IgPSBuZXcgRXJyb3JNZXNzYWdlKCk7Ci0JLy8gZHRkRXJyb3Iuc2V0RXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JLy8gU291cmNlTG9jYXRpb25IZWxwZXIuTGluZUNvbHVtbiBsaW5lQ29sdW1uID0KLQkvLyBTb3VyY2VMb2NhdGlvbkhlbHBlci5vZmZzZXRUb0xpbmVDb2x1bW4oZHRkU3RyaW5nLAotCS8vIGF0dHIuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JLy8gZHRkRXJyb3Iuc2V0RXJyb3JMaW5lKGxpbmVDb2x1bW4uZ2V0TGluZSgpKTsKLQkvLyBkdGRFcnJvci5zZXRFcnJvckNvbHVtbihsaW5lQ29sdW1uLmdldENvbHVtbigpKTsKLQkvLyBkdGRFcnJvci5zZXRPYmplY3QoYXR0cik7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGR0ZEVycm9yKTsKLQkvLyAvLyBkdGRGaWxlLnNldFBhcnNlRXJyb3IodHJ1ZSk7Ci0JLy8gYnJlYWs7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gc2F3MXN0SUQgPSB0cnVlOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0R3JvdXBUeXBlR2VuKGludCBncm91cEtpbmQsIGludCBvY2N1cnJlbmNlKQotCS8vIHsKLQkvLwotCS8vIFN0cmluZyB0eXBlID0gbnVsbDsKLQkvLwotCS8vCi0JLy8gc3dpdGNoIChncm91cEtpbmQpCi0JLy8gewotCS8vIGNhc2UgRFRER3JvdXBLaW5kLlNFUVVFTkNFOgotCS8vIHR5cGUgPSAiRFREU2VxdWVuY2UiOwotCS8vIGJyZWFrOwotCS8vIGNhc2UgRFRER3JvdXBLaW5kLkNIT0lDRToKLQkvLyB0eXBlID0gIkRURENob2ljZSI7Ci0JLy8gYnJlYWs7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyB0eXBlICs9IGdldFJlcGVhdGFibGVUeXBlU3VmZml4KG9jY3VycmVuY2UpOwotCS8vIHJldHVybiB0eXBlOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFJlZmVyZW5jZVR5cGVHZW4oaW50IG9jY3VycmVuY2UpIHsKLQkvLwotCS8vIFN0cmluZyB0eXBlID0gIkRURFJlZmVyZW5jZSI7Ci0JLy8gdHlwZSArPSBnZXRSZXBlYXRhYmxlVHlwZVN1ZmZpeChvY2N1cnJlbmNlKTsKLQkvLyByZXR1cm4gdHlwZTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRSZXBlYXRhYmxlVHlwZVN1ZmZpeEdlbihpbnQgb2NjdXJyZW5jZSkgewotCS8vCi0JLy8gcmV0dXJuICIoIiArIChjaGFyKW9jY3VycmVuY2UgKyAiKSI7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyB2b2lkIG1haW5HZW4oU3RyaW5nW10gYXJncykgewotCS8vCi0JLy8gU3lzdGVtLm91dC5wcmludGxuKCJcblN0YXJ0aW5nIC4uLiIpOwotCS8vCi0JLy8KLQkvLyBpZiAoYXJncy5sZW5ndGggIT0gMSkKLQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInVzYWdlOiBEdGRVdGlsIGlucHV0ZmlsZS5kdGQiKTsKLQkvLwotCS8vCi0JLy8gamF2YS5pby5GaWxlIGlucHV0RmlsZSA9IG5ldyBGaWxlKGFyZ3NbMF0pOwotCS8vCi0JLy8KLQkvLyBTdHJpbmcgZHRkRmlsZU5hbWUgPSAiIjsKLQkvLyB0cnkKLQkvLyB7Ci0JLy8gZHRkRmlsZU5hbWUgPSBpbnB1dEZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCS8vIH0KLQkvLyBjYXRjaChJT0V4Y2VwdGlvbiBleCkKLQkvLyB7fQotCS8vCi0JLy8KLQkvLyBTdHJpbmcgZHRkTW9kZWxOYW1lID0gZHRkRmlsZU5hbWU7Ci0JLy8KLQkvLwotCS8vIGlmIChEVERDb25zdGFudHMuRFREX0VYVEVOU0lPTi5lcXVhbHMobmV3Ci0JLy8gUGF0aChkdGRGaWxlTmFtZSkuZ2V0RmlsZUV4dGVuc2lvbigpKSkKLQkvLyB7Ci0JLy8gZHRkTW9kZWxOYW1lPSBuZXcKLQkvLyBQYXRoKGR0ZEZpbGVOYW1lKS5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKTsKLQkvLyB9Ci0JLy8gRFREVXRpbCBkMm0gPSBuZXcgRFREVXRpbCgpOwotCS8vIC8vIFRPRE86IGZpeCBwb3J0Ci0JLy8gLy8gZDJtLnBhcnNlKGR0ZEZpbGVOYW1lKTsKLQkvLyB0cnkKLQkvLyB7Ci0JLy8gZDJtLnNhdmVBcyhkdGRNb2RlbE5hbWUgKyAiLiIgKyBEVERDb25zdGFudHMuRFREX1hNSV9FWFRFTlNJT04pOwotCS8vIH0KLQkvLyBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JLy8gewotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHRocm93biBkdXJpbmcgbW9kZWwgc2F2ZTogIiArIGUpOwotCS8vIH0KLQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUuIik7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCBnZXRQYXRoR2VuKCkgewotCS8vCi0JLy8gUGF0aCBjdXJyZW50RFREUGF0aCA9IG5ldyBQYXRoKGR0ZE1vZGVsRmlsZSk7Ci0JLy8gaWYgKGN1cnJlbnREVERQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkKLQkvLyB7Ci0JLy8gcmV0dXJuIGN1cnJlbnREVERQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCS8vIH0KLQkvLyAgICAKLQkvLyByZXR1cm4gbmV3IFBhdGgoIiIpOwotCS8vIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTU2NTdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50OwotCi0KLQotcHVibGljIGNsYXNzIERURFZpc2l0b3IgewotCi0JcHVibGljIERURFZpc2l0b3IoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERGaWxlKERUREZpbGUgZmlsZSkgewotCQlDb2xsZWN0aW9uIG5vdGF0aW9ucyA9IGZpbGUubGlzdERURE5vdGF0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG5vdGF0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCXZpc2l0RFRETm90YXRpb24oKERURE5vdGF0aW9uKSBpLm5leHQoKSk7Ci0JCX0KLQotCQlDb2xsZWN0aW9uIGVudGl0aWVzID0gZmlsZS5saXN0RFRERW50aXR5KCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGVudGl0aWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJdmlzaXREVERFbnRpdHkoKERUREVudGl0eSkgaS5uZXh0KCkpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbiBvYmplY3RzID0gZmlsZS5saXN0RFRERWxlbWVudEFuZERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBvYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJRFRET2JqZWN0IG9iamVjdCA9IChEVERPYmplY3QpIGkubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERUREVsZW1lbnQpIHsKLQkJCQl2aXNpdERUREVsZW1lbnQoKERUREVsZW1lbnQpIG9iamVjdCk7Ci0JCQl9IC8vIGVuZCBvZiBpZiAoKQotCQkJZWxzZSB7Ci0JCQkJdmlzaXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgb2JqZWN0KTsKLQkJCX0gLy8gZW5kIG9mIGlmICgpCi0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRETm90YXRpb24oRFRETm90YXRpb24gbm90YXRpb24pIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVudGl0eShEVERFbnRpdHkgZW50aXR5KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50KERUREVsZW1lbnQgZWxlbWVudCkgewotCQl2aXNpdERUREVsZW1lbnRDb250ZW50KGVsZW1lbnQuZ2V0Q29udGVudCgpKTsKLQkJdmlzaXREVERBdHRyaWJ1dGVMaXN0KGVsZW1lbnQuZ2V0RFREQXR0cmlidXRlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5KSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnRDb250ZW50KERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ2aXNpdERUREVsZW1lbnRDb250ZW50IDogIiArIGNvbnRlbnQpOwotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVtcHR5Q29udGVudCkgewotCQkJdmlzaXREVERFbXB0eUNvbnRlbnQoKERUREVtcHR5Q29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREFueUNvbnRlbnQpIHsKLQkJCXZpc2l0RFREQW55Q29udGVudCgoRFREQW55Q29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFBDRGF0YUNvbnRlbnQpIHsKLQkJCXZpc2l0RFREUENEYXRhQ29udGVudCgoRFREUENEYXRhQ29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERSZXBlYXRhYmxlQ29udGVudCkgewotCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpIHsKLQkJCQl2aXNpdERUREdyb3VwQ29udGVudCgoRFRER3JvdXBDb250ZW50KSBjb250ZW50KTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJCXZpc2l0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZpc2l0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgY29udGVudCk7Ci0JCQl9IC8vIGVuZCBvZiBlbHNlCi0KLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigib2NjdXJyZW5jZTogIiArCi0JCQkvLyAoY2hhcikoKERURFJlcGVhdGFibGVDb250ZW50KWNvbnRlbnQpLmdldE9jY3VycmVuY2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVtcHR5Q29udGVudChEVERFbXB0eUNvbnRlbnQgZHRkRW1wdHlDb250ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogRU1QVFkiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREFueUNvbnRlbnQoRFREQW55Q29udGVudCBkdGRBbnlDb250ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogQU5ZIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERQQ0RhdGFDb250ZW50KERURFBDRGF0YUNvbnRlbnQgcGNEYXRhQ29udGVudCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IFBDREFUQSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRER3JvdXBDb250ZW50KERUREdyb3VwQ29udGVudCBncm91cENvbnRlbnQpIHsKLQkJaWYgKGdyb3VwQ29udGVudC5nZXRHcm91cEtpbmQoKS5nZXRWYWx1ZSgpID09IERUREdyb3VwS2luZC5TRVFVRU5DRSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBTZXF1ZW5jZSIpOwotCQl9Ci0JCWVsc2UgLy8gaWYgKGNvbnRlbnRnZXRHcm91cEtpbmQoKSA9PSBEVERHcm91cEtpbmQuQ0hPSUNFKQotCQl7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IENob2ljZSIpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbiBncm91cENvbnRlbnRzID0gZ3JvdXBDb250ZW50LmdldENvbnRlbnQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZ3JvdXBDb250ZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCXZpc2l0RFRERWxlbWVudENvbnRlbnQoKERUREVsZW1lbnRDb250ZW50KSBpLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgZW50aXR5UmVmZXJlbmNlQ29udGVudCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREQXR0cmlidXRlTGlzdChMaXN0IGF0dHJzKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBhdHRycy5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJdmlzaXREVERBdHRyaWJ1dGUoKERUREF0dHJpYnV0ZSkgaXRlci5uZXh0KCkpOwotCQl9IC8vIGVuZCBvZiB3aGlsZSAoKQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREQXR0cmlidXRlKERUREF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERGaWxlR2VuKERUREZpbGUgZmlsZSkgewotCi0JCUNvbGxlY3Rpb24gbm90YXRpb25zID0gZmlsZS5saXN0RFRETm90YXRpb24oKTsKLQkJZm9yIChJdGVyYXRvciBpID0gbm90YXRpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJdmlzaXREVEROb3RhdGlvbigoRFRETm90YXRpb24pIGkubmV4dCgpKTsKLQkJfQotCi0JCUNvbGxlY3Rpb24gZW50aXRpZXMgPSBmaWxlLmxpc3REVERFbnRpdHkoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZW50aXRpZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQl2aXNpdERUREVudGl0eSgoRFRERW50aXR5KSBpLm5leHQoKSk7Ci0JCX0KLQotCQlDb2xsZWN0aW9uIG9iamVjdHMgPSBmaWxlLmxpc3REVERFbGVtZW50QW5kRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG9iamVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERPYmplY3Qgb2JqZWN0ID0gKERURE9iamVjdCkgaS5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRFRERWxlbWVudCkgewotCQkJCXZpc2l0RFRERWxlbWVudCgoRFRERWxlbWVudCkgb2JqZWN0KTsKLQkJCX0gLy8gZW5kIG9mIGlmICgpCi0JCQllbHNlIHsKLQkJCQl2aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBvYmplY3QpOwotCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERURE5vdGF0aW9uR2VuKERURE5vdGF0aW9uIG5vdGF0aW9uKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbnRpdHlHZW4oRFRERW50aXR5IGVudGl0eSkgewotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERWxlbWVudEdlbihEVERFbGVtZW50IGVsZW1lbnQpIHsKLQotCQl2aXNpdERUREVsZW1lbnRDb250ZW50KGVsZW1lbnQuZ2V0Q29udGVudCgpKTsKLQkJdmlzaXREVERBdHRyaWJ1dGVMaXN0KGVsZW1lbnQuZ2V0RFREQXR0cmlidXRlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUdlbihEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eSkgewotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERWxlbWVudENvbnRlbnRHZW4oRFRERWxlbWVudENvbnRlbnQgY29udGVudCkgewotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidmlzaXREVERFbGVtZW50Q29udGVudCA6ICIgKyBjb250ZW50KTsKLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbXB0eUNvbnRlbnQpIHsKLQkJCXZpc2l0RFRERW1wdHlDb250ZW50KChEVERFbXB0eUNvbnRlbnQpIGNvbnRlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERBbnlDb250ZW50KSB7Ci0JCQl2aXNpdERUREFueUNvbnRlbnQoKERUREFueUNvbnRlbnQpIGNvbnRlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERQQ0RhdGFDb250ZW50KSB7Ci0JCQl2aXNpdERURFBDRGF0YUNvbnRlbnQoKERURFBDRGF0YUNvbnRlbnQpIGNvbnRlbnQpOwotCQl9Ci0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUmVwZWF0YWJsZUNvbnRlbnQpIHsKLQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFRER3JvdXBDb250ZW50KSB7Ci0JCQkJdmlzaXREVERHcm91cENvbnRlbnQoKERUREdyb3VwQ29udGVudCkgY29udGVudCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCQl2aXNpdERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgY29udGVudCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2aXNpdERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIGNvbnRlbnQpOwotCQkJfSAvLyBlbmQgb2YgZWxzZQotCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm9jY3VycmVuY2U6ICIgKwotCQkJLy8gKGNoYXIpKChEVERSZXBlYXRhYmxlQ29udGVudCljb250ZW50KS5nZXRPY2N1cnJlbmNlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERW1wdHlDb250ZW50R2VuKERUREVtcHR5Q29udGVudCBkdGRFbXB0eUNvbnRlbnQpIHsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IEVNUFRZIik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFREQW55Q29udGVudEdlbihEVERBbnlDb250ZW50IGR0ZEFueUNvbnRlbnQpIHsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IEFOWSIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERURFBDRGF0YUNvbnRlbnRHZW4oRFREUENEYXRhQ29udGVudCBwY0RhdGFDb250ZW50KSB7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBQQ0RBVEEiKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERHcm91cENvbnRlbnRHZW4oRFRER3JvdXBDb250ZW50IGdyb3VwQ29udGVudCkgewotCi0JCWlmIChncm91cENvbnRlbnQuZ2V0R3JvdXBLaW5kKCkuZ2V0VmFsdWUoKSA9PSBEVERHcm91cEtpbmQuU0VRVUVOQ0UpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogU2VxdWVuY2UiKTsKLQkJfQotCQllbHNlIC8vIGlmIChjb250ZW50Z2V0R3JvdXBLaW5kKCkgPT0gRFRER3JvdXBLaW5kLkNIT0lDRSkKLQkJewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBDaG9pY2UiKTsKLQkJfQotCi0JCUNvbGxlY3Rpb24gZ3JvdXBDb250ZW50cyA9IGdyb3VwQ29udGVudC5nZXRDb250ZW50KCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGdyb3VwQ29udGVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQl2aXNpdERUREVsZW1lbnRDb250ZW50KChEVERFbGVtZW50Q29udGVudCkgaS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRHZW4oRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgZWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRHZW4oRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBlbnRpdHlSZWZlcmVuY2VDb250ZW50KSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERBdHRyaWJ1dGVMaXN0R2VuKExpc3QgYXR0cnMpIHsKLQotCQlJdGVyYXRvciBpdGVyID0gYXR0cnMuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCXZpc2l0RFREQXR0cmlidXRlKChEVERBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpKTsKLQkJfSAvLyBlbmQgb2Ygd2hpbGUgKCkKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERBdHRyaWJ1dGVHZW4oRFREQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0V4dGVybmFsRFRETW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9FeHRlcm5hbERURE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDUzNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0V4dGVybmFsRFRETW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLQotCi0vKioKLSAqIExvYWQgYW5vdGhlciBEVEQgbW9kZWwgLSB1c2Ugd2hlbiB0aGVyZSBpcyBleHRlcm5hbCBlbnRpdHkgcmVmZXJlbmNlcyBmcm9tCi0gKiBhbm90aGVyIG1vZGVsCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbERURE1vZGVsIHsKLQlEVERGaWxlIGR0ZEZpbGUgPSBudWxsOwotCi0JcHVibGljIEV4dGVybmFsRFRETW9kZWwoKSB7Ci0JfQotCi0JcHVibGljIERUREZpbGUgZ2V0RXh0ZXJuYWxEVERGaWxlKCkgewotCQlyZXR1cm4gZHRkRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBEVEQgbW9kZWwgc3BlY2lmaWVkIGJ5IHRoZSB1cmkgZS5nLgotCSAqIGZpbGU6QzovZWNsaXBzZS9leGFtcGxlcy9wdXJjaGFzZW9yZGVyLmR0ZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGxvYWRNb2RlbChSZXNvdXJjZVNldCByZXNvdXJjZXMsIFN0cmluZyB1cmkpIHsKLQkJYm9vbGVhbiByYyA9IHRydWU7Ci0KLQkJaWYgKHVyaSA9PSBudWxsIHx8IHVyaS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQkvLyB0b2RvLi4uIEludmVzdGlnYXRlIHdoeSB3ZSBjYW4gbm90IGNyZWF0ZSBhIG5ldyBEVERVdGlsIHRvIGxvYWQKLQkJCS8vIHRoZSBleHRlcm5hbAotCQkJLy8gd2l0aG91dCBicmVha2luZyB0aGUgYnZ0IHRlc3QgYnVja2V0IG9uIHRoZSBvYWdpcyBjYXNlcy4KLQkJCS8vIEFyZSBkZXBlbmRpbmcgb24gbW9mJ3MgYnVpbHQgaW4gY2FjaGluZyB2aWEKLQkJCS8vIHJlc291cmNlcy5sb2FkKHVyaSk/Ci0JCQkvLwotCQkJVVJJIHVyaU9iaiA9IFVSSS5jcmVhdGVVUkkodXJpKTsKLQkJCVJlc291cmNlIHIgPSByZXNvdXJjZXMuY3JlYXRlUmVzb3VyY2UodXJpT2JqKTsKLQkJCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCXIubG9hZChvcHRpb25zKTsKLQotCQkJZm9yIChJdGVyYXRvciBpID0gcmVzb3VyY2VzLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCURUREZpbGUgY3VycmVudEZpbGUgPSAoRFRERmlsZSkgKChSZXNvdXJjZSkgaS5uZXh0KCkpLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJCVN0cmluZyBjdXJyZW50VVJJID0gY3VycmVudEZpbGUuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQkJCQkvLyBub3RlIDogbW9mIHN0b3JlcyBhIHNsaWdodGx5IGRpZmZlcmVudCB1cmkgdGhhbiB0aGUgb25lIHdlCi0JCQkJLy8gcGFzc2VkIGluIHRvIHJlc291cmNlcy5sb2FkKHVyaSkKLQkJCQkvLyBJbiB0aGUgJ2ZpbGU6JyBwcm90b2NvbCBjYXNlLCB0aGUgY2FsbAotCQkJCS8vIHJlc291cmNlLmxvYWQoImZpbGU6RDpceC5kdGQiKSB3aWxsIHN0b3JlIGEgcmVzb3VyY2Ugd2l0aAotCQkJCS8vIHVyaSAiRDpceC5kdGQiLgotCQkJCS8vIFRoaXMgaXMgd2h5IHdlIHVzZSAnZW5kc3dpdGgoKScgaW5zdGVhZCBvZiAnZXF1YWxzKCknIHRvCi0JCQkJLy8gY29tcGFyZS4KLQkJCQlpZiAodXJpLmVuZHNXaXRoKGN1cnJlbnRVUkkpKSB7Ci0JCQkJCWR0ZEZpbGUgPSBjdXJyZW50RmlsZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGR0ZEZpbGUgPT0gbnVsbCkgewotCQkJCXJjID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJcmMgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvcm9zZS9EVEQuY2F0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvcm9zZS9EVEQuY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDk3Mjc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL3Jvc2UvRFRELmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDM4MTIgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk0NQ0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA3LjUuMDEwMy4xOTIwIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImR0ZCINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJJREwiDQotCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZDU3MzAtODUwYi0xMWUxLTAwMDAtMDA1Y2Y0NjkxYzRjOjEiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJkdGQiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS53c3QuZHRkIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkicHJlZml4Ig0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRURCIpKSkNCi0gICAgcXVpZCAgICAgICAJIjM4NTdCMUMwMDI5MyINCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzcyAiRFRERWxlbWVudENvbnRlbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVkNTczMC04NTBiLTExZTEtMDAwMS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0NCRUFDRjAyMTMiDQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQ0KLQkob2JqZWN0IENsYXNzICJEVERHcm91cENvbnRlbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwMC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0NCRUFFRjAyMzIiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwMS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFEOTIwMzYzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREUmVwZWF0YWJsZUNvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBRDRDMDFEMSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImdyb3VwS2luZCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZDOUVDMDE4OSINCi0JCSAgICB0eXBlICAgICAgIAkiRFRER3JvdXBLaW5kIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGQ0E1NTAyMTYiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFREQXR0cmlidXRlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdDQzE4NzkwMEVBIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QjdGMTU5MDFEQSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RUF0dHJpYnV0ZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkyMzg0NzIwMzlEIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29tbWVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MzlEQzlBMDEzQiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVmYXVsdEtpbmQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDA2LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0UxNDRCRjAyNjEiDQotCQkgICAgdHlwZSAgICAgICAJIkRURERlZmF1bHRLaW5kIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0UxNDREQzAzQUQiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZWZhdWx0VmFsdWVTdHJpbmciDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDA3LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOTZCOUJCRjAwNkIiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERPY2N1cnJlbmNlVHlwZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDA4LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3Q0MxOUFGMDA3RCINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxPTkU9NDkgDQotfE9QVElPTkFMPTYzIE9ORV9PUl9NT1JFPTQzIFpFUk9fT1JfTU9SRT00Mg0KLQkgICAgDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iKQ0KLQkob2JqZWN0IENsYXNzICJEVERFbGVtZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDktMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdEOUFBRjcwMDcxIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMGEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QjdGMEFGMDJBOCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RUNsYXNzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDVCRjAwMEEiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTJCODMwMjlCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCNUUwMkRFIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29tbWVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMGItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MzlEQzgxMDA2MiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREVtcHR5Q29udGVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDBjLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RDlBQjQ3MDM3QSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDBkLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QUJGMzAzMjciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Q29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVBQ0YwMjEzIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERBbnlDb250ZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMGUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdEOUFCNTAwMzA0Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMGYtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBQkVFMDIwNyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnRDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUFDRjAyMTMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRURFBDRGF0YUNvbnRlbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxMC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0Q5QUI1QzAxMzUiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxMS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFCRTkwMjc4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQUNGMDIxMyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxMi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0Q5QUI3RDAwMTAiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxMy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFEOEMwM0FBIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREUmVwZWF0YWJsZUNvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBRDRDMDFEMSIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFREUmVwZWF0YWJsZUNvbnRlbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxNC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0Q5QUQ0QzAxRDEiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxNS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFEQjcwM0MwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQUNGMDIxMyIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9jY3VycmVuY2UiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDE2LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0NDMThBOTAxNDgiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkpVU1RfT05FPSAtMSAgT05FX09SX01PUkU9NDMgT1BUSU9OQUw9NjMgWkVST19PUl9NT1JFPTQyIg0KLQkJICAgIHR5cGUgICAgICAgCSJEVERPY2N1cnJlbmNlVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQzE5QUYwMDdEIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGFic3RyYWN0ICAgCVRSVUUpDQotCShvYmplY3QgQ2xhc3MgIkRUREZpbGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxNy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0Q5QjA4RTAxOEYiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxOC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCN0YwN0YwMTE4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjplTmFtZWRFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDRFRTAwMTQiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb21tZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxOS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzgzOURCRUYwMTJCIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJzZUVycm9yIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxYS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzg4Qzk5NUYwMjVCIg0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRURERlZmF1bHRLaW5kIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDAtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFMTQ0REMwM0FEIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIklNUExJRUQ9MSBSRVFVSVJFRD0yIEZJWEVEPTMgTk9GSVhFRD00Ig0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIikNCi0JKG9iamVjdCBDbGFzcyAiRFREQmFzaWNUeXBlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFMTQ2NEYwMERBIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QjdGMjgwMDMxNSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RUNsYXNzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDVCRjAwMEEiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJraW5kIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwMy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFMTQ2OEEwMDE2Ig0KLQkJICAgIHR5cGUgICAgICAgCSJEVERCYXNpY1R5cGVLaW5kIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0UxNDkwNTAyMkMiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFRERW51bWVyYXRpb25UeXBlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFMTQ2NjgwMzA2Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QjdGMjgxMDMwMiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RUVudW0iDQotCQkgICAgcXVpZHUgICAgICAJIjM5QTQ3M0U5MDFENCIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtpbmQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDA2LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0UxNDZBQzAzQjgiDQotCQkgICAgdHlwZSAgICAgICAJIkRUREVudW1Hcm91cEtpbmQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RTE0OUIyMDFBRCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERCYXNpY1R5cGVLaW5kIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDctMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFMTQ5MDUwMjJDIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIk5PTkU9MCBDREFUQT0xIElEPTIgSURSRUY9MyBJRFJFRlM9NCBFTlRJVFk9NSBFTlRJVElFUz02IE5NVE9LRU49NyBOTVRPS0VOUz04Ig0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIikNCi0JKG9iamVjdCBDbGFzcyAiRFRERW51bUdyb3VwS2luZCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDA4LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RTE0OUIyMDFBRCINCi0JICAgIGRvY3VtZW50YXRpb24gCSJOQU1FX1RPS0VOX0dST1VQPTEgTk9UQVRJT05fR1JPVVA9MiINCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIpDQotCShvYmplY3QgQ2xhc3MgIkRUREdyb3VwS2luZCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDA5LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RUZDQTU1MDIxNiINCi0JICAgIGRvY3VtZW50YXRpb24gCSJTRVFVRU5DRT0xIENIT0lDRT0yIg0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIikNCi0JKG9iamVjdCBDbGFzcyAiRFRETm90YXRpb24iDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwYS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0VGRDBFRjAwQzkiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwYi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCN0YwRTMwMjM0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjplTmFtZWRFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDRFRTAwMTQiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTJCODUwMTE4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCNUUwMkRFIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29tbWVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMGMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MzlEQzBBMDI0QyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3lzdGVtSUQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDBkLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDEwMjAzOTciDQotCQkgICAgdHlwZSAgICAgICAJInN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInB1YmxpY0lEIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwZS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQxMEUwMThDIg0KLQkJICAgIHR5cGUgICAgICAgCSJzdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFRERW50aXR5Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMGYtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFRkQxMkIwM0M4Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMTAtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QjdGMEU3MDFFQSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6ZU5hbWVkRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q0RUUwMDE0IikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUyQjg2MDMwNCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjVFMDJERSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbW1lbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDExLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODM5REMzNzAwOEUiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcmFtZXRlckVudGl0eSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMTItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMTNDMDE3RSINCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERFbnRpdHlDb250ZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMTMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFRkQxOUQwMDgzIg0KLQkgICAgYWJzdHJhY3QgICAJVFJVRSkNCi0JKG9iamVjdCBDbGFzcyAiRFRERXh0ZXJuYWxFbnRpdHkiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAxNC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0VGRDFGODAzRTEiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAxNS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQzMjQwMEYzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5Q29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxOUQwMDgzIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3lzdGVtSUQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDAwLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDJFNTAxNjEiDQotCQkgICAgdHlwZSAgICAgICAJInN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInB1YmxpY0lEIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwMS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQyRUMwMUY3Ig0KLQkJICAgIHR5cGUgICAgICAgCSJzdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFRESW50ZXJuYWxFbnRpdHkiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwMi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0VGRDJCQTAyNkUiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwMy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQzMkIwMzJFIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5Q29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxOUQwMDgzIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDA0LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDJDQjAyNjgiDQotCQkgICAgdHlwZSAgICAgICAJInN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwNS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzODUyODdDQTAxNjMiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwNi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCN0YwRDEwMDc2Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjplTmFtZWRFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDRFRTAwMTQiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTJCOEEwMjg3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCNUUwMkRFIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDctMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzg1MjkwMEUwMTI3Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDgtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4NTI5MDQ0MDExQiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURFJlcGVhdGFibGVDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUQ0QzAxRDEiKSkpDQotCShvYmplY3QgQ2xhc3MgIlhNTFNjaGVtYURlZmluZWRUeXBlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDktMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzg5RjBDNkQwMTBFIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfE5PTkU9LTENCi18U1RSSU5HPTENCi18Qk9PTEVBTj0yDQotfEZMT0FUPTMNCi18RE9VQkxFPTQNCi18REVDSU1BTD01DQotfFRJTUVJTlNUQU5UPTYNCi18VElNRURVUkFUSU9OPTcNCi18UkVDVVJSSU5HSU5TVEFOVD04DQotfEJJTkFSWT05DQotfFVSST0xMA0KLXxJTlRFR0VSPTExDQotfERBVEU9MTINCi18VElNRT0xMw0KLQkgICAgDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iKQ0KLQkob2JqZWN0IENsYXNzICJEVERDb250ZW50Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5RkUyQjVFMDJERSINCi0JICAgIGFic3RyYWN0ICAgCVRSVUUpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwYS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0NCRUI2RjAwNUQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiY29udGVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMGItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3Q0JFQjcwMDA2RCINCi0JCSAgICBsYWJlbCAgICAgIAkiY29udGVudCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnRDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUFDRjAyMTMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZ3JvdXAiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDBjLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0NCRUI3MDAwQUIiDQotCQkgICAgbGFiZWwgICAgICAJImdyb3VwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRER3JvdXBDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUFFRjAyMzIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMGQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdEOUFDMEUwMENEIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVsZW1lbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDBlLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QUMwRjAzOUYiDQotCQkgICAgbGFiZWwgICAgICAJImVsZW1lbnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUFGNzAwNzEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiY29udGVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMGYtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBQzBGMDNBOSINCi0JCSAgICBsYWJlbCAgICAgIAkiY29udGVudCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnRDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUFDRjAyMTMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxMC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0Q5QUYxMTAwMUEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZWxlbWVudFJlZmVyZW5jZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBRjFCMDIwOSINCi0JCSAgICBsYWJlbCAgICAgIAkiZWxlbWVudFJlZmVyZW5jZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUI3RDAwMTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKSkNCi0JCShvYmplY3QgUm9sZSAicmVmZXJlbmNlZEVsZW1lbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDEyLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QUYxQjAyMEEiDQotCQkgICAgbGFiZWwgICAgICAJInJlZmVyZW5jZWRFbGVtZW50Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFBRjcwMDcxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMyINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDEzLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RUZEMUM5MDJERiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxNC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQxQ0EwMzFEIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDEyQjAzQzgiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJjb250ZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxNS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQxQ0EwMzI3Ig0KLQkJICAgIGxhYmVsICAgICAgCSJjb250ZW50Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5Q29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxOUQwMDgzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTYtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFRkQzNDQwMEU1Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIm5vdGF0aW9uIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxNy0wMDVjZjQ2OTFjNGM6MSIpKQ0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJlQ29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQzNDUwMjA5Ig0KLQkJICAgIGxhYmVsICAgICAgCSJub3RhdGlvbiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURE5vdGF0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDBFRjAwQzkiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZW50aXR5Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxOC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQzNDUwMjEzIg0KLQkJICAgIGxhYmVsICAgICAgCSJlbnRpdHkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFeHRlcm5hbEVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxRjgwM0UxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNiINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDE5LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4NTI4OTc5MDA1RiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJwYXJtRW50aXR5UmVmIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxYS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzg1Mjg5N0MwMzUyIg0KLQkJICAgIGxhYmVsICAgICAgCSJwYXJtRW50aXR5UmVmIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzODUyODdDQTAxNjMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZW50aXR5Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxYi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzg1Mjg5N0MwMzUzIg0KLQkJICAgIGxhYmVsICAgICAgCSJlbnRpdHkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTJCMDNDOCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDciDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxYy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzODUyOTRFQjAyNDMiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZW50aXR5UmVmZXJlbmNlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxZC0wMDVjZjQ2OTFjNGM6MSIpKQ0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJlQ29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzg1Mjk0RUYwM0JCIg0KLQkJICAgIGxhYmVsICAgICAgCSJlbnRpdHlSZWZlcmVuY2UiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzODUyOTAwRTAxMjciDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDFlLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODUyOTRFRjAzQkMiDQotCQkgICAgbGFiZWwgICAgICAJImVsZW1lbnRSZWZlcmVuY2VkRW50aXR5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDEyQjAzQzgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMWYtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzg1Mjk3MkQwMkNCIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDIwLTAwNWNmNDY5MWM0YzoxIikpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODUyOTczNjAyOTEiDQotCQkgICAgbGFiZWwgICAgICAJImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERBdHRyaWJ1dGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0MxODc5MDBFQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMjEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4NTI5NzM2MDI5QiINCi0JCSAgICBsYWJlbCAgICAgIAkiYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTJCMDNDOCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAyMi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEI2OEE3MzAyQjgiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDIzLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEI2OEE3ODAwODQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFeHRlcm5hbEVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxRjgwM0UxIikNCi0JCShvYmplY3QgUm9sZSAiZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMjQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QjY4QTc4MDA4RSINCi0JCSAgICBsYWJlbCAgICAgIAkiZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREZpbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlCMDhFMDE4RiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMjUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzhCRDQ5MDgwMTNEIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDI2LTAwNWNmNDY5MWM0YzoxIikpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEJENDkxNDAxMzAiDQotCQkgICAgbGFiZWwgICAgICAJImF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERBdHRyaWJ1dGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0MxODc5MDBFQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMjctMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QkQ0OTE0MDE0RSINCi0JCSAgICBsYWJlbCAgICAgIAkiYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTJCMDNDOCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyIg0KLQkgICAgcXVpZCAgICAgICAJIjM5RkUyQTk1MDBDQyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMyINCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTJBOTUwMzExIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFBRjcwMDcxIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQiDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUyQTk1MDMxQiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREF0dHJpYnV0ZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQzE4NzkwMEVBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNSINCi0JICAgIHF1aWQgICAgICAgCSIzOUZFMkJCRTAyREMiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYiDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUyQkJGMDFCMSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREZpbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlCMDhFMDE4RiINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMkJCRjAxQkIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI1RTAyREUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5RkUzMEQ4MDMzRSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTMwRDkwMTA1Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUIwOEUwMThGIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjAiDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUzMEQ5MDEzNyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudW1lcmF0aW9uVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFMTQ2NjgwMzA2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKSkNCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIg0KLQkgICAgcXVpZCAgICAgICAJIjM3Q0FCMEU2MDE3NyINCi0JICAgIHRpdGxlICAgICAgCSJNYWluIg0KLQkgICAgem9vbSAgICAgICAJOTgNCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgTm90ZVZpZXcgQDENCi0JCSAgICBsb2NhdGlvbiAgIAkoMzI2NCwgMjQwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoMjkxMCwgNjUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk3DQotCQkJbWF4X3dpZHRoICAJNjczDQotCQkJbGFiZWwgICAgICAJDQotfERUREVsZW1lbnQncywgDQotfERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSdzLCBEVERFbnRpdHkncywgYW5kIERURE5vdGF0aW9uJ3MgYXJlIGFkZGVkIHRvIERUREZpbGUncyB1c2luZyB0aGUNCi18b3duZWRFbGVtZW50IHJlbGF0aW9uc2hpcA0KLXxiZXR3ZWVuIE1PRk5hbWVzcGFjZQ0KLXxhbmQgTU9GT2JqZWN0DQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTczMw0KLQkJICAgIGhlaWdodCAgICAgCTM2MykNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERJbnRlcm5hbEVudGl0eSIgQDINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgyNCwgMTg3MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJbG9jYXRpb24gICAJKDE2NDcsIDE4MTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERJbnRlcm5hbEVudGl0eSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMkJBMDI2RSINCi0JCSAgICB3aWR0aCAgICAgIAkzNzINCi0JCSAgICBoZWlnaHQgICAgIAkxMzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50IiBAMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1OTIsIDEyMDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSg0MTcsIDExNDUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzUwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbGVtZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFBRjcwMDcxIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzDQotCQkJbG9jYXRpb24gICAJKDQxNywgMTIwNCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM3MSkNCi0JCSAgICB3aWR0aCAgICAgIAkzNjgNCi0JCSAgICBoZWlnaHQgICAgIAkxMzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHlDb250ZW50IiBANA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTIwLCAxNDg4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSgxMzQxLCAxNDM4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERW50aXR5Q29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTlEMDA4MyINCi0JCSAgICB3aWR0aCAgICAgIAkzNzYNCi0JCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA1DQotCQkgICAgbG9jYXRpb24gICAJKDE1MjAsIDE2NDApDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDQNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTUyMCwgMTY0MCkNCi0JCQkoMTUyMCwgMTU1MCkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSIgQDYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQ4MCwgMTIxNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2DQotCQkJbG9jYXRpb24gICAJKDIxODYsIDExNjYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTg4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzODUyODdDQTAxNjMiDQotCQkgICAgd2lkdGggICAgICAJNjA2DQotCQkgICAgaGVpZ2h0ICAgICAJMTI0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5IiBANw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTIwLCAxMjE2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDcNCi0JCQlsb2NhdGlvbiAgIAkoMTI3MCwgMTEzNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MDANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVudGl0eSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTJCMDNDOCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANw0KLQkJCWxvY2F0aW9uICAgCSgxMjcwLCAxMTk2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNTI1KQ0KLQkJICAgIHdpZHRoICAgICAgCTUxOA0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMiIEA4DQotCQkgICAgbG9jYXRpb24gICAJKDE1NDYsIDEzNjYpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxQzkwMkRGIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQiIEA5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU0LCAyNDYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxQ0EwMzFEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOA0KLQkJCSAgICBzdXBwbGllciAgIAlANw0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU0NiwgMTM2NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1NDYsIDEzMDcpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEAxMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgNCi0JCQkgICAgbG9jYXRpb24gICAJKC01NCwgMjQ2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExDQotCQkJCVBhcmVudF9WaWV3IAlAMTANCi0JCQkJbG9jYXRpb24gICAJKDE0NDMsIDE0MDcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxOTENCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2NvbnRlbnQiDQotCQkJCXBjdERpc3QgICAgCTAuNjk5MjQ4DQotCQkJCWhlaWdodCAgICAgCTEwNA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDFDQTAzMjciDQotCQkJICAgIGNsaWVudCAgICAgCUA4DQotCQkJICAgIHN1cHBsaWVyICAgCUA0DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTQ2LCAxMzY2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU0NiwgMTQyNikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMTQwOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzIxODA0DQotCQkJCWhlaWdodCAgICAgCTIyDQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYiIEAxMw0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTc4LCAxMjU2KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4NTI4OTc5MDA1RiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwYXJtRW50aXR5UmVmIiBAMTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjAyLCA0ODgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNA0KLQkJCQlsb2NhdGlvbiAgIAkoMjAzOCwgMTI5OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMyOA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcGFybUVudGl0eVJlZiINCi0JCQkJcGN0RGlzdCAgICAJMC4zMDU0MTkNCi0JCQkJaGVpZ2h0ICAgICAJNDMNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzg1Mjg5N0MwMzUyIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5NzgsIDEyNTYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTc3LCAxMjU2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNg0KLQkJCQlQYXJlbnRfVmlldyAJQDE0DQotCQkJCWxvY2F0aW9uICAgCSgyMTQxLCAxMjI4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44MjY0ODQNCi0JCQkJaGVpZ2h0ICAgICAJMjkNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVudGl0eSIgQDE3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMNCi0JCQkgICAgbG9jYXRpb24gICAJKDYwMiwgNDg4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4DQotCQkJCVBhcmVudF9WaWV3IAlAMTcNCi0JCQkJbG9jYXRpb24gICAJKDE4NjIsIDEyMTcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VudGl0eSINCi0JCQkJcGN0RGlzdCAgICAJMC41ODkxMDkNCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzg1Mjg5N0MwMzUzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDcNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5NzgsIDEyNTYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzc5LCAxMjU2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE3DQotCQkJCWxvY2F0aW9uICAgCSgxODIzLCAxMzA5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC43NzY5MjMNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjplTmFtZWRFbGVtZW50IiBAMjANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDg4LCAxNzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMA0KLQkJCWxvY2F0aW9uICAgCSgxMzUyLCAxMzEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjcyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJlTmFtZWRFbGVtZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MTc1DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENEVFMDAxNCINCi0JCSAgICB3aWR0aCAgICAgIAkyOTANCi0JCSAgICBoZWlnaHQgICAgIAkxMTUNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzcyIgQDIxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTc2LCA5NjApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjENCi0JCQlsb2NhdGlvbiAgIAkoNDkyLCA4NjMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTY4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFQ2xhc3MiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcxNzUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1QkYwMDBBIg0KLQkJICAgIHdpZHRoICAgICAgCTE4Ng0KLQkJICAgIGhlaWdodCAgICAgCTIxOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjINCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YwQUYwMkE4Ig0KLQkJICAgIGNsaWVudCAgICAgCUAzDQotCQkgICAgc3VwcGxpZXIgICAJQDIxDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTcxLCAxMTMyKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzEsIDEwNjkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6ZU5hbWVkRWxlbWVudCIgQDIzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjU2MCwgODY0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjMNCi0JCQlsb2NhdGlvbiAgIAkoMjQyNCwgODE5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI3Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiZU5hbWVkRWxlbWVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzE3NQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDRFRTAwMTQiDQotCQkgICAgd2lkdGggICAgICAJMjkwDQotCQkgICAgaGVpZ2h0ICAgICAJMTE1DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMjQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjU2MCwgMTAzNikNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDIzDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDI1NjAsIDEwMzYpDQotCQkJKDI1NjAsIDkyMSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjUNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YwRTcwMUVBIg0KLQkJICAgIGNsaWVudCAgICAgCUA3DQotCQkgICAgc3VwcGxpZXIgICAJQDIzDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTY2OSwgMTEyNSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2OSwgMTAzNikNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyNCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMEQxMDA3NiINCi0JCSAgICBjbGllbnQgICAgIAlANg0KLQkJICAgIHN1cHBsaWVyICAgCUAyMw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI2MTgsIDExNTMpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2MTgsIDEwMzYpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjQpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRETm90YXRpb24iIEAyNw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5OTIsIDEyMzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjcNCi0JCQlsb2NhdGlvbiAgIAkoODE3LCAxMTI5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRETm90YXRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDBFRjAwQzkiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDI3DQotCQkJbG9jYXRpb24gICAJKDgxNywgMTE4OCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTM3MSkNCi0JCSAgICB3aWR0aCAgICAgIAkzNjgNCi0JCSAgICBoZWlnaHQgICAgIAkyMzANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFeHRlcm5hbEVudGl0eSIgQDI4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEzNDQsIDE4NzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjgNCi0JCQlsb2NhdGlvbiAgIAkoMTE1OCwgMTc5MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREV4dGVybmFsRW50aXR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxRjgwM0UxIg0KLQkJICAgIHdpZHRoICAgICAgCTM5MA0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUiIEAyOQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5NjksIDE2NzcpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQzNDQwMEU1Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIm5vdGF0aW9uIiBAMzANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTI0NywgMjA1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxDQotCQkJCVBhcmVudF9WaWV3IAlAMzANCi0JCQkJbG9jYXRpb24gICAJKDgzNCwgMTM5MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIwMw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbm90YXRpb24iDQotCQkJCXBjdERpc3QgICAgCTAuODcwNzM0DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDM0NTAyMDkiDQotCQkJICAgIGNsaWVudCAgICAgCUAyOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjcNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk2OSwgMTY3NykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk2OSwgMTM0NykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzINCi0JCQkJUGFyZW50X1ZpZXcgCUAzMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTA0MCwgMTM4OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTcyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODc3OTM0DQotCQkJCWhlaWdodCAgICAgCTcxDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbnRpdHkiIEAzMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMjQ3LCAyMDUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTA4MiwgMTc4NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZW50aXR5Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDM0NTAyMTMiDQotCQkJICAgIGNsaWVudCAgICAgCUAyOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5NjksIDE2NzcpDQotCQkJCSg5NjksIDE4MjcpDQotCQkJCSgxMTQ5LCAxODI3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk2OSwgMTY3NykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExNDksIDE4MjcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1DQotCQkJCVBhcmVudF9WaWV3IAlAMzMNCi0JCQkJbG9jYXRpb24gICAJKDExMDQsIDE4NTMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg2MzUwMQ0KLQkJCQloZWlnaHQgICAgIAkyNg0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQzMjQwMEYzIg0KLQkJICAgIGNsaWVudCAgICAgCUAyOA0KLQkJICAgIHN1cHBsaWVyICAgCUA0DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI3NCwgMTc4MSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3NCwgMTY0MCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRURENvbnRlbnQiIEAzNw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0NzIsIDgwMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM3DQotCQkJbG9jYXRpb24gICAJKDEzNDQsIDc1MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRURENvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI1RTAyREUiDQotCQkgICAgd2lkdGggICAgICAJMjc0DQotCQkgICAgaGVpZ2h0ICAgICAJMTI0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ3MiwgOTkwKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAzNw0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNDcyLCA5OTApDQotCQkJKDE0NzIsIDg2MikpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI4MzAyOUIiDQotCQkgICAgY2xpZW50ICAgICAJQDMNCi0JCSAgICBzdXBwbGllciAgIAlAMzcNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTksIDExMzIpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDcxOSwgOTkwKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDM4KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI4NjAzMDQiDQotCQkgICAgY2xpZW50ICAgICAJQDcNCi0JCSAgICBzdXBwbGllciAgIAlAMzcNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDUyLCAxMTI0KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDUyLCA5OTApDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMzgpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjhBMDI4NyINCi0JCSAgICBjbGllbnQgICAgIAlANg0KLQkJICAgIHN1cHBsaWVyICAgCUAzNw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzNDcsIDExNTQpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIzNDcsIDk5MCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAzOCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERGaWxlIiBANDINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ4OCwgNDQ4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQyDQotCQkJbG9jYXRpb24gICAJKDEyODEsIDM2OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QjA4RTAxOEYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDQyDQotCQkJbG9jYXRpb24gICAJKDEyODEsIDQyOCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTQyNSkNCi0JCSAgICB3aWR0aCAgICAgIAk0MzINCi0JCSAgICBoZWlnaHQgICAgIAkxODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5IiBANDMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzU0LCAxMDQ5KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QjY4QTczMDJCOCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMCIgQDQ0DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDMNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMDksIDIwNykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEI2OEE3ODAwODQiDQotCQkJICAgIGNsaWVudCAgICAgCUA0Mw0KLQkJCSAgICBzdXBwbGllciAgIAlAMjgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzNTQsIDEwNDkpDQotCQkJCSgzNTQsIDE3ODEpDQotCQkJCSgxMTQ5LCAxNzgxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM1NCwgMTA0OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExNDksIDE3ODEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUiIEA0NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQzDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTA5LCAyMDcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDYNCi0JCQkJUGFyZW50X1ZpZXcgCUA0NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjk2LCA0NTM3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzMyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlIg0KLQkJCQlwY3REaXN0ICAgIAktMi4yODMzMzMNCi0JCQkJaGVpZ2h0ICAgICAJNTkNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhCNjhBNzgwMDhFIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzU0LCAxMDQ5KQ0KLQkJCQkoMzU0LCA0MzkpDQotCQkJCSgxMjcyLCA0MzkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzU0LCAxMDQ5KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3MiwgNDM5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDQ1DQotCQkJCWxvY2F0aW9uICAgCSgxMjA2LCA1MDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk1NzEyOQ0KLQkJCQloZWlnaHQgICAgIAk2MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ4DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMDdGMDExOCINCi0JCSAgICBjbGllbnQgICAgIAlANDINCi0JCSAgICBzdXBwbGllciAgIAlAMjANCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg4LCAzNTcpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODgsIDIzMykpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUiIEA0OQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDcyLCA2MzgpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCQkUwMkRDIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2IiBANTANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMCwgLTE2MikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkJCRjAxQjEiDQotCQkJICAgIGNsaWVudCAgICAgCUA0OQ0KLQkJCSAgICBzdXBwbGllciAgIAlANDINCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDYzOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0NzIsIDUzOSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTciIEA1MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5DQotCQkJICAgIGxvY2F0aW9uICAgCSgwLCAtMTYyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCQkYwMUJCIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDM3DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcyLCA2MzgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcyLCA3MzgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyDQotCQkJCVBhcmVudF9WaWV3IAlANTENCi0JCQkJbG9jYXRpb24gICAJKDE1MjYsIDcxMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzM2MjQ4DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudW1lcmF0aW9uVHlwZSIgQDUzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI0NDgsIDQ2NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1Mw0KLQkJCWxvY2F0aW9uICAgCSgyMTg0LCAzODUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTI4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbnVtZXJhdGlvblR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0UxNDY2ODAzMDYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDUzDQotCQkJbG9jYXRpb24gICAJKDIxODQsIDQ0NCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTU0NikNCi0JCSAgICB3aWR0aCAgICAgIAk1NDYNCi0JCSAgICBoZWlnaHQgICAgIAkxODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOCIgQDU0DQotCQkgICAgbG9jYXRpb24gICAJKDE5MzksIDQ0OSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMzBEODAzM0UiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkiIEA1NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDU0DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNDYxLCAtMzEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlGRTMwRDkwMTA1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANTQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQyDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTM5LCA0NDkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzA0LCA0NDkpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwIiBANTYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQ2MSwgLTMxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlGRTMwRDkwMTM3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANTQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDUzDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTM5LCA0NDkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTc1LCA0NDkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3DQotCQkJCVBhcmVudF9WaWV3IAlANTYNCi0JCQkJbG9jYXRpb24gICAJKDIxMjAsIDQ4NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzY3ODM3DQotCQkJCWhlaWdodCAgICAgCTM3DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTgNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YwRTMwMjM0Ig0KLQkJICAgIGNsaWVudCAgICAgCUAyNw0KLQkJICAgIHN1cHBsaWVyICAgCUAyMw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNjQsIDExMTYpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjQsIDEwMzYpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjQpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1OQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjg1MDExOCINCi0JCSAgICBjbGllbnQgICAgIAlAMjcNCi0JCSAgICBzdXBwbGllciAgIAlAMzcNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NDEsIDExMTcpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk0MSwgOTkwKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDM4KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDMyQjAzMkUiDQotCQkgICAgY2xpZW50ICAgICAJQDINCi0JCSAgICBzdXBwbGllciAgIAlANA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3ODIsIDE4MDUpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3ODIsIDE2NDApDQotCQkgICAgZHJhd1N1cHBsaWVyIAlANSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiRWxlbWVudERlZmluaXRpb24iDQotCSAgICBxdWlkICAgICAgIAkiMzdFMTQzMzAwMzJGIg0KLQkgICAgdGl0bGUgICAgICAJIkVsZW1lbnREZWZpbml0aW9uIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTQyNg0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbXB0eUNvbnRlbnQiIEA2MQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0NjcsIDE0NDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjENCi0JCQlsb2NhdGlvbiAgIAkoMjgxLCAxNDAzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM3Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERW1wdHlDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFCNDcwMzdBIg0KLQkJICAgIHdpZHRoICAgICAgCTM5MA0KLQkJICAgIGhlaWdodCAgICAgCTExNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREFueUNvbnRlbnQiIEA2Mg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg4ODYsIDE0NDUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjINCi0JCQlsb2NhdGlvbiAgIAkoNzI4LCAxNDAwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMxNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFREQW55Q29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQjUwMDMwNCINCi0JCSAgICB3aWR0aCAgICAgIAkzMzQNCi0JCSAgICBoZWlnaHQgICAgIAkxMTQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERQQ0RhdGFDb250ZW50IiBANjMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI5OCwgMTQ1MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2Mw0KLQkJCWxvY2F0aW9uICAgCSgxMDk5LCAxNDA2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM5OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFREUENEYXRhQ29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQjVDMDEzNSINCi0JCSAgICB3aWR0aCAgICAgIAk0MTYNCi0JCSAgICBoZWlnaHQgICAgIAkxMTQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERSZXBlYXRhYmxlQ29udGVudCIgQDY0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4ODgsIDE0NTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2NA0KLQkJCWxvY2F0aW9uICAgCSgxNTcyLCAxNDA0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTYzMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFREUmVwZWF0YWJsZUNvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUQ0QzAxRDEiDQotCQkgICAgd2lkdGggICAgICAJNjUwDQotCQkgICAgaGVpZ2h0ICAgICAJMTI4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg3OCwgMTYxOCkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlANjQNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTg3OCwgMTYxOCkNCi0JCQkoMTg3OCwgMTUyMCkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RUF0dHJpYnV0ZSIgQDY2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkzNiwgNDAwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDY2DQotCQkJbG9jYXRpb24gICAJKDE4NTUsIDMyNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVBdHRyaWJ1dGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcxNzUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkyMzg0NzIwMzlEIg0KLQkJICAgIGhlaWdodCAgICAgCTE3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RUNsYXNzIiBANjcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MjgsIDM4NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2Nw0KLQkJCWxvY2F0aW9uICAgCSg4NDcsIDMwOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVDbGFzcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzE3NQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDVCRjAwMEEiDQotCQkgICAgaGVpZ2h0ICAgICAJMTc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRER3JvdXBDb250ZW50IiBANjgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjE5MiwgMTc3NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2OA0KLQkJCWxvY2F0aW9uICAgCSgxOTMxLCAxNzI3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUyMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRER3JvdXBDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVBRUYwMjMyIg0KLQkJICAgIHdpZHRoICAgICAgCTU0MA0KLQkJICAgIGhlaWdodCAgICAgCTEyMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUQ5MjAzNjMiDQotCQkgICAgY2xpZW50ICAgICAJQDY4DQotCQkgICAgc3VwcGxpZXIgICAJQDY0DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjIyMSwgMTcxNCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyMSwgMTYxOCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2NSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IiBANzANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ4OCwgMTc2MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3MA0KLQkJCWxvY2F0aW9uICAgCSgxMjIzLCAxNzE1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUzMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4NTI5MDBFMDEyNyINCi0JCSAgICB3aWR0aCAgICAgIAk1NDgNCi0JCSAgICBoZWlnaHQgICAgIAkxMTQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcxDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzg1MjkwNDQwMTFCIg0KLQkJICAgIGNsaWVudCAgICAgCUA3MA0KLQkJICAgIHN1cHBsaWVyICAgCUA2NA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0NzQsIDE3MDIpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0NzQsIDE2MTgpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlANjUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudENvbnRlbnQiIEA3Mg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MTIsIDEwNTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3Mg0KLQkJCWxvY2F0aW9uICAgCSg3MDQsIDEwMDgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDE2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbGVtZW50Q29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQUNGMDIxMyINCi0JCSAgICB3aWR0aCAgICAgIAk0MzQNCi0JCSAgICBoZWlnaHQgICAgIAkxMjANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBANzMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjI4OSwgMTA0OCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUI2RjAwNUQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDc0DQotCQkJICAgIFBhcmVudF9WaWV3IAlANzMNCi0JCQkgICAgbG9jYXRpb24gICAJKDEwMjUsIDgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzUNCi0JCQkJUGFyZW50X1ZpZXcgCUA3NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTIyMywgMTAwMSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrY29udGVudCINCi0JCQkJcGN0RGlzdCAgICAJMC45MTk0MjQNCi0JCQkJaGVpZ2h0ICAgICAJNDgNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdDQkVCNzAwMDZEIg0KLQkJCSAgICBjbGllbnQgICAgIAlANzMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDcyDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjg5LCAxMDQ4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyOSwgMTA0OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzYNCi0JCQkJUGFyZW50X1ZpZXcgCUA3NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE4NiwgMTA4MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTcyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLioiDQotCQkJCXBjdERpc3QgICAgCTAuOTUxMzgxDQotCQkJCWhlaWdodCAgICAgCTM1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDc0DQotCQkJCWxvY2F0aW9uICAgCSgxMjQ2LCA5NDEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkzDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAkxMDgNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImdyb3VwIiBANzgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyNSwgOCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDc4DQotCQkJCWxvY2F0aW9uICAgCSgyNTM1LCAxNzQ1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTQ0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitncm91cCINCi0JCQkJcGN0RGlzdCAgICAJMC45Mzc3NDQNCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdDQkVCNzAwMEFCIg0KLQkJCSAgICBjbGllbnQgICAgIAlANzMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDY4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjI4OSwgMTA0OCkNCi0JCQkJKDI1ODcsIDEwNDgpDQotCQkJCSgyNTg3LCAxNzg1KQ0KLQkJCQkoMjQ2MiwgMTc4NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjg5LCAxMDQ4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQ2MiwgMTc4NSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODANCi0JCQkJUGFyZW50X1ZpZXcgCUA3OA0KLQkJCQlsb2NhdGlvbiAgIAkoMjUyNiwgMTgyNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTQ1MDg1DQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDgxDQotCQkgICAgbG9jYXRpb24gICAJKDkxMCwgMTI5MSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlANzINCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoOTEwLCAxMjkxKQ0KLQkJCSg5MTAsIDExMTYpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDgyDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFCRTkwMjc4Ig0KLQkJICAgIGNsaWVudCAgICAgCUA2Mw0KLQkJICAgIHN1cHBsaWVyICAgCUA3Mg0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDEzOTQpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTcsIDEyOTEpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODEpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4Mw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQkYzMDMyNyINCi0JCSAgICBjbGllbnQgICAgIAlANjENCi0JCSAgICBzdXBwbGllciAgIAlANzINCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NjYsIDEzOTEpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQ2NiwgMTI5MSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg0DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFCRUUwMjA3Ig0KLQkJICAgIGNsaWVudCAgICAgCUA2Mg0KLQkJICAgIHN1cHBsaWVyICAgCUA3Mg0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDg4MSwgMTM4OCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODgxLCAxMjkxKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDgxKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODUNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QURCNzAzQzAiDQotCQkgICAgY2xpZW50ICAgICAJQDY0DQotCQkgICAgc3VwcGxpZXIgICAJQDcyDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTkwMywgMTM5MikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTkwMywgMTI5MSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCIgQDg2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDc4NCwgMTc2MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA4Ng0KLQkJCWxvY2F0aW9uICAgCSg0OTIsIDE3MTUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTg0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQjdEMDAxMCINCi0JCSAgICB3aWR0aCAgICAgIAk2MDINCi0JCSAgICBoZWlnaHQgICAgIAkxMTQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFEOEMwM0FBIg0KLQkJICAgIGNsaWVudCAgICAgCUA4Ng0KLQkJICAgIHN1cHBsaWVyICAgCUA2NA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY1MCwgMTcwMykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjUwLCAxNjE4KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDY1KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eSIgQDg4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0ODgsIDIwNjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAODgNCi0JCQlsb2NhdGlvbiAgIAkoMTI0NCwgMTk5MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0ODgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVudGl0eSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTJCMDNDOCINCi0JCSAgICB3aWR0aCAgICAgIAk1MDYNCi0JCSAgICBoZWlnaHQgICAgIAkxNjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3IiBAODkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ4MCwgMTg5OCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzODUyOTRFQjAyNDMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZW50aXR5UmVmZXJlbmNlIiBAOTANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzEyLCAtNzApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTENCi0JCQkJUGFyZW50X1ZpZXcgCUA5MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTI4MCwgMTg0MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMxMg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZW50aXR5UmVmZXJlbmNlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY5Mzc1MA0KLQkJCQloZWlnaHQgICAgIAkyMDENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzg1Mjk0RUYwM0JCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAODkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDcwDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDgwLCAxODk4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4MCwgMTgxNykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTINCi0JCQkJUGFyZW50X1ZpZXcgCUA5MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTUzNCwgMTg0MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuNjkzNzUwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50UmVmZXJlbmNlZEVudGl0eSIgQDkzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAODkNCi0JCQkgICAgbG9jYXRpb24gICAJKDMxMiwgLTcwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk0DQotCQkJCVBhcmVudF9WaWV3IAlAOTMNCi0JCQkJbG9jYXRpb24gICAJKDEyMjAsIDE5NTQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0ODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VsZW1lbnRSZWZlcmVuY2VkRW50aXR5Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjY4NTMxNQ0KLQkJCQloZWlnaHQgICAgIAkyNjENCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzg1Mjk0RUYwM0JDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAODkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDg4DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDgwLCAxODk4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4MCwgMTk4MCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTUNCi0JCQkJUGFyZW50X1ZpZXcgCUA5Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTUyNCwgMTk1OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzM0MjM0DQotCQkJCWhlaWdodCAgICAgCTQ0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnQiIEA5Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MTIsIDc1MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA5Ng0KLQkJCWxvY2F0aW9uICAgCSg3NDQsIDcwMikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMzYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVsZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUFGNzAwNzEiDQotCQkgICAgd2lkdGggICAgICAJMzU0DQotCQkgICAgaGVpZ2h0ICAgICAJMTI0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMSIgQDk3DQotCQkgICAgbG9jYXRpb24gICAJKDkxMiwgOTA0KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQzBFMDBDRCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50IiBAOTgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTI1LCA5NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDk4DQotCQkJCWxvY2F0aW9uICAgCSgxMDE0LCA4NjUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VsZW1lbnQiDQotCQkJCXBjdERpc3QgICAgCTAuNDI4NTcxDQotCQkJCWhlaWdodCAgICAgCTEwMg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUMwRjAzOUYiDQotCQkJICAgIGNsaWVudCAgICAgCUA5Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAOTYNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDANCi0JCQkJUGFyZW50X1ZpZXcgCUA5OA0KLQkJCQlsb2NhdGlvbiAgIAkoODU3LCA4NTApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU5ODIxNA0KLQkJCQloZWlnaHQgICAgIAk1Ng0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDEwMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDk3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMjUsIDk2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMg0KLQkJCQlQYXJlbnRfVmlldyAJQDEwMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAxNCwgOTY0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitjb250ZW50Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjY2NDA2Mw0KLQkJCQloZWlnaHQgICAgIAkxMDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdEOUFDMEYwM0E5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAOTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDcyDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzDQotCQkJCVBhcmVudF9WaWV3IAlAMTAxDQotCQkJCWxvY2F0aW9uICAgCSg4NzEsIDk2MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuNjQwNjI1DQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEAxMDQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIzLCAxMTIyKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBRjExMDAxQSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50UmVmZXJlbmNlIiBAMTA1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0DQotCQkJICAgIGxvY2F0aW9uICAgCSgtOTgxLCA2NDIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2DQotCQkJCVBhcmVudF9WaWV3IAlAMTA1DQotCQkJCWxvY2F0aW9uICAgCSgzMjEsIDE4MjUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzNDgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VsZW1lbnRSZWZlcmVuY2UiDQotCQkJCXBjdERpc3QgICAgCTAuODQwMDM1DQotCQkJCWhlaWdodCAgICAgCTU2DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3RDlBRjFCMDIwOSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwNA0KLQkJCSAgICBzdXBwbGllciAgIAlAODYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjMsIDExMjIpDQotCQkJCSgxMjMsIDE3NjkpDQotCQkJCSg0ODMsIDE3NjkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIzLCAxMTIyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDgzLCAxNzY5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDcNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDUNCi0JCQkJbG9jYXRpb24gICAJKDQyMiwgMTcyNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuOTQwNTU5DQotCQkJCWhlaWdodCAgICAgCTQ0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2VkRWxlbWVudCIgQDEwOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTk4MSwgNjQyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEwOA0KLQkJCQlsb2NhdGlvbiAgIAkoNTMyLCA2ODYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3JlZmVyZW5jZWRFbGVtZW50Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjc5OTY1MA0KLQkJCQloZWlnaHQgICAgIAk0Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUYxQjAyMEEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDk2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTIzLCAxMTIyKQ0KLQkJCQkoMTIzLCA3MjgpDQotCQkJCSg3MzUsIDcyOCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMsIDExMjIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MzUsIDcyOCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEwDQotCQkJCVBhcmVudF9WaWV3IAlAMTA4DQotCQkJCWxvY2F0aW9uICAgCSg3MDEsIDc3MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTY2OTY1DQotCQkJCWhlaWdodCAgICAgCTQ1DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTExDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMEFGMDJBOCINCi0JCSAgICBjbGllbnQgICAgIAlAOTYNCi0JCSAgICBzdXBwbGllciAgIAlANjcNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjMsIDY5MCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTIzLCA0NzApKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREF0dHJpYnV0ZSIgQDExMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODg4LCA3NTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTEyDQotCQkJbG9jYXRpb24gICAJKDE2MTIsIDY1NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1NTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREF0dHJpYnV0ZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0MxODc5MDBFQSINCi0JCSAgICB3aWR0aCAgICAgIAk1NzANCi0JCSAgICBoZWlnaHQgICAgIAkyMTQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4IiBAMTEzDQotCQkgICAgbG9jYXRpb24gICAJKDI3NzUsIDE2MjgpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzg1Mjk3MkQwMkNCIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UiIEAxMTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMNCi0JCQkgICAgbG9jYXRpb24gICAJKDE1OTEsIC01NjQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1DQotCQkJCVBhcmVudF9WaWV3IAlAMTE0DQotCQkJCWxvY2F0aW9uICAgCSgyNDIyLCA4MDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZU5hbWVSZWZlcmVuY2UiDQotCQkJCXBjdERpc3QgICAgCTAuODI5NjMwDQotCQkJCWhlaWdodCAgICAgCTM5DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4NTI5NzM2MDI5MSINCi0JCQkgICAgY2xpZW50ICAgICAJQDExMw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTEyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjc3NSwgMTYyOCkNCi0JCQkJKDI3NzUsIDc2OCkNCi0JCQkJKDIxNzMsIDc2OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzc1LCAxNjI4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE3MywgNzY4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTQNCi0JCQkJbG9jYXRpb24gICAJKDIyMjIsIDg3MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuOTY2NjQ5DQotCQkJCWhlaWdodCAgICAgCTEwMg0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkiIEAxMTcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMNCi0JCQkgICAgbG9jYXRpb24gICAJKDE1OTEsIC01NjQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4DQotCQkJCVBhcmVudF9WaWV3IAlAMTE3DQotCQkJCWxvY2F0aW9uICAgCSgyMDc2LCAyMDkwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNTg4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIithdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSINCi0JCQkJcGN0RGlzdCAgICAJMC43NzE0NjkNCi0JCQkJaGVpZ2h0ICAgICAJMzUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzg1Mjk3MzYwMjlCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTEzDQotCQkJICAgIHN1cHBsaWVyICAgCUA4OA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI3NzUsIDE2MjgpDQotCQkJCSgyNzc1LCAyMDU1KQ0KLQkJCQkoMTc0MSwgMjA1NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzc1LCAxNjI4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0MSwgMjA1NSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5DQotCQkJCVBhcmVudF9WaWV3IAlAMTE3DQotCQkJCWxvY2F0aW9uICAgCSgxODEzLCAyMDE4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45NTE0NDINCi0JCQkJaGVpZ2h0ICAgICAJMzgNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEiIEAxMjANCi0JCSAgICBsb2NhdGlvbiAgIAkoMjk0NSwgMTg5MSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEJENDkwODAxM0QiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlVHlwZVJlZmVyZW5jZSIgQDEyMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4OSwgLTY3NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjENCi0JCQkJbG9jYXRpb24gICAJKDI0MzUsIDY1NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ0NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrYXR0cmlidXRlVHlwZVJlZmVyZW5jZSINCi0JCQkJcGN0RGlzdCAgICAJMC44NjYwMjYNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhCRDQ5MTQwMTMwIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTIwDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyOTQ1LCAxODkxKQ0KLQkJCQkoMjk0NSwgNzA4KQ0KLQkJCQkoMjE3MywgNzA4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI5NDUsIDE4OTEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTczLCA3MDgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMw0KLQkJCQlQYXJlbnRfVmlldyAJQDEyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM0NSwgNjAzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC45MTI1MzgNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSIgQDEyNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4OSwgLTY3NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjQNCi0JCQkJbG9jYXRpb24gICAJKDE2NzksIDIyOTkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk1NzYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjgyODYwMQ0KLQkJCQloZWlnaHQgICAgIAk1Ng0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEJENDkxNDAxNEUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjANCi0JCQkgICAgc3VwcGxpZXIgICAJQDg4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjk0NSwgMTg5MSkNCi0JCQkJKDI5NDUsIDIyNDMpDQotCQkJCSgxNDM4LCAyMjQzKQ0KLQkJCQkoMTQzOCwgMjE0OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTQ1LCAxODkxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQzOCwgMjE0OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI2DQotCQkJCVBhcmVudF9WaWV3IAlAMTI0DQotCQkJCWxvY2F0aW9uICAgCSgxMzY1LCAyMTc4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45ODQ3NzQNCi0JCQkJaGVpZ2h0ICAgICAJNzQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjcNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YxNTkwMURBIg0KLQkJICAgIGNsaWVudCAgICAgCUAxMTINCi0JCSAgICBzdXBwbGllciAgIAlANjYNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTUwLCA2NDUpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5NTAsIDQ4NikpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIiIEAxMjgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM0NiwgNzUyKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQTk1MDBDQyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMyIgQDEyOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU0MiwgLTE2KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQTk1MDMxMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyOA0KLQkJCSAgICBzdXBwbGllciAgIAlAOTYNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzNDYsIDc1MikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwODksIDc1MikpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQiIEAxMzANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgNCi0JCQkgICAgbG9jYXRpb24gICAJKC01NDIsIC0xNikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQTk1MDMxQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyOA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTEyDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzQ2LCA3NTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjAzLCA3NTIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEzMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTU0NCwgNzkxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC43NzMzOTANCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkF0dHJpYnV0ZURlZmluaXRpb24iDQotCSAgICBxdWlkICAgICAgIAkiMzdFMTQ0NTcwMjU3Ig0KLQkgICAgdGl0bGUgICAgICAJIkF0dHJpYnV0ZURlZmluaXRpb24iDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERBdHRyaWJ1dGUiIEAxMzINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDUxMiwgNjU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEzMg0KLQkJCWxvY2F0aW9uICAgCSgyMzYsIDUzOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1NTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREF0dHJpYnV0ZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0MxODc5MDBFQSINCi0JCSAgICB3aWR0aCAgICAgIAk1NzANCi0JCSAgICBoZWlnaHQgICAgIAkyNTgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERCYXNpY1R5cGUiIEAxMzMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEyNjQsIDY1NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMzMNCi0JCQlsb2NhdGlvbiAgIAkoMTAxNywgNTg0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ5NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFREQmFzaWNUeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFMTQ2NEYwMERBIg0KLQkJICAgIHdpZHRoICAgICAgCTUxMg0KLQkJICAgIGhlaWdodCAgICAgCTE2OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudW1lcmF0aW9uVHlwZSIgQDEzNA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkwNCwgNjU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEzNA0KLQkJCWxvY2F0aW9uICAgCSgxNjQ2LCA1ODQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTE2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbnVtZXJhdGlvblR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0UxNDY2ODAzMDYiDQotCQkgICAgd2lkdGggICAgICAJNTM0DQotCQkgICAgaGVpZ2h0ICAgICAJMTY4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IE5vdGVWaWV3IEAxMzUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTEyLCAxMTIwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEzNQ0KLQkJCWxvY2F0aW9uICAgCSg0OTIsIDkyNikNCi0JCQlubGluZXMgICAgIAk5DQotCQkJbWF4X3dpZHRoICAJODA1DQotCQkJbGFiZWwgICAgICAJDQotfEEgRFREIGF0dHJpYnV0ZSdzIHR5cGUgYW5kIGluaXRpYWwNCi18dmFsdWUgYXJlIHJlcHJlc2VudGVkIHVzaW5nIHRoZSBlVHlwZSBhbmQgZGVmYXVsdCB2YWx1ZSBzdG9yZWQgaW4gZUF0dHJpYnV0ZS4gVGhlIGVUeXBlIHdpbGwgYWx3YXlzIGJlIGVpdGhlciBEVERCYXNpY1R5cGUgKHN1YmNsYXNzIG9mIGVDbGFzcykgb3IgRFRERW51bWVyYXRpb25UeXBlIChzdWJjbGFzcyBvZiBlRW51bSkuDQotCQkJKQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkgICAgd2lkdGggICAgICAJODY1DQotCQkgICAgaGVpZ2h0ICAgICAJNDAwKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAxMzYNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgY2xpZW50ICAgICAJQDEzMg0KLQkJICAgIHN1cHBsaWVyICAgCUAxMzUNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RUNsYXNzIiBAMTM3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI2NCwgMjcyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEzNw0KLQkJCWxvY2F0aW9uICAgCSgxMTgzLCAxOTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFQ2xhc3MiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcxNzUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1QkYwMDBBIg0KLQkJICAgIGhlaWdodCAgICAgCTE3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RUVudW0iIEAxMzgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTA0LCAyNzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTM4DQotCQkJbG9jYXRpb24gICAJKDE4MjMsIDE5NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVFbnVtIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MTc1DQotCQkgICAgcXVpZHUgICAgICAJIjM5QTQ3M0U5MDFENCINCi0JCSAgICBoZWlnaHQgICAgIAkxNzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEzOQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjI4MDAzMTUiDQotCQkgICAgY2xpZW50ICAgICAJQDEzMw0KLQkJICAgIHN1cHBsaWVyICAgCUAxMzcNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYwLCA1NzIpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjAsIDM1OSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YyODEwMzAyIg0KLQkJICAgIGNsaWVudCAgICAgCUAxMzQNCi0JCSAgICBzdXBwbGllciAgIAlAMTM4DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTkwMywgNTcyKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTAzLCAzNTkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RUF0dHJpYnV0ZSIgQDE0MQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDUyOCwgMjcyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE0MQ0KLQkJCWxvY2F0aW9uICAgCSg0NDcsIDE5NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVBdHRyaWJ1dGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcxNzUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkyMzg0NzIwMzlEIg0KLQkJICAgIGhlaWdodCAgICAgCTE3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQyDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMTU5MDFEQSINCi0JCSAgICBjbGllbnQgICAgIAlAMTMyDQotCQkgICAgc3VwcGxpZXIgICAJQDE0MQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDUyMCwgNTI3KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MjAsIDM1OSkpKSkpKQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL3Jvc2UvZHRkbW9kZWwubWRsIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvcm9zZS9kdGRtb2RlbC5tZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNTYyN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvcm9zZS9kdGRtb2RlbC5tZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3NTI2ICswLDAgQEAKLQ0KLShvYmplY3QgUGV0YWwNCi0gICAgdmVyc2lvbiAgICAJNDUNCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgNy41LjAxMDMuMTkyMCINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3Ig0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiSURFIg0KLQkgICAgdmFsdWUgICAgICAJIkludGVybmFsIEVkaXRvciIpKQ0KLSAgICBxdWlkICAgICAgIAkiM0UzNkJFQjYwMTMzIg0KLSAgICBkZWZhdWx0cyAgIAkob2JqZWN0IGRlZmF1bHRzDQotCXJpZ2h0TWFyZ2luIAkwLjI1MDAwMA0KLQlsZWZ0TWFyZ2luIAkwLjI1MDAwMA0KLQl0b3BNYXJnaW4gIAkwLjI1MDAwMA0KLQlib3R0b21NYXJnaW4gCTAuNTAwMDAwDQotCXBhZ2VPdmVybGFwIAkwLjI1MDAwMA0KLQljbGlwSWNvbkxhYmVscyAJVFJVRQ0KLQlhdXRvUmVzaXplIAlUUlVFDQotCXNuYXBUb0dyaWQgCVRSVUUNCi0JZ3JpZFggICAgICAJMTYNCi0JZ3JpZFkgICAgICAJMTYNCi0JZGVmYXVsdEZvbnQgCShvYmplY3QgRm9udA0KLQkgICAgc2l6ZSAgICAgICAJMTANCi0JICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JICAgIGJvbGQgICAgICAgCUZBTFNFDQotCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCSAgICBjb2xvciAgICAgIAkwDQotCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQlzaG93TWVzc2FnZU51bSAJMQ0KLQlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQ0KLQlub3RhdGlvbiAgIAkiVW5pZmllZCIpDQotICAgIHJvb3RfdXNlY2FzZV9wYWNrYWdlIAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJVc2UgQ2FzZSBWaWV3Ig0KLQlxdWlkICAgICAgIAkiM0EwQzc1RjQwMUY3Ig0KLQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQlnbG9iYWwgICAgIAlUUlVFDQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQ0KLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgVXNlQ2FzZURpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiM0EwQzc1RjQwMjBCIg0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHJvb3RfY2F0ZWdvcnkgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIkxvZ2ljYWwgVmlldyINCi0JcXVpZCAgICAgICAJIjNBMEM3NUY0MDFGNiINCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JZ2xvYmFsICAgICAJVFJVRQ0KLQlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciDQotCXF1aWR1ICAgICAgCSIzQTBDNzVGNDAxRjgiDQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJlY29yZSINCi0JCWlzX3VuaXQgICAgCVRSVUUNCi0JCWlzX2xvYWRlZCAgCUZBTFNFDQotCQlmaWxlX25hbWUgIAkiJFZBQkFTRV9QTFVHSU5TX1BBVEhcXG9yZy5lY2xpcHNlLmVtZi5lY29yZVxcc3JjXFxtb2RlbFxcb3JnLmVjbGlwc2UuZW1mLkVDb3JlLmNhdCINCi0JCXF1aWQgICAgICAgCSIzOUE1RUQwNDAwNEUiKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiZHRkIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkVkFCQVNFX1BMVUdJTlNfUEFUSFxcb3JnLmVjbGlwc2Uud3N0LmR0ZFxcc3JjXFxyb3NlXFxEVEQuY2F0Ig0KLQkJcXVpZCAgICAgICAJIjM4NTdCMUMwMDI5MyIpKQ0KLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNBMEM3NUY0MDFGRiINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6ZWNvcmUiIEAxDQotCQkJbG9jYXRpb24gICAJKDk2MCwgMzA0KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDENCi0JCQkgICAgbG9jYXRpb24gICAJKDgxNiwgMjIwKQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJlY29yZSIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM5QTVFRDA0MDA0RSINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6ZHRkIiBAMg0KLQkJCWxvY2F0aW9uICAgCSgzNjgsIDI1NikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyDQotCQkJICAgIGxvY2F0aW9uICAgCSgyMjQsIDE3MikNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkiZHRkIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiMzg1N0IxQzAwMjkzIg0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkpKSkpDQotICAgIHJvb3Rfc3Vic3lzdGVtIAkob2JqZWN0IFN1YlN5c3RlbSAiQ29tcG9uZW50IFZpZXciDQotCXF1aWQgICAgICAgCSIzQTBDNzVGNDAxRjgiDQotCXBoeXNpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkNCi0JcGh5c2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBNb2R1bGVfRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzQTBDNzVGNDAyMEEiDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCi0gICAgcHJvY2Vzc19zdHJ1Y3R1cmUgCShvYmplY3QgUHJvY2Vzc2VzDQotCXF1aWQgICAgICAgCSIzQTBDNzVGNDAxRjkiDQotCVByb2NzTkRldnMgCShsaXN0DQotCSAgICAob2JqZWN0IFByb2Nlc3NfRGlhZ3JhbSAiRGVwbG95bWVudCBWaWV3Ig0KLQkJcXVpZCAgICAgICAJIjNBMEM3NUY0MDFGQiINCi0JCXRpdGxlICAgICAgCSJEZXBsb3ltZW50IFZpZXciDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHByb3BlcnRpZXMgCShvYmplY3QgUHJvcGVydGllcw0KLQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFCYXNlIg0KLQkJCXZhbHVlICAgICAgCSgiRGF0YUJhc2VTZXQiIDgwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhQmFzZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJBTlNJIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJPcmFjbGUiDQotCQkJCXZhbHVlICAgICAgCTgwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIlNRTFNlcnZlciINCi0JCQkJdmFsdWUgICAgICAJODAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiU3liYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJXYXRjb20iDQotCQkJCXZhbHVlICAgICAgCTgwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIklkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWUiDQotCQkJdmFsdWUgICAgICAJIlZfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiVF8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdFN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiX1YiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkJhc2VWaWV3cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRERMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIlZBUkNIQVIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiTnVsbHNPSyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByZXNlcnZlUmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSURMRWxlbWVudCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSURMU3BlY2lmaWNhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJJRExTcGVjU2V0IiAyMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJRExTcGVjU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZSINCi0JCQkJdmFsdWUgICAgICAJMjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJUeXBlZGVmIg0KLQkJCQl2YWx1ZSAgICAgIAk1NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTcxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiRXhjZXB0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk2MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlN0cnVjdCINCi0JCQkJdmFsdWUgICAgICAJNTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJVbmlvbiINCi0JCQkJdmFsdWUgICAgICAJODEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuZHRkL3NyYy9yb3NlL2R0ZG1vZGVsLm1kbCwgb3JnLmVjbGlwc2Uud3N0LmR0ZCwgd3RwTTEsIDIwMDQxMTIyIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJRExNb2R1bGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmR0ZC9zcmMvcm9zZS9kdGRtb2RlbC5tZGwsIG9yZy5lY2xpcHNlLndzdC5kdGQsIHd0cE0xLCAyMDA0MTEyMiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJSYWlzZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRIYXNSZWxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiSGFzUmVsVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJTQ0MiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlZ2VuIE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUm9vdFBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEhlYWRlckluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxCb2R5SW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJTb3VyY2VGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQm9keVNvdXJjZUZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBTlNJIEMrKyBFdmVudCBXYXRjaGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQU5TSUNvbnZlcnQiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgzODMyNjIwMCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUJvZGllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIltzdGF0ZW1lbnRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTYwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVXNlRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE4M19TT1VSQ0UiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJPYmplY3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc0FjY2VzcyINCi0JCQl2YWx1ZSAgICAgIAkoIkltcGxlbWVudGF0aW9uU2V0IiA0MykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUG9seW1vcnBoaWNVbml0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJIYW5kbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJIYW5kbGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJIYW5kbGVBY2Nlc3MiDQotCQkJdmFsdWUgICAgICAJKCJJbXBsZW1lbnRhdGlvblNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uTGl0ZXJhbFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzUGFyYW1ldGVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiVGhpcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvcktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNyZWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ29weSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkZyZWUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc0VxdWFsaXR5T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJIYW5kbGVFcXVhbGl0eU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzVGFzayINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJMaW1pdGVkUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsUGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVuYW1lcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJNb2RlIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiJHtkZWZhdWx0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiU3BlYyINCi0JCQkJdmFsdWUgICAgICAJMjI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJCb2R5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyINCi0JCQkJdmFsdWUgICAgICAJMjIyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJTZXBhcmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjIzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJJbiINCi0JCQkJdmFsdWUgICAgICAJMjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJPdXQiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiSW5PdXQiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb25SZXR1cm4iDQotCQkJCXZhbHVlICAgICAgCTIwNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODM4MzI2MjAwIikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWRhIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWR+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWQjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWRhIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWR+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWQjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlVzZUNvbG9uTm90YXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSJbc3RhdGVtZW50XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlVzZUZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQURBOTVfU09VUkNFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJPYmplY3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0MykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVJbXBsZW1lbnRhdGlvblNldCIgMjA4KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2wiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlQ29udHJvbFNldCIgMjI1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDb250cm9sbGVkXyR7dHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlRGVmaW5pdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkSW1wbGVtZW50YXRpb25TZXQiIDIwOSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEtpbmRQYWNrYWdlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHtjbGFzc31fUmVjb3JkX0tpbmRzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNMaW1pdGVkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlQWNjZXNzVHlwZVNldCIgMjMwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZURlZmluaXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTWF5YmVBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb25TZXQiIDExKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyZW50Q2xhc3NOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTdXBlcmNsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJBXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJUaGVfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZlR5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZlR5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBY2Nlc3NfQXJyYXlfT2ZfJHt0eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFycmF5T2ZBY2Nlc3NUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQXJyYXlfT2ZfJHthY2Nlc3NfdHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mQWNjZXNzVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFycmF5SW5kZXhEZWZpbml0aW9uIg0KLQkJCXZhbHVlICAgICAgCSJQb3NpdGl2ZSByYW5nZSA8PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiVGhpcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUtpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNyZWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ29weSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkZyZWUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVR5cGVFcXVhbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUVxdWFsaXR5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHtxdW90ZX09JHtxdW90ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJUYWdnZWQiDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUmVjb3JkIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk1peGluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlRhc2siDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVR5cGUiDQotCQkJCXZhbHVlICAgICAgCTIwOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTXVsdGlwbGVUeXBlcyINCi0JCQkJdmFsdWUgICAgICAJMjEzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiDQotCQkJCXZhbHVlICAgICAgCTExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJVbmNvbnN0cmFpbmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMjI1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbml0aWFsaXphdGlvbk9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIyNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXNzaWdubWVudEZpbmFsaXphdGlvbk9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIyNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjgpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWx3YXlzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkF1dG8iDQotCQkJCXZhbHVlICAgICAgCTIzMCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc1ByaXZhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVuYW1lcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkaW5nIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIwMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyQ2xhc3NXaWRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc09wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiJHtkZWZhdWx0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5QmFycmllckNvbmRpdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiVHJ1ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiU3BlYyINCi0JCQkJdmFsdWUgICAgICAJMjI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJCb2R5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyINCi0JCQkJdmFsdWUgICAgICAJMjIyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZ0FzQm9keSINCi0JCQkJdmFsdWUgICAgICAJMjMxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJTZXBhcmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjIzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbiINCi0JCQkJdmFsdWUgICAgICAJMjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJPdXQiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW5PdXQiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3N1cHBsaWVyfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiDQotCQkJCXZhbHVlICAgICAgCTExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiDQotCQkJCXZhbHVlICAgICAgCTIxNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHthc3NvY2lhdGlvbn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEaXNzb2NpYXRlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRGlzc29jaWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZURpc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IiAyMTcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiDQotCQkJCXZhbHVlICAgICAgCTExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmR0ZC9zcmMvcm9zZS9kdGRtb2RlbC5tZGwsIG9yZy5lY2xpcHNlLndzdC5kdGQsIHd0cE0xLCAyMDA0MTEyMiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuZHRkL3NyYy9yb3NlL2R0ZG1vZGVsLm1kbCwgb3JnLmVjbGlwc2Uud3N0LmR0ZCwgd3RwTTEsIDIwMDQxMTIyIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJwcm9qZWN0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJWaWV3Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRG9tYWluQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU1BQYWNrYWdlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluZGV4Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludENvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJKb2luQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImNPTlRBSU5FUkNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVmlld1ByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRvbWFpblByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJbmRleFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RhdGFiYXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFyZ2V0RGF0YWJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVGFibGVTcGFjZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZWF1bHQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJCdWZmZXJQb29sIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRXh0ZW50U2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkxKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJlZmV0Y2hTaXplIg0KLQkJCXZhbHVlICAgICAgCTEpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYWdlU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAk0KQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTWFuYWdlZEJ5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyTGlzdCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbVNjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtRG9tYWluUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEb21haW5QYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSb290U2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSb290RG9tYWluUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRhdGFiYXNlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEQk1TIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVGFibGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1ZpZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RvbWFpbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU1BQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU3lub255bW5zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlSWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29ycmVsYXRpb25OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0Q2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVcGRhdGVhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGVja09wdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiTm9uZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NuYXBTaG90Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEaXN0aW5jdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBlcnNpc3RUb1NlcnZlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiT3JkaW5hbCINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNJZGVudGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29sdW1uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiTmF0aXZlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlSWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiT0lEIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUmVsYXRpb25zaGlwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlSWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUklNZXRob2QiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyZW50VXBkYXRlUnVsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnREZWxldGVSdWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGlsZEluc2VydFJlc3RyaWN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRJbnNlcnRSZXN0cmljdE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkTXVsdGlwbGljaXR5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1RyaWdnZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1N0b3JlZFByb2NlZHVyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzQ2x1c3RlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGaWxsRmFjdG9yIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJLZXlMaXN0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tQcmVkaWNhdGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmVyYWxNb2RlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENoZWNrVGltZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNJbnNlcnRFdmVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVXBkYXRlRXZlbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RlbGV0ZUV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmT2xkVGFibGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZOZXdUYWJsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJlZk9sZFJvdyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJlZk5ld1JvdyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUm93Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiV2hlbkNsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkxhbmd1YWdlIg0KLQkJCXZhbHVlICAgICAgCSJTUUwiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJvY1R5cGUiDQotCQkJdmFsdWUgICAgICAJIlByb2NlZHVyZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RldGVybWluaXN0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJldHVybmVkTnVsbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkV4dGVybmFsTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtZXRlciINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzSW5QYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzT3V0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiT3JkaW5hbCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25JRCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIgQ29tbXVuaWNhdG9yIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiZnJhbWV3b3JrIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSb290RGlyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZVByZWZpeGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkF1dG9TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5vdFNob3dSb3NlSUREbGciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2hvd0NvZGVnZW5EbGciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSb3NlSUQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRSZXR1cm5MaW5lIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRBdXRob3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0U2luY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUxIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTEiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQxIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY051bUFzdGVyaXNrcyINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1heE51bUNoYXJzIg0KLQkJCXZhbHVlICAgICAgCTgwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVk0iDQotCQkJdmFsdWUgICAgICAJKCJWTVR5cGUiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIuO0M6XFxJQk1cXFNRTExJQlxcamF2YVxcZGIyamF2YS56aXA7QzpcXElCTVxcU1FMTElCXFxqYXZhXFxkYjJqY2MuamFyO0M6XFxJQk1cXFNRTExJQlxcamF2YVxcc3Fsai56aXA7QzpcXElCTVxcU1FMTElCXFxiaW47QzpcXElCTVxcU1FMTElCXFxqYXZhXFxjb21tb24uamFyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWZlcmVuY2VDbGFzc3BhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVk1UeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdW4iDQotCQkJCXZhbHVlICAgICAgCTIwMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZBSmF2YVdvcmtpbmdGb2xkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VWYXJpYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1ZhcmlhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRBdHRyaWJ1dGVEYXRhVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkidm9pZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTm9DbGFzc0N1c3RvbURsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHbG9iYWxJbXBvcnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VDbGFzc1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlTWV0aG9kU3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZVNwYWNlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNwYWNpbmdJdGVtcyINCi0JCQl2YWx1ZSAgICAgIAkzKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJvc2VEZWZhdWx0Q29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQXN0ZXJpc2tDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhQ29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0F1dGhvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jU2luY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1ZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQmVhblByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlbW90ZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZW1vdGVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSG9tZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJIb21lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJEVERMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RFRETG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEVKQlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNlcnZsZXRWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfU2VydmxldF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiSHR0cF9TZXJ2bGV0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiRGVmYXVsdF9FSkJfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIyMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjIuMCINCi0JCQkJdmFsdWUgICAgICAJMjMwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjEueCINCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTmF0aXZlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkUmV0dXJuIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlcGxhY2VFeGlzdGluZ0NvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTcyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIg0KLQkJCQl2YWx1ZSAgICAgIAk3MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJNzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiDQotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiDQotCQkJCXZhbHVlICAgICAgCTgxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSINCi0JCQkJdmFsdWUgICAgICAJODIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSINCi0JCQkJdmFsdWUgICAgICAJODMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTcyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIg0KLQkJCQl2YWx1ZSAgICAgIAk3MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJNzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiDQotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiDQotCQkJCXZhbHVlICAgICAgCTgxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSINCi0JCQkJdmFsdWUgICAgICAJODIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSINCi0JCQkJdmFsdWUgICAgICAJODMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNOYXZpZ2FibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjM2MDAwMDAwMiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIl9JRCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1LDApIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiV2hlcmVDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlUHJlY2lzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbk9mUkVGUyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiTWV0aG9kS2luZFNldCIgMTkwMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3ZlcmxvYWRJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb0RhdGFTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vUHJvY2Vzc1N0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2VsZmlzaCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJUeXBlU2V0IiAxODAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnQiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRXZlbnRTZXQiIDE2MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJSZWZlcmVuY2luZ05hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoIg0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckZvckVhY2hTZXQiIDE3MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJXaGVuQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk1hcE1ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJMTkwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJPcmRlck1ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJMTkwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTkwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTE5MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3BlcmF0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvciINCi0JCQkJdmFsdWUgICAgICAJMTkwNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNhbGN1bGF0ZWQiDQotCQkJCXZhbHVlICAgICAgCTE5MDkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQUZURVIiDQotCQkJCXZhbHVlICAgICAgCTE4MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQkVGT1JFIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU1RFQUQgT0YiDQotCQkJCXZhbHVlICAgICAgCTE4MDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUk9XIg0KLQkJCQl2YWx1ZSAgICAgIAkxNzAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlNUQVRFTUVOVCINCi0JCQkJdmFsdWUgICAgICAJMTcwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSINCi0JCQkJdmFsdWUgICAgICAJMTYwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIjYiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNQcmltYXJ5S2V5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNvbXBvbmVudFRlc3QiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJofiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMi4xX19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSwkbGltaXQpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpLCRsaW1pdCkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2UoJGxpbWl0KSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlKCRsaW1pdCkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWUoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMy4wX19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNsYXNzS2V5Ig0KLQkJCXZhbHVlICAgICAgCSJjbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUHV0Qm9kaWVzSW5TcGVjIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0Q29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSZWxhdGlvbmFsT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUmVsYXRpb25hbE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9yYWdlTWdtdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN1YnNjcmlwdE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXJlZmVyZW5jZU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZUtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlUmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5kaXJlY3Rpb25PcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUluZGlyZWN0aW9uT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0cmVhbVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZU9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL29yZy5lY2xpcHNlLndzdC5kdGQvc3JjL3Jvc2UvZHRkbW9kZWwubWRsLCBvcmcuZWNsaXBzZS53c3QuZHRkLCB3dHBNMSwgMjAwNDExMjIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgDQotfC8vICRwYWNrYWdlDQotfCNpbmNsdWRlICIkZmlsZSINCi18DQotCQkJKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIkFNSVIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmR0ZC9zcmMvcm9zZS9kdGRtb2RlbC5tZGwsIG9yZy5lY2xpcHNlLndzdC5kdGQsIHd0cE0xLCAyMDA0MTEyMiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwvLyAkcGFja2FnZQ0KLXwjaW5jbHVkZSAiJGZpbGUiDQotfA0KLQkJCSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIkFNSVIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJPcGVyYXRpb25LaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWJzdHJhY3RCb2R5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZyaWVuZEJvZHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnJpZW5kRGVjbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3BlY2lhbERlY2xSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0V4cGxpY2l0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ0NSZWdpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9keUFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9yZGVyZWQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VBcmd1bWVudHMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdldCINCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuZ2V0KCRrZXlzKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclNldCINCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuc2V0KCRrZXlzLCR2YWx1ZSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiRzdXBwbGllciAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0luaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJKCJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0dldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc1NldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdEF0dHJpYnV0ZVZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kYXR0cmlidXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeUlzT25TZWFyY2hMaXN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGVudCINCi0JCQl2YWx1ZSAgICAgIAkyKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiNS4wIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQ2xhc3NUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQ2xhc3NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlX1BhcnQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ29ubmVjdGlvbl9QYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNsYXNzX0ZhY3RvcnkiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEeW5hbWljIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkR5bmNyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTZXJpYWwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRlR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RBVEFfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaWVsZEdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9GSUVMRF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkoIk9MRUZhY3RvcnlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRfaW4iDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkxpY2Vuc2VkIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDbGFzc0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFQ3RsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDdGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFVHlwZUxpYiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1ham9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNaW5vciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BQYWdlSURzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVByb3BQYWdlSURzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BhdGNoTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrRnVuY3Rpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaERlZlZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcElkRW51bSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUF9JRF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUludGVyZmFjZU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJTlRFUkZBQ0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkluaXRJbnRlcmZhY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tFdmVudHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRTaW5rTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wTm90aWZ5U2lua3MiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvbk1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uUG9pbnRJSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdGFuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUNvbW1hbmRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRkNEZWNsYXJlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUZDSW1wbGVtZW50cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQVRMX0RlY2xhcmVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNPTU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT01fTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvblBvaW50TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fUE9JTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTXNnTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wZXJ0eU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQUk9QRVJUWV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNPcGVyYXRpb25UeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDT3BlcmF0aW9uVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWxfT3ZlcnJpZGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVzc2FnZV9IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRXZlbnRfRmlyaW5nX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X1NpbmtfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdGRfT0xFX01ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDb21tYW5kX1BhcnNlciINCi0JCQkJdmFsdWUgICAgICAJNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9HZXRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfU2V0X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X05vdGlmeV9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWFjcm9fR2VuZXJhdGVkX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQm9keUltYWdlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSb3NlIE1vZGVsIEludGVncmF0b3IiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSb3NlIFdlYiBQdWJsaXNoZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJUb3BMaW5rIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiVHlwZUtpbmRzIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImVudW0iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJInJlY29yZCINCi0JCQkJdmFsdWUgICAgICAJMTAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkibW9kdWxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJpbnRlcmZhY2UiDQotCQkJCXZhbHVlICAgICAgCTEwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImRpc3BpbnRlcmZhY2UiDQotCQkJCXZhbHVlICAgICAgCTEwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImNvY2xhc3MiDQotCQkJCXZhbHVlICAgICAgCTEwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImFsaWFzIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJ1bmlvbiINCi0JCQkJdmFsdWUgICAgICAJMTA3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkibWF4Ig0KLQkJCQl2YWx1ZSAgICAgIAkxMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiDQotCQkJCXZhbHVlICAgICAgCTEwOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlS2luZHMiIDEwOSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJkbGxuYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYWxpYXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiZmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJsaWJyYXJ5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidXVpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJInZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscGZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImxjaWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmVyc2lvbiBDb250cm9sIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNpbmdTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljTm90Q3JlYXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbFNpbmdsZVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiTXVsdGlVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbE11bHRpVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkJhc2VTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIwIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIxIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkJhc2UiDQotCQkJdmFsdWUgICAgICAJKCJCYXNlU2V0IiAyMjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uRXhwbGljaXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkNvbXBhcmUiDQotCQkJdmFsdWUgICAgICAJKCJDb21wYXJlU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZyINCi0JCQl2YWx1ZSAgICAgIAkoIkluc3RhbmNpbmdTZXQiIDIxOSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJDb21wYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIihub25lKSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiQmluYXJ5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJUZXh0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJBbGlhc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJc1N0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUmVwbGFjZUV4aXN0aW5nQm9keSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkZ1bGxOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQnlWYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJCeVJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUGFyYW1BcnJheSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9qZWN0RmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZU1vZGVsIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBvcnRSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJRdWlja0ltcG9ydCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW1wb3J0QmluYXJ5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbFN0dWRpbyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIldlYiBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFbnRpdHlfU3lzdGVtSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1B1YmxpY0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiSW50ZXJuYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJFbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxFbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fU3lzdGVtSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fUHVibGljSUQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdERlY2xUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiQXNzaWduIEFsbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJDb21wb25lbnRQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1VSSSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiY2xhc3NpZmllck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJvcGVyYXRpb25OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzSUQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicmVmZXJlbmNlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKSkNCi0JcXVpZCAgICAgICAJIjNBMEM3NUY0MDFGQSIpKQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L0RUREZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGVlNTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2FueS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2FueS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMTdkOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hbnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGJiN2I0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX2xpc3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGVfbGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NWViNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGVfbGlzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2NvbW1lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjMmNjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2NvbW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjQ4ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9yZWYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50X3JlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OWFjZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50X3JlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VtcHR5Y29udGVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VtcHR5Y29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOGU2NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbXB0eWNvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTkxODg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5X3JlZmVyZW5jZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VudGl0eV9yZWZlcmVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzBiMjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5X3JlZmVyZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfZWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxYzEzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZiMmNhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9ub3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX25vdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MDk2NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX25vdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfdW5yZWMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX3VucmVjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZkODJlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfdW5yZWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mb2xkZXJfYXR0bGlzdF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mb2xkZXJfYXR0bGlzdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODQ5Yzc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZm9sZGVyX2F0dGxpc3Rfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZm9sZGVyX2NvbW1lbnRzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZvbGRlcl9jb21tZW50c19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWYwOTQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZm9sZGVyX2NvbW1lbnRzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2dlbmh0bWZvcm1fd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZ2VuaHRtZm9ybV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjU0NzAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZ2VuaHRtZm9ybV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9ub3RhdGlvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L25vdGF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5ZGY5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L25vdGF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0YzI2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZWNob2ljZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZWNob2ljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxM2JhMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVjaG9pY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjJiMzU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3JlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3JlY2hvaWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3JlY2hvaWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYzOThjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZWNob2ljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZXNlcXVlbmNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3Jlc2VxdWVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDFkYjI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3Jlc2VxdWVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVzZXF1ZW5jZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZXNlcXVlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY5NjU4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZXNlcXVlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDIyZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsY2hvaWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWxjaG9pY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjRmOWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWxjaG9pY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbHNlcXVlbmNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWxzZXF1ZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZDUyODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbHNlcXVlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvdHh0ZXh0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvdHh0ZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhN2EzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3R4dGV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3VucmVjb2duaXplZF9jb250ZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvdW5yZWNvZ25pemVkX2NvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTg5OTdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvdW5yZWNvZ25pemVkX2NvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZjUxNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZWNob2ljZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmVjaG9pY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWFjMTMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZWNob2ljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmVzZXF1ZW5jZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmVzZXF1ZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZDRjYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3Jlc2VxdWVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM4Yzc4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotcGx1Z2luTmFtZT1TdHJ1Y3R1cmVkIFNvdXJjZSBEVEQgQ29yZQotIwotU3RydWN0dXJlZF9EVERfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZT1TdHJ1Y3R1cmVkIERURCBEb2N1bWVudCBGYWN0b3J5IEV4dGVuc2lvbgotRFREX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPURURAotX0RURF9WQUxJREFUT1JfTkFNRSAgICAgICAgICAgICAgID0gRFREIFZhbGlkYXRvcgotX3ZhbGlkYXRpb25NYXJrZXIubmFtZT1EVEQgUHJvYmxlbQotX3Rhc2tNYXJrZXIubmFtZT1EVEQgVGFzawpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMmMxNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbEhhbmRsZXIiPgotCQk8bW9kZWxIYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JEVEQiCi0JCQlhc3NvY2lhdGVkQ29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyIj4KLQkJPC9tb2RlbEhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXIiPgotCQk8c2Nhbm5lcgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50YXNrcy5EVERGaWxlVGFza1NjYW5uZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRhc2tzLkRUREZpbGVUYXNrU2Nhbm5lcjpvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudGFza01hcmtlciIKLQkJCWNvbnRlbnRUeXBlSWRzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJaWQ9InRhc2tNYXJrZXIiCi0JCW5hbWU9IiVfdGFza01hcmtlci5uYW1lIgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0JCTxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50YXNrbWFya2VyIi8+Ci0JCTxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0JPC9leHRlbnNpb24+Ci0gICAgPGV4dGVuc2lvbgotICAgICAgIGlkPSJ2YWxpZGF0aW9uTWFya2VyIgotICAgICAgICBuYW1lPSIlX3ZhbGlkYXRpb25NYXJrZXIubmFtZSIKLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotICAgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnByb2JsZW1tYXJrZXIiLz4KLSAgICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0gICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmRvY3VtZW50Q3JlYXRpb24iCi0JCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZG9jdW1lbnRmYWN0b3JpZXMiCi0JCW5hbWU9IiVTdHJ1Y3R1cmVkX0RURF9Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZpbGVidWZmZXJzLkJhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJkdGQiIC8+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249Im1vZCIgLz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0iZW50IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZS5jb250ZW50VHlwZXMiPgotCQk8Y29udGVudC10eXBlCi0JCQlmaWxlLWV4dGVuc2lvbnM9ImR0ZCxtb2QsZW50IgotCQkJcHJpb3JpdHk9Im5vcm1hbCIKLQkJCW5hbWU9IiVEVERfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnRleHQiCi0JCQlkZWZhdWx0LWNoYXJzZXQ9IlVURi04Ij4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmNvbnRlbnQuQ29udGVudERlc2NyaWJlckZvckRURCIgLz4KLQkJPC9jb250ZW50LXR5cGU+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZXh0ZW5zaW9uX3BhcnNlciI+Ci0JCTxwYXJzZXIKLQkJCXR5cGU9ImR0ZCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUmVzb3VyY2VGYWN0b3J5SW1wbCI+Ci0JCTwvcGFyc2VyPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmV4dGVuc2lvbl9wYXJzZXIiPgotCQk8cGFyc2VyCi0JCQl0eXBlPSJlbnQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFJlc291cmNlRmFjdG9yeUltcGwiPgotCQk8L3BhcnNlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0JCTxwYWNrYWdlCi0JCQl1cmk9IkRURC54bWkiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsLkRURFBhY2thZ2VJbXBsIj4KLQkJPC9wYWNrYWdlPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50RmFjdG9yaWVzIj4KLQkJPGZhY3RvcnkKLQkJCXR5cGU9ImR0ZCwgZW50LCBtb2QsIHhtbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnRGYWN0b3J5RFREIj4KLQkJPC9mYWN0b3J5PgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBpbml0aWFsaXplIGR0ZCBjb3JlIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gUmVnaXN0ZXIgdGhlIERURCB2YWxpZGF0b3Igd2l0aCB0aGUgKG5ldykgdmFsaWRhdGlvbiAgIC0tPgotCTwhLS0gZnJhbWV3b3JrLiAJCQkJCQkJCQkJICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbiBpZD0iZHRkRFREVmFsaWRhdG9yIiBuYW1lPSIlX0RURF9WQUxJREFUT1JfTkFNRSIgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIj4KLSAgICAgIDx2YWxpZGF0b3IKLSAgICAgICAgICAgIGJ1aWxkPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuVmFsaWRhdG9yIgotICAgICAgICAgICAgbWFudWFsPSJ0cnVlIgotICAgICAgICAgICAgc291cmNlaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuZHRkc291cmNldmFsaWRhdG9yIgotICAgICAgICAgICAgdmVyc2lvbj0iMSIKLSAgICAgICAgICAgIG1hcmtlcklkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudmFsaWRhdGlvbk1hcmtlciI+Ci0gICAgICAgICA8aW5jbHVkZT4KLSAgICAgICAgICAgIDxydWxlcz4KLSAgICAgICAgICAgICAgIDxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIvPgotICAgICAgICAgICAgICAgPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0iZHRkIi8+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dCBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIgZXh0PSJlbnQiLz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0IGNhc2VTZW5zaXRpdmU9ImZhbHNlIiBleHQ9Im1vZCIvPgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIERURCBhcyB5b3UgdHlwZSB2YWxpZGF0aW9uCQkJCQkJCQktLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZS5WYWxpZGF0b3IiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5kdGRzb3VyY2V2YWxpZGF0b3IiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllcgotCQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5ERUZBVUxUIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0F0dE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0F0dE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3NTM2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBdHROb2RlIHsKLQkvLwotCS8vIGF0dFR5cGUKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENEQVRBID0gMCwgSUQgPSAxLCBJRFJFRiA9IDIsIElEUkVGUyA9IDMsIEVOVElUWSA9IDQsIEVOVElUSUVTID0gNSwgTk1UT0tFTiA9IDYsIE5NVE9LRU5TID0gNywgTk9UQVRJT04gPSA4LCBFTlVNRVJBVElPTiA9IDksIFBFUkVGRVJFTkNFID0gMTA7Ci0KLQkvLwotCS8vIEtlZXAgdGhpcyBhcnJheSBpbi1zeW5jIHdpdGggdGhlIEFUVFRZUEUgZGVmaW5pdGlvbnMKLQkvLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGZnQXR0VHlwZVN0cmluZyA9IHsiQ0RBVEEiLCAvLyAwIC8vJE5PTi1OTFMtMSQKLQkJCQkiSUQiLCAvLyAxIC8vJE5PTi1OTFMtMSQKLQkJCQkiSURSRUYiLCAvLyAyIC8vJE5PTi1OTFMtMSQKLQkJCQkiSURSRUZTIiwgLy8gMyAvLyROT04tTkxTLTEkCi0JCQkJIkVOVElUWSIsIC8vIDQgLy8kTk9OLU5MUy0xJAotCQkJCSJFTlRJVElFUyIsIC8vIDUgLy8kTk9OLU5MUy0xJAotCQkJCSJOTVRPS0VOIiwgLy8gNiAvLyROT04tTkxTLTEkCi0JCQkJIk5NVE9LRU5TIiwgLy8gNyAvLyROT04tTkxTLTEkCi0JCQkJIk5PVEFUSU9OIiwgLy8gOCAvLyROT04tTkxTLTEkCi0JCQkJIkVOVU1FUkFUSU9OIiwgLy8gOSAocmVwbGFjZWQgd2l0aCAiTk1UT0tFTiIgYnkgU0FYIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJLy8gQXR0cmlidXRlTGlzdCBoYW5kbGVyKQotCQkJCSIlRU5USVRZUkVGRVJFTkNFOyJ9OyAvLyROT04tTkxTLTEkCi0KLQkvLwotCS8vIGF0dERlZmF1bHRUeXBlCi0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT0ZJWEVEID0gMSwgLy8gQXR0VmFsdWUKLQkJCQlSRVFVSVJFRCA9IDIsIC8vICNSRVFVSVJFRAotCQkJCUlNUExJRUQgPSAzLCAvLyAjSU1QTElFRAotCQkJCUZJWEVEID0gNDsgLy8gI0ZJWEVEIEF0dFZhbHVlCi0KLQlwdWJsaWMgU3RyaW5nIG5hbWUgPSBudWxsOwotCXB1YmxpYyBTdHJpbmcgdHlwZSA9IG51bGw7Ci0JcHVibGljIFN0cmluZyBkZWZhdWx0VHlwZSA9IG51bGw7Ci0JcHVibGljIFN0cmluZyBkZWZhdWx0VmFsdWUgPSBudWxsOwotCXB1YmxpYyBWZWN0b3IgZW51bUxpc3QgPSBudWxsOyAvLyBsaXN0IG9mIE5vdGF0aW9ucyBvciBFbnVtIHZhbHVlcwotCi0JcHVibGljIGludCBnZXREZWNsYXJlZFR5cGUoKSB7Ci0JCWludCB0ID0gLTE7Ci0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gdDsKLQotCQlpZiAodHlwZS5zdGFydHNXaXRoKCIlIikgJiYgdHlwZS5lbmRzV2l0aCgiOyIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBQRVJFRkVSRU5DRTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZnQXR0VHlwZVN0cmluZy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHR5cGUuZXF1YWxzKGZnQXR0VHlwZVN0cmluZ1tpXSkpIHsKLQkJCQl0ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdDsKLQl9Ci0KLQlwdWJsaWMgRW51bWVyYXRpb24gZWxlbWVudHMoKSB7Ci0JCWlmIChlbnVtTGlzdCA9PSBudWxsKQotCQkJZW51bUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCXJldHVybiBlbnVtTGlzdC5lbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFR5cGUoKSB7Ci0JCWlmIChkZWZhdWx0VHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCi0JCWlmIChkZWZhdWx0VHlwZS5zdGFydHNXaXRoKCIlIikgJiYgZGVmYXVsdFR5cGUuZW5kc1dpdGgoIjsiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gUEVSRUZFUkVOQ0U7Ci0JCWVsc2UgaWYgKGRlZmF1bHRUeXBlLmVxdWFscygiI1JFUVVJUkVEIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBSRVFVSVJFRDsKLQkJZWxzZSBpZiAoZGVmYXVsdFR5cGUuZXF1YWxzKCIjSU1QTElFRCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gSU1QTElFRDsKLQkJZWxzZSBpZiAoZGVmYXVsdFR5cGUuZXF1YWxzKCIjRklYRUQiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIEZJWEVEOwotCQllbHNlCi0JCQlyZXR1cm4gTk9GSVhFRDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkF0dCBOYW1lOiAiICsgbmFtZSArICIgVHlwZTogIiArIHR5cGUgKyAiIGRlZmF1bHRUeXBlOiAiICsgZGVmYXVsdFR5cGUgKyAiIGRlZmF1bHRWYWx1ZTogIiArIGRlZmF1bHRWYWx1ZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0F0dGxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0F0dGxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI3N2ExOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHRsaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgQXR0bGlzdCBleHRlbmRzIEJhc2VOb2RlIHsKLQlWZWN0b3IgYXR0RGVmcyA9IG5ldyBWZWN0b3IoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBsaXN0J3MgbmFtZTsgdGhpcyB2YWx1ZSBpcyBhbHNvIGtub3duIGFzIHRoZQotCSAqICAgICAgICAgICAgRWxlbWVudCB0eXBlLgotCSAqLwotCXB1YmxpYyBBdHRsaXN0KFN0cmluZyBuYW1lLCBTdHJpbmcgb3duZXJEVEQpIHsKLQkJdGhpcyhuYW1lLCBvd25lckRURCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEF0dGxpc3QoU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckRURCwgU3RyaW5nIGNvbW1lbnQsIEVycm9yTWVzc2FnZSBlcnJvck1lc3NhZ2UpIHsKLQkJc3VwZXIobmFtZSwgb3duZXJEVEQsIGNvbW1lbnQsIGVycm9yTWVzc2FnZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBBZGRzIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGRlZmluaXRpb24gdG8gdGhlIGVuZCBvZiB0aGlzIGF0dHJpYnV0ZQotCSAqIGxpc3QgLgotCSAqIAotCSAqIEBwYXJhbSBhdHREZWYKLQkgKiAgICAgICAgICAgIEF0dHJpYnV0ZSBkZWZpbml0aW9uIHRvIGFkZCB0byB0aGlzIGF0cmlidXRlIGxpc3QuCi0JICogQHJldHVybiA9dHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGRlZmluaXRpb24gZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbgotCSAqICAgICAgICAgdGhpcyBhdHRyaWJ1dGUgbGlzdDsgb3RoZXJ3aXNlLCA9ZmFsc2UuCi0JICogQHNlZSAjZWxlbWVudEF0Ci0JICogQHNlZSAjZ2V0QXR0RGVmCi0JICogQHNlZSAjY29udGFpbnMKLQkgKiBAc2VlICNzaXplCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWRkRWxlbWVudChBdHROb2RlIGF0dERlZikgewotCQlpZiAoY29udGFpbnMoYXR0RGVmLm5hbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQl0aGlzLmF0dERlZnMuYWRkRWxlbWVudChhdHREZWYpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBhdCB0aGUgc3BlY2lmaWVkIDx2YXI+aW5kZXg8L3Zhcj4gaW4KLQkgKiB0aGlzIGF0dHJpYnV0ZSBsaXN0Ci0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBJbmRleCBpbnRvIHRoaXMgbGlzdCBvZiBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMuCi0JICogQHJldHVybiBBdHRyaWJ1dGUgZGVmaW5pdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBvciA8dmFyPm51bGw8L3Zhcj4KLQkgKiAgICAgICAgIGlmIGFuIGludmFsaWQgaW5kZXguCi0JICogQHNlZSAjYWRkRWxlbWVudAotCSAqIEBzZWUgI2dldEF0dERlZgotCSAqIEBzZWUgI2NvbnRhaW5zCi0JICogQHNlZSAjc2l6ZQotCSAqLwotCXB1YmxpYyBBdHROb2RlIGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChBdHROb2RlKSB0aGlzLmF0dERlZnMuZWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBkZWZpbml0aW9uIG5hbWUgaW4gdGhpcyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0RGVmTmFtZQotCSAqICAgICAgICAgICAgQXR0cmlidXRlIGRlZmluaXRpb24gbmFtZSB0byBtYXRjaCBpbiB0aGlzIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEByZXR1cm4gVGhlIG1hdGNoaW5nIGF0dHJpYnV0ZSBkZWZpbml0aW9uLCBvciA8dmFyPm51bGw8L3Zhcj4gaWYgdGhlCi0JICogICAgICAgICBhdHRyaWJ1dGUgaXMgbm90IGN1cnJlbnRseSBkZWZpbmVkLgotCSAqIEBzZWUgI2FkZEVsZW1lbnQKLQkgKiBAc2VlICNlbGVtZW50QXQKLQkgKiBAc2VlICNjb250YWlucwotCSAqIEBzZWUgI3NpemUKLQkgKiBAc2VlICNlbGVtZW50cwotCSAqLwotCXB1YmxpYyBBdHROb2RlIGdldEF0dERlZihTdHJpbmcgYXR0RGVmTmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0JCQlBdHROb2RlIGFkID0gZWxlbWVudEF0KGkpOwotCQkJaWYgKGF0dERlZk5hbWUuZXF1YWxzKGFkLm5hbWUpKQotCQkJCXJldHVybiBhZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBuYW1lIGlzIGN1cnJlbnRseQotCSAqIGRlZmluZWQgaW4gdGhpcyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0RGVmTmFtZQotCSAqICAgICAgICAgICAgQXR0cmlidXRlIGRlZmluaXRpb24gbmFtZSB0byBtYXRjaCBpbiB0aGlzIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEByZXR1cm4gPXRydWUgaWYgPHZhcj5hdHREZWZOYW1lPC92YXI+IGlzIGRlZmluZWQ7IG90aGVyd2lzZSwgPWZhbHNlLgotCSAqIEBzZWUgI2FkZEVsZW1lbnQKLQkgKiBAc2VlICNlbGVtZW50QXQKLQkgKiBAc2VlICNnZXRBdHREZWYKLQkgKiBAc2VlICNzaXplCi0JICogQHNlZSAjZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgYXR0RGVmTmFtZSkgewotCQlyZXR1cm4gbnVsbCAhPSBnZXRBdHREZWYoYXR0RGVmTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyBpbiB0aGlzIGF0dHJpYnV0ZSBsaXN0LgotCSAqIAotCSAqIEByZXR1cm4gTnVtYmVyIG9mIGF0dHJpYnV0ZSBsaXN0IGRlZmluaXRpb25zLCBvciA8dmFyPm51bGw8L3Zhcj4gaWYgbm8KLQkgKiAgICAgICAgIGRlZmluaXRpb25zIGRlZmluZWQuCi0JICogQHNlZSAjYWRkRWxlbWVudAotCSAqIEBzZWUgI2VsZW1lbnRBdAotCSAqIEBzZWUgI2dldEF0dERlZgotCSAqIEBzZWUgI2NvbnRhaW5zCi0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5hdHREZWZzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIGFsbCBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgaW4gdGhpcyBhdHRyaWJ1dGUKLQkgKiBsaXN0LgotCSAqIAotCSAqIEByZXR1cm4gQW4gZW51bWVyYXRpb24gb2YgYWxsIGF0dHJpYnV0ZSBkZWZpbml0aW9ucywgb3IgPHZhcj5udWxsPC92YXI+Ci0JICogICAgICAgICBpZiBub25lIHNwZWNpZmllZC4KLQkgKiBAc2VlICNhZGRFbGVtZW50Ci0JICogQHNlZSAjZWxlbWVudEF0Ci0JICogQHNlZSAjZ2V0QXR0RGVmCi0JICogQHNlZSAjY29udGFpbnMKLQkgKiBAc2VlICNzaXplCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGVsZW1lbnRzKCkgewotCQlyZXR1cm4gdGhpcy5hdHREZWZzLmVsZW1lbnRzKCk7Ci0JfQotCi0Jdm9pZCBzZXRBdHREZWZzKFZlY3RvciBhdHRycykgewotCQlhdHREZWZzID0gYXR0cnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQmFzZU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0Jhc2VOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YjM5YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQmFzZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VOb2RlIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBudWxsOwotCXByb3RlY3RlZCBFcnJvck1lc3NhZ2UgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkvLyBwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBjb21tZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIG93bmVyRFREID0gbnVsbDsKLQotCS8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAqLwotCXB1YmxpYyBCYXNlTm9kZShTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFREKSB7Ci0JCXRoaXMobmFtZSwgb3duZXJEVEQsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBCYXNlTm9kZShTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFRELCBTdHJpbmcgY29tbWVudCwgRXJyb3JNZXNzYWdlIGVycm9yTWVzc2FnZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLm93bmVyRFREID0gb3duZXJEVEQ7Ci0JCXRoaXMuY29tbWVudCA9IGNvbW1lbnQ7Ci0JCXRoaXMuZXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRPd25lckRURCgpIHsKLQkJcmV0dXJuIG93bmVyRFREOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE93bmVyRFREKFN0cmluZyBvd25lcikgewotCQlvd25lckRURCA9IG93bmVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgewotCQl0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotCX0KLQotCXB1YmxpYyBFcnJvck1lc3NhZ2UgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShFcnJvck1lc3NhZ2UgbWVzc2FnZSkgewotCQllcnJvck1lc3NhZ2UgPSBtZXNzYWdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01CYXNpY05vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNQmFzaWNOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YzBmYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01CYXNpY05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBDTUJhc2ljTm9kZSBleHRlbmRzIENNTm9kZSB7Ci0JcHJpdmF0ZSBpbnQgdHlwZSA9IENNTm9kZVR5cGUuRU1QVFk7IC8vIHBvc3NpYmxlIHR5cGVzIDoKLQotCS8vIENNTm9kZVR5cGUuRU1QVFkKLQkvLyBDTU5vZGVUeXBlLkFOWQotCS8vIENNTm9kZVR5cGUuUENEQVRBCi0KLQkvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gKi8KLQlwdWJsaWMgQ01CYXNpY05vZGUoU3RyaW5nIHJlZk5hbWUpIHsKLQkJc3VwZXIocmVmTmFtZSk7Ci0JfQotCi0JcHVibGljIENNQmFzaWNOb2RlKFN0cmluZyByZWZOYW1lLCBpbnQgdHlwZSkgewotCQlzdXBlcihyZWZOYW1lKTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIiBCYXNpY05vZGVOYW1lOiAiICsgZ2V0TmFtZSgpICsgIiBUeXBlOiAiICsgZ2V0VHlwZSgpICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTUdyb3VwTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Hcm91cE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JlMjAyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTUdyb3VwTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgQ01Hcm91cE5vZGUgZXh0ZW5kcyBDTVJlcGVhdGFibGVOb2RlIHsKLQlwcml2YXRlIGludCB0eXBlID0gQ01Ob2RlVHlwZS5HUk9VUDsKLQlwcml2YXRlIGludCBncm91cEtpbmQgPSBDTU5vZGVUeXBlLkdST1VQX1NFUVVFTkNFOwotCXByaXZhdGUgVmVjdG9yIGNoaWxkcmVuID0gbmV3IFZlY3RvcigpOwotCi0JcHVibGljIENNR3JvdXBOb2RlKCkgewotCQlzdXBlcigiR1JPVVAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLy8gaW1wbGVtZW50IHN1cGVyIGNsYXNzCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkgewotCQkvLyBjYW4ndCBjaGFuZ2UgLSBvbmx5IG9uZSB0eXBlIGFsbG93cwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0R3JvdXBLaW5kKCkgewotCQlyZXR1cm4gZ3JvdXBLaW5kOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdyb3VwS2luZChpbnQga2luZCkgewotCQlncm91cEtpbmQgPSBraW5kOwotCX0KLQotCXB1YmxpYyBWZWN0b3IgZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZChDTU5vZGUgY2hpbGQpIHsKLQkJY2hpbGRyZW4uYWRkRWxlbWVudChjaGlsZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICJHcm91cCAoIC0ga2luZDogIiArIGdldEdyb3VwS2luZCgpICsgIiBPY2NUeXBlOiAiICsgZ2V0T2NjdXJyZW5jZSgpICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQlFbnVtZXJhdGlvbiBlbiA9IGNoaWxkcmVuLmVsZW1lbnRzKCk7Ci0JCXdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJcmVzdWx0ICs9ICIgIiArIGVuLm5leHRFbGVtZW50KCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJlc3VsdCArPSAiR3JvdXAgKSI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzFiY2E1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENNTm9kZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgcmVmTmFtZTsKLQotCS8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAqLwotCXB1YmxpYyBDTU5vZGUoU3RyaW5nIHJlZk5hbWUpIHsKLQkJdGhpcy5yZWZOYW1lID0gcmVmTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiByZWZOYW1lOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0VHlwZSgpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VHlwZShpbnQgdHlwZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNTm9kZVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNTm9kZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhOGQ4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTU5vZGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1wdWJsaWMgaW50ZXJmYWNlIENNTm9kZVR5cGUgewotCXN0YXRpYyBwdWJsaWMgaW50IEVNUFRZID0gMTsKLQlzdGF0aWMgcHVibGljIGludCBBTlkgPSAyOwotCXN0YXRpYyBwdWJsaWMgaW50IFBDREFUQSA9IDM7Ci0Jc3RhdGljIHB1YmxpYyBpbnQgRUxFTUVOVF9SRUZFUkVOQ0UgPSA0OwotCXN0YXRpYyBwdWJsaWMgaW50IEVOVElUWV9SRUZFUkVOQ0UgPSA1OwotCXN0YXRpYyBwdWJsaWMgaW50IEdST1VQID0gNjsKLQotCXN0YXRpYyBwdWJsaWMgaW50IE9ORSA9IDc7Ci0Jc3RhdGljIHB1YmxpYyBpbnQgT1BUSU9OQUwgPSA4OwotCXN0YXRpYyBwdWJsaWMgaW50IE9ORV9PUl9NT1JFID0gOTsKLQlzdGF0aWMgcHVibGljIGludCBaRVJPX09SX01PUkUgPSAxMDsKLQotCXN0YXRpYyBwdWJsaWMgaW50IEdST1VQX0NIT0lDRSA9IDExOwotCXN0YXRpYyBwdWJsaWMgaW50IEdST1VQX1NFUVVFTkNFID0gMTI7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNUmVmZXJlbmNlTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01SZWZlcmVuY2VOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNzg4ZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01SZWZlcmVuY2VOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQ01SZWZlcmVuY2VOb2RlIGV4dGVuZHMgQ01SZXBlYXRhYmxlTm9kZSB7Ci0JcHJpdmF0ZSBpbnQgdHlwZSA9IENNTm9kZVR5cGUuRUxFTUVOVF9SRUZFUkVOQ0U7Ci0KLQlwdWJsaWMgQ01SZWZlcmVuY2VOb2RlKFN0cmluZyByZWZOYW1lKSB7Ci0JCXRoaXMocmVmTmFtZSwgQ01Ob2RlVHlwZS5FTEVNRU5UX1JFRkVSRU5DRSk7Ci0JfQotCi0JcHVibGljIENNUmVmZXJlbmNlTm9kZShTdHJpbmcgcmVmTmFtZSwgaW50IHR5cGUpIHsKLQkJc3VwZXIocmVmTmFtZSk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIiBSZWZOYW1lOiAiICsgZ2V0TmFtZSgpICsgIiBUeXBlOiAiICsgZ2V0VHlwZSgpICsgIiBPY2NUeXBlOiAiICsgZ2V0T2NjdXJyZW5jZSgpICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNUmVwZWF0YWJsZU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNUmVwZWF0YWJsZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2ZDk2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTVJlcGVhdGFibGVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ01SZXBlYXRhYmxlTm9kZSBleHRlbmRzIENNTm9kZSB7Ci0JcHJpdmF0ZSBpbnQgb2NjVHlwZSA9IENNTm9kZVR5cGUuT05FOwotCi0JcHVibGljIENNUmVwZWF0YWJsZU5vZGUoU3RyaW5nIHJlZk5hbWUpIHsKLQkJc3VwZXIocmVmTmFtZSk7Ci0JfQotCi0JcHVibGljIENNUmVwZWF0YWJsZU5vZGUoU3RyaW5nIHJlZk5hbWUsIGludCBvY2NUeXBlKSB7Ci0JCXN1cGVyKHJlZk5hbWUpOwotCQl0aGlzLm9jY1R5cGUgPSBvY2NUeXBlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0T2NjdXJyZW5jZSgpIHsKLQkJcmV0dXJuIG9jY1R5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2NjdXJyZW5jZShpbnQgb2NjVHlwZSkgewotCQl0aGlzLm9jY1R5cGUgPSBvY2NUeXBlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE1MDliMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIERURCB7Ci0JLy8KLQkvLyBDb25zdGFudHMKLQkvLwotCi0JVmVjdG9yIGV4dGVybmFsRWxlbWVudHMgPSBuZXcgVmVjdG9yKCk7Ci0JU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JYm9vbGVhbiBpc0V4Y2VwdGlvbkR1cmluZ1BhcnNlID0gZmFsc2U7Ci0KLQkvLwotCS8vIENvbnN0cnVjdG9ycwotCS8vCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKi8KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgZmlsZSBuYW1lIG9mIHRoaXMgRFRELgotCSAqIEBzZWUgI2dldE5hbWUKLQkgKiBAc2VlICNzZXROYW1lCi0JICovCi0JcHVibGljIERURChTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBEVEQncyBmaWxlIG5hbWUuCi0JICogCi0JICogQHJldHVybiBUaGlzIERURCdzIGZpbGUgbmFtZSwgb3IgPHZhcj5udWxsPC92YXI+IGlmIG5vIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhpcyBEVEQncyBmaWxlIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoaXMgRFREJ3MgbmFtZS4KLQkgKiBAc2VlICNnZXROYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gRW51bWVyYXRpb24gaW5zdGFuY2Ugb2YgYWxsIGV4dGVybmFsIHN1YnNldCBjaGlsZHJlbiBvZiB0aGlzCi0JICogRFRELgotCSAqIAotCSAqIEByZXR1cm4gQW4gZW51bWVyYXRpb24gb2YgYWxsIGV4dGVybmFsIHN1YnNldCBjaGlsZHJlbiBvZiB0aGlzIERURC4KLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZXh0ZXJuYWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIGV4dGVybmFsRWxlbWVudHMuZWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREZWNsKEJhc2VOb2RlIGRlY2wpIHsKLQkJZXh0ZXJuYWxFbGVtZW50cy5hZGRFbGVtZW50KGRlY2wpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElzRXhjZXB0aW9uRHVyaW5nUGFyc2UoYm9vbGVhbiBvbikgewotCQlpc0V4Y2VwdGlvbkR1cmluZ1BhcnNlID0gb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0SXNFeGNlcHRpb25EdXJpbmdQYXJzZSgpIHsKLQkJcmV0dXJuIGlzRXhjZXB0aW9uRHVyaW5nUGFyc2U7Ci0JfQotCi19IC8vIGNsYXNzIERURApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EVERQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRhNjZhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EVERQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkxhenlVUkxJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5EVERIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgRFREUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBDb250ZW50SGFuZGxlciwgRFRESGFuZGxlciwgRXJyb3JIYW5kbGVyLCBEZWNsSGFuZGxlciwgTGV4aWNhbEhhbmRsZXIgewotCXByaXZhdGUgU3RyaW5nIGNvbnRlbnRTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGRlY2xTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogQ2Fub25pY2FsIG91dHB1dC4gKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5vbmljYWw7Ci0KLQlwcm90ZWN0ZWQgWE1MUmVhZGVyIHJlYWRlcjsKLQlpbnQgZW50aXR5RGVwdGg7Ci0KLQkvLyBkbXcgMTEvMTUgcHJpdmF0ZSBmaWVsZCBuZXZlciByZWFkIGxvY2FsbHkKLQkvLyBwcml2YXRlIFZlY3RvciBkZWNsRWxlbWVudHM7Ci0JcHJpdmF0ZSBTdHJpbmcgY29tbWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBFcnJvck1lc3NhZ2UgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZXJyb3JNZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIERlY2xOb2RlIHByZXZpb3VzRGVjbE5vZGUgPSBudWxsOwotCXByaXZhdGUgRGVjbE5vZGUgY3VycmVudERlY2xOb2RlID0gbnVsbDsKLQlwcml2YXRlIEJhc2VOb2RlIGxhc3RCYXNlTm9kZSA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZW50aXR5RW5kID0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgbGluZU51bWJlcjsKLQotCXByaXZhdGUgRFREIGN1cnJlbnREVEQgPSBudWxsOwotCXByaXZhdGUgVmVjdG9yIGR0ZExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLQlwcml2YXRlIFN0YWNrIGR0ZFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdGFjayBwZVJlZlN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdGFjayBwYXJzaW5nUEVSZWZTdGFjayA9IG5ldyBTdGFjaygpOwotCi0JcHJpdmF0ZSBFbnRpdHlQb29sIGVudGl0eVBvb2wgPSBuZXcgRW50aXR5UG9vbCgpOwotCXByaXZhdGUgU3RyaW5nIGV4cGFuZGVkRW50aXR5VmFsdWUgPSBudWxsOwotCXByaXZhdGUgSGFzaHRhYmxlIGVsZW1lbnRQb29sID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JYm9vbGVhbiBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMgPSB0cnVlOwotCi0JcHJpdmF0ZSBMb2NhdG9yIGxvY2F0b3IgPSBudWxsOwotCi0JcHJpdmF0ZSBMb2NhdG9yIGdldExvY2F0b3IoKSB7Ci0JCXJldHVybiBsb2NhdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGxvY2F0b3IpIHsKLQkJdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKLQl9Ci0KLQlwdWJsaWMgRFREUGFyc2VyKGJvb2xlYW4gY2Fub25pY2FsKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCXRoaXMobnVsbCwgY2Fub25pY2FsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRFREUGFyc2VyKFN0cmluZyBlbmNvZGluZywgYm9vbGVhbiBjYW5vbmljYWwpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQotCQlpZiAoZW5jb2RpbmcgPT0gbnVsbCkKLQkJCWVuY29kaW5nID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCi0JCXRoaXMuY2Fub25pY2FsID0gY2Fub25pY2FsOwotCQl0cnkgewotCQkJU0FYUGFyc2VyIHNwYXJzZXIgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3U0FYUGFyc2VyKCk7Ci0JCQlyZWFkZXIgPSBzcGFyc2VyLmdldFhNTFJlYWRlcigpOwotCQkJcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9kZWNsYXJhdGlvbi1oYW5kbGVyIiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlYWRlci5zZXRDb250ZW50SGFuZGxlcih0aGlzKTsKLQkJCXJlYWRlci5zZXREVERIYW5kbGVyKHRoaXMpOwotCQkJcmVhZGVyLnNldEVycm9ySGFuZGxlcih0aGlzKTsKLQkJCXJlYWRlci5zZXRFbnRpdHlSZXNvbHZlcih0aGlzKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCS8qIFByaW50cyB0aGUgb3V0cHV0IGZyb20gdGhlIFNBWCBjYWxsYmFja3MuICovCi0JcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIGxvZ2ljYWxVUkkpIHsKLQkJdHJ5IHsJCQkKLQkJCS8vIENTIGVuc3VyZSB0aGF0IHRoZSBwaHlzaWNhbCBVUkkgaXMgY29uc2lkZXJlZCB3aGVyZSBzdHJlYW1zIGFyZSByZXF1aXJlZAotCQkJLy8gYW5kIHRoZSBsb2dpY2FsVVJJIGlzIHVzZWQgYXMgdGhlIERURCdzIGJhc2VMb2NhdGlvbgotCQkJU3RyaW5nIHBoeXNpY2FsVVJJID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbigiIiwgIiIsIGxvZ2ljYWxVUkkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWJvb2xlYW4gaXNSZWFkYWJsZSA9IFVSSUhlbHBlci5pc1JlYWRhYmxlVVJJKHBoeXNpY2FsVVJJLCB0cnVlKTsKLQkJCWlmICghaXNSZWFkYWJsZSkgewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkRURCBwYXJzZSBlcnJvci4gQ2FuIG5vdCByZWFkIHRoZSBzcGVjaWZpZWQgVVJJIDogIiArIGxvZ2ljYWxVUkkpOyAvLyROT04tTkxTLTEkCi0JCQl9CQkJCi0JCQlTdHJpbmcgZG9jdW1lbnQgPSAiPCFET0NUWVBFIHJvb3QgU1lTVEVNIFwiIiArIGxvZ2ljYWxVUkkgKyAiXCI+PHJvb3QvPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZW50aXR5RGVwdGggPSAwOwotCQkJY3VycmVudERURCA9IG5ldyBEVEQobG9naWNhbFVSSSk7Ci0JCQlJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKGRvY3VtZW50KSk7Ci0JCQlpbnB1dFNvdXJjZS5zZXRTeXN0ZW1JZChsb2dpY2FsVVJJICsgIi54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVhZGVyLnBhcnNlKGlucHV0U291cmNlKTsKLQkJfQotCQljYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gc2UpIHsKLQkJCWlmIChjdXJyZW50RFREICE9IG51bGwpCi0JCQkJY3VycmVudERURC5zZXRJc0V4Y2VwdGlvbkR1cmluZ1BhcnNlKHRydWUpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKGN1cnJlbnREVEQgIT0gbnVsbCkKLQkJCQljdXJyZW50RFRELnNldElzRXhjZXB0aW9uRHVyaW5nUGFyc2UodHJ1ZSk7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogQGRlcHJlY2F0ZWQgRW50aXR5IHJlZmVyZW5jZXMgYXJlIGFsd2F5cyBleHBhbmRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKGJvb2xlYW4gZXhwYW5kRW50aXR5UmVmZXJlbmNlcykgewotCQl0aGlzLmV4cGFuZEVudGl0eVJlZmVyZW5jZXMgPSB0cnVlOwotCX0KLQotCS8qCi0JICogQGRlcHJlY2F0ZWQgRW50aXR5IHJlZmVyZW5jZXMgYXJlIGFsd2F5cyBleHBhbmRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gZXhwYW5kRW50aXR5UmVmZXJlbmNlczsKLQl9Ci0KLQlwdWJsaWMgVmVjdG9yIGdldERURExpc3QoKSB7Ci0JCXJldHVybiBkdGRMaXN0OwotCX0KLQotCXB1YmxpYyBIYXNodGFibGUgZ2V0RWxlbWVudFBvb2woKSB7Ci0JCXJldHVybiBlbGVtZW50UG9vbDsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5UG9vbCBnZXRFbnRpdHlQb29sKCkgewotCQlyZXR1cm4gZW50aXR5UG9vbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRFcnJvck1lc3NhZ2VzKCkgewotCQlyZXR1cm4gZXJyb3JNZXNzYWdlczsKLQl9Ci0KLQkvLwotCS8vIERvY3VtZW50SGFuZGxlciBtZXRob2RzCi0JLy8KLQotCXB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB7Ci0JfQotCi0JLy8KLQkvLyBEVERIYW5kbGVyIG1ldGhvZHMKLQkvLwotCi0JcHVibGljIHZvaWQgdW5wYXJzZWRFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIG5vdGF0aW9uTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90YXRpb25EZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0RGVjbGFyYXRpb24oRGVjbE5vZGUuTk9UQVRJT04pOwotCQlkZWNsU3RyaW5nID0gIjwhTk9UQVRJT04iOyAvLyROT04tTkxTLTEkCi0JCWlmIChlbnRpdHlEZXB0aCA9PSAxIHx8IHBhcnNpbmdFeHRlcm5hbFBFUmVmZXJlbmNlKSB7Ci0JCQlTdHJpbmcgeHMgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCXhzICs9IG5hbWU7Ci0JCQlpZiAocHVibGljSWQgPT0gbnVsbCkKLQkJCQl4cyArPSAiIFNZU1RFTSAiICsgIlwiIiArIHN5c3RlbUlkICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCWVsc2UKLQkJCQl4cyArPSAiIFBVQkxJQyAiICsgIlwiIiArIHB1YmxpY0lkICsgIlwiICIgKyAiXCIiICsgc3lzdGVtSWQgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCWNvbnRlbnRTdHJpbmcgKz0geHM7Ci0JCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbigpOwotCQl9Ci0JfQotCi0JLy8KLQkvLyBEZWNsSGFuZGxlciBtZXRob2RzCi0JLy8KLQotCXB1YmxpYyB2b2lkIGVsZW1lbnREZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgbW9kZWwpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlzdGFydERlY2xhcmF0aW9uKERlY2xOb2RlLkVMRU1FTlQpOwotCQlkZWNsU3RyaW5nID0gIjwhRUxFTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBLQjogV2l0aCBlYXJseSB2ZXJzaW9ucyBvZiBYZXJjZXMgMi54LCBzdGFydEVudGl0eSgiW2R0ZF0iKSB1c2VkIHRvCi0JCS8vIGJlIGNhbGxlZCBiZWZvcmUgdGhpcyBtZXRob2QKLQkJLy8gc28gZW50aXR5RGVwdGggd2FzIDEuIFVzaW5nIEpBWFAgY2hhbmdlZCB0aGF0IGFuZCBzdGFydEVudGl0eSgpIGlzCi0JCS8vIG5vdCBjYWxsZWQgYmFjayBhbnltb3JlLgotCQkvLyBCZWNhdXNlIG9mIHRoaXMsIHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGVudGl0eURlcHRoID09IDAKLQkJLy8gYXMgd2VsbC4KLQkJaWYgKGVudGl0eURlcHRoID09IDAgfHwgZW50aXR5RGVwdGggPT0gMSB8fCBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkKLQkJCXBhcnNlQ3VycmVudERlY2xhcmF0aW9uSGVscGVyKG5hbWUgKyAiICIgKyBtb2RlbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgdm9pZCBhdHRyaWJ1dGVEZWNsKFN0cmluZyBlTmFtZSwgU3RyaW5nIGFOYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZhbHVlRGVmYXVsdCwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5BVFRMSVNUKTsKLQkJZGVjbFN0cmluZyA9ICI8IUFUVExJU1QiOyAvLyROT04tTkxTLTEkCi0KLQkJYXR0cmlidXRlU3RyaW5nICs9ICIgIiArIGFOYW1lOyAvLyROT04tTkxTLTEkCi0JCWlmICh0eXBlICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVTdHJpbmcgKz0gIiAiICsgdHlwZTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodmFsdWVEZWZhdWx0ICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVTdHJpbmcgKz0gIiAiICsgdmFsdWVEZWZhdWx0OyAvLyROT04tTkxTLTEkCi0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJYXR0cmlidXRlU3RyaW5nICs9ICIgJyIgKyB2YWx1ZSArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJYXR0cmlidXRlU3RyaW5nID0gZU5hbWUgKyAiICIgKyBhdHRyaWJ1dGVTdHJpbmcgKyAiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbkhlbHBlcihhdHRyaWJ1dGVTdHJpbmcpOwotCQlhdHRyaWJ1dGVTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGludGVybmFsRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5JTlRFUk5BTF9FTlRJVFkpOwotCQlkZWNsU3RyaW5nID0gIjwhRU5USVRZIjsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChlbnRpdHlEZXB0aCA9PSAxIHx8IHBhcnNpbmdFeHRlcm5hbFBFUmVmZXJlbmNlKSB7Ci0JCQkvLyBidWlsZCB1cCBhIHN0cmluZzogZS5nLiAiICUgU1RSRE9NICIoI1BDREFUQSkiPiIKLQkJCVN0cmluZyB4cyA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl4cyArPSAiJSAiOyAvLyROT04tTkxTLTEkCi0JCQkJeHMgKz0gbmFtZS5zdWJzdHJpbmcoMSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJeHMgKz0gbmFtZTsKLQotCQkJeHMgKz0gIiBcIiIgKyB2YWx1ZSArICJcIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJY29udGVudFN0cmluZyArPSB4czsKLQkJCS8vIHNhdmUgZXhwYW5kZWQgZW50aXR5IHZhbHVlCi0JCQlleHBhbmRlZEVudGl0eVZhbHVlID0gdmFsdWU7Ci0JCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbigpOwotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBleHRlcm5hbEVudGl0eURlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5FWFRFUk5BTF9FTlRJVFkpOwotCQlkZWNsU3RyaW5nID0gIjwhRU5USVRZIjsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChlbnRpdHlEZXB0aCA9PSAxIHx8IHBhcnNpbmdFeHRlcm5hbFBFUmVmZXJlbmNlKSB7Ci0JCQkvLyBidWlsZCB1cCBhIHN0cmluZzoKLQkJCS8vIGV4MSkgIiAlIEZJRUxEIFNZU1RFTSAib2FnaXNfZmllbGRzLmR0ZCI+IgotCQkJLy8gZXgyKSAiICUgRklFTEQgUFVCTElDICJGT08iPiIKLQkJCVN0cmluZyB4cyA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl4cyArPSAiJSAiOyAvLyROT04tTkxTLTEkCi0JCQkJeHMgKz0gbmFtZS5zdWJzdHJpbmcoMSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJeHMgKz0gbmFtZTsKLQotCQkJaWYgKHN5c3RlbUlkICE9IG51bGwpCi0JCQkJeHMgKz0gIiBTWVNURU0gXCIiICsgc3lzdGVtSWQgKyAiXCI+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQllbHNlIGlmIChwdWJsaWNJZCAhPSBudWxsKQotCQkJCXhzICs9ICIgUFVCTElDIFwiIiArIHB1YmxpY0lkICsgIlwiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQljb250ZW50U3RyaW5nICs9IHhzOwotCQkJcGFyc2VDdXJyZW50RGVjbGFyYXRpb24oKTsKLQkJfQotCX0KLQotCS8vCi0JLy8gTGV4aWNhbEhhbmRsZXIgbWV0aG9kcwotCS8vCi0KLQlwdWJsaWMgdm9pZCBzdGFydENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kQ0RBVEEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydERURChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlkdGRMaXN0LnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0JCWR0ZExpc3QuYWRkRWxlbWVudChjdXJyZW50RFREKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgdGhlIGVuZCBvZiBEVEQgZGVjbGFyYXRpb25zLgotCSAqIAotCSAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIG1heSByYWlzZSBhbiBleGNlcHRpb24uCi0JICogQHNlZSAjc3RhcnREVEQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmREVEQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5FTkRfRFREKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgdGhlIGJlZ2lubmluZyBvZiBhbiBlbnRpdHkuCi0JICogCi0JICogVGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGRvY3VtZW50IGVudGl0eSBhcmUgbm90IHJlcG9ydGVkLiBUaGUgc3RhcnQKLQkgKiBhbmQgZW5kIG9mIHRoZSBleHRlcm5hbCBEVEQgc3Vic2V0IGFyZSByZXBvcnRlZCB1c2luZyB0aGUgcHNldWRvLW5hbWUKLQkgKiAiW2R0ZF0iLiBBbGwgb3RoZXIgZXZlbnRzIG11c3QgYmUgcHJvcGVybHkgbmVzdGVkIHdpdGhpbiBzdGFydC9lbmQKLQkgKiBlbnRpdHkgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZW50aXR5LiBJZiBpdCBpcyBhIHBhcmFtZXRlciBlbnRpdHksIHRoZQotCSAqICAgICAgICAgICAgbmFtZSB3aWxsIGJlZ2luIHdpdGggJyUnLgotCSAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIG1heSByYWlzZSBhbiBleGNlcHRpb24uCi0JICogQHNlZSAjZW5kRW50aXR5Ci0JICovCi0KLQlwdWJsaWMgdm9pZCBzdGFydEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChuYW1lLmVxdWFscygiW2R0ZF0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlzdGFydERlY2xhcmF0aW9uKERlY2xOb2RlLlNUQVJUX0VOVElUWV9EVEQpOwotCQl9Ci0JCWVsc2UgaWYgKGN1cnJlbnREZWNsTm9kZSA9PSBudWxsKSB7Ci0JCQkvLyBQRSByZWZlcmVuY2UgaW4gbWFya3VwZGVjbCBzZWN0aW9uCi0JCQlpZiAobmFtZS5zdGFydHNXaXRoKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBwZU5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTsKLQkJCQlFbnRpdHlEZWNsIGVuID0gZW50aXR5UG9vbC5yZWZlclBhcmEocGVOYW1lKTsKLQotCQkJCXBlUmVmU3RhY2sucHVzaChuYW1lKTsKLQkJCQlwYXJzaW5nUEVSZWZTdGFjay5wdXNoKG5ldyBCb29sZWFuKHBhcnNpbmdFeHRlcm5hbFBFUmVmZXJlbmNlKSk7Ci0KLQkJCQlTdHJpbmcgc3lzdGVtSWQgPSBlbi5nZXRTeXN0ZW1JZCgpOwotCQkJCVN0cmluZyBwdWJsaWNJZCA9IGVuLmdldFB1YmxpY0lkKCk7Ci0JCQkJaWYgKHN5c3RlbUlkID09IG51bGwpIHsKLQkJCQkJcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVVSSVJlc29sdmVyIGlkUmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOwotCQkJCQlTdHJpbmcgdXJpID0gaWRSZXNvbHZlci5yZXNvbHZlKGN1cnJlbnREVEQuZ2V0TmFtZSgpLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQkJCQlpZiAoIWlzRFRETG9hZGVkKHVyaSkpIHsKLQkJCQkJCS8vIG5vdCBsb2FkZWQKLQkJCQkJCS8vIG91dC5wcmludGxuKCIgRFREIG5vdCBsb2FkZWQgLi4gY3JlYXRlIG5ldyBEVEQ6ICIKLQkJCQkJCS8vICk7Ci0JCQkJCQlkdGRTdGFjay5wdXNoKGN1cnJlbnREVEQpOwotCQkJCQkJRFREIG5ld0RURCA9IG5ldyBEVEQodXJpKTsKLQkJCQkJCWR0ZExpc3QuYWRkRWxlbWVudChuZXdEVEQpOwotCQkJCQkJY3VycmVudERURCA9IG5ld0RURDsKLQkJCQkJCXBhcnNpbmdFeHRlcm5hbFBFUmVmZXJlbmNlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIG91dC5wcmludGxuKCIgRFREIGFscmVhZHkgbG9hZGVkIC4uICIgKTsKLQkJCQkJCXBhcnNpbmdFeHRlcm5hbFBFUmVmZXJlbmNlID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZW50aXR5RGVwdGggPT0gMSB8fCBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkgewotCQkJU3RyaW5nIHhzID0gKFN0cmluZykgcmVhZGVyLmdldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy94bWwtc3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNvbnRlbnRTdHJpbmcgKz0geHM7Ci0JCX0KLQkJZW50aXR5RGVwdGgrKzsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgdGhlIGVuZCBvZiBhbiBlbnRpdHkuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBlbmRpbmcuCi0JICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KLQkgKiBAc2VlICNzdGFydEVudGl0eQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChuYW1lLmVxdWFscygiW2R0ZF0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlzdGFydERlY2xhcmF0aW9uKERlY2xOb2RlLkVORF9FTlRJVFlfRFREKTsKLQkJfQotCQllbHNlIGlmICghcGVSZWZTdGFjay5lbXB0eSgpKSB7Ci0JCQlwYXJzZUV4dGVybmFsUEVSZWZlcmVuY2UobmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAoZW50aXR5RGVwdGggPT0gMSB8fCBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkgewotCQkJaWYgKCFjb250ZW50U3RyaW5nLmVuZHNXaXRoKG5hbWUgKyAiOyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgeHMgPSAoU3RyaW5nKSByZWFkZXIuZ2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL3htbC1zdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRlbnRTdHJpbmcgKz0geHM7Ci0JCQl9Ci0JCX0KLQkJZW50aXR5RGVwdGgtLTsKLQkJZW50aXR5RW5kID0gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZUV4dGVybmFsUEVSZWZlcmVuY2UoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKCFwZVJlZlN0YWNrLmVtcHR5KCkpIHsKLQkJCWlmICgoKFN0cmluZykgcGVSZWZTdGFjay5wZWVrKCkpLmVxdWFscyhuYW1lKSkgewotCQkJCXBlUmVmU3RhY2sucG9wKCk7Ci0JCQkJaWYgKHBhcnNpbmdFeHRlcm5hbFBFUmVmZXJlbmNlKSB7Ci0JCQkJCWN1cnJlbnREVEQgPSAoRFREKSBkdGRTdGFjay5wb3AoKTsKLQkJCQkJYWRkUEVSZWZlcmVuY2VOb2RlKG5hbWUpOwotCQkJCX0KLQkJCQlwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSA9ICgoQm9vbGVhbikgcGFyc2luZ1BFUmVmU3RhY2sucG9wKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYW4gWE1MIGNvbW1lbnQgYW55d2hlcmUgaW4gdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSB1c2VkIGZvciBjb21tZW50cyBpbnNpZGUgb3Igb3V0c2lkZSB0aGUgZG9jdW1lbnQKLQkgKiBlbGVtZW50LCBpbmNsdWRpbmcgY29tbWVudHMgaW4gdGhlIGV4dGVybmFsIERURCBzdWJzZXQgKGlmIHJlYWQpLgotCSAqIAotCSAqIEBwYXJhbSBjaAotCSAqICAgICAgICAgICAgQW4gYXJyYXkgaG9sZGluZyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgY29tbWVudC4KLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiAgICAgICAgICAgIFRoZSBzdGFydGluZyBwb3NpdGlvbiBpbiB0aGUgYXJyYXkuCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZSBmcm9tIHRoZSBhcnJheS4KLQkgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbW1lbnQoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlzdGFydERlY2xhcmF0aW9uKERlY2xOb2RlLkNPTU1FTlQpOwotCi0JCWlmIChjb21tZW50ID09IG51bGwpCi0JCQljb21tZW50ID0gbmV3IFN0cmluZyhjaCwgc3RhcnQsIGxlbmd0aCk7Ci0JCWVsc2UKLQkJCWNvbW1lbnQgKz0gIlxuIiArIG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpOyAvLyBhcHBlbmQgYWxsIGNvbW1lbnRzLiAvLyROT04tTkxTLTEkCi0JCS8vIFRoZSBjb21tZW50IHdpbGwgZ2V0IHJlc2V0IGFmdGVyCi0JCS8vIGl0IGhhcyBiZWVuIGF0dGFjaGVkIHRvIHRoZSBmb2xsb3dpbmcKLQkJLy8gZGVjbGFyYXRpb24uCi0JfQotCi0JLy8KLQkvLyBFcnJvckhhbmRsZXIgbWV0aG9kcwotCS8vCi0KLQkvKiBXYXJuaW5nLiAqLwotCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKLQkJU3RyaW5nIGVycm9yID0gIltTb3VyY2UgTGluZV0gIiArIGRlY2xTdHJpbmcgKyBjb250ZW50U3RyaW5nICsgIlxuIjsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWVycm9yICs9ICJbV2FybmluZyAgICBdICIgKyBnZXRMb2NhdGlvblN0cmluZyhleCkgKyAiOiAiICsgZXguZ2V0TWVzc2FnZSgpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJc2V0RXJyb3JJbmZvcm1hdGlvbihleCwgIndhcm5pbmciKTsgLy8kTk9OLU5MUy0xJAotCi0JCXBhcnNlQ3VycmVudERlY2xhcmF0aW9uKCk7Ci0JfQotCi0JLyogRXJyb3IuICovCi0JcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKLQkJU3RyaW5nIGVycm9yID0gIltTb3VyY2UgTGluZV0gIiArIGRlY2xTdHJpbmcgKyBjb250ZW50U3RyaW5nICsgIlxuIjsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWVycm9yICs9ICJbRXJyb3IgICBdICIgKyBnZXRMb2NhdGlvblN0cmluZyhleCkgKyAiOiAiICsgZXguZ2V0TWVzc2FnZSgpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJc2V0RXJyb3JJbmZvcm1hdGlvbihleCwgImVycm9yIik7IC8vJE5PTi1OTFMtMSQKLQotCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbigpOwotCX0KLQotCS8qIEZhdGFsIGVycm9yLiAqLwotCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlTdHJpbmcgZXJyb3IgPSAiW1NvdXJjZSBMaW5lXSAiICsgZGVjbFN0cmluZyArIGNvbnRlbnRTdHJpbmcgKyAiXG4iOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJZXJyb3IgKz0gIltGYXRhbCBFcnJvcl0gIiArIGdldExvY2F0aW9uU3RyaW5nKGV4KSArICI6ICIgKyBleC5nZXRNZXNzYWdlKCk7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQlzZXRFcnJvckluZm9ybWF0aW9uKGV4LCAiZmF0YWwiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXBhcnNlQ3VycmVudERlY2xhcmF0aW9uKCk7Ci0JfQotCi0JLyogUmV0dXJucyBhIHN0cmluZyBvZiB0aGUgbG9jYXRpb24uICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYXRpb25TdHJpbmcoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKLQkJU3RyaW5nQnVmZmVyIHN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlTdHJpbmcgc3lzdGVtSWQgPSBleC5nZXRTeXN0ZW1JZCgpOwotCQlpZiAoc3lzdGVtSWQgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gc3lzdGVtSWQubGFzdEluZGV4T2YoJy8nKTsKLQkJCWlmIChpbmRleCAhPSAtMSkKLQkJCQlzeXN0ZW1JZCA9IHN5c3RlbUlkLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJc3RyLmFwcGVuZChzeXN0ZW1JZCk7Ci0JCX0KLQkJc3RyLmFwcGVuZCgnOicpOwotCQlzdHIuYXBwZW5kKGV4LmdldExpbmVOdW1iZXIoKSk7Ci0JCXN0ci5hcHBlbmQoJzonKTsKLQkJc3RyLmFwcGVuZChleC5nZXRDb2x1bW5OdW1iZXIoKSk7Ci0KLQkJcmV0dXJuIHN0ci50b1N0cmluZygpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0RGVjbGFyYXRpb24oaW50IHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gRGVjbE5vZGUuRU5EX0RURCB8fCB0eXBlID09IERlY2xOb2RlLkVORF9FTlRJVFlfRFREIHx8IHR5cGUgPT0gRGVjbE5vZGUuQ09NTUVOVCB8fCB0eXBlID09IERlY2xOb2RlLkVSUk9SKSB7Ci0JCQlwcmV2aW91c0RlY2xOb2RlID0gY3VycmVudERlY2xOb2RlOwotCQkJY3VycmVudERlY2xOb2RlID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCWN1cnJlbnREZWNsTm9kZSA9IG5ldyBEZWNsTm9kZSh0eXBlKTsKLQkJCWNvbnRlbnRTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZGVjbFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlleHBhbmRlZEVudGl0eVZhbHVlID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUN1cnJlbnREZWNsYXJhdGlvbigpIHsKLQkJcGFyc2VDdXJyZW50RGVjbGFyYXRpb25IZWxwZXIoY29udGVudFN0cmluZyk7Ci0JCWNvbnRlbnRTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUN1cnJlbnREZWNsYXJhdGlvbkhlbHBlcihTdHJpbmcgZGVjbGFyYXRpb25TdHJpbmcpIHsKLQkJRFREU2Nhbm5lciBzY2FubmVyOwotCQlTdHJpbmcgbmFtZTsKLQotCQlpZiAoY3VycmVudERlY2xOb2RlID09IG51bGwgJiYgcHJldmlvdXNEZWNsTm9kZSAhPSBudWxsICYmIGVudGl0eUVuZCkgewotCQkJY3VycmVudERlY2xOb2RlID0gcHJldmlvdXNEZWNsTm9kZTsKLQkJfQotCi0JCS8vIHNhdmUgdGhlIHByZXZpb3VzIGRlY2xOb2RlCi0JCWlmIChjdXJyZW50RGVjbE5vZGUgIT0gbnVsbCkgewotCQkJQmFzZU5vZGUgYmFzZU5vZGUgPSBudWxsOwotCQkJLy8gc3RyaXAgb3V0IHRoZSBlbmRpbmcgbWFya3VwIHN5bWJvbCAiPiIKLQkJCWlmIChkZWNsYXJhdGlvblN0cmluZy5lbmRzV2l0aCgiPiIpKSAvLyROT04tTkxTLTEkCi0JCQkJZGVjbGFyYXRpb25TdHJpbmcgPSBkZWNsYXJhdGlvblN0cmluZy5zdWJzdHJpbmcoMCwgZGVjbGFyYXRpb25TdHJpbmcubGVuZ3RoKCkgLSAxKTsKLQotCQkJaW50IHNJbmRleDsKLQkJCVN0cmluZyBjU3RyaW5nOwotCQkJaW50IHR5cGUgPSBjdXJyZW50RGVjbE5vZGUuZ2V0VHlwZSgpOwotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQkJY2FzZSBEZWNsTm9kZS5FTEVNRU5UIDogewotCQkJCQluYW1lID0gVFN0cmluZy53b3JkKGRlY2xhcmF0aW9uU3RyaW5nLCAxKTsKLQotCQkJCQkvLyBzdHJpcCBvdXQgdGhlIG5hbWUKLQkJCQkJc0luZGV4ID0gZGVjbGFyYXRpb25TdHJpbmcuaW5kZXhPZihuYW1lKSArIG5hbWUubGVuZ3RoKCk7Ci0JCQkJCWNTdHJpbmcgPSBkZWNsYXJhdGlvblN0cmluZy5zdWJzdHJpbmcoc0luZGV4KTsKLQotCQkJCQliYXNlTm9kZSA9IG5ldyBFbGVtZW50RGVjbChuYW1lLCBjdXJyZW50RFRELmdldE5hbWUoKSk7Ci0JCQkJCXNjYW5uZXIgPSBuZXcgRFREU2Nhbm5lcihjdXJyZW50RFRELmdldE5hbWUoKSwgY1N0cmluZyk7Ci0JCQkJCUNNTm9kZSBjb250ZW50TW9kZWwgPSBzY2FubmVyLnNjYW5Db250ZW50TW9kZWwoKTsKLQkJCQkJaWYgKGNvbnRlbnRNb2RlbCA9PSBudWxsICYmIGVycm9yTWVzc2FnZSA9PSBudWxsKSB7Ci0JCQkJCQljcmVhdGVFcnJvck1lc3NhZ2UoIkV4cGVjdGluZyAnKCcgaW4gY29udGVudCBtb2RlbCIsICJlcnJvciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCi0JCQkJCSgoRWxlbWVudERlY2wpIGJhc2VOb2RlKS5zZXRDb250ZW50TW9kZWxOb2RlKGNvbnRlbnRNb2RlbCk7Ci0JCQkJCWVsZW1lbnRQb29sLnB1dChuYW1lLCBiYXNlTm9kZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIERlY2xOb2RlLklOVEVSTkFMX0VOVElUWSA6Ci0JCQkJY2FzZSBEZWNsTm9kZS5FWFRFUk5BTF9FTlRJVFkgOiB7Ci0JCQkJCWlmICghcGFyc2VFeHRlcm5hbFBFUmVmZXJlbmNlKGRlY2xhcmF0aW9uU3RyaW5nKSkgewotCQkJCQkJc2Nhbm5lciA9IG5ldyBEVERTY2FubmVyKGN1cnJlbnREVEQuZ2V0TmFtZSgpLCBkZWNsYXJhdGlvblN0cmluZyk7Ci0JCQkJCQliYXNlTm9kZSA9IHNjYW5uZXIuc2NhbkVudGl0eURlY2woKTsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLWJhc2VOb2RlICgiICsKLQkJCQkJCS8vIGRlY2xhcmF0aW9uU3RyaW5nICsgIikiICsgYmFzZU5vZGUpOwotCQkJCQkJaWYgKHR5cGUgPT0gRGVjbE5vZGUuSU5URVJOQUxfRU5USVRZICYmIGV4cGFuZGVkRW50aXR5VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCSgoRW50aXR5RGVjbCkgYmFzZU5vZGUpLmV4cGFuZGVkVmFsdWUgPSBleHBhbmRlZEVudGl0eVZhbHVlOwotCQkJCQkJfQotCQkJCQkJaWYgKGJhc2VOb2RlICE9IG51bGwpIHsKLQkJCQkJCQllbnRpdHlQb29sLmFkZCgoRW50aXR5RGVjbCkgYmFzZU5vZGUpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgRGVjbE5vZGUuTk9UQVRJT04gOiB7Ci0JCQkJCXNjYW5uZXIgPSBuZXcgRFREU2Nhbm5lcihjdXJyZW50RFRELmdldE5hbWUoKSwgZGVjbGFyYXRpb25TdHJpbmcpOwotCQkJCQliYXNlTm9kZSA9IHNjYW5uZXIuc2Nhbk5vdGF0aW9uRGVjbCgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBEZWNsTm9kZS5BVFRMSVNUIDogewotCQkJCQluYW1lID0gVFN0cmluZy53b3JkKGRlY2xhcmF0aW9uU3RyaW5nLCAxKTsKLQotCQkJCQkvLyBzdHJpcCBvdXQgdGhlIG5hbWUKLQkJCQkJc0luZGV4ID0gZGVjbGFyYXRpb25TdHJpbmcuaW5kZXhPZihuYW1lKSArIG5hbWUubGVuZ3RoKCk7Ci0JCQkJCWNTdHJpbmcgPSBkZWNsYXJhdGlvblN0cmluZy5zdWJzdHJpbmcoc0luZGV4KTsKLQotCQkJCQliYXNlTm9kZSA9IG5ldyBBdHRsaXN0KG5hbWUsIGN1cnJlbnREVEQuZ2V0TmFtZSgpKTsKLQkJCQkJc2Nhbm5lciA9IG5ldyBEVERTY2FubmVyKGN1cnJlbnREVEQuZ2V0TmFtZSgpLCBjU3RyaW5nLnRyaW0oKSk7Ci0JCQkJCVZlY3RvciBhdHRycyA9IHNjYW5uZXIuc2NhbkF0dGxpc3REZWNsKGVudGl0eVBvb2wpOwotCQkJCQlTdHJpbmcgZXJyb3JTdHJpbmcgPSBzY2FubmVyLmdldEVycm9yU3RyaW5nKCk7Ci0KLQkJCQkJaWYgKGF0dHJzLnNpemUoKSA+IDApIHsKLQkJCQkJCSgoQXR0bGlzdCkgYmFzZU5vZGUpLnNldEF0dERlZnMoYXR0cnMpOwotCQkJCQl9Ci0JCQkJCWlmIChlcnJvclN0cmluZyAhPSBudWxsKSB7Ci0JCQkJCQljcmVhdGVFcnJvck1lc3NhZ2UoZXJyb3JTdHJpbmcsICJlcnJvciIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWRlZmF1bHQgOiB7Ci0JCQkJCWN1cnJlbnREZWNsTm9kZSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoYmFzZU5vZGUgIT0gbnVsbCkgewotCQkJCWlmIChjb21tZW50ICE9IG51bGwpIHsKLQkJCQkJYmFzZU5vZGUuc2V0Q29tbWVudChjb21tZW50KTsKLQkJCQkJY29tbWVudCA9IG51bGw7Ci0JCQkJfQotCi0JCQkJaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCWJhc2VOb2RlLnNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQkJCQllcnJvck1lc3NhZ2UgPSBudWxsOwotCQkJCX0KLQotCQkJCWlmIChjdXJyZW50RGVjbE5vZGUgIT0gbnVsbCkgewotCQkJCQljdXJyZW50RFRELmFkZERlY2woYmFzZU5vZGUpOwotCQkJCX0KLQkJCQlsYXN0QmFzZU5vZGUgPSBiYXNlTm9kZTsKLQkJCX0KLQotCQkJY3VycmVudERlY2xOb2RlID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChsYXN0QmFzZU5vZGUgIT0gbnVsbCAmJiBlcnJvck1lc3NhZ2UgIT0gbnVsbCAmJiBsYXN0QmFzZU5vZGUuZ2V0RXJyb3JNZXNzYWdlKCkgPT0gbnVsbCkgewotCQkJCWxhc3RCYXNlTm9kZS5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJCQllcnJvck1lc3NhZ2UgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFBFUmVmZXJlbmNlTm9kZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZS5zdGFydHNXaXRoKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOyAvLyBzdHJpcCBvdXQgdGhlICUgZnJvbSBlbnRpdHkgbmFtZQotCQl9Ci0JCUVudGl0eURlY2wgZSA9IG5ldyBFbnRpdHlEZWNsKG5hbWUsIGN1cnJlbnREVEQuZ2V0TmFtZSgpLCBudWxsLCB0cnVlKTsKLQkJZS5zZXRFbnRpdHlSZWZlcmVuY2VkKHRydWUpOwotCQllLnNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQllcnJvck1lc3NhZ2UgPSBudWxsOwotCQljdXJyZW50RFRELmFkZERlY2woZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRFRETG9hZGVkKFN0cmluZyB1cmkpIHsKLQkJYm9vbGVhbiBsb2FkZWQgPSBmYWxzZTsKLQkJU3RyaW5nIGxpc3QgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZHRkTGlzdCAhPSBudWxsKSB7Ci0JCQlFbnVtZXJhdGlvbiBlbiA9IGR0ZExpc3QuZWxlbWVudHMoKTsKLQkJCXdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCURURCBkdGQgPSAoRFREKSBlbi5uZXh0RWxlbWVudCgpOwotCQkJCWxpc3QgKz0gZHRkLmdldE5hbWUoKTsKLQkJCQlsaXN0ICs9ICIsIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChkdGQuZ2V0TmFtZSgpLmVxdWFscyh1cmkpKSB7Ci0JCQkJCWxvYWRlZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbG9hZGVkOwotCX0KLQotCXB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJSW5wdXRTb3VyY2UgcmVzdWx0ID0gbnVsbDsKLQkJVVJJUmVzb2x2ZXIgaWRSZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0JCVN0cmluZyBsb2dpY2FsVVJJID0gaWRSZXNvbHZlci5yZXNvbHZlKGN1cnJlbnREVEQuZ2V0TmFtZSgpLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgICAgICAvLyBidWcgMTEzNTM3LCBlbnN1cmUgcGh5c2ljYWwgcmVzb2x1dGlvbiBnZXRzIGRvbmUgaGVyZQotCQkvLyByaWdodCBiZWZvcmUgd2UgYXR0ZW1wdCB0byBvcGVuIGEgc3RyZWFtCi0JCVN0cmluZyBwaHlzaWNhbFVSSSA9IGlkUmVzb2x2ZXIucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oY3VycmVudERURC5nZXROYW1lKCksIHB1YmxpY0lkLCBsb2dpY2FsVVJJKTsKLQkJcmVzdWx0ID0gbmV3IElucHV0U291cmNlKGxvZ2ljYWxVUkkpOwotCQlpZighKHBoeXNpY2FsVVJJID09IG51bGwgfHwgcGh5c2ljYWxVUkkuZXF1YWxzKCIiKSB8fCBVUklIZWxwZXIuaGFzUHJvdG9jb2wocGh5c2ljYWxVUkkpKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCSAgcGh5c2ljYWxVUkkgPSAiZmlsZTovLy8iICsgcGh5c2ljYWxVUkk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXN1bHQuc2V0Qnl0ZVN0cmVhbShuZXcgTGF6eVVSTElucHV0U3RyZWFtKHBoeXNpY2FsVVJJKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8KLQkvLyBNYWluCi0JLy8KLQotCS8qKiBNYWluIHByb2dyYW0gZW50cnkgcG9pbnQuICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotCi0JCS8vIGlzIHRoZXJlIGFueXRoaW5nIHRvIGRvPwotCQlpZiAoYXJndi5sZW5ndGggPT0gMCkgewotCQkJcHJpbnRVc2FnZSgpOwotCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCX0KLQotCQkvLyB2YXJzCi0JCWJvb2xlYW4gY2Fub25pY2FsID0gZmFsc2U7Ci0JCWJvb2xlYW4gZXhwYW5kRW50aXR5UmVmZXJlbmNlcyA9IGZhbHNlOwotCQlEVERQYXJzZXIgcGFyc2VyOwotCi0JCS8vIGNoZWNrIHBhcmFtZXRlcnMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgYXJnID0gYXJndltpXTsKLQotCQkJLy8gb3B0aW9ucwotCQkJaWYgKGFyZy5zdGFydHNXaXRoKCItIikpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQkJaWYgKGFyZy5lcXVhbHMoIi1jIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQljYW5vbmljYWwgPSB0cnVlOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoYXJnLmVxdWFscygiLXgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWV4cGFuZEVudGl0eVJlZmVyZW5jZXMgPSB0cnVlOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoYXJnLmVxdWFscygiLWgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXByaW50VXNhZ2UoKTsKLQkJCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCQkJfQotCQkJfQotCQkJdHJ5IHsKLQkJCQlwYXJzZXIgPSBuZXcgRFREUGFyc2VyKGNhbm9uaWNhbCk7Ci0JCQkJcGFyc2VyLnNldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoZXhwYW5kRW50aXR5UmVmZXJlbmNlcyk7Ci0JCQkJcGFyc2VyLnBhcnNlKGFyZyk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQl9IC8vIG1haW4oU3RyaW5nW10pCi0KLQkvKiogUHJpbnRzIHRoZSB1c2FnZS4gKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VXNhZ2UoKSB7Ci0KLQkJU3lzdGVtLmVyci5wcmludGxuKCJ1c2FnZTogamF2YSBzYXguRFREUGFyc2VyIChvcHRpb25zKSB1cmkgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLmVyci5wcmludGxuKCk7Ci0JCVN5c3RlbS5lcnIucHJpbnRsbigib3B0aW9uczoiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAgLWMgICAgICAgQ2Fub25pY2FsIFhNTCBvdXRwdXQuIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLmVyci5wcmludGxuKCIgIC14ICAgICAgIEV4cGFuZCBlbnRpdHkgcmVmZXJlbmNlcy4iKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAgLWggICAgICAgVGhpcyBoZWxwIHNjcmVlbi4iKTsgLy8kTk9OLU5MUy0xJAotCi0JfSAvLyBwcmludFVzYWdlKCkKLQotCXByaXZhdGUgdm9pZCBzZXRFcnJvckluZm9ybWF0aW9uKFNBWFBhcnNlRXhjZXB0aW9uIGV4LCBTdHJpbmcgc2V2ZXJpdHkpIHsKLQkJZXJyb3JNZXNzYWdlID0gbmV3IEVycm9yTWVzc2FnZSgpOwotCi0JCWlmIChleC5nZXRMaW5lTnVtYmVyKCkgPT0gLTEpIHsKLQkJCWVycm9yTWVzc2FnZS5zZXRFcnJvckxpbmUobGluZU51bWJlcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQllcnJvck1lc3NhZ2Uuc2V0RXJyb3JMaW5lKGV4LmdldExpbmVOdW1iZXIoKSk7Ci0JCX0KLQotCi0JCWVycm9yTWVzc2FnZS5zZXRFcnJvck1lc3NhZ2UoZXguZ2V0TWVzc2FnZSgpKTsKLQkJZXJyb3JNZXNzYWdlLnNldEVycm9yQ29sdW1uKGV4LmdldENvbHVtbk51bWJlcigpKTsKLQkJZXJyb3JNZXNzYWdlLnNldFNldmVyaXR5KHNldmVyaXR5KTsKLQkJZXJyb3JNZXNzYWdlcy5hZGQoZXJyb3JNZXNzYWdlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRXJyb3JNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgc2V2ZXJpdHkpIHsKLQkJZXJyb3JNZXNzYWdlID0gbmV3IEVycm9yTWVzc2FnZSgpOwotCi0JCUxvY2F0b3IgbG9jYXRvciA9IGdldExvY2F0b3IoKTsKLQotCQllcnJvck1lc3NhZ2Uuc2V0RXJyb3JMaW5lKGxvY2F0b3IuZ2V0TGluZU51bWJlcigpKTsKLQkJZXJyb3JNZXNzYWdlLnNldEVycm9yQ29sdW1uKGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkpOwotCi0JCWVycm9yTWVzc2FnZS5zZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0JCWVycm9yTWVzc2FnZS5zZXRTZXZlcml0eShzZXZlcml0eSk7Ci0KLQkJZXJyb3JNZXNzYWdlcy5hZGQoZXJyb3JNZXNzYWdlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFNheEFydGlmYWN0VmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREU2F4QXJ0aWZhY3RWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyOTA2M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREU2F4QXJ0aWZhY3RWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIERURFNheEFydGlmYWN0VmlzaXRvciB7Ci0JcHVibGljIHZvaWQgdmlzaXREVEQoRFREIGR0ZCkgewotCQlFbnVtZXJhdGlvbiBlbiA9IGR0ZC5leHRlcm5hbEVsZW1lbnRzKCk7Ci0KLQkJd2hpbGUgKGVuLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlPYmplY3QgZSA9IGVuLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEVudGl0eURlY2wpIHsKLQkJCQl2aXNpdEVudGl0eURlY2woKEVudGl0eURlY2wpIGUpOwotCQkJfQotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEVsZW1lbnREZWNsKSB7Ci0JCQkJdmlzaXRFbGVtZW50RGVjbCgoRWxlbWVudERlY2wpIGUpOwotCQkJfQotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE5vdGF0aW9uRGVjbCkgewotCQkJCXZpc2l0Tm90YXRpb25EZWNsKChOb3RhdGlvbkRlY2wpIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXROb3RhdGlvbkRlY2woTm90YXRpb25EZWNsIG5vdGF0aW9uKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbChFbGVtZW50RGVjbCBlbGVtZW50KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFbnRpdHlEZWNsKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JCWlmIChlbnRpdHkuaXNFbnRpdHlSZWZlcmVuY2VkKCkpIHsKLQkJCXZpc2l0UGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRGVjbChlbnRpdHkpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGVudGl0eS5pc0V4dGVybmFsKCkpIHsKLQkJCQl2aXNpdEV4dGVybmFsRW50aXR5RGVjbChlbnRpdHkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdmlzaXRJbnRlcm5hbEVudGl0eURlY2woZW50aXR5KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0UGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRGVjbChFbnRpdHlEZWNsIGVudGl0eSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RXh0ZXJuYWxFbnRpdHlEZWNsKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRJbnRlcm5hbEVudGl0eURlY2woRW50aXR5RGVjbCBlbnRpdHkpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EVERTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EVERTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NWNlZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBTY2FubmluZyAvIHBhcnNpbmcgdGhlIGNvbnRlbnQgc3RyaW5nIGZyb20gdGhlIERlY2wgc3RhdGVtZW50Ci0gKiAKLSAqIEB2ZXJzaW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERTY2FubmVyIHsKLQkvLyBlbGVtZW50IGNvbnRlbnQgbW9kZWwgc3RyaW5ncwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBlbXB0eV9zdHJpbmcgPSB7J0UnLCAnTScsICdQJywgJ1QnLCAnWSd9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBhbnlfc3RyaW5nID0geydBJywgJ04nLCAnWSd9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBwY2RhdGFfc3RyaW5nID0geycjJywgJ1AnLCAnQycsICdEJywgJ0EnLCAnVCcsICdBJ307Ci0KLQkvLyBhdHRyaWJ1dGUgdHlwZSBhbmQgZGVmYXVsdCB0eXBlIHN0cmluZ3MKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gY2RhdGFfc3RyaW5nID0geydDJywgJ0QnLCAnQScsICdUJywgJ0EnfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gaWRfc3RyaW5nID0geydJJywgJ0QnfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gcmVmX3N0cmluZyA9IHsnUicsICdFJywgJ0YnfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gZW50aXRfc3RyaW5nID0geydFJywgJ04nLCAnVCcsICdJJywgJ1QnfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gaWVzX3N0cmluZyA9IHsnSScsICdFJywgJ1MnfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gbm10b2tlbl9zdHJpbmcgPSB7J04nLCAnTScsICdUJywgJ08nLCAnSycsICdFJywgJ04nfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gbm90YXRpb25fc3RyaW5nID0geydOJywgJ08nLCAnVCcsICdBJywgJ1QnLCAnSScsICdPJywgJ04nfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gcmVxdWlyZWRfc3RyaW5nID0geycjJywgJ1InLCAnRScsICdRJywgJ1UnLCAnSScsICdSJywgJ0UnLCAnRCd9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBpbXBsaWVkX3N0cmluZyA9IHsnIycsICdJJywgJ00nLCAnUCcsICdMJywgJ0knLCAnRScsICdEJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGZpeGVkX3N0cmluZyA9IHsnIycsICdGJywgJ0knLCAnWCcsICdFJywgJ0QnfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBzeXN0ZW1fc3RyaW5nID0geydTJywgJ1knLCAnUycsICdUJywgJ0UnLCAnTSd9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBwdWJsaWNfc3RyaW5nID0geydQJywgJ1UnLCAnQicsICdMJywgJ0knLCAnQyd9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBuZGF0YV9zdHJpbmcgPSB7J04nLCAnRCcsICdBJywgJ1QnLCAnQSd9OwotCi0JcHJpdmF0ZSBpbnRbXSBmT3BTdGFjayA9IG51bGw7Ci0JcHJpdmF0ZSBDTUdyb3VwTm9kZVtdIGZHcnBTdGFjayA9IG51bGw7Ci0KLQlwcml2YXRlIEVudGl0eVBvb2wgZW50aXR5UG9vbDsKLQotCS8qIEF0dHJpYnV0ZSBEZWYgc2Nhbm5lciBzdGF0ZSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgQXR0X1NjYW5uZXJfU3RhdGVfTmFtZSA9IDEsIEF0dF9TY2FubmVyX1N0YXRlX1R5cGUgPSAyLCBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZSA9IDMsIEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRWYWx1ZSA9IDQ7Ci0KLQlwcml2YXRlIFN0cmluZ1BhcnNlciBjb250ZW50U3RyaW5nOwotCXByaXZhdGUgU3RyaW5nIGNEYXRhOwotCXByaXZhdGUgaW50IHByZXZOb2RlT2Zmc2V0ID0gMDsKLQlwcml2YXRlIGludCBub2RlT2Zmc2V0ID0gMTsKLQlwcml2YXRlIFN0cmluZyBvd25lckRURDsKLQotCXByaXZhdGUgU3RyaW5nIGVycm9yU3RyaW5nOwotCi0JcHVibGljIERURFNjYW5uZXIoU3RyaW5nIG93bmVyRFRELCBTdHJpbmcgY20pIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbTogIiArIGNtKTsKLQkJY29udGVudFN0cmluZyA9IG5ldyBTdHJpbmdQYXJzZXIoY20pOwotCQljRGF0YSA9IGNtOwotCQl0aGlzLm93bmVyRFREID0gb3duZXJEVEQ7Ci0JfQotCi0JLy8KLQkvLyBbNDZdIGNvbnRlbnRzcGVjIDo6PSAnRU1QVFknIHwgJ0FOWScgfCBNaXhlZCB8IGNoaWxkcmVuCi0JLy8KLQkvLyBTcGVjaWZpYyB0byBWaXN1YWxEVEQgOiBhbHNvIGFsbG93cyAlUEVSZWZlcmVuY2U7Ci0JLy8KLQlwdWJsaWMgQ01Ob2RlIHNjYW5Db250ZW50TW9kZWwoKSB7Ci0JCUNNTm9kZSBjbU5vZGUgPSBudWxsOwotCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCWlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoZW1wdHlfc3RyaW5nKSkgewotCQkJY21Ob2RlID0gbmV3IENNQmFzaWNOb2RlKCJFTVBUWSIsIENNTm9kZVR5cGUuRU1QVFkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKGFueV9zdHJpbmcpKSB7Ci0JCQljbU5vZGUgPSBuZXcgQ01CYXNpY05vZGUoIkFOWSIsIENNTm9kZVR5cGUuQU5ZKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignJScsIHRydWUpKSB7Ci0JCQljbU5vZGUgPSBuZXcgQ01SZWZlcmVuY2VOb2RlKGNvbnRlbnRTdHJpbmcuZ2V0RGF0YSgpLCBDTU5vZGVUeXBlLkVOVElUWV9SRUZFUkVOQ0UpOwotCQl9Ci0JCWVsc2UgaWYgKCFjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJygnLCB0cnVlKSkgewotCQkJLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBjb250ZW50bW9kZWwgc3RyaW5nIGlzIGJhZC4uLgotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIhISEgZXhjZXB0aW9uIC0gbm8gKCIpOwotCQkJcmV0dXJuIGNtTm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVtYWluaW5nIFN0cmluZyA9ICIgKwotCQkJLy8gY29udGVudFN0cmluZy5nZXRSZW1haW5pbmdTdHJpbmcoKSk7Ci0KLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCWJvb2xlYW4gc2tpcHBlZFBDREFUQSA9IGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhwY2RhdGFfc3RyaW5nKTsKLQkJCWlmIChza2lwcGVkUENEQVRBKSB7Ci0JCQkJY21Ob2RlID0gc2Nhbk1peGVkKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljbU5vZGUgPSBzY2FuQ2hpbGRyZW4oKTsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBjbU5vZGU7Ci0JfQotCi0JLy8KLQkvLyBbNTFdIE1peGVkIDo6PSAnKCcgUz8gJyNQQ0RBVEEnIChTPyAnfCcgUz8gTmFtZSkqIFM/ICcpKicgfCAnKCcgUz8KLQkvLyAnI1BDREFUQScgUz8gJyknCi0JLy8KLQkvLyBDYWxsZWQgYWZ0ZXIgc2Nhbm5pbmcgcGFzdCAnKCcgUz8gJyNQQ0RBVEEnCi0JLy8KLQlwcml2YXRlIENNTm9kZSBzY2FuTWl4ZWQoKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2Nhbk1peGVkLi4uIik7Ci0JCUNNR3JvdXBOb2RlIGNtTm9kZSA9IG5ldyBDTUdyb3VwTm9kZSgpOwotCQljbU5vZGUuc2V0R3JvdXBLaW5kKENNTm9kZVR5cGUuR1JPVVBfQ0hPSUNFKTsKLQkJY21Ob2RlLmFkZENoaWxkKG5ldyBDTUJhc2ljTm9kZSgiI1BDREFUQSIsIENNTm9kZVR5cGUuUENEQVRBKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBpbnQgcHJldk5vZGVJbmRleCA9IC0xOwotCQlib29sZWFuIHN0YXJSZXF1aXJlZCA9IGZhbHNlOwotCi0KLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJfQotCQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQkJaWYgKCFjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ3wnLCB0cnVlKSkgewotCQkJCWlmICghY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcpJywgdHJ1ZSkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJyonLCB0cnVlKSkgewotCQkJCQljbU5vZGUuc2V0T2NjdXJyZW5jZShDTU5vZGVUeXBlLlpFUk9fT1JfTU9SRSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHN0YXJSZXF1aXJlZCkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiAqIGlzIHJlcXVpcmVkIC4uLiAiKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJfQotCi0JCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQlpZiAobm9kZU9mZnNldCAhPSAtMSkgewotCQkJCS8vIHNraXAgcGFzcyAifCIKLQkJCQlwcmV2Tm9kZU9mZnNldCA9IG5vZGVPZmZzZXQ7Ci0JCQl9Ci0KLQkJCXN0YXJSZXF1aXJlZCA9IHRydWU7Ci0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0TmFtZUFuZFBFUmVmZXJlbmNlKCcpJyk7Ci0JCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJCWlmIChub2RlT2Zmc2V0ID09IC0xKQotCQkJCWJyZWFrOwotCi0JCQkvLyBhZGQgbGVhdmUgbm9kZQotCQkJaW50IGxlbiA9IG5vZGVPZmZzZXQgLSBwcmV2Tm9kZU9mZnNldDsKLQkJCVN0cmluZyByZWZOYW1lID0gY29udGVudFN0cmluZy5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0JCQlwcmV2Tm9kZU9mZnNldCA9IG5vZGVPZmZzZXQ7Ci0JCQlpZiAocmVmTmFtZS5zdGFydHNXaXRoKCIlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljbU5vZGUuYWRkQ2hpbGQobmV3IENNUmVmZXJlbmNlTm9kZShyZWZOYW1lLCBDTU5vZGVUeXBlLkVOVElUWV9SRUZFUkVOQ0UpKTsKLQkJCWVsc2UKLQkJCQljbU5vZGUuYWRkQ2hpbGQobmV3IENNUmVmZXJlbmNlTm9kZShyZWZOYW1lLCBDTU5vZGVUeXBlLkVMRU1FTlRfUkVGRVJFTkNFKSk7Ci0KLQkJfSAvLyBlbmQgd2hpbGUKLQotCi0JCWlmIChjbU5vZGUuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPT0gMSkgewotCQkJLy8gc2ltcGxpZnkgdGhlIGNvbnRlbnRNb2RlbCBpZiB0aGUgQ01Hcm91cE5vZGUgb25seSBoYXMgb25lIGNoaWxkCi0JCQkvLyBub2RlLgotCQkJcmV0dXJuIChDTUJhc2ljTm9kZSkgY21Ob2RlLmdldENoaWxkcmVuKCkuZWxlbWVudEF0KDApOwotCQl9Ci0KLQkJcmV0dXJuIGNtTm9kZTsKLQl9Ci0KLQkvLwotCS8vIFs0N10gY2hpbGRyZW4gOjo9IChjaG9pY2UgfCBzZXEpICgnPycgfCAnKicgfCAnKycpPwotCS8vIFs0OV0gY2hvaWNlIDo6PSAnKCcgUz8gY3AgKCBTPyAnfCcgUz8gY3AgKSogUz8gJyknCi0JLy8gWzUwXSBzZXEgOjo9ICcoJyBTPyBjcCAoIFM/ICcsJyBTPyBjcCApKiBTPyAnKScKLQkvLyBbNDhdIGNwIDo6PSAoTmFtZSB8IGNob2ljZSB8IHNlcSkgKCc/JyB8ICcqJyB8ICcrJyk/Ci0JLy8KLQkvLyBDYWxsZWQgYWZ0ZXIgc2Nhbm5pbmcgcGFzdCAnKCcKLQotCXByaXZhdGUgQ01Ob2RlIHNjYW5DaGlsZHJlbigpIHsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNjYW5DaGlsZHJlbi4uLiIpOwotCi0JCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCX0KLQotCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCWludCBkZXB0aCA9IDE7Ci0JCWluaXRpYWxpemVDb250ZW50TW9kZWxTdGFjayhkZXB0aCk7Ci0JCWludCBsZW47Ci0KLQkJU3RyaW5nIG5vZGVOYW1lOwotCQlDTUdyb3VwTm9kZSBjbU5vZGUgPSBuZXcgQ01Hcm91cE5vZGUoKTsKLQkJZkdycFN0YWNrW2RlcHRoXSA9IGNtTm9kZTsKLQotCQl3aGlsZSAodHJ1ZSkgewotCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBCZWdpbiBvdXR0ZXIgd2hpbGUgbG9vcCAuLi4iICk7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcoJywgdHJ1ZSkpIHsKLQkJCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJCQkvLyBza2lwIHBhc3QgYW55IHdoaXRlIHNwYWNlcyBhZnRlciB0aGUgJygnCi0JCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQl9Ci0KLQkJCQlkZXB0aCsrOwotCQkJCWluaXRpYWxpemVDb250ZW50TW9kZWxTdGFjayhkZXB0aCk7Ci0JCQkJZkdycFN0YWNrW2RlcHRoXSA9IG5ldyBDTUdyb3VwTm9kZSgpOwotCQkJCWZHcnBTdGFja1tkZXB0aCAtIDFdLmFkZENoaWxkKGZHcnBTdGFja1tkZXB0aF0pOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwUGFzdE5hbWVBbmRQRVJlZmVyZW5jZSgnKScpOwotCQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCQkvKgotCQkJICogU3lzdGVtLm91dC5wcmludGxuKCIgcHJldk5vZGVPRmZzZXQgIiArIHByZXZOb2RlT2Zmc2V0KTsKLQkJCSAqIFN5c3RlbS5vdXQucHJpbnRsbigiIGN1cnJlbnROb2RlT0Zmc2V0ICIgKyBub2RlT2Zmc2V0KTsKLQkJCSAqLwotCi0JCQlsZW4gPSBub2RlT2Zmc2V0IC0gcHJldk5vZGVPZmZzZXQ7Ci0KLQkJCWlmIChub2RlT2Zmc2V0ID09IC0xIHx8IGxlbiA8IDEpIHsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJbm9kZU5hbWUgPSBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQotCQkJQ01SZXBlYXRhYmxlTm9kZSBybjsKLQkJCWlmIChub2RlTmFtZS5zdGFydHNXaXRoKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJuID0gbmV3IENNUmVmZXJlbmNlTm9kZShub2RlTmFtZSwgQ01Ob2RlVHlwZS5FTlRJVFlfUkVGRVJFTkNFKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJuID0gbmV3IENNUmVmZXJlbmNlTm9kZShub2RlTmFtZSwgQ01Ob2RlVHlwZS5FTEVNRU5UX1JFRkVSRU5DRSk7Ci0JCQl9Ci0KLQkJCWZHcnBTdGFja1tkZXB0aF0uYWRkQ2hpbGQocm4pOwotCi0JCQlwcmV2Tm9kZU9mZnNldCA9IG5vZGVPZmZzZXQ7Ci0KLQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJz8nLCB0cnVlKSkgewotCQkJCXJuLnNldE9jY3VycmVuY2UoQ01Ob2RlVHlwZS5PUFRJT05BTCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJyonLCB0cnVlKSkgewotCQkJCXJuLnNldE9jY3VycmVuY2UoQ01Ob2RlVHlwZS5aRVJPX09SX01PUkUpOwotCQkJfQotCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcrJywgdHJ1ZSkpIHsKLQkJCQlybi5zZXRPY2N1cnJlbmNlKENNTm9kZVR5cGUuT05FX09SX01PUkUpOwotCQkJfQotCi0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCX0KLQotCQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBCZWdpbiBpbm5lciB3aGlsZSBsb29wIC4uLiBkZXB0aCAiICsKLQkJCQkvLyBkZXB0aCApOwotCQkJCWlmIChmT3BTdGFja1tkZXB0aF0gIT0gQ01Ob2RlVHlwZS5HUk9VUF9TRVFVRU5DRSAmJiBjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ3wnLCB0cnVlKSkgewotCQkJCQlmT3BTdGFja1tkZXB0aF0gPSBDTU5vZGVUeXBlLkdST1VQX0NIT0lDRTsKLQkJCQkJZkdycFN0YWNrW2RlcHRoXS5zZXRHcm91cEtpbmQoQ01Ob2RlVHlwZS5HUk9VUF9DSE9JQ0UpOwotCQkJCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkKLQkJCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGZPcFN0YWNrW2RlcHRoXSAhPSBDTU5vZGVUeXBlLkdST1VQX0NIT0lDRSAmJiBjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJywnLCB0cnVlKSkgewotCQkJCQlmT3BTdGFja1tkZXB0aF0gPSBDTU5vZGVUeXBlLkdST1VQX1NFUVVFTkNFOwotCQkJCQlmR3JwU3RhY2tbZGVwdGhdLnNldEdyb3VwS2luZChDTU5vZGVUeXBlLkdST1VQX1NFUVVFTkNFKTsKLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQkJfQotCQkJCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKScsIHRydWUpKSB7Ci0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBlcnJvciApIG5vdCBmb3VuZCIpOwotCQkJCQl9Ci0JCQkJCS8vIGVuZCBvZiB0aGUgY3VyZW50IGdyb3VwIG5vZGUKLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignPycsIHRydWUpKSB7Ci0JCQkJCQlmR3JwU3RhY2tbZGVwdGhdLnNldE9jY3VycmVuY2UoQ01Ob2RlVHlwZS5PUFRJT05BTCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcqJywgdHJ1ZSkpIHsKLQkJCQkJCWZHcnBTdGFja1tkZXB0aF0uc2V0T2NjdXJyZW5jZShDTU5vZGVUeXBlLlpFUk9fT1JfTU9SRSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcrJywgdHJ1ZSkpIHsKLQkJCQkJCWZHcnBTdGFja1tkZXB0aF0uc2V0T2NjdXJyZW5jZShDTU5vZGVUeXBlLk9ORV9PUl9NT1JFKTsKLQkJCQkJfQotCQkJCQlkZXB0aC0tOwotCQkJCQlpZiAoZGVwdGggPT0gMCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0KLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgRW5kIGVuZCBpbm5lciB3aGlsZSBsb29wIC4uLiBkZXB0aAotCQkJCQkvLyAiICsgZGVwdGggKTsKLQotCQkJCX0KLQkJCX0gLy8gaW5uZXIgd2hpbGUKLQotCQkJaWYgKGRlcHRoID09IDApIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSAvLyBvdXRlciB3aGlsZQotCi0JCWlmIChjbU5vZGUuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPT0gMSkgewotCQkJLy8gc2ltcGxpZnkgdGhlIGNvbnRlbnRNb2RlbCBpZiB0aGUgQ01Hcm91cE5vZGUgb25seSBoYXMgb25lIGNoaWxkCi0JCQkvLyBub2RlIGFuZCB0aGF0IG5vZGUgaXMgYW4gZWxlbWVudCByZWYuCi0JCQlDTVJlcGVhdGFibGVOb2RlIHJuID0gKENNUmVwZWF0YWJsZU5vZGUpIGNtTm9kZS5nZXRDaGlsZHJlbigpLmVsZW1lbnRBdCgwKTsKLQkJCWlmIChybiBpbnN0YW5jZW9mIENNUmVmZXJlbmNlTm9kZSkgewotCQkJCUNNUmVmZXJlbmNlTm9kZSByZWYgPSAoQ01SZWZlcmVuY2VOb2RlKSBybjsKLQkJCQlpZiAocmVmLmdldFR5cGUoKSA9PSBDTU5vZGVUeXBlLkVMRU1FTlRfUkVGRVJFTkNFKSB7Ci0JCQkJCWlmIChyZWYuZ2V0T2NjdXJyZW5jZSgpID09IENNTm9kZVR5cGUuT05FKSB7Ci0JCQkJCQlyZWYuc2V0T2NjdXJyZW5jZShjbU5vZGUuZ2V0T2NjdXJyZW5jZSgpKTsKLQkJCQkJCXJldHVybiByZWY7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY21Ob2RlLmdldE9jY3VycmVuY2UoKSA9PSBDTU5vZGVUeXBlLk9ORSkgewotCQkJCQkJcmV0dXJuIHJlZjsKLQkJCQkJfQotCQkJCX0gLy8gZW5kIG9mIGlmICgpCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY21Ob2RlOwotCX0KLQotCS8vCi0JLy8gWzUyXSBBdHRsaXN0RGVjbCA6Oj0gJzwhQVRUTElTVCcgUyBOYW1lIEF0dERlZiogUz8gJz4nCi0JLy8gWzUzXSBBdHREZWYgOjo9IFMgTmFtZSBTIEF0dFR5cGUgUyBEZWZhdWx0RGVjbAotCS8vIFs2MF0gRGVmYXVsdERlY2wgOjo9ICcjUkVRVUlSRUQnIHwgJyNJTVBMSUVEJyB8ICgoJyNGSVhFRCcgUyk/Ci0JLy8gQXR0VmFsdWUpCi0JLy8KLQotCXB1YmxpYyBWZWN0b3Igc2NhbkF0dGxpc3REZWNsKEVudGl0eVBvb2wgZW50aXR5UG9vbCkgewotCQlWZWN0b3IgYXR0TGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJdGhpcy5lbnRpdHlQb29sID0gZW50aXR5UG9vbDsKLQotCQlpbnQgc2Nhbm5lclN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfTmFtZTsKLQkJCi0JCUF0dE5vZGUgYXR0Tm9kZTsKLQotCQl3aGlsZSAodHJ1ZSkgewotCQkJYXR0Tm9kZSA9IG5ldyBBdHROb2RlKCk7Ci0KLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIHNjYW5uZXIgc3RhdGU6ICIgKyBzY2FubmVyU3RhdGUpOwotCi0JCQkvLyBzY2FubmluZyBhdHQgbmFtZQotCQkJaWYgKHNjYW5uZXJTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9OYW1lKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzY2FuIGF0dCBOYW1lLi4uIik7Ci0JCQkJc2Nhbm5lclN0YXRlID0gY2hlY2tGb3JBdHRyaWJ1dGVXaXRoUEVSZWZlcmVuY2UoYXR0Tm9kZSwgc2Nhbm5lclN0YXRlKTsKLQkJCQlpZiAoc2Nhbm5lclN0YXRlID09IC0xKSB7Ci0JCQkJCXJldHVybiBhdHRMaXN0OwotCQkJCX0KLQkJCX0KLQotCQkJLy8gc2Nhbm5pbmcgYXR0IHR5cGUKLQkJCWlmIChzY2FubmVyU3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfVHlwZSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2NhbiBhdHQgdHlwZS4uLiIpOwotCi0JCQkJaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhjZGF0YV9zdHJpbmcpKSB7Ci0JCQkJCWF0dE5vZGUudHlwZSA9IG5ldyBTdHJpbmcoY2RhdGFfc3RyaW5nKTsKLQkJCQkJc2Nhbm5lclN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhpZF9zdHJpbmcpKSB7Ci0JCQkJCWlmICghY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKHJlZl9zdHJpbmcpKSB7Ci0JCQkJCQlhdHROb2RlLnR5cGUgPSBuZXcgU3RyaW5nKGlkX3N0cmluZyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignUycsIHRydWUpKSB7Ci0JCQkJCQlhdHROb2RlLnR5cGUgPSAiSURSRUYiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlhdHROb2RlLnR5cGUgPSAiSURSRUZTIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXNjYW5uZXJTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlOwotCQkJCX0KLQkJCQllbHNlIGlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoZW50aXRfc3RyaW5nKSkgewotCQkJCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdZJywgdHJ1ZSkpIHsKLQkJCQkJCWF0dE5vZGUudHlwZSA9ICJFTlRJVFkiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKGllc19zdHJpbmcpKSB7Ci0JCQkJCQlhdHROb2RlLnR5cGUgPSAiRU5USVRJRVMiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJc2Nhbm5lclN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhubXRva2VuX3N0cmluZykpIHsKLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignUycsIHRydWUpKSB7Ci0JCQkJCQlhdHROb2RlLnR5cGUgPSAiTk1UT0tFTlMiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlhdHROb2RlLnR5cGUgPSAiTk1UT0tFTiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzY2FubmVyU3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKG5vdGF0aW9uX3N0cmluZykpIHsKLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQkJfQotCQkJCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKCcsIHRydWUpKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBtaXNzaW5nICggaW4gbm90YXRpb24gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlhdHROb2RlLnR5cGUgPSAiTk9UQVRJT04iOyAvLyROT04tTkxTLTEkCi0JCQkJCWF0dE5vZGUuZW51bUxpc3QgPSBzY2FuRW51bWVyYXRpb24oY29udGVudFN0cmluZywgdHJ1ZSk7Ci0JCQkJCXNjYW5uZXJTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlOwotCQkJCX0KLQkJCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJygnLCB0cnVlKSkgewotCQkJCQlhdHROb2RlLnR5cGUgPSAiRU5VTUVSQVRJT04iOyAvLyROT04tTkxTLTEkCi0JCQkJCWF0dE5vZGUuZW51bUxpc3QgPSBzY2FuRW51bWVyYXRpb24oY29udGVudFN0cmluZywgZmFsc2UpOwotCQkJCQlzY2FubmVyU3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNjYW5uZXJTdGF0ZSA9IGNoZWNrRm9yQXR0cmlidXRlV2l0aFBFUmVmZXJlbmNlKGF0dE5vZGUsIHNjYW5uZXJTdGF0ZSk7Ci0JCQkJCWlmIChzY2FubmVyU3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfVHlwZSkgewotCQkJCQkJc2V0RXJyb3JTdHJpbmcoIkZhaWxlZCB0byBmaW5kIHR5cGUgZm9yIGF0dHJpYnV0ZSAnIiArIGF0dE5vZGUubmFtZSArICInLiAgUGxlYXNlIHJlZmVyIHRvIHRoZSBvcmlnaW5hbCBEVEQgZmlsZS4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkvLyB3ZSBmYWlsZWQgdG8gZmluZCBhIHR5cGUgZm9yIHRoaXMgYXR0cmlidXRlCi0JCQkJCQlyZXR1cm4gYXR0TGlzdDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHNjYW5uZXJTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZSkgewotCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNjYW4gZGVmYXVsdCB0eXBlLi4uIik7Ci0JCQkJaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhyZXF1aXJlZF9zdHJpbmcpKSB7Ci0JCQkJCWF0dE5vZGUuZGVmYXVsdFR5cGUgPSBuZXcgU3RyaW5nKHJlcXVpcmVkX3N0cmluZyk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhpbXBsaWVkX3N0cmluZykpIHsKLQkJCQkJYXR0Tm9kZS5kZWZhdWx0VHlwZSA9IG5ldyBTdHJpbmcoaW1wbGllZF9zdHJpbmcpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhmaXhlZF9zdHJpbmcpKSB7Ci0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJCQlhdHROb2RlLmRlZmF1bHRUeXBlID0gbmV3IFN0cmluZyhmaXhlZF9zdHJpbmcpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCS8vICJkZWZhdWx0IgotCQkJCQkJYXR0Tm9kZS5kZWZhdWx0VHlwZSA9ICJOT0ZJWEVEIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCQlhdHROb2RlLmRlZmF1bHRWYWx1ZSA9IHNjYW5EZWZhdWx0QXR0VmFsdWUoY29udGVudFN0cmluZyk7Ci0JCQkJfQotCQkJCXNjYW5uZXJTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX05hbWU7IC8vIG5leHQKLQkJCX0KLQotCi0JCQlhdHRMaXN0LmFkZEVsZW1lbnQoYXR0Tm9kZSk7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkKLQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJCWlmIChub2RlT2Zmc2V0ID49IGNEYXRhLmxlbmd0aCgpKQotCQkJCXJldHVybiBhdHRMaXN0OwotCi0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCX0vLyBlbmQgd2hpbGUgbG9vcAotCX0KLQotCS8vCi0JLy8gY29udGVudCBtb2RlbCBzdGFjawotCS8vCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDb250ZW50TW9kZWxTdGFjayhpbnQgZGVwdGgpIHsKLQkJaWYgKGZPcFN0YWNrID09IG51bGwpIHsKLQkJCWZPcFN0YWNrID0gbmV3IGludFs4XTsKLQkJCWZHcnBTdGFjayA9IG5ldyBDTUdyb3VwTm9kZVs4XTsKLQkJfQotCQllbHNlIGlmIChkZXB0aCA9PSBmT3BTdGFjay5sZW5ndGgpIHsKLQkJCWludFtdIG5ld1N0YWNrID0gbmV3IGludFtkZXB0aCAqIDJdOwotCQkJU3lzdGVtLmFycmF5Y29weShmT3BTdGFjaywgMCwgbmV3U3RhY2ssIDAsIGRlcHRoKTsKLQkJCWZPcFN0YWNrID0gbmV3U3RhY2s7Ci0KLQkJCUNNR3JvdXBOb2RlW10gbmV3R3JwU3RhY2sgPSBuZXcgQ01Hcm91cE5vZGVbZGVwdGggKiAyXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZkdycFN0YWNrLCAwLCBuZXdHcnBTdGFjaywgMCwgZGVwdGgpOwotCQkJZkdycFN0YWNrID0gbmV3R3JwU3RhY2s7Ci0JCX0KLQkJZk9wU3RhY2tbZGVwdGhdID0gLTE7Ci0JCWZHcnBTdGFja1tkZXB0aF0gPSBudWxsOwotCX0KLQotCS8vCi0JcHJpdmF0ZSBpbnQgY2hlY2tGb3JBdHRyaWJ1dGVXaXRoUEVSZWZlcmVuY2UoQXR0Tm9kZSBhdHROb2RlLCBpbnQgc2Nhbm5lclN0YXRlKSB7Ci0JCWludCBzdGF0ZSA9IC0xOwotCQlpbnQgbGVuOwotCQlTdHJpbmcgcmF3VGV4dDsKLQkJRW50aXR5RGVjbCBwRW50aXR5OwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGNoZWNrZm9yQVRUUEVSUmVmZXJlbmNlLSBzdGFydCBzY2FubmVyU3RhdGU6ICIKLQkJLy8gKyBzY2FubmVyU3RhdGUpOwotCQlpZiAoc2Nhbm5lclN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX05hbWUpIHsKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3ROYW1lQW5kUEVSZWZlcmVuY2UoJyAnKTsKLQkJCW5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJCWxlbiA9IG5vZGVPZmZzZXQgLSBwcmV2Tm9kZU9mZnNldDsKLQotCQkJcmF3VGV4dCA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJYXR0Tm9kZS5uYW1lID0gcmF3VGV4dDsKLQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGF0ZV9uYW1lIDogIiArIHJhd1RleHQpOwotCi0JCQlpZiAocmF3VGV4dC5zdGFydHNXaXRoKCIlIikgJiYgcmF3VGV4dC5lbmRzV2l0aCgiOyIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN0cmluZyBwZSA9IHJhd1RleHQuc3Vic3RyaW5nKDEsIHJhd1RleHQubGVuZ3RoKCkgLSAxKTsKLQotCQkJCXBFbnRpdHkgPSBlbnRpdHlQb29sLnJlZmVyUGFyYShwZSk7Ci0JCQkJaWYgKHBFbnRpdHkgIT0gbnVsbCkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBuYW1lIDoiICsgcmF3VGV4dCArIiBleHBhbmRUbzoiICsKLQkJCQkJLy8gcEVudGl0eS5leHBhbmRlZFZhbHVlKTsKLQkJCQkJc3RhdGUgPSB3aGF0SXNUaGVOZXh0QXR0cmlidXRlU2Nhbm5pbmdTdGF0ZShwRW50aXR5LmV4cGFuZGVkVmFsdWUsIHNjYW5uZXJTdGF0ZSk7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY2hlY2tGb3JBdHRyd2l0aFBFUiAtIG5leHRzdGF0ZTogIgotCQkJCQkvLyArIHN0YXRlKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlzdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX1R5cGU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9UeXBlOwotCi0JCX0KLQkJZWxzZSBpZiAoc2Nhbm5lclN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX1R5cGUpIHsKLQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJyUnLCB0cnVlKSkgewotCQkJCXJhd1RleHQgPSBnZXRQRU5hbWUoKTsKLQkJCQlhdHROb2RlLnR5cGUgPSAiJSIgKyByYXdUZXh0OyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHBlTmFtZSA9IHJhd1RleHQuc3Vic3RyaW5nKDAsIHJhd1RleHQubGVuZ3RoKCkgLSAxKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRlX3R5cGUgOiBwZS0gIiArIHBlTmFtZSk7Ci0JCQkJcEVudGl0eSA9IGVudGl0eVBvb2wucmVmZXJQYXJhKHBlTmFtZSk7Ci0JCQkJaWYgKHBFbnRpdHkgIT0gbnVsbCkgewotCQkJCQlzdGF0ZSA9IHdoYXRJc1RoZU5leHRBdHRyaWJ1dGVTY2FubmluZ1N0YXRlKHBFbnRpdHkuZXhwYW5kZWRWYWx1ZSwgc2Nhbm5lclN0YXRlKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlzdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlOwotCQkJfQotCQkJZWxzZQotCQkJCXN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfVHlwZTsKLQkJfQotCQllbHNlIGlmIChzY2FubmVyU3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGUpIHsKLQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJyUnLCB0cnVlKSkgewotCQkJCXJhd1RleHQgPSBnZXRQRU5hbWUoKTsKLQkJCQlhdHROb2RlLmRlZmF1bHRUeXBlID0gcmF3VGV4dDsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRlX2RlZmF1bHRUeXBlIDogIiArIHJhd1RleHQpOwotCQkJCXBFbnRpdHkgPSBlbnRpdHlQb29sLnJlZmVyUGFyYShyYXdUZXh0LnN1YnN0cmluZygxLCByYXdUZXh0Lmxlbmd0aCgpIC0gMSkpOwotCQkJCWlmIChwRW50aXR5ICE9IG51bGwpIHsKLQkJCQkJc3RhdGUgPSB3aGF0SXNUaGVOZXh0QXR0cmlidXRlU2Nhbm5pbmdTdGF0ZShwRW50aXR5LmV4cGFuZGVkVmFsdWUsIHNjYW5uZXJTdGF0ZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VmFsdWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJfQotCQllbHNlIGlmIChzY2FubmVyU3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFZhbHVlKSB7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCclJywgdHJ1ZSkpIHsKLQkJCQlyYXdUZXh0ID0gZ2V0UEVOYW1lKCk7Ci0JCQkJYXR0Tm9kZS5kZWZhdWx0VmFsdWUgPSByYXdUZXh0OwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhdGVfZGVmYXVsdFZhbHVlIDogIiArIHJhd1RleHQpOwotCi0JCQkJcEVudGl0eSA9IGVudGl0eVBvb2wucmVmZXJQYXJhKHJhd1RleHQuc3Vic3RyaW5nKDEsIHJhd1RleHQubGVuZ3RoKCkgLSAxKSk7Ci0JCQkJaWYgKHBFbnRpdHkgIT0gbnVsbCkgewotCQkJCQlzdGF0ZSA9IHdoYXRJc1RoZU5leHRBdHRyaWJ1dGVTY2FubmluZ1N0YXRlKHBFbnRpdHkuZXhwYW5kZWRWYWx1ZSwgc2Nhbm5lclN0YXRlKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlzdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRWYWx1ZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlzdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRWYWx1ZTsKLQkJfQotCi0JCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQlyZXR1cm4gc3RhdGU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UEVOYW1lKCkgewotCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQljb250ZW50U3RyaW5nLnNraXBUb0NoYXIoJzsnLCB0cnVlKTsKLQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQlpbnQgbGVuID0gbm9kZU9mZnNldCAtIHByZXZOb2RlT2Zmc2V0OwotCQlyZXR1cm4gY29udGVudFN0cmluZy5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgd2hhdElzVGhlTmV4dEF0dHJpYnV0ZVNjYW5uaW5nU3RhdGUoU3RyaW5nIGF0dHJDb250ZW50U3RyaW5nLCBpbnQgY3VycmVudFN0YXRlKSB7Ci0JCVN0cmluZ1BhcnNlciBzcCA9IG5ldyBTdHJpbmdQYXJzZXIoYXR0ckNvbnRlbnRTdHJpbmcudHJpbSgpKTsKLQotCi0JCWludCBuZXh0U3RhdGUgPSBjdXJyZW50U3RhdGU7Ci0JCWludCBuT2Zmc2V0ID0gMDsKLQotCQkvKgotCQkgKiBTeXN0ZW0ub3V0LnByaW50bG4oIldoYXRpc3RoZU5leHQgQXR0Q29udGVudFN0cmluZ3QgOiAiICsKLQkJICogYXR0ckNvbnRlbnRTdHJpbmcpOyBTeXN0ZW0ub3V0LnByaW50bG4oIldoYXRpc3RoZU5leHQKLQkJICogQXR0Q29udGVudFN0cmluZ0wgOiAiICsgYXR0ckNvbnRlbnRTdHJpbmcubGVuZ3RoKCkpOwotCQkgKiBTeXN0ZW0ub3V0LnByaW50bG4oIldoYXRpc3RoZU5leHQgY3VycmVudHN0YXRlIDogIiArIGN1cnJlbnRTdGF0ZSk7Ci0JCSAqLwotCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIldoYXRpc3RoZU5leHQgaW5zaWRlIHdoaWwgbmV4dHN0YXRlIDogIiArCi0JCQkvLyBuZXh0U3RhdGUpOwotCQkJaWYgKG5leHRTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9OYW1lKSB7IC8vIHRoZSBjdXJyZW50Ci0JCQkJCQkJCQkJCQkJCS8vIHNjYW5uaW5nIHN0YXRlIGlzCi0JCQkJCQkJCQkJCQkJCS8vIEF0dHIgTmFtZSwgaXMgdGhlCi0JCQkJCQkJCQkJCQkJCS8vIG5leHQgcGFydCBBdHRyIFR5cGUKLQkJCQkJCQkJCQkJCQkJLy8gPwotCQkJCWlmIChpc0F0dHJOYW1lKHNwKSkgewotCQkJCQluZXh0U3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9UeXBlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5leHRTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9UeXBlKSB7IC8vIHRoZSBjdXJyZW50Ci0JCQkJCQkJCQkJCQkJCQkvLyBzY2FubmluZyBzdGF0ZQotCQkJCQkJCQkJCQkJCQkJLy8gaXMgQXR0ciBUeXBlLAotCQkJCQkJCQkJCQkJCQkJLy8gaXMgdGhlIG5leHQKLQkJCQkJCQkJCQkJCQkJCS8vIHBhcnQgRGVmYXVsdAotCQkJCQkJCQkJCQkJCQkJLy8gQXR0ciBUeXBlID8KLQotCQkJCWlmIChpc0F0dHJUeXBlKHNwKSkgewotCQkJCQluZXh0U3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldoYXRpc3RoZU5leHQgQXR0ciBQYXJ0IC0gaXMgbm90IGFuIEF0dHIgVHlwZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCX0KLQotCQkJaWYgKG5leHRTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZSkgewotCi0JCQkJaW50IGRUeXBlID0gaXNBdHRyRGVmYXVsdFR5cGUoc3ApOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiV2hhdGlzdGhlTmV4dCBpbnNpZGUgZFR5cGUgOiAiICsKLQkJCQkvLyBkVHlwZSk7Ci0JCQkJaWYgKGRUeXBlID09IDEpIC8vICNSRVFVSVJFRCBvciAjSU1QTElFRAotCQkJCXsKLQkJCQkJbmV4dFN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfTmFtZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChkVHlwZSA9PSAyKSAvLyAjRklYRUQKLQkJCQkJewotCQkJCQkJLy8gbmVlZCB0byBsb29rIGF0IHRoaXMgYWdhaW4KLQkJCQkJCW5leHRTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlOwotCQkJCQl9Ci0KLQkJCQkJaWYgKHNjYW5EZWZhdWx0QXR0VmFsdWUoc3ApICE9IG51bGwpIHsKLQkJCQkJCW5leHRTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX05hbWU7Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJc3Auc2tpcFBhc3RTcGFjZXMoKTsKLQotCQkJaWYgKG5PZmZzZXQgPT0gc3AuZ2V0Q3VycmVudE9mZnNldCgpKQotCQkJCWJyZWFrOwotCi0JCQluT2Zmc2V0ID0gc3AuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCQlpZiAobk9mZnNldCA+PSBhdHRyQ29udGVudFN0cmluZy5sZW5ndGgoKSB8fCBuT2Zmc2V0ID09IC0xKQotCQkJCWJyZWFrOwotCi0JCX0gLy8gZW5kIHdoaWxlCi0KLQkJcmV0dXJuIG5leHRTdGF0ZTsKLQl9Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0F0dHJOYW1lKFN0cmluZ1BhcnNlciBzcCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImlzQXR0ck5hbWUgLSBzcDoiICsgc3AuZkRhdGEpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImlzQXR0ck5hbWUgLSBjdXJyZW50T2Zmc2V0OiIgKwotCQkvLyBzcC5nZXRDdXJyZW50T2Zmc2V0KCkpOwotCQlib29sZWFuIGlzQXR0ck5hbWUgPSBmYWxzZTsKLQkJaW50IHByZXYgPSBzcC5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCXNwLnNraXBQYXN0TmFtZSgnICcpOwotCQlpZiAoKHNwLmdldEN1cnJlbnRPZmZzZXQoKSAtIHByZXYpID4gMCkKLQkJCWlzQXR0ck5hbWUgPSB0cnVlOwotCQlyZXR1cm4gaXNBdHRyTmFtZTsKLQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0F0dHJUeXBlKFN0cmluZ1BhcnNlciBzcCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImlzQXR0clR5cGUgLSBzcDoiICsgc3AuZkRhdGEpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImlzQXR0clR5cGUgLSBjdXJyZW50T2Zmc2V0OiIgKwotCQkvLyBzcC5nZXRDdXJyZW50T2Zmc2V0KCkpOwotCQlib29sZWFuIGlzQXR0clR5cGUgPSBmYWxzZTsKLQkJaWYgKHNwLnNraXBwZWRTdHJpbmcoY2RhdGFfc3RyaW5nKSkgewotCQkJaXNBdHRyVHlwZSA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoc3Auc2tpcHBlZFN0cmluZyhpZF9zdHJpbmcpKSB7Ci0JCQlpZiAoIXNwLnNraXBwZWRTdHJpbmcocmVmX3N0cmluZykpIHsKLQkJCQlpc0F0dHJUeXBlID0gdHJ1ZTsgLy8gSUQKLQkJCX0KLQkJCWVsc2UgaWYgKCFzcC5sb29raW5nQXRDaGFyKCdTJywgdHJ1ZSkpIHsKLQkJCQlpc0F0dHJUeXBlID0gdHJ1ZTsgLy8gSURSRUZTCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpc0F0dHJUeXBlID0gdHJ1ZTsgLy8gSURSRUYKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzcC5za2lwcGVkU3RyaW5nKGVudGl0X3N0cmluZykpIHsKLQkJCWlmIChzcC5sb29raW5nQXRDaGFyKCdZJywgdHJ1ZSkpIHsKLQkJCQlpc0F0dHJUeXBlID0gdHJ1ZTsgLy8gRU5USVRZCi0JCQl9Ci0JCQllbHNlIGlmIChzcC5za2lwcGVkU3RyaW5nKGllc19zdHJpbmcpKSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIEVOVElUSVRFUwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHNwLnNraXBwZWRTdHJpbmcobm10b2tlbl9zdHJpbmcpKSB7Ci0JCQlpZiAoc3AubG9va2luZ0F0Q2hhcignUycsIHRydWUpKSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIE5NVE9LRU5TCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpc0F0dHJUeXBlID0gdHJ1ZTsgLy8gTk1UT0tFTgotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHNwLnNraXBwZWRTdHJpbmcobm90YXRpb25fc3RyaW5nKSkgewotCQkJaWYgKCFzcC5sb29raW5nQXRDaGFyKCcoJywgdHJ1ZSkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBtaXNzaW5nICggaW4gbm90YXRpb24gIik7Ci0JCQl9Ci0JCQlWZWN0b3IgZW51bUxpc3QgPSBzY2FuRW51bWVyYXRpb24oc3AsIHRydWUpOwotCQkJaWYgKGVudW1MaXN0ID09IG51bGwgfHwgZW51bUxpc3Quc2l6ZSgpID09IDApCi0JCQkJaXNBdHRyVHlwZSA9IGZhbHNlOwotCQkJZWxzZQotCQkJCWlzQXR0clR5cGUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHNwLmxvb2tpbmdBdENoYXIoJygnLCB0cnVlKSkgewotCQkJLy8gIkVOVU1FUkFUSU9OIjsKLQkJCVZlY3RvciBlbnVtTGlzdCA9IHNjYW5FbnVtZXJhdGlvbihzcCwgZmFsc2UpOwotCQkJaWYgKGVudW1MaXN0ID09IG51bGwgfHwgZW51bUxpc3Quc2l6ZSgpID09IDApCi0JCQkJaXNBdHRyVHlwZSA9IGZhbHNlOwotCQkJZWxzZQotCQkJCWlzQXR0clR5cGUgPSB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGlzQXR0clR5cGU7Ci0KLQl9Ci0KLQkvKgotCSAqIHJldHVybiAwIC0gbm90IGRlZmF1bHQgdHlwZSAxIC0gI1JFUVVJUkVEIG9yICNJTVBMSUVEIDIgLSAjRklYRUQKLQkgKi8KLQotCXByaXZhdGUgaW50IGlzQXR0ckRlZmF1bHRUeXBlKFN0cmluZ1BhcnNlciBzcCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImlzQXR0ckRlZmF1bHRUeXBlIC0gc3A6IiArIHNwLmZEYXRhKTsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCWlmIChzcC5za2lwcGVkU3RyaW5nKHJlcXVpcmVkX3N0cmluZykpIHsKLQkJCXJlc3VsdCA9IDE7Ci0JCX0KLQkJZWxzZSBpZiAoc3Auc2tpcHBlZFN0cmluZyhpbXBsaWVkX3N0cmluZykpIHsKLQkJCXJlc3VsdCA9IDE7Ci0JCX0KLQkJZWxzZSBpZiAoc3Auc2tpcHBlZFN0cmluZyhmaXhlZF9zdHJpbmcpKSB7Ci0JCQlyZXN1bHQgPSAyOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8KLQkvLyBbNThdIE5vdGF0aW9uVHlwZSA6Oj0gJ05PVEFUSU9OJyBTICcoJyBTPyBOYW1lIChTPyAnfCcgUz8gTmFtZSkqIFM/ICcpJwotCS8vIFs1OV0gRW51bWVyYXRpb24gOjo9ICcoJyBTPyBObXRva2VuIChTPyAnfCcgUz8gTm10b2tlbikqIFM/ICcpJwotCS8vCi0JLy8gQ2FsbGVkIGFmdGVyIHNjYW5uaW5nICcoJwotCS8vCi0JcHJpdmF0ZSBWZWN0b3Igc2NhbkVudW1lcmF0aW9uKFN0cmluZ1BhcnNlciBzcCwgYm9vbGVhbiBpc05vdGF0aW9uVHlwZSkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBzY2FuRW51bSAuLi4iKTsKLQkJVmVjdG9yIGVudW1MaXN0ID0gbnVsbDsKLQkJaW50IGxlbjsKLQotCQlpZiAoc3AubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQlzcC5za2lwUGFzdFNwYWNlcygpOwotCi0JCWludCBwcmV2Tm9kZU9mZnNldCA9IHNwLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJaW50IG5vZGVPZmZzZXQ7Ci0KLQkJU3RyaW5nIG5vZGVOYW1lOwotCi0JCXdoaWxlICh0cnVlKSB7Ci0KLQkJCWlmIChpc05vdGF0aW9uVHlwZSkKLQkJCQlzcC5za2lwUGFzdE5hbWVBbmRQRVJlZmVyZW5jZSgnKScpOwotCQkJZWxzZQotCQkJCXNwLnNraXBQYXN0Tm10b2tlbkFuZFBFUmVmZXJlbmNlKCcpJyk7Ci0KLQkJCW5vZGVPZmZzZXQgPSBzcC5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJCWlmIChub2RlT2Zmc2V0ID09IC0xKSB7Ci0JCQkJcmV0dXJuIGVudW1MaXN0OwotCQkJfQotCi0JCQlsZW4gPSBub2RlT2Zmc2V0IC0gcHJldk5vZGVPZmZzZXQ7Ci0JCQlub2RlTmFtZSA9IHNwLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQotCQkJaWYgKGVudW1MaXN0ID09IG51bGwpCi0JCQkJZW51bUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJCWVudW1MaXN0LmFkZEVsZW1lbnQobm9kZU5hbWUpOwotCi0JCQlpZiAoc3AubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQkJc3Auc2tpcFBhc3RTcGFjZXMoKTsKLQotCQkJaWYgKCFzcC5sb29raW5nQXRDaGFyKCd8JywgdHJ1ZSkpIHsKLQkJCQlpZiAoIXNwLmxvb2tpbmdBdENoYXIoJyknLCB0cnVlKSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNjYW5uaW5nIGVudW0gdmFsdWVzIC0gZXJyb3IgbWlzc2luZyAnKSciKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChzcC5sb29raW5nQXRTcGFjZSh0cnVlKSkKLQkJCQlzcC5za2lwUGFzdFNwYWNlcygpOwotCi0JCQlwcmV2Tm9kZU9mZnNldCA9IHNwLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gZW51bUxpc3Q7Ci0JfQotCi0JLy8KLQkvLyBbMTBdIEF0dFZhbHVlIDo6PSAnIicgKFtePCYiXSB8IFJlZmVyZW5jZSkqICciJwotCS8vIHwgIiciIChbXjwmJ10gfCBSZWZlcmVuY2UpKiAiJyIKLQkvLwotCS8qKgotCSAqIFNjYW4gdGhlIGRlZmF1bHQgdmFsdWUgaW4gYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRUeXBlCi0JICogICAgICAgICAgICBoYW5kbGUgdG8gdGhlIGVsZW1lbnQgdGhhdCBvd25zIHRoZSBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gYXR0ck5hbWUKLQkgKiAgICAgICAgICAgIGhhbmRsZSBpbiB0aGUgc3RyaW5nIHBvb2wgZm9yIHRoZSBhdHRyaWJ1dGUgbmFtZQotCSAqIEByZXR1cm4gaGFuZGxlIGluIHRoZSBzdHJpbmcgcG9vbCBmb3IgdGhlIGRlZmF1bHQgYXR0cmlidXRlIHZhbHVlCi0JICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBzY2FuRGVmYXVsdEF0dFZhbHVlKFN0cmluZ1BhcnNlciBzcCkgewotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNjYW4gZGVmYXVsdCBBVFQgVmFsdWUuLi4gc3A6IiArIHNwLmZEYXRhKTsKLQotCQlzcC5za2lwUGFzdFNwYWNlcygpOwotCi0JCWJvb2xlYW4gc2luZ2xlOwotCQlpZiAoIShzaW5nbGUgPSBzcC5sb29raW5nQXRDaGFyKCdcJycsIHRydWUpKSAmJiAhc3AubG9va2luZ0F0Q2hhcignXCInLCB0cnVlKSkgewotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0KLQkJY2hhciBxY2hhciA9IHNpbmdsZSA/ICdcJycgOiAnXCInOwotCQlpbnQgc09mZnNldCA9IHNwLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJLy9CVUcgMjAzNDk0IC0gU2tpcCB0byB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZSBxY2hhciB0aGF0IHdheQotCQkvLyBhbGwgY2hhcmFjdGVycyBiZXR3ZWVuIGFyZSBvYnRhaW5lZAotCQlzcC5za2lwVG9MYXN0T2ZDaGFyKHFjaGFyLCB0cnVlKTsKLQkJaW50IGxlbiA9IHNwLmdldEN1cnJlbnRPZmZzZXQoKSAtIHNPZmZzZXQgLSAxOwotCQlpZiAobGVuID09IDApCi0JCQl2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCXZhbHVlID0gc3AuZ2V0U3RyaW5nKHNPZmZzZXQsIGxlbik7Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8vCi0JLy8gWzcwXSBFbnRpdHlEZWNsIDo6PSBHRURlY2wgfCBQRURlY2wKLQkvLyBbNzFdIEdFRGVjbCA6Oj0gJzwhRU5USVRZJyBTIE5hbWUgUyBFbnRpdHlEZWYgUz8gJz4nCi0JLy8gWzcyXSBQRURlY2wgOjo9ICc8IUVOVElUWScgUyAnJScgUyBOYW1lIFMgUEVEZWYgUz8gJz4nCi0JLy8gWzczXSBFbnRpdHlEZWYgOjo9IEVudGl0eVZhbHVlIHwgKEV4dGVybmFsSUQgTkRhdGFEZWNsPykKLQkvLyBbNzRdIFBFRGVmIDo6PSBFbnRpdHlWYWx1ZSB8IEV4dGVybmFsSUQKLQkvLyBbNzVdIEV4dGVybmFsSUQgOjo9ICdTWVNURU0nIFMgU3lzdGVtTGl0ZXJhbAotCS8vIHwgJ1BVQkxJQycgUyBQdWJpZExpdGVyYWwgUyBTeXN0ZW1MaXRlcmFsCi0JLy8gWzc2XSBORGF0YURlY2wgOjo9IFMgJ05EQVRBJyBTIE5hbWUKLQkvLyBbOV0gRW50aXR5VmFsdWUgOjo9ICciJyAoW14lJiJdIHwgUEVSZWZlcmVuY2UgfCBSZWZlcmVuY2UpKiAnIicKLQkvLyB8ICInIiAoW14lJiddIHwgUEVSZWZlcmVuY2UgfCBSZWZlcmVuY2UpKiAiJyIKLQkvLwotCS8vIENhbGxlZCBhZnRlciBzY2FubmluZyAnRU5USVRZJwotCS8vCi0JcHVibGljIEVudGl0eURlY2wgc2NhbkVudGl0eURlY2woKSB7Ci0JCXByZXZOb2RlT2Zmc2V0ID0gMTsKLQkJbm9kZU9mZnNldCA9IDE7Ci0JCWludCBsZW47Ci0JCWJvb2xlYW4gaXNQRURlY2wgPSBmYWxzZTsKLQkJRW50aXR5RGVjbCBlbnRpdHlEZWNsID0gbnVsbDsKLQotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCVN0cmluZyBuZGF0YSA9IG51bGw7Ci0KLQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCWlmICghY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCclJywgdHJ1ZSkpIHsKLQkJCQlpc1BFRGVjbCA9IGZhbHNlOyAvLyA8IUVOVElUWSB4ICJ4Ij4KLQkJCX0KLQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQlpc1BFRGVjbCA9IHRydWU7IC8vIDwhRU5USVRZICUgeCAieCI+Ci0JCQl9Ci0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwUGFzdE5hbWUoJyAnKTsKLQkJCW5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJCWxlbiA9IG5vZGVPZmZzZXQgLSBwcmV2Tm9kZU9mZnNldDsKLQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJbmFtZSA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJCXByZXZOb2RlT2Zmc2V0ID0gbm9kZU9mZnNldDsKLQkJCX0KLQkJfQotCi0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJYm9vbGVhbiBzaW5nbGU7Ci0JCWlmICgoc2luZ2xlID0gY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdcJycsIHRydWUpKSB8fCBjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1wiJywgdHJ1ZSkpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IHNjYW5FbnRpdHlWYWx1ZShzaW5nbGUpOwotCQkJZW50aXR5RGVjbCA9IG5ldyBFbnRpdHlEZWNsKG5hbWUsIG93bmVyRFRELCB2YWx1ZSwgaXNQRURlY2wpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gZXh0ZXJuYWwgZW50aXR5Ci0JCQlFeHRlcm5hbElEIHhJRCA9IHNjYW5FeHRlcm5hbElEKCk7Ci0JCQlpZiAoeElEICE9IG51bGwpIHsKLQkJCQlpZiAoIWlzUEVEZWNsKSAvLyBnZW5lcmFsIGVudGl0eQotCQkJCXsKLQkJCQkJYm9vbGVhbiB1bnBhcnNlZCA9IGZhbHNlOwotCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJCXVucGFyc2VkID0gY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKG5kYXRhX3N0cmluZyk7Ci0JCQkJCWlmICh1bnBhcnNlZCkgewotCQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3ROYW1lKCcgJyk7Ci0JCQkJCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQkJCQlsZW4gPSBub2RlT2Zmc2V0IC0gcHJldk5vZGVPZmZzZXQ7Ci0JCQkJCQluZGF0YSA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVudGl0eURlY2wgPSBuZXcgRW50aXR5RGVjbChuYW1lLCBvd25lckRURCwgeElELCBpc1BFRGVjbCwgbmRhdGEpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbnRpdHlEZWNsOwotCX0KLQotCi0JLy8KLQkvLyBbODJdIE5vdGF0aW9uRGVjbCA6Oj0gJzwhTk9UQVRJT04nIFMgTmFtZSBTIChFeHRlcm5hbElEIHwgUHVibGljSUQpIFM/Ci0JLy8gJz4nCi0JLy8gWzc1XSBFeHRlcm5hbElEIDo6PSAnU1lTVEVNJyBTIFN5c3RlbUxpdGVyYWwKLQkvLyB8ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsIFMgU3lzdGVtTGl0ZXJhbAotCS8vIFs4M10gUHVibGljSUQgOjo9ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsCi0JLy8KLQkvLyBDYWxsZWQgYWZ0ZXIgc2Nhbm5pbmcgJ05PVEFUSU9OJwotCS8vCi0JcHVibGljIE5vdGF0aW9uRGVjbCBzY2FuTm90YXRpb25EZWNsKCkgewotCQlwcmV2Tm9kZU9mZnNldCA9IDE7Ci0JCW5vZGVPZmZzZXQgPSAxOwotCQlpbnQgbGVuOwotCQlOb3RhdGlvbkRlY2wgbm90YXRpb25EZWNsID0gbnVsbDsKLQotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0TmFtZSgnICcpOwotCQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJbGVuID0gbm9kZU9mZnNldCAtIHByZXZOb2RlT2Zmc2V0OwotCQkJaWYgKGxlbiA+IDApIHsKLQkJCQluYW1lID0gY29udGVudFN0cmluZy5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0JCQkJcHJldk5vZGVPZmZzZXQgPSBub2RlT2Zmc2V0OwotCQkJfQotCQl9Ci0KLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQlub3RhdGlvbkRlY2wgPSBuZXcgTm90YXRpb25EZWNsKG5hbWUsIG93bmVyRFREKTsKLQotCQlFeHRlcm5hbElEIHhJRCA9IHNjYW5FeHRlcm5hbElEKCk7Ci0JCWlmICh4SUQgIT0gbnVsbCkgewotCQkJaWYgKHhJRC5nZXRTeXN0ZW1MaXRlcmFsKCkgIT0gbnVsbCkgewotCQkJCW5vdGF0aW9uRGVjbC5zZXRTeXN0ZW1JZCh4SUQuZ2V0U3lzdGVtTGl0ZXJhbCgpKTsKLQkJCX0KLQkJCWlmICh4SUQuZ2V0UHViSWRMaXRlcmFsKCkgIT0gbnVsbCkgewotCQkJCW5vdGF0aW9uRGVjbC5zZXRQdWJsaWNJZCh4SUQuZ2V0UHViSWRMaXRlcmFsKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5vdGF0aW9uRGVjbDsKLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIHNjYW5FbnRpdHlWYWx1ZShib29sZWFuIHNpbmdsZSkgewotCQljaGFyIHFjaGFyID0gc2luZ2xlID8gJ1wnJyA6ICdcIic7Ci0JCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCWNvbnRlbnRTdHJpbmcuc2tpcFRvQ2hhcihxY2hhciwgZmFsc2UpOwotCQlpbnQgbGVuID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCkgLSBwcmV2Tm9kZU9mZnNldDsKLQkJU3RyaW5nIHZhbHVlID0gY29udGVudFN0cmluZy5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvLwotCS8vIFs3NV0gRXh0ZXJuYWxJRCA6Oj0gJ1NZU1RFTScgUyBTeXN0ZW1MaXRlcmFsCi0JLy8gfCAnUFVCTElDJyBTIFB1YmlkTGl0ZXJhbCBTIFN5c3RlbUxpdGVyYWwKLQlwcml2YXRlIEV4dGVybmFsSUQgc2NhbkV4dGVybmFsSUQoKSB7Ci0JCUV4dGVybmFsSUQgeElEID0gbnVsbDsKLQkJY2hhciBxY2hhciA9ICdcIic7Ci0JCWlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoc3lzdGVtX3N0cmluZykpIHsKLQkJCWlmICghY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCi0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdcJycsIHRydWUpKQotCQkJCXFjaGFyID0gJ1wnJzsKLQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCInLCB0cnVlKSkKLQkJCQlxY2hhciA9ICdcIic7Ci0KLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQljb250ZW50U3RyaW5nLnNraXBUb0NoYXIocWNoYXIsIHRydWUpOwotCQkJaW50IGxlbiA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpIC0gcHJldk5vZGVPZmZzZXQgLSAxOwotCQkJU3RyaW5nIHN5c3RlbUlkID0gY29udGVudFN0cmluZy5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInN5c3RlbWlkLi4uIiArIHN5c3RlbUlkKTsKLQkJCXhJRCA9IG5ldyBFeHRlcm5hbElEKHN5c3RlbUlkKTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcocHVibGljX3N0cmluZykpIHsKLQkJCWlmICghY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdcJycsIHRydWUpKQotCQkJCXFjaGFyID0gJ1wnJzsKLQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCInLCB0cnVlKSkKLQkJCQlxY2hhciA9ICdcIic7Ci0KLQkJCS8vIHB1YmxpY0xpdGVyYWwKLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQljb250ZW50U3RyaW5nLnNraXBUb0NoYXIocWNoYXIsIHRydWUpOwotCQkJaW50IGxlbiA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpIC0gcHJldk5vZGVPZmZzZXQgLSAxOwotCQkJU3RyaW5nIHB1YmxpY0lkID0gY29udGVudFN0cmluZy5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0KLQkJCS8vIHN5c3RlbUxpdGVyYWwKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1wnJywgdHJ1ZSkpCi0JCQkJcWNoYXIgPSAnXCcnOwotCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdcIicsIHRydWUpKQotCQkJCXFjaGFyID0gJ1wiJzsKLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQljb250ZW50U3RyaW5nLnNraXBUb0NoYXIocWNoYXIsIHRydWUpOwotCQkJbGVuID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCkgLSBwcmV2Tm9kZU9mZnNldCAtIDE7Ci0KLQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJU3RyaW5nIHN5c3RlbUlkID0gY29udGVudFN0cmluZy5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0JCQkJeElEID0gbmV3IEV4dGVybmFsSUQocHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXhJRCA9IG5ldyBFeHRlcm5hbElEKHB1YmxpY0lkLCBudWxsKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4geElEOwotCX0KLQotCS8vCi0JLy8gWzgzXSBQdWJsaWNJRCA6Oj0gJ1BVQkxJQycgUyBQdWJpZExpdGVyYWwKLQkvLwotCi0JLy8gZG13IDExLzE1IHByaXZhdGUgbWV0aG9kIG5ldmVyIHJlYWQgbG9jYWxseQotCS8vIFRPRE86IGNoYW5nZSB0byBwcml2YXRlIGlmIHVzZWQsIG90aGVyd2lzZSBzaG91bGQgYmUgcmVtb3ZlZAotCVN0cmluZyBzY2FuUHVibGljSUQoKSB7Ci0JCVN0cmluZyBwSUQgPSBudWxsOwotCQlpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKHB1YmxpY19zdHJpbmcpKSB7Ci0JCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQlyZXR1cm4gcElEOwotCQkJfQotCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQkJY29udGVudFN0cmluZy5za2lwVG9DaGFyKCcgJywgdHJ1ZSk7Ci0JCQlpbnQgbGVuID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCkgLSBwcmV2Tm9kZU9mZnNldDsKLQkJCXBJRCA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQl9Ci0KLQkJcmV0dXJuIHBJRDsKLQl9Ci0KLQkvLwotCS8vIE1haW4KLQkvLwotCi0JLyoqIE1haW4gcHJvZ3JhbSBlbnRyeSBwb2ludC4gKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0KLQkJLy8gaXMgdGhlcmUgYW55dGhpbmcgdG8gZG8/Ci0JCWlmIChhcmd2Lmxlbmd0aCA9PSAwKSB7Ci0JCQlTeXN0ZW0uZXhpdCgxKTsKLQkJfQotCi0JCS8vIERURFNjYW5uZXIgc2MgPSBuZXcgRFREU2Nhbm5lcihhcmd2WzBdKTsKLQkJRFREU2Nhbm5lciBzYyA9IG5ldyBEVERTY2FubmVyKCJoZWxsby5kdGQiLCAiIGdpZiBTWVNURU0gXCJHSUYgRmlsZVwiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlOb3RhdGlvbkRlY2wgbiA9IHNjLnNjYW5Ob3RhdGlvbkRlY2woKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJOb2F0aW9uIE5hbWU6ICIgKyBuLmdldE5vZGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiU3lzdGVtSWQ6ICIgKyBuLmdldFN5c3RlbUlkKCkpOyAvLyROT04tTkxTLTEkCi0KLQotCQkvLyBBdHRyaWJ1dGVzCi0JCS8vIFZlY3RvciBsaXN0cyA9IHNjLnNjYW5BdHRsaXN0RGVjbCgpOwotCQkvLyBzYy5wcmludEF0dExpc3QobGlzdHMpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ006ICIgKyBzYy5zY2FuQ29udGVudE1vZGVsKCkpOwotCi0JfSAvLyBtYWluKFN0cmluZ1tdKQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXJyb3JTdHJpbmcKLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yU3RyaW5nKCkgewotCQlyZXR1cm4gZXJyb3JTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXJyb3JTdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JTdHJpbmcKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvclN0cmluZyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFcnJvclN0cmluZyhTdHJpbmcgZXJyb3JTdHJpbmcpIHsKLQkJdGhpcy5lcnJvclN0cmluZyA9IGVycm9yU3RyaW5nOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRGVjbE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RlY2xOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMjMwNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRGVjbE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgRGVjbE5vZGUgewotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IElOVkFMSUQgPSAtMTsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBFTEVNRU5UID0gMTsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBBVFRMSVNUID0gMjsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBFTlRJVFkgPSAzOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IElOVEVSTkFMX0VOVElUWSA9IDQ7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgRVhURVJOQUxfRU5USVRZID0gNTsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBJTlRFUk5BTF9HRU5FUkFMX0VOVElUWSA9IDY7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgSU5URVJOQUxfUEFSQU1FVEVSX0VOVElUWSA9IDc7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgRVhURVJOQUxfR0VORVJBTF9FTlRJVFkgPSA4OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IEVYVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFkgPSA5OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IFBBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFID0gMTA7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgTk9UQVRJT04gPSAxMTsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBDT01NRU5UID0gMTI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBTVEFSVF9EVEQgPSAyMTsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBFTkRfRFREID0gMjI7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgU1RBUlRfRU5USVRZX0RURCA9IDIzOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IEVORF9FTlRJVFlfRFREID0gMjQ7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgRVJST1IgPSAyNTsKLQotCXB1YmxpYyBpbnQgdHlwZSA9IElOVkFMSUQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVjbE5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGNvbnRlbnRTdHJpbmcgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgY29tbWVudCA9IG51bGw7Ci0KLQkvLwotCS8vIENvbnN0YW50cwotCS8vCi0KLQkvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gKi8KLQlwdWJsaWMgRGVjbE5vZGUoaW50IHR5cGUpIHsKLQkJdGhpcyhudWxsLCB0eXBlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgRGVjbE5vZGUoU3RyaW5nIG5hbWUsIGludCB0eXBlLCBTdHJpbmcgY29udGVudFN0cmluZykgewotCQl0aGlzLmRlY2xOYW1lID0gbmFtZTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy5jb250ZW50U3RyaW5nID0gY29udGVudFN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlY2xOYW1lKCkgewotCQlyZXR1cm4gZGVjbE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVjbE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZGVjbE5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQllcnJvck1lc3NhZ2UgPSBtZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFN0cmluZygpIHsKLQkJcmV0dXJuIGNvbnRlbnRTdHJpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGVudFN0cmluZyhTdHJpbmcgY29udGVudCkgewotCQl0aGlzLmNvbnRlbnRTdHJpbmcgPSBjb250ZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgewotCQl0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCi0JewotCQlyZXR1cm4gIk5vZGUgTmFtZTogIiArIGRlY2xOYW1lICsgIiBUeXBlOiAiICsgdHlwZSArICIgQ29udGVudFN0cmluZzogIiArIGNvbnRlbnRTdHJpbmc7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0VsZW1lbnREZWNsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbGVtZW50RGVjbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTVjNzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0VsZW1lbnREZWNsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgRWxlbWVudERlY2wgZXh0ZW5kcyBCYXNlTm9kZSB7Ci0JQ01Ob2RlIGNvbnRlbnRNb2RlbE5vZGUgPSBudWxsOwotCi0JcHVibGljIEVsZW1lbnREZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgb3duZXJEVEQpIHsKLQkJdGhpcyhuYW1lLCBvd25lckRURCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEVsZW1lbnREZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgb3duZXJEVEQsIFN0cmluZyBjb21tZW50LCBFcnJvck1lc3NhZ2UgZXJyb3JNZXNzYWdlKSB7Ci0JCXN1cGVyKG5hbWUsIG93bmVyRFRELCBjb21tZW50LCBlcnJvck1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyBDTU5vZGUgZ2V0Q29udGVudE1vZGVsTm9kZSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRNb2RlbE5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGVudE1vZGVsTm9kZShDTU5vZGUgY21ub2RlKSB7Ci0JCWNvbnRlbnRNb2RlbE5vZGUgPSBjbW5vZGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbnRpdHlEZWNsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbnRpdHlEZWNsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODg3N2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRW50aXR5RGVjbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlEZWNsIGV4dGVuZHMgQmFzZU5vZGUgewotCWJvb2xlYW4gaXNQYXJhbWV0ZXIgPSBmYWxzZTsKLQlTdHJpbmcgZXhwYW5kZWRWYWx1ZSA9IG51bGw7IC8vIEFsd2F5cyA8dmFyPm51bGw8L3Zhcj4gZm9yIGV4dGVybmFsCi0JCQkJCQkJCQkvLyBFbnRpdGllcwotCVN0cmluZyB2YWx1ZSA9IG51bGw7IC8vIEFsd2F5cyA8dmFyPm51bGw8L3Zhcj4gZm9yIGV4dGVybmFsIEVudGl0aWVzCi0JRXh0ZXJuYWxJRCBleHRlcm5hbElEID0gbnVsbDsgLy8gQWx3YXlzIDx2YXI+bnVsbDwvdmFyPiBmb3IgaW50ZXJuYWwKLQkJCQkJCQkJCS8vIEVudGl0aWVzCi0JU3RyaW5nIG5kYXRhID0gbnVsbDsgLy8gQWx3YXlzIDx2YXI+bnVsbDwvdmFyPiBmb3IgaW50ZXJuYWwgRW50aXRpZXMKLQotCWJvb2xlYW4gcGFyc2VkID0gZmFsc2U7Ci0JRFREUGFyc2VyIGR0ZCA9IG51bGw7IC8vIEFsd2F5cyBudWxsLCBleGNlcHQgd2hlbiBpdCBoYXMgYmVlbiBwYXJzZWQuCi0KLQlib29sZWFuIGVudGl0eVJlZmVyZW5jZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBpbnRlcm5hbCBFbnRpdGllcy4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgTmFtZSBvZiB0aGlzIEVudGl0eS4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBYTUwtZW5jb2RlZCB2YWx1ZSB0aGF0IHdhcyBkaXJlY3RseSBhc3NpZ25lZCB0byB0aGUKLQkgKiAgICAgICAgICAgIEVudGl0eS4KLQkgKiBAcGFyYW0gaXNQYXJhbWV0ZXIKLQkgKiAgICAgICAgICAgID10cnVlIGlmIGEgcGFyYW1ldGVyIEVudGl0eTsgb3RoZXJ3aXNlID1mYWxzZS4KLQkgKi8KLQlwdWJsaWMgRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFRELCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gaXNQYXJhbWV0ZXIpIHsKLQkJc3VwZXIobmFtZSwgb3duZXJEVEQsIG51bGwsIG51bGwpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuaXNQYXJhbWV0ZXIgPSBpc1BhcmFtZXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgZXh0ZXJuYWwgRW50aXRpZXMuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIE5hbWUgb2YgdGhlIEVudGl0eS4KLQkgKiBAcGFyYW0gZXh0ZXJuYWxJRAotCSAqICAgICAgICAgICAgVGhlIHJlZmVyZW5jZShzKSB0byB0aGUgZXh0ZXJuYWwgZW50aXR5IHRvIHJldHJpZXZlLgotCSAqIEBwYXJhbSBpc1BhcmFtZXRlcgotCSAqICAgICAgICAgICAgPXRydWUgaWYgYSBwYXJhbWV0ZXIgRW50aXR5OyBvdGhlcndpc2UgPWZhbHNlLgotCSAqIEBwYXJhbSBuZGF0YQotCSAqICAgICAgICAgICAgVGhlIG5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmluYXJ5IEVudGl0eSwgb3IgPHZhcj5udWxsPC92YXI+Ci0JICogICAgICAgICAgICBpZiB0aGUgRW50aXR5IGlzIGEgdGV4dCBFbnRpdHkuCi0JICogQHNlZSBzYXguRXh0ZXJuYWxJRAotCSAqLwotCXB1YmxpYyBFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgb3duZXJEVEQsIEV4dGVybmFsSUQgZXh0ZXJuYWxJRCwgYm9vbGVhbiBpc1BhcmFtZXRlciwgU3RyaW5nIG5kYXRhKSB7Ci0JCXN1cGVyKG5hbWUsIG93bmVyRFRELCBudWxsLCBudWxsKTsKLQkJdGhpcy5leHRlcm5hbElEID0gZXh0ZXJuYWxJRDsKLQkJdGhpcy5pc1BhcmFtZXRlciA9IGlzUGFyYW1ldGVyOwotCQl0aGlzLm5kYXRhID0gbmRhdGE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgRW50aXR5IGlzIGEgcGFyYW1ldGVyIEVudGl0eS4KLQkgKiAKLQkgKiBAcmV0dXJuID10cnVlIGlmIGFuIGludGVybmFsIHBhcmFtZXRlciBFbnRpdHk7IG90aGVyd2lzZSA9ZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmlzUGFyYW1ldGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgRW50aXR5LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIFhNTC1lbmNvZGVkIHZhbHVlIHRoYXQgd2FzIGRpcmVjdGx5IGFzc2lnbmVkIHRvIHRoZQotCSAqICAgICAgICAgaW50ZXJuYWwgRW50aXR5OyBvdGhlcndpc2UsIDx2YXI+bnVsbDwvdmFyPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VudGl0eVJlZmVyZW5jZWQoKSB7Ci0JCXJldHVybiBlbnRpdHlSZWZlcmVuY2VkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVudGl0eVJlZmVyZW5jZWQoYm9vbGVhbiByZWZlcmVuY2UpIHsKLQkJZW50aXR5UmVmZXJlbmNlZCA9IHJlZmVyZW5jZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoZSBOb3RhdGlvbi4gQSBzeXN0ZW0gaWRlbnRpZmllciBpcyBhCi0JICogVVJJLCB3aGljaCBtYXkgYmUgdXNlZCB0byByZXRyaWV2ZSBhbiBleHRlcm5hbCBlbnRpdHkncyBjb250ZW50LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGRlZmluZWQgYnkgRE9NLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHN5c3RlbSBpZGVudGlmaWVyLCBvciA8dmFyPm51bGw8L3Zhcj4gaWYgdGhlIGlkZW50aWZpZXIgaXMKLQkgKiAgICAgICAgIG5vdCBkZWZpbmVkLgotCSAqIEBzZWUgb3JnLmVjbGlwY3NlLndzdC5kdGQucGFyc2VyLkV4dGVybmFsSUQjZ2V0U3lzdGVtTGl0ZXJhbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0JCWlmIChleHRlcm5hbElEID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZQotCQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxJRC5nZXRTeXN0ZW1MaXRlcmFsKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3lzdGVtIGlkZW50aWZpZXIgb2YgdGhlIE5vdGF0aW9uLiBBIHN5c3RlbSBpZGVudGlmaWVyIGlzIGEKLQkgKiBVUkksIHdoaWNoIG1heSBiZSB1c2VkIHRvIHJldHJpZXZlIGFuIGV4dGVybmFsIGVudGl0eSdzIGNvbnRlbnQuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgZGVmaW5lZCBieSBET00uCi0JICogCi0JICogQHBhcmFtIHN5c3RlbUlkZW50aWZpZXIKLQkgKiAgICAgICAgICAgIFRoZSBzeXN0ZW0gaWRlbnRpZmllci4KLQkgKiBAc2VlIG9yZy5lY2xpcGNzZS53c3QuZHRkLnBhcnNlci5FeHRlcm5hbElECi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSWQoU3RyaW5nIHN5c3RlbUlkZW50aWZpZXIpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzZXRTWXN0ZW1JZCAtIGV4dGVybmFsSWQ6ICIgKyBleHRlcm5hbElEKTsKLQkJdGhpcy5leHRlcm5hbElEID0gbmV3IEV4dGVybmFsSUQodGhpcy5leHRlcm5hbElELmdldFB1YklkTGl0ZXJhbCgpLCBzeXN0ZW1JZGVudGlmaWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGUgTm90YXRpb24uIFRoaXMgdmFsdWUgaXMgb25seSB2YWxpZAotCSAqIGlmIHRoZSBpZGVudGlmaWVyIGlzIGRlZmluZWQgYXMgPHZhcj5wdWJsaWM8L3Zhcj4gKGFzIG9wcG9zZWQgdG8KLQkgKiA8dmFyPnN5c3RlbTwvdmFyPikuIFB1YmxpYyBpZGVudGlmaWVycyBtYXkgYmUgdXNlZCB0byB0cnkgdG8gZ2VuZXJhdGUKLQkgKiBhbiBhbHRlcm5hdGl2ZSBVUkkgaW4gb3JkZXIgdG8gcmV0cmlldmUgdGhlIGFuIGV4dGVybmFsIGVudGl0aWVzCi0JICogY29udGVudC4gSWYgcmV0cmlldmFsIGZhaWxzIHVzaW5nIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgYW4gYXR0ZW1wdAotCSAqIG11c3QgYmUgbWFkZSB0byByZXRyaWV2ZSBjb250ZW50IHVzaW5nIHRoZSBzeXN0ZW0gaWRlbnRpZmllci4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWZpbmVkIGJ5IERPTS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwdWJsaWMgaWRlbnRpZmllciwgb3IgPHZhcj5udWxsPC92YXI+IGlmIHRoZSBpZGVudGlmaWVyIGlzCi0JICogICAgICAgICBub3QgZGVmaW5lZC4KLQkgKiBAc2VlIG9yZy5lY2xpcGNzZS53c3QuZHRkLnBhcnNlci5FeHRlcm5hbElECi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJaWYgKGV4dGVybmFsSUQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlCi0JCQlyZXR1cm4gdGhpcy5leHRlcm5hbElELmdldFB1YklkTGl0ZXJhbCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoZSBOb3RhdGlvbi4gVGhpcyB2YWx1ZSBpcyBvbmx5IHZhbGlkIGlmCi0JICogdGhlIGlkZW50aWZpZXIgaXMgZGVmaW5lZCBhcyA8dmFyPnB1YmxpYzwvdmFyPiAoYXMgb3Bwb3NlZCB0bwotCSAqIDx2YXI+c3lzdGVtPC92YXI+KS4gUHVibGljIGlkZW50aWZpZXJzIG1heSBiZSB1c2VkIHRvIHRyeSB0byBnZW5lcmF0ZQotCSAqIGFuIGFsdGVybmF0aXZlIFVSSSBpbiBvcmRlciB0byByZXRyaWV2ZSB0aGUgYW4gZXh0ZXJuYWwgZW50aXRpZXMKLQkgKiBjb250ZW50LiBJZiByZXRyaWV2YWwgZmFpbHMgdXNpbmcgdGhlIHB1YmxpYyBpZGVudGlmaWVyLCBhbiBhdHRlbXB0Ci0JICogbXVzdCBiZSBtYWRlIHRvIHJldHJpZXZlIGNvbnRlbnQgdXNpbmcgdGhlIHN5c3RlbSBpZGVudGlmaWVyLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGRlZmluZWQgYnkgRE9NLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaWNJZGVudGlmaWVyCi0JICogICAgICAgICAgICBUaGUgcHVibGljIGlkZW50aWZpZXIuCi0JICogQHNlZSAjZ2V0UHVibGljSWQKLQkgKiBAc2VlIG9yZy5lY2xpcGNzZS53c3QuZHRkLnBhcnNlci5FeHRlcm5hbElECi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YmxpY0lkZW50aWZpZXIpIHsKLQkJdGhpcy5leHRlcm5hbElEID0gbmV3IEV4dGVybmFsSUQocHVibGljSWRlbnRpZmllciwgdGhpcy5leHRlcm5hbElELmdldFN5c3RlbUxpdGVyYWwoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXh0ZXJuYWwgSUQgb2YgdGhpcyBFbnRpdHkuCi0JICogCi0JICogQHJldHVybiBUaGUgcmVmZXJlbmNlKHMpIHRvIHRoZSBleHRlcm5hbCBlbnRpdHkgdG8gcmV0cmlldmU7IG90aGVyd2lzZSwKLQkgKiAgICAgICAgIDx2YXI+bnVsbDwvdmFyPi4KLQkgKiBAc2VlIG9yZy5lY2xpcGNzZS53c3QuZHRkLnBhcnNlci5FeHRlcm5hbElECi0JICovCi0JcHVibGljIEV4dGVybmFsSUQgZ2V0RXh0ZXJuYWxJRCgpIHsKLQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxJRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBlbnRpdHkgdmFsdWUgaXMgZXh0ZXJuYWwuCi0JICogCi0JICogQHJldHVybiA9dHJ1ZSBpZiBlbnRpdHkgaXMgZXh0ZXJuYWw7IG90aGVyd2lzZSwgPWZhbHNlLgotCSAqIEBzZWUgb3JnLmVjbGlwY3NlLndzdC5kdGQucGFyc2VyLkV4dGVybmFsSUQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKCkgewotCQlyZXR1cm4gdGhpcy5leHRlcm5hbElEICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbm90YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXh0ZXJuYWwgYmluYXJ5IEVudGl0eSwKLQkgKiAgICAgICAgIG90aGVyd2lzZSwgPHZhcj5udWxsPC92YXI+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLm5kYXRhOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vdGF0aW9uKFN0cmluZyBuZGF0YSkgewotCQl0aGlzLm5kYXRhID0gbmRhdGE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbm90YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGRlZmluZWQgYnkgRE9NLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXh0ZXJuYWwgYmluYXJ5IEVudGl0eSwKLQkgKiAgICAgICAgIG90aGVyd2lzZSwgPHZhcj5udWxsPC92YXI+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWZpbmVkIGJ5IERPTS4KLQkgKiAKLQkgKiBwdWJsaWMgdm9pZCBzZXROb3RhdGlvbk5hbWUoU3RyaW5nIGFyZykgeyB0aGlzLm5kYXRhID0gYXJnOyB9Ci0JICovCi0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlcmUgaXMgYSBub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbnRpdHkgdmFsdWUuCi0JICogCi0JICogQHJldHVybiA9dHJ1ZSBpZiB0aGUgZXh0ZXJuYWwgYmluYXJ5IGVudGl0eSBjb250YWlucyBhIG5vdGF0aW9uOwotCSAqICAgICAgICAgb3RoZXJ3aXNlLCA9ZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMubmRhdGEgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgcykgewotCQl0aGlzLnZhbHVlID0gczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJzZWQoYm9vbGVhbiBwKSB7Ci0JCXRoaXMucGFyc2VkID0gcDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRQYXJzZWQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcnNlZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0VudGl0eVBvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0VudGl0eVBvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiZDFmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbnRpdHlQb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlQb29sIHsKLQlwcml2YXRlIEhhc2h0YWJsZSBtX2VudGl0eSA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIEhhc2h0YWJsZSBtX3BhcmEgPSBuZXcgSGFzaHRhYmxlKCk7IC8vIHBhcmFtZXRlciByZWZlcmVuY2VzCi0KLQlwdWJsaWMgRW50aXR5UG9vbCgpIHsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkJU3RyaW5nIG5hbWUgPSBlbnRpdHkuZ2V0Tm9kZU5hbWUoKTsKLQkJaWYgKGVudGl0eS5pc1BhcmFtZXRlcigpKSB7Ci0JCQlpZiAobV9wYXJhLmNvbnRhaW5zS2V5KG5hbWUpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCW1fcGFyYS5wdXQobmFtZSwgZW50aXR5KTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChtX2VudGl0eS5jb250YWluc0tleShuYW1lKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQltX2VudGl0eS5wdXQobmFtZSwgZW50aXR5KTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5RGVjbCByZWZlcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKEVudGl0eURlY2wpIG1fZW50aXR5LmdldChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5RGVjbCByZWZlclBhcmEoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChFbnRpdHlEZWNsKSBtX3BhcmEuZ2V0KG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiA8Q09ERT5FbnVtZXJhdGlvbjwvQ09ERT4gb2YgPENPREU+RW50aXR5RGVjbDwvQ09ERT4uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBjc2Uud3N0LmR0ZC5wYXJzZXIuRW50aXR5RGVjbAotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBlbGVtZW50cygpIHsKLQkJcmV0dXJuIG1fZW50aXR5LmVsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIDxDT0RFPkVudW1lcmF0aW9uPC9DT0RFPiBvZiA8Q09ERT5FbnRpdHlEZWNsPC9DT0RFPiBmb3IKLQkgKiBwYXJhbWV0ZXIgZW50aXRpZXMuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBjc2Uud3N0LmR0ZC5wYXJzZXIuRW50aXR5RGVjbAotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBwYXJhbWV0ZXJFbnRpdHlFbGVtZW50cygpIHsKLQkJcmV0dXJuIG1fcGFyYS5lbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIEZvciBEVEQjZ2V0RW50aXRpZXMoKTsKLQkgKi8KLQlIYXNodGFibGUgZ2V0RW50aXR5SGFzaCgpIHsKLQkJcmV0dXJuIHRoaXMubV9lbnRpdHk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRXJyb3JNZXNzYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FcnJvck1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAxMjM0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FcnJvck1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi0KLQotcHVibGljIGNsYXNzIEVycm9yTWVzc2FnZSB7Ci0JcHJpdmF0ZSBpbnQgZXJyb3JMaW5lLCBlcnJvckNvbHVtbiwgc2V2ZXJpdHk7Ci0JcHJpdmF0ZSBTdHJpbmcgZXJyb3JTdHJpbmc7Ci0KLQotCXB1YmxpYyBFcnJvck1lc3NhZ2UoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvcikgewotCQllcnJvclN0cmluZyA9IGVycm9yOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNldmVyaXR5KGludCBzZXZlcml0eSkgewotCQl0aGlzLnNldmVyaXR5ID0gc2V2ZXJpdHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoU3RyaW5nIHNldmVyaXR5KSB7Ci0JCWlmIChzZXZlcml0eSA9PSAid2FybmluZyIpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5zZXZlcml0eSA9IDA7Ci0JCX0KLQkJZWxzZSBpZiAoc2V2ZXJpdHkgPT0gImVycm9yIikgeyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLnNldmVyaXR5ID0gMTsKLQkJfQotCQllbHNlIGlmIChzZXZlcml0eSA9PSAiZmF0YWwiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMuc2V2ZXJpdHkgPSAyOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JMaW5lKGludCBsaW5lKSB7Ci0JCWVycm9yTGluZSA9IGxpbmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JDb2x1bW4oaW50IGNvbHVtbikgewotCQllcnJvckNvbHVtbiA9IGNvbHVtbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGVycm9yU3RyaW5nOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBzZXZlcml0eTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVycm9yTGluZSgpIHsKLQkJcmV0dXJuIGVycm9yTGluZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVycm9yQ29sdW1uKCkgewotCQlyZXR1cm4gZXJyb3JDb2x1bW47Ci0JfQotCi0JcHJpdmF0ZSBpbnQgc3RhcnRPZmZzZXQgPSAtMTsKLQotCXB1YmxpYyB2b2lkIHNldEVycm9yU3RhcnRPZmZzZXQoaW50IHN0YXJ0KSB7Ci0JCXN0YXJ0T2Zmc2V0ID0gc3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRFcnJvclN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gc3RhcnRPZmZzZXQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZW5kT2Zmc2V0ID0gLTE7Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvckVuZE9mZnNldChpbnQgZW5kKSB7Ci0JCWVuZE9mZnNldCA9IGVuZDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVycm9yRW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZW5kT2Zmc2V0OwotCX0KLQotCi0JT2JqZWN0IG9iamVjdDsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGNsb3Nlc3Qgb2JqZWN0IHRvIHRoZSBlcnJvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGNsb3Nlc3Qgb2JqZWN0IHRvIHRoZSBlcnJvci4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IHYpIHsKLQkJdGhpcy5vYmplY3QgPSB2OwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRkTmV3RXJyb3JNZXNzYWdlTGluZShTdHJpbmcgbmV3TGluZSkgewotCQllcnJvclN0cmluZyArPSAiXG4iICsgbmV3TGluZTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0V4dGVybmFsSUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0V4dGVybmFsSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViMDA5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FeHRlcm5hbElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEV4dGVybmFsSUQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUX1NZU1RFTSA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRfUFVCTElDID0gMTsKLQotCWludCB0eXBlID0gVF9QVUJMSUM7Ci0JU3RyaW5nIHB1YmxpY0lEID0gbnVsbDsKLQlTdHJpbmcgc3lzdGVtSUQgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIHN5c3RlbSBJRHMuCi0JICogCi0JICogQHBhcmFtIHN5c3RlbUlECi0JICogICAgICAgICAgICBVUkksIHdoaWNoIG1heSBiZSB1c2VkIHRvIHJldHJpZXZlIGFuIGV4dGVybmFsIGVudGl0eSdzCi0JICogICAgICAgICAgICBjb250ZW50LgotCSAqLwotCXB1YmxpYyBFeHRlcm5hbElEKFN0cmluZyBzeXN0ZW1JRCkgewotCQl0aGlzLnR5cGUgPSBUX1NZU1RFTTsKLQkJdGhpcy5wdWJsaWNJRCA9IG51bGw7Ci0JCXRoaXMuc3lzdGVtSUQgPSBzeXN0ZW1JRDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgcHVibGljIGFuZCBzeXN0ZW0gSURzLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaWNJRAotCSAqICAgICAgICAgICAgSWRlbnRpZmllciB0byBiZSB1c2VkIHRvIHRyeSB0byBnZW5lcmF0ZSBhbiBhbHRlcm5hdGl2ZSBVUkkKLQkgKiAgICAgICAgICAgIGluIG9yZGVyIHRvIHJldHJpZXZlIHRoZSBleHRlcm5hbCBlbnRpdHkncyBjb250ZW50LCBvcgotCSAqICAgICAgICAgICAgPHZhcj5udWxsPC92YXI+IGlmIGEgc3lzdGVtIGlkZW50aXRpZXIgaXMgdG8gYmUKLQkgKiAgICAgICAgICAgIGNvbnN0cnVjdGVkLgotCSAqIEBwYXJhbSBzeXN0ZW1JRAotCSAqICAgICAgICAgICAgVVJJLCB3aGljaCBtYXkgYmUgdXNlZCB0byByZXRyaWV2ZSBhbiBleHRlcm5hbCBlbnRpdHkncwotCSAqICAgICAgICAgICAgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgRXh0ZXJuYWxJRChTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCkgewotCQl0aGlzLnR5cGUgPSBUX1BVQkxJQzsKLQkJdGhpcy5wdWJsaWNJRCA9IHB1YmxpY0lEOwotCQl0aGlzLnN5c3RlbUlEID0gc3lzdGVtSUQ7Ci0JCWlmIChudWxsID09IHRoaXMucHVibGljSUQpCi0JCQl0aGlzLnR5cGUgPSBUX1NZU1RFTTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGlmIHRoaXMgZXh0ZXJuYWwgSUQgaXMgYSBzeXN0ZW0gSUQgKG9yIHB1YmxpYyBJRCkuCi0JICogCi0JICogQHJldHVybiBTeXN0ZW0gSUQ9dHJ1ZSwgUHVibGljIElEPWZhbHNlLgotCSAqIEBzZWUgI2lzUHVibGljCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTeXN0ZW0oKSB7Ci0JCXJldHVybiB0aGlzLnR5cGUgPT0gVF9TWVNURU07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpZiB0aGlzIGV4dGVybmFsIElEIGlzIGEgcHVibGljIElEIChvciBzeXN0ZW0gSUQpLgotCSAqIAotCSAqIEByZXR1cm4gUHVibGljIElEPXRydWUsIFN5c3RlbSBJRD1mYWxzZS4KLQkgKiBAc2VlICNpc1N5c3RlbQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGljKCkgewotCQlyZXR1cm4gdGhpcy50eXBlID09IFRfUFVCTElDOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoaXMgZXh0ZXJuYWwgSUQuIEEgc3lzdGVtIGlkZW50aWZpZXIKLQkgKiBpcyBhIFVSSSwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gcmV0cmlldmUgYW4gZXh0ZXJuYWwgZW50aXR5J3MgY29udGVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzeXN0ZW0gaWRlbnRpZmllciwgb3IgPHZhcj5udWxsPC92YXI+IGlmIHRoZSBpZGVudGlmaWVyIGlzCi0JICogICAgICAgICBub3QgZGVmaW5lZC4KLQkgKiBAc2VlICNnZXRQdWJpZExpdGVyYWwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUxpdGVyYWwoKSB7Ci0JCXJldHVybiB0aGlzLnN5c3RlbUlEOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoaXMgZXh0ZXJuYWwgSUQuIFRoaXMgdmFsdWUgaXMgb25seQotCSAqIHZhbGlkIGlmIHRoZSBpZGVudGlmaWVyIGlzIGRlZmluZWQgYXMgPHZhcj5wdWJsaWM8L3Zhcj4gKGFzIG9wcG9zZWQgdG8KLQkgKiA8dmFyPnN5c3RlbTwvdmFyPikuIFB1YmxpYyBpZGVudGlmaWVycyBtYXkgYmUgdXNlZCB0byB0cnkgdG8gZ2VuZXJhdGUKLQkgKiBhbiBhbHRlcm5hdGl2ZSBVUkkgaW4gb3JkZXIgdG8gcmV0cmlldmUgYW4gZXh0ZXJuYWwgZW50aXR5J3MgY29udGVudC4KLQkgKiBJZiByZXRyaWV2YWwgZmFpbHMgdXNpbmcgdGhlIHB1YmxpYyBpZGVudGlmaWVyLCBhbiBhdHRlbXB0IG11c3QgYmUgbWFkZQotCSAqIHRvIHJldHJpZXZlIGNvbnRlbnQgdXNpbmcgdGhlIHN5c3RlbSBpZGVudGlmaWVyLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHB1YmxpYyBpZGVudGlmaWVyLCBvciA8dmFyPm51bGw8L3Zhcj4gaWYgdGhlIGlkZW50aWZpZXIgaXMKLQkgKiAgICAgICAgIG5vdCBkZWZpbmVkLgotCSAqIEBzZWUgI2dldFN5c3RlbUxpdGVyYWwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1YklkTGl0ZXJhbCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGljSUQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIGV4dGVybmFsIElEIGluIHRoZSBmb3JtYXQgaXQgd2FzIGRlY2xhcmVkOiA8Q09ERT5TWVNURU0KLQkgKiAmcXVvdDs8VkFSPnN5c3RlbUlEPC9WQVI+JnF1b3Q7PC9DT0RFPiBvciA8Q09ERT5QVUJMSUMgJnF1b3Q7PFZBUj5wdWJsaWNJRDwvVkFSPiZxdW90OwotCSAqICZxdW90OzxWQVI+c3lzdGVtSUQ8L1ZBUj4mcXVvdDs8L0NPREU+LgotCSAqIAotCSAqIEByZXR1cm4gWE1MIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIGV4dGVybmFsIElEIChuZXZlcgotCSAqICAgICAgICAgPHZhcj5udWxsPC92YXI+KS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgcmV0OwotCQlpZiAoaXNTeXN0ZW0oKSkgewotCQkJcmV0ID0gIlNZU1RFTSBcIiIgKyBnZXRTeXN0ZW1MaXRlcmFsKCkgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIGlmIChudWxsICE9IGdldFN5c3RlbUxpdGVyYWwoKSkgewotCQkJcmV0ID0gIlBVQkxJQyBcIiIgKyBnZXRQdWJJZExpdGVyYWwoKSArICJcIiBcIiIgKyBnZXRTeXN0ZW1MaXRlcmFsKCkgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCWVsc2UgewotCQkJcmV0ID0gIlBVQkxJQyBcIiIgKyBnZXRQdWJJZExpdGVyYWwoKSArICJcIiI7IC8vIGZvciBOT1RBVElPTiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgRXh0ZXJuYWxJRCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUV4dGVybmFsSUQgZWlkID0gKEV4dGVybmFsSUQpIG9iajsKLQkJaWYgKCEoKGVpZC5wdWJsaWNJRCA9PSBudWxsICYmIHRoaXMucHVibGljSUQgPT0gbnVsbCkgfHwgZWlkLnB1YmxpY0lEICE9IG51bGwgJiYgZWlkLnB1YmxpY0lELmVxdWFscyh0aGlzLnB1YmxpY0lEKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghKChlaWQuc3lzdGVtSUQgPT0gbnVsbCAmJiB0aGlzLnN5c3RlbUlEID09IG51bGwpIHx8IGVpZC5zeXN0ZW1JRCAhPSBudWxsICYmIGVpZC5zeXN0ZW1JRC5lcXVhbHModGhpcy5zeXN0ZW1JRCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCByZXR2YWwgPSAwOwotCQlpZiAocHVibGljSUQgIT0gbnVsbCkKLQkJCXJldHZhbCA9IHB1YmxpY0lELmhhc2hDb2RlKCk7Ci0JCWlmIChzeXN0ZW1JRCAhPSBudWxsKQotCQkJcmV0dmFsICs9IHN5c3RlbUlELmhhc2hDb2RlKCk7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9Ob3RhdGlvbkRlY2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL05vdGF0aW9uRGVjbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTE1ODAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL05vdGF0aW9uRGVjbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotLyoqCi0gKiBOb3RhdGlvbnMgYXJlIGhvdyB0aGUgRG9jdW1lbnQgVHlwZSBEZXNjcmlwdGlvbiAoRFREKSByZWNvcmRzIGhpbnRzIGFib3V0Ci0gKiB0aGUgZm9ybWF0IG9mIGFuIFhNTCAidW5wYXJzZWQgZW50aXR5IiAtLSBpbiBvdGhlciB3b3Jkcywgbm9uLVhNTCBkYXRhCi0gKiBib3VuZCB0byB0aGlzIGRvY3VtZW50IHR5cGUsIHdoaWNoIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIGNvbnN1bHQKLSAqIHdoZW4gbWFuaXB1bGF0aW5nIHRoZSBkb2N1bWVudC4gQSBOb3RhdGlvbiByZXByZXNlbnRzIGEgbmFtZS12YWx1ZSBwYWlyLAotICogd2l0aCBpdHMgbm9kZU5hbWUgYmVpbmcgc2V0IHRvIHRoZSBkZWNsYXJlZCBuYW1lIG9mIHRoZSBub3RhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE5vdGF0aW9uRGVjbCBleHRlbmRzIEJhc2VOb2RlIHsKLQkvKiogUHVibGljIGlkZW50aWZpZXIuICovCi0JcHJvdGVjdGVkIFN0cmluZyBwdWJsaWNJZCA9IG51bGw7Ci0KLQkvKiogU3lzdGVtIGlkZW50aWZpZXIuICovCi0JcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JZCA9IG51bGw7Ci0KLQkvLwotCS8vIENvbnN0cnVjdG9ycwotCS8vCi0KLQkvKiogRmFjdG9yeSBjb25zdHJ1Y3Rvci4gKi8KLQlwdWJsaWMgTm90YXRpb25EZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgb3duZXJEVEQpIHsKLQkJc3VwZXIobmFtZSwgb3duZXJEVEQpOwotCX0KLQotCS8vCi0JLy8gTm90YXRpb24gbWV0aG9kcwotCS8vCi0KLQkvKioKLQkgKiBUaGUgUHVibGljIElkZW50aWZpZXIgZm9yIHRoaXMgTm90YXRpb24uIElmIG5vIHB1YmxpYyBpZGVudGlmaWVyIHdhcwotCSAqIHNwZWNpZmllZCwgdGhpcyB3aWxsIGJlIG51bGwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIHB1YmxpY0lkOwotCX0gLy8gZ2V0UHVibGljSWQoKTpTdHJpbmcKLQotCS8qKgotCSAqIFRoZSBTeXN0ZW0gSWRlbnRpZmllciBmb3IgdGhpcyBOb3RhdGlvbi4gSWYgbm8gc3lzdGVtIGlkZW50aWZpZXIgd2FzCi0JICogc3BlY2lmaWVkLCB0aGlzIHdpbGwgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlyZXR1cm4gc3lzdGVtSWQ7Ci0JfSAvLyBnZXRTeXN0ZW1JZCgpOlN0cmluZwotCi0JLy8KLQkvLyBQdWJsaWMgbWV0aG9kcwotCS8vCi0KLQkvKioKLQkgKiBOT04tRE9NOiBUaGUgUHVibGljIElkZW50aWZpZXIgZm9yIHRoaXMgTm90YXRpb24uIElmIG5vIHB1YmxpYwotCSAqIGlkZW50aWZpZXIgd2FzIHNwZWNpZmllZCwgdGhpcyB3aWxsIGJlIG51bGwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIGlkKSB7Ci0JCXB1YmxpY0lkID0gaWQ7Ci0JfSAvLyBzZXRQdWJsaWNJZChTdHJpbmcpCi0KLQkvKioKLQkgKiBOT04tRE9NOiBUaGUgU3lzdGVtIElkZW50aWZpZXIgZm9yIHRoaXMgTm90YXRpb24uIElmIG5vIHN5c3RlbQotCSAqIGlkZW50aWZpZXIgd2FzIHNwZWNpZmllZCwgdGhpcyB3aWxsIGJlIG51bGwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSWQoU3RyaW5nIGlkKSB7Ci0JCXN5c3RlbUlkID0gaWQ7Ci0JfSAvLyBzZXRTeXN0ZW1JZChTdHJpbmcpCi0KLX0gLy8gY2xhc3MgTm90YXRpb25JbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9TdHJpbmdQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL1N0cmluZ1BhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTliNzRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL1N0cmluZ1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLS8qKgotICogUmVhZGVyIGZvciBwcm9jZXNzaW5nL3BhcnNpbmcgeG1sIHN0cmluZwotICogCi0gKiBAdmVyc2lvbgotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nUGFyc2VyIHsKLQlTdHJpbmcgZkRhdGEgPSBudWxsOwotCWludCBmRW5kT2Zmc2V0OwotCWludCBmTW9zdFJlY2VudENoYXI7Ci0JaW50IGZDdXJyZW50T2Zmc2V0OwotCWJvb2xlYW4gZkNhbGxlZENoYXJQcm9wSW5pdCA9IGZhbHNlOwotCi0JcHVibGljIFN0cmluZ1BhcnNlcihTdHJpbmcgZGF0YSkgewotCQlmRGF0YSA9IGRhdGE7Ci0JCWZDdXJyZW50T2Zmc2V0ID0gMDsKLQkJZkVuZE9mZnNldCA9IGZEYXRhLmxlbmd0aCgpOwotCQlmTW9zdFJlY2VudENoYXIgPSBmRW5kT2Zmc2V0ID09IDAgPyAtMSA6IGZEYXRhLmNoYXJBdCgwKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZkRhdGEuc3Vic3RyaW5nKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB7Ci0JCXJldHVybiBmRGF0YTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlbWFpbmluZ1N0cmluZygpIHsKLQkJcmV0dXJuIGZEYXRhLnN1YnN0cmluZyhnZXRDdXJyZW50T2Zmc2V0KCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q3VycmVudE9mZnNldCgpIHsKLQkJcmV0dXJuIGZDdXJyZW50T2Zmc2V0OwotCX0KLQotCS8vCi0JLy8KLQlwdWJsaWMgaW50IGxvYWROZXh0Q2hhcigpIHsKLQkJaWYgKCsrZkN1cnJlbnRPZmZzZXQgPj0gZkVuZE9mZnNldCkgewotCQkJZk1vc3RSZWNlbnRDaGFyID0gLTE7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTW9zdFJlY2VudENoYXIgPSBmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQpOwotCQl9Ci0JCXJldHVybiBmTW9zdFJlY2VudENoYXI7Ci0JfQotCQotCXB1YmxpYyBpbnQgbG9hZFByZXZpb3VzQ2hhcigpIHsKLQkJaWYgKC0tZkN1cnJlbnRPZmZzZXQgPCAwKSAKLQkJCWZNb3N0UmVjZW50Q2hhciA9IC0xOwotCQllbHNlCi0JCQlmTW9zdFJlY2VudENoYXIgPSBmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQpOwotCQlyZXR1cm4gZk1vc3RSZWNlbnRDaGFyOwotCX0KLQotCS8vCi0JLy8KLQlwdWJsaWMgYm9vbGVhbiBsb29raW5nQXRDaGFyKGNoYXIgY2hyLCBib29sZWFuIHNraXBQYXN0Q2hhcikgewotCQlpbnQgY2ggPSBmTW9zdFJlY2VudENoYXI7Ci0JCWlmIChjaCAhPSBjaHIpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoc2tpcFBhc3RDaGFyKSB7Ci0JCQlpZiAoKytmQ3VycmVudE9mZnNldCA+PSBmRW5kT2Zmc2V0KSB7Ci0JCQkJZk1vc3RSZWNlbnRDaGFyID0gLTE7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmTW9zdFJlY2VudENoYXIgPSBmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vCi0JLy8KLQkvLwotCXB1YmxpYyBib29sZWFuIGxvb2tpbmdBdFZhbGlkQ2hhcihib29sZWFuIHNraXBQYXN0Q2hhcikgewotCQlpbnQgY2ggPSBmTW9zdFJlY2VudENoYXI7Ci0JCWlmIChjaCA8IDB4RDgwMCkgewotCQkJaWYgKGNoIDwgMHgyMCAmJiBjaCAhPSAweDA5ICYmIGNoICE9IDB4MEEgJiYgY2ggIT0gMHgwRCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChza2lwUGFzdENoYXIpIHsKLQkJCQlpZiAoKytmQ3VycmVudE9mZnNldCA+PSBmRW5kT2Zmc2V0KSB7Ci0JCQkJCWZNb3N0UmVjZW50Q2hhciA9IC0xOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZk1vc3RSZWNlbnRDaGFyID0gZkRhdGEuY2hhckF0KGZDdXJyZW50T2Zmc2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoY2ggPiAweEZGRkQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoY2ggPCAweERDMDApIHsKLQkJCWlmIChmQ3VycmVudE9mZnNldCArIDEgPj0gZkVuZE9mZnNldCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWNoID0gZkRhdGEuY2hhckF0KGZDdXJyZW50T2Zmc2V0ICsgMSk7Ci0JCQlpZiAoY2ggPCAweERDMDAgfHwgY2ggPj0gMHhFMDAwKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAoIXNraXBQYXN0Q2hhcikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZkN1cnJlbnRPZmZzZXQrKzsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChjaCA8IDB4RTAwMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChza2lwUGFzdENoYXIpIHsKLQkJCWlmICgrK2ZDdXJyZW50T2Zmc2V0ID49IGZFbmRPZmZzZXQpIHsKLQkJCQlmTW9zdFJlY2VudENoYXIgPSAtMTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZNb3N0UmVjZW50Q2hhciA9IGZEYXRhLmNoYXJBdChmQ3VycmVudE9mZnNldCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0JcHVibGljIGJvb2xlYW4gbG9va2luZ0F0U3BhY2UoYm9vbGVhbiBza2lwUGFzdENoYXIpIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQlpZiAoY2ggPiAweDIwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY2ggPT0gMHgyMCB8fCBjaCA9PSAweDBBIHx8IGNoID09IDB4MEQgfHwgY2ggPT0gMHgwOSkgewotCQkJaWYgKHNraXBQYXN0Q2hhcikgewotCQkJCWxvYWROZXh0Q2hhcigpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vCi0JLy8KLQkvLwotCXB1YmxpYyB2b2lkIHNraXBUb0NoYXIoY2hhciBjaHIsIGJvb2xlYW4gc2tpcFBhc3RDaGFyKSB7Ci0JCS8vCi0JCS8vIFJFVklTSVQgLSB0aGlzIHdpbGwgc2tpcCBpbnZhbGlkIGNoYXJhY3RlcnMgd2l0aG91dCByZXBvcnRpbmcgdGhlbS4KLQkJLy8KLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKGNoID09IGNocikgewotCQkJCWlmIChza2lwUGFzdENoYXIpIHsKLQkJCQkJbG9hZE5leHRDaGFyKCk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChjaCA9PSAtMSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNoID0gbG9hZE5leHRDaGFyKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogc2tpcHMgdG8gdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3Rlci4KLQkgKiBpZiA8Y29kZT5za2lwUGFzdENoYXI8L2NvZGU+IGlzIHRydWUsIHRoZSBwYXJzZXIgaXMKLQkgKiBpbmNyZW1lbnRlZCBwYXN0IHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIGNoYXJhY3Rlci4KLQkgKiBUaGlzIG1ldGhvZCBzdGFydHMgYXQgdGhlIGVuZCBvZiB0aGUgY2hhcmFjdGVyIGRhdGEsIGFuZAotCSAqIG1vdmVzIGJhY2t3YXJkcyB0byBmaW5kIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIGNoYXJhY3RlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNraXBUb0xhc3RPZkNoYXIoY2hhciBjaHIsIGJvb2xlYW4gc2tpcFBhc3RDaGFyKSB7Ci0JCWludCBjaCA9IC0xOwotCQkKLQkJLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2Zmc2V0IHRvIHNjYW4gYmFja3dhcmRzLgotCQlmQ3VycmVudE9mZnNldCA9IGZFbmRPZmZzZXQ7Ci0JCQotCQlkbyB7Ci0JCQljaCA9IGxvYWRQcmV2aW91c0NoYXIoKTsKLQkJCQotCQkJaWYoY2ggPT0gLTEpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlpZiAoY2ggPT0gY2hyKSB7Ci0JCQkJaWYoc2tpcFBhc3RDaGFyKQotCQkJCQlsb2FkTmV4dENoYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJfSB3aGlsZSh0cnVlKTsKLQl9Ci0KLQkvLwotCS8vCi0JLy8KLQlwdWJsaWMgdm9pZCBza2lwUGFzdFNwYWNlcygpIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQlpZiAoY2ggPT0gLTEpIHsKLQkJCS8vIGNoYW5nZVJlYWRlcnMoKS5za2lwUGFzdFNwYWNlcygpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAoY2ggPiAweDIwIHx8IChjaCAhPSAweDIwICYmIGNoICE9IDB4MEEgJiYgY2ggIT0gMHgwOSAmJiBjaCAhPSAweDBEKSkgewotCQkJCWZNb3N0UmVjZW50Q2hhciA9IGNoOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmICgrK2ZDdXJyZW50T2Zmc2V0ID49IGZFbmRPZmZzZXQpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljaCA9IGZEYXRhLmNoYXJBdChmQ3VycmVudE9mZnNldCk7Ci0JCX0KLQl9Ci0KLQkvLwotCS8vCi0JLy8KLQotCXB1YmxpYyB2b2lkIHNraXBQYXN0TmFtZUFuZFBFUmVmZXJlbmNlKGNoYXIgZmFzdGNoZWNrKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQotCQlpZiAoY2ggIT0gJyUnKSB7Ci0JCQlpZiAoY2ggPCAweDgwKSB7Ci0JCQkJaWYgKGNoID09IC0xIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaUluaXRpYWxOYW1lQ2hhcltjaF0gPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKCFmQ2FsbGVkQ2hhclByb3BJbml0KSB7Ci0JCQkJCVhNTENoYXJhY3RlclByb3BlcnRpZXMuaW5pdENoYXJGbGFncygpOwotCQkJCQlmQ2FsbGVkQ2hhclByb3BJbml0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKChYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQ2hhckZsYWdzW2NoXSAmIFhNTENoYXJhY3RlclByb3BlcnRpZXMuRV9Jbml0aWFsTmFtZUNoYXJGbGFnKSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKHRydWUpIHsKLQkJCWNoID0gbG9hZE5leHRDaGFyKCk7Ci0JCQlpZiAoZmFzdGNoZWNrID09IGNoKQotCQkJCXJldHVybjsKLQkJCWlmIChjaCA9PSAnJScgfHwgY2ggPT0gJzsnKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChjaCA8IDB4ODApIHsKLQkJCQlpZiAoY2ggPT0gLTEgfHwgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0FzY2lpTmFtZUNoYXJbY2hdID09IDApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghZkNhbGxlZENoYXJQcm9wSW5pdCkgewotCQkJCQlYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmluaXRDaGFyRmxhZ3MoKTsKLQkJCQkJZkNhbGxlZENoYXJQcm9wSW5pdCA9IHRydWU7Ci0JCQkJfQotCQkJCWlmICgoWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0NoYXJGbGFnc1tjaF0gJiBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLkVfTmFtZUNoYXJGbGFnKSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBza2lwUGFzdE5hbWUoY2hhciBmYXN0Y2hlY2spIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNraXBwYXN0TmFtZSBjaDogIiArY2gpOwotCi0JCWlmIChjaCA8IDB4ODApIHsKLQkJCWlmIChjaCA9PSAtMSB8fCBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQXNjaWlJbml0aWFsTmFtZUNoYXJbY2hdID09IDApCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCFmQ2FsbGVkQ2hhclByb3BJbml0KSB7Ci0JCQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCQkJZkNhbGxlZENoYXJQcm9wSW5pdCA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAoKFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdDaGFyRmxhZ3NbY2hdICYgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5FX0luaXRpYWxOYW1lQ2hhckZsYWcpID09IDApCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJd2hpbGUgKHRydWUpIHsKLQkJCWNoID0gbG9hZE5leHRDaGFyKCk7Ci0JCQlpZiAoZmFzdGNoZWNrID09IGNoKQotCQkJCXJldHVybjsKLQkJCWlmIChjaCA8IDB4ODApIHsKLQkJCQlpZiAoY2ggPT0gLTEgfHwgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0FzY2lpTmFtZUNoYXJbY2hdID09IDApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghZkNhbGxlZENoYXJQcm9wSW5pdCkgewotCQkJCQlYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmluaXRDaGFyRmxhZ3MoKTsKLQkJCQkJZkNhbGxlZENoYXJQcm9wSW5pdCA9IHRydWU7Ci0JCQkJfQotCQkJCWlmICgoWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0NoYXJGbGFnc1tjaF0gJiBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLkVfTmFtZUNoYXJGbGFnKSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLwotCS8vCi0JLy8KLQotCXB1YmxpYyB2b2lkIHNraXBQYXN0Tm10b2tlbihjaGFyIGZhc3RjaGVjaykgewotCQlpbnQgY2ggPSBmTW9zdFJlY2VudENoYXI7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAoZmFzdGNoZWNrID09IGNoKQotCQkJCXJldHVybjsKLQkJCWlmIChjaCA8IDB4ODApIHsKLQkJCQlpZiAoY2ggPT0gLTEgfHwgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0FzY2lpTmFtZUNoYXJbY2hdID09IDApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghZkNhbGxlZENoYXJQcm9wSW5pdCkgewotCQkJCQlYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmluaXRDaGFyRmxhZ3MoKTsKLQkJCQkJZkNhbGxlZENoYXJQcm9wSW5pdCA9IHRydWU7Ci0JCQkJfQotCQkJCWlmICgoWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0NoYXJGbGFnc1tjaF0gJiBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLkVfTmFtZUNoYXJGbGFnKSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljaCA9IGxvYWROZXh0Q2hhcigpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2tpcFBhc3RObXRva2VuQW5kUEVSZWZlcmVuY2UoY2hhciBmYXN0Y2hlY2spIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKGZhc3RjaGVjayA9PSBjaCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoY2ggPT0gJyUnIHx8IGNoID09ICc7JykgewotCQkJCWNoID0gbG9hZE5leHRDaGFyKCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoY2ggPCAweDgwKSB7Ci0JCQkJaWYgKGNoID09IC0xIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIWZDYWxsZWRDaGFyUHJvcEluaXQpIHsKLQkJCQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCQkJCWZDYWxsZWRDaGFyUHJvcEluaXQgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoKFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdDaGFyRmxhZ3NbY2hdICYgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5FX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJY2ggPSBsb2FkTmV4dENoYXIoKTsKLQkJfQotCX0KLQotCS8vCi0JLy8KLQkvLwotCXB1YmxpYyBib29sZWFuIHNraXBwZWRTdHJpbmcoY2hhcltdIHMpIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQlpZiAoY2ggIT0gc1swXSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChmQ3VycmVudE9mZnNldCArIHMubGVuZ3RoID4gZkVuZE9mZnNldCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZkRhdGEuY2hhckF0KGZDdXJyZW50T2Zmc2V0ICsgaSkgIT0gc1tpXSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZkN1cnJlbnRPZmZzZXQgKz0gKHMubGVuZ3RoIC0gMSk7Ci0JCWxvYWROZXh0Q2hhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLwotCS8vCi0JLy8KLQlwdWJsaWMgaW50IHNjYW5JbnZhbGlkQ2hhcigpIHRocm93cyBFeGNlcHRpb24gewotCQlpbnQgY2ggPSBmTW9zdFJlY2VudENoYXI7Ci0JCWxvYWROZXh0Q2hhcigpOwotCQlyZXR1cm4gY2g7Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0JLyoKLQkgKiBwdWJsaWMgaW50IHNjYW5DaGFyUmVmKGJvb2xlYW4gaGV4KSB0aHJvd3MgRXhjZXB0aW9uIHsgaW50IGNoID0KLQkgKiBmTW9zdFJlY2VudENoYXI7IGlmIChjaCA9PSAtMSkgLy8gcmV0dXJuCi0JICogY2hhbmdlUmVhZGVycygpLnNjYW5DaGFyUmVmKGhleCk7IHJldHVybiBjaDsgaW50IG51bSA9IDA7IGlmIChoZXgpIHsgaWYKLQkgKiAoY2ggPiAnZicgfHwgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0FzY2lpWERpZ2l0Q2hhcltjaF0gPT0gMCkgcmV0dXJuCi0JICogWE1MRW50aXR5SGFuZGxlci5DSEFSUkVGX1JFU1VMVF9JTlZBTElEX0NIQVI7IG51bSA9IGNoIC0gKGNoIDwgJ0EnID8KLQkgKiAnMCcgOiAoY2ggPCAnYScgPyAnQScgOiAnYScpIC0gMTApOyB9IGVsc2UgeyBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCi0JICogcmV0dXJuIFhNTEVudGl0eUhhbmRsZXIuQ0hBUlJFRl9SRVNVTFRfSU5WQUxJRF9DSEFSOyBudW0gPSBjaCAtICcwJzsgfQotCSAqIGJvb2xlYW4gdG9vYmlnID0gZmFsc2U7IHdoaWxlICh0cnVlKSB7IGNoID0gbG9hZE5leHRDaGFyKCk7IGlmIChjaCA9PQotCSAqIC0xKSByZXR1cm4gWE1MRW50aXR5SGFuZGxlci5DSEFSUkVGX1JFU1VMVF9TRU1JQ09MT05fUkVRVUlSRUQ7IGlmIChoZXgpIHsKLQkgKiBpZiAoY2ggPiAnZicgfHwgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0FzY2lpWERpZ2l0Q2hhcltjaF0gPT0gMCkKLQkgKiBicmVhazsgfSBlbHNlIHsgaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKSBicmVhazsgfSBpZiAoaGV4KSB7IGludCBkaWcgPQotCSAqIGNoIC0gKGNoIDwgJ0EnID8gJzAnIDogKGNoIDwgJ2EnID8gJ0EnIDogJ2EnKSAtIDEwKTsgbnVtID0gKG51bSA8PCA0KSArCi0JICogZGlnOyB9IGVsc2UgeyBpbnQgZGlnID0gY2ggLSAnMCc7IG51bSA9IChudW0gKiAxMCkgKyBkaWc7IH0gaWYgKG51bSA+Ci0JICogMHgxMEZGRkYpIHsgdG9vYmlnID0gdHJ1ZTsgbnVtID0gMDsgfSB9IGlmIChjaCAhPSAnOycpIHJldHVybgotCSAqIFhNTEVudGl0eUhhbmRsZXIuQ0hBUlJFRl9SRVNVTFRfU0VNSUNPTE9OX1JFUVVJUkVEOyBsb2FkTmV4dENoYXIoKTsgaWYKLQkgKiAodG9vYmlnKSByZXR1cm4gWE1MRW50aXR5SGFuZGxlci5DSEFSUkVGX1JFU1VMVF9PVVRfT0ZfUkFOR0U7IHJldHVybgotCSAqIG51bTsgfQotCSAqLwotCS8vCi0JLy8KLQkvLwotCS8qCi0JICogcHVibGljIGludCBzY2FuU3RyaW5nTGl0ZXJhbCgpIHRocm93cyBFeGNlcHRpb24geyBib29sZWFuIHNpbmdsZTsgaWYKLQkgKiAoIShzaW5nbGUgPSBsb29raW5nQXRDaGFyKCdcJycsIHRydWUpKSAmJiAhbG9va2luZ0F0Q2hhcignXCInLCB0cnVlKSkgewotCSAqIHJldHVybiBYTUxFbnRpdHlIYW5kbGVyLlNUUklOR0xJVF9SRVNVTFRfUVVPVEVfUkVRVUlSRUQ7IH0gaW50IG9mZnNldCA9Ci0JICogZkN1cnJlbnRPZmZzZXQ7IGNoYXIgcWNoYXIgPSBzaW5nbGUgPyAnXCcnIDogJ1wiJzsgd2hpbGUKLQkgKiAoIWxvb2tpbmdBdENoYXIocWNoYXIsIGZhbHNlKSkgeyBpZiAoIWxvb2tpbmdBdFZhbGlkQ2hhcih0cnVlKSkgewotCSAqIHJldHVybiBYTUxFbnRpdHlIYW5kbGVyLlNUUklOR0xJVF9SRVNVTFRfSU5WQUxJRF9DSEFSOyB9IH0gLy8gaW50Ci0JICogc3RyaW5nSW5kZXggPSBhZGRTdHJpbmcob2Zmc2V0LCBmQ3VycmVudE9mZnNldCAtIG9mZnNldCk7IGludAotCSAqIHN0cmluZ0luZGV4ID0gYWRkU3RyaW5nKG9mZnNldCwgZkN1cnJlbnRPZmZzZXQgLSBvZmZzZXQpOwotCSAqIGxvb2tpbmdBdENoYXIocWNoYXIsIHRydWUpOyAvLyBtb3ZlIHBhc3QgcWNoYXIgcmV0dXJuIHN0cmluZ0luZGV4OyB9Ci0JICovCi0KLQkvLwotCS8vCi0JcHVibGljIGJvb2xlYW4gc2NhbkF0dFZhbHVlKGNoYXIgcWNoYXIpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKGxvb2tpbmdBdENoYXIocWNoYXIsIGZhbHNlKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGxvb2tpbmdBdENoYXIoJyAnLCB0cnVlKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKCFsb29raW5nQXRWYWxpZENoYXIodHJ1ZSkpIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQlsb29raW5nQXRDaGFyKHFjaGFyLCB0cnVlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLwotCS8vIFs5XSBFbnRpdHlWYWx1ZSA6Oj0gJyInIChbXiUmIl0gfCBQRVJlZmVyZW5jZSB8IFJlZmVyZW5jZSkqICciJwotCS8vIHwgIiciIChbXiUmJ10gfCBQRVJlZmVyZW5jZSB8IFJlZmVyZW5jZSkqICInIgotCS8vCi0JLy8gVGhlIHZhbHVlcyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlIGFyZSBkZWZpbmVkIGFzOgotCS8vCi0JLy8gMCAtIG5vdCBzcGVjaWFsCi0JLy8gMSAtIHF1b3RlIGNoYXJhY3RlcgotCS8vIDIgLSByZWZlcmVuY2UKLQkvLyAzIC0gcGVyZWYKLQkvLyA0IC0gaW52YWxpZAotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlFbnRpdHlWYWx1ZUNoYXJbXSA9IHs0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCAwLCAwLCA0LCA0LCAwLCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCAwLCAwLCAxLCAwLCAwLCAzLCAyLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnXCInLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJyUnLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJyYnLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ1wnJwotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotCi0JLyoKLQkgKiBwdWJsaWMgaW50IHNjYW5FbnRpdHlWYWx1ZShpbnQgcWNoYXIsIGJvb2xlYW4gY3JlYXRlU3RyaW5nKSB0aHJvd3MKLQkgKiBFeGNlcHRpb24geyBpbnQgb2Zmc2V0ID0gZkN1cnJlbnRPZmZzZXQ7IGludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkgKiB3aGlsZSAodHJ1ZSkgeyBpZiAoY2ggPT0gLTEpIHsgY2hhbmdlUmVhZGVycygpOyAvLyBkbyBub3QgY2FsbCBuZXh0Ci0JICogcmVhZGVyLCBvdXIgY2FsbGVyIG1heSBuZWVkIHRvIGNoYW5nZSB0aGUgcGFyYW1ldGVycyByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkVOVElUWVZBTFVFX1JFU1VMVF9FTkRfT0ZfSU5QVVQ7IH0gaWYgKGNoIDwgMHg4MCkgewotCSAqIHN3aXRjaCAoZmdBc2NpaUVudGl0eVZhbHVlQ2hhcltjaF0pIHsgY2FzZSAxOiAvLyBxdW90ZSBjaGFyIGlmIChjaCA9PQotCSAqIHFjaGFyKSB7IGlmICghY3JlYXRlU3RyaW5nKSByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkVOVElUWVZBTFVFX1JFU1VMVF9GSU5JU0hFRDsgaW50IGxlbmd0aCA9Ci0JICogZkN1cnJlbnRPZmZzZXQgLSBvZmZzZXQ7IGludCByZXN1bHQgPSBsZW5ndGggPT0gMCA/Ci0JICogU3RyaW5nUG9vbC5FTVBUWV9TVFJJTkcgOiBhZGRTdHJpbmcob2Zmc2V0LCBsZW5ndGgpOyBsb2FkTmV4dENoYXIoKTsKLQkgKiByZXR1cm4gcmVzdWx0OyB9IC8vIHRoZSBvdGhlciBxdW90ZSBjaGFyYWN0ZXIgaXMgbm90IHNwZWNpYWwgLy8gZmFsbAotCSAqIHRocm91Z2ggY2FzZSAwOiAvLyBub24tc3BlY2lhbCBjaGFyIGlmICgrK2ZDdXJyZW50T2Zmc2V0ID49IGZFbmRPZmZzZXQpIHsKLQkgKiBpZiAob3dlVHJhaWxpbmdTcGFjZSkgeyBvd2VUcmFpbGluZ1NwYWNlID0gZmFsc2U7IGNoID0gZk1vc3RSZWNlbnRDaGFyID0gJyAnOyB9Ci0JICogZWxzZSB7IGNoID0gZk1vc3RSZWNlbnRDaGFyID0gLTE7IH0gfSBlbHNlIHsgY2ggPSBmTW9zdFJlY2VudENoYXIgPQotCSAqIGZEYXRhLmNoYXJBdChmQ3VycmVudE9mZnNldCk7IH0gY29udGludWU7IGNhc2UgMjogLy8gcmVmZXJlbmNlIHJldHVybgotCSAqIFhNTEVudGl0eUhhbmRsZXIuRU5USVRZVkFMVUVfUkVTVUxUX1JFRkVSRU5DRTsgY2FzZSAzOiAvLyBwZXJlZiByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkVOVElUWVZBTFVFX1JFU1VMVF9QRVJFRjsgY2FzZSA0OiAvLyBpbnZhbGlkIHJldHVybgotCSAqIFhNTEVudGl0eUhhbmRsZXIuRU5USVRZVkFMVUVfUkVTVUxUX0lOVkFMSURfQ0hBUjsgfSB9IGVsc2UgaWYgKGNoIDwKLQkgKiAweEQ4MDApIHsgY2ggPSBsb2FkTmV4dENoYXIoKTsgfSBlbHNlIGlmIChjaCA+PSAweEUwMDAgJiYgKGNoIDw9IDB4RkZGRCB8fAotCSAqIChjaCA+PSAweDEwMDAwICYmIGNoIDw9IDB4MTBGRkZGKSkpIHsgLy8gLy8gUkVWSVNJVCAtIG5lZWRzIG1vcmUgY29kZQotCSAqIHRvIGNoZWNrIHN1cnJvZ2F0ZXMuIC8vIGNoID0gbG9hZE5leHRDaGFyKCk7IH0gZWxzZSB7IHJldHVybgotCSAqIFhNTEVudGl0eUhhbmRsZXIuRU5USVRZVkFMVUVfUkVTVUxUX0lOVkFMSURfQ0hBUjsgfSB9IH0KLQkgKi8KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9UU3RyaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9UU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMTJlODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvVFN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIGZvciBzb21lIG9mIHRoZSB2ZXJ5IHVzZWQgSVN0cmluZwotICogb3BlcmF0aW9ucwotICovCi0KLXB1YmxpYyBjbGFzcyBUU3RyaW5nIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxQSEFCRVQgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxQSEFOVU1FUklDID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1FUklDID0gIjAxMjM0NTY3ODkiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBjaGFuZ2UgYWxsIG9jY3VycmVuY2VzIG9mIG9sZFBhdCB0byBuZXdQYXQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGFuZ2UoU3RyaW5nIGluLCBTdHJpbmcgb2xkUGF0LCBTdHJpbmcgbmV3UGF0KSB7Ci0JCWlmIChvbGRQYXQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBpbjsKLQkJaWYgKG9sZFBhdC5sZW5ndGgoKSA9PSAxICYmIG5ld1BhdC5sZW5ndGgoKSA9PSAxKQotCQkJcmV0dXJuIGluLnJlcGxhY2Uob2xkUGF0LmNoYXJBdCgwKSwgbmV3UGF0LmNoYXJBdCgwKSk7Ci0KLQkJaW50IGxhc3RJbmRleCA9IDA7Ci0JCWludCBuZXdJbmRleCA9IDA7Ci0JCVN0cmluZ0J1ZmZlciBuZXdTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoOzspIHsKLQkJCW5ld0luZGV4ID0gaW4uaW5kZXhPZihvbGRQYXQsIGxhc3RJbmRleCk7Ci0JCQlpZiAobmV3SW5kZXggIT0gLTEpIHsKLQkJCQluZXdTdHJpbmcuYXBwZW5kKGluLnN1YnN0cmluZyhsYXN0SW5kZXgsIG5ld0luZGV4KSArIG5ld1BhdCk7Ci0JCQkJbGFzdEluZGV4ID0gbmV3SW5kZXggKyBvbGRQYXQubGVuZ3RoKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluZXdTdHJpbmcuYXBwZW5kKGluLnN1YnN0cmluZyhsYXN0SW5kZXgpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3U3RyaW5nLnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gY2hhbmdlIHRoZSBvY2N1cnJlbmNlcyBvZiBvbGRQYXQgdG8gbmV3UGF0IHN0YXJ0aW5nIGF0IHN0YXJ0UG9zaXRpb24KLQkvLyBmb3IgbnVtYmVyIG9mIG51bUNoYW5nZXMKLQkvLyBOb3RlOiB0aGUgMXN0IGNoYXIgaW4gdGhlIHN0cmluZyBoYXMgcG9zaXRpb24gb2YgMAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hhbmdlKFN0cmluZyBpbiwgU3RyaW5nIG9sZFBhdCwgU3RyaW5nIG5ld1BhdCwgaW50IHN0YXJ0UG9zLCBpbnQgbnVtQ2hhbmdlcykgewotCQlpZiAob2xkUGF0Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gaW47Ci0JCWlmIChvbGRQYXQubGVuZ3RoKCkgPT0gMSAmJiBuZXdQYXQubGVuZ3RoKCkgPT0gMSkKLQkJCXJldHVybiBpbi5yZXBsYWNlKG9sZFBhdC5jaGFyQXQoMCksIG5ld1BhdC5jaGFyQXQoMCkpOwotCi0JCWludCBpbkxlbiA9IGluLmxlbmd0aCgpOwotCi0JCWlmIChzdGFydFBvcyA+PSBpbkxlbikKLQkJCXJldHVybiBpbjsKLQotCQlpbnQgbGFzdEluZGV4ID0gc3RhcnRQb3M7Ci0JCWludCBuZXdJbmRleCA9IDA7Ci0JCWludCBjb3VudENoYW5nZXMgPSAwOwotCi0KLQkJU3RyaW5nQnVmZmVyIG5ld1N0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlmb3IgKDs7KSB7Ci0JCQluZXdJbmRleCA9IGluLmluZGV4T2Yob2xkUGF0LCBsYXN0SW5kZXgpOwotCQkJaWYgKG5ld0luZGV4ICE9IC0xKSB7Ci0JCQkJbmV3U3RyaW5nLmFwcGVuZChpbi5zdWJzdHJpbmcobGFzdEluZGV4LCBuZXdJbmRleCkgKyBuZXdQYXQpOwotCQkJCWxhc3RJbmRleCA9IG5ld0luZGV4ICsgb2xkUGF0Lmxlbmd0aCgpOwotCQkJCWNvdW50Q2hhbmdlcysrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3U3RyaW5nLmFwcGVuZChpbi5zdWJzdHJpbmcobGFzdEluZGV4KSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChjb3VudENoYW5nZXMgPT0gbnVtQ2hhbmdlcykgewotCQkJCW5ld1N0cmluZy5hcHBlbmQoaW4uc3Vic3RyaW5nKGxhc3RJbmRleCkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld1N0cmluZy50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmQoU3RyaW5nIGluLCBpbnQgaSkgewotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluKTsKLQkJaWYgKGkgPD0gMCB8fCBpID4gc3QuY291bnRUb2tlbnMoKSkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlIHsKLQkJCVN0cmluZyByZXQgPSBuZXcgU3RyaW5nKCk7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJcmV0ID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJaWYgKC0taSA9PSAwKQotCQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmRzKFN0cmluZyBpbiwgaW50IGkpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbik7Ci0JCWlmIChpIDw9IDAgfHwgaSA+IHN0LmNvdW50VG9rZW5zKCkpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSB7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJaWYgKC0taSA9PSAwKQotCQkJCQlicmVhazsKLQkJCQlzdC5uZXh0VG9rZW4oKTsKLQkJCX0KLQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0JCQkJcmV0dXJuIHN0Lm5leHRUb2tlbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGVuZFNwYWNlcyhTdHJpbmcgaW4sIGludCBsZW4pIHsKLQkJaWYgKGxlbiA8IDEpCi0JCQlyZXR1cm4gaW47Ci0KLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihpbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgbnVtV29yZHMoU3RyaW5nIGluKSB7Ci0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW4pOwotCQlyZXR1cm4gc3QuY291bnRUb2tlbnMoKTsKLQl9Ci0KLQkvLyByZXR1cm4gdGhlIGZpcnN0IGluZGV4IHdpdGhpbiBzcmNTdHJpbmcgdGhhdCBpcyBub3QgaW4gdGhlIHZhbGlkU3RyaW5nCi0JLy8gZXhhbXBsZToKLQkvLyBzcmNTdHJpbmcgPSAiYWJjZGVmZyIKLQkvLyB2YWxpZFN0cmluZyA9ICJiY2ZnIgotCS8vIHJldHVybiA9IDAgKGkuZS4gY2hhciBhIGlzIG5vdCBpbiAiYmNmZyIpIC0gMXN0IGluZGV4ID0gMAotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZkFueUJ1dChTdHJpbmcgc3JjU3RyaW5nLCBTdHJpbmcgdmFsaWRTdHJpbmcpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpbnQgc3JjTGVuID0gc3JjU3RyaW5nLmxlbmd0aCgpOwotCi0JCS8vIHdhbGsgYmFja3dhcmQgdG8gZmluZCBpZiBhIGNoYXIgd2l0aGluIHNyY1N0cmluZyBpcyBpbiB2YWxpZFN0cmluZwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNyY0xlbjsgaSsrKSB7Ci0JCQkvLyBub3QgZm91bmQsIHN0b3AgaXQKLQkJCWlmICh2YWxpZFN0cmluZy5pbmRleE9mKHNyY1N0cmluZy5jaGFyQXQoaSkpID09IC0xKSB7Ci0JCQkJcmVzdWx0ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyByZXR1cm4gdGhlIGxhc3QgaW5kZXggd2l0aGluIHNyY1N0cmluZyB0aGF0IGlzIG5vdCBpbiB0aGUgdmFsaWRTdHJpbmcKLQkvLyBleGFtcGxlOgotCS8vIHNyY1N0cmluZyA9ICJhYmNkZWZnIgotCS8vIHZhbGlkU3RyaW5nID0gImJjZmciCi0JLy8gcmV0dXJuID0gNCAoaS5lLiBjaGFyIGUgaXMgbm90IGluICJiY2ZnIikgLSAxc3QgaW5kZXggPSAwCi0KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZkFueUJ1dChTdHJpbmcgc3JjU3RyaW5nLCBTdHJpbmcgdmFsaWRTdHJpbmcpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpbnQgc3JjTGVuID0gc3JjU3RyaW5nLmxlbmd0aCgpOwotCi0JCS8vIHdhbGsgYmFja3dhcmQgdG8gZmluZCBpZiBhIGNoYXIgd2l0aGluIHNyY1N0cmluZyBpcyBpbiB2YWxpZFN0cmluZwotCQlmb3IgKGludCBpID0gc3JjTGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCS8vIG5vdCBmb3VuZCwgc3RvcCBpdAotCQkJaWYgKHZhbGlkU3RyaW5nLmluZGV4T2Yoc3JjU3RyaW5nLmNoYXJBdChpKSkgPT0gLTEpIHsKLQkJCQlyZXN1bHQgPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIHJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2Ygc2VhcmNoQ2hhciB3aXRoaW4gc3JjU3RyaW5nCi0JLy8gZXhhbXBsZToKLQkvLyBzcmNTdHJpbmcgPSAiOjpmOjpmOjpnIgotCS8vIHNlYWNockNoYXIgPSAnOicKLQkvLyByZXR1cm4gPSA2Ci0KLQlwdWJsaWMgc3RhdGljIGludCBvY2N1cnJlbmNlT2YoU3RyaW5nIHNyY1N0cmluZywgY2hhciBzZWFyY2hDaGFyKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQkvLyB3YWxrIGJhY2t3YXJkIHRvIGZpbmQgaWYgYSBjaGFyIHdpdGhpbiBzcmNTdHJpbmcgaXMgaW4gdmFsaWRTdHJpbmcKLQkJaWYgKHNyY1N0cmluZy5sZW5ndGgoKSA+IDApIHsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNTdHJpbmcubGVuZ3RoKCk7IGkrKykgewotCQkJCS8vIGZvdW5kLCBpbmNyZW1lbnQgdGhlIGNvdW50Ci0JCQkJaWYgKHNlYXJjaENoYXIgPT0gc3JjU3RyaW5nLmNoYXJBdChpKSkKLQkJCQkJcmVzdWx0Kys7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIHN0cmlwIHRoZSBsZWFkaW5nIHBTdHJpbmcgaW4gdGhlIHNyY1N0cmluZwotCS8vIGV4YW1wbGU6Ci0JLy8gc3JjU3RyaW5nID0gIjo6Zjo6Zjo6ZyIKLQkvLyBwU3RyaW5nICI6OiIKLQkvLyByZXR1cm4gPSAiZjo6Zjo6ZyIKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwTGVhZGluZyhTdHJpbmcgc3JjU3RyaW5nLCBTdHJpbmcgcFN0cmluZykgewotCQlTdHJpbmcgcmVzdWx0OwotCi0JCWlmIChzcmNTdHJpbmcuc3RhcnRzV2l0aChwU3RyaW5nKSkgLy8gbGVhZGluZyBwYXRTdHJpbmcgZm91bmQKLQkJCXJlc3VsdCA9IHNyY1N0cmluZy5zdWJzdHJpbmcocFN0cmluZy5sZW5ndGgoKSwgc3JjU3RyaW5nLmxlbmd0aCgpKTsKLQkJZWxzZQotCQkJLy8gbm90IGZvdW5kCi0JCQlyZXN1bHQgPSBzcmNTdHJpbmc7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyBzdHJpcCB0aGUgdHJhaWxpbmcgcFN0cmluZyBpbiB0aGUgc3JjU3RyaW5nCi0JLy8gZXhhbXBsZToKLQkvLyBzcmNTdHJpbmcgPSAiZjo6Zjo6Zzo6IgotCS8vIHBTdHJpbmcgIjo6IgotCS8vIHJldHVybiA9ICJmOjpmOjpnIgotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBUcmFpbGluZyhTdHJpbmcgc3JjU3RyaW5nLCBTdHJpbmcgcFN0cmluZykgewotCQlTdHJpbmcgcmVzdWx0OwotCi0JCWlmIChzcmNTdHJpbmcuZW5kc1dpdGgocFN0cmluZykpIC8vIGxlYWRpbmcgcGF0U3RyaW5nIGZvdW5kCi0JCQlyZXN1bHQgPSBzcmNTdHJpbmcuc3Vic3RyaW5nKDAsIHNyY1N0cmluZy5sYXN0SW5kZXhPZihwU3RyaW5nKSk7Ci0JCWVsc2UKLQkJCS8vIG5vdCBmb3VuZAotCQkJcmVzdWx0ID0gc3JjU3RyaW5nOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogc3RyaXAgdGhlIHRyYWlsaW5nIGJsYW5rcyBpbiB0aGUgc3JjCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBUcmFpbGluZ0JsYW5rcyhTdHJpbmcgc3JjKSB7Ci0KLQkJaWYgKHNyYyAhPSBudWxsKSB7Ci0JCQl3aGlsZSAoc3JjLmxlbmd0aCgpID4gMCkgewotCQkJCWlmIChzcmMuZW5kc1dpdGgoIiAiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlzcmMgPSBzcmMuc3Vic3RyaW5nKDAsIHNyYy5sZW5ndGgoKSAtIDEpOwotCQkJCWVsc2UKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3JjOwotCX0KLQotCi0KLQkvLyByZXR1cm4gYSBzdHJpbmcgdGhhdCBjb250YWlucyBudW1iZXIgb2YgY29waWVzIG9mIHNyY1N0cmluZwotCS8vIGV4YW1wbGU6Ci0JLy8gc3JjU3RyaW5nID0gImFiYyIKLQkvLyBudW1iZXJPZkNvcGllcyA9IDIKLQkvLyByZXR1cm4gc3RyaW5nID0gImFiY2FiYyIKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHkoU3RyaW5nIHNyY1N0cmluZywgaW50IG51bWJlck9mQ29waWVzKSB7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJaWYgKG51bWJlck9mQ29waWVzID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbnVtYmVyT2ZDb3BpZXM7IGkrKykKLQkJCQlyZXN1bHQuYXBwZW5kKHNyY1N0cmluZyk7Ci0JCX0KLQkJZWxzZQotCQkJcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzcmNTdHJpbmcpOwotCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLwotCS8vIHJldHVybiB0cnVlIGlmIGFsbCBjaGFycyBpbiBzcmNTdHJpbmcgYXJlIGluIHthLi4uen0gb3Ige0EuLi5afQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWxwaGFiZXRpYyhTdHJpbmcgc3JjU3RyaW5nKSB7Ci0JCXJldHVybiAobGFzdEluZGV4T2ZBbnlCdXQoc3JjU3RyaW5nLCBBTFBIQUJFVCkgPT0gLTEpOwotCX0KLQotCS8vCi0JLy8gcmV0dXJuIHRydWUgaWYgYWxsIGNoYXJzIGluIHNyY1N0cmluZyBhcmUgaW4ge2EuLi56LH0gb3Ige0EuLi5afQotCS8vIHswLi4uOX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FscGhhbnVtZXJpYyhTdHJpbmcgc3JjU3RyaW5nKSB7Ci0JCXJldHVybiAobGFzdEluZGV4T2ZBbnlCdXQoc3JjU3RyaW5nLCBBTFBIQU5VTUVSSUMpID09IC0xKTsKLQl9Ci0KLQotCS8vCi0JLy8gcmV0dXJuIHRydWUgaWYgYWxsIGNoYXJzIGFyZSBpbiAnMCcgLSAnOScKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RpZ2l0cyhTdHJpbmcgc3JjU3RyaW5nKSB7Ci0JCXJldHVybiAobGFzdEluZGV4T2ZBbnlCdXQoc3JjU3RyaW5nLCBOVU1FUklDKSA9PSAtMSk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbXB0eU9yTnVsbChTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmcgPT0gbnVsbCB8fCBzdHJpbmcubGVuZ3RoKCkgPT0gMDsKLQl9Ci0KLQotCS8vCi0JLy8gcmV0dXJuIHRoZSBzdHJpbmcgYWZ0ZXIgdGhlIG1hdGNoaW5nIHRva2VuIGlzIHJlbW92ZWQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYXRjaChTdHJpbmcgaW4sIFN0cmluZyB0b2tlbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChpbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW4gPSBpbi50cmltKCk7Ci0JCWlmIChpbi5zdGFydHNXaXRoKHRva2VuKSkKLQkJCXJldHVybiBpbi5zdWJzdHJpbmcodG9rZW4ubGVuZ3RoKCksIGluLmxlbmd0aCgpKTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXhwZWN0ZWQ6ICIgKyB0b2tlbiArICIgYnV0IGdvdDoiICsgd29yZChpbiwgMSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0TG9uZyhTdHJpbmcgc3RyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTG9uZy5wYXJzZUxvbmcoc3RyKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIG0pIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JLy8gcmV0dXJuIHRydWUgaWYgdGhlICIgIiBhcHBlYXJzIHdpdGhpbiBzcmNTdHJpbmcKLQkvLyBleGFtcGxlOgotCS8vIHNyY1N0cmluZyA9ICJhIG0iCi0JLy8gcmV0dXJuID0gdHJ1ZQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zRG91YmxlQmxhbmtzKFN0cmluZyBzcmNTdHJpbmcpIHsKLQkJU3RyaW5nIGJiID0gIiAgIjsgLy8kTk9OLU5MUy0xJAotCQljaGFyIGIgPSBiYi5jaGFyQXQoMCk7Ci0KLQkJaWYgKHNyY1N0cmluZy5sZW5ndGgoKSA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgKHNyY1N0cmluZy5sZW5ndGgoKSAtIDEpOyBpKyspIHsKLQkJCQlpZiAoKGIgPT0gc3JjU3RyaW5nLmNoYXJBdChpKSkgJiAoYiA9PSBzcmNTdHJpbmcuY2hhckF0KGkgKyAxKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9YTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9YTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMzgwMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi0vKioKLSAqIEEgY2xhc3MgcmVwcmVzZW50aW5nIHByb3BlcnRpZXMgb2YgY2hhcmFjdGVycyBhY2NvcmRpbmcgdG8gdmFyaW91cyBXM0MKLSAqIHJlY29tbWVuZGF0aW9ucwotICogCi0gKiBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzIHByb3ZpZGVzIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGNvbW1vbmx5IHVzZWQKLSAqIGNoYXJhY3RlciB0ZXN0cy4KLSAqIAotICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZSB0YWJsZXMgdXNlZCBieSB0aGUgY29udmVuaWVuY2UgbWV0aG9kcyBhcmUKLSAqIGFsc28gcHVibGljLCBhbmQgYXJlIGRpcmVjdGx5IGFjY2Vzc2VkIGJ5IHBlcmZvcm1hbmNlIGNyaXRpY2FsIHJvdXRpbmVzLgotICogCi0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFhNTENoYXJhY3RlclByb3BlcnRpZXMgewotCS8qCi0JICogWzI2XSBWZXJzaW9uTnVtIDo6PSAoW2EtekEtWjAtOV8uOl0gfCAnLScpKwotCSAqIAotCSAqIE5vdGU6IFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIGFzY2lpIHBvcnRpb24gb2YgdGhlIE5hbWVDaGFyIGRlZmluaXRpb24uCi0JICovCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgdmVyc2lvbiBzdHJpbmcgYWNjb3JkaW5nIHRvIFsyNl0gaW4KLQkgKiB0aGUgWE1MIDEuMCBSZWNvbW1lbmRhdGlvbgotCSAqIAotCSAqIEBwYXJhbSB2ZXJzaW9uCi0JICogICAgICAgICAgICBzdHJpbmcgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRydWUgaWYgdmVyc2lvbiBpcyBhIHZhbGlkIHZlcnNpb24gc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkVmVyc2lvbk51bShTdHJpbmcgdmVyc2lvbikgewotCQlpZiAodmVyc2lvbi5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZlcnNpb24ubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjaCA9IHZlcnNpb24uY2hhckF0KGkpOwotCQkJaWYgKGNoID4gJ3onIHx8IGZnQXNjaWlOYW1lQ2hhcltjaF0gPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiBbODFdIEVuY05hbWUgOjo9IFtBLVphLXpdIChbQS1aYS16MC05Ll9dIHwgJy0nKSoKLQkgKi8KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBlbmNvZGluZyBuYW1lIGFjY29yZGluZyB0byBbODFdIGluCi0JICogdGhlIFhNTCAxLjAgUmVjb21tZW5kYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiAgICAgICAgICAgIHN0cmluZyB0byBjaGVjawotCSAqIEByZXR1cm4gdHJ1ZSBpZiBlbmNvZGluZyBpcyBhIHZhbGlkIGVuY29kaW5nIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRFbmNOYW1lKFN0cmluZyBlbmNvZGluZykgewotCQlpZiAoZW5jb2RpbmcubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJY2hhciBjaCA9IGVuY29kaW5nLmNoYXJBdCgwKTsKLQkJaWYgKGNoID4gJ3onIHx8IGZnQXNjaWlBbHBoYUNoYXJbY2hdID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgZW5jb2RpbmcubGVuZ3RoKCk7IGkrKykgewotCQkJY2ggPSBlbmNvZGluZy5jaGFyQXQoaSk7Ci0JCQlpZiAoY2ggPiAneicgfHwgZmdBc2NpaUVuY05hbWVDaGFyW2NoXSA9PSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIFsxM10gUHViaWRDaGFyIDo6PSAjeDIwIHwgI3hEIHwgI3hBIHwgW2EtekEtWjAtOV0gfAotCSAqIFstJygpKywuLzo9PzshKiNAJF8lXQotCSAqLwotCS8qKgotCSAqIENoZWNrIHRvIHNlZSBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIHB1YmxpYyBpZGVudGlmaWVyIGFjY29yZGluZyB0byBbMTNdCi0JICogaW4gdGhlIFhNTCAxLjAgUmVjb21tZW5kYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSWQKLQkgKiAgICAgICAgICAgIHN0cmluZyB0byBjaGVjawotCSAqIEByZXR1cm4gdHJ1ZSBpZiBwdWJsaWNJZCBpcyBhIHZhbGlkIHB1YmxpYyBpZGVudGlmaWVyCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgdmFsaWRQdWJsaWNJZChTdHJpbmcgcHVibGljSWQpIHsKLQkJaWYgKHB1YmxpY0lkLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHVibGljSWQubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjaCA9IHB1YmxpY0lkLmNoYXJBdChpKTsKLQkJCWlmIChjaCA+ICd6JyB8fCBmZ0FzY2lpUHViaWRDaGFyW2NoXSA9PSAwKQotCQkJCXJldHVybiBpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKgotCSAqIFs1XSBOYW1lIDo6PSAoTGV0dGVyIHwgJ18nIHwgJzonKSAoTmFtZUNoYXIpKgotCSAqLwotCS8qKgotCSAqIENoZWNrIHRvIHNlZSBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIE5hbWUgYWNjb3JkaW5nIHRvIFs1XSBpbiB0aGUgWE1MCi0JICogMS4wIFJlY29tbWVuZGF0aW9uCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHN0cmluZyB0byBjaGVjawotCSAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lIGlzIGEgdmFsaWQgTmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCWlmIChuYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWNoYXIgY2ggPSBuYW1lLmNoYXJBdCgwKTsKLQkJaWYgKGNoID4gJ3onKSB7Ci0JCQlpZiAoKGZnQ2hhckZsYWdzW2NoXSAmIEVfSW5pdGlhbE5hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSBpZiAoZmdBc2NpaUluaXRpYWxOYW1lQ2hhcltjaF0gPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoID0gbmFtZS5jaGFyQXQoaSk7Ci0JCQlpZiAoY2ggPiAneicpIHsKLQkJCQlpZiAoKGZnQ2hhckZsYWdzW2NoXSAmIEVfTmFtZUNoYXJGbGFnKSA9PSAwKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChmZ0FzY2lpTmFtZUNoYXJbY2hdID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogZnJvbSB0aGUgbmFtZXNwYWNlIHJlYyBbNV0gTkNOYW1lIDo6PSAoTGV0dGVyIHwgJ18nIHwgJzonKQotCSAqIChOYW1lTkNDaGFyKSoKLQkgKi8KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBOQ05hbWUgYWNjb3JkaW5nIHRvIFs1XSBmcm9tIHRoZQotCSAqIFhNTCBOYW1lc3BhY2VzIDEuMCBSZWNvbW1lbmRhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBzdHJpbmcgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRydWUgaWYgbmFtZSBpcyBhIHZhbGlkIE5DTmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZE5DTmFtZShTdHJpbmcgbmFtZSkgewotCQlYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmluaXRDaGFyRmxhZ3MoKTsKLQkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJY2hhciBjaCA9IG5hbWUuY2hhckF0KDApOwotCQlpZiAoY2ggPiAneicpIHsKLQkJCWlmICgoZmdDaGFyRmxhZ3NbY2hdICYgRV9Jbml0aWFsTmFtZUNoYXJGbGFnKSA9PSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQllbHNlIGlmIChmZ0FzY2lpSW5pdGlhbE5DTmFtZUNoYXJbY2hdID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7Ci0JCQljaCA9IG5hbWUuY2hhckF0KGkpOwotCQkJaWYgKGNoID4gJ3onKSB7Ci0JCQkJaWYgKChmZ0NoYXJGbGFnc1tjaF0gJiBFX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAoZmdBc2NpaU5DTmFtZUNoYXJbY2hdID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JLyoKLQkgKiBbN10gTm10b2tlbiA6Oj0gKE5hbWVDaGFyKSsKLQkgKi8KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBObXRva2VuIGFjY29yZGluZyB0byBbN10gaW4gdGhlIFhNTAotCSAqIDEuMCBSZWNvbW1lbmRhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBubXRva2VuCi0JICogICAgICAgICAgICBzdHJpbmcgdG8gY2hlY2oKLQkgKiBAcmV0dXJuIHRydWUgaWYgbm10b2tlbiBpcyBhIHZhbGlkIE5tdG9rZW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRObXRva2VuKFN0cmluZyBubXRva2VuKSB7Ci0JCVhNTENoYXJhY3RlclByb3BlcnRpZXMuaW5pdENoYXJGbGFncygpOwotCQlpZiAobm10b2tlbi5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5tdG9rZW4ubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjaCA9IG5tdG9rZW4uY2hhckF0KGkpOwotCQkJaWYgKGNoID4gJ3onKSB7Ci0JCQkJaWYgKChmZ0NoYXJGbGFnc1tjaF0gJiBFX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAoZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogSGVyZSBhcmUgdGFibGVzIHVzZWQgdG8gYnVpbGQgY2hhcmFjdGVyIHByb3BlcnRpZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlYRGlnaXRDaGFyW10gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gJzAnCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gLQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICc5JwotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICdBJyAtICdGJwotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICdhJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIC0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnZicKLQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgZmdBc2NpaUFscGhhQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdBJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIC0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnTycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAvLyAnUCcgLSAnWicKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnYScgLSAnbycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIC8vICdwJyAtICd6JwotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlFbmNOYW1lQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIC8vICctJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDJECi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFuZAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnLicKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyRQotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICcwJyAtICc5JwotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdBJyAtICdPJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIC8vICdQJyAtICdaJwotCQkJCQkJCQkJCQkJCQkJCS8vIGFuZCAnXycgaXMKLQkJCQkJCQkJCQkJCQkJCQkvLyAweDVGCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ2EnIC0gJ28nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCAvLyAncCcgLSAneicKLQl9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpUHViaWRDaGFyW10gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJyAnLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICchJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnIycsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJyQnLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICclJywKLQkJCQkvLyAnXCcnLCAnKCcsICcpJywgJyonLCAnKycsICcsJywgJy0nLCAnLicsICcvJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDAsIDEsIC8vICcwJyAtICc5JywKLQkJCQkJCQkJCQkJCQkJCQkvLyAnOicsICc7JywKLQkJCQkJCQkJCQkJCQkJCQkvLyAnPScsICc/JwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdAJywgJ0EnIC0KLQkJCQkJCQkJCQkJCQkJCQkvLyAnTycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAvLyAnUCcgLSAnWicKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQgJ18nIGlzCi0JCQkJCQkJCQkJCQkJCQkJLy8gMHg1RgotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdhJyAtICdvJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgLy8gJ3AnIC0gJ3onCi0JfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgZmdBc2NpaUluaXRpYWxOYW1lQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIC8vICc6JwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4M0EKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQScgLSAnTycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAvLyAnUCcgLSAnWicKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQgJ18nIGlzCi0JCQkJCQkJCQkJCQkJCQkJLy8gMHg1RgotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdhJyAtICdvJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgLy8gJ3AnIC0gJ3onCi0JfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgZmdBc2NpaU5hbWVDaGFyW10gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCwgLy8gJy0nCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDJECi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYW5kCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJy4nCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDJFCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgLy8gJzAnIC0gJzknCi0JCQkJCQkJCQkJCQkJCQkJLy8gYW5kICc6JyBpcwotCQkJCQkJCQkJCQkJCQkJCS8vIDB4M0EKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQScgLSAnTycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAvLyAnUCcgLSAnWicKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQgJ18nIGlzCi0JCQkJCQkJCQkJCQkJCQkJLy8gMHg1RgotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdhJyAtICdvJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgLy8gJ3AnIC0gJ3onCi0JfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgZmdBc2NpaUluaXRpYWxOQ05hbWVDaGFyW10gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gJzonCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgzQQotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdBJyAtICdPJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIC8vICdQJyAtICdaJwotCQkJCQkJCQkJCQkJCQkJCS8vIGFuZCAnXycgaXMKLQkJCQkJCQkJCQkJCQkJCQkvLyAweDVGCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ2EnIC0gJ28nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCAvLyAncCcgLSAneicKLQl9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpTkNOYW1lQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIC8vICctJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyRAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFuZAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICcuJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyRQotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICcwJyAtICc5JwotCQkJCQkJCQkJCQkJCQkJCS8vIGFuZCAnOicgaXMKLQkJCQkJCQkJCQkJCQkJCQkvLyAweDNBCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ0EnIC0gJ08nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLy8gJ1AnIC0gJ1onCi0JCQkJCQkJCQkJCQkJCQkJLy8gYW5kICdfJyBpcwotCQkJCQkJCQkJCQkJCQkJCS8vIDB4NUYKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnYScgLSAnbycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIC8vICdwJyAtICd6JwotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlDaGFyRGF0YVtdID0gezQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDAsIDQsIDQsIDQsIDQsIDQsIDQsIC8vIHRhYgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgwOQotCQkJCTQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICcmJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyNgotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIC8vICc8JyBpcyAweDNDCi0JCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMywgMCwgMCwgLy8gJ10nCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDVECi0JCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlXU0NoYXJEYXRhW10gPSB7NCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNSwgNSwgNCwgNCwgNSwgNCwgNCwgLy8gdGFiCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDA5LAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIExGCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDBBLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIENSCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDBECi0JCQkJNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNSwgMCwgMCwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gJyAnCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDIwLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICcmJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyNgotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIC8vICc8JyBpcyAweDNDCi0JCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMywgMCwgMCwgLy8gJ10nCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDVECi0JCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEVfQ2hhckRhdGFGbGFnID0gMSA8PCAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFX0luaXRpYWxOYW1lQ2hhckZsYWcgPSAxIDw8IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEVfTmFtZUNoYXJGbGFnID0gMSA8PCAyOwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGZnQ2hhckZsYWdzID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgaW5pdENoYXJGbGFncygpIHsKLQkJaWYgKGZnQ2hhckZsYWdzID09IG51bGwpIHsKLQkJCWZnQ2hhckZsYWdzID0gbmV3IGJ5dGVbMHgxMDAwMF07Ci0JCQlzZXRGbGFnRm9yUmFuZ2UoZmdDaGFyRGF0YVJhbmdlcywgRV9DaGFyRGF0YUZsYWcpOwotCQkJc2V0RmxhZ0ZvclJhbmdlKGZnSW5pdGlhbE5hbWVDaGFyUmFuZ2VzLCAoYnl0ZSkgKEVfSW5pdGlhbE5hbWVDaGFyRmxhZyB8IEVfTmFtZUNoYXJGbGFnKSk7Ci0JCQlzZXRGbGFnRm9yUmFuZ2UoZmdOYW1lQ2hhclJhbmdlcywgRV9OYW1lQ2hhckZsYWcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRGbGFnRm9yUmFuZ2UoY2hhcltdIHJhbmdlcywgYnl0ZSBmbGFnKSB7Ci0JCWludCBpOwotCQlpbnQgY2g7Ci0JCWZvciAoaSA9IDA7IChjaCA9IHJhbmdlc1tpXSkgIT0gMDsgaSArPSAyKSB7Ci0JCQlpbnQgZW5kY2ggPSByYW5nZXNbaSArIDFdOwotCQkJd2hpbGUgKGNoIDw9IGVuZGNoKQotCQkJCWZnQ2hhckZsYWdzW2NoKytdIHw9IGZsYWc7Ci0JCX0KLQkJZm9yIChpKys7IChjaCA9IHJhbmdlc1tpXSkgIT0gMDsgaSsrKQotCQkJZmdDaGFyRmxhZ3NbY2hdIHw9IGZsYWc7Ci0JfQotCi0JLyoKLQkgKiBbMl0gQ2hhciA6Oj0gI3g5IHwgI3hBIHwgI3hEIHwgWyN4MjAtI3hEN0ZGXSAvLyBhbnkgVW5pY29kZSBjaGFyYWN0ZXIsCi0JICogZXhjbHVkaW5nIHRoZSB8IFsjeEUwMDAtI3hGRkZEXSB8IFsjeDEwMDAwLSN4MTBGRkZGXSAvLyBzdXJyb2dhdGUKLQkgKiBibG9ja3MsIEZGRkUsIGFuZCBGRkZGLiBbMTRdIENoYXJEYXRhIDo6PSBbXjwmXSogLSAoW148Jl0qICddXT4nIFtePCZdKikKLQkgKiAKLQkgKiBXZSB3aWxsIHVzZSBDaGFyIC0gKCBbXjwmXSB8ICddJyB8ICN4QSB8ICN4RCApIGFuZCBoYW5kbGUgdGhlIHNwZWNpYWwKLQkgKiBjYXNlcyBpbmxpbmUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBmZ0NoYXJEYXRhUmFuZ2VzW10gPSB7MHgwMDIwLCAweDAwMjUsIC8vICcmJyBpcwotCQkJCQkJCQkJCQkJCQkJCQkvLyAweDAwMjYKLQkJCQkweDAwMjcsIDB4MDAzQiwgLy8gJzwnIGlzIDB4MDAzQwotCQkJCTB4MDAzRCwgMHgwMDVDLCAvLyAnXScgaXMgMHgwMDVECi0JCQkJMHgwMDVFLCAweEQ3RkYsIDB4RTAwMCwgMHhGRkZELCAweDAwMDAsIDB4MDAwOSwgLy8gdGFiCi0JCQkJMHgwMDAwfTsKLQkvKgotCSAqIFs1XSBOYW1lIDo6PSAoTGV0dGVyIHwgJ18nIHwgJzonKSAoTmFtZUNoYXIpKiBbNF0gTmFtZUNoYXIgOjo9IExldHRlciB8Ci0JICogRGlnaXQgfCAnLicgfCAnLScgfCAnXycgfCAnOicgfCBDb21iaW5pbmdDaGFyIHwgRXh0ZW5kZXIgWzg0XSBMZXR0ZXIKLQkgKiA6Oj0gQmFzZUNoYXIgfCBJZGVvZ3JhcGhpYyBbODVdIEJhc2VDaGFyIDo6PSA8c2VlIHN0YW5kYXJkPiBbODZdCi0JICogSWRlb2dyYXBoaWMgOjo9IDxzZWUgc3RhbmRhcmQ+IFs4N10gQ29tYmluaW5nQ2hhciA6Oj0gPHNlZSBzdGFuZGFyZD4KLQkgKiBbODhdIERpZ2l0IDo6PSA8c2VlIHN0YW5kYXJkPiBbODldIEV4dGVuZGVyIDo6PSA8c2VlIHN0YW5kYXJkPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgZmdJbml0aWFsTmFtZUNoYXJSYW5nZXNbXSA9IHsKLQkvLwotCQkJCS8vIFJhbmdlczoKLQkJCQkvLwotCQkJCS8vIEJhc2VDaGFyIHJhbmdlcwotCQkJCS8vCi0JCQkJMHgwMDQxLCAweDAwNUEsIDB4MDA2MSwgMHgwMDdBLCAweDAwQzAsIDB4MDBENiwgMHgwMEQ4LCAweDAwRjYsIDB4MDBGOCwgMHgwMTMxLCAweDAxMzQsIDB4MDEzRSwgMHgwMTQxLCAweDAxNDgsIDB4MDE0QSwgMHgwMTdFLCAweDAxODAsIDB4MDFDMywgMHgwMUNELCAweDAxRjAsIDB4MDFGNCwgMHgwMUY1LCAweDAxRkEsIDB4MDIxNywgMHgwMjUwLCAweDAyQTgsIDB4MDJCQiwgMHgwMkMxLCAweDAzODgsIDB4MDM4QSwgMHgwMzhFLCAweDAzQTEsIDB4MDNBMywgMHgwM0NFLCAweDAzRDAsIDB4MDNENiwgMHgwM0UyLCAweDAzRjMsIDB4MDQwMSwgMHgwNDBDLCAweDA0MEUsIDB4MDQ0RiwgMHgwNDUxLCAweDA0NUMsIDB4MDQ1RSwgMHgwNDgxLCAweDA0OTAsIDB4MDRDNCwgMHgwNEM3LCAweDA0QzgsIDB4MDRDQiwgMHgwNENDLCAweDA0RDAsIDB4MDRFQiwgMHgwNEVFLCAweDA0RjUsIDB4MDRGOCwgMHgwNEY5LCAweDA1MzEsIDB4MDU1NiwgMHgwNTYxLCAweDA1ODYsIDB4MDVEMCwgMHgwNUVBLCAweDA1RjAsIDB4MDVGMiwgMHgwNjIxLCAweDA2M0EsIDB4MDY0MSwgMHgwNjRBLCAweDA2NzEsIDB4MDZCNywgMHgwNkJBLCAweDA2QkUsIDB4MDZDMCwgMHgwNkNFLCAweDA2RDAsIDB4MDZEMywgMHgwNkU1LCAweDA2RTYsIDB4MDkwNSwgMHgwOTM5LCAweDA5NTgsIDB4MDk2MSwgMHgwOTg1LCAweDA5OEMsIDB4MDk4RiwgMHgwOTkwLCAweDA5OTMsIDB4MDlBOCwgMHgwOUFBLCAweDA5QjAsIDB4MDlCNiwgMHgwOUI5LCAweDA5REMsIDB4MDlERCwgMHgwOURGLCAweDA5RTEsIDB4MDlGMCwgMHgwOUYxLCAweDBBMDUsIDB4MEEwQSwgMHgwQTBGLCAweDBBMTAsIDB4MEExMywgMHgwQTI4LCAweDBBMkEsIDB4MEEzMCwgMHgwQTMyLCAweDBBMzMsIDB4MEEzNSwgMHgwQTM2LCAweDBBMzgsIDB4MEEzOSwgMHgwQTU5LCAweDBBNUMsIDB4MEE3MiwgMHgwQTc0LCAweDBBODUsIDB4MEE4QiwgMHgwQThGLCAweDBBOTEsCi0JCQkJMHgwQTkzLCAweDBBQTgsIDB4MEFBQSwgMHgwQUIwLCAweDBBQjIsIDB4MEFCMywgMHgwQUI1LCAweDBBQjksIDB4MEIwNSwgMHgwQjBDLCAweDBCMEYsIDB4MEIxMCwgMHgwQjEzLCAweDBCMjgsIDB4MEIyQSwgMHgwQjMwLCAweDBCMzIsIDB4MEIzMywgMHgwQjM2LCAweDBCMzksIDB4MEI1QywgMHgwQjVELCAweDBCNUYsIDB4MEI2MSwgMHgwQjg1LCAweDBCOEEsIDB4MEI4RSwgMHgwQjkwLCAweDBCOTIsIDB4MEI5NSwgMHgwQjk5LCAweDBCOUEsIDB4MEI5RSwgMHgwQjlGLCAweDBCQTMsIDB4MEJBNCwgMHgwQkE4LCAweDBCQUEsIDB4MEJBRSwgMHgwQkI1LCAweDBCQjcsIDB4MEJCOSwgMHgwQzA1LCAweDBDMEMsIDB4MEMwRSwgMHgwQzEwLCAweDBDMTIsIDB4MEMyOCwgMHgwQzJBLCAweDBDMzMsIDB4MEMzNSwgMHgwQzM5LCAweDBDNjAsIDB4MEM2MSwgMHgwQzg1LCAweDBDOEMsIDB4MEM4RSwgMHgwQzkwLCAweDBDOTIsIDB4MENBOCwgMHgwQ0FBLCAweDBDQjMsIDB4MENCNSwgMHgwQ0I5LCAweDBDRTAsIDB4MENFMSwgMHgwRDA1LCAweDBEMEMsIDB4MEQwRSwgMHgwRDEwLCAweDBEMTIsIDB4MEQyOCwgMHgwRDJBLCAweDBEMzksIDB4MEQ2MCwgMHgwRDYxLCAweDBFMDEsIDB4MEUyRSwgMHgwRTMyLCAweDBFMzMsIDB4MEU0MCwgMHgwRTQ1LCAweDBFODEsIDB4MEU4MiwgMHgwRTg3LCAweDBFODgsIDB4MEU5NCwgMHgwRTk3LCAweDBFOTksIDB4MEU5RiwgMHgwRUExLCAweDBFQTMsIDB4MEVBQSwgMHgwRUFCLCAweDBFQUQsIDB4MEVBRSwgMHgwRUIyLCAweDBFQjMsIDB4MEVDMCwgMHgwRUM0LCAweDBGNDAsIDB4MEY0NywgMHgwRjQ5LCAweDBGNjksIDB4MTBBMCwgMHgxMEM1LCAweDEwRDAsIDB4MTBGNiwgMHgxMTAyLCAweDExMDMsIDB4MTEwNSwgMHgxMTA3LCAweDExMEIsIDB4MTEwQywgMHgxMTBFLCAweDExMTIsIDB4MTE1NCwgMHgxMTU1LCAweDExNUYsIDB4MTE2MSwgMHgxMTZELCAweDExNkUsCi0JCQkJMHgxMTcyLCAweDExNzMsIDB4MTFBRSwgMHgxMUFGLCAweDExQjcsIDB4MTFCOCwgMHgxMUJDLCAweDExQzIsIDB4MUUwMCwgMHgxRTlCLCAweDFFQTAsIDB4MUVGOSwgMHgxRjAwLCAweDFGMTUsIDB4MUYxOCwgMHgxRjFELCAweDFGMjAsIDB4MUY0NSwgMHgxRjQ4LCAweDFGNEQsIDB4MUY1MCwgMHgxRjU3LCAweDFGNUYsIDB4MUY3RCwgMHgxRjgwLCAweDFGQjQsIDB4MUZCNiwgMHgxRkJDLCAweDFGQzIsIDB4MUZDNCwgMHgxRkM2LCAweDFGQ0MsIDB4MUZEMCwgMHgxRkQzLCAweDFGRDYsIDB4MUZEQiwgMHgxRkUwLCAweDFGRUMsIDB4MUZGMiwgMHgxRkY0LCAweDFGRjYsIDB4MUZGQywgMHgyMTJBLCAweDIxMkIsIDB4MjE4MCwgMHgyMTgyLCAweDMwNDEsIDB4MzA5NCwgMHgzMEExLCAweDMwRkEsIDB4MzEwNSwgMHgzMTJDLCAweEFDMDAsIDB4RDdBMywKLQkJCQkvLwotCQkJCS8vIElkZW9ncmFwaGljIHJhbmdlcwotCQkJCS8vCi0JCQkJMHgzMDIxLCAweDMwMjksIDB4NEUwMCwgMHg5RkE1LAotCQkJCS8vCi0JCQkJLy8gUmFuZ2VzIGVuZCBtYXJrZXIKLQkJCQkvLwotCQkJCTB4MDAwMCwKLQkJCQkvLwotCQkJCS8vIFNpbmdsZSBjaGFyIHZhbHVlcwotCQkJCS8vCi0JCQkJMHgwMDNBLCAvLyAnOicKLQkJCQkweDAwNUYsIC8vICdfJwotCQkJCS8vCi0JCQkJLy8gQmFzZUNoYXIgc2luZ2xlcwotCQkJCS8vCi0JCQkJMHgwMzg2LCAweDAzOEMsIDB4MDNEQSwgMHgwM0RDLCAweDAzREUsIDB4MDNFMCwgMHgwNTU5LCAweDA2RDUsIDB4MDkzRCwgMHgwOUIyLCAweDBBNUUsIDB4MEE4RCwgMHgwQUJELCAweDBBRTAsIDB4MEIzRCwgMHgwQjlDLCAweDBDREUsIDB4MEUzMCwgMHgwRTg0LCAweDBFOEEsIDB4MEU4RCwgMHgwRUE1LCAweDBFQTcsIDB4MEVCMCwgMHgwRUJELCAweDExMDAsIDB4MTEwOSwgMHgxMTNDLCAweDExM0UsIDB4MTE0MCwgMHgxMTRDLCAweDExNEUsIDB4MTE1MCwgMHgxMTU5LCAweDExNjMsIDB4MTE2NSwgMHgxMTY3LCAweDExNjksIDB4MTE3NSwgMHgxMTlFLCAweDExQTgsIDB4MTFBQiwgMHgxMUJBLCAweDExRUIsIDB4MTFGMCwgMHgxMUY5LCAweDFGNTksIDB4MUY1QiwgMHgxRjVELCAweDFGQkUsIDB4MjEyNiwgMHgyMTJFLAotCQkJCS8vCi0JCQkJLy8gSWRlb2dyYXBoaWMgc2luZ2xlcwotCQkJCS8vCi0JCQkJMHgzMDA3LAotCQkJCS8vCi0JCQkJLy8gU2luZ2xlcyBlbmQgbWFya2VyCi0JCQkJLy8KLQkJCQkweDAwMDB9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgZmdOYW1lQ2hhclJhbmdlc1tdID0gewotCS8vCi0JCQkJLy8gUmFuZ2VzOgotCQkJCS8vCi0JCQkJMHgwMDJELCAweDAwMkUsIC8vICctJyBhbmQgJy4nCi0JCQkJLy8KLQkJCQkvLyBDb21iaW5pbmdDaGFyIHJhbmdlcwotCQkJCS8vCi0JCQkJMHgwMzAwLCAweDAzNDUsIDB4MDM2MCwgMHgwMzYxLCAweDA0ODMsIDB4MDQ4NiwgMHgwNTkxLCAweDA1QTEsIDB4MDVBMywgMHgwNUI5LCAweDA1QkIsIDB4MDVCRCwgMHgwNUMxLCAweDA1QzIsIDB4MDY0QiwgMHgwNjUyLCAweDA2RDYsIDB4MDZEQywgMHgwNkRELCAweDA2REYsIDB4MDZFMCwgMHgwNkU0LCAweDA2RTcsIDB4MDZFOCwgMHgwNkVBLCAweDA2RUQsIDB4MDkwMSwgMHgwOTAzLCAweDA5M0UsIDB4MDk0QywgMHgwOTUxLCAweDA5NTQsIDB4MDk2MiwgMHgwOTYzLCAweDA5ODEsIDB4MDk4MywgMHgwOUMwLCAweDA5QzQsIDB4MDlDNywgMHgwOUM4LCAweDA5Q0IsIDB4MDlDRCwgMHgwOUUyLCAweDA5RTMsIDB4MEE0MCwgMHgwQTQyLCAweDBBNDcsIDB4MEE0OCwgMHgwQTRCLCAweDBBNEQsIDB4MEE3MCwgMHgwQTcxLCAweDBBODEsIDB4MEE4MywgMHgwQUJFLCAweDBBQzUsIDB4MEFDNywgMHgwQUM5LCAweDBBQ0IsIDB4MEFDRCwgMHgwQjAxLCAweDBCMDMsIDB4MEIzRSwgMHgwQjQzLCAweDBCNDcsIDB4MEI0OCwgMHgwQjRCLCAweDBCNEQsIDB4MEI1NiwgMHgwQjU3LCAweDBCODIsIDB4MEI4MywgMHgwQkJFLCAweDBCQzIsIDB4MEJDNiwgMHgwQkM4LCAweDBCQ0EsIDB4MEJDRCwgMHgwQzAxLCAweDBDMDMsIDB4MEMzRSwgMHgwQzQ0LCAweDBDNDYsIDB4MEM0OCwgMHgwQzRBLCAweDBDNEQsIDB4MEM1NSwgMHgwQzU2LCAweDBDODIsIDB4MEM4MywgMHgwQ0JFLCAweDBDQzQsIDB4MENDNiwgMHgwQ0M4LCAweDBDQ0EsIDB4MENDRCwgMHgwQ0Q1LCAweDBDRDYsIDB4MEQwMiwgMHgwRDAzLCAweDBEM0UsIDB4MEQ0MywgMHgwRDQ2LCAweDBENDgsIDB4MEQ0QSwgMHgwRDRELCAweDBFMzQsIDB4MEUzQSwgMHgwRTQ3LCAweDBFNEUsIDB4MEVCNCwgMHgwRUI5LCAweDBFQkIsIDB4MEVCQywgMHgwRUM4LCAweDBFQ0QsIDB4MEYxOCwgMHgwRjE5LCAweDBGNzEsIDB4MEY4NCwgMHgwRjg2LCAweDBGOEIsCi0JCQkJMHgwRjkwLCAweDBGOTUsIDB4MEY5OSwgMHgwRkFELCAweDBGQjEsIDB4MEZCNywgMHgyMEQwLCAweDIwREMsIDB4MzAyQSwgMHgzMDJGLAotCQkJCS8vCi0JCQkJLy8gRGlnaXQgcmFuZ2VzCi0JCQkJLy8KLQkJCQkweDAwMzAsIDB4MDAzOSwgMHgwNjYwLCAweDA2NjksIDB4MDZGMCwgMHgwNkY5LCAweDA5NjYsIDB4MDk2RiwgMHgwOUU2LCAweDA5RUYsIDB4MEE2NiwgMHgwQTZGLCAweDBBRTYsIDB4MEFFRiwgMHgwQjY2LCAweDBCNkYsIDB4MEJFNywgMHgwQkVGLCAweDBDNjYsIDB4MEM2RiwgMHgwQ0U2LCAweDBDRUYsIDB4MEQ2NiwgMHgwRDZGLCAweDBFNTAsIDB4MEU1OSwgMHgwRUQwLCAweDBFRDksIDB4MEYyMCwgMHgwRjI5LAotCQkJCS8vCi0JCQkJLy8gRXh0ZW5kZXIgcmFuZ2VzCi0JCQkJLy8KLQkJCQkweDMwMzEsIDB4MzAzNSwgMHgzMDlELCAweDMwOUUsIDB4MzBGQywgMHgzMEZFLAotCQkJCS8vCi0JCQkJLy8gUmFuZ2VzIGVuZCBtYXJrZXIKLQkJCQkvLwotCQkJCTB4MDAwMCwKLQkJCQkvLwotCQkJCS8vIFNpbmdsZSBjaGFyIHZhbHVlcwotCQkJCS8vCi0JCQkJLy8gQ29tYmluaW5nQ2hhciBzaW5nbGVzCi0JCQkJLy8KLQkJCQkweDA1QkYsIDB4MDVDNCwgMHgwNjcwLCAweDA5M0MsIDB4MDk0RCwgMHgwOUJDLCAweDA5QkUsIDB4MDlCRiwgMHgwOUQ3LCAweDBBMDIsIDB4MEEzQywgMHgwQTNFLCAweDBBM0YsIDB4MEFCQywgMHgwQjNDLCAweDBCRDcsIDB4MEQ1NywgMHgwRTMxLCAweDBFQjEsIDB4MEYzNSwgMHgwRjM3LCAweDBGMzksIDB4MEYzRSwgMHgwRjNGLCAweDBGOTcsIDB4MEZCOSwgMHgyMEUxLCAweDMwOTksIDB4MzA5QSwKLQkJCQkvLwotCQkJCS8vIEV4dGVuZGVyIHNpbmdsZXMKLQkJCQkvLwotCQkJCTB4MDBCNywgMHgwMkQwLCAweDAyRDEsIDB4MDM4NywgMHgwNjQwLCAweDBFNDYsIDB4MEVDNiwgMHgzMDA1LAotCQkJCS8vCi0JCQkJLy8gU2luZ2xlcyBlbmQgbWFya2VyCi0JCQkJLy8KLQkJCQkweDAwMDB9OwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EVERWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5ZjJiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EVERWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgRFREIFZhbGlkYXRpb24KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERWYWxpZGF0aW9uTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9SRUZfRUxFTUVOVF9VTkRFRklORUQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRElBTE9HX0RURF9JTlZBTElEX1RFWFQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19EVERfSU5WQUxJRF9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRElBTE9HX0RURF9WQUxJRF9URVhUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9ESUFMT0dfRFREX1ZBTElEX1RJVExFOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EVERWYWxpZGF0aW9uUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ19yZXF1aXJlZF9maWxlc18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdfcmVxdWlyZWRfZmlsZXNfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ19yZXF1aXJlZF9maWxlc180OwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIERURFZhbGlkYXRpb25NZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdGlvblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdGlvblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmEyZDZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RURFZhbGlkYXRpb25SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIQotISBWYWxpZGF0ZSBEVEQKLSEKLV9VSV9ESUFMT0dfRFREX0lOVkFMSURfVElUTEUgID0gVmFsaWRhdGlvbiBGYWlsZWQKLV9VSV9ESUFMT0dfRFREX1ZBTElEX1RJVExFICAgID0gVmFsaWRhdGlvbiBTdWNjZWVkZWQKLV9VSV9ESUFMT0dfRFREX1ZBTElEX1RFWFQgICAgID0gVGhlIERURCBmaWxlIGlzIHZhbGlkLgotX1VJX0RJQUxPR19EVERfSU5WQUxJRF9URVhUICAgPSBUaGUgRFREIGZpbGUgaXMgbm90IHZhbGlkLiBTZWUgdGhlIFByb2JsZW1zIHZpZXcgZm9yIGVycm9yIG1lc3NhZ2VzLgotCi0hCi0hIFJlZmVyZW5jZWQgRWxlbWVudCBWYWxpZGF0aW9uCi0hCi1fRVJST1JfUkVGX0VMRU1FTlRfVU5ERUZJTkVEID0gVGhlIGVsZW1lbnQgezB9IGhhcyBub3QgYmVlbiBkZWNsYXJlZC4KLU1pc3NpbmdfcmVxdWlyZWRfZmlsZXNfMT1SZXF1aXJlZCBmaWxlcyB4ZXJjZXNJbXBsLmphciBhbmQgeG1sUGFyc2VyQVBJcy5qYXIgY2Fubm90IGJlIGZvdW5kLlxuXG4KLU1pc3NpbmdfcmVxdWlyZWRfZmlsZXNfMj1Eb3dubG9hZCBYZXJjZXMgMi42LjIgYW5kIHBsYWNlIHhlcmNlc0ltcGwuamFyIGFuZCB4bWxQYXJzZXJBUElzLmphciBpbiBhIGZvbGRlciBlbnRpdGxlZCBqYXJzIGluIHRoZSBvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24gcGx1Z2luLlxuXG4KLU1pc3NpbmdfcmVxdWlyZWRfZmlsZXNfMz1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL3dzdC9jb21wb25lbnRzL3htbC94ZXJjZXNJbmZvLnhtbC4KLU1pc3NpbmdfcmVxdWlyZWRfZmlsZXNfND1NaXNzaW5nIFhlcmNlcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EVERWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhYjBjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EVERWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkxhenlVUkxJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvblJlcG9ydDsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBEVEQgdmFsaWRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIERURFZhbGlkYXRvciB7Ci0JLyoqCi0JICogQW4gZW50aXR5IHJlc29sdmVyIHRoYXQgd3JhcHMgYSBVUkkgcmVzb2x2ZXIuCi0JICovCi0JY2xhc3MgRFRERW50aXR5UmVzb2x2ZXIgaW1wbGVtZW50cyBFbnRpdHlSZXNvbHZlciB7Ci0JCXByaXZhdGUgU3RyaW5nIGZCYXNlTG9jYXRpb24gPSBudWxsOwotCQlwcml2YXRlIFVSSVJlc29sdmVyIGZVUklSZXNvbHZlciA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdG9yLgotCQkgKiAKLQkJICogQHBhcmFtIGlkcmVzb2x2ZXIKLQkJICogICAgICAgICAgICBUaGUgaWRyZXNvbHZlciB0aGlzIGVudGl0eSByZXNvbHZlciB3cmFwcy4KLQkJICogQHBhcmFtIGJhc2Vsb2NhdGlvbgotCQkgKiAgICAgICAgICAgIFRoZSBiYXNlIGxvY2F0aW9uIHRvIHJlc29sdmUgd2l0aC4KLQkJICovCi0JCXB1YmxpYyBEVERFbnRpdHlSZXNvbHZlcihVUklSZXNvbHZlciB1cmlyZXNvbHZlciwgU3RyaW5nIGJhc2Vsb2NhdGlvbikgewotCQkJdGhpcy5mVVJJUmVzb2x2ZXIgPSB1cmlyZXNvbHZlcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVE9ETyBjczogd2UgbmV2ZXIgc2VlbSB0byBzZXQgYSBVUklSZXNvbHZlcgotICAgICAgICAgICAgLy8gSSBjcmVhdGUgb25lIGhlcmUgdXAgZnJvbnQganVzdCBpbmNhc2UKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBpZiAoZlVSSVJlc29sdmVyID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZVUklSZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gIAotCQkJdGhpcy5mQmFzZUxvY2F0aW9uID0gYmFzZWxvY2F0aW9uOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlciNyZXNvbHZlRW50aXR5KGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQkJCWlmIChmQmFzZUxvY2F0aW9uLmVxdWFscyhzeXN0ZW1JZCkpIHsKLQkJCQlsb2NhdGlvbiA9IHN5c3RlbUlkOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbG9jYXRpb24gPSBmVVJJUmVzb2x2ZXIucmVzb2x2ZShmQmFzZUxvY2F0aW9uLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQkJfQotCQkJSW5wdXRTb3VyY2UgaXMgPSBudWxsOwotCQkJaWYgKGxvY2F0aW9uICE9IG51bGwgJiYgIWxvY2F0aW9uLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCSAgLy8gQ1MgOiB3aGlsZSB3b3JraW5nIG9uIGJ1ZyAxMTM1MzcgSSBub3RpY2VkIHdlJ3JlIG5vdCB1c2luZyB0aGUgTGF6eVVSTElucHV0U3RyZWFtCi0JCSAgICAgIC8vIHNvIGZpeGVkIHRoaXMgdG8gYXZvaWQgbGVha2luZyBmaWxlIGhhbmRsZXMKLQkJCSAgLy8KLSAgICAgICAgICAgICAgU3RyaW5nIHBoeXNpY2FsID0gZlVSSVJlc29sdmVyLnJlc29sdmVQaHlzaWNhbExvY2F0aW9uKGZCYXNlTG9jYXRpb24sIHB1YmxpY0lkLCBsb2NhdGlvbik7IAotCQkJICBpcyA9IG5ldyBJbnB1dFNvdXJjZShsb2NhdGlvbik7Ci0JCQkgIGlzLnNldEJ5dGVTdHJlYW0obmV3IExhenlVUkxJbnB1dFN0cmVhbShwaHlzaWNhbCkpOwotCQkJfQotCQkJcmV0dXJuIGlzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQW4gZXJyb3IgaGFuZGxlciBmb3IgRFREIHZhbGlkYXRpb24uCi0JICogCi0JICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotCSAqLwotCWNsYXNzIERUREVycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlciB7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBpbnQgRVJST1IgPSAwOwotCQlwcml2YXRlIGZpbmFsIFZhbGlkYXRpb25JbmZvIGZWYWxpZGF0aW9uSW5mbzsKLQotCQlwcml2YXRlIGZpbmFsIGludCBXQVJOSU5HID0gMTsKLQotCQkvKioKLQkJICogQ29uc3RydWN0b3IuCi0JCSAqIAotCQkgKiBAcGFyYW0gdmFsaW5mbwotCQkgKiAgICAgICAgICAgIFRoZSB2YWxpZGF0aW9uIGluZm8gb2JqZWN0IHRvIHVzZSB0byByZWdpc3RlciB2YWxpZGF0aW9uCi0JCSAqICAgICAgICAgICAgbWVzc2FnZXMuCi0JCSAqLwotCQlwdWJsaWMgRFRERXJyb3JIYW5kbGVyKFZhbGlkYXRpb25JbmZvIHZhbGluZm8pIHsKLQkJCXRoaXMuZlZhbGlkYXRpb25JbmZvID0gdmFsaW5mbzsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgYSB2YWxpZGF0aW9uIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkuCi0JCSAqIAotCQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLQkJICogICAgICAgICAgICBtZXNzYWdlLgotCQkgKiBAcGFyYW0gc2V2ZXJpdHkKLQkJICogICAgICAgICAgICBUaGUgc2V2ZXJpdHkgb2YgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbiwgaW50IHNldmVyaXR5KSB7Ci0JCQlpZiAoZXhjZXB0aW9uLmdldFN5c3RlbUlkKCkgIT0gbnVsbCkgewotCQkJCWlmIChzZXZlcml0eSA9PSBXQVJOSU5HKSB7Ci0JCQkJCWZWYWxpZGF0aW9uSW5mby5hZGRXYXJuaW5nKGV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCksIGV4Y2VwdGlvbi5nZXRDb2x1bW5OdW1iZXIoKSwgZXhjZXB0aW9uLmdldFN5c3RlbUlkKCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZlZhbGlkYXRpb25JbmZvLmFkZEVycm9yKGV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCksIGV4Y2VwdGlvbi5nZXRDb2x1bW5OdW1iZXIoKSwgZXhjZXB0aW9uLmdldFN5c3RlbUlkKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCWFkZFZhbGlkYXRpb25NZXNzYWdlKGV4Y2VwdGlvbiwgRVJST1IpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCWFkZFZhbGlkYXRpb25NZXNzYWdlKGV4Y2VwdGlvbiwgRVJST1IpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjd2FybmluZyhvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCWFkZFZhbGlkYXRpb25NZXNzYWdlKGV4Y2VwdGlvbiwgV0FSTklORyk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBNdWx0aUhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciBpbXBsZW1lbnRzIG9yZy54bWwuc2F4LkRUREhhbmRsZXIsIENvbnRlbnRIYW5kbGVyLCBMZXhpY2FsSGFuZGxlciwgRGVjbEhhbmRsZXIgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9NT0RJRklFUlMgPSAiKis/IjsgLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTF9ERUxJTUlURVJTID0gIiwoKXwgIjsgLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgTGlzdCBmRWxlbURlY2xzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXByaXZhdGUgSGFzaHRhYmxlIGZFbGVtUmVmcyA9IG5ldyBIYXNodGFibGUoKTsKLQotCQlwcml2YXRlIExpc3QgZklnbm9yZUVsZW1Nb2RlbCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwcml2YXRlIExpc3QgZklnbm9yZUVsZW1SZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXByaXZhdGUgTG9jYXRvciBmTG9jYXRvciA9IG51bGw7Ci0KLQkJcHVibGljIE11bHRpSGFuZGxlcigpIHsKLQkJCWZJZ25vcmVFbGVtUmVmcy5hZGQoIiNQQ0RBVEEiKTsgLy8kTk9OLU5MUy0xJAotCQkJZklnbm9yZUVsZW1Nb2RlbC5hZGQoIkFOWSIpOyAvLyROT04tTkxTLTEkCi0JCQlmSWdub3JlRWxlbU1vZGVsLmFkZCgiRU1QVFkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjYXR0cmlidXRlRGVjbChqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGF0dHJpYnV0ZURlY2woU3RyaW5nIGVOYW1lLCBTdHJpbmcgYU5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWVEZWZhdWx0LCBTdHJpbmcgdmFsdWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNjb21tZW50KGNoYXJbXSwgaW50LCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjb21tZW50KGNoYXJbXSBhcmcwLCBpbnQgYXJnMSwgaW50IGFyZzIpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlciNlbGVtZW50RGVjbChqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlbGVtZW50RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG1vZGVsKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIEFkZCB0aGlzIGVsZW1lbnQgdG8gdGhlIGxpc3Qgb2YgZGVjbGFyZWQgZWxlbWVudHMuCi0JCQlmRWxlbURlY2xzLmFkZChuYW1lKTsKLQotCQkJLy8gUmV0dXJuIGlmIHRoZSBlbGVtZW50IG1vZGVsIHNob3VsZCBiZSBpZ25vcmVkLiBUaGUgbW9kZWwgc2hvdWxkCi0JCQkvLyBiZQotCQkJLy8gaWdub3JlZCBpbiBzdWNoIGNhc2VzIGFzIHdoZW4gaXQgaXMgZXF1YWwgdG8gRU1QVFkgb3IgQU5ZLgotCQkJaWYgKGZJZ25vcmVFbGVtTW9kZWwuY29udGFpbnMobW9kZWwpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gQWRkIGVhY2ggcmVmZXJlbmNlZCBlbGVtZW50IHRvIHRoZSBsaXN0IG9mIHJlZmVyZW5jZWQgZWxlbWVudHMKLQkJCWludCBsaW5lID0gZkxvY2F0b3IuZ2V0TGluZU51bWJlcigpOwotCQkJaW50IGNvbHVtbiA9IGZMb2NhdG9yLmdldENvbHVtbk51bWJlcigpOwotCQkJU3RyaW5nIHVyaSA9IGZMb2NhdG9yLmdldFN5c3RlbUlkKCk7Ci0KLQkJCVN0cmluZ1Rva2VuaXplciBzdHJ0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1vZGVsLCBNT0RFTF9ERUxJTUlURVJTKTsKLQkJCXdoaWxlIChzdHJ0b2suaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIHRva2VuID0gc3RydG9rLm5leHRUb2tlbigpOwotCQkJCWludCB0b2tlbmxlbmd0aCA9IHRva2VuLmxlbmd0aCgpOwotCQkJCWlmIChFTEVNRU5UX01PRElGSUVSUy5pbmRleE9mKHRva2VuLmNoYXJBdCh0b2tlbmxlbmd0aCAtIDEpKSAhPSAtMSkgewotCQkJCQl0b2tlbiA9IHRva2VuLnN1YnN0cmluZygwLCB0b2tlbmxlbmd0aCAtIDEpOwotCQkJCQkvLyBJZiB0aGUgdG9rZW4gaXMgbm93IGVtcHR5IChpdCB3YXMgb25seSA/LCogb3IgKykgdGhlbgotCQkJCQkvLyBjb250aW51ZS4KLQkJCQkJaWYgKHRva2VuLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChmSWdub3JlRWxlbVJlZnMuY29udGFpbnModG9rZW4pKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlFbGVtZW50UmVmTG9jYXRpb24gZWxlbUxvYyA9IChFbGVtZW50UmVmTG9jYXRpb24pIGZFbGVtUmVmcy5nZXQodG9rZW4pOwotCQkJCUVsZW1lbnRSZWZMb2NhdGlvbiB0b2tlbkxvYyA9IG5ldyBFbGVtZW50UmVmTG9jYXRpb24obGluZSwgY29sdW1uLCB1cmksIGVsZW1Mb2MpOwotCQkJCWZFbGVtUmVmcy5wdXQodG9rZW4sIHRva2VuTG9jKTsKLQkJCX0KLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjZW5kQ0RBVEEoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZW5kQ0RBVEEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjZW5kRFREKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVuZERURCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNlbmRFbnRpdHkoamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVuZEVudGl0eShTdHJpbmcgYXJnMCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2V4dGVybmFsRW50aXR5RGVjbChqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBleHRlcm5hbEVudGl0eURlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldCB0aGUgbGlzdCBvZiBlbGVtZW50IGRlY2xhcmF0aW9ucy4KLQkJICogCi0JCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0JCSAqLwotCQlwdWJsaWMgTGlzdCBnZXRFbGVtZW50RGVjbGFyYXRpb25zKCkgewotCQkJcmV0dXJuIGZFbGVtRGVjbHM7Ci0JCX0KLQotCQkvKioKLQkJICogR2V0IHRoZSBlbGVtZW50IHJlZmVyZW5jZXMgaGFzaHRhYmxlLgotCQkgKiAKLQkJICogQHJldHVybiBUaGUgZWxlbWVudCByZWZlcmVuY2VzIGhhc2h0YWJsZS4KLQkJICovCi0JCXB1YmxpYyBIYXNodGFibGUgZ2V0RWxlbWVudFJlZmVyZW5jZXMoKSB7Ci0JCQlyZXR1cm4gZkVsZW1SZWZzOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjaW50ZXJuYWxFbnRpdHlEZWNsKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGludGVybmFsRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzZXREb2N1bWVudExvY2F0b3Iob3JnLnhtbC5zYXguTG9jYXRvcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGxvY2F0b3IpIHsKLQkJCXN1cGVyLnNldERvY3VtZW50TG9jYXRvcihsb2NhdG9yKTsKLQkJCXRoaXMuZkxvY2F0b3IgPSBsb2NhdG9yOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjc3RhcnRDREFUQSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzdGFydENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI3N0YXJ0RFREKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RFREKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI3N0YXJ0RW50aXR5KGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzdGFydEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCX0KLQotCQotCi0JcHJpdmF0ZSBVUklSZXNvbHZlciBmUmVzb2x2ZXIgPSBudWxsOwotCi0JcHVibGljIERURFZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIFVSSSByZXNvbHZlciB0byB1c2Ugd2l0aCBYU0QgdmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpcmVzb2x2ZXIKLQkgKiAgICAgICAgICAgIFRoZSBVUkkgcmVzb2x2ZXIgdG8gdXNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSSVJlc29sdmVyKFVSSVJlc29sdmVyIHVyaXJlc29sdmVyKSB7Ci0JCXRoaXMuZlJlc29sdmVyID0gdXJpcmVzb2x2ZXI7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIERURCBmaWxlIGxvY2F0ZWQgYXQgdGhlIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgVVJJIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlLgotCSAqIEByZXR1cm4gQSB2YWxpZGF0aW9uIHJlcG9ydCBmb3IgdGhlIHZhbGlkYXRpb24uCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSkgewotCQlWYWxpZGF0aW9uSW5mbyB2YWxpbmZvID0gbmV3IFZhbGlkYXRpb25JbmZvKHVyaSk7Ci0JCXRyeSB7Ci0JCQlTQVhQYXJzZXIgcGFyc2VyID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1NBWFBhcnNlcigpOwotCQkJWE1MUmVhZGVyIHJlYWRlciA9IHBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLQkJCU11bHRpSGFuZGxlciBkdGRIYW5kbGVyID0gbmV3IE11bHRpSGFuZGxlcigpOwotCQkJcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9kZWNsYXJhdGlvbi1oYW5kbGVyIiwgZHRkSGFuZGxlcik7IC8vJE5PTi1OTFMtMSQKLQkJCXJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgZHRkSGFuZGxlcik7IC8vJE5PTi1OTFMtMSQKLQkJCXJlYWRlci5zZXRDb250ZW50SGFuZGxlcihkdGRIYW5kbGVyKTsKLQkJCXJlYWRlci5zZXREVERIYW5kbGVyKGR0ZEhhbmRsZXIpOwotCQkJcmVhZGVyLnNldEVycm9ySGFuZGxlcihuZXcgRFRERXJyb3JIYW5kbGVyKHZhbGluZm8pKTsKLQkJCXJlYWRlci5zZXRFbnRpdHlSZXNvbHZlcihuZXcgRFRERW50aXR5UmVzb2x2ZXIoZlJlc29sdmVyLCB1cmkpKTsKLQkJCVN0cmluZyBkb2N1bWVudCA9ICI8IURPQ1RZUEUgcm9vdCBTWVNURU0gXCIiICsgdXJpICsgIlwiPjxyb290Lz4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJcmVhZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKGRvY3VtZW50KSkpOwotCi0JCQlMaXN0IGVsZW1EZWNscyA9IGR0ZEhhbmRsZXIuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpOwotCQkJSGFzaHRhYmxlIGVsZW1SZWZzID0gZHRkSGFuZGxlci5nZXRFbGVtZW50UmVmZXJlbmNlcygpOwotCQkJdmFsaWRhdGVFbGVtZW50UmVmZXJlbmNlcyhlbGVtRGVjbHMsIGVsZW1SZWZzLCB2YWxpbmZvKTsKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCi0JCX0KLQkJY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0KLQkJfQotCQlyZXR1cm4gdmFsaW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgZWxlbWVudCByZWZlcmVuY2VzIGluIHRoZSBEVEQuIEFuIGVsZW1lbnQgcmVmZXJlbmNlIGlzCi0JICogPCFFTEVNRU5UIGVsZW0gKGVsZW1lbnRSZWZlcmVuY2UpPgotCSAqIAotCSAqIEBwYXJhbSBlbGVtRGVjbHMKLQkgKiAgICAgICAgICAgIEEgbGlzdCBvZiB2YWxpZCBlbGVtZW50IGRlY2xhcmF0aW9ucy4KLQkgKiBAcGFyYW0gZWxlbVJlZnMKLQkgKiAgICAgICAgICAgIEEgaGFzaHRhYmxlIGNvbnRhaW5pbmcgZWxlbWVudCByZWZlcmVuY2VzIGFzIGtleXMgYW5kCi0JICogICAgICAgICAgICBsb2NhdGlvbnMgaW4gdGhlIGRvY3VtZW50IGFzIHZhbHVlcy4KLQkgKiBAcGFyYW0gdmFsaW5mbwotCSAqICAgICAgICAgICAgVGhlIHZhbGlkYXRpb24gaW5mbyBvYmplY3QgdG8gc3RvcmUgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVFbGVtZW50UmVmZXJlbmNlcyhMaXN0IGVsZW1EZWNscywgSGFzaHRhYmxlIGVsZW1SZWZzLCBWYWxpZGF0aW9uSW5mbyB2YWxpbmZvKSB7Ci0JCUVudW1lcmF0aW9uIGtleXMgPSBlbGVtUmVmcy5rZXlzKCk7Ci0JCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlTdHJpbmcgZWxlbVJlZiA9IChTdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKTsKLQkJCS8vIElmIHRoZSBlbGVtZW50IGhhc24ndCBiZWVuIGRlY2xhcmVkIGNyZWF0ZSBhbiBlcnJvci4KLQkJCWlmICghZWxlbURlY2xzLmNvbnRhaW5zKGVsZW1SZWYpKSB7Ci0JCQkJRWxlbWVudFJlZkxvY2F0aW9uIGVsZW1Mb2MgPSAoRWxlbWVudFJlZkxvY2F0aW9uKSBlbGVtUmVmcy5nZXQoZWxlbVJlZik7Ci0JCQkJZG8gewotCQkJCQl2YWxpbmZvLmFkZEVycm9yKE5MUy5iaW5kKERURFZhbGlkYXRpb25NZXNzYWdlcy5fRVJST1JfUkVGX0VMRU1FTlRfVU5ERUZJTkVELCAiJyIgKyBlbGVtUmVmICsgIiciKSwgZWxlbUxvYy5nZXRMaW5lKCksIGVsZW1Mb2MuZ2V0Q29sdW1uKCksIGVsZW1Mb2MuZ2V0VVJJKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJZWxlbUxvYyA9IGVsZW1Mb2MuZ2V0TmV4dCgpOwotCQkJCX0KLQkJCQl3aGlsZSAoZWxlbUxvYyAhPSBudWxsKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0VsZW1lbnRSZWZMb2NhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRWxlbWVudFJlZkxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZmYwN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRWxlbWVudFJlZkxvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotLyoqCi0gKiBBbiBlbGVtZW50IHJlZmVyZW5jZXMgbG9jYXRpb24gaG9sZHMgdGhlIGxvY2F0aW9uIG9mIGFuIGVsZW1lbnQgcmVmZXJlbmNlLgotICogQW4gZWxlbWVudCByZWZlcmVuY2UgaXMgZGVjbGFyZWQgaW4gYSBEVEQgZWxlbWVudCBkZWNsYXJhdGlvbiBzdWNoIGFzCi0gKiA8IUVMRU1FTlQgbXllbGVtIChlbGVtZW50cmVmKT4gQW4gZWxlbWVudCByZWZlcmVuY2UgbWF5IGJlIHBhcnQgb2YgYSBsaW5rZWQKLSAqIGxpc3QgYW5kIGNhbiBjb250YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBuZXh0IGVsZW1lbnQgcmVmZXJlbmNlIGluIHRoZSBsaXN0LgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLWNsYXNzIEVsZW1lbnRSZWZMb2NhdGlvbiB7Ci0JcHJpdmF0ZSBpbnQgY29sdW1uID0gLTE7Ci0KLQlwcml2YXRlIGludCBsaW5lID0gLTE7Ci0KLQlwcml2YXRlIEVsZW1lbnRSZWZMb2NhdGlvbiBuZXh0ID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIHVyaTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBsaW5lCi0JICogICAgICAgICAgICBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgVGhlIFVSSSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBlbGVtZW50IHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gbmV4dAotCSAqICAgICAgICAgICAgVGhlIG5leHQgZWxlbWVudCByZWZlcmVuY2UgaW4gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIEVsZW1lbnRSZWZMb2NhdGlvbihpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSwgRWxlbWVudFJlZkxvY2F0aW9uIG5leHQpIHsKLQkJdGhpcy5saW5lID0gbGluZTsKLQkJdGhpcy5jb2x1bW4gPSBjb2x1bW47Ci0JCXRoaXMudXJpID0gdXJpOwotCQl0aGlzLm5leHQgPSBuZXh0OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gY29sdW1uOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lKCkgewotCQlyZXR1cm4gbGluZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG5leHQgZWxlbWVudCByZWZlcmVuY2UgaW4gdGhlIGxpbmtlZCBsaXN0LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5leHQgZWxlbWVudCByZWZlcmVuY2UgaW4gdGhlIGxpbmtlZCBsaXN0LgotCSAqLwotCXB1YmxpYyBFbGVtZW50UmVmTG9jYXRpb24gZ2V0TmV4dCgpIHsKLQkJcmV0dXJuIG5leHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotCQlyZXR1cm4gdXJpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9EVERWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvRFREVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNDRhNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9EVERWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci0KLS8qKgotICogQW4gRFREIHZhbGlkYXRvciBzcGVjaWZpYyB0byBFY2xpcHNlLiBUaGlzIHZhbGlkYXRvciB3aWxsIHdyYXAgdGhlIGludGVybmFsCi0gKiBEVEQgdmFsaWRhdG9yIHRvIHByb3ZpZGUgYXV0b21hdGljIFVSSSByZXNvbHV0aW9uIHN1cHBvcnQuCi0gKiBVc2luZyB0aGlzIGNsYXNzIGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcgdGhlIGludGVybmFsIERURCB2YWxpZGF0b3IgYW5kIHJlZ2lzdGVyaW5nCi0gKiB0aGUgVVJJIHJlc29sdmVyIGZyb20gdGhlIFVSSSByZXNvbHV0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIERURFZhbGlkYXRvciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRURFZhbGlkYXRvciAKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgRFREVmFsaWRhdG9yIF9pbnN0YW5jZSA9IG51bGw7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuIFJlZ2lzdGVycyBVUkkgcmVzb2x1dGlvbiBmcmFtZXdvcmsgd2l0aCB0aGUgRFREIHZhbGlkYXRvci4KLSAgICovCi0gIHByb3RlY3RlZCBEVERWYWxpZGF0b3IoKQotICB7Ci0Jc3VwZXIoKTsKLQlzZXRVUklSZXNvbHZlcihVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBzcGVjaWZpYyBEVEQgdmFsaWRhdG9yLgotICAgKiAKLSAgICogQHJldHVybgotICAgKiAJCVRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2Ugc3BlY2lmaWMgRFREIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRFREVmFsaWRhdG9yIGdldEluc3RhbmNlKCkgCi0gIHsKLQlpZiAoX2luc3RhbmNlID09IG51bGwpIAotCXsKLQkgIF9pbnN0YW5jZSA9IG5ldyBEVERWYWxpZGF0b3IoKTsKLQl9Ci0JcmV0dXJuIF9pbnN0YW5jZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzOTQwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvblJlcG9ydDsKLQotLyoqCi0gKiBEVEQgdmFsaWRhdG9yIHRoYXQgaXMgY29udHJpYnV0ZWQgdG8gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IgCi17Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IjdmFsaWRhdGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5pby5JbnB1dFN0cmVhbSwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0KQotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRzdHJlYW0sIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgCi0gIHsKLQlEVERWYWxpZGF0b3IgdmFsaWRhdG9yID0gRFREVmFsaWRhdG9yLmdldEluc3RhbmNlKCk7Ci0KLQlWYWxpZGF0aW9uUmVwb3J0IHZhbHJlcG9ydCA9IG51bGw7Ci0JdmFscmVwb3J0ID0gdmFsaWRhdG9yLnZhbGlkYXRlKHVyaSk7Ci0JCi0JcmV0dXJuIHZhbHJlcG9ydDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0F0dHJpYnV0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNjMjQ0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0F0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vLyBiYXNlIGNsYXNzIGZvciBhbiBFbGVtZW50J3MgY29udGVudG1vZGVsCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlIGV4dGVuZHMgRFRETm9kZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQSA9IERURENvcmVNZXNzYWdlcy5fVUlfQ0hBUkFDVEVSX0RBVEFfREVTQzsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUSUVTID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9FTlRJVFlfTkFNRVNfREVTQzsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWSA9IERURENvcmVNZXNzYWdlcy5fVUlfRU5USVRZX05BTUVfREVTQzsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVU1FUkFURURfTkFNRSA9IERURENvcmVNZXNzYWdlcy5fVUlfRU5VTV9OQU1FX1RPS0VOU19ERVNDOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5VTUVSQVRFRF9OT1RBVElPTiA9IERURENvcmVNZXNzYWdlcy5fVUlfRU5VTV9OT1RBVElPTl9ERVNDOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklYRUQgPSAiI0ZJWEVEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9JREVOVElGSUVSX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRFJFRiA9IERURENvcmVNZXNzYWdlcy5fVUlfSURfUkVGRVJFTkNFX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRFJFRlMgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0lEX1JFRkVSRU5DRVNfREVTQzsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTElFRCA9ICIjSU1QTElFRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOTVRPS0VOID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9OQU1FX1RPS0VOX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOTVRPS0VOUyA9IERURENvcmVNZXNzYWdlcy5fVUlfTkFNRV9UT0tFTlNfREVTQzsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVJUkVEID0gIiNSRVFVSVJFRCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgSGFzaHRhYmxlIHR5cGVIYXNoID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSB0eXBlcyA9IHtDREFUQSwgSUQsIElEUkVGLCBJRFJFRlMsIEVOVElUWSwgRU5USVRJRVMsIE5NVE9LRU4sIE5NVE9LRU5TLCBFTlVNRVJBVEVEX05BTUUsIEVOVU1FUkFURURfTk9UQVRJT059OwotCi0JewotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuQ0RBVEFfS0VZV09SRCwgQ0RBVEEpOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuSURfS0VZV09SRCwgSUQpOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuSURSRUZfS0VZV09SRCwgSURSRUYpOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQsIElEUkVGUyk7Ci0JCXR5cGVIYXNoLnB1dChEVERSZWdpb25UeXBlcy5FTlRJVFlfS0VZV09SRCwgRU5USVRZKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLkVOVElUSUVTX0tFWVdPUkQsIEVOVElUSUVTKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLk5NVE9LRU5fS0VZV09SRCwgTk1UT0tFTik7Ci0JCXR5cGVIYXNoLnB1dChEVERSZWdpb25UeXBlcy5OTVRPS0VOU19LRVlXT1JELCBOTVRPS0VOUyk7Ci0JCXR5cGVIYXNoLnB1dChEVERSZWdpb25UeXBlcy5OT1RBVElPTl9LRVlXT1JELCBFTlVNRVJBVEVEX05PVEFUSU9OKTsKLQkJLy8gdGhpcyBvbmUncyBhIHNwZWNpYWwgY2FzZSBzaW5jZSB0aGVyZSBpcyBubyBrZXl3b3JkIGZvcgotCQkvLyBlbnVtZXJhdGVkIG5hbWUgdG9rZW5zCi0JCXR5cGVIYXNoLnB1dCgiKCkiLCBFTlVNRVJBVEVEX05BTUUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gbm93IHB1dCB0aGUgcmV2ZXJzZSBpbiBwbGFjZS4gVGhpcyBnaXZlcyB1cyBhIDIgd2F5IGxvb2t1cAotCQkvLyBmb3Igd2hlbiB3ZSB3YW50IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBhbmQgd2hlbiB3ZSB3YW50IHRvIHNldCBpdAotCQl0eXBlSGFzaC5wdXQoQ0RBVEEsICJDREFUQSIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChJRCwgIklEIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KElEUkVGLCAiSURSRUYiKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlSGFzaC5wdXQoSURSRUZTLCAiSURSRUZTIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KEVOVElUWSwgIkVOVElUWSIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChFTlRJVElFUywgIkVOVElUSUVTIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KE5NVE9LRU4sICJOTVRPS0VOIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KE5NVE9LRU5TLCAiTk1UT0tFTlMiKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlSGFzaC5wdXQoRU5VTUVSQVRFRF9OQU1FLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KEVOVU1FUkFURURfTk9UQVRJT04sICJOT1RBVElPTiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBBdHRyaWJ1dGVFbnVtTGlzdCBlbnVtTGlzdCA9IG51bGw7Ci0KLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMSUVEID0gIklNUExJRUQiOwotCi0JcHVibGljIEF0dHJpYnV0ZShEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEtpbmQoKSB7Ci0JCUlUZXh0UmVnaW9uIGRlZmF1bHRLaW5kUmVnaW9uID0gZ2V0RGVmYXVsdEtpbmRSZWdpb24oKTsKLQkJaWYgKGRlZmF1bHRLaW5kUmVnaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KGRlZmF1bHRLaW5kUmVnaW9uKTsKLQkJfQotCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXREZWZhdWx0S2luZFJlZ2lvbigpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5JTVBMSUVEX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5SRVFVSVJFRF9LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuRklYRURfS0VZV09SRCkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCUlUZXh0UmVnaW9uIGRlZmF1bHRWYWx1ZSA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXJhdG9yKCkpOwotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRWYWx1ZUZyb21RdW90ZWRSZWdpb24oZGVmYXVsdFZhbHVlKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgQXR0cmlidXRlRW51bUxpc3QgZ2V0RW51bUxpc3QoKSB7Ci0JCXJldHVybiBlbnVtTGlzdDsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuQVRUUklCVVRFSUNPTik7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5hbWVSZWdpb24oKSB7Ci0JCXJldHVybiBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLkFUVFJJQlVURV9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TmV4dFF1b3RlZExpdGVyYWwoUmVnaW9uSXRlcmF0b3IgaXRlcikgewotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKSB8fCByZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCkpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0T2Zmc2V0QWZ0ZXJUeXBlKCkgewotCQlJVGV4dFJlZ2lvbiB0eXBlUmVnaW9uID0gZ2V0VHlwZVJlZ2lvbigpOwotCi0JCVN0cmluZyB0eXBlID0gZ2V0VHlwZSgpOwotCQlib29sZWFuIGlzRW51bWVyYXRpb24gPSB0eXBlLmVxdWFscyhFTlVNRVJBVEVEX05BTUUpIHx8IHR5cGUuZXF1YWxzKEVOVU1FUkFURURfTk9UQVRJT04pOwotCQlpZiAoaXNFbnVtZXJhdGlvbikgewotCQkJLy8gbm93IGNoZWNrIGlmIG1heWJlIHRoaXMgaXMgYW4gZW51bWVyYXRpb24KLQkJCWlmIChnZXRFbnVtTGlzdCgpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZ2V0RW51bUxpc3QoKS5nZXRFbmRPZmZzZXQoKTsKLQkJCX0KLQkJfQotCQlpZiAodHlwZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHR5cGVSZWdpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmFtZVJlZ2lvbik7Ci0JCQkvLyAvLyBjcmVhdGUgb25lCi0JCQkvLyB0eXBlUmVnaW9uID0KLQkJCS8vIGZpbmRPckNyZWF0ZVR5cGVSZWdpb24oKFN0cmluZyl0eXBlSGFzaC5nZXQoQ0RBVEEpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0VHlwZVJlZ2lvbigpOwotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gKFN0cmluZykgdHlwZUhhc2guZ2V0KHJlZ2lvbi5nZXRUeXBlKCkpOwotCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCS8vIGp1c3QgcmV0dXJuIHRoZSB0ZXh0IG9mIHRoZSB0eXBlIHJlZ2lvbiBzaW5jZSB0aGlzIG1heSBiZQotCQkJCS8vIGFuIGVudGl0eSByZXByZXNlbnRpbmcgdGhlIHR5cGU7Ci0JCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocmVnaW9uKTsKLQkJCX0KLQkJCXJldHVybiB0eXBlOwotCQl9Ci0JCWVsc2UgaWYgKGdldEVudW1MaXN0KCkgIT0gbnVsbCkgewotCQkJLy8gZW51bWVyYXRlZCBuYW1lIHRva2VucyBkb24ndCBoYXZlIGEgdHlwZSBrZXl3b3JkLiBqdXN0Ci0JCQkvLyB0aGUgZXhpc3RlbmNlIG9mIHRoZSBsZWZ0IHBhcmVuIGlzIGVub3VnaAotCQkJcmV0dXJuIChTdHJpbmcpIHR5cGVIYXNoLmdldCgiKCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFR5cGVSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5DREFUQV9LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuSURfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLklEUkVGX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5JRFJFRlNfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRJRVNfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk5NVE9LRU5fS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk5NVE9LRU5TX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5OT1RBVElPTl9LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuUEFSTV9FTlRJVFlfVFlQRSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZUZyb21RdW90ZWRSZWdpb24oSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHR5cGUuZXF1YWxzKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKSB8fCB0eXBlLmVxdWFscyhEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCkpIHsKLQkJCVN0cmluZyB0ZXh0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChyZWdpb24pOwotCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkgLSAxKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvbHZlUmVnaW9ucygpIHsKLQkJcmVtb3ZlQ2hpbGROb2RlcygpOwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTikpIHsKLQkJCQllbnVtTGlzdCA9IG5ldyBBdHRyaWJ1dGVFbnVtTGlzdChnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCX0KLQkJCWlmIChlbnVtTGlzdCAhPSBudWxsKSB7Ci0JCQkJZW51bUxpc3QuYWRkUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTikgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0S2luZChPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcga2luZCkgewotCi0JCUlUZXh0UmVnaW9uIGRlZmF1bHRLaW5kUmVnaW9uID0gZ2V0RGVmYXVsdEtpbmRSZWdpb24oKTsKLQkJU3RyaW5nIG9sZERlZmF1bHRLaW5kID0gZGVmYXVsdEtpbmRSZWdpb24gPT0gbnVsbCA/ICIiIDogZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChkZWZhdWx0S2luZFJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFraW5kLmVxdWFscyhvbGREZWZhdWx0S2luZCkpIHsKLQkJCVN0cmluZyBuZXdUZXh0ID0ga2luZDsKLQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQlpbnQgbGVuZ3RoID0gMDsKLQkJCWlmIChkZWZhdWx0S2luZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChkZWZhdWx0S2luZFJlZ2lvbik7Ci0JCQkJbGVuZ3RoID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGRlZmF1bHRLaW5kUmVnaW9uKSAtIHN0YXJ0T2Zmc2V0OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RhcnRPZmZzZXQgPSBnZXRPZmZzZXRBZnRlclR5cGUoKTsKLQkJCQluZXdUZXh0ID0gIiAiICsgbmV3VGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlJVGV4dFJlZ2lvbiBkZWZhdWx0VmFsdWUgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyYXRvcigpKTsKLQotCQkJaWYgKGtpbmQuZXF1YWxzKEF0dHJpYnV0ZS5GSVhFRCkgfHwga2luZC5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpIHsKLQkJCQkJLy8gd2UgYXJlIGNoYW5naW5nIHRvIGZpeGVkIGFuZCB3ZWhhdmUgbm8gcXVvdGVkIHJlZ2lvbi4KLQkJCQkJLy8gcHV0IGluIGFuIGVtcHR5IHZhbHVlCi0JCQkJCW5ld1RleHQgKz0gIiBcIlwiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQlsZW5ndGggPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoZGVmYXVsdFZhbHVlKSAtIHN0YXJ0T2Zmc2V0OwotCQkJCX0KLQkJCX0KLQkJCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGxlbmd0aCwgbmV3VGV4dCk7Ci0JCQkvLyBkbyBzb21ldGhpbmcgaWYgdGhlcmUgaXMgbm8gImtpbmQiIHJlZ2lvbgotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdEtpbmQoU3RyaW5nIGtpbmQpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9BVFRSX0RFRkFVTFRfS0lORCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVmYXVsdEtpbmQodGhpcywga2luZCk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGZpeGVkKSB7Ci0JCUlUZXh0UmVnaW9uIGRlZmF1bHRWYWx1ZSA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXJhdG9yKCkpOwotCQlTdHJpbmcgcXVvdGVDaGFyID0gdmFsdWUuaW5kZXhPZigiXCIiKSA9PSAtMSA/ICJcIiIgOiAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCWludCBlbmRPZmZzZXQgPSAwOwotCQlTdHJpbmcgbmV3VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIG9sZFZhbHVlID0gZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCWJvb2xlYW4gb2xkS2luZElzRml4ZWQgPSBnZXREZWZhdWx0S2luZCgpLmVxdWFscyhBdHRyaWJ1dGUuRklYRUQpOwotCQlpZiAob2xkVmFsdWUuZXF1YWxzKHZhbHVlKSAmJiBmaXhlZCA9PSBvbGRLaW5kSXNGaXhlZCkgewotCQkJLy8gbm90aGluZyB0byBkbwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGRlZmF1bHRWYWx1ZSk7Ci0JCQllbmRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoZGVmYXVsdFZhbHVlKTsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIGRlZmF1bHRLaW5kUmVnaW9uID0gZ2V0RGVmYXVsdEtpbmRSZWdpb24oKTsKLQkJaWYgKGRlZmF1bHRLaW5kUmVnaW9uICE9IG51bGwpIHsKLQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoZGVmYXVsdEtpbmRSZWdpb24pOwotCQkJZW5kT2Zmc2V0ID0gZW5kT2Zmc2V0ID09IDAgPyBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoZGVmYXVsdEtpbmRSZWdpb24pIDogZW5kT2Zmc2V0OwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHN0YXJ0T2Zmc2V0ID09IDApIHsKLQkJCQllbmRPZmZzZXQgPSBzdGFydE9mZnNldCA9IGdldE9mZnNldEFmdGVyVHlwZSgpOwotCQkJCW5ld1RleHQgKz0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlJVGV4dFJlZ2lvbiB0eXBlUmVnaW9uID0gZ2V0VHlwZVJlZ2lvbigpOwotCQkJaWYgKHR5cGVSZWdpb24gPT0gbnVsbCAmJiBnZXRFbnVtTGlzdCgpID09IG51bGwpIHsKLQkJCQkvLyB0YWNrIG9uIGEgZGVmYXVsdCB0eXBlCi0JCQkJLy8gbmV3VGV4dCArPSAiQ0RBVEEgIjsKLQkJCX0KLQkJfQotCQlpZiAoZml4ZWQpIHsKLQkJCW5ld1RleHQgKz0gIiNGSVhFRCAiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0RGVmYXVsdEtpbmQoKS5lcXVhbHMoIiIpICYmIHZhbHVlLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJLy8gaWYgbm90IGZpeGVkIGFuZCB2YWx1ZSBpcyAiIiB0aGVuIHJlc2V0IHRoZSBkZWZhdWx0IGtpbmQgdG8KLQkJCQkvLyBpbXBsaWVkCi0JCQkJbmV3VGV4dCArPSAiI0lNUExJRUQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAoIWdldFR5cGUoKS5lcXVhbHMoIiIpICYmICF2YWx1ZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbmV3VGV4dCArPSBxdW90ZUNoYXIgKyB2YWx1ZSArIHF1b3RlQ2hhcjsKLQkJfQotCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgbmV3VGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBmaXhlZCkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0FUVFJfREVGQVVMVF9WQUwpOyAvLyROT04tTkxTLTEkCi0JCXNldERlZmF1bHRWYWx1ZSh0aGlzLCB2YWx1ZSwgZml4ZWQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgdHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IGdldFR5cGUoKTsKLQkJaWYgKCF0eXBlLmVxdWFscyhvbGRUeXBlKSkgewotCQkJYm9vbGVhbiB3YXNFbnVtZXJhdGlvbiA9IG9sZFR5cGUuZXF1YWxzKEVOVU1FUkFURURfTkFNRSkgfHwgb2xkVHlwZS5lcXVhbHMoRU5VTUVSQVRFRF9OT1RBVElPTik7Ci0JCQlib29sZWFuIGlzRW51bWVyYXRpb24gPSB0eXBlLmVxdWFscyhFTlVNRVJBVEVEX05BTUUpIHx8IHR5cGUuZXF1YWxzKEVOVU1FUkFURURfTk9UQVRJT04pOwotCQkJU3RyaW5nIG5ld1RleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCWludCBlbmRPZmZzZXQgPSAwOwotCi0JCQlpZiAod2FzRW51bWVyYXRpb24gJiYgIWlzRW51bWVyYXRpb24pIHsKLQkJCQkvLyBnZXQgcmlkIG9mIHRoZSBvbGQgZW51bWxpc3QKLQkJCQlBdHRyaWJ1dGVFbnVtTGlzdCBlbnVtTGlzdCA9IGdldEVudW1MaXN0KCk7Ci0JCQkJaWYgKGVudW1MaXN0ICE9IG51bGwpIHsKLQkJCQkJc3RhcnRPZmZzZXQgPSBlbnVtTGlzdC5nZXRTdGFydE9mZnNldCgpOwotCQkJCQllbmRPZmZzZXQgPSBlbnVtTGlzdC5nZXRFbmRPZmZzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldFR5cGVSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQlpZiAoZW5kT2Zmc2V0ID09IDApIHsKLQkJCQkJZW5kT2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoc3RhcnRPZmZzZXQgPT0gMCkgewotCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQkJbmV3VGV4dCArPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCQllbmRPZmZzZXQgPSBzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuYW1lUmVnaW9uKTsKLQkJCX0KLQotCQkJU3RyaW5nIG5ld1R5cGVXb3JkID0gKFN0cmluZykgdHlwZUhhc2guZ2V0KHR5cGUpOwotCQkJaWYgKG5ld1R5cGVXb3JkID09IG51bGwpIHsKLQkJCQkvLyB0aGVuIHRoaXMgbXVzdCBiZSBhIHBhcm0gZW50aXR5IGJlaW5nIHVzZWQgaW4gdGhlIHR5cGUKLQkJCQkvLyB1c2UgdGhlIHR5cGUgdGV4dCBkaXJlY3RseQotCQkJCW5ld1R5cGVXb3JkID0gdHlwZTsKLQkJCX0KLQotCQkJbmV3VGV4dCArPSBuZXdUeXBlV29yZDsKLQotCQkJaWYgKGlzRW51bWVyYXRpb24gJiYgIXdhc0VudW1lcmF0aW9uKSB7Ci0JCQkJLy8gcHV0IGluIGEgbmV3IG51bWxpc3QKLQkJCQlib29sZWFuIGlzU3BhY2VOZWVkZWQgPSAhdHlwZS5lcXVhbHMoRU5VTUVSQVRFRF9OQU1FKTsKLQkJCQluZXdUZXh0ICs9IGlzU3BhY2VOZWVkZWQgPyAiICIgOiAiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbmV3VGV4dCArPSAiKCkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgbmV3VGV4dCk7Ci0JCQlpZiAobmV3VHlwZVdvcmQuZXF1YWxzKCIiKSAmJiAhdHlwZS5lcXVhbHMoRU5VTUVSQVRFRF9OQU1FKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gdGhlIHNldCB0aGUgZGVmYXVsdGtpbmQgdG8gIiIKLQkJCQkvLyBzZXREZWZhdWx0S2luZChyZXF1ZXN0b3IsICIiKTsKLQkJCQlzZXREZWZhdWx0VmFsdWUocmVxdWVzdG9yLCAiIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9BVFRSX1RZUEUpOyAvLyROT04tTkxTLTEkCi0JCXNldFR5cGUodGhpcywgdHlwZSk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0F0dHJpYnV0ZUVudW1MaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0F0dHJpYnV0ZUVudW1MaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MjA1N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGVFbnVtTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVFbnVtTGlzdCBleHRlbmRzIERURE5vZGUgewotCi0JcHJpdmF0ZSBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBBdHRyaWJ1dGVFbnVtTGlzdChEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJLy8gbmV2ZXIgZXhwb3NlZCBpbiB0cmVlCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIHJldHVybiB0aGUgaXRlbXMgdGhhdCBhcmUgaW4gdGhpcyBlbnVtZXJhdGVkIGxpc3QKLQlwdWJsaWMgTGlzdCBnZXRJdGVtcygpIHsKLQkJbGlzdC5jbGVhcigpOwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBuYW1lID0gZ2V0TmV4dFJlZ2lvbihpdGVyLCBEVERSZWdpb25UeXBlcy5OQU1FKTsKLQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQlsaXN0LmFkZChnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KG5hbWUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJdGVtcyhPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmdbXSBpdGVtcykgewotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJU3RyaW5nIHRleHQgPSAiKCI7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJdGV4dCArPSAiIHwgIiArIGl0ZW1zW2ldOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0ZXh0ICs9IGl0ZW1zW2ldOwotCQkJCX0KLQkJCX0KLQkJCXRleHQgKz0gIikiOyAvLyROT04tTkxTLTEkCi0JCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0YXJ0T2Zmc2V0KCksIGdldE5vZGVMZW5ndGgoKSwgdGV4dCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJdGVtcyhTdHJpbmdbXSBpdGVtcykgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0FUVFJfRU5VTV9JVEVNUyk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SXRlbXModGhpcywgaXRlbXMpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGVMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0F0dHJpYnV0ZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQyMjQ1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0F0dHJpYnV0ZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZUxpc3QgZXh0ZW5kcyBOYW1lZFRvcExldmVsTm9kZSB7Ci0JcHVibGljIEF0dHJpYnV0ZUxpc3QoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlLCBEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUl9MSVNUX0FERCk7IC8vJE5PTi1OTFMtMSQKLQotCQlEVEROb2RlIGxhc3RBdHRyaWJ1dGUgPSAoRFRETm9kZSkgZ2V0TGFzdENoaWxkKCk7Ci0JCWlmIChsYXN0QXR0cmlidXRlICE9IG51bGwpIHsKLQkJCXJlcGxhY2VUZXh0KHRoaXMsIGxhc3RBdHRyaWJ1dGUuZ2V0RW5kT2Zmc2V0KCksIDAsICJcblx0IiArIG5hbWUgKyAiIENEQVRBICNJTVBMSUVEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJCWlmIChuYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmFtZVJlZ2lvbiksIDAsICJcblx0IiArIG5hbWUgKyAiIENEQVRBICNJTVBMSUVEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCX0KLQotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkFUVFJJQlVURUxJU1RJQ09OKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnRJbnRvTW9kZWwoT2JqZWN0IHJlcXVlc3RvciwgQXR0cmlidXRlIHJlZmVyZW5jZSwgQXR0cmlidXRlIG5vZGUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJU3RyaW5nIG5ld1RleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbm9kZVRleHQgPSBub2RlLmdldEZ1bGxOb2RlVGV4dCgpOwotCQlpZiAoIWlzQWZ0ZXIpIHsKLQkJCW9mZnNldCA9IHJlZmVyZW5jZS5nZXRTdGFydE9mZnNldCgpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gdHJ5IGFuZCBnZXQgbmV4dCBjaGlsZAotCQkJQXR0cmlidXRlIGF0dHIgPSAoQXR0cmlidXRlKSByZWZlcmVuY2UuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQlvZmZzZXQgPSBhdHRyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBqdXN0IHVzZSB0aGUgZW5kIG9mZnNldAotCQkJCW9mZnNldCA9IHJlZmVyZW5jZS5nZXRXaGl0ZXNwYWNlRW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCX0KLQkJbmV3VGV4dCArPSBub2RlVGV4dDsvLyArIChpc0xhc3RDaGlsZCA/ICJcbiIgOiAiXG5cdCIpOwotCQlpZiAoIW5vZGUuaGFzVHJhaWxpbmdXaGl0ZXNwYWNlKCkpIHsKLQkJCW5ld1RleHQgKz0gIlxuXHQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBvZmZzZXQsIDAsIG5ld1RleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc29sdmVSZWdpb25zKCkgewotCQlyZW1vdmVDaGlsZE5vZGVzKCk7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCi0JCWlmIChnZXROYW1lUmVnaW9uKCkgIT0gbnVsbCkgewotCQkJLy8gd2Ugc2tpcCBwYXN0IHRoZSBuYW1lIHRva2VuIGlzIG91ciBuYW1lCi0JCQlza2lwUGFzdE5hbWUoaXRlcik7Ci0JCX0KLQotCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBudWxsOwotCQlib29sZWFuIHRyYWlsaW5nV2hpdGVzcGFjZSA9IGZhbHNlOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuQVRUUklCVVRFX05BTUUpKSB7Ci0JCQkJYXR0cmlidXRlID0gbmV3IEF0dHJpYnV0ZShnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQljaGlsZHJlbi5hZGQoYXR0cmlidXRlKTsKLQkJCQlhcHBlbmRDaGlsZChhdHRyaWJ1dGUpOwotCQkJCXRyYWlsaW5nV2hpdGVzcGFjZSA9IGZhbHNlOwotCQkJfQotCQkJaWYgKGF0dHJpYnV0ZSAhPSBudWxsICYmIGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpICE9IERURFJlZ2lvblR5cGVzLkVORF9UQUcpIHsKLQkJCQlpZiAoIXRyYWlsaW5nV2hpdGVzcGFjZSkgewotCQkJCQlhdHRyaWJ1dGUuYWRkUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpIHsKLQkJCQkJCWF0dHJpYnV0ZS5hZGRXaGl0ZXNwYWNlUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gdGhlIGZvbGxvd2luZyBwcmV2ZW50cyBleHRyYSB3aGl0ZXNwYWNlIGZyb20gYmVpbmcgcGlja2VkCi0JCQkJLy8gdXAgYnkgdGhlIGF0dHJpYnV0ZQotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5SRVFVSVJFRF9LRVlXT1JEIHx8IGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLklNUExJRURfS0VZV09SRCB8fCBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCB8fCBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCkgewotCQkJCQl0cmFpbGluZ1doaXRlc3BhY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpbnQgbnVtS2lkcyA9IGNoaWxkcmVuLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1LaWRzOyBpKyspIHsKLQkJCSgoQXR0cmlidXRlKSBjaGlsZHJlbi5nZXQoaSkpLnJlc29sdmVSZWdpb25zKCk7Ci0JCX0gLy8gZW5kIG9mIGZvciAoKQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01CYXNpY05vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01CYXNpY05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5YWEzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNQmFzaWNOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoKLSAqIENNQmFzaWNOb2RlIGNvbWJpbmVzIGFsbCB0aGUgZGlmZmVyZW50IGNvbnRlbnQgdHlwZXMgaW50byBvbmUuIFRoZSBpZGVhCi0gKiBiZWhpbmQgdGhpcyBpcyB0byBhbGxvdyBhcmJpdHJhcnkgbmFtZSBjaGFuZ2VzIHRvIG5vdCByZXF1aXJlIGEgdHJlZQotICogdXBkYXRlLgotICovCi1wdWJsaWMgY2xhc3MgQ01CYXNpY05vZGUgZXh0ZW5kcyBDTVJlcGVhdGFibGVOb2RlIHsKLQotCS8vIHN0YXRpYyBmaW5hbCBpbnQgRU1QVFkgPSAwOwotCS8vIHN0YXRpYyBmaW5hbCBpbnQgQU5ZID0gMTsKLQkvLyBzdGF0aWMgZmluYWwgaW50IFBDREFUQSA9IDI7Ci0KLQlwdWJsaWMgQ01CYXNpY05vZGUoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCWZpbmFsIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQlJVGV4dFJlZ2lvbiBwY2RhdGEgPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKTsKLQkJaWYgKHBjZGF0YSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLlBDREFUQUlDT04pOwotCQl9Ci0KLQkJaWYgKGlzUm9vdEVsZW1lbnRDb250ZW50KCkpIHsKLQkJCWlmIChuYW1lLmVxdWFscyhFTVBUWSkpIHsKLQkJCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkVNUFRZSUNPTik7Ci0JCQl9Ci0JCQllbHNlIGlmIChuYW1lLmVxdWFscyhBTlkpKSB7Ci0JCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5BTllJQ09OKTsKLQkJCX0KLQkJfQotCi0JCS8vIE90aGVyd2lzZSB0aGlzIGlzIGp1c3QgYW4gZWxlbWVudCByZWZlcmVuY2Ugbm9kZS4gSnVzdCByZXR1cm4KLQkJLy8gd2hhdCBDTVJlcGVhdGFibGVOb2RlIHdvdWxkIGdpdmUgdXMKLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5hbWVSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuTkFNRSB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyByZXR1cm5zIHRoZSBvY2N1cnJlbmNldG9rZW4sIG9yIHRoZSB0b2tlbiB3aGVyZSB0aGUgb2NjdXJyZW5jZSB0b2tlbgotCS8vIHNob3VsZCBhcHBlYXIgYWZ0ZXIKLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0T2NjdXJyZW5jZVJlZ2lvbigpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXNraXBQYXN0TmFtZShpdGVyKTsKLQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXROYW1lUmVnaW9uKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlJVGV4dFJlZ2lvbiBwY2RhdGEgPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKTsKLQkJaWYgKHBjZGF0YSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gUENEQVRBOwotCQl9Ci0KLQkJaWYgKGlzUm9vdEVsZW1lbnRDb250ZW50KCkpIHsKLQkJCWZpbmFsIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQkJaWYgKGlzUm9vdEVsZW1lbnRDb250ZW50KCkpIHsKLQkJCQlpZiAobmFtZS5lcXVhbHMoRU1QVFkpKSB7Ci0JCQkJCXJldHVybiBFTVBUWTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoQU5ZKSkgewotCQkJCQlyZXR1cm4gQU5ZOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gb3RoZXJ3aXNlIGp1c3QgcmV0dXJuIGl0J3MgbmFtZSBhcyB0aGUgdHlwZQotCQkJCQlyZXR1cm4gbmFtZTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5QW55T3JQQ0RhdGEoKSB7Ci0JCWlmIChpc1BDRGF0YSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0KLQkJZmluYWwgU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JCWlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoRU1QVFkpIHx8IG5hbWUuZXF1YWxzKEFOWSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQQ0RhdGEoKSB7Ci0JCUlUZXh0UmVnaW9uIHBjZGF0YSA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEpOwotCQlpZiAocGNkYXRhICE9IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBwdWJsaWMgTm9kZSBpbnNlcnRSZWdpb24oUmVnaW9uIHRva2VuKQotCS8vIHsKLQkvLyBpZiAoIXRva2VuU3RyZWFtLmNvbnRhaW5zVG9rZW4odG9rZW4pICYmIHRva2VuLmdldFR5cGUoKSA9PQotCS8vIFRva2VuLk9DQ1VSX1RZUEUpCi0JLy8gewotCS8vIC8vIHRoZW4gYWRkIGl0IHNvIHRoYXQgb3VyIHJhbmdlIGNvbnRhaW5zIGl0Ci0JLy8gaW5zZXJ0SW50b1Rva2VuU3RyZWFtKHRva2VuKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIHRoaXM7Ci0JLy8gfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAhaXNFbXB0eUFueU9yUENEYXRhKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbmFtZSkgewotCQkvLyBiZWdpblJlY29yZGluZyhyZXF1ZXN0b3IsICJOYW1lIENoYW5nZSIpOwotCi0JCXN1cGVyLnNldE5hbWUocmVxdWVzdG9yLCBuYW1lKTsKLQkJaWYgKCFpc1JlZmVyZW5jZSgpKSB7Ci0JCQkvLyBpZiBpdCBpcyBubyBsb25nZXIgYSByZWZlcmVuY2Ugbm9kZSwgcmVtb3ZlIHRoZSBvY2N1cnJlbmNlCi0JCQkvLyB0b2tlbgotCQkJc2V0T2NjdXJyZW5jZShyZXF1ZXN0b3IsIENNUmVwZWF0YWJsZU5vZGUuT05DRSk7Ci0JCX0KLQotCQkvLyBlbmRSZWNvcmRpbmcocmVxdWVzdG9yKTsKLQl9Ci0KLQkvKgotCSAqIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWUoaW50IHR5cGUpIHsgc3dpdGNoICh0eXBlKSB7IGNhc2UgRU1QVFk6Ci0JICogcmV0dXJuIGVtcHR5U3RyaW5nOyBjYXNlIEFOWTogcmV0dXJuIGFueVN0cmluZzsgY2FzZSBQQ0RBVEE6IHJldHVybgotCSAqIHBjZGF0YVN0cmluZzsgZGVmYXVsdDogYnJlYWs7IH0gLy8gZW5kIG9mIHN3aXRjaCAoKSByZXR1cm4gIiI7IH0KLQkgKi8KLQotfS8vIENNQmFzaWNOb2RlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNR3JvdXBOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNR3JvdXBOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZDUzODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTUdyb3VwTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLkRURFVuaXF1ZU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgQ01Hcm91cE5vZGUgZXh0ZW5kcyBDTVJlcGVhdGFibGVOb2RlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDSE9JQ0UgPSAnfCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFNFUVVFTkNFID0gJywnOwotCi0JcHJvdGVjdGVkIGNoYXIgY29ubmVjdG9yID0gU0VRVUVOQ0U7Ci0KLQkvLyBwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIENNR3JvdXBOb2RlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ2hpbGQoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fR1JQX05PREVfQUREX0NISUxEKTsgLy8kTk9OLU5MUy0xJAotCQlEVEROb2RlIGxhc3ROb2RlID0gKERURE5vZGUpIGdldExhc3RDaGlsZCgpOwotCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBEVERVbmlxdWVOYW1lSGVscGVyLmdldFVuaXF1ZU5hbWUoZ2V0Q2hpbGRyZW5MaXN0KCksICJDaGlsZE5vZGUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJcmVwbGFjZVRleHQodGhpcywgbGFzdE5vZGUuZ2V0RW5kT2Zmc2V0KCksIDAsIFN0cmluZy52YWx1ZU9mKGdldENvbm5lY3RvcigpKSArIGVsZW1lbnROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RhcnRPZmZzZXQoKSArIDEsIDAsIGVsZW1lbnROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEdyb3VwKCkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0FERF9HUlApOyAvLyROT04tTkxTLTEkCi0JCURURE5vZGUgbGFzdE5vZGUgPSAoRFRETm9kZSkgZ2V0TGFzdENoaWxkKCk7Ci0JCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQlyZXBsYWNlVGV4dCh0aGlzLCBsYXN0Tm9kZS5nZXRFbmRPZmZzZXQoKSwgMCwgU3RyaW5nLnZhbHVlT2YoZ2V0Q29ubmVjdG9yKCkpICsgIiAoKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpICsgMSwgMCwgIigpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGUoT2JqZWN0IHJlcXVlc3RvciwgRFRETm9kZSBjaGlsZCkgewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0KLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAxICYmIGdldEZpcnN0Q2hpbGQoKSA9PSBjaGlsZCkgewotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBjaGlsZC5nZXRTdGFydE9mZnNldCgpLCBjaGlsZC5nZXROb2RlTGVuZ3RoKCksIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGggLSAxOyBpKyspIHsKLQkJCURURE5vZGUgY2hpbGRBID0gKERURE5vZGUpIGNoaWxkcmVuW2ldOwotCQkJRFRETm9kZSBjaGlsZEIgPSAoRFRETm9kZSkgY2hpbGRyZW5baSArIDFdOwotCi0JCQlib29sZWFuIGNoaWxkQURlbGV0ZWQgPSBjaGlsZEEgPT0gY2hpbGQ7Ci0JCQlib29sZWFuIGNoaWxkQkRlbGV0ZWQgPSBjaGlsZEIgPT0gY2hpbGQ7Ci0JCQlpZiAoY2hpbGRBRGVsZXRlZCB8fCBjaGlsZEJEZWxldGVkKSB7Ci0JCQkJLy8gd2UgZm91bmQgdGhlIGNoaWxkCi0JCQkJaW50IHN0YXJ0T2Zmc2V0ID0gY2hpbGRBRGVsZXRlZCA/IGNoaWxkQS5nZXRTdGFydE9mZnNldCgpIDogY2hpbGRBLmdldEVuZE9mZnNldCgpOwotCQkJCWludCBlbmRPZmZzZXQgPSBjaGlsZEFEZWxldGVkID8gY2hpbGRCLmdldFN0YXJ0T2Zmc2V0KCkgOiBjaGlsZEIuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgY29ubmVjdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgY29ubmVjdG9yLgotCSAqLwotCXB1YmxpYyBjaGFyIGdldENvbm5lY3RvcigpIHsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkrKykgewotCQkJRFRETm9kZSBjaGlsZEEgPSAoRFRETm9kZSkgY2hpbGRyZW5baV07Ci0JCQlEVEROb2RlIGNoaWxkQiA9IChEVEROb2RlKSBjaGlsZHJlbltpICsgMV07Ci0KLQkJCS8vIGNyZWF0ZSBhIHN0cmVhbSBiZXR3ZWVuIHRoZSB0d28gc2libGluZ3MgYW5kIHdhbGsgaXQKLQkJCS8vIG5vdGUgdGhhdCB0aGlzIHN0cmVhbSBpbmNsdWRlcyB0aGUgbGFzdCByZWdpb24gb2YgdGhlIGZpcnN0Ci0JCQkvLyBzaWJsaW5nIGFuZCB0aGUgZmlyc3QgcmVnaW9uIG9mIHRoZSBuZXh0IHNpYmxpbmcuCi0JCQkvLyBib3RoIHRoZXNlIHNob3VsZCBiZSBpZ25vcmVkCi0JCQlSZWdpb25JdGVyYXRvciBpdGVyID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLCBjaGlsZEEuZ2V0RW5kT2Zmc2V0KCksIGNoaWxkQi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCS8vIHN0cmVhbS5zZXRGaXJzdFJlZ2lvbihjaGlsZEEuZ2V0TGFzdFJlZ2lvbigpKTsKLQkJCS8vIHN0cmVhbS5zZXRMYXN0UmVnaW9uKGNoaWxkQi5nZXRGaXJzdFJlZ2lvbigpKTsKLQkJCS8vIEl0ZXJhdG9yIGl0ZXIgPSBzdHJlYW0uaXRlcmF0b3IoKTsKLQkJCS8vIHNraXAgdGhlIGZpcnN0IHJlZ2lvbiB3aGljaCBpcyB0aGUgbGFzdCByZWdpb24gb2YgY2hpbGRBCi0JCQkvLyBkbyB3ZSBuZWVkIHRoaXMgbm93ID8KLQkJCS8vIGl0ZXIubmV4dCgpOwotCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IG51bGw7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgY3VycmVudFJlZ2lvbiAhPSBjaGlsZEIuZ2V0U3RhcnRSZWdpb24oKSkgewotCQkJCWN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SKSB7Ci0JCQkJCWNvbm5lY3RvciA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoY3VycmVudFJlZ2lvbikuY2hhckF0KDApOwotCQkJCQlyZXR1cm4gY29ubmVjdG9yOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29ubmVjdG9yOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJRFREQ29yZVBsdWdpbiByZXNvdXJjZVBsdWdpbiA9IERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQkJc3dpdGNoIChnZXRDb25uZWN0b3IoKSkgewotCQkJY2FzZSBTRVFVRU5DRSA6Ci0JCQkJcmV0dXJuIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9ORVNFUVVFTkNFSUNPTik7Ci0JCQkvKgotCQkJICogc3dpdGNoIChnZXRPY2N1cnJlbmNlKCkpIHsgY2FzZSBPTkNFIDogcmV0dXJuCi0JCQkgKiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5PTkVTRVFVRU5DRUlDT04pOyBjYXNlCi0JCQkgKiBPUFRJT05BTCA6IHJldHVybgotCQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuT1BUSU9OQUxTRVFVRU5DRUlDT04pOyBjYXNlCi0JCQkgKiBPTkVfT1JfTU9SRSA6IHJldHVybgotCQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuT05FT1JNT1JFU0VRVUVOQ0VJQ09OKTsKLQkJCSAqIGNhc2UgWkVST19PUl9NT1JFIDogcmV0dXJuCi0JCQkgKiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5aRVJPT1JNT1JFU0VRVUVOQ0VJQ09OKTsgfQotCQkJICovCi0JCQljYXNlIENIT0lDRSA6Ci0JCQkJcmV0dXJuIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9ORUNIT0lDRUlDT04pOwotCQkvKgotCQkgKiBzd2l0Y2ggKGdldE9jY3VycmVuY2UoKSkgeyBjYXNlIE9OQ0UgOiByZXR1cm4KLQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuT05FQ0hPSUNFSUNPTik7IGNhc2UgT1BUSU9OQUwgOgotCQkgKiByZXR1cm4gcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuT1BUSU9OQUxDSE9JQ0VJQ09OKTsKLQkJICogY2FzZSBPTkVfT1JfTU9SRSA6IHJldHVybgotCQkgKiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5PTkVPUk1PUkVDSE9JQ0VJQ09OKTsgY2FzZQotCQkgKiBaRVJPX09SX01PUkUgOiByZXR1cm4KLQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuWkVST09STU9SRUNIT0lDRUlDT04pOyB9Ci0JCSAqLwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gcmV0dXJucyB0aGUgb2NjdXJyZW5jZXJlZ2lvbiwgb3IgdGhlIGxhc3QgcmVnaW9uIHdoZXJlIHRoZSBvY2N1cnJlbmNlCi0JLy8gcmVnaW9uIHNob3VsZCBhcHBlYXIgYWZ0ZXIKLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0T2NjdXJyZW5jZVJlZ2lvbigpIHsKLQkJaW50IG5lc3RpbmcgPSAwOwotCi0JCS8vIHdlIHNraXAgcGFzdCB0aGUgZmlyc3QgbGVmdCBwYXJlbiB3ZSBzZWUgc2luY2UgdGhhdCBpcyB0aGUKLQkJLy8gYmVnaW5uaW5nIG9mIG91ciBvd24gbm9kZQotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJLy8gd2UgYXNzdW1lIHRoZSBmaXJzdCByZWdpb24gaXMgdGhlICcoJwotCQlpdGVyLm5leHQoKTsKLQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSAmJiBuZXN0aW5nID49IDApIHsKLQkJCWN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5MRUZUX1BBUkVOKSB7Ci0JCQkJbmVzdGluZysrOwotCQkJfQotCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLlJJR0hUX1BBUkVOKSB7Ci0JCQkJbmVzdGluZy0tOwotCQkJfQotCQl9Ci0JCWlmIChuZXN0aW5nIDwgMCkgewotCQkJLy8gVGhpcyBtZWFucyB3ZSBoYXZlIHBhc3NlZCBvdmVyIHRoZSByaWdodCBwYXJlbiB0aGF0IG1hcmtzIHRoZQotCQkJLy8gZW5kIG9mIG91ciBncm91cGluZy4KLQkJCS8vIExvb2sgZm9yIGFuIG9jY3VycmVuY2UgcmVnaW9uCi0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQljdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUpIHsKLQkJCQkJcmV0dXJuIGN1cnJlbnRSZWdpb247Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGlmIHdlJ3JlIGhlcmUsIHRoaXMgbWVhbnMgdGhhdCB0aGVyZSBpcyBubyBvY2N1ciByZWdpb24uIHJldHVybiB0aGUKLQkJLy8gbGFzdCByZWdpb24KLQkJcmV0dXJuIGl0ZXIucHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCWlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKSB7Ci0JCQlpZiAoZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwpIHsKLQkJCQlDTU5vZGUgbm9kZSA9IChDTU5vZGUpIGdldEZpcnN0Q2hpbGQoKTsKLQkJCQlpZiAobm9kZS5nZXRUeXBlKCkuZXF1YWxzKFBDREFUQSkpIHsKLQkJCQkJcmV0dXJuIE1JWEVEOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIENISUxEUkVOOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnRDaGlsZE5vZGUoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIG5vZGVUZXh0LCBpbnQgcG9zaXRpb24pIHsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCi0JCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCVN0cmluZyBuZXdUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHBvc2l0aW9uIDwgY2hpbGRyZW4ubGVuZ3RoKSB7Ci0JCQlEVEROb2RlIHJlZmVyZW5jZSA9IChEVEROb2RlKSBjaGlsZHJlbltwb3NpdGlvbl07Ci0JCQlzdGFydE9mZnNldCA9IHJlZmVyZW5jZS5nZXRTdGFydE9mZnNldCgpOwotCQkJbmV3VGV4dCA9IG5vZGVUZXh0ICsgIiAiICsgU3RyaW5nLnZhbHVlT2YoZ2V0Q29ubmVjdG9yKCkpICsgIiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIGlmIChwb3NpdGlvbiA9PSBjaGlsZHJlbi5sZW5ndGgpIHsKLQkJCS8vIGFkZCB0byBlbmQKLQkJCURURE5vZGUgcmVmZXJlbmNlID0gKERURE5vZGUpIGNoaWxkcmVuW3Bvc2l0aW9uIC0gMV07Ci0JCQlzdGFydE9mZnNldCA9IHJlZmVyZW5jZS5nZXRFbmRPZmZzZXQoKTsKLQkJCW5ld1RleHQgPSAiICIgKyBTdHJpbmcudmFsdWVPZihnZXRDb25uZWN0b3IoKSkgKyAiICIgKyBub2RlVGV4dDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgMCwgbmV3VGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0Q2hpbGROb2RlKFN0cmluZyBub2RlVGV4dCwgaW50IHBvc2l0aW9uKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fR1JQX05PREVfSU5TRVJUX0VMRU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCWluc2VydENoaWxkTm9kZSh0aGlzLCBub2RlVGV4dCwgcG9zaXRpb24pOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0SW50b01vZGVsKE9iamVjdCByZXF1ZXN0b3IsIENNTm9kZSByZWZlcmVuY2UsIENNTm9kZSBub2RlLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJU3RyaW5nIG5vZGVUZXh0ID0gbm9kZS5nZXROb2RlVGV4dCgpOwotCQlMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW5MaXN0KCk7Ci0KLQkJaW50IGluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZihyZWZlcmVuY2UpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCS8vIG5vIHJlZmVyZW5jZSBub2RlLCBhZGQgaXQgdG8gdGhlIGVuZD8/Ci0JCQlpbmRleCA9IGNoaWxkcmVuLnNpemUoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGdvdCBhbiBpbmRleC4gaWYgd2Ugd2FudCB0byBhZGQgYWZ0ZXIsIGluY3JlYXNlIGJ5IDEKLQkJCWluZGV4ID0gaXNBZnRlciA/IGluZGV4ICsgMSA6IGluZGV4OwotCQl9Ci0JCWluc2VydENoaWxkTm9kZShyZXF1ZXN0b3IsIG5vZGVUZXh0LCBpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJlZ2lvbnMoKSB7Ci0JCWludCBuZXN0aW5nID0gMDsKLQkJLy8gY2hpbGRyZW4uY2xlYXIoKTsKLQkJcmVtb3ZlQ2hpbGROb2RlcygpOwotCQlEVEROb2RlIGN1cnJlbnRHcm91cE5vZGUgPSBudWxsOwotCQlDTUJhc2ljTm9kZSBjdXJyZW50UmVmZXJlbmNlTm9kZSA9IG51bGw7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkvLyB3ZSBhc3N1bWUgdGhlIGZpcnN0IHJlZ2lvbiBpcyB0aGUgJygnCi0JCWl0ZXIubmV4dCgpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgbmVzdGluZyA+PSAwKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAobmVzdGluZyA9PSAwKSB7Ci0JCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSkpIHsKLQkJCQkJY3VycmVudEdyb3VwTm9kZSA9IGN1cnJlbnRSZWZlcmVuY2VOb2RlID0gbnVsbDsKLQkJCQkJRFRETm9kZSBwY0RhdGEgPSBuZXcgQ01CYXNpY05vZGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJCXBjRGF0YS5hZGRSZWdpb24oY3VycmVudFJlZ2lvbik7Ci0JCQkJCWFwcGVuZENoaWxkKHBjRGF0YSk7Ci0JCQkJCS8vIGNoaWxkcmVuLmFkZChwY0RhdGEpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTkFNRSkpIHsKLQkJCQkJLy8gd2UgaGF2ZSBoaXQgYSBuZXcgcmVmZXJlbmNlIG5vZGUuIE1ha2Ugc3VyZSB3ZSByZXNldAotCQkJCQkvLyB0aGUgZ3JvdXBub2RlIHZhciBzbyBpdCBkb2Vzbid0IGNvbGxlY3QgbW9yZSByZWdpb25zCi0JCQkJCWN1cnJlbnRHcm91cE5vZGUgPSBudWxsOwotCQkJCQljdXJyZW50UmVmZXJlbmNlTm9kZSA9IG5ldyBDTUJhc2ljTm9kZShnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQkJY3VycmVudFJlZmVyZW5jZU5vZGUuYWRkUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCQlhcHBlbmRDaGlsZChjdXJyZW50UmVmZXJlbmNlTm9kZSk7Ci0JCQkJCS8vIGNoaWxkcmVuLmFkZChjdXJyZW50UmVmZXJlbmNlTm9kZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSkgewotCQkJCQkvLyB3ZSBjb3VsZCBwb3RlbnRpYWxseSBmbGFnIGFuIGVycm9yIGhlcmUgaWYgd2UgaGl0IGFuCi0JCQkJCS8vIG9jY3VycmVuY2UgdHlwZSBhbmQgY3VycmVudFJlZk5vZGUgYW5kIGN1cnJlbnRHcm91cE5vZGUKLQkJCQkJLy8gYXJlIG51bGwKLQkJCQkJaWYgKGN1cnJlbnRSZWZlcmVuY2VOb2RlICE9IG51bGwpIHsKLQkJCQkJCS8vIGN1cnJlbnRSZWZlcmVuY2VOb2RlLnNldE9jY3VycmVuY2UoY3VycmVudFJlZ2lvbi5nZXRUZXh0KCkudG9DaGFyQXJyYXkoKVswXSk7Ci0JCQkJCQljdXJyZW50UmVmZXJlbmNlTm9kZS5hZGRSZWdpb24oY3VycmVudFJlZ2lvbik7Ci0JCQkJCQljdXJyZW50UmVmZXJlbmNlTm9kZSA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUikpIHsKLQkJCQkJLy8gbm90ZSB0aGF0IGlmIGNvbm5lY3RvciBpcyBhbHJlYWR5IHNldCBhbmQgaXQgaXMKLQkJCQkJLy8gZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgY29ubmVjdG9yIHJlZ2lvbiwgdGhlbiB3ZQotCQkJCQkvLyBoYXZlIGFuIGVycm9yIQotCQkJCQkvLyBzZXRDb25uZWN0b3IoY3VycmVudFJlZ2lvbi5nZXRUZXh0KCkudG9DaGFyQXJyYXkoKVswXSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5MRUZUX1BBUkVOKSkgewotCQkJCQlpZiAoY3VycmVudEdyb3VwTm9kZSA9PSBudWxsKSB7Ci0JCQkJCQkvLyB3ZSBoYXZlIGhpdCBhIG5ldyBncm91cC4gTWFrZSBzdXJlIHdlIHJlc2V0IHRoZQotCQkJCQkJLy8gcmVmZXJlbmNlbm9kZSB2YXIgc28gaXQgZG9lc24ndCBjb2xsZWN0IGFueSBtb3JlCi0JCQkJCQkvLyByZWdpb25zCi0JCQkJCQljdXJyZW50UmVmZXJlbmNlTm9kZSA9IG51bGw7Ci0JCQkJCQljdXJyZW50R3JvdXBOb2RlID0gbmV3IENNR3JvdXBOb2RlKGdldERUREZpbGUoKSwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkpOwotCQkJCQkJYXBwZW5kQ2hpbGQoY3VycmVudEdyb3VwTm9kZSk7Ci0JCQkJCQkvLyBjaGlsZHJlbi5hZGQoY3VycmVudEdyb3VwTm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTikpIHsKLQkJCQluZXN0aW5nKys7Ci0JCQl9Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLlJJR0hUX1BBUkVOKSkgewotCQkJCW5lc3RpbmctLTsKLQkJCQlpZiAobmVzdGluZyA9PSAwICYmIGN1cnJlbnRHcm91cE5vZGUgIT0gbnVsbCkgewotCQkJCQljdXJyZW50R3JvdXBOb2RlLmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQkJLy8gcGVlayBhdCBuZXh0IHJlZ2lvbiB0byBzZWUgaWYgaXQgaXMgYW4gb2NjdXIgcmVnaW9uLiBpZgotCQkJCQkvLyBzbywgYWRkIGl0IHRvIHRoZSBncm91cG5vZGUKLQkJCQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlJVGV4dFJlZ2lvbiBuZXh0UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAobmV4dFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUpKSB7Ci0JCQkJCQkJY3VycmVudEdyb3VwTm9kZS5hZGRSZWdpb24obmV4dFJlZ2lvbik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBPdGhlcndpc2UsIHB1c2ggaXQgYmFjayBhcyB0aGUgbmV4dCBpdGVtIHRvIGJlCi0JCQkJCQkJLy8gcmV0cmlldmVkIGJ5IGEgZnV0dXJlIG5leHQoKSBjYWxsCi0JCQkJCQkJaXRlci5wcmV2aW91cygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWN1cnJlbnRHcm91cE5vZGUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjdXJyZW50R3JvdXBOb2RlICE9IG51bGwpIHsKLQkJCQljdXJyZW50R3JvdXBOb2RlLmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCWlmIChuZXN0aW5nIDwgMCkgewotCQkJLy8gVGhpcyBtZWFucyB3ZSBoYXZlIHBhc3NlZCBvdmVyIHRoZSByaWdodCBwYXJlbiB0aGF0IG1hcmtzIHRoZQotCQkJLy8gZW5kIG9mIG91ciBncm91cGluZy4KLQkJCS8vIExvb2sgZm9yIGFuIG9jY3VycmVuY2UgcmVnaW9uCi0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSkgewotCQkJCQkvLyBzZXRPY2N1cnJlbmNlKGN1cnJlbnRSZWdpb24uZ2V0VGV4dCgpLnRvQ2hhckFycmF5KClbMF0pOwotCQkJCX0KLQkJCX0gLy8gZW5kIG9mIHdoaWxlICgpCi0JCX0KLQotCQkvLyBmb3IgKG9yZy53M2MuZG9tLk5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkCi0JCS8vID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKLQkJLy8gewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNoaWxkIGZvdW5kID0gIiArIGNoaWxkKTsKLQkJLy8gfQotCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjaGlsZHJlbiBsZWdudGggPSAiICsgY2hpbGRyZW4ubGVuZ3RoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIGNoaWxkcmVuW2ldOwotCQkJY3VycmVudE5vZGUucmVzb2x2ZVJlZ2lvbnMoKTsKLQkJfSAvLyBlbmQgb2Ygd2hpbGUgKCkKLQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgY29ubmVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gY29ubmVjdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbm5lY3RvcihjaGFyIHYpIHsKLQkJaWYgKGNvbm5lY3RvciAhPSB2KSB7Ci0JCQljb25uZWN0b3IgPSB2OwotCQkJLy8gd2FsayB0aHJvdWdoIG91ciBraWRzIGFuZCBzZWUgaWYgdGhlcmUgaXMgYSBjb25uZWN0b3IgYmV0d2VlbgotCQkJLy8gZWFjaCBzaWJsaW5nLiBpZiBub3QsIGNyZWF0ZSBvbmUgYW5kIHNldCB0aGUgY29ubmVjdG9yLiBpZgotCQkJLy8gdGhlcmUgaXMKLQkJCS8vIHRoZW4ganVzdCBjaGFuZ2UgdGhlIHRleHQgb2YgdGhlIGNvbm5lY3RvcgotCQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA8PSAxKSB7Ci0JCQkJLy8gdGhlcmUgd29uJ3QgYmUgYW55IGNvbm5lY3RvciBleGlzdGluZyBiZXR3ZWVuIHRoZSBjaGlsZHJlbgotCQkJCS8vIGp1c3Qgbm90aWZ5IGEgY2hhbmdlIGluIHRoZSBub2RlIGFuZCByZXR1cm47Ci0JCQkJZ2V0RFRERmlsZSgpLm5vdGlmeU5vZGVDaGFuZ2VkKHRoaXMpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fR1JQX05PREVfQ09OTkVDVE9SKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGggLSAxOyBpKyspIHsKLQkJCQlEVEROb2RlIGNoaWxkQSA9IChEVEROb2RlKSBjaGlsZHJlbltpXTsKLQkJCQlEVEROb2RlIGNoaWxkQiA9IChEVEROb2RlKSBjaGlsZHJlbltpICsgMV07Ci0KLQkJCQkvLyBjcmVhdGUgYSBzdHJlYW0gYmV0d2VlbiB0aGUgdHdvIHNpYmxpbmdzIGFuZCB3YWxrIGl0Ci0JCQkJLy8gbm90ZSB0aGF0IHRoaXMgc3RyZWFtIGluY2x1ZGVzIHRoZSBsYXN0IHJlZ2lvbiBvZiB0aGUgZmlyc3QKLQkJCQkvLyBzaWJsaW5nIGFuZCB0aGUgZmlyc3QgcmVnaW9uIG9mIHRoZSBuZXh0IHNpYmxpbmcuCi0JCQkJLy8gYm90aCB0aGVzZSBzaG91bGQgYmUgaWdub3JlZAotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCksIGNoaWxkQS5nZXRFbmRPZmZzZXQoKSwgY2hpbGRCLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCS8vIHNraXAgdGhlIGZpcnN0IHJlZ2lvbiB3aGljaCBpcyB0aGUgbGFzdCByZWdpb24gb2YgY2hpbGRBCi0KLQkJCQkvLyBkbyB3ZSBzdGlsbCBuZWVkIHRoaXMKLQkJCQkvLyBpdGVyLm5leHQoKTsKLQkJCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gbnVsbDsKLQkJCQlib29sZWFuIGZvdW5kQ29ubmVjdG9yID0gZmFsc2U7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpICYmIGN1cnJlbnRSZWdpb24gIT0gY2hpbGRCLmdldFN0YXJ0UmVnaW9uKCkpIHsKLQkJCQkJY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SKSB7Ci0JCQkJCQlmb3VuZENvbm5lY3RvciA9IHRydWU7Ci0JCQkJCQkvLyBSZWdpb24gb2xkUmVnaW9uID0gY3VycmVudFJlZ2lvbi5jcmVhdGVDb3B5KCk7Ci0JCQkJCQkvLyBmb3VuZCBhIGNvbm5lY3RvciEgb24gdG8gdGhlIG5leHQgc2libGluZyBwYWlyCi0JCQkJCQkvLyBjdXJyZW50UmVnaW9uLnVwZGF0ZVRleHQoU3RyaW5nLnZhbHVlT2YodikpOwotCQkJCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoY3VycmVudFJlZ2lvbiksIDEsIFN0cmluZy52YWx1ZU9mKGNvbm5lY3RvcikpOwotCQkJCQkJLy8gY2hhbmdlU3RydWN0dXJlZERvY3VtZW50KG9sZFJlZ2lvbiwgY3VycmVudFJlZ2lvbik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICghZm91bmRDb25uZWN0b3IpIHsKLQkJCQkJLy8gaWYgd2UncmUgaGVyZSwgdGhhdCBtZWFucyB3ZSBuZWVkIHRvIGluc2VydCBhIG5ldwotCQkJCQkvLyBjb25uZWN0b3IgcmVnaW9uIGFmdGVyIGNoaWxkQQotCQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBjaGlsZEEuZ2V0RW5kT2Zmc2V0KCksIDAsIFN0cmluZy52YWx1ZU9mKGNvbm5lY3RvcikpOwotCQkJCQkvLyBEVERSZWdpb24gY29ubmVjdG9yUmVnaW9uID0gbmV3Ci0JCQkJCS8vIERURFJlZ2lvbihEVERSZWdpb25UeXBlcy5DT05ORUNUT1IsCi0JCQkJCS8vIGNoaWxkQS5nZXRFbmRPZmZzZXQoKSwgMSk7Ci0JCQkJCS8vIGluc2VydEludG9TdHJ1Y3R1cmVkRG9jdW1lbnQoY29ubmVjdG9yUmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvLyBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKQotCS8vIHsKLQkvLyByZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCS8vIH0KLX0vLyBDTUdyb3VwTm9kZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNjM3NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotLy8gYmFzZSBjbGFzcyBmb3IgYW4gRWxlbWVudCdzIGNvbnRlbnRtb2RlbAotcHVibGljIGFic3RyYWN0IGNsYXNzIENNTm9kZSBleHRlbmRzIERURE5vZGUgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOWSA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9BTlk7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSElMRFJFTiA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9DSElMRF9DT05URU5UOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9FTVBUWTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JWEVEID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9OT0RFX01JWF9DT05URU5UOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENEQVRBID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9OT0RFX1BDREFUQTsgLy8kTk9OLU5MUy0xJAotCi0KLQlib29sZWFuIHJvb3RFbGVtZW50Q29udGVudDsKLQotCXB1YmxpYyBDTU5vZGUoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQkvLyB0aGlzIGlzIG9ubHkgdmFsaWQgdG8gYXNrIGlmIHRoZSBjb250ZW50IGlzIGEgcm9vdCBlbGVtZW50IGNvbnRlbnQKLQlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygcm9vdEVsZW1lbnRDb250ZW50LiBUaGlzIHRlbGxzIHVzIHdoZXRoZXIgdGhpcyBlbGVtZW50Ci0JICogY29udGVudCdzIHBhcmVudCBpcyBhIGRpcmVjdCBkZWNlbmRlbnQgb2YgdGhlIGNvbnRhaW5pbmcgZWxlbWVudAotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygcm9vdEVsZW1lbnRDb250ZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9vdEVsZW1lbnRDb250ZW50KCkgewotCQlyZXR1cm4gcm9vdEVsZW1lbnRDb250ZW50OwotCX0KLQotCS8vIGlmIHRoaXMgaXMgYSByb290IGVsZW1lbnQsIGNoYW5nZSB0aGUgY29udGVudCB0byBjaGlsZHJlbgotCS8vIGllIC4gKGNoaWxkMSkKLQlwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbkNvbnRlbnQoU3RyaW5nIG5ld0NoaWxkKSB7Ci0JCWlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKSB7Ci0JCQlpZiAoIW5ld0NoaWxkLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9TRVRfQ0hJTERfQ09OVEVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksICIoIiArIG5ld0NoaWxkICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKCFnZXRUeXBlKCkuZXF1YWxzKENISUxEUkVOKSkgewotCQkJCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9TRVRfQ0hJTERfQ09OVEVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAodGhpcyBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0YXJ0T2Zmc2V0KCksIGdldE5vZGVMZW5ndGgoKSwgIihuZXdDaGlsZCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbm93IG11c3QgY29udmVydCBmcm9tIG1peGVkIGNvbnRlbnQgdG8gdGhpcyBvbmUuIG11c3QKLQkJCQkJLy8gcHJlc2VydmUgdGhlIHJlbWFpbmluZyBjaGlsZHJlbgotCQkJCQlDTUdyb3VwTm9kZSBncm91cCA9IChDTUdyb3VwTm9kZSkgdGhpczsKLQkJCQkJQ01Ob2RlIGZpcnN0Q2hpbGQgPSAoQ01Ob2RlKSBncm91cC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCWlmIChmaXJzdENoaWxkLmdldFR5cGUoKS5lcXVhbHMoUENEQVRBKSkgewotCQkJCQkJZ3JvdXAuZGVsZXRlKGZpcnN0Q2hpbGQpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChTdHJpbmcgY29udGVudCkgewotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9OT0RFX1NFVCArICIgIiArIGNvbnRlbnQgKyAiICIgKyBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfQ09OVEVOVCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0YXJ0T2Zmc2V0KCksIGdldE5vZGVMZW5ndGgoKSwgY29udGVudCk7Ci0JCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvLyBpZiB0aGlzIGlzIGEgcm9vdCBlbGVtZW50LCBjaGFuZ2UgdGhlIGNvbnRlbnQgdG8gbWl4ZWQKLQkvLyBpZSAuICgjUENEQVRBLCBjaGlsZDEpCi0JcHVibGljIHZvaWQgc2V0TWl4ZWRDb250ZW50KCkgewotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJaWYgKCFnZXRUeXBlKCkuZXF1YWxzKE1JWEVEKSkgewotCQkJCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9TRVRfTUlYX0NPTlRFTlQpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHRoaXMgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksICIoI1BDREFUQSB8IG5ld0NoaWxkKSoiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbm93IG11c3QgY29udmVydCBmcm9tIGNoaWxkcmVuIGNvbnRlbnQgdG8gdGhpcyBvbmUuCi0JCQkJCS8vIG11c3QKLQkJCQkJLy8gcHJlc2VydmUgdGhlIGNoaWxkcmVuCi0JCQkJCUNNR3JvdXBOb2RlIGdyb3VwID0gKENNR3JvdXBOb2RlKSB0aGlzOwotCQkJCQlncm91cC5zZXRDb25uZWN0b3IoQ01Hcm91cE5vZGUuQ0hPSUNFKTsKLQkJCQkJZ3JvdXAuc2V0T2NjdXJyZW5jZShDTVJlcGVhdGFibGVOb2RlLlpFUk9fT1JfTU9SRSk7Ci0JCQkJCUNNTm9kZSBmaXJzdENoaWxkID0gKENNTm9kZSkgZ3JvdXAuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQlpZiAoIWZpcnN0Q2hpbGQuZ2V0VHlwZSgpLmVxdWFscyhQQ0RBVEEpKSB7Ci0JCQkJCQlncm91cC5pbnNlcnRDaGlsZE5vZGUoIiNQQ0RBVEEiLCAwKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygcm9vdEVsZW1lbnRDb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gcm9vdEVsZW1lbnRDb250ZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvb3RFbGVtZW50Q29udGVudChib29sZWFuIHYpIHsKLQkJdGhpcy5yb290RWxlbWVudENvbnRlbnQgPSB2OwotCX0KLQotCS8vIHB1YmxpYyB2b2lkIGRlbGV0ZSgpCi0JLy8gewotCS8vIGlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKQotCS8vIHsKLQkvLyAvLyB0aGVuIHRoZSBzdXBlcmNsYXNzZXMgZGVsZXRlIHdpbGwgYmUgZmluZQotCS8vIHN1cGVyLmRlbGV0ZSgpOwotCS8vIHJldHVybjsKLQkvLyB9Ci0KLQkvLyBDTUdyb3VwTm9kZSBwYXJlbnQgPSAoQ01Hcm91cE5vZGUpIGdldFBhcmVudE5vZGUoKTsKLQkvLyBwYXJlbnQucmVtb3ZlQ2hpbGROb2RlKHRoaXMpOwotCS8vIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNUmVwZWF0YWJsZU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01SZXBlYXRhYmxlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGE4YmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01SZXBlYXRhYmxlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENNUmVwZWF0YWJsZU5vZGUgZXh0ZW5kcyBDTU5vZGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE9OQ0UgPSAnMSc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE9ORV9PUl9NT1JFID0gJysnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPUFRJT05BTCA9ICc/JzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgWkVST19PUl9NT1JFID0gJyonOwotCi0KLQlwdWJsaWMgQ01SZXBlYXRhYmxlTm9kZShEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJRFREQ29yZVBsdWdpbiByZXNvdXJjZVBsdWdpbiA9IERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQkJcmV0dXJuIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLkVMRU1FTlRSRUZJQ09OKTsKLQl9Ci0KLQlwdWJsaWMgY2hhciBnZXRPY2N1cnJlbmNlKCkgewotCQlJVGV4dFJlZ2lvbiBvY2N1clJlZ2lvbiA9IGdldE9jY3VycmVuY2VSZWdpb24oKTsKLQkJaWYgKG9jY3VyUmVnaW9uICE9IG51bGwgJiYgb2NjdXJSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUpIHsKLQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KG9jY3VyUmVnaW9uKS5jaGFyQXQoMCk7Ci0JCX0KLQkJcmV0dXJuIENNUmVwZWF0YWJsZU5vZGUuT05DRTsKLQl9Ci0KLQkvLyByZXR1cm5zIHRoZSBvY2N1cnJlbmNlcmVnaW9uLCBvciB0aGUgbGFzdCByZWdpb24gd2hlcmUgdGhlIG9jY3VycmVuY2UKLQkvLyByZWdpb24gc2hvdWxkIGFwcGVhciBhZnRlcgotCWFic3RyYWN0IHB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRPY2N1cnJlbmNlUmVnaW9uKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRPY2N1cnJlbmNlKGNoYXIgb2NjdXJyZW5jZSkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX1JFUF9OT0RFX0NIR19PQ0NVUik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0T2NjdXJyZW5jZSh0aGlzLCBvY2N1cnJlbmNlKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9jY3VycmVuY2UoT2JqZWN0IHJlcXVlc3RvciwgY2hhciBvY2N1cnJlbmNlKSB7Ci0JCWlmIChnZXRPY2N1cnJlbmNlKCkgIT0gb2NjdXJyZW5jZSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0T2NjdXJyZW5jZVJlZ2lvbigpOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUpKSB7Ci0JCQkJCWlmIChvY2N1cnJlbmNlID09IENNUmVwZWF0YWJsZU5vZGUuT05DRSkgewotCQkJCQkJLy8gd2UgbmVlZCB0byByZW1vdmUgdGhlIG9jY3VyIHJlZ2lvbiBmcm9tIHRoZSBmbGF0Ci0JCQkJCQkvLyBtb2RlbDsKLQkJCQkJCWdldERUREZpbGUoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbiksIDEsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gUmVnaW9uIG9sZE9jY3VyID0gcmVnaW9uLmNyZWF0ZUNvcHkoKTsKLQkJCQkJCWdldERUREZpbGUoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbiksIDEsIFN0cmluZy52YWx1ZU9mKG9jY3VycmVuY2UpKTsKLQkJCQkJCS8vIGNoYW5nZVN0cnVjdHVyZWREb2N1bWVudChvbGRPY2N1ciwgcmVnaW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChvY2N1cnJlbmNlICE9IENNUmVwZWF0YWJsZU5vZGUuT05DRSkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0U3RyaW5nKCkpOwotCQkJCQkvLyB3ZSBuZWVkIHRvIGNyZWF0ZSBhbiBvY2N1cnJlbmNlUmVnaW9uCi0JCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbiksIDAsIFN0cmluZy52YWx1ZU9mKG9jY3VycmVuY2UpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0vLyBDTVJlcGVhdGFibGVOb2RlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NvbW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ29tbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGU4MjUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ29tbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIENvbW1lbnQgZXh0ZW5kcyBOYW1lZFRvcExldmVsTm9kZSB7Ci0KLQlwdWJsaWMgY2xhc3MgU3RhcnRFbmRQYWlyIHsKLQkJcHVibGljIGludCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0OwotCX0KLQotCXB1YmxpYyBDb21tZW50KERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkNPTU1FTlRJQ09OKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dCgpOwotCQlpZiAodGV4dC5sZW5ndGgoKSA8PSAzMCkgewotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgMjkpICsgIi4uLiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRTdGFydEFuZEVuZE9mZnNldEZvclRleHQoU3RhcnRFbmRQYWlyIHBhaXIpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCUlUZXh0UmVnaW9uIGNvbW1lbnRTdGFydFRhZyA9IGdldFN0YXJ0VGFnKGl0ZXIpOwotCQlJVGV4dFJlZ2lvbiBlbmRDb21tZW50VGFnID0gZ2V0TmV4dFJlZ2lvbihpdGVyLCBEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCk7Ci0JCXBhaXIuZW5kT2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChjb21tZW50U3RhcnRUYWcgIT0gbnVsbCkgewotCQkJcGFpci5zdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChjb21tZW50U3RhcnRUYWcpOwotCQl9Ci0JCWlmIChlbmRDb21tZW50VGFnICE9IG51bGwpIHsKLQkJCXBhaXIuZW5kT2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoZW5kQ29tbWVudFRhZyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpOwotCQlpbnQgZmxhdE5vZGVTdGFydCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCVN0YXJ0RW5kUGFpciBwYWlyID0gbmV3IFN0YXJ0RW5kUGFpcigpOwotCQlnZXRTdGFydEFuZEVuZE9mZnNldEZvclRleHQocGFpcik7Ci0JCXJldHVybiB0ZXh0LnN1YnN0cmluZyhwYWlyLnN0YXJ0T2Zmc2V0IC0gZmxhdE5vZGVTdGFydCwgcGFpci5lbmRPZmZzZXQgLSBmbGF0Tm9kZVN0YXJ0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBuZXdUZXh0KSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ09NTUVOVF9DSEcpOyAvLyROT04tTkxTLTEkCi0JCVN0YXJ0RW5kUGFpciBwYWlyID0gbmV3IFN0YXJ0RW5kUGFpcigpOwotCQlnZXRTdGFydEFuZEVuZE9mZnNldEZvclRleHQocGFpcik7Ci0JCXJlcGxhY2VUZXh0KHRoaXMsIHBhaXIuc3RhcnRPZmZzZXQsIHBhaXIuZW5kT2Zmc2V0IC0gcGFpci5zdGFydE9mZnNldCwgbmV3VGV4dCk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREQ29yZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTEyZjhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBEVEQgQ29yZQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIERURENvcmVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlUGx1Z2luUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTk9ORV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DSEFSQUNURVJfREFUQV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JREVOVElGSUVSX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lEX1JFRkVSRU5DRV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JRF9SRUZFUkVOQ0VTX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VOVElUWV9OQU1FX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VOVElUWV9OQU1FU19ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9OQU1FX1RPS0VOX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX05BTUVfVE9LRU5TX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VOVU1fTkFNRV9UT0tFTlNfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRU5VTV9OT1RBVElPTl9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVFRSX0RFRkFVTFRfVkFMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVFRSX0RFRkFVTFRfS0lORDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUl9UWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVFRSX0VOVU1fSVRFTVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FUVFJfTElTVF9BREQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0NPTk5FQ1RPUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fR1JQX05PREVfSU5TRVJUX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0FERF9HUlA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0FERF9DSElMRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fTk9ERV9NSVhfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fTk9ERV9DSElMRF9DT05URU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9OT0RFX1NFVF9NSVhfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fTk9ERV9TRVRfQ0hJTERfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fTk9ERV9TRVQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fTk9ERV9QQ0RBVEE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfQU5ZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9OT0RFX0VNUFRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9SRVBfTk9ERV9DSEdfT0NDVVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NPTU1FTlRfQ0hHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9EVERfRklMRV9BRERfRUxFTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX0ZJTEVfQUREX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX0ZJTEVfQUREX0NPTU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0FERF9QQVJNX0VOVElUWV9SRUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0FERF9OT1RBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX0ZJTEVfQUREX0FUVFJfTElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX0ZJTEVfREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9EVERfTk9ERV9OQU1FX0NIRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX05PREVfREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTEVNRU5UX0FERF9BVFRSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTEVNRU5UX0FERF9HUlA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VMRU1FTlRfQUREX0NISUxEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTlRJVFlfU0VUX1BBUk1fRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTlRJVFlfU0VUX0dFTkVSQUxfRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTlRJVFlfU0VUX0VYVF9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOVElUWV9TRVRfSU5UX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5USVRZX1ZBTFVFX0NIRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5USVRZX05EQVRBX0NIQU5HRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRVhUX05PREVfUFVCTElDX0lEX0NIRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRVhUX05PREVfU1lTVEVNX0lEX0NIRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTk9ERV9MSVNUX0VMRU1FTlRTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OT0RFX0xJU1RfRU5USVRJRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05PREVfTElTVF9OT1RBVElPTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05PREVfTElTVF9DT01NRU5UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTk9ERV9MSVNUX09USEVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OT0RFX0xJU1RfQVRUUklCVVRFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUEFSTV9FTlRJVFlfUkVGX0NIR19FTlRJVFlfUkVGOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QQVJNX0VOVElUWV9SRUZfQ09NTUVOVF9DSEc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1RPUF9MRVZFTF9OT0RFX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfSU5DTF9GSUxFX0xPQURfRkFJTFVSRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfVU5ERUNMQVJFRF9FTEVNRU5UXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SUEFSVF9VTkRFQ0xBUkVEX0VMRU1FTlRfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfRFVQX0lEX0FUVFJJQlVURV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUlBBUlRfRFVQX0lEX0FUVFJJQlVURV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUlBBUlRfSU5WQUxJRF9ERUZBVUxUX0FUVFJfVkFMVUVfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVhDX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIERURENvcmVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1NTYyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBEVERDb3JlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgRFREQ29yZVBsdWdpbiBpbnN0YW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0RFRESW1hZ2UoU3RyaW5nIGljb25OYW1lKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmdldEltYWdlKGljb25OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXREVERJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGljb25OYW1lKSB7Ci0JCVN0cmluZyB0aGlzSUQgPSBnZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKHRoaXNJRCwgaWNvbk5hbWUpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIERURENvcmVQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERURENvcmVQbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIERURENvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGljb25OYW1lKSB7Ci0JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGdldEltYWdlUmVnaXN0cnkoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSk7Ci0KLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCVN0cmluZyB0aGlzSUQgPSBnZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCQkJaW1hZ2VSZWdpc3RyeS5wdXQoaWNvbk5hbWUsIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4odGhpc0lELCBpY29uTmFtZSkpOwotCQkJaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdhYzNkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hIFN0cmluZ3MgZm9yIERUREJhc2ljVHlwZUltcGwgdHlwZSBkZXNjcmlwdGlvbnMKLV9VSV9OT05FX0RFU0M9Tm9uZQotCi0hISBOT1RFIFRPIFRSQU5TTEFUT1I6IERvIG5vdCB0cmFuc2xhdGUgZm9sbG93aW5nIHRleHQgaW4gcGFyZW50aGVzZXMgb24gZm9sbG93aW5nIDEwIGxpbmVzIGkuZS4oQ0RBVEEpCi1fVUlfQ0hBUkFDVEVSX0RBVEFfREVTQz1DaGFyYWN0ZXIgRGF0YSAoQ0RBVEEpCi1fVUlfSURFTlRJRklFUl9ERVNDPUlkZW50aWZpZXIgKElEKQotX1VJX0lEX1JFRkVSRU5DRV9ERVNDPUlEIFJlZmVyZW5jZSAoSURSRUYpCi1fVUlfSURfUkVGRVJFTkNFU19ERVNDPUlEIFJlZmVyZW5jZXMgKElEUkVGUykKLV9VSV9FTlRJVFlfTkFNRV9ERVNDPUVudGl0eSBOYW1lIChFTlRJVFkpCi1fVUlfRU5USVRZX05BTUVTX0RFU0M9RW50aXR5IE5hbWVzIChFTlRJVElFUykKLV9VSV9OQU1FX1RPS0VOX0RFU0M9TmFtZSBUb2tlbiAoTk1UT0tFTikKLV9VSV9OQU1FX1RPS0VOU19ERVNDPU5hbWUgVG9rZW5zIChOTVRPS0VOUykKLV9VSV9FTlVNX05BTUVfVE9LRU5TX0RFU0M9RW51bWVyYXRlZCBOYW1lIFRva2VucwotX1VJX0VOVU1fTk9UQVRJT05fREVTQz1FbnVtZXJhdGVkIE5PVEFUSU9OCi0KLSEgU3RyaW5ncyBmcm9tIHNlZC9tb2RlbAotCi0hIEF0dHJpYnV0ZS5qYXZhCi1fVUlfTEFCRUxfQVRUUl9ERUZBVUxUX1ZBTD1BdHRyaWJ1dGUgRGVmYXVsdCBDaGFuZ2UgVmFsdWUKLV9VSV9MQUJFTF9BVFRSX0RFRkFVTFRfS0lORD1DaGFuZ2UgQXR0cmlidXRlIERlZmF1bHQgVmFsdWUKLV9VSV9MQUJFTF9BVFRSX1RZUEU9Q2hhbmdlIEF0dHJpYnV0ZSBUeXBlCi0KLSEgQXR0cmlidXRlRW51bUxpc3QKLV9VSV9MQUJFTF9BVFRSX0VOVU1fSVRFTVM9Q2hhbmdlIEF0dHJpYnV0ZSBFbnVtZXJhdGlvbiBWYWx1ZQotCi0hIEF0dHJpYnV0ZUxpc3QKLV9VSV9MQUJFTF9BVFRSX0xJU1RfQUREPUFkZCBBdHRyaWJ1dGUKLQotISBDTUdyb3VwTm9kZQotX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0NPTk5FQ1RPUj1DaGFuZ2UgQ29ubmVjdG9yCi1fVUlfTEFCRUxfQ01fR1JQX05PREVfSU5TRVJUX0VMRU1FTlQ9SW5zZXJ0IEVsZW1lbnQKLV9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfR1JQPUFkZCBHcm91cAotX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0FERF9DSElMRD1BZGQgQ2hpbGQgRWxlbWVudAotCi0hIENNTm9kZQotX1VJX0xBQkVMX0NNX05PREVfTUlYX0NPTlRFTlQ9TWl4ZWQgQ29udGVudAotX1VJX0xBQkVMX0NNX05PREVfQ0hJTERfQ09OVEVOVD1DaGlsZHJlbiBDb250ZW50Ci1fVUlfTEFCRUxfQ01fTk9ERV9TRVRfTUlYX0NPTlRFTlQ9U2V0IE1peGVkIENvbnRlbnQKLV9VSV9MQUJFTF9DTV9OT0RFX1NFVF9DSElMRF9DT05URU5UPVNldCBDaGlsZHJlbiBDb250ZW50Ci0KLSEhIE5PVEUgVE8gVFJBTlNMQVRPUiAtIFVTQUdFOiAiU2V0IDx2YXJpYWJsZSBjb250ZW50PiBDb250ZW50IgotX1VJX0xBQkVMX0NNX05PREVfU0VUPVNldAotX1VJX0xBQkVMX0NNX05PREVfQ09OVEVOVD1Db250ZW50Ci0KLSEhIE5PVEUgVE8gVFJBTlNMQVRPUiAtIERPIE5PVCBUUkFOU0xBVEUgRk9MTE9XSU5HIDMgTElORVMKLV9VSV9MQUJFTF9DTV9OT0RFX1BDREFUQT0oI1BDREFUQSkKLV9VSV9MQUJFTF9DTV9OT0RFX0FOWT1BTlkKLV9VSV9MQUJFTF9DTV9OT0RFX0VNUFRZPUVNUFRZCi0KLSEgQ01SZXBlYXRhYmxlTm9kZQotX1VJX0xBQkVMX0NNX1JFUF9OT0RFX0NIR19PQ0NVUj1DaGFuZ2UgT2NjdXJyZW5jZQotCi0hIENvbW1lbnQKLV9VSV9MQUJFTF9DT01NRU5UX0NIRz1Db21tZW50IENoYW5nZQotCi0hIERUREZpbGUKLV9VSV9MQUJFTF9EVERfRklMRV9BRERfRUxFTUVOVD1BZGQgRWxlbWVudAotX1VJX0xBQkVMX0RURF9GSUxFX0FERF9FTlRJVFk9QWRkIEVudGl0eQotX1VJX0xBQkVMX0RURF9GSUxFX0FERF9DT01NRU5UPUFkZCBDb21tZW50Ci1fVUlfTEFCRUxfRFREX0ZJTEVfQUREX1BBUk1fRU5USVRZX1JFRj1BZGQgUGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2UKLV9VSV9MQUJFTF9EVERfRklMRV9BRERfTk9UQVRJT049QWRkIE5vdGF0aW9uCi1fVUlfTEFCRUxfRFREX0ZJTEVfQUREX0FUVFJfTElTVD1BZGQgQXR0cmlidXRlIExpc3QKLV9VSV9MQUJFTF9EVERfRklMRV9ERUxFVEU9RGVsZXRlCi0KLSEgRFRETm9kZQotX1VJX0xBQkVMX0RURF9OT0RFX05BTUVfQ0hHPU5hbWUgQ2hhbmdlCi1fVUlfTEFCRUxfRFREX05PREVfREVMRVRFPURlbGV0ZQotCi0hIEVsZW1lbnQKLV9VSV9MQUJFTF9FTEVNRU5UX0FERF9BVFRSPUFkZCBBdHRyaWJ1dGUKLV9VSV9MQUJFTF9FTEVNRU5UX0FERF9HUlA9QWRkIEdyb3VwCi1fVUlfTEFCRUxfRUxFTUVOVF9BRERfQ0hJTEQ9QWRkIENoaWxkIEVsZW1lbnQKLQotISBFbnRpdHkKLV9VSV9MQUJFTF9FTlRJVFlfU0VUX1BBUk1fRU5USVRZPVNldCBQYXJhbWV0ZXIgRW50aXR5Ci1fVUlfTEFCRUxfRU5USVRZX1NFVF9HRU5FUkFMX0VOVElUWT1TZXQgR2VuZXJhbCBFbnRpdHkKLV9VSV9MQUJFTF9FTlRJVFlfU0VUX0VYVF9FTlRJVFk9U2V0IEV4dGVybmFsIEVudGl0eQotX1VJX0xBQkVMX0VOVElUWV9TRVRfSU5UX0VOVElUWT1TZXQgSW50ZXJuYWwgRW50aXR5Ci1fVUlfTEFCRUxfRU5USVRZX1ZBTFVFX0NIRz1FbnRpdHkgVmFsdWUgQ2hhbmdlCi0KLSEhIE5PVEUgVE8gVFJBTlNMQVRPUiAtIFVTQUdFOiAiTkRBVEEgQ2hhbmdlIgotX1VJX0xBQkVMX0VOVElUWV9OREFUQV9DSEFOR0U9Q2hhbmdlCi0KLSEgRXh0ZXJuYWxOb2RlCi1fVUlfTEFCRUxfRVhUX05PREVfUFVCTElDX0lEX0NIRz1QdWJsaWMgSUQgQ2hhbmdlCi1fVUlfTEFCRUxfRVhUX05PREVfU1lTVEVNX0lEX0NIRz1TeXN0ZW0gSUQgQ2hhbmdlCi0KLSEgTm9kZUxpc3QKLV9VSV9MQUJFTF9OT0RFX0xJU1RfRUxFTUVOVFM9RWxlbWVudHMKLV9VSV9MQUJFTF9OT0RFX0xJU1RfRU5USVRJRVM9RW50aXRpZXMKLV9VSV9MQUJFTF9OT0RFX0xJU1RfTk9UQVRJT05TPU5vdGF0aW9ucwotX1VJX0xBQkVMX05PREVfTElTVF9DT01NRU5UUz1Db21tZW50cwotX1VJX0xBQkVMX05PREVfTElTVF9PVEhFUj1PdGhlcgotX1VJX0xBQkVMX05PREVfTElTVF9BVFRSSUJVVEVTPUF0dHJpYnV0ZXMKLQotISBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UKLV9VSV9MQUJFTF9QQVJNX0VOVElUWV9SRUZfQ0hHX0VOVElUWV9SRUY9Q2hhbmdlIEVudGl0eSBSZWZlcmVuY2UKLV9VSV9MQUJFTF9QQVJNX0VOVElUWV9SRUZfQ09NTUVOVF9DSEc9Q29tbWVudCBDaGFuZ2UKLQotISBUb3BMZXZlbE5vZGUKLV9VSV9MQUJFTF9UT1BfTEVWRUxfTk9ERV9ERUxFVEU9RGVsZXRlCi0KLV9FUlJPUl9JTkNMX0ZJTEVfTE9BRF9GQUlMVVJFICAgICAgID0gRmFpbGVkIHRvIGxvYWQgaW5jbHVkZWQgZmlsZQotCi0hIHVzYWdlOiBfRVJST1JfVU5ERUNMQVJFRF9FTEVNRU5UXzEgICsgPGVsZW1lbnROYW1lPiArIF9QQVJURVJST1JfVU5ERUNMQVJFRF9FTEVNRU5UXzIKLV9FUlJPUl9VTkRFQ0xBUkVEX0VMRU1FTlRfMSAgICAgICAgID0gUmVmZXJlbmNlIHRvIHVuZGVjbGFyZWQgZWxlbWVudCAnCi1fVUlfRVJST1JQQVJUX1VOREVDTEFSRURfRUxFTUVOVF8yICA9JyBpbiBjb250ZW50IG1vZGVsLgotCi0hIHVzYWdlOiBfRVJST1JfRFVQX0lEX0FUVFJJQlVURV8xICArIDxhdHRyaWJ1dGVOYW1lPiArIF9QQVJURVJST1JfRFVQX0lEX0FUVFJJQlVURV8yCi1fRVJST1JfRFVQX0lEX0FUVFJJQlVURV8xICAgICAgICAgPSBEdXBsaWNhdGUgSUQgYXR0cmlidXRlICcKLV9VSV9FUlJPUlBBUlRfRFVQX0lEX0FUVFJJQlVURV8yICA9ICcuIE9ubHkgb25lIElEIGF0dHJpYnV0ZSBjYW4gYmUgc3BlY2lmaWVkIHBlciBFTEVNRU5UIHR5cGUuCi0KLSEgdXNhZ2U6X0VSUk9SX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzEgKyA8dHlwZVN0cmluZz4gKyBfUEFSVEVSUk9SX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzIgKyA8YXR0cmlidXRlTmFtZT4KLV9FUlJPUl9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8xICAgICAgICAgPSBJbnZhbGlkIGRlZmF1bHQKLV9VSV9FUlJPUlBBUlRfSU5WQUxJRF9ERUZBVUxUX0FUVFJfVkFMVUVfMiAgPSAgdmFsdWUgZm9yIGF0dHJpYnV0ZSAnCi0KLV9FWENfT1BFUkFUSU9OX05PVF9TVVBQT1JURUQgID0gT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFRERmlsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNWQxZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBIYWppbWUgS2F0YXlhbWEgIC0gYnVnIDI0NTIxNiAtIGNvcnJlY3Rpb24gdG8gZ2V0IHRoZSBiZXN0IG5vZGUgd2hlbiB0aGUgZW5kaW5nCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgc3RhcnRpbmcgb2Zmc2V0cyBhcmUgZXF1YWwsIGFuZCB0aGV5IGJvdGgKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW4gdGhlIG9mZnNldCByYW5nZS4KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudC5JRFRERmlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudC5Ob2Rlc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWwuRFRERXh0ZXJuYWxSZWZlcmVuY2VSZW1vdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLkRURE1vZGVsVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5EVEROb3RhdGlvblJlZmVyZW5jZVJlbW92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi1wdWJsaWMgY2xhc3MgRFRERmlsZSBpbXBsZW1lbnRzIEluZGV4ZWRSZWdpb24gewotCXByaXZhdGUgTm9kZUxpc3QgYXR0bGlzdExpc3QgPSBuZXcgTm9kZUxpc3QodGhpcywgRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpOwotCXByaXZhdGUgTm9kZUxpc3QgY29tbWVudExpc3QgPSBuZXcgTm9kZUxpc3QodGhpcywgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCk7Ci0KLQlib29sZWFuIGNyZWF0aW5nTmV3TW9kZWwgPSBmYWxzZTsKLQlwcml2YXRlIERURE1vZGVsSW1wbCBmRFRETW9kZWw7Ci0KLQlwcml2YXRlIE5vZGVMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHKTsKLQlwcml2YXRlIE5vZGVMaXN0IGVudGl0eUxpc3QgPSBuZXcgTm9kZUxpc3QodGhpcywgRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRyk7Ci0KLQlwcml2YXRlIExpc3QgZm9sZGVyTGlzdCA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNNb3ZpbmdOb2RlID0gZmFsc2U7Ci0KLQlwcml2YXRlIExpc3QgbW9kZWxMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIExpc3Qgbm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBOb2RlTGlzdCBub3RhdGlvbkxpc3QgPSBuZXcgTm9kZUxpc3QodGhpcywgRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKTsKLQlwcml2YXRlIE5vZGVMaXN0IHVucmVjb2duaXplZExpc3QgPSBuZXcgTm9kZUxpc3QodGhpcywgRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsKLQotCXB1YmxpYyBEVERGaWxlKERURE1vZGVsSW1wbCBkdGRNb2RlbCkgewotCQl0aGlzLmZEVERNb2RlbCA9IGR0ZE1vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERUREZpbGVMaXN0ZW5lcihJRFRERmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCW1vZGVsTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9kZShEVEROb2RlIG5vZGUpIHsKLQkJYWRkTm9kZShub2RlTGlzdC5zaXplKCksIG5vZGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE5vZGUoaW50IGluZGV4LCBEVEROb2RlIG5vZGUpIHsKLQkJbm9kZUxpc3QuYWRkKGluZGV4LCBub2RlKTsKLQkJLyoKLQkJICogaWYgKGluZGV4IDwgbm9kZUxpc3Quc2l6ZSgpKSB7IGluc2VydEJlZm9yZShub2RlLCAoRFRETm9kZSkKLQkJICogbm9kZUxpc3QuZ2V0KGluZGV4KSk7IH0gZWxzZSB7IGFwcGVuZENoaWxkKG5vZGUpOyB9Ci0JCSAqLwotCX0KLQotCXB1YmxpYyBEVEROb2RlIGJ1aWxkTm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCS8vIElUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlEVEROb2RlIG5vZGUgPSBudWxsOwotCQlpZiAoaXNFbGVtZW50KGZsYXROb2RlKSkgewotCQkJLy8gdGhlbiB0aGlzIGlzIGFuIGVsZW1lbnQKLQkJCW5vZGUgPSBuZXcgRWxlbWVudCh0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNFbnRpdHkoZmxhdE5vZGUpKSB7Ci0JCQlub2RlID0gbmV3IEVudGl0eSh0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNOb3RhdGlvbihmbGF0Tm9kZSkpIHsKLQkJCW5vZGUgPSBuZXcgTm90YXRpb24odGhpcywgZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKGlzQXR0cmlidXRlTGlzdChmbGF0Tm9kZSkpIHsKLQkJCW5vZGUgPSBuZXcgQXR0cmlidXRlTGlzdCh0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNDb21tZW50KGZsYXROb2RlKSkgewotCQkJbm9kZSA9IG5ldyBDb21tZW50KHRoaXMsIGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChpc1BhcmFtZXRlckVudGl0eVJlZmVyZW5jZShmbGF0Tm9kZSkpIHsKLQkJCW5vZGUgPSBuZXcgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHRoaXMsIGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmICghZmxhdE5vZGUuZ2V0VGV4dCgpLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCW5vZGUgPSBuZXcgVW5yZWNvZ25pemVkKHRoaXMsIGZsYXROb2RlKTsKLQkJfQotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpbnNlcnROb2RlKG5vZGUpOwotCQkJbm9kZS5yZXNvbHZlUmVnaW9ucygpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIGJ1aWxkTm9kZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbGlzdCkgewotCQlOb2Rlc0V2ZW50IGFkZGVkRFRETm9kZXMgPSBuZXcgTm9kZXNFdmVudCgpOwotCi0JCVRvcExldmVsTm9kZSBwcmV2aW91c05vZGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGxpc3QuaXRlbShpKTsKLQkJCVRvcExldmVsTm9kZSBub2RlID0gKFRvcExldmVsTm9kZSkgYnVpbGROb2RlKGZsYXROb2RlKTsKLQkJCS8vIGlmIHdlIGRvbid0IGNyZWF0ZSBhIG5vZGUsIHRoZW4gd2UgYXNzdW1lIHRoYXQgdGhlIGZsYXQKLQkJCS8vIG5vZGUgd2FzIHdoaXRlc3BhY2UuIFRhY2sgaXQgb24gdG8gYSBwcmV2aW91cyB0b3BsZXZlbAotCQkJLy8gbm9kZQotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCXByZXZpb3VzTm9kZSA9IG5vZGU7Ci0JCQkJYWRkZWREVEROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAocHJldmlvdXNOb2RlICE9IG51bGwpIHsKLQkJCQkJcHJldmlvdXNOb2RlLmFkZFdoaXRlc3BhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChhZGRlZERURE5vZGVzLmdldE5vZGVzKCkuc2l6ZSgpID4gMCkvLyAmJgotCQkvLyBjcmVhdGluZ05ld01vZGVsID09IGZhbHNlKQotCQl7Ci0JCQkvLyBub3cgdGVsbCBwZW9wbGUgYWJvdXQgdGhlIGFkZGl0aW9ucwotCQkJbm90aWZ5Tm9kZXNBZGRlZChhZGRlZERURE5vZGVzKTsKLQkJfQotCX0KLQotCS8vIEltcGxlbWVudHMgSW5kZXhlZFJlZ2lvbgotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHRlc3RQb3NpdGlvbikgewotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSA8PSB0ZXN0UG9zaXRpb24gJiYgdGVzdFBvc2l0aW9uIDw9IGdldEVuZE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUF0dHJpYnV0ZUxpc3QoRFRETm9kZSBub2RlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCWdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9EVERfRklMRV9BRERfQVRUUl9MSVNUKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3U3RyZWFtID0gIjwhQVRUTElTVCAiICsgbmFtZSArICI+XG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW50IG9mZnNldCA9IGdldEluc2VydE9mZnNldChub2RlLCBpc0FmdGVyKTsKLQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCAwLCBuZXdTdHJlYW0pOwotCQlnZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb21tZW50KERURE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlnZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX0ZJTEVfQUREX0NPTU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBuZXdTdHJlYW0gPSAiPCEtLSAiICsgbmFtZSArICIgLS0+XG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW50IG9mZnNldCA9IGdldEluc2VydE9mZnNldChub2RlLCBpc0FmdGVyKTsKLQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCAwLCBuZXdTdHJlYW0pOwotCQlnZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVFbGVtZW50KERURE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlnZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX0ZJTEVfQUREX0VMRU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBuZXdTdHJlYW0gPSAiPCFFTEVNRU5UICIgKyBuYW1lICsgIiBFTVBUWT5cbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIGlzQWZ0ZXIpOwotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIG5ld1N0cmVhbSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUVudGl0eShEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0FERF9FTlRJVFkpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBuZXdTdHJlYW0gPSAiPCFFTlRJVFkgIiArIG5hbWUgKyAiIFwiXCI+XG4iOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIGlzQWZ0ZXIpOwotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIG5ld1N0cmVhbSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZU5vdGF0aW9uKERURE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlnZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX0ZJTEVfQUREX05PVEFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3U3RyZWFtID0gIjwhTk9UQVRJT04gIiArIG5hbWUgKyAiIFNZU1RFTSBcIlwiPlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWludCBvZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQobm9kZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgMCwgbmV3U3RyZWFtKTsKLQkJZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKERURE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlnZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX0ZJTEVfQUREX1BBUk1fRU5USVRZX1JFRik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5ld1N0cmVhbSA9IG5hbWUgKyAiXG4iOyAvLyROT04tTkxTLTEkCi0JCWludCBvZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQobm9kZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgMCwgbmV3U3RyZWFtKTsKLQkJZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlTm9kZShEVEROb2RlIG5vZGUpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0RFTEVURSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVsZXRlTm9kZSh0aGlzLCBub2RlKTsKLQkJZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlTm9kZShPYmplY3QgcmVxdWVzdG9yLCBEVEROb2RlIG5vZGUpIHsKLQkJRFRETm9kZSBwYXJlbnQgPSAoRFRETm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRlbGV0ZShyZXF1ZXN0b3IsIG5vZGUpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCFpc01vdmluZ05vZGUpIHsKLQkJCQlEVERNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IG5ldyBEVERNb2RlbFVwZGF0ZXIoKTsKLQkJCQl1cGRhdGVyLm9iamVjdEFib3V0VG9CZURlbGV0ZWQocmVxdWVzdG9yLCBub2RlKTsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgewotCQkJCQlFbnRpdHkgcmVmZXJlbmNlZEVudGl0eSA9ICgoUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBub2RlKS5nZXRFbnRpdHlPYmplY3QoKTsKLQkJCQkJaWYgKHJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbCkgewotCQkJCQkJLy8gcmVtb3ZlIHJlZmVyZW5jZXMgdG8gYWxsIGVsZW1lbnRzIGFuZCBwYXJtIGVudGl0aWVzCi0JCQkJCQkvLyBjb250YWluZWQgaW4gb3VyIGN1cnJlbnQgbW9kZWwKLQkJCQkJCURUREV4dGVybmFsUmVmZXJlbmNlUmVtb3ZlciByZW1vdmVyID0gbmV3IERUREV4dGVybmFsUmVmZXJlbmNlUmVtb3ZlcigpOwotCQkJCQkJcmVtb3Zlci5leHRlcm5hbFJlZmVyZW5jZUFib3V0VG9DaGFuZ2UocmVxdWVzdG9yLCByZWZlcmVuY2VkRW50aXR5KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgTm90YXRpb24pIHsKLQkJCQkJTm90YXRpb24gbm90YXRpb24gPSAoKE5vdGF0aW9uKSBub2RlKTsKLQkJCQkJRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyIHJlbW92ZXIgPSBuZXcgRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyKCk7Ci0JCQkJCXJlbW92ZXIubm90YXRpb25BYm91dFRvQmVEZWxldGVkKHJlcXVlc3Rvciwgbm90YXRpb24pOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gbm8gcGFyZW50PyB0aGVuIGRlbGV0ZSB1cCB1bnRpbCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgbm9kZQotCQkJLy8gaWYgaXQgaXMgYSB0b3AgbGV2ZWwgbm9kZQotCQkJaW50IHN0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGVuZE9mZnNldCA9IG5vZGUuZ2V0V2hpdGVzcGFjZUVuZE9mZnNldCgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUb3BMZXZlbE5vZGUpIHsKLQkJCQllbmRPZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQobm9kZSwgdHJ1ZSk7Ci0JCQl9Ci0JCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0Q29tbWVudHMoKSB7Ci0JCXJldHVybiBjb21tZW50TGlzdDsKLQl9Ci0KLQlwdWJsaWMgRFRETW9kZWxJbXBsIGdldERURE1vZGVsKCkgewotCQlyZXR1cm4gZkRURE1vZGVsOwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0FuZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBlbGVtZW50TGlzdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSByZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpbnQgc3RhcnQgPSBnZXRTdGFydE9mZnNldCgpOwotCQlpZiAoc3RhcnQgPj0gMCkgewotCQkJaW50IGVuZCA9IGdldEVuZE9mZnNldCgpOwotCQkJaWYgKGVuZCA+PSAwKSB7Ci0JCQkJcmVzdWx0ID0gZW5kIC0gc3RhcnQ7Ci0JCQkJaWYgKHJlc3VsdCA8IC0xKSB7Ci0JCQkJCXJlc3VsdCA9IC0xOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRFbnRpdGllcygpIHsKLQkJcmV0dXJuIGVudGl0eUxpc3Q7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkRUREZJTEVJQ09OKTsKLQl9Ci0KLQotCi0JcHVibGljIGludCBnZXRJbnNlcnRPZmZzZXQoRFRETm9kZSBub2RlLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChpc0FmdGVyKSB7Ci0JCQkJLy8gdGhlbiBnZXQgdGhlIG5leHQgbm9kZSBhbmQgdXNlIGl0J3Mgc3RhcnQgb2Zmc2V0Ci0JCQkJaW50IGluZGV4ID0gZ2V0Tm9kZXMoKS5pbmRleE9mKGdldE5vZGUobm9kZS5nZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSkpOwotCi0JCQkJRFRETm9kZSBhZnRlck5vZGUgPSBudWxsOwotCQkJCWlmIChpbmRleCArIDEgPCBnZXROb2RlcygpLnNpemUoKSkgewotCQkJCQlhZnRlck5vZGUgPSAoRFRETm9kZSkgZ2V0Tm9kZXMoKS5nZXQoaW5kZXggKyAxKTsKLQkJCQl9Ci0JCQkJaWYgKGFmdGVyTm9kZSAhPSBudWxsKSB7Ci0JCQkJCW9mZnNldCA9IGFmdGVyTm9kZS5nZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gYWRkIHRvIGVuZAotCQkJCQlpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCQkJCW9mZnNldCA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCW9mZnNldCA9IG5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIGFkZCB0byBlbmQKLQkJCWlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJCW9mZnNldCA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb2Zmc2V0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGggcGF0aCA9IG5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aChnZXREVERNb2RlbCgpLmdldElkKCkudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBwYXRoLmxhc3RTZWdtZW50KCk7Ci0JfQotCi0JcHVibGljIERURE5vZGUgZ2V0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBub2RlTGlzdC5nZXQoaSk7Ci0JCQlpZiAobm9kZS5nZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSA9PSBmbGF0Tm9kZSkgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJbmRleGVkUmVnaW9uIGdldE5vZGVBdChpbnQgb2Zmc2V0KSB7Ci0JCURURE5vZGUgbm9kZSA9IGdldFRvcExldmVsTm9kZUF0KG9mZnNldCk7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXJldHVybiBub2RlLmdldERlZXBlc3ROb2RlKG9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEluZGV4ZWRSZWdpb24gZ2V0Tm9kZUF0KGludCBzdGFydE9mZnNldCwgaW50IGVuZE9mZnNldCkgewotCQlEVEROb2RlIG5vZGUgPSBnZXRUb3BMZXZlbE5vZGVBdChzdGFydE9mZnNldCk7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXJldHVybiBub2RlLmdldERlZXBlc3ROb2RlKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5vZGVMaXN0cygpIHsKLQkJaWYgKGZvbGRlckxpc3QgPT0gbnVsbCkgewotCQkJZm9sZGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvbGRlckxpc3QuYWRkKG5vdGF0aW9uTGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChlbnRpdHlMaXN0KTsKLQkJCWZvbGRlckxpc3QuYWRkKGVsZW1lbnRMaXN0KTsKLQkJCWZvbGRlckxpc3QuYWRkKGF0dGxpc3RMaXN0KTsKLQkJCWZvbGRlckxpc3QuYWRkKGNvbW1lbnRMaXN0KTsKLQkJCWZvbGRlckxpc3QuYWRkKHVucmVjb2duaXplZExpc3QpOwotCQl9Ci0JCXJldHVybiBmb2xkZXJMaXN0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5vZGVzKCkgewotCQlyZXR1cm4gbm9kZUxpc3Q7Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldE5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG5vdGF0aW9uTGlzdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSByZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEVERNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgRFRETm9kZSBnZXRUb3BMZXZlbE5vZGVBdChpbnQgb2Zmc2V0KSB7Ci0JCURURE5vZGUgYmVzdE5vZGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgbm9kZUxpc3QuZ2V0KGkpOwotCQkJaWYgKG5vZGUuY29udGFpbnMob2Zmc2V0KSkgewotCQkJCWlmKGJlc3ROb2RlID09IG51bGwpIHsKLQkJCQkJYmVzdE5vZGUgPSBub2RlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmKG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA+IGJlc3ROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJCWJlc3ROb2RlID0gbm9kZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYmVzdE5vZGU7Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldFVucmVjb2duaXplZCgpIHsKLQkJcmV0dXJuIHVucmVjb2duaXplZExpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0SW50b01vZGVsKE9iamVjdCByZXF1ZXN0b3IsIERURE5vZGUgcmVmZXJlbmNlLCBEVEROb2RlIG5vZGUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlTdHJpbmcgbm9kZVRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRvcExldmVsTm9kZSkgewotCQkJbm9kZVRleHQgPSAoKFRvcExldmVsTm9kZSkgbm9kZSkuZ2V0RnVsbFRleHQoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGVUZXh0ID0gbm9kZS5nZXROb2RlVGV4dCgpOwotCQl9Ci0JCWludCBvZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQocmVmZXJlbmNlLCBpc0FmdGVyKTsKLQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQocmVxdWVzdG9yLCBvZmZzZXQsIDAsIG5vZGVUZXh0KTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGluc2VydE5vZGUoRFRETm9kZSBub2RlKSB7Ci0JCWludCBzdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGluc2VydEluZGV4ID0gLTE7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic3RhcnRvZmZzZXQgPSAiICsgc3RhcnRPZmZzZXQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldE5vZGVzKCkuc2l6ZSgpOyBpKyspIHsKLQkJCURURE5vZGUgY3VycmVudE5vZGUgPSAoRFRETm9kZSkgZ2V0Tm9kZXMoKS5nZXQoaSk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImN1cnJlbnROb2RlIGVuZE9mZnNldCA9ICIKLQkJCS8vICtjdXJyZW50Tm9kZS5nZXRFbmRPZmZzZXQoKSk7Ci0KLQkJCWlmIChjdXJyZW50Tm9kZS5nZXRFbmRPZmZzZXQoKSA+IHN0YXJ0T2Zmc2V0KSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJlbmRvZmZzZXQgIiArCi0JCQkJLy8gY3VycmVudE5vZGUuZ2V0RW5kT2Zmc2V0KCkgKyAiID4gIiArIHN0YXJ0T2Zmc2V0KTsKLQkJCQlpbnNlcnRJbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluc2VydEluZGV4ID09IC0xKSB7Ci0JCQlpbnNlcnRJbmRleCA9IGdldE5vZGVzKCkuc2l6ZSgpOwotCQl9Ci0KLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImluc2VydCBpbmRleCA9ICIgKyBpbnNlcnRJbmRleCk7Ci0KLQkJYWRkTm9kZShpbnNlcnRJbmRleCwgbm9kZSk7Ci0JfQotCi0JLy8gaXQgaXMgYXNzdW1lZCB0aGF0IGZsYXRub2RlIGNvbnRhaW5zIGF0IGxlYXN0IDMgcmVnaW9ucwotCXB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlTGlzdChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25zKCkuc2l6ZSgpID49IDMpIHsKLQkJCUlUZXh0UmVnaW9uIHNlY29uZCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQlJVGV4dFJlZ2lvbiB0aGlyZCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMik7Ci0JCQlpZiAoc2Vjb25kLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRVhDTEFNQVRJT04pICYmIHRoaXJkLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vIGl0IGlzIGFzc3VtZWQgdGhhdCBmbGF0bm9kZSBjb250YWlucyBhdCBsZWFzdCAzIHJlZ2lvbnMKLQlwdWJsaWMgYm9vbGVhbiBpc0NvbW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKSA+PSAyKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vIGl0IGlzIGFzc3VtZWQgdGhhdCBmbGF0bm9kZSBjb250YWlucyBhdCBsZWFzdCAzIHJlZ2lvbnMKLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKSA+PSAzKSB7Ci0JCQlJVGV4dFJlZ2lvbiBzZWNvbmQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJSVRleHRSZWdpb24gdGhpcmQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDIpOwotCQkJaWYgKHNlY29uZC5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKSAmJiB0aGlyZC5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNFbnRpdHkoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKSA+PSAzKSB7Ci0JCQlJVGV4dFJlZ2lvbiBzZWNvbmQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJSVRleHRSZWdpb24gdGhpcmQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDIpOwotCQkJaWYgKHNlY29uZC5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKSAmJiB0aGlyZC5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vIGl0IGlzIGFzc3VtZWQgdGhhdCBmbGF0bm9kZSBjb250YWlucyBhdCBsZWFzdCAzIHJlZ2lvbnMKLQlwdWJsaWMgYm9vbGVhbiBpc05vdGF0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCkgPj0gMykgewotCQkJSVRleHRSZWdpb24gc2Vjb25kID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCUlUZXh0UmVnaW9uIHRoaXJkID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgyKTsKLQkJCWlmIChzZWNvbmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTikgJiYgdGhpcmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vIGl0IGlzIGFzc3VtZWQgdGhhdCBmbGF0bm9kZSBjb250YWlucyBhdCBsZWFzdCAzIHJlZ2lvbnMKLQlwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlckVudGl0eVJlZmVyZW5jZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25zKCkuc2l6ZSgpID09IDEpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRU5USVRZX1BBUk0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCWJvb2xlYW4gaXNTYW1lVG9wTGV2ZWxUeXBlKERURE5vZGUgYWZmZWN0ZWROb2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBhZmZlY3RlZE5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCk7Ci0JCS8vIHJldHVybiB0cnVlIGlmIHRoZSBmbGF0bm9kZSBzdGlsbCBtYXRjaGVzIHdoYXQgdGhlIGFmZmVjdGVkTm9kZQotCQkvLyBpcyByZXByZXNlbnRpbmcKLQkJaWYgKGFmZmVjdGVkTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgaXNFbGVtZW50KGZsYXROb2RlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGFmZmVjdGVkTm9kZSBpbnN0YW5jZW9mIEVudGl0eSAmJiBpc0VudGl0eShmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhZmZlY3RlZE5vZGUgaW5zdGFuY2VvZiBDb21tZW50ICYmIGlzQ29tbWVudChmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhZmZlY3RlZE5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0ICYmIGlzQXR0cmlidXRlTGlzdChmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhZmZlY3RlZE5vZGUgaW5zdGFuY2VvZiBOb3RhdGlvbiAmJiBpc05vdGF0aW9uKGZsYXROb2RlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGFmZmVjdGVkTm9kZSBpbnN0YW5jZW9mIFVucmVjb2duaXplZCAmJiBpc1VucmVjb2duaXplZChmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1VucmVjb2duaXplZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXJldHVybiAhaXNFbGVtZW50KGZsYXROb2RlKSAmJiAhaXNFbnRpdHkoZmxhdE5vZGUpICYmICFpc05vdGF0aW9uKGZsYXROb2RlKSAmJiAhaXNQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoZmxhdE5vZGUpICYmICFpc0F0dHJpYnV0ZUxpc3QoZmxhdE5vZGUpICYmICFpc0NvbW1lbnQoZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVOb2RlKE9iamVjdCByZXF1ZXN0b3IsIERURE5vZGUgcmVmZXJlbmNlTm9kZSwgRFRETm9kZSBub2RlVG9Nb3ZlLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJaXNNb3ZpbmdOb2RlID0gdHJ1ZTsKLQotCQlkZWxldGVOb2RlKHJlcXVlc3Rvciwgbm9kZVRvTW92ZSk7Ci0JCWluc2VydEludG9Nb2RlbChyZXF1ZXN0b3IsIHJlZmVyZW5jZU5vZGUsIG5vZGVUb01vdmUsIGlzQWZ0ZXIpOwotCQlpc01vdmluZ05vZGUgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWNyZWF0aW5nTmV3TW9kZWwgPSB0cnVlOwotCQlub2RlTGlzdC5jbGVhcigpOwotCQlOb2Rlc0V2ZW50IHJlbW92ZUV2ZW50ID0gbmV3IE5vZGVzRXZlbnQoKTsKLQkJcmVtb3ZlRXZlbnQuZ2V0Tm9kZXMoKS5hZGRBbGwobm9kZUxpc3QpOwotCQlub3RpZnlOb2Rlc1JlbW92ZWQocmVtb3ZlRXZlbnQpOwotCQkvKiByZW1vdmVDaGlsZE5vZGVzKCk7ICovCi0KLQkJaWYgKGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpICE9IG51bGwgJiYgZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uTGlzdCgpICE9IG51bGwpIHsKLQkJCWJ1aWxkTm9kZXMoZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uTGlzdCgpKTsKLQkJfQotCQljcmVhdGluZ05ld01vZGVsID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGROb2RlcyA9IGV2ZW50LmdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJTm9kZXNFdmVudCByZW1vdmVkRFRETm9kZXMgPSBuZXcgTm9kZXNFdmVudCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBvbGROb2Rlcy5pdGVtKGkpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobm9kZS5nZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSA9PSBmbGF0Tm9kZSkgewotCQkJCQlyZW1vdmVkRFRETm9kZXMuYWRkKG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWJ1aWxkTm9kZXMoZXZlbnQuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpKTsKLQotCQlpZiAocmVtb3ZlZERURE5vZGVzLmdldE5vZGVzKCkuc2l6ZSgpID4gMCkgewotCQkJbm90aWZ5Tm9kZXNSZW1vdmVkKHJlbW92ZWREVEROb2Rlcyk7Ci0JCQlyZW1vdmVOb2RlcyhyZW1vdmVkRFRETm9kZXMuZ2V0Tm9kZXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlOb2RlQ2hhbmdlZChEVEROb2RlIG5vZGUpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG1vZGVsTGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSURUREZpbGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJRFRERmlsZUxpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCWxpc3RlbmVyLm5vZGVDaGFuZ2VkKG5vZGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Tm9kZXNBZGRlZChOb2Rlc0V2ZW50IGFkZGVkTm9kZXMpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG1vZGVsTGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSURUREZpbGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJRFRERmlsZUxpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCWxpc3RlbmVyLm5vZGVzQWRkZWQoYWRkZWROb2Rlcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlOb2Rlc1JlbW92ZWQoTm9kZXNFdmVudCBldmVudCkgewotCQlJdGVyYXRvciBpdGVyID0gbW9kZWxMaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJRFRERmlsZUxpc3RlbmVyIGxpc3RlbmVyID0gKElEVERGaWxlTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJbGlzdGVuZXIubm9kZXNSZW1vdmVkKGV2ZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlYnVpbGROb2RlcyhMaXN0IG5vZGVzKSB7Ci0JCS8vIHJlbW92ZSB0aGUgb2xkIG5vZGVzCi0JCXJlbW92ZU5vZGVzKG5vZGVzKTsKLQotCQkvLyBub3cgcmVidWlsZCB0aGVtCi0JCU5vZGVzRXZlbnQgYWRkZWREVEROb2RlcyA9IG5ldyBOb2Rlc0V2ZW50KCk7Ci0JCUl0ZXJhdG9yIGR0ZE5vZGVzID0gbm9kZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGR0ZE5vZGVzLmhhc05leHQoKSkgewotCQkJRFRETm9kZSBkdGROb2RlID0gKERURE5vZGUpIGR0ZE5vZGVzLm5leHQoKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigicmVidWlsZGluZyAiICsKLQkJCS8vIGR0ZE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpKTsKLQotCQkJRFRETm9kZSBub2RlID0gYnVpbGROb2RlKGR0ZE5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCWFkZGVkRFRETm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCWlmIChhZGRlZERURE5vZGVzLmdldE5vZGVzKCkuc2l6ZSgpID4gMCkgewotCQkJLy8gbm93IHRlbGwgcGVvcGxlIGFib3V0IHRoZSBhZGRpdGlvbnMKLQkJCW5vdGlmeU5vZGVzQWRkZWQoYWRkZWREVEROb2Rlcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlJVGV4dFJlZ2lvbiBjaGFuZ2VkUmVnaW9uID0gZXZlbnQuZ2V0UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJRFRETm9kZSBhZmZlY3RlZE5vZGUgPSAoRFRETm9kZSkgZ2V0Tm9kZUF0KGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KGNoYW5nZWRSZWdpb24pLCBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoY2hhbmdlZFJlZ2lvbikpOwotCQlpZiAoYWZmZWN0ZWROb2RlICE9IG51bGwpIHsKLQkJCS8vIG5vIG5lZWQgdG8gcmVzb2x2ZSByZWdpb25zIGFzIGl0IGlzIGp1c3QgYSBjaGFuZ2UKLQkJCS8vIGFmZmVjdGVkTm9kZS5yZXNvbHZlUmVnaW9ucygpOwotCQkJbm90aWZ5Tm9kZUNoYW5nZWQoYWZmZWN0ZWROb2RlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlMaXN0IG5vZGVzVG9SZWJ1aWxkID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCURURE5vZGUgYWZmZWN0ZWROb2RlID0gZ2V0Tm9kZShmbGF0Tm9kZSk7Ci0KLQkJaWYgKCFpc1NhbWVUb3BMZXZlbFR5cGUoYWZmZWN0ZWROb2RlKSkgewotCQkJLy8gQnVnIDExMTEwMCAtIEZpcmUgb2ZmIGEgbm9kZSByZW1vdmFsIGV2ZW50Ci0JCQkvLyB0byByZW1vdmUgdGhlIG5vZGUgZnJvbSB0aGUgdHJlZSB2aWV3ZXIKLQkJCU5vZGVzRXZlbnQgcmVtb3ZlZERURE5vZGVzID0gbmV3IE5vZGVzRXZlbnQoKTsKLQkJCXJlbW92ZWREVEROb2Rlcy5hZGQoYWZmZWN0ZWROb2RlKTsKLQkJCW5vdGlmeU5vZGVzUmVtb3ZlZChyZW1vdmVkRFRETm9kZXMpOwotCQkJbm9kZXNUb1JlYnVpbGQuYWRkKGFmZmVjdGVkTm9kZSk7Ci0JCQlyZWJ1aWxkTm9kZXMobm9kZXNUb1JlYnVpbGQpOwotCQl9Ci0JCWVsc2UgewotCQkJYWZmZWN0ZWROb2RlLnJlc29sdmVSZWdpb25zKCk7Ci0JCQlub3RpZnlOb2RlQ2hhbmdlZChhZmZlY3RlZE5vZGUpOwotCQkJLy8gbm93IHRyeSBhbmQgZGV0ZXJtaW5lIHdoaWNoIG9uZXMgd2VyZSBhZGRlZAotCQkJTm9kZXNFdmVudCBhZGRlZERURE5vZGVzID0gbmV3IE5vZGVzRXZlbnQoKTsKLQkJCUlUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zID0gZXZlbnQuZ2V0TmV3UmVnaW9ucygpOwotCQkJaW50IHNpemUgPSBuZXdSZWdpb25zLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gbmV3UmVnaW9ucy5nZXQoaSk7Ci0JCQkJRFRETm9kZSBkZWVwZXN0Tm9kZSA9IGFmZmVjdGVkTm9kZS5nZXREZWVwZXN0Tm9kZShmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pLCBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKSk7Ci0JCQkJLy8gQnVnIDExMTEwMCAtIFdlIGRvIG5vdCBuZWVkIHRvIGZpcmUgYSBub2RlIGFkZGVkIGV2ZW50Ci0JCQkJLy8gZm9yIHRoZSBhZmZlY3RlZE5vZGUgYmVjYXVzZSB0aGF0IGlzIGFscmVhZHkgaGFuZGxlZCBieQotCQkJCS8vIHRoZSBub2RlIGNoYW5nZWQgZXZlbnQgYWJvdmUKLQkJCQlpZiAoZGVlcGVzdE5vZGUgIT0gYWZmZWN0ZWROb2RlICYmICFhZGRlZERURE5vZGVzLmdldE5vZGVzKCkuY29udGFpbnMoZGVlcGVzdE5vZGUpKSB7Ci0JCQkJCWFkZGVkRFRETm9kZXMuYWRkKGRlZXBlc3ROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWRkZWREVEROb2Rlcy5nZXROb2RlcygpLnNpemUoKSA+IDApIHsKLQkJCQlub3RpZnlOb2Rlc0FkZGVkKGFkZGVkRFRETm9kZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRFRERmlsZUxpc3RlbmVyKElEVERGaWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbW9kZWxMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb2RlcyhMaXN0IG5vZGVzKSB7Ci0JCWdldE5vZGVzKCkucmVtb3ZlQWxsKG5vZGVzKTsKLQkJLyoKLQkJICogZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5zaXplKCk7IGkrKykgewotCQkgKiByZW1vdmVDaGlsZCgoRFRETm9kZSlub2Rlcy5nZXQoaSkpOyB9IC8vIGVuZCBvZiBmb3IgKCkKLQkJICovCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVEROb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhNWM3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5UZXh0UmVnaW9uTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50Lk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRFRETm9kZSBleHRlbmRzIE5vZGVDb250YWluZXIgaW1wbGVtZW50cyBJbmRleGVkUmVnaW9uIHsKLQotCS8vIHRoZXNlIGFyZSBjaGFyYWN0ZXJvZmZzZXRzCi0JcHJvdGVjdGVkIERUREZpbGUgZHRkRmlsZTsKLQotCS8vIGZsYXQgbm9kZSB0aGF0IGNvbnRhaW5zIHRoaXMgbm9kZQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCi0JcHJvdGVjdGVkIFRleHRSZWdpb25MaXN0SW1wbCByZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCi0JcHJvdGVjdGVkIFRleHRSZWdpb25MaXN0SW1wbCB3aGl0ZXNwYWNlID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCi0JcHVibGljIERURE5vZGUoRFRERmlsZSBkdGRGaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JCXRoaXMuZmxhdE5vZGUgPSBmbGF0Tm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWdpb24oSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8qCi0JCSAqIGlmIChzdGFydFJlZ2lvbiA9PSBudWxsKSB7IHN0YXJ0UmVnaW9uID0gcmVnaW9uOyB9IGVuZFJlZ2lvbiA9Ci0JCSAqIHJlZ2lvbjsKLQkJICovCi0JCXJlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkV2hpdGVzcGFjZVJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJd2hpdGVzcGFjZS5hZGQocmVnaW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbGFiZWwpIHsKLQkJZ2V0RFRERmlsZSgpLmdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcocmVxdWVzdG9yLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcGVzdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgdGVzdFBvc2l0aW9uKSB7Ci0JCXJldHVybiBjb250YWluc1JhbmdlKHRlc3RQb3NpdGlvbiwgdGVzdFBvc2l0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1JhbmdlKGludCBzdGFydCwgaW50IGVuZCkgewotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSA8PSBzdGFydCAmJiBlbmQgPD0gZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlKERURE5vZGUgY2hpbGQpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9EVERfTk9ERV9ERUxFVEUpOyAvLyROT04tTkxTLTEkCi0JCWRlbGV0ZSh0aGlzLCBjaGlsZCk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGUoT2JqZWN0IHJlcXVlc3RvciwgRFRETm9kZSBjaGlsZCkgewotCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGNoaWxkLmdldFN0YXJ0T2Zmc2V0KCksIGNoaWxkLmdldEZ1bGxOb2RlTGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdG9yKSB7Ci0JCWdldERUREZpbGUoKS5nZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyhyZXF1ZXN0b3IpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuTGlzdCgpLnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbkxpc3QoKSB7Ci0JCU5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yICg7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQotCXB1YmxpYyBEVEROb2RlIGdldERlZXBlc3ROb2RlKGludCBvZmZzZXQpIHsKLQkJaWYgKGNvbnRhaW5zKG9mZnNldCkpIHsKLQkJCS8vIG5vdyBzZWUgaWYgYSBjaGlsZCBjb250YWlucyB0aGlzIG9mZnNldAotCQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCURURE5vZGUgY2hpbGQgPSAoRFRETm9kZSkgY2hpbGRyZW5baV07Ci0JCQkJRFRETm9kZSBkZWVwZXN0ID0gY2hpbGQuZ2V0RGVlcGVzdE5vZGUob2Zmc2V0KTsKLQkJCQlpZiAoZGVlcGVzdCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkZWVwZXN0OwotCQkJCX0KLQkJCX0gLy8gZW5kIG9mIGZvciAoKQotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERURE5vZGUgZ2V0RGVlcGVzdE5vZGUoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWlmIChjb250YWluc1JhbmdlKHN0YXJ0LCBlbmQpKSB7Ci0JCQkvLyBub3cgc2VlIGlmIGEgY2hpbGQgY29udGFpbnMgdGhpcyBvZmZzZXQKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlEVEROb2RlIGNoaWxkID0gKERURE5vZGUpIGNoaWxkcmVuW2ldOwotCQkJCURURE5vZGUgZGVlcGVzdCA9IGNoaWxkLmdldERlZXBlc3ROb2RlKHN0YXJ0LCBlbmQpOwotCQkJCWlmIChkZWVwZXN0ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGRlZXBlc3Q7Ci0JCQkJfQotCQkJfSAvLyBlbmQgb2YgZm9yICgpCi0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRFRERmlsZSBnZXREVERGaWxlKCkgewotCQlyZXR1cm4gZHRkRmlsZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChnZXRFbmRSZWdpb24oKSk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldEVuZFJlZ2lvbigpIHsKLQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ly8gZW5kUmVnaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBGYWN0b3J5UmVnaXN0cnkgZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlEVERNb2RlbEltcGwgbW9kZWwgPSBkdGRGaWxlLmdldERURE1vZGVsKCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlGYWN0b3J5UmVnaXN0cnkgcmVnID0gbW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCQlpZiAocmVnICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlZzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEZ1bGxOb2RlTGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0V2hpdGVzcGFjZUVuZE9mZnNldCgpIC0gZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxOb2RlVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXROb2RlVGV4dCgpOwotCQlpZiAod2hpdGVzcGFjZS5zaXplKCkgPiAwKSB7Ci0JCQlSZWdpb25JdGVyYXRvciBpdGVyID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKHdoaXRlc3BhY2UpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJdGV4dCArPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JYWJzdHJhY3QgcHVibGljIEltYWdlIGdldEltYWdlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChyZWdpb24pOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCkgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk5BTUUpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIHJldHVybiB0aGUgZmlyc3QgdG9rZW4gY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIHRva2VuIHR5cGUKLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TmV4dFJlZ2lvbihSZWdpb25JdGVyYXRvciBpdGVyLCBTdHJpbmcgdHlwZSkgewotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE5vZGVMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRFbmRPZmZzZXQoKSAtIGdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVUZXh0KCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlzYi5hcHBlbmQoZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChyZWdpb24pKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoZ2V0U3RhcnRSZWdpb24oKSk7Ci0JfQotCi0JLy8gcHJpdmF0ZSBSZWdpb24gc3RhcnRSZWdpb24sZW5kUmVnaW9uOwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRTdGFydFJlZ2lvbigpIHsKLQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KDApOwotCQkvLyByZXR1cm4gc3RhcnRSZWdpb247Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBmbGF0Tm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGZsYXROb2RlLgotCSAqIAotCSAqIElTU1VFOm5hbWVkIGNoYW5nZWQgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkCi0JICogc3VwZXIgY2xhc3MgbWV0aG9kLCBidXQgc2hvdWxkIHJlLXRoaW5rIGlmIHRoaXMgaXMgY29ycmVjdCB0ZWNobmlxdWUuCi0JICogUGVyaGFwcyBnZXRGaXJzdFJlZ2lvbj8KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBmbGF0Tm9kZTsKLQl9Ci0KLQkvLyByZXR1cm4gZW5kIG9mZnNldCBpbmNsdWRpbmcgd2hpdGVzcGFjZQotCS8vIG9yIGp1c3QgdGhlIGVuZCBvZmZzZXQgaWYgdGhlcmUgaXMgbm8gd2hpdGVzcGFjZQotCXB1YmxpYyBpbnQgZ2V0V2hpdGVzcGFjZUVuZE9mZnNldCgpIHsKLQkJaWYgKHdoaXRlc3BhY2Uuc2l6ZSgpID4gMCkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gd2hpdGVzcGFjZS5nZXQod2hpdGVzcGFjZS5zaXplKCkgLSAxKTsKLQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJfQotCi0JCXJldHVybiBnZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNUcmFpbGluZ1doaXRlc3BhY2UoKSB7Ci0JCXJldHVybiB3aGl0ZXNwYWNlLnNpemUoKSA+IDA7Ci0JfQotCi0JcHVibGljIFJlZ2lvbkl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZSByZWdpb24gaXRlciAiICsgdGhpcy5nZXRDbGFzcygpICsgIiB3aXRoCi0JCS8vIHN0YXJ0ICwgZW5kID0gIiArIGdldFN0YXJ0T2Zmc2V0KCkgKyAiLCAiICtnZXRFbmRPZmZzZXQoKSk7Ci0JCXJldHVybiBuZXcgUmVnaW9uSXRlcmF0b3IocmVnaW9ucyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RvciwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgbmV3VGV4dCkgewotCQlnZXREVERGaWxlKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydCwgbGVuZ3RoLCBuZXdUZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvbHZlUmVnaW9ucygpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBuYW1lKSB7Ci0JCWlmICghZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJCWlmIChuYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCQkvLyBuYW1lVG9rZW4udXBkYXRlVGV4dChuYW1lKTsKLQkJCQlnZXREVERGaWxlKCkuZ2V0RFRETW9kZWwoKS5nZXRSZWZlcmVuY2VVcGRhdGVyKCkubmFtZUFib3V0VG9DaGFuZ2UocmVxdWVzdG9yLCB0aGlzLCBuYW1lKTsKLQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pLCBuYW1lUmVnaW9uLmdldExlbmd0aCgpLCBuYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9EVERfTk9ERV9OQU1FX0NIRyk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0TmFtZSh0aGlzLCBuYW1lKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgZmxhdE5vZGUuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBmbGF0Tm9kZS4gSVNTVUU6bmFtZWQgY2hhbmdlZCBub3QgdG8gYmUKLQkgKiAgICAgICAgICAgIGNvbmZ1c2VkIHdpdGggZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIHN1cGVyIGNsYXNzIG1ldGhvZCwKLQkgKiAgICAgICAgICAgIGJ1dCBzaG91bGQgcmUtdGhpbmsgaWYgdGhpcyBpcyBjb3JyZWN0IHRlY2huaXF1ZQotCSAqLwotCXZvaWQgc2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdikgewotCQl0aGlzLmZsYXROb2RlID0gdjsKLQl9Ci0KLQkvLyBza2lwcyBwYXN0IG5leHQgbmFtZSB0b2tlbiBpbiB0aGUgaXRlcmF0b3IKLQlwcm90ZWN0ZWQgdm9pZCBza2lwUGFzdE5hbWUoUmVnaW9uSXRlcmF0b3IgaXRlcikgewotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5OQU1FKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhqYXZhLmxhbmcuU3RyaW5nIGZlYXR1cmUsIGphdmEubGFuZy5TdHJpbmcgdmVyc2lvbikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURFJlc291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURFJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNmRiOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIERURFJlc291cmNlIHsKLQkvLyBFbnVtZXJhdGlvbiBDb25zdGFudHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTllJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvYW55LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVMSVNUSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZV9saXN0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5USUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2NvbW1lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRERklMRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9EVERGaWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5USUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2VsZW1lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRSRUZJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9yZWYuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2VtcHR5Y29udGVudC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZUkVGRVJFTkNFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2VudGl0eV9yZWZlcmVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfQVRUTElTVCA9ICJpY29ucy9mdWxsL29iajE2L2ZvbGRlcl9hdHRsaXN0X29iai5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxEUl9DT01NID0gImljb25zL2Z1bGwvb2JqMTYvZm9sZGVyX2NvbW1lbnRzX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTERSX0VMID0gImljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxEUl9FTlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VudC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxEUl9OT1QgPSAiaWNvbnMvZnVsbC9vYmoxNi9mbGRyX25vdC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxEUl9VTlJFQyA9ICJpY29ucy9mdWxsL29iajE2L2ZsZHJfdW5yZWMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXSFRNTEZPUk0gPSAiaWNvbnMvZnVsbC9vYmoxNi9nZW5odG1mb3JtX3dpei5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05JQ09OID0gImljb25zL2Z1bGwvb2JqMTYvbm90YXRpb24uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FQ0hPSUNFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29uZWNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb25lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVPUk1PUkVDSE9JQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3JlY2hvaWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVPUk1PUkVJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3JlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVPUk1PUkVTRVFVRU5DRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVzZXF1ZW5jZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVTRVFVRU5DRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vbmVzZXF1ZW5jZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OQUxDSE9JQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWxjaG9pY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTkFMSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29wdGlvbmFsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05BTFNFUVVFTkNFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29wdGlvbmFsc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBDREFUQUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi90eHRleHQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOUkVDT0dOSVpFRElDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi91bnJlY29nbml6ZWRfY29udGVudC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVST09STU9SRUNIT0lDRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlY2hvaWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaRVJPT1JNT1JFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpFUk9PUk1PUkVTRVFVRU5DRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3Jlc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MxMDMyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIEVsZW1lbnQgZXh0ZW5kcyBOYW1lZFRvcExldmVsTm9kZSB7Ci0KLQlMaXN0IGF0dExpc3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JTGlzdCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIENNTm9kZSBmQ29udGVudE1vZGVsOwotCi0JcHVibGljIEVsZW1lbnQoRFRERmlsZSBkdGRGaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGR0ZEZpbGUsIGZsYXROb2RlLCBEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRUxFTUVOVF9BRERfQVRUUik7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCBhdHRMaXN0cyA9IGdldEF0dHJpYnV0ZUxpc3RzKCk7Ci0JCWlmIChhdHRMaXN0cy5zaXplKCkgPT0gMCkgewotCQkJZ2V0RFRERmlsZSgpLmNyZWF0ZUF0dHJpYnV0ZUxpc3QodGhpcywgZ2V0TmFtZSgpLCB0cnVlKTsKLQkJCWF0dExpc3RzID0gZ2V0QXR0cmlidXRlTGlzdHMoKTsKLQkJfQotCQlpZiAoYXR0TGlzdHMuc2l6ZSgpID4gMCkgewotCQkJQXR0cmlidXRlTGlzdCBhdHRMaXN0ID0gKEF0dHJpYnV0ZUxpc3QpIGF0dExpc3RzLmdldChhdHRMaXN0cy5zaXplKCkgLSAxKTsKLQkJCWF0dExpc3QuYWRkQXR0cmlidXRlKG5hbWUpOwotCQl9Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZCgpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9FTEVNRU5UX0FERF9DSElMRCk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkQ29udGVudCh0aGlzLCAiIEVNUFRZIik7IC8vJE5PTi1OTFMtMSQKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRlbnQoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIGNvbnRlbnQpIHsKLQkJSVRleHRSZWdpb24gd2hpdGVzcGFjZSA9IGdldFdoaXRlc3BhY2VBZnRlck5hbWUoKTsKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJaW50IGxlbmd0aCA9IDA7Ci0JCWlmICh3aGl0ZXNwYWNlICE9IG51bGwpIHsKLQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQod2hpdGVzcGFjZSk7Ci0JCQlsZW5ndGggPSB3aGl0ZXNwYWNlLmdldExlbmd0aCgpID49IDIgPyAxIDogMDsKLQkJfQotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmFtZVJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJVGV4dFJlZ2lvbiBlbGVtZW50VGFnID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyk7Ci0JCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoZWxlbWVudFRhZyk7Ci0JCQl9Ci0JCX0KLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgbGVuZ3RoLCBjb250ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRHcm91cCgpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9FTEVNRU5UX0FERF9HUlApOyAvLyROT04tTkxTLTEkCi0JCWFkZENvbnRlbnQodGhpcywgIiAoKSIpOyAvLyROT04tTkxTLTEkCi0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCXJldHVybiBuZXcgRWxlbWVudChkdGRGaWxlLCBmbGF0Tm9kZSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QXR0cmlidXRlTGlzdHMoKSB7Ci0JCWF0dExpc3RMaXN0LmNsZWFyKCk7Ci0JCVN0cmluZyBlbGVtZW50TmFtZSA9IGdldE5hbWUoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGR0ZEZpbGUuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCAmJiBub2RlLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudE5hbWUpKSB7Ci0JCQkJYXR0TGlzdExpc3QuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRMaXN0TGlzdDsKLQl9Ci0KLQotCi0JcHVibGljIENNTm9kZSBnZXRDb250ZW50TW9kZWwoKSB7Ci0JCS8vIE9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKQotCQlyZXR1cm4gKENNTm9kZSkgZ2V0Rmlyc3RDaGlsZCgpOy8vIGNvbnRlbnRNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRFbGVtZW50QXR0cmlidXRlcygpIHsKLQkJYXR0cmlidXRlcy5jbGVhcigpOwotCQlJdGVyYXRvciBhdHRMaXN0cyA9IGdldEF0dHJpYnV0ZUxpc3RzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGF0dExpc3RzLmhhc05leHQoKSkgewotCQkJQXR0cmlidXRlTGlzdCBhdHRMaXN0ID0gKEF0dHJpYnV0ZUxpc3QpIGF0dExpc3RzLm5leHQoKTsKLQotCQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhdHRMaXN0LmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXR0cmlidXRlcy5hZGQoY2hpbGRyZW5baV0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5FTEVNRU5USUNPTik7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gTm9kZS5FTEVNRU5UX05PREU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVwbGFjZUNvbnRlbnRNb2RlbChPYmplY3QgcmVxdWVzdG9yLCBDTU5vZGUgbm9kZSkgewotCQlyZXBsYWNlQ29udGVudE1vZGVsKHJlcXVlc3Rvciwgbm9kZS5nZXROb2RlVGV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXBsYWNlQ29udGVudE1vZGVsKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBub2RlVGV4dCkgewotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaW50IGxlbmd0aCA9IDA7Ci0JCUNNTm9kZSBjb250ZW50TW9kZWwgPSBnZXRDb250ZW50TW9kZWwoKTsKLQkJaWYgKGNvbnRlbnRNb2RlbCAhPSBudWxsKSB7Ci0JCQlvZmZzZXQgPSBjb250ZW50TW9kZWwuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IGNvbnRlbnRNb2RlbC5nZXRXaGl0ZXNwYWNlRW5kT2Zmc2V0KCkgLSBvZmZzZXQ7Ci0JCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIG9mZnNldCwgbGVuZ3RoLCBub2RlVGV4dCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhZGRDb250ZW50KHJlcXVlc3Rvciwgbm9kZVRleHQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJlZ2lvbnMoKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZWxlbWVudCBub2RlIHN0cmVhbSA9ICIgKwotCQkvLyB0b2tlblN0cmVhbS5nZXRTdHJpbmcoKSk7Ci0JCWZDb250ZW50TW9kZWwgPSBudWxsOwotCQlyZW1vdmVDaGlsZE5vZGVzKCk7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCi0JCWlmIChnZXROYW1lUmVnaW9uKCkgIT0gbnVsbCkgewotCQkJLy8gd2Ugc2tpcCBwYXN0IHRoZSBuYW1lIHRva2VuIGlzIG91ciBuYW1lCi0JCQlza2lwUGFzdE5hbWUoaXRlcik7Ci0JCX0KLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQotCQkJaWYgKGZDb250ZW50TW9kZWwgPT0gbnVsbCkgewotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTkFNRSkpIHsKLQkJCQkJZkNvbnRlbnRNb2RlbCA9IG5ldyBDTUJhc2ljTm9kZShnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKSkgewotCQkJCQlmQ29udGVudE1vZGVsID0gbmV3IENNQmFzaWNOb2RlKGdldERUREZpbGUoKSwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTikpIHsKLQkJCQkJZkNvbnRlbnRNb2RlbCA9IG5ldyBDTUdyb3VwTm9kZShnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChmQ29udGVudE1vZGVsICE9IG51bGwpIHsKLQkJCQlpZiAoIWN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FTkRfVEFHKSkgewotCQkJCQkvLyBjb250ZW50IG1vZGVsIGdldHMgYWxsIHJlZ2lvbnMgZXhjZXB0IGZvciB0aGUgJz4nCi0JCQkJCWZDb250ZW50TW9kZWwuYWRkUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gaWYgaXQgaXMgZXF1YWwgdG8gdGhlIGVuZCB0YWcsIHRoZW4gZG9uJ3QgYWRkIGFueW1vcmUKLQkJCQkJLy8gcmVnaW9ucwotCQkJCQkvLyBmb3IgdGhlIGNvbnRlbnQgbW9kZWwKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQl9Ci0KLQkJfQotCQlpZiAoZkNvbnRlbnRNb2RlbCAhPSBudWxsKSB7Ci0JCQlhcHBlbmRDaGlsZChmQ29udGVudE1vZGVsKTsKLQkJCS8vIHRoaXMgaXMgdGhlIHJvb3QgZWxlbWVudCBjb250ZW50IHNvIHNldCBpdCB0cnVlCi0JCQlmQ29udGVudE1vZGVsLnNldFJvb3RFbGVtZW50Q29udGVudCh0cnVlKTsKLQkJCS8vIG5vdyB0ZWxsIHRoZSBjb250ZW50IG1vZGVsIHRvIHJlc29sdmUgaXQncyByZWdpb25zCi0JCQlmQ29udGVudE1vZGVsLnJlc29sdmVSZWdpb25zKCk7Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRNb2RlbChDTU5vZGUgY29udGVudE1vZGVsKSB7Ci0JCXRoaXMuZkNvbnRlbnRNb2RlbCA9IGNvbnRlbnRNb2RlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0VudGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmN2MzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0VudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8vIGV4dGVybmFsIG5vZGUgY29udGFpbnMgY29kZSB0byBoZWxwIHNldCBhbmQgZ2V0IHB1YmxpYyBpZHMKLXB1YmxpYyBjbGFzcyBFbnRpdHkgZXh0ZW5kcyBFeHRlcm5hbE5vZGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNldEV4dGVybmFsRW50aXR5ID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9FTlRJVFlfU0VUX0VYVF9FTlRJVFk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2V0R2VuZXJhbEVudGl0eSA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1NFVF9HRU5FUkFMX0VOVElUWTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzZXRJbnRlcm5hbEVudGl0eSA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1NFVF9JTlRfRU5USVRZOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2V0UGFyYW1ldGVyRW50aXR5ID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9FTlRJVFlfU0VUX1BBUk1fRU5USVRZOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRW50aXR5KERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRyk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkVOVElUWUlDT04pOwotCX0KLQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBub3RhdGlvbk5hbWUuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBub3RhdGlvbk5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb3RhdGlvbk5hbWUoKSB7Ci0JCUlUZXh0UmVnaW9uIG5kYXRhUmVnaW9uID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5OREFUQV9WQUxVRSk7Ci0JCWlmIChuZGF0YVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChuZGF0YVJlZ2lvbik7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFBlcmNlbnRSZWdpb24oKSB7Ci0JCXJldHVybiBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLlBFUkNFTlQpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlpZiAoIWlzRXh0ZXJuYWxFbnRpdHkoKSkgewotCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyYXRvcigpKTsKLQkJCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldFZhbHVlRnJvbVF1b3RlZFJlZ2lvbih2YWx1ZVJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBleHRlcm5hbEVudGl0eS4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGV4dGVybmFsRW50aXR5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWxFbnRpdHkoKSB7Ci0JCXJldHVybiBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpICE9IG51bGwgfHwgZ2V0U3lzdGVtS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgaXNQYXJhbWV0ZXJFbnRpdHkuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBpc1BhcmFtZXRlckVudGl0eS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlckVudGl0eSgpIHsKLQkJcmV0dXJuIGdldFBlcmNlbnRSZWdpb24oKSAhPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVORGF0YShPYmplY3QgcmVxdWVzdG9yKSB7Ci0JCUlUZXh0UmVnaW9uIG5kYXRhUmVnaW9uID0gbnVsbDsKLQotCQkvLyBzZWUgaWYgd2UgaGF2ZSBhbiBOREFUQSBrZXl3b3JkCi0JCW5kYXRhUmVnaW9uID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5OREFUQV9LRVlXT1JEKTsKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gMCwgZW5kT2Zmc2V0ID0gMDsKLQkJaWYgKG5kYXRhUmVnaW9uICE9IG51bGwpIHsKLQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQobmRhdGFSZWdpb24pOwotCQkJZW5kT2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5kYXRhUmVnaW9uKTsKLQkJfQotCQlJVGV4dFJlZ2lvbiB2YWx1ZSA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKHN0YXJ0T2Zmc2V0ID09IDApIHsKLQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHZhbHVlKTsKLQkJCX0KLQkJCWVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCh2YWx1ZSk7Ci0JCX0KLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgZXh0ZXJuYWxFbnRpdHkuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBleHRlcm5hbEVudGl0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbEVudGl0eShib29sZWFuIGlzRXh0ZXJuYWxFbnRpdHkpIHsKLQkJaWYgKGlzRXh0ZXJuYWxFbnRpdHkoKSAhPSBpc0V4dGVybmFsRW50aXR5KSB7Ci0JCQkvLyBleHRlcm5hbEVudGl0eSA9IHY7Ci0JCQliZWdpblJlY29yZGluZyh0aGlzLCBpc0V4dGVybmFsRW50aXR5ID8gc2V0RXh0ZXJuYWxFbnRpdHkgOiBzZXRJbnRlcm5hbEVudGl0eSk7Ci0JCQlpZiAoaXNFeHRlcm5hbEVudGl0eSkgewotCQkJCS8vIHdlIG5lZWQgdG8gZ2V0IHJpZCBvZiB0aGUgdmFsdWUgbGl0ZXJhbAotCQkJCUlUZXh0UmVnaW9uIHF1b3RlID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCk7Ci0JCQkJaWYgKHF1b3RlID09IG51bGwpIHsKLQkJCQkJcXVvdGUgPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKTsKLQkJCQl9Ci0JCQkJaWYgKHF1b3RlICE9IG51bGwpIHsKLQkJCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocXVvdGUpLCBxdW90ZS5nZXRMZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXNldFN5c3RlbUlEKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gd2UgbmVlZCB0byBnZXQgcmlkIG9mIHRleHQgYmV0d2VlbiBlbmQgb2YgbmFtZSByZWdpb24gYW5kCi0JCQkJLy8gdGhlIGxhc3QgZG91YmxlIHF1b3RlZCBsaXRlcmFsCi0JCQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQkJSVRleHRSZWdpb24ga2V5d29yZCA9IGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcik7Ci0JCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQlpbnQgbGVuZ3RoID0gMDsKLQkJCQlpZiAoa2V5d29yZCA9PSBudWxsKSB7Ci0JCQkJCS8vIHJlc2V0IHRoZSBpdGVyYXRvcgotCQkJCQlpdGVyID0gaXRlcmF0b3IoKTsKLQkJCQkJa2V5d29yZCA9IGdldFB1YmxpY0tleXdvcmRSZWdpb24oaXRlcik7Ci0JCQkJfQotCQkJCWlmIChrZXl3b3JkICE9IG51bGwpIHsKLQkJCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChrZXl3b3JkKTsKLQkJCQkJLy8gc3RhcnQgd2l0aCBhIGxlbmd0aCBqdXN0IGVxdWFsIHRvIHRoZSBrZXl3b3JkIGZvciBub3cKLQkJCQkJbGVuZ3RoID0ga2V5d29yZC5nZXRMZW5ndGgoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHJlc2V0IHRoZSBpdGVyYXRvciBzaW5jZSB3ZSBkaWRuJ3QgZmluZCB0aGUga2V5d29yZAotCQkJCQlpdGVyID0gaXRlcmF0b3IoKTsKLQkJCQkJLy8ganVzdCBnbyBmcm9tIGFmdGVyIHRoZSBuYW1lCi0JCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGdldE5hbWVSZWdpb24oKSk7Ci0JCQkJfQotCi0JCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSB0aGUgc3RhcnQsIGxvb2sgZm9yIHRoZSBlbmQKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gbnVsbDsKLQotCQkJCWlmIChsYXN0UmVnaW9uID09IG51bGwpIHsKLQkJCQkJLy8gdGhlbiBsb29rIGZvciBsYXN0IHF1b3RlZCBsaXRlcmFsCi0JCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJSVRleHRSZWdpb24gbGl0ZXJhbCA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXIpOwotCQkJCQkJaWYgKGxpdGVyYWwgIT0gbnVsbCkgewotCQkJCQkJCWxhc3RSZWdpb24gPSBsaXRlcmFsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGxhc3RSZWdpb24gIT0gbnVsbCkgewotCQkJCQlsZW5ndGggPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobGFzdFJlZ2lvbikgLSBzdGFydE9mZnNldDsKLQkJCQl9Ci0JCQkJcmVwbGFjZVRleHQodGhpcywgc3RhcnRPZmZzZXQsIGxlbmd0aCwgIlwiXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlbW92ZU5EYXRhKHRoaXMpOwotCQkJfQotCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm90YXRpb25OYW1lKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBuZXdOb3RhdGlvbikgewotCQlpZiAoIWdldE5vdGF0aW9uTmFtZSgpLmVxdWFscyhuZXdOb3RhdGlvbikpIHsKLQkJCWlmICghbmV3Tm90YXRpb24uZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gCi0JCQkJSVRleHRSZWdpb24gbmRhdGFSZWdpb24gPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFKTsKLQkJCQlpZiAobmRhdGFSZWdpb24gIT0gbnVsbCkgewotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KG5kYXRhUmVnaW9uKSwgbmRhdGFSZWdpb24uZ2V0TGVuZ3RoKCksIG5ld05vdGF0aW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRpbWUgdG8gY3JlYXRlIG9uZQotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJCQlTdHJpbmcgc3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQkJCUlUZXh0UmVnaW9uIG5kYXRhS2V5d29yZCA9IGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuTkRBVEFfS0VZV09SRCk7Ci0JCQkJCWlmIChuZGF0YUtleXdvcmQgPT0gbnVsbCkgewotCQkJCQkJLy8gd2UnbGwgbmVlZCB0byBjcmVhdGUgb25lIGFmdGVyIHRoZSBsYXN0IHF1b3RlZAotCQkJCQkJLy8gbGl0ZXJhbAotCQkJCQkJLy8gUmVzZXQgaXRlcmF0b3IKLQkJCQkJCXN0cmluZyArPSAiIE5EQVRBICI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCQkJSVRleHRSZWdpb24gbGFzdFF1b3RlZExpdGVyYWwgPSBudWxsOwotCQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJSVRleHRSZWdpb24gbGl0ZXJhbCA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXIpOwotCQkJCQkJCWlmIChsaXRlcmFsICE9IG51bGwpIHsKLQkJCQkJCQkJbGFzdFF1b3RlZExpdGVyYWwgPSBsaXRlcmFsOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChsYXN0UXVvdGVkTGl0ZXJhbCAhPSBudWxsKSB7Ci0JCQkJCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobGFzdFF1b3RlZExpdGVyYWwpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gY3JlYXRlZCBhZnRlciB0aGUgc3lzdGVtIG9yIHB1YmxpYyBrZXl3b3JkCi0JCQkJCQkJSVRleHRSZWdpb24ga2V5d29yZCA9IGdldFB1YmxpY0tleXdvcmRSZWdpb24oaXRlcmF0b3IoKSk7Ci0JCQkJCQkJaWYgKGtleXdvcmQgPT0gbnVsbCkgewotCQkJCQkJCQlrZXl3b3JkID0gZ2V0U3lzdGVtS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gd2Ugc2hvdWxkbid0IGJlIG51bGwgaGVyZSBzaW5jZSB3ZSBjaGVjayBpZiB3ZQotCQkJCQkJCS8vIHdlcmUgZXh0ZXJuYWwgYWxyZWFkeQotCQkJCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGtleXdvcmQpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuZGF0YUtleXdvcmQpOwotCQkJCQl9Ci0JCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIDAsIHN0cmluZyArIG5ld05vdGF0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBuZWVkIHRvIHJlbW92ZSB0aGUgbmRhdGEgc3R1ZmYKLQkJCQlyZW1vdmVORGF0YShyZXF1ZXN0b3IpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBub3RhdGlvbk5hbWUuCi0JICogCi0JICogQHBhcmFtIG5ld05vdGF0aW9uCi0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gbm90YXRpb25OYW1lLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGF0aW9uTmFtZShTdHJpbmcgbmV3Tm90YXRpb24pIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgIk5EQVRBICIgKyBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9OREFUQV9DSEFOR0UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2V0Tm90YXRpb25OYW1lKHRoaXMsIG5ld05vdGF0aW9uKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgaXNQYXJhbWV0ZXJFbnRpdHkuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBpc1BhcmFtZXRlckVudGl0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJFbnRpdHkoYm9vbGVhbiB2KSB7Ci0JCWlmIChpc1BhcmFtZXRlckVudGl0eSgpICE9IHYpIHsKLQkJCWJlZ2luUmVjb3JkaW5nKHRoaXMsIHYgPyBzZXRQYXJhbWV0ZXJFbnRpdHkgOiBzZXRHZW5lcmFsRW50aXR5KTsKLQkJCWlmICh2KSB7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQkJSVRleHRSZWdpb24gc3RhcnRUYWcgPSBnZXROZXh0UmVnaW9uKGl0ZXIsIERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpOwotCQkJCWludCBzdGFydE9mZnNldCA9IDAsIGxlbmd0aCA9IDA7Ci0KLQkJCQlpZiAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSAmJiByZWdpb24uZ2V0TGVuZ3RoKCkgPiAxKSB7Ci0JCQkJCQlsZW5ndGggPSAxOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChzdGFydFRhZyk7Ci0JCQkJfQotCQkJCXJlcGxhY2VUZXh0KHRoaXMsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgsICIgJSIpOyAvLyROT04tTkxTLTEkCi0JCQkJLy8gbm93IGdldCByaWQgb2YgYW55IE5EYXRhIHNpbmNlIGl0IGlzIG9ubHkgYWxsb3dlZCBpZiB0aGUKLQkJCQkvLyBlbnRpdHkgaXMgYSBnZW5lcmFsIGVudGl0eSBhbmQgbm90IGEgcGFyYW1ldGVyIGVudGl0eQotCQkJCXJlbW92ZU5EYXRhKHRoaXMpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gZ2V0IHJpZCBvZiBwZXJjZW50IHJlZ2lvbgotCQkJCUlUZXh0UmVnaW9uIHBlcmNlbnRSZWdpb24gPSBnZXRQZXJjZW50UmVnaW9uKCk7Ci0JCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocGVyY2VudFJlZ2lvbiksIHBlcmNlbnRSZWdpb24uZ2V0TGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIHYpIHsKLQkJaWYgKCFpc0V4dGVybmFsRW50aXR5KCkpIHsKLQkJCWlmICghZ2V0VmFsdWUoKS5lcXVhbHModikpIHsKLQkJCQkvLyB0aGVuIGl0IG1ha2VzIHNlbnNlIHRvIGNoYW5nZSB0aGUgdmFsdWUKLQkJCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXJhdG9yKCkpOwotCQkJCVN0cmluZyBxdW90ZUNoYXIgPSB2LmluZGV4T2YoIlwiIikgPT0gLTEgPyAiXCIiIDogIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pLCB2YWx1ZVJlZ2lvbi5nZXRMZW5ndGgoKSwgcXVvdGVDaGFyICsgdiArIHF1b3RlQ2hhcik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0TmV4dFJlZ2lvbihpdGVyLCBEVERSZWdpb25UeXBlcy5OQU1FKTsKLQkJCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCQkvLyBjcmVhdGUgaXQgYWZ0ZXIgdGhlIHBlcmNlbnQgaWYgdGhlcmUgaXMgb25lCi0JCQkJCQlyZWdpb24gPSBnZXRQZXJjZW50UmVnaW9uKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCQkvLyBpZiBzdGlsbCBudWxsLCB0aGVuIGNyZWF0ZSBpdCBhZnRlciB0aGUgZWxlbWVudCB0YWcKLQkJCQkJCXJlZ2lvbiA9IGdldFN0YXJ0VGFnKGl0ZXJhdG9yKCkpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgMCwgcXVvdGVDaGFyICsgdiArIHF1b3RlQ2hhcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHYpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9FTlRJVFlfVkFMVUVfQ0hHKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRWYWx1ZSh0aGlzLCB2KTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FeHRlcm5hbE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlM2NlYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FeHRlcm5hbE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8vIGJhc2UgY2xhc3MgZm9yIG5vZGVzIHRoYXQgY2FuIGNvbnRhaW4gZXh0ZXJuYWwgY29udGVudAotcHVibGljIGFic3RyYWN0IGNsYXNzIEV4dGVybmFsTm9kZSBleHRlbmRzIE5hbWVkVG9wTGV2ZWxOb2RlIHsKLQotCVN0cmluZyBwdWJsaWNJRDsKLQotCVN0cmluZyBzeXN0ZW1JRDsKLQotCXB1YmxpYyBFeHRlcm5hbE5vZGUoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBTdHJpbmcgdGFnVHlwZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgdGFnVHlwZSk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5leHRRdW90ZWRMaXRlcmFsKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCkgfHwgcmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHB1YmxpY0lELgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgcHVibGljSUQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJRCgpIHsKLQkJSVRleHRSZWdpb24gcHVibGljVmFsdWUgPSBnZXRQdWJsaWNWYWx1ZVJlZ2lvbigpOwotCQlpZiAocHVibGljVmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFZhbHVlRnJvbVF1b3RlZFJlZ2lvbihwdWJsaWNWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFB1YmxpY0tleXdvcmRSZWdpb24oUmVnaW9uSXRlcmF0b3IgaXRlcikgewotCQlyZXR1cm4gZ2V0TmV4dFJlZ2lvbihpdGVyLCBEVERSZWdpb25UeXBlcy5QVUJMSUNfS0VZV09SRCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFB1YmxpY1ZhbHVlUmVnaW9uKCkgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQotCQlJVGV4dFJlZ2lvbiBwdWJsaWNLZXl3b3JkID0gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyKTsKLQotCQlpZiAocHVibGljS2V5d29yZCAhPSBudWxsICYmIGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBxdW90ZWRMaXRlcmFsID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcik7Ci0JCQlpZiAocXVvdGVkTGl0ZXJhbCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHF1b3RlZExpdGVyYWw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzeXN0ZW1JRC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHN5c3RlbUlELgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSUQoKSB7Ci0JCUlUZXh0UmVnaW9uIHN5c3RlbVZhbHVlID0gZ2V0U3lzdGVtVmFsdWVSZWdpb24oKTsKLQkJaWYgKHN5c3RlbVZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRWYWx1ZUZyb21RdW90ZWRSZWdpb24oc3lzdGVtVmFsdWUpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRTeXN0ZW1LZXl3b3JkUmVnaW9uKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJcmV0dXJuIGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuU1lTVEVNX0tFWVdPUkQpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRTeXN0ZW1WYWx1ZVJlZ2lvbigpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0KLQkJSVRleHRSZWdpb24gc3lzdGVtS2V5d29yZCA9IGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcik7Ci0JCWlmIChzeXN0ZW1LZXl3b3JkICE9IG51bGwgJiYgaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHF1b3RlZExpdGVyYWwgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyKTsKLQkJCWlmIChxdW90ZWRMaXRlcmFsICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcXVvdGVkTGl0ZXJhbDsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIHRyeSBhbmQgc2VlIGlmIHRoZXJlIGlzIGEgc2Vjb25kIHF1b3RlZCBsaXRlcmFsIGFmdGVyIGEgcHVibGljCi0JCQkvLyBrZXl3b3JkCi0JCQlpdGVyID0gaXRlcmF0b3IoKTsKLQkJCUlUZXh0UmVnaW9uIHB1YmxpY0tleXdvcmQgPSBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXIpOwotCi0JCQlpZiAocHVibGljS2V5d29yZCAhPSBudWxsICYmIGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcXVvdGVkTGl0ZXJhbCA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXIpOwotCQkJCWlmIChxdW90ZWRMaXRlcmFsICE9IG51bGwgJiYgaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJLy8gbm93IGdldCB0aGUgc2Vjb25kIHF1b3RlZCBsaXRlcmFsCi0JCQkJCXF1b3RlZExpdGVyYWwgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyKTsKLQkJCQkJaWYgKHF1b3RlZExpdGVyYWwgIT0gbnVsbCkgewotCQkJCQkJLy8gZ290IGl0IQotCQkJCQkJcmV0dXJuIHF1b3RlZExpdGVyYWw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZUZyb21RdW90ZWRSZWdpb24oSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHR5cGUuZXF1YWxzKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKSB8fCB0eXBlLmVxdWFscyhEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCkpIHsKLQkJCVN0cmluZyB0ZXh0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChyZWdpb24pOwotCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkgLSAxKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHB1YmxpY0lELgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gcHVibGljSUQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSUQoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIHYpIHsKLQkJaWYgKCF2LmVxdWFscyhwdWJsaWNJRCkpIHsKLQkJCXB1YmxpY0lEID0gdjsKLQkJCUlUZXh0UmVnaW9uIHB1YmxpY1ZhbHVlID0gZ2V0UHVibGljVmFsdWVSZWdpb24oKTsKLQkJCUlUZXh0UmVnaW9uIHB1YmxpY0tleXdvcmQgPSBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpOwotCQkJSVRleHRSZWdpb24gc3lzdGVtS2V5d29yZCA9IGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcmF0b3IoKSk7Ci0JCQlJVGV4dFJlZ2lvbiBzeXN0ZW1WYWx1ZSA9IGdldFN5c3RlbVZhbHVlUmVnaW9uKCk7Ci0KLQkJCWlmICh2LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwdWJsaWNLZXl3b3JkICE9IG51bGwpIHsKLQkJCQkJLy8gdGltZSB0byBnZXQgcmlkIG9mIHRoZSBwdWJsaWMga2V5d29yZCBhbmQgdmFsdWUKLQkJCQkJLy8gYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgc3lzdGVtIG9uZQotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChwdWJsaWNLZXl3b3JkKTsKLQkJCQkJU3RyaW5nIG5ld1N0cmluZyA9ICJTWVNURU0iOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChzeXN0ZW1WYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCQluZXdTdHJpbmcgKz0gIiBcIlwiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChwdWJsaWNWYWx1ZSkgLSBzdGFydE9mZnNldCwgbmV3U3RyaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBoZXJlIHdlcmUgc2V0dGluZyBhIG5vbiBlbXB0eSB2YWx1ZQotCQkJCVN0cmluZyBxdW90ZUNoYXIgPSB2LmluZGV4T2YoIlwiIikgPT0gLTEgPyAiXCIiIDogIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCWlmIChwdWJsaWNWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocHVibGljVmFsdWUpLCBwdWJsaWNWYWx1ZS5nZXRMZW5ndGgoKSwgcXVvdGVDaGFyICsgcHVibGljSUQgKyBxdW90ZUNoYXIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGltZSB0byBjcmVhdGUgc3R1ZmYKLQkJCQkJaWYgKHB1YmxpY0tleXdvcmQgIT0gbnVsbCkgewotCQkJCQkJLy8gdGhlbiBqdXN0IHB1dCBvdXIgbmV3IHZhbHVlIGFmdGVyIHRoZSBrZXl3b3JkCi0JCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChwdWJsaWNLZXl3b3JkKSwgMCwgIiAiICsgcXVvdGVDaGFyICsgdiArIHF1b3RlQ2hhcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIHdlIG5lZWQgdGhlIHB1YmxpYyBrZXl3b3JkIGFzIHdlbGwKLQkJCQkJCWlmIChzeXN0ZW1LZXl3b3JkICE9IG51bGwpIHsKLQkJCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHN5c3RlbUtleXdvcmQpLCBzeXN0ZW1LZXl3b3JkLmdldExlbmd0aCgpLCAiUFVCTElDICIgKyBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuYW1lUmVnaW9uKSwgMCwgIiBQVUJMSUMgIiArIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgcHVibGljSUQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBwdWJsaWNJRC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNJRChTdHJpbmcgdikgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VYVF9OT0RFX1BVQkxJQ19JRF9DSEcpOyAvLyROT04tTkxTLTEkCi0JCXNldFB1YmxpY0lEKHRoaXMsIHYpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzeXN0ZW1JRC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHN5c3RlbUlELgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlEKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyB2KSB7Ci0JCWlmICghdi5lcXVhbHMoc3lzdGVtSUQpIHx8IChnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpID09IG51bGwgJiYgZ2V0U3lzdGVtS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKSA9PSBudWxsKSkgewotCQkJc3lzdGVtSUQgPSB2OwotCQkJU3RyaW5nIHF1b3RlQ2hhciA9IHYuaW5kZXhPZigiXCIiKSA9PSAtMSA/ICJcIiIgOiAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlJVGV4dFJlZ2lvbiBzeXN0ZW1WYWx1ZSA9IGdldFN5c3RlbVZhbHVlUmVnaW9uKCk7Ci0JCQlpZiAoc3lzdGVtVmFsdWUgIT0gbnVsbCkgewotCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoc3lzdGVtVmFsdWUpLCBzeXN0ZW1WYWx1ZS5nZXRMZW5ndGgoKSwgcXVvdGVDaGFyICsgc3lzdGVtSUQgKyBxdW90ZUNoYXIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSVRleHRSZWdpb24gc3lzdGVtS2V5d29yZCA9IGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcmF0b3IoKSk7Ci0KLQkJCQkvLyB0aW1lIHRvIGNyZWF0ZSBzdHVmZgotCQkJCWlmIChzeXN0ZW1LZXl3b3JkICE9IG51bGwpIHsKLQkJCQkJLy8gdGhlbiBqdXN0IHB1dCBvdXIgbmV3IHZhbHVlIGFmdGVyIHRoZSBrZXl3b3JkCi0JCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHN5c3RlbUtleXdvcmQpLCAwLCAiICIgKyBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gc2VlIGlmIHdlIGhhdmUgYSBwdWJsaWMga2V5d29yZAotCQkJCQlJVGV4dFJlZ2lvbiBwdWJsaWNLZXl3b3JkID0gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKTsKLQkJCQkJaWYgKHB1YmxpY0tleXdvcmQgPT0gbnVsbCkgewotCQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQotCQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmFtZVJlZ2lvbiksIDAsICIgU1lTVEVNICIgKyBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gcHV0IGl0IGFmdGVyIHRoZSBwdWJsaWMgdmFsdWUgcmVnaW9uCi0JCQkJCQlJVGV4dFJlZ2lvbiBwdWJsaWNWYWx1ZVJlZ2lvbiA9IGdldFB1YmxpY1ZhbHVlUmVnaW9uKCk7Ci0JCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChwdWJsaWNWYWx1ZVJlZ2lvbiksIDAsICIgIiArIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN5c3RlbUlELgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3lzdGVtSUQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSUQoU3RyaW5nIHYpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9FWFRfTk9ERV9TWVNURU1fSURfQ0hHKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRTeXN0ZW1JRCh0aGlzLCB2KTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNThmNDg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmCi0gKiBkZXNpcmVkLCB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcwotICogcGx1Z2luLiBPdGhlciBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKQotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTmFtZWRUb3BMZXZlbE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTmFtZWRUb3BMZXZlbE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY3ZjUxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL05hbWVkVG9wTGV2ZWxOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vLyBpbnRlcmZhY2UgZm9yIG5vZGVzIHRoYXQgY2FuIGV4aXN0IGF0IHRoZSB0b3AgbGV2ZWwgaW4gYSBkdGRmaWxlCi0vLyBlZy4gZW50aXR5LCBub3RhdGlvbiwgZWxlbWVudCwgY29tbWVudCwgYXR0bGlzdCwgb3IgdW5yZWNvZ25pemVkIHN0dWZmIChpZQotLy8gPGp1bmsgZGtmamRsPgotcHVibGljIGFic3RyYWN0IGNsYXNzIE5hbWVkVG9wTGV2ZWxOb2RlIGV4dGVuZHMgVG9wTGV2ZWxOb2RlIHsKLQotCXByaXZhdGUgU3RyaW5nIHRhZ1N0YXJ0VHlwZTsKLQotCXB1YmxpYyBOYW1lZFRvcExldmVsTm9kZShEVERGaWxlIGR0ZEZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIFN0cmluZyB0eXBlKSB7Ci0JCXN1cGVyKGR0ZEZpbGUsIGZsYXROb2RlKTsKLQkJdGFnU3RhcnRUeXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TmFtZVJlZ2lvbigpIHsKLQkJLy8gbmFtZSByZWdpb24gaXMgbG9jYXRlZCBhZnRlciB0aGUgd2hpdGVzcGFjZSAod2hpY2ggaXMgYWZ0ZXIKLQkJLy8gdGhlIGVsZW1lbnR0YWcKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCWdldE5leHRSZWdpb24oaXRlciwgdGFnU3RhcnRUeXBlKTsKLQotCQlpZiAoIWl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQlpZiAoIXJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmICghaXRlci5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5OQU1FKSkgewotCQkJcmV0dXJuIHJlZ2lvbjsKLQkJfQotCi0JCS8vIHdlIG5vcm1hbGx5IHN0b3AgaGVyZSwgYnV0IGZvciBlbnRpdGllcywgd2UgaGF2ZSB0byBzZWUgaWYgd2UgYXJlCi0JCS8vIGF0IGEgJyUnLiBpZiBzbywgd2Ugc2tpcCB0aGF0IGFuZCBmaW5kIHRoZSBuYW1lIGFmdGVyIHRoZQotCQkvLyB3aGl0ZXNwYWNlIGFnYWluCi0JCWlmICh0YWdTdGFydFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRyAmJiByZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5QRVJDRU5UKSAmJiBpdGVyLmhhc05leHQoKSkgewotCQkJcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0KLQkJCWlmICghcmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJaWYgKCFpdGVyLmhhc05leHQoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlyZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5OQU1FKSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0U3RhcnRUYWcoUmVnaW9uSXRlcmF0b3IgaXRlcikgewotCQlyZXR1cm4gZ2V0TmV4dFJlZ2lvbihpdGVyLCB0YWdTdGFydFR5cGUpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRXaGl0ZXNwYWNlQWZ0ZXJOYW1lKCkgewotCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gZ2V0TmFtZVJlZ2lvbigpOwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJLy8gc2tpcCBwYXN0IHRoZSBlbGVtZW50IHRhZyByZWdpb24KLQkJZ2V0TmV4dFJlZ2lvbihpdGVyLCB0YWdTdGFydFR5cGUpOwotCQlib29sZWFuIGZvdW5kTmFtZSA9IGZhbHNlOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFmb3VuZE5hbWUgJiYgbmFtZVJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbiA9PSBuYW1lUmVnaW9uKSB7Ci0JCQkJZm91bmROYW1lID0gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpKSB7Ci0JCQkJLy8gdGhlcmUgaXMgbm8gbmFtZSByZWdpb24gb3Igd2UgaGF2ZSBhbHJlYWR5IHBhc3NlZCBpdAotCQkJCWlmIChuYW1lUmVnaW9uID09IG51bGwgfHwgZm91bmROYW1lKSB7Ci0JCQkJCXJldHVybiByZWdpb247Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIG5hbWUpIHsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJaWYgKG5hbWVSZWdpb24gIT0gbnVsbCkgewotCQkJc3VwZXIuc2V0TmFtZShyZXF1ZXN0b3IsIG5hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQlJVGV4dFJlZ2lvbiBlbGVtZW50VGFnUmVnaW9uID0gZ2V0TmV4dFJlZ2lvbihpdGVyLCB0YWdTdGFydFR5cGUpOwotCQkJaW50IHJlcGxhY2VMZW5ndGggPSAwOwotCQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpKSB7Ci0JCQkJCWlmIChyZWdpb24uZ2V0TGVuZ3RoKCkgPj0gMikgewotCQkJCQkJLy8gdGhlcmUgYXJlIDIgc3BhY2VzIGJldHdlZW4gJ0VMRU1FTlQnIGFuZCB0aGUKLQkJCQkJCS8vIGNvbnRlbnQKLQkJCQkJCS8vIENoYW5nZSByZXBsYWNlIGxlbmd0aCB0byAxIHNvIHRoYXQgdGhlIG5ldyBuYW1lIGFuZAotCQkJCQkJLy8gdGhlIGNvbnRlbnQgYXJlIHNlcGFyYXRlZCBieSBhIHNpbmdsZSBzcGFjZQotCQkJCQkJcmVwbGFjZUxlbmd0aCA9IDE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGJlZ2luUmVjb3JkaW5nKHJlcXVlc3RvciwgIk5hbWUgQ2hhbmdlIik7Ci0JCQlTdHJpbmcgbmV3VGV4dCA9ICIgIiArIG5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGVsZW1lbnRUYWdSZWdpb24pLCByZXBsYWNlTGVuZ3RoLCBuZXdUZXh0KTsKLQkJCS8vIGVuZFJlY29yZGluZyhyZXF1ZXN0b3IpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL05vZGVMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL05vZGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDVhMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ob2RlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotCi0KLXB1YmxpYyBjbGFzcyBOb2RlTGlzdCB7Ci0JcHJvdGVjdGVkIERUREZpbGUgZHRkRmlsZTsKLQotCUFycmF5TGlzdCBsaXN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGxpc3RUeXBlOwotCi0JcHVibGljIE5vZGVMaXN0KERUREZpbGUgZHRkRmlsZSwgU3RyaW5nIHRva2VuVHlwZSkgewotCQlsaXN0VHlwZSA9IHRva2VuVHlwZTsKLQkJdGhpcy5kdGRGaWxlID0gZHRkRmlsZTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCWlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRykgewotCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5GTERSX0VMKTsKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkZMRFJfRU5UKTsKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRkxEUl9OT1QpOwotCQl9Ci0JCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRkxEUl9DT01NKTsKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRykgewotCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5GTERSX0FUVExJU1QpOwotCQl9Ci0JCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCkgewotCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5GTERSX1VOUkVDKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RUeXBlKCkgewotCQlyZXR1cm4gbGlzdFR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX05PREVfTElTVF9FTEVNRU5UUzsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX05PREVfTElTVF9FTlRJVElFUzsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRykgewotCQkJcmV0dXJuIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfTk9ERV9MSVNUX05PVEFUSU9OUzsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpIHsKLQkJCXJldHVybiBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX05PREVfTElTVF9DT01NRU5UUzsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9OT0RFX0xJU1RfQVRUUklCVVRFUzsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCkgewotCQkJcmV0dXJuIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfTk9ERV9MSVNUX09USEVSOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEFycmF5TGlzdCBnZXROb2RlcygpIHsKLQkJbGlzdE5vZGVzLmNsZWFyKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBkdGRGaWxlLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcgJiYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpKSB7Ci0JCQkJbGlzdE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHICYmIG5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkJbGlzdE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcgJiYgbm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCWxpc3ROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcgJiYgbm9kZSBpbnN0YW5jZW9mIE5vdGF0aW9uKSB7Ci0JCQkJbGlzdE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQgJiYgbm9kZSBpbnN0YW5jZW9mIENvbW1lbnQpIHsKLQkJCQlsaXN0Tm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UICYmIG5vZGUgaW5zdGFuY2VvZiBVbnJlY29nbml6ZWQpIHsKLQkJCQlsaXN0Tm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0Tm9kZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ob3RhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ob3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmFiZDc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBOb3RhdGlvbiBleHRlbmRzIEV4dGVybmFsTm9kZSB7Ci0KLQlwdWJsaWMgTm90YXRpb24oRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlLCBEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5OT1RBVElPTklDT04pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1BhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTAwNTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGV4dGVuZHMgTmFtZWRUb3BMZXZlbE5vZGUgewotCi0KLQotCXB1YmxpYyBjbGFzcyBTdGFydEVuZFBhaXIgewotCQlwdWJsaWMgaW50IHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQ7Ci0JfQotCi0JcHJpdmF0ZSBFbnRpdHkgY2FjaGVkRW50aXR5ID0gbnVsbDsKLQotCXB1YmxpYyBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlLCBEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKTsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5IGdldEVudGl0eU9iamVjdCgpIHsKLQkJaWYgKGNhY2hlZEVudGl0eSAhPSBudWxsICYmICFjYWNoZWRFbnRpdHkuZ2V0TmFtZSgpLmVxdWFscyhnZXRSZWZlcmVuY2VkRW50aXR5KCkpKSB7Ci0JCQkvLyBpZiB3ZSBoYXZlIGEgY2FjaGVkIGVudGl0eSwgYnV0IHRoZSBuYW1lIGRvZXNudCBtYXRjaCwKLQkJCS8vIG51bGwgaXQgbm93LCBzbyB3ZSBwZXJmb3JtIGEgbG9va3VwCi0JCQljYWNoZWRFbnRpdHkgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGNhY2hlZEVudGl0eSA9PSBudWxsKSB7Ci0JCQlMaXN0IG5vZGVzID0gZ2V0RFRERmlsZSgpLmdldE5vZGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIG5vZGVzLmdldChpKTsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgbm9kZTsKLQkJCQkJaWYgKGVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpICYmIGVudGl0eS5nZXROYW1lKCkuZXF1YWxzKGdldFJlZmVyZW5jZWRFbnRpdHkoKSkpIHsKLQkJCQkJCWNhY2hlZEVudGl0eSA9IGVudGl0eTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2FjaGVkRW50aXR5OwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5FTlRJVFlSRUZFUkVOQ0VJQ09OKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkRW50aXR5KCkgewotCQlTdHJpbmcgdGV4dCA9IGdldE5hbWUoKTsKLQkJcmV0dXJuIGdldE5hbWUoKS5zdWJzdHJpbmcoMSwgdGV4dC5sZW5ndGgoKSAtIDEpOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRTdGFydEFuZEVuZE9mZnNldEZvclRleHQoU3RhcnRFbmRQYWlyIHBhaXIpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCUlUZXh0UmVnaW9uIGNvbW1lbnRTdGFydFRhZyA9IGdldFN0YXJ0VGFnKGl0ZXIpOwotCQlJVGV4dFJlZ2lvbiBlbmRDb21tZW50VGFnID0gZ2V0TmV4dFJlZ2lvbihpdGVyLCBEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCk7Ci0JCXBhaXIuZW5kT2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChjb21tZW50U3RhcnRUYWcgIT0gbnVsbCkgewotCQkJcGFpci5zdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChjb21tZW50U3RhcnRUYWcpOwotCQl9Ci0JCWlmIChlbmRDb21tZW50VGFnICE9IG51bGwpIHsKLQkJCXBhaXIuZW5kT2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGVuZENvbW1lbnRUYWcpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKTsKLQkJaW50IGZsYXROb2RlU3RhcnQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpOwotCQlTdGFydEVuZFBhaXIgcGFpciA9IG5ldyBTdGFydEVuZFBhaXIoKTsKLQkJZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KHBhaXIpOwotCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcocGFpci5zdGFydE9mZnNldCAtIGZsYXROb2RlU3RhcnQsIHBhaXIuZW5kT2Zmc2V0IC0gZmxhdE5vZGVTdGFydCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZEVudGl0eShPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbmFtZSkgewotCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldExlbmd0aCgpLCAiJSIgKyBuYW1lICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZEVudGl0eShTdHJpbmcgbmFtZSkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX1BBUk1fRU5USVRZX1JFRl9DSEdfRU5USVRZX1JFRik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0UmVmZXJlbmNlZEVudGl0eSh0aGlzLCBuYW1lKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIG5ld1RleHQpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9QQVJNX0VOVElUWV9SRUZfQ09NTUVOVF9DSEcpOyAvLyROT04tTkxTLTEkCi0JCVN0YXJ0RW5kUGFpciBwYWlyID0gbmV3IFN0YXJ0RW5kUGFpcigpOwotCQlnZXRTdGFydEFuZEVuZE9mZnNldEZvclRleHQocGFpcik7Ci0JCXJlcGxhY2VUZXh0KHRoaXMsIHBhaXIuc3RhcnRPZmZzZXQsIHBhaXIuZW5kT2Zmc2V0IC0gcGFpci5zdGFydE9mZnNldCwgbmV3VGV4dCk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvVG9wTGV2ZWxOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1RvcExldmVsTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGMyN2M2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvVG9wTGV2ZWxOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8vIGludGVyZmFjZSBmb3Igbm9kZXMgdGhhdCBjYW4gZXhpc3QgYXQgdGhlIHRvcCBsZXZlbCBpbiBhIGR0ZGZpbGUKLS8vIGVnLiBlbnRpdHksIG5vdGF0aW9uLCBlbGVtZW50LCBjb21tZW50LCBhdHRsaXN0LCBvciB1bnJlY29nbml6ZWQgc3R1ZmYgKGllCi0vLyA8anVuayBka2ZqZGw+Ci1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVG9wTGV2ZWxOb2RlIGV4dGVuZHMgRFRETm9kZSB7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBmbGF0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgVG9wTGV2ZWxOb2RlKERUREZpbGUgZHRkRmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihkdGRGaWxlLCBmbGF0Tm9kZSk7Ci0JCWZsYXROb2Rlcy5hZGQoZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFdoaXRlc3BhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCWZsYXROb2Rlcy5hZGQobm9kZSk7Ci0JfQotCi0JLy8gc3BlY2lhbGl6ZSB0aGlzIHNvIHdlIGRlbGV0ZSB0aGUgb2JqZWN0cyBmbGF0IG5vZGUgcmFuZ2UKLQkvLyBBTkQgYW55IHdoaXRlc3BhY2UKLQlwdWJsaWMgdm9pZCBkZWxldGUoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKGdldERUREZpbGUoKSwgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9UT1BfTEVWRUxfTk9ERV9ERUxFVEUpOyAvLyROT04tTkxTLTEkCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3QgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZmxhdE5vZGVzLmdldCgwKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGZsYXROb2Rlcy5nZXQoZmxhdE5vZGVzLnNpemUoKSAtIDEpOwotCQlpbnQgc3RhcnRPZmZzZXQgPSBmaXJzdC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kT2Zmc2V0ID0gbGFzdC5nZXRFbmRPZmZzZXQoKTsKLQotCQlyZXBsYWNlVGV4dChnZXREVERGaWxlKCksIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWVuZFJlY29yZGluZyhnZXREVERGaWxlKCkpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRFbmRSZWdpb24oKSB7Ci0JCWludCBzaXplID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKTsKLQkJaWYgKHNpemUgPiAwKSB7Ci0JCQlyZXR1cm4gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldChzaXplIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gaW5jbHVkZXMgd2hhdCBnZXR0ZXh0IGdpdmVzIHVzIHBsdXMgYW55IHdoaXRlc3BhY2UKLQkvLyB0cmFpbGluZyBpdAotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGZsYXROb2Rlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZk5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgaXRlci5uZXh0KCk7Ci0JCQlzYi5hcHBlbmQoZk5vZGUuZ2V0VGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0U3RhcnRSZWdpb24oKSB7Ci0JCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25zKCkuc2l6ZSgpID4gMCkgewotCQkJcmV0dXJuIGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFJlZ2lvbkl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZSByZWdpb24gaXRlciAiICsgdGhpcy5nZXRDbGFzcygpICsgIiB3aXRoCi0JCS8vIHN0YXJ0ICwgZW5kID0gIiArIGdldFN0YXJ0T2Zmc2V0KCkgKyAiLCAiICtnZXRFbmRPZmZzZXQoKSk7Ci0JCXJldHVybiBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIGdldFN0YXJ0T2Zmc2V0KCksIGdldEVuZE9mZnNldCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1VucmVjb2duaXplZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9VbnJlY29nbml6ZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUzNDhhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1VucmVjb2duaXplZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBVbnJlY29nbml6ZWQgZXh0ZW5kcyBUb3BMZXZlbE5vZGUgewotCi0JcHVibGljIFVucmVjb2duaXplZChEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5VTlJFQ09HTklaRURJQ09OKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpOwotCQlpZiAodGV4dC5sZW5ndGgoKSA8PSAzMCkgewotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgMjkpICsgIi4uLiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50L0NvbnRlbnREZXNjcmliZXJGb3JEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudC9Db250ZW50RGVzY3JpYmVyRm9yRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZjExMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50L0NvbnRlbnREZXNjcmliZXJGb3JEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmNvbnRlbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yOwotCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRlbnREZXNjcmliZXJGb3JEVEQgaW1wbGVtZW50cyBJVGV4dENvbnRlbnREZXNjcmliZXIgewotCWZpbmFsIHByaXZhdGUgc3RhdGljIFF1YWxpZmllZE5hbWVbXSBTVVBQT1JURURfT1BUSU9OUyA9IHtJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUfTsKLQlwdWJsaWMgaW50IGRlc2NyaWJlKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCQllbHNlIHsKLQkJCWNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGRlc2NyaWJlKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFF1YWxpZmllZE5hbWVbXSBnZXRTdXBwb3J0ZWRPcHRpb25zKCkgewotCi0JCXJldHVybiBTVVBQT1JURURfT1BUSU9OUzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCWhhbmRsZUNhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCWhhbmRsZUNhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVZhbGlkaXR5KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCS8vIGN1cnJlbnRseSBubyBzcGVjaWZpYyBjaGVjayBmb3IgdmFsaWRpbHR5Ci0JCS8vIGJhc2VkIG9uIGNvbnRlbnRzLgotCQlyZXR1cm4gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQl9Ci0KLQlwcml2YXRlIGludCBjb21wdXRlVmFsaWRpdHkoUmVhZGVyIHJlYWRlcikgewotCQkvLyBjdXJyZW50bHkgbm8gc3BlY2lmaWMgY2hlY2sgZm9yIHZhbGlkaWx0eQotCQkvLyBiYXNlZCBvbiBjb250ZW50cy4KLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JLy8gc2FtZSBydWxlcyBhcyBmb3IgWE1MCi0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZ2V0RGV0ZWN0b3IoKSB7Ci0JCQlyZXR1cm4gbmV3IFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZXRlY3RvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2FsY3VsYXRpb25zKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gbm90ZTogaWYgd2UncmUgYXNrZWQgZm9yIG9uZSwgd2Ugc2V0IHRoZW0gYWxsLiBJIG5lZWQgdG8gYmUgc3VyZSBpZgotCQkvLyBjYWxsZWQKLQkJLy8gbXVsaXRpcGxlIHRpbWVzIChvbmUgZm9yIGVhY2gsIHNheSkgdGhhdCB3ZSBkb24ndCB3YXN0ZSB0aW1lCi0JCS8vIHByb2Nlc3Npbmcgc2FtZQotCQkvLyBjb250ZW50IGFnYWluLgotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gKChYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IpIGRldGVjdG9yKS5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJLy8gVE9ETzogSSBuZWVkIHRvIHZlcmlmeSB0byBzZWUgaWYgdGhpcyBCT00gd29yayBpcyBhbHdheXMgZG9uZQotCQkvLyBieSB0ZXh0IHR5cGUuCi0JCU9iamVjdCBkZXRlY3RlZEJ5dGVPcmRlck1hcmsgPSBlbmNvZGluZ01lbWVudG8uZ2V0VW5pY29kZUJPTSgpOwotCQlpZiAoZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0J5dGVPcmRlck1hcmsgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSyk7Ci0JCQkvLyBub3Qgc3VyZSB3aHkgd291bGQgZXZlciBiZSBkaWZmZXJlbnQsIHNvIGlmIGlzIGRpZmZlcmVudCwgbWF5Ci0JCQkvLyBuZWVkIHRvICJwdXNoIiB1cCBpbnRvIGJhc2UuCi0JCQlpZiAoIWRldGVjdGVkQnl0ZU9yZGVyTWFyay5lcXVhbHMoZXhpc3RpbmdCeXRlT3JkZXJNYXJrKSkKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrKTsKLQkJfQotCi0KLQkJaWYgKCFlbmNvZGluZ01lbWVudG8uaXNWYWxpZCgpKSB7Ci0JCQkvLyBub3RlOiBhZnRlciBzZXR0aW5nIGhlcmUsIGl0cyB0aGUgbWVyZSBwcmVzZW5jZSBvZgotCQkJLy8gSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQKLQkJCS8vIGluIHRoZSByZXNvdXJjZSdzIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmCi0JCQkvLyBpbnZhbGlkCi0JCQkvLyBpbiB0aG9zZSBjYXNlcywgdGhlICJkZXRlY3RlZCIgcHJvcGVydHkgY29udGFpbnMgYW4KLQkJCS8vICJhcHByb3ByaWF0ZSBkZWZhdWx0IiB0byB1c2UuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgZW5jb2RpbmdNZW1lbnRvLmdldEludmFsaWRFbmNvZGluZygpKTsKLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULCBlbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCkpOwotCQl9Ci0KLQkJT2JqZWN0IGRldGVjdGVkQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JCU9iamVjdCBqYXZhQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQotCQkvLyB3ZSBhbHdheXMgaW5jbHVkZSBkZXRlY3RlZCwgaWYgaXRzIGRpZmZlcmVudCB0aGFuIGphdmEKLQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0KLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0NoYXJzZXQgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpOwotCQkJaWYgKGphdmFDaGFyc2V0LmVxdWFscyhleGlzdGluZ0NoYXJzZXQpKSB7Ci0JCQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3ZSBtYXkgbmVlZCB0byBhZGQgd2hhdCB3ZSBmb3VuZCwgYnV0IG9ubHkgbmVlZCB0byBhZGQKLQkJCQkvLyBpZiBkaWZmZXJlbnQgZnJvbSBkZWZhdWx0LnRoZQotCQkJCU9iamVjdCBkZWZhdWx0Q2hhcnNldCA9IGdldERldGVjdG9yKCkuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQkJCWlmIChkZWZhdWx0Q2hhcnNldCAhPSBudWxsKSB7Ci0JCQkJCWlmICghZGVmYXVsdENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGFzc3VtaW5nIGlmIHRoZXJlIGlzIG5vIHNwZWMgZGVmYXVsdCwgd2UgYWx3YXlzIG5lZWQgdG8KLQkJCQkJLy8gYWRkLCBJJ20gYXNzdW1pbmcKLQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0LCBPYmplY3QgamF2YUNoYXJzZXQpIHsKLQkJLy8gc2luY2UgZXF1YWwsIHdlIGRvbid0IG5lZWQgdG8gYWRkLCBidXQgaWYgb3VyIGRldGVjdGVkIHZlcnNpb24gaXMKLQkJLy8gZGlmZmVyZW50IHRoYW4KLQkJLy8gamF2YUNoYXJzZXQsIHRoZW4gd2Ugc2hvdWxkIGFkZCBpdC4gVGhpcyB3aWxsIGhhcHBlbiwgZm9yIGV4YW1wbGUsCi0JCS8vIGlmIHRoZXJlJ3MKLQkJLy8gZGlmZmVyZW5jZXMgaW4gY2FzZSwgb3IgZGlmZmVyZW5jZXMgZHVlIHRvIG92ZXJyaWRlIHByb3BlcnRpZXMKLQkJaWYgKGRldGVjdGVkQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQkvLyBpZiAoIWRldGVjdGVkQ2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkvLyBkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwKLQkJCS8vIGRldGVjdGVkQ2hhcnNldCk7Ci0JCQkvLyB9Ci0KLQkJCS8vIE9uY2Ugd2UgZGV0ZWN0ZWQgYSBjaGFyc2V0LCB3ZSBzaG91bGQgc2V0IHRoZSBwcm9wZXJ0eSBldmVuCi0JCQkvLyB0aG91Z2ggaXQncyB0aGUgc2FtZSBhcyBqYXZhQ2hhcnNldAotCQkJLy8gYmVjYXVzZSB0aGVyZSBhcmUgY2xpZW50cyB0aGF0IHJlbHkgb24gdGhpcyBwcm9wZXJ0eSB0bwotCQkJLy8gZGV0ZXJtaW5lIGlmIHRoZSBjaGFyc2V0IGlzIGFjdHVhbGx5IGRldGVjdGVkIGluIGZpbGUgb3Igbm90LgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIGRldGVjdGVkQ2hhcnNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZlbnQoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSykpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RURE1vZGVsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9EVERNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI3MzI5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RURE1vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQuSURUREZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQuTm9kZXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuRFRETW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWwuRFREUmVmZXJlbmNlVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5MYWJlbFZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIERURE1vZGVsSW1wbCBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLCBEVERNb2RlbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlRmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQkvLyBjcmVhdGUgdGhlIHRlbXAgRmlsZSBvYmplY3QKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCXJlc3VsdCA9IGZpbGUuZGVsZXRlKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBEVERGaWxlIGRvY3VtZW50OwotCi0JLy8gcHJpdmF0ZSBMaXN0IGVycm9yTWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBlbnRpdHkgcmVmZXJlbmNlIG5hbWVzIGZvdW5kIGluIHRoZSBjb25kaXRpb25hbCBJR05PUkUgc2VjdGlvbnMKLQlwcml2YXRlIFZlY3RvciBpZ25vcmVkRW50aXR5UmVmczsKLQotCXByaXZhdGUgYm9vbGVhbiByZWZyZXNoUmVxdWlyZWQgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBEVERSZWZlcmVuY2VVcGRhdGVyIHJlZlVwZGF0ZXIgPSBuZXcgRFREUmVmZXJlbmNlVXBkYXRlcigpOwotCi0JcHVibGljIERURE1vZGVsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJZG9jdW1lbnQgPSBuZXcgRFRERmlsZSh0aGlzKTsKLQkJZG9jdW1lbnQuYWRkRFRERmlsZUxpc3RlbmVyKG5ldyBJRFRERmlsZUxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBub2RlQ2hhbmdlZChEVEROb2RlIG5vZGUpIHsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgbm9kZTsKLQkJCQkJaWYgKGVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpICYmIGVudGl0eS5pc0V4dGVybmFsRW50aXR5KCkpIHsKLQkJCQkJCS8vIGp1c3Qgc2F5IHRoZXkgaGF2ZSBjaGFuZ2VkIGZvciBub3cKLQkJCQkJCXNldFJlZmVyZW5jZWRNb2RlbHNDaGFuZ2VkKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG5vZGVzQWRkZWQoTm9kZXNFdmVudCBldmVudCkgewotCQkJCWNoZWNrSWZFeHRlcm5hbFJlZmVyZW5jZXNDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbm9kZXNSZW1vdmVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJCQljaGVja0lmRXh0ZXJuYWxSZWZlcmVuY2VzQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlci5iZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIGxhYmVsKTsKLQkJLy8gY2xlYXIgcmVmZXJlbmNlIHVwZGF0ZXIgY2FjaGUKLQkJZ2V0UmVmZXJlbmNlVXBkYXRlcigpLmNsZWFyQ2FjaGUoKTsKLQl9Ci0KLQl2b2lkIGNoZWNrSWZFeHRlcm5hbFJlZmVyZW5jZXNDaGFuZ2VkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGV2ZW50LmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBub2RlOwotCQkJCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiBlbnRpdHkuaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQkJCS8vIGp1c3Qgc2F5IHRoZXkgaGF2ZSBjaGFuZ2VkIGZvciBub3cKLQkJCQkJc2V0UmVmZXJlbmNlZE1vZGVsc0NoYW5nZWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLwotCS8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaGVscHMgZGV0ZXJtaW5lIHRoZSBsaXN0IG9mIHRoaW5ncyB0aGF0Ci0JLy8gY2FuIGJlIHVzZWQgaW4gYSBwYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZSBjb250ZW50Ci0JLy8gT3B0aW9uYWwgcGFyYW1ldGVyIGlzIHRvIGFsbG93IHRoZSBjdXJyZW50bHkgdXNlZCBEVERFbnRpdHkgdG8KLQkvLyBiZSBpbmNsdWRlZCBpbiB0aGUgY29tYm9ib3guCi0JLy8KLQlwdWJsaWMgTGFiZWxWYWx1ZVBhaXJbXSBjcmVhdGVQYXJtRW50aXR5Q29udGVudEl0ZW1zKEVudGl0eSBlbnRpdHkpIHsKLQkJTm9kZUxpc3QgZW50aXRpZXMgPSBnZXREVERGaWxlKCkuZ2V0RW50aXRpZXMoKTsKLQotCQlWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJaWYgKGVudGl0eSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZSA9ICIlIiArIGVudGl0eS5nZXROYW1lKCkgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaXRlbXMuYWRkRWxlbWVudChuZXcgTGFiZWxWYWx1ZVBhaXIobmFtZSwgbmFtZSkpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpID0gZW50aXRpZXMuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCUVudGl0eSBlbnRpdHlBdCA9IChFbnRpdHkpIGkubmV4dCgpOwotCQkJaWYgKGVudGl0eUF0LmlzUGFyYW1ldGVyRW50aXR5KCkgJiYgZW50aXR5QXQuaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAiJSIgKyBlbnRpdHlBdC5nZXROYW1lKCkgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWl0ZW1zLmFkZEVsZW1lbnQobmV3IExhYmVsVmFsdWVQYWlyKG5hbWUsIG5hbWUpKTsKLQkJCX0KLQkJfQotCQlMYWJlbFZhbHVlUGFpcltdIGNvbWJvQXJyYXkgPSBuZXcgTGFiZWxWYWx1ZVBhaXJbaXRlbXMuc2l6ZSgpXTsKLQkJaXRlbXMuY29weUludG8oY29tYm9BcnJheSk7Ci0JCXJldHVybiBjb21ib0FycmF5OwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKSB7Ci0JCXN1cGVyLmVuZFJlY29yZGluZyhyZXF1ZXN0ZXIpOwotCQkvLyBjbGVhciByZWZlcmVuY2UgdXBkYXRlciBjYWNoZQotCQlnZXRSZWZlcmVuY2VVcGRhdGVyKCkuY2xlYXJDYWNoZSgpOwotCX0KLQotCi0JcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8vIFJldHVybnMgZW50aXR5IHJlZmVyZW5jZSBuYW1lcyB0aGF0IGFyZSBpbgotCS8vIHRoZSBjb25kaXRpb25hbCBJR05PUkUgc2VjdGlvbnMuCi0JcHVibGljIFZlY3RvciBnZXRJZ25vcmVkRW50aXR5UmVmcygpIHsKLQkJaWYgKGlnbm9yZWRFbnRpdHlSZWZzID09IG51bGwpCi0JCQlpZ25vcmVkRW50aXR5UmVmcyA9IG5ldyBWZWN0b3IoKTsKLQkJcmV0dXJuIGlnbm9yZWRFbnRpdHlSZWZzOwotCX0KLQotCXB1YmxpYyBJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oaW50IG9mZnNldCkgewotCQlpZiAodGhpcy5kb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0Tm9kZSBhdCAiICsgb2Zmc2V0ICsgIiByZXR1cm5pbmcgPSAiICsKLQkJLy8gdGhpcy5kb2N1bWVudC5nZXROb2RlQXQob2Zmc2V0KSk7Ci0KLQkJcmV0dXJuIHRoaXMuZG9jdW1lbnQuZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JfQotCi0JcHVibGljIERURFJlZmVyZW5jZVVwZGF0ZXIgZ2V0UmVmZXJlbmNlVXBkYXRlcigpIHsKLQkJcmV0dXJuIHJlZlVwZGF0ZXI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkTW9kZWxzQ2hhbmdlZCgpIHsKLQkJcmV0dXJuIHJlZnJlc2hSZXF1aXJlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlZnJlc2hSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHJlZnJlc2hSZXF1aXJlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IGZsYXRNb2RlbEV2ZW50KSB7Ci0JCWRvY3VtZW50Lm5ld01vZGVsKGZsYXRNb2RlbEV2ZW50KTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcbm5ld21vZGVsIik7Ci0JCW91dHB1dFN0cnVjdHVyZWREb2N1bWVudChmbGF0TW9kZWxFdmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBmbGF0TW9kZWxFdmVudCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlxubm9jaGFuZ2UiKTsKLQkJb3V0cHV0U3RydWN0dXJlZERvY3VtZW50KGZsYXRNb2RlbEV2ZW50KTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZmxhdE1vZGVsRXZlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcbm5vZGVzcmVwbGFjZWQiKTsKLQkJZG9jdW1lbnQubm9kZXNSZXBsYWNlZChmbGF0TW9kZWxFdmVudCk7Ci0JCW91dHB1dFN0cnVjdHVyZWREb2N1bWVudChmbGF0TW9kZWxFdmVudCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnQoU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZmxhdE1vZGVsRXZlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnQgc291cmNlID0gJyIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRUZXh0KCkgKyAiJyIpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm5ldyBTdHJpbmcgPSAnIiArCi0JCS8vIGZsYXRNb2RlbEV2ZW50LmdldE9yaWdpbmFsQ2hhbmdlcygpICsiJyIpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImRlbGV0ZWQgU3RyaW5nID0gJyIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXREZWxldGVkVGV4dCgpICsiJyIpOwotCQkvLyBFbnVtZXJhdGlvbiBlID0KLQkJLy8gZmxhdE1vZGVsRXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0Tm9kZXMoKS5lbGVtZW50cygpOwotCQkvLyBpbnQgaSA9IDA7Ci0JCS8vIGZvciAoOyBlLmhhc01vcmVFbGVtZW50cygpOyBpKyspCi0JCS8vIHsKLQkJLy8gQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9Ci0JCS8vIChCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkvLyBvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obm9kZSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiICIgKyBpICsiLiAiICsgbm9kZS5oYXNoQ29kZSgpICsgIiAnIgotCQkvLyArbm9kZS5nZXRUZXh0KCkgKyAiJyIpOwotCQkvLyB9Ci0JfQotCi0JcHVibGljIHZvaWQgb3V0cHV0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJLy8gaW50IHNpemUgPSBmbGF0Tm9kZS5nZXROdW1iZXJPZlJlZ2lvbnMoKTsKLQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCS8vIHsKLQkJLy8gUmVnaW9uIHJlZ2lvbiA9IChSZWdpb24pIGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoaSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihpICsgIi4gIiArIHJlZ2lvbi5nZXRUeXBlKCkpOwotCi0JCS8vIH0gLy8gZW5kIG9mIGZvciAoKQotCi0JfQotCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgZmxhdE1vZGVsRXZlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcbnJlZ2lvbiBjaGFuZ2VkIik7Ci0JCWRvY3VtZW50LnJlZ2lvbkNoYW5nZWQoZmxhdE1vZGVsRXZlbnQpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIj0gIiArCi0JCS8vIGZsYXRNb2RlbEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigicmVnaW9uIGNoYW5nZWQgIiArCi0JCS8vIGZsYXRNb2RlbEV2ZW50LmdldFJlZ2lvbigpLmhhc2hDb2RlKCkgKyAiID0gIiArCi0JCS8vIGZsYXRNb2RlbEV2ZW50LmdldFJlZ2lvbigpKTsKLQotCQlvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZmxhdE1vZGVsRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBmbGF0TW9kZWxFdmVudCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlxucmVnaW9uIHJlcGxhY2VkIik7Ci0JCWRvY3VtZW50LnJlZ2lvbnNSZXBsYWNlZChmbGF0TW9kZWxFdmVudCk7Ci0JCW91dHB1dFN0cnVjdHVyZWREb2N1bWVudChmbGF0TW9kZWxFdmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZE1vZGVsc0NoYW5nZWQoKSB7Ci0JCXJlZnJlc2hSZXF1aXJlZCA9IHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVmcmVzaFJlcXVpcmVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJcmVmcmVzaFJlcXVpcmVkID0gdmFsdWU7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gbmV3U3RydWN0dXJlZERvY3VtZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgb2xkU3RydWN0dXJlZERvY3VtZW50ID0gc3VwZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50KQotCQkJcmV0dXJuOyAvLyBub3RpbmcgdG8gZG8KLQotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpCi0JCQlvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQobmV3U3RydWN0dXJlZERvY3VtZW50KTsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpID4gMCkgewotCQkJCW5ld01vZGVsKG5ldyBOZXdEb2N1bWVudEV2ZW50KG5ld1N0cnVjdHVyZWREb2N1bWVudCwgdGhpcykpOwotCQkJfQotCQkJbmV3U3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcih0aGlzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMzNDk3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHsKLQotCXByb3RlY3RlZCBFbmNvZGluZ01lbWVudG8gZkVuY29kaW5nTWVtZW50bzsKLQotCXByb3RlY3RlZCBib29sZWFuIGZIZWFkZXJQYXJzZWQ7Ci0KLQlwcm90ZWN0ZWQgUmVhZGVyIGZSZWFkZXI7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldERldGVjdGVkQ2hhcnNldE5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIFRPRE86IGlmIGRldGVjdGVkQ2hhcnNldCBhbmQgc3BlYyBkZWZhdWx0IGlzCi0JCS8vIG51bGwsIG5lZWQgdG8gdXNlICJ3b3JrCi0JCS8vIGJlbmNoIGJhc2VkIiBkZWZhdWx0cy4KLQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcGFyYW0gcmVhc29uCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lLCBTdHJpbmcgcmVhc29uKSB7Ci0JCWNyZWF0ZUVuY29kaW5nTWVtZW50byhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgZW5zdXJlSW5wdXRTZXQoKSB7Ci0JCWlmIChmUmVhZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImlucHV0IG11c3QgYmUgc2V0IGJlZm9yZSB1c2UiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIHJldHVybiBudWxsLCBpZiBpbnZhbGlkIGNoYXJzZXQgbmFtZSAoaW4gd2hpY2ggY2FzZQotCSAqICJhcHByb3ByaWF0ZURlZmF1bHQiIHNob3VsZCBiZSB1c2VkLCBpZiBhIG5hbWUgaXMgcmVhbGx5IG5lZWQgZm9yIHNvbWUKLQkgKiAic2F2ZSBhbnl3YXkiIGNhc2VzKS4KLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyAxLiBDaGVjayBleHBsaWNpdCBtYXBwaW5nIG92ZXJyaWRlcyBmcm9tCi0JCS8vIHByb3BlcnR5IGZpbGUgLS0gaXRzIGhlcmUgd2UgcGljayB1cCAicnVsZXMiIGZvciBjYXNlcwotCQkvLyB0aGF0IGFyZSBub3QgZXZlbiBpbiBKYXZhCi0JCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyAyLiBVc2UgdGhlICJjYW5vbmljYWwiIG5hbWUgZnJvbSBKUkUgbWFwcGluZ3MKLQkJLy8gTm90ZTogc2VlIENoYXJzZXQgSmF2YURvYywgdGhlIG5hbWUgeW91IGdldCBvbmUKLQkJLy8gd2l0aCBjYW4gYmUgYWxpYXMsCi0JCS8vIHRoZSBuYW1lIHlvdSBnZXQgYmFjayBpcyAic3RhbmRhcmQiIG5hbWUuCi0JCUNoYXJzZXQgamF2YUNoYXJzZXQgPSBudWxsOwotCQl0cnkgewotCQkJamF2YUNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCS8vIGdpdmUgcHJpb3JpdHkgdG8gamF2YSBjb25vbmljYWwgbmFtZSwgaWYgcHJlc2VudAotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gamF2YUNoYXJzZXQubmFtZSgpOwotCQkJLy8gYnV0IHN0aWxsIGFsbG93IG92ZXJyaWRlcwotCQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMocmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RW5jb2RpbmdNZW1lbnRvKCkuZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCX0KLQotCS8vIHRvIGVuc3VyZSBjb25zaXN0IG92ZXJhbGwgcnVsZXMgdXNlZCwgd2UnbGwgbWFyayBhcwotCS8vIGZpbmFsLAotCS8vIGFuZCByZXF1aXJlIHN1YmNsYXNzZXMgdG8gcHJvdmlkZSBjZXJ0YWluIHBpZWNlcyBvZgotCS8vIHRoZQotCS8vIGltcGxlbWVudGF0aW9uCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVJbnB1dFNldCgpOwotCQlpZiAoIWZIZWFkZXJQYXJzZWQpIHsKLQkJCXBhcnNlSW5wdXQoKTsKLQkJCS8vIHdlIGtlZXAgdHJhY2sgb2YgaWYgaGVhZGVyJ3MgYWxyZWFkeSBiZWVuCi0JCQkvLyBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcKLQkJCS8vIHJlcGFyc2luZy4KLQkJCWZIZWFkZXJQYXJzZWQgPSB0cnVlOwotCQkJLy8gTm90ZTogdGhlcmUgaXMgYSAiaGlkZGVuIGFzc3VtcHRpb24iIGhlcmUKLQkJCS8vIHRoYXQgYW4gZW1wdHkKLQkJCS8vIHN0cmluZyBpbiBjb250ZW50IHNob3VsZCBiZSB0cmVhdGVkIHNhbWUgYXMKLQkJCS8vIG5vdCBwcmVzZW50LgotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWhhbmRsZVNwZWNEZWZhdWx0KCk7Ci0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJLy8gc2FmdHkgbmV0Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IE51bGxNZW1lbnRvKCk7Ci0JCX0KLQkJcmV0dXJuIGZFbmNvZGluZ01lbWVudG87Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0byByZXR1cm4gYSBkZWZhdWx0IGVuY29kaW5nIC0tIGFzIHNwZWNpZmllZCBieSBhbiBpbmR1c3RyeQotCSAqIGNvbnRlbnQgdHlwZSBzcGVjIC0tIHdoZW4gbm90IHByZXNlbnQgaW4gdGhlIHN0cmVhbSwgZm9yIGV4YW1wbGUsIFhNTAotCSAqIHNwZWNpZmllcyBVVEYtOCwgSlNQIHNwZWNpZmllcyBJU08tODg1OS0xLiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuCi0JICogbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoICJzcGVjIGRlZmF1bHQiLgotCSAqLwotCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRTcGVjRGVmYXVsdEVuY29kaW5nTWVtZW50bygpIHsKLQkJcmVzZXRBbGwoKTsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBlbmMgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmMgIT0gbnVsbCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuYyk7Ci0JCQlyZXN1bHQgPSBmRW5jb2RpbmdNZW1lbnRvOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNwZWNEZWZhdWx0KCkgewotCQlTdHJpbmcgZW5jb2RpbmdOYW1lOwotCQllbmNvZGluZ05hbWUgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmNvZGluZ05hbWUgIT0gbnVsbCkgewotCQkJLy8gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuY29kaW5nTmFtZSwKLQkJCS8vIEVuY29kaW5nTWVtZW50by5VU0VEX0NPTlRFTlRfVFlQRV9ERUZBVUxUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShlbmNvZGluZ05hbWUpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZW5jb2RpbmdOYW1lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV2ZXJ5IHN1YmNsYXNzIG11c3QgcHJvdmlkZSBhIHdheSB0byBwYXJzZSB0aGUgaW5wdXQuIFRoaXMgbWV0aG9kIGhhcwotCSAqIHNldmVyYWwgY3JpdGljYWwgcmVzcG9uc2liaWxpdGllczoKLQkgKiA8bGk+c2V0IHRoZSBmRW5jb2RpbmdNZW1lbnRvIGZpZWxkIGFwcHJvcHJpYXRlbHksIGFjY29yZGluZyB0byB0aGUKLQkgKiByZXN1bHRzIG9mIHRoZSBwYXJzZSBvZiBmUmVhZGVyLjwvbGk+Ci0JICogPGxpPnNldCBmSGFyZGVyUGFyc2VkIHRvIHRydWUsIHRvIGF2b2lkIHdhc3RlZCByZS1wYXJzaW5nLjwvbGk+Ci0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldEFsbCgpIHsKLQkJZlJlYWRlciA9IG51bGw7Ci0JCWZIZWFkZXJQYXJzZWQgPSBmYWxzZTsKLQkJZkVuY29kaW5nTWVtZW50byA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSBuZXcgQnl0ZVJlYWRlcihpbnB1dFN0cmVhbSk7Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2Uga25vdyBCeXRlUmVhZGVyCi0JCQkvLyBzdXBwb3J0cyBtYXJraW5nCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSVN0b3JhZ2UgaVN0b3JhZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVzZXRBbGwoKTsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBpU3RvcmFnZS5nZXRDb250ZW50cygpOwotCQlJbnB1dFN0cmVhbSByZXNldHRhYmxlU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0sIENvZGVkSU8uTUFYX0JVRl9TSVpFKTsKLQkJcmVzZXR0YWJsZVN0cmVhbS5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCXNldChyZXNldHRhYmxlU3RyZWFtKTsKLQkJLy8gVE9ETyB3ZSdsbCBuZWVkIHRvICJyZW1lbWJlciIgSUZpbGUsIG9yCi0JCS8vIGdldCBpdHMgKG9yIGl0cyBwcm9qZWN0J3MpIHNldHRpbmdzLCBpbiBjYXNlCi0JCS8vIHRob3NlIGFyZSBuZWVkZWQgdG8gaGFuZGxlIGNhc2VzIHdoZW4gdGhlCi0JCS8vIGVuY29kaW5nIGlzIG5vdCBpbiB0aGUgZmlsZSBzdHJlYW0uCi0JfQotCi0JLyoqCi0JICogTm90ZTogdGhpcyBpcyBub3QgcGFydCBvZiBpbnRlcmZhY2UgdG8gaGVscCBhdm9pZCBjb25mdXNpb24gLi4uIGl0Ci0JICogZXhwZWN0ZWQgdGhpcyBSZWFkZXIgaXMgYSB3ZWxsIGZvcm1lZCBjaGFyYWN0ZXIgcmVhZGVyIC4uLiB0aGF0IGlzLCBpdHMKLQkgKiBhbGwgcmVhZHkgYmVlbiBkZXRlcm1pbmVkIHRvIG5vdCBiZSBhIHVuaWNvZGUgbWFya2VkIGlucHV0IHN0cmVhbS4gQW5kLAotCSAqIGl0cyBhc3N1bWVkIHRvIGJlIGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uLCBhdCBwb3NpdGlvbiB6ZXJvLCByZWFkeSB0bwotCSAqIHJlYWQgZmlyc3QgY2hhcmFjdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldChSZWFkZXIgcmVhZGVyKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSByZWFkZXI7Ci0JCWlmICghZlJlYWRlci5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCWZSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZlJlYWRlcik7Ci0JCX0KLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NibGUsIHNpbmNlIHdlIGp1c3QgY2hlY2tlZCBpZiBtYXJrYWJsZQotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9CeXRlUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0J5dGVSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVjOWJkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0J5dGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci0KLS8qKgotICogVGhpcyBpcyBhbiAiYWRhcHRlciIgY2xhc3MsIHNpbXBseSB0byBnZXQgaW4gaW5wdXQgc3RyZWFtIHRvIGFjdCBsaWtlIGEKLSAqIHJlYWRlci4gV2UgY291bGQgbm90IHVzZSBJbnB1dFN0cmVhbVJlYWRlciBkaXJlY3RseSBiZWNhdXNlIGl0cyBpbnRlcm5hbAotICogYnVmZmVycyBhcmUgbm90IGNvbnRyb2xsYWJsZSwgYW5kIGl0IHNvbWV0aW1lcyBwdWxscyB0b28gbXVjaCBvdXQgb2YgaW5wdXQKLSAqIHN0cmVhbSAoZXZlbiB3aGVuIGl0IHdhc24ndCBuZWVkZWQgZm9yIG91ciBwdXJwb3NlcykuCi0gKiAKLSAqIFRoZSB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBoaWdobHkgc3BlY2lhbGl6ZWQgYW5kIGJ5IG5vdCBtZWFucyBtZWFudCB0byBiZQotICogZ2VuZXJhbCBwdXJwb3NlLiBJdHMgdXNlIGlzIHJlc3RyaWN0ZWQgdG8gdGhvc2UgY2FzZXMgd2hlcmUgdGhlIGlucHV0Ci0gKiBzdHJlYW0gY2FuIGJlIHJlZ2FyZGVkIGFzIGFzY2lpIGp1c3QgbG9uZyBlbm91Z2ggdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIHJlYWwKLSAqIGVuY29kaW5nIHNob3VsZCBiZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQnl0ZVJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gQ29kZWRJTy5NQVhfQlVGX1NJWkU7Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGZCdWZmZXI7Ci0KLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtOwotCi0JcHJvdGVjdGVkIEJ5dGVSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJdGhpcyhpbnB1dFN0cmVhbSwgREVGQVVMVF9CVUZGRVJfU0laRSk7Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgaW50IHNpemUpIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmZCdWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkQWhlYWRMaW1pdCkgewotCQl0aGlzLmZJbnB1dFN0cmVhbS5tYXJrKHJlYWRBaGVhZExpbWl0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgYjAgPSB0aGlzLmZJbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCXJldHVybiAoYjAgJiAweDAwRkYpOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNoW10sIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChsZW5ndGggPiB0aGlzLmZCdWZmZXIubGVuZ3RoKSB7Ci0JCQlsZW5ndGggPSB0aGlzLmZCdWZmZXIubGVuZ3RoOwotCQl9Ci0KLQkJaW50IGNvdW50ID0gdGhpcy5mSW5wdXRTdHJlYW0ucmVhZCh0aGlzLmZCdWZmZXIsIDAsIGxlbmd0aCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlpbnQgYjAgPSB0aGlzLmZCdWZmZXJbaV07Ci0JCQkvLyB0aGUgMHgwMEZGIGlzIHRvICJsb3NlIiB0aGUgbmVnYXRpdmUgYml0cyBmaWxsZWQgaW4gdGhlIGJ5dGUgdG8KLQkJCS8vIGludCBjb252ZXJzaW9uCi0JCQkvLyAoYW5kIHdoaWNoIHdvdWxkIGJlIHRoZXJlIGlmIGNhc3QgZGlyZWN0bHkgZnJvbSBieXRlIHRvIGNoYXIpLgotCQkJY2hhciBjMCA9IChjaGFyKSAoYjAgJiAweDAwRkYpOwotCQkJY2hbb2Zmc2V0ICsgaV0gPSBjMDsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5mSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0ucmVzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZklucHV0U3RyZWFtLnNraXAobik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0RURERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0RURERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MmI1YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9EVEREb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiAyOC1BdWctMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVuY29kaW5nLlhNTERvY3VtZW50Q2hhcnNldERldGVjdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBrYm9vCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVEREb2N1bWVudENoYXJzZXREZXRlY3RvciBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIHsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJLy8gYnkgZGVmYXVsdCwgVVRGLTggYXMgcGVyIFhNTCBzcGVjCi0JCWZpbmFsIFN0cmluZyBlbmMgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBlbmM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZUlucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9IG5ldyBYTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCQlkb2N1bWVudEVuY29kaW5nRGV0ZWN0b3Iuc2V0KGZSZWFkZXIpOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gKChYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IpZG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKS5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc2V0KG5ldyBEb2N1bWVudFJlYWRlcihkb2N1bWVudCwgMCkpOwotCi0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvRFRERG9jdW1lbnRMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvRFRERG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4ZjA4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0RURERvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LlN0cnVjdHVyZWREb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRERG9jdW1lbnRMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50TG9hZGVyIHsKLQotCXB1YmxpYyBEVEREb2N1bWVudExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURCgpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlpZiAoZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID0gbmV3IERURERvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3I7Ci0JfQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCXJldHVybiBuZXcgRFREUmVnaW9uUGFyc2VyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihJRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBkZWxpbWl0ZXIgPSBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREKTsKLQkJaWYgKGRlbGltaXRlciA9PSBudWxsKQotCQkJZGVsaW1pdGVyID0gc3VwZXIuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihmaWxlKTsKLQkJcmV0dXJuIGRlbGltaXRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCVN0cmluZyBlbmMgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBlbmM7Ci0JfQotCi0JcHJvdGVjdGVkIElFbmNvZGVkRG9jdW1lbnQgbmV3RW5jb2RlZERvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShnZXRQYXJzZXIoKSk7Ci0JCURURFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIHJlUGFyc2VyID0gbmV3IERURFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCk7Ci0JCXJlUGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudChkb2N1bWVudCk7Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCkuc2V0UmVQYXJzZXIocmVQYXJzZXIpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvTnVsbE1lbWVudG8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvTnVsbE1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA2MDM3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL051bGxNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlczsKLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBhbiBFbmNvZGluZ01lbWVudG8gKGl0cyBzdXBlciBjbGFzcyksCi0gKiB3aGVuIHRoZXJlIGlzIG5vdCBpbiBmYWN0IEFOWSBlbmNvZGluZyBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIHdoZW4gYQotICogc3RydWN0dXJlZERvY3VtZW50IGlzIGNyZWF0ZWQgZGlyZWN0bHkgZnJvbSBhIFN0cmluZwotICovCi1wdWJsaWMgY2xhc3MgTnVsbE1lbWVudG8gZXh0ZW5kcyBFbmNvZGluZ01lbWVudG8gewotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBOdWxsTWVtZW50bygpIHsKLQkJc3VwZXIoKTsKLQkJU3RyaW5nIGRlZmF1bHRDaGFyc2V0ID0gTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy51c2VEZWZhdWx0TmFtZVJ1bGVzKG51bGwpOwotCQlzZXRKYXZhQ2hhcnNldE5hbWUoZGVmYXVsdENoYXJzZXQpOwotCQlzZXRBcHByb3ByaWF0ZURlZmF1bHQoZGVmYXVsdENoYXJzZXQpOwotCQlzZXREZXRlY3RlZENoYXJzZXROYW1lKG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZXZlbnQvSURUREZpbGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9ldmVudC9JRFRERmlsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0OTA5NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9ldmVudC9JRFRERmlsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURUREZpbGVMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCBub2RlQ2hhbmdlZChEVEROb2RlIG5vZGUpOwotCi0JcHVibGljIHZvaWQgbm9kZXNBZGRlZChOb2Rlc0V2ZW50IGV2ZW50KTsKLQotCXB1YmxpYyB2b2lkIG5vZGVzUmVtb3ZlZChOb2Rlc0V2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZXZlbnQvTm9kZXNFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9ldmVudC9Ob2Rlc0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOTcyYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9ldmVudC9Ob2Rlc0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBOb2Rlc0V2ZW50IHsKLQlwcml2YXRlIEFycmF5TGlzdCBjaGFuZ2VkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgdm9pZCBhZGQoRFRETm9kZSBjaGFuZ2VkTm9kZSkgewotCQljaGFuZ2VkTm9kZXMuYWRkKGNoYW5nZWROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROb2RlcygpIHsKLQkJcmV0dXJuIGNoYW5nZWROb2RlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0RURE1vZGVsTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9EVERNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUxYWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0RURE1vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVuY29kaW5nLkRURERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVERNb2RlbExvYWRlciBleHRlbmRzIEFic3RyYWN0TW9kZWxMb2FkZXIgewotCXB1YmxpYyBEVERNb2RlbExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCkgewotCQlpZiAoZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbmV3IERURERvY3VtZW50TG9hZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50TG9hZGVySW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBEVERNb2RlbExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKCkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbmV3IERURE1vZGVsSW1wbCgpOwotCQkvLyBub3cgZG9uZSBpbiBjcmVhdGUKLQkJLy8gbW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJLy8gbW9kZWwuc2V0RmFjdG9yeVJlZ2lzdHJ5KGRlZmF1bHRGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckRURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTBlMTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRFRERG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVuY29kaW5nLkRURERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIE1vZGVsSGFuZGxlckZvckRURCBleHRlbmRzIEFic3RyYWN0TW9kZWxIYW5kbGVyIGltcGxlbWVudHMgSU1vZGVsSGFuZGxlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEFzc29jaWF0ZWRDb250ZW50VHlwZUlkID0gIm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1vZGVsSGFuZGxlcklEID0gIm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTW9kZWxIYW5kbGVyRm9yRFREKCkgewotCQlzdXBlcigpOwotCQlzZXRJZChNb2RlbEhhbmRsZXJJRCk7Ci0JCXNldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IERURERvY3VtZW50TG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlyZXR1cm4gbmV3IERURERvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBEVERNb2RlbExvYWRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wYXJzZXIvRFREUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wYXJzZXIvRFREUmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzljYjhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0RURFJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgRFREUmVnaW9uRmFjdG9yeSB7Ci0JcHVibGljIHN0YXRpYyBJVGV4dFJlZ2lvbiBjcmVhdGVSZWdpb24oU3RyaW5nIHRva2VuS2luZCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCWlmICh0b2tlbktpbmQgIT0gbnVsbCkgewotCQkJLy8gSVNTVUU6IERURCByZWdpb25zIGRvbid0IGRpc3Rpbmd1aXNoIHRleHQgZnJvbSB3aGl0ZSBzcGFjZQotCQkJcmVnaW9uID0gbmV3IENvbnRleHRSZWdpb24odG9rZW5LaW5kLCBzdGFydCwgbGVuZ3RoLCBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25QYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0RURFJlZ2lvblBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmU2ZjE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0RURFJlZ2lvblBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LkRURFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRva2VuaXplci5EVERUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRva2VuaXplci5Ub2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgRFREUmVnaW9uUGFyc2VyIGltcGxlbWVudHMgUmVnaW9uUGFyc2VyIHsKLQlwcml2YXRlIFZlY3RvciBjYWNoZWRSZWdpb25zID0gbnVsbDsKLQlwcml2YXRlIERURFRva2VuaXplciB0b2tlbml6ZXIgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjYWNoZWROb2RlID0gbnVsbDsgLy8gdG9wIG9mIG5vZGUKLQkJCQkJCQkJCQkJCQkJCS8vIGNoYWluCi0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IERURFJlZ2lvblBhcnNlcigpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhZGROZXdOb2RlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlLCBWZWN0b3IgcmVnaW9ucykgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxlYWRpbmdTcGFjZU5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnROb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0cmFpbGluZ1NwYWNlTm9kZSA9IG51bGw7Ci0JCUxpbmtlZExpc3Qgbm9kZVNlZWRzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJaW50IG5SZWdpb25zID0gcmVnaW9ucy5zaXplKCk7Ci0JCWludCBsZWFkaW5nU3BhY2VFbmQgPSAtMTsKLQkJaW50IHRyYWlsaW5nU3BhY2VCZWdpbiA9IG5SZWdpb25zOwotCi0JCS8vIGZpbmQgbGVhZGluZyBzcGFjZQotCQlub2RlU2VlZHMuY2xlYXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUmVnaW9uczsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMuZ2V0KGkpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKGlzQmxhbmtSZWdpb24odHlwZSkpIHsKLQkJCQlsZWFkaW5nU3BhY2VFbmQgPSBpOwotCQkJCW5vZGVTZWVkcy5hZGRMYXN0KHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoIW5vZGVTZWVkcy5pc0VtcHR5KCkpIHsKLQkJCWxlYWRpbmdTcGFjZU5vZGUgPSBjcmVhdGVOb2RlKG5vZGVTZWVkcyk7Ci0JCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCWxhc3ROb2RlLnNldE5leHQobGVhZGluZ1NwYWNlTm9kZSk7Ci0JCQkJbGVhZGluZ1NwYWNlTm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQl9Ci0JCQlsYXN0Tm9kZSA9IGxlYWRpbmdTcGFjZU5vZGU7Ci0JCX0KLQotCQkvLyBmaW5kIHRyYWlsaW5nIHNwYWNlCi0JCWlmIChsZWFkaW5nU3BhY2VFbmQgPCBuUmVnaW9ucyAtIDEpIHsKLQkJCW5vZGVTZWVkcy5jbGVhcigpOwotCQkJZm9yIChpbnQgaSA9IG5SZWdpb25zIC0gMTsgMCA8PSBpOyBpLS0pIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMuZ2V0KGkpOwotCQkJCVN0cmluZyB0eXBlID0gKChJVGV4dFJlZ2lvbikgcmVnaW9ucy5nZXQoaSkpLmdldFR5cGUoKTsKLQkJCQlpZiAoaXNCbGFua1JlZ2lvbih0eXBlKSkgewotCQkJCQl0cmFpbGluZ1NwYWNlQmVnaW4gPSBpOwotCQkJCQlub2RlU2VlZHMuYWRkRmlyc3QocmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghbm9kZVNlZWRzLmlzRW1wdHkoKSkgewotCQkJCXRyYWlsaW5nU3BhY2VOb2RlID0gY3JlYXRlTm9kZShub2RlU2VlZHMpOwotCQkJfQotCi0JCQlub2RlU2VlZHMuY2xlYXIoKTsKLQkJCWZvciAoaW50IGkgPSBsZWFkaW5nU3BhY2VFbmQgKyAxOyBpIDwgdHJhaWxpbmdTcGFjZUJlZ2luOyBpKyspIHsKLQkJCQlub2RlU2VlZHMuYWRkTGFzdChyZWdpb25zLmdldChpKSk7Ci0JCQl9Ci0JCQlpZiAoIW5vZGVTZWVkcy5pc0VtcHR5KCkpIHsKLQkJCQljb250ZW50Tm9kZSA9IGNyZWF0ZU5vZGUobm9kZVNlZWRzKTsKLQkJCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCQlsYXN0Tm9kZS5zZXROZXh0KGNvbnRlbnROb2RlKTsKLQkJCQkJY29udGVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCX0KLQkJCQlsYXN0Tm9kZSA9IGNvbnRlbnROb2RlOwotCQkJfQotCQkJaWYgKHRyYWlsaW5nU3BhY2VOb2RlICE9IG51bGwpIHsKLQkJCQlsYXN0Tm9kZS5zZXROZXh0KHRyYWlsaW5nU3BhY2VOb2RlKTsKLQkJCQl0cmFpbGluZ1NwYWNlTm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQkJbGFzdE5vZGUgPSB0cmFpbGluZ1NwYWNlTm9kZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBsYXN0Tm9kZTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlTm9kZShMaW5rZWRMaXN0IHJlZ2lvbnMpIHsKLQkJaWYgKHJlZ2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gRFREU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5jcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oRFREU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5EVERfR0VORVJJQyk7Ci0JCWludCBzdGFydCA9ICgoSVRleHRSZWdpb24pIHJlZ2lvbnMuZ2V0Rmlyc3QoKSkuZ2V0U3RhcnQoKTsKLQkJaW50IGxlbmd0aCA9ICgoSVRleHRSZWdpb24pIHJlZ2lvbnMuZ2V0TGFzdCgpKS5nZXRFbmQoKSAtIHN0YXJ0OwotCQlub2RlLnNldFN0YXJ0KHN0YXJ0KTsKLQkJbm9kZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3IgaSA9IHJlZ2lvbnMubGlzdEl0ZXJhdG9yKDApOyBpLmhhc05leHQoKTspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQlub2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1zdGFydCk7Ci0JCX0KLQkJbm9kZS5zZXRFbmRlZCh0cnVlKTsKLQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlTm9kZUNoYWluKExpc3QgcmVnaW9ucykgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG51bGw7Ci0JCVZlY3RvciBub2RlU2VlZHMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOyBlLmhhc05leHQoKTspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkvLyBJZiB0aGUgZm9sbG93aW5nIHJlZ2lvbnMgYXBwZWFyLAotCQkJLy8gYSBwcmV2aW91cyBub2RlIGlzIGNsb3NlZCBpbiBmcm9udCBvZiBpdC4KLQkJCWlmICghbm9kZVNlZWRzLmlzRW1wdHkoKSAmJiBpc0JlZ2lubmluZ1JlZ2lvbih0eXBlKSkgewotCQkJCWxhc3ROb2RlID0gYWRkTmV3Tm9kZXMobGFzdE5vZGUsIG5vZGVTZWVkcyk7Ci0JCQkJbm9kZVNlZWRzLmNsZWFyKCk7Ci0JCQl9Ci0JCQlub2RlU2VlZHMuYWRkRWxlbWVudChyZWdpb24pOwotCi0JCQkvLyBUaGUgZm9sbG93aW5nIHJlZ2lvbnMgY2xvc2UgdGhlIGN1cnJlbnQgbm9kZS4KLQkJCWlmICghbm9kZVNlZWRzLmlzRW1wdHkoKSAmJiBpc0VuZGluZ1JlZ2lvbih0eXBlKSkgewotCQkJCWxhc3ROb2RlID0gYWRkTmV3Tm9kZXMobGFzdE5vZGUsIG5vZGVTZWVkcyk7Ci0JCQkJbm9kZVNlZWRzLmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCWlmIChoZWFkTm9kZSA9PSBudWxsICYmIGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQloZWFkTm9kZSA9IGZpbmRGaXJzdE5vZGUobGFzdE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gY2xvc2UgY3VycmVudCBub2RlIGZvcmNpYmx5LgotCQlpZiAoIW5vZGVTZWVkcy5pc0VtcHR5KCkpIHsKLQkJCWxhc3ROb2RlID0gYWRkTmV3Tm9kZXMobGFzdE5vZGUsIG5vZGVTZWVkcyk7Ci0JCQlpZiAoaGVhZE5vZGUgPT0gbnVsbCAmJiBsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJaGVhZE5vZGUgPSBmaW5kRmlyc3ROb2RlKGxhc3ROb2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGVhZE5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpbmRGaXJzdE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gbm9kZTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2Tm9kZSA9IG51bGw7Ci0JCXdoaWxlICgocHJldk5vZGUgPSBmaXJzdE5vZGUuZ2V0UHJldmlvdXMoKSkgIT0gbnVsbCkgewotCQkJZmlyc3ROb2RlID0gcHJldk5vZGU7Ci0JCX0KLQkJcmV0dXJuIGZpcnN0Tm9kZTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCWlmIChjYWNoZWROb2RlICE9IG51bGwpIHsKLQkJCXJldHVybiBjYWNoZWROb2RlOwotCQl9Ci0KLQkJTGlzdCByZWdpb25zID0gZ2V0UmVnaW9ucygpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gY3JlYXRlTm9kZUNoYWluKHJlZ2lvbnMpOwotCQljYWNoZWROb2RlID0gaGVhZE5vZGU7Ci0KLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCWlmIChjYWNoZWRSZWdpb25zICE9IG51bGwpIHsKLQkJCXJldHVybiBjYWNoZWRSZWdpb25zOwotCQl9Ci0KLQkJVmVjdG9yIHJlZ2lvbnMgPSBuZXcgVmVjdG9yKCk7Ci0JCVRva2VuIGN1cnJlbnRUb2tlbiA9IG51bGw7Ci0JCWRvIHsKLQkJCXRyeSB7Ci0JCQkJY3VycmVudFRva2VuID0gKFRva2VuKSB0b2tlbml6ZXIueXlsZXgoKTsKLQkJCQlpZiAoY3VycmVudFRva2VuICE9IG51bGwpIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gRFREUmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24oY3VycmVudFRva2VuLmdldFR5cGUoKSwgY3VycmVudFRva2VuLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnJlbnRUb2tlbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCXJlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG9wZW5pbmcgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJd2hpbGUgKGN1cnJlbnRUb2tlbiAhPSBudWxsKTsKLQotCQljYWNoZWRSZWdpb25zID0gcmVnaW9uczsKLQkJcmV0dXJuIHJlZ2lvbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoUmVhZGVyIHJlYWRlcikgewotCQlpZiAodG9rZW5pemVyID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJdG9rZW5pemVyID0gbmV3IERURFRva2VuaXplcihyZWFkZXIpOwotCQkJfQotCQkJY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEgRFREVG9rZW5pemVyIDxpbnB1dGZpbGU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJdG9rZW5pemVyLnl5cmVzZXQocmVhZGVyKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG9wZW5pbmcgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQljYWNoZWROb2RlID0gbnVsbDsKLQkJY2FjaGVkUmVnaW9ucyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQW4gYWRkaXRpb25hbCBvZmZzZXQgZm9yIHVzZSB3aXRoIGFueSBwb3NpdGlvbi1kZXBlbmRhbnQgcGFyc2luZyBydWxlcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIsIGludCBvZmZzZXQpIHsKLQkJcmVzZXQocmVhZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgaW5wdXQpIHsKLQkJcmVzZXQobmV3IFN0cmluZ1JlYWRlcihpbnB1dCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFN0cmluZyBpbnB1dCwgaW50IG9mZnNldCkgewotCQlyZXNldChpbnB1dCk7Ci0JfQotCi0JLy8gbmV2ZXIgdXNlZAotCURURFRva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCXJldHVybiB0b2tlbml6ZXI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQmVnaW5uaW5nUmVnaW9uKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5TVEFSVF9UQUcpIHx8ICh0eXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9QQVJNKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNCbGFua1JlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5kaW5nUmVnaW9uKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTkRfVEFHKSB8fCAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfUEFSTSkgfHwgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0RURFJlZ2lvblR5cGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25UeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTRiNjYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0RURFJlZ2lvblR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotcHVibGljIGludGVyZmFjZSBEVERSZWdpb25UeXBlcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVnaW9uUHJlZml4ID0gIm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLnBhcnNlci5EVERSZWdpb25UeXBlcy4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gcmVnaW9uUHJlZml4ICsgIk5BTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVEFHID0gcmVnaW9uUHJlZml4ICsgIlNUQVJUX1RBRyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfVEFHID0gcmVnaW9uUHJlZml4ICsgIkVORF9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVGVF9QQVJFTiA9IHJlZ2lvblByZWZpeCArICJMRUZUX1BBUkVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJJR0hUX1BBUkVOID0gcmVnaW9uUHJlZml4ICsgIlJJR0hUX1BBUkVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdISVRFU1BBQ0UgPSByZWdpb25QcmVmaXggKyAiV0hJVEVTUEFDRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1IgPSByZWdpb25QcmVmaXggKyAiQ09OTkVDVE9SIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0NDVVJfVFlQRSA9IHJlZ2lvblByZWZpeCArICJPQ0NVUl9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0xBTUFUSU9OID0gcmVnaW9uUHJlZml4ICsgIkVYQ0xBTUFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUkNFTlQgPSByZWdpb25QcmVmaXggKyAiUEVSQ0VOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRU1JQ09MT04gPSByZWdpb25QcmVmaXggKyAiU0VNSUNPTE9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfU1RBUlQgPSByZWdpb25QcmVmaXggKyAiQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0NPTlRFTlQgPSByZWdpb25QcmVmaXggKyAiQ09NTUVOVF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfRU5EID0gcmVnaW9uUHJlZml4ICsgIkNPTU1FTlRfRU5EIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05fVEFHID0gcmVnaW9uUHJlZml4ICsgIk5PVEFUSU9OX1RBRyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTl9DT05URU5UID0gcmVnaW9uUHJlZml4ICsgIk5PVEFUSU9OX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfVEFHID0gcmVnaW9uUHJlZml4ICsgIkVOVElUWV9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1BBUk0gPSByZWdpb25QcmVmaXggKyAiRU5USVRZX1BBUk0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0NPTlRFTlQgPSByZWdpb25QcmVmaXggKyAiRU5USVRZX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkRBVEFfVkFMVUUgPSByZWdpb25QcmVmaXggKyAiTkRBVEFfVkFMVUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RBRyA9IHJlZ2lvblByZWZpeCArICJFTEVNRU5UX1RBRyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0NPTlRFTlQgPSByZWdpb25QcmVmaXggKyAiRUxFTUVOVF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRU1QVFkgPSByZWdpb25QcmVmaXggKyAiQ09OVEVOVF9FTVBUWSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0FOWSA9IHJlZ2lvblByZWZpeCArICJDT05URU5UX0FOWSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1BDREFUQSA9IHJlZ2lvblByZWZpeCArICJDT05URU5UX1BDREFUQSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVExJU1RfVEFHID0gcmVnaW9uUHJlZml4ICsgIkFUVExJU1RfVEFHIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiU1lTVEVNX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiUFVCTElDX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkRBVEFfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJOREFUQV9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRVFVT1RFRF9MSVRFUkFMID0gcmVnaW9uUHJlZml4ICsgIlNJTkdMRVFVT1RFRF9MSVRFUkFMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRVFVT1RFRF9MSVRFUkFMID0gcmVnaW9uUHJlZml4ICsgIkRPVUJMRVFVT1RFRF9MSVRFUkFMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV05fQ09OVEVOVCA9IHJlZ2lvblByZWZpeCArICJVTktOT1dOX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTkFNRSA9IHJlZ2lvblByZWZpeCArICJBVFRSSUJVVEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGF0dHJpYnV0ZSB0eXBlIGtleXdvcmRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJDREFUQV9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiSURfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRFJFRl9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIklEUkVGX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUZTX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiSURSRUZTX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiRU5USVRZX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRJRVNfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJFTlRJVElFU19LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU5fS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJOTVRPS0VOX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTlNfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJOTVRPS0VOU19LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiTk9UQVRJT05fS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlVNX0NIT0lDRSA9IHJlZ2lvblByZWZpeCArICJFTlVNX0NIT0lDRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX0VOVElUWV9UWVBFID0gcmVnaW9uUHJlZml4ICsgIlBBUk1fRU5USVRZX1RZUEUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBhdHRyaWJ1dGUgZGVmYXVsdHMga2V5d29yZHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRF9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIlJFUVVJUkVEX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTElFRF9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIklNUExJRURfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSVhFRF9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIkZJWEVEX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi19Ly8gRFREUmVnaW9uVHlwZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZmI2NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlUGx1Z2luOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIERURCBDb3JlIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKTsKLQotCQkvLyB0aGlzIGNvdWxkIGJlIG1hZGUgc21hcnRlciBieSBhY3R1YWxseSBsb29raW5nIHVwIHRoZSBjb250ZW50Ci0JCS8vIHR5cGUncyB2YWxpZCBleHRlbnNpb25zCi0JCW5vZGUucHV0KERURENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04sICJkdGQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNDhlMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIENvbW1vbiBwcmVmZXJlbmNlIGtleXMgdXNlZCBieSBEVEQgY29yZQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIERURENvcmVQcmVmZXJlbmNlTmFtZXMgewotCXByaXZhdGUgRFREQ29yZVByZWZlcmVuY2VOYW1lcygpIHsKLQkJLy8gZW1wdHkgcHJpdmF0ZSBjb25zdHJ1Y3RvciBzbyB1c2VycyBjYW5ub3QgaW5zdGFudGlhdGUgY2xhc3MKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBleHRlbnNpb24gdG8gdXNlIHdoZW4gbm9uZSBpcyBzcGVjaWZpZWQgaW4gdGhlIE5ldyBGaWxlCi0JICogV2l6YXJkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWFRFTlNJT04gPSAiZGVmYXVsdEV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckRURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNzU4ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGlzIGNsYXNzLCB3aXRoIGl0cyBvbmUgZmllbGQsIGlzIGEgY29udmVuaWVuY2UgdG8gcHJvdmlkZSBjb21waWxlLXRpbWUKLSAqIHNhZmV0eSB3aGVuIHJlZmVycmluZyB0byB0aGUgRFREIGNvbnRlbnRUeXBlIElELgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkLgotICogPC9wPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50VHlwZUlkRm9yRFREIHsKLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIENvbnRlbnRUeXBlSURfRFREIGlkIGZpZWxkIHdpbGwgbWF0Y2ggd2hhdCBpcwotCSAqIHNwZWNpZmllZCBpbiBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvcGx1Z2luLnhtbCBmb3IgdGhlIERURCBjb250ZW50Ci0JICogdHlwZS4KLQkgKiAKLQkgKiBUaGlzIHZhbHVlIGlzIGludGVudGlvbmFsbHkgc2V0IHRocm91Z2ggYSBkZWZhdWx0IHByb3RlY3RlZCBtZXRob2Qgc28KLQkgKiB0aGF0IGl0IHdpbGwgbm90IGJlIGlubGluZWQuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9EVEQgPSBnZXRDb25zdGFudFN0cmluZygpOwotCi0JcHJpdmF0ZSBDb250ZW50VHlwZUlkRm9yRFREKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIERURCBDb250ZW50IFR5cGUgSWRlbnRpZmllciBJRCBhcyBhIFN0cmluZwotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0Q29uc3RhbnRTdHJpbmcoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0RURE1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0RURE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YzcwMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9EVERNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0vKioKLSAqIDxwPgotICogQW4gaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoZSBTU0UtYmFzZWQgRFREIG1vZGVsLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERURE1vZGVsIGV4dGVuZHMgSVN0cnVjdHVyZWRNb2RlbHsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JRFREUGFydGl0aW9uVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JRFREUGFydGl0aW9uVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMzNWY3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSURURFBhcnRpdGlvblR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uIHR5cGVzIERURC4KLSAqIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBkZXByZWNhdGVkIHVzZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudGV4dC5JRFREUGFydGl0aW9ucwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEVERQYXJ0aXRpb25UeXBlcyB7Ci0JCi0JU3RyaW5nIERURF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLndzdC5kdGQuREVGQVVMVCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGFza3MvRFRERmlsZVRhc2tTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rhc2tzL0RUREZpbGVUYXNrU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzdlMjdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGFza3MvRFRERmlsZVRhc2tTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRhc2tzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrcy5TdHJ1Y3R1cmVkRmlsZVRhc2tTY2FubmVyOwotCi1wdWJsaWMgY2xhc3MgRFRERmlsZVRhc2tTY2FubmVyIGV4dGVuZHMgU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lciB7Ci0JcHVibGljIERUREZpbGVUYXNrU2Nhbm5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJcmV0dXJuIHRleHRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5DT01NRU5UX0NPTlRFTlQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L0RURFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZTFhMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L0RURFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci0KLQotcHVibGljIGNsYXNzIERURFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgewotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ3Jvc3NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Cb3VuZHJ5Q2FzZXMoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmU3RhcnQpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZE5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgLSAxKTsKLQkJcmV0dXJuIHJlcGFyc2Uoc3RhcnROb2RlLmdldFN0YXJ0KCksIGVuZE5vZGUuZ2V0RW5kKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBhcnNlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlTdGFydCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkaXJ0eUVuZCkgewotCQlyZXR1cm4gc3VwZXIucmVwYXJzZShkaXJ0eVN0YXJ0LCBkaXJ0eUVuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L0RURFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZDJjMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L0RURFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIERURFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERURF9HRU5FUklDID0gNTsKLQotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW50IHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZSA9IG51bGw7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBEVERfR0VORVJJQyA6Ci0JCQkJaW5zdGFuY2UgPSBuZXcgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvUmVnaW9uSXRlcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9SZWdpb25JdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTkxYjJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9SZWdpb25JdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgUmVnaW9uSXRlcmF0b3IgewotCi0JcHJpdmF0ZSBpbnQgY3VycmVudEluZGV4OwotCi0JLy8gcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCXByaXZhdGUgSVRleHRSZWdpb25MaXN0IHJlZ2lvbnM7Ci0JLy8gcHJpdmF0ZSBpbnQgc3RhcnRPZmZzZXQsIGVuZE9mZnNldDsKLQlwcml2YXRlIElUZXh0UmVnaW9uIHN0YXJ0UmVnaW9uLCBlbmRSZWdpb247Ci0KLQlwdWJsaWMgUmVnaW9uSXRlcmF0b3IoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCXRoaXMobm9kZSwgbm9kZS5nZXRTdGFydCgpLCBub2RlLmdldEVuZCgpKTsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uSXRlcmF0b3IoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlLCBpbnQgc3RhcnRPZmZzZXQsIGludCBlbmRPZmZzZXQpIHsKLQkJcmVnaW9ucyA9IG5vZGUuZ2V0UmVnaW9ucygpOwotCQlzdGFydFJlZ2lvbiA9IG5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnRPZmZzZXQpOwotCQllbmRSZWdpb24gPSBub2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGVuZE9mZnNldCAtIDEpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoc3RhcnRSZWdpb24gPT0gcmVnaW9uKSB7Ci0JCQkJY3VycmVudEluZGV4ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBSZWdpb25JdGVyYXRvcihJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQl0aGlzLnJlZ2lvbnMgPSByZWdpb25zOwotCQlzdGFydFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQllbmRSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQljdXJyZW50SW5kZXggPSAwOwotCQkvLyB0aGlzKG5vZGUsIG5vZGUuZ2V0U3RhcnQoKSwgbm9kZS5nZXRFbmQoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJaWYgKGN1cnJlbnRJbmRleCA8IHJlZ2lvbnMuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gY3VycmVudEluZGV4IDw9IHJlZ2lvbnMuaW5kZXhPZihlbmRSZWdpb24pOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJaWYgKGN1cnJlbnRJbmRleCA+PSAwKSB7Ci0JCQlyZXR1cm4gY3VycmVudEluZGV4ID49IHJlZ2lvbnMuaW5kZXhPZihzdGFydFJlZ2lvbik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBuZXh0KCkgewotCQlpZiAoaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gcmVnaW9ucy5nZXQoY3VycmVudEluZGV4KyspOwotCQl9Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIHByZXZpb3VzKCkgewotCQlpZiAoaGFzUHJldmlvdXMoKSkgewotCQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KC0tY3VycmVudEluZGV4KTsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDJiZDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS50ZXh0LklEVERQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgewotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyI2dldERlZmF1bHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKSB7Ci0JCXJldHVybiBJRFREUGFydGl0aW9ucy5EVERfREVGQVVMVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIjaW5pdExlZ2FsQ29udGVudFR5cGVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0TGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCWZTdXBwb3J0ZWRUeXBlcyA9IG5ldyBTdHJpbmdbXXtJRFREUGFydGl0aW9ucy5EVERfREVGQVVMVCwgSVN0cnVjdHVyZWRQYXJ0aXRpb25zLlVOS05PV05fUEFSVElUSU9OfTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciNuZXdJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9EVERUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL0RURFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmJiNDk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL0RURFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMy41IG9uIDMvMTQvMDUgOTozNyBQTSAqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLQotLyoqIAotICogR2VuZXJhdGUgd2l0aCAiZHRkc2tlbGV0b24iLgotICoKLSAqIEl0IHJlbW92ZXMgc29tZSB1bnVzZWQgZmllbGRzIGFuZCBhdm9pZHMgc29tZSBjb21waWxlciB3YXJuaW5ncyAKLSAqLwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5qZmxleC5kZS8iPkpGbGV4PC9hPiAxLjMuNQotICogb24gMy8xNC8wNSA5OjM3IFBNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PmZpbGU6L0Q6L2VjbGlwc2Uud3RwL3dvcmtzcGFjZS9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvZHRkLmZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgRFREVG9rZW5pemVyIHsKLQotICAvKiogVGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogaW5pdGlhbCBzaXplIG9mIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9CVUZGRVJTSVpFID0gMTYzODQ7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEFUVFJJQlVURV9FTlVNRVJBVElPTiA9IDEzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBOT1RBVElPTl9OQU1FID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRUxFTUVOVF9DSElMRCA9IDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEVOVElUWV9DT05URU5UID0gNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQ09NTUVOVF9DT05URU5UID0gODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQVRUTElTVF9OQU1FID0gOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRVhURVJOQUxJRF9DT05URU5UID0gNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRUxFTUVOVF9DT05URU5UID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRUxFTUVOVF9NSVhFRCA9IDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEVMRU1FTlRfTUlYRURfT1JfQ0hJTEQgPSAxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBBVFRSSUJVVEVfQ09OVEVOVCA9IDExOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFTlRJVFlfTkFNRSA9IDM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEFUVFJJQlVURV9ERUZBVUxUID0gMTI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEVMRU1FTlRfTkFNRSA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE5EQVRBX0NPTlRFTlQgPSA1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBBVFRMSVNUX0NPTlRFTlQgPSAxMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTk9ERSA9IDE7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gCi0gICAgIlwxMFwwXDFcMFwxXDVcMVwzXDFcMFwxXDBcMVwyXDIyXDBcMVw1XDFcNiIrCi0gICAgIlwxXDFcMVwzN1wxXDBcMVwyM1wxXDBcMVw0NlwxXDQyXDFcNDNcMVw0XDFcNyIrCi0gICAgIlwxXDQ1XDFcMTJcMVwwXDFcMFwxMlwwXDFcMFwxXDEwXDFcMTFcMVwwXDFcMTMiKwotICAgICJcMVw0XDFcMFwxXDI1XDFcMzFcMVwzMlwxXDMzXDFcMTRcMVwzNVwyXDBcMVwyMSIrCi0gICAgIlwxXDBcMVwzNlwxXDE1XDFcMTZcMVwxN1wxXDI0XDFcMjdcMVw0MFwxXDM0XDFcMjYiKwotICAgICJcMVwyMFwxXDMwXDJcMFwxXDQxXDFcMjJcMVwwXDFcMFwxXDBcMlwwXDFcMCIrCi0gICAgIlwxXDBcMzJcMFwxXDBcMVw0NFx1ZmY4M1wwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgYSBzdGF0ZSB0byBhIHJvdyBpbmRleCBpbiB0aGUgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5X3Jvd01hcCBbXSA9IHsgCi0gICAgICAgIDAsICAgIDM5LCAgICA3OCwgICAxMTcsICAgMTU2LCAgIDE5NSwgICAyMzQsICAgMjczLCAgIDMxMiwgICAzNTEsIAotICAgICAgMzkwLCAgIDQyOSwgICA0NjgsICAgNTA3LCAgIDU0NiwgICA1ODUsICAgNjI0LCAgICAzOSwgICAgMzksICAgIDM5LCAKLSAgICAgIDY2MywgICA3MDIsICAgNzQxLCAgIDc4MCwgICA4MTksICAgIDM5LCAgICAzOSwgICA4NTgsICAgODk3LCAgICAzOSwgCi0gICAgICAgMzksICAgOTM2LCAgIDkzNiwgICA5NzUsICAxMDE0LCAgMTA1MywgIDEwOTIsICAxMTMxLCAgMTE3MCwgIDEyMDksIAotICAgICAxMjQ4LCAgMTI4NywgIDEzMjYsICAxMzY1LCAgMTQwNCwgIDE0NDMsICAgIDM5LCAgMTQ4MiwgIDE1MjEsICAxNTYwLCAKLSAgICAgMTU5OSwgIDE2MzgsICAgIDM5LCAgMTY3NywgIDE3MTYsICAxNzU1LCAgMTc5NCwgIDE4MzMsICAxODcyLCAgICAzOSwgCi0gICAgICAgMzksICAxOTExLCAgMTk1MCwgIDE5ODksICAyMDI4LCAgMjA2NywgIDIxMDYsICAgIDM5LCAgICAzOSwgICAgMzksIAotICAgICAyMTQ1LCAgMjE4NCwgIDIyMjMsICAyMjYyLCAgMjMwMSwgIDIzNDAsICAyMzc5LCAgIDg5NywgIDI0MTgsICAgOTc1LCAKLSAgICAgMjQ1NywgIDI0OTYsICAyNTM1LCAgMjU3NCwgICA5NzUsICAyNjEzLCAgMjY1MiwgIDI2OTEsICAyNzMwLCAgMTU2MCwgCi0gICAgIDI3NjksICAyODA4LCAgMjg0NywgIDI4ODYsICAyOTI1LCAgMjk2NCwgIDMwMDMsICAzMDQyLCAgMzA4MSwgIDMxMjAsIAotICAgICAxOTUwLCAgMzE1OSwgIDMxOTgsICAzMjM3LCAgMzI3NiwgIDMzMTUsICAxOTUwLCAgICAzOSwgIDMzNTQsICAzMzkzLCAKLSAgICAgMzQzMiwgICAgMzksICAzNDcxLCAgMzUxMCwgIDM1NDksICAgIDM5LCAgMzU4OCwgIDM2MjcsICAgIDM5LCAgMzY2NiwgCi0gICAgIDM3MDUsICAzNzQ0LCAgICAzOSwgICAgMzksICAzNzgzLCAgMzgyMiwgIDM4NjEsICAzOTAwLCAgMzkzOSwgIDM5NzgsIAotICAgICA0MDE3LCAgNDA1NiwgICAgMzksICA0MDk1LCAgNDEzNCwgIDQxNzMsICAgIDM5LCAgNDIxMiwgIDQyNTEsICA0MjkwLCAKLSAgICAgNDMyOSwgIDQzNjgsICA0NDA3LCAgNDQ0NiwgIDQ0ODUsICA0NTI0LCAgNDU2MywgIDQ2MDIsICA0NjQxLCAgNDY4MCwgCi0gICAgIDQ3MTksICA0NzU4LCAgNDc5NywgIDQ4MzYsICA0ODc1LCAgNDkxNCwgIDQ5NTMsICA0OTkyLCAgNTAzMSwgIDUwNzAsIAotICAgICA1MTA5LCAgNTE0OCwgIDUxODcsICA1MjI2LCAgNTI2NSwgIDUzMDQsICA1MzQzLCAgIDk3NSwgIDUzODIsICA1NDIxLCAKLSAgICAgNTQ2MCwgIDU0OTksICA1NTM4LCAgNTU3NywgIDE1NjAsICA1NjE2LCAgNTY1NSwgIDU2OTQsICA1NzMzLCAgNTc3MiwgCi0gICAgIDU4MTEsICA1ODUwLCAgIDU0NiwgIDU4ODksICA1OTI4LCAgNTk2NywgIDYwMDYsICAgOTc1LCAgIDk3NSwgICA5NzUsIAotICAgICA2MDQ1LCAgMTU2MCwgIDYwODQsICA2MTIzLCAgMTU2MCwgIDYxNjIsICA2MjAxLCAgNjI0MCwgIDE5NTAsICAgNTQ2LCAKLSAgICAgNjI3OSwgICA1NDYsICAgODE5LCAgNjMxOCwgIDYzNTcsICA2Mzk2LCAgNjQzNSwgIDY0NzQsICA2NTEzLCAgIDU0NiwgCi0gICAgIDY1NTIsICAxNTYwLCAgMTU2MCwgIDE1NjAsICAxOTUwLCAgNjU5MSwgICAgMzksICAxOTUwCi0gIH07Ci0KLSAgLyoqIAotICAgKiBUaGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQSAocGFydCAwKQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5X3BhY2tlZDAgPSAKLSAgICAiXDJcMTdcMlwyMFwxXDE3XDFcMjBcMVwyMVwxXDE3XDFcMjJcMVwyMyIrCi0gICAgIlwxXDE3XDFcMjRcMVwyNVwyXDE3XDFcMjZcM1wxN1wxXDI3XDFcMTciKwotICAgICJcMVwzMFwyMVwxN1w0N1wwXDJcMzFcMlwyMFwxXDMyXDFcMjBcMVwwIisKLSAgICAiXDFcMzJcMVwzMVwxXDMzXDFcMzFcMVwzM1wyM1wzMVwxXDM0XDJcMzEiKwotICAgICJcMVwzNVwxXDM2XDJcMzdcMVwzMVwyXDQwXDJcMjBcMVwwXDFcMjAiKwotICAgICJcM1w0MFwxXDMzXDFcNDBcMVwzM1w3XDQwXDFcNDFcMTZcNDBcNFwwIisKLSAgICAiXDFcNDBcMVw0MlwxXDQzXDJcMjBcMVw0MlwxXDIwXDNcNDJcMVwzMyIrCi0gICAgIlwxXDQyXDFcMzNcMTJcNDJcMVw0NFwxXDQ1XDE2XDQyXDFcNDZcMlw0NyIrCi0gICAgIlwyXDIwXDFcNDdcMVwyMFwzXDQ3XDFcMzNcMVw0N1wxXDMzXDMzXDQ3IisKLSAgICAiXDJcNTBcMlwyMFwxXDBcMVwyMFwyXDBcMVw1MFwxXDMzXDFcNTAiKwotICAgICJcMVwzM1wyNlw1MFw0XDBcMVw1MFwxXDQyXDFcNDNcMlwyMFwxXDQyIisKLSAgICAiXDFcMjBcM1w0MlwxXDMzXDFcNDJcMVwzM1wzXDQyXDFcNTFcNlw0MiIrCi0gICAgIlwxXDUyXDFcNTNcMTZcNDJcMVw0NlwyXDU0XDJcNTVcMVw1NFwxXDU1IisKLSAgICAiXDRcNTRcMVw1NlwxXDU3XDMzXDU0XDJcNjBcMlwyMFwxXDQyXDFcMjAiKwotICAgICJcMlw0MlwxXDYwXDFcMzNcMVw2MFwxXDMzXDI2XDYwXDRcNDJcMVw2MCIrCi0gICAgIlwyXDYxXDJcMjBcMVw0MlwxXDIwXDJcNDJcMVw2MVwxXDMzXDFcNjEiKwotICAgICJcMVwzM1wyNlw2MVw0XDQyXDFcNjFcMVw2MlwxXDYzXDFcNjRcMVw2NSIrCi0gICAgIlwxXDYyXDFcNjZcM1w2MlwxXDMzXDFcNjJcMVwzM1wxXDY3XDJcNjIiKwotICAgICJcMVw3MFwxXDYyXDFcNzFcMTBcNjJcMVw3Mlw0XDYyXDFcNzNcMlw2MiIrCi0gICAgIlwxXDc0XDJcNzVcMVw2MlwxXDc2XDFcNzdcMVwxMDBcMlwyMFwxXDc3IisKLSAgICAiXDFcMjBcM1w3N1wxXDMzXDFcNzdcMVwzM1wyM1w3N1wxXDEwMVw2XDc3IisKLSAgICAiXDFcMTAyXDJcMTAzXDJcMjBcMVwxMDNcMVwyMFwzXDEwM1wxXDMzXDFcMTAzIisKLSAgICAiXDFcMzNcMjZcMTAzXDFcMTA0XDFcMTA1XDFcMTA2XDJcMTAzXDJcMTdcMlwwIisKLSAgICAiXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDdcMTdcMVwwIisKLSAgICAiXDIzXDE3XDJcMFwyXDIwXDFcMFwxXDIwXDUzXDBcMVwxMDdcMzRcMCIrCi0gICAgIlwyXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMCIrCi0gICAgIlwxXDE3XDFcMTEwXDFcMTdcMVwxMTFcM1wxN1wxXDBcMjVcMTdcMlwwIisKLSAgICAiXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDdcMTdcMVwwIisKLSAgICAiXDFcMTEyXDIyXDE3XDJcMTEzXDJcMFwxXDExM1wyXDBcMVwxMTNcMlwwIisKLSAgICAiXDFcMTEzXDFcMFw3XDExM1wxXDBcMjNcMTEzXDJcMTdcMlwwXDFcMTciKwotICAgICJcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDRcMTdcMVwxMTRcMlwxNyIrCi0gICAgIlwxXDBcMjNcMTdcMlwzMVw2XDBcMVwzMVwxXDBcMVwzMVwxXDAiKwotICAgICJcMjZcMzFcNFwwXDNcMzFcNlwwXDFcMzFcMVwwXDFcMzFcMVwwIisKLSAgICAiXDEzXDMxXDFcMTE1XDEyXDMxXDRcMFwxXDMxXDJcMFwyXDExNlwxXDAiKwotICAgICJcMVwxMTZcMzFcMFwxXDExN1w3XDBcMlw0MFw0XDBcM1w0MFwxXDAiKwotICAgICJcMVw0MFwxXDBcMjZcNDBcNFwwXDFcNDBcMlw0MlwyXDBcMVw0MiIrCi0gICAgIlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMzNcNDJcMVw0M1wxXDEyMCIrCi0gICAgIlwyXDEyMVwxXDQzXDFcMTIxXDNcNDNcMVwxMjFcMVw0M1wxXDEyMVwzM1w0MyIrCi0gICAgIlwyXDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyXDFcMCIrCi0gICAgIlw2XDQyXDFcMTIyXDI2XDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMCIrCi0gICAgIlwxXDQyXDFcMFwxNFw0MlwxXDEyM1wxNlw0MlwyXDQ2XDJcMTI0XDFcNDYiKwotICAgICJcMVwxMjRcM1w0NlwxXDEyNFwxXDQ2XDFcMTI0XDMyXDQ2XDFcMTI1XDJcNDciKwotICAgICJcMlwwXDFcNDdcMVwwXDNcNDdcMVwwXDFcNDdcMVwwXDMzXDQ3IisKLSAgICAiXDJcNTBcNlwwXDFcNTBcMVwwXDFcNTBcMVwwXDI2XDUwXDRcMCIrCi0gICAgIlwxXDUwXDJcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDIiKwotICAgICJcMVwwXDE3XDQyXDFcMTI2XDE1XDQyXDJcMFwxXDQyXDFcMFwzXDQyIisKLSAgICAiXDFcMFwxXDQyXDFcMFw2XDQyXDFcMTI3XDI2XDQyXDJcMFwxXDQyIisKLSAgICAiXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwxNFw0MlwxXDEzMFwxNlw0MiIrCi0gICAgIlwxMlw1NFwyXDBcMzVcNTRcMlw1NVwxXDU0XDFcNTVcNFw1NFwyXDAiKwotICAgICJcMzNcNTRcMTJcMFwxXDEzMVwzNFwwXDJcNjBcMlwwXDFcNDJcMVwwIisKLSAgICAiXDJcNDJcMVw2MFwxXDBcMVw2MFwxXDBcMjZcNjBcNFw0MlwxXDYwIisKLSAgICAiXDJcNjFcMlwwXDFcNDJcMVwwXDJcNDJcMVw2MVwxXDBcMVw2MSIrCi0gICAgIlwxXDBcMjZcNjFcNFw0MlwxXDYxXDJcNjJcMlwwXDFcNjJcMVwwIisKLSAgICAiXDNcNjJcMVwwXDFcNjJcMVwwXDI2XDYyXDNcMFwyXDYyXDFcNjMiKwotICAgICJcMVwxMzJcMlwxMzNcMVw2M1wxXDEzM1wzXDYzXDFcMTMzXDFcNjNcMVwxMzMiKwotICAgICJcMjZcNjNcM1wxMzNcMlw2M1wzXDBcMVw2NVw1MFwwXDFcNjZcNDFcMCIrCi0gICAgIlwyXDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMCIrCi0gICAgIlwzXDYyXDFcMTM0XDIyXDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMCIrCi0gICAgIlwzXDYyXDFcMFwxXDYyXDFcMFwyXDYyXDFcMTM1XDVcNjJcMVwxMzYiKwotICAgICJcMTVcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwIisKLSAgICAiXDFcNjJcMVwwXDE3XDYyXDFcMTM3XDZcNjJcM1wwXDRcNjJcMlwwIisKLSAgICAiXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDE3XDYyXDFcMTQwIisKLSAgICAiXDZcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwIisKLSAgICAiXDFcNjJcMVwwXDVcNjJcMVwxNDFcMTJcNjJcMVwxNDJcMVwxNDNcNFw2MiIrCi0gICAgIlwzXDBcMlw2MlwyXDc2XDJcMTQ0XDFcNzZcMVwxNDRcM1w3NlwxXDE0NCIrCi0gICAgIlwxXDc2XDFcMTQ0XDI2XDc2XDNcMTQ0XDFcNzZcMVwxMzJcMlw3N1wyXDAiKwotICAgICJcMVw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDBcMzNcNzdcMVwxMDAiKwotICAgICJcMVwxNDVcMlwxNDZcMVwxMDBcMVwxNDZcM1wxMDBcMVwxNDZcMVwxMDBcMVwxNDYiKwotICAgICJcMzNcMTAwXDJcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzciKwotICAgICJcMVwwXDVcNzdcMVwxNDdcMTJcNzdcMVwxNTBcMVwxNTFcMTFcNzdcMlwxMDIiKwotICAgICJcMlwxNTJcMVwxMDJcMVwxNTJcM1wxMDJcMVwxNTJcMVwxMDJcMVwxNTJcMzJcMTAyIisKLSAgICAiXDFcMTUzXDJcMTAzXDJcMFwxXDEwM1wxXDBcM1wxMDNcMVwwXDFcMTAzIisKLSAgICAiXDFcMFwyNlwxMDNcM1wwXDJcMTAzXDEyXDBcMVwxNTRcMzRcMFwyXDE3IisKLSAgICAiXDJcMFwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFwxXDE1NSIrCi0gICAgIlw2XDE3XDFcMFwyNVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wyXDAiKwotICAgICJcMVwxN1wxXDBcNFwxN1wxXDE1NlwyXDE3XDFcMFwyNVwxN1wyXDAiKwotICAgICJcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcNFwxN1wxXDE1NyIrCi0gICAgIlwyXDE3XDFcMFwyM1wxN1wyXDExM1wyXDBcMVwxMTNcMlwwXDFcMTEzIisKLSAgICAiXDFcMTYwXDFcMFwxXDExM1wxXDBcN1wxMTNcMVwwXDIzXDExM1wyXDE3IisKLSAgICAiXDJcMFwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw0XDE3IisKLSAgICAiXDFcMTYxXDJcMTdcMVwwXDIzXDE3XDJcMzFcNlwwXDFcMzFcMVwwIisKLSAgICAiXDFcMzFcMVwwXDE2XDMxXDFcMTYyXDdcMzFcNFwwXDFcMzFcMjdcMCIrCi0gICAgIlwxXDE2M1wxN1wwXDFcMTIxXDFcMTY0XDQ1XDEyMVwyXDQyXDJcMFwxXDQyIisKLSAgICAiXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwxMlw0MlwxXDE2NVwyMlw0MiIrCi0gICAgIlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMTVcNDIiKwotICAgICJcMVwxNjZcMTVcNDJcNDZcMTI0XDFcMTY3XDJcNDJcMlwwXDFcNDJcMVwwIisKLSAgICAiXDNcNDJcMVwwXDFcNDJcMVwwXDExXDQyXDFcMTcwXDIzXDQyXDJcMCIrCi0gICAgIlwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwxMlw0MlwxXDE3MSIrCi0gICAgIlwyMlw0MlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MlwxXDAiKwotICAgICJcMTVcNDJcMVwxNzJcMTVcNDJcMTNcMFwxXDE3M1wzM1wwXDFcMTMzXDFcMTc0IisKLSAgICAiXDQ1XDEzM1wyXDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMFw0XDYyXDFcMTc1XDIxXDYyXDNcMFw0XDYyXDJcMFwxXDYyIisKLSAgICAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFw0XDYyXDFcMTc2XDIxXDYyIisKLSAgICAiXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMFw0XDYyXDFcMTc3XDIxXDYyXDNcMFw0XDYyXDJcMFwxXDYyIisKLSAgICAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwyMFw2MlwxXDIwMFw1XDYyIisKLSAgICAiXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMFwxMVw2MlwxXDIwMVwxNFw2MlwzXDBcNFw2MlwyXDBcMVw2MiIrCi0gICAgIlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMlw2MlwxXDIwMlwyM1w2MiIrCi0gICAgIlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MiIrCi0gICAgIlwxXDBcMVwyMDNcMjVcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwIisKLSAgICAiXDNcNjJcMVwwXDFcNjJcMVwwXDVcNjJcMVwyMDRcMjBcNjJcM1wwIisKLSAgICAiXDJcNjJcNDZcMTQ0XDFcMTc0XDFcMTQ2XDFcMjA1XDQ1XDE0NlwyXDc3XDJcMCIrCi0gICAgIlwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3XDFcMFwyXDc3XDFcMjA2IisKLSAgICAiXDMyXDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3XDFcMCIrCi0gICAgIlwxXDIwN1wzNFw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3NyIrCi0gICAgIlwxXDBcNVw3N1wxXDIxMFwyNVw3N1w0NlwxNTJcMVwyMTFcMlwxN1wyXDAiKwotICAgICJcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcMlwxN1wxXDIxMiIrCi0gICAgIlw0XDE3XDFcMFwyNVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wyXDAiKwotICAgICJcMVwxN1wxXDBcNVwxN1wxXDIxM1wxXDE3XDFcMFwyNVwxN1wyXDAiKwotICAgICJcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcN1wxN1wxXDAiKwotICAgICJcMVwxN1wxXDIxNFwyM1wxN1wyXDBcMVwxN1wyXDBcMVwxN1wyXDAiKwotICAgICJcMVwxN1wxXDBcMVwxN1wxXDIxNVw1XDE3XDFcMFwyM1wxN1wyXDMxIisKLSAgICAiXDZcMFwxXDMxXDFcMFwxXDMxXDFcMFwxN1wzMVwxXDIxNlw2XDMxIisKLSAgICAiXDRcMFwxXDMxXDMyXDBcMVwyMTdcMTRcMFwyXDQyXDJcMFwxXDQyIisKLSAgICAiXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFw0XDQyXDFcMjIwXDMwXDQyIisKLSAgICAiXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwxXDQyIisKLSAgICAiXDFcMjIxXDMzXDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyIisKLSAgICAiXDFcMFw0XDQyXDFcMjIyXDMwXDQyXDJcMFwxXDQyXDFcMFwzXDQyIisKLSAgICAiXDFcMFwxXDQyXDFcMFw0XDQyXDFcMjIzXDMwXDQyXDJcMFwxXDQyIisKLSAgICAiXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwxXDQyXDFcMjI0XDMxXDQyIisKLSAgICAiXDJcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwIisKLSAgICAiXDVcNjJcMVwyMjVcMjBcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwIisKLSAgICAiXDNcNjJcMVwwXDFcNjJcMVwwXDEwXDYyXDFcMjI2XDE1XDYyXDNcMCIrCi0gICAgIlw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMCIrCi0gICAgIlwxMVw2MlwxXDIyN1wxNFw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDBcMVw2MlwxXDBcMVwyMzBcMjVcNjJcM1wwXDRcNjIiKwotICAgICJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDRcNjIiKwotICAgICJcMVwyMzFcMjFcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjIiKwotICAgICJcMVwwXDFcNjJcMVwwXDEzXDYyXDFcMjMyXDEyXDYyXDNcMFw0XDYyIisKLSAgICAiXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwyNFw2MiIrCi0gICAgIlwxXDIzM1wxXDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyIisKLSAgICAiXDFcMFwxXDYyXDFcMFwyNVw2MlwxXDIzNFwzXDBcMlw2MlwyXDc3IisKLSAgICAiXDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3XDFcMFwxM1w3NyIrCi0gICAgIlwxXDIzNVwyMVw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3NyIrCi0gICAgIlwxXDBcMjRcNzdcMVwyMzZcMTBcNzdcMlwwXDFcNzdcMVwwXDNcNzciKwotICAgICJcMVwwXDFcNzdcMVwwXDI1XDc3XDFcMjM3XDVcNzdcMlwxN1wyXDAiKwotICAgICJcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcMVwyNDBcNlwxNyIrCi0gICAgIlwxXDBcMjVcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTciKwotICAgICJcMVwwXDRcMTdcMVwyNDFcMlwxN1wxXDBcMjVcMTdcMlwwXDFcMTciKwotICAgICJcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDRcMTdcMVwyNDJcMlwxNyIrCi0gICAgIlwxXDBcMjVcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTciKwotICAgICJcMVwwXDVcMTdcMVwyNDNcMVwxN1wxXDBcMjNcMTdcMlwzMVw2XDAiKwotICAgICJcMVwzMVwxXDBcMVwzMVwxXDBcMTFcMzFcMVwyNDRcMTRcMzFcNFwwIisKLSAgICAiXDFcMzFcMzNcMFwxXDI0NVwxM1wwXDJcNDJcMlwwXDFcNDJcMVwwIisKLSAgICAiXDNcNDJcMVwwXDFcNDJcMVwwXDFcMjQ2XDM0XDQyXDJcMFwxXDQyIisKLSAgICAiXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFw1XDQyXDFcMjQ3XDI3XDQyIisKLSAgICAiXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwxMVw0MiIrCi0gICAgIlwxXDI1MFwyM1w0MlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MiIrCi0gICAgIlwxXDBcMVwyNTFcMzRcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwIisKLSAgICAiXDFcNDJcMVwwXDVcNDJcMVwyNTJcMjVcNDJcMlw2MlwyXDBcMVw2MiIrCi0gICAgIlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcNFw2MlwxXDI1M1wyMVw2MiIrCi0gICAgIlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MiIrCi0gICAgIlwxXDBcMjJcNjJcMVwyNTRcM1w2MlwzXDBcNFw2MlwyXDBcMVw2MiIrCi0gICAgIlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcNFw2MlwxXDI1NVwyMVw2MiIrCi0gICAgIlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MiIrCi0gICAgIlwxXDBcMjFcNjJcMVwyNTZcNFw2MlwzXDBcNFw2MlwyXDBcMVw2MiIrCi0gICAgIlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMTFcNjJcMVwyNTdcMTRcNjIiKwotICAgICJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDFcNjJcMVwyNjBcMjRcNjJcM1wwXDRcNjJcMlwwXDFcNjIiKwotICAgICJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDE0XDYyXDFcMjYxXDExXDYyIisKLSAgICAiXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMFwxXDI2MlwyNVw2MlwzXDBcMlw2MlwyXDc3XDJcMFwxXDc3IisKLSAgICAiXDFcMFwzXDc3XDFcMFwxXDc3XDFcMFwxXDc3XDFcMjYzXDMzXDc3IisKLSAgICAiXDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3XDFcMFwxNFw3NyIrCi0gICAgIlwxXDI2NFwyMFw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3NyIrCi0gICAgIlwxXDBcMVwyNjVcMzJcNzdcMlwxN1wyXDBcMVwxN1wyXDBcMVwxNyIrCi0gICAgIlwyXDBcMVwxN1wxXDBcM1wxN1wxXDI2NlwzXDE3XDFcMFwyNVwxNyIrCi0gICAgIlwyXDBcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcNlwxNyIrCi0gICAgIlwxXDI2N1wxXDBcMjVcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMlwwIisKLSAgICAiXDFcMTdcMVwwXDVcMTdcMVwyNzBcMVwxN1wxXDBcMjVcMTdcMlwwIisKLSAgICAiXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDdcMTdcMVwwIisKLSAgICAiXDJcMTdcMVwyNzFcMjBcMTdcMlwzMVw2XDBcMVwzMVwxXDBcMVwzMSIrCi0gICAgIlwxXDBcNFwzMVwxXDI3MlwyMVwzMVw0XDBcMVwzMVwyNVwwXDFcMjczIisKLSAgICAiXDIxXDBcMlw0MlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MiIrCi0gICAgIlwxXDBcMlw0MlwxXDI3NFwzMlw0MlwyXDBcMVw0MlwxXDBcM1w0MiIrCi0gICAgIlwxXDBcMVw0MlwxXDBcMTZcNDJcMVwyNzRcMTZcNDJcMlwwXDFcNDIiKwotICAgICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDJcNDJcMVwyNzVcMzJcNDIiKwotICAgICJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDE2XDQyIisKLSAgICAiXDFcMjc2XDE0XDQyXDJcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwIisKLSAgICAiXDFcNjJcMVwwXDVcNjJcMVwyNzdcMVwzMDBcMTdcNjJcM1wwXDRcNjIiKwotICAgICJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDFcMzAxIisKLSAgICAiXDI1XDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMCIrCi0gICAgIlwxXDYyXDFcMFw1XDYyXDFcMzAyXDIwXDYyXDNcMFw0XDYyXDJcMCIrCi0gICAgIlwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwxMlw2MlwxXDMwMyIrCi0gICAgIlwxM1w2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcNVw2MlwxXDIzNFwyMFw2MlwzXDBcNFw2MlwyXDAiKwotICAgICJcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcNVw2MlwxXDMwNCIrCi0gICAgIlwyMFw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcMTdcNjJcMVwxMzJcNlw2MlwzXDBcMlw2MlwyXDc3IisKLSAgICAiXDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3XDFcMFw1XDc3IisKLSAgICAiXDFcMzA1XDI3XDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IisKLSAgICAiXDFcMFw1XDc3XDFcMzA2XDI3XDc3XDJcMFwxXDc3XDFcMFwzXDc3IisKLSAgICAiXDFcMFwxXDc3XDFcMFwxN1w3N1wxXDMwN1wxM1w3N1wyXDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw0XDE3XDFcMzEwIisKLSAgICAiXDJcMTdcMVwwXDI1XDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMCIrCi0gICAgIlwxXDE3XDFcMFw3XDE3XDFcMFwxXDMxMVwyNFwxN1wyXDBcMVwxNyIrCi0gICAgIlwyXDBcMVwxN1wyXDBcMVwxN1wxXDBcNFwxN1wxXDMxMlwyXDE3IisKLSAgICAiXDFcMFwyM1wxN1wyXDMxXDZcMFwxXDMxXDFcMFwxXDMxXDFcMCIrCi0gICAgIlwxMVwzMVwxXDMxM1wxNFwzMVw0XDBcMVwzMVwyMFwwXDFcMzE0XDI2XDAiKwotICAgICJcMlw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDAiKwotICAgICJcMVwzMTVcMjVcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjIiKwotICAgICJcMVwwXDFcNjJcMVwwXDNcNjJcMVwzMTZcMjJcNjJcM1wwXDRcNjIiKwotICAgICJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDEwXDYyIisKLSAgICAiXDFcMzE3XDE1XDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyIisKLSAgICAiXDFcMFwxXDYyXDFcMFwyMFw2MlwxXDIzNFw1XDYyXDNcMFwyXDYyIisKLSAgICAiXDJcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwIisKLSAgICAiXDFcMzIwXDM0XDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IisKLSAgICAiXDFcMFwyMFw3N1wxXDMyMVwxMlw3N1wyXDE3XDJcMFwxXDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDFcMFwzXDE3XDFcMzIyXDNcMTdcMVwwIisKLSAgICAiXDIzXDE3XDI1XDBcMVwzMjNcMjFcMFwyXDYyXDJcMFwxXDYyXDFcMCIrCi0gICAgIlwzXDYyXDFcMFwxXDYyXDFcMFwxMlw2MlwxXDMyNFwxM1w2MlwzXDAiKwotICAgICJcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDAiKwotICAgICJcMTJcNjJcMVwzMjVcMTNcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwIisKLSAgICAiXDNcNjJcMVwwXDFcNjJcMVwwXDNcNjJcMVwzMjZcMjJcNjJcM1wwIisKLSAgICAiXDJcNjJcMlw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3NyIrCi0gICAgIlwxXDBcMTdcNzdcMVwzMjdcMTVcNzdcMlwwXDFcNzdcMVwwXDNcNzciKwotICAgICJcMVwwXDFcNzdcMVwwXDFcMzMwXDMyXDc3XDJcMFwyXDMyM1wxXDAiKwotICAgICJcMVwzMjNcMzVcMFwxXDMzMVwzXDBcMlw3N1wyXDBcMVw3N1wxXDAiKwotICAgICJcM1w3N1wxXDBcMVw3N1wxXDBcMTdcNzdcMVwzMzJcMTNcNzciOwotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5dHJhbnMgW10gPSB5eV91bnBhY2soKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgZmluYWwgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKgotICAgKiBZWV9BVFRSSUJVVEVbYVN0YXRlXSBjb250YWlucyB0aGUgYXR0cmlidXRlcyBvZiBzdGF0ZSA8Y29kZT5hU3RhdGU8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFlZX0FUVFJJQlVURVtdID0gewotICAgICAwLCAgOCwgIDAsICAwLCAgMSwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDksICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgMSwgIDksICA5LCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDksICA5LCAgMCwgIDEsICAxLCAgMSwgIDAsICAxLCAgMSwgIDAsICAwLCAgMSwgCi0gICAgIDAsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAwLCAgMSwgIDksICAxLCAgMSwgIDEsICA5LCAKLSAgICAgMSwgIDEsICAwLCAgOSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMQotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhcltZWV9CVUZGRVJTSVpFXTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgaW50IHl5Y29sdW1uOyAKLQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgYXQgdGhlIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCWludCBub2RlX2NvdW50ID0gMDsKLQlTdHJpbmcgY3VycmVudFN0cmluZzsKLQotCXByaXZhdGUgVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIG5ldyBUb2tlbih0eXBlLCB5eXRleHQoKSwgeXlsaW5lLCB5eWNoYXIgKyBzdGFydE9mZnNldCwgeXlsZW5ndGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgc3RhcnRPZmZzZXQgPSAwOwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhpcy5zdGFydE9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaW5lKGludCBsaW5lKSB7Ci0JCXRoaXMueXlsaW5lID0gbGluZTsKLQl9Ci0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgRFREVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy55eV9yZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIERURFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBzcGxpdCwgY29tcHJlc3NlZCBERkEgdHJhbnNpdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgdW5wYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHl5X3VucGFjaygpIHsKLSAgICBpbnQgW10gdHJhbnMgPSBuZXcgaW50WzY2MzBdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHl5X3VucGFjayh5eV9wYWNrZWQwLCBvZmZzZXQsIHRyYW5zKTsKLSAgICByZXR1cm4gdHJhbnM7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgREZBIHRyYW5zaXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBlbnRyeQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHl5X3VucGFjayhTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gdHJhbnMpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgdmFsdWUtLTsKLSAgICAgIGRvIHRyYW5zW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTMwKSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZWZpbGxzIHRoZSBpbnB1dCBidWZmZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGlmZiB0aGVyZSB3YXMgbmV3IGlucHV0LgotICAgKiAKLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfcmVmaWxsKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKG51bVJlYWQgPCAwKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsgIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gICAgCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0KLSAgICBpZiAoeXlfcmVhZGVyICE9IG51bGwpCi0gICAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgY3VycmVudCBzdHJlYW0sIGFuZCByZXNldHMgdGhlCi0gICAqIHNjYW5uZXIgdG8gcmVhZCBmcm9tIGEgbmV3IGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogQWxsIGludGVybmFsIHZhcmlhYmxlcyBhcmUgcmVzZXQsIHRoZSBvbGQgaW5wdXQgc3RyZWFtIAotICAgKiA8Yj5jYW5ub3Q8L2I+IGJlIHJldXNlZCAoaW50ZXJuYWwgYnVmZmVyIGlzIGRpc2NhcmRlZCBhbmQgbG9zdCkuCi0gICAqIExleGljYWwgc3RhdGUgaXMgc2V0IHRvIDx0dD5ZWV9JTklUSUFMPC90dD4uCi0gICAqCi0gICAqIEBwYXJhbSByZWFkZXIgICB0aGUgbmV3IGlucHV0IHN0cmVhbSAKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5cmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXljbG9zZSgpOwotICAgIHl5X3JlYWRlciA9IHJlYWRlcjsKLSAgICB5eV9hdEVPRiAgPSBmYWxzZTsKLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkID0gMDsKLSAgICB5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zID0geXlfcHVzaGJhY2tQb3MgPSAwOwotICAgIHl5bGluZSA9IHl5Y2hhciA9IHl5Y29sdW1uID0gMDsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gPHR0PnBvczwvdHQ+IGZyb20gdGhlIAotICAgKiBtYXRjaGVkIHRleHQuIAotICAgKiAKLSAgICogSXQgaXMgZXF1aXZhbGVudCB0byB5eXRleHQoKS5jaGFyQXQocG9zKSwgYnV0IGZhc3RlcgotICAgKgotICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGZldGNoLiAKLSAgICogICAgICAgICAgICBBIHZhbHVlIGZyb20gMCB0byB5eWxlbmd0aCgpLTEuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiBwb3MKLSAgICovCi0gIGZpbmFsIHB1YmxpYyBjaGFyIHl5Y2hhcmF0KGludCBwb3MpIHsKLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X3N0YXJ0UmVhZCtwb3NdOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBJbiBhIHdlbGxmb3JtZWQgc2Nhbm5lciAobm8gb3Igb25seSBjb3JyZWN0IHVzYWdlIG9mIAotICAgKiB5eXB1c2hiYWNrKGludCkgYW5kIGEgbWF0Y2gtYWxsIGZhbGxiYWNrIHJ1bGUpIHRoaXMgbWV0aG9kIAotICAgKiB3aWxsIG9ubHkgYmUgY2FsbGVkIHdpdGggdGhpbmdzIHRoYXQgIkNhbid0IFBvc3NpYmx5IEhhcHBlbiIuCi0gICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZwotICAgKiAoZS5nLiBhIEpGbGV4IGJ1ZyBwcm9kdWNpbmcgYSBmYXVsdHkgc2Nhbm5lciBldGMuKS4KLSAgICoKLSAgICogVXN1YWwgc3ludGF4L3NjYW5uZXIgbGV2ZWwgZXJyb3IgaGFuZGxpbmcgc2hvdWxkIGJlIGRvbmUKLSAgICogaW4gZXJyb3IgZmFsbGJhY2sgcnVsZXMuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICB0cnkgewotICAgICAgbWVzc2FnZSA9IFlZX0VSUk9SX01TR1tlcnJvckNvZGVdOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2UgPSBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl07Ci0gICAgfQotCi0gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpICB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBZeXRva2VuIHl5bGV4KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0gICAgLy8gY2FjaGVkIGZpZWxkczoKLSAgICBpbnQgeXlfY3VycmVudFBvc19sOwotICAgIGludCB5eV9tYXJrZWRQb3NfbDsKLSAgICBpbnQgeXlfZW5kUmVhZF9sID0geXlfZW5kUmVhZDsKLSAgICBjaGFyIFtdIHl5X2J1ZmZlcl9sID0geXlfYnVmZmVyOwotICAgIGNoYXIgW10geXljbWFwX2wgPSB5eWNtYXA7Ci0KLSAgICBpbnQgW10geXl0cmFuc19sID0geXl0cmFuczsKLSAgICBpbnQgW10geXlfcm93TWFwX2wgPSB5eV9yb3dNYXA7Ci0gICAgYnl0ZSBbXSB5eV9hdHRyX2wgPSBZWV9BVFRSSUJVVEU7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeXlfbWFya2VkUG9zX2wgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIHl5Y2hhcis9IHl5X21hcmtlZFBvc19sLXl5X3N0YXJ0UmVhZDsKLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3NfbCA9IHl5X2N1cnJlbnRQb3MgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zX2w7Ci0gIAotICAgICAgeXlfc3RhdGUgPSB5eV9sZXhpY2FsX3N0YXRlOwotCi0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIGlmICh5eV9jdXJyZW50UG9zX2wgPCB5eV9lbmRSZWFkX2wpCi0gICAgICAgICAgICB5eV9pbnB1dCA9IHl5X2J1ZmZlcl9sW3l5X2N1cnJlbnRQb3NfbCsrXTsKLSAgICAgICAgICBlbHNlIGlmICh5eV9hdEVPRikgewotICAgICAgICAgICAgeXlfaW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbnMKLSAgICAgICAgICAgIHl5X2N1cnJlbnRQb3MgID0geXlfY3VycmVudFBvc19sOwotICAgICAgICAgICAgeXlfbWFya2VkUG9zICAgPSB5eV9tYXJrZWRQb3NfbDsKLSAgICAgICAgICAgIGJvb2xlYW4gZW9mID0geXlfcmVmaWxsKCk7Ci0gICAgICAgICAgICAvLyBnZXQgdHJhbnNsYXRlZCBwb3NpdGlvbnMgYW5kIHBvc3NpYmx5IG5ldyBidWZmZXIKLSAgICAgICAgICAgIHl5X2N1cnJlbnRQb3NfbCAgPSB5eV9jdXJyZW50UG9zOwotICAgICAgICAgICAgeXlfbWFya2VkUG9zX2wgICA9IHl5X21hcmtlZFBvczsKLSAgICAgICAgICAgIHl5X2J1ZmZlcl9sICAgICAgPSB5eV9idWZmZXI7Ci0gICAgICAgICAgICB5eV9lbmRSZWFkX2wgICAgID0geXlfZW5kUmVhZDsKLSAgICAgICAgICAgIGlmIChlb2YpIHsKLSAgICAgICAgICAgICAgeXlfaW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgICAgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHl5X2lucHV0ID0geXlfYnVmZmVyX2xbeXlfY3VycmVudFBvc19sKytdOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpbnQgeXlfbmV4dCA9IHl5dHJhbnNfbFsgeXlfcm93TWFwX2xbeXlfc3RhdGVdICsgeXljbWFwX2xbeXlfaW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHl5X25leHQgPT0gLTEpIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB5eV9zdGF0ZSA9IHl5X25leHQ7Ci0KLSAgICAgICAgICBpbnQgeXlfYXR0cmlidXRlcyA9IHl5X2F0dHJfbFt5eV9zdGF0ZV07Ci0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDEpID09IDEgKSB7Ci0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3NfbCA9IHl5X2N1cnJlbnRQb3NfbDsgCi0gICAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgOCkgPT0gOCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbgotICAgICAgeXlfbWFya2VkUG9zID0geXlfbWFya2VkUG9zX2w7Ci0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7Ci0KLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyAgfQotICAgICAgICBjYXNlIDIxOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgODk6IAotICAgICAgICBjYXNlIDEyMzogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7ICB9Ci0gICAgICAgIGNhc2UgMjIwOiBicmVhazsKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgIGNhc2UgNjI6IAotICAgICAgICBjYXNlIDYzOiAKLSAgICAgICAgY2FzZSA2NDogCi0gICAgICAgIGNhc2UgNjU6IAotICAgICAgICBjYXNlIDEwMjogCi0gICAgICAgIGNhc2UgMTAzOiAKLSAgICAgICAgY2FzZSAxMDQ6IAotICAgICAgICBjYXNlIDEzMzogCi0gICAgICAgIGNhc2UgMTM0OiAKLSAgICAgICAgY2FzZSAxMzU6IAotICAgICAgICBjYXNlIDE1NjogCi0gICAgICAgIGNhc2UgMTU3OiAKLSAgICAgICAgY2FzZSAxNTg6IAotICAgICAgICBjYXNlIDE3ODogCi0gICAgICAgIGNhc2UgMTc5OiAKLSAgICAgICAgY2FzZSAxODA6IAotICAgICAgICBjYXNlIDE5NjogCi0gICAgICAgIGNhc2UgMTk3OiAKLSAgICAgICAgY2FzZSAyMDc6IAotICAgICAgICBjYXNlIDIwODogCi0gICAgICAgIGNhc2UgMjE1OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjIxOiBicmVhazsKLSAgICAgICAgY2FzZSA1MTogCi0gICAgICAgIGNhc2UgNTI6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyMjI6IGJyZWFrOwotICAgICAgICBjYXNlIDIwNTogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDIyMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk0OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLklEUkVGU19LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyMjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDE5MTogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVFlfS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjI1OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQ09NTUVOVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpOyAgfQotICAgICAgICBjYXNlIDIyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQVRUUklCVVRFX05BTUUpOyAgfQotICAgICAgICBjYXNlIDIyNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzk6IAotICAgICAgICAgIHsgIHl5YmVnaW4oRVhURVJOQUxJRF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyAgfQotICAgICAgICBjYXNlIDIyODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA2OiAKLSAgICAgICAgY2FzZSAxMzY6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKTsgIH0KLSAgICAgICAgY2FzZSAyMjk6IGJyZWFrOwotICAgICAgICBjYXNlIDEwMDogCi0gICAgICAgIGNhc2UgMTMyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCk7ICB9Ci0gICAgICAgIGNhc2UgMjMwOiBicmVhazsKLSAgICAgICAgY2FzZSAyMDI6IAotICAgICAgICBjYXNlIDIxNjogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKTsgIH0KLSAgICAgICAgY2FzZSAyMzE6IGJyZWFrOwotICAgICAgICBjYXNlIDE4OTogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlBVQkxJQ19LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyMzI6IGJyZWFrOwotICAgICAgICBjYXNlIDE4ODogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNZU1RFTV9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyMzM6IGJyZWFrOwotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgY2FzZSA3MTogCi0gICAgICAgIGNhc2UgNzI6IAotICAgICAgICBjYXNlIDczOiAKLSAgICAgICAgY2FzZSA3NTogCi0gICAgICAgIGNhc2UgMTA4OiAKLSAgICAgICAgY2FzZSAxMDk6IAotICAgICAgICBjYXNlIDExMDogCi0gICAgICAgIGNhc2UgMTEyOiAKLSAgICAgICAgY2FzZSAxMzc6IAotICAgICAgICBjYXNlIDEzODogCi0gICAgICAgIGNhc2UgMTM5OiAKLSAgICAgICAgY2FzZSAxNDA6IAotICAgICAgICBjYXNlIDE1OTogCi0gICAgICAgIGNhc2UgMTYwOiAKLSAgICAgICAgY2FzZSAxNjE6IAotICAgICAgICBjYXNlIDE2MjogCi0gICAgICAgIGNhc2UgMTgxOiAKLSAgICAgICAgY2FzZSAxODM6IAotICAgICAgICBjYXNlIDE4NDogCi0gICAgICAgIGNhc2UgMjAwOiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyMzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDQ6IAotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgIGNhc2UgMzU6IAotICAgICAgICBjYXNlIDM2OiAKLSAgICAgICAgY2FzZSAzNzogCi0gICAgICAgIGNhc2UgODE6IAotICAgICAgICBjYXNlIDgyOiAKLSAgICAgICAgY2FzZSAxMTY6IAotICAgICAgICBjYXNlIDExNzogCi0gICAgICAgIGNhc2UgMTQzOiAKLSAgICAgICAgY2FzZSAxNDQ6IAotICAgICAgICBjYXNlIDE2NTogCi0gICAgICAgIGNhc2UgMTY2OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyMzU6IGJyZWFrOwotICAgICAgICBjYXNlIDc6IAotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgIGNhc2UgNDI6IAotICAgICAgICBjYXNlIDg1OiAKLSAgICAgICAgY2FzZSA4NjogCi0gICAgICAgIGNhc2UgODc6IAotICAgICAgICBjYXNlIDExOTogCi0gICAgICAgIGNhc2UgMTIwOiAKLSAgICAgICAgY2FzZSAxMjE6IAotICAgICAgICBjYXNlIDE0NTogCi0gICAgICAgIGNhc2UgMTQ2OiAKLSAgICAgICAgY2FzZSAxNDc6IAotICAgICAgICBjYXNlIDE2ODogCi0gICAgICAgIGNhc2UgMTY5OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyMzY6IGJyZWFrOwotICAgICAgICBjYXNlIDk6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDIzNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDIzODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDM6IAotICAgICAgICBjYXNlIDQ1OiAKLSAgICAgICAgY2FzZSA0NjogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTU1FTlRfQ09OVEVOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjM5OiBicmVhazsKLSAgICAgICAgY2FzZSA2MDogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjQwOiBicmVhazsKLSAgICAgICAgY2FzZSAxOTg6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5GSVhFRF9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNDE6IGJyZWFrOwotICAgICAgICBjYXNlIDIxNDogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNDI6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMjogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OTVRPS0VOU19LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNDM6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMTogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVElFU19LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDIwOTogCi0gICAgICAgICAgeyAgeXliZWdpbihOT1RBVElPTl9OQU1FKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRyk7ICB9Ci0gICAgICAgIGNhc2UgMjQ1OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDE6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUTElTVF9OQU1FKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKTsgIH0KLSAgICAgICAgY2FzZSAyNDY6IGJyZWFrOwotICAgICAgICBjYXNlIDE5OTogCi0gICAgICAgICAgeyAgeXliZWdpbihFTEVNRU5UX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpOyAgfQotICAgICAgICBjYXNlIDI0NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEVOVElUWV9OQU1FKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpOyAgfQotICAgICAgICBjYXNlIDI0ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKE5EQVRBX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkRBVEFfS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjQ5OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTE6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVFlfUEFSTSk7ICB9Ci0gICAgICAgIGNhc2UgMjUwOiBicmVhazsKLSAgICAgICAgY2FzZSA5NDogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JRF9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNTE6IGJyZWFrOwotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSk7ICB9Ci0gICAgICAgIGNhc2UgMjUyOiBicmVhazsKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKTsgIH0KLSAgICAgICAgY2FzZSAyNTM6IGJyZWFrOwotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7ICB9Ci0gICAgICAgIGNhc2UgMjU0OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgIGNhc2UgNDk6IAotICAgICAgICBjYXNlIDUwOiAKLSAgICAgICAgY2FzZSA1NDogCi0gICAgICAgIGNhc2UgNTU6IAotICAgICAgICBjYXNlIDU2OiAKLSAgICAgICAgY2FzZSA1NzogCi0gICAgICAgIGNhc2UgNTg6IAotICAgICAgICBjYXNlIDYxOiAKLSAgICAgICAgY2FzZSA5MTogCi0gICAgICAgIGNhc2UgOTI6IAotICAgICAgICBjYXNlIDkzOiAKLSAgICAgICAgY2FzZSA5NTogCi0gICAgICAgIGNhc2UgOTY6IAotICAgICAgICBjYXNlIDk3OiAKLSAgICAgICAgY2FzZSA5ODogCi0gICAgICAgIGNhc2UgMTI0OiAKLSAgICAgICAgY2FzZSAxMjU6IAotICAgICAgICBjYXNlIDEyNjogCi0gICAgICAgIGNhc2UgMTI3OiAKLSAgICAgICAgY2FzZSAxMjg6IAotICAgICAgICBjYXNlIDEyOTogCi0gICAgICAgIGNhc2UgMTMwOiAKLSAgICAgICAgY2FzZSAxMzE6IAotICAgICAgICBjYXNlIDE0ODogCi0gICAgICAgIGNhc2UgMTQ5OiAKLSAgICAgICAgY2FzZSAxNTA6IAotICAgICAgICBjYXNlIDE1MTogCi0gICAgICAgIGNhc2UgMTUyOiAKLSAgICAgICAgY2FzZSAxNTM6IAotICAgICAgICBjYXNlIDE1NDogCi0gICAgICAgIGNhc2UgMTU1OiAKLSAgICAgICAgY2FzZSAxNzA6IAotICAgICAgICBjYXNlIDE3MTogCi0gICAgICAgIGNhc2UgMTcyOiAKLSAgICAgICAgY2FzZSAxNzU6IAotICAgICAgICBjYXNlIDE3NjogCi0gICAgICAgIGNhc2UgMTc3OiAKLSAgICAgICAgY2FzZSAxOTA6IAotICAgICAgICBjYXNlIDE5MjogCi0gICAgICAgIGNhc2UgMTkzOiAKLSAgICAgICAgY2FzZSAxOTU6IAotICAgICAgICBjYXNlIDIwNDogCi0gICAgICAgIGNhc2UgMjA2OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlBBUk1fRU5USVRZX1RZUEUpOyAgfQotICAgICAgICBjYXNlIDI1NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5MRUZUX1BBUkVOKTsgIH0KLSAgICAgICAgY2FzZSAyNTY6IGJyZWFrOwotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUklHSFRfUEFSRU4pOyAgfQotICAgICAgICBjYXNlIDI1NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDQ6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgIH0KLSAgICAgICAgY2FzZSAyNTg6IGJyZWFrOwotICAgICAgICBjYXNlIDUzOiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7ICB9Ci0gICAgICAgIGNhc2UgMjU5OiBicmVhazsKLSAgICAgICAgY2FzZSA1OTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihBVFRSSUJVVEVfRU5VTUVSQVRJT04pOyAgfQotICAgICAgICBjYXNlIDI2MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjc6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5MRUZUX1BBUkVOKTsgIH0KLSAgICAgICAgY2FzZSAyNjE6IGJyZWFrOwotICAgICAgICBjYXNlIDY4OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlJJR0hUX1BBUkVOKTsgIH0KLSAgICAgICAgY2FzZSAyNjI6IGJyZWFrOwotICAgICAgICBjYXNlIDY5OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5VTV9DSE9JQ0UpOyAgfQotICAgICAgICBjYXNlIDI2MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgIHsgIHl5YmVnaW4oRU5USVRZX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7ICB9Ci0gICAgICAgIGNhc2UgMjY0OiBicmVhazsKLSAgICAgICAgY2FzZSA0NzogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7ICB9Ci0gICAgICAgIGNhc2UgMjY1OiBicmVhazsKLSAgICAgICAgY2FzZSAxODc6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oRVhURVJOQUxJRF9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyNjY6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMzogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfRU5VTUVSQVRJT04pOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjY3OiBicmVhazsKLSAgICAgICAgY2FzZSAxNzQ6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ0RBVEFfS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjY4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNzM6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURSRUZfS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjY5OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlJFUVVJUkVEX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI3MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCk7ICB9Ci0gICAgICAgIGNhc2UgMjcxOiBicmVhazsKLSAgICAgICAgY2FzZSA4NDogCi0gICAgICAgIGNhc2UgMTE4OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpOyAgfQotICAgICAgICBjYXNlIDI3MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzk6IAotICAgICAgICBjYXNlIDExNTogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKTsgIH0KLSAgICAgICAgY2FzZSAyNzM6IGJyZWFrOwotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgIGNhc2UgNzY6IAotICAgICAgICBjYXNlIDExMzogCi0gICAgICAgIGNhc2UgMTQxOiAKLSAgICAgICAgY2FzZSAxNjM6IAotICAgICAgICBjYXNlIDE4NTogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyAgfQotICAgICAgICBjYXNlIDI3NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogCi0gICAgICAgIGNhc2UgMzg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFKTsgIH0KLSAgICAgICAgY2FzZSAyNzU6IGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgY2FzZSA2NjogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyAgfQotICAgICAgICBjYXNlIDI3NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TVEFSVF9UQUcpOyAgfQotICAgICAgICBjYXNlIDI3NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TRU1JQ09MT04pOyAgfQotICAgICAgICBjYXNlIDI3ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT05ORUNUT1IpOyAgfQotICAgICAgICBjYXNlIDI3OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QRVJDRU5UKTsgIH0KLSAgICAgICAgY2FzZSAyODA6IGJyZWFrOwotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5EX1RBRyk7ICB9Ci0gICAgICAgIGNhc2UgMjgxOiBicmVhazsKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlBFUkNFTlQpOyAgfQotICAgICAgICBjYXNlIDI4MjogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL1Rva2VuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9Ub2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWFmZTdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL1Rva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRva2VuaXplcjsKLQotcHVibGljIGNsYXNzIFRva2VuIGV4dGVuZHMgWXl0b2tlbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVF9TVEFSVCA9IDk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVE9SID0gNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX0FOWSA9IDQzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfRU1QVFkgPSA0MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1BDREFUQSA9IDQ0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfQ09OVEVOVCA9IDQxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9UQUcgPSA0MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkRfVEFHID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfQ09OVEVOVCA9IDMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9QQVJNID0gMzE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfVEFHID0gMzA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhDTEFNQVRJT04gPSA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlRfUEFSRU4gPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUUgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVEFUSU9OX0NPTlRFTlQgPSAyMTsKLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UQVRJT05fVEFHID0gMjA7Ci0KLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0NIT0lDRSA9IDU7Ci0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9TRVFVRU5DRSA9IDY7Ci0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0NDVVJfT1BUSU9OQUwgPSA3OwotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9DQ1VSX09ORV9PUl9NT1JFID0gODsKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQ0NVUl9aRVJPX09SX01PUkUgPSA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9DQ1VSX1RZUEUgPSA3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUX1BBUkVOID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9UQUcgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdISVRFU1BBQ0UgPSA1OwotCi0KLQlwdWJsaWMgVG9rZW4oU3RyaW5nIHR5cGUpIHsKLQkJc3VwZXIodHlwZSk7Ci0JfQotCi0JcHVibGljIFRva2VuKFN0cmluZyB0eXBlLCBTdHJpbmcgdGV4dCwgaW50IGxpbmUsIGludCBjaGFyQmVnaW4sIGludCBsZW5ndGgpIHsKLQkJc3VwZXIodHlwZSwgdGV4dCwgbGluZSwgY2hhckJlZ2luLCBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyBUb2tlbiBjcmVhdGVDb3B5KCkgewotCQlUb2tlbiBjb3B5ID0gbmV3IFRva2VuKGdldFR5cGUoKSwgZ2V0VGV4dCgpLCBnZXRTdGFydExpbmUoKSwgZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0TGVuZ3RoKCkpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL1l5dG9rZW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL1l5dG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI0Nzk5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9ZeXRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRva2VuaXplcjsKLQotY2xhc3MgWXl0b2tlbiB7Ci0JcHVibGljIGludCBtX2NoYXJCZWdpbjsKLQlwdWJsaWMgaW50IG1fbGVuZ3RoOwotCXB1YmxpYyBpbnQgbV9saW5lOwotCXB1YmxpYyBTdHJpbmcgbV90ZXh0OwotCXB1YmxpYyBTdHJpbmcgbV90eXBlOwotCi0JWXl0b2tlbihTdHJpbmcgdHlwZSkgewotCQltX3R5cGUgPSB0eXBlOwotCX0KLQotCVl5dG9rZW4oU3RyaW5nIHR5cGUsIFN0cmluZyB0ZXh0LCBpbnQgbGluZSwgaW50IGNoYXJCZWdpbiwgaW50IGxlbmd0aCkgewotCQltX3R5cGUgPSB0eXBlOwotCQltX3RleHQgPSBuZXcgU3RyaW5nKHRleHQpOwotCQltX2xpbmUgPSBsaW5lOwotCQltX2NoYXJCZWdpbiA9IGNoYXJCZWdpbjsKLQkJbV9sZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlpbnQgc3RyaW5nU3RhcnQgPSBzdGFydCAtIG1fY2hhckJlZ2luOwotCQlTdHJpbmcgb2xkU3RyaW5nID0gbV90ZXh0OwotCQltX3RleHQgPSBvbGRTdHJpbmcuc3Vic3RyaW5nKDAsIHN0cmluZ1N0YXJ0KTsKLQkJbV90ZXh0ICs9IG9sZFN0cmluZy5zdWJzdHJpbmcoc3RyaW5nU3RhcnQgKyBsZW5ndGgpOwotCi0JCW1fbGVuZ3RoID0gbV90ZXh0Lmxlbmd0aCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5ldyBzdHJpbmcgPSAiICsgbV90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKFl5dG9rZW4gb3RoZXIpIHsKLQkJcmV0dXJuIG1fdHlwZSA9PSBvdGhlci5nZXRUeXBlKCkgJiYgbV90ZXh0LmVxdWFscyhvdGhlci5nZXRUZXh0KCkpICYmIG1fbGluZSA9PSBvdGhlci5nZXRTdGFydExpbmUoKSAmJiBtX2NoYXJCZWdpbiA9PSBvdGhlci5nZXRTdGFydE9mZnNldCgpICYmIG1fbGVuZ3RoID09IG90aGVyLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gbV9jaGFyQmVnaW4gKyBtX2xlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIG1fbGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRMaW5lKCkgewotCQlyZXR1cm4gbV9saW5lOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBtX2NoYXJCZWdpbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBtX3RleHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gbV90eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCBzdGFydE9mZnNldCkgewotCQltX2NoYXJCZWdpbiA9IHN0YXJ0T2Zmc2V0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiVGV4dCAgIDogIiArIG1fdGV4dCArICJcbnR5cGUgOiAiICsgbV90eXBlICsgIlxubGluZSAgOiAiICsgbV9saW5lICsgIlxuY0JlZy4gOiAiICsgbV9jaGFyQmVnaW4gKyAiXG5jRW5kLiA6ICIgKyBnZXRFbmRPZmZzZXQoKSArICJcbmNMZW5ndGguIDogIiArIG1fbGVuZ3RoOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZU9mZnNldChpbnQgZGVsdGEpIHsKLQkJbV9jaGFyQmVnaW4gKz0gZGVsdGE7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlVGV4dChTdHJpbmcgbmV3VGV4dCkgewotCQltX3RleHQgPSBuZXdUZXh0OwotCQltX2xlbmd0aCA9IG5ld1RleHQubGVuZ3RoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvZHRkLmZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9kdGQuZmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhMTRhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9kdGQuZmxleAorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci0KLS8qKiAKLSAqIEdlbmVyYXRlIHdpdGggImR0ZHNrZWxldG9uIi4KLSAqCi0gKiBJdCByZW1vdmVzIHNvbWUgdW51c2VkIGZpZWxkcyBhbmQgYXZvaWRzIHNvbWUgY29tcGlsZXIgd2FybmluZ3MgCi0gKi8KLQotJSUKLQotJXsKLQlpbnQgbm9kZV9jb3VudCA9IDA7Ci0JU3RyaW5nIGN1cnJlbnRTdHJpbmc7Ci0KLQlwcml2YXRlIFRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBuZXcgVG9rZW4odHlwZSwgeXl0ZXh0KCksIHl5bGluZSwgeXljaGFyICsgc3RhcnRPZmZzZXQsIHl5bGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRoaXMuc3RhcnRPZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGluZShpbnQgbGluZSkgewotCQl0aGlzLnl5bGluZSA9IGxpbmU7Ci0JfQotJX0KLQotJWNsYXNzIERURFRva2VuaXplcgotJXB1YmxpYwotJXVuaWNvZGUKLSVjaGFyCi0KLSVzdGF0ZSBOT0RFCi0lc3RhdGUgRUxFTUVOVF9OQU1FCi0lc3RhdGUgRUxFTUVOVF9DT05URU5UCi0lc3RhdGUgRUxFTUVOVF9NSVhFRF9PUl9DSElMRAotJXN0YXRlIEVMRU1FTlRfTUlYRUQKLSVzdGF0ZSBFTEVNRU5UX0NISUxECi0lc3RhdGUgRU5USVRZX05BTUUKLSVzdGF0ZSBFTlRJVFlfQ09OVEVOVAotJXN0YXRlIE5EQVRBX0NPTlRFTlQKLQotJXN0YXRlIE5PVEFUSU9OX05BTUUKLSVzdGF0ZSBFWFRFUk5BTElEX0NPTlRFTlQKLQotJXN0YXRlIENPTU1FTlRfQ09OVEVOVAotJXN0YXRlIEFUVExJU1RfTkFNRQotJXN0YXRlIEFUVExJU1RfQ09OVEVOVAotJXN0YXRlIEFUVFJJQlVURV9DT05URU5UCi0lc3RhdGUgQVRUUklCVVRFX0RFRkFVTFQKLSVzdGF0ZSBBVFRSSUJVVEVfRU5VTUVSQVRJT04KLQotCi1BTFBIQT1bQS1aYS16XQotRElHSVQ9WzAtOV0KLU5PTk5FV0xJTkVfV0hJVEVfU1BBQ0VfQ0hBUj1bXCBcdFxiXDAxMl0KLVNUUklOR19URVhUPShcXFwifFteXG5cclwiXXxcXHtXSElURV9TUEFDRV9DSEFSfStcXCkqCi1DT01NRU5UX1RFWFQ9KFteKi9cbl18W14qXG5dIi8iW14qXG5dfFteL1xuXSIqIlteL1xuXXwiKiJbXi9cbl18Ii8iW14qXG5dKSoKLUlkZW50ID0ge0FMUEhBfSh7QUxQSEF9fHtESUdJVH18XykqCi1JbnB1dENoYXJhY3RlciA9IFteXHJcbl0KLQotTGluZVRlcm1pbmF0b3IgPSBccnxcbnxcclxuCi0KLS8qIDMgLSBXaGl0ZSBTcGFjZSAqLwotUyAgICAgICAgICAgICAgPSAgICAoXHgyMCB8IFx4MDkgfCBceDBEIHwgXHgwQSkrCi1Ob25MaW5lVGVybWluYXRvcldoaXRlc3BhY2UgPSAoXHgyMCB8IFx4MDkpKwotCi1XaGl0ZVNwYWNlICAgICA9IHtMaW5lVGVybWluYXRvcn0gfCBbIFx0XGZdCi0KLS8qIDg0ICovCi0vKkxldHRlciAgICAgICAgID0gICAge0Jhc2VDaGFyfSB8IHtJZGVvZ3JhcGhpY30KLQotLyogODUgKi8KLUJhc2VDaGFyICAgICAgID0gICAgW1x1MDA0MS1cdTAwNUFdIHwgW1x1MDA2MS1cdTAwN0FdIHwgW1x1MDBDMC1cdTAwRDZdIHwgW1x1MDBEOC1cdTAwRjZdIHwgW1x1MDBGOC1cdTAwRkZdIHwgW1x1MDEwMC1cdTAxMzFdIHwgW1x1MDEzNC1cdTAxM0VdIHwgW1x1MDE0MS1cdTAxNDhdIHwgW1x1MDE0QS1cdTAxN0VdIHwgW1x1MDE4MC1cdTAxQzNdIHwgW1x1MDFDRC1cdTAxRjBdIHwgW1x1MDFGNC1cdTAxRjVdIHwgW1x1MDFGQS1cdTAyMTddIHwgW1x1MDI1MC1cdTAyQThdIHwgW1x1MDJCQi1cdTAyQzFdIHwgXHUwMzg2IHwgW1x1MDM4OC1cdTAzOEFdIHwgXHUwMzhDIHwgW1x1MDM4RS1cdTAzQTFdIHwgW1x1MDNBMy1cdTAzQ0VdIHwgW1x1MDNEMC1cdTAzRDZdIHwgXHUwM0RBIHwgXHUwM0RDIHwgXHUwM0RFIHwgXHUwM0UwIHwgW1x1MDNFMi1cdTAzRjNdIHwgW1x1MDQwMS1cdTA0MENdIHwgW1x1MDQwRS1cdTA0NEZdIHwgW1x1MDQ1MS1cdTA0NUNdIHwgW1x1MDQ1RS1cdTA0ODFdIHwgW1x1MDQ5MC1cdTA0QzRdIHwgW1x1MDRDNy1cdTA0QzhdIHwgW1x1MDRDQi1cdTA0Q0NdIHwgW1x1MDREMC1cdTA0RUJdIHwgW1x1MDRFRS1cdTA0RjVdIHwgW1x1MDRGOC1cdTA0RjldIHwgW1x1MDUzMS1cdTA1NTZdIHwgXHUwNTU5IHwgW1x1MDU2MS1cdTA1ODZdIHwgW1x1MDVEMC1cdTA1RUFdIHwgW1x1MDVGMC1cdTA1RjJdIHwgW1x1MDYyMS1cdTA2M0FdIHwgW1x1MDY0MS1cdTA2NEFdIHwgW1x1MDY3MS1cdTA2QjddIHwgW1x1MDZCQS1cdTA2QkVdIHwgW1x1MDZDMC1cdTA2Q0VdIHwgW1x1MDZEMC1cdTA2RDNdIHwgXHUwNkQ1IHwgW1x1MDZFNS1cdTA2RTZdIHwgW1x1MDkwNS1cdTA5MzldIHwgXHUwOTNEIHwgW1x1MDk1OC1cdTA5NjFdIHwgW1x1MDk4NS1cdTA5OENdIHwgW1x1MDk4Ri1cdTA5OTBdIHwgW1x1MDk5My1cdTA5QThdIHwgW1x1MDlBQS1cdTA5QjBdIHwgXHUwOUIyIHwgW1x1MDlCNi1cdTA5QjldIHwgW1x1MDlEQy1cdTA5RERdIHwgW1x1MDlERi1cdTA5RTFdIHwgW1x1MDlGMC1cdTA5RjFdIHwgW1x1MEEwNS1cdTBBMEFdIHwgW1x1MEEwRi1cdTBBMTBdIHwgW1x1MEExMy1cdTBBMjhdIHwgW1x1MEEyQS1cdTBBMzBdIHwgW1x1MEEzMi1cdTBBMzNdIHwgW1x1MEEzNS1cdTBBMzZdIHwgW1x1MEEzOC1cdTBBMzldIHwgW1x1MEE1OS1cdTBBNUNdIHwgXHUwQTVFIHwgW1x1MEE3Mi1cdTBBNzRdIHwgW1x1MEE4NS1cdTBBOEJdIHwgXHUwQThEIHwgW1x1MEE4Ri1cdTBBOTFdIHwgW1x1MEE5My1cdTBBQThdIHwgW1x1MEFBQS1cdTBBQjBdIHwgW1x1MEFCMi1cdTBBQjNdIHwgW1x1MEFCNS1cdTBBQjldIHwgXHUwQUJEIHwgXHUwQUUwIHwgW1x1MEIwNS1cdTBCMENdIHwgW1x1MEIwRi1cdTBCMTBdIHwgW1x1MEIxMy1cdTBCMjhdIHwgW1x1MEIyQS1cdTBCMzBdIHwgW1x1MEIzMi1cdTBCMzNdIHwgW1x1MEIzNi1cdTBCMzldIHwgXHUwQjNEIHwgW1x1MEI1Qy1cdTBCNURdIHwgW1x1MEI1Ri1cdTBCNjFdIHwgW1x1MEI4NS1cdTBCOEFdIHwgW1x1MEI4RS1cdTBCOTBdIHwgW1x1MEI5Mi1cdTBCOTVdIHwgW1x1MEI5OS1cdTBCOUFdIHwgXHUwQjlDIHwgW1x1MEI5RS1cdTBCOUZdIHwgW1x1MEJBMy1cdTBCQTRdIHwgW1x1MEJBOC1cdTBCQUFdIHwgW1x1MEJBRS1cdTBCQjVdIHwgW1x1MEJCNy1cdTBCQjldIHwgW1x1MEMwNS1cdTBDMENdIHwgW1x1MEMwRS1cdTBDMTBdIHwgW1x1MEMxMi1cdTBDMjhdIHwgW1x1MEMyQS1cdTBDMzNdIHwgW1x1MEMzNS1cdTBDMzldIHwgW1x1MEM2MC1cdTBDNjFdIHwgW1x1MEM4NS1cdTBDOENdIHwgW1x1MEM4RS1cdTBDOTBdIHwgW1x1MEM5Mi1cdTBDQThdIHwgW1x1MENBQS1cdTBDQjNdIHwgW1x1MENCNS1cdTBDQjldIHwgXHUwQ0RFIHwgW1x1MENFMC1cdTBDRTFdIHwgW1x1MEQwNS1cdTBEMENdIHwgW1x1MEQwRS1cdTBEMTBdIHwgW1x1MEQxMi1cdTBEMjhdIHwgW1x1MEQyQS1cdTBEMzldIHwgW1x1MEQ2MC1cdTBENjFdIHwgW1x1MEUwMS1cdTBFMkVdIHwgXHUwRTMwIHwgW1x1MEUzMi1cdTBFMzNdIHwgW1x1MEU0MC1cdTBFNDVdIHwgW1x1MEU4MS1cdTBFODJdIHwgXHUwRTg0IHwgW1x1MEU4Ny1cdTBFODhdIHwgXHUwRThBIHwgXHUwRThEIHwgW1x1MEU5NC1cdTBFOTddIHwgW1x1MEU5OS1cdTBFOUZdIHwgW1x1MEVBMS1cdTBFQTNdIHwgXHUwRUE1IHwgXHUwRUE3IHwgW1x1MEVBQS1cdTBFQUJdIHwgW1x1MEVBRC1cdTBFQUVdIHwgXHUwRUIwIHwgW1x1MEVCMi1cdTBFQjNdIHwgXHUwRUJEIHwgW1x1MEVDMC1cdTBFQzRdIHwgW1x1MEY0MC1cdTBGNDddIHwgW1x1MEY0OS1cdTBGNjldIHwgW1x1MTBBMC1cdTEwQzVdIHwgW1x1MTBEMC1cdTEwRjZdIHwgXHUxMTAwIHwgW1x1MTEwMi1cdTExMDNdIHwgW1x1MTEwNS1cdTExMDddIHwgXHUxMTA5IHwgW1x1MTEwQi1cdTExMENdIHwgW1x1MTEwRS1cdTExMTJdIHwgXHUxMTNDIHwgXHUxMTNFIHwgXHUxMTQwIHwgXHUxMTRDIHwgXHUxMTRFIHwgXHUxMTUwIHwgW1x1MTE1NC1cdTExNTVdIHwgXHUxMTU5IHwgW1x1MTE1Ri1cdTExNjFdIHwgXHUxMTYzIHwgXHUxMTY1IHwgXHUxMTY3IHwgXHUxMTY5IHwgW1x1MTE2RC1cdTExNkVdIHwgW1x1MTE3Mi1cdTExNzNdIHwgXHUxMTc1IHwgXHUxMTlFIHwgXHUxMUE4IHwgXHUxMUFCIHwgW1x1MTFBRS1cdTExQUZdIHwgW1x1MTFCNy1cdTExQjhdIHwgXHUxMUJBIHwgW1x1MTFCQy1cdTExQzJdIHwgXHUxMUVCIHwgXHUxMUYwIHwgXHUxMUY5IHwgW1x1MUUwMC1cdTFFOUJdIHwgW1x1MUVBMC1cdTFFRjldIHwgW1x1MUYwMC1cdTFGMTVdIHwgW1x1MUYxOC1cdTFGMURdIHwgW1x1MUYyMC1cdTFGNDVdIHwgW1x1MUY0OC1cdTFGNERdIHwgW1x1MUY1MC1cdTFGNTddIHwgXHUxRjU5IHwgXHUxRjVCIHwgXHUxRjVEIHwgW1x1MUY1Ri1cdTFGN0RdIHwgW1x1MUY4MC1cdTFGQjRdIHwgW1x1MUZCNi1cdTFGQkNdIHwgXHUxRkJFIHwgW1x1MUZDMi1cdTFGQzRdIHwgW1x1MUZDNi1cdTFGQ0NdIHwgW1x1MUZEMC1cdTFGRDNdIHwgW1x1MUZENi1cdTFGREJdIHwgW1x1MUZFMC1cdTFGRUNdIHwgW1x1MUZGMi1cdTFGRjRdIHwgW1x1MUZGNi1cdTFGRkNdIHwgXHUyMTI2IHwgW1x1MjEyQS1cdTIxMkJdIHwgXHUyMTJFIHwgW1x1MjE4MC1cdTIxODJdIHwgW1x1MzA0MS1cdTMwOTRdIHwgW1x1MzBBMS1cdTMwRkFdIHwgW1x1MzEwNS1cdTMxMkNdIHwgW1x1QUMwMC1cdUQ3QTNdICAKLQotLyogODYgKi8KLUlkZW9ncmFwaGljICAgID0gICAgW1x1NEUwMC1cdTlGQTVdIHwgXHUzMDA3IHwgW1x1MzAyMS1cdTMwMjldICAKLQotLyogNCAqLyAgLyogaXMgJy4nIHRvIGJlIGVzY2FwZWQ/PyAqLwotTmFtZUNoYXIgICAgICAgPSAgICB7TGV0dGVyfSB8IHtEaWdpdH0gfCAuIHwgLSB8IF8gfCA6IHwge0NvbWJpbmluZ0NoYXJ9IHwge0V4dGVuZGVyfQotCi0vKiA1ICovCi1OYW1lICAgICAgICAgICA9ICh7TGV0dGVyfSB8IF8gfCA6KSB7TmFtZUNoYXJ9KiAKLQotLyogODcgKi8KLUNvbWJpbmluZ0NoYXIgID0gICAgW1x1MDMwMC1cdTAzNDVdIHwgW1x1MDM2MC1cdTAzNjFdIHwgW1x1MDQ4My1cdTA0ODZdIHwgW1x1MDU5MS1cdTA1QTFdIHwgW1x1MDVBMy1cdTA1QjldIHwgW1x1MDVCQi1cdTA1QkRdIHwgXHUwNUJGIHwgW1x1MDVDMS1cdTA1QzJdIHwgXHUwNUM0IHwgW1x1MDY0Qi1cdTA2NTJdIHwgXHUwNjcwIHwgW1x1MDZENi1cdTA2RENdIHwgW1x1MDZERC1cdTA2REZdIHwgW1x1MDZFMC1cdTA2RTRdIHwgW1x1MDZFNy1cdTA2RThdIHwgW1x1MDZFQS1cdTA2RURdIHwgW1x1MDkwMS1cdTA5MDNdIHwgXHUwOTNDIHwgW1x1MDkzRS1cdTA5NENdIHwgXHUwOTREIHwgW1x1MDk1MS1cdTA5NTRdIHwgW1x1MDk2Mi1cdTA5NjNdIHwgW1x1MDk4MS1cdTA5ODNdIHwgXHUwOUJDIHwgXHUwOUJFIHwgXHUwOUJGIHwgW1x1MDlDMC1cdTA5QzRdIHwgW1x1MDlDNy1cdTA5QzhdIHwgW1x1MDlDQi1cdTA5Q0RdIHwgXHUwOUQ3IHwgW1x1MDlFMi1cdTA5RTNdIHwgXHUwQTAyIHwgXHUwQTNDIHwgXHUwQTNFIHwgXHUwQTNGIHwgW1x1MEE0MC1cdTBBNDJdIHwgW1x1MEE0Ny1cdTBBNDhdIHwgW1x1MEE0Qi1cdTBBNERdIHwgW1x1MEE3MC1cdTBBNzFdIHwgW1x1MEE4MS1cdTBBODNdIHwgXHUwQUJDIHwgW1x1MEFCRS1cdTBBQzVdIHwgW1x1MEFDNy1cdTBBQzldIHwgW1x1MEFDQi1cdTBBQ0RdIHwgW1x1MEIwMS1cdTBCMDNdIHwgXHUwQjNDIHwgW1x1MEIzRS1cdTBCNDNdIHwgW1x1MEI0Ny1cdTBCNDhdIHwgW1x1MEI0Qi1cdTBCNERdIHwgW1x1MEI1Ni1cdTBCNTddIHwgW1x1MEI4Mi1cdTBCODNdIHwgW1x1MEJCRS1cdTBCQzJdIHwgW1x1MEJDNi1cdTBCQzhdIHwgW1x1MEJDQS1cdTBCQ0RdIHwgXHUwQkQ3IHwgW1x1MEMwMS1cdTBDMDNdIHwgW1x1MEMzRS1cdTBDNDRdIHwgW1x1MEM0Ni1cdTBDNDhdIHwgW1x1MEM0QS1cdTBDNERdIHwgW1x1MEM1NS1cdTBDNTZdIHwgW1x1MEM4Mi1cdTBDODNdIHwgW1x1MENCRS1cdTBDQzRdIHwgW1x1MENDNi1cdTBDQzhdIHwgW1x1MENDQS1cdTBDQ0RdIHwgW1x1MENENS1cdTBDRDZdIHwgW1x1MEQwMi1cdTBEMDNdIHwgW1x1MEQzRS1cdTBENDNdIHwgW1x1MEQ0Ni1cdTBENDhdIHwgW1x1MEQ0QS1cdTBENERdIHwgXHUwRDU3IHwgXHUwRTMxIHwgW1x1MEUzNC1cdTBFM0FdIHwgW1x1MEU0Ny1cdTBFNEVdIHwgXHUwRUIxIHwgW1x1MEVCNC1cdTBFQjldIHwgW1x1MEVCQi1cdTBFQkNdIHwgW1x1MEVDOC1cdTBFQ0RdIHwgW1x1MEYxOC1cdTBGMTldIHwgXHUwRjM1IHwgXHUwRjM3IHwgXHUwRjM5IHwgXHUwRjNFIHwgXHUwRjNGIHwgW1x1MEY3MS1cdTBGODRdIHwgW1x1MEY4Ni1cdTBGOEJdIHwgW1x1MEY5MC1cdTBGOTVdIHwgXHUwRjk3IHwgW1x1MEY5OS1cdTBGQURdIHwgW1x1MEZCMS1cdTBGQjddIHwgXHUwRkI5IHwgW1x1MjBEMC1cdTIwRENdIHwgXHUyMEUxIHwgW1x1MzAyQS1cdTMwMkZdIHwgXHUzMDk5IHwgXHUzMDlBICAKLQotLyogODggKi8KLURpZ2l0ICAgICAgICAgID0gICAgW1x1MDAzMC1cdTAwMzldIHwgW1x1MDY2MC1cdTA2NjldIHwgW1x1MDZGMC1cdTA2RjldIHwgW1x1MDk2Ni1cdTA5NkZdIHwgW1x1MDlFNi1cdTA5RUZdIHwgW1x1MEE2Ni1cdTBBNkZdIHwgW1x1MEFFNi1cdTBBRUZdIHwgW1x1MEI2Ni1cdTBCNkZdIHwgW1x1MEJFNy1cdTBCRUZdIHwgW1x1MEM2Ni1cdTBDNkZdIHwgW1x1MENFNi1cdTBDRUZdIHwgW1x1MEQ2Ni1cdTBENkZdIHwgW1x1MEU1MC1cdTBFNTldIHwgW1x1MEVEMC1cdTBFRDldIHwgW1x1MEYyMC1cdTBGMjldICAKLQotLyogODkgKi8KLUV4dGVuZGVyICAgICAgID0gICAgXHUwMEI3IHwgXHUwMkQwIHwgXHUwMkQxIHwgXHUwMzg3IHwgXHUwNjQwIHwgXHUwRTQ2IHwgXHUwRUM2IHwgXHUzMDA1IHwgW1x1MzAzMS1cdTMwMzVdIHwgW1x1MzA5RC1cdTMwOUVdIHwgW1x1MzBGQy1cdTMwRkVdICAKLSovCi0KLUxldHRlciAgICAgICAgID0gW2EtekEtWl0KLU5hbWVDaGFyICAgICAgID0ge0xldHRlcn0gfCBbMC05XQotLy9OYW1lICAgICAgICAgICA9ICh7TGV0dGVyfSB8IF8gfCA6KSB7TmFtZUNoYXJ9KiAKLS8vTmFtZSAgICAgICAgICAgPSBbXlx4MjBceDA5XHgwRFx4MEFdKwotTmFtZSAgICAgICAgICAgPSBbXlx4MjBceDA5XHgwRFx4MEFcfCxcIVw/XCtcKlwoXCk8Pl0rCi1FbGVtZW50UmVmTmFtZSA9IFteXHgyMFx4MDlceDBEXHgwQVx8LFw/XCtcKlwoXCk8Pl0rCi1FbnRpdHlOYW1lICAgICA9IFteXHgyMFx4MDlceDBEXHgwQVx8LFw/XCpcKFwpPD5dKwotUGFybUVudGl0eU5hbWUgPSBbXlx4MjBceDA5XHgwRFx4MEFcISU7PD5dKwotCi1Db21tZW50U3RhcnQgICA9IFwhLS0KLUNvbW1lbnRDb250ZW50ID0gW14tPl0rCi1Db21tZW50RW5kICAgICA9IC0tPgotRWxlbWVudFN0YXJ0ICAgPSBFTEVNRU5UCi1FbGVtZW50Q29udGVudCA9IFtePD5dKgotCi1FbnRpdHlTdGFydCAgICA9IEVOVElUWQotRW50aXR5X1Bhcm0gICAgPSAle1N9Ci1FbnRpdHlDb250ZW50ICA9IHtTfVtePD5dKgotCi1Ob3RhdGlvblN0YXJ0ICA9IE5PVEFUSU9OCi1Ob3RhdGlvbkNvbnRlbnQgPSB7U31bXjw+XSoKLUF0dExpc3QgICAgICAgID0gQVRUTElTVAotRXh0ZXJuYWxQYXJtRW50aXR5UmVmID0gJXtQYXJtRW50aXR5TmFtZX07Ci1FbmRUYWcgICAgICAgICA9ID4KLVN0YXJ0VGFnICAgICAgID0gPAotU3lzdGVtICAgICAgICAgPSBTWVNURU0KLVB1YmxpYyAgICAgICAgID0gUFVCTElDCi1ORGF0YSAgICAgICAgICA9IE5EQVRBCi0KLS8vIHRoZXNlIGFyZSBhdHRyaWJ1dGUgdHlwZSBrZXl3b3JkcwotLy8gICB3ZSByZXVzZSBOT1RBVElPTiBmcm9tIE5vdGF0aW9uU3RhcnQKLS8vICAgd2UgcmV1c2UgRU5USVRZIGZyb20gRW50aXR5U3RhcnQKLUNEYXRhICAgICAgICAgID0gQ0RBVEEKLUlEICAgICAgICAgICAgID0gSUQKLUlEUmVmICAgICAgICAgID0gSURSRUYKLUlEUmVmcyAgICAgICAgID0gSURSRUZTCi1FbnRpdGllcyAgICAgICA9IEVOVElUSUVTCi1OTVRva2VuICAgICAgICA9IE5NVE9LRU4KLU5NVG9rZW5zICAgICAgID0gTk1UT0tFTlMKLQotLy8gdGhlc2UgYXJlIGF0dHJpYnV0ZSBkZWZhdWx0cyBrZXl3b3JkcwotUmVxdWlyZWQgICAgICAgPSAjUkVRVUlSRUQKLUltcGxpZWQgICAgICAgID0gI0lNUExJRUQKLUZpeGVkICAgICAgICAgID0gI0ZJWEVECi0KLQotRW1wdHkgICAgICAgICAgPSBFTVBUWQotQW55ICAgICAgICAgICAgPSBBTlkKLVBjRGF0YSAgICAgICAgID0gI1BDREFUQQotTGVmdFBhcmVuICAgICAgPSBcKAotUmlnaHRQYXJlbiAgICAgPSBcKQotCi1QZXJjZW50ICAgICAgICA9ICUKLVNlbWljb2xvbiAgICAgID0gOwotUGx1cyAgICAgICAgICAgPSBcKwotQ2hvaWNlICA9IFx8Ci1TZXF1ZW5jZSA9ICwKLUNvbm5lY3RvciAgICAgID0ge0Nob2ljZX18e1NlcXVlbmNlfQotT2NjdXJPcHRpb25hbCAgPSBcPwotT2NjdXJPbmVPck1vcmUgPSBcKwotT2NjdXJaZXJvT3JNb3JlID0gXCoKLU9jY3VyVHlwZSAgICAgID0ge09jY3VyT3B0aW9uYWx9fHtPY2N1ck9uZU9yTW9yZX18e09jY3VyWmVyb09yTW9yZX0KLUV4Y2xhbWF0aW9uICAgPSBcIQotU2luZ2xlUXVvdGVkTGl0ZXJhbCA9ICdbXiddKicKLURvdWJsZVF1b3RlZExpdGVyYWwgPSBcIlteXCJdKlwiCi1Ob25UYWdDb250ZW50ID0gW15ceDIwXHgwOVx4MERceDBBPD5dKgotTm9uRW51bUNvbnRlbnQgPSBbXlx4MjBceDA5XHgwRFx4MEE8PlwoXClcfF0qCi0KLSUlCi0KLTxZWUlOSVRJQUw+IHsKLSAge1N0YXJ0VGFnfSAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TVEFSVF9UQUcpOyB9Ci0gIHtFbmRUYWd9ICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5EX1RBRyk7IH0KLSAge0V4Y2xhbWF0aW9ufSAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTik7IH0KLSAge1BlcmNlbnR9ICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QRVJDRU5UKTsgfQotICB7U2VtaWNvbG9ufSAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNFTUlDT0xPTik7IH0KLQotICB7RWxlbWVudFN0YXJ0fSAgIHsgeXliZWdpbihFTEVNRU5UX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpOyB9Ci0gIHtDb21tZW50U3RhcnR9ICAgeyB5eWJlZ2luKENPTU1FTlRfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKTsgfQotICB7RW50aXR5U3RhcnR9ICAgIHsgeXliZWdpbihFTlRJVFlfTkFNRSk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKTsgfQotICB7Tm90YXRpb25TdGFydH0gIHsgeXliZWdpbihOT1RBVElPTl9OQU1FKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRyk7IH0KLSAge0F0dExpc3R9ICAgICAgICB7IHl5YmVnaW4oQVRUTElTVF9OQU1FKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKTsgfQotCi0gIHtFeHRlcm5hbFBhcm1FbnRpdHlSZWZ9ICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX1BBUk0pOyB9Ci0vLyBqdXN0IGEgcGFybWVudGl0eW5hbWUgYnkgaXRzZWxmIGlzIG5vIGdvb2QuICB3ZSB1c2UgdGhpcwotLy8gdG8gY2FwdHVyZSBnYXJiYWdlIGNvbnRlbnQgYXQgdGhlIHRvcCBsZXZlbAotICB7UGFybUVudGl0eU5hbWV9ICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0KLQotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci19Ci0KLTxFTEVNRU5UX05BTUU+IHsKLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7UGNEYXRhfXxcKHtTfSp7UGNEYXRhfXtTfSpcKSB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSk7IH0KLSAge05hbWV9ICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgfQotCi0gIHtMZWZ0UGFyZW59ICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTik7IH0KLSAge0Nvbm5lY3Rvcn0gICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT05ORUNUT1IpOyB9ICAgIAotICB7T2NjdXJUeXBlfSAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUpOyB9Ci0gIHtSaWdodFBhcmVufSAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUklHSFRfUEFSRU4pOyB9Ci0KLSAge1N0YXJ0VGFnfSAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotICB7RW5kVGFnfSAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLS8vICoqKioqKioqIDwhQVRUTElTVC4uLj4KLTxBVFRMSVNUX05BTUU+IHsKLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7TmFtZX0gICAgICAgICAgIHsgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7IH0KLSAge05vblRhZ0NvbnRlbnR9ICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi08QVRUTElTVF9DT05URU5UPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge05hbWV9ICAgICAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQVRUUklCVVRFX05BTUUpOyB9Ci0gIHtOb25UYWdDb250ZW50fSAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotPEFUVFJJQlVURV9DT05URU5UPiB7Ci0gIHtMaW5lVGVybWluYXRvcn0geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IH0KLSAge05vbkxpbmVUZXJtaW5hdG9yV2hpdGVzcGFjZX0KLSAgICAgICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7Q0RhdGF9ICAgICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DREFUQV9LRVlXT1JEKTsgfSAgCi0KLSAge0lEfSAgICAgICAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURfS0VZV09SRCk7IH0gICAgICAgCi0gIHtJRFJlZn0gICAgICAgICAgeyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLklEUkVGX0tFWVdPUkQpOyB9ICAKLSAge0lEUmVmc30gICAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQpOyB9ICAKLSAge0VudGl0eVN0YXJ0fSAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQpOyB9ICAKLSAge0VudGl0aWVzfSAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRJRVNfS0VZV09SRCk7IH0gIAotICB7Tk1Ub2tlbn0gICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQpOyB9ICAKLSAge05NVG9rZW5zfSAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCk7IH0gIAotICB7Tm90YXRpb25TdGFydH0gIHsgeXliZWdpbihBVFRSSUJVVEVfRU5VTUVSQVRJT04pOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCk7IH0gIAotCi0gIHtSZXF1aXJlZH0gfCB7SW1wbGllZH0gfCB7Rml4ZWR9IHwge1NpbmdsZVF1b3RlZExpdGVyYWx9IHwgeyBEb3VibGVRdW90ZWRMaXRlcmFsfQotICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IH0KLQotICB7TGVmdFBhcmVufSAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihBVFRSSUJVVEVfRU5VTUVSQVRJT04pOyB9ICAKLSAge05vbkVudW1Db250ZW50fSB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUEFSTV9FTlRJVFlfVFlQRSk7IH0KLSAge05vbkVudW1Db250ZW50fXx7UmlnaHRQYXJlbn18e0Nob2ljZX0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLTxBVFRSSUJVVEVfREVGQVVMVD4gewotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtSZXF1aXJlZH0gICAgICAgeyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5SRVFVSVJFRF9LRVlXT1JEKTsgfQotICB7SW1wbGllZH0gICAgICAgIHsgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JEKTsgfQotICB7Rml4ZWR9ICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQpOyB9Ci0gIHtTaW5nbGVRdW90ZWRMaXRlcmFsfSAgeyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCk7IH0KLSAge0RvdWJsZVF1b3RlZExpdGVyYWx9ICB7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKTsgfQotICB7Tm9uVGFnQ29udGVudH0gICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgfSAvL3JldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi08QVRUUklCVVRFX0VOVU1FUkFUSU9OPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge0xlZnRQYXJlbn0gICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5MRUZUX1BBUkVOKTsgfQotICB7Q2hvaWNlfSAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVU1fQ0hPSUNFKTsgfQotICB7UmlnaHRQYXJlbn0gICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTik7IH0KLSAge05vbkVudW1Db250ZW50fSAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi0KLS8vICoqKioqKioqIDwhRU5USVRZLi4uPgotPEVOVElUWV9OQU1FPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge1BlcmNlbnR9ICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QRVJDRU5UKTsgfQotICB7RW50aXR5TmFtZX0gICAgIHsgeXliZWdpbihFTlRJVFlfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotPEVOVElUWV9DT05URU5UPiB7Ci0vLyAge0VudGl0eUNvbnRlbnR9IHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX0NPTlRFTlQpOyB9Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge1N5c3RlbX0gfCB7UHVibGljfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oRVhURVJOQUxJRF9DT05URU5UKTsgfQotICB7U2luZ2xlUXVvdGVkTGl0ZXJhbH0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKTsgfQotICB7RG91YmxlUXVvdGVkTGl0ZXJhbH0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKTsgfQotICB7Tm9uVGFnQ29udGVudH0gICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi0KLS8vICoqKioqKioqIDwhTk9UQVRJT04uLi4+Ci08Tk9UQVRJT05fTkFNRT4gewotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtOYW1lfSAgICAgICAgICAgeyB5eWJlZ2luKEVYVEVSTkFMSURfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotPEVYVEVSTkFMSURfQ09OVEVOVD4gewotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtTeXN0ZW19ICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU1lTVEVNX0tFWVdPUkQpOyB9ICAKLSAge1B1YmxpY30gICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QVUJMSUNfS0VZV09SRCk7IH0gIAotICB7U2luZ2xlUXVvdGVkTGl0ZXJhbH0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKTsgfQotICB7RG91YmxlUXVvdGVkTGl0ZXJhbH0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKTsgfQotICB7TkRhdGF9ICAgICAgICAgIHsgeXliZWdpbihOREFUQV9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQpOyB9Ci0gIHtOb25UYWdDb250ZW50fSAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLTxOREFUQV9DT05URU5UPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge05vblRhZ0NvbnRlbnR9ICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLSAgCi0KLS8vICoqKioqKioqIDwhLS0gLi4uPgotPENPTU1FTlRfQ09OVEVOVD4gewotICB7Q29tbWVudEVuZH0gIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQpOyB9Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge0NvbW1lbnRDb250ZW50fSB8ICItIiB8ICI+IiAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9DT05URU5UKTsgfQotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL2R0ZHNrZWxldG9uIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvZHRkc2tlbGV0b24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYmUwODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvZHRkc2tlbGV0b24KKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLS0tLSBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfQlVGRkVSU0laRSA9IC4uLjsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLS0tLSAgbGV4aWNhbCBzdGF0ZXMsIGNoYXJtYXAKLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIGZpbmFsIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotLS0tIGlzRmluYWwgbGlzdAotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbWVlfQlVGRkVSU0laRV07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIGludCB5eWNvbHVtbjsgCi0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGF0IHRoZSBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0tLS0gdXNlciBjbGFzcyBjb2RlCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLS0tLSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbgotCi0KLSAgLyoqCi0gICAqIFJlZmlsbHMgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgaWZmIHRoZXJlIHdhcyBuZXcgaW5wdXQuCi0gICAqIAotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9yZWZpbGwoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAobnVtUmVhZCA8IDApIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOyAgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLQotICAgIGlmICh5eV9yZWFkZXIgIT0gbnVsbCkKLSAgICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBjdXJyZW50IHN0cmVhbSwgYW5kIHJlc2V0cyB0aGUKLSAgICogc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBBbGwgaW50ZXJuYWwgdmFyaWFibGVzIGFyZSByZXNldCwgdGhlIG9sZCBpbnB1dCBzdHJlYW0gCi0gICAqIDxiPmNhbm5vdDwvYj4gYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4KLSAgICogTGV4aWNhbCBzdGF0ZSBpcyBzZXQgdG8gPHR0PllZX0lOSVRJQUw8L3R0Pi4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRlciAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtIAotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXlyZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eWNsb3NlKCk7Ci0gICAgeXlfcmVhZGVyID0gcmVhZGVyOwotICAgIHl5X2F0RU9GICA9IGZhbHNlOwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQgPSAwOwotICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgPSB5eV9wdXNoYmFja1BvcyA9IDA7Ci0gICAgeXlsaW5lID0geXljaGFyID0geXljb2x1bW4gPSAwOwotICAgIHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA8dHQ+cG9zPC90dD4gZnJvbSB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dC4gCi0gICAqIAotICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvIHl5dGV4dCgpLmNoYXJBdChwb3MpLCBidXQgZmFzdGVyCi0gICAqCi0gICAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgdG8gZmV0Y2guIAotICAgKiAgICAgICAgICAgIEEgdmFsdWUgZnJvbSAwIHRvIHl5bGVuZ3RoKCktMS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIHBvcwotICAgKi8KLSAgZmluYWwgcHVibGljIGNoYXIgeXljaGFyYXQoaW50IHBvcykgewotICAgIHJldHVybiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkK3Bvc107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEluIGEgd2VsbGZvcm1lZCBzY2FubmVyIChubyBvciBvbmx5IGNvcnJlY3QgdXNhZ2Ugb2YgCi0gICAqIHl5cHVzaGJhY2soaW50KSBhbmQgYSBtYXRjaC1hbGwgZmFsbGJhY2sgcnVsZSkgdGhpcyBtZXRob2QgCi0gICAqIHdpbGwgb25seSBiZSBjYWxsZWQgd2l0aCB0aGluZ3MgdGhhdCAiQ2FuJ3QgUG9zc2libHkgSGFwcGVuIi4KLSAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBzb21ldGhpbmcgaXMgc2VyaW91c2x5IHdyb25nCi0gICAqIChlLmcuIGEgSkZsZXggYnVnIHByb2R1Y2luZyBhIGZhdWx0eSBzY2FubmVyIGV0Yy4pLgotICAgKgotICAgKiBVc3VhbCBzeW50YXgvc2Nhbm5lciBsZXZlbCBlcnJvciBoYW5kbGluZyBzaG91bGQgYmUgZG9uZQotICAgKiBpbiBlcnJvciBmYWxsYmFjayBydWxlcy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0tLS0geXlfU2NhbkVycm9yIGRlY2xhcmF0aW9uICAKLSAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICB0cnkgewotICAgICAgbWVzc2FnZSA9IFlZX0VSUk9SX01TR1tlcnJvckNvZGVdOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2UgPSBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl07Ci0gICAgfQotCi0tLS0gdGhyb3dzIGNsYXVzZQotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0tLS0geXlwdXNoYmFjayBkZWNsIChjb250YWlucyB5eV9TY2FuRXJyb3IgZXhjZXB0aW9uKQotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotLS0tIHl5X2RvRW9mCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0tLS0geXlsZXggZGVjbGFyYXRpb24KLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotICAgIC8vIGNhY2hlZCBmaWVsZHM6Ci0gICAgaW50IHl5X2N1cnJlbnRQb3NfbDsKLSAgICBpbnQgeXlfbWFya2VkUG9zX2w7Ci0gICAgaW50IHl5X2VuZFJlYWRfbCA9IHl5X2VuZFJlYWQ7Ci0gICAgY2hhciBbXSB5eV9idWZmZXJfbCA9IHl5X2J1ZmZlcjsKLSAgICBjaGFyIFtdIHl5Y21hcF9sID0geXljbWFwOwotCi0tLS0gbG9jYWwgZGVjbGFyYXRpb25zCi0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeXlfbWFya2VkUG9zX2wgPSB5eV9tYXJrZWRQb3M7Ci0KLS0tLSBzdGFydCBhZG1pbiAobGluZSwgY2hhciwgY29sIGNvdW50KQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3NfbCA9IHl5X2N1cnJlbnRQb3MgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zX2w7Ci0gIAotLS0tIHN0YXJ0IGFkbWluIChsZXhzdGF0ZSBldGMpCi0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotLS0tIG5leHQgaW5wdXQsIGxpbmUsIGNvbCwgY2hhciBjb3VudCwgbmV4dCB0cmFuc2l0aW9uLCBpc0ZpbmFsIGFjdGlvbgotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zX2wgPSB5eV9jdXJyZW50UG9zX2w7IAotLS0tIGxpbmUgY291bnQgdXBkYXRlCi0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb24KLSAgICAgIHl5X21hcmtlZFBvcyA9IHl5X21hcmtlZFBvc19sOwotLS0tIGNoYXIgY291bnQgdXBkYXRlCi0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7Ci0KLS0tLSBhY3Rpb25zCi0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotLS0tIGVvZnZhbHVlCi0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLS0tLSBubyBtYXRjaAotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotLS0tIG1haW4KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RUREJhdGNoTm9kZURlbGV0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RUREJhdGNoTm9kZURlbGV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTUxNGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERCYXRjaE5vZGVEZWxldGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgRFREQmF0Y2hOb2RlRGVsZXRlIHsKLQlwcm90ZWN0ZWQgRFRERmlsZSBkdGRGaWxlOwotCi0JcHJvdGVjdGVkIExpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgRFREQmF0Y2hOb2RlRGVsZXRlKERUREZpbGUgZHRkRmlsZSkgewotCQl0aGlzLmR0ZEZpbGUgPSBkdGRGaWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE5vZGUoRFRETm9kZSBub2RlKSB7Ci0JCS8vIGZpcnN0IGNoZWNrIGlmIHRoZSBub2RlIGlzIGNvbnRhaW5lZCBieSBhbnlvbmUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5zaXplKCk7IGkrKykgewotCQkJRFRETm9kZSBjdXJyZW50Tm9kZSA9IChEVEROb2RlKSBub2Rlcy5nZXQoaSk7Ci0KLQkJCWlmIChjdXJyZW50Tm9kZS5jb250YWluc1JhbmdlKG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgbm9kZS5nZXRFbmRPZmZzZXQoKSkpIHsKLQkJCQkvLyB0aGVuIG5vIG5lZWQgdG8gYWRkIHRoZSBub2RlIHRvIHRoZSBsaXN0IHRvIGJlIGRlbGV0ZWQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChub2RlLmdldFN0YXJ0T2Zmc2V0KCkgPCBjdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpICYmIG5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gY3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCW5vZGVzLmFkZChpLCBub2RlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgd2UgZ2V0IGhlcmUsIHRoZW4gYWRkIGl0IHRvIHRoZSBlbmQKLQkJbm9kZXMuYWRkKG5vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZU5vZGVzKE9iamVjdCByZXF1ZXN0b3IpIHsKLQkJZm9yIChpbnQgaSA9IG5vZGVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgbm9kZXMuZ2V0KGkpOwotCQkJZHRkRmlsZS5kZWxldGVOb2RlKHJlcXVlc3Rvciwgbm9kZSk7Ci0JCX0KLQkJbm9kZXMuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRERXh0ZXJuYWxSZWZlcmVuY2VSZW1vdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRERXh0ZXJuYWxSZWZlcmVuY2VSZW1vdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlODUzYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RUREV4dGVybmFsUmVmZXJlbmNlUmVtb3Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotCi0KLS8qCi0gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciB1cGRhdGluZyB0aGUgbW9kZWwgd2hlbiBpdGVtcyBhcmUgZGVsZXRlZCBvcgotICogc28gdGhhdCBpdGVtcyByZWZlcmVuY2VkIGJ5IGl0IGFyZSBjbGVhbmVkIHVwIG5vdGUgdGhhdCB0b3AgbGV2ZWwgbm9kZXMgYXJlCi0gKiBxdWV1ZWQgdXAgZm9yIGRlbGV0aW9uIHNvIHRoYXQgaXRlcmF0aW9uIG92ZXIgdGhlIGxpc3Qgb2Ygbm9kZXMgZnJvbSB0aGUKLSAqIGR0ZGZpbGUgaXMgbm90IG1lc3NlZCB1cC4gTm90ZSB0aGF0IHdoZW4gYW4gZXh0ZXJuYWwgcGFybWV0ZXIgZW50aXR5Ci0gKiBjaGFuZ2VzLCB0aGUgY2xpZW50IG9mIHRoZSBtb2RlbCAoZS5nLiBlZGl0b3IpIG11c3QgYmUgYSBEVERGaWxlTGlzdGVuZXIKLSAqIGltcGxlbWVudGluZyB0aGUgbGlzdGVuZXIncyBpbnRlcmZhY2UgdG8ga2VlcCB0aGUgbW9kZWwncyByZWZlcmVudGlhbAotICogaW50ZWdyaXR5IChTZWUgRFRETW9kZWxJbXBsIGZvciBleGFtcGxlKS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRFRERXh0ZXJuYWxSZWZlcmVuY2VSZW1vdmVyIGV4dGVuZHMgRFREVmlzaXRvciB7Ci0KLQlwcm90ZWN0ZWQgRFREQmF0Y2hOb2RlRGVsZXRlIGJhdGNoRGVsZXRlOwotCXByb3RlY3RlZCBMaXN0IGV4dGVybmFsRWxlbWVudHNBbmRQYXJtRW50aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Bhcm1FbnRpdHkgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzVXBkYXRpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgRFRETm9kZSBub2RlVG9EZWxldGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBvbGRSZWZOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgT2JqZWN0IHJlcXVlc3RvcjsKLQotCXB1YmxpYyBEVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZXh0ZXJuYWxSZWZlcmVuY2VBYm91dFRvQ2hhbmdlKE9iamVjdCByZXF1ZXN0b3IsIEVudGl0eSBlbnRpdHkpIHsKLQkJaWYgKGlzVXBkYXRpbmcpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIWVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpIHx8ICFlbnRpdHkuaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQkvLyBpZiBpdCBpcyBub3QgYW4gZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0eSwgaWdub3JlIGFzIHdlbGwKLQkJCXJldHVybjsKLQkJfQotCi0JCWlzVXBkYXRpbmcgPSB0cnVlOwotCQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLQotCQlEVERGaWxlIGR0ZEZpbGUgPSBlbnRpdHkuZ2V0RFRERmlsZSgpOwotCQlpZiAoYmF0Y2hEZWxldGUgPT0gbnVsbCkgewotCQkJYmF0Y2hEZWxldGUgPSBuZXcgRFREQmF0Y2hOb2RlRGVsZXRlKGR0ZEZpbGUpOwotCQl9Ci0KLQkJLy8gU2VlIHRoZSBjb21tZW50IGF0IHRoZSBoZWFkIG9mIHRoaXMgZmlsZSByZWdhcmRpbmcKLQkJLy8gZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0aWVzLgotCQkvLyBleHRlcm5hbEVsZW1lbnRzQW5kUGFybUVudGl0aWVzID0KLQkJLy8gZHRkRmlsZS5nZXREVERNb2RlbCgpLmdldEV4dGVybmFsTW9kZWxzKCkuZ2V0RWxlbWVudENvbnRlbnROYW1lcyhlbnRpdHkuZ2V0UHVibGljSUQoKSwKLQkJLy8gZHRkRmlsZS5nZXREVERNb2RlbCgpLnJlc29sdmVJRChlbnRpdHkuZ2V0UHVibGljSUQoKSwKLQkJLy8gZW50aXR5LmdldFN5c3RlbUlEKCkpKTsKLQotCQl2aXNpdChkdGRGaWxlKTsKLQotCQliYXRjaERlbGV0ZS5kZWxldGVOb2RlcyhyZXF1ZXN0b3IpOwotCi0JCWlzVXBkYXRpbmcgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hdGNoaW5nTmFtZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZXh0ZXJuYWxFbGVtZW50c0FuZFBhcm1FbnRpdGllcy5jb250YWlucyhuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cikgewotCQlzdXBlci52aXNpdEF0dHJpYnV0ZShhdHRyKTsKLQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCVN0cmluZyBhdHRyVHlwZSA9IGF0dHIuZ2V0VHlwZSgpOwotCi0JCWlmIChpc1BhcmFtZXRlckVudGl0eVJlZihhdHRyTmFtZSkpIHsKLQkJCWlmIChpc01hdGNoaW5nTmFtZShhdHRyTmFtZSkpIHsKLQkJCQlhdHRyLnNldE5hbWUocmVxdWVzdG9yLCAiVGVtcE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWlmIChpc1BhcmFtZXRlckVudGl0eVJlZihhdHRyVHlwZSkpIHsKLQkJCWlmIChpc01hdGNoaW5nTmFtZShhdHRyVHlwZSkpIHsKLQkJCQlhdHRyLnNldFR5cGUocmVxdWVzdG9yLCBBdHRyaWJ1dGUuQ0RBVEEpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVMaXN0KEF0dHJpYnV0ZUxpc3QgYXR0TGlzdCkgewotCQlzdXBlci52aXNpdEF0dHJpYnV0ZUxpc3QoYXR0TGlzdCk7Ci0JCVN0cmluZyBhdHRMaXN0TmFtZSA9IGF0dExpc3QuZ2V0TmFtZSgpOwotCQlpZiAoaXNQYXJhbWV0ZXJFbnRpdHlSZWYoYXR0TGlzdE5hbWUpKSB7Ci0JCQlpZiAoaXNNYXRjaGluZ05hbWUoYXR0TGlzdE5hbWUpKSB7Ci0JCQkJYXR0TGlzdC5zZXROYW1lKHJlcXVlc3RvciwgIlRlbXBOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGVsZW1lbnROYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCWlmIChpc1BhcmFtZXRlckVudGl0eVJlZihlbGVtZW50TmFtZSkpIHsKLQkJCWlmIChpc01hdGNoaW5nTmFtZShlbGVtZW50TmFtZSkpIHsKLQkJCQllbGVtZW50LnNldE5hbWUocmVxdWVzdG9yLCAiVGVtcE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXN1cGVyLnZpc2l0RWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFJlZmVyZW5jZShDTUJhc2ljTm9kZSBub2RlKSB7Ci0JCXN1cGVyLnZpc2l0UmVmZXJlbmNlKG5vZGUpOwotCQlTdHJpbmcgcmVmTmFtZSA9IG5vZGUuZ2V0TmFtZSgpOwotCQlpZiAoaXNNYXRjaGluZ05hbWUocmVmTmFtZSkpIHsKLQkJCWJhdGNoRGVsZXRlLmFkZE5vZGUobm9kZSk7Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURE1vZGVsVXBkYXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURE1vZGVsVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjljZGZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERNb2RlbFVwZGF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotCi0KLS8vIHRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHVwZGF0aW5nIHRoZSBtb2RlbCB3aGVuIGl0ZW1zCi0vLyBhcmUgZGVsZXRlZCBvciBhIGV4dGVybmFsIHBhcm0gZW50aXR5IGNoYW5nZXMgc28gdGhhdAotLy8gaXRlbXMgcmVmZXJlbmNlZCBieSBpdCBhcmUgY2xlYW5lZCB1cAotLy8gbm90ZSB0aGF0IHRvcCBsZXZlbCBub2RlcyBhcmUgcXVldWVkIHVwIGZvciBkZWxldGlvbiBzbyB0aGF0Ci0vLyBpdGVyYXRpb24gb3ZlciB0aGUgbGlzdCBvZiBub2RlcyBmcm9tIHRoZSBkdGRmaWxlIGlzIG5vdCBtZXNzZWQgdXAKLXB1YmxpYyBjbGFzcyBEVERNb2RlbFVwZGF0ZXIgZXh0ZW5kcyBEVERWaXNpdG9yIHsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzUGFybUVudGl0eSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNVcGRhdGluZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIExpc3Qgbm9kZXNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgRFRETm9kZSBub2RlVG9EZWxldGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBvbGRSZWZOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgT2JqZWN0IHJlcXVlc3RvcjsKLQotCXB1YmxpYyBEVERNb2RlbFVwZGF0ZXIoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgb2JqZWN0QWJvdXRUb0JlRGVsZXRlZChPYmplY3QgcmVxdWVzdG9yLCBEVEROb2RlIG5vZGUpIHsKLQkJaWYgKGlzVXBkYXRpbmcpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIShub2RlIGluc3RhbmNlb2YgRW50aXR5IHx8IG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkgewotCQkJLy8ganVzdCBpZ25vcmUgaWYgaXQgaXMgbm90IG9uZSBvZiB0aGVzZQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRW50aXR5ICYmICEoKEVudGl0eSkgbm9kZSkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkgewotCQkJLy8gaWYgaXQgaXMgbm90IGEgcGFyYW1ldGVyIGVudGl0eSwgaWdub3JlIGFzIHdlbGwKLQkJCXJldHVybjsKLQkJfQotCi0KLQkJaXNVcGRhdGluZyA9IHRydWU7Ci0JCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwotCQl0aGlzLm5vZGVUb0RlbGV0ZSA9IG5vZGU7Ci0JCW9sZFJlZk5hbWUgPSBub2RlLmdldE5hbWUoKTsKLQkJaXNQYXJtRW50aXR5ID0gZmFsc2U7Ci0JCW5vZGVzVG9EZWxldGUuY2xlYXIoKTsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJaXNQYXJtRW50aXR5ID0gdHJ1ZTsKLQkJCW9sZFJlZk5hbWUgPSAiJSIgKyBvbGRSZWZOYW1lICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCURUREZpbGUgZHRkRmlsZSA9IG5vZGUuZ2V0RFRERmlsZSgpOwotCQl2aXNpdChkdGRGaWxlKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzVG9EZWxldGUuc2l6ZSgpOyBpKyspIHsKLQkJCWR0ZEZpbGUuZGVsZXRlTm9kZShyZXF1ZXN0b3IsIChEVEROb2RlKSBub2Rlc1RvRGVsZXRlLmdldChpKSk7Ci0JCX0KLQotCQlpc1VwZGF0aW5nID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHIpIHsKLQkJc3VwZXIudmlzaXRBdHRyaWJ1dGUoYXR0cik7Ci0JCWlmIChpc1Bhcm1FbnRpdHkpIHsKLQkJCWlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCQlhdHRyLnNldE5hbWUocmVxdWVzdG9yLCAiVGVtcE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGF0dHIuZ2V0VHlwZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCWF0dHIuc2V0VHlwZShyZXF1ZXN0b3IsIEF0dHJpYnV0ZS5DREFUQSk7Ci0JCQl9Ci0JCX0KLQkJLy8gY2hlY2sgdGhlIGF0dHIgbmFtZSBhbmQgdGhlIGF0dHIgdHlwZSB0byBzZWUgaWYgaXQKLQkJLy8gbmVlZHMgdXBkYXRpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUxpc3QoQXR0cmlidXRlTGlzdCBhdHRMaXN0KSB7Ci0JCXN1cGVyLnZpc2l0QXR0cmlidXRlTGlzdChhdHRMaXN0KTsKLQkJaWYgKGF0dExpc3QuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJaWYgKGlzUGFybUVudGl0eSkgewotCQkJCWF0dExpc3Quc2V0TmFtZShyZXF1ZXN0b3IsICJUZW1wTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBzYXZlIHVwIGZvciBsYXRlciBkZWxldGlvbgotCQkJCW5vZGVzVG9EZWxldGUuYWRkKGF0dExpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoaXNQYXJtRW50aXR5KSB7Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQkJZWxlbWVudC5zZXROYW1lKHJlcXVlc3RvciwgIlRlbXBOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlzdXBlci52aXNpdEVsZW1lbnQoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFeHRlcm5hbFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eVJlZikgewotCQlzdXBlci52aXNpdEV4dGVybmFsUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHBhcm1FbnRpdHlSZWYpOwotCQlpZiAoaXNQYXJtRW50aXR5ICYmIHBhcm1FbnRpdHlSZWYuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJbm9kZXNUb0RlbGV0ZS5hZGQocGFybUVudGl0eVJlZik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFJlZmVyZW5jZShDTUJhc2ljTm9kZSBub2RlKSB7Ci0JCXN1cGVyLnZpc2l0UmVmZXJlbmNlKG5vZGUpOwotCi0JCWlmIChub2RlLmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCURURE5vZGUgcGFyZW50ID0gKERURE5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJcGFyZW50LmRlbGV0ZShyZXF1ZXN0b3IsIG5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3Zlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGI5ZTQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVEROb3RhdGlvblJlZmVyZW5jZVJlbW92ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUVudW1MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBEVEROb3RhdGlvblJlZmVyZW5jZVJlbW92ZXIgewotCXByb3RlY3RlZCBOb3RhdGlvbiBub3RhdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5vdGF0aW9uTmFtZTsKLQotCXByb3RlY3RlZCBPYmplY3QgcmVxdWVzdG9yOwotCi0JcHVibGljIERURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3ZlcigpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGF0aW9uQWJvdXRUb0JlRGVsZXRlZChPYmplY3QgcmVxdWVzdG9yLCBOb3RhdGlvbiBub3RhdGlvbikgewotCQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLQkJdGhpcy5ub3RhdGlvbiA9IG5vdGF0aW9uOwotCQlub3RhdGlvbk5hbWUgPSBub3RhdGlvbi5nZXROYW1lKCk7Ci0KLQkJdmlzaXQobm90YXRpb24uZ2V0RFRERmlsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdChEVERGaWxlIGZpbGUpIHsKLQkJTGlzdCBub2RlcyA9IGZpbGUuZ2V0Tm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5zaXplKCk7IGkrKykgewotCQkJRFRETm9kZSBjdXJyZW50Tm9kZSA9IChEVEROb2RlKSBub2Rlcy5nZXQoaSk7Ci0JCQlpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQl2aXNpdEVudGl0eSgoRW50aXR5KSBjdXJyZW50Tm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCQl2aXNpdEF0dHJpYnV0ZUxpc3QoKEF0dHJpYnV0ZUxpc3QpIGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyKSB7Ci0JCWlmIChhdHRyLmdldFR5cGUoKS5lcXVhbHMoQXR0cmlidXRlLkVOVU1FUkFURURfTk9UQVRJT04pKSB7Ci0JCQlBdHRyaWJ1dGVFbnVtTGlzdCBlbnVtTGlzdCA9IGF0dHIuZ2V0RW51bUxpc3QoKTsKLQkJCUxpc3Qgbm90YXRpb25OYW1lcyA9IGVudW1MaXN0LmdldEl0ZW1zKCk7Ci0JCQlJdGVyYXRvciBpdGVyID0gbm90YXRpb25OYW1lcy5pdGVyYXRvcigpOwotCQkJYm9vbGVhbiB1cGRhdGVSZXF1aXJlZCA9IGZhbHNlOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIG5vdGF0aW9uID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG5vdGF0aW9uLmVxdWFscyhub3RhdGlvbk5hbWUpKSB7Ci0JCQkJCXVwZGF0ZVJlcXVpcmVkID0gdHJ1ZTsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodXBkYXRlUmVxdWlyZWQpIHsKLQkJCQlTdHJpbmdbXSBuZXdJdGVtcyA9IG5ldyBTdHJpbmdbbm90YXRpb25OYW1lcy5zaXplKCldOwotCQkJCW5vdGF0aW9uTmFtZXMudG9BcnJheShuZXdJdGVtcyk7Ci0JCQkJZW51bUxpc3Quc2V0SXRlbXMocmVxdWVzdG9yLCBuZXdJdGVtcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUxpc3QoQXR0cmlidXRlTGlzdCBhdHRMaXN0KSB7Ci0JCUF0dHJpYnV0ZSBhdHRyID0gKEF0dHJpYnV0ZSkgYXR0TGlzdC5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChhdHRyICE9IG51bGwpIHsKLQkJCXZpc2l0QXR0cmlidXRlKGF0dHIpOwotCQkJYXR0ciA9IChBdHRyaWJ1dGUpIGF0dHIuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RW50aXR5KEVudGl0eSBlbnRpdHkpIHsKLQkJaWYgKGVudGl0eS5nZXROb3RhdGlvbk5hbWUoKS5lcXVhbHMobm90YXRpb25OYW1lKSkgewotCQkJZW50aXR5LnNldE5vdGF0aW9uTmFtZShyZXF1ZXN0b3IsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19Ly8gRFRETm90YXRpb25SZW1vdmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREUmVmZXJlbmNlVXBkYXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURFJlZmVyZW5jZVVwZGF0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE5Mjk3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREUmVmZXJlbmNlVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVFbnVtTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLlBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLQotCi0vLyB0aGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciB1cGRhdGluZyBhbnkgZHRkIG5vZGUgaW4KLS8vIHJlc3BvbnNlIHRvIGEgY2hhbmdlIGluIHRoZSBub2RlIHRoYXQgdGhleSByZWZlcmVuY2UKLXB1YmxpYyBjbGFzcyBEVERSZWZlcmVuY2VVcGRhdGVyIGV4dGVuZHMgRFREVmlzaXRvciB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOb3RhdGlvbiA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJtRW50aXR5ID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1VwZGF0aW5nID0gZmFsc2U7Ci0JcHJvdGVjdGVkIFN0cmluZyBuZXdOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIG9sZFJlZk5hbWUgPSAiIiwgbmV3UmVmTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwcm90ZWN0ZWQgRFRETm9kZSByZWZlcmVuY2VkTm9kZSA9IG51bGw7Ci0KLQkvLyB0aGUgcmVmZXJlbmNlcyBMaXN0IGlzIGEgY2FjaGUgb2YgdGhlIERURE5vZGVzIHRoYXQgYXJlIGNoYW5nZWQKLQkvLyBhcyBhIHJlc3VsdCBvZiBhIGNhbGwgdG8gbmFtZUFib3V0VG9DaGFuZ2UoKS4gVGhlIGlkZWEgaXMgdGhhdAotCS8vIGlmIGEgc3Vic2VxdWVudCBjYWxsIGNvbWVzIGluIHRoYXQgY2hhbmdlcyB0aGUgbmFtZSBvZiB0aGUgc2FtZQotCS8vIG9iamVjdCBmb3Igd2hpY2ggdGhpcyBjYWNoZSBleGlzdHMgZm9yLCB0aGVuIHdlIG9wdGltaXplIHRoZQotCS8vIHBhdGggYnkganVzdCB3YWxraW5nIHRoZSBjYWNoZQotCXByaXZhdGUgTGlzdCByZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBPYmplY3QgcmVxdWVzdG9yOwotCi0JcHVibGljIERURFJlZmVyZW5jZVVwZGF0ZXIoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhckNhY2hlKCkgewotCQlyZWZlcmVuY2VkTm9kZSA9IG51bGw7Ci0JCXJlZmVyZW5jZXMuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbmFtZUFib3V0VG9DaGFuZ2UoT2JqZWN0IHJlcXVlc3RvciwgRFRETm9kZSByZWZlcmVuY2VkTm9kZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKGlzVXBkYXRpbmcpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIShyZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIEVudGl0eSB8fCByZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgcmVmZXJlbmNlZE5vZGUgaW5zdGFuY2VvZiBOb3RhdGlvbikpIHsKLQkJCS8vIGp1c3QgaWdub3JlIGlmIGl0IGlzIG5vdCBvbmUgb2YgdGhlc2UKLQkJCXJldHVybjsKLQkJfQotCQlpZiAocmVmZXJlbmNlZE5vZGUgaW5zdGFuY2VvZiBFbnRpdHkgJiYgISgoRW50aXR5KSByZWZlcmVuY2VkTm9kZSkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkgewotCQkJLy8gaWYgaXQgaXMgbm90IGEgcGFyYW1ldGVyIGVudGl0eSwgaWdub3JlIGFzIHdlbGwKLQkJCXJldHVybjsKLQkJfQotCi0JCWlzVXBkYXRpbmcgPSB0cnVlOwotCQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLQkJb2xkUmVmTmFtZSA9IHJlZmVyZW5jZWROb2RlLmdldE5hbWUoKTsKLQkJdGhpcy5uZXdOYW1lID0gbmV3UmVmTmFtZSA9IG5ld05hbWU7Ci0JCWlzUGFybUVudGl0eSA9IGZhbHNlOwotCQlpc05vdGF0aW9uID0gcmVmZXJlbmNlZE5vZGUgaW5zdGFuY2VvZiBOb3RhdGlvbjsKLQotCQlpZiAocmVmZXJlbmNlZE5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCWlzUGFybUVudGl0eSA9IHRydWU7Ci0JCQlvbGRSZWZOYW1lID0gIiUiICsgb2xkUmVmTmFtZSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQluZXdSZWZOYW1lID0gIiUiICsgbmV3UmVmTmFtZSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlpZiAodGhpcy5yZWZlcmVuY2VkTm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBjaGVjayBpZiB0aGUgcHJldmlvdXMgcmVmZXJlbmNlZCBub2RlIHRoYXQgd2FzIGNoYW5nZWQKLQkJCS8vIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgdGhhdCBpcyBjb21pbmcgaW4uIGlmIHNvLCBqdXN0Ci0JCQkvLyBjaGFuZ2UgdGhlIHByZXZpb3VzIHJlZ2lvbnMKLQkJCWlmICh0aGlzLnJlZmVyZW5jZWROb2RlID09IHJlZmVyZW5jZWROb2RlKSB7Ci0JCQkJcXVpY2tVcGRhdGUoKTsKLQkJCQlpc1VwZGF0aW5nID0gZmFsc2U7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gY2xlYXIgdGhlIGNhY2hlIGlmIHdlIGdldCBoZXJlCi0JCXRoaXMucmVmZXJlbmNlZE5vZGUgPSByZWZlcmVuY2VkTm9kZTsKLQkJcmVmZXJlbmNlcy5jbGVhcigpOwotCQlEVERGaWxlIGR0ZEZpbGUgPSByZWZlcmVuY2VkTm9kZS5nZXREVERGaWxlKCk7Ci0JCXZpc2l0KGR0ZEZpbGUpOwotCQlpc1VwZGF0aW5nID0gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcXVpY2tVcGRhdGUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5zaXplKCk7IGkrKykgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIHJlZmVyZW5jZXMuZ2V0KGkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJdmlzaXRFbGVtZW50KChFbGVtZW50KSBub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkJdmlzaXRBdHRyaWJ1dGVMaXN0KChBdHRyaWJ1dGVMaXN0KSBub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCQl2aXNpdEF0dHJpYnV0ZSgoQXR0cmlidXRlKSBub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJCXZpc2l0UmVmZXJlbmNlKChDTUJhc2ljTm9kZSkgbm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSB7Ci0JCQkJdmlzaXRFeHRlcm5hbFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgoUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBub2RlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyKSB7Ci0JCXN1cGVyLnZpc2l0QXR0cmlidXRlKGF0dHIpOwotCQlpZiAoaXNQYXJtRW50aXR5KSB7Ci0JCQkvLyBjaGVjayB0aGUgYXR0ciBuYW1lIGFuZCB0aGUgYXR0ciB0eXBlIHRvIHNlZSBpZiBpdAotCQkJLy8gbmVlZHMgdXBkYXRpbmcKLQkJCWlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCQlhdHRyLnNldE5hbWUocmVxdWVzdG9yLCBuZXdSZWZOYW1lKTsKLQkJCQlyZWZlcmVuY2VzLmFkZChhdHRyKTsKLQkJCX0KLQkJCWlmIChhdHRyLmdldFR5cGUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCQlhdHRyLnNldFR5cGUocmVxdWVzdG9yLCBuZXdSZWZOYW1lKTsKLQkJCQlyZWZlcmVuY2VzLmFkZChhdHRyKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChpc05vdGF0aW9uICYmIGF0dHIuZ2V0VHlwZSgpLmVxdWFscyhBdHRyaWJ1dGUuRU5VTUVSQVRFRF9OT1RBVElPTikpIHsKLQkJCUF0dHJpYnV0ZUVudW1MaXN0IGVudW1MaXN0ID0gYXR0ci5nZXRFbnVtTGlzdCgpOwotCQkJTGlzdCBpdGVtcyA9IGVudW1MaXN0LmdldEl0ZW1zKCk7Ci0JCQlib29sZWFuIHVwZGF0ZU5lZWRlZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCVN0cmluZyBub3RhdGlvbk5hbWUgPSAoU3RyaW5nKSBpdGVtcy5nZXQoaSk7Ci0JCQkJaWYgKG5vdGF0aW9uTmFtZS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCQkJdXBkYXRlTmVlZGVkID0gdHJ1ZTsKLQkJCQkJaXRlbXMuc2V0KGksIG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh1cGRhdGVOZWVkZWQpIHsKLQkJCQlTdHJpbmdbXSBuZXdJdGVtcyA9IG5ldyBTdHJpbmdbaXRlbXMuc2l6ZSgpXTsKLQotCQkJCWVudW1MaXN0LnNldEl0ZW1zKChTdHJpbmdbXSkgaXRlbXMudG9BcnJheShuZXdJdGVtcykpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUxpc3QoQXR0cmlidXRlTGlzdCBhdHRMaXN0KSB7Ci0JCWlmICghaXNOb3RhdGlvbiAmJiBhdHRMaXN0LmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCWF0dExpc3Quc2V0TmFtZShyZXF1ZXN0b3IsIG5ld1JlZk5hbWUpOwotCQkJcmVmZXJlbmNlcy5hZGQoYXR0TGlzdCk7Ci0JCX0KLQkJc3VwZXIudmlzaXRBdHRyaWJ1dGVMaXN0KGF0dExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGlzUGFybUVudGl0eSkgewotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCWVsZW1lbnQuc2V0TmFtZShyZXF1ZXN0b3IsIG5ld1JlZk5hbWUpOwotCQkJCXJlZmVyZW5jZXMuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXN1cGVyLnZpc2l0RWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEV4dGVybmFsUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5UmVmKSB7Ci0JCXN1cGVyLnZpc2l0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UocGFybUVudGl0eVJlZik7Ci0JCWlmIChwYXJtRW50aXR5UmVmLmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCXBhcm1FbnRpdHlSZWYuc2V0UmVmZXJlbmNlZEVudGl0eShyZXF1ZXN0b3IsIG5ld05hbWUpOwotCQkJcmVmZXJlbmNlcy5hZGQocGFybUVudGl0eVJlZik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFJlZmVyZW5jZShDTUJhc2ljTm9kZSBub2RlKSB7Ci0JCXN1cGVyLnZpc2l0UmVmZXJlbmNlKG5vZGUpOwotCQlpZiAoaXNQYXJhbWV0ZXJFbnRpdHlSZWYob2xkUmVmTmFtZSkgJiYgIWlzUGFybUVudGl0eSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJbm9kZS5zZXROYW1lKHJlcXVlc3RvciwgbmV3UmVmTmFtZSk7Ci0JCQlyZWZlcmVuY2VzLmFkZChub2RlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERVbmlxdWVOYW1lSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREVW5pcXVlTmFtZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTQyMTVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERVbmlxdWVOYW1lSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRFREVW5pcXVlTmFtZUhlbHBlciB7Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCXJldHVybiAoKEVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJcmV0dXJuICgoRW50aXR5KSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBOb3RhdGlvbikgewotCQkJcmV0dXJuICgoTm90YXRpb24pIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJcmV0dXJuICgoQXR0cmlidXRlKSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgLy8gTW9kZWwgR3JvdXAgQ29udGVudAotCQl7Ci0JCQlyZXR1cm4gKChDTUJhc2ljTm9kZSkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlQXR0cmlidXRlTmFtZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJTGlzdCBhdHRycyA9IGVsZW1lbnQuZ2V0RWxlbWVudEF0dHJpYnV0ZXMoKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUoYXR0cnMsICJOZXdBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUVsZW1lbnROYW1lKERUREZpbGUgZHRkRmlsZSkgewotCQlMaXN0IGVsZW1lbnRzID0gZHRkRmlsZS5nZXRFbGVtZW50c0FuZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZXMoKS5nZXROb2RlcygpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShlbGVtZW50cywgIk5ld0VsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUVudGl0eU5hbWUoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCUxpc3QgZW50aXRpZXMgPSBkdGRGaWxlLmdldEVudGl0aWVzKCkuZ2V0Tm9kZXMoKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUoZW50aXRpZXMsICJOZXdFbnRpdHkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZU5hbWUoTGlzdCBvYmpzLCBTdHJpbmcgdG9rZW4pIHsKLQkJaW50IGNvdW50ZXIgPSAxOwotCi0JCWJvb2xlYW4gdW5pcXVlTmFtZSA9IGZhbHNlOwotCQl3aGlsZSAoIXVuaXF1ZU5hbWUpIHsKLQkJCVN0cmluZyBuZXdOYW1lID0gdG9rZW4gKyBuZXcgSW50ZWdlcihjb3VudGVyKyspOwotCQkJdW5pcXVlTmFtZSA9IHRydWU7Ci0JCQlJdGVyYXRvciBpdGVyID0gb2Jqcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCVN0cmluZyBvYmpOYW1lID0gZ2V0TmFtZShvYmopOwotCQkJCWlmIChvYmpOYW1lLmVxdWFscyhuZXdOYW1lKSkgewotCQkJCQl1bmlxdWVOYW1lID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICh1bmlxdWVOYW1lKSB7Ci0JCQkJcmV0dXJuIG5ld05hbWU7Ci0JCQl9Ci0JCX0KLQkJLy8gd2Ugc2hvdWxkbid0IGdldCBoZXJlCi0JCXJldHVybiAiTm8gTmFtZSBmb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVOb3RhdGlvbk5hbWUoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCUxpc3Qgbm90YXRpb25zID0gZHRkRmlsZS5nZXROb3RhdGlvbnMoKS5nZXROb2RlcygpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShub3RhdGlvbnMsICJOZXdOb3RhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERURFVuaXF1ZU5hbWVIZWxwZXIoKSB7Ci0JfQotCi19IC8vIERURFVuaXF1ZU5hbWVIZWxwZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjdiN2MzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Hcm91cE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotCi0KLXB1YmxpYyBjbGFzcyBEVERWaXNpdG9yIHsKLQotCXB1YmxpYyBEVERWaXNpdG9yKCkgewotCi0JfQotCi0JLy8gdXRpbGl0eSBtZXRob2QKLQlwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlckVudGl0eVJlZihTdHJpbmcgcmVmZXJlbmNlKSB7Ci0JCWlmIChyZWZlcmVuY2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXR1cm4gcmVmZXJlbmNlLmNoYXJBdCgwKSA9PSAnJScgJiYgcmVmZXJlbmNlLmNoYXJBdChyZWZlcmVuY2UubGVuZ3RoKCkgLSAxKSA9PSAnOyc7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0KERUREZpbGUgZmlsZSkgewotCQlMaXN0IG5vZGVzID0gZmlsZS5nZXROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIG5vZGVzLmdldChpKTsKLQkJCWlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQl2aXNpdEVsZW1lbnQoKEVsZW1lbnQpIGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkgewotCQkJCXZpc2l0QXR0cmlidXRlTGlzdCgoQXR0cmlidXRlTGlzdCkgY3VycmVudE5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIHsKLQkJCQl2aXNpdEV4dGVybmFsUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKChQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVMaXN0KEF0dHJpYnV0ZUxpc3QgYXR0TGlzdCkgewotCQkvLyBub3RlIHRoYXQgd2UgZG9uJ3QgdmlzaXQgYXR0cmlidXRlcyBoZXJlIGJlY2F1c2Ugd2UKLQkJLy8gd2FudCB0aGUgZWxlbWVudCB0byB2aXNpdCB0aGVtIHdpdGggaXQncyBjb25zb2xpZGF0ZWQgbGlzdAotCQkvLyB0aGF0IGl0IGNyZWF0ZXMgYnkgZ2F0aGVyaW5nIGFsbCBhdHRyaWJ1dGUgbGlzdHMgdG9nZXRoZXIKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZXMoTGlzdCBhdHRyaWJ1dGVzKSB7Ci0JCWludCBzaXplID0gYXR0cmlidXRlcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlBdHRyaWJ1dGUgYXR0ciA9IChBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotCQkJdmlzaXRBdHRyaWJ1dGUoYXR0cik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdENvbnRlbnROb2RlKENNTm9kZSBjb250ZW50KSB7Ci0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgQ01CYXNpY05vZGUpIHsKLQkJCUNNQmFzaWNOb2RlIGJhc2ljTm9kZSA9IChDTUJhc2ljTm9kZSkgY29udGVudDsKLQkJCWlmIChiYXNpY05vZGUuaXNSZWZlcmVuY2UoKSkgewotCQkJCXZpc2l0UmVmZXJlbmNlKGJhc2ljTm9kZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKSB7Ci0JCQl2aXNpdEdyb3VwTm9kZSgoQ01Hcm91cE5vZGUpIGNvbnRlbnQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlDTU5vZGUgY29udGVudCA9IGVsZW1lbnQuZ2V0Q29udGVudE1vZGVsKCk7Ci0JCXZpc2l0Q29udGVudE5vZGUoY29udGVudCk7Ci0JCXZpc2l0QXR0cmlidXRlcyhlbGVtZW50LmdldEVsZW1lbnRBdHRyaWJ1dGVzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHlSZWYpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEdyb3VwTm9kZShDTUdyb3VwTm9kZSBncm91cCkgewotCQlMaXN0IGNoaWxkcmVuID0gZ3JvdXAuZ2V0Q2hpbGRyZW5MaXN0KCk7Ci0JCWludCBzaXplID0gY2hpbGRyZW4uc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdmlzaXRDb250ZW50Tm9kZSgoQ01Ob2RlKSBjaGlsZHJlbi5nZXQoaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRSZWZlcmVuY2UoQ01CYXNpY05vZGUgbm9kZSkgewotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvTGFiZWxWYWx1ZVBhaXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9MYWJlbFZhbHVlUGFpci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWI4Y2Y2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9MYWJlbFZhbHVlUGFpci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLXB1YmxpYyBjbGFzcyBMYWJlbFZhbHVlUGFpciB7Ci0KLQlwdWJsaWMgU3RyaW5nIGZMYWJlbDsKLQlwdWJsaWMgT2JqZWN0IGZWYWx1ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbmFtZS92YWx1ZSBpdGVtCi0JICovCi0JcHVibGljIExhYmVsVmFsdWVQYWlyKFN0cmluZyBsYWJlbCwgT2JqZWN0IHZhbHVlKSB7Ci0JCUFzc2VydC5pc1RydWUobGFiZWwgIT0gbnVsbCk7Ci0JCWZMYWJlbCA9IGxhYmVsOwotCQlmVmFsdWUgPSB2YWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL3RleHQvSURURFBhcnRpdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvdGV4dC9JRFREUGFydGl0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWI2MjllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvdGV4dC9JRFREUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS50ZXh0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbiB0eXBlcyBEVEQuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURURFBhcnRpdGlvbnMgewotCQotCVN0cmluZyBEVERfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLkRFRkFVTFQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWU1ZjVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXByb3BlcnRpZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0NTY2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi1ydW50aW1lCi1kdGR1aS5qYXIKLSouemlwCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1AZG90Ci1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MTczZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9wcm9qZWN0aW9ucGVyZj1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmIyMDljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5kdGQudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc5MjE2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotI1NhdCBNYXIgMjQgMDI6NTc6MzUgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUyMmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODRhMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5kdGQudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC42MDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmRuZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvamVjdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5yZWdpc3RyeTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnRlbXBsYXRlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwud2l6YXJkO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZQotSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnV0aWw7IHZlcnNpb249IjMuOCIsCi0gY29tLmlibS5pY3UudGV4dDsgdmVyc2lvbj0iMy44IgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAxLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC40MDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMSwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzOGZiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgRGF2aWQgQ2FydmVyLCBTVEFSIC0gYWRkIG5ldyBkdGQgZmlsZSB0ZW1wbGF0ZXMsIGJ1ZyAxNjIzMjEKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdGVtcGxhdGVzLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgc3JjLXByb3BlcnRpZXMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvRFRERmlsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvRFRERmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZWU1MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL0RUREZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Jyb3dzZWJ1dHRvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkYWU1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9BdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGJiN2I0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9FbGVtZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0VsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWY0ODg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0VsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTgyMzZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9Hcm91cFRvQ29uTW9kZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTY4ZmIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9BdHRyaWJ1dGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERfQXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdmYjc4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9BdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERfRWxlbWVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9FbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1NWU1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9FbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1OGUxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9Hcm91cFRvQ29uTW9kZWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyNWEyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9Hcm91cFRvQ29uTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdkdGRfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3ZHRkX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZjYzNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdkdGRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9BdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGJiN2I0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9FbGVtZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0VsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWY0ODg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0VsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTgyMzZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9Hcm91cFRvQ29uTW9kZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTY4ZmIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2dlbmVyYXRlX3htbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2dlbmVyYXRlX3htbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZDVkZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9nZW5lcmF0ZV94bWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdkdGRfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3ZHRkX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYjFhNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdkdGRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9Db21tZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9Db21tZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk2MTFkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9BRERfQ29tbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9BRERfRW50aXR5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9FbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjQxNTA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9FbnRpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eV9SZWZlcmVuY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eV9SZWZlcmVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWZhOWI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9FbnRpdHlfUmVmZXJlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9Ob3RhdGlvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9BRERfTm90YXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2FkMDg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9Ob3RhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9EVERGaWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0RUREZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTFjNDM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0RUREZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvbmV3ZHRkX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9uZXdkdGRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxMTVmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9uZXdkdGRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L29yZ2FuaXplX2R0ZF9sb2dpY2FsbHkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvb3JnYW5pemVfZHRkX2xvZ2ljYWxseS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5M2M2YmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvb3JnYW5pemVfZHRkX2xvZ2ljYWxseS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3J0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L3NvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2M1ZDBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L3NvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWJkYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L3ZhbGlkYXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L3ZhbGlkYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxOTZlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi92YWxpZGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3ZHRkZmlsZV93aXoucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2R0ZGZpbGVfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2ZDc5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3ZHRkZmlsZV93aXoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmNiNDYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotISBQcm9wZXJ0aWVzIGZpbGUgZm9yIGNvbXBvbmVudDogWE1EVEQgLSBYTUwgVG9vbHMgRFREIEVkaXRvcgotISBQYWNrYWdlZCBmb3IgdHJhbnNsYXRpb24gaW46ICB4bWwuemlwCi0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotcGx1Z2luTmFtZT1TU0UgRFREIFNvdXJjZSBFZGl0b3IKLQotRFREX1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lPURURCBFZGl0b3IKLV9VSV9MQUJFTF9EVERfRklMRVM9RFREIEZpbGVzCi1EVERfVGVtcGxhdGVzLm5hbWU9VGVtcGxhdGVzCi1fVUlfTEFCRUxfRFREX1NUWUxFUz1TdHlsZXMKLURURF9TeW50YXhfQ29sb3Jpbmc9U3ludGF4IENvbG9yaW5nCi1fVUlfV0laQVJEX05FV19EVEQ9RFREIEZpbGUKLV9VSV9DUkVBVEVfTkVXX0RURF9GSUxFPUNyZWF0ZSBhIG5ldyBEVEQgZmlsZQotIyMKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbD1FbmNsb3NpbmcgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsPU5leHQgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsPVByZXZpb3VzIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWw9UmVzdG9yZSBMYXN0IFNlbGVjdGlvbgotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwPVJlc3RvcmUgbGFzdCBzZWxlY3Rpb24KLSMjCi1BZGRUYXNrLmxhYmVsPUFkZCAmVGFzay4uLgotQWRkVGFzay50b29sdGlwPUFkZCBUYXNrLi4uCi1BZGRCb29rbWFyay5sYWJlbD1BZGQgQm9vJmttYXJrLi4uCi1BZGRCb29rbWFyay50b29sdGlwPUFkZCBCb29rbWFyay4uLgotU2VsZWN0UnVsZXIubGFiZWw9U2VsZWN0IFJ1bGVyCi0jIwotX1VJX01FTlVfVkFMSURBVEVfRFREICAgICAgICAgICAgICAgPSAmVmFsaWRhdGUgRFREIEZpbGUKLQotRFREX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1OZXcgRFRECi1EVERfTmV3X0ZpbGUudG9vbHRpcD1OZXcgRFREIEZpbGUKLV9VSV9MQUJFTF9HRU5FUkFMPUdlbmVyYWwKLV9VSV9MQUJFTF9PVEhFUj1PdGhlcgotX1VJX0xBQkVMX0FUVFJJQlVURVM9QXR0cmlidXRlcwotX1VJX0xBQkVMX0RPQ1VNRU5UQVRJT049RG9jdW1lbnRhdGlvbgotIyMKLXByZWZlcmVuY2VLZXl3b3Jkcy5maWxlcz1lZGl0b3IgZHRkIGNyZWF0aW5nIGZpbGVzIHN1ZmZpeCBzcGVjaWZpZWQKLXByZWZlcmVuY2VLZXl3b3Jkcy50ZW1wbGF0ZXM9ZWRpdG9yIGR0ZCB0ZW1wbGF0ZXMgc25pcHBldCBtYWNyb3MKLXByZWZlcmVuY2VLZXl3b3Jkcy5zdHlsZXM9ZWRpdG9yIGR0ZCBzdHlsZSBjdXN0b21pemUgc3ludGF4IGhpZ2hsaWdodGluZyB0eXBlIHRleHQgY29udGVudCBmb3JlZ3JvdW5kIGJhY2tncm91bmQgYm9sZCBjb2xvcgotCi1Db2xvcnMuZHRkRGVmYXVsdD1EVEQgRGVmYXVsdAotQ29sb3JzLmR0ZFRhZz1EVEQgVGFnCi1Db2xvcnMuZHRkVGFnTmFtZT1EVEQgVGFnIE5hbWUKLUNvbG9ycy5kdGRDb21tZW50PURURCBDb21tZW50Ci1Db2xvcnMuZHRkS2V5d29yZD1EVEQgS2V5d29yZAotQ29sb3JzLmR0ZFN0cmluZz1EVEQgU3RyaW5nCi1Db2xvcnMuZHRkRGF0YT1EVEQgRGF0YQotQ29sb3JzLmR0ZFN5bWJvbD1EVEQgU3ltYm9sCi0JCQkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZWVkM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLQkJPCEtLSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIgLS0+Ci0JCTxlZGl0b3IKLQkJCW5hbWU9IiVEVERfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWUiCi0JCQlpY29uPSIkbmwkL2ljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYiCi0JCQljb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5BY3Rpb25Db250cmlidXRvckRURCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRUREVkaXRvciIKLQkJCXN5bWJvbGljRm9udE5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JCTwvZWRpdG9yPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPGNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkudmlld3MuY29udGVudG91dGxpbmUuRFREQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIiAvPgotCQk8c291cmNlVmlld2VyQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFREIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJjaGFyYWN0ZXJwYWlybWF0Y2hlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnRleHQuRFRERG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0iZm9sZGluZ3N0cmF0ZWd5IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvamVjdGlvbi5EVERGb2xkaW5nU3RyYXRlZ3kiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9InByZWZlcmVuY2VwYWdlcyIKLQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnByZWZlcmVuY2VzLmR0ZCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5kdGQudGVtcGxhdGVzLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmR0ZC5zdHlsZXMiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JCTwhLS0gcHJvdmlkZSBzeW50YXggaGlnaGxpZ2h0aW5nIGZvciBEVEQgc3Vic2V0IHdpdGhpbiBYTUwgLS0+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImxpbmVzdHlsZXByb3ZpZGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JEVERTdWJTZXQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC54bWwuZHRkLmludGVybmFsX3N1YnNldCIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0ic3BlbGxpbmdyZWdpb25zIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLnBhcnNlci5EVERSZWdpb25UeXBlcy5DT01NRU5UX0NPTlRFTlQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zIj4KLQkJPGVkaXRvckNvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlLmVkaXRvckFjdGlvbnMiCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdE5leHRYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0TmV4dCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RIaXN0b3J5QWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiPgotCQkJPC9hY3Rpb24+Ci0JCTwvZWRpdG9yQ29udHJpYnV0aW9uPgotICAgICAgICA8ZWRpdG9yQ29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5ydWxlci5hY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlU2VsZWN0UnVsZXIubGFiZWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iLz4KLSAgICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIHVzZSBhIHNwZWNpZmljIGFubm90YXRpb24gbW9kZWwgd2l0aCBGaWxlQnVmZmVycyAtLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmFubm90YXRpb25Nb2RlbENyZWF0aW9uIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBSZWdpc3RlciB0aGUgVUkgYWRhcHRlciBmYWN0b3J5IHByb3ZpZGVyIC0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbiI+Ci0JCTxhZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yRFREIj4KLQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQkJPC9hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBFZGl0b3IgYWN0aW9uc2V0cyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zIj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5hY3Rpb25TZXQuYW5ub3RhdGlvbk5hdmlnYXRpb24iPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlIiAvPgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ij4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlLnNvdXJjZSIgLz4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCQk8cGFnZQotCQkJbmFtZT0iJV9VSV9MQUJFTF9EVERfRklMRVMiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcmVmZXJlbmNlcy54bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERGaWxlc1ByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkucHJlZmVyZW5jZXMuZHRkIj4KLSAgICAgICAgIAk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5maWxlcyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlRFREX1RlbXBsYXRlcy5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkucHJlZmVyZW5jZXMuZHRkIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmR0ZC50ZW1wbGF0ZXMiPgotICAgICAgICAgCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnRlbXBsYXRlcyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlRFREX1N5bnRheF9Db2xvcmluZyIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnByZWZlcmVuY2VzLmR0ZCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkRURFN5bnRheENvbG9yaW5nUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmR0ZC5zdHlsZXMiPgotICAgICAgICAgCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnN0eWxlcyIvPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBLZXl3b3JkcyBmb3IgcHJlZmVyZW5jZSBhbmQgcHJvcGVydGllcyBwYWdlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5rZXl3b3JkcyI+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5maWxlcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmZpbGVzIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy50ZW1wbGF0ZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS50ZW1wbGF0ZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnN0eWxlcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnN0eWxlcyIvPgotICAgIDwvZXh0ZW5zaW9uPgotCi0JPCEtLSBOZXcgRFREIHdpemFyZCAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLQkJPHdpemFyZAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwud2l6YXJkLk5ld0RURFdpemFyZCIKLQkJCW5hbWU9IiVfVUlfV0laQVJEX05FV19EVEQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC53aXphcmQuTmV3RFREV2l6YXJkIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5YTUxDYXRlZ29yeSIKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2R0ZF93aXouZ2lmIj4KLQkJCTxkZXNjcmlwdGlvbj4lX1VJX0NSRUFURV9ORVdfRFREX0ZJTEU8L2Rlc2NyaXB0aW9uPgotCQkJPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPgotCQk8L3dpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gaW5pdGlhbGl6ZSBEVEQgdWkgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERVSVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCQk8dmlld2VyQ29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UuUnVsZXJDb250ZXh0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IucnVsZXIuY29udGV4dC5hY3Rpb25zIj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZFRhc2subGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuQWRkVGFza19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZFRhc2sudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZEJvb2ttYXJrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQk8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gVGVtcGxhdGVzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGVtcGxhdGVzIj4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlRFREX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlRFREIgotCQkJaWQ9ImR0ZF9uZXciPgotCQk8L2NvbnRleHRUeXBlPgotICA8aW5jbHVkZQotICAgICAgICBmaWxlPSJ0ZW1wbGF0ZXMvZHRkZGVmYXVsdC10ZW1wbGF0ZXMueG1sIgotICAgICAgICB0cmFuc2xhdGlvbnM9IiRubCQvdGVtcGxhdGVzL2R0ZGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMiPgotICA8L2luY2x1ZGU+Ci0JPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnByb3BlcnR5Q29udHJpYnV0b3IiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQucHJvcGVydHlDb250cmlidXRvciI+Ci0gICAgICA8cHJvcGVydHlDb250cmlidXRvcgotICAgICAgICAgICAgY29udHJpYnV0b3JJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiCi0gICAgICAgICAgICBsYWJlbFByb3ZpZGVyPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5EVERTZWN0aW9uTGFiZWxQcm92aWRlciIKLSAgICAgICAgICAgIHR5cGVNYXBwZXI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkRURFR5cGVNYXBwZXIiPgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkuZ2VuZXJhbCIvPgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkub3RoZXIiLz4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5Ci0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZHRkLnVpLmF0dHJpYnV0ZXMiLz4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5Ci0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZHRkLnVpLmRvY3VtZW50YXRpb24iLz4KLSAgICAgIDwvcHJvcGVydHlDb250cmlidXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQucHJvcGVydHlUYWJzIj4KLSAgICAgIDxwcm9wZXJ0eVRhYnMKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9ySWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlIj4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfTEFCRUxfR0VORVJBTCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkuZ2VuZXJhbCIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkuYXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9BVFRSSUJVVEVTIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZHRkLnVpLm90aGVyIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkub3RoZXIiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9PVEhFUiIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5hdHRyaWJ1dGVzIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImR0ZC51aS5kb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0xBQkVMX0RPQ1VNRU5UQVRJT04iLz4KLSAgICAgIDwvcHJvcGVydHlUYWJzPgotICAgPC9leHRlbnNpb24+ICAgCi0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnByb3BlcnR5U2VjdGlvbnMiPgotICAgPHByb3BlcnR5U2VjdGlvbnMgY29udHJpYnV0b3JJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiPgotCSA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OYW1lU2VjdGlvbiIKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5hbWVTZWN0aW9uIgotICAgICAgICB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlIi8+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3QiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm90YXRpb24iLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkF0dHJpYnV0ZURlZmF1bHRTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQXR0cmlidXRlRGVmYXVsdFNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGUiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db21tZW50U2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbW1lbnRTZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ29tbWVudCIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbEdyb3VwU2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbEdyb3VwU2VjdGlvbiI+Ci0JICAgIAk8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbE5hbWVTZWN0aW9uIgotICAgICAgICBmaWx0ZXI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbE5hbWVGaWx0ZXIiCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxOYW1lU2VjdGlvbiIKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5vdGhlciIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxUeXBlU2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbFR5cGVTZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGUiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Hcm91cE5vZGUiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZG9jdW1lbnRhdGlvbiIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Eb2N1bWVudFNlY3Rpb24iICAKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Eb2N1bWVudFNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50Ii8+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eSIvPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0Ii8+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vdGF0aW9uIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW1wdHlTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW1wdHlTZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIi8+Ci0JCSAJPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDwhLS0JCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLm90aGVyIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkVudGl0eVR5cGVTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW50aXR5VHlwZVNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHkiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuYXR0cmlidXRlcyIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbnRpdHlWYWx1ZVNlY3Rpb24iICAKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbnRpdHlWYWx1ZVNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHkiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIC0tPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTmV3RW50aXR5U2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5ld0VudGl0eVNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlIi8+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5vdGF0aW9uU2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5vdGF0aW9uU2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vdGF0aW9uIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmF0dHJpYnV0ZXMiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uT2NjdXJyZW5jZVNlY3Rpb24iICAKLSAgICAgICAgZmlsdGVyPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5PY2N1cnJlbmNlRmlsdGVyIgotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk9jY3VycmVuY2VTZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGUiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01SZXBlYXRhYmxlTm9kZSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5hdHRyaWJ1dGVzIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLlR5cGVTZWN0aW9uIiAgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uVHlwZVNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGUiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gIDwvcHJvcGVydHlTZWN0aW9ucz4KLTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBEZWZpbmUgdGhlbWUgLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkudGhlbWVzIj4KLQkJPHRoZW1lCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkuaWRlLnN5c3RlbURlZmF1bHQiPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZHRkRGVmYXVsdCIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9ImR0ZFRhZyIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9ImR0ZFRhZ05hbWUiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJkdGRDb21tZW50IgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX1NFTEVDVElPTiI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJkdGRLZXl3b3JkIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZHRkU3RyaW5nIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZHRkRGF0YSIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9ImR0ZFN5bWJvbCIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJPC90aGVtZT4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImR0ZERlZmF1bHQiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmR0ZERlZmF1bHQiCi0JCQl2YWx1ZT0iMCwgMCwgMCI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iZHRkVGFnIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5kdGRUYWciCi0JCQl2YWx1ZT0iNjMsIDYzLCAxOTEiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImR0ZFRhZ05hbWUiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmR0ZFRhZ05hbWUiCi0JCQl2YWx1ZT0iNjMsIDYzLCAxOTEiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImR0ZENvbW1lbnQiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmR0ZENvbW1lbnQiCi0JCQl2YWx1ZT0iMTI3LCAxMjcsIDEyNyI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iZHRkS2V5d29yZCIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuZHRkS2V5d29yZCIKLQkJCXZhbHVlPSIxMjgsIDAsIDAiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImR0ZFN0cmluZyIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuZHRkU3RyaW5nIgotCQkJdmFsdWU9IjYzLCAxNTksIDk1Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJkdGREYXRhIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5kdGREYXRhIgotCQkJdmFsdWU9IjE5MSwgOTUsIDk1Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJkdGRTeW1ib2wiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmR0ZFN5bWJvbCIKLQkJCXZhbHVlPSIxMjgsIDAsIDAiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLQk8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0idG9vbGJhcjpvcmcuZWNsaXBzZS53c3QueG1sLnVpLnBlcnNwZWN0aXZlLk5ld0ZpbGVUb29sQmFyIj4KLSAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmQiCi0gICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9uZXdkdGRfd2l6LmdpZiIKLSAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkubmV3RFRERmlsZSIKLSAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgIHRvb2x0aXA9IiVEVERfTmV3X0ZpbGUudG9vbHRpcCI+Ci0gICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJuZXdXaXphcmRJZCIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwud2l6YXJkLk5ld0RURFdpemFyZCIvPgotICAgICAgICAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVXb3JrYmVuY2hXaW5kb3cuYWN0aXZlUGVyc3BlY3RpdmUiPgotCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucGVyc3BlY3RpdmUiLz4KLQkJCTwvd2l0aD4KLSAgICAgICAgICAgPC92aXNpYmxlV2hlbj4gICAgICAgICAKLSAgICAgICAgPC9jb21tYW5kPgotICAgICA8L21lbnVDb250cmlidXRpb24+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLm5hdmlnYXRvckNvbnRlbnQiPgotCTxjb21tb25XaXphcmQgdHlwZT0ibmV3IiB3aXphcmRJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC53aXphcmQuTmV3RFREV2l6YXJkIiBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5uZXcubWVudUdyb3VwIj4KLQkJPGVuYWJsZW1lbnQ+Ci0JCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIi8+Ci0JCQk8d2l0aCB2YXJpYWJsZT0iYWN0aXZlV29ya2JlbmNoV2luZG93LmFjdGl2ZVBlcnNwZWN0aXZlIj4KLQkJCSAgIDxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucGVyc3BlY3RpdmUiLz4KLQkJCTwvd2l0aD4KLQkJPC9lbmFibGVtZW50PgotCTwvY29tbW9uV2l6YXJkPgotIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RUREVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGFkN2ZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RUREVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotCi0vKioKLSAqIEEgRFREIEVkaXRvciBzdWJjbGFzcyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciwgcmVxdWlyZWQgdG8gc3VwcGx5IGEgY29tcGxldGUKLSAqIHJlcGxhY2VtZW50IGZvciB0aGUgcHJvcGVydHkgc2hlZXQgcGFnZS4gV2hlbiBhIGJldHRlciBzb2x1dGlvbiBpcyBmb3VuZCwKLSAqIHRoaXMgY2xhc3Mgd2lsbCBiZSByZW1vdmVkLgotICovCi1wdWJsaWMgY2xhc3MgRFRERWRpdG9yIGV4dGVuZHMgU3RydWN0dXJlZFRleHRFZGl0b3IgewotCWNsYXNzIERURFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IgaW1wbGVtZW50cyBJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciB7Ci0JCURURFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciNnZXRDb250cmlidXRvcklkKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29udHJpYnV0b3JJZCgpIHsKLQkJCXJldHVybiBnZXRFZGl0b3JTaXRlKCkuZ2V0SWQoKTsKLQkJfQotCX0KLQotCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIGZQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCXB1YmxpYyBEVERFZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElBZGFwdGFibGUjZ2V0QWRhcHRlcihDbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgcmVxdWlyZWQpIHsKLQkJaWYgKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcy5lcXVhbHMocmVxdWlyZWQpKSB7Ci0JCQlpZiAoZlByb3BlcnR5U2hlZXRQYWdlID09IG51bGwpIHsKLQkJCQlmUHJvcGVydHlTaGVldFBhZ2UgPSBuZXcgRFREVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UobmV3IERURFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IoKSk7Ci0JCQkJLyoKLQkJCQkgKiBBZGQgdGhlIHByb3BlcnR5IHNoZWV0IHBhZ2UgYXMgYSBkaXJlY3QgcG9zdCBzZWxlY3Rpb24KLQkJCQkgKiBsaXN0ZW5lciBzbyBzdGFuZGFyZCBjdXJzb3IgbmF2aWdhdGlvbiB0cmlnZ2VycyBhIHNlbGVjdGlvbgotCQkJCSAqIG5vdGlmaWNhdGlvbi4gVGhlIGRlZmF1bHQgdGFiYmVkIHByb3BlcnR5IHNoZWV0IGRvZXMgbm90Ci0JCQkJICogbGlzdGVuIHRvIHBvc3Qgc2VsZWN0aW9uLgotCQkJCSAqLwotCQkJCSgoSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSkuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWlmIChmUHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCAmJiAhZlByb3BlcnR5U2hlZXRQYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlmUHJvcGVydHlTaGVldFBhZ2Uuc2VsZWN0aW9uQ2hhbmdlZChEVERFZGl0b3IudGhpcywgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJCXJldHVybiBmUHJvcGVydHlTaGVldFBhZ2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIocmVxdWlyZWQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzdXBlci5pbml0KHNpdGUsIGVkaXRvcklucHV0KTsKLQotCQlJV29ya2JlbmNoV2luZG93IGR3ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGR3LmdldEFjdGl2ZVBhZ2UoKTsKLQkJdHJ5IHsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlwYWdlLnNob3dWaWV3KElQYWdlTGF5b3V0LklEX1BST1BfU0hFRVQpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFByb3BlcnRpZXNNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREUHJvcGVydGllc01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOGY5MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREUHJvcGVydGllc01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgRFREUHJvcGVydGllc01lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk9jY3VycmVuY2VTZWN0aW9uLmphdmEKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfT05DRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfT05FX09SX01PUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX09QVElPTkFMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9aRVJPX09SX01PUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX09DQ1VSUkVOQ0U7Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQXR0cmlidWVEZWZhdWx0U2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RFRkFVTFQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1VTQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ERUZBVUxUX1ZBTFVFOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsR3JvdXBTZWN0aW9uLmphdmEKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU0VRVUVOQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NIT0lDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTU9ERUxfR1JPVVA7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxOYW1lU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NPTlRFTlRfTU9ERUw7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxUeXBlU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NPTlRFTlRfVFlQRTsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5hbWVTZWN0aW9uLmphdmEKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkFNRTsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLlR5cGVTZWN0aW9uLmphdmEKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfVFlQRTsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkVudGl0eVR5cGVTZWN0aW9uLmphdmEKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5USVRZX1RZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VYVEVSTkFMX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUEFSQU1FVEVSX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfR0VORVJBTF9FTlRJVFk7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbnRpdHlWYWx1ZVNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTlRJVFlfVkFMVUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1BVQkxJQ19JRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU1lTVEVNX0lEOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRFREU2VjdGlvbkxhYmVsUHJvdmlkZXIKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9FTEVNRU5UX1JFRjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0NIT0lDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX1NFUVVFTkNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfQVRUUklCVVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfQVRUTElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0NPTU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9OT1RBVElPTjsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5ld0VudGl0eVNlY3Rpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRklMRURJQUxPR19TRUxFQ1RfRFREOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GSUxFRElBTE9HX1NFTEVDVF9EVERfREVTQzsKLQotCS8vIE5ldyBwcm9wZXJ0eSB0YWJzCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0dFTkVSQUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX09USEVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVFRSSUJVVEVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ET0NVTUVOVEFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERUREVkaXRvcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERUREVkaXRvcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERUREVkaXRvcl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERUREVkaXRvcl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERTZWN0aW9uTGFiZWxQcm92aWRlcl8xMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERTZWN0aW9uTGFiZWxQcm92aWRlcl8xMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERTZWN0aW9uTGFiZWxQcm92aWRlcl82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERTZWN0aW9uTGFiZWxQcm92aWRlcl85OwotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZlJlc291cmNlQnVuZGxlOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIERURFByb3BlcnRpZXNNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChmUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlmUmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJZlJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZlJlc291cmNlQnVuZGxlOwotCX0KLQotCXByaXZhdGUgRFREUHJvcGVydGllc01lc3NhZ2VzKCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREUHJvcGVydGllc01lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERQcm9wZXJ0aWVzTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxOWJhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERQcm9wZXJ0aWVzTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEgUHJvcGVydGllcyBmaWxlIGZvciBjb21wb25lbnQ6IFhNTCB0b29scyBEVEQgRWRpdG9yCi0hIFBhY2thZ2VkIGZvciB0cmFuc2xhdGlvbiBpbjogIHhtbC56aXAKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5PY2N1cnJlbmNlU2VjdGlvbi5qYXZhCi1fVUlfT05DRSAgICAgICAgICAgICA9IEp1c3Qgb25jZSAoMSkKLV9VSV9PTkVfT1JfTU9SRSAgICAgID0gT25lIG9yIG1vcmUgKCspCi1fVUlfT1BUSU9OQUwgICAgICAgICA9IE9wdGlvbmFsICg/KQotX1VJX1pFUk9fT1JfTU9SRSAgICAgPSBaZXJvIG9yIG1vcmUgKCopCi1fVUlfTEFCRUxfT0NDVVJSRU5DRSA9IE9jY3VycmVuY2UKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5BdHRyaWJ1dGVEZWZhdWx0U2VjdGlvbi5qYXZhCi1fVUlfREVGQVVMVCAgICAgICAgICAgICA9IERlZmF1bHQKLV9VSV9MQUJFTF9VU0FHRSAgICAgICAgID0gVXNhZ2UKLV9VSV9MQUJFTF9ERUZBVUxUX1ZBTFVFID0gRGVmYXVsdCBWYWx1ZQotCi0hIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbEdyb3VwU2VjdGlvbi5qYXZhCi1fVUlfU0VRVUVOQ0UgICAgICAgICAgPSBTZXF1ZW5jZSAoLCkKLV9VSV9DSE9JQ0UgICAgICAgICAgICA9IENob2ljZSAofCkKLV9VSV9MQUJFTF9NT0RFTF9HUk9VUCA9IE1vZGVsIEdyb3VwCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsTmFtZVNlY3Rpb24uamF2YQotX1VJX0xBQkVMX0NPTlRFTlRfTU9ERUwgPSBDb250ZW50IE1vZGVsCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsVHlwZVNlY3Rpb24uamF2YQotX1VJX0xBQkVMX0NPTlRFTlRfVFlQRSA9IENvbnRlbnQgVHlwZQotCi0hIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5hbWVTZWN0aW9uLmphdmEKLV9VSV9MQUJFTF9OQU1FID0gTmFtZQotCi0hIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLlR5cGVTZWN0aW9uLmphdmEKLV9VSV9MQUJFTF9UWVBFID0gVHlwZQotCi0hIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkVudGl0eVR5cGVTZWN0aW9uLmphdmEKLV9VSV9MQUJFTF9FTlRJVFlfVFlQRSAgICAgID0gRW50aXR5IFR5cGUKLV9VSV9MQUJFTF9FWFRFUk5BTF9FTlRJVFkgID0gRXh0ZXJuYWwKLV9VSV9MQUJFTF9QQVJBTUVURVJfRU5USVRZID0gUGFyYW1ldGVyCi1fVUlfTEFCRUxfR0VORVJBTF9FTlRJVFkgICA9IEdlbmVyYWwKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbnRpdHlWYWx1ZVNlY3Rpb24uamF2YQotX1VJX0xBQkVMX0VOVElUWV9WQUxVRSA9IEVudGl0eSBWYWx1ZQotX1VJX0xBQkVMX1BVQkxJQ19JRCAgICA9IFB1YmxpYyBJRAotX1VJX0xBQkVMX1NZU1RFTV9JRCAgICA9IFN5c3RlbSBJRAotCi0hIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyCi1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0VMRU1FTlQgICAgID0gZWxlbWVudAotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9FTEVNRU5UX1JFRiA9IGVsZW1lbnQgcmVmZXJlbmNlCi1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0NIT0lDRSAgICAgID0gY2hvaWNlCi1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX1NFUVVFTkNFICAgID0gc2VxdWVuY2UKLV9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfQVRUUklCVVRFICAgPSBhdHRyaWJ1dGUKLV9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfQVRUTElTVCAgICAgPSBhdHRyaWJ1dGUgbGlzdAotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9DT01NRU5UICAgICA9IGNvbW1lbnQKLV9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfRU5USVRZICAgICAgPSBlbnRpdHkKLV9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfTk9UQVRJT04gICAgPSBub3RhdGlvbgotCi0hIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5ld0VudGl0eVNlY3Rpb24KLV9VSV9GSUxFRElBTE9HX1NFTEVDVF9EVEQgPSBTZWxlY3QgRFREIGZpbGUKLV9VSV9GSUxFRElBTE9HX1NFTEVDVF9EVERfREVTQyAgID0gU2VsZWN0IGEgRFREIGZpbGUgZnJvbSB0aGUgV29ya2JlbmNoIHByb2plY3RzCi0KLSEgTmV3IHByb3BlcnR5IHRhYnMKLV9VSV9MQUJFTF9HRU5FUkFMICAgICAgID0gR2VuZXJhbAotX1VJX0xBQkVMX09USEVSICAgICAgICAgPSBPdGhlcgotX1VJX0xBQkVMX0FUVFJJQlVURVMgICAgPSBBdHRyaWJ1dGVzCi1fVUlfTEFCRUxfRE9DVU1FTlRBVElPTiA9IERvY3VtZW50YXRpb24KLSEgZW5kCi1EVERFZGl0b3JfMD1nZW5lcmFsCi1EVERFZGl0b3JfMT1vdGhlcgotRFRERWRpdG9yXzI9YXR0cmlidXRlcwotRFRERWRpdG9yXzM9ZG9jdW1lbnRhdGlvbgotRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMD1jaG9pY2UKLURURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzE9c2VxdWVuY2UKLURURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzY9ZWxlbWVudAotRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfNz1hdHRyaWJ1dGUKLURURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzg9YXR0cmlidXRlIGxpc3QKLURURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzk9Y29tbWVudAotRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTA9ZW50aXR5Ci1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl8xMT1ub3RhdGlvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwY2E4NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi1jbGFzcyBEVERUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBleHRlbmRzIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHsKLQotCXByaXZhdGUgSVNlbGVjdGlvbiBvbGRTZWxlY3Rpb24gPSBudWxsOwotCi0JcHVibGljIERURFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKElUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IpIHsKLQkJc3VwZXIodGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCQlJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IgPSBhY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCWlmIChhY3RpdmVFZGl0b3IgIT0gbnVsbCkgewotCQkJCQkvLyBtYWtlIHN1cmUgdGhlIGNvcnJlY3QgZWRpdG9yIGlzIGFjdGl2ZQotCQkJCQlpZiAoYWN0aXZlRWRpdG9yLmdldEFkYXB0ZXIoSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzKSA9PSBEVERUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS50aGlzKSB7Ci0JCQkJCQlpZiAob2xkU2VsZWN0aW9uID09IG51bGwgfHwgIW9sZFNlbGVjdGlvbi5lcXVhbHMoc2VsZWN0aW9uKSkgewotCQkJCQkJCW9sZFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJCQkJCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHBhcnQsIHNlbGVjdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQWJzdHJhY3RTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQWJzdHJhY3RTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NzQ3NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0Fic3RyYWN0U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdFNlY3Rpb24gaW1wbGVtZW50cyBJU2VjdGlvbiwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIExpc3RlbmVyLCBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JcHJpdmF0ZSBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5OwotCXByb3RlY3RlZCBJV29ya2JlbmNoUGFydCBmV29ya2JlbmNoUGFydDsKLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCXByb3RlY3RlZCBPYmplY3QgZklucHV0OwotCXByb3RlY3RlZCBpbnQgcmlnaHRNYXJnaW5TcGFjZTsKLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCWNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgYUZhY3RvcnkpIHsKLQkJdGhpcy5mYWN0b3J5ID0gYUZhY3Rvcnk7Ci0JCUdDIGdjID0gbmV3IEdDKHBhcmVudCk7Ci0JCVBvaW50IGV4dGVudCA9IGdjLnRleHRFeHRlbnQoIiAgLi4uICAiKTsgLy8kTk9OLU5MUy0xJAotCQlyaWdodE1hcmdpblNwYWNlID0gZXh0ZW50Lng7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNzZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbCkgewotCQlBc3NlcnQuaXNUcnVlKHNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uLCAic2VsZWN0aW9uICIgKyBzZWwuZ2V0Q2xhc3MoKSArICJpcyBub3Qgc3RydWN0dXJlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGhpcy5mV29ya2JlbmNoUGFydCA9IHBhcnQ7Ci0JCXRoaXMuZlNlbGVjdGlvbiA9IHNlbDsKLQkJdGhpcy5mSW5wdXQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJLyoKLQkJICogaWYgKGZJbnB1dCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KSB7IHhzZFNjaGVtYSA9Ci0JCSAqICgoWFNEQ29uY3JldGVDb21wb25lbnQpZklucHV0KS5nZXRTY2hlbWEoKTsgfQotCQkgKi8KLQotCQkvLyByZWZyZXNoKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jYWJvdXRUb0JlU2hvd24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGFib3V0VG9CZVNob3duKCkgewotCQlyZWZyZXNoKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jYWJvdXRUb0JlSGlkZGVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhYm91dFRvQmVIaWRkZW4oKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNnZXRNaW5pbXVtSGVpZ2h0KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pbmltdW1IZWlnaHQoKSB7Ci0JCXJldHVybiBTV1QuREVGQVVMVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKSB7Ci0JCWlmIChmSW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkvLyBmSW5wdXQgPSB4c2RTY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudCgoRWxlbWVudClmSW5wdXQpOwotCQl9Ci0JCXJldHVybiBmSW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB3aWRnZXQgZmFjdG9yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB3aWRnZXQgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZ2V0V2lkZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYgZ2V0SW5wdXQoKSAhPSBudWxsICYmICFpc0luRG9IYW5kbGUpIHsKLQkJCWlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0JCQlkb1dpZGdldERlZmF1bHRTZWxlY3RlZChlKTsKLQkJCWlzSW5Eb0hhbmRsZSA9IGZhbHNlOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJiBnZXRJbnB1dCgpICE9IG51bGwgJiYgIWlzSW5Eb0hhbmRsZSkgewotCQkJaXNJbkRvSGFuZGxlID0gdHJ1ZTsKLQkJCWRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQlpc0luRG9IYW5kbGUgPSBmYWxzZTsKLQkJfQotCi0JfQotCi0JYm9vbGVhbiBsaXN0ZW5lckVuYWJsZWQgPSB0cnVlOwotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBsaXN0ZW5lckVuYWJsZWQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBsaXN0ZW5lckVuYWJsZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMaXN0ZW5lckVuYWJsZWQoKSB7Ci0JCXJldHVybiBsaXN0ZW5lckVuYWJsZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBsaXN0ZW5lckVuYWJsZWQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBsaXN0ZW5lckVuYWJsZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuZXJFbmFibGVkKGJvb2xlYW4gdikgewotCQl0aGlzLmxpc3RlbmVyRW5hYmxlZCA9IHY7Ci0JfQotCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYgIWlzSW5Eb0hhbmRsZSkgewotCQkJaXNJbkRvSGFuZGxlID0gdHJ1ZTsKLQkJCXN0YXJ0RGVsYXllZEV2ZW50KGV2ZW50KTsKLQkJCWlzSW5Eb0hhbmRsZSA9IGZhbHNlOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCX0KLQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQotCX0KLQotCXByb3RlY3RlZCBEZWxheWVkRXZlbnQgZGVsYXllZFRhc2s7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdGFydERlbGF5ZWRFdmVudChFdmVudCBlKSB7Ci0JCWlmIChkZWxheWVkVGFzayA9PSBudWxsIHx8IGRlbGF5ZWRUYXNrLmdldEV2ZW50KCkgPT0gbnVsbCkgewotCQkJZGVsYXllZFRhc2sgPSBuZXcgRGVsYXllZEV2ZW50KCk7Ci0JCQlkZWxheWVkVGFzay5zZXRFdmVudChlKTsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnRpbWVyRXhlYyg1MDAsIGRlbGF5ZWRUYXNrKTsKLQkJfQotCQllbHNlIHsKLQkJCUV2ZW50IGRlbGF5ZWRFdmVudCA9IGRlbGF5ZWRUYXNrLmdldEV2ZW50KCk7Ci0KLQkJCWlmIChlLndpZGdldCA9PSBkZWxheWVkRXZlbnQud2lkZ2V0ICYmIGUudHlwZSA9PSBkZWxheWVkRXZlbnQudHlwZSkgewotCQkJCS8vIHNhbWUgZXZlbnQsIGp1c3QgZGlmZmVyZW50IGRhdGEsIGRlbGF5IG5ldyBldmVudAotCQkJCWRlbGF5ZWRUYXNrLnNldEV2ZW50KG51bGwpOwotCQkJfQotCQkJZGVsYXllZFRhc2sgPSBuZXcgRGVsYXllZEV2ZW50KCk7Ci0JCQlkZWxheWVkVGFzay5zZXRFdmVudChlKTsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnRpbWVyRXhlYyg1MDAsIGRlbGF5ZWRUYXNrKTsKLQkJfQotCX0KLQotCWNsYXNzIERlbGF5ZWRFdmVudCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJcHJvdGVjdGVkIEV2ZW50IGV2ZW50OwotCi0JCS8qCi0JCSAqIEBzZWUgUnVubmFibGUjcnVuKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQkJaXNJbkRvSGFuZGxlID0gdHJ1ZTsKLQkJCQlkb0hhbmRsZUV2ZW50KGV2ZW50KTsKLQkJCQlpc0luRG9IYW5kbGUgPSBmYWxzZTsKLQkJCQlldmVudCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogR2V0cyB0aGUgZXZlbnQuCi0JCSAqIAotCQkgKiBAcmV0dXJuIFJldHVybnMgYSBFdmVudAotCQkgKi8KLQkJcHVibGljIEV2ZW50IGdldEV2ZW50KCkgewotCQkJcmV0dXJuIGV2ZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIGV2ZW50LgotCQkgKiAKLQkJICogQHBhcmFtIGV2ZW50Ci0JCSAqICAgICAgICAgICAgVGhlIGV2ZW50IHRvIHNldAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RXZlbnQoRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudCA9IGU7Ci0JCX0KLQotCX0KLQotCWJvb2xlYW4gaXNJbkRvSGFuZGxlOwotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBpc0luRG9IYW5kbGUuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBpc0luRG9IYW5kbGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbkRvSGFuZGxlKCkgewotCQlyZXR1cm4gaXNJbkRvSGFuZGxlOwotCX0KLQotCXN0YXRpYyBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZ2V0QWN0aXZlRWRpdG9yKCkgewotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKTsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCi0JCXJldHVybiBlZGl0b3JQYXJ0OwotCX0KLQotCXN0YXRpYyBwcm90ZWN0ZWQgSVN0YXR1c0xpbmVNYW5hZ2VyIGdldFN0YXR1c0xpbmVNYW5hZ2VyKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpIHsKLQkJSVN0YXR1c0xpbmVNYW5hZ2VyIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBjb250cmlidXRvciA9IChFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcikgZWRpdG9yUGFydC5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQkJCXJlc3VsdCA9IGNvbnRyaWJ1dG9yLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JRG9jdW1lbnRJbXBsIGdldERvY3VtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gKERvY3VtZW50SW1wbCkgZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoU3RyaW5nIGRlc2NyaXB0aW9uLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJRG9jdW1lbnRJbXBsIGRvYyA9IGdldERvY3VtZW50KGVsZW1lbnQpOwotCQlkb2MuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKEVsZW1lbnQgZWxlbWVudCkgewotCQlEb2N1bWVudEltcGwgZG9jID0gZ2V0RG9jdW1lbnQoZWxlbWVudCk7Ci0KLQkJZG9jLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlTmFtZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUxhbmd1YWdlKFN0cmluZyBsYW5nKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUHJlZml4KFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0F0dHJpYnV0ZURlZmF1bHRTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQXR0cmlidXRlRGVmYXVsdFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0YjE4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQXR0cmlidXRlRGVmYXVsdFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVEZWZhdWx0U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBJTVBMSUVEID0gQXR0cmlidXRlLklNUExJRUQ7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUkVRVUlSRUQgPSBBdHRyaWJ1dGUuUkVRVUlSRUQ7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRklYRUQgPSBBdHRyaWJ1dGUuRklYRUQ7Ci0KLQlwcml2YXRlIENDb21ibyB1c2FnZUNvbWJvOwotCXByaXZhdGUgU3RyaW5nW10gdXNhZ2VDb21ib1ZhbHVlcyA9IHtJTVBMSUVELCBSRVFVSVJFRCwgRklYRUQsIERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfREVGQVVMVH07Ci0JcHJpdmF0ZSBUZXh0IGRlZmF1bHRWYWx1ZVRleHQ7Ci0JcHJpdmF0ZSBDTGFiZWwgZGVmYXVsdFZhbHVlTGFiZWw7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgdXNhZ2VMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1VTQUdFKTsKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlQb2ludCBwID0gdXNhZ2VMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJaW50IGxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCXVzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl1c2FnZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodXNhZ2VMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHVzYWdlTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl1c2FnZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXVzYWdlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCXVzYWdlQ29tYm8uc2V0SXRlbXModXNhZ2VDb21ib1ZhbHVlcyk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJZGVmYXVsdFZhbHVlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9ERUZBVUxUX1ZBTFVFKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCXAgPSBkZWZhdWx0VmFsdWVMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh1c2FnZUxhYmVsLCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCWRlZmF1bHRWYWx1ZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZGVmYXVsdFZhbHVlVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGRlZmF1bHRWYWx1ZUxhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZGVmYXVsdFZhbHVlTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQlkZWZhdWx0VmFsdWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRlZmF1bHRWYWx1ZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJCVN0cmluZyBraW5kID0gKChBdHRyaWJ1dGUpIGlucHV0KS5nZXREZWZhdWx0S2luZCgpOwotCQkJCWlmICgiIi5lcXVhbHMoa2luZCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJdXNhZ2VDb21iby5zZXRUZXh0KERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfREVGQVVMVCk7Ci0JCQkJZWxzZQotCQkJCQl1c2FnZUNvbWJvLnNldFRleHQoa2luZCk7Ci0KLQkJCQlpZiAoIiIuZXF1YWxzKGtpbmQpIHx8IEZJWEVELmVxdWFscyhraW5kKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWRlZmF1bHRWYWx1ZUxhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQlkZWZhdWx0VmFsdWVUZXh0LnNldFRleHQoKChBdHRyaWJ1dGUpIGlucHV0KS5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkZWZhdWx0VmFsdWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWRlZmF1bHRWYWx1ZUxhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJCQlkZWZhdWx0VmFsdWVUZXh0LnNldFZpc2libGUoZmFsc2UpOwotCQkJCQlkZWZhdWx0VmFsdWVUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gdXNhZ2VDb21ibykgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJCVN0cmluZyB1c2FnZSA9IHVzYWdlQ29tYm8uZ2V0VGV4dCgpOwotCQkJCUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoQXR0cmlidXRlKSBpbnB1dDsKLQkJCQlpZiAodXNhZ2UuZXF1YWxzKERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfREVGQVVMVCkpCi0JCQkJCWF0dHJpYnV0ZS5zZXREZWZhdWx0S2luZCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbHNlCi0JCQkJCWF0dHJpYnV0ZS5zZXREZWZhdWx0S2luZCh1c2FnZSk7Ci0KLQkJCQlpZiAoRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9ERUZBVUxULmVxdWFscyh1c2FnZSkgfHwgRklYRUQuZXF1YWxzKHVzYWdlKSkgewotCQkJCQlkZWZhdWx0VmFsdWVMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQlkZWZhdWx0VmFsdWVUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRlZmF1bHRWYWx1ZUxhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJCQlkZWZhdWx0VmFsdWVUZXh0LnNldFZpc2libGUoZmFsc2UpOwotCQkJCQlkZWZhdWx0VmFsdWVUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0JCQlpZiAoZXZlbnQud2lkZ2V0ID09IGRlZmF1bHRWYWx1ZVRleHQpIHsKLQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBkZWZhdWx0VmFsdWVUZXh0LmdldFRleHQoKTsKLQkJCQkoKEF0dHJpYnV0ZSkgaW5wdXQpLnNldERlZmF1bHRWYWx1ZShuZXdWYWx1ZSwgdXNhZ2VDb21iby5nZXRUZXh0KCkuZXF1YWxzKEZJWEVEKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbW1lbnRTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29tbWVudFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM5ZjJkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29tbWVudFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ29tbWVudDsKLQotcHVibGljIGNsYXNzIENvbW1lbnRTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIFRleHQgY29tbWVudFRleHQ7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCQljb21tZW50VGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIsIFNXVC5NVUxUSSB8IFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQljb21tZW50VGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBDb21tZW50U2VjdGlvbi50aGlzKTsKLQotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJY29tbWVudFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQljb21tZW50VGV4dC5zZXRFbmFibGVkKHRydWUpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQljb21tZW50VGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ29tbWVudCkKLQkJCQljb21tZW50VGV4dC5zZXRUZXh0KCgoQ29tbWVudCkgaW5wdXQpLmdldFRleHQoKSk7Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5ld1ZhbHVlID0gY29tbWVudFRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCAmJiBpbnB1dCBpbnN0YW5jZW9mIENvbW1lbnQpIHsKLQkJCQlDb21tZW50IGNvbW1lbnQgPSAoQ29tbWVudCkgaW5wdXQ7Ci0JCQkJY29tbWVudC5zZXRUZXh0KG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbEdyb3VwU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbEdyb3VwU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzUxODVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxHcm91cFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIENvbnRlbnRNb2RlbEdyb3VwU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0VRVUVOQ0UgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX1NFUVVFTkNFOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIENIT0lDRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfQ0hPSUNFOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE1PREVMX0dST1VQID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9NT0RFTF9HUk9VUDsKLQotCXByaXZhdGUgQ0NvbWJvIG1vZGVsR3JvdXBDb21ibzsKLQlwcml2YXRlIFN0cmluZ1tdIG1vZGVsR3JvdXBDb21ib1ZhbHVlcyA9IHtTRVFVRU5DRSwgQ0hPSUNFfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBjTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTU9ERUxfR1JPVVApOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJUG9pbnQgcCA9IGNMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJaW50IGxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWNMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW1vZGVsR3JvdXBDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCW1vZGVsR3JvdXBDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQltb2RlbEdyb3VwQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCW1vZGVsR3JvdXBDb21iby5zZXRJdGVtcyhtb2RlbEdyb3VwQ29tYm9WYWx1ZXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkgewotCQkJCUNNR3JvdXBOb2RlIG5vZGUgPSAoQ01Hcm91cE5vZGUpIGlucHV0OwotCQkJCWNoYXIgbW9kZWxUeXBlID0gbm9kZS5nZXRDb25uZWN0b3IoKTsKLQkJCQlpZiAoQ01Hcm91cE5vZGUuQ0hPSUNFID09IG1vZGVsVHlwZSkKLQkJCQkJbW9kZWxHcm91cENvbWJvLnNldFRleHQoQ0hPSUNFKTsKLQkJCQllbHNlIGlmIChDTUdyb3VwTm9kZS5TRVFVRU5DRSA9PSBtb2RlbFR5cGUpCi0JCQkJCW1vZGVsR3JvdXBDb21iby5zZXRUZXh0KFNFUVVFTkNFKTsKLQkJCX0KLQkJfQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gbW9kZWxHcm91cENvbWJvKSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCQlDTUdyb3VwTm9kZSBub2RlID0gKENNR3JvdXBOb2RlKSBpbnB1dDsKLQkJCQlpZiAoQ0hPSUNFLmVxdWFscyhtb2RlbEdyb3VwQ29tYm8uZ2V0VGV4dCgpKSkKLQkJCQkJbm9kZS5zZXRDb25uZWN0b3IoQ01Hcm91cE5vZGUuQ0hPSUNFKTsKLQkJCQllbHNlIGlmIChTRVFVRU5DRS5lcXVhbHMobW9kZWxHcm91cENvbWJvLmdldFRleHQoKSkpCi0JCQkJCW5vZGUuc2V0Q29ubmVjdG9yKENNR3JvdXBOb2RlLlNFUVVFTkNFKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxOYW1lRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsTmFtZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTUwYmZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxOYW1lRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLQotcHVibGljIGNsYXNzIENvbnRlbnRNb2RlbE5hbWVGaWx0ZXIgaW1wbGVtZW50cyBJRmlsdGVyIHsKLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoT2JqZWN0IHRvVGVzdCkgewotCQlyZXR1cm4gdG9UZXN0IGluc3RhbmNlb2YgQ01CYXNpY05vZGUgJiYgISgoQ01CYXNpY05vZGUpIHRvVGVzdCkuaXNSb290RWxlbWVudENvbnRlbnQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsTmFtZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxOYW1lU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmIxZWNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxOYW1lU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50TW9kZWxOYW1lU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ09OVEVOVF9NT0RFTCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfQ09OVEVOVF9NT0RFTDsKLQotCXByaXZhdGUgQ0NvbWJvIHR5cGVDb21ibzsKLQlwcml2YXRlIFN0cmluZ1tdIHR5cGVDb21ib1ZhbHVlcyA9IHtDTU5vZGUuUENEQVRBfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBjTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgQ09OVEVOVF9NT0RFTCk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlQb2ludCBwID0gY0xhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlpbnQgbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJY0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJdHlwZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0eXBlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCXR5cGVDb21iby5zZXRJdGVtcyh0eXBlQ29tYm9WYWx1ZXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0KLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJdHlwZUNvbWJvLnJlbW92ZUFsbCgpOwotCQkJCXR5cGVDb21iby5hZGQoQ01Ob2RlLlBDREFUQSk7Ci0JCQkJLy8gTm9kZUxpc3QgbGlzdCA9Ci0JCQkJLy8gKChDTUJhc2ljTm9kZSlmSW5wdXQpLmdldERUREZpbGUoKS5nZXRFbGVtZW50c0FuZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZXMoKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9ICgoQ01CYXNpY05vZGUpIGlucHV0KS5nZXREVERGaWxlKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQkJCWJvb2xlYW4gaXNGb3JSb290Q29udGVudCA9ICgoQ01CYXNpY05vZGUpIGlucHV0KS5pc1Jvb3RFbGVtZW50Q29udGVudCgpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKCFpc0ZvclJvb3RDb250ZW50ICYmIG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotCQkJCQkJdHlwZUNvbWJvLmFkZChub2RlLmdldE5hbWUoKSk7Ci0JCQkJCWlmIChub2RlIGluc3RhbmNlb2YgRW50aXR5ICYmICgoRW50aXR5KSBub2RlKS5pc1BhcmFtZXRlckVudGl0eSgpKQotCQkJCQkJdHlwZUNvbWJvLmFkZCgiJSIgKyBub2RlLmdldE5hbWUoKSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQotCQkJCXR5cGVDb21iby5zZXRUZXh0KCgoQ01CYXNpY05vZGUpIGlucHV0KS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gdHlwZUNvbWJvKSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ01CYXNpY05vZGUpIHsKLQkJCQlDTUJhc2ljTm9kZSBub2RlID0gKENNQmFzaWNOb2RlKSBpbnB1dDsKLQkJCQlTdHJpbmcgc2VsZWN0ZWQgPSB0eXBlQ29tYm8uZ2V0VGV4dCgpOwotCQkJCS8vIGlmIChDTU5vZGUuUENEQVRBLmVxdWFscyhzZWxlY3RlZCkpCi0JCQkJbm9kZS5zZXROYW1lKHNlbGVjdGVkKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbFR5cGVGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxUeXBlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZGFjODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbFR5cGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLQotcHVibGljIGNsYXNzIENvbnRlbnRNb2RlbFR5cGVGaWx0ZXIgaW1wbGVtZW50cyBJRmlsdGVyIHsKLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoT2JqZWN0IHRvVGVzdCkgewotCQlpZiAodG9UZXN0IGluc3RhbmNlb2YgQ01CYXNpY05vZGUgJiYgISgoQ01CYXNpY05vZGUpIHRvVGVzdCkuaXNSb290RWxlbWVudENvbnRlbnQoKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAodG9UZXN0IGluc3RhbmNlb2YgQ01Hcm91cE5vZGUgJiYgKChDTUdyb3VwTm9kZSkgdG9UZXN0KS5pc1Jvb3RFbGVtZW50Q29udGVudCgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsVHlwZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxUeXBlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjRhODk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxUeXBlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Hcm91cE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudE1vZGVsVHlwZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfQ09OVEVOVF9UWVBFOwotCi0JcHJpdmF0ZSBDQ29tYm8gdHlwZUNvbWJvOwotCXByaXZhdGUgU3RyaW5nW10gdHlwZUNvbWJvVmFsdWVzID0ge0NNTm9kZS5BTlksIENNTm9kZS5FTVBUWSwgQ01Ob2RlLlBDREFUQSwgQ01Ob2RlLkNISUxEUkVOLCBDTU5vZGUuTUlYRUR9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIGNMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBDT05URU5UX1RZUEUpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJUG9pbnQgcCA9IGNMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJaW50IGxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWNMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXR5cGVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0eXBlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCXR5cGVDb21iby5zZXRJdGVtcyh0eXBlQ29tYm9WYWx1ZXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0KLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNTm9kZSkgewotCQkJCXR5cGVDb21iby5yZW1vdmVBbGwoKTsKLQkJCQl0eXBlQ29tYm8uYWRkKENNTm9kZS5BTlkpOwotCQkJCXR5cGVDb21iby5hZGQoQ01Ob2RlLkVNUFRZKTsKLQkJCQl0eXBlQ29tYm8uYWRkKENNTm9kZS5QQ0RBVEEpOwotCQkJCXR5cGVDb21iby5hZGQoQ01Ob2RlLkNISUxEUkVOKTsKLQkJCQl0eXBlQ29tYm8uYWRkKENNTm9kZS5NSVhFRCk7Ci0KLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9ICgoQ01Ob2RlKSBpbnB1dCkuZ2V0RFRERmlsZSgpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSBudWxsOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJbm9kZU5hbWUgPSBub2RlLmdldE5hbWUoKTsKLQkJCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHR5cGVDb21iby5pbmRleE9mKG5vZGVOYW1lKSA9PSAtMSkKLQkJCQkJCXR5cGVDb21iby5hZGQobm9kZU5hbWUpOwotCQkJCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRW50aXR5ICYmICgoRW50aXR5KSBub2RlKS5pc1BhcmFtZXRlckVudGl0eSgpICYmIHR5cGVDb21iby5pbmRleE9mKG5vZGVOYW1lKSA9PSAtMSkKLQkJCQkJCXR5cGVDb21iby5hZGQoIiUiICsgbm9kZU5hbWUgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpCi0JCQkJCXR5cGVDb21iby5zZXRUZXh0KCgoQ01Hcm91cE5vZGUpIGlucHV0KS5nZXRUeXBlKCkpOwotCQkJCWVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQ01CYXNpY05vZGUpCi0JCQkJCXR5cGVDb21iby5zZXRUZXh0KCgoQ01CYXNpY05vZGUpIGlucHV0KS5nZXRUeXBlKCkpOwotCQkJfQotCQl9IC8vIGVuZCBpZiAoZklucHV0ICE9IG51bGwpCi0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gdHlwZUNvbWJvKSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ01Hcm91cE5vZGUgfHwgaW5wdXQgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJCUNNTm9kZSBub2RlID0gKENNTm9kZSkgaW5wdXQ7Ci0JCQkJU3RyaW5nIHNlbGVjdGVkID0gdHlwZUNvbWJvLmdldFRleHQoKTsKLQkJCQlpZiAoQ01Ob2RlLk1JWEVELmVxdWFscyhzZWxlY3RlZCkpCi0JCQkJCW5vZGUuc2V0TWl4ZWRDb250ZW50KCk7Ci0JCQkJZWxzZSBpZiAoQ01Ob2RlLkNISUxEUkVOLmVxdWFscyhzZWxlY3RlZCkpCi0JCQkJCW5vZGUuc2V0Q2hpbGRyZW5Db250ZW50KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVsc2UgaWYgKENNTm9kZS5FTVBUWS5lcXVhbHMoc2VsZWN0ZWQpIHx8IENNTm9kZS5BTlkuZXF1YWxzKHNlbGVjdGVkKSB8fCBDTU5vZGUuUENEQVRBLmVxdWFscyhzZWxlY3RlZCkpCi0JCQkJCW5vZGUuc2V0Q29udGVudChzZWxlY3RlZCk7Ci0JCQkJZWxzZQotCQkJCQlub2RlLnNldENoaWxkcmVuQ29udGVudChzZWxlY3RlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9EVERTZWN0aW9uTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RURFNlY3Rpb25MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDM3YWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RURFNlY3Rpb25MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Hcm91cE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNUmVwZWF0YWJsZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLlBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIERURFNlY3Rpb25MYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG51bGwgfHwgb2JqZWN0LmVxdWFscyhTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJbWFnZSByZXN1bHQgPSBudWxsOwotCi0JCU9iamVjdCBzZWxlY3RlZCA9IG9iamVjdDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlzZWxlY3RlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIG9iamVjdCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgRFRERmlsZSkgewotCQkJcmV0dXJuIG51bGw7IC8vICgoRFRERmlsZSkgc2VsZWN0ZWQpLmdldEltYWdlKCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gKChEVEROb2RlKSBzZWxlY3RlZCkuZ2V0SW1hZ2UoKTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLkVsZW1lbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG51bGwgfHwgb2JqZWN0LmVxdWFscyhTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlPYmplY3Qgc2VsZWN0ZWQgPSBvYmplY3Q7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJc2VsZWN0ZWQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBvYmplY3QpLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0KLQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgRFRERmlsZSkgewotCQkJcmV0dXJuICgoRFRERmlsZSkgc2VsZWN0ZWQpLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQlpZiAoKChDTUJhc2ljTm9kZSkgc2VsZWN0ZWQpLmlzUmVmZXJlbmNlKCkpCi0JCQkJcmV0dXJuIERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0VMRU1FTlRfUkVGOwotCQkJZWxzZQotCQkJCXJldHVybiAoKENNQmFzaWNOb2RlKSBzZWxlY3RlZCkuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgQ01SZXBlYXRhYmxlTm9kZSkgewotCQkJQ01SZXBlYXRhYmxlTm9kZSBub2RlID0gKENNUmVwZWF0YWJsZU5vZGUpIHNlbGVjdGVkOwotCQkJU3RyaW5nIG5hbWUgPSBub2RlLmdldE5hbWUoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCQlpZiAoKChDTUdyb3VwTm9kZSkgbm9kZSkuZ2V0Q29ubmVjdG9yKCkgPT0gQ01Hcm91cE5vZGUuQ0hPSUNFKQotCQkJCQluYW1lID0gRFREUHJvcGVydGllc01lc3NhZ2VzLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzA7Ci0JCQkJZWxzZQotCQkJCQluYW1lID0gRFREUHJvcGVydGllc01lc3NhZ2VzLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzE7Ci0JCQl9Ci0JCQljaGFyIG9jY3VycmVuY2UgPSBub2RlLmdldE9jY3VycmVuY2UoKTsKLQkJCXN3aXRjaCAob2NjdXJyZW5jZSkgewotCQkJCWNhc2UgQ01SZXBlYXRhYmxlTm9kZS5PTkNFIDoKLQkJCQkJbmFtZSArPSAiIFsxLi4xXSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDTVJlcGVhdGFibGVOb2RlLk9QVElPTkFMIDoKLQkJCQkJbmFtZSArPSAiIFswLi4xXSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDTVJlcGVhdGFibGVOb2RlLk9ORV9PUl9NT1JFIDoKLQkJCQkJbmFtZSArPSAiIFsxLi4qXSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDTVJlcGVhdGFibGVOb2RlLlpFUk9fT1JfTU9SRSA6Ci0JCQkJCW5hbWUgKz0gIiBbMC4uKl0iOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBFbGVtZW50KQotCQkJCXJldHVybiBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfNjsKLQkJCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgQXR0cmlidXRlKQotCQkJCXJldHVybiBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfNzsKLQkJCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkKLQkJCQlyZXR1cm4gRFREUHJvcGVydGllc01lc3NhZ2VzLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzg7Ci0JCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIENvbW1lbnQpCi0JCQkJcmV0dXJuIERURFByb3BlcnRpZXNNZXNzYWdlcy5EVERTZWN0aW9uTGFiZWxQcm92aWRlcl85OwotCQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBFbnRpdHkpCi0JCQkJcmV0dXJuIERURFByb3BlcnRpZXNNZXNzYWdlcy5EVERTZWN0aW9uTGFiZWxQcm92aWRlcl8xMDsKLQkJCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgTm90YXRpb24pCi0JCQkJcmV0dXJuIERURFByb3BlcnRpZXNNZXNzYWdlcy5EVERTZWN0aW9uTGFiZWxQcm92aWRlcl8xMTsKLQkJCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKQotCQkJCS8vIHJldHVybiAicGFyYW1ldGVyIGVudGl0eSByZWZlcmVuY2UiOwotCQkJCXJldHVybiBudWxsOwotCQkJZWxzZQotCQkJCXJldHVybiAoKERURE5vZGUpIHNlbGVjdGVkKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5FbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChvcmcudzNjLmRvbS5FbGVtZW50KSBzZWxlY3RlZCkuZ2V0TG9jYWxOYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RURFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRFREU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxNTMxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRFREU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzLlNlbGVjdFNpbmdsZUZpbGVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLQotLyoqCi0gKiBFeHRlbmQgdGhlIGJhc2Ugd2l6YXJkIHRvIHNlbGVjdCBhIGZpbGUgZnJvbSB0aGUgcHJvamVjdCBvciBvdXRzaWRlIHRoZQotICogd29ya2JlbmNoIGFuZCBhZGQgZXJyb3IgaGFuZGxpbmcKLSAqLwotY2xhc3MgRFREU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQlEVERTZWxlY3RTaW5nbGVGaWxlUGFnZSBmaWxlUGFnZTsKLQotCUlGaWxlIHJlc3VsdEZpbGU7Ci0KLQlwdWJsaWMgRFREU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQoU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzYywgVmlld2VyRmlsdGVyIGZpbHRlciwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKHRpdGxlKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgRFREUmVzb3VyY2UuTkVXRFREKSk7Ci0KLQkJLy8gU2VsZWN0IEZpbGUgUGFnZQotCQlmaWxlUGFnZSA9IG5ldyBEVERTZWxlY3RTaW5nbGVGaWxlUGFnZShQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBzZWxlY3Rpb24sIHRydWUpOwotCQlmaWxlUGFnZS5zZXRUaXRsZSh0aXRsZSk7Ci0JCWZpbGVQYWdlLnNldERlc2NyaXB0aW9uKGRlc2MpOwotCQlmaWxlUGFnZS5hZGRGaWx0ZXIoZmlsdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggYVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlhZGRQYWdlKGZpbGVQYWdlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCXJldHVybiBmaWxlUGFnZS5pc1BhZ2VDb21wbGV0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCXJlc3VsdEZpbGUgPSBmaWxlUGFnZS5nZXRGaWxlKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRSZXN1bHRGaWxlKCkgewotCQlyZXR1cm4gcmVzdWx0RmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgRFREIEZpbGUKLQkgKi8KLQljbGFzcyBEVERTZWxlY3RTaW5nbGVGaWxlUGFnZSBleHRlbmRzIFNlbGVjdFNpbmdsZUZpbGVQYWdlIHsKLQkJcHVibGljIERURFNlbGVjdFNpbmdsZUZpbGVQYWdlKElXb3JrYmVuY2ggdywgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIGlzRmlsZU1hbmRhdG9yeSkgewotCQkJc3VwZXIodywgc2VsZWN0aW9uLCBpc0ZpbGVNYW5kYXRvcnkpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCQlyZXR1cm4gc3VwZXIuaXNQYWdlQ29tcGxldGUoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9EVERUeXBlTWFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRFREVHlwZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGUzNWQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9EVERUeXBlTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVR5cGVNYXBwZXI7Ci0KLXB1YmxpYyBjbGFzcyBEVERUeXBlTWFwcGVyIGltcGxlbWVudHMgSVR5cGVNYXBwZXIgewotCXB1YmxpYyBEVERUeXBlTWFwcGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDbGFzcyBtYXBUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG9iamVjdC5nZXRDbGFzcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Eb2N1bWVudFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Eb2N1bWVudFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY3MjBlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRG9jdW1lbnRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Db21tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIFRleHQgY29tbWVudFRleHQ7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCQljb21tZW50VGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIsIFNXVC5NVUxUSSB8IFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQljb21tZW50VGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJY29tbWVudFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQljb21tZW50VGV4dC5zZXRFbmFibGVkKHRydWUpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQljb21tZW50VGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJCUNvbW1lbnQgY29tbWVudCA9IGdldENvbW1lbnROb2RlKChEVEROb2RlKSBpbnB1dCk7Ci0JCQkJaWYgKGNvbW1lbnQgIT0gbnVsbCkKLQkJCQkJY29tbWVudFRleHQuc2V0VGV4dChjb21tZW50LmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IGNvbW1lbnRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCQlDb21tZW50IGNvbW1lbnQgPSBnZXRDb21tZW50Tm9kZSgoRFRETm9kZSkgaW5wdXQpOwotCQkJCWlmIChjb21tZW50ICE9IG51bGwpCi0JCQkJCWNvbW1lbnQuc2V0VGV4dChuZXdWYWx1ZSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIENyZWF0ZSBhIG5ldyBjb21tZW50IG5vZGUuCi0JCQkJCSgoRFRETm9kZSkgaW5wdXQpLmdldERUREZpbGUoKS5jcmVhdGVDb21tZW50KChEVEROb2RlKSBpbnB1dCwgbmV3VmFsdWUsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgQ29tbWVudCBnZXRDb21tZW50Tm9kZShEVEROb2RlIG5vZGUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBub2RlLmdldERUREZpbGUoKS5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCURURE5vZGUgY3VycmVudE5vZGUgPSBudWxsOwotCQlEVEROb2RlIHByZXZOb2RlID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJY3VycmVudE5vZGUgPSAoRFRETm9kZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5vZGUgPT0gY3VycmVudE5vZGUgJiYgcHJldk5vZGUgIT0gbnVsbCAmJiBwcmV2Tm9kZSBpbnN0YW5jZW9mIENvbW1lbnQpCi0JCQkJcmV0dXJuIChDb21tZW50KSBwcmV2Tm9kZTsKLQkJCWVsc2UKLQkJCQlwcmV2Tm9kZSA9IGN1cnJlbnROb2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0VtcHR5U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0VtcHR5U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGY0MjkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbXB0eVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFbXB0eVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZG9IYW5kbGVFdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXN1cGVyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0TWluaW11bUhlaWdodCgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbnRpdHlUeXBlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0VudGl0eVR5cGVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNjM0YmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0VudGl0eVR5cGVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlUeXBlU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRU5USVRZX1RZUEUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9UWVBFOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0VOVElUWSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfRVhURVJOQUxfRU5USVRZOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBBUkFNRVRFUiA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfUEFSQU1FVEVSX0VOVElUWTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBHRU5FUkFMID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9HRU5FUkFMX0VOVElUWTsKLQotCXByaXZhdGUgQ0NvbWJvIHR5cGVDb21ibzsKLQlwcml2YXRlIFN0cmluZ1tdIHR5cGVDb21ib1ZhbHVlcyA9IHtQQVJBTUVURVIsIEdFTkVSQUx9OwotCXByaXZhdGUgQnV0dG9uIGNoZWNrQm94OwotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXh0ZXJuYWxFbnRpdHkgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBjTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgRU5USVRZX1RZUEUpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJUG9pbnQgcCA9IGNMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJaW50IGxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWNMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXR5cGVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0eXBlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCXR5cGVDb21iby5zZXRJdGVtcyh0eXBlQ29tYm9WYWx1ZXMpOwotCi0JCWNoZWNrQm94ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIEVYVEVSTkFMX0VOVElUWSwgU1dULkNIRUNLKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCXAgPSBjaGVja0JveC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDk1LCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCWNoZWNrQm94LnNldExheW91dERhdGEoZGF0YSk7Ci0JCWNoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0KLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQlpZiAoZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkpCi0JCQkJCXR5cGVDb21iby5zZXRUZXh0KFBBUkFNRVRFUik7Ci0JCQkJZWxzZQotCQkJCQl0eXBlQ29tYm8uc2V0VGV4dChHRU5FUkFMKTsKLQotCQkJCWlmIChlbnRpdHkuaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQkJCWNoZWNrQm94LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQkJaXNFeHRlcm5hbEVudGl0eSA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljaGVja0JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCQlpc0V4dGVybmFsRW50aXR5ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSB0eXBlQ29tYm8pIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgbm9kZSA9IChFbnRpdHkpIGlucHV0OwotCQkJCVN0cmluZyBzZWxlY3RlZCA9IHR5cGVDb21iby5nZXRUZXh0KCk7Ci0JCQkJaWYgKFBBUkFNRVRFUi5lcXVhbHMoc2VsZWN0ZWQpKQotCQkJCQlub2RlLnNldFBhcmFtZXRlckVudGl0eSh0cnVlKTsKLQkJCQllbHNlCi0JCQkJCW5vZGUuc2V0UGFyYW1ldGVyRW50aXR5KGZhbHNlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChlLndpZGdldCA9PSBjaGVja0JveCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBub2RlID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJYm9vbGVhbiBzZWxlY3RlZCA9IGNoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3RlZCkgewotCQkJCQlub2RlLnNldEV4dGVybmFsRW50aXR5KHRydWUpOwotCQkJCQlpc0V4dGVybmFsRW50aXR5ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5vZGUuc2V0RXh0ZXJuYWxFbnRpdHkoZmFsc2UpOwotCQkJCQlpc0V4dGVybmFsRW50aXR5ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW50aXR5VmFsdWVTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW50aXR5VmFsdWVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZjM1NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0VudGl0eVZhbHVlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlWYWx1ZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFZBTFVFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9FTlRJVFlfVkFMVUU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUFVCTElDX0lEID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9QVUJMSUNfSUQ7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1lTVEVNX0lEID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9TWVNURU1fSUQ7Ci0KLQlwcml2YXRlIFRleHQgdmFsdWVUZXh0OwotCXByaXZhdGUgVGV4dCBwdWJsaWNJZFRleHQ7Ci0JcHJpdmF0ZSBUZXh0IHN5c3RlbUlkVGV4dDsKLQotCXByaXZhdGUgQ0xhYmVsIHZhbHVlTGFiZWw7Ci0JcHJpdmF0ZSBDTGFiZWwgcHVibGljSWRMYWJlbDsKLQlwcml2YXRlIENMYWJlbCBzeXN0ZW1JZExhYmVsOwotCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IHZhbHVlVGV4dCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IHZhbHVlVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJZW50aXR5LnNldFZhbHVlKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gcHVibGljSWRUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gcHVibGljSWRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQllbnRpdHkuc2V0UHVibGljSUQobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBzeXN0ZW1JZFRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBzeXN0ZW1JZFRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWVudGl0eS5zZXRTeXN0ZW1JRChuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQl2YWx1ZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFZBTFVFKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCVBvaW50IHAgPSB2YWx1ZUxhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlpbnQgbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJdmFsdWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIEVudGl0eSBWYWx1ZQotCQl2YWx1ZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCh2YWx1ZUxhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodmFsdWVMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXZhbHVlVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl2YWx1ZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJcHVibGljSWRMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBQVUJMSUNfSUQpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJcCA9IHB1YmxpY0lkTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodmFsdWVMYWJlbCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlwdWJsaWNJZExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gUHVibGljIElECi0JCXB1YmxpY0lkVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHB1YmxpY0lkTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwdWJsaWNJZExhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJcHVibGljSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXB1YmxpY0lkVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlzeXN0ZW1JZExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFNZU1RFTV9JRCk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlwID0gc3lzdGVtSWRMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwdWJsaWNJZExhYmVsLCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCXN5c3RlbUlkTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBTeXN0ZW0gSUQKLQkJc3lzdGVtSWRUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc3lzdGVtSWRMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHN5c3RlbUlkTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQlzeXN0ZW1JZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3lzdGVtSWRUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWlmIChpc0V4dGVybmFsRW50aXR5KCkpIHsKLQkJCXZhbHVlTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQl2YWx1ZVRleHQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlwdWJsaWNJZExhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlwdWJsaWNJZFRleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCXN5c3RlbUlkTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCXN5c3RlbUlkVGV4dC5zZXRWaXNpYmxlKHRydWUpOwotCi0JCQlwdWJsaWNJZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJcHVibGljSWRUZXh0LnNldFRleHQoKGVudGl0eSkuZ2V0UHVibGljSUQoKSk7Ci0JCQkJc3lzdGVtSWRUZXh0LnNldFRleHQoKGVudGl0eSkuZ2V0U3lzdGVtSUQoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWx1ZUxhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQl2YWx1ZVRleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCXB1YmxpY0lkTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlwdWJsaWNJZFRleHQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlzeXN0ZW1JZExhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJc3lzdGVtSWRUZXh0LnNldFZpc2libGUoZmFsc2UpOwotCi0JCQl2YWx1ZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgRW50aXR5KQotCQkJCXZhbHVlVGV4dC5zZXRUZXh0KCgoRW50aXR5KSBpbnB1dCkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeHRlcm5hbEVudGl0eSgpIHsKLQkJcmV0dXJuIEVudGl0eVR5cGVTZWN0aW9uLmlzRXh0ZXJuYWxFbnRpdHk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMTRjNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE5hbWVTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBOQU1FID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FOwotCXByaXZhdGUgVGV4dCBuYW1lVGV4dDsKLQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSBuYW1lVGV4dCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IG5hbWVUZXh0LmdldFRleHQoKTsKLQkJCWlmIChuZXdWYWx1ZS5sZW5ndGgoKSA+IDAgJiYgaW5wdXQgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQkJRFRETm9kZSBkdGROb2RlID0gKERURE5vZGUpIGlucHV0OwotCQkJCWR0ZE5vZGUuc2V0TmFtZShuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE5BTUUpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJUG9pbnQgcCA9IG5hbWVMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJaW50IGxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCW5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW5hbWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZUxhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZUxhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJbmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJLy8gbGlzdGVuZXIuc3RhcnRMaXN0ZW5pbmdGb3JFbnRlcihuYW1lVGV4dCk7Ci0JCS8vIGxpc3RlbmVyLnN0YXJ0TGlzdGVuaW5nVG8obmFtZVRleHQpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCW5hbWVUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCW5hbWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBEVEROb2RlKQotCQkJCW5hbWVUZXh0LnNldFRleHQoKChEVEROb2RlKSBpbnB1dCkuZ2V0TmFtZSgpKTsKLQkJfQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmV3RW50aXR5U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05ld0VudGl0eVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ0OTIyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmV3RW50aXR5U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5SZXNvdXJjZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIE5ld0VudGl0eVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIE5BTUUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX05BTUU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRU5USVRZX1RZUEUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9UWVBFOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0VOVElUWSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfRVhURVJOQUxfRU5USVRZOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBBUkFNRVRFUiA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfUEFSQU1FVEVSX0VOVElUWTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBHRU5FUkFMID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9HRU5FUkFMX0VOVElUWTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBWQUxVRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1ZBTFVFOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBVQkxJQ19JRCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfUFVCTElDX0lEOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFNZU1RFTV9JRCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfU1lTVEVNX0lEOwotCi0JcHJpdmF0ZSBUZXh0IHN5c3RlbUlkVGV4dDsKLQlwcml2YXRlIFRleHQgcHVibGljSWRUZXh0OwotCXByaXZhdGUgVGV4dCBuYW1lVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiB3aXphcmRCdXR0b247Ci0KLQlwcml2YXRlIFRleHQgZW50aXR5VmFsdWVUZXh0OwotCXByaXZhdGUgQnV0dG9uIGNoZWNrQm94OwotCi0JcHJpdmF0ZSBDQ29tYm8gdHlwZUNvbWJvOwotCXByaXZhdGUgU3RyaW5nW10gdHlwZUNvbWJvVmFsdWVzID0ge1BBUkFNRVRFUiwgR0VORVJBTH07Ci0JcHJpdmF0ZSBQYWdlQm9vayBwYWdlQm9vazsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCWNyZWF0ZUVudGl0eUNvbW1vbkNvbXBvc2l0ZShjb21wb3NpdGUpOwotCi0JCXBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChlbnRpdHlDb21tb25Db21wb3NpdGUsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWNyZWF0ZUV4dGVybmFsRW50aXR5Q29tcG9zaXRlKHBhZ2VCb29rKTsKLQkJY3JlYXRlSW50ZXJuYWxFbnRpdHlDb21wb3NpdGUocGFnZUJvb2spOwotCi0JCXBhZ2VCb29rLnNob3dQYWdlKGV4dGVybmFsRW50aXR5Q29tcG9zaXRlKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBlbnRpdHlDb21tb25Db21wb3NpdGU7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVFbnRpdHlDb21tb25Db21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQllbnRpdHlDb21tb25Db21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWVudGl0eUNvbW1vbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBuYW1lTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGVudGl0eUNvbW1vbkNvbXBvc2l0ZSwgTkFNRSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCVBvaW50IHAgPSBuYW1lTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQluYW1lVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGVudGl0eUNvbW1vbkNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJCAgICAKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZUxhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZUxhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJbmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIGNMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoZW50aXR5Q29tbW9uQ29tcG9zaXRlLCBFTlRJVFlfVFlQRSk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlwID0gY0xhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVMYWJlbCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQljTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBDcmVhdGUgQ2hlY2tib3gKLQkJY2hlY2tCb3ggPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGVudGl0eUNvbW1vbkNvbXBvc2l0ZSwgRVhURVJOQUxfRU5USVRZLCBTV1QuQ0hFQ0spOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQljaGVja0JveC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBDcmVhdGUgQ0NvbWJvCi0JCXR5cGVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oZW50aXR5Q29tbW9uQ29tcG9zaXRlLCBTV1QuRkxBVCB8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFIC0gMik7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY2hlY2tCb3gsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJdHlwZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXR5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJdHlwZUNvbWJvLnNldEl0ZW1zKHR5cGVDb21ib1ZhbHVlcyk7Ci0JCXR5cGVDb21iby5zZXRUZXh0KFBBUkFNRVRFUik7Ci0KLQkJcmV0dXJuIGVudGl0eUNvbW1vbkNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBpbnRlcm5hbEVudGl0eUNvbXBvc2l0ZTsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUludGVybmFsRW50aXR5Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW50ZXJuYWxFbnRpdHlDb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZW50aXR5Q29tbW9uQ29tcG9zaXRlLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCWludGVybmFsRW50aXR5Q29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIGVudGl0eVZhbHVlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGludGVybmFsRW50aXR5Q29tcG9zaXRlLCBWQUxVRSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCVBvaW50IHAgPSBlbnRpdHlWYWx1ZUxhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlpbnQgbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZW50aXR5VmFsdWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWVudGl0eVZhbHVlVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGludGVybmFsRW50aXR5Q29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGVudGl0eVZhbHVlTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChlbnRpdHlWYWx1ZUxhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJZW50aXR5VmFsdWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCWVudGl0eVZhbHVlVGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJZW50aXR5VmFsdWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCXJldHVybiBpbnRlcm5hbEVudGl0eUNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBleHRlcm5hbEVudGl0eUNvbXBvc2l0ZTsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUV4dGVybmFsRW50aXR5Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZW50aXR5Q29tbW9uQ29tcG9zaXRlLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCWV4dGVybmFsRW50aXR5Q29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIHB1YmxpY0lkTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGV4dGVybmFsRW50aXR5Q29tcG9zaXRlLCBQVUJMSUNfSUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlQb2ludCBwID0gcHVibGljSWRMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJaW50IGxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCXB1YmxpY0lkTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlwdWJsaWNJZFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWNJZFRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHB1YmxpY0lkTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwdWJsaWNJZExhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJcHVibGljSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXB1YmxpY0lkVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQkvLyBDcmVhdGUgU3lzdGVtIElEIExhYmVsCi0JCUNMYWJlbCBzeXN0ZW1JZExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSwgU1lTVEVNX0lEKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJcCA9IHN5c3RlbUlkTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlzeXN0ZW1JZExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gQ3JlYXRlIFdpemFyZCBCdXR0b24KLQkJd2l6YXJkQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQl3aXphcmRCdXR0b24uc2V0SW1hZ2UoQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgImljb25zL2Jyb3dzZWJ1dHRvbi5naWYiKS5jcmVhdGVJbWFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc3lzdGVtSWRMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXdpemFyZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl3aXphcmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIFN5c3RlbSBJRCBUZXh0Ci0JCXN5c3RlbUlkVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGV4dGVybmFsRW50aXR5Q29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCS8vIHN5c3RlbUlkVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHN5c3RlbUlkTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCh3aXphcmRCdXR0b24sIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc3lzdGVtSWRMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXN5c3RlbUlkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzeXN0ZW1JZFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJcmV0dXJuIGV4dGVybmFsRW50aXR5Q29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHR5cGVDb21ibykgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBub2RlID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJU3RyaW5nIHNlbGVjdGVkID0gdHlwZUNvbWJvLmdldFRleHQoKTsKLQkJCQlpZiAoUEFSQU1FVEVSLmVxdWFscyhzZWxlY3RlZCkpCi0JCQkJCW5vZGUuc2V0UGFyYW1ldGVyRW50aXR5KHRydWUpOwotCQkJCWVsc2UKLQkJCQkJbm9kZS5zZXRQYXJhbWV0ZXJFbnRpdHkoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGUud2lkZ2V0ID09IGNoZWNrQm94KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IG5vZGUgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQlib29sZWFuIHNlbGVjdGVkID0gY2hlY2tCb3guZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQkJCW5vZGUuc2V0RXh0ZXJuYWxFbnRpdHkodHJ1ZSk7Ci0JCQkJCXBhZ2VCb29rLnNob3dQYWdlKGV4dGVybmFsRW50aXR5Q29tcG9zaXRlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5vZGUuc2V0RXh0ZXJuYWxFbnRpdHkoZmFsc2UpOwotCQkJCQlwYWdlQm9vay5zaG93UGFnZShpbnRlcm5hbEVudGl0eUNvbXBvc2l0ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGUud2lkZ2V0ID09IHdpemFyZEJ1dHRvbikgewotCQkJU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQkJSUZpbGUgY3VycmVudElGaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBnZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0JCQlWaWV3ZXJGaWx0ZXIgZmlsdGVyID0gbmV3IFJlc291cmNlRmlsdGVyKG5ldyBTdHJpbmdbXXsiLmR0ZCJ9LCBuZXcgSUZpbGVbXXtjdXJyZW50SUZpbGV9LCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlEVERTZWxlY3RJbmNsdWRlRmlsZVdpemFyZCBmaWxlU2VsZWN0V2l6YXJkID0gbmV3IERURFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkKERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfRklMRURJQUxPR19TRUxFQ1RfRFRELCBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0ZJTEVESUFMT0dfU0VMRUNUX0RURF9ERVNDLCBmaWx0ZXIsIChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlNlbGVjdGlvbik7Ci0KLQkJCVdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCBmaWxlU2VsZWN0V2l6YXJkKTsKLQkJCXdpemFyZERpYWxvZy5jcmVhdGUoKTsKLQkJCXdpemFyZERpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWludCByZXN1bHQgPSB3aXphcmREaWFsb2cub3BlbigpOwotCQkJaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spIHsKLQkJCQlTdHJpbmcgdmFsdWUgPSBzeXN0ZW1JZFRleHQuZ2V0VGV4dCgpOwotCQkJCUlGaWxlIHNlbGVjdGVkSUZpbGUgPSBmaWxlU2VsZWN0V2l6YXJkLmdldFJlc3VsdEZpbGUoKTsKLQkJCQlTdHJpbmcgZHRkRmlsZVN0cmluZyA9IHZhbHVlOwotCQkJCWlmIChzZWxlY3RlZElGaWxlICE9IG51bGwpIHsKLQkJCQkJZHRkRmlsZVN0cmluZyA9IFVSSUhlbHBlci5nZXRSZWxhdGl2ZVVSSShzZWxlY3RlZElGaWxlLmdldEZ1bGxQYXRoKCksIGN1cnJlbnRJRmlsZS5nZXRGdWxsUGF0aCgpKTsKLQkJCQl9Ci0JCQkJc3lzdGVtSWRUZXh0LnNldFRleHQoZHRkRmlsZVN0cmluZyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQluYW1lVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCW5hbWVUZXh0LnNldFRleHQoZW50aXR5LmdldE5hbWUoKSk7Ci0KLQkJCQlpZiAoZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkpCi0JCQkJCXR5cGVDb21iby5zZXRUZXh0KFBBUkFNRVRFUik7Ci0JCQkJZWxzZQotCQkJCQl0eXBlQ29tYm8uc2V0VGV4dChHRU5FUkFMKTsKLQotCQkJCWlmIChlbnRpdHkuaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQkJCWNoZWNrQm94LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQkJcGFnZUJvb2suc2hvd1BhZ2UoZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUpOwotCQkJCQlwdWJsaWNJZFRleHQuc2V0VGV4dChlbnRpdHkuZ2V0UHVibGljSUQoKSk7Ci0JCQkJCXN5c3RlbUlkVGV4dC5zZXRUZXh0KGVudGl0eS5nZXRTeXN0ZW1JRCgpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNoZWNrQm94LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCXBhZ2VCb29rLnNob3dQYWdlKGludGVybmFsRW50aXR5Q29tcG9zaXRlKTsKLQkJCQkJZW50aXR5VmFsdWVUZXh0LnNldFRleHQoZW50aXR5LmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IG5hbWVUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gbmFtZVRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCAmJiBpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQllbnRpdHkuc2V0TmFtZShuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IGVudGl0eVZhbHVlVGV4dCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IGVudGl0eVZhbHVlVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJZW50aXR5LnNldFZhbHVlKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gcHVibGljSWRUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gcHVibGljSWRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQllbnRpdHkuc2V0UHVibGljSUQobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBzeXN0ZW1JZFRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBzeXN0ZW1JZFRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWVudGl0eS5zZXRTeXN0ZW1JRChuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Ob3RhdGlvblNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Ob3RhdGlvblNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU5NjBlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTm90YXRpb25TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgTm90YXRpb25TZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQVUJMSUNfSUQgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1BVQkxJQ19JRDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBTWVNURU1fSUQgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1NZU1RFTV9JRDsKLQotCXByaXZhdGUgVGV4dCBwdWJsaWNJZFRleHQ7Ci0JcHJpdmF0ZSBUZXh0IHN5c3RlbUlkVGV4dDsKLQotCXByaXZhdGUgQ0xhYmVsIHB1YmxpY0lkTGFiZWw7Ci0JcHJpdmF0ZSBDTGFiZWwgc3lzdGVtSWRMYWJlbDsKLQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSBwdWJsaWNJZFRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBwdWJsaWNJZFRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgTm90YXRpb24pIHsKLQkJCQlOb3RhdGlvbiBub3RhdGlvbiA9IChOb3RhdGlvbikgaW5wdXQ7Ci0JCQkJbm90YXRpb24uc2V0UHVibGljSUQobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBzeXN0ZW1JZFRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBzeXN0ZW1JZFRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgTm90YXRpb24pIHsKLQkJCQlOb3RhdGlvbiBub3RhdGlvbiA9IChOb3RhdGlvbikgaW5wdXQ7Ci0JCQkJbm90YXRpb24uc2V0U3lzdGVtSUQobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJcHVibGljSWRMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBQVUJMSUNfSUQpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJUG9pbnQgcCA9IHB1YmxpY0lkTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlwdWJsaWNJZExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gUHVibGljIElECi0JCXB1YmxpY0lkVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHB1YmxpY0lkTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwdWJsaWNJZExhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJcHVibGljSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXB1YmxpY0lkVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlzeXN0ZW1JZExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFNZU1RFTV9JRCk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlwID0gc3lzdGVtSWRMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwdWJsaWNJZExhYmVsLCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCXN5c3RlbUlkTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBTeXN0ZW0gSUQKLQkJc3lzdGVtSWRUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc3lzdGVtSWRMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHN5c3RlbUlkTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQlzeXN0ZW1JZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3lzdGVtSWRUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCXB1YmxpY0lkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlzeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dCBpbnN0YW5jZW9mIE5vdGF0aW9uKSB7Ci0JCQlOb3RhdGlvbiBub3RhdGlvbiA9IChOb3RhdGlvbikgaW5wdXQ7Ci0JCQlwdWJsaWNJZFRleHQuc2V0VGV4dCgobm90YXRpb24pLmdldFB1YmxpY0lEKCkpOwotCQkJc3lzdGVtSWRUZXh0LnNldFRleHQoKG5vdGF0aW9uKS5nZXRTeXN0ZW1JRCgpKTsKLQkJfQotCi0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9PY2N1cnJlbmNlRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vT2NjdXJyZW5jZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjU3ZTAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9PY2N1cnJlbmNlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01SZXBlYXRhYmxlTm9kZTsKLQotcHVibGljIGNsYXNzIE9jY3VycmVuY2VGaWx0ZXIgaW1wbGVtZW50cyBJRmlsdGVyIHsKLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoT2JqZWN0IHRvVGVzdCkgewotCQlpZiAodG9UZXN0IGluc3RhbmNlb2YgQ01CYXNpY05vZGUgJiYgKChDTUJhc2ljTm9kZSkgdG9UZXN0KS5pc0VtcHR5QW55T3JQQ0RhdGEoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZSBpZiAodG9UZXN0IGluc3RhbmNlb2YgQ01SZXBlYXRhYmxlTm9kZSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL09jY3VycmVuY2VTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vT2NjdXJyZW5jZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBmNWZmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vT2NjdXJyZW5jZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01SZXBlYXRhYmxlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE9jY3VycmVuY2VTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBPTkNFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9PTkNFOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9ORV9PUl9NT1JFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9PTkVfT1JfTU9SRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBPUFRJT05BTCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfT1BUSU9OQUw7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWkVST19PUl9NT1JFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9aRVJPX09SX01PUkU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT0NDVVJFTkNFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9PQ0NVUlJFTkNFOwotCi0JcHJpdmF0ZSBDQ29tYm8gb2NjdXJyZW5jZUNvbWJvOwotCXByaXZhdGUgU3RyaW5nW10gb2NjdXJyZW5jZUNvbWJvVmFsdWVzID0ge09OQ0UsIE9ORV9PUl9NT1JFLCBPUFRJT05BTCwgWkVST19PUl9NT1JFfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCB1c2FnZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE9DQ1VSRU5DRSk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlQb2ludCBwID0gdXNhZ2VMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJaW50IGxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCXVzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlvY2N1cnJlbmNlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCh1c2FnZUxhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodXNhZ2VMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCW9jY3VycmVuY2VDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlvY2N1cnJlbmNlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCW9jY3VycmVuY2VDb21iby5zZXRJdGVtcyhvY2N1cnJlbmNlQ29tYm9WYWx1ZXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNUmVwZWF0YWJsZU5vZGUpIHsKLQkJCWNoYXIgb2NjdXJlbmNlID0gKChDTVJlcGVhdGFibGVOb2RlKSBpbnB1dCkuZ2V0T2NjdXJyZW5jZSgpOwotCQkJaWYgKENNUmVwZWF0YWJsZU5vZGUuT05DRSA9PSBvY2N1cmVuY2UpCi0JCQkJb2NjdXJyZW5jZUNvbWJvLnNldFRleHQoT05DRSk7Ci0JCQllbHNlIGlmIChDTVJlcGVhdGFibGVOb2RlLk9ORV9PUl9NT1JFID09IG9jY3VyZW5jZSkKLQkJCQlvY2N1cnJlbmNlQ29tYm8uc2V0VGV4dChPTkVfT1JfTU9SRSk7Ci0JCQllbHNlIGlmIChDTVJlcGVhdGFibGVOb2RlLk9QVElPTkFMID09IG9jY3VyZW5jZSkKLQkJCQlvY2N1cnJlbmNlQ29tYm8uc2V0VGV4dChPUFRJT05BTCk7Ci0JCQllbHNlIGlmIChDTVJlcGVhdGFibGVOb2RlLlpFUk9fT1JfTU9SRSA9PSBvY2N1cmVuY2UpCi0JCQkJb2NjdXJyZW5jZUNvbWJvLnNldFRleHQoWkVST19PUl9NT1JFKTsKLQkJCWVsc2UKLQkJCQlvY2N1cnJlbmNlQ29tYm8uc2V0VGV4dChPTkNFKTsKLQkJfQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTVJlcGVhdGFibGVOb2RlKSB7Ci0JCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQkJQ01SZXBlYXRhYmxlTm9kZSBub2RlID0gKENNUmVwZWF0YWJsZU5vZGUpIGlucHV0OwotCQkJU3RyaW5nIG9jY3VycmVuY2UgPSBvY2N1cnJlbmNlQ29tYm8uZ2V0VGV4dCgpOwotCQkJaWYgKE9OQ0UuZXF1YWxzKG9jY3VycmVuY2UpKQotCQkJCW5vZGUuc2V0T2NjdXJyZW5jZShDTVJlcGVhdGFibGVOb2RlLk9OQ0UpOwotCQkJZWxzZSBpZiAoT05FX09SX01PUkUuZXF1YWxzKG9jY3VycmVuY2UpKQotCQkJCW5vZGUuc2V0T2NjdXJyZW5jZShDTVJlcGVhdGFibGVOb2RlLk9ORV9PUl9NT1JFKTsKLQkJCWVsc2UgaWYgKE9QVElPTkFMLmVxdWFscyhvY2N1cnJlbmNlKSkKLQkJCQlub2RlLnNldE9jY3VycmVuY2UoQ01SZXBlYXRhYmxlTm9kZS5PUFRJT05BTCk7Ci0JCQllbHNlIGlmIChaRVJPX09SX01PUkUuZXF1YWxzKG9jY3VycmVuY2UpKQotCQkJCW5vZGUuc2V0T2NjdXJyZW5jZShDTVJlcGVhdGFibGVOb2RlLlpFUk9fT1JfTU9SRSk7Ci0JCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1R5cGVTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vVHlwZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE4Nzk1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vVHlwZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVFlQRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfVFlQRTsKLQotCXByaXZhdGUgQ0NvbWJvIHR5cGVDb21ibzsKLQlwcml2YXRlIFN0cmluZ1tdIHR5cGVDb21ib1ZhbHVlcyA9IHtBdHRyaWJ1dGUuQ0RBVEEsIEF0dHJpYnV0ZS5JRCwgQXR0cmlidXRlLklEUkVGLCBBdHRyaWJ1dGUuSURSRUZTLCBBdHRyaWJ1dGUuRU5USVRZLCBBdHRyaWJ1dGUuRU5USVRJRVMsIEF0dHJpYnV0ZS5OTVRPS0VOLCBBdHRyaWJ1dGUuTk1UT0tFTlMsIEF0dHJpYnV0ZS5FTlVNRVJBVEVEX05BTUUsIEF0dHJpYnV0ZS5FTlVNRVJBVEVEX05PVEFUSU9OfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBjTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgVFlQRSk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlQb2ludCBwID0gY0xhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlpbnQgbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWNMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXR5cGVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0eXBlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCXR5cGVDb21iby5zZXRJdGVtcyh0eXBlQ29tYm9WYWx1ZXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0KLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkKLQkJCQl0eXBlQ29tYm8uc2V0VGV4dCgoKEF0dHJpYnV0ZSkgaW5wdXQpLmdldFR5cGUoKSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSB0eXBlQ29tYm8pIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCQlBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEF0dHJpYnV0ZSkgaW5wdXQ7Ci0JCQkJYXR0cmlidXRlLnNldFR5cGUodHlwZUNvbWJvLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhNWRkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRleHQuSURURFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlckZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLQotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIGEgc291cmNlIHZpZXdlciB3aGljaCBzaG93cyBEVEQgY29udGVudC4KLSAqIDxwPgotICogQ2xpZW50cyBjYW4gc3ViY2xhc3MgYW5kIG92ZXJyaWRlIGp1c3QgdGhvc2UgbWV0aG9kcyB3aGljaCBtdXN0IGJlIHNwZWNpZmljCi0gKiB0byB0aGVpciBuZWVkcy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFREIGV4dGVuZHMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIHsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbiBiZWNhdXNlIG5vdCBzb3VyY2V2aWV3ZXItc3BlY2lmaWMgYW5kCi0JICogaXQncyBhIFN0cmluZyBhcnJheQotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyW10gZkxpbmVTdHlsZVByb3ZpZGVyczsKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFRECi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURCgpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlpZiAoZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPT0gbnVsbCkgewotCQkJZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW117SURURFBhcnRpdGlvbnMuRFREX0RFRkFVTFQsIElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTiwgSVN0cnVjdHVyZWRQYXJ0aXRpb25zLlVOS05PV05fUEFSVElUSU9OfTsKLQkJfQotCQlyZXR1cm4gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlpZiAoZkxpbmVTdHlsZVByb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQlmTGluZVN0eWxlUHJvdmlkZXJzID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyW117Y3JlYXRlTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQoKX07Ci0JCX0KLQkJcmV0dXJuIGZMaW5lU3R5bGVQcm92aWRlcnM7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBjcmVhdGVMaW5lU3R5bGVQcm92aWRlckZvckRURCgpIHsKLQkJcmV0dXJuIG5ldyBMaW5lU3R5bGVQcm92aWRlckZvckRURCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFVJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMGYyYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBEVEQgVUkKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQVRUUklCVVRFTElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9EVERfTk9UQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRFREX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9EVERfRUxFTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9EVERfQ09NTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0RURF9ERUxFVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQVRUUklCVVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fR1JPVVBfQUREX0dST1VQOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0JVVFRPTl9HUk9VUF9JVEVNU19MT0dJQ0FMTFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0JVVFRPTl9TT1JUX0lURU1TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX1BBUkFNX0VOVElUWV9SRUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01PVkVfQVRUUklCVVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NT1ZFX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01PVkVfTk9ERTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTU9WRV9OT0RFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfRFREOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0aW5nX2ZpbGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERUREZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFRERmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERDb2xvclBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERDb2xvclBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERDb2xvclBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERDb2xvclBhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERDb2xvclBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERDb2xvclBhZ2VfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERDb2xvclBhZ2VfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERDb2xvclBhZ2VfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERDb2xvclBhZ2VfODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3VyY2VNZW51X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DUkVBVEVfTkVXX0RURF9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX0RURF9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19EVERfRVhQTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX0ZJTEVfREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlR3JvdXBfbmFtZUV4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTks7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRFREVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc2ZTZkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0RURDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIERURFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBEVERVSVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgZHRkIHVpLgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQotCS8qKgotCSAqIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIGR0ZCB1aS4KLQkgKi8KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgRFREVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgZHRkIGVkaXRvciB0ZW1wbGF0ZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBkdGQgZWRpdG9yIHRlbXBsYXRlcwotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCWlmIChmVGVtcGxhdGVTdG9yZSA9PSBudWxsKSB7Ci0JCQlmVGVtcGxhdGVTdG9yZSA9IG5ldyBDb250cmlidXRpb25UZW1wbGF0ZVN0b3JlKGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCksIGdldFByZWZlcmVuY2VTdG9yZSgpLCBEVERVSVByZWZlcmVuY2VOYW1lcy5URU1QTEFURVNfS0VZKTsKLQotCQkJdHJ5IHsKLQkJCQlmVGVtcGxhdGVTdG9yZS5sb2FkKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlU3RvcmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgZHRkIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBkdGQgcGx1Z2luCi0JICovCi0JcHVibGljIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSB7Ci0JCWlmIChmQ29udGV4dFR5cGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IENvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkoKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNEVEQuTkVXKTsKLQotCQkJZkNvbnRleHRUeXBlUmVnaXN0cnkgPSByZWdpc3RyeTsKLQkJfQotCi0JCXJldHVybiBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmEzNGM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVMSVNUPUFkZCBBdHRyaWJ1dGUgJkxpc3QKLQotIURURE91dGxpbmVyCi1fVUlfQUNUSU9OX0FERF9EVERfTk9UQVRJT049QWRkICZOb3RhdGlvbgotX1VJX0FDVElPTl9BRERfRFREX0VOVElUWT1BZGQgJkVudGl0eQotX1VJX0FDVElPTl9BRERfRFREX0VMRU1FTlQ9QWRkIEVsZSZtZW50Ci1fVUlfQUNUSU9OX0FERF9EVERfQ09NTUVOVD1BZGQgJkNvbW1lbnQKLV9VSV9BQ1RJT05fRFREX0RFTEVURT0mRGVsZXRlCi1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEU9QWRkICZBdHRyaWJ1dGUKLV9VSV9BQ1RJT05fR1JPVVBfQUREX0dST1VQPUFkZCBHcm91cCB0byBDb24mdGVudCBNb2RlbAotX1VJX0FDVElPTl9BRERfRUxFTUVOVD1BZGQgRWxlbWVudCB0byBDJm9udGVudCBNb2RlbAotCi0hRFREQ29udGVudE91dGxpbmVQYWdlCi1fVUlfQlVUVE9OX0dST1VQX0lURU1TX0xPR0lDQUxMWT1Hcm91cCBpdGVtcyBsb2dpY2FsbHkuCi1fVUlfQlVUVE9OX1NPUlRfSVRFTVM9U29ydCBpdGVtcyBhbHBoYWJldGljYWxseS4KLQotIURURENvbnRleHRDb250cmlidXRlcgotX1VJX0FDVElPTl9BRERfUEFSQU1fRU5USVRZX1JFRj1BZGQgJlBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlCi0KLSFEcmFnQXR0cmlidXRlQ29tbWFuZAotX1VJX01PVkVfQVRUUklCVVRFPU1vdmUgQXR0cmlidXRlCi0KLSFEcmFnQ29udGVudE1vZGVsQ29tbWFuZAotX1VJX01PVkVfQ09OVEVOVD1Nb3ZlIENvbnRlbnQKLQotIURyYWdUb3BMZXZlbE5vZGVzQ29tbWFuZAotX1VJX01PVkVfTk9ERT1Nb3ZlIE5vZGUKLV9VSV9NT1ZFX05PREVTPU1vdmUgTm9kZXMKLQotX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0RURD1UaGUgZmlsZSBuYW1lIG11c3QgZW5kIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGV4dGVuc2lvbnMgezB9LgotCi0jRFREIEZpbGUgcGFnZQotQ3JlYXRpbmdfZmlsZXM9Q3JlYXRpbmcgZmlsZXMKLURUREZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uTGFiZWw9QWRkIHRoaXMgc3VmZml4IChpZiBub3Qgc3BlY2lmaWVkKToKLURUREZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uRXJyb3I9U3VmZml4IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgezB9LgotCi0jRFREIFN0eWxlIHBhZ2UKLURURENvbG9yUGFnZV8wPTwhRUxFTUVOVCBNYWluIChPbmUsVHdvKyk+XHJcbjwhRUxFTUVOVCBPbmUgKFRocmVlLEZvdXIpPlxyXG48IUFUVExJU1QgT25lXHJcbiBvbmVvbmUgQ0RBVEEgI1JFUVVJUkVEXHJcbj5cclxuPCEtLSBZb3UgbmVlZCB0aGlzIC0tPlxyXG48IUVMRU1FTlQgVHdvIChtb3JlbW9yZSopPlxyXG48IUFUVExJU1QgVHdvXHJcbiB0d290d28gQ0RBVEEgI1JFUVVJUkVEXHJcbiB0d290aHJlZSAoYWFhIHwgYmJiKSAiYWFhIlxyXG4+XHJcbgotRFREQ29sb3JQYWdlXzE9Q29tbWVudHMKLURURENvbG9yUGFnZV8yPURhdGEKLURURENvbG9yUGFnZV8zPURlZmF1bHQKLURURENvbG9yUGFnZV80PUtleXdvcmRzCi1EVERDb2xvclBhZ2VfNT1TdHJpbmdzCi1EVERDb2xvclBhZ2VfNj1TeW1ib2xzCi1EVERDb2xvclBhZ2VfNz1UYWcgRGVsaW1pdGVycwotRFREQ29sb3JQYWdlXzg9VGFnIE5hbWVzCi1EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMD1OYW1lCi1EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMT1Db250ZW50cwotRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzI9QXR0cmlidXRlcwotCi0hIE5ld0RURFdpemFyZC5qYXZhCi1fVUlfQ1JFQVRFX05FV19EVERfRklMRSAgICAgID0gQ3JlYXRlIGEgbmV3IERURCBmaWxlLgotX1VJX1dJWkFSRF9ORVdfRFREX1RJVExFICAgICA9IENyZWF0ZSBEVEQKLV9VSV9XSVpBUkRfTkVXX0RURF9FWFBMICAgICAgPSBDcmVhdGUgYSBuZXcgRFREIGZpbGUuIFNwZWNpZnkgdGhlIGZvbGRlciBhbmQgbmFtZSBmb3IgdGhlIGZpbGUuCi0KLSMgY29waWVkIGZyb20gZHRkIGNvcmUKLV9VSV9MQUJFTF9EVERfRklMRV9ERUxFVEU9RGVsZXRlCi0jIwotUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzID0gVGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLU5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMD1TZWxlY3QgRFREIFRlbXBsYXRlCi1OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzE9U2VsZWN0IGEgdGVtcGxhdGUgYXMgaW5pdGlhbCBjb250ZW50IGluIHRoZSBEVEQgcGFnZS4KLU5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMj1OYW1lCi1OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzM9RGVzY3JpcHRpb24KLU5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfND0mVXNlIERURCBUZW1wbGF0ZQotTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV81PSZQcmV2aWV3OgotTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV82PVRlbXBsYXRlcyBhcmUgJ05ldyBEVEQnIHRlbXBsYXRlcyBmb3VuZCBpbiB0aGUgPGE+RFREIFRlbXBsYXRlczwvYT4gcHJlZmVyZW5jZSBwYWdlLgotTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV83PSZUZW1wbGF0ZXM6Ci0KLVNvdXJjZU1lbnVfbGFiZWw9U291cmNlCi0KLVN5bnRheENvbG9yaW5nUGFnZV8wPVN5bnRheCBFbGVtZW50OgotU3ludGF4Q29sb3JpbmdQYWdlXzI9RW5hYmxlCi1TeW50YXhDb2xvcmluZ1BhZ2VfMz0mQm9sZAotU3ludGF4Q29sb3JpbmdQYWdlXzQ9Jkl0YWxpYwotU3ludGF4Q29sb3JpbmdQYWdlXzU9JlN0cmlrZXRocm91Z2gKLVN5bnRheENvbG9yaW5nUGFnZV82PSZVbmRlcmxpbmUKLQotX1VJX1NUUlVDVFVSRURfVEVYVF9FRElUT1JfUFJFRlNfTElOSz1EVEQgcHJlZmVyZW5jZXMuICBOb3RlIHRoYXQgc29tZSBwcmVmZXJlbmNlcyBtYXkgYmUgc2V0IG9uIHRoZSA8YT57MH08L2E+IHByZWZlcmVuY2UgcGFnZS4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjI0ZWYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmCi0gKiBkZXNpcmVkLCB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcwotICogcGx1Z2luLiBPdGhlciBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5kdGQudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCQkJaWYgKGJ1bmRsZSAhPSBudWxsKQotCQkJCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RURERyYWdBbmREcm9wTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EVEREcmFnQW5kRHJvcE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1MDUwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RURERyYWdBbmREcm9wTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLkRyYWdBbmREcm9wTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLlRvcExldmVsTm9kZTsKLQotcHVibGljIGNsYXNzIERURERyYWdBbmREcm9wTWFuYWdlciBpbXBsZW1lbnRzIERyYWdBbmREcm9wTWFuYWdlciB7Ci0KLQlwdWJsaWMgRHJhZ0FuZERyb3BDb21tYW5kIGNyZWF0ZUNvbW1hbmQoT2JqZWN0IHRhcmdldCwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIHNvdXJjZSkgewotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIHRhcmdldDsKLQotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUb3BMZXZlbE5vZGUpIHsKLQkJCQlyZXR1cm4gbmV3IERyYWdUb3BMZXZlbE5vZGVzQ29tbWFuZCh0YXJnZXQsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZSk7Ci0JCQl9Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJCXJldHVybiBuZXcgRHJhZ0F0dHJpYnV0ZUNvbW1hbmQodGFyZ2V0LCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2UpOwotCQkJfQotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDTU5vZGUpIHsKLQkJCQlyZXR1cm4gbmV3IERyYWdDb250ZW50TW9kZWxDb21tYW5kKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlKTsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EcmFnQXR0cmlidXRlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EcmFnQXR0cmlidXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTUxMWMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRHJhZ0F0dHJpYnV0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLkRlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRHJhZ0F0dHJpYnV0ZUNvbW1hbmQgZXh0ZW5kcyBEZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kIHsKLQotCXB1YmxpYyBEcmFnQXR0cmlidXRlQ29tbWFuZChPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlcykgewotCQlzdXBlcih0YXJnZXQsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoc291cmNlIGluc3RhbmNlb2YgQXR0cmlidXRlKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlEVEROb2RlIHJlZmVyZW5jZU5vZGUgPSAoRFRETm9kZSkgdGFyZ2V0OwotCQlEVERGaWxlIGR0ZEZpbGUgPSByZWZlcmVuY2VOb2RlLmdldERUREZpbGUoKTsKLQkJaWYgKHJlZmVyZW5jZU5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCWR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERVSU1lc3NhZ2VzLl9VSV9NT1ZFX0FUVFJJQlVURSk7IC8vJE5PTi1OTFMtMSQKLQkJCUF0dHJpYnV0ZUxpc3QgYXR0TGlzdCA9IChBdHRyaWJ1dGVMaXN0KSByZWZlcmVuY2VOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCQkJYXR0TGlzdC5pbnNlcnRJbnRvTW9kZWwodGhpcywgKEF0dHJpYnV0ZSkgcmVmZXJlbmNlTm9kZSwgKEF0dHJpYnV0ZSkgbm9kZSwgaXNBZnRlcigpKTsKLQkJCQkJZHRkRmlsZS5kZWxldGVOb2RlKHRoaXMsIG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdDb250ZW50TW9kZWxDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdDb250ZW50TW9kZWxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxY2RiODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EcmFnQ29udGVudE1vZGVsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5kbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5EZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Hcm91cE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci0KLQotcHVibGljIGNsYXNzIERyYWdDb250ZW50TW9kZWxDb21tYW5kIGV4dGVuZHMgRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZCB7Ci0KLQlwdWJsaWMgRHJhZ0NvbnRlbnRNb2RlbENvbW1hbmQoT2JqZWN0IHRhcmdldCwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIHNvdXJjZXMpIHsKLQkJc3VwZXIodGFyZ2V0LCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2VzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBDTU5vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJdGVyYXRvciBpdGVyID0gc291cmNlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBzb3VyY2UgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghKHNvdXJjZSBpbnN0YW5jZW9mIENNTm9kZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJRFRETm9kZSByZWZlcmVuY2VOb2RlID0gKERURE5vZGUpIHRhcmdldDsKLQotCQlpZiAocmVmZXJlbmNlTm9kZSBpbnN0YW5jZW9mIENNTm9kZSkgewotCQkJRFRERmlsZSBkdGRGaWxlID0gcmVmZXJlbmNlTm9kZS5nZXREVERGaWxlKCk7Ci0KLQkJCURURE5vZGUgcGFyZW50ID0gKERURE5vZGUpIHJlZmVyZW5jZU5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIERURFVJTWVzc2FnZXMuX1VJX01PVkVfQ09OVEVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJCWJvb2xlYW4gcGFyZW50SXNFbGVtZW50ID0gZmFsc2U7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQkJQ01Hcm91cE5vZGUgZ3JvdXAgPSBudWxsOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlwYXJlbnRJc0VsZW1lbnQgPSB0cnVlOwotCQkJCWVsZW1lbnQgPSAoRWxlbWVudCkgcGFyZW50OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZ3JvdXAgPSAoQ01Hcm91cE5vZGUpIHBhcmVudDsKLQkJCX0KLQotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCAmJiBncm91cCA9PSBudWxsKSB7Ci0JCQkJLy8gbm8gcGFyZW50IHRvIGFkZCB0bwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSXRlcmF0b3IgaXRlciA9IHNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIENNTm9kZSkgewotCQkJCQlpZiAocGFyZW50SXNFbGVtZW50KSB7Ci0JCQkJCQlpZiAoZWxlbWVudC5nZXRDb250ZW50TW9kZWwoKSA9PSBub2RlKSB7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQllbGVtZW50LnJlcGxhY2VDb250ZW50TW9kZWwodGhpcywgKENNTm9kZSkgbm9kZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAocmVmZXJlbmNlTm9kZSA9PSBub2RlIHx8IChpc0FmdGVyKCkgJiYgcmVmZXJlbmNlTm9kZS5nZXROZXh0U2libGluZygpID09IG5vZGUpIHx8ICghaXNBZnRlcigpICYmIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PSByZWZlcmVuY2VOb2RlKSkgewotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCi0JCQkJCQlncm91cC5pbnNlcnRJbnRvTW9kZWwodGhpcywgKENNTm9kZSkgcmVmZXJlbmNlTm9kZSwgKENNTm9kZSkgbm9kZSwgaXNBZnRlcigpKTsKLQotCQkJCQl9Ci0JCQkJCURURE5vZGUgbm9kZVBhcmVudCA9IChEVEROb2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJbm9kZVBhcmVudC5kZWxldGUodGhpcywgbm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RmVlZGJhY2soKSB7Ci0JCURURE5vZGUgcmVmZXJlbmNlTm9kZSA9IChEVEROb2RlKSB0YXJnZXQ7Ci0JCWlmIChyZWZlcmVuY2VOb2RlIGluc3RhbmNlb2YgQ01Ob2RlKSB7Ci0JCQlDTU5vZGUgY21Ob2RlID0gKENNTm9kZSkgcmVmZXJlbmNlTm9kZTsKLQkJCWlmIChjbU5vZGUuaXNSb290RWxlbWVudENvbnRlbnQoKSAmJiBjbU5vZGUgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJCXJldHVybiBETkQuRkVFREJBQ0tfU0VMRUNUOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEZlZWRiYWNrKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EcmFnVG9wTGV2ZWxOb2Rlc0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRHJhZ1RvcExldmVsTm9kZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5Yjg3MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EcmFnVG9wTGV2ZWxOb2Rlc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5kbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5EZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ub3BMZXZlbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRHJhZ1RvcExldmVsTm9kZXNDb21tYW5kIGV4dGVuZHMgRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZCB7Ci0KLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbW92ZU5vZGUgPSBEVERVSU1lc3NhZ2VzLl9VSV9NT1ZFX05PREU7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbW92ZU5vZGVzID0gRFREVUlNZXNzYWdlcy5fVUlfTU9WRV9OT0RFUzsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIERyYWdUb3BMZXZlbE5vZGVzQ29tbWFuZChPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlcykgewotCQlzdXBlcih0YXJnZXQsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWlmICghKHRhcmdldCBpbnN0YW5jZW9mIFRvcExldmVsTm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoc291cmNlIGluc3RhbmNlb2YgVG9wTGV2ZWxOb2RlKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlEVEROb2RlIHJlZmVyZW5jZU5vZGUgPSAoRFRETm9kZSkgdGFyZ2V0OwotCi0JCURUREZpbGUgZHRkRmlsZSA9IHJlZmVyZW5jZU5vZGUuZ2V0RFRERmlsZSgpOwotCQlkdGRGaWxlLmdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgc291cmNlcy5zaXplKCkgPiAxID8gbW92ZU5vZGVzIDogbW92ZU5vZGUpOwotCQlJdGVyYXRvciBpdGVyID0gc291cmNlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgVG9wTGV2ZWxOb2RlKSB7Ci0JCQkJZHRkRmlsZS5tb3ZlTm9kZSh0aGlzLCByZWZlcmVuY2VOb2RlLCBub2RlLCBpc0FmdGVyKCkpOwotCQkJfQotCQl9Ci0JCWR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9BY3Rpb25Db250cmlidXRvckRURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9BY3Rpb25Db250cmlidXRvckRURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjI0OTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9lZGl0b3IvQWN0aW9uQ29udHJpYnV0b3JEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25Db250cmlidXRvcjsKLQotLyoqCi0gKiBYTUxFZGl0b3JBY3Rpb25Db250cmlidXRvcgotICogCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgdXNlZCBpbnNpZGUgbXVsdGkgcGFnZSBlZGl0b3IncwotICogQWN0aW9uQmFyQ29udHJpYnV0b3IsIHNpbmNlIGNhc2NhZGVkIGluaXQoKSBjYWxsIGZyb20gdGhlCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciB3aWxsIGNhdXNlcyBleGNlcHRpb24gYW5kIGl0IGxlYWRzIHRvIGxvc2Ugd2hvbGUKLSAqIHRvb2xiYXJzLgotICogCi0gKiBJbnN0ZWFkLCB1c2UgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yIGZvciBzb3VyY2UgcGFnZSBjb250cmlidXRvciBvZgotICogbXVsdGkgcGFnZSBlZGl0b3IuCi0gKiAKLSAqIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIHN0aWxsIHZhbGlkIGZvciBzaW5nbGUgcGFnZSBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Db250cmlidXRvckRURCBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9yIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVESVRPUl9JRFMgPSB7Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlIiwgIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51dGlsLkFjdGlvbkNvbnRyaWJ1dG9yI2dldEV4dGVuc2lvbklEcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEV4dGVuc2lvbklEcygpIHsKLQkJcmV0dXJuIEVESVRPUl9JRFM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCS8vIGVkaXQgY29tbWFuZHMKLQkJSU1lbnVNYW5hZ2VyIGVkaXRNZW51ID0gbWVudS5maW5kTWVudVVzaW5nUGF0aChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCk7Ci0JCWlmIChlZGl0TWVudSAhPSBudWxsKSB7Ci0JCQllZGl0TWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCWVkaXRNZW51LmFkZChmVG9nZ2xlSW5zZXJ0TW9kZUFjdGlvbik7Ci0JCQllZGl0TWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCWVkaXRNZW51LmFkZChmRXhwYW5kU2VsZWN0aW9uVG9NZW51KTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZNZW51QWRkaXRpb25zR3JvdXBNYXJrZXIpOwotCQl9Ci0KLQkJLy8gc291cmNlIGNvbW1hbmRzCi0JCVN0cmluZyBzb3VyY2VNZW51TGFiZWwgPSBEVERVSU1lc3NhZ2VzLlNvdXJjZU1lbnVfbGFiZWw7Ci0JCVN0cmluZyBzb3VyY2VNZW51SWQgPSAic291cmNlTWVudUlkIjsgLy8kTk9OLU5MUy0xJAotCQlJTWVudU1hbmFnZXIgc291cmNlTWVudSA9IG5ldyBNZW51TWFuYWdlcihzb3VyY2VNZW51TGFiZWwsIHNvdXJjZU1lbnVJZCk7Ci0JCW1lbnUuaW5zZXJ0QWZ0ZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0VESVQsIHNvdXJjZU1lbnUpOwotCQlpZiAoc291cmNlTWVudSAhPSBudWxsKSB7Ci0JCQlzb3VyY2VNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJc291cmNlTWVudS5hZGQoZlNoaWZ0UmlnaHQpOwotCQkJc291cmNlTWVudS5hZGQoZlNoaWZ0TGVmdCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQl9Ci0JCUlNZW51TWFuYWdlciBuYXZpZ2F0ZU1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9OQVZJR0FURSk7Ci0JCWlmIChuYXZpZ2F0ZU1lbnUgIT0gbnVsbCkgewotCQkJSU1lbnVNYW5hZ2VyIGdvdG9Hcm91cCA9IG5hdmlnYXRlTWVudS5maW5kTWVudVVzaW5nUGF0aChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkdPX1RPKTsKLQkJCWlmIChnb3RvR3JvdXAgIT0gbnVsbCkgewotCQkJCWdvdG9Hcm91cC5hZGQoZkdvdG9NYXRjaGluZ0JyYWNrZXRBY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9EVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9EVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGQ5NDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9lZGl0b3IvRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBpbWFnZXMgcHJvdmlkZWQgYnkgdGhpcyBwbHVnLWluLgotICogCi0gKiBOT1RFOiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEZvciBpbWFnZXMgdXNlZCBleHRlcm5hbGx5LCBwbGVhc2UgdXNlIHRoZQotICogU2hhcmVkKioqSW1hZ2VIZWxwZXIgY2xhc3MgaW5zdGVhZC4KLSAqIAotICogQGF1dGhvciBhbXl3dQotICovCi1wdWJsaWMgY2xhc3MgRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgewotCXByaXZhdGUgc3RhdGljIERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyIGluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIEdldHMgdGhlIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8vIHNhdmUgYSBkZXNjcmlwdG9yIGZvciBlYWNoIGltYWdlCi0JcHJpdmF0ZSBIYXNoTWFwIGZJbWFnZURlc2NSZWdpc3RyeSA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUExVR0lOSUQgPSBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGZyb20gdGhlIGdpdmVuIHJlc291cmNlIGFuZCBhZGRzIHRoZSBpbWFnZSB0byB0aGUKLQkgKiBpbWFnZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIEltYWdlCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBjcmVhdGVJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBnZXRJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQkvLyBkb250IGFkZCB0aGUgbWlzc2luZyBpbWFnZSBkZXNjcmlwdG9yIGltYWdlIHRvIHRoZSBpbWFnZQotCQkJLy8gcmVnaXN0cnkKLQkJCWlmICghZGVzYy5lcXVhbHMoSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKSkpCi0JCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChyZXNvdXJjZSwgaW1hZ2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGRlc2NyaXB0b3IgZnJvbSB0aGUgZ2l2ZW4gaW1hZ2VGaWxlUGF0aCBhbmQgYWRkcyB0aGUKLQkgKiBpbWFnZSBkZXNjcmlwdG9yIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiBhbiBpbWFnZQotCSAqIGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGNyZWF0ZWQsIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yCi0JICogaXMgcmV0dXJuZWQgYnV0IG5vdCBhZGRlZCB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2VGaWxlUGF0aAotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIGltYWdlIGRlc2NyaXB0b3IgZm9yIGltYWdlRmlsZVBhdGggb3IgZGVmYXVsdAotCSAqICAgICAgICAgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgcmVzb3VyY2UgY291bGQgbm90IGJlIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpbWFnZUZpbGVQYXRoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOSUQsIGltYWdlRmlsZVBhdGgpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCWdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkucHV0KGltYWdlRmlsZVBhdGgsIGltYWdlRGVzY3JpcHRvcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKiBJZiB0aGUgaW1hZ2UgY2Fubm90IGJlIHJldHJpZXZlZCwgYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBhdAotCSAqIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2Ugb3IgbnVsbCBpZiBvbmUgY291bGQKLQkgKiAgICAgICAgIG5vdCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSBhbiBpbWFnZQotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZShyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UgZnJvbSB0aGUgaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiB0aGUgaW1hZ2UgZGVzY3JpcHRvciBjYW5ub3QgYmUgcmV0cmlldmVkLAotCSAqIGF0dGVtcHQgdG8gZmluZCBhbmQgbG9hZCB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkCi0JICogaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgZGVzY3JpcHRvciB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jYXRlZCB3aXRoIHJlc291cmNlIG9yCi0JICogICAgICAgICB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiBvbmUgY291bGQgbm90IGJlCi0JICogICAgICAgICBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkJT2JqZWN0IG8gPSBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSBhIGRlc2NyaXB0b3IKLQkJCWltYWdlRGVzY3JpcHRvciA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSAoSW1hZ2VEZXNjcmlwdG9yKSBvOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBIYXNoTWFwIC0gaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSB7Ci0JCWlmIChmSW1hZ2VEZXNjUmVnaXN0cnkgPT0gbnVsbCkKLQkJCWZJbWFnZURlc2NSZWdpc3RyeSA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBmSW1hZ2VEZXNjUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSW1hZ2VSZWdpc3RyeSAtIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9lZGl0b3IvRFRERWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0RUREVkaXRvclBsdWdpbkltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjJiZWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9lZGl0b3IvRFRERWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yOwotCi0vKioKLSAqIEJ1bmRsZSBvZiBtb3N0IGltYWdlcyB1c2VkIGJ5IHRoZSBEVEQgU291cmNlIEVkaXRvciBwbHVnLWluLgotICovCi1wdWJsaWMgY2xhc3MgRFRERWRpdG9yUGx1Z2luSW1hZ2VzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ1RPT0xfQUREX0FUVFJJQlVURSA9ICJpY29ucy9mdWxsL2N0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ1RPT0xfQUREX0VMRU1FTlQgPSAiaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9FbGVtZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DVE9PTF9BRERfRUxFTUVOVFRPQ09OTU9ERUwgPSAiaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ1RPT0xfQUREX0dST1VQVE9DT05NT0RFTCA9ICJpY29ucy9mdWxsL2N0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0FERF9BVFRSSUJVVEUgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9BdHRyaWJ1dGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9BRERfRUxFTUVOVCA9ICJpY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9BRERfRUxFTUVOVFRPQ09OTU9ERUwgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0FERF9HUk9VUFRPQ09OTU9ERUwgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9Hcm91cFRvQ29uTW9kZWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9BRERfQVRUUklCVVRFID0gImljb25zL2Z1bGwvZXRvb2wxNi9BRERfQXR0cmlidXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfQUREX0VMRU1FTlQgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9FbGVtZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfQUREX0VMRU1FTlRUT0NPTk1PREVMID0gImljb25zL2Z1bGwvZXRvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9BRERfR1JPVVBUT0NPTk1PREVMID0gImljb25zL2Z1bGwvZXRvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQUREX0NPTU1FTlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9BRERfQ29tbWVudC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9BRERfRU5USVRZID0gImljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9BRERfRU5USVRZX1JFRkVSRU5DRSA9ICJpY29ucy9mdWxsL29iajE2L0FERF9FbnRpdHlfUmVmZXJlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0FERF9OT1RBVElPTiA9ICJpY29ucy9mdWxsL29iajE2L0FERF9Ob3RhdGlvbi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9PUkdBTklaRV9EVERfTE9HSUNBTExZID0gImljb25zL2Z1bGwvb2JqMTYvb3JnYW5pemVfZHRkX2xvZ2ljYWxseS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9TT1JUID0gImljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9WQUxJREFURSA9ICJpY29ucy9mdWxsL29iajE2L3ZhbGlkYXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laQkFOX05FV0RUREZJTEUgPSAiaWNvbnMvZnVsbC93aXpiYW4vbmV3ZHRkZmlsZV93aXoucG5nIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwY2UyMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIERURCBTb3VyY2UgRWRpdG9yLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBjb250YWlucyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlCi0gKiBpbXBsZW1lbnRlZC4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIZWxwQ29udGV4dElkcyB7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSArICIuIjsgLy8kTk9OLU5MUy0xJAotCS8vIERURCBGaWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfUFJFRldFQlhfRklMRVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDIwIjsgLy8kTk9OLU5MUy0xJAotCS8vIERURCBTdHlsZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMjEiOyAvLyROT04tTkxTLTEkCi0JLy8gRFREIFRlbXBsYXRlIFByZWZlcmVuY2UgcGFnZSAobm8gaWQgZm9yIHRoaXMgeWV0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9QUkVGV0VCWF9URU1QTEFURVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDIyIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gLy8gZmlndXJlZCBvdXQgb24gdGhlIGZseQotCS8vIC8vIERURCBTb3VyY2UgcGFnZSBlZGl0b3IKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfU09VUkNFVklFV19IRUxQSUQgPQotCS8vIENvbnRlbnRUeXBlSWRGb3JEVEQuQ29udGVudFR5cGVJRF9EVEQgKyAiX3NvdXJjZV9IZWxwSWQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBEVEQgTmV3IEZpbGUgV2l6YXJkIC0gVGVtcGxhdGUgUGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEID0gUFJFRklYICsgImR0ZHcwMDEwIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURENvbG9yUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURENvbG9yUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDE4NTVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERDb2xvclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0RURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdENvbG9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlN0eWxlZFRleHRDb2xvclBpY2tlcjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFREQ29sb3JQYWdlIGV4dGVuZHMgQWJzdHJhY3RDb2xvclBhZ2UgewotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFnZUNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCQkoKEdyaWREYXRhKSBwYWdlQ29tcG9uZW50LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTDsKLQotCQlzdXBlci5jcmVhdGVDb250ZW50cyhwYWdlQ29tcG9uZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYWdlQ29tcG9uZW50LCBJSGVscENvbnRleHRJZHMuRFREX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCi0JCXJldHVybiBwYWdlQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIFNldCB1cCBhbGwgdGhlIHN0eWxlIHByZWZlcmVuY2Uga2V5cyBpbiB0aGUgb3ZlcmxheSBzdG9yZQotCSAqLwotCXByb3RlY3RlZCBPdmVybGF5S2V5W10gY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpIHsKLQkJQXJyYXlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUFycmF5TGlzdCBzdHlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQkJSXRlcmF0b3IgaSA9IHN0eWxlTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCAoU3RyaW5nKSBpLm5leHQoKSkpOwotCQl9Ci0KLQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10ga2V5cyA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbb3ZlcmxheUtleXMuc2l6ZSgpXTsKLQkJb3ZlcmxheUtleXMudG9BcnJheShrZXlzKTsKLQkJcmV0dXJuIGtleXM7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTYW1wbGVUZXh0KCkgewotCQlyZXR1cm4gRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfMDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZXh0U3R5bGVNYXAoRGljdGlvbmFyeSBjb250ZXh0U3R5bGVNYXApIHsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT05URU5UX0VNUFRZLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTlRFTlRfQU5ZLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5BTUUsIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRZX1BBUk0sIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRywgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRywgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUiwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUsIElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlNUQVJUX1RBRywgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVORF9UQUcsIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTiwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT01NRU5UX0NPTlRFTlQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkcpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5TWVNURU1fS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5QVUJMSUNfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5OREFUQV9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNEQVRBX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuSURfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5JRFJFRl9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLklEUkVGU19LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVOVElUWV9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVOVElUSUVTX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk1UT0tFTl9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5NVE9LRU5TX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5SRVFVSVJFRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLklNUExJRURfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5GSVhFRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXREZXNjcmlwdGlvbnMoRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMpIHsKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzEpOyAvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBLCBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV8yKTsgLy8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREVGQVVMVCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfMyk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzQpOyAvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkcsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzUpOyAvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzYpOyAvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzcpOyAvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FLCBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV84KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRTdHlsZUxpc3QoQXJyYXlMaXN0IGxpc3QpIHsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxUKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkcpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFBpY2tlcihTdHlsZWRUZXh0Q29sb3JQaWNrZXIgcGlja2VyKSB7Ci0JCUlNb2RlbE1hbmFnZXIgbW1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlwaWNrZXIuc2V0UGFyc2VyKG1tYW5hZ2VyLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREKS5nZXRQYXJzZXIoKSk7Ci0KLQkJRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWluaXREZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQotCQlEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW5pdENvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCi0JCUFycmF5TGlzdCBzdHlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQotCQlwaWNrZXIuc2V0Q29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0JCXBpY2tlci5zZXREZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJcGlja2VyLnNldFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdENvbG9yUGFnZSNzYXZlUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHsKLQkJRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFRERmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmZmMTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWREYXRhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlTGlua0FyZWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkRURENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZTsKLQotCi1wdWJsaWMgY2xhc3MgRFRERmlsZXNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZVBhZ2UgewotCXByaXZhdGUgQ29tYm8gZkRlZmF1bHRTdWZmaXggPSBudWxsOwotCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHN1cGVyLmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLkRURF9QUkVGV0VCWF9GSUxFU19IRUxQSUQpOwotCi0JCW5ldyBQcmVmZXJlbmNlTGlua0FyZWEoY29tcG9zaXRlLCBTV1QuV1JBUCB8IFNXVC5NVUxUSSwgIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZWRpdG9yIiwgRFREVUlNZXNzYWdlcy5fVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LLC8vJE5PTi1OTFMtMSQKLQkJCQkJKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKSBnZXRDb250YWluZXIoKSwgbnVsbCkuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmhpbnQoMTUwLCBTV1QuREVGQVVMVCkuY3JlYXRlKCkpOwotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3Rvcnkuc3d0RGVmYXVsdHMoKS5jcmVhdGUoKSk7Ci0KLQotCQlHcm91cCBjcmVhdGluZ0dyb3VwID0gY3JlYXRlR3JvdXAoY29tcG9zaXRlLCAyKTsKLQkJY3JlYXRpbmdHcm91cC5zZXRUZXh0KERURFVJTWVzc2FnZXMuQ3JlYXRpbmdfZmlsZXMpOwotCi0JCS8vIERlZmF1bHQgZXh0ZW5zaW9uIGZvciBOZXcgZmlsZSBXaXphcmQKLQkJY3JlYXRlTGFiZWwoY3JlYXRpbmdHcm91cCwgRFREVUlNZXNzYWdlcy5EVERGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkxhYmVsKTsKLQkJZkRlZmF1bHRTdWZmaXggPSBjcmVhdGVEcm9wRG93bkJveChjcmVhdGluZ0dyb3VwKTsKLQkJU3RyaW5nW10gdmFsaWRFeHRlbnNpb25zID0gKFN0cmluZ1tdKSBnZXRWYWxpZEV4dGVuc2lvbnMoKS50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCQlBcnJheXMuc29ydCh2YWxpZEV4dGVuc2lvbnMpOwotCQlmRGVmYXVsdFN1ZmZpeC5zZXRJdGVtcyh2YWxpZEV4dGVuc2lvbnMpOwotCQlmRGVmYXVsdFN1ZmZpeC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCWxvYWRQcmVmZXJlbmNlcygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZkRlZmF1bHRTdWZmaXgucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCURURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29udGVudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldyBmaWxlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gSUNvbnRlbnRUeXBlCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbGlzdCBvZiB2YWxpZCBleHRlbnNpb25zCi0JICogCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFZhbGlkRXh0ZW5zaW9ucygpIHsKLQkJaWYgKGZWYWxpZEV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkJZlZhbGlkRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdCh0eXBlLmdldEZpbGVTcGVjcyhJQ29udGVudFR5cGUuRklMRV9FWFRFTlNJT05fU1BFQykpKTsKLQkJfQotCQlyZXR1cm4gZlZhbGlkRXh0ZW5zaW9uczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSNnZXRNb2RlbFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCVN0cmluZyBzdWZmaXggPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKERURENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04pOwotCQlmRGVmYXVsdFN1ZmZpeC5zZXRUZXh0KHN1ZmZpeCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlTdHJpbmcgc3VmZml4ID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoRFREQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTik7Ci0JCWZEZWZhdWx0U3VmZml4LnNldFRleHQoc3VmZml4KTsKLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0KLQkJZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJU3RyaW5nIHN1ZmZpeCA9IGZEZWZhdWx0U3VmZml4LmdldFRleHQoKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKERURENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04sIHN1ZmZpeCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVWYWx1ZXMoKSB7Ci0JCWJvb2xlYW4gaXNWYWxpZCA9IGZhbHNlOwotCQlJdGVyYXRvciBpID0gZ2V0VmFsaWRFeHRlbnNpb25zKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpICYmICFpc1ZhbGlkKSB7Ci0JCQlTdHJpbmcgZXh0ZW5zaW9uID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlpc1ZhbGlkID0gZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoZkRlZmF1bHRTdWZmaXguZ2V0VGV4dCgpKTsKLQkJfQotCi0JCWlmICghaXNWYWxpZCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKERURFVJTWVzc2FnZXMuRFRERmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25FcnJvciwgZ2V0VmFsaWRFeHRlbnNpb25zKCkudG9TdHJpbmcoKSkpOwotCQkJc2V0VmFsaWQoZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJc2V0VmFsaWQodHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREU3ludGF4Q29sb3JpbmdQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREU3ludGF4Q29sb3JpbmdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NzVjYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURFN5bnRheENvbG9yaW5nUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkNvbG9yU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0RURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotLyoqCi0gKiBBIHByZWZlcmVuY2UgcGFnZSB0byBjb25maWd1cmUgb3VyIFhNTCBzeW50YXggY29sb3IuIEl0IHJlc2VtYmxlcyB0aGUgSkRUCi0gKiBhbmQgQ0RUIHBhZ2VzIGZhciBtb3JlIHRoYW4gb3VyIG9yaWdpbmFsIGNvbG9yIHBhZ2Ugd2hpbGUgcmV0YWluaW5nIHRoZQotICogZXh0cmEgImNsaWNrLXRvLWZpbmQiIGZ1bmN0aW9uYWxpdHkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVERTeW50YXhDb2xvcmluZ1BhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmQm9sZDsKLQlwcml2YXRlIExhYmVsIGZGb3JlZ3JvdW5kTGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCBmQmFja2dyb3VuZExhYmVsOwotCXByaXZhdGUgQnV0dG9uIGZDbGVhclN0eWxlOwotCXByaXZhdGUgTWFwIGZDb250ZXh0VG9TdHlsZU1hcDsKLQlwcml2YXRlIENvbG9yIGZEZWZhdWx0Rm9yZWdyb3VuZCA9IG51bGw7Ci0JcHJpdmF0ZSBDb2xvciBmRGVmYXVsdEJhY2tncm91bmQgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBCdXR0b24gZkl0YWxpYzsKLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZk92ZXJsYXlTdG9yZTsKLQlwcml2YXRlIEJ1dHRvbiBmU3RyaWtlOwotCXByaXZhdGUgQ29sbGVjdGlvbiBmU3R5bGVQcmVmZXJlbmNlS2V5czsKLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgZlN0eWxlc1ZpZXdlciA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZlN0eWxlVG9EZXNjcmlwdGlvbk1hcDsKLQlwcml2YXRlIFN0eWxlZFRleHQgZlRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gZlVuZGVybGluZTsKLQotCS8vIGFjdGl2YXRlIGNvbnRyb2xzIGJhc2VkIG9uIHRoZSBnaXZlbiBsb2NhbCBjb2xvciB0eXBlCi0JcHJpdmF0ZSB2b2lkIGFjdGl2YXRlKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCUNvbG9yIGZvcmVncm91bmQgPSBmRGVmYXVsdEZvcmVncm91bmQ7Ci0JCUNvbG9yIGJhY2tncm91bmQgPSBmRGVmYXVsdEJhY2tncm91bmQ7Ci0JCWlmIChuYW1lZFN0eWxlID09IG51bGwpIHsKLQkJCWZDbGVhclN0eWxlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZlN0cmlrZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZVbmRlcmxpbmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZJdGFsaWMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZTdHJpa2Uuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZVbmRlcmxpbmUuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCVRleHRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlRm9yKG5hbWVkU3R5bGUpOwotCQkJZkNsZWFyU3R5bGUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCb2xkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmU3RyaWtlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQm9sZC5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOwotCQkJZkl0YWxpYy5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7Ci0JCQlmU3RyaWtlLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0gpICE9IDApOwotCQkJZlVuZGVybGluZS5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkUpICE9IDApOwotCQkJaWYgKGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWZvcmVncm91bmQgPSBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJfQotCQkJaWYgKGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWJhY2tncm91bmQgPSBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpOwotCQkJfQotCQl9Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRDb2xvclZhbHVlKGZvcmVncm91bmQuZ2V0UkdCKCkpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldENvbG9yVmFsdWUoYmFja2dyb3VuZC5nZXRSR0IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29sb3IgdGhlIHRleHQgaW4gdGhlIHNhbXBsZSBhcmVhIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwcmVmZXJlbmNlcwotCSAqLwotCXZvaWQgYXBwbHlTdHlsZXMoKSB7Ci0JCWlmIChmVGV4dCA9PSBudWxsIHx8IGZUZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJLy8gbG9va3VwIHRoZSBsb2NhbCBjb2xvcmluZyB0eXBlIGFuZCBhcHBseSBpdAotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZkNvbnRleHRUb1N0eWxlTWFwLmdldChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSk7Ci0JCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVGb3IobmFtZWRTdHlsZSk7Ci0JCQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY3VycmVudFJlZ2lvbiksIGN1cnJlbnRSZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0U3R5bGUoKSk7Ci0JCQkJc3R5bGUuc3RyaWtlb3V0ID0gKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwOwotCQkJCXN0eWxlLnVuZGVybGluZSA9IChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwOwotCQkJCWZUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCQkJfQotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQl9Ci0KLQlCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tcG9zaXRlIGNvbnRyb2wgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCWZEZWZhdWx0Rm9yZWdyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCk7Ci0JCWZEZWZhdWx0QmFja2dyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLkRURF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhwYWdlQ29tcG9uZW50LCBTV1QuV1JBUCk7Ci0JCWxpbmsuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nX0xpbmspOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24ocGFyZW50LmdldFNoZWxsKCksIGUudGV4dCwgbnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyaWREYXRhIGxpbmtEYXRhPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGlua0RhdGEud2lkdGhIaW50PSAxNTA7IC8vIG9ubHkgZXhwYW5kIGZ1cnRoZXIgaWYgYW55b25lIGVsc2UgcmVxdWlyZXMgaXQKLQkJbGluay5zZXRMYXlvdXREYXRhKGxpbmtEYXRhKTsKLQotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCVNhc2hGb3JtIGVkaXRvciA9IG5ldyBTYXNoRm9ybShwYWdlQ29tcG9uZW50LCBTV1QuVkVSVElDQUwpOwotCQlHcmlkRGF0YSBncmlkRGF0YTIgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEyLmhvcml6b250YWxTcGFuID0gMjsKLQkJZWRpdG9yLnNldExheW91dERhdGEoZ3JpZERhdGEyKTsKLQkJU2FzaEZvcm0gdG9wID0gbmV3IFNhc2hGb3JtKGVkaXRvciwgU1dULkhPUklaT05UQUwpOwotCQlDb21wb3NpdGUgc3R5bGVFZGl0b3IgPSBjcmVhdGVDb21wb3NpdGUodG9wLCAxKTsKLQkJKChHcmlkTGF5b3V0KSBzdHlsZUVkaXRvci5nZXRMYXlvdXQoKSkubWFyZ2luUmlnaHQgPSA1OwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gMDsKLQkJY3JlYXRlTGFiZWwoc3R5bGVFZGl0b3IsIERURFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzApOwotCQlmU3R5bGVzVmlld2VyID0gY3JlYXRlU3R5bGVzVmlld2VyKHN0eWxlRWRpdG9yKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBNYXRoLm1heChncmlkRGF0YS53aWR0aEhpbnQsIGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhpdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKS5sZW5ndGgoKSkpOwotCQl9Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQlmU3R5bGVzVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlDb21wb3NpdGUgZWRpdGluZ0NvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b3AsIDEpOwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gNTsKLQkJY3JlYXRlTGFiZWwoZWRpdGluZ0NvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1dHRvbiBlbmFibGVyID0gY3JlYXRlQ2hlY2tib3goZWRpdGluZ0NvbXBvc2l0ZSwgRFREVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMik7Ci0JCWVuYWJsZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVuYWJsZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQlDb21wb3NpdGUgZWRpdENvbnRyb2xzID0gY3JlYXRlQ29tcG9zaXRlKGVkaXRpbmdDb21wb3NpdGUsIDIpOwotCQkoKEdyaWRMYXlvdXQpIGVkaXRDb250cm9scy5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDIwOwotCi0JCWZGb3JlZ3JvdW5kTGFiZWwgPSBjcmVhdGVMYWJlbChlZGl0Q29udHJvbHMsIFNTRVVJTWVzc2FnZXMuRm9yZWdyb3VuZF9VSV8pOwotCQkoKEdyaWREYXRhKSBmRm9yZWdyb3VuZExhYmVsLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JTZWxlY3RvcihlZGl0Q29udHJvbHMpOwotCQlCdXR0b24gZkZvcmVncm91bmRDb2xvciA9IGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlmRm9yZWdyb3VuZENvbG9yLnNldExheW91dERhdGEoZ2QpOwotCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCYWNrZ3JvdW5kTGFiZWwgPSBjcmVhdGVMYWJlbChlZGl0Q29udHJvbHMsIFNTRVVJTWVzc2FnZXMuQmFja2dyb3VuZF9VSV8pOwotCQkoKEdyaWREYXRhKSBmQmFja2dyb3VuZExhYmVsLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JTZWxlY3RvcihlZGl0Q29udHJvbHMpOwotCQlCdXR0b24gZkJhY2tncm91bmRDb2xvciA9IGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlmQmFja2dyb3VuZENvbG9yLnNldExheW91dERhdGEoZ2QpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCb2xkID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBEVERVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV8zKTsKLQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZCb2xkLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmSXRhbGljID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBEVERVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV80KTsKLQkJZkl0YWxpYy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJKChHcmlkRGF0YSkgZkl0YWxpYy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlN0cmlrZSA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgRFREVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfNSk7Ci0JCWZTdHJpa2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZTdHJpa2UuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZVbmRlcmxpbmUgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIERURFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzYpOwotCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmVW5kZXJsaW5lLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmQ2xlYXJTdHlsZSA9IG5ldyBCdXR0b24oZWRpdGluZ0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlmQ2xlYXJTdHlsZS5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuUmVzdG9yZV9EZWZhdWx0X1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiUmVzdG9yZSBEZWZhdWx0IgotCQlmQ2xlYXJTdHlsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HKSk7Ci0JCSgoR3JpZERhdGEpZkNsZWFyU3R5bGUuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCWZDbGVhclN0eWxlLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCUNvbXBvc2l0ZSBzYW1wbGVBcmVhID0gY3JlYXRlQ29tcG9zaXRlKGVkaXRvciwgMSk7Ci0KLQkJKChHcmlkTGF5b3V0KSBzYW1wbGVBcmVhLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gNTsKLQkJKChHcmlkTGF5b3V0KSBzYW1wbGVBcmVhLmdldExheW91dCgpKS5tYXJnaW5Ub3AgPSA1OwotCQljcmVhdGVMYWJlbChzYW1wbGVBcmVhLCBTU0VVSU1lc3NhZ2VzLlNhbXBsZV90ZXh0X19VSV8pOyAvLyROT04tTkxTLTEkID0gIiZTYW1wbGUgdGV4dDoiCi0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBuZXcgU291cmNlVmlld2VyKHNhbXBsZUFyZWEsIG51bGwsIFNXVC5CT1JERVIgfCBTV1QuTEVGVF9UT19SSUdIVCB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5SRUFEX09OTFkpOwotCQlmVGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhMyA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YTMud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDIwKTsKLQkJZ3JpZERhdGEzLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQlncmlkRGF0YTMuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhMyk7Ci0JCWZUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJZlRleHQuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250KCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IikpOy8vJE5PTi1OTFMtMSQKLQkJZlRleHQuYWRkS2V5TGlzdGVuZXIoZ2V0VGV4dEtleUxpc3RlbmVyKCkpOwotCQlmVGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRUZXh0U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZE1vdXNlTGlzdGVuZXIoZ2V0VGV4dE1vdXNlTGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFRyYXZlcnNlTGlzdGVuZXIoZ2V0VHJhdmVyc2VMaXN0ZW5lcigpKTsKLQkJc2V0QWNjZXNzaWJsZShmVGV4dCwgU1NFVUlNZXNzYWdlcy5TYW1wbGVfdGV4dF9fVUlfKTsKLQkJZkRvY3VtZW50ID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoQ29udGVudFR5cGVJZEZvckRURC5Db250ZW50VHlwZUlEX0RURCk7Ci0JCWZEb2N1bWVudC5zZXQoZ2V0RXhhbXBsZVRleHQoKSk7Ci0JCXZpZXdlci5zZXREb2N1bWVudChmRG9jdW1lbnQpOwotCi0JCXRvcC5zZXRXZWlnaHRzKG5ldyBpbnRbXXsxLCAxfSk7Ci0JCWVkaXRvci5zZXRXZWlnaHRzKG5ldyBpbnRbXXsxLCAxfSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLkRURF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlmU3R5bGVzVmlld2VyLnNldElucHV0KGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKSk7Ci0KLQkJYXBwbHlTdHlsZXMoKTsKLQotCQlmU3R5bGVzVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFldmVudC5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQkJCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuYWRkTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhDb2xvclNlbGVjdG9yLlBST1BfQ09MT1JDSEFOR0UpKSB7Ci0JCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMF07Ci0JCQkJCQkvLyBvcGVuIGNvbG9yIGRpYWxvZyB0byBnZXQgbmV3IGNvbG9yCi0JCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBDb2xvckhlbHBlci50b1JHQlN0cmluZyhmRm9yZWdyb3VuZENvbG9yRWRpdG9yLmdldENvbG9yVmFsdWUoKSk7Ci0KLQkJCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJCXN0eWxlUHJlZnNbMF0gPSBuZXdWYWx1ZTsKLQkJCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuYWRkTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhDb2xvclNlbGVjdG9yLlBST1BfQ09MT1JDSEFOR0UpKSB7Ci0JCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMV07Ci0JCQkJCQkvLyBvcGVuIGNvbG9yIGRpYWxvZyB0byBnZXQgbmV3IGNvbG9yCi0JCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBDb2xvckhlbHBlci50b1JHQlN0cmluZyhmQmFja2dyb3VuZENvbG9yRWRpdG9yLmdldENvbG9yVmFsdWUoKSk7Ci0KLQkJCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJCXN0eWxlUHJlZnNbMV0gPSBuZXdWYWx1ZTsKLQkJCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZCb2xkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMl07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZCb2xkLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzJdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZJdGFsaWMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1szXTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZkl0YWxpYy5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1szXSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmU3RyaWtlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbNF07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZTdHJpa2UuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbNF0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZlVuZGVybGluZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzVdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmVW5kZXJsaW5lLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzVdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZkNsZWFyU3R5bGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm47Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKS50b1N0cmluZygpOwotCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFRvRGVmYXVsdChuYW1lZFN0eWxlKTsKLQkJCQlhcHBseVN0eWxlcygpOwotCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gcGFnZUNvbXBvbmVudDsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGFiZWwuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8vIHByb3RlY3RlZCBMYWJlbCBjcmVhdGVEZXNjcmlwdGlvbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYWxsIHRoZSBzdHlsZSBwcmVmZXJlbmNlIGtleXMgaW4gdGhlIG92ZXJsYXkgc3RvcmUKLQkgKi8KLQlwcml2YXRlIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUl0ZXJhdG9yIGkgPSBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgKFN0cmluZykgaS5uZXh0KCkpKTsKLQkJfQotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIExpc3Qgdmlld2VyIHdoZXJlIHdlIHNlZSB0aGUgdmFyaW91cyBzeW50YXggZWxlbWVudCBkaXNwbGF5Ci0JICogbmFtZXMtLXdvdWxkIGl0IGV2ZXIgYmUgYSBUcmVlIGxpa2UgSkRUJ3M/Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgY3JlYXRlU3R5bGVzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RydWN0dXJlZFZpZXdlciBzdHlsZXNWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVzVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKSkpOwotCQlzdHlsZXNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCU9iamVjdCBkZXNjcmlwdGlvbiA9IGZTdHlsZVRvRGVzY3JpcHRpb25NYXAuZ2V0KGVsZW1lbnQpOwotCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJCQlyZXR1cm4gZGVzY3JpcHRpb24udG9TdHJpbmcoKTsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXN0eWxlc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKS50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHN0eWxlc1ZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQlmT3ZlcmxheVN0b3JlLnN0b3AoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihTdHJpbmcgbmFtZWRTdHlsZSkgewotCQlUZXh0QXR0cmlidXRlIHRhID0gbmV3IFRleHRBdHRyaWJ1dGUoZkRlZmF1bHRGb3JlZ3JvdW5kLCBmRGVmYXVsdEJhY2tncm91bmQsIFNXVC5OT1JNQUwpOwotCi0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwgJiYgZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQkvLyBub3RlOiAibmFtZWRTdHlsZSIgKmlzKiB0aGUgcHJlZmVyZW5jZSBrZXkKLQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCi0JCQkJaW50IGZvbnRNb2RpZmllciA9IFNXVC5OT1JNQUw7Ci0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAyKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAzKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1szXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDQpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzRdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiA1KSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1s1XSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXRhID0gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgZm9udE1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGE7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RXhhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV8wOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5hbWVkU3R5bGVBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCS8vIGVuc3VyZSB0aGUgb2Zmc2V0IGlzIGNsZWFuCi0JCWlmIChvZmZzZXQgPj0gZkRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJcmV0dXJuIGdldE5hbWVkU3R5bGVBdE9mZnNldChmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJZWxzZSBpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybiBnZXROYW1lZFN0eWxlQXRPZmZzZXQoMCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBmRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJd2hpbGUgKGRvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgIWRvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCWRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQl9Ci0JCWlmIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBmaW5kIHRoZSBJVGV4dFJlZ2lvbidzIENvbnRleHQgYXQgdGhpcyBvZmZzZXQKLQkJCUlUZXh0UmVnaW9uIGludGVyZXN0ID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChpbnRlcmVzdCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKG9mZnNldCA+IGRvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQoaW50ZXJlc3QpKQotCQkJCXJldHVybiBudWxsOwotCQkJU3RyaW5nIHJlZ2lvbkNvbnRleHQgPSBpbnRlcmVzdC5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uQ29udGV4dCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJLy8gZmluZCB0aGUgbmFtZWQgc3R5bGUgKGludGVybmFsL3NlbGVjdGFibGUgbmFtZSkgZm9yIHRoYXQKLQkJCS8vIGNvbnRleHQKLQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZkNvbnRleHRUb1N0eWxlTWFwLmdldChyZWdpb25Db250ZXh0KTsKLQkJCWlmIChuYW1lZFN0eWxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmFtZWRTdHlsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZ2V0T3ZlcmxheVN0b3JlKCkgewotCQlyZXR1cm4gZk92ZXJsYXlTdG9yZTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpIHsKLQkJaWYgKGZTdHlsZVByZWZlcmVuY2VLZXlzID09IG51bGwpIHsKLQkJCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7IC8vJE5PTi1OTFMtMSQKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxUKTsgLy8kTk9OLU5MUy0xJAotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOyAvLyROT04tTkxTLTEkCi0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HKTsgLy8kTk9OLU5MUy0xJAotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCk7IC8vJE5PTi1OTFMtMSQKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOyAvLyROT04tTkxTLTEkCi0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZTdHlsZVByZWZlcmVuY2VLZXlzID0gc3R5bGVzOwotCQl9Ci0JCXJldHVybiBmU3R5bGVQcmVmZXJlbmNlS2V5czsKLQl9Ci0KLQlwcml2YXRlIEtleUxpc3RlbmVyIGdldFRleHRLZXlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBLZXlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJaW50IHggPSAoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5nZXRDYXJldE9mZnNldCgpOwotCQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KHgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJaW50IHggPSAoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5nZXRDYXJldE9mZnNldCgpOwotCQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KHgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1vdXNlTGlzdGVuZXIgZ2V0VGV4dE1vdXNlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW91c2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBnZXRUZXh0U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoZS54KTsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCSgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLnNldFNlbGVjdGlvbihlLngpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoZS54KTsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCSgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLnNldFNlbGVjdGlvbihlLngpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyYXZlcnNlTGlzdGVuZXIgZ2V0VHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lciNrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJaWYgKChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX05FWFQpIHx8IChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTKSkKLQkJCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJc2V0RGVzY3JpcHRpb24oU1NFVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ19EZXNjcmlwdGlvbik7Ci0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJaW5pdFN0eWxlVG9EZXNjcmlwdGlvbk1hcCgpOwotCQlpbml0UmVnaW9uQ29udGV4dFRvU3R5bGVNYXAoKTsKLQotCQlmT3ZlcmxheVN0b3JlID0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUoZ2V0UHJlZmVyZW5jZVN0b3JlKCksIGNyZWF0ZU92ZXJsYXlTdG9yZUtleXMoKSk7Ci0JCWZPdmVybGF5U3RvcmUubG9hZCgpOwotCQlmT3ZlcmxheVN0b3JlLnN0YXJ0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRSZWdpb25Db250ZXh0VG9TdHlsZU1hcCgpIHsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT05URU5UX0VNUFRZLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTlRFTlRfQU5ZLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5BTUUsIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRZX1BBUk0sIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRywgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRywgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUiwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUsIElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlNUQVJUX1RBRywgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVORF9UQUcsIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTiwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT01NRU5UX0NPTlRFTlQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkcpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5TWVNURU1fS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5QVUJMSUNfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5OREFUQV9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNEQVRBX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuSURfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5JRFJFRl9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLklEUkVGU19LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVOVElUWV9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVOVElUSUVTX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk1UT0tFTl9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5NVE9LRU5TX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5SRVFVSVJFRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLklNUExJRURfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5GSVhFRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0U3R5bGVUb0Rlc2NyaXB0aW9uTWFwKCkgewotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzEpOyAvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfMik7IC8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxULCBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV8zKTsgLy8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzQpOyAvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HLCBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV81KTsgLy8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNik7IC8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzcpOyAvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfOCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlnZXRPdmVybGF5U3RvcmUoKS5sb2FkRGVmYXVsdHMoKTsKLQkJYXBwbHlTdHlsZXMoKTsKLQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCWFjdGl2YXRlKG51bGwpOwotCQlmVGV4dC5yZWRyYXcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWdldE92ZXJsYXlTdG9yZSgpLnByb3BhZ2F0ZSgpOwotCi0JCURURFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0Q29sb3JBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyBuYW1lZFN0eWxlID0gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KG9mZnNldCk7Ci0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwpIHsKLQkJCWZTdHlsZXNWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5hbWVkU3R5bGUpKTsKLQkJCWZTdHlsZXNWaWV3ZXIucmV2ZWFsKG5hbWVkU3R5bGUpOwotCQl9Ci0JCWVsc2UgewotCQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCX0KLQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lmaWNhbGx5IHNldCB0aGUgcmVwb3J0aW5nIG5hbWUgb2YgYSBjb250cm9sIGZvciBhY2Nlc3NpYmlsaXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFjY2Vzc2libGUoQ29udHJvbCBjb250cm9sLCBTdHJpbmcgbmFtZSkgewotCQlpZiAoY29udHJvbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmaW5hbCBTdHJpbmcgbiA9IG5hbWU7Ci0JCWNvbnRyb2wuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKQotCQkJCQllLnJlc3VsdCA9IG47Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWZmZDc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSBmb3IgRFREIHRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRFREVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UgewotCi0JY2xhc3MgRFRERWRpdFRlbXBsYXRlRGlhbG9nIGV4dGVuZHMgRWRpdFRlbXBsYXRlRGlhbG9nIHsKLQkJcHVibGljIERUREVkaXRUZW1wbGF0ZURpYWxvZyhTaGVsbCBwYXJlbnQsIFRlbXBsYXRlIHRlbXBsYXRlLCBib29sZWFuIGVkaXQsIGJvb2xlYW4gaXNOYW1lTW9kaWZpYWJsZSwgQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSkgewotCQkJc3VwZXIocGFyZW50LCB0ZW1wbGF0ZSwgZWRpdCwgaXNOYW1lTW9kaWZpYWJsZSwgcmVnaXN0cnkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFREKCk7Ci0KLQkJCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBJQ29udGVudEFzc2lzdGFudCBnZXRDb250ZW50QXNzaXN0YW50KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJCUNvbnRlbnRBc3Npc3RhbnQgYXNzaXN0YW50ID0gbmV3IENvbnRlbnRBc3Npc3RhbnQoKTsKLQkJCQkJYXNzaXN0YW50LmVuYWJsZUF1dG9BY3RpdmF0aW9uKHRydWUpOwotCQkJCQlhc3Npc3RhbnQuZW5hYmxlQXV0b0luc2VydCh0cnVlKTsKLQkJCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoZ2V0VGVtcGxhdGVQcm9jZXNzb3IoKSwgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFKTsKLQkJCQkJcmV0dXJuIGFzc2lzdGFudDsKLQkJCQl9Ci0JCQl9OwotCQkJcmV0dXJuIGRvQ3JlYXRlVmlld2VyKHBhcmVudCwgc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRFREVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSgpIHsKLQkJRFREVUlQbHVnaW4gZHRkVUlQbHVnaW4gPSBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQkJc2V0UHJlZmVyZW5jZVN0b3JlKGR0ZFVJUGx1Z2luLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJc2V0VGVtcGxhdGVTdG9yZShkdGRVSVBsdWdpbi5nZXRUZW1wbGF0ZVN0b3JlKCkpOwotCQlzZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KGR0ZFVJUGx1Z2luLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gb2s7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlI2lzU2hvd0Zvcm1hdHRlclNldHRpbmcoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU2hvd0Zvcm1hdHRlclNldHRpbmcoKSB7Ci0JCS8vIHRlbXBsYXRlIGZvcm1hdHRpbmcgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVDb250ZW50cyhhbmNlc3Rvcik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSUhlbHBDb250ZXh0SWRzLkRURF9QUkVGV0VCWF9URU1QTEFURVNfSEVMUElEKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlI2NyZWF0ZVZpZXdlcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGJhc2VDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURCgpOwotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBkb0NyZWF0ZVZpZXdlcihwYXJlbnQsIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCX0KLQotCVNvdXJjZVZpZXdlciBkb0NyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHZpZXdlckNvbmZpZ3VyYXRpb24pIHsKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG51bGw7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlEID0gQ29udGVudFR5cGVJZEZvckRURC5Db250ZW50VHlwZUlEX0RURDsKLQkJdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQl2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHNjcmF0Y2hNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKGNvbnRlbnRUeXBlSUQpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUodmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZWRpdCBkaWFsb2cuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUKLQkgKiBhIGN1c3RvbSBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlCi0JICogICAgICAgICAgICB0aGUgdGVtcGxhdGUgYmVpbmcgZWRpdGVkCi0JICogQHBhcmFtIGVkaXQKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGRpYWxvZyBzaG91bGQgYmUgZWRpdGFibGUKLQkgKiBAcGFyYW0gaXNOYW1lTW9kaWZpYWJsZQotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgdGVtcGxhdGUgbmFtZSBtYXkgYmUgbW9kaWZpZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIG9yIG1vZGlmaWVkIHRlbXBsYXRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIGVkaXRpb24gZmFpbGVkCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCBUZW1wbGF0ZSBlZGl0VGVtcGxhdGUoVGVtcGxhdGUgdGVtcGxhdGUsIGJvb2xlYW4gZWRpdCwgYm9vbGVhbiBpc05hbWVNb2RpZmlhYmxlKSB7Ci0JCUVkaXRUZW1wbGF0ZURpYWxvZyBkaWFsb2cgPSBuZXcgRFRERWRpdFRlbXBsYXRlRGlhbG9nKGdldFNoZWxsKCksIHRlbXBsYXRlLCBlZGl0LCBpc05hbWVNb2RpZmlhYmxlLCBnZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KCkpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiBkaWFsb2cuZ2V0VGVtcGxhdGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjZmMmM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0RURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIERURCBVSSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgRFREVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlDb2xvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRUaGVtZU1hbmFnZXIoKS5nZXRDdXJyZW50VGhlbWUoKS5nZXRDb2xvclJlZ2lzdHJ5KCk7Ci0JCQotCQkvLyBEVEQgU3R5bGUgUHJlZmVyZW5jZXMKLQkJU3RyaW5nIE5PQkFDS0dST1VOREJPTEQgPSAiIHwgbnVsbCB8IGZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgSlVTVElUQUxJQyA9ICIgfCBudWxsIHwgZmFsc2UgfCB0cnVlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0RURC5EVERfREVGQVVMVCwgMCwgMCwgMCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREVGQVVMVCwgc3R5bGVWYWx1ZSk7IC8vIGJsYWNrCi0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHLCA2MywgNjMsIDE5MSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHLCBzdHlsZVZhbHVlKTsgLy8gYmx1ZQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FLCA2MywgNjMsIDE5MSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSwgc3R5bGVWYWx1ZSk7IC8vIGJsdWUKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5ULCAxMjcsIDEyNywgMTI3KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5ULCBzdHlsZVZhbHVlKTsgLy8gZ3JleQotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQsIDEyOCwgMCwgMCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCwgc3R5bGVWYWx1ZSk7IC8vIGRhcmsKLQkJLy8gcmVkCi0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HLCA2MywgMTU5LCA5NSkgKyBKVVNUSVRBTElDOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HLCBzdHlsZVZhbHVlKTsgLy8gZ3JlZW4KLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBLCAxOTEsIDk1LCA5NSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSwgc3R5bGVWYWx1ZSk7IC8vIGxpZ2h0Ci0JCS8vIHJlZAotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCwgMTI4LCAwLCAwKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wsIHN0eWxlVmFsdWUpOyAvLyBkYXJrCi0JCS8vIHJlZAotCi0JCS8vIHNldCBkZWZhdWx0IG5ldyB4bWwgZmlsZSB0ZW1wbGF0ZSB0byB1c2UgaW4gbmV3IGZpbGUgd2l6YXJkCi0JCS8qCi0JCSAqIE5lZWQgdG8gZmluZCB0ZW1wbGF0ZSBuYW1lIHRoYXQgZ29lcyB3aXRoIGRlZmF1bHQgdGVtcGxhdGUgaWQgKG5hbWUKLQkJICogbWF5IGNoYW5nZSBmb3IgZGlmZmVybnQgbGFuZ3VhZ2UpCi0JCSAqLwotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpLmZpbmRUZW1wbGF0ZUJ5SWQoIm9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpCi0JCQl0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoRFREVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREVUlQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERVSVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2YyZjcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERVSVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIFByZWZlcmVuY2Uga2V5cyBmb3IgRFREIFVJCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERVSVByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBEVERVSVByZWZlcmVuY2VOYW1lcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBpbnN0YW5jZQotCX0KLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIGN1c3RvbWl6ZWQgdGVtcGxhdGVzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVTX0tFWSA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmN1c3RvbV90ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgbGFzdCB0ZW1wbGF0ZSBuYW1lIHVzZWQgaW4gbmV3IERURCBmaWxlIHdpemFyZC4KLQkgKiBUZW1wbGF0ZSBuYW1lIGlzIHN0b3JlZCBpbnN0ZWFkIG9mIHRlbXBsYXRlIGlkIGJlY2F1c2UgdXNlci1jcmVhdGVkCi0JICogdGVtcGxhdGVzIGRvIG5vdCBoYXZlIHRlbXBsYXRlIGlkcy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19GSUxFX1RFTVBMQVRFX05BTUUgPSAibmV3RmlsZVRlbXBsYXRlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL0RUREZvbGRpbmdTdHJhdGVneS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb2plY3Rpb24vRFRERm9sZGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYzA3MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb2plY3Rpb24vRFRERm9sZGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLlVucmVjb2duaXplZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5BYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLlhNTENvbW1lbnRGb2xkaW5nUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLlhNTEVsZW1lbnRGb2xkaW5nUG9zaXRpb247Ci0KLQotLyoqCi0gKiBBIGZvbGRpbmcgc3RyYXRlZ3kgZm9yIERURCBzdHJ1Y3R1cmVkIGRvY3VtZW50cy4KLSAqIFNlZSBBYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nU3RyYXRlZ3kgZm9yIG1vcmUgZGV0YWlscy4KLSAqIAotICogVGhpcyBzdHJhdGVneSBpcyByYXRoZXIgbGFtZSBiZWNhdXNlIHRoZSBEVEQgcGFyc2VyIGRvZXMgbm90Ci0gKiBjcmVhdGUgcmVnaW9ucyBmb3Igc3ludGF4IHN1Y2ggYXMgPFsgXT4gc28gZm9sZGluZyBvbiBpdAotICogY2FuIG5vdCBjdXJyZW50bHkgb2NjdXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERGb2xkaW5nU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nU3RyYXRlZ3kgewotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBmb2xkaW5nIHN0cmF0ZWd5LgotCSAqIEJlIHN1cmUgdG8gc2V0IHRoZSB2aWV3ZXIgYW5kIGRvY3VtZW50IGFmdGVyIGNyZWF0aW9uLgotCSAqLwotCXB1YmxpYyBEVERGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLkFic3RyYWN0Rm9sZGluZ1N0cmF0ZWd5I2NhbGNOZXdGb2xkUG9zaXRpb24ob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb24pCi0JICovCi0JcHJvdGVjdGVkIFBvc2l0aW9uIGNhbGNOZXdGb2xkUG9zaXRpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uKSB7Ci0JCVBvc2l0aW9uIG5ld1BvcyA9IG51bGw7Ci0JCQotCQkvL29ubHkgd2FudCB0byBmb2xkIHJlZ2lvbnMgd2l0aCBhIHZhbGlkIHJhbmdlCi0JCWlmKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSA+PSAwICYmIGluZGV4ZWRSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3RSZWdpb24gPSAoKERURE5vZGUpIGluZGV4ZWRSZWdpb24pLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpOwotCQkJLy9pZiBDb21tZW50IHRoZW4gdXNlIGNvbW1lbnQgZm9sZGluZyBwb3NpdGlvbgotCQkJLy9lbHNlIHVzZSBlbGVtZW50IGZvbGRpbmcgcG9zaXRpb24KLQkJCWlmKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBDb21tZW50KSB7Ci0JCQkJbmV3UG9zID0gbmV3IFhNTENvbW1lbnRGb2xkaW5nUG9zaXRpb24oc3RydWN0UmVnaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmV3UG9zID0gbmV3IFhNTEVsZW1lbnRGb2xkaW5nUG9zaXRpb24oc3RydWN0UmVnaW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UG9zOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLkFic3RyYWN0Rm9sZGluZ1N0cmF0ZWd5I2luZGV4ZWRSZWdpb25WYWxpZFR5cGUob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb24pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5kZXhlZFJlZ2lvblZhbGlkVHlwZShJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24pIHsKLQkJLy9jYW4gb25seSBmb2xkIERURE5vZGVzCi0JCXJldHVybiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIERURE5vZGUgJiYgIShpbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgVW5yZWNvZ25pemVkKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYTIyZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotCi0vKioKLSAqIEBhdXRob3Igbml0aW4KLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JEVEQgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yRFREKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2FkZEFkYXB0ZXJGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZmFjdG9yeVJlZ2lzdHJ5LCAiUHJvZ3JhbSBFcnJvcjogY2xpZW50IGNhbGxlciBtdXN0IGVuc3VyZSBtb2RlbCBoYXMgZmFjdG9yeSByZWdpc3RyeSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSURvY3VtZW50VHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbikgewotCQlyZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JEVEQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZUZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBub3RoaW5nIHRvIGRvLCBzaW5jZSBubyBlbWJlZGRlZCB0eXBlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0RURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0RURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGJkYjVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnN0eWxlOwotCi0vKioKLSAqIENvbnRhaW5zIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHN0eWxlcyB1c2VkIGJ5IExpbmVTdHlsZVByb3ZpZGVyLAotICogQ29sb3JNYW5hZ2VyLCBhbmQgYW55IG90aGVycyB3aG8gbWF5IGJlIGludGVyZXN0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVDb25zdGFudHNEVEQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX0NPTU1FTlQgPSAiZHRkQ29tbWVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIERhdGEgYXJlIHZhcmlhYmxlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9EQVRBID0gImR0ZERhdGEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX0RFRkFVTFQgPSAiZHRkRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGtleXdvcmRzIGFyZSBjb25zdGFudHMgbGlrZSBJTVBMSUVEIG9yIFBDREFUQQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9LRVlXT1JEID0gImR0ZEtleXdvcmQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBzdHJpbmdzIGFyZSBhbnl0aGluZyBpbiBxdW90ZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfU1RSSU5HID0gImR0ZFN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEFsbCB0aGUgcmVtYWluaW5nIHN5bWJvbHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfU1lNQk9MID0gImR0ZFN5bWJvbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHRhZ3MgYXJlICc8JywgJyEnLCBvciAnPicKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfVEFHID0gImR0ZFRhZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHRhZ25hbWVzIGFyZSBsaWtlIEVMRU1FTlQsIEFUVExJU1QsIGV0Yy4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfVEFHTkFNRSA9ICJkdGRUYWdOYW1lIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzYTk0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9yRFREIGV4dGVuZHMgQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyIHsKLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQkvKioKLQkJICogYSBtZXRob2QgdG8gY2VudHJhbGl6ZSBhbGwgdGhlICJmb3JtYXQgcnVsZXMiIGZvciByZWdpb25zCi0JCSAqIHNwZWNpZmljYWxseSBhc3NvY2lhdGVkIGZvciBob3cgdG8gIm9wZW4iIHRoZSByZWdpb24uCi0JCSAqLwotCQkvLyBub3Qgc3VyZSB3aHkgdGhpcyBpcyBjb21pbmcgdGhyb3VnaCBudWxsLCBidXQganVzdCB0byBjYXRjaCBpdAotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxUKTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTlRFTlRfRU1QVFkgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT05URU5UX0FOWSB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRyB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRykgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5OREFUQV9WQUxVRSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuU1RBUlRfVEFHIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5EX1RBRyB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX0NPTlRFTlQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5TWVNURU1fS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLlBVQkxJQ19LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTkRBVEFfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkNEQVRBX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5JRF9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuSURSRUZfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLklEUkVGU19LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVElFU19LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk1UT0tFTl9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5SRVFVSVJFRF9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRklYRURfS0VZV09SRCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTkFNRSB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9QQVJNKSB7Ci0JCQkvLyBpZiAocmVnaW9uIGluc3RhbmNlb2YgRFREUmVnaW9uKSB7Ci0JCQkvLyBEVERSZWdpb24gZHRkUmVnaW9uID0gKERURFJlZ2lvbikgcmVnaW9uOwotCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGR0ZFJlZ2lvbi5nZXRQYXJlbnQoKTsKLQkJCS8vIFN0cmluZyByZWdpb25UZXh0ID0gZmxhdE5vZGUuZ2V0VGV4dChkdGRSZWdpb24pOwotCQkJLy8gaWYgKHJlZ2lvblRleHQuZXF1YWxzKCJBTlkiKSB8fCByZWdpb25UZXh0LmVxdWFscygiRU1QVFkiKSkgewotCQkJLy8gcmV0dXJuIG5ldyBUZXh0QXR0cmlidXRlKERURENvbG9ycy5EVERfS0VZV09SRCk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCX0KLQotCQkvLyBkZWZhdWx0LCByZXR1cm4gbnVsbCB0byBzaWduYWwgIm5vdCBoYW5kbGVkIgotCQkvLyBpbiB3aGljaCBjYXNlLCBvdGhlciBmYWN0b3JpZXMgc2hvdWxkIGJlIHRyaWVkCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCi0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkvLyBjaGVjayBpZiBwcmVmZXJlbmNlIGNoYW5nZWQgaXMgYSBzdHlsZSBwcmVmZXJlbmNlCi0JCQlpZiAoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxUOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRzsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkc7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEE7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIG92ZXJ3cml0ZSBzdHlsZSBwcmVmZXJlbmNlIHdpdGggbmV3IHZhbHVlCi0JCQlhZGRUZXh0QXR0cmlidXRlKHN0eWxlS2V5KTsKLQkJCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRDb2xvcnMoKSB7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxUKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkcpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckRURFN1YlNldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRFREU3ViU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMjViN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRFREU3ViU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudGV4dC5JRFREUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JEVERTdWJTZXQgZXh0ZW5kcyBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyIGltcGxlbWVudHMgTGluZVN0eWxlUHJvdmlkZXIgewotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBmSW50ZXJuYWxNb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlckZvckRURCBmSW50ZXJuYWxQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHlsZVJhbmdlW10gZkludGVybmFsUmFuZ2VzOwotCXByaXZhdGUgU3RyaW5nIGZQYXJ0aXRpb25pbmcgPSBudWxsOwotCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyRm9yRFREU3ViU2V0KCkgewotCQlzdXBlcigpOwotCQlmSW50ZXJuYWxQcm92aWRlciA9IG5ldyBMaW5lU3R5bGVQcm92aWRlckZvckRURCgpOwotCQlmSW50ZXJuYWxSYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVswXTsKLQkJZlBhcnRpdGlvbmluZyA9IElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkc7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gbGluZVJlcXVlc3RTdGFydAotCSAqIEBwYXJhbSBsaW5lUmVxdWVzdExlbmd0aAotCSAqIEBwYXJhbSBob2xkUmVzdWx0cwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTdHlsZVJhbmdlcyhpbnQgbGluZVJlcXVlc3RTdGFydCwgaW50IGxpbmVSZXF1ZXN0TGVuZ3RoLCBDb2xsZWN0aW9uIGhvbGRSZXN1bHRzLCBpbnQgYWRqdXN0bWVudCkgewotCQlpbnQgbGluZVJlcXVlc3RFbmQgPSBsaW5lUmVxdWVzdFN0YXJ0ICsgbGluZVJlcXVlc3RMZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkludGVybmFsUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgYWRqdXN0ZWRTdHlsZVJhbmdlU3RhcnQgPSBhZGp1c3RtZW50ICsgZkludGVybmFsUmFuZ2VzW2ldLnN0YXJ0OwotCQkJaW50IGFkanVzdGVkU3R5bGVSYW5nZUVuZCA9IGFkanVzdGVkU3R5bGVSYW5nZVN0YXJ0ICsgZkludGVybmFsUmFuZ2VzW2ldLmxlbmd0aDsKLQkJCWlmIChhZGp1c3RlZFN0eWxlUmFuZ2VFbmQgPCBsaW5lUmVxdWVzdFN0YXJ0IHx8IGxpbmVSZXF1ZXN0RW5kIDwgYWRqdXN0ZWRTdHlsZVJhbmdlU3RhcnQpCi0JCQkJY29udGludWU7Ci0JCQlpbnQgZW5kID0gTWF0aC5taW4oYWRqdXN0ZWRTdHlsZVJhbmdlRW5kLCBsaW5lUmVxdWVzdEVuZCk7Ci0JCQlTdHlsZVJhbmdlIHJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJCXJhbmdlLnN0YXJ0ID0gTWF0aC5tYXgoYWRqdXN0ZWRTdHlsZVJhbmdlU3RhcnQsIGxpbmVSZXF1ZXN0U3RhcnQpOwotCQkJcmFuZ2UubGVuZ3RoID0gZW5kIC0gcmFuZ2Uuc3RhcnQ7Ci0JCQlyYW5nZS5mb250U3R5bGUgPSBmSW50ZXJuYWxSYW5nZXNbaV0uZm9udFN0eWxlOwotCQkJcmFuZ2UuZm9yZWdyb3VuZCA9IGZJbnRlcm5hbFJhbmdlc1tpXS5mb3JlZ3JvdW5kOwotCQkJcmFuZ2UuYmFja2dyb3VuZCA9IGZJbnRlcm5hbFJhbmdlc1tpXS5iYWNrZ3JvdW5kOwotCQkJaG9sZFJlc3VsdHMuYWRkKHJhbmdlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBudWxsOwotCi0JCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0Q29sb3JQcmVmZXJlbmNlcygpLmdldFN0cmluZyhJU3R5bGVDb25zdGFudHNEVEQuRFREX0RFRkFVTFQpOwotCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCVJHQiBiYWNrZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1sxXSk7Ci0JCQlib29sZWFuIGJvbGQgPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgYmFja2dyb3VuZCwgYm9sZCk7Ci0JCX0KLQkJcmV0dXJuIHRhOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRJbnRlcm5hbERvY3VtZW50KCkgewotCQlpZiAoZkludGVybmFsTW9kZWwgPT0gbnVsbCkgewotCQkJZkludGVybmFsTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREKTsKLQkJfQotCQlyZXR1cm4gZkludGVybmFsTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWQuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciNwcmVwYXJlUmVnaW9ucyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbiwKLQkgKiAgICAgIGludCwgaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcmVwYXJlUmVnaW9ucyhJVHlwZWRSZWdpb24gdHlwZWRSZWdpb24sIGludCBsaW5lUmVxdWVzdFN0YXJ0LCBpbnQgbGluZVJlcXVlc3RMZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJaWYgKCFJRFREUGFydGl0aW9ucy5EVERfREVGQVVMVC5lcXVhbHModHlwZWRSZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJLy8gY29tcHV0ZSBhbiBpbnRlcm5hbCBEVEQgbW9kZWwgYW5kIHJldHVybiBsaW5lc3R5bGVzIGZvciBpdAotCQkJSVRleHRSZWdpb24gZHRkQ29udGVudFJlZ2lvbiA9IG51bGw7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3R5cGUgPSBmRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQodHlwZWRSZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJaWYgKGRvY3R5cGUgIT0gbnVsbCkKLQkJCQlkdGRDb250ZW50UmVnaW9uID0gZG9jdHlwZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCh0eXBlZFJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQlTdHJpbmcgY29udGVudHMgPSBkdGRDb250ZW50UmVnaW9uICE9IG51bGwgPyBkb2N0eXBlLmdldEZ1bGxUZXh0KGR0ZENvbnRlbnRSZWdpb24pIDogbnVsbDsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRJbnRlcm5hbERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCXVwZGF0ZVN0eWxlUmFuZ2VzKGRvY3VtZW50LCBjb250ZW50cyk7Ci0KLQkJCWFkZFN0eWxlUmFuZ2VzKGxpbmVSZXF1ZXN0U3RhcnQsIGxpbmVSZXF1ZXN0TGVuZ3RoLCBob2xkUmVzdWx0cywgZG9jdHlwZS5nZXRTdGFydE9mZnNldChkdGRDb250ZW50UmVnaW9uKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCQlpZiAoZkludGVybmFsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJZkludGVybmFsUHJvdmlkZXIucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0eWxlUmFuZ2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBjb250ZW50cykgewotCQlpZiAoIWRvY3VtZW50LmdldCgpLmVxdWFscyhjb250ZW50cykpIHsKLQkJCWRvY3VtZW50LnNldChjb250ZW50cyk7Ci0JCQl0cnkgewotCQkJCUlUeXBlZFJlZ2lvbiByZWdpb25zW10gPSBUZXh0VXRpbGl0aWVzLmNvbXB1dGVQYXJ0aXRpb25pbmcoZ2V0SW50ZXJuYWxEb2N1bWVudCgpLCBmUGFydGl0aW9uaW5nLCAwLCBkb2N1bWVudC5nZXRMZW5ndGgoKSwgZmFsc2UpOwotCQkJCUxpc3QgcmFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZJbnRlcm5hbFByb3ZpZGVyLmluaXQoZ2V0SW50ZXJuYWxEb2N1bWVudCgpLCBmUmVjSGlnaGxpZ2h0ZXIpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlmSW50ZXJuYWxQcm92aWRlci5wcmVwYXJlUmVnaW9ucyhyZWdpb25zW2ldLCByZWdpb25zW2ldLmdldE9mZnNldCgpLCByZWdpb25zW2ldLmdldExlbmd0aCgpLCByYW5nZXMpOwotCQkJCX0KLQkJCQlmSW50ZXJuYWxSYW5nZXMgPSAoU3R5bGVSYW5nZVtdKSByYW5nZXMudG9BcnJheShuZXcgU3R5bGVSYW5nZVswXSk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWZJbnRlcm5hbFJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzBdOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlmSW50ZXJuYWxQcm92aWRlci5sb2FkQ29sb3JzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzZDU5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyLCBTVEFSIC0gYWRkZWQgRW5jb2RpbmcgQ29udGVudCBSZXNvbHZlciwgYnVnIDE2MjMyMQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhNTDsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBEVEQgdGVtcGxhdGUgY29udGV4dCB0eXBlcy4gVGVtcGxhdGVzIG9mIHRoaXMgY29udGV4dCB0eXBlCi0gKiBhcHBseSB0byBhbnkgcGxhY2Ugd2l0aGluIERURCBjb250ZW50IHR5cGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUNvbnRleHRUeXBlRFREIGV4dGVuZHMgVGVtcGxhdGVDb250ZXh0VHlwZSB7Ci0KLQlwdWJsaWMgVGVtcGxhdGVDb250ZXh0VHlwZURURCgpIHsKLQkJc3VwZXIoKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkN1cnNvcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRhdGUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Eb2xsYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5MaW5lU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVGltZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlVzZXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Xb3JkU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuWWVhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWE1MKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc0RURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYTRlZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi0KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFREIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVcgPSAiZHRkX25ldyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC90ZXh0L0RURERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC90ZXh0L0RURERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNmOWE2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdGV4dC9EVEREb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRleHQuRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcjsKLQotCi1wdWJsaWMgY2xhc3MgRFRERG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciBleHRlbmRzIERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkQ29udGV4dHMKLQkgKiBAcGFyYW0gbmV4dE1hdGNoZXIKLQkgKi8KLQlwdWJsaWMgRFRERG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcigpIHsKLQkJc3VwZXIobmV3IFN0cmluZ1tde0RURFJlZ2lvblR5cGVzLlNUQVJUX1RBRywgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVH0sIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEF0dHJpYnV0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkQXR0cmlidXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOTRiYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkQXR0cmlidXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgQWRkQXR0cmlidXRlQWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0KLQlwdWJsaWMgQWRkQXR0cmlidXRlQWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gIk5ld0F0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNlbGVjdGVkTm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCSgoQXR0cmlidXRlTGlzdCkgc2VsZWN0ZWROb2RlKS5hZGRBdHRyaWJ1dGUobmV3TmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWROb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJKChFbGVtZW50KSBzZWxlY3RlZE5vZGUpLmFkZEF0dHJpYnV0ZShuZXdOYW1lKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYm9vbGVhbiByYyA9IHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlEVEROb2RlIG5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZChzZWxlY3Rpb24pOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiYXR0cmlidXRlIHNldCB0byB0cnVlIik7Ci0JCQlzZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhdHRyaWJ1dGUgc2V0IHRvIGZhbHNlIik7Ci0JCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCXJldHVybiByYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjYzVhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRBdHRyaWJ1dGVMaXN0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRBdHRyaWJ1dGVMaXN0QWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCURUREZpbGUgZHRkRmlsZSA9IGdldE1vZGVsKCkuZ2V0RFRERmlsZSgpOwotCQlTdHJpbmcgYXR0TGlzdE5hbWUgPSAiTmV3QXR0TGlzdCI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNlbGVjdGVkTm9kZSAhPSBudWxsKSB7Ci0JCQlEVEROb2RlIHRvcExldmVsTm9kZSA9IGR0ZEZpbGUuZ2V0VG9wTGV2ZWxOb2RlQXQoc2VsZWN0ZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaWYgKHRvcExldmVsTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlhdHRMaXN0TmFtZSA9ICgoRWxlbWVudCkgdG9wTGV2ZWxOb2RlKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQotCQlnZXRNb2RlbCgpLmdldERUREZpbGUoKS5jcmVhdGVBdHRyaWJ1dGVMaXN0KHNlbGVjdGVkTm9kZSwgYXR0TGlzdE5hbWUsIHRydWUpOwotCQkvLyBuZXdFbGVtZW50LnNldE5hbWUoRFREVW5pcXVlTmFtZUhlbHBlci5nZXRVbmlxdWVFbGVtZW50TmFtZShkdGRGaWxlKSk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRDb21tZW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRDb21tZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZDk2MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkQ29tbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZENvbW1lbnRBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRDb21tZW50QWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCWdldE1vZGVsKCkuZ2V0RFRERmlsZSgpLmNyZWF0ZUNvbW1lbnQoc2VsZWN0ZWROb2RlLCAiTmV3Q29tbWVudCIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkRWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkRWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjAwYTI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLkRURFVuaXF1ZU5hbWVIZWxwZXI7Ci0KLQotcHVibGljIGNsYXNzIEFkZEVsZW1lbnRBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRFbGVtZW50QWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCURUREZpbGUgZHRkRmlsZSA9IGdldE1vZGVsKCkuZ2V0RFRERmlsZSgpOwotCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBEVERVbmlxdWVOYW1lSGVscGVyLmdldFVuaXF1ZUVsZW1lbnROYW1lKGR0ZEZpbGUpOwotCQlkdGRGaWxlLmNyZWF0ZUVsZW1lbnQoc2VsZWN0ZWROb2RlLCBlbGVtZW50TmFtZSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzk4Y2Y5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgbm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkgewotCQkJKChDTUdyb3VwTm9kZSkgbm9kZSkuYWRkQ2hpbGQoKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJKChFbGVtZW50KSBub2RlKS5hZGRDaGlsZCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlib29sZWFuIHJjID0gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCURURE5vZGUgbm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKHNlbGVjdGlvbik7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCXNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkRW50aXR5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRFbnRpdHlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxNjY5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRFbnRpdHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRFbnRpdHlBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRFbnRpdHlBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgc2VsZWN0ZWROb2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoKTsKLQotCQlnZXRNb2RlbCgpLmdldERUREZpbGUoKS5jcmVhdGVFbnRpdHkoc2VsZWN0ZWROb2RlLCAiTmV3RW50aXR5IiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gbmV3RWxlbWVudC5zZXROYW1lKERURFVuaXF1ZU5hbWVIZWxwZXIuZ2V0VW5pcXVlRWxlbWVudE5hbWUoZHRkRmlsZSkpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjZlMWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIG5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZCgpOwotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCSgoQ01Hcm91cE5vZGUpIG5vZGUpLmFkZEdyb3VwKCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCSgoRWxlbWVudCkgbm9kZSkuYWRkR3JvdXAoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZE5vdGF0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGROb3RhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTFmODJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZE5vdGF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZE5vdGF0aW9uQWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0KLQlwdWJsaWMgQWRkTm90YXRpb25BY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgc2VsZWN0ZWROb2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoKTsKLQotCQlnZXRNb2RlbCgpLmdldERUREZpbGUoKS5jcmVhdGVOb3RhdGlvbihzZWxlY3RlZE5vZGUsICJOZXdOb3RhdGlvbiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gbmV3Tm90YXRpb24uc2V0TmFtZShEVERVbmlxdWVOYW1lSGVscGVyLmdldFVuaXF1ZU5vdGF0aW9uTmFtZShkdGRGaWxlKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlYmNlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5MYWJlbFZhbHVlUGFpcjsKLQotCi1wdWJsaWMgY2xhc3MgQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0JcHVibGljIEFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbihEVERNb2RlbEltcGwgbW9kZWwsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihtb2RlbCwgbGFiZWwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3RFeHRlcm5hbFBhcmFtZXRlckVudGl0eShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGFiZWxWYWx1ZVBhaXJbXSBmcmVlRXh0ZXJuYWxFbnRpdGllcyA9IGR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5jcmVhdGVQYXJtRW50aXR5Q29udGVudEl0ZW1zKG51bGwpOwotCi0JCWlmIChmcmVlRXh0ZXJuYWxFbnRpdGllcy5sZW5ndGggPiAwKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZnJlZUV4dGVybmFsRW50aXRpZXNbMF0uZlZhbHVlOwotCQkJLy8gcmV0dXJuIChFbnRpdHkpIGZyZWVFeHRlcm5hbEVudGl0aWVzWzBdLmZWYWx1ZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURUREZpbGUgZHRkRmlsZSA9IGdldE1vZGVsKCkuZ2V0RFRERmlsZSgpOwotCQlTdHJpbmcgZXh0RW50aXR5ID0gZ2V0Rmlyc3RFeHRlcm5hbFBhcmFtZXRlckVudGl0eShkdGRGaWxlKTsKLQkJRFRETm9kZSBzZWxlY3RlZE5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZCgpOwotCQlpZiAoZXh0RW50aXR5ICE9IG51bGwpIHsKLQkJCWR0ZEZpbGUuY3JlYXRlUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHNlbGVjdGVkTm9kZSwgZXh0RW50aXR5LCB0cnVlKTsKLQkJfQotCQllbHNlIHsKLQkJCWR0ZEZpbGUuY3JlYXRlUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHNlbGVjdGVkTm9kZSwgIiVOZXdFbnRpdHlSZWZlcmVuY2U7IiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0Jhc2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0Jhc2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExZTljMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9CYXNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIEJhc2VBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRleHRDb250cmlidXRvcjsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZk1vZGVsOwotCi0JcHVibGljIEJhc2VBY3Rpb24oSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcyhtb2RlbCwgdGV4dCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEJhc2VBY3Rpb24oSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgU3RyaW5nIHRleHQsIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2MpIHsKLQkJc3VwZXIodGV4dCk7Ci0JCWZNb2RlbCA9IG1vZGVsOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRFRETm9kZSBnZXRGaXJzdE5vZGVTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIGdldEZpcnN0Tm9kZVNlbGVjdGVkKGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIERURE5vZGUgZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJLy8gRFRETm9kZSByZWZlcmVuY2VQb2ludCA9IG51bGw7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJCXJldHVybiAoRFRETm9kZSkgZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRFRETW9kZWxJbXBsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gKERURE1vZGVsSW1wbCkgZk1vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRleHRDb250cmlidXRvcihJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IpIHsKLQkJY29udGV4dENvbnRyaWJ1dG9yID0gY29udHJpYnV0b3I7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9EZWxldGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzljMWRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5EVERCYXRjaE5vZGVEZWxldGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBEZWxldGVBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLQlwdWJsaWMgRGVsZXRlQWN0aW9uKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0KLQkJSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQlEVERCYXRjaE5vZGVEZWxldGUgYmF0Y2hEZWxldGUgPSBudWxsOwotCQlEVERGaWxlIGR0ZEZpbGUgPSBudWxsOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgZWxlbWVudDsKLQkJCQlkdGRGaWxlID0gbm9kZS5nZXREVERGaWxlKCk7Ci0JCQkJaWYgKGJhdGNoRGVsZXRlID09IG51bGwpIHsKLQkJCQkJYmF0Y2hEZWxldGUgPSBuZXcgRFREQmF0Y2hOb2RlRGVsZXRlKGR0ZEZpbGUpOwotCQkJCX0KLQkJCQliYXRjaERlbGV0ZS5hZGROb2RlKChEVEROb2RlKSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlkdGRGaWxlLmdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREVUlNZXNzYWdlcy5fVUlfTEFCRUxfRFREX0ZJTEVfREVMRVRFKTsgLy8kTk9OLU5MUy0xJAotCQliYXRjaERlbGV0ZS5kZWxldGVOb2Rlcyh0aGlzKTsKLQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsKSB7Ci0JCWlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBEVEROb2RlICYmICEoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBDTU5vZGUgJiYgKChDTU5vZGUpIHNlbGVjdGVkT2JqZWN0KS5pc1Jvb3RFbGVtZW50Q29udGVudCgpKSkgewotCQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXJldHVybiB0cnVlOyAvLyBlbmFibGUgZGVsZXRlIG1lbnUgaXRlbQotCQl9Ci0JCWVsc2UgewotCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm4gZmFsc2U7IC8vIGRpc2FibGUgaXQgLSBncmV5IG91dAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvUmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9SZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUyMzk2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9SZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLXB1YmxpYyBjbGFzcyBSZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBSZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgbm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJQ01Ob2RlIGNvbnRlbnRNb2RlbCA9ICgoRWxlbWVudCkgbm9kZSkuZ2V0Q29udGVudE1vZGVsKCk7Ci0JCQlpZiAoQ01Ob2RlLkVNUFRZLmVxdWFscyhjb250ZW50TW9kZWwuZ2V0VHlwZSgpKSkgewotCQkJCWdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgZ2V0VGV4dCgpKTsKLQkJCQkoKEVsZW1lbnQpIG5vZGUpLnJlcGxhY2VDb250ZW50TW9kZWwodGhpcywgIigpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYm9vbGVhbiByYyA9IHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlEVEROb2RlIG5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZChzZWxlY3Rpb24pOwotCQlzZXRFbmFibGVkKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KTsKLQkJcmV0dXJuIHJjOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0RURFByb3BlcnR5U291cmNlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL3Byb3BlcnRpZXMvRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOTAyODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL3Byb3BlcnRpZXMvRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3BlcnRpZXMuQ3VzdG9tUHJvcGVydHlEZXNjcmlwdG9yOwotCi0KLS8qKgotICogQW4gSVByb3BlcnR5U291cmNlIGltcGxlbWVudGF0aW9uIGZvciBhIEpGYWNlIHZpZXdlciB1c2VkIHRvIGRpc3BsYXkKLSAqIHByb3BlcnRpZXMgb2YgRE9NIG5vZGVzLiBSZXF1aXJlcyBhbiBhZGFwdGVyIGZhY3RvcnkgdG8gY3JlYXRlIEpGYWNlCi0gKiBhZGFwdGVycyBmb3IgdGhlIG5vZGVzIGluIHRoZSB0cmVlLgotICovCi1wdWJsaWMgY2xhc3MgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyLCBJUHJvcGVydHlTb3VyY2UgewotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX0FUVFJJQlVURVMgPSAiQXR0cmlidXRlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9OQU1FID0gRFREVUlNZXNzYWdlcy5EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMDsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9URVhUID0gRFREVUlNZXNzYWdlcy5EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBmRGVzY3JpcHRvcnMgPSBudWxsOwotCXByb3RlY3RlZCBJTm9kZU5vdGlmaWVyIGZOb2RlID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdGFjayBmVmFsdWVzQmVpbmdTZXQgPSBuZXcgU3RhY2soKTsKLQotCXB1YmxpYyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJZk5vZGUgPSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVByb3BlcnR5RGVzY3JpcHRvcltdIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCUN1c3RvbVByb3BlcnR5RGVzY3JpcHRvciBuYW1lRGVzY3JpcHRvciA9IG5ldyBDdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IoSURfTkFNRSwgSURfTkFNRSwgbnVsbCk7Ci0JCW5hbWVEZXNjcmlwdG9yLnNldENhdGVnb3J5KERURFVJTWVzc2FnZXMuRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzIpOyAvLyROT04tTkxTLTEkCi0JCS8vIEN1c3RvbVByb3BlcnR5RGVzY3JpcHRvciBjb250ZW50RGVzY3JpcHRvciA9IG5ldwotCQkvLyBDdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IoSURfVEVYVCwgSURfVEVYVCwgbnVsbCk7Ci0JCS8vIGNvbnRlbnREZXNjcmlwdG9yLnNldENhdGVnb3J5KCJBdHRyaWJ1dGVzIik7Ci0JCXJldHVybiBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltde25hbWVEZXNjcmlwdG9yfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgdmFsdWUgZm9yIHRoaXMgTm9kZSB0aGF0IGNhbiBiZSBlZGl0dGVkIGluIGEgcHJvcGVydHkgc2hlZXQuCi0JICogCi0JICogQHJldHVybiBhIHZhbHVlIHRoYXQgY2FuIGJlIGVkaXR0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29sbGVjdGlvbiBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCB2YWxpZCBkZXNjcmlwdG9ycy4KLQkgKi8KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChmRGVzY3JpcHRvcnMgPT0gbnVsbCB8fCBmRGVzY3JpcHRvcnMubGVuZ3RoID09IDApIHsKLQkJCWZEZXNjcmlwdG9ycyA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJfQotCQllbHNlIHsKLQkJCXVwZGF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJfQotCQlyZXR1cm4gZkRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpIHsKLQkJT2JqZWN0IHZhbHVlID0gbnVsbDsKLQkJaWYgKGlkLmVxdWFscyhJRF9OQU1FKSAmJiBmTm9kZSBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCXZhbHVlID0gKChEVEROb2RlKSBmTm9kZSkuZ2V0TmFtZSgpOwotCQl9Ci0JCWlmIChpZC5lcXVhbHMoSURfVEVYVCkgJiYgZk5vZGUgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQl2YWx1ZSA9ICgoRFRETm9kZSkgZk5vZGUpLmdldEZ1bGxOb2RlVGV4dCgpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gSVByb3BlcnR5U291cmNlLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjaXNQcm9wZXJ0eVNldChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IGlkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI3Jlc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBuYW1lT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0RURFByb3BlcnR5U291cmNlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0RURFByb3BlcnR5U291cmNlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2MDZiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvcHJvcGVydGllcy9EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotCi0KLXB1YmxpYyBjbGFzcyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoSVByb3BlcnR5U291cmNlLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyRmFjdG9yeShnZXRBZGFwdGVyS2V5KCksIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQkvLyBhdCB0aGUgbW9tZW50LCBvbmx5IG9uZSBpbXBsZW1lbnRhdGlvbiBleGlzdHMKLQkJcmV0dXJuIG5ldyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXIodGFyZ2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC93aXphcmQvTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjY5MDZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC93aXphcmQvTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0RURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLS8qKgotICogVGVtcGxhdGVzIHBhZ2UgaW4gbmV3IGZpbGUgd2l6YXJkLiBBbGxvd3MgdXNlcnMgdG8gc2VsZWN0IGEgbmV3IGZpbGUKLSAqIHRlbXBsYXRlIHRvIGJlIGFwcGxpZWQgaW4gbmV3IGZpbGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIENvbnRlbnQgcHJvdmlkZXIgZm9yIHRlbXBsYXRlcwotCSAqLwotCXByaXZhdGUgY2xhc3MgVGVtcGxhdGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCS8qKiBUaGUgdGVtcGxhdGUgc3RvcmUuICovCi0JCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmU3RvcmU7Ci0KLQkJLyoKLQkJICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWZTdG9yZSA9IG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsKLQkJCXJldHVybiBmU3RvcmUuZ2V0VGVtcGxhdGVzKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNEVEQuTkVXKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJZlN0b3JlID0gKFRlbXBsYXRlU3RvcmUpIG5ld0lucHV0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGFiZWwgcHJvdmlkZXIgZm9yIHRlbXBsYXRlcy4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSAoVGVtcGxhdGUpIGVsZW1lbnQ7Ci0KLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQljYXNlIDAgOgotCQkJCQlyZXR1cm4gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJCWNhc2UgMSA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXREZXNjcmlwdGlvbigpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKiBMYXN0IHNlbGVjdGVkIHRlbXBsYXRlIG5hbWUgKi8KLQlwcml2YXRlIFN0cmluZyBmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lOwotCS8qKiBUaGUgdmlld2VyIGRpc3BsYXlzIHRoZSBwYXR0ZXJuIG9mIHNlbGVjdGVkIHRlbXBsYXRlLiAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGZQYXR0ZXJuVmlld2VyOwotCS8qKiBUaGUgdGFibGUgcHJlc2VudGluZyB0aGUgdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgVGFibGVWaWV3ZXIgZlRhYmxlVmlld2VyOwotCS8qKiBUZW1wbGF0ZSBzdG9yZSB1c2VkIGJ5IHRoaXMgd2l6YXJkIHBhZ2UgKi8KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0JLyoqIENoZWNrYm94IGZvciB1c2luZyB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBCdXR0b24gZlVzZVRlbXBsYXRlQnV0dG9uOwotCi0JcHVibGljIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKCJOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlIiwgRFREVUlNZXNzYWdlcy5OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzAsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKERURFVJTWVzc2FnZXMuTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8xKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3JyZWN0bHkgcmVzaXplcyB0aGUgdGFibGUgc28gbm8gcGhhbnRvbSBjb2x1bW5zIGFwcGVhcgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBidXR0b25zCi0JICogICAgICAgICAgICB0aGUgYnV0dG9ucwotCSAqIEBwYXJhbSB0YWJsZQotCSAqICAgICAgICAgICAgdGhlIHRhYmxlCi0JICogQHBhcmFtIGNvbHVtbjEKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMgotCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMwotCSAqICAgICAgICAgICAgdGhlIHRoaXJkIGNvbHVtbgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmVUYWJsZVJlc2l6aW5nKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFRhYmxlIHRhYmxlLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yKSB7Ci0JCXBhcmVudC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgYXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOwotCQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCkgewotCQkJCQkvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbgotCQkJCQkvLyB3aWR0aAotCQkJCQkvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0JCQkJCVBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0JCQkJCXdpZHRoIC09IHZCYXJTaXplLng7Ci0JCQkJfQotCi0JCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCQlpZiAob2xkU2l6ZS54ID4gd2lkdGgpIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMKLQkJCQkJLy8gc21hbGxlciBmaXJzdCBhbmQgdGhlbiByZXNpemUgdGhlIHRhYmxlIHRvCi0JCQkJCS8vIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBiaWdnZXIgc28gbWFrZSB0aGUgdGFibGUKLQkJCQkJLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJCQkJLy8gdG8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShhbmNlc3RvciwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIGNyZWF0ZSBjaGVja2JveCBmb3IgdXNlciB0byB1c2UgRFREIFRlbXBsYXRlCi0JCWZVc2VUZW1wbGF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0VGV4dChEVERVSU1lc3NhZ2VzLk5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfNCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZW5hYmxlVGVtcGxhdGVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSBjb21wb3NpdGUgZm9yIFRlbXBsYXRlcyB0YWJsZQotCQlDb21wb3NpdGUgaW5uZXJQYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGlubmVyTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaW5uZXJMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWlubmVyTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWlubmVyTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJaW5uZXJQYXJlbnQuc2V0TGF5b3V0KGlubmVyTGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKTsKLQkJaW5uZXJQYXJlbnQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoaW5uZXJQYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChEVERVSU1lc3NhZ2VzLk5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfNyk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlIHRoYXQgZGlzcGxheXMgdGVtcGxhdGVzCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKGlubmVyUGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDIpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDEwKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjEuc2V0VGV4dChEVERVSU1lc3NhZ2VzLk5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMik7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4yLnNldFRleHQoRFREVUlNZXNzYWdlcy5OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzMpOwotCi0JCWZUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRlbXBsYXRlQ29udGVudFByb3ZpZGVyKCkpOwotCi0JCWZUYWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIpIHsKLQkJCQlpZiAoKG9iamVjdDEgaW5zdGFuY2VvZiBUZW1wbGF0ZSkgJiYgKG9iamVjdDIgaW5zdGFuY2VvZiBUZW1wbGF0ZSkpIHsKLQkJCQkJVGVtcGxhdGUgbGVmdCA9IChUZW1wbGF0ZSkgb2JqZWN0MTsKLQkJCQkJVGVtcGxhdGUgcmlnaHQgPSAoVGVtcGxhdGUpIG9iamVjdDI7Ci0JCQkJCWludCByZXN1bHQgPSBsZWZ0LmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldE5hbWUoKSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gMCkKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCXJldHVybiBsZWZ0LmdldERlc2NyaXB0aW9uKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBvYmplY3QxLCBvYmplY3QyKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNTb3J0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOwotCi0JCWZUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJdXBkYXRlVmlld2VySW5wdXQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHZpZXdlciB0aGF0IGRpc3BsYXlzIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZSdzIGNvbnRlbnRzCi0JCWZQYXR0ZXJuVmlld2VyID0gZG9DcmVhdGVWaWV3ZXIocGFyZW50KTsKLQotCQlmVGVtcGxhdGVTdG9yZSA9IERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWZUYWJsZVZpZXdlci5zZXRJbnB1dChmVGVtcGxhdGVTdG9yZSk7Ci0KLQkJLy8gQ3JlYXRlIGxpbmtlZCB0ZXh0IHRvIGp1c3QgdG8gdGVtcGxhdGVzIHByZWZlcmVuY2UgcGFnZQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGluay5zZXRUZXh0KERURFVJTWVzc2FnZXMuTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV82KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlsaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbGlua0NsaWNrZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY29uZmlndXJlVGFibGVSZXNpemluZyhpbm5lclBhcmVudCwgdGFibGUsIGNvbHVtbjEsIGNvbHVtbjIpOwotCQlsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUhlbHBDb250ZXh0SWRzLkRURF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlzZXRDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcywgY29uZmlndXJlcyBhbmQgcmV0dXJucyBhIHNvdXJjZSB2aWV3ZXIgdG8gcHJlc2VudCB0aGUgdGVtcGxhdGUKLQkgKiBwYXR0ZXJuIG9uIHRoZSBwcmVmZXJlbmNlIHBhZ2UuIENsaWVudHMgbWF5IG92ZXJyaWRlIHRvIHByb3ZpZGUgYQotCSAqIGN1c3RvbSBzb3VyY2Ugdmlld2VyIGZlYXR1cmluZyBlLmcuIHN5bnRheCBjb2xvcmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJlZCBzb3VyY2Ugdmlld2VyCi0JICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQoKTsKLQotCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQl9OwotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQl2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHNjcmF0Y2hNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKENvbnRlbnRUeXBlSWRGb3JEVEQuQ29udGVudFR5cGVJRF9EVEQpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUoc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZG9DcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChEVERVSU1lc3NhZ2VzLk5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfNSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJU291cmNlVmlld2VyIHZpZXdlciA9IGNyZWF0ZVZpZXdlcihwYXJlbnQpOwotCQl2aWV3ZXIuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCUNvbnRyb2wgY29udHJvbCA9IHZpZXdlci5nZXRDb250cm9sKCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCS8vIFsyNjEyNzRdIC0gc291cmNlIHZpZXdlciB3YXMgZ3Jvd2luZyB0byBmaXQgdGhlIG1heCBsaW5lIHdpZHRoIG9mIHRoZSB0ZW1wbGF0ZQotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlL2Rpc2FibGUgY29udHJvbHMgaW4gcGFnZSBiYXNlZCBvbiBmVXNlVGVtcGxhdGVCdXR0b24ncyBjdXJyZW50Ci0JICogc3RhdGUuCi0JICovCi0Jdm9pZCBlbmFibGVUZW1wbGF0ZXMoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGZVc2VUZW1wbGF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoIWVuYWJsZWQpIHsKLQkJCS8vIHNhdmUgbGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZQotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJZWxzZQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0U2VsZWN0ZWRUZW1wbGF0ZShmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lKTsKLQkJfQotCi0JCWZUYWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZlBhdHRlcm5WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZW1wbGF0ZSBwcmVmZXJlbmNlIHBhZ2UgaWQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJZCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmR0ZC50ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGUgZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBudWxsOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQl0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiB0ZW1wbGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRlbXBsYXRlIHN0cmluZyB0byBpbnNlcnQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdG8gaW5zZXJ0IG9yIG51bGwgaWYgbm9uZSBpcyB0byBiZSBpbnNlcnRlZAotCSAqLwotCVN0cmluZyBnZXRUZW1wbGF0ZVN0cmluZygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gbnVsbDsKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKS5nZXRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELk5FVyk7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoKTsKLQkJCVRlbXBsYXRlQ29udGV4dCBjb250ZXh0ID0gbmV3IERvY3VtZW50VGVtcGxhdGVDb250ZXh0KGNvbnRleHRUeXBlLCBkb2N1bWVudCwgMCwgMCk7Ci0JCQl0cnkgewotCQkJCVRlbXBsYXRlQnVmZmVyIGJ1ZmZlciA9IGNvbnRleHQuZXZhbHVhdGUodGVtcGxhdGUpOwotCQkJCXRlbXBsYXRlU3RyaW5nID0gYnVmZmVyLmdldFN0cmluZygpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgdGVtcGxhdGUgZm9yIG5ldyBkdGQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRlbXBsYXRlU3RyaW5nOwotCX0KLQotCXZvaWQgbGlua0NsaWNrZWQoKSB7Ci0JCVN0cmluZyBwYWdlSWQgPSBnZXRQcmVmZXJlbmNlUGFnZUlkKCk7Ci0JCVByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBwYWdlSWQsIG5ldyBTdHJpbmdbXXtwYWdlSWR9LCBudWxsKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBOZXcgRFREIEZpbGUgd2l6YXJkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKERURFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUpOwotCQlpZiAodGVtcGxhdGVOYW1lID09IG51bGwgfHwgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lOwotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQllbmFibGVUZW1wbGF0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRlbXBsYXRlIG5hbWUgdXNlZCBmb3IgbmV4dCBjYWxsIHRvIE5ldyBEVEQgRmlsZSB3aXphcmQuCi0JICovCi0Jdm9pZCBzYXZlTGFzdFNhdmVkUHJlZmVyZW5jZXMoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJdGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKERURFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUsIHRlbXBsYXRlTmFtZSk7Ci0JCURURFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgYSB0ZW1wbGF0ZSBpbiB0aGUgdGFibGUgdmlld2VyIGdpdmVuIHRoZSB0ZW1wbGF0ZSBuYW1lLiBJZgotCSAqIHRlbXBsYXRlIG5hbWUgY2Fubm90IGJlIGZvdW5kIG9yIHRlbXBsYXRlTmFtZSBpcyBudWxsLCBqdXN0IHNlbGVjdAotCSAqIGZpcnN0IGl0ZW0gaW4gdGFibGUuIElmIG5vIGl0ZW1zIGluIHRhYmxlIHNlbGVjdCBub3RoaW5nLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZU5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRUZW1wbGF0ZShTdHJpbmcgdGVtcGxhdGVOYW1lKSB7Ci0JCU9iamVjdCB0ZW1wbGF0ZSA9IG51bGw7Ci0KLQkJaWYgKHRlbXBsYXRlTmFtZSAhPSBudWxsICYmIHRlbXBsYXRlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCS8vIHBpY2sgdGhlIGxhc3QgdXNlZCB0ZW1wbGF0ZQotCQkJdGVtcGxhdGUgPSBmVGVtcGxhdGVTdG9yZS5maW5kVGVtcGxhdGUodGVtcGxhdGVOYW1lLCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELk5FVyk7Ci0JCX0KLQotCQkvLyBubyByZWNvcmQgb2YgbGFzdCB1c2VkIHRlbXBsYXRlIHNvIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCWlmICh0ZW1wbGF0ZSA9PSBudWxsKSB7Ci0JCQkvLyBqdXN0IHBpY2sgZmlyc3QgZWxlbWVudAotCQkJdGVtcGxhdGUgPSBmVGFibGVWaWV3ZXIuZ2V0RWxlbWVudEF0KDApOwotCQl9Ci0KLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRlbXBsYXRlKTsKLQkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHBhdHRlcm4gdmlld2VyLgotCSAqLwotCXZvaWQgdXBkYXRlVmlld2VySW5wdXQoKSB7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQodGVtcGxhdGUuZ2V0UGF0dGVybigpKTsKLQkJfQotCQllbHNlIHsKLQkJCWZQYXR0ZXJuVmlld2VyLmdldERvY3VtZW50KCkuc2V0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3dpemFyZC9OZXdEVERXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC93aXphcmQvTmV3RFREV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkN2EzNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3dpemFyZC9OZXdEVERXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLQotcHVibGljIGNsYXNzIE5ld0RURFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCXByaXZhdGUgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSBmTmV3RmlsZVBhZ2U7Ci0JcHJpdmF0ZSBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlIGZOZXdGaWxlVGVtcGxhdGVzUGFnZTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkNvbnRlbnRUeXBlOwotCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIEFkZHMgZGVmYXVsdCBleHRlbnNpb24gdG8gdGhlIGZpbGVuYW1lCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBhZGREZWZhdWx0RXh0ZW5zaW9uKFN0cmluZyBmaWxlbmFtZSkgewotCQlTdHJpbmdCdWZmZXIgbmV3RmlsZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKGZpbGVuYW1lKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBleHQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhEVERDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQotCQluZXdGaWxlTmFtZS5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQluZXdGaWxlTmFtZS5hcHBlbmQoZXh0KTsKLQotCQlyZXR1cm4gbmV3RmlsZU5hbWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29udGVudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldyBmaWxlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gSUNvbnRlbnRUeXBlCi0JICovCi0JSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlpZiAoZkNvbnRlbnRUeXBlID09IG51bGwpCi0JCQlmQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREKTsKLQkJcmV0dXJuIGZDb250ZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbGlzdCBvZiB2YWxpZCBleHRlbnNpb25zIGZvciBEVEQgQ29udGVudCB0eXBlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUxpc3QgZ2V0VmFsaWRFeHRlbnNpb25zKCkgewotCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQl9Ci0JCXJldHVybiBmVmFsaWRFeHRlbnNpb25zOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGFwcGx5TGluZURlbGltaXRlcihJRmlsZSBmaWxlLCBTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFN0cmluZyhQbGF0Zm9ybS5QSV9SVU5USU1FLCBQbGF0Zm9ybS5QUkVGX0xJTkVfU0VQQVJBVE9SLCBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiksIG5ldyBJU2NvcGVDb250ZXh0W10ge25ldyBQcm9qZWN0U2NvcGUoZmlsZS5nZXRQcm9qZWN0KCkpLCBuZXcgSW5zdGFuY2VTY29wZSgpIH0pOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKHRleHQsICJcclxuIiwgIlxuIik7Ci0JCWNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKGNvbnZlcnRlZFRleHQsICJcciIsICJcbiIpOwotCQljb252ZXJ0ZWRUZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZShjb252ZXJ0ZWRUZXh0LCAiXG4iLCBsaW5lRGVsaW1pdGVyKTsKLQkJcmV0dXJuIGNvbnZlcnRlZFRleHQ7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgaWYgZmlsZU5hbWUgaXMgdmFsaWQgbmFtZSBmb3IgY29udGVudCB0eXBlLiBUYWtlcyBiYXNlIGNvbnRlbnQKLQkgKiB0eXBlIGludG8gY29uc2lkZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgZXh0ZW5zaW9uIGlzIHZhbGlkIGZvciB0aGlzIGNvbnRlbnQgdHlwZQotCSAqLwotCWJvb2xlYW4gZXh0ZW5zaW9uVmFsaWRGb3JDb250ZW50VHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCi0JCUlDb250ZW50VHlwZSB0eXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJLy8gdGhlcmUgaXMgY3VycmVudGx5IGFuIGV4dGVuc2lvbgotCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSAhPSAtMSkgewotCQkJLy8gY2hlY2sgd2hhdCBjb250ZW50IHR5cGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggY3VycmVudCBleHRlbnNpb24KLQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihmaWxlTmFtZSk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IHR5cGVzLmxlbmd0aCAmJiAhdmFsaWQpIHsKLQkJCQl2YWxpZCA9IHR5cGVzW2ldLmlzS2luZE9mKHR5cGUpOwotCQkJCSsraTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCQl2YWxpZCA9IHRydWU7IC8vIG5vIGV4dGVuc2lvbiBzbyB2YWxpZAotCQlyZXR1cm4gdmFsaWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlmTmV3RmlsZVBhZ2UgPSBuZXcgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSgiRFREV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSIsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKElERS5jb21wdXRlU2VsZWN0ZWRSZXNvdXJjZXMoZlNlbGVjdGlvbikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRGaWxlTmFtZSgpOwotCQkJCUlQYXRoIGZ1bGxQYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJCQlpZiAoKGZ1bGxQYXRoICE9IG51bGwpICYmIChmdWxsUGF0aC5pc0VtcHR5KCkgPT0gZmFsc2UpICYmIChmaWxlTmFtZSAhPSBudWxsKSkgewotCQkJCQkvLyBjaGVjayB0aGF0IGZpbGVuYW1lIGRvZXMgbm90IGNvbnRhaW4gaW52YWxpZCBleHRlbnNpb24KLQkJCQkJaWYgKCFleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKGZpbGVOYW1lKSkgewotCQkJCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKERURFVJTWVzc2FnZXMuX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0RURCwgZ2V0VmFsaWRFeHRlbnNpb25zKCkudG9TdHJpbmcoKSkpOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCS8vIG5vIGZpbGUgZXh0ZW5zaW9uIHNwZWNpZmllZCBzbyBjaGVjayBhZGRpbmcgZGVmYXVsdAotCQkJCQkvLyBleHRlbnNpb24gZG9lc24ndCBlcXVhbCBhIGZpbGUgdGhhdCBhbHJlYWR5IGV4aXN0cwotCQkJCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PSAtMSkgewotCQkJCQkJU3RyaW5nIG5ld0ZpbGVOYW1lID0gYWRkRGVmYXVsdEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0JCQkJCQlJUGF0aCByZXNvdXJjZVBhdGggPSBmdWxsUGF0aC5hcHBlbmQobmV3RmlsZU5hbWUpOwotCi0JCQkJCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCQkJCUlTdGF0dXMgcmVzdWx0ID0gd29ya3NwYWNlLnZhbGlkYXRlUGF0aChyZXNvdXJjZVBhdGgudG9TdHJpbmcoKSwgSVJlc291cmNlLkZPTERFUik7Ci0JCQkJCQlpZiAoIXJlc3VsdC5pc09LKCkpIHsKLQkJCQkJCQkvLyBwYXRoIGludmFsaWQKLQkJCQkJCQlzZXRFcnJvck1lc3NhZ2UocmVzdWx0LmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoKHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0Rm9sZGVyKHJlc291cmNlUGF0aCkuZXhpc3RzKCkgfHwgd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHJlc291cmNlUGF0aCkuZXhpc3RzKCkpKSB7Ci0JCQkJCQkJc2V0RXJyb3JNZXNzYWdlKERURFVJTWVzc2FnZXMuUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCXJldHVybiBzdXBlci52YWxpZGF0ZVBhZ2UoKTsKLQkJCX0KLQkJfTsKLQkJZk5ld0ZpbGVQYWdlLnNldFRpdGxlKERURFVJTWVzc2FnZXMuX1VJX0NSRUFURV9ORVdfRFREX0ZJTEUpOwotCQlmTmV3RmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oRFREVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19EVERfRVhQTCk7Ci0KLQkJYWRkUGFnZShmTmV3RmlsZVBhZ2UpOwotCi0JCWZOZXdGaWxlVGVtcGxhdGVzUGFnZSA9IG5ldyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlKCk7Ci0JCWFkZFBhZ2UoZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggYVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCQlmU2VsZWN0aW9uID0gYVNlbGVjdGlvbjsKLQkJc2V0V2luZG93VGl0bGUoRFREVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19EVERfVElUTEUpOyAvLyROT04tTkxTLTEkCi0KLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX1dJWkJBTl9ORVdEVERGSUxFKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5FZGl0b3IoZmluYWwgSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIHRydWUpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcGVyZm9ybWVkT0sgPSBmYWxzZTsKLQotCQkvLyBzYXZlIHVzZXIgb3B0aW9ucyBmb3IgbmV4dCB1c2UKLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlLnNhdmVMYXN0U2F2ZWRQcmVmZXJlbmNlcygpOwotCi0JCS8vIG5vIGZpbGUgZXh0ZW5zaW9uIHNwZWNpZmllZCBzbyBhZGQgZGVmYXVsdCBleHRlbnNpb24KLQkJU3RyaW5nIGZpbGVOYW1lID0gZk5ld0ZpbGVQYWdlLmdldEZpbGVOYW1lKCk7Ci0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpID09IC0xKSB7Ci0JCQlTdHJpbmcgbmV3RmlsZU5hbWUgPSBhZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCWZOZXdGaWxlUGFnZS5zZXRGaWxlTmFtZShuZXdGaWxlTmFtZSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSBuZXcgZW1wdHkgZmlsZQotCQlJRmlsZSBmaWxlID0gZk5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQkvLyBpZiB0aGVyZSB3YXMgcHJvYmxlbSB3aXRoIGNyZWF0aW5nIGZpbGUsIGl0IHdpbGwgYmUgbnVsbCwgc28gbWFrZQotCQkvLyBzdXJlIHRvIGNoZWNrCi0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCS8vIHB1dCB0ZW1wbGF0ZSBjb250ZW50cyBpbnRvIGZpbGUKLQkJCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IGZOZXdGaWxlVGVtcGxhdGVzUGFnZS5nZXRUZW1wbGF0ZVN0cmluZygpOwotCQkJaWYgKHRlbXBsYXRlU3RyaW5nICE9IG51bGwpIHsKLQkJCQl0ZW1wbGF0ZVN0cmluZyA9IGFwcGx5TGluZURlbGltaXRlcihmaWxlLCB0ZW1wbGF0ZVN0cmluZyk7Ci0JCQkJLy8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZyBmb3IgdGhlIG5ldyBmaWxlCi0JCQkJU3RyaW5nIGNoYXJTZXQgPSBnZXRBcHByb3ByaWF0ZUNoYXJzZXQoKTsKLQkJCQkKLQkJCQl0cnkgewotCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0U3RyZWFtV3JpdGVyID0gbnVsbDsKLQkJCQkJaWYgKGNoYXJTZXQgPT0gbnVsbCB8fCBjaGFyU2V0LnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIGp1c3QgdXNlIGRlZmF1bHQgZW5jb2RpbmcKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyU2V0KTsKLQkJCQkJfQotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIud3JpdGUodGVtcGxhdGVTdHJpbmcpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmNsb3NlKCk7Ci0JCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgY29udGVudHMgZm9yIG5ldyBEVEQgZmlsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQkvLyBvcGVuIHRoZSBmaWxlIGluIGVkaXRvcgotCQkJb3BlbkVkaXRvcihmaWxlKTsKLQotCQkJLy8gZXZlcnl0aGluZydzIGZpbmUKLQkJCXBlcmZvcm1lZE9LID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcGVyZm9ybWVkT0s7Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZSBEVEQgcHJlZmVyZW5jZSBpZGVudGlmaWVzIGEgY2hhcnNldCwgdXNlIHRoYXQuIElmIG5vdCwgcmV2ZXJ0IHRvIHRoZSBYTUwKLQkgKiBjaGFyc2V0IHByZWZlcmVuY2UKLQkgKiAKLQkgKiBAcmV0dXJuIGNoYXJzZXQgYmFzZWQgb24gRFREIHByZWZlcmVuY2VzIGlmIGRlZmluZWQsIGlmIG5vdCwgZnJvbSB0aGUgWE1MIHByZWZlcmVuY2VzCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVDaGFyc2V0KCkgewotCQlTdHJpbmcgY2hhcnNldCA9IERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JCWlmKGNoYXJzZXQgPT0gbnVsbCB8fCBjaGFyc2V0LnRyaW0oKS5lcXVhbHMoIiIpKQotCQkJY2hhcnNldCA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQkJcmV0dXJuIGNoYXJzZXQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURENvbnRlbnRPdXRsaW5lQ29tcGFyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURENvbnRlbnRPdXRsaW5lQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFjYTUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERDb250ZW50T3V0bGluZUNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqICAgICANCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkudmlld3MuY29udGVudG91dGxpbmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTU5vZGU7DQotDQotLyoqDQotICogQ29tcGFyYXRvciBmb3IgdGhlIG91dGxpbmUuIEFsbG93cyBzb3J0aW5nIG9mIHJlZ3VsYXIgRFREIGVsZW1lbnRzLCBidXQgbm90DQotICogdGhlaXIgY29udGVudCBtb2RlbHMgc2luY2UgdGhlIG9yZGVyaW5nIHRoZXJlIGlzIGltcG9ydGFudC4NCi0gKi8NCi1jbGFzcyBEVERDb250ZW50T3V0bGluZUNvbXBhcmF0b3IgZXh0ZW5kcyBWaWV3ZXJDb21wYXJhdG9yIHsNCi0NCi0JcHVibGljIERURENvbnRlbnRPdXRsaW5lQ29tcGFyYXRvcigpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7DQotCQlpZiAoZTEgaW5zdGFuY2VvZiBDTU5vZGUgJiYgZTIgaW5zdGFuY2VvZiBDTU5vZGUpDQotCQkJcmV0dXJuIDA7DQotCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7DQotCX0NCi0JDQotCXB1YmxpYyBib29sZWFuIGlzU29ydGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgew0KLQkJcmV0dXJuIHN1cGVyLmlzU29ydGVyUHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyODY5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Mb2NhbFNlbGVjdGlvblRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLkRyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5kbmQuRFRERHJhZ0FuZERyb3BNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogQ29uZmlndXJhdGlvbiBmb3Igb3V0bGluZSB2aWV3IHBhZ2Ugd2hpY2ggc2hvd3MgRFREIGNvbnRlbnQuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERURENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiBleHRlbmRzIENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiB7Ci0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGZDb250ZW50UHJvdmlkZXIgPSBudWxsOwotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBEVERDb250ZXh0TWVudUhlbHBlciBmTWVudUhlbHBlcjsKLQlwcml2YXRlIFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW10gZlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyczsKLQlwcml2YXRlIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyW10gZlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyczsKLQlwcml2YXRlIE1hcCBmVmlld2VyQ29udHJpYnV0aW9uczsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBPVVRMSU5FX09SREVSX1BSRUYgPSAib3V0bGluZS1vcmRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBPVVRMSU5FX1NPUlRfUFJFRiA9ICJvdXRsaW5lLXNvcnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBEVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uCi0JICovCi0JcHVibGljIERURENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbigpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQkJZlZpZXdlckNvbnRyaWJ1dGlvbnMgPSBuZXcgSGFzaE1hcCgyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2NyZWF0ZVRvb2xiYXJDb250cmlidXRpb25zKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBjcmVhdGVUb29sYmFyQ29udHJpYnV0aW9ucyhUcmVlVmlld2VyIHZpZXdlcikgewotCQlBc3NlcnQuaXNUcnVlKGdldENvbnRlbnRQcm92aWRlcih2aWV3ZXIpIGluc3RhbmNlb2YgRFREVHJlZUNvbnRlbnRQcm92aWRlciwgImludmFsaWQgY29udGVudCBwcm92aWRlciBvbiB2aWV3ZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gc3VwZXIuY3JlYXRlVG9vbGJhckNvbnRyaWJ1dGlvbnModmlld2VyKTsKLQotCQlTb3J0QWN0aW9uIHNvcnRBY3Rpb24gPSBuZXcgU29ydEFjdGlvbih2aWV3ZXIsIERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSwgT1VUTElORV9TT1JUX1BSRUYpOwotCQlPcmRlckFjdGlvbiBvcmRlckFjdGlvbiA9IG5ldyBPcmRlckFjdGlvbih2aWV3ZXIsIChEVERUcmVlQ29udGVudFByb3ZpZGVyKSBnZXRDb250ZW50UHJvdmlkZXIodmlld2VyKSwgRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLCBPVVRMSU5FX09SREVSX1BSRUYpOwotCQlJQ29udHJpYnV0aW9uSXRlbSBzb3J0SXRlbSA9IG5ldyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oc29ydEFjdGlvbik7Ci0JCUlDb250cmlidXRpb25JdGVtIG9yZGVySXRlbSA9IG5ldyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0ob3JkZXJBY3Rpb24pOwotCi0JCWlmIChpdGVtcyA9PSBudWxsKSB7Ci0JCQlpdGVtcyA9IG5ldyBJQ29udHJpYnV0aW9uSXRlbVsyXTsKLQkJCWl0ZW1zWzBdID0gc29ydEl0ZW07Ci0JCQlpdGVtc1sxXSA9IG9yZGVySXRlbTsKLQkJfQotCQllbHNlIHsKLQkJCUlDb250cmlidXRpb25JdGVtW10gY29tYmluZWRJdGVtcyA9IG5ldyBJQ29udHJpYnV0aW9uSXRlbVtpdGVtcy5sZW5ndGggKyAyXTsKLQkJCWNvbWJpbmVkSXRlbXNbMF0gPSBzb3J0SXRlbTsKLQkJCWNvbWJpbmVkSXRlbXNbMV0gPSBvcmRlckl0ZW07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGl0ZW1zLCAwLCBjb21iaW5lZEl0ZW1zLCAyLCBpdGVtcy5sZW5ndGgpOwotCQkJaXRlbXMgPSBjb21iaW5lZEl0ZW1zOwotCQl9Ci0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldENvbnRlbnRQcm92aWRlcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmQ29udGVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZDb250ZW50UHJvdmlkZXIgPSBuZXcgRFREVHJlZUNvbnRlbnRQcm92aWRlcigpOwotCQl9Ci0JCS8vIHJldHVybiBzdXBlci5nZXRDb250ZW50UHJvdmlkZXIodmlld2VyKTsKLQkJcmV0dXJuIGZDb250ZW50UHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRMYWJlbFByb3ZpZGVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZkxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkxhYmVsUHJvdmlkZXIgPSBuZXcgRFRETGFiZWxQcm92aWRlcigpOwotCQl9Ci0JCS8vIHJldHVybiBzdXBlci5nZXRMYWJlbFByb3ZpZGVyKHZpZXdlcik7Ci0JCXJldHVybiBmTGFiZWxQcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldE1lbnVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIElNZW51TGlzdGVuZXIgZ2V0TWVudUxpc3RlbmVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCUlNZW51TGlzdGVuZXIgbGlzdGVuZXIgPSBudWxsOwotCQlpZiAoZk1lbnVIZWxwZXIgPT0gbnVsbCAmJiB2aWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIERURE1vZGVsSW1wbCkgewotCQkJZk1lbnVIZWxwZXIgPSBuZXcgRFREQ29udGV4dE1lbnVIZWxwZXIoKERURE1vZGVsSW1wbCkgdmlld2VyLmdldElucHV0KCkpOwotCQkJZk1lbnVIZWxwZXIuY3JlYXRlTWVudUxpc3RlbmVyc0Zvcih2aWV3ZXIpOwotCQl9Ci0JCWlmIChmTWVudUhlbHBlciAhPSBudWxsKSB7Ci0JCQlsaXN0ZW5lciA9IGZNZW51SGVscGVyLmdldE1lbnVMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiBsaXN0ZW5lcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0VHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJbXSBnZXRUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMoZmluYWwgVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCWlmIChmVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWZUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMgPSBuZXcgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJbXXtuZXcgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJCQlMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuc2V0U2VsZWN0aW9uKG51bGwpOwotCQkJCX0KLQkKLQkJCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCQl9Ci0JCi0JCQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJCQlMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuc2V0U2VsZWN0aW9uKHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkKLQkJCQlwdWJsaWMgVHJhbnNmZXIgZ2V0VHJhbnNmZXIoKSB7Ci0JCQkJCXJldHVybiBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCk7Ci0JCQkJfQotCQkJfX07Ci0JCX0KLQkKLQkJcmV0dXJuIGZUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnM7Ci0JfQotCi0JLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnMob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCQkgKi8KLQlwdWJsaWMgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJbXSBnZXRUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnMoZmluYWwgVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCWlmIChmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWZUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnMgPSBuZXcgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJbXXtuZXcgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCX0KLQkKLQkJCQlwdWJsaWMgdm9pZCBkcmFnTGVhdmUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJfQotCQotCQkJCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCX0KLQkKLQkJCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkJZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfU0VMRUNUOwotCQkJCQlmbG9hdCBmZWVkYmFja0Zsb2F0ID0gZ2V0SGVpZ2h0SW5JdGVtKGV2ZW50KTsKLQkJCQkJaWYgKGZlZWRiYWNrRmxvYXQgPiAwLjc1KSB7Ci0JCQkJCQlldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19JTlNFUlRfQUZURVI7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZmVlZGJhY2tGbG9hdCA8IDAuMjUpIHsKLQkJCQkJCWV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX0lOU0VSVF9CRUZPUkU7Ci0JCQkJCX0KLQkJCQkJZXZlbnQuZmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX0VYUEFORCB8IERORC5GRUVEQkFDS19TQ1JPTEw7Ci0JCQkJfQotCQotCQkJCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChldmVudC5vcGVyYXRpb25zICE9IERORC5EUk9QX05PTkUgJiYgTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIGV2ZW50Lml0ZW0gIT0gbnVsbCAmJiBldmVudC5pdGVtLmdldERhdGEoKSAhPSBudWxsKSB7Ci0JCQkJCQkJLyoKLQkJCQkJCQkgKiB0aGUgY29tbWFuZCB1c2VzIHRoZXNlIG51bWJlcnMgaW5zdGVhZCBvZiB0aGUKLQkJCQkJCQkgKiBmZWVkYmFjayBjb25zdGFudHMgKGV2ZW4gdGhvdWdoIGl0IGNvbnZlcnRzIGluCi0JCQkJCQkJICogdGhlIG90aGVyIGRpcmVjdGlvbiBhcyB3ZWxsKQotCQkJCQkJCSAqLwotCQkJCQkJCWZsb2F0IGZlZWRiYWNrRmxvYXQgPSBnZXRIZWlnaHRJbkl0ZW0oZXZlbnQpOwotCQotCQkJCQkJCWZpbmFsIERyYWdBbmREcm9wQ29tbWFuZCBjb21tYW5kID0gbmV3IERURERyYWdBbmREcm9wTWFuYWdlcigpLmNyZWF0ZUNvbW1hbmQoZXZlbnQuaXRlbS5nZXREYXRhKCksIGZlZWRiYWNrRmxvYXQsIGV2ZW50Lm9wZXJhdGlvbnMsIGV2ZW50LmRldGFpbCwgc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlpZiAoY29tbWFuZCAhPSBudWxsICYmIGNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQkJCQkJCVNhZmVSdW5uYWJsZS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJCQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCi0JCQkJcHVibGljIHZvaWQgZHJvcEFjY2VwdChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQl9Ci0JCi0JCQkJcHJpdmF0ZSBmbG9hdCBnZXRIZWlnaHRJbkl0ZW0oRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmKGV2ZW50Lml0ZW0gPT0gbnVsbCkgcmV0dXJuIC41ZjsKLQkJCQkJaWYgKGV2ZW50Lml0ZW0gaW5zdGFuY2VvZiBUcmVlSXRlbSkgewotCQkJCQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJCQlDb250cm9sIGNvbnRyb2wgPSB0cmVlSXRlbS5nZXRQYXJlbnQoKTsKLQkJCQkJCVBvaW50IHBvaW50ID0gY29udHJvbC50b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCQkJCVJlY3RhbmdsZSBib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoKTsKLQkJCQkJCXJldHVybiAoZmxvYXQpIChwb2ludC55IC0gYm91bmRzLnkpIC8gKGZsb2F0KSBib3VuZHMuaGVpZ2h0OwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGV2ZW50Lml0ZW0gaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKLQkJCQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSAoVGFibGVJdGVtKSBldmVudC5pdGVtOwotCQkJCQkJQ29udHJvbCBjb250cm9sID0gdGFibGVJdGVtLmdldFBhcmVudCgpOwotCQkJCQkJUG9pbnQgcG9pbnQgPSBjb250cm9sLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JCQkJCQlyZXR1cm4gKGZsb2F0KSAocG9pbnQueSAtIGJvdW5kcy55KSAvIChmbG9hdCkgYm91bmRzLmhlaWdodDsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJldHVybiAwLjBGOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyBUcmFuc2ZlciBnZXRUcmFuc2ZlcigpIHsKLQkJCQkJcmV0dXJuIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKTsKLQkJCQl9Ci0JCi0JCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCQlyZXR1cm4gZ2V0VHJhbnNmZXIoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKTsKLQkJCQl9Ci0JCQl9fTsKLQkJfQotCQlyZXR1cm4gZlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI3VuY29uZmlndXJlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmNvbmZpZ3VyZShUcmVlVmlld2VyIHZpZXdlcikgewotCQlzdXBlci51bmNvbmZpZ3VyZSh2aWV3ZXIpOwotCQlmVmlld2VyQ29udHJpYnV0aW9ucy5yZW1vdmUodmlld2VyKTsKLQkJaWYgKGZNZW51SGVscGVyICE9IG51bGwpIHsKLQkJCWZNZW51SGVscGVyLnJlbW92ZU1lbnVMaXN0ZW5lcnNGb3Iodmlld2VyKTsKLQkJCWZNZW51SGVscGVyID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERDb250ZXh0TWVudUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURENvbnRleHRNZW51SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OWEwN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURENvbnRleHRNZW51SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIE5hb2tpIEFraXlhbWEgKEZ1aml0c3UpIC0gYnVnIDE4NzE3MiAtIGZpeCBhdHRyaWJ1dGUgZ3JvdXBpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5MYWJlbFZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuRFRERWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5BZGRBdHRyaWJ1dGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZEF0dHJpYnV0ZUxpc3RBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZENvbW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZEVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnMuQWRkRW50aXR5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5BZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5BZGROb3RhdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnMuQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLlJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbjsKLQotLyoqCi0gKiBNZW51IGhlbHBlciBmb3IgQ29udGVudCBPdXRsaW5lIHBhZ2UuIFRoaXMgc2hvdWxkIG5vdCBiZSB1c2VkIGVsc2V3aGVyZS4KLSAqLwotY2xhc3MgRFREQ29udGV4dE1lbnVIZWxwZXIgewotCWNsYXNzIERURE1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCS8vIHVwZGF0ZSB0aGUgYWN0aW9uIHNlbGVjdGlvbiBub3cKLQkJCWFkZE5vdGF0aW9uQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0JCQlhZGRFbnRpdHlBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZEVsZW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZENvbW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGZWaWV3ZXJTZWxlY3Rpb24pOwotCQkJZGVsZXRlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0JCQlhZGRBdHRyaWJ1dGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGZWaWV3ZXJTZWxlY3Rpb24pOwotCQkJcmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0KLQotCQkJaWYgKCFmVmlld2VyU2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCWFkZEFjdGlvbkl0ZW1zRm9yU2VsZWN0aW9uKGZWaWV3ZXJTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCksIG1hbmFnZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgVmlld2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCV9zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCUFkZEF0dHJpYnV0ZUFjdGlvbiBhZGRBdHRyaWJ1dGVBY3Rpb247Ci0KLQlBZGRBdHRyaWJ1dGVMaXN0QWN0aW9uIGFkZEF0dHJpYnV0ZUxpc3RBY3Rpb247Ci0JQWRkQ29tbWVudEFjdGlvbiBhZGRDb21tZW50QWN0aW9uOwotCUFkZEVsZW1lbnRBY3Rpb24gYWRkRWxlbWVudEFjdGlvbjsKLQlBZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24gYWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uOwotCUFkZEVudGl0eUFjdGlvbiBhZGRFbnRpdHlBY3Rpb247Ci0JQWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbiBhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uOwotCUFkZE5vdGF0aW9uQWN0aW9uIGFkZE5vdGF0aW9uQWN0aW9uOwotCUFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbiBhZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb247Ci0JRGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbjsKLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZkludGVybmFsU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IFZpZXdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0KLQlwcml2YXRlIElNZW51TGlzdGVuZXIgZk1lbnVMaXN0ZW5lcjsKLQlwcml2YXRlIERURE1vZGVsSW1wbCBmTW9kZWw7Ci0JcHJpdmF0ZSBMaXN0IGZWaWV3ZXJMaXN0OwotCi0JSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlZpZXdlclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0KLQlSZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24gcmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uOwotCi0JcHVibGljIERURENvbnRleHRNZW51SGVscGVyKERURE1vZGVsSW1wbCBtb2RlbCkgewotCQlmTW9kZWwgPSBtb2RlbDsKLQkJZlZpZXdlckxpc3QgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlmTWVudUxpc3RlbmVyID0gbmV3IERURE1lbnVMaXN0ZW5lcigpOwotCi0JCWFkZE5vdGF0aW9uQWN0aW9uID0gbmV3IEFkZE5vdGF0aW9uQWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0RURF9OT1RBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRW50aXR5QWN0aW9uID0gbmV3IEFkZEVudGl0eUFjdGlvbihtb2RlbCwgRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9EVERfRU5USVRZKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFbGVtZW50QWN0aW9uID0gbmV3IEFkZEVsZW1lbnRBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRFREX0VMRU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCWFkZENvbW1lbnRBY3Rpb24gPSBuZXcgQWRkQ29tbWVudEFjdGlvbihtb2RlbCwgRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9EVERfQ09NTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQotCQlhZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24gPSBuZXcgQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX1BBUkFNX0VOVElUWV9SRUYpOyAvLyROT04tTkxTLTEkCi0JCWRlbGV0ZUFjdGlvbiA9IG5ldyBEZWxldGVBY3Rpb24oRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0RURF9ERUxFVEUpOyAvLyROT04tTkxTLTEkCi0JCWFkZEF0dHJpYnV0ZUFjdGlvbiA9IG5ldyBBZGRBdHRyaWJ1dGVBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRBdHRyaWJ1dGVMaXN0QWN0aW9uID0gbmV3IEFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFTElTVCk7IC8vJE5PTi1OTFMtMSQKLQotCQlhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uID0gbmV3IEFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9HUk9VUF9BRERfR1JPVVApOyAvLyROT04tTkxTLTEkCi0JCWFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbiA9IG5ldyBBZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRUxFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24gPSBuZXcgUmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fR1JPVVBfQUREX0dST1VQKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFkZE5vdGF0aW9uQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BRERfTk9UQVRJT04pKTsKLQkJYWRkRW50aXR5QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BRERfRU5USVRZKSk7Ci0JCWFkZENvbW1lbnRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FERF9DT01NRU5UKSk7Ci0JCWFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQUREX0VOVElUWV9SRUZFUkVOQ0UpKTsKLQotCQkvLyBUcmktc3RhdGUgaW1hZ2VzCi0JCWFkZEVsZW1lbnRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQUREX0VMRU1FTlQpKTsKLQkJYWRkRWxlbWVudEFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0NUT09MX0FERF9FTEVNRU5UKSk7Ci0JCWFkZEVsZW1lbnRBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19EVE9PTF9BRERfRUxFTUVOVCkpOwotCi0JCWFkZEF0dHJpYnV0ZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9BRERfQVRUUklCVVRFKSk7Ci0JCWFkZEF0dHJpYnV0ZUFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0NUT09MX0FERF9BVFRSSUJVVEUpKTsKLQkJYWRkQXR0cmlidXRlQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQUREX0FUVFJJQlVURSkpOwotCi0JCWFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQUREX0FUVFJJQlVURSkpOwotCQlhZGRBdHRyaWJ1dGVMaXN0QWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfQ1RPT0xfQUREX0FUVFJJQlVURSkpOwotCQlhZGRBdHRyaWJ1dGVMaXN0QWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQUREX0FUVFJJQlVURSkpOwotCi0JCWFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQUREX0dST1VQVE9DT05NT0RFTCkpOwotCQlhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfQ1RPT0xfQUREX0dST1VQVE9DT05NT0RFTCkpOwotCQlhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQUREX0dST1VQVE9DT05NT0RFTCkpOwotCi0JCWFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9BRERfRUxFTUVOVFRPQ09OTU9ERUwpKTsKLQkJYWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfQ1RPT0xfQUREX0VMRU1FTlRUT0NPTk1PREVMKSk7Ci0JCWFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0FERF9FTEVNRU5UVE9DT05NT0RFTCkpOwotCi0JCS8vIHVzZSB0aGUgc2FtZSBpbWFnZXMgYXMgYWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbgotCQlyZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQUREX0dST1VQVE9DT05NT0RFTCkpOwotCQlyZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19DVE9PTF9BRERfR1JPVVBUT0NPTk1PREVMKSk7Ci0JCXJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0FERF9HUk9VUFRPQ09OTU9ERUwpKTsKLQl9Ci0KLQl2b2lkIF9zZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvKgotCQkgKiBTYXZlIHRoZSBzZWxlY3Rpb24gc28gd2Ugb25seSBub3RpZnkgdGhlIGFjdGlvbnMgd2hlbiB0aGUgbWVudSBpcwotCQkgKiBzaG93bgotCQkgKi8KLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlmVmlld2VyU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmVmlld2VyU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQkJfQotCX0KLQotCXZvaWQgYWRkQWN0aW9uSXRlbXNGb3JTZWxlY3Rpb24oT2JqZWN0IHNlbGVjdGVkT2JqZWN0LCBJTWVudU1hbmFnZXIgbWVudSkgewotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBOb2RlTGlzdCkgewotCQkJLy8gYWRkIGFwcHJvcHJpYXRlIG1lbnUgdG8gbG9naWNhbCB2aWV3Ci0JCQlOb2RlTGlzdCBmb2xkZXIgPSAoTm9kZUxpc3QpIHNlbGVjdGVkT2JqZWN0OwotCQkJaWYgKGZvbGRlci5nZXRMaXN0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcpKSB7Ci0JCQkJbWVudS5hZGQoYWRkTm90YXRpb25BY3Rpb24pOwotCQkJfQotCQkJZWxzZSBpZiAoZm9sZGVyLmdldExpc3RUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpKSB7Ci0JCQkJbWVudS5hZGQoYWRkRW50aXR5QWN0aW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZvbGRlci5nZXRMaXN0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRykpIHsKLQkJCQlMYWJlbFZhbHVlUGFpcltdIGF2YWlsYWJsZUVudGl0aWVzID0gZk1vZGVsLmNyZWF0ZVBhcm1FbnRpdHlDb250ZW50SXRlbXMobnVsbCk7Ci0JCQkJYWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uLnNldEVuYWJsZWQoYXZhaWxhYmxlRW50aXRpZXMubGVuZ3RoID4gMCk7Ci0KLQkJCQltZW51LmFkZChhZGRFbGVtZW50QWN0aW9uKTsKLQkJCQltZW51LmFkZChhZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24pOwotCQkJfQotCQkJZWxzZSBpZiAoZm9sZGVyLmdldExpc3RUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKSkgewotCQkJCW1lbnUuYWRkKGFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24pOwotCQkJfQotCQl9Ci0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIERUREZpbGUgfHwgc2VsZWN0ZWRPYmplY3QgPT0gbnVsbCkgewotCQkJTGFiZWxWYWx1ZVBhaXJbXSBhdmFpbGFibGVFbnRpdGllcyA9IGZNb2RlbC5jcmVhdGVQYXJtRW50aXR5Q29udGVudEl0ZW1zKG51bGwpOwotCQkJYWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uLnNldEVuYWJsZWQoYXZhaWxhYmxlRW50aXRpZXMubGVuZ3RoID4gMCk7Ci0KLQkJCW1lbnUuYWRkKGFkZEVsZW1lbnRBY3Rpb24pOwotCQkJbWVudS5hZGQoYWRkRW50aXR5QWN0aW9uKTsKLQkJCW1lbnUuYWRkKGFkZE5vdGF0aW9uQWN0aW9uKTsKLQkJCW1lbnUuYWRkKGFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbik7Ci0JCQltZW51LmFkZChhZGRDb21tZW50QWN0aW9uKTsKLQkJCW1lbnUuYWRkKGFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24pOwotCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJfQotCi0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCUVsZW1lbnQgZHRkRWxlbWVudCA9IChFbGVtZW50KSBzZWxlY3RlZE9iamVjdDsKLQotCQkJQ01Ob2RlIGNvbnRlbnRNb2RlbCA9IGR0ZEVsZW1lbnQuZ2V0Q29udGVudE1vZGVsKCk7Ci0JCQlpZiAoY29udGVudE1vZGVsID09IG51bGwpIHsKLQkJCQltZW51LmFkZChhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uKTsKLQkJCQltZW51LmFkZChhZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24pOwotCQkJfQotCQkJZWxzZSBpZiAoY29udGVudE1vZGVsICE9IG51bGwgJiYgQ01Ob2RlLkVNUFRZLmVxdWFscyhjb250ZW50TW9kZWwuZ2V0VHlwZSgpKSkgewotCQkJCW1lbnUuYWRkKHJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbik7Ci0JCQl9Ci0JCQltZW51LmFkZChhZGRBdHRyaWJ1dGVBY3Rpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCW1lbnUuYWRkKGFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbik7Ci0JCQltZW51LmFkZChhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uKTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCW1lbnUuYWRkKGFkZEF0dHJpYnV0ZUFjdGlvbik7Ci0JCX0KLQotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlhZGRFZGl0QWN0aW9ucyhtZW51KTsKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBEVEROb2RlICYmICEoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBDTU5vZGUgJiYgKChDTU5vZGUpIHNlbGVjdGVkT2JqZWN0KS5pc1Jvb3RFbGVtZW50Q29udGVudCgpKSkgewotCQkJbWVudS5hZGQoZGVsZXRlQWN0aW9uKTsKLQkJCWRlbGV0ZUFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotCi0Jdm9pZCBhZGRFZGl0QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSkgewotCQkvLyBtZW51LmFkZCh1bmRvQWN0aW9uKTsKLQkJLy8gbWVudS5hZGQocmVkb0FjdGlvbik7Ci0JCS8vIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCS8vIG1lbnUuYWRkKGN1dEFjdGlvbik7Ci0JCS8vIG1lbnUuYWRkKGNvcHlBY3Rpb24pOwotCQkvLyBtZW51LmFkZChwYXN0ZUFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlTWVudUxpc3RlbmVyc0ZvcihWaWV3ZXIgdmlld2VyKSB7Ci0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZkludGVybmFsU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJZlZpZXdlclNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQl9Ci0JCWVsc2UgewotCQkJZlZpZXdlclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0JCX0KLQotCQlmVmlld2VyTGlzdC5hZGQodmlld2VyKTsKLQl9Ci0KLQlwdWJsaWMgSU1lbnVMaXN0ZW5lciBnZXRNZW51TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBmTWVudUxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU1lbnVMaXN0ZW5lcnNGb3IoVmlld2VyIHZpZXdlcikgewotCQl2aWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZJbnRlcm5hbFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCWZWaWV3ZXJMaXN0LnJlbW92ZSh2aWV3ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFRETGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzdmYjFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vZGVMaXN0OwotCi1jbGFzcyBEVERMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgRFRETGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgaW1hZ2UKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSB1c2VkIHRvIGxhYmVsIHRoZSBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgdGhlc2UgaXMgbm8gaW1hZ2UgZm9yIHRoZSBnaXZlbiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCWltYWdlID0gKChEVEROb2RlKSBlbGVtZW50KS5nZXRJbWFnZSgpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlTGlzdCkgewotCQkJaW1hZ2UgPSAoKE5vZGVMaXN0KSBlbGVtZW50KS5nZXRJbWFnZSgpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEVERGaWxlKSB7Ci0JCQlpbWFnZSA9ICgoRFRERmlsZSkgZWxlbWVudCkuZ2V0SW1hZ2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlID0gc3VwZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIHByb3ZpZGUgdGhlIGxhYmVsIHRleHQKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IHN0cmluZyB1c2VkIHRvIGxhYmVsIHRoZSBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgaWYgdGhlc2UgaXMgbm8gdGV4dCBsYWJlbCBmb3IgdGhlIGdpdmVuIG9iamVjdAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCVN0cmluZyBuYW1lID0gKChEVEROb2RlKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0KLQkJCS8vIHN0cmlwIGxlYWRpbmcgd2hpdGVzcGFjZSAodXNlZnVsIGZvciBtdWx0aS1saW5lIGNvbW1lbnRzKQotCQkJaW50IGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIgPSAwOwotCQkJaW50IGxhc3RWaXNpYmxlQ2hhcmFjdGVyID0gbmFtZS5sZW5ndGgoKSAtIDE7Ci0JCQlmb3IgKGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIgPSAwOyBmaXJzdFNpZ25pZmljYW50Q2hhcmFjdGVyIDwgbmFtZS5sZW5ndGgoKTsgZmlyc3RTaWduaWZpY2FudENoYXJhY3RlcisrKSB7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG5hbWUuY2hhckF0KGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIpKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvLyBrZWVwIG9ubHkgdGhlIGZpcnN0IGxpbmUgb2YgdGV4dCBpbiBhIG11bHRpLWxpbmUgbmFtZQotCQkJaWYgKGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIgPCBsYXN0VmlzaWJsZUNoYXJhY3RlcikgewotCQkJCWZvciAobGFzdFZpc2libGVDaGFyYWN0ZXIgPSBmaXJzdFNpZ25pZmljYW50Q2hhcmFjdGVyICsgMTsgbGFzdFZpc2libGVDaGFyYWN0ZXIgPCBuYW1lLmxlbmd0aCgpOyBsYXN0VmlzaWJsZUNoYXJhY3RlcisrKSB7Ci0JCQkJCWNoYXIgY2hhcmFjdGVyID0gbmFtZS5jaGFyQXQobGFzdFZpc2libGVDaGFyYWN0ZXIpOwotCQkJCQlpZiAoY2hhcmFjdGVyID09ICdccicgfHwgY2hhcmFjdGVyID09ICdcbicpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZmlyc3RTaWduaWZpY2FudENoYXJhY3RlciA+IDAgJiYgZmlyc3RTaWduaWZpY2FudENoYXJhY3RlciA8IG5hbWUubGVuZ3RoKCkgLSAxKSB7Ci0JCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIsIGxhc3RWaXNpYmxlQ2hhcmFjdGVyKTsKLQkJCX0KLQotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7Ci0JCQkvLyByZXR1cm4gKChOb2RlTGlzdCkgZWxlbWVudCkuZ2V0TGlzdFR5cGUoKTsKLQkJCXJldHVybiAoKE5vZGVMaXN0KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCXJldHVybiAoKERUREZpbGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhYTkwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Db21tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50LklEVERGaWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50Lk5vZGVzRXZlbnQ7Ci0KLWNsYXNzIERURFRyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgSURUREZpbGVMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIE9iamVjdCBmSW5wdXRPYmplY3Q7Ci0JcHJvdGVjdGVkIFZpZXdlciBmVmlld2VyOwotCi0JLy8gQSBjYWNoZWQgc2V0IG9mIEluZGV4ZWROb2RlTGlzdHMsIHJlcXVpcmVkIGZvciBnZXRQYXJlbnQgdG8gcmV0dXJuIHRoZQotCS8vIGNvcnJlY3QgaW5zdGFuY2VzIG1hcHBpbmcgdG8gVHJlZUl0ZW1zCi0JcHJvdGVjdGVkIE9iamVjdFtdIGxvZ2ljYWxOb2RlTGlzdHMgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHNob3dMb2dpY2FsT3JkZXIgPSBmYWxzZTsKLQotCXB1YmxpYyBEVERUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZWaWV3ZXIgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBleHBhbmRUb05vZGUoRFRETm9kZSBub2RlKSB7Ci0JCURUREZpbGUgZHRkRmlsZSA9IG5vZGUuZ2V0RFRERmlsZSgpOwotCQkvLyBmaXJzdCBleHBhbmQgdGhlIHJvb3QKLQkJQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlciA9IChBYnN0cmFjdFRyZWVWaWV3ZXIpIGZWaWV3ZXI7Ci0JCXZpZXdlci5leHBhbmRUb0xldmVsKGR0ZEZpbGUsIDEpOwotCQlOb2RlTGlzdCBsaXN0VG9FeHBhbmQgPSBudWxsOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgewotCQkJbGlzdFRvRXhwYW5kID0gZHRkRmlsZS5nZXRFbGVtZW50c0FuZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZXMoKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgTm90YXRpb24pIHsKLQkJCWxpc3RUb0V4cGFuZCA9IGR0ZEZpbGUuZ2V0Tm90YXRpb25zKCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJbGlzdFRvRXhwYW5kID0gZHRkRmlsZS5nZXRFbnRpdGllcygpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDb21tZW50KSB7Ci0JCQlsaXN0VG9FeHBhbmQgPSBkdGRGaWxlLmdldENvbW1lbnRzKCk7Ci0JCX0KLQkJaWYgKGxpc3RUb0V4cGFuZCAhPSBudWxsKSB7Ci0JCQl2aWV3ZXIuZXhwYW5kVG9MZXZlbChsaXN0VG9FeHBhbmQsIDEpOwotCQl9Ci0JCXZpZXdlci5leHBhbmRUb0xldmVsKG5vZGUsIDApOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkvLyByZXR1cm4gdGhlIGxpc3RzIG9mIG5vZGVzIHdoZW4gaW4gbG9naWNhbCBvcmRlciBtb2RlLCBhbGwgdGhlIE5vZGVzCi0JCS8vIG90aGVyd2lzZQotCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCWlmIChpc1Nob3dMb2dpY2FsT3JkZXIoKSkgewotCQkJCS8vIHJldHVybiB0aGUgdmlzaWJsZSBub2RlIGxpc3RzCi0JCQkJaWYgKGxvZ2ljYWxOb2RlTGlzdHMgPT0gbnVsbCkgewotCQkJCQlJdGVyYXRvciBub2RlTGlzdHMgPSAoKERUREZpbGUpIHBhcmVudEVsZW1lbnQpLmdldE5vZGVMaXN0cygpLml0ZXJhdG9yKCk7Ci0JCQkJCUxpc3QgdmlzaWJsZUxpc3RzID0gbmV3IEFycmF5TGlzdCg3KTsKLQkJCQkJd2hpbGUgKG5vZGVMaXN0cy5oYXNOZXh0KCkpIHsKLQkJCQkJCU5vZGVMaXN0IGxpc3QgPSAoTm9kZUxpc3QpIG5vZGVMaXN0cy5uZXh0KCk7Ci0JCQkJCQlpZiAoaXNWaXNpYmxlTm9kZUxpc3QobGlzdCkpIHsKLQkJCQkJCQl2aXNpYmxlTGlzdHMuYWRkKGxpc3QpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWxvZ2ljYWxOb2RlTGlzdHMgPSB2aXNpYmxlTGlzdHMudG9BcnJheSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gbG9naWNhbE5vZGVMaXN0czsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHJldHVybiB0aGUgdmlzaWJsZSBub2RlcwotCQkJCUxpc3QgYWxsTm9kZXMgPSAoKERUREZpbGUpIHBhcmVudEVsZW1lbnQpLmdldE5vZGVzKCk7Ci0JCQkJTGlzdCB2aXNpYmxlTm9kZXMgPSBuZXcgQXJyYXlMaXN0KGFsbE5vZGVzLnNpemUoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxOb2Rlcy5zaXplKCk7IGkrKykgewotCQkJCQlPYmplY3QgbyA9IGFsbE5vZGVzLmdldChpKTsKLQkJCQkJaWYgKGlzVmlzaWJsZU5vZGUobykpIHsKLQkJCQkJCXZpc2libGVOb2Rlcy5hZGQobyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHZpc2libGVOb2Rlcy50b0FycmF5KCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7Ci0JCQlyZXR1cm4gKChOb2RlTGlzdCkgcGFyZW50RWxlbWVudCkuZ2V0Tm9kZXMoKS50b0FycmF5KCk7Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCS8vIGFsd2F5cyBncm91cCB0aGUgYXR0cmlidXRlcyBkaXJlY3RseSB1bmRlciB0aGUgZWxlbWVudAotCQkJT2JqZWN0W10gY2hpbGRyZW4gPSAoKERURE5vZGUpIHBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci0JCQlMaXN0IGF0dHJpYnV0ZXMgPSAoKEVsZW1lbnQpIHBhcmVudEVsZW1lbnQpLmdldEVsZW1lbnRBdHRyaWJ1dGVzKCk7Ci0JCQlPYmplY3RbXSBsb2dpY2FsQ2hpbGRyZW4gPSBuZXcgT2JqZWN0W2NoaWxkcmVuLmxlbmd0aCArIGF0dHJpYnV0ZXMuc2l6ZSgpXTsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQlsb2dpY2FsQ2hpbGRyZW5baW5kZXhdID0gY2hpbGRyZW5baW5kZXhdOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlsb2dpY2FsQ2hpbGRyZW5baW5kZXgrK10gPSBpdGVyLm5leHQoKTsKLQkJCX0KLQkJCXJldHVybiBsb2dpY2FsQ2hpbGRyZW47Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCXJldHVybiAoKERURE5vZGUpIHBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlPYmplY3RbXSBlbGVtZW50cyA9IG51bGw7Ci0JCS8vIEFsd2F5cyBzaG93IHRoZSBEVERGaWxlICJub2RlIgotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQllbGVtZW50cyA9IG5ldyBPYmplY3RbXXsoKERURE1vZGVsSW1wbCkgaW5wdXRFbGVtZW50KS5nZXREVERGaWxlKCl9OwotCQl9Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQllbGVtZW50cyA9IG5ldyBPYmplY3RbMF07Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBlbGVtZW50OwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCQkvLyB0aGVuIHdlIG11c3Qgc2F5IHRoYXQgdGhlIGVsZW1lbnQgd2l0aCB0aGUgc2FtZSBuYW1lCi0JCQkJLy8gYXMgb3VyIGF0dHJpYnV0ZSdzIHBhcmVudCBhdHRyaWJ1dGVsaXN0IGlzIG91ciBwYXJlbnQKLQkJCQlwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50IGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkgewotCQkJCQlyZXR1cm4gZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkJLy8gdGhlbiB3ZSBtdXN0IHNheSB0aGF0IHRoZSBlbGVtZW50IHdpdGggdGhlIHNhbWUgbmFtZQotCQkJCS8vIGFzIG91ciBhdHRyaWJ1dGVsaXN0IGlzIG91ciBwYXJlbnQKLQkJCQlTdHJpbmcgYXR0TGlzdE5hbWUgPSAoKEF0dHJpYnV0ZUxpc3QpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQlJdGVyYXRvciBpdGVyID0gbm9kZS5nZXREVERGaWxlKCkuZ2V0RWxlbWVudHNBbmRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VzKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSAmJiBwYXJlbnQgPT0gbnVsbCkgewotCQkJCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGN1cnJlbnROb2RlLmdldE5hbWUoKS5lcXVhbHMoYXR0TGlzdE5hbWUpKSB7Ci0JCQkJCQlwYXJlbnQgPSBjdXJyZW50Tm9kZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJcGFyZW50ID0gKChEVEROb2RlKSBlbGVtZW50KS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0KLQkJCS8vIGlmIHNob3dpbmcgaW4gdGhlIGxvZ2ljYWwgb3JkZXIsIHJldHVybiB0aGUgSW5kZXhlZE5vZGVMaXN0Ci0JCQkvLyBhY3RpbmcgYXMgdGhlIHBhcmVudCBpbiB0aGUgdHJlZQotCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJaWYgKGlzU2hvd0xvZ2ljYWxPcmRlcigpKSB7Ci0JCQkJCU9iamVjdFtdIGluZGV4ZWROb2RlTGlzdHMgPSBnZXRDaGlsZHJlbigoKERURE1vZGVsSW1wbCkgZklucHV0T2JqZWN0KS5nZXREVERGaWxlKCkpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4ZWROb2RlTGlzdHMubGVuZ3RoICYmIHBhcmVudCA9PSBudWxsOyBpKyspIHsKLQkJCQkJCWlmIChpbmRleGVkTm9kZUxpc3RzW2ldIGluc3RhbmNlb2YgTm9kZUxpc3QpIHsKLQkJCQkJCQlpZiAoKChOb2RlTGlzdCkgaW5kZXhlZE5vZGVMaXN0c1tpXSkuZ2V0Tm9kZXMoKS5jb250YWlucyhlbGVtZW50KSkKLQkJCQkJCQkJcGFyZW50ID0gaW5kZXhlZE5vZGVMaXN0c1tpXTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGFyZW50ID0gKChEVERNb2RlbEltcGwpIGZJbnB1dE9iamVjdCkuZ2V0RFRERmlsZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTm9kZUxpc3QgJiYgZklucHV0T2JqZWN0IGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQlwYXJlbnQgPSAoKERURE1vZGVsSW1wbCkgZklucHV0T2JqZWN0KS5nZXREVERGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGVsZW1lbnQpOwotCQlyZXR1cm4gY2hpbGRyZW4ubGVuZ3RoID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJZlZpZXdlciA9IHZpZXdlcjsKLQotCQlpZiAoZklucHV0T2JqZWN0IGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQkoKERURE1vZGVsSW1wbCkgZklucHV0T2JqZWN0KS5nZXREVERGaWxlKCkucmVtb3ZlRFRERmlsZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCWZJbnB1dE9iamVjdCA9IG5ld0lucHV0OwotCQlpZiAoZklucHV0T2JqZWN0IGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQkoKERURE1vZGVsSW1wbCkgZklucHV0T2JqZWN0KS5nZXREVERGaWxlKCkuYWRkRFRERmlsZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzaG93TG9naWNhbE9yZGVyLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc2hvd0xvZ2ljYWxPcmRlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dMb2dpY2FsT3JkZXIoKSB7Ci0JCXJldHVybiBzaG93TG9naWNhbE9yZGVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1Zpc2libGVOb2RlKE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1Zpc2libGVOb2RlTGlzdChOb2RlTGlzdCBub2RlTGlzdCkgewotCQkvKgotCQkgKiBBbGwgTm9kZXNMaXN0cyBzaG91bGQgYmUgdmlzaWJsZSBiZWNhdXNlIHlvdSBjYW4gbW9tZW50YXJpbHkgaGF2ZQotCQkgKiBhbiBBVFRMSVNUIChmb3IgZXhhbXBsZSkgd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcgRUxFTUVOVAotCQkgKiBkZWNsYXJhdGlvbgotCQkgKi8KLQkJcmV0dXJuIHRydWU7Ly8gIW5vZGVMaXN0LmdldExpc3RUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQ2hhbmdlZChmaW5hbCBEVEROb2RlIG5vZGUpIHsKLQkJaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm5vZGUgY2hhbmdlZCBub3RpZmllZCIpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24gYmVmb3JlID0gIiArCi0JCQkvLyAoKFN0cnVjdHVyZWRWaWV3ZXIpdmlldykuZ2V0U2VsZWN0aW9uKCkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0ICYmIGlzU2hvd0xvZ2ljYWxPcmRlcigpKSB7Ci0JCQkJLy8gaW4gdGhpcyBjYXNlLCB3ZSBhcmUgc2hvd2luZyBhdHRyaWJ1dGVzIHVuZGVyIHRoZSBlbGVtZW50LgotCQkJCS8vIHJlZnJlc2ggdGhlIGVsZW1lbnQgb2JqZWN0IGluc3RlYWQKLQkJCQlJdGVyYXRvciBpdGVyID0gbm9kZS5nZXREVERGaWxlKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoY3VycmVudE5vZGUuZ2V0TmFtZSgpLmVxdWFscyhub2RlLmdldE5hbWUoKSkgJiYgY3VycmVudE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJCQkoKFN0cnVjdHVyZWRWaWV3ZXIpIGZWaWV3ZXIpLnJlZnJlc2goY3VycmVudE5vZGUsIHRydWUpOwotCQkJCQl9Ci0JCQkJfSAvLyBlbmQgb2Ygd2hpbGUgKCkKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGRvIHN0YW5kYXJkIHN0dWZmCi0JCQkJZlZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChmVmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpIHsKLQkJCQkJCQkoKFN0cnVjdHVyZWRWaWV3ZXIpIGZWaWV3ZXIpLnJlZnJlc2gobm9kZS5nZXRQYXJlbnROb2RlKCksIHRydWUpOwotCQkJCQkJfQotCQkJCQkJKChTdHJ1Y3R1cmVkVmlld2VyKSBmVmlld2VyKS5yZWZyZXNoKG5vZGUsIHRydWUpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0JCQkJZlZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChmVmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJLyoKLQkJCQkJCSAqIGdvIGZyb20gdGhlIGF0dHJpYnV0ZSB0byBpdHMgbGlzdCBhbmQgdGhlbiBvd25pbmcgZWxlbWVudAotCQkJCQkJICogc28gd2UgcmVmcmVzaCB0aGUgdHJlZSBpdGVtIHRoZXJlIGFzIHdlbGwKLQkJCQkJCSAqLwotCQkJCQkJT2JqZWN0IGF0dHJMaXN0ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlpZiAoYXR0ckxpc3QgIT0gbnVsbCAmJiBhdHRyTGlzdCBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCQkJCQlTdHJpbmcgYXR0TGlzdE5hbWUgPSAoKEF0dHJpYnV0ZUxpc3QpIGF0dHJMaXN0KS5nZXROYW1lKCk7Ci0JCQkJCQkJSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0RFRERmlsZSgpLmdldEVsZW1lbnRzQW5kUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlcygpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJCQkJCQlPYmplY3QgcGFyZW50ID0gbnVsbDsKLQkJCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgcGFyZW50ID09IG51bGwpIHsKLQkJCQkJCQkJRFRETm9kZSBjdXJyZW50Tm9kZSA9IChEVEROb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRWxlbWVudCAmJiBjdXJyZW50Tm9kZS5nZXROYW1lKCkuZXF1YWxzKGF0dExpc3ROYW1lKSkgewotCQkJCQkJCQkJcGFyZW50ID0gY3VycmVudE5vZGU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCQkJCSgoU3RydWN0dXJlZFZpZXdlcikgZlZpZXdlcikucmVmcmVzaChwYXJlbnQsIHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24gYWZ0ZXIgPSAiICsKLQkJCS8vICgoU3RydWN0dXJlZFZpZXdlcil2aWV3KS5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc0FkZGVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVWaWV3ZXIpIHsKLQkJCVN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIGZWaWV3ZXI7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQotCQkJT2JqZWN0IGZpcnN0T2JqID0gKCFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCQkJRFRETm9kZSBvbGRTZWxlY3RlZE5vZGUgPSBudWxsOwotCQkJaWYgKGZpcnN0T2JqIGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJCW9sZFNlbGVjdGVkTm9kZSA9IChEVEROb2RlKSBmaXJzdE9iajsKLQkJCX0KLQotCQkJZmluYWwgQWJzdHJhY3RUcmVlVmlld2VyIGFic3RyYWN0VHJlZVZpZXdlciA9IChBYnN0cmFjdFRyZWVWaWV3ZXIpIGZWaWV3ZXI7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZXZlbnQuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG5vZGUgPSBpdC5uZXh0KCk7Ci0JCQkJZmluYWwgT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChub2RlKTsKLQkJCQkvLyBCdWcgMTExMTAwIC0gSWYgaXQgaXMgYSB0b3AgbGV2ZWwgbm9kZSAoaWUuIHBhcmVudCBpcyBhCi0JCQkJLy8gRFRERmlsZSksCi0JCQkJLy8gaW5zZXJ0IHRoZSBub2RlIGRpcmVjdGx5IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRFRERmlsZSkgewotCQkJCQlPYmplY3RbXSBvYmpzID0gZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAob2Jqc1tpXSA9PSBub2RlKSB7Ci0JCQkJCQkJYWJzdHJhY3RUcmVlVmlld2VyLmluc2VydChwYXJlbnQsIG5vZGUsIGkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIElmIHRoZSBwYXJlbnQgbm9kZSBpcyBub3QgYSBEVERGaWxlLCBqdXN0IHJlZnJlc2ggdGhlCi0JCQkJLy8gcGFyZW50IGZvciBub3cKLQkJCQllbHNlIGlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlmVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoZlZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJYWJzdHJhY3RUcmVlVmlld2VyLnJlZnJlc2gocGFyZW50LCB0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJCS8vIFlvdSBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBibG9jaywgaWYgeW91IGRvLCBqdXN0IHJlZnJlc2gKLQkJCQkvLyB0aGUgd2hvbGUgdHJlZQotCQkJCWVsc2UgewotCQkJCQlmVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoZlZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJYWJzdHJhY3RUcmVlVmlld2VyLnJlZnJlc2godHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQotCQkJSXRlcmF0b3IgaXRlciA9IGV2ZW50LmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJCUxpc3QgbmV3U2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChvbGRTZWxlY3RlZE5vZGUgPT0gbnVsbCB8fCBub2RlLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpICE9IG9sZFNlbGVjdGVkTm9kZS5nZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSB8fCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkgIT0gb2xkU2VsZWN0ZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgfHwgbm9kZS5nZXRFbmRPZmZzZXQoKSAhPSBvbGRTZWxlY3RlZE5vZGUuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJLy8gYWRkIHRvIHNlbGVjdGlvbgotCQkJCQluZXdTZWxlY3Rpb24uYWRkKG5vZGUpOwotCQkJCQlleHBhbmRUb05vZGUobm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5ld1NlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdTZWxlY3Rpb24pKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZXNSZW1vdmVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVWaWV3ZXIpIHsKLQkJCUFic3RyYWN0VHJlZVZpZXdlciBhYnN0cmFjdFRyZWVWaWV3ZXIgPSAoQWJzdHJhY3RUcmVlVmlld2VyKSBmVmlld2VyOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZXZlbnQuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlhYnN0cmFjdFRyZWVWaWV3ZXIucmVtb3ZlKGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzaG93TG9naWNhbE9yZGVyLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHNob3dMb2dpY2FsT3JkZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hvd0xvZ2ljYWxPcmRlcihib29sZWFuIHZhbHVlKSB7Ci0JCXRoaXMuc2hvd0xvZ2ljYWxPcmRlciA9IHZhbHVlOwotCQlpZiAoIXZhbHVlKSB7Ci0JCQkvLyBpZiBub3QgdXNpbmcgbG9naWNhbCBvcmRlciwgbG9zZSB0aGUgY2FjaGVkIGxpc3RzCi0JCQlsb2dpY2FsTm9kZUxpc3RzID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9PcmRlckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL09yZGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyN2JjNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL09yZGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbjsKLQotY2xhc3MgT3JkZXJBY3Rpb24gZXh0ZW5kcyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbiB7Ci0JcHJpdmF0ZSBEVERUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXB1YmxpYyBPcmRlckFjdGlvbihUcmVlVmlld2VyIHZpZXdlciwgRFREVHJlZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciwgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIHByZWZlcmVuY2VLZXkpIHsKLQkJc3VwZXIoRFREVUlNZXNzYWdlcy5fVUlfQlVUVE9OX0dST1VQX0lURU1TX0xPR0lDQUxMWSwgc3RvcmUsIHByZWZlcmVuY2VLZXksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfT1JHQU5JWkVfRFREX0xPR0lDQUxMWSkpOwotCQl0cmVlVmlld2VyID0gdmlld2VyOwotCQljb250ZW50UHJvdmlkZXIgPSBwcm92aWRlcjsKLQkJc2V0VG9vbFRpcFRleHQoZ2V0VGV4dCgpKTsKLQkJY29udGVudFByb3ZpZGVyLnNldFNob3dMb2dpY2FsT3JkZXIoaXNDaGVja2VkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0JCXNldENoZWNrZWQoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihnZXRQcmVmZXJlbmNlS2V5KCkpKTsKLQkJT2JqZWN0W10gZXhwYW5kZWRFbGVtZW50cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWNvbnRlbnRQcm92aWRlci5zZXRTaG93TG9naWNhbE9yZGVyKGlzQ2hlY2tlZCgpKTsKLQotCQkvLyB0cmVlVmlld2VyLnNldElucHV0KHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSk7Ci0JCXRyZWVWaWV3ZXIucmVmcmVzaCh0cmVlVmlld2VyLmdldElucHV0KCkpOwotCi0JCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRFbGVtZW50cyhleHBhbmRlZEVsZW1lbnRzKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KHRydWUpOwotCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9Tb3J0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvU29ydEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzczZjQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9Tb3J0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbjsKLQotY2xhc3MgU29ydEFjdGlvbiBleHRlbmRzIFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uIHsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQlwcml2YXRlIFZpZXdlckNvbXBhcmF0b3IgZkNvbXBhcmF0b3I7Ci0KLQlwdWJsaWMgU29ydEFjdGlvbihUcmVlVmlld2VyIHZpZXdlciwgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIHByZWZlcmVuY2VLZXkpIHsKLQkJc3VwZXIoRFREVUlNZXNzYWdlcy5fVUlfQlVUVE9OX1NPUlRfSVRFTVMsIHN0b3JlLCBwcmVmZXJlbmNlS2V5LCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1NPUlQpKTsKLQkJc2V0VG9vbFRpcFRleHQoZ2V0VGV4dCgpKTsKLQkJZkNvbXBhcmF0b3IgPSBuZXcgRFREQ29udGVudE91dGxpbmVDb21wYXJhdG9yKCk7Ci0JCXRyZWVWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWlmIChpc0NoZWNrZWQoKSkgewotCQkJdHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKGZDb21wYXJhdG9yKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlI3VwZGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KGZhbHNlKTsKLQkJT2JqZWN0W10gZXhwYW5kZWRFbGVtZW50cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOwotCQlpZiAoaXNDaGVja2VkKCkpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihmQ29tcGFyYXRvcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0cmVlVmlld2VyLnNldENvbXBhcmF0b3IobnVsbCk7Ci0JCX0KLQkJdHJlZVZpZXdlci5zZXRJbnB1dCh0cmVlVmlld2VyLmdldElucHV0KCkpOwotCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkRWxlbWVudHMoZXhwYW5kZWRFbGVtZW50cyk7Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyh0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvdGVtcGxhdGVzL2R0ZGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvdGVtcGxhdGVzL2R0ZGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NjgyYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3RlbXBsYXRlcy9kdGRkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgU1RBUiBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgRGF2aWQgQ2FydmVyLCBTVEFSIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uLCBidWcgMTYyMzIxCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRlbXBsYXRlcy54bWxkZWNsYXJhdGlvbi5uYW1lPXhtbCBkZWNsYXJhdGlvbgotVGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uLmRlc2M9eG1sIGRlY2xhcmF0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvdGVtcGxhdGVzL2R0ZGRlZmF1bHQtdGVtcGxhdGVzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS90ZW1wbGF0ZXMvZHRkZGVmYXVsdC10ZW1wbGF0ZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmM2NDIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS90ZW1wbGF0ZXMvZHRkZGVmYXVsdC10ZW1wbGF0ZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIGluaXRpYWwgY29udHJpYnV0aW9uLCBidWcgMTYyMzIxCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAtLT4KLTx0ZW1wbGF0ZXM+Ci0gIDx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnRlbXBsYXRlcy54bWxkZWNsYXJhdGlvbiIgY29udGV4dD0iZHRkX25ldyIgZW5hYmxlZD0idHJ1ZSI+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJHtlbmNvZGluZ30iPyZndDs8L3RlbXBsYXRlPgotPC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzZmOGMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL3czYy9kb20vY3NzLyoqLyoiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmNhNmNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLWh0bWxtb2RlbC5qYXIKLXRlbXAuZm9sZGVyCi1kZXYucHJvcGVydGllcwotYnVpbGQueG1sCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NmE1OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RlYnVnPXRydWUKLW9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGVidWcvdHJhY2VmaWx0ZXI9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2E5ZmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2N2UzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotI1dlZCBNYXIgMjggMDM6MjM6MDcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjFjZDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYNCi1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTANCi1jb21waWxlcnMucC5idWlsZD0wDQotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xDQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MA0KLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wDQotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MA0KLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTANCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTANCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MA0KLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTANCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wDQotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTANCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTU4ODJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuNTAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaGFuZGxlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuc3NpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0Ci1JbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudXRpbDsgdmVyc2lvbj0iMy44IgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAxLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjUwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS41MDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNDAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycztidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbAotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenk7ZXhjbHVkZTo9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUsb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2NTVmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgZGF0YS8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwKLXNvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2NWFlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5odG1sIj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5zdGFuZGFyZC5kdGRzIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vZWNsaXBzZS5vcmcvd2VidG9vbHMvd3N0L2NvbXBvbmVudHMvaHRtbC9vdmVydmlldy5odG1sIiAvPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS52aWV3cy5jb250ZW50b3V0bGluZSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IkhUTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcCIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWYucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2Q0NjBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUFUYWdJbmZvPUEgbGluayBpZiB0aGUgaHJlZiBhdHRyaWJ1dGUgaXMgcHJlc2VudCwgYW5kIHRoZSB0YXJnZXQgZm9yIGEgbGluayBpZiB0aGUgbmFtZSBhdHRyaWJ1dGUgaXMgcHJlc2VudAotQUJCUlRhZ0luZm89QW4gYWJicmV2aWF0aW9uIChmb3IgZXhhbXBsZSwgV1dXLCBIVFRQKQotQUNST05ZTVRhZ0luZm89QW4gYWNyb255bSAoZm9yIGV4YW1wbGUsIFNDVUJBKQotQUREUkVTU1RhZ0luZm89QWRkcmVzcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGF1dGhvciBvZiB0aGUgcGFnZQotQVBQTEVUVGFnSW5mbz1BIEphdmEgYXBwbGV0Ci1BUkVBVGFnSW5mbz1EZWZpbmVzIGEgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIGFyZWEKLUJUYWdJbmZvPURpc3BsYXlzIGNvbnRhaW5lZCB0ZXh0IGFzIGJvbGQKLUJBU0VUYWdJbmZvPVRoZSBiYXNlIFVSSSBmb3IgdGhlIHBhZ2UsIHRvIGJlIHVzZWQgd2hlbiBjYWxjdWxhdGluZyByZWxhdGl2ZSBwYXRocwotQkFTRUZPTlRUYWdJbmZvPVRoZSBiYXNlIGZvbnQgc2l6ZSBmb3IgdGhlIHBhZ2UKLUJET1RhZ0luZm89T3ZlcnJpZGVzIGRlZmF1bHQgYmlkaXJlY3Rpb25hbCBkaXNwbGF5LiBGb3IgdXNlIHdpdGggYmlkaXJlY3Rpb25hbCBsYW5ndWFnZXMuCi1CSUdUYWdJbmZvPURpc3BsYXlzIGNvbnRhaW5lZCB0ZXh0IGFzIGxhcmdlCi1CR1NPVU5EVGFnSW5mbz1EZWZpbmVzIGEgc291bmQgZmlsZSBmb3IgdGhlIHBhZ2UuIE5vdCBzdXBwb3J0ZWQgYnkgVzNDIEhUTUwgNC4wMS4KLUJMSU5LVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGFzIGJsaW5raW5nLiBOb3Qgc3VwcG9ydGVkIGJ5IFczQyBIVE1MIDQuMDEuCi1CTE9DS1FVT1RFVGFnSW5mbz1BIGxvbmcgcXVvdGF0aW9uCi1CT0RZVGFnSW5mbz1UaGUgZG9jdW1lbnQgYm9keS4gQ29udGFpbnMgYWxsIHRoZSBjb250ZW50IGZvciB0aGUgcGFnZS4KLUJSVGFnSW5mbz1Gb3JjZXMgYSBsaW5lIGJyZWFrCi1CVVRUT05UYWdJbmZvPURlZmluZXMgYSBwdXNoIGJ1dHRvbgotQ0FQVElPTlRhZ0luZm89RGVmaW5lcyBhIHRhYmxlIGNhcHRpb24KLUNFTlRFUlRhZ0luZm89RGlzcGxheXMgY29udGFpbmVkIHRleHQgY2VudGVyZWQuIEVxdWl2YWxlbnQgdG8gRElWIHdpdGggYWxpZ249Y2VudGVyLgotQ0lURVRhZ0luZm89QSBjaXRhdGlvbgotQ09ERVRhZ0luZm89QSBjb21wdXRlciBjb2RlIGZyYWdtZW50Ci1DT0xUYWdJbmZvPUEgdGFibGUgY29sdW1uCi1DT0xHUk9VUFRhZ0luZm89QSBncm91cCBvZiB0YWJsZSBjb2x1bW5zCi1ERFRhZ0luZm89QSBkZWZpbml0aW9uIG9yIGRlc2NyaXB0aW9uIGluIGEgZGVmaW5pdGlvbiBvciBkZXNjcmlwdGlvbiBsaXN0Ci1ERUxUYWdJbmZvPURpc3BsYXlzIHRleHQgYXMgZGVsZXRlZAotREZOVGFnSW5mbz1BIGRlZmluaXRpb24KLURJUlRhZ0luZm89QSBkaXJlY3RvcnkgbGlzdGluZwotRElWVGFnSW5mbz1BIGdlbmVyaWMgY29udGFpbmVyLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZGVmaW5pbmcgbGFuZ3VhZ2Ugb3Igc3R5bGUgZm9yIHRoZSBjb250ZW50cwotRExUYWdJbmZvPUEgZGVmaW5pdGlvbiBvciBkZXNjcmlwdGlvbiBsaXN0Ci1EVFRhZ0luZm89QSB0ZXJtIG9yIHN1YmplY3QgaW4gYSBkZWZpbml0aW9uIG9yIGRlc2NyaXB0aW9uIGxpc3QKLUVNVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGVtcGhhc2l6ZWQgKGdlbmVyYWxseSBpdGFsaWNpemVkKQotRU1CRURUYWdJbmZvPURlZmluZXMgYW4gZW1iZWRkZWQgcGx1Zy1pbi4gTm90IHN1cHBvcnRlZCBieSBXM0MgSFRNTCA0LjAxLgotRklFTERTRVRUYWdJbmZvPURlZmluZXMgYSBmb3JtIGNvbnRyb2wgZ3JvdXAKLUZPTlRUYWdJbmZvPURpc3BsYXlzIHRleHQgaW4gdGhlIGdpdmVuIGZvbnQKLUZPUk1UYWdJbmZvPURlZmluZXMgYW4gaW50ZXJhY3RpdmUgZm9ybQotRlJBTUVUYWdJbmZvPURlZmluZXMgYSBmcmFtZSB3aXRoaW4gdGhlIGN1cnJlbnQgd2luZG93Ci1GUkFNRVNFVFRhZ0luZm89RGVmaW5lcyBhIGZyYW1lc2V0IHRoYXQgZGl2aWRlcyB0aGUgd2luZG93IGludG8gZnJhbWVzCi1IMVRhZ0luZm89QSB0b3AtbGV2ZWwgaGVhZGluZwotSDJUYWdJbmZvPUEgc2Vjb25kLWxldmVsIGhlYWRpbmcKLUgzVGFnSW5mbz1BIHRoaXJkLWxldmVsIGhlYWRpbmcKLUg0VGFnSW5mbz1BIGZvdXJ0aC1sZXZlbCBoZWFkaW5nCi1INVRhZ0luZm89QSBmaWZ0aC1sZXZlbCBoZWFkaW5nCi1INlRhZ0luZm89QSBzaXh0aC1sZXZlbCBoZWFkaW5nCi1IRUFEVGFnSW5mbz1Db250YWlucyBtZXRhZGF0YSBhbmQgd2luZG93IHRpdGxlIGluZm9ybWF0aW9uIGZvciB0aGUgZG9jdW1lbnQKLUhSVGFnSW5mbz1BIGhvcml6b250YWwgcnVsZQotSFRNTFRhZ0luZm89VGhlIHJvb3QgZWxlbWVudCBmb3IgdGhlIGRvY3VtZW50LgotSVRhZ0luZm89RGlzcGxheXMgdGV4dCBhcyBpdGFsaWMKLUlGUkFNRVRhZ0luZm89RGVmaW5lcyBhbiBpbmxpbmUgc3Vid2luZG93Ci1JTUdUYWdJbmZvPURpc3BsYXlzIHRoZSByZWZlcmVuY2VkIGltYWdlIGFzIGVtYmVkZGVkIGNvbnRlbnQKLUlOUFVUVGFnSW5mbz1EZWZpbmVzIGEgZm9ybSBjb250cm9sIGZvciB1c2VyIGlucHV0Ci1JTlNUYWdJbmZvPURlZmluZXMgaW5zZXJ0ZWQgdGV4dAotSVNJTkRFWFRhZ0luZm89RGVmaW5lcyBhIHNpbmdsZSBsaW5lIHByb21wdAotS0JEVGFnSW5mbz1EZWZpbmVzIHRleHQgdG8gYmUgZW50ZXJlZCBieSB0aGUgdXNlcgotTEFCRUxUYWdJbmZvPURlZmluZXMgdGhlIGxhYmVsIGZvciBhIGZvcm0gZmllbGQKLUxFR0VORFRhZ0luZm89RGVmaW5lcyB0aGUgbGFiZWwgZm9yIGEgc2V0IG9mIGZvcm0gZmllbGRzCi1MSVRhZ0luZm89RGVmaW5lcyBhIGxpc3QgaXRlbSB3aXRoaW4gYSBsaXN0Ci1MSU5LVGFnSW5mbz1BIG1lZGlhLWluZGVwZW5kZW50IGxpbmsKLU1BUFRhZ0luZm89RGVmaW5lcyBhIGNsaWVudC1zaWRlIGltYWdlIG1hcAotTUFSUVVFRVRhZ0luZm89RGlzcGxheXMgdGV4dCBhcyBzY3JvbGxpbmcuIE5vdCBzdXBwb3J0ZWQgYnkgVzNDIEhUTUwgNC4wMS4KLU1FTlVUYWdJbmZvPURlZmluZXMgYSBtZW51IGxpc3QKLU1FVEFUYWdJbmZvPURlZmluZXMgbWV0YWRhdGEgaW5mb3JtYXRpb24gZm9yIHRoZSBkb2N1bWVudAotTk9CUlRhZ0luZm89T3ZlcnJpZGVzIGFuZCBwcmV2ZW50cyBsaW5lIGJyZWFrcy4gTm90IHN1cHBvcnRlZCBieSBXM0MgSFRNTCA0LjAxLgotTk9GUkFNRVNUYWdJbmZvPVByb3ZpZGVzIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkgaWYgdGhlIGN1cnJlbnQgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGZyYW1lcwotTk9TQ1JJUFRUYWdJbmZvPVByb3ZpZGVzIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkgaWYgdGhlIGN1cnJlbnQgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHNjcmlwdGluZwotT0JKRUNUVGFnSW5mbz1EZWZpbmVzIGEgZ2VuZXJpYyBlbWJlZGRlZCBvYmplY3QKLU9MVGFnSW5mbz1BbiBvcmRlcmVkIGxpc3QKLU9QVEdST1VQVGFnSW5mbz1BbiBvcHRpb24gZ3JvdXAKLU9QVElPTlRhZ0luZm89QSBzZWxlY3RhYmxlIGNob2ljZQotUFRhZ0luZm89QSBwYXJhZ3JhcGgKLVBBUkFNVGFnSW5mbz1BIG5hbWVkIHByb3BlcnR5IHZhbHVlCi1QUkVUYWdJbmZvPVByZWZvcm1hdHRlZCB0ZXh0Ci1RVGFnSW5mbz1BIHNob3J0IGlubGluZSBxdW90YXRpb24KLVNUYWdJbmZvPURpc3BsYXkgdGV4dCBpbiBzdHJpa2UtdGhyb3VnaCBzdHlsZQotU0FNUFRhZ0luZm89U2FtcGxlIHByb2dyYW0gb3V0cHV0LCBzY3JpcHRzLCBldGMuIERpc3BsYXlzIGluIG1vbm9zcGFjZSBmb250LgotU0NSSVBUVGFnSW5mbz1TY3JpcHQgc3RhdGVtZW50cwotU0VMRUNUVGFnSW5mbz1BbiBvcHRpb24gc2VsZWN0b3IKLVNNQUxMVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGFzIHNtYWxsCi1TUEFOVGFnSW5mbz1BIGdlbmVyaWMgY29udGFpbmVyLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZGVmaW5pbmcgbGFuZ3VhZ2Ugb3Igc3R5bGUgZm9yIHRoZSBjb250ZW50cwotU1RSSUtFVGFnSW5mbz1EaXNwbGF5IHRleHQgaW4gc3RyaWtlLXRocm91Z2ggc3R5bGUKLVNUUk9OR1RhZ0luZm89RGlzcGxheXMgdGV4dCBhcyBzdHJvbmdseSBlbXBoYXNpemVkIChnZW5lcmFsbHkgYm9sZCkKLVNUWUxFVGFnSW5mbz1EZWZpbmVzIGEgc3R5bGUgZm9yIHRoZSBjb250YWluZWQgaW5mb3JtYXRpb24KLVNVQlRhZ0luZm89RGlzcGxheSBhcyBzdWJzY3JpcHQKLVNVUFRhZ0luZm89RGlzcGxheSBhcyBzdXBlcnNjcmlwdAotVEFCTEVUYWdJbmZvPURlZmluZXMgYSB0YWJsZQotVEJPRFlUYWdJbmZvPVRoZSBib2R5IG9mIHRoZSB0YWJsZQotVERUYWdJbmZvPUEgY2VsbCB3aXRoaW4gYSB0YWJsZQotVEVYVEFSRUFUYWdJbmZvPUEgbXVsdGktbGluZSB0ZXh0IGZpZWxkCi1URk9PVFRhZ0luZm89QSB0YWJsZSBmb290ZXIKLVRIVGFnSW5mbz1BIHRhYmxlIGhlYWRlciBjZWxsCi1USEVBRFRhZ0luZm89QSB0YWJsZSBoZWFkZXIKLVRJVExFVGFnSW5mbz1UaGUgZG9jdW1lbnQgdGl0bGUsIGRpc3BsYXllZCBpbiB0aGUgYnJvd3NlcidzIHRpdGxlIGJhcgotVFJUYWdJbmZvPUEgdGFibGUgcm93Ci1UVFRhZ0luZm89RGlzcGxheXMgdGV4dCBpbiB0ZWxldHlwZSBvciBtb25vc3BhY2VkIHRleHQgc3R5bGUKLVVUYWdJbmZvPURpc3BsYXlzIHRleHQgYXMgdW5kZXJsaW5lZAotVUxUYWdJbmZvPUFuIHVub3JkZXJlZCBsaXN0Ci1WQVJUYWdJbmZvPUFuIGluc3RhbmNlIG9mIGEgdmFyaWFibGUgb3IgcHJvZ3JhbSBhcmd1bWVudAotV0JSVGFnSW5mbz1BbGxvd3MgYSBsaW5lIGJyZWFrIHdpdGhpbiA8Qj4mbHQ7Tk9CUiZndDs8L0I+IHRhZy4gTm90IHN1cHBvcnRlZCBieSBXM0MgSFRNTCA0LjAxLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YmNkNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPGFic3RyYWN0R3JhbW1hckFubm90YXRpb25zIHByb3BlcnRpZXNMb2NhdGlvbj0iaHRtcmVmIiBjYXNlU2Vuc2l0aXZlPSJmYWxzZSI+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJBQkJSIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVBQkJSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkFDUk9OWU0iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUFDUk9OWU1UYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQUREUkVTUyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQUREUkVTU1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJBUFBMRVQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUFQUExFVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJBUkVBIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVBUkVBVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQkFTRSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQkFTRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCQVNFRk9OVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQkFTRUZPTlRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQkRPIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCRE9UYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQkdTT1VORCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQkdTT1VORFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCSUciPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJJR1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCTElOSyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQkxJTktUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQkxPQ0tRVU9URSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQkxPQ0tRVU9URVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCT0RZIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCT0RZVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkJSIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCUlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCVVRUT04iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJVVFRPTlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJDQVBUSU9OIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVDQVBUSU9OVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkNFTlRFUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQ0VOVEVSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkNJVEUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUNJVEVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQ09ERSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQ09ERVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJDT0wiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUNPTFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJDT0xHUk9VUCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQ09MR1JPVVBUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iREQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUREVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkRFTCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lREVMVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkRGTiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lREZOVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkRJUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRElSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkRJViI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRElWVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkRMIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVETFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJEVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRFRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iRU0iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUVNVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkVNQkVEIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVFTUJFRFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJGSUVMRFNFVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRklFTERTRVRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iRk9OVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRk9OVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJGT1JNIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVGT1JNVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkZSQU1FIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVGUkFNRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJGUkFNRVNFVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRlJBTUVTRVRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSDEiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUgxVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkgyIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVIMlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJIMyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSDNUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSDQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUg0VGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ikg1Ij4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVINVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJINiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSDZUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSEVBRCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSEVBRFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJIUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSFJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSFRNTCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSFRNTFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJJIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVJVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IklGUkFNRSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSUZSQU1FVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IklNRyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSU1HVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IklOUFVUIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVJTlBVVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJJTlMiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUlOU1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJJU0lOREVYIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVJU0lOREVYVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IktCRCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lS0JEVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkxBQkVMIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVMQUJFTFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJMRUdFTkQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUxFR0VORFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJMSSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTElUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTElOSyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTElOS1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJNQVAiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU1BUFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJNQVJRVUVFIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVNQVJRVUVFVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik1FTlUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU1FTlVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTUVUQSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTUVUQVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJOT0JSIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVOT0JSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik5PRlJBTUVTIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVOT0ZSQU1FU1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJOT1NDUklQVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTk9TQ1JJUFRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iT0JKRUNUIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVPQkpFQ1RUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iT0wiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU9MVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik9QVEdST1VQIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVPUFRHUk9VUFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJPUFRJT04iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU9QVElPTlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJQIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVQVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlBBUkFNIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVQQVJBTVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJQUkUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVBSRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJRIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVRVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlMiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU0FNUCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU0FNUFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTQ1JJUFQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNDUklQVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTRUxFQ1QiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNFTEVDVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTTUFMTCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU01BTExUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU1BBTiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU1BBTlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTVFJJS0UiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNUUklLRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTVFJPTkciPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNUUk9OR1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTVFlMRSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU1RZTEVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU1VCIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTVUJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU1VQIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTVVBUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVEFCTEUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRBQkxFVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRCT0RZIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVUQk9EWVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJURCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVERUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVEVYVEFSRUEiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRFWFRBUkVBVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRGT09UIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVURk9PVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJUSCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVEhUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVEhFQUQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRIRUFEVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRJVExFIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVUSVRMRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJUUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVFJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVFQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRUVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVUwiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVVMVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlZBUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVkFSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IldCUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lV0JSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotPC9hYnN0cmFjdEdyYW1tYXJBbm5vdGF0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YjZmZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi1wbHVnaW5OYW1lPVN0cnVjdHVyZWQgU291cmNlIEhUTUwgTW9kZWwKLVN0cnVjdHVyZWRfSFRNTF9Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lPVN0cnVjdHVyZWQgSFRNTCBEb2N1bWVudCBGYWN0b3J5IEV4dGVuc2lvbgotSFRNTF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1IVE1MCi1fdGFza01hcmtlci5uYW1lPUhUTUwgVGFzawotX3ZhbGlkYXRpb25NYXJrZXIubmFtZT1IVE1MIFByb2JsZW0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YzA4ZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJZGVmYXVsdD0ibm8iCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySFRNTCIKLQkJCWFzc29jaWF0ZWRDb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5lbWJlZGRlZFR5cGVIYW5kbGVyIj4KLQkJPGVtYmVkZGVkVHlwZUhhbmRsZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5FbWJlZGRlZEhUTUwiPgotCQk8L2VtYmVkZGVkVHlwZUhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXIiPgotCQk8c2Nhbm5lcgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudGFza3MuSFRNTEZpbGVUYXNrU2Nhbm5lciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGFza3MuWE1MRmlsZVRhc2tTY2FubmVyOm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGFza01hcmtlciIKLQkJCWNvbnRlbnRUeXBlSWRzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlpZD0idGFza01hcmtlciIKLQkJbmFtZT0iJV90YXNrTWFya2VyLm5hbWUiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLQkJPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRhc2ttYXJrZXIiLz4KLQkJPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KLQk8L2V4dGVuc2lvbj4KLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgaWQ9InZhbGlkYXRpb25NYXJrZXIiCi0gICAgICAgIG5hbWU9IiVfdmFsaWRhdGlvbk1hcmtlci5uYW1lIgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucHJvYmxlbW1hcmtlciIvPgotICAgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KLSAgICA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuZG9jdW1lbnRmYWN0b3JpZXMiCi0JCW5hbWU9IiVTdHJ1Y3R1cmVkX0hUTUxfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZSI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZpbGVidWZmZXJzLkJhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jb21tZW50RWxlbWVudEhhbmRsZXIiPgotCQk8aGFuZGxlci1jdXN0b20KLQkJCWNvbW1lbnR0eXBlPSJ4bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5oYW5kbGVycy5Db21tZW50RWxlbWVudEhhbmRsZXJGb3JTU0kiPgotCQkJPHN0YXJ0d2l0aCBwcmVmaXg9IiMiPjwvc3RhcnR3aXRoPgotCQk8L2hhbmRsZXItY3VzdG9tPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlLmZpbGVUeXBlcyI+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249Imh0bWwiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0iaHRtIj4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InhodG1sIj4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249Imh0cGwiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0id21sIj4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InNodG1sIj4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InNodG0iPgotCQk8L2ZpbGVUeXBlcz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXRQcm9jZXNzb3JzIj4KLQkJPHByb2Nlc3NvcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0LkhUTUxGb3JtYXRQcm9jZXNzb3JJbXBsIgotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIj4KLQkJPC9wcm9jZXNzb3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIEV4dGVuc2lvbiBwb2ludCBmb3IgdGFnaGVscCBkb2N1bWVudGF0aW9uIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5hbm5vdGF0aW9uRmlsZXMiPgotCQk8YW5ub3RhdGlvbkZpbGUKLQkJCWxvY2F0aW9uPSJkYXRhL2h0bXJlZi54bWwiCi0JCQlwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iPgotCQk8L2Fubm90YXRpb25GaWxlPgotCQk8YW5ub3RhdGlvbkZpbGUKLQkJCWxvY2F0aW9uPSJkYXRhL2h0bXJlZi54bWwiCi0JCQlwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iPgotCQk8L2Fubm90YXRpb25GaWxlPgotCQk8YW5ub3RhdGlvbkZpbGUKLQkJCWxvY2F0aW9uPSJkYXRhL2h0bXJlZi54bWwiCi0JCQlwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIEZyYW1lc2V0Ly9FTiI+Ci0JCTwvYW5ub3RhdGlvbkZpbGU+Ci0JCTxhbm5vdGF0aW9uRmlsZQotCQkJbG9jYXRpb249ImRhdGEvaHRtcmVmLnhtbCIKLQkJCXB1YmxpY0lkPSItLy9XM0MvL0RURCBYSFRNTCBCYXNpYyAxLjAvL0VOIj4KLQkJPC9hbm5vdGF0aW9uRmlsZT4KLQkJPGFubm90YXRpb25GaWxlCi0JCQlsb2NhdGlvbj0iZGF0YS9odG1yZWYueG1sIgotCQkJcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iPgotCQk8L2Fubm90YXRpb25GaWxlPgotCQk8YW5ub3RhdGlvbkZpbGUKLQkJCWxvY2F0aW9uPSJkYXRhL2h0bXJlZi54bWwiCi0JCQlwdWJsaWNJZD0iLS8vV0FQRk9SVU0vL0RURCBYSFRNTCBNb2JpbGUgMS4wLy9FTiI+Ci0JCTwvYW5ub3RhdGlvbkZpbGU+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlLmNvbnRlbnRUeXBlcyI+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0iaHRtbCxodG0seGh0bWwsaHRwbCx3bWwsc2h0bWwsc2h0bSIKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJbmFtZT0iJUhUTUxfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUudGV4dCI+Ci0JCQk8IS0tIG5vdGU6IG5vIGRlZmF1bHQtY2hhcnNldCBmb3IgSFRNTCwgc2hvdWxkIHVzZSAncGxhdGZvcm0nIC0tPgotCQkJPGRlc2NyaWJlcgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkNvbnRlbnREZXNjcmliZXJGb3JIVE1MIiAvPgotCQk8L2NvbnRlbnQtdHlwZT4KLQk8L2V4dGVuc2lvbj4KLQotPCEtLSBtb3ZlZCB0byB3aGVyZSB0aGUgZHRkJ3MgYXJlIGNvbnRyaWJ1dGVkCi0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnRUeXBlcyI+Ci0JCTxkb2N1bWVudFR5cGUKLQkJCWVsZW1lbnROYW1lPSJodG1sIgotCQkJZGlzcGxheU5hbWU9IlhIVE1MIDEuMCBTdHJpY3QiCi0JCQluYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0JCQlpc1hIVE1MPSJ0cnVlIgotCQkJaGFzRnJhbWVzZXQ9ImZhbHNlIgotCQkJcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotCQkJc3lzdGVtSUQ9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotCQk8L2RvY3VtZW50VHlwZT4KLQkJPGRvY3VtZW50VHlwZQotCQkJZWxlbWVudE5hbWU9Imh0bWwiCi0JCQlkaXNwbGF5TmFtZT0iWEhUTUwgMS4wIFRyYW5zaXRpb25hbCIKLQkJCW5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLQkJCWlzWEhUTUw9InRydWUiCi0JCQloYXNGcmFtZXNldD0iZmFsc2UiCi0JCQlwdWJsaWNJRD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JCQlkZWZhdWx0WEhUTUw9InRydWUiCi0JCQlzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0JCTwvZG9jdW1lbnRUeXBlPgotCQk8ZG9jdW1lbnRUeXBlCi0JCQllbGVtZW50TmFtZT0iaHRtbCIKLQkJCWRpc3BsYXlOYW1lPSJYSFRNTCAxLjAgRnJhbWVzZXQiCi0JCQluYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0JCQlpc1hIVE1MPSJ0cnVlIgotCQkJaGFzRnJhbWVzZXQ9InRydWUiCi0JCQlwdWJsaWNJRD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIEZyYW1lc2V0Ly9FTiIKLQkJCXN5c3RlbUlEPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1mcmFtZXNldC5kdGQiPgotCQk8L2RvY3VtZW50VHlwZT4KLQkJPGRvY3VtZW50VHlwZQotCQkJZWxlbWVudE5hbWU9Imh0bWwiCi0JCQlkaXNwbGF5TmFtZT0iWEhUTUwgQmFzaWMgMS4wIgotCQkJbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCQkJaXNYSFRNTD0idHJ1ZSIKLQkJCWhhc0ZyYW1lc2V0PSJmYWxzZSIKLQkJCXB1YmxpY0lEPSItLy9XM0MvL0RURCBYSFRNTCBCYXNpYyAxLjAvL0VOIgotCQkJc3lzdGVtSUQ9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLWJhc2ljL3hodG1sLWJhc2ljMTAuZHRkIj4KLQkJPC9kb2N1bWVudFR5cGU+Ci0JCTxkb2N1bWVudFR5cGUKLQkJCWVsZW1lbnROYW1lPSJodG1sIgotCQkJZGlzcGxheU5hbWU9IlhIVE1MIDEuMSIKLQkJCW5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLQkJCWlzWEhUTUw9InRydWUiCi0JCQloYXNGcmFtZXNldD0iZmFsc2UiCi0JCQlwdWJsaWNJRD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiIKLQkJCXN5c3RlbUlEPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDExL0RURC94aHRtbDExLmR0ZCI+Ci0JCTwvZG9jdW1lbnRUeXBlPgotCQk8ZG9jdW1lbnRUeXBlCi0JCQllbGVtZW50TmFtZT0iaHRtbCIKLQkJCWRpc3BsYXlOYW1lPSJYSFRNTCBNUCAxLjAiCi0JCQluYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0JCQlpc1hIVE1MPSJ0cnVlIgotCQkJaGFzRnJhbWVzZXQ9ImZhbHNlIgotCQkJcHVibGljSUQ9Ii0vL1dBUEZPUlVNLy9EVEQgWEhUTUwgTW9iaWxlIDEuMC8vRU4iCi0JCQlzeXN0ZW1JRD0iaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3hodG1sLW1vYmlsZTEwLmR0ZCI+Ci0JCTwvZG9jdW1lbnRUeXBlPgotCQk8ZG9jdW1lbnRUeXBlCi0JCQllbGVtZW50TmFtZT0id21sIgotCQkJZGlzcGxheU5hbWU9IldNTCAxLjMiCi0JCQluYW1lc3BhY2VVUkk9IiIKLQkJCWlzV01MPSJ0cnVlIgotCQkJaGFzRnJhbWVzZXQ9ImZhbHNlIgotCQkJcHVibGljSUQ9Ii0vL1dBUEZPUlVNLy9EVEQgV01MIDEuMy8vRU4iCi0JCQlkZWZhdWx0V01MPSJ0cnVlIgotCQkJc3lzdGVtSUQ9Imh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC93bWwxMy5kdGQiPgotCQk8L2RvY3VtZW50VHlwZT4KLQk8L2V4dGVuc2lvbj4KLS0tPgotCTwhLS0gaW5pdGlhbGl6ZSBodG1sIGNvcmUgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvbnRlbnRCdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvbnRlbnRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMzNmMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb250ZW50QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01Db250ZW50QnVpbGRlckltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEhUTUxDb250ZW50QnVpbGRlciBleHRlbmRzIERPTUNvbnRlbnRCdWlsZGVySW1wbCB7Ci0KLQlwcml2YXRlIGludCBmVGFnQ2FzZTsKLQlwcml2YXRlIGludCBmQXR0ckNhc2U7Ci0KLQkvKioKLQkgKiBET01Db250ZW50QnVpbGRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBkb2N1bWVudCBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBIVE1MQ29udGVudEJ1aWxkZXIoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc3VwZXIoZG9jdW1lbnQpOwotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlmVGFnQ2FzZSA9IHByZWZzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFKTsKLQkJZkF0dHJDYXNlID0gcHJlZnMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJfTkFNRV9DQVNFKTsKLQkJLy8JRWxlbWVudCBjYXNlU2V0dGluZ3MgPSBIVE1MUHJlZmVyZW5jZU1hbmFnZXIuZ2V0SFRNTEluc3RhbmNlKCkuZ2V0RWxlbWVudChQcmVmZXJlbmNlTmFtZXMuUFJFRkVSUkVEX0NBU0UpOwotCQkvLwlmVGFnQ2FzZSA9IGNhc2VTZXR0aW5ncy5nZXRBdHRyaWJ1dGUoUHJlZmVyZW5jZU5hbWVzLlRBR05BTUUpOwotCQkvLwlmQXR0ckNhc2UgPSBjYXNlU2V0dGluZ3MuZ2V0QXR0cmlidXRlKFByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVOQU1FKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNvbXB1dGVOYW1lKENNTm9kZSBjbW5vZGUsIE5vZGUgcGFyZW50KSB7Ci0JCVN0cmluZyBuYW1lID0gc3VwZXIuY29tcHV0ZU5hbWUoY21ub2RlLCBwYXJlbnQpOwotCQkvLyBkb24ndCBjaGFuZ2UgdGhlIGNhc2UgdW5sZXNzIHdlJ3JlIGNlcnRhaW4gaXQgaXMgbWVhbmluZ2xlc3MKLQkJLy8JaWYgKGNtbm9kZSBpbnN0YW5jZW9mIEhUTUxDTU5vZGUgJiYgKChIVE1MQ01Ob2RlKSBjbW5vZGUpLnNob3VsZElnbm9yZUNhc2UoKSkgewotCQlpZiAoc2hvdWxkSWdub3JlQ2FzZShjbW5vZGUpKSB7Ci0JCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pIHsKLQkJCQlpZiAoZlRhZ0Nhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJZWxzZSBpZiAoZlRhZ0Nhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJLy8gZWxzZSBkbyBub3RoaW5nCi0JCQl9Ci0JCQllbHNlIGlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJaWYgKGZBdHRyQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCQkJbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJCQllbHNlIGlmIChmQXR0ckNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJLy8gZWxzZSBkbyBub3RoaW5nCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkSWdub3JlQ2FzZShDTU5vZGUgY21ub2RlKSB7Ci0JCWlmICghY21ub2RlLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoQm9vbGVhbikgY21ub2RlLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZjkzYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBIVE1MIENvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fZXJyb3JfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmRlZmluZWRfYXR0cmlidXRlX25hbWVfX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5kZWZpbmVkX2F0dHJpYnV0ZV92YWx1ZV9fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpcGxlX3ZhbHVlc19zcGVjaWZpZWRfX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfbmFtZV9fXzBfX191c2VzX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9fXzBfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfYXR0cmlidXRlX19fMF9fX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF9sb2NhdGlvbl9vZl90YWdfX19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIER1cGxpY2F0ZV90YWdfX18wX19fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb19zdGFydF90YWdfX19fMF9fX19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vX2VuZF90YWdfX19fXzBfX19fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmRfdGFnX19fX18wX19fX25vdF9uZWVkZV9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5rbm93bl90YWdfX18wX19fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfbmFtZV9fXzBfX191c2VzX3dyb25nX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF90YWdfbmFtZV9fXzBfX19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfSlNQX2RpcmVjdGl2ZV9fXzBfX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX3RleHRfc3RyaW5nX19fMF9fX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF9jaGFyYWN0ZXJfdXNlZF9pbl9fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVua25vd25fZXJyb3JfX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFydF90YWdfX19fMF9fX19ub3RfY2xvc19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kX3RhZ19fX19fMF9fX19ub3RfY2xvc2VfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV92YWx1ZV9fXzBfX191c2VzX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tZW50X25vdF9jbG9zZWRfX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBET0NUWVBFX2RlY2xhcmF0aW9uX25vdF9jbF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc2luZ19pbnN0cnVjdGlvbl9ub3RfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENEQVRBX3NlY3Rpb25fbm90X2Nsb3NlZF9fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9UYWdfX18wX19fc2hvdWxkX2JlX2FuX2VtcHR5X2VsZW1lbnRfdGFnXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0F0dHJpYnV0ZV92YWx1ZV9fXzBfX19ub3RfY2xvc2VkX18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfUmVzb3VyY2Vfbm90X2ZvdW5kXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Jzb2xldGVfYXR0cmlidXRlX25hbWVfX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Jzb2xldGVfdGFnX19fRVJST1JfOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEhUTUxDb3JlTWVzc2FnZXMuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIEhUTUxDb3JlTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhNDg2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBIVE1MQ29yZVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEhUTUxDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhUTUxDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0KLQkJLy8gbGlzdGVuIGZvciByZXNvdXJjZSBjaGFuZ2VzIHRvIHVwZGF0ZSBjb250ZW50IHByb3BlcnRpZXMga2V5cwotCQlIVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLnN0YXJ0dXAoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHN0b3AgbGlzdGVubmluZyBmb3IgcmVzb3VyY2UgY2hhbmdlcyB0byB1cGRhdGUgY29udGVudCBwcm9wZXJ0aWVzCi0JCS8vIGtleXMKLQkJSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5zaHV0ZG93bigpOwotCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwMTkzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLU5vX2Vycm9yX19VSV89Tm8gZXJyb3IuCi1VbmRlZmluZWRfYXR0cmlidXRlX25hbWVfX19FUlJPUl89VW5kZWZpbmVkIGF0dHJpYnV0ZSBuYW1lICh7MH0pLgotVW5kZWZpbmVkX2F0dHJpYnV0ZV92YWx1ZV9fRVJST1JfPVVuZGVmaW5lZCBhdHRyaWJ1dGUgdmFsdWUgKHswfSkuCi1NdWx0aXBsZV92YWx1ZXNfc3BlY2lmaWVkX19FUlJPUl89TXVsdGlwbGUgdmFsdWVzIHNwZWNpZmllZCBmb3IgYW4gYXR0cmlidXRlICh7MH0pLgotQXR0cmlidXRlX25hbWVfX18wX19fdXNlc19fRVJST1JfPUF0dHJpYnV0ZSBuYW1lICh7MH0pIHVzZXMgd3JvbmcgY2FzZSBjaGFyYWN0ZXIuCi1JbnZhbGlkX2F0dHJpYnV0ZV9uYW1lX19fMF9FUlJPUl89SW52YWxpZCBhdHRyaWJ1dGUgbmFtZSAoezB9KS4KLUludmFsaWRfYXR0cmlidXRlX19fMF9fX19FUlJPUl89SW52YWxpZCBhdHRyaWJ1dGUgKHswfSkuCi1JbnZhbGlkX2xvY2F0aW9uX29mX3RhZ19fX19FUlJPUl89SW52YWxpZCBsb2NhdGlvbiBvZiB0YWcgKHswfSkuCi1EdXBsaWNhdGVfdGFnX19fMF9fX19FUlJPUl89RHVwbGljYXRlIHRhZyAoezB9KS4KLU5vX3N0YXJ0X3RhZ19fX18wX19fX19FUlJPUl89Tm8gc3RhcnQgdGFnICg8ezB9PikuCi1Ob19lbmRfdGFnX19fX18wX19fX19FUlJPUl89Tm8gZW5kIHRhZyAoPC97MH0+KS4KLUVuZF90YWdfX19fXzBfX19fbm90X25lZWRlX0VSUk9SXz1FbmQgdGFnICg8L3swfT4pIG5vdCBuZWVkZWQuCi1Vbmtub3duX3RhZ19fXzBfX19fRVJST1JfPVVua25vd24gdGFnICh7MH0pLgotVGFnX25hbWVfX18wX19fdXNlc193cm9uZ19fRVJST1JfPVRhZyBuYW1lICh7MH0pIHVzZXMgd3JvbmcgY2FzZSBjaGFyYWN0ZXIuCi1JbnZhbGlkX3RhZ19uYW1lX19fMF9fX19FUlJPUl89SW52YWxpZCB0YWcgbmFtZSAoezB9KS4KLUludmFsaWRfSlNQX2RpcmVjdGl2ZV9fXzBfX0VSUk9SXz1JbnZhbGlkIEpTUCBkaXJlY3RpdmUgKHswfSkuCi1JbnZhbGlkX3RleHRfc3RyaW5nX19fMF9fX19FUlJPUl89SW52YWxpZCB0ZXh0IHN0cmluZyAoezB9KS4KLUludmFsaWRfY2hhcmFjdGVyX3VzZWRfaW5fX0VSUk9SXz1JbnZhbGlkIGNoYXJhY3RlciB1c2VkIGluIHRleHQgc3RyaW5nICh7MH0pLgotVW5rbm93bl9lcnJvcl9fRVJST1JfPVVua25vd24gZXJyb3IuCi1TdGFydF90YWdfX19fMF9fX19ub3RfY2xvc19FUlJPUl89U3RhcnQgdGFnICg8ezB9Pikgbm90IGNsb3NlZCBwcm9wZXJseSwgZXhwZWN0ZWQgJz4nLgotRW5kX3RhZ19fX19fMF9fX19ub3RfY2xvc2VfRVJST1JfPUVuZCB0YWcgKDwvezB9Pikgbm90IGNsb3NlZCBwcm9wZXJseSwgZXhwZWN0ZWQgJz4nLgotQXR0cmlidXRlX3ZhbHVlX19fMF9fX3VzZXNfRVJST1JfPUF0dHJpYnV0ZSB2YWx1ZSAoezB9KSB1c2VzIHdyb25nIGNhc2UgY2hhcmFjdGVyLgotQ29tbWVudF9ub3RfY2xvc2VkX19FUlJPUl89Q29tbWVudCBub3QgY2xvc2VkLgotRE9DVFlQRV9kZWNsYXJhdGlvbl9ub3RfY2xfRVJST1JfPURPQ1RZUEUgZGVjbGFyYXRpb24gbm90IGNsb3NlZC4KLVByb2Nlc3NpbmdfaW5zdHJ1Y3Rpb25fbm90X0VSUk9SXz1Qcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vdCBjbG9zZWQuCi1DREFUQV9zZWN0aW9uX25vdF9jbG9zZWRfX0VSUk9SXz1DREFUQSBzZWN0aW9uIG5vdCBjbG9zZWQuCi0jIEZyb20gaGVyZSwgdGhlIG5ldyBtZXNzYWdlcyBhcmUgYWRkZWQgZm9yIFY1Ci1fRVJST1JfVGFnX19fMF9fX3Nob3VsZF9iZV9hbl9lbXB0eV9lbGVtZW50X3RhZ18xPVRhZyAoezB9KSBzaG91bGQgYmUgYW4gZW1wdHktZWxlbWVudCB0YWcuCi1fRVJST1JfQXR0cmlidXRlX3ZhbHVlX19fMF9fX25vdF9jbG9zZWRfXzE9QXR0cmlidXRlIHZhbHVlICh7MH0pIG5vdCBjbG9zZWQuCi0jCi1IVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nPVVwZGF0aW5nIFdlYiBDb250ZW50IFNldHRpbmdzCi1IVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1Byb2JsZW1zX1VwZGF0aW5nPVByb2JsZW0gc2F2aW5nIFdlYiBDb250ZW50IFNldHRpbmdzIGZvciB7MH0KLV9FUlJPUl9SZXNvdXJjZV9ub3RfZm91bmRfMD1SZXNvdXJjZSBub3QgZm91bmQ6IHswfQotT2Jzb2xldGVfYXR0cmlidXRlX25hbWVfX19FUlJPUl89QXR0cmlidXRlICh7MH0pIGlzIG9ic29sZXRlLiBJdHMgdXNlIGlzIGRpc2NvdXJhZ2VkIGluIEhUTUw1IGRvY3VtZW50cy4KLU9ic29sZXRlX3RhZ19fX0VSUk9SXz1FbGVtZW50ICh7MH0pIGlzIG9ic29sZXRlLiBJdHMgdXNlIGlzIGRpc2NvdXJhZ2VkIGluIEhUTUw1IGRvY3VtZW50cy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NDc5NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYgZGVzaXJlZCwKLSAqIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzIHBsdWdpbi4gT3RoZXIKLSAqIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiBAcGFyYW0gbGV2ZWwgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiBAcGFyYW0gbWVzc2FnZSB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5IGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQWJzdHJhY3ROb2RlQ2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0Fic3RyYWN0Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MzU2MTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQWJzdHJhY3ROb2RlQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROb2RlQ2xlYW51cEhhbmRsZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIHsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBmQ2xlYW51cFByZWZlcmVuY2VzID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQotCXB1YmxpYyB2b2lkIHNldENsZWFudXBQcmVmZXJlbmNlcyhJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBjbGVhbnVwUHJlZmVyZW5jZXMpIHsKLQotCQlmQ2xlYW51cFByZWZlcmVuY2VzID0gY2xlYW51cFByZWZlcmVuY2VzOwotCX0KLQotCi0JcHVibGljIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGdldENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZDbGVhbnVwUHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzKCk7Ci0JCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRUYWdOYW1lQ2FzZShwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRBdHRyTmFtZUNhc2UocHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0SW5zZXJ0UmVxdWlyZWRBdHRycyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0SW5zZXJ0TWlzc2luZ1RhZ3MocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRRdW90ZUF0dHJWYWx1ZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Rm9ybWF0U291cmNlKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSkpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Q29udmVydEVPTENvZGVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEVPTENvZGUocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmQ2xlYW51cFByZWZlcmVuY2VzOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0KLQkJZlByb2dyZXNzTW9uaXRvciA9IHByb2dyZXNzTW9uaXRvcjsKLQl9Ci0KLQlzdGF0aWMgcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGxhY2VTb3VyY2UoSURPTU1vZGVsIG1vZGVsLCBPYmplY3QgcmVxdWVzdGVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc291cmNlKSB7Ci0KLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlzb3VyY2UgPSBuZXcgU3RyaW5nKCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQuY29udGFpbnNSZWFkT25seShvZmZzZXQsIGxlbmd0aCkpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlpZiAocmVxdWVzdGVyID09IG51bGwpIHsKLQkJCXJlcXVlc3RlciA9IHN0cnVjdHVyZWREb2N1bWVudDsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHJlcXVlc3Rlciwgb2Zmc2V0LCBsZW5ndGgsIHNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NUZXh0Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NUZXh0Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMmIyNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQ1NTVGV4dE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8vIG5ha2Ftb3JpX1RPRE86IGNoZWNrIGFuZCByZW1vdmUKLQotcHVibGljIGNsYXNzIENTU1RleHROb2RlQ2xlYW51cEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdE5vZGVDbGVhbnVwSGFuZGxlciB7Ci0KLQlwdWJsaWMgTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG5vZGU7Ci0JCUlET01Nb2RlbCBtb2RlbCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG5vZGU7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBub2RlOwotCQlpZiAoICFnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKS5nZXRGb3JtYXRTb3VyY2UoKSkKLQkJCXJldHVybiBub2RlOwotCQkKLQkJU3RyaW5nIGNvbnRlbnQgPSBnZXRDU1NDb250ZW50KG5vZGUpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuIG5vZGU7Ci0KLQkJaW50IG9mZnNldCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSAoKElET01Ob2RlKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIG9mZnNldDsKLQkJcmVwbGFjZVNvdXJjZShtb2RlbCwgdGhpcywgb2Zmc2V0LCBsZW5ndGgsIGNvbnRlbnQpOwotCQlyZXR1cm4gKElET01Ob2RlKSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q1NTQ29udGVudChOb2RlIHRleHQpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0Q1NTTW9kZWwodGV4dCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlDU1NOb2RlIGRvY3VtZW50ID0gbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudDsKLQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IChDU1NTb3VyY2VGb3JtYXR0ZXIpIG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoQ1NTU291cmNlRm9ybWF0dGVyLmNsYXNzKTsKLQkJLy8gdHJ5IGFub3RoZXIgd2F5IHRvIGdldCBmb3JtYXR0ZXIKLQkJaWYgKGZvcm1hdHRlciA9PSBudWxsKQotCQkJZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcihub3RpZmllcik7Ci0JCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gZm9ybWF0dGVyLmNsZWFudXAoZG9jdW1lbnQpOwotCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSUNTU01vZGVsIGdldENTU01vZGVsKE5vZGUgdGV4dCkgewotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgdGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3R5bGVTaGVldEFkYXB0ZXIpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHlsZVNoZWV0QWRhcHRlciBzdHlsZUFkYXB0ZXIgPSAoSVN0eWxlU2hlZXRBZGFwdGVyKSBhZGFwdGVyOwotCQlyZXR1cm4gc3R5bGVBZGFwdGVyLmdldE1vZGVsKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0VsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0VsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQxZGZhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9FbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIgKEludGFsaW9uKSAtIENsZWFudXAgUmVwZWF0ZWQgQ29uZGl0aW9uYWwgY2hlY2sgaW4gaXNYTUxUeXBlIG1ldGhvZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vLyBuYWthbW9yaV9UT0RPOiBjaGVjayBhbmQgcmVtb3ZlIENTUyBmb3JtYXR0aW5nCi0KLXB1YmxpYyBjbGFzcyBFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3ROb2RlQ2xlYW51cEhhbmRsZXIgewotCi0JLyoqIE5vbi1OTFMgc3RyaW5ncyAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RBR19PUEVOID0gIjwiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX1RBR19PUEVOID0gIjwvIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DTE9TRSA9ICI+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1RBR19DTE9TRSA9ICIvPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfUVVPVEVTID0gIicnIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRV9RVU9URVMgPSAiXCJcIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgU0lOR0xFX1FVT1RFID0gJ1wnJzsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfUVVPVEUgPSAnXCInOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSkgewotCQlJRE9NTm9kZSByZW5hbWVkTm9kZSA9IChJRE9NTm9kZSkgY2xlYW51cENoaWxkcmVuKG5vZGUpOwotCi0JCS8vIGNhbGwgcXVvdGVBdHRyVmFsdWUoKSBmaXJzdCBzbyBpdCB3aWxsIGNsb3NlIGFueSB1bmNsb3NlZCBhdHRyCi0JCS8vIHF1b3RlQXR0clZhbHVlKCkgd2lsbCByZXR1cm4gdGhlIG5ldyBzdGFydCB0YWcgaWYgdGhlcmUgaXMgYQotCQkvLyBzdHJ1Y3R1cmUgY2hhbmdlCi0JCXJlbmFtZWROb2RlID0gcXVvdGVBdHRyVmFsdWUocmVuYW1lZE5vZGUpOwotCi0JCS8vIGluc2VydCB0YWcgY2xvc2UgaWYgbWlzc2luZwotCQkvLyBpZiBub2RlIGlzIG5vdCBjb21tZW50IHRhZwotCQkvLyBhbmQgbm90IGltcGxpY2l0IHRhZwotCQlpZiAoISgoSURPTUVsZW1lbnQpIHJlbmFtZWROb2RlKS5pc0NvbW1lbnRUYWcoKSAmJiAocmVuYW1lZE5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSkgewotCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IHJlbmFtZWROb2RlLmdldE1vZGVsKCk7Ci0KLQkJCS8vIHNhdmUgc3RhcnQgb2Zmc2V0IGJlZm9yZSBpbnNlcnRUYWdDbG9zZSgpCi0JCQkvLyBvciBlbHNlIHJlbmFtZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgd2lsbCBiZSB6ZXJvIGlmCi0JCQkvLyByZW5hbWVkTm9kZSByZXBsYWNlZCBieSBpbnNlcnRUYWdDbG9zZSgpCi0JCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IHJlbmFtZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCS8vIGZvciBzdGFydCB0YWcKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSByZW5hbWVkTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaW5zZXJ0VGFnQ2xvc2Uoc3RydWN0dXJlZE1vZGVsLCBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJCS8vIHVwZGF0ZSByZW5hbWVkTm9kZSBhbmQgc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYWZ0ZXIKLQkJCS8vIGluc2VydFRhZ0Nsb3NlKCkKLQkJCXJlbmFtZWROb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsKLQkJCXN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gcmVuYW1lZE5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkJLy8gZm9yIGVuZCB0YWcKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gcmVuYW1lZE5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCWluc2VydFRhZ0Nsb3NlKHN0cnVjdHVyZWRNb2RlbCwgZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCi0JCS8vIGNhbGwgaW5zZXJ0TWlzc2luZ1RhZ3MoKSBuZXh0LCBpdCB3aWxsIGdlbmVyYXRlIGltcGxpY2l0IHRhZ3MgaWYKLQkJLy8gdGhlcmUgYXJlIGFueQotCQkvLyBpbnNlcnRNaXNzaW5nVGFncygpIHdpbGwgcmV0dXJuIHRoZSBuZXcgbWlzc2luZyBzdGFydCB0YWcgaWYgb25lIGlzCi0JCS8vIG1pc3NpbmcKLQkJLy8gdGhlbiBjb21wcmVzcyBhbnkgZW1wdHkgZWxlbWVudCB0YWdzCi0JCS8vIGFwcGx5VGFnTmFtZUNhc2UoKSB3aWxsIHJldHVybiB0aGUgcmVuYW1lZCBub2RlLgotCQkvLyBUaGUgcmVuYW1lZC9uZXcgbm9kZSB3aWxsIGJlIHNhdmVkIGFuZCByZXR1cm5lZCB0byBjYWxsZXIgd2hlbiBhbGwKLQkJLy8gY2xlYW51cCBpcyBkb25lLgotCQlyZW5hbWVkTm9kZSA9IGluc2VydE1pc3NpbmdUYWdzKHJlbmFtZWROb2RlKTsKLQkJcmVuYW1lZE5vZGUgPSBjb21wcmVzc0VtcHR5RWxlbWVudFRhZyhyZW5hbWVkTm9kZSk7Ci0JCXJlbmFtZWROb2RlID0gaW5zZXJ0UmVxdWlyZWRBdHRycyhyZW5hbWVkTm9kZSk7Ci0JCXJlbmFtZWROb2RlID0gYXBwbHlUYWdOYW1lQ2FzZShyZW5hbWVkTm9kZSk7Ci0JCWFwcGx5QXR0ck5hbWVDYXNlKHJlbmFtZWROb2RlKTsKLQkJY2xlYW51cENTU0F0dHJWYWx1ZShyZW5hbWVkTm9kZSk7Ci0KLQkJcmV0dXJuIHJlbmFtZWROb2RlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBjbGVhbnVwIHNob3VsZCBtb2RpZnkgY2FzZS4gUmV0dXJucyB0cnVlIGNhc2Ugc2hvdWxkIGJlCi0JICogcHJlc2VydmVkLCBmYWxzZSBvdGhlcndpc2UuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRydWUgaWYgZWxlbWVudCBpcyBjYXNlIHNlbnNpdGl2ZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFByZXNlcnZlQ2FzZShJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIGNhc2Ugb3B0aW9uIGNhbiBiZSBhcHBsaWVkIHRvIG5vIG5hbWVzcGFjZSB0YWdzCi0JCXJldHVybiAhZWxlbWVudC5pc0dsb2JhbFRhZygpOwotCQkvKgotCQkgKiBNb2RlbFF1ZXJ5QWRhcHRlciBtcWFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpCi0JCSAqIGVsZW1lbnQuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7IE1vZGVsUXVlcnkgbXEgPQotCQkgKiBudWxsOyBDTU5vZGUgbm9kZWRlY2wgPSBudWxsOyBpZiAobXFhZGFwdGVyICE9IG51bGwpIG1xID0KLQkJICogbXFhZGFwdGVyLmdldE1vZGVsUXVlcnkoKTsgaWYgKG1xICE9IG51bGwpIG5vZGVkZWNsID0KLQkJICogbXEuZ2V0Q01Ob2RlKG5vZGUpOyAvLyBpZiBhIE5vZGUgaXNuJ3QgcmVjb2duaXplZCBhcyBIVE1MIG9yIGlzIGFuZAotCQkgKiBjYXJlcyBhYm91dCBjYXNlLCBkbyBub3QgYWx0ZXIgaXQgLy8gaWYgKG5vZGVkZWNsID09IG51bGwgfHwKLQkJICogKG5vZGVkZWNsIGluc3RhbmNlb2YgSFRNTENNTm9kZSAmJiAoKEhUTUxDTU5vZGUpCi0JCSAqIG5vZGVkZWNsKS5zaG91bGRJZ25vcmVDYXNlKCkpKSBpZiAoIQotCQkgKiBub2RlZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHJldHVybgotCQkgKiBmYWxzZTsgcmV0dXJuCi0JCSAqICgoQm9vbGVhbiljbW5vZGUuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKS5ib29sZWFuVmFsdWUoKTsKLQkJICovCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGNsZWFudXAgc2hvdWxkIGZvcmNlIG1vZGlmeWluZyBlbGVtZW50IG5hbWUgdG8gYWxsIGxvd2VyY2FzZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBjbGVhbnVwIHNob3VsZCBsb3dlcmNhc2UgZWxlbWVudCBuYW1lLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxUYWcoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudC5pc1hNTFRhZygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFwcGx5QXR0ck5hbWVDYXNlKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm47IC8vIGRvIG5vdGhpbmcKLQotCQlpbnQgYXR0ck5hbWVDYXNlID0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVNJUzsKLQkJaWYgKCFzaG91bGRQcmVzZXJ2ZUNhc2UoZWxlbWVudCkpIHsKLQkJCWlmIChpc1hNTFRhZyhlbGVtZW50KSkKLQkJCQlhdHRyTmFtZUNhc2UgPSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUjsKLQkJCWVsc2UKLQkJCQlhdHRyTmFtZUNhc2UgPSBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKS5nZXRBdHRyTmFtZUNhc2UoKTsKLQkJfQotCi0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWludCBhdHRyaWJ1dGVzTGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNMZW5ndGg7IGkrKykgewotCQkJSURPTU5vZGUgZWFjaEF0dHIgPSAoSURPTU5vZGUpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCWlmIChoYXNOZXN0ZWRSZWdpb24oZWFjaEF0dHIuZ2V0TmFtZVJlZ2lvbigpKSkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyBvbGRBdHRyTmFtZSA9IGVhY2hBdHRyLmdldE5vZGVOYW1lKCk7Ci0JCQlTdHJpbmcgbmV3QXR0ck5hbWUgPSBvbGRBdHRyTmFtZTsKLQkJCS8qCi0JCQkgKiAyNTQ5NjEgLSBhbGwgSFRNTCB0YWcgbmFtZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcyBzaG91bGQgYmUgaW4KLQkJCSAqIEVuZ2xpc2ggZXZlbiBmb3IgSFRNTCBmaWxlcyBpbiBvdGhlciBsYW5ndWFnZXMgbGlrZSBKYXBhbmVzZSBvcgotCQkJICogVHVya2lzaC4gRW5nbGlzaCBsb2NhbGUgc2hvdWxkIGJlIHVzZWQgdG8gY29udmVydCBiZXR3ZWVuCi0JCQkgKiB1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSAob3RoZXJ3aXNlICJsaW5rIiB3b3VsZCBiZSBjb252ZXJ0ZWQgdG8KLQkJCSAqIFR1cmtpc2ggIkkgT3ZlcmRvdCBDYXBpdGFsIikuCi0JCQkgKi8KLQkJCWlmIChhdHRyTmFtZUNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQkJbmV3QXR0ck5hbWUgPSBvbGRBdHRyTmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOwotCQkJZWxzZSBpZiAoYXR0ck5hbWVDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCW5ld0F0dHJOYW1lID0gb2xkQXR0ck5hbWUudG9VcHBlckNhc2UoTG9jYWxlLlVTKTsKLQotCQkJaWYgKG5ld0F0dHJOYW1lLmNvbXBhcmVUbyhvbGRBdHRyTmFtZSkgIT0gMCkgewotCQkJCWludCBhdHRyTmFtZVN0YXJ0T2Zmc2V0ID0gZWFjaEF0dHIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgYXR0ck5hbWVMZW5ndGggPSBvbGRBdHRyTmFtZS5sZW5ndGgoKTsKLQotCQkJCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgYXR0ck5hbWVTdGFydE9mZnNldCwgYXR0ck5hbWVMZW5ndGgsIG5ld0F0dHJOYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRydWUgaWYgY29udGFpbmVyIGhhcyBuZXN0ZWQgcmVnaW9ucywgbWVhbmluZyBjb250YWluZXIgaXMgcHJvYmFibHkgdG9vCi0JICogY29tcGxpY2F0ZWQgKGxpa2UgSlNQIHJlZ2lvbnMpIHRvIHZhbGlkYXRlIHdpdGggdGhpcyB2YWxpZGF0b3IuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc05lc3RlZFJlZ2lvbihJVGV4dFJlZ2lvbiBjb250YWluZXIpIHsKLQkJaWYgKCEoY29udGFpbmVyIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIGNvbnRhaW5lcikuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURPTU5vZGUgYXBwbHlUYWdOYW1lQ2FzZShJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKQotCQkJcmV0dXJuIG5vZGU7IC8vIGRvIG5vdGhpbmcKLQotCQlpbnQgdGFnTmFtZUNhc2UgPSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTOwotCi0JCWlmICghc2hvdWxkUHJlc2VydmVDYXNlKGVsZW1lbnQpKSB7Ci0JCQlpZiAoaXNYTUxUYWcoZWxlbWVudCkpCi0JCQkJdGFnTmFtZUNhc2UgPSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUjsKLQkJCWVsc2UKLQkJCQl0YWdOYW1lQ2FzZSA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldFRhZ05hbWVDYXNlKCk7Ci0JCX0KLQotCQlTdHJpbmcgb2xkVGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJU3RyaW5nIG5ld1RhZ05hbWUgPSBvbGRUYWdOYW1lOwotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQkvKgotCQkgKiAyNTQ5NjEgLSBhbGwgSFRNTCB0YWcgbmFtZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcyBzaG91bGQgYmUgaW4KLQkJICogRW5nbGlzaCBldmVuIGZvciBIVE1MIGZpbGVzIGluIG90aGVyIGxhbmd1YWdlcyBsaWtlIEphcGFuZXNlIG9yCi0JCSAqIFR1cmtpc2guIEVuZ2xpc2ggbG9jYWxlIHNob3VsZCBiZSB1c2VkIHRvIGNvbnZlcnQgYmV0d2VlbiB1cHBlcmNhc2UKLQkJICogYW5kIGxvd2VyY2FzZSAob3RoZXJ3aXNlICJsaW5rIiB3b3VsZCBiZSBjb252ZXJ0ZWQgdG8gVHVya2lzaCAiSQotCQkgKiBPdmVyZG90IENhcGl0YWwiKS4KLQkJICovCi0JCWlmICh0YWdOYW1lQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCW5ld1RhZ05hbWUgPSBvbGRUYWdOYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7Ci0JCWVsc2UgaWYgKHRhZ05hbWVDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJbmV3VGFnTmFtZSA9IG9sZFRhZ05hbWUudG9VcHBlckNhc2UoTG9jYWxlLlVTKTsKLQotCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlpZiAocmVnaW9ucyAhPSBudWxsICYmIHJlZ2lvbnMuc2l6ZSgpID4gMCkgewotCQkJCUlUZXh0UmVnaW9uIHN0YXJ0VGFnTmFtZVJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDEpOwotCQkJCWludCBzdGFydFRhZ05hbWVTdGFydE9mZnNldCA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHN0YXJ0VGFnTmFtZVJlZ2lvbik7Ci0JCQkJaW50IHN0YXJ0VGFnTmFtZUxlbmd0aCA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQoc3RhcnRUYWdOYW1lUmVnaW9uKSAtIHN0YXJ0VGFnTmFtZVN0YXJ0T2Zmc2V0OwotCi0JCQkJaWYgKCFuZXdUYWdOYW1lLmVxdWFscyhvbGRUYWdOYW1lKSkKLQkJCQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnRUYWdOYW1lU3RhcnRPZmZzZXQsIHN0YXJ0VGFnTmFtZUxlbmd0aCwgbmV3VGFnTmFtZSk7Ci0JCQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdOYW1lU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCQkJLy8gbmV3Ci0JCQkJLy8gbm9kZQotCQkJfQotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChyZWdpb25zICE9IG51bGwgJiYgcmVnaW9ucy5zaXplKCkgPiAwKSB7Ci0JCQkJSVRleHRSZWdpb24gZW5kVGFnTmFtZVJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDEpOwotCQkJCWludCBlbmRUYWdOYW1lU3RhcnRPZmZzZXQgPSBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZW5kVGFnTmFtZVJlZ2lvbik7Ci0JCQkJaW50IGVuZFRhZ05hbWVMZW5ndGggPSBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChlbmRUYWdOYW1lUmVnaW9uKSAtIGVuZFRhZ05hbWVTdGFydE9mZnNldDsKLQotCQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gJiYgIW5ld1RhZ05hbWUuZXF1YWxzKG9sZFRhZ05hbWUpKQotCQkJCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBlbmRUYWdOYW1lU3RhcnRPZmZzZXQsIGVuZFRhZ05hbWVMZW5ndGgsIG5ld1RhZ05hbWUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgY2xlYW51cENoaWxkcmVuKE5vZGUgbm9kZSkgewotCQlOb2RlIHBhcmVudE5vZGUgPSBub2RlOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCU5vZGUgY2hpbGROb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQlIVE1MQ2xlYW51cEhhbmRsZXJGYWN0b3J5IGZhY3RvcnkgPSBIVE1MQ2xlYW51cEhhbmRsZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCQl3aGlsZSAoY2hpbGROb2RlICE9IG51bGwpIHsKLQkJCQkvLyBjbGVhbnVwIHRoaXMgY2hpbGQgbm9kZQotCQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgY2xlYW51cEhhbmRsZXIgPSBmYWN0b3J5LmNyZWF0ZUhhbmRsZXIoY2hpbGROb2RlLCBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKSk7Ci0JCQkJY2hpbGROb2RlID0gY2xlYW51cEhhbmRsZXIuY2xlYW51cChjaGlsZE5vZGUpOwotCi0JCQkJLy8gZ2V0IG5ldyBwYXJlbnQgbm9kZQotCQkJCXBhcmVudE5vZGUgPSBjaGlsZE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJLy8gZ2V0IG5leHQgY2hpbGQgbm9kZQotCQkJCWNoaWxkTm9kZSA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHBhcmVudE5vZGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW51cENTU0F0dHJWYWx1ZShJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgbm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuOwotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQlpZiAoIWVsZW1lbnQuaXNHbG9iYWxUYWcoKSkKLQkJCXJldHVybjsKLQotCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoInN0eWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0Q1NTVmFsdWUoYXR0cik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgb2xkVmFsdWUgPSAoKElET01Ob2RlKSBhdHRyKS5nZXRWYWx1ZVNvdXJjZSgpOwotCQlpZiAob2xkVmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMob2xkVmFsdWUpKQotCQkJcmV0dXJuOwotCQlhdHRyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElDU1NNb2RlbCBnZXRDU1NNb2RlbChBdHRyIGF0dHIpIHsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0QWRhcHRlckZvcihJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHlsZURlY2xhcmF0aW9uQWRhcHRlciBzdHlsZUFkYXB0ZXIgPSAoSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyKSBhZGFwdGVyOwotCQlyZXR1cm4gc3R5bGVBZGFwdGVyLmdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q1NTVmFsdWUoQXR0ciBhdHRyKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldENTU01vZGVsKGF0dHIpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJQ1NTTm9kZSBkb2N1bWVudCA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQ7Ci0JCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSAoQ1NTU291cmNlRm9ybWF0dGVyKSBub3RpZmllci5nZXRBZGFwdGVyRm9yKENTU1NvdXJjZUZvcm1hdHRlci5jbGFzcyk7Ci0JCS8vIHRyeSBhbm90aGVyIHdheSB0byBnZXQgZm9ybWF0dGVyCi0JCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkKLQkJCWZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIobm90aWZpZXIpOwotCQlpZiAoZm9ybWF0dGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IGZvcm1hdHRlci5jbGVhbnVwKGRvY3VtZW50KTsKLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eUVsZW1lbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCS8vIHVuZGVmaW5lZCB0YWcsIHJldHVybiBkZWZhdWx0Ci0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2N1bWVudCk7Ci0JCWlmIChtb2RlbFF1ZXJ5ID09IG51bGwpCi0JCQkvLyB1bmRlZmluZWQgdGFnLCByZXR1cm4gZGVmYXVsdAotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJLy8gdW5kZWZpbmVkIHRhZywgcmV0dXJuIGRlZmF1bHQKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSk7Ci0JfQotCi0JcHJvdGVjdGVkIElET01Ob2RlIGluc2VydEVuZFRhZyhJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0KLQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBudWxsOwotCi0JCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJZWxzZSBpZiAoaXNFbXB0eUVsZW1lbnQoZWxlbWVudCkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChsYXN0UmVnaW9uKSwgbGFzdFJlZ2lvbi5nZXRMZW5ndGgoKSwgRU1QVFlfVEFHX0NMT1NFKTsKLQotCQkJaWYgKHJlZ2lvbnMuc2l6ZSgpID4gMSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbkJlZm9yZVRhZ0Nsb3NlID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxIC0gMSk7Ci0KLQkJCQkvLyBpbnNlcnQgYSBzcGFjZSBzZXBhcmF0b3IgYmVmb3JlIHRhZyBjbG9zZSBpZiB0aGUgcHJldmlvdXMKLQkJCQkvLyByZWdpb24gZG9lcyBub3QgaGF2ZSBleHRyYSBzcGFjZXMKLQkJCQlpZiAocmVnaW9uQmVmb3JlVGFnQ2xvc2UuZ2V0VGV4dExlbmd0aCgpID09IHJlZ2lvbkJlZm9yZVRhZ0Nsb3NlLmdldExlbmd0aCgpKQotCQkJCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChsYXN0UmVnaW9uKSwgMCwgIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIHRhZ05hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQlTdHJpbmcgZW5kVGFnID0gRU5EX1RBR19PUEVOLmNvbmNhdCh0YWdOYW1lKS5jb25jYXQoVEFHX0NMT1NFKTsKLQotCQkJSURPTU5vZGUgbGFzdENoaWxkID0gKElET01Ob2RlKSBub2RlLmdldExhc3RDaGlsZCgpOwotCQkJaW50IGVuZFRhZ1N0YXJ0T2Zmc2V0ID0gMDsKLQkJCWlmIChsYXN0Q2hpbGQgIT0gbnVsbCkKLQkJCQkvLyBpZiB0aGlzIG5vZGUgaGFzIGNoaWxkcmVuLCBpbnNlcnQgdGhlIGVuZCB0YWcgYWZ0ZXIgdGhlCi0JCQkJLy8gbGFzdCBjaGlsZAotCQkJCWVuZFRhZ1N0YXJ0T2Zmc2V0ID0gbGFzdENoaWxkLmdldEVuZE9mZnNldCgpOwotCQkJZWxzZQotCQkJCS8vIGlmIHRoaXMgbm9kZSBkb2VzIG5vdCBoYXMgY2hpbGRyZW4sIGluc2VydCB0aGUgZW5kIHRhZwotCQkJCS8vIGFmdGVyIHRoZSBzdGFydCB0YWcKLQkJCQllbmRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgZW5kVGFnU3RhcnRPZmZzZXQsIDAsIGVuZFRhZyk7Ci0JCX0KLQotCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsgLy8gc2F2ZQotCQkvLyBuZXcKLQkJLy8gbm9kZQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByb3RlY3RlZCBJRE9NTm9kZSBpbnNlcnRNaXNzaW5nVGFncyhJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gaW5zZXJ0TWlzc2luZ1RhZ3MgPSBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKS5nZXRJbnNlcnRNaXNzaW5nVGFncygpOwotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlpZiAoaW5zZXJ0TWlzc2luZ1RhZ3MpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCS8vIGltcGxpY2l0IHN0YXJ0IHRhZzsgZ2VuZXJhdGUgdGFnIGZvciBpdAotCQkJCW5ld05vZGUgPSBpbnNlcnRTdGFydFRhZyhub2RlKTsKLQkJCQlzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXdOb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbkxpc3QgIT0gbnVsbCAmJiByZWdpb25MaXN0LmdldChyZWdpb25MaXN0LnNpemUoKSAtIDEpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQkJLy8gc3RhcnQgdGFnIG1pc3NpbmcKLQkJCQkJaWYgKGlzU3RhcnRUYWdSZXF1aXJlZChuZXdOb2RlKSkKLQkJCQkJCW5ld05vZGUgPSBpbnNlcnRTdGFydFRhZyhuZXdOb2RlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQkJLy8gZW5kIHRhZyBtaXNzaW5nCi0JCQkJCWlmIChpc0VuZFRhZ1JlcXVpcmVkKG5ld05vZGUpKQotCQkJCQkJbmV3Tm9kZSA9IGluc2VydEVuZFRhZyhuZXdOb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURPTU5vZGUgaW5zZXJ0U3RhcnRUYWcoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkKLQkJCXJldHVybiBub2RlOyAvLyBkbyBub3RoaW5nCi0KLQkJSURPTU5vZGUgbmV3Tm9kZSA9IG51bGw7Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCVN0cmluZyBzdGFydFRhZyA9IFNUQVJUX1RBR19PUEVOLmNvbmNhdCh0YWdOYW1lKS5jb25jYXQoVEFHX0NMT1NFKTsKLQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0VGFnU3RhcnRPZmZzZXQsIDAsIHN0YXJ0VGFnKTsKLQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7IC8vIHNhdmUKLQkJLy8gbmV3Ci0JCS8vIG5vZGUKLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRUYWdDbG9zZShJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmICgoZmxhdE5vZGUgIT0gbnVsbCkgJiYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKSAhPSBudWxsKSkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9uTGlzdC5nZXQocmVnaW9uTGlzdC5zaXplKCkgLSAxKTsKLQkJCWlmIChsYXN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IGxhc3RSZWdpb24uZ2V0VHlwZSgpOwotCQkJCWlmICgocmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpICYmIChyZWdpb25UeXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJCQkJLy8gaW5zZXJ0ICI+IiBhZnRlciBsYXN0UmVnaW9uIG9mIGZsYXROb2RlCi0JCQkJCS8vIGFzIGluICI8YTwvYT4iIGlmIGZsYXROb2RlIGlzIGZvciBzdGFydCB0YWcsIG9yIGluCi0JCQkJCS8vICI8YT48L2EiIGlmIGZsYXROb2RlIGlzIGZvciBlbmQgdGFnCi0JCQkJCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQobGFzdFJlZ2lvbiksIDAsICI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuZFRhZ1JlcXVpcmVkKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG5vZGUuaXNDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZW5kIHRhZ3Mgb2YgSFRNTCBFTVBUWSBjb250ZW50IHR5cGUsIHN1Y2ggYXMgSU1HLCBhbmQgSFRNTAotCSAqIHVuZGVmaW5lZCB0YWdzIGFyZSBwYXJzZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBzdGFydCB0YWdzLiBTbyBpbnNlcnRpbmcKLQkgKiB0aGUgbWlzc2luZyBzdGFydCB0YWcgaXMgdXNlbGVzcyBhbmQgZXZlbiBoYXJtZnVsLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3RhcnRUYWdSZXF1aXJlZChJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBub2RlLmlzQ29udGFpbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNYTUxUeXBlKElET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXREb2N1bWVudCgpOwotCi0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkb2N1bWVudC5pc1hNTFR5cGUoKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIElET01Ob2RlIHF1b3RlQXR0clZhbHVlKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm4gbm9kZTsgLy8gZG8gbm90aGluZwotCi0JCWJvb2xlYW4gcXVvdGVBdHRyVmFsdWVzID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0UXVvdGVBdHRyVmFsdWVzKCk7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCi0JCWlmIChxdW90ZUF0dHJWYWx1ZXMpIHsKLQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbmV3Tm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlpbnQgYXR0cmlidXRlc0xlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlJU291cmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRHZW5lcmF0b3IoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzTGVuZ3RoOyBpKyspIHsKLQkJCQlhdHRyaWJ1dGVzID0gbmV3Tm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJYXR0cmlidXRlc0xlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCQkJSURPTUF0dHIgZWFjaEF0dHIgPSAoSURPTUF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQkvLyBJVGV4dFJlZ2lvbiBvbGRBdHRyVmFsdWVSZWdpb24gPSBlYWNoQXR0ci5nZXRWYWx1ZVJlZ2lvbigpOwotCQkJCVN0cmluZyBvbGRBdHRyVmFsdWUgPSBlYWNoQXR0ci5nZXRWYWx1ZVJlZ2lvblRleHQoKTsKLQkJCQlpZiAob2xkQXR0clZhbHVlID09IG51bGwpIHsKLQkJCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKGlzWE1MVHlwZShzdHJ1Y3R1cmVkTW9kZWwpKSB7Ci0JCQkJCQkvLyBUT0RPOiBLaXQsIHBsZWFzZSBjaGVjay4gSXMgdGhlcmUgYW55IHdheSB0byBub3QKLQkJCQkJCS8vIHJlbHkgb24gZ2V0dGluZyByZWdpb25zIGZyb20gYXR0cmlidXRlcz8KLQkJCQkJCVN0cmluZyBuZXdBdHRyVmFsdWUgPSAiPVwiIiArIGVhY2hBdHRyLmdldE5hbWVSZWdpb25UZXh0KCkgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBlYWNoQXR0ci5nZXROYW1lUmVnaW9uRW5kT2Zmc2V0KCksIDAsIG5ld0F0dHJWYWx1ZSk7Ci0JCQkJCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihub2RlLmdldFN0YXJ0T2Zmc2V0KCkpOyAvLyBzYXZlCi0JCQkJCQkvLyBuZXcKLQkJCQkJCS8vIG5vZGUKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQotCQkJCQljaGFyIHF1b3RlID0gU3RyaW5nVXRpbHMuaXNRdW90ZWQob2xkQXR0clZhbHVlKSA/IG9sZEF0dHJWYWx1ZS5jaGFyQXQoMCkgOiBET1VCTEVfUVVPVEU7Ci0JCQkJCVN0cmluZyBuZXdBdHRyVmFsdWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVBdHRyVmFsdWUoZWFjaEF0dHIsIHF1b3RlKTsKLQotCQkJCQkvLyBUaGVyZSBpcyBhIHByb2JsZW0gaW4KLQkJCQkJLy8gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUoSVRleHRSZWdpb24pCi0JCQkJCS8vIHdoZW4gdGhlIHJlZ2lvbiBpcyBpbnN0YW5jZW9mIENvbnRleHRSZWdpb24uCi0JCQkJCS8vIFdvcmthcm91bmQgZm9yIG5vdy4uLgotCQkJCQlpZiAob2xkQXR0clZhbHVlLmxlbmd0aCgpID09IDEpIHsKLQkJCQkJCWNoYXIgZmlyc3RDaGFyID0gb2xkQXR0clZhbHVlLmNoYXJBdCgwKTsKLQkJCQkJCWlmIChmaXJzdENoYXIgPT0gU0lOR0xFX1FVT1RFKQotCQkJCQkJCW5ld0F0dHJWYWx1ZSA9IFNJTkdMRV9RVU9URVM7Ci0JCQkJCQllbHNlIGlmIChmaXJzdENoYXIgPT0gRE9VQkxFX1FVT1RFKQotCQkJCQkJCW5ld0F0dHJWYWx1ZSA9IERPVUJMRV9RVU9URVM7Ci0JCQkJCX0KLQotCQkJCQlpZiAobmV3QXR0clZhbHVlICE9IG51bGwpIHsKLQkJCQkJCWlmIChuZXdBdHRyVmFsdWUuY29tcGFyZVRvKG9sZEF0dHJWYWx1ZSkgIT0gMCkgewotCQkJCQkJCWludCBhdHRyVmFsdWVTdGFydE9mZnNldCA9IGVhY2hBdHRyLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCQkJCQlpbnQgYXR0clZhbHVlTGVuZ3RoID0gb2xkQXR0clZhbHVlLmxlbmd0aCgpOwotCQkJCQkJCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCi0JCQkJCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBhdHRyVmFsdWVTdGFydE9mZnNldCwgYXR0clZhbHVlTGVuZ3RoLCBuZXdBdHRyVmFsdWUpOwotCQkJCQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCQkJCQkJLy8gbmV3Ci0JCQkJCQkJLy8gbm9kZQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBpbnNlcnRSZXF1aXJlZEF0dHJzKElET01Ob2RlIG5vZGUpIHsKLQkJYm9vbGVhbiBpbnNlcnRSZXF1aXJlZEF0dHJzID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0SW5zZXJ0UmVxdWlyZWRBdHRycygpOwotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlpZiAoaW5zZXJ0UmVxdWlyZWRBdHRycykgewotCQkJTGlzdCByZXF1aXJlZEF0dHJzID0gZ2V0UmVxdWlyZWRBdHRycyhuZXdOb2RlKTsKLQkJCWlmIChyZXF1aXJlZEF0dHJzLnNpemUoKSA+IDApIHsKLQkJCQlOYW1lZE5vZGVNYXAgY3VycmVudEF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJTGlzdCBpbnNlcnRBdHRycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAoY3VycmVudEF0dHJzLmdldExlbmd0aCgpID09IDApCi0JCQkJCWluc2VydEF0dHJzLmFkZEFsbChyZXF1aXJlZEF0dHJzKTsKLQkJCQllbHNlIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZEF0dHJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlTdHJpbmcgcmVxdWlyZWRBdHRyTmFtZSA9ICgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgcmVxdWlyZWRBdHRycy5nZXQoaSkpLmdldEF0dHJOYW1lKCk7Ci0JCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGN1cnJlbnRBdHRycy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQkJU3RyaW5nIGN1cnJlbnRBdHRyTmFtZSA9IGN1cnJlbnRBdHRycy5pdGVtKGopLmdldE5vZGVOYW1lKCk7Ci0JCQkJCQkJaWYgKHJlcXVpcmVkQXR0ck5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShjdXJyZW50QXR0ck5hbWUpID09IDApIHsKLQkJCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIWZvdW5kKQotCQkJCQkJCWluc2VydEF0dHJzLmFkZChyZXF1aXJlZEF0dHJzLmdldChpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGluc2VydEF0dHJzLnNpemUoKSA+IDApIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJaW50IGluZGV4ID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMYXN0UmVnaW9uKCk7Ci0JCQkJCWlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJCWluZGV4LS07Ci0JCQkJCQlsYXN0UmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXggLSAxKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQkJCWluZGV4ID0gaW5kZXggLSAyOwotCQkJCQkJbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4IC0gMSk7Ci0JCQkJCX0KLQkJCQkJTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZvciAoaW50IGkgPSBpbnNlcnRBdHRycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5zZXJ0QXR0cnMuZ2V0KGkpOwotCQkJCQkJCVN0cmluZyByZXF1aXJlZEF0dHJpYnV0ZU5hbWUgPSBhdHRyRGVjbC5nZXRBdHRyTmFtZSgpOwotCQkJCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBhdHRyRGVjbC5nZXREZWZhdWx0VmFsdWUoKTsKLQkJCQkJCQlpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpCi0JCQkJCQkJCWRlZmF1bHRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIG5hbWVBbmREZWZhdWx0VmFsdWUgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoaSA9PSAwICYmIGxhc3RSZWdpb24uZ2V0TGVuZ3RoKCkgPiBsYXN0UmVnaW9uLmdldFRleHRMZW5ndGgoKSkKLQkJCQkJCQkJbmFtZUFuZERlZmF1bHRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJbmFtZUFuZERlZmF1bHRWYWx1ZSArPSByZXF1aXJlZEF0dHJpYnV0ZU5hbWUgKyAiPVwiIiArIGRlZmF1bHRWYWx1ZSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCW11bHRpVGV4dEVkaXQuYWRkQ2hpbGQobmV3IEluc2VydEVkaXQoaW5kZXgsIG5hbWVBbmREZWZhdWx0VmFsdWUpKTsKLQkJCQkJCQkvLyBCVUczMzgxOiBNdWx0aVRleHRFZGl0IGFwcGxpZXMgYWxsIGNoaWxkCi0JCQkJCQkJLy8gVGV4dEVkaXQncyBiYXNpbmcgb24gb2Zmc2V0cwotCQkJCQkJCS8vIGluIHRoZSBkb2N1bWVudCBiZWZvcmUgdGhlIGZpcnN0IFRleHRFZGl0LCBub3QKLQkJCQkJCQkvLyBhZnRlciBlYWNoCi0JCQkJCQkJLy8gY2hpbGQgVGV4dEVkaXQuIFRoZXJlZm9yZSwgZG8gbm90IG5lZWQgdG8KLQkJCQkJCQkvLyBhZHZhbmNlIHRoZSBpbmRleC4KLQkJCQkJCQkvLyBpbmRleCArPSBuYW1lQW5kRGVmYXVsdFZhbHVlLmxlbmd0aCgpOwotCQkJCQkJfQotCQkJCQkJbXVsdGlUZXh0RWRpdC5hcHBseShuZXdOb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gbG9nIG9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgTW9kZWxRdWVyeSBnZXRNb2RlbFF1ZXJ5KE5vZGUgbm9kZSkgewotCQlNb2RlbFF1ZXJ5IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlyZXN1bHQgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KChEb2N1bWVudCkgbm9kZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFJlcXVpcmVkQXR0cnMoTm9kZSBub2RlKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IGdldE1vZGVsUXVlcnkobm9kZSk7Ci0JCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgbm9kZSk7Ci0JCQlpZiAoZWxlbWVudERlY2wgIT0gbnVsbCkgewotCQkJCUNNTmFtZWROb2RlTWFwIGF0dHJNYXAgPSBlbGVtZW50RGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJSXRlcmF0b3IgaXQgPSBhdHRyTWFwLml0ZXJhdG9yKCk7Ci0JCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gbnVsbDsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCWF0dHIgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgaXQubmV4dCgpOwotCQkJCQlpZiAoYXR0ci5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpIHsKLQkJCQkJCXJlc3VsdC5hZGQoYXR0cik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDxwPkNvbXByZXNzIGVtcHR5IGVsZW1lbnQgdGFncyBpZiB0aGUgcHJlZmVuY2UgaXMgc2V0IHRvIGRvIHNvPC9wPgotCSAqIAotCSAqIEBjb3B5b2Ygb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNsZWFudXAuRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlciNjb21wcmVzc0VtcHR5RWxlbWVudFRhZwotCSAqIAotCSAqIEBwYXJhbSBub2RlIHRoZSB7QGxpbmsgSURPTU5vZGV9IHRvIHBvc3NpYmxlIGNvbXByZXNzCi0JICogQHJldHVybiB0aGUgY29tcHJlc3NlZCBub2RlIGlmIHRoZSBnaXZlbiBub2RlIHNob3VsZCBiZSBjb21wcmVzc2VkLCBlbHNlIHRoZSBub2RlIGFzIGl0IHdhcyBnaXZlbgotCSAqLwotCXByaXZhdGUgSURPTU5vZGUgY29tcHJlc3NFbXB0eUVsZW1lbnRUYWcoSURPTU5vZGUgbm9kZSkgewotCQlib29sZWFuIGNvbXByZXNzRW1wdHlFbGVtZW50VGFncyA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldENvbXByZXNzRW1wdHlFbGVtZW50VGFncygpOwotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3Tm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCS8vb25seSBjb21wcmVzcyB0YWdzIGlmIHRoZXkgYXJlIGVtcHR5Ci0JCWlmICgoY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzICYmIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAmJgotCQkJCXN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpKSB7Ci0KLQkJCS8vb25seSBjb21wcmVzcyBlbmQgdGFncyBpZiBpdHMgWEhUTUwgb3Igbm90IGEgY29udGFpbmVyCi0JCQlpZihpc1hNTFRhZygoSURPTUVsZW1lbnQpbmV3Tm9kZSkgfHwgIW5ld05vZGUuaXNDb250YWluZXIoKSkgewotCQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJCS8vIGZvcm1hdCBjaGlsZHJlbiBhbmQgZW5kIHRhZyBpZiBub3QgZW1wdHkgZWxlbWVudCB0YWcKLQkJCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBuZXdOb2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCQkJaWYgKGNoaWxkTm9kZXMgPT0gbnVsbCB8fCBjaGlsZE5vZGVzLmdldExlbmd0aCgpID09IDAgfHwgKGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMSAmJiAoY2hpbGROb2Rlcy5pdGVtKDApKS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmICgoY2hpbGROb2Rlcy5pdGVtKDApKS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpKSB7Ci0JCQkJCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbmV3Tm9kZS5nZXRNb2RlbCgpOwotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJCQkJCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gbmV3Tm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJaW50IG9mZnNldCA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCQkJaW50IGxlbmd0aCA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0KLQkJCQkJCW9mZnNldCA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCkgKyBsYXN0UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIDAsICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGZjNzc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0hUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vLyBuYWthbW9yaV9UT0RPOiBjaGVjayBhbmQgcmVtb3ZlIENTUyBmb3JtYXR0aW5nCi0KLWNsYXNzIEhUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkgewotCi0KLQotCXByaXZhdGUgc3RhdGljIEhUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkgZkluc3RhbmNlID0gbnVsbDsKLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBIVE1MQ2xlYW51cEhhbmRsZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgY3JlYXRlSGFuZGxlcihOb2RlIG5vZGUsIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGNsZWFudXBQcmVmZXJlbmNlcykgewotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQlpZiAoaXNYTUxUYWcobm9kZSkpCi0JCQkJCWhhbmRsZXIgPSBuZXcgRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJCWVsc2UKLQkJCQkJaGFuZGxlciA9IG5ldyBKU1BFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCWlmIChpc1BhcmVudFN0eWxlVGFnKG5vZGUpKQotCQkJCQloYW5kbGVyID0gbmV3IENTU1RleHROb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCQllbHNlCi0JCQkJCWhhbmRsZXIgPSBuZXcgTm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZWZhdWx0IDogewotCQkJCWhhbmRsZXIgPSBuZXcgTm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQl9Ci0JCX0KLQotCQloYW5kbGVyLnNldENsZWFudXBQcmVmZXJlbmNlcyhjbGVhbnVwUHJlZmVyZW5jZXMpOwotCi0JCXJldHVybiBoYW5kbGVyOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxUYWcoTm9kZSBub2RlKSB7Ci0JCWlmKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSAoKElET01Ob2RlKSBub2RlKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJcmV0dXJuIChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSA9PSByZWdpb24uZ2V0VHlwZSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFyZW50U3R5bGVUYWcoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoKElET01Ob2RlKSBub2RlKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGZsYXROb2RlLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIHBhcmVudCBpcyBTVFlMRSBlbGVtZW50Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgbmFtZSA9IHBhcmVudC5nZXROb2RlTmFtZSgpOwotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIW5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiU1RZTEUiKSkvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvSFRNTENsZWFudXBQcm9jZXNzb3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9IVE1MQ2xlYW51cFByb2Nlc3NvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRiMjkyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9IVE1MQ2xlYW51cFByb2Nlc3NvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdC5IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLlN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSFRNTENsZWFudXBQcm9jZXNzb3JJbXBsIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBmQ2xlYW51cFByZWZlcmVuY2VzID0gbnVsbDsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGdldENsZWFudXBIYW5kbGVyKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUhhbmRsZXIobm9kZSwgZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkpOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmQ2xlYW51cFByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMgPSBuZXcgU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcygpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRUYWdOYW1lQ2FzZShwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRBdHRyTmFtZUNhc2UocHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0SW5zZXJ0UmVxdWlyZWRBdHRycyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0SW5zZXJ0TWlzc2luZ1RhZ3MocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRRdW90ZUF0dHJWYWx1ZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Rm9ybWF0U291cmNlKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSkpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Q29udmVydEVPTENvZGVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEVPTENvZGUocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmQ2xlYW51cFByZWZlcmVuY2VzOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZ2V0Rm9ybWF0UHJvY2Vzc29yKCkgewotCQlyZXR1cm4gbmV3IEhUTUxGb3JtYXRQcm9jZXNzb3JJbXBsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvSlNQRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvSlNQRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjg5MTQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0pTUEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEpTUEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIgZXh0ZW5kcyBFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyIHsKLQotCXB1YmxpYyBOb2RlIGNsZWFudXAoTm9kZSBub2RlKSB7Ci0JCS8qIDxqc3A6cm9vdD4gc2hvdWxkIGNsZWFudXAgaXRzIGRlc2NlbmRhbnQgbm9kZXMgKi8KLQkJaWYobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9ICgoSURPTU5vZGUpIG5vZGUpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZigiSlNQX1JPT1RfVEFHX05BTUUiLmVxdWFscyhyZWdpb24uZ2V0VHlwZSgpKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBzdXBlci5jbGVhbnVwKG5vZGUpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL05vZGVDbGVhbnVwSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvTm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMWYzNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvTm9kZUNsZWFudXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBOb2RlQ2xlYW51cEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdE5vZGVDbGVhbnVwSGFuZGxlciB7Ci0KLQlwdWJsaWMgTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaGFuZGxlcnMvQ29tbWVudEVsZW1lbnRIYW5kbGVyRm9yU1NJLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaGFuZGxlcnMvQ29tbWVudEVsZW1lbnRIYW5kbGVyRm9yU1NJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNTI4YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2hhbmRsZXJzL0NvbW1lbnRFbGVtZW50SGFuZGxlckZvclNTSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmhhbmRsZXJzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LnV0aWwuQ29tbWVudEVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC51dGlsLlRhZ1NjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLXB1YmxpYyBjbGFzcyBDb21tZW50RWxlbWVudEhhbmRsZXJGb3JTU0kgaW1wbGVtZW50cyBDb21tZW50RWxlbWVudEhhbmRsZXIgewotCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2N1bWVudCk7Ci0JCWlmIChtb2RlbFF1ZXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUNNRG9jdW1lbnQgY20gPSBtb2RlbFF1ZXJ5LmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KGRvY3VtZW50KTsKLQkJaWYgKGNtID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUNNTmFtZWROb2RlTWFwIG1hcCA9IGNtLmdldEVsZW1lbnRzKCk7Ci0JCWlmIChtYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlUYWdTY2FubmVyIHNjYW5uZXIgPSBuZXcgVGFnU2Nhbm5lcihkYXRhLCAxKTsKLQkJU3RyaW5nIG5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUubGVuZ3RoKCkgKyA0KTsKLQkJYnVmZmVyLmFwcGVuZChTU0lfUFJFRklYKTsKLQkJYnVmZmVyLmFwcGVuZCgnOicpOwotCQlidWZmZXIuYXBwZW5kKG5hbWUpOwotCQlTdHJpbmcgdGFnTmFtZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkvLyBjaGVjayBpZiB2YWxpZCAoZGVmaW5lZCkgU1NJIHRhZyBvciBub3QKLQkJaWYgKG1hcC5nZXROYW1lZEl0ZW0odGFnTmFtZSkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDb21tZW50RWxlbWVudEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBDb21tZW50RWxlbWVudEZhY3RvcnkoZG9jdW1lbnQsIGlzSlNQVGFnLCB0aGlzKTsKLQkJRWxlbWVudCBlbGVtZW50ID0gZmFjdG9yeS5jcmVhdGUodGFnTmFtZSwgQ29tbWVudEVsZW1lbnRGYWN0b3J5LklTX1NUQVJUKTsKLQotCQkvLyBzZXQgYXR0cmlidXRlcwotCQlTdHJpbmcgYXR0ck5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCXdoaWxlIChhdHRyTmFtZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgYXR0clZhbHVlID0gc2Nhbm5lci5uZXh0VmFsdWUoKTsKLQkJCUF0dHIgYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsKQotCQkJCQlhdHRyLnNldFZhbHVlKGF0dHJWYWx1ZSk7Ci0JCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJfQotCQkJYXR0ck5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVN0YXJ0VGFnQ29udGVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gZWxlbWVudC5nZXRNb2RlbCgpLmdldEdlbmVyYXRvcigpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJ1ZmZlci5hcHBlbmQoJyMnKTsKLQkJYnVmZmVyLmFwcGVuZChlbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLQotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ciBhdHRyID0gKEF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IGdlbmVyYXRvci5nZW5lcmF0ZUF0dHJOYW1lKGF0dHIpOwotCQkJaWYgKGF0dHJOYW1lICE9IG51bGwpIHsKLQkJCQlidWZmZXIuYXBwZW5kKGF0dHJOYW1lKTsKLQkJCX0KLQkJCVN0cmluZyBhdHRyVmFsdWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVBdHRyVmFsdWUoYXR0cik7Ci0JCQlpZiAoYXR0clZhbHVlICE9IG51bGwpIHsKLQkJCQkvLyBhdHRyIG5hbWUgb25seSBmb3IgSFRNTCBib29sZWFuIGFuZCBKU1AKLQkJCQlidWZmZXIuYXBwZW5kKCc9Jyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChhdHRyVmFsdWUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbmRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7IC8vIGFsd2F5cyBlbXB0eQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29tbWVudEVsZW1lbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2N1bWVudCk7Ci0JCWlmIChtb2RlbFF1ZXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlDTURvY3VtZW50IGNtID0gbW9kZWxRdWVyeS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChkb2N1bWVudCk7Ci0JCWlmIChjbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQ01OYW1lZE5vZGVNYXAgbWFwID0gY20uZ2V0RWxlbWVudHMoKTsKLQkJaWYgKG1hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0JCWlmIChwcmVmaXggPT0gbnVsbCB8fCAhcHJlZml4LmVxdWFscyhTU0lfUFJFRklYKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCWlmICh0YWdOYW1lLmxlbmd0aCgpIDw9IDQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAobWFwLmdldE5hbWVkSXRlbSh0YWdOYW1lKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfUFJFRklYID0gInNzaSI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9BdHRyaWJ1dGVDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0F0dHJpYnV0ZUNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE3N2YwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0F0dHJpYnV0ZUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotICovCi1jbGFzcyBBdHRyaWJ1dGVDb2xsZWN0aW9uIGV4dGVuZHMgQ01OYW1lZE5vZGVNYXBJbXBsIGltcGxlbWVudHMgSFRNTDQwTmFtZXNwYWNlIHsKLQotCS8qKiBib2R5Y29sb3JzLiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJPRFlDT0xPUlMgPSB7QVRUUl9OQU1FX0JHQ09MT1IsIEFUVFJfTkFNRV9URVhULCBBVFRSX05BTUVfTElOSywgQVRUUl9OQU1FX1ZMSU5LLCBBVFRSX05BTUVfQUxJTkt9OwotCS8qKiBjb3JlYXR0cnMuICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09SRSA9IHtBVFRSX05BTUVfSUQsIEFUVFJfTkFNRV9DTEFTUywgQVRUUl9OQU1FX1NUWUxFLCBBVFRSX05BTUVfVElUTEV9OwotCS8qKiBldmVudHMuICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRVZFTlRTID0ge0FUVFJfTkFNRV9PTkNMSUNLLCBBVFRSX05BTUVfT05EQkxDTElDSywgQVRUUl9OQU1FX09OTU9VU0VET1dOLCBBVFRSX05BTUVfT05NT1VTRVVQLCBBVFRSX05BTUVfT05NT1VTRU9WRVIsIEFUVFJfTkFNRV9PTk1PVVNFTU9WRSwgQVRUUl9OQU1FX09OTU9VU0VPVVQsIEFUVFJfTkFNRV9PTktFWVBSRVNTLCBBVFRSX05BTUVfT05LRVlET1dOLCBBVFRSX05BTUVfT05LRVlVUCwgQVRUUl9OQU1FX09OSEVMUH07Ci0JLyoqIGkxOG4uIGxhbmcsIGRpciAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEkxOE4gPSB7QVRUUl9OQU1FX0xBTkcsIEFUVFJfTkFNRV9ESVJ9OwotCS8qKiBjZWxsaGFsaWdoLiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENFTExIQUxJR04gPSB7QVRUUl9OQU1FX0NIQVIsIEFUVFJfTkFNRV9DSEFST0ZGfTsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVDb2xsZWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGF0dHJOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIEhUTUxBdHRyRGVjbEltcGwgY3JlYXRlKFN0cmluZyBhdHRyTmFtZSkgewotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBudWxsOwotCi0JCWlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BQkJSKSkgewotCQkJLy8gKGFiYnIgJVRleHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BQkJSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BQ0NFUFQpKSB7Ci0JCQkvLyAoYWNjZXB0ICVDb250ZW50VHlwZXM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FDQ0VQVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQUNDRVBUX0NIQVJTRVQpKSB7Ci0JCQkvLyAoYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOzsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ0hBUlNFVFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BQ0NFUFRfQ0hBUlNFVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQUNUSU9OKSkgewotCQkJLy8gKGFjdGlvbiAlVVJJICNSRVFVSVJFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FDVElPTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQVJDSElWRSkpIHsKLQkJCS8vIChhcmNoaXZlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BUkNISVZFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BQ0NFU1NLRVkpKSB7Ci0JCQkvLyAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNIQVJBQ1RFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FDQ0VTU0tFWSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQUxJTkspKSB7Ci0JCQkvLyAoYWxpbmsgJUNvbG9yOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT0xPUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMSU5LLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BTFQpKSB7Ci0JCQkvLyAoYWx0ICVUZXh0OyAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQVVUT1NUQVJUKSkgewotCQkJLy8gKGF1dG9zdGFydCAodHJ1ZXxmYWxzZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BVVRPU1RBUlQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FVVE9QTEFZKSkgewotCQkJLy8gKGF1dG9wbGF5ICh0cnVlfGZhbHNlKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FVVE9QTEFZLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BVVRPU0laRSkpIHsKLQkJCS8vIChhdXRvc2l6ZSAodHJ1ZXxmYWxzZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BVVRPU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQVhJUykpIHsKLQkJCS8vIChheGlzIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BWElTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CQUNLR1JPVU5EKSkgewotCQkJLy8gKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CQUNLR1JPVU5ELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CRUhBVklPUikpIHsKLQkJCS8vIChiZWhhdmlvciAoc2Nyb2xsfHNsaWRlfGFsdGVybmF0ZSkgc2Nyb2xsKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9TQ1JPTEwsIEFUVFJfVkFMVUVfU0xJREUsIEFUVFJfVkFMVUVfQUxURVJOQVRFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9TQ1JPTEwpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CRUhBVklPUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQkdDT0xPUikpIHsKLQkJCS8vIChiZ2NvbG9yICVDb2xvcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09MT1IpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CR0NPTE9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CT1JERVIpKSB7Ci0JCQkvLyAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0JPUkRFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0VMTFNQQUNJTkcpKSB7Ci0JCQkvLyAoY2VsbHNwYWNpbmcgJUxlbmd0aDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEVOR1RIKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0VMTFNQQUNJTkcsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NFTExQQURESU5HKSkgewotCQkJLy8gKGNlbGxwYWRkaW5nICVMZW5ndGg7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxFTkdUSCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NFTExQQURESU5HLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DR0kpKSB7Ci0JCQkvLyAoY2dpICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0dJLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DSEFSKSkgewotCQkJLy8gKGNoYXIgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ0hBUkFDVEVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0hBUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0hBUk9GRikpIHsKLQkJCS8vIChjaGFyb2ZmICVMZW5ndGg7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxFTkdUSCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NIQVJPRkYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NIQVJTRVQpKSB7Ci0JCQkvLyAoY2hhcnNldCAlQ2hhcnNldDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ0hBUlNFVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NIQVJTRVQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NJVEUpKSB7Ci0JCQkvLyAoY2l0ZSAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NJVEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NMQVNTKSkgewotCQkJLy8gKGNsYXNzIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DTEFTUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0xBU1NJRCkpIHsKLQkJCS8vIChjbGFzc2lkICVVUkkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DTEFTU0lELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DTUQpKSB7Ci0JCQkvLyAoY21kIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DTUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NIRUNLRUQpKSB7Ci0JCQkvLyAoY2hlY2tlZCAoY2hlY2tlZCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfQ0hFQ0tFRH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NIRUNLRUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NMRUFSKSkgewotCQkJLy8gKGNsZWFyIChsZWZ0IHwgYWxsIHwgcmlnaHQgfCBub25lKSBub25lKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX0FMTCwgQVRUUl9WQUxVRV9SSUdIVCwgQVRUUl9WQUxVRV9OT05FfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9OT05FKTsKLQotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DTEVBUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ09ERSkpIHsKLQkJCS8vIChjb2RlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0RFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0RFQkFTRSkpIHsKLQkJCS8vIChjb2RlYmFzZSAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPREVCQVNFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0RFVFlQRSkpIHsKLQkJCS8vIChjb2RldHlwZSAlQ290ZW50VHlwZTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09OVEVOVF9UWVBFKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ09ERVRZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NPTE9SKSkgewotCQkJLy8gKGNvbG9yICVDb2xvcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09MT1IpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0xPUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ09NUEFDVCkpIHsKLQkJCS8vIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9DT01QQUNUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ09NUEFDVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ09MUykpIHsKLQkJCS8vIChjb2xzIE5VTUJFUiAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0xTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0xTUEFOKSkgewotCQkJLy8gKGNvbHNwYW4gTlVNQkVSIDEpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFXzEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0xTUEFOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT05URU5UKSkgewotCQkJLy8gKGNvbnRlbnQgQ0RBVEEgI1JFUVVJUkVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT05URU5ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT05UUk9MTEVSKSkgewotCQkJLy8gKGNvbnRyb2xsZXIgKHRydWV8ZmFsc2UpIHRydWUpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1RSVUUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT05UUk9MTEVSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT09SRFMpKSB7Ci0JCQkvLyAoY29vcmRzICVDb29yZHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPT1JEUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPT1JEUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfREFUQSkpIHsKLQkJCS8vIChkYXRhICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfREFUQSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfREFURVRJTUUpKSB7Ci0JCQkvLyAoZGF0ZXRpbWUgJURhdGV0aW1lOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5EQVRFVElNRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RBVEVUSU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9EQVRBUEFHRVNJWkUpKSB7Ci0JCQkvLyAoZGF0YXBhZ2VzaXplIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9EQVRBUEFHRVNJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0RFQ0xBUkUpKSB7Ci0JCQkvLyAoZGVjbGFyZSAoZGVjbGFyZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfREVDTEFSRX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RFQ0xBUkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0RFRkVSKSkgewotCQkJLy8gKGRlZmVyIChkZWZlcikgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfREVGRVJ9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ERUZFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRElSKSkgewotCQkJLy8gKGRpciAobHRyfHJ0bCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0xUUiwgQVRUUl9WQUxVRV9SVEx9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ESVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0RJUkVDVElPTikpIHsKLQkJCS8vIChkaXJlY3Rpb24gKGxlZnR8cmlnaHR8dXB8ZG93bikgbGVmdCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9SSUdIVCwgQVRUUl9WQUxVRV9VUCwgQVRUUl9WQUxVRV9ET1dOfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRElSRUNUSU9OLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9ESVJFQ1RLRVkpKSB7Ci0JCQkvLyAoZGlyZWN0a2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNIQVJBQ1RFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RJUkVDVEtFWSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRElTQUJMRUQpKSB7Ci0JCQkvLyAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJLy8gYm9vbGVhbiBhdHRyaWJ1dGUgbXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGl0cyBuYW1lLgotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9ESVNBQkxFRH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RJU0FCTEVELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9FTkNUWVBFKSkgewotCQkJLy8gKGVuY3R5cGUgJUNvbnRlbnRUeXBlOyAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1dXV19GT1JNX1VSTEVOQ09ERUQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9FTkNUWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9FUlJNU0cpKSB7Ci0JCQkvLyAoZXJybXNnIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9FUlJNU0csIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0VWRU5UKSkgewotCQkJLy8gKGV2ZW50IENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9FVkVOVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRkFDRSkpIHsKLQkJCS8vIChmYWNlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GQUNFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GSUxFKSkgewotCQkJLy8gKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GSUxFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GT1IpKSB7Ci0JCQkvLyAoZm9yICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRk9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GUkFNRSkpIHsKLQkJCS8vIChmcmFtZSAlVEZyYW1lOyAjSU1QTElFRCkKLQkJCS8vICVURnJhbWU7IGlzCi0JCQkvLyAodm9pZHxhYm92ZXxiZWxvd3xoc2lkZXN8bGhzfHJoc3x2c2lkZXN8Ym94fGJvcmRlcikuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1ZPSUQsIEFUVFJfVkFMVUVfQUJPVkUsIEFUVFJfVkFMVUVfQkVMT1csIEFUVFJfVkFMVUVfSFNJREVTLCBBVFRSX1ZBTFVFX0xIUywgQVRUUl9WQUxVRV9SSFMsIEFUVFJfVkFMVUVfVlNJREVTLCBBVFRSX1ZBTFVFX0JPWCwgQVRUUl9WQUxVRV9CT1JERVJ9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GUkFNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRlJBTUVCT1JERVIpKSB7Ci0JCQkvLyAoZnJhbWVib3JkZXIgKDF8MCkgMSkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfMSwgQVRUUl9WQUxVRV8wfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV8xKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRlJBTUVCT1JERVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQkJLy8gPDxEMjE1Njg0Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRlJBTUVTUEFDSU5HKSkgewotCQkJLy8gKGZyYW1lc3BhY2luZyBDREFUQTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0ZSQU1FU1BBQ0lORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJLy8gRDIxNTY4NAotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hFQURFUlMpKSB7Ci0JCQkvLyAoSEVBREVSUyBJRFJFRlM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLklEUkVGUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hFQURFUlMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hFSUdIVCkpIHsKLQkJCS8vIChoZWlnaHQgJUxlbmd0aDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEVOR1RIKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSEVJR0hULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9ISURERU4pKSB7Ci0JCQkvLyAoaGlkZGVuIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ISURERU4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hSRUYpKSB7Ci0JCQkvLyAoaHJlZiAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hSRUYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hSRUZMQU5HKSkgewotCQkJLy8gKGhyZWZsYW5nICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxBTkdVQUdFX0NPREUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IUkVGTEFORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSFNQQUNFKSkgewotCQkJLy8gKGhzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IU1BBQ0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hUVFBfRVFVSVYpKSB7Ci0JCQkvLyAoaHR0cC1lcXVpdiBOQU1FICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk5BTUUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IVFRQX0VRVUlWLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9JRCkpIHsKLQkJCS8vIChpZCBJRCAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLklEKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0lTTUFQKSkgewotCQkJLy8gKGlzbWFwIChpc21hcCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfSVNNQVB9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9JU01BUCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSVNUWUxFKSkgewotCQkJLy8gKGlzdHlsZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSVNUWUxFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9MQUJFTCkpIHsKLQkJCS8vIChsYWJlbCAlVGV4dDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xBQkVMLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9MQU5HKSkgewotCQkJLy8gKGxhbmcgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEFOR1VBR0VfQ09ERSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xBTkcsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xBTkdVQUdFKSkgewotCQkJLy8gKGxhbmd1YWdlICVDREFUQTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xBTkdVQUdFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9MSU5LKSkgewotCQkJLy8gKGxpbmsgJUNvbG9yOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT0xPUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xJTkssIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xPTkdERVNDKSkgewotCQkJLy8gKGxvbmdkZXNjICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTE9OR0RFU0MsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xPT1ApKSB7Ci0JCQkvLyAobG9vcCBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTE9PUCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTUFDUk8pKSB7Ci0JCQkvLyAobWFjcm8gQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01BQ1JPLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NQVBGSUxFKSkgewotCQkJLy8gKG1hcGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVBGSUxFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NQVJHSU5XSURUSCkpIHsKLQkJCS8vIChtYXJnaW53aWR0aCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVJHSU5XSURUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTUFSR0lOSEVJR0hUKSkgewotCQkJLy8gKG1hcmdpbmhlaWdodCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVJHSU5IRUlHSFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01BWExFTkdUSCkpIHsKLQkJCS8vIChtYXhsZW5ndGggTlVNQkVSICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUFYTEVOR1RILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NQVlTQ1JJUFQpKSB7Ci0JCQkvLyAobWF5c2NyaXB0IChtYXlzY3JpcHQpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX01BWVNDUklQVH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01BWVNDUklQVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTUVESUEpKSB7Ci0JCQkvLyAobWVkaWEgJU1lZGlhRGVzYzsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTUVESUFfREVTQyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01FRElBLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NRVRIT0QpKSB7Ci0JCQkvLyAobWV0aG9kIChHRVR8UE9TVCkgR0VUKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9HRVQsIEFUVFJfVkFMVUVfUE9TVH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfR0VUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUVUSE9ELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NVUxUSVBMRSkpIHsKLQkJCS8vIChtdWx0aXBsZSAobXVsdGlwbGUpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX01VTFRJUExFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTVVMVElQTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX05BTUUpKSB7Ci0JCQkvLyAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTkFNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTk9IUkVGKSkgewotCQkJLy8gKG5vaHJlZiAobm9ocmVmKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9OT0hSRUZ9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OT0hSRUYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX05PUkVTSVpFKSkgewotCQkJLy8gKG5vcmVzaXplIChub3Jlc2l6ZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfTk9SRVNJWkV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OT1JFU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTk9TSEFERSkpIHsKLQkJCS8vIChub3NoYWRlIChub3NoYWRlKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9OT1NIQURFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTk9TSEFERSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTk9XUkFQKSkgewotCQkJLy8gKG5vd3JhcCAobm93cmFwKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9OT1dSQVB9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OT1dSQVAsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09CSkVDVCkpIHsKLQkJCS8vIChvYmplY3QgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfT0JKRUNUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT0JKRUNULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkJMVVIpKSB7Ci0JCQkvLyAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OQkxVUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05DTElDSykpIHsKLQkJCS8vIChvbmNsaWNrICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OQ0xJQ0ssIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OQ0hBTkdFKSkgewotCQkJLy8gKG9uY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OQ0hBTkdFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkRCTENMSUNLKSkgewotCQkJLy8gKG9uZGJsY2xpY2sgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05EQkxDTElDSywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05GT0NVUykpIHsKLQkJCS8vIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09ORk9DVVMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OSEVMUCkpIHsKLQkJCS8vIChvbmhlbHAgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05IRUxQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTktFWVBSRVNTKSkgewotCQkJLy8gKG9ua2V5cHJlc3MgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05LRVlQUkVTUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05LRVlET1dOKSkgewotCQkJLy8gKG9ua2V5ZG93biAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTktFWURPV04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OS0VZVVApKSB7Ci0JCQkvLyAob25reWV1cCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTktFWVVQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkxPQUQpKSB7Ci0JCQkvLyAob25sb2FkICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OTE9BRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05NT1VTRURPV04pKSB7Ci0JCQkvLyAob25tb3VzZWRvd24gJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05NT1VTRURPV04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OTU9VU0VVUCkpIHsKLQkJCS8vIChvbm1vdXNldXAgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05NT1VTRVVQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTk1PVVNFT1ZFUikpIHsKLQkJCS8vIChvbm1vdXNlb3ZlciAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTk1PVVNFT1ZFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05NT1VTRU1PVkUpKSB7Ci0JCQkvLyAob25tb3VzZW1vdmUgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05NT1VTRU1PVkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OTU9VU0VPVVQpKSB7Ci0JCQkvLyAob25tb3VzZW91dCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTk1PVVNFT1VULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTlJFU0VUKSkgewotCQkJLy8gKG9ucmVzZXQgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05SRVNFVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05TRUxFQ1QpKSB7Ci0JCQkvLyAob25zZWxlY3QgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05TRUxFQ1QsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OU1VCTUlUKSkgewotCQkJLy8gKG9uc3VibWl0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OU1VCTUlULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTlVOTE9BRCkpIHsKLQkJCS8vIChvbnVubG9hZCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTlVOTE9BRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUEFMRVRURSkpIHsKLQkJCS8vIChwYWxldHRlIENEQVRBOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUEFMRVRURSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUEFORUwpKSB7Ci0JCQkvLyAocGFuZWwgQ0RBVEE7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9QQU5FTCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUExBWUNPVU5UKSkgewotCQkJLy8gKHBsYXljb3VudCBOVU1CRVI7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUExBWUNPVU5ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9QUk9GSUxFKSkgewotCQkJLy8gKHByb2ZpbGUgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9QUk9GSUxFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9QUk9NUFQpKSB7Ci0JCQkvLyAocHJvbXB0ICVUZXh0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUFJPTVBULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9SRUFET05MWSkpIHsKLQkJCS8vIChyZWFkb25seSAocmVhZG9ubHkpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX1JFQURPTkxZfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUkVBRE9OTFksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1JFUEVBVCkpIHsKLQkJCS8vIChyZXBlYXQgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1JFUEVBVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUkVMKSkgewotCQkJLy8gKHJlbCAlTGlua1R5cGVzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MSU5LX1RZUEVTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUkVMLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9SRVYpKSB7Ci0JCQkvLyAocmV2ICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxJTktfVFlQRVMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9SRVYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1JPV1MpKSB7Ci0JCQkvLyAocm93cyBOVU1CRVIgI1JFUVVJUkVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUk9XUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUk9XU1BBTikpIHsKLQkJCS8vIChyb3dzcGFuIE5VTUJFUiAxKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV8xKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUk9XU1BBTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUlVMRVMpKSB7Ci0JCQkvLyAocnVsZXMgJVRSdWxlczsgI0lNUExJRUQpCi0JCQkvLyAlVFJ1bGVzOyBpcyAobm9uZSB8IGdyb3VwcyB8IHJvd3MgfCBjb2xzIHwgYWxsKS4KLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTk9ORSwgQVRUUl9WQUxVRV9HUk9VUFMsIEFUVFJfVkFMVUVfUk9XUywgQVRUUl9WQUxVRV9DT0xTLCBBVFRSX1ZBTFVFX0FMTH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1JVTEVTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TQ0FMRSkpIHsKLQkJCS8vIChzY2FsZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0NBTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NDSEVNRSkpIHsKLQkJCS8vIChzY2hlbWUgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NDSEVNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0VMRUNURUQpKSB7Ci0JCQkvLyAoc2VsZWN0ZWQgKHNlbGVjdGVkKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9TRUxFQ1RFRH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NFTEVDVEVELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TQ09QRSkpIHsKLQkJCS8vIChTQ09QRSAlU2NvcGU7ICNJTVBMSUVEKQotCQkJLy8gJVNjb3BlOyBpcyAocm93fGNvbHxyb3dncm91cHxjb2xncm91cCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfUk9XLCBBVFRSX1ZBTFVFX0NPTCwgQVRUUl9WQUxVRV9ST1dHUk9VUCwgQVRUUl9WQUxVRV9DT0xHUk9VUH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NDT1BFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TQ1JPTExBTU9VTlQpKSB7Ci0JCQkvLyAoc2Nyb2xsYW1vdW50IE5VTUJFUiAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NDUk9MTEFNT1VOVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0NST0xMREVMQVkpKSB7Ci0JCQkvLyAoc2Nyb2xsZGVsYXkgTlVNQkVSICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0NST0xMREVMQVksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NDUk9MTElORykpIHsKLQkJCS8vIChzY3JvbGxpbmcgKHllc3xub3xhdXRvKSBhdXRvKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9ZRVMsIEFUVFJfVkFMVUVfTk8sIEFUVFJfVkFMVUVfQVVUT307Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfQVVUTyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NDUk9MTElORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0hBUEUpKSB7Ci0JCQkvLyAoc2hhcGUgJVNoYXBlOyByZWN0KTogJVNoYXBlOyBpcyAocmVjdHxjaXJjbGV8cG9seXxkZWZhdWx0KS4KLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfUkVDVCwgQVRUUl9WQUxVRV9DSVJDTEUsIEFUVFJfVkFMVUVfUE9MWSwgQVRUUl9WQUxVRV9ERUZBVUxUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9SRUNUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0hBUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NIT1dDT05UUk9MUykpIHsKLQkJCS8vIChzaG93Y29udHJvbHMgKHRydWV8ZmFsc2UpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0hPV0NPTlRST0xTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TSVpFKSkgewotCQkJLy8gKHNpemUgJVBpeGVsczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuUElYRUxTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0laRUZNVCkpIHsKLQkJCS8vIChzaXplZm10IENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TSVpFRk1ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TUEFOKSkgewotCQkJLy8gKHNwYW4gTlVNQkVSIDEpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFXzEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TUEFOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TUkMpKSB7Ci0JCQkvLyAoc3JjICVVUkk7ICNJTVBMSUVEKQotCQkJLy8gTk9URTogInNyYyIgYXR0cmlidXRlcyBhcmUgZGVmaW5lZCBpbiBzZXZlcmFsIGVsZW1lbnRzLgotCQkJLy8gVGhlIGRlZmluaXRpb24gb2YgSU1HIGlzIGRpZmZlcmVudCBmcm9tIG90aGVycy4KLQkJCS8vIFNvLCBpdCBzaG91bGQgYmUgbG9jYWxseSBkZWZpbmVkLgotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU1JDLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TVEFSVCkpIHsKLQkJCS8vIChzdGFydCBOVU1CRVIgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TVEFSVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU1RBTkRCWSkpIHsKLQkJCS8vIChzdGFuZGJ5ICVUZXh0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU1RBTkRCWSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU1RZTEUpKSB7Ci0JCQkvLyAoc3R5bGUgJVN0eWxlU2hlZXQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNUWUxFX1NIRUVUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU1RZTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NVTU1BUlkpKSB7Ci0JCQkvLyAoc3VtbWFyeSAlVGV4dDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NVTU1BUlksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1RBQklOREVYKSkgewotCQkJLy8gKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RBQklOREVYLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9UQVJHRVQpKSB7Ci0JCQkvLyAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuRlJBTUVfVEFSR0VUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVEFSR0VULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9URVhUKSkgewotCQkJLy8gKHRleHQgJUNvbG9yOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT0xPUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RFWFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1RFWFRGT0NVUykpIHsKLQkJCS8vICh0ZXh0Zm9jdXMgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RFWFRGT0NVUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVElUTEUpKSB7Ci0JCQkvLyAodGl0bGUgJVRleHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9USVRMRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVElNRUZNVCkpIHsKLQkJCS8vICh0aW1lZm10IENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9USU1FRk1ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9UUlVFU1BFRUQpKSB7Ci0JCQkvLyAodHJ1ZXNwZWVkICh0cnVlc3BlZWQpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX1RSVUVTUEVFRH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RSVUVTUEVFRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVFlQRSkpIHsKLQkJCS8vICh0eXBlICVDb3RlbnRUeXBlOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9VU0VNQVApKSB7Ci0JCQkvLyAodXNlbWFwICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVVNFTUFQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WQUxJR04pKSB7Ci0JCQkvLyAodmFsaWduICh0b3B8bWlkZGxlfGJvdHRvbXxiYXNlbGluZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RPUCwgQVRUUl9WQUxVRV9NSURETEUsIEFUVFJfVkFMVUVfQk9UVE9NLCBBVFRSX1ZBTFVFX0JBU0VMSU5FfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkFMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WQUxVRSkpIHsKLQkJCS8vICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkFMVUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZBTFVFVFlQRSkpIHsKLQkJCS8vICh2YWx1ZXR5cGUgKERBVEF8UkVGfE9CSkVDVCkgREFUQSkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfREFUQSwgQVRUUl9WQUxVRV9SRUYsIEFUVFJfVkFMVUVfT0JKRUNUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9EQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkFMVUVUWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WQVIpKSB7Ci0JCQkvLyAodmFyIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WQVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZFUlNJT04pKSB7Ci0JCQkvLyAodmVyc2lvbiBDREFUQSAjRklYRUQgJyVIVE1MLlZlcnNpb247KQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9GSVhFRCwgQVRUUl9WQUxVRV9WRVJTSU9OX1RSQU5TSVRJT05BTCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZFUlNJT04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLkZJWEVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZJUlRVQUwpKSB7Ci0JCQkvLyAodmlydHVhbCAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZJUlRVQUwsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZMSU5LKSkgewotCQkJLy8gKHZsaW5rICVDb2xvcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09MT1IpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WTElOSywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVk9MVU1FKSkgewotCQkJLy8gKHZvbHVtZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVk9MVU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9XSURUSCkpIHsKLQkJCS8vICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MRU5HVEgpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9XSURUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVlNQQUNFKSkgewotCQkJLy8gKHZzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WU1BBQ0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQkJLy8gPDxEMjA1NTE0Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVE9QTUFSR0lOKSkgewotCQkJLy8gKHRvcG1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UT1BNQVJHSU4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0JPVFRPTU1BUkdJTikpIHsKLQkJCS8vIChib3R0b21tYXJnaW4sIENEQVRBLCAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQk9UVE9NTUFSR0lOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9MRUZUTUFSR0lOKSkgewotCQkJLy8gKGxlZnRtYXJnaW4sIENEQVRBLCAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTEVGVE1BUkdJTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUklHSFRNQVJHSU4pKSB7Ci0JCQkvLyAocmlnaHRtYXJnaW4sIENEQVRBLCAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUklHSFRNQVJHSU4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0JPUkRFUkNPTE9SKSkgewotCQkJLy8gKGJvcmRlcmNvbG9yLCAlQ29sb3I7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTE9SKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQk9SREVSQ09MT1IsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCS8vIEQyMDU1MTQKLQotCQl9Ci0JCWVsc2UgewotCQkJLy8gdW5rbm93biBhdHRyaWJ1dGU7IG1heWJlIGVycm9yLgotCQkJLy8gc2hvdWxkIHdhcm4uCi0JCQlhdHRyID0gbnVsbDsKLQkJfQotCi0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGlnbiBhdHRyaWJ1dGUgd2hpY2ggaGFzICVDQWxpZ247IGFzIHZhbHVlcy4uIEF0IHRoaXMgdGltZQotCSAqICg0LzE5LzIwMDEpLCBpdCBpcyBpZGVudGljYWwgdG8gJUxBbGlnbjsuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVE1MQXR0ckRlY2xJbXBsIGNyZWF0ZUFsaWduRm9yQ2FwdGlvbigpIHsKLQkJLy8gYWxpZ24gKGxvY2FsKQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCS8vIHNldCBlbnVtIHZhbHVlcwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UT1AsIEFUVFJfVkFMVUVfQk9UVE9NLCBBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfUklHSFR9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGlnbiBhdHRyaWJ1dGUgd2hpY2ggaGFzICVJQWxpZ247IGFzIHZhbHVlcy4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVE1MQXR0ckRlY2xJbXBsIGNyZWF0ZUFsaWduRm9ySW1hZ2UoKSB7Ci0JCS8vIGFsaWduIChsb2NhbCkKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkvLyBzZXQgZW51bSB2YWx1ZXMKLQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVE9QLCBBVFRSX1ZBTFVFX01JRERMRSwgQVRUUl9WQUxVRV9CT1RUT00sIEFUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9SSUdIVH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsaWduIGF0dHJpYnV0ZSB3aGljaCBoYXMgJUxBbGlnbjsgYXMgdmFsdWVzLi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUTUxBdHRyRGVjbEltcGwgY3JlYXRlQWxpZ25Gb3JMZWdlbmQoKSB7Ci0JCS8vIGFsaWduIChsb2NhbCkKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkvLyBzZXQgZW51bSB2YWx1ZXMKLQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVE9QLCBBVFRSX1ZBTFVFX0JPVFRPTSwgQVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX1JJR0hUfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BTElHTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uIGZvciA8Y29kZT5hbGlnbjwvY29kZT4gaW4gc2V2ZXJhbAotCSAqIGVsZW1lbnRzLCBsaWtlIDxjb2RlPlA8L2NvZGU+LCA8Y29kZT5ESVY8L2NvZGU+LiBUaGUgdmFsdWVzIGFyZQotCSAqIGRpZmZlcmVudCBmcm9tIGF0dHJpYnV0ZXMgdGhvc2UgaGF2ZSB0aGUgc2FtZSBuYW1lIGluIG90aGVyIGVsZW1lbnRzICg8Y29kZT5JTUc8L2NvZGU+Ci0JICogYW5kIDxjb2RlPlRBQkxFPC9jb2RlPikuIFNvLCBpdCBjYW4ndCB0cmVhdCBhcyBnbG9iYWwgYXR0cmlidXRlcy4KLQkgKiA8c3Ryb25nPk5PVEU6IFRoZXNlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiBoYXMgbm8gb3duZXIgQ01Eb2N1bWVudAotCSAqIGluc3RhbmNlLjwvc3Ryb25nPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRNTEF0dHJEZWNsSW1wbCBjcmVhdGVBbGlnbkZvclBhcmFncmFwaCgpIHsKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkvLyBzZXQgZW51bSB2YWx1ZXM6IGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnkKLQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9DRU5URVIsIEFUVFJfVkFMVUVfUklHSFQsIEFUVFJfVkFMVUVfSlVTVElGWX07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVhdHRyczsgZGVjbGFyYXRpb25zLiAlYXR0cnM7IGNvbnNpc3RzIG9mICVjb3JlYXR0cnM7LCAlaTE4biwgYW5kCi0JICogJWV2ZW50czsuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0QXR0cnMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQkvLyAlY29yZWF0dHJzOwotCQlJdGVyYXRvciBuYW1lcyA9IEFycmF5cy5hc0xpc3QoQ09SRSkuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCQkvLyAlaTE4bjsKLQkJbmFtZXMgPSBBcnJheXMuYXNMaXN0KEkxOE4pLml0ZXJhdG9yKCk7Ci0JCWdldERlY2xhcmF0aW9ucyhkZWNsYXJhdGlvbnMsIG5hbWVzKTsKLQkJLy8gJWV2ZW50czsKLQkJbmFtZXMgPSBBcnJheXMuYXNMaXN0KEVWRU5UUykuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEdldCAlYm9keWNvbG9yczsgZGVjbGFyYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIGdldEJvZHljb2xvcnMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQlJdGVyYXRvciBuYW1lcyA9IEFycmF5cy5hc0xpc3QoQk9EWUNPTE9SUykuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEdldCAlY2VsbGhhbGlnbjsgZGVjbGFyYXRpb25zLiAlY2VsbGhhbGlnaDsgY29uc2lzdHMgb2Y6IC0gKGFsaWduCi0JICogKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQpIC0gKGNoYXIgJUNoYXJhY3RlcjsKLQkgKiAjSU1QTElFRCkgLSAoY2hhcm9mZiAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRDZWxsaGFsaWduKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQkJLy8gKGFsaWduIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5fGNoYXIpICNJTVBMSUVEKSBzaG91bGQgYmUgZGVmaW5lZAotCQkvLyBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCS8vIHNldCBlbnVtIHZhbHVlcwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX0NFTlRFUiwgQVRUUl9WQUxVRV9SSUdIVCwgQVRUUl9WQUxVRV9KVVNUSUZZLCBBVFRSX1ZBTFVFX0NIQVJ9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQotCQkvLyB0aGUgcmVzdC4KLQkJSXRlcmF0b3IgbmFtZXMgPSBBcnJheXMuYXNMaXN0KENFTExIQUxJR04pLml0ZXJhdG9yKCk7Ci0JCWdldERlY2xhcmF0aW9ucyhkZWNsYXJhdGlvbnMsIG5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWNlbGx2YWxpZ247IGRlY2xhcmF0aW9ucy4gJWNlbGxoYWxpZ2g7IGlzOiAtICh2YWxpZ24KLQkgKiAodG9wfG1pZGRsZXxib3R0b218YmFzZWxpbmUpICNJTVBMSUVEKQotCSAqLwotCXB1YmxpYyB2b2lkIGdldENlbGx2YWxpZ24oQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gZGVjID0gZ2V0RGVjbGFyYXRpb24oQVRUUl9OQU1FX1ZBTElHTik7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1ZBTElHTiwgZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWNvcmVhdHRyczsgZGVjbGFyYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIGdldENvcmUoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQlJdGVyYXRvciBuYW1lcyA9IEFycmF5cy5hc0xpc3QoQ09SRSkuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEdldCBhIGdsb2JhbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGF0dHJOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbihTdHJpbmcgYXR0ck5hbWUpIHsKLQkJQ01Ob2RlIGNtbm9kZSA9IGdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCWlmIChjbW5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGU7IC8vIGFscmVhZHkgZXhpc3RzLgotCi0JCUhUTUxBdHRyRGVjbEltcGwgZGVjID0gY3JlYXRlKGF0dHJOYW1lKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJcHV0TmFtZWRJdGVtKGF0dHJOYW1lLCBkZWMpOwotCi0JCXJldHVybiBkZWM7Ci0JfQotCi0JLyoqCi0JICogR2V0IGRlY2xhcmF0aW9ucyB3aGljaCBhcmUgc3BlY2lmaWVkIGJ5IG5hbWVzLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lcwotCSAqICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RGVjbGFyYXRpb25zKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMsIEl0ZXJhdG9yIG5hbWVzKSB7Ci0JCXdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHQoKTsKLQkJCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBkZWMgPSBnZXREZWNsYXJhdGlvbihhdHRyTmFtZSk7Ci0JCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShhdHRyTmFtZSwgZGVjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCAlZXZlbnRzOyBkZWNsYXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RXZlbnRzKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQkJSXRlcmF0b3IgbmFtZXMgPSBBcnJheXMuYXNMaXN0KEVWRU5UUykuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEdldCAlaTE4bjsgZGVjbGFyYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIGdldEkxOG4oQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQlJdGVyYXRvciBuYW1lcyA9IEFycmF5cy5hc0xpc3QoSTE4TikuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLQkKLQkvKioKLQkgKiBjcmVhdGUgZGVjbGFyYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucyhTdHJpbmcgZWxlbWVudE5hbWUsIENNTmFtZWROb2RlTWFwSW1wbCBhdHRyaWJ1dGVzKSB7Ci0JCSAvKiAodHlwZSAlSW5wdXRUeXBlOyBURVhUKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkJICogKGNoZWNrZWQgKGNoZWNrZWQpICNJTVBMSUVEKQotCQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkJICogKHJlYWRvbmx5IChyZWFkb25seSkgI0lNUExJRUQpCi0JCSAqIChzaXplIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJICogKG1heGxlbmd0aCBOVU1CRVIgI0lNUExJRUQpCi0JCSAqIChzcmMgJVVSSTsgI0lNUExJRUQpCi0JCSAqIChhbHQgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkgKiAodXNlbWFwICVVUkk7ICNJTVBMSUVEKQotCQkgKiAoaXNtYXAgKGlzbWFwKSAjSU1QTElFRCkKLQkJICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkJICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkJICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JCSAqIChvbnNlbGVjdCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJICogKG9uY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkgKiAoYWNjZXB0ICVDb250ZW50VHlwZXM7ICNJTVBMSUVEKQotCQkgKiAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkgKiAoaXN0eWxlIENEQVRBICNJTVBMSUVEKQotCQkgKiA8PEQyMTU2ODQKLQkJICogKHdpZHRoIENEQVRBOyAjSU1QTElFRCkKLQkJICogKGhlaWdodCBDREFUQTsgI0lNUExJRUQpCi0JCSAqIChib3JkZXIgQ0RBVEE7ICNJTVBMSUVEKQotCQkgKiBEMjE1Njg0Ci0JCSAqLwotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTlBVVCkpewotCQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQkJCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCQkvLyAodHlwZSAlSW5wdXRUeXBlOyBURVhUKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJCS8vIE5PVEU6ICVJbnB1dFR5cGUgaXMgRU5VTTsKLQkJCS8vICh0ZXh0IHwgcGFzc3dvcmQgfCBjaGVja2JveCB8IHJhZGlvIHwgc3VibWl0IHwgcmVzZXQgfAotCQkJLy8gIGZpbGUgfCBoaWRkZW4gfCBpbWFnZSB8IGJ1dHRvbikKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVEVYVCwgQVRUUl9WQUxVRV9QQVNTV09SRCwgQVRUUl9WQUxVRV9DSEVDS0JPWCwgQVRUUl9WQUxVRV9SQURJTywgQVRUUl9WQUxVRV9TVUJNSVQsIEFUVFJfVkFMVUVfUkVTRVQsIEFUVFJfVkFMVUVfRklMRSwgQVRUUl9WQUxVRV9ISURERU4sIEFUVFJfVkFMVUVfSU1BR0UsIEFUVFJfVkFMVUVfQlVUVE9OfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCi0JCQkvLyAoc2l6ZSBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9TSVpFLCBhdHRyKTsKLQotCQkJLy8gKGFsdCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FMVCwgYXR0cik7Ci0KLQkJCS8vIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQlhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckltYWdlKCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCi0JCQkvLyB0aGUgcmVzdC4KLQkJCVN0cmluZ1tdIG5hbWVzID0ge0FUVFJfTkFNRV9OQU1FLCBBVFRSX05BTUVfVkFMVUUsIEFUVFJfTkFNRV9DSEVDS0VELCBBVFRSX05BTUVfRElTQUJMRUQsIEFUVFJfTkFNRV9SRUFET05MWSwgQVRUUl9OQU1FX1NJWkUsIEFUVFJfTkFNRV9NQVhMRU5HVEgsIEFUVFJfTkFNRV9TUkMsIEFUVFJfTkFNRV9BTFQsIEFUVFJfTkFNRV9VU0VNQVAsIEFUVFJfTkFNRV9JU01BUCwgQVRUUl9OQU1FX1RBQklOREVYLCBBVFRSX05BTUVfQUNDRVNTS0VZLCBBVFRSX05BTUVfT05GT0NVUywgQVRUUl9OQU1FX09OQkxVUiwgQVRUUl9OQU1FX09OU0VMRUNULCBBVFRSX05BTUVfT05DSEFOR0UsIEFUVFJfTkFNRV9BQ0NFUFQsIEFUVFJfTkFNRV9BTElHTiwgQVRUUl9OQU1FX0lTVFlMRSwKLQkJCS8vPDxEMjE1Njg0Ci0JCQkJCQlBVFRSX05BTUVfV0lEVEgsIEFUVFJfTkFNRV9IRUlHSFQsIEFUVFJfTkFNRV9CT1JERVIKLQkJCS8vPEQyMTU2ODQKLQkJCX07Ci0JCQlnZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCX0KLQkJIC8qIChjaGFyc2V0ICVDaGFyc2V0OyAjSU1QTElFRCkKLQkJICogKGhyZWYgJVVSSTsgI0lNUExJRUQpCi0JCSAqIChocmVmbGFuZyAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCkKLQkJICogKHR5cGUgJUNvbnRlbnRUeXBlOyAjSU1QTElFRCk6IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCSAqIChyZWwgJUxpbmtUeXBlczsgI0lNUExJRUQpCi0JCSAqIChyZXYgJUxpbmtUeXBlczsgI0lNUExJRUQpCi0JCSAqIChtZWRpYSAlTWVkaWFEZXNjOyAjSU1QTElFRCkKLQkJICogKHRhcmdldCAlRnJhbWVUYXJnZXQ7ICNJTVBMSUVEKQotCQkgKi8KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSU5LKSl7Ci0JCQlTdHJpbmdbXSBuYW1lcyA9IHtBVFRSX05BTUVfQ0hBUlNFVCwgQVRUUl9OQU1FX0hSRUYsIEFUVFJfTkFNRV9IUkVGTEFORywgQVRUUl9OQU1FX1JFTCwgQVRUUl9OQU1FX1JFViwgQVRUUl9OQU1FX01FRElBLCBBVFRSX05BTUVfVEFSR0VUfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkJLy8gKHR5cGUgJUNvbnRlbnRUeXBlOyAjSU1QTElFRCkKLQkJCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09OVEVOVF9UWVBFKTsKLQkJCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0JCQotCQl9Ci0JCS8qIChjaGFyc2V0ICVDaGFyc2V0OyAjSU1QTElFRCkKLQkJICogKHR5cGUgJUNvbnRlbnRUeXBlOyAjSU1QTElFRCkKLQkJICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JCSAqIChocmVmICVVUkk7ICNJTVBMSUVEKQotCQkgKiAoaHJlZmxhbmcgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQpCi0JCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkJICogKHJlbCAlTGlua1R5cGVzOyAjSU1QTElFRCkKLQkJICogKHJldiAlTGlua1R5cGVzOyAjSU1QTElFRCkKLQkJICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkJICogKGRpcmVjdGtleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkJICogKHNoYXBlICVTaGFwZTsgcmVjdCkKLQkJICogKGNvb3JkcyAlQ29vcmRzOyAjSU1QTElFRCkKLQkJICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkJICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpIAotCQkgKi8KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BKSl7Ci0JCQlTdHJpbmdbXSBuYW1lcyA9IHtBVFRSX05BTUVfQ0hBUlNFVCwgQVRUUl9OQU1FX1RZUEUsIEFUVFJfTkFNRV9OQU1FLCBBVFRSX05BTUVfSFJFRiwgQVRUUl9OQU1FX0hSRUZMQU5HLCBBVFRSX05BTUVfVEFSR0VULCBBVFRSX05BTUVfUkVMLCBBVFRSX05BTUVfUkVWLCBBVFRSX05BTUVfQUNDRVNTS0VZLCBBVFRSX05BTUVfRElSRUNUS0VZLCBBVFRSX05BTUVfU0hBUEUsIEFUVFJfTkFNRV9DT09SRFMsIEFUVFJfTkFNRV9UQUJJTkRFWCwgQVRUUl9OQU1FX09ORk9DVVMsIEFUVFJfTkFNRV9PTkJMVVJ9OwotCQkJZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCQkKLQkJfQotCQkvKgotCQkgKiAoc2hhcGUgJVNoYXBlOyByZWN0KQotCQkgKiAoY29vcmRzICVDb29yZHM7ICNJTVBMSUVEKQotCQkgKiAoaHJlZiAlVVJJOyAjSU1QTElFRCkKLQkJICogKHRhcmdldCAlRnJhbWVUYXJnZXQ7ICNJTVBMSUVEKQotCQkgKiAobm9ocmVmIChub2hyZWYpICNJTVBMSUVEKQotCQkgKiAoYWx0ICVUZXh0OyAjUkVRVUlSRUQpCi0JCSAqICh0YWJpbmRleCBOVU1CRVIgI0lNUExJRUQpCi0JCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkgKi8KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BUkVBKSl7Ci0JCQlTdHJpbmdbXSBuYW1lcyA9IHtBVFRSX05BTUVfU0hBUEUsIEFUVFJfTkFNRV9DT09SRFMsIEFUVFJfTkFNRV9IUkVGLCBBVFRSX05BTUVfVEFSR0VULCBBVFRSX05BTUVfTk9IUkVGLCBBVFRSX05BTUVfQUxULCBBVFRSX05BTUVfVEFCSU5ERVgsIEFUVFJfTkFNRV9BQ0NFU1NLRVksIEFUVFJfTkFNRV9PTkZPQ1VTLCBBVFRSX05BTUVfT05CTFVSfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJfQotCQkvKgotCQkgKiAgJWkxOG47Ci0JCSAqIChodHRwLWVxdWl2IE5BTUUgI0lNUExJRUQpCi0JCSAqIChuYW1lIE5BTUUgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkgKiAoY29udGVudCBDREFUQSAjUkVRVUlSRUQpCi0JCSAqIChzY2hlbWUgQ0RBVEEgI0lNUExJRUQpCi0JCSAqLwotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FVEEpKXsKLQkJCS8vICVpMThuOwotCQkJZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQotCQkJLy8gKG5hbWUgTkFNRSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk5BTUUpOwotCQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX05BTUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OQU1FLCBhdHRyKTsKLQotCQkJU3RyaW5nW10gbmFtZXMgPSB7QVRUUl9OQU1FX0hUVFBfRVFVSVYsIEFUVFJfTkFNRV9DT05URU5ULCBBVFRSX05BTUVfU0NIRU1FfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJfQotCQkvKgotCQkgKiAoc3JjICVVUkk7ICNSRVFVSVJFRCk6IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCSAqIChhbHQgJVRleHQ7ICNSRVFVSVJFRCkKLQkJICogKGxvbmdkZXNjICVVUkk7ICNJTVBMSUVEKQotCQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkJICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkJICogKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCQkgKiAodXNlbWFwICVVUkk7ICNJTVBMSUVEKQotCQkgKiAoaXNtYXAgKGlzbWFwKSAjSU1QTElFRCkKLQkJICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKTogc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJICogKGJvcmRlciAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJICogKGhzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJICogKHZzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJICogKG1hcGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JIAotCQkgKi8KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTUcpKXsKLQkJCS8vIChzcmMgJVVSSTsgI1JFUVVJUkVEKTogc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU1JDLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfU1JDLCBhdHRyKTsKLQotCQkJU3RyaW5nW10gbmFtZXMgPSB7QVRUUl9OQU1FX0FMVCwgQVRUUl9OQU1FX0xPTkdERVNDLCBBVFRSX05BTUVfTkFNRSwgQVRUUl9OQU1FX0hFSUdIVCwgQVRUUl9OQU1FX1dJRFRILCBBVFRSX05BTUVfVVNFTUFQLCBBVFRSX05BTUVfSVNNQVAsIEFUVFJfTkFNRV9CT1JERVIsIEFUVFJfTkFNRV9IU1BBQ0UsIEFUVFJfTkFNRV9WU1BBQ0UsIEFUVFJfTkFNRV9NQVBGSUxFfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkJLy8gYWxpZ24gKGxvY2FsKTsgc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJCWF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9ySW1hZ2UoKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JCQotCQl9Ci0JCS8qCi0JCSAqIChpZCBJRCAjSU1QTElFRCkKLQkJICogKG5hbWUgQ0RBVEEgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJICogKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCQkgKiAodmFsdWV0eXBlIChEQVRBfFJFRnxPQkpFQ1QpIERBVEEpCi0JCSAqICh0eXBlICVDb250ZW50VHlwZTsgI0lNUExJRUQpCi0JCSAqLwotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNKSl7Ci0JCQlTdHJpbmdbXSBuYW1lcyA9IHtBVFRSX05BTUVfSUQsIEFUVFJfTkFNRV9WQUxVRSwgQVRUUl9OQU1FX1ZBTFVFVFlQRSwgQVRUUl9OQU1FX1RZUEV9OwotCQkJZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCQkvLyAobmFtZSBDREFUQSAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OQU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYXR0cik7Ci0JCX0KLQkJLyoKLQkJICogJXJlc2VydmVkOyAuLi4gZW1wdHkKLQkJICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JCSAqIChyb3dzIE5VTUJFUiAjUkVRVUlSRUQpCi0JCSAqIChjb2xzIE5VTUJFUiAjUkVRVUlSRUQpCi0JCSAqIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCQkgKiAocmVhZG9ubHkgKHJlYWRvbmx5KSAjSU1QTElFRCkKLQkJICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkJICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkJICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JCSAqIChvbnNlbGVjdCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJICogKG9uY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkgKiAoaXN0eWxlIENEQVRBICNJTVBMSUVEKQotCQkgKi8KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URVhUQVJFQSkpewotCQkJU3RyaW5nW10gbmFtZXMgPSB7QVRUUl9OQU1FX05BTUUsIEFUVFJfTkFNRV9ST1dTLCBBVFRSX05BTUVfQ09MUywgQVRUUl9OQU1FX0RJU0FCTEVELCBBVFRSX05BTUVfUkVBRE9OTFksIEFUVFJfTkFNRV9UQUJJTkRFWCwgQVRUUl9OQU1FX0FDQ0VTU0tFWSwgQVRUUl9OQU1FX09ORk9DVVMsIEFUVFJfTkFNRV9PTkJMVVIsIEFUVFJfTkFNRV9PTlNFTEVDVCwgQVRUUl9OQU1FX09OQ0hBTkdFLCBBVFRSX05BTUVfSVNUWUxFfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJfQotCQkvKgotCQkgKiAoY2hhcnNldCAlQ2hhcnNldDsgI0lNUExJRUQpCi0JCSAqICh0eXBlICVDb250ZW50VHlwZTsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJICogKGxhbmd1YWdlIENEQVRBICNJTVBMSUVEKQotCQkgKiAoc3JjICVVUkk7ICNJTVBMSUVEKQotCQkgKiAoZGVmZXIgKGRlZmVyKSAjSU1QTElFRCkKLQkJICogKGV2ZW50IENEQVRBICNJTVBMSUVEKQotCQkgKiAoZm9yICVVUkk7ICNJTVBMSUVEKQotCQkgKi8KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQpKXsKLQkJCVN0cmluZ1tdIG5hbWVzID0ge0FUVFJfTkFNRV9DSEFSU0VULCBBVFRSX05BTUVfTEFOR1VBR0UsIEFUVFJfTkFNRV9TUkMsIEFUVFJfTkFNRV9ERUZFUiwgQVRUUl9OQU1FX0VWRU5ULCBBVFRSX05BTUVfRk9SfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkJLy8gKHR5cGUgJUNvbnRlbnRUeXBlOyAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCAidGV4dC9qYXZhc2NyaXB0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0JCQotCQl9Ci0JCS8qCi0JCSAqICAlaTE4bjsKLQkJICogKHR5cGUgJUNvbnRlbnRUeXBlOyAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkgKiAobWVkaWEgJU1lZGlhRGVzYzsgI0lNUExJRUQpCi0JCSAqICh0aXRsZSAlVGV4dDsgI0lNUExJRUQpCi0JCSAqLwotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFKSl7Ci0JCQkvLyAlaTE4bjsKLQkJCWdldEkxOG4oYXR0cmlidXRlcyk7Ci0KLQkJCVN0cmluZ1tdIG5hbWVzID0ge0FUVFJfTkFNRV9NRURJQSwgQVRUUl9OQU1FX1RJVExFfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJCS8vICh0eXBlICVDb250ZW50VHlwZTsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09OVEVOVF9UWVBFKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgInRleHQvY3NzIik7IC8vJE5PTi1OTFMtMSQKLQkJCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0JCQotCQl9Ci0JCS8qCi0JCSAqICVyZXNlcnZlZDsKLQkJICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JCSAqIChzaXplIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCSAqIChtdWx0aXBsZSAobXVsdGlwbGUpICNJTVBMSUVEKQotCQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkJICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkJICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JCSAqIChvbmNoYW5nZSAlU2NyaXB0OyAjSU1QTElFRCkKLQkJICovCi0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VMRUNUKSl7Ci0JCQkvLyAoc2l6ZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1NJWkUsIGF0dHIpOwotCi0JCQlTdHJpbmdbXSBuYW1lcyA9IHtBVFRSX05BTUVfTkFNRSwgQVRUUl9OQU1FX01VTFRJUExFLCBBVFRSX05BTUVfRElTQUJMRUQsIEFUVFJfTkFNRV9UQUJJTkRFWCwgQVRUUl9OQU1FX09ORk9DVVMsIEFUVFJfTkFNRV9PTkJMVVIsIEFUVFJfTkFNRV9PTkNIQU5HRX07Ci0JCQlnZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCQotCQl9Ci0JCS8qCi0JCSAqIAkodHlwZSAlTElTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkgKiAodmFsdWUgTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJICovCi0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEkpKXsKLQkJCS8vICh0eXBlICVMSVN0eWxlOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxJX1NUWUxFKTsKLQkJCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0KLQkJCS8vICh2YWx1ZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkFMVUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9WQUxVRSwgYXR0cik7Ci0JCQotCQl9Ci0JCS8qCi0JCSAqICh0eXBlICVPTFN0eWxlOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCSAqIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkJICogKHN0YXJ0IE5VTUJFUiAjSU1QTElFRCkKLQkJICovCi0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0wpKXsKLQkJCS8vICh0eXBlICVPTFN0eWxlOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk9MX1NUWUxFKTsKLQkJCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0KLQkJCS8vIHRoZSByZXN0LgotCQkJU3RyaW5nW10gbmFtZXMgPSB7QVRUUl9OQU1FX0NPTVBBQ1QsIEFUVFJfTkFNRV9TVEFSVH07Ci0JCQlnZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCQotCQl9Ci0JCS8qKgotCQkgKiAlY29yZWF0dHJzOwotCQkgKiAobG9uZ2Rlc2MgJVVSSTsgI0lNUExJRUQpCi0JCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCQkgKiAoc3JjICVVUkk7ICNJTVBMSUVEKQotCQkgKiAoZnJhbWVib3JkZXIgKDF8MCkgMSkKLQkJICogKG1hcmdpbndpZHRoICVQaXhlbHM7ICNJTVBMSUVEKQotCQkgKiAobWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICNJTVBMSUVEKQotCQkgKiAoc2Nyb2xsaW5nICh5ZXN8bm98YXV0bykgYXV0bykKLQkJICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkJICogKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCQkgKi8KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JRlJBTUUpKXsKLQkJCS8vICVjb3JlYXR0cnM7Ci0JCQlnZXRDb3JlKGF0dHJpYnV0ZXMpOwotCi0JCQlTdHJpbmdbXSBuYW1lcyA9IHtBVFRSX05BTUVfTE9OR0RFU0MsIEFUVFJfTkFNRV9OQU1FLCBBVFRSX05BTUVfU1JDLCBBVFRSX05BTUVfRlJBTUVCT1JERVIsIEFUVFJfTkFNRV9NQVJHSU5XSURUSCwgQVRUUl9OQU1FX01BUkdJTkhFSUdIVCwgQVRUUl9OQU1FX1NDUk9MTElORywgQVRUUl9OQU1FX0hFSUdIVCwgQVRUUl9OQU1FX1dJRFRIfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkJLy8gYWxpZ24KLQkJCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JJbWFnZSgpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCQkKLQkJfQotCQkvKgotCQkgKiAlaTE4biBhdHRycwotCQkgKiAldmVyc2lvbgotCQkgKi8KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MKSl7Ci0JCQkvLyAlaTE4bjsKLQkJCWdldEkxOG4oYXR0cmlidXRlcyk7Ci0JCQkvLyB2ZXJzaW9uCi0JCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlYyA9IGdldERlY2xhcmF0aW9uKEFUVFJfTkFNRV9WRVJTSU9OKTsKLQkJCWlmIChhZGVjICE9IG51bGwpCi0JCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1ZFUlNJT04sIGFkZWMpOwotCQkKLQkJfQotCQkvKgotCQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JIAkgKi8KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VKSl7Ci0JCQlTdHJpbmdbXSBuYW1lcyA9IHtBVFRSX05BTUVfQ09NUEFDVH07Ci0JCQlnZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCQotCQl9Ci0JCS8qCi0JCSAqICVyZXNlcnZlZDsgLi4uIGVtcHR5LgotCQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkJICogKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCQkgKiAodHlwZSAoYnV0dG9ufHN1Ym1pdHxyZXNldCkgc3VibWl0KSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JCSAqICh0YWJpbmRleCBOVU1CRVIgI0lNUExJRUQpCi0JCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAJICovCi0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OKSl7Ci0JCQlTdHJpbmdbXSBuYW1lcyA9IHtBVFRSX05BTUVfTkFNRSwgQVRUUl9OQU1FX1ZBTFVFLCBBVFRSX05BTUVfRElTQUJMRUQsIEFUVFJfTkFNRV9UQUJJTkRFWCwgQVRUUl9OQU1FX0FDQ0VTU0tFWSwgQVRUUl9OQU1FX09ORk9DVVMsIEFUVFJfTkFNRV9PTkJMVVJ9OwotCQkJZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCQkvLyAodHlwZSAoYnV0dG9ufHN1Ym1pdHxyZXNldCkgc3VibWl0KSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0JVVFRPTiwgQVRUUl9WQUxVRV9TVUJNSVQsIEFUVFJfVkFMVUVfUkVTRVR9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCi0JCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCQkKLQkJfQotCQkvKgotCQkgKiAlcmVzZXJ2ZWQ7Ci0JCSAqIChzdW1tYXJ5ICVUZXh0OyAjSU1QTElFRCkKLQkJICogKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCQkgKiAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCQkgKiAoZnJhbWUgJVRGcmFtZTsgI0lNUExJRUQpCi0JCSAqIChydWxlcyAlVFJ1bGVzOyAjSU1QTElFRCkKLQkJICogKGNlbGxzcGFjaW5nICVMZW5ndGg7ICNJTVBMSUVEKQotCQkgKiAoY2VsbHBhZGRpbmcgJUxlbmd0aDsgI0lNUExJRUQpCi0JCSAqIChhbGlnbiAlVEFsaWduOyAjSU1QTElFRCkKLQkJICogKGJnY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkJICogKGRhdGFwYWdlc2l6ZSBDREFUQSAjSU1QTElFRCkKLQkJICogKGhlaWdodCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJICogKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JCSAqIChib3JkZXJjb2xvciAlQ29sb3IgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JCSAqLwotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFKSl7Ci0JCQkvLyAlcmVzZXJ2ZWQ7Ci0JCQkvLyAuLi4gJXJlc2VydmVkOyBpcyBlbXB0eSBpbiB0aGUgY3VycmVudCBEVEQuCi0KLQkJCVN0cmluZ1tdIG5hbWVzID0ge0FUVFJfTkFNRV9TVU1NQVJZLCBBVFRSX05BTUVfV0lEVEgsIEFUVFJfTkFNRV9CT1JERVIsIEFUVFJfTkFNRV9GUkFNRSwgQVRUUl9OQU1FX1JVTEVTLCBBVFRSX05BTUVfQ0VMTFNQQUNJTkcsIEFUVFJfTkFNRV9DRUxMUEFERElORywgQVRUUl9OQU1FX0JHQ09MT1IsIEFUVFJfTkFNRV9EQVRBUEFHRVNJWkUsIEFUVFJfTkFNRV9IRUlHSFQsIEFUVFJfTkFNRV9CQUNLR1JPVU5ELCBBVFRSX05BTUVfQk9SREVSQ09MT1IgLy8gRDIwNTUxNAotCQkJfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkJLy8gYWxpZ24gKGxvY2FsKQotCQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gYWxpZ25WYWx1ZXMgPSB7QVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX0NFTlRFUiwgQVRUUl9WQUxVRV9SSUdIVH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKGFsaWduVmFsdWVzKTsKLQkJCUhUTUxBdHRyRGVjbEltcGwgYWRlYyA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BTElHTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FMSUdOLCBhZGVjKTsKLQkJCQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5NzNhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQ29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotCi0KLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBDTUNvbnRlbnQgZm9yIEhUTUwgQ00uCi0gKi8KLWFic3RyYWN0IGNsYXNzIENNQ29udGVudEltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgQ01Db250ZW50IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQk9VTkRFRCA9IC0xOwotCS8qKiAgLTE6IGl0J3MgVU5CT1VOREVELiAqLwotCXByaXZhdGUgaW50IG1heE9jY3VyID0gVU5CT1VOREVEOwotCS8qKiAgMDogaXQncyBPUFRJT05BTCwgMSwgaXQncyBSRVFVSVJFRC4gKi8KLQlwcml2YXRlIGludCBtaW5PY2N1ciA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgcHJpbWFyeSBjb25zdHVyY3Rvci4KLQkgKiBVc2UgdGhpcyBvbmUgZm9yIHVzdWFsIGNhc2VzLjxicj4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50SW1wbChTdHJpbmcgbmFtZSwgaW50IG1pbiwgaW50IG1heCkgewotCQlzdXBlcihuYW1lKTsKLQkJbWluT2NjdXIgPSBtaW47Ci0JCW1heE9jY3VyID0gbWF4OwotCX0KLQotCS8qKgotCSAqIGdldE1heE9jY3VyIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBJZiAtMSwgaXQncyBVTkJPVU5ERUQuCi0JICovCi0JcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJcmV0dXJuIG1heE9jY3VyOwotCX0KLQotCS8qKgotCSAqIGdldE1pbk9jY3VyIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBJZiAwLCBpdCdzIE9QVElPTkFMLgotCSAqIElmIDEsIGl0J3MgUkVRVUlSRUQuCi0JICovCi0JcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJcmV0dXJuIG1pbk9jY3VyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Hcm91cEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Hcm91cEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEwOGM2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotLyoqCi0gKi8KLWNsYXNzIENNR3JvdXBJbXBsIGV4dGVuZHMgQ01Db250ZW50SW1wbCBpbXBsZW1lbnRzIENNR3JvdXAgewotCi0JcHJpdmF0ZSBpbnQgb3BlcmF0b3IgPSBDTUdyb3VwLlNFUVVFTkNFOwotCXByaXZhdGUgQ01Ob2RlTGlzdEltcGwgY2hpbGRyZW4gPSBudWxsOwotCi0JLyoqCi0JICogQ01Hcm91cEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Hcm91cEltcGwoaW50IG9wLCBpbnQgbWluT2NjdXIsIGludCBtYXhPY2N1cikgewotCQlzdXBlcihudWxsLCBtaW5PY2N1ciwgbWF4T2NjdXIpOwotCQlzd2l0Y2ggKG9wKSB7Ci0JCQljYXNlIENNR3JvdXAuQUxMIDoKLQkJCWNhc2UgQ01Hcm91cC5DSE9JQ0UgOgotCQkJY2FzZSBDTUdyb3VwLlNFUVVFTkNFIDoKLQkJCQlvcGVyYXRvciA9IG9wOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJLy8gc2hvdWxkIHdhcm4uCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICogQHBhcmFtIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBhcHBlbmRDaGlsZChDTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQljaGlsZHJlbiA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotCQlyZXR1cm4gY2hpbGRyZW4uYXBwZW5kTm9kZShjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3QKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIEdST1VQLCBFTlRJVFlfREVDTEFSQVRJT04uCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5HUk9VUDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRPcGVyYXRpb24gbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBBTE9ORSAoYSksIFNFUVVFTkNFIChhLGIpLCBDSE9JQ0UgKGF8YiksIEFMTCAoYSZiKS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9wZXJhdG9yKCkgewotCQlyZXR1cm4gb3BlcmF0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YTVlNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIENNTmFtZWROb2RlTWFwIGludGVyZmFjZS4gVGhpcyBjbGFzcyBpcyBpbnRlbnRlZAotICogdG8gYmUgdXNlZCBhcyBhIGNvbnRhaW5lciBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLiBJZiBzb21lb25lIHdhbnRzIHRvCi0gKiB1c2UgdGhpcyBjbGFzcyBmb3Igb3RoZXIgcHVycG9zZSwgaGUgbXVzdCBwYXkgYXR0ZW50aW9uIHRvIHRoZSBmYWN0IHRoYXQKLSAqIHRoaXMgY2xhc3MgaXMgdG9sZXJhbnQgb2YgdGhlIGtleSBuYW1lIGNhc2UuIFRoYXQgaXMsIHRoaXMgY2xhc3MgZG9lcyBub3QKLSAqIGRpc3Rpbmd1aXNoICJuYW1lIiwgIk5BTUUiLCBhbmQgIk5hbWUiIGFzIGEga2V5IG5hbWUuCi0gKi8KLWNsYXNzIENNTmFtZWROb2RlTWFwSW1wbCBpbXBsZW1lbnRzIENNTmFtZWROb2RlTWFwIHsKLQotCXByaXZhdGUgSGFzaHRhYmxlIGl0ZW1zID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWl0ZW1zID0gbmV3IEhhc2h0YWJsZSgpOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gaXRlbXMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWVkSXRlbSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIENNTm9kZSA8Y29kZT5udWxsPC9jb2RlPiBmb3IgdW5rbm93biBrZXlzLgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIGNvb2tlZE5hbWUgPSBtYWtlQ2Fub25pY2FsRm9ybShuYW1lKTsKLQkJaWYgKCFpdGVtcy5jb250YWluc0tleShjb29rZWROYW1lKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKENNTm9kZSkgaXRlbXMuZ2V0KGNvb2tlZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQ01Ob2RlIG5vZGUgPSAoQ01Ob2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmICgtLWluZGV4IDwgMCkKLQkJCQlyZXR1cm4gbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIGl0ZW1zLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHJhd0Zvcm0KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBtYWtlQ2Fub25pY2FsRm9ybShTdHJpbmcgcmF3KSB7Ci0JCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAwMTUyCi0JCS8vIHdlIGFyZSBhYmxlIHRvICJjaGVhdCIgaGVyZSBhIGxpdHRsZSBhbmQgdXNlIFVTIExvY2FsZQotCQkvLyB0byBnZXQgYSBnb29kIGNvbm9uaWNhbCBmb3JtLCBzaW5jZSB3ZSBhcmUgdXNpbmcgdGhpcyBvbmx5Ci0JCS8vIGZvciBIVE1MIGFuZCBKU1Agc3RhbmRhcmQgdGFncy4KLQkJLy8gTG9uZyB0ZXJtLCBmb3Igc2ltaWxhciBuZWVkcyB3aXRoIFhNTCAxLjEgKGZvciBleGFtcGxlKQotCQkvLyB3ZSBzaG91bGQgdXNlIGEgY2xhc3Mgc3VjaCBhcyBjb20uaWJtLmljdS50ZXh0Lk5vcm1hbGl6ZXIKLQkJcmV0dXJuIHJhdy50b1VwcGVyQ2FzZShMb2NhbGUuVVMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaXRlbQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXZvaWQgcHV0TmFtZWRJdGVtKFN0cmluZyBuYW1lLCBDTU5vZGUgaXRlbSkgewotCQlTdHJpbmcgY29va2VkTmFtZSA9IG1ha2VDYW5vbmljYWxGb3JtKG5hbWUpOwotCQlpZiAoaXRlbXMuY29udGFpbnNLZXkoY29va2VkTmFtZSkpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgcmVnaXN0ZXJlZC4KLQkJaXRlbXMucHV0KGNvb2tlZE5hbWUsIGl0ZW0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lc3BhY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZXNwYWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWY3MzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lc3BhY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDTU5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotY2xhc3MgQ01OYW1lc3BhY2VJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIENNTmFtZXNwYWNlIHsKLQotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0JLyoqCi0JICogQ01OYW1lc3BhY2VJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNTmFtZXNwYWNlSW1wbChTdHJpbmcgdXJpLCBTdHJpbmcgcGZ4KSB7Ci0JCXN1cGVyKHVyaSk7Ci0JCXByZWZpeCA9IHBmeDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5OQU1FX1NQQUNFOwotCX0KLQotCS8qKgotCSAqIGdldFByZWZpeCBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIHByZWZpeDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRVUkkgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNmViNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLQotCi0vKioKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIENNTm9kZSB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTU5vZGVJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNTm9kZUltcGwoU3RyaW5nIG5tKSB7Ci0JCXN1cGVyKCk7Ci0JCW5hbWUgPSBubTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjaXBlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwb3J0cyBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YmYyMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotLyoqCi0gKiBBbmFsb2cgb2YgZG9tLk5vZGVMaXN0IGZvciBDTS4KLSAqIFNvLCB0aGUgaW1wbGVtZW50YXRpb24gaXMgdmVyeSBzaW1pbGFyIHRvCi0gKiBOb2RlTGlzdEltcGw8YnI+Ci0gKi8KLWNsYXNzIENNTm9kZUxpc3RJbXBsIGltcGxlbWVudHMgQ01Ob2RlTGlzdCB7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5WZWN0b3Igbm9kZXMgPSBudWxsOwotCi0JLyoqCi0JICogQ01Ob2RlTGlzdEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Ob2RlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCW5vZGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICogQHBhcmFtIG5vZGUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGFwcGVuZE5vZGUoQ01Ob2RlIG5vZGUpIHsKLQkJbm9kZXMuYWRkRWxlbWVudChub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBub2Rlcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01Ob2RlKSBub2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29tcGxleFR5cGVEZWZpbml0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NvbXBsZXhUeXBlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWRiYTdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29tcGxleFR5cGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gcmVwcmVzZW50IGEgY29tcGxleCB0eXBlIGRlZmluaXRpb24KLSAqIGluIFhNTCBTY2hlbWEuPGJyPgotICovCi1hYnN0cmFjdCBjbGFzcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JcHJvdGVjdGVkIENNR3JvdXBJbXBsIGNvbnRlbnQgPSBudWxsOwotCXByb3RlY3RlZCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHByaW1hcnlDYW5kaWRhdGVOYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb21wbGV4VHlwZURlZmluaXRpb24oRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJY29sbGVjdGlvbiA9IGVsZW1lbnRDb2xsZWN0aW9uOwotCQljcmVhdGVDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFjdHVhbCBjb250ZW50IG1vZGVsLgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25jZSBhbmQgb25seSBvbmNlIGluIHRoZSBjb25zdHJ1Y3Rvci48YnI+Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlQ29udGVudCgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXAKLQkgKi8KLQlwdWJsaWMgQ01Hcm91cCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQkvKiBOT1RFOiBEbyB3ZSBuZWVkIExPR0lDQUwgdHlwZT8KLQkgKiAtLSAzLzcvMjAwMQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q29udGVudFR5cGUoKTsKLQotCS8qKgotCSAqIEdldCBjb250ZW50IGhpbnQuCi0JICovCi0JcHVibGljIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZ2V0UHJpbWFyeUNhbmRpZGF0ZSgpIHsKLQkJaWYgKHByaW1hcnlDYW5kaWRhdGVOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChIVE1MRWxlbWVudERlY2xhcmF0aW9uKSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShwcmltYXJ5Q2FuZGlkYXRlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFR5cGVOYW1lKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWQ2OTNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogRmFjdG9yeSBvZiBDb21wbGV4VHlwZURlZmluaXRpb24uCi0gKi8KLWZpbmFsIGNsYXNzIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaHRhYmxlIGRlZmluaXRpb25zID0gbnVsbDsKLQkvLyBjb25zdGFudHMgZm9yIGNvbXBsZXggdHlwZSBuYW1lCi0JLyoqIGZvciBBRERSRVNTLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0FERFJFU1MgPSAiQ1RZUEVfQUREUkVTUyI7Ly8kTk9OLU5MUy0xJAotCS8qKiBDREFUQSBjb250ZW50LiBObyBDb21wbGV4VHlwZURlZmluaXRpb24gaW5zdGFuY2Ugc2h1bGQgYmUgY3JlYXRlZC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9DREFUQSA9ICJDVFlQRV9DREFUQSI7Ly8kTk9OLU5MUy0xJAotCS8qKiBjb2wgZ3JvdXAgY29udGVudC4gQ09MKiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0NPTFVNTl9HUk9VUCA9ICJDVFlQRV9DT0xVTU5fR1JPVVAiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIERMLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0RFRklOSVRJT05fTElTVCA9ICJDVFlQRV9ERUZJTklUSU9OX0xJU1QiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIERFVEFJTFMgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9ERVRBSUxTX0NPTlRBSU5FUiA9ICJDVFlQRV9ERVRBSUxTX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgRU1CRUQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRU1CRUQgPSAiQ1RZUEVfRU1CRUQiOy8vJE5PTi1OTFMtMSQKLQkvKiogZW1wdHkgY29udGVudC4gTm8gQ29tcGxleFR5cGVEZWZpbml0aW9uIGluc3RhbmNlIHNob3VsZCBiZSBjcmVhdGVkLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0VNUFRZID0gIkNUWVBFX0VNUFRZIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBGSUVMRFNFVC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9GSUVMRFNFVCA9ICJDVFlQRV9GSUVMRFNFVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgRlJBTUVTRVQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRlJBTUVTRVQgPSAiQ1RZUEVfRlJBTUVTRVQiOy8vJE5PTi1OTFMtMSQKLQkvKiogZmxvdyBjb250ZW50LiAoJWZsb3c7KSogKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9GTE9XX0NPTlRBSU5FUiA9ICJDVFlQRV9GTE9XX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBodG1sIGNvbnRlbnQuIEhFQUQsIChGUkFNRVNFVHxCT0RZKSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0hUTUwgPSAiQ1RZUEVfSFRNTCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBoZWFkIGNvbnRlbnQuIFRJVExFICYgSVNJTkRFWD8gJiBCQVNFPyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0hFQUQgPSAiQ1RZUEVfSEVBRCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBpbmxpbmUgY29udGVudC4gKCVpbmxpbmU7KSogKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9JTkxJTkVfQ09OVEFJTkVSID0gIkNUWVBFX0lOTElORV9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogbGlzdCBpdGVtIGNvbnRhaW5lci4gKExJKSsgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9MSV9DT05UQUlORVIgPSAiQ1RZUEVfTElfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBNQVAuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfTUFQID0gIkNUWVBFX01BUCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBub2ZyYW1lcyBjb250ZW50LiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX05PRlJBTUVTX0NPTlRFTlQgPSAiQ1RZUEVfTk9GUkFNRVNfQ09OVEVOVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgT1BUR1JPVVAuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUiA9ICJDVFlQRV9PUFRJT05fQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIHBhcmFtIGNvbnRhaW5lci4gRm9yIE9CSkVDVC9BUFBMRVQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfUEFSQU1fQ09OVEFJTkVSID0gIkNUWVBFX1BBUkFNX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBQQ0RBVEEgY29udGVudC4gTm8gQ29tcGxleFR5cGVEZWZpbml0aW9uIGluc3RhbmNlIHNodWxkIGJlIGNyZWF0ZWQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfUENEQVRBID0gIkNUWVBFX1BDREFUQSI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgU0VMRUNULiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1NFTEVDVCA9ICJDVFlQRV9TRUxFQ1QiOy8vJE5PTi1OTFMtMSQKLQkvKiogdGFibGUgY29udGVudC4gQ0FQVElPTj8sIChDT0wqfENPTEdST1VQKiksIFRIRUFEPywgVEZPT1Q/LCBUQk9EWSsgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9UQUJMRSA9ICJDVFlQRV9UQUJMRSI7Ly8kTk9OLU5MUy0xJAotCS8qKiB0YWJsZSBjZWxsIGNvbnRhaWVyLiAoVEh8VEQpKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1RDRUxMX0NPTlRBSU5FUiA9ICJDVFlQRV9UQ0VMTF9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogdGFibGUgcmVjb3JkIGNvbnRhaW5lci4gKFRSKSsgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9UUl9DT05UQUlORVIgPSAiQ1RZUEVfVFJfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIGhlYWRpbmcgZ3JvdXAgY29udGFpbmVyLiAoSDF8aDJ8SDN8SDR8SDV8SDYpKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0hFQURJTkdfQ09OVEFJTkVSID0gIkNUWVBFX0hHUk9VUF9DT05UQUlORVIiOyAvLyROT04tTkxTLTEkCi0JLyoqIG1lZGlhIGNvbnRlbnQuIChBVURJT3xWSURFTykgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9NRURJQV9FTEVNRU5UID0gIkNUWVBFX01FRElBIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBEQVRBTElTVC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9EQVRBTElTVCA9ICJDVFlQRV9EQVRBTElTVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgRklHVVJFLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0ZJR1VSRSA9ICJDVFlQRV9GSUdVUkUiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIFJVQlkuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfUlVCWSA9ICJDVFlQRV9SVUJZIjsvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJZGVmaW5pdGlvbnMgPSBuZXcgamF2YS51dGlsLkhhc2h0YWJsZSgpOwotCX0KLQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kIGZvciBDb21wbGV4VHlwZURlZmluaXRpb24uCi0JICogRWFjaCBpbnN0YW5jZSBjcmVhdGVkIGluIHRoaXMgbWV0aG9kIG11c3QgYmUgcmVnaXN0ZXJlZCBpbnRvCi0JICogdGhlIG1hcCB3aXRoIGl0cyBuYW1lLgotCSAqIEBwYXJhbSBkZWZpbml0aW9uTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjcmVhdGVUeXBlRGVmaW5pdGlvbihTdHJpbmcgZGVmaW5pdGlvbk5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCUNvbXBsZXhUeXBlRGVmaW5pdGlvbltdIGRlZnMgPSBudWxsOwotCQlpZiAoZGVmaW5pdGlvbnMuY29udGFpbnNLZXkoZGVmaW5pdGlvbk5hbWUpKSB7Ci0JCQlkZWZzID0gIChDb21wbGV4VHlwZURlZmluaXRpb25bXSkgZGVmaW5pdGlvbnMuZ2V0KGRlZmluaXRpb25OYW1lKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVmcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChkZWZzW2ldLmNvbGxlY3Rpb24gPT0gZWxlbWVudENvbGxlY3Rpb24pCi0JCQkJCXJldHVybiBkZWZzW2ldOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gaW5pdGlhbGl6ZSBhIG5ldyBkZWZpbml0aW9uCi0JCQlkZWZzID0gbmV3IENvbXBsZXhUeXBlRGVmaW5pdGlvblswXTsKLQkJfQotCi0JCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBudWxsOwotCQlpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfQUREUkVTUykgewotCQkJZGVmID0gbmV3IEN0ZEFkZHJlc3MoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfQ09MVU1OX0dST1VQKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkQ29sdW1uR3JvdXAoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfREFUQUxJU1QpIHsKLQkJCWRlZiA9IG5ldyBDdGREYXRhbGlzdChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9ERUZJTklUSU9OX0xJU1QpIHsKLQkJCWRlZiA9IG5ldyBDdGREbChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9ERVRBSUxTX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZERldGFpbHMoZWxlbWVudENvbGxlY3Rpb24pOwotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0VNQkVEKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkRW1iZWQoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfRklFTERTRVQpIHsKLQkJCWRlZiA9IG5ldyBDdGRGaWVsZHNldChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9GSUdVUkUpIHsKLQkJCWRlZiA9IG5ldyBDdGRGaWd1cmUoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfRkxPV19DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRGbG93Q29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0ZSQU1FU0VUKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkRnJhbWVzZXQoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSEVBRCkgewotCQkJZGVmID0gbmV3IEN0ZEhlYWQoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSEVBRElOR19DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRIZWFkaW5nQ29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9IVE1MKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkSHRtbChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9JTkxJTkVfQ09OVEFJTkVSKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkSW5saW5lQ29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0xJX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZExpQ29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX01BUCkgewotCQkJZGVmID0gbmV3IEN0ZE1hcChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9NRURJQV9FTEVNRU5UKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkTWVkaWFFbGVtZW50KGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJCQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX05PRlJBTUVTX0NPTlRFTlQpIHsKLQkJCWRlZiA9IG5ldyBDdGROb2ZyYW1lc0NvbnRlbnQoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZE9wdGlvbkNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9QQVJBTV9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRQYXJhbUNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9SVUJZKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkUnVieShlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9TRUxFQ1QpIHsKLQkJCWRlZiA9IG5ldyBDdGRTZWxlY3QoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfVEFCTEUpIHsKLQkJCWRlZiA9IG5ldyBDdGRUYWJsZShlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9UQ0VMTF9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRUYWJsZUNlbGxDb250YWluZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfVFJfQ09OVEFJTkVSKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkVHJDb250YWluZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSB7Ci0JCQlkZWYgPSBudWxsOwotCQl9Ci0JCWlmIChkZWYgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBmYWlsIHRvIGNyZWF0ZS4KLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uW10gdGVtcCA9IGRlZnM7Ci0JCWRlZnMgPSBuZXcgQ29tcGxleFR5cGVEZWZpbml0aW9uW2RlZnMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgZGVmcywgMCwgdGVtcC5sZW5ndGgpOwotCQlkZWZzW3RlbXAubGVuZ3RoXSA9IGRlZjsKLQkJZGVmaW5pdGlvbnMucHV0KGRlZmluaXRpb25OYW1lLCBkZWZzKTsKLQkJcmV0dXJuIGRlZjsKLQl9Ci0KLQkvKioKLQkgKiBGb3Igc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSAhPSBudWxsKQotCQkJcmV0dXJuIGluc3RhbmNlOwotCQlpbnN0YW5jZSA9IG5ldyBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEFkZHJlc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkQWRkcmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njg0N2QwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkQWRkcmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBBRERSRVNTLgotICovCi1maW5hbCBjbGFzcyBDdGRBZGRyZXNzIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRBZGRyZXNzKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoKCVpbmxpbmUpIHwgUCkqLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoIHwgKSoKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyAoJWlubGluZSkKLQkJQ01Hcm91cEltcGwgaW5saW5lcyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCWlmIChpbmxpbmVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbGxlY3Rpb24uZ2V0SW5saW5lKGlubGluZXMpOwotCQljb250ZW50LmFwcGVuZENoaWxkKGlubGluZXMpOwotCQkvLyBQCi0JCUNNTm9kZSBwID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlApOwotCQlpZiAocCAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChwKTsKLQl9Ci0KLQkvKioKLQkgKiAoKCVpbmxpbmUpIHwgUCkqLgotCSAqIEJlY2F1c2UgJWlubGluZTsgY29udGFpbnMgI1BDREFUQSwgdGhlIHR5cGUgaXMgTUlYRUQuCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0FERFJFU1M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRDb2x1bW5Hcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRDb2x1bW5Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjMzOTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkQ29sdW1uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDT0wgZ3JvdXAuCi0gKiAoQ09MKSoKLSAqLwotZmluYWwgY2xhc3MgQ3RkQ29sdW1uR3JvdXAgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZENvbHVtbkdyb3VwKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoQ09MKSoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCApKgotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gQ09MCi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ09MKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChDT0wpKgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQ09MVU1OX0dST1VQOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRGF0YWxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRGF0YWxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3ZGViZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZERhdGFsaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogZm9yIERBVEFMSVNULgotICovCi1maW5hbCBjbGFzcyBDdGREYXRhbGlzdCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkRGF0YWxpc3QoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT047Ci0JfQotCi0JLyoqCi0JICogKE9QVElPTikrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIE9QVElPTgotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTik7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUSU9OKSsuCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfREFUQUxJU1Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGREZXRhaWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZERldGFpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0ZDVkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZERldGFpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDUwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi1wdWJsaWMgY2xhc3MgQ3RkRGV0YWlscyBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQlwdWJsaWMgQ3RkRGV0YWlscyhFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNVTU1BUlk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCS8vIHN1bW1hcnkKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVU1NQVJZKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCi0JCUNNR3JvdXBJbXBsIGdyb3VwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZ3JvdXApOwotCQljb2xsZWN0aW9uLmdldEZsb3coZ3JvdXApOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0RFVEFJTFNfQ09OVEFJTkVSOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGREbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGREbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjZlYjhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgREwuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZERsIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGREbChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRUOwotCX0KLQotCS8qKgotCSAqIChEVCB8IEREKSsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gRFQKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJLy8gREQKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChEVCB8IEREKSsuCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfREVGSU5JVElPTl9MSVNUOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRW1iZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRW1iZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1ZTcyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEVtYmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogZm9yIEVNQkVELgotICovCi1maW5hbCBjbGFzcyBDdGRFbWJlZCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkRW1iZWQoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0VNQkVEOwotCX0KLQotCS8qKgotCSAqIChOT0VNQkVEKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCApCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCS8vIE5PRU1CRUQKLQkJQ01Ob2RlIG5vZW1iZWQgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9FTUJFRCk7Ci0JCWlmIChub2VtYmVkICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKG5vZW1iZWQpOwotCX0KLQotCS8qKgotCSAqIChOT0VNQkVEKS4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9FTUJFRDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZpZWxkc2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZpZWxkc2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZjJkZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRGaWVsZHNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBGSUVMRFNFVC4KLSAqLwotZmluYWwgY2xhc3MgQ3RkRmllbGRzZXQgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZEZpZWxkc2V0KEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEVHRU5EOwotCX0KLQotCS8qKgotCSAqICgjUENEQVRBLCBMRUdFTkQsICglZmxvdzspKikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCAsICwgKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkvLyAjUENEQVRBCi0JCS8vIC4uLj8/Ci0KLQkJLy8gTEVHRU5ECi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEVHRU5EKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCQkvLyAoJWZsb3c7KSoKLQkJQ01Hcm91cEltcGwgZmxvd3MgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJaWYgKGZsb3dzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbGxlY3Rpb24uZ2V0RmxvdyhmbG93cyk7Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZmxvd3MpOwotCX0KLQotCS8qKgotCSAqICgjUENEQVRBLCBMRUdFTkQsICglZmxvdzspKikKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRklFTERTRVQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NTA1NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw1ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgRklHVVJFLgotICovCi1maW5hbCBjbGFzcyBDdGRGaWd1cmUgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZEZpZ3VyZShFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZJR0NBUFRJT047Ci0JfQotCi0JLyoqCi0JICogKEZJR0NBUFRJT04pKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQkKLQkJQ01Hcm91cEltcGwgZ3JvdXAxID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQlpZiAoZ3JvdXAxICE9IG51bGwpewotCQkJY29udGVudC5hcHBlbmRDaGlsZChncm91cDEpOwotCQl9Ci0JCS8vIEZJR0NBUFRJT04sIEZMT1cKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GSUdDQVBUSU9OKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJZ3JvdXAxLmFwcGVuZENoaWxkKGRlYyk7Ci0JCUNNR3JvdXBJbXBsIGZsb3dncm91cCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJZ3JvdXAxLmFwcGVuZENoaWxkKGZsb3dncm91cCk7Ci0JCWNvbGxlY3Rpb24uZ2V0RmxvdyhmbG93Z3JvdXApOwotCQkKLQkJQ01Hcm91cEltcGwgZ3JvdXAyID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQlpZiAoZ3JvdXAyICE9IG51bGwpewotCQkJY29udGVudC5hcHBlbmRDaGlsZChncm91cDIpOwotCQl9Ci0JCS8vIEZMT1cgLCBGSUdDQVBUSU9OCi0JCUNNR3JvdXBJbXBsIGZsb3dncm91cDIgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCWdyb3VwMi5hcHBlbmRDaGlsZChmbG93Z3JvdXAyKTsKLQkJY29sbGVjdGlvbi5nZXRGbG93KGZsb3dncm91cDIpOwotCQlDTU5vZGUgZGVjMSA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GSUdDQVBUSU9OKTsKLQkJaWYgKGRlYzEgIT0gbnVsbCkKLQkJCWdyb3VwMi5hcHBlbmRDaGlsZChkZWMxKTsKLQkJLy9GTE9XCi0JCUNNR3JvdXBJbXBsIGdyb3VwMyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJaWYgKGdyb3VwMyAhPSBudWxsKXsKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZ3JvdXAzKTsKLQkJCQotCQl9Ci0JCWNvbGxlY3Rpb24uZ2V0Rmxvdyhncm91cDMpOwotCi0JfQotCi0JLyoqCi0JICogKEZJR0NBUFRJT04pKy4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9GSUdVUkU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRGbG93Q29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZsb3dDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3YTA4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZsb3dDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgY29udGFpbmVycyBvZiA8Y29kZT4lZmxvdzs8L2NvZGU+LgotICovCi1maW5hbCBjbGFzcyBDdGRGbG93Q29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDdGRGbG93Q29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoJWZsb3c7KSoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQljb2xsZWN0aW9uLmdldEZsb3coY29udGVudCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZMT1dfQ09OVEFJTkVSOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRnJhbWVzZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRnJhbWVzZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNkYTRiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZyYW1lc2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogZm9yIEZSQU1FU0VULgotICogKChGUkFNRVNFVCB8IEZSQU1FKSsgJiBOT0ZSQU1FUz8pCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEZyYW1lc2V0IGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRGcmFtZXNldChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FOwotCX0KLQotCS8qKgotCSAqICgoRlJBTUVTRVQgfCBGUkFNRSkrICYgTk9GUkFNRVM/KS4KLQkgKiAtLT4gKChGUkFNRVNFVCB8IEZSQU1FKSsgJiAoTk9GUkFNRVMpPykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCAmICkKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkFMTCwgMSwgMSk7Ci0KLQkJLy8gKCB8ICkrCi0JCUNNR3JvdXBJbXBsIGdyb3VwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb250ZW50LmFwcGVuZENoaWxkKGdyb3VwKTsKLQotCQkvLyBGUkFNRVNFVAotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FU0VUKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJZ3JvdXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJLy8gRlJBTUUKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJZ3JvdXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQotCQkvLyAoICk/Ci0JCWdyb3VwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIDEpOwotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZChncm91cCk7Ci0KLQkJLy8gTk9GUkFNRVMKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PRlJBTUVTKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJZ3JvdXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoKEZSQU1FU0VUIHwgRlJBTUUpKyAmIE5PRlJBTUVTPykKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZSQU1FU0VUOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkSGVhZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRIZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YmMyNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRIZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgdGhlIGhlYWQgY29udGVudC4KLSAqIENvbnRlbnQgTW9kZWw6IChUSVRMRSAmIElTSU5ERVg/ICYgQkFTRT8pCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEhlYWQgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICovCi0JcHVibGljIEN0ZEhlYWQoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USVRMRTsKLQl9Ci0KLQkvKioKLQkgKiBmb3IgSEVBRC4KLQkgKiBUbyBhdm9pZCB1c2luZyBpbmNsdXNpb24sIHRoZSBjb250ZW50IG1vZGVsIGNvbWVzIGZyb20gdGhlIFhIVE1MIDEuMC4KLQkgKgotCSAqICglaGVhZC5taXNjOywgKCh0aXRsZSwgJWhlYWQubWlzYzssIChiYXNlLCAlaGVhZC5taXNjOyk/KSB8IChiYXNlLCAlaGVhZC5taXNjOywgKHRpdGxlLCAlaGVhZC5taXNjOykpKSkKLQkgKiBBbmQgJWhlYWQubWlzYzsgaXM6Ci0JICogKHNjcmlwdHxzdHlsZXxtZXRhfGxpbmt8b2JqZWN0fGlzaW5kZXgpKgotCSAqCi0JICogMDogKCVoZWFkLm1pc2MsIEEpCi0JICogQTogKEIgfCBDKQotCSAqIEI6ICh0aXRsZSwgJWhlYWQubWlzYzssIEQpCi0JICogQzogKGJhc2UsICVoZWFkLm1pc2M7LCBFKQotCSAqIEQ6IChiYXNlLCAlaGVhZC5taXNjOyk/Ci0JICogRTogKHRpdGxlLCAlaGVhZC5taXNjOykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gQXQgMXN0LCBjcmVhdGUgJWhlYWQubWlzYzsgY29udGVudC4KLQkJLy8gJWhlYWQubWlzYzsKLQkJLy8gICAoIHwgKSoKLQkJQ01Hcm91cEltcGwgbWlzYyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlpZiAobWlzYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTElOSywgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9CSkVDVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklTSU5ERVh9OwotCQljb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhtaXNjLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJLy8gMm5kLCBnZXQgYSB0aXRsZQotCQlDTU5vZGUgdGl0bGUgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEUpOwotCQkvLyAzcmQsIGdldCBhIGJhc2UKLQkJQ01Ob2RlIGJhc2UgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRSk7Ci0JCWlmICh0aXRsZSA9PSBudWxsIHx8IGJhc2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBUb3AgbGV2ZWwgY29udGVudCBpcyBhIHNlcXVlbmNlIG9mICVoZWFkLm1pc2M7IGFuZCBBLgotCQkvLyAwOiAoJWhlYWQubWlzYzssIEEpCi0JCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsKLQkJY29udGVudC5hcHBlbmRDaGlsZChtaXNjKTsKLQkJLy8gICBjcmVhdGUgQSBhbmQgYXBwZW5kIGl0IHRvIHRoZSB0b3AgbGV2ZWwuCi0JCXsKLQkJCS8vIEEgaXMgYSBjaG9pY2Ugb2YgQiBhbmQgQy4KLQkJCS8vIEE6IChCIHwgQykKLQkJCS8vICAgY3JlYXRlIGEgY2hvaWNlCi0JCQlDTUdyb3VwSW1wbCBnQSA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCQlpZiAoZ0EgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQkvLyAgIGFwcGVuZCBBIHRvIHRoZSB0b3AgbGV2ZWwuCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGdBKTsKLQotCQkJLy8gY3JlYXRlIEIgYW5kIGFwcGVuZCBpdCB0byBBCi0JCQl7Ci0JCQkJLy8gQiBpcyBhIHNlcXVlbmNlIG9mIHRpdGxlLCAlaGVhZC5taXNjOywgYW5kIEQuCi0JCQkJLy8gQjogKHRpdGxlLCAlaGVhZC5taXNjOywgRCkKLQkJCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCQkJQ01Hcm91cEltcGwgZ0IgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCQkJaWYgKGdCID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQkvLyAgIGFwcGVuZCBCIHRvIEEuCi0JCQkJZ0EuYXBwZW5kQ2hpbGQoZ0IpOwotCi0JCQkJLy8gICBhcHBlbmQgdGl0bGUgdG8gQgotCQkJCWdCLmFwcGVuZENoaWxkKHRpdGxlKTsKLQkJCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOyB0byBCCi0JCQkJZ0IuYXBwZW5kQ2hpbGQobWlzYyk7Ci0JCQkJLy8gICBjcmVhdGUgRCBhbmQgYXBwZW5kIGl0IHRvIEIuCi0JCQkJewotCQkJCQkvLyBEIGlzIGEgc2VxdWVuY2Ugb2YgYmFzZSwgJWhlYWQubWlzYzsuCi0JCQkJCS8vIEQ6IChiYXNlLCAlaGVhZC5taXNjOyk/Ci0JCQkJCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJCQkJQ01Hcm91cEltcGwgZ0QgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgMSk7Ci0JCQkJCWlmIChnRCA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCQkvLyAgIGFwcGVuZCBEIHRvIEIuCi0JCQkJCWdCLmFwcGVuZENoaWxkKGdEKTsKLQotCQkJCQkvLyAgIGFwcGVuZCBiYXNlIHRvIEQKLQkJCQkJZ0QuYXBwZW5kQ2hpbGQoYmFzZSk7Ci0JCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEQuCi0JCQkJCWdELmFwcGVuZENoaWxkKG1pc2MpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNyZWF0ZSBDIGFuZCBhcHBlbmQgaXQgdG8gQQotCQkJewotCQkJCS8vIEMgaXMgYSBzZXF1ZW5jZSBvZiBiYXNlLCAlaGVhZC5taXNjOywgYW5kIEUKLQkJCQkvLyBDOiAoYmFzZSwgJWhlYWQubWlzYzssIEUpCi0JCQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQkJCUNNR3JvdXBJbXBsIGdDID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkJCWlmIChnQyA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJLy8gICBhcHBlbmQgQyB0byBBLgotCQkJCWdBLmFwcGVuZENoaWxkKGdDKTsKLQotCQkJCS8vICAgYXBwZW5kIGJhc2UgdG8gQwotCQkJCWdDLmFwcGVuZENoaWxkKGJhc2UpOwotCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEMKLQkJCQlnQy5hcHBlbmRDaGlsZChtaXNjKTsKLQotCQkJCS8vICAgY3JlYXRlIEUgYW5kIGFwcGVuZCBpdCB0byBDLgotCQkJCXsKLQkJCQkJLy8gRSBpcyBhIHNlcXVlbmNlIG9mIHRpdGxlIGFuZCAlaGVhZC5taXNjOy4KLQkJCQkJLy8gRTogKHRpdGxlLCAlaGVhZC5taXNjOykKLQkJCQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQkJCQlDTUdyb3VwSW1wbCBnRSA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJCQkJaWYgKGdFID09IG51bGwpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCS8vICAgYXBwZW5kIEUgdG8gQy4KLQkJCQkJZ0MuYXBwZW5kQ2hpbGQoZ0UpOwotCi0JCQkJCS8vICAgYXBwZW5kIHRpdGxlIHRvIEUKLQkJCQkJZ0UuYXBwZW5kQ2hpbGQodGl0bGUpOwotCQkJCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOyB0byBFLgotCQkJCQlnRS5hcHBlbmRDaGlsZChtaXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbGVtZW50IGNvbnRlbnQuCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IRUFEOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkSGVhZGluZ0NvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRIZWFkaW5nQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZmRiYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRIZWFkaW5nQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotCi0KLXB1YmxpYyBjbGFzcyBDdGRIZWFkaW5nQ29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRIZWFkaW5nQ29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Db21wbGV4VHlwZURlZmluaXRpb24jY3JlYXRlQ29udGVudCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyAoICkqCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gSDF8SDJ8SDN8SDR8SDV8SDYKLQkJIGNvbGxlY3Rpb24uZ2V0SGVhZGluZyhjb250ZW50KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Db21wbGV4VHlwZURlZmluaXRpb24jZ2V0Q29udGVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNvbXBsZXhUeXBlRGVmaW5pdGlvbiNnZXRUeXBlTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSEVBRElOR19DT05UQUlORVI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEh0bWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkSHRtbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTcyOTViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkSHRtbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNTBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQ29tcGxleCB0eXBlIGRlZmluaXRpb24gZm9yIDxjb2RlPkhUTUw8L2NvZGU+Ljxicj4KLSAqIENvbnRlbnQgTW9kZWw6Ci0gKiBIRUFELCAoRlJBTUVTRVR8Qk9EWSk8YnI+Ci0gKi8KLWZpbmFsIGNsYXNzIEN0ZEh0bWwgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICovCi0JcHVibGljIEN0ZEh0bWwoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEOwotCX0KLQotCS8qKgotCSAqICglaHRtbC5jb250ZW50OykuCi0JICogJWh0bWwuY29udGVudDsgaXMgSEVBRCwgKEZSQU1FU0VUIHwgQk9EWSkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIEhFQUQKLQkJQ01Ob2RlIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JCS8vICggfCApCi0JCUNNR3JvdXBJbXBsIGdyb3VwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJY29udGVudC5hcHBlbmRDaGlsZChncm91cCk7Ci0KLQkJLy8gRlJBTUVTRVQsIEJPRFkKLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FU0VULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWX07Ci0JCWNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyBzaW5jZSBCT0RZIHN0YXJ0IGFuZCBlbmQgYXJlIG9taXNzYWJsZQotCQkvLyBhZGRpbmcgdmFsaWQgY2hpbGRyZW4gb2YgQk9EWSBoZXJlIHVuZGVyIEhUTUwKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk3MzQyCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUFQKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkUpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJETyk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5QVVQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlApOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PU0NSSVBUKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT04pOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxBQkVMKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5VKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5INik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0VOVEVSKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFRk9OVCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUyk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkxPQ0tRVU9URSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDMpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVMKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TRUxFQ1QpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlEpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUUklLRSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BQkJSKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CSUcpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgxKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTUcpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFDUk9OWU0pOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRFTCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9GUkFNRVMpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRFWFRBUkVBKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9OVCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0JKRUNUKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5LQkQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklGUkFNRSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFIpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg0KTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNBTVApOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOUyk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDUpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNVUCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREZOKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JU0lOREVYKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ETCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVkFSKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GSUVMRFNFVCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEFCTEUpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJSKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UVCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JCWVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVBQTEVUKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU01BTEwpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNJVEUpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUk0pOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJVik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ09ERSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1BBTik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1VCKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5FTSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQUREUkVTUyk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RST05HKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0JCWVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNTBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVJUSUNMRSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNTBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVNJREUpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQkJZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OQVYpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFQ1RJT04pOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQkJZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BVURJTyk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNTBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVklERU8pOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQkJZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DQU5WQVMpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNPTU1BTkQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQkJCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNTBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBREVSKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0JCQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPT1RFUik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCQkKLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NQVJLKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0JCQotCQllZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZJR1VSRSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCQllZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJVQlkpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiBFbGVtZW50IGNvbnRlbnQuCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSFRNTDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZElubGluZUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRJbmxpbmVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiZmVhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZElubGluZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotCi0vKioKLSAqIENvbXBsZXggdHlwZSBkZWZpbml0aW9uIGZvciAoJWlubGluZTspKi4KLSAqLwotZmluYWwgY2xhc3MgQ3RkSW5saW5lQ29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRJbmxpbmVDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICglaW5saW5lKSouCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJY29sbGVjdGlvbi5nZXRJbmxpbmUoY29udGVudCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0lOTElORV9DT05UQUlORVI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRMaUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRMaUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2NiMDc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkTGlDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBMaXN0IGl0ZW0gY29udGFpbmVyLgotICogKExJKSsKLSAqLwotZmluYWwgY2xhc3MgQ3RkTGlDb250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbkNvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkTGlDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSTsKLQl9Ci0KLQkvKioKLQkgKiAoTEkpKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKExJKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCUNNTm9kZSBsaSA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSSk7Ci0JCWlmIChsaSAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChsaSk7Ci0JfQotCi0JLyoqCi0JICogRUxFTUVOVCBjb250ZW50Ljxicj4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0xJX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZE1hcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmMmExNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBNQVAuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZE1hcCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkTWFwKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVJFQTsKLQl9Ci0KLQkvKioKLQkgKiAoKCVibG9jazspIHwgQVJFQSkrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoIHwgKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyAoJWJsb2NrOykKLQkJQ01Hcm91cEltcGwgYmxvY2tzID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJaWYgKGJsb2NrcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb2xsZWN0aW9uLmdldEJsb2NrKGJsb2Nrcyk7Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoYmxvY2tzKTsKLQkJLy8gQVJFQQotCQlDTU5vZGUgYXJlYSA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BUkVBKTsKLQkJaWYgKGFyZWEgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoYXJlYSk7Ci0JfQotCi0JLyoqCi0JICogKCglYmxvY2s7KSB8IEFSRUEpKy4KLQkgKiBCZWNhdXNlICVibG9jazsgY29uc2lzdHMgb2YgZWxlbWVudHMgb25seSwgdGhlIHR5cGUgaXMgRUxFTUVOVC4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9NQVA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRNZWRpYUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkTWVkaWFFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1Y2I1OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRNZWRpYUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDUwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBDdGRNZWRpYUVsZW1lbnQgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZE1lZGlhRWxlbWVudChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ29tcGxleFR5cGVEZWZpbml0aW9uI2NyZWF0ZUNvbnRlbnQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gKCApKgotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsMCwgMSk7Ci0JCS8vc291cmNlCi0JCUNNTm9kZSBzb3VyY2UgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNTBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU09VUkNFKTsKLQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChzb3VyY2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNvbXBsZXhUeXBlRGVmaW5pdGlvbiNnZXRDb250ZW50VHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ29tcGxleFR5cGVEZWZpbml0aW9uI2dldFR5cGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9NRURJQV9FTEVNRU5UOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGROb2ZyYW1lc0NvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkTm9mcmFtZXNDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOTNhNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGROb2ZyYW1lc0NvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgTk9GUkFNRVMuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZE5vZnJhbWVzQ29udGVudCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkTm9mcmFtZXNDb250ZW50KEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWTsKLQl9Ci0KLQkvKioKLQkgKiAoQk9EWSkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkvLyBCT0RZCi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWSk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoQk9EWSkKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9OT0ZSQU1FU19DT05URU5UOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkT3B0aW9uQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZE9wdGlvbkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTM0ODBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkT3B0aW9uQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogT1BUSU9OIGNvbnRhaW5lci4KLSAqIChPUFRJT04pKwotICovCi1maW5hbCBjbGFzcyBDdGRPcHRpb25Db250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZE9wdGlvbkNvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTjsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUSU9OKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIE9QVElPTgotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTik7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUSU9OKSsKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX09QVElPTl9DT05UQUlORVI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRQYXJhbUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRQYXJhbUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWI0NWI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkUGFyYW1Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBQQVJBTSBjb250YWluZXIuICBGb3IgT0JKRUNUIGFuZCBBUFBMRVQuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZFBhcmFtQ29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRQYXJhbUNvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKFBBUkFNIHwgJWZsb3c7KSouCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggfCApKgotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIFBBUkFNCi0JCUNNTm9kZSBwYXJhbSA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTSk7Ci0JCWlmIChwYXJhbSAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChwYXJhbSk7Ci0JCS8vICVmbG93OwotCQlDTUdyb3VwSW1wbCBmbG93cyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCWlmIChmbG93cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb2xsZWN0aW9uLmdldElubGluZShmbG93cyk7Ci0JCWNvbGxlY3Rpb24uZ2V0QmxvY2soZmxvd3MpOwotCQljb250ZW50LmFwcGVuZENoaWxkKGZsb3dzKTsKLQl9Ci0KLQkvKioKLQkgKiAoUEFSQU0gfCAlZmxvdzspKi4KLQkgKiBCZWNhdXNlICVmbG93OyBjb250YWlucyAjUENEQVRBLCB0aGUgdHlwZSBpcyBNSVhFRC4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfUEFSQU1fQ09OVEFJTkVSOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkUnVieS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRSdWJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYzM3ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRSdWJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNTBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogZm9yIFJVQlkuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZFJ1YnkgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZFJ1YnkoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5SVDsKLQl9Ci0KLQkvKioKLQkgKiAoUlQpKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCQotCQlDTUdyb3VwSW1wbCBwaHJhc2VHcm91cCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlpZiAocGhyYXNlR3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZChwaHJhc2VHcm91cCk7Ci0JCWNvbGxlY3Rpb24uZ2V0UGhyYXNlKHBocmFzZUdyb3VwKTsKLQkJCi0JCUNNR3JvdXBJbXBsIHJ0cnBncm91cCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCWlmIChydHJwZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZChydHJwZ3JvdXApOwotCQkKLQkJLy9SVAotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJUKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJcnRycGdyb3VwLmFwcGVuZENoaWxkKGRlYyk7Ci0JCQotCQlDTUdyb3VwSW1wbCBycGdyb3VwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQlpZiAocnBncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlydHJwZ3JvdXAuYXBwZW5kQ2hpbGQocnBncm91cCk7Ci0JCQotCQkvLyBSUAotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNTBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUlApOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQlycGdyb3VwLmFwcGVuZENoaWxkKGRlYyk7Ci0JCS8vIFJUCi0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5SVCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCXJwZ3JvdXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJQKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJcnBncm91cC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChSVCkrLgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1JVQlk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRTZWxlY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkU2VsZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZDEyODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRTZWxlY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgU0VMRUNULgotICovCi1maW5hbCBjbGFzcyBDdGRTZWxlY3QgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZFNlbGVjdChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTjsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUR1JPVVAgfCBPUFRJT04pKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gT1BUR1JPVVAKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRHUk9VUCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJLy8gT1BUSU9OCi0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT04pOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKE9QVEdST1VQIHwgT1BUSU9OKSsuCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfU0VMRUNUOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkVGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZkNzNkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBUQUJMRS4KLSAqIChDQVBUSU9OPywgKENPTCp8Q09MR1JPVVAqKSwgVEhFQUQ/LCBURk9PVD8sIFRCT0RZKywgVFIrKQotICovCi1maW5hbCBjbGFzcyBDdGRUYWJsZSBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkVGFibGUoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQk9EWTsKLQl9Ci0KLQkvKioKLQkgKiAoQ0FQVElPTj8sIChDT0wqfENPTEdST1VQKiksIFRIRUFEPywgVEZPT1Q/LCBUQk9EWSspCi0JICogLS0+ICgoQ0FQVElPTik/LCAoKENPTCkqIHwgKENPTEdST1VQKSopLCAoVEhFQUQpPywgKFRGT09UKT8sIChUQk9EWSkrLCAoVFIpKykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCAsICwgLCAsKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCi0JCS8vIChDQVBUSU9OKT8KLQkJLy8gICAgICggKT8KLQkJQ01Hcm91cEltcGwgd3JhcCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCAxKTsKLQkJaWYgKHdyYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZCh3cmFwKTsKLQkJLy8gICAgIENBUFRJT04KLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DQVBUSU9OKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJd3JhcC5hcHBlbmRDaGlsZChkZWMpOwotCi0JCS8vICgoQ09MKSogfCAoQ09MR1JPVVApKikKLQkJLy8gICAgICggfCApCi0JCUNNR3JvdXBJbXBsIGdyb3VwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZ3JvdXApOwotCQkvLyAgICAgICAgIChDT0wpKgotCQl3cmFwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJaWYgKHdyYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ3JvdXAuYXBwZW5kQ2hpbGQod3JhcCk7Ci0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0wpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQl3cmFwLmFwcGVuZENoaWxkKGRlYyk7Ci0JCS8vICAgICAgICAgKENPTEdST1VQKSoKLQkJd3JhcCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWlmICh3cmFwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdyb3VwLmFwcGVuZENoaWxkKHdyYXApOwotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ09MR1JPVVApOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQl3cmFwLmFwcGVuZENoaWxkKGRlYyk7Ci0KLQkJLy8gKFRIRUFEKT8KLQkJd3JhcCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCAxKTsKLQkJaWYgKHdyYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZCh3cmFwKTsKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRIRUFEKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJd3JhcC5hcHBlbmRDaGlsZChkZWMpOwotCi0JCS8vIChURk9PVCk/Ci0JCXdyYXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgMSk7Ci0JCWlmICh3cmFwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQod3JhcCk7Ci0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URk9PVCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCXdyYXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQotCQkvLyAoVEJPRFkpKwotCQkvLyBUQk9EWSBoYXMgb3B0aW9uYWwgc3RhcnQgYW5kIGVuZCB0YWdzCi0JCXdyYXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlpZiAod3JhcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb250ZW50LmFwcGVuZENoaWxkKHdyYXApOwotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEJPRFkpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQl3cmFwLmFwcGVuZENoaWxkKGRlYyk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk2MTAxCi0JCS8vIFRCT0RZIHN0YXJ0IGFuZCBlbmQgdGFnIGFyZSBvcHRpb25hbCwgc28gVFIgc2hvdWxkIGJlIGFsbG93ZWQgaGVyZQotCQkvLyAoVFIpKwotCQl3cmFwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJaWYgKHdyYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZCh3cmFwKTsKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJd3JhcC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqICgoRlJBTUVTRVQgfCBGUkFNRSkrICYgTk9GUkFNRVM/KQotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfVEFCTEU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRUYWJsZUNlbGxDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkVGFibGVDZWxsQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMDc4NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRUYWJsZUNlbGxDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBUYWJsZSBjZWxsIGNvbnRhaW5lci4KLSAqIChUSCB8IFREKSsKLSAqLwotZmluYWwgY2xhc3MgQ3RkVGFibGVDZWxsQ29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRUYWJsZUNlbGxDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URDsKLQl9Ci0KLQkvKioKLQkgKiAoVEggfCBURCkrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gVEgKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJLy8gVEQKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlREKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChUSCB8IFREKSsKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1RDRUxMX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFRyQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFRyQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNGMyMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRUckNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIFRhYmxlIHJlY29yZCBjb250YWluZXIuCi0gKiAoVFIpKwotICovCi1maW5hbCBjbGFzcyBDdGRUckNvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkVHJDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUjsKLQl9Ci0KLQkvKioKLQkgKiAoVFIpKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKFRSKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCUNNTm9kZSB0ciA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUik7Ci0JCWlmICh0ciAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZCh0cik7Ci0JfQotCi0JLyoqCi0JICogRUxFTUVOVCBjb250ZW50Ljxicj4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1RSX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0RlY2xDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0RlY2xDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YWFiNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9EZWNsQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICovCi1hYnN0cmFjdCBjbGFzcyBEZWNsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIENNTmFtZWROb2RlTWFwIHsKLQotCi0JcHJvdGVjdGVkIGNsYXNzIER1YWxNYXAgewotCQlwdWJsaWMgRHVhbE1hcCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgRHVhbE1hcChPYmplY3RbXSBvYmplY3RzKSB7Ci0JCQlzdXBlcigpOwotCQkJaW5pdGlhbGl6ZShvYmplY3RzKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJCXJldHVybiB0YWJsZS5sZW5ndGg7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKGludCBrZXkpIHsKLQkJCWlmICghaXNWYWxpZEluZGV4KGtleSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gdGFibGVba2V5XTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0S2V5KE9iamVjdCB2YWx1ZSkgewotCQkJSW50ZWdlciBrZXlPYmogPSAoSW50ZWdlcikgbWFwLmdldCh2YWx1ZSk7Ci0JCQlpZiAoa2V5T2JqID09IG51bGwpCi0JCQkJcmV0dXJuIElEX1VOS05PV047Ci0JCQlyZXR1cm4ga2V5T2JqLmludFZhbHVlKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJCWlmIChvYmplY3RzID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJdGFibGUgPSBvYmplY3RzOwotCQkJbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoaW50IGtleSA9IDA7IGtleSA8IG9iamVjdHMubGVuZ3RoOyBrZXkrKykgewotCQkJCU9iamVjdCB2YWx1ZSA9IHRhYmxlW2tleV07Ci0JCQkJbWFwLnB1dCh2YWx1ZSwgbmV3IEludGVnZXIoa2V5KSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIE9iamVjdFtdIHRhYmxlID0gbnVsbDsKLQkJcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRJbmRleChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBpbmRleCA+PSAwICYmIGluZGV4IDwgdGFibGUubGVuZ3RoOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFRvbGVyYW50U3RyaW5nRHVhbE1hcCBleHRlbmRzIER1YWxNYXAgewotCQlwdWJsaWMgVG9sZXJhbnRTdHJpbmdEdWFsTWFwKFN0cmluZ1tdIG5hbWVzKSB7Ci0JCQlzdXBlcigpOwotCQkJT2JqZWN0W10gb2JqZWN0cyA9IG5ldyBPYmplY3RbbmFtZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlvYmplY3RzW2ldID0gbWFrZUNhbm9uaWNhbEZvcm0obmFtZXNbaV0pOwotCQkJfQotCQkJaW5pdGlhbGl6ZShvYmplY3RzKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0S2V5KE9iamVjdCB2YWx1ZSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIHZhbHVlOwotCQkJCXJldHVybiBzdXBlci5nZXRLZXkobWFrZUNhbm9uaWNhbEZvcm0obmFtZSkpOwotCQkJfQotCQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIElEX1VOS05PV047Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBtYWtlQ2Fub25pY2FsRm9ybShTdHJpbmcgcmF3KSB7Ci0JCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDE1MgotCQkJLy8gd2UgYXJlIGFibGUgdG8gImNoZWF0IiBoZXJlIGEgbGl0dGxlIGFuZCB1c2UgVVMgTG9jYWxlIAotCQkJLy8gdG8gZ2V0IGEgZ29vZCBjb25vbmljYWwgZm9ybSwgc2luY2Ugd2UgYXJlIHVzaW5nIHRoaXMgb25seSAKLQkJCS8vIGZvciBIVE1MIGFuZCBKU1Agc3RhbmRhcmQgdGFncy4gCi0JCQkvLyBMb25nIHRlcm0sIGZvciBzaW1pbGFyIG5lZWRzIHdpdGggWE1MIDEuMSAoZm9yIGV4YW1wbGUpCi0JCQkvLyB3ZSBzaG91bGQgdXNlIGEgY2xhc3Mgc3VjaCBhcyBjb20uaWJtLmljdS50ZXh0Lk5vcm1hbGl6ZXIKLQkJCXJldHVybiByYXcudG9VcHBlckNhc2UoTG9jYWxlLlVTKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgRGVjbEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCQlwdWJsaWMgRGVjbEl0ZXJhdG9yKCkgewotCQkJbWF4aWQgPSBmRGVjbHMubGVuZ3RoIC0gMTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gaWQgPCBtYXhpZDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCWlmICghaGFzTmV4dCgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGl0ZW0oKytpZCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7IC8qIG5vdGhpbmcgc2hvdWxkIGJlIGRvbmUuICovCi0JCX0KLQotCQlwcml2YXRlIGludCBpZCA9IC0xOwotCQlwcml2YXRlIGludCBtYXhpZCA9IC0xOwotCX0KLQotCUNNTm9kZVtdIGZEZWNscyA9IG51bGw7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIFNUUklDVF9DQVNFID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIFRPTEVSQU5UX0NBU0UgPSB0cnVlOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IElEX1VOS05PV04gPSAtMTsKLQlwcml2YXRlIER1YWxNYXAgZk1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRGVjbENvbGxlY3Rpb24oU3RyaW5nW10gbmFtZXMsIGJvb2xlYW4gdG9sZXJhbnQpIHsKLQkJc3VwZXIoKTsKLQkJZkRlY2xzID0gbmV3IENNTm9kZVtuYW1lcy5sZW5ndGhdOwotCQlpZiAodG9sZXJhbnQpIHsKLQkJCWZNYXAgPSBuZXcgVG9sZXJhbnRTdHJpbmdEdWFsTWFwKG5hbWVzKTsKLQkJfQotCQllbHNlIHsKLQkJCWZNYXAgPSBuZXcgRHVhbE1hcChuYW1lcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICogQHBhcmFtIGlkIGludAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBDTU5vZGUgY3JlYXRlKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXREZWNsYXJhdGlvbnMoU3RyaW5nW10gbmFtZXMpIHsKLQkJQ01OYW1lZE5vZGVNYXBJbXBsIG1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSBuYW1lc1tpXTsKLQkJCUNNTm9kZSBub2RlID0gZ2V0TmFtZWRJdGVtKG5hbWUpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCW1hcC5wdXROYW1lZEl0ZW0obmFtZSwgbm9kZSk7Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZXMgamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RGVjbGFyYXRpb25zKENNR3JvdXBJbXBsIGdyb3VwLCBJdGVyYXRvciBuYW1lcykgewotCQl3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgZW50aXR5TmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHQoKTsKLQkJCUNNTm9kZSBkZWMgPSBnZXROYW1lZEl0ZW0oZW50aXR5TmFtZSk7Ci0JCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJZ3JvdXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hcCBuYW1lIHRvIGlkLgotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0SUQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZNYXAuZ2V0S2V5KG5hbWUpOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkRlY2xzLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaWQgaW50Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lKGludCBpZCkgewotCQlyZXR1cm4gKFN0cmluZykgZk1hcC5nZXRWYWx1ZShpZCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZWRJdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCWludCBpZCA9IGdldElEKG5hbWUpOwotCQlpZiAoIWlzVmFsaWRJRChpZCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGl0ZW0oaWQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBpZCBpbnQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZElEKGludCBpZCkgewotCQlyZXR1cm4gaWQgPj0gMCAmJiBpZCA8IGZEZWNscy5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmICghaXNWYWxpZElEKGluZGV4KSkKLQkJCXJldHVybiBudWxsOwotCQlDTU5vZGUgZGVjbCA9IGZEZWNsc1tpbmRleF07Ci0JCWlmIChkZWNsICE9IG51bGwpCi0JCQlyZXR1cm4gZGVjbDsgLy8gYWxyZWFkeSBleGlzdC4KLQotCQlkZWNsID0gY3JlYXRlKGdldE5hbWUoaW5kZXgpKTsKLQkJZkRlY2xzW2luZGV4XSA9IGRlY2w7Ci0JCXJldHVybiBkZWNsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBEZWNsSXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZGRmZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9FbGVtZW50Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBlbGVtZW50IGRlY2xhcmF0aW9ucy4KLSAqLwotY2xhc3MgRWxlbWVudENvbGxlY3Rpb24gZXh0ZW5kcyBEZWNsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lIHsKLQotCi0JLy8gRWxlbWVudCBJRHMKLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIElkcyB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0EgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQkJSID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUNST05ZTSA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FERFJFU1MgPSAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BUFBMRVQgPSA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BUkVBID0gNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQiA9IDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JBU0UgPSA3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CQVNFRk9OVCA9IDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JETyA9IDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JJRyA9IDEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CTElOSyA9IDExOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CTE9DS1FVT1RFID0gMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JPRFkgPSAxMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQlIgPSAxNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQlVUVE9OID0gMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NBUFRJT04gPSAxNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0VOVEVSID0gMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NJVEUgPSAxODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09ERSA9IDE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DT0wgPSAyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09MR1JPVVAgPSAyMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREQgPSAyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREVMID0gMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RGTiA9IDI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVIgPSAyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElWID0gMjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RMID0gMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RUID0gMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VNID0gMjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VNQkVEID0gMzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZJRUxEU0VUID0gMzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZPTlQgPSAzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRk9STSA9IDMzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFNRSA9IDM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFNRVNFVCA9IDM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IMSA9IDM2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IMiA9IDM3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IMyA9IDM4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9INCA9IDM5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9INSA9IDQwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9INiA9IDQxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IRUFEID0gNDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hSID0gNDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hUTUwgPSA0NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSSA9IDQ1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JRlJBTUUgPSA0NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU1HID0gNDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lOUFVUID0gNDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lOUyA9IDQ5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JU0lOREVYID0gNTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0tCRCA9IDUxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQUJFTCA9IDUyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MRUdFTkQgPSA1MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEkgPSA1NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTElOSyA9IDU1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NQVAgPSA1NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUVOVSA9IDU3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NRVRBID0gNTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05PRU1CRUQgPSA1OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTk9GUkFNRVMgPSA2MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTk9TQ1JJUFQgPSA2MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0JKRUNUID0gNjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09MID0gNjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09QVEdST1VQID0gNjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09QVElPTiA9IDY1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QID0gNjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BBUkFNID0gNjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BSRSA9IDY4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9RID0gNjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1MgPSA3MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0FNUCA9IDcxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQ1JJUFQgPSA3MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0VMRUNUID0gNzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NNQUxMID0gNzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NQQU4gPSA3NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1RSSUtFID0gNzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NUUk9ORyA9IDc3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVFlMRSA9IDc4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVUIgPSA3OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VQID0gODA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RBQkxFID0gODE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RCT0RZID0gODI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1REID0gODM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RFWFRBUkVBID0gODQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RGT09UID0gODU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIID0gODY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRUFEID0gODc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RJVExFID0gODg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RSID0gODk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RUID0gOTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1UgPSA5MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUwgPSA5MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVkFSID0gOTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01BUlFVRUUgPSA5NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0NPTkZJRyA9IDk1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRUNITyA9IDk2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRVhFQyA9IDk3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRlNJWkUgPSA5ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0ZMQVNUTU9EID0gOTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9JTkNMVURFID0gMTAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfUFJJTlRFTlYgPSAxMDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9TRVQgPSAxMDI7Ci0JCS8vIDw8RDIwNTUxMwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CR1NPVU5EID0gMTAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OT0JSID0gMTA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9XQlIgPSAxMDU7Ci0KLQkJLy8gRDIwNTUxMwotCi0JCXB1YmxpYyBzdGF0aWMgaW50IGdldE51bU9mSWRzKCkgewotCQkJaWYgKG51bW9maWRzICE9IC0xKQotCQkJCXJldHVybiBudW1vZmlkczsKLQotCQkJLy8gTk9URTogSWYgdGhlIHJlZmxlY3Rpb24gaXMgdG9vIHNsb3csIHRoaXMgbWV0aG9kIHNob3VsZAotCQkJLy8ganVzdCByZXR1cm4gdGhlIGxpdGVyYWwgdmFsdWUsIGxpa2UgMTA1LgotCQkJLy8gLS0gNS8yNS8yMDAxCi0JCQlDbGFzcyBjbGF6eiA9IElkcy5jbGFzczsKLQkJCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RmllbGRzKCk7Ci0JCQludW1vZmlkcyA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCQlpZiAobmFtZS5zdGFydHNXaXRoKCJJRF8iKSkvLyROT04tTkxTLTEkCi0JCQkJCW51bW9maWRzKys7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVtb2ZpZHM7Ci0JCX0KLQotCQkvLyBjaGFjaGUgdGhlIHJlc3VsdCBvZiB0aGUgcmVmbGVjdGlvbi4KLQkJcHJpdmF0ZSBzdGF0aWMgaW50IG51bW9maWRzID0gLTE7Ci0JfQotCi0JLyoqICVmb250c3R5bGU7LiBUVCB8IEkgfCBCIHwgVSB8IFMgfCBTVFJJS0UgfCBCSUcgfCBTTUFMTCB8IEJMSU5LICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRk9OVFNUWUxFID0ge1RULCBJLCBCLCBVLCBTLCBTVFJJS0UsIEJJRywgU01BTEwsIEJMSU5LfTsKLQkvKiogJWZvcm1jdGw7LiBJTlBVVCB8IFNFTEVDVCB8IFRFWFRBUkVBIHwgTEFCRUwgfCBCVVRUT04gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGT1JNQ1RMID0ge0lOUFVULCBTRUxFQ1QsIFRFWFRBUkVBLCBMQUJFTCwgQlVUVE9OfTsKLQkvKiogJXBocmFzZTsuCi0JICogRU0gfCBTVFJPTkcgfCBERk4gfCBDT0RFIHwgU0FNUCB8IEtCRCB8IFZBUiB8IENJVEUgfCBBQkJSIHwgQUNST05ZTQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBIUkFTRSA9IHtFTSwgU1RST05HLCBERk4sIENPREUsIFNBTVAsIEtCRCwgVkFSLCBDSVRFLCBBQkJSLCBBQ1JPTllNfTsKLQkvKiogJXNwZWNpYWw7LgotCSAqIEEgfCBJTUcgfCBBUFBMRVQgfCBPQkpFQ1QgfCBGT05UIHwgQkFTRUZPTlQgfCBCUiB8IFNDUklQVCB8Ci0JICogTUFQIHwgUSB8IFNVQiB8IFNVUCB8IFNQQU4gfCBCRE8gfCBJRlJBTUUgfCBFTUJFRCB8IE1BUlFVRUUgfAotCSAqIEQyVyB8IFNVQk1JVAotCSAqIFdCUiB8IE5PQlIgfCBCR1NPVU5ECi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1BFQ0lBTCA9IHtBLCBJTUcsIEFQUExFVCwgT0JKRUNULCBGT05ULCBCQVNFRk9OVCwgQlIsIFdCUiwgLy8gRDIwNTUxMwotCQkJCVNDUklQVCwgTUFQLCBRLCBTVUIsIFNVUCwgU1BBTiwgQkRPLCBJRlJBTUUsIEVNQkVELCBCR1NPVU5ELCAvLyBEMjA1NTEzCi0JCQkJTUFSUVVFRSwgTk9CUiAvLyBEMjA1NTEzCi0JfTsKLQkvKiogJWhlYWRpbmc7LiBIWzEtNl0gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBIRUFESU5HID0ge0gxLCBIMiwgSDMsIEg0LCBINSwgSDZ9OwotCS8qKiAlbGlzdDsuIFVMIHwgT0wgfCBESVIgfCBNRU5VICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTElTVCA9IHtVTCwgT0wsIERJUiwgTUVOVX07Ci0JLyoqICVwcmVmb3JtYXR0ZWQ7LiBQUkUgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQUkVGT1JNQVRURUQgPSB7UFJFfTsKLQlwcm90ZWN0ZWQgQXR0cmlidXRlQ29sbGVjdGlvbiBhdHRyaWJ1dGVDb2xsZWN0aW9uID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmTmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIEVsZW1lbnRDb2xsZWN0aW9uKEF0dHJpYnV0ZUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihnZXROYW1lcygpLCBUT0xFUkFOVF9DQVNFKTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbiA9IGNvbGxlY3Rpb247Ci0JfQotCi0JcHVibGljIEVsZW1lbnRDb2xsZWN0aW9uKFN0cmluZ1tdIG5hbWVzLCBBdHRyaWJ1dGVDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIobmFtZXMsIFRPTEVSQU5UX0NBU0UpOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBY3R1YWxseSBjcmVhdGVzIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gaW5zdGFuY2UuCi0JICogQHJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBjcmVhdGUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCUhUTUxFbGVtRGVjbEltcGwgZWRlYyA9IG51bGw7Ci0KLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQSh0aGlzKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFCQlIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShBQkJSLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQUNST05ZTSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKEFDUk9OWU0sIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBRERSRVNTKSkgewotCQkJZWRlYyA9IG5ldyBIZWRBRERSRVNTKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBUFBMRVQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEFQUExFVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVJFQSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQVJFQSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKEIsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCQVNFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCQVNFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCQVNFRk9OVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQkFTRUZPTlQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJETykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQkRPKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCSUcpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShCSUcsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCTElOSykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKEJMSU5LLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQkxPQ0tRVU9URSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQkxPQ0tRVU9URSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQk9EWSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQk9EWSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQlIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJSKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCVVRUT04pKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJVVFRPTih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ0FQVElPTikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQ0FQVElPTih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ0VOVEVSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRDRU5URVIodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKENJVEUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShDSVRFLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ09ERSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKENPREUsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShDT0wpKSB7Ci0JCQllZGVjID0gbmV3IEhlZENPTCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ09MR1JPVVApKSB7Ci0JCQllZGVjID0gbmV3IEhlZENPTEdST1VQKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShERCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkREQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERFTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTWFya0NoYW5nZXMoREVMLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoREZOKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoREZOLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRElSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNRU5VKERJUiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERJVikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRElWKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShETCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkREwodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERUKSkgewotCQkJZWRlYyA9IG5ldyBIZWREVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRU0pKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShFTSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEVNQkVEKSkgewotCQkJZWRlYyA9IG5ldyBIZWRFTUJFRCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRklFTERTRVQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZJRUxEU0VUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShGT05UKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGT05UKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShGT1JNKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGT1JNKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShGUkFNRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRlJBTUUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEZSQU1FU0VUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGUkFNRVNFVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDEpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDEsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIMikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhIMiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEgzKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEgzLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDQsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShINSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhINSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEg2KSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEg2LCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSEVBRCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSEVBRCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhSKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIVE1MKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShJKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoSSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKElGUkFNRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSUZSQU1FKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShJTUcpKSB7Ci0JCQllZGVjID0gbmV3IEhlZElNRyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSU5QVVQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZElOUFVUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShJTlMpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1hcmtDaGFuZ2VzKElOUywgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKElTSU5ERVgpKSB7Ci0JCQllZGVjID0gbmV3IEhlZElTSU5ERVgodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEtCRCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKEtCRCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKExBQkVMKSkgewotCQkJZWRlYyA9IG5ldyBIZWRMQUJFTCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEVHRU5EKSkgewotCQkJZWRlYyA9IG5ldyBIZWRMRUdFTkQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKExJKSkgewotCQkJZWRlYyA9IG5ldyBIZWRMSSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTElOSykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTElOSyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTUFQKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNQVAodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1BUlFVRUUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1BUlFVRUUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1FTlUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1FTlUoTUVOVSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1FVEEpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1FVEEodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE5PRU1CRUQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE5PRU1CRUQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE5PRlJBTUVTKSkgewotCQkJZWRlYyA9IG5ldyBIZWROT0ZSQU1FUyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTk9TQ1JJUFQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE5PU0NSSVBUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShPQkpFQ1QpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE9CSkVDVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoT0wpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE9MKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShPUFRHUk9VUCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkT1BUR1JPVVAodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE9QVElPTikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkT1BUSU9OKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShQKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShQQVJBTSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUEFSQU0odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFBSRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUFJFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShRKSkgewotCQkJZWRlYyA9IG5ldyBIZWRRKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoUywgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNBTVApKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShTQU1QLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU0NSSVBUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTQ1JJUFQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNFTEVDVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU0VMRUNUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTTUFMTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKFNNQUxMLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1BBTikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1BBTih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1RSSUtFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoU1RSSUtFLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1RST05HKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoU1RST05HLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1RZTEUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNUWUxFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTVUIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNjcmlwdHMoU1VCLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1VQKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTY3JpcHRzKFNVUCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRBQkxFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRUQUJMRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVEJPRFkpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRhYmxlQm9keShUQk9EWSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFREKSkgewotCQkJZWRlYyA9IG5ldyBIZWRUYWJsZUNlbGwoVEQsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShURVhUQVJFQSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVEVYVEFSRUEodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRGT09UKSkgewotCQkJZWRlYyA9IG5ldyBIZWRUYWJsZUJvZHkoVEZPT1QsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShUSCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVGFibGVDZWxsKFRILCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVEhFQUQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRhYmxlQm9keShUSEVBRCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRJVExFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRUSVRMRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVFIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRSKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShUVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKFRULCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKFUsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShVTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVUwodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFZBUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKFZBUiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9DT05GSUcpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUNvbmZpZyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0VDSE8pKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUVjaG8odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9FWEVDKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lFeGVjKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfRlNJWkUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUZzaXplKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfRkxBU1RNT0QpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUZsYXN0bW9kKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfSU5DTFVERSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJSW5jbHVkZSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX1BSSU5URU5WKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lQcmludGVudih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX1NFVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJU2V0KHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCR1NPVU5EKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCR1NPVU5EKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShOT0JSKSkgewotCQkJZWRlYyA9IG5ldyBIZWROT0JSKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShXQlIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFdCUih0aGlzKTsKLQotCQl9IC8vIHVua25vd24KLQkJZWxzZSB7Ci0JCQkvLyBOT1RFOiBXZSBkb24ndCBkZWZpbmUgdGhlIFVOS05PV04gZWxlbWVudCBkZWNsYXJhdGlvbi4KLQkJCS8vIDxjb2RlPm51bGw8L2NvZGU+IGZvciBhIGRlY2xhcmF0aW9uIGlzIGEgc2lnbiBvZgotCQkJLy8gdGhlIHRhcmdldCBlbGVtZW50IGlzIHVua25vd24uCi0JCQkvLyAtLSAzLzkvMjAwMQotCQkJZWRlYyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVkZWM7Ci0JfQotCi0JcHVibGljIEF0dHJpYnV0ZUNvbGxlY3Rpb24gZ2V0QXR0cmlidXRlQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZUNvbGxlY3Rpb247Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmFtZXNPZkJsb2NrKCkgewotCQkvLyBQLCBETCwgRElWLCBDRU5URVIsIE5PU0NSSVBULCBOT0ZSQU1FUywgQkxPQ0tRVU9URSwgRk9STSwgSVNJTkRFWCwgSFIsCi0JCS8vIFRBQkxFLCBGSUVMRFNFVCwgQUREUkVTUwotCQlTdHJpbmdbXSBibG9ja01pc2MgPSB7UCwgREwsIERJViwgQ0VOVEVSLCBOT1NDUklQVCwgTk9GUkFNRVMsIEJMT0NLUVVPVEUsIEZPUk0sIElTSU5ERVgsIEhSLCBUQUJMRSwgRklFTERTRVQsIEFERFJFU1N9OwotCQlWZWN0b3IgbmFtZXMgPSBuZXcgVmVjdG9yKEFycmF5cy5hc0xpc3QoYmxvY2tNaXNjKSk7Ci0JCS8vICVoZWFkaW5nOwotCQluYW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChIRUFESU5HKSk7Ci0JCS8vICVsaXN0OwotCQluYW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChMSVNUKSk7Ci0JCS8vICVwcmVmb3JtYXR0ZWQ7Ci0JCW5hbWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KFBSRUZPUk1BVFRFRCkpOwotCi0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQkvKioKLQkgKiAlYmxvY2s7LgotCSAqICVibG9jazsgaXM6Ci0JICogUCB8ICVoZWFkaW5nOyB8ICVsaXN0OyB8ICVwcmVmb3JtYXR0ZWQ7IHwgREwgfCBESVYgfCBDRU5URVIgfAotCSAqIE5PU0NSSVBUIHwgTk9GUkFNRVMgfCBCTE9DS1FVT1RFIHwgRk9STSB8IElTSU5ERVggfCBIUiB8Ci0JICogVEFCTEUgfCBGSUVMRFNFVCB8IEFERFJFU1MuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldEJsb2NrKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIGdldE5hbWVzT2ZCbG9jaygpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbQotCSAqIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4gaW5zdGFuY2UuCi0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RmxvdyhDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0QmxvY2soZ3JvdXApOwotCQlnZXRJbmxpbmUoZ3JvdXApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbSBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+Ci0JICogaW5zdGFuY2UuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGdldEZvbnRzdHlsZShDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KEZPTlRTVFlMRSkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0Rm9ybWN0cmwoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChGT1JNQ1RMKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiAlaGVhZGluZzsuCi0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0SGVhZGluZyhDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoSEVBRElORykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtCi0JICogaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPiBpbnN0YW5jZS4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRJbmxpbmUoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldEZvbnRzdHlsZShncm91cCk7Ci0JCWdldFBocmFzZShncm91cCk7Ci0JCWdldFNwZWNpYWwoZ3JvdXApOwotCQlnZXRGb3JtY3RybChncm91cCk7Ci0JfQotCi0JLyoqCi0JICogJWxpc3Q7LgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGdldExpc3QoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KExJU1QpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbSBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+Ci0JICogaW5zdGFuY2UuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGdldFBocmFzZShDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KFBIUkFTRSkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogJXByZWZvcm1hdHRlZDsKLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRQcmVmb3JtYXR0ZWQoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KFBSRUZPUk1BVFRFRCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0U3BlY2lhbChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KFNQRUNJQUwpLml0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldE5hbWVzKCkgewotCQlpZiAoZk5hbWVzID09IG51bGwpIHsKLQkJCWZOYW1lcyA9IG5ldyBTdHJpbmdbSWRzLmdldE51bU9mSWRzKCldOwotCQkJZk5hbWVzW0lkcy5JRF9BXSA9IEE7Ci0JCQlmTmFtZXNbSWRzLklEX0FCQlJdID0gQUJCUjsKLQkJCWZOYW1lc1tJZHMuSURfQUNST05ZTV0gPSBBQ1JPTllNOwotCQkJZk5hbWVzW0lkcy5JRF9BRERSRVNTXSA9IEFERFJFU1M7Ci0JCQlmTmFtZXNbSWRzLklEX0FQUExFVF0gPSBBUFBMRVQ7Ci0JCQlmTmFtZXNbSWRzLklEX0FSRUFdID0gQVJFQTsKLQkJCWZOYW1lc1tJZHMuSURfQl0gPSBCOwotCQkJZk5hbWVzW0lkcy5JRF9CQVNFXSA9IEJBU0U7Ci0JCQlmTmFtZXNbSWRzLklEX0JBU0VGT05UXSA9IEJBU0VGT05UOwotCQkJZk5hbWVzW0lkcy5JRF9CRE9dID0gQkRPOwotCQkJZk5hbWVzW0lkcy5JRF9CSUddID0gQklHOwotCQkJZk5hbWVzW0lkcy5JRF9CTElOS10gPSBCTElOSzsKLQkJCWZOYW1lc1tJZHMuSURfQkxPQ0tRVU9URV0gPSBCTE9DS1FVT1RFOwotCQkJZk5hbWVzW0lkcy5JRF9CT0RZXSA9IEJPRFk7Ci0JCQlmTmFtZXNbSWRzLklEX0JSXSA9IEJSOwotCQkJZk5hbWVzW0lkcy5JRF9CVVRUT05dID0gQlVUVE9OOwotCQkJZk5hbWVzW0lkcy5JRF9DQVBUSU9OXSA9IENBUFRJT047Ci0JCQlmTmFtZXNbSWRzLklEX0NFTlRFUl0gPSBDRU5URVI7Ci0JCQlmTmFtZXNbSWRzLklEX0NJVEVdID0gQ0lURTsKLQkJCWZOYW1lc1tJZHMuSURfQ09ERV0gPSBDT0RFOwotCQkJZk5hbWVzW0lkcy5JRF9DT0xdID0gQ09MOwotCQkJZk5hbWVzW0lkcy5JRF9DT0xHUk9VUF0gPSBDT0xHUk9VUDsKLQkJCWZOYW1lc1tJZHMuSURfRERdID0gREQ7Ci0JCQlmTmFtZXNbSWRzLklEX0RFTF0gPSBERUw7Ci0JCQlmTmFtZXNbSWRzLklEX0RGTl0gPSBERk47Ci0JCQlmTmFtZXNbSWRzLklEX0RJUl0gPSBESVI7Ci0JCQlmTmFtZXNbSWRzLklEX0RJVl0gPSBESVY7Ci0JCQlmTmFtZXNbSWRzLklEX0RMXSA9IERMOwotCQkJZk5hbWVzW0lkcy5JRF9EVF0gPSBEVDsKLQkJCWZOYW1lc1tJZHMuSURfRU1dID0gRU07Ci0JCQlmTmFtZXNbSWRzLklEX0VNQkVEXSA9IEVNQkVEOwotCQkJZk5hbWVzW0lkcy5JRF9GSUVMRFNFVF0gPSBGSUVMRFNFVDsKLQkJCWZOYW1lc1tJZHMuSURfRk9OVF0gPSBGT05UOwotCQkJZk5hbWVzW0lkcy5JRF9GT1JNXSA9IEZPUk07Ci0JCQlmTmFtZXNbSWRzLklEX0ZSQU1FXSA9IEZSQU1FOwotCQkJZk5hbWVzW0lkcy5JRF9GUkFNRVNFVF0gPSBGUkFNRVNFVDsKLQkJCWZOYW1lc1tJZHMuSURfSDFdID0gSDE7Ci0JCQlmTmFtZXNbSWRzLklEX0gyXSA9IEgyOwotCQkJZk5hbWVzW0lkcy5JRF9IM10gPSBIMzsKLQkJCWZOYW1lc1tJZHMuSURfSDRdID0gSDQ7Ci0JCQlmTmFtZXNbSWRzLklEX0g1XSA9IEg1OwotCQkJZk5hbWVzW0lkcy5JRF9INl0gPSBINjsKLQkJCWZOYW1lc1tJZHMuSURfSEVBRF0gPSBIRUFEOwotCQkJZk5hbWVzW0lkcy5JRF9IUl0gPSBIUjsKLQkJCWZOYW1lc1tJZHMuSURfSFRNTF0gPSBIVE1MOwotCQkJZk5hbWVzW0lkcy5JRF9JXSA9IEk7Ci0JCQlmTmFtZXNbSWRzLklEX0lGUkFNRV0gPSBJRlJBTUU7Ci0JCQlmTmFtZXNbSWRzLklEX0lNR10gPSBJTUc7Ci0JCQlmTmFtZXNbSWRzLklEX0lOUFVUXSA9IElOUFVUOwotCQkJZk5hbWVzW0lkcy5JRF9JTlNdID0gSU5TOwotCQkJZk5hbWVzW0lkcy5JRF9JU0lOREVYXSA9IElTSU5ERVg7Ci0JCQlmTmFtZXNbSWRzLklEX0tCRF0gPSBLQkQ7Ci0JCQlmTmFtZXNbSWRzLklEX0xBQkVMXSA9IExBQkVMOwotCQkJZk5hbWVzW0lkcy5JRF9MRUdFTkRdID0gTEVHRU5EOwotCQkJZk5hbWVzW0lkcy5JRF9MSV0gPSBMSTsKLQkJCWZOYW1lc1tJZHMuSURfTElOS10gPSBMSU5LOwotCQkJZk5hbWVzW0lkcy5JRF9NQVBdID0gTUFQOwotCQkJZk5hbWVzW0lkcy5JRF9NRU5VXSA9IE1FTlU7Ci0JCQlmTmFtZXNbSWRzLklEX01FVEFdID0gTUVUQTsKLQkJCWZOYW1lc1tJZHMuSURfTk9FTUJFRF0gPSBOT0VNQkVEOwotCQkJZk5hbWVzW0lkcy5JRF9OT0ZSQU1FU10gPSBOT0ZSQU1FUzsKLQkJCWZOYW1lc1tJZHMuSURfTk9TQ1JJUFRdID0gTk9TQ1JJUFQ7Ci0JCQlmTmFtZXNbSWRzLklEX09CSkVDVF0gPSBPQkpFQ1Q7Ci0JCQlmTmFtZXNbSWRzLklEX09MXSA9IE9MOwotCQkJZk5hbWVzW0lkcy5JRF9PUFRHUk9VUF0gPSBPUFRHUk9VUDsKLQkJCWZOYW1lc1tJZHMuSURfT1BUSU9OXSA9IE9QVElPTjsKLQkJCWZOYW1lc1tJZHMuSURfUF0gPSBQOwotCQkJZk5hbWVzW0lkcy5JRF9QQVJBTV0gPSBQQVJBTTsKLQkJCWZOYW1lc1tJZHMuSURfUFJFXSA9IFBSRTsKLQkJCWZOYW1lc1tJZHMuSURfUV0gPSBROwotCQkJZk5hbWVzW0lkcy5JRF9TXSA9IFM7Ci0JCQlmTmFtZXNbSWRzLklEX1NBTVBdID0gU0FNUDsKLQkJCWZOYW1lc1tJZHMuSURfU0NSSVBUXSA9IFNDUklQVDsKLQkJCWZOYW1lc1tJZHMuSURfU0VMRUNUXSA9IFNFTEVDVDsKLQkJCWZOYW1lc1tJZHMuSURfU01BTExdID0gU01BTEw7Ci0JCQlmTmFtZXNbSWRzLklEX1NQQU5dID0gU1BBTjsKLQkJCWZOYW1lc1tJZHMuSURfU1RSSUtFXSA9IFNUUklLRTsKLQkJCWZOYW1lc1tJZHMuSURfU1RST05HXSA9IFNUUk9ORzsKLQkJCWZOYW1lc1tJZHMuSURfU1RZTEVdID0gU1RZTEU7Ci0JCQlmTmFtZXNbSWRzLklEX1NVQl0gPSBTVUI7Ci0JCQlmTmFtZXNbSWRzLklEX1NVUF0gPSBTVVA7Ci0JCQlmTmFtZXNbSWRzLklEX1RBQkxFXSA9IFRBQkxFOwotCQkJZk5hbWVzW0lkcy5JRF9UQk9EWV0gPSBUQk9EWTsKLQkJCWZOYW1lc1tJZHMuSURfVERdID0gVEQ7Ci0JCQlmTmFtZXNbSWRzLklEX1RFWFRBUkVBXSA9IFRFWFRBUkVBOwotCQkJZk5hbWVzW0lkcy5JRF9URk9PVF0gPSBURk9PVDsKLQkJCWZOYW1lc1tJZHMuSURfVEhdID0gVEg7Ci0JCQlmTmFtZXNbSWRzLklEX1RIRUFEXSA9IFRIRUFEOwotCQkJZk5hbWVzW0lkcy5JRF9USVRMRV0gPSBUSVRMRTsKLQkJCWZOYW1lc1tJZHMuSURfVFJdID0gVFI7Ci0JCQlmTmFtZXNbSWRzLklEX1RUXSA9IFRUOwotCQkJZk5hbWVzW0lkcy5JRF9VXSA9IFU7Ci0JCQlmTmFtZXNbSWRzLklEX1VMXSA9IFVMOwotCQkJZk5hbWVzW0lkcy5JRF9WQVJdID0gVkFSOwotCQkJZk5hbWVzW0lkcy5JRF9NQVJRVUVFXSA9IE1BUlFVRUU7Ci0JCQlmTmFtZXNbSWRzLklEX1NTSV9DT05GSUddID0gU1NJX0NPTkZJRzsKLQkJCWZOYW1lc1tJZHMuSURfU1NJX0VDSE9dID0gU1NJX0VDSE87Ci0JCQlmTmFtZXNbSWRzLklEX1NTSV9FWEVDXSA9IFNTSV9FWEVDOwotCQkJZk5hbWVzW0lkcy5JRF9TU0lfRlNJWkVdID0gU1NJX0ZTSVpFOwotCQkJZk5hbWVzW0lkcy5JRF9TU0lfRkxBU1RNT0RdID0gU1NJX0ZMQVNUTU9EOwotCQkJZk5hbWVzW0lkcy5JRF9TU0lfSU5DTFVERV0gPSBTU0lfSU5DTFVERTsKLQkJCWZOYW1lc1tJZHMuSURfU1NJX1BSSU5URU5WXSA9IFNTSV9QUklOVEVOVjsKLQkJCWZOYW1lc1tJZHMuSURfU1NJX1NFVF0gPSBTU0lfU0VUOwotCQkJZk5hbWVzW0lkcy5JRF9CR1NPVU5EXSA9IEJHU09VTkQ7Ci0JCQlmTmFtZXNbSWRzLklEX05PQlJdID0gTk9CUjsKLQkJCWZOYW1lc1tJZHMuSURfV0JSXSA9IFdCUjsKLQkJfQotCQlyZXR1cm4gZk5hbWVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRW50aXR5Q29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9FbnRpdHlDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYTcwNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9FbnRpdHlDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgZW50aXR5IGRlY2xhcmF0aW9ucy4KLSAqLwotZmluYWwgY2xhc3MgRW50aXR5Q29sbGVjdGlvbiBleHRlbmRzIERlY2xDb2xsZWN0aW9uIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2UuRW50aXR5TmFtZSB7Ci0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElkcyB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FBQ1VURV9MID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUFDVVRFX1UgPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQ0lSQ19MID0gMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUNJUkNfVSA9IDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FDVVRFID0gNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUVMSUdfTCA9IDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FFTElHX1UgPSA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BR1JBVkVfTCA9IDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FHUkFWRV9VID0gODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUxFRlNZTSA9IDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FMUEhBX0wgPSAxMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUxQSEFfVSA9IDExOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTVAgPSAxMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQU5EID0gMTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FORyA9IDE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BUklOR19MID0gMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FSSU5HX1UgPSAxNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVNZTVAgPSAxNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVRJTERFX0wgPSAxODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVRJTERFX1UgPSAxOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVVNTF9MID0gMjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FVTUxfVSA9IDIxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CRFFVTyA9IDIyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CRVRBX0wgPSAyMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkVUQV9VID0gMjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JSVkJBUiA9IDI1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CVUxMID0gMjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NBUCA9IDI3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DQ0VESUxfTCA9IDI4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DQ0VESUxfVSA9IDI5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DRURJTCA9IDMwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DRU5UID0gMzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NISV9MID0gMzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NISV9VID0gMzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NJUkMgPSAzNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0xVQlMgPSAzNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09ORyA9IDM2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DT1BZID0gMzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NSQVJSID0gMzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NVUCA9IDM5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DVVJSRU4gPSA0MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREFHR0VSX0wgPSA0MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREFHR0VSX1UgPSA0MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREFSUl9MID0gNDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RBUlJfVSA9IDQ0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERUcgPSA0NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREVMVEFfTCA9IDQ2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERUxUQV9VID0gNDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJQU1TID0gNDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJVklERSA9IDQ5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FQUNVVEVfTCA9IDUwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FQUNVVEVfVSA9IDUxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FQ0lSQ19MID0gNTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VDSVJDX1UgPSA1MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUdSQVZFX0wgPSA1NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUdSQVZFX1UgPSA1NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRU1QVFkgPSA1NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRU1TUCA9IDU3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTlNQID0gNTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VQU0lMT05fTCA9IDU5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FUFNJTE9OX1UgPSA2MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVFVSVYgPSA2MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVRBX0wgPSA2MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVRBX1UgPSA2MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVRIX0wgPSA2NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVRIX1UgPSA2NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVVNTF9MID0gNjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VVTUxfVSA9IDY3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVVJPID0gNjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VYSVNUID0gNjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZOT0YgPSA3MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRk9SQUxMID0gNzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZSQUMxMiA9IDcyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFDMTQgPSA3MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBQzM0ID0gNzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZSQVNMID0gNzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dBTU1BX0wgPSA3NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfR0FNTUFfVSA9IDc3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9HRSA9IDc4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9HVCA9IDc5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IQVJSX0wgPSA4MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEFSUl9VID0gODE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hFQVJUUyA9IDgyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IRUxMSVAgPSA4MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUFDVVRFX0wgPSA4NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUFDVVRFX1UgPSA4NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUNJUkNfTCA9IDg2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQ0lSQ19VID0gODc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lFWENMID0gODg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lHUkFWRV9MID0gODk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lHUkFWRV9VID0gOTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lNQUdFID0gOTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lORklOID0gOTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lOVCA9IDkzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JT1RBX0wgPSA5NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU9UQV9VID0gOTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lRVUVTVCA9IDk2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JU0lOID0gOTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lVTUxfTCA9IDk4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JVU1MX1UgPSA5OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfS0FQUEFfTCA9IDEwMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfS0FQUEFfVSA9IDEwMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFNQkRBX0wgPSAxMDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBTUJEQV9VID0gMTAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQU5HID0gMTA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQVFVTyA9IDEwNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFSUl9MID0gMTA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQVJSX1UgPSAxMDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xDRUlMID0gMTA4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MRFFVTyA9IDEwOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEUgPSAxMTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xGTE9PUiA9IDExMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTE9XQVNUID0gMTEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MT1ogPSAxMTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xSTSA9IDExNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTFNBUVVPID0gMTE1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MU1FVTyA9IDExNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTFQgPSAxMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01BQ1IgPSAxMTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01EQVNIID0gMTE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NSUNSTyA9IDEyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUlERE9UID0gMTIxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NSU5VUyA9IDEyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTVVfTCA9IDEyMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTVVfVSA9IDEyNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkFCTEEgPSAxMjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05CU1AgPSAxMjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05EQVNIID0gMTI3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ORSA9IDEyODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkkgPSAxMjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05PVCA9IDEzMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTk9USU4gPSAxMzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05TVUIgPSAxMzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05USUxERV9MID0gMTMzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OVElMREVfVSA9IDEzNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlVfTCA9IDEzNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlVfVSA9IDEzNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0FDVVRFX0wgPSAxMzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09BQ1VURV9VID0gMTM4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PQ0lSQ19MID0gMTM5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PQ0lSQ19VID0gMTQwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PRUxJR19MID0gMTQxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PRUxJR19VID0gMTQyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PR1JBVkVfTCA9IDE0MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0dSQVZFX1UgPSAxNDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09MSU5FID0gMTQ1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PTUVHQV9MID0gMTQ2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PTUVHQV9VID0gMTQ3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PTUlDUk9OX0wgPSAxNDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NSUNST05fVSA9IDE0OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1BMVVMgPSAxNTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09SID0gMTUxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUkRGID0gMTUyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUkRNID0gMTUzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PU0xBU0hfTCA9IDE1NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1NMQVNIX1UgPSAxNTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09USUxERV9MID0gMTU2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PVElMREVfVSA9IDE1NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RJTUVTID0gMTU4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PVU1MX0wgPSAxNTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09VTUxfVSA9IDE2MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEFSQSA9IDE2MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEFSVCA9IDE2MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEVSTUlMID0gMTYzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QRVJQID0gMTY0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSElfTCA9IDE2NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEhJX1UgPSAxNjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BJViA9IDE2NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUElfTCA9IDE2ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUElfVSA9IDE2OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUExVU01OID0gMTcwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QT1VORCA9IDE3MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFJJTUVfTCA9IDE3MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFJJTUVfVSA9IDE3MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFJPRCA9IDE3NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFJPUCA9IDE3NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFNJX0wgPSAxNzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BTSV9VID0gMTc3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9RVU9UID0gMTc4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQURJQyA9IDE3OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFORyA9IDE4MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFRVU8gPSAxODE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JBUlJfTCA9IDE4MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFSUl9VID0gMTgzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQ0VJTCA9IDE4NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkRRVU8gPSAxODU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JFQUwgPSAxODY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JFRyA9IDE4NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkZMT09SID0gMTg4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SSE9fTCA9IDE4OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkhPX1UgPSAxOTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JMTSA9IDE5MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUlNBUVVPID0gMTkyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SU1FVTyA9IDE5MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0JRVU8gPSAxOTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NDQVJPTl9MID0gMTk1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQ0FST05fVSA9IDE5NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0RPVCA9IDE5NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0VDVCA9IDE5ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0hZID0gMTk5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TSUdNQUYgPSAyMDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NJR01BX0wgPSAyMDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NJR01BX1UgPSAyMDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NJTSA9IDIwMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1BBREVTID0gMjA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVUIgPSAyMDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVQkUgPSAyMDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVTSA9IDIwNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VQID0gMjA4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVAxID0gMjA5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVAyID0gMjEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVAzID0gMjExOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVBFID0gMjEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TWkxJRyA9IDIxMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEFVX0wgPSAyMTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RBVV9VID0gMjE1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USEVSRTQgPSAyMTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVRBU1lNID0gMjE3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USEVUQV9MID0gMjE4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USEVUQV9VID0gMjE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USElOU1AgPSAyMjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIT1JOX0wgPSAyMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIT1JOX1UgPSAyMjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RJTERFID0gMjIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USU1FUyA9IDIyNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVFJBREUgPSAyMjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VBQ1VURV9MID0gMjI2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQUNVVEVfVSA9IDIyNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUFSUl9MID0gMjI4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQVJSX1UgPSAyMjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VDSVJDX0wgPSAyMzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VDSVJDX1UgPSAyMzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VHUkFWRV9MID0gMjMyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VR1JBVkVfVSA9IDIzMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVU1MID0gMjM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VUFNJSCA9IDIzNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVBTSUxPTl9MID0gMjM2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VUFNJTE9OX1UgPSAyMzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VVTUxfTCA9IDIzODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVVNTF9VID0gMjM5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9XRUlFUlAgPSAyNDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1hJX0wgPSAyNDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1hJX1UgPSAyNDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lBQ1VURV9MID0gMjQzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ZQUNVVEVfVSA9IDI0NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWUVOID0gMjQ1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ZVU1MX0wgPSAyNDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lVTUxfVSA9IDI0NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWkVUQV9MID0gMjQ4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9aRVRBX1UgPSAyNDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1pXSiA9IDI1MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWldOSiA9IDI1MTsKLQotCQlwdWJsaWMgc3RhdGljIGludCBnZXROdW1PZklkcygpIHsKLQkJCWlmIChudW1vZmlkcyAhPSAtMSkKLQkJCQlyZXR1cm4gbnVtb2ZpZHM7Ci0KLQkJCS8vIE5PVEU6IElmIHRoZSByZWZsZWN0aW9uIGlzIHRvbyBzbG93LCB0aGlzIG1ldGhvZCBzaG91bGQKLQkJCS8vIGp1c3QgcmV0dXJuIHRoZSBsaXRlcmFsIHZhbHVlLCBsaWtlIDI1Mi4KLQkJCS8vIC0tIDUvMjQvMjAwMQotCQkJQ2xhc3MgY2xhenogPSBJZHMuY2xhc3M7Ci0JCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkcygpOwotCQkJbnVtb2ZpZHMgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZpZWxkc1tpXS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiSURfIikpLy8kTk9OLU5MUy0xJAotCQkJCQludW1vZmlkcysrOwotCQkJfQotCQkJcmV0dXJuIG51bW9maWRzOwotCQl9Ci0KLQkJLy8gY2hhY2hlIHRoZSByZXN1bHQgb2YgdGhlIHJlZmxlY3Rpb24uCi0JCXByaXZhdGUgc3RhdGljIGludCBudW1vZmlkcyA9IC0xOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIG5hbWVzID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCW5hbWVzID0gbmV3IFN0cmluZ1tJZHMuZ2V0TnVtT2ZJZHMoKV07Ci0JCW5hbWVzW0lkcy5JRF9BQUNVVEVfTF0gPSBBQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX0FBQ1VURV9VXSA9IEFBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfQUNJUkNfTF0gPSBBQ0lSQ19MOwotCQluYW1lc1tJZHMuSURfQUNJUkNfVV0gPSBBQ0lSQ19VOwotCQluYW1lc1tJZHMuSURfQUNVVEVdID0gQUNVVEU7Ci0JCW5hbWVzW0lkcy5JRF9BRUxJR19MXSA9IEFFTElHX0w7Ci0JCW5hbWVzW0lkcy5JRF9BRUxJR19VXSA9IEFFTElHX1U7Ci0JCW5hbWVzW0lkcy5JRF9BR1JBVkVfTF0gPSBBR1JBVkVfTDsKLQkJbmFtZXNbSWRzLklEX0FHUkFWRV9VXSA9IEFHUkFWRV9VOwotCQluYW1lc1tJZHMuSURfQUxFRlNZTV0gPSBBTEVGU1lNOwotCQluYW1lc1tJZHMuSURfQUxQSEFfTF0gPSBBTFBIQV9MOwotCQluYW1lc1tJZHMuSURfQUxQSEFfVV0gPSBBTFBIQV9VOwotCQluYW1lc1tJZHMuSURfQU1QXSA9IEFNUDsKLQkJbmFtZXNbSWRzLklEX0FORF0gPSBBTkQ7Ci0JCW5hbWVzW0lkcy5JRF9BTkddID0gQU5HOwotCQluYW1lc1tJZHMuSURfQVJJTkdfTF0gPSBBUklOR19MOwotCQluYW1lc1tJZHMuSURfQVJJTkdfVV0gPSBBUklOR19VOwotCQluYW1lc1tJZHMuSURfQVNZTVBdID0gQVNZTVA7Ci0JCW5hbWVzW0lkcy5JRF9BVElMREVfTF0gPSBBVElMREVfTDsKLQkJbmFtZXNbSWRzLklEX0FUSUxERV9VXSA9IEFUSUxERV9VOwotCQluYW1lc1tJZHMuSURfQVVNTF9MXSA9IEFVTUxfTDsKLQkJbmFtZXNbSWRzLklEX0FVTUxfVV0gPSBBVU1MX1U7Ci0JCW5hbWVzW0lkcy5JRF9CRFFVT10gPSBCRFFVTzsKLQkJbmFtZXNbSWRzLklEX0JFVEFfTF0gPSBCRVRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9CRVRBX1VdID0gQkVUQV9VOwotCQluYW1lc1tJZHMuSURfQlJWQkFSXSA9IEJSVkJBUjsKLQkJbmFtZXNbSWRzLklEX0JVTExdID0gQlVMTDsKLQkJbmFtZXNbSWRzLklEX0NBUF0gPSBDQVA7Ci0JCW5hbWVzW0lkcy5JRF9DQ0VESUxfTF0gPSBDQ0VESUxfTDsKLQkJbmFtZXNbSWRzLklEX0NDRURJTF9VXSA9IENDRURJTF9VOwotCQluYW1lc1tJZHMuSURfQ0VESUxdID0gQ0VESUw7Ci0JCW5hbWVzW0lkcy5JRF9DRU5UXSA9IENFTlQ7Ci0JCW5hbWVzW0lkcy5JRF9DSElfTF0gPSBDSElfTDsKLQkJbmFtZXNbSWRzLklEX0NISV9VXSA9IENISV9VOwotCQluYW1lc1tJZHMuSURfQ0lSQ10gPSBDSVJDOwotCQluYW1lc1tJZHMuSURfQ0xVQlNdID0gQ0xVQlM7Ci0JCW5hbWVzW0lkcy5JRF9DT05HXSA9IENPTkc7Ci0JCW5hbWVzW0lkcy5JRF9DT1BZXSA9IENPUFk7Ci0JCW5hbWVzW0lkcy5JRF9DUkFSUl0gPSBDUkFSUjsKLQkJbmFtZXNbSWRzLklEX0NVUF0gPSBDVVA7Ci0JCW5hbWVzW0lkcy5JRF9DVVJSRU5dID0gQ1VSUkVOOwotCQluYW1lc1tJZHMuSURfREFHR0VSX0xdID0gREFHR0VSX0w7Ci0JCW5hbWVzW0lkcy5JRF9EQUdHRVJfVV0gPSBEQUdHRVJfVTsKLQkJbmFtZXNbSWRzLklEX0RBUlJfTF0gPSBEQVJSX0w7Ci0JCW5hbWVzW0lkcy5JRF9EQVJSX1VdID0gREFSUl9VOwotCQluYW1lc1tJZHMuSURfREVHXSA9IERFRzsKLQkJbmFtZXNbSWRzLklEX0RFTFRBX0xdID0gREVMVEFfTDsKLQkJbmFtZXNbSWRzLklEX0RFTFRBX1VdID0gREVMVEFfVTsKLQkJbmFtZXNbSWRzLklEX0RJQU1TXSA9IERJQU1TOwotCQluYW1lc1tJZHMuSURfRElWSURFXSA9IERJVklERTsKLQkJbmFtZXNbSWRzLklEX0VBQ1VURV9MXSA9IEVBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfRUFDVVRFX1VdID0gRUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9FQ0lSQ19MXSA9IEVDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9FQ0lSQ19VXSA9IEVDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9FR1JBVkVfTF0gPSBFR1JBVkVfTDsKLQkJbmFtZXNbSWRzLklEX0VHUkFWRV9VXSA9IEVHUkFWRV9VOwotCQluYW1lc1tJZHMuSURfRU1QVFldID0gRU1QVFk7Ci0JCW5hbWVzW0lkcy5JRF9FTVNQXSA9IEVNU1A7Ci0JCW5hbWVzW0lkcy5JRF9FTlNQXSA9IEVOU1A7Ci0JCW5hbWVzW0lkcy5JRF9FUFNJTE9OX0xdID0gRVBTSUxPTl9MOwotCQluYW1lc1tJZHMuSURfRVBTSUxPTl9VXSA9IEVQU0lMT05fVTsKLQkJbmFtZXNbSWRzLklEX0VRVUlWXSA9IEVRVUlWOwotCQluYW1lc1tJZHMuSURfRVRBX0xdID0gRVRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9FVEFfVV0gPSBFVEFfVTsKLQkJbmFtZXNbSWRzLklEX0VUSF9MXSA9IEVUSF9MOwotCQluYW1lc1tJZHMuSURfRVRIX1VdID0gRVRIX1U7Ci0JCW5hbWVzW0lkcy5JRF9FVU1MX0xdID0gRVVNTF9MOwotCQluYW1lc1tJZHMuSURfRVVNTF9VXSA9IEVVTUxfVTsKLQkJbmFtZXNbSWRzLklEX0VVUk9dID0gRVVSTzsKLQkJbmFtZXNbSWRzLklEX0VYSVNUXSA9IEVYSVNUOwotCQluYW1lc1tJZHMuSURfRk5PRl0gPSBGTk9GOwotCQluYW1lc1tJZHMuSURfRk9SQUxMXSA9IEZPUkFMTDsKLQkJbmFtZXNbSWRzLklEX0ZSQUMxMl0gPSBGUkFDMTI7Ci0JCW5hbWVzW0lkcy5JRF9GUkFDMTRdID0gRlJBQzE0OwotCQluYW1lc1tJZHMuSURfRlJBQzM0XSA9IEZSQUMzNDsKLQkJbmFtZXNbSWRzLklEX0ZSQVNMXSA9IEZSQVNMOwotCQluYW1lc1tJZHMuSURfR0FNTUFfTF0gPSBHQU1NQV9MOwotCQluYW1lc1tJZHMuSURfR0FNTUFfVV0gPSBHQU1NQV9VOwotCQluYW1lc1tJZHMuSURfR0VdID0gR0U7Ci0JCW5hbWVzW0lkcy5JRF9HVF0gPSBHVDsKLQkJbmFtZXNbSWRzLklEX0hBUlJfTF0gPSBIQVJSX0w7Ci0JCW5hbWVzW0lkcy5JRF9IQVJSX1VdID0gSEFSUl9VOwotCQluYW1lc1tJZHMuSURfSEVBUlRTXSA9IEhFQVJUUzsKLQkJbmFtZXNbSWRzLklEX0hFTExJUF0gPSBIRUxMSVA7Ci0JCW5hbWVzW0lkcy5JRF9JQUNVVEVfTF0gPSBJQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX0lBQ1VURV9VXSA9IElBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfSUNJUkNfTF0gPSBJQ0lSQ19MOwotCQluYW1lc1tJZHMuSURfSUNJUkNfVV0gPSBJQ0lSQ19VOwotCQluYW1lc1tJZHMuSURfSUVYQ0xdID0gSUVYQ0w7Ci0JCW5hbWVzW0lkcy5JRF9JR1JBVkVfTF0gPSBJR1JBVkVfTDsKLQkJbmFtZXNbSWRzLklEX0lHUkFWRV9VXSA9IElHUkFWRV9VOwotCQluYW1lc1tJZHMuSURfSU1BR0VdID0gSU1BR0U7Ci0JCW5hbWVzW0lkcy5JRF9JTkZJTl0gPSBJTkZJTjsKLQkJbmFtZXNbSWRzLklEX0lOVF0gPSBJTlQ7Ci0JCW5hbWVzW0lkcy5JRF9JT1RBX0xdID0gSU9UQV9MOwotCQluYW1lc1tJZHMuSURfSU9UQV9VXSA9IElPVEFfVTsKLQkJbmFtZXNbSWRzLklEX0lRVUVTVF0gPSBJUVVFU1Q7Ci0JCW5hbWVzW0lkcy5JRF9JU0lOXSA9IElTSU47Ci0JCW5hbWVzW0lkcy5JRF9JVU1MX0xdID0gSVVNTF9MOwotCQluYW1lc1tJZHMuSURfSVVNTF9VXSA9IElVTUxfVTsKLQkJbmFtZXNbSWRzLklEX0tBUFBBX0xdID0gS0FQUEFfTDsKLQkJbmFtZXNbSWRzLklEX0tBUFBBX1VdID0gS0FQUEFfVTsKLQkJbmFtZXNbSWRzLklEX0xBTUJEQV9MXSA9IExBTUJEQV9MOwotCQluYW1lc1tJZHMuSURfTEFNQkRBX1VdID0gTEFNQkRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9MQU5HXSA9IExBTkc7Ci0JCW5hbWVzW0lkcy5JRF9MQVFVT10gPSBMQVFVTzsKLQkJbmFtZXNbSWRzLklEX0xBUlJfTF0gPSBMQVJSX0w7Ci0JCW5hbWVzW0lkcy5JRF9MQVJSX1VdID0gTEFSUl9VOwotCQluYW1lc1tJZHMuSURfTENFSUxdID0gTENFSUw7Ci0JCW5hbWVzW0lkcy5JRF9MRFFVT10gPSBMRFFVTzsKLQkJbmFtZXNbSWRzLklEX0xFXSA9IExFOwotCQluYW1lc1tJZHMuSURfTEZMT09SXSA9IExGTE9PUjsKLQkJbmFtZXNbSWRzLklEX0xPV0FTVF0gPSBMT1dBU1Q7Ci0JCW5hbWVzW0lkcy5JRF9MT1pdID0gTE9aOwotCQluYW1lc1tJZHMuSURfTFJNXSA9IExSTTsKLQkJbmFtZXNbSWRzLklEX0xTQVFVT10gPSBMU0FRVU87Ci0JCW5hbWVzW0lkcy5JRF9MU1FVT10gPSBMU1FVTzsKLQkJbmFtZXNbSWRzLklEX0xUXSA9IExUOwotCQluYW1lc1tJZHMuSURfTUFDUl0gPSBNQUNSOwotCQluYW1lc1tJZHMuSURfTURBU0hdID0gTURBU0g7Ci0JCW5hbWVzW0lkcy5JRF9NSUNST10gPSBNSUNSTzsKLQkJbmFtZXNbSWRzLklEX01JRERPVF0gPSBNSURET1Q7Ci0JCW5hbWVzW0lkcy5JRF9NSU5VU10gPSBNSU5VUzsKLQkJbmFtZXNbSWRzLklEX01VX0xdID0gTVVfTDsKLQkJbmFtZXNbSWRzLklEX01VX1VdID0gTVVfVTsKLQkJbmFtZXNbSWRzLklEX05BQkxBXSA9IE5BQkxBOwotCQluYW1lc1tJZHMuSURfTkJTUF0gPSBOQlNQOwotCQluYW1lc1tJZHMuSURfTkRBU0hdID0gTkRBU0g7Ci0JCW5hbWVzW0lkcy5JRF9ORV0gPSBORTsKLQkJbmFtZXNbSWRzLklEX05JXSA9IE5JOwotCQluYW1lc1tJZHMuSURfTk9UXSA9IE5PVDsKLQkJbmFtZXNbSWRzLklEX05PVElOXSA9IE5PVElOOwotCQluYW1lc1tJZHMuSURfTlNVQl0gPSBOU1VCOwotCQluYW1lc1tJZHMuSURfTlRJTERFX0xdID0gTlRJTERFX0w7Ci0JCW5hbWVzW0lkcy5JRF9OVElMREVfVV0gPSBOVElMREVfVTsKLQkJbmFtZXNbSWRzLklEX05VX0xdID0gTlVfTDsKLQkJbmFtZXNbSWRzLklEX05VX1VdID0gTlVfVTsKLQkJbmFtZXNbSWRzLklEX09BQ1VURV9MXSA9IE9BQ1VURV9MOwotCQluYW1lc1tJZHMuSURfT0FDVVRFX1VdID0gT0FDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9PQ0lSQ19MXSA9IE9DSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9PQ0lSQ19VXSA9IE9DSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9PRUxJR19MXSA9IE9FTElHX0w7Ci0JCW5hbWVzW0lkcy5JRF9PRUxJR19VXSA9IE9FTElHX1U7Ci0JCW5hbWVzW0lkcy5JRF9PR1JBVkVfTF0gPSBPR1JBVkVfTDsKLQkJbmFtZXNbSWRzLklEX09HUkFWRV9VXSA9IE9HUkFWRV9VOwotCQluYW1lc1tJZHMuSURfT0xJTkVdID0gT0xJTkU7Ci0JCW5hbWVzW0lkcy5JRF9PTUVHQV9MXSA9IE9NRUdBX0w7Ci0JCW5hbWVzW0lkcy5JRF9PTUVHQV9VXSA9IE9NRUdBX1U7Ci0JCW5hbWVzW0lkcy5JRF9PTUlDUk9OX0xdID0gT01JQ1JPTl9MOwotCQluYW1lc1tJZHMuSURfT01JQ1JPTl9VXSA9IE9NSUNST05fVTsKLQkJbmFtZXNbSWRzLklEX09QTFVTXSA9IE9QTFVTOwotCQluYW1lc1tJZHMuSURfT1JdID0gT1I7Ci0JCW5hbWVzW0lkcy5JRF9PUkRGXSA9IE9SREY7Ci0JCW5hbWVzW0lkcy5JRF9PUkRNXSA9IE9SRE07Ci0JCW5hbWVzW0lkcy5JRF9PU0xBU0hfTF0gPSBPU0xBU0hfTDsKLQkJbmFtZXNbSWRzLklEX09TTEFTSF9VXSA9IE9TTEFTSF9VOwotCQluYW1lc1tJZHMuSURfT1RJTERFX0xdID0gT1RJTERFX0w7Ci0JCW5hbWVzW0lkcy5JRF9PVElMREVfVV0gPSBPVElMREVfVTsKLQkJbmFtZXNbSWRzLklEX09USU1FU10gPSBPVElNRVM7Ci0JCW5hbWVzW0lkcy5JRF9PVU1MX0xdID0gT1VNTF9MOwotCQluYW1lc1tJZHMuSURfT1VNTF9VXSA9IE9VTUxfVTsKLQkJbmFtZXNbSWRzLklEX1BBUkFdID0gUEFSQTsKLQkJbmFtZXNbSWRzLklEX1BBUlRdID0gUEFSVDsKLQkJbmFtZXNbSWRzLklEX1BFUk1JTF0gPSBQRVJNSUw7Ci0JCW5hbWVzW0lkcy5JRF9QRVJQXSA9IFBFUlA7Ci0JCW5hbWVzW0lkcy5JRF9QSElfTF0gPSBQSElfTDsKLQkJbmFtZXNbSWRzLklEX1BISV9VXSA9IFBISV9VOwotCQluYW1lc1tJZHMuSURfUElWXSA9IFBJVjsKLQkJbmFtZXNbSWRzLklEX1BJX0xdID0gUElfTDsKLQkJbmFtZXNbSWRzLklEX1BJX1VdID0gUElfVTsKLQkJbmFtZXNbSWRzLklEX1BMVVNNTl0gPSBQTFVTTU47Ci0JCW5hbWVzW0lkcy5JRF9QT1VORF0gPSBQT1VORDsKLQkJbmFtZXNbSWRzLklEX1BSSU1FX0xdID0gUFJJTUVfTDsKLQkJbmFtZXNbSWRzLklEX1BSSU1FX1VdID0gUFJJTUVfVTsKLQkJbmFtZXNbSWRzLklEX1BST0RdID0gUFJPRDsKLQkJbmFtZXNbSWRzLklEX1BST1BdID0gUFJPUDsKLQkJbmFtZXNbSWRzLklEX1BTSV9MXSA9IFBTSV9MOwotCQluYW1lc1tJZHMuSURfUFNJX1VdID0gUFNJX1U7Ci0JCW5hbWVzW0lkcy5JRF9RVU9UXSA9IFFVT1Q7Ci0JCW5hbWVzW0lkcy5JRF9SQURJQ10gPSBSQURJQzsKLQkJbmFtZXNbSWRzLklEX1JBTkddID0gUkFORzsKLQkJbmFtZXNbSWRzLklEX1JBUVVPXSA9IFJBUVVPOwotCQluYW1lc1tJZHMuSURfUkFSUl9MXSA9IFJBUlJfTDsKLQkJbmFtZXNbSWRzLklEX1JBUlJfVV0gPSBSQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9SQ0VJTF0gPSBSQ0VJTDsKLQkJbmFtZXNbSWRzLklEX1JEUVVPXSA9IFJEUVVPOwotCQluYW1lc1tJZHMuSURfUkVBTF0gPSBSRUFMOwotCQluYW1lc1tJZHMuSURfUkVHXSA9IFJFRzsKLQkJbmFtZXNbSWRzLklEX1JGTE9PUl0gPSBSRkxPT1I7Ci0JCW5hbWVzW0lkcy5JRF9SSE9fTF0gPSBSSE9fTDsKLQkJbmFtZXNbSWRzLklEX1JIT19VXSA9IFJIT19VOwotCQluYW1lc1tJZHMuSURfUkxNXSA9IFJMTTsKLQkJbmFtZXNbSWRzLklEX1JTQVFVT10gPSBSU0FRVU87Ci0JCW5hbWVzW0lkcy5JRF9SU1FVT10gPSBSU1FVTzsKLQkJbmFtZXNbSWRzLklEX1NCUVVPXSA9IFNCUVVPOwotCQluYW1lc1tJZHMuSURfU0NBUk9OX0xdID0gU0NBUk9OX0w7Ci0JCW5hbWVzW0lkcy5JRF9TQ0FST05fVV0gPSBTQ0FST05fVTsKLQkJbmFtZXNbSWRzLklEX1NET1RdID0gU0RPVDsKLQkJbmFtZXNbSWRzLklEX1NFQ1RdID0gU0VDVDsKLQkJbmFtZXNbSWRzLklEX1NIWV0gPSBTSFk7Ci0JCW5hbWVzW0lkcy5JRF9TSUdNQUZdID0gU0lHTUFGOwotCQluYW1lc1tJZHMuSURfU0lHTUFfTF0gPSBTSUdNQV9MOwotCQluYW1lc1tJZHMuSURfU0lHTUFfVV0gPSBTSUdNQV9VOwotCQluYW1lc1tJZHMuSURfU0lNXSA9IFNJTTsKLQkJbmFtZXNbSWRzLklEX1NQQURFU10gPSBTUEFERVM7Ci0JCW5hbWVzW0lkcy5JRF9TVUJdID0gU1VCOwotCQluYW1lc1tJZHMuSURfU1VCRV0gPSBTVUJFOwotCQluYW1lc1tJZHMuSURfU1VNXSA9IFNVTTsKLQkJbmFtZXNbSWRzLklEX1NVUF0gPSBTVVA7Ci0JCW5hbWVzW0lkcy5JRF9TVVAxXSA9IFNVUDE7Ci0JCW5hbWVzW0lkcy5JRF9TVVAyXSA9IFNVUDI7Ci0JCW5hbWVzW0lkcy5JRF9TVVAzXSA9IFNVUDM7Ci0JCW5hbWVzW0lkcy5JRF9TVVBFXSA9IFNVUEU7Ci0JCW5hbWVzW0lkcy5JRF9TWkxJR10gPSBTWkxJRzsKLQkJbmFtZXNbSWRzLklEX1RBVV9MXSA9IFRBVV9MOwotCQluYW1lc1tJZHMuSURfVEFVX1VdID0gVEFVX1U7Ci0JCW5hbWVzW0lkcy5JRF9USEVSRTRdID0gVEhFUkU0OwotCQluYW1lc1tJZHMuSURfVEhFVEFTWU1dID0gVEhFVEFTWU07Ci0JCW5hbWVzW0lkcy5JRF9USEVUQV9MXSA9IFRIRVRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9USEVUQV9VXSA9IFRIRVRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9USElOU1BdID0gVEhJTlNQOwotCQluYW1lc1tJZHMuSURfVEhPUk5fTF0gPSBUSE9STl9MOwotCQluYW1lc1tJZHMuSURfVEhPUk5fVV0gPSBUSE9STl9VOwotCQluYW1lc1tJZHMuSURfVElMREVdID0gVElMREU7Ci0JCW5hbWVzW0lkcy5JRF9USU1FU10gPSBUSU1FUzsKLQkJbmFtZXNbSWRzLklEX1RSQURFXSA9IFRSQURFOwotCQluYW1lc1tJZHMuSURfVUFDVVRFX0xdID0gVUFDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9VQUNVVEVfVV0gPSBVQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX1VBUlJfTF0gPSBVQVJSX0w7Ci0JCW5hbWVzW0lkcy5JRF9VQVJSX1VdID0gVUFSUl9VOwotCQluYW1lc1tJZHMuSURfVUNJUkNfTF0gPSBVQ0lSQ19MOwotCQluYW1lc1tJZHMuSURfVUNJUkNfVV0gPSBVQ0lSQ19VOwotCQluYW1lc1tJZHMuSURfVUdSQVZFX0xdID0gVUdSQVZFX0w7Ci0JCW5hbWVzW0lkcy5JRF9VR1JBVkVfVV0gPSBVR1JBVkVfVTsKLQkJbmFtZXNbSWRzLklEX1VNTF0gPSBVTUw7Ci0JCW5hbWVzW0lkcy5JRF9VUFNJSF0gPSBVUFNJSDsKLQkJbmFtZXNbSWRzLklEX1VQU0lMT05fTF0gPSBVUFNJTE9OX0w7Ci0JCW5hbWVzW0lkcy5JRF9VUFNJTE9OX1VdID0gVVBTSUxPTl9VOwotCQluYW1lc1tJZHMuSURfVVVNTF9MXSA9IFVVTUxfTDsKLQkJbmFtZXNbSWRzLklEX1VVTUxfVV0gPSBVVU1MX1U7Ci0JCW5hbWVzW0lkcy5JRF9XRUlFUlBdID0gV0VJRVJQOwotCQluYW1lc1tJZHMuSURfWElfTF0gPSBYSV9MOwotCQluYW1lc1tJZHMuSURfWElfVV0gPSBYSV9VOwotCQluYW1lc1tJZHMuSURfWUFDVVRFX0xdID0gWUFDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9ZQUNVVEVfVV0gPSBZQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX1lFTl0gPSBZRU47Ci0JCW5hbWVzW0lkcy5JRF9ZVU1MX0xdID0gWVVNTF9MOwotCQluYW1lc1tJZHMuSURfWVVNTF9VXSA9IFlVTUxfVTsKLQkJbmFtZXNbSWRzLklEX1pFVEFfTF0gPSBaRVRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9aRVRBX1VdID0gWkVUQV9VOwotCQluYW1lc1tJZHMuSURfWldKXSA9IFpXSjsKLQkJbmFtZXNbSWRzLklEX1pXTkpdID0gWldOSjsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHZhbHVlcyA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQl2YWx1ZXMgPSBuZXcgY2hhcltJZHMuZ2V0TnVtT2ZJZHMoKV07Ci0JCXZhbHVlc1tJZHMuSURfQUFDVVRFX0xdID0gMjI1OwotCQl2YWx1ZXNbSWRzLklEX0FBQ1VURV9VXSA9IDE5MzsKLQkJdmFsdWVzW0lkcy5JRF9BQ0lSQ19MXSA9IDIyNjsKLQkJdmFsdWVzW0lkcy5JRF9BQ0lSQ19VXSA9IDE5NDsKLQkJdmFsdWVzW0lkcy5JRF9BQ1VURV0gPSAxODA7Ci0JCXZhbHVlc1tJZHMuSURfQUVMSUdfTF0gPSAyMzA7Ci0JCXZhbHVlc1tJZHMuSURfQUVMSUdfVV0gPSAxOTg7Ci0JCXZhbHVlc1tJZHMuSURfQUdSQVZFX0xdID0gMjI0OwotCQl2YWx1ZXNbSWRzLklEX0FHUkFWRV9VXSA9IDE5MjsKLQkJdmFsdWVzW0lkcy5JRF9BTEVGU1lNXSA9IDg1MDE7Ci0JCXZhbHVlc1tJZHMuSURfQUxQSEFfTF0gPSA5NDU7Ci0JCXZhbHVlc1tJZHMuSURfQUxQSEFfVV0gPSA5MTM7Ci0JCXZhbHVlc1tJZHMuSURfQU1QXSA9IDM4OwotCQl2YWx1ZXNbSWRzLklEX0FORF0gPSA4NzQzOwotCQl2YWx1ZXNbSWRzLklEX0FOR10gPSA4NzM2OwotCQl2YWx1ZXNbSWRzLklEX0FSSU5HX0xdID0gMjI5OwotCQl2YWx1ZXNbSWRzLklEX0FSSU5HX1VdID0gMTk3OwotCQl2YWx1ZXNbSWRzLklEX0FTWU1QXSA9IDg3NzY7Ci0JCXZhbHVlc1tJZHMuSURfQVRJTERFX0xdID0gMjI3OwotCQl2YWx1ZXNbSWRzLklEX0FUSUxERV9VXSA9IDE5NTsKLQkJdmFsdWVzW0lkcy5JRF9BVU1MX0xdID0gMjI4OwotCQl2YWx1ZXNbSWRzLklEX0FVTUxfVV0gPSAxOTY7Ci0JCXZhbHVlc1tJZHMuSURfQkRRVU9dID0gODIyMjsKLQkJdmFsdWVzW0lkcy5JRF9CRVRBX0xdID0gOTQ2OwotCQl2YWx1ZXNbSWRzLklEX0JFVEFfVV0gPSA5MTQ7Ci0JCXZhbHVlc1tJZHMuSURfQlJWQkFSXSA9IDE2NjsKLQkJdmFsdWVzW0lkcy5JRF9CVUxMXSA9IDgyMjY7Ci0JCXZhbHVlc1tJZHMuSURfQ0FQXSA9IDg3NDU7Ci0JCXZhbHVlc1tJZHMuSURfQ0NFRElMX0xdID0gMjMxOwotCQl2YWx1ZXNbSWRzLklEX0NDRURJTF9VXSA9IDE5OTsKLQkJdmFsdWVzW0lkcy5JRF9DRURJTF0gPSAxODQ7Ci0JCXZhbHVlc1tJZHMuSURfQ0VOVF0gPSAxNjI7Ci0JCXZhbHVlc1tJZHMuSURfQ0hJX0xdID0gOTY3OwotCQl2YWx1ZXNbSWRzLklEX0NISV9VXSA9IDkzNTsKLQkJdmFsdWVzW0lkcy5JRF9DSVJDXSA9IDcxMDsKLQkJdmFsdWVzW0lkcy5JRF9DTFVCU10gPSA5ODI3OwotCQl2YWx1ZXNbSWRzLklEX0NPTkddID0gODc3MzsKLQkJdmFsdWVzW0lkcy5JRF9DT1BZXSA9IDE2OTsKLQkJdmFsdWVzW0lkcy5JRF9DUkFSUl0gPSA4NjI5OwotCQl2YWx1ZXNbSWRzLklEX0NVUF0gPSA4NzQ2OwotCQl2YWx1ZXNbSWRzLklEX0NVUlJFTl0gPSAxNjQ7Ci0JCXZhbHVlc1tJZHMuSURfREFHR0VSX0xdID0gODIyNDsKLQkJdmFsdWVzW0lkcy5JRF9EQUdHRVJfVV0gPSA4MjI1OwotCQl2YWx1ZXNbSWRzLklEX0RBUlJfTF0gPSA4NTk1OwotCQl2YWx1ZXNbSWRzLklEX0RBUlJfVV0gPSA4NjU5OwotCQl2YWx1ZXNbSWRzLklEX0RFR10gPSAxNzY7Ci0JCXZhbHVlc1tJZHMuSURfREVMVEFfTF0gPSA5NDg7Ci0JCXZhbHVlc1tJZHMuSURfREVMVEFfVV0gPSA5MTY7Ci0JCXZhbHVlc1tJZHMuSURfRElBTVNdID0gOTgzMDsKLQkJdmFsdWVzW0lkcy5JRF9ESVZJREVdID0gMjQ3OwotCQl2YWx1ZXNbSWRzLklEX0VBQ1VURV9MXSA9IDIzMzsKLQkJdmFsdWVzW0lkcy5JRF9FQUNVVEVfVV0gPSAyMDE7Ci0JCXZhbHVlc1tJZHMuSURfRUNJUkNfTF0gPSAyMzQ7Ci0JCXZhbHVlc1tJZHMuSURfRUNJUkNfVV0gPSAyMDI7Ci0JCXZhbHVlc1tJZHMuSURfRUdSQVZFX0xdID0gMjMyOwotCQl2YWx1ZXNbSWRzLklEX0VHUkFWRV9VXSA9IDIwMDsKLQkJdmFsdWVzW0lkcy5JRF9FTVBUWV0gPSA4NzA5OwotCQl2YWx1ZXNbSWRzLklEX0VNU1BdID0gODE5NTsKLQkJdmFsdWVzW0lkcy5JRF9FTlNQXSA9IDgxOTQ7Ci0JCXZhbHVlc1tJZHMuSURfRVBTSUxPTl9MXSA9IDk0OTsKLQkJdmFsdWVzW0lkcy5JRF9FUFNJTE9OX1VdID0gOTE3OwotCQl2YWx1ZXNbSWRzLklEX0VRVUlWXSA9IDg4MDE7Ci0JCXZhbHVlc1tJZHMuSURfRVRBX0xdID0gOTUxOwotCQl2YWx1ZXNbSWRzLklEX0VUQV9VXSA9IDkxOTsKLQkJdmFsdWVzW0lkcy5JRF9FVEhfTF0gPSAyNDA7Ci0JCXZhbHVlc1tJZHMuSURfRVRIX1VdID0gMjA4OwotCQl2YWx1ZXNbSWRzLklEX0VVTUxfTF0gPSAyMzU7Ci0JCXZhbHVlc1tJZHMuSURfRVVNTF9VXSA9IDIwMzsKLQkJdmFsdWVzW0lkcy5JRF9FVVJPXSA9IDgzNjQ7Ci0JCXZhbHVlc1tJZHMuSURfRVhJU1RdID0gODcwNzsKLQkJdmFsdWVzW0lkcy5JRF9GTk9GXSA9IDQwMjsKLQkJdmFsdWVzW0lkcy5JRF9GT1JBTExdID0gODcwNDsKLQkJdmFsdWVzW0lkcy5JRF9GUkFDMTJdID0gMTg5OwotCQl2YWx1ZXNbSWRzLklEX0ZSQUMxNF0gPSAxODg7Ci0JCXZhbHVlc1tJZHMuSURfRlJBQzM0XSA9IDE5MDsKLQkJdmFsdWVzW0lkcy5JRF9GUkFTTF0gPSA4MjYwOwotCQl2YWx1ZXNbSWRzLklEX0dBTU1BX0xdID0gOTQ3OwotCQl2YWx1ZXNbSWRzLklEX0dBTU1BX1VdID0gOTE1OwotCQl2YWx1ZXNbSWRzLklEX0dFXSA9IDg4MDU7Ci0JCXZhbHVlc1tJZHMuSURfR1RdID0gNjI7Ci0JCXZhbHVlc1tJZHMuSURfSEFSUl9MXSA9IDg1OTY7Ci0JCXZhbHVlc1tJZHMuSURfSEFSUl9VXSA9IDg2NjA7Ci0JCXZhbHVlc1tJZHMuSURfSEVBUlRTXSA9IDk4Mjk7Ci0JCXZhbHVlc1tJZHMuSURfSEVMTElQXSA9IDgyMzA7Ci0JCXZhbHVlc1tJZHMuSURfSUFDVVRFX0xdID0gMjM3OwotCQl2YWx1ZXNbSWRzLklEX0lBQ1VURV9VXSA9IDIwNTsKLQkJdmFsdWVzW0lkcy5JRF9JQ0lSQ19MXSA9IDIzODsKLQkJdmFsdWVzW0lkcy5JRF9JQ0lSQ19VXSA9IDIwNjsKLQkJdmFsdWVzW0lkcy5JRF9JRVhDTF0gPSAxNjE7Ci0JCXZhbHVlc1tJZHMuSURfSUdSQVZFX0xdID0gMjM2OwotCQl2YWx1ZXNbSWRzLklEX0lHUkFWRV9VXSA9IDIwNDsKLQkJdmFsdWVzW0lkcy5JRF9JTUFHRV0gPSA4NDY1OwotCQl2YWx1ZXNbSWRzLklEX0lORklOXSA9IDg3MzQ7Ci0JCXZhbHVlc1tJZHMuSURfSU5UXSA9IDg3NDc7Ci0JCXZhbHVlc1tJZHMuSURfSU9UQV9MXSA9IDk1MzsKLQkJdmFsdWVzW0lkcy5JRF9JT1RBX1VdID0gOTIxOwotCQl2YWx1ZXNbSWRzLklEX0lRVUVTVF0gPSAxOTE7Ci0JCXZhbHVlc1tJZHMuSURfSVNJTl0gPSA4NzEyOwotCQl2YWx1ZXNbSWRzLklEX0lVTUxfTF0gPSAyMzk7Ci0JCXZhbHVlc1tJZHMuSURfSVVNTF9VXSA9IDIwNzsKLQkJdmFsdWVzW0lkcy5JRF9LQVBQQV9MXSA9IDk1NDsKLQkJdmFsdWVzW0lkcy5JRF9LQVBQQV9VXSA9IDkyMjsKLQkJdmFsdWVzW0lkcy5JRF9MQU1CREFfTF0gPSA5NTU7Ci0JCXZhbHVlc1tJZHMuSURfTEFNQkRBX1VdID0gOTIzOwotCQl2YWx1ZXNbSWRzLklEX0xBTkddID0gOTAwMTsKLQkJdmFsdWVzW0lkcy5JRF9MQVFVT10gPSAxNzE7Ci0JCXZhbHVlc1tJZHMuSURfTEFSUl9MXSA9IDg1OTI7Ci0JCXZhbHVlc1tJZHMuSURfTEFSUl9VXSA9IDg2NTY7Ci0JCXZhbHVlc1tJZHMuSURfTENFSUxdID0gODk2ODsKLQkJdmFsdWVzW0lkcy5JRF9MRFFVT10gPSA4MjIwOwotCQl2YWx1ZXNbSWRzLklEX0xFXSA9IDg4MDQ7Ci0JCXZhbHVlc1tJZHMuSURfTEZMT09SXSA9IDg5NzA7Ci0JCXZhbHVlc1tJZHMuSURfTE9XQVNUXSA9IDg3Mjc7Ci0JCXZhbHVlc1tJZHMuSURfTE9aXSA9IDk2NzQ7Ci0JCXZhbHVlc1tJZHMuSURfTFJNXSA9IDgyMDY7Ci0JCXZhbHVlc1tJZHMuSURfTFNBUVVPXSA9IDgyNDk7Ci0JCXZhbHVlc1tJZHMuSURfTFNRVU9dID0gODIxNjsKLQkJdmFsdWVzW0lkcy5JRF9MVF0gPSA2MDsKLQkJdmFsdWVzW0lkcy5JRF9NQUNSXSA9IDE3NTsKLQkJdmFsdWVzW0lkcy5JRF9NREFTSF0gPSA4MjEyOwotCQl2YWx1ZXNbSWRzLklEX01JQ1JPXSA9IDE4MTsKLQkJdmFsdWVzW0lkcy5JRF9NSURET1RdID0gMTgzOwotCQl2YWx1ZXNbSWRzLklEX01JTlVTXSA9IDg3MjI7Ci0JCXZhbHVlc1tJZHMuSURfTVVfTF0gPSA5NTY7Ci0JCXZhbHVlc1tJZHMuSURfTVVfVV0gPSA5MjQ7Ci0JCXZhbHVlc1tJZHMuSURfTkFCTEFdID0gODcxMTsKLQkJdmFsdWVzW0lkcy5JRF9OQlNQXSA9IDE2MDsKLQkJdmFsdWVzW0lkcy5JRF9OREFTSF0gPSA4MjExOwotCQl2YWx1ZXNbSWRzLklEX05FXSA9IDg4MDA7Ci0JCXZhbHVlc1tJZHMuSURfTkldID0gODcxNTsKLQkJdmFsdWVzW0lkcy5JRF9OT1RdID0gMTcyOwotCQl2YWx1ZXNbSWRzLklEX05PVElOXSA9IDg3MTM7Ci0JCXZhbHVlc1tJZHMuSURfTlNVQl0gPSA4ODM2OwotCQl2YWx1ZXNbSWRzLklEX05USUxERV9MXSA9IDI0MTsKLQkJdmFsdWVzW0lkcy5JRF9OVElMREVfVV0gPSAyMDk7Ci0JCXZhbHVlc1tJZHMuSURfTlVfTF0gPSA5NTc7Ci0JCXZhbHVlc1tJZHMuSURfTlVfVV0gPSA5MjU7Ci0JCXZhbHVlc1tJZHMuSURfT0FDVVRFX0xdID0gMjQzOwotCQl2YWx1ZXNbSWRzLklEX09BQ1VURV9VXSA9IDIxMTsKLQkJdmFsdWVzW0lkcy5JRF9PQ0lSQ19MXSA9IDI0NDsKLQkJdmFsdWVzW0lkcy5JRF9PQ0lSQ19VXSA9IDIxMjsKLQkJdmFsdWVzW0lkcy5JRF9PRUxJR19MXSA9IDMzOTsKLQkJdmFsdWVzW0lkcy5JRF9PRUxJR19VXSA9IDMzODsKLQkJdmFsdWVzW0lkcy5JRF9PR1JBVkVfTF0gPSAyNDI7Ci0JCXZhbHVlc1tJZHMuSURfT0dSQVZFX1VdID0gMjEwOwotCQl2YWx1ZXNbSWRzLklEX09MSU5FXSA9IDgyNTQ7Ci0JCXZhbHVlc1tJZHMuSURfT01FR0FfTF0gPSA5Njk7Ci0JCXZhbHVlc1tJZHMuSURfT01FR0FfVV0gPSA5Mzc7Ci0JCXZhbHVlc1tJZHMuSURfT01JQ1JPTl9MXSA9IDk1OTsKLQkJdmFsdWVzW0lkcy5JRF9PTUlDUk9OX1VdID0gOTI3OwotCQl2YWx1ZXNbSWRzLklEX09QTFVTXSA9IDg4NTM7Ci0JCXZhbHVlc1tJZHMuSURfT1JdID0gODc0NDsKLQkJdmFsdWVzW0lkcy5JRF9PUkRGXSA9IDE3MDsKLQkJdmFsdWVzW0lkcy5JRF9PUkRNXSA9IDE4NjsKLQkJdmFsdWVzW0lkcy5JRF9PU0xBU0hfTF0gPSAyNDg7Ci0JCXZhbHVlc1tJZHMuSURfT1NMQVNIX1VdID0gMjE2OwotCQl2YWx1ZXNbSWRzLklEX09USUxERV9MXSA9IDI0NTsKLQkJdmFsdWVzW0lkcy5JRF9PVElMREVfVV0gPSAyMTM7Ci0JCXZhbHVlc1tJZHMuSURfT1RJTUVTXSA9IDg4NTU7Ci0JCXZhbHVlc1tJZHMuSURfT1VNTF9MXSA9IDI0NjsKLQkJdmFsdWVzW0lkcy5JRF9PVU1MX1VdID0gMjE0OwotCQl2YWx1ZXNbSWRzLklEX1BBUkFdID0gMTgyOwotCQl2YWx1ZXNbSWRzLklEX1BBUlRdID0gODcwNjsKLQkJdmFsdWVzW0lkcy5JRF9QRVJNSUxdID0gODI0MDsKLQkJdmFsdWVzW0lkcy5JRF9QRVJQXSA9IDg4Njk7Ci0JCXZhbHVlc1tJZHMuSURfUEhJX0xdID0gOTY2OwotCQl2YWx1ZXNbSWRzLklEX1BISV9VXSA9IDkzNDsKLQkJdmFsdWVzW0lkcy5JRF9QSVZdID0gOTgyOwotCQl2YWx1ZXNbSWRzLklEX1BJX0xdID0gOTYwOwotCQl2YWx1ZXNbSWRzLklEX1BJX1VdID0gOTI4OwotCQl2YWx1ZXNbSWRzLklEX1BMVVNNTl0gPSAxNzc7Ci0JCXZhbHVlc1tJZHMuSURfUE9VTkRdID0gMTYzOwotCQl2YWx1ZXNbSWRzLklEX1BSSU1FX0xdID0gODI0MjsKLQkJdmFsdWVzW0lkcy5JRF9QUklNRV9VXSA9IDgyNDM7Ci0JCXZhbHVlc1tJZHMuSURfUFJPRF0gPSA4NzE5OwotCQl2YWx1ZXNbSWRzLklEX1BST1BdID0gODczMzsKLQkJdmFsdWVzW0lkcy5JRF9QU0lfTF0gPSA5Njg7Ci0JCXZhbHVlc1tJZHMuSURfUFNJX1VdID0gOTM2OwotCQl2YWx1ZXNbSWRzLklEX1FVT1RdID0gMzQ7Ci0JCXZhbHVlc1tJZHMuSURfUkFESUNdID0gODczMDsKLQkJdmFsdWVzW0lkcy5JRF9SQU5HXSA9IDkwMDI7Ci0JCXZhbHVlc1tJZHMuSURfUkFRVU9dID0gMTg3OwotCQl2YWx1ZXNbSWRzLklEX1JBUlJfTF0gPSA4NTk0OwotCQl2YWx1ZXNbSWRzLklEX1JBUlJfVV0gPSA4NjU4OwotCQl2YWx1ZXNbSWRzLklEX1JDRUlMXSA9IDg5Njk7Ci0JCXZhbHVlc1tJZHMuSURfUkRRVU9dID0gODIyMTsKLQkJdmFsdWVzW0lkcy5JRF9SRUFMXSA9IDg0NzY7Ci0JCXZhbHVlc1tJZHMuSURfUkVHXSA9IDE3NDsKLQkJdmFsdWVzW0lkcy5JRF9SRkxPT1JdID0gODk3MTsKLQkJdmFsdWVzW0lkcy5JRF9SSE9fTF0gPSA5NjE7Ci0JCXZhbHVlc1tJZHMuSURfUkhPX1VdID0gOTI5OwotCQl2YWx1ZXNbSWRzLklEX1JMTV0gPSA4MjA3OwotCQl2YWx1ZXNbSWRzLklEX1JTQVFVT10gPSA4MjUwOwotCQl2YWx1ZXNbSWRzLklEX1JTUVVPXSA9IDgyMTc7Ci0JCXZhbHVlc1tJZHMuSURfU0JRVU9dID0gODIxODsKLQkJdmFsdWVzW0lkcy5JRF9TQ0FST05fTF0gPSAzNTM7Ci0JCXZhbHVlc1tJZHMuSURfU0NBUk9OX1VdID0gMzUyOwotCQl2YWx1ZXNbSWRzLklEX1NET1RdID0gODkwMTsKLQkJdmFsdWVzW0lkcy5JRF9TRUNUXSA9IDE2NzsKLQkJdmFsdWVzW0lkcy5JRF9TSFldID0gMTczOwotCQl2YWx1ZXNbSWRzLklEX1NJR01BRl0gPSA5NjI7Ci0JCXZhbHVlc1tJZHMuSURfU0lHTUFfTF0gPSA5NjM7Ci0JCXZhbHVlc1tJZHMuSURfU0lHTUFfVV0gPSA5MzE7Ci0JCXZhbHVlc1tJZHMuSURfU0lNXSA9IDg3NjQ7Ci0JCXZhbHVlc1tJZHMuSURfU1BBREVTXSA9IDk4MjQ7Ci0JCXZhbHVlc1tJZHMuSURfU1VCXSA9IDg4MzQ7Ci0JCXZhbHVlc1tJZHMuSURfU1VCRV0gPSA4ODM4OwotCQl2YWx1ZXNbSWRzLklEX1NVTV0gPSA4NzIxOwotCQl2YWx1ZXNbSWRzLklEX1NVUF0gPSA4ODM1OwotCQl2YWx1ZXNbSWRzLklEX1NVUDFdID0gMTg1OwotCQl2YWx1ZXNbSWRzLklEX1NVUDJdID0gMTc4OwotCQl2YWx1ZXNbSWRzLklEX1NVUDNdID0gMTc5OwotCQl2YWx1ZXNbSWRzLklEX1NVUEVdID0gODgzOTsKLQkJdmFsdWVzW0lkcy5JRF9TWkxJR10gPSAyMjM7Ci0JCXZhbHVlc1tJZHMuSURfVEFVX0xdID0gOTY0OwotCQl2YWx1ZXNbSWRzLklEX1RBVV9VXSA9IDkzMjsKLQkJdmFsdWVzW0lkcy5JRF9USEVSRTRdID0gODc1NjsKLQkJdmFsdWVzW0lkcy5JRF9USEVUQVNZTV0gPSA5Nzc7Ci0JCXZhbHVlc1tJZHMuSURfVEhFVEFfTF0gPSA5NTI7Ci0JCXZhbHVlc1tJZHMuSURfVEhFVEFfVV0gPSA5MjA7Ci0JCXZhbHVlc1tJZHMuSURfVEhJTlNQXSA9IDgyMDE7Ci0JCXZhbHVlc1tJZHMuSURfVEhPUk5fTF0gPSAyNTQ7Ci0JCXZhbHVlc1tJZHMuSURfVEhPUk5fVV0gPSAyMjI7Ci0JCXZhbHVlc1tJZHMuSURfVElMREVdID0gNzMyOwotCQl2YWx1ZXNbSWRzLklEX1RJTUVTXSA9IDIxNTsKLQkJdmFsdWVzW0lkcy5JRF9UUkFERV0gPSA4NDgyOwotCQl2YWx1ZXNbSWRzLklEX1VBQ1VURV9MXSA9IDI1MDsKLQkJdmFsdWVzW0lkcy5JRF9VQUNVVEVfVV0gPSAyMTg7Ci0JCXZhbHVlc1tJZHMuSURfVUFSUl9MXSA9IDg1OTM7Ci0JCXZhbHVlc1tJZHMuSURfVUFSUl9VXSA9IDg2NTc7Ci0JCXZhbHVlc1tJZHMuSURfVUNJUkNfTF0gPSAyNTE7Ci0JCXZhbHVlc1tJZHMuSURfVUNJUkNfVV0gPSAyMTk7Ci0JCXZhbHVlc1tJZHMuSURfVUdSQVZFX0xdID0gMjQ5OwotCQl2YWx1ZXNbSWRzLklEX1VHUkFWRV9VXSA9IDIxNzsKLQkJdmFsdWVzW0lkcy5JRF9VTUxdID0gMTY4OwotCQl2YWx1ZXNbSWRzLklEX1VQU0lIXSA9IDk3ODsKLQkJdmFsdWVzW0lkcy5JRF9VUFNJTE9OX0xdID0gOTY1OwotCQl2YWx1ZXNbSWRzLklEX1VQU0lMT05fVV0gPSA5MzM7Ci0JCXZhbHVlc1tJZHMuSURfVVVNTF9MXSA9IDI1MjsKLQkJdmFsdWVzW0lkcy5JRF9VVU1MX1VdID0gMjIwOwotCQl2YWx1ZXNbSWRzLklEX1dFSUVSUF0gPSA4NDcyOwotCQl2YWx1ZXNbSWRzLklEX1hJX0xdID0gOTU4OwotCQl2YWx1ZXNbSWRzLklEX1hJX1VdID0gOTI2OwotCQl2YWx1ZXNbSWRzLklEX1lBQ1VURV9MXSA9IDI1MzsKLQkJdmFsdWVzW0lkcy5JRF9ZQUNVVEVfVV0gPSAyMjE7Ci0JCXZhbHVlc1tJZHMuSURfWUVOXSA9IDE2NTsKLQkJdmFsdWVzW0lkcy5JRF9ZVU1MX0xdID0gMjU1OwotCQl2YWx1ZXNbSWRzLklEX1lVTUxfVV0gPSAzNzY7Ci0JCXZhbHVlc1tJZHMuSURfWkVUQV9MXSA9IDk1MDsKLQkJdmFsdWVzW0lkcy5JRF9aRVRBX1VdID0gOTE4OwotCQl2YWx1ZXNbSWRzLklEX1pXSl0gPSA4MjA1OwotCQl2YWx1ZXNbSWRzLklEX1pXTkpdID0gODIwNDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRW50aXR5Q29sbGVjdGlvbigpIHsKLQkJc3VwZXIobmFtZXMsIFNUUklDVF9DQVNFKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gZW50aXR5IGRlY2xhcmF0aW9uLgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKiBAcGFyYW0gYXR0ck5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBDTU5vZGUgY3JlYXRlKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCWludCBpZCA9IGdldElEKGVudGl0eU5hbWUpOwotCQlpZiAoaWQgPT0gSURfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyB2YWx1ZSA9IFN0cmluZy52YWx1ZU9mKHZhbHVlc1tpZF0pOwotCQlIVE1MRW50aXR5RGVjbEltcGwgZGVjID0gbmV3IEhUTUxFbnRpdHlEZWNsSW1wbChlbnRpdHlOYW1lLCB2YWx1ZSk7Ci0KLQkJcmV0dXJuIGRlYzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0g1Q01Eb2NJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0g1Q01Eb2NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNmM5ZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9INUNNRG9jSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDTURvY3VtZW50IGltcGxlbWVudGF0aW9uIGZvciB0aGUgSFRNTC4KLSAqLwotY2xhc3MgSDVDTURvY0ltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSFRNTENNRG9jdW1lbnQgewotCi0JLyoqIE5hbWVzcGFjZSBmb3IgYWxsIG5hbWVzIG9mIGVsZW1lbnRzLCBlbnRpdGllcyBhbmQgYXR0cmlidXRlcy4gKi8KLQlwcml2YXRlIENNTmFtZXNwYWNlSW1wbCBuYW1lc3BhY2UgPSBudWxsOwotCXByaXZhdGUgSFRNTDVFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50cyA9IG51bGw7Ci0JcHJpdmF0ZSBFbnRpdHlDb2xsZWN0aW9uIGVudGl0aWVzID0gbnVsbDsKLQlwcml2YXRlIEF0dHJpYnV0ZUNvbGxlY3Rpb24gYXR0cmlidXRlcyA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSDVDTURvY0ltcGwoU3RyaW5nIGRvY1R5cGVOYW1lLCBDTU5hbWVzcGFjZUltcGwgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCXN1cGVyKGRvY1R5cGVOYW1lKTsKLQkJbmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotCQkKLQkJYXR0cmlidXRlcyA9IG5ldyBIVE1MNUF0dHJpYnV0ZUNvbGxlY3Rpb24oKTsKLQkJZWxlbWVudHMgPSBuZXcgSFRNTDVFbGVtZW50Q29sbGVjdGlvbihhdHRyaWJ1dGVzKTsKLQkJZW50aXRpZXMgPSBuZXcgRW50aXR5Q29sbGVjdGlvbigpOwotCX0KLQotCUF0dHJpYnV0ZUNvbGxlY3Rpb24gZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCi0JcHVibGljIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudERlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRzLmdldE5hbWVkSXRlbShlbGVtZW50TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJcmV0dXJuIGVudGl0aWVzOwotCX0KLQotCXB1YmxpYyBIVE1MRW50aXR5RGVjbGFyYXRpb24gZ2V0RW50aXR5RGVjbGFyYXRpb24oU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJaWYgKGVudGl0aWVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChIVE1MRW50aXR5RGVjbGFyYXRpb24pIGVudGl0aWVzLmdldE5hbWVkSXRlbShlbnRpdHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBDTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDTU5vZGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkRPQ1VNRU5UOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSENNRG9jSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IQ01Eb2NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYTIzM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IQ01Eb2NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIENNRG9jdW1lbnQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBIVE1MLgotICovCi1jbGFzcyBIQ01Eb2NJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxDTURvY3VtZW50IHsKLQotCS8qKiBOYW1lc3BhY2UgZm9yIGFsbCBuYW1lcyBvZiBlbGVtZW50cywgZW50aXRpZXMgYW5kIGF0dHJpYnV0ZXMuICovCi0JcHJpdmF0ZSBDTU5hbWVzcGFjZUltcGwgbmFtZXNwYWNlID0gbnVsbDsKLQlwcml2YXRlIEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRzID0gbnVsbDsKLQlwcml2YXRlIEVudGl0eUNvbGxlY3Rpb24gZW50aXRpZXMgPSBudWxsOwotCXByaXZhdGUgQXR0cmlidXRlQ29sbGVjdGlvbiBhdHRyaWJ1dGVzID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIQ01Eb2NJbXBsKFN0cmluZyBkb2NUeXBlTmFtZSwgQ01OYW1lc3BhY2VJbXBsIHRhcmdldE5hbWVzcGFjZSkgewotCQlzdXBlcihkb2NUeXBlTmFtZSk7Ci0JCW5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLQkJYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVDb2xsZWN0aW9uKCk7Ci0JCWVsZW1lbnRzID0gbmV3IEVsZW1lbnRDb2xsZWN0aW9uKGF0dHJpYnV0ZXMpOwotCQllbnRpdGllcyA9IG5ldyBFbnRpdHlDb2xsZWN0aW9uKCk7Ci0JfQotCi0JQXR0cmlidXRlQ29sbGVjdGlvbiBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudHMuZ2V0TmFtZWRJdGVtKGVsZW1lbnROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpIHsKLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQlyZXR1cm4gZW50aXRpZXM7Ci0JfQotCi0JcHVibGljIEhUTUxFbnRpdHlEZWNsYXJhdGlvbiBnZXRFbnRpdHlEZWNsYXJhdGlvbihTdHJpbmcgZW50aXR5TmFtZSkgewotCQlpZiAoZW50aXRpZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEhUTUxFbnRpdHlEZWNsYXJhdGlvbikgZW50aXRpZXMuZ2V0TmFtZWRJdGVtKGVudGl0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICovCi0JcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENNTm9kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRE9DVU1FTlQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MNUF0dHJpYnV0ZUNvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTDVBdHRyaWJ1dGVDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NWI2N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MNUF0dHJpYnV0ZUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw1ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi1wdWJsaWMgY2xhc3MgSFRNTDVBdHRyaWJ1dGVDb2xsZWN0aW9uIGV4dGVuZHMgQXR0cmlidXRlQ29sbGVjdGlvbiBpbXBsZW1lbnRzIEhUTUw1ME5hbWVzcGFjZSB7Ci0JLyoqIGh0bWw1IGNvcmUgYXR0cmlicyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPUkUgPSB7QVRUUl9OQU1FX0FDQ0VTU0tFWSwgQVRUUl9OQU1FX0NMQVNTLCBBVFRSX05BTUVfQ09OVEVOVF9FRElUQUJMRSwgQVRUUl9OQU1FX0NPTlRFWFRfTUVOVSwgQVRUUl9OQU1FX0RJUiwgQVRUUl9OQU1FX0RSQUdHQUJMRSwgQVRUUl9OQU1FX0hJRERFTiwgQVRUUl9OQU1FX0lELCBBVFRSX05BTUVfTEFORywgQVRUUl9OQU1FX1NQRUxMQ0hFQ0ssQVRUUl9OQU1FX1NUWUxFLCBBVFRSX05BTUVfVEFCSU5ERVgsIEFUVFJfTkFNRV9USVRMRX07Ci0JLyoqIGV2ZW50cyBmb3IgSFRNTDUuICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRVZFTlRTID0ge0FUVFJfTkFNRV9PTkFCT1JULCBBVFRSX05BTUVfT05CTFVSLCBBVFRSX05BTUVfT05DQU5fUExBWSwgQVRUUl9OQU1FX09OQ0FOX1BMQVlfVEhST1VHSCwgQVRUUl9OQU1FX09OQ0hBTkdFLCBBVFRSX05BTUVfT05DTElDSywgQVRUUl9OQU1FX09OQ09OVEVYVF9NRU5VLCBBVFRSX05BTUVfT05EQkxDTElDSywgQVRUUl9OQU1FX09ORFJBRywgQVRUUl9OQU1FX09ORFJBR19FTkQsIEFUVFJfTkFNRV9PTkRSQUdfRU5URVIsIEFUVFJfTkFNRV9PTkRSQUdfTEVBVkUsIAotCQlBVFRSX05BTUVfT05EUkFHX09WRVIsIEFUVFJfTkFNRV9PTkRSQUdfU1RBUlQsIEFUVFJfTkFNRV9PTkRST1AsIEFUVFJfTkFNRV9PTkRVUkFUSU9OX0NIQU5HRSwgQVRUUl9OQU1FX09ORU1QVElFRCwgQVRUUl9OQU1FX09ORU5ERUQsIEFUVFJfTkFNRV9PTkVSUk9SLCBBVFRSX05BTUVfT05GT0NVUywgQVRUUl9OQU1FX09ORk9STV9DSEFOR0UsIEFUVFJfTkFNRV9PTkZPUk1fSU5QVVQsIEFUVFJfTkFNRV9PTklOVkFMSUQsQVRUUl9OQU1FX09OS0VZUFJFU1MsIEFUVFJfTkFNRV9PTktFWURPV04sIEFUVFJfTkFNRV9PTktFWVVQLCAKLQkJQVRUUl9OQU1FX09OTE9BRCwgQVRUUl9OQU1FX09OTE9BRF9TVEFSVCwgQVRUUl9OQU1FX09OTE9BREVEX0RBVEEsIEFUVFJfTkFNRV9PTkxPQURFRF9NRVRBREFUQSwgQVRUUl9OQU1FX09OTU9VU0VET1dOLCBBVFRSX05BTUVfT05NT1VTRVVQLCBBVFRSX05BTUVfT05NT1VTRU9WRVIsIEFUVFJfTkFNRV9PTk1PVVNFTU9WRSwgQVRUUl9OQU1FX09OTU9VU0VPVVQsIEFUVFJfTkFNRV9PTk1PVVNFX1dIRUVMLCBBVFRSX05BTUVfT05QQVVTRSwgQVRUUl9OQU1FX09OUExBWSwgQVRUUl9OQU1FX09OUExBWUlORywgQVRUUl9OQU1FX09OUFJPR1JFU1MsCi0JCUFUVFJfTkFNRV9PTlJBVEVfQ0hBTkdFLCBBVFRSX05BTUVfT05SRUFEWV9TVEFURV9DSEFOR0UsIEFUVFJfTkFNRV9PTlNDUk9MTCwgQVRUUl9OQU1FX09OU0VFS0VELCBBVFRSX05BTUVfT05TRUVLSU5HLCBBVFRSX05BTUVfT05TRUxFQ1QsIEFUVFJfTkFNRV9PTlNIT1csIEFUVFJfTkFNRV9PTlNUQUxMRUQsIEFUVFJfTkFNRV9PTlNVQk1JVCwgQVRUUl9OQU1FX09OU1VTUEVORCwgQVRUUl9OQU1FX09OVElNRV9VUERBVEUsIEFUVFJfTkFNRV9PTlZPTFVNRV9VUERBVEUsIEFUVFJfTkFNRV9PTldBSVRJTkd9OwotCi0JcHJvdGVjdGVkIEhUTUxBdHRyRGVjbEltcGwgY3JlYXRlKFN0cmluZyBhdHRyTmFtZSkgewotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBudWxsOwotCQlpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQVVUT0ZPQ1VTKSkgewotCQkJLy8gKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCS8vIGJvb2xlYW4gYXR0cmlidXRlIG11c3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBpdHMgbmFtZS4KLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfQVVUT0ZPQ1VTfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQVVUT0ZPQ1VTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ09OVEVOVF9FRElUQUJMRSkpIHsKLQkJCS8vIChjb250ZW50ZWRpdGFibGUgKEVNUFRZfFRSVUV8RkFMU0V8SU5IRVJJVCkgVFJVRSkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfRU1QVFksIEFUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRSwgQVRUUl9WQUxVRV9JTkhFUklUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9UUlVFKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ09OVEVOVF9FRElUQUJMRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NIQUxMRU5HRSkpIHsKLQkJCS8vIChjaGFsbGVuZ2UgQ0RBVEE7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DSEFMTEVOR0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT05URVhUX01FTlUpKSB7Ci0JCQkvLyAoY29udGV4dG1lbnUsIENEQVRBLCBJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT05URVhUX01FTlUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9EUkFHR0FCTEUpKSB7Ci0JCQkvLyAoZHJhZ2dhYmxlIChUUlVFfEZBTFNFfEFVVE8pIFRSVUUpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0UsIEFUVFJfVkFMVUVfQVVUT307Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfRkFMU0UpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9EUkFHR0FCTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GT1JNKSkgewotCQkJLy8gKGZvcm0gQ0RBVEE7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GT1JNLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfS0VZVFlQRSkpIHsKLQkJCS8vIChrZXl0eXBlIENEQVRBOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfS0VZVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xPVykpIHsKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xPVywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hJR0gpKSB7Ci0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ISUdILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT1BUSU1VTSkpIHsKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09QVElNVU0sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NSU4pKSB7Ci0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NSU4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NQVgpKSB7Ci0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PUEVOKSkgewotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKG5ldyBTdHJpbmdbXSB7IEFUVFJfTkFNRV9PUEVOIH0pOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PUEVOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUFVCREFURSkpIHsKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyhuZXcgU3RyaW5nW10geyBBVFRSX05BTUVfUFVCREFURSB9KTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUFVCREFURSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NQRUxMQ0hFQ0spKSB7Ci0JCQkvLyAoc3BlbGxjaGVjayAoRU1QVFl8VFJVRXxGQUxTRSkgVFJVRSkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfRU1QVFksIEFUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfRkFMU0UpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TUEVMTENIRUNLLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05BQk9SVCkpIHsKLQkJCS8vIChvbmFib3J0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OQUJPUlQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OQ0FOX1BMQVkpKSB7Ci0JCQkvLyAob25jYW5wbGF5ICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OQ0FOX1BMQVksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OQ0FOX1BMQVlfVEhST1VHSCkpIHsKLQkJCS8vIChvbmNhbnBsYXl0aHJvdWdoICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OQ0FOX1BMQVlfVEhST1VHSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05DSEFOR0UpKSB7Ci0JCQkvLyAob25jaGFuZ2UgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05DSEFOR0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OQ09OVEVYVF9NRU5VKSkgewotCQkJLy8gKG9uYWNvbnRleHRtZW51ICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OQ09OVEVYVF9NRU5VLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkRSQUcpKSB7Ci0JCQkvLyAob25hZHJhZyAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTkRSQUcsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09ORFJBR19FTkQpKSB7Ci0JCQkvLyAob25kcmFnZW5kICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09ORFJBR19FTkQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09ORFJBR19FTlRFUikpIHsKLQkJCS8vIChvbmRyYWdlbnRlciAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTkRSQUdfRU5URVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09ORFJBR19MRUFWRSkpIHsKLQkJCS8vIChvbmRyYWdsZWF2ZSAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTkRSQUdfTEVBVkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09ORFJBR19PVkVSKSkgewotCQkJLy8gKG9uZHJhZ292ZXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05EUkFHX09WRVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09ORFJBR19TVEFSVCkpIHsKLQkJCS8vIChvbmRyYWdzdGFydCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTkRSQUdfU1RBUlQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09ORFJPUCkpIHsKLQkJCS8vIChvbmRyb3AgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05EUk9QLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkRVUkFUSU9OX0NIQU5HRSkpIHsKLQkJCS8vIChvbmR1cmF0aW9uY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09ORFVSQVRJT05fQ0hBTkdFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkVNUFRJRUQpKSB7Ci0JCQkvLyAob25lbXB0aWVkICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09ORU1QVElFRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05FTkRFRCkpIHsKLQkJCS8vIChvbmVuZGVkICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09ORU5ERUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09ORVJST1IpKSB7Ci0JCQkvLyAob25lcnJvciAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTkVSUk9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkZPQ1VTKSkgewotCQkJLy8gKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05GT0NVUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05GT1JNX0NIQU5HRSkpIHsKLQkJCS8vIChvbmZvcm1jaGFuZ2UgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05GT1JNX0NIQU5HRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05GT1JNX0lOUFVUKSkgewotCQkJLy8gKG9uZm9ybWlucHV0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09ORk9STV9JTlBVVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05JTlBVVCkpIHsKLQkJCS8vIChvbmlucHV0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OSU5QVVQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OSU5WQUxJRCkpIHsKLQkJCS8vIChvbmludmFsaWQgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05JTlZBTElELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkxPQUQpKSB7Ci0JCQkvLyAob25sb2FkICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OTE9BRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05MT0FEX1NUQVJUKSkgewotCQkJLy8gKG9ubG9hZHN0YXJ0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OTE9BRF9TVEFSVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05MT0FERURfREFUQSkpIHsKLQkJCS8vIChvbmxvYWRlZGRhdGEgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05MT0FERURfREFUQSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05MT0FERURfTUVUQURBVEEpKSB7Ci0JCQkvLyAob25sb2FkZWRtZXRhZGF0YSAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTkxPQURFRF9NRVRBREFUQSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05NT1VTRV9XSEVFTCkpIHsKLQkJCS8vIChvbm1vdXNld2hlZWwgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05NT1VTRV9XSEVFTCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05QTEFZKSkgewotCQkJLy8gKG9ucGxheSAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTlBMQVksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OUExBWUlORykpIHsKLQkJCS8vIChvbnBsYXlpbmcgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05QTEFZSU5HLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTlBBVVNFKSkgewotCQkJLy8gKG9ucGF1c2UgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05QQVVTRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05QUk9HUkVTUykpIHsKLQkJCS8vIChvbnByb2dyZXNzICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OUFJPR1JFU1MsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OUkFURV9DSEFOR0UpKSB7Ci0JCQkvLyAob25yYXRlY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OUkFURV9DSEFOR0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OUkVBRFlfU1RBVEVfQ0hBTkdFKSkgewotCQkJLy8gKG9ucmVhZHlzdGF0ZWNoYW5nZSAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTlJFQURZX1NUQVRFX0NIQU5HRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05TQ1JPTEwpKSB7Ci0JCQkvLyAob25zY3JvbGwgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05TQ1JPTEwsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OU0VFS0VEKSkgewotCQkJLy8gKG9uc2Vla2VkICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OU0VFS0VELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTlNFRUtJTkcpKSB7Ci0JCQkvLyAob25zZWVraW5nICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OU0VFS0lORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05TRUxFQ1QpKSB7Ci0JCQkvLyAob25zZWxlY3QgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05TRUxFQ1QsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OU0hPVykpIHsKLQkJCS8vIChvbnNob3cgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05TSE9XLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTlNUQUxMRUQpKSB7Ci0JCQkvLyAob25zdGFsbGVkICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OU1RBTExFRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05TVUJNSVQpKSB7Ci0JCQkvLyAob25zdWJtaXQgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05TVUJNSVQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OU1VTUEVORCkpIHsKLQkJCS8vIChvbnN1c3BlbmQgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05TVVNQRU5ELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTlRJTUVfVVBEQVRFKSkgewotCQkJLy8gKG9udGltZXVwZGF0ZSAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTlRJTUVfVVBEQVRFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTlZPTFVNRV9VUERBVEUpKSB7Ci0JCQkvLyAob252b2x1bWV1cGRhdGUgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05WT0xVTUVfVVBEQVRFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTldBSVRJTkcpKSB7Ci0JCQkvLyAob253YWl0aW5nICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OV0FJVElORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQl9Ci0JCWVsc2UgewotCQkJYXR0ciA9IHN1cGVyLmNyZWF0ZShhdHRyTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JcHVibGljIHZvaWQgZ2V0QXR0cnMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQkvLyAlY29yZWF0dHJzOwotCQlnZXRDb3JlKGRlY2xhcmF0aW9ucyk7Ci0JCS8vICVldmVudHM7Ci0JCWdldEV2ZW50cyhkZWNsYXJhdGlvbnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGdldENvcmUoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQlJdGVyYXRvciBuYW1lcyA9IEFycmF5cy5hc0xpc3QoQ09SRSkuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGdldEV2ZW50cyhDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JCUl0ZXJhdG9yIG5hbWVzID0gQXJyYXlzLmFzTGlzdChFVkVOVFMpLml0ZXJhdG9yKCk7Ci0JCWdldERlY2xhcmF0aW9ucyhkZWNsYXJhdGlvbnMsIG5hbWVzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKFN0cmluZyBlbGVtZW50TmFtZSwgQ01OYW1lZE5vZGVNYXBJbXBsIGF0dHJpYnV0ZXMpIHsKLQkJLyogKHR5cGUgJUlucHV0VHlwZTsgVEVYVCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCQkgKiAodmFsdWUgQ0RBVEEgI0lNUExJRUQpCi0JCSAqIChjaGVja2VkIChjaGVja2VkKSAjSU1QTElFRCkKLQkJICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JCSAqIChyZWFkb25seSAocmVhZG9ubHkpICNJTVBMSUVEKQotCQkgKiAoc2l6ZSBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCSAqIChtYXhsZW5ndGggTlVNQkVSICNJTVBMSUVEKQotCQkgKiAoc3JjICVVUkk7ICNJTVBMSUVEKQotCQkgKiAoYWx0IENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJICogKGFjY2VwdCAlQ29udGVudFR5cGVzOyAjSU1QTElFRCkKLQkJICogKHdpZHRoIENEQVRBOyAjSU1QTElFRCkKLQkJICogKGhlaWdodCBDREFUQTsgI0lNUExJRUQpCi0JCSAqIChhdXRvY29tcGxldGUgQm9vbGVhbjsgI0lNUExJRUQpCi0JCSAqIChhdXRvZm9jdXMgQm9vbGVhbjsgI0lNUExJRUQpCi0JCSAqIChmb3JtIENEQVRBOyAjSU1QTElFRCkKLQkJICogKGZvcm1hY3Rpb24pCi0JCSAqIChmb3JtZW5jdHlwZSkKLQkJICogKGZvcm1tZXRob2QpCi0JCSAqIChmb3Jtbm92YWxpZGF0ZSkKLQkJICogKGZvcm10YXJnZXQpCi0JCSAqIChsaXN0KQotCQkgKiAobWF4KQotCQkgKiAobWluKQotCQkgKiAobXVsdGlwbGUpCi0JCSAqIChwYXR0ZXJuKQotCQkgKiAocGxhY2Vob2xkZXIgQ0RBVEEgI0lNUExJRUQpCi0JCSAqIChyZXF1aXJlZCkKLQkJICogKHN0ZXApCi0JCSAqIGRpc2NvdXJhZ2VkIHRhZ3MgOi0gCi0JCSAqICh1c2VtYXAgJVVSSTsgI0lNUExJRUQpCi0JCSAqIChpc21hcCAoaXNtYXApICNJTVBMSUVEKQotCQkgKi8KLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFscyhIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5QVVQpKXsKLQkJCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQkJLy8gKHR5cGUgJUlucHV0VHlwZTsgVEVYVCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQkvLyBOT1RFOiAlSW5wdXRUeXBlIGlzIEVOVU07Ci0JCQkvLyAodGV4dCB8IHBhc3N3b3JkIHwgY2hlY2tib3ggfCByYWRpbyB8IHN1Ym1pdCB8IHJlc2V0IHwKLQkJCS8vICBmaWxlIHwgaGlkZGVuIHwgaW1hZ2UgfCBidXR0b24KLQkJCS8vICBjb2xvcnwgZGF0ZSB8IHRpbWUgfCBkYXRldGltZSB8IGRhdGV0aW1lLWxvY2FsIHwgbW9udGggfCB3ZWVrfCBlbWFpbHwgCi0JCQkvLyAgbnVtYmVyIHwgcmFuZ2UgfCBzZWFyY2ggfCB0ZWwpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RFWFQsIEFUVFJfVkFMVUVfUEFTU1dPUkQsIEFUVFJfVkFMVUVfQ0hFQ0tCT1gsIEFUVFJfVkFMVUVfUkFESU8sIEFUVFJfVkFMVUVfU1VCTUlULCBBVFRSX1ZBTFVFX1JFU0VULCBBVFRSX1ZBTFVFX0ZJTEUsIEFUVFJfVkFMVUVfSElEREVOLCBBVFRSX1ZBTFVFX0lNQUdFLCBBVFRSX1ZBTFVFX0JVVFRPTiwKLQkJCQkJIEFUVFJfVkFMVUVfQ09MT1IsIEFUVFJfVkFMVUVfREFURSwgQVRUUl9WQUxVRV9EQVRFVElNRSwgQVRUUl9WQUxVRV9EQVRFVElNRV9MT0NBTCwgQVRUUl9WQUxVRV9FTUFJTCwgQVRUUl9WQUxVRV9NT05USCwgQVRUUl9WQUxVRV9OVU1CRVIsIEFUVFJfVkFMVUVfUkFOR0UsIEFUVFJfVkFMVUVfU0VBUkNILCBBVFRSX1ZBTFVFX1RFTCwgQVRUUl9WQUxVRV9USU1FfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCi0JCQkvLyAoc2l6ZSBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9TSVpFLCBhdHRyKTsKLQotCQkJLy8gKGFsdCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FMVCwgYXR0cik7Ci0JCQkKLQkJCQotCQkJLy8gKHR5cGUgJWF1dG9jb21lcGxldGU7ICkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQkvLyBOT1RFOiAlYXV0b2NvbWVwbGV0ZSBpcyBFTlVNOwotCQkJLy8gKG9uIHwgb2ZmKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSBhdXRvQ29tcGxldGVWYWx1ZXMgPSB7QVRUUl9WQUxVRV9PTiwgQVRUUl9WQUxVRV9PRkZ9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyhhdXRvQ29tcGxldGVWYWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BVVRPQ09NUExFVEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9BVVRPQ09NUExFVEUsIGF0dHIpOwotCi0JCQkKLQkJCS8vIChmb3JtIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRk9STSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0ZPUk0sIGF0dHIpOwotCQkJCi0JCQkKLQkJCS8vIChmb3JtYWN0aW9uIFVSSSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GT1JNQUNUSU9OLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfRk9STUFDVElPTiwgYXR0cik7Ci0KLQkJCQotCQkJLy8gKHR5cGUgJWZvcm1tZXRob2Q7IEdFVCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQkvLyBOT1RFOiAlZm9ybW1ldGhvZCBpcyBFTlVNOwotCQkJLy8gKEdFVHxQT1NUfFBVVHxERUxFVEUpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIGZvcm1NZXRob2RWYWx1ZXMgPSB7QVRUUl9WQUxVRV9HRVQsIEFUVFJfVkFMVUVfUE9TVCwgQVRUUl9WQUxVRV9QVVQsIEFUVFJfVkFMVUVfREVMRVRFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXMoZm9ybU1ldGhvZFZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfR0VUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRk9STU1FVEhPRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0ZPUk1NRVRIT0QsIGF0dHIpOwotCi0JCQkvLyAodHlwZSAlZm9ybWVuY3R5cGU7IEdFVCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQkvLyBOT1RFOiAlZm9ybWVuY3R5cGUgaXMgRU5VTTsKLQkJCS8vIChhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWR8IG11bHRpcGFydC9mb3JtLWRhdGF8IHRleHQvcGxhaW4pCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIGZvcm1FbmNUeXBlVmFsdWVzID0ge0FUVFJfVkFMVUVfV1dXX0ZPUk1fVVJMRU5DT0RFRCwgQVRUUl9WQUxVRV9GT1JNX0RBVEEsIEFUVFJfVkFMVUVfUExBSU59OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyhmb3JtRW5jVHlwZVZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfV1dXX0ZPUk1fVVJMRU5DT0RFRCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0ZPUk1FTkNUWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfRk9STUVOQ1RZUEUsIGF0dHIpOwotCi0JCQkvLyAoZm9ybXRhcmdldCBCUk9XU0VJTkcgQ09OVEVYVCAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQlJPV1NJTkdfQ09OVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0ZPUk1UQVJHRVQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9GT1JNVEFSR0VULCBhdHRyKTsKLQkJCQotCQkJLy8gKGZvcm10bm92YWxpZGF0ZSAgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCS8vIGJvb2xlYW4gYXR0cmlidXRlIG11c3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBpdHMgbmFtZS4KLQkJCVN0cmluZ1tdIGZvcm1Ob1ZhbGlkYXRlVmFsdWVzID0ge0FUVFJfTkFNRV9GT1JNTk9WQUxJREFURX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKGZvcm1Ob1ZhbGlkYXRlVmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRk9STU5PVkFMSURBVEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9GT1JNTk9WQUxJREFURSwgYXR0cik7Ci0KLQkJCi0JCQkvLyAobGlzdCBJRCAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5JRCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xJU1QsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9MSVNULCBhdHRyKTsKLQotCQkJLy8gKG1pbiBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01JTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX01JTiwgYXR0cik7Ci0KLQkJCS8vIChtYXggQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9NQVgsIGF0dHIpOwotCi0JCQkvLyAobWF4bGVuZ3RoIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVhMRU5HVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9NQVhMRU5HVEgsIGF0dHIpOwotCi0JCQkvLyAobXVsdGlwbGUgICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQkvLyBib29sZWFuIGF0dHJpYnV0ZSBtdXN0IGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgaXRzIG5hbWUuCi0JCQlTdHJpbmdbXSBtdWx0aXBsZVZhbHVlcyA9IHtBVFRSX05BTUVfTVVMVElQTEV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyhtdWx0aXBsZVZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01VTFRJUExFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTVVMVElQTEUsIGF0dHIpOwotCi0JCQotCQkJLy8gKHN0ZXAgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TVEVQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfU1RFUCwgYXR0cik7Ci0KLQkJCS8vIChwbGFjZWhvbGRlciBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1BMQUNFSE9MREVSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfUExBQ0VIT0xERVIsIGF0dHIpOwotCi0JCQkvLyAocGF0dGVybiBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1BBVFRFUk4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QQVRURVJOLCBhdHRyKTsKLQotCQkJLy8gKHJlcXVpcmVkICAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJLy8gYm9vbGVhbiBhdHRyaWJ1dGUgbXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGl0cyBuYW1lLgotCQkJU3RyaW5nW10gcmVxdWlyZWRWYWx1ZXMgPSB7QVRUUl9OQU1FX1JFUVVJUkVEfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXMocmVxdWlyZWRWYWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9SRVFVSVJFRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1JFUVVJUkVELCBhdHRyKTsKLQotCQkJU3RyaW5nW10gbmFtZXMgPSB7QVRUUl9OQU1FX05BTUUsIEFUVFJfTkFNRV9WQUxVRSwgQVRUUl9OQU1FX0NIRUNLRUQsIEFUVFJfTkFNRV9ESVNBQkxFRCwgQVRUUl9OQU1FX1JFQURPTkxZLCBBVFRSX05BTUVfU0laRSwgQVRUUl9OQU1FX01BWExFTkdUSCwgQVRUUl9OQU1FX1NSQywgQVRUUl9OQU1FX0FMVCwgQVRUUl9OQU1FX0FDQ0VQVCwgLy88PEQyMTU2ODQKLQkJCQkJCUFUVFJfTkFNRV9XSURUSCwgQVRUUl9OQU1FX0hFSUdIVCwJCQkvLzxEMjE1Njg0Ci0JCQkJLy9odG1sNQotCQkJCQkJQVRUUl9OQU1FX0FVVE9GT0NVUwotCQkJfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJCS8vZGlzY291cmFnZWQKLQkJCS8vIChpc21hcCAoaXNtYXApICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSBpc21hcFZhbHVlcyA9IHtBVFRSX05BTUVfSVNNQVB9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyhpc21hcFZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0lTTUFQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyLm9ic29sZXRlKHRydWUpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lTTUFQLCBhdHRyKTsKLQkJCQotCQkJLy8gKHVzZW1hcCAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1VTRU1BUCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0ci5vYnNvbGV0ZSh0cnVlKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9VU0VNQVAsIGF0dHIpOwotCi0JCQkKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJfQotCQkvKiAoaHJlZiAlVVJJOyAjSU1QTElFRCkKLQkJICogKGhyZWZsYW5nICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEKQotCQkgKiAodHlwZSAlQ29udGVudFR5cGU7ICNJTVBMSUVEKTogc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJICogKHJlbCAlTGlua1R5cGVzOyAjSU1QTElFRCkKLQkJICogKG1lZGlhICVNZWRpYURlc2M7ICNJTVBMSUVEKQotCQkgKiAvLyBkaXNjb3VyYWdlZAotCQkgKiAoY2hhcnNldCAlQ2hhcnNldDsgI0lNUExJRUQpCi0JCSAqIChyZXYgJUxpbmtUeXBlczsgI0lNUExJRUQpCi0JCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkJICovCi0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTElOSykpewotCQkJU3RyaW5nW10gbmFtZXMgPSB7IEFUVFJfTkFNRV9UWVBFLCBBVFRSX05BTUVfSFJFRiwgQVRUUl9OQU1FX0hSRUZMQU5HLCBBVFRSX05BTUVfUkVMLCAgQVRUUl9OQU1FX01FRElBfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkJLy8gKHNpemVzICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NJWkVTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfU0laRVMsIGF0dHIpOwotCQkJCi0JCQkvL2Rpc2NvdXJhZ2VkCi0JCQkvLyAoY2hhcnNldCAlQ2hhcnNldDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ0hBUlNFVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NIQVJTRVQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHIub2Jzb2xldGUodHJ1ZSk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQ0hBUlNFVCwgYXR0cik7Ci0JCQkKLQkJCS8vIChyZXYgJUxpbmtUeXBlczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTElOS19UWVBFUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1JFViwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0ci5vYnNvbGV0ZSh0cnVlKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9SRVYsIGF0dHIpOwotCQkJCi0JCQkvLyAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuRlJBTUVfVEFSR0VUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVEFSR0VULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyLm9ic29sZXRlKHRydWUpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1RBUkdFVCwgYXR0cik7Ci0JCQkKLQkJfQotCQkvKiAodHlwZSAlQ29udGVudFR5cGU7ICNJTVBMSUVEKQotCQkgKiAoaHJlZiAlVVJJOyAjSU1QTElFRCkKLQkJICogKGhyZWZsYW5nICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEKQotCQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JCSAqIChyZWwgJUxpbmtUeXBlczsgI0lNUExJRUQpCi0JCSAqIChtZWRpYSAlbWVkaWFfZGVzYzsgI0lNUExJRUQKLQkJICogLy9kaXNjb3VyYWdlZAotCQkgKiAoY2hhcnNldCAlQ2hhcnNldDsgI0lNUExJRUQpCi0JCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCQkgKiAocmV2ICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCQkgKiAoZGlyZWN0a2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCQkgKiAoc2hhcGUgJVNoYXBlOyByZWN0KQotCQkgKiAoY29vcmRzICVDb29yZHM7ICNJTVBMSUVEKQotCQkgKi8KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BKSl7Ci0JCQlTdHJpbmdbXSBuYW1lcyA9IHsgQVRUUl9OQU1FX01FRElBLCBBVFRSX05BTUVfVFlQRSwgQVRUUl9OQU1FX0hSRUYsIEFUVFJfTkFNRV9IUkVGTEFORywgQVRUUl9OQU1FX1JFTCwgQVRUUl9OQU1FX1RBUkdFVH07Ci0JCQlnZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCQkKLQkJCQotCQkJLy9kaXNjb3VyYWdlZAotCQkJLy8gKGNoYXJzZXQgJUNoYXJzZXQ7ICNJTVBMSUVEKQotCQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DSEFSU0VUKTsKLQkJCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DSEFSU0VULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyLm9ic29sZXRlKHRydWUpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0NIQVJTRVQsIGF0dHIpOwotCQkJCi0JCQkvLyAocmV2ICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxJTktfVFlQRVMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9SRVYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHIub2Jzb2xldGUodHJ1ZSk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfUkVWLCBhdHRyKTsKLQkJCQotCQkJLy8gKGRpcmVjdGtleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DSEFSQUNURVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ESVJFQ1RLRVksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHIub2Jzb2xldGUodHJ1ZSk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfRElSRUNUS0VZLCBhdHRyKTsKLQkJCQotCQkJLy8gKHNoYXBlICVTaGFwZTsgcmVjdCk6ICVTaGFwZTsgaXMgKHJlY3R8Y2lyY2xlfHBvbHl8ZGVmYXVsdCkuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1JFQ1QsIEFUVFJfVkFMVUVfQ0lSQ0xFLCBBVFRSX1ZBTFVFX1BPTFksIEFUVFJfVkFMVUVfREVGQVVMVH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfUkVDVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NIQVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyLm9ic29sZXRlKHRydWUpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1NIQVBFLCBhdHRyKTsKLQkJCQotCQkJLy8gKGNvb3JkcyAlQ29vcmRzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT09SRFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT09SRFMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHIub2Jzb2xldGUodHJ1ZSk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQ09PUkRTLCBhdHRyKTsKLQkJCQotCQkJLy8gKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX05BTUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHIub2Jzb2xldGUodHJ1ZSk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYXR0cik7Ci0JCi0JCX0KLQkJLyoKLQkJICogKHNoYXBlICVTaGFwZTsgcmVjdCkKLQkJICogKGNvb3JkcyAlQ29vcmRzOyAjSU1QTElFRCkKLQkJICogKGhyZWYgJVVSSTsgI0lNUExJRUQpCi0JCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkJICogKGFsdCAlVGV4dDsgI1JFUVVJUkVEKQotCQkgKiAobWVkaWEgJW1lZGlhX2Rlc2M7ICNJTVBMSUVEKQotCQkgKiAocmVsICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCQkgKiAodHlwZSAlQ29udGVudFR5cGU7ICNJTVBMSUVEKQotCQkgKiAvL2Rpc29jdXJhZ2VkCi0JCSAqIChub2hyZWYgKG5vaHJlZikgI0lNUExJRUQpCi0JCSAqLwotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFSRUEpKXsKLQkJCS8vIChtZWRpYSAlTWVkaWFEZXNjOyAjSU1QTElFRCkKLQkJCVN0cmluZ1tdIG5hbWVzID0ge0FUVFJfTkFNRV9UWVBFLCBBVFRSX05BTUVfTUVESUEsIEFUVFJfTkFNRV9TSEFQRSwgQVRUUl9OQU1FX0NPT1JEUywgQVRUUl9OQU1FX0hSRUYsIEFUVFJfTkFNRV9IUkVGTEFORywgQVRUUl9OQU1FX1RBUkdFVCwgQVRUUl9OQU1FX0FMVCwgQVRUUl9OQU1FX1JFTH07Ci0JCQlnZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCQkKLQkJCS8vIChub2hyZWYgKG5vaHJlZikgI0lNUExJRUQpCi0JCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX05PSFJFRn07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTk9IUkVGLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyLm9ic29sZXRlKHRydWUpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05PSFJFRiwgYXR0cik7Ci0JCQotCQl9Ci0JCS8qCi0JCSAqICAlZ2xvYmFsYXR0cnM7Ci0JCSAqIChodHRwLWVxdWl2IE5BTUUgI0lNUExJRUQpCi0JCSAqIChuYW1lIE5BTUUgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkgKiAoY29udGVudCBDREFUQSAjUkVRVUlSRUQpCi0JCSAqIChjaGFyc2V0ICVDaGFyc2V0OyAjSU1QTElFRCkKLQkJICogIC8vZGlzY291cmFnZWQKLQkJICogKHNjaGVtZSBDREFUQSAjSU1QTElFRCkKLQkJICovCi0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVUQSkpewotCQkJLy8gZ2xvYmFsYXR0cnM7Ci0JCQlnZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkJLy8gKG5hbWUgTkFNRSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk5BTUUpOwotCQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX05BTUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OQU1FLCBhdHRyKTsKLQotCQkJLy8gKGNvbnRlbnQgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPTlRFTlQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9DT05URU5ULCBhdHRyKTsKLQkJCQotCQkJU3RyaW5nW10gbmFtZXMgPSB7QVRUUl9OQU1FX0hUVFBfRVFVSVYsIEFUVFJfTkFNRV9DSEFSU0VUfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJCQotCQkJLy8gZGlzY291cmFnZWQKLQkJCS8vIChzY2hlbWUgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NDSEVNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0ci5vYnNvbGV0ZSh0cnVlKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9TQ0hFTUUsIGF0dHIpOwotCQkJCi0JCX0KLQkJLyoKLQkJICogKHNyYyAlVVJJOyAjUkVRVUlSRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkgKiAoYWx0ICVUZXh0OyAjUkVRVUlSRUQpCi0JCSAqICh1c2VtYXAgJVVSSTsgI0lNUExJRUQpCi0JCSAqIChpc21hcCAoaXNtYXApICNJTVBMSUVEKQotCQkgKiAgLy8gZGlzY291cmFnZWQKLQkJICogKGxvbmdkZXNjICVVUkk7ICNJTVBMSUVEKQotCQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkJICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkJICogKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCQkgKiAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkgKiAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCQkgKiAoaHNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCQkgKiAodnNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCQkgKiAobWFwZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkgCi0JCSAqLwotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklNRykpewotCQkJLy8gKHNyYyAlVVJJOyAjUkVRVUlSRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQkJCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TUkMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9TUkMsIGF0dHIpOwotCi0JCQlTdHJpbmdbXSBuYW1lcyA9IHtBVFRSX05BTUVfQUxULCBBVFRSX05BTUVfTE9OR0RFU0MsIEFUVFJfTkFNRV9OQU1FLCBBVFRSX05BTUVfSEVJR0hULCBBVFRSX05BTUVfV0lEVEgsIEFUVFJfTkFNRV9VU0VNQVAsIEFUVFJfTkFNRV9JU01BUCwgQVRUUl9OQU1FX0JPUkRFUiwgQVRUUl9OQU1FX0hTUEFDRSwgQVRUUl9OQU1FX1ZTUEFDRSwgQVRUUl9OQU1FX01BUEZJTEV9OwotCQkJZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCQkvLyBhbGlnbiAobG9jYWwpOyBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkJYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JJbWFnZSgpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQkJCi0JCX0KLQkJLyoKLQkJICogKG5hbWUgQ0RBVEEgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJICogKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCQkgKiBnbG9iYWwgYXR0cmlidXRlcwotCQkgKi8KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTSkpewotCQkJCi0JCQkvLyAobmFtZSBDREFUQSAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OQU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYXR0cik7Ci0JCQkKLQkJCS8vICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkFMVUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9WQUxVRSwgYXR0cik7Ci0JCQkKLQkJCS8vIGdsb2FibCBhdHRycwotCQkJZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCX0KLQkJLyoKLQkJICogKGF1dG9mb2N1cyBCb29sZWFuOyAjSU1QTElFRCkKLQkJICogKGZvcm0gQ0RBVEE7ICNJTVBMSUVEKQotCQkgKiAocGxhY2Vob2xkZXIgQ0RBVEEgI0lNUExJRUQpCi0JCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCQkgKiAocm93cyBOVU1CRVIgI1JFUVVJUkVEKQotCQkgKiAoY29scyBOVU1CRVIgI1JFUVVJUkVEKQotCQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkJICogKHJlYWRvbmx5IChyZWFkb25seSkgI0lNUExJRUQpCi0JCSAqIChtYXhsZW5ndGggTlVNQkVSOyAjSU1QTElFRCkKLQkJICogKHdyYXAgRU5VTTsgI0lNUExJRUQpCi0JCSAqICAvL2Rpc2NvdXJhZ2VkCi0JCSAqIChpc3R5bGUgQ0RBVEEgI0lNUExJRUQpCi0JCSAqLwotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRFWFRBUkVBKSl7Ci0JCQlTdHJpbmdbXSBuYW1lcyA9IHtBVFRSX05BTUVfTUFYTEVOR1RILCBBVFRSX05BTUVfRk9STSwgQVRUUl9OQU1FX0FVVE9GT0NVUywgQVRUUl9OQU1FX05BTUUsIEFUVFJfTkFNRV9ST1dTLCBBVFRSX05BTUVfQ09MUywgQVRUUl9OQU1FX0RJU0FCTEVELCBBVFRSX05BTUVfUkVBRE9OTFl9OwotCQkJZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCQkJCi0JCQkvLyAocGxhY2Vob2xkZXIgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9QTEFDRUhPTERFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1BMQUNFSE9MREVSLCBhdHRyKTsKLQkJCQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9TT0ZULCBBVFRSX1ZBTFVFX0hBUkR9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1NPRlQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9XUkFQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfV1JBUCwgYXR0cik7Ci0JCQkKLQkJCS8vIGRpc2NvdXJhZ2VkCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0lTVFlMRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0ci5vYnNvbGV0ZSh0cnVlKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JU1RZTEUsIGF0dHIpOwotCQl9Ci0JCS8qCi0JCSAqIChjaGFyc2V0ICVDaGFyc2V0OyAjSU1QTElFRCkKLQkJICogKHR5cGUgJUNvbnRlbnRUeXBlOyAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkgKiAoYXN5bmNoIGJvb2xlYW4gI0lNUExJRUQpCi0JCSAqIChzcmMgJVVSSTsgI0lNUExJRUQpCi0JCSAqIChkZWZlciAoZGVmZXIpICNJTVBMSUVEKQotCQkgKiAgLy8gZGlzY291cmFnZWQKLQkJICogKGxhbmd1YWdlIENEQVRBICNJTVBMSUVEKQotCQkgKiAoZXZlbnQgQ0RBVEEgI0lNUExJRUQpCi0JCSAqIChmb3IgJVVSSTsgI0lNUExJRUQpCi0JCSAqLwotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVCkpewotCQkJU3RyaW5nW10gbmFtZXMgPSB7QVRUUl9OQU1FX0NIQVJTRVQsICBBVFRSX05BTUVfU1JDLCBBVFRSX05BTUVfREVGRVJ9OwotCQkJZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCQkvLyAodHlwZSAlQ29udGVudFR5cGU7ICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsICJ0ZXh0L2phdmFzY3JpcHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQkJCQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX0FTWU5DfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQVNZTkMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9BU1lOQywgYXR0cik7Ci0JCQkKLQkJCQotCQkJLy8gZGlzY291cmFnZWQKLQkJCS8vIChsYW5ndWFnZSAlQ0RBVEE7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9MQU5HVUFHRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0ci5vYnNvbGV0ZSh0cnVlKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9MQU5HVUFHRSwgYXR0cik7Ci0JCQkKLQkJCS8vIChldmVudCBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRVZFTlQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHIub2Jzb2xldGUodHJ1ZSk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfRVZFTlQsIGF0dHIpOwotCQkJCi0JCQkvLyAoZm9yICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRk9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyLm9ic29sZXRlKHRydWUpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0ZPUiwgYXR0cik7Ci0JCQotCQl9Ci0JCS8qCi0JCSAqICAlYXR0cnM7Ci0JCSAqICh0eXBlICVDb250ZW50VHlwZTsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJICogKG1lZGlhICVNZWRpYURlc2M7ICNJTVBMSUVEKQotCQkgKiAoc2NvcGVkIGJvb2xlYW47ICNpbXBsaWVkKQotCQkgKi8KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSkpewotCQkJLy8gJWkxOG47Ci0JCQlnZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkJU3RyaW5nW10gbmFtZXMgPSB7QVRUUl9OQU1FX01FRElBfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJCS8vICh0eXBlICVDb250ZW50VHlwZTsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09OVEVOVF9UWVBFKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgInRleHQvY3NzIik7IC8vJE5PTi1OTFMtMSQKLQkJCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0JCQkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9TQ09QRUR9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TQ09QRUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9TQ09QRUQsIGF0dHIpOwotCQl9Ci0JCS8qCi0JCSAqICVyZXNlcnZlZDsKLQkJICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JCSAqIChzaXplIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCSAqIChtdWx0aXBsZSAobXVsdGlwbGUpICNJTVBMSUVEKQotCQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkJICogKGF1dG9mb2N1cyBCb29sZWFuOyAjSU1QTElFRCkKLQkJICogKGZvcm0gQ0RBVEE7ICNJTVBMSUVEKQotCQkgKi8KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TRUxFQ1QpKXsKLQkJCS8vIChzaXplIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfU0laRSwgYXR0cik7Ci0KLQkJCVN0cmluZ1tdIG5hbWVzID0ge0FUVFJfTkFNRV9GT1JNLCBBVFRSX05BTUVfQVVUT0ZPQ1VTLEFUVFJfTkFNRV9OQU1FLCBBVFRSX05BTUVfTVVMVElQTEUsIEFUVFJfTkFNRV9ESVNBQkxFRCwgQVRUUl9OQU1FX1RBQklOREVYLCBBVFRSX05BTUVfT05GT0NVUywgQVRUUl9OQU1FX09OQkxVUiwgQVRUUl9OQU1FX09OQ0hBTkdFfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJCi0JCX0KLQkJLyoKLQkJICogKHZhbHVlIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCSAqICAvL2Rpc2NvdXJhZ2VkCi0JCSAqICAodHlwZSAlTElTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkgKi8KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSSkpewotCQkJLy8gKHR5cGUgJUxJU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTElfU1RZTEUpOwotCQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHIub2Jzb2xldGUodHJ1ZSk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0KLQkJCS8vICh2YWx1ZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkFMVUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9WQUxVRSwgYXR0cik7Ci0JCQotCQl9Ci0JCS8qCi0JCSAqIChzdGFydCBOVU1CRVIgI0lNUExJRUQpCi0JCSAqIChyZXZlcnNlZCBCT09MRUFOOyBJTVBMSUVEKQotCQkgKiAgIC8vZGlzY291cmFnZWQKLQkJICogKHR5cGUgJU9MU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJICogKGNvbXBhY3QgKGNvbXBhY3QpICNJTVBMSUVEKQotCQkgKi8KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTCkpewotCi0JCQlTdHJpbmdbXSBuYW1lcyA9IHsgQVRUUl9OQU1FX1NUQVJUfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJCQotCQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9SRVZFUlNFRH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUkVWRVJTRUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9SRVZFUlNFRCwgYXR0cik7Ci0JCQkKLQkJCS8vZGlzY291cmFnZWQgCi0JCQkvLyAodHlwZSAlT0xTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk9MX1NUWUxFKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0ci5vYnNvbGV0ZSh0cnVlKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQkJCQotCQkJLy8gKGNvbXBhY3QgKGNvbXBhY3QpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSBjb21wYWN0VmFsdWVzID0ge0FUVFJfTkFNRV9DT01QQUNUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXMoY29tcGFjdFZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPTVBBQ1QsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHIub2Jzb2xldGUodHJ1ZSk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQ09NUEFDVCwgYXR0cik7Ci0JCX0KLQkJLyoqCi0JCSAqICVhdHRyczsKLQkJICogKHNyYyAlVVJJOyAjSU1QTElFRCkKLQkJICogKHNyY2RvYyAlQ09OVEVOVF9UWVBFOyAjSU1QTElFRCkKLQkJICogKHNlYW1sZXNzIEJPT0xFQU47ICNJTVBMSUVEKQotCQkgKiAoc2FuZGJveCBDREFUQTsgI0lNUExFRCkKLQkJICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkJICogKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkJICogLy9kaXNjb3VyYWdlZAotCQkgKiAobG9uZ2Rlc2MgJVVSSTsgI0lNUExJRUQpCi0JCSAqIChmcmFtZWJvcmRlciAoMXwwKSAxKQotCQkgKiAobWFyZ2lud2lkdGggJVBpeGVsczsgI0lNUExJRUQpCi0JCSAqIChtYXJnaW5oZWlnaHQgJVBpeGVsczsgI0lNUExJRUQpCi0JCSAqIChzY3JvbGxpbmcgKHllc3xub3xhdXRvKSBhdXRvKQotCQkgKiAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkgKi8KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JRlJBTUUpKXsKLQkJCS8vICVhdHRyczsKLQkJCWdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkJCi0JCQkvL3NyY2RvYwotCQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NSQ0RPQywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1NSQ0RPQywgYXR0cik7Ci0KLQkJCS8vIChzZWFtbGVzcyAoc2VhbWxlc3MpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSBjb21wYWN0VmFsdWVzID0ge0FUVFJfTkFNRV9TRUFNTEVTU307Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKGNvbXBhY3RWYWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TRUFNTEVTUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1NFQU1MRVNTLCBhdHRyKTsKLQkJCi0JCQkvL3NhbmRib3gKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0FOREJPWCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1NBTkRCT1gsIGF0dHIpOwotCQkJCi0JCQkKLQkJCVN0cmluZ1tdIG5hbWVzID0geyBBVFRSX05BTUVfTkFNRSwgQVRUUl9OQU1FX1NSQywgQVRUUl9OQU1FX0hFSUdIVCwgQVRUUl9OQU1FX1dJRFRIfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkJLy9kaXNjb3VyYWdlZAotCQkJLy8gKG1hcmdpbndpZHRoICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01BUkdJTldJRFRILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyLm9ic29sZXRlKHRydWUpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX01BUkdJTldJRFRILCBhdHRyKTsKLQkJCQotCQkJLy8gKG1hcmdpbmhlaWdodCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVJHSU5IRUlHSFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHIub2Jzb2xldGUodHJ1ZSk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTUFSR0lOSEVJR0hULCBhdHRyKTsKLQkJCQotCQkJLy8gKHNjcm9sbGluZyAoeWVzfG5vfGF1dG8pIGF1dG8pCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1lFUywgQVRUUl9WQUxVRV9OTywgQVRUUl9WQUxVRV9BVVRPfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9BVVRPKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0NST0xMSU5HLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyLm9ic29sZXRlKHRydWUpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1NDUk9MTElORywgYXR0cik7Ci0KLQkJCS8vIChmcmFtZWJvcmRlciAoMXwwKSAxKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSBmcmFtZVZhbHVlcyA9IHtBVFRSX1ZBTFVFXzEsIEFUVFJfVkFMVUVfMH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKGZyYW1lVmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV8xKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRlJBTUVCT1JERVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHIub2Jzb2xldGUodHJ1ZSk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfRlJBTUVCT1JERVIsIGF0dHIpOwotCQkJCi0JCQkvLyAobG9uZ2Rlc2MgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9MT05HREVTQywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0ci5vYnNvbGV0ZSh0cnVlKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9MT05HREVTQywgYXR0cik7Ci0JCQkKLQkJCQotCQkJLy8gYWxpZ24KLQkJCWF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9ySW1hZ2UoKTsKLQkJCWlmIChhdHRyICE9IG51bGwpCi0JCQkJYXR0ci5vYnNvbGV0ZSh0cnVlKTsKLQkJCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCQl9Ci0JCS8qCi0JCSAqICglYXR0cnMpCi0JCSAqIChtYW5pc2Zlc3QgJVVSSTsgI0lNUExJRUQpCi0JCSAqICh4bWxucyAlVVJJOyAjSU1QTElFRCkKLQkJICogLy9kaXNjb3VyYWdlZAotCQkgKiAodmVyc2lvbiBDREFUQSAjRklYRUQgJyVIVE1MLlZlcnNpb247KQotCQkgKi8KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MKSl7Ci0JCQkvLyAlYXR0cnM7Ci0JCQlnZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJCS8vIChtYW5pc2Zlc3QgJVVSSTsgI0lNUExJRUQpCi0JCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQU5JRkVTVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX01BTklGRVNULCBhdHRyKTsKLQkJCQotCQkJLy8gKHZlcnNpb24gQ0RBVEEgI0ZJWEVEICclSFRNTC5WZXJzaW9uOykKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfRklYRUQsIEFUVFJfVkFMVUVfVkVSU0lPTl9UUkFOU0lUSU9OQUwpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WRVJTSU9OLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5GSVhFRCk7Ci0JCQlhdHRyLm9ic29sZXRlKHRydWUpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1ZFUlNJT04sIGF0dHIpOwotCQkJCi0JCQkvLyAoeG1sbnMgQ0RBVEEgI0ZJWEVEICcleG1sbnM7KQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfWE1MTlMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9YTUxOUywgYXR0cik7Ci0JCX0KLQkJLyoKLQkJICogKHR5cGUgZW51bTsgKGNvbnRleHQgfCB0b29sYmFyIHwgbGlzdCkpCi0JCSAqIChsYWJlbCAlVGV4dDsgI0lNUExJRUQpCi0JCSAqICAvL2Rpc2NvdXJhZ2VkCi0JCSAqIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkgCSAqLwotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlUpKXsKLQkJCS8vICh0eXBlICVtZW51VHlwZTsgbGlzdCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkgaXMgRU5VTS4KLQkJCS8vICAoY29udGV4dCB8IHRvb2xiYXIgfCBsaXN0KQotCQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfQ09OVEVYVCwgQVRUUl9WQUxVRV9UT09MQkFSLCBBVFRSX1ZBTFVFX0xJU1R9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0xJU1QpOwotCQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQotCQkJLy8gKGxhYmVsICVUZXh0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTEFCRUwsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9MQUJFTCwgYXR0cik7Ci0KLQkJCS8vIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gY29tcGFjdFZhbHVlcyA9IHtBVFRSX05BTUVfQ09NUEFDVH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKGNvbXBhY3RWYWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT01QQUNULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyLm9ic29sZXRlKHRydWUpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0NPTVBBQ1QsIGF0dHIpOwotCQl9Ci0JCS8qCi0JCSAqICh0eXBlICVidXR0b247IFRFWFQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkJICogKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkJICogKGF1dG9mb2N1cyBCb29sZWFuOyAjSU1QTElFRCkKLQkJICogKGZvcm0gQ0RBVEE7ICNJTVBMSUVEKQotCQkgKiAoZm9ybWFjdGlvbikKLQkJICogKGZvcm1lbmN0eXBlKQotCQkgKiAoZm9ybW1ldGhvZCkKLQkJICogKGZvcm1ub3ZhbGlkYXRlKQotCQkgKiAoZm9ybXRhcmdldCkKLQkJICovCi0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OKSl7Ci0JCQkvLyAodHlwZSAoYnV0dG9ufHN1Ym1pdHxyZXNldCkgc3VibWl0KSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0JVVFRPTiwgQVRUUl9WQUxVRV9TVUJNSVQsIEFUVFJfVkFMVUVfUkVTRVR9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQkJCQotCi0JCQlTdHJpbmdbXSBuYW1lcyA9IHtBVFRSX05BTUVfTkFNRSwgQVRUUl9OQU1FX1ZBTFVFLCBBVFRSX05BTUVfRElTQUJMRUQsCi0JCQkJLy9odG1sNQotCQkJCQkJQVRUUl9OQU1FX0FVVE9GT0NVUwotCQkJfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJCQotCQkJLy8gKGZvcm0gQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GT1JNLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfRk9STSwgYXR0cik7Ci0JCQkKLQkJCQotCQkJLy8gKGZvcm1hY3Rpb24gVVJJICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0ZPUk1BQ1RJT04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9GT1JNQUNUSU9OLCBhdHRyKTsKLQotCQkJCi0JCQkvLyAodHlwZSAlZm9ybW1ldGhvZDsgR0VUKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJCS8vIE5PVEU6ICVmb3JtbWV0aG9kIGlzIEVOVU07Ci0JCQkvLyAoR0VUfFBPU1R8UFVUfERFTEVURSkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gZm9ybU1ldGhvZFZhbHVlcyA9IHtBVFRSX1ZBTFVFX0dFVCwgQVRUUl9WQUxVRV9QT1NULCBBVFRSX1ZBTFVFX1BVVCwgQVRUUl9WQUxVRV9ERUxFVEV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyhmb3JtTWV0aG9kVmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9HRVQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GT1JNTUVUSE9ELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfRk9STU1FVEhPRCwgYXR0cik7Ci0KLQkJCS8vICh0eXBlICVmb3JtZW5jdHlwZTsgR0VUKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJCS8vIE5PVEU6ICVmb3JtZW5jdHlwZSBpcyBFTlVNOwotCQkJLy8gKGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZHwgbXVsdGlwYXJ0L2Zvcm0tZGF0YXwgdGV4dC9wbGFpbikKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gZm9ybUVuY1R5cGVWYWx1ZXMgPSB7QVRUUl9WQUxVRV9XV1dfRk9STV9VUkxFTkNPREVELCBBVFRSX1ZBTFVFX0ZPUk1fREFUQSwgQVRUUl9WQUxVRV9QTEFJTn07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKGZvcm1FbmNUeXBlVmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9XV1dfRk9STV9VUkxFTkNPREVEKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRk9STUVOQ1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9GT1JNRU5DVFlQRSwgYXR0cik7Ci0KLQkJCS8vIChmb3JtdGFyZ2V0IEJST1dTRUlORyBDT05URVhUICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5CUk9XU0lOR19DT05URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRk9STVRBUkdFVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0ZPUk1UQVJHRVQsIGF0dHIpOwotCQkJCi0JCQkvLyAoZm9ybXRub3ZhbGlkYXRlICAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJLy8gYm9vbGVhbiBhdHRyaWJ1dGUgbXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGl0cyBuYW1lLgotCQkJU3RyaW5nW10gZm9ybU5vVmFsaWRhdGVWYWx1ZXMgPSB7QVRUUl9OQU1FX0ZPUk1OT1ZBTElEQVRFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXMoZm9ybU5vVmFsaWRhdGVWYWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GT1JNTk9WQUxJREFURSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0ZPUk1OT1ZBTElEQVRFLCBhdHRyKTsKLQotCQl9Ci0JCS8qCi0JCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkJICogKGZvcm0gQ0RBVEE7ICNJTVBMSUVEKQotCQkgKi8KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GSUVMRFNFVCkpewotCQkJLy8gKGZvcm0gQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GT1JNLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfRk9STSwgYXR0cik7Ci0JCQkKLQkJCVN0cmluZ1tdIG5hbWVzID0ge0FUVFJfTkFNRV9OQU1FLCBBVFRSX05BTUVfRElTQUJMRUQgfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJCQkKLQkJfQotCQkvKgotCQkgKiAoc3VtbWFyeSAlVGV4dDsgI0lNUExJRUQpCi0JCSAqICAvL2Rpc2NvdXJhZ2VkCi0JCSAqICVyZXNlcnZlZDsKLQkJICogKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCQkgKiAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCQkgKiAoZnJhbWUgJVRGcmFtZTsgI0lNUExJRUQpCi0JCSAqIChydWxlcyAlVFJ1bGVzOyAjSU1QTElFRCkKLQkJICogKGNlbGxzcGFjaW5nICVMZW5ndGg7ICNJTVBMSUVEKQotCQkgKiAoY2VsbHBhZGRpbmcgJUxlbmd0aDsgI0lNUExJRUQpCi0JCSAqIChhbGlnbiAlVEFsaWduOyAjSU1QTElFRCkKLQkJICogKGJnY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkJICogKGRhdGFwYWdlc2l6ZSBDREFUQSAjSU1QTElFRCkKLQkJICogKGhlaWdodCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJICogKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JCSAqIChib3JkZXJjb2xvciAlQ29sb3IgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JCSAqLwotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFKSl7Ci0JCQkvLyAlcmVzZXJ2ZWQ7Ci0JCQkvLyAuLi4gJXJlc2VydmVkOyBpcyBlbXB0eSBpbiB0aGUgY3VycmVudCBEVEQuCi0KLQkJCVN0cmluZ1tdIG5hbWVzID0ge0FUVFJfTkFNRV9TVU1NQVJZfTsKLQkJCWdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkJLy8gYWxpZ24gKGxvY2FsKQotCQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gYWxpZ25WYWx1ZXMgPSB7QVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX0NFTlRFUiwgQVRUUl9WQUxVRV9SSUdIVH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKGFsaWduVmFsdWVzKTsKLQkJCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BTElHTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0ci5vYnNvbGV0ZSh0cnVlKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JCQkKLQkJCS8vICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MRU5HVEgpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9XSURUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0ci5vYnNvbGV0ZSh0cnVlKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9XSURUSCwgYXR0cik7Ci0JCQkKLQkJCS8vIChib3JkZXIgJVBpeGVsczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuUElYRUxTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQk9SREVSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyLm9ic29sZXRlKHRydWUpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0JPUkRFUiwgYXR0cik7Ci0JCQkKLQkJCS8vIChmcmFtZSAlVEZyYW1lOyAjSU1QTElFRCkKLQkJCS8vICVURnJhbWU7IGlzCi0JCQkvLyAodm9pZHxhYm92ZXxiZWxvd3xoc2lkZXN8bGhzfHJoc3x2c2lkZXN8Ym94fGJvcmRlcikuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1ZPSUQsIEFUVFJfVkFMVUVfQUJPVkUsIEFUVFJfVkFMVUVfQkVMT1csIEFUVFJfVkFMVUVfSFNJREVTLCBBVFRSX1ZBTFVFX0xIUywgQVRUUl9WQUxVRV9SSFMsIEFUVFJfVkFMVUVfVlNJREVTLCBBVFRSX1ZBTFVFX0JPWCwgQVRUUl9WQUxVRV9CT1JERVJ9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GUkFNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0ci5vYnNvbGV0ZSh0cnVlKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9GUkFNRSwgYXR0cik7Ci0JCQkKLQkJCS8vIChydWxlcyAlVFJ1bGVzOyAjSU1QTElFRCkKLQkJCS8vICVUUnVsZXM7IGlzIChub25lIHwgZ3JvdXBzIHwgcm93cyB8IGNvbHMgfCBhbGwpLgotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSBydWxlVmFsdWVzID0ge0FUVFJfVkFMVUVfTk9ORSwgQVRUUl9WQUxVRV9HUk9VUFMsIEFUVFJfVkFMVUVfUk9XUywgQVRUUl9WQUxVRV9DT0xTLCBBVFRSX1ZBTFVFX0FMTH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHJ1bGVWYWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9SVUxFUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0ci5vYnNvbGV0ZSh0cnVlKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9SVUxFUywgYXR0cik7Ci0JCQkKLQkJCS8vIChjZWxsc3BhY2luZyAlTGVuZ3RoOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MRU5HVEgpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DRUxMU1BBQ0lORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0ci5vYnNvbGV0ZSh0cnVlKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9DRUxMU1BBQ0lORywgYXR0cik7Ci0JCQkKLQkJCS8vIChjZWxscGFkZGluZyAlTGVuZ3RoOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MRU5HVEgpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DRUxMUEFERElORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0ci5vYnNvbGV0ZSh0cnVlKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9DRUxMUEFERElORywgYXR0cik7Ci0JCQkKLQkJCS8vIChiZ2NvbG9yICVDb2xvcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09MT1IpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CR0NPTE9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyLm9ic29sZXRlKHRydWUpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0JHQ09MT1IsIGF0dHIpOwotCQkJCi0JCQkvLyAoZGF0YXBhZ2VzaXplIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9EQVRBUEFHRVNJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHIub2Jzb2xldGUodHJ1ZSk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfREFUQVBBR0VTSVpFLCBhdHRyKTsKLQkJCQotCQkJLy8gKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MRU5HVEgpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IRUlHSFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCWF0dHIub2Jzb2xldGUodHJ1ZSk7Ci0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSEVJR0hULCBhdHRyKTsKLQkJCQotCQkJLy8gKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CQUNLR1JPVU5ELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQlhdHRyLm9ic29sZXRlKHRydWUpOwotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0JBQ0tHUk9VTkQsIGF0dHIpOwotCQkJCi0JCQkvLyAoYm9yZGVyY29sb3IsICVDb2xvcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09MT1IpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CT1JERVJDT0xPUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJYXR0ci5vYnNvbGV0ZSh0cnVlKTsKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9CT1JERVJDT0xPUiwgYXR0cik7Ci0JCQkKLQkJCQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0R2xvYmFsQXR0cmlidXRlTGlzdCgpewotCQlyZXR1cm4gQ09SRTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRHbG9iYWxFdmVudExpc3QoKXsKLQkJcmV0dXJuIEVWRU5UUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUw1RWxlbWVudENvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTDVFbGVtZW50Q29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTJkNGI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTDVFbGVtZW50Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw1ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBlbGVtZW50IGRlY2xhcmF0aW9ucy4KLSAqLwotY2xhc3MgSFRNTDVFbGVtZW50Q29sbGVjdGlvbiBleHRlbmRzIEVsZW1lbnRDb2xsZWN0aW9uIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNTBOYW1lc3BhY2UuRWxlbWVudE5hbWUgewotCi0KLQkvLyBFbGVtZW50IElEcwotCXByaXZhdGUgc3RhdGljIGNsYXNzIElkczUwIGV4dGVuZHMgSWRzIHsKLQkJLy8gPDxEMjA1NTEzCi0JCQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BUlRJQ0xFID0xMDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FTSURFID0xMDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FVRElPID0xMDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NBTlZBUyA9MTA5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DT01NQU5EID0xMTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RBVEFMSVNUID0xMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFVEFJTFMgPSAxMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZJR1VSRSA9MTEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GSUdDQVBUSU9OID0gMTE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GT09URVIgPTExNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEVBREVSID0gMTE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IR1JPVVAgPTExNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfS0VZR0VOID0xMTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01BUksgPTExOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUFUSCA9MTIwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NRVRFUiA9MTIxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OQVYgPTEyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1VUUFVUID0xMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BST0dSRVNTID0xMjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JQID0gMTI1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SVCA9IDEyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUlVCWSA9MTI3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRUNUSU9OID0xMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NPVVJDRSA9IDEyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VNTUFSWSA9IDEzMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1ZHID0xMzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RJTUUgPTEzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVklERU8gPTEzMzsKLQotCQkvLyBEMjA1NTEzCi0KLQkJcHVibGljIHN0YXRpYyBpbnQgZ2V0TnVtT2ZJZHMoKSB7Ci0JCQlpZiAobnVtb2ZpZHMgIT0gLTEpCi0JCQkJcmV0dXJuIG51bW9maWRzOwotCi0JCQkvLyBOT1RFOiBJZiB0aGUgcmVmbGVjdGlvbiBpcyB0b28gc2xvdywgdGhpcyBtZXRob2Qgc2hvdWxkCi0JCQkvLyBqdXN0IHJldHVybiB0aGUgbGl0ZXJhbCB2YWx1ZSwgbGlrZSAxMDUuCi0JCQkvLyAtLSA1LzI1LzIwMDEKLQkJCUNsYXNzIGNsYXp6ID0gSWRzNTAuY2xhc3M7Ci0JCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkcygpOwotCQkJbnVtb2ZpZHMgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZpZWxkc1tpXS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiSURfIikpLy8kTk9OLU5MUy0xJAotCQkJCQludW1vZmlkcysrOwotCQkJfQotCQkJcmV0dXJuIG51bW9maWRzOwotCQl9Ci0KLQkJLy8gY2hhY2hlIHRoZSByZXN1bHQgb2YgdGhlIHJlZmxlY3Rpb24uCi0JCXByaXZhdGUgc3RhdGljIGludCBudW1vZmlkcyA9IC0xOwotCX0KLQotCS8qKiAlZm9udHN0eWxlOy4gVFQgfCBJIHwgQiB8IFUgfCBTIHwgU1RSSUtFIHwgQklHIHwgU01BTEwgfCBCTElOSyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEZPTlRTVFlMRSA9IHtUVCwgSSwgQiwgVSwgUywgU1RSSUtFLCBCSUcsIFNNQUxMLCBCTElOS307Ci0JLyoqICVmb3JtY3RsOy4gSU5QVVQgfCBTRUxFQ1QgfCBURVhUQVJFQSB8IExBQkVMIHwgQlVUVE9OICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRk9STUNUTCA9IHtJTlBVVCwgU0VMRUNULCBURVhUQVJFQSwgTEFCRUwsIEJVVFRPTiwgREFUQUxJU1R9OwotCS8qKiAlcGhyYXNlOy4KLQkgKiBFTSB8IFNUUk9ORyB8IERGTiB8IENPREUgfCBTQU1QIHwgS0JEIHwgVkFSIHwgQ0lURSB8IEFCQlIgfCBBQ1JPTllNIHwgTUFSSwotCSAqLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQSFJBU0UgPSB7S0VZR0VOLCBFTSwgU1RST05HLCBERk4sIENPREUsIFNBTVAsIEtCRCwgVkFSLCBDSVRFLCBBQkJSLCBBQ1JPTllNLCBNQVJLfTsKLQkvKiogJXNwZWNpYWw7LgotCSAqIEEgfCBJTUcgfCBBUFBMRVQgfCBPQkpFQ1QgfCBGT05UIHwgQkFTRUZPTlQgfCBCUiB8IFNDUklQVCB8Ci0JICogTUFQIHwgUSB8IFNVQiB8IFNVUCB8IFNQQU4gfCBCRE8gfCBJRlJBTUUgfCBFTUJFRCB8IE1BUlFVRUUgfAotCSAqIEQyVyB8IFNVQk1JVAotCSAqIFdCUiB8IE5PQlIgfCBCR1NPVU5ECi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1BFQ0lBTCA9IHtBLCBJTUcsIEFQUExFVCwgT0JKRUNULCBGT05ULCBCQVNFRk9OVCwgQlIsIFdCUiwgLy8gRDIwNTUxMwotCQkJCVNDUklQVCwgTUFQLCBRLCBTVUIsIFNVUCwgU1BBTiwgQkRPLCBJRlJBTUUsIEVNQkVELCBCR1NPVU5ELCAvLyBEMjA1NTEzCi0JCQkJTUFSUVVFRSwgTk9CUiwgLy8gRDIwNTUxMwotCQkJCU9VVFBVVCwgVElNRSwgTUVURVIsIFBST0dSRVNTLAotCQkJCUNPTU1BTkQKLQl9OwotCS8qKiAlaGVhZGluZzsuIEhbMS02XSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhFQURJTkcgPSB7SDEsIEgyLCBIMywgSDQsIEg1LCBINn07Ci0JLyoqICVsaXN0Oy4gVUwgfCBPTCB8IERJUiB8IE1FTlUgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMSVNUID0ge1VMLCBPTCwgRElSLCBNRU5VfTsKLQkvKiogJXByZWZvcm1hdHRlZDsuIFBSRSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBSRUZPUk1BVFRFRCA9IHtQUkV9OwotCS8qKiAlc2VjdGlvbmluZzsuIEFSVElDTEUgfCBBU0lERSB8IE5BViB8IFNFQ1RJT04gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTRUNUSU9OSU5HID0geyBBUlRJQ0xFLCBBU0lERSwgTkFWLCBTRUNUSU9OIH07Ci0KLQkvKiogJWVtYmVkZGVkOy4gQVVESU98Q0FOVkFTfEVNQkVEfElGUkFNRXxJTUd8TUFUSHxPQkpFQ1R8U1ZHfFZJREVPICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1CRURERUQgPSB7IEFVRElPLCBDQU5WQVMsIEVNQkVELCBJRlJBTUUsIElNRywgTUFUSCwgT0JKRUNULCBTVkcsIFZJREVPfTsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZOYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTDVFbGVtZW50Q29sbGVjdGlvbihBdHRyaWJ1dGVDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZ2V0TmFtZXMoKSwgY29sbGVjdGlvbik7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEFjdHVhbGx5IGNyZWF0ZXMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBpbnN0YW5jZS4KLQkgKiBAcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGNyZWF0ZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJQ01Ob2RlIGVkZWMgPSBudWxsOwotCi0JCWlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFDUk9OWU0pKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShBQ1JPTllNLCB0aGlzKTsKLQkJCSgoSFRNTEVsZW1EZWNsSW1wbCkgZWRlYykub2Jzb2xldGUodHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBUFBMRVQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEFQUExFVCh0aGlzKTsKLQkJCSgoSFRNTEVsZW1EZWNsSW1wbCkgZWRlYykub2Jzb2xldGUodHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBUlRJQ0xFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTZWN0aW9uaW5nKEFSVElDTEUsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBU0lERSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU2VjdGlvbmluZyhBU0lERSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFVRElPKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNZWRpYUVsZW1lbnQoQVVESU8sIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCQVNFRk9OVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQkFTRUZPTlQodGhpcyk7Ci0JCQkoKEhUTUxFbGVtRGVjbEltcGwpIGVkZWMpLm9ic29sZXRlKHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQklHKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoQklHLCB0aGlzKTsKLQkJCSgoSFRNTEVsZW1EZWNsSW1wbCkgZWRlYykub2Jzb2xldGUodHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShDQU5WQVMpKSB7Ci0JCQllZGVjID0gbmV3IEhlZENBTlZBUyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ0VOVEVSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRDRU5URVIodGhpcyk7Ci0JCQkoKEhUTUxFbGVtRGVjbEltcGwpIGVkZWMpLm9ic29sZXRlKHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ09NTUFORCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQ09NTUFORCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoREFUQUxJU1QpKSB7Ci0JCQllZGVjID0gbmV3IEhlZERBVEFMSVNUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShERVRBSUxTKSkgewotCQkJZWRlYyA9IG5ldyBIZWRERVRBSUxTKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShESVIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1FTlUoRElSLCB0aGlzKTsKLQkJCSgoSFRNTEVsZW1EZWNsSW1wbCkgZWRlYykub2Jzb2xldGUodHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShGSUdDQVBUSU9OKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGSUdDQVBUSU9OKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShGSUdVUkUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZJR1VSRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRk9PVEVSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIRUFERVIoSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPT1RFUiAsdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEZSQU1FKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGUkFNRSh0aGlzKTsKLQkJCSgoSFRNTEVsZW1EZWNsSW1wbCkgZWRlYykub2Jzb2xldGUodHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShGUkFNRVNFVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRlJBTUVTRVQodGhpcyk7Ci0JCQkoKEhUTUxFbGVtRGVjbEltcGwpIGVkZWMpLm9ic29sZXRlKHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSEVBREVSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIRUFERVIoSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQURFUiAsdGhpcyk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIR1JPVVApKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhHUk9VUCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSVNJTkRFWCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSVNJTkRFWCh0aGlzKTsKLQkJCSgoSFRNTEVsZW1EZWNsSW1wbCkgZWRlYykub2Jzb2xldGUodHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShLRVlHRU4pKSB7Ci0JCQllZGVjID0gbmV3IEhlZEtFWUdFTih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTUFSSykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NQVJLLHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShNQVRIKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNYXRoKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShNRVRFUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTUVURVIodGhpcyk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShOQVYpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNlY3Rpb25pbmcoTkFWLCB0aGlzKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE5PRlJBTUVTKSkgewotCQkJZWRlYyA9IG5ldyBIZWROT0ZSQU1FUyh0aGlzKTsKLQkJCSgoSFRNTEVsZW1EZWNsSW1wbCkgZWRlYykub2Jzb2xldGUodHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShPVVRQVVQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE9VVFBVVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoUFJPR1JFU1MpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBST0dSRVNTKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShSUCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUlAodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFJUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRSVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoUlVCWSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUlVCWSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoUykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKFMsIHRoaXMpOwotCQkJKChIVE1MRWxlbURlY2xJbXBsKSBlZGVjKS5vYnNvbGV0ZSh0cnVlKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNFQ1RJT04pKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNlY3Rpb25pbmcoU0VDVElPTiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNPVVJDRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU09VUkNFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTVFJJS0UpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShTVFJJS0UsIHRoaXMpOwotCQkJKChIVE1MRWxlbURlY2xJbXBsKSBlZGVjKS5vYnNvbGV0ZSh0cnVlKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNVTU1BUlkpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNVTU1BUlkodGhpcyk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTVkcpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNWRyh0aGlzKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRJTUUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRJTUUodGhpcyk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShUVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKFRULCB0aGlzKTsKLQkJCSgoSFRNTEVsZW1EZWNsSW1wbCkgZWRlYykub2Jzb2xldGUodHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShVKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoVSwgdGhpcyk7Ci0JCQkoKEhUTUxFbGVtRGVjbEltcGwpIGVkZWMpLm9ic29sZXRlKHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVklERU8pKSB7Ci0JCQllZGVjID0gbmV3IEhlZFZJREVPKHRoaXMpOwotCi0JCX0KLQkJLy8gdW5rbm93bgotCQllbHNlIHsKLQkJCS8vIE5PVEU6IFdlIGRvbid0IGRlZmluZSB0aGUgVU5LTk9XTiBlbGVtZW50IGRlY2xhcmF0aW9uLgotCQkJLy8gPGNvZGU+bnVsbDwvY29kZT4gZm9yIGEgZGVjbGFyYXRpb24gaXMgYSBzaWduIG9mCi0JCQkvLyB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgdW5rbm93bi4KLQkJCS8vIC0tIDMvOS8yMDAxCi0JCQllZGVjID0gc3VwZXIuY3JlYXRlKGVsZW1lbnROYW1lKTsKLQkJfQotCQlyZXR1cm4gZWRlYzsKLQl9Ci0KLQlwdWJsaWMgQXR0cmlidXRlQ29sbGVjdGlvbiBnZXRBdHRyaWJ1dGVDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gYXR0cmlidXRlQ29sbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgQ29sbGVjdGlvbiBnZXROYW1lc09mQmxvY2soKSB7Ci0JCS8vIFAsIERMLCBESVYsIENFTlRFUiwgTk9TQ1JJUFQsIE5PRlJBTUVTLCBCTE9DS1FVT1RFLCBGT1JNLCBJU0lOREVYLCBIUiwKLQkJLy8gVEFCTEUsIEZJRUxEU0VULCBBRERSRVNTLCBSVUJZLCBGSUdVUkUKLQkJU3RyaW5nW10gYmxvY2tNaXNjID0ge0hFQURFUiwgRk9PVEVSLCBIR1JPVVAsIFAsIERMLCBESVYsIENFTlRFUiwgTk9TQ1JJUFQsIE5PRlJBTUVTLCBCTE9DS1FVT1RFLCBGT1JNLCBJU0lOREVYLCBIUiwgVEFCTEUsIEZJRUxEU0VULCBBRERSRVNTLCBSVUJZLCBGSUdVUkV9OwotCQlWZWN0b3IgbmFtZXMgPSBuZXcgVmVjdG9yKEFycmF5cy5hc0xpc3QoYmxvY2tNaXNjKSk7Ci0JCS8vICVoZWFkaW5nOwotCQluYW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChIRUFESU5HKSk7Ci0JCS8vICVsaXN0OwotCQluYW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChMSVNUKSk7Ci0JCS8vICVwcmVmb3JtYXR0ZWQ7Ci0JCW5hbWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KFBSRUZPUk1BVFRFRCkpOwotCi0JCQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0U2VjdGlvbmluZyhDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KFNFQ1RJT05JTkcpLml0ZXJhdG9yKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBnZXRFbWJlZGRlZChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KEVNQkVEREVEKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZXRGbG93KENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzdXBlci5nZXRGbG93KGdyb3VwKTsKLQkJZ2V0U2VjdGlvbmluZyhncm91cCk7Ci0JCUNNTm9kZSBub2RlID0gZ2V0TmFtZWRJdGVtKERFVEFJTFMpOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlncm91cC5hcHBlbmRDaGlsZChub2RlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGdldElubGluZShDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc3VwZXIuZ2V0SW5saW5lKGdyb3VwKTsKLQkJZ2V0RW1iZWRkZWQoZ3JvdXApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbSBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+Ci0JICogaW5zdGFuY2UuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldEZvbnRzdHlsZShDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KEZPTlRTVFlMRSkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0Rm9ybWN0cmwoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChGT1JNQ1RMKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiAlaGVhZGluZzsuCi0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0SGVhZGluZyhDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoSEVBRElORykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JCi0KLQkvKioKLQkgKiAlbGlzdDsuCi0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0TGlzdChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoTElTVCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0UGhyYXNlKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoUEhSQVNFKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiAlcHJlZm9ybWF0dGVkOwotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldFByZWZvcm1hdHRlZChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoUFJFRk9STUFUVEVEKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0gaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPgotCSAqIGluc3RhbmNlLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRTcGVjaWFsKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoU1BFQ0lBTCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0TmFtZXMoKSB7Ci0JCWlmIChmTmFtZXMgPT0gbnVsbCkgewotCQkJZk5hbWVzID0gbmV3IFN0cmluZ1tJZHM1MC5nZXROdW1PZklkcygpXTsKLQkJCWZOYW1lc1tJZHMuSURfQV0gPSBBOwotCQkJZk5hbWVzW0lkcy5JRF9BQkJSXSA9IEFCQlI7Ci0JCQlmTmFtZXNbSWRzLklEX0FDUk9OWU1dID0gQUNST05ZTTsKLQkJCWZOYW1lc1tJZHMuSURfQUREUkVTU10gPSBBRERSRVNTOwotCQkJZk5hbWVzW0lkcy5JRF9BUFBMRVRdID0gQVBQTEVUOwotCQkJZk5hbWVzW0lkcy5JRF9BUkVBXSA9IEFSRUE7Ci0JCQlmTmFtZXNbSWRzNTAuSURfQVJUSUNMRV0gPSBBUlRJQ0xFOwotCQkJZk5hbWVzW0lkczUwLklEX0FTSURFXSA9IEFTSURFOwotCQkJZk5hbWVzW0lkczUwLklEX0FVRElPXSA9IEFVRElPOwotCQkJZk5hbWVzW0lkcy5JRF9CXSA9IEI7Ci0JCQlmTmFtZXNbSWRzLklEX0JBU0VdID0gQkFTRTsKLQkJCWZOYW1lc1tJZHMuSURfQkFTRUZPTlRdID0gQkFTRUZPTlQ7Ci0JCQlmTmFtZXNbSWRzLklEX0JET10gPSBCRE87Ci0JCQlmTmFtZXNbSWRzLklEX0JJR10gPSBCSUc7Ci0JCQlmTmFtZXNbSWRzLklEX0JMSU5LXSA9IEJMSU5LOwotCQkJZk5hbWVzW0lkcy5JRF9CTE9DS1FVT1RFXSA9IEJMT0NLUVVPVEU7Ci0JCQlmTmFtZXNbSWRzLklEX0JPRFldID0gQk9EWTsKLQkJCWZOYW1lc1tJZHMuSURfQlJdID0gQlI7Ci0JCQlmTmFtZXNbSWRzLklEX0JVVFRPTl0gPSBCVVRUT047Ci0JCQlmTmFtZXNbSWRzLklEX0NBUFRJT05dID0gQ0FQVElPTjsKLQkJCWZOYW1lc1tJZHM1MC5JRF9DQU5WQVNdID0gQ0FOVkFTOwotCQkJZk5hbWVzW0lkcy5JRF9DRU5URVJdID0gQ0VOVEVSOwotCQkJZk5hbWVzW0lkcy5JRF9DSVRFXSA9IENJVEU7Ci0JCQlmTmFtZXNbSWRzLklEX0NPREVdID0gQ09ERTsKLQkJCWZOYW1lc1tJZHMuSURfQ09MXSA9IENPTDsKLQkJCWZOYW1lc1tJZHMuSURfQ09MR1JPVVBdID0gQ09MR1JPVVA7Ci0JCQlmTmFtZXNbSWRzNTAuSURfQ09NTUFORF0gPSBDT01NQU5EOwotCQkJZk5hbWVzW0lkczUwLklEX0RBVEFMSVNUXSA9IERBVEFMSVNUOwotCQkJZk5hbWVzW0lkczUwLklEX0RFVEFJTFNdID0gREVUQUlMUzsKLQkJCWZOYW1lc1tJZHMuSURfRERdID0gREQ7Ci0JCQlmTmFtZXNbSWRzLklEX0RFTF0gPSBERUw7Ci0JCQlmTmFtZXNbSWRzLklEX0RGTl0gPSBERk47Ci0JCQlmTmFtZXNbSWRzLklEX0RJUl0gPSBESVI7Ci0JCQlmTmFtZXNbSWRzLklEX0RJVl0gPSBESVY7Ci0JCQlmTmFtZXNbSWRzLklEX0RMXSA9IERMOwotCQkJZk5hbWVzW0lkcy5JRF9EVF0gPSBEVDsKLQkJCWZOYW1lc1tJZHMuSURfRU1dID0gRU07Ci0JCQlmTmFtZXNbSWRzLklEX0VNQkVEXSA9IEVNQkVEOwotCQkJZk5hbWVzW0lkcy5JRF9GSUVMRFNFVF0gPSBGSUVMRFNFVDsKLQkJCWZOYW1lc1tJZHM1MC5JRF9GSUdVUkVdID0gRklHVVJFOwotCQkJZk5hbWVzW0lkczUwLklEX0ZJR0NBUFRJT05dID0gRklHQ0FQVElPTjsKLQkJCWZOYW1lc1tJZHMuSURfRk9OVF0gPSBGT05UOwotCQkJZk5hbWVzW0lkcy5JRF9GT1JNXSA9IEZPUk07Ci0JCQlmTmFtZXNbSWRzNTAuSURfRk9PVEVSXSA9IEZPT1RFUjsKLQkJCWZOYW1lc1tJZHMuSURfRlJBTUVdID0gRlJBTUU7Ci0JCQlmTmFtZXNbSWRzLklEX0ZSQU1FU0VUXSA9IEZSQU1FU0VUOwotCQkJZk5hbWVzW0lkcy5JRF9IMV0gPSBIMTsKLQkJCWZOYW1lc1tJZHMuSURfSDJdID0gSDI7Ci0JCQlmTmFtZXNbSWRzLklEX0gzXSA9IEgzOwotCQkJZk5hbWVzW0lkcy5JRF9INF0gPSBINDsKLQkJCWZOYW1lc1tJZHMuSURfSDVdID0gSDU7Ci0JCQlmTmFtZXNbSWRzLklEX0g2XSA9IEg2OwotCQkJZk5hbWVzW0lkcy5JRF9IRUFEXSA9IEhFQUQ7Ci0JCQlmTmFtZXNbSWRzNTAuSURfSEVBREVSXSA9IEhFQURFUjsKLQkJCWZOYW1lc1tJZHM1MC5JRF9IR1JPVVBdID0gSEdST1VQOwotCQkJZk5hbWVzW0lkcy5JRF9IUl0gPSBIUjsKLQkJCWZOYW1lc1tJZHMuSURfSFRNTF0gPSBIVE1MOwotCQkJZk5hbWVzW0lkcy5JRF9JXSA9IEk7Ci0JCQlmTmFtZXNbSWRzLklEX0lGUkFNRV0gPSBJRlJBTUU7Ci0JCQlmTmFtZXNbSWRzLklEX0lNR10gPSBJTUc7Ci0JCQlmTmFtZXNbSWRzLklEX0lOUFVUXSA9IElOUFVUOwotCQkJZk5hbWVzW0lkcy5JRF9JTlNdID0gSU5TOwotCQkJZk5hbWVzW0lkcy5JRF9JU0lOREVYXSA9IElTSU5ERVg7Ci0JCQlmTmFtZXNbSWRzLklEX0tCRF0gPSBLQkQ7Ci0JCQlmTmFtZXNbSWRzNTAuSURfS0VZR0VOXSA9IEtFWUdFTjsKLQkJCWZOYW1lc1tJZHMuSURfTEFCRUxdID0gTEFCRUw7Ci0JCQlmTmFtZXNbSWRzLklEX0xFR0VORF0gPSBMRUdFTkQ7Ci0JCQlmTmFtZXNbSWRzLklEX0xJXSA9IExJOwotCQkJZk5hbWVzW0lkcy5JRF9MSU5LXSA9IExJTks7Ci0JCQlmTmFtZXNbSWRzLklEX01BUF0gPSBNQVA7Ci0JCQlmTmFtZXNbSWRzNTAuSURfTUFSS10gPSBNQVJLOwotCQkJZk5hbWVzW0lkcy5JRF9NQVJRVUVFXSA9IE1BUlFVRUU7Ci0JCQlmTmFtZXNbSWRzNTAuSURfTUFUSF0gPSBNQVRIOwotCQkJZk5hbWVzW0lkcy5JRF9NRU5VXSA9IE1FTlU7Ci0JCQlmTmFtZXNbSWRzLklEX01FVEFdID0gTUVUQTsKLQkJCWZOYW1lc1tJZHM1MC5JRF9NRVRFUl0gPSBNRVRFUjsKLQkJCWZOYW1lc1tJZHM1MC5JRF9OQVZdID0gTkFWOwotCQkJZk5hbWVzW0lkcy5JRF9OT0VNQkVEXSA9IE5PRU1CRUQ7Ci0JCQlmTmFtZXNbSWRzLklEX05PRlJBTUVTXSA9IE5PRlJBTUVTOwotCQkJZk5hbWVzW0lkcy5JRF9OT1NDUklQVF0gPSBOT1NDUklQVDsKLQkJCWZOYW1lc1tJZHMuSURfT0JKRUNUXSA9IE9CSkVDVDsKLQkJCWZOYW1lc1tJZHMuSURfT0xdID0gT0w7Ci0JCQlmTmFtZXNbSWRzLklEX09QVEdST1VQXSA9IE9QVEdST1VQOwotCQkJZk5hbWVzW0lkcy5JRF9PUFRJT05dID0gT1BUSU9OOwotCQkJZk5hbWVzW0lkczUwLklEX09VVFBVVF0gPSBPVVRQVVQ7Ci0JCQlmTmFtZXNbSWRzLklEX1BdID0gUDsKLQkJCWZOYW1lc1tJZHMuSURfUEFSQU1dID0gUEFSQU07Ci0JCQlmTmFtZXNbSWRzLklEX1BSRV0gPSBQUkU7Ci0JCQlmTmFtZXNbSWRzNTAuSURfUFJPR1JFU1NdID0gUFJPR1JFU1M7Ci0JCQlmTmFtZXNbSWRzLklEX1FdID0gUTsKLQkJCWZOYW1lc1tJZHM1MC5JRF9SUF0gPSBSUDsKLQkJCWZOYW1lc1tJZHM1MC5JRF9SVF0gPSBSVDsKLQkJCWZOYW1lc1tJZHM1MC5JRF9SVUJZXSA9IFJVQlk7Ci0JCQlmTmFtZXNbSWRzLklEX1NdID0gUzsKLQkJCWZOYW1lc1tJZHMuSURfU0FNUF0gPSBTQU1QOwotCQkJZk5hbWVzW0lkcy5JRF9TQ1JJUFRdID0gU0NSSVBUOwotCQkJZk5hbWVzW0lkczUwLklEX1NFQ1RJT05dID0gU0VDVElPTjsKLQkJCWZOYW1lc1tJZHMuSURfU0VMRUNUXSA9IFNFTEVDVDsKLQkJCWZOYW1lc1tJZHMuSURfU01BTExdID0gU01BTEw7Ci0JCQlmTmFtZXNbSWRzNTAuSURfU09VUkNFXSA9IFNPVVJDRTsKLQkJCWZOYW1lc1tJZHMuSURfU1BBTl0gPSBTUEFOOwotCQkJZk5hbWVzW0lkcy5JRF9TVFJJS0VdID0gU1RSSUtFOwotCQkJZk5hbWVzW0lkcy5JRF9TVFJPTkddID0gU1RST05HOwotCQkJZk5hbWVzW0lkcy5JRF9TVFlMRV0gPSBTVFlMRTsKLQkJCWZOYW1lc1tJZHM1MC5JRF9TVU1NQVJZXSA9IFNVTU1BUlk7Ci0JCQlmTmFtZXNbSWRzLklEX1NVQl0gPSBTVUI7Ci0JCQlmTmFtZXNbSWRzLklEX1NVUF0gPSBTVVA7Ci0JCQlmTmFtZXNbSWRzNTAuSURfU1ZHXSA9IFNWRzsKLQkJCWZOYW1lc1tJZHMuSURfVEFCTEVdID0gVEFCTEU7Ci0JCQlmTmFtZXNbSWRzLklEX1RCT0RZXSA9IFRCT0RZOwotCQkJZk5hbWVzW0lkcy5JRF9URF0gPSBURDsKLQkJCWZOYW1lc1tJZHMuSURfVEVYVEFSRUFdID0gVEVYVEFSRUE7Ci0JCQlmTmFtZXNbSWRzLklEX1RGT09UXSA9IFRGT09UOwotCQkJZk5hbWVzW0lkcy5JRF9USF0gPSBUSDsKLQkJCWZOYW1lc1tJZHMuSURfVEhFQURdID0gVEhFQUQ7Ci0JCQlmTmFtZXNbSWRzNTAuSURfVElNRV0gPSBUSU1FOwotCQkJZk5hbWVzW0lkcy5JRF9USVRMRV0gPSBUSVRMRTsKLQkJCWZOYW1lc1tJZHMuSURfVFJdID0gVFI7Ci0JCQlmTmFtZXNbSWRzLklEX1RUXSA9IFRUOwotCQkJZk5hbWVzW0lkcy5JRF9VXSA9IFU7Ci0JCQlmTmFtZXNbSWRzLklEX1VMXSA9IFVMOwotCQkJZk5hbWVzW0lkcy5JRF9WQVJdID0gVkFSOwotCQkJZk5hbWVzW0lkczUwLklEX1ZJREVPXSA9IFZJREVPOwotCQkJZk5hbWVzW0lkcy5JRF9XQlJdID0gV0JSOwotCQkJZk5hbWVzW0lkcy5JRF9TU0lfQ09ORklHXSA9IFNTSV9DT05GSUc7Ci0JCQlmTmFtZXNbSWRzLklEX1NTSV9FQ0hPXSA9IFNTSV9FQ0hPOwotCQkJZk5hbWVzW0lkcy5JRF9TU0lfRVhFQ10gPSBTU0lfRVhFQzsKLQkJCWZOYW1lc1tJZHMuSURfU1NJX0ZTSVpFXSA9IFNTSV9GU0laRTsKLQkJCWZOYW1lc1tJZHMuSURfU1NJX0ZMQVNUTU9EXSA9IFNTSV9GTEFTVE1PRDsKLQkJCWZOYW1lc1tJZHMuSURfU1NJX0lOQ0xVREVdID0gU1NJX0lOQ0xVREU7Ci0JCQlmTmFtZXNbSWRzLklEX1NTSV9QUklOVEVOVl0gPSBTU0lfUFJJTlRFTlY7Ci0JCQlmTmFtZXNbSWRzLklEX1NTSV9TRVRdID0gU1NJX1NFVDsKLQkJCWZOYW1lc1tJZHMuSURfQkdTT1VORF0gPSBCR1NPVU5EOwotCQkJZk5hbWVzW0lkcy5JRF9OT0JSXSA9IE5PQlI7Ci0JCQlmTmFtZXNbSWRzLklEX1dCUl0gPSBXQlI7Ci0JCX0KLQkJcmV0dXJuIGZOYW1lczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxBdHRyRGVjbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEF0dHJEZWNsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yzg1ZTRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEF0dHJEZWNsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBjbGFzcyBvZiB7QGxpbmsgPGNvZGU+SFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uPC9jb2RlPn0gaW50ZXJmYWNlLjxicj4KLSAqLwotY2xhc3MgSFRNTEF0dHJEZWNsSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gewotCi0JcHJpdmF0ZSBIVE1MQ01EYXRhVHlwZUltcGwgdHlwZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgdXNhZ2UgPSAwOwotCXByaXZhdGUgYm9vbGVhbiBpc19vYnNvbGV0ZSA9IGZhbHNlOwotCi0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTEF0dHJEZWNsSW1wbChTdHJpbmcgYXR0ck5hbWUsIEhUTUxDTURhdGFUeXBlSW1wbCB2YWx1ZVR5cGUsIGludCB2YWx1ZVVzYWdlKSB7Ci0JCXN1cGVyKGF0dHJOYW1lKTsKLQkJdGhpcy50eXBlID0gdmFsdWVUeXBlOwotCi0JCXN3aXRjaCAodmFsdWVVc2FnZSkgewotCQkJY2FzZSBPUFRJT05BTCA6Ci0JCQljYXNlIFJFUVVJUkVEIDoKLQkJCWNhc2UgRklYRUQgOgotCQkJY2FzZSBQUk9ISUJJVEVEIDoKLQkJCQl0aGlzLnVzYWdlID0gdmFsdWVVc2FnZTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCS8vIHNob3VsZCB3YXJuLi4uCi0JCQkJdGhpcy51c2FnZSA9IE9QVElPTkFMOyAvLyBmYWxsIGJhY2sKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldEF0dHJOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ck5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldEF0dHJUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gQ01EYXRhVHlwZQotCSAqLwotCXB1YmxpYyBDTURhdGFUeXBlIGdldEF0dHJUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBieSBzdXBlcmludGVyZmFjZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlpZiAodHlwZS5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgIT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHR5cGUuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgYnkgc3VwZXJpbnRlcmZhY2UKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKSB7Ci0JCVZlY3RvciB2ID0gbmV3IFZlY3RvcihBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpKSk7Ci0JCXJldHVybiB2LmVsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIEdST1VQLCBFTlRJVFlfREVDTEFSQVRJT04uCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT047Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFVzYWdlKCkgewotCQlyZXR1cm4gdXNhZ2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NDUklQVEFCTEUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19PQlNPTEVURSkpCi0JCQlyZXR1cm4gaXNfb2Jzb2xldGU7Ci0JCQotCQlyZXR1cm4gc3VwZXIuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfU0NSSVBUQUJMRSkpIHsKLQkJCXJldHVybiBnZXRBdHRyVHlwZSgpLmdldERhdGFUeXBlTmFtZSgpID09IEhUTUxDTURhdGFUeXBlLlNDUklQVCA/IG5ldyBCb29sZWFuKHRydWUpIDogbmV3IEJvb2xlYW4oZmFsc2UpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19PQlNPTEVURSkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oaXNfb2Jzb2xldGUpOwotCQkKLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG9ic29sZXRlKGJvb2xlYW4gaXNfb2Jzb2xldGUpewotCQl0aGlzLmlzX29ic29sZXRlID0gaXNfb2Jzb2xldGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYWRmZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gYmUgYSBwdWJsaWMgaW50ZXJmYWNlIHdoaWNoIGhhcwotICogaW50ZXJmYWNlcyBkZWZpbmVkIGluIGJvdGggb2Yge0BsaW5rIDxjb2RlPkNNQXR0cmlidXRlRGVjbGFyYXRpb248L2NvZGU+fQotICogYW5kIHtAbGluayA8Y29kZT5IVE1MQ01Ob2RlPC9jb2RlPn0uPGJyPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBleHRlbmRzIENNQXR0cmlidXRlRGVjbGFyYXRpb24gewotCVN0cmluZyBJU19IVE1MID0gImlzSFRNTCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRGF0YVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRGF0YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M5NGM0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURhdGFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIEhUTUwgZXh0ZW5zaW9uIGZvciBkYXRhIHR5cGVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxDTURhdGFUeXBlIGV4dGVuZHMgQ01EYXRhVHlwZSB7Ci0KLQkvKiogQm9vbGVhbjsgaXQgc2hvdWxkIGJlIGRlZmluZWQgaW4gQ01EYXRhVHlwZS4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT09MRUFOID0gIkJPT0xFQU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1IgPSAiQ09MT1IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlQgPSAiRVZFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUZTID0gIklEUkVGUyI7IC8vJE5PTi1OTFMtMSQKLQkvKiogTmFtZTsgaXQgc2hvdWxkIGJlIGRlZmluZWQgaW4gQ01EYXRhVHlwZS4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIk5BTUUiOyAvLyROT04tTkxTLTEkCi0JLy8gRm9sbG93aW5nIHR5cGVzIGFyZSBqdXN0IGFsaWFzZXMuCi0JLyoqICVDaGFyYWN0ZXI7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUkFDVEVSID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJUNoYXJzZXQ7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUlNFVCA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVDaGFyc2V0czsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSU0VUUyA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVDb250ZW50VHlwZTsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlQ29vcmRzOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPT1JEUyA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVEYXRldGltZTsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFVElNRSA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVGcmFtZVRhcmdldDsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFNRV9UQVJHRVQgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlTGFuZ3VhZ2VDb2RlOyA9PSBOQU1FICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFOR1VBR0VfQ09ERSA9IE5BTUU7Ci0JLyoqICVMZW5ndGg7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVOR1RIID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJUxpbmtUeXBlczsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX1RZUEVTID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJUxJU3R5bGU7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElfU1RZTEUgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlTWVkaWFEZXNjOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX0RFU0MgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlTXVsdGlMZW5ndGg7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElfTEVOR1RIID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJU9MU3R5bGU7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0xfU1RZTEUgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlUGl4bGVzOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJWEVMUyA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVTY3JpcHQ7ID09IEVWRU5UICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUID0gRVZFTlQ7Ci0JLyoqICVTdHlsZVNoZWV0OyA9PSBFVkVOVCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUWUxFX1NIRUVUID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJVRleHQ7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVCA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVNZWRpYVR5cGU7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFfVFlQRSA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVCcm93c2luZ0NvbnRleHQ7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJPV1NJTkdfQ09OVEVYVCA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURhdGFUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQ01EYXRhVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU1MGM3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURhdGFUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLQotLyoqCi0gKi8KLWNsYXNzIEhUTUxDTURhdGFUeXBlSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MQ01EYXRhVHlwZSB7Ci0KLQlwcml2YXRlIGludCBpbXBsaWVkVmFsdWVLaW5kID0gSU1QTElFRF9WQUxVRV9OT05FOwotCXByaXZhdGUgU3RyaW5nIGltcGxpZWRWYWx1ZSA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gZW1wdHlBcnJheSA9IG5ldyBTdHJpbmdbMF07Ci0JcHJpdmF0ZSBTdHJpbmdbXSBlbnVtVmFsdWVzID0gZW1wdHlBcnJheTsKLQlwcml2YXRlIFN0cmluZyBpbnN0YW5jZVZhbHVlID0gbnVsbDsKLQotCS8qKgotCSAqIEhUTUxDTURhdGFUeXBlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBubSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxDTURhdGFUeXBlSW1wbChTdHJpbmcgdHlwZU5hbWUpIHsKLQkJc3VwZXIodHlwZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEhUTUxDTURhdGFUeXBlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBubSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxDTURhdGFUeXBlSW1wbChTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN1cGVyKHR5cGVOYW1lKTsKLQkJdGhpcy5pbnN0YW5jZVZhbHVlID0gaW5zdGFuY2VWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUeXBlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzdWl0YWJsZSBkZWZhdWx0IHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgZGF0YSB0eXBlIGlzIGNyZWF0ZWQuCi0JICogVGhpcyByZXR1cm5zIG51bGwgb2YgYSBzdWl0YWJsZSBkZWZhdWx0IGlzIG5vdCBhdmFpbGFibGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUluc3RhbmNlVmFsdWUoKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JICoKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpIHsKLQkJcmV0dXJuIGVudW1WYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nICAKLQkgKgotCSAqIFJldHVybnMgdGhlIGltcGxpZWQgdmFsdWUgb3IgbnVsbCBpZiBub25lIGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEltcGxpZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIGltcGxpZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRJbXBsaWVkVmFsdWVLaW5kIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogSU1QTElFRF9WQUxVRV9OT05FLCBJTVBMSUVEX1ZBTFVFX0ZJWEVELCBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQuCi0JICovCi0JcHVibGljIGludCBnZXRJbXBsaWVkVmFsdWVLaW5kKCkgewotCQlyZXR1cm4gaW1wbGllZFZhbHVlS2luZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5EQVRBX1RZUEU7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRFbnVtVmFsdWVzKFN0cmluZ1tdIHZhbHVlcykgewotCQllbnVtVmFsdWVzID0gbmV3IFN0cmluZ1t2YWx1ZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWVudW1WYWx1ZXNbaV0gPSB2YWx1ZXNbaV07Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwYWNrYWdlIHNjb3BlLgotCSAqLwotCXZvaWQgc2V0SW1wbGllZFZhbHVlKGludCBraW5kLCBTdHJpbmcgdmFsdWUpIHsKLQkJc3dpdGNoIChraW5kKSB7Ci0JCQljYXNlIElNUExJRURfVkFMVUVfRklYRUQgOgotCQkJY2FzZSBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQgOgotCQkJCWltcGxpZWRWYWx1ZUtpbmQgPSBraW5kOwotCQkJCWltcGxpZWRWYWx1ZSA9IHZhbHVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJTVBMSUVEX1ZBTFVFX05PTkUgOgotCQkJZGVmYXVsdCA6Ci0JCQkJaW1wbGllZFZhbHVlS2luZCA9IElNUExJRURfVkFMVUVfTk9ORTsKLQkJCQlpbXBsaWVkVmFsdWUgPSBudWxsOyAvLyBtYXliZSBhIG51bGwgc3RyaW5nPwotCQkJCWJyZWFrOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQ01Eb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQ01Eb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjZjN2Q5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotCi0KLS8qKgotICogSFRNTCBleHRlbnNpb24gZm9yIENNRG9jdW1lbnQuCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBzb21lIHNob3J0IGhhbmQgbWV0aG9kcyB0byBnZXQgZGVjbGFyYXRpb25zCi0gKiBieSBhIG5hbWUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTENNRG9jdW1lbnQgZXh0ZW5kcyBDTURvY3VtZW50IHsKLQotCS8qKgotCSAqIEEgc2hvcnQgaGFuZCBtZXRob2QgdG8gZ2V0IGEgZWxlbWVudCBkZWNsYXJhdGlvbiBmb3IgYSBIVE1MIGVsZW1lbnQuPGJyPgotCSAqIEBwYXJhbSBlbGVtZW50TmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnROYW1lKTsKLQotCS8qKgotCSAqIEEgc2hvcnQgaGFuZCBtZXRob2QgdG8gZ2V0IGEgZW50aXR5IGRlY2xhcmF0aW9uIG9mIEhUTUwgZG9jdW1lbnRzLjxicj4KLQkgKiBAcGFyYW0gZW50aXR5TmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JSFRNTEVudGl0eURlY2xhcmF0aW9uIGdldEVudGl0eURlY2xhcmF0aW9uKFN0cmluZyBlbnRpdHlOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRG9jdW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURvY3VtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjlmNjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRG9jdW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sLkNIQ01Eb2NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDUwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNRG9jVHlwZTsKLQotLyoqCi0gKiBJTm9kZUFkYXB0ZXIgZmFjdG9yeSBmb3IgSFRNTCBhbmQgSlNQIGRvY3VtZW50cy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEhUTUxDTURvY3VtZW50RmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgY21kb2NzID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgc3RhdGljIExpc3Qgc3VwcG9ydGVkQ010eXBlcyA9IEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtde0NNRG9jVHlwZS5IVE1MX0RPQ19UWVBFLCBDTURvY1R5cGUuQ0hUTUxfRE9DX1RZUEUsIENNRG9jVHlwZS5KU1AxMV9ET0NfVFlQRSwgQ01Eb2NUeXBlLkpTUDEyX0RPQ19UWVBFLCBDTURvY1R5cGUuSlNQMjBfRE9DX1RZUEUsIENNRG9jVHlwZS5UQUcyMF9ET0NfVFlQRSwgQ01Eb2NUeXBlLkpTUDIxX0RPQ19UWVBFLCBDTURvY1R5cGUuSFRNTDVfRE9DX1RZUEV9KTsKLQotCXByaXZhdGUgc3RhdGljIEpDTURvY0ltcGwganNwMTFkb2MgPSBudWxsOwotCi0JLyoqCi0JICogSFRNTENNQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBIVE1MQ01Eb2N1bWVudEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKiBAcGFyYW0gY210eXBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoU3RyaW5nIGNtdHlwZSkgewotCQlPYmplY3Qgb2JqID0gY21kb2NzLmdldChjbXR5cGUpOwotCQlpZiAob2JqID09IG51bGwgJiYgY210eXBlICE9IG51bGwpIHsKLQkJCWlmIChzdXBwb3J0ZWRDTXR5cGVzLmNvbnRhaW5zKGNtdHlwZSkpIHsKLQkJCQlvYmogPSBkb0NyZWF0ZUNNRG9jdW1lbnQoY210eXBlKTsKLQkJCQljbWRvY3MucHV0KGNtdHlwZSwgb2JqKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAoQ01Eb2N1bWVudCkgb2JqOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE9iamVjdCBkb0NyZWF0ZUNNRG9jdW1lbnQoU3RyaW5nIGNtdHlwZSkgewotCQlpZiAoQ01Eb2NUeXBlLkhUTUxfRE9DX1RZUEUuZXF1YWxzKGNtdHlwZSkpIHsKLQkJCUNNTmFtZXNwYWNlSW1wbCBoNDBucyA9IG5ldyBDTU5hbWVzcGFjZUltcGwoSFRNTDQwTmFtZXNwYWNlLkhUTUw0MF9VUkksIEhUTUw0ME5hbWVzcGFjZS5IVE1MNDBfVEFHX1BSRUZJWCk7Ci0JCQlIQ01Eb2NJbXBsIGh0bWw0MGRvYyA9IG5ldyBIQ01Eb2NJbXBsKENNRG9jVHlwZS5IVE1MX0RPQ19UWVBFLCBoNDBucyk7Ci0JCQlyZXR1cm4gaHRtbDQwZG9jOwotCQl9Ci0KLQkJZWxzZSBpZiAoQ01Eb2NUeXBlLkhUTUw1X0RPQ19UWVBFLmVxdWFscyhjbXR5cGUpKSB7Ci0JCQlDTU5hbWVzcGFjZUltcGwgaDUwbnMgPSBuZXcgQ01OYW1lc3BhY2VJbXBsKEhUTUw1ME5hbWVzcGFjZS5IVE1MNTBfVVJJLCBIVE1MNTBOYW1lc3BhY2UuSFRNTDUwX1RBR19QUkVGSVgpOwotCQkJSDVDTURvY0ltcGwgaHRtbDUwZG9jID0gbmV3IEg1Q01Eb2NJbXBsKENNRG9jVHlwZS5IVE1MNV9ET0NfVFlQRSwgaDUwbnMpOwotCQkJcmV0dXJuIGh0bWw1MGRvYzsKLQkJfQotCQkKLQkJZWxzZSBpZiAoQ01Eb2NUeXBlLkpTUDIwX0RPQ19UWVBFLmVxdWFscyhjbXR5cGUpKSB7Ci0JCQlDTU5hbWVzcGFjZUltcGwgajIwbnMgPSBuZXcgQ01OYW1lc3BhY2VJbXBsKEpTUDIwTmFtZXNwYWNlLkpTUDIwX1VSSSwgSlNQMTFOYW1lc3BhY2UuSlNQX1RBR19QUkVGSVgpOwotCQkJSkNNMjBEb2NJbXBsIGpzcDIwZG9jID0gbmV3IEpDTTIwRG9jSW1wbChDTURvY1R5cGUuSlNQMjBfRE9DX1RZUEUsIGoyMG5zKTsKLQkJCXJldHVybiBqc3AyMGRvYzsKLQkJfQotCi0JCWVsc2UgaWYgKENNRG9jVHlwZS5KU1AyMV9ET0NfVFlQRS5lcXVhbHMoY210eXBlKSkgewotCQkJQ01OYW1lc3BhY2VJbXBsIGoyMW5zID0gbmV3IENNTmFtZXNwYWNlSW1wbChKU1AyMU5hbWVzcGFjZS5KU1AyMV9VUkksIEpTUDExTmFtZXNwYWNlLkpTUF9UQUdfUFJFRklYKTsKLQkJCUpDTTIxRG9jSW1wbCBqc3AyMWRvYyA9IG5ldyBKQ00yMURvY0ltcGwoQ01Eb2NUeXBlLkpTUDIxX0RPQ19UWVBFLCBqMjFucyk7Ci0JCQlyZXR1cm4ganNwMjFkb2M7Ci0JCX0KLQotCQllbHNlIGlmIChDTURvY1R5cGUuVEFHMjBfRE9DX1RZUEUuZXF1YWxzKGNtdHlwZSkpIHsKLQkJCUNNTmFtZXNwYWNlSW1wbCBqMjBucyA9IG5ldyBDTU5hbWVzcGFjZUltcGwoSlNQMjBOYW1lc3BhY2UuSlNQMjBfVVJJLCBKU1AxMU5hbWVzcGFjZS5KU1BfVEFHX1BSRUZJWCk7Ci0JCQlUYWdDTURvY0ltcGwgdGFnMjBkb2MgPSBuZXcgVGFnQ01Eb2NJbXBsKENNRG9jVHlwZS5UQUcyMF9ET0NfVFlQRSwgajIwbnMpOwotCQkJcmV0dXJuIHRhZzIwZG9jOwotCQl9Ci0KLQkJZWxzZSBpZiAoQ01Eb2NUeXBlLkpTUDExX0RPQ19UWVBFLmVxdWFscyhjbXR5cGUpIHx8IENNRG9jVHlwZS5KU1AxMl9ET0NfVFlQRS5lcXVhbHMoY210eXBlKSkgewotCQkJaWYgKGpzcDExZG9jID09IG51bGwpIHsKLQkJCQlDTU5hbWVzcGFjZUltcGwgajExbnMgPSBuZXcgQ01OYW1lc3BhY2VJbXBsKEpTUDExTmFtZXNwYWNlLkpTUDExX1VSSSwgSlNQMTFOYW1lc3BhY2UuSlNQX1RBR19QUkVGSVgpOwotCQkJCWpzcDExZG9jID0gbmV3IEpDTURvY0ltcGwoQ01Eb2NUeXBlLkpTUDExX0RPQ19UWVBFLCBqMTFucyk7Ci0JCQl9Ci0JCQlyZXR1cm4ganNwMTFkb2M7Ci0JCX0KLQotCQllbHNlIGlmIChDTURvY1R5cGUuQ0hUTUxfRE9DX1RZUEUuZXF1YWxzKGNtdHlwZSkpIHsKLQkJCUNNTmFtZXNwYWNlSW1wbCBjSDQwbnMgPSBuZXcgQ01OYW1lc3BhY2VJbXBsKEhUTUw0ME5hbWVzcGFjZS5IVE1MNDBfVVJJLCBIVE1MNDBOYW1lc3BhY2UuSFRNTDQwX1RBR19QUkVGSVgpOwotCQkJQ0hDTURvY0ltcGwgY2h0bWxkb2MgPSBuZXcgQ0hDTURvY0ltcGwoQ01Eb2NUeXBlLkNIVE1MX0RPQ19UWVBFLCBjSDQwbnMpOwotCQkJcmV0dXJuIGNodG1sZG9jOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQ01Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2MjNlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0vKioKLSAqIEluIEhUTUwgRG9jdW1lbnRzLCBuYW1lIGFuZCB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUvZWxlbWVudC9lbnRpdHkKLSAqIHNob3VsZCBiZSB0cmVhdGVkIGlnbm9yaW5nIHRoZWlycyBjYXNlLiAgSG93ZXZlciwgaW4gWE1MIGRvY3VtZW50cywKLSAqIHRoZXkgc2hvdWxkIGJlIGRpc3Rpbmd1aXNoZWQgd2l0aCBzZW5zaXRpdmVuZXNzIG9mIHRoZWlyIGNhc2UuCi0gKiBDTU5vZGUgaXMgYmFzaWNhbGx5IGRlc2lnbmVkIHRvIHJlcHJlc2VudCBEVERzIG9yIFNjaGVtYXMgZm9yIFhNTAotICogZG9jdW1lbnRzLiAgU28sIGl0IGRvZXNuJ3QgaGF2ZSBpbnRlcmZhY2VzIHRvIHJldHJpZXZlIHN1Y2ggaW5mb3JtYXRpb24uCi0gKiBIb3dldmVyLCBkZWNsYXJhdGlvbnMgaW4gdGhlIEhUTUwgQ00gc2hvdWxkIHByb3ZpZGUgc3VjaCBpbmZvcm1hdGlvbi4KLSAqIFRoaXMgaW50ZXJtZWRpYXRlIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHdoZXRoZXIgaWdub3JlIGNhc2VzCi0gKiBvciBub3QuPGJyPgotICovCi1pbnRlcmZhY2UgSFRNTENNTm9kZSBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlIHsKLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4sIGlmIGRlY2xhcmF0aW9uIGlzIGZvciBIVE1MIGF0dHJpYnV0ZS9lbGVtZW50L2VudGl0eS4KLQkgKiBPdGhlcndpc2UsIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gc2hvdWxkSWdub3JlQ2FzZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRWxlbURlY2xJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxFbGVtRGVjbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y1YTliNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxFbGVtRGVjbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYWxsIEhlZD8/Pz8gY2xhc3Nlcy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSFRNTEVsZW1EZWNsSW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBIVE1MRWxlbWVudERlY2xhcmF0aW9uLCBIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiB7Ci0KLQkvLyBEVEQKLQlwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGF0dHJpYnV0ZXMgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9FTVBUWTsKLQkvKiogTmV2ZXIgYWNjZXNzIHRoaXMgZmllbGQgZGlyZWN0bHkuICBJbnN0ZWFkLCB1c2UgZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uIG1ldGhvZC4gKi8KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIENNR3JvdXBJbXBsIGluY2x1c2lvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIENNR3JvdXBJbXBsIGV4Y2x1c2lvbiA9IG51bGw7Ci0JLy8gYWR2YW5jZWQgaW5mb3JtYXRpb24KLQlwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXAgcHJvaGliaXRlZEFuY2VzdG9ycyA9IG51bGw7Ci0JcHJvdGVjdGVkIGludCBjb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfTk9ORTsKLQlwcm90ZWN0ZWQgaW50IGZvcm1hdFR5cGUgPSBGT1JNQVRfSFRNTDsKLQlwcm90ZWN0ZWQgaW50IGxheW91dFR5cGUgPSBMQVlPVVRfTk9ORTsKLQlwcm90ZWN0ZWQgaW50IG9taXRUeXBlID0gT01JVF9OT05FOwotCXByb3RlY3RlZCBib29sZWFuIGtlZXBTcGFjZXMgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbmRlbnRDaGlsZCA9IGZhbHNlOwotCXByb3RlY3RlZCBFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIEF0dHJpYnV0ZUNvbGxlY3Rpb24gYXR0cmlidXRlQ29sbGVjdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGlzX29ic29sZXRlID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBDTU5hbWVkTm9kZU1hcCBFTVBUWV9NQVAgPSBuZXcgQ01OYW1lZE5vZGVNYXAoKSB7Ci0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJCXJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJCX0KLQkJCX07Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogSFRNTEVsZW1EZWNsSW1wbCBjb25zdHJ1Y3Rvci4KLQkgKiBJbiB0aGUgSFRNTCBEVEQsIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gaGFzIG5vIHNwZWNpZmljYXRpb24KLQkgKiBmb3IgaXRzIG9jY3VycmVuY2UuICBPY2N1cnJlbmNlIGlzIHNwZWNpZmVkIGluIGNvbnRlbnQgbW9kZWwsIGxpa2UKLQkgKiA8Y29kZT4oTEkpKzwvY29kZT4uICBUbyBhdm9pZCBjb25mdXNpb24gKGFuZCBjb21wbGV4aXR5KSwKLQkgKiBvY2N1cnJlbmNlIG9mIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgYWx3YXlzIDEgKGl0IG1lYW5zLCBtaW4gPSAxIGFuZAotCSAqIG1heCA9IDEpLiAgSW5zdGVhZCwgb2NjdXJyZW5jZSBvZiBDTUdyb3VwIHJlcHJlc2VudHMgYWN0dWFsIG9jY3VycmVuY2UKLQkgKiBvZiB0aGUgY29udGVudC4KLQkgKiA8YnI+Ci0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBIVE1MRWxlbURlY2xJbXBsKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgMSwgMSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbiA9IGNvbGxlY3Rpb24uZ2V0QXR0cmlidXRlQ29sbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOwotCi0JcHJpdmF0ZSBDb21wbGV4VHlwZURlZmluaXRpb24gY3JlYXRlQ29tcGxleFR5cGVEZWZpbml0aW9uKCkgewotCQlpZiAodHlwZURlZmluaXRpb25OYW1lLmVxdWFscyhDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0NEQVRBKSB8fCB0eXBlRGVmaW5pdGlvbk5hbWUuZXF1YWxzKENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRU1QVFkpIHx8IHR5cGVEZWZpbml0aW9uTmFtZS5lcXVhbHMoQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9QQ0RBVEEpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBmYWN0b3J5ID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhdGFsIGVycm9yLgotCi0JCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBmYWN0b3J5LmNyZWF0ZVR5cGVEZWZpbml0aW9uKHR5cGVEZWZpbml0aW9uTmFtZSwgZWxlbWVudENvbGxlY3Rpb24pOwotCQlyZXR1cm4gZGVmOwotCX0KLQotCS8qKgotCSAqIEdldCBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCk7Ci0JCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOyAvLyBmYWlsIHRvIGNyZWF0ZQotCQl9Ci0KLQkJQ01Ob2RlIGNtbm9kZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJaWYgKGNtbm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAoSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGU7IC8vIGFscmVhZHkgZXhpc3RzLgotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQljcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKTsgLy8gbGF6eSBldmFsLgotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYW4gaW5zdGFuY2Ugb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICovCi0JcHJpdmF0ZSBDb21wbGV4VHlwZURlZmluaXRpb24gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCkgewotCQlpZiAodHlwZURlZmluaXRpb24gPT0gbnVsbCkKLQkJCXR5cGVEZWZpbml0aW9uID0gY3JlYXRlQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0JCXJldHVybiB0eXBlRGVmaW5pdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50Ljxicj4KLQkgKiBFbGVtZW50IGRlY2xhcmF0aW9ucyB3aGljaCB0eXBlIGlzIEVNUFRZIG9yIENEQVRBIChtYXliZSBQQ0RBVEEpCi0JICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBhbHdheXMgcmV0dXJuIG51bGwuCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyB0cmllcyB0byBjcmVhdGUgYSBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbgotCSAqIGluc3RhbmNlIGFuZCBhY2Nlc3MgdG8gaXQuCi0JICogPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOyAvLyBsYXp5IGV2YWwuCi0JCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldENvbnRlbnQoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCB0eXBlLjxicj4KLQkgKiBFbGVtZW50IGRlY2xhcmF0aW9ucyB3aGljaCB0eXBlIGlzIEVNUFRZIG9yIENEQVRBIChtYXliZSBQQ0RBVEEpCi0JICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgdHlwZS4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHRyaWVzIHRvIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uCi0JICogaW5zdGFuY2UgYW5kIGFjY2VzcyB0byBpdC4KLQkgKiA8YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOyAvLyBsYXp5IGV2YWwuCi0JCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldENvbnRlbnRUeXBlKCkgOiBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24jZ2V0Q29ycmVjdGlvblR5cGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvcnJlY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gY29ycmVjdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogSFRNTCBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZGF0YSB0eXBlLiAgU28sIHRoaXMgbWV0aG9kIGFsd2F5cwotCSAqIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTURhdGFUeXBlIGdldERhdGFUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogQWxtb3N0IGVsZW1lbnRzIGRvbid0IGhhdmUgYSBleGNsdXNpb24uCi0JICogT25seSBjbGFzc2VzIHRob3NlIGhhdmUgZXhjbHVzaW9uIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBmb3JtYXQgdHlwZSBpcyA8Y29kZT5GT1JNQVRfSFRNTDwvY29kZT4uPGJyPgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Rm9ybWF0VHlwZSgpIHsKLQkJcmV0dXJuIGZvcm1hdFR5cGU7Ci0JfQotCi0JLyoqCi0JICogSW5jbHVzaW9uLgotCSAqIEFsbW9zdCBlbGVtZW50cyBkb24ndCBoYXZlIGEgaW5jbHVzaW9uLgotCSAqIE9ubHkgY2xhc3NlcyB0aG9zZSBoYXZlIGluY2x1c2lvbiBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRJbmNsdXNpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGF5b3V0VHlwZSgpIHsKLQkJcmV0dXJuIGxheW91dFR5cGU7Ci0JfQotCi0JLyoqCi0JICogTGluZSBicmVhayBoaW50IGlzIHN0cm9uZ2x5IHJlbGF0ZWQgdG8gbGF5b3V0IHR5cGUuCi0JICogSW5kZWVkLCBpbiB0aGUgQysrRE9NLCBpdCBpcyBkZXRlcm1pbmVkIGZyb20gbGF5b3V0IHR5cGUgb25seS4KLQkgKiBTbywgdGhpcyBpbXBsZW1lbnRhdGlvbiwgYXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIGFsbCBkZWNsYXJhdGlvbnMsCi0JICogYWxzbyBkZXRlcm1pbmVzIGZyb20gbGF5b3V0IHR5cGUgb25seS48YnI+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVCcmVha0hpbnQoKSB7Ci0JCXN3aXRjaCAoZ2V0TGF5b3V0VHlwZSgpKSB7Ci0JCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0JMT0NLIDoKLQkJCQlyZXR1cm4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19CRUZPUkVfU1RBUlRfQU5EX0FGVEVSX0VORDsKLQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQlJFQUsgOgotCQkJCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0FGVEVSX1NUQVJUOwotCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU4gOgotCQkJCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfTk9ORTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vIEhUTUwgZWxlbWVudCBoYXMgbG9jYWwgZWxlbWVudHMuICBTbywgdGhpcyBtZXRob2QgYWx3YXlzCi0JICogcmV0dXJucyBhbiBlbXB0eSBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCXJldHVybiBFTVBUWV9NQVA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9taXRUeXBlKCkgewotCQlyZXR1cm4gb21pdFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCXJldHVybiBFTVBUWV9NQVA7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5DT05URU5UX0hJTlQpKSB7Ci0JCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0JCQlyZXR1cm4gKGRlZiAhPSBudWxsKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX09CU09MRVRFKSkgewotCQkJcmV0dXJuIGlzX29ic29sZXRlOwotCQl9Ci0JCWVsc2UgewotCQkJUHJvcGVydHlQcm92aWRlciBwcCA9IFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmdldFByb3ZpZGVyKHByb3BlcnR5TmFtZSk7Ci0JCQlpZiAocHAgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gcHAuc3VwcG9ydHModGhpcyk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuQ09OVEVOVF9ISU5UKSkgewotCQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotCQkJcmV0dXJuIChkZWYgIT0gbnVsbCkgPyBkZWYuZ2V0UHJpbWFyeUNhbmRpZGF0ZSgpIDogbnVsbDsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfT0JTT0xFVEUpKXsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihpc19vYnNvbGV0ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQcm9wZXJ0eVByb3ZpZGVyIHBwID0gUHJvcGVydHlQcm92aWRlckZhY3RvcnkuZ2V0UHJvdmlkZXIocHJvcGVydHlOYW1lKTsKLQkJCWlmIChwcCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIHBwLmdldCh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBlbGVtZW50IG5hbWVzIHdoaWNoIHRlcm1pbmF0ZXMgdGhpcyBlbGVtZW50Ljxicj4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRydWUgd2hlbiB0aGUgZWxlbWVudCBpcyBhIEpTUCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSlNQKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW4gc29tZSBlbGVtZW50cywgc3VjaCBhcyBBUFBMRVQsIGEgc291cmNlIGdlbmVyYXRvciBzaG91bGQgaW5kZW50IGNoaWxkCi0JICogZWxlbWVudHMgdGhhdCB0aGVpciBwYXJlbnRzLiAgVGhhdCBpcywgYSBzb3VyY2UgZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZQotCSAqIHNvdXJjZSAgb2YgQVBQTEVUIGFuZCBQQVJBTVMgbGlrZSB0aGlzOgotCSAqIDxQUkU+Ci0JICogICAmbHQ7QVBQTEVUIC4uLiZndDsKLQkgKiAgICAgJmx0O1BBUkFNIC4uLiAmZ3Q7Ci0JICogICAgICZsdDtQQVJBTSAuLi4gJmd0OwotCSAqICAgJmx0Oy9BUFBMRVQmZ3Q7Ci0JICogPFBSRT4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpIHsKLQkJcmV0dXJuIGluZGVudENoaWxkOwotCX0KLQotCS8qKgotCSAqIE1vc3Qgb2YgZWxlbWVudHMgY2FuIGNvbXBhY3Qgc3BhY2VzIGluIHRoZWlyIGNoaWxkIHRleHQgbm9kZXMuCi0JICogU29tZSBzcGVjaWFsIGVsZW1lbnRzIHNob3VsZCBrZWVwIHRoZW0gaW4gdGhlaXIgc291cmNlLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZEtlZXBTcGFjZXMoKSB7Ci0JCXJldHVybiBrZWVwU3BhY2VzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFRlcm1pbmF0ZUF0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gbmV4dEVsZW1lbnQpIHsKLQkJSXRlcmF0b3IgaSA9IGdldFRlcm1pbmF0b3JzKCk7Ci0JCWlmIChpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBuZXh0TmFtZSA9IG5leHRFbGVtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJaWYgKG5leHROYW1lLmVxdWFscyhpLm5leHQoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBvYnNvbGV0ZShib29sZWFuIGlzX29ic29sZXRlKXsKLQkJdGhpcy5pc19vYnNvbGV0ZSA9IGlzX29ic29sZXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRWxlbWVudERlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYmYwYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRWxlbWVudERlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBiZSBhIHB1YmxpYyBpbnRlcmZhY2Ugd2hpY2ggaGFzCi0gKiBpbnRlcmZhY2VzIGRlZmluZWQgaW4gYm90aCBvZiB7QGxpbmsgPGNvZGU+Q01FbGVtZW50RGVjbGFyYXRpb248L2NvZGU+fQotICogYW5kIHtAbGluayA8Y29kZT5IVE1MQ01Ob2RlPC9jb2RlPn0uPGJyPgotICogSW4gYWRkaXRpb24gdG8gdGhpcywgc29tZSBpbnRlcmZhY2VzIGFyZSBhZGRlZCB0byB0aGlzIGludGVyZmFjZSwKLSAqIHRob3NlIGFyZSBzcGVjaWFsbHkgdG8gSFRNTCBlbGVtZW50cy48YnI+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBleHRlbmRzIENNRWxlbWVudERlY2xhcmF0aW9uIHsKLQotCS8qKiBUYWcgb21taXNzaW9uOyBOb3Qgb21taXNpYmxlLiAqLwotCWludCBPTUlUX05PTkUgPSAwOwotCS8qKiBUYWcgb21taXNzaW9uOyBCb3RoIHRhZ3MgYXJlIG9tbWlzaWJsZS4gKi8KLQlpbnQgT01JVF9CT1RIID0gMTsKLQkvKiogVGFnIG9tbWlzc2lvbjsgVGhlIGVuZCB0YWcgaXMgb21taXNpYmxlLiAqLwotCWludCBPTUlUX0VORCA9IDI7Ci0JLyoqIFRhZyBvbW1pc3Npb247IFRoZSBlbmQgdGFnIGlzIG9tbWl0dGVkIHdoZW4gY3JlYXRlZC4gKi8KLQlpbnQgT01JVF9FTkRfREVGQVVMVCA9IDM7Ci0JLyoqIFRhZyBvbW1pc3Npb247IFRoZSBlbmQgdGFnIG11c3QgYmUgb21pdHRlZC4gKi8KLQlpbnQgT01JVF9FTkRfTVVTVCA9IDQ7Ci0JLyoqIExpbmUgQnJlYWs7IE5vIGJyZWFrLiAqLwotCWludCBCUkVBS19OT05FID0gMTA7Ci0JLyoqIExpbmUgQnJlYWs7IEJyZWFrIGFmdGVyIHRoZSBzdGFydCB0YWcuICovCi0JaW50IEJSRUFLX0FGVEVSX1NUQVJUID0gMTE7Ci0JLyoqIExpbmUgQnJlYWs7IEJyZWFrIGJvdGggYmVmb3JlIHRoZSBzdGFydCB0YWduIGFuZCBhZnRlciB0aGUgZW5kIHRhZy4gKi8KLQlpbnQgQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQgPSAxMjsKLQkvKiBMYXlvdXQgKi8KLQkvKiogaW5pdGlhbCB2YWx1ZTsgdGhlIHZhbHVlIHNob3VsZCBuZXZlciByZXR1cm5zIHRvIGNsaWVudCBwcm9ncmFtcy4gKi8KLQlpbnQgTEFZT1VUX05PTkUgPSAxMDA7Ci0JaW50IExBWU9VVF9CTE9DSyA9IDEwMTsKLQlpbnQgTEFZT1VUX1dSQVAgPSAxMDI7Ci0JLyoqIE5vIHdyYXAgb2JqZWN0OyBsaWtlIElNRywgQVBQTEVULC4uLiAqLwotCWludCBMQVlPVVRfT0JKRUNUID0gMTAzOwotCS8qKiBCUiAqLwotCWludCBMQVlPVVRfQlJFQUsgPSAxMDQ7Ci0JLyoqIEhpZGRlbiBvYmplY3Q7IGxpa2UgSFRNTCBvciBIRUFEICovCi0JaW50IExBWU9VVF9ISURERU4gPSAxMDU7Ci0JLyogQ29ycmVjdGlvbiAqLwotCS8qKiBDb3JyZWN0OyBObyBjb3JyZWN0LiAqLwotCWludCBDT1JSRUNUX05PTkUgPSAxMDAwOwotCS8qKiBDb3JyZWN0OyBNZWFuaW5nbGVzcyB3aGVuIHRoZSBjb250ZW50IGlzIGVtcHR5LiAqLwotCWludCBDT1JSRUNUX0VNUFRZID0gMTAwMTsKLQkvKiogQ29ycmVjdDsgTWVhbmluZ2xlc3Mgd2hlbiBubyBhdHRyaWJ1dCBpcyBzZXQuICovCi0JaW50IENPUlJFQ1RfTkVVVFJBTCA9IDEwMDI7Ci0JLyoqIENvcnJlY3Q7IE1lYW5pbmdsZXNzIHdoZW4gc2FtZSBlbGVtZW50IGlzIG5lc3RlZC4gKi8KLQlpbnQgQ09SUkVDVF9EVVBMSUNBVEVEID0gMTAwMzsKLQkvKiogRm9ybWF0OyBIVE1MICovCi0JaW50IEZPUk1BVF9IVE1MID0gMTAwMDA7Ci0JLyoqIEZvcm1hdDsgU1NJICovCi0JaW50IEZPUk1BVF9TU0kgPSAxMDAwMTsKLQkvKiogRm9ybWF0OyBKU1Agc2NyaXB0ICovCi0JaW50IEZPUk1BVF9KU1BfU0NSSVBUID0gMTAwMDI7Ci0JLyoqIEZvcm1hdDsgSlNQIGRpcmVjdGl2ZSAqLwotCWludCBGT1JNQVRfSlNQX0RJUkVDVElWRSA9IDEwMDAzOwotCS8qKiBGb3JtYXQ7IFhNTCAqLwotCWludCBGT1JNQVRfWE1MID0gMTAwMDQ7Ci0JLyoqIEZvcm1hdDsgTVcgKi8KLQlpbnQgRk9STUFUX01XID0gMTAwMDU7Ci0KLQkvKioKLQkgKiBBIHNob3J0IGhhbmQgbWV0aG9kIHRvIGdldCBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24gb2YgYSBIVE1MIGVsZW1lbnQuCi0JICogQHBhcmFtIGF0dHJOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oU3RyaW5nIGF0dHJOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVudGl0eURlY2xJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxFbnRpdHlEZWNsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDNkYjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVudGl0eURlY2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLQotCi0vKioKLSAqLwotY2xhc3MgSFRNTEVudGl0eURlY2xJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxFbnRpdHlEZWNsYXJhdGlvbiB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdmFsdWUgPSBudWxsOwotCi0JLyoqCi0JICogQ01FbnRpdHlEZWNsSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBlbnRpdHlOYW1lIGphdmEubGFuZy5TdHJpbmc7IEVudGl0eSBuYW1lLgotCSAqIEBwYXJhbSBlbnRpdHlWYWx1ZSBqYXZhLmxhbmcuU3RyaW5nOyBWYWx1ZSBzdHJpbmcuCi0JICovCi0JcHVibGljIEhUTUxFbnRpdHlEZWNsSW1wbChTdHJpbmcgZW50aXR5TmFtZSwgU3RyaW5nIGVudGl0eVZhbHVlKSB7Ci0JCXN1cGVyKGVudGl0eU5hbWUpOwotCQl2YWx1ZSA9IGVudGl0eVZhbHVlOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgQ01Ob2RlIHR5cGUuPGJyPgotCSAqIEByZXR1cm4gaW50OyBBbHdheXMgcmV0dXJuIEVOVElUWV9ERUNMQVJBVElPTi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkVOVElUWV9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRWYWx1ZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogRW50aXRpZXMgaW4gSFRNTCBkb2N1bWVudHMgYXJlIGFsd2F5cyB0cmVhdGVkIHdpdGggaWdub3JpbmcgY2FzZXMuCi0JICogQmVjYXVzZSBubyBzcGVjaWFsIGVudGl0aWVzIGFyZSBkZWZpbmVkIGluIEpTUCAxLjAsIHRoaXMgbWV0aG9kCi0JICogY2FuIGFsd2F5cyByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uPGJyPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVudGl0eURlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxFbnRpdHlEZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjdiMmQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVudGl0eURlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGludGVuZGVkIHRvIGJlIGEgcHVibGljIGludGVyZmFjZSB3aGljaCBoYXMKLSAqIGludGVyZmFjZXMgZGVmaW5lZCBpbiBib3RoIG9mIHtAbGluayA8Y29kZT5DTUVudGl0eURlY2xhcmF0aW9uPC9jb2RlPn0KLSAqIGFuZCB7QGxpbmsgPGNvZGU+SFRNTENNTm9kZTwvY29kZT59Ljxicj4KLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MRW50aXR5RGVjbGFyYXRpb24gZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRW50aXR5RGVjbGFyYXRpb24gewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxQcm9wZXJ0eURlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxQcm9wZXJ0eURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OGJmYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MUHJvcGVydHlEZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgY29tbW9ubHkgdXNlZCBpbiBkZWNsYXJhdGlvbiBpbXBsZW1lbnRhdGlvbiwgYW5kIGludGVybmFsIHVzZS4KLSAqIFVzZSBnZXRQcm9wZXJ0eSgpIG1ldGhvZCBmb3IgcHVibGljIHVzZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiB7Ci0JLyoqCi0JICogVG8gZGV0ZXJtaW4gdGhlIHR5cGUsIGxvb2sgdXAgdGhlIGZvbGxvd2luZyBrZXl3b3JkcyBpbiBDKytET00vRFREUGFyc2VyLmNwcDoKLQkgKiA8dWw+Ci0JICogICA8bGk+Q09SUkVDVF9EVVBMSUNBVEVEIC0gPGNvZGU+R1JPVVBfTk9EVVA8L2NvZGU+PC9saT4KLQkgKiAgIDxsaT5DT1JSRUNUX0VNUFRZIC0gPGNvZGU+R1JPVVBfQ09NUEFDVDwvY29kZT48L2xpPgotCSAqICAgPGxpPkNPUlJFQ1RfTkVVVFJBTCAtIDxjb2RlPkdST1VQX05FVVRSQUw8L2NvZGU+PC9saT4KLQkgKiAgIDxsaT5DT1JSRUNUX05PTkUgLSA8Y29kZT4oTi9BKTwvY29kZT48L2xpPgotCSAqIDwvdWw+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0Q29ycmVjdGlvblR5cGUoKTsKLQkvKioKLQkgKiBHZXQgdGhlIGxpc3Qgb2YgZGVjbGFyYXRpb25zIHRob3NlIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZSBjb250ZW50Ljxicj4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50Ci0JICovCi0JQ01Db250ZW50IGdldEV4Y2x1c2lvbigpOwotCS8qKgotCSAqIFRvIGRldGVybWluIHRoZSB0eXBlLCBzZWUgdGhlIGZvbGxvd2luZyBmaWxlcyBpbiB0aGUgQysrRE9NOgotCSAqICAgRWxlbWVudFR5cGUuY3BwIC0gRWxlbWVudFR5cGUjc2V0R3JvdXAoKS4KLQkgKiAgIEVsZW1lbnQuY3BwIC0gRWxlbWVudCNnZXRTdGFydFRhZygpLgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldEZvcm1hdFR5cGUoKTsKLQkvKioKLQkgKiBHZXQgdGhlIGxpc3Qgb2YgZGVjbGFyYXRpb25zIHRob3NlIHNob3VsZCBiZSBpbmNsdWRlZCBpbnRvIHRoZSBjb250ZW50Ljxicj4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50Ci0JICovCi0JQ01Db250ZW50IGdldEluY2x1c2lvbigpOwotCS8qKgotCSAqIFRvIGRldGVybWluIHRoZSB0eXBlLCBsb29rIHVwIHRoZSBmb2xsb3dpbmcga2V5d29yZHMgaW4gQysrRE9NL0RURFBhcnNlci5jcHA6Ci0JICogPHVsPgotCSAqICAgPGxpPkxBWU9VVF9CTE9DSyAtIDxjb2RlPkdST1VQX0JMT0NLPC9jb2RlPjwvbGk+Ci0JICogICA8bGk+TEFZT1VUX0JSRUFLIC0gPGNvZGU+R1JPVVBfQlJFQUs8L2NvZGU+PC9saT4KLQkgKiAgIDxsaT5MQVlPVVRfSElEREVOIC0gPGNvZGU+R1JPVVBfSElEREVOPC9jb2RlPjwvbGk+Ci0JICogICA8bGk+TEFZT1VUX05PTkUgLSA8Y29kZT4oTi9BKTwvY29kZT48L2xpPgotCSAqICAgPGxpPkxBWU9VVF9PQkpFQ1QgLSA8Y29kZT5HUk9VUF9OT1dSQVA8L2NvZGU+PC9saT4KLQkgKiAgIDxsaT5MQVlPVVRfV1JBUCAtIDxjb2RlPihOL0EpPC9jb2RlPjwvbGk+Ci0JICogPC91bD4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRMYXlvdXRUeXBlKCk7Ci0JLyoqCi0JICogVG8gZGV0ZXJtaW5lIHRoZSB0eXBlLCBzZWUgPGNvZGU+RWxlbWVudDo6aXNCcmVha2luZ0JlZm9yZUVsZW1lbnQoKTwvY29kZT4KLQkgKiBhbmQgPGNvZGU+RWxlbWVudDo6aXNCcmVha2luZ0FmdGVyRWxlbWVudCgpPC9jb2RlPiBkZWZpbmVkIGluIEMrK0RPTS9FbGVtZW50LmNwcC48YnI+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0TGluZUJyZWFrSGludCgpOwotCS8qKgotCSAqIFRvIGRldGVybWluZSB0aGUgdHlwZSwgQ2hlY2sgdGhlIEhUTUwgRFRELgotCSAqIEFuZCBsb29rIHVwIDxjb2RlPkdST1VQX05PRU5EPC9jb2RlPiBpbiBDKytET00vRFREUGFyc2VyLmNwcC48YnI+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0T21pdFR5cGUoKTsKLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXAKLQkgKi8KLQlDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCk7Ci0JLyoqCi0JICogcmV0dXJuIHRydWUgd2hlbiB0aGUgZWxlbWVudCBpcyBhIEpTUCBlbGVtZW50LgotCSAqLwotCWJvb2xlYW4gaXNKU1AoKTsKLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIHNob3VsZEluZGVudENoaWxkU291cmNlKCk7Ci0JLyoqCi0JICogU29tZSBlbGVtZW50cyBzaG91bGQga2VlcCBzcGFjZXMgaW4gaXRzIGNoaWxkIHRleHQgbm9kZXMuCi0JICogRm9yIGV4YW1wbGUsIFBSRSBhbmQgVEVYVEFSRUEuICBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUsCi0JICogaWYgYSB0YXJnZXQgZWxlbWVudCBpcyBvbmUgb2Ygc3VjaCBlbGVtZW50cy4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIHNob3VsZEtlZXBTcGFjZXMoKTsKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCBpZiA8Y29kZT5uZXh0RWxlbWVudDwvY29kZT4gdGVybWluYXRlcwotCSAqIHRoZSBjdXJyZW50IGVsZW1lbnQuCi0JICogU29tZSBlbGVtZW50cyBsaWtlIDxjb2RlPlA8L2NvZGU+IHRlcm1pbmF0ZXMgb3RoZXIgPGNvZGU+UDwvY29kZT4uCi0JICogVGhhdCBpcywgd2hlbiA8Y29kZT4mbHQ7UCZndDs8L2NvZGU+IGFwcGVhcnMgYXQgdGhlIG5leHQgdG8gPGNvZGU+UDwvY29kZT4sCi0JICogd2hpY2ggZW5kIHRhZ3MgaXMgb21pdHRlZCwgaXQgcmVwcmVzZW50cyBub3Qgb25seSB0aGUgYmVnaW5uaW5nIG9mIHRoZQotCSAqIG5ldyA8Y29kZT5QPC9jb2RlPiBlbGVtZW50IGJ1dCBhbHNvIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIDxjb2RlPlA8L2NvZGU+LgotCSAqLwotCWJvb2xlYW4gc2hvdWxkVGVybWluYXRlQXQoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBuZXh0RWxlbWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBmYzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEEuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEEgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEEoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSwgY29sbGVjdGlvbik7Ci0JCS8vIENPUlJFQ1RfRU1QVFkgLSBHUk9VUF9DT01QQUNUCi0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy9kaWZmZXJlbnQgc2V0cyBvZiBhdHRyaWJ1dGVzIGZvciBodG1sIDQgJiA1Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BLCBhdHRyaWJ1dGVzKTsKLQkKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+QTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+QTwvY29kZT4gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJQ01Ob2RlIGEgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEpOwotCQlpZiAoYSAhPSBudWxsKQotCQkJZXhjbHVzaW9uLmFwcGVuZENoaWxkKGEpOwotCi0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTn07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQUREUkVTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBRERSRVNTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OTEzZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBRERSRVNTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBBRERSRVNTLgotICovCi1maW5hbCBjbGFzcyBIZWRBRERSRVNTIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQUREUkVTUyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BRERSRVNTLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9BRERSRVNTOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEFQUExFVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBUFBMRVQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE1NDZmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEFQUExFVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIEFQUExFVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkQVBQTEVUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQVBQTEVUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFQUExFVCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfUEFSQU1fQ09OVEFJTkVSOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICogKGNvZGViYXNlICVVUkk7ICNJTVBMSUVEKQotCSAqIChhcmNoaXZlIENEQVRBICNJTVBMSUVEKQotCSAqIChjb2RlIENEQVRBICNJTVBMSUVEKQotCSAqIChvYmplY3QgQ0RBVEEgI0lNUExJRUQpCi0JICogKGFsdCAlVGV4dDsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjUkVRVUlSRUQpCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjUkVRVUlSRUQpCi0JICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKQotCSAqIChoc3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKHZzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAobWF5c2NyaXB0IChtYXlzY3JpcHQpICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWNvcmVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09ERUJBU0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQVJDSElWRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0RFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09CSkVDVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFNQQUNFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZTUEFDRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVlTQ1JJUFR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAlYWxpZ247IC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9ySW1hZ2UoKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQVJFQS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBUkVBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMmU2NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBUkVBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBBUkVBLgotICovCi1maW5hbCBjbGFzcyBIZWRBUkVBIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEFSRUEoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVJFQSwgY29sbGVjdGlvbik7Ci0JCS8vIExBWU9VVF9ISURERU4uCi0JCS8vIEJlY2F1c2UsIEFSRUEgaXMgR1JPVVBfSElEREVOIGluIHRoZSBDKytET00vRFREUGFyc2VyLmNwcC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogQVJFQS4KLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vZGlmZmVyZW50IHNldHMgb2YgYXR0cmlidXRlcyBmb3IgaHRtbCA0ICYgNQotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucyhIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVJFQSwgYXR0cmlidXRlcyk7Ci0JCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCQVNFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJBU0UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUyODgxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJBU0UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBCQVNFLgotICovCi1maW5hbCBjbGFzcyBIZWRCQVNFIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJBU0UoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRSwgY29sbGVjdGlvbik7Ci0JCS8vIExBWU9VVF9ISURERU4uCi0JCS8vIEJlY2F1c2UsIEJBU0UgaXMgR1JPVVBfSElEREVOIGluIHRoZSBDKytET00vRFREUGFyc2VyLmNwcC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogQkFTRS4KLQkgKiAoaHJlZiAlVVJJOyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUYsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFSR0VUfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCQVNFRk9OVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCQVNFRk9OVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzkxMDliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkFTRUZPTlQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotLyoqCi0gKiBCQVNFRk9OVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkQkFTRUZPTlQgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQkFTRUZPTlQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRUZPTlQsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfT0JKRUNUIC0gR1JPVVBfTk9XUkFQLgotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiBCQVNFRk9OVC4KLQkgKiAoaWQgSUQgI0lNUExJRUQpCi0JICogKHNpemUgQ0RBVEEgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGxvY2FseSBkZWZpbmVkLgotCSAqIChjb2xvciAlQ29sb3I7ICNJTVBMSUVEKQotCSAqIChmYWNlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9JRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xPUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GQUNFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKHNpemUgQ0RBVEEgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGxvY2FseSBkZWZpbmVkLgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHRyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJETy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCRE8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNlZTUxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJETy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIEJETy4KLSAqLwotZmluYWwgY2xhc3MgSGVkQkRPIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCRE8oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkRPLCBjb2xsZWN0aW9uKTsKLQkJLy8gQ09SUkVDVF9FTVBUWSAtIEdST1VQX0NPTVBBQ1QKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICogKGxhbmcgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQpCi0JICogKGRpciAobHRyfHJ0bCkgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xBTkd9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAgKGRpciAobHRyfHJ0bCkgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTFRSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9SVEx9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVIsIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkdTT1VORC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCR1NPVU5ELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNzMxZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCR1NPVU5ELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0KLQotZmluYWwgY2xhc3MgSGVkQkdTT1VORCBleHRlbmRzIEhlZEVtcHR5IHsKLQotCXB1YmxpYyBIZWRCR1NPVU5EKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJHU09VTkQsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiAoc3JjLCBDREFUQSwgI0lNUExJRUQpCi0JICogKGxvb3AsIENEQVRBLCAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCS8vIHNyYwotCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IGF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb24oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIGF0dHIpOwotCQkvLyBsb29wCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfSU5GSU5JVEUpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MT09QLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xPT1AsIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkxPQ0tRVU9URS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCTE9DS1FVT1RFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxY2I2MDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCTE9DS1FVT1RFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogQkxPQ0tRVU9URS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQkxPQ0tRVU9URSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJMT0NLUVVPVEUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkxPQ0tRVU9URSwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGNpdGUgJVVSSTsgI0lNUExJRUQpIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0lURX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJPRFkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQk9EWS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzI0YTlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQk9EWS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotCi0vKioKLSAqIEJPRFkuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEJPRFkgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFELCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FU0VULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQk9EWShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0JPVEg7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVib2R5Y29sb3JzOwotCSAqIChvbmxvYWQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9udW5sb2FkICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChiYWNrZ3JvdW5kICVVUkk7ICNJTVBMSUVEKQotCSAqIChtYXJnaW53aWR0aCAlUGl4ZWxzOyAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKiAobWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICNJTVBMSUVEKSAuLiBEMjA1NTE0Ci0JICogKHRvcG1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKSAuLi4uLi4gRDIwNTUxNAotCSAqIChib3R0b21tYXJnaW4sIENEQVRBLCAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKiAobGVmdG1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKSAuLi4uLiBEMjA1NTE0Ci0JICogKHJpZ2h0bWFyZ2luLCBDREFUQSwgI0lNUExJRUQpIC4uLi4gRDIwNTUxNAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAlYm9keWNvbG9yczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRCb2R5Y29sb3JzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05MT0FELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OVU5MT0FELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JBQ0tHUk9VTkQsCi0JCS8vIDw8RDIwNTUxNAotCQkJCQlIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BUkdJTldJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BUkdJTkhFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UT1BNQVJHSU4sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9UVE9NTUFSR0lOLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xFRlRNQVJHSU4sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUklHSFRNQVJHSU4KLQkJLy8gRDIwNTUxNAotCQl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbmNsdXNpb24uCi0JICogIkxhenkgZXZhbC4iPGJyPgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEluY2x1c2lvbigpIHsKLQkJaWYgKGluY2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGluY2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIChJTlN8REVMKQotCQlpbmNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5TLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVMfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGluY2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCXJldHVybiBpbmNsdXNpb247Ci0JfQotCi0JLyoqCi0JICogQk9EWSBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQlIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQlIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmYTZjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0KLS8qKgotICogQlIuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEJSIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJSKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJSLCBjb2xsZWN0aW9uKTsKLQkJLy8gTEFZT1VUX0JSRUFLLgotCQkvLyBCZWNhdXNlLCBCUiBpcyBHUk9VUF9CUkVBSyBpbiB0aGUgQysrRE9NL0RURFBhcnNlci5jcHAuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfQlJFQUs7Ci0JfQotCi0JLyoqCi0JICogQlIuCi0JICogJWNvcmVhdHRyczsKLQkgKiAoY2xlYXIgKGxlZnQgfCBhbGwgfCByaWdodCB8IG5vbmUpIG5vbmUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0JCS8vIGNsZWFyCi0JCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbihIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NMRUFSKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0xFQVIsIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQlVUVE9OLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJVVFRPTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWNlMmNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQlVUVE9OLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIEJVVFRPTi4KLSAqLwotZmluYWwgY2xhc3MgSGVkQlVUVE9OIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQlVUVE9OKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkKLQkJLy9kaWZmZXJlbnQgc2V0cyBvZiBhdHRyaWJ1dGVzIGZvciBodG1sIDQgJiA1Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT04sIGF0dHJpYnV0ZXMpOwotCQotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5GT1JNPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT5GT1JNPC9jb2RlPiBpdHNlbGYuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZmF0YWwKLQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUk0sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JU0lOREVYLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRklFTERTRVQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JRlJBTUV9OwotCQllbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZXhjbHVzaW9uLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0Rm9ybWN0cmwoZXhjbHVzaW9uKTsKLQotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTn07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ0FOVkFTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENBTlZBUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTNmYjFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ0FOVkFTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNTBOYW1lc3BhY2U7Ci0KLQotCi0vKioKLSAqIENBTlZBUy4KLSAqLwotZmluYWwgY2xhc3MgSGVkQ0FOVkFTIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQ0FOVkFTKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNBTlZBUywgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChoZWlnaHQsIHdpZHRoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkKLQkJCi0JCVN0cmluZ1tdIG5hbWVzID0geyBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCB9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENBUFRJT04uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ0FQVElPTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmIwN2RjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ0FQVElPTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotCi0vKioKLSAqIENBUFRJT04uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZENBUFRJT04gZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZENBUFRJT04oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0FQVElPTiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChhbGlnbiAlQ0FsaWduOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckNhcHRpb24oKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ0VOVEVSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENFTlRFUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDUxODRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ0VOVEVSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBDRU5URVIuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZENFTlRFUiBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZENFTlRFUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DRU5URVIsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDT0wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ09MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZjMyMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDT0wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotCi0vKioKLSAqIENPTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkQ09MIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZENPTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0wsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfQkxPQ0suCi0JCS8vIEJlY2F1c2UsIENPTCBpcyBHUk9VUF9CTE9DSyBpbiB0aGUgQysrRE9NL0RURFBhcnNlci5jcHAuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogQ09MLgotCSAqICVhdHRyczsKLQkgKiAoc3BhbiBOVU1CRVIgMSkKLQkgKiAod2lkdGggJU11bHRpTGVuZ3RoOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogJWNlbGxoYWxpZ247Ci0JICogJWNlbGx2YWxpZ247Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKHNwYW4gTlVNQkVSIDEpCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1BBTn07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vICh3aWR0aCAlTXVsdGlMZW5ndGg7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5NVUxUSV9MRU5HVEgpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0dHIpOwotCi0JCS8vICVjZWxsaGFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGxoYWxpZ24oYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsdmFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGx2YWxpZ24oYXR0cmlidXRlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDT0xHUk9VUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDT0xHUk9VUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDJlNzRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ09MR1JPVVAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBDT0xHUk9VUC4KLSAqLwotZmluYWwgY2xhc3MgSGVkQ09MR1JPVVAgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0xHUk9VUCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNBUFRJT04sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USEVBRCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRCT0RZLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEZPT1QsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUn07Ci0KLQlwdWJsaWMgSGVkQ09MR1JPVVAoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ09MR1JPVVAsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0NPTFVNTl9HUk9VUDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORDsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoc3BhbiBOVU1CRVIgMSkKLQkgKiAod2lkdGggJU11bHRpTGVuZ3RoOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogJWNlbGxoYWxpZ247Ci0JICogJWNlbGx2YWxpZ247Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsaGFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGxoYWxpZ24oYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsdmFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGx2YWxpZ24oYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUEFOfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKHdpZHRoICVNdWx0aUxlbmd0aDsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk1VTFRJX0xFTkdUSCk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICogTEkgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENPTU1BTkQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ09NTUFORC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmM3YzAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ09NTUFORC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDUwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogQ09NTUFORC4KLSAqLwotZmluYWwgY2xhc3MgSGVkQ09NTUFORCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZENPTU1BTkQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNTBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ09NTUFORCwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqIENPTU1BTkQuCi0JICogJWF0dHJzOwotCSAqIC8vICh0eXBlICVDb21tYW5kVFlQRTsgY29tbWFuZCB8IGNoZWNrYm94fHJhZGlvKSAKLQkgKiAvLyAobGFiZWwgJUNEQVRBOyAjUkVRVUlSRUQpIAotCSAqIC8vIChpY29uICVVUkk7ICNPUFRJT05BTCkgCi0JICogLy8gKGRpc2FibGVkICVCT09MRUFOOyAjT1BUSU9OQUwpIAotCSAqIC8vIChjaGVja2VkICVCT09MRUFOOyAjT1BUSU9OQUwpIAotCSAqIC8vIChyYWRpb2dyb3VwICVURVhUOyAjT1BUSU9OQUwpIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCS8vICh0eXBlICVDb21tYW5kVFlQRTsgY29tbWFuZCB8IGNoZWNrYm94fHJhZGlvKSAKLQkJLy8gTk9URTogJUlucHV0VHlwZSBpcyBFTlVNOwotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gdmFsdWVzID0ge0hUTUw1ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NPTU1BTkQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NIRUNLQk9YLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9SQURJT307Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBIVE1MNTBOYW1lc3BhY2UuQVRUUl9WQUxVRV9DT01NQU5EKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCQkKLQkJLy8gKGxhYmVsICVDREFUQTsgI1JFUVVJUkVEKSAKLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MQUJFTCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xBQkVMLCBhdHRyKTsKLQotCQkvLyAoaWNvbiAlVVJJOyAjT1BUSU9OQUwpIAotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDUwTmFtZXNwYWNlLkFUVFJfTkFNRV9JQ09OLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw1ME5hbWVzcGFjZS5BVFRSX05BTUVfSUNPTiwgYXR0cik7Ci0KLQkJCi0JCS8vIChkaXNhYmxlZCAlQk9PTEVBTjsgI09QVElPTkFMKSAKLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkJPT0xFQU4pOwotCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0ZBTFNFKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRElTQUJMRUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVNBQkxFRCwgYXR0cik7Ci0KLQkJLy8gKGNoZWNrZWQgJUJPT0xFQU47ICNPUFRJT05BTCkgCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5CT09MRUFOKTsKLQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9GQUxTRSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NIRUNLRUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DSEVDS0VELCBhdHRyKTsKLQotCQkvLyAocmFkaW9ncm91cCAlVEVYVDsgI09QVElPTkFMKSAKLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDUwTmFtZXNwYWNlLkFUVFJfTkFNRV9SQURJT0dST1VQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw1ME5hbWVzcGFjZS5BVFRSX05BTUVfUkFESU9HUk9VUCwgYXR0cik7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkREFUQUxJU1QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkREFUQUxJU1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE2NzFjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERBVEFMSVNULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNTBOYW1lc3BhY2U7Ci0KLS8qKgotICogREFUQUxJU1QuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZERBVEFMSVNUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkREFUQUxJU1QoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNTBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREFUQUxJU1QsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0RBVEFMSVNUOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRERC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRERC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDA0Zjg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkREQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogREQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEREIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkREQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREQsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkRfREVGQVVMVDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogREQgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERFVEFJTFMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkREVUQUlMUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGU4ZjAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkREVUQUlMUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNTBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBIZWRERVRBSUxTIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQlwdWJsaWMgSGVkREVUQUlMUyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERVRBSUxTLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9ERVRBSUxTX0NPTlRBSU5FUjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJQ01Ob2RlIG5vZGUgPSBhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9uKEhUTUw1ME5hbWVzcGFjZS5BVFRSX05BTUVfT1BFTik7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNTBOYW1lc3BhY2UuQVRUUl9OQU1FX09QRU4sIG5vZGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRESVYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRElWLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyY2QyYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRESVYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIERJVi4KLSAqLwotZmluYWwgY2xhc3MgSGVkRElWIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRElWKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJViwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVhbGlnbjsKLQkgKiAlcmVzZXJ2ZWQ7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVhbGlnbjsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvclBhcmFncmFwaCgpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JCS8vICVyZXNlcnZlZDsgLi4uIGVtcHR5Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkREwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkREwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ1ZjJmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogREwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZERMIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkREwoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREwsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0RFRklOSVRJT05fTElTVDsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWFycmF5czsKLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09NUEFDVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Nzk3ZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWREVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBEVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkRFQgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRER9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZERUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRULCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIERUIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRFTUJFRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRFTUJFRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWUzMDFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRU1CRUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotLyoqCi0gKiBFTUJFRC4KLSAqLwotZmluYWwgY2xhc3MgSGVkRU1CRUQgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRFTUJFRChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5FTUJFRCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRU1CRUQ7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogJWNvcmVhdHRyczsKLQkgKiAlZXZlbnRzOwotCSAqIChzcmMgJVVSSTsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoaGVpZ2h0ICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChoc3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKHZzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAobG9vcCBDREFUQSAjSU1QTElFRCkKLQkgKiAoaGlkZGVuIENEQVRBICNJTVBMSUVEKQotCSAqICh2b2x1bWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKGF1dG9zdGFydCAodHJ1ZXxmYWxzZSkgI0lNUExJRUQpCi0JICogKGF1dG9wbGF5ICh0cnVlfGZhbHNlKSAjSU1QTElFRCkKLQkgKiAoYXV0b3NpemUgKHRydWV8ZmFsc2UpICNJTVBMSUVEKQotCSAqIChjb250cm9sbGVyICh0cnVlfGZhbHNlKSB0cnVlKQotCSAqIChzY2FsZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoc2hvd2NvbnRyb2xzICh0cnVlfGZhbHNlKSAjSU1QTElFRCkKLQkgKiAocGxheWNvdW50IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAocmVwZWF0IENEQVRBICNJTVBMSUVEKQotCSAqIChwYW5lbCBDREFUQSAjSU1QTElFRCkKLQkgKiAodGV4dCBDREFUQSAjSU1QTElFRCkKLQkgKiAocGFsZXR0ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAodGV4dGZvY3VzIENEQVRBICNJTVBMSUVEKQotCSAqICh0eXBlIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQkJLy8gJWV2ZW50czsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRFdmVudHMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFNQQUNFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZTUEFDRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MT09QLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hJRERFTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WT0xVTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQVVUT1NUQVJULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FVVE9QTEFZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FVVE9TSVpFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTlRST0xMRVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NBTEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0hPV0NPTlRST0xTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1BMQVlDT1VOVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SRVBFQVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUEFORUwsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEVYVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9QQUxFVFRFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RFWFRGT0NVU307Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCS8vIChzcmMgJVVSSTsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBhdHRyKTsKLQotCQkvLyAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckltYWdlKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQotCQkvLyAodHlwZSBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRW1wdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRW1wdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyNGI4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEVtcHR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBFTVBUWSB0eXBlIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRFbXB0eSBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEVtcHR5KFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRU1QVFk7Ci0JCS8vIEVNUFRZIHR5cGUgaGFzIG5vIGVuZCB0YWcuCi0JCW9taXRUeXBlID0gT01JVF9FTkRfTVVTVDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50Ljxicj4KLQkgKiBFTVBUWSB0eXBlIGFsd2F5cyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDxicj4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50Ci0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50IHR5cGUuPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZJRUxEU0VULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZJRUxEU0VULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMGQ3ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGSUVMRFNFVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogRklFTERTRVQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEZJRUxEU0VUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRklFTERTRVQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRklFTERTRVQsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZJRUxEU0VUOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy9kaWZmZXJlbnQgc2V0cyBvZiBhdHRyaWJ1dGVzIGZvciBodG1sIDQgJiA1Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GSUVMRFNFVCwgYXR0cmlidXRlcyk7Ci0JCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRklHQ0FQVElPTi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGSUdDQVBUSU9OLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNjE2MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGSUdDQVBUSU9OLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw1ME5hbWVzcGFjZTsKLQotcHVibGljIGNsYXNzIEhlZEZJR0NBUFRJT04gZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQlwdWJsaWMgSGVkRklHQ0FQVElPTihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GSUdDQVBUSU9OLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogQXJ0aWNsZS4KLQkgKiAlYXR0cnM7Ci0JICogR2xvYmFsIGF0dHJpYnV0ZXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZJR1VSRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGSUdVUkUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhNDYxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZJR1VSRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDUwTmFtZXNwYWNlOwotCi0vKioKLSAqIEZJR1VSRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkRklHVVJFIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRklHVVJFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZJR1VSRSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRklHVVJFOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JfQotCQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZPTlQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRk9OVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWRkNDU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRk9OVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIEZPTlQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEZPTlQgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEZPTlQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9OVCwgY29sbGVjdGlvbik7Ci0JCS8vIENPUlJFQ1RfRU1QVFkgLSBHUk9VUF9DT01QQUNUCi0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQl9Ci0KLQkvKioKLQkgKiAlY29yZWF0dHJzOwotCSAqICVpMThuOwotCSAqIChzaXplIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkgKiAoZmFjZSBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTE9SLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZBQ0V9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAoc2l6ZSBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRk9STS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGT1JNLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ODZmYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGT1JNLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEZPUk0uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEZPUk0gZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRGT1JNKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUk0sIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoYWN0aW9uICVVUkk7ICNSRVFVSVJFRCkKLQkgKiAobWV0aG9kIChHRVR8UE9TVCkgR0VUKQotCSAqIChlbmN0eXBlICVDb250ZW50VHlwZTsgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCi0JICogKGFjY2VwdCAlQ29udGVudFR5cGVzOyAjSU1QTElFRCkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAob25zdWJtaXQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9ucmVzZXQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKHRhcmdldCAlRnJhbWVUYXJnZXQ7ICNJTVBMSUVEKQotCSAqIChhY2NlcHQtY2hhcnNldCAlQ2hhcnNldHM7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNUSU9OLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01FVEhPRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9FTkNUWVBFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FDQ0VQVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OU1VCTUlULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OUkVTRVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFSR0VULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FDQ0VQVF9DSEFSU0VUfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPkZPUk08L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPkZPUk08L2NvZGU+IGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBmYXRhbAotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCUNNTm9kZSBmb3JtID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNKTsKLQkJaWYgKGZvcm0gIT0gbnVsbCkKLQkJCWV4Y2x1c2lvbi5hcHBlbmRDaGlsZChmb3JtKTsKLQotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUk0sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGUkFNRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGUkFNRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjhmZTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRlJBTUUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBGUkFNRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkRlJBTUUgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRlJBTUUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUUsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfSElEREVOLgotCQkvLyBCZWNhdXNlLCBGUkFNRSBpcyBHUk9VUF9ISURERU4gaW4gdGhlIEMrK0RPTS9EVERQYXJzZXIuY3BwLgotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBGUkFNRS4KLQkgKiAlY29yZWF0dHJzOwotCSAqIChsb25nZGVzYyAlVVJJOyAjSU1QTElFRCkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoc3JjICVVUkk7ICNJTVBMSUVEKQotCSAqIChmcmFtZWJvcmRlciAoMXwwKSAxKQotCSAqIChtYXJnaW53aWR0aCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAobWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChub3Jlc2l6ZSAobm9yZXNpemUpICNJTVBMSUVEKQotCSAqIChzY3JvbGxpbmcgKHllc3xub3xhdXRvKSBhdXRvKQotCSAqIChib3JkZXJjb2xvciAlQ29sb3IgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MT05HREVTQywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GUkFNRUJPUkRFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVJHSU5XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVJHSU5IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTk9SRVNJWkUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NST0xMSU5HLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUkNPTE9SIC8vIEQyMDU1NAotCQl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZSQU1FU0VULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZSQU1FU0VULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MDAwZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGUkFNRVNFVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIEZSQU1FU0VULgotICovCi1maW5hbCBjbGFzcyBIZWRGUkFNRVNFVCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEZSQU1FU0VUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FU0VULCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9GUkFNRVNFVDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlY29yZWF0dHJzOwotCSAqIChyb3dzICVNdWx0aUxlbmd0aHM7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoY29scyAlTXVsdGlMZW5ndGhzOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKG9ubG9hZCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob251bmxvYWQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKGZyYW1lYm9yZGVyICh5ZXN8bm8pICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChib3JkZXJjb2xvciAlQ29sb3IgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICogKGZyYW1lc3BhY2luZyBDREFUQSAjSU1QTElFRCkgLi4uIEQyMTU2ODQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05MT0FELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OVU5MT0FELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVJDT0xPUiwgLy8gRDIwNTUxNAotCQkJCQlIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZSQU1FU1BBQ0lORyAvLyBEMjE1Njg0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCS8vIChyb3dzICVNdWx0aUxlbmd0aHM7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk1VTFRJX0xFTkdUSCk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JPV1MsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ST1dTLCBhdHRyKTsKLQotCQkvLyAoY29scyAlTXVsdGlMZW5ndGhzOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTFMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xTLCBhdHRyKTsKLQotCQkvLyAoZnJhbWVib3JkZXIgKHllc3xubykgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gdmFsdWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1lFUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTk99OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZSQU1FQk9SREVSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBTUVCT1JERVIsIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRmxvd0NvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGbG93Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjExYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGbG93Q29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yICglZmxvdzspKiBjb250YWluZXJzLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRGbG93Q29udGFpbmVyIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRmxvd0NvbnRhaW5lcihTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZMT1dfQ09OVEFJTkVSOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRm9udFN0eWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZvbnRTdHlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODZiMTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRm9udFN0eWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiAlZm9udHN0eWxlOwotICovCi1maW5hbCBjbGFzcyBIZWRGb250U3R5bGUgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEZvbnRTdHlsZShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQklHKSB8fCBlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TTUFMTCkpIHsKLQkJCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJfQotCQllbHNlIHsgLy8gQiwgSSwgVSwgLi4uCi0JCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRFVQTElDQVRFRDsKLQkJfQotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJU3RyaW5nIG15TmFtZSA9IGdldEVsZW1lbnROYW1lKCk7Ci0JCWlmICghbXlOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJJRykgJiYgIW15TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TTUFMTCkpCi0JCQlyZXR1cm4gRU1QVFlfTUFQOwotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSEVBRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIRUFELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MWEwNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIRUFELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIEhUTUwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEhFQUQgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFELCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FU0VULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSEVBRChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFELCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IRUFEOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQkJb21pdFR5cGUgPSBPTUlUX0JPVEg7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXIgY2xhc3MuCi0JICogVGhlIDxjb2RlPkhFQUQ8L2NvZGU+IGVsZW1lbnQgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCSAqIDx0YWJsZT4KLQkgKiA8dGJvZHk+Ci0JICogICA8dHI+Ci0JICogICAgIDx0aD5OQU1FPC90aD48dGg+VFlQRTwvdGg+PHRoPlVTQUdFPC90aD48dGg+REVGQVVMVCAoSU5JVElBTCkgVkFMVUU8L3RoPjx0aD5NRU1PPC90aD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4laTE4bjs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD5wcm9maWxlPC90ZD48dGQ+VVJJPC90ZD48dGQ+I0lNUExJRUQ8L3RkPjx0ZD5OL0E8L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogPC90Ym9keT4KLQkgKiA8L3RhYmxlPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQkJLy8gcHJvZmlsZQotCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlYyA9IGF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb24oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9QUk9GSUxFKTsKLQkJaWYgKGFkZWMgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUFJPRklMRSwgYWRlYyk7Ci0JfQotCi0JLyoqCi0JICogSEVBRCBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSEVBREVSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhFQURFUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTcyYTM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSEVBREVSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw1ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIEhlZEhFQURFUiBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHVibGljIEhlZEhFQURFUihTdHJpbmcgbmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihuYW1lLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+SEVBREVSPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT5IRUFERVI8L2NvZGU+IGFuZCA8Y29kZT5GT09URVI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhdGFsCi0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJQ01Ob2RlIG5vZGUgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQURFUik7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlleGNsdXNpb24uYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCW5vZGUgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPT1RFUik7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlleGNsdXNpb24uYXBwZW5kQ2hpbGQobm9kZSk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFERVIsIEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT09URVJ9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhHUk9VUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIR1JPVVAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiNTFhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhHUk9VUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNTBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotcHVibGljIGNsYXNzIEhlZEhHUk9VUCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JcHVibGljIEhlZEhHUk9VUChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IR1JPVVAsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0hFQURJTkdfQ09OVEFJTkVSOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjhiNWM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSFIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIEhSLgotICovCi1maW5hbCBjbGFzcyBIZWRIUiBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRIUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IUiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzCi0JICogKGFsaWduIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChub3NoYWRlIChub3NoYWRlKSAjSU1QTElFRCkKLQkgKiAoc2l6ZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKGNvbG9yICVDb2xvcjsgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKGFsaWduIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9MRUZULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9DRU5URVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JJR0hUfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCi0JCS8vIHRoZSByZXN0LgotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05PU0hBREUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xPUiAvLyBEMjA1NTE0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzkzZDA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBIVE1MLgotICovCi1maW5hbCBjbGFzcyBIZWRIVE1MIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSFRNTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IVE1MOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQkJb21pdFR5cGUgPSBPTUlUX0JPVEg7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXIgY2xhc3MuCi0JICogVGhlIDxjb2RlPkhUTUw8L2NvZGU+IGVsZW1lbnQgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCSAqIDx0YWJsZT4KLQkgKiA8dGJvZHk+Ci0JICogICA8dHI+Ci0JICogICAgIDx0aD5OQU1FPC90aD48dGg+VFlQRTwvdGg+PHRoPlVTQUdFPC90aD48dGg+REVGQVVMVCAoSU5JVElBTCkgVkFMVUU8L3RoPjx0aD5NRU1PPC90aD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD48Y29kZT4laTE4bjs8L2NvZGU+PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgICAgPHRkPntAbGluayBQRENNRG9jSW1wbCNnZXRBdHRyRGVjbGFyYXRpb25zSTE4bn08L3RkPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPnZlcnNpb248L3RkPjx0ZD5DREFUQTwvdGQ+PHRkPiNGSVhFRDwvdGQ+Ci0JICogICAgIDx0ZD57QGxpbmsgSFRNTF9WRVJTSU9OX1RSQU5TSVRJT05BTH08L3RkPjx0ZD5kZXBsZWNhdGVkIGluIEhUTUw0LjAxPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogPC90Ym9keT4KLQkgKiA8L3RhYmxlPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy9kaWZmZXJlbnQgc2V0cyBvZiBhdHRyaWJ1dGVzIGZvciBodG1sIDQgJiA1Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MLCBhdHRyaWJ1dGVzKTsKLQkKLQkJfQotCi0JLyoqCi0JICogSFRNTCBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSGVhZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIZWFkaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMTdjMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIZWFkaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBIWzEtNl0uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEhlYWRpbmcgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEhlYWRpbmcoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbGwgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSBpbiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHN1cGVyIGNsYXNzLgotCSAqIFRoZSA8Y29kZT5IMTwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVhdHRyczs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4lYWxpZ247PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqIDwvdGJvZHk+Ci0JICogPC90YWJsZT4KLQkgKiA8cD48Yj4lYWxpZ247PC9iPiBtZWFucyA8Y29kZT5hbGlnbiAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeSkgI0lNUExJRUQ8L2NvZGU+LgotCSAqIFVuZm9ydHVuYXRlbHksIHRoaXMgPGNvZGU+YWxpZ248L2NvZGU+IGlzIGRpZmZlcmVudCBmcm9tIG9uZSBpbgotCSAqIDxjb2RlPklNRzwvY29kZT4gb3IgPGNvZGU+VEFCTEU8L2NvZGU+LiAgU28sIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24KLQkgKiBvZiA8Y29kZT5hbGlnbjwvY29kZT4gc2hvdWxkIGJlIGxvY2FseSBjcmVhdGVkIGFuZCBpdCBzaG91bGRuJ3QgYmUgcmVnaXN0ZXJlZAotCSAqIGluIGEgPGNvZGU+SENNRG9jSW1wbDwvY29kZT4gaW5zdGFuY2UuPC9wPgotCSAqIDxwPkhvd2V2ZXIsICVhbGlnbiBpcyB1c2VkIGluIHNldmFyYWwgdGltZXMuICBJIHdvdWxkbid0IHdyaXRlIHNhbWUgY29kZQotCSAqIGluIG1hbnkgdGltZXMuICBTbywgSSBhZGQgYSBuZXcgdXRpbGl0eSBtZXRob2QgaW50byA8Y29kZT5DTVV0aWw8L2NvZGU+Ci0JICogdG8gY3JlYXRlIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyBhbGlnbgotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yUGFyYWdyYXBoKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJRlJBTUUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSUZSQU1FLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNGM1NjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJRlJBTUUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIElGUkFNRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkSUZSQU1FIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSUZSQU1FKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklGUkFNRSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy9kaWZmZXJlbnQgc2V0cyBvZiBhdHRyaWJ1dGVzIGZvciBodG1sIDQgJiA1Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JRlJBTUUsIGF0dHJpYnV0ZXMpOwotCQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTn07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSU1HLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElNRy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzE5NDE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSU1HLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBJTUcuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZElNRyBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRJTUcoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU1HLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogSU1HLgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvL2RpZmZlcmVudCBzZXRzIG9mIGF0dHJpYnV0ZXMgZm9yIGh0bWwgNCAmIDUKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklNRywgYXR0cmlidXRlcyk7Ci0JCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJTlBVVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJTlBVVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDgwMjAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSU5QVVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIElOUFVULgotICovCi1maW5hbCBjbGFzcyBIZWRJTlBVVCBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRJTlBVVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTlBVVCwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqIElOUFVULgotCSAqICVhdHRyczsKLQkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvL2RpZmZlcmVudCBzZXRzIG9mIGF0dHJpYnV0ZXMgZm9yIGh0bWwgNCAmIDUKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOUFVULCBhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT059OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElTSU5ERVguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSVNJTkRFWC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzc0NGQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSVNJTkRFWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogSVNJTkRFWC4KLSAqLwotZmluYWwgY2xhc3MgSGVkSVNJTkRFWCBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRJU0lOREVYKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklTSU5ERVgsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqIElTSU5ERVguCi0JICogJWNvcmVhdHRyczsKLQkgKiAlaTE4bjsKLQkgKiAocHJvbXB0ICVUZXh0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQotCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IGF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb24oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9QUk9NUFQpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9QUk9NUFQsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElubGluZUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJbmxpbmVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwODIyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElubGluZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciAoJWlubGluZTspKiBjb250YWluZXJzLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRJbmxpbmVDb250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqIEhlZElubGluZUNvbnRhaW5lci4KLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEhlZElubGluZUNvbnRhaW5lcihTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0lOTElORV9DT05UQUlORVI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRLRVlHRU4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkS0VZR0VOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NGIzMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRLRVlHRU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw1ME5hbWVzcGFjZTsKLQotcHVibGljIGNsYXNzIEhlZEtFWUdFTiBleHRlbmRzIEhlZEVtcHR5IHsKLQotCXB1YmxpYyBIZWRLRVlHRU4oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNTBOYW1lc3BhY2UuRWxlbWVudE5hbWUuS0VZR0VOLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHsgSFRNTDUwTmFtZXNwYWNlLkFUVFJfTkFNRV9BVVRPRk9DVVMsIEhUTUw1ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0hBTExFTkdFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJU0FCTEVELCBIVE1MNTBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZPUk0sIEhUTUw1ME5hbWVzcGFjZS5BVFRSX05BTUVfS0VZVFlQRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExBQkVMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExBQkVMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMDEwMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMQUJFTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIExBQkVMLgotICovCi1maW5hbCBjbGFzcyBIZWRMQUJFTCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTEFCRUwoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEFCRUwsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoZm9yIElEUkVGICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKGZvciBJRFJFRiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5JRFJFRik7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRk9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRk9SLCBhdHRyKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FDQ0VTU0tFWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkZPQ1VTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OQkxVUn07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5MQUJFTDwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+TEFCRUw8L2NvZGU+IGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCUNNTm9kZSBsYWJlbCA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEFCRUwpOwotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCWV4Y2x1c2lvbi5hcHBlbmRDaGlsZChsYWJlbCk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT04sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MQUJFTH07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTEVHRU5ELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExFR0VORC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTM5MjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTEVHRU5ELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogTEVHRU5ELgotICovCi1maW5hbCBjbGFzcyBIZWRMRUdFTkQgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZExFR0VORChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MRUdFTkQsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKGFsaWduICVMQWxpZ247ICNJTVBMSUVEKSAuLi4gc2h1bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVNTS0VZfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gYWxpZ24KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckxlZ2VuZCgpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMSS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDEzMTkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIExJLgotICovCi1maW5hbCBjbGFzcyBIZWRMSSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRMSShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkRfREVGQVVMVDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy9kaWZmZXJlbnQgc2V0cyBvZiBhdHRyaWJ1dGVzIGZvciBodG1sIDQgJiA1Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSSwgYXR0cmlidXRlcyk7Ci0JCi0JfQotCi0JLyoqCi0JICogTEkgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExJTksuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTElOSy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzI4YmJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTElOSy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0vKioKLSAqIExJTksuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZExJTksgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTElOSyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSU5LLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogTElOSy4KLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gZGlmZmVyZW50IHNldHMgb2YgYXR0cmlidXRlcyBmb3IgaHRtbCA0ICYgNQotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucyhIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTElOSywgYXR0cmlidXRlcyk7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTGlzdEl0ZW1Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTGlzdEl0ZW1Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjY2Y2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExpc3RJdGVtQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGxpc3QgaXRlbSBjb250YWluZXIgZGVjbGFyYXRpb25zLgotICogLSBPTCwgVUwsIE1FTlUsIERJUi4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkTGlzdEl0ZW1Db250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRMaXN0SXRlbUNvbnRhaW5lcihTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0xJX0NPTlRBSU5FUjsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNQVAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUFQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhM2MyYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNQVAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLQotCi0vKioKLSAqIE1BUC4KLSAqLwotZmluYWwgY2xhc3MgSGVkTUFQIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTUFQKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1BUCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfTUFQOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAobmFtZSBDREFUQSAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKG5hbWUgQ0RBVEEgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBhdHRyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE1BUlFVRUUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUFSUVVFRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODY1M2UyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUFSUVVFRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIE1BUlFVRUUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE1BUlFVRUUgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRNQVJRVUVFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1BUlFVRUUsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGJlaGF2aW9yIChzY3JvbGx8c2xpZGV8YWx0ZXJuYXRlKSBzY3JvbGwpCi0JICogKGJnY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkgKiAoZGlyZWN0aW9uIChsZWZ0fHJpZ2h0fHVwfGRvd24pIGxlZnQpCi0JICogKGhlaWdodCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGhzcGFjZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChsb29wIENEQVRBICNJTVBMSUVEKQotCSAqIChzY3JvbGxhbW91bnQgTlVNQkVSICNJTVBMSUVEKQotCSAqIChzY3JvbGxkZWxheSBOVU1CRVIgI0lNUExJRUQpCi0JICogKHZzcGFjZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqICh3aWR0aCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHRydWVzcGVlZCAodHJ1ZXNwZWVkKSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JFSEFWSU9SLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JHQ09MT1IsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRElSRUNUSU9OLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xPT1AsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NST0xMQU1PVU5ULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NDUk9MTERFTEFZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RSVUVTUEVFRH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCS8vIChoZWlnaHQgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgYXR0cik7Ci0KLQkJLy8gKHdpZHRoIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR0cik7Ci0KLQkJLy8gKGhzcGFjZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IU1BBQ0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IU1BBQ0UsIGF0dHIpOwotCi0JCS8vICh2c3BhY2UgTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVlNQQUNFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVlNQQUNFLCBhdHRyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE1FTlUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUVOVS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTJhZjliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUVOVS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBNRU5VL0RJUi4KLSAqLwotZmluYWwgY2xhc3MgSGVkTUVOVSBleHRlbmRzIEhlZExpc3RJdGVtQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRNRU5VKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogTUVOVS9ESVIuCi0JKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvL2RpZmZlcmVudCBzZXRzIG9mIGF0dHJpYnV0ZXMgZm9yIGh0bWwgNCAmIDUKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlUsIGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5NRU5VL0RJUjwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+JWJsb2NrOzwvY29kZT4uCi0JICogJWJsb2NrOyBpczoKLQkgKiBQIHwgJWhlYWRpbmc7IHwgJWxpc3Q7IHwgJXByZWZvcm1hdHRlZDsgfCBETCB8IERJViB8IENFTlRFUiB8Ci0JICogTk9TQ1JJUFQgfCBOT0ZSQU1FUyB8IEJMT0NLUVVPVEUgfCBGT1JNIHwgSVNJTkRFWCB8IEhSIHwKLQkgKiBUQUJMRSB8IEZJRUxEU0VUIHwgQUREUkVTUy4KLQkgKiAlaGVhZGluZzsgaXM6IEgxIHwgSDIgfCBIMyB8IEg0IHwgSDUgfCBINi4KLQkgKiAlbGlzdDsgaXMgOiBVTCB8IE9MIHwgRElSIHwgTUVOVS4KLQkgKiAlcHJlZm9ybWF0dGVkOyBpcyBQUkUuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyAlYmxvY2s7Ci0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDEsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgzLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5INSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg2LCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVUwsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ETCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJViwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNFTlRFUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PU0NSSVBULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9GUkFNRVMsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CTE9DS1FVT1RFLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklTSU5ERVgsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRklFTERTRVQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BRERSRVNTfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGV4Y2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUVUQS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNRVRBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNTU0ZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNRVRBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogTUVUQS4KLSAqLwotZmluYWwgY2xhc3MgSGVkTUVUQSBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRNRVRBKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FVEEsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBNRVRBLgotCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJCi0JCS8vZGlmZmVyZW50IHNldHMgb2YgYXR0cmlidXRlcyBmb3IgaHRtbCA0ICYgNQotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucyhIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVUQSwgYXR0cmlidXRlcyk7Ci0JCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNRVRFUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNRVRFUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzllOWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUVURVIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw1ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSGVkTUVURVIgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JcHVibGljIEhlZE1FVEVSKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FVEVSLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRWxlbURlY2xJbXBsI2NyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHsgSFRNTDUwTmFtZXNwYWNlLkFUVFJfTkFNRV9NSU4sIEhUTUw1ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFYLCBIVE1MNTBOYW1lc3BhY2UuQVRUUl9OQU1FX0xPVywgSFRNTDUwTmFtZXNwYWNlLkFUVFJfTkFNRV9ISUdILCBIVE1MNTBOYW1lc3BhY2UuQVRUUl9OQU1FX09QVElNVU0sIEhUTUw1ME5hbWVzcGFjZS5BVFRSX05BTUVfRk9STSB9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBkZWNsID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFLCBkZWNsKTsKLQl9Ci0KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCUNNTm9kZSBtZXRlciA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNTBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVURVIpOwotCQlpZiAobWV0ZXIgIT0gbnVsbCkKLQkJCWV4Y2x1c2lvbi5hcHBlbmRDaGlsZChtZXRlcik7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRFUn07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNYXJrQ2hhbmdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNYXJrQ2hhbmdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmMzZDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTWFya0NoYW5nZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiAoSU5TfERFTCkKLSAqLwotZmluYWwgY2xhc3MgSGVkTWFya0NoYW5nZXMgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRNYXJrQ2hhbmdlcyhTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoY2l0ZSAlVVJJOyAjSU1QTElFRCkKLQkgKiAoZGF0ZXRpbWUgJURhdGV0aW1lOyAjSU1QTElFRCkgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DSVRFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RBVEVUSU1FfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNYXRoLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE1hdGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0ZGJmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE1hdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDUwTmFtZXNwYWNlOwotCi0KLS8qKgotICogTWF0aC4KLSAqLwotZmluYWwgY2xhc3MgSGVkTWF0aCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1BVEh9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE1hdGgoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNTBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUFUSCwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbGwgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLQkgKiBNYXRoTUwgbmFtZXNwYWNlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogTUFUSCBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTWVkaWFFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE1lZGlhRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDIzYmQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTWVkaWFFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNTBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotLyoqCi0gKiBFTUJFRC4KLSAqLwotY2xhc3MgSGVkTWVkaWFFbGVtZW50IGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTWVkaWFFbGVtZW50KFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfTUVESUFfRUxFTUVOVDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBNZWRpYUVsZW1lbnQKLQkgKiAlYXR0cnM7Ci0JICogKHNyYyAlVVJJOyAjUkVRVUlSRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChwcmVsb2FkICVDREFUQTsgI0lNUExJRUQpIAotCSAqIChhdXRvcGxheSAlRU5VTTsgI0lNUExJRUQpIAotCSAqIChsb29wICVFTlVNOyAjSU1QTElFRCkKLQkgKiAoY29udHJvbHMgJU1lZGlhVHlwZTsgI0lNUExJRUQpCi0JICogR2xvYmFsIGF0dHJpYnV0ZXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCi0JCS8vIChzcmMgJVVSSTsgI1JFUVVJUkVEKTogc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbnVsbDsKLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBhdHRyKTsKLQotCQkvLyhwcmVsb2FkICVDREFUQTsgI0lNUExJRUQpIEVOVU0KLQkJLy8gKG5vbmUgfCBtZXRhZGF0YSB8IGF1dG8pCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTk9ORSwgSFRNTDUwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTUVUQURBVEEsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0FVVE8sIEhUTUw1ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0VNUFRZfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0FVVE8pOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDUwTmFtZXNwYWNlLkFUVFJfTkFNRV9QUkVMT0FELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw1ME5hbWVzcGFjZS5BVFRSX05BTUVfUFJFTE9BRCwgYXR0cik7Ci0KLQkJLy8gKGF1dG9wbGF5IChib29sZWFuKSAjSU1QTElFRCkKLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIGF1dG9QbGF5VmFsdWVzID0ge0hUTUw1ME5hbWVzcGFjZS5BVFRSX05BTUVfQVVUT1BMQVl9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKGF1dG9QbGF5VmFsdWVzKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw1ME5hbWVzcGFjZS5BVFRSX05BTUVfQVVUT1BMQVksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDUwTmFtZXNwYWNlLkFUVFJfTkFNRV9BVVRPUExBWSwgYXR0cik7Ci0KLQkJLy8gKGxvb3AgKHRydWV8ZmFsc2UpICNJTVBMSUVEKQotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gbG9vcFZhbHVlcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9UUlVFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9GQUxTRX07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXMobG9vcFZhbHVlcyk7Ci0JCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfRkFMU0UpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDUwTmFtZXNwYWNlLkFUVFJfTkFNRV9MT09QLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw1ME5hbWVzcGFjZS5BVFRSX05BTUVfTE9PUCwgYXR0cik7Ci0KLQkJLy8gKGNvbnRyb2xzICh0cnVlfGZhbHNlKSAjSU1QTElFRCkKLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIGNvbnRyb2xWYWx1ZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfVFJVRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfRkFMU0V9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKGNvbnRyb2xWYWx1ZXMpOwotCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0ZBTFNFKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw1ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09OVFJPTFMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDUwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT05UUk9MUywgYXR0cik7Ci0KLQkJCi0JCS8vIGdsb2JhbCBhdHRyaWJ1dGVzCi0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PQlIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9CUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmFkYmQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9CUi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBOT0JSIC0tIG5vdCBzdGFuZGFyZCB0YWcgYnV0IGl0IGlzIGNvbW1vbmx5IHVzZWQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE5PQlIgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0KLQlwdWJsaWMgSGVkTk9CUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0JSLCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkNPUlJFQ1RfRFVQTElDQVRFRDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCS8vIE5vIGF0dHJpYnV0ZXMgaXMgZGVmaW5lZC4KLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PRU1CRUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9FTUJFRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDcxMTY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9FTUJFRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotCi0vKioKLSAqIE5PRU1CRUQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE5PRU1CRUQgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWROT0VNQkVEKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PRU1CRUQsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT0ZSQU1FUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT0ZSQU1FUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWQ5MzFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9GUkFNRVMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBOT0ZSQU1FUy4KLSAqLwotZmluYWwgY2xhc3MgSGVkTk9GUkFNRVMgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWROT0ZSQU1FUyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0ZSQU1FUywgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfTk9GUkFNRVNfQ09OVEVOVDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5OT0ZSQU1FUzwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+Tk9GUkFNRVM8L2NvZGU+IGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCUNNTm9kZSBsYWJlbCA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9GUkFNRVMpOwotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCWV4Y2x1c2lvbi5hcHBlbmRDaGlsZChsYWJlbCk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9GUkFNRVN9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PU0NSSVBULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PU0NSSVBULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NDdjMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT1NDUklQVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogTk9TQ1JJUFQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE5PU0NSSVBUIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTk9TQ1JJUFQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9TQ1JJUFQsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPQkpFQ1QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT0JKRUNULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNDhlMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPQkpFQ1QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBPQkpFQ1QuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE9CSkVDVCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE9CSkVDVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PQkpFQ1QsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1BBUkFNX0NPTlRBSU5FUjsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJXJlc2VydmVkOyAuLi4gZW1wdHkuCi0JICogKGRlY2xhcmUgKGRlY2xhcmUpICNJTVBMSUVEKQotCSAqIChjbGFzc2lkICVVUkk7ICNJTVBMSUVEKQotCSAqIChjb2RlYmFzZSAlVVJJOyAjSU1QTElFRCkKLQkgKiAoZGF0YSAlVVJJOyAjSU1QTElFRCkKLQkgKiAodHlwZSAlQ29udGVudFR5cGU7ICNJTVBMSUVEKQotCSAqIChjb2RldHlwZSAlQ29udGVudFR5cGU7ICNJTVBMSUVEKQotCSAqIChhcmNoaXZlIENEQVRBICNJTVBMSUVEKQotCSAqIChzdGFuZGJ5ICVUZXh0OyAjSU1QTElFRCkKLQkgKiAoaGVpZ2h0ICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAodXNlbWFwICVVUkk7ICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqICh0YWJpbmRleCBOVU1CRVIgI0lNUExJRUQpCi0JICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChoc3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKHZzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gJXJlc2VydmVkOyAuLi4gZW1wdHkuCi0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ERUNMQVJFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NMQVNTSUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09ERUJBU0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfREFUQSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPREVUWVBFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FSQ0hJVkUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1RBTkRCWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVVNFTUFQLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFCSU5ERVgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hTUEFDRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WU1BBQ0V9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJLy8gJWFsaWduOyAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckltYWdlKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNmQ1MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogT0wuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE9MIGV4dGVuZHMgSGVkTGlzdEl0ZW1Db250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE9MKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9MLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBPTC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvL2RpZmZlcmVudCBzZXRzIG9mIGF0dHJpYnV0ZXMgZm9yIGh0bWwgNCAmIDUKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9MLCBhdHRyaWJ1dGVzKTsKLQkKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPUFRHUk9VUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPUFRHUk9VUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2EzZmMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT1BUR1JPVVAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotCi0vKioKLSAqIE9QVEdST1VQLgotICovCi1maW5hbCBjbGFzcyBIZWRPUFRHUk9VUCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE9QVEdST1VQKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVEdST1VQLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9PUFRJT05fQ09OVEFJTkVSOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkgKiAobGFiZWwgJVRleHQ7ICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVNBQkxFRH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIChsYWJlbCAlVGV4dDsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MQUJFTCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xBQkVMLCBhdHRyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9QVElPTi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPUFRJT04uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIyNWVlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9QVElPTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBPUFRJT04uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE9QVElPTiBleHRlbmRzIEhlZFBjZGF0YSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRPUFRJT04oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JCW9taXRUeXBlID0gT01JVF9FTkQ7Ci0JfQotCi0JLyoqCi0JICogT1BUSU9OLgotCSAqICVhdHRyczsKLQkgKiAoc2VsZWN0ZWQgKHNlbGVjdGVkKSAjSU1QTElFRCkKLQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkgKiAobGFiZWwgJVRleHQ7ICNJTVBMSUVEKQotCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NFTEVDVEVELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJU0FCTEVELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xBQkVMLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogT1BUSU9OIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPVVRQVVQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT1VUUFVULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMTcyZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPVVRQVVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw1ME5hbWVzcGFjZTsKLQotcHVibGljIGNsYXNzIEhlZE9VVFBVVCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQlwdWJsaWMgSGVkT1VUUFVUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9VVFBVVCwgY29sbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRk9SLCBIVE1MNTBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZPUk0sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBmZWVkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFAuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFAgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiB0ZXJtaW5hdG9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkUChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QLCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbGwgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSBpbiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHN1cGVyIGNsYXNzLgotCSAqIFRoZSA8Y29kZT5QPC9jb2RlPiBlbGVtZW50IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKLQkgKiA8dGFibGU+Ci0JICogPHRib2R5PgotCSAqICAgPHRyPgotCSAqICAgICA8dGg+TkFNRTwvdGg+PHRoPlRZUEU8L3RoPjx0aD5VU0FHRTwvdGg+PHRoPkRFRkFVTFQgKElOSVRJQUwpIFZBTFVFPC90aD48dGg+TUVNTzwvdGg+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+JWF0dHJzOzwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVhbGlnbjs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogPC90Ym9keT4KLQkgKiA8L3RhYmxlPgotCSAqIDxwPjxiPiVhbGlnbjs8L2I+IG1lYW5zIDxjb2RlPmFsaWduIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5KSAjSU1QTElFRDwvY29kZT4uCi0JICogVW5mb3J0dW5hdGVseSwgdGhpcyA8Y29kZT5hbGlnbjwvY29kZT4gaXMgZGlmZmVyZW50IGZyb20gb25lIGluCi0JICogPGNvZGU+SU1HPC9jb2RlPiBvciA8Y29kZT5UQUJMRTwvY29kZT4uICBTbywgdGhlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbgotCSAqIG9mIDxjb2RlPmFsaWduPC9jb2RlPiBzaG91bGQgYmUgbG9jYWx5IGNyZWF0ZWQgYW5kIGl0IHNob3VsZG4ndCBiZSByZWdpc3RlcmVkCi0JICogaW4gYSA8Y29kZT5IQ01Eb2NJbXBsPC9jb2RlPiBpbnN0YW5jZS48L3A+Ci0JICogPHA+SG93ZXZlciwgJWFsaWduIGlzIHVzZWQgaW4gc2V2YXJhbCB0aW1lcy4gIEkgd291bGRuJ3Qgd3JpdGUgc2FtZSBjb2RlCi0JICogaW4gbWFueSB0aW1lcy4gIFNvLCBJIGFkZCBhIG5ldyB1dGlsaXR5IG1ldGhvZCBpbnRvIDxjb2RlPkNNVXRpbDwvY29kZT4KLQkgKiB0byBjcmVhdGUgdGhlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi48L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gYWxpZ24KLQkJSFRNTEF0dHJEZWNsSW1wbCBhZGVjID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvclBhcmFncmFwaCgpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhZGVjKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gbmFtZXMgb2YgdGVybWluYXRvcnMuCi0JICogPGNvZGU+UDwvY29kZT4gaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlpZiAodGVybWluYXRvcnMgIT0gbnVsbCkKLQkJCXJldHVybiB0ZXJtaW5hdG9ycy5pdGVyYXRvcigpOwotCQkvLzw8RDIxNzk4MgotCQl0ZXJtaW5hdG9ycyA9IG5ldyBWZWN0b3IoKTsKLQkJdGVybWluYXRvcnMuYWRkQWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVzT2ZCbG9jaygpKTsKLQkJdGVybWluYXRvcnMuYWRkKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSSk7Ci0JCXRlcm1pbmF0b3JzLmFkZChIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQpOwotCQl0ZXJtaW5hdG9ycy5hZGQoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREKTsKLQkJLy9EMjE3OTgyCi0JCXJldHVybiB0ZXJtaW5hdG9ycy5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUEFSQU0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUEFSQU0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjZWE3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBBUkFNLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLS8qKgotICogUEFSQU0uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFBBUkFNIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFBBUkFNKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogUEFSQU0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvL2RpZmZlcmVudCBzZXRzIG9mIGF0dHJpYnV0ZXMgZm9yIGh0bWwgNCAmIDUKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNLCBhdHRyaWJ1dGVzKTsKLQkKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQUkUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUFJFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYTM0NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQUkUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBQUkUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFBSRSBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKiBQUkUgZWxlbWVudCBzaG91bGQga2VlcCBzcGFjZXMgaW4gaXRzIHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgSGVkUFJFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRSwgY29sbGVjdGlvbik7Ci0JCS8vIENPUlJFQ1RfRU1QVFkgLSBHUk9VUF9DT01QQUNUCi0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQotCQlrZWVwU3BhY2VzID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKHdpZHRoIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICh3aWR0aCBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+UFJFPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT4lcHJlLmV4Y2x1c2lvbjs8L2NvZGU+LgotCSAqICVwcmUuZXhjbHVzaW9uIGlzOgotCSAqIElNRyB8IE9CSkVDVCB8IEFQUExFVCB8IEJJRyB8IFNNQUxMIHwgU1VCIHwgU1VQIHwgRk9OVCB8IEJBU0VGT05UCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU1HLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0JKRUNULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVBQTEVULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQklHLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU01BTEwsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVUIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVVAsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT05ULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRUZPTlR9OwotCQllbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZXhjbHVzaW9uLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBST0dSRVNTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBST0dSRVNTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyM2MxMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQUk9HUkVTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDUwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSGVkUFJPR1JFU1MgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JcHVibGljIEhlZFBST0dSRVNTKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBST0dSRVNTLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRWxlbURlY2xJbXBsI2NyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHsgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRSwgSFRNTDUwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVgsIEhUTUw1ME5hbWVzcGFjZS5BVFRSX05BTUVfRk9STSB9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlDTU5vZGUgcHJvZ3Jlc3MgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBST0dSRVNTKTsKLQkJaWYgKHByb2dyZXNzICE9IG51bGwpIHsKLQkJCWV4Y2x1c2lvbi5hcHBlbmRDaGlsZChwcm9ncmVzcyk7Ci0JCX0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgPT0gbnVsbCkgewotCQkJU3RyaW5nW10gbmFtZXMgPSB7IEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUk9HUkVTUyB9OwotCQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0JCX0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQY2RhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUGNkYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NjE0OTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQY2RhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIFBDREFUQSB0eXBlIGVsZW1lbnQgZGVjbGFyYXRpb25zLjxicj4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkUGNkYXRhIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkUGNkYXRhKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfUENEQVRBOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQuPGJyPgotCSAqIFBDREFUQSB0eXBlIGFsd2F5cyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDxicj4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50Ci0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50IHR5cGUuPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQaHJhc2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUGhyYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNjgwZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQaHJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogJXBocmFzZTsKLSAqLwotZmluYWwgY2xhc3MgSGVkUGhyYXNlIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRQaHJhc2UoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkNPUlJFQ1RfRFVQTElDQVRFRDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRRLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg1Yjc1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBRLgotICovCi1maW5hbCBjbGFzcyBIZWRRIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRRKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlEsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRFVQTElDQVRFRDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGNpdGUgJVVSSTsgI0lNUExJRUQpIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NJVEV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFJQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFJQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMWE5YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRSUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNTBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBSUC4KLSAqLwotZmluYWwgY2xhc3MgSGVkUlAgZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJQfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRSUChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5SUCwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIE9QVElPTi4KLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBPUFRJT04gaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFJULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFJULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYTRhMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRSVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNTBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBSVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkUlQgZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJUfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRSVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5SVCwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0KLQl9Ci0KLQkvKioKLQkgKiBPUFRJT04uCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JfQotCi0JLyoqCi0JICogT1BUSU9OIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRSVUJZLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFJVQlkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4NmEyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFJVQlkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw1ME5hbWVzcGFjZTsKLQotLyoqCi0gKiBSVUJZLgotICovCi1maW5hbCBjbGFzcyBIZWRSVUJZIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkUlVCWShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5SVUJZLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9SVUJZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNDUklQVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTQ1JJUFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFmMTMxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNDUklQVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICogU0NSSVBULgotICovCi1maW5hbCBjbGFzcyBIZWRTQ1JJUFQgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTQ1JJUFQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBULCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9DREFUQTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogU0NSSVBULgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy9kaWZmZXJlbnQgc2V0cyBvZiBhdHRyaWJ1dGVzIGZvciBodG1sIDQgJiA1Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQsIGF0dHJpYnV0ZXMpOwotCQotCX0KLQotCS8qKgotCSAqIDxjb2RlPlNDUklQVDwvY29kZT4gaXMgQ0RBVEEgdHlwZS4KLQkgKiBTbywgdGhlIG1ldGhvZCBhbHdheXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8YnI+Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudAotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ0RBVEEgY29udGVudC48YnI+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTRUxFQ1QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU0VMRUNULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZGU0NDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTRUxFQ1QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFNFTEVDVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkU0VMRUNUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU0VMRUNUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFTEVDVCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfU0VMRUNUOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJCi0JCS8vZGlmZmVyZW50IHNldHMgb2YgYXR0cmlidXRlcyBmb3IgaHRtbCA0ICYgNQotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucyhIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VMRUNULCBhdHRyaWJ1dGVzKTsKLQkKLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTn07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU09VUkNFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNPVVJDRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDdhOWQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU09VUkNFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw1ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIFNPVVJDRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkU09VUkNFIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtIVE1MNTBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU09VUkNFfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTT1VSQ0UoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNTBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU09VUkNFLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9DREFUQTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogU09VUkNFCi0JICogJWF0dHJzOwotCSAqIChzcmMgJVVSSTsgI1JFUVVJUkVEKTogc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAodHlwZSAlQ29udGVudFR5cGU7ICNJTVBMSUVEKSAKLQkgKiAobWVkaWEgJU1lZGlhVHlwZTsgI0lNUExJRUQpIAotCSAqIEdsb2JhbCBhdHRyaWJ1dGVzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQotCQkvLyAoc3JjICVVUkk7ICNSRVFVSVJFRCk6IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgYXR0cik7Ci0KLQkJLy8gKHR5cGUgJUNvbnRlbnRUeXBlOyAjSU1QTElFRCkgCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0JCQotCi0JCS8vIChtZWRpYSAlTWVkaWFUeXBlOyAjSU1QTElFRCkgCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5NRURJQV9UWVBFKTsKLQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9BTEwpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NRURJQSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01FRElBLCBhdHRyKTsKLQkJCi0JCQotCQkvLyBnbG9iYWwgYXR0cmlidXRlcwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQkKLQkvKioKLQkgKiBTT1VSQ0UgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNQQU4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1BBTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjkzMmY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1BBTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotCi0vKioKLSAqIFNQQU4uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNQQU4gZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICogU1BBTi4KLQkgKi8KLQlwdWJsaWMgSGVkU1BBTihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TUEFOLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJXJlc2VydmVkOyAuLi4gZW1wdHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lCYXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjN2E4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLQotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgU1NJIGRlY2xhcmF0aW9ucy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkU1NJQmFzZSBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lCYXNlKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Rm9ybWF0VHlwZSgpIHsKLQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX1NTSTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcE5hbWUpIHsKLQkJaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NTSSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnN1cHBvcnRzKHByb3BOYW1lKTsKLQl9Ci0KLQkvKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCWlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkocHJvcE5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJQ29uZmlnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODQwNmE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogU1NJOkNPTkZJRy4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJQ29uZmlnIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJQ29uZmlnKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9DT05GSUcsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpDT05GSUcuCi0JICogKGVycm1zZyBDREFUQSAjSU1QTElFRCkKLQkgKiAoc2l6ZWZtdCBDREFUQSAjSU1QTElFRCkKLQkgKiAodGltZWZtdCBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRVJSTVNHLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkVGTVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVElNRUZNVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRWNoby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lFY2hvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3Mzg4MTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lFY2hvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogU1NJOkVDSE8uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUVjaG8gZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lFY2hvKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9FQ0hPLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6RUNITwotCSAqICh2YXIgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBUn07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRXhlYy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lFeGVjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MjRkNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lFeGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogU1NJOkVYRUMuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUV4ZWMgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lFeGVjKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9FWEVDLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6RVhFQwotCSAqIChjZ2kgJVVSSTsgI0lNUExJRUQpCi0JICogKGNtZCBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0dJLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NNRH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRmxhc3Rtb2QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRmxhc3Rtb2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBlYmRmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUZsYXN0bW9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogU1NJOkZMQVNUTU9ELgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lGbGFzdG1vZCBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUZsYXN0bW9kKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GTEFTVE1PRCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkZMQVNUTU9ECi0JICogKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICogKHZpcnR1YWwgJVVSSSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRklMRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WSVJUVUFMfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lGc2l6ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lGc2l6ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmJkYmYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRnNpemUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBTU0k6RlNJWkUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUZzaXplIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJRnNpemUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0ZTSVpFLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6RlNJWkUKLQkgKiAoZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkgKiAodmlydHVhbCAlVVJJICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZJUlRVQUx9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUluY2x1ZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJSW5jbHVkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzIyNGQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJSW5jbHVkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIFNTSTpJTkNMVURFLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lJbmNsdWRlIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJSW5jbHVkZShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfSU5DTFVERSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOklOQ0xVREUKLQkgKiAoZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkgKiAodmlydHVhbCAlVVJJICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZJUlRVQUx9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSVByaW50ZW52LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSVByaW50ZW52LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMTBiNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lQcmludGVudi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogU1NJOlBSSU5URU5WLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lQcmludGVudiBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSVByaW50ZW52KEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9QUklOVEVOViwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6UFJJTlRFTlYgaGFzIG5vIGF0dHJpYnV0ZXMuICBTbywgdGhpcyBtZXRob2Qgc2hvdWxkCi0JICogYWx3YXlzIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBOb3RlOiBTaW5jZSBzb21lYm9keSBkb2Vzbid0IGV4cGVjdCBudWxsIGlzIHJldHVybmVkLCByZXR1cm4gdGhlIGVtcHR5IGF0dHJpYnV0ZQotCSAqIGxpa2UgYSBjdXN0b20gdGFnIHdoaWNoIGRvZXNuJ3QgaGF2ZSBhdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lTZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MmI4NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBTU0k6U0VULgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lTZXQgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lTZXQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1NFVCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOlNFVAotCSAqICh2YXIgQ0RBVEEgI0lNUExJRUQpCi0JICogKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNUWUxFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNUWUxFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMGMzZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTVFlMRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICogU1RZTEUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNUWUxFIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1RZTEUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0NEQVRBOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBTVFlMRQotCSovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJCi0JCS8vZGlmZmVyZW50IHNldHMgb2YgYXR0cmlidXRlcyBmb3IgaHRtbCA0ICYgNQotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucyhIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUsIGF0dHJpYnV0ZXMpOwotCQotCQkKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50Ljxicj4KLQkgKiA8Y29kZT5TVFlMRTwvY29kZT4gaXMgQ0RBVEEgY29udGVudCB0eXBlLiAgU28sIGl0IGFsd2F5cyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENEQVRBIGNvbnRlbnQuPGJyPgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1VNTUFSWS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTVU1NQVJZLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYjNlODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTVU1NQVJZLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw1ME5hbWVzcGFjZTsKLQotcHVibGljIGNsYXNzIEhlZFNVTU1BUlkgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JcHVibGljIEhlZFNVTU1BUlkoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNTBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1VNTUFSWSwgY29sbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTVkcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1ZHLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MTUxNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTVkcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDUwTmFtZXNwYWNlOwotCi0KLS8qKgotICogU1ZHLgotICovCi1maW5hbCBjbGFzcyBIZWRTVkcgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVkd9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNWRyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVkcsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogU1ZHIG5hbWVzcGFjZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBTVkcgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNjcmlwdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU2NyaXB0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmJmNzBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU2NyaXB0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogU1VCIGFuZCBTVVAuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNjcmlwdHMgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNjcmlwdHMoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNlY3Rpb25pbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU2VjdGlvbmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2E3MjA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU2VjdGlvbmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1wdWJsaWMgY2xhc3MgSGVkU2VjdGlvbmluZyBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCXB1YmxpYyBIZWRTZWN0aW9uaW5nKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQl9Ci0KLQkvKioKLQkgKiBBcnRpY2xlLgotCSAqICVhdHRyczsKLQkgKiBHbG9iYWwgYXR0cmlidXRlcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVEFCTEUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVEFCTEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI2Y2Q3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRBQkxFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBUQUJMRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkVEFCTEUgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRUQUJMRShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfVEFCTEU7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUQUJMRS4KLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCQotCQkvL2RpZmZlcmVudCBzZXRzIG9mIGF0dHJpYnV0ZXMgZm9yIGh0bWwgNCAmIDUKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFLCBhdHRyaWJ1dGVzKTsKLQkJCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVEVYVEFSRUEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVEVYVEFSRUEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1YmE0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRFWFRBUkVBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBURVhUQVJFQS4KLSAqLwotZmluYWwgY2xhc3MgSGVkVEVYVEFSRUEgZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JLyoqCi0JICogVEVYVEFSRUEgc2hvdWxkIGtlZXAgc3BhY2VzIGluIGl0cyBzb3VyY2UuCi0JICovCi0JcHVibGljIEhlZFRFWFRBUkVBKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRFWFRBUkVBLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0KLQkJa2VlcFNwYWNlcyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogVEVYVEFSRUEuCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy9kaWZmZXJlbnQgc2V0cyBvZiBhdHRyaWJ1dGVzIGZvciBodG1sIDQgJiA1Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URVhUQVJFQSwgYXR0cmlidXRlcyk7Ci0JCi0JCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTn07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVElNRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUSU1FLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjODE5MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUSU1FLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNTBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBIZWRUSU1FIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCXB1YmxpYyBIZWRUSU1FKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJTUUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtRGVjbEltcGwjY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0geyBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RBVEVUSU1FLCBIVE1MNTBOYW1lc3BhY2UuQVRUUl9OQU1FX1BVQkRBVEUgfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCUNNTm9kZSB0aW1lID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw1ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USU1FKTsKLQkJaWYgKHRpbWUgIT0gbnVsbCkKLQkJCWV4Y2x1c2lvbi5hcHBlbmRDaGlsZCh0aW1lKTsKLQotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJTUV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUSVRMRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUSVRMRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTE5MDA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVElUTEUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotCi0vKioKLSAqIFRJVExFLgotICovCi1maW5hbCBjbGFzcyBIZWRUSVRMRSBleHRlbmRzIEhlZFBjZGF0YSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkVElUTEUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEUsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBUSVRMRS4KLQkgKiAlaTE4bjsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVpMThuOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEkxOG4oYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPlRJVExFPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT4laGVhZC5taXNjOzwvY29kZT4uCi0JICogJWhlYWQubWlzYzsgaXMgPGNvZGU+U0NSSVBUfFNUWUxFfE1FVEF8TElOS3xPQkpFQ1Q8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gKFNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUKQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FVEEsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSU5LLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0JKRUNUfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGV4Y2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCXJldHVybiBleGNsdXNpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjhhNTRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVFIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogVFIuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFRSIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVFJ9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFRSKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9UQ0VMTF9DT05UQUlORVI7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkQ7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJWNlbGxoYWxpZ247Ci0JICogJWNlbGx2YWxpZ247Ci0JICogKGJnY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkgKiAoYmFja2dyb3VuZCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoYm9yZGVyY29sb3IgJUNvbG9yICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqIChoZWlnaHQgJUxlbmd0aCAjSU1QTElFRCkgYnVnMjI0NgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAlY2VsbGhhbGlnbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDZWxsaGFsaWduKGF0dHJpYnV0ZXMpOwotCQkvLyAlY2VsbHZhbGlnbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDZWxsdmFsaWduKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQkdDT0xPUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CQUNLR1JPVU5ELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUkNPTE9SLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCAvLyBEMjA1NTE0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFRSIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUYWJsZUJvZHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVGFibGVCb2R5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NmVlZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUYWJsZUJvZHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogVEhFQUQvVEZPT1QvVEJPRFkKLSAqLwotZmluYWwgY2xhc3MgSGVkVGFibGVCb2R5IGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0FQVElPTiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNPTCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNPTEdST1VQLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEhFQUQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQk9EWSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRGT09UfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRUYWJsZUJvZHkoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9UUl9DT05UQUlORVI7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJaWYgKGVsZW1lbnROYW1lID09IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQk9EWSkgewotCQkJb21pdFR5cGUgPSBPTUlUX0JPVEg7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlvbWl0VHlwZSA9IE9NSVRfRU5EOwotCQl9Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUQk9EWS9URk9PVC9USEVBRAotCSAqICVhdHRyczsKLQkgKiAlY2VsbGhhbGlnbjsKLQkgKiAlY2VsbHZhbGlnbjsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGxoYWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbGhhbGlnbihhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGx2YWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbHZhbGlnbihhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBUSEVBRCwgVEZPT1QgYW5kIFRCT0RZIGhhdmUgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVGFibGVDZWxsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRhYmxlQ2VsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGZjYjQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVGFibGVDZWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIChUSCB8IFREKS4KLSAqLwotZmluYWwgY2xhc3MgSGVkVGFibGVDZWxsIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVFIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlREfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRUYWJsZUNlbGwoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGFiYnIgJVRleHQ7ICNJTVBMSUVEKQotCSAqIChheGlzIENEQVRBICNJTVBMSUVEKQotCSAqIChoZWFkZXJzIElEUkVGUyAjSU1QTElFRCkKLQkgKiAoc2NvcGUgJVNjb3BlOyAjSU1QTElFRCkKLQkgKiAocm93c3BhbiBOVU1CRVIgMSkKLQkgKiAoY29sc3BhbiBOVU1CRVIgMSkKLQkgKiAlY2VsbGhhbGlnbjsKLQkgKiAlY2VsbHZhbGlnbjsKLQkgKiAobm93cmFwIChub3dyYXApICNJTVBMSUVEKQotCSAqIChiZ2NvbG9yICVDb2xvcjsgI0lNUExJRUQpCi0JICogKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqIChoZWlnaHQgJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JICogKGJvcmRlcmNvbG9yICVDb2xvciAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGxoYWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbGhhbGlnbihhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGx2YWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbHZhbGlnbihhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FCQlIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQVhJUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUFERVJTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NDT1BFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JPV1NQQU4sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09MU1BBTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OT1dSQVAsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQkdDT0xPUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQkFDS0dST1VORCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVJDT0xPUiAvLyBEMjA1NTE0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFRIIGFuZCBURCBoYXZlIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFVMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFVMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MWM1YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRVTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogVUwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFVMIGV4dGVuZHMgSGVkTGlzdEl0ZW1Db250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFVMKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVMLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBVTC4KLQkgKiAodHlwZSAlVUxTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAodHlwZSAlVUxTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkvLyAlVUxTdHlsZTsgaXMgKGRpc2N8c3F1YXJlfGNpcmNsZSkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gdmFsdWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0RJU0MsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NRVUFSRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfQ0lSQ0xFfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQotCQkvLyB0aGUgcmVzdC4KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT01QQUNUfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVklERU8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVklERU8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlYjQ0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFZJREVPLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNTBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotCi0KLQotLyoqCi0gKiBWSURFTy4KLSAqLwotZmluYWwgY2xhc3MgSGVkVklERU8gZXh0ZW5kcyBIZWRNZWRpYUVsZW1lbnQgewotCi0JCi0JcHVibGljIEhlZFZJREVPKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDUwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlZJREVPLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBNZWRpYUVsZW1lbnQKLQkgKiAlYXR0cnM7Ci0JICogKHNyYyAlVVJJOyAjUkVRVUlSRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChwcmVsb2FkICVDREFUQTsgI0lNUExJRUQpIAotCSAqIChhdXRvcGxheSAlRU5VTTsgI0lNUExJRUQpIAotCSAqIChsb29wICVFTlVNOyAjSU1QTElFRCkKLQkgKiAoY29udHJvbHMgJU1lZGlhVHlwZTsgI0lNUExJRUQpCi0JICogKHBvc3RlciAlVVJJOyBPUFRJT05BTCkKLQkgKiAoaGVpZ2h0ICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiBHbG9iYWwgYXR0cmlidXRlcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJc3VwZXIuY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCk7Ci0JCQotCQkvLyAocG9zdGVyICVVUkk7ICNvcHRpb25hbCk6IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBudWxsOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDUwTmFtZXNwYWNlLkFUVFJfTkFNRV9QT1NURVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDUwTmFtZXNwYWNlLkFUVFJfTkFNRV9QT1NURVIsIGF0dHIpOwotCQkKLQkJLy8gaGVpZ2h0ICwgd2lkdGgKLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEh9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCi0JCQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRXQlIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkV0JSLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NThmZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRXQlIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLQotZmluYWwgY2xhc3MgSGVkV0JSIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JcHVibGljIEhlZFdCUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5XQlIsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfQlJFQUsuCi0JCS8vIHNhbWUgYXMgQlIuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfQlJFQUs7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQkvLyBObyBhdHRyaWJ1dGVzIGlzIGRlZmluZWQuCi0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KQ00yMERvY0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSkNNMjBEb2NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2N2I1OTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KQ00yMERvY0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBDTURvY3VtZW50IGZvciBKU1AgMi4wLgotICovCi1jbGFzcyBKQ00yMERvY0ltcGwgZXh0ZW5kcyBKQ01Eb2NJbXBsIHsKLQkvKioKLQkgKiBKQ00yMERvY0ltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSkNNMjBEb2NJbXBsKFN0cmluZyBkb2NUeXBlTmFtZSwgQ01OYW1lc3BhY2VJbXBsIHRhcmdldE5hbWVzcGFjZSkgewotCQlzdXBlcihkb2NUeXBlTmFtZSwgdGFyZ2V0TmFtZXNwYWNlLCBuZXcgSlNQMjBFbGVtZW50Q29sbGVjdGlvbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pDTTIxRG9jSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KQ00yMURvY0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE5ZTBjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pDTTIxRG9jSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1jbGFzcyBKQ00yMURvY0ltcGwgZXh0ZW5kcyBKQ01Eb2NJbXBsIHsKLQkvKioKLQkgKiBKQ00yMURvY0ltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSkNNMjFEb2NJbXBsKFN0cmluZyBkb2NUeXBlTmFtZSwgQ01OYW1lc3BhY2VJbXBsIHRhcmdldE5hbWVzcGFjZSkgewotCQlzdXBlcihkb2NUeXBlTmFtZSwgdGFyZ2V0TmFtZXNwYWNlLCBuZXcgSlNQMjFFbGVtZW50Q29sbGVjdGlvbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pDTURvY0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSkNNRG9jSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWZlNGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSkNNRG9jSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgQ01Eb2N1bWVudCBmb3IgSlNQIDEuMSBhbmQgSlNQIDEuMi4KLSAqLwotY2xhc3MgSkNNRG9jSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBKU1BDTURvY3VtZW50IHsKLQotCS8qKiBOYW1lc3BhY2UgZm9yIGFsbCBuYW1lcyBvZiBlbGVtZW50cywgZW50aXRpZXMgYW5kIGF0dHJpYnV0ZXMuICovCi0JcHJpdmF0ZSBDTU5hbWVzcGFjZUltcGwgbmFtZXNwYWNlID0gbnVsbDsKLQlwcml2YXRlIEpTUEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRzID0gbnVsbDsKLQotCS8qKgotCSAqIEhDTURvY0ltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSkNNRG9jSW1wbChTdHJpbmcgZG9jVHlwZU5hbWUsIENNTmFtZXNwYWNlSW1wbCB0YXJnZXROYW1lc3BhY2UpIHsKLQkJdGhpcyhkb2NUeXBlTmFtZSwgdGFyZ2V0TmFtZXNwYWNlLCBuZXcgSlNQRWxlbWVudENvbGxlY3Rpb24oKSk7Ci0JfQotCi0JSkNNRG9jSW1wbChTdHJpbmcgZG9jVHlwZU5hbWUsIENNTmFtZXNwYWNlSW1wbCB0YXJnZXROYW1lc3BhY2UsIEpTUEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZG9jVHlwZU5hbWUpOwotCQluYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0JCWVsZW1lbnRzID0gY29sbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudHMuZ2V0TmFtZWRJdGVtKGVsZW1lbnROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpIHsKLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSFRNTEVudGl0eURlY2xhcmF0aW9uIGdldEVudGl0eURlY2xhcmF0aW9uKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkRPQ1VNRU5UOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQMTFOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQMTFOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxYTliOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUDExTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLS8qKgotICogSlNQIDEuMSBOYW1lc3BhY2UuIE5vdGUsIHRoaXMgaW50ZXJmYWNlIHdhcyAKLSAqIGNvcGllZCBmb3JtIEpTUCBjb3JlIHBhY2thZ2VzLiBPbmUgaW1wbGljYXRpb24gCi0gKiBpcyB0aGF0IGV4dHJhIGNhcmUgaXMgbmVlZGVkIGluIHVzaW5nICc9PScgaW5zdGVhZCAKLSAqIG9mICcuZXF1YWxzJy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKU1AxMU5hbWVzcGFjZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFbGVtZW50TmFtZSB7Ci0JCS8vIEVsZW1lbnQgbmFtZXMKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUTEVUID0gImpzcDpzY3JpcHRsZXQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT04gPSAianNwOmV4cHJlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ0xBUkFUSU9OID0gImpzcDpkZWNsYXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUSVZFX1BBR0UgPSAianNwOmRpcmVjdGl2ZS5wYWdlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RJVkVfSU5DTFVERSA9ICJqc3A6ZGlyZWN0aXZlLmluY2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVElWRV9UQUdMSUIgPSAianNwOmRpcmVjdGl2ZS50YWdsaWIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRUJFQU4gPSAianNwOnVzZUJlYW4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFBST1BFUlRZID0gImpzcDpzZXRQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUUFJPUEVSVFkgPSAianNwOmdldFByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFID0gImpzcDppbmNsdWRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JXQVJEID0gImpzcDpmb3J3YXJkIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU4gPSAianNwOnBsdWdpbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1TID0gImpzcDpwYXJhbXMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTExCQUNLID0gImpzcDpmYWxsYmFjayI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU0gPSAianNwOnBhcmFtIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gImpzcDpyb290IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUID0gImpzcDp0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUDExX1VSSSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1RBR19QUkVGSVggPSAianNwIjsgLy8kTk9OLU5MUy0xJAotCS8vIGF0dHJpYnV0ZSBuYW1lcwotCS8vICAgZGlyZWN0aXZlLnBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTEFOR1VBR0UgPSAibGFuZ3VhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VYVEVORFMgPSAiZXh0ZW5kcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09OVEVOVF9UWVBFID0gImNvbnRlbnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JTVBPUlQgPSAiaW1wb3J0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TRVNTSU9OID0gInNlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0JVRkZFUiA9ICJidWZmZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FVVE9GTFVTSCA9ICJhdXRvRmx1c2giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lTX1RIUkVBRF9TQUZFID0gImlzVGhyZWFkU2FmZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSU5GTyA9ICJpbmZvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9FUlJPUl9QQUdFID0gImVycm9yUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSVNfRVJST1JfUEFHRSA9ICJpc0Vycm9yUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUEFHRV9FTkNPRElORyA9ICJwYWdlRW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JLy8gICBkaXJlY3RpdmUuaW5jbHVkZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GSUxFID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0JLy8gICBkaXJlY3RpdmUudGFnbGliCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1VSSSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BSRUZJWCA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0JLy8gICB1c2VCZWFuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TQ09QRSA9ICJzY29wZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0JFQU5fTkFNRSA9ICJiZWFuTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgc2V0UHJvcGVydHkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QUk9QRVJUWSA9ICJwcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BBUkFNID0gInBhcmFtIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgaW5jbHVkZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QQUdFID0gInBhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0ZMVVNIID0gImZsdXNoIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgcGx1Z2luCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPREUgPSAiY29kZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09ERUJBU0UgPSAiY29kZWJhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FMSUdOID0gImFsaWduIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BUkNISVZFID0gImFyY2hpdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hFSUdIVCA9ICJoZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hTUEFDRSA9ICJoc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0pSRVZFUlNJT04gPSAianJldmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVlNQQUNFID0gInZzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfV0lEVEggPSAid2lkdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05TUExVR0lOVVJMID0gIm5zcGx1Z2ludXJsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JRVBMVUdJTlVSTCA9ICJpZXBsdWdpbnVybCI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIHJvb3QKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfWE1MTlNfSlNQID0gInhtbG5zOmpzcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCS8vIGF0dHJpYnV0ZSB2YWx1ZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1RSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0ZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSkFWQSA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQ1RfREVGQVVMVCA9ICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI7Ly9EMTk1MzY2IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JVRlNJWl9ERUZBVUxUID0gIjhrYiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1BBR0UgPSAicGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NFU1NJT04gPSAic2Vzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JFUVVFU1QgPSAicmVxdWVzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0FQUExJQ0FUSU9OID0gImFwcGxpY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQkVBTiA9ICJiZWFuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQVBQTEVUID0gImFwcGxldCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1RPUCA9ICJ0b3AiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9NSURETEUgPSAibWlkZGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQk9UVE9NID0gImJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0xFRlQgPSAibGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JJR0hUID0gInJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSlZFUjExID0gIjEuMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1hNTE5TX0pTUCA9ICJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1AyMEVsZW1lbnRDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUDIwRWxlbWVudENvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0MDRjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUDIwRWxlbWVudENvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGVsZW1lbnQgZGVjbGFyYXRpb25zIG9mIEpTUCAxLjEgYW5kIEpTUCAxLjIuCi0gKi8KLWNsYXNzIEpTUDIwRWxlbWVudENvbGxlY3Rpb24gZXh0ZW5kcyBKU1BFbGVtZW50Q29sbGVjdGlvbiBpbXBsZW1lbnRzIEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lIHsKLQotCS8vIGVsZW1lbnQgSURzCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWRzMjAgZXh0ZW5kcyBJZHMgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CT0RZID0gMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FUVFJJQlVURSA9IDE4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTEVNRU5UID0gMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09VVFBVVCA9IDIwOwotCi0JCXB1YmxpYyBzdGF0aWMgaW50IGdldE51bU9mSWRzKCkgewotCQkJaWYgKG51bW9maWRzICE9IC0xKQotCQkJCXJldHVybiBudW1vZmlkczsKLQotCQkJLy8gTk9URTogSWYgdGhlIHJlZmxlY3Rpb24gaXMgdG9vIHNsb3csIHRoaXMgbWV0aG9kIHNob3VsZAotCQkJLy8ganVzdCByZXR1cm4gdGhlIGxpdGVyYWwgdmFsdWUsIGxpa2UgMTA1LgotCQkJLy8gLS0gNS8yNS8yMDAxCi0JCQlDbGFzcyBjbGF6eiA9IElkczIwLmNsYXNzOwotCQkJRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXRGaWVsZHMoKTsKLQkJCW51bW9maWRzID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmaWVsZHNbaV0uZ2V0TmFtZSgpOwotCQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIklEXyIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJbnVtb2ZpZHMrKzsKLQkJCX0KLQkJCXJldHVybiBudW1vZmlkczsKLQkJfQotCi0JCS8vIGNoYWNoZSB0aGUgcmVzdWx0IG9mIHRoZSByZWZsZWN0aW9uLgotCQlwcml2YXRlIHN0YXRpYyBpbnQgbnVtb2ZpZHMgPSAtMTsKLQl9Ci0KLQkvLyBhdHRyaWJ1dGUgY3JlYXRlcgotCWNsYXNzIEpBQ3JlYXRlcjIwIGV4dGVuZHMgSkFDcmVhdGVyIHsKLQkJcHVibGljIEpBQ3JlYXRlcjIwKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwgZ2V0RGVjbGFyYXRpb25zKGludCBlaWQpIHsKLQkJCXN3aXRjaCAoZWlkKSB7Ci0JCQkJY2FzZSBJZHMyMC5JRF9BVFRSSUJVVEUgOgotCQkJCQljcmVhdGVGb3JBdHRyaWJ1dGUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMyMC5JRF9FTEVNRU5UIDoKLQkJCQkJY3JlYXRlRm9yRWxlbWVudCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkczIwLklEX0JPRFkgOgotCQkJCQljcmVhdGVGb3JCb2R5KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzMjAuSURfT1VUUFVUIDoKLQkJCQkJY3JlYXRlRm9yT3V0cHV0KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX0RJUkVDVElWRV9UQUdMSUIgOgotCQkJCQljcmVhdGVGb3JEaXJUYWdsaWIoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfRElSRUNUSVZFX1BBR0UgOgotCQkJCQljcmVhdGVGb3JEaXJQYWdlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX1JPT1QgOgotCQkJCQljcmVhdGVGb3JSb290KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX1BMVUdJTiA6Ci0JCQkJCWNyZWF0ZUZvclBsdWdpbigpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJc3VwZXIuZ2V0RGVjbGFyYXRpb25zKGVpZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZGVjbGFyYXRpb25zOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckJvZHkoKSB7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yT3V0cHV0KCkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfT01JVF9YTUxfREVDTCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFLCBKU1AyME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1lFUywgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9OT307Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9OTyk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX09NSVRfWE1MX0RFQ0wsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ET0NUWVBFX1JPT1RfRUxFTUVOVCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ET0NUWVBFX1JPT1RfRUxFTUVOVCwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RPQ1RZUEVfU1lTVEVNKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RPQ1RZUEVfU1lTVEVNLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRE9DVFlQRV9QVUJMSUMpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRE9DVFlQRV9QVUJMSUMsIGFkZWMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENoYW5nZWQgaW4gMi4wCi0JCSAqLwotCQl2b2lkIGNyZWF0ZUZvckRpclRhZ2xpYigpIHsKLQkJCS8vICgidXJpIiBVUkkgT1BUSU9OQUwpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9VUkkpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1VSSSwgYWRlYyk7Ci0KLQkJCS8vICgidGFnZGlyIiBVUkkgT1BUSU9OQUwpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUdESVIpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBR0RJUiwgYWRlYyk7Ci0KLQkJCS8vICgicHJlZml4IiBDREFUQSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1BSRUZJWCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QUkVGSVgsIGFkZWMpOwotCQl9Ci0JCQotCQl2b2lkIGNyZWF0ZUZvckRpclBhZ2UoKSB7Ci0JCQlBdHRyRGVjbCBhZGVjID0gbnVsbDsKLQkJCS8vICgibGFuZ3VhZ2UiIENEQVRBIERFQ0xBUkVEICJqYXZhIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0xBTkdVQUdFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0pBVkEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTEFOR1VBR0UsIGFkZWMpOwotCi0JCQkvLyAoImV4dGVuZHMiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9FWFRFTkRTKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9FWFRFTkRTLCBhZGVjKTsKLQotCQkJLy8gKCJpbXBvcnQiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9JTVBPUlQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lNUE9SVCwgYWRlYyk7Ci0KLQkJCS8vICgic2Vzc2lvbiIgRU5VTSBERUNMQVJFRCAodHJ1ZXxmYWxzZSkgInRydWUiKQotCQkJYWRlYyA9IGNyZWF0ZUJvb2xUeXBlKEFUVFJfTkFNRV9TRVNTSU9OLCBBVFRSX1ZBTFVFX1RSVUUpOwotCQkJaWYgKGFkZWMgIT0gbnVsbCkKLQkJCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9TRVNTSU9OLCBhZGVjKTsKLQotCQkJLy8gKCJidWZmZXIiIENEQVRBIERFQ0xBUkVEICI4a2IiKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQlVGRkVSKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0JVRlNJWl9ERUZBVUxUKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0JVRkZFUiwgYWRlYyk7Ci0KLQkJCS8vICgiYXV0b0ZsdXNoIiBFTlVNIERFQ0xBUkVEICh0cnVlfGZhbHNlKSAidHJ1ZSIpCi0JCQlhZGVjID0gY3JlYXRlQm9vbFR5cGUoQVRUUl9OQU1FX0FVVE9GTFVTSCwgQVRUUl9WQUxVRV9UUlVFKTsKLQkJCWlmIChhZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQVVUT0ZMVVNILCBhZGVjKTsKLQotCQkJLy8gKCJpc1RocmVhZFNhZmUiIEVOVU0gREVDTEFSRUQgKHRydWV8ZmFsc2UpICJ0cnVlIikKLQkJCWFkZWMgPSBjcmVhdGVCb29sVHlwZShBVFRSX05BTUVfSVNfVEhSRUFEX1NBRkUsIEFUVFJfVkFMVUVfVFJVRSk7Ci0JCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lTX1RIUkVBRF9TQUZFLCBhZGVjKTsKLQotCQkJLy8gKCJpbmZvIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfSU5GTyk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSU5GTywgYWRlYyk7Ci0KLQkJCS8vICgiZXJyb3JQYWdlIiBVUkkgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0VSUk9SX1BBR0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9FUlJPUl9QQUdFLCBhZGVjKTsKLQotCQkJLy8gKCJpc0Vycm9yUGFnZSIgRU5VTSBERUNMQVJFRCAodHJ1ZXxmYWxzZSkgImZhbHNlIikKLQkJCWFkZWMgPSBjcmVhdGVCb29sVHlwZShBVFRSX05BTUVfSVNfRVJST1JfUEFHRSwgQVRUUl9WQUxVRV9GQUxTRSk7Ci0JCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lTX0VSUk9SX1BBR0UsIGFkZWMpOwotCi0JCQkvLyAoImNvbnRlbnRUeXBlIiBDREFUQSBERUNMQVJFRCAidGV4dC9odG1sOyBJU08tODg1OS0xIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0NPTlRFTlRfVFlQRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9DVF9ERUZBVUxUKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0NPTlRFTlRfVFlQRSwgYWRlYyk7Ci0KLQkJCS8vICgicGFnZUVuY29kaW5nIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUEFHRV9FTkNPRElORyk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9FTkNPRElOR19ERUZBVUxUKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1BBR0VfRU5DT0RJTkcsIGFkZWMpOwotCi0JCQkvLyAoImlzRUxJZ25vcmVkIiBFTlVNIERFQ0xBUkVEICh0cnVlfGZhbHNlKSAiZmFsc2UiKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfSVNFTElHTk9SRUQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tde0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9GQUxTRSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0lTRUxJR05PUkVELCBhZGVjKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckVsZW1lbnQoKSB7Ci0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OQU1FKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05BTUUsIGFkZWMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckF0dHJpYnV0ZSgpIHsKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX05BTUUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1RSSU0pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9UUlVFKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVFJJTSwgYWRlYyk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JSb290KCkgewotCQkJLy8gKCJ4bWxuczpqc3AiIENEQVRBICJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIikKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1hNTE5TX0pTUCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9YTUxOU19KU1ApOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfWE1MTlNfSlNQLCBhZGVjKTsKLQkJCS8vICgidmVyc2lvbiIgQ0RBVEEgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9WRVJTSU9OKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBKU1AyME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0pTUF9WRVJfMjApOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9WRVJTSU9OLCBhZGVjKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvclBsdWdpbigpIHsKLQkJCS8vICgidHlwZSIgRU5VTSBSRVFVSVJFRCAoYmVhbnxhcHBsZXQpKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVFlQRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0JFQU4sIEFUVFJfVkFMVUVfQVBQTEVUfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9UWVBFLCBhZGVjKTsKLQotCQkJLy8gKCJjb2RlIiBDREFUQSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0NPREUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0NPREUsIGFkZWMpOwotCi0JCQkvLyAoImNvZGViYXNlIiBVUkkgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9DT0RFQkFTRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQ09ERUJBU0UsIGFkZWMpOwotCi0JCQkvLyAoImFsaWduIiBFTlVNIElNUExJRUQgKHRvcHxtaWRkbGV8Ym90dG9tfGxlZnR8cmlnaHQpKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQUxJR04pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gYWxpZ25zID0ge0FUVFJfVkFMVUVfVE9QLCBBVFRSX1ZBTFVFX01JRERMRSwgQVRUUl9WQUxVRV9CT1RUT00sIEFUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9SSUdIVH07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyhhbGlnbnMpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9CT1RUT00pOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQUxJR04sIGFkZWMpOwotCi0JCQkvLyAoImFyY2hpdmUiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9BUkNISVZFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9BUkNISVZFLCBhZGVjKTsKLQotCQkJLy8gKCJoZWlnaHQiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9IRUlHSFQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0hFSUdIVCwgYWRlYyk7Ci0KLQkJCS8vICgiaHNwYWNlIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfSFNQQUNFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9IU1BBQ0UsIGFkZWMpOwotCi0JCQkvLyAoImpyZXZlcnNpb24iIENEQVRBIERFQ0xBUkVEICIxLjEiKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfSlJFVkVSU0lPTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9KVkVSMTIpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSlJFVkVSU0lPTiwgYWRlYyk7Ci0KLQkJCS8vICgibmFtZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX05BTUUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05BTUUsIGFkZWMpOwotCi0JCQkvLyAoInZzcGFjZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1ZTUEFDRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVlNQQUNFLCBhZGVjKTsKLQotCQkJLy8gKCJ3aWR0aCIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1dJRFRIKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9XSURUSCwgYWRlYyk7Ci0KLQkJCS8vICgibnNwbHVnaW51cmwiIFVSSSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTlNQTFVHSU5VUkwpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OU1BMVUdJTlVSTCwgYWRlYyk7Ci0KLQkJCS8vICgiaWVwbHVnaW51cmwiIFVSSSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfSUVQTFVHSU5VUkwpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JRVBMVUdJTlVSTCwgYWRlYyk7Ci0JCQkKLQkJCS8vICgibWF5c2NyaXB0IiBFTlVNIElNUExJRUQgKHRydWUgfCBmYWxzZSkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX01BWVNDUklQVCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyhuZXcgU3RyaW5nW10ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX0pOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfTUFZU0NSSVBULCBhZGVjKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIG5hbWVzID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCW5hbWVzID0gbmV3IFN0cmluZ1tJZHMyMC5nZXROdW1PZklkcygpXTsKLQkJbmFtZXNbSWRzLklEX1NDUklQVExFVF0gPSBTQ1JJUFRMRVQ7Ci0JCW5hbWVzW0lkcy5JRF9FWFBSRVNTSU9OXSA9IEVYUFJFU1NJT047Ci0JCW5hbWVzW0lkcy5JRF9ERUNMQVJBVElPTl0gPSBERUNMQVJBVElPTjsKLQkJbmFtZXNbSWRzLklEX0RJUkVDVElWRV9QQUdFXSA9IERJUkVDVElWRV9QQUdFOwotCQluYW1lc1tJZHMuSURfRElSRUNUSVZFX0lOQ0xVREVdID0gRElSRUNUSVZFX0lOQ0xVREU7Ci0JCW5hbWVzW0lkcy5JRF9ESVJFQ1RJVkVfVEFHTElCXSA9IERJUkVDVElWRV9UQUdMSUI7Ci0JCW5hbWVzW0lkcy5JRF9VU0VCRUFOXSA9IFVTRUJFQU47Ci0JCW5hbWVzW0lkcy5JRF9TRVRQUk9QRVJUWV0gPSBTRVRQUk9QRVJUWTsKLQkJbmFtZXNbSWRzLklEX0dFVFBST1BFUlRZXSA9IEdFVFBST1BFUlRZOwotCQluYW1lc1tJZHMuSURfSU5DTFVERV0gPSBJTkNMVURFOwotCQluYW1lc1tJZHMuSURfRk9SV0FSRF0gPSBGT1JXQVJEOwotCQluYW1lc1tJZHMuSURfUExVR0lOXSA9IFBMVUdJTjsKLQkJbmFtZXNbSWRzLklEX1BBUkFNU10gPSBQQVJBTVM7Ci0JCW5hbWVzW0lkcy5JRF9GQUxMQkFDS10gPSBGQUxMQkFDSzsKLQkJbmFtZXNbSWRzLklEX1BBUkFNXSA9IFBBUkFNOwotCQluYW1lc1tJZHMuSURfUk9PVF0gPSBST09UOwotCQluYW1lc1tJZHMuSURfVEVYVF0gPSBURVhUOwotCQluYW1lc1tJZHMyMC5JRF9CT0RZXSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFk7Ci0JCW5hbWVzW0lkczIwLklEX0FUVFJJQlVURV0gPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BVFRSSUJVVEU7Ci0JCW5hbWVzW0lkczIwLklEX0VMRU1FTlRdID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRUxFTUVOVDsKLQkJbmFtZXNbSWRzMjAuSURfT1VUUFVUXSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9VVFBVVDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSlNQMjBFbGVtZW50Q29sbGVjdGlvbigpIHsKLQkJc3VwZXIoSlNQMjBFbGVtZW50Q29sbGVjdGlvbi5uYW1lcywgVE9MRVJBTlRfQ0FTRSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVpZAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JQ01Hcm91cEltcGwgY3JlYXRlQ29udGVudChpbnQgZWlkKSB7Ci0JCWlmIChlaWQgPT0gSURfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCi0JCUNNR3JvdXBJbXBsIGNvbnRlbnQgPSBudWxsOwotCQlDTU5vZGUgY2hpbGQgPSBudWxsOwotCi0JCXN3aXRjaCAoZWlkKSB7Ci0JCQljYXNlIElkcy5JRF9ST09UIDoKLQkJCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCQkJaW50IHZhbGlkQ2hpbGRyZW5bXSA9IHsKLQkJCQkvLyAlRGlyZWN0aXZlczsKLQkJCQkJCQlJZHMuSURfVEVYVCwgSWRzLklEX0RJUkVDVElWRV9QQUdFLCBJZHMuSURfRElSRUNUSVZFX0lOQ0xVREUsIElkczIwLklEX0JPRFksIElkczIwLklEX0FUVFJJQlVURSwKLQkJCQkJCQkvLyAlU2NyaXB0czsKLQkJCQkJCQlJZHMuSURfU0NSSVBUTEVULCBJZHMuSURfREVDTEFSQVRJT04sIElkcy5JRF9FWFBSRVNTSU9OLAotCQkJCQkJCS8vICVBY3Rpb25zOwotCQkJCQkJCUlkcy5JRF9VU0VCRUFOLCBJZHMuSURfU0VUUFJPUEVSVFksIElkcy5JRF9HRVRQUk9QRVJUWSwgSWRzLklEX0lOQ0xVREUsIElkcy5JRF9GT1JXQVJELCBJZHMuSURfUExVR0lOfTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJY2hpbGQgPSBpdGVtKHZhbGlkQ2hpbGRyZW5baV0pOwotCQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWNvbnRlbnQgPSBzdXBlci5jcmVhdGVDb250ZW50KGVpZCk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWlkCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlIVE1MRWxlbWVudERlY2xhcmF0aW9uIGNyZWF0ZUVsZW1EZWNsKGludCBlaWQpIHsKLQkJaWYgKGVpZCA9PSBJRF9VTktOT1dOKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJVHlwZVBhY2tldCBwYWNrZXQgPSBuZXcgVHlwZVBhY2tldCgpOwotCQlzd2l0Y2ggKGVpZCkgewotCQkJY2FzZSBJZHMyMC5JRF9CT0RZIDoKLQkJCQkvLyBkZWNsYXJhdGlvbgotCQkJCXBhY2tldC5uYW1lID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWTsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX1NDUklQVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzMjAuSURfRUxFTUVOVCA6Ci0JCQkJLy8gZGVjbGFyYXRpb24KLQkJCQlwYWNrZXQubmFtZSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVMRU1FTlQ7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9TQ1JJUFQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkczIwLklEX0FUVFJJQlVURSA6Ci0JCQkJLy8gZGVjbGFyYXRpb24KLQkJCQlwYWNrZXQubmFtZSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFUVFJJQlVURTsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX1NDUklQVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzMjAuSURfT1VUUFVUIDoKLQkJCQkvLyBkZWNsYXJhdGlvbgotCQkJCXBhY2tldC5uYW1lID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1VUUFVUOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfU0NSSVBUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfRElSRUNUSVZFX1RBR0xJQiA6Ci0JCQkJLy8gZGlyZWN0aXZlLnRhZ2xpYgotCQkJCXBhY2tldC5uYW1lID0gRElSRUNUSVZFX1RBR0xJQjsKLQkJCQlwYWNrZXQub21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX0RJUkVDVElWRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0RJUkVDVElWRV9QQUdFIDoKLQkJCQkvLyBkaXJlY3RpdmUucGFnZQotCQkJCXBhY2tldC5uYW1lID0gRElSRUNUSVZFX1BBR0U7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9ESVJFQ1RJVkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9ST09UIDoKLQkJCQlwYWNrZXQubmFtZSA9IFJPT1Q7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47IC8vIHNhbWUgYXMgSFRNTAotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfUExVR0lOIDoKLQkJCQkvLyBwbHVnaW4KLQkJCQlwYWNrZXQubmFtZSA9IFBMVUdJTjsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUVsZW1EZWNsKGVpZCk7Ci0JCX0KLQkJRWxlbURlY2wgZGVjbCA9IG5ldyBFbGVtRGVjbChwYWNrZXQpOwotCi0JCUNNR3JvdXBJbXBsIGNvbnRlbnQgPSBjcmVhdGVDb250ZW50KGVpZCk7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlkZWNsLnNldENvbnRlbnQoY29udGVudCk7Ci0KLQkJSkFDcmVhdGVyMjAgY3JlYXRlciA9IGdldEF0dHJpYnV0ZUNyZWF0b3IoKTsKLQkJZGVjbC5zZXRBdHRyaWJ1dGVzKGNyZWF0ZXIuZ2V0RGVjbGFyYXRpb25zKGVpZCkpOwotCi0JCXJldHVybiBkZWNsOwotCX0KLQotCXByb3RlY3RlZCBKQUNyZWF0ZXIyMCBnZXRBdHRyaWJ1dGVDcmVhdG9yKCkgewotCQlyZXR1cm4gbmV3IEpBQ3JlYXRlcjIwKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1AyME5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1AyME5hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTEzOGEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQMjBOYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBOZXcgbmFtZXMgZm9yIEpTUCAyLjAgc3BlYy4KLSAqIAotICogQGRlcHJlY2F0ZWQgLSB1c2UKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AyME5hbWVzcGFjZQotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQMjBOYW1lc3BhY2UgZXh0ZW5kcyBKU1AxMU5hbWVzcGFjZSB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQMjBfVVJJID0gIiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTmV3IGVsZW1lbnRzIGZvciBKU1AgMi4wIHNwZWMuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRWxlbWVudE5hbWUgZXh0ZW5kcyBKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZSB7Ci0JCVN0cmluZyBESVJFQ1RJVkVfVEFHID0gImpzcDpkaXJlY3RpdmUudGFnIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgRElSRUNUSVZFX0FUVFJJQlVURSA9ICJqc3A6ZGlyZWN0aXZlLmF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIERJUkVDVElWRV9WQVJJQUJMRSA9ICJqc3A6ZGlyZWN0aXZlLnZhcmlhYmxlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgQk9EWSA9ICJqc3A6Ym9keSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIEFUVFJJQlVURSA9ICJqc3A6YXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgRUxFTUVOVCA9ICJqc3A6ZWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIERPQk9EWSA9ICJqc3A6ZG9Cb2R5IjsKLQkJU3RyaW5nIElOVk9LRSA9ICJqc3A6aW52b2tlIjsKLQkJU3RyaW5nIE9VVFBVVCA9ICJqc3A6b3V0cHV0IjsKLQl9Ci0KLQlTdHJpbmcgQVRUUl9OQU1FX1RBR0RJUiA9ICJ0YWdkaXIiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgQVRUUl9OQU1FX0RJU1BMQVlfTkFNRSA9ICJkaXNwbGF5LW5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9CT0RZX0NPTlRFTlQgPSAiYm9keS1jb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfU01BTExfSUNPTiA9ICJzbWFsbC1pY29uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfTEFSR0VfSUNPTiA9ICJsYXJnZS1pY29uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9FWEFNUExFID0gImV4YW1wbGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9MQU5HVUFHRSA9ICJsYW5ndWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX0lTRUxJR05PUkVEID0gImlzRUxJZ25vcmVkIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFUVFJfTkFNRV9SRVFVSVJFRCA9ICJyZXF1aXJlZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX0ZSQUdNRU5UID0gImZyYWdtZW50IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfUlRFWFBSVkFMVUUgPSAicnRleHBydmFsdWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgQVRUUl9OQU1FX05BTUVfR0lWRU4gPSAibmFtZS1naXZlbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX05BTUVfRlJPTV9BVFRSSUJVVEUgPSAibmFtZS1mcm9tLWF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX0FMSUFTID0gImFsaWFzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfVkFSSUFCTEVfQ0xBU1MgPSAidmFyaWFibGUtY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9ERUNMQVJFID0gImRlY2xhcmUiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgQVRUUl9WQUxVRV9TQ1JJUFRMRVNTID0gInNjcmlwdGxlc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfVkFMVUVfVEFHREVQRU5ERU5UID0gInRhZ2RlcGVuZGVudCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9WQUxVRV9FTVBUWSA9ICJlbXB0eSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBBVFRSX05BTUVfVFJJTSA9ICJ0cmltIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFUVFJfTkFNRV9WQVIgPSAidmFyIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfVkFSUkVBREVSID0gInZhclJlYWRlciI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBBVFRSX05BTUVfT01JVF9YTUxfREVDTCA9ICJvbWl0LXhtbC1kZWNsYXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX0RPQ1RZUEVfUk9PVF9FTEVNRU5UID0gImRvY3R5cGUtcm9vdC1lbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfRE9DVFlQRV9TWVNURU0gPSAiZG9jdHlwZS1zeXN0ZW0iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9ET0NUWVBFX1BVQkxJQyA9ICJkb2N0eXBlLXB1YmxpYyI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBBVFRSX1ZBTFVFX05PID0gIm5vIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX1ZBTFVFX1lFUyA9ICJ5ZXMiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgQVRUUl9WQUxVRV9TQ09QRV9BVF9FTkQgPSAiQVRfRU5EIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX1ZBTFVFX1NDT1BFX0FUX0JFR0lOID0gIkFUX0JFR0lOIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX1ZBTFVFX1NDT1BFX05FU1RFRCA9ICJORVNURUQiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgQVRUUl9OQU1FX0RZTkFNSUNfQVRUUklCVVRFUyA9ICJkeW5hbWljLWF0dHJpYnV0ZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIEFUVFJfVkFMVUVfRU5DT0RJTkdfREVGQVVMVCA9ICJJU08tODg1OS0xIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBBVFRSX1ZBTFVFX1ZBUklBQkxFX0NMQVNTX0RFRkFVTFQgPSAiamF2YS5sYW5nLlN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgQVRUUl9OQU1FX01BWVNDUklQVCA9ICJtYXlzY3JpcHQiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIEFUVFJfVkFMVUVfSlZFUjEyID0gIjEuMiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgQVRUUl9WQUxVRV9KU1BfVkVSXzIwID0gIjIuMCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBKU1AgMi4xIGF0dHJpYnV0ZXMKLS8vCVN0cmluZyBBVFRSX05BTUVfREVGRVJSRURfU1lOVEFYX0FMTE9XRURfQVNfTElURVJBTCA9ICJkZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwiOyAvLyROT04tTkxTLTEkCi0vLwlTdHJpbmcgQVRUUl9OQU1FX1RSSU1fRElSRUNUSVZFX1dISVRFU1BBQ0VTID0gInRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQMjFFbGVtZW50Q29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1AyMUVsZW1lbnRDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiN2ExYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1AyMUVsZW1lbnRDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci0KLWNsYXNzIEpTUDIxRWxlbWVudENvbGxlY3Rpb24gZXh0ZW5kcyBKU1AyMEVsZW1lbnRDb2xsZWN0aW9uIHsKLQotCWNsYXNzIEpBQ3JlYXRvcjIxIGV4dGVuZHMgSkFDcmVhdGVyMjAgewotCQl2b2lkIGNyZWF0ZUZvckRpclBhZ2UoKSB7Ci0JCQlzdXBlci5jcmVhdGVGb3JEaXJQYWdlKCk7Ci0JCQlBdHRyRGVjbCBhZGVjOwotCQkJLy8gKCJ0cmltRGlyZWN0aXZlV2hpdGVzcGFjZXMiIEVOVU0gREVDTEFSRUQgKHRydWV8ZmFsc2UpICJmYWxzZSIpCi0JCQlhZGVjID0gY3JlYXRlQm9vbFR5cGUoSlNQMjFOYW1lc3BhY2UuQVRUUl9OQU1FX1RSSU1fRElSRUNUSVZFX1dISVRFU1BBQ0VTLCBBVFRSX1ZBTFVFX0ZBTFNFKTsKLQkJCWlmIChhZGVjICE9IG51bGwpIHsKLQkJCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIxTmFtZXNwYWNlLkFUVFJfTkFNRV9UUklNX0RJUkVDVElWRV9XSElURVNQQUNFUywgYWRlYyk7Ci0JCQl9Ci0JCQkvLyAoImRlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCIgRU5VTSBERUNMQVJFRCAodHJ1ZXxmYWxzZSkgImZhbHNlIikKLQkJCWFkZWMgPSBjcmVhdGVCb29sVHlwZShKU1AyMU5hbWVzcGFjZS5BVFRSX05BTUVfREVGRVJSRURfU1lOVEFYX0FMTE9XRURfQVNfTElURVJBTCwgQVRUUl9WQUxVRV9GQUxTRSk7Ci0JCQlpZiAoYWRlYyAhPSBudWxsKSB7Ci0JCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyMU5hbWVzcGFjZS5BVFRSX05BTUVfREVGRVJSRURfU1lOVEFYX0FMTE9XRURfQVNfTElURVJBTCwgYWRlYyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSkFDcmVhdGVyMjAgZ2V0QXR0cmlidXRlQ3JlYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBKQUNyZWF0b3IyMSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQMjFOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQMjFOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRlMzViNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUDIxTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQMjFOYW1lc3BhY2UgZXh0ZW5kcyBKU1AyME5hbWVzcGFjZSB7Ci0JU3RyaW5nIEpTUDIxX1VSSSA9ICIiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX1RSSU1fRElSRUNUSVZFX1dISVRFU1BBQ0VTID0gInRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX0RFRkVSUkVEX1NZTlRBWF9BTExPV0VEX0FTX0xJVEVSQUwgPSAiZGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BDTURvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUENNRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyYmZiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUENNRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogSlNQIGV4dGVuc2lvbiBmb3IgQ01Eb2N1bWVudC4KLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIHNvbWUgc2hvcnQgaGFuZCBtZXRob2RzIHRvIGdldCBkZWNsYXJhdGlvbnMKLSAqIGJ5IGEgbmFtZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBKU1BDTURvY3VtZW50IGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50IHsKLQotCS8qKgotCSAqIEEgc2hvcnQgaGFuZCBtZXRob2QgdG8gZ2V0IGEgZWxlbWVudCBkZWNsYXJhdGlvbiBmb3IgYSBKU1AgZWxlbWVudC4KLQkgKiBKU1AgZGVjbGFyYXRpb24gY2xhc3MgaW1wbGVtZW50cyBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGludGVyZmFjZS4KLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUhUTUxFbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudERlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50TmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUEVsZW1lbnRDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUEVsZW1lbnRDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MTdmOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BFbGVtZW50Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgZWxlbWVudCBkZWNsYXJhdGlvbnMgb2YgdGhlIEpTUCAxLjEgYW5kIDEuMi4KLSAqLwotY2xhc3MgSlNQRWxlbWVudENvbGxlY3Rpb24gZXh0ZW5kcyBEZWNsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lIHsKLQotCi0JY2xhc3MgVHlwZVBhY2tldCB7Ci0JCXB1YmxpYyBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCXB1YmxpYyBpbnQgY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZOwotCQlwdWJsaWMgaW50IG9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfTk9ORTsKLQkJcHVibGljIGludCBsaW5lQnJlYWsgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX05PTkU7Ci0JCXB1YmxpYyBpbnQgbGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfTk9ORTsKLQkJcHVibGljIGludCBjb3JyZWN0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5DT1JSRUNUX05PTkU7Ci0JCXB1YmxpYyBpbnQgZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfWE1MOwotCQlwdWJsaWMgYm9vbGVhbiBpbmRlbnRDaGlsZCA9IGZhbHNlOwotCi0JCXB1YmxpYyBUeXBlUGFja2V0KCkgewotCQl9Ci0JfQotCi0JLyoqIEpTUCBlbGVtZW50IGRlY2xhcmF0aW9uLiAqLwotCWNsYXNzIEVsZW1EZWNsIGV4dGVuZHMgQ01Db250ZW50SW1wbCBpbXBsZW1lbnRzIEhUTUxFbGVtZW50RGVjbGFyYXRpb24sIEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIHsKLQkJcHJpdmF0ZSBUeXBlUGFja2V0IHR5cGUgPSBudWxsOwotCQlwcml2YXRlIENNR3JvdXBJbXBsIGNvbnRlbnQgPSBudWxsOwotCQlwcml2YXRlIENNTmFtZWROb2RlTWFwSW1wbCBhdHRyaWJ1dGVzID0gbnVsbDsKLQotCQlwdWJsaWMgRWxlbURlY2woVHlwZVBhY2tldCB0KSB7Ci0JCQlzdXBlcih0Lm5hbWUsIDEsIDEpOwotCQkJdHlwZSA9IHQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCQljb250ZW50ID0gZ3JvdXA7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKENNTmFtZWROb2RlTWFwSW1wbCBhdHRycykgewotCQkJYXR0cmlidXRlcyA9IGF0dHJzOwotCQl9Ci0KLQkJLy8gaW1wbGVtZW50cyBDTU5vZGUKLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkNPTlRFTlRfSElOVCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5nZXRQcm92aWRlcihwcm9wZXJ0eU5hbWUpOwotCQkJCWlmIChwcCA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJcmV0dXJuIHBwLnN1cHBvcnRzKHRoaXMpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsgLy9EMjA4ODM5Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuQ09OVEVOVF9ISU5UKSkgewotCQkJCVN0cmluZyBteU5hbWUgPSBnZXRFbGVtZW50TmFtZSgpOwotCQkJCWlmIChteU5hbWUgPT0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuUExVR0lOKSB7Ci0JCQkJCXJldHVybiBnZXROYW1lZEl0ZW0oSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU1TKTsgLy8gb3V0ZXIgY2xhc3MgbWV0aG9kLgotCQkJCX0KLQkJCQllbHNlIGlmIChteU5hbWUgPT0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU1TKSB7Ci0JCQkJCXJldHVybiBnZXROYW1lZEl0ZW0oSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU0pOyAvLyBvdXRlciBjbGFzcyBtZXRob2QuCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlQcm9wZXJ0eVByb3ZpZGVyIHBwID0gUHJvcGVydHlQcm92aWRlckZhY3RvcnkuZ2V0UHJvdmlkZXIocHJvcGVydHlOYW1lKTsKLQkJCQlpZiAocHAgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJcmV0dXJuIHBwLmdldCh0aGlzKTsKLQkJCX0KLQkJfQotCi0JCS8vIGltcGxlbWVudGVzIENNRWxlbWVudERlY2xhcmF0aW9uCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JCX0KLQotCQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCQlyZXR1cm4gY29udGVudDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCQlyZXR1cm4gdHlwZS5jb250ZW50OwotCQl9Ci0KLQkJcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRMb2NhbEVsZW1lbnRzKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBpbXBsZW1lbnRlcyBIVE1MRWxlbWVudERlY2xhcmF0aW9uCi0JCXB1YmxpYyBIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q29ycmVjdGlvblR5cGUoKSB7Ci0JCQlyZXR1cm4gdHlwZS5jb3JyZWN0OwotCQl9Ci0KLQkJcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTUNvbnRlbnQgZ2V0SW5jbHVzaW9uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJCXJldHVybiBFTVBUWV9NQVA7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEZvcm1hdFR5cGUoKSB7Ci0JCQlyZXR1cm4gdHlwZS5mb3JtYXQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldExheW91dFR5cGUoKSB7Ci0JCQlyZXR1cm4gdHlwZS5sYXlvdXQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldExpbmVCcmVha0hpbnQoKSB7Ci0JCQlyZXR1cm4gdHlwZS5saW5lQnJlYWs7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE9taXRUeXBlKCkgewotCQkJcmV0dXJuIHR5cGUub21pdDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHNob3VsZFRlcm1pbmF0ZUF0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZGVjKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRLZWVwU3BhY2VzKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UoKSB7Ci0JCQlyZXR1cm4gdHlwZS5pbmRlbnRDaGlsZDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzSlNQKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvLyBlbGVtZW50IElEcwotCXN0YXRpYyBjbGFzcyBJZHMgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQ1JJUFRMRVQgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FWFBSRVNTSU9OID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREVDTEFSQVRJT04gPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVJFQ1RJVkVfUEFHRSA9IDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJUkVDVElWRV9JTkNMVURFID0gNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElSRUNUSVZFX1RBR0xJQiA9IDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VTRUJFQU4gPSA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRVRQUk9QRVJUWSA9IDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dFVFBST1BFUlRZID0gODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5DTFVERSA9IDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZPUldBUkQgPSAxMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUExVR0lOID0gMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BBUkFNUyA9IDEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GQUxMQkFDSyA9IDEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJBTSA9IDE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ST09UID0gMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RFWFQgPSAxNjsKLQotCQlwdWJsaWMgc3RhdGljIGludCBnZXROdW1PZklkcygpIHsKLQkJCWlmIChudW1vZmlkcyAhPSAtMSkKLQkJCQlyZXR1cm4gbnVtb2ZpZHM7Ci0KLQkJCS8vIE5PVEU6IElmIHRoZSByZWZsZWN0aW9uIGlzIHRvbyBzbG93LCB0aGlzIG1ldGhvZCBzaG91bGQKLQkJCS8vIGp1c3QgcmV0dXJuIHRoZSBsaXRlcmFsIHZhbHVlLCBsaWtlIDEwNS4KLQkJCS8vIC0tIDUvMjUvMjAwMQotCQkJQ2xhc3MgY2xhenogPSBJZHMuY2xhc3M7Ci0JCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkcygpOwotCQkJbnVtb2ZpZHMgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZpZWxkc1tpXS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiSURfIikpLy8kTk9OLU5MUy0xJAotCQkJCQludW1vZmlkcysrOwotCQkJfQotCQkJcmV0dXJuIG51bW9maWRzOwotCQl9Ci0KLQkJLy8gY2hhY2hlIHRoZSByZXN1bHQgb2YgdGhlIHJlZmxlY3Rpb24uCi0JCXByaXZhdGUgc3RhdGljIGludCBudW1vZmlkcyA9IC0xOwotCX0KLQotCS8vIGF0dHJpYnV0ZSBjcmVhdGVyCi0JY2xhc3MgSkFDcmVhdGVyIGltcGxlbWVudHMgSlNQMTFOYW1lc3BhY2UgewotCQkvLyBhdHRyaWJ1dGUgZGVjbGFyYXRpb24KLQkJY2xhc3MgQXR0ckRlY2wgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIHsKLQkJCUhUTUxDTURhdGFUeXBlSW1wbCB0eXBlID0gbnVsbDsKLQkJCWludCB1c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0KLQkJCS8vIG1ldGhvZHMKLQkJCXB1YmxpYyBBdHRyRGVjbChTdHJpbmcgYXR0ck5hbWUpIHsKLQkJCQlzdXBlcihhdHRyTmFtZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ck5hbWUoKSB7Ci0JCQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBDTURhdGFUeXBlIGdldEF0dHJUeXBlKCkgewotCQkJCXJldHVybiB0eXBlOwotCQkJfQotCi0JCQkvKiogQGRlcHJlY2F0ZWQgYnkgc3VwZXJjbGFzcyAqLwotCQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJaWYgKHR5cGUuZ2V0SW1wbGllZFZhbHVlS2luZCgpICE9IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxUKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlyZXR1cm4gdHlwZS5nZXRJbXBsaWVkVmFsdWUoKTsKLQkJCX0KLQotCQkJLyoqIEBkZXByZWNhdGVkICBieSBzdXBlcmNsYXNzICovCi0JCQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKSB7Ci0JCQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKEFycmF5cy5hc0xpc3QodHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkpKTsKLQkJCQlyZXR1cm4gdi5lbGVtZW50cygpOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJCXJldHVybiBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFVzYWdlKCkgewotCQkJCXJldHVybiB1c2FnZTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gc2hvdWxkSWdub3JlQ2FzZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zID0gbnVsbDsKLQotCQlwdWJsaWMgSkFDcmVhdGVyKCkgewotCQkJZGVjbGFyYXRpb25zID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCBnZXREZWNsYXJhdGlvbnMoaW50IGVpZCkgewotCQkJc3dpdGNoIChlaWQpIHsKLQkJCQljYXNlIElkcy5JRF9ESVJFQ1RJVkVfUEFHRSA6Ci0JCQkJCWNyZWF0ZUZvckRpclBhZ2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfRElSRUNUSVZFX0lOQ0xVREUgOgotCQkJCQljcmVhdGVGb3JEaXJJbmNsdWRlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX0RJUkVDVElWRV9UQUdMSUIgOgotCQkJCQljcmVhdGVGb3JEaXJUYWdsaWIoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfVVNFQkVBTiA6Ci0JCQkJCWNyZWF0ZUZvclVzZUJlYW4oKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfU0VUUFJPUEVSVFkgOgotCQkJCQljcmVhdGVGb3JTZXRQcm9wZXJ0eSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9HRVRQUk9QRVJUWSA6Ci0JCQkJCWNyZWF0ZUZvckdldFByb3BlcnR5KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX0lOQ0xVREUgOgotCQkJCQljcmVhdGVGb3JJbmNsdWRlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX0ZPUldBUkQgOgotCQkJCQljcmVhdGVGb3JGb3J3YXJkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX1BMVUdJTiA6Ci0JCQkJCWNyZWF0ZUZvclBsdWdpbigpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9QQVJBTSA6Ci0JCQkJCWNyZWF0ZUZvclBhcmFtKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX1JPT1QgOgotCQkJCQljcmVhdGVGb3JSb290KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQkvLyBzaG91bGQgd2Fybi4KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gZGVjbGFyYXRpb25zOwotCQl9Ci0KLQkJQXR0ckRlY2wgY3JlYXRlQm9vbFR5cGUoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZWYWx1ZSkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChuYW1lKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIGRlZlZhbHVlKTsKLQkJCXJldHVybiBhZGVjOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckRpclBhZ2UoKSB7Ci0JCQlBdHRyRGVjbCBhZGVjID0gbnVsbDsKLQkJCS8vICgibGFuZ3VhZ2UiIENEQVRBIERFQ0xBUkVEICJqYXZhIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0xBTkdVQUdFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0pBVkEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTEFOR1VBR0UsIGFkZWMpOwotCi0JCQkvLyAoImV4dGVuZHMiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9FWFRFTkRTKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9FWFRFTkRTLCBhZGVjKTsKLQotCQkJLy8gKCJjb250ZW50VHlwZSIgQ0RBVEEgREVDTEFSRUQgInRleHQvaHRtbDsgSVNPLTg4NTktMSIpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9DT05URU5UX1RZUEUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfQ1RfREVGQVVMVCk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9DT05URU5UX1RZUEUsIGFkZWMpOwotCi0JCQkvLyAoImltcG9ydCIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0lNUE9SVCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSU1QT1JULCBhZGVjKTsKLQotCQkJLy8gKCJzZXNzaW9uIiBFTlVNIERFQ0xBUkVEICh0cnVlfGZhbHNlKSAidHJ1ZSIpCi0JCQlhZGVjID0gY3JlYXRlQm9vbFR5cGUoQVRUUl9OQU1FX1NFU1NJT04sIEFUVFJfVkFMVUVfVFJVRSk7Ci0JCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1NFU1NJT04sIGFkZWMpOwotCi0JCQkvLyAoImJ1ZmZlciIgQ0RBVEEgREVDTEFSRUQgIjhrYiIpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9CVUZGRVIpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfQlVGU0laX0RFRkFVTFQpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQlVGRkVSLCBhZGVjKTsKLQotCQkJLy8gKCJhdXRvRmx1c2giIEVOVU0gREVDTEFSRUQgKHRydWV8ZmFsc2UpICJ0cnVlIikKLQkJCWFkZWMgPSBjcmVhdGVCb29sVHlwZShBVFRSX05BTUVfQVVUT0ZMVVNILCBBVFRSX1ZBTFVFX1RSVUUpOwotCQkJaWYgKGFkZWMgIT0gbnVsbCkKLQkJCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9BVVRPRkxVU0gsIGFkZWMpOwotCi0JCQkvLyAoImlzVGhyZWFkU2FmZSIgRU5VTSBERUNMQVJFRCAodHJ1ZXxmYWxzZSkgInRydWUiKQotCQkJYWRlYyA9IGNyZWF0ZUJvb2xUeXBlKEFUVFJfTkFNRV9JU19USFJFQURfU0FGRSwgQVRUUl9WQUxVRV9UUlVFKTsKLQkJCWlmIChhZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSVNfVEhSRUFEX1NBRkUsIGFkZWMpOwotCi0JCQkvLyAoImluZm8iIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9JTkZPKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JTkZPLCBhZGVjKTsKLQotCQkJLy8gKCJlcnJvclBhZ2UiIFVSSSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfRVJST1JfUEFHRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0VSUk9SX1BBR0UsIGFkZWMpOwotCi0JCQkvLyAoImlzRXJyb3JQYWdlIiBFTlVNIERFQ0xBUkVEICh0cnVlfGZhbHNlKSAiZmFsc2UiKQotCQkJYWRlYyA9IGNyZWF0ZUJvb2xUeXBlKEFUVFJfTkFNRV9JU19FUlJPUl9QQUdFLCBBVFRSX1ZBTFVFX0ZBTFNFKTsKLQkJCWlmIChhZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSVNfRVJST1JfUEFHRSwgYWRlYyk7Ci0KLQkJCS8vICgicGFnZUVuY29kaW5nIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUEFHRV9FTkNPRElORyk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfUEFHRV9FTkNPRElORywgYWRlYyk7Ci0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JEaXJJbmNsdWRlKCkgewotCQkJLy8gKCJmaWxlIiBVUkkgUkVRVUlSRUQpOyBEZWZlY3QgVE9STzoxODUyNDEKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0ZJTEUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0ZJTEUsIGFkZWMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckRpclRhZ2xpYigpIHsKLQkJCS8vICgidXJpIiBVUkkgUkVRVUlSRUQpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9VUkkpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1VSSSwgYWRlYyk7Ci0KLQkJCS8vICgicHJlZml4IiBDREFUQSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1BSRUZJWCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QUkVGSVgsIGFkZWMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvclVzZUJlYW4oKSB7Ci0JCQkvLyAoImlkIiBJRCBSRVFVSVJFRCkKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0lEKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5JRCk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lELCBhZGVjKTsKLQotCQkJLy8gKCJzY29wZSIgRU5VTSBERUNMQVJFRCAocGFnZXxzZXNzaW9ufHJlcXVlc3R8YXBwbGljYXRpb24pICJwYWdlIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1NDT1BFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1BBR0UsIEFUVFJfVkFMVUVfU0VTU0lPTiwgQVRUUl9WQUxVRV9SRVFVRVNULCBBVFRSX1ZBTFVFX0FQUExJQ0FUSU9OfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1BBR0UpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfU0NPUEUsIGFkZWMpOwotCi0JCQkvLyAoImNsYXNzIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQ0xBU1MpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0NMQVNTLCBhZGVjKTsKLQotCQkJLy8gKCJiZWFuTmFtZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0JFQU5fTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQkVBTl9OQU1FLCBhZGVjKTsKLQotCQkJLy8gKCJ0eXBlIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVFlQRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVFlQRSwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yU2V0UHJvcGVydHkoKSB7Ci0JCQkvLyAoIm5hbWUiIElEUkVGIFJFUVVJUkVEKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuSURSRUYpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OQU1FLCBhZGVjKTsKLQotCQkJLy8gKCJwcm9wZXJ0eSIgQ0RBVEEgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9QUk9QRVJUWSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QUk9QRVJUWSwgYWRlYyk7Ci0KLQkJCS8vICgidmFsdWUiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9WQUxVRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVkFMVUUsIGFkZWMpOwotCi0JCQkvLyAoInBhcmFtIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUEFSQU0pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1BBUkFNLCBhZGVjKTsKLQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckdldFByb3BlcnR5KCkgewotCQkJLy8gKCJuYW1lIiBJRFJFRiBSRVFVSVJFRCkKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX05BTUUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLklEUkVGKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYWRlYyk7Ci0KLQkJCS8vICgicHJvcGVydHkiIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUFJPUEVSVFkpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfUFJPUEVSVFksIGFkZWMpOwotCi0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9ySW5jbHVkZSgpIHsKLQkJCUF0dHJEZWNsIGFkZWMgPSBudWxsOwotCQkJLy8gKCJwYWdlIiBVUkkgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9QQUdFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QQUdFLCBhZGVjKTsKLQotCQkJLy8gKCJmbHVzaCIgRU5VTSBPUFRJT05BTCAodHJ1ZXxmYWxzZSkpOyBEZWZlY3QgVE9STzoxODUyNDEKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0ZMVVNIKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9GQUxTRSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9GTFVTSCwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yRm9yd2FyZCgpIHsKLQkJCS8vICgicGFnZSIgVVJJIFJFUVVJUkVEKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUEFHRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfUEFHRSwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yUGx1Z2luKCkgewotCQkJLy8gKCJ0eXBlIiBFTlVNIFJFUVVJUkVEIChiZWFufGFwcGxldCkpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9UWVBFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfQkVBTiwgQVRUUl9WQUxVRV9BUFBMRVR9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1RZUEUsIGFkZWMpOwotCi0JCQkvLyAoImNvZGUiIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQ09ERSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQ09ERSwgYWRlYyk7Ci0KLQkJCS8vICgiY29kZWJhc2UiIFVSSSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0NPREVCQVNFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9DT0RFQkFTRSwgYWRlYyk7Ci0KLQkJCS8vICgiYWxpZ24iIEVOVU0gSU1QTElFRCAodG9wfG1pZGRsZXxib3R0b218bGVmdHxyaWdodCkpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9BTElHTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSBhbGlnbnMgPSB7QVRUUl9WQUxVRV9UT1AsIEFUVFJfVkFMVUVfTUlERExFLCBBVFRSX1ZBTFVFX0JPVFRPTSwgQVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX1JJR0hUfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKGFsaWducyk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9BTElHTiwgYWRlYyk7Ci0KLQkJCS8vICgiYXJjaGl2ZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0FSQ0hJVkUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FSQ0hJVkUsIGFkZWMpOwotCi0JCQkvLyAoImhlaWdodCIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0hFSUdIVCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSEVJR0hULCBhZGVjKTsKLQotCQkJLy8gKCJoc3BhY2UiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9IU1BBQ0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0hTUEFDRSwgYWRlYyk7Ci0KLQkJCS8vICgianJldmVyc2lvbiIgQ0RBVEEgREVDTEFSRUQgIjEuMSIpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9KUkVWRVJTSU9OKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0pWRVIxMSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9KUkVWRVJTSU9OLCBhZGVjKTsKLQotCQkJLy8gKCJuYW1lIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYWRlYyk7Ci0KLQkJCS8vICgidnNwYWNlIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVlNQQUNFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9WU1BBQ0UsIGFkZWMpOwotCi0JCQkvLyAoIndpZHRoIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfV0lEVEgpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1dJRFRILCBhZGVjKTsKLQotCQkJLy8gKCJuc3BsdWdpbnVybCIgVVJJIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OU1BMVUdJTlVSTCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05TUExVR0lOVVJMLCBhZGVjKTsKLQotCQkJLy8gKCJpZXBsdWdpbnVybCIgVVJJIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9JRVBMVUdJTlVSTCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lFUExVR0lOVVJMLCBhZGVjKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JQYXJhbSgpIHsKLQkJCS8vICgibmFtZSIgQ0RBVEEgUkVRVUlSRUQpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OQU1FKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05BTUUsIGFkZWMpOwotCi0JCQkvLyAoInZhbHVlIiBDREFUQSBSRVFVSVJFRCk7IERlZmVjdCBUT1JPOjE4NTI0MQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVkFMVUUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVkFMVUUsIGFkZWMpOwotCi0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yUm9vdCgpIHsKLQkJCS8vICgieG1sbnM6anNwIiBDREFUQSAiaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9YTUxOU19KU1ApOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfWE1MTlNfSlNQKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1hNTE5TX0pTUCwgYWRlYyk7Ci0JCQkvLyAoInZlcnNpb24iIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVkVSU0lPTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9WRVJTSU9OLCBhZGVjKTsKLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgc3RhdGljIENNTmFtZWROb2RlTWFwIEVNUFRZX01BUCA9IG5ldyBDTU5hbWVkTm9kZU1hcCgpIHsKLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQkJcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmFtZXMgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJbmFtZXMgPSBuZXcgU3RyaW5nW0lkcy5nZXROdW1PZklkcygpXTsKLQkJbmFtZXNbSWRzLklEX1NDUklQVExFVF0gPSBTQ1JJUFRMRVQ7Ci0JCW5hbWVzW0lkcy5JRF9FWFBSRVNTSU9OXSA9IEVYUFJFU1NJT047Ci0JCW5hbWVzW0lkcy5JRF9ERUNMQVJBVElPTl0gPSBERUNMQVJBVElPTjsKLQkJbmFtZXNbSWRzLklEX0RJUkVDVElWRV9QQUdFXSA9IERJUkVDVElWRV9QQUdFOwotCQluYW1lc1tJZHMuSURfRElSRUNUSVZFX0lOQ0xVREVdID0gRElSRUNUSVZFX0lOQ0xVREU7Ci0JCW5hbWVzW0lkcy5JRF9ESVJFQ1RJVkVfVEFHTElCXSA9IERJUkVDVElWRV9UQUdMSUI7Ci0JCW5hbWVzW0lkcy5JRF9VU0VCRUFOXSA9IFVTRUJFQU47Ci0JCW5hbWVzW0lkcy5JRF9TRVRQUk9QRVJUWV0gPSBTRVRQUk9QRVJUWTsKLQkJbmFtZXNbSWRzLklEX0dFVFBST1BFUlRZXSA9IEdFVFBST1BFUlRZOwotCQluYW1lc1tJZHMuSURfSU5DTFVERV0gPSBJTkNMVURFOwotCQluYW1lc1tJZHMuSURfRk9SV0FSRF0gPSBGT1JXQVJEOwotCQluYW1lc1tJZHMuSURfUExVR0lOXSA9IFBMVUdJTjsKLQkJbmFtZXNbSWRzLklEX1BBUkFNU10gPSBQQVJBTVM7Ci0JCW5hbWVzW0lkcy5JRF9GQUxMQkFDS10gPSBGQUxMQkFDSzsKLQkJbmFtZXNbSWRzLklEX1BBUkFNXSA9IFBBUkFNOwotCQluYW1lc1tJZHMuSURfUk9PVF0gPSBST09UOwotCQluYW1lc1tJZHMuSURfVEVYVF0gPSBURVhUOwotCX0KLQotCUpTUEVsZW1lbnRDb2xsZWN0aW9uKFN0cmluZ1tdIG5hbWVzLCBib29sZWFuIHRvbGVyYW50KSB7Ci0JCXN1cGVyKG5hbWVzLCB0b2xlcmFudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEpTUEVsZW1lbnRDb2xsZWN0aW9uKCkgewotCQlzdXBlcihuYW1lcywgVE9MRVJBTlRfQ0FTRSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBlbGVtZW50TmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBjcmVhdGUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBjcmVhdGVFbGVtRGVjbChnZXRJRChlbGVtZW50TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlaWQgaW50Ci0JICovCi0JQ01Hcm91cEltcGwgY3JlYXRlQ29udGVudChpbnQgZWlkKSB7Ci0JCWlmIChlaWQgPT0gSURfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCi0JCUNNR3JvdXBJbXBsIGNvbnRlbnQgPSBudWxsOwotCQlDTU5vZGUgY2hpbGQgPSBudWxsOwotCi0JCXN3aXRjaCAoZWlkKSB7Ci0JCQljYXNlIElkcy5JRF9JTkNMVURFIDoKLQkJCWNhc2UgSWRzLklEX0ZPUldBUkQgOgotCQkJCS8vIChqc3A6cGFyYW0pKgotCQkJCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkJCWNoaWxkID0gaXRlbShJZHMuSURfUEFSQU0pOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCQljb250ZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1BMVUdJTiA6Ci0JCQkJLy8gKGpzcDpwYXJhbXMgfCBqc3A6ZmFsbGJhY2spPwotCQkJCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIDEpOwotCQkJCS8vIGpzcDpwYXJhbXMKLQkJCQljaGlsZCA9IGl0ZW0oSWRzLklEX1BBUkFNUyk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCS8vIGpzcDpmYWxsYmFjawotCQkJCWNoaWxkID0gaXRlbShJZHMuSURfRkFMTEJBQ0spOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCQljb250ZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1BBUkFNUyA6Ci0JCQkJLy8gKGpzcDpwYXJhbSkrCi0JCQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCQkJY2hpbGQgPSBpdGVtKElkcy5JRF9QQVJBTSk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfUk9PVCA6Ci0JCQkJLy8gJUJvZHk7Ci0JCQkJLy8gLS0+IChqc3A6dGV4dHwlRGlyZWN0aXZlczt8JVNjcmlwdHM7fCVBY3Rpb25zOykqCi0JCQkJLy8gICAgICVEaXJlY3RpdmVzIC0tPiBqc3A6ZGlyZWN0aXZlLnBhZ2V8anNwOmRpcmVjdGl2ZS5pbmNsdWRlCi0JCQkJLy8gICAgICVTY3JpcHRzOyAtLT4ganNwOnNjcmlwdGxldHxqc3A6ZGVjbGFyYXRpb258anNwOmV4cHJlc3Npb24KLQkJCQkvLyAgICAgJUFjdGlvbnMgLS0+IGpzcDp1c2VCZWFufGpzcC5zZXRQcm9wZXJ0eXxqc3A6Z2V0UHJvcGVydHkKLQkJCQkvLyAgICAgICAgICAgICAgICAgIHxqc3A6aW5jbHVkZXxqc3A6Zm9yd2FyZHxqc3A6cGx1Z2luCi0JCQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkJCWludCB2YWxpZENoaWxkcmVuW10gPSB7SWRzLklEX1RFWFQsCi0JCQkJLy8gJURpcmVjdHZlczsKLQkJCQkJCQlJZHMuSURfRElSRUNUSVZFX1BBR0UsIElkcy5JRF9ESVJFQ1RJVkVfSU5DTFVERSwKLQkJCQkJCQkvLyAlU2NyaXB0czsKLQkJCQkJCQlJZHMuSURfU0NSSVBUTEVULCBJZHMuSURfREVDTEFSQVRJT04sIElkcy5JRF9FWFBSRVNTSU9OLAotCQkJCQkJCS8vICVBY3Rpb25zOwotCQkJCQkJCUlkcy5JRF9VU0VCRUFOLCBJZHMuSURfU0VUUFJPUEVSVFksIElkcy5JRF9HRVRQUk9QRVJUWSwgSWRzLklEX0lOQ0xVREUsIElkcy5JRF9GT1JXQVJELCBJZHMuSURfUExVR0lOfTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJY2hpbGQgPSBpdGVtKHZhbGlkQ2hpbGRyZW5baV0pOwotCQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlaWQgaW50Ci0JICovCi0JSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVFbGVtRGVjbChpbnQgZWlkKSB7Ci0JCWlmIChlaWQgPT0gSURfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCi0JCVR5cGVQYWNrZXQgcGFja2V0ID0gbmV3IFR5cGVQYWNrZXQoKTsKLQkJc3dpdGNoIChlaWQpIHsKLQkJCWNhc2UgSWRzLklEX1NDUklQVExFVCA6Ci0JCQkJLy8gY29udGVudCwgb21pdCwgbGluZUJyZWFrLCBsYXlvdXQsIGNvcnJlY3QsIGZvcm1hdAotCQkJCS8vIHNjcmlwdGxldAotCQkJCXBhY2tldC5uYW1lID0gU0NSSVBUTEVUOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX1NDUklQVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0VYUFJFU1NJT04gOgotCQkJCS8vIGV4cHJlc3Npb24KLQkJCQlwYWNrZXQubmFtZSA9IEVYUFJFU1NJT047Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfU0NSSVBUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfREVDTEFSQVRJT04gOgotCQkJCS8vIGRlY2xhcmF0aW9uCi0JCQkJcGFja2V0Lm5hbWUgPSBERUNMQVJBVElPTjsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9TQ1JJUFQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9ESVJFQ1RJVkVfUEFHRSA6Ci0JCQkJLy8gZGlyZWN0aXZlLnBhZ2UKLQkJCQlwYWNrZXQubmFtZSA9IERJUkVDVElWRV9QQUdFOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfRElSRUNUSVZFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfRElSRUNUSVZFX0lOQ0xVREUgOgotCQkJCS8vIGRpcmVjdGl2ZS5pbmxjdWRlCi0JCQkJcGFja2V0Lm5hbWUgPSBESVJFQ1RJVkVfSU5DTFVERTsKLQkJCQlwYWNrZXQub21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX0RJUkVDVElWRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0RJUkVDVElWRV9UQUdMSUIgOgotCQkJCS8vIGRpcmVjdGl2ZS50YWdsaWIKLQkJCQlwYWNrZXQubmFtZSA9IERJUkVDVElWRV9UQUdMSUI7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9ESVJFQ1RJVkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9VU0VCRUFOIDoKLQkJCQkvLyB1c2VCZWFuCi0JCQkJcGFja2V0Lm5hbWUgPSBVU0VCRUFOOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1NFVFBST1BFUlRZIDoKLQkJCQkvLyBzZXRQcm9wZXJ0eQotCQkJCXBhY2tldC5uYW1lID0gU0VUUFJPUEVSVFk7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9HRVRQUk9QRVJUWSA6Ci0JCQkJLy8gZ2V0UHJvcGVydHkKLQkJCQlwYWNrZXQubmFtZSA9IEdFVFBST1BFUlRZOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfSU5DTFVERSA6Ci0JCQkJLy8gaW5jbHVkZQotCQkJCXBhY2tldC5uYW1lID0gSU5DTFVERTsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0ZPUldBUkQgOgotCQkJCS8vIGZvcndhcmQKLQkJCQlwYWNrZXQubmFtZSA9IEZPUldBUkQ7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9QTFVHSU4gOgotCQkJCS8vIHBsdWdpbgotCQkJCXBhY2tldC5uYW1lID0gUExVR0lOOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9QQVJBTVMgOgotCQkJCS8vIHBhcmFtcwotCQkJCXBhY2tldC5uYW1lID0gUEFSQU1TOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9GQUxMQkFDSyA6Ci0JCQkJLy8gZmFsbGJhY2sKLQkJCQlwYWNrZXQubmFtZSA9IEZBTExCQUNLOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1BBUkFNIDoKLQkJCQkvLyBwYXJhbQotCQkJCXBhY2tldC5uYW1lID0gUEFSQU07Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9ST09UIDoKLQkJCQlwYWNrZXQubmFtZSA9IFJPT1Q7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47IC8vIHNhbWUgYXMgSFRNTAotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfVEVYVCA6Ci0JCQkJcGFja2V0Lm5hbWUgPSBURVhUOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJLy8gdW5rbm93biBJRAotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJRWxlbURlY2wgZGVjID0gbmV3IEVsZW1EZWNsKHBhY2tldCk7Ci0KLQkJQ01Hcm91cEltcGwgY29udGVudCA9IGNyZWF0ZUNvbnRlbnQoZWlkKTsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCWRlYy5zZXRDb250ZW50KGNvbnRlbnQpOwotCi0JCUpBQ3JlYXRlciBjcmVhdGVyID0gbmV3IEpBQ3JlYXRlcigpOwotCQlkZWMuc2V0QXR0cmlidXRlcyhjcmVhdGVyLmdldERlY2xhcmF0aW9ucyhlaWQpKTsKLQotCQlyZXR1cm4gZGVjOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcGVydHlQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOTcyZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotLyoqCi0gKiBQcm9wZXJ0eVByb3ZpZGVyIGNsYXNzLgotICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gaW5zdGFuY2VzLgotICovCi1pbnRlcmZhY2UgUHJvcGVydHlQcm92aWRlciB7Ci0KLQlib29sZWFuIHN1cHBvcnRzKEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpOwotCi0JT2JqZWN0IGdldChIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcGVydHlQcm92aWRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcGVydHlQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWViMWFiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWFwOwotCi0vKioKLSAqIFRoZSBmYWN0b3J5IG9iamVjdCBvZiBQcm9wZXJ0eVByb3ZpZGVyLgotICovCi1maW5hbCBjbGFzcyBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSB7Ci0KLQotCS8qKgotCSAqIERlZmF1bHRQcm92aWRlciBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciB1bmtub3duIHByb3BlcnRpZXMuCi0JICogSXQgYWx3YXlzIHJldHVybnMgbnVsbCB2YWx1ZSBmb3IgYW55IHByb3BlcnRpZXMuCi0JICovCi0JY2xhc3MgRGVmYXVsdFByb3ZpZGVyIGltcGxlbWVudHMgUHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBEZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXQoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIGltcGxlbWVudHMgUHJvcGVydHlQcm92aWRlciB7Ci0JCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpIHsKLQkJCXJldHVybiAoZWRlY2wgIT0gbnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldChIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKSB7Ci0JCQlpZiAoIShlZGVjbCBpbnN0YW5jZW9mIEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBnZXRFbGVtZW50UHJvcGVydHkoKEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uKWVkZWNsKTsKLQkJfQotCi0JCWFic3RyYWN0IHByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpOwotCX0KLQotCS8qCi0JICogInRhZ0luZm8iCi0JICogZ2V0cyBkb2N1bWVudGF0aW9uIGZvciB0aGUgZWxlbWVudAotCSAqLwotCWNsYXNzIFBQVGFnSW5mbyBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgaHRtbEFubm90YXRpb25Mb2MgPSAiZGF0YS9odG1yZWYueG1sIjsgLy8kTk9OLU5MUy0xJAotCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbk1hcCBmQW5ub3RhdGlvbk1hcCA9IG51bGw7Ci0KLQkJcHVibGljIFBQVGFnSW5mbygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogR2V0cyB0aGUgYW5ub3RhdGlvbk1hcC4KLQkJICogQHJldHVybiBSZXR1cm5zIGEgQW5ub3RhdGlvbk1hcAotCQkgKi8KLQkJcHJvdGVjdGVkIEFubm90YXRpb25NYXAgZ2V0QW5ub3RhdGlvbk1hcCgpIHsKLQkJCWlmIChmQW5ub3RhdGlvbk1hcCA9PSBudWxsKSB7Ci0JCQkJZkFubm90YXRpb25NYXAgPSBuZXcgQW5ub3RhdGlvbk1hcCgpOwotCQkJCXRyeSB7Ci0JCQkJCWZBbm5vdGF0aW9uTWFwLmxvYWQoaHRtbEFubm90YXRpb25Mb2MsIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBubyBhbm5vdGF0aW9uIGF2YWlsYWJsZQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmQW5ub3RhdGlvbk1hcDsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCWlmIChkZWNsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCXJldHVybiBnZXRBbm5vdGF0aW9uTWFwKCkuZ2V0UHJvcGVydHkoKChIVE1MRWxlbWVudERlY2xhcmF0aW9uKWRlY2wpLmdldEVsZW1lbnROYW1lKCksICJ0YWdJbmZvIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJzaG91bGRLZWVwU3BhY2UiCi0JICovCi0JY2xhc3MgUFBTaG91bGRLZWVwU3BhY2UgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQU2hvdWxkS2VlcFNwYWNlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihkZWNsLnNob3VsZEtlZXBTcGFjZXMoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJzaG91bGRJbmRlbnRDaGlsZFNvdXJjZSIKLQkgKi8KLQljbGFzcyBQUFNob3VsZEluZGVudENoaWxkU291cmNlIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUFNob3VsZEluZGVudENoaWxkU291cmNlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihkZWNsLnNob3VsZEluZGVudENoaWxkU291cmNlKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAidGVybWluYXRvcnMiCi0JICovCi0JY2xhc3MgUFBUZXJtaW5hdG9ycyBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBUZXJtaW5hdG9ycygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlpZiAoISAoZGVjbCBpbnN0YW5jZW9mIEhUTUxFbGVtRGVjbEltcGwpKSByZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoKEhUTUxFbGVtRGVjbEltcGwpZGVjbCkuZ2V0VGVybWluYXRvcnMoKTsKLQkJfQotCX0KLQotCS8qCi0JICogInByb2hpYml0ZWRBbmNlc3RvcnMiCi0JICovCi0JY2xhc3MgUFBQcm9oaWJpdGVkQW5jZXN0b3JzIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIGRlY2wuZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAiaXNKU1AiCi0JICovCi0JY2xhc3MgUFBJc0pTUCBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBJc0pTUCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZGVjbC5pc0pTUCgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogImlzWEhUTUwiCi0JICogSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBpdHNlbGYgbmV2ZXIgcmVwcmVzZW50IGFueSBYSFRNTCBlbGVtZW50IGRlY2xhcmF0aW9uLgotCSAqIFNvLCB0aGlzIHByb3BlcnR5IG11c3QgYmUgYWx3YXlzIGZhbHNlLgotCSAqLwotCWNsYXNzIFBQSXNYSFRNTCBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBJc1hIVE1MKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJpc1NTSSIKLQkgKiBFYWNoIGRlY2xhcmF0aW9uIGNsYXNzIGZvciBTU0kgZWxlbWVudHMgbXVzdCBwcm92aWRlIHRoaXMgcHJvcGVydHkgaXRzZWxmLAotCSAqIGFuZCB0aGVuIHJldHVybiB0cnVlLiAgT3RoZXIgZGVjbGFyYXRpb24gbXVzdCBhbHdheXMgcmV0dXJuIGZhbHNlLgotCSAqLwotCWNsYXNzIFBQSXNTU0kgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQSXNTU0koKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qCi0JICogImxpbmVCcmVha0hpbnQiCi0JICovCi0JY2xhc3MgUFBMaW5lQnJlYWtIaW50IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUExpbmVCcmVha0hpbnQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJU3RyaW5nIGhpbnQgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19OT05FOwotCQkJc3dpdGNoIChkZWNsLmdldExpbmVCcmVha0hpbnQoKSkgewotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19BRlRFUl9TVEFSVCA6Ci0JCQkJCWhpbnQgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19BRlRFUl9TVEFSVDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EIDoKLQkJCQkJaGludCA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfTk9ORSA6Ci0JCQkJLy8gbm90aGluZyB0byBkbwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiBoaW50OwotCQl9Ci0JfQotCi0JLyoKLQkgKiAibGF5b3V0VHlwZSIKLQkgKi8KLQljbGFzcyBQUExheW91dFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQTGF5b3V0VHlwZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkxBWU9VVF9OT05FOwotCQkJc3dpdGNoIChkZWNsLmdldExheW91dFR5cGUoKSkgewotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQkxPQ0sgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX0JMT0NLOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0JSRUFLIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkxBWU9VVF9CUkVBSzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU4gOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX0hJRERFTjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1QgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX09CSkVDVDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9XUkFQIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkxBWU9VVF9XUkFQOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX05PTkUgOgotCQkJCS8vIG5vdGhpbmcgdG8gZG8uCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJvbWl0VHlwZSIKLQkgKi8KLQljbGFzcyBQUE9taXRUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUE9taXRUeXBlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCVN0cmluZyB0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9OT05FOwotCQkJc3dpdGNoIChkZWNsLmdldE9taXRUeXBlKCkpIHsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9CT1RIIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfQk9USDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkRfREVGQVVMVCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9ERUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkRfTVVTVCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9NVVNUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9OT05FIDoKLQkJCQkvLyBub3RoaW5nIHRvIGRvLgotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiB0eXBlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAiaW5jbHVzaW9uIgotCSAqLwotCWNsYXNzIFBQSW5jbHVzaW9uIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUEluY2x1c2lvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gZGVjbC5nZXRJbmNsdXNpb24oKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlQcm92aWRlciBnZXRQcm92aWRlcihTdHJpbmcgcHJvcE5hbWUpIHsKLQkJUHJvcGVydHlQcm92aWRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0JCVByb3BlcnR5UHJvdmlkZXIgcHAgPSAoUHJvcGVydHlQcm92aWRlcikgZmFjdG9yeS5yZWdpc3RyeS5nZXQocHJvcE5hbWUpOwotCQlpZiAocHAgIT0gbnVsbCkKLQkJCXJldHVybiBwcDsKLQotCQlwcCA9IGZhY3RvcnkuY3JlYXRlKHByb3BOYW1lKTsKLQkJaWYgKHBwID09IG51bGwpCi0JCQlyZXR1cm4gZmFjdG9yeS5kZWZhdWx0UHJvdmlkZXI7Ci0KLQkJZmFjdG9yeS5yZWdpc3RyeS5wdXQocHJvcE5hbWUsIHBwKTsKLQkJcmV0dXJuIHBwOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCXByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlICE9IG51bGwpCi0JCQlyZXR1cm4gaW5zdGFuY2U7Ci0JCWluc3RhbmNlID0gbmV3IFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIEhhc2h0YWJsZSByZWdpc3RyeSA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIFByb3BlcnR5UHJvdmlkZXIgZGVmYXVsdFByb3ZpZGVyID0gbmV3IERlZmF1bHRQcm92aWRlcigpOwotCi0JcHJpdmF0ZSBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5UHJvdmlkZXIgY3JlYXRlKFN0cmluZyBwcm9wTmFtZSkgewotCQlQcm9wZXJ0eVByb3ZpZGVyIHBwID0gbnVsbDsKLQkJaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpCi0JCQlwcCA9IG5ldyBQUElzSlNQKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCXBwID0gbmV3IFBQSXNYSFRNTCgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKQotCQkJcHAgPSBuZXcgUFBJc1NTSSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5MQVlPVVRfVFlQRSkpCi0JCQlwcCA9IG5ldyBQUExheW91dFR5cGUoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuTElORV9CUkVBS19ISU5UKSkKLQkJCXBwID0gbmV3IFBQTGluZUJyZWFrSGludCgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5QUk9ISUJJVEVEX0FOQ0VTVE9SUykpCi0JCQlwcCA9IG5ldyBQUFByb2hpYml0ZWRBbmNlc3RvcnMoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0tFRVBfU1BBQ0UpKQotCQkJcHAgPSBuZXcgUFBTaG91bGRLZWVwU3BhY2UoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lOREVOVF9DSElMRF9TT1VSQ0UpKQotCQkJcHAgPSBuZXcgUFBTaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5URVJNSU5BVE9SUykpCi0JCQlwcCA9IG5ldyBQUFRlcm1pbmF0b3JzKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlRBR0lORk8pKQotCQkJcHAgPSBuZXcgUFBUYWdJbmZvKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSkpCi0JCQlwcCA9IG5ldyBQUE9taXRUeXBlKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklOQ0xVU0lPTikpCi0JCQlwcCA9IG5ldyBQUEluY2x1c2lvbigpOwotCi0JCXJldHVybiBwcDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1RhZzIwRWxlbWVudENvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvVGFnMjBFbGVtZW50Q29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGQ4NmJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvVGFnMjBFbGVtZW50Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgZWxlbWVudCBkZWNsYXJhdGlvbnMgb2YgSlNQIDIuMCBUYWcgZmlsZXMuCi0gKi8KLWZpbmFsIGNsYXNzIFRhZzIwRWxlbWVudENvbGxlY3Rpb24gZXh0ZW5kcyBKU1BFbGVtZW50Q29sbGVjdGlvbiBpbXBsZW1lbnRzIEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lIHsKLQkvLyBlbGVtZW50IElEcwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFRhZ0lkczIwIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0NSSVBUTEVUID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVhQUkVTU0lPTiA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFQ0xBUkFUSU9OID0gMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElSRUNUSVZFX1RBRyA9IDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJUkVDVElWRV9JTkNMVURFID0gNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElSRUNUSVZFX1RBR0xJQiA9IDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VTRUJFQU4gPSA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRVRQUk9QRVJUWSA9IDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dFVFBST1BFUlRZID0gODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5DTFVERSA9IDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZPUldBUkQgPSAxMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUExVR0lOID0gMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BBUkFNUyA9IDEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GQUxMQkFDSyA9IDEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJBTSA9IDE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ST09UID0gMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RFWFQgPSAxNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElSRUNUSVZFX1ZBUklBQkxFID0gMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJUkVDVElWRV9BVFRSSUJVVEUgPSAxODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQk9EWSA9IDE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVFRSSUJVVEUgPSAyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUxFTUVOVCA9IDIxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ET0JPRFkgPSAyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5WT0tFID0gMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09VVFBVVCA9IDI0OwotCi0JCS8vIGNoYWNoZSB0aGUgcmVzdWx0IG9mIHRoZSByZWZsZWN0aW9uLgotCQlwcml2YXRlIHN0YXRpYyBpbnQgbnVtb2ZpZHMgPSAtMTsKLQotCQlwdWJsaWMgc3RhdGljIGludCBnZXROdW1PZklkcygpIHsKLQkJCWlmIChudW1vZmlkcyAhPSAtMSkKLQkJCQlyZXR1cm4gbnVtb2ZpZHM7Ci0KLQkJCS8vIE5PVEU6IElmIHRoZSByZWZsZWN0aW9uIGlzIHRvbyBzbG93LCB0aGlzIG1ldGhvZCBzaG91bGQKLQkJCS8vIGp1c3QgcmV0dXJuIHRoZSBsaXRlcmFsIHZhbHVlLCBsaWtlIDEwNS4KLQkJCS8vIC0tIDUvMjUvMjAwMQotCQkJQ2xhc3MgY2xhenogPSBUYWdJZHMyMC5jbGFzczsKLQkJCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RmllbGRzKCk7Ci0JCQludW1vZmlkcyA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCQlpZiAobmFtZS5zdGFydHNXaXRoKCJJRF8iKSkvLyROT04tTkxTLTEkCi0JCQkJCW51bW9maWRzKys7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVtb2ZpZHM7Ci0JCX0KLQl9Ci0KLQkvLyBhdHRyaWJ1dGUgY3JlYXRlcgotCXByaXZhdGUgY2xhc3MgVEFDcmVhdGVyMjAgZXh0ZW5kcyBKQUNyZWF0ZXIgewotCi0JCXB1YmxpYyBUQUNyZWF0ZXIyMCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yQXR0cmlidXRlKCkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OQU1FLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVFJJTSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1RSVUUpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9UUklNLCBhZGVjKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JCb2R5KCkgewotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckRpckF0dHJpYnV0ZSgpIHsKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX05BTUUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1JFUVVJUkVEKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbXXtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfRkFMU0UpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9SRVFVSVJFRCwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZSQUdNRU5UKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCXZhbHVlcyA9IG5ldyBTdHJpbmdbXXtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfRkFMU0UpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9GUkFHTUVOVCwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1JURVhQUlZBTFVFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCXZhbHVlcyA9IG5ldyBTdHJpbmdbXXtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfVFJVRSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1JURVhQUlZBTFVFLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfREVTQ1JJUFRJT04pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfREVTQ1JJUFRJT04sIGFkZWMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckRpclRhZygpIHsKLQkJCS8vICgiaW1wb3J0IiBVUkkgb3B0aW9uYWwpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9JTVBPUlQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lNUE9SVCwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJU1BMQVlfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuSUQpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVNQTEFZX05BTUUsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT0RZX0NPTlRFTlQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0pTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfRU1QVFksIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfVEFHREVQRU5ERU5ULCBKU1AyME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NDUklQVExFU1N9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9TQ1JJUFRMRVNTKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPRFlfQ09OVEVOVCwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RZTkFNSUNfQVRUUklCVVRFUyk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9EWU5BTUlDX0FUVFJJQlVURVMsIGFkZWMpOwotCQkJCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9TTUFMTF9JQ09OKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9TTUFMTF9JQ09OLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfTEFSR0VfSUNPTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfTEFSR0VfSUNPTiwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RFU0NSSVBUSU9OKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RFU0NSSVBUSU9OLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRVhBTVBMRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9FWEFNUExFLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfTEFOR1VBR0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfSkFWQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0xBTkdVQUdFLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfSU1QT1JUKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0lNUE9SVCwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1BBR0VfRU5DT0RJTkcpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfRU5DT0RJTkdfREVGQVVMVCk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1BBR0VfRU5DT0RJTkcsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9JU0VMSUdOT1JFRCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQl2YWx1ZXMgPSBuZXcgU3RyaW5nW117QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0ZBTFNFKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfSVNFTElHTk9SRUQsIGFkZWMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENoYW5nZWQgaW4gMi4wICh0YWdkaXIgYWRkZWQpCi0JCSAqLwotCQl2b2lkIGNyZWF0ZUZvckRpclRhZ2xpYigpIHsKLQkJCS8vICgidXJpIiBVUkkgT1BUSU9OQUwpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9VUkkpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1VSSSwgYWRlYyk7Ci0KLQkJCS8vICgidGFnZGlyIiBVUkkgT1BUSU9OQUwpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUdESVIpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBR0RJUiwgYWRlYyk7Ci0KLQkJCS8vICgicHJlZml4IiBDREFUQSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1BSRUZJWCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QUkVGSVgsIGFkZWMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckRpclZhcmlhYmxlKCkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRV9HSVZFTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FX0dJVkVOLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRV9GUk9NX0FUVFJJQlVURSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FX0ZST01fQVRUUklCVVRFLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJQVMpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJQVMsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVJJQUJMRV9DTEFTUyk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9WQVJJQUJMRV9DTEFTU19ERUZBVUxUKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVkFSSUFCTEVfQ0xBU1MsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ERUNMQVJFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbXXtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfVFJVRSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RFQ0xBUkUsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ERVNDUklQVElPTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ERVNDUklQVElPTiwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1NDT1BFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCXZhbHVlcyA9IG5ldyBTdHJpbmdbXXtKU1AyME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NDT1BFX05FU1RFRCwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9TQ09QRV9BVF9CRUdJTiwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9TQ09QRV9BVF9FTkR9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfU0NPUEVfTkVTVEVEKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1NDT1BFLCBhZGVjKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JEb0JvZHkoKSB7Ci0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVIpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVkFSLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVkFSUkVBREVSKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBUlJFQURFUiwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1NDT1BFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1BBR0UsIEFUVFJfVkFMVUVfUkVRVUVTVCwgQVRUUl9WQUxVRV9TRVNTSU9OLCBBVFRSX1ZBTFVFX0FQUExJQ0FUSU9OfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1BBR0UpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ09QRSwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yRWxlbWVudCgpIHsKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX05BTUUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9ySW52b2tlKCkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBR01FTlQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZSQUdNRU5ULCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVkFSKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBUiwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBUlJFQURFUik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVJSRUFERVIsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ09QRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9QQUdFLCBBVFRSX1ZBTFVFX1JFUVVFU1QsIEFUVFJfVkFMVUVfU0VTU0lPTiwgQVRUUl9WQUxVRV9BUFBMSUNBVElPTn07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9QQUdFKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfU0NPUEUsIGFkZWMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvck91dHB1dCgpIHsKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX09NSVRfWE1MX0RFQ0wpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRSwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9ZRVMsIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTk99OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTk8pOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTUlUX1hNTF9ERUNMLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRE9DVFlQRV9ST09UX0VMRU1FTlQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRE9DVFlQRV9ST09UX0VMRU1FTlQsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ET0NUWVBFX1NZU1RFTSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ET0NUWVBFX1NZU1RFTSwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RPQ1RZUEVfUFVCTElDKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RPQ1RZUEVfUFVCTElDLCBhZGVjKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvclJvb3QoKSB7Ci0JCQkvLyAoInhtbG5zOmpzcCIgQ0RBVEEgImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfWE1MTlNfSlNQKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1hNTE5TX0pTUCk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9YTUxOU19KU1AsIGFkZWMpOwotCQkJLy8gKCJ2ZXJzaW9uIiBDREFUQSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1ZFUlNJT04pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfSlNQX1ZFUl8yMCk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1ZFUlNJT04sIGFkZWMpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yUGx1Z2luKCkgewotCQkJLy8gKCJ0eXBlIiBFTlVNIFJFUVVJUkVEIChiZWFufGFwcGxldCkpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9UWVBFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfQkVBTiwgQVRUUl9WQUxVRV9BUFBMRVR9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1RZUEUsIGFkZWMpOwotCi0JCQkvLyAoImNvZGUiIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQ09ERSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQ09ERSwgYWRlYyk7Ci0KLQkJCS8vICgiY29kZWJhc2UiIFVSSSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0NPREVCQVNFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9DT0RFQkFTRSwgYWRlYyk7Ci0KLQkJCS8vICgiYWxpZ24iIEVOVU0gSU1QTElFRCAodG9wfG1pZGRsZXxib3R0b218bGVmdHxyaWdodCkpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9BTElHTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSBhbGlnbnMgPSB7QVRUUl9WQUxVRV9UT1AsIEFUVFJfVkFMVUVfTUlERExFLCBBVFRSX1ZBTFVFX0JPVFRPTSwgQVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX1JJR0hUfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKGFsaWducyk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0JPVFRPTSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9BTElHTiwgYWRlYyk7Ci0KLQkJCS8vICgiYXJjaGl2ZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0FSQ0hJVkUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FSQ0hJVkUsIGFkZWMpOwotCi0JCQkvLyAoImhlaWdodCIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0hFSUdIVCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSEVJR0hULCBhZGVjKTsKLQotCQkJLy8gKCJoc3BhY2UiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9IU1BBQ0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0hTUEFDRSwgYWRlYyk7Ci0KLQkJCS8vICgianJldmVyc2lvbiIgQ0RBVEEgREVDTEFSRUQgIjEuMSIpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9KUkVWRVJTSU9OKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBKU1AyME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0pWRVIxMik7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9KUkVWRVJTSU9OLCBhZGVjKTsKLQotCQkJLy8gKCJuYW1lIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYWRlYyk7Ci0KLQkJCS8vICgidnNwYWNlIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVlNQQUNFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9WU1BBQ0UsIGFkZWMpOwotCi0JCQkvLyAoIndpZHRoIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfV0lEVEgpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1dJRFRILCBhZGVjKTsKLQotCQkJLy8gKCJuc3BsdWdpbnVybCIgVVJJIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OU1BMVUdJTlVSTCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05TUExVR0lOVVJMLCBhZGVjKTsKLQotCQkJLy8gKCJpZXBsdWdpbnVybCIgVVJJIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9JRVBMVUdJTlVSTCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lFUExVR0lOVVJMLCBhZGVjKTsKLQkJCQotCQkJLy8gKCJtYXlzY3JpcHQiIEVOVU0gSU1QTElFRCAodHJ1ZSB8IGZhbHNlKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfTUFZU0NSSVBUKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKG5ldyBTdHJpbmdbXSB7QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFfSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVlTQ1JJUFQsIGFkZWMpOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCBnZXREZWNsYXJhdGlvbnMoaW50IGVpZCkgewotCQkJc3dpdGNoIChlaWQpIHsKLQkJCQljYXNlIFRhZ0lkczIwLklEX0RJUkVDVElWRV9UQUcgOgotCQkJCQljcmVhdGVGb3JEaXJUYWcoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUYWdJZHMyMC5JRF9ESVJFQ1RJVkVfVkFSSUFCTEUgOgotCQkJCQljcmVhdGVGb3JEaXJWYXJpYWJsZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRhZ0lkczIwLklEX0RJUkVDVElWRV9BVFRSSUJVVEUgOgotCQkJCQljcmVhdGVGb3JEaXJBdHRyaWJ1dGUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUYWdJZHMyMC5JRF9ESVJFQ1RJVkVfVEFHTElCIDoKLQkJCQkJY3JlYXRlRm9yRGlyVGFnbGliKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVGFnSWRzMjAuSURfQVRUUklCVVRFIDoKLQkJCQkJY3JlYXRlRm9yQXR0cmlidXRlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVGFnSWRzMjAuSURfRUxFTUVOVCA6Ci0JCQkJCWNyZWF0ZUZvckVsZW1lbnQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUYWdJZHMyMC5JRF9CT0RZIDoKLQkJCQkJY3JlYXRlRm9yQm9keSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRhZ0lkczIwLklEX0RPQk9EWSA6Ci0JCQkJCWNyZWF0ZUZvckRvQm9keSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRhZ0lkczIwLklEX0lOVk9LRSA6Ci0JCQkJCWNyZWF0ZUZvckludm9rZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRhZ0lkczIwLklEX09VVFBVVCA6Ci0JCQkJCWNyZWF0ZUZvck91dHB1dCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRhZ0lkczIwLklEX1JPT1QgOgotCQkJCQljcmVhdGVGb3JSb290KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVGFnSWRzMjAuSURfUExVR0lOIDoKLQkJCQkJY3JlYXRlRm9yUGx1Z2luKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlzdXBlci5nZXREZWNsYXJhdGlvbnMoZWlkKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gZGVjbGFyYXRpb25zOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmFtZXMgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJbmFtZXMgPSBuZXcgU3RyaW5nW1RhZ0lkczIwLmdldE51bU9mSWRzKCldOwotCQluYW1lc1tUYWdJZHMyMC5JRF9TQ1JJUFRMRVRdID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUTEVUOwotCQluYW1lc1tUYWdJZHMyMC5JRF9FWFBSRVNTSU9OXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVYUFJFU1NJT047Ci0JCW5hbWVzW1RhZ0lkczIwLklEX0RFQ0xBUkFUSU9OXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRFQ0xBUkFUSU9OOwotCQluYW1lc1tUYWdJZHMyMC5JRF9ESVJFQ1RJVkVfVEFHXSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUc7Ci0JCW5hbWVzW1RhZ0lkczIwLklEX0RJUkVDVElWRV9JTkNMVURFXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFOwotCQluYW1lc1tUYWdJZHMyMC5JRF9ESVJFQ1RJVkVfVEFHTElCXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUI7Ci0JCW5hbWVzW1RhZ0lkczIwLklEX1VTRUJFQU5dID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuVVNFQkVBTjsKLQkJbmFtZXNbVGFnSWRzMjAuSURfU0VUUFJPUEVSVFldID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VUUFJPUEVSVFk7Ci0JCW5hbWVzW1RhZ0lkczIwLklEX0dFVFBST1BFUlRZXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkdFVFBST1BFUlRZOwotCQluYW1lc1tUYWdJZHMyMC5JRF9JTkNMVURFXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOQ0xVREU7Ci0JCW5hbWVzW1RhZ0lkczIwLklEX0ZPUldBUkRdID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9SV0FSRDsKLQkJbmFtZXNbVGFnSWRzMjAuSURfUExVR0lOXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBMVUdJTjsKLQkJbmFtZXNbVGFnSWRzMjAuSURfUEFSQU1TXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNUzsKLQkJbmFtZXNbVGFnSWRzMjAuSURfRkFMTEJBQ0tdID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuRkFMTEJBQ0s7Ci0JCW5hbWVzW1RhZ0lkczIwLklEX1BBUkFNXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNOwotCQluYW1lc1tUYWdJZHMyMC5JRF9ST09UXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJPT1Q7Ci0JCW5hbWVzW1RhZ0lkczIwLklEX1RFWFRdID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVDsKLQkJbmFtZXNbVGFnSWRzMjAuSURfRElSRUNUSVZFX1ZBUklBQkxFXSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9WQVJJQUJMRTsKLQkJbmFtZXNbVGFnSWRzMjAuSURfRElSRUNUSVZFX0FUVFJJQlVURV0gPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfQVRUUklCVVRFOwotCQluYW1lc1tUYWdJZHMyMC5JRF9CT0RZXSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFk7Ci0JCW5hbWVzW1RhZ0lkczIwLklEX0FUVFJJQlVURV0gPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BVFRSSUJVVEU7Ci0JCW5hbWVzW1RhZ0lkczIwLklEX0VMRU1FTlRdID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRUxFTUVOVDsKLQkJbmFtZXNbVGFnSWRzMjAuSURfRE9CT0RZXSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRPQk9EWTsKLQkJbmFtZXNbVGFnSWRzMjAuSURfSU5WT0tFXSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOVk9LRTsKLQkJbmFtZXNbVGFnSWRzMjAuSURfT1VUUFVUXSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9VVFBVVDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgVGFnMjBFbGVtZW50Q29sbGVjdGlvbigpIHsKLQkJc3VwZXIoVGFnMjBFbGVtZW50Q29sbGVjdGlvbi5uYW1lcywgVE9MRVJBTlRfQ0FTRSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBlbGVtZW50TmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBDTU5vZGUgY3JlYXRlKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gY3JlYXRlRWxlbURlY2woZ2V0SUQoZWxlbWVudE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWlkCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlDTUdyb3VwSW1wbCBjcmVhdGVDb250ZW50KGludCBlaWQpIHsKLQkJaWYgKGVpZCA9PSBJRF9VTktOT1dOKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ01Hcm91cEltcGwgY29udGVudCA9IG51bGw7Ci0JCUNNTm9kZSBjaGlsZCA9IG51bGw7Ci0KLQkJc3dpdGNoIChlaWQpIHsKLQkJCWNhc2UgSWRzLklEX1JPT1QgOgotCQkJCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJCQlpbnQgdmFsaWRDaGlsZHJlbltdID0gewotCQkJCS8vICVEaXJlY3RpdmVzOwotCQkJCQkJCUlkcy5JRF9URVhULCBJZHMuSURfRElSRUNUSVZFX1BBR0UsIElkcy5JRF9ESVJFQ1RJVkVfSU5DTFVERSwgVGFnSWRzMjAuSURfRElSRUNUSVZFX1RBRywgVGFnSWRzMjAuSURfRElSRUNUSVZFX1ZBUklBQkxFLCBUYWdJZHMyMC5JRF9ESVJFQ1RJVkVfQVRUUklCVVRFLCBUYWdJZHMyMC5JRF9CT0RZLCBUYWdJZHMyMC5JRF9BVFRSSUJVVEUsCi0JCQkJCQkJLy8gJVNjcmlwdHM7Ci0JCQkJCQkJSWRzLklEX1NDUklQVExFVCwgSWRzLklEX0RFQ0xBUkFUSU9OLCBJZHMuSURfRVhQUkVTU0lPTiwKLQkJCQkJCQkvLyAlQWN0aW9uczsKLQkJCQkJCQlJZHMuSURfVVNFQkVBTiwgSWRzLklEX1NFVFBST1BFUlRZLCBJZHMuSURfR0VUUFJPUEVSVFksIElkcy5JRF9JTkNMVURFLCBJZHMuSURfRk9SV0FSRCwgSWRzLklEX1BMVUdJTn07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWNoaWxkID0gaXRlbSh2YWxpZENoaWxkcmVuW2ldKTsKLQkJCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJCQljb250ZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQljb250ZW50ID0gc3VwZXIuY3JlYXRlQ29udGVudChlaWQpOwotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVpZAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVFbGVtRGVjbChpbnQgZWlkKSB7Ci0JCWlmIChlaWQgPT0gSURfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCi0JCVR5cGVQYWNrZXQgcGFja2V0ID0gbmV3IFR5cGVQYWNrZXQoKTsKLQkJc3dpdGNoIChlaWQpIHsKLQkJCWNhc2UgVGFnSWRzMjAuSURfRElSRUNUSVZFX1RBRyA6Ci0JCQkJLy8gZGlyZWN0aXZlLnRhZ2xpYgotCQkJCXBhY2tldC5uYW1lID0gRElSRUNUSVZFX1RBRzsKLQkJCQlwYWNrZXQub21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX0RJUkVDVElWRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVGFnSWRzMjAuSURfRElSRUNUSVZFX1ZBUklBQkxFIDoKLQkJCQkvLyBkaXJlY3RpdmUudGFnbGliCi0JCQkJcGFja2V0Lm5hbWUgPSBESVJFQ1RJVkVfVkFSSUFCTEU7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9ESVJFQ1RJVkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRhZ0lkczIwLklEX0RJUkVDVElWRV9BVFRSSUJVVEUgOgotCQkJCS8vIGRpcmVjdGl2ZS50YWdsaWIKLQkJCQlwYWNrZXQubmFtZSA9IERJUkVDVElWRV9BVFRSSUJVVEU7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9ESVJFQ1RJVkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRhZ0lkczIwLklEX0RJUkVDVElWRV9UQUdMSUIgOgotCQkJCS8vIGRpcmVjdGl2ZS50YWdsaWIKLQkJCQlwYWNrZXQubmFtZSA9IERJUkVDVElWRV9UQUdMSUI7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9ESVJFQ1RJVkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRhZ0lkczIwLklEX0JPRFkgOgotCQkJCS8vIGRlY2xhcmF0aW9uCi0JCQkJcGFja2V0Lm5hbWUgPSBCT0RZOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfU0NSSVBUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUYWdJZHMyMC5JRF9FTEVNRU5UIDoKLQkJCQkvLyBkZWNsYXJhdGlvbgotCQkJCXBhY2tldC5uYW1lID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRUxFTUVOVDsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX1NDUklQVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgVGFnSWRzMjAuSURfQVRUUklCVVRFIDoKLQkJCQkvLyBkZWNsYXJhdGlvbgotCQkJCXBhY2tldC5uYW1lID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVRUUklCVVRFOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfU0NSSVBUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUYWdJZHMyMC5JRF9ET0JPRFkgOgotCQkJCS8vIGRlY2xhcmF0aW9uCi0JCQkJcGFja2V0Lm5hbWUgPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ET0JPRFk7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9TQ1JJUFQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRhZ0lkczIwLklEX0lOVk9LRSA6Ci0JCQkJLy8gZGVjbGFyYXRpb24KLQkJCQlwYWNrZXQubmFtZSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOVk9LRTsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX1NDUklQVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgVGFnSWRzMjAuSURfT1VUUFVUIDoKLQkJCQkvLyBkZWNsYXJhdGlvbgotCQkJCXBhY2tldC5uYW1lID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1VUUFVUOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfU0NSSVBUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUYWdJZHMyMC5JRF9ST09UIDoKLQkJCQlwYWNrZXQubmFtZSA9IFJPT1Q7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47IC8vIHNhbWUgYXMgSFRNTAotCQkJCWJyZWFrOwotCQkJY2FzZSBUYWdJZHMyMC5JRF9QTFVHSU4gOgotCQkJCS8vIHBsdWdpbgotCQkJCXBhY2tldC5uYW1lID0gUExVR0lOOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gc3VwZXIuY3JlYXRlRWxlbURlY2woZWlkKTsKLQkJfQotCQlFbGVtRGVjbCBkZWNsID0gbmV3IEVsZW1EZWNsKHBhY2tldCk7Ci0KLQkJQ01Hcm91cEltcGwgY29udGVudCA9IGNyZWF0ZUNvbnRlbnQoZWlkKTsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCWRlY2wuc2V0Q29udGVudChjb250ZW50KTsKLQotCQlUQUNyZWF0ZXIyMCBjcmVhdGVyID0gbmV3IFRBQ3JlYXRlcjIwKCk7Ci0JCWRlY2wuc2V0QXR0cmlidXRlcyhjcmVhdGVyLmdldERlY2xhcmF0aW9ucyhlaWQpKTsKLQotCQlyZXR1cm4gZGVjbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1RhZ0NNRG9jSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9UYWdDTURvY0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIyOThmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1RhZ0NNRG9jSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIENNRG9jdW1lbnQgZm9yIHRoZSBKU1AgMi4wIHRhZyBmaWxlcy4KLSAqLwotY2xhc3MgVGFnQ01Eb2NJbXBsIGV4dGVuZHMgSkNNRG9jSW1wbCB7Ci0JLyoqCi0JICogSENNRG9jSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBUYWdDTURvY0ltcGwoU3RyaW5nIGRvY1R5cGVOYW1lLCBDTU5hbWVzcGFjZUltcGwgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCXN1cGVyKGRvY1R5cGVOYW1lLCB0YXJnZXROYW1lc3BhY2UsIG5ldyBUYWcyMEVsZW1lbnRDb2xsZWN0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQXR0cmlidXRlQ29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9BdHRyaWJ1dGVDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NjMyMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9BdHRyaWJ1dGVDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0gKi8KLWZpbmFsIGNsYXNzIEF0dHJpYnV0ZUNvbGxlY3Rpb24gZXh0ZW5kcyBDTU5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBDSFRNTE5hbWVzcGFjZSB7Ci0JLyoqCi0JICogY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZUNvbGxlY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KLQkgKiBAcGFyYW0gYXR0ck5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByaXZhdGUgSFRNTEF0dHJEZWNsSW1wbCBjcmVhdGUoU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0KLQkJaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FDVElPTikpIHsKLQkJCS8vIChhY3Rpb24gJVVSSSAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BQ1RJT04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FMVCkpIHsKLQkJCS8vIChhbHQgJVRleHQ7ICNSRVFVSVJFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CT1JERVIpKSB7Ci0JCQkvLyAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0JPUkRFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0hFQ0tFRCkpIHsKLQkJCS8vIChjaGVja2VkIChjaGVja2VkKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9DSEVDS0VEfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0hFQ0tFRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0xFQVIpKSB7Ci0JCQkvLyAoY2xlYXIgKGxlZnQgfCBhbGwgfCByaWdodCB8IG5vbmUpIG5vbmUpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfQUxMLCBBVFRSX1ZBTFVFX1JJR0hULCBBVFRSX1ZBTFVFX05PTkV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX05PTkUpOwotCi0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NMRUFSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0xTKSkgewotCQkJLy8gKGNvbHMgTlVNQkVSICNSRVFVSVJFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPTFMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0VOQ1RZUEUpKSB7Ci0JCQkvLyAoZW5jdHlwZSAlQ29udGVudFR5cGU7ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfV1dXX0ZPUk1fVVJMRU5DT0RFRCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0VOQ1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hFSUdIVCkpIHsKLQkJCS8vIChoZWlnaHQgJUxlbmd0aDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEVOR1RIKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSEVJR0hULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9IUkVGKSkgewotCQkJLy8gKGhyZWYgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IUkVGLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9IU1BBQ0UpKSB7Ci0JCQkvLyAoaHNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hTUEFDRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSFRUUF9FUVVJVikpIHsKLQkJCS8vIChodHRwLWVxdWl2IE5BTUUgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTkFNRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hUVFBfRVFVSVYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01BWExFTkdUSCkpIHsKLQkJCS8vIChtYXhsZW5ndGggTlVNQkVSICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUFYTEVOR1RILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NRVRIT0QpKSB7Ci0JCQkvLyAobWV0aG9kIChHRVR8UE9TVCkgR0VUKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9HRVQsIEFUVFJfVkFMVUVfUE9TVH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfR0VUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUVUSE9ELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NVUxUSVBMRSkpIHsKLQkJCS8vIChtdWx0aXBsZSAobXVsdGlwbGUpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX01VTFRJUExFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTVVMVElQTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX05BTUUpKSB7Ci0JCQkvLyAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTkFNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTk9TSEFERSkpIHsKLQkJCS8vIChub3NoYWRlIChub3NoYWRlKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9OT1NIQURFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTk9TSEFERSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUk9XUykpIHsKLQkJCS8vIChyb3dzIE5VTUJFUiAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ST1dTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TRUxFQ1RFRCkpIHsKLQkJCS8vIChzZWxlY3RlZCAoc2VsZWN0ZWQpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX1NFTEVDVEVEfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0VMRUNURUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NJWkUpKSB7Ci0JCQkvLyAoc2l6ZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TUkMpKSB7Ci0JCQkvLyAoc3JjICVVUkk7ICNJTVBMSUVEKQotCQkJLy8gTk9URTogInNyYyIgYXR0cmlidXRlcyBhcmUgZGVmaW5lZCBpbiBzZXZlcmFsIGVsZW1lbnRzLgotCQkJLy8JCSBUaGUgZGVmaW5pdGlvbiBvZiBJTUcgaXMgZGlmZmVyZW50IGZyb20gb3RoZXJzLgotCQkJLy8JCSBTbywgaXQgc2hvdWxkIGJlIGxvY2FsbHkgZGVmaW5lZC4KLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NSQywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVFlQRSkpIHsKLQkJCS8vICh0eXBlICVDb3RlbnRUeXBlOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WQUxVRSkpIHsKLQkJCS8vICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkFMVUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZFUlNJT04pKSB7Ci0JCQkvLyAodmVyc2lvbiBDREFUQSAjRklYRUQgJyVIVE1MLlZlcnNpb247KQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9GSVhFRCwgQVRUUl9WQUxVRV9WRVJTSU9OX1RSQU5TSVRJT05BTCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZFUlNJT04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLkZJWEVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1dJRFRIKSkgewotCQkJLy8gKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxFTkdUSCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1dJRFRILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WU1BBQ0UpKSB7Ci0JCQkvLyAodnNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZTUEFDRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCQkvLyA8PEQyMDU1MTQKLQkJfQotCQllbHNlIHsKLQkJCS8vIHVua25vd24gYXR0cmlidXRlOyBtYXliZSBlcnJvci4KLQkJCS8vIHNob3VsZCB3YXJuLgotCQkJYXR0ciA9IG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWJvZHljb2xvcnM7IGRlY2xhcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRCb2R5Y29sb3JzKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxpZ24gYXR0cmlidXRlIHdoaWNoIGhhcyAlSUFsaWduOyBhcyB2YWx1ZXMuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRNTEF0dHJEZWNsSW1wbCBjcmVhdGVBbGlnbkZvckltYWdlKCkgewotCQkvLyBhbGlnbiAobG9jYWwpCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJLy8gc2V0IGVudW0gdmFsdWVzCi0JCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RPUCwgQVRUUl9WQUxVRV9NSURETEUsIEFUVFJfVkFMVUVfQk9UVE9NLCBBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfUklHSFR9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24gZm9yIDxjb2RlPmFsaWduPC9jb2RlPgotCSAqIGluIHNldmVyYWwgZWxlbWVudHMsIGxpa2UgPGNvZGU+UDwvY29kZT4sIDxjb2RlPkRJVjwvY29kZT4uCi0JICogVGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50IGZyb20gYXR0cmlidXRlcyB0aG9zZSBoYXZlIHRoZSBzYW1lIG5hbWUKLQkgKiBpbiBvdGhlciBlbGVtZW50cyAoPGNvZGU+SU1HPC9jb2RlPiBhbmQgPGNvZGU+VEFCTEU8L2NvZGU+KS4KLQkgKiBTbywgaXQgY2FuJ3QgdHJlYXQgYXMgZ2xvYmFsIGF0dHJpYnV0ZXMuCi0JICogPHN0cm9uZz5OT1RFOiBUaGVzZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24gaGFzCi0JICogbm8gb3duZXIgQ01Eb2N1bWVudCBpbnN0YW5jZS48L3N0cm9uZz4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUTUxBdHRyRGVjbEltcGwgY3JlYXRlQWxpZ25Gb3JQYXJhZ3JhcGgoKSB7Ci0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJLy8gc2V0IGVudW0gdmFsdWVzOiBsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfQ0VOVEVSLCBBVFRSX1ZBTFVFX1JJR0hULH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVhdHRyczsgZGVjbGFyYXRpb25zLgotCSAqICVhdHRyczsgY29uc2lzdHMgb2YgJWNvcmVhdHRyczssICVpMThuLCBhbmQgJWV2ZW50czsuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0QXR0cnMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCX0KLQotCS8qKgotCSAqIEdldCAlY29yZWF0dHJzOyBkZWNsYXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0Q29yZShDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgZ2xvYmFsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KLQkgKiBAcGFyYW0gYXR0ck5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCUNNTm9kZSBjbW5vZGUgPSBnZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCQlpZiAoY21ub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21ub2RlOyAvLyBhbHJlYWR5IGV4aXN0cy4KLQotCQlIVE1MQXR0ckRlY2xJbXBsIGRlYyA9IGNyZWF0ZShhdHRyTmFtZSk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCXB1dE5hbWVkSXRlbShhdHRyTmFtZSwgZGVjKTsKLQotCQlyZXR1cm4gZGVjOwotCX0KLQotCS8qKgotCSAqIEdldCBkZWNsYXJhdGlvbnMgd2hpY2ggYXJlIHNwZWNpZmllZCBieSBuYW1lcy4KLQkgKiBAcGFyYW0gbmFtZXMgamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RGVjbGFyYXRpb25zKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMsIEl0ZXJhdG9yIG5hbWVzKSB7Ci0JCXdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHQoKTsKLQkJCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBkZWMgPSBnZXREZWNsYXJhdGlvbihhdHRyTmFtZSk7Ci0JCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShhdHRyTmFtZSwgZGVjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCAlZXZlbnRzOyBkZWNsYXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RXZlbnRzKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWkxOG47IGRlY2xhcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRJMThuKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NIQ01Eb2NJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NIQ01Eb2NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYjM1MjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DSENNRG9jSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEVudGl0eURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDTURvY3VtZW50IGltcGxlbWVudGF0aW9uIGZvciB0aGUgSFRNTC4KLSAqLwotcHVibGljIGNsYXNzIENIQ01Eb2NJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxDTURvY3VtZW50IHsKLQotCS8qKiBOYW1lc3BhY2UgZm9yIGFsbCBuYW1lcyBvZiBlbGVtZW50cywgZW50aXRpZXMgYW5kIGF0dHJpYnV0ZXMuICovCi0JcHJpdmF0ZSBDTU5hbWVzcGFjZSBuYW1lc3BhY2UgPSBudWxsOwotCXByaXZhdGUgRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudHMgPSBudWxsOwotCXByaXZhdGUgRW50aXR5Q29sbGVjdGlvbiBlbnRpdGllcyA9IG51bGw7Ci0JcHJpdmF0ZSBBdHRyaWJ1dGVDb2xsZWN0aW9uIGF0dHJpYnV0ZXMgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIENIQ01Eb2NJbXBsKFN0cmluZyBkb2NUeXBlTmFtZSwgQ01OYW1lc3BhY2UgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCXN1cGVyKGRvY1R5cGVOYW1lKTsKLQkJbmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotCQlhdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZUNvbGxlY3Rpb24oKTsKLQkJZWxlbWVudHMgPSBuZXcgRWxlbWVudENvbGxlY3Rpb24oYXR0cmlidXRlcyk7Ci0JCWVudGl0aWVzID0gbmV3IEVudGl0eUNvbGxlY3Rpb24oKTsKLQl9Ci0KLQlBdHRyaWJ1dGVDb2xsZWN0aW9uIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCXB1YmxpYyBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGdldEVsZW1lbnREZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChIVE1MRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50cy5nZXROYW1lZEl0ZW0oZWxlbWVudE5hbWUpOwotCX0KLQotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpIHsKLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJcmV0dXJuIGVudGl0aWVzOwotCX0KLQotCXB1YmxpYyBIVE1MRW50aXR5RGVjbGFyYXRpb24gZ2V0RW50aXR5RGVjbGFyYXRpb24oU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJaWYgKGVudGl0aWVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChIVE1MRW50aXR5RGVjbGFyYXRpb24pIGVudGl0aWVzLmdldE5hbWVkSXRlbShlbnRpdHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5ET0NVTUVOVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NIVE1MTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NIVE1MTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NjUwM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DSFRNTE5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLQotLyoqCi0gKiBQcm92aWRlIGFsbCBuYW1lcyBkZWZpbmVkIGluIHRoZSBIVE1MIDQuMD8gc3BlY2lmaWNhdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBDSFRNTE5hbWVzcGFjZSB7Ci0KLQkvLyBFbGVtZW50IG5hbWVzCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRWxlbWVudE5hbWUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERFJFU1MgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQUREUkVTUzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTE9DS1FVT1RFID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJMT0NLUVVPVEU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPRFkgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlIgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENFTlRFUiA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DRU5URVI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEREID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVIgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVYgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElWOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBETCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ETDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFQgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk0gPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDEgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEgyID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIMyA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDQgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEg1ID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBINiA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5INjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBRCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIUiA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IUjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUcgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU1HOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTlBVVDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEkgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTlUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1QgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VMRUNUOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUQVJFQSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URVhUQVJFQTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVMID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVMOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfQ09ORklHID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9DT05GSUc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9FQ0hPID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9FQ0hPOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfRVhFQyA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRVhFQzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0ZTSVpFID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GU0laRTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0ZMQVNUTU9EID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GTEFTVE1PRDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0lOQ0xVREUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0lOQ0xVREU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9QUklOVEVOViA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfUFJJTlRFTlY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9TRVQgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1NFVDsKLQl9Ci0KLQkvLyBDaGFyYWN0ZXIgRW50aXRpZXMKLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFbnRpdHlOYW1lIHsKLQl9Ci0KLQkvLyBnbG9iYWwgYXR0cmlidXRlIG5hbWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZFUlNJT04gPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZFUlNJT047Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NSQyA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BTFQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSEVJR0hUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1dJRFRIID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUxJR04gPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9CT1JERVIgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFNQQUNFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IU1BBQ0U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZTUEFDRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVlNQQUNFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OQU1FID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTEVBUiA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0xFQVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05PU0hBREUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05PU0hBREU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NIRUNLRUQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NIRUNLRUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX01BWExFTkdUSCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFYTEVOR1RIOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JU1RZTEUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0lTVFlMRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFRUUF9FUVVJViA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFRUUF9FUVVJVjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09OVEVOVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09OVEVOVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9IUkVGID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IUkVGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NVUxUSVBMRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTVVMVElQTEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NFTEVDVEVEID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TRUxFQ1RFRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUk9XUyA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUk9XUzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09MUyA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09MUzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUNUSU9OID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ1RJT047Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX01FVEhPRCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUVUSE9EOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9FTkNUWVBFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9FTkNUWVBFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TSVpFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9UWVBFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WQUxVRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUU7Ci0KLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VSUk1TRyA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRVJSTVNHOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TSVpFRk1UID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFRk1UOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9USU1FRk1UID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9USU1FRk1UOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WQVIgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0dJID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DR0k7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NNRCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ01EOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GSUxFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WSVJUVUFMID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WSVJUVUFMOwotCi0JLy8gZ2xvYmFsIGF0dHJpYnV0ZSB2YWx1ZXM7IG1haW5seSB1c2VkIGluIGVudW1lcmF0aW9uLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVkVSU0lPTl9UUkFOU0lUSU9OQUwgPSAiLS8vVzNDLy9EVEQgQ29tcGFjdCBIVE1MIDEuMCBEcmFmdC8vRU4iOyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgYWxpZ24gKHRvcHxtaWRkbGV8Ym90dG9tfGxlZnR8cmlnaHQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9UT1AgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9UT1A7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9NSURETEUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9NSURETEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CT1RUT00gPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9CT1RUT007Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9MRUZUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTEVGVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NFTlRFUiA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NFTlRFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JJR0hUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUklHSFQ7Ci0JLy8gICBmb3IgY2xlYXIgKGxlZnR8YWxsfHJpZ2h0fG5vbmUpOiBsZWZ0IGFuZCByaWdodCBhcmUgYWxyZWFkeSBkZWZpbmVkIGFib3ZlLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQUxMID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfQUxMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTk9ORSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX05PTkU7Ci0JLy8gICBmb3IgdHlwZSBvZiBJTlBVVAotCS8vICAgICAgICh0ZXh0IHwgcGFzc3dvcmQgfCBjaGVja2JveCB8IHJhZGlvIHwgc3VibWl0IHwgcmVzZXQgfAotCS8vICAgICAgICBmaWxlIHwgaGlkZGVuIHwgaW1hZ2UgfCBidXR0b24pCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9URVhUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfVEVYVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1BBU1NXT1JEID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUEFTU1dPUkQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DSEVDS0JPWCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NIRUNLQk9YOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUkFESU8gPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9SQURJTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NVQk1JVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NVQk1JVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JFU0VUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUkVTRVQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9ISURERU4gPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9ISURERU47Ci0JLy8gICBmb3Igc3BhbiwgY29sc3Bhbiwgcm93c3BhbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfMSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFXzE7Ci0JLy8gICBmb3IgZnJhbWVib3JkZXIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFXzAgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV8wOwotCS8vICAgZm9yIG1ldGhvZCBvZiBGT1JNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9HRVQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9HRVQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9QT1NUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUE9TVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1dXV19GT1JNX1VSTEVOQ09ERUQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9XV1dfRk9STV9VUkxFTkNPREVEOwotCS8vICAgZm9yIGJlaGF2aXJvIG9mIE1BUlFVRUUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NDUk9MTCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NDUk9MTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NMSURFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfU0xJREU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9BTFRFUk5BVEUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9BTFRFUk5BVEU7Ci0JLy8gICBmb3IgZGlyZWN0aW9uIG9mIE1BUlFVRUUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1VQID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfVVA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9ET1dOID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfRE9XTjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01Db250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MzNjZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIENNQ29udGVudCBmb3IgSFRNTCBDTS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQ01Db250ZW50SW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkJPVU5ERUQgPSAtMTsKLQkvKiogIC0xOiBpdCdzIFVOQk9VTkRFRC4gKi8KLQlwcml2YXRlIGludCBtYXhPY2N1ciA9IFVOQk9VTkRFRDsKLQkvKiogIDA6IGl0J3MgT1BUSU9OQUwsIDEsIGl0J3MgUkVRVUlSRUQuICovCi0JcHJpdmF0ZSBpbnQgbWluT2NjdXIgPSAwOwotCi0JLyoqCi0JICogVGhlIHByaW1hcnkgY29uc3R1cmN0b3IuCi0JICogVXNlIHRoaXMgb25lIGZvciB1c3VhbCBjYXNlcy48YnI+Ci0JICovCi0JcHVibGljIENNQ29udGVudEltcGwoU3RyaW5nIG5hbWUsIGludCBtaW4sIGludCBtYXgpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCW1pbk9jY3VyID0gbWluOwotCQltYXhPY2N1ciA9IG1heDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNYXhPY2N1ciBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogSWYgLTEsIGl0J3MgVU5CT1VOREVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKSB7Ci0JCXJldHVybiBtYXhPY2N1cjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNaW5PY2N1ciBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogSWYgMCwgaXQncyBPUFRJT05BTC4KLQkgKiBJZiAxLCBpdCdzIFJFUVVJUkVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKSB7Ci0JCXJldHVybiBtaW5PY2N1cjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNR3JvdXBJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNR3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNTQ2ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTUdyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLS8qKgotICovCi1jbGFzcyBDTUdyb3VwSW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBDTUdyb3VwIHsKLQotCXByaXZhdGUgaW50IG9wZXJhdG9yID0gQ01Hcm91cC5TRVFVRU5DRTsKLQlwcml2YXRlIENNTm9kZUxpc3RJbXBsIGNoaWxkcmVuID0gbnVsbDsKLQotCS8qKgotCSAqIENNR3JvdXBJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNR3JvdXBJbXBsKGludCBvcCwgaW50IG1pbk9jY3VyLCBpbnQgbWF4T2NjdXIpIHsKLQkJc3VwZXIobnVsbCwgbWluT2NjdXIsIG1heE9jY3VyKTsKLQkJc3dpdGNoIChvcCkgewotCQkJY2FzZSBDTUdyb3VwLkFMTCA6Ci0JCQljYXNlIENNR3JvdXAuQ0hPSUNFIDoKLQkJCWNhc2UgQ01Hcm91cC5TRVFVRU5DRSA6Ci0JCQkJb3BlcmF0b3IgPSBvcDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCS8vIHNob3VsZCB3YXJuLgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXByb3RlY3RlZCBDTU5vZGUgYXBwZW5kQ2hpbGQoQ01Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKQotCQkJY2hpbGRyZW4gPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLQkJcmV0dXJuIGNoaWxkcmVuLmFwcGVuZE5vZGUoY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0Ci0JICovCi0JcHVibGljIENNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogRUxFTUVOVF9ERUNMQVJBVElPTiwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBHUk9VUCwgRU5USVRZX0RFQ0xBUkFUSU9OLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuR1JPVVA7Ci0JfQotCi0JLyoqCi0JICogZ2V0T3BlcmF0aW9uIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogQUxPTkUgKGEpLCBTRVFVRU5DRSAoYSxiKSwgQ0hPSUNFIChhfGIpLCBBTEwgKGEmYikuCi0JICovCi0JcHVibGljIGludCBnZXRPcGVyYXRvcigpIHsKLQkJcmV0dXJuIG9wZXJhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWJhZTFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIENNTmFtZWROb2RlTWFwIGludGVyZmFjZS4gVGhpcyBjbGFzcyBpcyBpbnRlbnRlZAotICogdG8gYmUgdXNlZCBhcyBhIGNvbnRhaW5lciBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLiBJZiBzb21lb25lIHdhbnRzIHRvCi0gKiB1c2UgdGhpcyBjbGFzcyBmb3Igb3RoZXIgcHVycG9zZSwgaGUgbXVzdCBwYXkgYXR0ZW50aW9uIHRvIHRoZSBmYWN0IHRoYXQKLSAqIHRoaXMgY2xhc3MgaXMgdG9sZXJhbnQgb2YgdGhlIGtleSBuYW1lIGNhc2UuIFRoYXQgaXMsIHRoaXMgY2xhc3MgZG9lcyBub3QKLSAqIGRpc3Rpbmd1aXNoICJuYW1lIiwgIk5BTUUiLCBhbmQgIk5hbWUiIGFzIGEga2V5IG5hbWUuCi0gKi8KLWNsYXNzIENNTmFtZWROb2RlTWFwSW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXAgewotCi0JcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaHRhYmxlIGl0ZW1zID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWl0ZW1zID0gbmV3IGphdmEudXRpbC5IYXNodGFibGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGl0ZW1zLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTU5vZGUgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHVua25vd24ga2V5cy4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBjb29rZWROYW1lID0gbWFrZUNhbm9uaWNhbEZvcm0obmFtZSk7Ci0JCWlmICghaXRlbXMuY29udGFpbnNLZXkoY29va2VkTmFtZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDTU5vZGUpIGl0ZW1zLmdldChjb29rZWROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUNNTm9kZSBub2RlID0gKENNTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoLS1pbmRleCA8IDApCi0JCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBpdGVtcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByYXdGb3JtCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbWFrZUNhbm9uaWNhbEZvcm0oU3RyaW5nIHJhdykgewotCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDE1MgotCQkvLyB3ZSBhcmUgYWJsZSB0byAiY2hlYXQiIGhlcmUgYSBsaXR0bGUgYW5kIHVzZSBVUyBMb2NhbGUKLQkJLy8gdG8gZ2V0IGEgZ29vZCBjb25vbmljYWwgZm9ybSwgc2luY2Ugd2UgYXJlIHVzaW5nIHRoaXMgb25seQotCQkvLyBmb3IgSFRNTCBhbmQgSlNQIHN0YW5kYXJkIHRhZ3MuCi0JCS8vIExvbmcgdGVybSwgZm9yIHNpbWlsYXIgbmVlZHMgd2l0aCBYTUwgMS4xIChmb3IgZXhhbXBsZSkKLQkJLy8gd2Ugc2hvdWxkIHVzZSBhIGNsYXNzIHN1Y2ggYXMgY29tLmlibS5pY3UudGV4dC5Ob3JtYWxpemVyCi0JCXJldHVybiByYXcudG9VcHBlckNhc2UoTG9jYWxlLlVTKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGl0ZW0KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQl2b2lkIHB1dE5hbWVkSXRlbShTdHJpbmcgbmFtZSwgQ01Ob2RlIGl0ZW0pIHsKLQkJU3RyaW5nIGNvb2tlZE5hbWUgPSBtYWtlQ2Fub25pY2FsRm9ybShuYW1lKTsKLQkJaWYgKGl0ZW1zLmNvbnRhaW5zS2V5KGNvb2tlZE5hbWUpKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JCWl0ZW1zLnB1dChjb29rZWROYW1lLCBpdGVtKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01Ob2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmY3YTAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01Ob2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotCi0KLQotLyoqCi0gKi8KLWFic3RyYWN0IGNsYXNzIENNTm9kZUltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZSB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTU5vZGVJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNTm9kZUltcGwoU3RyaW5nIG5tKSB7Ci0JCXN1cGVyKCk7Ci0JCW5hbWUgPSBubTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjaXBlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwb3J0cyBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTm9kZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTm9kZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYjFjZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTU5vZGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEFuYWxvZyBvZiBkb20uTm9kZUxpc3QgZm9yIENNLgotICovCi1jbGFzcyBDTU5vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdCB7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5WZWN0b3Igbm9kZXMgPSBudWxsOwotCi0JLyoqCi0JICogQ01Ob2RlTGlzdEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Ob2RlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCW5vZGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICogQHBhcmFtIG5vZGUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGFwcGVuZE5vZGUoQ01Ob2RlIG5vZGUpIHsKLQkJbm9kZXMuYWRkRWxlbWVudChub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBub2Rlcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01Ob2RlKSBub2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ29tcGxleFR5cGVEZWZpbml0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NvbXBsZXhUeXBlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDQ3YzdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ29tcGxleFR5cGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byByZXByZXNlbnQgYSBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbgotICogaW4gWE1MIFNjaGVtYS48YnI+Ci0gKi8KLWFic3RyYWN0IGNsYXNzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgQ01Hcm91cEltcGwgY29udGVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBudWxsOwotCi0JLyoqCi0JICogQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcigpOwotCQljb2xsZWN0aW9uID0gZWxlbWVudENvbGxlY3Rpb247Ci0JCWNyZWF0ZUNvbnRlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYWN0dWFsIGNvbnRlbnQgbW9kZWwuCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIGFuZCBvbmx5IG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yLjxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cAotCSAqLwotCXB1YmxpYyBDTUdyb3VwIGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCS8qIE5PVEU6IERvIHdlIG5lZWQgTE9HSUNBTCB0eXBlPwotCSAqIC0tIDMvNy8yMDAxCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRDb250ZW50VHlwZSgpOwotCi0JLyoqCi0JICogR2V0IGNvbnRlbnQgaGludC4KLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRQcmltYXJ5Q2FuZGlkYXRlKCkgewotCQlpZiAocHJpbWFyeUNhbmRpZGF0ZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKHByaW1hcnlDYW5kaWRhdGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VHlwZU5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNjgyZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotLyoqCi0gKiBGYWN0b3J5IG9mIENvbXBsZXhUeXBlRGVmaW5pdGlvbi4KLSAqLwotZmluYWwgY2xhc3MgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQlwcml2YXRlIGphdmEudXRpbC5IYXNodGFibGUgZGVmaW5pdGlvbnMgPSBudWxsOwotCS8vIGNvbnN0YW50cyBmb3IgY29tcGxleCB0eXBlIG5hbWUKLQkvKiogZm9yIEFERFJFU1MuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfQUREUkVTUyA9ICJDVFlQRV9BRERSRVNTIjsvLyROT04tTkxTLTEkCi0JLyoqIENEQVRBIGNvbnRlbnQuIE5vIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBpbnN0YW5jZSBzaHVsZCBiZSBjcmVhdGVkLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0NEQVRBID0gIkNUWVBFX0NEQVRBIjsvLyROT04tTkxTLTEkCi0JLyoqIGNvbCBncm91cCBjb250ZW50LiBDT0wqICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfQ09MVU1OX0dST1VQID0gIkNUWVBFX0NPTFVNTl9HUk9VUCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgREwuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfREVGSU5JVElPTl9MSVNUID0gIkNUWVBFX0RFRklOSVRJT05fTElTVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgRU1CRUQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRU1CRUQgPSAiQ1RZUEVfRU1CRUQiOy8vJE5PTi1OTFMtMSQKLQkvKiogZW1wdHkgY29udGVudC4gTm8gQ29tcGxleFR5cGVEZWZpbml0aW9uIGluc3RhbmNlIHNob3VsZCBiZSBjcmVhdGVkLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0VNUFRZID0gIkNUWVBFX0VNUFRZIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBGSUVMRFNFVC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9GSUVMRFNFVCA9ICJDVFlQRV9GSUVMRFNFVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgRlJBTUVTRVQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRlJBTUVTRVQgPSAiQ1RZUEVfRlJBTUVTRVQiOy8vJE5PTi1OTFMtMSQKLQkvKiogZmxvdyBjb250ZW50LiAoJWZsb3c7KSogKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9GTE9XX0NPTlRBSU5FUiA9ICJDVFlQRV9GTE9XX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBodG1sIGNvbnRlbnQuIEhFQUQsIChGUkFNRVNFVHxCT0RZKSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0hUTUwgPSAiQ1RZUEVfSFRNTCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBoZWFkIGNvbnRlbnQuIFRJVExFICYgSVNJTkRFWD8gJiBCQVNFPyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0hFQUQgPSAiQ1RZUEVfSEVBRCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBpbmxpbmUgY29udGVudC4gKCVpbmxpbmU7KSogKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9JTkxJTkVfQ09OVEFJTkVSID0gIkNUWVBFX0lOTElORV9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogbGlzdCBpdGVtIGNvbnRhaW5lci4gKExJKSsgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9MSV9DT05UQUlORVIgPSAiQ1RZUEVfTElfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBNQVAuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfTUFQID0gIkNUWVBFX01BUCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBub2ZyYW1lcyBjb250ZW50LiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX05PRlJBTUVTX0NPTlRFTlQgPSAiQ1RZUEVfTk9GUkFNRVNfQ09OVEVOVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgT1BUR1JPVVAuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUiA9ICJDVFlQRV9PUFRJT05fQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIHBhcmFtIGNvbnRhaW5lci4gRm9yIE9CSkVDVC9BUFBMRVQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfUEFSQU1fQ09OVEFJTkVSID0gIkNUWVBFX1BBUkFNX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBQQ0RBVEEgY29udGVudC4gTm8gQ29tcGxleFR5cGVEZWZpbml0aW9uIGluc3RhbmNlIHNodWxkIGJlIGNyZWF0ZWQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfUENEQVRBID0gIkNUWVBFX1BDREFUQSI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgU0VMRUNULiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1NFTEVDVCA9ICJDVFlQRV9TRUxFQ1QiOy8vJE5PTi1OTFMtMSQKLQkvKiogdGFibGUgY29udGVudC4gQ0FQVElPTj8sIChDT0wqfENPTEdST1VQKiksIFRIRUFEPywgVEZPT1Q/LCBUQk9EWSsgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9UQUJMRSA9ICJDVFlQRV9UQUJMRSI7Ly8kTk9OLU5MUy0xJAotCS8qKiB0YWJsZSBjZWxsIGNvbnRhaWVyLiAoVEh8VEQpKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1RDRUxMX0NPTlRBSU5FUiA9ICJDVFlQRV9UQ0VMTF9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogdGFibGUgcmVjb3JkIGNvbnRhaW5lci4gKFRSKSsgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9UUl9DT05UQUlORVIgPSAiQ1RZUEVfVFJfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCQlkZWZpbml0aW9ucyA9IG5ldyBqYXZhLnV0aWwuSGFzaHRhYmxlKCk7Ci0JfQotCi0JLyoqCi0JICogRmFjdG9yeSBtZXRob2QgZm9yIENvbXBsZXhUeXBlRGVmaW5pdGlvbi4KLQkgKiBFYWNoIGluc3RhbmNlIGNyZWF0ZWQgaW4gdGhpcyBtZXRob2QgbXVzdCBiZSByZWdpc3RlcmVkIGludG8KLQkgKiB0aGUgbWFwIHdpdGggaXRzIG5hbWUuCi0JICogQHBhcmFtIGRlZmluaXRpb25OYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ29tcGxleFR5cGVEZWZpbml0aW9uIGNyZWF0ZVR5cGVEZWZpbml0aW9uKFN0cmluZyBkZWZpbml0aW9uTmFtZSwgRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJaWYgKGRlZmluaXRpb25zLmNvbnRhaW5zS2V5KGRlZmluaXRpb25OYW1lKSkgewotCQkJcmV0dXJuIChDb21wbGV4VHlwZURlZmluaXRpb24pIGRlZmluaXRpb25zLmdldChkZWZpbml0aW9uTmFtZSk7Ci0JCX0KLQotCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gbnVsbDsKLQkJaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0FERFJFU1MpIHsKLQkJCWRlZiA9IG5ldyBDdGRBZGRyZXNzKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0RFRklOSVRJT05fTElTVCkgewotCQkJZGVmID0gbmV3IEN0ZERsKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0ZMT1dfQ09OVEFJTkVSKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkRmxvd0NvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9IRUFEKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkSGVhZChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9IVE1MKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkSHRtbChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9JTkxJTkVfQ09OVEFJTkVSKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkSW5saW5lQ29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0xJX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZExpQ29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZE9wdGlvbkNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9TRUxFQ1QpIHsKLQkJCWRlZiA9IG5ldyBDdGRTZWxlY3QoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSB7Ci0JCQlkZWYgPSBudWxsOwotCQl9Ci0JCWlmIChkZWYgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBmYWlsIHRvIGNyZWF0ZS4KLQkJZGVmaW5pdGlvbnMucHV0KGRlZmluaXRpb25OYW1lLCBkZWYpOwotCQlyZXR1cm4gZGVmOwotCX0KLQotCS8qKgotCSAqIEZvciBzaW5nbGV0b24uPGJyPgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSAhPSBudWxsKQotCQkJcmV0dXJuIGluc3RhbmNlOwotCQlpbnN0YW5jZSA9IG5ldyBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZEFkZHJlc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkQWRkcmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQxM2MwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkQWRkcmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBBRERSRVNTLgotICovCi1maW5hbCBjbGFzcyBDdGRBZGRyZXNzIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRBZGRyZXNzKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoKCVpbmxpbmUpIHwgUCkqLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoIHwgKSoKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyAoJWlubGluZSkKLQkJQ01Hcm91cEltcGwgaW5saW5lcyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCWlmIChpbmxpbmVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbGxlY3Rpb24uZ2V0SW5saW5lKGlubGluZXMpOwotCQljb250ZW50LmFwcGVuZENoaWxkKGlubGluZXMpOwotCQkvLyBQCi0JCUNNTm9kZSBwID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuUCk7Ci0JCWlmIChwICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKHApOwotCX0KLQotCS8qKgotCSAqICgoJWlubGluZSkgfCBQKSouCi0JICogQmVjYXVzZSAlaW5saW5lOyBjb250YWlucyAjUENEQVRBLCB0aGUgdHlwZSBpcyBNSVhFRC4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQUREUkVTUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZERsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZERsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYWJmOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGREbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBETC4KLSAqLwotZmluYWwgY2xhc3MgQ3RkRGwgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZERsKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVDsKLQl9Ci0KLQkvKioKLQkgKiAoRFQgfCBERCkrCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggfCApKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIERUCi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJLy8gREQKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuREQpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKERUIHwgREQpKy4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9ERUZJTklUSU9OX0xJU1Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRGbG93Q29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZEZsb3dDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5OGQ3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZEZsb3dDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgY29udGFpbmVycyBvZiA8Y29kZT4lZmxvdzs8L2NvZGU+LgotICovCi1maW5hbCBjbGFzcyBDdGRGbG93Q29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDdGRGbG93Q29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoJWZsb3c7KSoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQljb2xsZWN0aW9uLmdldEZsb3coY29udGVudCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZMT1dfQ09OVEFJTkVSOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSGVhZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRIZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZjc4YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRIZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgdGhlIGhlYWQgY29udGVudC4KLSAqIENvbnRlbnQgTW9kZWw6IChUSVRMRSAmIElTSU5ERVg/ICYgQkFTRT8pCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEhlYWQgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICovCi0JcHVibGljIEN0ZEhlYWQoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJVExFOwotCX0KLQotCS8qKgotCSAqIGZvciBIRUFELgotCSAqIFRvIGF2b2lkIHVzaW5nIGluY2x1c2lvbiwgdGhlIGNvbnRlbnQgbW9kZWwgY29tZXMgZnJvbSB0aGUgWEhUTUwgMS4wLgotCSAqCi0JICogKCVoZWFkLm1pc2M7LCAoKHRpdGxlLCAlaGVhZC5taXNjOywgKGJhc2UsICVoZWFkLm1pc2M7KT8pIHwgKGJhc2UsICVoZWFkLm1pc2M7LCAodGl0bGUsICVoZWFkLm1pc2M7KSkpKQotCSAqIEFuZCAlaGVhZC5taXNjOyBpczoKLQkgKiAoc2NyaXB0fHN0eWxlfG1ldGF8bGlua3xvYmplY3R8aXNpbmRleCkqCi0JICoKLQkgKiAwOiAoJWhlYWQubWlzYywgQSkKLQkgKiBBOiAoQiB8IEMpCi0JICogQjogKHRpdGxlLCAlaGVhZC5taXNjOywgRCkKLQkgKiBDOiAoYmFzZSwgJWhlYWQubWlzYzssIEUpCi0JICogRDogKGJhc2UsICVoZWFkLm1pc2M7KT8KLQkgKiBFOiAodGl0bGUsICVoZWFkLm1pc2M7KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBBdCAxc3QsIGNyZWF0ZSAlaGVhZC5taXNjOyBjb250ZW50LgotCQkvLyAlaGVhZC5taXNjOwotCQkvLyAgICggfCApKgotCQlDTUdyb3VwSW1wbCBtaXNjID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWlmIChtaXNjID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FVEEsfTsKLQkJY29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobWlzYywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCS8vIDJuZCwgZ2V0IGEgdGl0bGUKLQkJQ01Ob2RlIHRpdGxlID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEUpOwotCQkvLyAzcmQsIGdldCBhIGJhc2UKLQkJQ01Ob2RlIGJhc2UgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFKTsKLQkJaWYgKHRpdGxlID09IG51bGwgfHwgYmFzZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIFRvcCBsZXZlbCBjb250ZW50IGlzIGEgc2VxdWVuY2Ugb2YgJWhlYWQubWlzYzsgYW5kIEEuCi0JCS8vIDA6ICglaGVhZC5taXNjOywgQSkKLQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOwotCQljb250ZW50LmFwcGVuZENoaWxkKG1pc2MpOwotCQkvLyAgIGNyZWF0ZSBBIGFuZCBhcHBlbmQgaXQgdG8gdGhlIHRvcCBsZXZlbC4KLQkJewotCQkJLy8gQSBpcyBhIGNob2ljZSBvZiBCIGFuZCBDLgotCQkJLy8gQTogKEIgfCBDKQotCQkJLy8gICBjcmVhdGUgYSBjaG9pY2UKLQkJCUNNR3JvdXBJbXBsIGdBID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJCWlmIChnQSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCS8vICAgYXBwZW5kIEEgdG8gdGhlIHRvcCBsZXZlbC4KLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZ0EpOwotCi0JCQkvLyBjcmVhdGUgQiBhbmQgYXBwZW5kIGl0IHRvIEEKLQkJCXsKLQkJCQkvLyBCIGlzIGEgc2VxdWVuY2Ugb2YgdGl0bGUsICVoZWFkLm1pc2M7LCBhbmQgRC4KLQkJCQkvLyBCOiAodGl0bGUsICVoZWFkLm1pc2M7LCBEKQotCQkJCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJCQlDTUdyb3VwSW1wbCBnQiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJCQlpZiAoZ0IgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCS8vICAgYXBwZW5kIEIgdG8gQS4KLQkJCQlnQS5hcHBlbmRDaGlsZChnQik7Ci0KLQkJCQkvLyAgIGFwcGVuZCB0aXRsZSB0byBCCi0JCQkJZ0IuYXBwZW5kQ2hpbGQodGl0bGUpOwotCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEIKLQkJCQlnQi5hcHBlbmRDaGlsZChtaXNjKTsKLQkJCQkvLyAgIGNyZWF0ZSBEIGFuZCBhcHBlbmQgaXQgdG8gQi4KLQkJCQl7Ci0JCQkJCS8vIEQgaXMgYSBzZXF1ZW5jZSBvZiBiYXNlLCAlaGVhZC5taXNjOy4KLQkJCQkJLy8gRDogKGJhc2UsICVoZWFkLm1pc2M7KT8KLQkJCQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQkJCQlDTUdyb3VwSW1wbCBnRCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCAxKTsKLQkJCQkJaWYgKGdEID09IG51bGwpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCS8vICAgYXBwZW5kIEQgdG8gQi4KLQkJCQkJZ0IuYXBwZW5kQ2hpbGQoZ0QpOwotCi0JCQkJCS8vICAgYXBwZW5kIGJhc2UgdG8gRAotCQkJCQlnRC5hcHBlbmRDaGlsZChiYXNlKTsKLQkJCQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsgdG8gRC4KLQkJCQkJZ0QuYXBwZW5kQ2hpbGQobWlzYyk7Ci0JCQkJfQotCQkJfQotCQkJLy8gY3JlYXRlIEMgYW5kIGFwcGVuZCBpdCB0byBBCi0JCQl7Ci0JCQkJLy8gQyBpcyBhIHNlcXVlbmNlIG9mIGJhc2UsICVoZWFkLm1pc2M7LCBhbmQgRQotCQkJCS8vIEM6IChiYXNlLCAlaGVhZC5taXNjOywgRSkKLQkJCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCQkJQ01Hcm91cEltcGwgZ0MgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCQkJaWYgKGdDID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQkvLyAgIGFwcGVuZCBDIHRvIEEuCi0JCQkJZ0EuYXBwZW5kQ2hpbGQoZ0MpOwotCi0JCQkJLy8gICBhcHBlbmQgYmFzZSB0byBDCi0JCQkJZ0MuYXBwZW5kQ2hpbGQoYmFzZSk7Ci0JCQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsgdG8gQwotCQkJCWdDLmFwcGVuZENoaWxkKG1pc2MpOwotCi0JCQkJLy8gICBjcmVhdGUgRSBhbmQgYXBwZW5kIGl0IHRvIEMuCi0JCQkJewotCQkJCQkvLyBFIGlzIGEgc2VxdWVuY2Ugb2YgdGl0bGUgYW5kICVoZWFkLm1pc2M7LgotCQkJCQkvLyBFOiAodGl0bGUsICVoZWFkLm1pc2M7KQotCQkJCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCQkJCUNNR3JvdXBJbXBsIGdFID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkJCQlpZiAoZ0UgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQkJLy8gICBhcHBlbmQgRSB0byBDLgotCQkJCQlnQy5hcHBlbmRDaGlsZChnRSk7Ci0KLQkJCQkJLy8gICBhcHBlbmQgdGl0bGUgdG8gRQotCQkJCQlnRS5hcHBlbmRDaGlsZCh0aXRsZSk7Ci0JCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEUuCi0JCQkJCWdFLmFwcGVuZENoaWxkKG1pc2MpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEVsZW1lbnQgY29udGVudC48YnI+Ci0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IRUFEOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSHRtbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRIdG1sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNGZlNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRIdG1sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIENvbXBsZXggdHlwZSBkZWZpbml0aW9uIGZvciA8Y29kZT5IVE1MPC9jb2RlPi48YnI+Ci0gKiBDb250ZW50IE1vZGVsOgotICogSEVBRCwgKEZSQU1FU0VUfEJPRFkpPGJyPgotICovCi1maW5hbCBjbGFzcyBDdGRIdG1sIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDdGRIdG1sKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEOwotCX0KLQotCS8qKgotCSAqICglaHRtbC5jb250ZW50OykuCi0JICogJWh0bWwuY29udGVudDsgaXMgSEVBRCwgKEZSQU1FU0VUIHwgQk9EWSkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIEhFQUQKLQkJQ01Ob2RlIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkJLy8gKCB8ICkKLQkJQ01Hcm91cEltcGwgZ3JvdXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQljb250ZW50LmFwcGVuZENoaWxkKGdyb3VwKTsKLQotCQkvLyBGUkFNRVNFVCwgQk9EWQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZfTsKLQkJY29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEVsZW1lbnQgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IVE1MOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSW5saW5lQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZElubGluZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDIzNGFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSW5saW5lQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci0KLS8qKgotICogQ29tcGxleCB0eXBlIGRlZmluaXRpb24gZm9yICglaW5saW5lOykqLgotICovCi1maW5hbCBjbGFzcyBDdGRJbmxpbmVDb250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZElubGluZUNvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKCVpbmxpbmUpKi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQljb2xsZWN0aW9uLmdldElubGluZShjb250ZW50KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZExpQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZExpQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyODk1NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRMaUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIExpc3QgaXRlbSBjb250YWluZXIuCi0gKiAoTEkpKwotICovCi1maW5hbCBjbGFzcyBDdGRMaUNvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVuQ29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRMaUNvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEk7Ci0JfQotCi0JLyoqCi0JICogKExJKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIChMSSkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlDTU5vZGUgbGkgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSSk7Ci0JCWlmIChsaSAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChsaSk7Ci0JfQotCi0JLyoqCi0JICogRUxFTUVOVCBjb250ZW50Ljxicj4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0xJX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZE9wdGlvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRPcHRpb25Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJlYzZjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZE9wdGlvbkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIE9QVElPTiBjb250YWluZXIuCi0gKiAoT1BUSU9OKSsKLSAqLwotZmluYWwgY2xhc3MgQ3RkT3B0aW9uQ29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRPcHRpb25Db250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTjsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUSU9OKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIE9QVElPTgotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChPUFRJT04pKwotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZFNlbGVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRTZWxlY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwYzk2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZFNlbGVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBTRUxFQ1QuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZFNlbGVjdCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkU2VsZWN0KEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT047Ci0JfQotCi0JLyoqCi0JICogKE9QVEdST1VQIHwgT1BUSU9OKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggfCApKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIE9QVElPTgotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChPUFRHUk9VUCB8IE9QVElPTikrLgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1NFTEVDVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0RlY2xDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0RlY2xDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmOTBiNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9EZWNsQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICovCi1hYnN0cmFjdCBjbGFzcyBEZWNsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIENNTmFtZWROb2RlTWFwIHsKLQotCi0JcHJvdGVjdGVkIGNsYXNzIER1YWxNYXAgewotCQlwdWJsaWMgRHVhbE1hcCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgRHVhbE1hcChPYmplY3RbXSBvYmplY3RzKSB7Ci0JCQlzdXBlcigpOwotCQkJaW5pdGlhbGl6ZShvYmplY3RzKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJCXJldHVybiB0YWJsZS5sZW5ndGg7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKGludCBrZXkpIHsKLQkJCWlmICghaXNWYWxpZEluZGV4KGtleSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gdGFibGVba2V5XTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0S2V5KE9iamVjdCB2YWx1ZSkgewotCQkJSW50ZWdlciBrZXlPYmogPSAoSW50ZWdlcikgbWFwLmdldCh2YWx1ZSk7Ci0JCQlpZiAoa2V5T2JqID09IG51bGwpCi0JCQkJcmV0dXJuIElEX1VOS05PV047Ci0JCQlyZXR1cm4ga2V5T2JqLmludFZhbHVlKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJCWlmIChvYmplY3RzID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJdGFibGUgPSBvYmplY3RzOwotCQkJbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoaW50IGtleSA9IDA7IGtleSA8IG9iamVjdHMubGVuZ3RoOyBrZXkrKykgewotCQkJCU9iamVjdCB2YWx1ZSA9IHRhYmxlW2tleV07Ci0JCQkJbWFwLnB1dCh2YWx1ZSwgbmV3IEludGVnZXIoa2V5KSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIE9iamVjdFtdIHRhYmxlID0gbnVsbDsKLQkJcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRJbmRleChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBpbmRleCA+PSAwICYmIGluZGV4IDwgdGFibGUubGVuZ3RoOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFRvbGVyYW50U3RyaW5nRHVhbE1hcCBleHRlbmRzIER1YWxNYXAgewotCQlwdWJsaWMgVG9sZXJhbnRTdHJpbmdEdWFsTWFwKFN0cmluZ1tdIG5hbWVzKSB7Ci0JCQlzdXBlcigpOwotCQkJT2JqZWN0W10gb2JqZWN0cyA9IG5ldyBPYmplY3RbbmFtZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlvYmplY3RzW2ldID0gbWFrZUNhbm9uaWNhbEZvcm0obmFtZXNbaV0pOwotCQkJfQotCQkJaW5pdGlhbGl6ZShvYmplY3RzKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0S2V5KE9iamVjdCB2YWx1ZSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIHZhbHVlOwotCQkJCXJldHVybiBzdXBlci5nZXRLZXkobWFrZUNhbm9uaWNhbEZvcm0obmFtZSkpOwotCQkJfQotCQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIElEX1VOS05PV047Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBtYWtlQ2Fub25pY2FsRm9ybShTdHJpbmcgcmF3KSB7Ci0JCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDE1MgotCQkJLy8gd2UgYXJlIGFibGUgdG8gImNoZWF0IiBoZXJlIGEgbGl0dGxlIGFuZCB1c2UgVVMgTG9jYWxlCi0JCQkvLyB0byBnZXQgYSBnb29kIGNvbm9uaWNhbCBmb3JtLCBzaW5jZSB3ZSBhcmUgdXNpbmcgdGhpcyBvbmx5Ci0JCQkvLyBmb3IgSFRNTCBhbmQgSlNQIHN0YW5kYXJkIHRhZ3MuCi0JCQkvLyBMb25nIHRlcm0sIGZvciBzaW1pbGFyIG5lZWRzIHdpdGggWE1MIDEuMSAoZm9yIGV4YW1wbGUpCi0JCQkvLyB3ZSBzaG91bGQgdXNlIGEgY2xhc3Mgc3VjaCBhcyBjb20uaWJtLmljdS50ZXh0Lk5vcm1hbGl6ZXIKLQkJCXJldHVybiByYXcudG9VcHBlckNhc2UoTG9jYWxlLlVTKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgRGVjbEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCQlwdWJsaWMgRGVjbEl0ZXJhdG9yKCkgewotCQkJbWF4aWQgPSBmRGVjbHMubGVuZ3RoIC0gMTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gaWQgPCBtYXhpZDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCWlmICghaGFzTmV4dCgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGl0ZW0oKytpZCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7IC8qIG5vdGhpbmcgc2hvdWxkIGJlIGRvbmUuICovCi0JCX0KLQotCQlwcml2YXRlIGludCBpZCA9IC0xOwotCQlwcml2YXRlIGludCBtYXhpZCA9IC0xOwotCX0KLQotCUNNTm9kZVtdIGZEZWNscyA9IG51bGw7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIFNUUklDVF9DQVNFID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIFRPTEVSQU5UX0NBU0UgPSB0cnVlOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IElEX1VOS05PV04gPSAtMTsKLQlwcml2YXRlIER1YWxNYXAgZk1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRGVjbENvbGxlY3Rpb24oU3RyaW5nW10gbmFtZXMsIGJvb2xlYW4gdG9sZXJhbnQpIHsKLQkJc3VwZXIoKTsKLQkJZkRlY2xzID0gbmV3IENNTm9kZVtuYW1lcy5sZW5ndGhdOwotCQlpZiAodG9sZXJhbnQpIHsKLQkJCWZNYXAgPSBuZXcgVG9sZXJhbnRTdHJpbmdEdWFsTWFwKG5hbWVzKTsKLQkJfQotCQllbHNlIHsKLQkJCWZNYXAgPSBuZXcgRHVhbE1hcChuYW1lcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ01Ob2RlIGNyZWF0ZShTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RGVjbGFyYXRpb25zKFN0cmluZ1tdIG5hbWVzKSB7Ci0JCUNNTmFtZWROb2RlTWFwSW1wbCBtYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gbmFtZXNbaV07Ci0JCQlDTU5vZGUgbm9kZSA9IGdldE5hbWVkSXRlbShuYW1lKTsKLQkJCWlmIChub2RlID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQltYXAucHV0TmFtZWRJdGVtKG5hbWUsIG5vZGUpOwotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0JcHVibGljIHZvaWQgZ2V0RGVjbGFyYXRpb25zKENNR3JvdXBJbXBsIGdyb3VwLCBJdGVyYXRvciBuYW1lcykgewotCQl3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgZW50aXR5TmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHQoKTsKLQkJCUNNTm9kZSBkZWMgPSBnZXROYW1lZEl0ZW0oZW50aXR5TmFtZSk7Ci0JCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJZ3JvdXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hcCBuYW1lIHRvIGlkLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldElEKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmTWFwLmdldEtleShuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZEZWNscy5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWUoaW50IGlkKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBmTWFwLmdldFZhbHVlKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCWludCBpZCA9IGdldElEKG5hbWUpOwotCQlpZiAoIWlzVmFsaWRJRChpZCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGl0ZW0oaWQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRJRChpbnQgaWQpIHsKLQkJcmV0dXJuIGlkID49IDAgJiYgaWQgPCBmRGVjbHMubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1ZhbGlkSUQoaW5kZXgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNNTm9kZSBkZWNsID0gZkRlY2xzW2luZGV4XTsKLQkJaWYgKGRlY2wgIT0gbnVsbCkKLQkJCXJldHVybiBkZWNsOyAvLyBhbHJlYWR5IGV4aXN0LgotCi0JCWRlY2wgPSBjcmVhdGUoZ2V0TmFtZShpbmRleCkpOwotCQlmRGVjbHNbaW5kZXhdID0gZGVjbDsKLQkJcmV0dXJuIGRlY2w7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IERlY2xJdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvRWxlbWVudENvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvRWxlbWVudENvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE4MDEzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotICovCi1maW5hbCBjbGFzcyBFbGVtZW50Q29sbGVjdGlvbiBleHRlbmRzIERlY2xDb2xsZWN0aW9uIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUgewotCi0KLQkvLyBFbGVtZW50IElEcwotCXByaXZhdGUgc3RhdGljIGNsYXNzIElkcyB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0EgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BRERSRVNTID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkFTRSA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JMT0NLUVVPVEUgPSAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CT0RZID0gNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQlIgPSA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DRU5URVIgPSA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERCA9IDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJUiA9IDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJViA9IDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RMID0gMTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RUID0gMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZPUk0gPSAxMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDEgPSAxMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDIgPSAxNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDMgPSAxNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDQgPSAxNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDUgPSAxNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDYgPSAxODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEVBRCA9IDE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IUiA9IDIwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IVE1MID0gMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lNRyA9IDIyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTlBVVCA9IDIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MSSA9IDI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NRU5VID0gMjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01FVEEgPSAyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0wgPSAyNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1BUSU9OID0gMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1AgPSAyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFJFID0gMzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NFTEVDVCA9IDMxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9URVhUQVJFQSA9IDMyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USVRMRSA9IDMzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VTCA9IDM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfQ09ORklHID0gMzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9FQ0hPID0gMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9FWEVDID0gMzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9GU0laRSA9IDM4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRkxBU1RNT0QgPSAzOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0lOQ0xVREUgPSA0MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX1BSSU5URU5WID0gNDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9TRVQgPSA0MjsKLQotCQlwdWJsaWMgc3RhdGljIGludCBnZXROdW1PZklkcygpIHsKLQkJCWlmIChudW1vZmlkcyAhPSAtMSkKLQkJCQlyZXR1cm4gbnVtb2ZpZHM7Ci0KLQkJCS8vIE5PVEU6IElmIHRoZSByZWZsZWN0aW9uIGlzIHRvbyBzbG93LCB0aGlzIG1ldGhvZCBzaG91bGQKLQkJCS8vIGp1c3QgcmV0dXJuIHRoZSBsaXRlcmFsIHZhbHVlLCBsaWtlIDEwNS4KLQkJCS8vIC0tIDUvMjUvMjAwMQotCQkJQ2xhc3MgY2xhenogPSBJZHMuY2xhc3M7Ci0JCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkcygpOwotCQkJbnVtb2ZpZHMgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZpZWxkc1tpXS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiSURfIikpLy8kTk9OLU5MUy0xJAotCQkJCQludW1vZmlkcysrOwotCQkJfQotCQkJcmV0dXJuIG51bW9maWRzOwotCQl9Ci0KLQkJLy8gY2hhY2hlIHRoZSByZXN1bHQgb2YgdGhlIHJlZmxlY3Rpb24uCi0JCXByaXZhdGUgc3RhdGljIGludCBudW1vZmlkcyA9IC0xOwotCX0KLQotCS8qKiAlZm9ybWN0bDsuIElOUFVUIHwgU0VMRUNUIHwgVEVYVEFSRUEgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGT1JNQ1RMID0ge0lOUFVULCBTRUxFQ1QsIFRFWFRBUkVBfTsKLQkvKiogJXBocmFzZTsuCi0JICogREZOCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEhSQVNFID0ge0RGTn07Ci0JLyoqICVzcGVjaWFsOy4KLQkgKiBBIHwgSU1HIHwgQlIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTUEVDSUFMID0ge0EsIElNRywgQlJ9OwotCS8qKiAlaGVhZGluZzsuIEhbMS02XSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhFQURJTkcgPSB7SDEsIEgyLCBIMywgSDQsIEg1LCBINn07Ci0JLyoqICVsaXN0Oy4gVUwgfCBPTCB8IERJUiB8IE1FTlUgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMSVNUID0ge1VMLCBPTCwgRElSLCBNRU5VfTsKLQkvKiogJXByZWZvcm1hdHRlZDsuIFBSRSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBSRUZPUk1BVFRFRCA9IHtQUkV9OwotCXByaXZhdGUgQXR0cmlidXRlQ29sbGVjdGlvbiBhdHRyaWJ1dGVDb2xsZWN0aW9uID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBuYW1lcyA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQluYW1lcyA9IG5ldyBTdHJpbmdbSWRzLmdldE51bU9mSWRzKCldOwotCQluYW1lc1tJZHMuSURfQV0gPSBBOwotCQluYW1lc1tJZHMuSURfQUREUkVTU10gPSBBRERSRVNTOwotCQluYW1lc1tJZHMuSURfQkFTRV0gPSBCQVNFOwotCQluYW1lc1tJZHMuSURfQkxPQ0tRVU9URV0gPSBCTE9DS1FVT1RFOwotCQluYW1lc1tJZHMuSURfQk9EWV0gPSBCT0RZOwotCQluYW1lc1tJZHMuSURfQlJdID0gQlI7Ci0JCW5hbWVzW0lkcy5JRF9DRU5URVJdID0gQ0VOVEVSOwotCQluYW1lc1tJZHMuSURfRERdID0gREQ7Ci0JCW5hbWVzW0lkcy5JRF9ESVJdID0gRElSOwotCQluYW1lc1tJZHMuSURfRElWXSA9IERJVjsKLQkJbmFtZXNbSWRzLklEX0RMXSA9IERMOwotCQluYW1lc1tJZHMuSURfRFRdID0gRFQ7Ci0JCW5hbWVzW0lkcy5JRF9GT1JNXSA9IEZPUk07Ci0JCW5hbWVzW0lkcy5JRF9IMV0gPSBIMTsKLQkJbmFtZXNbSWRzLklEX0gyXSA9IEgyOwotCQluYW1lc1tJZHMuSURfSDNdID0gSDM7Ci0JCW5hbWVzW0lkcy5JRF9INF0gPSBINDsKLQkJbmFtZXNbSWRzLklEX0g1XSA9IEg1OwotCQluYW1lc1tJZHMuSURfSDZdID0gSDY7Ci0JCW5hbWVzW0lkcy5JRF9IRUFEXSA9IEhFQUQ7Ci0JCW5hbWVzW0lkcy5JRF9IUl0gPSBIUjsKLQkJbmFtZXNbSWRzLklEX0hUTUxdID0gSFRNTDsKLQkJbmFtZXNbSWRzLklEX0lNR10gPSBJTUc7Ci0JCW5hbWVzW0lkcy5JRF9JTlBVVF0gPSBJTlBVVDsKLQkJbmFtZXNbSWRzLklEX0xJXSA9IExJOwotCQluYW1lc1tJZHMuSURfTUVOVV0gPSBNRU5VOwotCQluYW1lc1tJZHMuSURfTUVUQV0gPSBNRVRBOwotCQluYW1lc1tJZHMuSURfT0xdID0gT0w7Ci0JCW5hbWVzW0lkcy5JRF9PUFRJT05dID0gT1BUSU9OOwotCQluYW1lc1tJZHMuSURfUF0gPSBQOwotCQluYW1lc1tJZHMuSURfUFJFXSA9IFBSRTsKLQkJbmFtZXNbSWRzLklEX1NFTEVDVF0gPSBTRUxFQ1Q7Ci0JCW5hbWVzW0lkcy5JRF9URVhUQVJFQV0gPSBURVhUQVJFQTsKLQkJbmFtZXNbSWRzLklEX1RJVExFXSA9IFRJVExFOwotCQluYW1lc1tJZHMuSURfVUxdID0gVUw7Ci0JCW5hbWVzW0lkcy5JRF9TU0lfQ09ORklHXSA9IFNTSV9DT05GSUc7Ci0JCW5hbWVzW0lkcy5JRF9TU0lfRUNIT10gPSBTU0lfRUNITzsKLQkJbmFtZXNbSWRzLklEX1NTSV9FWEVDXSA9IFNTSV9FWEVDOwotCQluYW1lc1tJZHMuSURfU1NJX0ZTSVpFXSA9IFNTSV9GU0laRTsKLQkJbmFtZXNbSWRzLklEX1NTSV9GTEFTVE1PRF0gPSBTU0lfRkxBU1RNT0Q7Ci0JCW5hbWVzW0lkcy5JRF9TU0lfSU5DTFVERV0gPSBTU0lfSU5DTFVERTsKLQkJbmFtZXNbSWRzLklEX1NTSV9QUklOVEVOVl0gPSBTU0lfUFJJTlRFTlY7Ci0JCW5hbWVzW0lkcy5JRF9TU0lfU0VUXSA9IFNTSV9TRVQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVsZW1lbnRDb2xsZWN0aW9uKEF0dHJpYnV0ZUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihuYW1lcywgVE9MRVJBTlRfQ0FTRSk7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEFjdHVhbGx5IGNyZWF0ZXMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBpbnN0YW5jZS4KLQkgKiBAcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGNyZWF0ZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJSFRNTEVsZW1EZWNsSW1wbCBlZGVjID0gbnVsbDsKLQotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBKSkgewotCQkJZWRlYyA9IG5ldyBIZWRBKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBRERSRVNTKSkgewotCQkJZWRlYyA9IG5ldyBIZWRBRERSRVNTKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCQVNFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCQVNFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCTE9DS1FVT1RFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCTE9DS1FVT1RFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCT0RZKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCT0RZKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQlIodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKENFTlRFUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQ0VOVEVSKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShERCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkREQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERJUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTUVOVShESVIsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShESVYpKSB7Ci0JCQllZGVjID0gbmV3IEhlZERJVih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoREwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZERMKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShEVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRFQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEZPUk0pKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZPUk0odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEgxKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEgxLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDIsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIMykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhIMywgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEg0KSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEg0LCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDUsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShINikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhINiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhFQUQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhFQUQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIUih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSFRNTCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSU1HKSkgewotCQkJZWRlYyA9IG5ldyBIZWRJTUcodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKElOUFVUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRJTlBVVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEkpKSB7Ci0JCQllZGVjID0gbmV3IEhlZExJKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShNRU5VKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNRU5VKE1FTlUsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShNRVRBKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNRVRBKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShPTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkT0wodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE9QVElPTikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkT1BUSU9OKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShQKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShQUkUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBSRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTRUxFQ1QodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRFWFRBUkVBKSkgewotCQkJZWRlYyA9IG5ldyBIZWRURVhUQVJFQSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVElUTEUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRJVExFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShVTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVUwodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9DT05GSUcpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUNvbmZpZyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0VDSE8pKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUVjaG8odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9FWEVDKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lFeGVjKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfRlNJWkUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUZzaXplKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfRkxBU1RNT0QpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUZsYXN0bW9kKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfSU5DTFVERSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJSW5jbHVkZSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX1BSSU5URU5WKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lQcmludGVudih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX1NFVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJU2V0KHRoaXMpOwotCi0JCX0gLy8gdW5rbm93bgotCQllbHNlIHsKLQkJCS8vIE5PVEU6IFdlIGRvbid0IGRlZmluZSB0aGUgVU5LTk9XTiBlbGVtZW50IGRlY2xhcmF0aW9uLgotCQkJLy8gPGNvZGU+bnVsbDwvY29kZT4gZm9yIGEgZGVjbGFyYXRpb24gaXMgYSBzaWduIG9mCi0JCQkvLyB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgdW5rbm93bi4KLQkJCS8vIC0tIDMvOS8yMDAxCi0JCQllZGVjID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZWRlYzsKLQl9Ci0KLQlwdWJsaWMgQXR0cmlidXRlQ29sbGVjdGlvbiBnZXRBdHRyaWJ1dGVDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gYXR0cmlidXRlQ29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgQ29sbGVjdGlvbiBnZXROYW1lc09mQmxvY2soKSB7Ci0JCS8vIFAgfCAlbGlzdCB8ICVwcmVmb3JtYXR0ZWQgfCBETCB8IERJViB8IENFTlRFUiB8IEJMT0NLUVVPVEUgfCBGT1JNIHwgSFIKLQkJU3RyaW5nW10gYmxvY2tNaXNjID0ge1AsIERMLCBESVYsIENFTlRFUiwgQkxPQ0tRVU9URSwgRk9STSwgSFIsfTsKLQkJVmVjdG9yIGJsb2NrTmFtZXMgPSBuZXcgVmVjdG9yKEFycmF5cy5hc0xpc3QoYmxvY2tNaXNjKSk7Ci0JCS8vICVoZWFkaW5nOwotCQlibG9ja05hbWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KEhFQURJTkcpKTsKLQkJLy8gJWxpc3Q7Ci0JCWJsb2NrTmFtZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoTElTVCkpOwotCQkvLyAlcHJlZm9ybWF0dGVkOwotCQlibG9ja05hbWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KFBSRUZPUk1BVFRFRCkpOwotCi0JCXJldHVybiBibG9ja05hbWVzOwotCX0KLQotCS8qKgotCSAqICVibG9jazsuCi0JICogJWJsb2NrOyBpczoKLQkgKiBQIHwgJWhlYWRpbmc7IHwgJWxpc3Q7IHwgJXByZWZvcm1hdHRlZDsgfCBETCB8IERJViB8IENFTlRFUiB8Ci0JICogTk9TQ1JJUFQgfCBOT0ZSQU1FUyB8IEJMT0NLUVVPVEUgfCBGT1JNIHwgSVNJTkRFWCB8IEhSIHwKLQkgKiBUQUJMRSB8IEZJRUxEU0VUIHwgQUREUkVTUy48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0QmxvY2soQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgZ2V0TmFtZXNPZkJsb2NrKCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtCi0JICogaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPiBpbnN0YW5jZS4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRGbG93KENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRCbG9jayhncm91cCk7Ci0JCWdldElubGluZShncm91cCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0Rm9udHN0eWxlKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0gaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPgotCSAqIGluc3RhbmNlLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRGb3JtY3RybChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KEZPUk1DVEwpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqICVoZWFkaW5nOy4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRIZWFkaW5nKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChIRUFESU5HKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0KLQkgKiBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+IGluc3RhbmNlLgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldElubGluZShDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0Rm9udHN0eWxlKGdyb3VwKTsKLQkJZ2V0UGhyYXNlKGdyb3VwKTsKLQkJZ2V0U3BlY2lhbChncm91cCk7Ci0JCWdldEZvcm1jdHJsKGdyb3VwKTsKLQl9Ci0KLQkvKioKLQkgKiAlbGlzdDsuCi0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0TGlzdChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoTElTVCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0UGhyYXNlKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoUEhSQVNFKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiAlcHJlZm9ybWF0dGVkOwotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldFByZWZvcm1hdHRlZChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoUFJFRk9STUFUVEVEKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0gaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPgotCSAqIGluc3RhbmNlLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRTcGVjaWFsKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoU1BFQ0lBTCkuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9FbnRpdHlDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0VudGl0eUNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzNzFmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0VudGl0eUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBlbnRpdHkgZGVjbGFyYXRpb25zLgotICovCi1maW5hbCBjbGFzcyBFbnRpdHlDb2xsZWN0aW9uIGV4dGVuZHMgRGVjbENvbGxlY3Rpb24gaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZS5FbnRpdHlOYW1lIHsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWRzIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUFDVVRFX0wgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQUNVVEVfVSA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FDSVJDX0wgPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQ0lSQ19VID0gMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUNVVEUgPSA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BRUxJR19MID0gNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUVMSUdfVSA9IDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FHUkFWRV9MID0gNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUdSQVZFX1UgPSA4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTEVGU1lNID0gOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUxQSEFfTCA9IDEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTFBIQV9VID0gMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FNUCA9IDEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTkQgPSAxMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQU5HID0gMTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FSSU5HX0wgPSAxNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVJJTkdfVSA9IDE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BU1lNUCA9IDE3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVElMREVfTCA9IDE4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVElMREVfVSA9IDE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVU1MX0wgPSAyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVVNTF9VID0gMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JEUVVPID0gMjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JFVEFfTCA9IDIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CRVRBX1UgPSAyNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQlJWQkFSID0gMjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JVTEwgPSAyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0FQID0gMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NDRURJTF9MID0gMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NDRURJTF9VID0gMjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NFRElMID0gMzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NFTlQgPSAzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0hJX0wgPSAzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0hJX1UgPSAzMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0lSQyA9IDM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DTFVCUyA9IDM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DT05HID0gMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NPUFkgPSAzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ1JBUlIgPSAzODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ1VQID0gMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NVUlJFTiA9IDQwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQUdHRVJfTCA9IDQxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQUdHRVJfVSA9IDQyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQVJSX0wgPSA0MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREFSUl9VID0gNDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFRyA9IDQ1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERUxUQV9MID0gNDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFTFRBX1UgPSA0NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElBTVMgPSA0ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElWSURFID0gNDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VBQ1VURV9MID0gNTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VBQ1VURV9VID0gNTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VDSVJDX0wgPSA1MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUNJUkNfVSA9IDUzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FR1JBVkVfTCA9IDU0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FR1JBVkVfVSA9IDU1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTVBUWSA9IDU2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTVNQID0gNTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VOU1AgPSA1ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVBTSUxPTl9MID0gNTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VQU0lMT05fVSA9IDYwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FUVVJViA9IDYxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEFfTCA9IDYyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEFfVSA9IDYzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEhfTCA9IDY0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEhfVSA9IDY1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVU1MX0wgPSA2NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVVNTF9VID0gNjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VVUk8gPSA2ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVhJU1QgPSA2OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRk5PRiA9IDcwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GT1JBTEwgPSA3MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBQzEyID0gNzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZSQUMxNCA9IDczOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFDMzQgPSA3NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBU0wgPSA3NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfR0FNTUFfTCA9IDc2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9HQU1NQV9VID0gNzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dFID0gNzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dUID0gNzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hBUlJfTCA9IDgwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IQVJSX1UgPSA4MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEVBUlRTID0gODI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hFTExJUCA9IDgzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQUNVVEVfTCA9IDg0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQUNVVEVfVSA9IDg1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQ0lSQ19MID0gODY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lDSVJDX1UgPSA4NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUVYQ0wgPSA4ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUdSQVZFX0wgPSA4OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUdSQVZFX1UgPSA5MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU1BR0UgPSA5MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5GSU4gPSA5MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5UID0gOTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lPVEFfTCA9IDk0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JT1RBX1UgPSA5NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVFVRVNUID0gOTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lTSU4gPSA5NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVVNTF9MID0gOTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lVTUxfVSA9IDk5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9LQVBQQV9MID0gMTAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9LQVBQQV9VID0gMTAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQU1CREFfTCA9IDEwMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFNQkRBX1UgPSAxMDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBTkcgPSAxMDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBUVVPID0gMTA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQVJSX0wgPSAxMDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBUlJfVSA9IDEwNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTENFSUwgPSAxMDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xEUVVPID0gMTA5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MRSA9IDExMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEZMT09SID0gMTExOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MT1dBU1QgPSAxMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xPWiA9IDExMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTFJNID0gMTE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MU0FRVU8gPSAxMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xTUVVPID0gMTE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MVCA9IDExNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUFDUiA9IDExODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTURBU0ggPSAxMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01JQ1JPID0gMTIwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NSURET1QgPSAxMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01JTlVTID0gMTIyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NVV9MID0gMTIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NVV9VID0gMTI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OQUJMQSA9IDEyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkJTUCA9IDEyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkRBU0ggPSAxMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05FID0gMTI4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OSSA9IDEyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTk9UID0gMTMwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OT1RJTiA9IDEzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlNVQiA9IDEzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlRJTERFX0wgPSAxMzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05USUxERV9VID0gMTM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OVV9MID0gMTM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OVV9VID0gMTM2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PQUNVVEVfTCA9IDEzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0FDVVRFX1UgPSAxMzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09DSVJDX0wgPSAxMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09DSVJDX1UgPSAxNDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09FTElHX0wgPSAxNDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09FTElHX1UgPSAxNDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09HUkFWRV9MID0gMTQzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PR1JBVkVfVSA9IDE0NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0xJTkUgPSAxNDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NRUdBX0wgPSAxNDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NRUdBX1UgPSAxNDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NSUNST05fTCA9IDE0ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT01JQ1JPTl9VID0gMTQ5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUExVUyA9IDE1MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1IgPSAxNTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09SREYgPSAxNTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09SRE0gPSAxNTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09TTEFTSF9MID0gMTU0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PU0xBU0hfVSA9IDE1NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RJTERFX0wgPSAxNTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09USUxERV9VID0gMTU3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PVElNRVMgPSAxNTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09VTUxfTCA9IDE1OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1VNTF9VID0gMTYwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJBID0gMTYxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJUID0gMTYyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QRVJNSUwgPSAxNjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BFUlAgPSAxNjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BISV9MID0gMTY1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSElfVSA9IDE2NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUElWID0gMTY3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSV9MID0gMTY4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSV9VID0gMTY5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QTFVTTU4gPSAxNzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BPVU5EID0gMTcxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUklNRV9MID0gMTcyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUklNRV9VID0gMTczOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUk9EID0gMTc0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUk9QID0gMTc1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QU0lfTCA9IDE3NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFNJX1UgPSAxNzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1FVT1QgPSAxNzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JBRElDID0gMTc5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQU5HID0gMTgwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQVFVTyA9IDE4MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFSUl9MID0gMTgyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQVJSX1UgPSAxODM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JDRUlMID0gMTg0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SRFFVTyA9IDE4NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkVBTCA9IDE4NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkVHID0gMTg3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SRkxPT1IgPSAxODg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JIT19MID0gMTg5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SSE9fVSA9IDE5MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkxNID0gMTkxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SU0FRVU8gPSAxOTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JTUVVPID0gMTkzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQlFVTyA9IDE5NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0NBUk9OX0wgPSAxOTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NDQVJPTl9VID0gMTk2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRE9UID0gMTk3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRUNUID0gMTk4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TSFkgPSAxOTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NJR01BRiA9IDIwMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lHTUFfTCA9IDIwMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lHTUFfVSA9IDIwMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lNID0gMjAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TUEFERVMgPSAyMDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVQiA9IDIwNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VCRSA9IDIwNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VNID0gMjA3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVAgPSAyMDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUDEgPSAyMDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUDIgPSAyMTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUDMgPSAyMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUEUgPSAyMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NaTElHID0gMjEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UQVVfTCA9IDIxNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEFVX1UgPSAyMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVJFNCA9IDIxNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhFVEFTWU0gPSAyMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVRBX0wgPSAyMTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVRBX1UgPSAyMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RISU5TUCA9IDIyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhPUk5fTCA9IDIyMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhPUk5fVSA9IDIyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVElMREUgPSAyMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RJTUVTID0gMjI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UUkFERSA9IDIyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUFDVVRFX0wgPSAyMjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VBQ1VURV9VID0gMjI3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQVJSX0wgPSAyMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VBUlJfVSA9IDIyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUNJUkNfTCA9IDIzMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUNJUkNfVSA9IDIzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUdSQVZFX0wgPSAyMzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VHUkFWRV9VID0gMjMzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VTUwgPSAyMzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VQU0lIID0gMjM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VUFNJTE9OX0wgPSAyMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VQU0lMT05fVSA9IDIzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVVNTF9MID0gMjM4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VVU1MX1UgPSAyMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1dFSUVSUCA9IDI0MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWElfTCA9IDI0MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWElfVSA9IDI0MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWUFDVVRFX0wgPSAyNDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lBQ1VURV9VID0gMjQ0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ZRU4gPSAyNDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lVTUxfTCA9IDI0NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWVVNTF9VID0gMjQ3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9aRVRBX0wgPSAyNDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1pFVEFfVSA9IDI0OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWldKID0gMjUwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9aV05KID0gMjUxOwotCi0JCXB1YmxpYyBzdGF0aWMgaW50IGdldE51bU9mSWRzKCkgewotCQkJaWYgKG51bW9maWRzICE9IC0xKQotCQkJCXJldHVybiBudW1vZmlkczsKLQotCQkJLy8gTk9URTogSWYgdGhlIHJlZmxlY3Rpb24gaXMgdG9vIHNsb3csIHRoaXMgbWV0aG9kIHNob3VsZAotCQkJLy8ganVzdCByZXR1cm4gdGhlIGxpdGVyYWwgdmFsdWUsIGxpa2UgMjUyLgotCQkJLy8gLS0gNS8yNC8yMDAxCi0JCQlDbGFzcyBjbGF6eiA9IElkcy5jbGFzczsKLQkJCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RmllbGRzKCk7Ci0JCQludW1vZmlkcyA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCQlpZiAobmFtZS5zdGFydHNXaXRoKCJJRF8iKSkvLyROT04tTkxTLTEkCi0JCQkJCW51bW9maWRzKys7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVtb2ZpZHM7Ci0JCX0KLQotCQkvLyBjaGFjaGUgdGhlIHJlc3VsdCBvZiB0aGUgcmVmbGVjdGlvbi4KLQkJcHJpdmF0ZSBzdGF0aWMgaW50IG51bW9maWRzID0gLTE7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmFtZXMgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJbmFtZXMgPSBuZXcgU3RyaW5nW0lkcy5nZXROdW1PZklkcygpXTsKLQkJbmFtZXNbSWRzLklEX0FBQ1VURV9MXSA9IEFBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfQUFDVVRFX1VdID0gQUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9BQ0lSQ19MXSA9IEFDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9BQ0lSQ19VXSA9IEFDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9BQ1VURV0gPSBBQ1VURTsKLQkJbmFtZXNbSWRzLklEX0FFTElHX0xdID0gQUVMSUdfTDsKLQkJbmFtZXNbSWRzLklEX0FFTElHX1VdID0gQUVMSUdfVTsKLQkJbmFtZXNbSWRzLklEX0FHUkFWRV9MXSA9IEFHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfQUdSQVZFX1VdID0gQUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9BTEVGU1lNXSA9IEFMRUZTWU07Ci0JCW5hbWVzW0lkcy5JRF9BTFBIQV9MXSA9IEFMUEhBX0w7Ci0JCW5hbWVzW0lkcy5JRF9BTFBIQV9VXSA9IEFMUEhBX1U7Ci0JCW5hbWVzW0lkcy5JRF9BTVBdID0gQU1QOwotCQluYW1lc1tJZHMuSURfQU5EXSA9IEFORDsKLQkJbmFtZXNbSWRzLklEX0FOR10gPSBBTkc7Ci0JCW5hbWVzW0lkcy5JRF9BUklOR19MXSA9IEFSSU5HX0w7Ci0JCW5hbWVzW0lkcy5JRF9BUklOR19VXSA9IEFSSU5HX1U7Ci0JCW5hbWVzW0lkcy5JRF9BU1lNUF0gPSBBU1lNUDsKLQkJbmFtZXNbSWRzLklEX0FUSUxERV9MXSA9IEFUSUxERV9MOwotCQluYW1lc1tJZHMuSURfQVRJTERFX1VdID0gQVRJTERFX1U7Ci0JCW5hbWVzW0lkcy5JRF9BVU1MX0xdID0gQVVNTF9MOwotCQluYW1lc1tJZHMuSURfQVVNTF9VXSA9IEFVTUxfVTsKLQkJbmFtZXNbSWRzLklEX0JEUVVPXSA9IEJEUVVPOwotCQluYW1lc1tJZHMuSURfQkVUQV9MXSA9IEJFVEFfTDsKLQkJbmFtZXNbSWRzLklEX0JFVEFfVV0gPSBCRVRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9CUlZCQVJdID0gQlJWQkFSOwotCQluYW1lc1tJZHMuSURfQlVMTF0gPSBCVUxMOwotCQluYW1lc1tJZHMuSURfQ0FQXSA9IENBUDsKLQkJbmFtZXNbSWRzLklEX0NDRURJTF9MXSA9IENDRURJTF9MOwotCQluYW1lc1tJZHMuSURfQ0NFRElMX1VdID0gQ0NFRElMX1U7Ci0JCW5hbWVzW0lkcy5JRF9DRURJTF0gPSBDRURJTDsKLQkJbmFtZXNbSWRzLklEX0NFTlRdID0gQ0VOVDsKLQkJbmFtZXNbSWRzLklEX0NISV9MXSA9IENISV9MOwotCQluYW1lc1tJZHMuSURfQ0hJX1VdID0gQ0hJX1U7Ci0JCW5hbWVzW0lkcy5JRF9DSVJDXSA9IENJUkM7Ci0JCW5hbWVzW0lkcy5JRF9DTFVCU10gPSBDTFVCUzsKLQkJbmFtZXNbSWRzLklEX0NPTkddID0gQ09ORzsKLQkJbmFtZXNbSWRzLklEX0NPUFldID0gQ09QWTsKLQkJbmFtZXNbSWRzLklEX0NSQVJSXSA9IENSQVJSOwotCQluYW1lc1tJZHMuSURfQ1VQXSA9IENVUDsKLQkJbmFtZXNbSWRzLklEX0NVUlJFTl0gPSBDVVJSRU47Ci0JCW5hbWVzW0lkcy5JRF9EQUdHRVJfTF0gPSBEQUdHRVJfTDsKLQkJbmFtZXNbSWRzLklEX0RBR0dFUl9VXSA9IERBR0dFUl9VOwotCQluYW1lc1tJZHMuSURfREFSUl9MXSA9IERBUlJfTDsKLQkJbmFtZXNbSWRzLklEX0RBUlJfVV0gPSBEQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9ERUddID0gREVHOwotCQluYW1lc1tJZHMuSURfREVMVEFfTF0gPSBERUxUQV9MOwotCQluYW1lc1tJZHMuSURfREVMVEFfVV0gPSBERUxUQV9VOwotCQluYW1lc1tJZHMuSURfRElBTVNdID0gRElBTVM7Ci0JCW5hbWVzW0lkcy5JRF9ESVZJREVdID0gRElWSURFOwotCQluYW1lc1tJZHMuSURfRUFDVVRFX0xdID0gRUFDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9FQUNVVEVfVV0gPSBFQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX0VDSVJDX0xdID0gRUNJUkNfTDsKLQkJbmFtZXNbSWRzLklEX0VDSVJDX1VdID0gRUNJUkNfVTsKLQkJbmFtZXNbSWRzLklEX0VHUkFWRV9MXSA9IEVHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfRUdSQVZFX1VdID0gRUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9FTVBUWV0gPSBFTVBUWTsKLQkJbmFtZXNbSWRzLklEX0VNU1BdID0gRU1TUDsKLQkJbmFtZXNbSWRzLklEX0VOU1BdID0gRU5TUDsKLQkJbmFtZXNbSWRzLklEX0VQU0lMT05fTF0gPSBFUFNJTE9OX0w7Ci0JCW5hbWVzW0lkcy5JRF9FUFNJTE9OX1VdID0gRVBTSUxPTl9VOwotCQluYW1lc1tJZHMuSURfRVFVSVZdID0gRVFVSVY7Ci0JCW5hbWVzW0lkcy5JRF9FVEFfTF0gPSBFVEFfTDsKLQkJbmFtZXNbSWRzLklEX0VUQV9VXSA9IEVUQV9VOwotCQluYW1lc1tJZHMuSURfRVRIX0xdID0gRVRIX0w7Ci0JCW5hbWVzW0lkcy5JRF9FVEhfVV0gPSBFVEhfVTsKLQkJbmFtZXNbSWRzLklEX0VVTUxfTF0gPSBFVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9FVU1MX1VdID0gRVVNTF9VOwotCQluYW1lc1tJZHMuSURfRVVST10gPSBFVVJPOwotCQluYW1lc1tJZHMuSURfRVhJU1RdID0gRVhJU1Q7Ci0JCW5hbWVzW0lkcy5JRF9GTk9GXSA9IEZOT0Y7Ci0JCW5hbWVzW0lkcy5JRF9GT1JBTExdID0gRk9SQUxMOwotCQluYW1lc1tJZHMuSURfRlJBQzEyXSA9IEZSQUMxMjsKLQkJbmFtZXNbSWRzLklEX0ZSQUMxNF0gPSBGUkFDMTQ7Ci0JCW5hbWVzW0lkcy5JRF9GUkFDMzRdID0gRlJBQzM0OwotCQluYW1lc1tJZHMuSURfRlJBU0xdID0gRlJBU0w7Ci0JCW5hbWVzW0lkcy5JRF9HQU1NQV9MXSA9IEdBTU1BX0w7Ci0JCW5hbWVzW0lkcy5JRF9HQU1NQV9VXSA9IEdBTU1BX1U7Ci0JCW5hbWVzW0lkcy5JRF9HRV0gPSBHRTsKLQkJbmFtZXNbSWRzLklEX0dUXSA9IEdUOwotCQluYW1lc1tJZHMuSURfSEFSUl9MXSA9IEhBUlJfTDsKLQkJbmFtZXNbSWRzLklEX0hBUlJfVV0gPSBIQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9IRUFSVFNdID0gSEVBUlRTOwotCQluYW1lc1tJZHMuSURfSEVMTElQXSA9IEhFTExJUDsKLQkJbmFtZXNbSWRzLklEX0lBQ1VURV9MXSA9IElBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfSUFDVVRFX1VdID0gSUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9JQ0lSQ19MXSA9IElDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9JQ0lSQ19VXSA9IElDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9JRVhDTF0gPSBJRVhDTDsKLQkJbmFtZXNbSWRzLklEX0lHUkFWRV9MXSA9IElHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfSUdSQVZFX1VdID0gSUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9JTUFHRV0gPSBJTUFHRTsKLQkJbmFtZXNbSWRzLklEX0lORklOXSA9IElORklOOwotCQluYW1lc1tJZHMuSURfSU5UXSA9IElOVDsKLQkJbmFtZXNbSWRzLklEX0lPVEFfTF0gPSBJT1RBX0w7Ci0JCW5hbWVzW0lkcy5JRF9JT1RBX1VdID0gSU9UQV9VOwotCQluYW1lc1tJZHMuSURfSVFVRVNUXSA9IElRVUVTVDsKLQkJbmFtZXNbSWRzLklEX0lTSU5dID0gSVNJTjsKLQkJbmFtZXNbSWRzLklEX0lVTUxfTF0gPSBJVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9JVU1MX1VdID0gSVVNTF9VOwotCQluYW1lc1tJZHMuSURfS0FQUEFfTF0gPSBLQVBQQV9MOwotCQluYW1lc1tJZHMuSURfS0FQUEFfVV0gPSBLQVBQQV9VOwotCQluYW1lc1tJZHMuSURfTEFNQkRBX0xdID0gTEFNQkRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9MQU1CREFfVV0gPSBMQU1CREFfVTsKLQkJbmFtZXNbSWRzLklEX0xBTkddID0gTEFORzsKLQkJbmFtZXNbSWRzLklEX0xBUVVPXSA9IExBUVVPOwotCQluYW1lc1tJZHMuSURfTEFSUl9MXSA9IExBUlJfTDsKLQkJbmFtZXNbSWRzLklEX0xBUlJfVV0gPSBMQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9MQ0VJTF0gPSBMQ0VJTDsKLQkJbmFtZXNbSWRzLklEX0xEUVVPXSA9IExEUVVPOwotCQluYW1lc1tJZHMuSURfTEVdID0gTEU7Ci0JCW5hbWVzW0lkcy5JRF9MRkxPT1JdID0gTEZMT09SOwotCQluYW1lc1tJZHMuSURfTE9XQVNUXSA9IExPV0FTVDsKLQkJbmFtZXNbSWRzLklEX0xPWl0gPSBMT1o7Ci0JCW5hbWVzW0lkcy5JRF9MUk1dID0gTFJNOwotCQluYW1lc1tJZHMuSURfTFNBUVVPXSA9IExTQVFVTzsKLQkJbmFtZXNbSWRzLklEX0xTUVVPXSA9IExTUVVPOwotCQluYW1lc1tJZHMuSURfTFRdID0gTFQ7Ci0JCW5hbWVzW0lkcy5JRF9NQUNSXSA9IE1BQ1I7Ci0JCW5hbWVzW0lkcy5JRF9NREFTSF0gPSBNREFTSDsKLQkJbmFtZXNbSWRzLklEX01JQ1JPXSA9IE1JQ1JPOwotCQluYW1lc1tJZHMuSURfTUlERE9UXSA9IE1JRERPVDsKLQkJbmFtZXNbSWRzLklEX01JTlVTXSA9IE1JTlVTOwotCQluYW1lc1tJZHMuSURfTVVfTF0gPSBNVV9MOwotCQluYW1lc1tJZHMuSURfTVVfVV0gPSBNVV9VOwotCQluYW1lc1tJZHMuSURfTkFCTEFdID0gTkFCTEE7Ci0JCW5hbWVzW0lkcy5JRF9OQlNQXSA9IE5CU1A7Ci0JCW5hbWVzW0lkcy5JRF9OREFTSF0gPSBOREFTSDsKLQkJbmFtZXNbSWRzLklEX05FXSA9IE5FOwotCQluYW1lc1tJZHMuSURfTkldID0gTkk7Ci0JCW5hbWVzW0lkcy5JRF9OT1RdID0gTk9UOwotCQluYW1lc1tJZHMuSURfTk9USU5dID0gTk9USU47Ci0JCW5hbWVzW0lkcy5JRF9OU1VCXSA9IE5TVUI7Ci0JCW5hbWVzW0lkcy5JRF9OVElMREVfTF0gPSBOVElMREVfTDsKLQkJbmFtZXNbSWRzLklEX05USUxERV9VXSA9IE5USUxERV9VOwotCQluYW1lc1tJZHMuSURfTlVfTF0gPSBOVV9MOwotCQluYW1lc1tJZHMuSURfTlVfVV0gPSBOVV9VOwotCQluYW1lc1tJZHMuSURfT0FDVVRFX0xdID0gT0FDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9PQUNVVEVfVV0gPSBPQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX09DSVJDX0xdID0gT0NJUkNfTDsKLQkJbmFtZXNbSWRzLklEX09DSVJDX1VdID0gT0NJUkNfVTsKLQkJbmFtZXNbSWRzLklEX09FTElHX0xdID0gT0VMSUdfTDsKLQkJbmFtZXNbSWRzLklEX09FTElHX1VdID0gT0VMSUdfVTsKLQkJbmFtZXNbSWRzLklEX09HUkFWRV9MXSA9IE9HUkFWRV9MOwotCQluYW1lc1tJZHMuSURfT0dSQVZFX1VdID0gT0dSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9PTElORV0gPSBPTElORTsKLQkJbmFtZXNbSWRzLklEX09NRUdBX0xdID0gT01FR0FfTDsKLQkJbmFtZXNbSWRzLklEX09NRUdBX1VdID0gT01FR0FfVTsKLQkJbmFtZXNbSWRzLklEX09NSUNST05fTF0gPSBPTUlDUk9OX0w7Ci0JCW5hbWVzW0lkcy5JRF9PTUlDUk9OX1VdID0gT01JQ1JPTl9VOwotCQluYW1lc1tJZHMuSURfT1BMVVNdID0gT1BMVVM7Ci0JCW5hbWVzW0lkcy5JRF9PUl0gPSBPUjsKLQkJbmFtZXNbSWRzLklEX09SREZdID0gT1JERjsKLQkJbmFtZXNbSWRzLklEX09SRE1dID0gT1JETTsKLQkJbmFtZXNbSWRzLklEX09TTEFTSF9MXSA9IE9TTEFTSF9MOwotCQluYW1lc1tJZHMuSURfT1NMQVNIX1VdID0gT1NMQVNIX1U7Ci0JCW5hbWVzW0lkcy5JRF9PVElMREVfTF0gPSBPVElMREVfTDsKLQkJbmFtZXNbSWRzLklEX09USUxERV9VXSA9IE9USUxERV9VOwotCQluYW1lc1tJZHMuSURfT1RJTUVTXSA9IE9USU1FUzsKLQkJbmFtZXNbSWRzLklEX09VTUxfTF0gPSBPVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9PVU1MX1VdID0gT1VNTF9VOwotCQluYW1lc1tJZHMuSURfUEFSQV0gPSBQQVJBOwotCQluYW1lc1tJZHMuSURfUEFSVF0gPSBQQVJUOwotCQluYW1lc1tJZHMuSURfUEVSTUlMXSA9IFBFUk1JTDsKLQkJbmFtZXNbSWRzLklEX1BFUlBdID0gUEVSUDsKLQkJbmFtZXNbSWRzLklEX1BISV9MXSA9IFBISV9MOwotCQluYW1lc1tJZHMuSURfUEhJX1VdID0gUEhJX1U7Ci0JCW5hbWVzW0lkcy5JRF9QSVZdID0gUElWOwotCQluYW1lc1tJZHMuSURfUElfTF0gPSBQSV9MOwotCQluYW1lc1tJZHMuSURfUElfVV0gPSBQSV9VOwotCQluYW1lc1tJZHMuSURfUExVU01OXSA9IFBMVVNNTjsKLQkJbmFtZXNbSWRzLklEX1BPVU5EXSA9IFBPVU5EOwotCQluYW1lc1tJZHMuSURfUFJJTUVfTF0gPSBQUklNRV9MOwotCQluYW1lc1tJZHMuSURfUFJJTUVfVV0gPSBQUklNRV9VOwotCQluYW1lc1tJZHMuSURfUFJPRF0gPSBQUk9EOwotCQluYW1lc1tJZHMuSURfUFJPUF0gPSBQUk9QOwotCQluYW1lc1tJZHMuSURfUFNJX0xdID0gUFNJX0w7Ci0JCW5hbWVzW0lkcy5JRF9QU0lfVV0gPSBQU0lfVTsKLQkJbmFtZXNbSWRzLklEX1FVT1RdID0gUVVPVDsKLQkJbmFtZXNbSWRzLklEX1JBRElDXSA9IFJBRElDOwotCQluYW1lc1tJZHMuSURfUkFOR10gPSBSQU5HOwotCQluYW1lc1tJZHMuSURfUkFRVU9dID0gUkFRVU87Ci0JCW5hbWVzW0lkcy5JRF9SQVJSX0xdID0gUkFSUl9MOwotCQluYW1lc1tJZHMuSURfUkFSUl9VXSA9IFJBUlJfVTsKLQkJbmFtZXNbSWRzLklEX1JDRUlMXSA9IFJDRUlMOwotCQluYW1lc1tJZHMuSURfUkRRVU9dID0gUkRRVU87Ci0JCW5hbWVzW0lkcy5JRF9SRUFMXSA9IFJFQUw7Ci0JCW5hbWVzW0lkcy5JRF9SRUddID0gUkVHOwotCQluYW1lc1tJZHMuSURfUkZMT09SXSA9IFJGTE9PUjsKLQkJbmFtZXNbSWRzLklEX1JIT19MXSA9IFJIT19MOwotCQluYW1lc1tJZHMuSURfUkhPX1VdID0gUkhPX1U7Ci0JCW5hbWVzW0lkcy5JRF9STE1dID0gUkxNOwotCQluYW1lc1tJZHMuSURfUlNBUVVPXSA9IFJTQVFVTzsKLQkJbmFtZXNbSWRzLklEX1JTUVVPXSA9IFJTUVVPOwotCQluYW1lc1tJZHMuSURfU0JRVU9dID0gU0JRVU87Ci0JCW5hbWVzW0lkcy5JRF9TQ0FST05fTF0gPSBTQ0FST05fTDsKLQkJbmFtZXNbSWRzLklEX1NDQVJPTl9VXSA9IFNDQVJPTl9VOwotCQluYW1lc1tJZHMuSURfU0RPVF0gPSBTRE9UOwotCQluYW1lc1tJZHMuSURfU0VDVF0gPSBTRUNUOwotCQluYW1lc1tJZHMuSURfU0hZXSA9IFNIWTsKLQkJbmFtZXNbSWRzLklEX1NJR01BRl0gPSBTSUdNQUY7Ci0JCW5hbWVzW0lkcy5JRF9TSUdNQV9MXSA9IFNJR01BX0w7Ci0JCW5hbWVzW0lkcy5JRF9TSUdNQV9VXSA9IFNJR01BX1U7Ci0JCW5hbWVzW0lkcy5JRF9TSU1dID0gU0lNOwotCQluYW1lc1tJZHMuSURfU1BBREVTXSA9IFNQQURFUzsKLQkJbmFtZXNbSWRzLklEX1NVQl0gPSBTVUI7Ci0JCW5hbWVzW0lkcy5JRF9TVUJFXSA9IFNVQkU7Ci0JCW5hbWVzW0lkcy5JRF9TVU1dID0gU1VNOwotCQluYW1lc1tJZHMuSURfU1VQXSA9IFNVUDsKLQkJbmFtZXNbSWRzLklEX1NVUDFdID0gU1VQMTsKLQkJbmFtZXNbSWRzLklEX1NVUDJdID0gU1VQMjsKLQkJbmFtZXNbSWRzLklEX1NVUDNdID0gU1VQMzsKLQkJbmFtZXNbSWRzLklEX1NVUEVdID0gU1VQRTsKLQkJbmFtZXNbSWRzLklEX1NaTElHXSA9IFNaTElHOwotCQluYW1lc1tJZHMuSURfVEFVX0xdID0gVEFVX0w7Ci0JCW5hbWVzW0lkcy5JRF9UQVVfVV0gPSBUQVVfVTsKLQkJbmFtZXNbSWRzLklEX1RIRVJFNF0gPSBUSEVSRTQ7Ci0JCW5hbWVzW0lkcy5JRF9USEVUQVNZTV0gPSBUSEVUQVNZTTsKLQkJbmFtZXNbSWRzLklEX1RIRVRBX0xdID0gVEhFVEFfTDsKLQkJbmFtZXNbSWRzLklEX1RIRVRBX1VdID0gVEhFVEFfVTsKLQkJbmFtZXNbSWRzLklEX1RISU5TUF0gPSBUSElOU1A7Ci0JCW5hbWVzW0lkcy5JRF9USE9STl9MXSA9IFRIT1JOX0w7Ci0JCW5hbWVzW0lkcy5JRF9USE9STl9VXSA9IFRIT1JOX1U7Ci0JCW5hbWVzW0lkcy5JRF9USUxERV0gPSBUSUxERTsKLQkJbmFtZXNbSWRzLklEX1RJTUVTXSA9IFRJTUVTOwotCQluYW1lc1tJZHMuSURfVFJBREVdID0gVFJBREU7Ci0JCW5hbWVzW0lkcy5JRF9VQUNVVEVfTF0gPSBVQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX1VBQ1VURV9VXSA9IFVBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfVUFSUl9MXSA9IFVBUlJfTDsKLQkJbmFtZXNbSWRzLklEX1VBUlJfVV0gPSBVQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9VQ0lSQ19MXSA9IFVDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9VQ0lSQ19VXSA9IFVDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9VR1JBVkVfTF0gPSBVR1JBVkVfTDsKLQkJbmFtZXNbSWRzLklEX1VHUkFWRV9VXSA9IFVHUkFWRV9VOwotCQluYW1lc1tJZHMuSURfVU1MXSA9IFVNTDsKLQkJbmFtZXNbSWRzLklEX1VQU0lIXSA9IFVQU0lIOwotCQluYW1lc1tJZHMuSURfVVBTSUxPTl9MXSA9IFVQU0lMT05fTDsKLQkJbmFtZXNbSWRzLklEX1VQU0lMT05fVV0gPSBVUFNJTE9OX1U7Ci0JCW5hbWVzW0lkcy5JRF9VVU1MX0xdID0gVVVNTF9MOwotCQluYW1lc1tJZHMuSURfVVVNTF9VXSA9IFVVTUxfVTsKLQkJbmFtZXNbSWRzLklEX1dFSUVSUF0gPSBXRUlFUlA7Ci0JCW5hbWVzW0lkcy5JRF9YSV9MXSA9IFhJX0w7Ci0JCW5hbWVzW0lkcy5JRF9YSV9VXSA9IFhJX1U7Ci0JCW5hbWVzW0lkcy5JRF9ZQUNVVEVfTF0gPSBZQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX1lBQ1VURV9VXSA9IFlBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfWUVOXSA9IFlFTjsKLQkJbmFtZXNbSWRzLklEX1lVTUxfTF0gPSBZVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9ZVU1MX1VdID0gWVVNTF9VOwotCQluYW1lc1tJZHMuSURfWkVUQV9MXSA9IFpFVEFfTDsKLQkJbmFtZXNbSWRzLklEX1pFVEFfVV0gPSBaRVRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9aV0pdID0gWldKOwotCQluYW1lc1tJZHMuSURfWldOSl0gPSBaV05KOwotCX0KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gdmFsdWVzID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCXZhbHVlcyA9IG5ldyBjaGFyW0lkcy5nZXROdW1PZklkcygpXTsKLQkJdmFsdWVzW0lkcy5JRF9BQUNVVEVfTF0gPSAyMjU7Ci0JCXZhbHVlc1tJZHMuSURfQUFDVVRFX1VdID0gMTkzOwotCQl2YWx1ZXNbSWRzLklEX0FDSVJDX0xdID0gMjI2OwotCQl2YWx1ZXNbSWRzLklEX0FDSVJDX1VdID0gMTk0OwotCQl2YWx1ZXNbSWRzLklEX0FDVVRFXSA9IDE4MDsKLQkJdmFsdWVzW0lkcy5JRF9BRUxJR19MXSA9IDIzMDsKLQkJdmFsdWVzW0lkcy5JRF9BRUxJR19VXSA9IDE5ODsKLQkJdmFsdWVzW0lkcy5JRF9BR1JBVkVfTF0gPSAyMjQ7Ci0JCXZhbHVlc1tJZHMuSURfQUdSQVZFX1VdID0gMTkyOwotCQl2YWx1ZXNbSWRzLklEX0FMRUZTWU1dID0gODUwMTsKLQkJdmFsdWVzW0lkcy5JRF9BTFBIQV9MXSA9IDk0NTsKLQkJdmFsdWVzW0lkcy5JRF9BTFBIQV9VXSA9IDkxMzsKLQkJdmFsdWVzW0lkcy5JRF9BTVBdID0gMzg7Ci0JCXZhbHVlc1tJZHMuSURfQU5EXSA9IDg3NDM7Ci0JCXZhbHVlc1tJZHMuSURfQU5HXSA9IDg3MzY7Ci0JCXZhbHVlc1tJZHMuSURfQVJJTkdfTF0gPSAyMjk7Ci0JCXZhbHVlc1tJZHMuSURfQVJJTkdfVV0gPSAxOTc7Ci0JCXZhbHVlc1tJZHMuSURfQVNZTVBdID0gODc3NjsKLQkJdmFsdWVzW0lkcy5JRF9BVElMREVfTF0gPSAyMjc7Ci0JCXZhbHVlc1tJZHMuSURfQVRJTERFX1VdID0gMTk1OwotCQl2YWx1ZXNbSWRzLklEX0FVTUxfTF0gPSAyMjg7Ci0JCXZhbHVlc1tJZHMuSURfQVVNTF9VXSA9IDE5NjsKLQkJdmFsdWVzW0lkcy5JRF9CRFFVT10gPSA4MjIyOwotCQl2YWx1ZXNbSWRzLklEX0JFVEFfTF0gPSA5NDY7Ci0JCXZhbHVlc1tJZHMuSURfQkVUQV9VXSA9IDkxNDsKLQkJdmFsdWVzW0lkcy5JRF9CUlZCQVJdID0gMTY2OwotCQl2YWx1ZXNbSWRzLklEX0JVTExdID0gODIyNjsKLQkJdmFsdWVzW0lkcy5JRF9DQVBdID0gODc0NTsKLQkJdmFsdWVzW0lkcy5JRF9DQ0VESUxfTF0gPSAyMzE7Ci0JCXZhbHVlc1tJZHMuSURfQ0NFRElMX1VdID0gMTk5OwotCQl2YWx1ZXNbSWRzLklEX0NFRElMXSA9IDE4NDsKLQkJdmFsdWVzW0lkcy5JRF9DRU5UXSA9IDE2MjsKLQkJdmFsdWVzW0lkcy5JRF9DSElfTF0gPSA5Njc7Ci0JCXZhbHVlc1tJZHMuSURfQ0hJX1VdID0gOTM1OwotCQl2YWx1ZXNbSWRzLklEX0NJUkNdID0gNzEwOwotCQl2YWx1ZXNbSWRzLklEX0NMVUJTXSA9IDk4Mjc7Ci0JCXZhbHVlc1tJZHMuSURfQ09OR10gPSA4NzczOwotCQl2YWx1ZXNbSWRzLklEX0NPUFldID0gMTY5OwotCQl2YWx1ZXNbSWRzLklEX0NSQVJSXSA9IDg2Mjk7Ci0JCXZhbHVlc1tJZHMuSURfQ1VQXSA9IDg3NDY7Ci0JCXZhbHVlc1tJZHMuSURfQ1VSUkVOXSA9IDE2NDsKLQkJdmFsdWVzW0lkcy5JRF9EQUdHRVJfTF0gPSA4MjI0OwotCQl2YWx1ZXNbSWRzLklEX0RBR0dFUl9VXSA9IDgyMjU7Ci0JCXZhbHVlc1tJZHMuSURfREFSUl9MXSA9IDg1OTU7Ci0JCXZhbHVlc1tJZHMuSURfREFSUl9VXSA9IDg2NTk7Ci0JCXZhbHVlc1tJZHMuSURfREVHXSA9IDE3NjsKLQkJdmFsdWVzW0lkcy5JRF9ERUxUQV9MXSA9IDk0ODsKLQkJdmFsdWVzW0lkcy5JRF9ERUxUQV9VXSA9IDkxNjsKLQkJdmFsdWVzW0lkcy5JRF9ESUFNU10gPSA5ODMwOwotCQl2YWx1ZXNbSWRzLklEX0RJVklERV0gPSAyNDc7Ci0JCXZhbHVlc1tJZHMuSURfRUFDVVRFX0xdID0gMjMzOwotCQl2YWx1ZXNbSWRzLklEX0VBQ1VURV9VXSA9IDIwMTsKLQkJdmFsdWVzW0lkcy5JRF9FQ0lSQ19MXSA9IDIzNDsKLQkJdmFsdWVzW0lkcy5JRF9FQ0lSQ19VXSA9IDIwMjsKLQkJdmFsdWVzW0lkcy5JRF9FR1JBVkVfTF0gPSAyMzI7Ci0JCXZhbHVlc1tJZHMuSURfRUdSQVZFX1VdID0gMjAwOwotCQl2YWx1ZXNbSWRzLklEX0VNUFRZXSA9IDg3MDk7Ci0JCXZhbHVlc1tJZHMuSURfRU1TUF0gPSA4MTk1OwotCQl2YWx1ZXNbSWRzLklEX0VOU1BdID0gODE5NDsKLQkJdmFsdWVzW0lkcy5JRF9FUFNJTE9OX0xdID0gOTQ5OwotCQl2YWx1ZXNbSWRzLklEX0VQU0lMT05fVV0gPSA5MTc7Ci0JCXZhbHVlc1tJZHMuSURfRVFVSVZdID0gODgwMTsKLQkJdmFsdWVzW0lkcy5JRF9FVEFfTF0gPSA5NTE7Ci0JCXZhbHVlc1tJZHMuSURfRVRBX1VdID0gOTE5OwotCQl2YWx1ZXNbSWRzLklEX0VUSF9MXSA9IDI0MDsKLQkJdmFsdWVzW0lkcy5JRF9FVEhfVV0gPSAyMDg7Ci0JCXZhbHVlc1tJZHMuSURfRVVNTF9MXSA9IDIzNTsKLQkJdmFsdWVzW0lkcy5JRF9FVU1MX1VdID0gMjAzOwotCQl2YWx1ZXNbSWRzLklEX0VVUk9dID0gODM2NDsKLQkJdmFsdWVzW0lkcy5JRF9FWElTVF0gPSA4NzA3OwotCQl2YWx1ZXNbSWRzLklEX0ZOT0ZdID0gNDAyOwotCQl2YWx1ZXNbSWRzLklEX0ZPUkFMTF0gPSA4NzA0OwotCQl2YWx1ZXNbSWRzLklEX0ZSQUMxMl0gPSAxODk7Ci0JCXZhbHVlc1tJZHMuSURfRlJBQzE0XSA9IDE4ODsKLQkJdmFsdWVzW0lkcy5JRF9GUkFDMzRdID0gMTkwOwotCQl2YWx1ZXNbSWRzLklEX0ZSQVNMXSA9IDgyNjA7Ci0JCXZhbHVlc1tJZHMuSURfR0FNTUFfTF0gPSA5NDc7Ci0JCXZhbHVlc1tJZHMuSURfR0FNTUFfVV0gPSA5MTU7Ci0JCXZhbHVlc1tJZHMuSURfR0VdID0gODgwNTsKLQkJdmFsdWVzW0lkcy5JRF9HVF0gPSA2MjsKLQkJdmFsdWVzW0lkcy5JRF9IQVJSX0xdID0gODU5NjsKLQkJdmFsdWVzW0lkcy5JRF9IQVJSX1VdID0gODY2MDsKLQkJdmFsdWVzW0lkcy5JRF9IRUFSVFNdID0gOTgyOTsKLQkJdmFsdWVzW0lkcy5JRF9IRUxMSVBdID0gODIzMDsKLQkJdmFsdWVzW0lkcy5JRF9JQUNVVEVfTF0gPSAyMzc7Ci0JCXZhbHVlc1tJZHMuSURfSUFDVVRFX1VdID0gMjA1OwotCQl2YWx1ZXNbSWRzLklEX0lDSVJDX0xdID0gMjM4OwotCQl2YWx1ZXNbSWRzLklEX0lDSVJDX1VdID0gMjA2OwotCQl2YWx1ZXNbSWRzLklEX0lFWENMXSA9IDE2MTsKLQkJdmFsdWVzW0lkcy5JRF9JR1JBVkVfTF0gPSAyMzY7Ci0JCXZhbHVlc1tJZHMuSURfSUdSQVZFX1VdID0gMjA0OwotCQl2YWx1ZXNbSWRzLklEX0lNQUdFXSA9IDg0NjU7Ci0JCXZhbHVlc1tJZHMuSURfSU5GSU5dID0gODczNDsKLQkJdmFsdWVzW0lkcy5JRF9JTlRdID0gODc0NzsKLQkJdmFsdWVzW0lkcy5JRF9JT1RBX0xdID0gOTUzOwotCQl2YWx1ZXNbSWRzLklEX0lPVEFfVV0gPSA5MjE7Ci0JCXZhbHVlc1tJZHMuSURfSVFVRVNUXSA9IDE5MTsKLQkJdmFsdWVzW0lkcy5JRF9JU0lOXSA9IDg3MTI7Ci0JCXZhbHVlc1tJZHMuSURfSVVNTF9MXSA9IDIzOTsKLQkJdmFsdWVzW0lkcy5JRF9JVU1MX1VdID0gMjA3OwotCQl2YWx1ZXNbSWRzLklEX0tBUFBBX0xdID0gOTU0OwotCQl2YWx1ZXNbSWRzLklEX0tBUFBBX1VdID0gOTIyOwotCQl2YWx1ZXNbSWRzLklEX0xBTUJEQV9MXSA9IDk1NTsKLQkJdmFsdWVzW0lkcy5JRF9MQU1CREFfVV0gPSA5MjM7Ci0JCXZhbHVlc1tJZHMuSURfTEFOR10gPSA5MDAxOwotCQl2YWx1ZXNbSWRzLklEX0xBUVVPXSA9IDE3MTsKLQkJdmFsdWVzW0lkcy5JRF9MQVJSX0xdID0gODU5MjsKLQkJdmFsdWVzW0lkcy5JRF9MQVJSX1VdID0gODY1NjsKLQkJdmFsdWVzW0lkcy5JRF9MQ0VJTF0gPSA4OTY4OwotCQl2YWx1ZXNbSWRzLklEX0xEUVVPXSA9IDgyMjA7Ci0JCXZhbHVlc1tJZHMuSURfTEVdID0gODgwNDsKLQkJdmFsdWVzW0lkcy5JRF9MRkxPT1JdID0gODk3MDsKLQkJdmFsdWVzW0lkcy5JRF9MT1dBU1RdID0gODcyNzsKLQkJdmFsdWVzW0lkcy5JRF9MT1pdID0gOTY3NDsKLQkJdmFsdWVzW0lkcy5JRF9MUk1dID0gODIwNjsKLQkJdmFsdWVzW0lkcy5JRF9MU0FRVU9dID0gODI0OTsKLQkJdmFsdWVzW0lkcy5JRF9MU1FVT10gPSA4MjE2OwotCQl2YWx1ZXNbSWRzLklEX0xUXSA9IDYwOwotCQl2YWx1ZXNbSWRzLklEX01BQ1JdID0gMTc1OwotCQl2YWx1ZXNbSWRzLklEX01EQVNIXSA9IDgyMTI7Ci0JCXZhbHVlc1tJZHMuSURfTUlDUk9dID0gMTgxOwotCQl2YWx1ZXNbSWRzLklEX01JRERPVF0gPSAxODM7Ci0JCXZhbHVlc1tJZHMuSURfTUlOVVNdID0gODcyMjsKLQkJdmFsdWVzW0lkcy5JRF9NVV9MXSA9IDk1NjsKLQkJdmFsdWVzW0lkcy5JRF9NVV9VXSA9IDkyNDsKLQkJdmFsdWVzW0lkcy5JRF9OQUJMQV0gPSA4NzExOwotCQl2YWx1ZXNbSWRzLklEX05CU1BdID0gMTYwOwotCQl2YWx1ZXNbSWRzLklEX05EQVNIXSA9IDgyMTE7Ci0JCXZhbHVlc1tJZHMuSURfTkVdID0gODgwMDsKLQkJdmFsdWVzW0lkcy5JRF9OSV0gPSA4NzE1OwotCQl2YWx1ZXNbSWRzLklEX05PVF0gPSAxNzI7Ci0JCXZhbHVlc1tJZHMuSURfTk9USU5dID0gODcxMzsKLQkJdmFsdWVzW0lkcy5JRF9OU1VCXSA9IDg4MzY7Ci0JCXZhbHVlc1tJZHMuSURfTlRJTERFX0xdID0gMjQxOwotCQl2YWx1ZXNbSWRzLklEX05USUxERV9VXSA9IDIwOTsKLQkJdmFsdWVzW0lkcy5JRF9OVV9MXSA9IDk1NzsKLQkJdmFsdWVzW0lkcy5JRF9OVV9VXSA9IDkyNTsKLQkJdmFsdWVzW0lkcy5JRF9PQUNVVEVfTF0gPSAyNDM7Ci0JCXZhbHVlc1tJZHMuSURfT0FDVVRFX1VdID0gMjExOwotCQl2YWx1ZXNbSWRzLklEX09DSVJDX0xdID0gMjQ0OwotCQl2YWx1ZXNbSWRzLklEX09DSVJDX1VdID0gMjEyOwotCQl2YWx1ZXNbSWRzLklEX09FTElHX0xdID0gMzM5OwotCQl2YWx1ZXNbSWRzLklEX09FTElHX1VdID0gMzM4OwotCQl2YWx1ZXNbSWRzLklEX09HUkFWRV9MXSA9IDI0MjsKLQkJdmFsdWVzW0lkcy5JRF9PR1JBVkVfVV0gPSAyMTA7Ci0JCXZhbHVlc1tJZHMuSURfT0xJTkVdID0gODI1NDsKLQkJdmFsdWVzW0lkcy5JRF9PTUVHQV9MXSA9IDk2OTsKLQkJdmFsdWVzW0lkcy5JRF9PTUVHQV9VXSA9IDkzNzsKLQkJdmFsdWVzW0lkcy5JRF9PTUlDUk9OX0xdID0gOTU5OwotCQl2YWx1ZXNbSWRzLklEX09NSUNST05fVV0gPSA5Mjc7Ci0JCXZhbHVlc1tJZHMuSURfT1BMVVNdID0gODg1MzsKLQkJdmFsdWVzW0lkcy5JRF9PUl0gPSA4NzQ0OwotCQl2YWx1ZXNbSWRzLklEX09SREZdID0gMTcwOwotCQl2YWx1ZXNbSWRzLklEX09SRE1dID0gMTg2OwotCQl2YWx1ZXNbSWRzLklEX09TTEFTSF9MXSA9IDI0ODsKLQkJdmFsdWVzW0lkcy5JRF9PU0xBU0hfVV0gPSAyMTY7Ci0JCXZhbHVlc1tJZHMuSURfT1RJTERFX0xdID0gMjQ1OwotCQl2YWx1ZXNbSWRzLklEX09USUxERV9VXSA9IDIxMzsKLQkJdmFsdWVzW0lkcy5JRF9PVElNRVNdID0gODg1NTsKLQkJdmFsdWVzW0lkcy5JRF9PVU1MX0xdID0gMjQ2OwotCQl2YWx1ZXNbSWRzLklEX09VTUxfVV0gPSAyMTQ7Ci0JCXZhbHVlc1tJZHMuSURfUEFSQV0gPSAxODI7Ci0JCXZhbHVlc1tJZHMuSURfUEFSVF0gPSA4NzA2OwotCQl2YWx1ZXNbSWRzLklEX1BFUk1JTF0gPSA4MjQwOwotCQl2YWx1ZXNbSWRzLklEX1BFUlBdID0gODg2OTsKLQkJdmFsdWVzW0lkcy5JRF9QSElfTF0gPSA5NjY7Ci0JCXZhbHVlc1tJZHMuSURfUEhJX1VdID0gOTM0OwotCQl2YWx1ZXNbSWRzLklEX1BJVl0gPSA5ODI7Ci0JCXZhbHVlc1tJZHMuSURfUElfTF0gPSA5NjA7Ci0JCXZhbHVlc1tJZHMuSURfUElfVV0gPSA5Mjg7Ci0JCXZhbHVlc1tJZHMuSURfUExVU01OXSA9IDE3NzsKLQkJdmFsdWVzW0lkcy5JRF9QT1VORF0gPSAxNjM7Ci0JCXZhbHVlc1tJZHMuSURfUFJJTUVfTF0gPSA4MjQyOwotCQl2YWx1ZXNbSWRzLklEX1BSSU1FX1VdID0gODI0MzsKLQkJdmFsdWVzW0lkcy5JRF9QUk9EXSA9IDg3MTk7Ci0JCXZhbHVlc1tJZHMuSURfUFJPUF0gPSA4NzMzOwotCQl2YWx1ZXNbSWRzLklEX1BTSV9MXSA9IDk2ODsKLQkJdmFsdWVzW0lkcy5JRF9QU0lfVV0gPSA5MzY7Ci0JCXZhbHVlc1tJZHMuSURfUVVPVF0gPSAzNDsKLQkJdmFsdWVzW0lkcy5JRF9SQURJQ10gPSA4NzMwOwotCQl2YWx1ZXNbSWRzLklEX1JBTkddID0gOTAwMjsKLQkJdmFsdWVzW0lkcy5JRF9SQVFVT10gPSAxODc7Ci0JCXZhbHVlc1tJZHMuSURfUkFSUl9MXSA9IDg1OTQ7Ci0JCXZhbHVlc1tJZHMuSURfUkFSUl9VXSA9IDg2NTg7Ci0JCXZhbHVlc1tJZHMuSURfUkNFSUxdID0gODk2OTsKLQkJdmFsdWVzW0lkcy5JRF9SRFFVT10gPSA4MjIxOwotCQl2YWx1ZXNbSWRzLklEX1JFQUxdID0gODQ3NjsKLQkJdmFsdWVzW0lkcy5JRF9SRUddID0gMTc0OwotCQl2YWx1ZXNbSWRzLklEX1JGTE9PUl0gPSA4OTcxOwotCQl2YWx1ZXNbSWRzLklEX1JIT19MXSA9IDk2MTsKLQkJdmFsdWVzW0lkcy5JRF9SSE9fVV0gPSA5Mjk7Ci0JCXZhbHVlc1tJZHMuSURfUkxNXSA9IDgyMDc7Ci0JCXZhbHVlc1tJZHMuSURfUlNBUVVPXSA9IDgyNTA7Ci0JCXZhbHVlc1tJZHMuSURfUlNRVU9dID0gODIxNzsKLQkJdmFsdWVzW0lkcy5JRF9TQlFVT10gPSA4MjE4OwotCQl2YWx1ZXNbSWRzLklEX1NDQVJPTl9MXSA9IDM1MzsKLQkJdmFsdWVzW0lkcy5JRF9TQ0FST05fVV0gPSAzNTI7Ci0JCXZhbHVlc1tJZHMuSURfU0RPVF0gPSA4OTAxOwotCQl2YWx1ZXNbSWRzLklEX1NFQ1RdID0gMTY3OwotCQl2YWx1ZXNbSWRzLklEX1NIWV0gPSAxNzM7Ci0JCXZhbHVlc1tJZHMuSURfU0lHTUFGXSA9IDk2MjsKLQkJdmFsdWVzW0lkcy5JRF9TSUdNQV9MXSA9IDk2MzsKLQkJdmFsdWVzW0lkcy5JRF9TSUdNQV9VXSA9IDkzMTsKLQkJdmFsdWVzW0lkcy5JRF9TSU1dID0gODc2NDsKLQkJdmFsdWVzW0lkcy5JRF9TUEFERVNdID0gOTgyNDsKLQkJdmFsdWVzW0lkcy5JRF9TVUJdID0gODgzNDsKLQkJdmFsdWVzW0lkcy5JRF9TVUJFXSA9IDg4Mzg7Ci0JCXZhbHVlc1tJZHMuSURfU1VNXSA9IDg3MjE7Ci0JCXZhbHVlc1tJZHMuSURfU1VQXSA9IDg4MzU7Ci0JCXZhbHVlc1tJZHMuSURfU1VQMV0gPSAxODU7Ci0JCXZhbHVlc1tJZHMuSURfU1VQMl0gPSAxNzg7Ci0JCXZhbHVlc1tJZHMuSURfU1VQM10gPSAxNzk7Ci0JCXZhbHVlc1tJZHMuSURfU1VQRV0gPSA4ODM5OwotCQl2YWx1ZXNbSWRzLklEX1NaTElHXSA9IDIyMzsKLQkJdmFsdWVzW0lkcy5JRF9UQVVfTF0gPSA5NjQ7Ci0JCXZhbHVlc1tJZHMuSURfVEFVX1VdID0gOTMyOwotCQl2YWx1ZXNbSWRzLklEX1RIRVJFNF0gPSA4NzU2OwotCQl2YWx1ZXNbSWRzLklEX1RIRVRBU1lNXSA9IDk3NzsKLQkJdmFsdWVzW0lkcy5JRF9USEVUQV9MXSA9IDk1MjsKLQkJdmFsdWVzW0lkcy5JRF9USEVUQV9VXSA9IDkyMDsKLQkJdmFsdWVzW0lkcy5JRF9USElOU1BdID0gODIwMTsKLQkJdmFsdWVzW0lkcy5JRF9USE9STl9MXSA9IDI1NDsKLQkJdmFsdWVzW0lkcy5JRF9USE9STl9VXSA9IDIyMjsKLQkJdmFsdWVzW0lkcy5JRF9USUxERV0gPSA3MzI7Ci0JCXZhbHVlc1tJZHMuSURfVElNRVNdID0gMjE1OwotCQl2YWx1ZXNbSWRzLklEX1RSQURFXSA9IDg0ODI7Ci0JCXZhbHVlc1tJZHMuSURfVUFDVVRFX0xdID0gMjUwOwotCQl2YWx1ZXNbSWRzLklEX1VBQ1VURV9VXSA9IDIxODsKLQkJdmFsdWVzW0lkcy5JRF9VQVJSX0xdID0gODU5MzsKLQkJdmFsdWVzW0lkcy5JRF9VQVJSX1VdID0gODY1NzsKLQkJdmFsdWVzW0lkcy5JRF9VQ0lSQ19MXSA9IDI1MTsKLQkJdmFsdWVzW0lkcy5JRF9VQ0lSQ19VXSA9IDIxOTsKLQkJdmFsdWVzW0lkcy5JRF9VR1JBVkVfTF0gPSAyNDk7Ci0JCXZhbHVlc1tJZHMuSURfVUdSQVZFX1VdID0gMjE3OwotCQl2YWx1ZXNbSWRzLklEX1VNTF0gPSAxNjg7Ci0JCXZhbHVlc1tJZHMuSURfVVBTSUhdID0gOTc4OwotCQl2YWx1ZXNbSWRzLklEX1VQU0lMT05fTF0gPSA5NjU7Ci0JCXZhbHVlc1tJZHMuSURfVVBTSUxPTl9VXSA9IDkzMzsKLQkJdmFsdWVzW0lkcy5JRF9VVU1MX0xdID0gMjUyOwotCQl2YWx1ZXNbSWRzLklEX1VVTUxfVV0gPSAyMjA7Ci0JCXZhbHVlc1tJZHMuSURfV0VJRVJQXSA9IDg0NzI7Ci0JCXZhbHVlc1tJZHMuSURfWElfTF0gPSA5NTg7Ci0JCXZhbHVlc1tJZHMuSURfWElfVV0gPSA5MjY7Ci0JCXZhbHVlc1tJZHMuSURfWUFDVVRFX0xdID0gMjUzOwotCQl2YWx1ZXNbSWRzLklEX1lBQ1VURV9VXSA9IDIyMTsKLQkJdmFsdWVzW0lkcy5JRF9ZRU5dID0gMTY1OwotCQl2YWx1ZXNbSWRzLklEX1lVTUxfTF0gPSAyNTU7Ci0JCXZhbHVlc1tJZHMuSURfWVVNTF9VXSA9IDM3NjsKLQkJdmFsdWVzW0lkcy5JRF9aRVRBX0xdID0gOTUwOwotCQl2YWx1ZXNbSWRzLklEX1pFVEFfVV0gPSA5MTg7Ci0JCXZhbHVlc1tJZHMuSURfWldKXSA9IDgyMDU7Ci0JCXZhbHVlc1tJZHMuSURfWldOSl0gPSA4MjA0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbnRpdHlDb2xsZWN0aW9uKCkgewotCQlzdXBlcihuYW1lcywgU1RSSUNUX0NBU0UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBlbnRpdHkgZGVjbGFyYXRpb24uCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBhdHRyTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBjcmVhdGUoU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJaW50IGlkID0gZ2V0SUQoZW50aXR5TmFtZSk7Ci0JCWlmIChpZCA9PSBJRF9VTktOT1dOKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHZhbHVlID0gU3RyaW5nLnZhbHVlT2YodmFsdWVzW2lkXSk7Ci0JCUhUTUxFbnRpdHlEZWNsSW1wbCBkZWMgPSBuZXcgSFRNTEVudGl0eURlY2xJbXBsKGVudGl0eU5hbWUsIHZhbHVlKTsKLQotCQlyZXR1cm4gZGVjOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEF0dHJEZWNsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQXR0ckRlY2xJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YWIyZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQXR0ckRlY2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBjbGFzcyBvZiB7QGxpbmsgPGNvZGU+SFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uPC9jb2RlPn0gaW50ZXJmYWNlLjxicj4KLSAqLwotY2xhc3MgSFRNTEF0dHJEZWNsSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gewotCi0JcHJpdmF0ZSBIVE1MQ01EYXRhVHlwZUltcGwgdHlwZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgdXNhZ2UgPSAwOwotCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxBdHRyRGVjbEltcGwoU3RyaW5nIGF0dHJOYW1lLCBIVE1MQ01EYXRhVHlwZUltcGwgdmFsdWVUeXBlLCBpbnQgdmFsdWVVc2FnZSkgewotCQlzdXBlcihhdHRyTmFtZSk7Ci0JCXRoaXMudHlwZSA9IHZhbHVlVHlwZTsKLQotCQlzd2l0Y2ggKHZhbHVlVXNhZ2UpIHsKLQkJCWNhc2UgT1BUSU9OQUwgOgotCQkJY2FzZSBSRVFVSVJFRCA6Ci0JCQljYXNlIEZJWEVEIDoKLQkJCWNhc2UgUFJPSElCSVRFRCA6Ci0JCQkJdGhpcy51c2FnZSA9IHZhbHVlVXNhZ2U7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQkvLyBzaG91bGQgd2Fybi4uLgotCQkJCXRoaXMudXNhZ2UgPSBPUFRJT05BTDsgLy8gZmFsbCBiYWNrCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJOYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIENNRGF0YVR5cGUKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgaW4gc3VwZXJjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlpZiAodHlwZS5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgIT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHR5cGUuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgaW4gc3VwZXJjbGFzcwotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbnVtQXR0cigpIHsKLQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKEFycmF5cy5hc0xpc3QodHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkpKTsKLQkJcmV0dXJuIHYuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgR1JPVVAsIEVOVElUWV9ERUNMQVJBVElPTi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VXNhZ2UoKSB7Ci0JCXJldHVybiB1c2FnZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gc3VwZXIuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxDTURhdGFUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQ01EYXRhVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzNjZmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxDTURhdGFUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLQotLyoqCi0gKi8KLWNsYXNzIEhUTUxDTURhdGFUeXBlSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MQ01EYXRhVHlwZSB7Ci0KLQlwcml2YXRlIGludCBpbXBsaWVkVmFsdWVLaW5kID0gSU1QTElFRF9WQUxVRV9OT05FOwotCXByaXZhdGUgU3RyaW5nIGltcGxpZWRWYWx1ZSA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gZW1wdHlBcnJheSA9IG5ldyBTdHJpbmdbMF07Ci0JcHJpdmF0ZSBTdHJpbmdbXSBlbnVtVmFsdWVzID0gZW1wdHlBcnJheTsKLQlwcml2YXRlIFN0cmluZyBpbnN0YW5jZVZhbHVlID0gbnVsbDsKLQotCS8qKgotCSAqIEhUTUxDTURhdGFUeXBlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBubSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxDTURhdGFUeXBlSW1wbChTdHJpbmcgdHlwZU5hbWUpIHsKLQkJc3VwZXIodHlwZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEhUTUxDTURhdGFUeXBlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBubSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxDTURhdGFUeXBlSW1wbChTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN1cGVyKHR5cGVOYW1lKTsKLQkJdGhpcy5pbnN0YW5jZVZhbHVlID0gaW5zdGFuY2VWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUeXBlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzdWl0YWJsZSBkZWZhdWx0IHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgZGF0YSB0eXBlIGlzIGNyZWF0ZWQuCi0JICogVGhpcyByZXR1cm5zIG51bGwgb2YgYSBzdWl0YWJsZSBkZWZhdWx0IGlzIG5vdCBhdmFpbGFibGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUluc3RhbmNlVmFsdWUoKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JICoKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpIHsKLQkJcmV0dXJuIGVudW1WYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nICAKLQkgKgotCSAqIFJldHVybnMgdGhlIGltcGxpZWQgdmFsdWUgb3IgbnVsbCBpZiBub25lIGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEltcGxpZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIGltcGxpZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRJbXBsaWVkVmFsdWVLaW5kIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogSU1QTElFRF9WQUxVRV9OT05FLCBJTVBMSUVEX1ZBTFVFX0ZJWEVELCBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQuCi0JICovCi0JcHVibGljIGludCBnZXRJbXBsaWVkVmFsdWVLaW5kKCkgewotCQlyZXR1cm4gaW1wbGllZFZhbHVlS2luZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5EQVRBX1RZUEU7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRFbnVtVmFsdWVzKFN0cmluZ1tdIHZhbHVlcykgewotCQllbnVtVmFsdWVzID0gbmV3IFN0cmluZ1t2YWx1ZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWVudW1WYWx1ZXNbaV0gPSB2YWx1ZXNbaV07Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwYWNrYWdlIHNjb3BlLgotCSAqLwotCXZvaWQgc2V0SW1wbGllZFZhbHVlKGludCBraW5kLCBTdHJpbmcgdmFsdWUpIHsKLQkJc3dpdGNoIChraW5kKSB7Ci0JCQljYXNlIElNUExJRURfVkFMVUVfRklYRUQgOgotCQkJY2FzZSBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQgOgotCQkJCWltcGxpZWRWYWx1ZUtpbmQgPSBraW5kOwotCQkJCWltcGxpZWRWYWx1ZSA9IHZhbHVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJTVBMSUVEX1ZBTFVFX05PTkUgOgotCQkJZGVmYXVsdCA6Ci0JCQkJaW1wbGllZFZhbHVlS2luZCA9IElNUExJRURfVkFMVUVfTk9ORTsKLQkJCQlpbXBsaWVkVmFsdWUgPSBudWxsOyAvLyBtYXliZSBhIG51bGwgc3RyaW5nPwotCQkJCWJyZWFrOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQ01Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxDTU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5NGIyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxDTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0vKioKLSAqIEluIEhUTUwgRG9jdW1lbnRzLCBuYW1lIGFuZCB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUvZWxlbWVudC9lbnRpdHkKLSAqIHNob3VsZCBiZSB0cmVhdGVkIGlnbm9yaW5nIHRoZWlycyBjYXNlLiAgSG93ZXZlciwgaW4gWE1MIGRvY3VtZW50cywKLSAqIHRoZXkgc2hvdWxkIGJlIGRpc3Rpbmd1aXNoZWQgd2l0aCBzZW5zaXRpdmVuZXNzIG9mIHRoZWlyIGNhc2UuCi0gKiBDTU5vZGUgaXMgYmFzaWNhbGx5IGRlc2lnbmVkIHRvIHJlcHJlc2VudCBEVERzIG9yIFNjaGVtYXMgZm9yIFhNTAotICogZG9jdW1lbnRzLiAgU28sIGl0IGRvZXNuJ3QgaGF2ZSBpbnRlcmZhY2VzIHRvIHJldHJpZXZlIHN1Y2ggaW5mb3JtYXRpb24uCi0gKiBIb3dldmVyLCBkZWNsYXJhdGlvbnMgaW4gdGhlIEhUTUwgQ00gc2hvdWxkIHByb3ZpZGUgc3VjaCBpbmZvcm1hdGlvbi4KLSAqIFRoaXMgaW50ZXJtZWRpYXRlIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHdoZXRoZXIgaWdub3JlIGNhc2VzCi0gKiBvciBub3QuPGJyPgotICovCi1pbnRlcmZhY2UgSFRNTENNTm9kZSBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlIHsKLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4sIGlmIGRlY2xhcmF0aW9uIGlzIGZvciBIVE1MIGF0dHJpYnV0ZS9lbGVtZW50L2VudGl0eS4KLQkgKiBPdGhlcndpc2UsIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gc2hvdWxkSWdub3JlQ2FzZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MRWxlbURlY2xJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxFbGVtRGVjbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwMzUyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxFbGVtRGVjbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTFByb3BlcnR5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYWxsIEhlZD8/Pz8gY2xhc3Nlcy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSFRNTEVsZW1EZWNsSW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBIVE1MRWxlbWVudERlY2xhcmF0aW9uLCBIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiB7Ci0KLQkvLyBEVEQKLQlwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGF0dHJpYnV0ZXMgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9FTVBUWTsKLQkvKiogTmV2ZXIgYWNjZXNzIHRoaXMgZmllbGQgZGlyZWN0bHkuICBJbnN0ZWFkLCB1c2UgZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uIG1ldGhvZC4gKi8KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIENNR3JvdXBJbXBsIGluY2x1c2lvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIENNR3JvdXBJbXBsIGV4Y2x1c2lvbiA9IG51bGw7Ci0JLy8gYWR2YW5jZWQgaW5mb3JtYXRpb24KLQlwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXAgcHJvaGliaXRlZEFuY2VzdG9ycyA9IG51bGw7Ci0JcHJvdGVjdGVkIGludCBjb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfTk9ORTsKLQlwcm90ZWN0ZWQgaW50IGZvcm1hdFR5cGUgPSBGT1JNQVRfSFRNTDsKLQlwcm90ZWN0ZWQgaW50IGxheW91dFR5cGUgPSBMQVlPVVRfTk9ORTsKLQlwcm90ZWN0ZWQgaW50IG9taXRUeXBlID0gT01JVF9OT05FOwotCXByb3RlY3RlZCBib29sZWFuIGtlZXBTcGFjZXMgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbmRlbnRDaGlsZCA9IGZhbHNlOwotCXByb3RlY3RlZCBFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIEF0dHJpYnV0ZUNvbGxlY3Rpb24gYXR0cmlidXRlQ29sbGVjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBDTU5hbWVkTm9kZU1hcCBFTVBUWV9NQVAgPSBuZXcgQ01OYW1lZE5vZGVNYXAoKSB7Ci0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJCXJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJCX0KLQkJCX07Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogSFRNTEVsZW1EZWNsSW1wbCBjb25zdHJ1Y3Rvci4KLQkgKiBJbiB0aGUgSFRNTCBEVEQsIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gaGFzIG5vIHNwZWNpZmljYXRpb24KLQkgKiBmb3IgaXRzIG9jY3VycmVuY2UuICBPY2N1cnJlbmNlIGlzIHNwZWNpZmVkIGluIGNvbnRlbnQgbW9kZWwsIGxpa2UKLQkgKiA8Y29kZT4oTEkpKzwvY29kZT4uICBUbyBhdm9pZCBjb25mdXNpb24gKGFuZCBjb21wbGV4aXR5KSwKLQkgKiBvY2N1cnJlbmNlIG9mIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgYWx3YXlzIDEgKGl0IG1lYW5zLCBtaW4gPSAxIGFuZAotCSAqIG1heCA9IDEpLiAgSW5zdGVhZCwgb2NjdXJyZW5jZSBvZiBDTUdyb3VwIHJlcHJlc2VudHMgYWN0dWFsIG9jY3VycmVuY2UKLQkgKiBvZiB0aGUgY29udGVudC4KLQkgKiA8YnI+Ci0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBIVE1MRWxlbURlY2xJbXBsKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgMSwgMSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbiA9IGNvbGxlY3Rpb24uZ2V0QXR0cmlidXRlQ29sbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOwotCi0JcHJpdmF0ZSBDb21wbGV4VHlwZURlZmluaXRpb24gY3JlYXRlQ29tcGxleFR5cGVEZWZpbml0aW9uKCkgewotCQlpZiAodHlwZURlZmluaXRpb25OYW1lLmVxdWFscyhDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0NEQVRBKSB8fCB0eXBlRGVmaW5pdGlvbk5hbWUuZXF1YWxzKENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRU1QVFkpIHx8IHR5cGVEZWZpbml0aW9uTmFtZS5lcXVhbHMoQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9QQ0RBVEEpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBmYWN0b3J5ID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhdGFsIGVycm9yLgotCi0JCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBmYWN0b3J5LmNyZWF0ZVR5cGVEZWZpbml0aW9uKHR5cGVEZWZpbml0aW9uTmFtZSwgZWxlbWVudENvbGxlY3Rpb24pOwotCQlyZXR1cm4gZGVmOwotCX0KLQotCS8qKgotCSAqIEdldCBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCk7Ci0JCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOyAvLyBmYWlsIHRvIGNyZWF0ZQotCQl9Ci0KLQkJQ01Ob2RlIGNtbm9kZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJaWYgKGNtbm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAoSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGU7IC8vIGFscmVhZHkgZXhpc3RzLgotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQljcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKTsgLy8gbGF6eSBldmFsLgotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYW4gaW5zdGFuY2Ugb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICovCi0JcHJpdmF0ZSBDb21wbGV4VHlwZURlZmluaXRpb24gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCkgewotCQlpZiAodHlwZURlZmluaXRpb24gPT0gbnVsbCkKLQkJCXR5cGVEZWZpbml0aW9uID0gY3JlYXRlQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0JCXJldHVybiB0eXBlRGVmaW5pdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50Ljxicj4KLQkgKiBFbGVtZW50IGRlY2xhcmF0aW9ucyB3aGljaCB0eXBlIGlzIEVNUFRZIG9yIENEQVRBIChtYXliZSBQQ0RBVEEpCi0JICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBhbHdheXMgcmV0dXJuIG51bGwuCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyB0cmllcyB0byBjcmVhdGUgYSBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbgotCSAqIGluc3RhbmNlIGFuZCBhY2Nlc3MgdG8gaXQuCi0JICogPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOyAvLyBsYXp5IGV2YWwuCi0JCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldENvbnRlbnQoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCB0eXBlLjxicj4KLQkgKiBFbGVtZW50IGRlY2xhcmF0aW9ucyB3aGljaCB0eXBlIGlzIEVNUFRZIG9yIENEQVRBIChtYXliZSBQQ0RBVEEpCi0JICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgdHlwZS4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHRyaWVzIHRvIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uCi0JICogaW5zdGFuY2UgYW5kIGFjY2VzcyB0byBpdC4KLQkgKiA8YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOyAvLyBsYXp5IGV2YWwuCi0JCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldENvbnRlbnRUeXBlKCkgOiBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24jZ2V0Q29ycmVjdGlvblR5cGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvcnJlY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gY29ycmVjdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogSFRNTCBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZGF0YSB0eXBlLiAgU28sIHRoaXMgbWV0aG9kIGFsd2F5cwotCSAqIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTURhdGFUeXBlIGdldERhdGFUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogQWxtb3N0IGVsZW1lbnRzIGRvbid0IGhhdmUgYSBleGNsdXNpb24uCi0JICogT25seSBjbGFzc2VzIHRob3NlIGhhdmUgZXhjbHVzaW9uIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBmb3JtYXQgdHlwZSBpcyA8Y29kZT5GT1JNQVRfSFRNTDwvY29kZT4uPGJyPgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Rm9ybWF0VHlwZSgpIHsKLQkJcmV0dXJuIGZvcm1hdFR5cGU7Ci0JfQotCi0JLyoqCi0JICogSW5jbHVzaW9uLgotCSAqIEFsbW9zdCBlbGVtZW50cyBkb24ndCBoYXZlIGEgaW5jbHVzaW9uLgotCSAqIE9ubHkgY2xhc3NlcyB0aG9zZSBoYXZlIGluY2x1c2lvbiBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRJbmNsdXNpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGF5b3V0VHlwZSgpIHsKLQkJcmV0dXJuIGxheW91dFR5cGU7Ci0JfQotCi0JLyoqCi0JICogTGluZSBicmVhayBoaW50IGlzIHN0cm9uZ2x5IHJlbGF0ZWQgdG8gbGF5b3V0IHR5cGUuCi0JICogSW5kZWVkLCBpbiB0aGUgQysrRE9NLCBpdCBpcyBkZXRlcm1pbmVkIGZyb20gbGF5b3V0IHR5cGUgb25seS4KLQkgKiBTbywgdGhpcyBpbXBsZW1lbnRhdGlvbiwgYXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIGFsbCBkZWNsYXJhdGlvbnMsCi0JICogYWxzbyBkZXRlcm1pbmVzIGZyb20gbGF5b3V0IHR5cGUgb25seS48YnI+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVCcmVha0hpbnQoKSB7Ci0JCXN3aXRjaCAoZ2V0TGF5b3V0VHlwZSgpKSB7Ci0JCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0JMT0NLIDoKLQkJCQlyZXR1cm4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19CRUZPUkVfU1RBUlRfQU5EX0FGVEVSX0VORDsKLQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQlJFQUsgOgotCQkJCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0FGVEVSX1NUQVJUOwotCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU4gOgotCQkJCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfTk9ORTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vIEhUTUwgZWxlbWVudCBoYXMgbG9jYWwgZWxlbWVudHMuICBTbywgdGhpcyBtZXRob2QgYWx3YXlzCi0JICogcmV0dXJucyBhbiBlbXB0eSBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCXJldHVybiBFTVBUWV9NQVA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9taXRUeXBlKCkgewotCQlyZXR1cm4gb21pdFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCXJldHVybiBFTVBUWV9NQVA7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5DT05URU5UX0hJTlQpKSB7Ci0JCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0JCQlyZXR1cm4gKGRlZiAhPSBudWxsKTsKLQkJfQotCQllbHNlIHsKLQkJCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5nZXRQcm92aWRlcihwcm9wZXJ0eU5hbWUpOwotCQkJaWYgKHBwID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHBwLnN1cHBvcnRzKHRoaXMpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkNPTlRFTlRfSElOVCkpIHsKLQkJCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBnZXRDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLQkJCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldFByaW1hcnlDYW5kaWRhdGUoKSA6IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQcm9wZXJ0eVByb3ZpZGVyIHBwID0gUHJvcGVydHlQcm92aWRlckZhY3RvcnkuZ2V0UHJvdmlkZXIocHJvcGVydHlOYW1lKTsKLQkJCWlmIChwcCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIHBwLmdldCh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBlbGVtZW50IG5hbWVzIHdoaWNoIHRlcm1pbmF0ZXMgdGhpcyBlbGVtZW50Ljxicj4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRydWUgd2hlbiB0aGUgZWxlbWVudCBpcyBhIEpTUCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSlNQKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW4gc29tZSBlbGVtZW50cywgc3VjaCBhcyBBUFBMRVQsIGEgc291cmNlIGdlbmVyYXRvciBzaG91bGQgaW5kZW50IGNoaWxkCi0JICogZWxlbWVudHMgdGhhdCB0aGVpciBwYXJlbnRzLiAgVGhhdCBpcywgYSBzb3VyY2UgZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZQotCSAqIHNvdXJjZSAgb2YgQVBQTEVUIGFuZCBQQVJBTVMgbGlrZSB0aGlzOgotCSAqIDxQUkU+Ci0JICogICAmbHQ7QVBQTEVUIC4uLiZndDsKLQkgKiAgICAgJmx0O1BBUkFNIC4uLiAmZ3Q7Ci0JICogICAgICZsdDtQQVJBTSAuLi4gJmd0OwotCSAqICAgJmx0Oy9BUFBMRVQmZ3Q7Ci0JICogPFBSRT4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpIHsKLQkJcmV0dXJuIGluZGVudENoaWxkOwotCX0KLQotCS8qKgotCSAqIE1vc3Qgb2YgZWxlbWVudHMgY2FuIGNvbXBhY3Qgc3BhY2VzIGluIHRoZWlyIGNoaWxkIHRleHQgbm9kZXMuCi0JICogU29tZSBzcGVjaWFsIGVsZW1lbnRzIHNob3VsZCBrZWVwIHRoZW0gaW4gdGhlaXIgc291cmNlLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZEtlZXBTcGFjZXMoKSB7Ci0JCXJldHVybiBrZWVwU3BhY2VzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFRlcm1pbmF0ZUF0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gbmV4dEVsZW1lbnQpIHsKLQkJSXRlcmF0b3IgaSA9IGdldFRlcm1pbmF0b3JzKCk7Ci0JCWlmIChpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBuZXh0TmFtZSA9IG5leHRFbGVtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJaWYgKG5leHROYW1lLmVxdWFscyhpLm5leHQoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEVudGl0eURlY2xJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxFbnRpdHlEZWNsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTQ3YjAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEVudGl0eURlY2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRW50aXR5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLQotLyoqCi0gKi8KLWNsYXNzIEhUTUxFbnRpdHlEZWNsSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MRW50aXR5RGVjbGFyYXRpb24gewotCi0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlID0gbnVsbDsKLQotCS8qKgotCSAqIENNRW50aXR5RGVjbEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gZW50aXR5TmFtZSBqYXZhLmxhbmcuU3RyaW5nOyBFbnRpdHkgbmFtZS4KLQkgKiBAcGFyYW0gZW50aXR5VmFsdWUgamF2YS5sYW5nLlN0cmluZzsgVmFsdWUgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBIVE1MRW50aXR5RGVjbEltcGwoU3RyaW5nIGVudGl0eU5hbWUsIFN0cmluZyBlbnRpdHlWYWx1ZSkgewotCQlzdXBlcihlbnRpdHlOYW1lKTsKLQkJdmFsdWUgPSBlbnRpdHlWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IENNTm9kZSB0eXBlLjxicj4KLQkgKiBAcmV0dXJuIGludDsgQWx3YXlzIHJldHVybiBFTlRJVFlfREVDTEFSQVRJT04uCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5FTlRJVFlfREVDTEFSQVRJT047Ci0JfQotCi0JLyoqCi0JICogZ2V0VmFsdWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBzdXBlci5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEVudGl0aWVzIGluIEhUTUwgZG9jdW1lbnRzIGFyZSBhbHdheXMgdHJlYXRlZCB3aXRoIGlnbm9yaW5nIGNhc2VzLgotCSAqIEJlY2F1c2Ugbm8gc3BlY2lhbCBlbnRpdGllcyBhcmUgZGVmaW5lZCBpbiBKU1AgMS4wLCB0aGlzIG1ldGhvZAotCSAqIGNhbiBhbHdheXMgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ljxicj4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjAzYzM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBBLgotICovCi1maW5hbCBjbGFzcyBIZWRBIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRBKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSwgY29sbGVjdGlvbik7Ci0JCS8vIENPUlJFQ1RfRU1QVFkgLSBHUk9VUF9DT01QQUNUCi0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGNoYXJzZXQgJUNoYXJzZXQ7ICNJTVBMSUVEKQotCSAqICh0eXBlICVDb250ZW50VHlwZTsgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKGhyZWYgJVVSSTsgI0lNUExJRUQpCi0JICogKGhyZWZsYW5nICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEKQotCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkgKiAocmVsICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCSAqIChyZXYgJUxpbmtUeXBlczsgI0lNUExJRUQpCi0JICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAoZGlyZWN0a2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChzaGFwZSAlU2hhcGU7IHJlY3QpCi0JICogKGNvb3JkcyAlQ29vcmRzOyAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRix9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+QTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+QTwvY29kZT4gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJQ01Ob2RlIGEgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSk7Ci0JCWlmIChhICE9IG51bGwpCi0JCQlleGNsdXNpb24uYXBwZW5kQ2hpbGQoYSk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEsfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRBRERSRVNTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEFERFJFU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhNzJmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEFERFJFU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIEFERFJFU1MuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEFERFJFU1MgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRBRERSRVNTKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQUREUkVTUywgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQUREUkVTUzsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQkFTRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCQVNFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzM2FiZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCQVNFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBCQVNFLgotICovCi1maW5hbCBjbGFzcyBIZWRCQVNFIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJBU0UoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFLCBjb2xsZWN0aW9uKTsKLQkJLy8gTEFZT1VUX0hJRERFTi4KLQkJLy8gQmVjYXVzZSwgQkFTRSBpcyBHUk9VUF9ISURERU4gaW4gdGhlIEMrK0RPTS9EVERQYXJzZXIuY3BwLgotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBCQVNFLgotCSAqIChocmVmICVVUkk7ICNJTVBMSUVEKQotCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9IUkVGLH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQkxPQ0tRVU9URS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCTE9DS1FVT1RFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZWY5N2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCTE9DS1FVT1RFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBCTE9DS1FVT1RFLgotICovCi1maW5hbCBjbGFzcyBIZWRCTE9DS1FVT1RFIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQkxPQ0tRVU9URShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJMT0NLUVVPVEUsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChjaXRlICVVUkk7ICNJTVBMSUVEKSAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQk9EWS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCT0RZLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ODNjNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCT0RZLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogQk9EWS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQk9EWSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWSwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQk9EWShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFksIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfQk9USDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJWJvZHljb2xvcnM7Ci0JICogKG9ubG9hZCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob251bmxvYWQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JICogKG1hcmdpbndpZHRoICVQaXhlbHM7ICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqIChtYXJnaW5oZWlnaHQgJVBpeGVsczsgI0lNUExJRUQpIC4uIEQyMDU1MTQKLQkgKiAodG9wbWFyZ2luLCBDREFUQSwgI0lNUExJRUQpIC4uLi4uLiBEMjA1NTE0Ci0JICogKGJvdHRvbW1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqIChsZWZ0bWFyZ2luLCBDREFUQSwgI0lNUExJRUQpIC4uLi4uIEQyMDU1MTQKLQkgKiAocmlnaHRtYXJnaW4sIENEQVRBLCAjSU1QTElFRCkgLi4uLiBEMjA1NTE0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVib2R5Y29sb3JzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEJvZHljb2xvcnMoYXR0cmlidXRlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBCT0RZIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWMxNmY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQlIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLQotCi0KLS8qKgotICogQlIuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEJSIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJSKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlIsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfQlJFQUsuCi0JCS8vIEJlY2F1c2UsIEJSIGlzIEdST1VQX0JSRUFLIGluIHRoZSBDKytET00vRFREUGFyc2VyLmNwcC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CUkVBSzsKLQl9Ci0KLQkvKioKLQkgKiBCUi4KLQkgKiAlY29yZWF0dHJzOwotCSAqIChjbGVhciAobGVmdCB8IGFsbCB8IHJpZ2h0IHwgbm9uZSkgbm9uZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQkJLy8gY2xlYXIKLQkJSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9uKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DTEVBUik7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQ0xFQVIsIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQ0VOVEVSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZENFTlRFUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjkzOTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQ0VOVEVSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBDRU5URVIuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZENFTlRFUiBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZENFTlRFUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNFTlRFUiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRERC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRERC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDcwZTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkREQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBERC4KLSAqLwotZmluYWwgY2xhc3MgSGVkREQgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRULCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkREQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERCwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORF9ERUZBVUxUOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBERCBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRElWLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERJVi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTJkNzk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRElWLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBESVYuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZERJViBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZERJVihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJViwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVhbGlnbjsKLQkgKiAlcmVzZXJ2ZWQ7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVhbGlnbjsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvclBhcmFncmFwaCgpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQkJLy8gJXJlc2VydmVkOyAuLi4gZW1wdHkKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkREwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkREwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc0NmJiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBETC4KLSAqLwotZmluYWwgY2xhc3MgSGVkREwgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRETChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRMLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9ERUZJTklUSU9OX0xJU1Q7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhcnJheXM7Ci0JICogKGNvbXBhY3QgKGNvbXBhY3QpICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWREVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWREVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzNkODc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRFQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBEVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkRFQgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWREVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRULCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIERUIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRFbXB0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRFbXB0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmRlNmUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRW1wdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIEVNUFRZIHR5cGUgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZEVtcHR5IGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRW1wdHkoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9FTVBUWTsKLQkJLy8gRU1QVFkgdHlwZSBoYXMgbm8gZW5kIHRhZy4KLQkJb21pdFR5cGUgPSBPTUlUX0VORF9NVVNUOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQuPGJyPgotCSAqIEVNUFRZIHR5cGUgYWx3YXlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPGJyPgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQgdHlwZS48YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRk9STS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRGT1JNLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MGQ2MWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRGT1JNLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEZPUk0uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEZPUk0gZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRGT1JNKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChhY3Rpb24gJVVSSTsgI1JFUVVJUkVEKQotCSAqIChtZXRob2QgKEdFVHxQT1NUKSBHRVQpCi0JICogKGVuY3R5cGUgJUNvbnRlbnRUeXBlOyAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKLQkgKiAoYWNjZXB0ICVDb250ZW50VHlwZXM7ICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChvbnN1Ym1pdCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25yZXNldCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICogKGFjY2VwdC1jaGFyc2V0ICVDaGFyc2V0czsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FDVElPTiwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX01FVEhPRCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0VOQ1RZUEUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5GT1JNPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT5GT1JNPC9jb2RlPiBpdHNlbGYuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZmF0YWwKLQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlDTU5vZGUgZm9ybSA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNKTsKLQkJaWYgKGZvcm0gIT0gbnVsbCkKLQkJCWV4Y2x1c2lvbi5hcHBlbmRDaGlsZChmb3JtKTsKLQotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRGbG93Q29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEZsb3dDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0ODQxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEZsb3dDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgKCVmbG93OykqIGNvbnRhaW5lcnMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZEZsb3dDb250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRGbG93Q29udGFpbmVyKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRkxPV19DT05UQUlORVI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRIRUFELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhFQUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlZjZmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhFQUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBIVE1MLgotICovCi1maW5hbCBjbGFzcyBIZWRIRUFEIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFELCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRIRUFEKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSEVBRDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JCW9taXRUeXBlID0gT01JVF9CT1RIOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbGwgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSBpbiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHN1cGVyIGNsYXNzLgotCSAqIFRoZSA8Y29kZT5IRUFEPC9jb2RlPiBlbGVtZW50IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKLQkgKiA8dGFibGU+Ci0JICogPHRib2R5PgotCSAqICAgPHRyPgotCSAqICAgICA8dGg+TkFNRTwvdGg+PHRoPlRZUEU8L3RoPjx0aD5VU0FHRTwvdGg+PHRoPkRFRkFVTFQgKElOSVRJQUwpIFZBTFVFPC90aD48dGg+TUVNTzwvdGg+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+JWkxOG47PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+cHJvZmlsZTwvdGQ+PHRkPlVSSTwvdGQ+PHRkPiNJTVBMSUVEPC90ZD48dGQ+Ti9BPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqIDwvdGJvZHk+Ci0JICogPC90YWJsZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVpMThuOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEkxOG4oYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogSEVBRCBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSFIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSFIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMyZDA5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBIUi4KLSAqLwotZmluYWwgY2xhc3MgSGVkSFIgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSFIoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IUiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzCi0JICogKGFsaWduIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChub3NoYWRlIChub3NoYWRlKSAjSU1QTElFRCkKLQkgKiAoc2l6ZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKGNvbG9yICVDb2xvcjsgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKGFsaWduIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX0xFRlQsIENIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfQ0VOVEVSLCBDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JJR0hUfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQotCQkvLyB0aGUgcmVzdC4KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX05PU0hBREUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmMyZTRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uOwotCi0KLS8qKgotICogSFRNTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkSFRNTCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSFRNTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUwsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0hUTUw7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlvbWl0VHlwZSA9IE9NSVRfQk9USDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+SFRNTDwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPjxjb2RlPiVpMThuOzwvY29kZT48L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgICA8dGQ+e0BsaW5rIFBEQ01Eb2NJbXBsI2dldEF0dHJEZWNsYXJhdGlvbnNJMThufTwvdGQ+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+dmVyc2lvbjwvdGQ+PHRkPkNEQVRBPC90ZD48dGQ+I0ZJWEVEPC90ZD4KLQkgKiAgICAgPHRkPntAbGluayBIVE1MX1ZFUlNJT05fVFJBTlNJVElPTkFMfTwvdGQ+PHRkPmRlcGxlY2F0ZWQgaW4gSFRNTDQuMDE8L3RkPgotCSAqICAgPC90cj4KLQkgKiA8L3Rib2R5PgotCSAqIDwvdGFibGU+PGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQkJLy8gdmVyc2lvbgotCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlYyA9IGF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb24oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZFUlNJT04pOwotCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZFUlNJT04sIGFkZWMpOwotCX0KLQotCS8qKgotCSAqIEhUTUwgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhlYWRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSGVhZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjNiZTM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSGVhZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogSFsxLTZdLgotICovCi1maW5hbCBjbGFzcyBIZWRIZWFkaW5nIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRIZWFkaW5nKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+SDE8L2NvZGU+IGVsZW1lbnQgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCSAqIDx0YWJsZT4KLQkgKiA8dGJvZHk+Ci0JICogICA8dHI+Ci0JICogICAgIDx0aD5OQU1FPC90aD48dGg+VFlQRTwvdGg+PHRoPlVTQUdFPC90aD48dGg+REVGQVVMVCAoSU5JVElBTCkgVkFMVUU8L3RoPjx0aD5NRU1PPC90aD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4lYXR0cnM7PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+JWFsaWduOzwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiA8L3Rib2R5PgotCSAqIDwvdGFibGU+Ci0JICogPHA+PGI+JWFsaWduOzwvYj4gbWVhbnMgPGNvZGU+YWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnkpICNJTVBMSUVEPC9jb2RlPi4KLQkgKiBVbmZvcnR1bmF0ZWx5LCB0aGlzIDxjb2RlPmFsaWduPC9jb2RlPiBpcyBkaWZmZXJlbnQgZnJvbSBvbmUgaW4KLQkgKiA8Y29kZT5JTUc8L2NvZGU+IG9yIDxjb2RlPlRBQkxFPC9jb2RlPi4gIFNvLCB0aGUgYXR0cmlidXRlIGRlY2xhcmF0aW9uCi0JICogb2YgPGNvZGU+YWxpZ248L2NvZGU+IHNob3VsZCBiZSBsb2NhbHkgY3JlYXRlZCBhbmQgaXQgc2hvdWxkbid0IGJlIHJlZ2lzdGVyZWQKLQkgKiBpbiBhIDxjb2RlPkhDTURvY0ltcGw8L2NvZGU+IGluc3RhbmNlLjwvcD4KLQkgKiA8cD5Ib3dldmVyLCAlYWxpZ24gaXMgdXNlZCBpbiBzZXZhcmFsIHRpbWVzLiAgSSB3b3VsZG4ndCB3cml0ZSBzYW1lIGNvZGUKLQkgKiBpbiBtYW55IHRpbWVzLiAgU28sIEkgYWRkIGEgbmV3IHV0aWxpdHkgbWV0aG9kIGludG8gPGNvZGU+Q01VdGlsPC9jb2RlPgotCSAqIHRvIGNyZWF0ZSB0aGUgYXR0cmlidXRlIGRlY2xhcmF0aW9uLjwvcD4KLQkgKiA8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vIGFsaWduCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JQYXJhZ3JhcGgoKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElNRy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRJTUcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0NTRlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElNRy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogSU1HLgotICovCi1maW5hbCBjbGFzcyBIZWRJTUcgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSU1HKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU1HLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogSU1HLgotCSAqICVhdHRyczsKLQkgKiAoc3JjICVVUkk7ICNSRVFVSVJFRCk6IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGFsdCAlVGV4dDsgI1JFUVVJUkVEKQotCSAqIChsb25nZGVzYyAlVVJJOyAjSU1QTElFRCkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoaGVpZ2h0ICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAodXNlbWFwICVVUkk7ICNJTVBMSUVEKQotCSAqIChpc21hcCAoaXNtYXApICNJTVBMSUVEKQotCSAqIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCk6IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGJvcmRlciAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAoaHNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqICh2c3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKG1hcGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKHNyYyAlVVJJOyAjUkVRVUlSRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBudWxsOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBhdHRyKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfSFNQQUNFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVlNQQUNFLH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIGFsaWduIChsb2NhbCk7IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9ySW1hZ2UoKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSU5QVVQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSU5QVVQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlhY2IzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElOUFVULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIElOUFVULgotICovCi1maW5hbCBjbGFzcyBIZWRJTlBVVCBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRJTlBVVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOUFVULCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogSU5QVVQuCi0JICogJWF0dHJzOwotCSAqICh0eXBlICVJbnB1dFR5cGU7IFRFWFQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoY2hlY2tlZCAoY2hlY2tlZCkgI0lNUExJRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKHJlYWRvbmx5IChyZWFkb25seSkgI0lNUExJRUQpCi0JICogKHNpemUgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChtYXhsZW5ndGggTlVNQkVSICNJTVBMSUVEKQotCSAqIChzcmMgJVVSSTsgI0lNUExJRUQpCi0JICogKGFsdCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHVzZW1hcCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoaXNtYXAgKGlzbWFwKSAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25zZWxlY3QgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChhY2NlcHQgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQpCi0JICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoaXN0eWxlIENEQVRBICNJTVBMSUVEKQotCSAqIDw8RDIxNTY4NAotCSAqICh3aWR0aCBDREFUQTsgI0lNUExJRUQpCi0JICogKGhlaWdodCBDREFUQTsgI0lNUExJRUQpCi0JICogKGJvcmRlciBDREFUQTsgI0lNUExJRUQpCi0JICogRDIxNTY4NAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCS8vICh0eXBlICVJbnB1dFR5cGU7IFRFWFQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkvLyBOT1RFOiAlSW5wdXRUeXBlIGlzIEVOVU07Ci0JCS8vICh0ZXh0IHwgcGFzc3dvcmQgfCBjaGVja2JveCB8IHJhZGlvIHwgc3VibWl0IHwgcmVzZXQgfAotCQkvLyAgZmlsZSB8IGhpZGRlbiB8IGltYWdlIHwgYnV0dG9uKQotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gdmFsdWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfVEVYVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9QQVNTV09SRCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9DSEVDS0JPWCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9SQURJTywgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9TVUJNSVQsIENIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfUkVTRVQsIENIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfSElEREVOLH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX1RFWFQpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCi0JCS8vIChzaXplIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0dHIpOwotCi0JCS8vIChhbHQgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQsIGF0dHIpOwotCi0JCS8vIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9ySW1hZ2UoKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQotCQkvLyB0aGUgcmVzdC4KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0NIRUNLRUQsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTUFYTEVOR1RILCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9JU1RZTEUsCi0JCS8vPDxEMjE1Njg0Ci0JCQkJCUNIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUgotCQkvLzxEMjE1Njg0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSW5saW5lQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElubGluZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmQ0YmM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSW5saW5lQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yICglaW5saW5lOykqIGNvbnRhaW5lcnMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZElubGluZUNvbnRhaW5lciBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICogSGVkSW5saW5lQ29udGFpbmVyLgotCSAqIEBwYXJhbSBlbGVtZW50TmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgSGVkSW5saW5lQ29udGFpbmVyKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZExJLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZExJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMWY0YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRMSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIExJLgotICovCi1maW5hbCBjbGFzcyBIZWRMSSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEl9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZExJKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEksIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICh0eXBlICVMSVN0eWxlOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHZhbHVlIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBMSSBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkTGlzdEl0ZW1Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkTGlzdEl0ZW1Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYzNWU5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZExpc3RJdGVtQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGxpc3QgaXRlbSBjb250YWluZXIgZGVjbGFyYXRpb25zLgotICogLSBPTCwgVUwsIE1FTlUsIERJUi4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkTGlzdEl0ZW1Db250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRMaXN0SXRlbUNvbnRhaW5lcihTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0xJX0NPTlRBSU5FUjsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRNRU5VLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE1FTlUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmMGU4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE1FTlUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogTUVOVS9ESVIuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE1FTlUgZXh0ZW5kcyBIZWRMaXN0SXRlbUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTUVOVShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIE1FTlUvRElSLgotCSAqIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5NRU5VL0RJUjwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+JWJsb2NrOzwvY29kZT4uCi0JICogJWJsb2NrOyBpczoKLQkgKiBQIHwgJWhlYWRpbmc7IHwgJWxpc3Q7IHwgJXByZWZvcm1hdHRlZDsgfCBETCB8IERJViB8IENFTlRFUiB8Ci0JICogTk9TQ1JJUFQgfCBOT0ZSQU1FUyB8IEJMT0NLUVVPVEUgfCBGT1JNIHwgSVNJTkRFWCB8IEhSIHwKLQkgKiBUQUJMRSB8IEZJRUxEU0VUIHwgQUREUkVTUy4KLQkgKiAlaGVhZGluZzsgaXM6IEgxIHwgSDIgfCBIMyB8IEg0IHwgSDUgfCBINi4KLQkgKiAlbGlzdDsgaXMgOiBVTCB8IE9MIHwgRElSIHwgTUVOVS4KLQkgKiAlcHJlZm9ybWF0dGVkOyBpcyBQUkUuCi0JICogPGJyPgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gJWJsb2NrOwotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5QLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMSwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgzLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5INCwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDUsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg2LCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTCwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0wsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVSwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ETCwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElWLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5DRU5URVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJMT0NLUVVPVEUsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUk0sIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5BRERSRVNTfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGV4Y2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE1FVEEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkTUVUQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzJhNmZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkTUVUQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIE1FVEEuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE1FVEEgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTUVUQShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FVEEsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBNRVRBLgotCSAqICVpMThuOwotCSAqIChodHRwLWVxdWl2IE5BTUUgI0lNUExJRUQpCi0JICogKG5hbWUgTkFNRSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGNvbnRlbnQgQ0RBVEEgI1JFUVVJUkVEKQotCSAqIChzY2hlbWUgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCi0JCS8vIChuYW1lIE5BTUUgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk5BTUUpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgYXR0cik7Ci0KLQkJLy8gMjQ5NDkzCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DT05URU5ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DT05URU5ULCBhdHRyKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfSFRUUF9FUVVJViwKLQkJLy8JCUNIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DT05URU5UCi0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkT0wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkT0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U4MDFkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE9MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBPTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkT0wgZXh0ZW5kcyBIZWRMaXN0SXRlbUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkT0woRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogT0wuCi0JICogKHR5cGUgJU9MU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICogKHN0YXJ0IE5VTUJFUiAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRPUFRJT04uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkT1BUSU9OLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZjIwMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRPUFRJT04uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBPUFRJT04uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE9QVElPTiBleHRlbmRzIEhlZFBjZGF0YSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT059OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE9QVElPTihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EOwotCX0KLQotCS8qKgotCSAqIE9QVElPTi4KLQkgKiAlYXR0cnM7Ci0JICogKHNlbGVjdGVkIChzZWxlY3RlZCkgI0lNUExJRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKGxhYmVsICVUZXh0OyAjSU1QTElFRCkKLQkgKiAodmFsdWUgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NFTEVDVEVELCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBPUFRJT04gaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTJlMDkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogUC4KLSAqLwotZmluYWwgY2xhc3MgSGVkUCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIHRlcm1pbmF0b3JzID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRQKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuUCwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+UDwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVhdHRyczs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4lYWxpZ247PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqIDwvdGJvZHk+Ci0JICogPC90YWJsZT4KLQkgKiA8cD48Yj4lYWxpZ247PC9iPiBtZWFucyA8Y29kZT5hbGlnbiAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeSkgI0lNUExJRUQ8L2NvZGU+LgotCSAqIFVuZm9ydHVuYXRlbHksIHRoaXMgPGNvZGU+YWxpZ248L2NvZGU+IGlzIGRpZmZlcmVudCBmcm9tIG9uZSBpbgotCSAqIDxjb2RlPklNRzwvY29kZT4gb3IgPGNvZGU+VEFCTEU8L2NvZGU+LiAgU28sIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24KLQkgKiBvZiA8Y29kZT5hbGlnbjwvY29kZT4gc2hvdWxkIGJlIGxvY2FseSBjcmVhdGVkIGFuZCBpdCBzaG91bGRuJ3QgYmUgcmVnaXN0ZXJlZAotCSAqIGluIGEgPGNvZGU+SENNRG9jSW1wbDwvY29kZT4gaW5zdGFuY2UuPC9wPgotCSAqIDxwPkhvd2V2ZXIsICVhbGlnbiBpcyB1c2VkIGluIHNldmFyYWwgdGltZXMuICBJIHdvdWxkbid0IHdyaXRlIHNhbWUgY29kZQotCSAqIGluIG1hbnkgdGltZXMuICBTbywgSSBhZGQgYSBuZXcgdXRpbGl0eSBtZXRob2QgaW50byA8Y29kZT5DTVV0aWw8L2NvZGU+Ci0JICogdG8gY3JlYXRlIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uPC9wPgotCSAqIDxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyBhbGlnbgotCQlIVE1MQXR0ckRlY2xJbXBsIGFkZWMgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yUGFyYWdyYXBoKCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYWRlYyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBuYW1lcyBvZiB0ZXJtaW5hdG9ycy4KLQkgKiA8Y29kZT5QPC9jb2RlPiBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCWlmICh0ZXJtaW5hdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHRlcm1pbmF0b3JzLml0ZXJhdG9yKCk7Ci0JCS8vPDxEMjE3OTgyCi0JCXRlcm1pbmF0b3JzID0gbmV3IFZlY3RvcigpOwotCQl0ZXJtaW5hdG9ycy5hZGRBbGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZXNPZkJsb2NrKCkpOwotCQl0ZXJtaW5hdG9ycy5hZGQoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEkpOwotCQl0ZXJtaW5hdG9ycy5hZGQoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQpOwotCQl0ZXJtaW5hdG9ycy5hZGQoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuREQpOwotCQkvL0QyMTc5ODIKLQkJcmV0dXJuIHRlcm1pbmF0b3JzLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRQUkUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUFJFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZjUzNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRQUkUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBQUkUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFBSRSBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKiBQUkUgZWxlbWVudCBzaG91bGQga2VlcCBzcGFjZXMgaW4gaXRzIHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgSGVkUFJFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFLCBjb2xsZWN0aW9uKTsKLQkJLy8gQ09SUkVDVF9FTVBUWSAtIEdST1VQX0NPTVBBQ1QKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCi0JCWtlZXBTcGFjZXMgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAod2lkdGggTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gKHdpZHRoIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+UFJFPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT4lcHJlLmV4Y2x1c2lvbjs8L2NvZGU+LgotCSAqICVwcmUuZXhjbHVzaW9uIGlzOgotCSAqIElNRyB8IE9CSkVDVCB8IEFQUExFVCB8IEJJRyB8IFNNQUxMIHwgU1VCIHwgU1VQIHwgRk9OVCB8IEJBU0VGT05UCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTUcsfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGV4Y2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUGNkYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFBjZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDkwZGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUGNkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBQQ0RBVEEgdHlwZSBlbGVtZW50IGRlY2xhcmF0aW9ucy48YnI+Ci0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZFBjZGF0YSBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFBjZGF0YShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1BDREFUQTsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50Ljxicj4KLQkgKiBQQ0RBVEEgdHlwZSBhbHdheXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8YnI+Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudAotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCB0eXBlLjxicj4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU0VMRUNULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNFTEVDVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjAzNmY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU0VMRUNULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogU0VMRUNULgotICovCi1maW5hbCBjbGFzcyBIZWRTRUxFQ1QgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTRUxFQ1QoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TRUxFQ1QsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1NFTEVDVDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJXJlc2VydmVkOwotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChzaXplIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKG11bHRpcGxlIChtdWx0aXBsZSkgI0lNUExJRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAob25mb2N1cyAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmNoYW5nZSAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAoc2l6ZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0dHIpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTVVMVElQTEUsfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lCYXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkYjA0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotCi0KLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIFNTSSBkZWNsYXJhdGlvbnMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZFNTSUJhc2UgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJQmFzZShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEZvcm1hdFR5cGUoKSB7Ci0JCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9TU0k7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCWlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBzdXBlci5zdXBwb3J0cyhwcm9wTmFtZSk7Ci0JfQotCi0JLyoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wTmFtZSkgewotCQlpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfU1NJKSkKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KHByb3BOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUNvbmZpZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1MmIwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogU1NJOkNPTkZJRy4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJQ29uZmlnIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJQ29uZmlnKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0NPTkZJRywgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkNPTkZJRy4KLQkgKiAoZXJybXNnIENEQVRBICNJTVBMSUVEKQotCSAqIChzaXplZm10IENEQVRBICNJTVBMSUVEKQotCSAqICh0aW1lZm10IENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0VSUk1TRywgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkVGTVQsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9USU1FRk1UfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lFY2hvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUVjaG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQxYjIyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUVjaG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpFQ0hPLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lFY2hvIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJRWNobyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9FQ0hPLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6RUNITwotCSAqICh2YXIgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVkFSfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lFeGVjLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUV4ZWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhZDU4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUV4ZWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpFWEVDLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lFeGVjIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJRXhlYyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9FWEVDLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6RVhFQwotCSAqIChjZ2kgJVVSSTsgI0lNUExJRUQpCi0JICogKGNtZCBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DR0ksIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DTUR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUZsYXN0bW9kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUZsYXN0bW9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMGNiNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lGbGFzdG1vZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogU1NJOkZMQVNUTU9ELgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lGbGFzdG1vZCBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUZsYXN0bW9kKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0ZMQVNUTU9ELCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6RkxBU1RNT0QKLQkgKiAoZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkgKiAodmlydHVhbCAlVVJJICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0ZJTEUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9WSVJUVUFMfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lGc2l6ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lGc2l6ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTZmMjgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJRnNpemUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpGU0laRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJRnNpemUgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lGc2l6ZShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GU0laRSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkZTSVpFCi0JICogKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICogKHZpcnR1YWwgJVVSSSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVklSVFVBTH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJSW5jbHVkZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lJbmNsdWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMGY3MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lJbmNsdWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBTU0k6SU5DTFVERS4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJSW5jbHVkZSBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUluY2x1ZGUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfSU5DTFVERSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOklOQ0xVREUKLQkgKiAoZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkgKiAodmlydHVhbCAlVVJJICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0ZJTEUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9WSVJUVUFMfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lQcmludGVudi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lQcmludGVudi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODYwOTk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJUHJpbnRlbnYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFNTSTpQUklOVEVOVi4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJUHJpbnRlbnYgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lQcmludGVudihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9QUklOVEVOViwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6UFJJTlRFTlYgaGFzIG5vIGF0dHJpYnV0ZXMuICBTbywgdGhpcyBtZXRob2Qgc2hvdWxkCi0JICogYWx3YXlzIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBOb3RlOiBTaW5jZSBzb21lYm9keSBkb2Vzbid0IGV4cGVjdCBudWxsIGlzIHJldHVybmVkLCByZXR1cm4gdGhlIGVtcHR5IGF0dHJpYnV0ZQotCSAqIGxpa2UgYSBjdXN0b20gdGFnIHdoaWNoIGRvZXNuJ3QgaGF2ZSBhdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lTZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NDc0ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpTRVQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSVNldCBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSVNldChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9TRVQsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpTRVQKLQkgKiAodmFyIENEQVRBICNJTVBMSUVEKQotCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVIsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkVEVYVEFSRUEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkVEVYVEFSRUEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgxOThlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFRFWFRBUkVBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBURVhUQVJFQS4KLSAqLwotZmluYWwgY2xhc3MgSGVkVEVYVEFSRUEgZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JLyoqCi0JICogVEVYVEFSRUEgc2hvdWxkIGtlZXAgc3BhY2VzIGluIGl0cyBzb3VyY2UuCi0JICovCi0JcHVibGljIEhlZFRFWFRBUkVBKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVEFSRUEsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQotCQlrZWVwU3BhY2VzID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBURVhUQVJFQS4KLQkgKiAlYXR0cnM7Ci0JICogJXJlc2VydmVkOyAuLi4gZW1wdHkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAocm93cyBOVU1CRVIgI1JFUVVJUkVEKQotCSAqIChjb2xzIE5VTUJFUiAjUkVRVUlSRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKHJlYWRvbmx5IChyZWFkb25seSkgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uc2VsZWN0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmNoYW5nZSAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAoaXN0eWxlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1JPV1MsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xTLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfSVNUWUxFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRUSVRMRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRUSVRMRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTJlMGFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkVElUTEUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotCi0vKioKLSAqIFRJVExFLgotICovCi1maW5hbCBjbGFzcyBIZWRUSVRMRSBleHRlbmRzIEhlZFBjZGF0YSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkVElUTEUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5USVRMRSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIFRJVExFLgotCSAqICVpMThuOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+VElUTEU8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPiVoZWFkLm1pc2M7PC9jb2RlPi4KLQkgKiAlaGVhZC5taXNjOyBpcyA8Y29kZT5TQ1JJUFR8U1RZTEV8TUVUQXxMSU5LfE9CSkVDVDwvY29kZT4uCi0JICogPGJyPgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gKFNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUKQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FVEEsfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGV4Y2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCXJldHVybiBleGNsdXNpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRVTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRVTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjI0OWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkVUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFVMLgotICovCi1maW5hbCBjbGFzcyBIZWRVTCBleHRlbmRzIEhlZExpc3RJdGVtQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRVTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVMLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBVTC4KLQkgKiAodHlwZSAlVUxTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Qcm9wZXJ0eVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL1Byb3BlcnR5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0MGEzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL1Byb3BlcnR5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci0KLQotCi0vKioKLSAqIFByb3BlcnR5UHJvdmlkZXIgY2xhc3MuCi0gKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBpbnN0YW5jZXMuCi0gKi8KLWludGVyZmFjZSBQcm9wZXJ0eVByb3ZpZGVyIHsKLQotCWJvb2xlYW4gc3VwcG9ydHMoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCk7Ci0KLQlPYmplY3QgZ2V0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Qcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Qcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTRhMmNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvUHJvcGVydHlQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbk1hcDsKLQotLyoqCi0gKiBUaGUgZmFjdG9yeSBvYmplY3Qgb2YgUHJvcGVydHlQcm92aWRlci4KLSAqLwotZmluYWwgY2xhc3MgUHJvcGVydHlQcm92aWRlckZhY3RvcnkgewotCi0KLQkvKioKLQkgKiBEZWZhdWx0UHJvdmlkZXIgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgdW5rbm93biBwcm9wZXJ0aWVzLgotCSAqIEl0IGFsd2F5cyByZXR1cm5zIG51bGwgdmFsdWUgZm9yIGFueSBwcm9wZXJ0aWVzLgotCSAqLwotCWNsYXNzIERlZmF1bHRQcm92aWRlciBpbXBsZW1lbnRzIFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgRGVmYXVsdFByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciBpbXBsZW1lbnRzIFByb3BlcnR5UHJvdmlkZXIgewotCQlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKSB7Ci0JCQlyZXR1cm4gKGVkZWNsICE9IG51bGwpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXQoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCkgewotCQkJaWYgKCEoZWRlY2wgaW5zdGFuY2VvZiBIVE1MUHJvcGVydHlEZWNsYXJhdGlvbikpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gZ2V0RWxlbWVudFByb3BlcnR5KChIVE1MUHJvcGVydHlEZWNsYXJhdGlvbillZGVjbCk7Ci0JCX0KLQotCQlhYnN0cmFjdCBwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKTsKLQl9Ci0KLQkvKgotCSAqICJ0YWdJbmZvIgotCSAqIGdldHMgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGVsZW1lbnQKLQkgKi8KLQljbGFzcyBQUFRhZ0luZm8gZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGh0bWxBbm5vdGF0aW9uTG9jID0gImRhdGEvaHRtcmVmLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHJvdGVjdGVkIEFubm90YXRpb25NYXAgZkFubm90YXRpb25NYXAgPSBudWxsOwotCi0JCXB1YmxpYyBQUFRhZ0luZm8oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldHMgdGhlIGFubm90YXRpb25NYXAuCi0JCSAqIEByZXR1cm4gUmV0dXJucyBhIEFubm90YXRpb25NYXAKLQkJICovCi0JCXByb3RlY3RlZCBBbm5vdGF0aW9uTWFwIGdldEFubm90YXRpb25NYXAoKSB7Ci0JCQlpZiAoZkFubm90YXRpb25NYXAgPT0gbnVsbCkgewotCQkJCWZBbm5vdGF0aW9uTWFwID0gbmV3IEFubm90YXRpb25NYXAoKTsKLQkJCQl0cnkgewotCQkJCQlmQW5ub3RhdGlvbk1hcC5sb2FkKGh0bWxBbm5vdGF0aW9uTG9jLCBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm8gYW5ub3RhdGlvbiBhdmFpbGFibGUKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZkFubm90YXRpb25NYXA7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlpZiAoZGVjbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbk1hcCgpLmdldFByb3BlcnR5KCgoSFRNTEVsZW1lbnREZWNsYXJhdGlvbilkZWNsKS5nZXRFbGVtZW50TmFtZSgpLCAidGFnSW5mbyIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAic2hvdWxkS2VlcFNwYWNlIgotCSAqLwotCWNsYXNzIFBQU2hvdWxkS2VlcFNwYWNlIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUFNob3VsZEtlZXBTcGFjZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZGVjbC5zaG91bGRLZWVwU3BhY2VzKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAic2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UiCi0JICovCi0JY2xhc3MgUFBTaG91bGRJbmRlbnRDaGlsZFNvdXJjZSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBTaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZGVjbC5zaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogInRlcm1pbmF0b3JzIgotCSAqLwotCWNsYXNzIFBQVGVybWluYXRvcnMgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQVGVybWluYXRvcnMoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmICghIChkZWNsIGluc3RhbmNlb2YgSFRNTEVsZW1EZWNsSW1wbCkpIHJldHVybiBudWxsOwotCQkJcmV0dXJuICgoSFRNTEVsZW1EZWNsSW1wbClkZWNsKS5nZXRUZXJtaW5hdG9ycygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAicHJvaGliaXRlZEFuY2VzdG9ycyIKLQkgKi8KLQljbGFzcyBQUFByb2hpYml0ZWRBbmNlc3RvcnMgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQUHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gZGVjbC5nZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJpc0pTUCIKLQkgKi8KLQljbGFzcyBQUElzSlNQIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUElzSlNQKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihkZWNsLmlzSlNQKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAiaXNYSFRNTCIKLQkgKiBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGl0c2VsZiBuZXZlciByZXByZXNlbnQgYW55IFhIVE1MIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0JICogU28sIHRoaXMgcHJvcGVydHkgbXVzdCBiZSBhbHdheXMgZmFsc2UuCi0JICovCi0JY2xhc3MgUFBJc1hIVE1MIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUElzWEhUTUwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qCi0JICogImlzU1NJIgotCSAqIEVhY2ggZGVjbGFyYXRpb24gY2xhc3MgZm9yIFNTSSBlbGVtZW50cyBtdXN0IHByb3ZpZGUgdGhpcyBwcm9wZXJ0eSBpdHNlbGYsCi0JICogYW5kIHRoZW4gcmV0dXJuIHRydWUuICBPdGhlciBkZWNsYXJhdGlvbiBtdXN0IGFsd2F5cyByZXR1cm4gZmFsc2UuCi0JICovCi0JY2xhc3MgUFBJc1NTSSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBJc1NTSSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAibGluZUJyZWFrSGludCIKLQkgKi8KLQljbGFzcyBQUExpbmVCcmVha0hpbnQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQTGluZUJyZWFrSGludCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlTdHJpbmcgaGludCA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX05PTkU7Ci0JCQlzd2l0Y2ggKGRlY2wuZ2V0TGluZUJyZWFrSGludCgpKSB7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0FGVEVSX1NUQVJUIDoKLQkJCQkJaGludCA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0FGVEVSX1NUQVJUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQgOgotCQkJCQloaW50ID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19OT05FIDoKLQkJCQkvLyBub3RoaW5nIHRvIGRvCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIGhpbnQ7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJsYXlvdXRUeXBlIgotCSAqLwotCWNsYXNzIFBQTGF5b3V0VHlwZSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBMYXlvdXRUeXBlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCVN0cmluZyB0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX05PTkU7Ci0JCQlzd2l0Y2ggKGRlY2wuZ2V0TGF5b3V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9CTE9DSyA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfQkxPQ0s7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQlJFQUsgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX0JSRUFLOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTiA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfSElEREVOOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfT0JKRUNUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX1dSQVAgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX1dSQVA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfTk9ORSA6Ci0JCQkJLy8gbm90aGluZyB0byBkby4KLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gdHlwZTsKLQkJfQotCX0KLQotCS8qCi0JICogIm9taXRUeXBlIgotCSAqLwotCWNsYXNzIFBQT21pdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQT21pdFR5cGUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJU3RyaW5nIHR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX05PTkU7Ci0JCQlzd2l0Y2ggKGRlY2wuZ2V0T21pdFR5cGUoKSkgewotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0JPVEggOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9CT1RIOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORF9ERUZBVUxUIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX0RFRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORF9NVVNUIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX01VU1Q7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX05PTkUgOgotCQkJCS8vIG5vdGhpbmcgdG8gZG8uCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJpbmNsdXNpb24iCi0JICovCi0JY2xhc3MgUFBJbmNsdXNpb24gZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQSW5jbHVzaW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBkZWNsLmdldEluY2x1c2lvbigpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eVByb3ZpZGVyIGdldFByb3ZpZGVyKFN0cmluZyBwcm9wTmFtZSkgewotCQlQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSBmYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLQkJUHJvcGVydHlQcm92aWRlciBwcCA9IChQcm9wZXJ0eVByb3ZpZGVyKSBmYWN0b3J5LnJlZ2lzdHJ5LmdldChwcm9wTmFtZSk7Ci0JCWlmIChwcCAhPSBudWxsKQotCQkJcmV0dXJuIHBwOwotCi0JCXBwID0gZmFjdG9yeS5jcmVhdGUocHJvcE5hbWUpOwotCQlpZiAocHAgPT0gbnVsbCkKLQkJCXJldHVybiBmYWN0b3J5LmRlZmF1bHRQcm92aWRlcjsKLQotCQlmYWN0b3J5LnJlZ2lzdHJ5LnB1dChwcm9wTmFtZSwgcHApOwotCQlyZXR1cm4gcHA7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHlQcm92aWRlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgIT0gbnVsbCkKLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJaW5zdGFuY2UgPSBuZXcgUHJvcGVydHlQcm92aWRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgSGFzaHRhYmxlIHJlZ2lzdHJ5ID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgUHJvcGVydHlQcm92aWRlciBkZWZhdWx0UHJvdmlkZXIgPSBuZXcgRGVmYXVsdFByb3ZpZGVyKCk7Ci0KLQlwcml2YXRlIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlQcm92aWRlciBjcmVhdGUoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBudWxsOwotCQlpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkKLQkJCXBwID0gbmV3IFBQSXNKU1AoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcHAgPSBuZXcgUFBJc1hIVE1MKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NTSSkpCi0JCQlwcCA9IG5ldyBQUElzU1NJKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkxBWU9VVF9UWVBFKSkKLQkJCXBwID0gbmV3IFBQTGF5b3V0VHlwZSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpKQotCQkJcHAgPSBuZXcgUFBMaW5lQnJlYWtIaW50KCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlBST0hJQklURURfQU5DRVNUT1JTKSkKLQkJCXBwID0gbmV3IFBQUHJvaGliaXRlZEFuY2VzdG9ycygpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfS0VFUF9TUEFDRSkpCi0JCQlwcCA9IG5ldyBQUFNob3VsZEtlZXBTcGFjZSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSU5ERU5UX0NISUxEX1NPVVJDRSkpCi0JCQlwcCA9IG5ldyBQUFNob3VsZEluZGVudENoaWxkU291cmNlKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlRFUk1JTkFUT1JTKSkKLQkJCXBwID0gbmV3IFBQVGVybWluYXRvcnMoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVEFHSU5GTykpCi0JCQlwcCA9IG5ldyBQUFRhZ0luZm8oKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKSkKLQkJCXBwID0gbmV3IFBQT21pdFR5cGUoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSU5DTFVTSU9OKSkKLQkJCXBwID0gbmV3IFBQSW5jbHVzaW9uKCk7Ci0KLQkJcmV0dXJuIHBwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvc3NpL1NTSUNNRG9jdW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3NzaS9TU0lDTURvY3VtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTRkZmQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvc3NpL1NTSUNNRG9jdW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnNzaTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTENNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNRG9jVHlwZTsKLQotLyoqCi0gKiBDTURvY3VtZW50IGZhY3RvcnkgZm9yIFNTSSBkb2N1bWVudHMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTU0lDTURvY3VtZW50RmFjdG9yeSB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRklYID0gIlNTSSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBET0NfVFlQRV9OQU1FID0gIlNTSSI7Ly8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGNsYXNzIENNTmFtZXNwYWNlSW1wbCBpbXBsZW1lbnRzIENNTmFtZXNwYWNlIHsKLQkJcHVibGljIENNTmFtZXNwYWNlSW1wbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJCXJldHVybiBQUkVGSVg7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJCXJldHVybiBET0NfVFlQRV9OQU1FOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBDTU5vZGUuTkFNRV9TUEFDRTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQotCXN0YXRpYyBjbGFzcyBDTURvY0ltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50IHsKLQkJcHJpdmF0ZSBzdGF0aWMgQ01Eb2N1bWVudCBoY20gPSBIVE1MQ01Eb2N1bWVudEZhY3RvcnkuZ2V0Q01Eb2N1bWVudChDTURvY1R5cGUuSFRNTF9ET0NfVFlQRSk7Ci0KLQkJc3RhdGljIGNsYXNzIEVsZW1lbnRzIGltcGxlbWVudHMgQ01OYW1lZE5vZGVNYXAgewotCQkJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9DT05GSUcsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRUNITywgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9FWEVDLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0ZTSVpFLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0ZMQVNUTU9ELCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0lOQ0xVREUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfUFJJTlRFTlYsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfU0VUfTsKLQkJCXByaXZhdGUgSGFzaHRhYmxlIG1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQotCQkJcHVibGljIEVsZW1lbnRzKCkgewotCQkJCUNNTmFtZWROb2RlTWFwIGVsZW1zID0gaGNtLmdldEVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOwotCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWMgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGVsZW1zLmdldE5hbWVkSXRlbShuYW1lKTsKLQkJCQkJaWYgKGRlYyAhPSBudWxsKQotCQkJCQkJbWFwLnB1dChuYW1lLCBkZWMpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQkJcmV0dXJuIG1hcC5zaXplKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQkJU3RyaW5nIGNvb2tlZCA9IGdldENhbm9uaWNhbE5hbWUobmFtZSk7Ci0JCQkJaWYgKCFtYXAuY29udGFpbnNLZXkoY29va2VkKSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJcmV0dXJuIChDTU5vZGUpIG1hcC5nZXQoY29va2VkKTsKLQkJCX0KLQotCQkJcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlPYmplY3Qgbm9kZSA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoLS1pbmRleCA8IDApCi0JCQkJCQlyZXR1cm4gKENNTm9kZSkgbm9kZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJCQlyZXR1cm4gbWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgU3RyaW5nIGdldENhbm9uaWNhbE5hbWUoU3RyaW5nIHJhd05hbWUpIHsKLQkJCQlyZXR1cm4gcmF3TmFtZS50b1VwcGVyQ2FzZSgpOwotCQkJfQotCQl9Ci0KLQkJc3RhdGljIHByaXZhdGUgRWxlbWVudHMgZWxlbWVudHMgPSBuZXcgRWxlbWVudHMoKTsKLQotCi0JCXB1YmxpYyBDTURvY0ltcGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBDTU5vZGUuRE9DVU1FTlQ7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gZWxlbWVudHM7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCQlyZXR1cm4gc3NpbnM7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ01OYW1lc3BhY2Ugc3NpbnMgPSBuZXcgQ01OYW1lc3BhY2VJbXBsKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgQ01Eb2N1bWVudCBteWNtID0gbmV3IENNRG9jSW1wbCgpOwotCi0JcHJpdmF0ZSBTU0lDTURvY3VtZW50RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpIHsKLQkJcmV0dXJuIG15Y207Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSFRNTENvbnRlbnRQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSFRNTENvbnRlbnRQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NmZkOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0hUTUxDb250ZW50UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5QcmVmZXJlbmNlczsKLQotLyoqCi0gKiBQcm9wZXJ0aWVzIGNvbnN0YW50cyB1c2VkIGJ5IEhUTUwuIENsaWVudHMgc2hvdWxkIG9ubHkgcmVhZCBhbmQgbW9kaWZ5IHRoZQotICogSFRNTCBwcm9wZXJ0aWVzIHByb2dyYW1tYXRpY2FsbHkgdXNpbmcgdGhpcyBjbGFzcy4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgSFRNTENvbnRlbnRQcm9wZXJ0aWVzIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxDT1JFX0lEID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0tFWSA9ICI8cHJvamVjdD4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBkb2N1bWVudCB0eXBlIHRvIHVzZSB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfVFlQRSA9ICJkb2N1bWVudC10eXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogR2VuZXJhdGVzIGEgcHJlZmVyZW5jZSBrZXkgYmFzZWQgb24gcmVzb3VyY2VQYXRoCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGggdGhlIGtleSB3aWxsIGJlIGJhc2VkIG9mZiBvZgotCSAqIEByZXR1cm4gcHJlZmVyZW5jZSBrZXkgYmFzZWQgb24gcmVzb3VyY2VQYXRoIChiYXNpY2FsbHkgdGhlCi0JICogICAgICAgICByZXNvdXJjZVBhdGggd2l0aG91dCB0aGUgZmlsZW5hbWUpOyBQUk9KRUNUX0tFWSBpZiByZXNvdXJjZVBhdGgKLQkgKiAgICAgICAgIGlzIG51bGwKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldEtleUZvcihJUGF0aCByZXNvdXJjZVBhdGgpIHsKLQkJU3RyaW5nIGtleSA9IFBST0pFQ1RfS0VZOwotCQlpZiAocmVzb3VyY2VQYXRoICE9IG51bGwgJiYgcmVzb3VyY2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJa2V5ID0gcmVzb3VyY2VQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4ga2V5OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJlZmVyZW5jZXMgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb2plY3Qgc2NvcGUgYW5kCi0JICogcHJlZmVyZW5jZSBrZXkgKHN1Yk5vZGUpIElmIGNyZWF0ZSBpcyB0cnVlLCB0aGUgcHJlZmVyZW5jZSBub2RlIHdpbGwgYmUKLQkgKiBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IHRoZSBwcmVmZXJlbmNlIG5vZGUgaXMgdW5kZXIKLQkgKiBAcGFyYW0gcHJlZmVyZW5jZUtleQotCSAqICAgICAgICAgICAgdGhlIHN1Ym5vZGUvY2F0ZWdvcnkgdGhlIHByZWZlcmVuY2Ugbm9kZSBpcyBsb2NhdGVkIGluCi0JICogQHBhcmFtIGNyZWF0ZQotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgYSBwcmVmZXJlbmNlIG5vZGUgd2lsbCBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdAotCSAqICAgICAgICAgICAgYWxyZWFkeSBleGlzdAotCSAqIEByZXR1cm4gUHJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm9qZWN0IHNjb3BlIGFuZAotCSAqICAgICAgICAgcHJlZmVyZW5jZSBrZXkuIG51bGwgaWYgb25lIGNvdWxkIG5vdCBiZSBmb3VuZCBhbmQgY3JlYXRlIGlzCi0JICogICAgICAgICBmYWxzZQotCSAqLwotCXN0YXRpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcyhJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcHJlZmVyZW5jZUtleSwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJaWYgKGNyZWF0ZSkKLQkJCS8vIGNyZWF0ZSBhbGwgbm9kZXMgZG93biB0byB0aGUgb25lIHdlIGFyZSBpbnRlcmVzdGVkIGluCi0JCQlyZXR1cm4gbmV3IFByb2plY3RTY29wZShwcm9qZWN0KS5nZXROb2RlKEhUTUxDT1JFX0lEKS5ub2RlKHByZWZlcmVuY2VLZXkpOwotCQkvLyBiZSBjYXJlZnVsIGxvb2tpbmcgdXAgZm9yIG91ciBub2RlIHNvIG5vdCB0byBjcmVhdGUgYW55IG5vZGVzIGFzCi0JCS8vIHNpZGUgZWZmZWN0Ci0JCVByZWZlcmVuY2VzIG5vZGUgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRSb290Tm9kZSgpLm5vZGUoUHJvamVjdFNjb3BlLlNDT1BFKTsKLQkJdHJ5IHsKLQkJCS8vIFRPRE8gb25jZSBidWcgOTA1MDAgaXMgZml4ZWQsIHNob3VsZCBiZSBhcyBzaW1wbGUgYXMgdGhpczoKLQkJCS8vIFN0cmluZyBwYXRoID0gcHJvamVjdC5nZXROYW1lKCkgKyBJUGF0aC5TRVBBUkFUT1IgKwotCQkJLy8gUmVzb3VyY2VzUGx1Z2luLlBJX1JFU09VUkNFUyArIElQYXRoLlNFUEFSQVRPUiArCi0JCQkvLyBFTkNPRElOR19QUkVGX05PREU7Ci0JCQkvLyByZXR1cm4gbm9kZS5ub2RlRXhpc3RzKHBhdGgpID8gbm9kZS5ub2RlKHBhdGgpIDogbnVsbDsKLQkJCS8vIGZvciBub3csIHRha2UgdGhlIGxvbmcgd2F5Ci0JCQlpZiAoIW5vZGUubm9kZUV4aXN0cyhwcm9qZWN0LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlub2RlID0gbm9kZS5ub2RlKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKEhUTUxDT1JFX0lEKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCW5vZGUgPSBub2RlLm5vZGUoSFRNTENPUkVfSUQpOwotCQkJaWYgKCFub2RlLm5vZGVFeGlzdHMocHJlZmVyZW5jZUtleSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gbm9kZS5ub2RlKHByZWZlcmVuY2VLZXkpOwotCQl9Ci0JCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gbm9kZUV4aXN0cyBmYWlsZWQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJDb3VsZCBub3QgcmV0cmlldmUgcHJlZmVyZW5jZSBub2RlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBpbiB0aGUgZ2l2ZW4gY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcHJvcGVydHkga2V5Ci0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBjb250ZXh0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGNvbnRleHQgaXMKLQkgKiAgICAgICAgICAgIGF2YWlsYWJsZSBhbmQgdGhlIHdvcmtzcGFjZSBzZXR0aW5nIHNob3VsZCBiZSB0YWtlbi4gTm90ZQotCSAqICAgICAgICAgICAgdGhhdCBwYXNzaW5nIDxjb2RlPm51bGw8L2NvZGU+IHNob3VsZCBiZSBhdm9pZGVkLgotCSAqIEBwYXJhbSByZWN1cnNlCi0JICogICAgICAgICAgICB3aGV0aGVyIHRoZSBwYXJlbnQgc2hvdWxkIGJlIHF1ZXJpZWQgdGlsbCBwcm9wZXJ0eSBpcyBmb3VuZAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIGtleS4KLQkgKiBAc2luY2UgMS4xCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSwgSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIHJlY3Vyc2UpIHsKLQkJU3RyaW5nIHZhbCA9IG51bGw7Ci0JCS8vIGJvb2xlYW4gcHJlZmVyZW5jZUZvdW5kID0gZmFsc2U7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMocHJvamVjdCwga2V5LCBmYWxzZSk7Ci0JCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQkJdmFsID0gaW50ZXJuYWxHZXRQcm9wZXJ0eShyZXNvdXJjZSwgcmVjdXJzZSwgcHJlZmVyZW5jZXMpOwotCQkJCQkvLyBwcmVmZXJlbmNlRm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBXb3JrYmVuY2ggcHJlZmVyZW5jZSBtYXkgbm90IGJlIG5lZWRlZCBzbyBsZWF2ZSBvdXQgZm9yIG5vdwotCQkvLyAvLyBubyBwcmVmZXJlbmNlcyBmb3VuZCAtIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLAotCQkvLyAvLyBzaG9ydC1jaXJjdWl0Ci0JCS8vIC8vIGxvb2t1cCBieSBmYWxsaW5nIGJhY2sgdG8gd29ya3NwYWNlJ3MgZGVmYXVsdAotCQkvLyAvLyBzZXR0aW5nCi0JCS8vIGlmICghcHJlZmVyZW5jZUZvdW5kKQotCQkvLyB2YWwgPSBnZXRXb3JrYmVuY2hQcmVmZXJlbmNlKGtleSk7Ci0JCXJldHVybiB2YWw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGludGVybmFsR2V0UHJvcGVydHkoSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIHJlY3Vyc2UsIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IHByZWZlcmVuY2VzLmdldChnZXRLZXlGb3IocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSksIG51bGwpOwotCQlpZiAodmFsdWUgPT0gbnVsbCAmJiByZXNvdXJjZSAhPSByZXNvdXJjZS5nZXRQcm9qZWN0KCkgJiYgcmVjdXJzZSkgewotCQkJdmFsdWUgPSBwcmVmZXJlbmNlcy5nZXQoZ2V0S2V5Rm9yKG51bGwpLCBudWxsKTsKLQkJfQotCi0JCS8vIFdvcmtiZW5jaCBwcmVmZXJlbmNlIG1heSBub3QgYmUgbmVlZGVkIHNvIGxlYXZlIG91dCBmb3Igbm93Ci0JCS8vIC8vIGVuc3VyZSB3ZSBkZWZhdWx0IHRvIHRoZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZSBpZiBub25lIGlzIGZvdW5kCi0JCS8vIHJldHVybiB2YWx1ZSA9PSBudWxsID8gZ2V0V29ya2JlbmNoUHJlZmVyZW5jZShrZXkpIDogdmFsdWU7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBpbiB0aGUgZ2l2ZW4gY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcHJvcGVydHkga2V5Ci0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBjb250ZXh0LiBOb3RlIGNvbnRleHQgY2Fubm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSB2YWx1ZSB0byBzZXQgZm9yIHRoZSBrZXkuIElmIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICB0aGUga2V5IGlzIHJlbW92ZWQgZnJvbSBwcm9wZXJ0aWVzLgotCSAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgdmFsdWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcyhwcm9qZWN0LCBrZXksIHRydWUpOwotCQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCQlwcmVmZXJlbmNlcy5yZW1vdmUoZ2V0S2V5Rm9yKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpKTsKLQkJCQllbHNlCi0JCQkJCXByZWZlcmVuY2VzLnB1dChnZXRLZXlGb3IocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSksIHZhbHVlKTsKLQkJCQl0cnkgewotCQkJCQkvLyBzYXZlIGNoYW5nZXMKLQkJCQkJcHJlZmVyZW5jZXMuZmx1c2goKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSFRNTENPUkVfSUQsIElTdGF0dXMuRVJST1IsICJVbmFibGUgdG8gc2V0IHByb3BlcnR5IiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIFdvcmtiZW5jaCBwcmVmZXJlbmNlIG1heSBub3QgYmUgbmVlZGVkIHNvIGxlYXZlIG91dCBmb3Igbm93Ci0JCS8vIGp1c3Qgc2V0IGEgcHJlZmVyZW5jZSBpbiB0aGUgaW5zdGFuY2Ugc2NvcGUKLQkJLy8gaWYgKCFwcmVmZXJlbmNlRm91bmQpIHsKLQkJLy8gc2V0V29ya2JlbmNoUHJlZmVyZW5jZShrZXkpOwotCQkvLyB9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0hUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9IVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZjAzYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0hUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5QcmVmZXJlbmNlczsKLQotcHVibGljIGNsYXNzIEhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXIgewotCXB1YmxpYyBIVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQlmUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCWZKb2IgPSBuZXcgQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlciBfaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgZlJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0JQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iIGZKb2I7Ci0KLQkvKioKLQkgKiBUaGlzIGpvYiBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHRvIGFsbG93IHRoZSByZXNvdXJjZSBjaGFuZ2UgbGlzdGVuZXIKLQkgKiB0byBzY2hlZHVsZSBvcGVyYXRpb25zIHRoYXQgbmVlZCB0byBtb2RpZnkgdGhlIHdvcmtzcGFjZS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYiBleHRlbmRzIEpvYiB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUSUVTX1VQREFURV9ERUxBWSA9IDUwMDsKLQkJcHJpdmF0ZSBMaXN0IGFzeW5jQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iKCkgewotCQkJc3VwZXIoSFRNTENvcmVNZXNzYWdlcy5IVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nKTsKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJCXNldFByaW9yaXR5KEpvYi5JTlRFUkFDVElWRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VzKFNldCBuZXdDaGFuZ2VzKSB7Ci0JCQlpZiAobmV3Q2hhbmdlcy5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuOwotCQkJc3luY2hyb25pemVkIChhc3luY0NoYW5nZXMpIHsKLQkJCQlhc3luY0NoYW5nZXMuYWRkQWxsKG5ld0NoYW5nZXMpOwotCQkJCWFzeW5jQ2hhbmdlcy5ub3RpZnkoKTsKLQkJCX0KLQkJCXNjaGVkdWxlKFBST1BFUlRJRVNfVVBEQVRFX0RFTEFZKTsKLQkJfQotCi0JCXB1YmxpYyBJUHJvamVjdCBnZXROZXh0Q2hhbmdlKCkgewotCQkJc3luY2hyb25pemVkIChhc3luY0NoYW5nZXMpIHsKLQkJCQlyZXR1cm4gYXN5bmNDaGFuZ2VzLmlzRW1wdHkoKSA/IG51bGwgOiAoSVByb2plY3QpIGFzeW5jQ2hhbmdlcy5yZW1vdmUoYXN5bmNDaGFuZ2VzLnNpemUoKSAtIDEpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJTXVsdGlTdGF0dXMgcmVzdWx0ID0gbmV3IE11bHRpU3RhdHVzKEhUTUxDb250ZW50UHJvcGVydGllcy5IVE1MQ09SRV9JRCwgSVJlc291cmNlU3RhdHVzLkZBSUxFRF9TRVRUSU5HX0NIQVJTRVQsIEhUTUxDb3JlTWVzc2FnZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZywgbnVsbCk7Ci0JCQltb25pdG9yID0gbW9uaXRvciA9PSBudWxsID8gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSA6IG1vbml0b3I7Ci0JCQl0cnkgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKEhUTUxDb3JlTWVzc2FnZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZywgYXN5bmNDaGFuZ2VzLnNpemUoKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJSVByb2plY3QgbmV4dDsKLQkJCQkJd2hpbGUgKChuZXh0ID0gZ2V0TmV4dENoYW5nZSgpKSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBqdXN0IGV4aXQgaWYgdGhlIHN5c3RlbSBpcyBzaHV0dGluZyBkb3duIG9yIGhhcwotCQkJCQkJLy8gYmVlbiBzaHV0IGRvd24KLQkJCQkJCS8vIGl0IGlzIHRvbyBsYXRlIHRvIGNoYW5nZSB0aGUgd29ya3NwYWNlIGF0IHRoaXMKLQkJCQkJCS8vIHBvaW50IGFueXdheQotCQkJCQkJaWYgKFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uub3NnaSIpLmdldFN0YXRlKCkgIT0gQnVuZGxlLkFDVElWRSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBzYXZlIHRoZSBwcmVmZXJlbmNlcyBub2RlcwotCQkJCQkJCWlmIChuZXh0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQkJCS8vIHNhdmUgZG9jdW1lbnQgdHlwZSBwcmVmZXJlbmNlcwotCQkJCQkJCQlQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZnMgPSBIVE1MQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXMobmV4dCwgSFRNTENvbnRlbnRQcm9wZXJ0aWVzLkRPQ1VNRU5UX1RZUEUsIGZhbHNlKTsKLQkJCQkJCQkJaWYgKHByb2plY3RQcmVmcyAhPSBudWxsKQotCQkJCQkJCQkJcHJvamVjdFByZWZzLmZsdXNoKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gd2UgZ290IGFuIGVycm9yIHNhdmluZwotCQkJCQkJCVN0cmluZyBkZXRhaWxNZXNzYWdlID0gTkxTLmJpbmQoSFRNTENvcmVNZXNzYWdlcy5IVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1Byb2JsZW1zX1VwZGF0aW5nLCBuZXh0LmdldEZ1bGxQYXRoKCkpOwotCQkJCQkJCXJlc3VsdC5hZGQobmV3IFN0YXR1cygxIDw8IChJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX1NFVFRJTkdfQ0hBUlNFVCAlIDEwMCAvIDMzKSwgUmVzb3VyY2VzUGx1Z2luLlBJX1JFU09VUkNFUywgSVJlc291cmNlU3RhdHVzLkZBSUxFRF9TRVRUSU5HX0NIQVJTRVQsIGRldGFpbE1lc3NhZ2UsIGUpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNzaG91bGRSdW4oKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gc2hvdWxkUnVuKCkgewotCQkJc3luY2hyb25pemVkIChhc3luY0NoYW5nZXMpIHsKLQkJCQlyZXR1cm4gIWFzeW5jQ2hhbmdlcy5pc0VtcHR5KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc0VudHJ5Q2hhbmdlcyhJUmVzb3VyY2VEZWx0YSBwcm9qZWN0RGVsdGEsIFNldCBwcm9qZWN0c1RvU2F2ZSkgewotCQkJLy8gY2hlY2sgZWFjaCByZXNvdXJjZSB3aXRoIHdlYiBjb250ZW50IHNldHRpbmcgdG8gc2VlIGlmIGl0IGhhcwotCQkJLy8gYmVlbiBtb3ZlZC9kZWxldGVkCi0JCQlib29sZWFuIHJlc291cmNlQ2hhbmdlcyA9IGZhbHNlOwotCi0JCQkvLyBwcm9qZWN0IGFmZmVjdGVkCi0JCQlJUHJvamVjdCBjdXJyZW50UHJvamVjdCA9IChJUHJvamVjdCkgcHJvamVjdERlbHRhLmdldFJlc291cmNlKCk7Ci0KLQkJCXJlc291cmNlQ2hhbmdlcyA9IHByb2Nlc3NQcmVmZXJlbmNlcyhjdXJyZW50UHJvamVjdCwgSFRNTENvbnRlbnRQcm9wZXJ0aWVzLkRPQ1VNRU5UX1RZUEUsIHByb2plY3REZWx0YSwgcHJvamVjdHNUb1NhdmUpOwotCi0JCQkvLyBpZiB0aGVyZSB3YXMgYSBwcmVmZXJlbmNlIGtleSBjaGFuZ2UsIG5lZWQgdG8gc2F2ZSBwcmVmZXJlbmNlcwotCQkJaWYgKHJlc291cmNlQ2hhbmdlcykKLQkJCQlwcm9qZWN0c1RvU2F2ZS5hZGQoY3VycmVudFByb2plY3QpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdvZXMgdGhyb3VnaCBhbGwgdGhlIHJlc291cmNlLWRlcGVuZGVudCBwcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGgKLQkJICogY3VycmVudFByb2plY3QgJiBrZXkgYW5kIHVwZGF0ZXMgdGhlIHByZWZlcmVuY2Uga2V5cyBpZiBuZWVkZWQKLQkJICogYmFzZWQgb24gcHJvamVjdERlbHRhCi0JCSAqIAotCQkgKiBAcGFyYW0gY3VycmVudFByb2plY3QKLQkJICogICAgICAgICAgICBjdXJyZW50IHByb2plY3Qgb2YgdGhlIHByZWZlcmVuY2VzIHRvIGJlIGxvb2tlZCBhdAotCQkgKiBAcGFyYW0ga2V5Ci0JCSAqICAgICAgICAgICAgY3VycmVudCBrZXkvc3ViY2F0ZWdvcnkgb2YgdGhlIHByZWZlcmVuY2VzIHRvIGJlIGxvb2tlZAotCQkgKiAgICAgICAgICAgIGF0Ci0JCSAqIEBwYXJhbSBwcm9qZWN0RGVsdGEKLQkJICogICAgICAgICAgICB0aGUgY2hhbmdlcyB0byBwcm9jZXNzIHRoZSBwcmVmZXJlbmNlIGtleXMgYWdhaW5zdAotCQkgKiBAcGFyYW0gcHJvamVjdHNUb1NhdmUKLQkJICogICAgICAgICAgICB0aGUgcHJvamVjdHMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQvc2F2ZWQKLQkJICogQHJldHVybiB0cnVlIGlmIGN1cnJlbnRQcm9qZWN0J3MgcHJlZmVyZW5jZXMgd2VyZSBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NQcmVmZXJlbmNlcyhJUHJvamVjdCBjdXJyZW50UHJvamVjdCwgU3RyaW5nIGtleSwgSVJlc291cmNlRGVsdGEgcHJvamVjdERlbHRhLCBTZXQgcHJvamVjdHNUb1NhdmUpIHsKLQkJCWJvb2xlYW4gcmVzb3VyY2VDaGFuZ2VzID0gZmFsc2U7Ci0KLQkJCS8vIGdldCB0aGUgcHJvamVjdC1rZXkgcHJlZmVyZW5jZSBub2RlCi0JCQlQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZnMgPSBIVE1MQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXMoY3VycmVudFByb2plY3QsIGtleSwgZmFsc2UpOwotCQkJaWYgKHByb2plY3RQcmVmcyA9PSBudWxsKQotCQkJCS8vIG5vIHByZWZlcmVuY2VzIGZvciB0aGlzIHByb2plY3Qta2V5LCBqdXN0IGJhaWwKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTdHJpbmdbXSBhZmZlY3RlZFJlc291cmNlczsKLQkJCXRyeSB7Ci0JCQkJYWZmZWN0ZWRSZXNvdXJjZXMgPSBwcm9qZWN0UHJlZnMua2V5cygpOwotCQkJfQotCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcHJvYmxlbXMgd2l0aCB0aGUgcHJvamVjdCBzY29wZS4uLiB3ZSBnb25uYSBtaXNzIHRoZQotCQkJCS8vIGNoYW5nZXMgKGJ1dCB3aWxsIGxvZykKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiUHJvYmxlbSByZXRyZWl2aW5nIEpTUCBGcmFnbWVudCBwcmVmZXJlbmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQkvLyBnbyB0aHJvdWdoIGVhY2ggcHJlZmVyZW5jZSBrZXkgKHdoaWNoIGlzIHJlYWxseSBhIGZpbGUgbmFtZSkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWZmZWN0ZWRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBzZWUgaWYgcHJlZmVyZW5jZSBrZXkvZmlsZSBuYW1lIHdhcyBmaWxlIHRoYXQgd2FzIGNoYW5nZWQKLQkJCQlJUmVzb3VyY2VEZWx0YSBtZW1iZXJEZWx0YSA9IHByb2plY3REZWx0YS5maW5kTWVtYmVyKG5ldyBQYXRoKGFmZmVjdGVkUmVzb3VyY2VzW2ldKSk7Ci0JCQkJLy8gbm8gY2hhbmdlcyBmb3IgdGhlIGdpdmVuIHJlc291cmNlCi0JCQkJaWYgKG1lbWJlckRlbHRhID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChtZW1iZXJEZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQlyZXNvdXJjZUNoYW5nZXMgPSB0cnVlOwotCQkJCQkvLyByZW1vdmUgdGhlIHNldHRpbmcgZm9yIHRoZSBvcmlnaW5hbCBsb2NhdGlvbgotCQkJCQlTdHJpbmcgY3VycmVudFZhbHVlID0gcHJvamVjdFByZWZzLmdldChhZmZlY3RlZFJlc291cmNlc1tpXSwgbnVsbCk7Ci0JCQkJCXByb2plY3RQcmVmcy5yZW1vdmUoYWZmZWN0ZWRSZXNvdXJjZXNbaV0pOwotCQkJCQlpZiAoKG1lbWJlckRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTykgIT0gMCkgewotCQkJCQkJLy8gaWYgbW92aW5nLCBjb3B5IHRoZSBzZXR0aW5nIGZvciB0aGUgbmV3IGxvY2F0aW9uCi0JCQkJCQlJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KG1lbWJlckRlbHRhLmdldE1vdmVkVG9QYXRoKCkuc2VnbWVudCgwKSk7Ci0JCQkJCQlQcmVmZXJlbmNlcyB0YXJnZXRQcmVmcyA9IEhUTUxDb250ZW50UHJvcGVydGllcy5nZXRQcmVmZXJlbmNlcyh0YXJnZXRQcm9qZWN0LCBrZXksIHRydWUpOwotCQkJCQkJdGFyZ2V0UHJlZnMucHV0KEhUTUxDb250ZW50UHJvcGVydGllcy5nZXRLZXlGb3IobWVtYmVyRGVsdGEuZ2V0TW92ZWRUb1BhdGgoKSksIGN1cnJlbnRWYWx1ZSk7Ci0JCQkJCQlpZiAodGFyZ2V0UHJvamVjdCAhPSBjdXJyZW50UHJvamVjdCkKLQkJCQkJCQlwcm9qZWN0c1RvU2F2ZS5hZGQodGFyZ2V0UHJvamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzb3VyY2VDaGFuZ2VzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEZvciBhbnkgY2hhbmdlIHRvIHRoZSBlbmNvZGluZyBmaWxlIG9yIGFueSByZXNvdXJjZSB3aXRoIGVuY29kaW5nCi0JCSAqIHNldCwganVzdCBkaXNjYXJkIHRoZSBjYWNoZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcHJvamVjdC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSVJlc291cmNlRGVsdGFbXSBwcm9qZWN0RGVsdGFzID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJLy8gcHJvY2VzcyBlYWNoIHByb2plY3QgaW4gdGhlIGRlbHRhCi0JCQlTZXQgcHJvamVjdHNUb1NhdmUgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0RGVsdGFzLmxlbmd0aDsgaSsrKQotCQkJCS8vIG5vdGhpbmcgdG8gZG8gaWYgYSBwcm9qZWN0IGhhcyBiZWVuIGFkZGVkL3JlbW92ZWQvbW92ZWQKLQkJCQlpZiAocHJvamVjdERlbHRhc1tpXS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiAocHJvamVjdERlbHRhc1tpXS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgPT0gMCkKLQkJCQkJcHJvY2Vzc0VudHJ5Q2hhbmdlcyhwcm9qZWN0RGVsdGFzW2ldLCBwcm9qZWN0c1RvU2F2ZSk7Ci0JCQlmSm9iLmFkZENoYW5nZXMocHJvamVjdHNUb1NhdmUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzdGFydHVwKCkgewotCQlfaW5zdGFuY2UgPSBuZXcgSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihfaW5zdGFuY2UuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHNodXRkb3duKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihfaW5zdGFuY2UuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQlfaW5zdGFuY2UgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMzU5ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciB7Ci0KLQlwcm90ZWN0ZWQgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGVhZGVyUGFyc2VkOwotCi0JcHJvdGVjdGVkIFJlYWRlciBmUmVhZGVyOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGRldGVjdGVkQ2hhcnNldE5hbWUpKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXREZXRlY3RlZENoYXJzZXROYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyBUT0RPOiBpZiBkZXRlY3RlZENoYXJzZXQgYW5kIHNwZWMgZGVmYXVsdCBpcwotCQkvLyBudWxsLCBuZWVkIHRvIHVzZSAid29yawotCQkvLyBiZW5jaCBiYXNlZCIgZGVmYXVsdHMuCi0JCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHBhcmFtIHJlYXNvbgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbikgewotCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGVuc3VyZUlucHV0U2V0KCkgewotCQlpZiAoZlJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gbnVsbCwgaWYgaW52YWxpZCBjaGFyc2V0IG5hbWUgKGluIHdoaWNoIGNhc2UKLQkgKiAiYXBwcm9wcmlhdGVEZWZhdWx0IiBzaG91bGQgYmUgdXNlZCwgaWYgYSBuYW1lIGlzIHJlYWxseSBuZWVkIGZvciBzb21lCi0JICogInNhdmUgYW55d2F5IiBjYXNlcykuCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gMS4gQ2hlY2sgZXhwbGljaXQgbWFwcGluZyBvdmVycmlkZXMgZnJvbQotCQkvLyBwcm9wZXJ0eSBmaWxlIC0tIGl0cyBoZXJlIHdlIHBpY2sgdXAgInJ1bGVzIiBmb3IgY2FzZXMKLQkJLy8gdGhhdCBhcmUgbm90IGV2ZW4gaW4gSmF2YQotCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gMi4gVXNlIHRoZSAiY2Fub25pY2FsIiBuYW1lIGZyb20gSlJFIG1hcHBpbmdzCi0JCS8vIE5vdGU6IHNlZSBDaGFyc2V0IEphdmFEb2MsIHRoZSBuYW1lIHlvdSBnZXQgb25lCi0JCS8vIHdpdGggY2FuIGJlIGFsaWFzLAotCQkvLyB0aGUgbmFtZSB5b3UgZ2V0IGJhY2sgaXMgInN0YW5kYXJkIiBuYW1lLgotCQlDaGFyc2V0IGphdmFDaGFyc2V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphdmFDaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfQotCQkvLyBnaXZlIHByaW9yaXR5IHRvIGphdmEgY29ub25pY2FsIG5hbWUsIGlmIHByZXNlbnQKLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGphdmFDaGFyc2V0Lm5hbWUoKTsKLQkJCS8vIGJ1dCBzdGlsbCBhbGxvdyBvdmVycmlkZXMKLQkJCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEVuY29kaW5nTWVtZW50bygpLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQl9Ci0KLQkvLyB0byBlbnN1cmUgY29uc2lzdCBvdmVyYWxsIHJ1bGVzIHVzZWQsIHdlJ2xsIG1hcmsgYXMKLQkvLyBmaW5hbCwKLQkvLyBhbmQgcmVxdWlyZSBzdWJjbGFzc2VzIHRvIHByb3ZpZGUgY2VydGFpbiBwaWVjZXMgb2YKLQkvLyB0aGUKLQkvLyBpbXBsZW1lbnRhdGlvbgotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbgotCQkJLy8gcGFyc2UsIHNvIGNhbiBtYWtlCi0JCQkvLyBtdWx0aXBsZSAnZ2V0JyBjYWxscywgd2l0aG91dCBjYXVzaW5nCi0JCQkvLyByZXBhcnNpbmcuCi0JCQlmSGVhZGVyUGFyc2VkID0gdHJ1ZTsKLQkJCS8vIE5vdGU6IHRoZXJlIGlzIGEgImhpZGRlbiBhc3N1bXB0aW9uIiBoZXJlCi0JCQkvLyB0aGF0IGFuIGVtcHR5Ci0JCQkvLyBzdHJpbmcgaW4gY29udGVudCBzaG91bGQgYmUgdHJlYXRlZCBzYW1lIGFzCi0JCQkvLyBub3QgcHJlc2VudC4KLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQloYW5kbGVTcGVjRGVmYXVsdCgpOwotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCS8vIHNhZnR5IG5ldAotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBOdWxsTWVtZW50bygpOwotCQl9Ci0JCXJldHVybiBmRW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdG8gcmV0dXJuIGEgZGVmYXVsdCBlbmNvZGluZyAtLSBhcyBzcGVjaWZpZWQgYnkgYW4gaW5kdXN0cnkKLQkgKiBjb250ZW50IHR5cGUgc3BlYyAtLSB3aGVuIG5vdCBwcmVzZW50IGluIHRoZSBzdHJlYW0sIGZvciBleGFtcGxlLCBYTUwKLQkgKiBzcGVjaWZpZXMgVVRGLTgsIEpTUCBzcGVjaWZpZXMgSVNPLTg4NTktMS4gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybgotCSAqIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCAic3BlYyBkZWZhdWx0Ii4KLQkgKi8KLQlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgZW5jID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmMpOwotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTcGVjRGVmYXVsdCgpIHsKLQkJU3RyaW5nIGVuY29kaW5nTmFtZTsKLQkJZW5jb2RpbmdOYW1lID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jb2RpbmdOYW1lICE9IG51bGwpIHsKLQkJCS8vIGNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmNvZGluZ05hbWUsCi0JCQkvLyBFbmNvZGluZ01lbWVudG8uVVNFRF9DT05URU5UX1RZUEVfREVGQVVMVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZW5jb2RpbmdOYW1lKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuY29kaW5nTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFdmVyeSBzdWJjbGFzcyBtdXN0IHByb3ZpZGUgYSB3YXkgdG8gcGFyc2UgdGhlIGlucHV0LiBUaGlzIG1ldGhvZCBoYXMKLQkgKiBzZXZlcmFsIGNyaXRpY2FsIHJlc3BvbnNpYmlsaXRpZXM6Ci0JICogPGxpPnNldCB0aGUgZkVuY29kaW5nTWVtZW50byBmaWVsZCBhcHByb3ByaWF0ZWx5LCBhY2NvcmRpbmcgdG8gdGhlCi0JICogcmVzdWx0cyBvZiB0aGUgcGFyc2Ugb2YgZlJlYWRlci48L2xpPgotCSAqIDxsaT5zZXQgZkhhcmRlclBhcnNlZCB0byB0cnVlLCB0byBhdm9pZCB3YXN0ZWQgcmUtcGFyc2luZy48L2xpPgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRBbGwoKSB7Ci0JCWZSZWFkZXIgPSBudWxsOwotCQlmSGVhZGVyUGFyc2VkID0gZmFsc2U7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gbmV3IEJ5dGVSZWFkZXIoaW5wdXRTdHJlYW0pOwotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGtub3cgQnl0ZVJlYWRlcgotCQkJLy8gc3VwcG9ydHMgbWFya2luZwotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODE5OWIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLQotLyoqCi0gKiBUaGlzIGlzIGFuICJhZGFwdGVyIiBjbGFzcywgc2ltcGx5IHRvIGdldCBpbiBpbnB1dCBzdHJlYW0gdG8gYWN0IGxpa2UgYQotICogcmVhZGVyLiBXZSBjb3VsZCBub3QgdXNlIElucHV0U3RyZWFtUmVhZGVyIGRpcmVjdGx5IGJlY2F1c2UgaXRzIGludGVybmFsCi0gKiBidWZmZXJzIGFyZSBub3QgY29udHJvbGxhYmxlLCBhbmQgaXQgc29tZXRpbWVzIHB1bGxzIHRvbyBtdWNoIG91dCBvZiBpbnB1dAotICogc3RyZWFtIChldmVuIHdoZW4gaXQgd2Fzbid0IG5lZWRlZCBmb3Igb3VyIHB1cnBvc2VzKS4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIGhpZ2hseSBzcGVjaWFsaXplZCBhbmQgYnkgbm90IG1lYW5zIG1lYW50IHRvIGJlCi0gKiBnZW5lcmFsIHB1cnBvc2UuIEl0cyB1c2UgaXMgcmVzdHJpY3RlZCB0byB0aG9zZSBjYXNlcyB3aGVyZSB0aGUgaW5wdXQKLSAqIHN0cmVhbSBjYW4gYmUgcmVnYXJkZWQgYXMgYXNjaWkganVzdCBsb25nIGVub3VnaCB0byBkZXRlcm1pbmUgd2hhdCB0aGUgcmVhbAotICogZW5jb2Rpbmcgc2hvdWxkIGJlLgotICovCi0KLXB1YmxpYyBjbGFzcyBCeXRlUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKLQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSBDb2RlZElPLk1BWF9CVUZfU0laRTsKLQotCXByb3RlY3RlZCBieXRlW10gZkJ1ZmZlcjsKLQotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBmSW5wdXRTdHJlYW07Ci0KLQlwcm90ZWN0ZWQgQnl0ZVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQl0aGlzKGlucHV0U3RyZWFtLCBERUZBVUxUX0JVRkZFUl9TSVpFKTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBpbnQgc2l6ZSkgewotCQl0aGlzLmZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuZkJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZJbnB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRBaGVhZExpbWl0KSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLm1hcmsocmVhZEFoZWFkTGltaXQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBiMCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQoKTsKLQkJcmV0dXJuIChiMCAmIDB4MDBGRik7Ci0JfQotCi0JcHVibGljIGludCByZWFkKGNoYXIgY2hbXSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGxlbmd0aCA+IHRoaXMuZkJ1ZmZlci5sZW5ndGgpIHsKLQkJCWxlbmd0aCA9IHRoaXMuZkJ1ZmZlci5sZW5ndGg7Ci0JCX0KLQotCQlpbnQgY291bnQgPSB0aGlzLmZJbnB1dFN0cmVhbS5yZWFkKHRoaXMuZkJ1ZmZlciwgMCwgbGVuZ3RoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWludCBiMCA9IHRoaXMuZkJ1ZmZlcltpXTsKLQkJCS8vIHRoZSAweDAwRkYgaXMgdG8gImxvc2UiIHRoZSBuZWdhdGl2ZSBiaXRzIGZpbGxlZCBpbiB0aGUgYnl0ZSB0bwotCQkJLy8gaW50IGNvbnZlcnNpb24KLQkJCS8vIChhbmQgd2hpY2ggd291bGQgYmUgdGhlcmUgaWYgY2FzdCBkaXJlY3RseSBmcm9tIGJ5dGUgdG8gY2hhcikuCi0JCQljaGFyIGMwID0gKGNoYXIpIChiMCAmIDB4MDBGRik7Ci0JCQljaFtvZmZzZXQgKyBpXSA9IGMwOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZJbnB1dFN0cmVhbS5yZXNldCgpOwotCX0KLQotCXB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5mSW5wdXRTdHJlYW0uc2tpcChuKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNzA5ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotLyoqCi0gKiAKLSAqIENvbnRlbnREZXNjcmliZXJGb3JIVE1MCi0gKiAKLSAqIEEgZmV3IGRlc2lnbiBwcmluY2lwbGVzIHRvIHJlbWVtYmVyIHdpdGggY29udGVudCBkZXNjcmliZXJzOgotICogPHVsPiAKLSAqIDxsaT5SZW1lbWJlciBub3QgdG8gc3RvcmUgdmFsdWVzL2RhdGEgaW4gdGhlIGRlc2NyaXB0aW9ucyBhcnJheSBvZiBwcm9wZXJ0aWVzLCAKLSAqIGVzcGVjaWFsbHkgbm90IGxhcmdlIG9iamVjdHMhIGFuZCBldmVuIG5vIHZhbHVlIHRoYXQgaXMgYWxyZWFkeSB0aGUgZGVmYXVsdCB2YWx1ZSwgCi0gKiBzaW5jZSB0aG9zZSBkZXNjcmlwdGlvbiBwcm9wZXJ0aWVzIGFyZSBjYWNoZWQgcGVyIHNlc3Npb24sIHNvIGNhbiBhZGQgdXAgaW4gbWVtb3J5LiAKLSAqIDxsaT5SZW1lbWJlciB0aGF0IGEgQ29udGVudERlc2NyaWJlciBpbnN0YW5jZSBiZWNvbWVzIGEgInJvb3Qgb2JqZWN0IiBpbiB0aGUgCi0gKiBDb250ZW50RGVzY3JpYmVyTWFuYWdlciAodGhhdCBpcywgYWx3YXlzIGluIG1lbW9yeSwgbmV2ZXIgR0MnZCksIHNvIGl0IHNob3VsZCAKLSAqIG5vdCBoYXZlIGFueSBpbnN0YW5jZSBvciBzdGF0ZSBkYXRhIHNpbmNlIGl0IHdvdWxkIGFsd2F5cyBiZWNvbWUgc3RhbGUgYW5kIAotICogImhvbGQgb24iIHRvIG9iamVjdHMgdW5uZWNjZXNzYXJpbHkuIAotICogPC91bD4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudERlc2NyaWJlckZvckhUTUwgaW1wbGVtZW50cyBJVGV4dENvbnRlbnREZXNjcmliZXIgewotCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgUXVhbGlmaWVkTmFtZVtdIFNVUFBPUlRFRF9PUFRJT05TID0ge0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFR9OwotCi0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCQkvLyBhc3N1bW1taW5nIHdlIHNob3VsZCByZXR1cm4gc2FtZSAndmFsaWRpdHknIHZhbHVlIHdlIGRpZAotCQkJLy8gd2hlbiBjYWxsZWQgYmVmb3JlLiAodGVjaG5pY2FsbHksIGNvdWxkIGJlIGEgcGVyZm9ybWFuY2UgaXNzdWUKLQkJCS8vIGluIGZ1dHVyZSwgc28gbWlnaHQgd2FudCB0byBjaGVjayBpZiBhbnkgJ29sIHZhbHVlIHdvdWxkCi0JCQkvLyBiZSBvayBoZXJlLgotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBkZXNjcmliZShSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCWVsc2UgewotCQkJY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQkJLy8gYXNzdW1tbWluZyB3ZSBzaG91bGQgcmV0dXJuIHNhbWUgJ3ZhbGlkaXR5JyB2YWx1ZSB3ZSBkaWQKLQkJCS8vIHdoZW4gY2FsbGVkIGJlZm9yZS4gKHRlY2huaWNhbGx5LCBjb3VsZCBiZSBhIHBlcmZvcm1hbmNlIGlzc3VlCi0JCQkvLyBpbiBmdXR1cmUsIHNvIG1pZ2h0IHdhbnQgdG8gY2hlY2sgaWYgaGFyZCBjb2RlZCAndmFsaWQnIHdvdWxkCi0JCQkvLyBiZSBvayBoZXJlLgotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFF1YWxpZmllZE5hbWVbXSBnZXRTdXBwb3J0ZWRPcHRpb25zKCkgewotCi0JCXJldHVybiBTVVBQT1JURURfT1BUSU9OUzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCWhhbmRsZUNhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCWhhbmRsZUNhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVZhbGlkaXR5KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCS8vIGN1cnJlbnRseSBubyBjb250ZW50cyBzcGVjaWZpYyBjaGVjayBmb3IgdmFsaWQgSFRNTCBjb250ZW50cwotCQkvLyAodGhpcyBtYXkgY2hhbmdlIG9uY2Ugd2UgYWRkIFhIVE1MIGNvbnRlbnQgdHlwZSkKLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVZhbGlkaXR5KFJlYWRlciByZWFkZXIpIHsKLQkJLy8gY3VycmVudGx5IG5vIGNvbnRlbnRzIHNwZWNpZmljIGNoZWNrIGZvciB2YWxpZCBIVE1MIGNvbnRlbnRzCi0JCS8vICh0aGlzIG1heSBjaGFuZ2Ugb25jZSB3ZSBhZGQgWEhUTUwgY29udGVudCB0eXBlKQotCQlyZXR1cm4gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBnZXREZXRlY3RvcigpIHsKLQotCQlyZXR1cm4gbmV3IEhUTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZXRlY3RvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2FsY3VsYXRpb25zKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gKChIVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcikuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCS8vIFRPRE86IEkgbmVlZCB0byB2ZXJpZnkgdG8gc2VlIGlmIHRoaXMgQk9NIHdvcmsgaXMgYWx3YXlzIGRvbmUKLQkJLy8gYnkgdGV4dCB0eXBlLgotCQlPYmplY3QgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrID0gZW5jb2RpbmdNZW1lbnRvLmdldFVuaWNvZGVCT00oKTsKLQkJaWYgKGRldGVjdGVkQnl0ZU9yZGVyTWFyayAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdCeXRlT3JkZXJNYXJrID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspOwotCQkJLy8gbm90IHN1cmUgd2h5IHdvdWxkIGV2ZXIgYmUgZGlmZmVyZW50LCBzbyBpZiBpcyBkaWZmZXJlbnQsIG1heQotCQkJLy8gbmVlZCB0byAicHVzaCIgdXAgaW50byBiYXNlLgotCQkJaWYgKCFkZXRlY3RlZEJ5dGVPcmRlck1hcmsuZXF1YWxzKGV4aXN0aW5nQnl0ZU9yZGVyTWFyaykpCi0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIGRldGVjdGVkQnl0ZU9yZGVyTWFyayk7Ci0JCX0KLQotCi0JCWlmICghZW5jb2RpbmdNZW1lbnRvLmlzVmFsaWQoKSkgewotCQkJLyoKLQkJCSAqIG5vdGU6IGFmdGVyIHNldHRpbmcgaGVyZSwgaXRzIHRoZSBtZXJlIHByZXNlbmNlIG9mCi0JCQkgKiBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCBpbiB0aGUKLQkJCSAqIHJlc291cmNlJ3MgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgaW52YWxpZAotCQkJICogaW4gdGhvc2UgY2FzZXMsIHRoZSAiZGV0ZWN0ZWQiIHByb3BlcnR5IGNvbnRhaW5zIGFuCi0JCQkgKiAiYXBwcm9wcmlhdGUgZGVmYXVsdCIgdG8gdXNlLgotCQkJICovCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgZW5jb2RpbmdNZW1lbnRvLmdldEludmFsaWRFbmNvZGluZygpKTsKLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULCBlbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCkpOwotCQl9Ci0KLQkJT2JqZWN0IGRldGVjdGVkQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JCU9iamVjdCBqYXZhQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQotCQkvLyB3ZSBhbHdheXMgaW5jbHVkZSBkZXRlY3RlZCwgaWYgaXRzIGRpZmZlcmVudCB0aGFuIGphdmEKLQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0KLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0NoYXJzZXQgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpOwotCQkJaWYgKGphdmFDaGFyc2V0LmVxdWFscyhleGlzdGluZ0NoYXJzZXQpKSB7Ci0JCQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3ZSBtYXkgbmVlZCB0byBhZGQgd2hhdCB3ZSBmb3VuZCwgYnV0IG9ubHkgbmVlZCB0byBhZGQKLQkJCQkvLyBpZiBkaWZmZXJlbnQgZnJvbSBkZWZhdWx0LnRoZQotCQkJCU9iamVjdCBkZWZhdWx0Q2hhcnNldCA9IGRldGVjdG9yLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQlpZiAoZGVmYXVsdENoYXJzZXQgIT0gbnVsbCkgewotCQkJCQlpZiAoIWRlZmF1bHRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBhc3N1bWluZyBpZiB0aGVyZSBpcyBubyBzcGVjIGRlZmF1bHQsIHdlIGFsd2F5cyBuZWVkIHRvCi0JCQkJCS8vIGFkZCwgSSdtIGFzc3VtaW5nCi0JCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgT2JqZWN0IGRldGVjdGVkQ2hhcnNldCwgT2JqZWN0IGphdmFDaGFyc2V0KSB7Ci0JCS8vIHNpbmNlIGVxdWFsLCB3ZSBkb24ndCBuZWVkIHRvIGFkZCwgYnV0IGlmIG91ciBkZXRlY3RlZCB2ZXJzaW9uIGlzCi0JCS8vIGRpZmZlcmVudCB0aGFuCi0JCS8vIGphdmFDaGFyc2V0LCB0aGVuIHdlIHNob3VsZCBhZGQgaXQuIFRoaXMgd2lsbCBoYXBwZW4sIGZvciBleGFtcGxlLAotCQkvLyBpZiB0aGVyZSdzCi0JCS8vIGRpZmZlcmVuY2VzIGluIGNhc2UsIG9yIGRpZmZlcmVuY2VzIGR1ZSB0byBvdmVycmlkZSBwcm9wZXJ0aWVzCi0JCWlmIChkZXRlY3RlZENoYXJzZXQgIT0gbnVsbCkgewotCQkJLy8gaWYgKCFkZXRlY3RlZENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJLy8gZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsCi0JCQkvLyBkZXRlY3RlZENoYXJzZXQpOwotCQkJLy8gfQotCi0JCQkvLyBPbmNlIHdlIGRldGVjdGVkIGEgY2hhcnNldCwgd2Ugc2hvdWxkIHNldCB0aGUgcHJvcGVydHkgZXZlbgotCQkJLy8gdGhvdWdoIGl0J3MgdGhlIHNhbWUgYXMgamF2YUNoYXJzZXQKLQkJCS8vIGJlY2F1c2UgdGhlcmUgYXJlIGNsaWVudHMgdGhhdCByZWx5IG9uIHRoaXMgcHJvcGVydHkgdG8KLQkJCS8vIGRldGVybWluZSBpZiB0aGUgY2hhcnNldCBpcyBhY3R1YWxseSBkZXRlY3RlZCBpbiBmaWxlIG9yIG5vdC4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBkZXRlY3RlZENoYXJzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1JlbGV2ZW50KElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCS8vIGVsc2UgaWYKLQkJLy8gKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5FTkNPRElOR19NRU1FTlRPKSkKLQkJLy8gcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ0d1ZXNzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ0d1ZXNzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0NjQzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdHdWVzc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLS8qKgotICogCi0gKiBUaGlzIGlzIHBvcnRlZCBmcm9tIFBhZ2VEZXNpZ25lcidzIGhwYmNvbS9LYW5qaS5jcHAncwotICogS2Fuamk6Omd1ZXNzX2thbmppX2NvZGUoKSwKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEVuY29kaW5nR3Vlc3NlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTQ0lJID0gMDsgLy8gQVNDSUkKLQkvLyBJU08tMjAyMi1KUAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBU0NJSV9JTiA9IDg7IC8vIFRoaXMgaXMgYWZ0ZXIgSVNPMjAyMidzIGNoYW5nZQotCS8vIFNoaWZ0LUpJUwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVUNfSEFMRktBTkEgPSA2OyAvLyBUaGlzIGlzIEhhbGYgS2FuYSBpbiBFVUMtSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVVDX0pQID0gMzsgLy8gVGhpcyBpcyBFVUMtSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVNPMjAyMl9KUCA9IDQ7IC8vIFRoaXMgaXMgSVNPLTIwMjItSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSklTX0hBTEZLQU5BID0gNzsgLy8gVEhpcyBpcyBIYWxmIEthbmEgaW4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0VVQzEgPSAweDQwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfRVVDMiA9IChieXRlKSAweDgwOwotCS8vIEFTQ0lJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9KSU4gPSAweDAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfSk9VVCA9IDB4MDI7Ci0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9FU0MgPSAweDA0OwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfSklTID0gMHgwODsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX1NGVDEgPSAweDEwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfU0ZUMiA9IDB4MjA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBrdHlwZVtdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDAwICovCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMTAgKi8KLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDA4LCAweDA5LCAweDA4LCAweDA4LCAweDA4LCAvKiAhIiMkJSYnICovLyogIiAqLwotCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIC8qICgpKissLS4vICovCi0JMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgLyogMDEyMzQ1NjcgKi8KLQkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAvKiA4OTo7IDw9Pj8gKi8KLQkweDI5LCAweDI4LCAweDJiLCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBAQUJDREVGRyAqLwotCTB4MmEsIDB4MjgsIDB4MmEsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIEhJSktMTU5PICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogUFFSU1RVVlcgKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBYWVpbXF1eXyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIGFiY2RlZmcgKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBoaWprbG1ubyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIHBxcnN0dXZ3ICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgwMCwgLyogeHl6e3x9fiAqLwotCTB4MjAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIC8qIDgwICovCi0JMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgLyogOTAgKi8KLQkweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDIwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogQTAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogQjAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogQzAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogRDAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgLyogRTAgKi8KLQkoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgLyogRjAgKi8KLQkoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGMwLCAoYnl0ZSkgMHhjMCwgMHgwMCx9OwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJU084ODU5XzEgPSAxOyAvLyBJU08tMQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSElGVF9KSVMgPSAyOyAvLyBUaGlzIGlzIFNoaWZ0LUpJUwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSklTX0hBTEZLQU5BID0gNTsgLy8gVGhpcyBpcyBIYWxmIEthbmEgaW4KLQotCS8qKgotCSAqIEN1cnJlbnRseSwgb25seSBKYXBhbmVzZSBlbmNvZGluZ3MgYXJlIHN1cHBvcnRlZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTiA9IC0xOyAvLyBVbmtub3duCi0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29kZQotCSAqICAgICAgICAgICAgaW50Ci0JICogCi0JICogQ29udmVydCBwcml2YXRlIGludCB0byBJQU5BIEVuY29kaW5nIG5hbWUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0lBTkFFbmNvZGluZ05hbWUoaW50IGNvZGUpIHsKLQkJU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKLQotCQlzd2l0Y2ggKGNvZGUpIHsKLQkJCWNhc2UgU0hJRlRfSklTIDoKLQkJCWNhc2UgU0pJU19IQUxGS0FOQSA6Ci0JCQkJZW5jb2RpbmcgPSAiU2hpZnRfSklTIjsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEVVQ19KUCA6Ci0JCQljYXNlIEVVQ19IQUxGS0FOQSA6Ci0JCQkJZW5jb2RpbmcgPSAiRVVDLUpQIjsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIElTTzIwMjJfSlAgOgotCQkJY2FzZSBKSVNfSEFMRktBTkEgOgotCQkJCWVuY29kaW5nID0gIklTTy0yMDIyLUpQIjsvLyROT04tTkxTLTEkCi0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBlbmNvZGluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZ3Vlc3NlZCBKYXZhIEVuY29kaW5nIG5hbWUgdGFyZ2V0OiBieXRlcyB0byBiZSBpbnNwZWN0ZWQgbGVuZ3RoOgotCSAqIGxlbmd0aCBvZiB0YXJnZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWVzc0VuY29kaW5nKGJ5dGVbXSB0YXJnZXQsIGludCBsZW5ndGgpIHsKLQkJaW50IGNvZGUgPSBVTktOT1dOOwotCi0JCS8vIEN1cnJlbnRseSwgb25seSBKYXBhbmVzZSBpcyBzdXBwb3J0ZWQuCi0JCVN0cmluZyBzeXN0ZW1fY3R5cGUgPSBqYXZhLnV0aWwuTG9jYWxlLmdldERlZmF1bHQoKS5nZXRMYW5ndWFnZSgpOwotCQlTdHJpbmcganBfY3R5cGUgPSBqYXZhLnV0aWwuTG9jYWxlLkpBUEFORVNFLmdldExhbmd1YWdlKCk7Ci0JCWlmIChzeXN0ZW1fY3R5cGUuY29tcGFyZVRvKGpwX2N0eXBlKSA9PSAwKSB7Ci0JCQkvLyBPaywgSSdtIHVuZGVyIGphX0pQLgotCQkJY29kZSA9IEFTQ0lJOwotCQkJaW50IHBvcyA9IDA7Ci0JCQl3aGlsZSAoKGNvZGUgPT0gQVNDSUkpICYmIChsZW5ndGggPiAwKSkgewotCQkJCWludCBjaDEgPSB0YXJnZXRbcG9zXTsKLQkJCQljaDEgPSBjaDEgJiAweDAwMDAwMEZGOwotCQkJCWludCBjaDIgPSAobGVuZ3RoID49IDIpID8gdGFyZ2V0W3BvcyArIDFdIDogMDsKLQkJCQljaDIgPSBjaDIgJiAweDAwMDAwMEZGOwotCQkJCWludCBjaDMgPSAobGVuZ3RoID49IDMpID8gdGFyZ2V0W3BvcyArIDJdIDogMDsKLQkJCQljaDMgPSBjaDMgJiAweDAwMDAwMEZGOwotCQkJCWNvZGUgPSBndWVzc0phcGFuZXNlS2FuamlDb2RlKGNoMSwgY2gyLCBjaDMsIDApOwotCQkJCXBvcysrOwotCQkJCWxlbmd0aC0tOwotCQkJfQotCQkJc3dpdGNoIChjb2RlKSB7Ci0JCQkJY2FzZSBJU08yMDIyX0pQIDoKLQkJCQljYXNlIEpJU19IQUxGS0FOQSA6Ci0JCQkJCWNvZGUgPSBJU08yMDIyX0pQOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEVVQ19KUCA6Ci0JCQkJCWNvZGUgPSBFVUNfSlA7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQljb2RlID0gU0hJRlRfSklTOwotCQkJfQotCQl9Ci0JCXJldHVybiAoY29udmVydFRvSUFOQUVuY29kaW5nTmFtZShjb2RlKSk7Ci0JfQotCi0JLyoqCi0JICogR3Vlc3MgdGhlIGVuY29kaW5nLiBoYWxma2FuYV9mbGFnID0gMHgwMSAoIGRldGVjdCBTSklTIGhhbGYga2FuYSApCi0JICogaGFsZmthbmFfZmxhZyA9IDB4MDIgKCBkZXRlY3QgRVVDIGhhbGYga2FuYSApCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGd1ZXNzSmFwYW5lc2VLYW5qaUNvZGUoaW50IGNoMSwgaW50IGNoMiwgaW50IGNoMywgaW50IGhhbGZrYW5hX2ZsYWcpIHsKLQkJYm9vbGVhbiBzamlzX2hhbmtha3VfZmxhZyA9ICgoaGFsZmthbmFfZmxhZyAmIDB4MDEpICE9IDApID8gdHJ1ZSA6IGZhbHNlOwotCQlib29sZWFuIGV1Y19oYW5rYWt1X2ZsYWcgPSAoKGhhbGZrYW5hX2ZsYWcgJiAweDAyKSAhPSAwKSA/IHRydWUgOiBmYWxzZTsKLQotCQlpZiAoY2gxID09IDApCi0JCQlyZXR1cm4gVU5LTk9XTjsKLQkJaWYgKHNqaXNfaGFua2FrdV9mbGFnICYmIGNoMSA+PSAweGExICYmIGNoMSA8PSAweGRmKQotCQkJcmV0dXJuIFNKSVNfSEFMRktBTkE7Ci0JCWVsc2UgaWYgKGV1Y19oYW5rYWt1X2ZsYWcgJiYgY2gxID09IDB4OGUgJiYgY2gyID49IDB4YTEgJiYgY2gyIDw9IDB4ZGYpCi0JCQlyZXR1cm4gRVVDX0hBTEZLQU5BOwotCQllbHNlIGlmICgoKGt0eXBlW2NoMV0gJiBLVF9TRlQxKSAhPSAwKSAmJiAoKGt0eXBlW2NoMl0gJiBLVF9TRlQyKSAhPSAwKSkKLQkJCXJldHVybiBTSElGVF9KSVM7Ci0JCWVsc2UgaWYgKCgoa3R5cGVbY2gxXSAmIEtUX0VVQzEpICE9IDApICYmICgoa3R5cGVbY2gyXSAmIEtUX0VVQzIpICE9IDApKQotCQkJcmV0dXJuIEVVQ19KUDsKLQkJZWxzZSBpZiAoY2gxID09IDB4MWIgJiYgKChrdHlwZVtjaDJdICYgS1RfSklOKSAhPSAwKSkKLQkJCXJldHVybiBJU08yMDIyX0pQOwotCQllbHNlIGlmIChjaDEgPj0gMHhhMSAmJiBjaDEgPD0gMHhkZikKLQkJCXJldHVybiBTSklTX0hBTEZLQU5BOwotCQllbHNlIGlmIChjaDEgPT0gMHgxYiAmJiBjaDIgPT0gMHgyOC8qICcoJyAqLyYmIGNoMyA9PSAweDQ5LyogJ0knICovKQotCQkJcmV0dXJuIEpJU19IQUxGS0FOQTsKLQkJZWxzZSBpZiAoY2gxID09IDB4MWIgJiYgY2gyID09IDB4MjgvKiAnKCcgKi8mJiAoKGt0eXBlW2NoM10gJiBLVF9KT1VUKSAhPSAwKSkKLQkJCXJldHVybiBBU0NJSV9JTjsKLQotCQlyZXR1cm4gQVNDSUk7Ci0JfQotCi0JcHVibGljIEVuY29kaW5nR3Vlc3NlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTEhlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTcyN2Y4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0MSArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiA4LzE3LzEwIDM6MzcgUE0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDgvMTcvMTAgMzozNyBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9kZXYvd29ya3NwYWNlcy9oZWxpb3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmpGbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxIZWFkVG9rZW5pemVyIHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfTUVUQV9UQUcgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBVbkRlbGltaXRlZFN0cmluZyA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBEUV9TVFJJTkcgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBVbkRlbGltaXRlZENoYXJzZXQgPSAxNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1FfU1RSSU5HID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTERlY2wgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZSA9IDY7Ci0KLSAgLyoqCi0gICAqIFlZX0xFWFNUQVRFW2xdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqIFlZX0xFWFNUQVRFW2wrMV0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogICAgICAgICAgICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKiBsIGlzIG9mIHRoZSBmb3JtIGwgPSAyKmssIGsgYSBub24gbmVnYXRpdmUgaW50ZWdlcgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFlZX0xFWFNUQVRFW10gPSB7IAotICAgICAwLCAgMSwgIDIsICAyLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LCAgNywgIDgsIDgKLSAgfTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDFcMTFcMTBcMFwxXDZcMVw3XDJcMFwxXDEwXDIyXDBcMVw2XDFcMFwxXDQwIisKLSAgICAiXDJcMFwxXDQ2XDFcMFwxXDQ1XDVcMFwxXDM0XDFcMFwxXDQ0XDEzXDBcMVw0NyIrCi0gICAgIlwxXDEzXDFcMTJcMVwzMVwxXDE0XDFcMFwxXDIyXDFcMFwxXDI0XDFcMjZcMVwyMCIrCi0gICAgIlwxXDBcMVwzMFwxXDMyXDFcMjdcMlwwXDFcMTdcMVwxNlwxXDIzXDFcMjVcMVwzMyIrCi0gICAgIlwxXDM1XDFcNDJcMVw0M1wxXDIxXDFcMzZcMVwzN1wxXDBcMVwxNVwxXDQxXDdcMCIrCi0gICAgIlwxXDIyXDFcMFwxXDI0XDFcMjZcMVwyMFwxXDBcMVwzMFwxXDMyXDFcMjdcMlwwIisKLSAgICAiXDFcMTdcMVwxNlwxXDIzXDFcMjVcMVwzM1wxXDM1XDFcNDJcMVw0M1wxXDIxXDFcMzYiKwotICAgICJcMVwzN1wxXDBcMVwxNVwxXDQxXDEwMVwwXDFcNFwzXDBcMVw1XDE3XDBcMVwzIisKLSAgICAiXDE2XDBcMVwxXDIwXDBcMVwzXDE2XDBcMVwxXDFcMlwxNzBcMFwxXDJcdWZlODdcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIC8vcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgLy9wcml2YXRlIGludCB5eWNvbHVtbjsgCi0KLSAgLyoqIAotICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsKLQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLSAgLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfZW9mX2RvbmU7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0NoYXJzZXRBdHRyID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQlib29sZWFuIGZvdW5kQ29udGVudFR5cGVWYWx1ZSA9IGZhbHNlOwotCi0KLQotCXB1YmxpYyBIVE1MSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLQkgIAkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JICAJeXlfcmVhZGVyID0gaW47Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIAkJeXlfc3RhdGUgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICAJCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gIAkJIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAJCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgCQl5eV9tYXJrZWRQb3MgPSAwOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9jdXJyZW50UG9zID0gMDsKLQotICAJCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLSAgCQkvKiogCi0gIAkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gIAkJICogZnJvbSBpbnB1dCAKLSAgCQkgKi8KLSAgCQl5eV9lbmRSZWFkID0gMDsKLQotICAJCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCS8vIHl5bGluZSA9IDA7Ci0KLSAgCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWNoYXIgPSAwOwotCi0gIAkJLyoqCi0gIAkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgCQkgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gIAkJICovCi0gIAkJLy8geXljb2x1bW4gPSAwOyAKLQotICAJCS8qKiAKLSAgCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyAKLSAgCQkgKiBvZiBhIGxpbmUKLSAgCQkgKi8KLSAgCQl5eV9hdEJPTCA9IGZhbHNlOwotCi0gIAkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICAJCXl5X2F0RU9GID0gZmFsc2U7Ci0KLSAgCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCi0KLSAgCQlmU3RhdGVTdGFjay5jbGVhcigpOwotICAJCQotICAJCWhhc01vcmUgPSB0cnVlOwotICAJCWhhc0NoYXJzZXRBdHRyID0gZmFsc2U7Ci0gIAkJCi0JCS8vIGl0cyBhIGxpdHRsZSB3YXN0ZWZ1bCB0byAidGhyb3cgYXdheSIgZmlyc3QgY2hhciBhcnJheSBnZW5lcmF0ZWQKLQkJLy8gYnkgY2xhc3MgaW5pdCAodmlhIGF1dG8gZ2VuZXJhdGVkIGNvZGUpLCBidXQgd2UgcmVhbGx5IGRvIHdhbnQKLQkJLy8gYSBzbWFsbCBidWZmZXIgZm9yIG91ciBoZWFkIHBhcnNlcnMuCi0JCWlmICh5eV9idWZmZXIubGVuZ3RoICE9IE1BWF9UT19TQ0FOKSB7Ci0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltNQVhfVE9fU0NBTl07Ci0JCX0KLSAgCQkKLQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuVU5ERUZJTkVELCB5eWNoYXIsIHl5dGV4dCgpKTsKLQkJCXdoaWxlKHl5X2FkdmFuY2UoKSAhPSBZWUVPRikge30KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7Ci0JCQl2YWx1ZVRleHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7Ci0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQotCX0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNDaGFyc2V0QXR0cigpIHsKLQkJcmV0dXJuIGhhc0NoYXJzZXRBdHRyOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3BTdGF0ZSgpIHsKLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JfQotCXByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBuZXcgSGVhZFBhcnNlclRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0KTsKLQl9Ci0JCi0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBIVE1MSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBIVE1MSGVhZFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE4MCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICB0cnkgewotICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSA9IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkluc3RhbmNlOiAiICsgU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykgKyAiIG9mZnNldDoiICsgeXljaGFyICsgIiBzdGF0ZToiICsgeXlzdGF0ZSgpKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSArICJcbiIgKyBpc2UpOwotICAgICAgdGhyb3cgaXNlOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLQotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotICAgIGlmICgheXlfZW9mX2RvbmUpIHsKLSAgICAgIHl5X2VvZl9kb25lID0gdHJ1ZTsKLSAgICAJaGFzTW9yZT1mYWxzZTsKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotICAgIHl5X3B1c2hiYWNrUG9zID0gLTE7Ci0gICAgYm9vbGVhbiB5eV93YXNfcHVzaGJhY2s7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICB5eV9hdEJPTCA9IHl5X21hcmtlZFBvcyA8PSAwIHx8IHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MtMV0gPT0gJ1xuJzsKLSAgICAgIGlmICgheXlfYXRCT0wgJiYgeXlfYnVmZmVyW3l5X21hcmtlZFBvcy0xXSA9PSAnXHInKSB7Ci0gICAgICAgIHl5X2F0Qk9MID0geXlfYWR2YW5jZSgpICE9ICdcbic7Ci0gICAgICAgIGlmICgheXlfYXRFT0YpIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIGlmICh5eV9hdEJPTCkKLSAgICAgICAgeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlKzFdOwotICAgICAgZWxzZQotICAgICAgICB5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGVdOwotCi0gICAgICB5eV93YXNfcHVzaGJhY2sgPSBmYWxzZTsKLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eWNtYXBbeXlfaW5wdXRdOwotCi0gICAgICAgICAgYm9vbGVhbiB5eV9wdXNoYmFjayA9IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4geXlfaXNGaW5hbCA9IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4geXlfbm9Mb29rQWhlYWQgPSBmYWxzZTsKLQotICAgICAgICAgIHl5X2Zvck5leHQ6IHsgc3dpdGNoICh5eV9zdGF0ZSkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM2OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IAotICAgICAgICAgICAgICAgIGNhc2UgMzY6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzY6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzc6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM2OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDQwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IAotICAgICAgICAgICAgICAgIGNhc2UgMzc6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDQxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9wdXNoYmFja1BvcyA9IHl5X2N1cnJlbnRQb3M7IHl5X3B1c2hiYWNrID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OiB5eV9zdGF0ZSA9IDQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSA0NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB5eV9zdGF0ZSA9IDQ5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA1MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSA1MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSA1MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHl5X3N0YXRlID0gNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDU0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X3N0YXRlID0gNTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDU2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA2MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gNjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogeXlfc3RhdGUgPSA2MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM2OiB5eV9zdGF0ZSA9IDY0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDY1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHl5X3N0YXRlID0gNjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA2OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA3MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA3MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X3N0YXRlID0gNzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA3MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9zdGF0ZSA9IDcyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA3MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgICAgICAgICBjYXNlIDM2OiB5eV9zdGF0ZSA9IDc3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDc4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDc5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDgwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzc6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzY6IHl5X3N0YXRlID0gNzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogeXlfc3RhdGUgPSA4MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA4MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IAotICAgICAgICAgICAgICAgIGNhc2UgMzc6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDQxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzY6IHl5X3N0YXRlID0gNzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA4MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9wdXNoYmFjayA9IHRydWU7IHl5X3N0YXRlID0gODU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDg2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDQ4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHl5X3N0YXRlID0gNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB5eV9zdGF0ZSA9IDQ5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDg4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gODk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDUwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA1MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDUyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA1MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDUyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA5MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X3N0YXRlID0gNTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA1NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHl5X3N0YXRlID0gNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA1NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA5MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB5eV9zdGF0ZSA9IDkzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDU4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDU5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gNjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA1OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA5NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gNjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gOTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA5NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA2NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB5eV9zdGF0ZSA9IDY2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDY4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gNjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB5eV9zdGF0ZSA9IDY2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDk3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gOTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDY5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDk5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gMTAwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTAxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfc3RhdGUgPSA3MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDczOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X3N0YXRlID0gNzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDc4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDc5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNzk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTAzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDgyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfcHVzaGJhY2sgPSB0cnVlOyB5eV9zdGF0ZSA9IDg1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3B1c2hiYWNrID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfcHVzaGJhY2sgPSB0cnVlOyB5eV9zdGF0ZSA9IDg1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA4OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSAxMDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDUwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gNTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDU1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogeXlfc3RhdGUgPSA5MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogeXlfc3RhdGUgPSAxMDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDk2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEwOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9zdGF0ZSA9IDExMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gOTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHl5X3N0YXRlID0gMTEyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSAxMDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDExMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB5eV9zdGF0ZSA9IDExNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDcyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9wdXNoYmFjayA9IHRydWU7IHl5X3N0YXRlID0gODU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDg2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gMTA2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHl5X3N0YXRlID0gMTA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSAxMTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSAxMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDExOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB5eV9zdGF0ZSA9IDEyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB5eV9zdGF0ZSA9IDExMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTIxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzU6IHl5X3N0YXRlID0gMTIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHl5X3N0YXRlID0gMTE0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSAxMjQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSAxMTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfc3RhdGUgPSAxMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTIwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEyODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB5eV9zdGF0ZSA9IDEyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM1OiB5eV9zdGF0ZSA9IDEyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTMwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gMTMxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHl5X3N0YXRlID0gMTI0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSAxMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTM0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHl5X3N0YXRlID0gMTI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSAxMzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTMwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSAxMzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTMxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEzODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDEzOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDEzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTQwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X3N0YXRlID0gMTQxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDEzNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTQyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X3N0YXRlID0gMTQzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gMTM5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTM5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X3N0YXRlID0gMTQxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxNDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfc3RhdGUgPSAxNDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSAxNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE0ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxMzk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxNTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTUxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxNTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfc3RhdGUgPSAxNDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE1MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB5eV9zdGF0ZSA9IDE1NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDE0MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE1NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE1NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDEzOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE0NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTUyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTUxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHl5X3N0YXRlID0gMTU0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxNTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfc3RhdGUgPSAxNTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTU2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE1NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9zdGF0ZSA9IDE1OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDE1OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gMTYxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTU5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gMTYxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxNjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTYxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxNjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE2NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDE2NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9zdGF0ZSA9IDE2NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDE1OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTYxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTYzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gMTY1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X3N0YXRlID0gMTY2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTYzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gMTY1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X3N0YXRlID0gMTY2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxNjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE2ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9zdGF0ZSA9IDE2OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDE2NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTY3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gMTY1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxNzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSAxNjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE3MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDE3MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDE2NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDE3MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTczOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gMTc0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gMTc0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxNzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSAxNzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSAxNzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE3NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDE3ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDE3ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTc5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gMTgwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gMTgwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxODE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSAxODI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTgxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSAxODI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTgyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE4MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDE4NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDE4NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTg1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X3N0YXRlID0gMTg2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X3N0YXRlID0gMTg2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxODc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogeXlfc3RhdGUgPSAxODg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogeXlfc3RhdGUgPSAxODg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE4OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDE5MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDE5MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDE5MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTkyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X3N0YXRlID0gMTkzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxOTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSAxOTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTkyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxOTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfc3RhdGUgPSAxOTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE5NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDE5MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTk2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gMTk1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxOTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTk1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE5ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9zdGF0ZSA9IDE5OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDE5MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMjAwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gMTk1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHl5X3N0YXRlID0gMTk5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAyMDE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSAyMDI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxOTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSAyMDI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjAyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDIwMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDIwNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDIwNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMjA1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gMjA2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gMjA2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAyMDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSAyMDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSAyMDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjA4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDIwOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDIxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDIxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDIxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMjExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDIxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDIxMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDIxNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDIxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjE0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfSUxMRUdBTF9TVEFURSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gfQotCi0gICAgICAgICAgaWYgKCB5eV9pc0ZpbmFsICkgewotICAgICAgICAgICAgeXlfd2FzX3B1c2hiYWNrID0geXlfcHVzaGJhY2s7Ci0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyAKLSAgICAgICAgICAgIGlmICggeXlfbm9Mb29rQWhlYWQgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHl5X3dhc19wdXNoYmFjaykKLSAgICAgICAgeXlfbWFya2VkUG9zID0geXlfcHVzaGJhY2tQb3M7Ci0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICBjYXNlIDc2OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDIxNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgIGNhc2UgNzM6IAotICAgICAgICBjYXNlIDEwMjogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLSAgICAgICAgY2FzZSAyMTg6IGJyZWFrOwotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgY2FzZSA2NzogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyAgaWYgKGZvdW5kQ29udGVudFR5cGVWYWx1ZSkgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ0VuZDsgfQotICAgICAgICBjYXNlIDIxOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICBjYXNlIDg0OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDIyMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzE6IAotICAgICAgICBjYXNlIDEwMTogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyBpZiAoZm91bmRDb250ZW50VHlwZVZhbHVlKSBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnRW5kOyB9Ci0gICAgICAgIGNhc2UgMjIxOiBicmVhazsKLSAgICAgICAgY2FzZSA3OTogCi0gICAgICAgIGNhc2UgMTAzOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSAyMjI6IGJyZWFrOwotICAgICAgICBjYXNlIDEyNjogCi0gICAgICAgIGNhc2UgMTM0OiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fSB9Ci0gICAgICAgIGNhc2UgMjIzOiBicmVhazsKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgIGNhc2UgMTE6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICBjYXNlIDM3OiAKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgICAgeyBpZih5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9IH0KLSAgICAgICAgY2FzZSAyMjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDExNjogCi0gICAgICAgIGNhc2UgMTI1OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfTUVUQV9UQUcpOyByZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ1N0YXJ0OyB9Ci0gICAgICAgIGNhc2UgMjI1OiBicmVhazsKLSAgICAgICAgY2FzZSA1OTogCi0gICAgICAgIGNhc2UgOTQ6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyAgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDsgfQotICAgICAgICBjYXNlIDIyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEyOiAKLSAgICAgICAgY2FzZSAyMTQ6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgZm91bmRDb250ZW50VHlwZVZhbHVlPXRydWU7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnQ29udGVudFR5cGU7IH0KLSAgICAgICAgY2FzZSAyMjc6IGJyZWFrOwotICAgICAgICBjYXNlIDE0OTogCi0gICAgICAgIGNhc2UgMTU2OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nOyB9Ci0gICAgICAgIGNhc2UgMjI4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNDU6IAotICAgICAgICBjYXNlIDE1MTogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyBmb3VuZENvbnRlbnRUeXBlVmFsdWU9dHJ1ZTsgaGFzQ2hhcnNldEF0dHI9dHJ1ZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdDb250ZW50VHlwZTsgfQotICAgICAgICBjYXNlIDIyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgODc6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NOyB9Ci0gICAgICAgIGNhc2UgMjMwOiBicmVhazsKLSAgICAgICAgY2FzZSA0NDogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFOyB9Ci0gICAgICAgIGNhc2UgMjMxOiBicmVhazsKLSAgICAgICAgY2FzZSA0NTogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFOyB9Ci0gICAgICAgIGNhc2UgMjMyOiBicmVhazsKLSAgICAgICAgY2FzZSAzNjogCi0gICAgICAgIGNhc2UgODA6IAotICAgICAgICAgIHsgIHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMjMzOiBicmVhazsKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgIGNhc2UgMzU6IAotICAgICAgICBjYXNlIDM4OiAKLSAgICAgICAgICB7ICBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyAgfQotICAgICAgICBjYXNlIDIzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICBjYXNlIDc1OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7ICB9Ci0gICAgICAgIGNhc2UgMjM1OiBicmVhazsKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgIGNhc2UgNzQ6IAotICAgICAgICAgIHsgIHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgIH0KLSAgICAgICAgY2FzZSAyMzY6IGJyZWFrOwotICAgICAgICBjYXNlIDM5OiAKLSAgICAgICAgY2FzZSA4MzogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMjM3OiBicmVhazsKLSAgICAgICAgY2FzZSA0MjogCi0gICAgICAgIGNhc2UgODU6IAotICAgICAgICBjYXNlIDEwNDogCi0gICAgICAgICAgeyAgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFVuRGVsaW1pdGVkQ2hhcnNldCk7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7ICB9Ci0gICAgICAgIGNhc2UgMjM4OiBicmVhazsKLSAgICAgICAgY2FzZSA0MzogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKDEpOyBwb3BTdGF0ZSgpOyAgfQotICAgICAgICBjYXNlIDIzOTogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GOyB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjAwYjA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMgewotCi0JU3RyaW5nIE1ldGFUYWdFbmQgPSAiTWV0YVRhZ0VuZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTWV0YVRhZ1N0YXJ0ID0gIk1ldGFUYWdTdGFydCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTWV0YVRhZ0NvbnRlbnRUeXBlID0gIk1ldGFUYWdDb250ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVU5ERUZJTkVEID0gIlVOREVGSU5FRCI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hUTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc1NGZhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEhUTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciB7Ci0KLQlwcml2YXRlIEhUTUxIZWFkVG9rZW5pemVyIGZUb2tlbml6ZXI7Ci0KLQkvKioKLQkgKiBUaGVyZSBpcyBubyBzcGVjIGRlZmluZWQgZW5jb2RpbmcgZm9yIEhUTUwgKGhpc3RvcmljYWxseSksIHNvIG51bGwgaXMKLQkgKiByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0oU3RyaW5nIHRva2VuVHlwZSkgewotCQlib29sZWFuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IGZhbHNlOwotCQlpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldFVURjgzQnl0ZUJPTVVzZWQodHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkUgfHwgdG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEUpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkJCWJ5dGVbXSBib20gPSAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkUpID8gSUNvbnRlbnREZXNjcmlwdGlvbi5CT01fVVRGXzE2QkUgOiBJQ29udGVudERlc2NyaXB0aW9uLkJPTV9VVEZfMTZMRTsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0VW5pY29kZVN0cmVhbSh0cnVlKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0VW5pY29kZUJPTShib20pOwotCQl9Ci0JCXJldHVybiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW07Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0b2tlbml6ZXIuCi0JICovCi0JcHJpdmF0ZSBIVE1MSGVhZFRva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gd29yayBvbiAncmVzZXQnIGluIHRva2VuaXplciwgc28gbmV3IGluc3RhbmNlIGlzbid0Ci0JCS8vIGFsd2F5cyBuZWVkZWQKLQkJLy9pZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCWZUb2tlbml6ZXIgPSBuZXcgSFRNTEhlYWRUb2tlbml6ZXIoKTsKLQkJLy8JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTGVnYWxTdHJpbmcoU3RyaW5nIHZhbHVlVG9rZW5UeXBlKSB7Ci0JCWlmICh2YWx1ZVRva2VuVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlCi0JCQlyZXR1cm4gdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZUlucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY2hlY2tJbkNvbnRlbnQoKTsKLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJY2hlY2tIZXVyaXN0aWNzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrSGV1cmlzdGljcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gbm9IZXVyaXN0aWMgPSBmYWxzZTsKLQkJU3RyaW5nIGhldXJpc3RpY0VuY29kaW5nID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIucmVzZXQoKTsKLQkJCWZSZWFkZXIubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbQ29kZWRJTy5NQVhfTUFSS19TSVpFXTsKLQkJCWludCBuUmVhZCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZSZWFkZXIucmVhZHkoKSkgewotCQkJCQlpbnQgb25lQnl0ZSA9IGZSZWFkZXIucmVhZCgpOwotCQkJCQluUmVhZCsrOwotCQkJCQlpZiAob25lQnl0ZSA8PSAweEZGKSB7Ci0JCQkJCQlieXRlc1tpXSA9IChieXRlKSBvbmVCeXRlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbm9IZXVyaXN0aWMgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghbm9IZXVyaXN0aWMpIHsKLQkJCQloZXVyaXN0aWNFbmNvZGluZyA9IEVuY29kaW5nR3Vlc3Nlci5ndWVzc0VuY29kaW5nKGJ5dGVzLCBuUmVhZCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIGFueSBJTyBleGNlcHRpb24sIHRoZW4gbm90IGEgaGV1cmlzdGljIGNhc2UKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWZSZWFkZXIucmVzZXQoKTsKLQkJfQotCQlpZiAoaGV1cmlzdGljRW5jb2RpbmcgIT0gbnVsbCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGhldXJpc3RpY0VuY29kaW5nLCBFbmNvZGluZ01lbWVudG8uR1VFU1NFRF9FTkNPRElOR19GUk9NX1NUUkVBTSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0luQ29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUhUTUxIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQl0b2tlbml6ZXIucmVzZXQoZlJlYWRlcik7Ci0JCUhlYWRQYXJzZXJUb2tlbiB0b2tlbiA9IG51bGw7Ci0JCVN0cmluZyB0b2tlblR5cGUgPSBudWxsOwotCQlTdHJpbmcgY29udGVudFR5cGVWYWx1ZSA9IG51bGw7Ci0JCWRvIHsKLQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJdG9rZW5UeXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCQkJaWYgKGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSh0b2tlblR5cGUpKSB7Ci0JCQkJLy8gc2lkZSBlZmZlY3Qgb2YgY2FuSGFuZGxlIGlzIHRvIGNyZWF0ZSBhcHByb3ByaWF0ZQotCQkJCS8vIG1lbWVudG8KLQkJCX0KLQkJCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnQ29udGVudFR5cGUpIHsKLQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlIZWFkUGFyc2VyVG9rZW4gdmFsdWVUb2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCQkJU3RyaW5nIHZhbHVlVG9rZW5UeXBlID0gdmFsdWVUb2tlbi5nZXRUeXBlKCk7Ci0JCQkJCWlmIChpc0xlZ2FsU3RyaW5nKHZhbHVlVG9rZW5UeXBlKSkgewotCQkJCQkJY29udGVudFR5cGVWYWx1ZSA9IHZhbHVlVG9rZW4uZ2V0VGV4dCgpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSk7Ci0JCWlmIChjb250ZW50VHlwZVZhbHVlICE9IG51bGwpIHsKLQkJCWlmICh0b2tlbml6ZXIuaGFzQ2hhcnNldEF0dHIoKSkgewotCQkJCWNvbnRlbnRUeXBlVmFsdWUgPSBjb250ZW50VHlwZVZhbHVlLnRyaW0oKTsKLQkJCQlpZiAoY29udGVudFR5cGVWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGNvbnRlbnRUeXBlVmFsdWUsIEVuY29kaW5nTWVtZW50by5GT1VORF9FTkNPRElOR19JTl9DT05URU5UKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJzZUNvbnRlbnRUeXBlVmFsdWUoY29udGVudFR5cGVWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VDb250ZW50VHlwZVZhbHVlKFN0cmluZyBjb250ZW50VHlwZSkgewotCQlTdHJpbmcgY2hhcnNldCA9IG51bGw7Ci0JCVBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiO1xccypjaGFyc2V0XFxzKj1cXHMqIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nW10gcGFydHMgPSBwYXR0ZXJuLnNwbGl0KGNvbnRlbnRUeXBlKTsKLQkJaWYgKHBhcnRzLmxlbmd0aCA+IDApIHsKLQkJCS8vIGlmIG9ubHkgb25lIGl0ZW0sIGl0IGNhbiBzdGlsbCBiZSBjaGFyc2V0IGluc3RlYWQgb2YKLQkJCS8vIGNvbnRlbnRUeXBlCi0JCQlpZiAocGFydHMubGVuZ3RoID09IDEpIHsKLQkJCQlpZiAocGFydHNbMF0ubGVuZ3RoKCkgPiA2KSB7Ci0JCQkJCVN0cmluZyBjaGVja0ZvckNoYXJzZXQgPSBwYXJ0c1swXS5zdWJzdHJpbmcoMCwgNyk7Ci0JCQkJCWlmIChjaGVja0ZvckNoYXJzZXQuZXF1YWxzSWdub3JlQ2FzZSgiY2hhcnNldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWludCBlcXBvcyA9IHBhcnRzWzBdLmluZGV4T2YoJz0nKTsKLQkJCQkJCWVxcG9zID0gZXFwb3MgKyAxOwotCQkJCQkJaWYgKGVxcG9zIDwgcGFydHNbMF0ubGVuZ3RoKCkpIHsKLQkJCQkJCQljaGFyc2V0ID0gcGFydHNbMF0uc3Vic3RyaW5nKGVxcG9zKTsKLQkJCQkJCQljaGFyc2V0ID0gY2hhcnNldC50cmltKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvL2ZDb250ZW50VHlwZSA9IHBhcnRzWzBdOwotCQkJfQotCQl9Ci0JCWlmIChwYXJ0cy5sZW5ndGggPiAxKSB7Ci0JCQljaGFyc2V0ID0gcGFydHNbMV0udHJpbSgpOwotCQl9Ci0JCQotCQlpZiAoY2hhcnNldCAhPSBudWxsICYmIGNoYXJzZXQubGVuZ3RoKCkgPiAwKSB7Ci0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oY2hhcnNldCwgRW5jb2RpbmdNZW1lbnRvLkZPVU5EX0VOQ09ESU5HX0lOX0NPTlRFTlQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MTkwYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBIZWFkUGFyc2VyVG9rZW4gewotCXByaXZhdGUgaW50IGZTdGFydDsKLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0OwotCXByaXZhdGUgU3RyaW5nIGZUeXBlOwotCi0JcHJvdGVjdGVkIEhlYWRQYXJzZXJUb2tlbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSGVhZFBhcnNlclRva2VuKFN0cmluZyB0eXBlLCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMoKTsKLQkJZlR5cGUgPSB0eXBlOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHQgPSB0ZXh0OwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICgidGV4dDogIiArIGZUZXh0ICsgIiBvZmZzZXQ6ICIgKyBmU3RhcnQgKyAiIHR5cGU6ICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4ZjJmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotLyoKLSAqIAotICogQSBub24tcmVzaXphYmxlIGNsYXNzIGltcGxlbWVudGluZyB0aGUgYmVoYXZpb3Igb2YgamF2YS51dGlsLlN0YWNrLCBidXQKLSAqIGRpcmVjdGx5IGZvciB0aGUgPGNvZGU+IGludGVnZXIgPC9jb2RlPiBwcmltaXRpdmUuCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEludFN0YWNrIHsKLQlwcml2YXRlIGludFtdIGxpc3QgPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgc2l6ZSA9IDA7Ci0KLQlwdWJsaWMgSW50U3RhY2soKSB7Ci0JCXRoaXMoMTAwKTsKLQl9Ci0KLQlwdWJsaWMgSW50U3RhY2soaW50IG1heGRlcHRoKSB7Ci0JCXN1cGVyKCk7Ci0JCWxpc3QgPSBuZXcgaW50W21heGRlcHRoXTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW1wdHkoKSB7Ci0JCXJldHVybiBzaXplID09IDA7Ci0JfQotCi0JcHVibGljIGludCBnZXQoaW50IHNsb3QpIHsKLQkJcmV0dXJuIGxpc3Rbc2xvdF07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKLQkJCWxpc3RbaV0gPSAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aG91dCByZW1vdmluZyBpdAotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcGVlaygpIHsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBsaXN0W3NpemUgLSAxXTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBvcCgpIHsKLQkJaW50IHZhbHVlID0gcGVlaygpOwotCQlsaXN0W3NpemUgLSAxXSA9IC0xOwotCQlzaXplLS07Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQdXNoZXMgYW4gaXRlbSBvbnRvIHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUgLQotCSAqICAgICAgICAgICAgdGhlIGludCB0byBiZSBwdXNoZWQgb250byB0aGlzIHN0YWNrLgotCSAqIEByZXR1cm4gdGhlIDxjb2RlPm5ld1ZhbHVlPC9jb2RlPiBhcmd1bWVudC4KLQkgKi8KLQlwdWJsaWMgaW50IHB1c2goaW50IG5ld1ZhbHVlKSB7Ci0JCWlmIChzaXplID09IGxpc3QubGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgU3RhY2tPdmVyZmxvd0Vycm9yKCk7Ci0JCX0KLQkJbGlzdFtzaXplKytdID0gbmV3VmFsdWU7Ci0JCXJldHVybiBuZXdWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiIgK3NpemUgKyAiIFsiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXMuYXBwZW5kKGxpc3RbaV0pOwotCQkJaWYoaSA8IHNpemUgLSAxKSB7Ci0JCQkJcy5hcHBlbmQoIiwgIik7Ci0JCQl9Ci0JCX0KLQkJcy5hcHBlbmQoIl0iKTsKLQkJcmV0dXJuIHMudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9OdWxsTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTI0YzMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9OdWxsTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Ob25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzOwotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIGFuIEVuY29kaW5nTWVtZW50byAoaXRzIHN1cGVyIGNsYXNzKSwKLSAqIHdoZW4gdGhlcmUgaXMgbm90IGluIGZhY3QgQU5ZIGVuY29kaW5nIGluZm9ybWF0aW9uLiBGb3IgZXhhbXBsZSwgd2hlbiBhCi0gKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgY3JlYXRlZCBkaXJlY3RseSBmcm9tIGEgU3RyaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsTWVtZW50byBleHRlbmRzIEVuY29kaW5nTWVtZW50byB7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBOdWxsTWVtZW50bygpIHsKLQkJc3VwZXIoKTsKLQkJU3RyaW5nIGRlZmF1bHRDaGFyc2V0ID0gTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy51c2VEZWZhdWx0TmFtZVJ1bGVzKG51bGwpOwotCQlzZXRKYXZhQ2hhcnNldE5hbWUoZGVmYXVsdENoYXJzZXQpOwotCQlzZXRBcHByb3ByaWF0ZURlZmF1bHQoZGVmYXVsdENoYXJzZXQpOwotCQlzZXREZXRlY3RlZENoYXJzZXROYW1lKG51bGwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTVN0eWxlTW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NU3R5bGVNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMyZGUzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NU3R5bGVNb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRPTU1vZGVsSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGRhdmlkdwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBET01TdHlsZU1vZGVsSW1wbCBleHRlbmRzIERPTU1vZGVsSW1wbCB7Ci0JcHVibGljIERPTVN0eWxlTW9kZWxJbXBsKCkgewotCQkvLyByZW1lbWJlciwgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQgaW4gc3VwZXIgY29uc3RydWN0b3IsIAotCQkvLyB2aWEgaW50ZXJuYWxDcmVhdGVEb2N1bWVudAotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tRWRpdCgpIHsKLQkJcmVsZWFzZVN0eWxlU2hlZXRzKCk7Ci0JCXN1cGVyLnJlbGVhc2VGcm9tRWRpdCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQkJcmVsZWFzZVN0eWxlU2hlZXRzKCk7Ci0JCXN1cGVyLnJlbGVhc2VGcm9tUmVhZCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWxlYXNlU3R5bGVTaGVldHMoKSB7Ci0JCWlmICghaXNTaGFyZWQoKSkgewotCQkJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2MgaW5zdGFuY2VvZiBEb2N1bWVudFN0eWxlSW1wbCkgewotCQkJCSgoRG9jdW1lbnRTdHlsZUltcGwpIGRvYykucmVsZWFzZVN0eWxlU2hlZXRzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVEb2N1bWVudCBtZXRob2QKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50IGludGVybmFsQ3JlYXRlRG9jdW1lbnQoKSB7Ci0JCURvY3VtZW50U3R5bGVJbXBsIGRvY3VtZW50ID0gbmV3IERvY3VtZW50U3R5bGVJbXBsKCk7Ci0JCWRvY3VtZW50LnNldE1vZGVsKHRoaXMpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFN0eWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50U3R5bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZmIxNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50U3R5bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1TdHlsZS9zdHlsZXNoZWV0cy5odG1sI1N0eWxlU2hlZXRzLVN0eWxlU2hlZXQtRG9jdW1lbnRTdHlsZQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRMaXN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkRvY3VtZW50Q1NTOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0OwotCi0vKioKLSAqIEBhdXRob3IgZGF2aWR3Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50U3R5bGVJbXBsIGV4dGVuZHMgRG9jdW1lbnRJbXBsIGltcGxlbWVudHMgSURPTURvY3VtZW50LCBEb2N1bWVudENTUyB7Ci0JcHVibGljIERvY3VtZW50U3R5bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBEb2N1bWVudFN0eWxlSW1wbChEb2N1bWVudEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRPdmVycmlkZVN0eWxlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpIHsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIpIGFkYXB0ZXIpLmdldE92ZXJyaWRlU3R5bGUoZWxlbWVudCwgcHNldWRvTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0eWxlU2hlZXRMaXN0IGdldFN0eWxlU2hlZXRzKCkgewotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuICgoSVN0eWxlU2hlZXRMaXN0QWRhcHRlcikgYWRhcHRlcikuZ2V0U3R5bGVTaGVldHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlU3R5bGVTaGVldHMoKSB7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0RXhpc3RpbmdBZGFwdGVyKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkoKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIpIGFkYXB0ZXIpLnJlbGVhc2VTdHlsZVNoZWV0cygpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUVsZW1lbnQgbWV0aG9kCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIHRhZ05hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQljaGVja1RhZ05hbWVWYWxpZGl0eSh0YWdOYW1lKTsKLQotCQlFbGVtZW50U3R5bGVJbXBsIGVsZW1lbnQgPSBuZXcgRWxlbWVudFN0eWxlSW1wbCgpOwotCQllbGVtZW50LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWVsZW1lbnQuc2V0VGFnTmFtZSh0YWdOYW1lKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCURvY3VtZW50U3R5bGVJbXBsIGNsb25lZCA9IG5ldyBEb2N1bWVudFN0eWxlSW1wbCh0aGlzKTsKLQkJaWYgKGRlZXApCi0JCQljbG9uZWQuaW1wb3J0Q2hpbGROb2Rlcyh0aGlzLCB0cnVlKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbChJRE9NTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIuc2V0TW9kZWwobW9kZWwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbGVtZW50U3R5bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRWxlbWVudFN0eWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGUwM2I3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbGVtZW50U3R5bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuRWxlbWVudENTU0lubGluZVN0eWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLkxpbmtTdHlsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0OwotCi1wdWJsaWMgY2xhc3MgRWxlbWVudFN0eWxlSW1wbCBleHRlbmRzIEVsZW1lbnRJbXBsIGltcGxlbWVudHMgSURPTUVsZW1lbnQsIEVsZW1lbnRDU1NJbmxpbmVTdHlsZSwgTGlua1N0eWxlIHsKLQlwdWJsaWMgRWxlbWVudFN0eWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudFN0eWxlSW1wbChFbGVtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXB1YmxpYyBTdHlsZVNoZWV0IGdldFNoZWV0KCkgewotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgSVN0eWxlU2hlZXRBZGFwdGVyKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKChJU3R5bGVTaGVldEFkYXB0ZXIpIGFkYXB0ZXIpLmdldFNoZWV0KCk7Ci0JfQotCi0JcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0U3R5bGUoKSB7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlckZvcihJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKElTdHlsZURlY2xhcmF0aW9uQWRhcHRlcikgYWRhcHRlcikuZ2V0U3R5bGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWdOYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXN1cGVyLnNldFRhZ05hbWUodGFnTmFtZSk7Ci0JfQotCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlFbGVtZW50SW1wbCBjbG9uZWQgPSBuZXcgRWxlbWVudFN0eWxlSW1wbCh0aGlzKTsKLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MQ29udmVydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWNmY2MxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNsZWFudXAuSFRNTENsZWFudXBQcm9jZXNzb3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEhUTUxDb252ZXJ0ZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxDb252ZXJ0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwTW9kZWwoSURPTU1vZGVsIG1vZGVsKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUhUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbCBwcm9jZXNzb3IgPSBuZXcgSFRNTENsZWFudXBQcm9jZXNzb3JJbXBsKCk7Ci0JCUlTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIHByZWYgPSBwcm9jZXNzb3IuZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gYmFja3VwIG9wdGlvbnMKLQkJYm9vbGVhbiBjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MgPSBwcmVmLmdldENvbXByZXNzRW1wdHlFbGVtZW50VGFncygpOwotCQlib29sZWFuIGluc2VydFJlcXVpcmVkQXR0cnMgPSBwcmVmLmdldEluc2VydFJlcXVpcmVkQXR0cnMoKTsKLQkJYm9vbGVhbiBpbnNlcnRNaXNzaW5nVGFncyA9IHByZWYuZ2V0SW5zZXJ0TWlzc2luZ1RhZ3MoKTsKLQkJYm9vbGVhbiBxdW90ZUF0dHJWYWx1ZXMgPSBwcmVmLmdldFF1b3RlQXR0clZhbHVlcygpOwotCQlib29sZWFuIGZvcm1hdFNvdXJjZSA9IHByZWYuZ2V0Rm9ybWF0U291cmNlKCk7Ci0JCWludCB0YWdOYW1lQ2FzZSA9IHByZWYuZ2V0VGFnTmFtZUNhc2UoKTsKLQkJaW50IGF0dHJOYW1lQ2FzZSA9IHByZWYuZ2V0QXR0ck5hbWVDYXNlKCk7Ci0KLQkJLy8gc2V0dXAgb3B0aW9ucwotCQlwcmVmLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyh0cnVlKTsKLQkJcHJlZi5zZXRJbnNlcnRSZXF1aXJlZEF0dHJzKHRydWUpOwotCQlwcmVmLnNldEluc2VydE1pc3NpbmdUYWdzKHRydWUpOwotCQlwcmVmLnNldFF1b3RlQXR0clZhbHVlcyh0cnVlKTsKLQkJcHJlZi5zZXRGb3JtYXRTb3VyY2UoZmFsc2UpOwotCQlpZiAobW9kZWwuZ2V0RG9jdW1lbnQoKS5pc1hNTFR5cGUoKSkgeyAvLyBYSFRNTAotCQkJcHJlZi5zZXRUYWdOYW1lQ2FzZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCQlwcmVmLnNldEF0dHJOYW1lQ2FzZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwcmVmLnNldFRhZ05hbWVDYXNlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCQkJcHJlZi5zZXRBdHRyTmFtZUNhc2UoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVNJUyk7Ci0JCX0KLQotCQlwcm9jZXNzb3IuY2xlYW51cE1vZGVsKG1vZGVsKTsKLQotCQkvLyBzZXQgYmFjayBvcHRpb25zCi0JCXByZWYuc2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKGNvbXByZXNzRW1wdHlFbGVtZW50VGFncyk7Ci0JCXByZWYuc2V0SW5zZXJ0UmVxdWlyZWRBdHRycyhpbnNlcnRSZXF1aXJlZEF0dHJzKTsKLQkJcHJlZi5zZXRJbnNlcnRNaXNzaW5nVGFncyhpbnNlcnRNaXNzaW5nVGFncyk7Ci0JCXByZWYuc2V0UXVvdGVBdHRyVmFsdWVzKHF1b3RlQXR0clZhbHVlcyk7Ci0JCXByZWYuc2V0Rm9ybWF0U291cmNlKGZvcm1hdFNvdXJjZSk7Ci0JCXByZWYuc2V0VGFnTmFtZUNhc2UodGFnTmFtZUNhc2UpOwotCQlwcmVmLnNldEF0dHJOYW1lQ2FzZShhdHRyTmFtZUNhc2UpOwotCX0KLQotCS8qKgotCSAqIGRlY2xhcmF0b2luOiAiZGF0YSIgZm9yIFhNTCBkZWNsYXJhdGlvbiwgc3VjaCBhcyAidmVyc2lvbj1cIjEuMFwiIgotCSAqIHB1YmxpY0lkOiBwdWJsaWNJZCBmb3IgRE9DVFlQRSBkZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnZlcnQoSURPTU1vZGVsIG1vZGVsLCBTdHJpbmcgZGVjbGFyYXRpb24sIFN0cmluZyBwdWJsaWNJZCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc2V0RGVjbGFyYXRpb24obW9kZWwsIGRlY2xhcmF0aW9uLCBwdWJsaWNJZCk7Ci0JCWNsZWFudXBNb2RlbChtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogZGVjbGFyYXRvaW46ICJkYXRhIiBmb3IgWE1MIGRlY2xhcmF0aW9uLCBzdWNoIGFzICJ2ZXJzaW9uPVwiMS4wXCIiCi0JICogcHVibGljSWQ6IHB1YmxpY0lkIGZvciBET0NUWVBFIGRlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY29udmVydChJbnB1dFN0cmVhbSBpbnB1dCwgT3V0cHV0U3RyZWFtIG91dHB1dCwgU3RyaW5nIGRlY2xhcmF0aW9uLCBTdHJpbmcgcHVibGljSWQpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlET01Nb2RlbCBtb2RlbCA9IHJlYWRNb2RlbChpbnB1dCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJY29udmVydChtb2RlbCwgZGVjbGFyYXRpb24sIHB1YmxpY0lkKTsKLQkJCXdyaXRlTW9kZWwobW9kZWwsIG91dHB1dCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGRlY2xhcmF0b2luOiAiZGF0YSIgZm9yIFhNTCBkZWNsYXJhdGlvbiwgc3VjaCBhcyAidmVyc2lvbj1cIjEuMFwiIgotCSAqIHB1YmxpY0lkOiBwdWJsaWNJZCBmb3IgRE9DVFlQRSBkZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnZlcnQoSUZpbGUgZmlsZSwgU3RyaW5nIGRlY2xhcmF0aW9uLCBTdHJpbmcgcHVibGljSWQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlET01Nb2RlbCBtb2RlbCA9IHJlYWRNb2RlbChmaWxlKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQljb252ZXJ0KG1vZGVsLCBkZWNsYXJhdGlvbiwgcHVibGljSWQpOwotCQkJd3JpdGVNb2RlbChtb2RlbCwgZmlsZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5zZXJ0QnJlYWsoSURPTU1vZGVsIG1vZGVsLCBOb2RlIG5vZGUpIHsKLQkJaWYgKG1vZGVsID09IG51bGwgfHwgbm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJcmV0dXJuOwotCi0JCS8vIGdldCBkZWxpbWl0ZXIgc3RyaW5nCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGRlbGltID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJaWYgKGRlbGltID09IG51bGwgfHwgZGVsaW0ubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlUZXh0IHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkZWxpbSk7Ci0JCXBhcmVudC5pbnNlcnRCZWZvcmUodGV4dCwgbm9kZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJRE9NTW9kZWwgcmVhZE1vZGVsKElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQlpZiAoaW5wdXQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBjcmVhdGUgdGVtcG9yYXJ5IG1vZGVsCi0JCVN0cmluZyBpZCA9IGlucHV0LnRvU3RyaW5nKCkgKyAiLmh0bWwiOyAvLyROT04tTkxTLTEkCi0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yRWRpdChpZCwgaW5wdXQsIG51bGwpOwotCQlpZiAoIShtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkpIHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChJRE9NTW9kZWwpIG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSURPTU1vZGVsIHJlYWRNb2RlbChJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQkJaWYgKCEobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpKSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSURPTU1vZGVsKSBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWNsYXJhdGlvbihJRE9NTW9kZWwgbW9kZWwsIFN0cmluZyBkZWNsYXJhdGlvbiwgU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0cnkgewotCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCVByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSA9IG51bGw7Ci0JCQlOb2RlIGNoaWxkID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgewotCQkJCVN0cmluZyB0YXJnZXQgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJCWlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQuZXF1YWxzKCJ4bWwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgY2hpbGQ7Ci0JCQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlJRE9NRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSAoSURPTURvY3VtZW50VHlwZSkgZG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotCi0JCQlpZiAoZGVjbGFyYXRpb24gIT0gbnVsbCkgewotCQkJCWlmIChwaSAhPSBudWxsKSB7Ci0JCQkJCXBpLnNldERhdGEoZGVjbGFyYXRpb24pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGkgPSBkb2N1bWVudC5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oInhtbCIsIGRlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlkb2N1bWVudC5pbnNlcnRCZWZvcmUocGksIGNoaWxkKTsKLQkJCQkJaW5zZXJ0QnJlYWsobW9kZWwsIGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChwdWJsaWNJZCAhPSBudWxsKSB7Ci0JCQkJSFRNTERvY3VtZW50VHlwZUVudHJ5IGVudHJ5ID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RW50cnkocHVibGljSWQpOwotCQkJCVN0cmluZyBuYW1lID0gKGVudHJ5ICE9IG51bGwgPyBlbnRyeS5nZXROYW1lKCkgOiBudWxsKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCQkJbmFtZSA9ICJIVE1MIjsgLy8gZGVmYXVsdCAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGRvY1R5cGUgIT0gbnVsbCkgewotCQkJCQlpZiAoIW5hbWUuZXF1YWxzKGRvY1R5cGUuZ2V0TmFtZSgpKSkgeyAvLyByZXBsYWNlCi0JCQkJCQlOb2RlIHBhcmVudCA9IGRvY1R5cGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJY2hpbGQgPSBkb2NUeXBlOwotCQkJCQkJZG9jVHlwZSA9IChJRE9NRG9jdW1lbnRUeXBlKSBkb2N1bWVudC5jcmVhdGVEb2N0eXBlKG5hbWUpOwotCQkJCQkJcGFyZW50Lmluc2VydEJlZm9yZShkb2NUeXBlLCBjaGlsZCk7Ci0JCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkb2NUeXBlID0gKElET01Eb2N1bWVudFR5cGUpIGRvY3VtZW50LmNyZWF0ZURvY3R5cGUobmFtZSk7Ci0JCQkJCWRvY3VtZW50Lmluc2VydEJlZm9yZShkb2NUeXBlLCBjaGlsZCk7Ci0JCQkJCWluc2VydEJyZWFrKG1vZGVsLCBjaGlsZCk7Ci0JCQkJfQotCQkJCWRvY1R5cGUuc2V0UHVibGljSWQocHVibGljSWQpOwotCQkJCWlmIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBzeXN0ZW1JZCA9IGVudHJ5LmdldFN5c3RlbUlkKCk7Ci0JCQkJCWlmIChzeXN0ZW1JZCAhPSBudWxsKQotCQkJCQkJZG9jVHlwZS5zZXRTeXN0ZW1JZChzeXN0ZW1JZCk7Ci0JCQkJCVN0cmluZyBuYW1lc3BhY2VVUkkgPSBlbnRyeS5nZXROYW1lc3BhY2VVUkkoKTsKLQkJCQkJaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0JCQkJCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCQllbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnMiLCBuYW1lc3BhY2VVUkkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCB3cml0ZU1vZGVsKElET01Nb2RlbCBtb2RlbCwgT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vZGVsID09IG51bGwgfHwgb3V0cHV0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLnNhdmUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgd3JpdGVNb2RlbChJRE9NTW9kZWwgbW9kZWwsIElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb2RlbCA9PSBudWxsIHx8IGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvL0J5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQgPSBudWxsOwotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvL291dHB1dCA9IG5ldwotCQkJLy8gQnl0ZUFycmF5T3V0cHV0U3RyZWFtKHN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSk7Ci0JCQltb2RlbC5zYXZlKCk7Ci0JCQkvL2lucHV0ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dC50b0J5dGVBcnJheSgpKTsKLQkJCS8vZmlsZS5zZXRDb250ZW50cyhpbnB1dCwgdHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLwkJCWlmIChvdXRwdXQgIT0gbnVsbCkKLQkJCS8vCQkJCW91dHB1dC5jbG9zZSgpOwotCQkJaWYgKGlucHV0ICE9IG51bGwpCi0JCQkJaW5wdXQuY2xvc2UoKTsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlMjU5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXIgZXh0ZW5kcyBEb2N1bWVudFR5cGVBZGFwdGVySW1wbCBpbXBsZW1lbnRzIEhUTUxEb2N1bWVudFR5cGVDb25zdGFudHMgewotCi0JcHJpdmF0ZSBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkgZkZhY3RvcnkgPSBudWxsOwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUVudHJ5IGVudHJ5ID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxUeXBlID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTCA9ICJ4bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFhIVE1MID0gInhodG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBXTUwgPSAid21sIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyKElET01Eb2N1bWVudCBkb2N1bWVudCwgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIoZG9jdW1lbnQpOwotCi0JCXRoaXMuZkZhY3RvcnkgPSBmYWN0b3J5OwotCi0JCS8vIGluaXRpYWxpemUKLQkJZG9jdW1lbnRUeXBlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBkb2N1bWVudFR5cGVDaGFuZ2VkKCkgewotCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJSURPTU1vZGVsIG1vZGVsID0gZG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUobW9kZWwpOwotCi0JCS8vIGZpbmQgRE9DVFlQRSBkZWxjYXJhdGlvbiBhbmQgUHVibGljIElECi0JCVN0cmluZyBwdWJsaWNJZCA9IG51bGw7Ci0JCVN0cmluZyBzeXN0ZW1JZCA9IG51bGw7Ci0JCURvY3VtZW50VHlwZSBuZXdEb2N1bWVudFR5cGUgPSBmaW5kRG9jdW1lbnRUeXBlKGRvY3VtZW50KTsKLQkJaWYgKG5ld0RvY3VtZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlwdWJsaWNJZCA9IG5ld0RvY3VtZW50VHlwZS5nZXRQdWJsaWNJZCgpOwotCQkJc3lzdGVtSWQgPSBuZXdEb2N1bWVudFR5cGUuZ2V0U3lzdGVtSWQoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGxvb2t1cCBkZWZhdWx0IHNldCBieSBjb250ZW50c2V0dGluZ3MKLQkJCXB1YmxpY0lkID0gSFRNTENvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEhUTUxDb250ZW50UHJvcGVydGllcy5ET0NVTUVOVF9UWVBFLCBmaWxlLCB0cnVlKTsKLQkJfQotCi0JCS8vIGxvb2t1cCBET0NUWVBFIHJlZ2lzdHJ5Ci0JCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBuZXdFbnRyeSA9IG51bGw7Ci0JCWlmIChwdWJsaWNJZCAhPSBudWxsKSB7Ci0JCQluZXdFbnRyeSA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEVudHJ5KHB1YmxpY0lkKTsKLQkJfQotCQllbHNlIGlmIChzeXN0ZW1JZCA9PSBudWxsKXsKLQkJCQluZXdFbnRyeSA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERlZmF1bHRFbnRyeShIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuREVGQVVMVF9IVE1MNSk7Ci0JCX0KLQotCQlib29sZWFuIG5ld1hNTFR5cGUgPSAobmV3RW50cnkgIT0gbnVsbCA/IG5ld0VudHJ5LmlzWE1MVHlwZSgpIDogZmFsc2UpOwotCQlib29sZWFuIG5ld1dNTFR5cGUgPSAobmV3RW50cnkgIT0gbnVsbCA/IG5ld0VudHJ5LmlzV01MVHlwZSgpIDogZmFsc2UpOwotCi0JCWlmICghbmV3WE1MVHlwZSkgewotCQkJLy8gZmluZCBYTUwgZGVjbGFyYXRpb24KLQkJCWlmIChmaW5kWE1MTm9kZShkb2N1bWVudCkgIT0gbnVsbCkgewotCQkJCW5ld1hNTFR5cGUgPSB0cnVlOwotCQkJfQotCi0JCQkvLyBjaGVjayBmaWxlIGV4dGVuc2lvbgotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBleHQgPSBmaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCQlpZiAoZXh0ICE9IG51bGwgJiYgZXh0LmVxdWFsc0lnbm9yZUNhc2UoWEhUTUwpKSB7Ci0JCQkJCW5ld1hNTFR5cGUgPSB0cnVlOwotCQkJCX0KLQotCQkJCWlmIChleHQgIT0gbnVsbCAmJiBleHQuZXF1YWxzSWdub3JlQ2FzZShXTUwpKSB7Ci0JCQkJCW5ld1hNTFR5cGUgPSB0cnVlOwotCQkJCQluZXdXTUxUeXBlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCWlmIChuZXdFbnRyeSA9PSBudWxsKSB7Ci0JCQkvLyBsb29rdXAgc3lzdGVtIGRlZmF1bHQKLQkJCWlmIChuZXdYTUxUeXBlICYmIG5ld0RvY3VtZW50VHlwZSA9PSBudWxsKSB7Ci0JCQkJLy8gdXNlIGRlZmF1bHQgWEhUTUwsIGlmIGl0J3MgWE1MIGFuZCBubyBkb2N1bWVudCB0eXBlCi0JCQkJLy8gZGVjbGFyZWQKLQkJCQlpZiAobmV3V01MVHlwZSkKLQkJCQkJbmV3RW50cnkgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0RW50cnkoSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LkRFRkFVTFRfV01MKTsKLQkJCQllbHNlCi0JCQkJCW5ld0VudHJ5ID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RGVmYXVsdEVudHJ5KEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5ERUZBVUxUX1hIVE1MKTsKLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3RW50cnkgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0RW50cnkoSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LkRFRkFVTFRfSFRNTCk7Ci0JCQl9Ci0JCQlpZiAobmV3RW50cnkgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCX0KLQotCQlpZiAobmV3RG9jdW1lbnRUeXBlID09IG51bGwpIHsKLQkJCURvY3VtZW50VHlwZSBvbGREb2N1bWVudFR5cGUgPSBnZXREb2N1bWVudFR5cGUoKTsKLQkJCWlmIChvbGREb2N1bWVudFR5cGUgPT0gbnVsbCB8fCBvbGREb2N1bWVudFR5cGUuZ2V0TmFtZSgpICE9IG5ld0VudHJ5LmdldE5hbWUoKSkgewotCQkJCS8vIGNyZWF0ZSBpbXBsaWNpdCBEb2N1bWVudFR5cGUKLQkJCQlET01JbXBsZW1lbnRhdGlvbiBpbXBsID0gZG9jdW1lbnQuZ2V0SW1wbGVtZW50YXRpb24oKTsKLQkJCQlpZiAoaW1wbCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gbmV3RW50cnkuZ2V0TmFtZSgpOwotCQkJCQlwdWJsaWNJZCA9IG5ld0VudHJ5LmdldFB1YmxpY0lkKCk7Ci0JCQkJCXN5c3RlbUlkID0gbmV3RW50cnkuZ2V0U3lzdGVtSWQoKTsKLQkJCQkJbmV3RG9jdW1lbnRUeXBlID0gaW1wbC5jcmVhdGVEb2N1bWVudFR5cGUobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlib29sZWFuIG5vdGlmeSA9IGZhbHNlOwotCQlpZiAodGhpcy5lbnRyeSAhPSBudWxsKSB7IC8vIGRvIG5vdCBub3RpZnkgb24gaW5pdGlhbGl6YXRpb24KLQkJCW5vdGlmeSA9IChuZXdFbnRyeSAhPSB0aGlzLmVudHJ5IHx8IG5ld1hNTFR5cGUgIT0gdGhpcy5pc1hNTFR5cGUpOwotCQl9Ci0KLQkJaWYgKG5ld0RvY3VtZW50VHlwZSAhPSBudWxsKQotCQkJc2V0RG9jdW1lbnRUeXBlKG5ld0RvY3VtZW50VHlwZSk7Ci0JCXRoaXMuZW50cnkgPSBuZXdFbnRyeTsKLQkJdGhpcy5pc1hNTFR5cGUgPSBuZXdYTUxUeXBlOwotCi0JCWlmIChub3RpZnkpCi0JCQlub3RpZnlEb2N1bWVudFR5cGVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJRE9NRG9jdW1lbnRUeXBlIGZpbmREb2N1bWVudFR5cGUoSURPTURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlET01Eb2N1bWVudFR5cGUgZG9jdW1lbnRUeXBlID0gKElET01Eb2N1bWVudFR5cGUpIGRvY3VtZW50LmdldERvY3R5cGUoKTsKLQkJaWYgKGRvY3VtZW50VHlwZSAhPSBudWxsICYmIGRvY3VtZW50VHlwZS5nZXRFeGlzdGluZ0FkYXB0ZXIoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcykgPT0gbnVsbCkgewotCQkJLy8gd2F0Y2ggZnV0dXJlIGNoYW5nZXMKLQkJCWRvY3VtZW50VHlwZS5hZGRBZGFwdGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBOb2RlIGZpbmRYTUxOb2RlKERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyB0YXJnZXQgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJaWYgKHRhcmdldCAhPSBudWxsICYmIHRhcmdldC5lcXVhbHMoWE1MKSkgewotCQkJCXJldHVybiBjaGlsZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJOYW1lQ2FzZSgpIHsKLQkJaWYgKGlzWE1MVHlwZSgpKQotCQkJcmV0dXJuIExPV0VSX0NBU0U7IC8vIFhIVE1MCi0JCXJldHVybiB0aGlzLmZGYWN0b3J5LmdldEF0dHJOYW1lQ2FzZSgpOwotCX0KLQotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCUlGaWxlIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uKTsKLQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCXJlc3VsdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFnTmFtZUNhc2UoKSB7Ci0JCWlmIChpc1hNTFR5cGUoKSkKLQkJCXJldHVybiBMT1dFUl9DQVNFOyAvLyBYSFRNTAotCQlyZXR1cm4gdGhpcy5mRmFjdG9yeS5nZXRUYWdOYW1lQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGZlYXR1cmUuZXF1YWxzKEhUTUwpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChmZWF0dXJlLmVxdWFscyhTU0kpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChmZWF0dXJlLmVxdWFscyhGUkFNRVNFVCkpIHsKLQkJCWlmICh0aGlzLmVudHJ5ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHRoaXMuZW50cnkuaGFzRnJhbWVzZXQoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNYTUxUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5pc1hNTFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnQpIHsKLQkJCWlmIChldmVudFR5cGUgIT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZXZlbnRUeXBlICE9IElOb2RlTm90aWZpZXIuQ0hBTkdFKQotCQkJCXJldHVybjsKLQkJfQotCQlkb2N1bWVudFR5cGVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxNWUxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXJGYWN0b3J5LCBQcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIGludCB0YWdOYW1lQ2FzZSA9IERvY3VtZW50VHlwZUFkYXB0ZXIuTE9XRVJfQ0FTRTsKLQlwcml2YXRlIGludCBhdHRyTmFtZUNhc2UgPSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0U7Ci0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IG51bGw7Ci0KLQkvLyBmb3IgcmVtb3ZhbCBsYXRlciBvbiByZWxlYXNlKCkKLQlwcml2YXRlIEhhc2hNYXAgZkRvYzJBZGFwdGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCQl0aGlzLnByZWZlcmVuY2VzID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJaWYgKHRoaXMucHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJdXBkYXRlQ2FzZXMoKTsgLy8gaW5pdGlhbGl6ZQotCQkJdGhpcy5wcmVmZXJlbmNlcy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgYWRhcHRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG9iamVjdC4gSXQKLQkgKiBtYXkgYmUgYSBzaW5nbGV0b24gb3Igbm90IC4uLiBkZXBlbmRpbmcgb24gdGhlIG5lZWRzIG9mIHRoZQotCSAqIElOb2RlQWRhcHRlciAuLi4gYnV0IGluIGdlbmVyYWwgaXQgaXMgcmVjb21tZW5kZWQgZm9yIGFuIGFkYXB0ZXIgdG8gYmUKLQkgKiBzdGF0ZWxlc3MsIHNvIHRoZSBlZmZpY2llbmNpZXMgb2YgYSBzaW5nbGV0b24gY2FuIGJlIGdhaW5lZC4KLQkgKiAKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgYWRkQWRhcHRlciBvbiB0aGUgYWRhcHRlZAotCSAqIG9iamVjdCB3aXRoIHRoZSBjb3JyZWN0IGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyLgotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBub3RpZmllcikgewotCQlJTm9kZUFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLQkJLy8gb25seSBhZGFwdCBJRE9NRG9jdW1lbnQKLQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgSURPTURvY3VtZW50KSB7Ci0KLQkJCS8vIGlmIGFscmVhZHkgaGFzIGFuIGFkYXB0ZXIsIG5vIG5lZWQgdG8gcmVjcmVhdGUvaW5pdGlhbGl6ZS4KLQkJCS8vIE5vdGU6IHRoaXMgbWVhbnMgaWYgImRvY3R5cGUiIGZvciBET00gY2hhbmdlcywKLQkJCS8vIHRoZURvY3VtZW50VHlwZUFkYXRwZXIgZm9yIHRoYXQgRE9NCi0JCQkvLyBzaG91bGQgYmUgcmVtb3ZlZCAoYW5kIHJlbGVhc2VkKSBhbmQgaXQgd2lsbCBiZSByZS1jcmVhdGVkIG5leHQKLQkJCS8vIHRpbWUgcmVxdWlyZWQuCi0JCQlEb2N1bWVudFR5cGVBZGFwdGVyIG9sZEFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKG9sZEFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IG9sZEFkYXB0ZXI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkKLQkJCQkvLyBpZiB0aGVyZSBhbHJlYWR5IHdhcyBhbiBhZGFwdGVyCi0JCQkJLy9pZihmQWRhcHRlciAhPSBudWxsKSAKLQkJCQkvLwlmQWRhcHRlci5yZWxlYXNlKCk7Ci0JCQkJCi0JCQkJLy8gbm90ZSwgdGhlIGZhY3RvcnkgaXMgaW5jbHVkZWQgaW4gdGhpcyBjYXNlIHRvIGhhdmUgYSBjZW50cmFsIHBsYWNlCi0JCQkJLy8gdG8gY29tZSBiYWNrIHRvIGZvciBjYXNlIHByZWZlcmVuY2VzLgotCQkJCXJlc3VsdCA9IG5ldyBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlcigoSURPTURvY3VtZW50KSBub3RpZmllciwgdGhpcyk7Ci0JCQkJbm90aWZpZXIuYWRkQWRhcHRlcihyZXN1bHQpOwotCQkJCQotCQkJCWZEb2MyQWRhcHRlck1hcC5wdXQobm90aWZpZXIsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJOYW1lQ2FzZSgpIHsKLQkJcmV0dXJuIHRoaXMuYXR0ck5hbWVDYXNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFnTmFtZUNhc2UoKSB7Ci0JCXJldHVybiB0aGlzLnRhZ05hbWVDYXNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByZWZlcmVuY2VzLlByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCWlmIChwcm9wZXJ0eSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChwcm9wZXJ0eS5lcXVhbHMoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSkgfHwgcHJvcGVydHkuZXF1YWxzKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJfTkFNRV9DQVNFKSkgewotCQkJdXBkYXRlQ2FzZXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVDYXNlcygpIHsKLQkJdGhpcy50YWdOYW1lQ2FzZSA9IERvY3VtZW50VHlwZUFkYXB0ZXIuTE9XRVJfQ0FTRTsKLQkJdGhpcy5hdHRyTmFtZUNhc2UgPSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0U7Ci0KLQkJaWYgKHRoaXMucHJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpbnQgdGFnQ2FzZSA9IHRoaXMucHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UpOwotCQlpZiAodGFnQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCXRoaXMudGFnTmFtZUNhc2UgPSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0U7Ci0JCWVsc2UgaWYgKHRhZ0Nhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQl0aGlzLnRhZ05hbWVDYXNlID0gRG9jdW1lbnRUeXBlQWRhcHRlci5VUFBFUl9DQVNFOwotCQkKLQkJaW50IGF0dENhc2UgPSB0aGlzLnByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSk7Ci0JCWlmIChhdHRDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKQotCQkJdGhpcy5hdHRyTmFtZUNhc2UgPSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0U7Ci0JCWVsc2UgaWYgKGF0dENhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQl0aGlzLnRhZ05hbWVDYXNlID0gRG9jdW1lbnRUeXBlQWRhcHRlci5VUFBFUl9DQVNFOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCQotCQlpZighZkRvYzJBZGFwdGVyTWFwLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gZG9jcyA9IGZEb2MyQWRhcHRlck1hcC5rZXlTZXQoKS50b0FycmF5KCk7Ci0JCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkb2NzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKWZEb2MyQWRhcHRlck1hcC5nZXQoZG9jc1tpXSk7Ci0JCQkJYWRhcHRlci5yZWxlYXNlKCk7Ci0JCQkJKChJRE9NRG9jdW1lbnQpZG9jc1tpXSkucmVtb3ZlQWRhcHRlcihhZGFwdGVyKTsKLQkJCX0KLQkJCWZEb2MyQWRhcHRlck1hcC5jbGVhcigpOwotCQl9Ci0JCQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTU5NjAKLQkJaWYgKHRoaXMucHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJdGhpcy5wcmVmZXJlbmNlcy5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGluZyBjb3B5IG1ldGhvZAotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMjZjMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxEb2N1bWVudFR5cGVDb25zdGFudHMgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSFRNTCA9ICJIVE1MIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZSQU1FU0VUID0gIkZSQU1FU0VUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNTSSA9ICJTU0kiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxNThlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEhUTUxEb2N1bWVudFR5cGVFbnRyeSB7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIHB1YmxpY0lkOwotCXByaXZhdGUgU3RyaW5nIHN5c3RlbUlkOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSTsKLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxUeXBlOwotCXByaXZhdGUgYm9vbGVhbiBpc1hIVE1MVHlwZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNXTUxUeXBlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNGcmFtZXNldDsKLQlwcml2YXRlIFN0cmluZyBkaXNwbGF5TmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0WEhUTUw7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdFdNTDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgWEhUTUxfTkFNRSA9ICJodG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBIVE1MX05BTUUgPSAiSFRNTCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGJvb2xlYW4gdXNlSW50ZXJuYWxNb2RlbCA9IGZhbHNlOwotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBIVE1MRG9jdW1lbnRUeXBlRW50cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxEb2N1bWVudFR5cGVFbnRyeShTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyBuYW1lc3BhY2VVUkksIGJvb2xlYW4gaXNYSFRNTFR5cGUsIGJvb2xlYW4gaGFzRnJhbWVzZXQsIFN0cmluZyBkaXNwbGF5TmFtZSwgYm9vbGVhbiBpc0RlZmF1bHRYSFRNTCwgYm9vbGVhbiBpc0RlZmF1bHRXTUwsIGJvb2xlYW4gaXNXTUxUeXBlKSB7Ci0JCXRoaXMoKTsKLQotCQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGlzWE1MVHlwZSkKLQkJCQl0aGlzLm5hbWUgPSBYSFRNTF9OQU1FOy8vIG5lZWQgY29kZSBmb3Igd21sPwotCQkJZWxzZQotCQkJCXRoaXMubmFtZSA9IEhUTUxfTkFNRTsKLQkJfQotCQl0aGlzLnB1YmxpY0lkID0gcHVibGljSWQ7Ci0JCXRoaXMuc3lzdGVtSWQgPSBzeXN0ZW1JZDsKLQkJdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0JCXRoaXMuaXNYTUxUeXBlID0gaXNYSFRNTFR5cGUgfCBpc1dNTFR5cGU7Ci0JCXRoaXMuaGFzRnJhbWVzZXQgPSBoYXNGcmFtZXNldDsKLQkJdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotCQl0aGlzLmlzRGVmYXVsdFhIVE1MID0gaXNEZWZhdWx0WEhUTUw7Ci0JCXRoaXMuaXNEZWZhdWx0V01MID0gaXNEZWZhdWx0V01MOwotCQl0aGlzLmlzWEhUTUxUeXBlID0gaXNYSFRNTFR5cGU7Ci0JCXRoaXMuaXNXTUxUeXBlID0gaXNXTUxUeXBlOwotCX0KLQkKLQlIVE1MRG9jdW1lbnRUeXBlRW50cnkoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBib29sZWFuIGlzWEhUTUxUeXBlLCBib29sZWFuIGhhc0ZyYW1lc2V0LCBTdHJpbmcgZGlzcGxheU5hbWUsIGJvb2xlYW4gaXNEZWZhdWx0WEhUTUwsIGJvb2xlYW4gaXNEZWZhdWx0V01MLCBib29sZWFuIGlzV01MVHlwZSwgYm9vbGVhbiB1c2VJbnRlcm5hbE1vZGVsKSB7Ci0JCXRoaXMobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkLCBuYW1lc3BhY2VVUkksIGlzWEhUTUxUeXBlLCBoYXNGcmFtZXNldCwgZGlzcGxheU5hbWUsIGlzRGVmYXVsdFhIVE1MLCBpc0RlZmF1bHRXTUwsIGlzV01MVHlwZSk7Ci0JCXRoaXMudXNlSW50ZXJuYWxNb2RlbCA9IHVzZUludGVybmFsTW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2VVUkk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGljSWQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3lzdGVtSWQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNYTUxUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5pc1hNTFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzRnJhbWVzZXQoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0ZyYW1lc2V0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGVmYXVsdFhIVE1MKCkgewotCQlyZXR1cm4gdGhpcy5pc0RlZmF1bHRYSFRNTDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlZmF1bHRXTUwoKSB7Ci0JCXJldHVybiB0aGlzLmlzRGVmYXVsdFdNTDsKLQl9Ci0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzWEhUTUxUeXBlKCkgewotCQlyZXR1cm4gaXNYSFRNTFR5cGU7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNXTUxUeXBlKCkgewotCQlyZXR1cm4gaXNXTUxUeXBlOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiB1c2VJbnRlcm5hbE1vZGVsKCkgewotCQlyZXR1cm4gdXNlSW50ZXJuYWxNb2RlbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3NTU4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgewotCXN0YXRpYyBjbGFzcyBIVE1MRG9jdW1lbnRUeXBlRW50cnlDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXN0YXRpYyBDb2xsYXRvciBkZWxlZ2F0ZSA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlpZiAobzEgaW5zdGFuY2VvZiBIVE1MRG9jdW1lbnRUeXBlRW50cnkgJiYgbzIgaW5zdGFuY2VvZiBIVE1MRG9jdW1lbnRUeXBlRW50cnkpIHsKLQkJCQlpZiAoKChIVE1MRG9jdW1lbnRUeXBlRW50cnkpIG8xKS5nZXREaXNwbGF5TmFtZSgpICE9IG51bGwgJiYgKChIVE1MRG9jdW1lbnRUeXBlRW50cnkpIG8yKS5nZXREaXNwbGF5TmFtZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGRlbGVnYXRlLmNvbXBhcmUoKChIVE1MRG9jdW1lbnRUeXBlRW50cnkpIG8xKS5nZXREaXNwbGF5TmFtZSgpLCAoKEhUTUxEb2N1bWVudFR5cGVFbnRyeSkgbzIpLmdldERpc3BsYXlOYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5IGluc3RhbmNlID0gbnVsbDsKLQlwcml2YXRlIEhhc2h0YWJsZSBlbnRyaWVzID0gbnVsbDsKLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBkZWZhdWx0RW50cnkgPSBudWxsOwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUVudHJ5IGRlZmF1bHRYSFRNTEVudHJ5ID0gbnVsbDsKLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBkZWZhdWx0V01MRW50cnkgPSBudWxsOwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUVudHJ5IGRlZmF1bHRDSFRNTEVudHJ5ID0gbnVsbDsKLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBkZWZhdWx0SFRNTDVFbnRyeSA9IG51bGw7Ci0JCi0JZmluYWwgc3RhdGljIGludCBERUZBVUxUX0hUTUwgPSAwOwotCWZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9YSFRNTCA9IDE7Ci0JZmluYWwgc3RhdGljIGludCBERUZBVUxUX1dNTCA9IDI7Ci0JZmluYWwgc3RhdGljIGludCBERUZBVUxUX0NIVE1MID0gMzsKLQlmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfSFRNTDUgPSA0OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIVE1MX1BVQkxJQ19JRCA9ICItLy9XM0MvL0RURCBDb21wYWN0IEhUTUwgMS4wIERyYWZ0Ly9FTiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5lbnRyaWVzID0gbmV3IEhhc2h0YWJsZSgpOwotCQkvLyBIVE1MIDQuMDEKLQkJU3RyaW5nIG5hbWUgPSAiSFRNTCI7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcHVibGljSWQgPSAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN5c3RlbUlkID0gImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZGlzcGxheU5hbWUgPSAiSFRNTCA0LjAxIFRyYW5zaXRpb25hbCI7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kZWZhdWx0RW50cnkgPSBuZXcgSFRNTERvY3VtZW50VHlwZUVudHJ5KG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBkaXNwbGF5TmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCXRoaXMuZW50cmllcy5wdXQocHVibGljSWQsIHRoaXMuZGVmYXVsdEVudHJ5KTsKLQkJcHVibGljSWQgPSAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiI7Ly8kTk9OLU5MUy0xJAotCQlzeXN0ZW1JZCA9ICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIjsvLyROT04tTkxTLTEkCi0JCWRpc3BsYXlOYW1lID0gIkhUTUwgNC4wMSBTdHJpY3QiOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZW50cmllcy5wdXQocHVibGljSWQsIG5ldyBIVE1MRG9jdW1lbnRUeXBlRW50cnkobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkLCBudWxsLCBmYWxzZSwgZmFsc2UsIGRpc3BsYXlOYW1lLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0JCXB1YmxpY0lkID0gIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iOy8vJE5PTi1OTFMtMSQKLQkJc3lzdGVtSWQgPSAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvZnJhbWVzZXQuZHRkIjsvLyROT04tTkxTLTEkCi0JCWRpc3BsYXlOYW1lID0gIkhUTUwgNC4wMSBGcmFtZXNldCI7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5lbnRyaWVzLnB1dChwdWJsaWNJZCwgbmV3IEhUTUxEb2N1bWVudFR5cGVFbnRyeShuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQsIG51bGwsIGZhbHNlLCB0cnVlLCBkaXNwbGF5TmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotCQkvLyBDSFRNTAotCQluYW1lID0gIkhUTUwiOy8vJE5PTi1OTFMtMSQKLQkJcHVibGljSWQgPSBDSFRNTF9QVUJMSUNfSUQ7Ci0JCWRpc3BsYXlOYW1lID0gIkNvbXBhY3QgSFRNTCAxLjAgRHJhZnQiOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZGVmYXVsdENIVE1MRW50cnkgPSBuZXcgSFRNTERvY3VtZW50VHlwZUVudHJ5KG5hbWUsIHB1YmxpY0lkLCBudWxsLCBudWxsLCBmYWxzZSwgZmFsc2UsIGRpc3BsYXlOYW1lLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJdGhpcy5lbnRyaWVzLnB1dChwdWJsaWNJZCwgdGhpcy5kZWZhdWx0Q0hUTUxFbnRyeSk7Ci0KLQkJLy9IVE1MNQotCQluYW1lID0gIkhUTUw1IjsvLyROT04tTkxTLTEkCi0JCXB1YmxpY0lkID0gIiI7Ci0JCWRpc3BsYXlOYW1lID0gIkhUTUw1IjsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmRlZmF1bHRIVE1MNUVudHJ5ID0gbmV3IEhUTUxEb2N1bWVudFR5cGVFbnRyeShuYW1lLCBwdWJsaWNJZCwgbnVsbCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBkaXNwbGF5TmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCXRoaXMuZW50cmllcy5wdXQocHVibGljSWQsIHRoaXMuZGVmYXVsdEhUTUw1RW50cnkpOwotCQkKLQkJCi0KLQkJSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IG5ldyBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlSZWFkZXIoKTsKLQkJaWYgKHJlYWRlciAhPSBudWxsKQotCQkJcmVhZGVyLnJlYWRSZWdpc3RyeSh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlZ2lzdChTdHJpbmcgcGlkLCBIVE1MRG9jdW1lbnRUeXBlRW50cnkgZG9jdHlwZSkgewotCQlpZiAocGlkID09IG51bGwgfHwgZG9jdHlwZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0aGlzLmVudHJpZXMucHV0KHBpZCwgZG9jdHlwZSk7Ci0JCWlmICh0aGlzLmRlZmF1bHRYSFRNTEVudHJ5ID09IG51bGwpIHsKLQkJCWlmIChkb2N0eXBlLmlzRGVmYXVsdFhIVE1MKCkpCi0JCQkJdGhpcy5kZWZhdWx0WEhUTUxFbnRyeSA9IGRvY3R5cGU7Ci0JCX0KLQkJaWYgKHRoaXMuZGVmYXVsdFdNTEVudHJ5ID09IG51bGwpIHsKLQkJCWlmIChkb2N0eXBlLmlzRGVmYXVsdFdNTCgpKQotCQkJCXRoaXMuZGVmYXVsdFdNTEVudHJ5ID0gZG9jdHlwZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBIVE1MRG9jdW1lbnRUeXBlRW50cnkgZ2V0RGVmYXVsdEVudHJ5KGludCB0eXBlKSB7Ci0JCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IG51bGw7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBERUZBVUxUX0hUTUw1IDoKLQkJCQllbnRyeSA9IHRoaXMuZGVmYXVsdEhUTUw1RW50cnk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERFRkFVTFRfWEhUTUwgOgotCQkJCWVudHJ5ID0gdGhpcy5kZWZhdWx0WEhUTUxFbnRyeTsKLQkJCQlicmVhazsKLQkJCWNhc2UgREVGQVVMVF9XTUwgOgotCQkJCWVudHJ5ID0gdGhpcy5kZWZhdWx0V01MRW50cnk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERFRkFVTFRfQ0hUTUwgOgotCQkJCWVudHJ5ID0gdGhpcy5kZWZhdWx0Q0hUTUxFbnRyeTsKLQkJCQlicmVhazsKLQkJCWNhc2UgREVGQVVMVF9IVE1MIDoKLQkJCWRlZmF1bHQgOgotCQkJCWVudHJ5ID0gdGhpcy5kZWZhdWx0RW50cnk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBIVE1MRG9jdW1lbnRUeXBlRW50cnkgZ2V0RGVmYXVsdEVudHJ5KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0RW50cnk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBnZXRYSFRNTERlZmF1bHRFbnRyeSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFhIVE1MRW50cnk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGdldEVudHJpZXMoKSB7Ci0JCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCh0aGlzLmVudHJpZXMudmFsdWVzKCkpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHZhbHVlcywgbmV3IEhUTUxEb2N1bWVudFR5cGVFbnRyeUNvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBuZXcgVmVjdG9yKHZhbHVlcykuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTERvY3VtZW50VHlwZUVudHJ5IGdldEVudHJ5KFN0cmluZyBwdWJsaWNJZCkgewotCQlpZiAocHVibGljSWQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEhUTUxEb2N1bWVudFR5cGVFbnRyeSkgdGhpcy5lbnRyaWVzLmdldChwdWJsaWNJZCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQxOTk3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLS8qKgotICovCi1jbGFzcyBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlSZWFkZXIgewotCi0JLy8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImRvY3VtZW50VHlwZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBR19OQU1FID0gImRvY3VtZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX1BJRCA9ICJwdWJsaWNJRCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX1NJRCA9ICJzeXN0ZW1JRCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0lTX1hIVE1MID0gImlzWEhUTUwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9JU19XTUwgPSAiaXNXTUwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9IQVNfRlJBTUVTRVQgPSAiaGFzRnJhbWVzZXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9OU1VSSSA9ICJuYW1lc3BhY2VVUkkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9FTkFNRSA9ICJlbGVtZW50TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0ROQU1FID0gImRpc3BsYXlOYW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSVNfREVGQVVMVF9YSFRNTCA9ICJkZWZhdWx0WEhUTUwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9JU19ERUZBVUxUX1dNTCA9ICJkZWZhdWx0V01MIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFZfVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFZfTlVMTF9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICovCi0JSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgcmVhZFJlZ2lzdHJ5KEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSByZWcpIHsKLQkJaWYgKHJlZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBkb2N0eXBlID0gcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQkJCS8vIG51bGwgY2FuIGJlIHJldHVybmVkIGlmIHRoZXJlJ3MgYW4gZXJyb3IgcmVhZGluZyB0aGUgZWxlbWVudAotCQkJCWlmIChkb2N0eXBlICE9IG51bGwpIHsKLQkJCQkJcmVnLnJlZ2lzdChkb2N0eXBlLmdldFB1YmxpY0lkKCksIGRvY3R5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUVudHJ5IHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBkb2N0eXBlID0gbnVsbDsKLQkJU3RyaW5nIHBpZCA9IG51bGw7Ci0JCVN0cmluZyBzaWQgPSBudWxsOwotCQlTdHJpbmcgbnN1cmkgPSBudWxsOwotCQlTdHJpbmcgcm9vdCA9IG51bGw7Ci0JCWJvb2xlYW4geGh0bWwgPSB0cnVlOwotCQlib29sZWFuIGZyYW1lc2V0ID0gZmFsc2U7Ci0JCVN0cmluZyBkbmFtZSA9IG51bGw7Ci0JCWJvb2xlYW4gZGVmYXVsdFhodG1sID0gZmFsc2U7Ci0JCWJvb2xlYW4gZGVmYXVsdFdNTCA9IGZhbHNlOwotCQlib29sZWFuIGlzV01MID0gZmFsc2U7Ci0KLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTkFNRSkpIHsKLQkJCXBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QSUQpOwotCQkJLy8gcHVibGljSUQgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS4KLQkJCWlmIChwaWQgPT0gbnVsbCB8fCBwaWQuZXF1YWxzKEFUVl9OVUxMX1NUUklORykpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCXNpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9TSUQpOwotCQkJbnN1cmkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTlNVUkkpOwotCQkJcm9vdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9FTkFNRSk7Ci0JCQl4aHRtbCA9IGdldEJvb2xlYW4oZWxlbWVudCwgQVRUX0lTX1hIVE1MKTsKLQkJCWZyYW1lc2V0ID0gZ2V0Qm9vbGVhbihlbGVtZW50LCBBVFRfSEFTX0ZSQU1FU0VUKTsKLQkJCWRuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0ROQU1FKTsKLQkJCWRlZmF1bHRYaHRtbCA9IGdldEJvb2xlYW4oZWxlbWVudCwgQVRUX0lTX0RFRkFVTFRfWEhUTUwpOwotCQkJZGVmYXVsdFdNTCA9IGdldEJvb2xlYW4oZWxlbWVudCwgQVRUX0lTX0RFRkFVTFRfV01MKTsKLQkJCWlzV01MID0gZ2V0Qm9vbGVhbihlbGVtZW50LCBBVFRfSVNfV01MKTsKLQkJCWRvY3R5cGUgPSBuZXcgSFRNTERvY3VtZW50VHlwZUVudHJ5KHJvb3QsIHBpZCwgc2lkLCBuc3VyaSwgeGh0bWwsIGZyYW1lc2V0LCBkbmFtZSwgZGVmYXVsdFhodG1sLCBkZWZhdWx0V01MLCBpc1dNTCk7Ci0JCX0KLQkJcmV0dXJuIGRvY3R5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGdldEJvb2xlYW4oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHQpIHsKLQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0KTsKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKEFUVl9UUlVFKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxNb2RlbFBhcnNlckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MTW9kZWxQYXJzZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlN2RkY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxNb2RlbFBhcnNlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNNTm9kZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50Lk1vZGVsUGFyc2VyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuVGFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBIVE1MRG9jdW1lbnRJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyIGltcGxlbWVudHMgTW9kZWxQYXJzZXJBZGFwdGVyIHsKLQkvKioKLQkgKiBub3RlOiBJIG1hZGUgcHVibGljLCB0ZW1wYXJpbHksIHNvIGNvdWxkIGJlIHVzZWQgYnkgSlNQTG9hZGVyCi0JICovCi0JcHJvdGVjdGVkIEhUTUxNb2RlbFBhcnNlckFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFRlcm1pbmF0ZUF0KENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gY2hpbGQpIHsKLQkJaWYgKCFwYXJlbnQuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5URVJNSU5BVE9SUykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWphdmEudXRpbC5JdGVyYXRvciBpID0gKGphdmEudXRpbC5JdGVyYXRvcikgcGFyZW50LmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuVEVSTUlOQVRPUlMpOwotCQlpZiAoaSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgbmV4dE5hbWUgPSBjaGlsZC5nZXRFbGVtZW50TmFtZSgpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCS8vIE5PVEU6IENNRWxlbWVudERlY2xhcmF0aW9uIG9mIGNoaWxkIGlzIG5vdCBhbHdheXMgSFRNTENNRWxlbWVudERlY2xhcmF0aW9uLgotCQkJLy8gSXQgbWlnaHQgYmUgb25lIG9mIGJhc2VkIG9uIERURCAoZm9yIFhIVE1MIGVsZW1lbnQpLiAgU28sIGNvbXBhcmlzb24gbXVzdAotCQkJLy8gYmUgcGVyZm9ybWVkIGlnbm9yaW5nIGNhc2UuCi0JCQkvLyAtLSAzLzIwLzIwMDIKLQkJCVN0cmluZyB0ZXJtaW5hdG9yID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlpZiAodGVybWluYXRvciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKG5leHROYW1lLmVxdWFsc0lnbm9yZUNhc2UodGVybWluYXRvcikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW5kVGFnT21pc3NpYmxlKEVsZW1lbnQgZWxlbWVudCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWMgPSBDTU5vZGVVdGlsLmdldEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJaWYgKGRlYyA9PSBudWxsIHx8ICEoZGVjIGluc3RhbmNlb2YgSFRNTFByb3BlcnR5RGVjbGFyYXRpb24pKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgdHlwZSA9ICgoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24pZGVjICkuZ2V0T21pdFR5cGUoKTsKLQkJcmV0dXJuIHR5cGUgPT0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0JPVEggfHwgdHlwZSA9PSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EIHx8IHR5cGUgPT0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORF9ERUZBVUxUIHx8IHR5cGUgPT0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORF9NVVNUOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNvbnRhaW4oRWxlbWVudCBlbGVtZW50LCBOb2RlIGNoaWxkKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSURPTUVsZW1lbnQgaW1wbCA9IChJRE9NRWxlbWVudCkgZWxlbWVudDsKLQotCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJaWYgKCFpbXBsLmlzR2xvYmFsVGFnKCkpCi0JCQkJcmV0dXJuIHRydWU7IC8vIG5vbiBIVE1MIHRhZwotCQkJSURPTUVsZW1lbnQgY2hpbGRFbGVtZW50ID0gKElET01FbGVtZW50KSBjaGlsZDsKLQotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gbXlEZWMgPSBDTU5vZGVVdGlsLmdldEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCWlmIChteURlYyA9PSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCQkJLy9pZiAoIShteURlYyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24pKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChteURlYy5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJaWYgKCFjaGlsZEVsZW1lbnQuaXNHbG9iYWxUYWcoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsgLy8gbm9uIEhUTUwgdGFnCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBjaGlsZERlYyA9IENNTm9kZVV0aWwuZ2V0RWxlbWVudERlY2xhcmF0aW9uKGNoaWxkRWxlbWVudCk7Ci0JCQlpZiAoY2hpbGREZWMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCS8vaWYgKCEoY2hpbGREZWMgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSkgcmV0dXJuIHRydWU7Ci0KLQkJCWlmIChteURlYyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQlpZiAoKChCb29sZWFuKSAoKEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIG15RGVjKS5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpLmJvb2xlYW5WYWx1ZSgpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChzaG91bGRUZXJtaW5hdGVBdChteURlYywgY2hpbGREZWMpICYmICFpc1ZhbGlkQ2hpbGQobXlEZWMsIGNoaWxkRGVjKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJU3RyaW5nIHRhZ05hbWUgPSBpbXBsLmdldFRhZ05hbWUoKTsKLQkJCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlTdHJpbmcgY2hpbGROYW1lID0gY2hpbGRFbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCWlmIChjaGlsZE5hbWUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmICghaW1wbC5oYXNTdGFydFRhZygpICYmICFpbXBsLmhhc0VuZFRhZygpKSB7Ci0JCQkJLy8gaW1wbGljaXQgZWxlbWVudAotCQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoY2hpbGRFbGVtZW50LmdldFRhZ05hbWUoKSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEKSkgewotCQkJCQlpZiAoIWNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBKSAmJiAhY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJVExFKSAmJiAhY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJTkspICYmICFjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpICYmICFjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRSkgJiYgIWNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JU0lOREVYKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTm9kZSBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJSURPTUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChJRE9NRWxlbWVudCkgcGFyZW50OwotCQkJCQlpZiAoIXBhcmVudEVsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiAhcGFyZW50RWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQkJaWYgKCFjYW5Db250YWluKHBhcmVudEVsZW1lbnQsIGNoaWxkKSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8vIGNvbnRleHVhbCB0ZXJtaW5hdGlvbiBmb3IgVEFCTEUgY29udGVudCB0YWdzCi0JCQlib29sZWFuIGlzVGFibGVDb250ZW50ID0gZmFsc2U7Ci0JCQlpZiAoY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRCT0RZKSB8fCBjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEhFQUQpIHx8IGNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URk9PVCkpIHsKLQkJCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlzVGFibGVDb250ZW50ID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUikpIHsKLQkJCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQk9EWSkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USEVBRCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URk9PVCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlzVGFibGVDb250ZW50ID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URCkgfHwgY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRIKSkgewotCQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRCT0RZKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRIRUFEKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRGT09UKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaXNUYWJsZUNvbnRlbnQgPSB0cnVlOwotCQkJfQotCQkJaWYgKGlzVGFibGVDb250ZW50KSB7Ci0JCQkJLy8gVEFCTEUgY29udGVudCB0YWdzIHNob3VsZCB0ZXJtaW5hdGUgbm9uIFRBQkxFIGNvbnRlbnQgdGFncywKLQkJCQkvLyBpZiBpbiBUQUJMRQotCQkJCWZvciAoTm9kZSBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJYnJlYWs7Ci0JCQkJCUlET01FbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIHBhcmVudDsKLQkJCQkJU3RyaW5nIHBhcmVudE5hbWUgPSBwYXJlbnRFbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCQkJaWYgKHBhcmVudE5hbWUgPT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpZiAocGFyZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRU1CRUQpKSB7Ci0JCQkJaWYgKCFjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9FTUJFRCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IGltcGwuZ2V0VGFnTmFtZSgpOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCAmJiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVNQkVEKSkgewotCQkJCUlET01UZXh0IHRleHQgPSAoSURPTVRleHQpIGNoaWxkOwotCQkJCWlmICghdGV4dC5pc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJaWYgKGltcGwuaXNJbXBsaWNpdFRhZygpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkJlSW1wbGljaXRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5CZUltcGxpY2l0VGFnKEVsZW1lbnQgZWxlbWVudCwgTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlQ29tbWVudEVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKSB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsIHx8IGRhdGEgPT0gbnVsbCB8fCBkYXRhLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gY3JlYXRlTWV0YUVsZW1lbnQoZG9jdW1lbnQsIGRhdGEsIGlzSlNQVGFnKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJvdXRpbmUgY3JlYXRlIGFuIGltcGxpY2l0IEVsZW1lbnQgZm9yIGdpdmVuIHBhcmVudCBhbmQgY2hpbGQsCi0JICogc3VjaCBhcyBIVE1MLCBCT0RZLCBIRUFELCBhbmQgVEJPRFkgZm9yIEhUTUwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlSW1wbGljaXRFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBOb2RlIHBhcmVudCwgTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEVsZW1lbnQgY3JlYXRlTWV0YUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKSB7Ci0JCWlmIChkYXRhID09IG51bGwgfHwgZGF0YS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJVGFnU2Nhbm5lciBzY2FubmVyID0gbmV3IFRhZ1NjYW5uZXIoZGF0YSwgMCwgdHJ1ZSk7IC8vIG9uZSBsaW5lCi0JCVN0cmluZyBuYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQlpZiAobmFtZSA9PSBudWxsIHx8ICFuYW1lLmVxdWFsc0lnbm9yZUNhc2UoTWV0YURhdGEuTUVUQURBVEEpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlib29sZWFuIGlzU3RhcnRTcGFuID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXNFbmRTcGFuID0gZmFsc2U7Ci0JCW5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCXdoaWxlIChuYW1lICE9IG51bGwpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IHNjYW5uZXIubmV4dFZhbHVlKCk7Ci0JCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1ldGFEYXRhLlRZUEUpKSB7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCWlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKE1ldGFEYXRhLkRFU0lHTkVSX0NPTlRST0wpKSB7Ci0JCQkJCXR5cGUgPSBNZXRhRGF0YS5ERVNJR05FUl9DT05UUk9MOwotCQkJCX0KLQkJCQllbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKE1ldGFEYXRhLkRZTkFNSUNfREFUQSkpIHsKLQkJCQkJdHlwZSA9IE1ldGFEYXRhLkRZTkFNSUNfREFUQTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZShNZXRhRGF0YS5BVVRIT1JfVElNRV9WSVNVQUwpKSB7Ci0JCQkJCXR5cGUgPSBNZXRhRGF0YS5BVVRIT1JfVElNRV9WSVNVQUw7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoTWV0YURhdGEuQU5OT1RBVElPTikpIHsKLQkJCQkJdHlwZSA9IE1ldGFEYXRhLkFOTk9UQVRJT047Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoTWV0YURhdGEuU1RBUlRTUEFOKSkgewotCQkJCWlzU3RhcnRTcGFuID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShNZXRhRGF0YS5FTkRTUEFOKSkgewotCQkJCWlmICghaXNTdGFydFNwYW4pCi0JCQkJCWlzRW5kU3BhbiA9IHRydWU7Ci0JCQl9Ci0JCQluYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQl9Ci0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCFpc1N0YXJ0U3BhbiAmJiAhaXNFbmRTcGFuKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBtZXRhRGF0YSA9IG51bGw7Ci0JCWludCBvZmZzZXQgPSBzY2FubmVyLmdldE5leHRPZmZzZXQoKTsgLy8gc2tpcCBuZXcgbGluZQotCQlpZiAob2Zmc2V0IDwgZGF0YS5sZW5ndGgoKSkKLQkJCW1ldGFEYXRhID0gZGF0YS5zdWJzdHJpbmcob2Zmc2V0KTsKLQkJaWYgKG1ldGFEYXRhID09IG51bGwpCi0JCQltZXRhRGF0YSA9IG5ldyBTdHJpbmcoKTsKLQotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KE1ldGFEYXRhLlBSRUZJWCArIHR5cGUpOwotCi0JCU1ldGFEYXRhQWRhcHRlciBhZGFwdGVyID0gbmV3IE1ldGFEYXRhQWRhcHRlcih0eXBlKTsKLQkJaWYgKGlzU3RhcnRTcGFuKSB7Ci0JCQlpZiAobWV0YURhdGEgIT0gbnVsbCkKLQkJCQlhZGFwdGVyLnNldERhdGEobWV0YURhdGEpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKG1ldGFEYXRhICE9IG51bGwpCi0JCQkJYWRhcHRlci5zZXRFbmREYXRhKG1ldGFEYXRhKTsKLQkJfQotCQllbGVtZW50LmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0JCWFkYXB0ZXIuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJZWxlbWVudC5zZXRKU1BUYWcoaXNKU1BUYWcpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmluZFJvb3ROYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gdGFnIG1hdGNoaW5nIHNob3VsZCBub3QgYmV5b25kIFRBQkxFIHRhZyBleGNlcHQgQk9EWSB0YWcKLQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBNb2RlbFBhcnNlckFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5kVGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJVGFnQWRhcHRlciBhZGFwdGVyID0gKFRhZ0FkYXB0ZXIpIGVsZW1lbnQuZ2V0RXhpc3RpbmdBZGFwdGVyKFRhZ0FkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuaXNFbmRUYWcoKTsKLQkJcmV0dXJuIGVsZW1lbnQuaXNFbmRUYWcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJLy8gZG8gbm90aGluZyBvbiBub3RpZml5IGNoYW5nZQotCQkvLyBUT0RPOiB0aGlzIG1lYW5zIGdvb2QgY2FuZGlkYXRlIGZvciByZWd1bGFyIHBsYXRmb3JtIGFkYXB0ZXIKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRDaGlsZChDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGNoaWxkKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDTUNvbnRlbnQgY29udGVudCA9IHBhcmVudC5nZXRDb250ZW50KCk7Ci0JCWlmIChjb250ZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBpc0NoaWxkKGNvbnRlbnQsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ2hpbGQoQ01Db250ZW50IGNvbnRlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHRhcmdldCkgewotCQlzd2l0Y2ggKGNvbnRlbnQuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6Ci0JCQkJcmV0dXJuIGlzU2FtZURlY2xhcmF0aW9uKChDTUVsZW1lbnREZWNsYXJhdGlvbikgY29udGVudCwgdGFyZ2V0KTsKLQkJCWNhc2UgQ01Ob2RlLkdST1VQIDoKLQkJCQlDTU5vZGVMaXN0IGNoaWxkcmVuID0gKChDTUdyb3VwKSBjb250ZW50KS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCUNNTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJCXN3aXRjaCAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCQkJY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6Ci0JCQkJCQkJaWYgKGlzU2FtZURlY2xhcmF0aW9uKChDTUVsZW1lbnREZWNsYXJhdGlvbikgY2hpbGQsIHRhcmdldCkpCi0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCWNvbnRpbnVlOyAvLyBHbyBuZXh0IGNoaWxkLgotCQkJCQkJY2FzZSBDTU5vZGUuR1JPVVAgOgotCQkJCQkJCWlmIChpc0NoaWxkKChDTUNvbnRlbnQpIGNoaWxkLCB0YXJnZXQpKQotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQljb250aW51ZTsgLy8gR28gbmV4dCBjaGlsZC4KLQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCWNvbnRpbnVlOyAvLyBHbyBuZXh0IGNoaWxkLgotCQkJCQl9Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2FtZURlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGFEZWMsIENNRWxlbWVudERlY2xhcmF0aW9uIG90aGVyRGVjKSB7Ci0JCXJldHVybiBhRGVjLmdldEVsZW1lbnROYW1lKCkgPT0gb3RoZXJEZWMuZ2V0RWxlbWVudE5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NzY1ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Nb2RlbFBhcnNlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElOb2RlQWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdGhhdCByZXR1cm5zIHRoZSBhZGFwdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0LiBJdAotCSAqIG1heSBiZSBhIHNpbmdsZXRvbiBvciBub3QgLi4uIGRlcGVuZGluZyBvbiB0aGUgbmVlZHMgb2YgdGhlCi0JICogSU5vZGVBZGFwdGVyIC4uLiBidXQgaW4gZ2VuZXJhbCBpdCBpcyByZWNvbW1lbmRlZCBmb3IgYW4gYWRhcHRlciB0byBiZQotCSAqIHN0YXRlbGVzcywgc28gdGhlIGVmZmljaWVuY2llcyBvZiBhIHNpbmdsZXRvbiBjYW4gYmUgZ2FpbmVkLgotCSAqIAotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBzaG91bGQgY2FsbCBhZGRBZGFwdGVyIG9uIHRoZSBhZGFwdGVkCi0JICogb2JqZWN0IHdpdGggdGhlIGNvcnJlY3QgaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKG5vdGlmaWVyICE9IG51bGwpIHsKLQkJCWlmIChub3RpZmllciBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkgewotCQkJCWFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoTW9kZWxQYXJzZXJBZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXIgPSBuZXcgSFRNTE1vZGVsUGFyc2VyQWRhcHRlcigpOwotCQkJCQlub3RpZmllci5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBNb2RlbFBhcnNlckFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIG5vIHN0YXRlIHRvIGNsZWFudXAKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkaW5nIGNvcHkgbWV0aG9kCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01ldGFEYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTWV0YURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA1NzU4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTWV0YURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGEgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQSA9ICJNRVRBREFUQSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJ0eXBlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVFNQQU4gPSAic3RhcnRzcGFuIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFTkRTUEFOID0gImVuZHNwYW4iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIERFU0lHTkVSX0NPTlRST0wgPSAiRGVzaWduZXJDb250cm9sIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBEWU5BTUlDX0RBVEEgPSAiRHluYW1pY0RhdGEiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUl9USU1FX1ZJU1VBTCA9ICJBdXRob3JUaW1lVmlzdWFsIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OID0gIkFubm90YXRpb24iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJNRVRBREFUQToiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9NZXRhRGF0YUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9NZXRhRGF0YUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI4NTk2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTWV0YURhdGFBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuVGFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIE1ldGFEYXRhQWRhcHRlciBpbXBsZW1lbnRzIFRhZ0FkYXB0ZXIsIE1ldGFEYXRhIHsKLQotCXByaXZhdGUgSURPTUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZGF0YSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZW5kRGF0YSA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgTWV0YURhdGFBZGFwdGVyKFN0cmluZyB0eXBlKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJaWYgKHR5cGUuZXF1YWxzKEFOTk9UQVRJT04pKSB7Ci0JCQkJdGhpcy50eXBlID0gQU5OT1RBVElPTjsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUuZXF1YWxzKEFVVEhPUl9USU1FX1ZJU1VBTCkpIHsKLQkJCQl0aGlzLnR5cGUgPSBBVVRIT1JfVElNRV9WSVNVQUw7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGF0YShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGRhdGEgPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAoaXNDb21tZW50VGV4dChyZWdpb25UeXBlKSkgewotCQkJCWRhdGEgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWZvciAoOyBvZmZzZXQgPCBsZW5ndGg7IG9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSBkYXRhLmNoYXJBdChvZmZzZXQpOwotCQkJaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpIHsKLQkJCQlvZmZzZXQrKzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlmb3IgKDsgb2Zmc2V0IDwgbGVuZ3RoOyBvZmZzZXQrKykgewotCQkJY2hhciBjID0gZGF0YS5jaGFyQXQob2Zmc2V0KTsKLQkJCWlmIChjICE9ICdccicgJiYgYyAhPSAnXG4nKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRhdGEuc3Vic3RyaW5nKG9mZnNldCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudFRleHQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmVzdWx0ID0gaXNET01Db21tZW50KHJlZ2lvblR5cGUpIHx8IGlzTmVzdGVkQ29udGVudENvbW1lbnQocmVnaW9uVHlwZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCi0JcHJpdmF0ZSBib29sZWFuIGlzTmVzdGVkQ29udGVudENvbW1lbnQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJZmluYWwgU3RyaW5nIEpTUF9DT01NRU5UX1RFWFQgPSAiSlNQX0NPTU1FTlRfVEVYVCI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlZ2lvblR5cGUuZXF1YWxzKEpTUF9DT01NRU5UX1RFWFQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RPTUNvbW1lbnQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJcmV0dXJuIHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHsKLQkJaWYgKHRoaXMuZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLmVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMuZGF0YSAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMuZGF0YTsKLQkJcmV0dXJuIGdldERhdGEoZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERlbGltaXRlcihJRE9NTW9kZWwgbW9kZWwpIHsKLQkJU3RyaW5nIGRlbGltID0gbnVsbDsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpCi0JCQkJZGVsaW0gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcigpOwotCQl9Ci0JCWlmIChkZWxpbSA9PSBudWxsKQotCQkJZGVsaW0gPSAiXHJcbiI7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVsaW07Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmREYXRhKCkgewotCQlpZiAodGhpcy5lbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHRoaXMuZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMuZW5kRGF0YSAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMuZW5kRGF0YTsKLQkJcmV0dXJuIGdldERhdGEoZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kVGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCWJ1ZmZlci5hcHBlbmQoIjwlLS0iKTsvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCWJ1ZmZlci5hcHBlbmQoIjwhLS0iKTsvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoTUVUQURBVEEpOwotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoVFlQRSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIj1cIiIpOy8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCh0aGlzLnR5cGUpOwotCQlidWZmZXIuYXBwZW5kKCJcIiAiKTsvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoTWV0YURhdGEuRU5EU1BBTik7Ci0JCVN0cmluZyBkYXRhID0gZ2V0RW5kRGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgZGVsaW0gPSBnZXREZWxpbWl0ZXIoZWxlbWVudC5nZXRNb2RlbCgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW0pOwotCQkJYnVmZmVyLmFwcGVuZChkYXRhKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW0pOwotCQl9Ci0JCWlmIChlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKCItLSU+Iik7Ly8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKCItLT4iKTsvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRUYWcoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoZWxlbWVudC5pc0pTUFRhZygpKQotCQkJYnVmZmVyLmFwcGVuZCgiPCUtLSIpOy8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJYnVmZmVyLmFwcGVuZCgiPCEtLSIpOy8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChNRVRBREFUQSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJYnVmZmVyLmFwcGVuZChUWVBFKTsKLQkJYnVmZmVyLmFwcGVuZCgiPVwiIik7Ly8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKHRoaXMudHlwZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlwiICIpOy8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChNZXRhRGF0YS5TVEFSVFNQQU4pOwotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCgpID4gMCkgewotCQkJU3RyaW5nIGRlbGltID0gZ2V0RGVsaW1pdGVyKGVsZW1lbnQuZ2V0TW9kZWwoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKGRlbGltKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZGF0YSk7Ci0JCQlidWZmZXIuYXBwZW5kKGRlbGltKTsKLQkJfQotCQlpZiAoZWxlbWVudC5pc0pTUFRhZygpKQotCQkJYnVmZmVyLmFwcGVuZCgiLS0lPiIpOy8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJYnVmZmVyLmFwcGVuZCgiLS0+Iik7Ly8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gVGFnQWRhcHRlci5jbGFzcyB8fCB0eXBlID09IE1ldGFEYXRhQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmRUYWcoKSB7Ci0JCWlmICh0aGlzLmVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHRoaXMuZWxlbWVudC5oYXNTdGFydFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodGhpcy5lbGVtZW50Lmhhc0VuZFRhZygpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICh0aGlzLmRhdGEgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICh0aGlzLmVuZERhdGEgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSdW50aW1lQ29udGFpbmVyKCkgewotCQlyZXR1cm4gKHRoaXMudHlwZSA9PSBBTk5PVEFUSU9OIHx8IHRoaXMudHlwZSA9PSBBVVRIT1JfVElNRV9WSVNVQUwpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIGRhdGEpIHsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQotCQlpZiAodGhpcy5lbGVtZW50ICE9IG51bGwpCi0JCQl0aGlzLmVsZW1lbnQubm90aWZ5U3RhcnRUYWdDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kRGF0YShTdHJpbmcgZGF0YSkgewotCQl0aGlzLmVuZERhdGEgPSBkYXRhOwotCi0JCWlmICh0aGlzLmVsZW1lbnQgIT0gbnVsbCkKLQkJCXRoaXMuZWxlbWVudC5ub3RpZnlFbmRUYWdDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0KLQkJaWYgKHRoaXMuZWxlbWVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLmVsZW1lbnQuc2V0Q29tbWVudFRhZyh0cnVlKTsKLQkJCWlmICh0aGlzLnR5cGUgIT0gTWV0YURhdGEuQU5OT1RBVElPTikgewotCQkJCXRoaXMuZWxlbWVudC5zZXRKU1BUYWcodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSdW50aW1lU291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5lbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpc1J1bnRpbWVDb250YWluZXIoKSkKLQkJCXJldHVybjsKLQotCQlJRE9NTW9kZWwgbW9kZWwgPSB0aGlzLmVsZW1lbnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IG9mZnNldCA9IHRoaXMuZWxlbWVudC5nZXRTdGFydEVuZE9mZnNldCgpOwotCQlpbnQgZW5kID0gdGhpcy5lbGVtZW50LmdldEVuZFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSBlbmQgLSBvZmZzZXQ7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChtb2RlbCwgb2Zmc2V0LCBsZW5ndGgsIHNvdXJjZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RhZ1NjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UYWdTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYmQ1MDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RhZ1NjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICovCi1jbGFzcyBUYWdTY2FubmVyIHsKLQotCXByaXZhdGUgU3RyaW5nIHRhZyA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMDsKLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCXByaXZhdGUgYm9vbGVhbiBvbmVMaW5lID0gZmFsc2U7Ci0KLQkvKioKLQkgKi8KLQlUYWdTY2FubmVyKFN0cmluZyB0YWcsIGludCBvZmZzZXQpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLnRhZyA9IHRhZzsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCWlmICh0YWcgIT0gbnVsbCkKLQkJCXRoaXMubGVuZ3RoID0gdGFnLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqLwotCVRhZ1NjYW5uZXIoU3RyaW5nIHRhZywgaW50IG9mZnNldCwgYm9vbGVhbiBvbmVMaW5lKSB7Ci0JCXRoaXModGFnLCBvZmZzZXQpOwotCi0JCXRoaXMub25lTGluZSA9IG9uZUxpbmU7Ci0JfQotCi0JLyoqCi0JICovCi0JaW50IGdldE5leHRPZmZzZXQoKSB7Ci0JCWZvciAoOyB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoOyB0aGlzLm9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSB0aGlzLnRhZy5jaGFyQXQodGhpcy5vZmZzZXQpOwotCQkJaWYgKCFpc0VuZChjKSkKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gdGhpcy5vZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIHRoaXMub2Zmc2V0OwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0VuZChjaGFyIGMpIHsKLQkJcmV0dXJuICh0aGlzLm9uZUxpbmUgJiYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRXF1YWwoY2hhciBjKSB7Ci0JCXJldHVybiAoYyA9PSAnPScpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNRdW90ZShjaGFyIGMpIHsKLQkJcmV0dXJuIChjID09ICciJyB8fCBjID09ICdcJycpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTcGFjZShjaGFyIGMpIHsKLQkJcmV0dXJuIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBjaGFyIG5leHRDaGFyKCkgewotCQlmb3IgKDsgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aDsgdGhpcy5vZmZzZXQrKykgewotCQkJY2hhciBjID0gdGhpcy50YWcuY2hhckF0KHRoaXMub2Zmc2V0KTsKLQkJCWlmIChpc0VuZChjKSkKLQkJCQlicmVhazsKLQkJCWlmICghaXNTcGFjZShjKSkKLQkJCQlyZXR1cm4gYzsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlTdHJpbmcgbmV4dE5hbWUoKSB7Ci0JCWlmICh0aGlzLnRhZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLm9mZnNldCA+PSB0aGlzLmxlbmd0aCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChuZXh0Q2hhcigpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgbmFtZU9mZnNldCA9IHRoaXMub2Zmc2V0OwotCQlmb3IgKDsgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aDsgdGhpcy5vZmZzZXQrKykgewotCQkJY2hhciBjID0gdGhpcy50YWcuY2hhckF0KHRoaXMub2Zmc2V0KTsKLQkJCWlmIChpc0VuZChjKSB8fCBpc1NwYWNlKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKGlzRXF1YWwoYykgJiYgdGhpcy5vZmZzZXQgPiBuYW1lT2Zmc2V0KQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmICh0aGlzLm9mZnNldCA9PSBuYW1lT2Zmc2V0KQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIHRoaXMudGFnLnN1YnN0cmluZyhuYW1lT2Zmc2V0LCB0aGlzLm9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICovCi0JU3RyaW5nIG5leHRWYWx1ZSgpIHsKLQkJaWYgKHRoaXMudGFnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMubGVuZ3RoKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJY2hhciBzZXBlcmF0b3IgPSBuZXh0Q2hhcigpOwotCQlpZiAoIWlzRXF1YWwoc2VwZXJhdG9yKSkKLQkJCXJldHVybiBudWxsOwotCQl0aGlzLm9mZnNldCsrOyAvLyBza2lwICc9JwotCQljaGFyIHF1b3RlID0gbmV4dENoYXIoKTsKLQkJaWYgKHF1b3RlID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGlzUXVvdGUocXVvdGUpKQotCQkJdGhpcy5vZmZzZXQrKzsKLQkJZWxzZQotCQkJcXVvdGUgPSAwOwotCi0JCWludCB2YWx1ZU9mZnNldCA9IHRoaXMub2Zmc2V0OwotCQlmb3IgKDsgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aDsgdGhpcy5vZmZzZXQrKykgewotCQkJY2hhciBjID0gdGhpcy50YWcuY2hhckF0KHRoaXMub2Zmc2V0KTsKLQkJCWlmIChpc0VuZChjKSkgewotCQkJCXF1b3RlID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChxdW90ZSA9PSAwKSB7Ci0JCQkJaWYgKGlzU3BhY2UoYykpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGMgPT0gcXVvdGUpCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWludCB2YWx1ZUVuZCA9IHRoaXMub2Zmc2V0OwotCQlpZiAocXVvdGUgIT0gMCAmJiB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoKQotCQkJdGhpcy5vZmZzZXQrKzsKLQkJaWYgKHZhbHVlRW5kID09IHZhbHVlT2Zmc2V0KQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIHRoaXMudGFnLnN1YnN0cmluZyh2YWx1ZU9mZnNldCwgdmFsdWVFbmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Vbmtub3duVGFnQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1Vua25vd25UYWdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNjA1M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1Vua25vd25UYWdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuVGFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgVW5rbm93blRhZ0FkYXB0ZXIgaW1wbGVtZW50cyBUYWdBZGFwdGVyIHsKLQotCXByaXZhdGUgU3RyaW5nIHN0YXJ0VGFnID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBlbmRUYWcgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIFVua25vd25UYWdBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kVGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRhZyA9IG51bGw7Ci0JCWlmICh0aGlzLmVuZFRhZyAhPSBudWxsKSB7Ci0JCQl0YWcgPSB0aGlzLmVuZFRhZzsKLQkJCXRoaXMuZW5kVGFnID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGFnOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRUYWcoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdGFnID0gbnVsbDsKLQkJaWYgKHRoaXMuc3RhcnRUYWcgIT0gbnVsbCkgewotCQkJdGFnID0gdGhpcy5zdGFydFRhZzsKLQkJCXRoaXMuc3RhcnRUYWcgPSBudWxsOwotCQl9Ci0JCXJldHVybiB0YWc7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gVGFnQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmRUYWcoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRUYWcoU3RyaW5nIGVuZFRhZykgewotCQl0aGlzLmVuZFRhZyA9IGVuZFRhZzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydFRhZyhTdHJpbmcgc3RhcnRUYWcpIHsKLQkJdGhpcy5zdGFydFRhZyA9IHN0YXJ0VGFnOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9IVE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9IVE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBkMzY5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSFRNTERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuSFRNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBhcnNlcyBiZWdpbm5pbmcgcG9ydGlvbiBvZiBIVE1MIGZpbGUgdG8gZ2V0IHRoZSBlbmNvZGluZyB2YWx1ZQotICogaW4gYSBNRVRBIHRhZy4gRXhhbXBsZToKLSAqIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotICogCi0gKiBOb3RlOiBldmVuIHRob3VnaCwgdGVjaG5pY2FsbHksIGEgTUVUQSB0YWcgbXVzdCBjb21lIGluIGEgPEhFQUQ+dGFnLCB3ZQotICogZG9uJ3QgY2hlY2sgZm9yIHRoYXQsIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgd2hhdGV2ZXIsIG9yIHdoZXJlZXZlciwgdGhlCi0gKiB0aGUgZmlyc3QgPE1FVEE+dGFnIGlzLCBpdCBpcyB0aGUgb25lIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIHVzZXIsIGFuZAotICogdGhleSBtYXkganVzdCBiZSB0cnlpbmcgdG8gcmVwYWlyIHRoZSBlcnJvci4gVGhlIEhUTUwgdmFsaWRhdG9yIHdpbGwgdGVsbAotICogdGhlbSBpZiBpdHMgaW4gdGhlIHdyb25nIGxvY2F0aW9uLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50Q2hhcnNldERldGVjdG9yIGV4dGVuZHMgSFRNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElEb2N1bWVudENoYXJzZXREZXRlY3RvciB7Ci0KLQotCXB1YmxpYyBIVE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlzZXQobmV3IERvY3VtZW50UmVhZGVyKGRvY3VtZW50LCAwKSk7Ci0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9IVE1MRG9jdW1lbnRMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9IVE1MRG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyN2UzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSFRNTERvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nR3Vlc3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzcy5IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzcy5TdHlsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvcGFnYXRlLlByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEhUTUxEb2N1bWVudExvYWRlciBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRMb2FkZXIgewotCi0JcHVibGljIEhUTUxEb2N1bWVudExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gYWRkIHRhZyBuYW1lcyB1c2luZyBCbG9ja01hcmtlciBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIVE1MaXNoVGFnKFhNTFNvdXJjZVBhcnNlciBwYXJzZXIsIFN0cmluZyB0YWduYW1lKSB7Ci0JCUJsb2NrTWFya2VyIGJtID0gbmV3IEJsb2NrTWFya2VyKHRhZ25hbWUsIG51bGwsIERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCwgZmFsc2UpOwotCQlwYXJzZXIuYWRkQmxvY2tNYXJrZXIoYm0pOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgZW5jb2RpbmcuIEZvciBIVE1MLCB0aGVyZSBpcyBubyBzcGVjLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHN0cmluZwotCSAqICAgICAgICAgICAgYnl0ZVtdCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgaW50Ci0JICogCi0JICogRG8gYXV0b21hdGljIGVuY29kaW5nIGRldGVjdGlvbiBieSBndWVzcwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RW5jb2RpbmdOYW1lQnlHdWVzcyhieXRlW10gc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCWZpbmFsIFN0cmluZyBpYW5hRW5jID0gRW5jb2RpbmdHdWVzc2VyLmd1ZXNzRW5jb2Rpbmcoc3RyaW5nLCBsZW5ndGgpOwotCQlyZXR1cm4gaWFuYUVuYzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQWJzdHJhY3RMb2FkZXIjY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUVuY29kZWREb2N1bWVudCBuZXdFbmNvZGVkRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShnZXRQYXJzZXIoKSk7Ci0JCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCkuc2V0UmVQYXJzZXIobmV3IFhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCkpOwotCi0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNb2RlbExvYWRlciNnZXRQYXJzZXIoKQotCSAqLwotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlYTUxTb3VyY2VQYXJzZXIgcGFyc2VyID0gbmV3IFhNTFNvdXJjZVBhcnNlcigpOwotCQkvLyBmb3IgdGhlICJzdGF0aWMgSFRNTCIgY2FzZSwgd2UgbmVlZCB0byBpbml0aWFsaXplCi0JCS8vIEJsb2NrdGFncyBoZXJlLgotCQlhZGRIVE1MaXNoVGFnKHBhcnNlciwgInNjcmlwdCIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEhUTUxpc2hUYWcocGFyc2VyLCAic3R5bGUiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHRob3NlIGZhY3RvcmllcyB3aGljaCBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZQotCSAqIHN0cnVjdHVyZWRNb2RlbCBiZWZvcmUgY29udGVudCBpcyBhcHBsaWVkLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlmYWN0b3J5ID0gU3R5bGVBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlmYWN0b3J5ID0gSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlmYWN0b3J5ID0gbmV3IEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeSgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlmYWN0b3J5ID0gSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJLy8KLQkJZmFjdG9yeSA9IG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0KLQkJZmFjdG9yeSA9IG5ldyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCi0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoSUZpbGUgZmlsZSkgewotCQlTdHJpbmcgZGVsaW1pdGVyID0gQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MKTsKLQkJaWYgKGRlbGltaXRlciA9PSBudWxsKQotCQkJZGVsaW1pdGVyID0gc3VwZXIuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihmaWxlKTsKLQkJcmV0dXJuIGRlbGltaXRlcjsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJaWYgKGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9IG5ldyBIVE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKTsKLQkJfQotCQlyZXR1cm4gZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVMb2FkQWRhcHQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJLy8gRE1XOiBqdXN0IGFkZGVkIHRoaXMgcHJlbG9hZCBvbiA4LzE2LzIwMDIKLQkJLy8gSSBub3RpY2VkIHRoZSBQcm9hZ2F0aW5nQWRhcHRlckZhY3Rvcnkgd2FzIGJlaW5nIGFkZGVkLAotCQkvLyB0aGF0IHRoYXQgdGhlIFByb2FnYXRpbmdBZGFwdGVyQWRhcHRlciB3YXMgbm90IGJlaW5nCi0JCS8vIHByZWxvYWQgYWRhcHRlZCAtLSBJJ20gYXNzdWluZyBpdCBBTFdBWVMgaGFzIHRvIGJlLgotCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JCS8vIGlmIHRoZXJlIGlzIGEgbW9kZWwgaW4gdGhlIGFkYXB0ZXIsIHRoaXMgd2lsbCBhZGFwdCBpdCB0bwotCQkvLyBmaXJzdCBub2RlLiBBZnRlciB0aGF0IHRoZSBQcm9wYWdhdGluZ0FkYXRlciBzcHJlYWRzIG92ZXIgdGhlCi0JCS8vIGNoaWxkcmVuIGJlaW5nCi0JCS8vIGNyZWF0ZWQuIEVhY2ggdGltZSB0aGF0IGhhcHBlbmRzLCBhIHNpZGUgZWZmZWN0IGlzIHRvCi0JCS8vIGFsc28gInNwcmVhZCIgc3ByZWNpZmljIHJlZ2lzdGVyZWQgYWRhcHRlcnMsCi0JCS8vIHRoZXkgdHdvIGNhbiBwcm9waWdhdGUgaXMgbmVlZGVkLgotCQkoKElOb2RlTm90aWZpZXIpIGRvbU1vZGVsLmdldERvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUwoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IEhUTUxEb2N1bWVudExvYWRlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9IVE1MTW9kZWxMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9IVE1MTW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4YjE1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSFRNTE1vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5ET01TdHlsZU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzcy5IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzcy5TdHlsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5EZWJ1Z0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm9wYWdhdGUuUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgSFRNTE1vZGVsTG9hZGVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbExvYWRlciB7Ci0KLQotCXB1YmxpYyBIVE1MTW9kZWxMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGFkZCB0YWcgbmFtZXMgdXNpbmcgQmxvY2tNYXJrZXIgb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSFRNTGlzaFRhZyhYTUxTb3VyY2VQYXJzZXIgcGFyc2VyLCBTdHJpbmcgdGFnbmFtZSkgewotCQlCbG9ja01hcmtlciBibSA9IG5ldyBCbG9ja01hcmtlcih0YWduYW1lLCBudWxsLCBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQsIGZhbHNlKTsKLQkJcGFyc2VyLmFkZEJsb2NrTWFya2VyKGJtKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQkJRE9NU3R5bGVNb2RlbEltcGwgbW9kZWwgPSBuZXcgRE9NU3R5bGVNb2RlbEltcGwoKTsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHRob3NlIGZhY3RvcmllcyB3aGljaCBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZQotCSAqIHN0cnVjdHVyZWRNb2RlbCBiZWZvcmUgY29udGVudCBpcyBhcHBsaWVkLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlmYWN0b3J5ID0gU3R5bGVBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlmYWN0b3J5ID0gSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlmYWN0b3J5ID0gbmV3IEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeSgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlmYWN0b3J5ID0gSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJLy8KLQkJZmFjdG9yeSA9IG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0KLQkJZmFjdG9yeSA9IG5ldyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQkKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZUxvYWRBZGFwdChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlzdXBlci5wcmVMb2FkQWRhcHQoc3RydWN0dXJlZE1vZGVsKTsKLQkJLy8gRE1XOiBqdXN0IGFkZGVkIHRoaXMgcHJlbG9hZCBvbiA4LzE2LzIwMDIKLQkJLy8gSSBub3RpY2VkIHRoZSBQcm9hZ2F0aW5nQWRhcHRlckZhY3Rvcnkgd2FzIGJlaW5nIGFkZGVkLAotCQkvLyB0aGF0IHRoYXQgdGhlIFByb2FnYXRpbmdBZGFwdGVyQWRhcHRlciB3YXMgbm90IGJlaW5nCi0JCS8vIHByZWxvYWQgYWRhcHRlZCAtLSBJJ20gYXNzdWluZyBpdCBBTFdBWVMgaGFzIHRvIGJlLgotCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JCS8vIGlmIHRoZXJlIGlzIGEgbW9kZWwgaW4gdGhlIGFkYXB0ZXIsIHRoaXMgd2lsbCBhZGFwdCBpdCB0bwotCQkvLyBmaXJzdCBub2RlLiBBZnRlciB0aGF0IHRoZSBQcm9wYWdhdGluZ0FkYXRlciBzcHJlYWRzIG92ZXIgdGhlCi0JCS8vIGNoaWxkcmVuIGJlaW5nCi0JCS8vIGNyZWF0ZWQuIEVhY2ggdGltZSB0aGF0IGhhcHBlbmRzLCBhIHNpZGUgZWZmZWN0IGlzIHRvCi0JCS8vIGFsc28gInNwcmVhZCIgc3ByZWNpZmljIHJlZ2lzdGVyZWQgYWRhcHRlcnMsCi0JCS8vIHRoZXkgdHdvIGNhbiBwcm9waWdhdGUgaXMgbmVlZGVkLgotCQkoKElOb2RlTm90aWZpZXIpIGRvbU1vZGVsLmdldERvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKERlYnVnLmRlYnVnTm90aWZpY2F0aW9uQW5kRXZlbnRzKSB7Ci0JCQlQcm9wYWdhdGluZ0FkYXB0ZXIgcHJvcGFnYXRpbmdBZGFwdGVyID0gKFByb3BhZ2F0aW5nQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBkb21Nb2RlbC5nZXREb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3IERlYnVnQWRhcHRlckZhY3RvcnkoKSk7Ci0JCX0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBIVE1MTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCkgewotCQlpZiAoZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbmV3IEhUTUxEb2N1bWVudExvYWRlcigpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudExvYWRlckluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvRW1iZWRkZWRDU1NGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvRW1iZWRkZWRDU1NGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRlYzY3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0VtYmVkZGVkQ1NTRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotCi0vLyBuYWthbW9yaV9UT0RPOiBjaGVjayBhbmQgcmVtb3ZlCi0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZENTU0Zvcm1hdHRlciBleHRlbmRzIEhUTUxGb3JtYXR0ZXIgewotCi0JLy8gcHJpdmF0ZSBJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG5ldwotCS8vIENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkoQ1NTU291cmNlRm9ybWF0dGVyLmNsYXNzLCB0cnVlKTsKLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgRW1iZWRkZWRDU1NGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01UZXh0IHRleHQgPSAoSURPTVRleHQpIG5vZGU7Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IGdldENTU0NvbnRlbnQobm9kZSk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkgeyAvLyBmYWxsYmFjawotCQkJc291cmNlID0gdGV4dC5nZXRTb3VyY2UoKTsKLQkJfQotCi0JCWludCBvZmZzZXQgPSB0ZXh0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSB0ZXh0LmdldEVuZE9mZnNldCgpIC0gb2Zmc2V0OwotCQlyZXBsYWNlU291cmNlKHRleHQuZ2V0TW9kZWwoKSwgb2Zmc2V0LCBsZW5ndGgsIHNvdXJjZSk7Ci0JCXNldFdpZHRoKGNvbnRyYWludHMsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q1NTQ29udGVudChJRE9NTm9kZSB0ZXh0KSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldENTU01vZGVsKHRleHQpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJQ1NTTm9kZSBkb2N1bWVudCA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQ7Ci0JCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSAoQ1NTU291cmNlRm9ybWF0dGVyKSBub3RpZmllci5nZXRBZGFwdGVyRm9yKENTU1NvdXJjZUZvcm1hdHRlci5jbGFzcyk7Ci0JCS8vIHRyeSBhbm90aGVyIHdheSB0byBnZXQgZm9ybWF0dGVyCi0JCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkKLQkJCWZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIobm90aWZpZXIpOwotCQlpZiAoZm9ybWF0dGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IGZvcm1hdHRlci5mb3JtYXQoZG9jdW1lbnQpOwotCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSUNTU01vZGVsIGdldENTU01vZGVsKElET01Ob2RlIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIHRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgSVN0eWxlU2hlZXRBZGFwdGVyKSkKLQkJCXJldHVybiBudWxsOwotCQlJU3R5bGVTaGVldEFkYXB0ZXIgc3R5bGVBZGFwdGVyID0gKElTdHlsZVNoZWV0QWRhcHRlcikgYWRhcHRlcjsKLQkJcmV0dXJuIHN0eWxlQWRhcHRlci5nZXRNb2RlbCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxFbGVtZW50Rm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxFbGVtZW50Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMTRkZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRWxlbWVudEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZURlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8vIG5ha2Ftb3JpX1RPRE86IGNoZWNrIGFuZCByZW1vdmUgQ1NTIGZvcm1hdHRpbmcKLQotcHVibGljIGNsYXNzIEhUTUxFbGVtZW50Rm9ybWF0dGVyIGV4dGVuZHMgSFRNTEZvcm1hdHRlciB7Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSFRNTEVsZW1lbnRGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbXByZXNzVGFpbGluZ1NwYWNlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IHJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCWludCBjb3VudCA9IHJlZ2lvbi5nZXRFbmQoKSAtIG9mZnNldDsKLQkJaWYgKGNvdW50ID09IDEpIHsKLQkJCVN0cmluZyBzb3VyY2UgPSBmbGF0Tm9kZS5nZXRGdWxsVGV4dChyZWdpb24pOwotCQkJaW50IHN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmNoYXJBdChvZmZzZXQgLSBzdGFydCkgPT0gJyAnKSB7Ci0JCQkJLy8gbm90aGluZyB0byBkbwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlyZXBsYWNlU291cmNlKGZsYXROb2RlLCBvZmZzZXQsIGNvdW50LCAiICIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgZm9ybWF0RW5kVGFnKElET01FbGVtZW50IGVsZW1lbnQsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJTm9kZSBsYXN0Q2hpbGQgPSBlbGVtZW50LmdldExhc3RDaGlsZCgpOwotCi0JCWlmIChsYXN0Q2hpbGQgIT0gbnVsbCAmJiBsYXN0Q2hpbGQgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCAmJiBsYXN0Q2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImpzcDpzY3JpcHRsZXQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpbnNlcnRCcmVha0FmdGVyKChJRE9NRWxlbWVudCkgbGFzdENoaWxkLCBjb250cmFpbnRzKTsKLQkJCXJldHVybjsKLQkJfQotCi0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBlbGVtZW50LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSB8fCBlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQlTdHJpbmcgZW5kVGFnID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQoKTsKLQkJCWlmIChlbmRUYWcgIT0gbnVsbCAmJiBlbmRUYWcubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc2V0V2lkdGgoY29udHJhaW50cywgZW5kVGFnKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIHByZXZSZWdpb24gPSBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkVGFnKHJlZ2lvblR5cGUpKSB7Ci0JCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkJcmVtb3ZlVGFpbGluZ1NwYWNlcyhlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHByZXZSZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiAocHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRSb290VGFnKHByZXZSZWdpb24uZ2V0VHlwZSgpKSkpIHsKLQkJCQkJcmVtb3ZlVGFpbGluZ1NwYWNlcyhlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHByZXZSZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCXByZXZSZWdpb24gPSByZWdpb247Ci0JCX0KLQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiAocHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRSb290VGFnKHByZXZSZWdpb24uZ2V0VHlwZSgpKSkpIHsKLQkJCXJlbW92ZVRhaWxpbmdTcGFjZXMoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBwcmV2UmVnaW9uKTsKLQkJfQotCi0JCS8vIEJVRzEyMzg5MCAoZW5kIHRhZyBsZW5ndGggd2FzIGFscmVhZHkgcHJlZmFjdG9yZWQgaW50bwotCQkvLyBmb3JtYXRTdGFydFRhZyBzbyBubyBuZWVkIHRvIGRvIGl0IGhlcmUpCi0JCS8vIFN0cmluZyBuZXdFbmRUYWcgPSBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dCgpOwotCQkvLyBpZiAobmV3RW5kVGFnICE9IG51bGwgJiYgbmV3RW5kVGFnLmxlbmd0aCgpID4gMCkgewotCQkvLyBzZXRXaWR0aChjb250cmFpbnRzLCBuZXdFbmRUYWcpOwotCQkvLyB9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0KLQkJZm9ybWF0U3RhcnRUYWcoZWxlbWVudCwgY29udHJhaW50cyk7Ci0KLQkJZm9ybWF0Q2hpbGROb2RlcyhlbGVtZW50LCBjb250cmFpbnRzKTsKLQotCQlmb3JtYXRFbmRUYWcoZWxlbWVudCwgY29udHJhaW50cyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdFN0YXJ0VGFnKElET01FbGVtZW50IGVsZW1lbnQsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQotCQlpZiAoZWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFscygianNwOnNjcmlwdGxldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWluc2VydEJyZWFrQmVmb3JlKGVsZW1lbnQsIGNvbnRyYWludHMpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gV2Ugc2hvdWxkIGZvcm1hdCBhdHRyaWJ1dGVzIGluIEpTUFRhZz8KLQkJLy8gaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSB8fCBlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQlTdHJpbmcgc3RhcnRUYWcgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQlpZiAoc3RhcnRUYWcgIT0gbnVsbCAmJiBzdGFydFRhZy5sZW5ndGgoKSA+IDApIHsKLQkJCQlzZXRXaWR0aChjb250cmFpbnRzLCBzdGFydFRhZyk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBmaXJzdCBwcm9jZXNzIHN0eWxlIGF0dHJpYnV0ZQotCQlpZiAoZWxlbWVudC5pc0dsb2JhbFRhZygpKSB7Ci0JCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoInN0eWxlIik7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCQlmb3JtYXRTdHlsZUF0dHIoYXR0cik7Ci0JCX0KLQkJYm9vbGVhbiBpbnNlcnRCcmVhayA9IGZhbHNlOwotCQlpbnNlcnRCcmVhayA9ICgoU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBnZXRGb3JtYXRQcmVmZXJlbmNlcygpKS5nZXRTcGxpdE11bHRpQXR0cnMoKTsKLQkJYm9vbGVhbiBhbGlnbkVuZEJyYWNrZXQgPSAoKFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSkuaXNBbGlnbkVuZEJyYWNrZXQoKTsKLQkJYm9vbGVhbiBhdHRyaWJ1dGVzU3BsaXR0ZWQgPSBmYWxzZTsKLQotCQlpZiAoaW5zZXJ0QnJlYWspIHsKLQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsIHx8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCkgPCAyKQotCQkJCWluc2VydEJyZWFrID0gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGJyZWFrU3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMoZWxlbWVudCk7Ci0JCVN0cmluZyBvcmlnaW5hbEJyZWFrU3BhY2VzID0gYnJlYWtTcGFjZXM7Ci0JCVN0cmluZyBpbmRlbnQgPSBnZXRJbmRlbnQoKTsKLQkJaWYgKGluZGVudCAhPSBudWxsICYmIGluZGVudC5sZW5ndGgoKSA+IDApIHsKLQkJCWJyZWFrU3BhY2VzICs9IGluZGVudDsKLQkJfQotCQlJVGV4dFJlZ2lvbiBsYXN0QnJlYWtSZWdpb24gPSBudWxsOwotCi0JCUlUZXh0UmVnaW9uIHByZXZSZWdpb24gPSBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCi0JCQlJVGV4dFJlZ2lvbiBicmVha1JlZ2lvbiA9IG51bGw7Ci0KLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkVGFnKHJlZ2lvblR5cGUpKSB7Ci0JCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJCQlyZW1vdmVUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBwcmV2UmVnaW9uKTsKLQkJCQl9Ci0JCQkJYnJlYWtSZWdpb24gPSByZWdpb247Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCWlmIChwcmV2UmVnaW9uICE9IG51bGwgJiYgKHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSB8fCBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykpIHsKLQkJCQkJLy8gYXR0cmlidXRlIG5hbWUgd2l0aG91dCB2YWx1ZQotCQkJCQlicmVha1JlZ2lvbiA9IHByZXZSZWdpb247Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCWlmIChwcmV2UmVnaW9uICE9IG51bGwgJiYgcHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCXJlbW92ZVRhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHByZXZSZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWlmIChwcmV2UmVnaW9uICE9IG51bGwgJiYgcHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQkJcmVtb3ZlVGFpbGluZ1NwYWNlcyhzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcHJldlJlZ2lvbik7Ci0JCQkJfQotCQkJCWJyZWFrUmVnaW9uID0gcmVnaW9uOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIChwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUgfHwgcHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpKSB7Ci0JCQkJCS8vIGF0dHJpYnV0ZSBuYW1lIHdpdGhvdXQgdmFsdWUKLQkJCQkJYnJlYWtSZWdpb24gPSBwcmV2UmVnaW9uOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGJyZWFrUmVnaW9uICE9IG51bGwpIHsKLQkJCQlpbnQgZW5kID0gYnJlYWtSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJCWlmIChsYXN0QnJlYWtSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpbnQgb2Zmc2V0ID0gbGFzdEJyZWFrUmVnaW9uLmdldEVuZCgpOwotCQkJCQlpbnQgY291bnQgPSBlbmQgLSBvZmZzZXQ7Ci0JCQkJCWlmIChpbnNlcnRCcmVhayB8fCAhaXNXaWR0aEF2YWlsYWJsZShjb250cmFpbnRzLCBjb3VudCArIDEpKSB7Ci0JCQkJCQlyZXBsYWNlVGFpbGluZ1NwYWNlcyhzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgbGFzdEJyZWFrUmVnaW9uLCBicmVha1NwYWNlcyk7Ci0JCQkJCQlzZXRXaWR0aChjb250cmFpbnRzLCBicmVha1NwYWNlcyk7Ci0JCQkJCQlhdHRyaWJ1dGVzU3BsaXR0ZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJY29tcHJlc3NUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBsYXN0QnJlYWtSZWdpb24pOwotCQkJCQkJYWRkV2lkdGgoY29udHJhaW50cywgMSk7Ci0JCQkJCX0KLQkJCQkJYWRkV2lkdGgoY29udHJhaW50cywgY291bnQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYWRkV2lkdGgoY29udHJhaW50cywgZW5kKTsKLQkJCQl9Ci0JCQkJbGFzdEJyZWFrUmVnaW9uID0gYnJlYWtSZWdpb247Ci0JCQl9Ci0KLQkJCXByZXZSZWdpb24gPSByZWdpb247Ci0JCX0KLQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiAocHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSkgewotCQkJLy8gYXR0cmlidXRlIG5hbWUgd2l0aG91dCB2YWx1ZQotCQkJaW50IGVuZCA9IHByZXZSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJaWYgKGxhc3RCcmVha1JlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaW50IG9mZnNldCA9IGxhc3RCcmVha1JlZ2lvbi5nZXRFbmQoKTsKLQkJCQlpbnQgY291bnQgPSBlbmQgLSBvZmZzZXQ7Ci0JCQkJaWYgKGluc2VydEJyZWFrIHx8ICFpc1dpZHRoQXZhaWxhYmxlKGNvbnRyYWludHMsIGNvdW50ICsgMSkpIHsKLQkJCQkJcmVwbGFjZVRhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGxhc3RCcmVha1JlZ2lvbiwgYnJlYWtTcGFjZXMpOwotCQkJCQlzZXRXaWR0aChjb250cmFpbnRzLCBicmVha1NwYWNlcyk7Ci0JCQkJCWF0dHJpYnV0ZXNTcGxpdHRlZCA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljb21wcmVzc1RhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGxhc3RCcmVha1JlZ2lvbik7Ci0JCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIDEpOwotCQkJCX0KLQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCBjb3VudCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCBlbmQpOwotCQkJfQotCQkJbGFzdEJyZWFrUmVnaW9uID0gcHJldlJlZ2lvbjsKLQkJfQotCi0JCWlmIChsYXN0QnJlYWtSZWdpb24gIT0gbnVsbCkgewotCQkJaW50IG9mZnNldCA9IGxhc3RCcmVha1JlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQlpbnQgY291bnQgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSAtIG9mZnNldDsKLQkJCWlmIChwcmV2UmVnaW9uICE9IG51bGwgJiYgcHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJY29tcHJlc3NUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBsYXN0QnJlYWtSZWdpb24pOwotCQkJCWNvdW50Kys7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBsYXN0QnJlYWtSZWdpb24pOwotCQkJCS8vIEJVRzEyMzg5MCAocHJlLWZhY3RvciBpbiBlbmQgdGFnKQotCQkJCWNvdW50ICs9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpLmxlbmd0aCgpICsgMzsKLQkJCX0KLQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIGNvdW50KTsKLQkJfQotCQllbHNlIHsKLQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJfQotCQkvLyBCVUcxMTM1ODQgLSBhbGlnbiBsYXN0IGJyYWNrZXQKLQkJaWYgKGFsaWduRW5kQnJhY2tldCAmJiBhdHRyaWJ1dGVzU3BsaXR0ZWQpIHsKLQkJCXJlbW92ZVRhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGxhc3RCcmVha1JlZ2lvbik7Ci0JCQlyZXBsYWNlVGFpbGluZ1NwYWNlcyhzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgbGFzdEJyZWFrUmVnaW9uLCBvcmlnaW5hbEJyZWFrU3BhY2VzKTsKLQkJCWNvbnRyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGdldExpbmVXaWR0aCgpIC0gb3JpZ2luYWxCcmVha1NwYWNlcy5sZW5ndGgoKSAtIDEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc05lc3RlZFRhZyhTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlmaW5hbCBTdHJpbmcgSlNQX1JPT1RfVEFHX05BTUUgPSAiSlNQX1JPT1RfVEFHX05BTUUiOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX05BTUUgPSAiSlNQX0RJUkVDVElWRV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUuZXF1YWxzKEpTUF9ST09UX1RBR19OQU1FKSB8fCByZWdpb25UeXBlLmVxdWFscyhKU1BfRElSRUNUSVZFX05BTUUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXN0ZWRSb290VGFnKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWZpbmFsIFN0cmluZyBKU1BfUk9PVF9UQUdfTkFNRSA9ICJKU1BfUk9PVF9UQUdfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlLmVxdWFscyhKU1BfUk9PVF9UQUdfTkFNRSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgZm9ybWF0U3R5bGVBdHRyKEF0dHIgYXR0cikgewotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyBpZiBzb21lb25lJ3MgbWFkZSBpdCBhIGNvbnRhaW5lciBzb21laG93LCBDU1MgY2FuJ3QgZm9ybWF0IGl0Ci0JCWlmICgoKElET01Ob2RlKSBhdHRyKS5nZXRWYWx1ZVJlZ2lvbigpIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyB2YWx1ZSA9IGdldENTU1ZhbHVlKGF0dHIpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIG9sZFZhbHVlID0gKChJRE9NTm9kZSkgYXR0cikuZ2V0VmFsdWVTb3VyY2UoKTsKLQkJaWYgKG9sZFZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkKLQkJCXJldHVybjsKLQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJQ1NTTW9kZWwgZ2V0Q1NTTW9kZWwoQXR0ciBhdHRyKSB7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyKSkKLQkJCXJldHVybiBudWxsOwotCQlJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIgc3R5bGVBZGFwdGVyID0gKElTdHlsZURlY2xhcmF0aW9uQWRhcHRlcikgYWRhcHRlcjsKLQkJcmV0dXJuIHN0eWxlQWRhcHRlci5nZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENTU1ZhbHVlKEF0dHIgYXR0cikgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRDU1NNb2RlbChhdHRyKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNTU05vZGUgZG9jdW1lbnQgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGRvY3VtZW50OwotCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKENTU1NvdXJjZUZvcm1hdHRlcikgbm90aWZpZXIuZ2V0QWRhcHRlckZvcihDU1NTb3VyY2VGb3JtYXR0ZXIuY2xhc3MpOwotCQkvLyB0cnkgYW5vdGhlciB3YXkgdG8gZ2V0IGZvcm1hdHRlcgotCQlpZiAoZm9ybWF0dGVyID09IG51bGwpCi0JCQlmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKG5vdGlmaWVyKTsKLQkJaWYgKGZvcm1hdHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBmb3JtYXR0ZXIuZm9ybWF0KGRvY3VtZW50KTsKLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlVGFpbGluZ1NwYWNlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IHJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCWludCBjb3VudCA9IHJlZ2lvbi5nZXRFbmQoKSAtIG9mZnNldDsKLQkJaWYgKGNvdW50IDw9IDApCi0JCQlyZXR1cm47Ci0JCXJlcGxhY2VTb3VyY2UoZmxhdE5vZGUsIG9mZnNldCwgY291bnQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZXBsYWNlVGFpbGluZ1NwYWNlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24sIFN0cmluZyBzcGFjZXMpIHsKLQkJaW50IG9mZnNldCA9IHJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCWludCBjb3VudCA9IHJlZ2lvbi5nZXRFbmQoKSAtIG9mZnNldDsKLQkJaWYgKGNvdW50ID09IHNwYWNlcy5sZW5ndGgoKSkgewotCQkJU3RyaW5nIHNvdXJjZSA9IGZsYXROb2RlLmdldEZ1bGxUZXh0KHJlZ2lvbik7Ci0JCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmVuZHNXaXRoKHNwYWNlcykpIHsKLQkJCQkvLyBub3RoaW5nIHRvIGRvCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXJlcGxhY2VTb3VyY2UoZmxhdE5vZGUsIG9mZnNldCwgY291bnQsIHNwYWNlcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdENvbnRyYWludHNJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxGb3JtYXRDb250cmFpbnRzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjgxNTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdENvbnRyYWludHNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqIFBsZWFzZSB1bi1kZXByZWNhdGUgdGhpcyBpZiBQYWdlIERlc2lnbmVyIHRoaW5rcyB0aGV5IGFyZSBuZWVkZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRm9ybWF0Q29udHJhaW50c0ltcGwgZXh0ZW5kcyBTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBpbXBsZW1lbnRzIEhUTUxGb3JtYXRDb250cmFpbnRzIHsKLQlwcm90ZWN0ZWQgaW50IGZBdmFpbGFibGVMaW5lV2lkdGg7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqIAlJdCdzIHZlcnkgaGFyZCB0byBrZWVwIHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCBhY2N1cmF0ZS4KLQkgKiAJU29tZXRpbWVzIGEgbm9kZSB3YW50cyB0byBzdGFydCBvbiBhIG5ldyBsaW5lLCBzb21ldGltZXMgaXQgZG9lc24ndC4KLQkgKiAJSXQncyBiZXN0IGZvciB0aGUgbm9kZSB0byBmaWd1cmUgb3V0IHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCBvbiB0aGUgZmx5LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCkgewotCQlyZXR1cm4gZkF2YWlsYWJsZUxpbmVXaWR0aDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqIAlJdCdzIHZlcnkgaGFyZCB0byBrZWVwIHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCBhY2N1cmF0ZS4KLQkgKiAJU29tZXRpbWVzIGEgbm9kZSB3YW50cyB0byBzdGFydCBvbiBhIG5ldyBsaW5lLCBzb21ldGltZXMgaXQgZG9lc24ndC4KLQkgKiAJSXQncyBiZXN0IGZvciB0aGUgbm9kZSB0byBmaWd1cmUgb3V0IHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCBvbiB0aGUgZmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF2YWlsYWJsZUxpbmVXaWR0aChpbnQgYXZhaWxhYmxlTGluZVdpZHRoKSB7Ci0JCWZBdmFpbGFibGVMaW5lV2lkdGggPSBhdmFpbGFibGVMaW5lV2lkdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTUyYmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdFByb2Nlc3NvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MRm9ybWF0UHJvY2Vzc29ySW1wbCBleHRlbmRzIEZvcm1hdFByb2Nlc3NvclhNTCB7Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gImh0bWwiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0dGVyIGdldEZvcm1hdHRlcihOb2RlIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gSFRNTEZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVGb3JtYXR0ZXIobm9kZSwgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSk7Ci0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBnZXRGb3JtYXRQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZGb3JtYXRQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmRm9ybWF0UHJlZmVyZW5jZXMgPSBuZXcgU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKCk7Ci0KLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRMaW5lV2lkdGgocHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKTsKLQkJCQkoKFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5zZXRTcGxpdE11bHRpQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQkJCSgoU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBmRm9ybWF0UHJlZmVyZW5jZXMpLnNldEFsaWduRW5kQnJhY2tldChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFMSUdOX0VORF9CUkFDS0VUKSk7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCi0JCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCQlpZiAoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQkJfQotCQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJCX0KLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KGluZGVudC50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmRm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NDI4ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MRm9ybWF0dGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfTkFNRSA9ICJodG1sIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPRFlfTkFNRSA9ICJCT0RZIjsvLyROT04tTkxTLTEkCi0JLy8gaGlkZGVuIGpzcCBsb2dpYyB0aGF0IHNob3VsZCBiZSByZW1vdmVkIHdoZW4ganNwIGZvcm1hdHRlciBpcyBjcmVhdGVkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUCA9ICJqc3AiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdpZHRoKEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMsIGludCB3aWR0aCkgewotCQlpZiAoY29udHJhaW50cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoIXNwbGl0TGluZXMoKSB8fCBnZXRMaW5lV2lkdGgoKSA8IDApCi0JCQlyZXR1cm47Ci0KLQkJaW50IGF2YWlsYWJsZVdpZHRoID0gY29udHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKSAtIHdpZHRoOwotCQlpZiAoYXZhaWxhYmxlV2lkdGggPCAwKQotCQkJYXZhaWxhYmxlV2lkdGggPSAwOwotCQljb250cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuRm9ybWF0Q2hpbGQoTm9kZSBub2RlKSB7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCWlmIChkZWNsICE9IG51bGwpIHsKLQkJCQlpZiAoZGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKGRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfS0VFUF9TUEFDRSkpIHsKLQkJCQkJYm9vbGVhbiBzaG91bGRLZWVwU3BhY2UgPSAoKEJvb2xlYW4pIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5TSE9VTERfS0VFUF9TUEFDRSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQlpZiAoc2hvdWxkS2VlcFNwYWNlKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuSW5zZXJ0QnJlYWtBZnRlcihDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLkxJTkVfQlJFQUtfSElOVCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBoaW50ID0gKFN0cmluZykgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLkxJTkVfQlJFQUtfSElOVCk7Ci0JCWlmIChoaW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoaGludC5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQpIHx8IGhpbnQuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0FGVEVSX1NUQVJUKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuSW5zZXJ0QnJlYWtBZnRlcihOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlOb2RlIG5leHQgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJLy8gc3BlY2lhbCBleGNlcHRpb24gaWYgdGhpcyBub2RlIGlzIGEgbm9uLUhUTUwgdGFnIChsaWtlIEpTUAotCQkvLyBlbGVtZW50cykKLQkJLy8gQlVHMTg4MDkzIC0gb25seSBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIGZvciBqc3AgKG5vdCBjdXN0b20pIHRhZ3MKLQkJU3RyaW5nIHByZWZpeCA9IG5vZGUuZ2V0UHJlZml4KCk7Ci0JCWlmIChwcmVmaXggIT0gbnVsbCAmJiBKU1AuZXF1YWxzKHByZWZpeCkpIHsKLQkJCWJvb2xlYW4gY2FuSW5zZXJ0QnJlYWtBZnRlciA9IGZhbHNlOwotCQkJLy8gaWYgYSB3aGl0ZXNwYWNlIGRvZXMgbm90IGV4aXN0IGFmdGVyIGl0LCBkbyBub3QgYWRkIG9uZQotCQkJaWYgKG5leHQgIT0gbnVsbCAmJiBuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlTdHJpbmcgdGhlVGV4dCA9ICgoVGV4dCkgbmV4dCkuZ2V0RGF0YSgpOwotCQkJCWlmICh0aGVUZXh0ICE9IG51bGwgJiYgdGhlVGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJY2hhciB0aGVDaGFyID0gdGhlVGV4dC5jaGFyQXQoMCk7Ci0JCQkJCWNhbkluc2VydEJyZWFrQWZ0ZXIgPSBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRoZUNoYXIpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGlmIGNhbm5vdCBpbnNlcnQgYnJlYWssIGdvIGFoZWFkIGFuZCByZXR1cm4gZmFsc2UgKG90aGVyd2lzZSwKLQkJCS8vIGNvbnRpbnVlIHByb2Nlc3NpbmcpCi0JCQlpZiAoIWNhbkluc2VydEJyZWFrQWZ0ZXIpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gc3BlY2lhbCBleGNlcHRpb24gaWYgbmV4dCBub2RlIGlzIGEgbm9uLUhUTUwgdGFnIChsaWtlIEpTUAotCQkvLyBlbGVtZW50cykKLQkJLy8gQlVHMTg4MDkzIC0gb25seSBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIGZvciBqc3AgKG5vdCBjdXN0b20pIHRhZ3MKLQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJcHJlZml4ID0gbmV4dC5nZXRQcmVmaXgoKTsKLQkJCWlmIChwcmVmaXggIT0gbnVsbCAmJiBKU1AuZXF1YWxzKHByZWZpeCkpIHsKLQkJCQlib29sZWFuIGNhbkluc2VydEJyZWFrQWZ0ZXJQcmV2aW91cyA9IGZhbHNlOwotCQkJCS8vIGlmIGEgd2hpdGVzcGFjZSBkb2VzIG5vdCBleGlzdCBiZWZvcmUgaXQsIGRvIG5vdCBhZGQgb25lCi0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQlTdHJpbmcgdGhlVGV4dCA9ICgoVGV4dCkgbm9kZSkuZ2V0RGF0YSgpOwotCQkJCQlpZiAodGhlVGV4dCAhPSBudWxsICYmIHRoZVRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQljaGFyIHRoZUNoYXIgPSB0aGVUZXh0LmNoYXJBdCh0aGVUZXh0Lmxlbmd0aCgpIC0gMSk7Ci0JCQkJCQljYW5JbnNlcnRCcmVha0FmdGVyUHJldmlvdXMgPSBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRoZUNoYXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIGlmIGNhbm5vdCBpbnNlcnQgYnJlYWssIGdvIGFoZWFkIGFuZCByZXR1cm4gZmFsc2UKLQkJCQkvLyAob3RoZXJ3aXNlLAotCQkJCS8vIGNvbnRpbnVlIHByb2Nlc3NpbmcpCi0JCQkJaWYgKCFjYW5JbnNlcnRCcmVha0FmdGVyUHJldmlvdXMpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJLy8gZG8gbm90IGluc2VydCBicmVhayBhZnRlciB1bmNsb3NlZCB0YWcKLQkJCQlpZiAoISgoSURPTUVsZW1lbnQpIG5vZGUpLmlzQ2xvc2VkKCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBwYXJlbnQ7Ci0JCQkvLyBkbyBub3QgaW5zZXJ0IGJyZWFrIGJlZm9yZSBtaXNzaW5nIGVuZCB0YWcKLQkJCWlmIChuZXh0ID09IG51bGwgJiYgZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJLy8gaW5zZXJ0IGxpbmUgYnJlYWsgdW5kZXIgbm9uLUhUTUwgZWxlbWVudHMgaW5jbHVkaW5nIEpTUAotCQkJLy8gZWxlbWVudHMKLQkJCWlmIChlbGVtZW50LmdldFByZWZpeCgpICE9IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7Ci0KLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQlpZiAoZGVjbCAhPSBudWxsKSB7Ci0JCQkJaWYgKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCS8vIHNwZWNpYWwgZm9yIGRpcmVjdCBjaGlsZHJlbiB1bmRlciBCT0RZCi0JCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCAmJiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQk9EWV9OQU1FKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCWlmIChjYW5JbnNlcnRCcmVha0FmdGVyKGRlY2wpKSB7Ci0JCQkJLy8gc3BjaWFsIGZvciBCUgotCQkJCXJldHVybiBjYW5Gb3JtYXRDaGlsZChwYXJlbnQpOwotCQkJfQotCQl9Ci0JCWlmIChuZXh0ICE9IG51bGwgJiYgbmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBuZXh0KTsKLQkJCWlmIChjYW5JbnNlcnRCcmVha0JlZm9yZShkZWNsKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuSW5zZXJ0QnJlYWtCZWZvcmUoQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaGludCA9IChTdHJpbmcpIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpOwotCQlpZiAoaGludCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaGludC5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkluc2VydEJyZWFrQmVmb3JlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU5vZGUgcHJldiA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0KLQkJLy8gc3BlY2lhbCBleGNlcHRpb24gaWYgdGhpcyBub2RlIGlzIGEgbm9uLUhUTUwgdGFnIChsaWtlIEpTUAotCQkvLyBlbGVtZW50cykKLQkJLy8gQlVHMTg4MDkzIC0gb25seSBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIGZvciBqc3AgKG5vdCBjdXN0b20pIHRhZ3MKLQkJU3RyaW5nIHByZWZpeCA9IG5vZGUuZ2V0UHJlZml4KCk7Ci0JCWlmIChwcmVmaXggIT0gbnVsbCAmJiBKU1AuZXF1YWxzKHByZWZpeCkpIHsKLQkJCWJvb2xlYW4gY2FuSW5zZXJ0QnJlYWtCZWZvcmUgPSBmYWxzZTsKLQkJCS8vIGlmIGEgd2hpdGVzcGFjZSBkb2VzIG5vdCBleGlzdCBiZWZvcmUgaXQsIGRvIG5vdCBhZGQgb25lCi0JCQlpZiAocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCVN0cmluZyB0aGVUZXh0ID0gKChUZXh0KSBwcmV2KS5nZXREYXRhKCk7Ci0JCQkJaWYgKHRoZVRleHQgIT0gbnVsbCAmJiB0aGVUZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQljaGFyIHRoZUNoYXIgPSB0aGVUZXh0LmNoYXJBdCh0aGVUZXh0Lmxlbmd0aCgpIC0gMSk7Ci0JCQkJCWNhbkluc2VydEJyZWFrQmVmb3JlID0gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0aGVDaGFyKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBpZiBjYW5ub3QgaW5zZXJ0IGJyZWFrLCBnbyBhaGVhZCBhbmQgcmV0dXJuIGZhbHNlIChvdGhlcndpc2UsCi0JCQkvLyBjb250aW51ZSBwcm9jZXNzaW5nKQotCQkJaWYgKCFjYW5JbnNlcnRCcmVha0JlZm9yZSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBzcGVjaWFsIGV4Y2VwdGlvbiBpZiBwcmV2aW91cyBub2RlIGlzIGEgbm9uLUhUTUwgdGFnIChsaWtlIEpTUAotCQkvLyBlbGVtZW50cykKLQkJLy8gQlVHMTg4MDkzIC0gb25seSBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIGZvciBqc3AgKG5vdCBjdXN0b20pIHRhZ3MKLQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJcHJlZml4ID0gcHJldi5nZXRQcmVmaXgoKTsKLQkJCWlmIChwcmVmaXggIT0gbnVsbCAmJiBKU1AuZXF1YWxzKHByZWZpeCkpIHsKLQkJCQlib29sZWFuIGNhbkluc2VydEJyZWFrQmVmb3JlTmV4dCA9IGZhbHNlOwotCQkJCS8vIGlmIGEgd2hpdGVzcGFjZSBkb2VzIG5vdCBleGlzdCBhZnRlciBpdCwgZG8gbm90IGFkZCBvbmUKLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCVN0cmluZyB0aGVUZXh0ID0gKChUZXh0KSBub2RlKS5nZXREYXRhKCk7Ci0JCQkJCWlmICh0aGVUZXh0ICE9IG51bGwgJiYgdGhlVGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCWNoYXIgdGhlQ2hhciA9IHRoZVRleHQuY2hhckF0KDApOwotCQkJCQkJY2FuSW5zZXJ0QnJlYWtCZWZvcmVOZXh0ID0gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0aGVDaGFyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBpZiBjYW5ub3QgaW5zZXJ0IGJyZWFrLCBnbyBhaGVhZCBhbmQgcmV0dXJuIGZhbHNlCi0JCQkJLy8gKG90aGVyd2lzZSwKLQkJCQkvLyBjb250aW51ZSBwcm9jZXNzaW5nKQotCQkJCWlmICghY2FuSW5zZXJ0QnJlYWtCZWZvcmVOZXh0KQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlpZiAocHJldiA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBwYXJlbnQ7Ci0JCQkvLyBkbyBub3QgaW5zZXJ0IGJyZWFrIGFmdGVyIG1pc3Npbmcgc3RhcnQgdGFnCi0JCQlpZiAocHJldiA9PSBudWxsICYmIGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJLy8gaW5zZXJ0IGxpbmUgYnJlYWsgdW5kZXIgbm9uLUhUTUwgZWxlbWVudHMgaW5jbHVkaW5nIEpTUAotCQkJLy8gZWxlbWVudHMKLQkJCWlmIChlbGVtZW50LmdldFByZWZpeCgpICE9IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7Ci0KLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQlpZiAoZGVjbCAhPSBudWxsKSB7Ci0JCQkJaWYgKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCS8vIHNwZWNpYWwgZm9yIGRpcmVjdCBjaGlsZHJlbiB1bmRlciBCT0RZCi0JCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCAmJiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQk9EWV9OQU1FKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCWlmIChjYW5JbnNlcnRCcmVha0JlZm9yZShkZWNsKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgcHJldik7Ci0JCQlpZiAoY2FuSW5zZXJ0QnJlYWtBZnRlcihkZWNsKSkgewotCQkJCS8vIHNwY2lhbCBmb3IgQlIKLQkJCQlyZXR1cm4gY2FuRm9ybWF0Q2hpbGQocGFyZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgZm9ybWF0KE5vZGUgbm9kZSkgewotCQlmb3JtYXQobm9kZSwgZ2V0Rm9ybWF0Q29udHJhaW50cygpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXQoTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlICYmIGNvbnRyYWludHMgaW5zdGFuY2VvZiBIVE1MRm9ybWF0Q29udHJhaW50cykKLQkJCWZvcm1hdCgoSURPTU5vZGUpIG5vZGUsIChIVE1MRm9ybWF0Q29udHJhaW50cykgY29udHJhaW50cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0KElET01Ob2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGRvIG5vdCBmb3JtYXQgcmVtb3ZlZCBub2RlCi0KLQkJc2V0V2lkdGgoY29udHJhaW50cywgbm9kZSk7Ci0KLQkJaWYgKGNhbkluc2VydEJyZWFrQmVmb3JlKG5vZGUpKQotCQkJaW5zZXJ0QnJlYWtCZWZvcmUobm9kZSwgY29udHJhaW50cyk7Ci0KLQkJZm9ybWF0Tm9kZShub2RlLCBjb250cmFpbnRzKTsKLQotCQlpZiAoY2FuSW5zZXJ0QnJlYWtBZnRlcihub2RlKSkKLQkJCWluc2VydEJyZWFrQWZ0ZXIobm9kZSwgY29udHJhaW50cyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Q2hpbGROb2RlcyhJRE9NTm9kZSBub2RlLCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghbm9kZS5oYXNDaGlsZE5vZGVzKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gY29uY2F0IGFkamFjZW50IHRleHRzCi0JCW5vZGUubm9ybWFsaXplKCk7Ci0KLQkJLy8gZGlzYWJsZSBzaWJsaW5nIGluZGVudCBkdXJpbmcgZm9ybWF0dGluZyBhbGwgdGhlIGNoaWxkcmVuCi0JCWJvb2xlYW4gaW5kZW50ID0gZmFsc2U7Ci0JCWlmIChjb250cmFpbnRzICE9IG51bGwpIHsKLQkJCWluZGVudCA9IGNvbnRyYWludHMuZ2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoKTsKLQkJCWNvbnRyYWludHMuc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoZmFsc2UpOwotCQl9Ci0KLQkJYm9vbGVhbiBpbnNlcnRCcmVhayA9IHRydWU7Ci0JCUlET01Ob2RlIGNoaWxkID0gKElET01Ob2RlKSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXRQYXJlbnROb2RlKCkgIT0gbm9kZSkKLQkJCQlicmVhazsKLQkJCUlET01Ob2RlIG5leHQgPSAoSURPTU5vZGUpIGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCWlmIChpbnNlcnRCcmVhayAmJiBjYW5JbnNlcnRCcmVha0JlZm9yZShjaGlsZCkpIHsKLQkJCQlpbnNlcnRCcmVha0JlZm9yZShjaGlsZCwgY29udHJhaW50cyk7Ci0JCQl9Ci0KLQkJCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IEhUTUxGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlRm9ybWF0dGVyKGNoaWxkLCBnZXRGb3JtYXRQcmVmZXJlbmNlcygpKTsKLQkJCWlmIChmb3JtYXR0ZXIgIT0gbnVsbCkgewotCQkJCWlmIChmb3JtYXR0ZXIgaW5zdGFuY2VvZiBIVE1MRm9ybWF0dGVyKSB7Ci0JCQkJCUhUTUxGb3JtYXR0ZXIgaHRtbEZvcm1hdHRlciA9IChIVE1MRm9ybWF0dGVyKSBmb3JtYXR0ZXI7Ci0JCQkJCWh0bWxGb3JtYXR0ZXIuZm9ybWF0Tm9kZShjaGlsZCwgY29udHJhaW50cyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmb3JtYXR0ZXIuZm9ybWF0KGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjYW5JbnNlcnRCcmVha0FmdGVyKGNoaWxkKSkgewotCQkJCWluc2VydEJyZWFrQWZ0ZXIoY2hpbGQsIGNvbnRyYWludHMpOwotCQkJCWluc2VydEJyZWFrID0gZmFsc2U7IC8vIG5vdCB0byBpbnNlcnQgdHdpY2UKLQkJCX0KLQkJCWVsc2UgewotCQkJCWluc2VydEJyZWFrID0gdHJ1ZTsKLQkJCX0KLQotCQkJY2hpbGQgPSBuZXh0OwotCQl9Ci0KLQkJaWYgKGNvbnRyYWludHMgIT0gbnVsbCkKLQkJCWNvbnRyYWludHMuc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoaW5kZW50KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKElET01Ob2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAobm9kZS5oYXNDaGlsZE5vZGVzKCkpIHsgLy8gY29udGFpbmVyCi0JCQlmb3JtYXRDaGlsZE5vZGVzKG5vZGUsIGNvbnRyYWludHMpOwotCQl9Ci0JCWVsc2UgeyAvLyBsZWFmCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgc291cmNlID0gZmxhdE5vZGUuZ2V0VGV4dCgpOwotCQkJCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXNldFdpZHRoKGNvbnRyYWludHMsIHNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRCcmVha1NwYWNlcyhOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCVN0cmluZyBkZWxpbSA9ICgoSURPTU5vZGUpIG5vZGUpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZURlbGltaXRlcigpOwotCQlpZiAoZGVsaW0gIT0gbnVsbCAmJiBkZWxpbS5sZW5ndGgoKSA+IDApCi0JCQlidWZmZXIuYXBwZW5kKGRlbGltKTsKLQotCQlTdHJpbmcgaW5kZW50ID0gZ2V0SW5kZW50KCk7Ci0JCWlmIChpbmRlbnQgIT0gbnVsbCAmJiBpbmRlbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlmb3IgKE5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQlicmVhazsKLQkJCQkvLyBpZ25vcmUgb21pdHRlZCB0YWcKLQkJCQlpZiAoKChJRE9NTm9kZSkgcGFyZW50KS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgcGFyZW50OwotCQkJCWlmIChlbGVtZW50LmdldFByZWZpeCgpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0JCQkJCS8vIHNwZWNpYWwgZm9yIGh0bWw6aHRtbAotCQkJCQlpZiAobG9jYWxOYW1lICE9IG51bGwgJiYgIWxvY2FsTmFtZS5lcXVhbHMoSFRNTF9OQU1FKSkgewotCQkJCQkJYnVmZmVyLmFwcGVuZChpbmRlbnQpOwotCQkJCQl9Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQkJaWYgKGRlY2wgIT0gbnVsbCAmJiBkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lOREVOVF9DSElMRF9TT1VSQ0UpKSB7Ci0JCQkJCWJvb2xlYW4gc2hvdWxkSW5kZW50ID0gKChCb29sZWFuKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lOREVOVF9DSElMRF9TT1VSQ0UpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKHNob3VsZEluZGVudCkKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoaW5kZW50KTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluZGVudCgpIHsKLQkJcmV0dXJuIGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0SW5kZW50KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRMaW5lV2lkdGgoKSB7Ci0JCXJldHVybiBnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldExpbmVXaWR0aCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2N1bWVudCk7Ci0JCWlmIChtb2RlbFF1ZXJ5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0QnJlYWtBZnRlcihJRE9NTm9kZSBub2RlLCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQlyZXR1cm47Ci0JCS8vIGRvbid0IGluc2VydCBicmVhayBpZiBub2RlIGlzIG9uIHRoZSBsYXN0IGxpbmUKLQkJaW50IGRvY3VtZW50TGVuZ3RoID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQkJaWYgKGRvY3VtZW50TGVuZ3RoIDwgMSB8fCAobm9kZS5nZXRFbmRPZmZzZXQoKSA+PSAoZG9jdW1lbnRMZW5ndGggLSAxKSkpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBuZXh0ID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCVN0cmluZyBzcGFjZXMgPSBudWxsOwotCQlpZiAobmV4dCA9PSBudWxsKSB7IC8vIGxhc3Qgc3BhY2VzCi0JCQkvLyB1c2UgcGFyZW50IGluZGVudCBmb3IgdGhlIGVuZCB0YWcKLQkJCXNwYWNlcyA9IGdldEJyZWFrU3BhY2VzKHBhcmVudCk7Ci0JCX0KLQkJZWxzZSBpZiAobmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlpZiAoY29udHJhaW50cyAhPSBudWxsICYmIGNvbnRyYWludHMuZ2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoKSkgewotCQkJCUlET01Ob2RlIHRleHQgPSAoSURPTU5vZGUpIG5leHQ7Ci0JCQkJSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gSFRNTEZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVGb3JtYXR0ZXIodGV4dCwgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSk7Ci0JCQkJaWYgKGZvcm1hdHRlciBpbnN0YW5jZW9mIEhUTUxUZXh0Rm9ybWF0dGVyKSB7Ci0JCQkJCUhUTUxUZXh0Rm9ybWF0dGVyIHRleHRGb3JtYXR0ZXIgPSAoSFRNTFRleHRGb3JtYXR0ZXIpIGZvcm1hdHRlcjsKLQkJCQkJdGV4dEZvcm1hdHRlci5mb3JtYXRUZXh0KHRleHQsIGNvbnRyYWludHMsIEhUTUxUZXh0Rm9ybWF0dGVyLkZPUk1BVF9IRUFEKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhub2RlKTsKLQkJfQotCQlpZiAoc3BhY2VzID09IG51bGwgfHwgc3BhY2VzLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0KLQkJcmVwbGFjZVNvdXJjZShub2RlLmdldE1vZGVsKCksIG5vZGUuZ2V0RW5kT2Zmc2V0KCksIDAsIHNwYWNlcyk7Ci0JCXNldFdpZHRoKGNvbnRyYWludHMsIHNwYWNlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0QnJlYWtCZWZvcmUoSURPTU5vZGUgbm9kZSwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcHJldiA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0KLQkJU3RyaW5nIHNwYWNlcyA9IG51bGw7Ci0JCWlmIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlpZiAoY29udHJhaW50cyAhPSBudWxsICYmIGNvbnRyYWludHMuZ2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoKSkgewotCQkJCUlET01Ob2RlIHRleHQgPSAoSURPTU5vZGUpIHByZXY7Ci0JCQkJSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gSFRNTEZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVGb3JtYXR0ZXIodGV4dCwgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSk7Ci0JCQkJaWYgKGZvcm1hdHRlciBpbnN0YW5jZW9mIEhUTUxUZXh0Rm9ybWF0dGVyKSB7Ci0JCQkJCUhUTUxUZXh0Rm9ybWF0dGVyIHRleHRGb3JtYXR0ZXIgPSAoSFRNTFRleHRGb3JtYXR0ZXIpIGZvcm1hdHRlcjsKLQkJCQkJdGV4dEZvcm1hdHRlci5mb3JtYXRUZXh0KHRleHQsIGNvbnRyYWludHMsIEhUTUxUZXh0Rm9ybWF0dGVyLkZPUk1BVF9UQUlMKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhub2RlKTsKLQkJfQotCQlpZiAoc3BhY2VzID09IG51bGwgfHwgc3BhY2VzLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0KLQkJcmVwbGFjZVNvdXJjZShub2RlLmdldE1vZGVsKCksIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgMCwgc3BhY2VzKTsKLQkJc2V0V2lkdGgoY29udHJhaW50cywgc3BhY2VzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dpZHRoQXZhaWxhYmxlKEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMsIGludCB3aWR0aCkgewotCQlpZiAoY29udHJhaW50cyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICghc3BsaXRMaW5lcygpIHx8IGdldExpbmVXaWR0aCgpIDwgMCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gKGNvbnRyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCkgPj0gd2lkdGgpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGtlZXBCbGFua0xpbmVzKEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJaWYgKGNvbnRyYWludHMgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gKCFjb250cmFpbnRzLmdldENsZWFyQWxsQmxhbmtMaW5lcygpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlU291cmNlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZmxhdE5vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlzb3VyY2UgPSBuZXcgU3RyaW5nKCk7Ci0JCWludCBzdGFydE9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQuY29udGFpbnNSZWFkT25seShzdGFydE9mZnNldCArIG9mZnNldCwgbGVuZ3RoKSkKLQkJCXJldHVybjsKLQkJLy8gV2UgdXNlICdzdHJ1Y3R1cmVkRG9jdW1lbnQnIGFzIHRoZSByZXF1ZXN0ZXIgb2JqZWN0IGp1c3Qgc28gdGhpcwotCQkvLyBhbmQgdGhlIG90aGVyCi0JCS8vIGZvcm1hdC1yZWxhdGVkICdyZXBhbGNlVGV4dCcgKGluIHJlcGxhY2VTb3VyY2UpIGNhbiB1c2UgdGhlIHNhbWUKLQkJLy8gcmVxdWVzdGVyLgotCQkvLyBPdGhlcndpc2UsIGlmIHJlcXVlc3RlciBpcyBub3QgaWRlbnRpY2FsLAotCQkvLyB0aGUgdW5kbyBncm91cCBnZXRzICJicm9rZW4iIGludG8gbXVsdGlwbGUgcGllY2VzIGJhc2VkCi0JCS8vIG9uIHRoZSByZXF1ZXN0ZXJzIGJlaW5nIGRpZmZlcmVudC4gVGVjaG5pY2FsbHksIGFueSB1bmlxdWUsIGNvbW1vbgotCQkvLyByZXF1ZXN0ZXIgb2JqZWN0IHdvdWxkIHdvcmsuCi0JCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0T2Zmc2V0ICsgb2Zmc2V0LCBsZW5ndGgsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZVNvdXJjZShJRE9NTW9kZWwgbW9kZWwsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJc291cmNlID0gbmV3IFN0cmluZygpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50LmNvbnRhaW5zUmVhZE9ubHkob2Zmc2V0LCBsZW5ndGgpKQotCQkJcmV0dXJuOwotCQkvLyBXZSB1c2UgJ3N0cnVjdHVyZWREb2N1bWVudCcgYXMgdGhlIHJlcXVlc3RlciBvYmplY3QganVzdCBzbyB0aGlzCi0JCS8vIGFuZCB0aGUgb3RoZXIKLQkJLy8gZm9ybWF0LXJlbGF0ZWQgJ3JlcGFsY2VUZXh0JyAoaW4gcmVwbGFjZVNvdXJjZSkgY2FuIHVzZSB0aGUgc2FtZQotCQkvLyByZXF1ZXN0ZXIuCi0JCS8vIE90aGVyd2lzZSwgaWYgcmVxdWVzdGVyIGlzIG5vdCBpZGVudGljYWwsCi0JCS8vIHRoZSB1bmRvIGdyb3VwIGdldHMgImJyb2tlbiIgaW50byBtdWx0aXBsZSBwaWVjZXMgYmFzZWQKLQkJLy8gb24gdGhlIHJlcXVlc3RlcnMgYmVpbmcgZGlmZmVyZW50LiBUZWNobmljYWxseSwgYW55IHVuaXF1ZSwgY29tbW9uCi0JCS8vIHJlcXVlc3RlciBvYmplY3Qgd291bGQgd29yay4KLQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkdGgoSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cywgU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoY29udHJhaW50cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQotCQlpZiAoIXNwbGl0TGluZXMoKSkKLQkJCXJldHVybjsKLQkJaW50IGxpbmVXaWR0aCA9IGdldExpbmVXaWR0aCgpOwotCQlpZiAobGluZVdpZHRoIDwgMCkKLQkJCXJldHVybjsKLQotCQlpbnQgb2Zmc2V0ID0gc291cmNlLmxhc3RJbmRleE9mKCdcbicpOwotCQlpbnQgb2Zmc2V0MiA9IHNvdXJjZS5sYXN0SW5kZXhPZignXHInKTsKLQkJaWYgKG9mZnNldDIgPiBvZmZzZXQpCi0JCQlvZmZzZXQgPSBvZmZzZXQyOwotCQlpZiAob2Zmc2V0ID49IDApCi0JCQlvZmZzZXQrKzsKLQotCQlpbnQgYXZhaWxhYmxlV2lkdGggPSAwOwotCQlpZiAob2Zmc2V0ID49IDApIHsKLQkJCWF2YWlsYWJsZVdpZHRoID0gbGluZVdpZHRoIC0gKGxlbmd0aCAtIG9mZnNldCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhdmFpbGFibGVXaWR0aCA9IGNvbnRyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCkgLSBsZW5ndGg7Ci0JCX0KLQkJaWYgKGF2YWlsYWJsZVdpZHRoIDwgMCkKLQkJCWF2YWlsYWJsZVdpZHRoID0gMDsKLQkJY29udHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlV2lkdGgpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFdpZHRoKEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMsIE5vZGUgbm9kZSkgewotCQlpZiAoY29udHJhaW50cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaWYgKCFzcGxpdExpbmVzKCkpCi0JCQlyZXR1cm47Ci0JCWludCBsaW5lV2lkdGggPSBnZXRMaW5lV2lkdGgoKTsKLQkJaWYgKGxpbmVXaWR0aCA8IDApCi0JCQlyZXR1cm47Ci0KLQkJaW50IG9mZnNldCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBsaW5lID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZk9mZnNldChvZmZzZXQpOwotCQlpbnQgbGluZU9mZnNldCA9IDA7Ci0JCXRyeSB7Ci0JCQlsaW5lT2Zmc2V0ID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm47IC8vIGVycm9yCi0JCX0KLQkJaWYgKGxpbmVPZmZzZXQgPiBvZmZzZXQpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaW50IGF2YWlsYWJsZVdpZHRoID0gbGluZVdpZHRoIC0gKG9mZnNldCAtIGxpbmVPZmZzZXQpOwotCQlpZiAoYXZhaWxhYmxlV2lkdGggPCAwKQotCQkJYXZhaWxhYmxlV2lkdGggPSAwOwotCi0JCWNvbnRyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZVdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcGxpdExpbmVzKCkgewotCQlyZXR1cm4gdHJ1ZTsvLyBnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldFNwbGl0TGluZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBmRm9ybWF0UHJlZmVyZW5jZXMgPSBudWxsOwotCXByb3RlY3RlZCBIVE1MRm9ybWF0Q29udHJhaW50cyBmRm9ybWF0Q29udHJhaW50cyA9IG51bGw7Ci0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQkvLyBwdWJsaWMgdm9pZCBmb3JtYXQoWE1MTm9kZSBub2RlLCBGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkvLyBpZiAoZm9ybWF0Q29udHJhaW50cy5nZXRGb3JtYXRXaXRoU2libGluZ0luZGVudCgpKQotCS8vIGZvcm1hdENvbnRyYWludHMuc2V0Q3VycmVudEluZGVudChnZXRTaWJsaW5nSW5kZW50KG5vZGUpKTsKLQkvLwotCS8vIGZvcm1hdE5vZGUobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JLy8gfQotCi0JcHVibGljIHZvaWQgc2V0Rm9ybWF0UHJlZmVyZW5jZXMoSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBmb3JtYXRQcmVmZXJlbmNlcykgewotCQlmRm9ybWF0UHJlZmVyZW5jZXMgPSBmb3JtYXRQcmVmZXJlbmNlczsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBnZXRGb3JtYXRQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZGb3JtYXRQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmRm9ybWF0UHJlZmVyZW5jZXMgPSBuZXcgU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKCk7Ci0KLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRMaW5lV2lkdGgocHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKTsKLQkJCQkoKFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5zZXRTcGxpdE11bHRpQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQkJCSgoU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBmRm9ybWF0UHJlZmVyZW5jZXMpLnNldEFsaWduRW5kQnJhY2tldChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFMSUdOX0VORF9CUkFDS0VUKSk7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCi0JCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCQlpZiAoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQkJfQotCQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJCX0KLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KGluZGVudC50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmRm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBnZXRGb3JtYXRDb250cmFpbnRzKCkgewotCQlpZiAoZkZvcm1hdENvbnRyYWludHMgPT0gbnVsbCkgewotCQkJZkZvcm1hdENvbnRyYWludHMgPSBuZXcgSFRNTEZvcm1hdENvbnRyYWludHNJbXBsKCk7Ci0KLQkJCWZGb3JtYXRDb250cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldExpbmVXaWR0aCgpKTsKLQkJCWZGb3JtYXRDb250cmFpbnRzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldENsZWFyQWxsQmxhbmtMaW5lcygpKTsKLQkJfQotCi0JCXJldHVybiBmRm9ybWF0Q29udHJhaW50czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJZlByb2dyZXNzTW9uaXRvciA9IHByb2dyZXNzTW9uaXRvcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0dGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0dGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQ3MDFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vLyBuYWthbW9yaV9UT0RPOiBjaGVjayBhbmQgcmVtb3ZlIENTUyBmb3JtYXR0aW5nCi0KLWNsYXNzIEhUTUxGb3JtYXR0ZXJGYWN0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBIVE1MRm9ybWF0dGVyRmFjdG9yeSBmSW5zdGFuY2UgPSBudWxsOwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwgZkZvcm1hdFByZWZlcmVuY2VzID0gbnVsbDsKLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgSFRNTEZvcm1hdHRlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IEhUTUxGb3JtYXR0ZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgY3JlYXRlRm9ybWF0dGVyKE5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBmb3JtYXRQcmVmZXJlbmNlcykgewotCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBudWxsOwotCi0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgSFRNTEVsZW1lbnRGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCWlmIChpc0VtYmVkZGVkQ1NTKG5vZGUpKSB7Ci0JCQkJCWZvcm1hdHRlciA9IG5ldyBFbWJlZGRlZENTU0Zvcm1hdHRlcigpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZm9ybWF0dGVyID0gbmV3IEhUTUxUZXh0Rm9ybWF0dGVyKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJZm9ybWF0dGVyID0gbmV3IEhUTUxGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJfQotCi0JCS8vIGluaXQgRm9ybWF0UHJlZmVyZW5jZXMKLQkJZm9ybWF0dGVyLnNldEZvcm1hdFByZWZlcmVuY2VzKGZvcm1hdFByZWZlcmVuY2VzKTsKLQotCQlyZXR1cm4gZm9ybWF0dGVyOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VtYmVkZGVkQ1NTKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIG5hbWUgPSBwYXJlbnQuZ2V0Tm9kZU5hbWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiU1RZTEUiKTsvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwcml2YXRlIEhUTUxGb3JtYXR0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmRm9ybWF0UHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkZvcm1hdFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCgpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0TGluZVdpZHRoKHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldFNwbGl0TXVsdGlBdHRycyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldEFsaWduRW5kQnJhY2tldChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFMSUdOX0VORF9CUkFDS0VUKSk7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCi0JCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCQlpZiAoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQkJfQotCQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJCX0KLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KGluZGVudC50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmRm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTFRleHRGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTFRleHRGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhZWZkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxUZXh0Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEhUTUxUZXh0Rm9ybWF0dGVyIGV4dGVuZHMgSFRNTEZvcm1hdHRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGludCBGT1JNQVRfQUxMID0gMDsKLQlwdWJsaWMgc3RhdGljIGludCBGT1JNQVRfSEVBRCA9IDE7Ci0JcHVibGljIHN0YXRpYyBpbnQgRk9STUFUX1RBSUwgPSAyOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEhUTUxUZXh0Rm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjYW5Gb3JtYXRUZXh0KElET01UZXh0IHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGV4dC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGUgPSBmbGF0Tm9kZS5nZXRUeXBlKCk7Ci0JCQlpZiAoaXNVbnBhcnNlZFJlZ2lvbih0eXBlKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlOb2RlIHBhcmVudCA9IHRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIHBhcmVudDsKLQkJCWlmICghZWxlbWVudC5pc0dsb2JhbFRhZygpICYmICF0ZXh0LmlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGNhbkZvcm1hdENoaWxkKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVW5wYXJzZWRSZWdpb24oU3RyaW5nIHR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBpc05lc3RlZFNjYW5uZWRSZWdpb24odHlwZSkgfHwgaXNCbG9ja1NjYW5uZWRSZWdpb24odHlwZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQmxvY2tTY2FubmVkUmVnaW9uKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVDsKLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTmVzdGVkU2Nhbm5lZFJlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlmaW5hbCBTdHJpbmcgSlNQX0NPTlRFTlQgPSAiSlNQX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB0eXBlLmVxdWFscyhKU1BfQ09OVEVOVCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhblJlbW92ZUhlYWRpbmdTcGFjZXMoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwgfHwgcGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgcGFyZW50KTsKLQkJaWYgKGRlY2wgPT0gbnVsbCB8fCAoIWRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGhpbnQgPSAoU3RyaW5nKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuTElORV9CUkVBS19ISU5UKTsKLQkJcmV0dXJuIGhpbnQuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuUmVtb3ZlVGFpbGluZ1NwYWNlcyhJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChub2RlLmdldE5leHRTaWJsaW5nKCkgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIHBhcmVudCk7Ci0JCWlmIChkZWNsID09IG51bGwgfHwgKCFkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuTElORV9CUkVBS19ISU5UKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBoaW50ID0gKFN0cmluZykgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLkxJTkVfQlJFQUtfSElOVCk7Ci0JCXJldHVybiBoaW50LmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19CRUZPUkVfU1RBUlRfQU5EX0FGVEVSX0VORCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWZvcm1hdFRleHQobm9kZSwgY29udHJhaW50cywgRk9STUFUX0FMTCk7IC8vIGZ1bGwgZm9ybWF0Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0VGV4dChJRE9NTm9kZSBub2RlLCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzLCBpbnQgbW9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSURPTVRleHQgdGV4dCA9IChJRE9NVGV4dCkgbm9kZTsKLQkJU3RyaW5nIHNvdXJjZSA9IHRleHQuZ2V0U291cmNlKCk7Ci0KLQkJaWYgKCFjYW5Gb3JtYXRUZXh0KHRleHQpKSB7Ci0JCQlzZXRXaWR0aChjb250cmFpbnRzLCBzb3VyY2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG9mZnNldCA9IHRleHQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IHRleHQuZ2V0RW5kT2Zmc2V0KCkgLSBvZmZzZXQ7Ci0KLQkJLy8gZm9ybWF0IGFkamFjZW50IHRleHQgYXQgb25jZQotCQlpZiAobW9kZSA9PSBGT1JNQVRfSEVBRCkgewotCQkJTm9kZSBuZXh0ID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQkJd2hpbGUgKG5leHQgIT0gbnVsbCAmJiBuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlJRE9NVGV4dCBuZXh0VGV4dCA9IChJRE9NVGV4dCkgbmV4dDsKLQkJCQlsZW5ndGggKz0gKG5leHRUZXh0LmdldEVuZE9mZnNldCgpIC0gbmV4dFRleHQuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJU3RyaW5nIG5leHRTb3VyY2UgPSBuZXh0VGV4dC5nZXRTb3VyY2UoKTsKLQkJCQlpZiAobmV4dFNvdXJjZSAhPSBudWxsICYmIG5leHRTb3VyY2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCQkJCXNvdXJjZSA9IG5leHRTb3VyY2U7Ci0JCQkJCWVsc2UKLQkJCQkJCXNvdXJjZSArPSBuZXh0U291cmNlOwotCQkJCX0KLQkJCQluZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKG1vZGUgPT0gRk9STUFUX1RBSUwpIHsKLQkJCU5vZGUgcHJldiA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQl3aGlsZSAocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCUlET01UZXh0IHByZXZUZXh0ID0gKElET01UZXh0KSBwcmV2OwotCQkJCW9mZnNldCA9IHByZXZUZXh0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJbGVuZ3RoICs9IChwcmV2VGV4dC5nZXRFbmRPZmZzZXQoKSAtIG9mZnNldCk7Ci0JCQkJU3RyaW5nIHByZXZTb3VyY2UgPSBwcmV2VGV4dC5nZXRTb3VyY2UoKTsKLQkJCQlpZiAocHJldlNvdXJjZSAhPSBudWxsICYmIHByZXZTb3VyY2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCQkJCXNvdXJjZSA9IHByZXZTb3VyY2U7Ci0JCQkJCWVsc2UKLQkJCQkJCXNvdXJjZSA9IHByZXZTb3VyY2UgKyBzb3VyY2U7Ci0JCQkJfQotCQkJCXByZXYgPSBwcmV2LmdldFByZXZpb3VzU2libGluZygpOwotCQkJfQotCQl9Ci0KLQkJU3BhY2VDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IFNwYWNlQ29udmVydGVyKHNvdXJjZSwga2VlcEJsYW5rTGluZXMoY29udHJhaW50cykpOwotCi0JCWludCB3b3JkTGVuZ3RoID0gY29udmVydGVyLm5leHRXb3JkKCk7Ci0JCWlmICh3b3JkTGVuZ3RoID09IDApIHsgLy8gb25seSBzcGFjZXMKLQkJCWlmICghY29udmVydGVyLmhhc1NwYWNlcygpKQotCQkJCXJldHVybjsgLy8gZW1wdHkKLQkJCWJvb2xlYW4gcmVtb3ZlU3BhY2VzID0gZmFsc2U7Ci0JCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkvLyBjaGVjayBpZiB0YWdzIGFyZSBvbWl0dGVkCi0JCQkJSURPTU5vZGUgZWxlbWVudCA9IChJRE9NTm9kZSkgcGFyZW50OwotCQkJCWlmIChub2RlLmdldFByZXZpb3VzU2libGluZygpID09IG51bGwgJiYgZWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpIHsKLQkJCQkJcmVtb3ZlU3BhY2VzID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZS5nZXROZXh0U2libGluZygpID09IG51bGwgJiYgZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSB7Ci0JCQkJCXJlbW92ZVNwYWNlcyA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlbW92ZVNwYWNlcykgewotCQkJCWNvbnZlcnRlci5yZXBsYWNlU3BhY2VzKG51bGwpOwotCQkJfQotCQkJZWxzZSBpZiAoIWlzV2lkdGhBdmFpbGFibGUoY29udHJhaW50cywgMikgfHwgY2FuSW5zZXJ0QnJlYWtBZnRlcihub2RlKSB8fCBjYW5JbnNlcnRCcmVha0JlZm9yZShub2RlKSkgewotCQkJCVN0cmluZyBzcGFjZXMgPSBudWxsOwotCQkJCWlmIChub2RlLmdldE5leHRTaWJsaW5nKCkgPT0gbnVsbCkgeyAvLyBsYXN0IHNwYWNlcwotCQkJCQkvLyB1c2UgcGFyZW50IGluZGVudCBmb3IgdGhlIGVuZCB0YWcKLQkJCQkJc3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMocGFyZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNwYWNlcyA9IGdldEJyZWFrU3BhY2VzKG5vZGUpOwotCQkJCX0KLQkJCQljb252ZXJ0ZXIucmVwbGFjZVNwYWNlcyhzcGFjZXMpOwotCQkJCXNldFdpZHRoKGNvbnRyYWludHMsIHNwYWNlcyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjYW5SZW1vdmVIZWFkaW5nU3BhY2VzKG5vZGUpIHx8IGNhblJlbW92ZVRhaWxpbmdTcGFjZXMobm9kZSkpIHsKLQkJCQljb252ZXJ0ZXIucmVwbGFjZVNwYWNlcyhudWxsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNvbnZlcnRlci5jb21wcmVzc1NwYWNlcygpOwotCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIDEpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIGJyZWFrU3BhY2VzID0gbnVsbDsKLQotCQkJLy8gZm9ybWF0IGhlYWRpbmcgc3BhY2VzCi0JCQlib29sZWFuIGhhc1NwYWNlcyA9IGNvbnZlcnRlci5oYXNTcGFjZXMoKTsKLQkJCWlmIChtb2RlID09IEZPUk1BVF9UQUlMKSB7Ci0JCQkJLy8ga2VlcCBzcGFjZXMgYXMgaXMKLQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCBjb252ZXJ0ZXIuZ2V0U3BhY2VDb3VudCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChoYXNTcGFjZXMgJiYgIWlzV2lkdGhBdmFpbGFibGUoY29udHJhaW50cywgd29yZExlbmd0aCArIDEpKSB8fCBjYW5JbnNlcnRCcmVha0JlZm9yZShub2RlKSkgewotCQkJCWJyZWFrU3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMobm9kZSk7Ci0JCQkJY29udmVydGVyLnJlcGxhY2VTcGFjZXMoYnJlYWtTcGFjZXMpOwotCQkJCXNldFdpZHRoKGNvbnRyYWludHMsIGJyZWFrU3BhY2VzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChoYXNTcGFjZXMpIHsKLQkJCQkJaWYgKGNhblJlbW92ZUhlYWRpbmdTcGFjZXMobm9kZSkpIHsKLQkJCQkJCWNvbnZlcnRlci5yZXBsYWNlU3BhY2VzKG51bGwpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJY29udmVydGVyLmNvbXByZXNzU3BhY2VzKCk7Ci0JCQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIHdvcmRMZW5ndGgpOwotCi0JCQkvLyBmb3JtYXQgbWlkZGxlCi0JCQl3b3JkTGVuZ3RoID0gY29udmVydGVyLm5leHRXb3JkKCk7Ci0JCQl3aGlsZSAod29yZExlbmd0aCA+IDApIHsKLQkJCQlpZiAobW9kZSAhPSBGT1JNQVRfQUxMKSB7Ci0JCQkJCS8vIGtlZXAgc3BhY2VzIGFzIGlzCi0JCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIGNvbnZlcnRlci5nZXRTcGFjZUNvdW50KCkpOwotCQkJCX0KLQkJCQllbHNlIGlmICghaXNXaWR0aEF2YWlsYWJsZShjb250cmFpbnRzLCB3b3JkTGVuZ3RoICsgMSkpIHsKLQkJCQkJaWYgKGJyZWFrU3BhY2VzID09IG51bGwpCi0JCQkJCQlicmVha1NwYWNlcyA9IGdldEJyZWFrU3BhY2VzKG5vZGUpOwotCQkJCQljb252ZXJ0ZXIucmVwbGFjZVNwYWNlcyhicmVha1NwYWNlcyk7Ci0JCQkJCXNldFdpZHRoKGNvbnRyYWludHMsIGJyZWFrU3BhY2VzKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNvbnZlcnRlci5jb21wcmVzc1NwYWNlcygpOwotCQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCAxKTsKLQkJCQl9Ci0JCQkJYWRkV2lkdGgoY29udHJhaW50cywgd29yZExlbmd0aCk7Ci0JCQkJd29yZExlbmd0aCA9IGNvbnZlcnRlci5uZXh0V29yZCgpOwotCQkJfQotCi0JCQkvLyBmb3JtYXQgdGFpbGluZyBzcGFjZXMKLQkJCWhhc1NwYWNlcyA9IGNvbnZlcnRlci5oYXNTcGFjZXMoKTsKLQkJCWlmIChtb2RlID09IEZPUk1BVF9IRUFEKSB7Ci0JCQkJLy8ga2VlcCBzcGFjZXMgYXMgaXMKLQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCBjb252ZXJ0ZXIuZ2V0U3BhY2VDb3VudCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChoYXNTcGFjZXMgJiYgIWlzV2lkdGhBdmFpbGFibGUoY29udHJhaW50cywgMikpIHx8IGNhbkluc2VydEJyZWFrQWZ0ZXIobm9kZSkpIHsKLQkJCQlpZiAobm9kZS5nZXROZXh0U2libGluZygpID09IG51bGwpIHsgLy8gbGFzdCB0ZXN0Ci0JCQkJCS8vIHVzZSBwYXJlbnQgaW5kZW50IGZvciB0aGUgZW5kIHRhZwotCQkJCQlicmVha1NwYWNlcyA9IGdldEJyZWFrU3BhY2VzKHBhcmVudCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoYnJlYWtTcGFjZXMgPT0gbnVsbCkKLQkJCQkJCWJyZWFrU3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMobm9kZSk7Ci0JCQkJfQotCQkJCWNvbnZlcnRlci5yZXBsYWNlU3BhY2VzKGJyZWFrU3BhY2VzKTsKLQkJCQlzZXRXaWR0aChjb250cmFpbnRzLCBicmVha1NwYWNlcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoaGFzU3BhY2VzKSB7Ci0JCQkJCWlmIChjYW5SZW1vdmVUYWlsaW5nU3BhY2VzKG5vZGUpKSB7Ci0JCQkJCQljb252ZXJ0ZXIucmVwbGFjZVNwYWNlcyhudWxsKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWNvbnZlcnRlci5jb21wcmVzc1NwYWNlcygpOwotCQkJCQkJYWRkV2lkdGgoY29udHJhaW50cywgMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY29udmVydGVyLmlzTW9kaWZpZWQoKSkgewotCQkJc291cmNlID0gY29udmVydGVyLmdldFNvdXJjZSgpOwotCQkJcmVwbGFjZVNvdXJjZSh0ZXh0LmdldE1vZGVsKCksIG9mZnNldCwgbGVuZ3RoLCBzb3VyY2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9TcGFjZUNvbnZlcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9TcGFjZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGY5MjAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvU3BhY2VDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi0KLQotZmluYWwgY2xhc3MgU3BhY2VDb252ZXJ0ZXIgewotCi0JcHJpdmF0ZSBTdHJpbmcgc291cmNlID0gbnVsbDsKLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCXByaXZhdGUgaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQlwcml2YXRlIGludCBlbmRPZmZzZXQgPSAwOwotCXByaXZhdGUgaW50IHNwYWNlQ291bnQgPSAwOwotCXByaXZhdGUgaW50IHdvcmRDb3VudCA9IDA7Ci0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQlwcml2YXRlIGludCBsYXN0T2Zmc2V0ID0gMDsKLQlwcml2YXRlIGJvb2xlYW4ga2VlcEJsYW5rTGluZXMgPSBmYWxzZTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBTcGFjZUNvbnZlcnRlcihTdHJpbmcgc291cmNlKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy5sZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3BhY2VDb252ZXJ0ZXIoU3RyaW5nIHNvdXJjZSwgYm9vbGVhbiBrZWVwQmxhbmtMaW5lcykgewotCQlzdXBlcigpOwotCi0JCWlmIChzb3VyY2UgPT0gbnVsbCkgewotCQkJdGhpcy5zb3VyY2UgPSBuZXcgU3RyaW5nKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJCXRoaXMubGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQl9Ci0JCXRoaXMua2VlcEJsYW5rTGluZXMgPSBrZWVwQmxhbmtMaW5lczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wcmVzc1NwYWNlcygpIHsKLQkJaWYgKHRoaXMuc3BhY2VDb3VudCA9PSAwKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5zcGFjZUNvdW50ID09IDEgJiYgdGhpcy5zb3VyY2UuY2hhckF0KHRoaXMuc3RhcnRPZmZzZXQpID09ICcgJykKLQkJCXJldHVybjsKLQotCQlpZiAodGhpcy5idWZmZXIgPT0gbnVsbCkKLQkJCXRoaXMuYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAodGhpcy5zdGFydE9mZnNldCA+IHRoaXMubGFzdE9mZnNldCkgewotCQkJdGhpcy5idWZmZXIuYXBwZW5kKHRoaXMuc291cmNlLnN1YnN0cmluZyh0aGlzLmxhc3RPZmZzZXQsIHRoaXMuc3RhcnRPZmZzZXQpKTsKLQkJfQotCi0JCXRoaXMuYnVmZmVyLmFwcGVuZCgnICcpOwotCi0JCXRoaXMubGFzdE9mZnNldCA9IHRoaXMuc3RhcnRPZmZzZXQgKyB0aGlzLnNwYWNlQ291bnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7Ci0JCWlmICh0aGlzLmJ1ZmZlciA9PSBudWxsKQotCQkJdGhpcy5idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmICh0aGlzLmxlbmd0aCA+IHRoaXMubGFzdE9mZnNldCkgewotCQkJdGhpcy5idWZmZXIuYXBwZW5kKHRoaXMuc291cmNlLnN1YnN0cmluZyh0aGlzLmxhc3RPZmZzZXQsIHRoaXMubGVuZ3RoKSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRTcGFjZUNvdW50KCkgewotCQlyZXR1cm4gdGhpcy5zcGFjZUNvdW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1NwYWNlcygpIHsKLQkJcmV0dXJuICh0aGlzLnNwYWNlQ291bnQgPiAwKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVkKCkgewotCQlyZXR1cm4gKHRoaXMuYnVmZmVyICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEFkZCBudW1iZXIgb2YgdGhlIG9sZCBibGFuayBsaW5lcyB0byBuZXcgc3BhY2Ugc3RyaW5nCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1lcmdlQmxhbmtMaW5lcyhTdHJpbmcgbmV3U3BhY2VzLCBTdHJpbmcgb2xkU3BhY2VzKSB7Ci0JCWlmIChuZXdTcGFjZXMgPT0gbnVsbCB8fCBuZXdTcGFjZXMubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBuZXdTcGFjZXM7Ci0JCWlmIChvbGRTcGFjZXMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXdTcGFjZXM7Ci0KLQkJLy8gY291bnQgb2xkIG5ldyBsaW5lcwotCQlpbnQgbmV3TGluZUNvdW50ID0gMDsKLQkJaW50IG9sZExlbmd0aCA9IG9sZFNwYWNlcy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRMZW5ndGg7IGkrKykgewotCQkJY2hhciBjID0gb2xkU3BhY2VzLmNoYXJBdChpKTsKLQkJCWlmIChjID09ICdccicpIHsKLQkJCQluZXdMaW5lQ291bnQrKzsKLQkJCQlpZiAoaSArIDEgPCBvbGRMZW5ndGgpIHsKLQkJCQkJYyA9IG9sZFNwYWNlcy5jaGFyQXQoaSArIDEpOwotCQkJCQlpZiAoYyA9PSAnXG4nKQotCQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChjID09ICdcbicpCi0JCQkJCW5ld0xpbmVDb3VudCsrOwotCQkJfQotCQl9Ci0JCWlmIChuZXdMaW5lQ291bnQgPCAyKQotCQkJcmV0dXJuIG5ld1NwYWNlczsgLy8gbm8gYmxhbmsgbGluZQotCi0JCS8vIGhlcmUgYXNzdW1pbmcgbmV3U3BhY2VzIHN0YXJ0cyB3aXRoIGEgbmV3IGxpbmUgaWYgYW55Ci0JCVN0cmluZyBkZWxpbSA9IG51bGw7Ci0JCWNoYXIgZCA9IG5ld1NwYWNlcy5jaGFyQXQoMCk7Ci0JCWlmIChkID09ICdccicpIHsKLQkJCWlmIChuZXdTcGFjZXMubGVuZ3RoKCkgPiAxICYmIG5ld1NwYWNlcy5jaGFyQXQoMSkgPT0gJ1xuJykKLQkJCQlkZWxpbSA9ICJcclxuIjsvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJZGVsaW0gPSAiXHIiOy8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCWlmIChkID09ICdcbicpCi0JCQkJZGVsaW0gPSAiXG4iOy8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbmV3U3BhY2VzOyAvLyBubyBuZXcgbGluZQotCQl9Ci0KLQkJbmV3TGluZUNvdW50LS07Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKG5ld1NwYWNlcy5sZW5ndGgoKSArIG5ld0xpbmVDb3VudCAqIDIpOwotCQl3aGlsZSAobmV3TGluZUNvdW50ID4gMCkgewotCQkJYnVmZmVyLmFwcGVuZChkZWxpbSk7Ci0JCQluZXdMaW5lQ291bnQtLTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKG5ld1NwYWNlcyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IG5leHRXb3JkKCkgewotCQlpZiAodGhpcy5lbmRPZmZzZXQgPT0gdGhpcy5sZW5ndGgpIHsKLQkJCXRoaXMuc3RhcnRPZmZzZXQgPSB0aGlzLmVuZE9mZnNldDsKLQkJCXRoaXMuc3BhY2VDb3VudCA9IDA7Ci0JCQl0aGlzLndvcmRDb3VudCA9IDA7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXRoaXMuc3RhcnRPZmZzZXQgPSB0aGlzLmVuZE9mZnNldDsKLQkJaW50IGkgPSB0aGlzLnN0YXJ0T2Zmc2V0OwotCQlmb3IgKDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0aGlzLnNvdXJjZS5jaGFyQXQoaSkpKQotCQkJCWJyZWFrOwotCQl9Ci0JCXRoaXMuc3BhY2VDb3VudCA9IGkgLSB0aGlzLnN0YXJ0T2Zmc2V0OwotCi0JCWludCB3b3JkT2Zmc2V0ID0gaTsKLQkJZm9yICg7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0aGlzLnNvdXJjZS5jaGFyQXQoaSkpKQotCQkJCWJyZWFrOwotCQl9Ci0JCXRoaXMud29yZENvdW50ID0gaSAtIHdvcmRPZmZzZXQ7Ci0JCXRoaXMuZW5kT2Zmc2V0ID0gaTsKLQotCQlyZXR1cm4gdGhpcy53b3JkQ291bnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZVNwYWNlcyhTdHJpbmcgc3BhY2VzKSB7Ci0JCWludCBzcGFjZUxlbmd0aCA9IChzcGFjZXMgIT0gbnVsbCA/IHNwYWNlcy5sZW5ndGgoKSA6IDApOwotCQlTdHJpbmcgb2xkU3BhY2VzID0gbnVsbDsKLQkJaWYgKHNwYWNlTGVuZ3RoID09IHRoaXMuc3BhY2VDb3VudCkgewotCQkJaWYgKHNwYWNlTGVuZ3RoID09IDApCi0JCQkJcmV0dXJuOwotCQkJaWYgKHRoaXMuc3RhcnRPZmZzZXQgPT0gMCkgewotCQkJCWlmICh0aGlzLnNvdXJjZS5zdGFydHNXaXRoKHNwYWNlcykpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgaWYgKHRoaXMuZW5kT2Zmc2V0ID09IHRoaXMubGVuZ3RoKSB7Ci0JCQkJaWYgKHRoaXMuc291cmNlLmVuZHNXaXRoKHNwYWNlcykpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWludCB0ZXh0T2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldCArIHRoaXMuc3BhY2VDb3VudDsKLQkJCQlvbGRTcGFjZXMgPSB0aGlzLnNvdXJjZS5zdWJzdHJpbmcodGhpcy5zdGFydE9mZnNldCwgdGV4dE9mZnNldCk7Ci0JCQkJaWYgKG9sZFNwYWNlcy5lcXVhbHMoc3BhY2VzKSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmICh0aGlzLmtlZXBCbGFua0xpbmVzICYmIHRoaXMuc3BhY2VDb3VudCA+IDApIHsKLQkJCWlmIChvbGRTcGFjZXMgPT0gbnVsbCkgewotCQkJCWludCB0ZXh0T2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldCArIHRoaXMuc3BhY2VDb3VudDsKLQkJCQlvbGRTcGFjZXMgPSB0aGlzLnNvdXJjZS5zdWJzdHJpbmcodGhpcy5zdGFydE9mZnNldCwgdGV4dE9mZnNldCk7Ci0JCQl9Ci0JCQlpZiAob2xkU3BhY2VzICE9IG51bGwpIHsKLQkJCQlzcGFjZXMgPSBtZXJnZUJsYW5rTGluZXMoc3BhY2VzLCBvbGRTcGFjZXMpOwotCQkJCWlmIChvbGRTcGFjZXMuZXF1YWxzKHNwYWNlcykpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCWlmICh0aGlzLmJ1ZmZlciA9PSBudWxsKQotCQkJdGhpcy5idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmICh0aGlzLnN0YXJ0T2Zmc2V0ID4gdGhpcy5sYXN0T2Zmc2V0KSB7Ci0JCQl0aGlzLmJ1ZmZlci5hcHBlbmQodGhpcy5zb3VyY2Uuc3Vic3RyaW5nKHRoaXMubGFzdE9mZnNldCwgdGhpcy5zdGFydE9mZnNldCkpOwotCQl9Ci0KLQkJaWYgKHNwYWNlTGVuZ3RoID4gMCkKLQkJCXRoaXMuYnVmZmVyLmFwcGVuZChzcGFjZXMpOwotCi0JCXRoaXMubGFzdE9mZnNldCA9IHRoaXMuc3RhcnRPZmZzZXQgKyB0aGlzLnNwYWNlQ291bnQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0Fic3RyYWN0Q1NTTW9kZWxBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9BYnN0cmFjdENTU01vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTE4NjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0Fic3RyYWN0Q1NTTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklDU1NNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q1NTTW9kZWxBZGFwdGVyIGltcGxlbWVudHMgSUNTU01vZGVsQWRhcHRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENTU19JRCA9IENvbnRlbnRUeXBlSWRGb3JDU1MuQ29udGVudFR5cGVJRF9DU1M7Ci0KLQlwcml2YXRlIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBJQ1NTTW9kZWwgbW9kZWwgPSBudWxsOwotCi0JLyoqCi0JICovCi0JQWJzdHJhY3RDU1NNb2RlbEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElDU1NNb2RlbCBjcmVhdGVNb2RlbCgpIHsKLQkJLy8gY3JlYXRlIGVtYmVkZGVkIENTUyBtb2RlbCAobm90IGZvciBleHRlcm5hbCBDU1MpCi0JCWlmIChnZXRFbGVtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCA9ICgoSURPTU5vZGUpIGdldEVsZW1lbnQoKSkuZ2V0TW9kZWwoKTsKLQkJSUNTU01vZGVsIG5ld01vZGVsID0gKElDU1NNb2RlbCkgYmFzZU1vZGVsLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDU1NfSUQpOwotCQkoKENTU01vZGVsSW1wbCkgbmV3TW9kZWwpLnNldE93bmVyRE9NTm9kZShnZXRFbGVtZW50KCkpOwotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSUNTU01vZGVsIGdldEV4aXN0aW5nTW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLm1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVN0eWxlQ2hhbmdlZChFbGVtZW50IHRhcmdldCkgewotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIHRhcmdldDsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUNvbGxlY3Rpb24gYWRhcHRlcnMgPSBub3RpZmllci5nZXRBZGFwdGVycygpOwotCQlpZiAoYWRhcHRlcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3IgaXQgPSBhZGFwdGVycy5pdGVyYXRvcigpOwotCQlpZiAoaXQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKSBpdC5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFN0eWxlTGlzdGVuZXIpIHsKLQkJCQlTdHlsZUxpc3RlbmVyIGxpc3RlbmVyID0gKFN0eWxlTGlzdGVuZXIpIGFkYXB0ZXI7Ci0JCQkJbGlzdGVuZXIuc3R5bGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgCi0JICogMS4gSWYgYXR0cmlidXRlcyBvZiBlbGVtZW50IGlzIHZhbGlkICh0eXBlLHJlbCAuLi4pCi0JICogMi4gSWYgY29udGVudCBtb2RlbCBzdXBwb3J0cyB0aGlzIGVsZW1lbnQgLyBhdHRyaWJ1dGUgKGZ1dHVyZSA/KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiAoZ2V0RWxlbWVudCgpICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGVsKElDU1NNb2RlbCBtb2RlbCkgewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDUxNDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0Fic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAJCU1hc2FraSBTYWl0b2ggKE1TQUlUT0hAanAuaWJtLmNvbSkKLSAqCQlTZWUgQnVnIDE1MzAwMCAgU3R5bGUgQWRhcHRlcnMgc2hvdWxkIGJlIGxhemllcgotICoJCWh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTMwMDAKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudC5JQ1NTU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSU1vZGVsUHJvdmlkZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkltcG9ydGVkQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlhNTE1vZGVsTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLkRvY3VtZW50U3R5bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuRG9jdW1lbnRUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLQotLyoqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0eWxlU2hlZXRBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NNb2RlbEFkYXB0ZXIgaW1wbGVtZW50cyBJQ1NTU3R5bGVMaXN0ZW5lciwgSVN0eWxlU2hlZXRBZGFwdGVyIHsKLQotCS8vIHRoaXMgdmFyaWFibGUgdG8gaG9sZCB0aGUgY2xhc3MgaXMganVzdCBhIFZBSmF2YSB0cmljay4KLQkvLyBpdCBpbXByb3ZlcyBwZXJmb3JtYW5jZSBpbiBWQUphdmEgYnkgbWluaW1pemluZyBjbGFzcyBsb2FkaW5nLgotCXByaXZhdGUgZmluYWwgQ2xhc3MgU3R5bGVTaGVldEFkYXB0ZXJDbGFzcyA9IElTdHlsZVNoZWV0QWRhcHRlci5jbGFzczsKLQlwcml2YXRlIENvbGxlY3Rpb24gc3R5bGVDaGFuZ2VkTm9kZXM7Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSUNTU01vZGVsIGNyZWF0ZU1vZGVsKCkgewotCQlyZXR1cm4gY3JlYXRlTW9kZWwodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElDU1NNb2RlbCBjcmVhdGVNb2RlbChib29sZWFuIG5vdGlmeSkgewotCQlJQ1NTTW9kZWwgbmV3TW9kZWwgPSBzdXBlci5jcmVhdGVNb2RlbCgpOwotCQlpZiAobm90aWZ5ICYmIG5ld01vZGVsICE9IG51bGwpIHsKLQkJCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGdldEVsZW1lbnQoKSkuZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyBub3RpZnkgYWRhcHRlcgotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQlhZGFwdGVyLm1vZGVsUHJvdmlkZWQobmV3TW9kZWwpOwotCQl9Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3R5bGVTaGVldCBnZXRTaGVldCgpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChTdHlsZVNoZWV0KSBtb2RlbC5nZXREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZQotCSAqIGFsbG93cyBpdCB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gU3R5bGVTaGVldEFkYXB0ZXJDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZWQoKSB7Ci0JCUlDU1NNb2RlbCBjdXJyZW50TW9kZWwgPSBnZXRNb2RlbCgpOwotCi0JCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQotCQlzZXRFbGVtZW50KG51bGwpOwotCQlzZXRNb2RlbChudWxsKTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJYWRhcHRlci5tb2RlbFJlbGVhc2VkKGN1cnJlbnRNb2RlbCk7Ci0KLQkJaWYgKGN1cnJlbnRNb2RlbCAhPSBudWxsKQotCQkJY3VycmVudE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZWQoKSB7Ci0JCUlDU1NNb2RlbCBjdXJyZW50TW9kZWwgPSBnZXRNb2RlbCgpOwotCi0JCXNldE1vZGVsKG51bGwpOwotCi0JCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCWFkYXB0ZXIubW9kZWxSZW1vdmVkKGN1cnJlbnRNb2RlbCk7Ci0KLQkJaWYgKGN1cnJlbnRNb2RlbCAhPSBudWxsKQotCQkJY3VycmVudE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzcmNNb2RlbCBjb20uaWJtLnNlZC5jc3MubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTW9kZWwKLQkgKiBAcGFyYW0gcmVtb3ZlZCBjb20uaWJtLnNlZC5jc3MubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU2VsZWN0b3JbXQotCSAqIEBwYXJhbSBhZGRlZCBjb20uaWJtLnNlZC5jc3MubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU2VsZWN0b3JbXQotCSAqIEBwYXJhbSBtZWRpYSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc3R5bGVDaGFuZ2VkKElDU1NNb2RlbCBzcmNNb2RlbCwgSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgSUNTU1NlbGVjdG9yW10gYWRkZWQsIFN0cmluZyBtZWRpYSkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIG1pZ2h0IHJlbGVhc2VkCi0JCURvY3VtZW50IGRvYyA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJLy8gdG8gbm90aWZ5IEdFRiB0cmVlIAotCQlpZiAoZG9jIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJQ29sbGVjdGlvbiBhZGFwdGVycyA9ICgoSU5vZGVOb3RpZmllcikgZG9jKS5nZXRBZGFwdGVycygpOwotCQkJaWYgKGFkYXB0ZXJzID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSXRlcmF0b3IgaXQgPSBhZGFwdGVycy5pdGVyYXRvcigpOwotCQkJaWYgKGl0ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKElOb2RlQWRhcHRlcikgaXQubmV4dCgpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNTU1N0eWxlTGlzdGVuZXIpIHsKLQkJCQkJKChJQ1NTU3R5bGVMaXN0ZW5lcikgYWRhcHRlcikuc3R5bGVDaGFuZ2VkKHNyY01vZGVsLCByZW1vdmVkLCBhZGRlZCwgbWVkaWEpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLwotCi0JCWlmIChzdHlsZUNoYW5nZWROb2RlcyA9PSBudWxsKSB7Ci0JCQlzdHlsZUNoYW5nZWROb2RlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQotCQl0cnkgewotCQkJaW50IHJlbW92ZWRTZWxOdW0gPSByZW1vdmVkICE9IG51bGwgPyByZW1vdmVkLmxlbmd0aCA6IDA7Ci0JCQlpbnQgYWRkZWRTZWxOdW0gPSBhZGRlZCAhPSBudWxsID8gYWRkZWQubGVuZ3RoIDogMDsKLQotCQkJTm9kZUl0ZXJhdG9yIGl0ZXIgPSAoKERvY3VtZW50VHJhdmVyc2FsKSBkb2MpLmNyZWF0ZU5vZGVJdGVyYXRvcihkb2MsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULCBudWxsLCB0cnVlKTsKLQkJCU5vZGUgbm9kZTsKLQkJCXdoaWxlICgobm9kZSA9IGl0ZXIubmV4dE5vZGUoKSkgIT0gbnVsbCkgewotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJRWxlbWVudCBlbG0gPSAoRWxlbWVudCkgbm9kZTsKLQkJCQkJYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCQkJCQlpbnQgaTsKLQkJCQkJZm9yIChpID0gMDsgaSA8IHJlbW92ZWRTZWxOdW0gJiYgIW1hdGNoOyBpKyspIHsKLQkJCQkJCW1hdGNoID0gcmVtb3ZlZFtpXS5tYXRjaChlbG0sIG51bGwpOwotCQkJCQl9Ci0JCQkJCWZvciAoaSA9IDA7IGkgPCBhZGRlZFNlbE51bSAmJiAhbWF0Y2g7IGkrKykgewotCQkJCQkJbWF0Y2ggPSBhZGRlZFtpXS5tYXRjaChlbG0sIG51bGwpOwotCQkJCQl9Ci0JCQkJCWlmIChtYXRjaCkgewotCQkJCQkJaWYgKCFzdHlsZUNoYW5nZWROb2Rlcy5jb250YWlucyhlbG0pKQotCQkJCQkJCXN0eWxlQ2hhbmdlZE5vZGVzLmFkZChlbG0pOwotCQkJCQkJLy8gbm90aWZ5U3R5bGVDaGFuZ2VkKGVsbSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleCkgewotCQkJLy8gRG9jdW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgRG9jdW1lbnRUcmF2ZXJzYWwuLi4KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNyY01vZGVsIGNvbS5pYm0uc2VkLmNzcy5tb2RlbC5pbnRlcmZhY2VzLklDU1NNb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlVXBkYXRlKElDU1NNb2RlbCBzcmNNb2RlbCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBnZXRFbGVtZW50KCk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Nb2RlbCBtb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBtb2RlbC5nZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGJlZm9yZSB1cGRhdGluZywgYWxsIHN1Yi1tb2RlbHMgc2hvdWxkIGJlIGxvYWRlZCEKLQkJRG9jdW1lbnRTdHlsZSBkb2N1bWVudCA9IChEb2N1bWVudFN0eWxlKSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQlTdHlsZVNoZWV0TGlzdCBzdHlsZXMgPSBkb2N1bWVudC5nZXRTdHlsZVNoZWV0cygpOwotCQlpZiAoc3R5bGVzICE9IG51bGwpIHsKLQkJCWludCBuID0gc3R5bGVzLmdldExlbmd0aCgpOwotCQkJSW1wb3J0ZWRDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRlZENvbGxlY3RvcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCQlvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0IHNoZWV0ID0gc3R5bGVzLml0ZW0oaSk7Ci0JCQkJaWYgKHNoZWV0IGluc3RhbmNlb2YgSUNTU05vZGUpCi0JCQkJCXRyYXYuYXBwbHkoKElDU1NOb2RlKSBzaGVldCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBmbGFzaCBzdHlsZSBjaGFuZ2VkIGV2ZW50cwotCQlpZiAoc3R5bGVDaGFuZ2VkTm9kZXMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gZWxlbWVudHMgPSBzdHlsZUNoYW5nZWROb2Rlcy50b0FycmF5KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgZWxlbWVudHMgIT0gbnVsbCAmJiBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JCQkJbm90aWZ5U3R5bGVDaGFuZ2VkKChFbGVtZW50KSBlbGVtZW50c1tpXSk7Ci0JCQlzdHlsZUNoYW5nZWROb2Rlcy5jbGVhcigpOwotCQl9Ci0KLQkJLy8gdG8gbm90aWZ5IEdFRiB0cmVlIAotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlDb2xsZWN0aW9uIGFkYXB0ZXJzID0gKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlcnMoKTsKLQkJCWlmIChhZGFwdGVycyA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCUl0ZXJhdG9yIGl0ID0gYWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJCWlmIChpdCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IChJTm9kZUFkYXB0ZXIpIGl0Lm5leHQoKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDU1NTdHlsZUxpc3RlbmVyKSB7Ci0JCQkJCSgoSUNTU1N0eWxlTGlzdGVuZXIpIGFkYXB0ZXIpLnN0eWxlVXBkYXRlKHNyY01vZGVsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlub3RpZmllci5wcm9wZXJ0eUNoYW5nZWQobm9kZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOThmMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uLkNTU1Byb3BlcnR5Q29udGV4dDsKLQotLyoqCi0gKi8KLWNsYXNzIENTU1F1ZXJ5Q29udGV4dCBleHRlbmRzIENTU1Byb3BlcnR5Q29udGV4dCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTUXVlcnlDb250ZXh0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDU1NRdWVyeUNvbnRleHQoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCkgewotCQlzdXBlcihkZWNsKTsKLQl9Ci0KLQkvKioKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5RnVsbChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUVudW1lcmF0aW9uIGtleXMgPSBmUHJvcGVydGllcy5rZXlzKCk7Ci0JCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlPYmplY3Qga2V5ID0ga2V5cy5uZXh0RWxlbWVudCgpOwotCQkJT2JqZWN0IHZhbCA9IGZQcm9wZXJ0aWVzLmdldChrZXkpOwotCi0JCQlpZiAodmFsIGluc3RhbmNlb2YgQ1NTUXVlcnlEZWNsYXJhdGlvbkRhdGEpIHsKLQkJCQlJQ1NTU3R5bGVEZWNsSXRlbSBkZWNsSXRlbSA9ICgoQ1NTUXVlcnlEZWNsYXJhdGlvbkRhdGEpIHZhbCkuZ2V0RGVjbEl0ZW0oKTsKLQkJCQlpZiAoZGVjbEl0ZW0uZ2V0TGVuZ3RoKCkgPD0gMCkgewotCQkJCQlJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtVG9SZW1vdmUgPSBkZWNsLmdldERlY2xJdGVtTm9kZShrZXkudG9TdHJpbmcoKSk7Ci0JCQkJCWlmIChpdGVtVG9SZW1vdmUgIT0gbnVsbCkgewotCQkJCQkJZGVjbC5yZW1vdmVEZWNsSXRlbU5vZGUoaXRlbVRvUmVtb3ZlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZGVjbC5zZXREZWNsSXRlbU5vZGUoZGVjbEl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCVN0cmluZyB2YWx1ZSA9ICh2YWwgaW5zdGFuY2VvZiBJQ1NTVmFsdWUpID8gKChJQ1NTVmFsdWUpIHZhbCkuZ2V0Q1NTVmFsdWVUZXh0KCkgOiB2YWwudG9TdHJpbmcoKTsKLQotCQkJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpIDw9IDApIHsKLQkJCQkJSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbVRvUmVtb3ZlID0gZGVjbC5nZXREZWNsSXRlbU5vZGUoa2V5LnRvU3RyaW5nKCkpOwotCQkJCQlpZiAoaXRlbVRvUmVtb3ZlICE9IG51bGwpIHsKLQkJCQkJCWRlY2wucmVtb3ZlRGVjbEl0ZW1Ob2RlKGl0ZW1Ub1JlbW92ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRlY2wuc2V0UHJvcGVydHkoa2V5LnRvU3RyaW5nKCksIHZhbHVlLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2soU3RyaW5nIHByb3BOYW1lLCBib29sZWFuIGltcG9ydGFudCwgaW50IHNwZWNpZmljaXR5KSB7Ci0JCU9iamVjdCBjdXJyZW50ID0gZlByb3BlcnRpZXMuZ2V0KHByb3BOYW1lKTsKLQkJaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiBjdXJyZW50IGluc3RhbmNlb2YgQ1NTUXVlcnlWYWx1ZURhdGEpIHsKLQkJCUNTU1F1ZXJ5VmFsdWVEYXRhIGN1cnJlbnRWYWx1ZSA9IChDU1NRdWVyeVZhbHVlRGF0YSkgY3VycmVudDsKLQkJCWlmICgoIWltcG9ydGFudCAmJiBjdXJyZW50VmFsdWUuaW1wb3J0YW50KSB8fCAoY3VycmVudFZhbHVlLmdldFNwZWNpZmljaXR5KCkgPiBzcGVjaWZpY2l0eSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgb3ZlcnJpZGVXaXRoRXhwYW5kKElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wsIGludCBzcGVjaWZpY2l0eSkgewotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUNTU0xpbmtDb252ZXJ0ZXIgY29udiA9IG5ldyBDU1NMaW5rQ29udmVydGVyKGRlY2wuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkpOwotCi0JCWludCBuUHJvcGVydGllcyA9IGRlY2wuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgblByb3BlcnRpZXM7IGkrKykgewotCQkJU3RyaW5nIHByb3BOYW1lID0gZGVjbC5pdGVtKGkpOwotCQkJaWYgKHByb3BOYW1lICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcHJvcE4gPSBwcm9wTmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTsKLQkJCQlpZiAocHJvcE4ubGVuZ3RoKCkgIT0gMCkgewotCQkJCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihwcm9wTik7Ci0JCQkJCVN0cmluZyBwcmlvcml0eSA9IGRlY2wuZ2V0UHJvcGVydHlQcmlvcml0eShwcm9wTmFtZSk7Ci0JCQkJCWJvb2xlYW4gaW1wb3J0YW50ID0gcHJpb3JpdHkgIT0gbnVsbCAmJiBwcmlvcml0eS5sZW5ndGgoKSA+IDA7Ci0JCQkJCWlmIChwcm9wICE9IG51bGwgJiYgcHJvcC5pc1Nob3J0aGFuZCgpKSB7Ci0JCQkJCQkvLyBleHBhbmQgc2hvcnRoYW5kIHByb3BlcnR5Ci0JCQkJCQlDU1NRdWVyeUNvbnRleHQgY29udGV4dCA9IG5ldyBDU1NRdWVyeUNvbnRleHQoKTsKLQkJCQkJCWV4cGFuZFRvTGVhZihwcm9wLCBkZWNsLmdldFByb3BlcnR5VmFsdWUocHJvcE5hbWUpLCBjb250ZXh0KTsKLQotCQkJCQkJRW51bWVyYXRpb24gcHJvcGVydGllcyA9IGNvbnRleHQucHJvcGVydGllcygpOwotCQkJCQkJd2hpbGUgKHByb3BlcnRpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJCQlwcm9wTiA9IHByb3BlcnRpZXMubmV4dEVsZW1lbnQoKS50b1N0cmluZygpOwotCQkJCQkJCWlmIChjaGVjayhwcm9wTiwgaW1wb3J0YW50LCBzcGVjaWZpY2l0eSkpIHsKLQkJCQkJCQkJZlByb3BlcnRpZXMucHV0KHByb3BOLCBuZXcgQ1NTUXVlcnlWYWx1ZURhdGEoY29udi50b0Fic29sdXRlKGNvbnRleHQuZ2V0KHByb3BOKSksIGltcG9ydGFudCwgc3BlY2lmaWNpdHkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoY2hlY2socHJvcE4sIGltcG9ydGFudCwgc3BlY2lmaWNpdHkpKSB7Ci0JCQkJCQkJSUNTU1N0eWxlRGVjbEl0ZW0gZGVjbEl0ZW0gPSAoSUNTU1N0eWxlRGVjbEl0ZW0pIGRlY2wuZ2V0RGVjbEl0ZW1Ob2RlKHByb3BOYW1lKS5jbG9uZU5vZGUodHJ1ZSk7Ci0JCQkJCQkJaW50IG5WYWx1ZXMgPSBkZWNsSXRlbS5nZXRMZW5ndGgoKTsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG5WYWx1ZXM7IGorKykgewotCQkJCQkJCQljb252LnRvQWJzb2x1dGUoZGVjbEl0ZW0uaXRlbShqKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWRlY2xJdGVtLnNldFByaW9yaXR5KG51bGwpOwotCQkJCQkJCWZQcm9wZXJ0aWVzLnB1dChwcm9wTiwgbmV3IENTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhKGRlY2xJdGVtLCBpbXBvcnRhbnQsIHNwZWNpZmljaXR5KSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeURlY2xhcmF0aW9uRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlEZWNsYXJhdGlvbkRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2MTI1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeURlY2xhcmF0aW9uRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLQotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ1NTUXVlcnlEZWNsYXJhdGlvbkRhdGEgZXh0ZW5kcyBDU1NRdWVyeVZhbHVlRGF0YSB7Ci0KLQotCUlDU1NTdHlsZURlY2xJdGVtIGRlY2xJdGVtOwotCi0JcHVibGljIENTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhKElDU1NTdHlsZURlY2xJdGVtIGRlY2xJdGVtLCBib29sZWFuIGltcCwgaW50IHNwZWNpZmljaXR5KSB7Ci0JCXN1cGVyKG51bGwsIGltcCwgc3BlY2lmaWNpdHkpOwotCQl0aGlzLmRlY2xJdGVtID0gZGVjbEl0ZW07Ci0JfQotCi0JLyoqCi0JICovCi0JSUNTU1N0eWxlRGVjbEl0ZW0gZ2V0RGVjbEl0ZW0oKSB7Ci0JCXJldHVybiBkZWNsSXRlbTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAodmFsdWUgPT0gbnVsbCAmJiBkZWNsSXRlbSAhPSBudWxsKSB7Ci0JCQl2YWx1ZSA9IGRlY2xJdGVtLmdldENTU1ZhbHVlVGV4dCgpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5VHJhdmVyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeVRyYXZlcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjA2MTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5VHJhdmVyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQWJzdHJhY3RDc3NUcmF2ZXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuRWxlbWVudENTU0lubGluZVN0eWxlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENTU1F1ZXJ5VHJhdmVyc2VyIGV4dGVuZHMgQWJzdHJhY3RDc3NUcmF2ZXJzZXIgewotCi0JcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcHNldWRvTmFtZTsKLQlwcml2YXRlIENTU1F1ZXJ5Q29udGV4dCBjb250ZXh0ID0gbnVsbDsKLQlJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbigpIHsKLQkJdHJ5IHsKLQkJCUlDU1NTdHlsZURlY2xhcmF0aW9uIGlubGluZVN0eWxlID0gKElDU1NTdHlsZURlY2xhcmF0aW9uKSAoKEVsZW1lbnRDU1NJbmxpbmVTdHlsZSkgZWxlbWVudCkuZ2V0U3R5bGUoKTsKLQkJCWlmIChpbmxpbmVTdHlsZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGNvbnRleHQgPT0gbnVsbCkgewotCQkJCQljb250ZXh0ID0gbmV3IENTU1F1ZXJ5Q29udGV4dCgpOwotCQkJCX0KLQkJCQljb250ZXh0Lm92ZXJyaWRlV2l0aEV4cGFuZChpbmxpbmVTdHlsZSwgMTAwMDApOwotCQkJCS8vIHN0eWxlIGF0dHJpYnV0ZSdzIHNwZWNpZmljaXR5IGlzIDEwMCAoaW4gQ1NTMiBzcGVjLikgYW5kCi0JCQkJLy8gb3VyIGltcGxlbWVudCB1c2UgMTAwIGFzIGJhc2UgbnVtYmVyIChzZWUgQ1NTU2VsZWN0b3IuamF2YSkKLQkJCX0KLQkJfQotCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBlbGVtZW50IGlzIG5vdCBFbGVtZW50Q1NTSW5saW5lU3R5bGUgPz8/Ci0JCX0KLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChkZWNsID09IG51bGwpCi0JCQlkZWNsID0gQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVTdHlsZURlY2xhcmF0aW9uKCk7Ci0JCWNvbnRleHQuYXBwbHlGdWxsKGRlY2wpOwotCQlyZXR1cm4gZGVjbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgb3ZlcndyaXRlRGVjbGFyYXRpb24oSUNTU1N0eWxlRGVjbGFyYXRpb24gZCwgaW50IHNwZWNpZmljaXR5KSB7Ci0JCWlmIChkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQljb250ZXh0ID0gbmV3IENTU1F1ZXJ5Q29udGV4dCgpOwotCQljb250ZXh0Lm92ZXJyaWRlV2l0aEV4cGFuZChkLCBzcGVjaWZpY2l0eSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IHBvc3ROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIFRSQVZfQ09OVDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSkgewotCQkJLy8gc3R5bGUgcnVsZQotCQkJSUNTU1N0eWxlUnVsZSBzdHlsZSA9IChJQ1NTU3R5bGVSdWxlKSBub2RlOwotCQkJSUNTU1NlbGVjdG9yTGlzdCBsaXN0ID0gc3R5bGUuZ2V0U2VsZWN0b3JzKCk7Ci0JCQlpbnQgblNlbGVjdG9ycyA9IGxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCQlpbnQgbWF4U3BlY2lmaWNpdHkgPSAtMTsKLQkJCWZvciAoaW50IGlTZWxlY3RvciA9IDA7IGlTZWxlY3RvciA8IG5TZWxlY3RvcnM7IGlTZWxlY3RvcisrKSB7Ci0JCQkJLy8gQ2hlY2sgZWFjaCBTZWxlY3RvciBMaXN0cwotCQkJCUlDU1NTZWxlY3RvciBzZWxlY3RvciA9IGxpc3QuZ2V0U2VsZWN0b3IoaVNlbGVjdG9yKTsKLQkJCQlpbnQgc3BlY2lmaWNpdHkgPSBzZWxlY3Rvci5nZXRTcGVjaWZpY2l0eSgpOwotCQkJCWlmIChtYXhTcGVjaWZpY2l0eSA8IHNwZWNpZmljaXR5ICYmIHNlbGVjdG9yLm1hdGNoKGVsZW1lbnQsIHBzZXVkb05hbWUpKSB7Ci0JCQkJCW1heFNwZWNpZmljaXR5ID0gc3BlY2lmaWNpdHk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1heFNwZWNpZmljaXR5ID49IDApIHsKLQkJCQkvLyBhcHBseSB0aGlzIHN0eWxlIHRvIHRoZSBlbGVtZW50Ci0JCQkJb3ZlcndyaXRlRGVjbGFyYXRpb24oKElDU1NTdHlsZURlY2xhcmF0aW9uKSBzdHlsZS5nZXRTdHlsZSgpLCBtYXhTcGVjaWZpY2l0eSk7Ci0JCQl9Ci0JCQlyZXR1cm4gVFJBVl9QUlVORTsKLQkJfQotCQlyZXR1cm4gVFJBVl9DT05UOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldENvbnRleHQoKSB7Ci0JCWNvbnRleHQgPSBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLnBzZXVkb05hbWUgPSBwc2V1ZG9OYW1lOwotCQlyZXNldENvbnRleHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeVZhbHVlRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlWYWx1ZURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE5ODE1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeVZhbHVlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uLlZhbHVlRGF0YTsKLQotCi0KLS8qKgotICovCi1jbGFzcyBDU1NRdWVyeVZhbHVlRGF0YSBleHRlbmRzIFZhbHVlRGF0YSB7Ci0KLQlwcml2YXRlIGludCBzcGVjaWZpY2l0eTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDU1NRdWVyeVZhbHVlRGF0YSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTUXVlcnlWYWx1ZURhdGEoU3RyaW5nIHZhbCwgYm9vbGVhbiBpbXApIHsKLQkJc3VwZXIodmFsLCBpbXApOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDU1NRdWVyeVZhbHVlRGF0YShTdHJpbmcgdmFsLCBib29sZWFuIGltcCwgaW50IHNwZWNpZmljaXR5KSB7Ci0JCXN1cGVyKHZhbCwgaW1wKTsKLQkJdGhpcy5zcGVjaWZpY2l0eSA9IHNwZWNpZmljaXR5OwotCX0KLQotCS8qKgotCSAqLwotCWludCBnZXRTcGVjaWZpY2l0eSgpIHsKLQkJcmV0dXJuIHNwZWNpZmljaXR5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0hUTUxEb2N1bWVudEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0hUTUxEb2N1bWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0NzEyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9IVE1MRG9jdW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0TGlzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU0NsYXNzVHJhdmVyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkltcG9ydFJ1bGVDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdDsKLQotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50QWRhcHRlciBpbXBsZW1lbnRzIElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIsIFN0eWxlU2hlZXRMaXN0IHsKLQotCXByaXZhdGUgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgVmVjdG9yIHN0eWxlQWRhcHRlcnMgPSBudWxsOwotCXByaXZhdGUgVmVjdG9yIG9sZFN0eWxlQWRhcHRlcnMgPSBudWxsOwotCi0JLyoqCi0JICovCi0JSFRNTERvY3VtZW50QWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU3R5bGVTaGVldChFbGVtZW50IG5vZGUpIHsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYm9vbGVhbiBpc0NvbnRhaW5lciA9IGZhbHNlOwotCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9TQ1JJUFQpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRSkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJPT1QpIHx8ICghZWxlbWVudC5pc0dsb2JhbFRhZygpICYmIGVsZW1lbnQuaXNDb250YWluZXIoKSkpIHsKLQkJCWlzQ29udGFpbmVyID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQlOb2RlIHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHBhcmVudCA9PSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSkgewotCQkJCS8vIFRoaXMgY29uZGl0aW9uIGlzIHRvbyBzZXZlcmUsIGFjdHVhbGx5IGRvIG5vdCB3b3JrIGZvciBKU0YgdGVtcGxhdGUuCi0JCQkJLy8gQnV0IGFib3ZlICghIGdsb2JhbFRhZygpICYmIGlzQ29udGFpbmVyKCkpIGNvdmVyIEpTRiB0ZW1wbGF0ZSArIHRwbCB0ZW1wbGF0ZQotCQkJCWlzQ29udGFpbmVyID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJdGFnTmFtZSA9ICgoRWxlbWVudCkgcGFyZW50KS5nZXRUYWdOYW1lKCk7Ci0JCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCAmJiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQpKSB7Ci0JCQkJCWlzQ29udGFpbmVyID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQllbHNlIHsKLQkJCVN0cmluZyBsb2NhbE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotCQkJaWYgKGxvY2FsTmFtZSAhPSBudWxsICYmIGxvY2FsTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MKSkgewotCQkJCS8vIHRhZ2xpYiBodG1sIHRhZwotCQkJCWlzQ29udGFpbmVyID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSBlbGVtZW50OwotCQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlciBpbnN0YW5jZW9mIElTdHlsZVNoZWV0QWRhcHRlcikgewotCQkJCQl0aGlzLnN0eWxlQWRhcHRlcnMuYWRkRWxlbWVudChhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGlzQ29udGFpbmVyKSB7Ci0JCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gZWxlbWVudDsKLQkJCWlmIChub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcykgPT0gbnVsbCkgewotCQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIodGhpcyk7Ci0JCQl9Ci0JCQlmb3IgKE5vZGUgY2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWFkZFN0eWxlU2hlZXQoKEVsZW1lbnQpIGNoaWxkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgY2hpbGRSZXBsYWNlZCgpIHsKLQkJaWYgKHRoaXMuc3R5bGVBZGFwdGVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGJhY2t1cCBvbGQgYWRhcHRlcnMgdG8gYmUgcmVsZWFzZWQgb24gdXBkYXRpbmcgaW4gZ2V0U3R5bGVTaGVldHMoKQotCQl0aGlzLm9sZFN0eWxlQWRhcHRlcnMgPSB0aGlzLnN0eWxlQWRhcHRlcnM7Ci0JCS8vIGludmFsaWRhdGUgdGhlIGxpc3QKLQkJdGhpcy5zdHlsZUFkYXB0ZXJzID0gbnVsbDsKLQotCQlub3RpZnlTdHlsZVNoZWV0c0NoYW5nZWQodGhpcy5kb2N1bWVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGdldENsYXNzZXMoKSB7Ci0JCVN0eWxlU2hlZXRMaXN0IHNoZWV0TGlzdCA9IGdldFN0eWxlU2hlZXRzKCk7Ci0JCWludCBuU2hlZXRzID0gc2hlZXRMaXN0LmdldExlbmd0aCgpOwotCi0JCWZpbmFsIEFycmF5TGlzdCBjbGFzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUNTU0NsYXNzVHJhdmVyc2VyIHRyYXZlcnNlciA9IG5ldyBDU1NDbGFzc1RyYXZlcnNlcigpOwotCQl0cmF2ZXJzZXIuc2V0VHJhdmVyc2VJbXBvcnRlZCh0cnVlKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5TaGVldHM7IGkrKykgewotCQkJb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldCBzaGVldCA9IHNoZWV0TGlzdC5pdGVtKGkpOwotCQkJaWYgKHNoZWV0IGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCQl0cmF2ZXJzZXIuYXBwbHkoKElDU1NOb2RlKSBzaGVldCk7Ci0JCQl9Ci0JCX0KLQkJY2xhc3Nlcy5hZGRBbGwodHJhdmVyc2VyLmdldENsYXNzTmFtZXMoKSk7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtZXJhdGlvbigpIHsKLQkJCWludCBpID0gMDsKLQotCQkJcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCQkJCXJldHVybiBpIDwgY2xhc3Nlcy5zaXplKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0JCQkJcmV0dXJuIGNsYXNzZXMuZ2V0KGkrKyk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFZhbGlkQWRhcHRlcnMoKSB7Ci0JCVZlY3RvciB2YWxpZEFkYXB0ZXJzID0gbmV3IFZlY3RvcigpOwotCQlpZiAodGhpcy5zdHlsZUFkYXB0ZXJzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGkgPSB0aGlzLnN0eWxlQWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlciAmJiAoKEFic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIpIG9iaikuaXNWYWxpZEF0dHJpYnV0ZSgpKSB7Ci0JCQkJCXZhbGlkQWRhcHRlcnMuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB2YWxpZEFkYXB0ZXJzOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0VmFsaWRBZGFwdGVycygpLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRPdmVycmlkZVN0eWxlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpIHsKLQkJU3R5bGVTaGVldExpc3Qgc3NsID0gZ2V0U3R5bGVTaGVldHMoKTsKLQkJaW50IG51bVN0eWxlcyA9IHNzbC5nZXRMZW5ndGgoKTsKLQotCQlDU1NRdWVyeVRyYXZlcnNlciBxdWVyeSA9IG5ldyBDU1NRdWVyeVRyYXZlcnNlcigpOwotCQlxdWVyeS5zZXRUcmF2ZXJzZUltcG9ydGVkKHRydWUpOwotCQlxdWVyeS5zZXRUcmF2ZXJzZUltcG9ydEZpcnN0KHRydWUpOwotCQlxdWVyeS5zZXRFbGVtZW50KGVsZW1lbnQsIHBzZXVkb05hbWUpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtU3R5bGVzOyBpKyspIHsKLQkJCS8vIGxvb3AgZm9yIHN0eWxlcyAoPHN0eWxlPiBhbmQgPGxpbms+KQotCQkJb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldCBzcyA9IHNzbC5pdGVtKGkpOwotCi0JCQl0cnkgewotCQkJCXF1ZXJ5LmFwcGx5KChJQ1NTTm9kZSkgc3MpOwotCQkJfQotCQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIEkgY2FuIGhhbmRsZSBvbmx5IENTUyBzdHlsZQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHF1ZXJ5LmdldERlY2xhcmF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0eWxlU2hlZXRMaXN0IGdldFN0eWxlU2hlZXRzKCkgewotCQlpZiAodGhpcy5zdHlsZUFkYXB0ZXJzID09IG51bGwpIHsKLQkJCWlmICh0aGlzLmRvY3VtZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCXRoaXMuc3R5bGVBZGFwdGVycyA9IG5ldyBWZWN0b3IoKTsKLQkJCWZvciAoTm9kZSBjaGlsZCA9IHRoaXMuZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJY29udGludWU7Ci0JCQkJYWRkU3R5bGVTaGVldCgoRWxlbWVudCkgY2hpbGQpOwotCQkJfQotCi0JCQlyZW1vdmVPbGRTdHlsZVNoZWV0cygpOwotCQl9Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZQotCSAqIGFsbG93cyBpdCB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0eWxlU2hlZXQgaXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKHRoaXMuc3R5bGVBZGFwdGVycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTGlzdCB2YWxpZEFkYXB0ZXJzID0gZ2V0VmFsaWRBZGFwdGVycygpOwotCi0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdmFsaWRBZGFwdGVycy5zaXplKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3R5bGVTaGVldCBzaGVldCA9ICgoSVN0eWxlU2hlZXRBZGFwdGVyKSB2YWxpZEFkYXB0ZXJzLmdldChpbmRleCkpLmdldFNoZWV0KCk7Ci0JCWlmIChzaGVldCA9PSBudWxsKSB7Ly8gZm9yIExJTksgZWxlbWVudCB3aG9zZSBsaW5rIGlzIGJyb2tlbgotCQkJSUNTU01vZGVsIG1vZGVsID0gKChBYnN0cmFjdFN0eWxlU2hlZXRBZGFwdGVyKSB2YWxpZEFkYXB0ZXJzLmdldChpbmRleCkpLmNyZWF0ZU1vZGVsKCk7Ci0JCQlzaGVldCA9ICgobW9kZWwgIT0gbnVsbCkgPyAoU3R5bGVTaGVldCkgbW9kZWwuZ2V0RG9jdW1lbnQoKSA6IG51bGwpOwotCQl9Ci0JCXJldHVybiBzaGVldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJTm9kZSBub2RlID0gbnVsbDsKLQkJc3dpdGNoIChldmVudFR5cGUpIHsKLQkJCWNhc2UgSU5vZGVOb3RpZmllci5BREQgOgotCQkJCWlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIE5vZGUpCi0JCQkJCW5vZGUgPSAoTm9kZSkgbmV3VmFsdWU7Ci0JCQkJZWxzZSBpZiAoY2hhbmdlZEZlYXR1cmUgaW5zdGFuY2VvZiBBdHRyKQotCQkJCQlub2RlID0gKChBdHRyKSBjaGFuZ2VkRmVhdHVyZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElOb2RlTm90aWZpZXIuUkVNT1ZFIDoKLQkJCQlpZiAob2xkVmFsdWUgaW5zdGFuY2VvZiBOb2RlKQotCQkJCQlub2RlID0gKE5vZGUpIG9sZFZhbHVlOwotCQkJCWVsc2UgaWYgKGNoYW5nZWRGZWF0dXJlIGluc3RhbmNlb2YgQXR0cikKLQkJCQkJbm9kZSA9ICgoQXR0cikgY2hhbmdlZEZlYXR1cmUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJTm9kZU5vdGlmaWVyLkNIQU5HRSA6Ci0JCQkJbm9kZSA9IChOb2RlKSBub3RpZmllcjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JCQotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJc3dpdGNoKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERTogewotCQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ0hBTkdFKSB7Ci0JCQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJBU0UpKSB7Ci0JCQkJCQlyZWZyZXNoQWRhcHRlcnMoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJTkspIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9TQ1JJUFQpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5ST09UKSB8fCBlbGVtZW50LmlzQ29tbWVudFRhZygpIHx8ICghZWxlbWVudC5pc0dsb2JhbFRhZygpICYmIGVsZW1lbnQuaXNDb250YWluZXIoKSkpIHsKLQkJCQkJCWNoaWxkUmVwbGFjZWQoKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJBU0UpKSB7Ci0JCQkJCQlyZWZyZXNoQWRhcHRlcnMoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVN0cmluZyBsb2NhbE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotCQkJCQkJaWYgKGxvY2FsTmFtZSAhPSBudWxsICYmIGxvY2FsTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MKSkgewotCQkJCQkJCS8vIHRhZ2xpYiBodG1sIHRhZwotCQkJCQkJCWNoaWxkUmVwbGFjZWQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6IHsKLQkJCQlpZiAoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJBU0UuZXF1YWxzKCgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCkuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0JCQkJCXJlZnJlc2hBZGFwdGVycygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiByZWxvYWQgTElOSyAvIEBpbXBvcnQgaWYgQkFTRSBjaGFuZ2VkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hBZGFwdGVycygpIHsKLQkJSXRlcmF0b3IgaUFkYXB0ZXIgPSB0aGlzLnN0eWxlQWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGlBZGFwdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBpQWRhcHRlci5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIExpbmtFbGVtZW50QWRhcHRlcikgewotCQkJCSgoTGlua0VsZW1lbnRBZGFwdGVyKSBhZGFwdGVyKS5yZWZyZXNoU2hlZXQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBTdHlsZUVsZW1lbnRBZGFwdGVyKSB7Ci0JCQkJSUNTU01vZGVsIG1vZGVsID0gKChTdHlsZUVsZW1lbnRBZGFwdGVyKSBhZGFwdGVyKS5nZXRNb2RlbCgpOwotCQkJCUltcG9ydFJ1bGVDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRSdWxlQ29sbGVjdG9yKCk7Ci0JCQkJdHJhdi5hcHBseShtb2RlbCk7Ci0JCQkJSXRlcmF0b3IgaVJ1bGUgPSB0cmF2LmdldFJ1bGVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaVJ1bGUuaGFzTmV4dCgpKSB7Ci0JCQkJCUlDU1NJbXBvcnRSdWxlIHJ1bGUgPSAoSUNTU0ltcG9ydFJ1bGUpIGlSdWxlLm5leHQoKTsKLQkJCQkJcnVsZS5yZWZyZXNoU3R5bGVTaGVldCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBub3RpZnlTdHlsZVNoZWV0c0NoYW5nZWQoRG9jdW1lbnQgdGFyZ2V0KSB7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgdGFyZ2V0OwotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ29sbGVjdGlvbiBhZGFwdGVycyA9IG5vdGlmaWVyLmdldEFkYXB0ZXJzKCk7Ci0JCWlmIChhZGFwdGVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBpdCA9IGFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCWlmIChpdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IChJTm9kZUFkYXB0ZXIpIGl0Lm5leHQoKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgU3R5bGVMaXN0ZW5lcikgewotCQkJCVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIgPSAoU3R5bGVMaXN0ZW5lcikgYWRhcHRlcjsKLQkJCQlsaXN0ZW5lci5zdHlsZUNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZWxlYXNlT2xkU3R5bGVTaGVldHMoKSB7Ci0JCWlmICh0aGlzLm9sZFN0eWxlQWRhcHRlcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3IgaXQgPSB0aGlzLm9sZFN0eWxlQWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSVN0eWxlU2hlZXRBZGFwdGVyIGFkYXB0ZXIgPSAoSVN0eWxlU2hlZXRBZGFwdGVyKSBpdC5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJLy8gaWYgdGhlIHNhbWUgYWRhcHRlciBpcyBpbiB0aGUgY3VycmVudCBsaXN0LAotCQkJLy8gZG8gbm90IHJlbGVhc2UKLQkJCWlmICh0aGlzLnN0eWxlQWRhcHRlcnMgIT0gbnVsbCAmJiB0aGlzLnN0eWxlQWRhcHRlcnMuY29udGFpbnMoYWRhcHRlcikpCi0JCQkJY29udGludWU7Ci0JCQlhZGFwdGVyLnJlbGVhc2VkKCk7Ci0JCX0KLQkJdGhpcy5vbGRTdHlsZUFkYXB0ZXJzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlU3R5bGVTaGVldHMoKSB7Ci0JCXJlbGVhc2VPbGRTdHlsZVNoZWV0cygpOwotCi0JCWlmICh0aGlzLnN0eWxlQWRhcHRlcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3IgaXQgPSB0aGlzLnN0eWxlQWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSVN0eWxlU2hlZXRBZGFwdGVyIGFkYXB0ZXIgPSAoSVN0eWxlU2hlZXRBZGFwdGVyKSBpdC5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCWFkYXB0ZXIucmVsZWFzZWQoKTsKLQkJfQotCQl0aGlzLnN0eWxlQWRhcHRlcnMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVPbGRTdHlsZVNoZWV0cygpIHsKLQkJaWYgKHRoaXMub2xkU3R5bGVBZGFwdGVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBpdCA9IHRoaXMub2xkU3R5bGVBZGFwdGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJU3R5bGVTaGVldEFkYXB0ZXIgYWRhcHRlciA9IChJU3R5bGVTaGVldEFkYXB0ZXIpIGl0Lm5leHQoKTsKLQkJCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQkvLyBpZiB0aGUgc2FtZSBhZGFwdGVyIGlzIGluIHRoZSBjdXJyZW50IGxpc3QsCi0JCQkvLyBkbyBub3QgcmVsZWFzZQotCQkJaWYgKHRoaXMuc3R5bGVBZGFwdGVycyAhPSBudWxsICYmIHRoaXMuc3R5bGVBZGFwdGVycy5jb250YWlucyhhZGFwdGVyKSkKLQkJCQljb250aW51ZTsKLQkJCWFkYXB0ZXIucmVtb3ZlZCgpOwotCQl9Ci0JCXRoaXMub2xkU3R5bGVBZGFwdGVycyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXREb2N1bWVudChEb2N1bWVudCBkb2N1bWVudCkgewotCQl0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlNjVkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTZWxlY3RvckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTaW1wbGVTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlciBpbXBsZW1lbnRzIElTdHlsZVNlbGVjdG9yQWRhcHRlciB7Ci0KLQlzdGF0aWMgcHJpdmF0ZSBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXIgaW5zdGFuY2U7Ci0JcHJpdmF0ZSBPYmplY3QgdG9NYXRjaCA9IElTdHlsZVNlbGVjdG9yQWRhcHRlci5jbGFzczsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IHRvTWF0Y2g7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2goSUNTU1NpbXBsZVNlbGVjdG9yIHNlbGVjdG9yLCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBpOwotCQlTdHJpbmcga2V5OwotCi0JCS8vIFBzZXVkb05hbWUKLQkJaSA9IHNlbGVjdG9yLmdldE51bU9mUHNldWRvTmFtZXMoKTsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlpZiAocHNldWRvTmFtZSA9PSBudWxsIHx8IHBzZXVkb05hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlmb3IgKGkgPSBpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQlpZiAocHNldWRvTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHNlbGVjdG9yLmdldFBzZXVkb05hbWUoaSkpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpIDwgMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBjaGVjayB0YWcgbmFtZQotCQlpZiAoIXNlbGVjdG9yLmlzVW5pdmVyc2FsKCkgJiYgIWVsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHNlbGVjdG9yLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gY2hlY2sgaWQKLQkJaSA9IHNlbGVjdG9yLmdldE51bU9mSURzKCk7Ci0JCWlmIChpID4gMCkgewotCQkJaWYgKGkgPiAxKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoImlkIikgfHwgKGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpKS5sZW5ndGgoKSA9PSAwKS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmICghc2VsZWN0b3IuZ2V0SUQoMCkuZXF1YWxzKGtleSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY2hlY2sgY2xhc3MKLQkJaSA9IHNlbGVjdG9yLmdldE51bU9mQ2xhc3NlcygpOwotCQlpZiAoaSA+IDApIHsKLQkJCWlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoImNsYXNzIikgfHwgKGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKS5sZW5ndGgoKSA9PSAwKSAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoa2V5KTsKLQkJCWZvciAoaSA9IGkgLSAxOyBpID49IDA7IGktLSkgewotCQkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKLQkJCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlpZiAoc2VsZWN0b3IuZ2V0Q2xhc3MoaSkuZXF1YWxzKHRva2VuaXplci5uZXh0VG9rZW4oKSkpIHsKLQkJCQkJCW9rID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghb2spCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGF0dHJpYnV0ZXMKLQkJZm9yIChpID0gc2VsZWN0b3IuZ2V0TnVtT2ZBdHRyaWJ1dGVzKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2VsZWN0b3IuZ2V0QXR0cmlidXRlKGkpLCAiPX58IFx0XHJcblxmIik7Ly8kTk9OLU5MUy0xJAotCQkJaW50IGNvdW50VG9rZW5zID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0JCQlpZiAoY291bnRUb2tlbnMgPiAwKSB7Ci0JCQkJU3RyaW5nIGF0dHJOYW1lID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJCVN0cmluZyBhdHRyVmFsdWUgPSBudWxsOwotCQkJCWlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0ck5hbWUpIHx8IChhdHRyVmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyTmFtZSkpLmxlbmd0aCgpID09IDApCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoY291bnRUb2tlbnMgPiAxKSB7Ci0JCQkJCVN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oIj0gXHRcclxuXGYiKTsvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1Rva2VuaXplciBhdHRyVmFsdWVUb2tlbml6ZXIgPSBudWxsOwotCQkJCQlpZiAodG9rZW4uZXF1YWxzKCJ+IikpIHsvLyROT04tTkxTLTEkCi0JCQkJCQlhdHRyVmFsdWVUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHJWYWx1ZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ8IikpIHsvLyROT04tTkxTLTEkCi0JCQkJCQlhdHRyVmFsdWVUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHJWYWx1ZSwgIi0iKTsvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJaWYgKGF0dHJWYWx1ZVRva2VuaXplciAhPSBudWxsKSB7Ci0JCQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJCXRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJCQkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKLQkJCQkJCQl3aGlsZSAoYXR0clZhbHVlVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJCQlpZiAodG9rZW4uZXF1YWxzKGF0dHJWYWx1ZVRva2VuaXplci5uZXh0VG9rZW4oKSkpIHsKLQkJCQkJCQkJCW9rID0gdHJ1ZTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghb2spCi0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmICghYXR0clZhbHVlLmVxdWFscyh0b2tlbikpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2NkNjg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0hUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNlbGVjdG9yQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlOwotCXByaXZhdGUgT2JqZWN0IHRvTWF0Y2ggPSBJU3R5bGVTZWxlY3RvckFkYXB0ZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBDU1NNb2RlbFByb3ZpZGVBZGFwdGVyRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0aGF0IHJldHVybnMgdGhlIGFkYXB0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QuCi0JICogSXQgbWF5IGJlIGEgc2luZ2xldG9uIG9yIG5vdCAuLi4gZGVwZW5kaW5nIG9uIHRoZSBuZWVkcyBvZiB0aGUgSU5vZGVBZGFwdGVyICAuLi4KLQkgKiBidXQgaW4gZ2VuZXJhbCBpdCBpcyByZWNvbW1lbmRlZCBmb3IgYW4gYWRhcHRlciB0byBiZSBzdGF0ZWxlc3MsIAotCSAqIHNvIHRoZSBlZmZpY2llbmNpZXMgb2YgYSBzaW5nbGV0b24gY2FuIGJlIGdhaW5lZC4KLQkgKgotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBzaG91bGQgY2FsbCBhZGRBZGFwdGVyIG9uIHRoZSBhZGFwdGVkCi0JICogb2JqZWN0IHdpdGggdGhlIGNvcnJlY3QgaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKElTdHlsZVNlbGVjdG9yQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlcjsKLQkJYWRhcHRlciA9IEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlci5nZXRJbnN0YW5jZSgpOwotCQlub3RpZmllci5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIGlzRmFjdG9yeUZvclR5cGUgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSB0b01hdGNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRpbmcgY29weSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0xpbmtFbGVtZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvTGlua0VsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMTNkNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvTGlua0VsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSU1vZGVsUHJvdmlkZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0TGlzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgTGlua0VsZW1lbnRBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1NTX0lEID0gQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUzsKLQlwcml2YXRlIGJvb2xlYW4gcmVwbGFjZU1vZGVsID0gdHJ1ZTsKLQkvLyB0aGlzIHZhcmlhYmxlIHRvIGhvbGQgdGhlIGNsYXNzIGlzIGp1c3QgYSBWQUphdmEgdHJpY2suCi0JLy8gaXQgaW1wcm92ZXMgcGVyZm9ybWFuY2UgaW4gVkFKYXZhIGJ5IG1pbmltaXppbmcgY2xhc3MgbG9hZGluZy4KLQlwcml2YXRlIGZpbmFsIENsYXNzIE1vZGVsUHJvdmlkZUFkYXB0ZXJDbGFzcyA9IElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIExpbmtFbGVtZW50QWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXR0clJlcGxhY2VkKCkgewotCQl0aGlzLnJlcGxhY2VNb2RlbCA9IHRydWU7Ci0KLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlEb2N1bWVudCBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudDsKLQkJSFRNTERvY3VtZW50QWRhcHRlciBhZGFwdGVyID0gKEhUTUxEb2N1bWVudEFkYXB0ZXIpIG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWFkYXB0ZXIuY2hpbGRSZXBsYWNlZCgpOwotCX0KLQotCXByb3RlY3RlZCBJQ1NTTW9kZWwgY3JlYXRlTW9kZWwoKSB7Ci0JCS8vIGNyZWF0ZSBwaGFudG9tKGJyb2tlbiBsaW5rKSBleHRlcm5hbCBDU1MgbW9kZWwKLQkJaWYgKGdldEVsZW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsID0gKChJRE9NTm9kZSkgZ2V0RWxlbWVudCgpKS5nZXRNb2RlbCgpOwotCQlJQ1NTTW9kZWwgbmV3TW9kZWwgPSAoSUNTU01vZGVsKSBiYXNlTW9kZWwuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKENTU19JRCk7Ci0KLQkJLy8gY2FsY3VsYXRlIGJhc2UgbG9jYXRpb24gYW5kIHNldAotCQkvLyBnZXQgcmVzb2x2ZXIgaW4gTW9kZWwKLQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBiYXNlTW9kZWwuZ2V0UmVzb2x2ZXIoKTsKLQotCQkvLyByZXNvbHZlIHRvIGFic29sdXRlIHVybCA6IHRoaXMgbmVlZCBub3QgZXhhY3QgbG9jYXRpb24gb2YgY3NzIGZpbGUuIEl0IGlzIGltcG9ydGFudCB0aGF0IGFic3VybCBpcyBub3QgbnVsbC4gCi0JCVN0cmluZyByZWYgPSBnZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRik7Ci0JCVN0cmluZyBhYnN1cmwgPSAocmVzb2x2ZXIgIT0gbnVsbCAmJiByZWYgIT0gbnVsbCAmJiByZWYubGVuZ3RoKCkgPiAwKSA/IHJlc29sdmVyLmdldExvY2F0aW9uQnlVUkkocmVmLCB0cnVlKSA6IG51bGw7Ci0JCWlmICgoYWJzdXJsID09IG51bGwpIHx8IChhYnN1cmwubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCUlQYXRoIGJhc2VQYXRoID0gbmV3IFBhdGgoYmFzZU1vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJCVVSTEhlbHBlciBoZWxwZXIgPSBuZXcgVVJMSGVscGVyKGJhc2VQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b1N0cmluZygpKTsKLQkJCWFic3VybCA9IGhlbHBlci50b0Fic29sdXRlKHJlZiA9PSBudWxsID8gIiIgOiByZWYpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoKGFic3VybCA9PSBudWxsKSB8fCAoYWJzdXJsLmxlbmd0aCgpID09IDApKSB7Ci0JCQlhYnN1cmwgPSByZWY7Ci0JCX0KLQkJaWYgKGFic3VybCA9PSBudWxsKSB7Ci0JCQlhYnN1cmwgPSAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQkJbmV3TW9kZWwuc2V0QmFzZUxvY2F0aW9uKGFic3VybCk7Ci0KLQkJLy8gc2V0IHN0eWxlIGxpc3RlbmVyCi0JCW5ld01vZGVsLmFkZFN0eWxlTGlzdGVuZXIodGhpcyk7Ci0KLQkJcmV0dXJuIG5ld01vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJQ1NTTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKHRoaXMucmVwbGFjZU1vZGVsKSB7Ci0JCQlJQ1NTTW9kZWwgb2xkTW9kZWwgPSBtb2RlbDsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSByZXRyaWV2ZU1vZGVsKCk7Ci0JCQkJc2V0TW9kZWwobW9kZWwpOwotCi0JCQkJLy8gcmVsZWFzZSBvbGQgbW9kZWwKLQkJCQlpZiAob2xkTW9kZWwgIT0gbnVsbCkgewotCQkJCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGdldEVsZW1lbnQoKSkuZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJCQlhZGFwdGVyLm1vZGVsUmVtb3ZlZChvbGRNb2RlbCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKG9sZE1vZGVsICE9IG51bGwpCi0JCQkJCW9sZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQkJdGhpcy5yZXBsYWNlTW9kZWwgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmIChldmVudFR5cGUgIT0gSU5vZGVOb3RpZmllci5DSEFOR0UpCi0JCQlyZXR1cm47Ci0JCUF0dHIgYXR0ciA9IChBdHRyKSBjaGFuZ2VkRmVhdHVyZTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIG5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgicmVsIikgfHwgLy8kTk9OLU5MUy0xJAotCQkJCQluYW1lLmVxdWFsc0lnbm9yZUNhc2UoInR5cGUiKSB8fCAvLyROT04tTkxTLTEkCQotCQkJCQluYW1lLmVxdWFsc0lnbm9yZUNhc2UoImhyZWYiKSkgey8vJE5PTi1OTFMtMSQKLQkJCWF0dHJSZXBsYWNlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaFNoZWV0KCkgewotCQlpZiAoIXJlcGxhY2VNb2RlbCkgewotCQkJcmVtb3ZlZCgpOwotCQkJcmVwbGFjZU1vZGVsID0gdHJ1ZTsKLQotCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgZ2V0RWxlbWVudCgpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCW5vZGUubm90aWZ5KElOb2RlTm90aWZpZXIuQ0hBTkdFLCBnZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlTm9kZShvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRiksIG51bGwsIG51bGwsIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlZCgpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQotCQkJCS8vIHNldCBlbGVtZW50IHRvIG51bGwgZmlyc3QsIHNvIHRoYXQgbm8gZG9jdW1lbnQgd2lkZSB1cGRhdGVzCi0JCQkJc2V0RWxlbWVudChudWxsKTsKLQkJCQlzZXRNb2RlbChudWxsKTsKLQotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJCWFkYXB0ZXIubW9kZWxSZWxlYXNlZChtb2RlbCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQl0aGlzLnJlcGxhY2VNb2RlbCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZWQoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJc2V0TW9kZWwobnVsbCk7Ci0KLQkJCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCQlhZGFwdGVyLm1vZGVsUmVtb3ZlZChtb2RlbCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQl0aGlzLnJlcGxhY2VNb2RlbCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRBdHRyaWJ1dGUoKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgicmVsIikgfHwgISJzdHlsZXNoZWV0Ii5lcXVhbHNJZ25vcmVDYXNlKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJyZWwiKSkpLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCJ0eXBlIikgJiYgISJ0ZXh0L2NzcyIuZXF1YWxzSWdub3JlQ2FzZShlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpKSkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKCJocmVmIikgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoImhyZWYiKS5sZW5ndGgoKSA9PSAwKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJQ1NTTW9kZWwgcmV0cmlldmVNb2RlbCgpIHsKLQkJaWYgKCFpc1ZhbGlkQXR0cmlidXRlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gbnVsbCxhdHRyIGNoZWNrIGlzIGRvbmUgaW4gaXNWYWxpZEF0dHJpYnV0ZSgpCi0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJU3RyaW5nIGhyZWYgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaHJlZiIpOy8vJE5PTi1OTFMtMSQKLQotCQlJRE9NTW9kZWwgYmFzZU1vZGVsID0gKChJRE9NTm9kZSkgZWxlbWVudCkuZ2V0TW9kZWwoKTsKLQkJaWYgKGJhc2VNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU9iamVjdCBpZCA9IGJhc2VNb2RlbC5nZXRJZCgpOwotCQlpZiAoIShpZCBpbnN0YW5jZW9mIFN0cmluZykpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy9TdHJpbmcgYmFzZSA9IChTdHJpbmcpaWQ7Ci0KLQkJLy8gZ2V0IE1vZGVsUHJvdmlkZUFkYXB0ZXIKLQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBnZXRFbGVtZW50KCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxQcm92aWRlQWRhcHRlckNsYXNzKTsKLQotCQlVUkxNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFVSTE1vZGVsUHJvdmlkZXIoKTsKLQkJdHJ5IHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwgPSBwcm92aWRlci5nZXRNb2RlbEZvclJlYWQoYmFzZU1vZGVsLCBocmVmKTsKLQkJCWlmIChuZXdNb2RlbCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKCEobmV3TW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpKSB7Ci0JCQkJbmV3TW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCS8vIG5vdGlmeSBhZGFwdGVyCi0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCWFkYXB0ZXIubW9kZWxQcm92aWRlZChuZXdNb2RlbCk7Ci0KLQkJCXJldHVybiAoSUNTU01vZGVsKSBuZXdNb2RlbDsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGVsKElDU1NNb2RlbCBtb2RlbCkgewotCQlJQ1NTTW9kZWwgb2xkTW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBvbGRNb2RlbCkKLQkJCXJldHVybjsKLQkJc3VwZXIuc2V0TW9kZWwobW9kZWwpOwotCQlpZiAodGhpcy5yZXBsYWNlTW9kZWwpCi0JCQl0aGlzLnJlcGxhY2VNb2RlbCA9IGZhbHNlOwotCQlpZiAob2xkTW9kZWwgIT0gbnVsbCkKLQkJCW9sZE1vZGVsLnJlbW92ZVN0eWxlTGlzdGVuZXIodGhpcyk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKQotCQkJbW9kZWwuYWRkU3R5bGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMmVlNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZURlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldExpc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIFN0eWxlQWRhcHRlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENTU19DT05URU5UX1RZUEUgPSAidGV4dC9jc3MiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0eWxlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTm9kZSBub2RlID0gKE5vZGUpIG5vdGlmaWVyOwotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJSFRNTERvY3VtZW50QWRhcHRlciBuZXdBZGFwdGVyID0gbmV3IEhUTUxEb2N1bWVudEFkYXB0ZXIoKTsKLQkJCW5ld0FkYXB0ZXIuc2V0RG9jdW1lbnQoKERvY3VtZW50KSBub2RlKTsKLQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIobmV3QWRhcHRlcik7Ci0JCQlyZXR1cm4gbmV3QWRhcHRlcjsKLQkJfQotCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpKSB7Ci0JCQlpZiAoIWlzVGFnQXZhaWxhYmxlKGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkvLwkJU3RyaW5nIHR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUpOwotCQkJLy8JCWlmICh0eXBlICE9IG51bGwgJiYgISB0eXBlLmVxdWFsc0lnbm9yZUNhc2UoQ1NTX0NPTlRFTlRfVFlQRSkpIHsKLQkJCS8vCQkJcmV0dXJuIG51bGw7Ci0JCQkvLwkJfQotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQlTdHlsZUVsZW1lbnRBZGFwdGVyIG5ld0FkYXB0ZXIgPSBuZXcgU3R5bGVFbGVtZW50QWRhcHRlcigpOwotCQkJbmV3QWRhcHRlci5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQkJbm90aWZpZXIuYWRkQWRhcHRlcihuZXdBZGFwdGVyKTsKLQkJCXJldHVybiBuZXdBZGFwdGVyOwotCQl9Ci0JCWVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTElOSykpIHsKLQkJCWlmICghaXNUYWdBdmFpbGFibGUoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCksIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSU5LKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQlMaW5rRWxlbWVudEFkYXB0ZXIgbmV3QWRhcHRlciA9IG5ldyBMaW5rRWxlbWVudEFkYXB0ZXIoKTsKLQkJCW5ld0FkYXB0ZXIuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIobmV3QWRhcHRlcik7Ci0JCQlyZXR1cm4gbmV3QWRhcHRlcjsKLQkJfQotCi0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKElTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlcjsKLQotCQlpZiAoIWlzQXR0cmlidXRlQXZhaWxhYmxlKGVsZW1lbnQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1RZTEUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHlsZUF0dHJBZGFwdGVyIG5ld0FkYXB0ZXIgPSBuZXcgU3R5bGVBdHRyQWRhcHRlcigpOwotCQluZXdBZGFwdGVyLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCW5vdGlmaWVyLmFkZEFkYXB0ZXIobmV3QWRhcHRlcik7Ci0JCXJldHVybiBuZXdBZGFwdGVyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0eWxlQWRhcHRlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgU3R5bGVBZGFwdGVyRmFjdG9yeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzIHx8IHR5cGUgPT0gSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzIHx8IHR5cGUgPT0gSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RhZ0F2YWlsYWJsZShEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jdW1lbnQpOwotCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQlDTURvY3VtZW50IGNtZG9jID0gbW9kZWxRdWVyeS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChkb2N1bWVudCk7Ci0JCQlDTU5hbWVkTm9kZU1hcCBtYXAgPSBjbWRvYy5nZXRFbGVtZW50cygpOwotCQkJaWYgKChDTUVsZW1lbnREZWNsYXJhdGlvbikgbWFwLmdldE5hbWVkSXRlbShlbGVtZW50TmFtZSkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVBdmFpbGFibGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKGRlY2wgIT0gbnVsbCkgewotCQkJCUNNTmFtZWROb2RlTWFwIG1hcCA9IGRlY2wuZ2V0QXR0cmlidXRlcygpOwotCQkJCWlmICgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgbWFwLmdldE5hbWVkSXRlbShhdHRyTmFtZSkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGluZyBPYmplY3QncyBjbG9uZSgpIG1ldGhvZAotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVBdHRyQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVBdHRyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGQ4YzczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlQXR0ckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVBdHRyQWRhcHRlciBleHRlbmRzIEFic3RyYWN0Q1NTTW9kZWxBZGFwdGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLCBJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIgewotCi0JcHJpdmF0ZSBib29sZWFuIGlnbm9yZU5vdGlmaWNhdGlvbiA9IGZhbHNlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTVFlMRSA9ICJzdHlsZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICovCi0JU3R5bGVBdHRyQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSUNTU01vZGVsIGdldE1vZGVsKCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsICYmIGlzTW9kZWxOZWNlc3NhcnkoKSkgewotCQkJbW9kZWwgPSBjcmVhdGVNb2RlbCgpOwotCQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCVJlZ2lvblBhcnNlciBwYXJzZXIgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCk7Ci0JCQlpZiAocGFyc2VyIGluc3RhbmNlb2YgQ1NTU291cmNlUGFyc2VyKSB7Ci0JCQkJKChDU1NTb3VyY2VQYXJzZXIpcGFyc2VyKS5zZXRQYXJzZXJNb2RlKENTU1NvdXJjZVBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCQkJc2V0TW9kZWwobW9kZWwpOyAvLyBuZWVkIHRvIHNldCBiZWZvcmUgdmFsdWVDaGFuZ2VkKCkKLQkJCXZhbHVlQ2hhbmdlZCgpOwotCQl9Ci0JCWlmIChtb2RlbCAhPSBudWxsICYmICFpc01vZGVsTmVjZXNzYXJ5KCkpIHsKLQkJCW1vZGVsID0gbnVsbDsKLQkJCXZhbHVlQ2hhbmdlZCgpOwotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRTdHlsZSgpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDU1NTdHlsZURlY2xhcmF0aW9uKSBtb2RlbC5nZXREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZQotCSAqIGFsbG93cyBpdCB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSA9PSB0aGlzKQotCQkJcmV0dXJuOwotCi0JCXNldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IHRoaXMpCi0JCQlyZXR1cm47Ci0KLQkJc2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJaWYgKHRoaXMuaWdub3JlTm90aWZpY2F0aW9uKQotCQkJcmV0dXJuOwotCi0JCWlmIChldmVudFR5cGUgIT0gSU5vZGVOb3RpZmllci5DSEFOR0UpCi0JCQlyZXR1cm47Ci0JCUF0dHIgYXR0ciA9IChBdHRyKSBjaGFuZ2VkRmVhdHVyZTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIG5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShTVFlMRSkpIHsKLQkJCXZhbHVlQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IHRoaXMpCi0JCQlyZXR1cm47Ci0KLQkJc2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IHRoaXMpCi0JCQlyZXR1cm47Ci0KLQkJc2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWUoKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25MaXN0KCk7Ci0JCWlmIChmbGF0Tm9kZXMgIT0gbnVsbCkgewotCQkJaW50IGNvdW50ID0gZmxhdE5vZGVzLmdldExlbmd0aCgpOwotCQkJaWYgKGNvdW50ID4gMCkgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBmbGF0Tm9kZXMuaXRlbShpKTsKLQkJCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCQl2YWx1ZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5pZ25vcmVOb3RpZmljYXRpb24gPSB0cnVlOwotCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShTVFlMRSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoU1RZTEUpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCSgoSURPTU5vZGUpIGF0dHIpLnNldFZhbHVlU291cmNlKHZhbHVlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShTVFlMRSk7Ci0JCQkJKChJRE9NTm9kZSkgYXR0cikuc2V0VmFsdWVTb3VyY2UodmFsdWUpOwotCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShhdHRyKTsKLQkJCX0KLQkJfQotCQl0aGlzLmlnbm9yZU5vdGlmaWNhdGlvbiA9IGZhbHNlOwotCi0JCW5vdGlmeVN0eWxlQ2hhbmdlZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsdWVDaGFuZ2VkKCkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghaXNNb2RlbE5lY2Vzc2FyeSgpKSB7IC8vIHJlbW92ZWQKLQkJCXNldE1vZGVsKG51bGwpOwotCi0JCQlub3RpZnlTdHlsZUNoYW5nZWQoZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBkZWZlcgotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TVFlMRSk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQl2YWx1ZSA9ICgoSURPTU5vZGUpIGF0dHIpLmdldFZhbHVlU291cmNlKCk7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5zZXRUZXh0KHRoaXMsIHZhbHVlKTsKLQotCQlub3RpZnlTdHlsZUNoYW5nZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTW9kZWxOZWNlc3NhcnkoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50KCkgIT0gbnVsbCAmJiBnZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlTm9kZShvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1RZTEUpICE9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVFbGVtZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVFbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjZjOTA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlRWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogCSAgICBNYXNha2kgU2FpdG9oIChNU0FJVE9IQGpwLmlibS5jb20pCi0gKgkJU2VlIEJ1ZyAxNTMwMDAgIFN0eWxlIEFkYXB0ZXJzIHNob3VsZCBiZSBsYXppZXIKLSAqCQlodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUzMDAwCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklNb2RlbFByb3ZpZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldExpc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlRWxlbWVudEFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFN0eWxlU2hlZXRBZGFwdGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIHsKLQotCXByaXZhdGUgYm9vbGVhbiByZXBsYWNlTW9kZWwgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBpZ25vcmVOb3RpZmljYXRpb24gPSBmYWxzZTsKLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBTdHlsZUVsZW1lbnRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFByZXBhcmF0aW9uIG9mIGFwcGx5aW5nIGNoYW5nZXMgZnJvbSBDU1Mgc3ViLW1vZGVsIHRvIEhUTUwgbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGdldCBvbGQgY29udGVudCBsZW5ndGgKLQkJTm9kZSBjaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoY2hpbGQgPT0gbnVsbCB8fCBjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKQotCQkJcmV0dXJuOwotCQlJRE9NTm9kZSBjb250ZW50ID0gKElET01Ob2RlKSBjaGlsZDsKLQkJaW50IG9sZExlbmd0aCA9IGNvbnRlbnQuZ2V0RW5kT2Zmc2V0KCkgLSBjb250ZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJLy8gZ2V0IG5ldyBjb250ZW50IGxlbmd0aAotCQlpbnQgbmV3TGVuZ3RoID0gMDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKTsKLQkJaWYgKGZsYXROb2RlcyAhPSBudWxsKSB7Ci0JCQlpbnQgY291bnQgPSBmbGF0Tm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoY291bnQgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0ID0gZmxhdE5vZGVzLml0ZW0oY291bnQgLSAxKTsKLQkJCQlpZiAobGFzdCAhPSBudWxsKQotCQkJCQluZXdMZW5ndGggPSBsYXN0LmdldEVuZCgpOwotCQkJfQotCQl9Ci0KLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWludCBlbmQgPSBmbGF0Tm9kZS5nZXRFbmQoKTsKLQkJaW50IGRpZmYgPSBvbGRMZW5ndGggLSBuZXdMZW5ndGg7Ci0JCWludCBsZW5ndGggPSBlbmQgLSBvZmZzZXQgKyBkaWZmOwotCQlTdHJpbmcgZGF0YSA9IGZsYXROb2RlLmdldFRleHQoKTsKLQotCQlyZXBsYWNlRGF0YShvZmZzZXQsIGxlbmd0aCwgZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogQXBwbHkgY2hhbmdlcyBmcm9tIEhUTUwgbW9kZWwgdG8gQ1NTIHN1Yi1tb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCBjb250ZW50Q2hhbmdlZCgpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGRhdGEgPSBudWxsOwotCQlOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSB7Ci0JCQlkYXRhID0gY2hpbGQuZ2V0Tm9kZVZhbHVlKCk7Ci0JCX0KLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCWRhdGEgPSAiIjsvLyROT04tTkxTLTEkCi0KLQkJLy8gbWluaW1pemUgcmVwbGFjZSByYW5nZQotCQlpbnQgc3RhcnQgPSAwLCBlbmQgPSAwOwotCQlTdHJpbmcgb2xkRGF0YSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXQoKTsKLQkJaWYgKG9sZERhdGEgPT0gbnVsbCkKLQkJCW9sZERhdGEgPSAiIjsvLyROT04tTkxTLTEkCi0KLQkJLy8gc2VhcmNoIGRpZmZlcmVuY3QgY2hhcmFjdGVyIHBvc2l0aW9uIGZyb20gZmlyc3QKLQkJZm9yICg7IHN0YXJ0IDwgb2xkRGF0YS5sZW5ndGgoKSAmJiBzdGFydCA8IGRhdGEubGVuZ3RoKCk7IHN0YXJ0KyspCi0JCQlpZiAob2xkRGF0YS5jaGFyQXQoc3RhcnQpICE9IGRhdGEuY2hhckF0KHN0YXJ0KSkKLQkJCQlicmVhazsKLQotCQlpZiAoc3RhcnQgPT0gb2xkRGF0YS5sZW5ndGgoKSAmJiBzdGFydCA9PSBkYXRhLmxlbmd0aCgpKQotCQkJcmV0dXJuOyAvLyBubyBjaGFuZ2UKLQkJZWxzZSBpZiAoc3RhcnQgPT0gb2xkRGF0YS5sZW5ndGgoKSkgewotCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KGdldFJlcXVlc3RlckgyQygpLCBzdGFydCwgMCwgZGF0YS5zdWJzdHJpbmcoc3RhcnQpKTsgLy8gYXBwZW5kIHRleHQgdG8gbGFzdAotCQl9Ci0JCWVsc2UgaWYgKHN0YXJ0ID09IGRhdGEubGVuZ3RoKCkpIHsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChnZXRSZXF1ZXN0ZXJIMkMoKSwgc3RhcnQsIG9sZERhdGEubGVuZ3RoKCkgLSBzdGFydCwgIiIpOyAvLyByZW1vdmUgdGV4dCBvZiBsYXN0IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCS8vIHNlYXJjaCBkaWZmZXJlbmN0IGNoYXJhY3RlciBwb3NpdGlvbiBmcm9tIGxhc3QKLQkJCWZvciAoOyBzdGFydCA8IG9sZERhdGEubGVuZ3RoKCkgLSBlbmQgJiYgc3RhcnQgPCBkYXRhLmxlbmd0aCgpIC0gZW5kOyBlbmQrKykgewotCQkJCWlmIChvbGREYXRhLmNoYXJBdChvbGREYXRhLmxlbmd0aCgpIC0gZW5kIC0gMSkgIT0gZGF0YS5jaGFyQXQoZGF0YS5sZW5ndGgoKSAtIGVuZCAtIDEpKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChnZXRSZXF1ZXN0ZXJIMkMoKSwgc3RhcnQsIG9sZERhdGEubGVuZ3RoKCkgLSBlbmQgLSBzdGFydCwgZGF0YS5zdWJzdHJpbmcoc3RhcnQsIGRhdGEubGVuZ3RoKCkgLSBlbmQpKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElDU1NNb2RlbCBnZXRNb2RlbCgpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAodGhpcy5yZXBsYWNlTW9kZWwpIHsKLQkJCUlDU1NNb2RlbCBvbGRNb2RlbCA9IG1vZGVsOwotCQkJbW9kZWwgPSBjcmVhdGVNb2RlbChmYWxzZSk7Ci0KLQkJCXNldE1vZGVsKG1vZGVsLCBmYWxzZSk7IC8vIG5lZWQgdG8gc2V0IGJlZm9yZSBjb250ZW50Q2hhbmdlZCgpCi0JCQljb250ZW50Q2hhbmdlZCgpOwotCi0JCQkvLyBmcm9tIHN1cGVyLmNyZWF0ZU1vZGVsKCkKLQkJCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCQlJTW9kZWxQcm92aWRlQWRhcHRlciBtb2RlbFByb3ZpZGVBZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGdldEVsZW1lbnQoKSkuZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyBub3RpZnkgYWRhcHRlcgotCQkJaWYgKG1vZGVsUHJvdmlkZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCQltb2RlbFByb3ZpZGVBZGFwdGVyLm1vZGVsUHJvdmlkZWQobW9kZWwpOwotCi0JCQkvLyBmcm9tIGNyZWF0ZU1vZGVsKCkKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJc3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0JCQkvLyBmcm9tIHNldE1vZGVsKCkKLQkJCWlmIChvbGRNb2RlbCAhPSBudWxsKQotCQkJCW9sZE1vZGVsLnJlbW92ZVN0eWxlTGlzdGVuZXIodGhpcyk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5hZGRTdHlsZUxpc3RlbmVyKHRoaXMpOwotCi0JCQlpZiAob2xkTW9kZWwgIT0gbnVsbCkgewotCQkJCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBnZXRFbGVtZW50KCkpLmdldEFkYXB0ZXJGb3IoSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJYWRhcHRlci5tb2RlbFJlbW92ZWQob2xkTW9kZWwpOwotCQkJCX0KLQkJCX0KLQotCQkJdGhpcy5yZXBsYWNlTW9kZWwgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEF0dHJpYnV0ZSgpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUpOwotCQlpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFKSAmJiB0eXBlLmxlbmd0aCgpID4gMCAmJiAhdHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJ0ZXh0L2NzcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSUNTU01vZGVsIGNyZWF0ZU1vZGVsKCkgewotCQlyZXR1cm4gY3JlYXRlTW9kZWwodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElDU1NNb2RlbCBjcmVhdGVNb2RlbChib29sZWFuIGFkZExpc3RlbmVyKSB7Ci0JCWlmICghaXNWYWxpZEF0dHJpYnV0ZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlDU1NNb2RlbCBtb2RlbCA9IHN1cGVyLmNyZWF0ZU1vZGVsKGFkZExpc3RlbmVyKTsKLQotCQlpZiAoIWFkZExpc3RlbmVyKQotCQkJcmV0dXJuIG1vZGVsOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCS8vICBwdWJsaWMgSUNTU01vZGVsIGdldE1vZGVsKCkgewotCS8vICAJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCS8vICAJaWYgKG1vZGVsID09IG51bGwpIHsKLQkvLyAgCQltb2RlbCA9IGNyZWF0ZU1vZGVsKCk7Ci0JLy8gIAkJaWYgKG1vZGVsID09IG51bGwpIHJldHVybiBudWxsOwotCS8vICAJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JLy8gIAkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkvLyAgCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkTW9kZWxDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JLy8gIAkJc2V0TW9kZWwobW9kZWwpOyAvLyBuZWVkIHRvIHNldCBiZWZvcmUgY29udGVudENoYW5nZWQoKQotCS8vICAJCWNvbnRlbnRDaGFuZ2VkKCk7Ci0JLy8gIAl9Ci0JLy8gIAlyZXR1cm4gbW9kZWw7Ci0JLy8gIH0KLQkvKioKLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRSZXF1ZXN0ZXJIMkMoKSB7Ci0JCXJldHVybiAoZ2V0RWxlbWVudCgpICE9IG51bGwgJiYgKChJRE9NTm9kZSkgZ2V0RWxlbWVudCgpKS5nZXRNb2RlbCgpICE9IG51bGwpID8gKE9iamVjdCkgKChJRE9NTm9kZSkgZ2V0RWxlbWVudCgpKS5nZXRNb2RlbCgpIDogdGhpczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRSZXF1ZXN0ZXJDMkgoKSB7Ci0JCXJldHVybiAoZ2V0TW9kZWwoKSAhPSBudWxsKSA/IChPYmplY3QpIGdldE1vZGVsKCkgOiB0aGlzOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGluZyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIncyBtZXRob2QKLQkgKiBFdmVudCBmcm9tIENTUyBGbGF0IE1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgPT0gZ2V0UmVxdWVzdGVySDJDKCkpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKTsKLQkJaWYgKGZsYXROb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGZsYXROb2RlcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50aW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcidzIG1ldGhvZAotCSAqIEV2ZW50IGZyb20gQ1NTIEZsYXQgTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50aW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcidzIG1ldGhvZAotCSAqIEV2ZW50IGZyb20gQ1NTIEZsYXQgTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSA9PSBnZXRSZXF1ZXN0ZXJIMkMoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGV2ZW50LmdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGV2ZW50LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPT0gbnVsbCAmJiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGluZyBJTm9kZUFkYXB0ZXIncyBtZXRob2QKLQkgKiBFdmVudCBmcm9tIDxTVFlMRT4gZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAodGhpcy5pZ25vcmVOb3RpZmljYXRpb24pCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCB8fCBldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUgfHwgZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEKSB7Ci0JCQljb250ZW50Q2hhbmdlZCgpOwotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkgewotCQkJQXR0ciBhdHRyID0gKEF0dHIpIGNoYW5nZWRGZWF0dXJlOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgidHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnJlcGxhY2VNb2RlbCA9IHRydWU7Ci0KLQkJCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlIVE1MRG9jdW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSAoSFRNTERvY3VtZW50QWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXIuY2hpbGRSZXBsYWNlZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGluZyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIncyBtZXRob2QKLQkgKiBFdmVudCBmcm9tIENTUyBGbGF0IE1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IGdldFJlcXVlc3RlckgyQygpKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50aW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcidzIG1ldGhvZAotCSAqIEV2ZW50IGZyb20gQ1NTIEZsYXQgTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IGdldFJlcXVlc3RlckgyQygpKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQXBwbHkgY2hhbmdlcyBmcm9tIENTUyBzdWItbW9kZWwgdG8gSFRNTCBtb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCByZXBsYWNlRGF0YShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgZGF0YSkgewotCQlJRE9NTm9kZSBlbGVtZW50ID0gKElET01Ob2RlKSBnZXRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Nb2RlbCBvd25lck1vZGVsID0gZWxlbWVudC5nZXRNb2RlbCgpOwotCQlpZiAob3duZXJNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG93bmVyTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IGNvbnRlbnRPZmZzZXQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCWRhdGEgPSAiIjsvLyROT04tTkxTLTEkCi0KLQkJdGhpcy5pZ25vcmVOb3RpZmljYXRpb24gPSB0cnVlOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoZ2V0UmVxdWVzdGVyQzJIKCksIGNvbnRlbnRPZmZzZXQgKyBvZmZzZXQsIGxlbmd0aCwgZGF0YSk7Ci0JCXRoaXMuaWdub3JlTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUHJlcGFyYXRpb24gb2YgYXBwbHlpbmcgY2hhbmdlcyBmcm9tIENTUyBzdWItbW9kZWwgdG8gSFRNTCBtb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gMDsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCkgewotCQkJaW50IGNvdW50ID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKTsKLQkJCWlmIChjb3VudCA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0ID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKDApOwotCQkJCWlmIChmaXJzdCAhPSBudWxsKQotCQkJCQlvZmZzZXQgPSBmaXJzdC5nZXRTdGFydCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbShjb3VudCAtIDEpOwotCQkJCWlmIChsYXN0ICE9IG51bGwpCi0JCQkJCWxlbmd0aCA9IGxhc3QuZ2V0RW5kKCkgLSBvZmZzZXQ7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGRhdGEgPSBudWxsOwotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlpbnQgY291bnQgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpOwotCQkJaWYgKGNvdW50ID4gMCkgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oaSk7Ci0JCQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dCgpKTsKLQkJCQkJaWYgKGkgPT0gMCkKLQkJCQkJCW9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCQkJfQotCQkJCWRhdGEgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCXJlcGxhY2VEYXRhKG9mZnNldCwgbGVuZ3RoLCBkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbChJQ1NTTW9kZWwgbW9kZWwpIHsKLQkJc2V0TW9kZWwobW9kZWwsIHRydWUpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGVsKElDU1NNb2RlbCBtb2RlbCwgYm9vbGVhbiBzZXR1cExpc3RlbmVyKSB7Ci0JCUlDU1NNb2RlbCBvbGRNb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG9sZE1vZGVsKQotCQkJcmV0dXJuOwotCQlzdXBlci5zZXRNb2RlbChtb2RlbCk7Ci0JCWlmICghc2V0dXBMaXN0ZW5lcikKLQkJCXJldHVybjsKLQkJaWYgKG9sZE1vZGVsICE9IG51bGwpCi0JCQlvbGRNb2RlbC5yZW1vdmVTdHlsZUxpc3RlbmVyKHRoaXMpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCW1vZGVsLmFkZFN0eWxlTGlzdGVuZXIodGhpcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRjNmQ1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3R5bGVMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHN0eWxlQ2hhbmdlZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvVVJMSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9VUkxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg1NTllMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9VUkxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgCi0gKi8KLXB1YmxpYyBjbGFzcyBVUkxIZWxwZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5VUkxIZWxwZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGJhc2VVcmwKLQkgKi8KLQlwdWJsaWMgVVJMSGVscGVyKFN0cmluZyBiYXNlVXJsKSB7Ci0JCXN1cGVyKGJhc2VVcmwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlVXJsCi0JICogQHBhcmFtIGRvY1Jvb3QKLQkgKi8KLQlwdWJsaWMgVVJMSGVscGVyKFN0cmluZyBiYXNlVXJsLCBTdHJpbmcgZG9jUm9vdCkgewotCQlzdXBlcihiYXNlVXJsLCBkb2NSb290KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1VSTE1vZGVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1VSTE1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxYjExOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9VUkxNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUFscmVhZHlFeGlzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5QYXRoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlByb2plY3RSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8vIFRPRE8gd2hlbiB0aGlzIGNsYXNzIGlzIHJlbW92ZWQgZnJvbSAuY29yZSwgUGF0aEhlbHBlciBhbmQgVVJMSGVscGVyIGNsYXNzCi0vLyBhbHNvIGNhbiBiZSByZW1vdmVkLgotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFVSTE1vZGVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9NT0RFTF9GT1JfUkVBRCA9IDE7Ci0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9ORVdfTU9ERUxfRk9SX1JFQUQgPSAyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfTU9ERUxfRk9SX0VESVQgPSAzOwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfTkVXX01PREVMX0ZPUl9FRElUID0gNDsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9CVUZGRVJfU0laRSA9IDQwOTY7Ci0JLy8gSU1vZGVsTWFuYWdlcgotCXByaXZhdGUgSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIFVSTE1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy8gb2J0YWluIG1vZGVsIG1hbmFnZXIKLQkJbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgSUQgZnJvbSBhIGZpbGVuYW1lLiBUaGlzIG11c3QgYmUgc2FtZSBhcwotCSAqIEZpbGVNb2RlbFByb3ZpZGVyLmNhbGN1bGF0ZUlkKElGaWxlKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjYWxjdWxhdGVJZChJUGF0aCBmdWxsSVBhdGgpIHsKLQkJcmV0dXJuIGZ1bGxJUGF0aC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRDb21tb25Nb2RlbEZvcihmaW5hbCBJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgZmluYWwgU3RyaW5nIHJlZiwgZmluYWwgaW50IHdoaWNoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBmaXJzdCwgY3JlYXRlIGFic29sdXRlIHVybAotCQlTdHJpbmcgYWJzVVJMID0gcmVzb2x2ZVVSSShiYXNlTW9kZWwsIHJlZiwgdHJ1ZSk7Ci0JCWlmICgoYWJzVVJMID09IG51bGwpIHx8IChhYnNVUkwubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gbmVlZCB0byByZW1vdmUgZmlsZTovLyBzY2hlbWUgaWYgbmVjZXNzYXJ5Ci0JCXRyeSB7Ci0JCQlmaW5hbCBqYXZhLm5ldC5VUkwgYVVSTCA9IG5ldyBqYXZhLm5ldC5VUkwoYWJzVVJMKTsKLQkJCS8vIEFuIGFjdHVhbCBVUkwgd2FzIGdpdmVuLCBvbmx5IGZpbGU6Ly8vIGlzIHN1cHBvcnRlZAotCQkJLy8gcmVzb2x2ZSBpdCBieSBmaW5kaW5nIHRoZSBmaWxlIGl0IHBvaW50cyB0bwotCQkJaWYgKCFhVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJwbGF0Zm9ybSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYVVSTC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpICYmIChhVVJMLmdldEhvc3QoKS5lcXVhbHMoImxvY2FsaG9zdCIpIHx8IGFVUkwuZ2V0SG9zdCgpLmxlbmd0aCgpID09IDApKSB7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJYWJzVVJMID0gYVVSTC5nZXRGaWxlKCk7Ci0JCQkJCWZpbmFsIElQYXRoIGlwYXRoID0gbmV3IFBhdGgoYWJzVVJMKTsKLQkJCQkJLy8gIGlmIHBhdGggaGFzIGEgZGV2aWNlLCBhbmQgaWYgaXQgYmVnaW5zIHdpdGgKLQkJCQkJLy8gSVBhdGguU0VQQVJBVE9SLCByZW1vdmUgaXQKLQkJCQkJZmluYWwgU3RyaW5nIGRldmljZSA9IGlwYXRoLmdldERldmljZSgpOwotCQkJCQlpZiAoKGRldmljZSAhPSBudWxsKSAmJiAoZGV2aWNlLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCWlmIChkZXZpY2UuY2hhckF0KDApID09IElQYXRoLlNFUEFSQVRPUikgewotCQkJCQkJCWZpbmFsIFN0cmluZyBuZXdEZXZpY2UgPSBkZXZpY2Uuc3Vic3RyaW5nKDEpOwotCQkJCQkJCWFic1VSTCA9IGlwYXRoLnNldERldmljZShuZXdEZXZpY2UpLnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1mdUV4YykgewotCQl9Ci0KLQotCQkvLyBuZXh0LCBkZWNpZGUgcHJvamVjdAotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJZmluYWwgSVBhdGggZnVsbElQYXRoID0gbmV3IFBhdGgoYWJzVVJMKTsKLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSB3b3Jrc3BhY2UuZ2V0Q29udGFpbmVyRm9yTG9jYXRpb24oZnVsbElQYXRoKTsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkvLyBmdWxsSVBhdGggZG9lc24ndCBleGlzdCBpbiB3b3Jrc3BhY2UKLQkJCXByb2plY3QgPSBjb250YWluZXIuZ2V0UHJvamVjdCgpOwotCQl9Ci0KLQkJLy8gSWYgSFRNTCBkb2N1bWVudCBoYXMgYSBsaW5rIHRvIGFuIGV4dGVybiBDU1Mgd2hpY2ggaXMgbm90IGluCi0JCS8vIElQcm9qZWN0Ci0JCS8vIHdvcmtzcGFjZS5nZXRDb250YWluZXJGb3JMb2F0aW9uKCkgbWF5IHJldHVybiBudWxsLiBXZSBuZWVkIHRvIHRha2UKLQkJLy8gY2FyZQotCQkvLyBvZiB0aGlzIGNhc2UKLQotCQkvLyBub3csIGdldCBhYnNVUkwncyBJRmlsZQotCQlpZiAoKHByb2plY3QgIT0gbnVsbCkgJiYgKHByb2plY3QuZ2V0TG9jYXRpb24oKS5pc1ByZWZpeE9mKGZ1bGxJUGF0aCkgPT0gZmFsc2UpKSB7Ci0JCQkvLyBpdCdzIGF0IG91dHNpZGUgb2YgUHJvamVjdAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJSVBhdGggZmlsZVBhdGggPSBmdWxsSVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhwcm9qZWN0LmdldExvY2F0aW9uKCkuc2VnbWVudENvdW50KCkpOwotCQkJSUZpbGUgZmlsZSA9IChmaWxlUGF0aCAhPSBudWxsICYmICFmaWxlUGF0aC5pc0VtcHR5KCkpID8gcHJvamVjdC5nZXRGaWxlKGZpbGVQYXRoKSA6IG51bGw7Ci0JCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCS8vIG9idGFpbiBtb2RlbAotCQkJaWYgKHdoaWNoID09IEdFVF9NT0RFTF9GT1JfRURJVCkgewotCQkJCW1vZGVsID0gZ2V0TW9kZWxGb3JFZGl0KGZpbGUpOwotCQkJfQotCQkJZWxzZSBpZiAod2hpY2ggPT0gR0VUX01PREVMX0ZPUl9SRUFEKSB7Ci0JCQkJbW9kZWwgPSBnZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0JCQl9Ci0KLQkJCS8vIHNldHRpbmcgc3luY2hyb25pemF0aW9uIHN0YW1wIGlzIElNb2RlbE1hbmFnZXIncyBjbGllbnQncwotCQkJLy8gcmVzcG9uc2liaWxpdHkKLQkJCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldFN5bmNocm9uaXphdGlvblN0YW1wKCkgPT0gSVJlc291cmNlLk5VTExfU1RBTVApCi0JCQkJbW9kZWwucmVzZXRTeW5jaHJvbml6YXRpb25TdGFtcChmaWxlKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBpZCA9IG51bGw7Ci0JCQlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG51bGw7Ci0JCQkvLyBvYnRhaW4gcmVzb2x2ZXIKLQkJCVVSSVJlc29sdmVyIHJlc29sdmVyID0gKHByb2plY3QgIT0gbnVsbCkgPyAoVVJJUmVzb2x2ZXIpIHByb2plY3QuZ2V0QWRhcHRlcihVUklSZXNvbHZlci5jbGFzcykgOiBudWxsOwotCQkJaWYgKHJlc29sdmVyID09IG51bGwpIHsKLQkJCQkvLyBQcm9qZWN0UmVzb2x2ZXIgY2FuIHRha2UgY2FyZSBvZiB0aGUgY2FzZSBpZiBwcm9qZWN0IGlzCi0JCQkJLy8gbnVsbC4KLQkJCQlyZXNvbHZlciA9IG5ldyBQcm9qZWN0UmVzb2x2ZXIocHJvamVjdCk7Ci0JCQl9Ci0JCQlpZiAocmVzb2x2ZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyB0aGVyZSBpcyBubyBwcm9qZWN0LiB3ZSBjYW4ndCBleHBlY3QgSVByb2plY3QgaGVscCB0byBjcmVhdGUKLQkJCS8vIGlkL2lucHV0U3RyZWFtCi0JCQlqYXZhLmlvLkZpbGUgZmlsZSA9IGZ1bGxJUGF0aC50b0ZpbGUoKTsKLQotCQkJLy8gb2JhdGluIGlkCi0JCQlpZCA9IGNhbGN1bGF0ZUlkKGZ1bGxJUGF0aCk7Ci0KLQkJCS8vIG9idGFpbiBJbnB1dFN0cmVhbQotCQkJdHJ5IHsKLQkJCQlpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQl9Ci0JCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLQkJCQkvLyB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgb3Igd2UgZG9uJ3QgaGF2ZSByZWFkIHBlcm1pc3Npb24KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gb2J0YWluIG1vZGVsCi0JCQl0cnkgewotCQkJCWlmICh3aGljaCA9PSBHRVRfTU9ERUxfRk9SX0VESVQpIHsKLQkJCQkJbW9kZWwgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoaWQsIGluU3RyZWFtLCByZXNvbHZlcik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHdoaWNoID09IEdFVF9NT0RFTF9GT1JfUkVBRCkgewotCQkJCQltb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChpZCwgaW5TdHJlYW0sIHJlc29sdmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZSkgewotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy8gY2xvc2Ugbm93ICEKLQkJCQlpZiAoaW5TdHJlYW0gIT0gbnVsbCkgewotCQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0KLQkJLy8gc2V0IGxvY2F0aW9uaWQKLQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkgPT0gbnVsbCkgewotCQkJbW9kZWwuc2V0QmFzZUxvY2F0aW9uKGZ1bGxJUGF0aC50b1N0cmluZygpKTsKLQkJfQotCi0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5iYXNlTW9kZWw8L2NvZGU+OiB0aGUgbW9kZWwgY29udGFpbmluZyB0aGUgbGluawotCSAqIDxjb2RlPnJlZjwvY29kZT46IHRoZSBsaW5rIFVSTCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIFN0cmluZyByZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRDb21tb25Nb2RlbEZvcihiYXNlTW9kZWwsIHJlZiwgR0VUX01PREVMX0ZPUl9FRElUKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0KLQkJLy8gY3JlYXRlIGEgZmFrZSBJbnB1dFN0cmVhbQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvckVkaXQoZmlsZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBleCkgewotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JFZGl0KGZpbGUsIEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+YmFzZU1vZGVsPC9jb2RlPjogdGhlIG1vZGVsIGNvbnRhaW5pbmcgdGhlIGxpbmsKLQkgKiA8Y29kZT5yZWY8L2NvZGU+OiB0aGUgbGluayBVUkwgc3RyaW5nCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsLCBTdHJpbmcgcmVmKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q29tbW9uTW9kZWxGb3IoYmFzZU1vZGVsLCByZWYsIEdFVF9NT0RFTF9GT1JfUkVBRCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCi0JCS8vIGNyZWF0ZSBhIGZha2UgSW5wdXRTdHJlYW0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZXgpIHsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChmaWxlLCBFbmNvZGluZ1J1bGUuRk9SQ0VfREVGQVVMVCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0JCXJldHVybiBtb2RlbE1hbmFnZXI7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlKSB7Ci0JCWlmIChpRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IG1hbmFnZXIuZ2V0TmV3TW9kZWxGb3JFZGl0KGlGaWxlLCBmYWxzZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlSW5Vc2Ugcml1KSB7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlQWxyZWFkeUV4aXN0cyByYWUpIHsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUpIHsKLQkJaWYgKGlGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXROZXdNb2RlbEZvckVkaXQoaUZpbGUsIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VJblVzZSByaXUpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VBbHJlYWR5RXhpc3RzIHJhZSkgewotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY2hlY2sgdGhlIG1vZGVsIGlzIEhUTUwgZmFtaWx5IG9yIG5vdAotCSAqLwotCXN0YXRpYyBwcml2YXRlIGJvb2xlYW4gaXNIVE1MRmFtaWx5KElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJcmV0dXJuIGFkYXB0ZXIuaGFzRmVhdHVyZShIVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzLkhUTUwpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5iYXNlTW9kZWw8L2NvZGU+OiB0aGUgbW9kZWwgY29udGFpbmluZyB0aGUgbGluawotCSAqIDxjb2RlPnJlZjwvY29kZT46IHRoZSBsaW5rIFVSTCBzdHJpbmcKLQkgKiA8Y29kZT5yZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3M8L2NvZGU+OiBJZiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MKLQkgKiBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHByb3Blcmx5IHJlc29sdmUgdGhlIFVSSSBpZiBpdCBpcwotCSAqIGEgdmFsaWQgVVJJIHBvaW50aW5nIHRvIGFub3RoZXIgKGFwcHJvcHJpYXRlKSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVVUkkoSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIFN0cmluZyByZWYsIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCWlmIChiYXNlTW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBmb3IgSFRNTCwgJ2hyZWYnIGF0dHJpYnV0ZSB2YWx1ZSBvZiBCQVNFIGVsZW1lbnQKLQkJLy8gc2hvdWxkIGJlIHVzZWQsIGlmIGV4aXN0cyBhbnkKLQkJU3RyaW5nIGJhc2VIcmVmID0gbnVsbDsKLQkJLy8gZG13X1RPRE8gbmVlZHMgdG8gYmUgY2hhbmdlZCB0byBoYW5kbGUgYSBjb250ZW50IG1vZGVsCi0JCS8vIG9mIEhUTUwgb3IgWEhUTUwKLQkJaWYgKGlzSFRNTEZhbWlseShiYXNlTW9kZWwpKSB7Ci0JCQlmaW5hbCBJRE9NTW9kZWwgeG1sbW9kZWwgPSAoSURPTU1vZGVsKSBiYXNlTW9kZWw7Ci0JCQlmaW5hbCBJRE9NRG9jdW1lbnQgZG9jID0geG1sbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCS8vIGxvb2sgZm9yIDxCQVNFPiB3LyBocmVmCi0JCQlmaW5hbCBOb2RlTGlzdCBubCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQkFTRSIpOy8vJE5PTi1OTFMtMSQKLQkJCWlmICgobmwgIT0gbnVsbCkgJiYgKG5sLmdldExlbmd0aCgpID4gMCkpIHsKLQkJCQkvLyBwZXIgZWFjaCA8QkFTRT4KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJZmluYWwgTm9kZSBiYXNlTm9kZSA9IG5sLml0ZW0oaSk7Ci0JCQkJCWlmIChiYXNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBnZXQgYWxsIGF0dHJzCi0JCQkJCQlmaW5hbCBOYW1lZE5vZGVNYXAgYXR0ck5vZGVzID0gYmFzZU5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJaWYgKGF0dHJOb2RlcyAhPSBudWxsKSB7Ci0JCQkJCQkJZmluYWwgTm9kZSBhdHRyTm9kZSA9IGF0dHJOb2Rlcy5nZXROYW1lZEl0ZW0oIkhSRUYiKTsvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKGF0dHJOb2RlICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gZm91bmQgaHJlZj0iIgotCQkJCQkJCQlmaW5hbCBTdHJpbmcgYXR0clZhbHVlID0gYXR0ck5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCQkJYmFzZUhyZWYgPSBhdHRyVmFsdWUudHJpbSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIHdoYXQgaWYgdGhlcmUgYXJlIG11bHRpcGxlIDxCQVNFPiB0YWdzID8/Ci0JCQkJCWlmIChiYXNlSHJlZiAhPSBudWxsKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGdldCByZXNvbHZlciBpbiBNb2RlbAotCQlmaW5hbCBVUklSZXNvbHZlciByZXNvbHZlciA9IGJhc2VNb2RlbC5nZXRSZXNvbHZlcigpOwotCi0JCS8vIHJlc29sdmUgdG8gYWJzb2x1dGUgdXJsCi0JCWZpbmFsIFN0cmluZyBhYnN1cmwgPSAocmVzb2x2ZXIgIT0gbnVsbCkgPyAoKGJhc2VIcmVmICE9IG51bGwpID8gcmVzb2x2ZXIuZ2V0TG9jYXRpb25CeVVSSShyZWYsIGJhc2VIcmVmLCByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIDogcmVzb2x2ZXIuZ2V0TG9jYXRpb25CeVVSSShyZWYsIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcykpIDogbnVsbDsKLQkJaWYgKChyZXNvbHZlciAhPSBudWxsKSAmJiAoYWJzdXJsID09IG51bGwpICYmIChyZWYgIT0gbnVsbCkgJiYgKHJlZi50cmltKCkubGVuZ3RoKCkgPiAwKSAmJiAocmVmLnRyaW0oKS5jaGFyQXQoMCkgPT0gJy8nKSkgewotCQkJLy8gdG8gcmVhY2ggaGVyZSBtZWFucyA6Ci0JCQkvLyAgICByZWYgaXMgYSBEb2Nyb290IHJlbGF0aXZlCi0JCQkvLyAgICByZXNvbHZlciBjYW4ndCByZXNvbHZlIHJlZgotCQkJLy8gc28gdGhhdCBocmVmIGlzIGEgYnJva2VuIGFuZCBzaG91bGQgbm90IGNyZWF0ZSBtb2RlbAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKChhYnN1cmwgIT0gbnVsbCkgJiYgKGFic3VybC5sZW5ndGgoKSA+IDApKSB7Ci0JCQlyZXR1cm4gYWJzdXJsOwotCQl9Ci0KLQkJLy8gbWF5YmUgcmVmIGlzIGF0IG91dHNpZGUgb2YgdGhlIFByb2plY3QKLQkJLy8gb2J0YWluIGRvY3Jvb3Q7Ci0JCWZpbmFsIElDb250YWluZXIgY29udGFpbmVyID0gKHJlc29sdmVyICE9IG51bGwpID8gcmVzb2x2ZXIuZ2V0Um9vdExvY2F0aW9uKCkgOiBudWxsOwotCQlTdHJpbmcgZG9jcm9vdCA9IG51bGw7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJSVBhdGggY29udGFpbmVyTG9jYXRpb24gPSBjb250YWluZXIuZ2V0TG9jYXRpb24oKTsKLQkJCWlmIChjb250YWluZXJMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJZG9jcm9vdCA9IGNvbnRhaW5lckxvY2F0aW9uLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjb250YWluZXIuZ2V0TG9jYXRpb25VUkkoKSAhPSBudWxsKSB7Ci0JCQkJZG9jcm9vdCA9IGNvbnRhaW5lci5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGRvY3Jvb3QgPT0gbnVsbCkgewotCQkJZG9jcm9vdCA9IGJhc2VNb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJfQotCQlpZiAoZG9jcm9vdCA9PSBudWxsKSB7Ci0JCQkvLyBzaG91bGQgbm90IGJlCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIG9idGFpbiBkb2N1bWVudCB1cmwKLQkJU3RyaW5nIG1vZGVsQmFzZUxvY2F0aW9uID0gYmFzZU1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAoKG1vZGVsQmFzZUxvY2F0aW9uID09IG51bGwpIHx8IChtb2RlbEJhc2VMb2NhdGlvbi5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZmFsbGJhY2suLi4KLQkJCW1vZGVsQmFzZUxvY2F0aW9uID0gYmFzZU1vZGVsLmdldElkKCk7Ci0JCX0KLQkJaWYgKChtb2RlbEJhc2VMb2NhdGlvbiA9PSBudWxsKSB8fCAobW9kZWxCYXNlTG9jYXRpb24ubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGkgY2FuJ3QgcmVzb2x2ZSB1cmkgIQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyByZXNvbHZlIHVybAotCQlVUkxIZWxwZXIgaGVscGVyID0gbmV3IFVSTEhlbHBlcihQYXRoSGVscGVyLmdldENvbnRhaW5pbmdGb2xkZXJQYXRoKG1vZGVsQmFzZUxvY2F0aW9uKSwgUGF0aEhlbHBlci5nZXRDb250YWluaW5nRm9sZGVyUGF0aChQYXRoSGVscGVyLmFwcGVuZFRyYWlsaW5nVVJMU2xhc2goZG9jcm9vdCkpKTsKLQkJcmV0dXJuIGhlbHBlci50b0Fic29sdXRlKHJlZik7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjlmZmI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTZWxlY3RvckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzcy5IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzcy5TdHlsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1RhZ1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50Lk1vZGVsUGFyc2VyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRIVE1MIGltcGxlbWVudHMgRW1iZWRkZWRUeXBlSGFuZGxlciB7Ci0KLQlwdWJsaWMgU3RyaW5nIENvbnRlbnRUeXBlSURfRW1iZWRkZWRIVE1MID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW1iZWRkZWRIVE1MIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgTGlzdCBzdXBwb3J0ZWRNaW1lVHlwZXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRW1iZWRkZWRIVE1MLgotCSAqLwotCXB1YmxpYyBFbWJlZGRlZEhUTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGFkZCB0YWcgbmFtZXMgdXNpbmcgQmxvY2tNYXJrZXIgb2JqZWN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEhUTUxpc2hUYWcoQmxvY2tUYWdQYXJzZXIgcGFyc2VyLCBTdHJpbmcgdGFnbmFtZSkgewotCQlCbG9ja01hcmtlciBibSA9IG5ldyBCbG9ja01hcmtlcih0YWduYW1lLCBudWxsLCBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQsIGZhbHNlKTsKLQkJcGFyc2VyLmFkZEJsb2NrTWFya2VyKGJtKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEVtYmVkZGVkQ29udGVudFR5cGUjZ2V0RmFtaWx5SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmFtaWx5SWQoKSB7Ci0JCXJldHVybiBNb2RlbEhhbmRsZXJGb3JIVE1MLkFzc29jaWF0ZWRDb250ZW50VHlwZUlEOwotCX0KLQotCS8qCi0JICogT25seSAibW9kZWwgc2lkZSIgZW1iZWRkZWQgZmFjdG9yaWVzIGNhbiBiZSBhZGRlZCBoZXJlLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUwoKSk7Ci0JCS8vIGZhY3Rvcmllcy5hZGRBbGwoUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0RmFjdG9yaWVzKHRoaXMpKTsKLQkJcmV0dXJuIGZhY3RvcmllczsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRW1iZWRkZWRDb250ZW50VHlwZSNpbml0aWFsaXplUGFyc2VyKFJlZ2lvblBhcnNlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFyc2VyKFJlZ2lvblBhcnNlciBwYXJzZXIpIHsKLQkJaWYgKHBhcnNlciBpbnN0YW5jZW9mIEJsb2NrVGFnUGFyc2VyKSB7Ci0JCQlhZGRIVE1MaXNoVGFnKChCbG9ja1RhZ1BhcnNlcikgcGFyc2VyLCAic2NyaXB0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWFkZEhUTUxpc2hUYWcoKEJsb2NrVGFnUGFyc2VyKSBwYXJzZXIsICJzdHlsZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRTdXBwb3J0ZWRNaW1lVHlwZXMoKSB7Ci0JCWlmIChzdXBwb3J0ZWRNaW1lVHlwZXMgPT0gbnVsbCkgewotCQkJc3VwcG9ydGVkTWltZVR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJc3VwcG9ydGVkTWltZVR5cGVzLmFkZCgidGV4dC9odG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN1cHBvcnRlZE1pbWVUeXBlcy5hZGQoInRleHQveGh0bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3VwcG9ydGVkTWltZVR5cGVzLmFkZCgiYXBwbGljYXRpb24veGh0bWwreG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN1cHBvcnRlZE1pbWVUeXBlcy5hZGQoInRleHQvdm5kLndhcC53bWwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzdXBwb3J0ZWRNaW1lVHlwZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChyZWdpc3RyeSk7Ci0KLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKCFyZWdpc3RyeS5jb250YWlucyhEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKSkgewotCQkJZmFjdG9yeSA9IG5ldyBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkoKTsKLQkJCXJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQkJaWYgKCFyZWdpc3RyeS5jb250YWlucyhNb2RlbFBhcnNlckFkYXB0ZXIuY2xhc3MpKSB7Ci0JCQlmYWN0b3J5ID0gSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJCXJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQkJaWYgKCFyZWdpc3RyeS5jb250YWlucyhJU3R5bGVTZWxlY3RvckFkYXB0ZXIuY2xhc3MpKSB7Ci0KLQkJCWZhY3RvcnkgPSBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCQlyZWdpc3RyeS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JCWlmICghcmVnaXN0cnkuY29udGFpbnMoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKSkgewotCi0JCQlmYWN0b3J5ID0gU3R5bGVBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQkJcmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgdW5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KEZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKHJlZ2lzdHJ5KTsKLQotCQkvLyBJU1NVRTogc2hvdWxkIHRoZXNlIGZhY3RvcmllcyBiZSByZWxlYXNlZD8gT3IganVzdCAKLQkJLy8gcmVtb3ZlZCBmcm9tIHRoaXMgcmVnaXN0cnksIGJlY2F1c2Ugd2UgYXJlIGdldHRpbmcgcmVhZHkgdG8KLQkJLy8gcmUtYWRkIHRoZW0/Ci0JCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCWlmICghcmVnaXN0cnkuY29udGFpbnMoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcykpIHsKLQkJCWZhY3RvcnkgPSByZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQkJZmFjdG9yeS5yZWxlYXNlKCk7Ci0JCQlyZWdpc3RyeS5yZW1vdmVGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JCWlmICghcmVnaXN0cnkuY29udGFpbnMoTW9kZWxQYXJzZXJBZGFwdGVyLmNsYXNzKSkgewotCQkJZmFjdG9yeSA9IHJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoTW9kZWxQYXJzZXJBZGFwdGVyLmNsYXNzKTsKLQkJCWZhY3RvcnkucmVsZWFzZSgpOwotCQkJcmVnaXN0cnkucmVtb3ZlRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zKElTdHlsZVNlbGVjdG9yQWRhcHRlci5jbGFzcykpIHsKLQkJCWZhY3RvcnkgPSByZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKElTdHlsZVNlbGVjdG9yQWRhcHRlci5jbGFzcyk7Ci0JCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJCXJlZ2lzdHJ5LnJlbW92ZUZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQkJaWYgKCFyZWdpc3RyeS5jb250YWlucyhJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpKSB7Ci0JCQlmYWN0b3J5ID0gcmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQkJZmFjdG9yeS5yZWxlYXNlKCk7Ci0JCQlyZWdpc3RyeS5yZW1vdmVGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluaXRpYWxpemVQYXJzZXIoUmVnaW9uUGFyc2VyIHBhcnNlcikgewotCQkvLyBJJ20gYXNzdW1pbmcgYmxvY2sgbWFya2VycyBhcmUgdW5pcXVlIGJhc2VkIG9uIG5hbWUgb25seQotCQkvLyB3ZSBhZGQgdGhlc2UgYXMgZnVsbCBCbG9ja01hcmtlcnMsIGJ1dCByZW1vdmUgYmFzZWQgb24gbmFtZSBhbG9uZS4KLQkJaWYgKHBhcnNlciBpbnN0YW5jZW9mIEJsb2NrVGFnUGFyc2VyKSB7Ci0JCQkoKEJsb2NrVGFnUGFyc2VyKSBwYXJzZXIpLnJlbW92ZUJsb2NrTWFya2VyKCJzdHlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQkoKEJsb2NrVGFnUGFyc2VyKSBwYXJzZXIpLnJlbW92ZUJsb2NrTWFya2VyKCJzY3JpcHQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgRW1iZWRkZWRIVE1MKCk7Ci0JfQotCi0JLyoqCi0JICogd2lsbCBzb21lZGF5IGJlIGNvbnRyb2xsZWQgdmlhIGV4dGVuc2lvbiBwb2ludAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7Ci0JCXJldHVybiBnZXRTdXBwb3J0ZWRNaW1lVHlwZXMoKS5jb250YWlucyhtaW1lVHlwZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY5YmFkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSFRNTERvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSFRNTERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSFRNTE1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJGb3JIVE1MIGV4dGVuZHMgQWJzdHJhY3RNb2RlbEhhbmRsZXIgaW1wbGVtZW50cyBJTW9kZWxIYW5kbGVyIHsKLQkvKiogCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gCi0JICogSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuIGF0IHJ1biB0aW1lIHdpdGggCi0JICogd2hhdCdzIGluIHJlZ2lzdHJ5ISAoc28gc2hvdWxkIG5ldmVyIGJlICdmaW5hbCcpCi0JICovCi0Jc3RhdGljIFN0cmluZyBBc3NvY2lhdGVkQ29udGVudFR5cGVJRCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gCi0JICogSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuIGF0IHJ1biB0aW1lIHdpdGggCi0JICogd2hhdCdzIGluIHJlZ2lzdHJ5ISAoc28gc2hvdWxkIG5ldmVyIGJlICdmaW5hbCcpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1vZGVsSGFuZGxlcklEX0hUTUwgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5tb2RlbGhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0KLQotCXB1YmxpYyBNb2RlbEhhbmRsZXJGb3JIVE1MKCkgewotCQlzdXBlcigpOwotCQlzZXRJZChNb2RlbEhhbmRsZXJJRF9IVE1MKTsKLQkJc2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQpOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgZ2V0TW9kZWxMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgSFRNTE1vZGVsTG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlyZXR1cm4gbmV3IEhUTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgSFRNTERvY3VtZW50TG9hZGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uQnVkZHlTeXN0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNQXR0cmlidXRlRGVjbGFyYXRpb25CdWRkeVN5c3RlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGI2MDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNQXR0cmlidXRlRGVjbGFyYXRpb25CdWRkeVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICovCi1jbGFzcyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uQnVkZHlTeXN0ZW0gZXh0ZW5kcyBDTU5vZGVCdWRkeVN5c3RlbSBpbXBsZW1lbnRzIENNQXR0cmlidXRlRGVjbGFyYXRpb24gewotCi0KLQlwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtKENNQXR0cmlidXRlRGVjbGFyYXRpb24gc2VsZiwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBidWRkeSwgYm9vbGVhbiBpc1hIVE1MKSB7Ci0JCXN1cGVyKHNlbGYsIGJ1ZGR5LCBpc1hIVE1MKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiNnZXRBdHRyTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyTmFtZSgpIHsKLQkJcmV0dXJuIGdldFNlbGYoKS5nZXRBdHRyTmFtZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uI2dldEF0dHJUeXBlKCkKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpIHsKLQkJcmV0dXJuIGdldFNlbGYoKS5nZXRBdHRyVHlwZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uI2dldERlZmF1bHRWYWx1ZSgpCi0JICogQGRlcHJlY2F0ZWQgaW4gc3VwZXJjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gZ2V0U2VsZigpLmdldERlZmF1bHRWYWx1ZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uI2dldEVudW1BdHRyKCkKLQkgKiBAZGVwcmVjYXRlZCBpbiBzdXBlcmNsYXNzCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGdldEVudW1BdHRyKCkgewotCQlyZXR1cm4gZ2V0U2VsZigpLmdldEVudW1BdHRyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNQXR0cmlidXRlRGVjbGFyYXRpb24jZ2V0VXNhZ2UoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VXNhZ2UoKSB7Ci0JCXJldHVybiBnZXRTZWxmKCkuZ2V0VXNhZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0U2VsZigpIHsKLQkJcmV0dXJuIChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBzZWxmOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRGb3JCdWRkeVN5c3RlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01Eb2N1bWVudEZvckJ1ZGR5U3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MTBlYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01Eb2N1bWVudEZvckJ1ZGR5U3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5zc2kuU1NJQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Eb2NUeXBlOwotCi0vKioKLSAqLwotY2xhc3MgQ01Eb2N1bWVudEZvckJ1ZGR5U3lzdGVtIGV4dGVuZHMgQ01Ob2RlQnVkZHlTeXN0ZW0gaW1wbGVtZW50cyBDTURvY3VtZW50IHsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgQ01Eb2N1bWVudCBnZXRIVE1MQ01Eb2N1bWVudCgpIHsKLQkJcmV0dXJuIEhUTUxDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5IVE1MX0RPQ19UWVBFKTsKLQl9Ci0KLQljbGFzcyBFbGVtZW50cyBleHRlbmRzIENNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0gewotCQlwdWJsaWMgRWxlbWVudHMoQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMsIGJvb2xlYW4gaXNYSFRNTCkgewotCQkJc3VwZXIoaXNYSFRNTCk7Ci0JCQltYWtlQnVkZHlTeXN0ZW0oZWxlbWVudHMpOwotCQkJYWRkU1NJRGVjbHMoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5TmFtZShDTU5vZGUgb3JpZ2luYWwpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0RGVjbChvcmlnaW5hbCk7Ci0JCQlpZiAoZWRlY2wgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBlZGVjbC5nZXRFbGVtZW50TmFtZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIENNTm9kZSBjcmVhdGVCdWRkeVN5c3RlbShDTU5vZGUgb3JpZ2luYWwpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0RGVjbChvcmlnaW5hbCk7Ci0JCQlyZXR1cm4gbmV3IENNRWxlbWVudERlY2xhcmF0aW9uQnVkZHlTeXN0ZW0oZWRlY2wsIGlzWEhUTUwoKSk7Ci0JCX0KLQotCQlwcml2YXRlIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlY2woQ01Ob2RlIGNtbm9kZSkgewotCQkJaWYgKGNtbm9kZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpICE9IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChDTUVsZW1lbnREZWNsYXJhdGlvbikgY21ub2RlOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZFNTSURlY2xzKCkgewotCQkJQ01Eb2N1bWVudCBzc2kgPSBTU0lDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KCk7Ci0JCQlpZiAoc3NpID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBzc2kuZ2V0RWxlbWVudHMoKTsKLQkJCUl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJcHV0KGRlY2wuZ2V0RWxlbWVudE5hbWUoKSwgZGVjbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEVsZW1lbnRzIGVsZW1lbnRzID0gbnVsbDsKLQotCXB1YmxpYyBDTURvY3VtZW50Rm9yQnVkZHlTeXN0ZW0oQ01Eb2N1bWVudCBzZWxmLCBib29sZWFuIGlzWEhUTUwpIHsKLQkJc3VwZXIoc2VsZiwgZ2V0SFRNTENNRG9jdW1lbnQoKSwgaXNYSFRNTCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRG9jdW1lbnQjZ2V0RWxlbWVudHMoKQotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpIHsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpCi0JCQlyZXR1cm4gZWxlbWVudHM7Ci0JCUNNRG9jdW1lbnQgY21kb2MgPSBnZXRTZWxmKCk7Ci0JCWlmIChjbWRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsZW1lbnRzID0gbmV3IEVsZW1lbnRzKGNtZG9jLmdldEVsZW1lbnRzKCksIGlzWEhUTUwpOwotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRG9jdW1lbnQjZ2V0RW50aXRpZXMoKQotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJQ01Eb2N1bWVudCBjbWRvYyA9IGdldFNlbGYoKTsKLQkJaWYgKGNtZG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGNtZG9jLmdldEVudGl0aWVzKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRG9jdW1lbnQjZ2V0TmFtZXNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQlDTURvY3VtZW50IGNtZG9jID0gZ2V0U2VsZigpOwotCQlpZiAoY21kb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY21kb2MuZ2V0TmFtZXNwYWNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBDTURvY3VtZW50IGdldFNlbGYoKSB7Ci0JCWlmIChzZWxmLmdldE5vZGVUeXBlKCkgIT0gQ01Ob2RlLkRPQ1VNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01Eb2N1bWVudCkgc2VsZjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTUVsZW1lbnREZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTUVsZW1lbnREZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MzRkYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01FbGVtZW50RGVjbGFyYXRpb25CdWRkeVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Eb2NUeXBlOwotCi0vKioKLSAqLwotY2xhc3MgQ01FbGVtZW50RGVjbGFyYXRpb25CdWRkeVN5c3RlbSBleHRlbmRzIENNTm9kZUJ1ZGR5U3lzdGVtIGltcGxlbWVudHMgQ01FbGVtZW50RGVjbGFyYXRpb24gewotCi0KLQlwcml2YXRlIHN0YXRpYyBDTURvY3VtZW50IGh0bWxjbSA9IEhUTUxDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5IVE1MX0RPQ19UWVBFKTsKLQotCXByaXZhdGUgc3RhdGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldEhUTUxDTUVsZW1EZWNsKENNRWxlbWVudERlY2xhcmF0aW9uIG9yaWdpbmFsKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGJ1ZGR5ID0gbnVsbDsKLQkJaWYgKGh0bWxjbSAhPSBudWxsKSB7Ci0JCQlDTU5hbWVkTm9kZU1hcCBlbGVtcyA9IGh0bWxjbS5nZXRFbGVtZW50cygpOwotCQkJaWYgKGVsZW1zICE9IG51bGwpIHsKLQkJCQlidWRkeSA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgZWxlbXMuZ2V0TmFtZWRJdGVtKG9yaWdpbmFsLmdldEVsZW1lbnROYW1lKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWRkeTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEF0dHJzIGV4dGVuZHMgQ01OYW1lZE5vZGVNYXBGb3JCdWRkeVN5c3RlbSB7Ci0JCXByaXZhdGUgQ01OYW1lZE5vZGVNYXAgYnVkZHlBdHRycyA9IG51bGw7Ci0KLQkJcHVibGljIEF0dHJzKENNTmFtZWROb2RlTWFwIGF0dHJzLCBDTU5hbWVkTm9kZU1hcCBidWRkeUF0dHJzLCBib29sZWFuIGlzWEhUTUwpIHsKLQkJCXN1cGVyKGlzWEhUTUwpOwotCQkJdGhpcy5idWRkeUF0dHJzID0gYnVkZHlBdHRyczsKLQkJCW1ha2VCdWRkeVN5c3RlbShhdHRycyk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEtleU5hbWUoQ01Ob2RlIG9yaWdpbmFsKSB7Ci0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkZWNsID0gZ2V0RGVjbChvcmlnaW5hbCk7Ci0JCQlpZiAoYWRlY2wgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBhZGVjbC5nZXRBdHRyTmFtZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIENNTm9kZSBjcmVhdGVCdWRkeVN5c3RlbShDTU5vZGUgb3JpZ2luYWwpIHsKLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlY2wgPSBnZXREZWNsKG9yaWdpbmFsKTsKLQkJCWlmIChhZGVjbCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBidWRkeSA9IG51bGw7Ci0JCQlpZiAoYnVkZHlBdHRycyAhPSBudWxsKSB7Ci0JCQkJYnVkZHkgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYnVkZHlBdHRycy5nZXROYW1lZEl0ZW0oYWRlY2wuZ2V0QXR0ck5hbWUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IENNQXR0cmlidXRlRGVjbGFyYXRpb25CdWRkeVN5c3RlbShhZGVjbCwgYnVkZHksIGlzWEhUTUwoKSk7Ci0JCX0KLQotCQlwcml2YXRlIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0RGVjbChDTU5vZGUgY21ub2RlKSB7Ci0JCQlpZiAoY21ub2RlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgIT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21ub2RlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBBdHRycyBhdHRyaWJ1dGVzID0gbnVsbDsKLQotCXB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtKENNRWxlbWVudERlY2xhcmF0aW9uIHNlbGYsIGJvb2xlYW4gaXNYSFRNTCkgewotCQlzdXBlcihzZWxmLCBnZXRIVE1MQ01FbGVtRGVjbChzZWxmKSwgaXNYSFRNTCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRWxlbWVudERlY2xhcmF0aW9uI2dldEF0dHJpYnV0ZXMoKQotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0U2VsZigpOwotCQlpZiAoZWRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBodG1sRGVjbCA9IGdldEJ1ZGR5KCk7Ci0JCUNNTmFtZWROb2RlTWFwIGh0bWxBdHRycyA9IChodG1sRGVjbCA9PSBudWxsKSA/IG51bGwgOiBodG1sRGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWF0dHJpYnV0ZXMgPSBuZXcgQXR0cnMoZWRlY2wuZ2V0QXR0cmlidXRlcygpLCBodG1sQXR0cnMsIGlzWEhUTUwpOwotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01FbGVtZW50RGVjbGFyYXRpb24jZ2V0Q29udGVudCgpCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCA9IGdldFNlbGYoKTsKLQkJaWYgKGVkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGVkZWNsLmdldENvbnRlbnQoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01FbGVtZW50RGVjbGFyYXRpb24jZ2V0Q29udGVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0U2VsZigpOwotCQlpZiAoZWRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlk7Ci0JCXJldHVybiBlZGVjbC5nZXRDb250ZW50VHlwZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUVsZW1lbnREZWNsYXJhdGlvbiNnZXRFbGVtZW50TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBlZGVjbC5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUVsZW1lbnREZWNsYXJhdGlvbiNnZXREYXRhVHlwZSgpCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0U2VsZigpOwotCQlpZiAoZWRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZWRlY2wuZ2V0RGF0YVR5cGUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01FbGVtZW50RGVjbGFyYXRpb24jZ2V0TG9jYWxFbGVtZW50cygpCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0U2VsZigpOwotCQlpZiAoZWRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZWRlY2wuZ2V0TG9jYWxFbGVtZW50cygpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUNvbnRlbnQjZ2V0TWF4T2NjdXIoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0U2VsZigpOwotCQlpZiAoZWRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJcmV0dXJuIGVkZWNsLmdldE1heE9jY3VyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNQ29udGVudCNnZXRNaW5PY2N1cigpCi0JICovCi0JcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gZWRlY2wuZ2V0TWluT2NjdXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01Ob2RlI3N1cHBvcnRzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChpc1hIVE1MICYmIHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBzdXBlci5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5vZGUjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoaXNYSFRNTCAmJiBwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKSkKLQkJCXJldHVybiBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX05PTkU7Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByaXZhdGUgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0U2VsZigpIHsKLQkJaWYgKHNlbGYuZ2V0Tm9kZVR5cGUoKSAhPSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKENNRWxlbWVudERlY2xhcmF0aW9uKSBzZWxmOwotCX0KLQotCXByaXZhdGUgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0QnVkZHkoKSB7Ci0JCWlmIChidWRkeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChidWRkeS5nZXROb2RlVHlwZSgpICE9IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGJ1ZGR5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI1ODRiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTU5hbWVkTm9kZU1hcEZvckJ1ZGR5U3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICovCi1hYnN0cmFjdCBjbGFzcyBDTU5hbWVkTm9kZU1hcEZvckJ1ZGR5U3lzdGVtIGltcGxlbWVudHMgQ01OYW1lZE5vZGVNYXAgewotCi0KLQlwcml2YXRlIGJvb2xlYW4gaXNYSFRNTCA9IGZhbHNlOwotCXByaXZhdGUgSGFzaHRhYmxlIG1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIG9mIENNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0uCi0JICogQ0FVVElPTjogRWFjaCBkZXJpdmVkIGNsYXNzIG11c3QgY2FsbCAnbWFrZUJ1ZGR5U3lzdGVtJyBtZXRob2QgaW4gaXRzCi0JICogY29uc3RydWN0b3IgdG8gYnVpbGQgdXAgaXRzIGNvbnRlbnRzLgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcEZvckJ1ZGR5U3lzdGVtKGJvb2xlYW4gaXNYSFRNTCkgewotCQlzdXBlcigpOwotCQl0aGlzLmlzWEhUTUwgPSBpc1hIVE1MOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5hbWVkTm9kZU1hcCNnZXRMZW5ndGgoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbWFwLnNpemUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01OYW1lZE5vZGVNYXAjZ2V0TmFtZWRJdGVtKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcga2V5ID0gY2Fub25pY2FsTmFtZShuYW1lKTsKLQkJaWYgKCFtYXAuY29udGFpbnNLZXkoa2V5KSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKENNTm9kZSkgbWFwLmdldChrZXkpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5hbWVkTm9kZU1hcCNpdGVtKGludCkKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBub2RlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoLS1pbmRleCA8IDApCi0JCQkJcmV0dXJuIChDTU5vZGUpIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTmFtZWROb2RlTWFwI2l0ZXJhdG9yKCkKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBtYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKiBwYWNrYWdlIHNjb3BlLiAqLwotCXZvaWQgcHV0KFN0cmluZyBuYW1lLCBDTU5vZGUgY21ub2RlKSB7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgY21ub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1hcC5wdXQoY2Fub25pY2FsTmFtZShuYW1lKSwgY21ub2RlKTsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIGdldEtleU5hbWUoQ01Ob2RlIG9yaWdpbmFsKTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBDTU5vZGUgY3JlYXRlQnVkZHlTeXN0ZW0oQ01Ob2RlIG9yaWdpbmFsKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzWEhUTUwoKSB7Ci0JCXJldHVybiBpc1hIVE1MOwotCX0KLQotCS8qKgotCSAqIEVhY2ggZGVyaXZlZCBjbGFzcyBtdXN0IGNhbGwgdGhpcyBtZXRob2QgaW4gaXRzIGNvbnN0cnVjdG9yCi0JICogdG8gYnVpbGQgdXAgaXRzIGNvbnRlbnRzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1ha2VCdWRkeVN5c3RlbShDTU5hbWVkTm9kZU1hcCBvcmlnaW5hbCkgewotCQlJdGVyYXRvciBpID0gb3JpZ2luYWwuaXRlcmF0b3IoKTsKLQkJaWYgKGkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDTU5vZGUgb3JnID0gKENNTm9kZSkgaS5uZXh0KCk7Ci0JCQlTdHJpbmcga2V5ID0gZ2V0S2V5TmFtZShvcmcpOwotCQkJQ01Ob2RlIG5ld05vZGUgPSBjcmVhdGVCdWRkeVN5c3RlbShvcmcpOwotCQkJcHV0KGtleSwgbmV3Tm9kZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjYW5vbmljYWxOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxOTE4Ci0JCS8vIHdlIGFyZSBhYmxlIHRvICJjaGVhdCIgaGVyZSBhIGxpdHRsZSBhbmQgdXNlIFVTIExvY2FsZQotCQkvLyB0byBnZXQgYSBnb29kIGNhbm9uaWNhbCBmb3JtLCBzaW5jZSB3ZSBhcmUgdXNpbmcgdGhpcyBvbmx5Ci0JCS8vIGZvciBIVE1MIGFuZCBKU1Agc3RhbmRhcmQgdGFncy4KLQkJLy8gTG9uZyB0ZXJtLCBmb3Igc2ltaWxhciBuZWVkcyB3aXRoIFhNTCAxLjEgKGZvciBleGFtcGxlKQotCQkvLyB3ZSBzaG91bGQgdXNlIGEgY2xhc3Mgc3VjaCBhcyBjb20uaWJtLmljdS50ZXh0Lk5vcm1hbGl6ZXIKLQkJcmV0dXJuIG5hbWUudG9VcHBlckNhc2UoTG9jYWxlLlVTKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTU5vZGVCdWRkeVN5c3RlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01Ob2RlQnVkZHlTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4MmY5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTU5vZGVCdWRkeVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKi8KLWNsYXNzIENNTm9kZUJ1ZGR5U3lzdGVtIGltcGxlbWVudHMgQ01Ob2RlIHsKLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNYSFRNTCA9IGZhbHNlOwotCXByb3RlY3RlZCBDTU5vZGUgc2VsZiA9IG51bGw7Ci0JcHJvdGVjdGVkIENNTm9kZSBidWRkeSA9IG51bGw7Ci0KLQlwdWJsaWMgQ01Ob2RlQnVkZHlTeXN0ZW0oQ01Ob2RlIHNlbGYsIENNTm9kZSBidWRkeSwgYm9vbGVhbiBpc1hIVE1MKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2VsZiA9IHNlbGY7Ci0JCXRoaXMuYnVkZHkgPSBidWRkeTsKLQkJdGhpcy5pc1hIVE1MID0gaXNYSFRNTDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01Ob2RlI2dldE5vZGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gc2VsZi5nZXROb2RlTmFtZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5vZGUjZ2V0Tm9kZVR5cGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBzZWxmLmdldE5vZGVUeXBlKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTm9kZSNzdXBwb3J0cyhTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGJ1ZGR5ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBidWRkeS5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5vZGUjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbighaXNYSFRNTCk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihpc1hIVE1MKTsKLQkJfQotCi0JCWlmIChidWRkeSA9PSBudWxsIHx8ICghYnVkZHkuc3VwcG9ydHMocHJvcGVydHlOYW1lKSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGJ1ZGR5LmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvRG9jdW1lbnRRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvRG9jdW1lbnRRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDgwMmQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0RvY3VtZW50UXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5yYW5nZXMuUmFuZ2U7Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50UXVlcnkgewotCi0JLyoqCi0JICogaXNSZW5kZXJSb290KCkgcmV0dXJucyB0cnVlIGlmIC0gbm9kZSBpcyBCT0RZIGVsZW1lbnQgKGJvdGggZXhwbGljaXQKLQkgKiBhbmQgaW1wbGljaXQpIC0gbm9kZSBpcyBwb3J0YWxodG1sOmJvZHkgZWxlbWVudCAtIG5vZGUgaXMgRG9jdW1lbnQgbm9kZQotCSAqIGFuZCB0aGUgZG9jdW1lbnQgaXMgdHJlYXRlZCBhcyBmcmFnbWVudCAod2l0aCBCT0RZIGNvbnRleHQpIE5vdGUgdGhhdAotCSAqIGluIGVkaXRpbmcgYSBmcmFnbWVudCBmaWxlLCBEb2N1bWVudCBub2RlIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEKLQkgKiBzdWJzdGl0dXRlIG9mIEJPRFkgZWxlbWVudC4KLQkgKi8KLQlib29sZWFuIGlzUmVuZGVyUm9vdChOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogaXNIZWFkQ29ycmVzcG9uZGVudCgpIHJldHVybnMgdHJ1ZSBpZiAtIG5vZGUgaXMgSEVBRCBlbGVtZW50IChib3RoCi0JICogZXhwbGljaXQgYW5kIGltcGxpY2l0KSAtIG5vZGUgaXMgcG9ydGFsaHRtbDpoZWFkIGVsZW1lbnQgLSBub2RlIGlzCi0JICogRG9jdW1lbnQgbm9kZSBhbmQgdGhlIGRvY3VtZW50IGlzIHRyZWF0ZWQgYXMgZnJhZ21lbnQgKHdpdGggSEVBRAotCSAqIGNvbnRleHQpIE5vdGUgdGhhdCBpbiBlZGl0aW5nIGEgZnJhZ21lbnQgZmlsZSAod2l0aCBIRUFEIGNvbnRleHQpLAotCSAqIERvY3VtZW50IG5vZGUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBzdWJzdGl0dXRlIG9mIEhFQUQgZWxlbWVudC4KLQkgKi8KLQlib29sZWFuIGlzSGVhZENvcnJlc3BvbmRlbnQoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIEltcGxpY2l0IEJPRFkgZWxlbWVudCB3aWxsIGJlIGdvbmUgaW4gVjYgU0VEIG1vZGVsLiBTbyBwYWdlIGRlc2lnbmVyCi0JICogcHJvdmlkZXMgYW4gQVBJIHRvIGdldCBhIHJhbmdlIHdob3NlIGNvbnRlbnQgbm9kZXMgYXJlIHJlbmRlcmVkIGluCi0JICogZGVzaWduIHZpZXcuIGdldFJlbmRlclJvb3RSYW5nZSgpIHJldHVybnMgLSBhIHJhbmdlIGZyb20gQk9EWSdzIGZpcnN0Ci0JICogdG8gaXRzIGxhc3QgKGlmIHRoZSBkb2N1bWVudCBoYXMgQk9EWSBlbGVtZW50KSAtIGEgcmFuZ2UgZm9ybQotCSAqIERvY3VtZW50J3MgZmlyc3QgdG8gaXRzIGxhc3QgKGlmIHRoZSBkb2N1bWVudCBpcyBmcmFnbWVudCB3aXRoIEJPRFkKLQkgKiBjb250ZXh0KSAtIG51bGwgKGlmIHRoZSBkb2N1bWVudCBpcyBmcmFnbWVudCB3aXRoIEhFQUQgY29udGV4dCkgW1RoZQotCSAqIGZvbGxvd2luZyBjYXNlcyB3aWxsIGJlIHN1cHBvcnRlZCBzaW5jZSBWNl0gLSBhIHJhbmdlIGZyb20gYSBjdXN0b20KLQkgKiB0YWcncyBmaXJzdCB0byBpdHMgbGFzdCAoaWYgdGhlIGRvY3VtZW50IGhhcyBhIGN1c3RvbSB0YWcgd2hpY2gKLQkgKiBnZW5lcmF0ZXMgQk9EWSBlbGVtZW50IGF0IHJ1bnRpbWUpIC0gYSByYW5nZSBmcm9tIERvY3VtZW50J3MKLQkgKiBhcHByb3BpcmF0ZSBvZmZzZXQgdG8gaXRzIGxhc3QgKGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBoYXZlIGV4cGxpY2l0Ci0JICogQk9EWS9IVE1MKSAtIGEgcmFuZ2UgZnJvbSBIVE1MIGVsZW1lbnQncyBhcHByb3ByaWF0ZSBvZmZzZXQgdG8gaXRzIGxhc3QKLQkgKiAoaWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUgZXhwbGljaXQgQk9EWSBidXQgaGF2ZSBleHBsaWNpdCBIVE1MKQotCSAqIAotCSAqIEBwYXJhbSBkb2MKLQkgKiBAcmV0dXJuCi0JICovCi0JUmFuZ2UgZ2V0UmVuZGVyUm9vdFJhbmdlKERvY3VtZW50IGRvYyk7Ci0KLQkvKioKLQkgKiBJbXBsaWNpdCBIRUFEIGVsZW1lbnQgd2lsbCBiZSBnb25lIGluIFY2IFNFRCBtb2RlbC4gU28gcGFnZSBkZXNpZ25lcgotCSAqIHByb3ZpZGVzIGFuIEFQSSB0byBnZXQgYSByYW5nZSB3aG9zZSBjb250ZW50IG5vZGVzIGFyZSB0cmVhdGVkIGFzIEhFQUQKLQkgKiBlbGVtZW50J3MgY2hpbGQuIGdldEhlYWRDb3JyZXNwb25kZW50UmFuZ2UoKSByZXR1cm5zIC0gYSByYW5nZSBmcm9tCi0JICogSEVBRCdzIGZpcnN0IHRvIGl0cyBsYXN0IChpZiB0aGUgZG9jdW1lbnQgaGFzIEhFQUQgZWxlbWVudCkgLSBhIHJhbmdlCi0JICogZm9ybSBEb2N1bWVudCdzIGZpcnN0IHRvIGl0cyBsYXN0IChpZiB0aGUgZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aAotCSAqIEhFQUQgY29udGV4dCkgLSBudWxsIChpZiB0aGUgZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBCT0RZIGNvbnRleHQpCi0JICogW1RoZSBmb2xsb3dpbmcgY2FzZXMgd2lsbCBiZSBzdXBwb3J0ZWQgc2luY2UgVjZdIC0gYSByYW5nZSBmcm9tIGEKLQkgKiBjdXN0b20gdGFnJ3MgZmlyc3QgdG8gaXRzIGxhc3QgKGlmIHRoZSBkb2N1bWVudCBoYXMgYSBjdXN0b20gdGFnIHdoaWNoCi0JICogZ2VuZXJhdGVzIEhFQUQgZWxlbWVudCBhdCBydW50aW1lKSAtIGEgcmFuZ2UgZnJvbSBEb2N1bWVudCdzIGZpcnN0IHRvCi0JICogYXBwcm9waXJhdGUgb2Zmc2V0IChpZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZSBleHBsaWNpdCBIRUFEL0hUTUwpIC0KLQkgKiBhIHJhbmdlIGZyb20gSFRNTCBlbGVtZW50J3MgZmlyc3QgdG8gYXBwcm9wcmlhdGUgb2Zmc2V0IChpZiB0aGUKLQkgKiBkb2N1bWVudCBkb2VzIG5vdCBoYXZlIGV4cGxpY2l0IEhFQUQgYnV0IGhhdmUgZXhwbGljaXQgSFRNTCkKLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICogQHJldHVybgotCSAqLwotCVJhbmdlIGdldEhlYWRDb3JyZXNwb25kZW50UmFuZ2UoRG9jdW1lbnQgZG9jKTsKLQotCS8qKgotCSAqIGdldFJlbmRlclJvb3ROb2RlKCkgd2l0aCBbY3JlYXRlPWZhbHNlXSByZXR1cm5zIC0gQk9EWSBlbGVtZW50IGlmIHRoaXMKLQkgKiBkb2N1bWVudCBpcyBub3QgZnJhZ21lbnQgYW5kIGhhcyBCT0RZIGVsZW1lbnQgLSBudWxsIGlmIHRoaXMgZG9jdW1lbnQKLQkgKiBpcyBub3QgZnJhZ21lbnQgYW5kIGRvZXMgbm90IGhhdmUgQk9EWSBlbGVtZW50IC0gRG9jdW1lbnQgbm9kZSBpZiB0aGlzCi0JICogZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBCT0RZIGNvbnRleHQgLSBudWxsIGlmIHRoaXMgZG9jdW1lbnQgaXMKLQkgKiBmcmFnbWVudCB3aXRoIEhFQUQgY29udGV4dCBbVGhlIGZvbGxvd2luZyBjYXNlcyB3aWxsIGJlIHN1cHBvcnRlZCBzaW5jZQotCSAqIFY2XSAtIGEgY3VzdG9tIHRhZyB3aGljaCBnZW5lcmF0ZXMgQk9EWSB0YWcgYXQgcnVudGltZSAtIERvY3VtZW50IG5vZGUKLQkgKiBvciBIVE1MIGVsZW1lbnQgaWYgdGhpcyBkb2N1bWVudCBpcyBub3QgZnJhZ21lbnQgYnV0IGRvZXMgbm90IGhhdmUKLQkgKiBleHBsaWNpdCBCT0RZIGVsZW1lbnQgZ2V0UmVuZGVyUm9vdE5vZGUoKSB3aXRoIFtjcmVhdGU9dHJ1ZV0gcmV0dXJucyAtCi0JICogQk9EWSBlbGVtZW50IGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGFuZCBoYXMgQk9EWSBlbGVtZW50IChubwotCSAqIG1vZGlmaWN0YXRpb24pIC0gbmV3bHkgY3JlYXRlZCBCT0RZIGVsZW1lbnQgaWYgdGhpcyBkb2N1bWVudCBpcyBub3QKLQkgKiBmcmFnbWVudCBidXQgZG9lcyBub3QgaGF2ZSBCT0RZIGVsZW1lbnQgLSBEb2N1bWVudCBub2RlIGlmIHRoaXMKLQkgKiBkb2N1bWVudCBpcyBmcmFnbWVudCB3aXRoIEJPRFkgY29udGV4dCAobm8gbW9kaWZpY3RhdGlvbikgW1RoZQotCSAqIGZvbGxvd2luZyBjYXNlcyB3aWxsIGJlIHN1cHBvcnRlZCBzaW5jZSBWNl0gLSBhIGN1c3RvbSB0YWcgd2hpY2gKLQkgKiBnZW5lcmF0ZXMgQk9EWSB0YWcgYXQgcnVudGltZSAobm8gbW9kaWZpY3RhdGlvbikgLSBuZXdseSBjcmVhdGVkIEJPRFkKLQkgKiBlbGVtZW50IGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGJ1dCBkb2VzIG5vdCBoYXZlIGV4cGxpY2l0Ci0JICogQk9EWSBlbGVtZW50IGdldFJlbmRlclJvb3ROb2RlKCkgdGhyb3dzIEhUTUxDb21tYW5kRXhjZXB0aW9uIChzaW5jZSBWNikKLQkgKiBpZiAtIHRoaXMgZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBIRUFEIGNvbnRleHQgYW5kIC0gImNyZWF0ZSIKLQkgKiBwYXJhbWV0ZXIgaXMgdHJ1ZSBOb3RlIHRoYXQgaW4gZWRpdGluZyBhIGZyYWdtZW50IGZpbGUsIERvY3VtZW50IG5vZGUKLQkgKiBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHN1YnN0aXR1dGUgb2YgQk9EWSBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBjaGlsZE9yRG9jdW1lbnQKLQkgKiBAcGFyYW0gY3JlYXRlCi0JICogQHJldHVybgotCSAqLwotCU5vZGUgZ2V0UmVuZGVyUm9vdE5vZGUoTm9kZSBjaGlsZE9yRG9jdW1lbnQsIGJvb2xlYW4gY3JlYXRlKTsKLQotCS8qKgotCSAqIGdldEhlYWRDb3JyZXNwb25kZW50Tm9kZSgpIHdpdGggW2NyZWF0ZT1mYWxzZV0gcmV0dXJucyAtIEhFQUQgZWxlbWVudAotCSAqIGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGFuZCBoYXMgSEVBRCBlbGVtZW50IC0gbnVsbCBpZiB0aGlzCi0JICogZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGFuZCBkb2VzIG5vdCBoYXZlIEhFQUQgZWxlbWVudCAtIERvY3VtZW50IG5vZGUKLQkgKiBpZiB0aGlzIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggSEVBRCBjb250ZXh0IC0gbnVsbCBpZiB0aGlzIGRvY3VtZW50Ci0JICogaXMgZnJhZ21lbnQgd2l0aCBCT0RZIGNvbnRleHQgW1RoZSBmb2xsb3dpbmcgY2FzZXMgd2lsbCBiZSBzdXBwb3J0ZWQKLQkgKiBzaW5jZSBWNl0gLSBhIGN1c3RvbSB0YWcgd2hpY2ggZ2VuZXJhdGVzIEhFQUQgdGFnIGF0IHJ1bnRpbWUgLSBEb2N1bWVudAotCSAqIG5vZGUgb3IgSFRNTCBlbGVtZW50IGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGJ1dCBkb2VzIG5vdCBoYXZlCi0JICogZXhwbGljaXQgSEVBRCBlbGVtZW50IGdldEhlYWRDb3JyZXNwb25kZW50Tm9kZSgpIHdpdGggW2NyZWF0ZT10cnVlXQotCSAqIHJldHVybnMgLSBIRUFEIGVsZW1lbnQgaWYgdGhpcyBkb2N1bWVudCBpcyBub3QgZnJhZ21lbnQgYW5kIGhhcyBIRUFECi0JICogZWxlbWVudCAobm8gbW9kaWZpY3RhdGlvbikgLSBuZXdseSBjcmVhdGVkIEhFQUQgZWxlbWVudCBpZiB0aGlzCi0JICogZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGJ1dCBkb2VzIG5vdCBoYXZlIEhFQUQgZWxlbWVudCAtIERvY3VtZW50IG5vZGUKLQkgKiBpZiB0aGlzIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggSEVBRCBjb250ZXh0IChubyBtb2RpZmljdGF0aW9uKSBbVGhlCi0JICogZm9sbG93aW5nIGNhc2VzIHdpbGwgYmUgc3VwcG9ydGVkIHNpbmNlIFY2XSAtIGEgY3VzdG9tIHRhZyB3aGljaAotCSAqIGdlbmVyYXRlcyBIRUFEIHRhZyBhdCBydW50aW1lIChubyBtb2RpZmljdGF0aW9uKSAtIG5ld2x5IGNyZWF0ZWQgSEVBRAotCSAqIGVsZW1lbnQgaWYgdGhpcyBkb2N1bWVudCBpcyBub3QgZnJhZ21lbnQgYnV0IGRvZXMgbm90IGhhdmUgZXhwbGljaXQKLQkgKiBIRUFEIGVsZW1lbnQgZ2V0SGVhZENvcnJlc3BvbmRlbnROb2RlKCkgdGhyb3dzIEhUTUxDb21tYW5kRXhjZXB0aW9uCi0JICogKHNpbmNlIFY2KSBpZiAtIHRoaXMgZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBCT0RZIGNvbnRleHQgYW5kIC0KLQkgKiAiY3JlYXRlIiBwYXJhbWV0ZXIgaXMgdHJ1ZSBOb3RlIHRoYXQgaW4gZWRpdGluZyBhIGZyYWdtZW50IGZpbGUsCi0JICogRG9jdW1lbnQgbm9kZSBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHN1YnN0aXR1dGUgb2YgSEVBRCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBjaGlsZE9yRG9jdW1lbnQKLQkgKiBAcGFyYW0gY3JlYXRlCi0JICogQHJldHVybgotCSAqLwotCU5vZGUgZ2V0SGVhZENvcnJlc3BvbmRlbnROb2RlKE5vZGUgY2hpbGRPckRvY3VtZW50LCBib29sZWFuIGNyZWF0ZSk7Ci0KLQkvKioKLQkgKiBnZXRIdG1sQ29ycmVzcG9uZGVudE5vZGUoKSB0aHJvd3MgSFRNTENvbW1hbmRFeGNlcHRpb24gKHNpbmNlIFY2KSBpZiAtCi0JICogdGhpcyBkb2N1bWVudCBpcyBmcmFnbWVudCBhbmQgImNyZWF0ZSIgcGFyYW1ldGVyIGlzIHRydWUKLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRPckRvY3VtZW50Ci0JICogQHBhcmFtIGNyZWF0ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlOb2RlIGdldEh0bWxDb3JyZXNwb25kZW50Tm9kZShOb2RlIGNoaWxkT3JEb2N1bWVudCwgYm9vbGVhbiBjcmVhdGUpOwotCi0JLyoqCi0JICogVGhpcyBpbm5lciBjbGFzcyBpcyBpbnRlbmRlZCBmb3IgaW5zZXJ0aW9uIHRhcmdldC4gcGxlYXNlIHVzZSB0aGlzIGxpa2UKLQkgKiB0aGUgZm9sbG93aW5nIDogRG9jdW1lbnRRdWVyeS5JbnNlcnRpb25UYXJnZXQgaW5zOwotCSAqIGlucy5nZXRQYXJlbnQoKS5pbnNlcnRCZWZvcmUoeW91SW5zZXJ0aW9uTm9kZSwgaW5zLmdldFJlZigpKTsKLQkgKi8KLQlwdWJsaWMgY2xhc3MgSW5zZXJ0aW9uVGFyZ2V0IHsKLQkJcHJpdmF0ZSBmaW5hbCBOb2RlIHBhcmVudDsKLQkJcHJpdmF0ZSBmaW5hbCBOb2RlIHJlZjsKLQotCQlwdWJsaWMgSW5zZXJ0aW9uVGFyZ2V0KE5vZGUgcGFyZW50LCBOb2RlIHJlZikgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLnJlZiA9IHJlZjsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldFBhcmVudCgpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBnZXRSZWYoKSB7Ci0JCQlyZXR1cm4gcmVmOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0SGVhZEluc2VydGlvblRhcmdldCgpIHJldHVybnMgYXBwcm9wcmlhdGUgaW5zZXRpb24gdGFyZ2V0IGxvY2F0aW9uCi0JICogZm9yIEhFQUQgY2hpbGQgdGFncyBzdWNoIGFzIDxzY3JpcHQ+LCA8c3R5bGU+LCA8bWV0YT5ldGMuIEJhc2ljYWxseQotCSAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyA8SEVBRD50YWcncyB0aGUgbGFzdCBwb3NpdGlvbi4gTm90ZSB0aGF0IHRoaXMKLQkgKiB3b3VsZCBub3QgY3JlYXRlIGFjdHVhbCA8SEVBRD50YWcgd2hlbiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZSBpdC4KLQkgKiA8SEVBRD5pcyBvbWl0dGFibGUgdGFnIHNvIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhcHByb3ByaWF0ZSBwb3NpdGlvbgotCSAqIHRvIHdoaWNoIGltcGxpY2l0IDxIRUFEPmNhbiBiZSBpbnNlcnRlZCwgaWYgdGhlIGRvY3VtZW50IGhhcyBubwotCSAqIDxIRUFEPi4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICogQHJldHVybgotCSAqLwotCUluc2VydGlvblRhcmdldCBnZXRIZWFkSW5zZXJ0aW9uVGFyZ2V0KERvY3VtZW50IGRvYyk7Ci0KLQkvKioKLQkgKiBnZXRQYWdlSW5zZXJ0aW9uVGFyZ2V0KCkgcmV0dXJucyBhcHByb3ByaWF0ZSBpbnNldGlvbiB0YXJnZXQgbG9jYXRpb24KLQkgKiBmb3IgcGFnZS1sZXZlbCBtYXJrdXBzLCBzdWNoIGFzIEpTUCBkaXJlY3RpdmVzLCB1c2ViZWFuIHRhZ3Mgb3IgPGh0bWw+Ci0JICogdGFnLiBCYXNpY2FsbHkgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGp1c3QgYmVmb3JlIDxIVE1MPnRhZy4gTm90ZSB0aGF0Ci0JICogdGhpcyB3b3VsZCBub3QgY3JlYXRlIGFjdHVhbCA8SFRNTD50YWcgd2hlbiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZQotCSAqIGl0LiBJbiBzdWNoIGNhc2UsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvc2l0aW9uIGp1c3QgYmVmb3JlIHRoZQotCSAqIG1lYW5pbmdmdWwgdGFncyBzdWNoIGFzIEhUTUwvSlNQIGVsZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBkb2MKLQkgKiBAcmV0dXJuCi0JICovCi0JSW5zZXJ0aW9uVGFyZ2V0IGdldFBhZ2VJbnNlcnRpb25UYXJnZXQoRG9jdW1lbnQgZG9jKTsKLQotCS8qKgotCSAqIGlzRnJhZ21lbnQoKSByZXR1cm5zIHdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIGZyYWdtZW50IG9yIGNvbXBsZXRlCi0JICogZG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaXNGcmFnbWVudChEb2N1bWVudCBkb2MpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9FbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9FbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZWUyOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICovCi0JQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqLwotCXZvaWQgc2V0RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0VsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NThmYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElOb2RlQWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGFkYXB0KElOb2RlTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlcjsKLQkJYWRhcHRlciA9IG5ldyBIVE1MRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcigpOwotCQlub3RpZmllci5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGluZyBjb3B5IG1ldGhvZAotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hNUVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hNUVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc3YWQwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9ITVFVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGZpbmFsIGNsYXNzIEhNUVV0aWwgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVmVjdG9yIG51bGxWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0KLQkvKiBITVFVdGlsIGNsYXNzIG11c3Qgbm90IGluc3RhbnRpYXRlLiAqLwotCXByaXZhdGUgSE1RVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiBnYXRoZXIgYWxsIGVsZW1lbnQgZGVjbGFyYXRpb25zIGluIGluY2x1c2lvbiBvZiBlYWNoIHBhcmVudCBvZiB0aGUgdGFyZ2V0LiAKLQkgKiB0aGUgaW5jbHVzaW9uIG9mIHRoZSB0YXJnZXQgaXMgYWxzbyBnYXRoZXJlZC4gKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0SW5jbHVzaW9ucyhFbGVtZW50IHRhcmdldCkgewotCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbFZlY3RvcjsKLQkJQ29sbGVjdGlvbiBpbmNsdXNpb25zID0gZ2F0aGVySW5jbHVzaW9ucyhnZXRBbmNlc3RvckRlY2xhcmF0aW9ucyh0YXJnZXQpKTsKLQotCQlIYXNodGFibGUgYXZhaWxhYmxlcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGluY2x1c2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlDTUNvbnRlbnQgaW5jbHVzaW9uID0gKENNQ29udGVudCkgaXRlci5uZXh0KCk7Ci0JCQlzd2l0Y2ggKGluY2x1c2lvbi5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJY2FzZSBDTU5vZGUuR1JPVVAgOgotCQkJCQlleHRyYWN0RGVjbGFyYXRpb25zKGF2YWlsYWJsZXMsIChDTUdyb3VwKSBpbmNsdXNpb24pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLQkJCQkJYWRkSW5jbHVzaW9uKGF2YWlsYWJsZXMsIChDTUVsZW1lbnREZWNsYXJhdGlvbikgaW5jbHVzaW9uKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYXZhaWxhYmxlcy52YWx1ZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGdldEFuY2VzdG9yRGVjbGFyYXRpb25zKEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCVZlY3RvciBhbmNlc3RvcnMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJRG9jdW1lbnQgZG9jID0gdGFyZ2V0LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJTW9kZWxRdWVyeSBxdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jKTsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IHF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKHRhcmdldCk7Ci0JCWFuY2VzdG9ycy5hZGQoZGVjbCk7Ci0KLQkJRWxlbWVudCBwYXJlbnQgPSBnZXRQYXJlbnQodGFyZ2V0KTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlkZWNsID0gcXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50KTsKLQkJCWlmIChkZWNsICE9IG51bGwpCi0JCQkJYW5jZXN0b3JzLmFkZChkZWNsKTsKLQkJCXBhcmVudCA9IGdldFBhcmVudChwYXJlbnQpOwotCQl9Ci0JCXJldHVybiBhbmNlc3RvcnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRJbmNsdXNpb24oSGFzaHRhYmxlIGF2YWlsYWJsZXMsIENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJU3RyaW5nIG5hbWUgPSBkZWNsLmdldEVsZW1lbnROYW1lKCk7Ci0JCWlmIChhdmFpbGFibGVzLmNvbnRhaW5zS2V5KG5hbWUpKQotCQkJcmV0dXJuOwotCQlhdmFpbGFibGVzLnB1dChuYW1lLCBkZWNsKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGdhdGhlckluY2x1c2lvbnMoQ29sbGVjdGlvbiBhbmNlc3RvcnMpIHsKLQkJVmVjdG9yIGluY2x1c2lvbnMgPSBuZXcgVmVjdG9yKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBhbmNlc3RvcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmIChkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSU5DTFVTSU9OKSkgewotCQkJCUNNQ29udGVudCBpbmNsdXNpb24gPSAoQ01Db250ZW50KSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSU5DTFVTSU9OKTsKLQkJCQlpZiAoaW5jbHVzaW9uICE9IG51bGwpCi0JCQkJCWluY2x1c2lvbnMuYWRkKGluY2x1c2lvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluY2x1c2lvbnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRWxlbWVudCBnZXRQYXJlbnQoTm9kZSB0YXJnZXQpIHsKLQkJTm9kZSBwYXJlbnQgPSB0YXJnZXQuZ2V0UGFyZW50Tm9kZSgpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlyZXR1cm4gKEVsZW1lbnQpIHBhcmVudDsKLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBleHRyYWN0RGVjbGFyYXRpb25zKEhhc2h0YWJsZSBhdmFpbGFibGVzLCBDTUdyb3VwIGdyb3VwKSB7Ci0JCUNNTm9kZUxpc3QgY29udGVudCA9IGdyb3VwLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUNNTm9kZSBjbW4gPSBjb250ZW50Lml0ZW0oaSk7Ci0JCQlpZiAoY21uID09IG51bGwgfHwgY21uLmdldE5vZGVUeXBlKCkgIT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0JCQkJY29udGludWU7Ci0JCQlhZGRJbmNsdXNpb24oYXZhaWxhYmxlcywgKENNRWxlbWVudERlY2xhcmF0aW9uKSBjbW4pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hUTUxFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZjAyODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBpbXBsZW1lbnRzIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgewotCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUKLQkgKiBhbGxvd3MgaXQgdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMuZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDdmYmJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEhUTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBleHRlbmRzIFNpbXBsZUFzc29jaWF0aW9uUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsUXVlcnlDTVByb3ZpZGVyIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5Q01Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBIVE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXN1cGVyKG5ldyBIVE1MTW9kZWxRdWVyeUNNUHJvdmlkZXIoY2FjaGUsIGlkUmVzb2x2ZXIpKTsKLQl9Ci0KLQkvLyBNSVdBOiBXZSBjYW5ub3QgY2FjaGUgYSBDTUVsZW1lbnREZWNsYXJhdGlvbiBhbnkgbW9yZS4gIEJlY2F1c2UsIHdoZW4gdGhlIERPQ1RZUEUKLQkvLyB3YXMgY2hhbmdlZCwgQ01Eb2N1bWVudCB3b3VsZCBiZSBjaGFuZ2VkLiAgVGhlbiwgYSBjYWNoZWQgQ01FbGVtZW50RGVjbGFyYXRpb24KLQkvLyB3b3VsZCBiZSBpbnZhbGlkLiAgSWYgc29tZSBwZXJmb3JtYW5jZSBwcm9ibGVtcyBvY2N1cnMsIHdlIGNvbnNpZGVyIGEgc21hcnRlcgotCS8vIGNhY2hlIG1lY2hhbmlzbS4KLQkvLwotCS8vCXB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkvLwkJLy8gY2hlY2sgaWYgZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBjYWNoZWQKLQkvLwkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBlbGVtZW50OwotCS8vCQlFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcikgbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCS8vCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCS8vCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0RGVjbGFyYXRpb24oKTsKLQkvLwotCS8vCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gc3VwZXIuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JLy8KLQkvLwkJLy8gY2FjaGUgSFRNTCBlbGVtZW50IGRlY2xhcmF0aW9uIG9ubHkKLQkvLwkJaWYgKGRlY2wgIT0gbnVsbCAmJiBkZWNsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgewotCS8vCQkJSUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCS8vCQkJYWRhcHRlciA9IChFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKSBmYWN0b3J5LmFkYXB0KG5vdGlmaWVyKTsKLQkvLwkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JLy8JCQkJYWRhcHRlci5zZXREZWNsYXJhdGlvbihkZWNsKTsKLQkvLwkJfQotCS8vCi0JLy8JCXJldHVybiBkZWNsOwotCS8vCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTE1vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYzFjZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTE1vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlDTVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDTURvY3VtZW50IHByb3ZpZGVyIGZvciBIVE1MIGFuZCBYSFRNTCBkb2N1bWVudHMuCi0gKiAKLSAqIFRoaXMgYWRkZWQgYW5kL29yIG1hZGUgcHVibGljIHNwZWNpZmljYWxseSBmb3IgZXhwZXJpbWVudGF0aW9uLiBJdCB3aWxsCi0gKiBjaGFuZ2UgYXMgdGhpcyBmdW5jdGlvbmFsaXR5IGJlY29tZXMgQVBJLiBTZWUKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTkwODQKLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBIVE1MTW9kZWxRdWVyeUNNUHJvdmlkZXIgaW1wbGVtZW50cyBNb2RlbFF1ZXJ5Q01Qcm92aWRlciB7Ci0KLQotCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgc3RhdGljSFRNTDUgPSBIVE1MQ01Eb2N1bWVudEZhY3RvcnkuZ2V0Q01Eb2N1bWVudChDTURvY1R5cGUuSFRNTDVfRE9DX1RZUEUpOwotCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgc3RhdGljSFRNTCA9IEhUTUxDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5IVE1MX0RPQ19UWVBFKTsKLQlwcml2YXRlIHN0YXRpYyBDTURvY3VtZW50IHN0YXRpY0NIVE1MID0gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkNIVE1MX0RPQ19UWVBFKTsKLQlwcml2YXRlIHN0YXRpYyBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgZG9jdHlwZVJlZ2lzdHJ5ID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGJ1ZGR5Q2FjaGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwcml2YXRlIFhIVE1MQXNzb2NpYXRpb25Qcm92aWRlciB4aHRtbGFzc29jID0gbnVsbDsKLQotCXB1YmxpYyBIVE1MTW9kZWxRdWVyeUNNUHJvdmlkZXIoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXhodG1sYXNzb2MgPSBuZXcgWEhUTUxBc3NvY2lhdGlvblByb3ZpZGVyKGNhY2hlLCBpZFJlc29sdmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDTURvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIERPTSBOb2RlLiBvciBudWxsIGlmIG5vCi0JICogQ01Eb2N1bWVudCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIERPTSBOb2RlLgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUgbm9kZSkgewotCQlJRE9NRG9jdW1lbnQgb3duZXIgPSBnZXRPd25lclhNTERvY3VtZW50KG5vZGUpOwotCQlpZiAob3duZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBwaWQgPSBnZXRQdWJsaWNJZChvd25lcik7Ci0JCS8vIG5vIFBJRCwgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudGx5LXN1cHBvcnRlZCBIVE1MIHZlcnNpb24KLQkJaWYgKHBpZCA9PSBudWxsIHx8ICIiLmVxdWFscyhwaWQpKXsKLQkJCXJldHVybiBzdGF0aWNIVE1MNTsKLQkJfQotCi0JCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IGRvY3R5cGVSZWdpc3RyeS5nZXRFbnRyeShwaWQpOwotCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCXJldHVybiBzdGF0aWNIVE1MOwotCQkKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTAwMCAtIHVzZSBpbnRlcm5hbCBjb250ZW50IG1vZGVsCi0JCWlmIChlbnRyeS51c2VJbnRlcm5hbE1vZGVsKCkpIHsKLQkJCWlmIChwaWQgIT0gbnVsbCAmJiBwaWQuZXF1YWxzKEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5DSFRNTF9QVUJMSUNfSUQpKSB7Ci0JCQkJcmV0dXJuIHN0YXRpY0NIVE1MOwotCQkJfQotCQkJcmV0dXJuIHN0YXRpY0hUTUw7Ci0JCX0KLQotCQlwaWQgPSBlbnRyeS5nZXRQdWJsaWNJZCgpOwotCQlTdHJpbmcgc2lkID0gZW50cnkuZ2V0U3lzdGVtSWQoKTsKLQotCQlDTURvY3VtZW50IGR0ZGNtID0geGh0bWxhc3NvYy5nZXRYSFRNTENNRG9jdW1lbnQocGlkLCBzaWQpOwotCQlpZiAoZHRkY20gPT0gbnVsbCkgewotCQkJaWYgKHBpZCAhPSBudWxsICYmIHBpZC5lcXVhbHMoSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LkNIVE1MX1BVQkxJQ19JRCkpIHsKLQkJCQlyZXR1cm4gc3RhdGljQ0hUTUw7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RhdGljSFRNTDsKLQkJfQotCi0JCVN0cmluZyBncmFtbWFyVVJJID0geGh0bWxhc3NvYy5nZXRDYWNoZWRHcmFtbWVyVVJJKCk7Ci0JCUNNRG9jdW1lbnQgYnVkZHljbSA9IChDTURvY3VtZW50KSBidWRkeUNhY2hlLmdldChncmFtbWFyVVJJKTsKLQkJaWYgKGJ1ZGR5Y20gIT0gbnVsbCkKLQkJCXJldHVybiBidWRkeWNtOwotCi0JCWJ1ZGR5Y20gPSBuZXcgQ01Eb2N1bWVudEZvckJ1ZGR5U3lzdGVtKGR0ZGNtLCBlbnRyeS5pc1hNTFR5cGUoKSk7Ci0JCWJ1ZGR5Q2FjaGUucHV0KGdyYW1tYXJVUkksIGJ1ZGR5Y20pOwotCQlyZXR1cm4gYnVkZHljbTsKLQl9Ci0KLQkvLyBwcml2YXRlIG1ldGhvZHMKLQlwcml2YXRlIElET01Eb2N1bWVudCBnZXRPd25lclhNTERvY3VtZW50KE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCURvY3VtZW50IG93bmVyID0gKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpID8gKERvY3VtZW50KSBub2RlIDogbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChvd25lciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKG93bmVyIGluc3RhbmNlb2YgSURPTURvY3VtZW50KSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElET01Eb2N1bWVudCkgb3duZXI7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHVibGljSWQoSURPTURvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRG9jdW1lbnRUeXBlIGRvY3R5cGUgPSBkb2MuZ2V0RG9jdHlwZSgpOwotCQkvL2RvY3R5cGUuCi0JCXJldHVybiAoZG9jdHlwZSAhPSBudWxsKSA/IGRvY3R5cGUuZ2V0UHVibGljSWQoKSA6IGRvYy5nZXREb2N1bWVudFR5cGVJZCgpOwotCX0KLQkKLQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2IwMmJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5Nb2RlbFF1ZXJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5LlhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb3ZhYmxlTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhpcyBhZGRlZCBhbmQvb3IgbWFkZSBwdWJsaWMgc3BlY2lmaWNhbGx5IGZvciBleHBlcmltZW50YXRpb24uIEl0Ci0gKiB3aWxsIGNoYW5nZSBhcyB0aGlzIGZ1bmN0aW9uYWxpdHkgYmVjb21lcyBBUEkuIFNlZQotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTA4NAotICovCi0gCi1wdWJsaWMgY2xhc3MgSFRNTE1vZGVsUXVlcnlJbXBsIGV4dGVuZHMgTW9kZWxRdWVyeUltcGwgaW1wbGVtZW50cyBNb3ZhYmxlTW9kZWxRdWVyeSB7Ci0KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudENhY2hlIGZDYWNoZSA9IG51bGw7Ci0JcHJvdGVjdGVkIFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIHhtbEFzc29jUHJvdiA9IG51bGw7Ci0KLQlwdWJsaWMgSFRNTE1vZGVsUXVlcnlJbXBsKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgVVJJUmVzb2x2ZXIgaWRSZXNvbHZlcikgewotCQlzdXBlcihuZXcgSFRNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKGNhY2hlLCBpZFJlc29sdmVyKSk7Ci0JCWZDYWNoZSA9IGNhY2hlOwotCQl4bWxBc3NvY1Byb3YgPSBuZXcgWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIoY2FjaGUsIGlkUmVzb2x2ZXIpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNvbnRlbnQoRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zKSB7Ci0JCUxpc3Qgb3JpZ2luYWxDYW5kaWRhdGVzID0gc3VwZXIuZ2V0QXZhaWxhYmxlQ29udGVudChlbGVtZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMpOwotCQlpZiAoKGluY2x1ZGVPcHRpb25zICYgSU5DTFVERV9DSElMRF9OT0RFUykgPT0gMCkKLQkJCXJldHVybiBvcmlnaW5hbENhbmRpZGF0ZXM7Ci0JCS8vIFdoZW4gdGhlIHRhcmdldCBkb2N1bWVudCBpcyBYSFRNTCwgaXQgaXMgd2FzdGUgdG8gZmluZCBpbmNsdXNpb25zLAotCQkvLyBzaW5jZSBpbmNsdXNpb24gaXMgYXZhaWxhYmxlIGluIEhUTUwgb25seS4KLQkJaWYgKCFlZC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCXJldHVybiBvcmlnaW5hbENhbmRpZGF0ZXM7Ci0JCQotCQlCb29sZWFuIGlzWGh0bWwgPSBCb29sZWFuLkZBTFNFOwotCQlpc1hodG1sID0gKEJvb2xlYW4pIGVkLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpOwotCQlpZiAoaXNYaHRtbCAhPSBudWxsICYmIGlzWGh0bWwuYm9vbGVhblZhbHVlKCkpCi0JCQlyZXR1cm4gb3JpZ2luYWxDYW5kaWRhdGVzOwotCi0JCS8vIE9LLCB0aGUgdGFyZ2V0IGlzIHN1cmVseSBhIEhUTUwgZWxlbWVudCwgc28gaXQgbWF5IGhhdmUgaW5jbHVzaW9uLgotCQkvLyBUcnkgdG8gZmluZCBpdC4KLQkJVmVjdG9yIGNhbmRpZGF0ZXMgPSBuZXcgVmVjdG9yKG9yaWdpbmFsQ2FuZGlkYXRlcyk7Ci0KLQkJc3dpdGNoIChlZC5nZXRDb250ZW50VHlwZSgpKSB7Ci0JCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkFOWSA6Ci0JCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQgOgotCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCA6Ci0JCQkJLy8gZG8gZW51bWVyYXRlIGluY2x1c2lvbnMuCi0JCQkJY2FuZGlkYXRlcy5hZGRBbGwoSE1RVXRpbC5nZXRJbmNsdXNpb25zKGVsZW1lbnQpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkgOgotCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgOgotCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQSA6Ci0JCQlkZWZhdWx0IDoKLQkJCQkvLyBzaG91bGQgbm90IGFkZCBhbnkgaW5jbHVzaW9ucy4KLQkJCQkvLyBzbywgbm90aGluZyB0byBkbyBoZXJlLgotCQkJCWJyZWFrOwotCQl9Ci0JCS8vIElmIHRoZSBjdXJyZW50IGVsZW1lbnQgZG9lcyBub3QgYXZhaWxhYmxlLCBpdCBpcyBpbXBvc3NpYmxlCi0JCS8vIHRvIGZpbHRlciBvdXQgZXhjbHVzaW9uLgotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGNhbmRpZGF0ZXM7Ci0KLQkJLy8gTm93LCB0aGUgdGltZSB0byBjaGVjayBleGNsdXNpb24uCi0JCVZlY3RvciBjb250ZW50ID0gbmV3IFZlY3RvcihjYW5kaWRhdGVzLnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FuZGlkYXRlcy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IGVDYW5kaWRhdGUgPSBjYW5kaWRhdGVzLmVsZW1lbnRBdChpKTsKLQkJCWlmKGVDYW5kaWRhdGUgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGNhbmRpZGF0ZSA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgZUNhbmRpZGF0ZTsKLQkJCQlpZiAoY2FuZGlkYXRlID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChpc0V4Y2x1ZGVkKGNhbmRpZGF0ZSwgZWxlbWVudCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWNvbnRlbnQuYWRkKGNhbmRpZGF0ZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vdmFibGVNb2RlbFF1ZXJ5I3NldElkUmVzb2x2ZXIoSWRSZXNvbHZlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZFJlc29sdmVyKFVSSVJlc29sdmVyIG5ld0lkUmVzb2x2ZXIpIHsKLQkJbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgPSBuZXcgSFRNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKGZDYWNoZSwgbmV3SWRSZXNvbHZlcik7Ci0JfQotCi0JLy8gdXRpbGl0aWVzCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0V4Y2x1ZGVkKENNRWxlbWVudERlY2xhcmF0aW9uIGNhbmRpZGF0ZSwgRWxlbWVudCB0YXJnZXQpIHsKLQkJQ01OYW1lZE5vZGVNYXAgcHJvaGliaXRlZCA9IGdldFByb2hpYml0ZWRBbmNlc3RvcnMoY2FuZGlkYXRlKTsKLQkJaWYgKHByb2hpYml0ZWQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudCBwYXJlbnQgPSB0YXJnZXQ7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJQ01Ob2RlIHBkZWMgPSBwcm9oaWJpdGVkLmdldE5hbWVkSXRlbShwYXJlbnQuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQlpZiAocGRlYyAhPSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCQkJcGFyZW50ID0gZ2V0RXhwbGljaXRQYXJlbnRFbGVtZW50KHBhcmVudCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjKSB7Ci0JCWlmICghZGVjLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuUFJPSElCSVRFRF9BTkNFU1RPUlMpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01OYW1lZE5vZGVNYXApIGRlYy5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlBST0hJQklURURfQU5DRVNUT1JTKTsKLQl9Ci0KLQkvKiBnZXQgYW4gYW5jZXN0b3IgZWxlbWVudCBpZ25vcmluZyBpbXBsaWNpdCBvbmVzLiAqLwotCXByaXZhdGUgc3RhdGljIEVsZW1lbnQgZ2V0RXhwbGljaXRQYXJlbnRFbGVtZW50KE5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlOb2RlIHAgPSBjaGlsZC5nZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChwICE9IG51bGwpIHsKLQkJCWlmIChwLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlpZiAocCBpbnN0YW5jZW9mIElET01FbGVtZW50KSB7Ci0JCQkJCWlmICgoKElET01FbGVtZW50KSBwKS5pc0ltcGxpY2l0VGFnKCkpIHsKLQkJCQkJCXAgPSBwLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiAoRWxlbWVudCkgcDsKLQkJCX0KLQkJCXAgPSBwLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IHN1cGVyLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQlpZiAobnVsbCAhPSByZXN1bHQpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQkKLQkJcmV0dXJuIHhtbEFzc29jUHJvdi5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmN2MyNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRIVE1MIGV4dGVuZHMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTCB7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUwuCi0JICovCi0JcHVibGljIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTCgpIHsKLQkJc3VwZXIoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MsIGZhbHNlKTsKLQl9Ci0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0KLQkJcmV0dXJuIG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUwoKTsKLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogdGhpcyAiZm9yY2VzIiBhIG5ldyBvbmUgdG8gYWx3YXlzIGJlIGNyZWF0ZWQvcmV0dXJuZWQsIG5vdAotCSAqICJjYWNoZWQiIG9uIHRoZSBub2RlLiBUaGF0IHNlZW1zIGluY29ycmVjdC4gU2ltcGx5IHVzaW5nCi0JICogc2hvdWxkUmVnaXN0ZXJGYWxzZSBzaG91bGQgd29yaywgZXhjZXB0LCB0aGVyZSBtaWdodCBoYXZlIGJlZW4gb25lCi0JICogdGhlcmUgdGhhdCBzb21lb25lIGVsc2UgYWxyZWFkeSBleHBsaWNpdGx5IHB1dCB0aGVyZSwgc28gdGhpcyBpcyBvbmx5Ci0JICogd2F5IEkga25vdyB0byBvdmVycmlkZSB0aGF0LiBFc3BlY2lhbGx5IGNvbXBsaWNhdGVkIGhlcmUgc2luY2UgYSBudW1iZXIKLQkgKiBvZiBhZGFwdGVycyBhcmUgZm9yIE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLgotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBvYmplY3QpIHsKLQkJcmV0dXJuIGFkYXB0TmV3KG9iamVjdCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNjMmYyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuWE1MQ2F0YWxvZ0lkUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLQotLyoqCi0gKiBDcmVhdGVzIGEgTW9kZWxRdWVyeUFkYXB0ZXIgZm9yIEhUTUwgbW9kZWxzCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0KLQlNb2RlbFF1ZXJ5QWRhcHRlckltcGwgbW9kZWxRdWVyeUFkYXB0ZXI7Ci0JSVN0cnVjdHVyZWRNb2RlbCBtb2RlbFN0YXRlTm90aWZpZXI7Ci0JcHJpdmF0ZSBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciBpbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcjsKLQotCWNsYXNzIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGltcGxlbWVudHMgSU1vZGVsU3RhdGVMaXN0ZW5lciB7Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQkvLyBJU1NVRTogc2hvdWxkIHdlICJmcmVlemUiIHN0YXRlLCBvciBhbnl0aGluZz8KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkJLy8gSVNTVUU6IHNob3VsZCB3ZSAiZnJlZXplIiBzdGF0ZSwgb3IgYW55dGhpbmc/Ci0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJLy8gbm90aGluZyB0byBkbz8KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsLAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkgewotCQkJLy8gbm90aGluZyB0byBkbwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCQl1cGRhdGVSZXNvbHZlcihzdHJ1Y3R1cmVkTW9kZWwpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJLy8gbm90aGluZyB0byBkbz8KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwsCi0JCSAqICAgICAgSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCQltb2RlbFN0YXRlTm90aWZpZXIucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQkJbW9kZWxTdGF0ZU5vdGlmaWVyID0gbmV3TW9kZWw7Ci0JCQl1cGRhdGVSZXNvbHZlcihtb2RlbFN0YXRlTm90aWZpZXIpOwotCQkJbW9kZWxTdGF0ZU5vdGlmaWVyLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVSZXNvbHZlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQlJRmlsZSBiYXNlRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSkpOwotCQkJaWYgKGJhc2VGaWxlICE9IG51bGwpIHsKLQkJCQlpZiAoYmFzZUZpbGUuZ2V0TG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWJhc2VMb2NhdGlvbiA9IGJhc2VGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJaWYgKGJhc2VMb2NhdGlvbiA9PSBudWxsICYmIGJhc2VGaWxlLmdldExvY2F0aW9uVVJJKCkgIT0gbnVsbCkgewotCQkJCQliYXNlTG9jYXRpb24gPSBiYXNlRmlsZS5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCWlmIChiYXNlTG9jYXRpb24gPT0gbnVsbCkgewotCQkJCQliYXNlTG9jYXRpb24gPSBiYXNlRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQl9Ci0JCQltb2RlbFF1ZXJ5QWRhcHRlci5zZXRJZFJlc29sdmVyKG5ldyBYTUxDYXRhbG9nSWRSZXNvbHZlcihiYXNlTG9jYXRpb24sIG1vZGVsLmdldFJlc29sdmVyKCkpKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MIGNvbnN0cnVjdG9yIGNvbW1lbnQuIE5vdGU6IHRoaXMgaXMgYQotCSAqIGNhc2UgdGhlcmUgdGhlIGtleSBpcyBub3QgZXhhY3RseSBzYW1lIGFzIHRoZSBjbGFzcyB3ZSBhcmUgYWZ0ZXIuCi0JICovCi0JcHVibGljIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwoKSB7Ci0JCXN1cGVyKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBXZSBuZWVkIHRoaXMgcHJvdGVjdGVkIHZlcnNpb24gdG8gYWxsb3cgc3ViY2xhc3NlcyB0byBwYXNzIHVwIHN0YW5kYXJkCi0JICogYmVoYXZpb3VyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyS2V5Ci0JICogQHBhcmFtIHJlZ2lzdGVyQWRhcHRlcnMKLQkgKi8KLQotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0KLQkJcmV0dXJuIG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCQlpZiAobW9kZWxTdGF0ZU5vdGlmaWVyICE9IG51bGwpIHsKLQkJCW1vZGVsU3RhdGVOb3RpZmllci5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIpOwotCQl9Ci0KLQkJbW9kZWxTdGF0ZU5vdGlmaWVyID0gbnVsbDsKLQotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJbW9kZWxRdWVyeUFkYXB0ZXIucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQWRhcHRlciBtZXRob2QgY29tbWVudC4KLQkgKiAKLQkgKiBYWFg6IHdlIG11c3QgbWFrZSB0aGlzIG1ldGhvZCBtb3JlIGluZGVwZW5kZW50IG9mICdsb2NhdGlvbicgKGF0IGxlYXN0Ci0JICogcHJvdmlkZSBzb21lIGZhbGwtYmFjayBtZXRob2QpLgotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCi0JCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbykgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTC5jcmVhdGVBZGFwdGVyIiArIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXIgPT0gbnVsbCkgewotCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJSURPTU5vZGUgeG1sTm9kZSA9IChJRE9NTm9kZSkgdGFyZ2V0OwotCQkJCW1vZGVsU3RhdGVOb3RpZmllciA9IHhtbE5vZGUuZ2V0TW9kZWwoKTsKLQkJCQltb2RlbFN0YXRlTm90aWZpZXIuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKGdldEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCkpOwotCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IHhtbE5vZGUuZ2V0TW9kZWwoKTsKLQkJCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlciByZXNvbHZlciA9IG1vZGVsLmdldFJlc29sdmVyKCk7Ci0JCQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS1Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MLi4uIGJhc2VMb2NhdGlvbiA6ICIgKyByZXNvbHZlci5nZXRGaWxlQmFzZUxvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkvKioKLQkJCQkgKiBYTUxDYXRhbG9nSWRSZXNvbHZlciBjdXJyZW50bHkgcmVxdWlyZXMgYSBmaWxlc3lzdGVtCi0JCQkJICogbG9jYXRpb24gc3RyaW5nLiBDdXN0b21hcmlseSB0aGlzIHdpbGwgYmUgd2hhdCBpcyBpbiB0aGUKLQkJCQkgKiBkZXByZWNhdGVkIFNTRSBVUklSZXNvbHZlciBhbmQgcmVxdWlyZWQgYnkgdGhlIENvbW1vbiBVUkkKLQkJCQkgKiBSZXNvbHZlci4KLQkJCQkgKi8KLQkJCQlVUklSZXNvbHZlciBpZFJlc29sdmVyID0gbnVsbDsKLQkJCQlpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotCQkJCQlpZFJlc29sdmVyID0gbmV3IFhNTENhdGFsb2dJZFJlc29sdmVyKHJlc29sdmVyLmdldEZpbGVCYXNlTG9jYXRpb24oKSwgcmVzb2x2ZXIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogMjAzNjQ5IC0gdGhpcyBibG9jayBtYXkgYmUgbmVjZXNzYXJ5IGR1ZSB0byBvcmRlcmluZyBvZgotCQkJCQkgKiBzZXR0aW5nIHRoZSByZXNvbHZlciBpbnRvIHRoZSBtb2RlbAotCQkJCQkgKi8KLQkJCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JCQkJCVN0cmluZyBtb2RlbHNCYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCQkJaWYgKG1vZGVsc0Jhc2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlGaWxlIGZpbGUgPSBuZXcgUGF0aChtb2RlbHNCYXNlTG9jYXRpb24pLnRvRmlsZSgpOwotCQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQliYXNlTG9jYXRpb24gPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCQkJCQkJSVJlc291cmNlIGRlcml2ZWRSZXNvdXJjZSA9IG51bGw7Ci0JCQkJCQkJaWYgKGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkKLQkJCQkJCQkJZGVyaXZlZFJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGJhc2VQYXRoKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCWRlcml2ZWRSZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChiYXNlUGF0aC5zZWdtZW50KDApKTsKLQkJCQkJCQlJUGF0aCBkZXJpdmVkUGF0aCA9IGRlcml2ZWRSZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCWlmIChkZXJpdmVkUGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkJCWJhc2VMb2NhdGlvbiA9IGRlcml2ZWRQYXRoLnRvU3RyaW5nKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlVUkkgdXJpID0gZGVyaXZlZFJlc291cmNlLmdldExvY2F0aW9uVVJJKCk7Ci0JCQkJCQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCQkJCQkJYmFzZUxvY2F0aW9uID0gdXJpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZihiYXNlTG9jYXRpb24gPT0gbnVsbCkgewotCQkJCQkJCWJhc2VMb2NhdGlvbiA9IG1vZGVsc0Jhc2VMb2NhdGlvbjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZFJlc29sdmVyID0gbmV3IFhNTENhdGFsb2dJZFJlc29sdmVyKGJhc2VMb2NhdGlvbiwgbnVsbCk7Ci0JCQkJfQotCQkJCUNNRG9jdW1lbnRDYWNoZSBkb2N1bWVudENhY2hlID0gbmV3IENNRG9jdW1lbnRDYWNoZSgpOwotCQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IG5ldyBIVE1MTW9kZWxRdWVyeUltcGwoZG9jdW1lbnRDYWNoZSwgaWRSZXNvbHZlcik7Ci0JCQkJbW9kZWxRdWVyeS5zZXRFZGl0TW9kZShNb2RlbFF1ZXJ5LkVESVRfTU9ERV9VTkNPTlNUUkFJTkVEKTsKLQkJCQltb2RlbFF1ZXJ5QWRhcHRlciA9IG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckltcGwoZG9jdW1lbnRDYWNoZSwgbW9kZWxRdWVyeSwgaWRSZXNvbHZlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsUXVlcnlBZGFwdGVyOwotCX0KLQotCi0KLQlwcml2YXRlIGZpbmFsIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGdldEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCkgewotCQlpZiAoaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKTsKLQkJfQotCQlyZXR1cm4gaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWEhUTUxBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YSFRNTEFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0NDI5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YSFRNTEFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLlhNTEFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBBIENsYXNzIHRvIHByb3ZpZGUgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBYSFRNTCBkb2N1bWVudHMgYW5kIERURHMgZm9yCi0gKiBYSFRNTC4gVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgaW4gSFRNTE1vZGVsUXVlcnlDTVByb3ZpZGVyLgotICovCi0vKgotICogVGhpcyBjbGFzcyBjbG9zZWx5IHJlc2VtYmxlIFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLgotICovCi1jbGFzcyBYSFRNTEFzc29jaWF0aW9uUHJvdmlkZXIgZXh0ZW5kcyBYTUxBc3NvY2lhdGlvblByb3ZpZGVyIHsKLQkKLQkvKioKLQkgKiBzZXQgQ0FDSEVfRklYRURfRE9DVU1FTlRTIHRvIGZhbHNlIHRvIHRlc3QgZWZmZWN0cyBvZiBub3QgY2FjaGluZyBjZXJ0YWluIGNhdGFsb2ctY29udHJpYnV0ZWQgc2NoZW1hcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIENBQ0hFX0ZJWEVEX0RPQ1VNRU5UUyA9IHRydWU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1RBTkRBUkRfU0NIRU1BX0JVTkRMRVMgPSBuZXcgU3RyaW5nW10geyJvcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcyIsIm9yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzIn07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DQVRBTE9HX0VYVF9QT0lOVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY2F0YWxvZ0NvbnRyaWJ1dGlvbnMiOyAKLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGZGaXhlZFB1YmxpY0lEcyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIGZGaXhlZENNRG9jdW1lbnRzID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIHNldCBVU0VfUVVJQ0tfQ0FDSEUgdG8gZmFsc2UgdG8gdGVzdCBlZmZlY3RzIG9mIG5vdCBjYWNoaW5nIGF0IGFsbC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9RVUlDS19DQUNIRSA9IHRydWU7Ci0JcHJvdGVjdGVkIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNhY2hlZEdyYW1tZXJVUkk7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNhY2hlZFB1YmxpY0lEOwotCXByaXZhdGUgU3RyaW5nIGZDYWNoZWRTeXN0ZW1JRDsKLQlwcml2YXRlIGJvb2xlYW4gY2FjaGVkOwotCi0JcHVibGljIFhIVE1MQXNzb2NpYXRpb25Qcm92aWRlcihDTURvY3VtZW50Q2FjaGUgY2FjaGUsIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJc3VwZXIoY2FjaGUpOwotCQl0aGlzLmlkUmVzb2x2ZXIgPSBpZFJlc29sdmVyOwotCQkgICAKLQkJLy8gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzYzOTkuIElmIHRoZSBDTSBkb2N1bWVudCBVUkkKLQkJLy8gaXMgcmVzb2x2ZWQgYW5kIGNhY2hlZCBhdCB0aGlzIGxldmVsIGluc3RydWN0IHRoZSBDTSBtb2RlbCBtYW5hZ2VyIHRvIGF2b2lkIAotCQkvLyByZS1yZXNvbHZpbmcgdGhlIFVSSS4KLQotCQlpZiAoVVNFX1FVSUNLX0NBQ0hFKSB7Ci0JCSAgZG9jdW1lbnRNYW5hZ2VyLnNldFByb3BlcnR5RW5hYmxlZChDTURvY3VtZW50TWFuYWdlci5QUk9QRVJUWV9QRVJGT1JNX1VSSV9SRVNPTFVUSU9OLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSWQKLQkgKiBAcGFyYW0gc3lzdGVtSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0WEhUTUxDTURvY3VtZW50KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCWlmIChpZFJlc29sdmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVN0cmluZyBncmFtbWVyVVJJID0gbnVsbDsKLQkJaWYgKFVTRV9RVUlDS19DQUNIRSkgewotCQkJLyoKLQkJCSAqIEluIHBhcnNpbmcgYSBkb2N1bWVudCwgd2UgZ2V0IG1hbnkgaWRlbnRpY2FsIHJlcXVlc3RzIHRvIHRoaXMKLQkJCSAqIG1ldGhvZCwgc28gaW5zdGVhZCBvZiBsb29raW5nIHVwIChyZXNvbHZpbmcpIGdyYW1tZXJVUkkgZWFjaAotCQkJICogdGltZSwgd2UnbGwganVzdCByZXR1cm4gcHJldmlvdXNseSBjYWNoZWQgb25lLiBQcm9iYWJseSBub3QKLQkJCSAqIHdvcnRoIGhhdmUgYSBtb3JlIGNvbXBsZXggY2FjaGUgdGhhbiB0aGF0LgotCQkJICovCi0JCQlpZiAoY2FjaGVkICYmIHNhbWVBcyhmQ2FjaGVkUHVibGljSUQsIHB1YmxpY0lkKSAmJiBzYW1lQXMoZkNhY2hlZFN5c3RlbUlELCBzeXN0ZW1JZCkpIHsKLQkJCQlncmFtbWVyVVJJID0gZkNhY2hlZEdyYW1tZXJVUkk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlncmFtbWVyVVJJID0gaWRSZXNvbHZlci5yZXNvbHZlKG51bGwsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQkJZkNhY2hlZEdyYW1tZXJVUkkgPSBncmFtbWVyVVJJOwotCQkJCWZDYWNoZWRQdWJsaWNJRCA9IHB1YmxpY0lkOwotCQkJCWZDYWNoZWRTeXN0ZW1JRCA9IHN5c3RlbUlkOwotCQkJCWNhY2hlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlncmFtbWVyVVJJID0gaWRSZXNvbHZlci5yZXNvbHZlKG51bGwsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCX0KLQotCQlpZiAoZ3JhbW1lclVSSSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBudWxsOwotCQlpZiAoQ0FDSEVfRklYRURfRE9DVU1FTlRTKSB7Ci0JCQlSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgZkZpeGVkQ01Eb2N1bWVudHMuZ2V0KHB1YmxpY0lkKTsKLQkJCWlmIChyZWYgIT0gbnVsbCkgewotCQkJCWNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCkgcmVmLmdldCgpOwotCQkJCWlmIChjbURvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGNtRG9jdW1lbnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvKgotCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg4OTYKLQkJICogCi0JCSAqIFdlIG9uY2UgY2FsbGVkIHRoZSBkZXByZWNhdGVkIDIgYXJndW1lbnQgZm9ybSBvZiBnZXRDTURvY3VtZW50LgotCQkgKiAKLQkJICogQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnQocHVibGljSWQsCi0JCSAqIGdyYW1tZXJVUkkpOwotCQkgKiAKLQkJICogd2hpY2ggZXZlbnR1YWxseSByZXN1bHRlZCBpbiBlbXB0eSBzdHJpbmcgZm9yIHR5cGUsIHdoaWNoIEkgZG9uJ3QKLQkJICogdGhpbmsgdGhlIGluZnJhc3RydWN0dXJlIGhhbmRsZXMgYW55IGxvbmdlci4gU28sIEkgZGVsZXRlZAotCQkgKiBkZXByZWNhdGVkIG1ldGhvZHMsIGFuZCBzd2l0Y2hlZCB0byBudWxsIGZvciB0eXBlIGFyZ3VtZW50LgotCQkgKiAKLQkJICogJ251bGwnIG1lYW5zIHRvICJjcmVhdGUgYmFzZWQgb24gdXJpIi4KLQkJICogCi0JCSAqIEZZSSwgJ2R0ZCcgd291bGQgbWVhbiBsb2FkIG9ubHkgdGhvc2UgcmVnaXN0ZXJlZCBhcyBkdGQncwotCQkgKiAKLQkJICogQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnQocHVibGljSWQsCi0JCSAqIGdyYW1tZXJVUkkpOyBDTURvY3VtZW50IGNtRG9jdW1lbnQgPQotCQkgKiBkb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudChwdWJsaWNJZCwgZ3JhbW1lclVSSSwgImR0ZCIpOwotCQkgKi8KLQkJc3luY2hyb25pemVkIChncmFtbWVyVVJJKSB7Ci0JCQljbURvY3VtZW50ID0gZG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnQocHVibGljSWQsIGdyYW1tZXJVUkksIG51bGwpOwotCQl9Ci0JCQotCQlpZiAoQ0FDSEVfRklYRURfRE9DVU1FTlRTICYmIGdldEZpeGVkUHVibGljSURzKCkuY29udGFpbnMocHVibGljSWQpKSB7Ci0JCQlmRml4ZWRDTURvY3VtZW50cy5wdXQocHVibGljSWQsIG5ldyBTb2Z0UmVmZXJlbmNlKGNtRG9jdW1lbnQpKTsKLQkJfQotCQkKLQkJcmV0dXJuIGNtRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlR3JhbW1hclVSSShEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJcmV0dXJuIGlkUmVzb2x2ZXIucmVzb2x2ZShudWxsLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzYW1lQXMoU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChhID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGIgPT0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGEuZXF1YWxzKGIpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRlZCBhbmQvb3IgbWFkZSBwdWJsaWMgc3BlY2lmaWNhbGx5IGZvciBleHBlcmltZW50YXRpb24uIEl0Ci0JICogd2lsbCBjaGFuZ2UgYXMgdGhpcyBmdW5jdGlvbmFsaXR5IGJlY29tZXMgQVBJLiBTZWUKLQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE5MDg0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYWNoZWRHcmFtbWVyVVJJKCkgewotCQlyZXR1cm4gZkNhY2hlZEdyYW1tZXJVUkk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgZkZpeGVkUHVibGljSURzLCBhIGNvbGxlY3Rpb24gb2YgY29udHJpYnV0ZWQgUHVibGljCi0JICogICAgICAgICBJZGVudGlmaWVycyBmcm9tIHRoZSBrbm93biBzY2hlbWEgcGx1Zy1pbnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBnZXRGaXhlZFB1YmxpY0lEcygpIHsKLQkJLyoqCi0JCSAqIHB1YmxpYzpwdWJsaWNJZAotCQkgKiBUT0RPOiBzeXN0ZW06c3lzdGVtSWQgYW5kIHVyaTpuYW1lIGluIHRoZWlyIG93biBtZXRob2RzIGFuZCBtYXBzPwotCQkgKi8KLQkJc3luY2hyb25pemVkIChTVEFOREFSRF9TQ0hFTUFfQlVORExFUykgewotCQkJaWYgKGZGaXhlZFB1YmxpY0lEcyA9PSBudWxsKSB7Ci0JCQkJZkZpeGVkUHVibGljSURzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IFNUQU5EQVJEX1NDSEVNQV9CVU5ETEVTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25zKFNUQU5EQVJEX1NDSEVNQV9CVU5ETEVTW2ldKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRlbnNpb25zLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAoWE1MX0NBVEFMT0dfRVhUX1BPSU5ULmVxdWFscyhleHRlbnNpb25zW2pdLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpKSkgewotCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ3VyYXRpb25FbGVtZW50cyA9IGV4dGVuc2lvbnNbal0uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBjb25maWd1cmF0aW9uRWxlbWVudHMubGVuZ3RoOyBrKyspIHsKLQkJCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcHVibGljcyA9IGNvbmZpZ3VyYXRpb25FbGVtZW50c1trXS5nZXRDaGlsZHJlbigicHVibGljIik7Ci0JCQkJCQkJCWZvciAoaW50IGwgPSAwOyBsIDwgcHVibGljcy5sZW5ndGg7IGwrKykgewotCQkJCQkJCQkJU3RyaW5nIHB1YmxpY0lkID0gcHVibGljc1tsXS5nZXRBdHRyaWJ1dGUoInB1YmxpY0lkIik7Ci0JCQkJCQkJCQlpZiAocHVibGljSWQgIT0gbnVsbCAmJiBwdWJsaWNJZC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJCQlmRml4ZWRQdWJsaWNJRHMuYWRkKHB1YmxpY0lkKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZkZpeGVkUHVibGljSURzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0hUTUxDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YjVlNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0hUTUxDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uQ2hhcnNldE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgSFRNTCBDb3JlIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0KLQkJLy8gZm9ybWF0dGluZyBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRILCA3Mik7Ci0JCW5vZGUucHV0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMsIGZhbHNlKTsKLQkJbm9kZS5wdXQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUiwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSwgMSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUywgZmFsc2UpOwotCQlub2RlLnB1dEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQUxJR05fRU5EX0JSQUNLRVQsIGZhbHNlKTsKLQotCQkvLyBjbGVhbnVwIHByZWZlcmVuY2VzCi0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfVEFHX05BTUVfQ0FTRSwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVNJUyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCQkvLyBub2RlLnB1dEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTLAotCQkvLyB0cnVlKTsKLQkJbm9kZS5wdXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTLCB0cnVlKTsKLQkJbm9kZS5wdXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTLCB0cnVlKTsKLQkJbm9kZS5wdXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMsIGZhbHNlKTsKLQotCQkvLyBjb2RlIGdlbmVyYXRpb24gcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkZWZhdWx0RW5jID0gIlVURi04IjsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzeXN0ZW1FbmMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuZW5jb2RpbmciKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc3lzdGVtRW5jICE9IG51bGwpIHsKLQkJCWRlZmF1bHRFbmMgPSBDb21tb25DaGFyc2V0TmFtZXMuZ2V0UHJlZmVycmVkRGVmYXVsdElhbmFOYW1lKHN5c3RlbUVuYywgIlVURi04Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VULCBkZWZhdWx0RW5jKTsKLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuRU5EX09GX0xJTkVfQ09ERSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCi0JCS8vIHRoaXMgY291bGQgYmUgbWFkZSBzbWFydGVyIGJ5IGFjdHVhbGx5IGxvb2tpbmcgdXAgdGhlIGNvbnRlbnQKLQkJLy8gdHlwZSdzIHZhbGlkIGV4dGVuc2lvbnMKLQkJbm9kZS5wdXQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04sICJodG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWluaXRpYWxpemVWYWxpZGF0aW9uUHJlZmVyZW5jZXMobm9kZSk7Ci0JfQotCQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBkZWZhdWx0IHZhbGlkYXRpb24gcHJlZmVyZW5jZXMKLQkgKiBAcGFyYW0gbm9kZSB0aGUgRWNsaXBzZSBwcmVmZXJlbmNlIG5vZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25QcmVmZXJlbmNlcyhJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUpIHsKLQkJLy8gQXR0cmlidXRlcwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfVU5ERUZJTkVEX05BTUUsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfVU5ERUZJTkVEX1ZBTFVFLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX05BTUVfTUlTTUFUQ0gsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfSU5WQUxJRF9OQU1FLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX0lOVkFMSURfVkFMVUUsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfRFVQTElDQVRFLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX1ZBTFVFX01JU01BVENILCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9WQUxVRV9VTkNMT1NFRCwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9WQUxVRV9SRVNPVVJDRV9OT1RfRk9VTkQsIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9PQlNPTEVURV9OQU1FLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJCi0JCQotCQkvLyBFbGVtZW50cwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX1VOS05PV05fTkFNRSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fSU5WQUxJRF9OQU1FLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fU1RBUlRfSU5WQUxJRF9DQVNFLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9FTkRfSU5WQUxJRF9DQVNFLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fTUlTU0lOR19TVEFSVCwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fTUlTU0lOR19FTkQsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX1VOTkVDRVNTQVJZX0VORCwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fSU5WQUxJRF9ESVJFQ1RJVkUsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9JTlZBTElEX0NPTlRFTlQsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0RVUExJQ0FURSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fQ09FWElTVEVOQ0UsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX1VOQ0xPU0VEX1NUQVJUX1RBRywgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX1VOQ0xPU0VEX0VORF9UQUcsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9JTlZBTElEX0VNUFRZX1RBRywgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fT0JTT0xFVEVfTkFNRSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCQotCQkKLQkJLy8gRE9DVFlQRQotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ET0NfRFVQTElDQVRFLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRPQ19JTlZBTElEX0NPTlRFTlQsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ET0NfRE9DVFlQRV9VTkNMT1NFRCwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQkKLQkJLy8gVGV4dAotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5URVhUX0lOVkFMSURfQ09OVEVOVCwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRFWFRfSU5WQUxJRF9DSEFSLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJCi0JCS8vIENvbW1lbnQKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NTUVOVF9JTlZBTElEX0NPTlRFTlQsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01NRU5UX1VOQ0xPU0VELCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCQotCQkvLyBDREFUQQotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DREFUQV9JTlZBTElEX0NPTlRFTlQsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DREFUQV9VTkNMT1NFRCwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQkKLQkJLy8gUHJvY2Vzc2luZyBJbnN0cnVjdGlvbnMKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuUElfSU5WQUxJRF9DT05URU5ULCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuUElfVU5DTE9TRUQsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJCi0JCS8vIEVudGl0eSBSZWZlcmVuY2UKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuUkVGX1VOREVGSU5FRCwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlJFRl9JTlZBTElEX0NPTlRFTlQsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0hUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNTAxZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0hUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIENvbW1vbiBwcmVmZXJlbmNlIGtleXMgdXNlZCBieSBIVE1MIGNvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcygpIHsKLQkJLy8gZW1wdHkgcHJpdmF0ZSBjb25zdHJ1Y3RvciBzbyB1c2VycyBjYW5ub3QgaW5zdGFudGlhdGUgY2xhc3MKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBleHRlbnNpb24gdG8gdXNlIHdoZW4gbm9uZSBpcyBzcGVjaWZpZWQgaW4gdGhlIE5ldyBIVE1MCi0JICogRmlsZSBXaXphcmQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYVEVOU0lPTiA9ICJkZWZhdWx0RXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIG1heGltdW0gd2lkdGggb2YgYSBsaW5lIGJlZm9yZSBhIGxpbmUgc3BsaXQgaXMgbmVlZGVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+SW50ZWdlcjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfV0lEVEggPSAibGluZVdpZHRoIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgYWxsIGJsYW5rcyBsaW5lcyBzaG91bGQgYmUgY2xlYXJlZCBkdXJpbmcgZm9ybWF0dGluZy4KLQkgKiBCbGFuayBsaW5lcyB3aWxsIGJlIGtlcHQgd2hlbiBmYWxzZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUl9BTExfQkxBTktfTElORVMgPSAiY2xlYXJBbGxCbGFua0xpbmVzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mICNJTkRFTlRBVElPTl9DSEFSIGZvciAxIGluZGVudGF0aW9uLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+SW50ZWdlcjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVEFUSU9OX1NJWkUgPSAiaW5kZW50YXRpb25TaXplIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2hhcmFjdGVyIHVzZWQgZm9yIGluZGVudGF0aW9uLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtUQUIsIFNQQUNFfQotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFTlRBVElPTl9DSEFSID0gImluZGVudGF0aW9uQ2hhciI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlICNJTkRFTlRBVElPTl9DSEFSLiBJbmRpY2F0ZXMgdG8gdXNlCi0JICogdGFiIGNoYXJhY3RlciB3aGVuIGZvcm1hdHRpbmcuCi0JICogCi0JICogQHNlZSAjU1BBQ0UKLQkgKiBAc2VlICNJTkRFTlRBVElPTl9DSEFSCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCID0gInRhYiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZSAjSU5ERU5UQVRJT05fQ0hBUi4gSW5kaWNhdGVzIHRvIHVzZQotCSAqIHNwYWNlIGNoYXJhY3RlciB3aGVuIGZvcm1hdHRpbmcuCi0JICogCi0JICogQHNlZSAjVEFCCi0JICogQHNlZSAjSU5ERU5UQVRJT05fQ0hBUgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQUNFID0gInNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRhZ3Mgd2l0aCBtdWx0aXBsZSBhdHRyaWJ1dGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQKLQkgKiAoc3BsaXR0aW5nIGVhY2ggYXR0ciBvbiBhIG5ldyBsaW5lKS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUExJVF9NVUxUSV9BVFRSUyA9ICJzcGxpdE11bHRpQXR0cnMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiBlbmQgYnJhY2tldHMgb2Ygc3RhcnQgdGFncyBzaG91bGQgYmUgcGxhY2VkIG9uIGEgbmV3IGxpbmUKLQkgKiBpZiB0aGUgc3RhcnQgdGFnIHNwYW5zIG1vcmUgdGhhbiBvbmUgbGluZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9FTkRfQlJBQ0tFVCA9ICJhbGlnbkVuZEJyYWNrZXQiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBjbGVhbnVwIHByb2Nlc3NvciBzaG91bGQgZm9ybWF0IHNvdXJjZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfU09VUkNFID0gImZvcm1hdFNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGVtcHR5IGVsZW1lbnRzIHNob3VsZCBiZSBjb21wcmVzc2VkIGR1cmluZwotCSAqIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTID0gImNvbXByZXNzRW1wdHlFbGVtZW50VGFncyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGluc2VydCByZXF1aXJlZCBhdHRyaWJ1dGVzIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVF9SRVFVSVJFRF9BVFRSUyA9ICJpbnNlcnRSZXF1aXJlZEF0dHJzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gaW5zZXJ0IG1pc3NpbmcgdGFncyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNFUlRfTUlTU0lOR19UQUdTID0gImluc2VydE1pc3NpbmdUYWdzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gcXVvdGUgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVPVEVfQVRUUl9WQUxVRVMgPSAicXVvdGVBdHRyVmFsdWVzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gY29udmVydCBhbGwgbGluZSBkZWxpbWl0ZXJzIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRfRU9MX0NPREVTID0gImNvbnZlcnRFT0xDb2RlcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBsaW5lIGRlbGltaXRlciB0byB1c2UgZHVyaW5nIGNsZWFudXAgaWYgY29udmVydGluZyBsaW5lCi0JICogZGVsaW1pdGVycy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7Q1IsIENSTEYsIExGLCBOT19UUkFOU0xBVElPTn0KLQkgKiA8L3A+Ci0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9FT0xfQ09ERSA9ICJjbGVhbnVwRU9MQ29kZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIGNhc2UgdG8gdXNlIG9uIGFsbCB0YWcgbmFtZXMgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtMT1dFUiwgVVBQRVIsIEFTSVN9Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOVVBfVEFHX05BTUVfQ0FTRSA9ICJjbGVhbnVwVGFnTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBjYXNlIHRvIHVzZSBvbiBhbGwgYXR0cmlidXRlIG5hbWVzIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+SW50ZWdlcjwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7TE9XRVIsIFVQUEVSLCBBU0lTfQotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX0FUVFJfTkFNRV9DQVNFID0gImNsZWFudXBBdHRyTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByZWZlcnJlZCBtYXJrdXAgY2FzZSBmb3IgdGFnIG5hbWVzIGluIGNvZGUgZ2VuZXJhdGlvbgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+SW50ZWdlcjwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7TE9XRVIsIFVQUEVSfQotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRV9DQVNFID0gInRhZ05hbWVDYXNlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmZXJyZWQgbWFya3VwIGNhc2UgZm9yIGF0dHJpYnV0ZSBuYW1lcyBpbiBjb2RlIGdlbmVyYXRpb24KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge0xPV0VSLCBVUFBFUn0KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NBU0UgPSAiYXR0ck5hbWVDYXNlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UgI1RBR19OQU1FX0NBU0Ugb3IgI0FUVFJfTkFNRV9DQVNFLgotCSAqIEluZGljYXRlcyB0byBsZWF2ZSBjYXNlIGFzIGlzLgotCSAqIAotCSAqIEBzZWUgI0xPV0VSCi0JICogQHNlZSAjVVBQRVIKLQkgKiBAc2VlICNUQUdfTkFNRV9DQVNFCi0JICogQHNlZSAjQVRUUl9OQU1FX0NBU0UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU0lTID0gMDsKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZSAjVEFHX05BTUVfQ0FTRSBvciAjQVRUUl9OQU1FX0NBU0UuCi0JICogSW5kaWNhdGVzIHRvIG1ha2UgbmFtZSBsb3dlcmNhc2UuCi0JICogCi0JICogQHNlZSAjQVNJUwotCSAqIEBzZWUgI1VQUEVSCi0JICogQHNlZSAjVEFHX05BTUVfQ0FTRQotCSAqIEBzZWUgI0FUVFJfTkFNRV9DQVNFCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9XRVIgPSAxOwotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlICNUQUdfTkFNRV9DQVNFIG9yICNBVFRSX05BTUVfQ0FTRS4KLQkgKiBJbmRpY2F0ZXMgdG8gbWFrZSBuYW1lIHVwcGVyY2FzZS4KLQkgKiAKLQkgKiBAc2VlICNMT1dFUgotCSAqIEBzZWUgI0FTSVMKLQkgKiBAc2VlICNUQUdfTkFNRV9DQVNFCi0JICogQHNlZSAjQVRUUl9OQU1FX0NBU0UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUFBFUiA9IDI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX1BST0pFQ1RfU0VUVElOR1MgPSAidXNlLXByb2plY3Qtc2V0dGluZ3MiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVU5ERUZJTkVEX05BTUUgPSAiYXR0clVuZGVmTmFtZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9VTkRFRklORURfVkFMVUUgPSAiYXR0clVuZGVmVmFsdWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTkFNRV9NSVNNQVRDSCA9ICJhdHRyTmFtZU1pc21hdGNoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0lOVkFMSURfTkFNRSA9ICJhdHRySW52YWxpZE5hbWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfSU5WQUxJRF9WQUxVRSA9ICJhdHRySW52YWxpZFZhbHVlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0RVUExJQ0FURSA9ICJhdHRyRHVwbGljYXRlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1ZBTFVFX01JU01BVENIID0gImF0dHJWYWx1ZU1pc21hdGNoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1ZBTFVFX1VOQ0xPU0VEID0gImF0dHJWYWx1ZVVuY2xvc2VkIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1ZBTFVFX1JFU09VUkNFX05PVF9GT1VORCA9ICJyZXNvdXJjZU5vdEZvdW5kIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09CU09MRVRFX05BTUUgPSAiYXR0ck9ic29sZXRlTmFtZSI7Ly8kTk9OLU5MUy0xJAotCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVU5LTk9XTl9OQU1FID0gImVsZW1Vbmtub3duTmFtZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fSU5WQUxJRF9OQU1FID0gImVsZW1JbnZhbGlkTmFtZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fU1RBUlRfSU5WQUxJRF9DQVNFID0gImVsZW1TdGFydEludmFsaWRDYXNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9FTkRfSU5WQUxJRF9DQVNFID0gImVsZW1FbmRJbnZhbGlkQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTUlTU0lOR19TVEFSVCA9ICJlbGVtTWlzc2luZ1N0YXJ0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9NSVNTSU5HX0VORCA9ICJlbGVtTWlzc2luZ0VuZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVU5ORUNFU1NBUllfRU5EID0gImVsZW1Vbm5lY2Vzc2FyeUVuZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fSU5WQUxJRF9ESVJFQ1RJVkUgPSAiZWxlbUludmFsaWREaXJlY3RpdmUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0lOVkFMSURfQ09OVEVOVCA9ICJlbGVtSW52YWxpZENvbnRlbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0RVUExJQ0FURSA9ICJlbGVtRHVwbGljYXRlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9DT0VYSVNURU5DRSA9ICJlbGVtQ29leGlzdGVuY2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1VOQ0xPU0VEX1NUQVJUX1RBRyA9ICJlbGVtVW5jbG9zZWRTdGFydFRhZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVU5DTE9TRURfRU5EX1RBRyA9ICJlbGVtVW5jbG9zZWRFbmRUYWciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0lOVkFMSURfRU1QVFlfVEFHID0gImVsZW1JbnZhbGlkRW1wdHlUYWciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX09CU09MRVRFX05BTUUgPSAiZWxlbU9ic29sZXRlTmFtZSI7Ly8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ19EVVBMSUNBVEUgPSAiZG9jRHVwbGljYXRlVGFnIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DX0lOVkFMSURfQ09OVEVOVCA9ICJkb2NJbnZhbGlkQ29udGVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ19ET0NUWVBFX1VOQ0xPU0VEID0gImRvY0RvY3R5cGVVbmNsb3NlZCI7Ly8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfSU5WQUxJRF9DT05URU5UID0gImRvY0ludmFsaWRDb250ZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9JTlZBTElEX0NIQVIgPSAiZG9jSW52YWxpZENoYXIiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0lOVkFMSURfQ09OVEVOVCA9ICJjb21tZW50SW52YWxpZENvbnRlbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX1VOQ0xPU0VEID0gImNvbW1lbnRVbmNsb3NlZCI7Ly8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX0lOVkFMSURfQ09OVEVOVCA9ICJjZGF0YUludmFsaWRDb250ZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfVU5DTE9TRUQgPSAiY2RhdGFVbmNsb3NlZCI7Ly8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX0lOVkFMSURfQ09OVEVOVCA9ICJwaUludmFsaWRDb250ZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfVU5DTE9TRUQgPSAicGlVbmNsb3NlZCI7Ly8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRl9JTlZBTElEX0NPTlRFTlQgPSAicmVmSW52YWxpZENvbnRlbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZfVU5ERUZJTkVEID0gInBpVW5kZWZpbmVkIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSFRNTDQwTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSFRNTDQwTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMWE1M2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUw0ME5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUw1ME5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUw1ME5hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzhkNWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MNTBOYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotcHVibGljIGludGVyZmFjZSBIVE1MNTBOYW1lc3BhY2UgZXh0ZW5kcyBIVE1MNDBOYW1lc3BhY2UgewotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRWxlbWVudE5hbWUgZXh0ZW5kcyBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUgewotCQlTdHJpbmcgQVJUSUNMRSA9ICJhcnRpY2xlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgQVNJREUgPSAiYXNpZGUiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBBVURJTyA9ICJhdWRpbyI7Ci0JCVN0cmluZyBDQU5WQVMgPSAiY2FudmFzIjsKLQkJU3RyaW5nIENPTU1BTkQgPSAiY29tbWFuZCI7Ci0JCVN0cmluZyBEQVRBTElTVCA9ICJkYXRhbGlzdCI7Ci0JCVN0cmluZyBERVRBSUxTID0gImRldGFpbHMiOwotCQlTdHJpbmcgRklHVVJFID0gImZpZ3VyZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIEZJR0NBUFRJT04gPSAiZmlnY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIEZPT1RFUiA9ICJmb290ZXIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBIRUFERVIgPSAiaGVhZGVyIjsKLQkJU3RyaW5nIEhHUk9VUCA9ICJoZ3JvdXAiOwotCQlTdHJpbmcgS0VZR0VOID0gImtleWdlbiI7Ci0JCVN0cmluZyBNQVJLID0gIm1hcmsiOwotCQlTdHJpbmcgTUFUSCA9ICJtYXRoIjsKLQkJU3RyaW5nIE1FVEVSID0gIm1ldGVyIjsKLQkJU3RyaW5nIE5BViA9ICJuYXYiOwotCQlTdHJpbmcgT1VUUFVUID0gIm91dHB1dCI7Ci0JCVN0cmluZyBQUk9HUkVTUyA9ICJwcm9ncmVzcyI7Ci0JCVN0cmluZyBSUCA9ICJycCI7Ci0JCVN0cmluZyBSVCA9ICJydCI7Ci0JCVN0cmluZyBSVUJZID0gInJ1YnkiOwotCQlTdHJpbmcgU0VDVElPTiA9ICJzZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgU09VUkNFID0gInNvdXJjZSI7Ci0JCVN0cmluZyBTVU1NQVJZID0gInN1bW1hcnkiOwotCQlTdHJpbmcgU1ZHID0gInN2ZyI7Ci0JCVN0cmluZyBUSU1FID0gInRpbWUiOwotCQlTdHJpbmcgVklERU8gPSAidmlkZW8iOwotCX0KLQotCVN0cmluZyBIVE1MNTBfVVJJID0gImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1MC8iOwotCVN0cmluZyBIVE1MNTBfVEFHX1BSRUZJWCA9ICIiOwotCi0JLy8gZ2xvYmFsIGF0dHJpYnV0ZSBuYW1lcwotCVN0cmluZyBBVFRSX05BTUVfQ09OVEVOVF9FRElUQUJMRSA9ICJjb250ZW50ZWRpdGFibGUiOyAvLyAlY29yZWF0dHJzOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9DT05URVhUX01FTlUgPSAiY29udGV4dG1lbnUiOyAvLyAlY29yZWF0dHJzOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9EUkFHR0FCTEUgPSAiZHJhZ2dhYmxlIjsgLy8gJWNvcmVhdHRyczsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfUk9MRSA9ICJyb2xlIjsgLy8gJWNvcmVhdHRyczsgLy8kTk9OX05MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfU1BFTExDSEVDSyA9ICJzcGVsbGNoZWNrIjsgLy8gJWNvcmVhdHRyczsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfT05BQk9SVCA9ICJvbmFib3J0IjsgLy8gJWV2ZW50OyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9PTkNBTl9QTEFZID0gIm9uY2FucGx5IjsgLy8gJWV2ZW50OyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9PTkNBTl9QTEFZX1RIUk9VR0ggPSAib25jYW5wbGF5dGhyb3VnaCI7IC8vICVldmVudDsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfT05DT05URVhUX01FTlUgPSAib25jb250ZXh0bWVudSI7IC8vICVldmVudDsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfT05EUkFHID0gIm9uZHJhZyI7IC8vICVldmVudDsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfT05EUkFHX0VORCA9ICJvbmRyYWdlbmQiOyAvLyAlZXZlbnQ7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX09ORFJBR19PVkVSID0gIm9uZHJhZ292ZXIiOyAvLyAlZXZlbnQ7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX09ORFJBR19FTlRFUiA9ICJvbmRyYWdlbnRlciI7IC8vICVldmVudDsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfT05EUkFHX0xFQVZFID0gIm9uZHJhZ2xlYXZlIjsgLy8gJWV2ZW50OyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9PTkRSQUdfU1RBUlQgPSAib25kcmFnc3RhcnQiOyAvLyAlZXZlbnQ7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX09ORFJPUCA9ICJvbmRyb3AiOyAvLyAlZXZlbnQ7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX09ORFVSQVRJT05fQ0hBTkdFID0gIm9uZHVyYXRpb25jaGFuZ2UiOyAvLyAlZXZlbnQ7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX09ORU1QVElFRCA9ICJvbmVtcHRpZWQiOyAvLyAlZXZlbnQ7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX09ORU5ERUQgPSAib25lbmRlZCI7IC8vICVldmVudDsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfT05FUlJPUiA9ICJvbmVycm9yIjsgLy8gJWV2ZW50OyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9PTkZPUk1fQ0hBTkdFID0gIm9uZm9ybWNoYW5nZSI7IC8vICVldmVudDsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfT05GT1JNX0lOUFVUID0gIm9uZm9ybV9pbnB1dCI7IC8vICVldmVudDsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfT05JTlBVVCA9ICJvbmlucHV0IjsgLy8gJWV2ZW50OyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9PTklOVkFMSUQgPSAib25pbnZhbGlkIjsgLy8gJWV2ZW50OyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9PTkxPQURFRF9EQVRBID0gIm9ubG9hZGVkZGF0YSI7IC8vICVldmVudDsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfT05MT0FERURfTUVUQURBVEEgPSAib25sb2FkZWRtZXRhZGV0YSI7IC8vICVldmVudDsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfT05MT0FEX1NUQVJUID0gIm9ubG9hZHN0YXJ0IjsgLy8gJWV2ZW50OyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9PTk1PVVNFX1dIRUVMID0gIm9ubW91c2V3aGVlbCI7IC8vICVldmVudDsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfT05QQVVTRSA9ICJvbnBhdXNlIjsgLy8gJWV2ZW50OyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9PTlBMQVkgPSAib25wbGF5IjsgLy8gJWV2ZW50OyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9PTlBMQVlJTkcgPSAib25wbGF5aW5nIjsgLy8gJWV2ZW50OyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9PTlBST0dSRVNTID0gIm9ucHJvZ3Jlc3MiOyAvLyAlZXZlbnQ7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX09OUkFURV9DSEFOR0UgPSAib25yYXRlY2hhbmdlIjsgLy8gJWV2ZW50OyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9PTlJFQURZX1NUQVRFX0NIQU5HRSA9ICJvbnJlYWR5c3RhdGVjaGFuZ2UiOyAvLyAlZXZlbnQ7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX09OU0NST0xMID0gIm9uc2Nyb2xsIjsgLy8gJWV2ZW50OyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9PTlNFRUtFRCA9ICJvbnNlZWtlZCI7IC8vICVldmVudDsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfT05TRUVLSU5HID0gIm9uc2Vla2luZyI7IC8vICVldmVudDsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfT05TSE9XID0gIm9uc2hvdyI7IC8vICVldmVudDsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfT05TVEFMTEVEID0gIm9uc3RhbGxlZCI7IC8vICVldmVudDsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfT05TVVNQRU5EID0gIm9uc3VzcGVuZCI7IC8vICVldmVudDsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfT05USU1FX1VQREFURSA9ICJvbnRpbWV1cGRhdGUiOyAvLyAlZXZlbnQ7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX09OVk9MVU1FX1VQREFURSA9ICJvbnZvbHVtZXVwZGF0ZSI7IC8vICVldmVudDsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfT05XQUlUSU5HID0gIm9ud2FpdGluZyI7IC8vICVldmVudDsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFUVFJfTkFNRV9QSU5HID0gInBpbmciOwotCVN0cmluZyBBVFRSX05BTUVfQVVUT0ZPQ1VTID0gImF1dG9mb2N1cyI7Ci0JU3RyaW5nIEFUVFJfTkFNRV9DSEFMTEVOR0UgPSAiY2hhbGxlbmdlIjsKLQlTdHJpbmcgQVRUUl9OQU1FX0ZPUk0gPSAiZm9ybSI7Ci0JU3RyaW5nIEFUVFJfTkFNRV9LRVlUWVBFID0gImtleXR5cGUiOwotCVN0cmluZyBBVFRSX05BTUVfUkVRVUlSRUQgPSAicmVxdWlyZWQiOwotCVN0cmluZyBBVFRSX05BTUVfQVVUT0NPTVBMRVRFID0gImF1dG9jb21wbGV0ZSI7IC8vIGlucHV0Ci0JU3RyaW5nIEFUVFJfTkFNRV9NSU4gPSAibWluIjsgLy8gaW5wdXQKLQlTdHJpbmcgQVRUUl9OQU1FX01BWCA9ICJtYXgiOyAvLyBpbnB1dAotCVN0cmluZyBBVFRSX05BTUVfUEFUVEVSTiA9ICJwYXR0ZXJuIjsgLy8gaW5wdXQKLQlTdHJpbmcgQVRUUl9OQU1FX1NURVAgPSAic3RlcCI7IC8vIGlucHV0Ci0JU3RyaW5nIEFUVFJfTkFNRV9OT1ZBTElEQVRFID0gIm5vdmFsaWRhdGUiOyAvLyBmb3JtCi0JU3RyaW5nIEFUVFJfTkFNRV9GT1JNQUNUSU9OID0gImZvcm1hY3Rpb24iOyAvLyBpbnB1dHxidXR0b24KLQlTdHJpbmcgQVRUUl9OQU1FX0ZPUk1FTkNUWVBFID0gImZvcm1lbmN0eXBlIjsgLy8gaW5wdXR8YnV0dG9uCi0JU3RyaW5nIEFUVFJfTkFNRV9GT1JNTUVUSE9EID0gImZvcm1tZXRob2QiOyAvLyBpbnB1dHxidXR0b24KLQlTdHJpbmcgQVRUUl9OQU1FX0ZPUk1OT1ZBTElEQVRFID0gImZvcm1ub3ZhbGlkYXRlIjsgLy8gaW5wdXR8YnV0dG9uCi0JU3RyaW5nIEFUVFJfTkFNRV9GT1JNVEFSR0VUID0gImZvcm10YXJnZXQiOyAvLyBpbnB1dHxidXR0b24KLQlTdHJpbmcgQVRUUl9OQU1FX1NDT1BFRCA9ICJzY29wZWQiOyAvLyBzdHlsZQotCVN0cmluZyBBVFRSX05BTUVfQVNZTkMgPSAiYXN5bmMiOyAvLyBzY3JpcHQKLQlTdHJpbmcgQVRUUl9OQU1FX01BTklGRVNUID0gIm1hbmlmZXN0IjsgLy8gaHRtbAotCVN0cmluZyBBVFRSX05BTUVfU0laRVMgPSAic2l6ZXMiOyAvLyBsaW5rCi0JU3RyaW5nIEFUVFJfTkFNRV9SRVZFUlNFRCA9ICJyZXZlcnNlZCI7IC8vIG9sCi0JU3RyaW5nIEFUVFJfTkFNRV9TQU5EQk9YID0gInNhbmRib3giOyAvLyBpZnJhbWUKLQlTdHJpbmcgQVRUUl9OQU1FX1NFQU1MRVNTID0gInNlYW1sZXNzIjsgLy8gaWZyYW1lCi0JU3RyaW5nIEFUVFJfTkFNRV9TUkNET0MgPSAic3JjZG9jIjsgLy8gaWZyYW1lCi0JU3RyaW5nIEFUVFJfTkFNRV9QUkVMT0FEID0gInByZWxvYWQiOyAvLyAlbWVkaWFFbGVtZW50OyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9BVVRPUExBWSA9ICJhdXRvcGxheSI7IC8vICVtZWRpYUVsZW1lbnQ7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX0xPT1AgPSAibG9vcCI7IC8vICVtZWRpYUVsZW1lbnQ7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX0NPTlRST0xTID0gImNvbnRyb2xzIjsgLy8gJW1lZGlhRWxlbWVudDsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfUE9TVEVSID0gInBvc3RlciI7IC8vICV2aWRlbzsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfT1BFTiA9ICJvcGVuIjsgLy8gZGV0YWlscyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9QVUJEQVRFID0gInB1YmRhdGUiOyAvL3RpbWUgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfTE9XID0gImxvdyI7IC8vbWV0ZXIgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfSElHSCA9ICJoaWdoIjsgLy9tZXRlciAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9PUFRJTVVNID0gIm9wdGltdW0iOyAvL21ldGVyIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX0lDT04gPSAiaWNvbiI7IC8vY29tbWFuZCAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9SQURJT0dST1VQID0gInJhZGlvZ3JvdXAiOyAvL2NvbW1hbmQgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfTElTVCA9ICJsaXN0IjsgLy9pbnB1dCAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9QTEFDRUhPTERFUiA9ICJwbGFjZWhvbGRlciI7IC8vaW5wdXQgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfV1JBUCA9ICJ3cmFwIjsgLy90ZXh0YXJlYSAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9YTUxOUyA9ICJ4bWxucyI7IC8vaHRtbCAvLyROT04tTkxTLTEkCi0JCi0JLy8gR2xvYmFsIGF0dHJpYnV0ZXMgcHJvcGVydGllcwotCi0JLy8gZm9yIGNvbnRlbnRlZGl0YWJsZSAoRU1QVFl8VFJVRXxGQUxTRXxJTkhFUklUKQotCVN0cmluZyBBVFRSX1ZBTFVFX0VNUFRZID0gIiI7IC8vIGNvbnRlbnRlZGl0YWJsZSAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfVkFMVUVfSU5IRVJJVCA9ICJpbmhlcml0IjsgLy8gY29udGVudGVkaXRhYmxlIC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBmb3IgTWVkaWFFbGVtZW50IChBdWRpby9WaWRlbykgCi0JU3RyaW5nIEFUVFJfVkFMVUVfTUVUQURBVEEgPSAibWV0YWRhdGEiOyAvLyBtZWRpYWVsZW1lbnQgLy8kTk9OLU5MUy0xJAotCQotCS8vIGZvciBDb21tYW5kCi0JU3RyaW5nIEFUVFJfVkFMVUVfQ09NTUFORCA9ICJjb21tYW5kIjsgLy9jb21tYW5kIC8vJE5PTi1OTFMtMSQKLQkKLQkvL0lucHV0IHR5cGUKLQlTdHJpbmcgQVRUUl9WQUxVRV9TRUFSQ0ggPSAic2VhcmNoIjsgLy9pbnB1dCB0eXBlIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9WQUxVRV9URUwgPSAidGVsIjsgLy9pbnB1dCB0eXBlIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9WQUxVRV9VUkwgPSAidXJsIjsgLy9pbnB1dCB0eXBlIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9WQUxVRV9FTUFJTCA9ICJlbWFpbCI7IC8vaW5wdXQgdHlwZSAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfVkFMVUVfREFURSA9ICJkYXRlIjsgLy9pbnB1dCB0eXBlIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9WQUxVRV9EQVRFVElNRSA9ICJkYXRldGltZSI7IC8vaW5wdXQgdHlwZSAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfVkFMVUVfTU9OVEggPSAibW9udGgiOyAvL2lucHV0IHR5cGUgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX1ZBTFVFX1dFRUsgPSAid2VlayI7IC8vaW5wdXQgdHlwZSAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfVkFMVUVfVElNRSA9ICJ0aW1lIjsgLy9pbnB1dCB0eXBlIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9WQUxVRV9EQVRFVElNRV9MT0NBTCA9ICJkYXRldGltZS1sb2NhbCI7IC8vaW5wdXQgdHlwZSAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfVkFMVUVfUkFOR0UgPSAicmFuZ2UiOyAvL2lucHV0IHR5cGUgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX1ZBTFVFX0NPTE9SID0gImNvbG9yIjsgLy9pbnB1dCB0eXBlIC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgQVRUUl9WQUxVRV9PTiA9ICJvbiI7IC8vaW5wdXQgYXV0b2NvbXBsZXRlIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9WQUxVRV9PRkYgPSAib2ZmIjsgLy9pbnB1dCBhdXRvY29tcGxldGUgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBBVFRSX1ZBTFVFX1BVVCA9ICJQVVQiOyAvL2lucHV0IGZvcm1tZXRob2QgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX1ZBTFVFX0RFTEVURSA9ICJERUxFVEUiOyAvL2lucHV0IGZvcm1tZXRob2QgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBBVFRSX1ZBTFVFX0ZPUk1fREFUQSA9ICJtdWx0aXBhcnQvZm9ybS1kYXRhIjsgLy9pbnB1dCBmb3JtZW5jVHlwZSAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfVkFMVUVfUExBSU4gPSAidGV4dC9wbGFpbiI7IC8vaW5wdXQgZm9ybWVuY1R5cGUgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBBVFRSX1ZBTFVFX1NPRlQgPSAic29mdCI7IC8vdGV4dGFyZWEgd3JhcCAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfVkFMVUVfSEFSRCA9ICJoYXJkIjsgLy90ZXh0YXJlYSB3cmFwIC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlTdHJpbmcgQVRUUl9WQUxVRV9DT05URVhUID0gImNvbnRleHQiOyAvL21lbnUgdHlwZSAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfVkFMVUVfVE9PTEJBUiA9ICJ0b29sYmFyIjsgLy9tZW51IHR5cGUgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX1ZBTFVFX0xJU1QgPSAibGlzdCI7IC8vbWVudSB0eXBlIC8vJE5PTi1OTFMtMSQKLQkJCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSFRNTENNUHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxDTVByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA5ODcyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSFRNTENNUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0KLS8qKgotICogSFRNTENNUHJvcGVydGllcyBkZWZpbmVzIGFsbCBwcm9wZXJ0eSBuYW1lcyBhbmQgcHJlLWRlZmluZWQgdmFsdWVzIGluIEhUTUwgQ00uCi0gKiBBbGwgb2YgdGhvc2UgcHJvcGVydGllcyBjYW4gYmUgcmV0cmVpdmVkIGZyb20gZWxlbWVudCBkZWNsYXJhdGlvbnMgb2YgSFRNTCBDTQotICogdmlhIENNTm9kZSNnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcE5hbWUpLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxDTVByb3BlcnRpZXMgewotCi0JLyoqCi0JICogInNob3VsZElnbm9yZUNhc2UiIHJldHVybnMgamF2YS5sYW5nLkJvb2xlYW4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1VMRF9JR05PUkVfQ0FTRSA9ICJzaG91bGRJZ25vcmVDYXNlIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogInNob3VsZEtlZXBTcGFjZSIgcmV0dXJucyBqYXZhLmxhbmcuQm9vbGVhbiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPVUxEX0tFRVBfU1BBQ0UgPSAic2hvdWxkS2VlcFNwYWNlIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogImluZGVudENoaWxkU291cmNlIiByZXR1cm5zIGphdmEubGFuZy5Cb29sZWFuIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9VTERfSU5ERU5UX0NISUxEX1NPVVJDRSA9ICJzaG91bGRJbmRlbnRDaGlsZFNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJ0ZXJtaW5hdG9ycyIgcmV0dXJucyBqYXZhLnV0aWwuSXRlcmF0b3IgKGFuIGFycmF5IG9mIFN0cmluZyBvYmplY3RzKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNSU5BVE9SUyA9ICJ0ZXJtaW5hdG9ycyI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJjb250ZW50SGludCIgcmV0dXJucyBDTUVsZW1lbnREZWNsYXJhdGlvbiBpbnN0bmFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0hJTlQgPSAiY29udGVudEhpbnQiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAicHJvaGliaXRlZEFuY2VzdG9ycyIgcmV0dXJucyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0hJQklURURfQU5DRVNUT1JTID0gInByb2hpYml0ZWRBbmNlc3RvcnMiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAiaXNKU1AiIHJldHVybnMgamF2YS5sYW5nLkJvb2xlYW4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX0pTUCA9ICJpc0pTUCI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJpc1hIVE1MIiByZXR1cm5zIGphdmEubGFuZy5Cb29sZWFuIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19YSFRNTCA9ICJpc1hIVE1MIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogImlzU1NJIiByZXR1cm5zIGphdmEubGFuZy5Cb29sZWFuIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19TU0kgPSAiaXNTU0kiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAibGluZUJyZWFrSGludCIgcmV0dXJucyBTdHJpbmcgKG9uZSBvZiBwcmUtZGVmaW5lZCB2YWx1ZXMgaW4gVmFsdWVzKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0JSRUFLX0hJTlQgPSAibGluZUJyZWFrSGludCI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJsYXlvdXRUeXBlIiByZXR1cm5zIFN0cmluZyAob25lIG9mIHByZS1kZWZpbmVkIHZhbHVlcyBpbiBWYWx1ZXMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9UWVBFID0gImxheW91dFR5cGUiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAidGFnSW5mbyIgcmV0dXJucyBTdHJpbmcgKGRvY3VtZW50YXRpb24gZm9yIHRoaXMgZWxlbWVudCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHSU5GTyA9ICJ0YWdJbmZvIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogIm9taXRUeXBlIiByZXR1cm5zIFN0cmluZyAob25lIG9mIHByZS1kZWZpbmVkIHZhbHVlcyBpbiBWYWx1ZXMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSVRfVFlQRSA9ICJvbWl0VHlwZSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJpbmNsdXNpb24iIHJldHVybnMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVTSU9OID0gImluY2x1c2lvbiI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJpc1NjcmlwdGFibGUiIHJldHVybnMgamF2YS5sYW5nLkJvb2xlYW4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1NDUklQVEFCTEUgPSAiaXNTY3JpcHRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJpc09ic29sZXRlIiByZXR1cm5zIGphdmEubGFuZy5Cb29sZWFuIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19PQlNPTEVURSA9ICJpc09ic29sZXRlIjsvLyROT04tTkxTLTEkCi0JCi0KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWx1ZXMgewotCQkvKgotCQkgKiBmb3IgTElORV9CUkVBS19ISU5UID0gImxpbmVCcmVha0hpbnQiLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJFQUtfTk9ORSA9ICJicmVha05vbmUiOy8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJFQUtfQUZURVJfU1RBUlQgPSAiYnJlYWtBZnRlclN0YXJ0IjsvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EID0gImJyZWFrQmVmb3JlU3RhcnRBbmRBZnRlckVuZCI7Ly8kTk9OLU5MUy0xJAotCQkvKgotCQkgKiBmb3IgTEFZT1VUX1RZUEUgPSAibGF5b3V0VHlwZSIKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9CTE9DSyA9ICJsYXlvdXRCbG9jayI7Ly8kTk9OLU5MUy0xJAotCQkvKiogQlIgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX0JSRUFLID0gImxheW91dEJyZWFrIjsvLyROT04tTkxTLTEkCi0JCS8qKiBIaWRkZW4gb2JqZWN0OyBsaWtlIEhUTUwgb3IgSEVBRCAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfSElEREVOID0gImxheW91dEhpZGRlbiI7Ly8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfTk9ORSA9ICJsYXlvdXROb25lIjsvLyROT04tTkxTLTEkCi0JCS8qKiBObyB3cmFwIG9iamVjdDsgbGlrZSBJTUcsIEFQUExFVCwuLi4gKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX09CSkVDVCA9ICJsYXlvdXRPYmplY3QiOy8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1dSQVAgPSAibGF5b3V0V3JhcCI7Ly8kTk9OLU5MUy0xJAotCQkvKgotCQkgKiBmb3IgT01JVF9UWVBFID0gIm9taXRUeXBlIgotCQkgKi8KLQkJLyoqIE5vdCBvbW1pc2libGUuICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSVRfTk9ORSA9ICJvbWl0Tm9uZSI7Ly8kTk9OLU5MUy0xJAotCQkvKiogQm90aCB0YWdzIGFyZSBvbW1pc2libGUuICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSVRfQk9USCA9ICJvbWl0Qm90aCI7Ly8kTk9OLU5MUy0xJAotCQkvKiogVGhlIGVuZCB0YWcgaXMgb21taXNpYmxlLiAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTUlUX0VORCA9ICJvbWl0RW5kIjsvLyROT04tTkxTLTEkCi0JCS8qKiBUaGUgZW5kIHRhZyBpcyBvbW1pdHRlZCB3aGVuIGNyZWF0ZWQuICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSVRfRU5EX0RFRkFVTFQgPSAib21pdEVuZERlZmF1bHQiOy8vJE5PTi1OTFMtMSQKLQkJLyoqIFRoZSBlbmQgdGFnIG11c3QgYmUgb21pdHRlZC4gKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT01JVF9FTkRfTVVTVCA9ICJvbWl0RW5kTXVzdCI7Ly8kTk9OLU5MUy0xJAotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxGaWxlc1ByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxGaWxlc1ByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGJiMmVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MRmlsZXNQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBub3QgdXNlZCBpbiBXVFAKLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MRmlsZXNQcmVmZXJlbmNlTmFtZXMgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NVRkZJWCA9ICJkZWZhdWx0U3VmZml4IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1NVRkZJWCA9ICJodG1sIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURV9ET0NVTUVOVF9UWVBFID0gImdlbmVyYXRlRG9jdW1lbnRUeXBlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURV9HRU5FUkFUT1IgPSAiZ2VuZXJhdGVHZW5lcmF0b3IiOy8vJE5PTi1OTFMtMSQKLQkvLyBhZGRlZCB0aGlzIGFzIGEgcG90ZW50aWFsIHdheSB0byBoYW5kbGUgY2hhbmdpbmcKLQkvLyBwcm9kdWN0IG5hbWVzICJ1cCIgdGhlIHN0YWNrLiBOb3RlLCBub3QgZGVjbGFyZWQgZmluYWwgCi0JLy8gdG8gYXZvaWQgZ2V0dGluZyAnaW5saW5lZCcgYnkgY29tcGlsZXIuCi0Jc3RhdGljIElQcm9kdWN0IHByb2R1Y3QgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCk7Ci0JLy8gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpIGlzIHNwZWMnZCBzbyBpdCBtaWdodCByZXR1cm4gbnVsbC4KLQkvLyBJdHMgZXhwZWN0ZWQgZm9yIGFueSBmaW5hbCBwcm9kdWN0IGl0IHdvdWxkIG5vdCBiZSwgc28gd2UnbGwgcmV0dXJuIAotCS8vICJXVFAiIGZvciBkZXZlbG9wbWVudC9pbnRlcmltIGJ1aWxkcy4gTm8gbmVlZCB0byB0cmFuc2xhdGUuIAotCXN0YXRpYyBTdHJpbmcgR0VORVJBVE9SID0gKHByb2R1Y3QgPT0gbnVsbCkgPyAiV1RQIjogcHJvZHVjdC5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MRm9ybWF0Q29udHJhaW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxGb3JtYXRDb250cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMzIxN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxGb3JtYXRDb250cmFpbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKiBQbGVhc2UgdW4tZGVwcmVjYXRlIHRoaXMgaWYgUGFnZSBEZXNpZ25lciB0aGlua3MgdGhleSBhcmUgbmVlZGVkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxGb3JtYXRDb250cmFpbnRzIGV4dGVuZHMgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIHsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqIAlJdCdzIHZlcnkgaGFyZCB0byBrZWVwIHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCBhY2N1cmF0ZS4KLQkgKiAJU29tZXRpbWVzIGEgbm9kZSB3YW50cyB0byBzdGFydCBvbiBhIG5ldyBsaW5lLCBzb21ldGltZXMgaXQgZG9lc24ndC4KLQkgKiAJSXQncyBiZXN0IGZvciB0aGUgbm9kZSB0byBmaWd1cmUgb3V0IHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCBvbiB0aGUgZmx5LgotCSAqLwotCWludCBnZXRBdmFpbGFibGVMaW5lV2lkdGgoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogCUl0J3MgdmVyeSBoYXJkIHRvIGtlZXAgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIGFjY3VyYXRlLgotCSAqIAlTb21ldGltZXMgYSBub2RlIHdhbnRzIHRvIHN0YXJ0IG9uIGEgbmV3IGxpbmUsIHNvbWV0aW1lcyBpdCBkb2Vzbid0LgotCSAqIAlJdCdzIGJlc3QgZm9yIHRoZSBub2RlIHRvIGZpZ3VyZSBvdXQgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIG9uIHRoZSBmbHkuCi0JICovCi0Jdm9pZCBzZXRBdmFpbGFibGVMaW5lV2lkdGgoaW50IGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMTAxOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1ByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLQotcHVibGljIGludGVyZmFjZSBQcmVmZXJlbmNlTmFtZXMgewotCi0JU3RyaW5nIFRSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFlFUyA9ICJ5ZXMiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE5PID0gIm5vIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlTdHJpbmcgU0VUVElOR1MgPSAic2V0dGluZ3MiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVFJFRVZJRVcgPSAidHJlZXZpZXciOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFRkFVTFRfREVQVEggPSAiZGVmYXVsdGRlcHRoIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFTSVMgPSAiYXMtaXMiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIExPV0VSID0gImxvd2VyIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBVUFBFUiA9ICJ1cHBlciI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBQUkVGRVJSRURfQ0FTRSA9ICJwcmVmZXJyZWQtY2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEFHTkFNRSA9ICJ0YWduYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSSUJVVEVOQU1FID0gImF0dHJpYnV0ZW5hbWUiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUZhbWlseUZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUZhbWlseUZvckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVmMTdmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVGYW1pbHlGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLQotLyoqCi0gKiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4KLSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBzZXQgd2l0aCBkZWZhdWx0IHByb3RlY3RlZAotICogbWV0aG9kIHNvIGl0IHdpbGwgbm90IGJlIGlubGluZWQuCi0gKi8KLQotcHVibGljIGNsYXNzIENvbnRlbnRUeXBlRmFtaWx5Rm9ySFRNTCB7Ci0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZCBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluCi0JICogcGx1Z2luLnhtbCBmaWxlLiBOb3RlOiB0aGlzIHZhbHVlIGlzIGludGVudGlhbGx5IG5vdCBkZWNsYXJlZCBhcyBmaW5hbCwKLQkgKiBzbyBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhUTUxfRkFNSUxZID0gZ2V0Q29uc3RhbnRTdHJpbmcoKTsKLQotCS8qKgotCSAqIERvbid0IGFsbG93IGluc3RhbnRpYXRpb24uCi0JICovCi0JcHJpdmF0ZSBDb250ZW50VHlwZUZhbWlseUZvckhUTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRDb25zdGFudFN0cmluZygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRmYW1pbHkuaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NDkxMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlOwotCi0vKioKLSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotICogcGx1Z2luLnhtbCBmaWxlLiBOb3RlOiB0aGlzIHZhbHVlIGlzIGludGVudGlhbGx5IHNldCB3aXRoIGRlZmF1bHQgcHJvdGVjdGVkCi0gKiBtZXRob2Qgc28gaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ29udGVudFR5cGVJZEZvckhUTUwgewotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotCSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBub3QgZGVjbGFyZWQgYXMgZmluYWwsCi0JICogc28gaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDb250ZW50VHlwZUlEX0hUTUwgPSBnZXRDb25zdGFudFN0cmluZygpOwotCi0JLyoqCi0JICogRG9uJ3QgYWxsb3cgaW5zdGFudGlhdGlvbi4KLQkgKi8KLQlwcml2YXRlIENvbnRlbnRUeXBlSWRGb3JIVE1MKCkgewotCQlzdXBlcigpOwotCX0KLQotCXN0YXRpYyBTdHJpbmcgZ2V0Q29uc3RhbnRTdHJpbmcoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUhUTUxQYXJ0aXRpb25UeXBlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUhUTUxQYXJ0aXRpb25UeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGY2MWRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lIVE1MUGFydGl0aW9uVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbgotICogdHlwZXMgZm9yIEhUTUwuIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkCi0gKiBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9ucwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIVE1MUGFydGl0aW9uVHlwZXMgewotCi0JU3RyaW5nIEhUTUxfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEhUTUxfREVDTEFSQVRJT04gPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUNMQVJBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSFRNTF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBTQ1JJUFQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTVFlMRSA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5TVFlMRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIElTU1VFOiBJIHRoaW5rIG1ldGEgdGFnIGFyZWFzIGFyZSBoZXJlIHRvbz8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWIzZTM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXh0LklDU1NQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LklSZWdpb25Db21wYXJpYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLklTdHJ1Y3R1cmVkVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuU2NyaXB0TGFuZ3VhZ2VLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUw7Ci0KLS8qKgotICogRG9jdW1lbnQgcGFydGl0aW9uZXIgZm9yIEhUTUwuIENsaWVudC1zaWRlIHNjcmlwdHMgb2YgdHlwZSBKYXZhU2NyaXB0IGFyZQotICogcmVwb3J0ZWQgYXMgU1RfU0NSSVBULCBhbGwgb3RoZXJzIGZvciA8c2NyaXB0IGxhbmd1YWdlPSJmb28iIHR5cGU9ImZvbzIiPgotICogYXMgU0NSSVBULmxhbmd1YWdlOkZPTyBhbmQgU0NSSVBULnR5cGU6Rk9PMi4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MIGV4dGVuZHMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIGNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW117SUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCwgSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVDTEFSQVRJT04sIElIVE1MUGFydGl0aW9ucy5IVE1MX0NPTU1FTlQsIElIVE1MUGFydGl0aW9ucy5TQ1JJUFQsIElDU1NQYXJ0aXRpb25zLlNUWUxFLElIVE1MUGFydGl0aW9ucy5TQ1JJUFRfRVZFTlRIQU5ETEVSfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFTQ1JJUFQgPSAiamF2YXNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBU0NSSVBUX0FQUExJQ0FUSU9OID0gImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFVkVOVF9BVFRSSUJVVEVfTkFNRVMgPSAKLQkJe0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05DTElDSywgCi0JCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05EQkxDTElDSywKLQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTk1PVVNFRE9XTiwKLQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTk1PVVNFVVAsCi0JCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05NT1VTRU9WRVIsCi0JCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05NT1VTRU1PVkUsCi0JCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05NT1VTRU9VVCwKLQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTktFWVBSRVNTLAotCQlIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OS0VZRE9XTiwKLQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTktFWVVQLAotCQlIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OSEVMUCwKLQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkJMVVIsCi0JCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05GT0NVUywKLQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkxPQUQsCi0JCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05VTkxPQUQsCi0JCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05TVUJNSVR9OwotCQotCS8qKiBhcnJheSBvZiBzdHlsZSBhdHRyaWJ1dGUgbmFtZXMgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVFlMRV9BVFRSSUJVVEVfTkFNRVMgPSAge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1RZTEV9OwotCQotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBjcmVhdGVQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBzdHlwZSA9IGdldFNjcmlwdGluZ1BhcnRpdGlvblR5cGUobm9kZSk7Ci0JCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgc3R5cGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVQYXJ0aXRpb24ob2Zmc2V0LCBsZW5ndGgsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEludGVybmFsUGFydGl0aW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0eXBlKSB7Ci0JCVN0cmluZyBsb2NhbFR5cGUgPSB0eXBlOwotCQlpZiAodHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJbG9jYWxUeXBlID0gZ2V0U2NyaXB0aW5nUGFydGl0aW9uVHlwZShub2RlKTsKLQkJCX0KLQkJfQotCQlzdXBlci5zZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgbG9jYWxUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTY3JpcHRpbmdQYXJ0aXRpb25UeXBlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29yZU5vZGUpIHsKLQkJU3RyaW5nIGxhbmd1YWdlID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gY29yZU5vZGU7Ci0JCUlUZXh0UmVnaW9uIGF0dHJOYW1lUmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiBpc1ZhbGlkU2NyaXB0aW5nUmVnaW9uVHlwZShub2RlLmdldFR5cGUoKSkpIHsKLQkJCW5vZGUgPSBub2RlLmdldFByZXZpb3VzKCk7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucy5zaXplKCkgPiA0ICYmIHJlZ2lvbnMuZ2V0KDEpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJSVRleHRSZWdpb24gcG90ZW50aWFsTGFuZ3VhZ2VSZWdpb24gPSByZWdpb25zLmdldCgxKTsKLQkJCVN0cmluZyBwb3RlbnRpYWxMYW5ndWFnZVN0cmluZyA9IG5vZGUuZ2V0VGV4dChwb3RlbnRpYWxMYW5ndWFnZVJlZ2lvbik7Ci0JCQlpZiAocG90ZW50aWFsTGFuZ3VhZ2VTdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJCQlhdHRyTmFtZVJlZ2lvbiA9IHJlZ2lvbjsKLQkJCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBub2RlLmdldFRleHQoYXR0ck5hbWVSZWdpb24pOwotCQkJCQkJaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MQU5HVUFHRSkpCi0JCQkJCQkJbGFuZ3VhZ2UgPSBTdHJpbmdVdGlscy5zdHJpcChub2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQkJCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSkpIHsKLQkJCQkJCQl0eXBlID0gU3RyaW5nVXRpbHMuc3RyaXAobm9kZS5nZXRUZXh0KHJlZ2lvbikpOwotCQkJCQkJCS8qCi0JCQkJCQkJICogQXZvaWQgcGFydGl0aW9uIG5hbWVzIGJ1aWx0IHdpdGggTUlNRSBzdWJ0eXBlcywKLQkJCQkJCQkgKiBlLmcuIHR5cGU9InRleHQvamF2YXNjcmlwdDtlNHg9MSIKLQkJCQkJCQkgKi8KLQkJCQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWludCBpbmRleCA9IHR5cGUuaW5kZXhPZignOycpOwotCQkJCQkJCQlpZiAoaW5kZXggPiAxKQotCQkJCQkJCQkJdHlwZSA9IHR5cGUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlhdHRyTmFtZVJlZ2lvbiA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHR5cGUgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IGxvb2t1cFNjcmlwdFR5cGUodHlwZSk7Ci0JCWVsc2UgaWYgKGxhbmd1YWdlICE9IG51bGwpCi0JCQlyZXN1bHQgPSBsb29rdXBTY3JpcHRMYW5ndWFnZShsYW5ndWFnZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRTY3JpcHRpbmdSZWdpb25UeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4gfHwgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlmU3VwcG9ydGVkVHlwZXMgPSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgbG9va3VwU2NyaXB0VHlwZShTdHJpbmcgdHlwZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUX01JTUVfVFlQRV9LRVlTLmxlbmd0aDsgaSsrKQotCQkJaWYgKFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUX01JTUVfVFlQRV9LRVlTW2ldLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpCi0JCQkJcmV0dXJuIElIVE1MUGFydGl0aW9ucy5TQ1JJUFQ7Ci0JCXJldHVybiBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUICsgIi50eXBlLiIgKyB0eXBlLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgU3RyaW5nIGxvb2t1cFNjcmlwdExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVMubGVuZ3RoOyBpKyspCi0JCQlpZiAoU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkFTQ1JJUFRfTEFOR1VBR0VfS0VZU1tpXS5lcXVhbHNJZ25vcmVDYXNlKGxhbmd1YWdlKSkKLQkJCQlyZXR1cm4gSUhUTUxQYXJ0aXRpb25zLlNDUklQVDsKLQkJcmV0dXJuIElIVE1MUGFydGl0aW9ucy5TQ1JJUFQgKyAiLmxhbmd1YWdlLiIgKyBsYW5ndWFnZS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4gfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFKQotCQkJcmVzdWx0ID0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfQ09NTUVOVDsKLQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTikKLQkJCXJlc3VsdCA9IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFQ0xBUkFUSU9OOwotCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUgJiYgaXNTY3JpcHRBdHRyaWJ1dGVWYWx1ZShyZWdpb24sIG9mZnNldCkpCi0JCQlyZXN1bHQgPSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUX0VWRU5USEFORExFUjsKLQkJZWxzZSBpZiAoaXNTdHlsZUF0dHJpYnV0ZVZhbHVlKHJlZ2lvbiwgb2Zmc2V0KSkKLQkJCXJlc3VsdCA9IElDU1NQYXJ0aXRpb25zLlNUWUxFOwotCQllbHNlCi0JCQlyZXN1bHQgPSBzdXBlci5nZXRQYXJ0aXRpb25UeXBlKHJlZ2lvbiwgb2Zmc2V0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNOb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlKSB7Ci0JCQotCQlJVGV4dFJlZ2lvbiBwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIG5leHRFbmRUYWdOYW1lUmVnaW9uID0gbnVsbDsKLQkJCi0JCUlUZXh0UmVnaW9uW10gcmVnaW9ucyA9IHByZXZpb3VzTm9kZS5nZXRSZWdpb25zKCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJcHJldmlvdXNTdGFydFRhZ05hbWVSZWdpb24gPSByZWdpb25zW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJlZ2lvbnMgPSBuZXh0Tm9kZS5nZXRSZWdpb25zKCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJbmV4dEVuZFRhZ05hbWVSZWdpb24gPSByZWdpb25zW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlpZihwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbiA9PSBudWxsIHx8IG5leHRFbmRUYWdOYW1lUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVDsKLQkJCi0JCVN0cmluZyBuYW1lMSA9IHByZXZpb3VzTm9kZS5nZXRUZXh0KHByZXZpb3VzU3RhcnRUYWdOYW1lUmVnaW9uKTsKLQkJU3RyaW5nIG5hbWUyID0gbmV4dE5vZGUuZ2V0VGV4dChuZXh0RW5kVGFnTmFtZVJlZ2lvbik7Ci0JCWlmIChuYW1lMS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQpICYmIG5hbWUyLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVCkpCi0JCQkvLwkJCXJldHVybiBTVF9TQ1JJUFQ7Ci0JCQlyZXR1cm4gZ2V0U2NyaXB0aW5nUGFydGl0aW9uVHlwZShmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHByZXZpb3VzTm9kZS5nZXRTdGFydE9mZnNldChwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbikpKTsKLQkJZWxzZSBpZiAobmFtZTEuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpICYmIG5hbWUyLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFKSkKLQkJCXJldHVybiBJQ1NTUGFydGl0aW9ucy5TVFlMRTsKLQkJcmV0dXJuIHN1cGVyLmdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKHByZXZpb3VzTm9kZSwgbmV4dE5vZGUpOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKEZvcmVpZ25SZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyB0YWduYW1lID0gcmVnaW9uLmdldFN1cnJvdW5kaW5nVGFnKCk7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyB0YWduYW1lIHNob3VsZCBub3QgYmUgbnVsbCwKLQkJLy8gYnV0IHNlZSBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDkxMQotCQlpZiAodGFnbmFtZSA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRVbmtub3duKCk7Ci0JCX0KLQkJZWxzZSBpZiAodGFnbmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQpKQotCQkJcmVzdWx0ID0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVDsKLQkJZWxzZSBpZiAodGFnbmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSkgfHwgaXNTdHlsZUF0dHJpYnV0ZVZhbHVlKHJlZ2lvbixvZmZzZXQpKQotCQkJcmVzdWx0ID0gSUNTU1BhcnRpdGlvbnMuU1RZTEU7Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSAmJiBpc1NjcmlwdEF0dHJpYnV0ZVZhbHVlKHJlZ2lvbiwgb2Zmc2V0KSkKLQkJCXJlc3VsdCA9IElIVE1MUGFydGl0aW9ucy5TQ1JJUFRfRVZFTlRIQU5ETEVSOwotCQllbHNlCi0JCQlyZXN1bHQgPSBzdXBlci5nZXRQYXJ0aXRpb25UeXBlKHJlZ2lvbiwgb2Zmc2V0KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKSB7Ci0JCXJldHVybiBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBjb25maWd1cmVkQ29udGVudFR5cGVzOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNTY3JpcHRBdHRyaWJ1dGVWYWx1ZShJVGV4dFJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpIHsKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gaXNBdHRyaWJ1dGVOYW1lRm9yVmFsdWVJbkFycmF5KEVWRU5UX0FUVFJJQlVURV9OQU1FUywgcmVnaW9uLCBvZmZzZXQpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcmVnaW9uIHtAbGluayBJVGV4dFJlZ2lvbn0gY29udGFpbmluZyA8Y29kZT5vZmZzZXQ8L2NvZGU+Ci0JICogQHBhcmFtIG9mZnNldCBvZmZzZXQgaW4gdGhlIGdpdmVuIDxjb2RlPnJlZ2lvbjwvY29kZT4gdG8gY2hlY2sgaWYgaXQgaXMgaW4KLQkgKiB0aGUgYXR0cmlidXRlIHZhbHVlIHJlZ2lvbiBvZiBhIHN0eWxlIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIG9mZnNldCBpbiB0aGUgZ2l2ZW4gcmVnaW9uIGlzCi0JICogaW4gdGhlIHZhbHVlIHJlZ2lvbiBvZiBhIHN0eWxlIGF0dHJpYnV0ZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1N0eWxlQXR0cmlidXRlVmFsdWUoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCWJvb2xlYW4gaXNTdHlsZUF0dHJpYnV0ZVZhbHVlID0gZmFsc2U7Ci0JCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWlzU3R5bGVBdHRyaWJ1dGVWYWx1ZSA9IGlzQXR0cmlidXRlTmFtZUZvclZhbHVlSW5BcnJheShTVFlMRV9BVFRSSUJVVEVfTkFNRVMsIHJlZ2lvbiwgb2Zmc2V0KTsKLQkJfQotCi0JCXJldHVybiBpc1N0eWxlQXR0cmlidXRlVmFsdWU7Ci0JfQotCQotCS8qKgotCSAqIDxwPmRldGVybWluZXMgaWYgdGhlIGF0dHJpYnV0ZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlIHJlZ2lvbgotCSAqIGlzIGluIHRoZSBnaXZlbiBhcnJheSBvZiBhdHRyaWJ1dGUgbmFtZXM8L3A+Ci0JICogCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWVzIGRldGVybWluZSBpZiB0aGUgYXR0cmlidXRlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvZmZzZXQKLQkgKiBpcyBpbiB0aGlzIGFycmF5IG9mIGF0dHJpYnV0ZSBuYW1lcwotCSAqIEBwYXJhbSBhdHRyVmFsdWVSZWdpb24ge0BsaW5rIElUZXh0UmVnaW9ufSBvZiB0aGUgYXR0cmlidXRlIHJlZ2lvbiBjb250YWluaW5nIHRoZSBnaXZlbiBvZmZzZXQKLQkgKiBAcGFyYW0gb2Zmc2V0IG9mZnNldCBpbiBhbiBhdHRyaWJ1dGUgcmVnaW9uIHRvIGRldGVybWluZSBpZiBpdCBpcyBpbiB0aGUgbGlzdCBvZiBnaXZlbiBhdHRyaWJ1dGUgbmFtZXMKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhdHRyaWJ1dGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG9mZnNldCBpcyBpbiB0aGUgZ2l2ZW4KLQkgKiBsaXN0IG9mIGF0dHJpYnV0ZSBuYW1lcywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0F0dHJpYnV0ZU5hbWVGb3JWYWx1ZUluQXJyYXkoU3RyaW5nW10gYXR0cmlidXRlTmFtZXMsIElUZXh0UmVnaW9uIGF0dHJWYWx1ZVJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0ID0gbm9kZS5nZXRSZWdpb25zKCk7Ci0JCWludCBjdXJyZW50SW5kZXggPSByZWdpb25MaXN0LmluZGV4T2YoYXR0clZhbHVlUmVnaW9uKTsKLQkJCi0JCS8qCi0JCSAqIDQgaXMgdGhlIG1pbmltdW0gaW5kZXggYWxsb3dpbmcgZm9yIHRoZSB0YWcncyBvcGVuLCBuYW1lLCBhdHRyaWJ1dGUKLQkJICogbmFtZSBhbmQgZXF1YWxzIGNoYXJhY3RlciB0byBhcHBlYXIgZmlyc3QKLQkJICovCi0JCWlmIChjdXJyZW50SW5kZXggPCA0KQotCQkJcmV0dXJuIGZhbHNlOwotCQlJVGV4dFJlZ2lvbiB0YWdBdHRyTmFtZVJlZ2lvbiA9IHJlZ2lvbkxpc3QuZ2V0KGN1cnJlbnRJbmRleCAtIDIpOwotCQkKLQkJYm9vbGVhbiBmb3VuZEF0dHJpYnV0ZU5hbWUgPSBmYWxzZTsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgaW5zdGFuY2VvZiBJUmVnaW9uQ29tcGFyaWJsZSkgewotCQkJaW50IHN0YXJ0ID0gbm9kZS5nZXRTdGFydE9mZnNldCh0YWdBdHRyTmFtZVJlZ2lvbik7Ci0JCQlmb3IgKGludCBpID0gMDsgIWZvdW5kQXR0cmlidXRlTmFtZSAmJiBpIDwgYXR0cmlidXRlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlmb3VuZEF0dHJpYnV0ZU5hbWUgPSAoKElSZWdpb25Db21wYXJpYmxlKSBmU3RydWN0dXJlZERvY3VtZW50KS5yZWdpb25NYXRjaGVzSWdub3JlQ2FzZShzdGFydCwgdGFnQXR0ck5hbWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBhdHRyaWJ1dGVOYW1lc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgdGFnQXR0ck5hbWUgPSBub2RlLmdldFRleHQodGFnQXR0ck5hbWVSZWdpb24pOwotCQkJZm91bmRBdHRyaWJ1dGVOYW1lID0gU3RyaW5nVXRpbHMuY29udGFpbnMoYXR0cmlidXRlTmFtZXMsIHRhZ0F0dHJOYW1lLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIGZvdW5kQXR0cmlidXRlTmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQWJzdHJhY3RFcnJvckluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9BYnN0cmFjdEVycm9ySW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTlkODVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9BYnN0cmFjdEVycm9ySW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuRXJyb3JJbmZvOwotCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVycm9ySW5mbyBpbXBsZW1lbnRzIEVycm9ySW5mbywgRXJyb3JTdGF0ZSB7Ci0KLQotCXByaXZhdGUgaW50IHN0YXRlID0gTk9ORV9FUlJPUjsKLQlwcml2YXRlIFNlZ21lbnQgc2VnID0gbnVsbDsKLQotCXB1YmxpYyBBYnN0cmFjdEVycm9ySW5mbyhpbnQgc3RhdGUsIFNlZ21lbnQgc2VnKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQkJdGhpcy5zZWcgPSBzZWc7Ci0JfQotCi0JYWJzdHJhY3QgcHVibGljIFN0cmluZyBnZXRIaW50KCk7Ci0KLQlhYnN0cmFjdCBwdWJsaWMgc2hvcnQgZ2V0VGFyZ2V0VHlwZSgpOwotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiAoc2VnID09IG51bGwpID8gMCA6IHNlZy5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIChzZWcgPT0gbnVsbCkgPyAwIDogc2VnLmdldE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhdGUoKSB7Ci0JCXJldHVybiB0aGlzLnN0YXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9DTVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9DTVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYzMzkxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQ01VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5ITVFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotZmluYWwgY2xhc3MgQ01VdGlsIHsKLQotCS8qKgotCSAqIE5ldmVyIGluc3RhbnRpYXRlIQotCSAqLwotCXByaXZhdGUgQ01VdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFlvdSBjYW5ub3QgYWx3YXlzIHJldHJpZXZlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gdmlhIGFuIEVsZW1lbnQgaW5zdGFuY2UuCi0JICogQmVjYXVzZSwgaXQgb2NjYXNpb25hbGx5IGEgSlNQIGN1c3RvbSB0YWcuIC0tIDkvNy8yMDAxCi0JICovCi0JcHVibGljIHN0YXRpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbihFbGVtZW50IHRhcmdldCkgewotCQlEb2N1bWVudCBkb2MgPSB0YXJnZXQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlNb2RlbFF1ZXJ5IHF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2MpOwotCQlyZXR1cm4gcXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24odGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKGRlY2wgPT0gbnVsbCB8fCAoIWRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICEoKEJvb2xlYW4pIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ2hpbGQoQ01Db250ZW50IGNvbnRlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHRhcmdldCkgewotCQlzd2l0Y2ggKGNvbnRlbnQuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6Ci0JCQkJaWYgKGlzV2hvbGVUYWdPbWlzc2libGUoKENNRWxlbWVudERlY2xhcmF0aW9uKSBjb250ZW50KSkKLQkJCQkJaWYgKGlzQ2hpbGQoKChDTUVsZW1lbnREZWNsYXJhdGlvbikgY29udGVudCkuZ2V0Q29udGVudCgpLCB0YXJnZXQpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGlzU2FtZURlY2xhcmF0aW9uKChDTUVsZW1lbnREZWNsYXJhdGlvbikgY29udGVudCwgdGFyZ2V0KTsKLQkJCWNhc2UgQ01Ob2RlLkdST1VQIDoKLQkJCQlDTU5vZGVMaXN0IGNoaWxkcmVuID0gKChDTUdyb3VwKSBjb250ZW50KS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCUNNTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJCXN3aXRjaCAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCQkJY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6Ci0JCQkJCQkJaWYgKGlzV2hvbGVUYWdPbWlzc2libGUoKENNRWxlbWVudERlY2xhcmF0aW9uKSBjaGlsZCkpCi0JCQkJCQkJCWlmIChpc0NoaWxkKCgoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNoaWxkKS5nZXRDb250ZW50KCksIHRhcmdldCkpCi0JCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQlpZiAoaXNTYW1lRGVjbGFyYXRpb24oKENNRWxlbWVudERlY2xhcmF0aW9uKSBjaGlsZCwgdGFyZ2V0KSkKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJY29udGludWU7IC8vIEdvIG5leHQgY2hpbGQuCi0JCQkJCQljYXNlIENNTm9kZS5HUk9VUCA6Ci0JCQkJCQkJaWYgKGlzQ2hpbGQoKENNQ29udGVudCkgY2hpbGQsIHRhcmdldCkpCi0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCWNvbnRpbnVlOyAvLyBHbyBuZXh0IGNoaWxkLgotCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJY29udGludWU7IC8vIEdvIG5leHQgY2hpbGQuCi0JCQkJCX0KLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VuZFRhZ09taXNzaWJsZShDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmICghKGRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIG9taXRUeXBlID0gKFN0cmluZykgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSk7Ci0JCXJldHVybiAhb21pdFR5cGUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfTk9ORSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2hvbGVUYWdPbWlzc2libGUoQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoIShkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBvbWl0VHlwZSA9IChTdHJpbmcpIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpOwotCQlyZXR1cm4gb21pdFR5cGUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfQk9USCk7Ci0JfQotCQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pTUChDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmICghZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoKEJvb2xlYW4pIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19KU1ApKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNYSFRNTChDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmICghZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoQm9vbGVhbikgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1ldGhvZCB0byBkaXN0aW5ndWlzaCBIVE1MIGFuZCBYSFRNTCBmcm9tIG90aGVyIG1hcmsgdXAuCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgaXMsCi0JICogKDEpIG5vdCBKU1AsCi0JICogKDIpIG5vdCBTU0kuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSFRNTChDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCXJldHVybiAoIWlzSlNQKGRlY2wpKSAmJiAoIWlzU1NJKGRlY2wpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2FtZURlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGFEZWMsIENNRWxlbWVudERlY2xhcmF0aW9uIG90aGVyRGVjKSB7Ci0JCXJldHVybiBhRGVjLmdldEVsZW1lbnROYW1lKCkgPT0gb3RoZXJEZWMuZ2V0RWxlbWVudE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTU0koQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlYykgewotCQlpZiAoZWRlYyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWVkZWMuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKChCb29sZWFuKSBlZGVjLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfU1NJKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbCB0aGlzIG1ldGhvZCBvbmx5IHdoZW4gdGhlIHBhcmVudCBjb250ZW50IHR5cGUgaXMgb25lIG9mCi0JICogdGhlIGZvbGxvd2luZzogQU5ZLCBFTEVNRU5ULCBvciBNSVhFRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZENoaWxkKENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gY2hpbGQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChpc0hUTUwocGFyZW50KSAmJiAoIWlzSFRNTChjaGlsZCkpKQotCQkJcmV0dXJuIHRydWU7Ci0JCUNNQ29udGVudCBjb250ZW50ID0gcGFyZW50LmdldENvbnRlbnQoKTsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGlzQ2hpbGQoY29udGVudCwgY2hpbGQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZvcmVpZ24oRWxlbWVudCB0YXJnZXQpIHsKLQkJaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSURPTUVsZW1lbnQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIHRhcmdldDsKLQkJcmV0dXJuICFlbGVtZW50LmlzR2xvYmFsVGFnKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQkgKiAoMSkgdmFsdWUgdHlwZSBpcyBFTlVNLAotCSAqICgyKSBvbmx5IG9uZSB2YWx1ZSBpcyBkZWZpbmVkIGluIHRoZSBlbnVtZXJhdGlvbiwKLQkgKiAoMykgdGhlIHZhbHVlIGhhcyBzYW1lIG5hbWUgdG8gdGhlIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Jvb2xlYW5BdHRyKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlYykgewotCQlDTURhdGFUeXBlIGF0dHJ0eXBlID0gYWRlYy5nZXRBdHRyVHlwZSgpOwotCQlpZiAoYXR0cnR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGF0dHJ0eXBlLmdldERhdGFUeXBlTmFtZSgpICE9IENNRGF0YVR5cGUuRU5VTSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nW10gdmFsdWVzID0gYXR0cnR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQlpZiAodmFsdWVzLmxlbmd0aCAhPSAxKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdmFsdWVzWzBdLmVxdWFscyhhZGVjLmdldEF0dHJOYW1lKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkSW5jbHVzaW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wsIEVsZW1lbnQgcGFyZW50KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBITVFVdGlsLmdldEluY2x1c2lvbnMocGFyZW50KS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGluY2x1c2lvbiA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoaXNTYW1lRGVjbGFyYXRpb24oZGVjbCwgaW5jbHVzaW9uKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBtZXRob2QgdG8gZGlzdGluZ3Vpc2ggSFRNTCBhbmQgWEhUTUwgZnJvbSBvdGhlciBtYXJrIHVwLgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFyZ2V0IGlzLAotCSAqICgxKSBub3QgSlNQLAotCSAqICgyKSBub3QgU1NJLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc09ic29sZXRlKENNTm9kZSBkZWNsKSB7Ci0JCXJldHVybiBkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSVNfT0JTT0xFVEUpICYmICgoQm9vbGVhbikoZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX09CU09MRVRFKSkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Db21wb3NpdGVWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Db21wb3NpdGVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBlNzUyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQ29tcG9zaXRlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25Db21wb25lbnQ7Ci0KLWFic3RyYWN0IGNsYXNzIENvbXBvc2l0ZVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRpb25Db21wb25lbnQgewotCi0JcHJvdGVjdGVkIFZlY3RvciBjb21wb25lbnRzID0gbmV3IFZlY3RvcigpOwotCi0JLyoqCi0JICogQ29tcG9zaXRlVmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZVZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBvcnRlcihWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIuc2V0UmVwb3J0ZXIocmVwb3J0ZXIpOwotCi0JCUl0ZXJhdG9yIGkgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJVmFsaWRhdGlvbkFkYXB0ZXIgY29tcG9uZW50ID0gKFZhbGlkYXRpb25BZGFwdGVyKSBpLm5leHQoKTsKLQkJCWlmIChjb21wb25lbnQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWNvbXBvbmVudC5zZXRSZXBvcnRlcihyZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJSXRlcmF0b3IgaSA9IGNvbXBvbmVudHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlWYWxpZGF0aW9uQ29tcG9uZW50IGNvbXBvbmVudCA9IChWYWxpZGF0aW9uQ29tcG9uZW50KSBpLm5leHQoKTsKLQkJCWlmIChjb21wb25lbnQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWNvbXBvbmVudC52YWxpZGF0ZShub2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgYWRkKFZhbGlkYXRpb25Db21wb25lbnQgdmFsaWRhdG9yKSB7Ci0JCWNvbXBvbmVudHMuYWRkKHZhbGlkYXRvcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmVnaXN0ZXJzIGFsbCBjb21wb25lbnRzIGluICd2YWxpZGF0b3JzJy4KLQkgKiBFYWNoIGRlcml2YXRpdmUgbXVzdCBjYWxsIHRoaXMgbWV0aGlkIGluIGl0cyBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlcihWYWxpZGF0aW9uQ29tcG9uZW50W10gdmFsaWRhdG9ycykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh2YWxpZGF0b3JzW2ldICE9IG51bGwpCi0JCQkJYWRkKHZhbGlkYXRvcnNbaV0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0RvY3VtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Eb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MjkxNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0RvY3VtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25SZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkNvbXBvbmVudDsKLQotY2xhc3MgRG9jdW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3IgewotCi0KLQlwcml2YXRlIFZhbGlkYXRpb25Db21wb25lbnQgdmFsaWRhdG9yID0gbmV3IEhUTUxTaW1wbGVEb2N1bWVudFZhbGlkYXRvcigpOwotCXByaXZhdGUgRWxlbWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yIHByb3BhZ2F0ZWUgPSBuZXcgRWxlbWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yKCk7Ci0KLQlwdWJsaWMgRG9jdW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJZ2V0UHJvcGFnYXRlZSgpLnNldFJlcG9ydGVyKHRoaXMucmVwb3J0ZXIpOwotCQlzdXBlci52YWxpZGF0ZShub2RlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBEb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmNsYXNzIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcG9ydGVyKFZhbGlkYXRpb25SZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci5zZXRSZXBvcnRlcihyZXBvcnRlcik7Ci0JCXZhbGlkYXRvci5zZXRSZXBvcnRlcihyZXBvcnRlcik7Ci0JCXByb3BhZ2F0ZWUuc2V0UmVwb3J0ZXIocmVwb3J0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBWYWxpZGF0aW9uQ29tcG9uZW50IGdldFByb3BhZ2F0ZWUoKSB7Ci0JCXJldHVybiBwcm9wYWdhdGVlOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBWYWxpZGF0aW9uQWRhcHRlciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0VsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0VsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjkwYjYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25SZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkNvbXBvbmVudDsKLQotY2xhc3MgRWxlbWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvciB7Ci0KLQotCXByaXZhdGUgVmFsaWRhdGlvbkNvbXBvbmVudCB2YWxpZGF0b3IgPSBuZXcgSFRNTFNpbXBsZVZhbGlkYXRvcigpOwotCi0JcHVibGljIEVsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBFbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IuY2xhc3MgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVwb3J0ZXIoVmFsaWRhdGlvblJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnNldFJlcG9ydGVyKHJlcG9ydGVyKTsKLQkJdmFsaWRhdG9yLnNldFJlcG9ydGVyKHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmFsaWRhdGlvbkNvbXBvbmVudCBnZXRQcm9wYWdhdGVlKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmFsaWRhdGlvbkFkYXB0ZXIgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FcnJvckluZm9JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvRXJyb3JJbmZvSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzEwYTFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FcnJvckluZm9JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotZmluYWwgY2xhc3MgRXJyb3JJbmZvSW1wbCBleHRlbmRzIEFic3RyYWN0RXJyb3JJbmZvIHsKLQotCXByaXZhdGUgTm9kZSB0YXJnZXQgPSBudWxsOwotCi0JLy8JcHJpdmF0ZSBTZWdtZW50IHNlZyA9IG51bGw7Ci0JLyoqCi0JICovCi0JcHVibGljIEVycm9ySW5mb0ltcGwoaW50IHN0YXRlLCBTZWdtZW50IGVycm9yU2VnLCBOb2RlIHRhcmdldCkgewotCQlzdXBlcihzdGF0ZSwgZXJyb3JTZWcpOwotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhpbnQoKSB7Ci0JCXN3aXRjaCAodGFyZ2V0LmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0JCQkJc3dpdGNoIChnZXRTdGF0ZSgpKSB7Ci0JCQkJCWNhc2UgVU5ERUZJTkVEX1ZBTFVFX0VSUk9SIDoKLQkJCQkJY2FzZSBNSVNNQVRDSEVEX1ZBTFVFX0VSUk9SIDoKLQkJCQkJY2FzZSBVTkNMT1NFRF9BVFRSX1ZBTFVFIDoKLQkJCQkJY2FzZSBSRVNPVVJDRV9OT1RfRk9VTkQgOgotCQkJCQkJLy9EMjEwNDIyCi0JCQkJCQlyZXR1cm4gKChBdHRyKSB0YXJnZXQpLmdldFZhbHVlKCk7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJcmV0dXJuIHRhcmdldC5nZXROb2RlTmFtZSgpOwotCQkJCX0KLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCXJldHVybiAoKFRleHQpIHRhcmdldCkuZ2V0RGF0YSgpOwotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gdGFyZ2V0LmdldE5vZGVOYW1lKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc2hvcnQgZ2V0VGFyZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRhcmdldC5nZXROb2RlVHlwZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FcnJvclN0YXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvRXJyb3JTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjRkNTBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FcnJvclN0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWludGVyZmFjZSBFcnJvclN0YXRlIHsKLQlzdGF0aWMgZmluYWwgaW50IE5PTkVfRVJST1IgPSAwOwotCS8vIGdlbmVyaWMgZXJyb3IKLQlzdGF0aWMgZmluYWwgaW50IFVOREVGSU5FRF9OQU1FX0VSUk9SID0gMTE7Ci0Jc3RhdGljIGZpbmFsIGludCBVTkRFRklORURfVkFMVUVfRVJST1IgPSAxMjsKLQlzdGF0aWMgZmluYWwgaW50IE1JU01BVENIRURfVkFMVUVfRVJST1IgPSAxMzsKLQlzdGF0aWMgZmluYWwgaW50IE9CU09MRVRFX0FUVFJfTkFNRV9FUlJPUiA9IDE0OwotCXN0YXRpYyBmaW5hbCBpbnQgT0JTT0xFVEVfVEFHX05BTUVfRVJST1IgPSAxNTsKLQkKLQkvLyBmb3JtYXQgZXJyb3IKLQlzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9FUlJPUl9MRVZFTCA9IDEwMDsKLQlzdGF0aWMgZmluYWwgaW50IElOVkFMSURfTkFNRV9FUlJPUiA9IDEwMTsKLQlzdGF0aWMgZmluYWwgaW50IElOVkFMSURfQ0hBUl9FUlJPUiA9IDEwMjsKLQlzdGF0aWMgZmluYWwgaW50IE1JU01BVENIRURfRVJST1IgPSAxMDM7Ci0Jc3RhdGljIGZpbmFsIGludCBNSVNNQVRDSEVEX0VORF9UQUdfRVJST1IgPSAxMDQ7Ci0Jc3RhdGljIGZpbmFsIGludCBNSVNTSU5HX1NUQVJUX1RBR19FUlJPUiA9IDEwNTsKLQlzdGF0aWMgZmluYWwgaW50IE1JU1NJTkdfRU5EX1RBR19FUlJPUiA9IDEwNjsKLQlzdGF0aWMgZmluYWwgaW50IFVOTkVDRVNTQVJZX0VORF9UQUdfRVJST1IgPSAxMDc7Ci0Jc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0FUVFJfRVJST1IgPSAxMDg7Ci0Jc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0RJUkVDVElWRV9FUlJPUiA9IDEwOTsKLQlzdGF0aWMgZmluYWwgaW50IFVOQ0xPU0VEX1RBR19FUlJPUiA9IDExMDsKLQlzdGF0aWMgZmluYWwgaW50IFVOQ0xPU0VEX0VORF9UQUdfRVJST1IgPSAxMTE7Ci0Jc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0VNUFRZX0VMRU1FTlRfVEFHID0gMTEyOwotCXN0YXRpYyBmaW5hbCBpbnQgVU5DTE9TRURfQVRUUl9WQUxVRSA9IDExMzsgLy9EMjEwNDIyCi0Jc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRV9OT1RfRk9VTkQgPSAxMTQ7IC8vRDIxMDQyMgotCS8vIGxheW91dCBlcnJvcgotCXN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX0VSUk9SX0xFVkVMID0gMTAwMDsKLQlzdGF0aWMgZmluYWwgaW50IElOVkFMSURfQ09OVEVOVF9FUlJPUiA9IDEwMDE7Ci0Jc3RhdGljIGZpbmFsIGludCBEVVBMSUNBVEVfRVJST1IgPSAxMDAyOwotCXN0YXRpYyBmaW5hbCBpbnQgQ09FWElTVEVOQ0VfRVJST1IgPSAxMDAzOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0ZNVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0ZNVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2VlMDJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9GTVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLWZpbmFsIGNsYXNzIEZNVXRpbCB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTRUdfTk9ORSA9IDA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU0VHX1dIT0xFX1RBRyA9IDE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU0VHX1NUQVJUX1RBRyA9IDI7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU0VHX0VORF9UQUcgPSAzOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNFR19TVEFSVF9UQUdfTkFNRSA9IDQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU0VHX0VORF9UQUdfTkFNRSA9IDU7Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEZNVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFNlZ21lbnQgZ2V0U2VnbWVudChJRE9NTm9kZSB0YXJnZXQsIGludCBzZWdUeXBlKSB7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU2VnbWVudCgwLCAwKTsKLQkJU2VnbWVudCBzZWcgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWcgPSBudWxsOwotCQlzd2l0Y2ggKHNlZ1R5cGUpIHsKLQkJCWNhc2UgU0VHX1dIT0xFX1RBRyA6Ci0JCQkJc3RhcnRUYWcgPSB0YXJnZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoc3RhcnRUYWcgIT0gbnVsbCkgewotCQkJCQllbmRUYWcgPSB0YXJnZXQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlzZWcgPSBuZXcgU2VnbWVudChzdGFydFRhZywgZW5kVGFnKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBzdGFydE9mZnNldCA9IHRhcmdldC5nZXRTdGFydE9mZnNldCgpOwotCQkJCQlpbnQgZW5kT2Zmc2V0ID0gdGFyZ2V0LmdldEVuZE9mZnNldCgpOwotCQkJCQlzZWcgPSBuZXcgU2VnbWVudChzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgU0VHX1NUQVJUX1RBRyA6Ci0JCQkJc3RhcnRUYWcgPSB0YXJnZXQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoc3RhcnRUYWcgIT0gbnVsbCkgewotCQkJCQlzZWcgPSBuZXcgU2VnbWVudChzdGFydFRhZyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzZWcgPSBuZXcgU2VnbWVudCh0YXJnZXQuZ2V0U3RhcnRPZmZzZXQoKSwgMSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBTRUdfRU5EX1RBRyA6Ci0JCQkJZW5kVGFnID0gdGFyZ2V0LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChlbmRUYWcgIT0gbnVsbCkgewotCQkJCQlzZWcgPSBuZXcgU2VnbWVudChlbmRUYWcpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2VnID0gbmV3IFNlZ21lbnQodGFyZ2V0LmdldEVuZE9mZnNldCgpLCAxKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNFR19TVEFSVF9UQUdfTkFNRSA6Ci0JCQkJc3RhcnRUYWcgPSB0YXJnZXQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoc3RhcnRUYWcgIT0gbnVsbCkgewotCQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gZ2V0TmFtZVJlZ2lvbihzdGFydFRhZyk7Ci0JCQkJCWlmIChuYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCXNlZyA9IG5ldyBTZWdtZW50KHN0YXJ0VGFnLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pLCBuYW1lUmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHNlZyA9PSBudWxsKSB7Ci0JCQkJCXNlZyA9IGdldFNlZ21lbnQodGFyZ2V0LCBTRUdfU1RBUlRfVEFHKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNFR19FTkRfVEFHX05BTUUgOgotCQkJCWVuZFRhZyA9IHRhcmdldC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZW5kVGFnICE9IG51bGwpIHsKLQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oZW5kVGFnKTsKLQkJCQkJaWYgKG5hbWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJc2VnID0gbmV3IFNlZ21lbnQoZW5kVGFnLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pLCBuYW1lUmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHNlZyA9PSBudWxsKSB7Ci0JCQkJCXNlZyA9IGdldFNlZ21lbnQodGFyZ2V0LCBTRUdfRU5EX1RBRyk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBTRUdfTk9ORSA6Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbmV3IFNlZ21lbnQoMCwgMCk7Ci0JCX0KLQkJcmV0dXJuIHNlZzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXJSZWdpb24pIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBjb250YWluZXJSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQluYW1lUmVnaW9uID0gcjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZVJlZ2lvbiA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTEF0dHJpYnV0ZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxBdHRyaWJ1dGVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MWQ3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTEF0dHJpYnV0ZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MQXR0cmlidXRlVmFsaWRhdG9yIGV4dGVuZHMgUHJpbWVWYWxpZGF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFR0lPTl9OQU1FID0gMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVHSU9OX1ZBTFVFID0gMjsKLQkvLyA8PEQyMTA0MjIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNJTkdMRV9RVU9URSA9ICdcJyc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfUVVPVEUgPSAnXCInOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9EQVRBID0gImRhdGEtIjsKLQotCS8vIEQyMTA0MjIKLQkvKioKLQkgKiBIVE1MQXR0cmlidXRlVmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEhUTUxBdHRyaWJ1dGVWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTZWdtZW50IGdldEVycm9yU2VnbWVudChJRE9NTm9kZSBlcnJvck5vZGUsIGludCByZWdpb25UeXBlKSB7Ci0JCUlUZXh0UmVnaW9uIHJnbiA9IG51bGw7Ci0JCXN3aXRjaCAocmVnaW9uVHlwZSkgewotCQkJY2FzZSBSRUdJT05fTkFNRSA6Ci0JCQkJcmduID0gZXJyb3JOb2RlLmdldE5hbWVSZWdpb24oKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OX1ZBTFVFIDoKLQkJCQlyZ24gPSBlcnJvck5vZGUuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCS8vIG5vdGhpbmcgdG8gZG8uCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHJnbiAhPSBudWxsKSB7Ci0JCQlpZiAoZXJyb3JOb2RlIGluc3RhbmNlb2YgSURPTUF0dHIpIHsKLQkJCQlJRE9NRWxlbWVudCBvd25lckVsZW1lbnQgPSAoSURPTUVsZW1lbnQpICgoSURPTUF0dHIpIGVycm9yTm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkJaWYgKG93bmVyRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCS8vaWYgZWRpdG9yIGNsb3NlZCBkdXJpbmcgdmFsaWRhdGlvbiB0aGlzIGNvdWxkIGJlIG51bGwKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdFJlZ2lvbiA9IG93bmVyRWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpZihmaXJzdFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgcmVnaW9uU3RhcnRPZmZzZXQgPSBmaXJzdFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZ24pOwotCQkJCQkJaW50IHJlZ2lvbkxlbmd0aCA9IHJnbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQlyZXR1cm4gbmV3IFNlZ21lbnQocmVnaW9uU3RhcnRPZmZzZXQsIHJlZ2lvbkxlbmd0aCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBTZWdtZW50KGVycm9yTm9kZS5nZXRTdGFydE9mZnNldCgpLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBIVE1MQXR0cmlidXRlVmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJRWxlbWVudCB0YXJnZXQgPSAoRWxlbWVudCkgbm9kZTsKLQkJaWYgKENNVXRpbC5pc0ZvcmVpZ24odGFyZ2V0KSkKLQkJCXJldHVybjsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlYyA9IENNVXRpbC5nZXREZWNsYXJhdGlvbih0YXJnZXQpOwotCQlpZiAoZWRlYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDTU5hbWVkTm9kZU1hcCBkZWNsYXJhdGlvbnMgPSBlZGVjLmdldEF0dHJpYnV0ZXMoKTsKLQotCQlMaXN0IG1vZGVsUXVlcnlOb2RlcyA9IG51bGw7Ci0JCU5hbWVkTm9kZU1hcCBhdHRycyA9IHRhcmdldC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaW50IHJnblR5cGUgPSBSRUdJT05fTkFNRTsKLQkJCWludCBzdGF0ZSA9IEVycm9yU3RhdGUuTk9ORV9FUlJPUjsKLQkJCUF0dHIgYSA9IChBdHRyKSBhdHRycy5pdGVtKGkpOwotCQkJLy8gRDIwMzYzNzsgSWYgdGhlIHRhcmdldCBhdHRyIGhhcyBwcmVmaXgsIHRoZSB2YWxpZGF0b3Igc2hvdWxkCi0JCQkvLyBub3QKLQkJCS8vIHdhcm4gYWJvdXQgaXQuIFRoYXQgaXMsIGp1c3QgaWdub3JlLiBJdCBpcyBhYmxlIHRvIGNoZWNrCi0JCQkvLyB3aGV0aGVyCi0JCQkvLyBhbiBhdHRyIGhhcyBwcmVmaXggb3Igbm90IGJ5IGNhbGxpbmcgWE1MQXR0ciNpc0dsb2JhbEF0dHIoKS4KLQkJCS8vIFdoZW4gYSBhdHRyIGhhcyBwcmVmaXggKG5vdCBnbG9iYWwpLCBpdCByZXR1cm5zIGZhbHNlLgotCQkJYm9vbGVhbiBpc1hNTEF0dHIgPSBhIGluc3RhbmNlb2YgSURPTUF0dHI7Ci0JCQlpZiAoaXNYTUxBdHRyKSB7Ci0JCQkJSURPTUF0dHIgeG1sYXR0ciA9IChJRE9NQXR0cikgYTsKLQkJCQlpZiAoIXhtbGF0dHIuaXNHbG9iYWxBdHRyKCkpCi0JCQkJCWNvbnRpbnVlOyAvLyBza2lwIGZ1dGhlciB2YWxpZGF0aW9uIGFuZCBiZWdpbiBuZXh0IGxvb3AuCi0JCQl9Ci0KLQkJCVN0cmluZyBhdHRyTmFtZSA9IGEuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7Ci0JCQlpZiAoYXR0ck5hbWUuc3RhcnRzV2l0aChBVFRSX05BTUVfREFUQSkgJiYgYXR0ck5hbWUubGVuZ3RoKCkgPiBBVFRSX05BTUVfREFUQS5sZW5ndGgoKSkKLQkJCQljb250aW51ZTsKLQotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9ucy5nZXROYW1lZEl0ZW0oYS5nZXROYW1lKCkpOwotCQkJCi0JCQkvKiBDaGVjayB0aGUgbW9kZWxxdWVyeSBpZiBub3RoaW5nIGlzIGRlY2xhcmVkIGJ5IHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uICovCi0JCQlpZiAoYWRlYyA9PSBudWxsKSB7Ci0JCQkJaWYgKG1vZGVsUXVlcnlOb2RlcyA9PSBudWxsKQotCQkJCQltb2RlbFF1ZXJ5Tm9kZXMgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHRhcmdldC5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIG5vZGUsIGVkZWMsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCQkKLQkJCQkKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IG1vZGVsUXVlcnlOb2Rlcy5zaXplKCk7IGsrKykgewotCQkJCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgbW9kZWxRdWVyeU5vZGVzLmdldChrKTsKLQkJCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04gJiYgY21ub2RlLmdldE5vZGVOYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKS5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQlhZGVjID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtbm9kZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoYWRlYyA9PSBudWxsKSB7Ci0JCQkJLy8gTm8gYXR0ciBkZWNsYXJhdGlvbiB3YXMgZm91bmQuIFRoYXQgaXMsIHRoZSBhdHRyIG5hbWUgaXMKLQkJCQkvLyB1bmRlZmluZWQuCi0JCQkJLy8gYnV0IG5vdCByZWdhcmQgaXQgYXMgdW5kZWZpbmVkIG5hbWUgaWYgaXQgaW5jbHVkZXMgbmVzdGVkCi0JCQkJLy8gcmVnaW9uCi0JCQkJaWYgKCFoYXNOZXN0ZWRSZWdpb24oKChJRE9NTm9kZSkgYSkuZ2V0TmFtZVJlZ2lvbigpKSkgewotCQkJCQlyZ25UeXBlID0gUkVHSU9OX05BTUU7Ci0JCQkJCXN0YXRlID0gRXJyb3JTdGF0ZS5VTkRFRklORURfTkFNRV9FUlJPUjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIFRoZSBhdHRyIGRlY2xhcmF0aW9uIHdhcyBmb3VuZC4KLQkJCQkvLyBBdCAxc3QsIHRoZSBuYW1lIHNob3VsZCBiZSBjaGVja2VkLgotCQkJCWlmIChDTVV0aWwuaXNPYnNvbGV0ZShhZGVjKSl7Ci0JCQkJCXN0YXRlID0gRXJyb3JTdGF0ZS5PQlNPTEVURV9BVFRSX05BTUVfRVJST1I7Ci0JCQkJfQotCQkJCWlmIChDTVV0aWwuaXNIVE1MKGVkZWMpICYmICghQ01VdGlsLmlzWEhUTUwoZWRlYykpKSB7Ci0JCQkJCS8vIElmIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBwdXJlIEhUTUwgKG5vdCBYSFRNTCksIHNvbWUKLQkJCQkJLy8gYXR0cmlidXRlcwotCQkJCQkvLyBtaWdodCBiZSB3cml0dGVuIGluIGJvb2xlYW4gZm9ybWF0LiBJdCBzaG91bGQgYmUgY2hlY2sKLQkJCQkJLy8gc3BlY2lmaWNhbGx5LgotCQkJCQlpZiAoQ01VdGlsLmlzQm9vbGVhbkF0dHIoYWRlYykgJiYgKChJRE9NQXR0cikgYSkuaGFzTmFtZU9ubHkoKSkKLQkJCQkJCWNvbnRpbnVlOyAvLyBPSywga2VlcCBnb2luZy4gTm8gbW9yZSBjaGVjayBpcyBuZWVkZWQKLQkJCQkJLy8gYWdhaW5zdCB0aGlzIGF0dHIuCi0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gSWYgdGhlIHRhcmdldCBpcyBvdGhlciB0aGFuIHB1cmUgSFRNTCAoSlNQIG9yIFhIVE1MKSwKLQkJCQkJLy8gdGhlIG5hbWUKLQkJCQkJLy8gbXVzdCBiZSBjaGVja2VkIGV4YWN0bHkgKGllIGluIGNhc2Ugc2Vuc2l0aXZlIHdheSkuCi0JCQkJCVN0cmluZyBhY3R1YWwgPSBhLmdldE5hbWUoKTsKLQkJCQkJU3RyaW5nIGRlc2lyZWQgPSBhZGVjLmdldEF0dHJOYW1lKCk7Ci0JCQkJCWlmICghYWN0dWFsLmVxdWFscyhkZXNpcmVkKSkgeyAvLyBjYXNlIG1pc21hdGNoCi0JCQkJCQlyZ25UeXBlID0gUkVHSU9OX05BTUU7Ci0JCQkJCQlzdGF0ZSA9IEVycm9yU3RhdGUuTUlTTUFUQ0hFRF9FUlJPUjsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBUaGVuLCB0aGUgdmFsdWUgbXVzdCBiZSBjaGVja2VkLgotCQkJCWlmIChzdGF0ZSA9PSBFcnJvclN0YXRlLk5PTkVfRVJST1IpIHsgLy8gTmVlZCBtb3JlIGNoZWNrLgotCQkJCQkvLyBOb3csIHRoZSB2YWx1ZSBzaG91bGQgYmUgY2hlY2tlZCwgaWYgdGhlIHR5cGUgaXMgRU5VTS4KLQkJCQkJQ01EYXRhVHlwZSBhdHRyVHlwZSA9IGFkZWMuZ2V0QXR0clR5cGUoKTsKLQkJCQkJU3RyaW5nIGFjdHVhbFZhbHVlID0gYS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAoYXR0clR5cGUuZ2V0SW1wbGllZFZhbHVlS2luZCgpID09IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9GSVhFRCkgewotCQkJCQkJLy8gQ2hlY2sgRklYRUQgdmFsdWUuCi0JCQkJCQlTdHJpbmcgdmFsaWRWYWx1ZSA9IGF0dHJUeXBlLmdldEltcGxpZWRWYWx1ZSgpOwotCQkJCQkJaWYgKCFhY3R1YWxWYWx1ZS5lcXVhbHModmFsaWRWYWx1ZSkpIHsKLQkJCQkJCQlyZ25UeXBlID0gUkVHSU9OX1ZBTFVFOwotCQkJCQkJCXN0YXRlID0gRXJyb3JTdGF0ZS5VTkRFRklORURfVkFMVUVfRVJST1I7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoQ01EYXRhVHlwZS5VUkkuZXF1YWxzKGF0dHJUeXBlLmdldERhdGFUeXBlTmFtZSgpKSkgewotCQkJCQkJLy8gVE9ETzogVVJJIHZhbGlkYXRpb24/Ci0JCQkJCQlpZiAoZmFsc2UgJiYgYWN0dWFsVmFsdWUuaW5kZXhPZignIycpIDwgMCAmJiBhY3R1YWxWYWx1ZS5pbmRleE9mKCI6LyIpID09IC0xICYmIENNVXRpbC5pc0hUTUwoZWRlYykpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQkJaWYgKHN0YXJ0ICE9IG51bGwgJiYgc3RhcnQuZ2V0Rmlyc3RSZWdpb24oKS5nZXRUZXh0TGVuZ3RoKCkgPT0gMSkgewotCQkJCQkJCQlJUGF0aCBiYXNlUGF0aCA9IG5ldyBQYXRoKCgoSURPTU5vZGUpIG5vZGUpLmdldE1vZGVsKCkuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQkJCQkJCQlpZiAoYmFzZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCQkJCQlJUGF0aCBwYXRoID0gTW9kdWxlQ29yZVN1cHBvcnQucmVzb2x2ZShiYXNlUGF0aCwgYWN0dWFsVmFsdWUpOwotCQkJCQkJCQkJSVJlc291cmNlIGZvdW5kID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOwotCQkJCQkJCQkJaWYgKGZvdW5kID09IG51bGwgfHwgIWZvdW5kLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQkJCQkJcmduVHlwZSA9IFJFR0lPTl9WQUxVRTsKLQkJCQkJCQkJCQlzdGF0ZSA9IEVycm9yU3RhdGUuUkVTT1VSQ0VfTk9UX0ZPVU5EOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKENNRGF0YVR5cGUuRU5VTS5lcXVhbHMoYXR0clR5cGUuZ2V0RGF0YVR5cGVOYW1lKCkpKSB7Ci0JCQkJCQkvKgotCQkJCQkJICogQ2hlY2sgY3VycmVudCB2YWx1ZSBpcyB2YWxpZCBhbW9uZyBhIGtub3duIGxpc3QuCi0JCQkJCQkgKiBUaGVyZSBtYXkgYmUgZW51bWVyYXRlZCB2YWx1ZXMgcHJvdmlkZWQgZXZlbiB3aGVuCi0JCQkJCQkgKiB0aGUgZGF0YXR5cGUgaXMgbm90IEVOVU0sIGJ1dCB3ZSdsbCBvbmx5IHZhbGlkYXRlCi0JCQkJCQkgKiBhZ2FpbnN0IHRoYXQgbGlzdCBpZiB0aGUgdHlwZSBtYXRjaGVzLgotCQkJCQkJICovCi0JCQkJCQlTdHJpbmdbXSBlbnVtZXJhdGVkVmFsdWVzID0gYXR0clR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQkJCQkJLy8gc2V2ZXJhbCBjYW5kaWRhdGVzIGFyZSBmb3VuZC4KLQkJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZW51bWVyYXRlZFZhbHVlcy5sZW5ndGg7IGorKykgewotCQkJCQkJCS8vIEF0IDFzdCwgY29tcGFyZSBpZ25vcmluZyBjYXNlLgotCQkJCQkJCWlmIChhY3R1YWxWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKGVudW1lcmF0ZWRWYWx1ZXNbal0pKSB7Ci0JCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJaWYgKENNVXRpbC5pc0Nhc2VTZW5zaXRpdmUoZWRlYykgJiYgKCFhY3R1YWxWYWx1ZS5lcXVhbHMoZW51bWVyYXRlZFZhbHVlc1tqXSkpKSB7Ci0JCQkJCQkJCQlyZ25UeXBlID0gUkVHSU9OX1ZBTFVFOwotCQkJCQkJCQkJc3RhdGUgPSBFcnJvclN0YXRlLk1JU01BVENIRURfVkFMVUVfRVJST1I7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7IC8vIGV4aXQgdGhlIGxvb3AuCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKCFmb3VuZCkgewotCQkJCQkJCS8vIHJldHJpZXZlIGFuZCBjaGVjayBleHRlbmRlZCB2YWx1ZXMgKHJldHJpZXZhbCBjYW4gY2FsbCBleHRlbnNpb25zLCB3aGljaCBtYXkgdGFrZSBsb25nZXIpCi0JCQkJCQkJU3RyaW5nW10gbW9kZWxRdWVyeUV4dGVuc2lvblZhbHVlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkodGFyZ2V0LmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcygoRWxlbWVudCkgbm9kZSwgYWRlYyk7Ci0JCQkJCQkJLy8gY29waWVkIGxvb3AgZnJvbSBhYm92ZQotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbW9kZWxRdWVyeUV4dGVuc2lvblZhbHVlcy5sZW5ndGg7IGorKykgewotCQkJCQkJCQkvLyBBdCAxc3QsIGNvbXBhcmUgaWdub3JpbmcgY2FzZS4KLQkJCQkJCQkJaWYgKGFjdHVhbFZhbHVlLmVxdWFsc0lnbm9yZUNhc2UobW9kZWxRdWVyeUV4dGVuc2lvblZhbHVlc1tqXSkpIHsKLQkJCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJCWlmIChDTVV0aWwuaXNDYXNlU2Vuc2l0aXZlKGVkZWMpICYmICghYWN0dWFsVmFsdWUuZXF1YWxzKG1vZGVsUXVlcnlFeHRlbnNpb25WYWx1ZXNbal0pKSkgewotCQkJCQkJCQkJCXJnblR5cGUgPSBSRUdJT05fVkFMVUU7Ci0JCQkJCQkJCQkJc3RhdGUgPSBFcnJvclN0YXRlLk1JU01BVENIRURfVkFMVUVfRVJST1I7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlicmVhazsgLy8gZXhpdCB0aGUgbG9vcC4KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkvLyBObyBjYW5kaWRhdGUgd2FzIGZvdW5kLiBUaGF0IGlzLAotCQkJCQkJCS8vIGFjdHVhbFZhbHVlIGlzIGludmFsaWQuCi0JCQkJCQkJLy8gYnV0IG5vdCByZWdhcmQgaXQgYXMgdW5kZWZpbmVkIHZhbHVlIGlmIGl0Ci0JCQkJCQkJLy8gaW5jbHVkZXMgbmVzdGVkIHJlZ2lvbi4KLQkJCQkJCQlpZiAoIWhhc05lc3RlZFJlZ2lvbigoKElET01Ob2RlKSBhKS5nZXRWYWx1ZVJlZ2lvbigpKSkgewotCQkJCQkJCQlyZ25UeXBlID0gUkVHSU9OX1ZBTFVFOwotCQkJCQkJCQlzdGF0ZSA9IEVycm9yU3RhdGUuVU5ERUZJTkVEX1ZBTFVFX0VSUk9SOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyA8PEQyMTA0MjIKLQkJCQlpZiAoc3RhdGUgPT0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SKSB7IC8vIE5lZWQgbW9yZSBjaGVjay4KLQkJCQkJaWYgKGlzWE1MQXR0cikgewotCQkJCQkJU3RyaW5nIHNvdXJjZSA9ICgoSURPTUF0dHIpIGEpLmdldFZhbHVlUmVnaW9uVGV4dCgpOwotCQkJCQkJaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJY2hhciBmaXJzdENoYXIgPSBzb3VyY2UuY2hhckF0KDApOwotCQkJCQkJCWNoYXIgbGFzdENoYXIgPSBzb3VyY2UuY2hhckF0KHNvdXJjZS5sZW5ndGgoKSAtIDEpOwotCQkJCQkJCWlmIChpc1F1b3RlKGZpcnN0Q2hhcikgfHwgaXNRdW90ZShsYXN0Q2hhcikpIHsKLQkJCQkJCQkJaWYgKGxhc3RDaGFyICE9IGZpcnN0Q2hhcikgewotCQkJCQkJCQkJcmduVHlwZSA9IFJFR0lPTl9WQUxVRTsKLQkJCQkJCQkJCXN0YXRlID0gRXJyb3JTdGF0ZS5VTkNMT1NFRF9BVFRSX1ZBTFVFOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIEQyMTA0MjIKLQkJCX0KLQkJCWlmIChzdGF0ZSAhPSBFcnJvclN0YXRlLk5PTkVfRVJST1IpIHsKLQkJCQlTZWdtZW50IHNlZyA9IGdldEVycm9yU2VnbWVudCgoSURPTU5vZGUpIGEsIHJnblR5cGUpOwotCQkJCWlmIChzZWcgIT0gbnVsbCkKLQkJCQkJcmVwb3J0ZXIucmVwb3J0KG5ldyBFcnJvckluZm9JbXBsKHN0YXRlLCBzZWcsIGEpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRydWUgaWYgY29udGFpbmVyIGhhcyBuZXN0ZWQgcmVnaW9ucywgbWVhbmluZyBjb250YWluZXIgaXMgcHJvYmFibHkgdG9vCi0JICogY29tcGxpY2F0ZWQgKGxpa2UgSlNQIHJlZ2lvbnMpIHRvIHZhbGlkYXRlIHdpdGggdGhpcyB2YWxpZGF0b3IuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc05lc3RlZFJlZ2lvbihJVGV4dFJlZ2lvbiBjb250YWluZXIpIHsKLQkJaWYgKCEoY29udGFpbmVyIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIGNvbnRhaW5lcikuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBCVUcyMDcxOTQ6IHJldHVybiB0cnVlIGJ5IGRlZmF1bHQgYXMgbG9uZyBhcyBjb250YWluZXIgaXMgYW4KLQkJLy8gSVRleHRSZWdpb25Db250YWluZXIgd2l0aCBhdCBsZWFzdCAxIHJlZ2lvbgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyA8PEQyMTQwMjIKLQlwcml2YXRlIGJvb2xlYW4gaXNRdW90ZShjaGFyIGMpIHsKLQkJcmV0dXJuIChjID09IFNJTkdMRV9RVU9URSkgfHwgKGMgPT0gRE9VQkxFX1FVT1RFKTsKLQl9Ci0JLy8gRDIxMDQyMgotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxEb2N1bWVudENvbnRlbnRWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MRG9jdW1lbnRDb250ZW50VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNmNhYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxEb2N1bWVudENvbnRlbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50Q29udGVudFZhbGlkYXRvciBleHRlbmRzIFByaW1lVmFsaWRhdG9yIHsKLQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgRGl2aXNpb24gewotCQlwcml2YXRlIFZlY3RvciBleHBsaWNpdEh0bWxzID0gbmV3IFZlY3RvcigpOwotCQlwcml2YXRlIFZlY3RvciByZXN0ID0gbmV3IFZlY3RvcigpOwotCi0JCXB1YmxpYyBEaXZpc2lvbihEb2N1bWVudCBkb2N1bWVudCwgTm9kZUxpc3QgY2hpbGRyZW4pIHsKLQkJCVN0cmluZyByb290VGFnTmFtZSA9IGdldFJvb3RUYWdOYW1lKGRvY3VtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJCWlmIChpc0h0bWxUYWcoY2hpbGQsIHJvb3RUYWdOYW1lKSkgewotCQkJCQlleHBsaWNpdEh0bWxzLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN0LmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzRXhwbGljaXRIdG1scygpIHsKLQkJCXJldHVybiBleHBsaWNpdEh0bWxzLnNpemUoKSA+IDA7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdCBnZXRFeHBsaWNpdEh0bWxzKCkgewotCQkJcmV0dXJuIGV4cGxpY2l0SHRtbHM7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3IgZ2V0UmVzdE5vZGVzKCkgewotCQkJcmV0dXJuIHJlc3QuaXRlcmF0b3IoKTsKLQkJfQotCi0JCS8qIHV0aWxpdGllcyAqLwotCQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSHRtbFRhZyhOb2RlIG5vZGUsIFN0cmluZyB0YWdOYW1lKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiAoKEVsZW1lbnQpIG5vZGUpLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpOwotCQl9Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFJvb3RUYWdOYW1lKERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgKChJRE9NRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCURvY3VtZW50VHlwZSBkb2NUeXBlID0gYWRhcHRlci5nZXREb2N1bWVudFR5cGUoKTsKLQkJCQlpZiAoZG9jVHlwZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkb2NUeXBlLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEhUTUxEb2N1bWVudENvbnRlbnRWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSFRNTERvY3VtZW50Q29udGVudFZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBIVE1MRG9jdW1lbnRDb250ZW50VmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJLy8gaXNGcmFnbWVudCBjaGVjayBzaG91bGQgYmUgbW9yZSBpbnRlbGxpZ2VudC4KLQkJYm9vbGVhbiBpc0ZyYWdtZW50ID0gdHJ1ZTsKLQotCQlEb2N1bWVudCB0YXJnZXQgPSAoRG9jdW1lbnQpIG5vZGU7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gdGFyZ2V0LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJRGl2aXNpb24gZGl2aXNpb24gPSBuZXcgRGl2aXNpb24odGFyZ2V0LCBjaGlsZHJlbik7Ci0JCWlmIChkaXZpc2lvbi5oYXNFeHBsaWNpdEh0bWxzKCkpIHsKLQkJCWlzRnJhZ21lbnQgPSBmYWxzZTsKLQotCQkJTGlzdCBleHBsaWNpdHMgPSBkaXZpc2lvbi5nZXRFeHBsaWNpdEh0bWxzKCk7Ci0JCQlpZiAoZXhwbGljaXRzLnNpemUoKSA+IDEpIHsKLQkJCQlmb3IgKGludCBpID0gMTsgaSA8IGV4cGxpY2l0cy5zaXplKCk7IGkrKykgewotCQkJCQlFbGVtZW50IGh0bWwgPSAoRWxlbWVudCkgZXhwbGljaXRzLmdldChpKTsKLQkJCQkJLy8gcmVwb3J0IGVycm9yIChkdXBsaWNhdGUpCi0JCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBGTVV0aWwuZ2V0U2VnbWVudCgoSURPTU5vZGUpIGh0bWwsIEZNVXRpbC5TRUdfU1RBUlRfVEFHKTsKLQkJCQkJaWYgKGVycm9yU2VnICE9IG51bGwpCi0JCQkJCQlyZXBvcnRlci5yZXBvcnQobmV3IEVycm9ySW5mb0ltcGwoRXJyb3JTdGF0ZS5EVVBMSUNBVEVfRVJST1IsIGVycm9yU2VnLCBodG1sKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXZhbGlkYXRlQ29udGVudChkaXZpc2lvbi5nZXRSZXN0Tm9kZXMoKSwgaXNGcmFnbWVudCk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZHMgdmFsaWRhdGUgbm9kZXMgb3RoZXIgdGhhbiBIVE1MIGVsZW1lbnRzLgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUNvbnRlbnQoSXRlcmF0b3IgY2hpbGRyZW4sIGJvb2xlYW4gaXNGcmFnbWVudCkgewotCQlib29sZWFuIGZvdW5kRG9jdHlwZSA9IGZhbHNlOwotCQl3aGlsZSAoY2hpbGRyZW4uaGFzTmV4dCgpKSB7Ci0JCQlJRE9NTm9kZSBjaGlsZCA9IChJRE9NTm9kZSkgY2hpbGRyZW4ubmV4dCgpOwotCi0JCQlpbnQgZXJyb3IgPSBFcnJvclN0YXRlLk5PTkVfRVJST1I7Ci0JCQlpbnQgc2VnVHlwZSA9IEZNVXRpbC5TRUdfV0hPTEVfVEFHOwotCi0JCQlzd2l0Y2ggKGNoaWxkLmdldE5vZGVUeXBlKCkpIHsKLQkJCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCQkJaWYgKCFpc0ZyYWdtZW50KSB7Ci0JCQkJCQlFbGVtZW50IGNoaWxkRWxlbSA9IChFbGVtZW50KSBjaGlsZDsKLQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGNlZCA9IENNVXRpbC5nZXREZWNsYXJhdGlvbihjaGlsZEVsZW0pOwotCQkJCQkJLy8gVW5kZWZpbmVkIGVsZW1lbnQgaXMgdmFsaWQuCi0JCQkJCQlpZiAoY2VkID09IG51bGwpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQkvLyBKU1AgKGluY2x1ZGVzIGN1c3RvbSB0YWdzKSBhbmQgU1NJIGFyZSB2YWxpZC4KLQkJCQkJCWlmIChDTVV0aWwuaXNGb3JlaWduKGNoaWxkRWxlbSkgfHwgQ01VdGlsLmlzU1NJKGNlZCkpCi0JCQkJCQkJY29udGludWU7IC8vIERlZmVjdCAxODY3NzQKLQotCQkJCQkJLy8gcmVwb3J0IGVycm9yIChpbnZhbGlkIGNvbnRlbnQpCi0JCQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCQkJLy8gbWFyayB0aGUgd2hvbGUgc3RhcnQgdGFnIGFzIGVycm9yLgotCQkJCQkJc2VnVHlwZSA9IEZNVXRpbC5TRUdfU1RBUlRfVEFHOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCQlpZiAoIWlzRnJhZ21lbnQpIHsKLQkJCQkJCS8vIFRFWFQgbm9kZSBpcyB2YWxpZCB3aGVuIGl0IGNvbnRhaW5zIHdoaXRlIHNwYWNlCi0JCQkJCQkvLyBjaGFyYWN0ZXJzIG9ubHkuCi0JCQkJCQkvLyBPdGhlcndpc2UsIGl0IGlzIGludmFsaWQgY29udGVudC4KLQkJCQkJCWlmICgoKElET01UZXh0KSBjaGlsZCkuaXNFbGVtZW50Q29udGVudFdoaXRlc3BhY2UoKSkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJCQlzZWdUeXBlID0gRk1VdGlsLlNFR19XSE9MRV9UQUc7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0JCQkJCS8vIERPQ1RZUEUgaXMgYWxzbyB2YWxpZCB3aGVuIGl0IGFwcGVhcnMgb25jZSBhbmQgb25seQotCQkJCQkvLyBvbmNlLgotCQkJCQlpZiAoIWZvdW5kRG9jdHlwZSkgewotCQkJCQkJZm91bmREb2N0eXBlID0gdHJ1ZTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5EVVBMSUNBVEVfRVJST1I7Ci0JCQkJCXNlZ1R5cGUgPSBGTVV0aWwuU0VHX1dIT0xFX1RBRzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6Ci0JCQkJLy8gYWx3YXlzIHZhbGlkLgotCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCQljb250aW51ZTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJaWYgKCFpc0ZyYWdtZW50KSB7Ci0JCQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCQkJc2VnVHlwZSA9IEZNVXRpbC5TRUdfV0hPTEVfVEFHOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGVycm9yICE9IEVycm9yU3RhdGUuTk9ORV9FUlJPUikgewotCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBGTVV0aWwuZ2V0U2VnbWVudChjaGlsZCwgc2VnVHlwZSk7Ci0JCQkJaWYgKGVycm9yU2VnICE9IG51bGwpCi0JCQkJCXJlcG9ydGVyLnJlcG9ydChuZXcgRXJyb3JJbmZvSW1wbChlcnJvciwgZXJyb3JTZWcsIGNoaWxkKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MRWxlbWVudEFuY2VzdG9yVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTEVsZW1lbnRBbmNlc3RvclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzYxZWRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MRWxlbWVudEFuY2VzdG9yVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgSFRNTEVsZW1lbnRBbmNlc3RvclZhbGlkYXRvciBleHRlbmRzIFByaW1lVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIEhUTUxFbGVtZW50QW5jZXN0b3JWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnRBbmNlc3RvclZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUKLQkgKiBhbGxvd3MgaXQgdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBIVE1MRWxlbWVudEFuY2VzdG9yVmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBleGNsdXNpb24gd2hpY2ggaXMgZGVmaW5lZCBpbiBvbmx5IEhUTUwgRFREIChTR01MKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJRWxlbWVudCB0YXJnZXQgPSAoRWxlbWVudCkgbm9kZTsKLQkJaWYgKENNVXRpbC5pc0ZvcmVpZ24odGFyZ2V0KSkKLQkJCXJldHVybjsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjID0gQ01VdGlsLmdldERlY2xhcmF0aW9uKHRhcmdldCk7Ci0JCWlmIChkZWMgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gY2Fubm90IHZhbGlkYXRlLgotCQlpZiAoIUNNVXRpbC5pc0hUTUwoZGVjKSkKLQkJCXJldHVybjsgLy8gbm8gbmVlZCB0byB2YWxpZGF0ZQotCQlpZiAoIWRlYy5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlBST0hJQklURURfQU5DRVNUT1JTKSkKLQkJCXJldHVybjsgLy8gY2Fubm90IHZhbGlkYXRlLgotCQlDTU5hbWVkTm9kZU1hcCBwcm9oaWJpdGVkID0gKENNTmFtZWROb2RlTWFwKSBkZWMuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5QUk9ISUJJVEVEX0FOQ0VTVE9SUyk7Ci0JCWlmIChwcm9oaWJpdGVkLmdldExlbmd0aCgpIDw9IDApCi0JCQlyZXR1cm47IC8vIG5vIHByb2hpYml0ZWQgYW5jZXN0b3JzLgotCi0JCUVsZW1lbnQgcGFyZW50ID0gU01VdGlsLmdldFBhcmVudEVsZW1lbnQodGFyZ2V0KTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlDTU5vZGUgcGRlYyA9IHByb2hpYml0ZWQuZ2V0TmFtZWRJdGVtKHBhcmVudC5nZXROb2RlTmFtZSgpKTsKLQkJCWlmIChwZGVjICE9IG51bGwpIHsgLy8gcHJvaGliaXRlZCBlbGVtZW50IGlzIGZvdW5kIGluIGFuY2VzdG9ycy4KLQkJCQlTZWdtZW50IGVycm9yU2VnID0gRk1VdGlsLmdldFNlZ21lbnQoKElET01Ob2RlKSBub2RlLCBGTVV0aWwuU0VHX1NUQVJUX1RBRyk7Ci0JCQkJaWYgKGVycm9yU2VnICE9IG51bGwpCi0JCQkJCXJlcG9ydGVyLnJlcG9ydChuZXcgRXJyb3JJbmZvSW1wbChFcnJvclN0YXRlLklOVkFMSURfQ09OVEVOVF9FUlJPUiwgZXJyb3JTZWcsIHRhcmdldCkpOwotCQkJCWJyZWFrOyAvLyBJZiBvbmUgcHJvaGliaXRlZCBhbmNlc3RvciBpcyBmb3VuZCwgaXQncyBlbm91Z2guCi0JCQl9Ci0JCQlwYXJlbnQgPSBTTVV0aWwuZ2V0UGFyZW50RWxlbWVudChwYXJlbnQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDYwZGFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MRWxlbWVudENvbnRlbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEhUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvciBleHRlbmRzIFByaW1lVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIEhUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBIVE1MRWxlbWVudENvbnRlbnRWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gSFRNTEVsZW1lbnRDb250ZW50VmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJRWxlbWVudCB0YXJnZXQgPSAoRWxlbWVudCkgbm9kZTsKLQkJaWYgKENNVXRpbC5pc0ZvcmVpZ24odGFyZ2V0KSkKLQkJCXJldHVybjsKLQotCQl2YWxpZGF0ZUNvbnRlbnQodGFyZ2V0LCB0YXJnZXQuZ2V0Rmlyc3RDaGlsZCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ29udGVudChFbGVtZW50IHBhcmVudCwgTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IENNVXRpbC5nZXREZWNsYXJhdGlvbihwYXJlbnQpOwotCQlpZihlZCA9PSBudWxsIHx8IGVkLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKQotCQkJcmV0dXJuOwotCQkKLQkJTGlzdFtdIGV4dGVuZGVkQ29udGVudCA9IG5ldyBMaXN0WzFdOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJLy8gcGVyZm9ybSBhY3R1YWwgdmFsaWRhdGlvbgotCQkJdmFsaWRhdGVOb2RlKHBhcmVudCwgY2hpbGQsIGVkLCBleHRlbmRlZENvbnRlbnQpOwotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSBpbnQgY291bnRFeHBsaWNpdFNpYmxpbmdzKEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgdGFnTmFtZSkgewotCS8vIE5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkvLyBpbnQgY291bnQgPSAwOwotCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCS8vIE5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCS8vIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCS8vIGNvbnRpbnVlOwotCS8vIGlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoKChFbGVtZW50KSBjaGlsZCkuZ2V0VGFnTmFtZSgpKSkgewotCS8vIGNvdW50Kys7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gY291bnQ7Ci0JLy8gfQotCi0JLyoKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZvbGxvd2luZyBtZXRob2QgaXMgcHJhY3RpY2FsIGJ1dCBhY2N1cmF0ZS4KLQkgKiBUaGUgYWNjdXJhdGUgbWF4aW11bSBvY2N1cnJlbmNlIHNob3VsZCBiZSByZXRyaWV2ZSBmcm9tIHRoZSBjb250ZW50Ci0JICogbW9kZWwuIEhvd2V2ZXIsIGl0IGlzIHVzZWZ1bCBlbm91Z2gsIHNpbmNlIGFsbW9zdCBpbXBsaWNpdCBlbGVtZW50cyBhcmUKLQkgKiBIVE1MLCBIRUFELCBvciBCT0RZLgotCSAqLwotCS8vIHByaXZhdGUgaW50IGdldE1heE9jY3VyKEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgY2hpbGRUYWcpIHsKLQkvLyByZXR1cm4gMTsKLQkvLyB9Ci0KLS8vCXByaXZhdGUgYm9vbGVhbiBjb250YWluc05hbWUoU3RyaW5nIG5hbWUsIE9iamVjdFtdIHBvc3NpYmxlKSB7Ci0vLwkJaWYgKG5hbWUgIT0gbnVsbCAmJiBwb3NzaWJsZSAhPSBudWxsKSB7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zc2libGUubGVuZ3RoOyBpKyspIHsKLS8vCQkJCWlmKG5hbWUuZXF1YWxzKHBvc3NpYmxlW2ldKSkKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiBmYWxzZTsKLS8vCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU5vZGUoRWxlbWVudCB0YXJnZXQsIE5vZGUgY2hpbGQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkZWMsIExpc3RbXSBleHRlbmRlZENvbnRlbnQpIHsKLQkJLy8gTk9URTogSWYgdGhlIHRhcmdldCBlbGVtZW50IGlzICdVTktOT1dOJywgdGhhdCBpcywgaXQgaGFzIG5vCi0JCS8vIGVsZW1lbnQgZGVjbGFyYXRpb24sIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIGVsZW1lbnQgc2hvdWxkIGJlCi0JCS8vIHJlZ2FyZGVkIGFzICdBTlknLiAtLSA5LzEwLzIwMDEKLQkJaW50IGNvbnRlbnRUeXBlID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudFR5cGUgPSBlZGVjLmdldENvbnRlbnRUeXBlKCk7Ci0KLQkJaW50IGVycm9yID0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SOwotCQlpbnQgc2VnVHlwZSA9IEZNVXRpbC5TRUdfV0hPTEVfVEFHOwotCQkKLQkJc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCQlFbGVtZW50IGNoaWxkRWxlbSA9IChFbGVtZW50KSBjaGlsZDsKLQkJCQkvLyBEZWZlY3QgMjAwMzIxOgotCQkJCS8vIFRoaXMgdmFsaWRhdG9yIGNhcmVzIG9ubHkgSFRNTC9YSFRNTCBlbGVtZW50cy4gSWYgYSBjaGlsZAotCQkJCS8vIGlzCi0JCQkJLy8gYW4gZWxlbWVudCBvZiBmb3JlaWduIG1hcmt1cCBsYW5ndWFnZXMsIGp1c3QgaWdub3JlIGl0LgotCQkJCWlmIChDTVV0aWwuaXNGb3JlaWduKGNoaWxkRWxlbSkpCi0JCQkJCXJldHVybjsKLQotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGNlZCA9IENNVXRpbC5nZXREZWNsYXJhdGlvbigoRWxlbWVudCkgY2hpbGQpOwotCQkJCS8vIERlZmVjdCAxODY3NzQ6IElmIGEgY2hpbGQgaXMgbm90IG9uZSBvZiBIVE1MIGVsZW1lbnRzLAotCQkJCS8vIGl0IHNob3VsZCBiZSByZWdhcmRlZCBhcyBhIHZhbGlkIGNoaWxkIHJlZ2FyZGxlc3MgdGhlCi0JCQkJLy8gdHlwZSBvZiB0aGUgcGFyZW50IGNvbnRlbnQgbW9kZWwuIC0tIDEwLzEyLzIwMDEKLQkJCQlpZiAoY2VkID09IG51bGwgfHwgQ01VdGlsLmlzU1NJKGNlZCkgfHwgKCFDTVV0aWwuaXNIVE1MKGNlZCkpKQotCQkJCQlyZXR1cm47Ci0JCQkJaWYgKENNVXRpbC5pc09ic29sZXRlKGNlZCkpewotCQkJCQllcnJvciA9IEVycm9yU3RhdGUuT0JTT0xFVEVfVEFHX05BTUVfRVJST1I7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkKLQkJCQlzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZIDoKLQkJCQkJCS8vIEtlZXAgZ29pbmcuCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCA6Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQgOgotCQkJCQkJaWYgKGNlZCA9PSBudWxsKQotCQkJCQkJCXJldHVybjsKLQkJCQkJCWlmIChDTVV0aWwuaXNWYWxpZENoaWxkKGVkZWMsIGNlZCkpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJLy8gTm93LCBpdCBpcyB0aGUgdGltZSB0byBjaGVjayBpbmNsdXNpb24sIHVubGVzcyB0aGUKLQkJCQkJCS8vIHRhcmdldAotCQkJCQkJLy8gZG9jdW1lbnQgaXMgbm90IGEgWEhUTUwuCi0JCQkJCQlpZiAoIUNNVXRpbC5pc1hIVE1MKGVkZWMpKSB7Ci0JCQkJCQkJLy8gcHVyZSBIVE1MCi0JCQkJCQkJaWYgKENNVXRpbC5pc1ZhbGlkSW5jbHVzaW9uKGNlZCwgdGFyZ2V0KSkKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQkvKgotCQkJCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxODE0MyAtIAotCQkJCQkJICogTW9kZWxRdWVyeSB1c2Ugbm90IHBlcnZhc2l2ZSBlbm91Z2gKLQkJCQkJCSAqLwotCQkJCQkJaWYgKGV4dGVuZGVkQ29udGVudFswXSA9PSBudWxsKSB7Ci0JCQkJCQkJZXh0ZW5kZWRDb250ZW50WzBdID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSh0YXJnZXQuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBdmFpbGFibGVDb250ZW50KHRhcmdldCwgZWRlYywgTW9kZWxRdWVyeS5JTkNMVURFX0NISUxEX05PREVTKTsKLQkJCQkJCX0KLQotCQkJCQkJTGlzdCBhdmFpbGFibGVDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMgPSBleHRlbmRlZENvbnRlbnRbMF07Ci0JCQkJCQkvKgotCQkJCQkJICogUmV0cmlldmUgYW5kIHNldCBhc2lkZSBqdXN0IHRoZSBlbGVtZW50IG5hbWVzIGZvciBmYXN0ZXIgY2hlY2tpbmcKLQkJCQkJCSAqIGxhdGVyLgotCQkJCQkJICovCi0JCQkJCQlpbnQgYXZhaWxhYmxlQ2hpbGRDb3VudCA9IGF2YWlsYWJsZUNoaWxkRWxlbWVudERlY2xhcmF0aW9ucy5zaXplKCk7Ci0JCQkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBjZWQuZ2V0RWxlbWVudE5hbWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdmFpbGFibGVDaGlsZENvdW50OyBpKyspIHsKLQkJCQkJCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgYXZhaWxhYmxlQ2hpbGRFbGVtZW50RGVjbGFyYXRpb25zLmdldChpKTsKLQkJCQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04gJiYgY21ub2RlLmdldE5vZGVOYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKS5lcXVhbHMoZWxlbWVudE5hbWUpKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vIE1hcmsgdGhlIHdob2xlIFNUQVJUIHRhZyBhcyBhbiBlcnJvciBzZWdtZW50LgotCQkJCXNlZ1R5cGUgPSBGTVV0aWwuU0VHX1NUQVJUX1RBRzsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCXN3aXRjaCAoY29udGVudFR5cGUpIHsKLQkJCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkgOgotCQkJCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIDoKLQkJCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgOgotCQkJCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBIDoKLQkJCQkJCS8vIEQxODQzMzkKLQkJCQkJCS8vIEtlZXAgZ29pbmcuCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCA6Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkgOgotCQkJCQkJaWYgKCgoSURPTVRleHQpIGNoaWxkKS5pc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpKQotCQkJCQkJCXJldHVybjsKLQkJCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vIE1hcmsgdGhlIHdob2xlIG5vZGUgYXMgYW4gZXJyb3Igc2VnbWVudC4KLQkJCQlzZWdUeXBlID0gRk1VdGlsLlNFR19XSE9MRV9UQUc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCWlmIChjb250ZW50VHlwZSAhPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkKLQkJCQkJcmV0dXJuOwotCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJLy8gTWFyayB0aGUgd2hvbGUgbm9kZSBhcyBhbiBlcnJvciBzZWdtZW50LgotCQkJCXNlZ1R5cGUgPSBGTVV0aWwuU0VHX1dIT0xFX1RBRzsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCWlmIChlZGVjLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpICYmIEJvb2xlYW4uVFJVRS5lcXVhbHMoZWRlYy5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkpCi0JCQkJCXJldHVybjsKLQkJCQkvLyBNYXJrIHRoZSB3aG9sZSBDREFUQSBzZWN0aW9uIGFzIGFuIGVycm9yIHNlZ21lbnQKLQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCXNlZ1R5cGUgPSBGTVV0aWwuU0VHX1dIT0xFX1RBRzsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOgotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJZXJyb3IgPSBFcnJvclN0YXRlLklOVkFMSURfQ09OVEVOVF9FUlJPUjsKLQkJCQkvLyBNYXJrIHRoZSB3aG9sZSBub2RlIGFzIGFuIGVycm9yIHNlZ21lbnQuCi0JCQkJc2VnVHlwZSA9IEZNVXRpbC5TRUdfV0hPTEVfVEFHOwotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChlcnJvciAhPSBFcnJvclN0YXRlLk5PTkVfRVJST1IpIHsKLQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBGTVV0aWwuZ2V0U2VnbWVudCgoSURPTU5vZGUpIGNoaWxkLCBzZWdUeXBlKTsKLQkJCWlmIChlcnJvclNlZyAhPSBudWxsKQotCQkJCXJlcG9ydGVyLnJlcG9ydChuZXcgRXJyb3JJbmZvSW1wbChlcnJvciwgZXJyb3JTZWcsIGNoaWxkKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTFNpbXBsZURvY3VtZW50VmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTFNpbXBsZURvY3VtZW50VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1Nzk1YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxTaW1wbGVEb2N1bWVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi1jbGFzcyBIVE1MU2ltcGxlRG9jdW1lbnRWYWxpZGF0b3IgZXh0ZW5kcyBDb21wb3NpdGVWYWxpZGF0b3IgewotCi0JLyoqCi0JICogSFRNTFNpbXBsZURvY3VtZW50VmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEhUTUxTaW1wbGVEb2N1bWVudFZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQotCQlWYWxpZGF0aW9uQ29tcG9uZW50W10gdmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0aW9uQ29tcG9uZW50WzJdOwotCi0JCXZhbGlkYXRvcnNbMF0gPSBuZXcgSFRNTERvY3VtZW50Q29udGVudFZhbGlkYXRvcigpOwotCQl2YWxpZGF0b3JzWzFdID0gbmV3IFN5bnRheFZhbGlkYXRvcigpOwotCi0JCXJlZ2lzdGVyKHZhbGlkYXRvcnMpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZQotCSAqIGFsbG93cyBpdCB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IEhUTUxTaW1wbGVEb2N1bWVudFZhbGlkYXRvci5jbGFzcykgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxTaW1wbGVWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MU2ltcGxlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNzZmZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxTaW1wbGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkNvbXBvbmVudDsKLQotY2xhc3MgSFRNTFNpbXBsZVZhbGlkYXRvciBleHRlbmRzIENvbXBvc2l0ZVZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiBIVE1MU2ltcGxlVmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEhUTUxTaW1wbGVWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJVmFsaWRhdGlvbkNvbXBvbmVudFtdIHZhbGlkYXRvcnMgPSBuZXcgVmFsaWRhdGlvbkNvbXBvbmVudFs1XTsKLQotCQl2YWxpZGF0b3JzWzBdID0gbmV3IEhUTUxBdHRyaWJ1dGVWYWxpZGF0b3IoKTsKLQkJdmFsaWRhdG9yc1sxXSA9IG5ldyBIVE1MRWxlbWVudENvbnRlbnRWYWxpZGF0b3IoKTsKLQkJdmFsaWRhdG9yc1syXSA9IG5ldyBTeW50YXhWYWxpZGF0b3IoKTsKLQkJdmFsaWRhdG9yc1szXSA9IG5ldyBIVE1MRWxlbWVudEFuY2VzdG9yVmFsaWRhdG9yKCk7Ci0JCXZhbGlkYXRvcnNbNF0gPSBuZXcgTmFtZXNwYWNlVmFsaWRhdG9yKCk7Ci0KLQkJcmVnaXN0ZXIodmFsaWRhdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlCi0JICogYWxsb3dzIGl0IHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gSFRNTFNpbXBsZVZhbGlkYXRvci5jbGFzcykgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMTBlMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoVmFsaWRhdGlvbkFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gYWRhcHRlcktleSBqYXZhLmxhbmcuT2JqZWN0Ci0JICogQHBhcmFtIHJlZ2lzdGVyQWRhcHRlcnMgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5KE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSB0YXJnZXQ7Ci0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuRE9DVU1FTlRfTk9ERSA6Ci0JCQkJcmV0dXJuIG5ldyBEb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yKCk7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCQlyZXR1cm4gbmV3IEVsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvcigpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG5ldyBOdWxsVmFsaWRhdG9yKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgIT0gbnVsbCkKLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJaW5zdGFuY2UgPSBuZXcgSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGluZyBPYmplY3QncyBjbG9uZSgpIG1ldGhvZAotCSAqIFRoaXMgaXMgdXNlZCBpbiBJTW9kZWxNYW5hZ2VyJ3MgSVN0cnVjdHVyZWRNb2RlbCBjb3B5aW5nLgotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9NZXNzYWdlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL01lc3NhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZWQyMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL01lc3NhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLkVycm9ySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VGYWN0b3J5IGltcGxlbWVudHMgRXJyb3JTdGF0ZSB7Ci0KLQotCXByaXZhdGUgSVByb2plY3QgZlByb2plY3Q7Ci0JcHJpdmF0ZSBJU2NvcGVDb250ZXh0W10gZkxvb2t1cE9yZGVyOwotCXByaXZhdGUgSVByZWZlcmVuY2VzU2VydmljZSBmUHJlZmVyZW5jZVNlcnZpY2U7Ci0JCi0JcHVibGljIE1lc3NhZ2VGYWN0b3J5KCkgewotCQlpbml0KCk7Ci0JfQotCQotCXB1YmxpYyBNZXNzYWdlRmFjdG9yeShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWZQcm9qZWN0ID0gcHJvamVjdDsKLQkJaW5pdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgcGFja2V0IGZvciB0aGUgZXJyb3IgdGFibGUgYmFzZWQgb24gdGhlIHN0YXRlLCBtZXNzYWdlLCBhbmQgdGhlCi0JICogc2V2ZXJpdHkgZGVmaW5lZCBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4gVGhpcyBwYWNrZXQsIGluIGFkZGl0aW9uIHRvCi0JICogYmVpbmcgYWRkZWQgdG8gdGhlIGVycm9yIHRhYmxlLCBpcyBhbHNvIHBsYWNlZCBpbiBhIG1hcCBiYXNlZCBvbiB0aGUKLQkgKiBzdXBwbGllZCBwcmVmZXJlbmNlIGtleQotCSAqIAotCSAqIEBwYXJhbSBrZXkgdGhlIHByZWZlcmVuY2Uga2V5IGZvciB0aGUgZXJyb3Igc2V2ZXJpdHkKLQkgKiBAcGFyYW0gZXJyb3JUYWJsZSB0aGUgZXJyb3IgdGFibGUgdG8gc3RvcmUgdGhlIHBhY2tldCBpbmZvcm1hdGlvbiBpbgotCSAqIEBwYXJhbSBzdGF0ZSB0aGUgZXJyb3Igc3RhdGUKLQkgKiBAcGFyYW0gbXNnIHRoZSBtZXNzYWdlIGZvciB0aGUgZXJyb3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFwVG9LZXkoU3RyaW5nIGtleSwgRXJyb3JUYWJsZSBlcnJvclRhYmxlLCBpbnQgc3RhdGUsIFN0cmluZyBtc2cpIHsKLQkJaW50IHNldmVyaXR5ID0gVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORzsKLQkJc2V2ZXJpdHkgPSBmUHJlZmVyZW5jZVNlcnZpY2UuZ2V0SW50KEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwga2V5LCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HLCBmTG9va3VwT3JkZXIpOwotCQllcnJvclRhYmxlLnB1dChzdGF0ZSwgbXNnLCBzZXZlcml0eSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQlmUHJlZmVyZW5jZVNlcnZpY2UgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKTsKLQkJZkxvb2t1cE9yZGVyID0gbmV3IElTY29wZUNvbnRleHRbXSB7bmV3IEluc3RhbmNlU2NvcGUoKSwgbmV3IERlZmF1bHRTY29wZSgpfTsKLQkJCi0JCWlmIChmUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlQcm9qZWN0U2NvcGUgcHJvamVjdFNjb3BlID0gbmV3IFByb2plY3RTY29wZShmUHJvamVjdCk7Ci0JCQlpZihwcm9qZWN0U2NvcGUuZ2V0Tm9kZShIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVNFX1BST0pFQ1RfU0VUVElOR1MsIGZhbHNlKSkKLQkJCQlmTG9va3VwT3JkZXIgPSBuZXcgSVNjb3BlQ29udGV4dFtdIHtwcm9qZWN0U2NvcGUsIG5ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0JCX0KLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgTm9kZVR5cGUuTUFYX1RZUEU7IGkrKykgewotCQkJZXJyVGFibGVzW2ldID0gbmV3IEVycm9yVGFibGUoKTsKLQkJfQotCQkvLyBOT1RFOiBUaGUgc2V2ZXJpdGllcyBhcmUganVzdCBzdHViLiAgVGhleSBtdXN0IGJlIHJldmlld2VkLgotCQkvLyAtLSA4LzMwLzIwMDEKLQotCQkvLyBhdHRyaWJ1dGUgZXJyb3IgbWFwCi0JCUVycm9yVGFibGUgYXR0clRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLkFUVFJJQlVURV07Ly8gc2hvcnQgaGFuZAotCQlhdHRyVGFibGUucHV0KE5PTkVfRVJST1IsIE1TR19OT19FUlJPUiwgMCk7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9VTkRFRklORURfTkFNRSwgYXR0clRhYmxlLCBVTkRFRklORURfTkFNRV9FUlJPUiwgTVNHX1VOREVGSU5FRF9BVFRSX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX1VOREVGSU5FRF9WQUxVRSwgYXR0clRhYmxlLCBVTkRFRklORURfVkFMVUVfRVJST1IsIE1TR19VTkRFRklORURfVkFMVUVfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfTkFNRV9NSVNNQVRDSCwgYXR0clRhYmxlLCBNSVNNQVRDSEVEX0VSUk9SLCBNU0dfTUlTTUFUQ0hFRF9BVFRSX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX0lOVkFMSURfTkFNRSwgYXR0clRhYmxlLCBJTlZBTElEX05BTUVfRVJST1IsIE1TR19JTlZBTElEX0FUVFJfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfSU5WQUxJRF9WQUxVRSwgYXR0clRhYmxlLCBJTlZBTElEX0FUVFJfRVJST1IsIE1TR19BVFRSX05PX1ZBTFVFX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX0RVUExJQ0FURSwgYXR0clRhYmxlLCBEVVBMSUNBVEVfRVJST1IsIE1TR19EVVBMSUNBVEVfQVRUUl9FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9WQUxVRV9NSVNNQVRDSCwgYXR0clRhYmxlLCBNSVNNQVRDSEVEX1ZBTFVFX0VSUk9SLCBNU0dfTUlTTUFUQ0hFRF9BVFRSX1ZBTFVFX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX1ZBTFVFX1VOQ0xPU0VELCBhdHRyVGFibGUsIFVOQ0xPU0VEX0FUVFJfVkFMVUUsIE1TR19VTkNMT1NFRF9BVFRSX1ZBTFVFX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX1ZBTFVFX1JFU09VUkNFX05PVF9GT1VORCwgYXR0clRhYmxlLCBSRVNPVVJDRV9OT1RfRk9VTkQsIE1TR19SRVNPVVJDRV9OT1RfRk9VTkQpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfT0JTT0xFVEVfTkFNRSwgYXR0clRhYmxlLCBPQlNPTEVURV9BVFRSX05BTUVfRVJST1IsIE1TR19PQlNPTEVURV9BVFRSX0VSUk9SKTsKLQotCQkvLyBlbGVtZW50IGVycm9yIG1hcAotCQlFcnJvclRhYmxlIGVsZW1UYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTEVNRU5UXTsvLyBzaG9ydCBoYW5kCi0JCWVsZW1UYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9VTktOT1dOX05BTUUsIGVsZW1UYWJsZSwgVU5ERUZJTkVEX05BTUVfRVJST1IsIE1TR19VTkRFRklORURfVEFHX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9JTlZBTElEX05BTUUsIGVsZW1UYWJsZSwgSU5WQUxJRF9OQU1FX0VSUk9SLCBNU0dfSU5WQUxJRF9UQUdfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX1NUQVJUX0lOVkFMSURfQ0FTRSwgZWxlbVRhYmxlLCBNSVNNQVRDSEVEX0VSUk9SLCBNU0dfTUlTTUFUQ0hFRF9UQUdfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0VORF9JTlZBTElEX0NBU0UsIGVsZW1UYWJsZSwgTUlTTUFUQ0hFRF9FTkRfVEFHX0VSUk9SLCBNU0dfTUlTTUFUQ0hFRF9UQUdfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX01JU1NJTkdfU1RBUlQsIGVsZW1UYWJsZSwgTUlTU0lOR19TVEFSVF9UQUdfRVJST1IsIE1TR19NSVNTSU5HX1NUQVJUX1RBR19FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fTUlTU0lOR19FTkQsIGVsZW1UYWJsZSwgTUlTU0lOR19FTkRfVEFHX0VSUk9SLCBNU0dfTUlTU0lOR19FTkRfVEFHX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9VTk5FQ0VTU0FSWV9FTkQsIGVsZW1UYWJsZSwgVU5ORUNFU1NBUllfRU5EX1RBR19FUlJPUiwgTVNHX1VOTkVDRVNTQVJZX0VORF9UQUdfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0lOVkFMSURfRElSRUNUSVZFLCBlbGVtVGFibGUsIElOVkFMSURfRElSRUNUSVZFX0VSUk9SLCBNU0dfSU5WQUxJRF9ESVJFQ1RJVkVfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0lOVkFMSURfQ09OVEVOVCwgZWxlbVRhYmxlLCBJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0RVUExJQ0FURSwgZWxlbVRhYmxlLCBEVVBMSUNBVEVfRVJST1IsIE1TR19EVVBMSUNBVEVfVEFHX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9DT0VYSVNURU5DRSwgZWxlbVRhYmxlLCBDT0VYSVNURU5DRV9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fVU5DTE9TRURfU1RBUlRfVEFHLCBlbGVtVGFibGUsIFVOQ0xPU0VEX1RBR19FUlJPUiwgTVNHX1VOQ0xPU0VEX1NUQVJUX1RBR19FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fVU5DTE9TRURfRU5EX1RBRywgZWxlbVRhYmxlLCBVTkNMT1NFRF9FTkRfVEFHX0VSUk9SLCBNU0dfVU5DTE9TRURfRU5EX1RBR19FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fSU5WQUxJRF9FTVBUWV9UQUcsIGVsZW1UYWJsZSwgSU5WQUxJRF9FTVBUWV9FTEVNRU5UX1RBRywgTVNHX0lOVkFMSURfRU1QVFlfRUxFTUVOVF9UQUcpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX09CU09MRVRFX05BTUUsIGVsZW1UYWJsZSwgT0JTT0xFVEVfVEFHX05BTUVfRVJST1IsIE1TR19PQlNPTEVURV9UQUdfRVJST1IpOwotCi0KLQkJLy8gZG9jdW1lbnQgdHlwZSBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSBkb2NUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5ET0NVTUVOVF9UWVBFXTsvLyBzaG9ydCBoYW5kCi0JCWRvY1RhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ET0NfRFVQTElDQVRFLCBkb2NUYWJsZSwgRFVQTElDQVRFX0VSUk9SLCBNU0dfRFVQTElDQVRFX1RBR19FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRPQ19JTlZBTElEX0NPTlRFTlQsIGRvY1RhYmxlLCBJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ET0NfRE9DVFlQRV9VTkNMT1NFRCwgZG9jVGFibGUsIFVOQ0xPU0VEX1RBR19FUlJPUiwgTVNHX1VOQ0xPU0VEX0RPQ1RZUEVfRVJST1IpOwotCi0JCS8vIHRleHQgZXJyb3IgbWFwCi0JCUVycm9yVGFibGUgdGV4dFRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLlRFWFRdOwotCQl0ZXh0VGFibGUucHV0KE5PTkVfRVJST1IsIE1TR19OT19FUlJPUiwgMCk7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRFWFRfSU5WQUxJRF9DT05URU5ULCB0ZXh0VGFibGUsIElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfVEVYVF9FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRFWFRfSU5WQUxJRF9DSEFSLCB0ZXh0VGFibGUsIElOVkFMSURfQ0hBUl9FUlJPUiwgTVNHX0lOVkFMSURfQ0hBUl9FUlJPUik7Ci0KLQkJLy8gY29tbWVudCBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSBjb21tVGFibGUgPSBlcnJUYWJsZXNbTm9kZVR5cGUuQ09NTUVOVF07Ci0JCWNvbW1UYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NTUVOVF9JTlZBTElEX0NPTlRFTlQsIGNvbW1UYWJsZSwgSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NTUVOVF9VTkNMT1NFRCwgY29tbVRhYmxlLCBVTkNMT1NFRF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9DT01NRU5UX0VSUk9SKTsKLQotCQkvLyBjZGF0YSBzZWN0aW9uIGVycm9yIG1hcAotCQlFcnJvclRhYmxlIGNkYXRUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5DREFUQV9TRUNUSU9OXTsKLQkJY2RhdFRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DREFUQV9JTlZBTElEX0NPTlRFTlQsIGNkYXRUYWJsZSwgSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0RBVEFfVU5DTE9TRUQsIGNkYXRUYWJsZSwgVU5DTE9TRURfVEFHX0VSUk9SLCBNU0dfVU5DTE9TRURfQ0RBVEFfU0VDVElPTl9FUlJPUik7Ci0KLQkJLy8gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSBwaVRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05dOwotCQlwaVRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5QSV9JTlZBTElEX0NPTlRFTlQsIHBpVGFibGUsIElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBJX1VOQ0xPU0VELCBwaVRhYmxlLCBVTkNMT1NFRF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9QSV9FUlJPUik7Ci0KLQkJLy8gZW50aXR5IHJlZmVyZW5jZSBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSBlclRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLkVOVElUWV9SRUZFUkVOQ0VdOwotCQllclRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5SRUZfVU5ERUZJTkVELCBlclRhYmxlLCBVTkRFRklORURfTkFNRV9FUlJPUiwgTVNHX1VOREVGSU5FRF9UQUdfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5SRUZfSU5WQUxJRF9DT05URU5ULCBlclRhYmxlLCBJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFcnJvclRhYmxlIHsKLQkJcHJpdmF0ZSBjbGFzcyBQYWNrZXQgewotCQkJcHVibGljIFBhY2tldChTdHJpbmcgbXNnLCBpbnQgc2V2ZXJpdHkpIHsKLQkJCQl0aGlzLm1zZyA9IG1zZzsKLQkJCQl0aGlzLnNldmVyaXR5ID0gc2V2ZXJpdHk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJCQlyZXR1cm4gbXNnOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewotCQkJCXJldHVybiBzZXZlcml0eTsKLQkJCX0KLQotCQkJcHJpdmF0ZSBTdHJpbmcgbXNnID0gbnVsbDsKLQkJCXByaXZhdGUgaW50IHNldmVyaXR5ID0gLTE7Ci0JCX0KLQotCQlwdWJsaWMgRXJyb3JUYWJsZSgpIHsKLQkJfQotCi0JCXB1YmxpYyBQYWNrZXQgcHV0KGludCBzdGF0ZSwgU3RyaW5nIG1zZywgaW50IHNldmVyaXR5KSB7Ci0JCQlQYWNrZXQgcGFja2V0ID0gbmV3IFBhY2tldChtc2csIHNldmVyaXR5KTsKLQkJCW1hcC5wdXQobmV3IEludGVnZXIoc3RhdGUpLCBwYWNrZXQpOwotCQkJcmV0dXJuIHBhY2tldDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShpbnQgc3RhdGUpIHsKLQkJCXJldHVybiBnZXRQYWNrZXQoc3RhdGUpLmdldE1lc3NhZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoaW50IHN0YXRlKSB7Ci0JCQlyZXR1cm4gZ2V0UGFja2V0KHN0YXRlKS5nZXRTZXZlcml0eSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBQYWNrZXQgZ2V0UGFja2V0KGludCBzdGF0ZSkgewotCQkJcmV0dXJuIChQYWNrZXQpIG1hcC5nZXQobmV3IEludGVnZXIoc3RhdGUpKTsKLQkJfQotCi0JCXByaXZhdGUgSGFzaHRhYmxlIG1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgTm9kZVR5cGUgewotCQlzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURSA9IDA7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVCA9IDE7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgRE9DVU1FTlRfVFlQRSA9IDI7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgVEVYVCA9IDM7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVCA9IDQ7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgQ0RBVEFfU0VDVElPTiA9IDU7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgUFJPQ0VTU0lOR19JTlNUUlVDVElPTiA9IDY7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX1JFRkVSRU5DRSA9IDc7Ci0KLQkJc3RhdGljIGZpbmFsIGludCBNQVhfVFlQRSA9IDg7Ci0JfQotCi0JLy8gZXJyb3IgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX05PX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5Ob19lcnJvcl9fVUlfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5ERUZJTkVEX0FUVFJfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLlVuZGVmaW5lZF9hdHRyaWJ1dGVfbmFtZV9fX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOREVGSU5FRF9WQUxVRV9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuVW5kZWZpbmVkX2F0dHJpYnV0ZV92YWx1ZV9fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfRFVQTElDQVRFX0FUVFJfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLk11bHRpcGxlX3ZhbHVlc19zcGVjaWZpZWRfX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX01JU01BVENIRURfQVRUUl9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuQXR0cmlidXRlX25hbWVfX18wX19fdXNlc19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfSU5WQUxJRF9BVFRSX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5JbnZhbGlkX2F0dHJpYnV0ZV9uYW1lX19fMF9FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19BVFRSX05PX1ZBTFVFX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5JbnZhbGlkX2F0dHJpYnV0ZV9fXzBfX19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5JbnZhbGlkX2xvY2F0aW9uX29mX3RhZ19fX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19EVVBMSUNBVEVfVEFHX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5EdXBsaWNhdGVfdGFnX19fMF9fX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19NSVNTSU5HX1NUQVJUX1RBR19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuTm9fc3RhcnRfdGFnX19fXzBfX19fX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX01JU1NJTkdfRU5EX1RBR19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuTm9fZW5kX3RhZ19fX19fMF9fX19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5ORUNFU1NBUllfRU5EX1RBR19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuRW5kX3RhZ19fX19fMF9fX19ub3RfbmVlZGVfRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5ERUZJTkVEX1RBR19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuVW5rbm93bl90YWdfX18wX19fX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX01JU01BVENIRURfVEFHX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5UYWdfbmFtZV9fXzBfX191c2VzX3dyb25nX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19JTlZBTElEX1RBR19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuSW52YWxpZF90YWdfbmFtZV9fXzBfX19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfSU5WQUxJRF9ESVJFQ1RJVkVfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfSlNQX2RpcmVjdGl2ZV9fXzBfX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0lOVkFMSURfVEVYVF9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuSW52YWxpZF90ZXh0X3N0cmluZ19fXzBfX19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfSU5WQUxJRF9DSEFSX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5JbnZhbGlkX2NoYXJhY3Rlcl91c2VkX2luX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTktOT1dOX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5Vbmtub3duX2Vycm9yX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkNMT1NFRF9TVEFSVF9UQUdfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLlN0YXJ0X3RhZ19fX18wX19fX25vdF9jbG9zX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOQ0xPU0VEX0VORF9UQUdfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkVuZF90YWdfX19fXzBfX19fbm90X2Nsb3NlX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX01JU01BVENIRURfQVRUUl9WQUxVRV9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuQXR0cmlidXRlX3ZhbHVlX19fMF9fX3VzZXNfRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5DTE9TRURfQ09NTUVOVF9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuQ29tbWVudF9ub3RfY2xvc2VkX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkNMT1NFRF9ET0NUWVBFX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5ET0NUWVBFX2RlY2xhcmF0aW9uX25vdF9jbF9FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkNMT1NFRF9QSV9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuUHJvY2Vzc2luZ19pbnN0cnVjdGlvbl9ub3RfRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5DTE9TRURfQ0RBVEFfU0VDVElPTl9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuQ0RBVEFfc2VjdGlvbl9ub3RfY2xvc2VkX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19JTlZBTElEX0VNUFRZX0VMRU1FTlRfVEFHID0gSFRNTENvcmVNZXNzYWdlcy5fRVJST1JfVGFnX19fMF9fX3Nob3VsZF9iZV9hbl9lbXB0eV9lbGVtZW50X3RhZ18xOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5DTE9TRURfQVRUUl9WQUxVRV9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuX0VSUk9SX0F0dHJpYnV0ZV92YWx1ZV9fXzBfX19ub3RfY2xvc2VkX18xOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfUkVTT1VSQ0VfTk9UX0ZPVU5EID0gSFRNTENvcmVNZXNzYWdlcy5fRVJST1JfUmVzb3VyY2Vfbm90X2ZvdW5kXzA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19PQlNPTEVURV9BVFRSX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5PYnNvbGV0ZV9hdHRyaWJ1dGVfbmFtZV9fX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX09CU09MRVRFX1RBR19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuT2Jzb2xldGVfdGFnX19fRVJST1JfOwotCQotCXByaXZhdGUgRXJyb3JUYWJsZVtdIGVyclRhYmxlcyA9IG5ldyBFcnJvclRhYmxlW05vZGVUeXBlLk1BWF9UWVBFXTsKLQotLy8Jc3RhdGljIHsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IE5vZGVUeXBlLk1BWF9UWVBFOyBpKyspIHsKLS8vCQkJZXJyVGFibGVzW2ldID0gbmV3IEVycm9yVGFibGUoKTsKLS8vCQl9Ci0vLwkJLy8gTk9URTogVGhlIHNldmVyaXRpZXMgYXJlIGp1c3Qgc3R1Yi4gIFRoZXkgbXVzdCBiZSByZXZpZXdlZC4KLS8vCQkvLyAtLSA4LzMwLzIwMDEKLS8vCi0vLwkJLy8gYXR0cmlidXRlIGVycm9yIG1hcAotLy8JCUVycm9yVGFibGUgYXR0clRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLkFUVFJJQlVURV07Ly8gc2hvcnQgaGFuZAotLy8JCWF0dHJUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLS8vCQlhdHRyVGFibGUucHV0KFVOREVGSU5FRF9OQU1FX0VSUk9SLCBNU0dfVU5ERUZJTkVEX0FUVFJfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCWF0dHJUYWJsZS5wdXQoVU5ERUZJTkVEX1ZBTFVFX0VSUk9SLCBNU0dfVU5ERUZJTkVEX1ZBTFVFX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLS8vCQlhdHRyVGFibGUucHV0KE1JU01BVENIRURfRVJST1IsIE1TR19NSVNNQVRDSEVEX0FUVFJfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCWF0dHJUYWJsZS5wdXQoSU5WQUxJRF9OQU1FX0VSUk9SLCBNU0dfSU5WQUxJRF9BVFRSX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLS8vCQlhdHRyVGFibGUucHV0KElOVkFMSURfQVRUUl9FUlJPUiwgTVNHX0FUVFJfTk9fVkFMVUVfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCWF0dHJUYWJsZS5wdXQoRFVQTElDQVRFX0VSUk9SLCBNU0dfRFVQTElDQVRFX0FUVFJfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCWF0dHJUYWJsZS5wdXQoTUlTTUFUQ0hFRF9WQUxVRV9FUlJPUiwgTVNHX01JU01BVENIRURfQVRUUl9WQUxVRV9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotLy8JCS8vPDxEMjEwNDIyCi0vLwkJYXR0clRhYmxlLnB1dChVTkNMT1NFRF9BVFRSX1ZBTFVFLCBNU0dfVU5DTE9TRURfQVRUUl9WQUxVRV9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJLy9EMjEwNDIyCi0vLwkJLy8gZWxlbWVudCBlcnJvciBtYXAKLS8vCQlFcnJvclRhYmxlIGVsZW1UYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTEVNRU5UXTsvLyBzaG9ydCBoYW5kCi0vLwkJZWxlbVRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotLy8JCWVsZW1UYWJsZS5wdXQoVU5ERUZJTkVEX05BTUVfRVJST1IsIE1TR19VTkRFRklORURfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLS8vCQllbGVtVGFibGUucHV0KElOVkFMSURfTkFNRV9FUlJPUiwgTVNHX0lOVkFMSURfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0vLwkJZWxlbVRhYmxlLnB1dChNSVNNQVRDSEVEX0VSUk9SLCBNU0dfTUlTTUFUQ0hFRF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCWVsZW1UYWJsZS5wdXQoTUlTTUFUQ0hFRF9FTkRfVEFHX0VSUk9SLCBNU0dfTUlTTUFUQ0hFRF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLS8vCQllbGVtVGFibGUucHV0KE1JU1NJTkdfU1RBUlRfVEFHX0VSUk9SLCBNU0dfTUlTU0lOR19TVEFSVF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLS8vCQllbGVtVGFibGUucHV0KE1JU1NJTkdfRU5EX1RBR19FUlJPUiwgTVNHX01JU1NJTkdfRU5EX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJZWxlbVRhYmxlLnB1dChVTk5FQ0VTU0FSWV9FTkRfVEFHX0VSUk9SLCBNU0dfVU5ORUNFU1NBUllfRU5EX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJZWxlbVRhYmxlLnB1dChJTlZBTElEX0RJUkVDVElWRV9FUlJPUiwgTVNHX0lOVkFMSURfRElSRUNUSVZFX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0vLwkJZWxlbVRhYmxlLnB1dChJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCWVsZW1UYWJsZS5wdXQoRFVQTElDQVRFX0VSUk9SLCBNU0dfRFVQTElDQVRFX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJZWxlbVRhYmxlLnB1dChDT0VYSVNURU5DRV9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJZWxlbVRhYmxlLnB1dChVTkNMT1NFRF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9TVEFSVF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLS8vCQllbGVtVGFibGUucHV0KFVOQ0xPU0VEX0VORF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9FTkRfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0vLwkJZWxlbVRhYmxlLnB1dChJTlZBTElEX0VNUFRZX0VMRU1FTlRfVEFHLCBNU0dfSU5WQUxJRF9FTVBUWV9FTEVNRU5UX1RBRywgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwotLy8JCS8vIGRvY3VtZW50IHR5cGUgZXJyb3IgbWFwCi0vLwkJRXJyb3JUYWJsZSBkb2NUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5ET0NVTUVOVF9UWVBFXTsvLyBzaG9ydCBoYW5kCi0vLwkJZG9jVGFibGUucHV0KE5PTkVfRVJST1IsIE1TR19OT19FUlJPUiwgMCk7Ci0vLwkJZG9jVGFibGUucHV0KERVUExJQ0FURV9FUlJPUiwgTVNHX0RVUExJQ0FURV9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLS8vCQlkb2NUYWJsZS5wdXQoSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLS8vCQlkb2NUYWJsZS5wdXQoVU5DTE9TRURfVEFHX0VSUk9SLCBNU0dfVU5DTE9TRURfRE9DVFlQRV9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotLy8KLS8vCQkvLyB0ZXh0IGVycm9yIG1hcAotLy8JCUVycm9yVGFibGUgdGV4dFRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLlRFWFRdOwotLy8JCXRleHRUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLS8vCQl0ZXh0VGFibGUucHV0KElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfVEVYVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJdGV4dFRhYmxlLnB1dChJTlZBTElEX0NIQVJfRVJST1IsIE1TR19JTlZBTElEX0NIQVJfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8KLS8vCQkvLyBjb21tZW50IGVycm9yIG1hcAotLy8JCUVycm9yVGFibGUgY29tbVRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLkNPTU1FTlRdOwotLy8JCWNvbW1UYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLS8vCQljb21tVGFibGUucHV0KElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJY29tbVRhYmxlLnB1dChVTkNMT1NFRF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9DT01NRU5UX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0vLwotLy8JCS8vIGNkYXRhIHNlY3Rpb24gZXJyb3IgbWFwCi0vLwkJRXJyb3JUYWJsZSBjZGF0VGFibGUgPSBlcnJUYWJsZXNbTm9kZVR5cGUuQ0RBVEFfU0VDVElPTl07Ci0vLwkJY2RhdFRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotLy8JCWNkYXRUYWJsZS5wdXQoSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLS8vCQljZGF0VGFibGUucHV0KFVOQ0xPU0VEX1RBR19FUlJPUiwgTVNHX1VOQ0xPU0VEX0NEQVRBX1NFQ1RJT05fRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLS8vCi0vLwkJLy8gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlcnJvciBtYXAKLS8vCQlFcnJvclRhYmxlIHBpVGFibGUgPSBlcnJUYWJsZXNbTm9kZVR5cGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl07Ci0vLwkJcGlUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLS8vCQlwaVRhYmxlLnB1dChJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCXBpVGFibGUucHV0KFVOQ0xPU0VEX1RBR19FUlJPUiwgTVNHX1VOQ0xPU0VEX1BJX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0vLwotLy8JCS8vIGVudGl0eSByZWZlcmVuY2UgZXJyb3IgbWFwCi0vLwkJRXJyb3JUYWJsZSBlclRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLkVOVElUWV9SRUZFUkVOQ0VdOwotLy8JCWVyVGFibGUucHV0KE5PTkVfRVJST1IsIE1TR19OT19FUlJPUiwgMCk7Ci0vLwkJZXJUYWJsZS5wdXQoVU5ERUZJTkVEX05BTUVfRVJST1IsIE1TR19VTkRFRklORURfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLS8vCQllclRhYmxlLnB1dChJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25NZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoRXJyb3JJbmZvIGluZm8pIHsKLQkJU3RyaW5nIGVycm9yTXNnID0gZ2V0RXJyb3JNZXNzYWdlKGluZm8pOwotCQlpbnQgZXJyb3JTZXZlcml0eSA9IGdldEVycm9yU2V2ZXJpdHkoaW5mbyk7Ci0JCXJldHVybiBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UoZXJyb3JNc2csIGluZm8uZ2V0T2Zmc2V0KCksIGluZm8uZ2V0TGVuZ3RoKCksIGVycm9yU2V2ZXJpdHkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEVycm9yTWVzc2FnZShFcnJvckluZm8gaW5mbykgewotCQlFcnJvclRhYmxlIHRhYiA9IGdldEVycm9yVGFibGUoaW5mby5nZXRUYXJnZXRUeXBlKCkpOwotCQlpZiAodGFiID09IG51bGwpCi0JCQlyZXR1cm4gTVNHX1VOS05PV05fRVJST1I7Ci0KLQkJU3RyaW5nIHRlbXBsYXRlID0gdGFiLmdldE1lc3NhZ2UoaW5mby5nZXRTdGF0ZSgpKTsKLQkJT2JqZWN0W10gYXJndW1lbnRzID0ge2luZm8uZ2V0SGludCgpfTsKLQkJU3RyaW5nIHMgPSBudWxsOwotCQl0cnkgewotCQkJcyA9IE5MUy5iaW5kKHRlbXBsYXRlLCBhcmd1bWVudHMpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXMgPSB0ZW1wbGF0ZSArICI6IiArIGFyZ3VtZW50cy50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0RXJyb3JTZXZlcml0eShFcnJvckluZm8gaW5mbykgewotCQlFcnJvclRhYmxlIHRhYiA9IGdldEVycm9yVGFibGUoaW5mby5nZXRUYXJnZXRUeXBlKCkpOwotCQlpZiAodGFiID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIHRhYi5nZXRTZXZlcml0eShpbmZvLmdldFN0YXRlKCkpOwotCX0KLQotCXByaXZhdGUgRXJyb3JUYWJsZSBnZXRFcnJvclRhYmxlKHNob3J0IG5vZGV0eXBlKSB7Ci0JCUVycm9yVGFibGUgdGFiID0gbnVsbDsKLQkJc3dpdGNoIChub2RldHlwZSkgewotCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDoKLQkJCQl0YWIgPSBlcnJUYWJsZXNbTm9kZVR5cGUuQVRUUklCVVRFXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTEVNRU5UXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5ET0NVTUVOVF9UWVBFXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5URVhUXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5DT01NRU5UXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5DREFUQV9TRUNUSU9OXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTlRJVFlfUkVGRVJFTkNFXTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0YWI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL01vZHVsZUNvcmVTdXBwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTW9kdWxlQ29yZVN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjZTU5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTW9kdWxlQ29yZVN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyBhbnkgdXNlZCBNb2R1bGUgQ29yZSBBUElzIGFsb25nIHdpdGggZmFsbGJhY2tzIGZvcg0KLSAqIHVzZSBvbiBub24tY29tcGxpYW50IHByb2plY3RzIGFuZCB3aGVuIHRob3NlIHNlcnZpY2VzIGFyZSBub3QgYXZhaWxhYmxlIGF0DQotICogcnVudGltZS4NCi0gKiANCi0gKiBCZWNhdXNlIE1vZHVsZUNvcmUgQVBJIGNhbGxzIGNhbiByZXN1bHQgaW4gbG9ja3MgbmVlZGluZyB0byBiZSBhY3F1aXJlZCwNCi0gKiBub25lIG9mIHRoZXNlIG1ldGhvZHMgc2hvdWxkIGJlIGNhbGxlZCB3aGlsZSBvdGhlciB0aHJlYWQgbG9ja3MgaGF2ZQ0KLSAqIGFscmVhZHkgYmVlbiBhY3F1aXJlZC4NCi0gKi8NCi1wdWJsaWMgZmluYWwgY2xhc3MgTW9kdWxlQ29yZVN1cHBvcnQgew0KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZHVtcF9OQ0RGRSA9IGZhbHNlOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lORiA9ICJXRUItSU5GIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUGF0aCBXRUJfSU5GX1BBVEggPSBuZXcgUGF0aChXRUJfSU5GKTsNCi0NCi0JLyoqDQotCSAqIEBwYXJhbSBwcm9qZWN0DQotCSAqIEByZXR1cm4gdGhlIGNvbXB1dGVkIElQYXRoIHRvIHRoZSAicm9vdCIgb2YgdGhlIHdlYiBjb250ZW50cywgZWl0aGVyDQotCSAqICAgICAgICAgZnJvbSBmYWNldCBrbm93bGVkZ2Ugb3IgaHVlcmlzdGljcywgb3IgbnVsbCBpZiBvbmUgY2FuIG5vdCBiZQ0KLQkgKiAgICAgICAgIGRldGVybWluZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVBhdGggY29tcHV0ZVdlYkNvbnRlbnRSb290UGF0aChJUGF0aCBwYXRoKSB7DQotCQlJUGF0aCByb290ID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJcm9vdCA9IE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuZ2V0V2ViQ29udGVudFJvb3RQYXRoKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnNlZ21lbnQoMCkpKTsNCi0JCX0NCi0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7DQotCQkJaWYgKF9kdW1wX05DREZFKQ0KLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfQ0KLQkJaWYgKHJvb3QgPT0gbnVsbCkgew0KLQkJCS8qDQotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMzI0NQ0KLQkJCSAqIA0KLQkJCSAqIE5QRSBpbiBKU1BUYWdsaWJEaXJlY3RpdmVDb250ZW50QXNzaXN0UHJvY2Vzc29yIHdpdGgNCi0JCQkgKiBub24tZmFjZXRlZCBwcm9qZWN0DQotCQkJICovDQotCQkJcm9vdCA9IGdldExvY2FsUm9vdChwYXRoKTsNCi0JCX0NCi0JCXJldHVybiByb290Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBAcGFyYW0gcHJvamVjdA0KLQkgKiBAcmV0dXJuIHRoZSBJUGF0aCB0byB0aGUgInJvb3QiIG9mIHRoZSB3ZWIgY29udGVudHMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0V2ViQ29udGVudFJvb3RQYXRoKElQcm9qZWN0IHByb2plY3QpIHsNCi0JCWlmIChwcm9qZWN0ID09IG51bGwpDQotCQkJcmV0dXJuIG51bGw7DQotDQotCQlJUGF0aCBwYXRoID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJcGF0aCA9IE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuZ2V0V2ViQ29udGVudFJvb3RQYXRoKHByb2plY3QpOw0KLQkJfQ0KLQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsNCi0JCQlpZiAoX2R1bXBfTkNERkUpDQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQl9DQotCQlyZXR1cm4gcGF0aDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHBhcmFtIHBhdGgNCi0JICogICAgICAgICAgICAtIHRoZSBmdWxsIHBhdGggdG8gYSByZXNvdXJjZSB3aXRoaW4gdGhlIHdvcmtzcGFjZQ0KLQkgKiBAcmV0dXJuIC0gdGhlIHJ1bnRpbWUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgaWYgb25lIGV4aXN0cywgbnVsbA0KLQkgKiAgICAgICAgIG90aGVyd2lzZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRSdW50aW1lUGF0aChJUGF0aCBwYXRoKSB7DQotCQlJUGF0aCByZXN1bHQgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlyZXN1bHQgPSBNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmdldFJ1bnRpbWVQYXRoKHBhdGgpOw0KLQkJfQ0KLQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsNCi0JCQlpZiAoX2R1bXBfTkNERkUpDQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQl9DQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCi0JCQlJUGF0aCByb290ID0gZ2V0TG9jYWxSb290KHBhdGgpOw0KLQkJCXJlc3VsdCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhyb290LnNlZ21lbnRDb3VudCgpKS5tYWtlQWJzb2x1dGUoKTsNCi0JCX0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBwYXJhbSBiYXNlUGF0aA0KLQkgKiAgICAgICAgICAgIC0gdGhlIGZ1bGwgcGF0aCB0byBhIHJlc291cmNlIHdpdGhpbiB0aGUgd29ya3NwYWNlDQotCSAqIEBwYXJhbSByZWZlcmVuY2UNCi0JICogICAgICAgICAgICAtIHRoZSByZWZlcmVuY2Ugc3RyaW5nIHRvIHJlc29sdmUNCi0JICogQHJldHVybiAtIHRoZSBmdWxsIHBhdGggd2l0aGluIHRoZSB3b3Jrc3BhY2UgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUNCi0JICogICAgICAgICBnaXZlbiByZWZlcmVuY2UgYWNjb3JkaW5nIHRvIHRoZSB2aXJ0dWFsIHBhdGhpbmcgc3VwcG9ydA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJUGF0aCByZXNvbHZlKElQYXRoIGJhc2VQYXRoLCBTdHJpbmcgcmVmZXJlbmNlKSB7DQotCQlJUGF0aCByZXNvbHZlZFBhdGggPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlyZXNvbHZlZFBhdGggPSBNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLnJlc29sdmUoYmFzZVBhdGgsIHJlZmVyZW5jZSk7DQotCQl9DQotCQljYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgew0KLQkJCWlmIChfZHVtcF9OQ0RGRSkNCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCX0NCi0NCi0JCWlmIChyZXNvbHZlZFBhdGggPT0gbnVsbCkgew0KLQkJCUlQYXRoIHJvb3RQYXRoID0gZ2V0TG9jYWxSb290KGJhc2VQYXRoKTsNCi0JCQlpZiAocmVmZXJlbmNlLnN0YXJ0c1dpdGgoUGF0aC5ST09ULnRvU3RyaW5nKCkpKSB7DQotCQkJCXJlc29sdmVkUGF0aCA9IHJvb3RQYXRoLmFwcGVuZChyZWZlcmVuY2UpOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJcmVzb2x2ZWRQYXRoID0gYmFzZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZChyZWZlcmVuY2UpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiByZXNvbHZlZFBhdGg7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBwYXJhbSBiYXNlUGF0aA0KLQkgKiBAcmV0dXJuIHRoZSBhcHBsaWNhYmxlIFdlYiBjb250ZXh0IHJvb3QgcGF0aCwgaWYgb25lIGV4aXN0cw0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgSVBhdGggZ2V0TG9jYWxSb290KElQYXRoIGJhc2VQYXRoKSB7DQotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsNCi0NCi0JCS8vIGV4aXN0aW5nIHdvcmtzcGFjZSByZXNvdXJjZXMgLSB0aGlzIGlzIHRoZSA5MyUgY2FzZQ0KLQkJSVJlc291cmNlIGZpbGUgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihiYXNlUGF0aCk7DQotDQotCQkvLyBUcnkgdGhlIGJhc2UgcGF0aCBhcyBhIGZvbGRlciBmaXJzdA0KLQkJaWYgKGZpbGUgPT0gbnVsbCAmJiBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsNCi0JCQlmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGb2xkZXIoYmFzZVBhdGgpOw0KLQkJfQ0KLQkJLy8gSWYgbm90IGEgZm9sZGVyLCB0aGVuIHRyeSBiYXNlIHBhdGggYXMgYSBmaWxlDQotCQlpZiAoZmlsZSAhPSBudWxsICYmICFmaWxlLmV4aXN0cygpICYmIGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgew0KLQkJCWZpbGUgPSB3b3Jrc3BhY2VSb290LmdldEZpbGUoYmFzZVBhdGgpOw0KLQkJfQ0KLQ0KLQkJaWYgKGZpbGUgPT0gbnVsbCAmJiBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKSB7DQotCQkJZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChiYXNlUGF0aC5zZWdtZW50KDApKTsNCi0JCX0NCi0NCi0JCWlmIChmaWxlID09IG51bGwpIHsNCi0JCQkvKg0KLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTY1MjkNCi0JCQkgKiANCi0JCQkgKiBUaGlzIG1ldGhvZCBwcm9kdWNlcyBhIGxlc3MgYWNjdXJhdGUgcmVzdWx0LCBidXQgZG9lc24ndA0KLQkJCSAqIHJlcXVpcmUgdGhhdCB0aGUgZmlsZSBleGlzdCB5ZXQuDQotCQkJICovDQotCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24oYmFzZVBhdGgpOw0KLQkJCWlmIChmaWxlcy5sZW5ndGggPiAwKQ0KLQkJCQlmaWxlID0gZmlsZXNbMF07DQotCQl9DQotDQotCQl3aGlsZSAoZmlsZSAhPSBudWxsKSB7DQotCQkJLyoqDQotCQkJICogVHJlYXQgYW55IHBhcmVudCBmb2xkZXIgd2l0aCBhIFdFQi1JTkYgc3ViZm9sZGVyIGFzIGEgd2ViLWFwcA0KLQkJCSAqIHJvb3QNCi0JCQkgKi8NCi0JCQlJQ29udGFpbmVyIGZvbGRlciA9IG51bGw7DQotCQkJaWYgKChmaWxlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GT0xERVIpICE9IDApIHsNCi0JCQkJZm9sZGVyID0gKElDb250YWluZXIpIGZpbGU7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlmb2xkZXIgPSBmaWxlLmdldFBhcmVudCgpOw0KLQkJCX0NCi0JCQkvLyBnZXRGb2xkZXIgb24gYSB3b3Jrc3BhY2Ugcm9vdCBtdXN0IHVzZSBhIGZ1bGwgcGF0aCwgc2tpcA0KLQkJCWlmIChmb2xkZXIgIT0gbnVsbCAmJiAoZm9sZGVyLmdldFR5cGUoKSAmIElSZXNvdXJjZS5ST09UKSA9PSAwKSB7DQotCQkJCUlGb2xkZXIgd2ViaW5mID0gZm9sZGVyLmdldEZvbGRlcihXRUJfSU5GX1BBVEgpOw0KLQkJCQlpZiAod2ViaW5mICE9IG51bGwgJiYgd2ViaW5mLmV4aXN0cygpKSB7DQotCQkJCQlyZXR1cm4gZm9sZGVyLmdldEZ1bGxQYXRoKCk7DQotCQkJCX0NCi0JCQl9DQotCQkJZmlsZSA9IGZpbGUuZ2V0UGFyZW50KCk7DQotCQl9DQotDQotCQlyZXR1cm4gYmFzZVBhdGgudXB0b1NlZ21lbnQoMSk7DQotCX0NCi0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL01vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Nb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOGQzNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL01vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotLyoqCi0gKiBXcmFwcGVyIGNsYXNzIGZvciBhbGwgRmFjZXQtcmVsYXRlZCBjYWxscy4gSWYgdGhlIEZhY2V0IG9yIE1vZHVsZUNvcmUKLSAqIGJ1bmRsZXMgYXJlIG5vdCBhdmFpbGFibGUsIHRoaXMgY2xhc3Mgd2lsbCBub3QgbG9hZCwgb3IgaWYgaXQgZG9lcywgaXRzCi0gKiBtZXRob2RzIHdpbGwgY2F1c2UgTm9DbGFzc0RlZkZvdW5kRXJyb3JzLiBUaGlzIGFsbG93cyB1cyB0bwotICogY29tcGFydG1lbnRhbGl6ZSB0aGUgZGVwZW5kZW5jaWVzLgotICogCi0gKi8KLWZpbmFsIGNsYXNzIE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTEFTSCA9ICIvIjsKLQlwcml2YXRlIHN0YXRpYyBNYXAgZlJlc29sdmVkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICAtIHRoZSBmdWxsIHBhdGggdG8gYSByZXNvdXJjZSB3aXRoaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gLSB0aGUgcnVudGltZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBpZiBvbmUgZXhpc3RzLCBudWxsCi0JICogICAgICAgICBvdGhlcndpc2UKLQkgKi8KLQlzdGF0aWMgSVBhdGggZ2V0UnVudGltZVBhdGgoSVBhdGggcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnNlZ21lbnQoMCkpOwotCi0JCWlmICghTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlWaXJ0dWFsUmVzb3VyY2VbXSB2aXJ0dWFsUmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpKTsKLQkJaWYgKHZpcnR1YWxSZXNvdXJjZXMgIT0gbnVsbCAmJiB2aXJ0dWFsUmVzb3VyY2VzLmxlbmd0aCA+IDApIHsKLQkJCXJldHVybiB2aXJ0dWFsUmVzb3VyY2VzWzBdLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHRoZSBJUGF0aCB0byB0aGUgInJvb3QiIG9mIHRoZSB3ZWIgY29udGVudHMKLQkgKi8KLQlzdGF0aWMgSVBhdGggZ2V0V2ViQ29udGVudFJvb3RQYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICghTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJaWYgKGNvbXBvbmVudCAhPSBudWxsICYmIGNvbXBvbmVudC5leGlzdHMoKSkgewotCQkJcGF0aCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICAtIHRoZSBmdWxsIHBhdGggdG8gYSByZXNvdXJjZSB3aXRoaW4gdGhlIHdvcmtzcGFjZQotCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkgKiAgICAgICAgICAgIC0gdGhlIHJlZmVyZW5jZSBzdHJpbmcgdG8gcmVzb2x2ZQotCSAqIEByZXR1cm4gLSB0aGUgZnVsbCBwYXRoIHdpdGhpbiB0aGUgd29ya3NwYWNlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCi0JICogICAgICAgICBnaXZlbiByZWZlcmVuY2UgYWNjb3JkaW5nIHRvIHRoZSB2aXJ0dWFsIHBhdGhpbmcgc3VwcG9ydAotCSAqLwotCXN0YXRpYyBJUGF0aCByZXNvbHZlKElQYXRoIGJhc2VQYXRoLCBTdHJpbmcgcmVmZXJlbmNlKSB7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCB8fCBiYXNlUGF0aCA9PSBudWxsIHx8IGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGJhc2VQYXRoLnNlZ21lbnQoMCkpOwotCi0JCWlmICghTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCS8qCi0JCQkgKiBJdCBjYW4gdGFrZSB0aGUgYmV0dGVyIHBhcnQgb2YgYSBmdWxsIHNlY29uZCB0byBkbyB0aGlzLCBzbwotCQkJICogY2FjaGUgdGhlIHJlc3VsdC4KLQkJCSAqLwotCQkJSVBhdGggcmVzb2x2ZWQgPSBudWxsOwotCQkJTWFwIG1hcEZvckJhc2VSZXNvdXJjZSA9IG51bGw7Ci0JCQltYXBGb3JCYXNlUmVzb3VyY2UgPSAoTWFwKSBmUmVzb2x2ZWRNYXAuZ2V0KGJhc2VQYXRoKTsKLQkJCWlmIChtYXBGb3JCYXNlUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCVJlZmVyZW5jZSByZXNvbHZlZFJlZmVyZW5jZSA9IChSZWZlcmVuY2UpIG1hcEZvckJhc2VSZXNvdXJjZS5nZXQocmVmZXJlbmNlKTsKLQkJCQlpZiAocmVzb2x2ZWRSZWZlcmVuY2UgIT0gbnVsbCkKLQkJCQkJcmVzb2x2ZWQgPSAoSVBhdGgpIHJlc29sdmVkUmVmZXJlbmNlLmdldCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWFwRm9yQmFzZVJlc291cmNlID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlmUmVzb2x2ZWRNYXAucHV0KGJhc2VQYXRoLCBtYXBGb3JCYXNlUmVzb3VyY2UpOwotCQkJfQotCi0JCQlpZiAocmVzb2x2ZWQgPT0gbnVsbCkgewotCQkJCUlGaWxlIGJhc2VGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGJhc2VQYXRoKTsKLQkJCQlJVmlydHVhbFJlc291cmNlW10gdmlydHVhbFJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKGJhc2VGaWxlKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZpcnR1YWxSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSVBhdGggYmFzZVJ1bnRpbWVQYXRoID0gdmlydHVhbFJlc291cmNlc1tpXS5nZXRSdW50aW1lUGF0aCgpOwotCQkJCQlJUGF0aCByZWZlcmVuY2VSdW50aW1lUGF0aCA9IG51bGw7Ci0JCQkJCWlmIChyZWZlcmVuY2Uuc3RhcnRzV2l0aChTTEFTSCkpIHsKLQkJCQkJCXJlZmVyZW5jZVJ1bnRpbWVQYXRoID0gbmV3IFBhdGgocmVmZXJlbmNlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlZmVyZW5jZVJ1bnRpbWVQYXRoID0gYmFzZVJ1bnRpbWVQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQocmVmZXJlbmNlKTsKLQkJCQkJfQotCQkJCQlJVmlydHVhbEZpbGUgdmlydHVhbEZpbGUgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUZpbGUocHJvamVjdCwgcmVmZXJlbmNlUnVudGltZVBhdGgpOwotCQkJCQlpZiAodmlydHVhbEZpbGUgIT0gbnVsbCAmJiB2aXJ0dWFsRmlsZS5leGlzdHMoKSkgewotCQkJCQkJSUZpbGVbXSB1bmRlcmx5aW5nRmlsZXMgPSB2aXJ0dWFsRmlsZS5nZXRVbmRlcmx5aW5nRmlsZXMoKTsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdW5kZXJseWluZ0ZpbGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJaWYgKHVuZGVybHlpbmdGaWxlc1tqXS5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpICYmIHVuZGVybHlpbmdGaWxlc1tqXS5leGlzdHMoKSkgewotCQkJCQkJCQltYXBGb3JCYXNlUmVzb3VyY2UucHV0KHJlZmVyZW5jZSwgbmV3IFNvZnRSZWZlcmVuY2UodW5kZXJseWluZ0ZpbGVzW2pdLmdldEZ1bGxQYXRoKCkpKTsKLQkJCQkJCQkJcmVzb2x2ZWQgPSB1bmRlcmx5aW5nRmlsZXNbal0uZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXNvbHZlZDsKLQkJfQotCQllbHNlIHsKLQkJCUlWaXJ0dWFsRmlsZSB2aXJ0dWFsRmlsZSA9IENvbXBvbmVudENvcmUuY3JlYXRlRmlsZShwcm9qZWN0LCBuZXcgUGF0aChyZWZlcmVuY2UpKTsKLQkJCWlmICh2aXJ0dWFsRmlsZSAhPSBudWxsICYmIHZpcnR1YWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIHZpcnR1YWxGaWxlLmdldFVuZGVybHlpbmdGaWxlKCkuZ2V0RnVsbFBhdGgoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTmFtZXNwYWNlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTmFtZXNwYWNlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZjkxYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL05hbWVzcGFjZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZVZhbGlkYXRvciBleHRlbmRzIFByaW1lVmFsaWRhdG9yIGltcGxlbWVudHMgRXJyb3JTdGF0ZSB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MTlNfUFJFRklYID0gInhtbG5zIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX1NFUEFSQVRPUiA9ICI6IjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTmFtZXNwYWNlVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBOYW1lc3BhY2VWYWxpZGF0b3IuY2xhc3MpIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCQlFbGVtZW50IHRhcmdldCA9IChFbGVtZW50KSBub2RlOwotCQlpZiAoaXNYTUxFbGVtZW50KHRhcmdldCkgJiYgaGFzVW5rbm93blByZWZpeCh0YXJnZXQpKSB7Ci0JCQlJRE9NRWxlbWVudCBlID0gKElET01FbGVtZW50KSB0YXJnZXQ7Ci0JCQlpZiAoIWlzVmFsaWRQcmVmaXgoZS5nZXRQcmVmaXgoKSwgdGFyZ2V0KSAmJiAhZS5pc0NvbW1lbnRUYWcoKSkgewotCQkJCS8vIHJlcG9ydCB1bmtub3duIHRhZyBlcnJvci4KLQkJCQlTZWdtZW50IGVycm9yU2VnID0gbnVsbDsKLQkJCQlpZiAoZS5oYXNTdGFydFRhZygpKQotCQkJCQllcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KGUsIEZNVXRpbC5TRUdfU1RBUlRfVEFHKTsKLQkJCQllbHNlIGlmIChlLmhhc0VuZFRhZygpKQotCQkJCQllcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KGUsIEZNVXRpbC5TRUdfRU5EX1RBRyk7Ci0KLQkJCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQkJcmVwb3J0ZXIucmVwb3J0KG5ldyBFcnJvckluZm9JbXBsKFVOREVGSU5FRF9OQU1FX0VSUk9SLCBlcnJvclNlZywgZSkpOwotCQkJfQotCQl9Ci0JCS8vICgyKSBjaGVjayBwcmVmaXggb2YgZWFjaCBhdHRyIAotCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSB0YXJnZXQuZ2V0QXR0cmlidXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbiA9IGF0dHJzLml0ZW0oaSk7Ci0JCQlpZiAoIShuIGluc3RhbmNlb2YgSURPTUF0dHIpKQotCQkJCWNvbnRpbnVlOwotCQkJSURPTUF0dHIgYSA9IChJRE9NQXR0cikgbjsKLQkJCVN0cmluZyBwcmVmaXggPSBhLmdldFByZWZpeCgpOwotCQkJaWYgKChwcmVmaXggIT0gbnVsbCkgJiYgaXNVbmtub3duQXR0cihhLCB0YXJnZXQpKSB7Ci0JCQkJLy8gVGhlIGF0dHIgaGFzIHVua25vd24gcHJlZml4LiAgU28sIGNoZWNrIGl0LgotCQkJCWlmICghaXNWYWxpZFByZWZpeChwcmVmaXgsIHRhcmdldCkpIHsKLQkJCQkJLy8gcmVwb3J0IHVua25vd24gYXR0ciBlcnJvci4KLQkJCQkJSVRleHRSZWdpb24gciA9IGEuZ2V0TmFtZVJlZ2lvbigpOwotCQkJCQlpZiAociA9PSBudWxsKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWludCBhX29mZnNldCA9IGEuZ2V0TmFtZVJlZ2lvblN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWludCBhX2xlbmd0aCA9IGEuZ2V0TmFtZVJlZ2lvbigpLmdldExlbmd0aCgpOwotCQkJCQlyZXBvcnRlci5yZXBvcnQobmV3IEVycm9ySW5mb0ltcGwoVU5ERUZJTkVEX05BTUVfRVJST1IsIG5ldyBTZWdtZW50KGFfb2Zmc2V0LCBhX2xlbmd0aCksIGEpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIG1ldGhvZHMJCi0JcHJpdmF0ZSBib29sZWFuIGlzWE1MRWxlbWVudChFbGVtZW50IHRhcmdldCkgewotCQlyZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgSURPTUVsZW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc1Vua25vd25QcmVmaXgoRWxlbWVudCB0YXJnZXQpIHsKLQkJcmV0dXJuIGlzVW5rbm93bkVsZW1lbnQodGFyZ2V0KSAmJiBDTVV0aWwuaXNGb3JlaWduKHRhcmdldCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVW5rbm93bkVsZW1lbnQoRWxlbWVudCB0YXJnZXQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjID0gQ01VdGlsLmdldERlY2xhcmF0aW9uKHRhcmdldCk7Ci0JCXJldHVybiBkZWMgPT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNVbmtub3duQXR0cihJRE9NQXR0ciBhdHRyLCBFbGVtZW50IHRhcmdldCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWMgPSBDTVV0aWwuZ2V0RGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJaWYgKGRlYyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIHVua25vd24uCi0JCUNNTmFtZWROb2RlTWFwIGFkZWNscyA9IGRlYy5nZXRBdHRyaWJ1dGVzKCk7Ci0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlYyA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhZGVjbHMuZ2V0TmFtZWRJdGVtKGF0dHIuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGFkZWMgPT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFByZWZpeChTdHJpbmcgcHJlZml4LCBFbGVtZW50IGUpIHsKLQkJaWYgKHByZWZpeC5lcXVhbHMoWE1MTlNfUFJFRklYKSkKLQkJCXJldHVybiB0cnVlOyAvLyAieG1sbnM6Zm9vIiBhdHRyIGlzIGFsd2F5cyB2YWxpZC4KLQotCQkvLyAoMSkgY2hlY2sgdGhlIGVsZW1lbnQgaGFzIHRoZSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBvciBub3QuCi0JCWlmIChpc1ZhbGlkUHJlZml4V2l0aGluRWxlbWVudChwcmVmaXgsIGUpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJLy8gKDIpIGNoZWNrIGFuY2VzdG9ycyBvZiB0aGUgZWxlbWVudCBoYXZlIHRoZSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBvciBub3QuCi0JCUVsZW1lbnQgcGFyZW50ID0gU01VdGlsLmdldFBhcmVudEVsZW1lbnQoZSk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKGlzVmFsaWRQcmVmaXhXaXRoaW5FbGVtZW50KHByZWZpeCwgcGFyZW50KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXBhcmVudCA9IFNNVXRpbC5nZXRQYXJlbnRFbGVtZW50KHBhcmVudCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUHJlZml4V2l0aGluRWxlbWVudChTdHJpbmcgcHJlZml4LCBFbGVtZW50IGUpIHsKLQkJU3RyaW5nIG5zID0gWE1MTlNfUFJFRklYICsgTlNfU0VQQVJBVE9SICsgcHJlZml4OwotCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBlLmdldEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG4gPSBhdHRycy5pdGVtKGkpOwotCQkJaWYgKG4gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChuLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChucy5lcXVhbHMoKChBdHRyKSBuKS5nZXROYW1lKCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTnVsbFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL051bGxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY1YzRhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTnVsbFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvblJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi0vKioKLSAqIE51bGxWYWxpZGF0b3IgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgYSByZXBsYWNlbWVudCBvZiBudWxsCi0gKiBmb3IgVmFsaWRhdGlvbkNvbXBvbmVudCB0eXBlLgotICovCi1maW5hbCBjbGFzcyBOdWxsVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdGlvbkNvbXBvbmVudCB7Ci0KLQlwdWJsaWMgTnVsbFZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJcmV0dXJuOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcG9ydGVyKFZhbGlkYXRpb25SZXBvcnRlciByZXBvcnRlcikgewotCQlyZXR1cm47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ByaW1lVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvUHJpbWVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhYTBlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvUHJpbWVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi1hYnN0cmFjdCBjbGFzcyBQcmltZVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRpb25Db21wb25lbnQgewotCi0JLyoqCi0JICogUHJpbWVWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUHJpbWVWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1NNVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1NNVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDNiOWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9TTVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1maW5hbCBjbGFzcyBTTVV0aWwgewotCi0JcHJpdmF0ZSBTTVV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogZ2V0IGFuIGFuY2VzdG9yIGVsZW1lbnQgaWdub3JpbmcgaW1wbGljaXQgb25lcy4gKi8KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0UGFyZW50RWxlbWVudChOb2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTm9kZSBwID0gY2hpbGQuZ2V0UGFyZW50Tm9kZSgpOwotCQl3aGlsZSAocCAhPSBudWxsKSB7Ci0JCQlpZiAocC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJcmV0dXJuIChFbGVtZW50KSBwOwotCQkJfQotCQkJcCA9IHAuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9TZWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvU2VnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGJhZjRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9TZWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgU2VnbWVudCB7Ci0KLQlwcml2YXRlIGludCBvZmZzZXQgPSAwOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU2VnbWVudChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU2VnbWVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlzdXBlcigpOwotCQl0aGlzLm9mZnNldCA9IHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQl0aGlzLmxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBOT1RFOiAnc3RhcnQnIGFuZCAnZW5kJyBtdXN0IGJlIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBjb250aWd1b3VzIHJlZ2lvbnMuCi0JICogT3RoZXJ3aXNlLCB0aGlzIGNsYXNzIGNhbm5vdCB3b3JrIGNvcnJlY3RseS4KLQkgKi8KLQlwdWJsaWMgU2VnbWVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZCkgewotCQlzdXBlcigpOwotCQl0aGlzLm9mZnNldCA9IHN0YXJ0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmRPZmZzZXQgPSAoZW5kID09IG51bGwpID8gc3RhcnQuZ2V0RW5kT2Zmc2V0KCkgOiBlbmQuZ2V0RW5kT2Zmc2V0KCk7Ci0JCXRoaXMubGVuZ3RoID0gZW5kT2Zmc2V0IC0gdGhpcy5vZmZzZXQ7Ci0JfQotCi0JLy9wdWJsaWMgU2VnbWVudChJVGV4dFJlZ2lvbiBzdGFydCwgSVRleHRSZWdpb24gZW5kKSB7Ci0JLy8Jc3VwZXIoKTsKLQkvLwl0aGlzLm9mZnNldCA9IHN0YXJ0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JLy8JaW50IGVuZE9mZnNldCA9IChlbmQgPT0gbnVsbCkgPyBzdGFydC5nZXRFbmRPZmZzZXQoKSA6IGVuZC5nZXRFbmRPZmZzZXQoKTsKLQkvLwl0aGlzLmxlbmd0aCA9IGVuZE9mZnNldCAtIHRoaXMub2Zmc2V0OwotCS8vfQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm9mZnNldDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvU3ludGF4VmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvU3ludGF4VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZDg5NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1N5bnRheFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MUHJvcGVydHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw1ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuRXJyb3JJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlNvdXJjZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWNsYXNzIFN5bnRheFZhbGlkYXRvciBleHRlbmRzIFByaW1lVmFsaWRhdG9yIGltcGxlbWVudHMgRXJyb3JTdGF0ZSB7Ci0KLQotCXN0YXRpYyBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFJlZ2lvbihJVGV4dFJlZ2lvbiByZ24pIHsKLQkJU3RyaW5nIHR5cGUgPSByZ24uZ2V0VHlwZSgpOwotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOyAvLyBubyB0eXBlIGlzIGludmFsaWQuCi0JCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTiB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgU3RyaW5nIGdldFRhZ05hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0YWcpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSB0YWcuZ2V0UmVnaW9ucygpOwotCQlJdGVyYXRvciBpdGVyID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJnbiA9IChJVGV4dFJlZ2lvbikgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmduLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkKLQkJCQlyZXR1cm4gdGFnLmdldFRleHQocmduKTsKLQkJfQotCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwcml2YXRlIGJvb2xlYW4gaXNFbXB0eUNvbnRlbnQoQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCkgewotCQlyZXR1cm4gKGRlY2wgIT0gbnVsbCkgJiYgKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSk7Ci0JfQotCi0JcHVibGljIFN5bnRheFZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gU3ludGF4VmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQljbGFzcyBFbGVtZW50SW5mbyB7Ci0JCXB1YmxpYyBFbGVtZW50SW5mbygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgSURPTUVsZW1lbnQgdGFyZ2V0ID0gbnVsbDsKLQkJcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBudWxsOwotCQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZyA9IG51bGw7Ci0JCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZyA9IG51bGw7Ci0JCXB1YmxpYyBib29sZWFuIGhhc1N0YXJ0VGFnKCkge3JldHVybiBzdGFydFRhZyAhPSBudWxsO30KLQkJcHVibGljIGJvb2xlYW4gaGFzRW5kVGFnKCkge3JldHVybiBlbmRUYWcgIT0gbnVsbDt9Ci0JCXB1YmxpYyBib29sZWFuIGlzWEhUTUwgPSBmYWxzZTsKLQkJcHVibGljIGJvb2xlYW4gaXNYSFRNTDUgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIGluZGV4ZWROb2RlKSB7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBpbmRleGVkTm9kZTsKLQkJdmFsaWRhdGVDaGlsZHJlbihub2RlKTsKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuOwotCQlpZiAoIShub2RlIGluc3RhbmNlb2YgSURPTUVsZW1lbnQpKQotCQkJcmV0dXJuOwotCi0JCUVsZW1lbnRJbmZvIGluZm8gPSBuZXcgRWxlbWVudEluZm8oKTsKLQkJaW5mby50YXJnZXQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0KLQkJLy8gZ2F0aGVyIGluZm9ybWF0aW9uIHRvIHZhbGlkYXRlIGZyb20gdGFyZ2V0IGF0IG9uY2UuCi0JCWdldEluZm8oaW5mbyk7Ci0KLQkJdmFsaWRhdGVUYWdzKGluZm8pOwotCQlpZiAoaW5mby50YXJnZXQuaXNHbG9iYWxUYWcoKSkgewotCQkJdmFsaWRhdGVOYW1lcyhpbmZvKTsKLQkJCWlmIChpbmZvLmRlY2wgIT0gbnVsbCAmJiBpbmZvLmlzWEhUTUwpIHsKLQkJCQl2YWxpZGF0ZVRhZ0Nhc2UoaW5mbyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0SW5mbyhFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCWluZm8uZGVjbCA9IENNVXRpbC5nZXREZWNsYXJhdGlvbihpbmZvLnRhcmdldCk7Ci0JCWluZm8uc3RhcnRUYWcgPSBpbmZvLnRhcmdldC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpbmZvLmVuZFRhZyA9IGluZm8udGFyZ2V0LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCURvY3VtZW50IGRvYyA9IGluZm8udGFyZ2V0LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKCEoZG9jIGluc3RhbmNlb2YgSURPTURvY3VtZW50KSkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHR5cGVpZCA9ICgoSURPTURvY3VtZW50KSBkb2MpLmdldERvY3VtZW50VHlwZUlkKCk7Ci0JCWlmICh0eXBlaWQgIT0gbnVsbCkgewotCQkJaWYgKHR5cGVpZC50cmltKCkubGVuZ3RoKCkhPSAwKXsKLQkJCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgZW50cnkgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRFbnRyeSh0eXBlaWQpOwotCQkJCWluZm8uaXNYSFRNTCA9IChlbnRyeSAhPSBudWxsICYmIGVudHJ5LmlzWE1MVHlwZSgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWluZm8uaXNYSFRNTCA9IGdldFhNTFRhcmdldChkb2MpOwotCQkJCWluZm8uaXNYSFRNTDUgPSBpbmZvLmlzWEhUTUw7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGdldFhNTFRhcmdldChEb2N1bWVudCBkb2MpIHsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlOb2RlIGNoaWxkID0gZG9jLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiaHRtbCIpKXsKLQkJCQkJaWYgKGNoaWxkLmdldEF0dHJpYnV0ZXMoKSE9IG51bGwpewotCQkJCQkJTmFtZWROb2RlTWFwIGF0dHJzID0gY2hpbGQuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCQkJQXR0ciBhID0gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQkJCQkJaWYgKGEuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDUwTmFtZXNwYWNlLkFUVFJfTkFNRV9YTUxOUykpCi0JCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQljbGFzcyBUYWdFcnJvckluZm9JbXBsIGV4dGVuZHMgQWJzdHJhY3RFcnJvckluZm8gewotCQlwcml2YXRlIFN0cmluZyBoaW50ID0gbnVsbDsKLQotCQlwdWJsaWMgVGFnRXJyb3JJbmZvSW1wbChpbnQgc3RhdGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGFnLCBTdHJpbmcgaGludCkgewotCQkJc3VwZXIoc3RhdGUsIG5ldyBTZWdtZW50KHRhZykpOwotCQkJdGhpcy5oaW50ID0gaGludDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SGludCgpIHsKLQkJCXJldHVybiBoaW50OwotCQl9Ci0KLQkJcHVibGljIHNob3J0IGdldFRhcmdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gTm9kZS5FTEVNRU5UX05PREU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmRUYWdDb3JydXB0ZWQoRWxlbWVudEluZm8gaW5mbykgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGluZm8uZW5kVGFnLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSXRlcmF0b3IgaXRlciA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZ24gPSAoSVRleHRSZWdpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFpc1ZhbGlkUmVnaW9uKHJnbikpCi0JCQkJcmV0dXJuIHRydWU7IC8vIGZvdW5kIGludmFsaWQgcmVnaW9uIHR5cGUuCi0JCX0KLQkJcmV0dXJuIGZhbHNlOyAvLyBhbGwgcmVnaW9ucyBhcmUgdmFsaWQuCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RW5kVGFnRnVsbFRleHQoRWxlbWVudEluZm8gaW5mbykgewotCQlTdHJpbmcgaGludCA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBpbmZvLmVuZFRhZy5nZXRSZWdpb25zKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmduID0gKElUZXh0UmVnaW9uKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyB0eXBlID0gcmduLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4gfHwgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpCi0JCQkJY29udGludWU7Ci0JCQloaW50ICs9IGluZm8uZW5kVGFnLmdldEZ1bGxUZXh0KHJnbik7Ci0JCX0KLQkJcmV0dXJuIGhpbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydENvcnJ1cHRlZEVuZFRhZ0Vycm9yKEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJU3RyaW5nIGhpbnQgPSBnZXRFbmRUYWdGdWxsVGV4dChpbmZvKTsKLQkJVGFnRXJyb3JJbmZvSW1wbCBlcnJvciA9IG5ldyBUYWdFcnJvckluZm9JbXBsKFVOREVGSU5FRF9OQU1FX0VSUk9SLCBpbmZvLmVuZFRhZywgaGludCk7Ci0JCXRoaXMucmVwb3J0ZXIucmVwb3J0KGVycm9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVUYWdzKEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJaWYgKGluZm8uaGFzU3RhcnRUYWcoKSkgewotCQkJaWYgKCFpbmZvLnRhcmdldC5pc1N0YXJ0VGFnQ2xvc2VkKCkpIHsKLQkJCQkvLyBNYXJrIHRoZSB3aG9sZSBTVEFSVCB0YWcgYXMgYW4gZXJyb3Igc2VnbWVudC4KLQkJCQlTZWdtZW50IGVycm9yU2VnID0gbmV3IFNlZ21lbnQoaW5mby5zdGFydFRhZyk7Ci0JCQkJcmVwb3J0KFVOQ0xPU0VEX1RBR19FUlJPUiwgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChpbmZvLmhhc0VuZFRhZygpKSB7Ci0JCQkJaWYgKGluZm8uZGVjbCAhPSBudWxsKSB7Ci0JCQkJCS8vaWYgeGh0bWwgdGhlbiBtdXN0IGhhdmUgZW5kIHRhZwotCQkJCQkvL2Vsc2UgZGV0ZXJtaW5lIGlmIGVuZCB0YWcgaXMgb21pc3NpYmxlCi0JCQkJCWlmIChpbmZvLmlzWEhUTUwpIHsKLQkJCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBGTVV0aWwuZ2V0U2VnbWVudChpbmZvLnRhcmdldCwgRk1VdGlsLlNFR19FTkRfVEFHX05BTUUpOwotCQkJCQkJcmVwb3J0KE1JU1NJTkdfU1RBUlRfVEFHX0VSUk9SLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy9kZXRlcm1pbmUgaWYgdGhlIGVuZCB0YWcgaXMgb21pc3NpYmxlCi0JCQkJCQlib29sZWFuIGNhbk9taXRTdGFydFRhZyA9IGZhbHNlOwotCQkJCQkJaWYoaW5mby5kZWNsIGluc3RhbmNlb2YgSFRNTFByb3BlcnR5RGVjbGFyYXRpb24pIHsKLQkJCQkJCQlpbnQgb21pdFR5cGUgPSAoKEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uKWluZm8uZGVjbCkuZ2V0T21pdFR5cGUoKTsKLQkJCQkJCQljYW5PbWl0U3RhcnRUYWcgPSBvbWl0VHlwZSA9PSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfQk9USDsKLQkJCQkJCX0KLQkJCQkJCi0JCQkJCQlpZiAoIWNhbk9taXRTdGFydFRhZyAmJiAhaW5mby50YXJnZXQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCQkJaWYgKGluZm8udGFyZ2V0LmlzQ29udGFpbmVyKCkpIHsKLQkJCQkJCQkJLy8gU2V0IHRoZSBlcnJvciBtYXJrIHRvIHRoZSBzdGFydCBvZiB0aGUgZWxlbWVudC4KLQkJCQkJCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KGluZm8udGFyZ2V0LCBGTVV0aWwuU0VHX0VORF9UQUcpOwotCQkJCQkJCQlyZXBvcnQoTUlTU0lOR19TVEFSVF9UQUdfRVJST1IsIGVycm9yU2VnLCBpbmZvLnRhcmdldCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQkvLyBNYXJrIHRoZSB3aG9sZSBFTkQgdGFnIGFzIGFuIGVycm9yIHNlZ21lbnQuCi0JCQkJCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBuZXcgU2VnbWVudChpbmZvLmVuZFRhZyk7Ci0JCQkJCQkJCXJlcG9ydChVTk5FQ0VTU0FSWV9FTkRfVEFHX0VSUk9SLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChpbmZvLmhhc0VuZFRhZygpKSB7Ci0JCQlpZiAoIWluZm8udGFyZ2V0LmlzQ2xvc2VkKCkpIHsKLQkJCQkvLyBTZXQgdGhlIHdob2xlIEVORCB0YWcgYXMgZXJyb3Igc2VnbWVudC4KLQkJCQlTZWdtZW50IGVycm9yU2VnID0gbmV3IFNlZ21lbnQoaW5mby5lbmRUYWcpOwotCQkJCXJlcG9ydChVTkNMT1NFRF9FTkRfVEFHX0VSUk9SLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGluZm8uaXNYSFRNTCkgeyAvLyBYSFRNTAotCQkJCS8vaWYgZWRpdG9yIGNsb3NlZCBkdXJpbmcgdmFsaWRhdGlvbiB0aGlzIGNvdWxkIGJlIG51bGwKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdFJlZ2lvbiA9IGluZm8udGFyZ2V0LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKCFpbmZvLnRhcmdldC5pc0VtcHR5VGFnKCkgJiYgc3RydWN0UmVnaW9uICE9IG51bGwgJiYgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4uZXF1YWxzKHN0cnVjdFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSkpIHsKLQkJCQkJLyoKLQkJCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0ODk2MyA6Ci0JCQkJCSAqIHJlcG9ydCBlbXB0eSB0YWdzIG5vdCB3cml0dGVuIGFzIHN1Y2gsIGJ1dCBvbmx5IHdoZW4KLQkJCQkJICogdGhleSBmb2xsb3cgYWN0dWFsIFhNTC9IVE1MIHN5bnRheAotCQkJCQkgKi8KLQkJCQkJaWYgKGlzRW1wdHlDb250ZW50KGluZm8uZGVjbCkpIHsKLQkJCQkJCS8vIEVNUFRZIGVsZW1lbnQgc2hvdWxkIGJlIHdyaXR0ZW4gaW4gPC4uLi8+IGZvcm0KLQkJCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBGTVV0aWwuZ2V0U2VnbWVudChpbmZvLnRhcmdldCwgRk1VdGlsLlNFR19TVEFSVF9UQUcpOwotCQkJCQkJcmVwb3J0KElOVkFMSURfRU1QVFlfRUxFTUVOVF9UQUcsIGVycm9yU2VnLCBpbmZvLnRhcmdldCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBlbmQgdGFnIGlzIHJlcXVpcmVkLgotCQkJCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KGluZm8udGFyZ2V0LCBGTVV0aWwuU0VHX1NUQVJUX1RBRyk7Ci0JCQkJCQlyZXBvcnQoTUlTU0lOR19FTkRfVEFHX0VSUk9SLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7IC8vIEhUTUwKLQkJCQlpZiAoaW5mby5oYXNTdGFydFRhZygpKSB7Ci0JCQkJCWlmIChpbmZvLmRlY2wgIT0gbnVsbCAmJiBDTVV0aWwuaXNIVE1MKGluZm8uZGVjbCkgJiYgIWluZm8udGFyZ2V0LmlzRW1wdHlUYWcoKSAmJiAhQ01VdGlsLmlzRW5kVGFnT21pc3NpYmxlKGluZm8uZGVjbCkgJiYgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4uZXF1YWxzKGluZm8uc3RhcnRUYWcuZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkpKSB7Ci0JCQkJCQkvLyBTZXQgdGhlIGVycm9yIG1hcmsgdG8gdGhlIGVuZCBvZiB0aGUgZWxlbWVudC4KLQkJCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBGTVV0aWwuZ2V0U2VnbWVudChpbmZvLnRhcmdldCwgRk1VdGlsLlNFR19TVEFSVF9UQUcpOwotCQkJCQkJcmVwb3J0KE1JU1NJTkdfRU5EX1RBR19FUlJPUiwgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qIHBlcmZvcm0gdmFsaWRhdGlvbiBhYm91dCB0YWcgbmFtZSBkZWZpbml0aW9uLiAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU5hbWVzKEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJYm9vbGVhbiBjb3JydXB0ZWQgPSBpbmZvLmhhc0VuZFRhZygpICYmIGlzRW5kVGFnQ29ycnVwdGVkKGluZm8pOwotCQlpZiAoaW5mby5kZWNsID09IG51bGwpIHsKLQkJCS8vIElmIG5vIGRlY2xhcmF0aW9uIGlzIHJldHJpZXZlZCwgdGhlIHRhcmdldCBpcyByZWFsbHkKLQkJCS8vIHVua25vd24gZWxlbWVudC4KLQkJCWlmICghaW5mby5oYXNTdGFydFRhZygpICYmIGNvcnJ1cHRlZCkgewotCQkJCXJlcG9ydENvcnJ1cHRlZEVuZFRhZ0Vycm9yKGluZm8pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KGluZm8udGFyZ2V0LCBGTVV0aWwuU0VHX1NUQVJUX1RBR19OQU1FKTsKLQkJCQlyZXBvcnQoVU5ERUZJTkVEX05BTUVfRVJST1IsIGVycm9yU2VnLCBpbmZvLnRhcmdldCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBFdmVuIGlmIGEgZGVjbGFyYXRpb24gY291bGQgYmUgcmV0cmlldmVkLCBpZiB0aGUgZW5kCi0JCQkvLyB0YWcgaXMgY29ycnVwdGVkLCBpdCBzaG91bGQgYmUgcmVwb3J0ZWQgYXMgdW5kZWZpbmVkCi0JCQkvLyBuYW1lLiAoRDIwMjQ5MykKLQkJCWlmIChjb3JydXB0ZWQpIHsKLQkJCQlyZXBvcnRDb3JydXB0ZWRFbmRUYWdFcnJvcihpbmZvKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIHBlcmZvcm0gdmFsaWRhdGlvbiB0YWcgY2FzZSBvbmx5IGZvciBYSFRNTCBkb2N1bWVudCAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVRhZ0Nhc2UoRWxlbWVudEluZm8gaW5mbykgewotCQlTdHJpbmcgZGVjbGFyZWQgPSBpbmZvLmRlY2wuZ2V0RWxlbWVudE5hbWUoKTsKLQkJU3RyaW5nIHN0YXJ0VGFnTmFtZSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGVuZFRhZ05hbWUgPSAiIjsvLyROT04tTkxTLTEkCi0JCWlmIChkZWNsYXJlZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChpbmZvLmlzWEhUTUw1KXsKLQkJCWlmIChpbmZvLmhhc1N0YXJ0VGFnKCkpIHsKLQkJCQlzdGFydFRhZ05hbWUgPSBnZXRUYWdOYW1lKGluZm8uc3RhcnRUYWcpOwotCQkJCWlmIChpbmZvLmhhc0VuZFRhZygpKSB7Ci0JCQkJCWVuZFRhZ05hbWUgPSBnZXRUYWdOYW1lKGluZm8uZW5kVGFnKTsKLQkJCQkJaWYgKCFlbmRUYWdOYW1lLmVxdWFscyhzdGFydFRhZ05hbWUpKXsKLQkJCQkJCVRhZ0Vycm9ySW5mb0ltcGwgZXJyb3IgPSBuZXcgVGFnRXJyb3JJbmZvSW1wbChNSVNNQVRDSEVEX0VSUk9SLCBpbmZvLmVuZFRhZywgZW5kVGFnTmFtZSk7Ci0JCQkJCQl0aGlzLnJlcG9ydGVyLnJlcG9ydChlcnJvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIHN0YXJ0IHRhZwotCQkJaWYgKGluZm8uaGFzU3RhcnRUYWcoKSkgewotCQkJCXN0YXJ0VGFnTmFtZSA9IGdldFRhZ05hbWUoaW5mby5zdGFydFRhZyk7Ci0JCQkJaWYgKCFkZWNsYXJlZC5lcXVhbHMoc3RhcnRUYWdOYW1lKSkgewotCQkJCQlUYWdFcnJvckluZm9JbXBsIGVycm9yID0gbmV3IFRhZ0Vycm9ySW5mb0ltcGwoTUlTTUFUQ0hFRF9FUlJPUiwgaW5mby5zdGFydFRhZywgc3RhcnRUYWdOYW1lKTsKLQkJCQkJdGhpcy5yZXBvcnRlci5yZXBvcnQoZXJyb3IpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGVuZCB0YWcKLQkJCWlmIChpbmZvLmhhc0VuZFRhZygpKSB7Ci0JCQkJZW5kVGFnTmFtZSA9IGdldFRhZ05hbWUoaW5mby5lbmRUYWcpOwotCQkJCWlmICghaW5mby5oYXNTdGFydFRhZygpIHx8ICghZW5kVGFnTmFtZS5lcXVhbHMoc3RhcnRUYWdOYW1lKSkpIHsKLQkJCQkJaWYgKCFkZWNsYXJlZC5lcXVhbHMoZW5kVGFnTmFtZSkpIHsKLQkJCQkJCVRhZ0Vycm9ySW5mb0ltcGwgZXJyb3IgPSBuZXcgVGFnRXJyb3JJbmZvSW1wbChNSVNNQVRDSEVEX0VSUk9SLCBpbmZvLmVuZFRhZywgZW5kVGFnTmFtZSk7Ci0JCQkJCQl0aGlzLnJlcG9ydGVyLnJlcG9ydChlcnJvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ2hpbGRyZW4oTm9kZSB0YXJnZXQpIHsKLQkJaWYgKCh0YXJnZXQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgJiYgQ01VdGlsLmlzRm9yZWlnbigoRWxlbWVudCkgdGFyZ2V0KSkKLQkJCXJldHVybjsKLQotCQlmb3IgKE5vZGUgY2hpbGQgPSB0YXJnZXQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCXN3aXRjaCAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCQl7Ci0JCQkJCQlJRE9NTm9kZSB0ZXh0ID0gKElET01Ob2RlKSBjaGlsZDsKLQkJCQkJCWludCBjaGFyT2Zmc2V0ID0gdmFsaWRhdGVUZXh0U291cmNlKHRleHQpOwotCQkJCQkJaWYgKGNoYXJPZmZzZXQgPj0gMCkgewotCQkJCQkJCWNoYXJPZmZzZXQgKz0gdGV4dC5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBuZXcgU2VnbWVudChjaGFyT2Zmc2V0LCAxKTsKLQkJCQkJCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQkJCQkJcmVwb3J0KElOVkFMSURfQ0hBUl9FUlJPUiwgZXJyb3JTZWcsIHRleHQpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLQkJCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDoKLQkJCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLQkJCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLQkJCQkJewotCQkJCQkJSURPTU5vZGUgdGFnID0gKElET01Ob2RlKSBjaGlsZDsKLQkJCQkJCWlmICghdGFnLmlzQ2xvc2VkKCkpIHsKLQkJCQkJCQlTZWdtZW50IGVycm9yU2VnID0gRk1VdGlsLmdldFNlZ21lbnQodGFnLCBGTVV0aWwuU0VHX1dIT0xFX1RBRyk7Ci0JCQkJCQkJaWYgKGVycm9yU2VnICE9IG51bGwpCi0JCQkJCQkJCXJlcG9ydChVTkNMT1NFRF9UQUdfRVJST1IsIGVycm9yU2VnLCB0YWcpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCB2YWxpZGF0ZVRleHRTb3VyY2UoSURPTU5vZGUgdGV4dCkgewotCQl0cnkgewotCQkJU291cmNlVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBTb3VyY2VWYWxpZGF0b3IodGV4dCk7Ci0JCQl2YWxpZGF0b3IudmFsaWRhdGVTb3VyY2UodGV4dC5nZXRTb3VyY2UoKSk7Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBleC5nZXRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydChpbnQgc3RhdGUsIFNlZ21lbnQgZXJyb3JTZWcsIE5vZGUgbm9kZSkgewotCQlFcnJvckluZm8gaW5mbyA9IG5ldyBFcnJvckluZm9JbXBsKHN0YXRlLCBlcnJvclNlZywgbm9kZSk7Ci0JCXJlcG9ydGVyLnJlcG9ydChpbmZvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdGV4dC9JSFRNTFBhcnRpdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS90ZXh0L0lIVE1MUGFydGl0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2RkNWFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS90ZXh0L0lIVE1MUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dDsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4gSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uCi0gKiB0eXBlcyBmb3IgSFRNTC4gQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZSBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQKLSAqIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJSFRNTFBhcnRpdGlvbnMgewotCi0JU3RyaW5nIEhUTUxfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEhUTUxfREVDTEFSQVRJT04gPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUNMQVJBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSFRNTF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBTQ1JJUFQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTQ1JJUFRfRVZFTlRIQU5ETEVSID0gU0NSSVBUICsgIi5FVkVOVEhBTkRMRVIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNUWUxFID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLlNUWUxFIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gSVNTVUU6IEkgdGhpbmsgbWV0YSB0YWcgYXJlYXMgYXJlIGhlcmUgdG9vPwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTU1ODc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1odG1sLXZhbGlkYXRpb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDIzOWY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi1odG1sZWRpdG9yLmphcgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMDE1ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5odG1sLnVpL3Byb2plY3Rpb25wZXJmPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhiZWU3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0Lmh0bWwudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2MxMGU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotI1dlZCBNYXIgMjggMDM6MjY6NDAgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ1MzlmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNjAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWksCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5hdXRvZWRpdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmRlcml2ZWQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbms7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucmVnaXN0cnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zZWFyY2g7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zdHlsZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRhZ2luZm87eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudmlld3MuY29udGVudG91dGxpbmUKLUltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS51dGlsOyB2ZXJzaW9uPSIzLjgiLAotIGNvbS5pYm0uaWN1LnRleHQ7IHZlcnNpb249IjMuOCIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5mb3JtcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC41MDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjQwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNDAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjUwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjEwMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS40LjAsMi4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOThhNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdGVtcGxhdGVzLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgc3JjLWh0bWwtdmFsaWRhdGlvbi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2h0bWxfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2h0bWxfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3NWFhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdodG1sX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdodG1sX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdodG1sX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NmUxOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3aHRtbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlYmRiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWJsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTliNDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWFuY2hvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWFuY2hvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODk5MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1hbmNob3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1ib2R5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctYm9keS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNWZhOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1ib2R5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctYnV0dG9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctYnV0dG9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE0M2ZjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWJ1dHRvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWZvbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1mb250LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJiNDBjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWZvbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1mb3JtLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZm9ybS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTM5NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1mb3JtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWY1MTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWh0bWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1odG1sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzOWJhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWh0bWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1pbWFnZS1tYXAuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1pbWFnZS1tYXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjMyMzVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UtbWFwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1pbWFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ODhjMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1pbWFnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWpzcC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWpzcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwODQ2MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1qc3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLXRlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxZjgxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLXRlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctdGl0bGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10aXRsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMjkwOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10aXRsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTdmYjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdoZmlsZV93aXoucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdoZmlsZV93aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGZhNDQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3aGZpbGVfd2l6LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjMyZGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi1wbHVnaW5OYW1lPUhUTUwgVUkgU291cmNlIEVkaXRvcgotSFRNTF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZT1IVE1MIEVkaXRvcgotV0VCLm5hbWU9V2ViCi1IVE1MX0ZpbGVzLm5hbWU9SFRNTCBGaWxlcwotSFRNTF9Tb3VyY2UubmFtZT1FZGl0b3IKLUhUTUxfQ29udGVudF9Bc3Npc3QubmFtZT1Db250ZW50IEFzc2lzdAotSFRNTF9UZW1wbGF0ZXMubmFtZT1UZW1wbGF0ZXMKLUhUTUxfU3R5bGVzLm5hbWU9U3R5bGVzCi1IVE1MX1N5bnRheF9Db2xvcmluZz1TeW50YXggQ29sb3JpbmcKLUhUTUxfVHlwaW5nPVR5cGluZwotSFRNTF9WYWxpZGF0aW9uPVZhbGlkYXRpb24KLUhUTUxfUHJvcGVydHlfdmFsaWRhdGlvbj1IVE1MIFN5bnRheAotV2ViQ29udGVudFNldHRpbmdzLm5hbWU9V2ViIENvbnRlbnQgU2V0dGluZ3MKLURldmljZV9Qcm9maWxlX0VudHJ5X1Byb3ZpZGVyX0V4dGVuc2lvbi5uYW1lPURldmljZSBQcm9maWxlIEVudHJ5IFByb3ZpZGVyIEV4dGVuc2lvbgotQWxsX0hUTUxfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9QWxsIEhUTUwKLUhUTUxfTmV3X2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPU5ldyBIVE1MCi1IVE1MX1RhZ19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1IVE1MIFRhZwotSFRNTF9BdHRyaWJ1dGVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SFRNTCBBdHRyaWJ1dGUKLUhUTUxfQXR0cmlidXRlX3ZhbHVlX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUhUTUwgQXR0cmlidXRlIHZhbHVlCi1IVE1MX1N5bnRheF9WYWxpZGF0b3IubmFtZT1IVE1MIFN5bnRheCBWYWxpZGF0b3IKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIGV4dGVuc2lvbiBwb2ludAotX1VJX1dJWkFSRF9OQU1FID0gSFRNTCBGaWxlCi1fVUlfV0laQVJEX0NSRUFURV9ORVdfRklMRSA9IENyZWF0ZSBhIG5ldyBIVE1MIGZpbGUKLSMjCi1BZGRUYXNrLmxhYmVsPUFkZCAmVGFzay4uLgotQWRkVGFzay50b29sdGlwPUFkZCBUYXNrLi4uCi1BZGRCb29rbWFyay5sYWJlbD1BZGQgQm9vJmttYXJrLi4uCi1BZGRCb29rbWFyay50b29sdGlwPUFkZCBCb29rbWFyay4uLgotU2VsZWN0UnVsZXIubGFiZWw9U2VsZWN0IFJ1bGVyCi0jIwotQ2xlYW51cERvY3VtZW50X2xhYmVsPUNsZWFudXAgRG9jdW1lbnQuLi4KLUNsZWFudXBEb2N1bWVudF90b29sdGlwPUNsZWFudXAgRG9jdW1lbnQKLVRvZ2dsZUNvbW1lbnRfbGFiZWw9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfdG9vbHRpcD1Ub2dnbGUgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2xhYmVsPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfdG9vbHRpcD1BZGQgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcD1SZW1vdmUgQmxvY2sgQ29tbWVudAotRmluZE9jY3VycmVuY2VzX2xhYmVsPU9jY3VycmVuY2VzIGluIEZpbGUKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbD1FbmNsb3NpbmcgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsPU5leHQgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsPVByZXZpb3VzIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWw9UmVzdG9yZSBMYXN0IFNlbGVjdGlvbgotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwPVJlc3RvcmUgbGFzdCBzZWxlY3Rpb24KLSMjCi1wcmVmZXJlbmNlS2V5d29yZHMuZmlsZXM9ZWRpdG9yIGh0bWwgY3JlYXRpbmcgc2F2aW5nIGZpbGVzIHN1ZmZpeCBzcGVjaWZpZWQgZW5jb2RpbmcgaWFuYSBsb2FkaW5nCi1wcmVmZXJlbmNlS2V5d29yZHMuc291cmNlPWVkaXRvciBodG1sIHNvdXJjZSBmb3JtYXR0aW5nIGxpbmUgd2lkdGggc3BsaXQgbXVsdGlwbGUgYXR0cmlidXRlcyBuZXcgY2xlYXIgYmxhbmsgaW5kZW50IHRhYnMgc3BhY2VzIHNpemUgY29udGVudCBhc3Npc3QgYXV0b21hdGljYWxseSBzdWdnZXN0aW9ucyBwcm9tcHQgY2hhcmFjdGVycyBpbnNlcnRlZCBzdHJhdGVneSBsYXggc3RyaWN0IG1hcmt1cCBjYXNlIGNvZGUgZ2VuZXJhdGlvbiB0YWcgbmFtZXMgY2FwaXRhbGl6YXRpb24gdXBwZXJjYXNlIGxvd2VyY2FzZQotcHJlZmVyZW5jZUtleXdvcmRzLmNvbnRlbnRhc3Npc3Q9aHRtbCBlZGl0b3IgY29udGVudCBjb2RlIGFzc2lzdCBjb21wbGV0ZSBjb21wbGV0aW9uIGluc2VydCBvdmVyd3JpdGUgc2luZ2xlIHByb3Bvc2FsIGNvbW1vbiBwcmVmaXggYXV0b21hdGljYWxseSBpbXBvcnQgZmlsbCBhcmd1bWVudCBuYW1lIGd1ZXNzIGFscGhhYmV0aWNhbCBoaWRlIGF1dG8gYWN0aXZhdGlvbiB0cmlnZ2VyIGNhdGVnb3J5IGNhdGVnb3JpZXMgc2VwYXJhdGUgc3BlY2lmaWMKLXByZWZlcmVuY2VLZXl3b3Jkcy50ZW1wbGF0ZXM9ZWRpdG9yIGh0bWwgdGVtcGxhdGVzIHNuaXBwZXQgbWFjcm9zCi1wcmVmZXJlbmNlS2V5d29yZHMuc3R5bGVzPWVkaXRvciBodG1sIHN0eWxlIGN1c3RvbWl6ZSBzeW50YXggaGlnaGxpZ2h0aW5nIHR5cGUgdGV4dCBjb250ZW50IGZvcmVncm91bmQgYmFja2dyb3VuZCBib2xkIGNvbG9yCi1wcmVmZXJlbmNlS2V5d29yZHMud2ViY29udGVudD1lZGl0b3IgaHRtbCB3ZWIgY29udGVudCBzZXR0aW5ncyBwcm9maWxlIHN0eWxlIGRvY3VtZW50IHR5cGUgZG9jdHlwZSBwdWJsaWMgc3lzdGVtIGNzcwotcHJlZmVyZW5jZUtleXdvcmRzLnNldmVyaXRpZXM9aHRtbCBlcnJvcnMgd2FybmluZ3MgaWdub3JlIG9wdGlvbnMgc2V2ZXJpdHkgc2V2ZXJpdGllcyBzdXBwcmVzcyBwcm9qZWN0IHNwZWNpZmljIHByb2plY3RzcGVjaWZpYwotIyMKLUhUTUxfRWRpdG9yc190YXJnZXRfbmFtZT1IVE1MIEVkaXRvcnMKLQotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5odG1sLm5hbWU9RWRpdGluZyBIVE1MIFNvdXJjZQotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5odG1sLmRlc2NyaXB0aW9uPUVkaXRpbmcgSFRNTCBTb3VyY2UKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuaHRtbC5vY2N1cnJlbmNlcy5uYW1lPUhUTUwgU291cmNlIE9jY3VycmVuY2VzCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmh0bWwub2NjdXJyZW5jZXMuZGVzY3JpcHRpb249SFRNTCBTb3VyY2UgT2NjdXJyZW5jZXMKLQotQ29sb3JzLnNjcmlwdEFyZWFCb3JkZXI9U2NyaXB0IEFyZWEgQm9yZGVyCi1oeXBlcmxpbmtEZXRlY3Rvci5hbmNob3IubmFtZT1BbmNob3JzCi1oeXBlcmxpbmsudGFyZ2V0LnNjcmlwdC5uYW1lPUhUTUwgQ2xpZW50IFNjcmlwdAotaHlwZXJsaW5rLnRhcmdldC5ldmVudGhhbmRsZXIubmFtZT1IVE1MIEV2ZW50IEhhbmRsZXJzCi0KLXByb3Bvc2FsQ2F0ZWdvcnkuaHRtbFRhZ3M9SFRNTCBUYWcgUHJvcG9zYWxzCi1wcm9wb3NhbENhdGVnb3J5Lmh0bWxUZW1wbGF0ZXM9SFRNTCBUZW1wbGF0ZSBQcm9wb3NhbHMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YwZDQxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciIgbmFtZT0iJURldmljZV9Qcm9maWxlX0VudHJ5X1Byb3ZpZGVyX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9kZXZpY2VQcm9maWxlRW50cnlQcm92aWRlci5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLQkJPGVkaXRvcgotCQkJbmFtZT0iJUhUTUxfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWUiCi0JCQlpY29uPSIkbmwkL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZiIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWkuQWN0aW9uQ29udHJpYnV0b3JIVE1MIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiCi0JCQlzeW1ib2xpY0ZvbnROYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJPC9lZGl0b3I+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiIC8+Ci0JCTxjb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS52aWV3cy5jb250ZW50b3V0bGluZS5IVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiIC8+Ci0JCTxxdWlja091dGxpbmVDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5xdWlja291dGxpbmUuWE1MUXVpY2tPdXRsaW5lQ29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIi8+Ci0JCTxwcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MucHJvcGVydGllcy5YTUxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotICAJCTxkb2N1bWVudGF0aW9uVGV4dEhvdmVyCi0gICAgICAgIAljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGFnaW5mby5IVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yIgotICAgICAgICAJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQiPgotICAJCTwvZG9jdW1lbnRhdGlvblRleHRIb3Zlcj4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ic291cmNlZWRpdGluZ3RleHR0b29scyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlhNTFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0iY2hhcmFjdGVycGFpcm1hdGNoZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGV4dC5IVE1MRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJmb2xkaW5nc3RyYXRlZ3kiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLlhNTEZvbGRpbmdTdHJhdGVneSIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb24uWE1MUXVpY2tBc3Npc3RQcm9jZXNzb3IiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfREVGQVVMVCIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0iYXV0b2VkaXRzdHJhdGVneSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5hdXRvZWRpdC5TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUhUTUwiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfREVGQVVMVCwgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUNMQVJBVElPTiIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLmh0bWwsIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnNvdXJjZSwgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMudGVtcGxhdGVzLCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5zdHlsZXMsb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMudmFsaWRhdGlvbiwgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMuY29udGVudGFzc2lzdCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJzcGVsbGluZ3JlZ2lvbnMiCi0JCQl2YWx1ZT0iWE1MX0NPTU1FTlRfVEVYVCwgWE1MX0NPTlRFTlQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0iYWN0aXZlY29udGV4dHMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLCBvcmcuZWNsaXBzZS53c3QuaHRtbC5vY2N1cnJlbmNlcywgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5uYXZpZ2F0aW9uLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvbW1lbnRzLCBvcmcuZWNsaXBzZS53c3QueG1sLnNlbGVjdGlvbiIKLSAgICAgICAgCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuYW5ub3RhdGlvbk1vZGVsQ3JlYXRpb24iPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24iPgotCQk8YWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JIVE1MIj4KLQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8L2FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVXRUIubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy53ZWIiPgotCQk8L3BhZ2U+Ci0JCTwhLS0gSFRNTCBQUkVGRVJFTkNFIFBBR0VTLS0+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSFRNTF9GaWxlcy5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLndlYiIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5odG1sIj4KLQkJCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5maWxlcyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSFRNTF9Tb3VyY2UubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5odG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkhUTUxTb3VyY2VQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5zb3VyY2UiPgotCQkJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnNvdXJjZSIvPgotCQk8L3BhZ2U+Ci0gIDxwYWdlCi0gICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5zb3VyY2UiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5IVE1MQ29udGVudEFzc2lzdFByZWZlcmVuY2VQYWdlIgotICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMuY29udGVudGFzc2lzdCIKLSAgICAgICAgbmFtZT0iJUhUTUxfQ29udGVudF9Bc3Npc3QubmFtZSI+Ci0gICAgIDxrZXl3b3JkUmVmZXJlbmNlCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5jb250ZW50YXNzaXN0Ij4KLSAgICAgPC9rZXl3b3JkUmVmZXJlbmNlPgotICA8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSFRNTF9UZW1wbGF0ZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5zb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSFRNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMudGVtcGxhdGVzIj4KLQkJCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUhUTUxfU3ludGF4X0NvbG9yaW5nIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5IVE1MU3ludGF4Q29sb3JpbmdQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnN0eWxlcyI+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuc3R5bGVzIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVIVE1MX1ZhbGlkYXRpb24iCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMuaHRtbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnZhbGlkYXRpb24iPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSFRNTF9UeXBpbmciCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMuc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkhUTUxUeXBpbmdQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy50eXBpbmciPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSBXZWIgY29udGVudCBzZXR0aW5ncyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLQkJPCEtLSBmb3IgZHluYW1pYyB3ZWIgcHJvamVjdCAtLT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVXZWJDb250ZW50U2V0dGluZ3MubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Qcm9qZWN0V2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmR5bmFtaWNwcm9qZWN0cHJvcGVydHlwYWdlIj4KLSAgICAgICAgIAk8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgICAJPGFuZD4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCTxvcj4gCi0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJdmFsdWU9ImpzdC53ZWIiIC8+Ci0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJdmFsdWU9IndzdC53ZWIiIC8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvYW5kPiAKLQkJCTwvZW5hYmxlZFdoZW4+Ci0gICAgICAgICAJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLndlYmNvbnRlbnQiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJVdlYkNvbnRlbnRTZXR0aW5ncy5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLldlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5XZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiPgotICAgICAgICAgCTxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgIAk8YW5kPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotCQkJCQkJPG9yPiAKLQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29udGVudFR5cGVJZCIKLQkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29udGVudFR5cGVJZCIKLQkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZnJhZ21lbnRzb3VyY2UiIC8+Ci0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwZnJhZ21lbnRzb3VyY2UiIC8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvYW5kPiAKLQkJCTwvZW5hYmxlZFdoZW4+Ci0gICAgICAgICAJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLndlYmNvbnRlbnQiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUhUTUxfUHJvcGVydHlfdmFsaWRhdGlvbiIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByb3BlcnR5UGFnZS5wcm9qZWN0LnZhbGlkYXRpb24iCi0JCQljYXRlZ29yeT0iVmFsaWRhdGlvblByb3BlcnRpZXNQYWdlIj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkKLQkJCQk8L2FkYXB0PgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9wYWdlPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gS2V5d29yZHMgZm9yIHByZWZlcmVuY2UgYW5kIHByb3BlcnRpZXMgcGFnZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkua2V5d29yZHMiPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMuZmlsZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuZmlsZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnNvdXJjZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5zb3VyY2UiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLmNvbnRlbnRhc3Npc3QiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuY29udGVudGFzc2lzdCIvPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMudGVtcGxhdGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlbXBsYXRlcyIvPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMuc3R5bGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnN0eWxlcyIvPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMud2ViY29udGVudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS53ZWJjb250ZW50Ii8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5zZXZlcml0aWVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnNldmVyaXRpZXMiLz4KLSAgICA8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIEVkaXRvciBhY3Rpb25zZXRzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMiPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LmFjdGlvblNldC5hbm5vdGF0aW9uTmF2aWdhdGlvbiI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLnNvdXJjZSI+Ci0JCQk8L3BhcnQ+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuTmF2aWdhdGVBY3Rpb25TZXQiPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiPgotCQkJPC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gVGVtcGxhdGVzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGVtcGxhdGVzIj4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlQWxsX0hUTUxfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVIVE1MIgotCQkJaWQ9Imh0bWxfYWxsIj4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlSFRNTF9OZXdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVIVE1MIgotCQkJaWQ9Imh0bWxfbmV3Ij4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlSFRNTF9UYWdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVIVE1MIgotCQkJaWQ9Imh0bWxfdGFnIj4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlSFRNTF9BdHRyaWJ1dGVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVIVE1MIgotCQkJaWQ9Imh0bWxfYXR0cmlidXRlIj4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlSFRNTF9BdHRyaWJ1dGVfdmFsdWVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVIVE1MIgotCQkJaWQ9Imh0bWxfYXR0cmlidXRlX3ZhbHVlIj4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGluY2x1ZGUKLQkJCWZpbGU9InRlbXBsYXRlcy9odG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sIgotCQkJdHJhbnNsYXRpb25zPSIkbmwkL3RlbXBsYXRlcy9odG1sZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcyI+Ci0JCTwvaW5jbHVkZT4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIERlZmluZSB0aGUgSFRNTCBDb250ZXh0cyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cyI+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5odG1sLm5hbWUiCi0JCQlwYXJlbnRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJZGVzY3JpcHRpb249IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmh0bWwuZGVzY3JpcHRpb24iCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIj4KLQkJPC9jb250ZXh0PgotCQk8Y29udGV4dAotCQkJbmFtZT0iJXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuaHRtbC5vY2N1cnJlbmNlcy5uYW1lIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWRlc2NyaXB0aW9uPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5odG1sLm9jY3VycmVuY2VzLmRlc2NyaXB0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLm9jY3VycmVuY2VzIj4KLQkJPC9jb250ZXh0PgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gaW5pdGlhbGl6ZSBodG1sIHVpIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxVSVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gRG9jdW1lbnQgcHJvdmlkZXIgZm9yIEV4dGVybmFsRmlsZUVkaXRvcklucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuZG9jdW1lbnRQcm92aWRlcnMiPgotCQk8cHJvdmlkZXIKLQkJCWlucHV0VHlwZXM9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluay5FeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEZpbGVEb2N1bWVudFByb3ZpZGVyIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkV4dGVybmFsRmlsZURvY3VtZW50UHJvdmlkZXIiPgotCQk8L3Byb3ZpZGVyPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBXb3JrYmVuY2ggdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8ZXh0ZW5zaW9uIGlkPSJIVE1MVmFsaWRhdG9yIiBuYW1lPSIlSFRNTF9TeW50YXhfVmFsaWRhdG9yLm5hbWUiIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiI+Ci0gICAgICA8dmFsaWRhdG9yCi0gICAgICAgICAgICBidWlsZD0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uLkhUTUxWYWxpZGF0b3IiCi0gICAgICAgICAgICBtYW51YWw9InRydWUiCi0gICAgICAgICAgICBzb3VyY2VpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5odG1sc3ludGF4dmFsaWRhdG9yIgotICAgICAgICAgICAgdmVyc2lvbj0iMSIKLSAgICAgICAgICAgIG1hcmtlcklkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnZhbGlkYXRpb25NYXJrZXIiPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI+PC9jb250ZW50VHlwZT4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0IGNhc2VTZW5zaXRpdmU9ImZhbHNlIiBleHQ9Imh0bWwiLz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0IGNhc2VTZW5zaXRpdmU9ImZhbHNlIiBleHQ9InhodG1sIi8+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dCBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIgZXh0PSJodG0iLz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0IGNhc2VTZW5zaXRpdmU9ImZhbHNlIiBleHQ9Imh0cGwiLz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0IGNhc2VTZW5zaXRpdmU9ImZhbHNlIiBleHQ9IndtbCIvPgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgIDxncm91cCBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnN0cnVjdHVyZWRNb2RlbEdyb3VwIi8+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBBcyB5b3UgdHlwZSB2YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InRvdGFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb24uSFRNTFZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmh0bWxzeW50YXh2YWxpZGF0b3IiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllcgotCQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUNMQVJBVElPTiIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0NPTU1FTlQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiLz4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gTmV3IEhUTUwgd2l6YXJkIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotCQk8d2l6YXJkCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkLk5ld0hUTUxXaXphcmQiCi0JCQluYW1lPSIlX1VJX1dJWkFSRF9OQU1FIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLndpemFyZC5OZXdIVE1MV2l6YXJkIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0JCQlpY29uPSIkbmwkL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdodG1sX3dpei5naWYiPgotCQkJPGRlc2NyaXB0aW9uPiVfVUlfV0laQVJEX0NSRUFURV9ORVdfRklMRTwvZGVzY3JpcHRpb24+Ci0JCQk8c2VsZWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiIC8+Ci0JCTwvd2l6YXJkPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBBZGQgbmV3IEhUTUwgd2l6YXJkIHRvIENvbW1vbiBOYXZpZ2F0b3IgLS0+Ci0JPGV4dGVuc2lvbgotCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29tbW9uV2l6YXJkLm5ld0hUTUwiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudCI+Ci0JCTxjb21tb25XaXphcmQKLSAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0gICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLndpemFyZC5OZXdIVE1MV2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0JCQkJCQk8b3I+Ci0JCQkJCQkJPHRlc3QKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJdmFsdWU9IndzdC53ZWIiLz4KLQkJCQkJCQk8dGVzdAotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQl2YWx1ZT0ianN0LndlYiIvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCQk8dmlld2VyQ29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLnNvdXJjZS5SdWxlckNvbnRleHQiCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5ydWxlci5jb250ZXh0LmFjdGlvbnMiPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkVGFzay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5BZGRUYXNrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkVGFzay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkQm9va21hcmsudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCTwvdmlld2VyQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotCTwhLS0JPGVkaXRvckNvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UuZWRpdG9yQWN0aW9ucyIKLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2Uuc291cmNlIj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iQ2xlYW51cERvY3VtZW50IgotCQkJCWxhYmVsPSIlQ2xlYW51cERvY3VtZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jbGVhbnVwLmRvY3VtZW50IgotCQkJCXRvb2x0aXA9IiVDbGVhbnVwRG9jdW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdC51aS5DbGVhbnVwQWN0aW9uSFRNTERlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJDbGVhbnVwRG9jdW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlRvZ2dsZUNvbW1lbnQiCi0JCQkJbGFiZWw9IiVUb2dnbGVDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50b2dnbGUuY29tbWVudCIKLQkJCQl0b29sdGlwPSIlVG9nZ2xlQ29tbWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuVG9nZ2xlQ29tbWVudEFjdGlvblhNTERlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJUb2dnbGVDb21tZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJBZGRCbG9ja0NvbW1lbnQiCi0JCQkJbGFiZWw9IiVBZGRCbG9ja0NvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkZC5ibG9jay5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVBZGRCbG9ja0NvbW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFkZEJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJBZGRCbG9ja0NvbW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlJlbW92ZUJsb2NrQ29tbWVudCIKLQkJCQlsYWJlbD0iJVJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucmVtb3ZlLmJsb2NrLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuUmVtb3ZlQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlJlbW92ZUJsb2NrQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iRmluZE9jY3VycmVuY2VzIgotCQkJCWxhYmVsPSIlRmluZE9jY3VycmVuY2VzX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zZWFyY2guZmluZC5vY2N1cnJlbmNlcyIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc2VhcmNoLkhUTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iRmluZE9jY3VycmVuY2VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdE5leHRYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0TmV4dCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RIaXN0b3J5QWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiPgotCQkJPC9hY3Rpb24+Ci0JCTwvZWRpdG9yQ29udHJpYnV0aW9uPi0tPgotICAgICAgICA8ZWRpdG9yQ29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLnNvdXJjZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UucnVsZXIuYWN0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyRG91YmxlQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIi8+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVNlbGVjdFJ1bGVyLmxhYmVsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIi8+Ci0gICAgICAgIDwvZWRpdG9yQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWkuQ2xlYW51cERvY3VtZW50SGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCI+Ci0gICAgICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgCTxyZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5odG1sU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj4KLSAgICAgICAgICAgICAJPC9yZWZlcmVuY2U+Ci0gICAgICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAJPHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmh0bWxTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iPgotICAgICAgICAgICAgIAk8L3JlZmVyZW5jZT4KLSAgICAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5IVE1MRmluZE9jY3VycmVuY2VzSGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMiPgotICAgICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgIAk8cmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkub2NjdXJyZW5jZXMiPgotICAgICAgICAgICAgIAk8L3JlZmVyZW5jZT4KLSAgICAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgIAk8cmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkub2NjdXJyZW5jZXMiPgotICAgICAgICAgICAgIAk8L3JlZmVyZW5jZT4KLSAgICAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAKLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci5oeXBlcmxpbmtEZXRlY3RvclRhcmdldHMiPgotCQk8dGFyZ2V0Ci0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIgotCQkJbmFtZT0iJUhUTUxfRWRpdG9yc190YXJnZXRfbmFtZSIvPgotCQk8dGFyZ2V0Ci0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBUIgotCQkJbmFtZT0iJWh5cGVybGluay50YXJnZXQuc2NyaXB0Lm5hbWUiLz4KLQkJPHRhcmdldAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVEhBTkRMRVIiCi0JCQluYW1lPSIlaHlwZXJsaW5rLnRhcmdldC5ldmVudGhhbmRsZXIubmFtZSIvPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmh5cGVybGlua0RldGVjdG9ycyI+Ci0JCTxoeXBlcmxpbmtEZXRlY3RvcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluay5BbmNob3JIeXBlcmxpbmtEZXRlY3RvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsuQW5jaG9ySHlwZXJsaW5rRGV0ZWN0b3IiCi0JCQluYW1lPSIlaHlwZXJsaW5rRGV0ZWN0b3IuYW5jaG9yLm5hbWUiCi0JCQl0YXJnZXRJZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCI+Ci0JCTwvaHlwZXJsaW5rRGV0ZWN0b3I+Ci0JCQotICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmh0bWxTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iPgotICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkgICAgICAgICAgIDxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JICAgICAgICAgICAgICA8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiLz4KLQkgICAgICAgICAgIDwvaXRlcmF0ZT4KLSAgICAgICAgICAgIDwvd2l0aD4KLQkJPC9kZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkub2NjdXJyZW5jZXMiPgotICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkgICAgICAgICAgIDxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JICAgICAgICAgICAgICA8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5vY2N1cnJlbmNlcyIvPgotCSAgICAgICAgICAgPC9pdGVyYXRlPgotICAgICAgICAgICAgPC93aXRoPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBEZWZpbmUgdGhlbWUgLSBNYW55IG9mIHRoZSBjb2xvciBvdmVycmlkZXMgYW5kIGRlZmluaXRpb25zIGNvbWUgZnJvbSAKLQkgICAgIHRoZSBYTUwgcGx1Z2luIC0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnRoZW1lcyI+Ci0JCTx0aGVtZQotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5zeXN0ZW1EZWZhdWx0Ij4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9IlNDUklQVF9BUkVBX0JPUkRFUiIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJPC90aGVtZT4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9IlNDUklQVF9BUkVBX0JPUkRFUiIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuc2NyaXB0QXJlYUJvcmRlciIKLQkJCXZhbHVlPSIxOTEsIDk1LCA2MyI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gRW5hYmxlIHRoZSBGb3JtYXRIYW5kbGVyIGZvciBIVE1MIENvbnRlbnQgVHlwZSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+Ci0JCTxoYW5kbGVyIAotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuaGFuZGxlcnMuRm9ybWF0SGFuZGxlciIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5mb3JtYXQiPgotCQkJPGFjdGl2ZVdoZW4+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmh0bWxDb250ZW50VHlwZS5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCTwvYWN0aXZlV2hlbj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaHRtbENvbnRlbnRUeXBlLmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9oYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gU2V0IHVwIGEgZGVmaW5pdGlvbiBmb3IgSFRNTCBDb250ZW50IFR5cGVzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaHRtbENvbnRlbnRUeXBlLmRlZmluaXRpb24iPgotCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgotCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0JCQkJCTwhLS0gRm9yY2UgcHJvcGVydHkgdGVzdGVyIHRvIGxvYWQsIHNob3VsZCBub3QgY2F1c2UgZW50aXJlIHBsdWctaW4gdG8gc3RhcnQgLS0+Ci0JCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KLQkJCQk8L2FkYXB0PgotCQkJPC9pdGVyYXRlPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jaGFyYWN0ZXJQYWlyaW5nIj4KLQkJPGluc2VydGVyIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZXh0LkNoYXJhY3RlclBhaXJJbnNlcnRlciIgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluc2VydGVyIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIgotCQkJCXBhcnRpdGlvbnM9Im9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfREVGQVVMVCI+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC9pbnNlcnRlcj4KLQk8L2V4dGVuc2lvbj4KLSA8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29tcGxldGlvblByb3Bvc2FsIj4KLSAgICA8cHJvcG9zYWxDYXRlZ29yeQotICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmIgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcm9wb3NhbENhdGVnb3J5Lmh0bWxUYWdzIgotICAgICAgICAgIG5hbWU9IiVwcm9wb3NhbENhdGVnb3J5Lmh0bWxUYWdzIj4KLSAgICA8L3Byb3Bvc2FsQ2F0ZWdvcnk+Ci0gICAgPHByb3Bvc2FsQ2F0ZWdvcnkKLSAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByb3Bvc2FsQ2F0ZWdvcnkuaHRtbFRlbXBsYXRlcyIKLSAgICAgICAgICBuYW1lPSIlcHJvcG9zYWxDYXRlZ29yeS5odG1sVGVtcGxhdGVzIj4KLSAgICA8L3Byb3Bvc2FsQ2F0ZWdvcnk+Ci0gICAgPHByb3Bvc2FsQ29tcHV0ZXIKLSAgICAgICAgICBhY3RpdmF0ZT0iZmFsc2UiCi0gICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJvcG9zYWxDYXRlZ29yeS5odG1sVGFncyIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5IVE1MVGFnc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcm9wb3NhbENvbXB1dGVyLmh0bWxUYWdzIj4KLSAgICAgICA8Y29udGVudFR5cGUKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIj4KLSAgICAgICAgICA8cGFydGl0aW9uVHlwZQotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQiPgotICAgICAgICAgIDwvcGFydGl0aW9uVHlwZT4KLSAgICAgICA8L2NvbnRlbnRUeXBlPgotICAgIDwvcHJvcG9zYWxDb21wdXRlcj4KLSAgICA8cHJvcG9zYWxDb21wdXRlcgotICAgICAgICAgIGFjdGl2YXRlPSJmYWxzZSIKLSAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcm9wb3NhbENhdGVnb3J5Lmh0bWxUZW1wbGF0ZXMiCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSFRNTFRlbXBsYXRlc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcm9wb3NhbENvbXB1dGVyLmh0bWxUZW1wbGF0ZXMiPgotICAgICAgIDxjb250ZW50VHlwZQotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiPgotICAgICAgICAgIDxwYXJ0aXRpb25UeXBlCi0gICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfREVGQVVMVCI+Ci0gICAgICAgICAgPC9wYXJ0aXRpb25UeXBlPgotICAgICAgIDwvY29udGVudFR5cGU+Ci0gICAgPC9wcm9wb3NhbENvbXB1dGVyPgotICAgIDxwcm9wb3NhbENvbXB1dGVyRXh0ZW5kZWRBY3RpdmF0aW9uCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkucHJvcG9zYWxDb21wdXRlci5jc3MiPgotICAgICAgIDxjb250ZW50VHlwZQotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiPgotICAgICAgICAgIDxwYXJ0aXRpb25UeXBlCi0gICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuU1RZTEUiPgotICAgICAgICAgIDwvcGFydGl0aW9uVHlwZT4KLSAgICAgICA8L2NvbnRlbnRUeXBlPgotICAgIDwvcHJvcG9zYWxDb21wdXRlckV4dGVuZGVkQWN0aXZhdGlvbj4KLSAgICA8cHJvcG9zYWxDb21wdXRlckV4dGVuZGVkQWN0aXZhdGlvbgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByb3Bvc2FsQ29tcHV0ZXIuY3NzVGVtcGxhdGVzIj4KLSAgICAgICA8Y29udGVudFR5cGUKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIj4KLSAgICAgICAgICA8cGFydGl0aW9uVHlwZQotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLlNUWUxFIj4KLSAgICAgICAgICA8L3BhcnRpdGlvblR5cGU+Ci0gICAgICAgPC9jb250ZW50VHlwZT4KLSAgICA8L3Byb3Bvc2FsQ29tcHV0ZXJFeHRlbmRlZEFjdGl2YXRpb24+Ci0gPC9leHRlbnNpb24+Ci0gPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uIj4KLSAgICA8Y2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24KLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uIgotICAgICAgICAgIGNvbnRlbnRUeXBlSUQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI+Ci0gICAgPC9jYXRlZ29yaWVzQ29uZmlndXJhdGlvbj4KLSA8L2V4dGVuc2lvbj4KLQkKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zY2hlbWEvZGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc2NoZW1hL2RldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MmY4MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zY2hlbWEvZGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkiIGlkPSJkZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciIgbmFtZT0iRGV2aWNlIFByb2ZpbGUgRW50cnkgUHJvdmlkZXIgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uUmVwb3J0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uUmVwb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxMDY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlcG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5FcnJvckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MVmFsaWRhdGlvblJlcG9ydGVyIGltcGxlbWVudHMgVmFsaWRhdGlvblJlcG9ydGVyIHsKLQotCXByaXZhdGUgSVZhbGlkYXRvciBvd25lciA9IG51bGw7Ci0JcHJpdmF0ZSBJUmVwb3J0ZXIgcmVwb3J0ZXIgPSBudWxsOwotCXByaXZhdGUgSUZpbGUgZmlsZSA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQlwcml2YXRlIEhUTUxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA9IG51bGw7Ci0JcHJpdmF0ZSBNZXNzYWdlRmFjdG9yeSBmRmFjdG9yeSA9IG51bGw7Ci0JCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIoSVZhbGlkYXRvciBvd25lciwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQkJdGhpcy5yZXBvcnRlciA9IHJlcG9ydGVyOwotCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCWZGYWN0b3J5ID0gbmV3IE1lc3NhZ2VGYWN0b3J5KGZpbGUgIT0gbnVsbCA/IGZpbGUuZ2V0UHJvamVjdCgpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWlmICh0aGlzLmZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0aGlzLnJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKHRoaXMucmVwb3J0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy5yZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzLm93bmVyLCB0aGlzLmZpbGUpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gcmVtb3ZlIGJ5IG15c2VsZj8KLQkJCVN0cmluZyBpZCA9IEhUTUxWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpOwotCQkJdHJ5IHsKLQkJCQkvLyBUYXNrTGlzdEhlbHBlciBBUEkgY2hhbmdlZAotCQkJCS8vIFRhc2tMaXN0SGVscGVyLmdldFRhc2tMaXN0KCkucmVtb3ZlQWxsVGFza3MoaWQsIHRoaXMuZmlsZSwKLQkJCQkvLyBudWxsKTsKLQkJCQlUYXNrTGlzdEhlbHBlci5nZXRUYXNrTGlzdCgpLnJlbW92ZUFsbFRhc2tzKHRoaXMuZmlsZSwgaWQsIG51bGwpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxWYWxpZGF0aW9uUmVzdWx0IGdldFJlc3VsdCgpIHsKLQkJaWYgKHRoaXMucmVzdWx0ID09IG51bGwpCi0JCQl0aGlzLnJlc3VsdCA9IG5ldyBIVE1MVmFsaWRhdGlvblJlc3VsdCgpOwotCQlyZXR1cm4gdGhpcy5yZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVwb3J0KFZhbGlkYXRpb25NZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCB8fCBtZXNzYWdlLmdldFNldmVyaXR5KCkgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKQotCQkJcmV0dXJuOwotCQlJTWVzc2FnZSBtZXMgPSB0cmFuc2xhdGVNZXNzYWdlKG1lc3NhZ2UpOwotCi0JCWlmICh0aGlzLnJlcG9ydGVyICE9IG51bGwpIHsKLQkJCXRoaXMucmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLm93bmVyLCBtZXMpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHRoaXMuZmlsZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJLy8gYWRkIGJ5IG15c2VsZj8KLQkJCVN0cmluZyBpZCA9IEhUTUxWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGxvY2F0aW9uID0gSW50ZWdlci50b1N0cmluZyhtZXMuZ2V0TGluZU51bWJlcigpKTsKLQkJCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCUlQYXRoIGZpbGVQYXRoID0gdGhpcy5maWxlLmdldEZ1bGxQYXRoKCk7Ci0JCQlpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotCQkJCW5hbWUgPSBmaWxlUGF0aC50b1N0cmluZygpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlUYXNrTGlzdEhlbHBlci5nZXRUYXNrTGlzdCgpLmFkZFRhc2soaWQsIHRoaXMuZmlsZSwgbG9jYXRpb24sIG1lcy5nZXRJZCgpLCBtZXMuZ2V0VGV4dCgpLCBtZXMuZ2V0U2V2ZXJpdHkoKSwgbmFtZSwgbWVzLmdldEdyb3VwTmFtZSgpLCBtZXMuZ2V0T2Zmc2V0KCksIG1lcy5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVHJhbnNsYXRlIFZhbGlkYXRpb25NZXNzYWdlIHRvIElNZXNzYWdlIGFuZCBnZW5lcmF0ZSByZXN1bHQgbG9nCi0JICovCi0JcHJpdmF0ZSBJTWVzc2FnZSB0cmFuc2xhdGVNZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaW50IHNldmVyaXR5ID0gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCQlIVE1MVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgPSBnZXRSZXN1bHQoKTsKLQkJc3dpdGNoIChtZXNzYWdlLmdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQkJCQlyZXN1bHQuYWRkRXJyb3IoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JCQkJcmVzdWx0LmFkZFdhcm5pbmcoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuSU5GT1JNQVRJT04gOgotCQkJCXJlc3VsdC5hZGRJbmZvcm1hdGlvbigpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0vLwkJCQlyZXN1bHQuYWRkSW5mb3JtYXRpb24oKTsKLQkJCQlicmVhazsKLQkJfQotCi0JCUlNZXNzYWdlIG1lcyA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKHNldmVyaXR5LCBtZXNzYWdlLmdldE1lc3NhZ2UoKSwgdGhpcy5maWxlKTsKLQkJbWVzLnNldE9mZnNldChtZXNzYWdlLmdldE9mZnNldCgpKTsKLQkJbWVzLnNldExlbmd0aChtZXNzYWdlLmdldExlbmd0aCgpKTsKLQkJaWYgKHRoaXMubW9kZWwgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBmbGF0TW9kZWwgPSB0aGlzLm1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKGZsYXRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaW50IGxpbmUgPSBmbGF0TW9kZWwuZ2V0TGluZU9mT2Zmc2V0KG1lc3NhZ2UuZ2V0T2Zmc2V0KCkpOwotCQkJCW1lcy5zZXRMaW5lTm8obGluZSArIDEpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1lczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXBvcnQoRXJyb3JJbmZvIGluZm8pIHsKLQkJcmVwb3J0KGZGYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoaW5mbykpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlc3VsdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vSFRNTFZhbGlkYXRpb25SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZjNWYwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotcHVibGljIGNsYXNzIEhUTUxWYWxpZGF0aW9uUmVzdWx0IHsKLQlwcml2YXRlIGludCBlcnJvcnMgPSAwOwotCXByaXZhdGUgaW50IHdhcm5pbmdzID0gMDsKLQlwcml2YXRlIGludCBpbmZvcm1hdGlvbnMgPSAwOwotCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxWYWxpZGF0aW9uUmVzdWx0KCkgewotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVycm9yKCkgewotCQl0aGlzLmVycm9ycysrOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEluZm9ybWF0aW9uKCkgewotCQl0aGlzLmluZm9ybWF0aW9ucysrOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoKSB7Ci0JCXRoaXMud2FybmluZ3MrKzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVycm9ycygpIHsKLQkJcmV0dXJuIHRoaXMuZXJyb3JzOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5mb3JtYXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5pbmZvcm1hdGlvbnM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRXYXJuaW5ncygpIHsKLQkJcmV0dXJuIHRoaXMud2FybmluZ3M7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuICh0aGlzLmVycm9ycyA9PSAwICYmIHRoaXMud2FybmluZ3MgPT0gMCAmJiB0aGlzLmluZm9ybWF0aW9ucyA9PSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvbldvcmtiZW5jaEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vSFRNTFZhbGlkYXRpb25Xb3JrYmVuY2hIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBiZmRlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvbldvcmtiZW5jaEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaENvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MVmFsaWRhdGlvbldvcmtiZW5jaEhlbHBlciBleHRlbmRzIFdvcmtiZW5jaENvbnRleHQgewotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MVmFsaWRhdGlvbldvcmtiZW5jaEhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIGFuIElWYWxpZGF0b3IgYXNzb2NpYXRlcyBhIHRhcmdldCBvYmplY3Qgd2l0aCBhbiBJTWVzc2FnZSwgdGhlCi0JICogV29ya2JlbmNoUmVwb3J0ZXIgZXZlbnR1YWxseSByZXNvbHZlcyB0aGF0IHRhcmdldCBvYmplY3Qgd2l0aCBhbgotCSAqIElSZXNvdXJjZS4gU29tZXRpbWVzIG1vcmUgdGhhbiBvbmUgdGFyZ2V0IG9iamVjdCByZXNvbHZlcyB0byB0aGUgc2FtZQotCSAqIElSZXNvdXJjZSAodXN1YWxseSB0aGUgSVByb2plY3QsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IElSZXNvdXJjZSB3aGVuIGFuCi0JICogSUZpbGUgY2Fubm90IGJlIGZvdW5kKS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkLCBieSB0aGUKLQkgKiBXb3JrYmVuY2hSZXBvcnRlciwgc28gdGhhdCB0aGUgV29ya2JlbmNoUmVwb3J0ZXIgY2FuIGRpc3Rpbmd1aXNoCi0JICogYmV0d2VlbiB0aGUgSU1lc3NhZ2VzIHdoaWNoIGFyZSBvbiB0aGUgc2FtZSBJUmVzb3VyY2UsIGJ1dCByZWZlciB0bwotCSAqIGRpZmZlcmVudCB0YXJnZXQgb2JqZWN0cy4gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZQotCSAqIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IsIE9iamVjdCkgbWV0aG9kLCBzbyB0aGF0IHdoZW4gb25lIHRhcmdldAotCSAqIG9iamVjdCByZW1vdmVzIGFsbCBvZiBpdHMgbWVzc2FnZXMsIHRoYXQgaXQgZG9lc24ndCByZW1vdmUgYW5vdGhlcgotCSAqIHRhcmdldCBvYmplY3QncyBtZXNzYWdlcy4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwgb25seSBpZiBvYmplY3QgaXMgbnVsbC4gT3RoZXJ3aXNlLCBhbiBpZAotCSAqIHdoaWNoIGNhbiB1bmlxdWVseSBpZGVudGlmeSBhIHBhcnRpY3VsYXIgb2JqZWN0IG11c3QgYmUgcmV0dXJuZWQuIFRoZQotCSAqIGlkIG5lZWRzIHRvIGJlIHVuaXF1ZSBvbmx5IHdpdGhpbiBvbmUgcGFydGljdWxhciBJVmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0TmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpCi0JCQlyZXR1cm4gZ2V0UG9ydGFibGVOYW1lKChJRmlsZSkgb2JqZWN0KTsKLQkJcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYmYyN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vSFRNTFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5IVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuRmlsZUJ1ZmZlck1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuSVNvdXJjZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIEhUTUxWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3JKb2IsIElTb3VyY2VWYWxpZGF0b3IsIElFeGVjdXRhYmxlRXh0ZW5zaW9uIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfV1NUX0hUTUxfQ09SRV9IVE1MU09VUkNFID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBib29sZWFuIHNob3VsZFZhbGlkYXRlKElGaWxlIGZpbGUpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZmlsZTsKLQkJZG8gewotCQkJaWYgKHJlc291cmNlLmlzRGVyaXZlZCgpIHx8IHJlc291cmNlLmlzVGVhbVByaXZhdGVNZW1iZXIoKSB8fCAhcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkgfHwgKHJlc291cmNlLmdldE5hbWUoKS5jaGFyQXQoMCkgPT0gJy4nICYmIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJd2hpbGUgKChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUFJPSkVDVCkgPT0gMCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIElDb250ZW50VHlwZU1hbmFnZXIgZkNvbnRlbnRUeXBlTWFuYWdlcjsKLQlwcml2YXRlIElDb250ZW50VHlwZVtdIGZPdGhlclN1cHBvcnRlZENvbnRlbnRUeXBlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBmQWRkaXRpb25hbENvbnRlbnRUeXBlc0lEcyA9IG51bGw7Ci0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkhUTUxDb250ZW50VHlwZTsKLQotCXB1YmxpYyBIVE1MVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCQlmQ29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JCWZIVE1MQ29udGVudFR5cGUgPSBmQ29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKE9SR19FQ0xJUFNFX1dTVF9IVE1MX0NPUkVfSFRNTFNPVVJDRSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCS8qKgotCSAqIEdldHMgbGlzdCBvZiBjb250ZW50IHR5cGVzIHRoaXMgdmFsaWRhdG9yIGlzIGludGVyZXN0ZWQgaW4KLQkgKiAKLQkgKiBAcmV0dXJuIEFsbCBIVE1MLXJlbGF0ZWQgY29udGVudCB0eXBlcwotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRUeXBlW10gZ2V0T3RoZXJTdXBwb3J0ZWRDb250ZW50VHlwZXMoKSB7Ci0JCWlmIChmT3RoZXJTdXBwb3J0ZWRDb250ZW50VHlwZXMgPT0gbnVsbCkgewotCQkJTGlzdCBjb250ZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0KDMpOwotCQkJaWYgKGZBZGRpdGlvbmFsQ29udGVudFR5cGVzSURzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZBZGRpdGlvbmFsQ29udGVudFR5cGVzSURzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlDb250ZW50VHlwZSB0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoZkFkZGl0aW9uYWxDb250ZW50VHlwZXNJRHNbaV0pOwotCQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCQljb250ZW50VHlwZXMuYWRkKHR5cGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZk90aGVyU3VwcG9ydGVkQ29udGVudFR5cGVzID0gKElDb250ZW50VHlwZVtdKSBjb250ZW50VHlwZXMudG9BcnJheShuZXcgSUNvbnRlbnRUeXBlW2NvbnRlbnRUeXBlcy5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gZk90aGVyU3VwcG9ydGVkQ29udGVudFR5cGVzOwotCX0KLQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElET01Nb2RlbCBnZXRNb2RlbChJUHJvamVjdCBwcm9qZWN0LCBJRmlsZSBmaWxlKSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIWNhbkhhbmRsZShmaWxlKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQl0cnkgewotCQkJZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQkJCX0KLQkJCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gcmV0cnkgaWdub3JpbmcgTUVUQSBjaGFyc2V0IGZvciBpbnZhbGlkIE1FVEEgY2hhcnNldAotCQkJCS8vIHNwZWNpZmljYXRpb24KLQkJCQkvLyByZWNyZWF0ZSBpbnB1dCBzdHJlYW0sIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBwYXJ0aWFsbHkgcmVhZAotCQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvclJlYWQoZmlsZSwgbmV3IFN0cmluZygpLCBudWxsKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkpIHsKLQkJCXJlbGVhc2VNb2RlbChtb2RlbCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKElET01Nb2RlbCkgbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIgZ2V0UmVwb3J0ZXIoSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJRE9NTW9kZWwgbW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBIVE1MVmFsaWRhdGlvblJlcG9ydGVyKHRoaXMsIHJlcG9ydGVyLCBmaWxlLCBtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgZmlsZSBleHRlbnNpb24gdG8gdmFsaWRhdGUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuSGFuZGxlKElGaWxlIGZpbGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCUlDb250ZW50VHlwZSBmaWxlQ29udGVudFR5cGUgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCQkJaWYgKGZpbGVDb250ZW50VHlwZS5pc0tpbmRPZihmSFRNTENvbnRlbnRUeXBlKSkgewotCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUlDb250ZW50VHlwZVtdIG90aGVyVHlwZXMgPSBnZXRPdGhlclN1cHBvcnRlZENvbnRlbnRUeXBlcygpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJcmVzdWx0ID0gcmVzdWx0IHx8IGZpbGVDb250ZW50VHlwZS5pc0tpbmRPZihvdGhlclR5cGVzW2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChmSFRNTENvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gZkhUTUxDb250ZW50VHlwZS5pc0Fzc29jaWF0ZWRXaXRoKGZpbGUuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gc2hvdWxkIGJlIHJhcmUsIGJ1dCB3aWxsIGlnbm9yZSB0byBhdm9pZCBsb2dnaW5nICJlbmNvZGluZwotCQkJCS8vIGV4Y2VwdGlvbnMiIGFuZCB0aGUgbGlrZSBoZXJlLgotCQkJCS8vIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzSFRNTEZlYXR1cmUoSURPTURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBkb2N1bWVudC5nZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYWRhcHRlci5oYXNGZWF0dXJlKEhUTUxEb2N1bWVudFR5cGVDb25zdGFudHMuSFRNTCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZU1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKGhlbHBlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoKHJlcG9ydGVyICE9IG51bGwpICYmIChyZXBvcnRlci5pc0NhbmNlbGxlZCgpID09IHRydWUpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQotCQlTdHJpbmdbXSBkZWx0YUFycmF5ID0gaGVscGVyLmdldFVSSXMoKTsKLQkJaWYgKGRlbHRhQXJyYXkgIT0gbnVsbCAmJiBkZWx0YUFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCXZhbGlkYXRlRGVsdGEoaGVscGVyLCByZXBvcnRlcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWxpZGF0ZUZ1bGwoaGVscGVyLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHZhbGlkYXRlIGNhbGwgaXMgZm9yIHRoZSBJU291cmNlVmFsaWRhdG9yIHBhcnRpYWwgZG9jdW1lbnQKLQkgKiB2YWxpZGF0aW9uIGFwcHJvYWNoCi0JICogCi0JICogQHBhcmFtIGRpcnR5UmVnaW9uCi0JICogQHBhcmFtIGhlbHBlcgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLklTb3VyY2VWYWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJUmVnaW9uIGRpcnR5UmVnaW9uLCBJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoaGVscGVyID09IG51bGwgfHwgZkRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKChyZXBvcnRlciAhPSBudWxsKSAmJiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSA9PSB0cnVlKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQl0cnkgewotCi0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJZG9jdW1lbnQgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQl9Ci0KLQkJCWlmIChkb2N1bWVudCA9PSBudWxsIHx8ICFoYXNIVE1MRmVhdHVyZShkb2N1bWVudCkpIHsKLQkJCQkvLyBoYW5kbGVkIGluIGZpbmFsbHkgY2xhdXNlCi0JCQkJLy8gbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJcmV0dXJuOyAvL2lnbm9yZQotCQkJfQotCQkJCi0JCQlJUGF0aCBmaWxlUGF0aCA9IG51bGw7Ci0JCQlJRmlsZSBmaWxlID0gbnVsbDsKLQotCQkJSVRleHRGaWxlQnVmZmVyIGZiID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEJ1ZmZlcihmRG9jdW1lbnQpOwotCQkJaWYgKGZiICE9IG51bGwpIHsKLQkJCQlmaWxlUGF0aCA9IGZiLmdldExvY2F0aW9uKCk7Ci0KLQkJCQlpZiAoZmlsZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCWZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpOwotCQkJCQlpZiAoIWZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCWZpbGUgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZmlsZVBhdGggPSBuZXcgUGF0aChtb2RlbC5nZXRJZCgpKTsKLQkJCX0KLQotCQkJLy8gdGhpcyB3aWxsIGJlIHRoZSB3cm9uZyByZWdpb24gaWYgaXQncyBUZXh0IChpbnN0ZWFkIG9mIEVsZW1lbnQpCi0JCQkvLyB3ZSBkb24ndCBrbm93IGhvdyB0byB2YWxpZGF0ZSBUZXh0Ci0JCQlJbmRleGVkUmVnaW9uIGlyID0gZ2V0Q292ZXJpbmdOb2RlKGRpcnR5UmVnaW9uKTsgLy8gIG1vZGVsLmdldEluZGV4ZWRSZWdpb24oZGlydHlSZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJaWYgKGlyIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCXdoaWxlIChpciAhPSBudWxsICYmIGlyIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCQkvLyBpdCdzIGFzc3VtZWQgdGhhdCB0aGlzIGdldHMgdGhlIEluZGV4ZWRSZWdpb24gdG8KLQkJCQkJLy8gdGhlIHJpZ2h0IG9mIHRoZSBlbmQgb2Zmc2V0Ci0JCQkJCWlyID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihpci5nZXRFbmRPZmZzZXQoKSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoaXIgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0KLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCQkJVmFsaWRhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChWYWxpZGF0aW9uQWRhcHRlcikgZmFjdG9yeS5hZGFwdCgoSU5vZGVOb3RpZmllcikgaXIpOwotCQkJCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQkJCWlmIChyZXBvcnRlciAhPSBudWxsKSB7Ci0JCQkJCUhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwID0gbnVsbDsKLQkJCQkJcmVwID0gZ2V0UmVwb3J0ZXIocmVwb3J0ZXIsIGZpbGUsIChJRE9NTW9kZWwpIG1vZGVsKTsKLQkJCQkJcmVwLmNsZWFyKCk7Ci0JCQkJCWFkYXB0ZXIuc2V0UmVwb3J0ZXIocmVwKTsKLQotCQkJCQlNZXNzYWdlIG1lc3MgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksIGZpbGVQYXRoLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpKTsKLQkJCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sodGhpcywgbWVzcyk7Ci0JCQkJfQotCQkJCWFkYXB0ZXIudmFsaWRhdGUoaXIpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEluZGV4ZWRSZWdpb24gZ2V0Q292ZXJpbmdOb2RlKElSZWdpb24gZGlydHlSZWdpb24pIHsKLQkJCi0JCUluZGV4ZWRSZWdpb24gbGFyZ2VzdFJlZ2lvbiA9IG51bGw7Ci0JCWlmKGZEb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSByZWdpb25zID0gKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoZGlydHlSZWdpb24uZ2V0T2Zmc2V0KCksIGRpcnR5UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCWxhcmdlc3RSZWdpb24gPSBnZXRMYXJnZXN0KHJlZ2lvbnMpOwotCQl9Ci0JCXJldHVybiBsYXJnZXN0UmVnaW9uOwotCX0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRMYXJnZXN0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSBzZFJlZ2lvbnMpIHsKLQkJCi0JCWlmKHNkUmVnaW9ucyA9PSBudWxsIHx8IHNkUmVnaW9ucy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQkgCi0JCUluZGV4ZWRSZWdpb24gY3VycmVudExhcmdlc3QgPSBnZXRDb3JyZXNwb25kaW5nTm9kZShzZFJlZ2lvbnNbMF0pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNkUmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkgICAgaWYoIXNkUmVnaW9uc1tpXS5pc0RlbGV0ZWQoKSkgewotICAgIAkJCUluZGV4ZWRSZWdpb24gY29ycmVzcG9uZGluZyA9IGdldENvcnJlc3BvbmRpbmdOb2RlKHNkUmVnaW9uc1tpXSk7Ci0gICAgCQkJCi0gICAgCQkJaWYoY3VycmVudExhcmdlc3QgaW5zdGFuY2VvZiBUZXh0KQotICAgIAkJCQljdXJyZW50TGFyZ2VzdCA9IGNvcnJlc3BvbmRpbmc7Ci0gICAgCQkJCi0gICAgICAgICAgICAgICAgaWYoY29ycmVzcG9uZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgCWlmKCEoY29ycmVzcG9uZGluZyBpbnN0YW5jZW9mIFRleHQpKSB7Ci0JICAgICAgICAJCQlpZiAoY29ycmVzcG9uZGluZy5nZXRTdGFydE9mZnNldCgpIDw9IGN1cnJlbnRMYXJnZXN0LmdldFN0YXJ0T2Zmc2V0KCkgIAotCSAgICAgICAgCQkJCQkJJiYgIGNvcnJlc3BvbmRpbmcuZ2V0RW5kT2Zmc2V0KCkgPj0gY3VycmVudExhcmdlc3QuZ2V0RW5kT2Zmc2V0KCkgKQotCSAgICAgICAgCQkJCWN1cnJlbnRMYXJnZXN0ID0gY29ycmVzcG9uZGluZzsKLSAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLQkJfQotCQlyZXR1cm4gY3VycmVudExhcmdlc3Q7Ci0JfQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldENvcnJlc3BvbmRpbmdOb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0gICAgICAgIEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc01vZGVsICE9IG51bGwpIAotICAgICAgICAgICAgICAgIGluZGV4ZWRSZWdpb24gPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzZFJlZ2lvbi5nZXRTdGFydCgpKTsgICAgCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc01vZGVsICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmRleGVkUmVnaW9uOwotICAgIH0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLklTb3VyY2VWYWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5JU291cmNlVmFsaWRhdG9yCi0JICovCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJZkRvY3VtZW50ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSFRNTFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSURPTU1vZGVsIG1vZGVsLCBJRmlsZSBmaWxlKSB7Ci0JCUlQcm9qZWN0IHByaiA9IG51bGw7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCXByaiA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCWlmICgocHJqID09IG51bGwpICYmIChtb2RlbCAhPSBudWxsKSkgewotCQkJVVJJUmVzb2x2ZXIgcmVzID0gbW9kZWwuZ2V0UmVzb2x2ZXIoKTsKLQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCXByaiA9IHJlcy5nZXRQcm9qZWN0KCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWwgV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIgPSBuZXcgV29ya2JlbmNoUmVwb3J0ZXIocHJqLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJcmV0dXJuIHZhbGlkYXRlKHJlcG9ydGVyLCBmaWxlLCBtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBIVE1MVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElET01Nb2RlbCBtb2RlbCkgewotCQlpZiAoZmlsZSA9PSBudWxsIHx8IG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJaWYgKCFoYXNIVE1MRmVhdHVyZShkb2N1bWVudCkpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaWdub3JlCi0KLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlWYWxpZGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKFZhbGlkYXRpb25BZGFwdGVyKSBmYWN0b3J5LmFkYXB0KGRvY3VtZW50KTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCi0JCUhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwID0gZ2V0UmVwb3J0ZXIocmVwb3J0ZXIsIGZpbGUsIG1vZGVsKTsKLQkJcmVwLmNsZWFyKCk7Ci0JCWFkYXB0ZXIuc2V0UmVwb3J0ZXIocmVwKTsKLQkJYWRhcHRlci52YWxpZGF0ZShkb2N1bWVudCk7Ci0JCXJldHVybiByZXAuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ29udGFpbmVyKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlciwgSUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZVtdIHJlc291cmNlQXJyYXkgPSBjb250YWluZXIubWVtYmVycyhmYWxzZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZUFycmF5W2ldOwotCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8IHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLnN1YnN0cmluZygxKSk7Ci0JCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQl2YWxpZGF0ZUZpbGUoaGVscGVyLCByZXBvcnRlciwgKElGaWxlKSByZXNvdXJjZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJCQl2YWxpZGF0ZUNvbnRhaW5lcihoZWxwZXIsIHJlcG9ydGVyLCAoSUNvbnRhaW5lcikgcmVzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRGVsdGEoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCVN0cmluZ1tdIGRlbHRhQXJyYXkgPSBoZWxwZXIuZ2V0VVJJcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBkZWx0YSA9IGRlbHRhQXJyYXlbaV07Ci0JCQlpZiAoZGVsdGEgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKHJlcG9ydGVyICE9IG51bGwpIHsKLQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksIGRlbHRhLnN1YnN0cmluZygxKSk7Ci0JCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sodGhpcywgbWVzc2FnZSk7Ci0JCQl9Ci0KLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKGRlbHRhKTsKLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8ICEocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkpCi0JCQkJY29udGludWU7Ci0JCQl2YWxpZGF0ZUZpbGUoaGVscGVyLCByZXBvcnRlciwgKElGaWxlKSByZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVGaWxlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSkgewotCQlpZiAoKHJlcG9ydGVyICE9IG51bGwpICYmIChyZXBvcnRlci5pc0NhbmNlbGxlZCgpID09IHRydWUpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAoIXNob3VsZFZhbGlkYXRlKGZpbGUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSURPTU1vZGVsIG1vZGVsID0gZ2V0TW9kZWwoZmlsZS5nZXRQcm9qZWN0KCksIGZpbGUpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0cnkgewotCQkJdmFsaWRhdGUocmVwb3J0ZXIsIGZpbGUsIG1vZGVsKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXJlbGVhc2VNb2RlbChtb2RlbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVGdWxsKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJU3RyaW5nW10gZmlsZURlbHRhID0gaGVscGVyLmdldFVSSXMoKTsKLQkJaWYgKGhlbHBlciBpbnN0YW5jZW9mIElXb3JrYmVuY2hDb250ZXh0KSB7Ci0JCQlJV29ya2JlbmNoQ29udGV4dCB3YkhlbHBlciA9IChJV29ya2JlbmNoQ29udGV4dCkgaGVscGVyOwotCQkJcHJvamVjdCA9IHdiSGVscGVyLmdldFByb2plY3QoKTsKLQkJfQotCQllbHNlIGlmKGZpbGVEZWx0YS5sZW5ndGggPiAwKXsKLQkJCS8vIHdvbid0IHdvcmsgZm9yIHByb2plY3QgdmFsaWRhdGlvbiAoYi9jIG5vdGhpbmcgaW4gZmlsZSBkZWx0YSkKLQkJCXByb2plY3QgPSBnZXRSZXNvdXJjZShmaWxlRGVsdGFbMF0pLmdldFByb2plY3QoKTsKLQkJfQotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl2YWxpZGF0ZUNvbnRhaW5lcihoZWxwZXIsIHJlcG9ydGVyLCBwcm9qZWN0KTsKLQl9Ci0KLQkvKgotCSAqIGFkZGVkIHRvIGdldCByaWQgb3IgZGVwZW5kZW5jeSBvbiBJV29ya2JlbmNoSGVscGVyCi0JICogCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShTdHJpbmcgZGVsdGEpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChkZWx0YSkpOwotCX0KLQotCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBFeGNlcHRpb24gY2F0Y2hpbmcgd2FzIHJlbW92ZWQsIHNlZQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIzNjAwCi0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJdmFsaWRhdGUoaGVscGVyLCByZXBvcnRlcik7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uI3NldEluaXRpYWxpemF0aW9uRGF0YShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXphdGlvbkRhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZywgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGRhdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZkFkZGl0aW9uYWxDb250ZW50VHlwZXNJRHMgPSBuZXcgU3RyaW5nWzBdOwotCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQlpZiAoZGF0YSBpbnN0YW5jZW9mIFN0cmluZyAmJiBkYXRhLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZkFkZGl0aW9uYWxDb250ZW50VHlwZXNJRHMgPSBTdHJpbmdVdGlscy51bnBhY2soZGF0YS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvblJlc3VsdCgpOwotCQlJUmVwb3J0ZXIgcmVwb3J0ZXIgPSByZXN1bHQuZ2V0UmVwb3J0ZXIobW9uaXRvcik7Ci0JCXZhbGlkYXRlRmlsZShudWxsLCByZXBvcnRlciwgKElGaWxlKSByZXNvdXJjZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0xvY2FsaXplZE1lc3NhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0xvY2FsaXplZE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUzODcyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9Mb2NhbGl6ZWRNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci0KLS8qKgotICogY29waWVkIGZyb20gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Mb2NhbGl6ZWRNZXNzYWdlCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgcHJvdmlkZWQgZm9yIHZhbGlkYXRvcnMgd2hpY2ggcnVuIG9ubHkgaW4gRWNsaXBzZSBhbmQgd2hvc2UgbWVzc2FnZXMsIGJlY2F1c2UgdGhleQotICogY29tZSBmcm9tIGFub3RoZXIgdG9vbCwgYXJlIGFscmVhZHkgbG9jYWxpemVkLiBMb2NhbGl6ZWRNZXNzYWdlIGNhbm5vdCBiZSB1c2VkIGJ5IGFueSB2YWxpZGF0b3IKLSAqIHdoaWNoIG5lZWRzIHRvIHJ1biBpbiBib3RoIFdlYlNwaGVyZSBhbmQgRWNsaXBzZS4KLSAqLwotcHVibGljIGNsYXNzIExvY2FsaXplZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKLQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZSA9IG51bGw7Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCkgewotCQl0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIElSZXNvdXJjZSB0YXJnZXRPYmplY3QpIHsKLQkJdGhpcyhzZXZlcml0eSwgbWVzc2FnZVRleHQsIChPYmplY3QpIHRhcmdldE9iamVjdCk7Ci0JfQotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJc3VwZXIobnVsbCwgc2V2ZXJpdHksIG51bGwpOwotCQlzZXRMb2NhbGl6ZWRNZXNzYWdlKG1lc3NhZ2VUZXh0KTsKLQkJc2V0VGFyZ2V0T2JqZWN0KHRhcmdldE9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9jYWxpemVkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlfbWVzc2FnZSA9IG1lc3NhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkgewotCQlyZXR1cm4gX21lc3NhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChDbGFzc0xvYWRlciBjbCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCwgQ2xhc3NMb2FkZXIgY2wpIHsKLQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9UYXNrTGlzdEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vVGFza0xpc3RIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFlZGUyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9UYXNrTGlzdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogCi0gKiBDbGFzcyB0byBoZWxwIHRoaXMgUHJvYmxlbSdzIGxpc3QuCi0gKiAKLSAqLwotY2xhc3MgVGFza0xpc3RIZWxwZXIgewotCXByaXZhdGUgc3RhdGljIFRhc2tMaXN0SGVscGVyIF90YXNrTGlzdEhlbHBlciA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIFRhc2tMaXN0SGVscGVyIGdldFRhc2tMaXN0KCkgewotCQlpZiAoX3Rhc2tMaXN0SGVscGVyID09IG51bGwpIHsKLQkJCV90YXNrTGlzdEhlbHBlciA9IG5ldyBUYXNrTGlzdEhlbHBlcigpOwotCQl9Ci0JCXJldHVybiBfdGFza0xpc3RIZWxwZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWRkcyBhIG1lc3NhZ2UgdG8gYSByZXNvdXJjZSBpbiB0aGUgdGFzayBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRhc2soU3RyaW5nIHBsdWdpbklkLCBJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nIG1lc3NhZ2UsIGludCBtYXJrZXJUeXBlLCBTdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSwgU3RyaW5nIGdyb3VwTmFtZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXNrTGlzdFV0aWxpdHkuYWRkVGFzayhwbHVnaW5JZCwgcmVzb3VyY2UsIGxvY2F0aW9uLCBtZXNzYWdlSWQsIG1lc3NhZ2UsIG1hcmtlclR5cGUsIHRhcmdldE9iamVjdE5hbWUsIGdyb3VwTmFtZSwgb2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgYWxsIG1lc3NhZ2VzIGZyb20gYSByZXNvdXJjZSBpbiB0aGUgdGFzayBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbFRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG93bmVyLCBTdHJpbmcgb2JqZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXNrTGlzdFV0aWxpdHkucmVtb3ZlQWxsVGFza3MocmVzb3VyY2UsIG93bmVyLCBvYmplY3ROYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vVGFza0xpc3RVdGlsaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9UYXNrTGlzdFV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlMGE5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9UYXNrTGlzdFV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbXVzdCBiZSBjYWxsZWQgb25seSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKiAKLSAqIFRoaXMgc2luZ2xldG9uIGludGVyYWN0cyB3aXRoIHRoZSBlY2xpcHNlIHdvcmtiZW5jaCdzIFRhc2sgbGlzdC4KLSAqIFRhc2tMaXN0VXRpbGl0eSBhZGRzIGFuZCByZW1vdmVzIHRhc2tzIGZyb20gdGhlIGxpc3QuCi0gKiAKLSAqIFRoaXMgY2xhc3MgbXVzdCBub3QgYmUgY2FsbGVkIG91dHNpZGUgb2YgYW4gSVdvcmtzcGFjZVJ1bm5hYmxlIG9yCi0gKiBJUnVubmFibGVXaXRoUHJvZ3Jlc3MuIE1hbnkgcmVzb3VyY2UgZGVsdGFzIGNhbiBiZSBnZW5lcmF0ZWQgYnkgdGhlIG1ldGhvZHMKLSAqIGluIHRoaXMgY2xhc3MuCi0gKiAKLSAqIFRoaXMgY2FtZSBmcm9tIFRhc2tMaXN0VXRpbGl0eQotICovCi1wdWJsaWMgY2xhc3MgVGFza0xpc3RVdGlsaXR5IHsKLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IEhUTUxVSVBsdWdpbi5JRDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVIgPSBQTFVHSU5fSUQgKyAiLnByb2JsZW1tYXJrZXIiOyAvLyROT04tTkxTLTEkIC8vIFRoZSBleHRlbnNpb24gd2hpY2ggaXMgdXNlZCB0byBhZGQgdmFsaWRhdGlvbiBtYXJrZXJzIHRvIHRoZSB0YXNrIGxpc3QKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfT1dORVIgPSAib3duZXIiOyAvLyROT04tTkxTLTEkIC8vIFRoZSBJVmFsaWRhdG9yIHdobyBvd25zIHRoZSBJTWFya2VyIG9uIHRoZSB0YXNrIGxpc3QKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfU0VWRVJJVFkgPSAidmFsaWRhdGlvblNldmVyaXR5IjsgLy8kTk9OLU5MUy0xJCAvLyBvbmUgb2YgdGhlIElNZXNzYWdlIHZhbHVlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUl9UQVJHRVRPQkpFQ1QgPSAidGFyZ2V0T2JqZWN0IjsgLy8kTk9OLU5MUy0xJCAvLyBXaGVuIG1vcmUgdGhhbiBvbmUgdGFyZ2V0IG9iamVjdCByZXNvbHZlcyB0byB0aGUgc2FtZSBJUmVzb3VyY2UsIHRoaXMgZmllbGQgaWRlbnRpZmllcyB3aGljaCB0YXJnZXRPYmplY3Qgb3ducyBhIHBhcnRpY3VsYXIgbWVzc2FnZS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfR1JPVVAgPSAiZ3JvdXBOYW1lIjsgLy8kTk9OLU5MUy0xJCAvLyBGb3IgaW5jcmVtZW50YWwgdmFsaWRhdGlvbiwgdGhpcyBmaWVsZCBhc3NvY2lhdGVzIGEgbWVzc2FnZSB3aXRoIGEgZ3JvdXAsIHNvIHRoYXQgYSBzdWJzZXQgb2YgbWVzc2FnZXMgbWF5IGJlIHJlbW92ZWQgZnJvbSBhIGZpbGUuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUFSS0VSX01FU1NBR0VJRCA9ICJtZXNzYWdlSWQiOyAvLyROT04tTkxTLTEkIC8vIFBlcnNpc3QgdGhlIG1lc3NhZ2UgaWQgb2YgdGhlIG1lc3NhZ2UsIG5vdCBqdXN0IHRoZSB0cmFuc2xhdGVkIHRleHQuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFUFRIX0lORklOSVRFID0gSVJlc291cmNlLkRFUFRIX0lORklOSVRFOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVBUSF9aRVJPID0gSVJlc291cmNlLkRFUFRIX1pFUk87Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSU1hcmtlcltdIE5PX01BUktFUlMgPSBuZXcgSU1hcmtlclswXTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFkZHMgYSBtZXNzYWdlIHRvIGEgcmVzb3VyY2UgaW4gdGhlIHRhc2sgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNYXJrZXIgYWRkVGFzayhTdHJpbmcgcGx1Z2luSWQsIElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmcgbWVzc2FnZSwgaW50IG1hcmtlclR5cGUsIFN0cmluZyB0YXJnZXRPYmplY3ROYW1lLCBTdHJpbmcgZ3JvdXBOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICgobWVzc2FnZSA9PSBudWxsKSB8fCAocmVzb3VyY2UgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gZ2V0U2V2ZXJpdHkobWFya2VyVHlwZSk7Ci0KLQkJLy8gQWxsb3cgZHVwbGljYXRlIGVudHJpZXMgaW4gdGhlIHRhc2sgbGlzdC4KLQkJLy8gUHJpb3IgdG8gYSBmdWxsIHZhbGlkYXRpb24sIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayB3aWxsIHJlbW92ZQotCQkvLyBhbGwgbWVzc2FnZXMgb3duZWQKLQkJLy8gYnkgYSB2YWxpZGF0b3IgYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLgotCQkvLyBQcmlvciB0byBhbiBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgd2lsbAotCQkvLyByZW1vdmUgYWxsIG1lc3NhZ2VzLAotCQkvLyBvbiBlYWNoIG9mIHRoZSBjaGFuZ2VkIHJlc291cmNlcywgb3duZWQgYnkgYSB2YWxpZGF0b3IgYmVmb3JlIGl0IGlzCi0JCS8vIGludm9rZWQuCi0JCS8vIAotCQkvLyBJdCBpcyB1cCB0byB0aGUgdmFsaWRhdG9yIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG5vdCBhZGRpbmcgdGhlCi0JCS8vIHNhbWUgbWVzc2FnZQotCQkvLyBpbiBtb3JlIHRoYW4gb25lIHBsYWNlLCBhbmQgYWxzbyB0byBjbGVhciBvdXQgYW55IG9sZCBtZXNzYWdlcwotCQkvLyB3aGljaCBhcmUgbm90IGNsZWFyZWQKLQkJLy8gYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotCQlJTWFya2VyIGl0ZW0gPSByZXNvdXJjZS5jcmVhdGVNYXJrZXIoVkFMSURBVElPTl9NQVJLRVIpOyAvLyBhZGQgYQotCQkJCQkJCQkJCQkJCQkJCQkvLyB2YWxpZGF0aW9uCi0JCQkJCQkJCQkJCQkJCQkJCS8vIG1hcmtlcgotCi0JCS8vIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCByZXBsYWNlIHRoZSBtdWx0aXBsZSBzZXRBdHRyaWJ1dGUKLQkJLy8gY2FsbHMgYWJvdmUgd2l0aCBhIHNpbmdsZSBzZXRBdHRyaWJ1dGVzIGNhbGwuCi0JCWJvb2xlYW4gb2Zmc2V0U2V0ID0gKChvZmZzZXQgIT0gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUKSAmJiAobGVuZ3RoICE9IElNZXNzYWdlLk9GRlNFVF9VTlNFVCkpOwotCQlpbnQgc2l6ZSA9IChvZmZzZXRTZXQpID8gMTAgOiA4OyAvLyBhZGQgQ0hBUl9TVEFSVCwgQ0hBUl9FTkQgb25seQotCQkJCQkJCQkJCQkvLyBpZiB0aGUgb2Zmc2V0IGlzIHNldC4gSWYgdGhlCi0JCQkJCQkJCQkJCS8vIG9mZnNldCBpcyBzZXQsIGl0IHRha2VzCi0JCQkJCQkJCQkJCS8vIHByZWNlbmRlbmNlIG92ZXIgdGhlIGxpbmUKLQkJCQkJCQkJCQkJLy8gbnVtYmVyLiAoZWNsaXBzZSdzIHJ1bGUsIG5vdAotCQkJCQkJCQkJCQkvLyBtaW5lLikKLQkJU3RyaW5nW10gYXR0cmliTmFtZXMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQlPYmplY3RbXSBhdHRyaWJWYWx1ZXMgPSBuZXcgT2JqZWN0W3NpemVdOwotCi0JCS8vIFZlcnkgZmlyc3QgdGhpbmcsIGFkZCB0aGUgb3duZXIuIFRoYXQgd2F5LCBpZiB0aGUgY29kZSBkaWVzCi0JCS8vIGJlZm9yZSB0aGluZ3MgYXJlIHBlcnNpc3RlZCwgaG9wZWZ1bGx5IHRoaXMgbWFya2VyIHdpbGwgYmUKLQkJLy8gcGVyc2lzdGVkLgotCQkvLyBIb3BlZnVsbHksIGVjbGlwc2UgV0lMTCBwZXJzaXN0IHRoaXMgZmllbGQsIGFzIHJlcXVlc3RlZC4KLQkJYXR0cmliTmFtZXNbMF0gPSBWQUxJREFUSU9OX01BUktFUl9PV05FUjsKLQkJYXR0cmliVmFsdWVzWzBdID0gcGx1Z2luSWQ7Ci0JCWF0dHJpYk5hbWVzWzFdID0gVkFMSURBVElPTl9NQVJLRVJfU0VWRVJJVFk7IC8vIHRoaXMgdmFsaWRhdGlvbgotCQkJCQkJCQkJCQkJCQkvLyBzZXZlcml0eSBpcyBzdG9yZWQsCi0JCQkJCQkJCQkJCQkJCS8vIGluIGFkZGl0aW9uIHRvIHRoZQotCQkJCQkJCQkJCQkJCQkvLyBtYXJrZXIgc2V2ZXJpdHksIHRvCi0JCQkJCQkJCQkJCQkJCS8vIGVuYWJsZSBtb3JlIHRoYW4KLQkJCQkJCQkJCQkJCQkJLy8gb25lIHNldmVyaXR5IG9mCi0JCQkJCQkJCQkJCQkJCS8vIG1lc3NhZ2UgdG8gYmUKLQkJCQkJCQkJCQkJCQkJLy8gZGlzcGxheWVkLiBlLmcuCi0JCQkJCQkJCQkJCQkJCS8vIEVSUk9SIHwgV0FSTklORwotCQkJCQkJCQkJCQkJCQkvLyAodXNpbmcgYmluYXJ5IE9SKS4KLQkJCQkJCQkJCQkJCQkJLy8gVGhlIElNYXJrZXIKLQkJCQkJCQkJCQkJCQkJLy8gY29uc3RhbnRzIGFyZQotCQkJCQkJCQkJCQkJCQkvLyByZWd1bGFyIGRlY2ltYWwKLQkJCQkJCQkJCQkJCQkJLy8gY29uc3RhbnRzLgotCQlhdHRyaWJWYWx1ZXNbMV0gPSBuZXcgSW50ZWdlcihtYXJrZXJUeXBlKTsKLQkJYXR0cmliTmFtZXNbMl0gPSBWQUxJREFUSU9OX01BUktFUl9UQVJHRVRPQkpFQ1Q7IC8vIHRvIGRpc3Rpbmd1aXNoCi0JCQkJCQkJCQkJCQkJCQkvLyBiZXR3ZWVuCi0JCQkJCQkJCQkJCQkJCQkvLyBtZXNzYWdlcyB3aGljaAotCQkJCQkJCQkJCQkJCQkJLy8gYXJlIHJlZ2lzdGVyZWQKLQkJCQkJCQkJCQkJCQkJCS8vIG9uIGFuCi0JCQkJCQkJCQkJCQkJCQkvLyBJUmVzb3VyY2UsIGJ1dAotCQkJCQkJCQkJCQkJCQkJLy8gYWdhaW5zdAotCQkJCQkJCQkJCQkJCQkJLy8gZGlmZmVyZW50Ci0JCQkJCQkJCQkJCQkJCQkvLyB0YXJnZXQgb2JqZWN0cwotCQlhdHRyaWJWYWx1ZXNbMl0gPSAoKHRhcmdldE9iamVjdE5hbWUgPT0gbnVsbCkgPyAiIiA6IHRhcmdldE9iamVjdE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCWF0dHJpYk5hbWVzWzNdID0gVkFMSURBVElPTl9NQVJLRVJfR1JPVVA7Ci0JCWF0dHJpYlZhbHVlc1szXSA9ICgoZ3JvdXBOYW1lID09IG51bGwpID8gIiIgOiBncm91cE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCWF0dHJpYk5hbWVzWzRdID0gSU1hcmtlci5NRVNTQUdFOwotCQlhdHRyaWJWYWx1ZXNbNF0gPSBtZXNzYWdlOwotCQlhdHRyaWJOYW1lc1s1XSA9IFZBTElEQVRJT05fTUFSS0VSX01FU1NBR0VJRDsKLQkJYXR0cmliVmFsdWVzWzVdID0gbWVzc2FnZUlkOwotCi0JCWF0dHJpYk5hbWVzWzZdID0gSU1hcmtlci5TRVZFUklUWTsgLy8gSU1hcmtlci5TRVZFUklUWV9FUlJPUiwKLQkJCQkJCQkJCQkJLy8gSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLAotCQkJCQkJCQkJCQkvLyBJTWFya2VyLlNFVkVSSVRZX0lORk8KLQkJYXR0cmliVmFsdWVzWzZdID0gbmV3IEludGVnZXIoc2V2ZXJpdHkpOwotCQl0cnkgewotCQkJLy8gSWYgdGhlIGxvY2F0aW9uIGlzIGEgbGluZSBudW1iZXIsIHN0b3JlIGl0IGFzIGEgbGluZSBudW1iZXIKLQkJCUludGVnZXIgbGluZU51bWJlciA9IEludGVnZXIudmFsdWVPZihsb2NhdGlvbik7Ci0JCQlhdHRyaWJOYW1lc1s3XSA9IElNYXJrZXIuTElORV9OVU1CRVI7Ci0JCQlhdHRyaWJWYWx1ZXNbN10gPSBsaW5lTnVtYmVyOwotCQl9Ci0JCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBPdGhlcndpc2UsIHN0b3JlIGl0IGFzIGEgdGV4dCBsb2NhdGlvbgotCQkJYXR0cmliTmFtZXNbN10gPSBJTWFya2VyLkxPQ0FUSU9OOwotCQkJYXR0cmliVmFsdWVzWzddID0gbG9jYXRpb247Ci0JCX0KLQotCQlpZiAob2Zmc2V0U2V0KSB7Ci0JCQlhdHRyaWJOYW1lc1s4XSA9IElNYXJrZXIuQ0hBUl9TVEFSVDsKLQkJCWF0dHJpYlZhbHVlc1s4XSA9IG5ldyBJbnRlZ2VyKG9mZnNldCk7Ci0JCQlhdHRyaWJOYW1lc1s5XSA9IElNYXJrZXIuQ0hBUl9FTkQ7Ci0JCQlhdHRyaWJWYWx1ZXNbOV0gPSBuZXcgSW50ZWdlcihvZmZzZXQgKyBsZW5ndGgpOwotCQl9Ci0KLQkJaXRlbS5zZXRBdHRyaWJ1dGVzKGF0dHJpYk5hbWVzLCBhdHRyaWJWYWx1ZXMpOwotCi0JCXJldHVybiBpdGVtOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIG9uZSBvZiB0aGUgU2V2ZXJpdHlFbnVtIHNldmVyaXRpZXMsIHJldHVybiB0aGUgSU1hcmtlciBzZXZlcml0eQotCSAqIGludCB0aGF0IGlzIGl0cyBlcXVpdmFsZW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRTZXZlcml0eShpbnQgc2V2ZXJpdHlFbnVtVmFsdWUpIHsKLQkJc3dpdGNoIChzZXZlcml0eUVudW1WYWx1ZSkgewotCQkJY2FzZSAoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSkgOiB7Ci0JCQkJcmV0dXJuIElNYXJrZXIuU0VWRVJJVFlfRVJST1I7Ci0JCQl9Ci0KLQkJCWNhc2UgKElNZXNzYWdlLkxPV19TRVZFUklUWSkgOiB7Ci0JCQkJcmV0dXJuIElNYXJrZXIuU0VWRVJJVFlfSU5GTzsKLQkJCX0KLQotCQkJY2FzZSAoSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZKSA6IHsKLQkJCQlyZXR1cm4gSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOwotCQkJfQotCi0JCQljYXNlIChJTWVzc2FnZS5BTExfTUVTU0FHRVMpIDoKLQkJCWNhc2UgKElNZXNzYWdlLkVSUk9SX0FORF9XQVJOSU5HKSA6Ci0JCQlkZWZhdWx0IDogewotCQkJCS8vIGFzc3VtZSBpdCdzIGEgd2FybmluZy4KLQkJCQlyZXR1cm4gSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldERlcHRoKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJcmV0dXJuIERFUFRIX0lORklOSVRFOyAvLyBERVBUSF9JTkZJTklURSBtZWFucyBnZXQgdGhpcyBwcm9qZWN0J3MKLQkJCQkJCQkJCS8vIG1hcmtlcnMsIGFuZCB0aGUgbWFya2VycyBiZWxvbmdpbmcgdG8KLQkJCQkJCQkJCS8vIHRoZSBwcm9qZWN0J3MgY2hpbGRyZW4uCi0JCX0KLQkJZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCkgewotCQkJLy8gTmVlZGVkIGZvciB0aGUgVmFsaWRhdGlvbk1pZ3JhdG9yIHdoZW4gaXQgY2hlY2tzIGZvciBvcnBoYW4KLQkJCS8vIHRhc2tzLgotCQkJcmV0dXJuIERFUFRIX0lORklOSVRFOyAvLyBERVBUSF9JTkZJTklURSBtZWFucyBnZXQgYWxsIG9mIHRoZQotCQkJCQkJCQkJLy8gbWFya2VycyBpbiB0aGUgd29ya3NwYWNlCi0JCX0KLQotCQlyZXR1cm4gREVQVEhfWkVSTzsgLy8gREVQVEhfWkVSTyBtZWFucyBqdXN0IHRoaXMgcmVzb3VyY2UsIG5vdCBpdHMKLQkJCQkJCQkvLyBjaGlsZHJlbgotCX0KLQotCXByaXZhdGUgc3RhdGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBpbnQgc2V2ZXJpdHksIGludCBkZXB0aCkgewotCQlJTWFya2VyW10gdGVtcE1hcmtlcnMgPSBudWxsOwotCQlpbnQgdmFsaWRDb3VudCA9IDA7Ci0JCXRyeSB7Ci0JCQlJTWFya2VyW10gYWxsTWFya2VycyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWFsbE1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhWQUxJREFUSU9OX01BUktFUiwgZmFsc2UsIGRlcHRoKTsgLy8gZmFsc2UKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG1lYW5zCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBvbmx5Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjb25zaWRlcgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gUFJPQkxFTV9NQVJLRVIsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBub3QKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHZhcmlhbnRzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBvZgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gUFJPQkxFTV9NQVJLRVIuCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBTaW5jZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYWRkVGFzawotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gb25seQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYWRkcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gUFJPQkxFTV9NQVJLRVIsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB3ZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZG9uJ3QKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG5lZWQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRvCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjb25zaWRlcgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXRzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzdWJ0eXBlcy4KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCS8vIExvZ2dlciBsb2dnZXIgPQotCQkJCS8vIFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJLy8gaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJLy8gTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJLy8gZW50cnkuc2V0U291cmNlSUQoIlRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlLAotCQkJCS8vIGludCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIGVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCS8vIGxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkvLyB9Ci0JCQkJcmV0dXJuIE5PX01BUktFUlM7Ci0JCQl9Ci0KLQkJCS8vIE5vdyBmaWx0ZXIgaW4gdGhlIG1hcmtlcnMsIGJhc2VkIG9uIHNldmVyaXR5IHR5cGUuCi0JCQlpZiAoYWxsTWFya2Vycy5sZW5ndGggIT0gMCkgewotCQkJCXRlbXBNYXJrZXJzID0gbmV3IElNYXJrZXJbYWxsTWFya2Vycy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsTWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQlJTWFya2VyIG1hcmtlciA9IGFsbE1hcmtlcnNbaV07Ci0JCQkJCUludGVnZXIgZmlsdGVyU2V2ZXJpdHkgPSAoSW50ZWdlcikgbWFya2VyLmdldEF0dHJpYnV0ZShWQUxJREFUSU9OX01BUktFUl9TRVZFUklUWSk7Ci0JCQkJCWlmIChmaWx0ZXJTZXZlcml0eSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBvZGQuLi5tYXJrZXIgd2Fzbid0IGNyZWF0ZWQgY29ycmVjdGx5LiBIb3cgY291bGQKLQkJCQkJCS8vIHRoaXMgaGFwcGVuPwotCQkJCQkJLy8gRGVmYXVsdCB0byB0aGUgY3VycmVudCBzZXZlcml0eSBhbmQgYWRkIGl0IHRvIHRoZQotCQkJCQkJLy8gbGlzdC4KLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBnZXRTZXZlcml0eShzZXZlcml0eSkpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCQkJLy8gTG9nZ2VyIGxvZ2dlciA9Ci0JCQkJCQkJLy8gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJCQkvLyBpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCQkvLyBMb2dFbnRyeSBlbnRyeSA9Ci0JCQkJCQkJLy8gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQkJCS8vIGVudHJ5LnNldFNvdXJjZUlEKCJUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKGludCwKLQkJCQkJCQkvLyBJUmVzb3VyY2UsIGludCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIGVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQkJCS8vIGxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJCQkvLyB9Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJCQkJCS8vIExvZ2dlciBsb2dnZXIgPQotCQkJCQkJCS8vIFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCQkJLy8gaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQkJLy8gTG9nRW50cnkgZW50cnkgPQotCQkJCQkJCS8vIFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJCQkvLyBlbnRyeS5zZXRTb3VyY2VJRCgiVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhpbnQsCi0JCQkJCQkJLy8gSVJlc291cmNlLCBpbnQpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkvLyBlbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJCQkvLyBsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJCQkJLy8gfQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKChzZXZlcml0eSAmIGZpbHRlclNldmVyaXR5LmludFZhbHVlKCkpID09IDApIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCXRlbXBNYXJrZXJzW3ZhbGlkQ291bnQrK10gPSBtYXJrZXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJLy8gTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkvLyBpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCS8vIExvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJLy8gZW50cnkuc2V0U291cmNlSUQoIlRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MoaW50LAotCQkJLy8gSVJlc291cmNlLCBpbnQpIik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIGVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJLy8gbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJLy8gfQotCQl9Ci0KLQkJaWYgKHZhbGlkQ291bnQgPT0gMCkgewotCQkJcmV0dXJuIE5PX01BUktFUlM7Ci0JCX0KLQotCQlJTWFya2VyW10gdmFsaWRNYXJrZXJzID0gbmV3IElNYXJrZXJbdmFsaWRDb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcE1hcmtlcnMsIDAsIHZhbGlkTWFya2VycywgMCwgdmFsaWRDb3VudCk7Ci0JCXJldHVybiB2YWxpZE1hcmtlcnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIG1lc3NhZ2VPd25lcnMsIGludCBkZXB0aCkgewotCQlJTWFya2VyW10gbWFya2VycyA9IGdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgSU1lc3NhZ2UuQUxMX01FU1NBR0VTLCBkZXB0aCk7Ci0JCWlmIChtYXJrZXJzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gTk9fTUFSS0VSUzsKLQkJfQotCi0JCUlNYXJrZXJbXSB0ZW1wID0gbmV3IElNYXJrZXJbbWFya2Vycy5sZW5ndGhdOwotCQlpbnQgdmFsaWRDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCi0JCQl0cnkgewotCQkJCU9iamVjdCBvd25lciA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoVkFMSURBVElPTl9NQVJLRVJfT1dORVIpOwotCQkJCWlmICgob3duZXIgPT0gbnVsbCkgfHwgIShvd25lciBpbnN0YW5jZW9mIFN0cmluZykpIHsKLQkJCQkJLy8gVGhlIFZhbGlkYXRpb25NaWdyYXRvciB3aWxsIHJlbW92ZSBhbnkgInVub3duZWQiCi0JCQkJCS8vIHZhbGlkYXRpb24gbWFya2Vycy4KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZXNzYWdlT3duZXJzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlT3duZXIgPSBtZXNzYWdlT3duZXJzW2pdOwotCQkJCQlpZiAoKChTdHJpbmcpIG93bmVyKS5lcXVhbHMobWVzc2FnZU93bmVyKSkgewotCQkJCQkJdGVtcFt2YWxpZENvdW50KytdID0gbWFya2VyOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQkvLyBMb2dnZXIgbG9nZ2VyID0KLQkJCQkvLyBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCS8vIGlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCS8vIExvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCS8vIGVudHJ5LnNldFNvdXJjZUlEKCJUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsCi0JCQkJLy8gU3RyaW5nW10pIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBlbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkvLyBsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJLy8gfQotCQkJCXJldHVybiBOT19NQVJLRVJTOwotCQkJfQotCQl9Ci0KLQkJSU1hcmtlcltdIHJlc3VsdCA9IG5ldyBJTWFya2VyW3ZhbGlkQ291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIHJlc3VsdCwgMCwgdmFsaWRDb3VudCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0cmlldmVzIGFsbCB2YWxpZGF0aW9uIHRhc2tzIGZyb20gdGhlIHJlc291cmNlLiBJZiBkZXB0aAotCSAqIGlzIElORklOSVRFLCBjaGlsZCB0YXNrcyBhcmUgcmV0dXJuZWQgYXMgd2VsbC4gT25seSB0aGUgdGFza3Mgd2hpY2ggYXJlCi0JICogb3duZWQgYnkgdGhlIHNwZWNpZmllZCBtZXNzYWdlT3duZXIsIGFuZCBhcHBseSB0byB0aGUgbmFtZWQgSU1lc3NhZ2UncwotCSAqIHRhcmdldCBvYmplY3QgKG9iamVjdE5hbWUpIHdpbGwgYmUgcmV0dXJuZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIG1lc3NhZ2VPd25lciwgU3RyaW5nIG9iamVjdE5hbWUsIFN0cmluZyBncm91cE5hbWUsIGludCBkZXB0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoKG1lc3NhZ2VPd25lciA9PSBudWxsKSB8fCAocmVzb3VyY2UgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBOT19NQVJLRVJTOwotCQl9Ci0KLQkJaW50IHZhbGlkQ291bnQgPSAwOwotCQlJTWFya2VyW10gdmFsaWRMaXN0ID0gbnVsbDsKLQkJSU1hcmtlcltdIG1hcmtlcnMgPSBnZXRWYWxpZGF0aW9uVGFza3MocmVzb3VyY2UsIG1lc3NhZ2VPd25lciwgZGVwdGgpOwotCQlpZiAobWFya2VycyAhPSBudWxsKSB7Ci0JCQl2YWxpZExpc3QgPSBuZXcgSU1hcmtlclttYXJrZXJzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0KLQkJCQkvLyBJZiBtb3JlIHRoYW4gb25lIHRhcmdldCBvYmplY3QgcmVzb2x2ZXMgdG8gdGhlIHNhbWUKLQkJCQkvLyByZXNvdXJjZSwgcmVtb3Zpbmcgb25lIHRhcmdldCdzCi0JCQkJLy8gbWVzc2FnZXMgc2hvdWxkIG5vdCByZW1vdmUgdGhlIG90aGVyIHRhcmdldCBvYmplY3QncwotCQkJCS8vIG1lc3NhZ2VzLgotCQkJCWlmIChvYmplY3ROYW1lICE9IG51bGwpIHsKLQkJCQkJT2JqZWN0IHRhcmdldE9iamVjdCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoVkFMSURBVElPTl9NQVJLRVJfVEFSR0VUT0JKRUNUKTsKLQkJCQkJaWYgKCh0YXJnZXRPYmplY3QgPT0gbnVsbCkgfHwgISh0YXJnZXRPYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHx8ICEoKChTdHJpbmcpIHRhcmdldE9iamVjdCkuZXF1YWxzKG9iamVjdE5hbWUpKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoZ3JvdXBOYW1lICE9IG51bGwpIHsKLQkJCQkJT2JqZWN0IGdyb3VwID0gbWFya2VyLmdldEF0dHJpYnV0ZShWQUxJREFUSU9OX01BUktFUl9HUk9VUCk7Ci0JCQkJCWlmICgoZ3JvdXAgPT0gbnVsbCkgfHwgIShncm91cCBpbnN0YW5jZW9mIFN0cmluZykgfHwgISgoKFN0cmluZykgZ3JvdXApLmVxdWFscyhncm91cE5hbWUpKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQl2YWxpZExpc3RbdmFsaWRDb3VudCsrXSA9IG1hcmtlcjsKLQkJCX0KLQkJfQotCi0JCWlmICh2YWxpZENvdW50ID09IDApIHsKLQkJCXJldHVybiBOT19NQVJLRVJTOwotCQl9Ci0KLQkJSU1hcmtlcltdIHJlc3VsdCA9IG5ldyBJTWFya2VyW3ZhbGlkQ291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHZhbGlkTGlzdCwgMCwgcmVzdWx0LCAwLCB2YWxpZENvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGFsbCBtZXNzYWdlcyBmcm9tIGEgcmVzb3VyY2UgaW4gdGhlIHRhc2sgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgb3duZXIsIFN0cmluZyBvYmplY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCBuZXcgU3RyaW5nW117b3duZXJ9LCBvYmplY3ROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBvd25lcnMsIFN0cmluZyBvYmplY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCBvd25lcnMsIG9iamVjdE5hbWUsIGdldERlcHRoKHJlc291cmNlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gb3duZXJzLCBTdHJpbmcgb2JqZWN0TmFtZSwgaW50IGRlcHRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZVRhc2tTdWJzZXQocmVzb3VyY2UsIG93bmVycywgb2JqZWN0TmFtZSwgbnVsbCwgZGVwdGgpOyAvLyBudWxsCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBtZWFucwotCQkJCQkJCQkJCQkJCQkJCQkJLy8gbm8KLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGdyb3VwCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBuYW1lCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmVtb3ZlcyBhIHN1YnNldCBvZiB0YXNrcyBmcm9tIHRoZSBwcm9qZWN0LCBpbmNsdWRpbmcgY2hpbGQKLQkgKiB0YXNrcy4gRXZlcnkgdGFzayB3aGljaCBiZWxvbmdzIHRvIHRoZSBncm91cCwgaWRlbnRpZmllZCBieSBncm91cE5hbWUsCi0JICogd2lsbCBiZSByZW1vdmVkLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCByZW1vdmVUYXNrU3Vic2V0KElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gb3duZXJzLCBTdHJpbmcgb2JqZWN0TmFtZSwgU3RyaW5nIGdyb3VwTmFtZSwgaW50IGRlcHRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICgob3duZXJzID09IG51bGwpIHx8IChyZXNvdXJjZSA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSU1hcmtlcltdIGFsbFRhc2tzID0gZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBvd25lcnMsIG9iamVjdE5hbWUsIGdyb3VwTmFtZSwgZGVwdGgpOwotCQlpZiAoYWxsVGFza3MubGVuZ3RoID4gMCkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmRlbGV0ZU1hcmtlcnMoYWxsVGFza3MpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzg0MDlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklDb250ZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLk11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXh0LklDU1NQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0LkhUTUxGb3JtYXRQcm9jZXNzb3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5hdXRvZWRpdC5BdXRvRWRpdFN0cmF0ZWd5Rm9yVGFiczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkhUTUxTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQ29uZmlndXJhdGlvbiBmb3IgYSBzb3VyY2Ugdmlld2VyIHdoaWNoIHNob3dzIEhUTUwgY29udGVudC4KLSAqIDxwPgotICogQ2xpZW50cyBjYW4gc3ViY2xhc3MgYW5kIG92ZXJyaWRlIGp1c3QgdGhvc2UgbWV0aG9kcyB3aGljaCBtdXN0IGJlIHNwZWNpZmljCi0gKiB0byB0aGVpciBuZWVkcy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiB7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24gYmVjYXVzZSBub3Qgc291cmNldmlld2VyLXNwZWNpZmljIGFuZAotCSAqIGl0J3MgYSBTdHJpbmcgYXJyYXkKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUzsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZkxpbmVTdHlsZVByb3ZpZGVyRm9ySFRNTDsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGZYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwoKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElBdXRvRWRpdFN0cmF0ZWd5W10gZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJTGlzdCBhbGxTdHJhdGVnaWVzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQlJQXV0b0VkaXRTdHJhdGVneVtdIHN1cGVyU3RyYXRlZ2llcyA9IHN1cGVyLmdldEF1dG9FZGl0U3RyYXRlZ2llcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlclN0cmF0ZWdpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWFsbFN0cmF0ZWdpZXMuYWRkKHN1cGVyU3RyYXRlZ2llc1tpXSk7Ci0JCX0KLQotCQkvLyBiZSBzdXJlIHRoaXMgaXMgYWRkZWQgbGFzdCBpbiBsaXN0LCBzbyBpdCBoYXMgYSBjaGFuZ2UgdG8gbW9kaWZ5Ci0JCS8vIHByZXZpb3VzIHJlc3VsdHMuCi0JCS8vIGFkZCBhdXRvIGVkaXQgc3RyYXRlZ3kgdGhhdCBoYW5kbGVzIHdoZW4gdGFiIGtleSBpcyBwcmVzc2VkCi0JCWFsbFN0cmF0ZWdpZXMuYWRkKG5ldyBBdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicygpKTsKLQotCQlyZXR1cm4gKElBdXRvRWRpdFN0cmF0ZWd5W10pIGFsbFN0cmF0ZWdpZXMudG9BcnJheShuZXcgSUF1dG9FZGl0U3RyYXRlZ3lbYWxsU3RyYXRlZ2llcy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlpZiAoZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPT0gbnVsbCkgewotCQkJU3RyaW5nW10geG1sVHlwZXMgPSBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoKTsKLQkJCVN0cmluZ1tdIGh0bWxUeXBlcyA9IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoKTsKLQkJCWZDb25maWd1cmVkQ29udGVudFR5cGVzID0gbmV3IFN0cmluZ1syICsgeG1sVHlwZXMubGVuZ3RoICsgaHRtbFR5cGVzLmxlbmd0aF07Ci0KLQkJCWZDb25maWd1cmVkQ29udGVudFR5cGVzWzBdID0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OOwotCQkJZkNvbmZpZ3VyZWRDb250ZW50VHlwZXNbMV0gPSBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT047Ci0KLQkJCWludCBpbmRleCA9IDA7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHhtbFR5cGVzLCAwLCBmQ29uZmlndXJlZENvbnRlbnRUeXBlcywgaW5kZXggKz0gMiwgeG1sVHlwZXMubGVuZ3RoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoaHRtbFR5cGVzLCAwLCBmQ29uZmlndXJlZENvbnRlbnRUeXBlcywgaW5kZXggKz0geG1sVHlwZXMubGVuZ3RoLCBodG1sVHlwZXMubGVuZ3RoKTsKLQkJfQotCi0JCXJldHVybiBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycygKLQkJCUlTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEhUTUxTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvcigKLQkJCQl0aGlzLmdldENvbnRlbnRBc3Npc3RhbnQoKSwgcGFydGl0aW9uVHlwZSwgc291cmNlVmlld2VyKTsKLQkJcmV0dXJuIG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde3Byb2Nlc3Nvcn07Ci0JfQotCi0JcHVibGljIElDb250ZW50Rm9ybWF0dGVyIGdldENvbnRlbnRGb3JtYXR0ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJSUNvbnRlbnRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gc3VwZXIuZ2V0Q29udGVudEZvcm1hdHRlcihzb3VyY2VWaWV3ZXIpOwotCQkvLyBzdXBlciB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBhIGZvcm1hdHRlciwgcHJvYmFibHkgYmVjYXVzZQotCQkvLyBzb3VyY2VWaWV3ZXIgZG9lcyBub3QgaGF2ZSBkb2N1bWVudCBzZXQgeWV0LCBzbyBqdXN0IGNyZWF0ZSBhCi0JCS8vIGdlbmVyaWMgb25lCi0JCWlmICghKGZvcm1hdHRlciBpbnN0YW5jZW9mIE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIpKQotCQkJZm9ybWF0dGVyID0gbmV3IE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIoZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHNvdXJjZVZpZXdlciksIElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQpOwotCQkoKE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIpIGZvcm1hdHRlcikuc2V0TWFzdGVyU3RyYXRlZ3kobmV3IFN0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3kobmV3IEhUTUxGb3JtYXRQcm9jZXNzb3JJbXBsKCkpKTsKLQotCQlyZXR1cm4gZm9ybWF0dGVyOwotCX0KLQotCXB1YmxpYyBJVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3kgZ2V0RG91YmxlQ2xpY2tTdHJhdGVneShJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKSB7Ci0JCQkvLyB1c2UgeG1sJ3MgZG91YmxlY2xpY2sgc3RyYXRlZ3kKLQkJCXJldHVybiBnZXRYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0RG91YmxlQ2xpY2tTdHJhdGVneShzb3VyY2VWaWV3ZXIsIElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0RG91YmxlQ2xpY2tTdHJhdGVneShzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRJbmRlbnRQcmVmaXhlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCVZlY3RvciB2ZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJLy8gcHJlZml4WzBdIGlzIGVpdGhlciAnXHQnIG9yICcgJyB4IHRhYldpZHRoLCBkZXBlbmRpbmcgb24gcHJlZmVyZW5jZQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQlib29sZWFuIHVzZVNwYWNlcyA9IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFLmVxdWFscyhpbmRlbnRDaGFyUHJlZik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQlTdHJpbmdCdWZmZXIgcHJlZml4ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYm9vbGVhbiBhcHBlbmRUYWIgPSBmYWxzZTsKLQotCQkJaWYgKHVzZVNwYWNlcykgewotCQkJCWZvciAoaW50IGogPSAwOyBqICsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGorKykKLQkJCQkJcHJlZml4LmFwcGVuZCgnICcpOwotCi0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kVGFiID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKQotCQkJCQlwcmVmaXguYXBwZW5kKCcgJyk7Ci0KLQkJCQlpZiAoaSAhPSBpbmRlbnRhdGlvbldpZHRoKQotCQkJCQlhcHBlbmRUYWIgPSB0cnVlOwotCQkJfQotCi0JCQlpZiAoYXBwZW5kVGFiKSB7Ci0JCQkJcHJlZml4LmFwcGVuZCgnXHQnKTsKLQkJCQl2ZWN0b3IuYWRkKHByZWZpeC50b1N0cmluZygpKTsKLQkJCQkvLyByZW1vdmUgdGhlIHRhYiBzbyB0aGF0IGluZGVudGF0aW9uIC0gdGFiIGlzIGFsc28gYW4gaW5kZW50Ci0JCQkJLy8gcHJlZml4Ci0JCQkJcHJlZml4LmRlbGV0ZUNoYXJBdChwcmVmaXgubGVuZ3RoKCkgLSAxKTsKLQkJCX0KLQkJCXZlY3Rvci5hZGQocHJlZml4LnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJdmVjdG9yLmFkZCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gKFN0cmluZ1tdKSB2ZWN0b3IudG9BcnJheShuZXcgU3RyaW5nW3ZlY3Rvci5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUxpbmVTdHlsZVByb3ZpZGVyW10gcHJvdmlkZXJzID0gbnVsbDsKLQotCQkvLyB3b3JrYXJvdW5kIElYTUxQYXJ0aXRpb25zLlhNTF9QSQotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUIHx8IHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfQ09NTUVOVCB8fCBwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFQ0xBUkFUSU9OIHx8IHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX1BJKSB7Ci0JCQlwcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXXtnZXRMaW5lU3R5bGVQcm92aWRlckZvckhUTUwoKX07Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJQ1NTUGFydGl0aW9ucy5TVFlMRSB8fCBwYXJ0aXRpb25UeXBlID09IElDU1NQYXJ0aXRpb25zLkNPTU1FTlQpIHsKLQkJCXByb3ZpZGVycyA9IG5ldyBMaW5lU3R5bGVQcm92aWRlcltde2dldExpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1MoKX07Ci0JCX0KLQotCQlyZXR1cm4gcHJvdmlkZXJzOwotCX0KLQotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZ2V0TGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUygpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlckZvckVtYmVkZGVkQ1NTID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvckVtYmVkZGVkQ1NTID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1MoKTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1M7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvckhUTUwoKSB7Ci0JCWlmIChmTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvckhUTUwgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MKCk7Ci0JCX0KLQkJcmV0dXJuIGZMaW5lU3R5bGVQcm92aWRlckZvckhUTUw7Ci0JfQotCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChmU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyID0gbmV3IEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIGVsZW1lbnQ7Ci0JCQkJCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCQkJcy5pbnNlcnQoMCwgc3VwZXIuZ2V0VGV4dChub2RlKSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLQkJCQkJCQlub2RlID0gKChBdHRyKSBub2RlKS5nZXRPd25lckVsZW1lbnQoKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQotCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCQkJcy5pbnNlcnQoMCwgSVBhdGguU0VQQVJBVE9SKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gcy50b1N0cmluZygpOwotCQkJCX0KLQotCQkJfTsKLQkJfQotCQlyZXR1cm4gZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyOwotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGdldFhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChmWE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlmWE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwoKTsKLQkJfQotCQlyZXR1cm4gZlhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBnZXRIeXBlcmxpbmtEZXRlY3RvclRhcmdldHMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJTWFwIHRhcmdldHMgPSBzdXBlci5nZXRIeXBlcmxpbmtEZXRlY3RvclRhcmdldHMoc291cmNlVmlld2VyKTsKLQkJdGFyZ2V0cy5wdXQoQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MLCBudWxsKTsKLQotCQkvLyBhbHNvIGFkZCB4bWwgc2luY2UgdGhlcmUgY291bGQgYmUgeG1sIGNvbnRlbnQgaW4gaHRtbAotCQkvLyAoanVzdCBob3BlIHRoZSBoeXBlcmxpbmsgZGV0ZWN0b3JzIHdpbGwgZG8gYWRkaXRpb25hbCBjaGVja2luZykKLQkJdGFyZ2V0cy5wdXQoQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTCwgbnVsbCk7Ci0JCXJldHVybiB0YXJnZXRzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9IVE1MVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvSFRNTFVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFmODZiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9IVE1MVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBIVE1MIFVJCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTFVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGU7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSFRNTFVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIEhUTUxVSU1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZlJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJZlJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCWZSZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZSZXNvdXJjZUJ1bmRsZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2FtcGxlX0hUTUxfZG9jOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxGaWxlc1ByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19ERVNDUklQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfSFRNTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19maWxlc19lbmNvZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbmRPY2N1cnJlbmNlc19sYWJlbDsJLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfZmlsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5jb2RpbmdfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9EZXNjcmlwdGlvbl9vZl9yb2xlX29mX2ZvbGxvd2luZ19ET0NUWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0RlZmF1bHRfSFRNTF9ET0NUWVBFX0lEX19fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9QdWJsaWNfSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfU3lzdGVtX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX25vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQ1NTX3Byb2ZpbGVfX18yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvX0FjdGl2YXRpb25fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY2FsbHlfbWFrZV9zdWdnZXN0X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9tcHRfd2hlbl90aGVzZV9jaGFyYWN0ZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3ljbGluZ19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0dGluZ19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGluZV93aWR0aF9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNwbGl0X211bHRpcGxlX2F0dHJpYnV0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWxpZ25fZmluYWxfYnJhY2tldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRlbnRfdXNpbmdfdGFiczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRlbnRfdXNpbmdfc3BhY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZGVudGF0aW9uX3NpemU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kZW50YXRpb25fc2l6ZV90aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYXJfYWxsX2JsYW5rX2xpbmVzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmZXJyZWRfbWFya3VwX2Nhc2VfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ19uYW1lc19fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ19uYW1lc19VcHBlcl9jYXNlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfbmFtZXNfTG93ZXJfY2FzZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX25hbWVzX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX25hbWVzX1VwcGVyX2Nhc2VfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV9uYW1lc19Mb3dlcl9jYXNlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfbmFtZV9jYXNlX2Zvcl9IVE1MX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfbmFtZV9jYXNlX0FzX2lzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfbmFtZV9jYXNlX0xvd2VyX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfbmFtZV9jYXNlX1VwcGVyX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfbmFtZV9jYXNlX2Zvcl9IVE1MX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfbmFtZV9jYXNlX0FzX2lzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfbmFtZV9jYXNlX0xvd2VyX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfbmFtZV9jYXNlX1VwcGVyX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnNlcnRfcmVxdWlyZWRfYXR0cmlidXRlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zZXJ0X21pc3NpbmdfdGFnc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVvdGVfYXR0cmlidXRlX3ZhbHVlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0X3NvdXJjZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udmVydF9FT0xfY29kZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9XaW5kb3dzX1VJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9Vbml4X1VJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9NYWNfVUk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdQYWdlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdQYWdlXzY7Ci0JCi0JLy8gYmVsb3cgYXJlIHBvc3NpYmx5IHVudXNlZCBzdHJpbmdzIHRoYXQgbWF5IGJlIGRlbGV0ZWQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MRmlsZXNQcmVmZXJlbmNlUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxGaWxlc1ByZWZlcmVuY2VQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfMzsKLQkvLyBhYm92ZSBhcmUgcG9zc2libHkgdW51c2VkIHN0cmluZ3MgdGhhdCBtYXkgYmUgZGVsZXRlZAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVtcHR5RmlsZVByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NUUlVDVFVSRURfVEVYVF9FRElUT1JfUFJFRlNfTElOSzsKLQkKLQkvLyBIVE1MIFR5cGluZyBQcmVmZXJlbmNlcwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxUeXBpbmdfQXV0b19Db21wbGV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVHlwaW5nX0F1dG9fUmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxUeXBpbmdfQ29tcGxldGVfQ29tbWVudHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFR5cGluZ19Db21wbGV0ZV9FbmRfVGFnczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVHlwaW5nX1JlbW92ZV9FbmRfVGFnczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVHlwaW5nX0Nsb3NlX1N0cmluZ3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFR5cGluZ19DbG9zZV9CcmFja2V0czsKLQkKLQkvLyBiZWxvdyBhcmUgdGhlIHN0cmluZ3MgZm9yIHRoZSB2YWxpZGF0aW9uIHBhZ2UKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25fV2FybmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25fSWdub3JlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cGFuZGFibGVfbGFiZWxfYXR0cmlidXRlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBhbmRhYmxlX2xhYmVsX2VsZW1lbnRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cGFuZGFibGVfbGFiZWxfZG9jdW1lbnRfdHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBhbmRhYmxlX2xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwYW5kYWJsZV9sYWJlbF9jb21tZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cGFuZGFibGVfbGFiZWxfY2RhdGE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwYW5kYWJsZV9sYWJlbF9waTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBhbmRhYmxlX2xhYmVsX2VudGl0eV9yZWY7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzEwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzEzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE2OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzIwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzIzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI2OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzMwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8zMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzMzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8zNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV84OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfOTsKLQkKLQkvLyBWYWxpZGF0aW9uCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvbl9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX1dvcmtzcGFjZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX1Byb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvbl9qb2JOYW1lOwotCQotCS8vIEh5cGVybGlua3MKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIeXBlcmxpbmtfbGluZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvSFRNTFVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9IVE1MVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQwNDkzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9IVE1MVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgSFRNTFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIEhUTUxVSVBsdWdpbiBpbnN0YW5jZSA9IG51bGw7CQotCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgaHRtbCBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGh0bWwgZWRpdG9yLgotCSAqLwotCXByaXZhdGUgQ29udGV4dFR5cGVSZWdpc3RyeSBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQotCXB1YmxpYyBIVE1MVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEhUTUxVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTFVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgZ2V0QWRhcHRlckZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGh0bWwgZWRpdG9yIHRlbXBsYXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGh0bWwgZWRpdG9yIHRlbXBsYXRlcwotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCWlmIChmVGVtcGxhdGVTdG9yZSA9PSBudWxsKSB7Ci0JCQlmVGVtcGxhdGVTdG9yZSA9IG5ldyBDb250cmlidXRpb25UZW1wbGF0ZVN0b3JlKGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCksIGdldFByZWZlcmVuY2VTdG9yZSgpLCBIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVEVNUExBVEVTX0tFWSk7Ci0KLQkJCXRyeSB7Ci0JCQkJZlRlbXBsYXRlU3RvcmUubG9hZCgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZUZW1wbGF0ZVN0b3JlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGh0bWwgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGh0bWwgcGx1Z2luCi0JICovCi0JcHVibGljIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSB7Ci0JCWlmIChmQ29udGV4dFR5cGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IENvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkoKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLkFMTCk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5ORVcpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuVEFHKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLkFUVFJJQlVURSk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5BVFRSSUJVVEVfVkFMVUUpOwotCi0JCQlmQ29udGV4dFR5cGVSZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQl9Ci0KLQkJcmV0dXJuIGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0hUTUxVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvSFRNTFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYWY4N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvSFRNTFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgQmVuamFtaW4gTXVza2FsbGEsIGIubXVza2FsbGFAZ214Lm5ldCAtIFsxNTg2NjBdIGNoYXJhY3RlciBlbnRpdGllcyBzaG91bGQgaGF2ZSB0aGVpciBvd24gc3ludGF4IGhpZ2hsaWdodGluZyBwcmVmZXJlbmNlICAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBUaGUgZm9sbG93aW5nIGxpbmUgaXMgYSBzYW1wbGUgSFRNTCBkb2N1bWVudC4gIFBsZWFzZSB0cmFuc2xhdGUgb25seSB0aGUgZm9sbG93aW5nIHBhcnRzOgotIyMgSFRNTCBIaWdobGlnaHRpbmcgUHJlZmVyZW5jZXMKLSMjIHdlIG5lZWQgYSBmbGFtaW5nIGxvZ28KLVNhbXBsZV9IVE1MX2RvYz08IURPQ1RZUEUgaHRtbFxuXHRQVUJMSUMgXCItLy9XM0MvRFRELyBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTlwiXG5cdFwiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkXCI+XG48aHRtbD5cblx0PGhlYWQ+XG5cdFx0PG1ldGEgY29udGVudD1cInRleHQvaHRtbFwiPlxuXHRcdDx0aXRsZT5IVE1MIEhpZ2hsaWdodGluZyBQcmVmZXJlbmNlczwvdGl0bGU+XG5cdDwvaGVhZD5cbjxib2R5PlxuXHQ8IS0tXG5cdFx0d2UgbmVlZCBhIGZsYW1pbmcgbG9nbyFcblx0LS0+XG5cdDxwPnRocmVlJm5ic3A7Jm5ic3A7Jm5ic3A7c3BhY2VzPC9wPlxuPC9ib2R5PlxuPC9odG1sPgotCi1IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZV8wPUxvYWRpbmcgZmlsZXMKLSMKLV9VSV9XSVpBUkRfTkVXX1RJVExFID0gTmV3IEhUTUwgRmlsZQotX1VJX1dJWkFSRF9ORVdfSEVBRElORyA9IEhUTUwKLV9VSV9XSVpBUkRfTkVXX0RFU0NSSVBUSU9OID0gQ3JlYXRlIGEgbmV3IEhUTUwgZmlsZS4KLV9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9IVE1MID0gVGhlIGZpbGUgbmFtZSBtdXN0IGVuZCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zIHswfS4KLV9XQVJOSU5HX0ZPTERFUl9NVVNUX0JFX0lOU0lERV9XRUJfQ09OVEVOVCA9IEZpbGVzIGNyZWF0ZWQgb3V0c2lkZSBvZiB0aGUgV2ViIENvbnRlbnQgZm9sZGVyIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHlvdXIgZGVwbG95ZWQgV2ViIGFwcGxpY2F0aW9uLiAKLVJlc291cmNlR3JvdXBfbmFtZUV4aXN0cyA9IFRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCi1OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8wPVNlbGVjdCBIVE1MIFRlbXBsYXRlCi1OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8xPVNlbGVjdCBhIHRlbXBsYXRlIGFzIGluaXRpYWwgY29udGVudCBpbiB0aGUgSFRNTCBwYWdlLgotTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMj1OYW1lCi1OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8zPURlc2NyaXB0aW9uCi1OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV80PSZVc2UgSFRNTCBUZW1wbGF0ZQotTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNT0mUHJldmlldzoKLU5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzY9VGVtcGxhdGVzIGFyZSAnTmV3IEhUTUwnIHRlbXBsYXRlcyBmb3VuZCBpbiB0aGUgPGE+SFRNTCBUZW1wbGF0ZXM8L2E+IHByZWZlcmVuY2UgcGFnZS4KLU5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzc9JlRlbXBsYXRlczoKLSMKLUNyZWF0aW5nX2ZpbGVzX2VuY29kaW5nPUNyZWF0aW5nIGZpbGVzIGVuY29kaW5nIHByZWZlcmVuY2UKLSMgQ29waWVkIGZyb20gc3NlLnVpCi1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uPUNsZWFudXAgRG9jdW1lbnQKLVRvZ2dsZUNvbW1lbnRfbGFiZWw9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfdG9vbHRpcD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbj1Ub2dnbGUgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2xhYmVsPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfdG9vbHRpcD1BZGQgQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uPUFkZCBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb249UmVtb3ZlIEJsb2NrIENvbW1lbnQKLUZpbmRPY2N1cnJlbmNlc19sYWJlbD1PY2N1cnJlbmNlcyBpbiBGaWxlCi1DcmVhdGluZ19maWxlcz1DcmVhdGluZyBmaWxlcwotRW5jb2RpbmdfZGVzYz1UaGUgZm9sbG93aW5nIGVuY29kaW5nIHdpbGwgYXBwbHk6Ci0jIyBIVE1MIFNvdXJjZSBwcmVmZXJlbmNlIHBhZ2UKLUF1dG9fQWN0aXZhdGlvbl9VSV89QXV0byBBY3RpdmF0aW9uCi1BdXRvbWF0aWNhbGx5X21ha2Vfc3VnZ2VzdF9VSV89QXV0b21hdGljYWxseSBtYSZrZSBzdWdnZXN0aW9ucwotUHJvbXB0X3doZW5fdGhlc2VfY2hhcmFjdGVfVUlfPVAmcm9tcHQgd2hlbiB0aGVzZSBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZDoKLUN5Y2xpbmdfVUlfPUN5Y2xpbmcKLUZvcm1hdHRpbmdfVUlfPUZvcm1hdHRpbmcKLUxpbmVfd2lkdGhfX1VJXz1MaW5lICZ3aWR0aDoKLVNwbGl0X211bHRpcGxlX2F0dHJpYnV0ZXM9U3BsaXQgJm11bHRpcGxlIGF0dHJpYnV0ZXMgZWFjaCBvbiBhIG5ldyBsaW5lCi1BbGlnbl9maW5hbF9icmFja2V0PSZBbGlnbiBmaW5hbCBicmFja2V0IGluIG11bHRpLWxpbmUgZWxlbWVudCB0YWdzCi1JbmRlbnRfdXNpbmdfdGFicz0mSW5kZW50IHVzaW5nIHRhYnMKLUluZGVudF91c2luZ19zcGFjZXM9SSZuZGVudCB1c2luZyBzcGFjZXMKLUluZGVudGF0aW9uX3NpemU9SW4mZGVudGF0aW9uIHNpemU6Ci1JbmRlbnRhdGlvbl9zaXplX3RpcD1JbmRlbnRhdGlvbiBzaXplCi1DbGVhcl9hbGxfYmxhbmtfbGluZXNfVUlfPUNsZWFyIGFsbCAmYmxhbmsgbGluZXMKLVByZWZlcnJlZF9tYXJrdXBfY2FzZV9VSV89UHJlZmVycmVkIG1hcmt1cCBjYXNlIGZvciBjb250ZW50IGFzc2lzdCwgYW5kIGNvZGUgZ2VuZXJhdGlvbgotVGFnX25hbWVzX19VSV89VGFnIG5hbWVzOgotVGFnX25hbWVzX1VwcGVyX2Nhc2VfVUlfPSZVcHBlcmNhc2UKLVRhZ19uYW1lc19Mb3dlcl9jYXNlX1VJXz0mTG93ZXJjYXNlCi1BdHRyaWJ1dGVfbmFtZXNfX1VJXz1BdHRyaWJ1dGUgbmFtZXM6Ci1BdHRyaWJ1dGVfbmFtZXNfVXBwZXJfY2FzZV9VSV89VSZwcGVyY2FzZQotQXR0cmlidXRlX25hbWVzX0xvd2VyX2Nhc2VfVUlfPUwmb3dlcmNhc2UKLUNsZWFudXBfVUlfPUNsZWFudXAKLVRhZ19uYW1lX2Nhc2VfZm9yX0hUTUxfVUlfPVRhZyBuYW1lIGNhc2UgZm9yIEhUTUw6Ci1UYWdfbmFtZV9jYXNlX0FzX2lzX1VJXz0mQXMtaXMKLVRhZ19uYW1lX2Nhc2VfTG93ZXJfVUlfPSZMb3dlcgotVGFnX25hbWVfY2FzZV9VcHBlcl9VSV89JlVwcGVyCi1BdHRyaWJ1dGVfbmFtZV9jYXNlX2Zvcl9IVE1MX1VJXz1BdHRyaWJ1dGUgbmFtZSBjYXNlIGZvciBIVE1MOgotQXR0cmlidXRlX25hbWVfY2FzZV9Bc19pc19VSV89QSZzLWlzCi1BdHRyaWJ1dGVfbmFtZV9jYXNlX0xvd2VyX1VJXz1MJm93ZXIKLUF0dHJpYnV0ZV9uYW1lX2Nhc2VfVXBwZXJfVUlfPVUmcHBlcgotSW5zZXJ0X3JlcXVpcmVkX2F0dHJpYnV0ZXNfVUlfPUluc2VydCAmcmVxdWlyZWQgYXR0cmlidXRlcwotSW5zZXJ0X21pc3NpbmdfdGFnc19VSV89Jkluc2VydCBtaXNzaW5nIHRhZ3MKLVF1b3RlX2F0dHJpYnV0ZV92YWx1ZXNfVUlfPSZRdW90ZSBhdHRyaWJ1dGUgdmFsdWVzCi1Gb3JtYXRfc291cmNlX1VJXz0mRm9ybWF0IHNvdXJjZQotQ29udmVydF9FT0xfY29kZXNfVUlfPUNvbnZlcnQgbGluZSAmZGVsaW1pdGVycyB0bwotRU9MX1dpbmRvd3NfVUk9JldpbmRvd3MKLUVPTF9Vbml4X1VJPVUmTklYCi1FT0xfTWFjX1VJPSZNYWMKLQotIyB3ZWIgY29udGVudCBzZXR0aW5ncwotVUlfRGVzY3JpcHRpb25fb2Zfcm9sZV9vZl9mb2xsb3dpbmdfRE9DVFlQRT1Vc2UgdGhlIGZvbGxvd2luZyBkZWZhdWx0IGRvY3VtZW50IHR5cGUgd2hlbiBubyBET0NUWVBFIGlzIGRlY2xhcmVkIGluIGEgZmlsZToKLVVJX0RlZmF1bHRfSFRNTF9ET0NUWVBFX0lEX19fMT1Eb2N1bWVudCB0eXBlOgotVUlfUHVibGljX0lEPVB1YmxpYyBJRDoKLVVJX1N5c3RlbV9JRD1TeXN0ZW0gSUQ6Ci1VSV9ub25lPW5vbmUKLVVJX0NTU19wcm9maWxlX19fMj1DU1MgcHJvZmlsZToKLVdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wPVRoZSBwcm9wZXJ0aWVzIHVzZWQgdGhhdCBjYW5ub3Qgb3IgYXJlIG5vdCBzcGVjaWZpZWQgaW4gd2ViIGZpbGVzLiAgVGhlIHByb2plY3Qgc2V0dGluZyBpcyB1c2VkIGlmIHlvdSBzcGVjaWZ5ICJub25lLiIKLVByb2plY3RXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMD1UaGVzZSB2YWx1ZXMgYXJlIHVzZWQgd2hlbiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzIGFyZSBub3Qgc3BlY2lmaWVkIHdpdGhpbiBhIHdlYiBwYWdlLgotU3ludGF4Q29sb3JpbmdQYWdlXzA9U3ludGF4IEVsZW1lbnQ6Ci1TeW50YXhDb2xvcmluZ1BhZ2VfMj1FbmFibGUKLVN5bnRheENvbG9yaW5nUGFnZV8zPSZCb2xkCi1TeW50YXhDb2xvcmluZ1BhZ2VfND0mSXRhbGljCi1TeW50YXhDb2xvcmluZ1BhZ2VfNT0mU3RyaWtldGhyb3VnaAotU3ludGF4Q29sb3JpbmdQYWdlXzY9JlVuZGVybGluZQotIyBiZWxvdyBhcmUgcG9zc2libHkgdW51c2VkIHN0cmluZ3MgdGhhdCBtYXkgYmUgZGVsZXRlZAotSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfMT1BZGQgdGhpcyBzdWZmaXggKGlmIG5vdCBzcGVjaWZpZWQpOgotSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfMj1JbnNlcnQgRE9DVFlQRSBkZWNsYXJhdGlvbgotSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfMz1JbnNlcnQgR0VORVJBVE9SIHdpdGggTUVUQSB0YWcKLUVtcHR5RmlsZVByZWZlcmVuY2VQYWdlXzA9RXhwYW5kIHRoZSB0cmVlIHRvIGVkaXQgcHJlZmVyZW5jZXMgZm9yIGEgc3BlY2lmaWMgZmVhdHVyZS4KLV9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTks9SFRNTCBlZGl0aW5nIHByZWZlcmVuY2VzLiAgTm90ZSB0aGF0IHNvbWUgcHJlZmVyZW5jZXMgbWF5IGJlIHNldCBvbiB0aGUgPGE+ezB9PC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi0jIGFib3ZlIGFyZSBwb3NzaWJseSB1bnVzZWQgc3RyaW5ncyB0aGF0IG1heSBiZSBkZWxldGVkCi0KLSMgSFRNTCBUeXBpbmcgUHJlZmVyZW5jZSBQYWdlCi1IVE1MVHlwaW5nX0F1dG9fQ29tcGxldGU9QXV0b21hdGljYWxseSBjbG9zZQotSFRNTFR5cGluZ19BdXRvX1JlbW92ZT1BdXRvbWF0aWNhbGx5IHJlbW92ZQotSFRNTFR5cGluZ19Db21wbGV0ZV9Db21tZW50cz0mQ29tbWVudHMKLUhUTUxUeXBpbmdfQ2xvc2VfU3RyaW5ncz1BJnR0cmlidXRlIHZhbHVlcwotSFRNTFR5cGluZ19DbG9zZV9CcmFja2V0cz0oUGFyZW50aGVzZXMpIGFuZCBbc3F1YXJlXSBicmFjJmtldHMKLUhUTUxUeXBpbmdfQ29tcGxldGVfRW5kX1RhZ3M9JkVuZCB0YWdzCi1IVE1MVHlwaW5nX1JlbW92ZV9FbmRfVGFncz1FJm5kIHRhZ3Mgd2hlbiBjcmVhdGluZyBlbXB0eSBzZWxmLWNsb3NpbmcgdGFncwotCi0KLSMgVmFsaWRhdGlvbiBzdHJpbmdzCi1WYWxpZGF0aW9uX2Rlc2NyaXB0aW9uPVNlbGVjdCB0aGUgc2V2ZXJpdHkgbGV2ZWwgZm9yIHRoZSBmb2xsb3dpbmcgdmFsaWRhdGlvbiBwcm9ibGVtczoKLVZhbGlkYXRpb25fV2FybmluZz1XYXJuaW5nCi1WYWxpZGF0aW9uX0Vycm9yPUVycm9yCi1WYWxpZGF0aW9uX0lnbm9yZT1JZ25vcmUKLUV4cGFuZGFibGVfbGFiZWxfYXR0cmlidXRlcz1BdHRyaWJ1dGVzCi1FeHBhbmRhYmxlX2xhYmVsX2VsZW1lbnRzPUVsZW1lbnRzCi1FeHBhbmRhYmxlX2xhYmVsX2RvY3VtZW50X3R5cGU9RG9jdW1lbnQgVHlwZQotRXhwYW5kYWJsZV9sYWJlbF90ZXh0PVRleHQgUmVnaW9ucwotRXhwYW5kYWJsZV9sYWJlbF9jb21tZW50PUNvbW1lbnRzCi1FeHBhbmRhYmxlX2xhYmVsX2NkYXRhPUNEQVRBIFNlY3Rpb25zCi1FeHBhbmRhYmxlX2xhYmVsX3BpPVByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb25zCi1FeHBhbmRhYmxlX2xhYmVsX2VudGl0eV9yZWY9RW50aXR5IFJlZmVyZW5jZXMKLQotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8wPVVuZGVmaW5lZCBhdHRyaWJ1dGUgbmFtZToKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMT1VbmRlZmluZWQgYXR0cmlidXRlIHZhbHVlOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xMD1TdGFydC10YWcgdXNlcyBpbnZhbGlkIGNhc2U6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzExPUVuZCB0YWcgdXNlcyBpbnZhbGlkIGNhc2U6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzEyPU1pc3Npbmcgc3RhcnQgdGFnOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xMz1NaXNzaW5nIGVuZCB0YWc6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE0PVVubmVjZXNzYXJ5IGVuZCB0YWc6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE1PUludmFsaWQgZGlyZWN0aXZlOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xNj1JbnZhbGlkIHRhZyBsb2NhdGlvbjoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTc9RHVwbGljYXRlIHRhZzoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTg9Q29leGlzdGVuY2U6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE5PVVuY2xvc2VkIHN0YXJ0IHRhZzoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMj1BdHRyaWJ1dGUgbmFtZSB1c2luZyB3cm9uZyBjYXNlIGNoYXJhY3RlcjoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjA9VW5jbG9zZWQgZW5kIHRhZzoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjE9SW52YWxpZCBlbXB0eSBlbGVtZW50IHRhZzoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjI9RHVwbGljYXRlIERPQ1RZUEUgZGVjbGFyYXRpb246Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzIzPUludmFsaWQgbG9jYXRpb246Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI0PURPQ1RZUEUgZGVjbGFyYXRpb24gdW5jbG9zZWQ6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI1PUludmFsaWQgdGV4dCBzdHJpbmc6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI2PUludmFsaWQgY2hhcmFjdGVycyB1c2VkIGluIHRleHQgc3RyaW5nOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yNz1JbnZhbGlkIGxvY2F0aW9uOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yOD1VbmNsb3NlZCBjb21tZW50OgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yOT1JbnZhbGlkIGxvY2F0aW9uOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8zPUludmFsaWQgYXR0cmlidXRlIG5hbWU6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzMwPVVuY2xvc2VkIENEQVRBIHNlY3Rpb246Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzMxPUludmFsaWQgbG9jYXRpb246Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzMyPVVuY2xvc2VkIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzMzPUludmFsaWQgbG9jYXRpb246Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzM0PVVua25vd24gZW50aXR5OgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV80PUludmFsaWQgYXR0cmlidXRlOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV81PU11bHRpcGxlIHZhbHVlcyBzcGVjaWZpZWQgZm9yIGFuIGF0dHJpYnV0ZToKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfNj1BdHRyaWJ1dGUgdmFsdWUgdXNpbmcgd3JvbmcgY2FzZSBjaGFyYWN0ZXI6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzc9VW5jbG9zZWQgYXR0cmlidXRlIHZhbHVlOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV84PVVua25vd24gdGFnIG5hbWU6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzk9SW52YWxpZCB0YWcgbmFtZToKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMzU9QXR0cmlidXRlIHZhbHVlIHJlZmVycyB0byBtaXNzaW5nIHJlc291cmNlOgotCi1WYWxpZGF0aW9uX1RpdGxlPVZhbGlkYXRpb24gU2V0dGluZ3MgQ2hhbmdlZAotVmFsaWRhdGlvbl9Xb3Jrc3BhY2U9VGhlIHZhbGlkYXRpb24gc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkLiBBIGZ1bGwgdmFsaWRhdGlvbiBpcyByZXF1aXJlZCBmb3IgY2hhbmdlcyB0byB0YWtlIGVmZmVjdC4gVmFsaWRhdGUgbm93PwotVmFsaWRhdGlvbl9Qcm9qZWN0PVRoZSB2YWxpZGF0aW9uIHNldHRpbmdzIGhhdmUgY2hhbmdlZC4gQSB2YWxpZGF0aW9uIG9mIHRoZSBwcm9qZWN0IGlzIHJlcXVpcmVkIGZvciBjaGFuZ2VzIHRvIHRha2UgZWZmZWN0LiBWYWxpZGF0ZSB0aGUgcHJvamVjdCBub3c/Ci1WYWxpZGF0aW9uX2pvYk5hbWU9VmFsaWRhdGluZy4uLgotCi1IeXBlcmxpbmtfbGluZT17MH09ezF9IDogbGluZSB7Mn0KLU9wZW49T3BlbiAnJ3swfScnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODBmM2ZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmCi0gKiBkZXNpcmVkLCB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcwotICogcGx1Z2luLiBPdGhlciBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjODllZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIEF1dG9FZGl0U3RyYXRlZ3kgdG8gaGFuZGxlIGNoYXJhY3RlcnMgaW5zZXJ0ZWQgd2hlbiBUYWIga2V5IGlzIHByZXNzZWQKLSAqLwotcHVibGljIGNsYXNzIEF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzIGltcGxlbWVudHMgSUF1dG9FZGl0U3RyYXRlZ3kgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFRBQl9DSEFSQUNURVIgPSAiXHQiOwkvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJLy8gaWYgbm90IGluIHNtYXJ0IGluc2VydCBtb2RlIGp1c3QgaWdub3JlCi0JCWlmICghaXNTbWFydEluc2VydE1vZGUoKSkKLQkJCXJldHVybjsKLQkJCi0JCS8vIHNwYWNlcyBmb3IgdGFiIGNoYXJhY3RlcgotCQlpZiAoY29tbWFuZC5sZW5ndGggPT0gMCAmJiBjb21tYW5kLnRleHQgIT0gbnVsbCAmJiBjb21tYW5kLnRleHQubGVuZ3RoKCkgPiAwICYmIGNvbW1hbmQudGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIpICE9IC0xKQotCQkJc21hcnRJbnNlcnRGb3JUYWIoY29tbWFuZCwgZG9jdW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCBzcGFjZXMgZm9yIHRhYnMKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqLwotCXByaXZhdGUgdm9pZCBzbWFydEluc2VydEZvclRhYihEb2N1bWVudENvbW1hbmQgY29tbWFuZCwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIHRhYiBrZXkgd2FzIHByZXNzZWQuIG5vdyBjaGVjayBwcmVmZXJlbmNlcyB0byBzZWUgaWYgbmVlZCB0byBpbnNlcnQKLQkJLy8gc3BhY2VzIGluc3RlYWQgb2YgdGFiCi0JCWludCBpbmRlbnRhdGlvbldpZHRoID0gZ2V0SW5kZW50YXRpb25XaWR0aCgpOwotCQlpZiAoaW5kZW50YXRpb25XaWR0aCA+IC0xKSB7Ci0JCQlTdHJpbmcgb3JpZ2luYWxUZXh0ID0gY29tbWFuZC50ZXh0OwotCQkJU3RyaW5nQnVmZmVyIG5ld1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKG9yaWdpbmFsVGV4dCk7Ci0KLQkJCS8vIGRldGVybWluZSB3aGVyZSBpbiBsaW5lIHRoaXMgY29tbWFuZCBiZWdpbnMKLQkJCWludCBsaW5lT2Zmc2V0ID0gLTE7Ci0JCQl0cnkgewotCQkJCUlSZWdpb24gbGluZUluZm8gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChjb21tYW5kLm9mZnNldCk7Ci0JCQkJbGluZU9mZnNldCA9IGNvbW1hbmQub2Zmc2V0IC0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCi0JCQlJTGluZVRyYWNrZXIgbGluZVRyYWNrZXIgPSBnZXRMaW5lVHJhY2tlcihkb2N1bWVudCwgb3JpZ2luYWxUZXh0KTsKLQotCQkJaW50IHN0YXJ0SW5kZXggPSAwOwotCQkJaW50IGluZGV4ID0gbmV3VGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIpOwotCQkJd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGluZGVudCA9IGdldEluZGVudFN0cmluZyhpbmRlbnRhdGlvbldpZHRoLCBsaW5lT2Zmc2V0LCBsaW5lVHJhY2tlciwgaW5kZXgpOwotCi0JCQkJLy8gcmVwbGFjZSBcdCBjaGFyYWN0ZXIgd2l0aCBzcGFjZXMKLQkJCQluZXdUZXh0LnJlcGxhY2UoaW5kZXgsIGluZGV4ICsgMSwgaW5kZW50KTsKLQkJCQlpZiAobGluZVRyYWNrZXIgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJbGluZVRyYWNrZXIucmVwbGFjZShpbmRleCwgMSwgaW5kZW50KTsKLQkJCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCByZXBsYWNpbmcgdGV4dCwganVzdAotCQkJCQkJLy8gcmVzZXQgdG8gY3VycmVudCBzdHJpbmcKLQkJCQkJCWxpbmVUcmFja2VyLnNldChuZXdUZXh0LnRvU3RyaW5nKCkpOwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJc3RhcnRJbmRleCA9IGluZGV4ICsgaW5kZW50Lmxlbmd0aCgpOwotCQkJCWluZGV4ID0gbmV3VGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIsIHN0YXJ0SW5kZXgpOwotCQkJfQotCQkJY29tbWFuZC50ZXh0ID0gbmV3VGV4dC50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIG51bWJlciBvZiBzcGFjZXMgZm9yIG5leHQgdGFiIHN0b3AKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnRTdHJpbmcoaW50IGluZGVudGF0aW9uV2lkdGgsIGludCBsaW5lT2Zmc2V0LCBJTGluZVRyYWNrZXIgbGluZVRyYWNrZXIsIGludCBpbmRleCkgewotCQlpbnQgaW5kZW50U2l6ZSA9IGluZGVudGF0aW9uV2lkdGg7Ci0JCWludCBvZmZzZXRJbkxpbmUgPSAtMTsKLQkJaWYgKGxpbmVUcmFja2VyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiBsaW5lSW5mbyA9IGxpbmVUcmFja2VyLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGluZGV4KTsKLQkJCQlpZiAobGluZUluZm8uZ2V0T2Zmc2V0KCkgPT0gMCAmJiBsaW5lT2Zmc2V0ID4gLTEpCi0JCQkJCW9mZnNldEluTGluZSA9IGxpbmVPZmZzZXQgKyBpbmRleDsKLQkJCQllbHNlCi0JCQkJCW9mZnNldEluTGluZSA9IGluZGV4IC0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGxpbmVPZmZzZXQgPiAtMSkgewotCQkJCW9mZnNldEluTGluZSA9IGxpbmVPZmZzZXQgKyBpbmRleDsKLQkJCX0KLQkJfQotCQlpZiAob2Zmc2V0SW5MaW5lID4gLTEgJiYgaW5kZW50YXRpb25XaWR0aCA+IDApIHsKLQkJCWludCByZW1haW5kZXIgPSBvZmZzZXRJbkxpbmUgJSBpbmRlbnRhdGlvbldpZHRoOwotCQkJaW5kZW50U2l6ZSA9IGluZGVudGF0aW9uV2lkdGggLSByZW1haW5kZXI7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudFNpemU7IGkrKykKLQkJCWluZGVudC5hcHBlbmQoJyAnKTsKLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFNldCB1cCBhIGxpbmUgdHJhY2tlciBmb3IgdGV4dCB3aXRoaW4gY29tbWFuZCBpZiB0ZXh0IGlzIG11bHRpLWxpbmUKLQkgKi8KLQlwcml2YXRlIElMaW5lVHJhY2tlciBnZXRMaW5lVHJhY2tlcihJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBvcmlnaW5hbFRleHQpIHsKLQkJQ29uZmlndXJhYmxlTGluZVRyYWNrZXIgbGluZVRyYWNrZXIgPSBudWxsOwotCQlpbnRbXSBkZWxpbXMgPSBUZXh0VXRpbGl0aWVzLmluZGV4T2YoZG9jdW1lbnQuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpLCBvcmlnaW5hbFRleHQsIDApOwotCQlpZiAoZGVsaW1zWzBdICE9IC0xIHx8IGRlbGltc1sxXSAhPSAtMSkgewotCQkJbGluZVRyYWNrZXIgPSBuZXcgQ29uZmlndXJhYmxlTGluZVRyYWNrZXIoZG9jdW1lbnQuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpKTsKLQkJCWxpbmVUcmFja2VyLnNldChvcmlnaW5hbFRleHQpOwotCQl9Ci0JCXJldHVybiBsaW5lVHJhY2tlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYWN0aXZlIGVkaXRvciBpcyBpbiBzbWFydCBpbnNlcnQgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1NtYXJ0SW5zZXJ0TW9kZSgpIHsKLQkJYm9vbGVhbiBpc1NtYXJ0SW5zZXJ0TW9kZSA9IGZhbHNlOwotCQkKLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKWVkaXRvcjsKLQkJCQkJZWxzZQotCQkJCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcillZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBjaGVjayBpZiBzbWFydCBpbnNlcnQgbW9kZQotCQlpZiAodGV4dEVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yRXh0ZW5zaW9uMyAmJiAoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpCi0JCQlpc1NtYXJ0SW5zZXJ0TW9kZSA9IHRydWU7Ci0JCXJldHVybiBpc1NtYXJ0SW5zZXJ0TW9kZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBpbmRlbnRhdGlvbiB3aWR0aCBpZiB1c2luZyBzcGFjZXMgZm9yIGluZGVudGF0aW9uLCAtMSBvdGhlcndpc2UKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0SW5kZW50YXRpb25XaWR0aCgpIHsKLQkJaW50IHdpZHRoID0gLTE7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFLmVxdWFscyhwcmVmZXJlbmNlcy5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUikpKQotCQkJd2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJcmV0dXJuIHdpZHRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5SFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZTQ5ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmF1dG9lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBBdXRvbWF0aWNhbGx5IGluc2VydHMgY2xvc2luZyBjb21tZW50IHRhZyBvciBlbmQgdGFnIHdoZW4gYXBwcm9wcmlhdGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUhUTUwgaW1wbGVtZW50cyBJQXV0b0VkaXRTdHJhdGVneSB7Ci0JLyoKLQkgKiBOT1RFOiBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdHMgaW4KLQkgKiBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmF1dG9lZGl0Ci0JICogb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjdXN0b21pemVEb2N1bWVudENvbW1hbmQoSURvY3VtZW50IGRvY3VtZW50LCBEb2N1bWVudENvbW1hbmQgY29tbWFuZCkgewotCQlPYmplY3QgdGV4dEVkaXRvciA9IGdldEFjdGl2ZVRleHRFZGl0b3IoKTsKLQkJaWYgKCEodGV4dEVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yRXh0ZW5zaW9uMyAmJiAoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNvbW1hbmQudGV4dCAhPSBudWxsKSB7Ci0JCQkJCXNtYXJ0SW5zZXJ0Q2xvc2VFbGVtZW50KGNvbW1hbmQsIGRvY3VtZW50LCBtb2RlbCk7Ci0JCQkJCXNtYXJ0SW5zZXJ0Rm9yQ29tbWVudChjb21tYW5kLCBkb2N1bWVudCwgbW9kZWwpOwotCQkJCQlzbWFydEluc2VydEZvckVuZFRhZyhjb21tYW5kLCBkb2N1bWVudCwgbW9kZWwpOwotCQkJCQlzbWFydFJlbW92ZUVuZFRhZyhjb21tYW5kLCBkb2N1bWVudCwgbW9kZWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUHJlZmVyZW5jZUVuYWJsZWQoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gKGtleSAhPSBudWxsICYmIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihrZXkpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudE5vZGUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUgIT0gbnVsbCAmJiBub2RlIGluc3RhbmNlb2YgSURPTUVsZW1lbnQgJiYgKChJRE9NRWxlbWVudCkgbm9kZSkuaXNDb21tZW50VGFnKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RvY3VtZW50Tm9kZShJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0cyB0byBjbGVhbiB1cCBhbiBlbmQtdGFnIGlmIGEgc3RhcnQtdGFnIGlzIGNvbnZlcnRlZCBpbnRvIGFuIGVtcHR5LWVsZW1lbnQKLQkgKiB0YWcgKGUuZy4sIDxub2RlIC8+KSBhbmQgdGhlIG9yaWdpbmFsIGVsZW1lbnQgd2FzIGVtcHR5LgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kIHRoZSBkb2N1bWVudCBjb21tYW5kIGRlc2NyaWJpbmcgdGhlIGNoYW5nZQotCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQgdGhhdCB3aWxsIGJlIGNoYW5nZWQKLQkgKiBAcGFyYW0gbW9kZWwgdGhlIG1vZGVsIGJhc2VkIG9uIHRoZSBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBzbWFydFJlbW92ZUVuZFRhZyhEb2N1bWVudENvbW1hbmQgY29tbWFuZCwgSURvY3VtZW50IGRvY3VtZW50LCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCXRyeSB7Ci0JCQkvLyBBbiBvcGVuaW5nIHRhZyBpcyBub3cgYSBzZWxmLXRlcm1pbmF0ZWQgZW5kLXRhZwotCQkJaWYgKCIvIi5lcXVhbHMoY29tbWFuZC50ZXh0KSAmJiAiPiIuZXF1YWxzKGRvY3VtZW50LmdldChjb21tYW5kLm9mZnNldCwgMSkpICYmIGNvbW1hbmQubGVuZ3RoID09IDAgJiYgaXNQcmVmZXJlbmNlRW5hYmxlZChIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX1JFTU9WRV9FTkRfVEFHUykpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihjb21tYW5kLm9mZnNldCk7Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCAmJiAhbm9kZS5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWlmKHJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiAmJiBjb21tYW5kLm9mZnNldCA8PSByZWdpb24uZ2V0RW5kKCkpIHsKLQkJCQkJCQotCQkJCQkJLyogaWYgdGhlIHJlZ2lvbiBiZWZvcmUgdGhlIGNvbW1hbmQgb2Zmc2V0IGlzIGEgYW4gYXR0cmlidXRlIHZhbHVlIHJlZ2lvbgotCQkJCQkJICogY2hlY2sgdG8gc2VlIGlmIGl0IGhhcyBib3RoIGFuZCBvcGVuaW5nIGFuZCBjbG9zaW5nIHF1b3RlCi0JCQkJCQkgKi8KLQkJCQkJCUlUZXh0UmVnaW9uIHByZXZUZXh0UmVnaW9uID0gcmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGNvbW1hbmQub2Zmc2V0LTEpOwotCQkJCQkJYm9vbGVhbiBpblVuY2xvc2VkQXR0VmFsdWVSZWdpb24gPSBmYWxzZTsKLQkJCQkJCWlmKHByZXZUZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQkJLy9nZXQgdGhlIHRleHQgb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSByZWdpb24KLQkJCQkJCQlTdHJpbmcgcHJldlRleHQgPSByZWdpb24uZ2V0VGV4dChwcmV2VGV4dFJlZ2lvbik7Ci0JCQkJCQkJaW5VbmNsb3NlZEF0dFZhbHVlUmVnaW9uID0gKHByZXZUZXh0LnN0YXJ0c1dpdGgoIiciKSAmJiAoKHByZXZUZXh0Lmxlbmd0aCgpID09IDEpIHx8ICFwcmV2VGV4dC5lbmRzV2l0aCgiJyIpKSkgfHwKLQkJCQkJCQkJKHByZXZUZXh0LnN0YXJ0c1dpdGgoIlwiIikgJiYgKChwcmV2VGV4dC5sZW5ndGgoKSA9PSAxKSB8fCAhcHJldlRleHQuZW5kc1dpdGgoIlwiIikpKTsKLQkJCQkJCX0gCi0JCQkJCQotCQkJCQkJLy9pZiBjb21tYW5kIG9mZnNldCBpcyBpbiBhbiB1bmNsb3NlZCBhdHRyaWJ1dGUgdmFsdWUgcmVnaW9uIHRoZW4gZG9uZSByZW1vdmUgdGhlIGVuZCB0YWcKLQkJCQkJCWlmKCFpblVuY2xvc2VkQXR0VmFsdWVSZWdpb24pIHsKLQkJCQkJCQlyZWdpb24gPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQkJCWlmIChyZWdpb24gIT0gbnVsbCAmJiByZWdpb24uaXNFbmRlZCgpKSB7Ci0JCQkJCQkJCWRvY3VtZW50LnJlcGxhY2UocmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNtYXJ0SW5zZXJ0Rm9yQ29tbWVudChEb2N1bWVudENvbW1hbmQgY29tbWFuZCwgSURvY3VtZW50IGRvY3VtZW50LCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoY29tbWFuZC50ZXh0LmVxdWFscygiLSIpICYmIGRvY3VtZW50LmdldExlbmd0aCgpID49IDMgJiYgZG9jdW1lbnQuZ2V0KGNvbW1hbmQub2Zmc2V0IC0gMywgMykuZXF1YWxzKCI8IS0iKSAmJiBpc1ByZWZlcmVuY2VFbmFibGVkKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfQ09NTUVOVFMpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWNvbW1hbmQudGV4dCArPSAiICAtLT4iOyAvLyROT04tTkxTLTEkCi0JCQkJY29tbWFuZC5zaGlmdHNDYXJldCA9IGZhbHNlOwotCQkJCWNvbW1hbmQuY2FyZXRPZmZzZXQgPSBjb21tYW5kLm9mZnNldCArIDI7Ci0JCQkJY29tbWFuZC5kb2l0ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0cyB0byBpbnNlcnQgdGhlIGVuZCB0YWcgd2hlbiBjb21wbGV0aW5nIGEgc3RhcnQtdGFnIHdpdGggdGhlICcmZ3Q7JyBjaGFyYWN0ZXIuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRDbG9zZUVsZW1lbnQoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl0cnkgewotCQkJLy8gQ2hlY2sgdGVybWluYXRpbmcgc3RhcnQgdGFnLCBidXQgaWdub3JlIGVtcHR5LWVsZW1lbnQgdGFncwotCQkJaWYgKGNvbW1hbmQudGV4dC5lcXVhbHMoIj4iKSAmJiBkb2N1bWVudC5nZXRMZW5ndGgoKSA+IDAgJiYgZG9jdW1lbnQuZ2V0Q2hhcihjb21tYW5kLm9mZnNldCAtIDEpICE9ICcvJyAmJiBpc1ByZWZlcmVuY2VFbmFibGVkKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRUxFTUVOVFMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGNvbW1hbmQub2Zmc2V0IC0gMSk7Ci0JCQkJYm9vbGVhbiBpc0Nsb3NlZEJ5UGFyZW50ID0gZmFsc2U7Ci0JCQkJLy8gT25seSBpbnNlcnQgYW4gZW5kLXRhZyBpZiBuZWNlc3NhcnkuIEJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgZG9jdW1lbnQgaXMgcGFyc2VkLCBpdCBpcyBwb3NzaWJsZSBmb3IgYSBjaGlsZCB0YWcgd2l0aCB0aGUgc2FtZQotCQkJCS8vIG5hbWUgYXMgYW4gYW5jZXN0b3IgdG8gYmUgcGFpcmVkIHdpdGggdGhlIGVuZC10YWcgb2YgYW4gYW5jZXN0b3IsIHNvIHRoZSBhbmNlc3RvcnMgbXVzdCBiZSBjaGVja2VkIGZvciBhbiB1bmNsb3NlZCB0YWcuCi0JCQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKCFub2RlLmlzQ2xvc2VkKCkgfHwgKGlzQ2xvc2VkQnlQYXJlbnQgPSBoYXNVbmNsb3NlZEFuY2VzdG9yKG5vZGUpKSkpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpZiAocmVnaW9uICE9IG51bGwgJiYgcmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCkgPiAwICYmIHJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDApLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4gJiYgIWlzQ2xvc2VkQnlQYXJlbnQpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihub2RlKTsKLQkJCQkJLy8gSWYgaXQncyBYSFRNTCwgYWx3YXlzIGdlbmVyYXRlIHRoZSBlbmQgdGFnCi0JCQkJCWlmIChpc1hIVE1MKG5vZGUpIHx8IHNob3VsZEdlbmVyYXRlRW5kVGFnKGRlY2wpKSB7Ci0JCQkJCQljb21tYW5kLnRleHQgKz0gIjwvIiArIGdldEVsZW1lbnROYW1lKG5vZGUsIGNvbW1hbmQub2Zmc2V0KSArICI+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQljb21tYW5kLnNoaWZ0c0NhcmV0ID0gZmFsc2U7Ci0JCQkJCQljb21tYW5kLmNhcmV0T2Zmc2V0ID0gY29tbWFuZC5vZmZzZXQgKyAxOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBlbGVtZW50IG5hbWUgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgYnkgY2xvc2luZyB0aGUgc3RhcnQgdGFnLiBEZWZhdWx0cwotCSAqIHRvIHRoZSBub2RlJ3Mgbm9kZU5hbWUuCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdGhhdCBpcyBiZWluZyBlZGl0ZWQKLQkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW4gdGhlIGRvY3VtZW50IHdoZXJlIHRoZSBzdGFydCB0YWcgaXMgY2xvc2VkCi0JICogQHJldHVybiBUaGUgZWxlbWVudCBuYW1lIG9mIHRoZSB0YWcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRFbGVtZW50TmFtZShJRE9NTm9kZSBub2RlLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gcmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCWlmICh0ZXh0UmVnaW9uICE9IG51bGwgJiYgdGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCWludCBuYW1lU3RhcnQgPSByZWdpb24uZ2V0U3RhcnRPZmZzZXQodGV4dFJlZ2lvbik7Ci0JCQlTdHJpbmcgcmVnaW9uVGV4dCA9IHJlZ2lvbi5nZXRUZXh0KHRleHRSZWdpb24pOwotCQkJaW50IGxlbmd0aCA9IG9mZnNldCAtIG5hbWVTdGFydDsKLQkJCWlmIChsZW5ndGggPD0gcmVnaW9uVGV4dC5sZW5ndGgoKSkKLQkJCQluYW1lID0gcmVnaW9uVGV4dC5zdWJzdHJpbmcoMCwgbGVuZ3RoKTsKLQkJfQotCQkKLQkJLy8gRGVmYXVsdCB0byB0aGUgbm9kZSBuYW1lCi0JCWlmIChuYW1lID09IG51bGwpCi0JCQluYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JFbmRUYWcoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl0cnkgewotCQkJaWYgKGNvbW1hbmQudGV4dC5lcXVhbHMoIi8iKSAmJiBkb2N1bWVudC5nZXRMZW5ndGgoKSA+PSAxICYmIGRvY3VtZW50LmdldChjb21tYW5kLm9mZnNldCAtIDEsIDEpLmVxdWFscygiPCIpICYmIGlzUHJlZmVyZW5jZUVuYWJsZWQoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9FTkRfVEFHUykpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJSURPTU5vZGUgcGFyZW50Tm9kZSA9IChJRE9NTm9kZSkgKChJRE9NTm9kZSkgbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihjb21tYW5kLm9mZnNldCAtIDEpKS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKGlzQ29tbWVudE5vZGUocGFyZW50Tm9kZSkpIHsKLQkJCQkJLy8gbG9vcCBhbmQgZmluZCBub24gY29tbWVudCBub2RlIHBhcmVudAotCQkJCQl3aGlsZSAocGFyZW50Tm9kZSAhPSBudWxsICYmIGlzQ29tbWVudE5vZGUocGFyZW50Tm9kZSkpIHsKLQkJCQkJCXBhcmVudE5vZGUgPSAoSURPTU5vZGUpIHBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCFpc0RvY3VtZW50Tm9kZShwYXJlbnROb2RlKSkgewotCQkJCQkvLyBvbmx5IGFkZCBlbmQgdGFnIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IG9yIGlmCi0JCQkJCS8vIGFkZCAnLycgZG9lcyBub3QgY3JlYXRlIG9uZSBhbHJlYWR5Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gcGFyZW50Tm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJSURPTU5vZGUgYW5jZXN0b3IgPSBwYXJlbnROb2RlOwotCQkJCQlib29sZWFuIHNtYXJ0SW5zZXJ0Rm9yRW5kID0gZmFsc2U7Ci0JCQkJCWlmKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkvLyBMb29rIGZvciBhbmNlc3RvcnMgYnkgdGhlIHNhbWUgbmFtZSB0aGF0IGFyZSBtaXNzaW5nIGVuZCB0YWdzCi0JCQkJCQl3aGlsZSgoYW5jZXN0b3IgPSAoSURPTU5vZGUpIGFuY2VzdG9yLmdldFBhcmVudE5vZGUoKSkgIT0gbnVsbCkgewotCQkJCQkJCWlmKGFuY2VzdG9yLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwgJiYgcGFyZW50Tm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscyhhbmNlc3Rvci5nZXROb2RlTmFtZSgpKSkgewotCQkJCQkJCQlzbWFydEluc2VydEZvckVuZCA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwgfHwgc21hcnRJbnNlcnRGb3JFbmQpIHsKLQkJCQkJCVN0cmluZ0J1ZmZlciB0b0FkZCA9IG5ldyBTdHJpbmdCdWZmZXIocGFyZW50Tm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCQkJCWlmICh0b0FkZC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQl0b0FkZC5hcHBlbmQoIj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBzdWZmaXggPSB0b0FkZC50b1N0cmluZygpOwotCQkJCQkJCWlmICgoZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPCBjb21tYW5kLm9mZnNldCArIHN1ZmZpeC5sZW5ndGgoKSkgfHwgKCFzdWZmaXguZXF1YWxzKGRvY3VtZW50LmdldChjb21tYW5kLm9mZnNldCwgc3VmZml4Lmxlbmd0aCgpKSkpKSB7Ci0JCQkJCQkJCWNvbW1hbmQudGV4dCArPSBzdWZmaXg7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIDxjb2RlPm5vZGU8L2NvZGU+IGhhcyBhbiB1bmNsb3NlZCBhbmNlc3RvciBieSB0aGUgc2FtZSBuYW1lCi0JICogCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRydWUgaWYgPGNvZGU+bm9kZTwvY29kZT4gaGFzIGFuIHVuY2xvc2VkIHBhcmVudCB3aXRoIHRoZSBzYW1lIG5vZGUgbmFtZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNVbmNsb3NlZEFuY2VzdG9yKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTU5vZGUgcGFyZW50ID0gKElET01Ob2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSAmJiBwYXJlbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSkgewotCQkJaWYgKCFwYXJlbnQuaXNDbG9zZWQoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXBhcmVudCA9IChJRE9NTm9kZSkgcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQmFzZWQgb24gdGhlIGNvbnRlbnQgbW9kZWwsIGRldGVybWluZSBpZiBhbiBlbmQgdGFnIHNob3VsZCBiZSBnZW5lcmF0ZWQKLQkgKiBAcGFyYW0gZWxlbWVudERlY2wgdGhlIGNvbnRlbnQgbW9kZWwgZWxlbWVudCBkZWNsYXJhdGlvbgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZW5kIHRhZyBzaG91bGQgYmUgZ2VuZXJhdGVkOyBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZEdlbmVyYXRlRW5kVGFnKENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsKSB7Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZWxlbWVudERlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQlpZiAoKChCb29sZWFuKSBlbGVtZW50RGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJaWYgKGVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVN0cmluZyBvbW1pc3Npb24gPSAoU3RyaW5nKSBlbGVtZW50RGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSk7Ci0JCQkJaWYgKG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkQpIHx8IG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfREVGQVVMVCkgfHwgb21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9NVVNUKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oTm9kZSBub2RlKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhlIG5vZGUgcGFydCBvZiBhbiBYSFRNTCBkb2N1bWVudAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1hIVE1MKE5vZGUgbm9kZSkgewotCQlEb2N1bWVudCBkb2MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKCEoZG9jIGluc3RhbmNlb2YgSURPTURvY3VtZW50KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIHR5cGVpZCA9ICgoSURPTURvY3VtZW50KSBkb2MpLmdldERvY3VtZW50VHlwZUlkKCk7Ci0JCWlmICh0eXBlaWQgIT0gbnVsbCkgewotCQkJSFRNTERvY3VtZW50VHlwZUVudHJ5IGVudHJ5ID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RW50cnkodHlwZWlkKTsKLQkJCXJldHVybiAoZW50cnkgIT0gbnVsbCAmJiBlbnRyeS5pc1hNTFR5cGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFjdGl2ZSB0ZXh0IGVkaXRvciBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIHRoZSBhY3RpdmUgZWRpdG9yCi0JICogcGFydC4KLQkgKiAKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldEFjdGl2ZVRleHRFZGl0b3IoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQkJCQlyZXR1cm4gZWRpdG9yOwotCQkJCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gdGV4dEVkaXRvcjsKLQkJCQkJcmV0dXJuIGVkaXRvcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DdXN0b21UZW1wbGF0ZVByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiMGYyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZVByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWw7Ci0KLS8qKgotICogUHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIG1ha2UgdGhlIGFkZGl0aW9uYWwgcHJvcG9zYWwgaW5mbyBpbnRvIGNvbnRlbnQKLSAqIGZpdCBmb3IgYW4gSFRNTCB2aWV3ZXIgKGJ5IGVzY2FwaW5nIGNoYXJhY3RlcnMpCi0gKi8KLWNsYXNzIEN1c3RvbVRlbXBsYXRlUHJvcG9zYWwgZXh0ZW5kcyBUZW1wbGF0ZVByb3Bvc2FsIGltcGxlbWVudHMgSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Ci0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdAotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdAotCi0JcHVibGljIEN1c3RvbVRlbXBsYXRlUHJvcG9zYWwoVGVtcGxhdGUgdGVtcGxhdGUsIFRlbXBsYXRlQ29udGV4dCBjb250ZXh0LCBJUmVnaW9uIHJlZ2lvbiwgSW1hZ2UgaW1hZ2UsIGludCByZWxldmFuY2UpIHsKLQkJc3VwZXIodGVtcGxhdGUsIGNvbnRleHQsIHJlZ2lvbiwgaW1hZ2UsIHJlbGV2YW5jZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotCQlTdHJpbmcgYWRkaXRpb25hbEluZm8gPSBzdXBlci5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCXJldHVybiBTdHJpbmdVdGlscy5jb252ZXJ0VG9IVE1MQ29udGVudChhZGRpdGlvbmFsSW5mbyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2MyY2VkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5IVE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTENvbnRlbnRNb2RlbEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MUmVsZXZhbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyBpcyBubyBsb25nZXIgdXNlZCBsb2NhbGx5IGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZQotICogQHNlZSBIVE1MU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IKLSAqLwotcHVibGljIGNsYXNzIEhUTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCXByaXZhdGUgSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5Rm9yQ1NTID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBmUHJlZmVyZW5jZVN0b3JlID0gbnVsbDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1hIVE1MID0gZmFsc2U7Ci0JcHJpdmF0ZSBIVE1MVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIGZUZW1wbGF0ZVByb2Nlc3NvciA9IG51bGw7Ci0JcHJpdmF0ZSBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBmSlNDb250ZW50QXNzaXN0UHJvY2Vzc29yID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZlRlbXBsYXRlQ29udGV4dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0KLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuQVRUUklCVVRFKTsKLQkJc3VwZXIuYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5BVFRSSUJVVEVfVkFMVUUpOwotCQlzdXBlci5hZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBwcm9wb3NhbHMgZm9yIGEgY29tcGxldGVseSBlbXB0eSBkb2N1bWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5ORVcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFBDREFUQVByb3Bvc2FsKFN0cmluZyBub2RlTmFtZSwgQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJaWYgKGlzWEhUTUwpCi0JCQlzdXBlci5hZGRQQ0RBVEFQcm9wb3NhbChub2RlTmFtZSwgY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJaWYgKGlzWEhUTUwpCi0JCQlhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuVEFHKTsKLQkJc3VwZXIuYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjaGlsZFBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRlbXBsYXRlcyB0byB0aGUgbGlzdCBvZiBwcm9wb3NhbHMKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUZW1wbGF0ZXMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIFN0cmluZyBjb250ZXh0KSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY29udGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRlbXBsYXRlcyB0byB0aGUgbGlzdCBvZiBwcm9wb3NhbHMKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEBwYXJhbSBzdGFydE9mZnNldAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUZW1wbGF0ZXMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnRPZmZzZXQpIHsKLQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBpZiBhbHJlYWR5IGFkZGluZyB0ZW1wbGF0ZSBwcm9wb3NhbHMgZm9yIGEgY2VydGFpbiBjb250ZXh0IHR5cGUsIGRvCi0JCS8vIG5vdCBhZGQgYWdhaW4KLQkJaWYgKCFmVGVtcGxhdGVDb250ZXh0cy5jb250YWlucyhjb250ZXh0KSkgewotCQkJZlRlbXBsYXRlQ29udGV4dHMuYWRkKGNvbnRleHQpOwotCQkJYm9vbGVhbiB1c2VQcm9wb3NhbExpc3QgPSAhY29udGVudEFzc2lzdFJlcXVlc3Quc2hvdWxkU2VwYXJhdGUoKTsKLQotCQkJaWYgKGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpICE9IG51bGwpIHsKLQkJCQlnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5zZXRDb250ZXh0VHlwZShjb250ZXh0KTsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZlRleHRWaWV3ZXIsIHN0YXJ0T2Zmc2V0KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3Bvc2Fscy5sZW5ndGg7ICsraSkgewotCQkJCQlpZiAodXNlUHJvcG9zYWxMaXN0KQotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWxzW2ldKTsKLQkJCQkJZWxzZQotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkTWFjcm8ocHJvcG9zYWxzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiZWdpbnNXaXRoKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgcHJlZml4KSB7Ci0JCWlmIChhU3RyaW5nID09IG51bGwgfHwgcHJlZml4ID09IG51bGwgfHwgcHJlZml4Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaW50IG1pbmltdW1MZW5ndGggPSBNYXRoLm1pbihwcmVmaXgubGVuZ3RoKCksIGFTdHJpbmcubGVuZ3RoKCkpOwotCQlTdHJpbmcgYmVnaW5uaW5nID0gYVN0cmluZy5zdWJzdHJpbmcoMCwgbWluaW11bUxlbmd0aCk7Ci0JCXJldHVybiBiZWdpbm5pbmcuZXF1YWxzSWdub3JlQ2FzZShwcmVmaXgpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSB0cmVlTm9kZSwgSURPTU5vZGUgeG1sbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCByZXF1ZXN0ID0gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJLy8gYnVnMTE1OTI3IHVzZSBvcmlnaW5hbCBkb2N1bWVudCBwb3NpdGlvbiBmb3IgYWxsL2FueSByZWdpb24gdGVtcGxhdGVzCi0JCWFkZFRlbXBsYXRlcyhyZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5BTEwsIGRvY3VtZW50UG9zaXRpb24pOwotCQlyZXR1cm4gcmVxdWVzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHByb3Bvc2VkIGNvZGUgY29tcGxldGlvbnMgYmFzZWQgb24gdGhlIHNwZWNpZmllZAotCSAqIGxvY2F0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBjdXJzb3IKLQkgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIHRleHQtZWRpdG9yIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiAgICAgICAgICAgIGEgbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29kZS1hc3Npc3QgaXRlbXMKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCWZUZW1wbGF0ZUNvbnRleHRzLmNsZWFyKCk7Ci0KLQkJSW5kZXhlZFJlZ2lvbiB0cmVlTm9kZSA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIHRyZWVOb2RlOwotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLQkJLy8gY2hlY2sgaWYgaXQncyBpbiBhIGNvbW1lbnQgbm9kZQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm4gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmIChmbiAhPSBudWxsICYmIGZuLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQgJiYgZG9jdW1lbnRQb3NpdGlvbiAhPSBmbi5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCX0KLQotCQkvLyBDTVZDIDI0MjY5NQotCQkvLyBpZiBpdCdzIGEgPC9zY3JpcHQ+IHRhZywgYm91bmNlIGJhY2sgdG8gSlMgY2EgcHJvY2Vzc29yLi4uCi0JCWlmIChmbiAhPSBudWxsICYmIGZuLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSAmJiBkb2N1bWVudFBvc2l0aW9uID09IGZuLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCB2ID0gZm4uZ2V0UmVnaW9ucygpOwotCQkJaWYgKHYuc2l6ZSgpID4gMSkgewotCQkJCS8vIGRldGVybWluZSB0aGF0IGl0J3MgYSBjbG9zZSB0YWcKLQkJCQlpZiAoKHYuZ2V0KDApKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJCUl0ZXJhdG9yIGl0ID0gdi5pdGVyYXRvcigpOwotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQkJCQkvLyBzZWFyY2ggZm9yIHNjcmlwdCB0YWcgbmFtZQotCQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCQlyZWdpb24gPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCQkJCWlmIChmbi5nZXRUZXh0KHJlZ2lvbikuZXF1YWxzSWdub3JlQ2FzZSgic2NyaXB0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGpzUHJvY2Vzc29yID0gZ2V0SlNDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCQkJCQkJaWYgKGpzUHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCQkJCQkJcmV0dXJuIGpzUHJvY2Vzc29yLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHRleHRWaWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpc1hIVE1MID0gZ2V0WEhUTUwobm9kZSk7Ci0KLQkJZkdlbmVyYXRvciA9IG51bGw7IC8vIGZvcmNlIHJlbG9hZCBvZiBjb250ZW50IGdlbmVyYXRvcgotCi0JCS8vIGhhbmRsZSBibGFuayBIVE1MIGRvY3VtZW50IGNhc2UKLQkJaWYgKHRyZWVOb2RlID09IG51bGwgfHwgaXNWaWV3ZXJFbXB0eSh0ZXh0Vmlld2VyKSkgewotCQkJLy8gY3Vyc29yIGlzIGF0IHRoZSBFT0YKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWwgaHRtbFRhZ1Byb3Bvc2FsID0gZ2V0SFRNTFRhZ1Byb3Bvc2FsKHRleHRWaWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHN1cGVyUmVzdWx0cyA9IHN1cGVyLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHRleHRWaWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJaWYgKHN1cGVyUmVzdWx0cyAhPSBudWxsICYmIHN1cGVyUmVzdWx0cy5sZW5ndGggPiAwICYmIGh0bWxUYWdQcm9wb3NhbCAhPSBudWxsKSB7Ci0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGJsYW5rSFRNTERvY1Jlc3VsdHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtzdXBlclJlc3VsdHMubGVuZ3RoICsgMV07Ci0JCQkJYmxhbmtIVE1MRG9jUmVzdWx0c1swXSA9IGh0bWxUYWdQcm9wb3NhbDsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHN1cGVyUmVzdWx0cywgMCwgYmxhbmtIVE1MRG9jUmVzdWx0cywgMSwgc3VwZXJSZXN1bHRzLmxlbmd0aCk7Ci0JCQkJcmV0dXJuIGJsYW5rSFRNTERvY1Jlc3VsdHM7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCi0JCQkvLyBjaGVjayBlbWJlZGRlZCBDU1MgcHJvcG9zYWxzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIFNUWUxFIGVuZAotCQkJLy8gdGFnCi0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsICYmIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NUWUxFKSkgey8vJE5PTi1OTFMtMSQKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsICYmIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpID09IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCWludCBvZmZzZXQgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCWludCBwb3MgPSBkb2N1bWVudFBvc2l0aW9uIC0gb2Zmc2V0OwotCQkJCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IGdldENTU1Byb3Bvc2Fscyh0ZXh0Vmlld2VyLCBwb3MsIG5vZGUsIG9mZnNldCwgKGNoYXIpIDApOwotCQkJCQkJaWYgKHByb3Bvc2FscyAhPSBudWxsKQotCQkJCQkJCXJldHVybiBwcm9wb3NhbHM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIGlubGluZSBDU1MgcHJvcG9zYWxzCi0JCQkvLyBuZWVkIHRvIGZpbmQgYXR0ciByZWdpb24gZnJvbSBzZCByZWdpb24KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHRleHRWaWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJSXRlcmF0b3IgcmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJSVRleHRSZWdpb24gc3R5bGVOYW1lUmVnaW9uID0gbnVsbDsKLQkJCUlUZXh0UmVnaW9uIHN0eWxlVmFsdWVSZWdpb24gPSBudWxsOwotCQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJc3R5bGVOYW1lUmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCQlpZiAoc3R5bGVOYW1lUmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSAmJiBzZFJlZ2lvbi5nZXRUZXh0KHN0eWxlTmFtZVJlZ2lvbikuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NUWUxFKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIHRoZSBuZXh0IHJlZ2lvbiBzaG91bGQgYmUgIj0iCi0JCQkJCWlmIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJCQkJcmVnaW9ucy5uZXh0KCk7IC8vIHNraXAgdGhlICI9IgotCQkJCQkJLy8gbmV4dCByZWdpb24gc2hvdWxkIGJlIGF0dHIgdmFsdWUgcmVnaW9uCi0JCQkJCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQkJCQlzdHlsZVZhbHVlUmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHN0eWxlVmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCWludCBvZmZzZXQgPSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChzdHlsZVZhbHVlUmVnaW9uKTsKLQkJCQlpbnQgZW5kID0gc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChzdHlsZVZhbHVlUmVnaW9uKTsKLQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+PSBvZmZzZXQgJiYgZG9jdW1lbnRQb3NpdGlvbiA8PSBlbmQpIHsKLQkJCQkJYm9vbGVhbiBhc2tDU1MgPSB0cnVlOwotCQkJCQljaGFyIHF1b3RlID0gKGNoYXIpIDA7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gc2RSZWdpb24uZ2V0VGV4dChzdHlsZVZhbHVlUmVnaW9uKTsKLQkJCQkJaW50IGxlbmd0aCA9ICh0ZXh0ICE9IG51bGwgPyB0ZXh0Lmxlbmd0aCgpIDogMCk7Ci0JCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQljaGFyIGZpcnN0Q2hhciA9IHRleHQuY2hhckF0KDApOwotCQkJCQkJaWYgKGZpcnN0Q2hhciA9PSAnIicgfHwgZmlyc3RDaGFyID09ICdcJycpIHsKLQkJCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA9PSBvZmZzZXQpIHsKLQkJCQkJCQkJLy8gYmVmb3JlIHF1b3RlCi0JCQkJCQkJCWFza0NTUyA9IGZhbHNlOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJb2Zmc2V0Kys7Ci0JCQkJCQkJCXF1b3RlID0gZmlyc3RDaGFyOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID09IGVuZCkgewotCQkJCQkJCWlmIChsZW5ndGggPiAxICYmIHRleHQuY2hhckF0KGxlbmd0aCAtIDEpID09IHF1b3RlKSB7Ci0JCQkJCQkJCS8vIGFmdGVyIHF1b3RlCi0JCQkJCQkJCWFza0NTUyA9IGZhbHNlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoYXNrQ1NTKSB7Ci0JCQkJCQlpbnQgcG9zID0gZG9jdW1lbnRQb3NpdGlvbiAtIG9mZnNldDsKLQkJCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBnZXRDU1NQcm9wb3NhbHModGV4dFZpZXdlciwgcG9zLCBub2RlLCBvZmZzZXQsIHF1b3RlKTsKLQkJCQkJCWlmIChwcm9wb3NhbHMgIT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gcHJvcG9zYWxzOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHRleHRWaWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBubyB0ZXh0IG9yIGl0J3MgYWxsIHdoaXRlIHNwYWNlLCBvdGhlcndpc2UKLQkgKiByZXR1cm5zIGZhbHNlCi0JICogCi0JICogQHBhcmFtIHRyZWVOb2RlCi0JICogQHBhcmFtIHRleHRWaWV3ZXIKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWaWV3ZXJFbXB0eShJVGV4dFZpZXdlciB0ZXh0Vmlld2VyKSB7Ci0JCWJvb2xlYW4gaXNFbXB0eSA9IGZhbHNlOwotCQlTdHJpbmcgdGV4dCA9IHRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldFRleHQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCAodGV4dCAhPSBudWxsICYmIHRleHQudHJpbSgpLmVxdWFscygiIikpKSAvLyROT04tTkxTLTEkCi0JCQlpc0VtcHR5ID0gdHJ1ZTsKLQkJcmV0dXJuIGlzRW1wdHk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBJQ29tcGxldGlvblByb3Bvc2FsCi0JICovCi0JcHJpdmF0ZSBJQ29tcGxldGlvblByb3Bvc2FsIGdldEhUTUxUYWdQcm9wb3NhbChJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCUlNb2RlbE1hbmFnZXIgbW0gPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKG1tICE9IG51bGwpIHsKLQkJCQltb2RlbCA9IG1tLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHZpZXdlci5nZXREb2N1bWVudCgpKTsKLQotCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCUlET01Eb2N1bWVudCBkb2MgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0KLQkJCQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jKTsKLQkJCQkJaWYgKG1xICE9IG51bGwpIHsKLQotCQkJCQkJLy8gWEhUTUwgcmVxdWlyZXMgbG93ZXJjYXNlIHRhZ25hbWUgZm9yIGxvb2t1cAotCQkJCQkJQ01Eb2N1bWVudCBjb3JyZXNwb25kaW5nQ01Eb2N1bWVudCA9IG1xLmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KGRvYyk7Ci0JCQkJCQlpZiAoY29ycmVzcG9uZGluZ0NNRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGh0bWxEZWNsID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBjb3JyZXNwb25kaW5nQ01Eb2N1bWVudC5nZXRFbGVtZW50cygpLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTC50b0xvd2VyQ2FzZSgpKTsKLQkJCQkJCQlpZiAoaHRtbERlY2wgIT0gbnVsbCkgewotCQkJCQkJCQlTdHJpbmdCdWZmZXIgcHJvcG9zZWRUZXh0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJCQlnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2VuZXJhdGVUYWcoZG9jLCBodG1sRGVjbCwgcHJvcG9zZWRUZXh0QnVmZmVyKTsKLQotCQkJCQkJCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gcHJvcG9zZWRUZXh0QnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCVN0cmluZyByZXF1aXJlZE5hbWUgPSBnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0UmVxdWlyZWROYW1lKGRvYywgaHRtbERlY2wpOwotCi0JCQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBkb2N1bWVudFBvc2l0aW9uLAotCQkJCQkJCQkvKiBzdGFydCBwb3MgKi8KLQkJCQkJCQkJMCwgLyogcmVwbGFjZSBsZW5ndGggKi8KLQkJCQkJCQkJcmVxdWlyZWROYW1lLmxlbmd0aCgpICsgMiwgLyoKLQkJCQkJCQkJCQkJCQkJCSAqIGN1cnNvciBwb3NpdGlvbgotCQkJCQkJCQkJCQkJCQkJICogYWZ0ZXIKLQkJCQkJCQkJCQkJCQkJCSAqIChyZWxhdnRpdmUgdG8KLQkJCQkJCQkJCQkJCQkJCSAqIHN0YXJ0KQotCQkJCQkJCQkJCQkJCQkJICovCi0JCQkJCQkJCUhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyksIHJlcXVpcmVkTmFtZSwgbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfVEFHX05BTUUpOwotCQkJCQkJCQlyZXN1bHQgPSBwcm9wb3NhbDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbnRlbnRHZW5lcmF0b3IoKQotCSAqLwotCXB1YmxpYyBYTUxDb250ZW50TW9kZWxHZW5lcmF0b3IgZ2V0Q29udGVudEdlbmVyYXRvcigpIHsKLQkJaWYgKGZHZW5lcmF0b3IgPT0gbnVsbCkgewotCQkJaWYgKGlzWEhUTUwpCi0JCQkJZkdlbmVyYXRvciA9IFhIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvci5nZXRJbnN0YW5jZSgpOwotCQkJZWxzZQotCQkJCWZHZW5lcmF0b3IgPSBIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvci5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBmR2VuZXJhdG9yOwotCX0KLQotCXByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0Q1NTUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IHBvcywgSURPTU5vZGUgZWxlbWVudCwgaW50IG9mZnNldCwgY2hhciBxdW90ZSkgewotCi0JCUNTU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IgY3NzUHJvY2Vzc29yID0gbmV3IENTU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKTsKLQkJY3NzUHJvY2Vzc29yLnNldERvY3VtZW50T2Zmc2V0KG9mZnNldCk7Ci0JCWNzc1Byb2Nlc3Nvci5zZXRRdW90ZUNoYXJPZlN0eWxlQXR0cmlidXRlKHF1b3RlKTsKLQotCQlyZXR1cm4gY3NzUHJvY2Vzc29yLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgcG9zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVtcHR5VGFnQ2xvc2VTdHJpbmcoKSB7Ci0JCWlmIChpc1hIVE1MKQotCQkJcmV0dXJuICIgLz4iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAiPiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRKU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCWlmIChmSlNDb250ZW50QXNzaXN0UHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZKU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCgpLmdldENvbnRlbnRBc3Npc3RhbnQobnVsbCkuZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKTsKLQkJfQotCQlyZXR1cm4gZkpTQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQl9Ci0KLQlwcml2YXRlIEhUTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZlRlbXBsYXRlUHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVByb2Nlc3NvciA9IG5ldyBIVE1MVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCk7Ci0JCX0KLQkJcmV0dXJuIGZUZW1wbGF0ZVByb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgdGhpcyBEb2N1bWVudCBpcyBhbiBYSFRNTCBEb2N1bWVudC4gT3ByYXRlcyBzb2xlbHkgb2ZmIG9mCi0JICogdGhlIERvY3VtZW50IFR5cGUgZGVjbGFyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRYSFRNTChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlEb2N1bWVudCBkb2MgPSBudWxsOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkKLQkJCWRvYyA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQllbHNlCi0JCQlkb2MgPSAoKERvY3VtZW50KSBub2RlKTsKLQotCQlpZiAoZG9jIGluc3RhbmNlb2YgSURPTURvY3VtZW50KQotCQkJcmV0dXJuICgoSURPTURvY3VtZW50KSBkb2MpLmlzWE1MVHlwZSgpOwotCi0KLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCU1vZGVsUXVlcnlBZGFwdGVyIGFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9jKS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJCUNNRG9jdW1lbnQgY21kb2MgPSBudWxsOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmdldE1vZGVsUXVlcnkoKSAhPSBudWxsKQotCQkJCWNtZG9jID0gYWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoZG9jKTsKLQkJCWlmIChjbWRvYyAhPSBudWxsKSB7Ci0JCQkJLy8gdHJlYXQgYXMgWEhUTUwgdW5sZXNzIHdlJ3ZlIGdvdCB0aGUgaW4tY29kZSBIVE1MIGNvbnRlbnQKLQkJCQkvLyBtb2RlbAotCQkJCWlmIChjbWRvYyBpbnN0YW5jZW9mIEhUTUxDTURvY3VtZW50KQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKGNtZG9jLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJCQlyZXR1cm4gQm9vbGVhbi5UUlVFLmVxdWFscyhjbWRvYy5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSk7Ci0JCQl9Ci0JCX0KLQkJLy8gdGhpcyBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZAotCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGRvYy5nZXREb2N0eXBlKCk7Ci0JCXJldHVybiBkb2NUeXBlICE9IG51bGwgJiYgZG9jVHlwZS5nZXRQdWJsaWNJZCgpICE9IG51bGwgJiYgZG9jVHlwZS5nZXRQdWJsaWNJZCgpLmluZGV4T2YoIi0vL1czQy8vRFREIFhIVE1MICIpID09IDA7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlyZWluaXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWluaXQoKSB7Ci0JCVN0cmluZyBrZXkgPSBIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFOwotCQlib29sZWFuIGRvQXV0byA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oa2V5KTsKLQkJaWYgKGRvQXV0bykgewotCQkJa2V5ID0gSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFOwotCQkJY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKGtleSkudG9DaGFyQXJyYXkoKTsKLQkJfQotCQllbHNlIHsKLQkJCWNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycyA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoZmFjdG9yeUZvckNTUyAhPSBudWxsKSB7Ci0JCQlmYWN0b3J5Rm9yQ1NTLnJlbGVhc2UoKTsKLQkJfQotCQlpZiAoZkpTQ29udGVudEFzc2lzdFByb2Nlc3NvciBpbnN0YW5jZW9mIElSZWxlYXNhYmxlKSB7Ci0JCQkoKElSZWxlYXNhYmxlKWZKU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IpLnJlbGVhc2UoKTsKLQkJfQotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3RyaW5nc0VxdWFsKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQlyZXR1cm4gYS5lcXVhbHNJZ25vcmVDYXNlKGIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHByb3BlcnR5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQotCQlpZiAocHJvcGVydHkuY29tcGFyZVRvKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UpID09IDAgfHwgcHJvcGVydHkuY29tcGFyZVRvKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0VfQ09ERSkgPT0gMCkgewotCQkJcmVpbml0KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCWlmIChmUHJlZmVyZW5jZVN0b3JlID09IG51bGwpCi0JCQlmUHJlZmVyZW5jZVN0b3JlID0gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlyZXR1cm4gZlByZWZlcmVuY2VTdG9yZTsKLQl9Ci0KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24sIEluZGV4ZWRSZWdpb24gaW5kZXhlZE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmRkODVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvciBleHRlbmRzIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvciBpbnN0YW5jZSA9IG51bGw7Ci0JcHJvdGVjdGVkIGludCBmVGFnQ2FzZTsKLQlwcm90ZWN0ZWQgaW50IGZBdHRyQ2FzZTsKLQotCS8qKgotCSAqIEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJU3RyaW5nIHF1YWxpZmllciA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJZlRhZ0Nhc2UgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRJbnQocXVhbGlmaWVyLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFLCAwLCBudWxsKTsKLQkJZkF0dHJDYXNlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0SW50KHF1YWxpZmllciwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UsIDAsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlRW5kVGFnKFN0cmluZyB0YWdOYW1lLCBOb2RlIHBhcmVudE5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZWxlbWVudERlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQlpZiAoKChCb29sZWFuKSBlbGVtZW50RGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJaWYgKGVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVN0cmluZyBvbW1pc3Npb24gPSAoU3RyaW5nKSBlbGVtZW50RGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSk7Ci0JCQkJaWYgKG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkQpIHx8IG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfREVGQVVMVCkgfHwgb21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9NVVNUKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQlyZXR1cm47Ci0JCWJ1ZmZlci5hcHBlbmQoIjwvIiArIHRhZ05hbWUgKyAiPiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlyZXR1cm47Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZElnbm9yZUNhc2UoQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAoIWNtbm9kZS5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoKEJvb2xlYW4pIGNtbm9kZS5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWlyZWROYW1lKE5vZGUgb3duZXJOb2RlLCBDTU5vZGUgY21ub2RlKSB7Ci0JCVN0cmluZyBuYW1lID0gc3VwZXIuZ2V0UmVxdWlyZWROYW1lKG93bmVyTm9kZSwgY21ub2RlKTsKLQkJLy8gZG9uJ3QgY2hhbmdlIHRoZSBjYXNlIHVubGVzcyB3ZSdyZSBjZXJ0YWluIGl0IGlzIG1lYW5pbmdsZXNzCi0JCWlmIChzaG91bGRJZ25vcmVDYXNlKGNtbm9kZSkpIHsKLQkJCWludCBjYXNlVmFsID0gLTE7Ci0JCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0JCQkJY2FzZVZhbCA9IGZUYWdDYXNlOwotCQkJZWxzZSBpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikKLQkJCQljYXNlVmFsID0gZkF0dHJDYXNlOwotCQkJc3dpdGNoIChjYXNlVmFsKSB7Ci0JCQkJY2FzZSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUiA6Ci0JCQkJCXsKLQkJCQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA6Ci0JCQkJCXsKLQkJCQkJCW5hbWUgPSBuYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGFydFRhZ0Nsb3NlKE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpIHsKLQkJU3RyaW5nIG90aGVyID0gZ2V0T3RoZXJDbG9zZShwYXJlbnROb2RlKTsKLQkJaWYgKG90aGVyICE9IG51bGwpCi0JCQlyZXR1cm4gb3RoZXI7Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKQotCQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZWxlbWVudERlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQlpZiAoKChCb29sZWFuKSBlbGVtZW50RGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJaWYgKGVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQkJCXJldHVybiAiLz4iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgb21taXNzaW9uID0gKFN0cmluZykgZWxlbWVudERlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpOwotCQkJCWlmIChvbW1pc3Npb24uZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EKSB8fCBvbW1pc3Npb24uZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX0RFRkFVTFQpIHx8IG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfTVVTVCkpIHsKLQkJCQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy9pZiBub3QgYW4gaHRtbCBlbGVtZW50IGFuZCBlbXB0eSwgYXNzdW1lIHN0YXJ0IHRhZyBuZWVkcyB0byBiZSBjbG9zZWQKLQkJZWxzZSBpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkgewotCQkJcmV0dXJuICIvPiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiAiPiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbnN0YW5jZS4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yKCk7Ci0JCWluc3RhbmNlLmluaXQoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUxTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0NjE1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUxTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlcjsKLQotLyoqCi0gKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3J9IGZvciBIVE1MIGRvY3VtZW50czwvcD4KLSAqIAotICogPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIHJlYWN0IHRvIHVzZXIgcHJlZmVyZW5jZSBjaGFuZ2VzIGZvciBhdXRvIGFjdGl2YXRpb24KLSAqIGNoYXJhY3RlcnMgZm9yIEhUTUwgcGFnZXM8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZXh0ZW5kcyBTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0JLyoqIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyBmb3IgdGhpcyBwcm9jZXNzb3IsIHNldCBieSB1c2VyIHByZWZlcmVuY2UgKi8KLQlwcml2YXRlIGNoYXJbXSBmQ29tcGxldGlvblByb3BvYXNsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzOwotCi0JLyoqIHRoZSBjb250ZXh0IGluZm9ybWF0aW9uIHZhbGlkYXRvciBmb3IgdGhpcyBwcm9jZXNzb3IgKi8KLQlwcml2YXRlIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZkNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLQkKLQkvKioKLQkgKiA8cD5Db25zdHJ1Y3RvcjwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYXNzaXN0YW50IHtAbGluayBDb250ZW50QXNzaXN0YW50fSB0byB1c2UKLQkgKiBAcGFyYW0gcGFydGl0aW9uVHlwZUlEIHRoZSBwYXJ0aXRpb24gdHlwZSB0aGlzIHByb2Nlc3NvciBpcyBmb3IKLQkgKiBAcGFyYW0gdmlld2VyIHtAbGluayBJVGV4dFZpZXdlcn0gdGhpcyBwcm9jZXNzb3IgaXMgYWN0aW5nIGluCi0JICovCi0JcHVibGljIEhUTUxTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvcihDb250ZW50QXNzaXN0YW50IGFzc2lzdGFudCwKLQkJCVN0cmluZyBwYXJ0aXRpb25UeXBlSUQsIElUZXh0Vmlld2VyIHZpZXdlcikgewotCQkKLQkJc3VwZXIoYXNzaXN0YW50LCBwYXJ0aXRpb25UeXBlSUQsIHZpZXdlciwgSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCWdldEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyUHJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCWlmICh0aGlzLmZDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgPT0gbnVsbCkgewotCQkJdGhpcy5mQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yID0gbmV3IEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlcigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmZDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LlN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiB0aGlzLmZDb21wbGV0aW9uUHJvcG9hc2xBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LlN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yI3Byb3BlcnR5Q2hhbmdlKAotCSAqIAlvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZihldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFKSB8fAotCQkJCWV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0VfQ09ERSkpIHsKLQkJCWdldEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyUHJlZmVyZW5jZXMoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD5HZXRzIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVyIHVzZXIgcHJlZmVyZW5jZXMgYW5kIHN0b3JlcyB0aGVtIGZvciBsYXRlciB1c2U8L3A+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGdldEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyUHJlZmVyZW5jZXMoKSB7Ci0JCVN0cmluZyBrZXkgPSBIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFOwotCQlib29sZWFuIGRvQXV0byA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oa2V5KTsKLQkJaWYgKGRvQXV0bykgewotCQkJa2V5ID0gSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFOwotCQkJdGhpcy5mQ29tcGxldGlvblByb3BvYXNsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKGtleSkudG9DaGFyQXJyYXkoKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuZkNvbXBsZXRpb25Qcm9wb2FzbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycyA9IG51bGw7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MVGFnc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUxUYWdzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhNzdjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUxUYWdzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5IVE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNRWxlbWVudERlY2xhcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0WE1MTW9kZWxRdWVyeUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxSZWxldmFuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIDxwPntAbGluayBBYnN0cmFjdFhNTE1vZGVsUXVlcnlDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcn0gZm9yIEhUTUwgdGFnIHByb3Bvc2FsczwvcD4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxUYWdzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgZXh0ZW5kcwotCQlBYnN0cmFjdFhNTE1vZGVsUXVlcnlDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciB7Ci0JCi0JLyoqIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkb2N1bWVudCB0aGUgcHJvcG9zYWwgcmVxdWVzdCBpcyBvbiBpcyBYSFRNTCAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzWEhUTUwgPSBmYWxzZTsKLQkKLQkvKiogdGhlIGNvbnRleHQgaW5mb3JtYXRpb24gdmFsaWRhdG9yIGZvciB0aGlzIGNvbXB1dGVyICovCi0JcHJpdmF0ZSBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGZDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci0JCi0JLyoqCi0JICogVE9ETzogSUFOOiBDb21tZW50IG1lCi0JICovCi0JcHVibGljIEhUTUxUYWdzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIoKSB7Ci0JCXRoaXMuZkNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIDxwPkRldGVybWluZSBpZiB0aGUgZG9jdW1lbnQgaXMgWEhUTUwgb3Igbm90LCB0aGVuIGNvbXB1dGUgdGhlIHByb3Bvc2FsczwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2NvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIExpc3QgY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQkvL2RldGVybWluZSBpZiB0aGUgY29udGVudCBpcyBYSFRNTCBvciBub3QKLQkJSW5kZXhlZFJlZ2lvbiB0cmVlTm9kZSA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQoY29udGV4dC5nZXRWaWV3ZXIoKSwKLQkJCQljb250ZXh0LmdldEludm9jYXRpb25PZmZzZXQoKSk7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIHRyZWVOb2RlOwotCQlib29sZWFuIGlzWEhUTUxOb2RlID0gaXNYSFRNTE5vZGUobm9kZSk7Ci0JCWlmKHRoaXMuaXNYSFRNTCAhPSBpc1hIVE1MTm9kZSkgewotCQkJdGhpcy5pc1hIVE1MID0gaXNYSFRNTE5vZGU7Ci0JCX0KLQkJCi0JCS8vY29tcHV0ZSB0aGUgY29tcGxldGlvbiBwcm9wb3NhbHMKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGNvbnRleHQsIG1vbml0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkKLQkJQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJvdmlkZXIgYXR0cmlidXRlSW5mb1Byb3ZpZGVyID0KLQkJCW5ldyBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25Qcm92aWRlcigoSVN0cnVjdHVyZWREb2N1bWVudCljb250ZXh0LmdldERvY3VtZW50KCksCi0JCQkJCShBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIpIGdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpKTsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QoYXR0cmlidXRlSW5mb1Byb3ZpZGVyLmdldEF0dHJpYnV0ZUluZm9ybWF0aW9uKGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpKSk7Ci0JfQotCQotCS8qKgotCSAqIDxwPkRlcGVuZGVudCBvbiBpZiB0aGUgZG9jdW1lbnQgaXMgWEhUTUwgb3Igbm90PC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0WE1MTW9kZWxRdWVyeUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2dldENvbnRlbnRHZW5lcmF0b3IoKQotCSAqLwotCXByb3RlY3RlZCBYTUxDb250ZW50TW9kZWxHZW5lcmF0b3IgZ2V0Q29udGVudEdlbmVyYXRvcigpIHsKLQkJaWYgKGlzWEhUTUwpIHsKLQkJCXJldHVybiBYSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvci5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPkZpbHRlciBvdXQgYWxsIHtAbGluayBDTU5vZGV9cyBleGNlcHQgdGhvc2Ugc3BlY2lmaWMgdG8gSFRNTCBkb2N1bWVudHM8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RYTUxNb2RlbFF1ZXJ5Q29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjdmFsaWRNb2RlbFF1ZXJ5Tm9kZShvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZE1vZGVsUXVlcnlOb2RlKENNTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gaXNWYWxpZCA9IGZhbHNlOwotCQlPYmplY3QgY21kb2MgPSBub2RlLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNtZG9jIGluc3RhbmNlb2YgQ01Ob2RlKSB7Ci0JCQlTdHJpbmcgbmFtZSA9ICgoQ01Ob2RlKSBjbWRvYykuZ2V0Tm9kZU5hbWUoKTsKLQkJCWlzVmFsaWQgPSBuYW1lICE9IG51bGwgJiYgbmFtZS5lbmRzV2l0aCgiLmR0ZCIpICYmIG5hbWUuaW5kZXhPZigiaHRtbCIpICE9IC0xOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIGlmIChub2RlLnN1cHBvcnRzKEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbi5JU19IVE1MKSkgewotCQkJQm9vbGVhbiBpc0hUTUwgPSAoQm9vbGVhbikgbm9kZS5nZXRQcm9wZXJ0eShIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24uSVNfSFRNTCk7Ci0JCQlpc1ZhbGlkID0gaXNIVE1MID09IG51bGwgfHwgaXNIVE1MLmJvb2xlYW5WYWx1ZSgpOwotCQl9IGVsc2UgaWYobm9kZSBpbnN0YW5jZW9mIEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uKSB7Ci0JCQlIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBwcm9wRGVjID0gKEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uKW5vZGU7Ci0JCQlpc1ZhbGlkID0gIXByb3BEZWMuaXNKU1AoKTsKLQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiB8fCBub2RlIGluc3RhbmNlb2YgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKSB7Ci0JCQlpc1ZhbGlkID0gdHJ1ZTsKLQkJfSBlbHNlIGlmKG5vZGUgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJQm9vbGVhbiBpc1hIVE1MID0gKChCb29sZWFuKW5vZGUuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCkpOwotCQkJaXNWYWxpZCA9IGlzWEhUTUwgIT0gbnVsbCAmJiBpc1hIVE1MLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0KLQkJLy8gRG8gbm90IHByb3Bvc2Ugb2Jzb2xldGUgdGFncywgcmVnYXJkbGVzcwotCQlpZiAoaXNWYWxpZCAmJiBub2RlLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSVNfT0JTT0xFVEUpKSB7Ci0JCQlCb29sZWFuIGlzT2Jzb2xldGUgPSAoKEJvb2xlYW4pIG5vZGUuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19PQlNPTEVURSkpOwotCQkJaXNWYWxpZCA9ICEoaXNPYnNvbGV0ZSAhPSBudWxsICYmIGlzT2Jzb2xldGUuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0KLQkJcmV0dXJuIGlzVmFsaWQ7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0WE1MTW9kZWxRdWVyeUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2FkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW1wdHlEb2N1bWVudFByb3Bvc2FscygKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkKLQkJYWRkSFRNTFRhZ1Byb3Bvc2FsKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0KTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RYTUxNb2RlbFF1ZXJ5Q29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjYWRkU3RhcnREb2N1bWVudFByb3Bvc2FscyhvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3QsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdGFydERvY3VtZW50UHJvcG9zYWxzKAotCQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCQotCQkvL2RldGVybWluZSBpZiBYTUxQSSBpcyBmaXJzdCBlbGVtZW50Ci0JCU5vZGUgYU5vZGUgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0JCURvY3VtZW50IG93bmluZ0RvY3VtZW50ID0gYU5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlOb2RlIGZpcnN0ID0gb3duaW5nRG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQlib29sZWFuIHhtbHBpSXNGaXJzdEVsZW1lbnQgPSAoKGZpcnN0ICE9IG51bGwpICYmIChmaXJzdC5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSk7Ci0JCQotCQkvL2lmIHRoZXJlIGlzIGFuIFhNTFBJIHRoZW4gWEhUTUwgZG9jdHlwZSwgZWxzZSBIVE1MIGRvY3R5cGUKLQkJaWYgKHhtbHBpSXNGaXJzdEVsZW1lbnQgJiYgKG93bmluZ0RvY3VtZW50LmdldERvY3R5cGUoKSA9PSBudWxsKSAmJgotCQkJCWlzQ3Vyc29yQWZ0ZXJYTUxQSShjb250ZW50QXNzaXN0UmVxdWVzdCkpIHsKLQkJCQotCQkJYWRkRG9jVHlwZVByb3Bvc2FsKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWFkZERvY1R5cGVQcm9wb3NhbChjb250ZW50QXNzaXN0UmVxdWVzdCwgIGZhbHNlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gaXNYSFRNTAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGREb2NUeXBlUHJvcG9zYWwoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGJvb2xlYW4gaXNYSFRNTCkgewotCQkvLyBpZiBhIERvY3VtZW50RWxlbWVudCBleGlzdHMsIHVzZSB0aGF0IGZvciB0aGUgcm9vdCBFbGVtZW50IG5hbWUKLQkJU3RyaW5nIHJvb3RuYW1lID0gInVuc3BlY2lmaWVkIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpLmdldE93bmVyRG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlyb290bmFtZSA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKS5nZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Tm9kZU5hbWUoKTsKLQkJfQotCQkKLQkJLy9kZWNpZGUgd2hpY2ggZW50cnkgdG8gdXNlCi0JCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeTsKLQkJaWYoaXNYSFRNTCkgewotCQkJZW50cnkgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRYSFRNTERlZmF1bHRFbnRyeSgpOwotCQl9IGVsc2UgewotCQkJZW50cnkgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0RW50cnkoKTsKLQkJfQotCi0JCS8vY3JlYXRlIHRoZSBjb250ZW50IGFzc2lzdCBzdHJpbmcgYW5kIHByb3Bvc2FsCi0JCVN0cmluZyBwcm9wb3NlZFRleHQgPSAiPCFET0NUWVBFICIgKyByb290bmFtZSArICIgUFVCTElDIFwiIiArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWVudHJ5LmdldFB1YmxpY0lkKCkgKyAiXCIgXCIiICsgZW50cnkuZ2V0U3lzdGVtSWQoKSArICJcIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoCi0JCQkJcHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCAxMCwKLQkJCQlYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0RPQ1RZUEUpLAotCQkJCWVudHJ5LmdldERpc3BsYXlOYW1lKCkgKyAiICIgKyBIVE1MVUlNZXNzYWdlcy5FeHBhbmRhYmxlX2xhYmVsX2RvY3VtZW50X3R5cGUsIC8vJE5PTi1OTFMtMSQgCi0JCQkJbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfRE9DVFlQRSk7Ci0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+YWRkcyBIVE1MIHRhZyBwcm9wb3NhbCBmb3IgZW1wdHkgZG9jdW1lbnQ8L3A+Ci0JICogCi0JICogQHBhcmFtIGNvbnRlbnRBc3Npc3RSZXF1ZXN0IHJlcXVlc3QgdG8gYWRkIHByb3Bvc2FsIHRvbwotCSAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgb2YgdGhlIGNvbXBsZXRpb24gcmVxdWVzdAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRIVE1MVGFnUHJvcG9zYWwoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIENvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZihjb250ZXh0LmdldERvY3VtZW50KCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZCgoSVN0cnVjdHVyZWREb2N1bWVudCljb250ZXh0LmdldERvY3VtZW50KCkpOwotCQkJfQotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlJRE9NRG9jdW1lbnQgZG9jID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCi0JCQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jKTsKLQkJCQlpZiAobXEgIT0gbnVsbCkgewotCi0JCQkJCS8vIFhIVE1MIHJlcXVpcmVzIGxvd2VyY2FzZSB0YWduYW1lIGZvciBsb29rdXAKLQkJCQkJQ01Eb2N1bWVudCBjb3JyZXNwb25kaW5nQ01Eb2N1bWVudCA9IG1xLmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KGRvYyk7Ci0JCQkJCWlmIChjb3JyZXNwb25kaW5nQ01Eb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBodG1sRGVjbCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgY29ycmVzcG9uZGluZ0NNRG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUwudG9Mb3dlckNhc2UoKSk7Ci0JCQkJCQlpZiAoaHRtbERlY2wgIT0gbnVsbCkgewotCQkJCQkJCVN0cmluZ0J1ZmZlciBwcm9wb3NlZFRleHRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQkJZ2V0Q29udGVudEdlbmVyYXRvcigpLmdlbmVyYXRlVGFnKGRvYywgaHRtbERlY2wsIHByb3Bvc2VkVGV4dEJ1ZmZlcik7Ci0KLQkJCQkJCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gcHJvcG9zZWRUZXh0QnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJCQkJU3RyaW5nIHJlcXVpcmVkTmFtZSA9IGdldENvbnRlbnRHZW5lcmF0b3IoKS5nZXRSZXF1aXJlZE5hbWUoZG9jLCBodG1sRGVjbCk7Ci0JCQkJCQkJCi0JCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXREb2N1bWVudFJlZ2lvbigpOwotCQkJCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCQlpZiAocmVnaW9uLmdldEZpcnN0UmVnaW9uKCkgIT0gbnVsbCAmJiAKLQkJCQkJCQkJCQlyZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSkgewotCQkJCQkJCQkJLy9pbiBvcmRlciB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gY29udGVudCBhc3Npc3Qgb24gCi0JCQkJCQkJCQkvL2NvbXBsZXRlbHkgZW1wdHkgZG9jdW1lbnQgYW5kIHRoZSBvbmUgd2l0aCB4bWwgb3BlbiB0YWcKLQkJCQkJCQkJCXByb3Bvc2VkVGV4dCA9IHByb3Bvc2VkVGV4dC5zdWJzdHJpbmcoMSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCFiZWdpbnNXaXRoKHByb3Bvc2VkVGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKSkpIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCQlpbnQgY3Vyc29yQWRqdXN0bWVudCA9IGdldEN1cnNvclBvc2l0aW9uRm9yUHJvcG9zZWRUZXh0KHByb3Bvc2VkVGV4dCk7Ci0JCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQkJCQkJCXByb3Bvc2VkVGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksCi0JCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBjdXJzb3JBZGp1c3RtZW50LCAKLQkJCQkJCQkJCUhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyksCi0JCQkJCQkJCQlyZXF1aXJlZE5hbWUsIG51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1RBR19OQU1FKTsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgdGhpcyBEb2N1bWVudCBpcyBhbiBYSFRNTCBEb2N1bWVudC4gT3BlcmF0ZXMgc29sZWx5IG9mZiBvZgotCSAqIHRoZSBEb2N1bWVudCBUeXBlIGRlY2xhcmF0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1hIVE1MTm9kZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQlkb2MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJZWxzZQotCQkJZG9jID0gKChEb2N1bWVudCkgbm9kZSk7Ci0KLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkgewotCQkJcmV0dXJuICgoSURPTURvY3VtZW50KSBkb2MpLmlzWE1MVHlwZSgpOwotCQl9Ci0KLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCU1vZGVsUXVlcnlBZGFwdGVyIGFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9jKS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJCUNNRG9jdW1lbnQgY21kb2MgPSBudWxsOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmdldE1vZGVsUXVlcnkoKSAhPSBudWxsKQotCQkJCWNtZG9jID0gYWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoZG9jKTsKLQkJCWlmIChjbWRvYyAhPSBudWxsKSB7Ci0JCQkJLy8gdHJlYXQgYXMgWEhUTUwgdW5sZXNzIHdlJ3ZlIGdvdCB0aGUgaW4tY29kZSBIVE1MIGNvbnRlbnQKLQkJCQkvLyBtb2RlbAotCQkJCWlmIChjbWRvYyBpbnN0YW5jZW9mIEhUTUxDTURvY3VtZW50KQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKGNtZG9jLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJCQlyZXR1cm4gQm9vbGVhbi5UUlVFLmVxdWFscyhjbWRvYy5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSk7Ci0JCQl9Ci0JCX0KLQkJLy8gdGhpcyBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZAotCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGRvYy5nZXREb2N0eXBlKCk7Ci0JCXJldHVybiBkb2NUeXBlICE9IG51bGwgJiYgZG9jVHlwZS5nZXRQdWJsaWNJZCgpICE9IG51bGwgJiYgZG9jVHlwZS5nZXRQdWJsaWNJZCgpLmluZGV4T2YoIi0vL1czQy8vRFREIFhIVE1MICIpID09IDA7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHZhbGlkYXRvciB1c2VkIHRvIGRldGVybWluZSB3aGVuIGRpc3BsYXllZCBjb250ZXh0Ci0JICogaW5mb3JtYXRpb24gc2hvdWxkIGJlIGRpc21pc3NlZC4gTWF5IG9ubHkgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhlIHByb2Nlc3NvciBpcyBpbmNhcGFibGUgb2YgY29tcHV0aW5nIGNvbnRleHQgaW5mb3JtYXRpb24uCi0JICogCi0JICogYSBjb250ZXh0IGluZm9ybWF0aW9uIHZhbGlkYXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogcHJvY2Vzc29yIGlzIGluY2FwYWJsZSBvZiBjb21wdXRpbmcgY29udGV4dCBpbmZvcm1hdGlvbgotCSAqLwotCXByaXZhdGUgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCWlmIChmQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yID09IG51bGwpIHsKLQkJCWZDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgPSBuZXcgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkOWE0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVQcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLkhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSFRNTEVkaXRvclBsdWdpbkltYWdlczsKLQotCi0vKioKLSAqIDxwPkNvbXBsZXRpb24gY29tcHV0ZXIgZm9yIEhUTUwgdGVtcGxhdGVzPC9wPgotICovCi1wdWJsaWMgY2xhc3MgSFRNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBleHRlbmRzIFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUHJvcG9zYWxDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJcmV0dXJuICgoVGVtcGxhdGVQcm9wb3NhbCkgbzIpLmdldFJlbGV2YW5jZSgpIC0gKChUZW1wbGF0ZVByb3Bvc2FsKSBvMSkuZ2V0UmVsZXZhbmNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIGZnUHJvcG9zYWxDb21wYXJhdG9yID0gbmV3IFByb3Bvc2FsQ29tcGFyYXRvcigpOwotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0VHlwZUlkID0gbnVsbDsKLQotCS8qCi0JICogQ29waWVkIGZyb20gc3VwZXIgY2xhc3MgZXhjZXB0IGluc3RlYWQgb2YgY2FsbGluZyBjcmVhdGVDb250ZXh0KHZpZXdlciwKLQkgKiByZWdpb24pIGNhbGwgY3JlYXRlQ29udGV4dCh2aWV3ZXIsIHJlZ2lvbiwgb2Zmc2V0KSBpbnN0ZWFkCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQotCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCi0JCS8vIGFkanVzdCBvZmZzZXQgdG8gZW5kIG9mIG5vcm1hbGl6ZWQgc2VsZWN0aW9uCi0JCWlmIChzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgPT0gb2Zmc2V0KQotCQkJb2Zmc2V0ID0gc2VsZWN0aW9uLmdldE9mZnNldCgpICsgc2VsZWN0aW9uLmdldExlbmd0aCgpOwotCi0JCVN0cmluZyBwcmVmaXggPSBleHRyYWN0UHJlZml4KHZpZXdlciwgb2Zmc2V0KTsKLQkJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24ob2Zmc2V0IC0gcHJlZml4Lmxlbmd0aCgpLCBwcmVmaXgubGVuZ3RoKCkpOwotCQlUZW1wbGF0ZUNvbnRleHQgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQodmlld2VyLCByZWdpb24sIG9mZnNldCk7Ci0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCS8vIG5hbWUgb2YgdGhlIHNlbGVjdGlvbiB2YXJpYWJsZXMge2xpbmUsIHdvcmR9X3NlbGVjdGlvbgotCQljb250ZXh0LnNldFZhcmlhYmxlKCJzZWxlY3Rpb24iLCBzZWxlY3Rpb24uZ2V0VGV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVRlbXBsYXRlW10gdGVtcGxhdGVzID0gZ2V0VGVtcGxhdGVzKGNvbnRleHQuZ2V0Q29udGV4dFR5cGUoKS5nZXRJZCgpKTsKLQotCQlMaXN0IG1hdGNoZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGVtcGxhdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IHRlbXBsYXRlc1tpXTsKLQkJCXRyeSB7Ci0JCQkJY29udGV4dC5nZXRDb250ZXh0VHlwZSgpLnZhbGlkYXRlKHRlbXBsYXRlLmdldFBhdHRlcm4oKSk7Ci0JCQl9Ci0JCQljYXRjaCAoVGVtcGxhdGVFeGNlcHRpb24gZSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHRlbXBsYXRlLm1hdGNoZXMocHJlZml4LCBjb250ZXh0LmdldENvbnRleHRUeXBlKCkuZ2V0SWQoKSkpCi0JCQkJbWF0Y2hlcy5hZGQoY3JlYXRlUHJvcG9zYWwodGVtcGxhdGUsIGNvbnRleHQsIChJUmVnaW9uKSByZWdpb24sIGdldFJlbGV2YW5jZSh0ZW1wbGF0ZSwgcHJlZml4KSkpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChtYXRjaGVzLCBmZ1Byb3Bvc2FsQ29tcGFyYXRvcik7Ci0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIG1hdGNoZXMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFttYXRjaGVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb25jcmV0ZSB0ZW1wbGF0ZSBjb250ZXh0IGZvciB0aGUgZ2l2ZW4gcmVnaW9uIGluIHRoZQotCSAqIGRvY3VtZW50LiBUaGlzIGludm9sdmVzIGZpbmRpbmcgb3V0IHdoaWNoIGNvbnRleHQgdHlwZSBpcyB2YWxpZCBhdCB0aGUKLQkgKiBnaXZlbiBsb2NhdGlvbiwgYW5kIHRoZW4gY3JlYXRpbmcgYSBjb250ZXh0IG9mIHRoaXMgdHlwZS4gVGhlIGRlZmF1bHQKLQkgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGEgPGNvZGU+U21hcnRSZXBsYWNlVGVtcGxhdGVDb250ZXh0PC9jb2RlPiBmb3IKLQkgKiB0aGUgY29udGV4dCB0eXBlIGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4gVGhpcyB0YWtlcyB0aGUgb2Zmc2V0IGF0IHdoaWNoCi0JICogY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQgaW50byBjb25zaWRlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgZm9yIHdoaWNoIHRoZSBjb250ZXh0IGlzIGNyZWF0ZWQKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogICAgICAgICAgICB0aGUgcmVnaW9uIGludG8gPGNvZGU+ZG9jdW1lbnQ8L2NvZGU+IGZvciB3aGljaCB0aGUKLQkgKiAgICAgICAgICAgIGNvbnRleHQgaXMgY3JlYXRlZAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBvZmZzZXQgd2hlcmUgY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQKLQkgKiBAcmV0dXJuIGEgdGVtcGxhdGUgY29udGV4dCB0aGF0IGNhbiBoYW5kbGUgdGVtcGxhdGUgaW5zZXJ0aW9uIGF0IHRoZQotCSAqICAgICAgICAgZ2l2ZW4gbG9jYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZUNvbnRleHQgY3JlYXRlQ29udGV4dChJVGV4dFZpZXdlciB2aWV3ZXIsIElSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIHByZXR0eSBtdWNoIHNhbWUgY29kZSBhcyBzdXBlci5jcmVhdGVDb250ZXh0IGV4Y2VwdCBjcmVhdGUKLQkJLy8gU21hcnRSZXBsYWNlVGVtcGxhdGVDb250ZXh0Ci0JCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBnZXRDb250ZXh0VHlwZSh2aWV3ZXIsIHJlZ2lvbik7Ci0JCWlmIChjb250ZXh0VHlwZSAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCXJldHVybiBuZXcgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSwgb2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVQcm9wb3NhbChUZW1wbGF0ZSB0ZW1wbGF0ZSwgVGVtcGxhdGVDb250ZXh0IGNvbnRleHQsIElSZWdpb24gcmVnaW9uLCBpbnQgcmVsZXZhbmNlKSB7Ci0JCXJldHVybiBuZXcgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbCh0ZW1wbGF0ZSwgY29udGV4dCwgcmVnaW9uLCBnZXRJbWFnZSh0ZW1wbGF0ZSksIHJlbGV2YW5jZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbXBsYXRlQ29udGV4dFR5cGUgZ2V0Q29udGV4dFR5cGUoSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIHJlZ2lvbikgewotCQlUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUgPSBudWxsOwotCi0JCUNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpOwotCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkKLQkJCXR5cGUgPSByZWdpc3RyeS5nZXRDb250ZXh0VHlwZShmQ29udGV4dFR5cGVJZCk7Ci0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKFRlbXBsYXRlIHRlbXBsYXRlKSB7Ci0JCS8vIGp1c3QgcmV0dXJuIHRoZSBzYW1lIGltYWdlIGZvciBub3cKLQkJcmV0dXJuIEhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfVEVNUExBVEUpOwotCX0KLQotCXByaXZhdGUgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVtcGxhdGVbXSBnZXRUZW1wbGF0ZXMoU3RyaW5nIGNvbnRleHRUeXBlSWQpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGVzW10gPSBudWxsOwotCi0JCVRlbXBsYXRlU3RvcmUgc3RvcmUgPSBnZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWlmIChzdG9yZSAhPSBudWxsKQotCQkJdGVtcGxhdGVzID0gc3RvcmUuZ2V0VGVtcGxhdGVzKGNvbnRleHRUeXBlSWQpOwotCi0JCXJldHVybiB0ZW1wbGF0ZXM7Ci0JfQotCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCXJldHVybiBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlU3RvcmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0VHlwZShTdHJpbmcgY29udGV4dFR5cGVJZCkgewotCQlmQ29udGV4dFR5cGVJZCA9IGNvbnRleHRUeXBlSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MVGVtcGxhdGVzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTFRlbXBsYXRlc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZTcyZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MVGVtcGxhdGVzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuRGVmYXVsdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyOwotCi0vKioKLSAqIDxwPlhNTCB0eXBlIHByb3Bvc2FsIGNvbXB1dGVyIHRvIGNyZWF0ZSBIVE1MIHRlbXBsYXRlIHByb3Bvc2FsczwvcD4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxUZW1wbGF0ZXNDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciBleHRlbmRzCi0JCURlZmF1bHRYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciB7Ci0KLQkvKiogdGVtcGxhdGUgcHJvY2Vzc29yIHVzZWQgdG8gY3JlYXRlIHRlbXBsYXRlIHByb3Bvc2FscyAqLwotCXByaXZhdGUgSFRNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBmVGVtcGxhdGVQcm9jZXNzb3IgPSBudWxsOwotCi0JLyoqCi0JICogPHA+Q3JlYXRlIHRoZSBjb21wdXRlcjwvcD4KLQkgKi8KLQlwdWJsaWMgSFRNTFRlbXBsYXRlc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyKCkgewotCQlmVGVtcGxhdGVQcm9jZXNzb3IgPSBuZXcgSFRNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpOwotCX0KLQotCS8qKgotCSAqIDxwPkNhbGxzIHN1cGVyIHRvIGFkZCB0ZW1wbGF0ZXMgYmFzZWQgb24gY29udGV4dCBhbmQgdGhlbgotCSAqIGFkZHMgdGVtcGxhdGVzIG5vdCBzcGVjaWZpYyB0byBhIGNvbnRleHQ8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBMaXN0IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkKLQkJLy9nZXQgdGhlIHRlbXBsYXRlcyBzcGVjaWZpYyB0byB0aGUgY29udGV4dAotCQlMaXN0IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoY29udGV4dCwgbW9uaXRvcikpOwotCQkKLQkJLy9nZXQgdGVtcGxhdGVzIG5vdCBzcGVjaWZpYyB0byB0aGUgY29udGV4dAotCQlwcm9wb3NhbHMuYWRkQWxsKHRoaXMuZ2V0VGVtcGxhdGVQcm9wb3NhbHMoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuQUxMLCBjb250ZXh0KSk7Ci0JCQotCQlyZXR1cm4gcHJvcG9zYWxzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5EZWZhdWx0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjYWRkQXR0cmlidXRlTmFtZVByb3Bvc2FscyhvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3QsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKAotCQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCQotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLkFUVFJJQlVURSwgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuRGVmYXVsdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2FkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKAotCQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCQotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLkFUVFJJQlVURV9WQUxVRSwgY29udGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkRlZmF1bHRYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoCi0JCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJCi0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuTkVXLCBjb250ZXh0KTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuRGVmYXVsdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2FkZFRhZ0luc2VydGlvblByb3Bvc2FscyhvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3QsIGludCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ0luc2VydGlvblByb3Bvc2FscygKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgY2hpbGRQb3NpdGlvbiwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJCi0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuVEFHLCBjb250ZXh0KTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+R2V0IHRoZSB0ZW1wbGF0ZSBwcm9wb3NhbHMgZnJvbSB0aGUgdGVtcGxhdGUgcHJvY2Vzc29yPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZUNvbnRleHQKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VGVtcGxhdGVQcm9wb3NhbHMoU3RyaW5nIHRlbXBsYXRlQ29udGV4dCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJCi0JCUxpc3QgdGVtcGxhdGVQcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlpZiAoZlRlbXBsYXRlUHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVByb2Nlc3Nvci5zZXRDb250ZXh0VHlwZSh0ZW1wbGF0ZUNvbnRleHQpOwotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9Ci0JCQkJZlRlbXBsYXRlUHJvY2Vzc29yLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGNvbnRleHQuZ2V0Vmlld2VyKCksIGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpKTsKLQkJCi0JCQl0ZW1wbGF0ZVByb3Bvc2Fscy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwcm9wb3NhbHMpKTsKLQkJfQotCQkKLQkJcmV0dXJuIHRlbXBsYXRlUHJvcG9zYWxzOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRlbXBsYXRlcyB0byB0aGUgbGlzdCBvZiBwcm9wb3NhbHMKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gdGVtcGxhdGVDb250ZXh0Ci0JICogQHBhcmFtIGNvbnRleHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVGVtcGxhdGVzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBTdHJpbmcgdGVtcGxhdGVDb250ZXh0LAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkKLQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0ICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gdXNlUHJvcG9zYWxMaXN0ID0gIWNvbnRlbnRBc3Npc3RSZXF1ZXN0LnNob3VsZFNlcGFyYXRlKCk7Ci0JCQlMaXN0IHByb3Bvc2FscyA9IHRoaXMuZ2V0VGVtcGxhdGVQcm9wb3NhbHModGVtcGxhdGVDb250ZXh0LCBjb250ZXh0KTsKLQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcG9zYWxzLnNpemUoKTsgKytpKSB7Ci0JCQkJaWYgKHVzZVByb3Bvc2FsTGlzdCkgewotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbCgoSUNvbXBsZXRpb25Qcm9wb3NhbClwcm9wb3NhbHMuZ2V0KGkpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZE1hY3JvKChJQ29tcGxldGlvblByb3Bvc2FsKXByb3Bvc2Fscy5nZXQoaSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3JGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OGE1NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3JGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGV4dC5JQ1NTUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Lk5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBOb1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3JGb3JIVE1MIGV4dGVuZHMgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQlwcm90ZWN0ZWQgdm9pZCBpbml0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCQotCQlzdXBlci5pbml0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKTsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgaHRtbFByb2Nlc3NvciA9IG5ldyBIVE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCwgaHRtbFByb2Nlc3Nvcik7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJSFRNTFBhcnRpdGlvbnMuSFRNTF9DT01NRU5ULCBodG1sUHJvY2Vzc29yKTsKLQotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBqc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCgpLmdldENvbnRlbnRBc3Npc3RhbnQobnVsbCkuZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKTsKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElIVE1MUGFydGl0aW9ucy5TQ1JJUFQsIGpzQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0KLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgY3NzQ29udGVudEFzc2lzdFByb2Nlc3NvciA9IG5ldyBDU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJQ1NTUGFydGl0aW9ucy5TVFlMRSwgY3NzQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9SZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9SZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjRhOTE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZVZhcmlhYmxlOwotCi0vKioKLSAqIEp1c3QgbGlrZSBEb2N1bWVudFRlbXBsYXRlQ29udGV4dCBleGNlcHQgaWYgYW4gaW5zZXJ0IG9mZnNldCBpcyBwYXNzZWQgaW4sCi0gKiBkdXJpbmcgZXZhbHVhdGlvbiwgdGhlICJwcmVmaXgiIGJlZm9yZSB0aGUgdGVtcGxhdGUgd2lsbCBiZSBjaGVja2VkIHRvIHNlZQotICogaWYgaXQgbWF0Y2hlcyB0aGUgdGVtcGxhdGUgbmFtZS4gSWYgc28sIG92ZXJ3cml0ZSB0aGUgdGVtcGxhdGUgbmFtZS4KLSAqIE90aGVyd2lzZSwganVzdCBpbnNlcnQgdGhlIHRlbXBsYXRlIGF0IHRoZSBpbnNlcnQgb2Zmc2V0IGxvY2F0aW9uIChieSBub3QKLSAqIG92ZXJ3cml0aW5nIHRoZSBwcmVmaXggdGV4dCkKLSAqLwotcHVibGljIGNsYXNzIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0IGV4dGVuZHMgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQgewotCXByaXZhdGUgaW50IGZJbnNlcnRPZmZzZXQgPSAtMTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb2N1bWVudCB0ZW1wbGF0ZSBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0eXBlCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdGhpcyBjb250ZXh0IGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKi8KLQlwdWJsaWMgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlLCBJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJdGhpcyh0eXBlLCBkb2N1bWVudCwgbmV3IFBvc2l0aW9uKG9mZnNldCwgbGVuZ3RoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvY3VtZW50IHRlbXBsYXRlIGNvbnRleHQuIFRoZSBzdXBwbGllZCA8Y29kZT5Qb3NpdGlvbjwvY29kZT4KLQkgKiB3aWxsIGJlIHF1ZXJpZWQgdG8gY29tcHV0ZSB0aGUgPGNvZGU+Z2V0U3RhcnQ8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmdldEVuZDwvY29kZT4gbWV0aG9kcywgd2hpY2ggd2lsbCB0aGVyZWZvcmUgYW5zd2VyIHVwZGF0ZWQKLQkgKiBwb3NpdGlvbiBkYXRhIGlmIGl0IGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IHR5cGUKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0aGlzIGNvbnRleHQgYXBwbGllcyB0bwotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIGRlc2NyaWJpbmcgdGhlIGFyZWEgb2YgdGhlIGRvY3VtZW50IHdoaWNoIGZvcm1zCi0JICogICAgICAgICAgICB0aGUgdGVtcGxhdGUgY29udGV4dAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlLCBJRG9jdW1lbnQgZG9jdW1lbnQsIFBvc2l0aW9uIHBvc2l0aW9uKSB7Ci0JCXN1cGVyKHR5cGUsIGRvY3VtZW50LCBwb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvY3VtZW50IHRlbXBsYXRlIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IHR5cGUKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0aGlzIGNvbnRleHQgYXBwbGllcyB0bwotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBpbnNlcnRPZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRvY3VtZW50IHJlZ2lvbiB3aGVyZSBpbnNlcnQgd2FzCi0JICogICAgICAgICAgICBvcmlnaW5hbGx5IHJlcXVlc3RlZAotCSAqLwotCXB1YmxpYyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUsIElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGluc2VydE9mZnNldCkgewotCQl0aGlzKHR5cGUsIGRvY3VtZW50LCBuZXcgUG9zaXRpb24ob2Zmc2V0LCBsZW5ndGgpKTsKLQkJZkluc2VydE9mZnNldCA9IGluc2VydE9mZnNldDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0I2V2YWx1YXRlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlKQotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZUJ1ZmZlciBldmFsdWF0ZShUZW1wbGF0ZSB0ZW1wbGF0ZSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBUZW1wbGF0ZUV4Y2VwdGlvbiB7Ci0JCVRlbXBsYXRlQnVmZmVyIGJ1ZmZlciA9IHN1cGVyLmV2YWx1YXRlKHRlbXBsYXRlKTsKLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlpZiAoZkluc2VydE9mZnNldCA+IC0xICYmIGZJbnNlcnRPZmZzZXQgPiBnZXRTdGFydCgpKSB7Ci0JCQkJU3RyaW5nIHByZWZpeCA9IGdldERvY3VtZW50KCkuZ2V0KGdldFN0YXJ0KCksIGZJbnNlcnRPZmZzZXQgLSBnZXRTdGFydCgpKTsKLQkJCQlpZiAoIXRlbXBsYXRlLmdldE5hbWUoKS5zdGFydHNXaXRoKHByZWZpeCkpIHsKLQkJCQkJLy8gZ2VuZXJhdGUgYSBuZXcgYnVmZmVyIHRoYXQgYWN0dWFsbHkgY29udGFpbnMgdGhlCi0JCQkJCS8vIHRleHQgdGhhdCB3YXMgZ29pbmcgdG8gYmUgb3ZlcndyaXR0ZW4KLQkJCQkJaW50IHByZWZpeFNpemUgPSBwcmVmaXgubGVuZ3RoKCk7Ci0JCQkJCVRlbXBsYXRlVmFyaWFibGVbXSBuZXdUZW1wbGF0ZVZhciA9IGJ1ZmZlci5nZXRWYXJpYWJsZXMoKTsKLQkJCQkJZm9yIChpbnQgaSA9MDsgaSA8IG5ld1RlbXBsYXRlVmFyLmxlbmd0aDsgaSsrICl7Ci0JCQkJCQlpbnRbXSBvZmZzZXRzID0gbmV3VGVtcGxhdGVWYXJbaV0uZ2V0T2Zmc2V0cygpOwotCQkJCQkJZm9yIChpbnQgaj0wOyBqPG9mZnNldHMubGVuZ3RoIDtqKyspewotCQkJCQkJCW9mZnNldHNbal0gKz0gcHJlZml4U2l6ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlidWZmZXIgPSBuZXcgVGVtcGxhdGVCdWZmZXIocHJlZml4ICsgYnVmZmVyLmdldFN0cmluZygpLCBuZXdUZW1wbGF0ZVZhcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBidWZmZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOTYwN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTENvbnRlbnRNb2RlbEdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yIGV4dGVuZHMgWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIFhIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvciBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwcml2YXRlIFhIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUVuZFRhZyhTdHJpbmcgdGFnTmFtZSwgTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGVsZW1lbnREZWNsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJaWYgKCgoQm9vbGVhbikgZWxlbWVudERlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19KU1ApKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCWlmIChlbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgb21taXNzaW9uID0gKFN0cmluZykgZWxlbWVudERlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpOwotCQkJCWlmIChvbW1pc3Npb24uZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EKSB8fCBvbW1pc3Npb24uZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX0RFRkFVTFQpIHx8IG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfTVVTVCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChlbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKQotCQkJcmV0dXJuOwotCQlidWZmZXIuYXBwZW5kKCI8LyIgKyB0YWdOYW1lICsgIj4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRTdGFydFRhZ0Nsb3NlKE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpIHsKLQkJU3RyaW5nIG90aGVyID0gZ2V0T3RoZXJDbG9zZShwYXJlbnROb2RlKTsKLQkJaWYgKG90aGVyICE9IG51bGwpCi0JCQlyZXR1cm4gb3RoZXI7Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKQotCQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFTVBUWSB0YWcsIGRvIGEgc2VsZi1jbG9zZQotCQlpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkgewotCQkJLy8gaWYgaXQncyBhIEpTUCBlbGVtZW50LCBkb24ndCBhZGQgdGhlIHNwYWNlIHNpbmNlIHRoZSBKU1AgY29udGFpbmVyIGRvZXNuJ3Qvc2hvdWxkbid0IGNhcmUKLQkJCWlmIChlbGVtZW50RGVjbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gJiYgKCgoQm9vbGVhbikgZWxlbWVudERlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19KU1ApKS5ib29sZWFuVmFsdWUoKSkpCi0JCQkJLy8gaWYgaXQncyBub3QgSlNQLCBjb25mb3JtIHRvIFhIVE1MIGd1aWRlbGluZXMgYW5kIGFkZCB0aGUgc3BhY2UKLQkJCQlyZXR1cm4gIi8+IjsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCXJldHVybiAiIC8+IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIG5vdCBkZWZpbmVkIGFzIEVNUFRZLCBidXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgc3VjaCBhbnl3YXkKLQkJZWxzZSBpZiAoZWxlbWVudERlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQlTdHJpbmcgb21taXNzaW9uID0gKFN0cmluZykgZWxlbWVudERlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpOwotCQkJaWYgKG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkQpIHx8IG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfREVGQVVMVCkgfHwgb21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9NVVNUKSkgewotCQkJCXJldHVybiAiIC8+IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFhIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBYSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0hUTUxOb2RlQWN0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSFRNTE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OWM5NTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSFRNTE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvbnRlbnRCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQuSFRNTEZvcm1hdFByb2Nlc3NvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01Db250ZW50QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlhNTE5vZGVBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MTm9kZUFjdGlvbk1hbmFnZXIgZXh0ZW5kcyBYTUxOb2RlQWN0aW9uTWFuYWdlciB7Ci0JcHJvdGVjdGVkIGludCBmVGFnQ2FzZTsKLQlwcm90ZWN0ZWQgaW50IGZBdHRyQ2FzZTsKLQotCXB1YmxpYyBIVE1MTm9kZUFjdGlvbk1hbmFnZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgVmlld2VyIHZpZXdlcikgewotCQlzdXBlcihtb2RlbCwgdmlld2VyKTsKLQkJdXBkYXRlQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqIElmIG5lY2Nlc3NhcnksIGVtcGxveSBhIERPTUNvbnRlbnRCdWlsZGVyIHRoYXQgdW5kZXJzdGFuZHMgaG93IHRvCi0JICogY2hhbmdlIHRoZSBjYXNlIG9mIEhUTUwgdGFncyAoYnV0IE5PVCB0YWdsaWIgZGVyaXZlZCB0YWdzKS4KLQkgKi8KLQlwdWJsaWMgRE9NQ29udGVudEJ1aWxkZXIgY3JlYXRlRE9NQ29udGVudEJ1aWxkZXIoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRE9NQ29udGVudEJ1aWxkZXIgYnVpbGRlciA9IG51bGw7Ci0JCVN0cmluZyBvbmUgPSBmTW9kZWwuZ2V0TW9kZWxIYW5kbGVyKCkuZ2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoKTsKLQkJU3RyaW5nIG1vZGVsQ29udGVudFR5cGVJZCA9IGZNb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLQkJaWYgKG9uZSAhPSBtb2RlbENvbnRlbnRUeXBlSWQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm90IGVxdWFsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobW9kZWxDb250ZW50VHlwZUlkLmVxdWFscyhDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwpKQotCQkJYnVpbGRlciA9IG5ldyBIVE1MQ29udGVudEJ1aWxkZXIoZG9jdW1lbnQpOwotCQllbHNlCi0JCQlidWlsZGVyID0gc3VwZXIuY3JlYXRlRE9NQ29udGVudEJ1aWxkZXIoZG9jdW1lbnQpOwotCi0JCXJldHVybiBidWlsZGVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRJZ25vcmVDYXNlKENNTm9kZSBjbW5vZGUpIHsKLQkJaWYgKCFjbW5vZGUuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKChCb29sZWFuKSBjbW5vZGUuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnkgdGhlIGRpc3BsYXllZCBtZW51aXRlbSBsYWJlbCB0byBjaGFuZ2UgdGhlIGNhc2Ugb2YgSFRNTCBjaGlsZHJlbgotCSAqIGJ1dCBuZWl0aGVyIFhNTCBub3IgdGFnbGliLWRlcml2ZWQgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbChOb2RlIHBhcmVudCwgQ01Ob2RlIGNtbm9kZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gQ01Ob2RlIGNtbm9kZSA9IGFjdGlvbi5nZXRDTU5vZGUoKTsKLQkJLy8gZG9uJ3QgY2hhbmdlIHRoZSBjYXNlIHVubGVzcyB3ZSdyZSBjZXJ0YWluIGl0IGlzIG1lYW5pbmdsZXNzCi0JCWlmIChzaG91bGRJZ25vcmVDYXNlKGNtbm9kZSkpIHsKLQkJCVN0cmluZyBuYW1lID0gY21ub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pIHsKLQkJCQlpZiAoZlRhZ0Nhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJZWxzZSBpZiAoZlRhZ0Nhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJLy8gZWxzZSBkbyBub3RoaW5nCi0JCQl9Ci0JCQllbHNlIGlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJaWYgKGZBdHRyQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCQkJbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJCQllbHNlIGlmIChmQXR0ckNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJLy8gZWxzZSBkbyBub3RoaW5nCi0JCQl9Ci0JCQlyZXN1bHQgPSBuYW1lOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gc3VwZXIuZ2V0TGFiZWwocGFyZW50LCBjbW5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBBbm90aGVyIEhUTUwgc3BlY2lmaWMgZGV0YWlsLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhc2UoKSB7Ci0JCWlmIChmTW9kZWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIG1vZGVsQ29udGVudFR5cGVJZCA9IGZNb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLQkJCWlmIChtb2RlbENvbnRlbnRUeXBlSWQgIT0gbnVsbCkgewotCQkJCWlmIChtb2RlbENvbnRlbnRUeXBlSWQuZXF1YWxzKENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCkpIHsKLQkJCQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmVGFnQ2FzZSA9IHByZWZzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFKTsKLQkJCQkJZkF0dHJDYXNlID0gcHJlZnMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJfTkFNRV9DQVNFKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZvcm1hdChOb2RlIG5ld0VsZW1lbnQsIGJvb2xlYW4gZGVlcCkgewotCQl0cnkgewotCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gbWFrZSBhIGJpZyBtb2RlbCBjaGFuZ2UKLQkJCWZNb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJLy8gZm9ybWF0IHNlbGVjdGVkIG5vZGUKLQkJCUlTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IG5ldyBIVE1MRm9ybWF0UHJvY2Vzc29ySW1wbCgpOwotCQkJZm9ybWF0UHJvY2Vzc29yLmZvcm1hdE5vZGUobmV3RWxlbWVudCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZyBtb2RlbCBjaGFuZ2UKLQkJCWZNb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMWRkZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogQW4gYWRhcHRlciBmYWN0b3J5IHRvIGNyZWF0ZSBKRmFjZU5vZGVBZGFwdGVycy4gIFVzZSB0aGlzCi0gKiBhZGFwdGVyIGZhY3Rvcnkgd2l0aCBhIEpGYWNlQWRhcHRlckNvbnRlbnRQcm92aWRlciB0byBkaXNwbGF5Ci0gKiBET00gbm9kZXMgaW4gYSB0cmVlLgotICovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MIGV4dGVuZHMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgewotCi0KLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MKCkgewotCQl0aGlzKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgbm9kZSkgewotCQlpZiAoc2luZ2xldG9uQWRhcHRlciA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgdGhlIEpGYWNlTm9kZUFkYXB0ZXIKLQkJCXNpbmdsZXRvbkFkYXB0ZXIgPSBuZXcgSkZhY2VOb2RlQWRhcHRlckZvckhUTUwodGhpcyk7Ci0JCQlpbml0QWRhcHRlcihzaW5nbGV0b25BZGFwdGVyLCBub2RlKTsKLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uQWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTChnZXRBZGFwdGVyS2V5KCksIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNDk0YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZvckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5IVE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQWRhcHRzIGEgRE9NIG5vZGUgdG8gYSBKRmFjZSB2aWV3ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBKRmFjZU5vZGVBZGFwdGVyRm9ySFRNTCBleHRlbmRzIEpGYWNlTm9kZUFkYXB0ZXIgewotCi0JcHJpdmF0ZSBJbWFnZSBjcmVhdGVIVE1MSW1hZ2UoU3RyaW5nIGltYWdlUmVzb3VyY2VOYW1lKSB7Ci0JCXJldHVybiBIVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpbWFnZVJlc291cmNlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEpGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBKRmFjZU5vZGVBZGFwdGVyRm9ySFRNTChKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGNyZWF0ZUltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCi0JCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCVN0cmluZyBsb3dlck5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKLQkJCWlmIChsb3dlck5hbWUuZXF1YWxzKCJ0YWJsZSIpIHx8IGxvd2VyTmFtZS5lbmRzV2l0aCgiOnRhYmxlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFCTEUpOwotCQkJZWxzZSBpZiAobG93ZXJOYW1lLmVxdWFscygiYSIpIHx8IGxvd2VyTmFtZS5lbmRzV2l0aCgiOmEiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlID0gY3JlYXRlSFRNTEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfQU5DSE9SKTsKLQkJCWVsc2UgaWYgKGxvd2VyTmFtZS5lcXVhbHMoImJvZHkiKSB8fCBsb3dlck5hbWUuZW5kc1dpdGgoIjpib2R5IikpIC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0JPRFkpOwotCQkJZWxzZSBpZiAobG93ZXJOYW1lLmVxdWFscygiYnV0dG9uIikgfHwgbG93ZXJOYW1lLmVuZHNXaXRoKCI6YnV0dG9uIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0JVVFRPTik7Ci0JCQllbHNlIGlmIChsb3dlck5hbWUuZXF1YWxzKCJmb250IikgfHwgbG93ZXJOYW1lLmVuZHNXaXRoKCI6Zm9udCIpKSAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2UgPSBjcmVhdGVIVE1MSW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19GT05UKTsKLQkJCWVsc2UgaWYgKGxvd2VyTmFtZS5lcXVhbHMoImZvcm0iKSB8fCBsb3dlck5hbWUuZW5kc1dpdGgoIjpmb3JtIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0ZPUk0pOwotCQkJZWxzZSBpZiAobG93ZXJOYW1lLmVxdWFscygiaHRtbCIpIHx8IGxvd2VyTmFtZS5lbmRzV2l0aCgiOmh0bWwiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlID0gY3JlYXRlSFRNTEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfSFRNTCk7Ci0JCQllbHNlIGlmIChsb3dlck5hbWUuZXF1YWxzKCJpbWciKSB8fCBsb3dlck5hbWUuZW5kc1dpdGgoIjppbWciKSkgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlID0gY3JlYXRlSFRNTEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfSU1BR0UpOwotCQkJZWxzZSBpZiAobG93ZXJOYW1lLmVxdWFscygibWFwIikgfHwgbG93ZXJOYW1lLmVuZHNXaXRoKCI6bWFwIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0lNQUdFX01BUCk7Ci0JCQllbHNlIGlmIChsb3dlck5hbWUuZXF1YWxzKCJ0aXRsZSIpIHx8IGxvd2VyTmFtZS5lbmRzV2l0aCgiOnRpdGxlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX1RJVExFKTsKLQkJCWVsc2UKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHKTsKLQkJfQotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2UgPSBzdXBlci5jcmVhdGVJbWFnZShub2RlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0Fic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9BYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTIzZGY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0Fic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgTm90IG5lZWRlZC4gU2VlIEJVRzExODM1OQotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3REZXZpY2VQcm9maWxlRW50cnkgaW1wbGVtZW50cyBEZXZpY2VQcm9maWxlRW50cnkgewotCi0JcHVibGljIEFic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW50cnlJZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbnRyeU5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9BYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9BYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NDA4NGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQWJzdHJhY3REZXZpY2VQcm9maWxlRW50cnlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIE5vdCBuZWVkZWQuICBTZWUgQlVHMTE4MzU5Ci0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyIGltcGxlbWVudHMKLQkJRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIgewotCi0JcHVibGljIEFic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldERldmljZVByb2ZpbGVFbnRyaWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29udGVudFNldHRpbmdzUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YjI3MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29udGVudFNldHRpbmdzUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25DaGFyc2V0TmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Db21ib0xpc3Q7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyBvbmx5IGNvbnRhaW5zIGhlbHBlciBtZXRob2RzIHRoYXQgeW91IHNob3VsZAotICogICAgICAgICAgICAgYWN0dWFsbHkgaW1wbGVtZW50IHlvdXJzZWxmLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudFNldHRpbmdzUmVnaXN0cnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkUgPSBIVE1MVUlNZXNzYWdlcy5VSV9ub25lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWF4TGVuZ3RoU3RyaW5nSW5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1heExlbmd0aFN0cmluZ0luQ2hhcmFjdGVyQ29kZVJlZ2lzdHJ5ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ29udGVudFNldHRpbmdzUmVnaXN0cnkoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeUludG8oQ29tYm9MaXN0IGNvbWJvKSB7Ci0JCWNvbWJvLmFkZChOT05FLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5IHJlZyA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlFbnVtZXJhdGlvbiBlID0gcmVnLmdldEVudHJpZXMoKTsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IChIVE1MRG9jdW1lbnRUeXBlRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKLQkJCVN0cmluZyBwdWJsaWNJZCA9IGVudHJ5LmdldFB1YmxpY0lkKCk7Ci0JCQlTdHJpbmcgZGlzcGxheU5hbWUgPSBlbnRyeS5nZXREaXNwbGF5TmFtZSgpOwotCQkJaWYgKGRpc3BsYXlOYW1lICE9IG51bGwpIHsKLQkJCQljb21iby5hZGQoZGlzcGxheU5hbWUsIHB1YmxpY0lkKTsKLQkJCQlpZiAoZGlzcGxheU5hbWUubGVuZ3RoKCkgPiBtYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5sZW5ndGgoKSkKLQkJCQkJbWF4TGVuZ3RoU3RyaW5nSW5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgPSBkaXNwbGF5TmFtZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQljb21iby5hZGQocHVibGljSWQsIHB1YmxpY0lkKTsKLQkJCWlmIChwdWJsaWNJZC5sZW5ndGgoKSA+IG1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5Lmxlbmd0aCgpKQotCQkJCW1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5ID0gcHVibGljSWQ7Ci0JCQlpZiAoZW50cnkuZ2V0U3lzdGVtSWQoKSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOyAvLyBpZiBIVE1MIGVudHJ5Ci0JCQlpZiAoZW50cnkuZ2V0U3lzdGVtSWQoKS5sZW5ndGgoKSA+IG1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5Lmxlbmd0aCgpKQotCQkJCW1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5ID0gZW50cnkuZ2V0U3lzdGVtSWQoKTsKLQkJfQotCi0JCWNvbWJvLnNvcnRCeUtleSgxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q1NTTWV0YU1vZGVsUmVnaXN0cnlJbnRvKENvbWJvTGlzdCBjb21ibykgewotCQljb21iby5hZGQoTk9ORSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUNTU1Byb2ZpbGVSZWdpc3RyeSByZWcgPSBDU1NQcm9maWxlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJSXRlcmF0b3IgaSA9IHJlZy5nZXRQcm9maWxlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IChDU1NQcm9maWxlKSBpLm5leHQoKTsKLQkJCVN0cmluZyBpZCA9IHByb2ZpbGUuZ2V0UHJvZmlsZUlEKCk7Ci0JCQlTdHJpbmcgbmFtZSA9IHByb2ZpbGUuZ2V0UHJvZmlsZU5hbWUoKTsKLQkJCWNvbWJvLmFkZChuYW1lLCBpZCk7Ci0JCX0KLQkJY29tYm8uc29ydEJ5S2V5KDEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZXZpY2VQcm9maWxlUmVnaXN0cnlJbnRvKENvbWJvTGlzdCBjb21ibykgewotCQljb21iby5hZGQoTk9ORSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCURldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyIHJlZyA9IERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyQnVpbGRlci5nZXRFbnRyeVByb3ZpZGVyKCk7Ci0JCWlmIChyZWcgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUl0ZXJhdG9yIHByb2ZpbGVzID0gcmVnLmdldERldmljZVByb2ZpbGVFbnRyaWVzKCk7Ci0JCWlmIChwcm9maWxlcyA9PSBudWxsKSB7Ci0JCQlyZWcucmVsZWFzZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCURldmljZVByb2ZpbGVFbnRyeSBlbnRyeTsKLQkJd2hpbGUgKHByb2ZpbGVzLmhhc05leHQoKSkgewotCQkJZW50cnkgPSAoRGV2aWNlUHJvZmlsZUVudHJ5KSBwcm9maWxlcy5uZXh0KCk7Ci0JCQljb21iby5hZGQoZW50cnkuZ2V0RW50cnlOYW1lKCksIGVudHJ5LmdldEVudHJ5SWQoKSk7Ci0JCQllbnRyeS5yZWxlYXNlKCk7Ci0JCX0KLQkJcmVnLnJlbGVhc2UoKTsKLQkJY29tYm8uc29ydEJ5S2V5KDEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN5c3RlbUlkRnJvbShTdHJpbmcgcHVibGljSWQpIHsKLQkJaWYgKHB1YmxpY0lkID09IG51bGwgfHwgcHVibGljSWQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgcmVnID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCUVudW1lcmF0aW9uIGUgPSByZWcuZ2V0RW50cmllcygpOwotCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJSFRNTERvY3VtZW50VHlwZUVudHJ5IGVudHJ5ID0gKEhUTUxEb2N1bWVudFR5cGVFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGVudHJ5LmdldFB1YmxpY0lkKCkuZXF1YWxzKHB1YmxpY0lkKSkKLQkJCQlyZXR1cm4gZW50cnkuZ2V0U3lzdGVtSWQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29udGVudFR5cGVJbnRvKENvbWJvTGlzdCBjb21ibykgewotCQlTdHJpbmdbXSB0eXBlID0geyIiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJhcHBsaWNhdGlvbi94bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJ0ZXh0L2h0bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJ0ZXh0L3htbCIsfTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBkaXNwbGF5TmFtZSA9IHtOT05FLCAiYXBwbGljYXRpb24veGh0bWwreG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCSJhcHBsaWNhdGlvbi94bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJ0ZXh0L2h0bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJ0ZXh0L3htbCIsfTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGUubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkaXNwbGF5TmFtZVtpXSAhPSBudWxsICYmIGRpc3BsYXlOYW1lW2ldLmxlbmd0aCgpICE9IDApCi0JCQkJY29tYm8uYWRkKGRpc3BsYXlOYW1lW2ldLCB0eXBlW2ldKTsKLQkJCWVsc2UKLQkJCQljb21iby5hZGQodHlwZVtpXSwgdHlwZVtpXSk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDaGFyYWN0ZXJDb2RlSW50byhDb21ib0xpc3QgY29tYm8pIHsKLQkJY29tYm8uYWRkKE5PTkUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbWF4ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gQ29tbW9uQ2hhcnNldE5hbWVzIGVuY29kaW5nID0gbmV3IENvbW1vbkNoYXJzZXROYW1lcygpOwotCQlTdHJpbmdbXSBjaGFyQ29kZSA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXRDb21tb25DaGFyc2V0TmFtZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFyQ29kZS5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldERpc3BsYXlTdHJpbmcoY2hhckNvZGVbaV0pOwotCQkJaWYgKGRpc3BsYXlOYW1lICE9IG51bGwgJiYgZGlzcGxheU5hbWUubGVuZ3RoKCkgIT0gMCkgewotCQkJCWNvbWJvLmFkZChkaXNwbGF5TmFtZSwgY2hhckNvZGVbaV0pOwotCQkJCWludCBuX2J5dGUgPSBkaXNwbGF5TmFtZS5nZXRCeXRlcygpLmxlbmd0aDsKLQkJCQlpZiAobWF4LmdldEJ5dGVzKCkubGVuZ3RoIDwgbl9ieXRlKQotCQkJCQltYXggPSBkaXNwbGF5TmFtZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQljb21iby5hZGQoY2hhckNvZGVbaV0sIGNoYXJDb2RlW2ldKTsKLQkJfQotCQkvKgotCQkgKiBjaGFyQ29kZSA9IGVuY29kaW5nLmdldFN1cHBvcnRlZEphdmFFbmNvZGluZ3MoKTsgZm9yKGludCBpPTA7aTxjaGFyQ29kZS5sZW5ndGg7aSsrKXsKLQkJICogU3RyaW5nIGRpc3BsYXlOYW1lID0gZW5jb2RpbmcuZ2V0RGlzcGxheVN0cmluZyhjaGFyQ29kZVtpXSk7IGlmCi0JCSAqIChkaXNwbGF5TmFtZSE9bnVsbCAmJiBkaXNwbGF5TmFtZS5sZW5ndGgoKSE9MCkKLQkJICogY29tYm8uYWRkKGRpc3BsYXlOYW1lLGNoYXJDb2RlW2ldKTsgZWxzZQotCQkgKiBjb21iby5hZGQoY2hhckNvZGVbaV0sY2hhckNvZGVbaV0pOyB9Ci0JCSAqLwotCQkvLyBjb21iby5zb3J0QnlLZXkoMSk7Ci0JCW1heExlbmd0aFN0cmluZ0luQ2hhcmFjdGVyQ29kZVJlZ2lzdHJ5ID0gbWF4OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMYW5ndWFnZUludG8oQ29tYm9MaXN0IGNvbWJvKSB7Ci0JCVN0cmluZ1tdIGxhbmcgPSB7IiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJImphdmEiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJqYXZhc2NyaXB0Iix9OyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1tdIGRpc3BsYXlOYW1lID0ge05PTkUsICJqYXZhIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCSJqYXZhc2NyaXB0Iix9OyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGFuZy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGRpc3BsYXlOYW1lW2ldICE9IG51bGwgJiYgZGlzcGxheU5hbWVbaV0ubGVuZ3RoKCkgIT0gMCkKLQkJCQljb21iby5hZGQoZGlzcGxheU5hbWVbaV0sIGxhbmdbaV0pOwotCQkJZWxzZQotCQkJCWNvbWJvLmFkZChsYW5nW2ldLCBsYW5nW2ldKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9EZXZpY2VQcm9maWxlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQyY2IxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9EZXZpY2VQcm9maWxlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzIGRpcmVjdGx5LgotICogSW5zdGVhZCwgcGxlYXNlIHVzZSBhYnN0cmFjdCBjbGFzcyhBYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeSkgaW5zdGVhZC4KLSAqIDwvcD4KLSAqIAotICogQGRlcHJlY2F0ZWQgTm90IG5lZWRlZC4gU2VlIEJVRzExODM1OQotICovCi1wdWJsaWMgaW50ZXJmYWNlIERldmljZVByb2ZpbGVFbnRyeSB7Ci0JcHVibGljIFN0cmluZyBnZXRFbnRyeUlkKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVudHJ5TmFtZSgpOwotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0RldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNjA3NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzIGRpcmVjdGx5LgotICogSW5zdGVhZCwgcGxlYXNlIHVzZSBhYnN0cmFjdCBjbGFzcyhBYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyKQotICogaW5zdGVhZC4KLSAqIDwvcD4KLSAqIAotICogQGRlcHJlY2F0ZWQgTm90IG5lZWRlZC4gU2VlIEJVRzExODM1OQotICovCi1wdWJsaWMgaW50ZXJmYWNlIERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyIHsKLQlwdWJsaWMgSXRlcmF0b3IgZ2V0RGV2aWNlUHJvZmlsZUVudHJpZXMoKTsKLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0RldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyQnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXJCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNjNlYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXJCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIE5vdCBuZWVkZWQuICBTZWUgQlVHMTE4MzU5Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZXZpY2VQcm9maWxlRW50cnlQcm92aWRlckJ1aWxkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfUExVR0lOSUQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkiOyAgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJkZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBEZXZpY2VQcm9maWxlRW50cnlQcm92aWRlckJ1aWxkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCXN0YXRpYyBwdWJsaWMgRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIgZ2V0RW50cnlQcm92aWRlcigpIHsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChFWFRFTlNJT05fUE9JTlRfUExVR0lOSUQsIEVYVEVOU0lPTl9QT0lOVF9OQU1FKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uc1tdID0gcG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJaWYgKChleHRlbnNpb25zICE9IG51bGwpICYmIChleHRlbnNpb25zLmxlbmd0aCA+IDApKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50c1tdID0gZXh0ZW5zaW9uc1tpXS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJaWYgKChlbGVtZW50cyAhPSBudWxsKSAmJiAoZWxlbWVudHMubGVuZ3RoID4gMCkpIHsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnID0gZWxlbWVudHNbal07Ci0JCQkJCQkJaWYgKChjb25maWcgIT0gbnVsbCkgJiYgKGNvbmZpZy5nZXROYW1lKCkuZXF1YWxzKEVYVEVOU0lPTl9QT0lOVF9OQU1FKSA9PSB0cnVlKSkgewotCQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnLmdldEF0dHJpYnV0ZShBVFRSX0NMQVNTKTsKLQkJCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCURldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyIHByb3ZpZGVyID0gKERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyKWNvbmZpZy5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVFJfQ0xBU1MpOwotCQkJCQkJCQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCXJldHVybiBwcm92aWRlcjsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGlnbm9yZWQpIHsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9IVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9IVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NWZkZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvSFRNTENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5JQ29udGVudFNldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Db250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2U7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVXNlIFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBpbnN0ZWFkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBIVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGV4dGVuZHMgQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciB7Ci0KLQotCXByaXZhdGUgZmluYWwgaW50IE5fRE9DVU1FTlRfVFlQRSA9IDA7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgTl9DU1NfUFJPRklMRSA9IDE7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgTl9UQVJHRVRfREVWSUNFID0gMjsKLQotCXByaXZhdGUgVGV4dCBwdWJsaWNJZFRleHQ7Ci0JcHJpdmF0ZSBUZXh0IHN5c3RlbUlkVGV4dDsKLQotCXB1YmxpYyBIVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCQludW1iZXJPZkNvbWJvID0gMzsKLQkJbnVtQ29scyA9IDI7Ci0JCW51bVJvd3MgPSA4OwotCQljb21ibyA9IG5ldyBDb21ib0xpc3RPblByb3BlcnR5UGFnZVtzdXBlci5udW1iZXJPZkNvbWJvXTsKLQotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEb2N1bWVudFR5cGVDb21ib0JveCgpIHsKLQotCQkvLyBjcmVhdGUgZGVzY3JpcHRpb24gb2YgaW1wbGVjaXQgRE9DVFlQRQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocHJvcGVydHlQYWdlLCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfRGVzY3JpcHRpb25fb2Zfcm9sZV9vZl9mb2xsb3dpbmdfRE9DVFlQRSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHM7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gY3JlYXRlIGNvbWJvYm94Ci0JCXN1cGVyLmNvbWJvW05fRE9DVU1FTlRfVFlQRV0gPSBzdXBlci5jcmVhdGVDb21ib0JveE9mKERPQ1VNRU5UX0xBQkVMKTsKLQkJc3VwZXIuY29tYm9bdGhpcy5OX0RPQ1VNRU5UX1RZUEVdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkvLyBzZXQgZW50cnkgbGlzdCBpbnRvIENvbWJvCi0JCUNvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LnNldEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeUludG8oY29tYm9bTl9ET0NVTUVOVF9UWVBFXSk7Ci0JCS8vCWNyZWF0ZSBUZXh0RmllbGQKLQkJY3JlYXRlSURUZXh0RmllbGQoKTsKLQkJaWYgKGNvbWJvW05fRE9DVU1FTlRfVFlQRV0uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgaW5pdFZhbHVlID0gY29udGVudFNldHRpbmdzLmdldFByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5IVE1MX0RPQ1VNRU5UX1RZUEUpOwotCQkvLyB3aGVuIGVpdGhlciAuY29udGVudHNldHRpbmdzIG9yIGVsZW1lbnQgZG9lc24ndCBleGlzdAotCQkvLyB3aGVuIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0cyxnZXRQcm9wZXJ0eSByZXR1cm5zIGVtcHR5IHN0cmluZy4KLQkJaWYgKGluaXRWYWx1ZSA9PSBudWxsKQotCQkJaW5pdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2V0IGluaXQgc2VsZWN0aW9uSXRlbSBpbiBDb21ibwotCQlzdXBlci5zZXRTZWxlY3Rpb25JdGVtKGNvbWJvW05fRE9DVU1FTlRfVFlQRV0sIGluaXRWYWx1ZSk7Ci0JCXRoaXMucHVibGljSWRUZXh0LnNldFRleHQoaW5pdFZhbHVlKTsKLQkJaWYgKCFpbml0VmFsdWUuZXF1YWxzKCIiKSkgey8vJE5PTi1OTFMtMSQKLQkJCS8vIHRvcm8gRDIxMDI2MAotCQkJaWYgKENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmdldFN5c3RlbUlkRnJvbShpbml0VmFsdWUpICE9IG51bGwpCi0JCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dChDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5nZXRTeXN0ZW1JZEZyb20oaW5pdFZhbHVlKSk7Ci0JCQllbHNlCi0JCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UKLQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQotCQkvLyBjcmVhdGUgc2VwYXJhdG9yCi0JCWxhYmVsID0gbmV3IExhYmVsKHByb3BlcnR5UGFnZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gbnVtQ29sczsKLQkJZGF0YS52ZXJ0aWNhbFNwYW4gPSA4OwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNTU0NvbWJvQm94KCkgewotCQlzdXBlci5jb21ib1tOX0NTU19QUk9GSUxFXSA9IHN1cGVyLmNyZWF0ZUNvbWJvQm94T2YoQ1NTX0xBQkVMKTsKLQotCQlDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5zZXRDU1NNZXRhTW9kZWxSZWdpc3RyeUludG8oY29tYm9bTl9DU1NfUFJPRklMRV0pOwotCQlpZiAoY29tYm9bTl9DU1NfUFJPRklMRV0uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGluaXRWYWx1ZSA9IGNvbnRlbnRTZXR0aW5ncy5nZXRQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuQ1NTX1BST0ZJTEUpOwotCQkvLyB3aGVuIGVpdGhlciAuY29udGVudHNldHRpbmdzIG9yIGVsZW1lbnQgZG9lc24ndCBleGlzdAotCQkvLyB3aGVuIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0cyxnZXRQcm9wZXJ0eSByZXR1cm5zIGVtcHR5IHN0cmluZy4KLQkJaWYgKGluaXRWYWx1ZSA9PSBudWxsKQotCQkJaW5pdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2V0IGluaXQgc2VsZWN0aW9uSXRlbSBpbiBDb21ibwotCQlzdXBlci5zZXRTZWxlY3Rpb25JdGVtKGNvbWJvW05fQ1NTX1BST0ZJTEVdLCBpbml0VmFsdWUpOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXZpY2VDb21ib0JveCgpIHsKLQkJc3VwZXIuY29tYm9bTl9UQVJHRVRfREVWSUNFXSA9IHN1cGVyLmNyZWF0ZUNvbWJvQm94T2YoREVWSUNFX0xBQkVMKTsKLQotCQlDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5zZXREZXZpY2VQcm9maWxlUmVnaXN0cnlJbnRvKGNvbWJvW05fVEFSR0VUX0RFVklDRV0pOwotCQlpZiAoY29tYm9bTl9UQVJHRVRfREVWSUNFXS5nZXRJdGVtQ291bnQoKSA8PSAwKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgaW5pdFZhbHVlID0gY29udGVudFNldHRpbmdzLmdldFByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5ERVZJQ0VfUFJPRklMRSk7Ci0JCS8vIHdoZW4gZWl0aGVyIC5jb250ZW50c2V0dGluZ3Mgb3IgZWxlbWVudCBkb2Vzbid0IGV4aXN0Ci0JCS8vIHdoZW4gYXR0cmlidXRlIGRvZXNuJ3QgZXhpc3RzLGdldFByb3BlcnR5IHJldHVybnMgZW1wdHkgc3RyaW5nLgotCQlpZiAoaW5pdFZhbHVlID09IG51bGwpCi0JCQlpbml0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBzZXQgaW5pdCBzZWxlY3Rpb25JdGVtIGluIENvbWJvCi0JCXN1cGVyLnNldFNlbGVjdGlvbkl0ZW0oY29tYm9bTl9UQVJHRVRfREVWSUNFXSwgaW5pdFZhbHVlKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNldHRpbmdzUGFnZUdVSSgpIHsKLQkJaW50IHR5cGUgPSAoKElSZXNvdXJjZSkgZ2V0RWxlbWVudCgpKS5nZXRUeXBlKCk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJLy8JY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHByb3BlcnR5UGFnZSxudW1Db2xzLG51bVJvd3MpOwotCQkJCWNyZWF0ZURvY3VtZW50VHlwZUNvbWJvQm94KCk7Ci0JCQkJY3JlYXRlQ1NTQ29tYm9Cb3goKTsKLQkJCQljcmVhdGVEZXZpY2VDb21ib0JveCgpOwotCQkJCWNvbXB1dGVNYXhXaWR0aEhpbnQoKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHByb3BlcnR5UGFnZSwgSUhlbHBDb250ZXh0SWRzLldFQl9DT05URU5UX1NFVFRJTkdTX0hFTFBJRCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQgOgotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJIVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGlzIGluc3RhbnRpYXRlZCBieSByZXNvdXJjZSBleGNlcHQgRklMRSIpOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCi0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIHB1dFNlbGVjdGVkUHJvcGVydHlJbnRvKE1hcCBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWVJbkNvbWJvLCBpbnQgaW5kZXgpIHsKLQotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQljYXNlIE5fRE9DVU1FTlRfVFlQRSA6Ci0JCQkJLy8gZG9jIHR5cGUKLQkJCQlwcm9wZXJ0aWVzLnB1dChJQ29udGVudFNldHRpbmdzLkhUTUxfRE9DVU1FTlRfVFlQRSwgdmFsdWVJbkNvbWJvKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTl9DU1NfUFJPRklMRSA6Ci0JCQkJLy8gY3NzCi0JCQkJcHJvcGVydGllcy5wdXQoSUNvbnRlbnRTZXR0aW5ncy5DU1NfUFJPRklMRSwgdmFsdWVJbkNvbWJvKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTl9UQVJHRVRfREVWSUNFIDoKLQkJCQkvLyBkZXZpY2UKLQkJCQlwcm9wZXJ0aWVzLnB1dChJQ29udGVudFNldHRpbmdzLkRFVklDRV9QUk9GSUxFLCB2YWx1ZUluQ29tYm8pOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gcHV0U2VsZWN0ZWRQcm9wZXJ0eUludG8oKSBpbiBjbGFzcyBIVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIik7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVOb25lUHJvcGVydHkoaW50IGluZGV4KSB7Ci0JCXN3aXRjaCAoaW5kZXgpIHsKLQkJCWNhc2UgTl9ET0NVTUVOVF9UWVBFIDoKLQkJCQkvLyBkb2MgdHlwZQotCQkJCWNvbnRlbnRTZXR0aW5ncy5kZWxldGVQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuSFRNTF9ET0NVTUVOVF9UWVBFKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTl9DU1NfUFJPRklMRSA6Ci0JCQkJLy8gY3NzCi0JCQkJY29udGVudFNldHRpbmdzLmRlbGV0ZVByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5DU1NfUFJPRklMRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5fVEFSR0VUX0RFVklDRSA6Ci0JCQkJLy8gZGV2aWNlCi0JCQkJY29udGVudFNldHRpbmdzLmRlbGV0ZVByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5ERVZJQ0VfUFJPRklMRSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkluZGV4IGlzIG91dCBvZiByYW5nZSBpbiBkZWxldGVOb25lUHJvcGVydHkoKSBpbiBjbGFzcyBIVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIik7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlEVGV4dEZpZWxkKCkgewotCQkvLyBwdWJsaWMgSUQgJiBTeXN0ZW0gSUQKLQkJTGFiZWwgcHVibGljTGFiZWwgPSBuZXcgTGFiZWwoc3VwZXIucHJvcGVydHlQYWdlLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCXB1YmxpY0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXB1YmxpY0xhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfUHVibGljX0lEKTsKLQkJcHVibGljSWRUZXh0ID0gbmV3IFRleHQoc3VwZXIucHJvcGVydHlQYWdlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotCQlwdWJsaWNJZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlMYWJlbCBzeXN0ZW1MYWJlbCA9IG5ldyBMYWJlbChzdXBlci5wcm9wZXJ0eVBhZ2UsIFNXVC5OT05FKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJc3lzdGVtTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3lzdGVtTGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5VSV9TeXN0ZW1fSUQpOwotCQlzeXN0ZW1JZFRleHQgPSBuZXcgVGV4dChzdXBlci5wcm9wZXJ0eVBhZ2UsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCi0JCXN5c3RlbUlkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCi0KLQlwcml2YXRlIHZvaWQgY29tcHV0ZU1heFdpZHRoSGludCgpIHsKLQkJLy8gbWF4TGVuZ3RoU3RyaW5nIHdhcyBzZXQgd2hlbiBIVE1MRG9jdW1lbnRUeXBlRW50cnkgd2FzIHNldCBpbiBjbGFzcyBDb250ZW50U2V0dGluZ3NSZWdpc3RyeS4KLQkJU3RyaW5nIG1heExlbmd0aFN0cmluZyA9IENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5Lm1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5OwotCQlTdHJpbmcgYmFja3VwID0gdGhpcy5zeXN0ZW1JZFRleHQuZ2V0VGV4dCgpOwotCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KG1heExlbmd0aFN0cmluZyk7Ci0JCWludCBtYXhXaWR0aEhpbnQgPSB0aGlzLnN5c3RlbUlkVGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7Ci0JCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoYmFja3VwKTsKLQotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV0uZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSB0aGlzLmNvbWJvW3RoaXMuTl9ET0NVTUVOVF9UWVBFXS5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQkJaWYgKHRoaXMucHVibGljSWRUZXh0LmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5wdWJsaWNJZFRleHQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0JCWlmICh0aGlzLnN5c3RlbUlkVGV4dC5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIHRoaXMuc3lzdGVtSWRUZXh0LmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fQ1NTX1BST0ZJTEVdLmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5jb21ib1t0aGlzLk5fQ1NTX1BST0ZJTEVdLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fVEFSR0VUX0RFVklDRV0uZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSB0aGlzLmNvbWJvW3RoaXMuTl9UQVJHRVRfREVWSUNFXS5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJV2lkZ2V0IHNvdXJjZSA9IGV2ZW50LndpZGdldDsKLQotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV0uZXF1YWxzKHNvdXJjZSkpIHsKLQkJCUNvbWJvTGlzdE9uUHJvcGVydHlQYWdlIGNvbWJvID0gdGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV07Ci0JCQlpZiAoY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IDApCi0JCQkJcmV0dXJuOwotCQkJaWYgKCFjb21iby5nZXRTZWxlY3RlZFZhbHVlKCkuZXF1YWxzKCIiKSkgey8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnB1YmxpY0lkVGV4dC5zZXRUZXh0KGNvbWJvLmdldFNlbGVjdGVkVmFsdWUoKSk7Ci0JCQkJaWYgKENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmdldFN5c3RlbUlkRnJvbShjb21iby5nZXRTZWxlY3RlZFZhbHVlKCkpICE9IG51bGwpCi0JCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoQ29udGVudFNldHRpbmdzUmVnaXN0cnkuZ2V0U3lzdGVtSWRGcm9tKGNvbWJvLmdldFNlbGVjdGVkVmFsdWUoKSkpOwotCQkJCWVsc2UKLQkJCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5wdWJsaWNJZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCXRoaXMucHVibGljSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1Byb2plY3RDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1Byb2plY3RDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzYzYxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Qcm9qZWN0Q29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLklDb250ZW50U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Db21ib0xpc3RPblByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2UgUHJvamVjdEhUTUxDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgaW5zdGVhZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvamVjdENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBleHRlbmRzIENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIgewotCi0KLQlwcml2YXRlIGZpbmFsIGludCBOX0RPQ1VNRU5UX1RZUEUgPSAwOwotCXByaXZhdGUgZmluYWwgaW50IE5fQ1NTX1BST0ZJTEUgPSAxOwotCXByaXZhdGUgZmluYWwgaW50IE5fVEFSR0VUX0RFVklDRSA9IDI7Ci0KLQlwcml2YXRlIFRleHQgcHVibGljSWRUZXh0OwotCXByaXZhdGUgVGV4dCBzeXN0ZW1JZFRleHQ7Ci0KLQlwdWJsaWMgUHJvamVjdENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJbnVtYmVyT2ZDb21ibyA9IDM7Ci0JCW51bUNvbHMgPSAyOwotCQludW1Sb3dzID0gODsKLQkJY29tYm8gPSBuZXcgQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2Vbc3VwZXIubnVtYmVyT2ZDb21ib107Ci0KLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRG9jdW1lbnRUeXBlQ29tYm9Cb3goKSB7Ci0KLQkJLy8gY3JlYXRlIGRlc2NyaXB0aW9uIG9mIGltcGxlY2l0IERPQ1RZUEUKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocHJvcGVydHlQYWdlLCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfRGVzY3JpcHRpb25fb2Zfcm9sZV9vZl9mb2xsb3dpbmdfRE9DVFlQRSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHM7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gY3JlYXRlIGNvbWJvYm94Ci0JCXN1cGVyLmNvbWJvW05fRE9DVU1FTlRfVFlQRV0gPSBzdXBlci5jcmVhdGVDb21ib0JveE9mKERPQ1VNRU5UX0xBQkVMKTsKLQkJc3VwZXIuY29tYm9bdGhpcy5OX0RPQ1VNRU5UX1RZUEVdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkvLyBzZXQgZW50cnkgbGlzdCBpbnRvIENvbWJvCi0JCUNvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LnNldEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeUludG8oY29tYm9bTl9ET0NVTUVOVF9UWVBFXSk7Ci0JCS8vIGNyZWF0ZSBUZXh0RmllbGQKLQkJY3JlYXRlSURUZXh0RmllbGQoKTsKLQkJaWYgKGNvbWJvW05fRE9DVU1FTlRfVFlQRV0uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgaW5pdFZhbHVlID0gY29udGVudFNldHRpbmdzLmdldFByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5IVE1MX0RPQ1VNRU5UX1RZUEUpOwotCQkvLyB3aGVuIGVpdGhlciAuY29udGVudHNldHRpbmdzIG9yIGVsZW1lbnQgZG9lc24ndCBleGlzdAotCQkvLyB3aGVuIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0cyxnZXRQcm9wZXJ0eSByZXR1cm5zIGVtcHR5IHN0cmluZy4KLQkJaWYgKGluaXRWYWx1ZSA9PSBudWxsKQotCQkJaW5pdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2V0IGluaXQgc2VsZWN0aW9uSXRlbSBpbiBDb21ibwotCQlzdXBlci5zZXRTZWxlY3Rpb25JdGVtKGNvbWJvW05fRE9DVU1FTlRfVFlQRV0sIGluaXRWYWx1ZSk7Ci0JCXRoaXMucHVibGljSWRUZXh0LnNldFRleHQoaW5pdFZhbHVlKTsKLQkJaWYgKCFpbml0VmFsdWUuZXF1YWxzKCIiKSkgey8vJE5PTi1OTFMtMSQKLQkJCS8vIHRvcm8gRDIxMDI2MAotCQkJaWYgKENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmdldFN5c3RlbUlkRnJvbShpbml0VmFsdWUpICE9IG51bGwpCi0JCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dChDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5nZXRTeXN0ZW1JZEZyb20oaW5pdFZhbHVlKSk7Ci0JCQllbHNlCi0JCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UKLQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQotCQkvLyBjcmVhdGUgc2VwYXJhdG9yCi0JCWxhYmVsID0gbmV3IExhYmVsKHByb3BlcnR5UGFnZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gbnVtQ29sczsKLQkJZGF0YS52ZXJ0aWNhbFNwYW4gPSA4OwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNTU0NvbWJvQm94KCkgewotCQlzdXBlci5jb21ib1tOX0NTU19QUk9GSUxFXSA9IHN1cGVyLmNyZWF0ZUNvbWJvQm94T2YoQ1NTX0xBQkVMKTsKLQotCQlDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5zZXRDU1NNZXRhTW9kZWxSZWdpc3RyeUludG8oY29tYm9bTl9DU1NfUFJPRklMRV0pOwotCQlpZiAoY29tYm9bTl9DU1NfUFJPRklMRV0uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGluaXRWYWx1ZSA9IGNvbnRlbnRTZXR0aW5ncy5nZXRQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuQ1NTX1BST0ZJTEUpOwotCQkvLyB3aGVuIGVpdGhlciAuY29udGVudHNldHRpbmdzIG9yIGVsZW1lbnQgZG9lc24ndCBleGlzdAotCQkvLyB3aGVuIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0cyxnZXRQcm9wZXJ0eSByZXR1cm5zIGVtcHR5IHN0cmluZy4KLQkJaWYgKGluaXRWYWx1ZSA9PSBudWxsKQotCQkJaW5pdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2V0IGluaXQgc2VsZWN0aW9uSXRlbSBpbiBDb21ibwotCQlzdXBlci5zZXRTZWxlY3Rpb25JdGVtKGNvbWJvW05fQ1NTX1BST0ZJTEVdLCBpbml0VmFsdWUpOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXZpY2VDb21ib0JveCgpIHsKLQkJc3VwZXIuY29tYm9bTl9UQVJHRVRfREVWSUNFXSA9IHN1cGVyLmNyZWF0ZUNvbWJvQm94T2YoREVWSUNFX0xBQkVMKTsKLQotCQlDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5zZXREZXZpY2VQcm9maWxlUmVnaXN0cnlJbnRvKGNvbWJvW05fVEFSR0VUX0RFVklDRV0pOwotCQlpZiAoY29tYm9bTl9UQVJHRVRfREVWSUNFXS5nZXRJdGVtQ291bnQoKSA8PSAwKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgaW5pdFZhbHVlID0gY29udGVudFNldHRpbmdzLmdldFByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5ERVZJQ0VfUFJPRklMRSk7Ci0JCS8vIHdoZW4gZWl0aGVyIC5jb250ZW50c2V0dGluZ3Mgb3IgZWxlbWVudCBkb2Vzbid0IGV4aXN0Ci0JCS8vIHdoZW4gYXR0cmlidXRlIGRvZXNuJ3QgZXhpc3RzLGdldFByb3BlcnR5IHJldHVybnMgZW1wdHkgc3RyaW5nLgotCQlpZiAoaW5pdFZhbHVlID09IG51bGwpCi0JCQlpbml0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBzZXQgaW5pdCBzZWxlY3Rpb25JdGVtIGluIENvbWJvCi0JCXN1cGVyLnNldFNlbGVjdGlvbkl0ZW0oY29tYm9bTl9UQVJHRVRfREVWSUNFXSwgaW5pdFZhbHVlKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNldHRpbmdzUGFnZUdVSSgpIHsKLQkJaW50IHR5cGUgPSAoKElSZXNvdXJjZSkgZ2V0RWxlbWVudCgpKS5nZXRUeXBlKCk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJLy8gY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHByb3BlcnR5UGFnZSxudW1Db2xzLG51bVJvd3MpOwotCQkJCWNyZWF0ZURvY3VtZW50VHlwZUNvbWJvQm94KCk7Ci0JCQkJY3JlYXRlQ1NTQ29tYm9Cb3goKTsKLQkJCQljcmVhdGVEZXZpY2VDb21ib0JveCgpOwotCQkJCWNvbXB1dGVNYXhXaWR0aEhpbnQoKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHByb3BlcnR5UGFnZSwgSUhlbHBDb250ZXh0SWRzLldFQl9DT05URU5UX1NFVFRJTkdTX0hFTFBJRCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQgOgotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJQcm9qZWN0Q29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGlzIGluc3RhbnRpYXRlZCBieSByZXNvdXJjZSBleGNlcHQgUFJPSkVDVCIpOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCi0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIHB1dFNlbGVjdGVkUHJvcGVydHlJbnRvKE1hcCBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWVJbkNvbWJvLCBpbnQgaW5kZXgpIHsKLQotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQljYXNlIE5fRE9DVU1FTlRfVFlQRSA6Ci0JCQkJLy8gZG9jIHR5cGUKLQkJCQlwcm9wZXJ0aWVzLnB1dChJQ29udGVudFNldHRpbmdzLkhUTUxfRE9DVU1FTlRfVFlQRSwgdmFsdWVJbkNvbWJvKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTl9DU1NfUFJPRklMRSA6Ci0JCQkJLy8gY3NzCi0JCQkJcHJvcGVydGllcy5wdXQoSUNvbnRlbnRTZXR0aW5ncy5DU1NfUFJPRklMRSwgdmFsdWVJbkNvbWJvKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTl9UQVJHRVRfREVWSUNFIDoKLQkJCQkvLyBkZXZpY2UKLQkJCQlwcm9wZXJ0aWVzLnB1dChJQ29udGVudFNldHRpbmdzLkRFVklDRV9QUk9GSUxFLCB2YWx1ZUluQ29tYm8pOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gcHV0U2VsZWN0ZWRQcm9wZXJ0eUludG8oKSBpbiBjbGFzcyBQcm9qZWN0Q29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIik7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVOb25lUHJvcGVydHkoaW50IGluZGV4KSB7Ci0JCXN3aXRjaCAoaW5kZXgpIHsKLQkJCWNhc2UgTl9ET0NVTUVOVF9UWVBFIDoKLQkJCQkvLyBkb2MgdHlwZQotCQkJCWNvbnRlbnRTZXR0aW5ncy5kZWxldGVQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuSFRNTF9ET0NVTUVOVF9UWVBFKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBOX0NTU19QUk9GSUxFIDoKLQkJCQkvLyBjc3MKLQkJCQljb250ZW50U2V0dGluZ3MuZGVsZXRlUHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBOX1RBUkdFVF9ERVZJQ0UgOgotCQkJCS8vIGRldmljZQotCQkJCWNvbnRlbnRTZXR0aW5ncy5kZWxldGVQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuREVWSUNFX1BST0ZJTEUpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkluZGV4IGlzIG91dCBvZiByYW5nZSBpbiBkZWxldGVOb25lUHJvcGVydHkoKSBpbiBjbGFzcyBQcm9qZWN0Q29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIik7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlEVGV4dEZpZWxkKCkgewotCQkvLyBwdWJsaWMgSUQgJiBTeXN0ZW0gSUQKLQkJTGFiZWwgcHVibGljTGFiZWwgPSBuZXcgTGFiZWwoc3VwZXIucHJvcGVydHlQYWdlLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCXB1YmxpY0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXB1YmxpY0xhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfUHVibGljX0lEKTsKLQkJcHVibGljSWRUZXh0ID0gbmV3IFRleHQoc3VwZXIucHJvcGVydHlQYWdlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotCQlwdWJsaWNJZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlMYWJlbCBzeXN0ZW1MYWJlbCA9IG5ldyBMYWJlbChzdXBlci5wcm9wZXJ0eVBhZ2UsIFNXVC5OT05FKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJc3lzdGVtTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3lzdGVtTGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5VSV9TeXN0ZW1fSUQpOwotCQlzeXN0ZW1JZFRleHQgPSBuZXcgVGV4dChzdXBlci5wcm9wZXJ0eVBhZ2UsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCi0JCXN5c3RlbUlkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCi0KLQlwcml2YXRlIHZvaWQgY29tcHV0ZU1heFdpZHRoSGludCgpIHsKLQkJLy8gbWF4TGVuZ3RoU3RyaW5nIHdhcyBzZXQgd2hlbiBIVE1MRG9jdW1lbnRUeXBlRW50cnkgd2FzIHNldCBpbiBjbGFzcwotCQkvLyBDb250ZW50U2V0dGluZ3NSZWdpc3RyeS4KLQkJU3RyaW5nIG1heExlbmd0aFN0cmluZyA9IENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5Lm1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5OwotCQlTdHJpbmcgYmFja3VwID0gdGhpcy5zeXN0ZW1JZFRleHQuZ2V0VGV4dCgpOwotCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KG1heExlbmd0aFN0cmluZyk7Ci0JCWludCBtYXhXaWR0aEhpbnQgPSB0aGlzLnN5c3RlbUlkVGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7Ci0JCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoYmFja3VwKTsKLQotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV0uZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSB0aGlzLmNvbWJvW3RoaXMuTl9ET0NVTUVOVF9UWVBFXS5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQkJaWYgKHRoaXMucHVibGljSWRUZXh0LmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5wdWJsaWNJZFRleHQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0JCWlmICh0aGlzLnN5c3RlbUlkVGV4dC5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIHRoaXMuc3lzdGVtSWRUZXh0LmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fQ1NTX1BST0ZJTEVdLmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5jb21ib1t0aGlzLk5fQ1NTX1BST0ZJTEVdLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fVEFSR0VUX0RFVklDRV0uZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSB0aGlzLmNvbWJvW3RoaXMuTl9UQVJHRVRfREVWSUNFXS5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJV2lkZ2V0IHNvdXJjZSA9IGV2ZW50LndpZGdldDsKLQotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV0uZXF1YWxzKHNvdXJjZSkpIHsKLQkJCUNvbWJvTGlzdE9uUHJvcGVydHlQYWdlIGNvbWJvID0gdGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV07Ci0JCQlpZiAoY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IDApCi0JCQkJcmV0dXJuOwotCQkJaWYgKCFjb21iby5nZXRTZWxlY3RlZFZhbHVlKCkuZXF1YWxzKCIiKSkgey8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnB1YmxpY0lkVGV4dC5zZXRUZXh0KGNvbWJvLmdldFNlbGVjdGVkVmFsdWUoKSk7Ci0JCQkJaWYgKENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmdldFN5c3RlbUlkRnJvbShjb21iby5nZXRTZWxlY3RlZFZhbHVlKCkpICE9IG51bGwpCi0JCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoQ29udGVudFNldHRpbmdzUmVnaXN0cnkuZ2V0U3lzdGVtSWRGcm9tKGNvbWJvLmdldFNlbGVjdGVkVmFsdWUoKSkpOwotCQkJCWVsc2UKLQkJCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5wdWJsaWNJZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCXRoaXMucHVibGljSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvUHJvamVjdFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvUHJvamVjdFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2NiZTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1Byb2plY3RXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFByb2plY3RXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgewotCXB1YmxpYyBQcm9qZWN0V2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzZXREZXNjcmlwdGlvbihIVE1MVUlNZXNzYWdlcy5Qcm9qZWN0V2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1dlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NDlmYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkNTU0NvbnRlbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLQotcHVibGljIGNsYXNzIFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9OT05FID0gSFRNTFVJTWVzc2FnZXMuVUlfbm9uZTsKLQlwcml2YXRlIFN0cmluZyBtYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGNsYXNzIENvbWJvU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpbnQgaW5kZXggPSBmRG9jdW1lbnRUeXBlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCVN0cmluZyBkb2N0eXBlID0gKFN0cmluZykgZkRvY3VtZW50VHlwZUlkcy5nZXQoaW5kZXgpOwotCQkJdXBkYXRlRG9jdHlwZVRleHQoaW5kZXgsIGRvY3R5cGUpOwotCQl9Ci0JfQotCi0JQ29tYm8gZkRvY3VtZW50VHlwZUNvbWJvOwotCUxpc3QgZkRvY3VtZW50VHlwZUlkczsKLQlwcml2YXRlIFRleHQgZlB1YmxpY0lkVGV4dDsKLQlwcml2YXRlIFRleHQgZlN5c3RlbUlkVGV4dDsKLQlwcml2YXRlIENvbWJvIGZQcm9maWxlQ29tYm87Ci0JcHJpdmF0ZSBMaXN0IGZQcm9maWxlSWRzOwotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZkxpc3RlbmVyOwotCi0JcHVibGljIFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RGVzY3JpcHRpb24oSFRNTFVJTWVzc2FnZXMuV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzApOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBHcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcHJvcGVydHlQYWdlID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMik7Ci0KLQkJY3JlYXRlRG9jdHlwZUNvbnRlbnRzKHByb3BlcnR5UGFnZSk7Ci0JCWNyZWF0ZUNTU1Byb2ZpbGVDb250ZW50cyhwcm9wZXJ0eVBhZ2UpOwotCi0JCXBvcHVsYXRlVmFsdWVzKCk7Ci0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQkJY29tcHV0ZU1heFdpZHRoSGludCgpOwotCi0JCWZMaXN0ZW5lciA9IG5ldyBDb21ib1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCWZEb2N1bWVudFR5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihmTGlzdGVuZXIpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocHJvcGVydHlQYWdlLCBJSGVscENvbnRleHRJZHMuV0VCX0NPTlRFTlRfU0VUVElOR1NfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gcHJvcGVydHlQYWdlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDU1NQcm9maWxlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDU1MgUHJvZmlsZQotCQlMYWJlbCBsYW5ndWFnZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYW5ndWFnZUxhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfQ1NTX3Byb2ZpbGVfX18yKTsKLQkJZlByb2ZpbGVDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZlByb2ZpbGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVEb2N0eXBlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgZGVzY3JpcHRpb24gb2YgaW1wbGljaXQgRE9DVFlQRQotCQlUZXh0IGRvY3R5cGVMYWJlbCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCWRvY3R5cGVMYWJlbC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlVJX0Rlc2NyaXB0aW9uX29mX3JvbGVfb2ZfZm9sbG93aW5nX0RPQ1RZUEUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRvY3R5cGVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIGRvY3VtZW50IHR5cGUKLQkJTGFiZWwgbGFuZ3VhZ2VMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFuZ3VhZ2VMYWJlbC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlVJX0RlZmF1bHRfSFRNTF9ET0NUWVBFX0lEX19fMSk7Ci0JCWZEb2N1bWVudFR5cGVDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZkRvY3VtZW50VHlwZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gcHVibGljIElECi0JCUxhYmVsIHB1YmxpY0lkTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXB1YmxpY0lkTGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5VSV9QdWJsaWNfSUQpOwotCQlmUHVibGljSWRUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlmUHVibGljSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gc3lzdGVtIElECi0JCUxhYmVsIHN5c3RlbUlkTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXN5c3RlbUlkTGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5VSV9TeXN0ZW1fSUQpOwotCQlmU3lzdGVtSWRUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlmU3lzdGVtSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gY3JlYXRlIHNlcGFyYXRvcgotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEudmVydGljYWxTcGFuID0gODsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVzb3VyY2UgdGhpcyBwcm9wZXJ0aWVzIHBhZ2UgaXMgZm9yCi0JICogCi0JICogQHJldHVybiBJUmVzb3VyY2UgZm9yIHRoaXMgcHJvcGVydGllcyBwYWdlIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgIElSZXNvdXJjZQotCSAqLwotCXByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlJQWRhcHRhYmxlIGFkYXB0YWJsZSA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSBhZGFwdGFibGU7Ci0JCX0gZWxzZSBpZiAoYWRhcHRhYmxlICE9IG51bGwpIHsKLQkJCU9iamVjdCBvID0gYWRhcHRhYmxlLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKW87Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN5c3RlbUlkRnJvbShTdHJpbmcgcHVibGljSWQpIHsKLQkJaWYgKHB1YmxpY0lkID09IG51bGwgfHwgcHVibGljSWQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgcmVnID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCUVudW1lcmF0aW9uIGUgPSByZWcuZ2V0RW50cmllcygpOwotCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJSFRNTERvY3VtZW50VHlwZUVudHJ5IGVudHJ5ID0gKEhUTUxEb2N1bWVudFR5cGVFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGVudHJ5LmdldFB1YmxpY0lkKCkuZXF1YWxzKHB1YmxpY0lkKSkKLQkJCQlyZXR1cm4gZW50cnkuZ2V0U3lzdGVtSWQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJaW5pdGlhbGl6ZURvY3R5cGVWYWx1ZXMoKTsKLQkJaW5pdGlhbGl6ZUNTU1Byb2ZpbGVWYWx1ZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNTU1Byb2ZpbGVWYWx1ZXMoKSB7Ci0JCWludCBpbmRleCA9IDA7Ci0JCVN0cmluZyBwcm9maWxlID0gQ1NTQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoQ1NTQ29udGVudFByb3BlcnRpZXMuQ1NTX1BST0ZJTEUsIGdldFJlc291cmNlKCksIGZhbHNlKTsKLQkJaWYgKHByb2ZpbGUgIT0gbnVsbCAmJiBwcm9maWxlLmxlbmd0aCgpID4gMCkgewotCQkJLyoKLQkJCSAqIElmIGl0ZW0gaXMgYWxyZWFkeSBwYXJ0IG9mIGNvbWJvLCBzZWxlY3QgaXQuIE90aGVyd2lzZSwgc2VsZWN0Ci0JCQkgKiBub25lLgotCQkJICovCi0JCQlpbmRleCA9IGZQcm9maWxlSWRzLmluZGV4T2YocHJvZmlsZSk7Ci0JCX0KLQkJaW5kZXggPSBpbmRleCA+PSAwID8gaW5kZXggOiAwOwotCQlmUHJvZmlsZUNvbWJvLnNlbGVjdChpbmRleCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEb2N0eXBlVmFsdWVzKCkgewotCQlpbnQgaW5kZXggPSAwOwotCQlTdHJpbmcgZG9jdHlwZSA9IEhUTUxDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShIVE1MQ29udGVudFByb3BlcnRpZXMuRE9DVU1FTlRfVFlQRSwgZ2V0UmVzb3VyY2UoKSwgZmFsc2UpOwotCQlpZiAoZG9jdHlwZSAhPSBudWxsKSB7Ci0JCQkvKgotCQkJICogSWYgaXRlbSBpcyBhbHJlYWR5IHBhcnQgb2YgY29tYm8sIHNlbGVjdCBpdC4gT3RoZXJ3aXNlLCBzZWxlY3QKLQkJCSAqIG5vbmUuCi0JCQkgKi8KLQkJCWluZGV4ID0gZkRvY3VtZW50VHlwZUlkcy5pbmRleE9mKGRvY3R5cGUpOwotCQl9Ci0KLQkJLy8gc2V0IGNvbWJvYm94Ci0JCWluZGV4ID0gaW5kZXggPj0gMCA/IGluZGV4IDogMDsKLQkJZkRvY3VtZW50VHlwZUNvbWJvLnNlbGVjdChpbmRleCk7Ci0KLQkJdXBkYXRlRG9jdHlwZVRleHQoaW5kZXgsIGRvY3R5cGUpOwotCX0KLQotCXZvaWQgdXBkYXRlRG9jdHlwZVRleHQoaW50IGluZGV4LCBTdHJpbmcgZG9jdHlwZSkgewotCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQkvLyBzZXQgcHVibGljL3N5c3RlbSBpZCB0ZXh0Ci0JCQlmUHVibGljSWRUZXh0LnNldFRleHQoZG9jdHlwZSk7Ci0JCQlTdHJpbmcgc3lzdGVtSWQgPSBnZXRTeXN0ZW1JZEZyb20oZG9jdHlwZSk7Ci0JCQlpZiAoc3lzdGVtSWQgIT0gbnVsbCkKLQkJCQlmU3lzdGVtSWRUZXh0LnNldFRleHQoc3lzdGVtSWQpOwotCQkJZWxzZQotCQkJCWZTeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCS8vIHNldCBwdWJsaWMvc3lzdGVtIGlkIHRleHQKLQkJCWZQdWJsaWNJZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZTeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVZhbHVlcygpIHsKLQkJcG9wdWxhdGVEb2N0eXBlVmFsdWVzKCk7Ci0JCXBvcHVsYXRlQ1NTUHJvZmlsZVZhbHVlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNTU1Byb2ZpbGVWYWx1ZXMoKSB7Ci0JCWZQcm9maWxlSWRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBhZGQgbm9uZSBmaXJzdAotCQlmUHJvZmlsZUNvbWJvLmFkZChTRUxFQ1RfTk9ORSk7Ci0JCWZQcm9maWxlSWRzLmFkZChudWxsKTsKLQotCQlDU1NQcm9maWxlUmVnaXN0cnkgcmVnID0gQ1NTUHJvZmlsZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCUl0ZXJhdG9yIGkgPSByZWcuZ2V0UHJvZmlsZXMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NQcm9maWxlIHByb2ZpbGUgPSAoQ1NTUHJvZmlsZSkgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgaWQgPSBwcm9maWxlLmdldFByb2ZpbGVJRCgpOwotCQkJU3RyaW5nIG5hbWUgPSBwcm9maWxlLmdldFByb2ZpbGVOYW1lKCk7Ci0JCQlmUHJvZmlsZUNvbWJvLmFkZChuYW1lKTsKLQkJCWZQcm9maWxlSWRzLmFkZChpZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVEb2N0eXBlVmFsdWVzKCkgewotCQlmRG9jdW1lbnRUeXBlSWRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBhZGQgbm9uZSBmaXJzdAotCQlmRG9jdW1lbnRUeXBlQ29tYm8uYWRkKFNFTEVDVF9OT05FKTsKLQkJZkRvY3VtZW50VHlwZUlkcy5hZGQobnVsbCk7Ci0KLQkJSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5IHJlZyA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlFbnVtZXJhdGlvbiBlID0gcmVnLmdldEVudHJpZXMoKTsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IChIVE1MRG9jdW1lbnRUeXBlRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKLQkJCVN0cmluZyBwdWJsaWNJZCA9IGVudHJ5LmdldFB1YmxpY0lkKCk7Ci0JCQlTdHJpbmcgZGlzcGxheU5hbWUgPSBlbnRyeS5nZXREaXNwbGF5TmFtZSgpOwotCQkJZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZSAhPSBudWxsID8gZGlzcGxheU5hbWUgOiBwdWJsaWNJZDsKLQotCQkJZkRvY3VtZW50VHlwZUNvbWJvLmFkZChkaXNwbGF5TmFtZSk7Ci0JCQlmRG9jdW1lbnRUeXBlSWRzLmFkZChwdWJsaWNJZCk7Ci0KLQkJCWlmIChkaXNwbGF5TmFtZS5sZW5ndGgoKSA+IG1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5Lmxlbmd0aCgpKSB7Ci0JCQkJbWF4TGVuZ3RoU3RyaW5nSW5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgPSBkaXNwbGF5TmFtZTsKLQkJCX0KLQotCQkJaWYgKGVudHJ5LmdldFN5c3RlbUlkKCkgPT0gbnVsbCkKLQkJCQljb250aW51ZTsgLy8gaWYgSFRNTCBlbnRyeQotCi0KLQkJCWlmIChlbnRyeS5nZXRTeXN0ZW1JZCgpLmxlbmd0aCgpID4gbWF4TGVuZ3RoU3RyaW5nSW5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkubGVuZ3RoKCkpCi0JCQkJbWF4TGVuZ3RoU3RyaW5nSW5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgPSBlbnRyeS5nZXRTeXN0ZW1JZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXB1dGVNYXhXaWR0aEhpbnQoKSB7Ci0JCS8vIG1heExlbmd0aFN0cmluZyB3YXMgc2V0IHBvcHVsYXRlRG9jdHlwZVZhbHVlcyB3YXMgY2FsbGVkCi0JCVN0cmluZyBtYXhMZW5ndGhTdHJpbmcgPSBtYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeTsKLQkJU3RyaW5nIGJhY2t1cCA9IGZTeXN0ZW1JZFRleHQuZ2V0VGV4dCgpOwotCQlmU3lzdGVtSWRUZXh0LnNldFRleHQobWF4TGVuZ3RoU3RyaW5nKTsKLQkJaW50IG1heFdpZHRoSGludCA9IGZTeXN0ZW1JZFRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQlmU3lzdGVtSWRUZXh0LnNldFRleHQoYmFja3VwKTsKLQotCQlpZiAoZkRvY3VtZW50VHlwZUNvbWJvLmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgZkRvY3VtZW50VHlwZUNvbWJvLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAoZlB1YmxpY0lkVGV4dC5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIGZQdWJsaWNJZFRleHQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0JCWlmIChmU3lzdGVtSWRUZXh0LmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgZlN5c3RlbUlkVGV4dC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQkJaWYgKGZQcm9maWxlQ29tYm8uZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSBmUHJvZmlsZUNvbWJvLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtQ1NTUHJvZmlsZURlZmF1bHRzKCkgewotCQlpbnQgaW5kZXggPSBmUHJvZmlsZUNvbWJvLmluZGV4T2YoU0VMRUNUX05PTkUpOwotCQlpZiAoaW5kZXggPiAtMSkKLQkJCWZQcm9maWxlQ29tYm8uc2VsZWN0KGluZGV4KTsKLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcGVyZm9ybUNTU1Byb2ZpbGVPaygpIHsKLQkJaW50IGluZGV4ID0gZlByb2ZpbGVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPiAtMSkgewotCQkJU3RyaW5nIGlkID0gKFN0cmluZykgZlByb2ZpbGVJZHMuZ2V0KGluZGV4KTsKLQkJCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDAgfHwgaWQuZXF1YWxzSWdub3JlQ2FzZShTRUxFQ1RfTk9ORSkpIHsKLQkJCQkvLyBpZiBub25lLCB1c2UgbnVsbAotCQkJCWlkID0gbnVsbDsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJQ1NTQ29udGVudFByb3BlcnRpZXMuc2V0UHJvcGVydHkoQ1NTQ29udGVudFByb3BlcnRpZXMuQ1NTX1BST0ZJTEUsIGdldFJlc291cmNlKCksIGlkKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBtYXliZSBpbiBmdXR1cmUsIGxldCB1c2VyIGtub3cgdGhlcmUgd2FzIGEgcHJvYmxlbSBzYXZpbmcKLQkJCQkvLyBmaWxlCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0KLQkJcGVyZm9ybURvY3R5cGVEZWZhdWx0cygpOwotCQlwZXJmb3JtQ1NTUHJvZmlsZURlZmF1bHRzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1Eb2N0eXBlRGVmYXVsdHMoKSB7Ci0JCWZQdWJsaWNJZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQlmU3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWludCBpbmRleCA9IGZEb2N1bWVudFR5cGVDb21iby5pbmRleE9mKFNFTEVDVF9OT05FKTsKLQkJaWYgKGluZGV4ID4gLTEpCi0JCQlmRG9jdW1lbnRUeXBlQ29tYm8uc2VsZWN0KGluZGV4KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcGVyZm9ybURvY3R5cGVPaygpIHsKLQkJaW50IGluZGV4ID0gZkRvY3VtZW50VHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA+IC0xKSB7Ci0JCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBmRG9jdW1lbnRUeXBlSWRzLmdldChpbmRleCk7Ci0JCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5lcXVhbHNJZ25vcmVDYXNlKFNFTEVDVF9OT05FKSkgewotCQkJCS8vIGlmIG5vbmUsIHVzZSBudWxsCi0JCQkJaWQgPSBudWxsOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlIVE1MQ29udGVudFByb3BlcnRpZXMuc2V0UHJvcGVydHkoSFRNTENvbnRlbnRQcm9wZXJ0aWVzLkRPQ1VNRU5UX1RZUEUsIGdldFJlc291cmNlKCksIGlkKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBtYXliZSBpbiBmdXR1cmUsIGxldCB1c2VyIGtub3cgdGhlcmUgd2FzIGEgcHJvYmxlbSBzYXZpbmcKLQkJCQkvLyBmaWxlCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJcGVyZm9ybURvY3R5cGVPaygpOwotCQlwZXJmb3JtQ1NTUHJvZmlsZU9rKCk7Ci0KLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1PaygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXJIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZGIwMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXJIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb3JyZWN0aW9uLkNvcnJlY3Rpb25Qcm9jZXNzb3JYTUw7Ci0KLS8qKgotICogQ29ycmVjdGlvbiBhc3Npc3RhbnQgZm9yIEhUTUwKLSAqIAotICogQGRlcHJlY2F0ZWQgc2luY2UgMi4wIFJDMCBVc2UKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucXVpY2thc3Npc3QuSVF1aWNrQXNzaXN0UHJvY2Vzc29yOwotICovCi1wdWJsaWMgY2xhc3MgQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVySFRNTCBleHRlbmRzIENvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlciB7Ci0KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RhbnQgZ2V0Q29ycmVjdGlvbkFzc2lzdGFudChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlJQ29udGVudEFzc2lzdGFudCBjYSA9IG51bGw7Ci0KLQkJaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQlDb250ZW50QXNzaXN0YW50IGFzc2lzdGFudCA9IG5ldyBDb250ZW50QXNzaXN0YW50KCk7Ci0KLQkJCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGNvcnJlY3Rpb25Qcm9jZXNzb3IgPSBuZXcgQ29ycmVjdGlvblByb2Nlc3NvclhNTChzb3VyY2VWaWV3ZXIpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLlhNTF9DREFUQSk7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29ycmVjdGlvblByb2Nlc3NvciwgSVhNTFBhcnRpdGlvbnMuWE1MX0NPTU1FTlQpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLlhNTF9ERUNMQVJBVElPTik7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29ycmVjdGlvblByb2Nlc3NvciwgSVhNTFBhcnRpdGlvbnMuWE1MX1BJKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5EVERfU1VCU0VUKTsKLQkJCX0KLQkJCWNhID0gYXNzaXN0YW50OwotCQl9Ci0KLQkJcmV0dXJuIGNhOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZGVyaXZlZC9TaW5nbGVDaGFyUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg2MGJiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5kZXJpdmVkOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotLyoKLSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQuamF2YWRvYy5TaW5nbGVDaGFyUmVhZGVyLgotICogTW9kaWZpY2F0aW9uIHdhcyBtYWRlIHRvIGZpeCBzdGF0ZW1lbnQgdW5uZWNlc3NhcmlseSBuZXN0ZWQgd2l0aGluIGVsc2UKLSAqIGNsYXVzZSB3YXJuaW5nIGluIHJlYWQoLi4pLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2luZ2xlQ2hhclJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkKGNoYXJbXSxpbnQsaW50KQotCSAqLwotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNidWZbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGVuZCA9IG9mZiArIGxlbjsKLQkJZm9yIChpbnQgaSA9IG9mZjsgaSA8IGVuZDsgaSsrKSB7Ci0JCQlpbnQgY2ggPSByZWFkKCk7Ci0JCQlpZiAoY2ggPT0gLTEpIHsKLQkJCQlpZiAoaSA9PSBvZmYpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlyZXR1cm4gaSAtIG9mZjsKLQkJCX0KLQkJCWNidWZbaV0gPSAoY2hhcikgY2g7Ci0JCX0KLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkeSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb250ZW50IGFzIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgY2g7Ci0JCXdoaWxlICgoY2ggPSByZWFkKCkpICE9IC0xKSB7Ci0JCQlidWYuYXBwZW5kKChjaGFyKSBjaCk7Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQWN0aW9uQ29udHJpYnV0b3JIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0L3VpL0FjdGlvbkNvbnRyaWJ1dG9ySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDcxZDA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQWN0aW9uQ29udHJpYnV0b3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25Db250cmlidXRvclhNTDsKLQotLyoqCi0gKgotICogSW5zdGVhZCwgdXNlIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvciBmb3Igc291cmNlIHBhZ2UgY29udHJpYnV0b3IKLSAqIG9mIG11bHRpIHBhZ2UgZWRpdG9yLgotICogCi0gKiBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBzdGlsbCB2YWxpZCBmb3Igc2luZ2xlIHBhZ2UgZWRpdG9yLgotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uQ29udHJpYnV0b3JIVE1MIGV4dGVuZHMgQWN0aW9uQ29udHJpYnV0b3JYTUwgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVESVRPUl9JRFMgPSB7Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEV4dGVuc2lvbklEcygpIHsKLQkJcmV0dXJuIEVESVRPUl9JRFM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwQWN0aW9uSFRNTERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0L3VpL0NsZWFudXBBY3Rpb25IVE1MRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4ZmQ1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0L3VpL0NsZWFudXBBY3Rpb25IVE1MRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNsZWFudXAuSFRNTENsZWFudXBQcm9jZXNzb3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0vKioKLSAqIENsZWFudXAgYWN0aW9uIGRlbGVnYXRlIGZvciBIVE1MIGVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ2xlYW51cEFjdGlvbkhUTUxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSwgSUFjdGlvbkRlbGVnYXRlMiwgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCXByaXZhdGUgSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGZDbGVhbnVwUHJvY2Vzc29yOwotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJZkVkaXRvciA9IHRhcmdldEVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBudWxsaW5nIG91dCBqdXN0IGluIGNhc2UKLQkJZkVkaXRvciA9IG51bGw7Ci0JCWZDbGVhbnVwUHJvY2Vzc29yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuQ2xlYW51cERvY3VtZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChIVE1MVUlNZXNzYWdlcy5DbGVhbnVwRG9jdW1lbnRfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oSFRNTFVJTWVzc2FnZXMuQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsKLQkJcnVuKGFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCWZpbmFsIElUZXh0RWRpdG9yIGVkaXRvciA9IChJVGV4dEVkaXRvcikgZkVkaXRvcjsKLQkJCUNsZWFudXBEaWFsb2dIVE1MIGNsZWFudXBEaWFsb2cgPSBuZXcgQ2xlYW51cERpYWxvZ0hUTUwoZWRpdG9yLmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCWNsZWFudXBEaWFsb2cuc2V0aXNYSFRNTFR5cGUoaXNYSFRNTCgpKTsKLQkJCWlmIChjbGVhbnVwRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQkvLyBzZXR1cCBydW5uYWJsZQotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgY2xlYW51cFByb2Nlc3NvciA9IGdldENsZWFudXBQcm9jZXNzb3IoKTsKLQkJCQkJCWlmIChjbGVhbnVwUHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkpOwotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCQkJCWNsZWFudXBQcm9jZXNzb3IuY2xlYW51cE1vZGVsKG1vZGVsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCS8vIFRPRE86IG1ha2UgaW5kZXBlbmRlbnQgb2YgJ21vZGVsJy4KLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkpOwotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gYmVnaW4gcmVjb3JkaW5nCi0JCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgU1NFVUlNZXNzYWdlcy5DbGVhbnVwX0RvY3VtZW50X1VJXywgU1NFVUlNZXNzYWdlcy5DbGVhbnVwX0RvY3VtZW50X1VJXywgc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gbWFrZSBhIGJpZwotCQkJCQkJLy8gbW9kZWwgY2hhbmdlCi0JCQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCQkJLy8gcnVuCi0JCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgcnVubmFibGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcKLQkJCQkJCS8vIG1vZGVsCi0JCQkJCQkvLyBjaGFuZ2UKLQkJCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCi0JCQkJCQkvLyBlbmQgcmVjb3JkaW5nCi0JCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMsIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUlTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBnZXRDbGVhbnVwUHJvY2Vzc29yKCkgewotCQlpZiAoZkNsZWFudXBQcm9jZXNzb3IgPT0gbnVsbCkKLQkJCWZDbGVhbnVwUHJvY2Vzc29yID0gbmV3IEhUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbCgpOwotCi0JCXJldHVybiBmQ2xlYW51cFByb2Nlc3NvcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNYSFRNTCgpIHsKLQkJYm9vbGVhbiBpc3hodG1sID0gZmFsc2U7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGZFZGl0b3I7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCUlET01Eb2N1bWVudCBkb21Eb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJaWYgKGRvbURvY3VtZW50ICE9IG51bGwpCi0JCQkJCQlpc3hodG1sID0gZG9tRG9jdW1lbnQuaXNYTUxUeXBlKCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpc3hodG1sOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cERpYWxvZ0hUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cERpYWxvZ0hUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc2NDIxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0L3VpL0NsZWFudXBEaWFsb2dIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQ2xlYW51cERpYWxvZ0hUTUwgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3M7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3M7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hGb3JtYXRTb3VyY2U7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93czsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4OwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYzsKLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZlByZWZlcmVuY2VzID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZklzWEhUTUwgPSBmYWxzZTsKLQlwcml2YXRlIEdyb3VwIGZUYWdOYW1lQ2FzZTsKLQlwcml2YXRlIEdyb3VwIGZBdHRyTmFtZUNhc2U7Ci0KLQlwdWJsaWMgQ2xlYW51cERpYWxvZ0hUTUwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIoc2hlbGwpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlnZXRTaGVsbCgpLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuQ2xlYW51cF9VSV8pOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQljcmVhdGVEaWFsb2dBcmVhSW5Db21wb3NpdGUoY29tcG9zaXRlKTsKLQkJaW5pdGlhbGl6ZU9wdGlvbnMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUJ1dHRvbkJhcihwYXJlbnQpOwotCQlva0J1dHRvbkVuYWJsZW1lbnQoKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGlhbG9nQXJlYUluQ29tcG9zaXRlRm9ySFRNTChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vIENvbnZlcnQgdGFnIG5hbWUgY2FzZQotCQkvLyBkMjU3MDY0IG5lZWQgdG8gYXNzb2NpYXRlIGdyb3VwIHcvIHJhZGlvIGJ1dHRvbnMgc28gcmFkaW8gYnV0dG9ucwotCQkvLyBoZWFkZXIgY2FuIGJlIHJlYWQKLQkJZlRhZ05hbWVDYXNlID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlmVGFnTmFtZUNhc2Uuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5UYWdfbmFtZV9jYXNlX2Zvcl9IVE1MX1VJXyk7Ci0JCUdyaWRMYXlvdXQgaExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWhMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWZUYWdOYW1lQ2FzZS5zZXRMYXlvdXQoaExheW91dCk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlQXNpcyA9IG5ldyBCdXR0b24oZlRhZ05hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUFzaXMuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5UYWdfbmFtZV9jYXNlX0FzX2lzX1VJXyk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlQXNpcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlciA9IG5ldyBCdXR0b24oZlRhZ05hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUxvd2VyLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVGFnX25hbWVfY2FzZV9Mb3dlcl9VSV8pOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUxvd2VyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyID0gbmV3IEJ1dHRvbihmVGFnTmFtZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlVXBwZXIuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5UYWdfbmFtZV9jYXNlX1VwcGVyX1VJXyk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlVXBwZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gQ29udmVydCBhdHRyIG5hbWUgY2FzZQotCQkvLyBkMjU3MDY0IG5lZWQgdG8gYXNzb2NpYXRlIGdyb3VwIHcvIHJhZGlvIGJ1dHRvbnMgc28gcmFkaW8gYnV0dG9ucwotCQkvLyBoZWFkZXIgY2FuIGJlIHJlYWQKLQkJZkF0dHJOYW1lQ2FzZSA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZkF0dHJOYW1lQ2FzZS5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9uYW1lX2Nhc2VfZm9yX0hUTUxfVUlfKTsKLQkJZkF0dHJOYW1lQ2FzZS5zZXRMYXlvdXQoaExheW91dCk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUFzaXMgPSBuZXcgQnV0dG9uKGZBdHRyTmFtZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUFzaXMuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfbmFtZV9jYXNlX0FzX2lzX1VJXyk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUFzaXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyID0gbmV3IEJ1dHRvbihmQXR0ck5hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlci5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9uYW1lX2Nhc2VfTG93ZXJfVUlfKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlTG93ZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZVVwcGVyID0gbmV3IEJ1dHRvbihmQXR0ck5hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VVcHBlci5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9uYW1lX2Nhc2VfVXBwZXJfVUlfKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGlhbG9nQXJlYUluQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJY3JlYXRlRGlhbG9nQXJlYUluQ29tcG9zaXRlRm9ySFRNTChjb21wb3NpdGUpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLkNMRUFOVVBfSFRNTF9IRUxQSUQpOyAvLyB1c2UKLQkJLy8gSFRNTAotCQkvLyBzcGVjaWZpYwotCQkvLyBoZWxwCi0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gQ29tcHJlc3MgZW1wdHkgZWxlbWVudCB0YWdzCi0JCWZDaGVja0JveENvbXByZXNzRW1wdHlFbGVtZW50VGFncyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3Muc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkNvbXByZXNzX2VtcHR5X2VsZW1lbnRfdGFnc19VSV8pOwotCQlmQ2hlY2tCb3hDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gSW5zZXJ0IG1pc3NpbmcgcmVxdWlyZWQgYXR0cnMKLQkJZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuSW5zZXJ0X3JlcXVpcmVkX2F0dHJpYnV0ZXNfVUlfKTsKLQkJZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBJbnNlcnQgbWlzc2luZyBiZWdpbi9lbmQgdGFncwotCQlmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncy5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkluc2VydF9taXNzaW5nX3RhZ3NfVUlfKTsKLQkJZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3MuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gUXVvdGUgYXR0cmlidXRlIHZhbHVlcwotCQlmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuUXVvdGVfYXR0cmlidXRlX3ZhbHVlc19VSV8pOwotCQlmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gRm9ybWF0IHNvdXJjZQotCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2UgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94Rm9ybWF0U291cmNlLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuRm9ybWF0X3NvdXJjZV9VSV8pOwotCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gQ29udmVydCBFT0wgY29kZQotCQlmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94Q29udmVydEVPTENvZGVzLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuQ29udmVydF9FT0xfY29kZXNfVUlfKTsKLQkJZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlDb21wb3NpdGUgRU9MQ29kZXMgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGhMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQloTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlFT0xDb2Rlcy5zZXRMYXlvdXQoaExheW91dCk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzID0gbmV3IEJ1dHRvbihFT0xDb2RlcywgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3Muc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5FT0xfV2luZG93c19VSSk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peCA9IG5ldyBCdXR0b24oRU9MQ29kZXMsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LnNldFRleHQoSFRNTFVJTWVzc2FnZXMuRU9MX1VuaXhfVUkpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYyA9IG5ldyBCdXR0b24oRU9MQ29kZXMsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5FT0xfTWFjX1VJKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXN0b3JlT3B0aW9ucygpOwotCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcHRpb25zRm9ySFRNTCgpIHsKLQkJYm9vbGVhbiBjYXNlU2Vuc2l0aXZlID0gaXNYSFRNTFR5cGUoKTsKLQotCQlpZiAoY2FzZVNlbnNpdGl2ZSkgewotCQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgdGFnTmFtZUNhc2UgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfVEFHX05BTUVfQ0FTRSk7Ci0JCQlpZiAodGFnTmFtZUNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpIHsKLQkJCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCX0gZWxzZSBpZiAodGFnTmFtZUNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlCi0JCQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VBc2lzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCi0JCWlmIChjYXNlU2Vuc2l0aXZlKSB7Ci0JCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgYXR0ck5hbWVDYXNlID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFKTsKLQkJCWlmIChhdHRyTmFtZUNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpIHsKLQkJCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VVcHBlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl9IGVsc2UgaWYgKGF0dHJOYW1lQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlCi0JCQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlQXNpcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQotCQllbmFibGVDYXNlQ29udHJvbHMoIWNhc2VTZW5zaXRpdmUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcHRpb25zKCkgewotCQlpbml0aWFsaXplT3B0aW9uc0ZvckhUTUwoKTsKLQotCQlmQ2hlY2tCb3hDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3Muc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUykpOwotCQlmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMpKTsKLQkJZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3Muc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MpKTsKLQkJZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUykpOwotCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2Uuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpKTsKLQkJZkNoZWNrQm94Q29udmVydEVPTENvZGVzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT05WRVJUX0VPTF9DT0RFUykpOwotCQlpZiAoZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlTdHJpbmcgRU9MQ29kZSA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSk7Ci0JCQlpZiAoRU9MQ29kZSA9PSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5MRikKLQkJCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlIGlmIChFT0xDb2RlID09IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkNSKQotCQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZQotCQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQllbmFibGVFT0xDb2RlUmFkaW9zKGZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVPcHRpb25zRm9ySFRNTCgpIHsKLQkJaWYgKCFpc1hIVE1MVHlwZSgpICYmIGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWVsc2UgaWYgKGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCWVsc2UKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX1RBR19OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCi0JCWlmICghaXNYSFRNTFR5cGUoKSAmJiBmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWVsc2UgaWYgKGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKQotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJZWxzZQotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCi0JCS8vIGV4cGxpY2l0bHkgc2F2ZSBwbHVnaW4gcHJlZmVyZW5jZXMgc28gdmFsdWVzIGFyZSBzdG9yZWQKLQkJSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlT3B0aW9ucygpIHsKLQkJc3RvcmVPcHRpb25zRm9ySFRNTCgpOwotCi0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MsIGZDaGVja0JveENvbXByZXNzRW1wdHlFbGVtZW50VGFncy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMsIGZDaGVja0JveEluc2VydFJlcXVpcmVkQXR0cnMuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUywgZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3MuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMsIGZDaGVja0JveFF1b3RlQXR0clZhbHVlcy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFLCBmQ2hlY2tCb3hGb3JtYXRTb3VyY2UuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMsIGZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJaWYgKGZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5nZXRTZWxlY3Rpb24oKSkgewotCQkJaWYgKGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkxGKTsKLQkJCX0gZWxzZSBpZiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUik7Ci0JCQl9IGVsc2UgewotCQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUkxGKTsKLQkJCX0KLQkJfQotCi0JCS8vIGV4cGxpY2l0bHkgc2F2ZSBwbHVnaW4gcHJlZmVyZW5jZXMgc28gdmFsdWVzIGFyZSBzdG9yZWQKLQkJSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCXdpZGdldFNlbGVjdGVkKGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IGZDaGVja0JveENvbnZlcnRFT0xDb2RlcykKLQkJCWVuYWJsZUVPTENvZGVSYWRpb3MoZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmdldFNlbGVjdGlvbigpKTsKLQotCQlva0J1dHRvbkVuYWJsZW1lbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1hIVE1MVHlwZSgpIHsKLQkJcmV0dXJuIGZJc1hIVE1MOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZUVPTENvZGVSYWRpb3MoYm9vbGVhbiBlbmFibGUpIHsKLQkJaWYgKChmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cyAhPSBudWxsKSAmJiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXggIT0gbnVsbCkgJiYgKGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMgIT0gbnVsbCkpIHsKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuc2V0RW5hYmxlZChlbmFibGUpOwotCi0JCQlpZiAoIWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLmdldFNlbGVjdGlvbigpICYmICFmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5nZXRTZWxlY3Rpb24oKSAmJiAhZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5nZXRTZWxlY3Rpb24oKSkKLQkJCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbmFibGVzL2Rpc2FibGVzIHRoZSB0YWcvYXR0ciBjYXNlIHJhZGlvIGJ1dHRvbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5hYmxlQ2FzZUNvbnRyb2xzKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWZUYWdOYW1lQ2FzZS5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlQXNpcy5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIuc2V0RW5hYmxlZChlbmFibGUpOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyLnNldEVuYWJsZWQoZW5hYmxlKTsKLQotCQlmQXR0ck5hbWVDYXNlLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlQXNpcy5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXIuc2V0RW5hYmxlZChlbmFibGUpOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZXMvZGlzYWJsZXMgT0sgYnV0dG9uCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIG9rQnV0dG9uRW5hYmxlbWVudCgpIHsKLQkJYm9vbGVhbiB0YWdOYW1lQ2FzZUNoZWNrID0gKChmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyICE9IG51bGwgJiYgZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkgfHwgZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCWJvb2xlYW4gYXR0ck5hbWVDYXNlQ2hlY2sgPSAoKGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZVVwcGVyICE9IG51bGwgJiYgZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpIHx8IGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKTsKLQkJYm9vbGVhbiBlb2xDaGVjayA9IGZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5nZXRTZWxlY3Rpb24oKSAmJiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguZ2V0U2VsZWN0aW9uKCkgfHwgZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5nZXRTZWxlY3Rpb24oKSB8fCBmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWJvb2xlYW4gYnV0dG9uRW5hYmxlZCA9IGZhbHNlOwotCQlpZiAoaXNYSFRNTFR5cGUoKSl7Ci0JCQlidXR0b25FbmFibGVkID0gZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycy5nZXRTZWxlY3Rpb24oKSB8fCBmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncy5nZXRTZWxlY3Rpb24oKSB8fCBmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMuZ2V0U2VsZWN0aW9uKCkgfHwgZkNoZWNrQm94Rm9ybWF0U291cmNlLmdldFNlbGVjdGlvbigpIHx8IGVvbENoZWNrOwotCQl9Ci0JCWVsc2UgewotCQkJYnV0dG9uRW5hYmxlZCA9IHRhZ05hbWVDYXNlQ2hlY2sgfHwgYXR0ck5hbWVDYXNlQ2hlY2sgfHwgZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycy5nZXRTZWxlY3Rpb24oKSB8fCBmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncy5nZXRTZWxlY3Rpb24oKSB8fCBmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMuZ2V0U2VsZWN0aW9uKCkgfHwgZkNoZWNrQm94Rm9ybWF0U291cmNlLmdldFNlbGVjdGlvbigpIHx8IGVvbENoZWNrOwotCQl9Ci0JCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGJ1dHRvbkVuYWJsZWQpOwotCX0KLQotCXZvaWQgc2V0aXNYSFRNTFR5cGUoYm9vbGVhbiBpc1hIVE1MKSB7Ci0JCWZJc1hIVE1MID0gaXNYSFRNTDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0L3VpL0NsZWFudXBEb2N1bWVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cERvY3VtZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWM1MjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cERvY3VtZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkhUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotcHVibGljIGNsYXNzIENsZWFudXBEb2N1bWVudEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZkNsZWFudXBQcm9jZXNzb3I7Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBudWxsaW5nIG91dCBqdXN0IGluIGNhc2UKLQkJZkNsZWFudXBQcm9jZXNzb3IgPSBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvclBhcnQ7Ci0JCWVsc2UgewotCQkJT2JqZWN0IG8gPSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCWZpbmFsIElUZXh0RWRpdG9yIGVkaXRvciA9IHRleHRFZGl0b3I7Ci0JCQlDbGVhbnVwRGlhbG9nSFRNTCBjbGVhbnVwRGlhbG9nID0gbmV3IENsZWFudXBEaWFsb2dIVE1MKGVkaXRvci5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQljbGVhbnVwRGlhbG9nLnNldGlzWEhUTUxUeXBlKGlzWEhUTUwoZWRpdG9yKSk7Ci0JCQlpZiAoY2xlYW51cERpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJLy8gc2V0dXAgcnVubmFibGUKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IgPSBnZXRDbGVhbnVwUHJvY2Vzc29yKCk7Ci0JCQkJCQlpZiAoY2xlYW51cFByb2Nlc3NvciAhPSBudWxsKSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCQkJCQljbGVhbnVwUHJvY2Vzc29yLmNsZWFudXBNb2RlbChtb2RlbCk7Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0KLQkJCQkvLyBUT0RPOiBtYWtlIGluZGVwZW5kZW50IG9mICdtb2RlbCcuCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vIGJlZ2luIHJlY29yZGluZwotCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcKLQkJCQkJCS8vIG1vZGVsIGNoYW5nZQotCQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQkJCS8vIHJ1bgotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgcnVubmFibGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcKLQkJCQkJCS8vIG1vZGVsCi0JCQkJCQkvLyBjaGFuZ2UKLQkJCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCi0JCQkJCQkvLyBlbmQgcmVjb3JkaW5nCi0JCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMsIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUlTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBnZXRDbGVhbnVwUHJvY2Vzc29yKCkgewotCQlpZiAoZkNsZWFudXBQcm9jZXNzb3IgPT0gbnVsbCkKLQkJCWZDbGVhbnVwUHJvY2Vzc29yID0gbmV3IEhUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbCgpOwotCi0JCXJldHVybiBmQ2xlYW51cFByb2Nlc3NvcjsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzWEhUTUwoSVRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCWJvb2xlYW4gaXN4aHRtbCA9IGZhbHNlOwotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCUlET01Eb2N1bWVudCBkb21Eb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJaWYgKGRvbURvY3VtZW50ICE9IG51bGwpCi0JCQkJCQlpc3hodG1sID0gZG9tRG9jdW1lbnQuaXNYTUxUeXBlKCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpc3hodG1sOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXRvci9IVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXRvci9IVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2NDUwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgaW1hZ2VzIHByb3ZpZGVkIGJ5IHRoaXMgcGx1Zy1pbi4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUExVR0lOSUQgPSBIVE1MVUlQbHVnaW4uSUQ7Ci0JcHJpdmF0ZSBzdGF0aWMgSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyIGluc3RhbmNlID0gbnVsbDsKLQotCS8vCSBzYXZlIGEgZGVzY3JpcHRvciBmb3IgZWFjaCBpbWFnZQotCXByaXZhdGUgSGFzaE1hcCBmSW1hZ2VEZXNjUmVnaXN0cnkgPSBudWxsOwotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UgZnJvbSB0aGUgaW1hZ2UgcmVnaXN0cnkuCi0JICogSWYgdGhlIGltYWdlIGNhbm5vdCBiZSByZXRyaWV2ZWQsIGF0dGVtcHQgdG8gZmluZCBhbmQgbG9hZCB0aGUgaW1hZ2UgYXQKLQkgKiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZSB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIG9yIG51bGwgaWYgb25lIGNvdWxkCi0JICogICAgICAgICBub3QgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYW4gaW1hZ2UKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlCi0JICogZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgdGhlIGltYWdlIGRlc2NyaXB0b3IgY2Fubm90IGJlIHJldHJpZXZlZCwKLQkgKiBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZAotCSAqIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIGRlc2NyaXB0b3IgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2F0ZWQgd2l0aCByZXNvdXJjZSBvcgotCSAqICAgICAgICAgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgb25lIGNvdWxkIG5vdCBiZQotCSAqICAgICAgICAgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCU9iamVjdCBvID0gZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQkvL2NyZWF0ZSBhIGRlc2NyaXB0b3IKLQkJCWltYWdlRGVzY3JpcHRvciA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSAoSW1hZ2VEZXNjcmlwdG9yKSBvOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBIYXNoTWFwIC0gaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSB7Ci0JCWlmIChmSW1hZ2VEZXNjUmVnaXN0cnkgPT0gbnVsbCkKLQkJCWZJbWFnZURlc2NSZWdpc3RyeSA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBmSW1hZ2VEZXNjUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSW1hZ2VSZWdpc3RyeSAtIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gSFRNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGFkZHMgdGhlIGltYWdlIHRvIHRoZQotCSAqIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gSW1hZ2UKLQkgKi8KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJCi0JCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCWltYWdlID0gZGVzYy5jcmVhdGVJbWFnZSgpOwotCQkJLy8gZG9udCBhZGQgdGhlIG1pc3NpbmcgaW1hZ2UgZGVzY3JpcHRvciBpbWFnZSB0byB0aGUgaW1hZ2UgcmVnaXN0cnkKLQkJCWlmICghZGVzYy5lcXVhbHMoSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKSkpCi0JCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChyZXNvdXJjZSwgaW1hZ2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGRlc2NyaXB0b3IgZnJvbSB0aGUgZ2l2ZW4gaW1hZ2VGaWxlUGF0aCBhbmQgYWRkcyB0aGUKLQkgKiBpbWFnZSBkZXNjcmlwdG9yIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiBhbiBpbWFnZQotCSAqIGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGNyZWF0ZWQsIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yCi0JICogaXMgcmV0dXJuZWQgYnV0IG5vdCBhZGRlZCB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2VGaWxlUGF0aAotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIGltYWdlIGRlc2NyaXB0b3IgZm9yIGltYWdlRmlsZVBhdGggb3IgZGVmYXVsdAotCSAqICAgICAgICAgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgcmVzb3VyY2UgY291bGQgbm90IGJlIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpbWFnZUZpbGVQYXRoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOSUQsIGltYWdlRmlsZVBhdGgpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCWdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkucHV0KGltYWdlRmlsZVBhdGgsIGltYWdlRGVzY3JpcHRvcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSFRNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0hUTUxFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhMGYyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSFRNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLS8qKgotICogQnVuZGxlIG9mIG1vc3QgaW1hZ2VzIHVzZWQgYnkgdGhlIEhUTUwgRWRpdG9yIHBsdWctaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzIHsgCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFCTEUgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWJsZS5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19BTkNIT1IgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctYW5jaG9yLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0JPRFkgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctYm9keS5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19CVVRUT04gPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctYnV0dG9uLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0ZPTlQgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctZm9udC5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19GT1JNID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLWZvcm0uZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfR0VORVJJQyA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0hUTUwgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctaHRtbC5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19JTUFHRV9NQVAgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UtbWFwLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0lNQUdFID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLWltYWdlLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0pTUCA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1qc3AuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfVEVNUExBVEUgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctdGVtcGxhdGUuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfVElUTEUgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctdGl0bGUuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUcgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWcuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWkJBTl9ORVdIVE1MRklMRSA9ICJpY29ucy9mdWxsL3dpemJhbi9uZXdoZmlsZV93aXoucG5nIjsJCQkvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OWI3MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgSFRNTCBTb3VyY2UgRWRpdG9yLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBjb250YWlucyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhlbHBDb250ZXh0SWRzIHsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBIVE1MVUlQbHVnaW4uSUQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIC8vIGZpZ3VyZWQgb3V0IG9uIHRoZSBmbHkKLQkvLyAvLyBIVE1MIFNvdXJjZSBwYWdlIGVkaXRvcgotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfU09VUkNFVklFV19IRUxQSUQgPQotCS8vIENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCArIl9zb3VyY2VfSGVscElkIjsKLQkvLyAvLyROT04tTkxTLTEkCi0JCi0JLy8gSFRNTCBGaWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAzMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBIVE1MIFNvdXJjZSBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1BSRUZXRUJYX1NPVVJDRV9IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMzEiOyAvLyROT04tTkxTLTEkCi0JLy8gSFRNTCBTdHlsZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDMyIjsgLy8kTk9OLU5MUy0xJAotCS8vIEhUTUwgVGVtcGxhdGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfUFJFRldFQlhfVEVNUExBVEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAzMyI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JLy8gSFRNTCBDbGVhbnVwIGRpYWxvZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOVVBfSFRNTF9IRUxQSUQgPSBQUkVGSVggKyAieG1sbTExMDAiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gSFRNTCBDb250ZW50IFNldHRpbmdzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0NPTlRFTlRfU0VUVElOR1NfSEVMUElEID0gUFJFRklYICsgIm1pc2MwMTcwIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIEhUTUwgTmV3IEZpbGUgV2l6YXJkIC0gVGVtcGxhdGUgUGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfTkVXV0laQVJEX1RFTVBMQVRFX0hFTFBJRCA9IFBSRUZJWCArICJodG1sdzAwMTAiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9oYW5kbGVycy9IVE1MRmluZE9jY3VycmVuY2VzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvSFRNTEZpbmRPY2N1cnJlbmNlc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhjYzMxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9oYW5kbGVycy9IVE1MRmluZE9jY3VycmVuY2VzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zZWFyY2guSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5QbGF0Zm9ybVN0YXR1c0xpbmVVdGlsOwotCi1wdWJsaWMgY2xhc3MgSFRNTEZpbmRPY2N1cnJlbmNlc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7Ci0JcHJpdmF0ZSBMaXN0IGZQcm9jZXNzb3JzOwotCi0JCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSGFuZGxlclV0aWwuZ2V0QWN0aXZlRWRpdG9yKGV2ZW50KTsKLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCWJvb2xlYW4gb2theSA9IGZhbHNlOwotCQkKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIHsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCQotCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gZ2V0VGV4dFNlbGVjdGlvbih0ZXh0RWRpdG9yKTsKLQkJCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZmluZE9jY3VycmVuY2VQcm9jZXNzb3IgPSBnZXRQcm9jZXNzb3JGb3JDdXJyZW50U2VsZWN0aW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQkJCQlpZiAoZmluZE9jY3VycmVuY2VQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJCQlpZiAodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJCQkJSUZpbGUgZmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgdGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0JCQkJCQlva2F5ID0gZmluZE9jY3VycmVuY2VQcm9jZXNzb3IuZmluZE9jY3VycmVuY2VzKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uLCBmaWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAob2theSkgewotCQkJLy8gY2xlYXIgc3RhdHVzIG1lc3NhZ2UKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gU1NFVUlNZXNzYWdlcy5GaW5kT2NjdXJyZW5jZXNBY3Rpb25Qcm92aWRlcl8wOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodGV4dEVkaXRvciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0RWRpdG9yKSB7Ci0JCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5VGVtcG9yYXJ5RXJyb3JNZXNzYWdlKCgoU3RydWN0dXJlZFRleHRFZGl0b3IpIHRleHRFZGl0b3IpLmdldFRleHRWaWV3ZXIoKSwgZXJyb3JNZXNzYWdlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuZGlzcGxheUVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuYWRkT25lVGltZUNsZWFyTGlzdGVuZXIoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBhcHByb3ByaWF0ZSBmaW5kIG9jY3VycmVuY2VzIHByb2Nlc3NvcgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICBhc3N1bWVzIG5vdCBudWxsCi0JICogQHBhcmFtIHRleHRTZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yRm9yQ3VycmVudFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJLy8gY2hlY2sgaWYgd2UgaGF2ZSBhbiBhY3Rpb24gdGhhdCdzIGVuYWJsZWQgb24gdGhlIGN1cnJlbnQgcGFydGl0aW9uCi0JCUlUeXBlZFJlZ2lvbiB0ciA9IGdldFBhcnRpdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCVN0cmluZyBwYXJ0aXRpb24gPSB0ciAhPSBudWxsID8gdHIuZ2V0VHlwZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlJdGVyYXRvciBpdCA9IGdldFByb2Nlc3NvcnMoKS5pdGVyYXRvcigpOwotCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgcHJvY2Vzc29yID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJcHJvY2Vzc29yID0gKEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJLy8gd2UganVzdCBjaG9vc2UgdGhlIGZpcnN0IGFjdGlvbiB0aGF0IGNhbiBoYW5kbGUgdGhlIHBhcnRpdGlvbgotCQkJaWYgKHByb2Nlc3Nvci5lbmFibGVkRm9yUGFyaXRpdGlvbihwYXJ0aXRpb24pKQotCQkJCXJldHVybiBwcm9jZXNzb3I7Ci0JCX0KLQotCQlMaXN0IGV4dGVuZGVkRmluZE9jY3VycmVuY2VzUHJvY2Vzc29ycyA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9ucyhGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpLCBwYXJ0aXRpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZGVkRmluZE9jY3VycmVuY2VzUHJvY2Vzc29ycy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG8gPSBleHRlbmRlZEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcnMuZ2V0KGkpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IpIHsKLQkJCQkvKgotCQkJCSAqIFdlIGp1c3QgY2hvb3NlIHRoZSBmaXJzdCByZWdpc3RlcmVkIHByb2Nlc3NvciB0aGF0Ci0JCQkJICogZXhwbGljaXRseSBzYXlzIGl0IGNhbiBoYW5kbGUgdGhlIHBhcnRpdGlvbgotCQkJCSAqLwotCQkJCXByb2Nlc3NvciA9IChGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IpIG87Ci0JCQkJaWYgKHByb2Nlc3Nvci5lbmFibGVkRm9yUGFyaXRpdGlvbihwYXJ0aXRpb24pKQotCQkJCQlyZXR1cm4gcHJvY2Vzc29yOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElUeXBlZFJlZ2lvbiBnZXRQYXJ0aXRpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUlUeXBlZFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlpZiAodGV4dFNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJlZ2lvbiA9IGRvY3VtZW50LmdldFBhcnRpdGlvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmVnaW9uID0gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQkKLQlwcml2YXRlIElUZXh0U2VsZWN0aW9uIGdldFRleHRTZWxlY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvcikgewotCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gbnVsbDsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbiAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQl9Ci0JCXJldHVybiB0ZXh0U2VsZWN0aW9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRQcm9jZXNzb3JzKCkgewotCQlpZiAoZlByb2Nlc3NvcnMgPT0gbnVsbCkgewotCQkJZlByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlIVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGh0bWxQcm9jZXNzb3IgPSBuZXcgSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcigpOwotCQkJZlByb2Nlc3NvcnMuYWRkKGh0bWxQcm9jZXNzb3IpOwotCQl9Ci0JCXJldHVybiBmUHJvY2Vzc29yczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2h5cGVybGluay9BbmNob3JIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0FuY2hvckh5cGVybGlua0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOGFiOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0FuY2hvckh5cGVybGlua0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLkFic3RyYWN0SHlwZXJsaW5rRGV0ZWN0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7DQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5Nb2R1bGVDb3JlU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsNCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsNCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7DQotDQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbmNob3JIeXBlcmxpbmtEZXRlY3RvciBleHRlbmRzIEFic3RyYWN0SHlwZXJsaW5rRGV0ZWN0b3Igew0KLQlzdGF0aWMgY2xhc3MgRXh0ZXJuYWxFbGVtZW50SHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7DQotCQlwcml2YXRlIFN0cmluZyBmQW5jaG9yTmFtZSA9IG51bGw7DQotCQlwcml2YXRlIEVsZW1lbnQgZkJhc2VFbGVtZW50ID0gbnVsbDsNCi0JCXByaXZhdGUgRGlzcGxheSBmRGlzcGxheSA9IG51bGw7DQotCQlwcml2YXRlIElSZWdpb24gZkh5cGVybGlua1JlZ2lvbiA9IG51bGw7DQotDQotCQkvKioNCi0JCSAqIEBwYXJhbSBoeXBlcmxpbmtSZWdpb24NCi0JCSAqIEBwYXJhbSBhbmNob3JOYW1lDQotCQkgKi8NCi0JCXB1YmxpYyBFeHRlcm5hbEVsZW1lbnRIeXBlcmxpbmsoRGlzcGxheSBkaXNwbGF5LCBJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiwgU3RyaW5nIGFuY2hvck5hbWUsIEVsZW1lbnQgYmFzZUVsZW1lbnQpIHsNCi0JCQlzdXBlcigpOw0KLQkJCWZEaXNwbGF5ID0gZGlzcGxheTsNCi0JCQlmSHlwZXJsaW5rUmVnaW9uID0gaHlwZXJsaW5rUmVnaW9uOw0KLQkJCWZBbmNob3JOYW1lID0gYW5jaG9yTmFtZTsNCi0JCQlmQmFzZUVsZW1lbnQgPSBiYXNlRWxlbWVudDsNCi0JCX0NCi0NCi0JCS8qDQotCQkgKiAobm9uLUphdmFkb2MpDQotCQkgKiANCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNvcGVuKCkNCi0JCSAqLw0KLQkJSVN0YXR1cyBfb3BlbigpIHsNCi0JCQlpZiAoZkJhc2VFbGVtZW50IGluc3RhbmNlb2YgSURPTU5vZGUpIHsNCi0JCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZkFuY2hvck5hbWUsICIjIik7IC8vJE5PTi1OTFMtMSQNCi0JCQkJU3RyaW5nIGZpbGVuYW1lID0gbnVsbDsNCi0JCQkJU3RyaW5nIGFuY2hvck5hbWUgPSBudWxsOw0KLQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgew0KLQkJCQkJdHJ5IHsNCi0JCQkJCQlmaWxlbmFtZSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsNCi0JCQkJCQlhbmNob3JOYW1lID0gdG9rZW5pemVyLm5leHRUb2tlbigpOw0KLQkJCQkJfQ0KLQkJCQkJY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgew0KLQkJCQkJCS8vIHBvb3JseSBmb3JtZWQgdmFsdWUNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlpZiAoZmlsZW5hbWUgIT0gbnVsbCAmJiBhbmNob3JOYW1lICE9IG51bGwpIHsNCi0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihmaWxlbmFtZSArICI6IiArIGFuY2hvck5hbWUgKyAiLSIgKw0KLQkJCQkJLy8gZkJhc2VFbGVtZW50KTsNCi0NCi0JCQkJCUlQYXRoIGJhc2VQYXRoID0gbmV3IFBhdGgoKChJRE9NTm9kZSkgZkJhc2VFbGVtZW50KS5nZXRNb2RlbCgpLmdldEJhc2VMb2NhdGlvbigpKTsNCi0JCQkJCWlmIChiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsNCi0JCQkJCQlJUGF0aCByZXNvbHZlZCA9IE1vZHVsZUNvcmVTdXBwb3J0LnJlc29sdmUoYmFzZVBhdGgsIGZpbGVuYW1lKTsNCi0JCQkJCQlJRmlsZSB0YXJnZXRGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHJlc29sdmVkKTsNCi0JCQkJCQlpZiAodGFyZ2V0RmlsZS5pc0FjY2Vzc2libGUoKSkgew0KLQkJCQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsNCi0JCQkJCQkJaW50IHN0YXJ0ID0gLTE7DQotCQkJCQkJCWludCBlbmQgPSAtMTsNCi0JCQkJCQkJdHJ5IHsNCi0JCQkJCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQodGFyZ2V0RmlsZSk7DQotCQkJCQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsNCi0JCQkJCQkJCQlOb2RlTGlzdCBhbmNob3JzID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoIioiLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFuY2hvcnMuZ2V0TGVuZ3RoKCkgJiYgc3RhcnQgPCAwOyBpKyspIHsNCi0JCQkJCQkJCQkJTm9kZSBpdGVtID0gYW5jaG9ycy5pdGVtKGkpOw0KLQkJCQkJCQkJCQlOb2RlIG5hbWVOb2RlID0gaXRlbS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSk7DQotCQkJCQkJCQkJCWlmIChuYW1lTm9kZSA9PSBudWxsKQ0KLQkJCQkJCQkJCQkJbmFtZU5vZGUgPSBpdGVtLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9JRCk7DQotCQkJCQkJCQkJCWlmIChuYW1lTm9kZSAhPSBudWxsKSB7DQotCQkJCQkJCQkJCQlTdHJpbmcgbmFtZSA9IG5hbWVOb2RlLmdldE5vZGVWYWx1ZSgpOw0KLQkJCQkJCQkJCQkJaWYgKGFuY2hvck5hbWUuZXF1YWxzKG5hbWUpICYmIG5hbWVOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgew0KLQkJCQkJCQkJCQkJCXN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBuYW1lTm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsNCi0JCQkJCQkJCQkJCQllbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5hbWVOb2RlKS5nZXRFbmRPZmZzZXQoKTsNCi0JCQkJCQkJCQkJCX0NCi0JCQkJCQkJCQkJfQ0KLQkJCQkJCQkJCX0NCi0JCQkJCQkJCQlhbmNob3JzID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BKTsNCi0JCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFuY2hvcnMuZ2V0TGVuZ3RoKCkgJiYgc3RhcnQgPCAwOyBpKyspIHsNCi0JCQkJCQkJCQkJTm9kZSBpdGVtID0gYW5jaG9ycy5pdGVtKGkpOw0KLQkJCQkJCQkJCQlOb2RlIG5hbWVOb2RlID0gaXRlbS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSk7DQotCQkJCQkJCQkJCWlmIChuYW1lTm9kZSA9PSBudWxsKQ0KLQkJCQkJCQkJCQkJbmFtZU5vZGUgPSBpdGVtLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9JRCk7DQotCQkJCQkJCQkJCWlmIChuYW1lTm9kZSAhPSBudWxsKSB7DQotCQkJCQkJCQkJCQlTdHJpbmcgbmFtZSA9IG5hbWVOb2RlLmdldE5vZGVWYWx1ZSgpOw0KLQkJCQkJCQkJCQkJaWYgKGFuY2hvck5hbWUuZXF1YWxzKG5hbWUpICYmIG5hbWVOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgew0KLQkJCQkJCQkJCQkJCXN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBuYW1lTm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsNCi0JCQkJCQkJCQkJCQllbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5hbWVOb2RlKS5nZXRFbmRPZmZzZXQoKTsNCi0JCQkJCQkJCQkJCX0NCi0JCQkJCQkJCQkJfQ0KLQkJCQkJCQkJCX0NCi0NCi0JCQkJCQkJCQlhbmNob3JzID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFuY2hvcnMuZ2V0TGVuZ3RoKCkgJiYgc3RhcnQgPCAwOyBpKyspIHsNCi0JCQkJCQkJCQkJTm9kZSBpdGVtID0gYW5jaG9ycy5pdGVtKGkpOw0KLQkJCQkJCQkJCQlOb2RlIG5hbWVOb2RlID0gaXRlbS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSk7DQotCQkJCQkJCQkJCWlmIChuYW1lTm9kZSA9PSBudWxsKQ0KLQkJCQkJCQkJCQkJbmFtZU5vZGUgPSBpdGVtLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9JRCk7DQotCQkJCQkJCQkJCWlmIChuYW1lTm9kZSAhPSBudWxsKSB7DQotCQkJCQkJCQkJCQlTdHJpbmcgbmFtZSA9IG5hbWVOb2RlLmdldE5vZGVWYWx1ZSgpOw0KLQkJCQkJCQkJCQkJaWYgKGFuY2hvck5hbWUuZXF1YWxzKG5hbWUpICYmIG5hbWVOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgew0KLQkJCQkJCQkJCQkJCXN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBuYW1lTm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsNCi0JCQkJCQkJCQkJCQllbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5hbWVOb2RlKS5nZXRFbmRPZmZzZXQoKTsNCi0JCQkJCQkJCQkJCX0NCi0JCQkJCQkJCQkJfQ0KLQkJCQkJCQkJCX0NCi0NCi0JCQkJCQkJCX0NCi0JCQkJCQkJCXJldHVybiBvcGVuKGJhc2VQYXRoLnRvU3RyaW5nKCksIHRhcmdldEZpbGUsIHN0YXJ0LCBlbmQpOw0KLQkJCQkJCQl9DQotCQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsNCi0JCQkJCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEhUTUxVSVBsdWdpbi5JRCwgZS5nZXRNZXNzYWdlKCkpOw0KLQ0KLQkJCQkJCQl9DQotCQkJCQkJCWZpbmFsbHkgew0KLQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpDQotCQkJCQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7DQotCQkJCQkJCX0NCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCQl9DQotDQotCQkvKg0KLQkJICogKG5vbi1KYXZhZG9jKQ0KLQkJICogDQotCQkgKiBAc2VlDQotCQkgKiBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1JlZ2lvbigpDQotCQkgKi8NCi0JCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsNCi0JCQlyZXR1cm4gZkh5cGVybGlua1JlZ2lvbjsNCi0JCX0NCi0NCi0JCS8qDQotCQkgKiAobm9uLUphdmFkb2MpDQotCQkgKiANCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtUZXh0KCkNCi0JCSAqLw0KLQkJcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgew0KLQkJCXJldHVybiBOTFMuYmluZChIVE1MVUlNZXNzYWdlcy5PcGVuLCBmQW5jaG9yTmFtZSk7DQotCQl9DQotDQotCQkvKg0KLQkJICogKG5vbi1KYXZhZG9jKQ0KLQkJICogDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkNCi0JCSAqLw0KLQkJcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCBvcGVuKCkgew0KLQkJCXNjaGVkdWxlT3BlbigpOw0KLQkJfQ0KLQ0KLQkJLyoqDQotCQkgKiBAcGFyYW0gdGFyZ2V0RmlsZQ0KLQkJICogQHBhcmFtIHN0YXJ0DQotCQkgKiBAcGFyYW0gZW5kDQotCQkgKi8NCi0JCXByaXZhdGUgSVN0YXR1cyBvcGVuKFN0cmluZyBiYXNlLCBJRmlsZSB0YXJnZXRGaWxlLCBpbnQgc3RhcnQsIGludCBlbmQpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBQYXJ0SW5pdEV4Y2VwdGlvbiB7DQotCQkJSU1hcmtlciB0ZW1wb3JhcnlNYXJrZXIgPSBudWxsOw0KLQkJCXRyeSB7DQotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsNCi0NCi0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IocGFnZSwgdGFyZ2V0RmlsZSk7DQotDQotCQkJCWlmICgwIDw9IHN0YXJ0ICYmIHN0YXJ0IDw9IGVuZCkgew0KLQkJCQkJdGVtcG9yYXJ5TWFya2VyID0gdGFyZ2V0RmlsZS5jcmVhdGVNYXJrZXIoSU1hcmtlci5CT09LTUFSSyk7DQotCQkJCQl0ZW1wb3JhcnlNYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgYmFzZSk7DQotCQkJCQl0ZW1wb3JhcnlNYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgc3RhcnQpOw0KLQkJCQkJdGVtcG9yYXJ5TWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5ELCBlbmQpOw0KLQkJCQkJSURFLmdvdG9NYXJrZXIoZWRpdG9yLCB0ZW1wb3JhcnlNYXJrZXIpOw0KLQkJCQl9DQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOw0KLQkJCX0NCi0JCQlmaW5hbGx5IHsNCi0JCQkJaWYgKHRlbXBvcmFyeU1hcmtlciAhPSBudWxsKQ0KLQkJCQkJdHJ5IHsNCi0JCQkJCQl0ZW1wb3JhcnlNYXJrZXIuZGVsZXRlKCk7DQotCQkJCQl9DQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsNCi0JCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQl2b2lkIHNjaGVkdWxlT3BlbigpIHsNCi0JCQlKb2Igb3BlbmVyID0gbmV3IFVJSm9iKGZEaXNwbGF5LCBmQW5jaG9yTmFtZSkgew0KLQkJCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJCQkJcmV0dXJuIF9vcGVuKCk7DQotCQkJCX0NCi0NCi0JCQl9Ow0KLQkJCW9wZW5lci5zZXRTeXN0ZW0odHJ1ZSk7DQotCQkJb3BlbmVyLnNldFVzZXIoZmFsc2UpOw0KLQkJCW9wZW5lci5zY2hlZHVsZSgpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBMaW5rcyB0byB0aGUgZ2l2ZW4gdGFyZ2V0IG5vZGUgd2l0aGluIHRoZSB0ZXh0IHZpZXdlci4gVGhlIHRhcmdldCBub2RlDQotCSAqIGlzIGV4cGVjdGVkIHRvIGltcGxlbWVudCBJbmRleGVkTm9kZSBhbmQgYXBwZWFyIGluIHRoYXQgdGV4dCB2aWV3ZXINCi0JICogKGkuZS4gc2FtZSBlZGl0b3IpLg0KLQkgKiANCi0JICovDQotCXN0YXRpYyBjbGFzcyBJbnRlcm5hbEVsZW1lbnRIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsNCi0JCXByaXZhdGUgSVJlZ2lvbiBmSHlwZXJsaW5rUmVnaW9uOw0KLQkJcHJpdmF0ZSBOb2RlIGZUYXJnZXQgPSBudWxsOw0KLQkJcHJpdmF0ZSBJVGV4dFZpZXdlciBmVmlld2VyID0gbnVsbDsNCi0NCi0JCS8qKg0KLQkJICogDQotCQkgKi8NCi0JCXB1YmxpYyBJbnRlcm5hbEVsZW1lbnRIeXBlcmxpbmsoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24sIE5vZGUgdGFyZ2V0Tm9kZSkgew0KLQkJCWZIeXBlcmxpbmtSZWdpb24gPSBoeXBlcmxpbmtSZWdpb247DQotCQkJZlRhcmdldCA9IHRhcmdldE5vZGU7DQotCQkJZlZpZXdlciA9IHRleHRWaWV3ZXI7DQotCQl9DQotDQotCQkvKg0KLQkJICogKG5vbi1KYXZhZG9jKQ0KLQkJICogDQotCQkgKiBAc2VlDQotCQkgKiBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1JlZ2lvbigpDQotCQkgKi8NCi0JCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsNCi0JCQlyZXR1cm4gZkh5cGVybGlua1JlZ2lvbjsNCi0JCX0NCi0NCi0JCS8qDQotCQkgKiAobm9uLUphdmFkb2MpDQotCQkgKiANCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtUZXh0KCkNCi0JCSAqLw0KLQkJcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgew0KLQkJCWlmIChmVGFyZ2V0IGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgew0KLQkJCQl0cnkgew0KLQkJCQkJaW50IGxpbmUgPSBmVmlld2VyLmdldERvY3VtZW50KCkuZ2V0TGluZU9mT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgZlRhcmdldCkuZ2V0U3RhcnRPZmZzZXQoKSkgKyAxOw0KLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEhUTUxVSU1lc3NhZ2VzLkh5cGVybGlua19saW5lLCBuZXcgU3RyaW5nW117ZlRhcmdldC5nZXROb2RlTmFtZSgpLCBmVGFyZ2V0LmdldE5vZGVWYWx1ZSgpLCBTdHJpbmcudmFsdWVPZihsaW5lKX0pOw0KLQkJCQl9DQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7DQotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCXJldHVybiBOTFMuYmluZChIVE1MVUlNZXNzYWdlcy5PcGVuLCBmVGFyZ2V0LmdldE5vZGVOYW1lKCkpOw0KLQkJfQ0KLQ0KLQkJLyoNCi0JCSAqIChub24tSmF2YWRvYykNCi0JCSAqIA0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldFR5cGVMYWJlbCgpDQotCQkgKi8NCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQ0KLQkJLyoNCi0JCSAqIChub24tSmF2YWRvYykNCi0JCSAqIA0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI29wZW4oKQ0KLQkJICovDQotCQlwdWJsaWMgdm9pZCBvcGVuKCkgew0KLQkJCWlmIChmVGFyZ2V0IGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgew0KLQkJCQlpbnQgb2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBmVGFyZ2V0KS5nZXRTdGFydE9mZnNldCgpOw0KLQkJCQlpZiAoZlZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgew0KLQkJCQkJb2Zmc2V0ID0gKChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIGZWaWV3ZXIpLm1vZGVsT2Zmc2V0MldpZGdldE9mZnNldChvZmZzZXQpOw0KLQkJCQl9DQotCQkJCWZWaWV3ZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5zZXRTZWxlY3Rpb24obmV3IFRleHRTZWxlY3Rpb24ob2Zmc2V0LCAwKSk7DQotCQkJCWZWaWV3ZXIucmV2ZWFsUmFuZ2Uob2Zmc2V0LCAwKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIEFuY2hvckh5cGVybGlua0RldGVjdG9yKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgYWRkSHlwZXJMaW5rRm9ySHJlZihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIGxpbmtSZWdpb24sIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGhyZWZWYWx1ZSwgTGlzdCBsaW5rcywgTm9kZSBhbmNob3IpIHsNCi0JCU5vZGUgbmFtZU5vZGUgPSBhbmNob3IuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUYpOw0KLQkJaWYgKG5hbWVOb2RlICE9IG51bGwpIHsNCi0JCQlTdHJpbmcgbmFtZSA9IG5hbWVOb2RlLmdldE5vZGVWYWx1ZSgpOw0KLQkJCWlmIChocmVmVmFsdWUuZXF1YWxzKG5hbWUpICYmIG5hbWVOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgew0KLQkJCQlsaW5rcy5hZGQobmV3IEludGVybmFsRWxlbWVudEh5cGVybGluayh0ZXh0Vmlld2VyLCBsaW5rUmVnaW9uLCBuYW1lTm9kZSkpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgYWRkSHlwZXJMaW5rRm9yTmFtZShJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIGxpbmtSZWdpb24sIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGFuY2hvck5hbWUsIExpc3QgbGlua3MsIE5vZGUgYW5jaG9yKSB7DQotCQlOb2RlIG5hbWVOb2RlID0gYW5jaG9yLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FKTsNCi0JCWlmIChuYW1lTm9kZSAhPSBudWxsKSB7DQotCQkJU3RyaW5nIG5hbWUgPSBuYW1lTm9kZS5nZXROb2RlVmFsdWUoKTsNCi0JCQlpZiAoYW5jaG9yTmFtZS5lcXVhbHMobmFtZSkgJiYgbmFtZU5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7DQotCQkJCWxpbmtzLmFkZChuZXcgSW50ZXJuYWxFbGVtZW50SHlwZXJsaW5rKHRleHRWaWV3ZXIsIGxpbmtSZWdpb24sIG5hbWVOb2RlKSk7DQotCQkJfQ0KLQkJfQ0KLQkJbmFtZU5vZGUgPSBhbmNob3IuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0lEKTsNCi0JCWlmIChuYW1lTm9kZSAhPSBudWxsKSB7DQotCQkJU3RyaW5nIG5hbWUgPSBuYW1lTm9kZS5nZXROb2RlVmFsdWUoKTsNCi0JCQlpZiAoYW5jaG9yTmFtZS5lcXVhbHMobmFtZSkgJiYgbmFtZU5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7DQotCQkJCWxpbmtzLmFkZChuZXcgSW50ZXJuYWxFbGVtZW50SHlwZXJsaW5rKHRleHRWaWV3ZXIsIGxpbmtSZWdpb24sIG5hbWVOb2RlKSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBAcGFyYW0gZG9jdW1lbnRSZWdpb24NCi0JICogQHBhcmFtIHZhbHVlUmVnaW9uDQotCSAqIEByZXR1cm4NCi0JICovDQotCXByaXZhdGUgSVJlZ2lvbiBjcmVhdGVIeXBlcmxpbmtSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gdmFsdWVSZWdpb24pIHsNCi0JCXJldHVybiBuZXcgUmVnaW9uKGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKSwgdmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsNCi0JfQ0KLQ0KLQkvLyBsaW5rIHRvIGFuY2hvcnMgd2l0aCB0aGUgZ2l2ZW4gbmFtZSAodmFsdWUgaW5jbHVkZXMgdGhlICcjJykNCi0JSUh5cGVybGlua1tdIGNyZWF0ZUh5cGVybGlua3NUb0FuY2hvck5hbWVkKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gaHlwZXJsaW5rUmVnaW9uLCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhbmNob3JOYW1lLCBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MpIHsNCi0JCUxpc3QgbGlua3MgPSBuZXcgQXJyYXlMaXN0KDEpOw0KLQkJLy8gPjEgZ3VhcmRzIHRoZSBzdWJzdHJpbmctaW5nDQotCQlpZiAoYW5jaG9yTmFtZS5sZW5ndGgoKSA+IDEgJiYgYW5jaG9yTmFtZS5zdGFydHNXaXRoKCIjIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCS8vIGFuIGFuY2hvciBpbiB0aGlzIGRvY3VtZW50DQotCQkJTm9kZUxpc3QgYW5jaG9ycyA9IG51bGw7Ly9lbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCIqIiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEpOyAvLyROT04tTkxTLTEkDQotCQkJU3RyaW5nIGludGVybmFsQW5jaG9yTmFtZSA9IGFuY2hvck5hbWUuc3Vic3RyaW5nKDEpOw0KLS8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbmNob3JzLmdldExlbmd0aCgpOyBpKyspIHsNCi0vLwkJCQlhZGRIeXBlckxpbmtGb3JOYW1lKHRleHRWaWV3ZXIsIGh5cGVybGlua1JlZ2lvbiwgZWxlbWVudCwgaW50ZXJuYWxBbmNob3JOYW1lLCBsaW5rcywgYW5jaG9ycy5pdGVtKGkpKTsNCi0vLwkJCX0NCi0vLwkJCWFuY2hvcnMgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSk7DQotLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IGFuY2hvcnMuZ2V0TGVuZ3RoKCk7IGkrKykgew0KLS8vCQkJCWFkZEh5cGVyTGlua0Zvck5hbWUodGV4dFZpZXdlciwgaHlwZXJsaW5rUmVnaW9uLCBlbGVtZW50LCBpbnRlcm5hbEFuY2hvck5hbWUsIGxpbmtzLCBhbmNob3JzLml0ZW0oaSkpOw0KLS8vCQkJfQ0KLQkJCWFuY2hvcnMgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOyAvLyROT04tTkxTLTEkDQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbmNob3JzLmdldExlbmd0aCgpOyBpKyspIHsNCi0JCQkJYWRkSHlwZXJMaW5rRm9yTmFtZSh0ZXh0Vmlld2VyLCBoeXBlcmxpbmtSZWdpb24sIGVsZW1lbnQsIGludGVybmFsQW5jaG9yTmFtZSwgbGlua3MsIGFuY2hvcnMuaXRlbShpKSk7DQotCQkJfQ0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJLy8gYW5vdGhlciBmaWxlLCBwb3NzaWJseSB2ZXJ5IHNsb3cgdG8gY29tcHV0ZSBhaGVhZCBvZiB0aW1lDQotCQkJbGlua3MuYWRkKG5ldyBFeHRlcm5hbEVsZW1lbnRIeXBlcmxpbmsodGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0RGlzcGxheSgpLCBoeXBlcmxpbmtSZWdpb24sIGFuY2hvck5hbWUsIGVsZW1lbnQpKTsNCi0JCX0NCi0JCWlmICghbGlua3MuaXNFbXB0eSgpKSB7DQotCQkJcmV0dXJuIChJSHlwZXJsaW5rW10pIGxpbmtzLnRvQXJyYXkobmV3IElIeXBlcmxpbmtbbGlua3Muc2l6ZSgpXSk7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvLyBsaW5rIHRvIGFuY2hvcnMgdGhhdCBsaW5rIHRvIHRoaXMgdGFyZ2V0DQotCUlIeXBlcmxpbmtbXSBjcmVhdGVSZWZlcnJlckh5cGVybGlua3MoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24sIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWVWYWx1ZSwgYm9vbGVhbiBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKSB7DQotCQlMaXN0IGxpbmtzID0gbmV3IEFycmF5TGlzdCgxKTsNCi0JCWlmIChuYW1lVmFsdWUubGVuZ3RoKCkgPiAwKSB7DQotCQkJU3RyaW5nIHRhcmdldCA9ICIjIiArIG5hbWVWYWx1ZTsgLy8kTk9OLU5MUy0xJA0KLQkJCU5vZGVMaXN0IGFuY2hvcnMgPSBudWxsOy8vZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygiKiIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BKTsgLy8kTk9OLU5MUy0xJA0KLS8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbmNob3JzLmdldExlbmd0aCgpOyBpKyspIHsNCi0vLwkJCQlhZGRIeXBlckxpbmtGb3JIcmVmKHRleHRWaWV3ZXIsIGh5cGVybGlua1JlZ2lvbiwgZWxlbWVudCwgdGFyZ2V0LCBsaW5rcywgYW5jaG9ycy5pdGVtKGkpKTsNCi0vLwkJCX0NCi0vLwkJCWFuY2hvcnMgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSk7DQotLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IGFuY2hvcnMuZ2V0TGVuZ3RoKCk7IGkrKykgew0KLS8vCQkJCWFkZEh5cGVyTGlua0ZvckhyZWYodGV4dFZpZXdlciwgaHlwZXJsaW5rUmVnaW9uLCBlbGVtZW50LCB0YXJnZXQsIGxpbmtzLCBhbmNob3JzLml0ZW0oaSkpOw0KLS8vCQkJfQ0KLQkJCWFuY2hvcnMgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOyAvLyROT04tTkxTLTEkDQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbmNob3JzLmdldExlbmd0aCgpOyBpKyspIHsNCi0JCQkJYWRkSHlwZXJMaW5rRm9ySHJlZih0ZXh0Vmlld2VyLCBoeXBlcmxpbmtSZWdpb24sIGVsZW1lbnQsIHRhcmdldCwgbGlua3MsIGFuY2hvcnMuaXRlbShpKSk7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKCFsaW5rcy5pc0VtcHR5KCkpIHsNCi0JCQlyZXR1cm4gKElIeXBlcmxpbmtbXSkgbGlua3MudG9BcnJheShuZXcgSUh5cGVybGlua1tsaW5rcy5zaXplKCldKTsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXB1YmxpYyBJSHlwZXJsaW5rW10gZGV0ZWN0SHlwZXJsaW5rcyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgYm9vbGVhbiBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKSB7DQotCQlpZiAodGV4dFZpZXdlciAhPSBudWxsICYmIHJlZ2lvbiAhPSBudWxsKSB7DQotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpOw0KLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7DQotCQkJCU5vZGUgY3VycmVudE5vZGUgPSBnZXRDdXJyZW50Tm9kZShkb2N1bWVudCwgcmVnaW9uLmdldE9mZnNldCgpKTsNCi0JCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwgJiYgY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgew0KLQkJCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIGN1cnJlbnROb2RlOw0KLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChyZWdpb24uZ2V0T2Zmc2V0KCkpOw0KLQkJCQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChyZWdpb24uZ2V0T2Zmc2V0KCkpOw0KLQkJCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBudWxsOw0KLQkJCQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gbnVsbDsNCi0JCQkJCQlTdHJpbmcgbmFtZSA9IG51bGw7DQotCQkJCQkJU3RyaW5nIHZhbHVlID0gbnVsbDsNCi0JCQkJCQlpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRS5lcXVhbHModGV4dFJlZ2lvbi5nZXRUeXBlKCkpKSB7DQotCQkJCQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOw0KLQkJCQkJCQkvKg0KLQkJCQkJCQkgKiBDb3VsZCB1c2UgMiwgYnV0IHRoZXJlIG5lZWRzIHRvIGJlIHRoZSB0YWcgb3Blbg0KLQkJCQkJCQkgKiBhbmQgbmFtZSByZWdpb25zDQotCQkJCQkJCSAqLw0KLQkJCQkJCQlpbnQgaW5kZXggPSByZWdpb25zLmluZGV4T2YodGV4dFJlZ2lvbik7DQotCQkJCQkJCWlmIChpbmRleCA+PSA0KSB7DQotCQkJCQkJCQluYW1lUmVnaW9uID0gcmVnaW9ucy5nZXQoaW5kZXggLSAyKTsNCi0JCQkJCQkJCXZhbHVlUmVnaW9uID0gdGV4dFJlZ2lvbjsNCi0JCQkJCQkJCW5hbWUgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KG5hbWVSZWdpb24pOw0KLQkJCQkJCQkJdmFsdWUgPSBTdHJpbmdVdGlscy5zdHJpcChkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHZhbHVlUmVnaW9uKSk7DQotCQkJCQkJCX0NCi0JCQkJCQl9DQotCQkJCQkJZWxzZSBpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FLmVxdWFscyh0ZXh0UmVnaW9uLmdldFR5cGUoKSkpIHsNCi0JCQkJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7DQotCQkJCQkJCWludCBpbmRleCA9IHJlZ2lvbnMuaW5kZXhPZih0ZXh0UmVnaW9uKTsNCi0JCQkJCQkJLy8gbWludXMgMyB0byBsZWF2ZSBlcXVhbCBhbmQgdmFsdWUgcmVnaW9ucw0KLQkJCQkJCQlpZiAoaW5kZXggPD0gcmVnaW9ucy5zaXplKCkgLSAzKSB7DQotCQkJCQkJCQluYW1lUmVnaW9uID0gdGV4dFJlZ2lvbjsNCi0JCQkJCQkJCXZhbHVlUmVnaW9uID0gcmVnaW9ucy5nZXQoaW5kZXggKyAyKTsNCi0JCQkJCQkJCW5hbWUgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KG5hbWVSZWdpb24pOw0KLQkJCQkJCQkJdmFsdWUgPSBTdHJpbmdVdGlscy5zdHJpcChkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHZhbHVlUmVnaW9uKSk7DQotCQkJCQkJCX0NCi0JCQkJCQl9DQotCQkJCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7DQotCQkJCQkJCWlmIChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUYuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSAmJiB2YWx1ZS5pbmRleE9mKCIjIikgPj0gMCkgeyAvLyROT04tTkxTLTEkDQotCQkJCQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rc1RvQW5jaG9yTmFtZWQodGV4dFZpZXdlciwgY3JlYXRlSHlwZXJsaW5rUmVnaW9uKGRvY3VtZW50UmVnaW9uLCB2YWx1ZVJlZ2lvbiksIGVsZW1lbnQsIHZhbHVlLCBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKTsNCi0JCQkJCQkJfQ0KLQkJCQkJCQlpZiAoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLmVxdWFsc0lnbm9yZUNhc2UobmFtZSl8fEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSUQuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkgew0KLQkJCQkJCQkJcmV0dXJuIGNyZWF0ZVJlZmVycmVySHlwZXJsaW5rcyh0ZXh0Vmlld2VyLCBjcmVhdGVIeXBlcmxpbmtSZWdpb24oZG9jdW1lbnRSZWdpb24sIHZhbHVlUmVnaW9uKSwgZWxlbWVudCwgdmFsdWUsIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MpOw0KLQkJCQkJCQl9DQotCQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG5vZGUgdGhlIGN1cnNvciBpcyBjdXJyZW50bHkgb24gaW4gdGhlIGRvY3VtZW50LiBudWxsIGlmIG5vDQotCSAqIG5vZGUgaXMgc2VsZWN0ZWQNCi0JICogDQotCSAqIEBwYXJhbSBvZmZzZXQNCi0JICogQHJldHVybiBOb2RlIGVpdGhlciBlbGVtZW50LCBkb2N0eXBlLCB0ZXh0LCBvciBudWxsDQotCSAqLw0KLQlwcml2YXRlIE5vZGUgZ2V0Q3VycmVudE5vZGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7DQotCQkvLyBnZXQgdGhlIGN1cnJlbnQgbm9kZSBhdCB0aGUgb2Zmc2V0IChyZXR1cm5zIGVpdGhlcjogZWxlbWVudCwNCi0JCS8vIGRvY3R5cGUsIHRleHQpDQotCQlJbmRleGVkUmVnaW9uIGlub2RlID0gbnVsbDsNCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7DQotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7DQotCQkJCWlub2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0KTsNCi0JCQkJaWYgKGlub2RlID09IG51bGwpIHsNCi0JCQkJCWlub2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0IC0gMSk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlmaW5hbGx5IHsNCi0JCQlpZiAoc01vZGVsICE9IG51bGwpDQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsNCi0JCX0NCi0NCi0JCWlmIChpbm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsNCi0JCQlyZXR1cm4gKE5vZGUpIGlub2RlOw0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFjYjFkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLkFic3RyYWN0Q29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogPHA+VGhlIHJlYWRhYmxlIGFuZCB3cml0YWJsZSBjb21wbGV0aW9uIHByb3Bvc2FsIGNhdGVnb3JpZXMgY29uZmlndXJhdGlvbgotICogZm9yIHRoZSBIVE1MIGNvbnRlbnQgdHlwZTwvcD4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbiBleHRlbmRzIEFic3RyYWN0Q29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24gewotCi0JLyoqIHRoZSBJRCBvZiB0aGUgcHJlZmVyZW5jZSBwYWdlIHdoZXJlIHVzZXJzIGNhbiBjaGFuZ2UgdGhlIHByZWZlcmVuY2VzICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VTX1BBR0VfSUQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMuY29udGVudGFzc2lzdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiA8cD5DcmVhdGVzIHRoZSBjb25maWd1cmF0aW9uPC9wPgotCSAqLwotCXB1YmxpYyBIVE1MQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vbm90aGluZyB0byBkby4KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbiNnZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5JQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25Xcml0ZXIjaGFzQXNzb2NpYXRlZFByb3BlcnRpZXNQYWdlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBc3NvY2lhdGVkUHJvcGVydGllc1BhZ2UoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5JQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25Xcml0ZXIjZ2V0UHJvcGVydGllc1BhZ2VJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0aWVzUGFnZUlEKCkgewotCQlyZXR1cm4gUFJFRkVSRU5DRVNfUEFHRV9JRDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbiNnZXRTaG91bGROb3REaXNwbGF5T25EZWZhdWx0UGFnZVByZWZLZXkoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2hvdWxkTm90RGlzcGxheU9uRGVmYXVsdFBhZ2VQcmVmS2V5KCkgewotCQlyZXR1cm4gSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkNPTlRFTlRfQVNTSVNUX0RPX05PVF9ESVNQTEFZX09OX0RFRkFVTFRfUEFHRTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbiNnZXRTaG91bGROb3REaXNwbGF5T25Pd25QYWdlUHJlZktleSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTaG91bGROb3REaXNwbGF5T25Pd25QYWdlUHJlZktleSgpIHsKLQkJcmV0dXJuIEhUTUxVSVByZWZlcmVuY2VOYW1lcy5DT05URU5UX0FTU0lTVF9ET19OT1RfRElTUExBWV9PTl9PV05fUEFHRTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbiNnZXRQYWdlU29ydE9yZGVyUHJlZktleSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYWdlU29ydE9yZGVyUHJlZktleSgpIHsKLQkJcmV0dXJuIEhUTUxVSVByZWZlcmVuY2VOYW1lcy5DT05URU5UX0FTU0lTVF9PV05fUEFHRV9TT1JUX09SREVSOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbiNnZXREZWZhdWx0UGFnZVNvcnRPcmRlclByZWZLZXkoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFBhZ2VTb3J0T3JkZXJQcmVmS2V5KCkgewotCQlyZXR1cm4gSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkNPTlRFTlRfQVNTSVNUX0RFRkFVTFRfUEFHRV9TT1JUX09SREVSOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0hUTUxVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGRiYjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0hUTUxVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQmVuamFtaW4gTXVza2FsbGEsIGIubXVza2FsbGFAZ214Lm5ldCAtIFsxNTg2NjBdIGNoYXJhY3RlciBlbnRpdGllcyBzaG91bGQgaGF2ZSB0aGVpciBvd24gc3ludGF4IGhpZ2hsaWdodGluZyBwcmVmZXJlbmNlICAgICAgCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIEhUTUwgVUkgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIEhUTUxVSVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlDb2xvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRUaGVtZU1hbmFnZXIoKS5nZXRDdXJyZW50VGhlbWUoKS5nZXRDb2xvclJlZ2lzdHJ5KCk7Ci0JCQotCQlzdG9yZS5zZXREZWZhdWx0KEhUTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KEhUTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0VfQ09ERSwgIjw9Iik7Ly8kTk9OLU5MUy0xJAotCi0JCS8vIEhUTUwgU3R5bGUgUHJlZmVyZW5jZXMKLQkJU3RyaW5nIE5PQkFDS0dST1VOREJPTEQgPSAiIHwgbnVsbCB8IGZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgSlVTVElUQUxJQyA9ICIgfCBudWxsIHwgZmFsc2UgfCB0cnVlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUsIDEyNywgMCwgMTI3KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCA0MiwgMCwgMjU1KSArIEpVU1RJVEFMSUM7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSAibnVsbCIgKyBOT0JBQ0tHUk9VTkRCT0xEOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfRVFVQUxTLCBzdHlsZVZhbHVlKTsgLy8gc3BlY2lmaWVkIHZhbHVlIGlzIGJsYWNrOyBsZWF2aW5nIGFzIHdpZGdldCBkZWZhdWx0Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUiwgNjMsIDk1LCAxOTEpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIsIHN0eWxlVmFsdWUpOwotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCwgNjMsIDk1LCAxOTEpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhULCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSLCAwLCAxMjgsIDEyOCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUsIDAsIDAsIDEyOCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUsIHN0eWxlVmFsdWUpOwotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLCAwLCAwLCAxMjgpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCwgMTI4LCAxMjgsIDEyOCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lELCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGLCA2MywgMTI3LCA5NSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9ICJudWxsIiArIE5PQkFDS0dST1VOREJPTEQ7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQsIHN0eWxlVmFsdWUpOwkvLyBzcGVjaWZpZWQgdmFsdWUgaXMgYmxhY2s7IGxlYXZpbmcgYXMgd2lkZ2V0IGRlZmF1bHQKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIDAsIDEyOCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUsIDYzLCAxMjcsIDEyNykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIsIDAsIDEyOCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9ICJudWxsIiArIE5PQkFDS0dST1VOREJPTEQ7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCwgc3R5bGVWYWx1ZSk7CS8vIHNwZWNpZmllZCB2YWx1ZSBpcyBibGFjazsgbGVhdmluZyBhcyB3aWRnZXQgZGVmYXVsdAotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSLCAwLCAxMjgsIDEyOCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCwgMCwgMCwgMCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhULCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIsIDE5MSwgOTUsIDYzKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRSwgNDIsIDAsIDI1NSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFLCBzdHlsZVZhbHVlKTsKLQotCQkvLyBzZXQgZGVmYXVsdCBuZXcgaHRtbCBmaWxlIHRlbXBsYXRlIHRvIHVzZSBpbiBuZXcgZmlsZSB3aXphcmQKLQkJLyoKLQkJICogTmVlZCB0byBmaW5kIHRlbXBsYXRlIG5hbWUgdGhhdCBnb2VzIHdpdGggZGVmYXVsdCB0ZW1wbGF0ZSBpZCAobmFtZQotCQkgKiBtYXkgY2hhbmdlIGZvciBkaWZmZXJlbnQgbGFuZ3VhZ2UpCi0JCSAqLwotCQlzdG9yZS5zZXREZWZhdWx0KEhUTUxVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9JRCwgIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlbXBsYXRlcy5odG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIERlZmF1bHRzIGZvciB0aGUgVHlwaW5nIHByZWZlcmVuY2UgcGFnZQotCQlzdG9yZS5zZXREZWZhdWx0KEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfQ09NTUVOVFMsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRU5EX1RBR1MsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRUxFTUVOVFMsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfUkVNT1ZFX0VORF9UQUdTLCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NMT1NFX1NUUklOR1MsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ0xPU0VfQlJBQ0tFVFMsIHRydWUpOwotCQkKLQkJLy8gRGVmYXVsdHMgZm9yIENvbnRlbnQgQXNzaXN0IHByZWZlcmVuY2UgcGFnZQotCQlzdG9yZS5zZXREZWZhdWx0KEhUTUxVSVByZWZlcmVuY2VOYW1lcy5DT05URU5UX0FTU0lTVF9ET19OT1RfRElTUExBWV9PTl9ERUZBVUxUX1BBR0UsICIiKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQ09OVEVOVF9BU1NJU1RfRE9fTk9UX0RJU1BMQVlfT05fT1dOX1BBR0UsICIiKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQ09OVEVOVF9BU1NJU1RfREVGQVVMVF9QQUdFX1NPUlRfT1JERVIsCi0JCQkJIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByb3Bvc2FsQ2F0ZWdvcnkuaHRtbFRhZ3NcMCIgKwotCQkJCSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByb3Bvc2FsQ2F0ZWdvcnkuY3NzXDAiICsKLQkJCQkib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJvcG9zYWxDYXRlZ29yeS5odG1sVGVtcGxhdGVzXDAiICsKLQkJCQkib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5wcm9wb3NhbENhdGVnb3J5LmNzc1RlbXBsYXRlcyIpOwotCQlzdG9yZS5zZXREZWZhdWx0KEhUTUxVSVByZWZlcmVuY2VOYW1lcy5DT05URU5UX0FTU0lTVF9PV05fUEFHRV9TT1JUX09SREVSLAotCQkJCSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcm9wb3NhbENhdGVnb3J5Lmh0bWxUZW1wbGF0ZXNcMCIrCi0JCQkJIm9yZy5lY2xpcHNlLndzdC5jc3MudWkucHJvcG9zYWxDYXRlZ29yeS5jc3NUZW1wbGF0ZXNcMCIgKwotCQkJCSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcm9wb3NhbENhdGVnb3J5Lmh0bWxUYWdzXDAiICsKLQkJCQkib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5wcm9wb3NhbENhdGVnb3J5LmNzcyIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTFVJUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MVUlQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY4YjAxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MVUlQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIFByZWZlcmVuY2Uga2V5cyBmb3IgSFRNTCBVSQotICovCi1wdWJsaWMgY2xhc3MgSFRNTFVJUHJlZmVyZW5jZU5hbWVzIHsKLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyBpZiBjb2RlIGFzc2lzdCBnZXRzIGF1dG8gYWN0aXZhdGVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fUFJPUE9TRSA9IGdldEF1dG9Qcm9wb3NlS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXV0b1Byb3Bvc2VLZXkoKSB7Ci0JCXJldHVybiAiYXV0b1Byb3Bvc2UiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgY2hhcmFjdGVycyB0aGF0IGF1dG8gYWN0aXZhdGUgY29kZQotCSAqIGFzc2lzdC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uIEFsbCBjaGFyYWN0ZXJzIHRoYXQgdHJpZ2dlcgotCSAqIGF1dG8gY29kZSBhc3Npc3QuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fUFJPUE9TRV9DT0RFID0gZ2V0QXV0b1Byb3Bvc2VDb2RlS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXV0b1Byb3Bvc2VDb2RlS2V5KCkgewotCQlyZXR1cm4gImF1dG9Qcm9wb3NlQ29kZSI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgY3VzdG9taXplZCB0ZW1wbGF0ZXMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURVNfS0VZID0gZ2V0VGVtcGxhdGVzS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGVtcGxhdGVzS2V5KCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY3VzdG9tX3RlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgbGFzdCB0ZW1wbGF0ZSBuYW1lIHVzZWQgaW4gbmV3IEhUTUwgZmlsZSB3aXphcmQuCi0JICogVGVtcGxhdGUgbmFtZSBpcyBzdG9yZWQgaW5zdGVhZCBvZiB0ZW1wbGF0ZSBpZCBiZWNhdXNlIHVzZXItY3JlYXRlZAotCSAqIHRlbXBsYXRlcyBkbyBub3QgaGF2ZSB0ZW1wbGF0ZSBpZHMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRklMRV9URU1QTEFURV9OQU1FID0gIm5ld0ZpbGVUZW1wbGF0ZU5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaW5pdGlhbCB0ZW1wbGF0ZSBJRCB0byBiZSB1c2VkIGluIHRoZSBuZXcgSFRNTCBmaWxlIHdpemFyZC4gSW4gdGhlIGFic2VuY2UKLQkgKiBvZiB7QGxpbmsgTkVXX0ZJTEVfVEVNUExBVEVfTkFNRX0sIHRoaXMgSUQgaXMgdXNlZCB0byBmaW5kIGEgdGVtcGxhdGUgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19GSUxFX1RFTVBMQVRFX0lEID0gIm5ld0ZpbGVUZW1wbGF0ZUlkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgb3B0aW9uIGZvciBhdXRvLWNvbXBsZXRpbmcgY29tbWVudHMgd2hpbGUKLQkgKiB0eXBpbmcuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQSU5HX0NPTVBMRVRFX0NPTU1FTlRTID0gImNvbXBsZXRlQ29tbWVudHMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgb3B0aW9uIGZvciBhdXRvLWNvbXBsZXRpbmcgZW5kLXRhZ3MgYWZ0ZXIgZW50ZXJpbmcKLQkgKiA8Y29kZT4mbHQ7LzwvY29kZT4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBJTkdfQ09NUExFVEVfRU5EX1RBR1MgPSAiY29tcGxldGVFbmRUYWdzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIG9wdGlvbiBmb3IgYXV0by1jb21wbGV0aW5nIHRoZSBlbGVtZW50IGFmdGVyIGVudGVyaW5nCi0JICogPGNvZGU+Jmd0OzwvY29kZT4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBJTkdfQ09NUExFVEVfRUxFTUVOVFMgPSAiY29tcGxldGVFbGVtZW50cyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBvcHRpb24gZm9yIHJlbW92aW5nIGFuIGVuZC10YWcgaWYgdGhlIHN0YXJ0IHRhZyBpcwotCSAqIGNvbnZlcnRlZCB0byBhbiBlbXB0eS10YWcuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQSU5HX1JFTU9WRV9FTkRfVEFHUyA9ICJyZW1vdmVFbmRUYWdzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgb3B0aW9uIGZvciBhdXRvLWNvbXBsZXRpbmcgc3RyaW5ncyAoIiBhbmQgJykgd2hpbGUKLQkgKiB0eXBpbmcuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQSU5HX0NMT1NFX1NUUklOR1MgPSAiY2xvc2VTdHJpbmdzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgb3B0aW9uIGZvciBhdXRvLWNvbXBsZXRpbmcgYnJhY2tldHMgKFsgYW5kICgpIHdoaWxlCi0JICogdHlwaW5nLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUElOR19DTE9TRV9CUkFDS0VUUyA9ICJjbG9zZUJyYWNrZXRzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIDxwPnByZWZlcmVuY2Uga2V5IHVzZWQgZm9yIHNhdmluZyB3aGljaCBjYXRlZ29yaWVzIHNob3VsZCBub3QgZGlzcGxheSBvbiB0aGUgZGVmYXVsdCBwYWdlPC9wPgotCSAqIAotCSAqIDxwPlZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIFN0cmluZ30gY29uc2lzdGluZyBvZgotCSAqIDx0dD5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbXBsZXRpb25Qcm9wb3NhbC9wcm9wb3NhbENhdGVnb3J5L0BpZDwvdHQ+cyBzZXBhcmF0ZWQgYnkgdGhlIG51bGwKLQkgKiBjaGFyYWN0ZXIgKDx0dD5cMDwvdHQ+KSwgb3JkZXJlZCBpcyBpZ25vcmVkPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfQVNTSVNUX0RPX05PVF9ESVNQTEFZX09OX0RFRkFVTFRfUEFHRSA9ICJodG1sX2NvbnRlbnRfYXNzaXN0X2Rpc3BsYXlfb25fZGVmYXVsdF9wYWdlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIDxwPnByZWZlcmVuY2Uga2V5IHVzZWQgZm9yIHNhdmluZyB3aGljaCBjYXRlZ29yaWVzIHNob3VsZCBub3QgZGlzcGxheSBvbiB0aGVpciBvd24gcGFnZTwvcD4KLQkgKiAKLQkgKiA8cD5WYWx1ZSBpcyBvZiB0eXBlIHtAbGluayBTdHJpbmd9IGNvbnNpc3Rpbmcgb2YKLQkgKiA8dHQ+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21wbGV0aW9uUHJvcG9zYWwvcHJvcG9zYWxDYXRlZ29yeS9AaWQ8L3R0PnMgc2VwYXJhdGVkIGJ5IHRoZSBudWxsCi0JICogY2hhcmFjdGVyICg8dHQ+XDA8L3R0PiksIG9yZGVyIGlzIGlnbm9yZWQ8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9BU1NJU1RfRE9fTk9UX0RJU1BMQVlfT05fT1dOX1BBR0UgPSAiaHRtbF9jb250ZW50X2Fzc2lzdF9kaXNwbGF5X29uX293bl9wYWdlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIDxwPnByZWZlcmVuY2Uga2V5IGZvciBzYXZpbmcgdGhlIHNvcnQgb3JkZXIgb2YgdGhlIGNhdGVnb3JpZXMgd2hlbiBkaXNwbGF5aW5nIHRoZW0gb24gdGhlaXIgb3duIHBhZ2U8L3A+Ci0JICogCi0JICogPHA+VmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgU3RyaW5nfSBjb25zaXN0aW5nIG9mCi0JICogPHR0Pm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29tcGxldGlvblByb3Bvc2FsL3Byb3Bvc2FsQ2F0ZWdvcnkvQGlkPC90dD5zIHNlcGFyYXRlZCBieSB0aGUgbnVsbAotCSAqIGNoYXJhY3RlciAoPHR0PlwwPC90dD4pIGluIHRoZSBkZXNpcmVkIHNvcnQgb3JkZXIuPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfQVNTSVNUX09XTl9QQUdFX1NPUlRfT1JERVI9ICJodG1sX2NvbnRlbnRfYXNzaXN0X293bl9wYWdlX3NvcnRfb3JkZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogPHA+cHJlZmVyZW5jZSBrZXkgZm9yIHNhdmluZyB0aGUgc29ydCBvcmRlciBvZiB0aGUgY2F0ZWdvcmllcyB3aGVuIGRpc3BsYXlpbmcgdGhlbSBvbiB0aGUgZGVmYXVsdCBwYWdlPC9wPgotCSAqIAotCSAqIDxwPlZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIFN0cmluZ30gY29uc2lzdGluZyBvZgotCSAqIDx0dD5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbXBsZXRpb25Qcm9wb3NhbC9wcm9wb3NhbENhdGVnb3J5L0BpZDwvdHQ+cyBzZXBhcmF0ZWQgYnkgdGhlIG51bGwKLQkgKiBjaGFyYWN0ZXIgKDx0dD5cMDwvdHQ+KSBpbiB0aGUgZGVzaXJlZCBzb3J0IG9yZGVyLjwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0FTU0lTVF9ERUZBVUxUX1BBR0VfU09SVF9PUkRFUj0gImh0bWxfY29udGVudF9hc3Npc3RfZGVmYXVsdF9wYWdlX3NvcnRfb3JkZXIiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0VmFsaWRhdGlvblNldHRpbmdzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmFiMDhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0VmFsaWRhdGlvblNldHRpbmdzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZXNzYWdlQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuRXhwYW5zaW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuRXhwYW5zaW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlNjcm9sbGVkUGFnZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBCYXNlZCBvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuT3B0aW9uc0NvbmZpZ3VyYXRpb25CbG9jawotICovCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgTGlzdCBmQ29tYm9zOwotCXByaXZhdGUgTGlzdCBmRXhwYW5kYWJsZXM7Ci0JCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBmU2VsZWN0aW9uTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZXNTZXJ2aWNlIGZQcmVmZXJlbmNlc1NlcnZpY2UgPSBudWxsOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRUSU5HU19FWFBBTkRFRCA9ICJleHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIFZhbGlkYXRpb25GcmFtZXdvcmsgZlZhbGlkYXRpb247Ci0JCi0JcHJpdmF0ZSBjbGFzcyBDb21ib0RhdGEgewotCQlwcml2YXRlIFN0cmluZyBmS2V5OwotCQlwcml2YXRlIGludFtdIGZTZXZlcml0aWVzOwotCQlwcml2YXRlIGludCBmSW5kZXg7Ci0JCWludCBvcmlnaW5hbFNldmVyaXR5ID0gLTI7Ci0JCQotCQlwdWJsaWMgQ29tYm9EYXRhKFN0cmluZyBrZXksIGludFtdIHNldmVyaXRpZXMsIGludCBpbmRleCkgewotCQkJZktleSA9IGtleTsKLQkJCWZTZXZlcml0aWVzID0gc2V2ZXJpdGllczsKLQkJCWZJbmRleCA9IGluZGV4OwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJCXJldHVybiBmS2V5OwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRJbmRleChpbnQgaW5kZXgpIHsKLQkJCWZJbmRleCA9IGluZGV4OwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQkJcmV0dXJuIGZJbmRleDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFNldHMgdGhlIHNldmVyaXR5IGluZGV4IGJhc2VkIG9uIDxjb2RlPnNldmVyaXR5PC9jb2RlPi4KLQkJICogSWYgdGhlIHNldmVyaXR5IGRvZXNuJ3QgZXhpc3QsIHRoZSBpbmRleCBpcyBzZXQgdG8gLTEuCi0JCSAqIAotCQkgKiBAcGFyYW0gc2V2ZXJpdHkgdGhlIHNldmVyaXR5IGxldmVsCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShpbnQgc2V2ZXJpdHkpIHsKLQkJCWZvcihpbnQgaSA9IDA7IGZTZXZlcml0aWVzICE9IG51bGwgJiYgaSA8IGZTZXZlcml0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYoZlNldmVyaXRpZXNbaV0gPT0gc2V2ZXJpdHkpIHsKLQkJCQkJZkluZGV4ID0gaTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJZkluZGV4ID0gLTE7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCQlyZXR1cm4gKGZJbmRleCA+PSAwICYmIGZTZXZlcml0aWVzICE9IG51bGwgJiYgZkluZGV4IDwgZlNldmVyaXRpZXMubGVuZ3RoKSA/IGZTZXZlcml0aWVzW2ZJbmRleF0gOiAtMTsKLQkJfQotCQkKLQkJYm9vbGVhbiBpc0NoYW5nZWQoKSB7Ci0JCQlyZXR1cm4gZlNldmVyaXRpZXNbZkluZGV4XSAhPSBvcmlnaW5hbFNldmVyaXR5OwotCQl9Ci0JfQotCQotCXB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZDb21ib3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZFeHBhbmRhYmxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZlByZWZlcmVuY2VzU2VydmljZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpOwotCQlmVmFsaWRhdGlvbiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgQ29tYm8gd2lkZ2V0IGluIHRoZSBjb21wb3NpdGUgPGNvZGU+cGFyZW50PC9jb2RlPi4gVGhlIGRhdGEKLQkgKiBpbiB0aGUgQ29tYm8gaXMgYXNzb2NpYXRlZCB3aXRoIDxjb2RlPmtleTwvY29kZT4uIFRoZSBDb21ibyBkYXRhIGlzCi0JICogZ2VuZXJhdGVkIGJhc2VkIG9uIHRoZSBpbnRlZ2VyIDxjb2RlPnZhbHVlczwvY29kZT4gd2hlcmUgdGhlIGluZGV4Ci0JICogb2YgPGNvZGU+dmFsdWVzPC9jb2RlPiBjb3JyZXNwb25kcyB0byB0aGUgaW5kZXggb2YgPGNvZGU+dmFsdWVMYWJlbHM8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgY29tcG9zaXRlIHRvIGNyZWF0ZSB0aGUgY29tYm8gYm94IGluCi0JICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbCB0byBnaXZlIHRoZSBjb21ibyBib3gKLQkgKiBAcGFyYW0ga2V5IHRoZSB1bmlxdWUga2V5IHRvIGlkZW50aWZ5IHRoZSBjb21ibyBib3gKLQkgKiBAcGFyYW0gdmFsdWVzIHRoZSB2YWx1ZXMgcmVwcmVzZW50ZWQgYnkgdGhlIGNvbWJvIG9wdGlvbnMKLQkgKiBAcGFyYW0gdmFsdWVMYWJlbHMgdGhlIGNhbHVlcyBkaXNwbGF5ZWQgaW4gdGhlIGNvbWJvIGJveAotCSAqIEBwYXJhbSBpbmRlbnQgaG93IGZhciB0byBpbmRlbnQgdGhlIGNvbWJvIGJveCBsYWJlbAotCSAqIAotCSAqIEByZXR1cm4gdGhlIGdlbmVyYXRlZCBjb21ibyBib3gKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm8gYWRkQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcga2V5LCBpbnRbXSB2YWx1ZXMsIFN0cmluZ1tdIHZhbHVlTGFiZWxzLCBpbnQgaW5kZW50KSB7Ci0JCUdyaWREYXRhIGdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWdkLmhvcml6b250YWxJbmRlbnQ9IGluZGVudDsKLQkJCQkKLQkJTGFiZWwgbGFiZWxDb250cm9sPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsQ29udHJvbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCWxhYmVsQ29udHJvbC5zZXRUZXh0KGxhYmVsKTsKLQkJbGFiZWxDb250cm9sLnNldExheW91dERhdGEoZ2QpOwotCQkJCQotCQlDb21ibyBjb21ib0JveD0gbmV3Q29tYm9Db250cm9sKHBhcmVudCwga2V5LCB2YWx1ZXMsIHZhbHVlTGFiZWxzKTsKLQkJY29tYm9Cb3guc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJcmV0dXJuIGNvbWJvQm94OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tYm8gYm94IGFuZCBhc3NvY2lhdGVzIHRoZSBjb21ibyBkYXRhIHdpdGggdGhlCi0JICogY29tYm8gYm94LgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUgdGhlIGNvbXBvc2l0ZSB0byBjcmVhdGUgdGhlIGNvbWJvIGJveCBpbgotCSAqIEBwYXJhbSBrZXkgdGhlIHVuaXF1ZSBrZXkgdG8gaWRlbnRpZnkgdGhlIGNvbWJvIGJveAotCSAqIEBwYXJhbSB2YWx1ZXMgdGhlIHZhbHVlcyByZXByZXNlbnRlZCBieSB0aGUgY29tYm8gb3B0aW9ucwotCSAqIEBwYXJhbSB2YWx1ZUxhYmVscyB0aGUgdmFsdWVzIGRpc3BsYXllZCBpbiB0aGUgY29tYm8gYm94Ci0JICogCi0JICogQHJldHVybiB0aGUgZ2VuZXJhdGVkIGNvbWJvIGJveAotCSAqLwotCXByb3RlY3RlZCBDb21ibyBuZXdDb21ib0NvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSwgU3RyaW5nIGtleSwgaW50W10gdmFsdWVzLCBTdHJpbmdbXSB2YWx1ZUxhYmVscykgewotCQlDb21ib0RhdGEgZGF0YSA9IG5ldyBDb21ib0RhdGEoa2V5LCB2YWx1ZXMsIC0xKTsKLQkJCi0JCUNvbWJvIGNvbWJvQm94PSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLQkJY29tYm9Cb3guc2V0SXRlbXModmFsdWVMYWJlbHMpOwotCQljb21ib0JveC5zZXREYXRhKGRhdGEpOwotCQljb21ib0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJY29tYm9Cb3guc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQkJCi0JCW1ha2VTY3JvbGxhYmxlQ29tcG9zaXRlQXdhcmUoY29tYm9Cb3gpOwotCQkKLQkJaW50IHNldmVyaXR5ID0gLTE7Ci0JCWlmKGtleSAhPSBudWxsKQotCQkJc2V2ZXJpdHkgPSBmUHJlZmVyZW5jZXNTZXJ2aWNlLmdldEludChnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpLCBrZXksIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcsIGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKSk7Ci0KLQkJaWYgKHNldmVyaXR5ID09IFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SIHx8IHNldmVyaXR5ID09IFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcgfHwgc2V2ZXJpdHkgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQlkYXRhLnNldFNldmVyaXR5KHNldmVyaXR5KTsKLQkJCWRhdGEub3JpZ2luYWxTZXZlcml0eSA9IHNldmVyaXR5OwotCQl9Ci0JCQotCQlpZihkYXRhLmdldEluZGV4KCkgPj0gMCkKLQkJCWNvbWJvQm94LnNlbGVjdChkYXRhLmdldEluZGV4KCkpOwotCQkKLQkJZkNvbWJvcy5hZGQoY29tYm9Cb3gpOwotCQlyZXR1cm4gY29tYm9Cb3g7Ci0JfQotCQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBnZXRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJaWYgKGZTZWxlY3Rpb25MaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmU2VsZWN0aW9uTGlzdGVuZXI9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWNvbnRyb2xDaGFuZ2VkKGUud2lkZ2V0KTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBmU2VsZWN0aW9uTGlzdGVuZXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNvbnRyb2xDaGFuZ2VkKFdpZGdldCB3aWRnZXQpIHsKLQkJQ29tYm9EYXRhIGRhdGE9IChDb21ib0RhdGEpIHdpZGdldC5nZXREYXRhKCk7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBDb21ibykgewotCQkJZGF0YS5zZXRJbmRleCgoKENvbWJvKXdpZGdldCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RTZXR0aW5nc1BhZ2Ujc3RvcmVWYWx1ZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlpZihmQ29tYm9zID09IG51bGwgfHwgZkNvbWJvcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybjsKLQkJCi0JCUl0ZXJhdG9yIGl0ID0gZkNvbWJvcy5pdGVyYXRvcigpOwotCQkKLQkJSVNjb3BlQ29udGV4dFtdIGNvbnRleHRzID0gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpOwotCi0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJQ29tYm9EYXRhIGRhdGEgPSAoQ29tYm9EYXRhKSAoKENvbWJvKWl0Lm5leHQoKSkuZ2V0RGF0YSgpOwotCQkJaWYoZGF0YS5nZXRLZXkoKSAhPSBudWxsKSB7Ci0JCQkJY29udGV4dHNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5wdXRJbnQoZGF0YS5nZXRLZXkoKSwgZGF0YS5nZXRTZXZlcml0eSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJZm9yKGludCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWNvbnRleHRzW2ldLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkuZmx1c2goKTsKLQkJCX0KLQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBFeHBhbmRhYmxlQ29tcG9zaXRlIGdldFBhcmVudEV4cGFuZGFibGVDb21wb3NpdGUoQ29udHJvbCBjb250cm9sKSB7Ci0JCUNvbnRyb2wgcGFyZW50PSBjb250cm9sLmdldFBhcmVudCgpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBFeHBhbmRhYmxlQ29tcG9zaXRlKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50PSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEV4cGFuZGFibGVDb21wb3NpdGUpIHsKLQkJCXJldHVybiAoRXhwYW5kYWJsZUNvbXBvc2l0ZSkgcGFyZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgRXhwYW5kYWJsZUNvbXBvc2l0ZSBjcmVhdGVTdHlsZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBpbnQgbkNvbHVtbnMpIHsKLQkJRXhwYW5kYWJsZUNvbXBvc2l0ZSBleGNvbXBvc2l0ZT0gbmV3IEV4cGFuZGFibGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5DTElFTlRfSU5ERU5UKTsKLQkJZXhjb21wb3NpdGUuc2V0VGV4dChsYWJlbCk7Ci0JCWV4Y29tcG9zaXRlLnNldEV4cGFuZGVkKGZhbHNlKTsKLQkJZXhjb21wb3NpdGUuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXRCb2xkKEpGYWNlUmVzb3VyY2VzLkRJQUxPR19GT05UKSk7Ci0JCWV4Y29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlLCBuQ29sdW1ucywgMSkpOwotCQlleGNvbXBvc2l0ZS5hZGRFeHBhbnNpb25MaXN0ZW5lcihuZXcgRXhwYW5zaW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4cGFuc2lvblN0YXRlQ2hhbmdlZChFeHBhbnNpb25FdmVudCBlKSB7Ci0JCQkJZXhwYW5kZWRTdGF0ZUNoYW5nZWQoKEV4cGFuZGFibGVDb21wb3NpdGUpIGUuZ2V0U291cmNlKCkpOwotCQkJfQotCQl9KTsKLQkJZkV4cGFuZGFibGVzLmFkZChleGNvbXBvc2l0ZSk7Ci0JCW1ha2VTY3JvbGxhYmxlQ29tcG9zaXRlQXdhcmUoZXhjb21wb3NpdGUpOwotCQlyZXR1cm4gZXhjb21wb3NpdGU7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGV4cGFuZGVkU3RhdGVDaGFuZ2VkKEV4cGFuZGFibGVDb21wb3NpdGUgZXhwYW5kYWJsZSkgewotCQlTY3JvbGxlZFBhZ2VDb250ZW50IHBhcmVudFNjcm9sbGVkQ29tcG9zaXRlPSBnZXRQYXJlbnRTY3JvbGxlZENvbXBvc2l0ZShleHBhbmRhYmxlKTsKLQkJaWYgKHBhcmVudFNjcm9sbGVkQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCXBhcmVudFNjcm9sbGVkQ29tcG9zaXRlLnJlZmxvdyh0cnVlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbWFrZVNjcm9sbGFibGVDb21wb3NpdGVBd2FyZShDb250cm9sIGNvbnRyb2wpIHsKLQkJU2Nyb2xsZWRQYWdlQ29udGVudCBwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZT0gZ2V0UGFyZW50U2Nyb2xsZWRDb21wb3NpdGUoY29udHJvbCk7Ci0JCWlmIChwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZS5hZGFwdENoaWxkKGNvbnRyb2wpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTY3JvbGxlZFBhZ2VDb250ZW50IGdldFBhcmVudFNjcm9sbGVkQ29tcG9zaXRlKENvbnRyb2wgY29udHJvbCkgewotCQlDb250cm9sIHBhcmVudD0gY29udHJvbC5nZXRQYXJlbnQoKTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgU2Nyb2xsZWRQYWdlQ29udGVudCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudD0gcGFyZW50LmdldFBhcmVudCgpOwotCQl9Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBTY3JvbGxlZFBhZ2VDb250ZW50KSB7Ci0JCQlyZXR1cm4gKFNjcm9sbGVkUGFnZUNvbnRlbnQpIHBhcmVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVTZWN0aW9uRXhwYW5zaW9uU3RhdGVzKElEaWFsb2dTZXR0aW5ncyBzZWN0aW9uKSB7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBmRXhwYW5kYWJsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUV4cGFuZGFibGVDb21wb3NpdGUgY29tcCA9IChFeHBhbmRhYmxlQ29tcG9zaXRlKSBmRXhwYW5kYWJsZXMuZ2V0KGkpOwotCQkJc2VjdGlvbi5wdXQoU0VUVElOR1NfRVhQQU5ERUQgKyBTdHJpbmcudmFsdWVPZihpKSwgY29tcC5pc0V4cGFuZGVkKCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVTZWN0aW9uRXhwYW5zaW9uU3RhdGVzKElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncykgewotCQlmb3IgKGludCBpPSAwOyBpIDwgZkV4cGFuZGFibGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlFeHBhbmRhYmxlQ29tcG9zaXRlIGV4Y29tcG9zaXRlPSAoRXhwYW5kYWJsZUNvbXBvc2l0ZSkgZkV4cGFuZGFibGVzLmdldChpKTsKLQkJCWlmIChzZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQkJZXhjb21wb3NpdGUuc2V0RXhwYW5kZWQoaSA9PSAwKTsgLy8gb25seSBleHBhbmQgdGhlIGZpcnN0IG5vZGUgYnkgZGVmYXVsdAotCQkJfSBlbHNlIHsKLQkJCQlleGNvbXBvc2l0ZS5zZXRFeHBhbmRlZChzZXR0aW5ncy5nZXRCb29sZWFuKFNFVFRJTkdTX0VYUEFOREVEICsgU3RyaW5nLnZhbHVlT2YoaSkpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZXNldFNldmVyaXRpZXMoKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgZGVmYXVsdENvbnRleHQgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IGZDb21ib3Muc2l6ZSgpOyBpKyspIHsKLQkJCUNvbWJvRGF0YSBkYXRhID0gKENvbWJvRGF0YSkoKENvbWJvKWZDb21ib3MuZ2V0KGkpKS5nZXREYXRhKCk7Ci0JCQlpbnQgc2V2ZXJpdHkgPSBkZWZhdWx0Q29udGV4dC5nZXRJbnQoZGF0YS5nZXRLZXkoKSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCQlkYXRhLnNldFNldmVyaXR5KHNldmVyaXR5KTsKLQkJCSgoQ29tYm8pZkNvbWJvcy5nZXQoaSkpLnNlbGVjdChkYXRhLmdldEluZGV4KCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFJldmFsaWRhdGVPblNldHRpbmdzQ2hhbmdlKCkgewotCQlJdGVyYXRvciBpdCA9IGZDb21ib3MuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlDb21ib0RhdGEgZGF0YSA9IChDb21ib0RhdGEpICgoQ29tYm8pIGl0Lm5leHQoKSkuZ2V0RGF0YSgpOwotCQkJaWYgKGRhdGEuaXNDaGFuZ2VkKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWlmKHN1cGVyLnBlcmZvcm1PaygpICYmIHNob3VsZFJldmFsaWRhdGVPblNldHRpbmdzQ2hhbmdlKCkpIHsKLQkJCU1lc3NhZ2VCb3ggbWIgPSBuZXcgTWVzc2FnZUJveCh0aGlzLmdldFNoZWxsKCksIFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5ZRVMgfCBTV1QuTk8gfCBTV1QuQ0FOQ0VMIHwgU1dULklDT05fSU5GT1JNQVRJT04gfCBTV1QuUklHSFQpOwotCQkJbWIuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5WYWxpZGF0aW9uX1RpdGxlKTsKLQkJCS8qIENob29zZSB3aGljaCBtZXNzYWdlIHRvIHVzZSBiYXNlZCBvbiBpZiBpdHMgcHJvamVjdCBvciB3b3Jrc3BhY2Ugc2V0dGluZ3MgKi8KLQkJCVN0cmluZyBtc2cgPSAoZ2V0UHJvamVjdCgpID09IG51bGwpID8gSFRNTFVJTWVzc2FnZXMuVmFsaWRhdGlvbl9Xb3Jrc3BhY2UgOiBIVE1MVUlNZXNzYWdlcy5WYWxpZGF0aW9uX1Byb2plY3Q7Ci0JCQltYi5zZXRNZXNzYWdlKG1zZyk7Ci0JCQlzd2l0Y2gobWIub3BlbigpKSB7Ci0JCQkJY2FzZSBTV1QuQ0FOQ0VMOgotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJY2FzZSBTV1QuWUVTOgotCQkJCQlzdG9yZVZhbHVlcygpOwotCQkJCQlWYWxpZGF0ZUpvYiBqb2IgPSBuZXcgVmFsaWRhdGVKb2IoSFRNTFVJTWVzc2FnZXMuVmFsaWRhdGlvbl9qb2JOYW1lKTsKLQkJCQkJam9iLnNjaGVkdWxlKCk7Ci0JCQkJY2FzZSBTV1QuTk86Ci0JCQkJCXN0b3JlVmFsdWVzKCk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFBlcmZvcm1zIHZhbGlkYXRpb24gYWZ0ZXIgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyBoYXZlIGJlZW4gbW9kaWZpZWQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBWYWxpZGF0ZUpvYiBleHRlbmRzIEpvYiB7Ci0JCQotCQlwdWJsaWMgVmFsaWRhdGVKb2IoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKG5hbWUpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQkJdHJ5IHsKLQkJCQlJUHJvamVjdFtdIHByb2plY3RzID0gbnVsbDsKLQkJCQkvKiBDaGFuZ2VkIHByZWZlcmVuY2VzIGZvciBhIHNpbmdsZSBwcm9qZWN0LCBvbmx5IHZhbGlkYXRlIGl0ICovCi0JCQkJaWYoZ2V0UHJvamVjdCgpICE9IG51bGwpCi0JCQkJCXByb2plY3RzID0gbmV3IElQcm9qZWN0W10ge2dldFByb2plY3QoKX07Ci0JCQkJLyogV29ya3NwYWNlLXdpZGUgcHJlZmVyZW5jZXMgY2hhbmdlZCAqLwotCQkJCWVsc2UgewotCQkJCQkvKiBHZXQgYWxsIG9mIHRoZSBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlICovCi0JCQkJCXByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQkJCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzID0gbnVsbDsKLQkJCQkJTGlzdCBwcm9qZWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCi0JCQkJCS8qIEZpbHRlciBvdXQgcHJvamVjdHMgdGhhdCB1c2UgcHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyBvciBoYXZlIGJlZW4gY2xvc2VkICovCi0JCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQkJcHJlZnMgPSBuZXcgUHJvamVjdFNjb3BlKHByb2plY3RzW2ldKS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpOwotCQkJCQkJaWYocHJvamVjdHNbaV0uaXNBY2Nlc3NpYmxlKCkgJiYgIXByZWZzLmdldEJvb2xlYW4oZ2V0UHJvamVjdFNldHRpbmdzS2V5KCksIGZhbHNlKSkKLQkJCQkJCQlwcm9qZWN0TGlzdC5hZGQocHJvamVjdHNbaV0pOwotCQkJCQl9Ci0JCQkJCXByb2plY3RzID0gKElQcm9qZWN0W10pIHByb2plY3RMaXN0LnRvQXJyYXkobmV3IElQcm9qZWN0W3Byb2plY3RMaXN0LnNpemUoKV0pOwotCQkJCX0KLQkJCQlmVmFsaWRhdGlvbi52YWxpZGF0ZShwcm9qZWN0cywgdHJ1ZSwgZmFsc2UsIG1vbml0b3IpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlzdGF0dXMgPSBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MzY2ExYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEVtcHR5RmlsZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZVNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gSFRNTFVJTWVzc2FnZXMuRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2VfMDsgCi0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7Ci0JCS8vIHNvbWUgdGhlbWVzIG9uIEdUSyBoYXZlIGRpZmZlcmVudCBiYWNrZ3JvdW5kIGNvbG9ycyBmb3IgVGV4dCBhbmQgTGFiZWxzCi0JCXRleHQuc2V0QmFja2dyb3VuZChjb21wb3NpdGUuZ2V0QmFja2dyb3VuZCgpKTsKLQkJdGV4dC5zZXRUZXh0KGRlc2NyaXB0aW9uKTsKLQotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlU2Nyb2xsZWRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgc2Nyb2xsYmFycyBmb3IgdGhpcyBwYXJlbnQgd2hlbiBuZWVkZWQKLQkJZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJc2MxLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHNjMSwgMSk7Ci0JCXNjMS5zZXRDb250ZW50KGNvbXBvc2l0ZSk7Ci0KLQkJLy8gbm90IGNhbGxpbmcgc2V0U2l6ZSBmb3IgY29tcG9zaXRlIHdpbGwgcmVzdWx0IGluIGEgYmxhbmsgY29tcG9zaXRlLAotCQkvLyBzbyBjYWxsaW5nIGl0IGhlcmUgaW5pdGlhbGx5Ci0JCS8vIHNldFNpemUgYWN0dWFsbHkgbmVlZHMgdG8gYmUgY2FsbGVkIGFmdGVyIGFsbCBjb250cm9scyBhcmUgY3JlYXRlZCwKLQkJLy8gc28gc2Nyb2xsZWRDb21wb3NpdGUKLQkJLy8gaGFzIGNvcnJlY3QgbWluU2l6ZQotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaWYgKGNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQkvLyBOb3RlOiBUaGUgZm9udCBpcyBzZXQgaGVyZSBpbiBhbnRpY2lwYXRpb24gdGhhdCB0aGUgY2xhc3MgaW5oZXJpdGluZwotCQkJLy8gICAgICAgdGhpcyBiYXNlIGNsYXNzIG1heSBhZGQgd2lkZ2V0cyB0byB0aGUgZGlhbG9nLiAgIHNldFNpemUKLQkJCS8vICAgICAgIGlzIGFzc3VtZWQgdG8gYmUgY2FsbGVkIGp1c3QgYmVmb3JlIHdlIGdvIGxpdmUuCi0JCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCVBvaW50IG1pblNpemUgPSBjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCWNvbXBvc2l0ZS5zZXRTaXplKG1pblNpemUpOwotCQkJLy8gc2V0IHNjcm9sbGJhciBjb21wb3NpdGUncyBtaW4gc2l6ZSBzbyBwYWdlIGlzIGV4cGFuZGFibGUgYnV0Ci0JCQkvLyBoYXMgc2Nyb2xsYmFycyB3aGVuIG5lZWRlZAotCQkJaWYgKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFNjcm9sbGVkQ29tcG9zaXRlKSB7Ci0JCQkJU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gKFNjcm9sbGVkQ29tcG9zaXRlKSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0JCQkJc2MxLnNldE1pblNpemUobWluU2l6ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTENvbG9yUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTENvbG9yUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjk5ZGFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxDb2xvclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5TdHlsZWRUZXh0Q29sb3JQaWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb2xvclBhZ2U7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhUTUxDb2xvclBhZ2UgZXh0ZW5kcyBYTUxDb2xvclBhZ2UgewotCi0JLyoqCi0JICogU2V0IHVwIGFsbCB0aGUgc3R5bGUgcHJlZmVyZW5jZSBrZXlzIGluIHRoZSBvdmVybGF5IHN0b3JlCi0JICovCi0JcHJvdGVjdGVkIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlBcnJheUxpc3Qgb3ZlcmxheUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlBcnJheUxpc3Qgc3R5bGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbml0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0JCUl0ZXJhdG9yIGkgPSBzdHlsZUxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgKFN0cmluZylpLm5leHQoKSkpOwkKLQkJfQotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlVGV4dCgpIHsKLQkJcmV0dXJuIEhUTUxVSU1lc3NhZ2VzLlNhbXBsZV9IVE1MX2RvYzsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZXh0U3R5bGVNYXAoRGljdGlvbmFyeSBjb250ZXh0U3R5bGVNYXApIHsKLQotCQlpbml0Q29tbW9uQ29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0JCWluaXREb2NUeXBlQ29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0JCS8vIEZJWE1FOiB0aGVzZSB3ZXJlICJicnV0ZSBmb3JjZWQiIGNvbW1lbnRlZCBvdXQgd2hlbiBtb3ZpbmcgWE1MSlNQUmVnaW9uQ29udGV4dHMKLQkJLy8gZWZmZWN0IGlzIHVua25vd24sIGJ1dCB0aG91Z2h0IGp1c3QgdG8gZWZmZWN0IHByZWZlcmVuY2UgcGFnZQotCQkvL2NvbnRleHRTdHlsZU1hcC5wdXQoWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQkvL2NvbnRleHRTdHlsZU1hcC5wdXQoWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQkJLy9jb250ZXh0U3R5bGVNYXAucHV0KFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX1RFWFQsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQkvL2NvbnRleHRTdHlsZU1hcC5wdXQoWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlc2NyaXB0aW9ucyhEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucykgewotCi0JCWluaXRDb21tb25EZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJaW5pdERvY1R5cGVEZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0U3R5bGVMaXN0KEFycmF5TGlzdCBsaXN0KSB7Ci0JCWluaXRDb21tb25TdHlsZUxpc3QobGlzdCk7Ci0JCWluaXREb2NUeXBlU3R5bGVMaXN0KGxpc3QpOwotCQkvLwlsaXN0LmFkZChIVE1MQ29sb3JNYW5hZ2VyLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFBpY2tlcihTdHlsZWRUZXh0Q29sb3JQaWNrZXIgcGlja2VyKSB7Ci0JCUlNb2RlbE1hbmFnZXIgbW1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlwaWNrZXIuc2V0UGFyc2VyKG1tYW5hZ2VyLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwpLmdldFBhcnNlcigpKTsKLQotCQkvLyBjcmVhdGUgZGVzY3JpcHRpb25zIGZvciBoaWxpZ2h0aW5nIHR5cGVzCi0JCURpY3Rpb25hcnkgZGVzY3JpcHRpb25zID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0RGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0KLQkJLy8gbWFwIHJlZ2lvbiB0eXBlcyB0byBoaWxpZ2h0aW5nIHR5cGVzCi0JCURpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0Q29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0KLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCi0JCXBpY2tlci5zZXRDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQkJcGlja2VyLnNldERlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCQlwaWNrZXIuc2V0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0KLQkJLy8JdXBkYXRlUGlja2VyRm9udChwaWNrZXIpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSUhlbHBDb250ZXh0SWRzLkhUTUxfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCk7Ci0JCXJldHVybiBjOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RDb2xvclBhZ2Ujc2F2ZVByZWZlcmVuY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7Ci0JCUhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxDb250ZW50QXNzaXN0UHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxDb250ZW50QXNzaXN0UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFmYzJiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MQ29udGVudEFzc2lzdFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zb2FsQ2F0aWdvcmllc0NvbmZpZ3VyYXRpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5Db2RlQXNzaXN0Q3ljbGluZ0NvbmZpZ3VyYXRpb25CbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLklDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlcjsKLQotLyoqCi0gKiA8cD5EZWZpbmVzIHRoZSBwcmVmZXJlbmNlIHBhZ2UgZm9yIGFsbG93aW5nIHRoZSB1c2VyIHRvIGNoYW5nZSB0aGUgY29udGVudAotICogYXNzaXN0IHByZWZlcmVuY2VzPC9wPgotICovCi1wdWJsaWMgY2xhc3MgSFRNTENvbnRlbnRBc3Npc3RQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfQ09OVEVOVF9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBBdXRvIEFjdGl2YXRpb24KLQlwcml2YXRlIEJ1dHRvbiBmQXV0b1Byb3Bvc2U7Ci0JcHJpdmF0ZSBMYWJlbCBmQXV0b1Byb3Bvc2VMYWJlbDsKLQlwcml2YXRlIFRleHQgZkF1dG9Qcm9wb3NlVGV4dDsKLQkKLQkvKiogY29uZmlndXJhdGlvbiBibG9jayBmb3IgY2hhbmdpbmcgcHJlZmVyZW5jZSBoYXZpbmcgdG8gZG8gd2l0aCB0aGUgY29udGVudCBhc3Npc3QgY2F0ZWdvcmllcyAqLwotCXByaXZhdGUgQ29kZUFzc2lzdEN5Y2xpbmdDb25maWd1cmF0aW9uQmxvY2sgZkNvbmZpZ3VyYXRpb25CbG9jazsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCQotCQljcmVhdGVDb250ZW50c0ZvckF1dG9BY3RpdmF0aW9uR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlQ29udGVudHNGb3JDeWNsaW5nR3JvdXAoY29tcG9zaXRlKTsKLQkJCi0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJcGVyZm9ybURlZmF1bHRzRm9yQXV0b0FjdGl2YXRpb25Hcm91cCgpOwotCQlwZXJmb3JtRGVmYXVsdHNGb3JDeWNsaW5nR3JvdXAoKTsKLQotCQl2YWxpZGF0ZVZhbHVlcygpOwotCQllbmFibGVWYWx1ZXMoKTsKLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2UjaW5pdGlhbGl6ZVZhbHVlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckF1dG9BY3RpdmF0aW9uR3JvdXAoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckN5Y2xpbmdHcm91cCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSNzdG9yZVZhbHVlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCXN0b3JlVmFsdWVzRm9yQXV0b0FjdGl2YXRpb25Hcm91cCgpOwotCQlzdG9yZVZhbHVlc0ZvckN5Y2xpbmdHcm91cCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSNlbmFibGVWYWx1ZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVZhbHVlcygpIHsKLQkJaWYgKGZBdXRvUHJvcG9zZSAhPSBudWxsKSB7Ci0JCQlpZiAoZkF1dG9Qcm9wb3NlLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZkF1dG9Qcm9wb3NlTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlmQXV0b1Byb3Bvc2VUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmQXV0b1Byb3Bvc2VMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlmQXV0b1Byb3Bvc2VUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIDxwPkNyZWF0ZSBjb250ZW50cyBmb3IgdGhlIGF1dG8gYWN0aXZhdGlvbiBwcmVmZXJlbmNlIGdyb3VwPC9wPgotCSAqIEBwYXJhbSBwYXJlbnQge0BsaW5rIENvbXBvc2l0ZX0gcGFyZW50IG9mIHRoZSBncm91cAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50c0ZvckF1dG9BY3RpdmF0aW9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBjb250ZW50QXNzaXN0R3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDIpOwotCQljb250ZW50QXNzaXN0R3JvdXAuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5BdXRvX0FjdGl2YXRpb25fVUlfKTsKLQotCQlmQXV0b1Byb3Bvc2UgPSBjcmVhdGVDaGVja0JveChjb250ZW50QXNzaXN0R3JvdXAsIEhUTUxVSU1lc3NhZ2VzLkF1dG9tYXRpY2FsbHlfbWFrZV9zdWdnZXN0X1VJXyk7Ci0JCSgoR3JpZERhdGEpIGZBdXRvUHJvcG9zZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkF1dG9Qcm9wb3NlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCWZBdXRvUHJvcG9zZUxhYmVsID0gY3JlYXRlTGFiZWwoY29udGVudEFzc2lzdEdyb3VwLCBIVE1MVUlNZXNzYWdlcy5Qcm9tcHRfd2hlbl90aGVzZV9jaGFyYWN0ZV9VSV8pOwotCQlmQXV0b1Byb3Bvc2VUZXh0ID0gY3JlYXRlVGV4dEZpZWxkKGNvbnRlbnRBc3Npc3RHcm91cCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPkNyZWF0ZSB0aGUgY29udGVudHMgZm9yIHRoZSBjb250ZW50IGFzc2lzdCBjeWNsaW5nIHByZWZlcmVuY2UgZ3JvdXA8L3A+Ci0JICogQHBhcmFtIHBhcmVudCB7QGxpbmsgQ29tcG9zaXRlfSBwYXJlbnQgb2YgdGhlIGdyb3VwCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yQ3ljbGluZ0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyIGNvbmZpZ3VyYXRpb25Xcml0ZXIgPSBDb21wbGV0aW9uUHJvcG9zb2FsQ2F0aWdvcmllc0NvbmZpZ3VyYXRpb25SZWdpc3RyeS5nZXREZWZhdWx0KCkuZ2V0V3JpdGFibGVDb25maWd1cmF0aW9uKEhUTUxfQ09OVEVOVF9UWVBFX0lEKTsKLQkJCi0JCWlmKGNvbmZpZ3VyYXRpb25Xcml0ZXIgIT0gbnVsbCkgewotCQkJZkNvbmZpZ3VyYXRpb25CbG9jayA9IG5ldyBDb2RlQXNzaXN0Q3ljbGluZ0NvbmZpZ3VyYXRpb25CbG9jayhIVE1MX0NPTlRFTlRfVFlQRV9JRCwgY29uZmlndXJhdGlvbldyaXRlcik7Ci0JCQlmQ29uZmlndXJhdGlvbkJsb2NrLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCwgSFRNTFVJTWVzc2FnZXMuQ3ljbGluZ19VSV8pOwotCQl9IGVsc2UgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJUaGVyZSBzaG91bGQgYmUgYW4gSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJIiBzcGVjaWZpZWQgZm9yIHRoZSBIVE1MIGNvbnRlbnQgdHlwZSwgYnV0IGNhbid0IGZpbmUgaXQsIHRodXMgY2FuJ3QgY3JlYXRlIHVzZXIiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiIHByZWZlcmVuY2UgYmxvY2sgZm9yIGVkaXRpbmcgcHJvcG9zYWwgY2F0ZWdvcmllcyBwcmVmZXJlbmNlcy4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPlN0b3JlIHRoZSB2YWx1ZXMgZm9yIHRoZSBhdXRvIGFjdGl2YXRpb24gZ3JvdXA8L3A+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzRm9yQXV0b0FjdGl2YXRpb25Hcm91cCgpIHsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRSwgZkF1dG9Qcm9wb3NlLmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFLCBmQXV0b1Byb3Bvc2VUZXh0LmdldFRleHQoKSk7Ci0JfQotCQotCS8qKgotCSAqIDxwPlN0b3JlIHRoZSB2YWx1ZXMgZm9yIHRoZSBjeWNsaW5nIGdyb3VwPC9wPgotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlc0ZvckN5Y2xpbmdHcm91cCgpIHsKLQkJaWYgKGZDb25maWd1cmF0aW9uQmxvY2sgIT0gbnVsbCkgewotCQkJZkNvbmZpZ3VyYXRpb25CbG9jay5zdG9yZVZhbHVlcygpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPkluaXRpYWxpemUgdGhlIHZhbHVlcyBmb3IgdGhlIGF1dG8gYWN0aXZhdGlvbiBncm91cDwvcD4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckF1dG9BY3RpdmF0aW9uR3JvdXAoKSB7Ci0JCS8vIENvbnRlbnQgQXNzaXN0Ci0JCWZBdXRvUHJvcG9zZS5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFKSk7Ci0JCWZBdXRvUHJvcG9zZVRleHQuc2V0VGV4dChnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFKSk7Ci0JfQotCQotCS8qKgotCSAqIDxwPkluaXRpYWxpemUgdGhlIHZhbHVlcyBmb3IgdGhlIGN5Y2xpbmcgZ3JvdXA8L3A+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXNGb3JDeWNsaW5nR3JvdXAoKSB7Ci0JCWlmKGZDb25maWd1cmF0aW9uQmxvY2sgIT0gbnVsbCkgewotCQkJZkNvbmZpZ3VyYXRpb25CbG9jay5pbml0aWFsaXplVmFsdWVzKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+TG9hZCB0aGUgZGVmYXVsdHMgZm9yIHRoZSBhdXRvIGFjdGl2YXRpb24gZ3JvdXA8L3A+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckF1dG9BY3RpdmF0aW9uR3JvdXAoKSB7Ci0JCS8vIENvbnRlbnQgQXNzaXN0Ci0JCWZBdXRvUHJvcG9zZS5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0RGVmYXVsdEJvb2xlYW4oSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRSkpOwotCQlmQXV0b1Byb3Bvc2VUZXh0LnNldFRleHQoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0RGVmYXVsdFN0cmluZyhIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREUpKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+TG9hZCB0aGUgZGVmYXVsdHMgb2YgdGhlIGN5Y2xpbmcgZ3JvdXA8L3A+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckN5Y2xpbmdHcm91cCgpIHsKLQkJaWYoZkNvbmZpZ3VyYXRpb25CbG9jayAhPSBudWxsKSB7Ci0JCQlmQ29uZmlndXJhdGlvbkJsb2NrLnBlcmZvcm1EZWZhdWx0cygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYTMzMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuV29ya2JlbmNoRGVmYXVsdEVuY29kaW5nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxGaWxlc1ByZWZlcmVuY2VQYWdlOwotCi1wdWJsaWMgY2xhc3MgSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBYTUxGaWxlc1ByZWZlcmVuY2VQYWdlIHsKLQlwcml2YXRlIFdvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzIGZJbnB1dEVuY29kaW5nU2V0dGluZ3MgPSBudWxsOwotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHNjcm9sbGVkQ29tcG9zaXRlID0gY3JlYXRlU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50KTsKLQkJY3JlYXRlQ29udGVudHNGb3JDcmVhdGluZ0dyb3VwKHNjcm9sbGVkQ29tcG9zaXRlKTsKLQkJY3JlYXRlQ29udGVudHNGb3JMb2FkaW5nR3JvdXAoc2Nyb2xsZWRDb21wb3NpdGUpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2Nyb2xsZWRDb21wb3NpdGUsIElIZWxwQ29udGV4dElkcy5IVE1MX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCk7Ci0KLQkJc2V0U2l6ZShzY3JvbGxlZENvbXBvc2l0ZSk7Ci0JCWxvYWRQcmVmZXJlbmNlcygpOwotCi0JCXJldHVybiBzY3JvbGxlZENvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0ZvckxvYWRpbmdHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAxKTsKLQkJZ3JvdXAuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZV8wKTsKLQotCQlmSW5wdXRFbmNvZGluZ1NldHRpbmdzID0gbmV3IFdvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzKGdyb3VwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlzdXBlci5pbml0aWFsaXplVmFsdWVzKCk7Ci0JCWluaXRpYWxpemVWYWx1ZXNGb3JMb2FkaW5nR3JvdXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yTG9hZGluZ0dyb3VwKCkgewotCQlTdHJpbmcgZW5jb2RpbmcgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLklOUFVUX0NPREVTRVQpOwotCi0JCWZJbnB1dEVuY29kaW5nU2V0dGluZ3Muc2V0SUFOQVRhZyhlbmNvZGluZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJcGVyZm9ybURlZmF1bHRzRm9yTG9hZGluZ0dyb3VwKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzRm9yTG9hZGluZ0dyb3VwKCkgewotCQlTdHJpbmcgZW5jb2RpbmcgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5JTlBVVF9DT0RFU0VUKTsKLQotCQlmSW5wdXRFbmNvZGluZ1NldHRpbmdzLnNldElBTkFUYWcoZW5jb2RpbmcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlzdXBlci5zdG9yZVZhbHVlcygpOwotCQlzdG9yZVZhbHVlc0ZvckxvYWRpbmdHcm91cCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzRm9yTG9hZGluZ0dyb3VwKCkgewotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCwgZklucHV0RW5jb2RpbmdTZXR0aW5ncy5nZXRJQU5BVGFnKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZTcxMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VMaW5rQXJlYTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotCi1wdWJsaWMgY2xhc3MgSFRNTFNvdXJjZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSB7Ci0JcHJpdmF0ZSBCdXR0b24gZlRhZ05hbWVVcHBlciA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gZlRhZ05hbWVMb3dlciA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gZkF0dHJOYW1lVXBwZXIgPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGZBdHRyTmFtZUxvd2VyID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgaW50IE1JTl9JTkRFTlRBVElPTl9TSVpFID0gMDsKLQlwcml2YXRlIGZpbmFsIGludCBNQVhfSU5ERU5UQVRJT05fU0laRSA9IDE2OwotCi0JcHJpdmF0ZSBCdXR0b24gZkNsZWFyQWxsQmxhbmtMaW5lczsKLQotCS8vIEZvcm1hdHRpbmcKLQlwcml2YXRlIFRleHQgZkxpbmVXaWR0aFRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gZlNwbGl0TXVsdGlBdHRyczsKLQlwcml2YXRlIEJ1dHRvbiBmQWxpZ25FbmRCcmFja2V0OwotCXByaXZhdGUgQnV0dG9uIGZJbmRlbnRVc2luZ1RhYnM7Ci0JcHJpdmF0ZSBCdXR0b24gZkluZGVudFVzaW5nU3BhY2VzOwotCXByaXZhdGUgU3Bpbm5lciBmSW5kZW50YXRpb25TaXplOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29udGVudHNGb3JQcmVmZXJyZWRDYXNlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtblNwYW4pIHsKLQkJR3JvdXAgY2FzZUdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCBjb2x1bW5TcGFuKTsKLQkJY2FzZUdyb3VwLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuUHJlZmVycmVkX21hcmt1cF9jYXNlX1VJXyk7Ci0KLQkJLy8gZDI1NzA2NCBuZWVkIHRvIGFzc29jaWF0ZSBncm91cCB3LyByYWRpbyBidXR0b25zIHNvIHJhZGlvIGJ1dHRvbnMKLQkJLy8gaGVhZGVyIGNhbiBiZSByZWFkCi0JCUdyb3VwIHRhZ05hbWVHcm91cCA9IGNyZWF0ZUdyb3VwKGNhc2VHcm91cCwgMSk7Ci0JCXRhZ05hbWVHcm91cC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlRhZ19uYW1lc19fVUlfKTsKLQkJZlRhZ05hbWVVcHBlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKHRhZ05hbWVHcm91cCwgSFRNTFVJTWVzc2FnZXMuVGFnX25hbWVzX1VwcGVyX2Nhc2VfVUlfKTsKLQkJZlRhZ05hbWVMb3dlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKHRhZ05hbWVHcm91cCwgSFRNTFVJTWVzc2FnZXMuVGFnX25hbWVzX0xvd2VyX2Nhc2VfVUlfKTsKLQotCQkvLyBkMjU3MDY0IG5lZWQgdG8gYXNzb2NpYXRlIGdyb3VwIHcvIHJhZGlvIGJ1dHRvbnMgc28gcmFkaW8gYnV0dG9ucwotCQkvLyBoZWFkZXIgY2FuIGJlIHJlYWQKLQkJR3JvdXAgYXR0ck5hbWVHcm91cCA9IGNyZWF0ZUdyb3VwKGNhc2VHcm91cCwgMSk7Ci0JCWF0dHJOYW1lR3JvdXAuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfbmFtZXNfX1VJXyk7Ci0JCWZBdHRyTmFtZVVwcGVyID0gY3JlYXRlUmFkaW9CdXR0b24oYXR0ck5hbWVHcm91cCwgSFRNTFVJTWVzc2FnZXMuQXR0cmlidXRlX25hbWVzX1VwcGVyX2Nhc2VfVUlfKTsKLQkJZkF0dHJOYW1lTG93ZXIgPSBjcmVhdGVSYWRpb0J1dHRvbihhdHRyTmFtZUdyb3VwLCBIVE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfbmFtZXNfTG93ZXJfY2FzZV9VSV8pOwotCi0JCXJldHVybiBwYXJlbnQ7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHNGb3JGb3JtYXR0aW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBmb3JtYXR0aW5nR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDIpOwotCQlmb3JtYXR0aW5nR3JvdXAuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5Gb3JtYXR0aW5nX1VJXyk7Ci0KLQkJY3JlYXRlTGFiZWwoZm9ybWF0dGluZ0dyb3VwLCBIVE1MVUlNZXNzYWdlcy5MaW5lX3dpZHRoX19VSV8pOwotCQlmTGluZVdpZHRoVGV4dCA9IG5ldyBUZXh0KGZvcm1hdHRpbmdHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWdEYXRhLndpZHRoSGludCA9IDI1OwotCQlmTGluZVdpZHRoVGV4dC5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQkJZkxpbmVXaWR0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0KLQkJZlNwbGl0TXVsdGlBdHRycyA9IGNyZWF0ZUNoZWNrQm94KGZvcm1hdHRpbmdHcm91cCwgSFRNTFVJTWVzc2FnZXMuU3BsaXRfbXVsdGlwbGVfYXR0cmlidXRlcyk7Ci0JCSgoR3JpZERhdGEpIGZTcGxpdE11bHRpQXR0cnMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZBbGlnbkVuZEJyYWNrZXQgPSBjcmVhdGVDaGVja0JveChmb3JtYXR0aW5nR3JvdXAsIEhUTUxVSU1lc3NhZ2VzLkFsaWduX2ZpbmFsX2JyYWNrZXQpOwotCQkoKEdyaWREYXRhKSBmQWxpZ25FbmRCcmFja2V0LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmQ2xlYXJBbGxCbGFua0xpbmVzID0gY3JlYXRlQ2hlY2tCb3goZm9ybWF0dGluZ0dyb3VwLCBIVE1MVUlNZXNzYWdlcy5DbGVhcl9hbGxfYmxhbmtfbGluZXNfVUlfKTsKLQkJKChHcmlkRGF0YSkgZkNsZWFyQWxsQmxhbmtMaW5lcy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQkvLyBbMjY5MjI0XSAtIFBsYWNlIHRoZSBpbmRlbnQgY29udHJvbHMgaW4gdGhlaXIgb3duIGNvbXBvc2l0ZSBmb3IgcHJvcGVyIHRhYiBvcmRlcmluZwotCQlDb21wb3NpdGUgaW5kZW50Q29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKGZvcm1hdHRpbmdHcm91cCwgMSk7Ci0JCSgoR3JpZERhdGEpIGluZGVudENvbXBvc2l0ZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJKChHcmlkTGF5b3V0KSBpbmRlbnRDb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm1hcmdpbldpZHRoID0gMDsKLQkJKChHcmlkTGF5b3V0KSBpbmRlbnRDb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm1hcmdpbkhlaWdodCA9IDA7Ci0KLQkJZkluZGVudFVzaW5nVGFicyA9IGNyZWF0ZVJhZGlvQnV0dG9uKGluZGVudENvbXBvc2l0ZSwgSFRNTFVJTWVzc2FnZXMuSW5kZW50X3VzaW5nX3RhYnMpOwotCQkoKEdyaWREYXRhKSBmSW5kZW50VXNpbmdUYWJzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAxOwotCi0JCWZJbmRlbnRVc2luZ1NwYWNlcyA9IGNyZWF0ZVJhZGlvQnV0dG9uKGluZGVudENvbXBvc2l0ZSwgSFRNTFVJTWVzc2FnZXMuSW5kZW50X3VzaW5nX3NwYWNlcyk7Ci0JCSgoR3JpZERhdGEpIGZJbmRlbnRVc2luZ1NwYWNlcy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMTsKLQotCQljcmVhdGVMYWJlbChmb3JtYXR0aW5nR3JvdXAsIEhUTUxVSU1lc3NhZ2VzLkluZGVudGF0aW9uX3NpemUpOwotCQlmSW5kZW50YXRpb25TaXplID0gbmV3IFNwaW5uZXIoZm9ybWF0dGluZ0dyb3VwLCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRUb29sVGlwVGV4dChIVE1MVUlNZXNzYWdlcy5JbmRlbnRhdGlvbl9zaXplX3RpcCk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0TWluaW11bShNSU5fSU5ERU5UQVRJT05fU0laRSk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0TWF4aW11bShNQVhfSU5ERU5UQVRJT05fU0laRSk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0SW5jcmVtZW50KDEpOwotCQlmSW5kZW50YXRpb25TaXplLnNldFBhZ2VJbmNyZW1lbnQoNCk7Ci0JCWZJbmRlbnRhdGlvblNpemUuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlmVGFnTmFtZVVwcGVyLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFKSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWZUYWdOYW1lTG93ZXIuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UpID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJZkF0dHJOYW1lVXBwZXIuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJfTkFNRV9DQVNFKSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWZBdHRyTmFtZUxvd2VyLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSkgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCi0JCXBlcmZvcm1EZWZhdWx0c0ZvckZvcm1hdHRpbmdHcm91cCgpOwotCi0JCXZhbGlkYXRlVmFsdWVzKCk7Ci0JCWVuYWJsZVZhbHVlcygpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGVmYXVsdHNGb3JGb3JtYXR0aW5nR3JvdXAoKSB7Ci0JCS8vIEZvcm1hdHRpbmcKLQkJZkxpbmVXaWR0aFRleHQuc2V0VGV4dChnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCWZTcGxpdE11bHRpQXR0cnMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQlmQWxpZ25FbmRCcmFja2V0LnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQUxJR05fRU5EX0JSQUNLRVQpKTsKLQkJZkNsZWFyQWxsQmxhbmtMaW5lcy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCi0JCWlmIChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpKSkgewotCQkJZkluZGVudFVzaW5nVGFicy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmSW5kZW50VXNpbmdTcGFjZXMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZJbmRlbnRVc2luZ1NwYWNlcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmSW5kZW50VXNpbmdUYWJzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWZUYWdOYW1lVXBwZXIuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSkgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmVGFnTmFtZUxvd2VyLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UpID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJZkF0dHJOYW1lVXBwZXIuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UpID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZkF0dHJOYW1lTG93ZXIuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UpID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQotCQlpbml0aWFsaXplVmFsdWVzRm9yRm9ybWF0dGluZ0dyb3VwKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKSB7Ci0JCS8vIEZvcm1hdHRpbmcKLQkJZkxpbmVXaWR0aFRleHQuc2V0VGV4dChnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKTsKLQkJZlNwbGl0TXVsdGlBdHRycy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMpKTsKLQkJZkFsaWduRW5kQnJhY2tldC5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQUxJR05fRU5EX0JSQUNLRVQpKTsKLQkJZkNsZWFyQWxsQmxhbmtMaW5lcy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTKSk7Ci0KLQkJaWYgKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKSkpIHsKLQkJCWZJbmRlbnRVc2luZ1RhYnMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZkluZGVudFVzaW5nU3BhY2VzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmSW5kZW50VXNpbmdTcGFjZXMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZkluZGVudFVzaW5nVGFicy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0KLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCWlmIChmVGFnTmFtZVVwcGVyLmdldFNlbGVjdGlvbigpKQotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZWxzZQotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJaWYgKGZBdHRyTmFtZVVwcGVyLmdldFNlbGVjdGlvbigpKQotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWVsc2UKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCi0JCXN0b3JlVmFsdWVzRm9yRm9ybWF0dGluZ0dyb3VwKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzRm9yRm9ybWF0dGluZ0dyb3VwKCkgewotCQkvLyBGb3JtYXR0aW5nCi0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRILCBmTGluZVdpZHRoVGV4dC5nZXRUZXh0KCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMsIGZTcGxpdE11bHRpQXR0cnMuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQUxJR05fRU5EX0JSQUNLRVQsIGZBbGlnbkVuZEJyYWNrZXQuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTLCBmQ2xlYXJBbGxCbGFua0xpbmVzLmdldFNlbGVjdGlvbigpKTsKLQotCQlpZiAoZkluZGVudFVzaW5nVGFicy5nZXRTZWxlY3Rpb24oKSkgewotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUiwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UpOwotCQl9Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFLCBmSW5kZW50YXRpb25TaXplLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0KLQkJZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCkgewotCQlIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOyAvLyBVSQotCQlIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7IC8vIG1vZGVsCi0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuSFRNTF9QUkVGV0VCWF9TT1VSQ0VfSEVMUElEKTsKLQotCQluZXcgUHJlZmVyZW5jZUxpbmtBcmVhKGNvbXBvc2l0ZSwgU1dULldSQVAgfCBTV1QuTVVMVEksICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmVkaXRvciIsIEhUTUxVSU1lc3NhZ2VzLl9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTkssLy8kTk9OLU5MUy0xJAotCQkJCQkoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLCBudWxsKS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuaGludCgxNTAsIFNXVC5ERUZBVUxUKS5jcmVhdGUoKSk7Ci0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5zd3REZWZhdWx0cygpLmNyZWF0ZSgpKTsKLQotCQljcmVhdGVDb250ZW50c0ZvckZvcm1hdHRpbmdHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVDb250ZW50c0ZvclByZWZlcnJlZENhc2VHcm91cChjb21wb3NpdGUsIDIpOwotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCWxvYWRQcmVmZXJlbmNlcygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVWYWx1ZXMoKSB7Ci0JCWJvb2xlYW4gaXNFcnJvciA9IGZhbHNlOwotCQlTdHJpbmcgd2lkdGhUZXh0ID0gbnVsbDsKLQotCQlpZiAoZkxpbmVXaWR0aFRleHQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl3aWR0aFRleHQgPSBmTGluZVdpZHRoVGV4dC5nZXRUZXh0KCk7Ci0JCQkJaW50IGZvcm1hdHRpbmdMaW5lV2lkdGggPSBJbnRlZ2VyLnBhcnNlSW50KHdpZHRoVGV4dCk7Ci0JCQkJaWYgKChmb3JtYXR0aW5nTGluZVdpZHRoIDwgV0lEVEhfVkFMSURBVElPTl9MT1dFUl9MSU1JVCkgfHwgKGZvcm1hdHRpbmdMaW5lV2lkdGggPiBXSURUSF9WQUxJREFUSU9OX1VQUEVSX0xJTUlUKSkgewotCQkJCQl0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmV4YykgewotCQkJCXNldEludmFsaWRJbnB1dE1lc3NhZ2Uod2lkdGhUZXh0KTsKLQkJCQlzZXRWYWxpZChmYWxzZSk7Ci0JCQkJaXNFcnJvciA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlpbnQgaW5kZW50U2l6ZSA9IDA7Ci0JCWlmIChmSW5kZW50YXRpb25TaXplICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaW5kZW50U2l6ZSA9IGZJbmRlbnRhdGlvblNpemUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKChpbmRlbnRTaXplIDwgTUlOX0lOREVOVEFUSU9OX1NJWkUpIHx8IChpbmRlbnRTaXplID4gTUFYX0lOREVOVEFUSU9OX1NJWkUpKSB7Ci0JCQkJCXRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZXhjKSB7Ci0JCQkJc2V0SW52YWxpZElucHV0TWVzc2FnZShJbnRlZ2VyLnRvU3RyaW5nKGluZGVudFNpemUpKTsKLQkJCQlzZXRWYWxpZChmYWxzZSk7Ci0JCQkJaXNFcnJvciA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWlzRXJyb3IpIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCXNldFZhbGlkKHRydWUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxTeW50YXhDb2xvcmluZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxTeW50YXhDb2xvcmluZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwZjAxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MU3ludGF4Q29sb3JpbmdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkNvbG9yU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIEEgcHJlZmVyZW5jZSBwYWdlIHRvIGNvbmZpZ3VyZSBvdXIgWE1MIHN5bnRheCBjb2xvci4gSXQgcmVzZW1ibGVzIHRoZSBKRFQKLSAqIGFuZCBDRFQgcGFnZXMgZmFyIG1vcmUgdGhhbiBvdXIgb3JpZ2luYWwgY29sb3IgcGFnZSB3aGlsZSByZXRhaW5pbmcgdGhlCi0gKiBleHRyYSAiY2xpY2stdG8tZmluZCIgZnVuY3Rpb25hbGl0eS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEhUTUxTeW50YXhDb2xvcmluZ1BhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmQm9sZDsKLQlwcml2YXRlIExhYmVsIGZGb3JlZ3JvdW5kTGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCBmQmFja2dyb3VuZExhYmVsOwotCXByaXZhdGUgQnV0dG9uIGZDbGVhclN0eWxlOwotCXByaXZhdGUgTWFwIGZDb250ZXh0VG9TdHlsZU1hcDsKLQlwcml2YXRlIENvbG9yIGZEZWZhdWx0Rm9yZWdyb3VuZCA9IG51bGw7Ci0JcHJpdmF0ZSBDb2xvciBmRGVmYXVsdEJhY2tncm91bmQgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBCdXR0b24gZkl0YWxpYzsKLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZk92ZXJsYXlTdG9yZTsKLQlwcml2YXRlIEJ1dHRvbiBmU3RyaWtlOwotCXByaXZhdGUgQ29sbGVjdGlvbiBmU3R5bGVQcmVmZXJlbmNlS2V5czsKLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgZlN0eWxlc1ZpZXdlciA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZlN0eWxlVG9EZXNjcmlwdGlvbk1hcDsKLQlwcml2YXRlIFN0eWxlZFRleHQgZlRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gZlVuZGVybGluZTsKLQotCS8vIGFjdGl2YXRlIGNvbnRyb2xzIGJhc2VkIG9uIHRoZSBnaXZlbiBsb2NhbCBjb2xvciB0eXBlCi0JcHJpdmF0ZSB2b2lkIGFjdGl2YXRlKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCUNvbG9yIGZvcmVncm91bmQgPSBmRGVmYXVsdEZvcmVncm91bmQ7Ci0JCUNvbG9yIGJhY2tncm91bmQgPSBmRGVmYXVsdEJhY2tncm91bmQ7Ci0JCWlmIChuYW1lZFN0eWxlID09IG51bGwpIHsKLQkJCWZDbGVhclN0eWxlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZlN0cmlrZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZVbmRlcmxpbmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZJdGFsaWMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZTdHJpa2Uuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZVbmRlcmxpbmUuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCVRleHRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlRm9yKG5hbWVkU3R5bGUpOwotCQkJZkNsZWFyU3R5bGUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCb2xkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmU3RyaWtlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQm9sZC5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOwotCQkJZkl0YWxpYy5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7Ci0JCQlmU3RyaWtlLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0gpICE9IDApOwotCQkJZlVuZGVybGluZS5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkUpICE9IDApOwotCQkJaWYgKGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWZvcmVncm91bmQgPSBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJfQotCQkJaWYgKGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWJhY2tncm91bmQgPSBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpOwotCQkJfQotCQl9Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRDb2xvclZhbHVlKGZvcmVncm91bmQuZ2V0UkdCKCkpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldENvbG9yVmFsdWUoYmFja2dyb3VuZC5nZXRSR0IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29sb3IgdGhlIHRleHQgaW4gdGhlIHNhbXBsZSBhcmVhIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwcmVmZXJlbmNlcwotCSAqLwotCXZvaWQgYXBwbHlTdHlsZXMoKSB7Ci0JCWlmIChmVGV4dCA9PSBudWxsIHx8IGZUZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJLy8gbG9va3VwIHRoZSBsb2NhbCBjb2xvcmluZyB0eXBlIGFuZCBhcHBseSBpdAotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZkNvbnRleHRUb1N0eWxlTWFwLmdldChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSk7Ci0JCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVGb3IobmFtZWRTdHlsZSk7Ci0JCQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY3VycmVudFJlZ2lvbiksIGN1cnJlbnRSZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0U3R5bGUoKSk7Ci0JCQkJc3R5bGUuc3RyaWtlb3V0ID0gKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwOwotCQkJCXN0eWxlLnVuZGVybGluZSA9IChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwOwotCQkJCWZUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCQkJfQotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQl9Ci0KLQlCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tcG9zaXRlIGNvbnRyb2wgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCWZEZWZhdWx0Rm9yZWdyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCk7Ci0JCWZEZWZhdWx0QmFja2dyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLkhUTUxfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCk7Ci0KLQkJTGluayBsaW5rID0gbmV3IExpbmsocGFnZUNvbXBvbmVudCwgU1dULldSQVApOwotCQlsaW5rLnNldFRleHQoU1NFVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ19MaW5rKTsKLQkJbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKHBhcmVudC5nZXRTaGVsbCgpLCBlLnRleHQsIG51bGwsIG51bGwpOwotCQkJfQotCQl9KTsKLQotCQlHcmlkRGF0YSBsaW5rRGF0YT0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWxpbmtEYXRhLndpZHRoSGludD0gMTUwOyAvLyBvbmx5IGV4cGFuZCBmdXJ0aGVyIGlmIGFueW9uZSBlbHNlIHJlcXVpcmVzIGl0Ci0JCWxpbmsuc2V0TGF5b3V0RGF0YShsaW5rRGF0YSk7Ci0KLQkJbmV3IExhYmVsKHBhZ2VDb21wb25lbnQsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJbmV3IExhYmVsKHBhZ2VDb21wb25lbnQsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQlTYXNoRm9ybSBlZGl0b3IgPSBuZXcgU2FzaEZvcm0ocGFnZUNvbXBvbmVudCwgU1dULlZFUlRJQ0FMKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEyID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhMi5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWVkaXRvci5zZXRMYXlvdXREYXRhKGdyaWREYXRhMik7Ci0JCVNhc2hGb3JtIHRvcCA9IG5ldyBTYXNoRm9ybShlZGl0b3IsIFNXVC5IT1JJWk9OVEFMKTsKLQkJQ29tcG9zaXRlIHN0eWxlRWRpdG9yID0gY3JlYXRlQ29tcG9zaXRlKHRvcCwgMSk7Ci0JCSgoR3JpZExheW91dCkgc3R5bGVFZGl0b3IuZ2V0TGF5b3V0KCkpLm1hcmdpblJpZ2h0ID0gNTsKLQkJKChHcmlkTGF5b3V0KSBzdHlsZUVkaXRvci5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDA7Ci0JCWNyZWF0ZUxhYmVsKHN0eWxlRWRpdG9yLCBIVE1MVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMCk7Ci0JCWZTdHlsZXNWaWV3ZXIgPSBjcmVhdGVTdHlsZXNWaWV3ZXIoc3R5bGVFZGl0b3IpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IE1hdGgubWF4KGdyaWREYXRhLndpZHRoSGludCwgY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGl0ZXJhdG9yLm5leHQoKS50b1N0cmluZygpLmxlbmd0aCgpKSk7Ci0JCX0KLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCWZTdHlsZXNWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCUNvbXBvc2l0ZSBlZGl0aW5nQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvcCwgMSk7Ci0JCSgoR3JpZExheW91dCkgc3R5bGVFZGl0b3IuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSA1OwotCQljcmVhdGVMYWJlbChlZGl0aW5nQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnV0dG9uIGVuYWJsZXIgPSBjcmVhdGVDaGVja2JveChlZGl0aW5nQ29tcG9zaXRlLCBIVE1MVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMik7Ci0JCWVuYWJsZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVuYWJsZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQlDb21wb3NpdGUgZWRpdENvbnRyb2xzID0gY3JlYXRlQ29tcG9zaXRlKGVkaXRpbmdDb21wb3NpdGUsIDIpOwotCQkoKEdyaWRMYXlvdXQpIGVkaXRDb250cm9scy5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDIwOwotCi0JCWZGb3JlZ3JvdW5kTGFiZWwgPSBjcmVhdGVMYWJlbChlZGl0Q29udHJvbHMsIFNTRVVJTWVzc2FnZXMuRm9yZWdyb3VuZF9VSV8pOwotCQkoKEdyaWREYXRhKSBmRm9yZWdyb3VuZExhYmVsLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JTZWxlY3RvcihlZGl0Q29udHJvbHMpOwotCQlCdXR0b24gZkZvcmVncm91bmRDb2xvciA9IGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlmRm9yZWdyb3VuZENvbG9yLnNldExheW91dERhdGEoZ2QpOwotCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCYWNrZ3JvdW5kTGFiZWwgPSBjcmVhdGVMYWJlbChlZGl0Q29udHJvbHMsIFNTRVVJTWVzc2FnZXMuQmFja2dyb3VuZF9VSV8pOwotCQkoKEdyaWREYXRhKSBmQmFja2dyb3VuZExhYmVsLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JTZWxlY3RvcihlZGl0Q29udHJvbHMpOwotCQlCdXR0b24gZkJhY2tncm91bmRDb2xvciA9IGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlmQmFja2dyb3VuZENvbG9yLnNldExheW91dERhdGEoZ2QpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCb2xkID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBIVE1MVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMyk7Ci0JCWZCb2xkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmQm9sZC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkl0YWxpYyA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgSFRNTFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzQpOwotCQlmSXRhbGljLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmSXRhbGljLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmU3RyaWtlID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBIVE1MVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfNSk7Ci0JCWZTdHJpa2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZTdHJpa2UuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZVbmRlcmxpbmUgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIEhUTUxVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV82KTsKLQkJZlVuZGVybGluZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJKChHcmlkRGF0YSkgZlVuZGVybGluZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkNsZWFyU3R5bGUgPSBuZXcgQnV0dG9uKGVkaXRpbmdDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJZkNsZWFyU3R5bGUuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlJlc3RvcmVfRGVmYXVsdF9VSV8pOyAvLyROT04tTkxTLTEkID0gIlJlc3RvcmUgRGVmYXVsdCIKLQkJZkNsZWFyU3R5bGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORykpOwotCQkoKEdyaWREYXRhKWZDbGVhclN0eWxlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlDb21wb3NpdGUgc2FtcGxlQXJlYSA9IGNyZWF0ZUNvbXBvc2l0ZShlZGl0b3IsIDEpOwotCi0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDU7Ci0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luVG9wID0gNTsKLQkJY3JlYXRlTGFiZWwoc2FtcGxlQXJlYSwgU1NFVUlNZXNzYWdlcy5TYW1wbGVfdGV4dF9fVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICImU2FtcGxlIHRleHQ6IgotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFNvdXJjZVZpZXdlcihzYW1wbGVBcmVhLCBudWxsLCBTV1QuQk9SREVSIHwgU1dULkxFRlRfVE9fUklHSFQgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZlRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlHcmlkRGF0YSBncmlkRGF0YTMgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEzLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyMCk7Ci0JCWdyaWREYXRhMy5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJZ3JpZERhdGEzLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YTMpOwotCQlmVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWZUZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlmVGV4dC5hZGRLZXlMaXN0ZW5lcihnZXRUZXh0S2V5TGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkTW91c2VMaXN0ZW5lcihnZXRUZXh0TW91c2VMaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkVHJhdmVyc2VMaXN0ZW5lcihnZXRUcmF2ZXJzZUxpc3RlbmVyKCkpOwotCQlzZXRBY2Nlc3NpYmxlKGZUZXh0LCBTU0VVSU1lc3NhZ2VzLlNhbXBsZV90ZXh0X19VSV8pOwotCQlmRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwpOwotCQlmRG9jdW1lbnQuc2V0KGdldEV4YW1wbGVUZXh0KCkpOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZkRvY3VtZW50KTsKLQotCQl0b3Auc2V0V2VpZ2h0cyhuZXcgaW50W117MSwgMX0pOwotCQllZGl0b3Iuc2V0V2VpZ2h0cyhuZXcgaW50W117MSwgMX0pOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhZ2VDb21wb25lbnQsIElIZWxwQ29udGV4dElkcy5IVE1MX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCi0JCWZTdHlsZXNWaWV3ZXIuc2V0SW5wdXQoZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpKTsKLQotCQlhcHBseVN0eWxlcygpOwotCi0JCWZTdHlsZXNWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIWV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgewotCQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJCQlpZiAobmFtZWRTdHlsZSA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1swXTsKLQkJCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0Q29sb3JWYWx1ZSgpKTsKLQotCQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQkJc3R5bGVQcmVmc1swXSA9IG5ld1ZhbHVlOwotCQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1sxXTsKLQkJCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0Q29sb3JWYWx1ZSgpKTsKLQotCQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQkJc3R5bGVQcmVmc1sxXSA9IG5ld1ZhbHVlOwotCQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJvbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1syXTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZkJvbGQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbMl0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkl0YWxpYy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzNdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmSXRhbGljLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzNdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZTdHJpa2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1s0XTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZlN0cmlrZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1s0XSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmVW5kZXJsaW5lLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbNV07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZVbmRlcmxpbmUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbNV0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlmQ2xlYXJTdHlsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpCi0JCQkJCXJldHVybjsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpLnRvU3RyaW5nKCk7Ci0JCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VG9EZWZhdWx0KG5hbWVkU3R5bGUpOwotCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBwYWdlQ29tcG9uZW50OwotCX0KLQotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsYWJlbC5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXRCYWNrZ3JvdW5kKCkpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLy8gcHJvdGVjdGVkIExhYmVsIGNyZWF0ZURlc2NyaXB0aW9uTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQotCS8qKgotCSAqIFNldCB1cCBhbGwgdGhlIHN0eWxlIHByZWZlcmVuY2Uga2V5cyBpbiB0aGUgb3ZlcmxheSBzdG9yZQotCSAqLwotCXByaXZhdGUgT3ZlcmxheUtleVtdIGNyZWF0ZU92ZXJsYXlTdG9yZUtleXMoKSB7Ci0JCUxpc3Qgb3ZlcmxheUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJSXRlcmF0b3IgaSA9IGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCAoU3RyaW5nKSBpLm5leHQoKSkpOwotCQl9Ci0KLQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10ga2V5cyA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbb3ZlcmxheUtleXMuc2l6ZSgpXTsKLQkJb3ZlcmxheUtleXMudG9BcnJheShrZXlzKTsKLQkJcmV0dXJuIGtleXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgTGlzdCB2aWV3ZXIgd2hlcmUgd2Ugc2VlIHRoZSB2YXJpb3VzIHN5bnRheCBlbGVtZW50IGRpc3BsYXkKLQkgKiBuYW1lcy0td291bGQgaXQgZXZlciBiZSBhIFRyZWUgbGlrZSBKRFQncz8KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlciBjcmVhdGVTdHlsZXNWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTdHJ1Y3R1cmVkVmlld2VyIHN0eWxlc1ZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlzdHlsZXNWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgVmlld2VyQ29tcGFyYXRvcihDb2xsYXRvci5nZXRJbnN0YW5jZSgpKSk7Ci0JCXN0eWxlc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJT2JqZWN0IGRlc2NyaXB0aW9uID0gZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5nZXQoZWxlbWVudCk7Ci0JCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0JCQkJCXJldHVybiBkZXNjcmlwdGlvbi50b1N0cmluZygpOwotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9KTsKLQkJc3R5bGVzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpLnRvQXJyYXkoKTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gc3R5bGVzVmlld2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmT3ZlcmxheVN0b3JlICE9IG51bGwpIHsKLQkJCWZPdmVybGF5U3RvcmUuc3RvcCgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihTdHJpbmcgbmFtZWRTdHlsZSkgewotCQlUZXh0QXR0cmlidXRlIHRhID0gbmV3IFRleHRBdHRyaWJ1dGUoZkRlZmF1bHRGb3JlZ3JvdW5kLCBmRGVmYXVsdEJhY2tncm91bmQsIFNXVC5OT1JNQUwpOwotCi0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwgJiYgZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQkvLyBub3RlOiAibmFtZWRTdHlsZSIgKmlzKiB0aGUgcHJlZmVyZW5jZSBrZXkKLQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCi0JCQkJaW50IGZvbnRNb2RpZmllciA9IFNXVC5OT1JNQUw7Ci0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAyKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAzKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1szXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDQpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzRdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiA1KSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1s1XSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXRhID0gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgZm9udE1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGE7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RXhhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBIVE1MVUlNZXNzYWdlcy5TYW1wbGVfSFRNTF9kb2M7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJLy8gZW5zdXJlIHRoZSBvZmZzZXQgaXMgY2xlYW4KLQkJaWYgKG9mZnNldCA+PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0JCQlyZXR1cm4gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIDEpOwotCQllbHNlIGlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuIGdldE5hbWVkU3R5bGVBdE9mZnNldCgwKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiAhZG9jdW1lbnRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKGRvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIGZpbmQgdGhlIElUZXh0UmVnaW9uJ3MgQ29udGV4dCBhdCB0aGlzIG9mZnNldAotCQkJSVRleHRSZWdpb24gaW50ZXJlc3QgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKGludGVyZXN0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAob2Zmc2V0ID4gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChpbnRlcmVzdCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlTdHJpbmcgcmVnaW9uQ29udGV4dCA9IGludGVyZXN0LmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25Db250ZXh0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkvLyBmaW5kIHRoZSBuYW1lZCBzdHlsZSAoaW50ZXJuYWwvc2VsZWN0YWJsZSBuYW1lKSBmb3IgdGhhdAotCQkJLy8gY29udGV4dAotCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoU3RyaW5nKSBmQ29udGV4dFRvU3R5bGVNYXAuZ2V0KHJlZ2lvbkNvbnRleHQpOwotCQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBuYW1lZFN0eWxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBnZXRPdmVybGF5U3RvcmUoKSB7Ci0JCXJldHVybiBmT3ZlcmxheVN0b3JlOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkgewotCQlpZiAoZlN0eWxlUHJlZmVyZW5jZUtleXMgPT0gbnVsbCkgewotCQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfRVFVQUxTKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGKTsKLS8vCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLS8vCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0vLwkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUik7Ci0vLwkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCQkJZlN0eWxlUHJlZmVyZW5jZUtleXMgPSBzdHlsZXM7Ci0JCX0KLQkJcmV0dXJuIGZTdHlsZVByZWZlcmVuY2VLZXlzOwotCX0KLQotCXByaXZhdGUgS2V5TGlzdGVuZXIgZ2V0VGV4dEtleUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEtleUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW91c2VMaXN0ZW5lciBnZXRUZXh0TW91c2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb3VzZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJaW50IHggPSAoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5nZXRDYXJldE9mZnNldCgpOwotCQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KHgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0Q29sb3JBdE9mZnNldChlLngpOwotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0Q29sb3JBdE9mZnNldChlLngpOwotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhdmVyc2VMaXN0ZW5lciBnZXRUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyI2tleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpZiAoKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCkgfHwgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVMpKQotCQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQlzZXREZXNjcmlwdGlvbihTU0VVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nX0Rlc2NyaXB0aW9uKTsKLQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlpbml0U3R5bGVUb0Rlc2NyaXB0aW9uTWFwKCk7Ci0JCWluaXRSZWdpb25Db250ZXh0VG9TdHlsZU1hcCgpOwotCi0JCWZPdmVybGF5U3RvcmUgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZShnZXRQcmVmZXJlbmNlU3RvcmUoKSwgY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpKTsKLQkJZk92ZXJsYXlTdG9yZS5sb2FkKCk7Ci0JCWZPdmVybGF5U3RvcmUuc3RhcnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFJlZ2lvbkNvbnRleHRUb1N0eWxlTWFwKCkgewotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUyk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VMRU1FTlRfREVDTF9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFLCBJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1BFX1JFRkVSRU5DRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VMRU1FTlRfREVDTF9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT05fQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYsIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU0sIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGKTsKLQotLy8JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUik7Ci0vLwkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5ULCBJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCk7Ci0vLwkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLS8vCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQsIElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLS8vCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFN0eWxlVG9EZXNjcmlwdGlvbk1hcCgpIHsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLkNvbW1lbnRfRGVsaW1pdGVyc19VSV8pOyAvLyA9Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQsIFhNTFVJTWVzc2FnZXMuQ29tbWVudF9Db250ZW50X1VJXyk7IC8vID0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIFhNTFVJTWVzc2FnZXMuVGFnX0RlbGltaXRlcnNfVUlfKTsgLy8gPQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUsIFhNTFVJTWVzc2FnZXMuVGFnX05hbWVzX1VJXyk7IC8vID0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSwgWE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfTmFtZXNfVUlfKTsgLy8gPQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9FUVVBTFMsIFhNTFVJTWVzc2FnZXMuQXR0cmlidXRlX0VxdWFsc19VSV8pOwotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSwgWE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfVmFsdWVzX1VJXyk7IC8vID0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLkRlY2xhcmF0aW9uX0RlbGltaXRlcnNfVUlfKTsgLy8gPQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQsIFhNTFVJTWVzc2FnZXMuQ29udGVudF9VSV8pOyAvLyA9Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFLCBYTUxVSU1lc3NhZ2VzLkVudGl0eV9SZWZlcmVuY2VfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJFbnRpdHkgUmVmZXJlbmNlcyIKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX05hbWVfVUlfKTsgLy8gPQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX1NZU1RFTV9QVUJMSUNfS2V5d19VSV8pOyAvLyA9Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX1B1YmxpY19SZWZlcmVuY2VfVUlfKTsgLy8gPQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYsIFhNTFVJTWVzc2FnZXMuRE9DVFlQRV9TeXN0ZW1fUmVmZXJlbmNlX1VJXyk7IC8vID0KLS8vCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLlByb2Nlc3NpbmdfSW5zdHJ1Y3Rpb25fRGVsX1VJXyk7Ci0vLwkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQsIFhNTFVJTWVzc2FnZXMuUHJvY2Vzc2luZ19JbnN0cnVjdGlvbl9Db25fVUlfX1VJXyk7Ci0vLwkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5DREFUQV9EZWxpbWl0ZXJzX1VJXyk7Ci0vLwkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQsIFhNTFVJTWVzc2FnZXMuQ0RBVEFfQ29udGVudF9VSV8pOwotfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJZ2V0T3ZlcmxheVN0b3JlKCkubG9hZERlZmF1bHRzKCk7Ci0JCWFwcGx5U3R5bGVzKCk7Ci0JCWZTdHlsZXNWaWV3ZXIuc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOwotCQlhY3RpdmF0ZShudWxsKTsKLQkJZlRleHQucmVkcmF3KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlnZXRPdmVybGF5U3RvcmUoKS5wcm9wYWdhdGUoKTsKLQotCQlIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZWxlY3RDb2xvckF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBnZXROYW1lZFN0eWxlQXRPZmZzZXQob2Zmc2V0KTsKLQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCkgewotCQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmFtZWRTdHlsZSkpOwotCQkJZlN0eWxlc1ZpZXdlci5yZXZlYWwobmFtZWRTdHlsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmU3R5bGVzVmlld2VyLnNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJfQotCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBTcGVjaWZpY2FsbHkgc2V0IHRoZSByZXBvcnRpbmcgbmFtZSBvZiBhIGNvbnRyb2wgZm9yIGFjY2Vzc2liaWxpdHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QWNjZXNzaWJsZShDb250cm9sIGNvbnRyb2wsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZpbmFsIFN0cmluZyBuID0gbmFtZTsKLQkJY29udHJvbC5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5jaGlsZElEID09IEFDQy5DSElMRElEX1NFTEYpCi0JCQkJCWUucmVzdWx0ID0gbjsKLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MDBkODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLQotCi0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSBmb3IgSFRNTCB0ZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEhUTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSB7Ci0JCWNsYXNzIEhUTUxFZGl0VGVtcGxhdGVEaWFsb2cgZXh0ZW5kcyBFZGl0VGVtcGxhdGVEaWFsb2cgewotCQlwdWJsaWMgSFRNTEVkaXRUZW1wbGF0ZURpYWxvZyhTaGVsbCBwYXJlbnQsIFRlbXBsYXRlIHRlbXBsYXRlLCBib29sZWFuIGVkaXQsIGJvb2xlYW4gaXNOYW1lTW9kaWZpYWJsZSwgQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSkgewotCQkJc3VwZXIocGFyZW50LCB0ZW1wbGF0ZSwgZWRpdCwgaXNOYW1lTW9kaWZpYWJsZSwgcmVnaXN0cnkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCgpOwotCi0JCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RhbnQgZ2V0Q29udGVudEFzc2lzdGFudChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCQlDb250ZW50QXNzaXN0YW50IGFzc2lzdGFudCA9IG5ldyBDb250ZW50QXNzaXN0YW50KCk7Ci0JCQkJCWFzc2lzdGFudC5lbmFibGVBdXRvQWN0aXZhdGlvbih0cnVlKTsKLQkJCQkJYXNzaXN0YW50LmVuYWJsZUF1dG9JbnNlcnQodHJ1ZSk7Ci0JCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGdldFRlbXBsYXRlUHJvY2Vzc29yKCksIElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRSk7Ci0JCQkJCXJldHVybiBhc3Npc3RhbnQ7Ci0JCQkJfQotCQkJfTsKLQkJCXJldHVybiBkb0NyZWF0ZVZpZXdlcihwYXJlbnQsIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIEhUTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlKCkgewotCQlIVE1MVUlQbHVnaW4gaHRtbEVkaXRvclBsdWdpbiA9IEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCQotCQlzZXRQcmVmZXJlbmNlU3RvcmUoaHRtbEVkaXRvclBsdWdpbi5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCXNldFRlbXBsYXRlU3RvcmUoaHRtbEVkaXRvclBsdWdpbi5nZXRUZW1wbGF0ZVN0b3JlKCkpOwotCQlzZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KGh0bWxFZGl0b3JQbHVnaW4uZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotICAJICBib29sZWFuIG9rID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0gIAkgIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JICByZXR1cm4gb2s7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjaXNTaG93Rm9ybWF0dGVyU2V0dGluZygpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaG93Rm9ybWF0dGVyU2V0dGluZygpIHsKLQkJLy8gdGVtcGxhdGUgZm9ybWF0dGluZyBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgYW5jZXN0b3IpIHsKLQkJQ29udHJvbCBjID0gc3VwZXIuY3JlYXRlQ29udGVudHMoYW5jZXN0b3IpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGMsIElIZWxwQ29udGV4dElkcy5IVE1MX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQpOwotCQlyZXR1cm4gYzsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlI2NyZWF0ZVZpZXdlcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGJhc2VDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwoKTsKLQotCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQl9OwotCQlyZXR1cm4gZG9DcmVhdGVWaWV3ZXIocGFyZW50LCBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQl9Ci0KLQlTb3VyY2VWaWV3ZXIgZG9DcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiB2aWV3ZXJDb25maWd1cmF0aW9uKSB7Ci0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBudWxsOwotCQlTdHJpbmcgY29udGVudFR5cGVJRCA9IENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTDsKLQkJdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQl2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHNjcmF0Y2hNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKGNvbnRlbnRUeXBlSUQpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUodmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZWRpdCBkaWFsb2cuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUKLQkgKiBhIGN1c3RvbSBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlCi0JICogICAgICAgICAgICB0aGUgdGVtcGxhdGUgYmVpbmcgZWRpdGVkCi0JICogQHBhcmFtIGVkaXQKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGRpYWxvZyBzaG91bGQgYmUgZWRpdGFibGUKLQkgKiBAcGFyYW0gaXNOYW1lTW9kaWZpYWJsZQotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgdGVtcGxhdGUgbmFtZSBtYXkgYmUgbW9kaWZpZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIG9yIG1vZGlmaWVkIHRlbXBsYXRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIGVkaXRpb24gZmFpbGVkCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCBUZW1wbGF0ZSBlZGl0VGVtcGxhdGUoVGVtcGxhdGUgdGVtcGxhdGUsIGJvb2xlYW4gZWRpdCwgYm9vbGVhbiBpc05hbWVNb2RpZmlhYmxlKSB7Ci0JCUVkaXRUZW1wbGF0ZURpYWxvZyBkaWFsb2cgPSBuZXcgSFRNTEVkaXRUZW1wbGF0ZURpYWxvZyhnZXRTaGVsbCgpLCB0ZW1wbGF0ZSwgZWRpdCwgaXNOYW1lTW9kaWZpYWJsZSwgZ2V0Q29udGV4dFR5cGVSZWdpc3RyeSgpKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gZGlhbG9nLmdldFRlbXBsYXRlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFR5cGluZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MVHlwaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk0MmRmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MVHlwaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgSFRNTFR5cGluZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmQ2xvc2VDb21tZW50OwotCXByaXZhdGUgQnV0dG9uIGZDbG9zZUVuZFRhZzsKLQlwcml2YXRlIEJ1dHRvbiBmUmVtb3ZlRW5kVGFnOwotCXByaXZhdGUgQnV0dG9uIGZDbG9zZUVsZW1lbnQ7Ci0JcHJpdmF0ZSBCdXR0b24gZkNsb3NlU3RyaW5nczsKLQlwcml2YXRlIEJ1dHRvbiBmQ2xvc2VCcmFja2V0czsKLQkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQkJCi0JCWNyZWF0ZVN0YXJ0VGFnR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlRW5kVGFnR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlQXV0b0NvbXBsZXRlKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUF1dG9SZW1vdmUoY29tcG9zaXRlKTsKLQkJCi0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlU3RhcnRUYWdHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQotCQlncm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuWE1MVHlwaW5nX1N0YXJ0X1RhZyk7Ci0KLQkJZkNsb3NlRWxlbWVudCA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBYTUxVSU1lc3NhZ2VzLlhNTFR5cGluZ19Db21wbGV0ZV9FbGVtZW50cyk7Ci0JCSgoR3JpZERhdGEpIGZDbG9zZUVsZW1lbnQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbmRUYWdHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQotCQlncm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuWE1MVHlwaW5nX0VuZF9UYWcpOwotCi0JCWZDbG9zZUVuZFRhZyA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBYTUxVSU1lc3NhZ2VzLlhNTFR5cGluZ19Db21wbGV0ZV9FbmRfVGFncyk7Ci0JCSgoR3JpZERhdGEpIGZDbG9zZUVuZFRhZy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUF1dG9Db21wbGV0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQotCQlncm91cC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkhUTUxUeXBpbmdfQXV0b19Db21wbGV0ZSk7Ci0KLQkJZkNsb3NlQ29tbWVudCA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBIVE1MVUlNZXNzYWdlcy5IVE1MVHlwaW5nX0NvbXBsZXRlX0NvbW1lbnRzKTsKLQkJKChHcmlkRGF0YSkgZkNsb3NlQ29tbWVudC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQlmQ2xvc2VTdHJpbmdzID0gY3JlYXRlQ2hlY2tCb3goZ3JvdXAsIEhUTUxVSU1lc3NhZ2VzLkhUTUxUeXBpbmdfQ2xvc2VfU3RyaW5ncyk7Ci0JCSgoR3JpZERhdGEpIGZDbG9zZVN0cmluZ3MuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJZkNsb3NlQnJhY2tldHMgPSBjcmVhdGVDaGVja0JveChncm91cCwgSFRNTFVJTWVzc2FnZXMuSFRNTFR5cGluZ19DbG9zZV9CcmFja2V0cyk7Ci0JCSgoR3JpZERhdGEpIGZDbG9zZUJyYWNrZXRzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQXV0b1JlbW92ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQkJCi0JCWdyb3VwLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuSFRNTFR5cGluZ19BdXRvX1JlbW92ZSk7Ci0JCQotCQlmUmVtb3ZlRW5kVGFnID0gY3JlYXRlQ2hlY2tCb3goZ3JvdXAsIEhUTUxVSU1lc3NhZ2VzLkhUTUxUeXBpbmdfUmVtb3ZlX0VuZF9UYWdzKTsKLQkJKChHcmlkRGF0YSkgZlJlbW92ZUVuZFRhZy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLnBlcmZvcm1PaygpOwotCQkKLQkJSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWluaXRDaGVja2JveChmQ2xvc2VDb21tZW50LCBIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0NPTU1FTlRTKTsKLQkJaW5pdENoZWNrYm94KGZDbG9zZUVuZFRhZywgSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9FTkRfVEFHUyk7Ci0JCWluaXRDaGVja2JveChmQ2xvc2VFbGVtZW50LCBIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0VMRU1FTlRTKTsKLQkJaW5pdENoZWNrYm94KGZSZW1vdmVFbmRUYWcsIEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfUkVNT1ZFX0VORF9UQUdTKTsKLQkJaW5pdENoZWNrYm94KGZDbG9zZVN0cmluZ3MsIEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ0xPU0VfU1RSSU5HUyk7Ci0JCWluaXRDaGVja2JveChmQ2xvc2VCcmFja2V0cywgSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DTE9TRV9CUkFDS0VUUyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJZGVmYXVsdENoZWNrYm94KGZDbG9zZUNvbW1lbnQsIEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfQ09NTUVOVFMpOwotCQlkZWZhdWx0Q2hlY2tib3goZkNsb3NlRW5kVGFnLCBIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0VORF9UQUdTKTsKLQkJZGVmYXVsdENoZWNrYm94KGZDbG9zZUVsZW1lbnQsIEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRUxFTUVOVFMpOwotCQlkZWZhdWx0Q2hlY2tib3goZlJlbW92ZUVuZFRhZywgSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19SRU1PVkVfRU5EX1RBR1MpOwotCQlkZWZhdWx0Q2hlY2tib3goZkNsb3NlU3RyaW5ncywgSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DTE9TRV9TVFJJTkdTKTsKLQkJZGVmYXVsdENoZWNrYm94KGZDbG9zZUJyYWNrZXRzLCBIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NMT1NFX0JSQUNLRVRTKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfQ09NTUVOVFMsIChmQ2xvc2VDb21tZW50ICE9IG51bGwpID8gZkNsb3NlQ29tbWVudC5nZXRTZWxlY3Rpb24oKSA6IGZhbHNlKTsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9FTkRfVEFHUywgKGZDbG9zZUVuZFRhZyAhPSBudWxsKSA/IGZDbG9zZUVuZFRhZy5nZXRTZWxlY3Rpb24oKSA6IGZhbHNlKTsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9FTEVNRU5UUywgKGZDbG9zZUVsZW1lbnQgIT0gbnVsbCkgPyBmQ2xvc2VFbGVtZW50LmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX1JFTU9WRV9FTkRfVEFHUywgKGZSZW1vdmVFbmRUYWcgIT0gbnVsbCkgPyBmUmVtb3ZlRW5kVGFnLmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NMT1NFX1NUUklOR1MsIChmQ2xvc2VTdHJpbmdzICE9IG51bGwpID8gZkNsb3NlU3RyaW5ncy5nZXRTZWxlY3Rpb24oKSA6IGZhbHNlKTsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DTE9TRV9CUkFDS0VUUywgKGZDbG9zZUJyYWNrZXRzICE9IG51bGwpID8gZkNsb3NlQnJhY2tldHMuZ2V0U2VsZWN0aW9uKCkgOiBmYWxzZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExZjYxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5QaXhlbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU2Nyb2xsZWRQYWdlQ29udGVudDsKLQotcHVibGljIGNsYXNzIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIFNFVkVSSVRJRVMgPSB7VmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcsIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRX07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFRJTkdTX1NFQ1RJT05fTkFNRSA9ICJIVE1MVmFsaWRhdGlvblNldmVyaXRpZXMiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQaXhlbENvbnZlcnRlciBmUGl4ZWxDb252ZXJ0ZXI7Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29tbW9uQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21wb3NpdGUgcGFnZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQotCQkvL0dyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCXBhZ2Uuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlmUGl4ZWxDb252ZXJ0ZXIgPSBuZXcgUGl4ZWxDb252ZXJ0ZXIocGFyZW50KTsKLQkJCi0JCWZpbmFsIENvbXBvc2l0ZSBjb250ZW50ID0gY3JlYXRlVmFsaWRhdGlvblNlY3Rpb24ocGFnZSk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGE9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGZQaXhlbENvbnZlcnRlci5jb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDIwKTsKLQkJY29udGVudC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCXJldHVybiBwYWdlOwotCX0KLQkKLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVWYWxpZGF0aW9uU2VjdGlvbihDb21wb3NpdGUgcGFnZSkgewotCQlpbnQgbkNvbHVtbnMgPSAzOwotCQkKLQkJZmluYWwgU2Nyb2xsZWRQYWdlQ29udGVudCBzcENvbnRlbnQgPSBuZXcgU2Nyb2xsZWRQYWdlQ29udGVudChwYWdlKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBzcENvbnRlbnQuZ2V0Qm9keSgpOwotCQkKLQkJR3JpZExheW91dCBsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KG5Db2x1bW5zLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQ9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aD0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJTGFiZWwgZGVzY3JpcHRpb24gPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWRlc2NyaXB0aW9uLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVmFsaWRhdGlvbl9kZXNjcmlwdGlvbik7Ci0JCWRlc2NyaXB0aW9uLnNldEZvbnQocGFnZS5nZXRGb250KCkpOwotCi0JCQotCQlFeHBhbmRhYmxlQ29tcG9zaXRlIGVjOwotCQlDb21wb3NpdGUgaW5uZXI7Ci0JCVN0cmluZyBsYWJlbDsKLQkJCi0JCVN0cmluZ1tdIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsID0gbmV3IFN0cmluZ1tdIHsgSFRNTFVJTWVzc2FnZXMuVmFsaWRhdGlvbl9FcnJvciwgSFRNTFVJTWVzc2FnZXMuVmFsaWRhdGlvbl9XYXJuaW5nLCBIVE1MVUlNZXNzYWdlcy5WYWxpZGF0aW9uX0lnbm9yZSB9OwotCQkKLQkJLy8gRWxlbWVudCBzZWN0aW9uCi0JCQotCQllYyA9IGNyZWF0ZVN0eWxlU2VjdGlvbihjb21wb3NpdGUsIEhUTUxVSU1lc3NhZ2VzLkV4cGFuZGFibGVfbGFiZWxfZWxlbWVudHMsIG5Db2x1bW5zKTsKLQkJCi0JCWlubmVyID0gbmV3IENvbXBvc2l0ZShlYywgU1dULk5PTkUpOwotCQlpbm5lci5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotCQlpbm5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQobkNvbHVtbnMsIGZhbHNlKSk7Ci0JCWVjLnNldENsaWVudChpbm5lcik7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfODsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX1VOS05PV05fTkFNRSwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzk7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9JTlZBTElEX05BTUUsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xMDsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX1NUQVJUX0lOVkFMSURfQ0FTRSwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzExOwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fRU5EX0lOVkFMSURfQ0FTRSwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzEyOwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fTUlTU0lOR19TVEFSVCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzEzOwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fTUlTU0lOR19FTkQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xNDsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX1VOTkVDRVNTQVJZX0VORCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE1OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fSU5WQUxJRF9ESVJFQ1RJVkUsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xNjsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0lOVkFMSURfQ09OVEVOVCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE3OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fRFVQTElDQVRFLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTg7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9DT0VYSVNURU5DRSwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE5OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fVU5DTE9TRURfU1RBUlRfVEFHLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjA7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9VTkNMT1NFRF9FTkRfVEFHLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjE7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9JTlZBTElEX0VNUFRZX1RBRywgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkvLyBFbmQgRWxlbWVudCBTZWN0aW9uCi0JCQotCQkvLyBUaGUgQXR0cmlidXRlIHZhbGlkYXRpb24gc2VjdGlvbgotCQkKLQkJZWMgPSBjcmVhdGVTdHlsZVNlY3Rpb24oY29tcG9zaXRlLCBIVE1MVUlNZXNzYWdlcy5FeHBhbmRhYmxlX2xhYmVsX2F0dHJpYnV0ZXMsIG5Db2x1bW5zKTsKLQkJaW5uZXIgPSBuZXcgQ29tcG9zaXRlKGVjLCBTV1QuTk9ORSk7Ci0JCWlubmVyLnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0JCWlubmVyLnNldExheW91dChuZXcgR3JpZExheW91dChuQ29sdW1ucywgZmFsc2UpKTsKLQkJZWMuc2V0Q2xpZW50KGlubmVyKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8wOwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9VTkRFRklORURfTkFNRSwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX1VOREVGSU5FRF9WQUxVRSwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX05BTUVfTUlTTUFUQ0gsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8zOwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9JTlZBTElEX05BTUUsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV80OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9JTlZBTElEX1ZBTFVFLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfNTsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfRFVQTElDQVRFLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfNjsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfVkFMVUVfTUlTTUFUQ0gsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV83OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9WQUxVRV9VTkNMT1NFRCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzM1OwotCQkvLyBUT0RPOiB2YWxpZGF0ZSByZXNvdXJjZXM/Ci0JCS8vIGFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX1ZBTFVFX1JFU09VUkNFX05PVF9GT1VORCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCi0JCS8vIEVuZCBBdHRyaWJ1dGUgc2VjdGlvbgotCQkKLQkJCi0JCS8vIERvY3VtZW50IFR5cGUKLQkJZWMgPSBjcmVhdGVTdHlsZVNlY3Rpb24oY29tcG9zaXRlLCBIVE1MVUlNZXNzYWdlcy5FeHBhbmRhYmxlX2xhYmVsX2RvY3VtZW50X3R5cGUsIG5Db2x1bW5zKTsKLQkJCi0JCWlubmVyID0gbmV3IENvbXBvc2l0ZShlYywgU1dULk5PTkUpOwotCQlpbm5lci5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotCQlpbm5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQobkNvbHVtbnMsIGZhbHNlKSk7Ci0JCWVjLnNldENsaWVudChpbm5lcik7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjI7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRE9DX0RVUExJQ0FURSwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzIzOwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRPQ19JTlZBTElEX0NPTlRFTlQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yNDsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ET0NfRE9DVFlQRV9VTkNMT1NFRCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJLy8gRW5kIERvY3VtZW50IFR5cGUKLQkJCi0JCS8vIENvbW1lbnRzCi0JCWVjID0gY3JlYXRlU3R5bGVTZWN0aW9uKGNvbXBvc2l0ZSwgSFRNTFVJTWVzc2FnZXMuRXhwYW5kYWJsZV9sYWJlbF9jb21tZW50LCBuQ29sdW1ucyk7Ci0JCQotCQlpbm5lciA9IG5ldyBDb21wb3NpdGUoZWMsIFNXVC5OT05FKTsKLQkJaW5uZXIuc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLQkJaW5uZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KG5Db2x1bW5zLCBmYWxzZSkpOwotCQllYy5zZXRDbGllbnQoaW5uZXIpOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI3OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTU1FTlRfSU5WQUxJRF9DT05URU5ULCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjg7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NTUVOVF9VTkNMT1NFRCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJLy8gRW5kIENvbW1lbnRzCi0JCQotCQkKLQkJLy8gQ0RBVEEgU2VjdGlvbnMKLQkJZWMgPSBjcmVhdGVTdHlsZVNlY3Rpb24oY29tcG9zaXRlLCBIVE1MVUlNZXNzYWdlcy5FeHBhbmRhYmxlX2xhYmVsX2NkYXRhLCBuQ29sdW1ucyk7Ci0JCQotCQlpbm5lciA9IG5ldyBDb21wb3NpdGUoZWMsIFNXVC5OT05FKTsKLQkJaW5uZXIuc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLQkJaW5uZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KG5Db2x1bW5zLCBmYWxzZSkpOwotCQllYy5zZXRDbGllbnQoaW5uZXIpOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI5OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNEQVRBX0lOVkFMSURfQ09OVEVOVCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzMwOwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNEQVRBX1VOQ0xPU0VELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQkvLyBFbmQgQ0RBVEEgU2VjdGlvbnMKLQkJCi0JCS8vIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb25zCi0JCWVjID0gY3JlYXRlU3R5bGVTZWN0aW9uKGNvbXBvc2l0ZSwgSFRNTFVJTWVzc2FnZXMuRXhwYW5kYWJsZV9sYWJlbF9waSwgbkNvbHVtbnMpOwotCQkKLQkJaW5uZXIgPSBuZXcgQ29tcG9zaXRlKGVjLCBTV1QuTk9ORSk7Ci0JCWlubmVyLnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0JCWlubmVyLnNldExheW91dChuZXcgR3JpZExheW91dChuQ29sdW1ucywgZmFsc2UpKTsKLQkJZWMuc2V0Q2xpZW50KGlubmVyKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8zMTsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5QSV9JTlZBTElEX0NPTlRFTlQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8zMjsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5QSV9VTkNMT1NFRCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJLy8gRW5kIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb25zCi0JCQotCQkvLyBFbnRpdHkgUmVmZXJlbmNlcwotCQllYyA9IGNyZWF0ZVN0eWxlU2VjdGlvbihjb21wb3NpdGUsIEhUTUxVSU1lc3NhZ2VzLkV4cGFuZGFibGVfbGFiZWxfZW50aXR5X3JlZiwgbkNvbHVtbnMpOwotCQkKLQkJaW5uZXIgPSBuZXcgQ29tcG9zaXRlKGVjLCBTV1QuTk9ORSk7Ci0JCWlubmVyLnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0JCWlubmVyLnNldExheW91dChuZXcgR3JpZExheW91dChuQ29sdW1ucywgZmFsc2UpKTsKLQkJZWMuc2V0Q2xpZW50KGlubmVyKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8zMzsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5SRUZfSU5WQUxJRF9DT05URU5ULCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMzQ7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuUkVGX1VOREVGSU5FRCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJCi0JCS8vIEVuZCBFbnRpdHkgUmVmZXJlbmNlcwotCQkKLQkJCi0JCS8vIFRleHQgQ29udGVudAotCQllYyA9IGNyZWF0ZVN0eWxlU2VjdGlvbihjb21wb3NpdGUsIEhUTUxVSU1lc3NhZ2VzLkV4cGFuZGFibGVfbGFiZWxfdGV4dCwgbkNvbHVtbnMpOwotCQkKLQkJaW5uZXIgPSBuZXcgQ29tcG9zaXRlKGVjLCBTV1QuTk9ORSk7Ci0JCWlubmVyLnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0JCWlubmVyLnNldExheW91dChuZXcgR3JpZExheW91dChuQ29sdW1ucywgZmFsc2UpKTsKLQkJZWMuc2V0Q2xpZW50KGlubmVyKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yNTsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5URVhUX0lOVkFMSURfQ09OVEVOVCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI2OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRFWFRfSU5WQUxJRF9DSEFSLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQkvLyBFbmQgVGV4dCBDb250ZW50Ci0JCQotCQlyZXN0b3JlU2VjdGlvbkV4cGFuc2lvblN0YXRlcyhnZXREaWFsb2dTZXR0aW5ncygpLmdldFNlY3Rpb24oU0VUVElOR1NfU0VDVElPTl9OQU1FKSk7Ci0JCQotCQlyZXR1cm4gc3BDb250ZW50OwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybURlZmF1bHRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXJlc2V0U2V2ZXJpdGllcygpOwotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3RvcmVTZWN0aW9uRXhwYW5zaW9uU3RhdGVzKGdldERpYWxvZ1NldHRpbmdzKCkuYWRkTmV3U2VjdGlvbihTRVRUSU5HU19TRUNUSU9OX05BTUUpKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFF1YWxpZmllcigpIHsKLQkJcmV0dXJuIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpIHsKLQkJcmV0dXJuIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcmVuY2VQYWdlSUQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMudmFsaWRhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvamVjdFNldHRpbmdzS2V5KCkgewotCQlyZXR1cm4gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVNFX1BST0pFQ1RfU0VUVElOR1M7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eVBhZ2VJRCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcm9wZXJ0eVBhZ2UucHJvamVjdC52YWxpZGF0aW9uIjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1Byb3BlcnR5UHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1Byb3BlcnR5UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5NWM4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9Qcm9wZXJ0eVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Db250cm9sRW5hYmxlU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3REaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlRhc2tUYWdQcmVmZXJlbmNlS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotLyoqCi0gKiBCYXNlZCBsb29zZWx5IG9uIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5Qcm9wZXJ0eUFuZFByZWZlcmVuY2VQYWdlCi0gKi8KLWFic3RyYWN0IGNsYXNzIFByb3BlcnR5UHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnUHJlZmVyZW5jZXMgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wcmVmZXJlbmNlcy1wcm9wZXJ0aWVzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKgotCSAqIERpc2FibGUgbGluayBkYXRhLCBwcmV2ZW50cyB0aGUgZGlzcGxheSBvZiBhICJ3b3Jrc3BhY2UiIG9yICJwcm9qZWN0IgotCSAqIHNldHRpbmdzIGxpbmsgdG8gcHJldmVudCByZWN1cnNpdmUgZGlhbG9nIGxhdW5jaGluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBESVNBQkxFX0xJTksgPSAiRElTQUJMRV9MSU5LIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNYXAgZkRhdGEgPSBudWxsOwotCi0JcHJpdmF0ZSBCdXR0b24gZkVuYWJsZVByb2plY3RTZXR0aW5nczsKLQotCXByaXZhdGUgTGluayBmUHJvamVjdFNldHRpbmdzTGluazsKLQkKLQlwcml2YXRlIENvbnRyb2wgZkNvbW1vbjsKLQkKLQlwcml2YXRlIENvbnRyb2xFbmFibGVTdGF0ZSBmRW5hYmxlbWVudHM7Ci0KLQlwdWJsaWMgUHJvcGVydHlQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBhcHBseURhdGEoT2JqZWN0IGRhdGEpIHsKLQkJc3VwZXIuYXBwbHlEYXRhKGRhdGEpOwotCQlpZiAoZGF0YSBpbnN0YW5jZW9mIE1hcCkgewotCQkJZkRhdGEgPSAoTWFwKSBkYXRhOwotCQkJdXBkYXRlTGlua0VuYWJsZW1lbnQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBDb250cm9sIGNyZWF0ZUNvbW1vbkNvbnRlbnRzKENvbXBvc2l0ZSBjb21wb3NpdGUpOwotCi0JcHVibGljIGZpbmFsIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlDb21wb3NpdGUgY2hlY2tMaW5rQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY2hlY2tMaW5rQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQljaGVja0xpbmtDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJaWYgKGdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQlmRW5hYmxlUHJvamVjdFNldHRpbmdzID0gbmV3IEJ1dHRvbihjaGVja0xpbmtDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCQlmRW5hYmxlUHJvamVjdFNldHRpbmdzLnNldFRleHQoU1NFVUlNZXNzYWdlcy5FbmFibGVQcm9qZWN0U2V0dGluZ3MpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJZkVuYWJsZVByb2plY3RTZXR0aW5ncy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJCWJvb2xlYW4gZW5hYmxlZEZvclByb2plY3QgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKClbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5nZXRCb29sZWFuKGdldFByb2plY3RTZXR0aW5nc0tleSgpLCBmYWxzZSk7Ci0JCQlmRW5hYmxlUHJvamVjdFNldHRpbmdzLnNldFNlbGVjdGlvbihlbmFibGVkRm9yUHJvamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMYWJlbCBzcGFjZXIgPSBuZXcgTGFiZWwoY2hlY2tMaW5rQ29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQkJc3BhY2VyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQl9Ci0KLQkJZlByb2plY3RTZXR0aW5nc0xpbmsgPSBuZXcgTGluayhjaGVja0xpbmtDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZlByb2plY3RTZXR0aW5nc0xpbmsuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkJFR0lOTklORywgdHJ1ZSwgZmFsc2UpKTsKLQotCQkvKgotCQkgKiAiZWxlbWVudCIgc2hvdWxkIGJlIGEgcHJvamVjdCwgaWYgbnVsbCwgbGluayB0byBwZXItcHJvamVjdAotCQkgKiBwcm9wZXJ0aWVzCi0JCSAqLwotCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCWZQcm9qZWN0U2V0dGluZ3NMaW5rLnNldFRleHQoIjxhPiIgKyBTU0VVSU1lc3NhZ2VzLkNvbmZpZ3VyZVdvcmtzcGFjZVNldHRpbmdzICsgIjwvYT4iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIHsKLQkJCWZQcm9qZWN0U2V0dGluZ3NMaW5rLnNldFRleHQoIjxhPiIgKyBTU0VVSU1lc3NhZ2VzLkNvbmZpZ3VyZVByb2plY3RTZXR0aW5ncyArICI8L2E+Iik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCX0KLQotCQl1cGRhdGVMaW5rRW5hYmxlbWVudCgpOwotCi0JCWZQcm9qZWN0U2V0dGluZ3NMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoZ2V0UHJvamVjdCgpID09IG51bGwpIHsKLQkJCQkJb3BlblByb2plY3RTZXR0aW5ncygpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJb3BlbldvcmtzcGFjZVNldHRpbmdzKCk7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCi0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCQlsaW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQl9Ci0KLS8vCQlmaW5hbCBDb250cm9sIGNvbW1vbiA9IGNyZWF0ZUNvbW1vbkNvbnRlbnRzKGNvbXBvc2l0ZSk7Ci0JCWZDb21tb24gPSBjcmVhdGVDb21tb25Db250ZW50cyhjb21wb3NpdGUpOwotCQkKLQkJZkNvbW1vbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlpZiAoZkVuYWJsZVByb2plY3RTZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQlTZWxlY3Rpb25BZGFwdGVyIHNlbGVjdGlvbkFkYXB0ZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCQllbmFibGVQcmVmZXJlbmNlQ29udGVudChmRW5hYmxlUHJvamVjdFNldHRpbmdzLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQkJc2VsZWN0aW9uQWRhcHRlci53aWRnZXRTZWxlY3RlZChudWxsKTsKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3MuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uQWRhcHRlcik7Ci0JCX0KLQkJCi0JCWFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBJU2NvcGVDb250ZXh0W10gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBJU2NvcGVDb250ZXh0W117bmV3IFByb2plY3RTY29wZShwcm9qZWN0KSwgbmV3IEluc3RhbmNlU2NvcGUoKSwgbmV3IERlZmF1bHRTY29wZSgpfTsKLQkJfQotCQlyZXR1cm4gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJRCgpOwotCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCWlmIChnZXRFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJcmV0dXJuIChJUHJvamVjdCkgZ2V0RWxlbWVudCgpOwotCQkJfQotCQkJT2JqZWN0IGFkYXB0ZXIgPSBnZXRFbGVtZW50KCkuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJcmV0dXJuIChJUHJvamVjdCkgYWRhcHRlcjsKLQkJCX0KLQkJCWFkYXB0ZXIgPSBnZXRFbGVtZW50KCkuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCXJldHVybiAoSVByb2plY3QpIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcm9qZWN0U2V0dGluZ3NLZXkoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvcGVydHlQYWdlSUQoKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzRWxlbWVudFNldHRpbmdzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGZFbmFibGVQcm9qZWN0U2V0dGluZ3MgIT0gbnVsbCAmJiBmRW5hYmxlUHJvamVjdFNldHRpbmdzLmdldFNlbGVjdGlvbigpOwotCX0KLQotCXZvaWQgb3BlblByb2plY3RTZXR0aW5ncygpIHsKLQkJTGlzdERpYWxvZyBkaWFsb2cgPSBuZXcgTGlzdERpYWxvZyhnZXRTaGVsbCgpKSB7Ci0KLQkJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJCUNvbnRyb2wgYXJlYSA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEoY29udGFpbmVyKTsKLQkJCQlnZXRUYWJsZVZpZXdlcigpLnNldFNvcnRlcihuZXcgUmVzb3VyY2VTb3J0ZXIoUmVzb3VyY2VTb3J0ZXIuTkFNRSkpOwotCQkJCXJldHVybiBhcmVhOwotCQkJfQotCQl9OwotCQlkaWFsb2cuc2V0TWVzc2FnZShTU0VVSU1lc3NhZ2VzLlByb3BlcnR5UHJlZmVyZW5jZVBhZ2VfMDIpOwotCQlkaWFsb2cuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoSVdvcmtzcGFjZSkgaW5wdXRFbGVtZW50KS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCX0pOwotCQlkaWFsb2cuc2V0TGFiZWxQcm92aWRlcihuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRMYWJlbERlY29yYXRvcigpKSk7Ci0JCWRpYWxvZy5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkpOwotCQlkaWFsb2cuc2V0VGl0bGUoU1NFVUlNZXNzYWdlcy5Qcm9wZXJ0eVByZWZlcmVuY2VQYWdlXzAxKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlPYmplY3RbXSByZXN1bHQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCQlpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBkaWFsb2cuZ2V0UmVzdWx0KClbMF07Ci0JCQkJTWFwIGRhdGEgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWRhdGEucHV0KERJU0FCTEVfTElOSywgQm9vbGVhbi5UUlVFKTsKLQkJCQlQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJvcGVydHlEaWFsb2dPbihnZXRTaGVsbCgpLCBwcm9qZWN0LCBnZXRQcm9wZXJ0eVBhZ2VJRCgpLCBuZXcgU3RyaW5nW117Z2V0UHJvcGVydHlQYWdlSUQoKX0sIGRhdGEpLm9wZW4oKTsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgb3BlbldvcmtzcGFjZVNldHRpbmdzKCkgewotCQlNYXAgZGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCWRhdGEucHV0KERJU0FCTEVfTElOSywgQm9vbGVhbi5UUlVFKTsKLQkJUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBnZXRQcmVmZXJlbmNlUGFnZUlEKCksIG5ldyBTdHJpbmdbXXtnZXRQcmVmZXJlbmNlUGFnZUlEKCl9LCBkYXRhKS5vcGVuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIG9rID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0JCUlTY29wZUNvbnRleHRbXSBwcmVmZXJlbmNlU2NvcGVzID0gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpOwotCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCWlmIChpc0VsZW1lbnRTZXR0aW5nc0VuYWJsZWQoKSkgewotCQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNldHRpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QRVJfUFJPSkVDVCArICIgKCIgKyB0cnVlICsgIikgaW4gc2NvcGUgIiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TmFtZSgpICsgIjoiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAgCi0JCQkJfQotCQkJCXByZWZlcmVuY2VTY29wZXNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5wdXRCb29sZWFuKGdldFByb2plY3RTZXR0aW5nc0tleSgpLCBmRW5hYmxlUHJvamVjdFNldHRpbmdzLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHJlbW92aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUEVSX1BST0pFQ1QgKyAiIGZyb20gc2NvcGUgIiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TmFtZSgpICsgIjoiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCX0KLQkJCQlwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucmVtb3ZlKGdldFByb2plY3RTZXR0aW5nc0tleSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb2s7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJaWYoZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgZkVuYWJsZVByb2plY3RTZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQlmRW5hYmxlUHJvamVjdFNldHRpbmdzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQllbmFibGVQcmVmZXJlbmNlQ29udGVudChmYWxzZSk7Ci0JCX0KLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUxpbmtFbmFibGVtZW50KCkgewotCQlpZiAoZkRhdGEgIT0gbnVsbCAmJiBmUHJvamVjdFNldHRpbmdzTGluayAhPSBudWxsKSB7Ci0JCQlmUHJvamVjdFNldHRpbmdzTGluay5zZXRFbmFibGVkKCFCb29sZWFuLlRSVUUuZXF1YWxzKGZEYXRhLmdldChESVNBQkxFX0xJTkspKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udHJvbHMgdGhlIGVuYWJsZW1lbnQgb2YgdGhlIGNvbW1vbiBjb250ZW50IHJlZ2lvbgotCSAqIG9mIGEgcHJvcGVydHkgb3IgcHJlZmVyZW5jZSBwYWdlCi0JICogCi0JICogQHBhcmFtIGVuYWJsZSB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgY29tbW9uIGNvbnRlbnQKLQkgKiBhcmVhCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlUHJlZmVyZW5jZUNvbnRlbnQoYm9vbGVhbiBlbmFibGUpIHsKLQkJaWYoZW5hYmxlKSB7Ci0JCQlpZihmRW5hYmxlbWVudHMgIT0gbnVsbCkgewotCQkJCWZFbmFibGVtZW50cy5yZXN0b3JlKCk7Ci0JCQkJZkVuYWJsZW1lbnRzID0gbnVsbDsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmKGZFbmFibGVtZW50cyA9PSBudWxsKQotCQkJCWZFbmFibGVtZW50cyA9IENvbnRyb2xFbmFibGVTdGF0ZS5kaXNhYmxlKGZDb21tb24pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NWFiOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySFRNTCBpbXBsZW1lbnRzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgewotCi0KLQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQkJLy8gdGhlc2UgYXJlIHRoZSBub3JtYWwgZWRpdCBzaWRlIGNvbnRlbnQgYmFzZWQgZmFjdG9yaWVzCi0JCWFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhzdHJ1Y3R1cmVkTW9kZWwpOwotCQkvLyBNdXN0IHVwZGF0ZS9hZGQgdG8gcHJvcGFnYXRpbmcgYWRhcHRlciBoZXJlIHRvbwotCQlpZiAoc3RydWN0dXJlZE1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQlhZGRQcm9wYWdhdGluZ0FkYXB0ZXJzKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50QmFzZWRGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCQlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gc3RydWN0dXJlZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZhY3RvcnlSZWdpc3RyeSwgIlByb2dyYW0gRXJyb3I6IGNsaWVudCBjYWxsZXIgbXVzdCBlbnN1cmUgbW9kZWwgaGFzIGZhY3RvcnkgcmVnaXN0cnkiKTsgLy8kTk9OLU5MUy0xJAotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCi0JCWZhY3RvcnkgPSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3RvcnkgPSBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MKCk7Ci0JCQlmYWN0b3J5UmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BhZ2F0aW5nQWRhcHRlcnMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJLy8gbm8gcHJvcGFnYXRpbmcgdG8gYWRkCi0JfQotCi0JLyoKLQkgKiBAc2VlIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIjaXNGb3IoQ29udGVudFR5cGVEZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihJRG9jdW1lbnRUeXBlSGFuZGxlciBjb250ZW50VHlwZURlc2NyaXB0aW9uKSB7Ci0JCXJldHVybiAoY29udGVudFR5cGVEZXNjcmlwdGlvbiBpbnN0YW5jZW9mIE1vZGVsSGFuZGxlckZvckhUTUwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZUZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBub3RoaW5nIHRvIGRvLCBzaW5jZSBubyBlbWJlZGRlZCB0eXBlCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zZWFyY2gvSFRNTEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zZWFyY2gvSFRNTEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzJjNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc2VhcmNoL0hUTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5GaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBTZXRzIHVwIEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIGZvciBodG1sIGZpbmQgb2NjdXJyZW5jZXMgcHJvY2Vzc29ycwotICovCi1wdWJsaWMgY2xhc3MgSFRNTEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIGV4dGVuZHMgRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgTGlzdCBmUHJvY2Vzc29yczsKLQotCXByb3RlY3RlZCBMaXN0IGdldFByb2Nlc3NvcnMoKSB7Ci0JCWlmIChmUHJvY2Vzc29ycyA9PSBudWxsKSB7Ci0JCQlmUHJvY2Vzc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgaHRtbFByb2Nlc3NvciA9IG5ldyBIVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yKCk7Ci0JCQlmUHJvY2Vzc29ycy5hZGQoaHRtbFByb2Nlc3Nvcik7Ci0JCX0KLQkJcmV0dXJuIGZQcm9jZXNzb3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3NlYXJjaC9IVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zZWFyY2gvSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjBlZmExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3NlYXJjaC9IVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotCi0vKioKLSAqIENvbmZpZ3VyZXMgYSBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3Igd2l0aCBIVE1MIHBhcnRpdGlvbnMgYW5kIHJlZ2lvbnMKLSAqLwotcHVibGljIGNsYXNzIEhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZXh0ZW5kcyBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgewotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFBhcnRpdGlvblR5cGVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQsIElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UmVnaW9uVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117RE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUsIERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSwgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzSFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWY3NjVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0hUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi0vKioKLSAqIENvbnRhaW5zIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHN0eWxlcyB1c2VkIGJ5IExpbmVTdHlsZVByb3ZpZGVyLCBDb2xvck1hbmFnZXIsIGFuZAotICogYW55IG90aGVycyB3aG8gbWF5IGJlIGludGVyZXN0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVDb25zdGFudHNIVE1MIGV4dGVuZHMgSVN0eWxlQ29uc3RhbnRzWE1MIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFRfQVJFQV9CT1JERVIgPSAiU0NSSVBUX0FSRUFfQk9SREVSIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUX0FSRUEgPSAiU0NSSVBUX0FSRUEiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYjZmNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JYTUw7Ci0KLXB1YmxpYyBjbGFzcyBMaW5lU3R5bGVQcm92aWRlckZvckhUTUwgZXh0ZW5kcyBMaW5lU3R5bGVQcm92aWRlckZvclhNTCBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyIHsKLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlckZvckhUTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogYSBtZXRob2QgdG8gY2VudHJhbGl6ZSBhbGwgdGhlICJmb3JtYXQgcnVsZXMiIGZvciByZWdpb25zIAotCSAqIHNwZWNpZmljYWxseSBhc3NvY2lhdGVkIGZvciBob3cgdG8gIm9wZW4iIHRoZSByZWdpb24uCi0JICovCi0JLy8gTk9URTogdGhpcyBtZXRob2Qgd2FzIGp1c3QgY29waWVkIGRvd24gZm9ybSBMaW5lU3R5bGVQcm92aWRlckZvclhNTAotCXB1YmxpYyBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJLy8gbm90IHN1cmUgd2h5IHRoaXMgaXMgY29taW5nIHRocm91Z2ggbnVsbCwgYnV0IGp1c3QgdG8gY2F0Y2ggaXQKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKWdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCX0KLQkJLy8gd29ya2Fyb3VuZDogbWFrZSBQSSBlZGdlcyB0aGUgc2FtZSBjb2xvciBhcyB0YWcgZWRnZXMKLQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJfQotCQkvLyBmaXJzdCB0cnkgInN0YW5kYXJkIiB0YWcgYXR0cmlidXRlcyBmcm9tIHN1cGVyIGNsYXNzCi0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVGb3IocmVnaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlzdXBlci5sb2FkQ29sb3JzKCk7Ci0KLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmS2V5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCS8vIGNoZWNrIGlmIHByZWZlcmVuY2UgY2hhbmdlZCBpcyBhIHN0eWxlIHByZWZlcmVuY2UKLQkJCWlmIChJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQotCQkJCS8vIHRoaXMgaXMgd2hhdCBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyLnByb3BlcnR5Q2hhbmdlKCkgZG9lcwotCQkJCWdldEhpZ2hsaWdodGVyKCkucmVmcmVzaERpc3BsYXkoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3VwZXIuaGFuZGxlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuaGFuZGxlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciNnZXRDb2xvclByZWZlcmVuY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90YWdpbmZvL0hUTUxJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90YWdpbmZvL0hUTUxJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmODU5YzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi0vKioKLSAqIFByb3ZpZGVzIGNvbnRleHQgaW5mb3JtYXRpb24gZm9yIEhUTUwgdGFncyAoU2hvd3MgdG9vbHRpcCBkZXNjcmlwdGlvbikKLSAqIAotICogQGRlcHJlY2F0ZWQgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGNyZWF0ZXMgdGhlIGFwcHJvcHJpYXRlCi0gKiAgICAgICAgICAgICBpbmZvcm1hdGlvbiBwcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgSFRNTEluZm9ybWF0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJSW5mb3JtYXRpb25Qcm92aWRlciwgSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb24gewotCi0JcHJpdmF0ZSBJVGV4dEhvdmVyIGZUZXh0SG92ZXIgPSBudWxsOwotCi0JcHVibGljIEhUTUxJbmZvcm1hdGlvblByb3ZpZGVyKCkgewotCQlmVGV4dEhvdmVyID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRleHRIb3Zlck1hbmFnZXIoKS5jcmVhdGVCZXN0TWF0Y2hIb3ZlcihuZXcgSFRNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXIjZ2V0U3ViamVjdChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGdldFN1YmplY3QoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlclJlZ2lvbih0ZXh0Vmlld2VyLCBvZmZzZXQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlciNnZXRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRJbmZvcm1hdGlvbjIodGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uI2dldEluZm9ybWF0aW9uMihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24yKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlckluZm8odGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90YWdpbmZvL0hUTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5MTg2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90YWdpbmZvL0hUTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50YWdpbmZvOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFnaW5mby5YTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3I7Ci0KLS8qKgotICogUHJvdmlkZXMgaG92ZXIgaGVscCBkb2N1bWVudGF0aW9uIGZvciBIVE1MIHRhZ3MKLSAqIAotICogQGF1dGhvciBhbXl3dQotICovCi1wdWJsaWMgY2xhc3MgSFRNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvciBleHRlbmRzIFhNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvciB7Ci0JLy8JY3VycmVudGx5IGVtcHR5IGJlY2F1c2UgWE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yIGhhbmRsZXMgYWxsIGNhc2VzIHJlbGV2YW50IHRvIEhUTUwKLQlwdWJsaWMgSFRNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhN2QxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlNpbXBsZVRlbXBsYXRlVmFyaWFibGVSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci0KLQotcHVibGljIGNsYXNzIEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySFRNTCBleHRlbmRzIFNpbXBsZVRlbXBsYXRlVmFyaWFibGVSZXNvbHZlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX1RZUEUgPSBnZXRFbmNvZGluZ1R5cGUoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFbmNvZGluZ1R5cGUoKSB7Ci0JCXJldHVybiAiZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlbmNvZGluZyB2YXJpYWJsZQotCSAqLwotCXB1YmxpYyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckhUTUwoKSB7Ci0JCXN1cGVyKEVOQ09ESU5HX1RZUEUsIEhUTUxVSU1lc3NhZ2VzLkNyZWF0aW5nX2ZpbGVzX2VuY29kaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmUoVGVtcGxhdGVDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExODA1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5HbG9iYWxUZW1wbGF0ZVZhcmlhYmxlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIEhUTUwgdGVtcGxhdGUgY29udGV4dCB0eXBlcy4gVGVtcGxhdGVzIG9mIHRoaXMgY29udGV4dCB0eXBlCi0gKiBhcHBseSB0byBhbnkgcGxhY2Ugd2l0aGluIEhUTUwgY29udGVudCB0eXBlLgotICovCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVDb250ZXh0VHlwZUhUTUwgZXh0ZW5kcyBUZW1wbGF0ZUNvbnRleHRUeXBlIHsKLQotCXB1YmxpYyBUZW1wbGF0ZUNvbnRleHRUeXBlSFRNTCgpIHsKLQkJc3VwZXIoKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkN1cnNvcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRhdGUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Eb2xsYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5MaW5lU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVGltZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlVzZXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Xb3JkU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuWWVhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySFRNTCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTRiMTNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLQotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTCA9IGdldEFsbCgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFID0gZ2V0QXR0cmlidXRlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVkFMVUUgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXID0gZ2V0TmV3KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBnZXRUYWcoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBbGwoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfYWxsIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfYXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9hdHRyaWJ1dGVfdmFsdWUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ldygpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9uZXciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRhZygpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl90YWciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuICJodG1sIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvQ2hhcmFjdGVyUGFpckluc2VydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0NoYXJhY3RlclBhaXJJbnNlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE4YWRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvQ2hhcmFjdGVyUGFpckluc2VydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZXh0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MVUlQcmVmZXJlbmNlTmFtZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnR5cGluZy5BYnN0cmFjdENoYXJhY3RlclBhaXJJbnNlcnRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgQ2hhcmFjdGVyUGFpckluc2VydGVyIGV4dGVuZHMgQWJzdHJhY3RDaGFyYWN0ZXJQYWlySW5zZXJ0ZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7DQotDQotCS8vIHByZWZlcmVuY2VzDQotCXByaXZhdGUgYm9vbGVhbiBmQ2xvc2VTdHJpbmdzID0gdHJ1ZTsNCi0JcHJpdmF0ZSBib29sZWFuIGZDbG9zZUJyYWNrZXRzID0gdHJ1ZTsNCi0NCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkUGFpcihJU291cmNlVmlld2VyIHZpZXdlciwgY2hhciBjKSB7DQotCQlzd2l0Y2ggKGMpIHsNCi0JCQljYXNlICdcJyc6DQotCQkJY2FzZSAnIic6DQotCQkJCXJldHVybiBmQ2xvc2VTdHJpbmdzID8gY2hlY2tSZWdpb24odmlld2VyKSA6IGZhbHNlOw0KLQkJCWRlZmF1bHQ6DQotCQkJCXJldHVybiBmQ2xvc2VCcmFja2V0czsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIGlmIHRoZSByZWdpb24gc2hvdWxkIHN1cHBvcnQgcGFpcmVkIHF1b3Rlcw0KLQkgKiBAcGFyYW0gdmlld2VyIHRoZSB2aWV3ZXINCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSByZWdpb24gaXMgbm90IGluIGFuIFhNTCBhdHRyaWJ1dGUgdmFsdWUNCi0JICovDQotCXByaXZhdGUgYm9vbGVhbiBjaGVja1JlZ2lvbihJU291cmNlVmlld2VyIHZpZXdlcikgew0KLQkJZmluYWwgSURvY3VtZW50IGRvYyA9IHZpZXdlci5nZXREb2N1bWVudCgpOw0KLQkJZmluYWwgUG9pbnQgc2VsZWN0aW9uID0gdmlld2VyLmdldFNlbGVjdGVkUmFuZ2UoKTsNCi0JCWZpbmFsIGludCBvZmZzZXQgPSBzZWxlY3Rpb24ueDsNCi0NCi0JCWlmIChkb2MgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7DQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIHJlZ2lvbnMgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvYykuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhvZmZzZXQsIDApOw0KLQkJCWlmIChyZWdpb25zICE9IG51bGwgJiYgcmVnaW9ucy5sZW5ndGggPiAwKSB7DQotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnNbMF0uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsNCi0JCQkJcmV0dXJuIHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQYWlyKGNoYXIgYykgew0KLQkJc3dpdGNoIChjKSB7DQotCQkJY2FzZSAnIic6DQotCQkJY2FzZSAnXCcnOg0KLQkJCWNhc2UgJ1snOg0KLQkJCWNhc2UgJygnOg0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQlkZWZhdWx0Og0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCX0NCi0NCi0JcHJvdGVjdGVkIGNoYXIgZ2V0UGFpcihjaGFyIGMpIHsNCi0JCXN3aXRjaCAoYykgew0KLQkJCWNhc2UgJ1wnJzoNCi0JCQljYXNlICciJzoNCi0JCQkJcmV0dXJuIGM7DQotCQkJY2FzZSAnKCc6DQotCQkJCXJldHVybiAnKSc7DQotCQkJY2FzZSAnWyc6DQotCQkJCXJldHVybiAnXSc7DQotCQkJZGVmYXVsdDoNCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7DQotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gSFRNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQotCQlmQ2xvc2VTdHJpbmdzID0gc3RvcmUuZ2V0Qm9vbGVhbihIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NMT1NFX1NUUklOR1MpOw0KLQkJZkNsb3NlQnJhY2tldHMgPSBzdG9yZS5nZXRCb29sZWFuKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ0xPU0VfQlJBQ0tFVFMpOw0KLQkJc3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KLQkJSFRNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7DQotCQlpZiAoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DTE9TRV9CUkFDS0VUUy5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoKSkpDQotCQkJZkNsb3NlQnJhY2tldHMgPSAoKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpOw0KLQkJZWxzZSBpZiAoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DTE9TRV9TVFJJTkdTLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKSkNCi0JCQlmQ2xvc2VTdHJpbmdzID0gKChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0hUTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0hUTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNzVjZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9IVE1MRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRleHQuRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgZXh0ZW5kcyBEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgY2hhcltdIEJSQUNLRVRTID0geyd7JywgJ30nLCAnKCcsICcpJywgJ1snLCAnXScsJyInLCciJywnXCcnLCdcJyd9OwotCS8qKgotCSAqIEBwYXJhbSB2YWxpZENvbnRleHRzCi0JICogQHBhcmFtIG5leHRNYXRjaGVyCi0JICovCi0JcHVibGljIEhUTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyKCkgewotCQlzdXBlcihuZXcgU3RyaW5nW117RE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUsIERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCwgRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCwgRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTiwgRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVH0sIG5ldyBKYXZhUGFpck1hdGNoZXIoQlJBQ0tFVFMpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0lKYXZhUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9JSmF2YVBhcnRpdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkODU2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0lKYXZhUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRleHQ7Ci0KLS8vIHRha2VuIGZyb20gcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQudWkudGV4dDsKLQotLyoqCi0gKiBEZWZpbml0aW9uIG9mIEphdmEgcGFydGl0aW9uaW5nIGFuZCBpdHMgcGFydGl0aW9ucy4KLSAqIAotICogQHNlZSBFY2xpcHNlIDMuMQotICovCi1pbnRlcmZhY2UgSUphdmFQYXJ0aXRpb25zIHsKLQotCS8qKgotCSAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBKYXZhIHBhcnRpdGlvbmluZy4KLQkgKi8KLQlTdHJpbmcgSkFWQV9QQVJUSVRJT05JTkcgPSAiX19famF2YV9wYXJ0aXRpb25pbmciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgc2luZ2xlLWxpbmUgKEpMUzI6IEVuZE9mTGluZUNvbW1lbnQpIGVuZCBjb21tZW50Ci0JICogcGFydGl0aW9uIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlTdHJpbmcgSkFWQV9TSU5HTEVfTElORV9DT01NRU5UID0gIl9famF2YV9zaW5nbGVsaW5lX2NvbW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBtdWx0aS1saW5lIChKTFMyOiBUcmFkaXRpb25hbENvbW1lbnQpIGNvbW1lbnQgcGFydGl0aW9uCi0JICogY29udGVudCB0eXBlLgotCSAqLwotCVN0cmluZyBKQVZBX01VTFRJX0xJTkVfQ09NTUVOVCA9ICJfX2phdmFfbXVsdGlsaW5lX2NvbW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgSmF2YWRvYyAoSkxTMjogRG9jdW1lbnRhdGlvbkNvbW1lbnQpIHBhcnRpdGlvbgotCSAqIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlTdHJpbmcgSkFWQV9ET0MgPSAiX19qYXZhX2phdmFkb2MiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgSmF2YSBzdHJpbmcgcGFydGl0aW9uIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlTdHJpbmcgSkFWQV9TVFJJTkcgPSAiX19qYXZhX3N0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBKYXZhIGNoYXJhY3RlciBwYXJ0aXRpb24gY29udGVudCB0eXBlLgotCSAqLwotCVN0cmluZyBKQVZBX0NIQVJBQ1RFUiA9ICJfX2phdmFfY2hhcmFjdGVyIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhQ29kZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhQ29kZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2NhY2UzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvSmF2YUNvZGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRleHQ7Ci0KLS8vIHRha2VuIGZyb20gcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQudWkudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmRlcml2ZWQuU2luZ2xlQ2hhclJlYWRlcjsKLQotLyoqCi0gKiBSZWFkcyBmcm9tIGEgZG9jdW1lbnQgZWl0aGVyIGZvcndhcmRzIG9yIGJhY2t3YXJkcy4gTWF5IGJlIGNvbmZpZ3VyZWQgdG8KLSAqIHNraXAgY29tbWVudHMgYW5kIHN0cmluZ3MuCi0gKi8KLWNsYXNzIEphdmFDb2RlUmVhZGVyIGV4dGVuZHMgU2luZ2xlQ2hhclJlYWRlciB7Ci0KLQkvKiogVGhlIEVPRiBjaGFyYWN0ZXIgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT0YgPSAtMTsKLQotCXByaXZhdGUgYm9vbGVhbiBmU2tpcENvbW1lbnRzID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZTa2lwU3RyaW5ncyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmRm9yd2FyZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgaW50IGZPZmZzZXQ7Ci0KLQlwcml2YXRlIGludCBmRW5kID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZkNhY2hlZExpbmVOdW1iZXIgPSAtMTsKLQlwcml2YXRlIGludCBmQ2FjaGVkTGluZU9mZnNldCA9IC0xOwotCi0KLQlwdWJsaWMgSmF2YUNvZGVSZWFkZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBsYXN0IHJlYWQgY2hhcmFjdGVyLiBTaG91bGQgb25seSBiZSBjYWxsZWQKLQkgKiBhZnRlciByZWFkIGhhcyBiZWVuIGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZGb3J3YXJkID8gZk9mZnNldCAtIDEgOiBmT2Zmc2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUZvcndhcmRSZWFkZXIoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBib29sZWFuIHNraXBDb21tZW50cywgYm9vbGVhbiBza2lwU3RyaW5ncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCWZTa2lwQ29tbWVudHMgPSBza2lwQ29tbWVudHM7Ci0JCWZTa2lwU3RyaW5ncyA9IHNraXBTdHJpbmdzOwotCi0JCWZGb3J3YXJkID0gdHJ1ZTsKLQkJZkVuZCA9IE1hdGgubWluKGZEb2N1bWVudC5nZXRMZW5ndGgoKSwgZk9mZnNldCArIGxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29uZmlndXJlQmFja3dhcmRSZWFkZXIoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBib29sZWFuIHNraXBDb21tZW50cywgYm9vbGVhbiBza2lwU3RyaW5ncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCWZTa2lwQ29tbWVudHMgPSBza2lwQ29tbWVudHM7Ci0JCWZTa2lwU3RyaW5ncyA9IHNraXBTdHJpbmdzOwotCi0JCWZGb3J3YXJkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlmQ2FjaGVkTGluZU51bWJlciA9IGZEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZk9mZnNldCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbih4LmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVhZGVyI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFNpbmdsZUNoYXJSZWFkZXIjcmVhZCgpCi0JICovCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmRm9yd2FyZCA/IHJlYWRGb3J3YXJkcygpIDogcmVhZEJhY2t3YXJkcygpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oeC5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdvdG9Db21tZW50RW5kKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKGZPZmZzZXQgPCBmRW5kKSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KyspOwotCQkJaWYgKGN1cnJlbnQgPT0gJyonKSB7Ci0JCQkJaWYgKGZPZmZzZXQgPCBmRW5kICYmIGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpID09ICcvJykgewotCQkJCQkrK2ZPZmZzZXQ7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ290b1N0cmluZ0VuZChjaGFyIGRlbGltaXRlcikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKGZPZmZzZXQgPCBmRW5kKSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KyspOwotCQkJaWYgKGN1cnJlbnQgPT0gJ1xcJykgewotCQkJCS8vIGlnbm9yZSBlc2NhcGVkIGNoYXJhY3RlcnMKLQkJCQkrK2ZPZmZzZXQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChjdXJyZW50ID09IGRlbGltaXRlcikgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnb3RvTGluZUVuZCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWludCBsaW5lID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJZk9mZnNldCA9IGZEb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUgKyAxKTsKLQl9Ci0KLQlwcml2YXRlIGludCByZWFkRm9yd2FyZHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoZk9mZnNldCA8IGZFbmQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQrKyk7Ci0KLQkJCXN3aXRjaCAoY3VycmVudCkgewotCQkJCWNhc2UgJy8nIDoKLQotCQkJCQlpZiAoZlNraXBDb21tZW50cyAmJiBmT2Zmc2V0IDwgZkVuZCkgewotCQkJCQkJY2hhciBuZXh0ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCk7Ci0JCQkJCQlpZiAobmV4dCA9PSAnKicpIHsKLQkJCQkJCQkvLyBhIGNvbW1lbnQgc3RhcnRzLCBhZHZhbmNlIHRvIHRoZSBjb21tZW50IGVuZAotCQkJCQkJCSsrZk9mZnNldDsKLQkJCQkJCQlnb3RvQ29tbWVudEVuZCgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAobmV4dCA9PSAnLycpIHsKLQkJCQkJCQkvLyAnLy8nLWNvbW1lbnQgc3RhcnRzLCBhZHZhbmNlIHRvIHRoZSBsaW5lIGVuZAotCQkJCQkJCWdvdG9MaW5lRW5kKCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gY3VycmVudDsKLQotCQkJCWNhc2UgJyInIDoKLQkJCQljYXNlICdcJycgOgotCi0JCQkJCWlmIChmU2tpcFN0cmluZ3MpIHsKLQkJCQkJCWdvdG9TdHJpbmdFbmQoY3VycmVudCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCXJldHVybiBjdXJyZW50OwotCQkJfQotCi0JCQlyZXR1cm4gY3VycmVudDsKLQkJfQotCi0JCXJldHVybiBFT0Y7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNpbmdsZUxpbmVDb21tZW50KCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJaW50IGxpbmUgPSBmRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGZPZmZzZXQpOwotCQlpZiAobGluZSA8IGZDYWNoZWRMaW5lTnVtYmVyKSB7Ci0JCQlmQ2FjaGVkTGluZU51bWJlciA9IGxpbmU7Ci0JCQlmQ2FjaGVkTGluZU9mZnNldCA9IGZEb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUpOwotCQkJaW50IG9mZnNldCA9IGZPZmZzZXQ7Ci0JCQl3aGlsZSAoZkNhY2hlZExpbmVPZmZzZXQgPCBvZmZzZXQpIHsKLQkJCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQtLSk7Ci0JCQkJaWYgKGN1cnJlbnQgPT0gJy8nICYmIGZDYWNoZWRMaW5lT2Zmc2V0IDw9IG9mZnNldCAmJiBmRG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQpID09ICcvJykgewotCQkJCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdvdG9Db21tZW50U3RhcnQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoMCA8IGZPZmZzZXQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQtLSk7Ci0JCQlpZiAoY3VycmVudCA9PSAnKicgJiYgMCA8PSBmT2Zmc2V0ICYmIGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpID09ICcvJykKLQkJCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ290b1N0cmluZ1N0YXJ0KGNoYXIgZGVsaW1pdGVyKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoMCA8IGZPZmZzZXQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJaWYgKGN1cnJlbnQgPT0gZGVsaW1pdGVyKSB7Ci0JCQkJaWYgKCEoMCA8PSBmT2Zmc2V0ICYmIGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQgLSAxKSA9PSAnXFwnKSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJLS1mT2Zmc2V0OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgcmVhZEJhY2t3YXJkcygpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0KLQkJd2hpbGUgKDAgPCBmT2Zmc2V0KSB7Ci0JCQktLWZPZmZzZXQ7Ci0KLQkJCWhhbmRsZVNpbmdsZUxpbmVDb21tZW50KCk7Ci0KLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJc3dpdGNoIChjdXJyZW50KSB7Ci0JCQkJY2FzZSAnLycgOgotCi0JCQkJCWlmIChmU2tpcENvbW1lbnRzICYmIGZPZmZzZXQgPiAxKSB7Ci0JCQkJCQljaGFyIG5leHQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0IC0gMSk7Ci0JCQkJCQlpZiAobmV4dCA9PSAnKicpIHsKLQkJCQkJCQkvLyBhIGNvbW1lbnQgZW5kcywgYWR2YW5jZSB0byB0aGUgY29tbWVudCBzdGFydAotCQkJCQkJCWZPZmZzZXQgLT0gMjsKLQkJCQkJCQlnb3RvQ29tbWVudFN0YXJ0KCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gY3VycmVudDsKLQotCQkJCWNhc2UgJyInIDoKLQkJCQljYXNlICdcJycgOgotCi0JCQkJCWlmIChmU2tpcFN0cmluZ3MpIHsKLQkJCQkJCS0tZk9mZnNldDsKLQkJCQkJCWdvdG9TdHJpbmdTdGFydChjdXJyZW50KTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCQl9Ci0KLQkJCXJldHVybiBjdXJyZW50OwotCQl9Ci0KLQkJcmV0dXJuIEVPRjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0phdmFIZXVyaXN0aWNTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0phdmFIZXVyaXN0aWNTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNjAyYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhSGV1cmlzdGljU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZXh0OwotCi0vLyB0YWtlbiBmcm9tIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVHlwZWRSZWdpb247Ci0KLS8qKgotICogVXRpbGl0eSBtZXRob2RzIGZvciBoZXVyaXN0aWMgYmFzZWQgSmF2YSBtYW5pcHVsYXRpb25zIGluIGFuIGluY29tcGxldGUKLSAqIEphdmEgc291cmNlIGZpbGUuCi0gKiAKLSAqIDxwPgotICogQW4gaW5zdGFuY2UgaG9sZHMgc29tZSBpbnRlcm5hbCBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQgYW5kIGlzIHRoZXJlZm9yZQotICogbm90IHRocmVhZHNhZmUuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgRWNsaXBzZSAzLjAKLSAqLwotZmluYWwgY2xhc3MgSmF2YUhldXJpc3RpY1NjYW5uZXIgaW1wbGVtZW50cyBTeW1ib2xzIHsKLQkvKioKLQkgKiBSZXR1cm5lZCBieSBhbGwgbWV0aG9kcyB3aGVuIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gY291bGQgbm90IGJlIGZvdW5kLAotCSAqIG9yIGlmIGEge0BsaW5rIEJhZExvY2F0aW9uRXhjZXB0aW9ufSB3YXMgdGhyb3duIHdoaWxlIHNjYW5uaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9GT1VORCA9IC0xOwotCi0JLyoqCi0JICogU3BlY2lhbCBib3VuZCBwYXJhbWV0ZXIgdGhhdCBtZWFucyBlaXRoZXIgLTEgKGJhY2t3YXJkIHNjYW5uaW5nKSBvcgotCSAqIDxjb2RlPmZEb2N1bWVudC5nZXRMZW5ndGgoKTwvY29kZT4gKGZvcndhcmQgc2Nhbm5pbmcpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQk9VTkQgPSAtMjsKLQotCi0JLyogY2hhcmFjdGVyIGNvbnN0YW50cyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgTEJSQUNFID0gJ3snOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUkJSQUNFID0gJ30nOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgTFBBUkVOID0gJygnOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUlBBUkVOID0gJyknOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0VNSUNPTE9OID0gJzsnOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQ09MT04gPSAnOic7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBDT01NQSA9ICcsJzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIExCUkFDS0VUID0gJ1snOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUkJSQUNLRVQgPSAnXSc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBRVUVTVElPTk1BUksgPSAnPyc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBFUVVBTCA9ICc9JzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIExBTkdMRSA9ICc8JzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFJBTkdMRSA9ICc+JzsKLQotCS8qKgotCSAqIFNwZWNpZmllcyB0aGUgc3RvcCBjb25kaXRpb24sIHVwb24gd2hpY2ggdGhlIDxjb2RlPnNjYW5YWFg8L2NvZGU+Ci0JICogbWV0aG9kcyB3aWxsIGRlY2lkZSB3aGV0aGVyIHRvIGtlZXAgc2Nhbm5pbmcgb3Igbm90LiBUaGlzIGludGVyZmFjZSBtYXkKLQkgKiBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIFN0b3BDb25kaXRpb24gewotCQkvKioKLQkJICogSW5zdHJ1Y3RzIHRoZSBzY2FubmVyIHRvIHJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbi4KLQkJICogCi0JCSAqIEBwYXJhbSBjaAotCQkgKiAgICAgICAgICAgIHRoZSBjaGFyIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uCi0JCSAqIEBwYXJhbSBwb3NpdGlvbgotCQkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHBvc2l0aW9uCi0JCSAqIEBwYXJhbSBmb3J3YXJkCi0JCSAqICAgICAgICAgICAgdGhlIGl0ZXJhdGlvbiBkaXJlY3Rpb24KLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3RvcCBjb25kaXRpb24gaXMgbWV0LgotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3RvcChjaGFyIGNoLCBpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCk7Ci0KLQkJLyoqCi0JCSAqIEFza3MgdGhlIGNvbmRpdGlvbiB0byByZXR1cm4gdGhlIG5leHQgcG9zaXRpb24gdG8gcXVlcnkuIFRoZQotCQkgKiBkZWZhdWx0IGlzIHRvIHJldHVybiB0aGUgbmV4dC9wcmV2aW91cyBwb3NpdGlvbi4KLQkJICogCi0JCSAqIEByZXR1cm4gdGhlIG5leHQgcG9zaXRpb24gdG8gc2NhbgotCQkgKi8KLQkJcHVibGljIGludCBuZXh0UG9zaXRpb24oaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCXJldHVybiBmb3J3YXJkID8gcG9zaXRpb24gKyAxIDogcG9zaXRpb24gLSAxOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcHMgdXBvbiBhIG5vbi13aGl0ZXNwYWNlIChhcyBkZWZpbmVkIGJ5Ci0JICoge0BsaW5rIENoYXJhY3RlciNpc1doaXRlc3BhY2UoY2hhcil9KSBjaGFyYWN0ZXIuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9uV2hpdGVzcGFjZSBleHRlbmRzIFN0b3BDb25kaXRpb24gewotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkphdmFIZXVyaXN0aWNTY2FubmVyLlN0b3BDb25kaXRpb24jc3RvcChjaGFyKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gc3RvcChjaGFyIGNoLCBpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCkgewotCQkJcmV0dXJuICFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHVwb24gYSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uLgotCSAqIAotCSAqIEBzZWUgTm9uV2hpdGVzcGFjZQotCSAqLwotCXByaXZhdGUgZmluYWwgY2xhc3MgTm9uV2hpdGVzcGFjZURlZmF1bHRQYXJ0aXRpb24gZXh0ZW5kcyBOb25XaGl0ZXNwYWNlIHsKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhSGV1cmlzdGljU2Nhbm5lci5TdG9wQ29uZGl0aW9uI3N0b3AoY2hhcikKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHN0b3AoY2hhciBjaCwgaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCXJldHVybiBzdXBlci5zdG9wKGNoLCBwb3NpdGlvbiwgdHJ1ZSkgJiYgaXNEZWZhdWx0UGFydGl0aW9uKHBvc2l0aW9uKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSmF2YUhldXJpc3RpY1NjYW5uZXIuU3RvcENvbmRpdGlvbiNuZXh0UG9zaXRpb24oaW50LAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgaW50IG5leHRQb3NpdGlvbihpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCkgewotCQkJSVR5cGVkUmVnaW9uIHBhcnRpdGlvbiA9IGdldFBhcnRpdGlvbihwb3NpdGlvbik7Ci0JCQlpZiAoZlBhcnRpdGlvbi5lcXVhbHMocGFydGl0aW9uLmdldFR5cGUoKSkpCi0JCQkJcmV0dXJuIHN1cGVyLm5leHRQb3NpdGlvbihwb3NpdGlvbiwgZm9yd2FyZCk7Ci0KLQkJCWlmIChmb3J3YXJkKSB7Ci0JCQkJaW50IGVuZCA9IHBhcnRpdGlvbi5nZXRPZmZzZXQoKSArIHBhcnRpdGlvbi5nZXRMZW5ndGgoKTsKLQkJCQlpZiAocG9zaXRpb24gPCBlbmQpCi0JCQkJCXJldHVybiBlbmQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnQgb2Zmc2V0ID0gcGFydGl0aW9uLmdldE9mZnNldCgpOwotCQkJCWlmIChwb3NpdGlvbiA+IG9mZnNldCkKLQkJCQkJcmV0dXJuIG9mZnNldCAtIDE7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIubmV4dFBvc2l0aW9uKHBvc2l0aW9uLCBmb3J3YXJkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHVwb24gYSBub24tamF2YSBpZGVudGlmaWVyIChhcyBkZWZpbmVkIGJ5Ci0JICoge0BsaW5rIENoYXJhY3RlciNpc0phdmFJZGVudGlmaWVyUGFydChjaGFyKX0pIGNoYXJhY3Rlci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb25KYXZhSWRlbnRpZmllclBhcnQgZXh0ZW5kcyBTdG9wQ29uZGl0aW9uIHsKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhSGV1cmlzdGljU2Nhbm5lci5TdG9wQ29uZGl0aW9uI3N0b3AoY2hhcikKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHN0b3AoY2hhciBjaCwgaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCXJldHVybiAhQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGNoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHVwb24gYSBub24tamF2YSBpZGVudGlmaWVyIGNoYXJhY3RlciBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uCi0JICogCi0JICogQHNlZSBOb25KYXZhSWRlbnRpZmllclBhcnQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIE5vbkphdmFJZGVudGlmaWVyUGFydERlZmF1bHRQYXJ0aXRpb24gZXh0ZW5kcyBOb25KYXZhSWRlbnRpZmllclBhcnQgewotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkphdmFIZXVyaXN0aWNTY2FubmVyLlN0b3BDb25kaXRpb24jc3RvcChjaGFyKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gc3RvcChjaGFyIGNoLCBpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCkgewotCQkJcmV0dXJuIHN1cGVyLnN0b3AoY2gsIHBvc2l0aW9uLCB0cnVlKSB8fCAhaXNEZWZhdWx0UGFydGl0aW9uKHBvc2l0aW9uKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSmF2YUhldXJpc3RpY1NjYW5uZXIuU3RvcENvbmRpdGlvbiNuZXh0UG9zaXRpb24oaW50LAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgaW50IG5leHRQb3NpdGlvbihpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCkgewotCQkJSVR5cGVkUmVnaW9uIHBhcnRpdGlvbiA9IGdldFBhcnRpdGlvbihwb3NpdGlvbik7Ci0JCQlpZiAoZlBhcnRpdGlvbi5lcXVhbHMocGFydGl0aW9uLmdldFR5cGUoKSkpCi0JCQkJcmV0dXJuIHN1cGVyLm5leHRQb3NpdGlvbihwb3NpdGlvbiwgZm9yd2FyZCk7Ci0KLQkJCWlmIChmb3J3YXJkKSB7Ci0JCQkJaW50IGVuZCA9IHBhcnRpdGlvbi5nZXRPZmZzZXQoKSArIHBhcnRpdGlvbi5nZXRMZW5ndGgoKTsKLQkJCQlpZiAocG9zaXRpb24gPCBlbmQpCi0JCQkJCXJldHVybiBlbmQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnQgb2Zmc2V0ID0gcGFydGl0aW9uLmdldE9mZnNldCgpOwotCQkJCWlmIChwb3NpdGlvbiA+IG9mZnNldCkKLQkJCQkJcmV0dXJuIG9mZnNldCAtIDE7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIubmV4dFBvc2l0aW9uKHBvc2l0aW9uLCBmb3J3YXJkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHVwb24gYSBjaGFyYWN0ZXIgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4KLQkgKiBjaGFyYWN0ZXIgbGlzdC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIENoYXJhY3Rlck1hdGNoIGV4dGVuZHMgU3RvcENvbmRpdGlvbiB7Ci0JCXByaXZhdGUgZmluYWwgY2hhcltdIGZDaGFyczsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkJICogCi0JCSAqIEBwYXJhbSBjaAotCQkgKiAgICAgICAgICAgIHRoZSBzaW5nbGUgY2hhcmFjdGVyIHRvIG1hdGNoCi0JCSAqLwotCQlwdWJsaWMgQ2hhcmFjdGVyTWF0Y2goY2hhciBjaCkgewotCQkJdGhpcyhuZXcgY2hhcltde2NofSk7Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkJICogCi0JCSAqIEBwYXJhbSBjaGFycwotCQkgKiAgICAgICAgICAgIHRoZSBjaGFycyB0byBtYXRjaC4KLQkJICovCi0JCXB1YmxpYyBDaGFyYWN0ZXJNYXRjaChjaGFyW10gY2hhcnMpIHsKLQkJCUFzc2VydC5pc05vdE51bGwoY2hhcnMpOwotCQkJQXNzZXJ0LmlzVHJ1ZShjaGFycy5sZW5ndGggPiAwKTsKLQkJCWZDaGFycyA9IGNoYXJzOwotCQkJQXJyYXlzLnNvcnQoY2hhcnMpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhSGV1cmlzdGljU2Nhbm5lci5TdG9wQ29uZGl0aW9uI3N0b3AoY2hhciwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzdG9wKGNoYXIgY2gsIGludCBwb3NpdGlvbiwgYm9vbGVhbiBmb3J3YXJkKSB7Ci0JCQlyZXR1cm4gQXJyYXlzLmJpbmFyeVNlYXJjaChmQ2hhcnMsIGNoKSA+PSAwICYmIGlzRGVmYXVsdFBhcnRpdGlvbihwb3NpdGlvbik7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkphdmFIZXVyaXN0aWNTY2FubmVyLlN0b3BDb25kaXRpb24jbmV4dFBvc2l0aW9uKGludCwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIGludCBuZXh0UG9zaXRpb24oaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCUlUeXBlZFJlZ2lvbiBwYXJ0aXRpb24gPSBnZXRQYXJ0aXRpb24ocG9zaXRpb24pOwotCQkJaWYgKGZQYXJ0aXRpb24uZXF1YWxzKHBhcnRpdGlvbi5nZXRUeXBlKCkpKQotCQkJCXJldHVybiBzdXBlci5uZXh0UG9zaXRpb24ocG9zaXRpb24sIGZvcndhcmQpOwotCi0JCQlpZiAoZm9yd2FyZCkgewotCQkJCWludCBlbmQgPSBwYXJ0aXRpb24uZ2V0T2Zmc2V0KCkgKyBwYXJ0aXRpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJaWYgKHBvc2l0aW9uIDwgZW5kKQotCQkJCQlyZXR1cm4gZW5kOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IG9mZnNldCA9IHBhcnRpdGlvbi5nZXRPZmZzZXQoKTsKLQkJCQlpZiAocG9zaXRpb24gPiBvZmZzZXQpCi0JCQkJCXJldHVybiBvZmZzZXQgLSAxOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLm5leHRQb3NpdGlvbihwb3NpdGlvbiwgZm9yd2FyZCk7Ci0JCX0KLQl9Ci0KLQkvKiogVGhlIGRvY3VtZW50IGJlaW5nIHNjYW5uZWQuICovCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCS8qKiBUaGUgcGFydGl0aW9uaW5nIGJlaW5nIHVzZWQgZm9yIHNjYW5uaW5nLiAqLwotCXByaXZhdGUgU3RyaW5nIGZQYXJ0aXRpb25pbmc7Ci0JLyoqIFRoZSBwYXJ0aXRpb24gdG8gc2NhbiBpbi4gKi8KLQlwcml2YXRlIFN0cmluZyBmUGFydGl0aW9uOwotCi0JLyogaW50ZXJuYWwgc2NhbiBzdGF0ZSAqLwotCi0JLyoqIHRoZSBtb3N0IHJlY2VudGx5IHJlYWQgY2hhcmFjdGVyLiAqLwotCXByaXZhdGUgY2hhciBmQ2hhcjsKLQkvKiogdGhlIG1vc3QgcmVjZW50bHkgcmVhZCBwb3NpdGlvbi4gKi8KLQlwcml2YXRlIGludCBmUG9zOwotCi0JLyogcHJlc2V0IHN0b3AgY29uZGl0aW9ucyAqLwotCXByaXZhdGUgZmluYWwgU3RvcENvbmRpdGlvbiBmTm9uV1NEZWZhdWx0UGFydCA9IG5ldyBOb25XaGl0ZXNwYWNlRGVmYXVsdFBhcnRpdGlvbigpOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0b3BDb25kaXRpb24gZk5vbldTID0gbmV3IE5vbldoaXRlc3BhY2UoKTsKLQlwcml2YXRlIGZpbmFsIFN0b3BDb25kaXRpb24gZk5vbklkZW50ID0gbmV3IE5vbkphdmFJZGVudGlmaWVyUGFydERlZmF1bHRQYXJ0aXRpb24oKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdG8gc2NhbgotCSAqIEBwYXJhbSBwYXJ0aXRpb25pbmcKLQkgKiAgICAgICAgICAgIHRoZSBwYXJ0aXRpb25pbmcgdG8gdXNlIGZvciBzY2FubmluZwotCSAqIEBwYXJhbSBwYXJ0aXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBwYXJ0aXRpb24gdG8gc2NhbiBpbgotCSAqLwotCXB1YmxpYyBKYXZhSGV1cmlzdGljU2Nhbm5lcihJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwYXJ0aXRpb25pbmcsIFN0cmluZyBwYXJ0aXRpb24pIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChkb2N1bWVudCk7Ci0JCUFzc2VydC5pc05vdE51bGwocGFydGl0aW9uaW5nKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChwYXJ0aXRpb24pOwotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZlBhcnRpdGlvbmluZyA9IHBhcnRpdGlvbmluZzsKLQkJZlBhcnRpdGlvbiA9IHBhcnRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscwotCSAqIDxjb2RlPnRoaXMoZG9jdW1lbnQsIElKYXZhUGFydGl0aW9ucy5KQVZBX1BBUlRJVElPTklORywgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFKTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdG8gc2Nhbi4KLQkgKi8KLQlwdWJsaWMgSmF2YUhldXJpc3RpY1NjYW5uZXIoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMoZG9jdW1lbnQsIElKYXZhUGFydGl0aW9ucy5KQVZBX1BBUlRJVElPTklORywgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBpbnRlcm5hbCBzY2FuIHBvc2l0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vc3QgcmVjZW50IGludGVybmFsIHNjYW4gcG9zaXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZQb3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmV4dCB0b2tlbiBpbiBmb3J3YXJkIGRpcmVjdGlvbiwgc3RhcnRpbmcgYXQKLQkgKiA8Y29kZT5zdGFydDwvY29kZT4sIGFuZCBub3QgZXh0ZW5kaW5nIGZ1cnRoZXIgdGhhbgotCSAqIDxjb2RlPmJvdW5kPC9jb2RlPi4gVGhlIHJldHVybiB2YWx1ZSBpcyBvbmUgb2YgdGhlIGNvbnN0YW50cyBkZWZpbmVkCi0JICogaW4ge0BsaW5rIFN5bWJvbHN9LiBBZnRlciBhIGNhbGwsIHtAbGluayAjZ2V0UG9zaXRpb24oKX0gd2lsbCByZXR1cm4KLQkgKiB0aGUgcG9zaXRpb24ganVzdCBhZnRlciB0aGUgc2Nhbm5lZCB0b2tlbiAoaS5lLiB0aGUgbmV4dCBwb3NpdGlvbiB0aGF0Ci0JICogd2lsbCBiZSBzY2FubmVkKS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50IHRvIGNvbnNpZGVyCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgcG9zaXRpb24gbm90IHRvIGNvbnNpZGVyIGFueSBtb3JlCi0JICogQHJldHVybiBhIGNvbnN0YW50IGZyb20ge0BsaW5rIFN5bWJvbHN9IGRlc2NyaWJpbmcgdGhlIG5leHQgdG9rZW4KLQkgKi8KLQlwdWJsaWMgaW50IG5leHRUb2tlbihpbnQgc3RhcnQsIGludCBib3VuZCkgewotCQlpbnQgcG9zID0gc2NhbkZvcndhcmQoc3RhcnQsIGJvdW5kLCBmTm9uV1NEZWZhdWx0UGFydCk7Ci0JCWlmIChwb3MgPT0gTk9UX0ZPVU5EKQotCQkJcmV0dXJuIFRva2VuRU9GOwotCi0JCWZQb3MrKzsKLQotCQlzd2l0Y2ggKGZDaGFyKSB7Ci0JCQljYXNlIExCUkFDRSA6Ci0JCQkJcmV0dXJuIFRva2VuTEJSQUNFOwotCQkJY2FzZSBSQlJBQ0UgOgotCQkJCXJldHVybiBUb2tlblJCUkFDRTsKLQkJCWNhc2UgTEJSQUNLRVQgOgotCQkJCXJldHVybiBUb2tlbkxCUkFDS0VUOwotCQkJY2FzZSBSQlJBQ0tFVCA6Ci0JCQkJcmV0dXJuIFRva2VuUkJSQUNLRVQ7Ci0JCQljYXNlIExQQVJFTiA6Ci0JCQkJcmV0dXJuIFRva2VuTFBBUkVOOwotCQkJY2FzZSBSUEFSRU4gOgotCQkJCXJldHVybiBUb2tlblJQQVJFTjsKLQkJCWNhc2UgU0VNSUNPTE9OIDoKLQkJCQlyZXR1cm4gVG9rZW5TRU1JQ09MT047Ci0JCQljYXNlIENPTU1BIDoKLQkJCQlyZXR1cm4gVG9rZW5DT01NQTsKLQkJCWNhc2UgUVVFU1RJT05NQVJLIDoKLQkJCQlyZXR1cm4gVG9rZW5RVUVTVElPTk1BUks7Ci0JCQljYXNlIEVRVUFMIDoKLQkJCQlyZXR1cm4gVG9rZW5FUVVBTDsKLQkJCWNhc2UgTEFOR0xFIDoKLQkJCQlyZXR1cm4gVG9rZW5MRVNTVEhBTjsKLQkJCWNhc2UgUkFOR0xFIDoKLQkJCQlyZXR1cm4gVG9rZW5HUkVBVEVSVEhBTjsKLQkJfQotCi0JCS8vIGVsc2UKLQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChmQ2hhcikpIHsKLQkJCS8vIGFzc3VtZSBhbiBpZGVudCBvciBrZXl3b3JkCi0JCQlpbnQgZnJvbSA9IHBvcywgdG87Ci0JCQlwb3MgPSBzY2FuRm9yd2FyZChwb3MgKyAxLCBib3VuZCwgZk5vbklkZW50KTsKLQkJCWlmIChwb3MgPT0gTk9UX0ZPVU5EKQotCQkJCXRvID0gYm91bmQgPT0gVU5CT1VORCA/IGZEb2N1bWVudC5nZXRMZW5ndGgoKSA6IGJvdW5kOwotCQkJZWxzZQotCQkJCXRvID0gcG9zOwotCi0JCQlTdHJpbmcgaWRlbnRPcktleXdvcmQ7Ci0JCQl0cnkgewotCQkJCWlkZW50T3JLZXl3b3JkID0gZkRvY3VtZW50LmdldChmcm9tLCB0byAtIGZyb20pOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gVG9rZW5FT0Y7Ci0JCQl9Ci0KLQkJCXJldHVybiBnZXRUb2tlbihpZGVudE9yS2V5d29yZCk7Ci0KLQotCQl9Ci0JCWVsc2UgewotCQkJLy8gb3BlcmF0b3JzLCBudW1iZXIgbGl0ZXJhbHMgZXRjCi0JCQlyZXR1cm4gVG9rZW5PVEhFUjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5leHQgdG9rZW4gaW4gYmFja3dhcmQgZGlyZWN0aW9uLCBzdGFydGluZyBhdAotCSAqIDxjb2RlPnN0YXJ0PC9jb2RlPiwgYW5kIG5vdCBleHRlbmRpbmcgZnVydGhlciB0aGFuCi0JICogPGNvZGU+Ym91bmQ8L2NvZGU+LiBUaGUgcmV0dXJuIHZhbHVlIGlzIG9uZSBvZiB0aGUgY29uc3RhbnRzIGRlZmluZWQKLQkgKiBpbiB7QGxpbmsgU3ltYm9sc30uIEFmdGVyIGEgY2FsbCwge0BsaW5rICNnZXRQb3NpdGlvbigpfSB3aWxsIHJldHVybgotCSAqIHRoZSBwb3NpdGlvbiBqdXN0IGJlZm9yZSB0aGUgc2Nhbm5lZCB0b2tlbiBzdGFydHMgKGkuZS4gdGhlIG5leHQKLQkgKiBwb3NpdGlvbiB0aGF0IHdpbGwgYmUgc2Nhbm5lZCkuCi0JICogCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudCB0byBjb25zaWRlcgotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIG5vdCB0byBjb25zaWRlciBhbnkgbW9yZQotCSAqIEByZXR1cm4gYSBjb25zdGFudCBmcm9tIHtAbGluayBTeW1ib2xzfSBkZXNjcmliaW5nIHRoZSBwcmV2aW91cyB0b2tlbgotCSAqLwotCXB1YmxpYyBpbnQgcHJldmlvdXNUb2tlbihpbnQgc3RhcnQsIGludCBib3VuZCkgewotCQlpbnQgcG9zID0gc2NhbkJhY2t3YXJkKHN0YXJ0LCBib3VuZCwgZk5vbldTRGVmYXVsdFBhcnQpOwotCQlpZiAocG9zID09IE5PVF9GT1VORCkKLQkJCXJldHVybiBUb2tlbkVPRjsKLQotCQlmUG9zLS07Ci0KLQkJc3dpdGNoIChmQ2hhcikgewotCQkJY2FzZSBMQlJBQ0UgOgotCQkJCXJldHVybiBUb2tlbkxCUkFDRTsKLQkJCWNhc2UgUkJSQUNFIDoKLQkJCQlyZXR1cm4gVG9rZW5SQlJBQ0U7Ci0JCQljYXNlIExCUkFDS0VUIDoKLQkJCQlyZXR1cm4gVG9rZW5MQlJBQ0tFVDsKLQkJCWNhc2UgUkJSQUNLRVQgOgotCQkJCXJldHVybiBUb2tlblJCUkFDS0VUOwotCQkJY2FzZSBMUEFSRU4gOgotCQkJCXJldHVybiBUb2tlbkxQQVJFTjsKLQkJCWNhc2UgUlBBUkVOIDoKLQkJCQlyZXR1cm4gVG9rZW5SUEFSRU47Ci0JCQljYXNlIFNFTUlDT0xPTiA6Ci0JCQkJcmV0dXJuIFRva2VuU0VNSUNPTE9OOwotCQkJY2FzZSBDT0xPTiA6Ci0JCQkJcmV0dXJuIFRva2VuQ09MT047Ci0JCQljYXNlIENPTU1BIDoKLQkJCQlyZXR1cm4gVG9rZW5DT01NQTsKLQkJCWNhc2UgUVVFU1RJT05NQVJLIDoKLQkJCQlyZXR1cm4gVG9rZW5RVUVTVElPTk1BUks7Ci0JCQljYXNlIEVRVUFMIDoKLQkJCQlyZXR1cm4gVG9rZW5FUVVBTDsKLQkJCWNhc2UgTEFOR0xFIDoKLQkJCQlyZXR1cm4gVG9rZW5MRVNTVEhBTjsKLQkJCWNhc2UgUkFOR0xFIDoKLQkJCQlyZXR1cm4gVG9rZW5HUkVBVEVSVEhBTjsKLQkJfQotCi0JCS8vIGVsc2UKLQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChmQ2hhcikpIHsKLQkJCS8vIGFzc3VtZSBhbiBpZGVudCBvciBrZXl3b3JkCi0JCQlpbnQgZnJvbSwgdG8gPSBwb3MgKyAxOwotCQkJcG9zID0gc2NhbkJhY2t3YXJkKHBvcyAtIDEsIGJvdW5kLCBmTm9uSWRlbnQpOwotCQkJaWYgKHBvcyA9PSBOT1RfRk9VTkQpCi0JCQkJZnJvbSA9IGJvdW5kID09IFVOQk9VTkQgPyAwIDogYm91bmQgKyAxOwotCQkJZWxzZQotCQkJCWZyb20gPSBwb3MgKyAxOwotCi0JCQlTdHJpbmcgaWRlbnRPcktleXdvcmQ7Ci0JCQl0cnkgewotCQkJCWlkZW50T3JLZXl3b3JkID0gZkRvY3VtZW50LmdldChmcm9tLCB0byAtIGZyb20pOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gVG9rZW5FT0Y7Ci0JCQl9Ci0KLQkJCXJldHVybiBnZXRUb2tlbihpZGVudE9yS2V5d29yZCk7Ci0KLQotCQl9Ci0JCWVsc2UgewotCQkJLy8gb3BlcmF0b3JzLCBudW1iZXIgbGl0ZXJhbHMgZXRjCi0JCQlyZXR1cm4gVG9rZW5PVEhFUjsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBvbmUgb2YgdGhlIGtleXdvcmQgY29uc3RhbnRzIG9yIDxjb2RlPlRva2VuSURFTlQ8L2NvZGU+IGZvciBhCi0JICogc2Nhbm5lZCBpZGVudGlmaWVyLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBhIHNjYW5uZWQgaWRlbnRpZmllcgotCSAqIEByZXR1cm4gb25lIG9mIHRoZSBjb25zdGFudHMgZGVmaW5lZCBpbiB7QGxpbmsgU3ltYm9sc30KLQkgKi8KLQlwcml2YXRlIGludCBnZXRUb2tlbihTdHJpbmcgcykgewotCQlBc3NlcnQuaXNOb3ROdWxsKHMpOwotCi0JCXN3aXRjaCAocy5sZW5ndGgoKSkgewotCQkJY2FzZSAyIDoKLQkJCQlpZiAoImlmIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuSUY7Ci0JCQkJaWYgKCJkbyIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkRPOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzIDoKLQkJCQlpZiAoImZvciIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkZPUjsKLQkJCQlpZiAoInRyeSIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlblRSWTsKLQkJCQlpZiAoIm5ldyIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbk5FVzsKLQkJCQlicmVhazsKLQkJCWNhc2UgNCA6Ci0JCQkJaWYgKCJjYXNlIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuQ0FTRTsKLQkJCQlpZiAoImVsc2UiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5FTFNFOwotCQkJCWlmICgiZW51bSIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkVOVU07Ci0JCQkJaWYgKCJnb3RvIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuR09UTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgNSA6Ci0JCQkJaWYgKCJicmVhayIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkJSRUFLOwotCQkJCWlmICgiY2F0Y2giLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5DQVRDSDsKLQkJCQlpZiAoImNsYXNzIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuQ0xBU1M7Ci0JCQkJaWYgKCJ3aGlsZSIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbldISUxFOwotCQkJCWJyZWFrOwotCQkJY2FzZSA2IDoKLQkJCQlpZiAoInJldHVybiIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlblJFVFVSTjsKLQkJCQlpZiAoInN0YXRpYyIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlblNUQVRJQzsKLQkJCQlpZiAoInN3aXRjaCIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlblNXSVRDSDsKLQkJCQlicmVhazsKLQkJCWNhc2UgNyA6Ci0JCQkJaWYgKCJkZWZhdWx0Ii5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuREVGQVVMVDsKLQkJCQlpZiAoImZpbmFsbHkiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5GSU5BTExZOwotCQkJCWJyZWFrOwotCQkJY2FzZSA5IDoKLQkJCQlpZiAoImludGVyZmFjZSIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbklOVEVSRkFDRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTIgOgotCQkJCWlmICgic3luY2hyb25pemVkIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuU1lOQ0hST05JWkVEOwotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBUb2tlbklERU5UOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjbG9zaW5nIHBlZXIgY2hhcmFjdGVyIChmb3J3YXJkIHNlYXJjaCkuCi0JICogQW55IHNjb3BlcyBpbnRyb2R1Y2VkIGJ5IG9wZW5pbmcgcGVlcnMgYXJlIHNraXBwZWQuIEFsbCBwZWVycyBhY2NvdW50ZWQKLQkgKiBmb3IgbXVzdCByZXNpZGUgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uLgotCSAqIAotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCA8Y29kZT5zdGFydDwvY29kZT4gbXVzdCBub3QgcG9pbnQgdG8gdGhlIG9wZW5pbmcgcGVlciwgYnV0Ci0JICogdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBiZWluZyBzZWFyY2hlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICB0aGUgc3RhcnQgcG9zaXRpb24KLQkgKiBAcGFyYW0gb3BlbmluZ1BlZXIKLQkgKiAgICAgICAgICAgIHRoZSBvcGVuaW5nIHBlZXIgY2hhcmFjdGVyIChlLmcuICd7JykKLQkgKiBAcGFyYW0gY2xvc2luZ1BlZXIKLQkgKiAgICAgICAgICAgIHRoZSBjbG9zaW5nIHBlZXIgY2hhcmFjdGVyIChlLmcuICd9JykKLQkgKiBAcmV0dXJuIHRoZSBtYXRjaGluZyBwZWVyIGNoYXJhY3RlciBwb3NpdGlvbiwgb3IgPGNvZGU+Tk9UX0ZPVU5EPC9jb2RlPgotCSAqLwotCXB1YmxpYyBpbnQgZmluZENsb3NpbmdQZWVyKGludCBzdGFydCwgZmluYWwgY2hhciBvcGVuaW5nUGVlciwgZmluYWwgY2hhciBjbG9zaW5nUGVlcikgewotCQlBc3NlcnQuaXNOb3ROdWxsKGZEb2N1bWVudCk7Ci0JCUFzc2VydC5pc1RydWUoc3RhcnQgPj0gMCk7Ci0KLQkJdHJ5IHsKLQkJCWludCBkZXB0aCA9IDE7Ci0JCQlzdGFydCAtPSAxOwotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlzdGFydCA9IHNjYW5Gb3J3YXJkKHN0YXJ0ICsgMSwgVU5CT1VORCwgbmV3IENoYXJhY3Rlck1hdGNoKG5ldyBjaGFyW117b3BlbmluZ1BlZXIsIGNsb3NpbmdQZWVyfSkpOwotCQkJCWlmIChzdGFydCA9PSBOT1RfRk9VTkQpCi0JCQkJCXJldHVybiBOT1RfRk9VTkQ7Ci0KLQkJCQlpZiAoZkRvY3VtZW50LmdldENoYXIoc3RhcnQpID09IG9wZW5pbmdQZWVyKQotCQkJCQlkZXB0aCsrOwotCQkJCWVsc2UKLQkJCQkJZGVwdGgtLTsKLQotCQkJCWlmIChkZXB0aCA9PSAwKQotCQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIE5PVF9GT1VORDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBvcGVuaW5nIHBlZXIgY2hhcmFjdGVyIChiYWNrd2FyZCBzZWFyY2gpLgotCSAqIEFueSBzY29wZXMgaW50cm9kdWNlZCBieSBjbG9zaW5nIHBlZXJzIGFyZSBza2lwcGVkLiBBbGwgcGVlcnMgYWNjb3VudGVkCi0JICogZm9yIG11c3QgcmVzaWRlIGluIHRoZSBkZWZhdWx0IHBhcnRpdGlvbi4KLQkgKiAKLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgPGNvZGU+c3RhcnQ8L2NvZGU+IG11c3Qgbm90IHBvaW50IHRvIHRoZSBjbG9zaW5nIHBlZXIsIGJ1dAotCSAqIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYmVpbmcgc2VhcmNoZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzdGFydAotCSAqICAgICAgICAgICAgdGhlIHN0YXJ0IHBvc2l0aW9uCi0JICogQHBhcmFtIG9wZW5pbmdQZWVyCi0JICogICAgICAgICAgICB0aGUgb3BlbmluZyBwZWVyIGNoYXJhY3RlciAoZS5nLiAneycpCi0JICogQHBhcmFtIGNsb3NpbmdQZWVyCi0JICogICAgICAgICAgICB0aGUgY2xvc2luZyBwZWVyIGNoYXJhY3RlciAoZS5nLiAnfScpCi0JICogQHJldHVybiB0aGUgbWF0Y2hpbmcgcGVlciBjaGFyYWN0ZXIgcG9zaXRpb24sIG9yIDxjb2RlPk5PVF9GT1VORDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgaW50IGZpbmRPcGVuaW5nUGVlcihpbnQgc3RhcnQsIGNoYXIgb3BlbmluZ1BlZXIsIGNoYXIgY2xvc2luZ1BlZXIpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShzdGFydCA8IGZEb2N1bWVudC5nZXRMZW5ndGgoKSk7Ci0KLQkJdHJ5IHsKLQkJCWludCBkZXB0aCA9IDE7Ci0JCQlzdGFydCArPSAxOwotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlzdGFydCA9IHNjYW5CYWNrd2FyZChzdGFydCAtIDEsIFVOQk9VTkQsIG5ldyBDaGFyYWN0ZXJNYXRjaChuZXcgY2hhcltde29wZW5pbmdQZWVyLCBjbG9zaW5nUGVlcn0pKTsKLQkJCQlpZiAoc3RhcnQgPT0gTk9UX0ZPVU5EKQotCQkJCQlyZXR1cm4gTk9UX0ZPVU5EOwotCi0JCQkJaWYgKGZEb2N1bWVudC5nZXRDaGFyKHN0YXJ0KSA9PSBjbG9zaW5nUGVlcikKLQkJCQkJZGVwdGgrKzsKLQkJCQllbHNlCi0JCQkJCWRlcHRoLS07Ci0KLQkJCQlpZiAoZGVwdGggPT0gMCkKLQkJCQkJcmV0dXJuIHN0YXJ0OwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBOT1RfRk9VTkQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgc3Vycm91bmRpbmcgYmxvY2sgYXJvdW5kIDxjb2RlPm9mZnNldDwvY29kZT4uIFRoZQotCSAqIHNlYXJjaCBpcyBzdGFydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgPGNvZGU+b2Zmc2V0PC9jb2RlPiwgaS5lLiBhbgotCSAqIG9wZW5pbmcgYnJhY2UgYXQgPGNvZGU+b2Zmc2V0PC9jb2RlPiB3aWxsIG5vdCBiZSBwYXJ0IG9mIHRoZQotCSAqIHN1cnJvdW5kaW5nIGJsb2NrLCBidXQgYSBjbG9zaW5nIGJyYWNlIHdpbGwuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBmb3Igd2hpY2ggdGhlIHN1cnJvdW5kaW5nIGJsb2NrIGlzIGNvbXB1dGVkCi0JICogQHJldHVybiBhIHJlZ2lvbiBkZXNjcmliaW5nIHRoZSBzdXJyb3VuZGluZyBibG9jaywgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgIGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0JICovCi0JcHVibGljIElSZWdpb24gZmluZFN1cnJvdW5kaW5nQmxvY2soaW50IG9mZnNldCkgewotCQlpZiAob2Zmc2V0IDwgMSB8fCBvZmZzZXQgPj0gZkRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IGJlZ2luID0gZmluZE9wZW5pbmdQZWVyKG9mZnNldCAtIDEsIExCUkFDRSwgUkJSQUNFKTsKLQkJaW50IGVuZCA9IGZpbmRDbG9zaW5nUGVlcihvZmZzZXQsIExCUkFDRSwgUkJSQUNFKTsKLQkJaWYgKGJlZ2luID09IE5PVF9GT1VORCB8fCBlbmQgPT0gTk9UX0ZPVU5EKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgUmVnaW9uKGJlZ2luLCBlbmQgKyAxIC0gYmVnaW4pOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBzbWFsbGVzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUKLQkgKiBwb3NpdGlvbiBpcyAmZ3Q7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gYW5kICZsdDsgPGNvZGU+Ym91bmQ8L2NvZGU+Ci0JICogYW5kIDxjb2RlPkNoYXJhY3Rlci5pc1doaXRlc3BhY2UoZkRvY3VtZW50LmdldENoYXIocG9zKSk8L2NvZGU+Ci0JICogZXZhbHVhdGVzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgdGhlIHBvc2l0aW9uIGlzIGluIHRoZSBkZWZhdWx0Ci0JICogcGFydGl0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBiZSBjb25zaWRlcmVkCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBub3QKLQkgKiAgICAgICAgICAgIGNvbnNpZGVyIGFueSBtb3JlLCB3aXRoIDxjb2RlPmJvdW5kPC9jb2RlPiAmZ3Q7Ci0JICogICAgICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT4sIG9yIDxjb2RlPlVOQk9VTkQ8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgc21hbGxlc3QgcG9zaXRpb24gb2YgYSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW4gWzxjb2RlPnBvc2l0aW9uPC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPmJvdW5kPC9jb2RlPikgdGhhdCByZXNpZGVzIGluIGEgSmF2YSBwYXJ0aXRpb24sIG9yCi0JICogICAgICAgICA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0JICovCi0JcHVibGljIGludCBmaW5kTm9uV2hpdGVzcGFjZUZvcndhcmQoaW50IHBvc2l0aW9uLCBpbnQgYm91bmQpIHsKLQkJcmV0dXJuIHNjYW5Gb3J3YXJkKHBvc2l0aW9uLCBib3VuZCwgZk5vbldTRGVmYXVsdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBzbWFsbGVzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUKLQkgKiBwb3NpdGlvbiBpcyAmZ3Q7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gYW5kICZsdDsgPGNvZGU+Ym91bmQ8L2NvZGU+Ci0JICogYW5kIDxjb2RlPkNoYXJhY3Rlci5pc1doaXRlc3BhY2UoZkRvY3VtZW50LmdldENoYXIocG9zKSk8L2NvZGU+Ci0JICogZXZhbHVhdGVzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgYmUgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90Ci0JICogICAgICAgICAgICBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmd0OwotCSAqICAgICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIHNtYWxsZXN0IHBvc2l0aW9uIG9mIGEgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGluIFs8Y29kZT5wb3NpdGlvbjwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5ib3VuZDwvY29kZT4pLCBvciA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuCi0JICogICAgICAgICBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBpbnQgZmluZE5vbldoaXRlc3BhY2VGb3J3YXJkSW5BbnlQYXJ0aXRpb24oaW50IHBvc2l0aW9uLCBpbnQgYm91bmQpIHsKLQkJcmV0dXJuIHNjYW5Gb3J3YXJkKHBvc2l0aW9uLCBib3VuZCwgZk5vbldTKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgaGlnaGVzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUKLQkgKiBwb3NpdGlvbiBpcyAmbHQ7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gYW5kICZndDsgPGNvZGU+Ym91bmQ8L2NvZGU+Ci0JICogYW5kIDxjb2RlPkNoYXJhY3Rlci5pc1doaXRlc3BhY2UoZkRvY3VtZW50LmdldENoYXIocG9zKSk8L2NvZGU+Ci0JICogZXZhbHVhdGVzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgdGhlIHBvc2l0aW9uIGlzIGluIHRoZSBkZWZhdWx0Ci0JICogcGFydGl0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBiZSBjb25zaWRlcmVkCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBub3QKLQkgKiAgICAgICAgICAgIGNvbnNpZGVyIGFueSBtb3JlLCB3aXRoIDxjb2RlPmJvdW5kPC9jb2RlPiAmbHQ7Ci0JICogICAgICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT4sIG9yIDxjb2RlPlVOQk9VTkQ8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgaGlnaGVzdCBwb3NpdGlvbiBvZiBhIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpbiAoPGNvZGU+Ym91bmQ8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+XSB0aGF0IHJlc2lkZXMgaW4gYSBKYXZhIHBhcnRpdGlvbiwgb3IKLQkgKiAgICAgICAgIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgaW50IGZpbmROb25XaGl0ZXNwYWNlQmFja3dhcmQoaW50IHBvc2l0aW9uLCBpbnQgYm91bmQpIHsKLQkJcmV0dXJuIHNjYW5CYWNrd2FyZChwb3NpdGlvbiwgYm91bmQsIGZOb25XU0RlZmF1bHRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgbG93ZXN0IHBvc2l0aW9uIDxjb2RlPnA8L2NvZGU+IGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4KLQkgKiBzdWNoIHRoYXQgPGNvZGU+c3RhcnQ8L2NvZGU+ICZsdDs9IHAgJmx0OyA8Y29kZT5ib3VuZDwvY29kZT4gYW5kCi0JICogPGNvZGU+Y29uZGl0aW9uLnN0b3AoZkRvY3VtZW50LmdldENoYXIocCksIHApPC9jb2RlPiBldmFsdWF0ZXMgdG8KLQkgKiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgYmUgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90Ci0JICogICAgICAgICAgICBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmd0OwotCSAqICAgICAgICAgICAgPGNvZGU+c3RhcnQ8L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPgotCSAqIEBwYXJhbSBjb25kaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5TdG9wQ29uZGl0aW9uPC9jb2RlPiB0byBjaGVjawotCSAqIEByZXR1cm4gdGhlIGxvd2VzdCBwb3NpdGlvbiBpbiBbPGNvZGU+c3RhcnQ8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+Ym91bmQ8L2NvZGU+KSBmb3Igd2hpY2ggPGNvZGU+Y29uZGl0aW9uPC9jb2RlPgotCSAqICAgICAgICAgaG9sZHMsIG9yIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgaW50IHNjYW5Gb3J3YXJkKGludCBzdGFydCwgaW50IGJvdW5kLCBTdG9wQ29uZGl0aW9uIGNvbmRpdGlvbikgewotCQlBc3NlcnQuaXNUcnVlKHN0YXJ0ID49IDApOwotCi0JCWlmIChib3VuZCA9PSBVTkJPVU5EKQotCQkJYm91bmQgPSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0KLQkJQXNzZXJ0LmlzVHJ1ZShib3VuZCA8PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOwotCi0JCXRyeSB7Ci0JCQlmUG9zID0gc3RhcnQ7Ci0JCQl3aGlsZSAoZlBvcyA8IGJvdW5kKSB7Ci0KLQkJCQlmQ2hhciA9IGZEb2N1bWVudC5nZXRDaGFyKGZQb3MpOwotCQkJCWlmIChjb25kaXRpb24uc3RvcChmQ2hhciwgZlBvcywgdHJ1ZSkpCi0JCQkJCXJldHVybiBmUG9zOwotCi0JCQkJZlBvcyA9IGNvbmRpdGlvbi5uZXh0UG9zaXRpb24oZlBvcywgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gTk9UX0ZPVU5EOwotCX0KLQotCi0JLyoqCi0JICogRmluZHMgdGhlIGxvd2VzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUKLQkgKiBwb3NpdGlvbiBpcyAmZ3Q7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gYW5kICZsdDsgPGNvZGU+Ym91bmQ8L2NvZGU+Ci0JICogYW5kIDxjb2RlPmZEb2N1bWVudC5nZXRDaGFyKHBvc2l0aW9uKSA9PSBjaDwvY29kZT4gZXZhbHVhdGVzIHRvCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gYW5kIHRoZSBwb3NpdGlvbiBpcyBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGJlIGNvbnNpZGVyZWQKLQkgKiBAcGFyYW0gYm91bmQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIG5vdAotCSAqICAgICAgICAgICAgY29uc2lkZXIgYW55IG1vcmUsIHdpdGggPGNvZGU+Ym91bmQ8L2NvZGU+ICZndDsKLQkgKiAgICAgICAgICAgIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiwgb3IgPGNvZGU+VU5CT1VORDwvY29kZT4KLQkgKiBAcGFyYW0gY2gKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5jaGFyPC9jb2RlPiB0byBzZWFyY2ggZm9yCi0JICogQHJldHVybiB0aGUgbG93ZXN0IHBvc2l0aW9uIG9mIDxjb2RlPmNoPC9jb2RlPiBpbiAoPGNvZGU+Ym91bmQ8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+XSB0aGF0IHJlc2lkZXMgaW4gYSBKYXZhIHBhcnRpdGlvbiwgb3IKLQkgKiAgICAgICAgIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgaW50IHNjYW5Gb3J3YXJkKGludCBwb3NpdGlvbiwgaW50IGJvdW5kLCBjaGFyIGNoKSB7Ci0JCXJldHVybiBzY2FuRm9yd2FyZChwb3NpdGlvbiwgYm91bmQsIG5ldyBDaGFyYWN0ZXJNYXRjaChjaCkpOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBsb3dlc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiBzdWNoIHRoYXQgdGhlCi0JICogcG9zaXRpb24gaXMgJmd0Oz0gPGNvZGU+cG9zaXRpb248L2NvZGU+IGFuZCAmbHQ7IDxjb2RlPmJvdW5kPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5mRG9jdW1lbnQuZ2V0Q2hhcihwb3NpdGlvbikgPT0gY2g8L2NvZGU+IGV2YWx1YXRlcyB0bwotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGZvciBhdCBsZWFzdCBvbmUgY2ggaW4gPGNvZGU+Y2hhcnM8L2NvZGU+IGFuZCB0aGUKLQkgKiBwb3NpdGlvbiBpcyBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGJlIGNvbnNpZGVyZWQKLQkgKiBAcGFyYW0gYm91bmQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIG5vdAotCSAqICAgICAgICAgICAgY29uc2lkZXIgYW55IG1vcmUsIHdpdGggPGNvZGU+Ym91bmQ8L2NvZGU+ICZndDsKLQkgKiAgICAgICAgICAgIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiwgb3IgPGNvZGU+VU5CT1VORDwvY29kZT4KLQkgKiBAcGFyYW0gY2hhcnMKLQkgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIDxjb2RlPmNoYXI8L2NvZGU+IHRvIHNlYXJjaCBmb3IKLQkgKiBAcmV0dXJuIHRoZSBsb3dlc3QgcG9zaXRpb24gb2YgYSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW4gWzxjb2RlPnBvc2l0aW9uPC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPmJvdW5kPC9jb2RlPikgdGhhdCByZXNpZGVzIGluIGEgSmF2YSBwYXJ0aXRpb24sIG9yCi0JICogICAgICAgICA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0JICovCi0JcHVibGljIGludCBzY2FuRm9yd2FyZChpbnQgcG9zaXRpb24sIGludCBib3VuZCwgY2hhcltdIGNoYXJzKSB7Ci0JCXJldHVybiBzY2FuRm9yd2FyZChwb3NpdGlvbiwgYm91bmQsIG5ldyBDaGFyYWN0ZXJNYXRjaChjaGFycykpOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBoaWdoZXN0IHBvc2l0aW9uIDxjb2RlPnA8L2NvZGU+IGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4KLQkgKiBzdWNoIHRoYXQgPGNvZGU+Ym91bmQ8L2NvZGU+ICZsdDsgPGNvZGU+cDwvY29kZT4gJmx0Oz0KLQkgKiA8Y29kZT5zdGFydDwvY29kZT4gYW5kCi0JICogPGNvZGU+Y29uZGl0aW9uLnN0b3AoZkRvY3VtZW50LmdldENoYXIocCksIHApPC9jb2RlPiBldmFsdWF0ZXMgdG8KLQkgKiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgYmUgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90Ci0JICogICAgICAgICAgICBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmx0OwotCSAqICAgICAgICAgICAgPGNvZGU+c3RhcnQ8L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPgotCSAqIEBwYXJhbSBjb25kaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5TdG9wQ29uZGl0aW9uPC9jb2RlPiB0byBjaGVjawotCSAqIEByZXR1cm4gdGhlIGhpZ2hlc3QgcG9zaXRpb24gaW4gKDxjb2RlPmJvdW5kPC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPnN0YXJ0PC9jb2RlPiBmb3Igd2hpY2ggPGNvZGU+Y29uZGl0aW9uPC9jb2RlPiBob2xkcywKLQkgKiAgICAgICAgIG9yIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgaW50IHNjYW5CYWNrd2FyZChpbnQgc3RhcnQsIGludCBib3VuZCwgU3RvcENvbmRpdGlvbiBjb25kaXRpb24pIHsKLQkJaWYgKGJvdW5kID09IFVOQk9VTkQpCi0JCQlib3VuZCA9IC0xOwotCi0JCUFzc2VydC5pc1RydWUoYm91bmQgPj0gLTEpOwotCQlBc3NlcnQuaXNUcnVlKHN0YXJ0IDwgZkRvY3VtZW50LmdldExlbmd0aCgpKTsKLQotCQl0cnkgewotCQkJZlBvcyA9IHN0YXJ0OwotCQkJd2hpbGUgKGZQb3MgPiBib3VuZCkgewotCi0JCQkJZkNoYXIgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmUG9zKTsKLQkJCQlpZiAoY29uZGl0aW9uLnN0b3AoZkNoYXIsIGZQb3MsIGZhbHNlKSkKLQkJCQkJcmV0dXJuIGZQb3M7Ci0KLQkJCQlmUG9zID0gY29uZGl0aW9uLm5leHRQb3NpdGlvbihmUG9zLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gTk9UX0ZPVU5EOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBoaWdoZXN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gc3VjaCB0aGF0IHRoZQotCSAqIHBvc2l0aW9uIGlzICZsdDs9IDxjb2RlPnBvc2l0aW9uPC9jb2RlPiBhbmQgJmd0OyA8Y29kZT5ib3VuZDwvY29kZT4KLQkgKiBhbmQgPGNvZGU+ZkRvY3VtZW50LmdldENoYXIocG9zaXRpb24pID09IGNoPC9jb2RlPiBldmFsdWF0ZXMgdG8KLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgYXQgbGVhc3Qgb25lIGNoIGluIDxjb2RlPmNoYXJzPC9jb2RlPiBhbmQgdGhlCi0JICogcG9zaXRpb24gaXMgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBiZSBjb25zaWRlcmVkCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBub3QKLQkgKiAgICAgICAgICAgIGNvbnNpZGVyIGFueSBtb3JlLCB3aXRoIDxjb2RlPmJvdW5kPC9jb2RlPiAmbHQ7Ci0JICogICAgICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT4sIG9yIDxjb2RlPlVOQk9VTkQ8L2NvZGU+Ci0JICogQHBhcmFtIGNoCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+Y2hhcjwvY29kZT4gdG8gc2VhcmNoIGZvcgotCSAqIEByZXR1cm4gdGhlIGhpZ2hlc3QgcG9zaXRpb24gb2Ygb25lIGVsZW1lbnQgaW4gPGNvZGU+Y2hhcnM8L2NvZGU+IGluICg8Y29kZT5ib3VuZDwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT5dIHRoYXQgcmVzaWRlcyBpbiBhIEphdmEgcGFydGl0aW9uLCBvcgotCSAqICAgICAgICAgPGNvZGU+Tk9UX0ZPVU5EPC9jb2RlPiBpZiBub25lIGNhbiBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBpbnQgc2NhbkJhY2t3YXJkKGludCBwb3NpdGlvbiwgaW50IGJvdW5kLCBjaGFyIGNoKSB7Ci0JCXJldHVybiBzY2FuQmFja3dhcmQocG9zaXRpb24sIGJvdW5kLCBuZXcgQ2hhcmFjdGVyTWF0Y2goY2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgaGlnaGVzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUKLQkgKiBwb3NpdGlvbiBpcyAmbHQ7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gYW5kICZndDsgPGNvZGU+Ym91bmQ8L2NvZGU+Ci0JICogYW5kIDxjb2RlPmZEb2N1bWVudC5nZXRDaGFyKHBvc2l0aW9uKSA9PSBjaDwvY29kZT4gZXZhbHVhdGVzIHRvCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGF0IGxlYXN0IG9uZSBjaCBpbiA8Y29kZT5jaGFyczwvY29kZT4gYW5kIHRoZQotCSAqIHBvc2l0aW9uIGlzIGluIHRoZSBkZWZhdWx0IHBhcnRpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgYmUgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90Ci0JICogICAgICAgICAgICBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmx0OwotCSAqICAgICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPgotCSAqIEBwYXJhbSBjaGFycwotCSAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgPGNvZGU+Y2hhcjwvY29kZT4gdG8gc2VhcmNoIGZvcgotCSAqIEByZXR1cm4gdGhlIGhpZ2hlc3QgcG9zaXRpb24gb2Ygb25lIGVsZW1lbnQgaW4gPGNvZGU+Y2hhcnM8L2NvZGU+IGluICg8Y29kZT5ib3VuZDwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT5dIHRoYXQgcmVzaWRlcyBpbiBhIEphdmEgcGFydGl0aW9uLCBvcgotCSAqICAgICAgICAgPGNvZGU+Tk9UX0ZPVU5EPC9jb2RlPiBpZiBub25lIGNhbiBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBpbnQgc2NhbkJhY2t3YXJkKGludCBwb3NpdGlvbiwgaW50IGJvdW5kLCBjaGFyW10gY2hhcnMpIHsKLQkJcmV0dXJuIHNjYW5CYWNrd2FyZChwb3NpdGlvbiwgYm91bmQsIG5ldyBDaGFyYWN0ZXJNYXRjaChjaGFycykpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiByZXNpZGVzIGluIGEgZGVmYXVsdCAoSmF2YSkKLQkgKiBwYXJ0aXRpb24gb2YgPGNvZGU+ZkRvY3VtZW50PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiB0byBiZSBjaGVja2VkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5wb3NpdGlvbjwvY29kZT4gaXMgaW4gdGhlCi0JICogICAgICAgICBkZWZhdWx0IHBhcnRpdGlvbiBvZiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFBhcnRpdGlvbihpbnQgcG9zaXRpb24pIHsKLQkJQXNzZXJ0LmlzVHJ1ZShwb3NpdGlvbiA+PSAwKTsKLQkJQXNzZXJ0LmlzVHJ1ZShwb3NpdGlvbiA8PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOwotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gZlBhcnRpdGlvbi5lcXVhbHMoVGV4dFV0aWxpdGllcy5nZXRDb250ZW50VHlwZShmRG9jdW1lbnQsIGZQYXJ0aXRpb25pbmcsIHBvc2l0aW9uLCBmYWxzZSkpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aXRpb24gYXQgPGNvZGU+cG9zaXRpb248L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIHRvIGdldCB0aGUgcGFydGl0aW9uIGZvcgotCSAqIEByZXR1cm4gdGhlIHBhcnRpdGlvbiBhdCA8Y29kZT5wb3NpdGlvbjwvY29kZT4gb3IgYSBkdW1teSB6ZXJvLWxlbmd0aAotCSAqICAgICAgICAgcGFydGl0aW9uIGlmIGFjY2Vzc2luZyB0aGUgZG9jdW1lbnQgZmFpbHMKLQkgKi8KLQlwcml2YXRlIElUeXBlZFJlZ2lvbiBnZXRQYXJ0aXRpb24oaW50IHBvc2l0aW9uKSB7Ci0JCUFzc2VydC5pc1RydWUocG9zaXRpb24gPj0gMCk7Ci0JCUFzc2VydC5pc1RydWUocG9zaXRpb24gPD0gZkRvY3VtZW50LmdldExlbmd0aCgpKTsKLQotCQl0cnkgewotCQkJcmV0dXJuIFRleHRVdGlsaXRpZXMuZ2V0UGFydGl0aW9uKGZEb2N1bWVudCwgZlBhcnRpdGlvbmluZywgcG9zaXRpb24sIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ldyBUeXBlZFJlZ2lvbihwb3NpdGlvbiwgMCwgIl9fbm9fcGFydGl0aW9uX2F0X2FsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgbGluZSBzZWVtcyB0byBiZSBhbiBvcGVuIGNvbmRpdGlvbiBub3QgZm9sbG93ZWQgYnkgYQotCSAqIGJsb2NrIChpLmUuIGFuIGlmLCB3aGlsZSwgb3IgZm9yIHN0YXRlbWVudCB3aXRoIGp1c3Qgb25lIGZvbGxvd2luZwotCSAqIHN0YXRlbWVudCwgc2VlIGV4YW1wbGUgYmVsb3cpLgotCSAqIAotCSAqIDxwcmU+Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJZG9TdHVmZigpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIDxwPgotCSAqIEFsZ29yaXRobTogaWYgdGhlIGxhc3Qgbm9uLVdTLCBub24tQ29tbWVudCBjb2RlIG9uIHRoZSBsaW5lIGlzIGFuIGlmCi0JICogKGNvbmRpdGlvbiksIHdoaWxlIChjb25kaXRpb24pLCBmb3IoIGV4cHJlc3Npb24pLCBkbywgZWxzZSwgYW5kIHRoZXJlCi0JICogaXMgbm8gc3RhdGVtZW50IGFmdGVyIHRoYXQKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgaW5zZXJ0IHBvc2l0aW9uIG9mIHRoZSBuZXcgY2hhcmFjdGVyCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgbG93ZXN0IHBvc2l0aW9uIHRvIGNvbnNpZGVyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29kZSBpcyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCBvcgotCSAqICAgICAgICAgbG9vcCB3aXRob3V0IGEgYmxvY2ssIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0JyYWNlbGVzc0Jsb2NrU3RhcnQoaW50IHBvc2l0aW9uLCBpbnQgYm91bmQpIHsKLQkJaWYgKHBvc2l0aW9uIDwgMSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlzd2l0Y2ggKHByZXZpb3VzVG9rZW4ocG9zaXRpb24sIGJvdW5kKSkgewotCQkJY2FzZSBUb2tlbkRPIDoKLQkJCWNhc2UgVG9rZW5FTFNFIDoKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWNhc2UgVG9rZW5SUEFSRU4gOgotCQkJCXBvc2l0aW9uID0gZmluZE9wZW5pbmdQZWVyKGZQb3MsIExQQVJFTiwgUlBBUkVOKTsKLQkJCQlpZiAocG9zaXRpb24gPiAwKSB7Ci0JCQkJCXN3aXRjaCAocHJldmlvdXNUb2tlbihwb3NpdGlvbiAtIDEsIGJvdW5kKSkgewotCQkJCQkJY2FzZSBUb2tlbklGIDoKLQkJCQkJCWNhc2UgVG9rZW5GT1IgOgotCQkJCQkJY2FzZSBUb2tlbldISUxFIDoKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0phdmFQYWlyTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhUGFpck1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwNzY5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0phdmFQYWlyTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGV4dDsKLQotLy8gdGFrZW4gZnJvbSBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlcjsKLQotY2xhc3MgSmF2YVBhaXJNYXRjaGVyIGltcGxlbWVudHMgSUNoYXJhY3RlclBhaXJNYXRjaGVyIHsKLQotCXByb3RlY3RlZCBjaGFyW10gZlBhaXJzOwotCXByb3RlY3RlZCBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByb3RlY3RlZCBpbnQgZk9mZnNldDsKLQotCXByb3RlY3RlZCBpbnQgZlN0YXJ0UG9zOwotCXByb3RlY3RlZCBpbnQgZkVuZFBvczsKLQlwcm90ZWN0ZWQgaW50IGZBbmNob3I7Ci0KLQlwcm90ZWN0ZWQgSmF2YUNvZGVSZWFkZXIgZlJlYWRlciA9IG5ldyBKYXZhQ29kZVJlYWRlcigpOwotCS8qKgotCSAqIFN0b3JlcyB0aGUgc291cmNlIHZlcnNpb24gc3RhdGUuCi0JICogCi0JICogQHNlZSBFY2xpcHNlICAzLjEKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZkhpZ2hsaWdodEFuZ3VsYXJCcmFja2V0cyA9IGZhbHNlOwotCi0KLQlwdWJsaWMgSmF2YVBhaXJNYXRjaGVyKGNoYXJbXSBwYWlycykgewotCQlmUGFpcnMgPSBwYWlyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNtYXRjaChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBtYXRjaChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQotCQlpZihvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBkb2N1bWVudC5nZXRMZW5ndGgoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCAmJiBtYXRjaFBhaXJzQXQoKSAmJiBmU3RhcnRQb3MgIT0gZkVuZFBvcykKLQkJCXJldHVybiBuZXcgUmVnaW9uKGZTdGFydFBvcywgZkVuZFBvcyAtIGZTdGFydFBvcyArIDEpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2dldEFuY2hvcigpCi0JICovCi0JcHVibGljIGludCBnZXRBbmNob3IoKSB7Ci0JCXJldHVybiBmQW5jaG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNsZWFyKCk7Ci0JCWZEb2N1bWVudCA9IG51bGw7Ci0JCWZSZWFkZXIgPSBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjY2xlYXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpZiAoZlJlYWRlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZSZWFkZXIuY2xvc2UoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaFBhaXJzQXQoKSB7Ci0KLQkJaW50IGk7Ci0JCWludCBwYWlySW5kZXgxID0gZlBhaXJzLmxlbmd0aDsKLQkJaW50IHBhaXJJbmRleDIgPSBmUGFpcnMubGVuZ3RoOwotCi0JCWZTdGFydFBvcyA9IC0xOwotCQlmRW5kUG9zID0gLTE7Ci0KLQkJLy8gZ2V0IHRoZSBjaGFycyBwcmVjZWRpbmcgYW5kIGZvbGxvd2luZyB0aGUgc3RhcnQgcG9zaXRpb24KLQkJdHJ5IHsKLQotCQkJY2hhciBwcmV2Q2hhciA9IGZEb2N1bWVudC5nZXRDaGFyKE1hdGgubWF4KGZPZmZzZXQgLSAxLCAwKSk7Ci0JCQkvLyBtb2RpZmllZCBiZWhhdmlvciBmb3IKLQkJCS8vIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY4NzkKLQkJCS8vIGNoYXIgbmV4dENoYXI9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCi0JCQkvLyBzZWFyY2ggZm9yIG9wZW5pbmcgcGVlciBjaGFyYWN0ZXIgbmV4dCB0byB0aGUgYWN0aXZhdGlvbiBwb2ludAotCQkJZm9yIChpID0gMDsgaSA8IGZQYWlycy5sZW5ndGg7IGkgPSBpICsgMikgewotCQkJCS8vIGlmIChuZXh0Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkvLyBmU3RhcnRQb3M9IGZPZmZzZXQ7Ci0JCQkJLy8gcGFpckluZGV4MT0gaTsKLQkJCQkvLyB9IGVsc2UKLQkJCQlpZiAocHJldkNoYXIgPT0gZlBhaXJzW2ldKSB7Ci0JCQkJCWZTdGFydFBvcyA9IGZPZmZzZXQgLSAxOwotCQkJCQlwYWlySW5kZXgxID0gaTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHNlYXJjaCBmb3IgY2xvc2luZyBwZWVyIGNoYXJhY3RlciBuZXh0IHRvIHRoZSBhY3RpdmF0aW9uIHBvaW50Ci0JCQlmb3IgKGkgPSAxOyBpIDwgZlBhaXJzLmxlbmd0aDsgaSA9IGkgKyAyKSB7Ci0JCQkJaWYgKHByZXZDaGFyID09IGZQYWlyc1tpXSkgewotCQkJCQlmRW5kUG9zID0gZk9mZnNldCAtIDE7Ci0JCQkJCXBhaXJJbmRleDIgPSBpOwotCQkJCX0KLQkJCQkvLyBlbHNlIGlmIChuZXh0Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkvLyBmRW5kUG9zPSBmT2Zmc2V0OwotCQkJCS8vIHBhaXJJbmRleDI9IGk7Ci0JCQkJLy8gfQotCQkJfQotCi0JCQlpZiAoZkVuZFBvcyA+IC0xKSB7Ci0JCQkJZkFuY2hvciA9IFJJR0hUOwotCQkJCWZTdGFydFBvcyA9IHNlYXJjaEZvck9wZW5pbmdQZWVyKGZFbmRQb3MsIGZQYWlyc1twYWlySW5kZXgyIC0gMV0sIGZQYWlyc1twYWlySW5kZXgyXSwgZkRvY3VtZW50KTsKLQkJCQlpZiAoZlN0YXJ0UG9zID4gLTEpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UKLQkJCQkJZkVuZFBvcyA9IC0xOwotCQkJfQotCQkJZWxzZSBpZiAoZlN0YXJ0UG9zID4gLTEpIHsKLQkJCQlmQW5jaG9yID0gTEVGVDsKLQkJCQlmRW5kUG9zID0gc2VhcmNoRm9yQ2xvc2luZ1BlZXIoZlN0YXJ0UG9zLCBmUGFpcnNbcGFpckluZGV4MV0sIGZQYWlyc1twYWlySW5kZXgxICsgMV0sIGZEb2N1bWVudCk7Ci0JCQkJaWYgKGZFbmRQb3MgPiAtMSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZQotCQkJCQlmU3RhcnRQb3MgPSAtMTsKLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IHNlYXJjaEZvckNsb3NpbmdQZWVyKGludCBvZmZzZXQsIGludCBvcGVuaW5nUGVlciwgaW50IGNsb3NpbmdQZWVyLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChvcGVuaW5nUGVlciA9PSAnPCcgJiYgIShmSGlnaGxpZ2h0QW5ndWxhckJyYWNrZXRzICYmIGlzVHlwZVBhcmFtZXRlckJyYWNrZXQob2Zmc2V0LCBkb2N1bWVudCkpKQotCQkJcmV0dXJuIC0xOwotCi0JCWZSZWFkZXIuY29uZmlndXJlRm9yd2FyZFJlYWRlcihkb2N1bWVudCwgb2Zmc2V0ICsgMSwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCksIHRydWUsIHRydWUpOwotCi0JCWludCBzdGFjayA9IDE7Ci0JCWludCBjID0gZlJlYWRlci5yZWFkKCk7Ci0JCXdoaWxlIChjICE9IEphdmFDb2RlUmVhZGVyLkVPRikgewotCQkJaWYgKGMgPT0gb3BlbmluZ1BlZXIgJiYgYyAhPSBjbG9zaW5nUGVlcikKLQkJCQlzdGFjaysrOwotCQkJZWxzZSBpZiAoYyA9PSBjbG9zaW5nUGVlcikKLQkJCQlzdGFjay0tOwotCi0JCQlpZiAoc3RhY2sgPT0gMCkKLQkJCQlyZXR1cm4gZlJlYWRlci5nZXRPZmZzZXQoKTsKLQotCQkJYyA9IGZSZWFkZXIucmVhZCgpOwotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCi0JcHJvdGVjdGVkIGludCBzZWFyY2hGb3JPcGVuaW5nUGVlcihpbnQgb2Zmc2V0LCBpbnQgb3BlbmluZ1BlZXIsIGludCBjbG9zaW5nUGVlciwgSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAob3BlbmluZ1BlZXIgPT0gJzwnICYmICFmSGlnaGxpZ2h0QW5ndWxhckJyYWNrZXRzKQotCQkJcmV0dXJuIC0xOwotCi0JCWZSZWFkZXIuY29uZmlndXJlQmFja3dhcmRSZWFkZXIoZG9jdW1lbnQsIG9mZnNldCwgdHJ1ZSwgdHJ1ZSk7Ci0KLQkJaW50IHN0YWNrID0gMTsKLQkJaW50IGMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJd2hpbGUgKGMgIT0gSmF2YUNvZGVSZWFkZXIuRU9GKSB7Ci0JCQlpZiAoYyA9PSBjbG9zaW5nUGVlciAmJiBjICE9IG9wZW5pbmdQZWVyKQotCQkJCXN0YWNrKys7Ci0JCQllbHNlIGlmIChjID09IG9wZW5pbmdQZWVyKQotCQkJCXN0YWNrLS07Ci0KLQkJCWlmIChzdGFjayA9PSAwKSB7Ci0JCQkJaWYgKGNsb3NpbmdQZWVyID09ICc+JyAmJiAhaXNUeXBlUGFyYW1ldGVyQnJhY2tldChmUmVhZGVyLmdldE9mZnNldCgpLCBkb2N1bWVudCkpCi0JCQkJCXJldHVybiAtMTsKLQkJCQlyZXR1cm4gZlJlYWRlci5nZXRPZmZzZXQoKTsKLQkJCX0KLQotCQkJYyA9IGZSZWFkZXIucmVhZCgpOwotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgYW5ndWxhciBicmFja2V0IGF0IDxjb2RlPm9mZnNldDwvY29kZT4gaXMgYSB0eXBlCi0JICogcGFyYW1ldGVyIGJyYWNrZXQuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgb3BlbmluZyBicmFja2V0Ci0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBicmFja2V0IGlzIHBhcnQgb2YgYSB0eXBlIHBhcmFtZXRlciwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAc2VlIEVjbGlwc2UgIDMuMQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1R5cGVQYXJhbWV0ZXJCcmFja2V0KGludCBvZmZzZXQsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvKgotCQkgKiB0eXBlIHBhcmFtZXRlciBjb21lIGFmdGVyIGJyYWNlcyAoY2xvc2luZyBvciBvcGVuaW5nKSwgc2VtaWNvbG9ucywKLQkJICogb3IgYWZ0ZXIgYSBUeXBlIG5hbWUgKGhldXJpc3RpYzogc3RhcnRzIHdpdGggY2FwaXRhbCBjaGFyYWN0ZXIsIG9yCi0JCSAqIGFmdGVyIGEgbW9kaWZpZXIga2V5d29yZCBpbiBhIG1ldGhvZCBkZWNsYXJhdGlvbiAodmlzaWJpbGl0eSwKLQkJICogc3RhdGljLCBzeW5jaHJvbml6ZWQsIGZpbmFsKQotCQkgKi8KLQotCQl0cnkgewotCQkJSVJlZ2lvbiBsaW5lID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQob2Zmc2V0KTsKLQotCQkJSmF2YUhldXJpc3RpY1NjYW5uZXIgc2Nhbm5lciA9IG5ldyBKYXZhSGV1cmlzdGljU2Nhbm5lcihkb2N1bWVudCk7Ci0JCQlpbnQgcHJldlRva2VuID0gc2Nhbm5lci5wcmV2aW91c1Rva2VuKG9mZnNldCAtIDEsIGxpbmUuZ2V0T2Zmc2V0KCkpOwotCQkJaW50IHByZXZUb2tlbk9mZnNldCA9IHNjYW5uZXIuZ2V0UG9zaXRpb24oKSArIDE7Ci0JCQlTdHJpbmcgcHJldmlvdXMgPSBwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlbkVPRiA/IG51bGwgOiBkb2N1bWVudC5nZXQocHJldlRva2VuT2Zmc2V0LCBvZmZzZXQgLSBwcmV2VG9rZW5PZmZzZXQpLnRyaW0oKTsKLQotCQkJaWYgKHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuTEJSQUNFIHx8IHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuUkJSQUNFIHx8IHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuU0VNSUNPTE9OIHx8IHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuU1lOQ0hST05JWkVEIHx8IHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuU1RBVElDIHx8IChwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlbklERU5UICYmIGlzVHlwZVBhcmFtZXRlckludHJvZHVjZXIocHJldmlvdXMpKSB8fCBwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlbkVPRikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+aWRlbnRpZmllcjwvY29kZT4gaXMgYW4KLQkgKiBpZGVudGlmaWVyIHRoYXQgY291bGQgY29tZSByaWdodCBiZWZvcmUgYSB0eXBlIHBhcmFtZXRlciBsaXN0LiBJdCB1c2VzCi0JICogYSBoZXVyaXN0aWM6IGlmIHRoZSBpZGVudGlmaWVyIHN0YXJ0cyB3aXRoIGFuIHVwcGVyIGNhc2UsIGl0IGlzIGFzc3VtZWQKLQkgKiBhIHR5cGUgbmFtZS4gQWxzbywgaWYgPGNvZGU+aWRlbnRpZmllcjwvY29kZT4gaXMgYSBtZXRob2QgbW9kaWZpZXIsCi0JICogaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBhbmd1bGFyIGJyYWNrZXQgaXMgcGFydCBvZiB0aGUgZ2VuZXJpYyB0eXBlCi0JICogcGFyYW1ldGVyIG9mIGEgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBpZGVudGlmaWVyCi0JICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciB0byBjaGVjawotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGlkZW50aWZpZXIgY291bGQgaW50cm9kdWNlIGEgdHlwZQotCSAqICAgICAgICAgcGFyYW1ldGVyIGxpc3QKLQkgKiBAc2VlIEVjbGlwc2UgIDMuMQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1R5cGVQYXJhbWV0ZXJJbnRyb2R1Y2VyKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiBpZGVudGlmaWVyLmxlbmd0aCgpID4gMCAmJiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGlkZW50aWZpZXIuY2hhckF0KDApKSB8fCBpZGVudGlmaWVyLnN0YXJ0c1dpdGgoImZpbmFsIikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBpZGVudGlmaWVyLnN0YXJ0c1dpdGgoInB1YmxpYyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgaWRlbnRpZmllci5zdGFydHNXaXRoKCJwdWJsaWMiKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IGlkZW50aWZpZXIuc3RhcnRzV2l0aCgicHJvdGVjdGVkIikgLy8kTk9OLU5MUy0xJAotCQl8fCBpZGVudGlmaWVyLnN0YXJ0c1dpdGgoInByaXZhdGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L1N5bWJvbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvU3ltYm9scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjIwM2UzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvU3ltYm9scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRleHQ7Ci0KLS8vIHRha2VuIGZyb20gcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQudWkudGV4dDsKLQotLyoqCi0gKiBTeW1ib2xzIGZvciB0aGUgaGV1cmlzdGljIGphdmEgc2Nhbm5lci4KLSAqIAotICogQHNlZSBFY2xpcHNlIDMuMAotICovCi1pbnRlcmZhY2UgU3ltYm9scyB7Ci0JaW50IFRva2VuRU9GID0gLTE7Ci0JaW50IFRva2VuTEJSQUNFID0gMTsKLQlpbnQgVG9rZW5SQlJBQ0UgPSAyOwotCWludCBUb2tlbkxCUkFDS0VUID0gMzsKLQlpbnQgVG9rZW5SQlJBQ0tFVCA9IDQ7Ci0JaW50IFRva2VuTFBBUkVOID0gNTsKLQlpbnQgVG9rZW5SUEFSRU4gPSA2OwotCWludCBUb2tlblNFTUlDT0xPTiA9IDc7Ci0JaW50IFRva2VuT1RIRVIgPSA4OwotCWludCBUb2tlbkNPTE9OID0gOTsKLQlpbnQgVG9rZW5RVUVTVElPTk1BUksgPSAxMDsKLQlpbnQgVG9rZW5DT01NQSA9IDExOwotCWludCBUb2tlbkVRVUFMID0gMTI7Ci0JaW50IFRva2VuTEVTU1RIQU4gPSAxMzsKLQlpbnQgVG9rZW5HUkVBVEVSVEhBTiA9IDE0OwotCWludCBUb2tlbklGID0gMTA5OwotCWludCBUb2tlbkRPID0gMTAxMDsKLQlpbnQgVG9rZW5GT1IgPSAxMDExOwotCWludCBUb2tlblRSWSA9IDEwMTI7Ci0JaW50IFRva2VuQ0FTRSA9IDEwMTM7Ci0JaW50IFRva2VuRUxTRSA9IDEwMTQ7Ci0JaW50IFRva2VuQlJFQUsgPSAxMDE1OwotCWludCBUb2tlbkNBVENIID0gMTAxNjsKLQlpbnQgVG9rZW5XSElMRSA9IDEwMTc7Ci0JaW50IFRva2VuUkVUVVJOID0gMTAxODsKLQlpbnQgVG9rZW5TVEFUSUMgPSAxMDE5OwotCWludCBUb2tlblNXSVRDSCA9IDEwMjA7Ci0JaW50IFRva2VuRklOQUxMWSA9IDEwMjE7Ci0JaW50IFRva2VuU1lOQ0hST05JWkVEID0gMTAyMjsKLQlpbnQgVG9rZW5HT1RPID0gMTAyMzsKLQlpbnQgVG9rZW5ERUZBVUxUID0gMTAyNDsKLQlpbnQgVG9rZW5ORVcgPSAxMDI1OwotCWludCBUb2tlbkNMQVNTID0gMTAyNjsKLQlpbnQgVG9rZW5JTlRFUkZBQ0UgPSAxMDI3OwotCWludCBUb2tlbkVOVU0gPSAxMDI4OwotCWludCBUb2tlbklERU5UID0gMjAwMDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3dpemFyZC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTFhYjk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3dpemFyZC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyBhbnkgdXNlZCBNb2R1bGUgQ29yZSBhbmQgRmFjZXRzIEFQSXMgYWxvbmcgd2l0aAotICogZmFsbGJhY2tzIGZvciB1c2Ugb24gbm9uLWNvbXBsaWFudCBwcm9qZWN0cyBhbmQgd2hlbiB0aG9zZSBzZXJ2aWNlcyBhcmUgbm90Ci0gKiBhdmFpbGFibGUgYXQgcnVudGltZS4KLSAqIAotICogQmVjYXVzZSBNb2R1bGVDb3JlIEFQSSBjYWxscyBjYW4gcmVzdWx0IGluIGxvY2tzIG5lZWRpbmcgdG8gYmUgYWNxdWlyZWQsCi0gKiBub25lIG9mIHRoZXNlIG1ldGhvZHMgc2hvdWxkIGJlIGNhbGxlZCB3aGlsZSBvdGhlciB0aHJlYWQgbG9ja3MgaGF2ZQotICogYWxyZWFkeSBiZWVuIGFjcXVpcmVkLgotICovCi1maW5hbCBjbGFzcyBGYWNldE1vZHVsZUNvcmVTdXBwb3J0IHsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZHVtcF9OQ0RGRSA9IGZhbHNlOwotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHRoZSBJUGF0aCB0byB0aGUgInJvb3QiIG9mIHRoZSB3ZWIgY29udGVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFdlYkNvbnRlbnRSb290UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwYXRoID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmdldFdlYkNvbnRlbnRSb290UGF0aChwcm9qZWN0KTsKLQkJfQotCQljYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgewotCQkJaWYgKF9kdW1wX05DREZFKQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dlYlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQl0cnkgewotCQkJcmV0dXJuIEZhY2V0TW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5pc1dlYlByb2plY3QocHJvamVjdCk7Ci0JCX0KLQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLQkJCWlmIChfZHVtcF9OQ0RGRSkKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNTQ4NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvd2l6YXJkL0ZhY2V0TW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBXcmFwcGVyIGNsYXNzIGZvciBhbGwgRmFjZXQtcmVsYXRlZCBjYWxscy4gSWYgdGhlIEZhY2V0IG9yIE1vZHVsZUNvcmUKLSAqIGJ1bmRsZXMgYXJlIG5vdCBhdmFpbGFibGUsIHRoaXMgY2xhc3Mgd2lsbCBub3QgbG9hZCwgb3IgaWYgaXQgZG9lcywgaXRzCi0gKiBtZXRob2RzIHdpbGwgY2F1c2UgTm9DbGFzc0RlZkZvdW5kRXJyb3JzLiBUaGlzIGFsbG93cyB1cyB0bwotICogY29tcGFydG1lbnRhbGl6ZSB0aGUgZGVwZW5kZW5jaWVzLgotICogCi0gKi8KLWZpbmFsIGNsYXNzIEZhY2V0TW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZSB7Ci0JLyoqCi0JICogQ29waWVkIHRvIGF2b2lkIHVubmVlZGVkIGV4dHJhIGRlcGVuZGVuY3kgKHBsdXMgaXQncyB1bmNsZWFyIHdoeSB0aGUKLQkgKiB2YWx1ZSBpcyBpbiB0aGF0IHBsdWctaW4pLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRQotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBKU1RfV0VCX01PRFVMRSA9ICJqc3Qud2ViIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTVF9XRUJfTU9EVUxFID0gIndzdC53ZWIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gdGhlIElQYXRoIHRvIHRoZSAicm9vdCIgb2YgdGhlIHdlYiBjb250ZW50cwotCSAqLwotCXN0YXRpYyBJUGF0aCBnZXRXZWJDb250ZW50Um9vdFBhdGgoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoIU1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkpCi0JCQlyZXR1cm4gcHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCi0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJaWYgKGNvbXBvbmVudCAhPSBudWxsICYmIGNvbXBvbmVudC5leGlzdHMoKSkgewotCQkJcGF0aCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXN0YXRpYyBib29sZWFuIGlzV2ViUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWJvb2xlYW4gaXMgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJaWYgKFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZChKU1RfV0VCX01PRFVMRSkpIHsKLQkJCQlJUHJvamVjdEZhY2V0IGZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KEpTVF9XRUJfTU9EVUxFKTsKLQkJCQlpcyA9IGlzIHx8IChmYWNldGVkICE9IG51bGwgJiYgZmFjZXRlZC5oYXNQcm9qZWN0RmFjZXQoZmFjZXQpKTsKLQkJCX0KLQkJCWlmIChQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQoV1NUX1dFQl9NT0RVTEUpKSB7Ci0JCQkJSVByb2plY3RGYWNldCBmYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChXU1RfV0VCX01PRFVMRSk7Ci0JCQkJaXMgPSBpcyB8fCAoZmFjZXRlZCAhPSBudWxsICYmIGZhY2V0ZWQuaGFzUHJvamVjdEZhY2V0KGZhY2V0KSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gaXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0hUTUxGaWxlV2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0hUTUxGaWxlV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTBkODAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3dpemFyZC9OZXdIVE1MRmlsZVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLQotY2xhc3MgTmV3SFRNTEZpbGVXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSB7Ci0KLQlwcml2YXRlIElDb250ZW50VHlwZSBmQ29udGVudFR5cGU7Ci0JcHJpdmF0ZSBMaXN0IGZWYWxpZEV4dGVuc2lvbnMgPSBudWxsOwotCQotCXB1YmxpYyBOZXdIVE1MRmlsZVdpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgc3VwZXIocGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0gICAgfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiB0byBzZXQgdGhlIHNlbGVjdGVkIGZvbGRlciB0byB3ZWIgY29udGVudHMgCi0JICogZm9sZGVyIGlmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyBvdXRzaWRlIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyLiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsUG9wdWxhdGVDb250YWluZXJOYW1lRmllbGQoKSB7Ci0JCXN1cGVyLmluaXRpYWxQb3B1bGF0ZUNvbnRhaW5lck5hbWVGaWVsZCgpOwotCQkKLQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21QYXRoKGZ1bGxQYXRoKTsKLQkJSVBhdGggd2ViQ29udGVudFBhdGggPSBnZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KTsKLQkJCi0JCWlmICh3ZWJDb250ZW50UGF0aCAhPSBudWxsICYmICF3ZWJDb250ZW50UGF0aC5pc1ByZWZpeE9mKGZ1bGxQYXRoKSkgewotCQkJc2V0Q29udGFpbmVyRnVsbFBhdGgod2ViQ29udGVudFBhdGgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiB0byBzZXQgYWRkaXRpb25hbCB2YWxpZGF0aW9uIHNwZWNpZmljIHRvIAotCSAqIGh0bWwgZmlsZXMuIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJc2V0TWVzc2FnZShudWxsKTsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkKLQkJaWYgKCFzdXBlci52YWxpZGF0ZVBhZ2UoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRGaWxlTmFtZSgpOwotCQlJUGF0aCBmdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0JCWlmICgoZnVsbFBhdGggIT0gbnVsbCkgJiYgKGZ1bGxQYXRoLmlzRW1wdHkoKSA9PSBmYWxzZSkgJiYgKGZpbGVOYW1lICE9IG51bGwpKSB7Ci0JCQkvLyBjaGVjayB0aGF0IGZpbGVuYW1lIGRvZXMgbm90IGNvbnRhaW4gaW52YWxpZCBleHRlbnNpb24KLQkJCWlmICghZXh0ZW5zaW9uVmFsaWRGb3JDb250ZW50VHlwZShmaWxlTmFtZSkpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoSFRNTFVJTWVzc2FnZXMuX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0hUTUwsIGdldFZhbGlkRXh0ZW5zaW9ucygpLnRvU3RyaW5nKCkpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBubyBmaWxlIGV4dGVuc2lvbiBzcGVjaWZpZWQgc28gY2hlY2sgYWRkaW5nIGRlZmF1bHQKLQkJCS8vIGV4dGVuc2lvbiBkb2Vzbid0IGVxdWFsIGEgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzCi0JCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PSAtMSkgewotCQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGFkZERlZmF1bHRFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkJCUlQYXRoIHJlc291cmNlUGF0aCA9IGZ1bGxQYXRoLmFwcGVuZChuZXdGaWxlTmFtZSk7Ci0KLQkJCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCQlJU3RhdHVzIHJlc3VsdCA9IHdvcmtzcGFjZS52YWxpZGF0ZVBhdGgocmVzb3VyY2VQYXRoLnRvU3RyaW5nKCksIElSZXNvdXJjZS5GT0xERVIpOwotCQkJCWlmICghcmVzdWx0LmlzT0soKSkgewotCQkJCQkvLyBwYXRoIGludmFsaWQKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKHJlc3VsdC5nZXRNZXNzYWdlKCkpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJaWYgKCh3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZvbGRlcihyZXNvdXJjZVBhdGgpLmV4aXN0cygpIHx8IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShyZXNvdXJjZVBhdGgpLmV4aXN0cygpKSkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoSFRNTFVJTWVzc2FnZXMuUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gZ2V0IHRoZSBJUHJvamVjdCBmb3IgdGhlIHNlbGVjdGlvbiBwYXRoCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21QYXRoKGZ1bGxQYXRoKTsKLQkJCS8vIGlmIGluc2lkZSB3ZWIgcHJvamVjdCwgY2hlY2sgaWYgaW5zaWRlIHdlYkNvbnRlbnQgZm9sZGVyCi0JCQlpZiAocHJvamVjdCAhPSBudWxsICYmIGlzV2ViUHJvamVjdChwcm9qZWN0KSkgewotCQkJCS8vIGNoZWNrIHRoYXQgdGhlIHBhdGggaXMgaW5zaWRlIHRoZSB3ZWJDb250ZW50IGZvbGRlcgotCQkJCUlQYXRoIHdlYkNvbnRlbnRQYXRoID0gZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0JCQkJaWYgKCF3ZWJDb250ZW50UGF0aC5pc1ByZWZpeE9mKGZ1bGxQYXRoKSkgewotCQkJCQlzZXRNZXNzYWdlKEhUTUxVSU1lc3NhZ2VzLl9XQVJOSU5HX0ZPTERFUl9NVVNUX0JFX0lOU0lERV9XRUJfQ09OVEVOVCwgV0FSTklORyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEdldCBjb250ZW50IHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmV3IGZpbGUgd2l6YXJkCi0JICogCi0JICogQHJldHVybiBJQ29udGVudFR5cGUKLQkgKi8KLQlwcml2YXRlIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJaWYgKGZDb250ZW50VHlwZSA9PSBudWxsKQotCQkJZkNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MKTsKLQkJcmV0dXJuIGZDb250ZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbGlzdCBvZiB2YWxpZCBleHRlbnNpb25zIGZvciBIVE1MIENvbnRlbnQgdHlwZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VmFsaWRFeHRlbnNpb25zKCkgewotCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQl9Ci0JCXJldHVybiBmVmFsaWRFeHRlbnNpb25zOwotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyBpZiBmaWxlTmFtZSBpcyB2YWxpZCBuYW1lIGZvciBjb250ZW50IHR5cGUuIFRha2VzIGJhc2UgY29udGVudAotCSAqIHR5cGUgaW50byBjb25zaWRlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBleHRlbnNpb24gaXMgdmFsaWQgZm9yIHRoaXMgY29udGVudCB0eXBlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQotCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCS8vIHRoZXJlIGlzIGN1cnJlbnRseSBhbiBleHRlbnNpb24KLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgIT0gLTEpIHsKLQkJCS8vIGNoZWNrIHdoYXQgY29udGVudCB0eXBlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGN1cnJlbnQgZXh0ZW5zaW9uCi0JCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZXNGb3IoZmlsZU5hbWUpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB0eXBlcy5sZW5ndGggJiYgIXZhbGlkKSB7Ci0JCQkJdmFsaWQgPSB0eXBlc1tpXS5pc0tpbmRPZih0eXBlKTsKLQkJCQkrK2k7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJdmFsaWQgPSB0cnVlOyAvLyBubyBleHRlbnNpb24gc28gdmFsaWQKLQkJcmV0dXJuIHZhbGlkOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZGVmYXVsdCBleHRlbnNpb24gdG8gdGhlIGZpbGVuYW1lCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBhZGREZWZhdWx0RXh0ZW5zaW9uKFN0cmluZyBmaWxlbmFtZSkgewotCQlTdHJpbmdCdWZmZXIgbmV3RmlsZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKGZpbGVuYW1lKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBleHQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTik7Ci0KLQkJbmV3RmlsZU5hbWUuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJbmV3RmlsZU5hbWUuYXBwZW5kKGV4dCk7Ci0KLQkJcmV0dXJuIG5ld0ZpbGVOYW1lLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB3aGljaCBwcm9qZWN0IGlzIG5lZWRlZAotCSAqIEByZXR1cm4gSVByb2plY3Qgb2JqZWN0LiBJZiBwYXRoIGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZSByZXR1cm4gdmFsdWUgCi0JICogCQkgICBpcyBhbHNvIDxjb2RlPm51bGw8L2NvZGU+LiAKLQkgKi8KLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3RGcm9tUGF0aChJUGF0aCBwYXRoKSB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJCi0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCWlmICh3b3Jrc3BhY2UudmFsaWRhdGVQYXRoKHBhdGgudG9TdHJpbmcoKSwgSVJlc291cmNlLlBST0pFQ1QpLmlzT0soKSkgewotCQkJCXByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QocGF0aC50b1N0cmluZygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKS5nZXRQcm9qZWN0KCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGlzIGEgd2ViIHByb2plY3QuIAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHByb2plY3QgdG8gYmUgY2hlY2tlZAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvamVjdCBpcyB3ZWIgcHJvamVjdCwgb3RoZXJ3aXNlIGZhbHNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzV2ViUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LmlzV2ViUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2ViIGNvbnRlbnRzIGZvbGRlciBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB3aGljaCB3ZWIgY29udGVudHMgcGF0aCBpcyBuZWVkZWQKLQkgKiBAcmV0dXJuIElQYXRoIG9mIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyCi0JICovCi0JcHJpdmF0ZSBJUGF0aCBnZXRXZWJDb250ZW50UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LmdldFdlYkNvbnRlbnRSb290UGF0aChwcm9qZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3dpemFyZC9OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTUwNDJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3dpemFyZC9OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkRvY3VtZW50VGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLS8qKgotICogVGVtcGxhdGVzIHBhZ2UgaW4gbmV3IGZpbGUgd2l6YXJkLiBBbGxvd3MgdXNlcnMgdG8gc2VsZWN0IGEgbmV3IGZpbGUKLSAqIHRlbXBsYXRlIHRvIGJlIGFwcGxpZWQgaW4gbmV3IGZpbGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBDb250ZW50IHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQkvKiogVGhlIHRlbXBsYXRlIHN0b3JlLiAqLwotCQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlN0b3JlOwotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlmU3RvcmUgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlyZXR1cm4gZlN0b3JlLmdldFRlbXBsYXRlcyhUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5ORVcpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQlmU3RvcmUgPSAoVGVtcGxhdGVTdG9yZSkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMYWJlbCBwcm92aWRlciBmb3IgdGVtcGxhdGVzLgotCSAqLwotCXByaXZhdGUgY2xhc3MgVGVtcGxhdGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgZWxlbWVudDsKLQotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqIExhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUgbmFtZSAqLwotCXByaXZhdGUgU3RyaW5nIGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWU7Ci0JLyoqIFRoZSB2aWV3ZXIgZGlzcGxheXMgdGhlIHBhdHRlcm4gb2Ygc2VsZWN0ZWQgdGVtcGxhdGUuICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZlBhdHRlcm5WaWV3ZXI7Ci0JLyoqIFRoZSB0YWJsZSBwcmVzZW50aW5nIHRoZSB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBmVGFibGVWaWV3ZXI7Ci0JLyoqIFRlbXBsYXRlIHN0b3JlIHVzZWQgYnkgdGhpcyB3aXphcmQgcGFnZSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQkvKiogQ2hlY2tib3ggZm9yIHVzaW5nIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIEJ1dHRvbiBmVXNlVGVtcGxhdGVCdXR0b247Ci0KLQlwdWJsaWMgTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKCJOZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZSIsIEhUTUxVSU1lc3NhZ2VzLk5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzAsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKEhUTUxVSU1lc3NhZ2VzLk5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzEpOwotCX0KLQotCS8qKgotCSAqIENvcnJlY3RseSByZXNpemVzIHRoZSB0YWJsZSBzbyBubyBwaGFudG9tIGNvbHVtbnMgYXBwZWFyCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHBhcmFtIGJ1dHRvbnMKLQkgKiAgICAgICAgICAgIHRoZSBidXR0b25zCi0JICogQHBhcmFtIHRhYmxlCi0JICogICAgICAgICAgICB0aGUgdGFibGUKLQkgKiBAcGFyYW0gY29sdW1uMQotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNvbHVtbgotCSAqIEBwYXJhbSBjb2x1bW4yCi0JICogICAgICAgICAgICB0aGUgc2Vjb25kIGNvbHVtbgotCSAqIEBwYXJhbSBjb2x1bW4zCi0JICogICAgICAgICAgICB0aGUgdGhpcmQgY29sdW1uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVRhYmxlUmVzaXppbmcoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgVGFibGUgdGFibGUsIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjEsIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjIpIHsKLQkJcGFyZW50LmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCVJlY3RhbmdsZSBhcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsKLQkJCQlQb2ludCBwcmVmZXJyZWRTaXplID0gdGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCQlpbnQgd2lkdGggPSBhcmVhLndpZHRoIC0gMiAqIHRhYmxlLmdldEJvcmRlcldpZHRoKCk7Ci0JCQkJaWYgKHByZWZlcnJlZFNpemUueSA+IGFyZWEuaGVpZ2h0KSB7Ci0JCQkJCS8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uCi0JCQkJCS8vIHdpZHRoCi0JCQkJCS8vIGlmIGEgdmVydGljYWwgc2Nyb2xsYmFyIHdpbGwgYmUgcmVxdWlyZWQKLQkJCQkJUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLQkJCQkJd2lkdGggLT0gdkJhclNpemUueDsKLQkJCQl9Ci0KLQkJCQlQb2ludCBvbGRTaXplID0gdGFibGUuZ2V0U2l6ZSgpOwotCQkJCWlmIChvbGRTaXplLnggPiB3aWR0aCkgewotCQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIHNtYWxsZXIgc28gbWFrZSB0aGUgY29sdW1ucwotCQkJCQkvLyBzbWFsbGVyIGZpcnN0IGFuZCB0aGVuIHJlc2l6ZSB0aGUgdGFibGUgdG8KLQkJCQkJLy8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQl0YWJsZS5zZXRTaXplKHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIGJpZ2dlciBzbyBtYWtlIHRoZSB0YWJsZQotCQkJCQkvLyBiaWdnZXIgZmlyc3QgYW5kIHRoZW4gbWFrZSB0aGUgY29sdW1ucyB3aWRlcgotCQkJCQkvLyB0byBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIGFuY2VzdG9yKSB7Ci0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKGFuY2VzdG9yLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gY3JlYXRlIGNoZWNrYm94IGZvciB1c2VyIHRvIHVzZSBIVE1MIFRlbXBsYXRlCi0JCWZVc2VUZW1wbGF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV80KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbmFibGVUZW1wbGF0ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZSBmb3IgVGVtcGxhdGVzIHRhYmxlCi0JCUNvbXBvc2l0ZSBpbm5lclBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgaW5uZXJMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlpbm5lckxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJaW5uZXJMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJaW5uZXJMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXQoaW5uZXJMYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChpbm5lclBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLk5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzcpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRlbXBsYXRlcwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShpbm5lclBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMik7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4yLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMyk7Ci0KLQkJZlRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJZlRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRlbXBsYXRlTGFiZWxQcm92aWRlcigpKTsKLQkJZlRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGVtcGxhdGVDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJZlRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MikgewotCQkJCWlmICgob2JqZWN0MSBpbnN0YW5jZW9mIFRlbXBsYXRlKSAmJiAob2JqZWN0MiBpbnN0YW5jZW9mIFRlbXBsYXRlKSkgewotCQkJCQlUZW1wbGF0ZSBsZWZ0ID0gKFRlbXBsYXRlKSBvYmplY3QxOwotCQkJCQlUZW1wbGF0ZSByaWdodCA9IChUZW1wbGF0ZSkgb2JqZWN0MjsKLQkJCQkJaW50IHJlc3VsdCA9IGxlZnQuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKQotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJcmV0dXJuIGxlZnQuZ2V0RGVzY3JpcHRpb24oKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldERlc2NyaXB0aW9uKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIG9iamVjdDEsIG9iamVjdDIpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc1NvcnRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0KLQkJZlRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQl1cGRhdGVWaWV3ZXJJbnB1dCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgdmlld2VyIHRoYXQgZGlzcGxheXMgY3VycmVudGx5IHNlbGVjdGVkIHRlbXBsYXRlJ3MgY29udGVudHMKLQkJZlBhdHRlcm5WaWV3ZXIgPSBkb0NyZWF0ZVZpZXdlcihwYXJlbnQpOwotCi0JCWZUZW1wbGF0ZVN0b3JlID0gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWZUYWJsZVZpZXdlci5zZXRJbnB1dChmVGVtcGxhdGVTdG9yZSk7Ci0KLQkJLy8gQ3JlYXRlIGxpbmtlZCB0ZXh0IHRvIGp1c3QgdG8gdGVtcGxhdGVzIHByZWZlcmVuY2UgcGFnZQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGluay5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLk5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzYpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWxpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlsaW5rQ2xpY2tlZCgpOwotCQkJfQotCQl9KTsKLQotCQljb25maWd1cmVUYWJsZVJlc2l6aW5nKGlubmVyUGFyZW50LCB0YWJsZSwgY29sdW1uMSwgY29sdW1uMik7Ci0JCWxvYWRMYXN0U2F2ZWRQcmVmZXJlbmNlcygpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJSGVscENvbnRleHRJZHMuSFRNTF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlzZXRDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcywgY29uZmlndXJlcyBhbmQgcmV0dXJucyBhIHNvdXJjZSB2aWV3ZXIgdG8gcHJlc2VudCB0aGUgdGVtcGxhdGUKLQkgKiBwYXR0ZXJuIG9uIHRoZSBwcmVmZXJlbmNlIHBhZ2UuIENsaWVudHMgbWF5IG92ZXJyaWRlIHRvIHByb3ZpZGUgYQotCSAqIGN1c3RvbSBzb3VyY2Ugdmlld2VyIGZlYXR1cmluZyBlLmcuIHN5bnRheCBjb2xvcmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJlZCBzb3VyY2Ugdmlld2VyCi0JICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQkJfTsKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlcihwYXJlbnQsIG51bGwsIG51bGwsIGZhbHNlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJdmlld2VyLmdldFRleHRXaWRnZXQoKS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUoc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZG9DcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV81KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gY3JlYXRlVmlld2VyKHBhcmVudCk7Ci0JCXZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJQ29udHJvbCBjb250cm9sID0gdmlld2VyLmdldENvbnRyb2woKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJLy8gWzI2MTI3NF0gLSBzb3VyY2Ugdmlld2VyIHdhcyBncm93aW5nIHRvIGZpdCB0aGUgbWF4IGxpbmUgd2lkdGggb2YgdGhlIHRlbXBsYXRlCi0JCWRhdGEud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDIpOwotCQljb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUvZGlzYWJsZSBjb250cm9scyBpbiBwYWdlIGJhc2VkIG9uIGZVc2VUZW1wbGF0ZUJ1dHRvbidzIGN1cnJlbnQKLQkgKiBzdGF0ZS4KLQkgKi8KLQl2b2lkIGVuYWJsZVRlbXBsYXRlcygpIHsKLQkJYm9vbGVhbiBlbmFibGVkID0gZlVzZVRlbXBsYXRlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCi0JCWlmICghZW5hYmxlZCkgewotCQkJLy8gc2F2ZSBsYXN0IHNlbGVjdGVkIHRlbXBsYXRlCi0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJCWlmICh0ZW1wbGF0ZSAhPSBudWxsKQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQllbHNlCi0JCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRTZWxlY3RlZFRlbXBsYXRlKGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUpOwotCQl9Ci0KLQkJZlRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmUGF0dGVyblZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRlbXBsYXRlIHByZWZlcmVuY2UgcGFnZSBpZAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlkKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnRlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZSBnZXRTZWxlY3RlZFRlbXBsYXRlKCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCXRlbXBsYXRlID0gKFRlbXBsYXRlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHRlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGVtcGxhdGUgc3RyaW5nIHRvIGluc2VydC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0byBpbnNlcnQgb3IgbnVsbCBpZiBub25lIGlzIHRvIGJlIGluc2VydGVkCi0JICovCi0JU3RyaW5nIGdldFRlbXBsYXRlU3RyaW5nKCkgewotCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBudWxsOwotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJVGVtcGxhdGVDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA9IEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKS5nZXRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5ORVcpOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERvY3VtZW50KCk7Ci0JCQlUZW1wbGF0ZUNvbnRleHQgY29udGV4dCA9IG5ldyBEb2N1bWVudFRlbXBsYXRlQ29udGV4dChjb250ZXh0VHlwZSwgZG9jdW1lbnQsIDAsIDApOwotCQkJdHJ5IHsKLQkJCQlUZW1wbGF0ZUJ1ZmZlciBidWZmZXIgPSBjb250ZXh0LmV2YWx1YXRlKHRlbXBsYXRlKTsKLQkJCQl0ZW1wbGF0ZVN0cmluZyA9IGJ1ZmZlci5nZXRTdHJpbmcoKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJDb3VsZCBub3QgY3JlYXRlIHRlbXBsYXRlIGZvciBuZXcgaHRtbCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGVtcGxhdGVTdHJpbmc7Ci0JfQotCi0Jdm9pZCBsaW5rQ2xpY2tlZCgpIHsKLQkJU3RyaW5nIHBhZ2VJZCA9IGdldFByZWZlcmVuY2VQYWdlSWQoKTsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIHBhZ2VJZCwgbmV3IFN0cmluZ1tde3BhZ2VJZH0sIG51bGwpOwotCQlkaWFsb2cub3BlbigpOwotCQlmVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGxhc3QgdGVtcGxhdGUgbmFtZSB1c2VkIGluIE5ldyBIVE1MIEZpbGUgd2l6YXJkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKSB7Ci0JCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIHNldFNlbGVjdGlvbiA9IGZhbHNlOwotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUpOwotCQlpZiAodGVtcGxhdGVOYW1lID09IG51bGwgfHwgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCXRlbXBsYXRlTmFtZSA9IEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9JRCk7Ci0JCQlpZiAodGVtcGxhdGVOYW1lICE9IG51bGwgJiYgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gZlRlbXBsYXRlU3RvcmUuZmluZFRlbXBsYXRlQnlJZCh0ZW1wbGF0ZU5hbWUpOwotCQkJCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQkJCXNldFNlbGVjdGlvbiA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlTmFtZTsKLQkJCXNldFNlbGVjdGlvbiA9IHRydWU7Ci0JCX0KLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbihzZXRTZWxlY3Rpb24pOwotCQllbmFibGVUZW1wbGF0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRlbXBsYXRlIG5hbWUgdXNlZCBmb3IgbmV4dCBjYWxsIHRvIE5ldyBIVE1MIEZpbGUgd2l6YXJkLgotCSAqLwotCXZvaWQgc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCXRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJfQotCi0JCUhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUsIHRlbXBsYXRlTmFtZSk7Ci0JCUhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IGEgdGVtcGxhdGUgaW4gdGhlIHRhYmxlIHZpZXdlciBnaXZlbiB0aGUgdGVtcGxhdGUgbmFtZS4gSWYKLQkgKiB0ZW1wbGF0ZSBuYW1lIGNhbm5vdCBiZSBmb3VuZCBvciB0ZW1wbGF0ZU5hbWUgaXMgbnVsbCwganVzdCBzZWxlY3QKLQkgKiBmaXJzdCBpdGVtIGluIHRhYmxlLiBJZiBubyBpdGVtcyBpbiB0YWJsZSBzZWxlY3Qgbm90aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gdGVtcGxhdGVOYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkVGVtcGxhdGUoU3RyaW5nIHRlbXBsYXRlTmFtZSkgewotCQlPYmplY3QgdGVtcGxhdGUgPSBudWxsOwotCi0JCWlmICh0ZW1wbGF0ZU5hbWUgIT0gbnVsbCAmJiB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBwaWNrIHRoZSBsYXN0IHVzZWQgdGVtcGxhdGUKLQkJCXRlbXBsYXRlID0gZlRlbXBsYXRlU3RvcmUuZmluZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuTkVXKTsKLQkJfQotCi0JCS8vIG5vIHJlY29yZCBvZiBsYXN0IHVzZWQgdGVtcGxhdGUgc28ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJaWYgKHRlbXBsYXRlID09IG51bGwpIHsKLQkJCS8vIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCQl0ZW1wbGF0ZSA9IGZUYWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCk7Ci0JCX0KLQotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGVtcGxhdGUpOwotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgcGF0dGVybiB2aWV3ZXIuCi0JICovCi0Jdm9pZCB1cGRhdGVWaWV3ZXJJbnB1dCgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0hUTUxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjNTJmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLkhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSFRNTEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi1wdWJsaWMgY2xhc3MgTmV3SFRNTFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCQotCXByaXZhdGUgTmV3SFRNTEZpbGVXaXphcmRQYWdlIGZOZXdGaWxlUGFnZTsKLQlwcml2YXRlIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlIGZOZXdGaWxlVGVtcGxhdGVzUGFnZTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJZk5ld0ZpbGVQYWdlID0gbmV3IE5ld0hUTUxGaWxlV2l6YXJkUGFnZSgiSFRNTFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UiLCBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihJREUuY29tcHV0ZVNlbGVjdGVkUmVzb3VyY2VzKGZTZWxlY3Rpb24pKSk7IC8vJE5PTi1OTFMtMSQKLQkJZk5ld0ZpbGVQYWdlLnNldFRpdGxlKEhUTUxVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX0hFQURJTkcpOwotCQlmTmV3RmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oSFRNTFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT04pOwotCQlhZGRQYWdlKGZOZXdGaWxlUGFnZSk7Ci0KLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlID0gbmV3IE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlKCk7Ci0JCWFkZFBhZ2UoZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYXBwbHlMaW5lRGVsaW1pdGVyKElGaWxlIGZpbGUsIFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0U3RyaW5nKFBsYXRmb3JtLlBJX1JVTlRJTUUsIFBsYXRmb3JtLlBSRUZfTElORV9TRVBBUkFUT1IsIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSwgbmV3IElTY29wZUNvbnRleHRbXSB7bmV3IFByb2plY3RTY29wZShmaWxlLmdldFByb2plY3QoKSksIG5ldyBJbnN0YW5jZVNjb3BlKCkgfSk7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UodGV4dCwgIlxyXG4iLCAiXG4iKTsKLQkJY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoY29udmVydGVkVGV4dCwgIlxyIiwgIlxuIik7Ci0JCWNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKGNvbnZlcnRlZFRleHQsICJcbiIsIGxpbmVEZWxpbWl0ZXIpOwotCQlyZXR1cm4gY29udmVydGVkVGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggYVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCQlmU2VsZWN0aW9uID0gYVNlbGVjdGlvbjsKLQkJc2V0V2luZG93VGl0bGUoSFRNTFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9ORVdfVElUTEUpOwotCi0JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX1dJWkJBTl9ORVdIVE1MRklMRSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuRWRpdG9yKGZpbmFsIElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlLCB0cnVlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlib29sZWFuIHBlcmZvcm1lZE9LID0gZmFsc2U7Ci0JCS8vIHNhdmUgdXNlciBvcHRpb25zIGZvciBuZXh0IHVzZQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2Uuc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGFkZCBkZWZhdWx0IGV4dGVuc2lvbgotCQlTdHJpbmcgZmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGZOZXdGaWxlUGFnZS5hZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCWZOZXdGaWxlUGFnZS5zZXRGaWxlTmFtZShuZXdGaWxlTmFtZSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSBuZXcgZW1wdHkgZmlsZQotCQlJRmlsZSBmaWxlID0gZk5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQkvLyBpZiB0aGVyZSB3YXMgcHJvYmxlbSB3aXRoIGNyZWF0aW5nIGZpbGUsIGl0IHdpbGwgYmUgbnVsbCwgc28gbWFrZQotCQkvLyBzdXJlIHRvIGNoZWNrCi0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCS8vIHB1dCB0ZW1wbGF0ZSBjb250ZW50cyBpbnRvIGZpbGUKLQkJCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IGZOZXdGaWxlVGVtcGxhdGVzUGFnZS5nZXRUZW1wbGF0ZVN0cmluZygpOwotCQkJaWYgKHRlbXBsYXRlU3RyaW5nICE9IG51bGwpIHsKLQkJCQl0ZW1wbGF0ZVN0cmluZyA9IGFwcGx5TGluZURlbGltaXRlcihmaWxlLCB0ZW1wbGF0ZVN0cmluZyk7Ci0JCQkJLy8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZyBmb3IgdGhlIG5ldyBmaWxlCi0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJCVN0cmluZyBjaGFyU2V0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCi0JCQkJdHJ5IHsKLQkJCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dFN0cmVhbVdyaXRlciA9IG51bGw7Ci0JCQkJCWlmIChjaGFyU2V0ID09IG51bGwgfHwgY2hhclNldC50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBqdXN0IHVzZSBkZWZhdWx0IGVuY29kaW5nCi0JCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSwgY2hhclNldCk7Ci0JCQkJCX0KLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLndyaXRlKHRlbXBsYXRlU3RyaW5nKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci5jbG9zZSgpOwotCQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKSk7Ci0JCQkJCWZpbGUuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0sIHRydWUsIGZhbHNlLCBudWxsKTsKLQkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJDb3VsZCBub3QgY3JlYXRlIGNvbnRlbnRzIGZvciBuZXcgSFRNTCBmaWxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG9wZW4gdGhlIGZpbGUgaW4gZWRpdG9yCi0JCQlvcGVuRWRpdG9yKGZpbGUpOwotCi0JCQkvLyBldmVyeXRoaW5nJ3MgZmluZQotCQkJcGVyZm9ybWVkT0sgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBwZXJmb3JtZWRPSzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvdmlld3MvY29udGVudG91dGxpbmUvSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvdmlld3MvY29udGVudG91dGxpbmUvSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjE0MjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0hUTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5IVE1MTm9kZUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5YTUxOb2RlQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLlhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBvdXRsaW5lIHZpZXcgcGFnZSB3aGljaCBzaG93cyBIVE1MIGNvbnRlbnQuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBYTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gewotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBIVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIEhUTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhNTE5vZGVBY3Rpb25NYW5hZ2VyIGNyZWF0ZU5vZGVBY3Rpb25NYW5hZ2VyKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlyZXR1cm4gbmV3IEhUTUxOb2RlQWN0aW9uTWFuYWdlcigoSVN0cnVjdHVyZWRNb2RlbCkgdHJlZVZpZXdlci5nZXRJbnB1dCgpLCB0cmVlVmlld2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3RlbXBsYXRlcy9odG1sZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvdGVtcGxhdGVzL2h0bWxkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmExYzYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvdGVtcGxhdGVzL2h0bWxkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEJlbmphbWluIE11c2thbGxhLCBiLm11c2thbGxhQGdteC5uZXQgLSBbMTU2MDQwXSBubyBuZXcgaHRtbCB0ZW1wbGF0ZSBmb3IgeGh0bWwgMS4wIHN0cmljdAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVGVtcGxhdGVzLmNvbW1lbnQubmFtZT1jb21tZW50Ci1UZW1wbGF0ZXMuY29tbWVudC5kZXNjPWNvbW1lbnQKLVRlbXBsYXRlcy51bC5uYW1lPXVsCi1UZW1wbGF0ZXMudWwuZGVzYz11bm9yZGVyZWQgbGlzdAotVGVtcGxhdGVzLnVsLmNvbnRlbnQ9PHVsPlxuICA8bGk+IEl0ZW0gb25lIDwvbGk+XG4gIDxsaT4gSXRlbSB0d28gPC9saT5cbjwvdWw+XG4KLVRlbXBsYXRlcy5kbC5uYW1lPWRsCi1UZW1wbGF0ZXMuZGwuZGVzYz1kZWZpbml0aW9uIGxpc3QKLVRlbXBsYXRlcy5kbC5jb250ZW50PTxkbD5cbiAgPGR0PiBGaXJzdCBkZWZpbml0aW9uPC9kdD4gIDxkZD4gIEZpcnN0IGV4cGxhbmF0aW9uPC9kZD5cbiAgPGR0PiBTZWNvbmQgZGVmaW5pdGlvbjwvZHQ+IDxkZD4gU2Vjb25kIGV4cGxhbmF0aW9uPC9kZD5cbjwvZGw+XG4KLVRlbXBsYXRlcy50YWJsZS5uYW1lPXRhYmxlCi1UZW1wbGF0ZXMudGFibGUuZGVzYz10YWJsZQotVGVtcGxhdGVzLnRhYmxlLmNvbnRlbnQ9PHRhYmxlPlxuICA8dHI+XG4gICAgPHRoPkNvbHVtbiAxIEhlYWRpbmc8L3RoPlxuICAgIDx0aD5Db2x1bW4gMiBIZWFkaW5nPC90aD5cbiAgPC90cj5cbiAgPHRyPlxuICAgIDx0ZD5Sb3cgMTogQ29sIDE8L3RkPlxuICAgIDx0ZD5Sb3cgMTogQ29sIDI8L3RkPlxuICA8L3RyPlxuPC90YWJsZT5cbgotVGVtcGxhdGVzLm9sLm5hbWU9b2wKLVRlbXBsYXRlcy5vbC5kZXNjPW9yZGVyZWQgbGlzdAotVGVtcGxhdGVzLm9sLmNvbnRlbnQ9PG9sPlxuICA8bGk+IEl0ZW0gb25lIDwvbGk+XG4gIDxsaT4gSXRlbSB0d28gPC9saT5cbjwvb2w+XG4KLVRlbXBsYXRlcy5odG1sLm5hbWU9TmV3IEhUTUwgRmlsZSAoNC4wMSB0cmFuc2l0aW9uYWwpCi1UZW1wbGF0ZXMuaHRtbC5kZXNjPWh0bWwgNC4wMSB0cmFuc2l0aW9uYWwKLVRlbXBsYXRlcy5odG1sLmNvbnRlbnQ9PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+XG48aHRtbD5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iPlxuPHRpdGxlPkluc2VydCB0aXRsZSBoZXJlPC90aXRsZT5cbjwvaGVhZD5cbjxib2R5PlxuJHtjdXJzb3J9XG48L2JvZHk+XG48L2h0bWw+Ci1UZW1wbGF0ZXMuaHRtbGZyYW1lc2V0Lm5hbWU9TmV3IEhUTUwgRmlsZSAoNC4wMSBmcmFtZXNldCkKLVRlbXBsYXRlcy5odG1sZnJhbWVzZXQuZGVzYz1odG1sIDQuMDEgZnJhbWVzZXQKLVRlbXBsYXRlcy5odG1sZnJhbWVzZXQuY29udGVudD08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9mcmFtZXNldC5kdGQiPlxuPGh0bWw+XG48aGVhZD5cbjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9Ij5cbjx0aXRsZT5JbnNlcnQgdGl0bGUgaGVyZTwvdGl0bGU+XG48L2hlYWQ+XG48ZnJhbWVzZXQ+XG4gICAgPGZyYW1lPlxuICAgIDxmcmFtZT5cbiAgICA8bm9mcmFtZXM+XG4gICAgPGJvZHk+XG4gICAgPHA+VGhpcyBwYWdlIHVzZXMgZnJhbWVzLiBUaGUgY3VycmVudCBicm93c2VyIHlvdSBhcmUgdXNpbmcgZG9lcyBub3Qgc3VwcG9ydCBmcmFtZXMuPC9wPlxuICAgIDwvYm9keT5cbiAgICA8L25vZnJhbWVzPlxuPC9mcmFtZXNldD5cbjwvaHRtbD4KLVRlbXBsYXRlcy5odG1sc3RyaWN0Lm5hbWU9TmV3IEhUTUwgRmlsZSAoNC4wMSBzdHJpY3QpCi1UZW1wbGF0ZXMuaHRtbHN0cmljdC5kZXNjPWh0bWwgNC4wMSBzdHJpY3QKLVRlbXBsYXRlcy5odG1sc3RyaWN0LmNvbnRlbnQ9PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPlxuPGh0bWw+XG48aGVhZD5cbjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9Ij5cbjx0aXRsZT5JbnNlcnQgdGl0bGUgaGVyZTwvdGl0bGU+XG48L2hlYWQ+XG48Ym9keT5cbiR7Y3Vyc29yfVxuPC9ib2R5PlxuPC9odG1sPgotVGVtcGxhdGVzLnhodG1sLm5hbWU9TmV3IFhIVE1MIEZpbGUgKDEuMCB0cmFuc2l0aW9uYWwpCi1UZW1wbGF0ZXMueGh0bWwuZGVzYz14aHRtbCAxLjAgdHJhbnNpdGlvbmFsCi1UZW1wbGF0ZXMueGh0bWwuY29udGVudD08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIke2VuY29kaW5nfSIgPz5cbjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj5cbjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iIC8+XG48dGl0bGU+SW5zZXJ0IHRpdGxlIGhlcmU8L3RpdGxlPlxuPC9oZWFkPlxuPGJvZHk+XG4ke2N1cnNvcn1cbjwvYm9keT5cbjwvaHRtbD4KLVRlbXBsYXRlcy54aHRtbGZyYW1lc2V0Lm5hbWU9TmV3IFhIVE1MIEZpbGUgKDEuMCBmcmFtZXNldCkKLVRlbXBsYXRlcy54aHRtbGZyYW1lc2V0LmRlc2M9eGh0bWwgMS4wIGZyYW1lc2V0Ci1UZW1wbGF0ZXMueGh0bWxmcmFtZXNldC5jb250ZW50PTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9IiA/PlxuPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgRnJhbWVzZXQvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtZnJhbWVzZXQuZHRkIj5cbjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iIC8+XG48dGl0bGU+SW5zZXJ0IHRpdGxlIGhlcmU8L3RpdGxlPlxuPC9oZWFkPlxuPGZyYW1lc2V0PlxuICAgIDxmcmFtZSAvPlxuICAgIDxmcmFtZSAvPlxuICAgIDxub2ZyYW1lcz5cbiAgICA8Ym9keT5cbiAgICA8cD5UaGlzIHBhZ2UgdXNlcyBmcmFtZXMuIFRoZSBjdXJyZW50IGJyb3dzZXIgeW91IGFyZSB1c2luZyBkb2VzIG5vdCBzdXBwb3J0IGZyYW1lcy48L3A+XG4gICAgPC9ib2R5PlxuICAgIDwvbm9mcmFtZXM+XG48L2ZyYW1lc2V0PlxuPC9odG1sPgotVGVtcGxhdGVzLnhodG1sc3RyaWN0Lm5hbWU9TmV3IFhIVE1MIEZpbGUgKDEuMCBzdHJpY3QpCi1UZW1wbGF0ZXMueGh0bWxzdHJpY3QuZGVzYz14aHRtbCAxLjAgc3RyaWN0Ci1UZW1wbGF0ZXMueGh0bWxzdHJpY3QuY29udGVudD08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIke2VuY29kaW5nfSIgPz5cbjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj5cbjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iIC8+XG48dGl0bGU+SW5zZXJ0IHRpdGxlIGhlcmU8L3RpdGxlPlxuPC9oZWFkPlxuPGJvZHk+XG4ke2N1cnNvcn1cbjwvYm9keT5cbjwvaHRtbD4KLVRlbXBsYXRlcy5zY3JpcHQubmFtZT1zY3JpcHQKLVRlbXBsYXRlcy5zY3JpcHQuZGVzYz1zY3JpcHQgICAgIChjb21tZW50ZWQpCi1UZW1wbGF0ZXMuc2NyaXB0LmNvbnRlbnQ9PHNjcmlwdCB0eXBlPVwiJHtjdXJzb3J9dGV4dC9qYXZhc2NyaXB0XCI+XG48IS0tXG5cbi8vLS0+XG48L3NjcmlwdD4KLVRlbXBsYXRlcy5zdHlsZS5uYW1lPXN0eWxlCi1UZW1wbGF0ZXMuc3R5bGUuZGVzYz1zdHlsZSAgICAgKGNvbW1lbnRlZCkKLVRlbXBsYXRlcy5zdHlsZS5jb250ZW50PTxzdHlsZT5cbjwhLS1cbiR7Y3Vyc29yfVxuLS0+XG48L3N0eWxlPgotVGVtcGxhdGVzLmltZ21hcC5uYW1lPWltZwotVGVtcGxhdGVzLmltZ21hcC5kZXNjPWltZyAgICAgKG1hcCkKLVRlbXBsYXRlcy5odG1sNS5uYW1lPU5ldyBIVE1MIEZpbGUgKDUpCi1UZW1wbGF0ZXMuaHRtbDUuZGVzYz1odG1sIDUKLVRlbXBsYXRlcy5odG1sNS5jb250ZW50PTwhRE9DVFlQRSBodG1sPlxuPGh0bWw+XG48aGVhZD5cbjxtZXRhIGNoYXJzZXQ9IiR7ZW5jb2Rpbmd9Ij5cbjx0aXRsZT5JbnNlcnQgdGl0bGUgaGVyZTwvdGl0bGU+XG48L2hlYWQ+XG48Ym9keT5cbiR7Y3Vyc29yfVxuPC9ib2R5PlxuPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvdGVtcGxhdGVzL2h0bWxkZWZhdWx0LXRlbXBsYXRlcy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3RlbXBsYXRlcy9odG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjAwYzA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvdGVtcGxhdGVzL2h0bWxkZWZhdWx0LXRlbXBsYXRlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBCZW5qYW1pbiBNdXNrYWxsYSwgYi5tdXNrYWxsYUBnbXgubmV0IC0gWzE1NjA0MF0gbm8gbmV3IGh0bWwgdGVtcGxhdGUgZm9yIHhodG1sIDEuMCBzdHJpY3QKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPHRlbXBsYXRlcz4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuY29tbWVudC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5jb21tZW50LmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMuY29tbWVudCIgY29udGV4dD0iaHRtbF90YWciIGVuYWJsZWQ9InRydWUiPiZsdDshLS0gJHtjdXJzb3J9IC0tJmd0OzwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmltZ21hcC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5pbWdtYXAuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlbXBsYXRlcy5pbWdtYXAiIGNvbnRleHQ9Imh0bWxfdGFnIiBlbmFibGVkPSJ0cnVlIj4mbHQ7aW1nIGlzbWFwJmd0OzwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnVsLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnVsLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMudWwiIGNvbnRleHQ9Imh0bWxfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLnVsLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5kbC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5kbC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLmRsIiBjb250ZXh0PSJodG1sX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5kbC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMudGFibGUubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMudGFibGUuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlbXBsYXRlcy50YWJsZSIgY29udGV4dD0iaHRtbF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMudGFibGUuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLm9sLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLm9sLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMub2wiIGNvbnRleHQ9Imh0bWxfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLm9sLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5odG1sLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmh0bWwuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlbXBsYXRlcy5odG1sIiBjb250ZXh0PSJodG1sX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5odG1sLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5odG1sZnJhbWVzZXQubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuaHRtbGZyYW1lc2V0LmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMuaHRtbGZyYW1lc2V0IiBjb250ZXh0PSJodG1sX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5odG1sZnJhbWVzZXQuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmh0bWxzdHJpY3QubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuaHRtbHN0cmljdC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLmh0bWxzdHJpY3QiIGNvbnRleHQ9Imh0bWxfbmV3IiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmh0bWxzdHJpY3QuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnhodG1sLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnhodG1sLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMueGh0bWwiIGNvbnRleHQ9Imh0bWxfbmV3IiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLnhodG1sLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy54aHRtbGZyYW1lc2V0Lm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnhodG1sZnJhbWVzZXQuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlbXBsYXRlcy54aHRtbGZyYW1lc2V0IiBjb250ZXh0PSJodG1sX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy54aHRtbGZyYW1lc2V0LmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy54aHRtbHN0cmljdC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy54aHRtbHN0cmljdC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLnhodG1sc3RyaWN0IiBjb250ZXh0PSJodG1sX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy54aHRtbHN0cmljdC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuc2NyaXB0Lm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnNjcmlwdC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLnNjcmlwdCIgY29udGV4dD0iaHRtbF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuc2NyaXB0LmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5zdHlsZS5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5zdHlsZS5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLnN0eWxlIiBjb250ZXh0PSJodG1sX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5zdHlsZS5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuaHRtbDUubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuaHRtbDUuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlbXBsYXRlcy5odG1sNSIgY29udGV4dD0iaHRtbF9uZXciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuaHRtbDUuY29udGVudDwvdGVtcGxhdGU+Ci0KLTwvdGVtcGxhdGVzPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjE2NWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYzUwNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnPXRydWUKLW9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL3RyYWNlZmlsdGVyPQotb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanNpbmRleG1hbmFnZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzdHJhbnNsYXRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzdHJhbnNsYXRpb25zdG9kaXNrPWZhbHNlCi1vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc3NlYXJjaD1mYWxzZQotCi1vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS90YWdsaWIvcmVzb2x2ZT1mYWxzZQotCi1vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc2phdmFtYXBwaW5nPWZhbHNlCi0KLW9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzdmFsaWRhdG9yPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyY2I4NzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwNzIxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLSNXZWQgT2N0IDI0IDE5OjQ5OjQ1IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTFkMDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSNXZWQgT2N0IDI0IDE5OjQxOjMxIEVEVCAyMDA3Ci1jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLWNsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz1mYWxzZQotY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLWNsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLWNsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLWNsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPWZhbHNlCi1jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9dHJ1ZQotY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLWNsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPWZhbHNlCi1jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLWNsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLWNsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1jbGVhbnVwLnVzZV9ibG9ja3M9dHJ1ZQotY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLWNsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1jbGVhbnVwX3Byb2ZpbGU9X1NTRSBUZWFtIFN0eWxlcwotY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKLW9yZy5lY2xpcHNlLmpkdC51aS5nZXR0ZXJzZXR0ZXIudXNlLmlzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5rZXl3b3JkdGhpcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LnVpLm92ZXJyaWRlYW5ub3RhdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUyMmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNNb24gQXByIDE3IDAyOjAxOjMzIEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YWZkNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNDAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSnNDb3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdDsKLSAgdXNlczo9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLAotICAgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZSwKLSAgIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUsCi0gICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbiwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLnRleHQKLUltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS51dGlsOyB2ZXJzaW9uPSIzLjgiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycztidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjUwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS41MDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjQwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjEwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS40LjAsMi4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5O2V4Y2x1ZGU6PSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0IgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNDI2OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwKLSAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9jb21wb25lbnQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDY2YWMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYiI+Ci0JPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLnRhZ2xpYiIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IklKYXJSZWNvcmQiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0JCTwhLS0gPHR5cGUgbmFtZT0iSVRhZ0RpclJlY29yZCIgaW1wbGVtZW50PSJmYWxzZSIgLz4gLS0+Ci0JCTwhLS0gPHR5cGUgbmFtZT0iSVRhZ2xpYkluZGV4TGlzdGVuZXIiIGltcGxlbWVudD0idHJ1ZSIgLz4gLS0+Ci0JCTx0eXBlIG5hbWU9IklUYWdsaWJEZXNjcmlwdG9yIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotCQk8dHlwZSBuYW1lPSJJVGFnbGliUmVjb3JkIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotCQk8IS0tIDx0eXBlIG5hbWU9IklUYWdsaWJSZWNvcmRFdmVudCIgaW1wbGVtZW50PSJmYWxzZSIgLz4gLS0+Ci0JCTx0eXBlIG5hbWU9IklUTERSZWNvcmQiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0JCTx0eXBlIG5hbWU9IklVUkxSZWNvcmQiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0JCTx0eXBlIG5hbWU9IlRhZ2xpYkluZGV4IiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IkpTUENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW5mb3BvcCIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy93ZWJ0b29scy9qc3QvY29tcG9uZW50cy9qc3Avb3ZlcnZpZXcuaHRtbCIgLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTI3YjJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9IEphdmFTY3JpcHQgU3VwcG9ydAotcHJvdmlkZXJOYW1lPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotQnVuZGxlLU5hbWUuMCA9IEpTRFQgV2ViIFN1cHBvcnQgQ29yZSAKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi1leHRlbnNpb24ubmFtZS4wID0gSmF2YVNjcmlwdCBFbWJlZGRlZAotZXh0ZW5zaW9uLm5hbWUuMSA9IEVtYmVkZGVkIEphdmFTY3JpcHQgQnVpbGRlcgotZXh0ZW5zaW9uLXBvaW50Lm5hbWUuMCA9IEphdmFTY3JpcHQgUHJlIFByb2Nlc3NpbmcKLWphdmFzY3JpcHQudmFsaWRhdG9yPSBDbGllbnQtc2lkZSBKYXZhU2NyaXB0Ci1mYWNldC5sYWJlbD1KYXZhU2NyaXB0Ci1mYWNldC5kZXNjcmlwdGlvbj1FbmFibGVzIEphdmFTY3JpcHQgZGV2ZWxvcG1lbnQgdXNpbmcgbXVsdGlwbGUgc291cmNlIGZpbGVzIGluIGEgY29uZmlndXJhYmxlIEluY2x1ZGUgUGF0aC4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzM5M2Y4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImphdmFzY3JpcHRQcmVQcm9jZXNzb3IiIG5hbWU9IiVleHRlbnNpb24tcG9pbnQubmFtZS4wIiBzY2hlbWE9InNjaGVtYS9qYXZhc2NyaXB0UHJlUHJvY2Vzc29yLmV4c2QiLz4KLSAgIAotICAgPCEtLSBGdWxsIGJsb3duIEpTRFQgRkFDRVQgLS0+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotICAgCQk8cHJvamVjdC1mYWNldCBpZD0id3N0LmpzZHQud2ViIj4KLQkJCTxsYWJlbD4lZmFjZXQubGFiZWw8L2xhYmVsPgotCSAgCSAJPGRlc2NyaXB0aW9uPiVmYWNldC5kZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0JICAJICAJPGRlZmF1bHQtdmVyc2lvbiB2ZXJzaW9uPSIxLjAiLz4KLQkJPC9wcm9qZWN0LWZhY2V0PgotCQotCQk8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJ3c3QuanNkdC53ZWIiIHZlcnNpb249IjEuMCIgLz4KLQkKLQkJPGFjdGlvbiBmYWNldD0id3N0LmpzZHQud2ViIiB0eXBlPSJpbnN0YWxsIiBpZD0id3N0LmpzZHQud2ViLmluc3RhbGwiIHZlcnNpb249IjEuMCI+Ci0JICAgCQk8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3QuSnNOYXR1cmVJbnN0YWxsZXIiLz4KLQkJPC9hY3Rpb24+Ci0JCi0JCTxhY3Rpb24gZmFjZXQ9IndzdC5qc2R0LndlYiIgdHlwZT0idW5pbnN0YWxsIiBpZD0id3N0LmpzZHQud2ViLnVuaW5zdGFsbCIgdmVyc2lvbj0iMS4wIj4KLQkJCTxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5Kc05hdHVyZVVuaW5zdGFsbGVyIi8+Ci0JCTwvYWN0aW9uPgotCQotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLQkgIDxzdXBwb3J0ZWQ+Ci0JICAgIDxmYWNldCBpZD0id3N0LmpzZHQud2ViIi8+Ci0JICAgIDxydW50aW1lLWNvbXBvbmVudCBhbnk9InRydWUiLz4KLQkgIDwvc3VwcG9ydGVkPgotCi0JPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHRQcmVQcm9jZXNzb3IiPgotICAgCQk8amF2YXNjcmlwdFByZVByb2Nlc3NvcgotICAgCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbiIKLSAgIAkJCXByaW9yaXR5PSIxIiAvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDwhLS0gSW5zdGFsbCBIYW5kbGVyIGZvciB3ZWIgSlNEVC4uIFBpZ2d5YmFja3Mgb24gd3N0LndlYi9qc3Qud2ViIGZhY2V0LS0+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saXN0ZW5lcnMiPgotICAgICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0LkZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIiIGV2ZW50VHlwZXM9IlBPU1RfSU5TVEFMTCIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgPCEtLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLSAgIAotCQk8ZXZlbnQtaGFuZGxlciBmYWNldD0id3N0LndlYiIgdHlwZT0iUE9TVF9JTlNUQUxMIiB2ZXJzaW9uPSJbMS4wIj4KLQkgICAJCTxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5Kc05hdHVyZUluc3RhbGxlciIvPgotCQk8L2V2ZW50LWhhbmRsZXI+Ci0JCi0JCTxldmVudC1oYW5kbGVyIGZhY2V0PSJ3c3Qud2ViIiB0eXBlPSJQT1NUX1VOSU5TVEFMTCIgdmVyc2lvbj0iWzEuMCI+Ci0JCQk8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3QuSnNOYXR1cmVVbmluc3RhbGxlciIvPgotCQk8L2V2ZW50LWhhbmRsZXI+Ci0KLQk8L2V4dGVuc2lvbj4KLQktLT4KLQk8IS0tIHJlbW92ZWQgZHVlIHRvIEpVbml0IGZhaWx1cmVzIGR1cmluZyBpbml0aWFsIFdUUCBidWlsZAotCSAgIDxleHRlbnNpb24gaWQ9ImVtYmVkZWQuanNOYXR1cmUiIG5hbWU9IiVleHRlbnNpb24ubmFtZS4wIiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmF0dXJlcyI+IAotCQkgICA8cnVudGltZT4gICAgICAgICAgCi0JCSAgIAk8cnVuIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0LkpzV2ViTmF0dXJlIi8+ICAgICAgIAotCQkgICA8L3J1bnRpbWU+ICAgICAgIAotCSAJICAgPGJ1aWxkZXIgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmVtYmVkZWQuamF2YXNjcmlwdCIvPiAgICAKLQkgICA8L2V4dGVuc2lvbj4gCi0JLS0+ICAgCi0KLQkgICAJPCEtLSAKLQkgICAJTm90IHVzaW5nIHRoaXMgYXQgdGhlIG1vbWVudCwgYnV0IGV2ZXJ5dGhpbmdzIGluIHBsYWNlIGlmIHdlIG5lZWQgaW4gdGhlIGZ1dHVyZS4gCi0JICAgIC0tPiAgCi0JICAgCi0JICAgPGV4dGVuc2lvbiBpZD0iZW1iZWRlZC5qYXZhc2NyaXB0IiBuYW1lPSIlZXh0ZW5zaW9uLm5hbWUuMSIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmJ1aWxkZXJzIj4gICAgICAgCi0JCSAgIAk8YnVpbGRlciBoYXNOYXR1cmU9InRydWUiIGNhbGxPbkVtcHR5RGVsdGE9InRydWUiPgkJICAgCSAgICAgIAotCQkgICAJPHJ1biBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSW5jcmVtZW50YWxCdWlsZGVyIi8+ICAgICAgCi0JCSAgIDwvYnVpbGRlcj4gICAgCi0JICAgPC9leHRlbnNpb24+Ci0KLQkKLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIEpTIGJhdGNoIHZhbGlkYXRpb24gaW4gV2ViIGZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uCi0JCWlkPSJKc0JhdGNoVmFsaWRhdG9yIgotCQluYW1lPSIlamF2YXNjcmlwdC52YWxpZGF0b3IiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiI+Ci0gICAgICA8dmFsaWRhdG9yCi0gICAgICAgICAgICBidWlsZD0iZmFsc2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5Kc1ZhbGlkYXRvciIKLSAgICAgICAgICAgIG1hbnVhbD0iZmFsc2UiCi0gICAgICAgICAgICBzb3VyY2VpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmpzc291cmNldmFsaWRhdG9yIgotICAgICAgICAgICAgdmVyc2lvbj0iMSIKLSAgICAgICAgICAgIG1hcmtlcklkPSJvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnByb2JsZW0iPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0JCQkJPHByb2plY3ROYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuanNOYXR1cmUiIC8+Ci0JCQk8L3J1bGVzPgotICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0JCQkJPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0iaHRtbCIvPgotCQkJCTxmaWxlZXh0IGNhc2VTZW5zaXRpdmU9ImZhbHNlIiBleHQ9InhodG1sIi8+Ci0JCQkJPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0iaHRtIi8+Ci0JCQkJPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0iaHRwbCIvPgotCQkJCTxmaWxlZXh0IGNhc2VTZW5zaXRpdmU9ImZhbHNlIiBleHQ9ImpzcCIvPgotCQkJCTxmaWxlZXh0IGNhc2VTZW5zaXRpdmU9ImZhbHNlIiBleHQ9ImpzZiIvPgotCQkJCTxmaWxlZXh0IGNhc2VTZW5zaXRpdmU9ImZhbHNlIiBleHQ9ImpzdiIvPgotCQkJCTxmaWxlZXh0IGNhc2VTZW5zaXRpdmU9ImZhbHNlIiBleHQ9Imp0cGwiLz4KLQkJCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIvPgotCQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIvPgotCQkJPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgIDxncm91cCBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnN0cnVjdHVyZWRNb2RlbEdyb3VwIi8+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5Kc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIiPgotCSAgICAgIDxKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIKLQkgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5XZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyIgotCSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC5sYXVuY2hpbmcuV2ViUHJvamVjdCI+Ci0JICAgICAgPC9Kc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXI+Ci0gIAkgPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbgotCQlpZD0id2ViU291cmNlUGF0aFByb3ZpZGVyIgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zb3VyY2VQYXRoUHJvdmlkZXIiPgotCQk8cHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3QuTW9kdWxlU291cmNlUGF0aFByb3ZpZGVyIi8+Ci0JPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc2NoZW1hL2phdmFzY3JpcHRQcmVQcm9jZXNzb3IuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc2NoZW1hL2phdmFzY3JpcHRQcmVQcm9jZXNzb3IuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJmNmYzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NjaGVtYS9qYXZhc2NyaXB0UHJlUHJvY2Vzc29yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUiIGlkPSJqYXZhc2NyaXB0UHJlUHJvY2Vzc29yIiBuYW1lPSJKYXZhU2NyaXB0IFByZSBQcm9jZXNzaW5nIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImphdmFzY3JpcHRQcmVQcm9jZXNzb3IiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iamF2YXNjcmlwdFByZVByb2Nlc3NvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb24iLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmlvcml0eSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBsb2FkaW5nIHByaW9yaXR5LiB0aGUgaGlnaGVzdCBudW1iZXIgd2lucy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL0luY3JlbWVudGFsQnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvSW5jcmVtZW50YWxCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0M2JkYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvSW5jcmVtZW50YWxCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEluY3JlbWVudGFsQnVpbGRlciBleHRlbmRzIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIgewotCXB1YmxpYyBJbmNyZW1lbnRhbEJ1aWxkZXIoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVW5pbXBsZW1lbnRlZCBtZXRob2Q6SW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcigpIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyI2J1aWxkKGludCwKLQkgKiAgICAgIGphdmEudXRpbC5NYXAsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCQotCXByb3RlY3RlZCBJUHJvamVjdFtdIGJ1aWxkKGludCBraW5kLCBNYXAgYXJncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmltcGxlbWVudGVkIG1ldGhvZDpJbmNyZW1lbnRhbEJ1aWxkZXIuYnVpbGQiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOTE4YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvSlNQQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUpTUEluZGV4TWFuYWdlcl8wPVVwZGF0aW5nIEphdmFTY3JpcHQgSW5kZXgKLUpTUEluZGV4TWFuYWdlcl8yPUphdmFTY3JpcHQgSW5kZXhlciBpbmRleGluZyB7MH0gZmlsZXMKLUpTUF9TZWFyY2g9SmF2YVNjcmlwdCBTZWFyY2ggLSAKLUpTUERvY3VtZW50TG9hZGVyXzE9UHJvZ3JhbSBFcnJvcjogc3RydWN0dXJlZCBtb2RlbCBoYWQgbm8gc3RydWN0dXJlZERvY3VtZW50Ci1KU1BFTF9TeW50YXg9RUwgU3ludGF4IEVycm9yIAotSlNQRUxfVG9rZW49VW5hYmxlIHRvIGFuYWx5c2UgRUwgZXhwcmVzc2lvbiBkdWUgdG8gbGV4aWNhbCBhbmFseXNpcyBlcnJvcgotTUVTU0FHRV9KU1BfVkFMSURBVElOR19NRVNTQUdFX1VJXz1KYXZhU2NyaXB0IFZhbGlkYXRvciB2YWxpZGF0aW5nIHswfQotSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZz1VcGRhdGluZyBKYXZhU2NyaXB0IEZyYWdtZW50IENvbnRlbnQgU2V0dGluZ3MKLUpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmc9UHJvYmxlbSBzYXZpbmcgSmF2YVNjcmlwdCBGcmFnbWVudCBDb250ZW50IFNldHRpbmdzIGZvciB7MH0KLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl8wPXswfSBpcyBhIHJlc2VydmVkIHByZWZpeC4gIFRyeSBhbm90aGVyCi1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMT1DYW5ub3QgZmluZCB0aGUgdGFnIGxpYnJhcnkgZGVzY3JpcHRvciBmb3IgezB9Ci1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMj1UaGUgcHJlZml4IHswfSBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlCi1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMz1BIHswfSB2YWx1ZSBpcyByZXF1aXJlZCBpbiB0aGlzIGRpcmVjdGl2ZQotSlNQQmF0Y2hWYWxpZGF0b3JfMD1HYXRoZXJpbmcgZmlsZXMgaW4gezB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9Kc0NvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvSnNDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg3ZmMxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9Kc0NvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc0NvcmVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQX1NlYXJjaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BCYXRjaFZhbGlkYXRvcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERvY3VtZW50TG9hZGVyXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRUxfU3ludGF4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEVMX1Rva2VuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BJbmRleE1hbmFnZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BJbmRleE1hbmFnZXJfMjsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9KU1BfVkFMSURBVElOR19NRVNTQUdFX1VJXzsKLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEpzQ29yZU1lc3NhZ2VzLkJVTkRMRV9OQU1FLCBKc0NvcmVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgSnNDb3JlTWVzc2FnZXMoKSB7fQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvSnNDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9Kc0NvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2ODAxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9Kc0NvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzSW5kZXhNYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc0NvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgSnNDb3JlUGx1Z2luIHBsdWdpbjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gd2lsbCBiZSByZW1vdmVkLiBDdXJyZW50bHkgdXNlZCB0byBnZXQgIm1vZGVsIHByZWZlcmVuY2VzIiwKLQkgKiAgICAgICAgICAgICBidXQgdGhlcmUgYXJlIG90aGVyLCBiZXR0ZXIgd2F5cy4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgSnNDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBKc0NvcmVQbHVnaW4ucGx1Z2luOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEpzQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJSnNDb3JlUGx1Z2luLnBsdWdpbiA9IHRoaXM7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJLy8gSlNQSW5kZXhNYW5hZ2VyIGRlcGVuZHMgb24gVGFnbGliQ29udHJvbGxlciwgc28gVGFnbGliQ29udHJvbGxlcgotCQkvLyBzaG91bGQgYmUgc3RhcnRlZCBmaXJzdAotCQkvLyBsaXN0ZW4gZm9yIGNsYXNzcGF0aCBjaGFuZ2VzCi0JCUpzSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkuaW5pdGlhbGl6ZSgpOwotCQkvLyBsaXN0ZW4gZm9yIHJlc291cmNlIGNoYW5nZXMgdG8gdXBkYXRlIGNvbnRlbnQgcHJvcGVydGllcyBrZXlzCi0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gc3RvcCBsaXN0ZW5uaW5nIGZvciByZXNvdXJjZSBjaGFuZ2VzIHRvIHVwZGF0ZSBjb250ZW50IHByb3BlcnRpZXMKLQkJLy8ga2V5cwotCQkvLyBzdG9wIGFueSBpbmRleGluZwotCQlKc0luZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLnNodXRkb3duKCk7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhYzQxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgTG9nZ2VyLkVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgTG9nZ2VyLklORk87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBMb2dnZXIuT0s7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgTG9nZ2VyLldBUk5JTkc7Ci0JCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gTG9nZ2VyLk9LX0RFQlVHIHx8IGxldmVsID09IExvZ2dlci5JTkZPX0RFQlVHIHx8IGxldmVsID09IExvZ2dlci5XQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IExvZ2dlci5FUlJPUl9ERUJVRykgewotCQkJaWYgKCFMb2dnZXIuaXNEZWJ1Z2dpbmcoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUc6Ci0JCQljYXNlIElORk86Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRzoKLQkJCWNhc2UgV0FSTklORzoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRzoKLQkJCWNhc2UgRVJST1I6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIExvZ2dlci5QTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKExvZ2dlci5QTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKExvZ2dlci5pc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBMb2dnZXIuUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShMb2dnZXIuUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghTG9nZ2VyLmlzRGVidWdnaW5nKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihMb2dnZXIuUExVR0lOX0lEICsgTG9nZ2VyLlRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTG9nZ2VyLl9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJTG9nZ2VyLl9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJTG9nZ2VyLl9sb2coTG9nZ2VyLkVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJTG9nZ2VyLl9sb2coTG9nZ2VyLkVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlMb2dnZXIuX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJTG9nZ2VyLl90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlMb2dnZXIuX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9JV2ViRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0lXZWJEb2N1bWVudENoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNGVkZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0lXZWJEb2N1bWVudENoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJEb2N1bWVudENoYW5nZUxpc3RlbmVyIGV4dGVuZHMgSVdlYlJlc291cmNlQ2hhbmdlZExpc3RlbmVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1JJTkcgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUlRZX0RPQyA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSVFlfTU9ERUwgPSAyOwotCQotCXB1YmxpYyBpbnQgZ2V0SW50cmVzdExldmVsQXRPZmZzZXQoaW50IGRvY3VtZW50T2Zmc2V0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9JV2ViUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9JV2ViUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4NGU4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvSVdlYlJlc291cmNlQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lciB7Ci0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODk0MzhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1dlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1dlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDY4NDNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9XZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuTW9kZWxMaWZlY3ljbGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJRG9jdW1lbnRMaXN0ZW5lciwgSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgewotCS8qCi0JICogQ2hlY2sgdGhlIGxldmVsIG9mIGRpcnR5IHJlZ2lvbnMgd2hlbiBzaWduYWxpbmcgZm9yIGRvY3VtZW50IGV2ZW50cy4KLQkgKiAKLQkgKiBzb21ldGltZXMgdGhlIFNTRSBlZGl0b3IgZG9lc24ndCByZS12YWxpZGF0ZSByZWdpb25zIHdoZW4gdGV4dCBpcwotCSAqIGluc2VydGVkLCBzbyBzZXR0aW5nIHRoaXMgdG8gZmFsc2UgY2F1c2VzIGV2ZXJ5IGRvY3VtZW50IGNoYW5nZSBldmVudCB0bwotCSAqIHRyaWdnZXIgYSByZXZhbGlkYXRpb24uCi0JICogCi0JICogc2V0dGluZyB0byB0cnVlIG1heSBzcGVlZCB0aGluZ3MgdXAuCi0JICogCi0JICovCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIENIRUNLX0lOVFJFU1RfTEVWRUwgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0lHTkFMX01PREVMID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIgZ2V0SW5zdGFuY2UoSVN0cnVjdHVyZWRNb2RlbCB4bWxNb2RlbCwgSVdlYlJlc291cmNlQ2hhbmdlZExpc3RlbmVyIGNoYW5nZUxpc3RlbmVyKSB7Ci0JCVdlYlJlc291cmNlQ2hhbmdlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzKSB7Ci0JCQlFbnVtZXJhdGlvbiB2YWx1ZXMgPSBXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzLmVsZW1lbnRzKCk7Ci0JCQl3aGlsZSAodmFsdWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJT2JqZWN0IG1vZGVsID0gdmFsdWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYgKG1vZGVsID09IHhtbE1vZGVsKSB7Ci0JCQkJCWhhbmRsZXIgPSAoV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyKSBXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzLmdldChtb2RlbCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkgewotCQkJCWhhbmRsZXIgPSBuZXcgV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyKCk7Ci0JCQkJV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcy5wdXQoaGFuZGxlciwgeG1sTW9kZWwpOwotCQkJfQotCQl9Ci0JCWhhbmRsZXIuaW5pdGlhbGl6ZSgpOwotCQloYW5kbGVyLmZjaGFuZ2VMaXN0ZW5lci5hZGQoY2hhbmdlTGlzdGVuZXIpOwotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0JcHJpdmF0ZSBjbGFzcyBNb2RlbElycml0YW50VGhyZWFkIGltcGxlbWVudHMgUnVubmFibGUgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlzaWduYWxBbGxEaXJ0eU1vZGVsKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNpZ25hbEFsbERpcnR5TW9kZWwoKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZjaGFuZ2VMaXN0ZW5lci5zaXplKCk7IGkrKykgewotCQkJCSgoSVdlYlJlc291cmNlQ2hhbmdlZExpc3RlbmVyKSBmY2hhbmdlTGlzdGVuZXIuZ2V0KGkpKS5yZXNvdXJjZUNoYW5nZWQoKTsKLQkJCX0KLQkJCWlmICghV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLlNJR05BTF9NT0RFTCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQkJT2JqZWN0IG1vZGVsUmVmID0gZ2V0TW9kZWwoKTsKLQkJCWlmIChtb2RlbFJlZiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdHJ5IHsKLS8vIGZvcihpbnQgaSA9MDtpPGZjaGFuZ2VMaXN0ZW5lci5zaXplKCk7aSsrKSB7Ci0vLyAoKElXZWJSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcilmY2hhbmdlTGlzdGVuZXIuZ2V0KGkpKS5yZXNvdXJjZUNoYW5nZWQoKTsKLS8vIH0KLQkJCQl4bWxNb2RlbCA9IChJU3RydWN0dXJlZE1vZGVsKSBtb2RlbFJlZjsvLyhJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoKChJU3RydWN0dXJlZE1vZGVsKSBtb2RlbFJlZikuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0geG1sTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl4bWxNb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCQkJLy8geG1sTW9kZWwuc2V0UmVpbml0aWFsaXplTmVlZGVkKHRydWUpOwotCQkJCQkvLyAoZG9jKS5yZXBsYWNlKDAsIGRvYy5nZXRMZW5ndGgoKSxkb2MuZ2V0KCkpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJeG1sTW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlcy5nZXRTdHJpbmcoIldlYlJlc291cmNlQ2hhbmdlSGFuZGxlci4wIikpOyAvLyROT04tTkxTLTEkCi0JCQl9IGZpbmFsbHkgewotCQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0vLwkJCQkJeG1sTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgQXJyYXlMaXN0IGZjaGFuZ2VMaXN0ZW5lciA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIE1vZGVsSXJyaXRhbnRUaHJlYWQgaXJyaXRhdG9yOwotCQotCXByaXZhdGUgV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyKCkge30KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkge30KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotLy8JCWlmIChXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuQ0hFQ0tfSU5UUkVTVF9MRVZFTCkgewotLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IGZjaGFuZ2VMaXN0ZW5lci5zaXplKCk7IGkrKykgewotLy8JCQkJT2JqZWN0IG8gPSBmY2hhbmdlTGlzdGVuZXIuZ2V0KGkpOwotLy8JCQkJaWYgKG8gaW5zdGFuY2VvZiBJV2ViRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lcikgewotLy8JCQkJCWludCBpbnRyZXN0ID0gKChJV2ViRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lcikgbykuZ2V0SW50cmVzdExldmVsQXRPZmZzZXQoZXZlbnQuZk9mZnNldCk7Ci0vLwkJCQkJc3dpdGNoIChpbnRyZXN0KSB7Ci0vLwkJCQkJCWNhc2UgSVdlYkRvY3VtZW50Q2hhbmdlTGlzdGVuZXIuRElSVFlfTU9ERUw6Ci0vLwkJCQkJCQlpcnJpdGF0b3Iuc2lnbmFsQWxsRGlydHlNb2RlbCgpOwotLy8JCQkJCQkJcmV0dXJuOwotLy8JCQkJCQljYXNlIElXZWJEb2N1bWVudENoYW5nZUxpc3RlbmVyLkRJUlRZX0RPQzoKLS8vCQkJCQkJCSgoSVdlYkRvY3VtZW50Q2hhbmdlTGlzdGVuZXIpIG8pLnJlc291cmNlQ2hhbmdlZCgpOwotLy8JCQkJCQlicmVhazsKLS8vCQkJCQl9Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfSBlbHNlIHsKLQkJCWlycml0YXRvci5zaWduYWxBbGxEaXJ0eU1vZGVsKCk7Ci0JCS8vfQotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIChvIGluc3RhbmNlb2YgV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyICYmICgoV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyKSBvKS5mY2hhbmdlTGlzdGVuZXIgPT0gdGhpcy5mY2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBmaW5hbGl6ZSgpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWlmIChXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlPYmplY3QgbyA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcykgewotCQkJbyA9IFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5pbnN0YW5jZXMuZ2V0KHRoaXMpOwotCQkJV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcy5yZW1vdmUodGhpcyk7Ci0JCX0KLQkJaWYgKG8gIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBmWE1MTW9kZWwgPSAoSVN0cnVjdHVyZWRNb2RlbCkgbzsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZkpzcERvY3VtZW50ID0gZlhNTE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKGZKc3BEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJZkpzcERvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsKCkgewotCQlpZiAoV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkTW9kZWwpIFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5pbnN0YW5jZXMuZ2V0KHRoaXMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCB4bWxNb2RlbCA9IGdldE1vZGVsKCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQkJeG1sTW9kZWwuYWRkTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcih0aGlzKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBmSnNwRG9jdW1lbnQgPSB4bWxNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKGZKc3BEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlmSnNwRG9jdW1lbnQuYWRkRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlpcnJpdGF0b3IgPSBuZXcgTW9kZWxJcnJpdGFudFRocmVhZCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcm9jZXNzUG9zdE1vZGVsRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCkgewotCQlpZiAoaXJyaXRhdG9yICE9IG51bGwpIHsKLQkJCWlycml0YXRvci5zaWduYWxBbGxEaXJ0eU1vZGVsKCk7Ci0JCX0KLQkJaWYgKFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5pbnN0YW5jZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChldmVudC5nZXRUeXBlKCkgPT0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9SRUxFQVNFRCkgewotCQkJc3luY2hyb25pemVkIChXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzKSB7Ci0JCQkJV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcy5yZW1vdmUodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJvY2Vzc1ByZU1vZGVsRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCkge30KLQkKLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCkuZXhlY3V0ZShpcnJpdGF0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNmJmNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLjA9RXJyb3Igd2hlbiB1cGRhdGluZyB0aGUgbW9kZWwuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L0NvbnZlcnRKb2IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvQ29udmVydEpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODI0MDI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvQ29udmVydEpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUudXRpbC5NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEluc3RhbGxzIHRoZSBKU0RUIGZhY2V0LCBpZiBhc2tlZCwgYW5kIHNldHRpbmcgaXQgYXMgYSAiZml4ZWQiIGZhY2V0Lg0KLSAqIA0KLSAqLw0KLWNsYXNzIENvbnZlcnRKb2IgZXh0ZW5kcyBXb3Jrc3BhY2VKb2Igew0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEpTRFRfRkFDRVQgPSAid3N0LmpzZHQud2ViIjsNCi0JcHJpdmF0ZSBJUHJvamVjdCBmUHJvamVjdDsNCi0JcHJpdmF0ZSBib29sZWFuIGZJbnN0YWxsID0gdHJ1ZTsNCi0JcHJpdmF0ZSBib29sZWFuIGZVc2VFeHBsaWNpdFdvcmtpbmdDb3B5ID0gZmFsc2U7DQotDQotCUNvbnZlcnRKb2IoSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBpbnN0YWxsLCBib29sZWFuIHVzZUV4cGxpY2l0V29ya2luZ0NvcHkpIHsNCi0JCXN1cGVyKE1lc3NhZ2VzLmNvbnZlcnRlcl9Db25maWd1cmluZ0ZvckphdmFTY3JpcHQpOw0KLQkJZlByb2plY3QgPSBwcm9qZWN0Ow0KLQkJZkluc3RhbGwgPSBpbnN0YWxsOw0KLQkJZlVzZUV4cGxpY2l0V29ya2luZ0NvcHkgPSB1c2VFeHBsaWNpdFdvcmtpbmdDb3B5Ow0KLQl9DQotDQotCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJdHJ5IHsNCi0JCQlJUHJvamVjdEZhY2V0IHByb2plY3RGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChKU0RUX0ZBQ0VUKTsNCi0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoZlByb2plY3QpOw0KLQ0KLQkJCWlmIChmYWNldGVkUHJvamVjdCAhPSBudWxsICYmIGZQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7DQotCQkJCWlmIChmSW5zdGFsbCkgew0KLQkJCQkJSVByb2plY3RGYWNldFZlcnNpb24gbGF0ZXN0VmVyc2lvbiA9IHByb2plY3RGYWNldC5nZXRMYXRlc3RWZXJzaW9uKCk7DQotCQkJCQlmYWNldGVkUHJvamVjdC5pbnN0YWxsUHJvamVjdEZhY2V0KGxhdGVzdFZlcnNpb24sIG51bGwsIG1vbml0b3IpOw0KLQkJCQl9DQotDQotDQotCQkJCWlmIChmVXNlRXhwbGljaXRXb3JraW5nQ29weSkgew0KLQkJCQkJSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgY29weSA9IGZhY2V0ZWRQcm9qZWN0LmNyZWF0ZVdvcmtpbmdDb3B5KCk7DQotCQkJCQlTZXQgZml4ZWQgPSBuZXcgSGFzaFNldChmYWNldGVkUHJvamVjdC5nZXRGaXhlZFByb2plY3RGYWNldHMoKSk7DQotCQkJCQlmaXhlZC5hZGQocHJvamVjdEZhY2V0KTsNCi0JCQkJCWNvcHkuc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKGZpeGVkKTsNCi0JCQkJCWNvcHkuY29tbWl0Q2hhbmdlcyhuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCVNldCBmaXhlZCA9IG5ldyBIYXNoU2V0KGZhY2V0ZWRQcm9qZWN0LmdldEZpeGVkUHJvamVjdEZhY2V0cygpKTsNCi0JCQkJCWlmICghZml4ZWQuY29udGFpbnMocHJvamVjdEZhY2V0KSkgew0KLQkJCQkJCWZpeGVkLmFkZChwcm9qZWN0RmFjZXQpOw0KLQkJCQkJCWZhY2V0ZWRQcm9qZWN0LnNldEZpeGVkUHJvamVjdEZhY2V0cyhmaXhlZCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsNCi0JCQkvLyB1bmtub3duIGZhY2V0IElELCBiYWQgaW5zdGFsbGF0aW9uIGNvbmZpZ3VyYXRpb24/DQotCQl9DQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOw0KLQkJfQ0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCX0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9GYWNldGVkUHJvamVjdExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L0ZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhOWFiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L0ZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3Q7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklQcm9qZWN0RmFjZXRBY3Rpb25FdmVudDsNCi0NCi1wdWJsaWMgY2xhc3MgRmFjZXRlZFByb2plY3RMaXN0ZW5lciBpbXBsZW1lbnRzIElGYWNldGVkUHJvamVjdExpc3RlbmVyIHsNCi0JZmluYWwgc3RhdGljIENvbGxlY3Rpb24gSU5URVJFU1RJTkdfRkFDRVRTID0gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W117IndzdC53ZWIiLCAianN0LndlYiJ9KTsNCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIEZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKSB7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZQ0KLQkgKiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXINCi0JICogI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy4NCi0JICogSUZhY2V0ZWRQcm9qZWN0RXZlbnQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCkgew0KLQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBPU1RfSU5TVEFMTCkgew0KLQkJCUlQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCBhY3Rpb25FdmVudCA9IChJUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQpIGV2ZW50Ow0KLQkJCWlmIChJTlRFUkVTVElOR19GQUNFVFMuY29udGFpbnMoYWN0aW9uRXZlbnQuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKSkpIHsNCi0JCQkJbmV3IENvbnZlcnRKb2IoZXZlbnQuZ2V0UHJvamVjdCgpLmdldFByb2plY3QoKSwgdHJ1ZSwgdHJ1ZSkuc2NoZWR1bGUoMTAwMCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvSnNOYXR1cmVJbnN0YWxsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvSnNOYXR1cmVJbnN0YWxsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3NzI3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L0pzTmF0dXJlSW5zdGFsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Kc0NvcmVQbHVnaW47Ci0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc05hdHVyZUluc3RhbGxlciBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCJJbnN0YWxsaW5nIEZhY2V0IGZvciBKYXZhU2NyaXB0IERldmVsb3BtZW50IFRvb2xzIiArICIuIiwgMTAwKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRyeSB7Ci0JCQlpbnN0YWxsTmF0dXJlKHByb2plY3QsIG1vbml0b3IpOwotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5zdGFsbE5hdHVyZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuZ2V0U3RyaW5nKCJKc05hdHVyZUluc3RhbGxlci4xIiksIDEwMCk7IC8vJE5PTi1OTFMtMSQKLQkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLmdldFN0cmluZygiSnNOYXR1cmVJbnN0YWxsZXIuMiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJbW9uaXRvci53b3JrZWQoMjApOwotCQkJSnNXZWJOYXR1cmUganNOYXR1cmUgPSBuZXcgSnNXZWJOYXR1cmUocHJvamVjdCwgbW9uaXRvcik7Ci0JCQltb25pdG9yLndvcmtlZCgyMCk7Ci0JCQlqc05hdHVyZS5jb25maWd1cmUoKTsKLQkJCW1vbml0b3Iud29ya2VkKDQwKTsKLQkJCQotCQkJbmV3IENvbnZlcnRKb2IocHJvamVjdCwgZmFsc2UsIHRydWUpLnNjaGVkdWxlKDEwMDApOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKc0NvcmVQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLk9LLCBNZXNzYWdlcy5nZXRTdHJpbmcoIkpzTmF0dXJlSW5zdGFsbGVyLjMiKSwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L0pzTmF0dXJlVW5pbnN0YWxsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvSnNOYXR1cmVVbmluc3RhbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTlmYzZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvSnNOYXR1cmVVbmluc3RhbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSnNDb3JlUGx1Z2luOwotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSnNOYXR1cmVVbmluc3RhbGxlciBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCJVbmluc3RhbGxpbmcgRmFjZXQgZm9yIEphdmFTY3JpcHQgRGV2ZWxvcG1lbnQgVG9vbHMiICsgIi4iLCAxMDApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdHJ5IHsKLQkJCXVuaW5zdGFsbE5hdHVyZShwcm9qZWN0LCBtb25pdG9yKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbE5hdHVyZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuZ2V0U3RyaW5nKCJKc05hdHVyZVVuaW5zdGFsbGVyLjEiKSwgMTAwKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBieSB1c2luZyBuYXR1cmVzIHdlIGNhbiBsZXZlcmFnZSB0aGUgcHJlY29uZGl0aW9uIHN1cHBvcnQKLQkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLmdldFN0cmluZygiSnNOYXR1cmVVbmluc3RhbGxlci4yIikpOyAvLyROT04tTkxTLTEkCi0JCWlmICghSnNXZWJOYXR1cmUuaGFzTmF0dXJlKHByb2plY3QpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCUlQcm9qZWN0TmF0dXJlIGpzTmF0dXJlID0gbmV3IEpzV2ViTmF0dXJlKHByb2plY3QsIG1vbml0b3IpOwotCQkJbW9uaXRvci53b3JrZWQoMjApOwotCQkJbW9uaXRvci53b3JrZWQoNTApOwotCQkJanNOYXR1cmUuZGVjb25maWd1cmUoKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpzQ29yZVBsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIE1lc3NhZ2VzLmdldFN0cmluZygiSnNOYXR1cmVVbmluc3RhbGxlci4zIiksIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Kc1dlYk5hdHVyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Kc1dlYk5hdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGMzNDQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvSnNXZWJOYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUFjY2Vzc1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSW5jbHVkZVBhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSW5jbHVkZVBhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuTGlicmFyeVN1cGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLkphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUudXRpbC5Db252ZXJ0VXRpbGl0eTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc1dlYk5hdHVyZSBpbXBsZW1lbnRzIElQcm9qZWN0TmF0dXJlIHsKLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFTkFNRV9DTEFTU1BBVEggPSAiLmNsYXNzcGF0aCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUVVJFX0lEU1tdID0KLQkvLyB7Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmVtYmVkZWQuanNOYXR1cmUiLEphdmFTY3JpcHRDb3JlLk5BVFVSRV9JRH07Ci0JLy8gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRVUkVfSURTW10gPSB7IEphdmFTY3JpcHRDb3JlLk5BVFVSRV9JRCB9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBWSVJUVUFMX0JST1dTRVJfQ0xBU1NQQVRIID0gbmV3IFBhdGgoIm9yZy5lY2xpcHNlLndzdC5qc2R0LmxhdW5jaGluZy5iYXNlQnJvd3NlckxpYnJhcnkiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQ09OVEFJTkVSID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LmxhdW5jaGluZy5XZWJQcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUluY2x1ZGVQYXRoRW50cnkgVklSVFVBTF9TQ09QRV9FTlRSWSA9IEphdmFTY3JpcHRDb3JlLm5ld0NvbnRhaW5lckVudHJ5KG5ldyBQYXRoKFZJUlRVQUxfQ09OVEFJTkVSKSwgIG5ldyBJQWNjZXNzUnVsZVswXSwgbmV3IElJbmNsdWRlUGF0aEF0dHJpYnV0ZVtdIHtJSW5jbHVkZVBhdGhBdHRyaWJ1dGUuSElERX0sIGZhbHNlKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRVJfVFlQRV9OQU1FID0gIldpbmRvdyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRVJfVFlQRV9MSUJSQVJZID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LmxhdW5jaGluZy5iYXNlQnJvd3NlckxpYnJhcnkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyogRGVmYXVsdCBKUkUgZW50cnkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9KUkVfUEFUSCA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkSnNOYXR1cmUoSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmICghSnNXZWJOYXR1cmUuaGFzTmF0dXJlKHByb2plY3QpKSB7Ci0JCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3ByZXZOYXR1cmVzLmxlbmd0aCArIEpzV2ViTmF0dXJlLk5BVFVSRV9JRFMubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDAsIHByZXZOYXR1cmVzLmxlbmd0aCk7Ci0JCQkvLyBuZXdOYXR1cmVzW3ByZXZOYXR1cmVzLmxlbmd0aF0gPSBKYXZhU2NyaXB0Q29yZS5OQVRVUkVfSUQ7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IEpzV2ViTmF0dXJlLk5BVFVSRV9JRFMubGVuZ3RoOyBpKyspIHsKLQkJCQluZXdOYXR1cmVzW3ByZXZOYXR1cmVzLmxlbmd0aCArIGldID0gSnNXZWJOYXR1cmUuTkFUVVJFX0lEU1tpXTsKLQkJCX0KLQkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG1vbml0b3IpOwotCQl9IGVsc2UgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNOYXR1cmUoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBKc1dlYk5hdHVyZS5OQVRVUkVfSURTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCFwcm9qZWN0Lmhhc05hdHVyZShKc1dlYk5hdHVyZS5OQVRVUkVfSURTW2ldKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVKc05hdHVyZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaWYgKEpzV2ViTmF0dXJlLmhhc05hdHVyZShwcm9qZWN0KSkgewotCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggLSBKc1dlYk5hdHVyZS5OQVRVUkVfSURTLmxlbmd0aF07Ci0JCQlpbnQgayA9IDA7Ci0JCQloZWFkOiBmb3IgKGludCBpID0gMDsgaSA8IHByZXZOYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBKc1dlYk5hdHVyZS5OQVRVUkVfSURTLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChwcmV2TmF0dXJlc1tpXS5lcXVhbHMoSnNXZWJOYXR1cmUuTkFUVVJFX0lEU1tqXSkpIHsKLQkJCQkJCWNvbnRpbnVlIGhlYWQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbmV3TmF0dXJlc1trKytdID0gcHJldk5hdHVyZXNbaV07Ci0JCQl9Ci0JCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0JCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBtb25pdG9yKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQkJfQotCX0KLQlwcml2YXRlIFZlY3RvciBjbGFzc1BhdGhFbnRyaWVzID0gbmV3IFZlY3RvcigpOwotCXByaXZhdGUgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXByaXZhdGUgSVByb2plY3QgZkN1cnJQcm9qZWN0OwotCXByaXZhdGUgSmF2YVByb2plY3QgZkphdmFQcm9qZWN0OwotCXByaXZhdGUgSVBhdGggZk91dHB1dExvY2F0aW9uOwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCQotCXB1YmxpYyBKc1dlYk5hdHVyZSgpIHsKLQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JfQotCQotCXB1YmxpYyBKc1dlYk5hdHVyZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZkN1cnJQcm9qZWN0ID0gcHJvamVjdDsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQkJfSBlbHNlIHsKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpbml0T3V0cHV0UGF0aCgpOwotCQljcmVhdGVTb3VyY2VDbGFzc1BhdGgoKTsKLQkJaW5pdEpSRUVudHJ5KCk7Ci0JCWluaXRMb2NhbENsYXNzUGF0aCgpOwotCQkKLQkJaWYgKGhhc1Byb2plY3RDbGFzc1BhdGhGaWxlKCkpIHsKLQkJCUlJbmNsdWRlUGF0aEVudHJ5W10gZW50cmllcyA9IGdldFJhd0NsYXNzUGF0aCgpOwotCQkJaWYgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCA+IDApIHsKLQkJCQljbGFzc1BhdGhFbnRyaWVzLnJlbW92ZUFsbChBcnJheXMuYXNMaXN0KGVudHJpZXMpKTsKLQkJCQljbGFzc1BhdGhFbnRyaWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGVudHJpZXMpKTsKLQkJCX0KLQkJfQotCQkKLQkJSnNXZWJOYXR1cmUuYWRkSnNOYXR1cmUoZkN1cnJQcm9qZWN0LCBtb25pdG9yKTsKLQkJZkphdmFQcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBKYXZhU2NyaXB0Q29yZS5jcmVhdGUoZkN1cnJQcm9qZWN0KTsKLQkJZkphdmFQcm9qZWN0LnNldFByb2plY3QoZkN1cnJQcm9qZWN0KTsKLQkJdHJ5IHsKLQkJCS8vICwgZk91dHB1dExvY2F0aW9uCi0JCQlpZiAoIWhhc1Byb2plY3RDbGFzc1BhdGhGaWxlKCkpIHsKLQkJCQlmSmF2YVByb2plY3Quc2V0UmF3SW5jbHVkZXBhdGgoKElJbmNsdWRlUGF0aEVudHJ5W10pIGNsYXNzUGF0aEVudHJpZXMudG9BcnJheShuZXcgSUluY2x1ZGVQYXRoRW50cnlbXSB7fSksIGZPdXRwdXRMb2NhdGlvbiwgbW9uaXRvcik7Ci0JCQl9ZWxzZXsKLQkJCQlmSmF2YVByb2plY3Quc2V0UmF3SW5jbHVkZXBhdGgoKElJbmNsdWRlUGF0aEVudHJ5W10pIGNsYXNzUGF0aEVudHJpZXMudG9BcnJheShuZXcgSUluY2x1ZGVQYXRoRW50cnlbXSB7fSksIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQl9Ci0JCUxpYnJhcnlTdXBlclR5cGUgc3VwZXJUeXBlID0gbmV3IExpYnJhcnlTdXBlclR5cGUobmV3IFBhdGgoIFNVUEVSX1RZUEVfTElCUkFSWSksICBnZXRKYXZhUHJvamVjdCgpLCBTVVBFUl9UWVBFX05BTUUpOwotCQlnZXRKYXZhUHJvamVjdCgpLnNldENvbW1vblN1cGVyVHlwZShzdXBlclR5cGUpOwotCQkvLyBnZXRKYXZhUHJvamVjdCgpLmFkZFRvQnVpbGRTcGVjKEJVSUxERVJfSUQpOwotCQlmQ3VyclByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbW9uaXRvcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVTb3VyY2VDbGFzc1BhdGgoKSB7Ci0JCWlmIChoYXNBVmFsaWRTb3VyY2VQYXRoKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJSW5jbHVkZVBhdGhFbnRyeVtdIGVudHJpZXMgPSBuZXcgQ29udmVydFV0aWxpdHkoZkN1cnJQcm9qZWN0KS5nZXREZWZhdWx0U291cmNlUGF0aHMoZkN1cnJQcm9qZWN0KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQljbGFzc1BhdGhFbnRyaWVzLmFkZChlbnRyaWVzW2ldKTsKLQkJfQotCQkvLyBJUGF0aCBwcm9qZWN0UGF0aCA9IGZDdXJyUHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCQkvLyBjbGFzc1BhdGhFbnRyaWVzLmFkZChKYXZhU2NyaXB0Q29yZS5uZXdTb3VyY2VFbnRyeShwcm9qZWN0UGF0aCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZWNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVmVjdG9yIGJhZEVudHJpZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCUlJbmNsdWRlUGF0aEVudHJ5IGRlZmF1bHRKUkVMaWJyYXJ5ID0gIGdldEpyZUVudHJ5KCk7Ci0JCUlJbmNsdWRlUGF0aEVudHJ5W10gbG9jYWxFbnRyaWVzID0gaW5pdExvY2FsQ2xhc3NQYXRoKCk7Ci0JCWJhZEVudHJpZXMuYWRkKGRlZmF1bHRKUkVMaWJyYXJ5KTsKLQkJYmFkRW50cmllcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChsb2NhbEVudHJpZXMpKTsKLQkJSUluY2x1ZGVQYXRoRW50cnlbXSBlbnRyaWVzID0gZ2V0UmF3Q2xhc3NQYXRoKCk7Ci0JCVZlY3RvciBnb29kRW50cmllcyA9IG5ldyBWZWN0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWJhZEVudHJpZXMuY29udGFpbnMoZW50cmllc1tpXSkpIHsKLQkJCQlnb29kRW50cmllcy5hZGQoZW50cmllc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJLy8gZ2V0SmF2YVByb2plY3QoKS5yZW1vdmVGcm9tQnVpbGRTcGVjKEJVSUxERVJfSUQpOwotCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IGdldEphdmFQcm9qZWN0KCkuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLQkJZ2V0SmF2YVByb2plY3QoKS5zZXRSYXdJbmNsdWRlcGF0aCgoSUluY2x1ZGVQYXRoRW50cnlbXSkgZ29vZEVudHJpZXMudG9BcnJheShuZXcgSUluY2x1ZGVQYXRoRW50cnlbXSB7fSksIG91dHB1dExvY2F0aW9uLCBtb25pdG9yKTsKLQkJZ2V0SmF2YVByb2plY3QoKS5kZWNvbmZpZ3VyZSgpOwotCQlKc1dlYk5hdHVyZS5yZW1vdmVKc05hdHVyZShmQ3VyclByb2plY3QsIG1vbml0b3IpOwotCQlmQ3VyclByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbW9uaXRvcik7Ci0JfQotCQotCXB1YmxpYyBKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJaWYgKGZKYXZhUHJvamVjdCA9PSBudWxsKSB7Ci0JCQlmSmF2YVByb2plY3QgPSAoSmF2YVByb2plY3QpIEphdmFTY3JpcHRDb3JlLmNyZWF0ZShmQ3VyclByb2plY3QpOwotCQkJZkphdmFQcm9qZWN0LnNldFByb2plY3QoZkN1cnJQcm9qZWN0KTsKLQkJfQotCQlyZXR1cm4gZkphdmFQcm9qZWN0OwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuZkN1cnJQcm9qZWN0OwotCX0KLQkKLQlwcml2YXRlIElJbmNsdWRlUGF0aEVudHJ5W10gZ2V0UmF3Q2xhc3NQYXRoKCkgewotCQlKYXZhUHJvamVjdCBwcm9qID0gbmV3IEphdmFQcm9qZWN0KCk7Ci0JCXByb2ouc2V0UHJvamVjdChmQ3VyclByb2plY3QpOwotCQlyZXR1cm4gcHJvai5yZWFkUmF3SW5jbHVkZXBhdGgoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGhhc0FWYWxpZFNvdXJjZVBhdGgoKSB7Ci0JCWlmIChoYXNQcm9qZWN0Q2xhc3NQYXRoRmlsZSgpKSB7Ci0JCQl0cnkgewotCQkJCUlJbmNsdWRlUGF0aEVudHJ5W10gZW50cmllcyA9IGdldFJhd0NsYXNzUGF0aCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZW50cmllc1tpXS5nZXRFbnRyeUtpbmQoKSA9PSBJSW5jbHVkZVBhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlcy5nZXRTdHJpbmcoIkpzV2ViTmF0dXJlLjUiKSArIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGhhc1Byb2plY3RDbGFzc1BhdGhGaWxlKCkgewotCQlpZiAoZkN1cnJQcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZkN1cnJQcm9qZWN0LmdldEZvbGRlcihKYXZhUHJvamVjdC5ERUZBVUxUX1BSRUZFUkVOQ0VTX0RJUk5BTUUpLmdldEZpbGUoSmF2YVByb2plY3QuQ0xBU1NQQVRIX0ZJTEVOQU1FKS5leGlzdHMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJSW5jbHVkZVBhdGhFbnRyeSBnZXRKcmVFbnRyeSgpIHsKLQkJcmV0dXJuIEphdmFTY3JpcHRDb3JlLm5ld0NvbnRhaW5lckVudHJ5KG5ldyBQYXRoKERFRkFVTFRfSlJFX1BBVEgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRKUkVFbnRyeSgpIHsKLQkJSUluY2x1ZGVQYXRoRW50cnkgZGVmYXVsdEpSRUxpYnJhcnkgPSAgZ2V0SnJlRW50cnkoKTsKLQkJdHJ5IHsKLQkJCUlJbmNsdWRlUGF0aEVudHJ5W10gZW50cmllcyA9IGdldFJhd0NsYXNzUGF0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGVudHJpZXNbaV0gPT0gZGVmYXVsdEpSRUxpYnJhcnkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWNsYXNzUGF0aEVudHJpZXMuYWRkKGRlZmF1bHRKUkVMaWJyYXJ5KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlcy5nZXRTdHJpbmcoIkpzV2ViTmF0dXJlLjYiKSArIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJSW5jbHVkZVBhdGhFbnRyeVtdIGluaXRMb2NhbENsYXNzUGF0aCgpIHsKLQkJCi0JCWNsYXNzUGF0aEVudHJpZXMuYWRkKEpzV2ViTmF0dXJlLlZJUlRVQUxfU0NPUEVfRU5UUlkpOwotCQlJSW5jbHVkZVBhdGhFbnRyeSBicm93c2VyTGlicmFyeSA9IEphdmFTY3JpcHRDb3JlLm5ld0NvbnRhaW5lckVudHJ5KCBWSVJUVUFMX0JST1dTRVJfQ0xBU1NQQVRIKTsKLQkJY2xhc3NQYXRoRW50cmllcy5hZGQoYnJvd3NlckxpYnJhcnkpOwotCQkvL0lQYXRoIHdlYlJvb3QgPSBXZWJSb290RmluZGVyLmdldFdlYkNvbnRlbnRGb2xkZXIoZkN1cnJQcm9qZWN0KTsKLQkvLwlJSW5jbHVkZVBhdGhFbnRyeSBzb3VyY2UgPSBKYXZhU2NyaXB0Q29yZS5uZXdTb3VyY2VFbnRyeShmQ3VyclByb2plY3QuZ2V0RnVsbFBhdGgoKS5hcHBlbmQod2ViUm9vdCkuYXBwZW5kKCIvIikpOwotCS8vCWNsYXNzUGF0aEVudHJpZXMuYWRkKHNvdXJjZSk7Ci0JCXJldHVybiBuZXcgSUluY2x1ZGVQYXRoRW50cnlbXSB7IEpzV2ViTmF0dXJlLlZJUlRVQUxfU0NPUEVfRU5UUlkgLCBicm93c2VyTGlicmFyeS8qLHNvdXJjZSovfTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRPdXRwdXRQYXRoKCkgewotCQlpZiAoZk91dHB1dExvY2F0aW9uID09IG51bGwpIHsKLQkJCWZPdXRwdXRMb2NhdGlvbiA9IGZDdXJyUHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzLmZDdXJyUHJvamVjdCA9IHByb2plY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzI2OTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3QubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L01vZHVsZUNvcmVTdXBwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L01vZHVsZUNvcmVTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NDFhZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Nb2R1bGVDb3JlU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIGFueSB1c2VkIE1vZHVsZSBDb3JlIEFQSXMgYWxvbmcgd2l0aCBmYWxsYmFja3MgZm9yDQotICogdXNlIG9uIG5vbi1jb21wbGlhbnQgcHJvamVjdHMgYW5kIHdoZW4gdGhvc2Ugc2VydmljZXMgYXJlIG5vdCBhdmFpbGFibGUgYXQNCi0gKiBydW50aW1lLg0KLSAqIA0KLSAqIEJlY2F1c2UgTW9kdWxlQ29yZSBBUEkgY2FsbHMgY2FuIHJlc3VsdCBpbiBsb2NrcyBuZWVkaW5nIHRvIGJlIGFjcXVpcmVkLA0KLSAqIG5vbmUgb2YgdGhlc2UgbWV0aG9kcyBzaG91bGQgYmUgY2FsbGVkIHdoaWxlIG90aGVyIHRocmVhZCBsb2NrcyBoYXZlDQotICogYWxyZWFkeSBiZWVuIGFjcXVpcmVkLg0KLSAqLw0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNb2R1bGVDb3JlU3VwcG9ydCB7DQotCXN0YXRpYyBmaW5hbCBib29sZWFuIF9kdW1wX05DREZFID0gZmFsc2U7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU5GID0gIldFQi1JTkYiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIFdFQl9JTkZfUEFUSCA9IG5ldyBQYXRoKFdFQl9JTkYpOw0KLQ0KLQkvKioNCi0JICogQHBhcmFtIHByb2plY3QNCi0JICogQHJldHVybiB0aGUgY29tcHV0ZWQgSVBhdGggdG8gdGhlICJyb290IiBvZiB0aGUgd2ViIGNvbnRlbnRzLCBlaXRoZXINCi0JICogICAgICAgICBmcm9tIGZhY2V0IGtub3dsZWRnZSBvciBodWVyaXN0aWNzLCBvciBudWxsIGlmIG9uZSBjYW4gbm90IGJlDQotCSAqICAgICAgICAgZGV0ZXJtaW5lZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJUGF0aCBjb21wdXRlV2ViQ29udGVudFJvb3RQYXRoKElQYXRoIHBhdGgpIHsNCi0JCUlQYXRoIHJvb3QgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlyb290ID0gTW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5nZXRXZWJDb250ZW50Um9vdFBhdGgoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGguc2VnbWVudCgwKSkpOw0KLQkJfQ0KLQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsNCi0JCQlpZiAoX2R1bXBfTkNERkUpDQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQl9DQotCQlpZiAocm9vdCA9PSBudWxsKSB7DQotCQkJLyoNCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEzMjQ1DQotCQkJICogDQotCQkJICogTlBFIGluIEpTUFRhZ2xpYkRpcmVjdGl2ZUNvbnRlbnRBc3Npc3RQcm9jZXNzb3Igd2l0aA0KLQkJCSAqIG5vbi1mYWNldGVkIHByb2plY3QNCi0JCQkgKi8NCi0JCQlyb290ID0gZ2V0TG9jYWxSb290KHBhdGgpOw0KLQkJfQ0KLQkJcmV0dXJuIHJvb3Q7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBwYXJhbSBwcm9qZWN0DQotCSAqIEByZXR1cm4gdGhlIElQYXRoIHRvIHRoZSAicm9vdCIgb2YgdGhlIHdlYiBjb250ZW50cw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRXZWJDb250ZW50Um9vdFBhdGgoSVByb2plY3QgcHJvamVjdCkgew0KLQkJaWYgKHByb2plY3QgPT0gbnVsbCkNCi0JCQlyZXR1cm4gbnVsbDsNCi0NCi0JCUlQYXRoIHBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7DQotCQl0cnkgew0KLQkJCXBhdGggPSBNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmdldFdlYkNvbnRlbnRSb290UGF0aChwcm9qZWN0KTsNCi0JCX0NCi0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7DQotCQkJaWYgKF9kdW1wX05DREZFKQ0KLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfQ0KLQkJcmV0dXJuIHBhdGg7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBwYXJhbSBwYXRoDQotCSAqICAgICAgICAgICAgLSB0aGUgZnVsbCBwYXRoIHRvIGEgcmVzb3VyY2Ugd2l0aGluIHRoZSB3b3Jrc3BhY2UNCi0JICogQHJldHVybiAtIHRoZSBydW50aW1lIHBhdGggb2YgdGhlIHJlc291cmNlIGlmIG9uZSBleGlzdHMsIG51bGwNCi0JICogICAgICAgICBvdGhlcndpc2UNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UnVudGltZVBhdGgoSVBhdGggcGF0aCkgew0KLQkJSVBhdGggcmVzdWx0ID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJcmVzdWx0ID0gTW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5nZXRSdW50aW1lUGF0aChwYXRoKTsNCi0JCX0NCi0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7DQotCQkJaWYgKF9kdW1wX05DREZFKQ0KLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfQ0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQotCQkJSVBhdGggcm9vdCA9IGdldExvY2FsUm9vdChwYXRoKTsNCi0JCQlyZXN1bHQgPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMocm9vdC5zZWdtZW50Q291bnQoKSkubWFrZUFic29sdXRlKCk7DQotCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBAcGFyYW0gYmFzZVBhdGgNCi0JICogICAgICAgICAgICAtIHRoZSBmdWxsIHBhdGggdG8gYSByZXNvdXJjZSB3aXRoaW4gdGhlIHdvcmtzcGFjZQ0KLQkgKiBAcGFyYW0gcmVmZXJlbmNlDQotCSAqICAgICAgICAgICAgLSB0aGUgcmVmZXJlbmNlIHN0cmluZyB0byByZXNvbHZlDQotCSAqIEByZXR1cm4gLSB0aGUgZnVsbCBwYXRoIHdpdGhpbiB0aGUgd29ya3NwYWNlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlDQotCSAqICAgICAgICAgZ2l2ZW4gcmVmZXJlbmNlIGFjY29yZGluZyB0byB0aGUgdmlydHVhbCBwYXRoaW5nIHN1cHBvcnQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVBhdGggcmVzb2x2ZShJUGF0aCBiYXNlUGF0aCwgU3RyaW5nIHJlZmVyZW5jZSkgew0KLQkJSVBhdGggcmVzb2x2ZWRQYXRoID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJcmVzb2x2ZWRQYXRoID0gTW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5yZXNvbHZlKGJhc2VQYXRoLCByZWZlcmVuY2UpOw0KLQkJfQ0KLQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsNCi0JCQlpZiAoX2R1bXBfTkNERkUpDQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQl9DQotDQotCQlpZiAocmVzb2x2ZWRQYXRoID09IG51bGwpIHsNCi0JCQlJUGF0aCByb290UGF0aCA9IGdldExvY2FsUm9vdChiYXNlUGF0aCk7DQotCQkJaWYgKHJlZmVyZW5jZS5zdGFydHNXaXRoKFBhdGguUk9PVC50b1N0cmluZygpKSkgew0KLQkJCQlyZXNvbHZlZFBhdGggPSByb290UGF0aC5hcHBlbmQocmVmZXJlbmNlKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXJlc29sdmVkUGF0aCA9IGJhc2VQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQocmVmZXJlbmNlKTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gcmVzb2x2ZWRQYXRoOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAcGFyYW0gYmFzZVBhdGgNCi0JICogQHJldHVybiB0aGUgYXBwbGljYWJsZSBXZWIgY29udGV4dCByb290IHBhdGgsIGlmIG9uZSBleGlzdHMNCi0JICovDQotCXByaXZhdGUgc3RhdGljIElQYXRoIGdldExvY2FsUm9vdChJUGF0aCBiYXNlUGF0aCkgew0KLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7DQotDQotCQkvLyBleGlzdGluZyB3b3Jrc3BhY2UgcmVzb3VyY2VzIC0gdGhpcyBpcyB0aGUgOTMlIGNhc2UNCi0JCUlSZXNvdXJjZSBmaWxlID0gRmlsZUJ1ZmZlcnMuZ2V0V29ya3NwYWNlRmlsZUF0TG9jYXRpb24oYmFzZVBhdGgpOw0KLQ0KLQkJLy8gVHJ5IHRoZSBiYXNlIHBhdGggYXMgYSBmb2xkZXIgZmlyc3QNCi0JCWlmIChmaWxlID09IG51bGwgJiYgYmFzZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7DQotCQkJZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0Rm9sZGVyKGJhc2VQYXRoKTsNCi0JCX0NCi0JCS8vIElmIG5vdCBhIGZvbGRlciwgdGhlbiB0cnkgYmFzZSBwYXRoIGFzIGEgZmlsZQ0KLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiAhZmlsZS5leGlzdHMoKSAmJiBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsNCi0JCQlmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlKGJhc2VQYXRoKTsNCi0JCX0NCi0NCi0JCWlmIChmaWxlID09IG51bGwgJiYgYmFzZVBhdGguc2VnbWVudENvdW50KCkgPT0gMSkgew0KLQkJCWZpbGUgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QoYmFzZVBhdGguc2VnbWVudCgwKSk7DQotCQl9DQotDQotCQlpZiAoZmlsZSA9PSBudWxsKSB7DQotCQkJLyoNCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2NTI5DQotCQkJICogDQotCQkJICogVGhpcyBtZXRob2QgcHJvZHVjZXMgYSBsZXNzIGFjY3VyYXRlIHJlc3VsdCwgYnV0IGRvZXNuJ3QNCi0JCQkgKiByZXF1aXJlIHRoYXQgdGhlIGZpbGUgZXhpc3QgeWV0Lg0KLQkJCSAqLw0KLQkJCUlGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKGJhc2VQYXRoKTsNCi0JCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkNCi0JCQkJZmlsZSA9IGZpbGVzWzBdOw0KLQkJfQ0KLQ0KLQkJd2hpbGUgKGZpbGUgIT0gbnVsbCkgew0KLQkJCS8qKg0KLQkJCSAqIFRyZWF0IGFueSBwYXJlbnQgZm9sZGVyIHdpdGggYSBXRUItSU5GIHN1YmZvbGRlciBhcyBhIHdlYi1hcHANCi0JCQkgKiByb290DQotCQkJICovDQotCQkJSUNvbnRhaW5lciBmb2xkZXIgPSBudWxsOw0KLQkJCWlmICgoZmlsZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuRk9MREVSKSAhPSAwKSB7DQotCQkJCWZvbGRlciA9IChJQ29udGFpbmVyKSBmaWxlOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJZm9sZGVyID0gZmlsZS5nZXRQYXJlbnQoKTsNCi0JCQl9DQotCQkJLy8gZ2V0Rm9sZGVyIG9uIGEgd29ya3NwYWNlIHJvb3QgbXVzdCB1c2UgYSBmdWxsIHBhdGgsIHNraXANCi0JCQlpZiAoZm9sZGVyICE9IG51bGwgJiYgKGZvbGRlci5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUk9PVCkgPT0gMCkgew0KLQkJCQlJRm9sZGVyIHdlYmluZiA9IGZvbGRlci5nZXRGb2xkZXIoV0VCX0lORl9QQVRIKTsNCi0JCQkJaWYgKHdlYmluZiAhPSBudWxsICYmIHdlYmluZi5leGlzdHMoKSkgew0KLQkJCQkJcmV0dXJuIGZvbGRlci5nZXRGdWxsUGF0aCgpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCWZpbGUgPSBmaWxlLmdldFBhcmVudCgpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGJhc2VQYXRoLnVwdG9TZWdtZW50KDEpOw0KLQl9DQotDQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvTW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Nb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YjYxMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Nb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3Q7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLS8qKgotICogV3JhcHBlciBjbGFzcyBmb3IgYWxsIEZhY2V0IGFuZCBNb2R1bGVDb3JlLXJlbGF0ZWQgY2FsbHMuIElmIHRoZSBGYWNldCBvcgotICogTW9kdWxlQ29yZSBidW5kbGVzIGFyZSBub3QgYXZhaWxhYmxlLCB0aGlzIGNsYXNzIHdpbGwgbm90IGxvYWQsIG9yIGlmIGl0Ci0gKiBkb2VzLCBpdHMgbWV0aG9kcyB3aWxsIGNhdXNlIE5vQ2xhc3NEZWZGb3VuZEVycm9ycy4gVGhpcyBhbGxvd3MgdXMgdG8KLSAqIGNvbXBhcnRtZW50YWxpemUgdGhlIGRlcGVuZGVuY2llcy4KLSAqIAotICovCi1maW5hbCBjbGFzcyBNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0xBU0ggPSAiLyI7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIGZSZXNvbHZlZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgLSB0aGUgZnVsbCBwYXRoIHRvIGEgcmVzb3VyY2Ugd2l0aGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIC0gdGhlIHJ1bnRpbWUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgaWYgb25lIGV4aXN0cywgbnVsbAotCSAqICAgICAgICAgb3RoZXJ3aXNlCi0JICovCi0Jc3RhdGljIElQYXRoIGdldFJ1bnRpbWVQYXRoKElQYXRoIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocGF0aC5zZWdtZW50KDApKTsKLQotCQlpZiAoIU1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJVmlydHVhbFJlc291cmNlW10gdmlydHVhbFJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKSk7Ci0JCWlmICh2aXJ0dWFsUmVzb3VyY2VzICE9IG51bGwgJiYgdmlydHVhbFJlc291cmNlcy5sZW5ndGggPiAwKSB7Ci0JCQlyZXR1cm4gdmlydHVhbFJlc291cmNlc1swXS5nZXRSdW50aW1lUGF0aCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiB0aGUgSVBhdGggdG8gdGhlICJyb290IiBvZiB0aGUgd2ViIGNvbnRlbnRzCi0JICovCi0Jc3RhdGljIElQYXRoIGdldFdlYkNvbnRlbnRSb290UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoIU1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCWlmIChjb21wb25lbnQgIT0gbnVsbCAmJiBjb21wb25lbnQuZXhpc3RzKCkpIHsKLQkJCXBhdGggPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpOwotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgLSB0aGUgZnVsbCBwYXRoIHRvIGEgcmVzb3VyY2Ugd2l0aGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcGFyYW0gcmVmZXJlbmNlCi0JICogICAgICAgICAgICAtIHRoZSByZWZlcmVuY2Ugc3RyaW5nIHRvIHJlc29sdmUKLQkgKiBAcmV0dXJuIC0gdGhlIGZ1bGwgcGF0aCB3aXRoaW4gdGhlIHdvcmtzcGFjZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQotCSAqICAgICAgICAgZ2l2ZW4gcmVmZXJlbmNlIGFjY29yZGluZyB0byB0aGUgdmlydHVhbCBwYXRoaW5nIHN1cHBvcnQKLQkgKi8KLQlzdGF0aWMgSVBhdGggcmVzb2x2ZShJUGF0aCBiYXNlUGF0aCwgU3RyaW5nIHJlZmVyZW5jZSkgewotCQlpZiAocmVmZXJlbmNlID09IG51bGwgfHwgYmFzZVBhdGggPT0gbnVsbCB8fCBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChiYXNlUGF0aC5zZWdtZW50KDApKTsKLQotCQlpZiAoIU1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoYmFzZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkvKgotCQkJICogSXQgY2FuIHRha2UgdGhlIGJldHRlciBwYXJ0IG9mIGEgZnVsbCBzZWNvbmQgdG8gZG8gdGhpcywgc28KLQkJCSAqIGNhY2hlIHRoZSByZXN1bHQuCi0JCQkgKi8KLQkJCUlQYXRoIHJlc29sdmVkID0gbnVsbDsKLQkJCU1hcCBtYXBGb3JCYXNlUmVzb3VyY2UgPSBudWxsOwotCQkJbWFwRm9yQmFzZVJlc291cmNlID0gKE1hcCkgZlJlc29sdmVkTWFwLmdldChiYXNlUGF0aCk7Ci0JCQlpZiAobWFwRm9yQmFzZVJlc291cmNlICE9IG51bGwpIHsKLQkJCQlSZWZlcmVuY2UgcmVzb2x2ZWRSZWZlcmVuY2UgPSAoUmVmZXJlbmNlKSBtYXBGb3JCYXNlUmVzb3VyY2UuZ2V0KHJlZmVyZW5jZSk7Ci0JCQkJaWYgKHJlc29sdmVkUmVmZXJlbmNlICE9IG51bGwpCi0JCQkJCXJlc29sdmVkID0gKElQYXRoKSByZXNvbHZlZFJlZmVyZW5jZS5nZXQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1hcEZvckJhc2VSZXNvdXJjZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZlJlc29sdmVkTWFwLnB1dChiYXNlUGF0aCwgbWFwRm9yQmFzZVJlc291cmNlKTsKLQkJCX0KLQotCQkJaWYgKHJlc29sdmVkID09IG51bGwpIHsKLQkJCQlJRmlsZSBiYXNlRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShiYXNlUGF0aCk7Ci0JCQkJSVZpcnR1YWxSZXNvdXJjZVtdIHZpcnR1YWxSZXNvdXJjZXMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlc291cmNlcyhiYXNlRmlsZSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2aXJ0dWFsUmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlQYXRoIGJhc2VSdW50aW1lUGF0aCA9IHZpcnR1YWxSZXNvdXJjZXNbaV0uZ2V0UnVudGltZVBhdGgoKTsKLQkJCQkJSVBhdGggcmVmZXJlbmNlUnVudGltZVBhdGggPSBudWxsOwotCQkJCQlpZiAocmVmZXJlbmNlLnN0YXJ0c1dpdGgoU0xBU0gpKSB7Ci0JCQkJCQlyZWZlcmVuY2VSdW50aW1lUGF0aCA9IG5ldyBQYXRoKHJlZmVyZW5jZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZWZlcmVuY2VSdW50aW1lUGF0aCA9IGJhc2VSdW50aW1lUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYXBwZW5kKHJlZmVyZW5jZSk7Ci0JCQkJCX0KLQkJCQkJSVZpcnR1YWxGaWxlIHZpcnR1YWxGaWxlID0gQ29tcG9uZW50Q29yZS5jcmVhdGVGaWxlKHByb2plY3QsIHJlZmVyZW5jZVJ1bnRpbWVQYXRoKTsKLQkJCQkJaWYgKHZpcnR1YWxGaWxlICE9IG51bGwgJiYgdmlydHVhbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCUlGaWxlW10gdW5kZXJseWluZ0ZpbGVzID0gdmlydHVhbEZpbGUuZ2V0VW5kZXJseWluZ0ZpbGVzKCk7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHVuZGVybHlpbmdGaWxlcy5sZW5ndGg7IGorKykgewotCQkJCQkJCWlmICh1bmRlcmx5aW5nRmlsZXNbal0uZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSAmJiB1bmRlcmx5aW5nRmlsZXNbal0uZXhpc3RzKCkpIHsKLQkJCQkJCQkJbWFwRm9yQmFzZVJlc291cmNlLnB1dChyZWZlcmVuY2UsIG5ldyBTb2Z0UmVmZXJlbmNlKHVuZGVybHlpbmdGaWxlc1tqXS5nZXRGdWxsUGF0aCgpKSk7Ci0JCQkJCQkJCXJlc29sdmVkID0gdW5kZXJseWluZ0ZpbGVzW2pdLmdldEZ1bGxQYXRoKCk7Ci0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzb2x2ZWQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJVmlydHVhbEZpbGUgdmlydHVhbEZpbGUgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUZpbGUocHJvamVjdCwgbmV3IFBhdGgocmVmZXJlbmNlKSk7Ci0JCQlpZiAodmlydHVhbEZpbGUgIT0gbnVsbCAmJiB2aXJ0dWFsRmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiB2aXJ0dWFsRmlsZS5nZXRVbmRlcmx5aW5nRmlsZSgpLmdldEZ1bGxQYXRoKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Nb2R1bGVTb3VyY2VQYXRoUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvTW9kdWxlU291cmNlUGF0aFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOTU1M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Nb2R1bGVTb3VyY2VQYXRoUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUFjY2Vzc1J1bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUluY2x1ZGVQYXRoQXR0cmlidXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklJbmNsdWRlUGF0aEVudHJ5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLnV0aWwuRGVmYXVsdFNvdXJjZVBhdGhQcm92aWRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgTW9kdWxlU291cmNlUGF0aFByb3ZpZGVyIGV4dGVuZHMgRGVmYXVsdFNvdXJjZVBhdGhQcm92aWRlciB7DQotDQotCXN0YXRpYyBmaW5hbCBJUGF0aCBWSVJUVUFMX0NPTlRBSU5FUl9QQVRIID0gbmV3IFBhdGgoIm9yZy5lY2xpcHNlLndzdC5qc2R0LmxhdW5jaGluZy5XZWJQcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQNCi0Jc3RhdGljIGZpbmFsIElJbmNsdWRlUGF0aEVudHJ5IFZJUlRVQUxfU0NPUEVfRU5UUlkgPSBKYXZhU2NyaXB0Q29yZS5uZXdDb250YWluZXJFbnRyeShWSVJUVUFMX0NPTlRBSU5FUl9QQVRILCBuZXcgSUFjY2Vzc1J1bGVbMF0sIG5ldyBJSW5jbHVkZVBhdGhBdHRyaWJ1dGVbXXtJSW5jbHVkZVBhdGhBdHRyaWJ1dGUuSElERX0sIGZhbHNlKTsNCi0NCi0JcHVibGljIE1vZHVsZVNvdXJjZVBhdGhQcm92aWRlcigpIHsNCi0JfQ0KLQ0KLQlwdWJsaWMgSUluY2x1ZGVQYXRoRW50cnlbXSBnZXREZWZhdWx0U291cmNlUGF0aHMoSVByb2plY3QgcCkgew0KLQkJaWYgKE1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocCkpIHsNCi0JCQlJVmlydHVhbEZpbGUgcm9vdCA9IENvbXBvbmVudENvcmUuY3JlYXRlRmlsZShwLCBQYXRoLlJPT1QpOw0KLQkJCUlSZXNvdXJjZVtdIHVuZGVybHlpbmdSZXNvdXJjZXMgPSByb290LmdldFVuZGVybHlpbmdSZXNvdXJjZXMoKTsNCi0JCQlpZiAodW5kZXJseWluZ1Jlc291cmNlcyA9PSBudWxsIHx8IHVuZGVybHlpbmdSZXNvdXJjZXMubGVuZ3RoID09IDApIHsNCi0JCQkJdW5kZXJseWluZ1Jlc291cmNlcyA9IG5ldyBJUmVzb3VyY2VbXXtyb290LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpfTsNCi0JCQl9DQotCQkJaWYgKHVuZGVybHlpbmdSZXNvdXJjZXMubGVuZ3RoID4gMCAmJiB1bmRlcmx5aW5nUmVzb3VyY2VzWzBdICE9IG51bGwpIHsNCi0JCQkJSVBhdGhbXSBwYXRocyA9IG5ldyBJUGF0aFt1bmRlcmx5aW5nUmVzb3VyY2VzLmxlbmd0aF07DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdW5kZXJseWluZ1Jlc291cmNlcy5sZW5ndGg7IGkrKykgew0KLQkJCQkJcGF0aHNbaV0gPSB1bmRlcmx5aW5nUmVzb3VyY2VzW2ldLmdldEZ1bGxQYXRoKCk7DQotCQkJCX0NCi0JCQkJaWYgKHBhdGhzLmxlbmd0aCA+IDApIHsNCi0JCQkJCUlJbmNsdWRlUGF0aEVudHJ5W10gZW50cmllcyA9IG5ldyBJSW5jbHVkZVBhdGhFbnRyeVtwYXRocy5sZW5ndGggKyAxXTsNCi0JCQkJCWVudHJpZXNbMF0gPSBWSVJUVUFMX1NDT1BFX0VOVFJZOw0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgew0KLQkJCQkJCWVudHJpZXNbaSsxXSA9IEphdmFTY3JpcHRDb3JlLm5ld1NvdXJjZUVudHJ5KHBhdGhzW2ldKTsNCi0JCQkJCX0NCi0JCQkJCXJldHVybiBlbnRyaWVzOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRTb3VyY2VQYXRocyhwKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L1dlYlByb2plY3RKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTI1NmJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdDsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklJbmNsdWRlUGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUpzR2xvYmFsU2NvcGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5Kc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5jb21waWxlci5saWJyYXJpZXMuTGlicmFyeUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNOYW1lTWFuZ2xlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5XZWJSb290RmluZGVyOwotCi0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBXZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyIGV4dGVuZHMgSnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyICB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRBSU5FUl9ERVNDUklQVElPTiA9IE1lc3NhZ2VzLmdldFN0cmluZygiV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplci4wIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBMSUJfTkFNRSA9IHsnYicsJ3InLCdvJywndycsJ3MnLCdlJywncicsJ1cnLCdpJywnbicsJ2QnLCdvJywndycsJy4nLCdqJywncyd9OwotCS8qIFNvbWUgdG9rZW5zIGZvciB1cyB0byBpZGVudGlmeSBtYW5nbGVkIHBhdGhzICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTkdMRURfQlVUVDEgPSAiaHRtIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5HTEVEX0JVVFQyID0gIi5qcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvL3ByaXZhdGUgSUphdmFTY3JpcHRQcm9qZWN0IGphdmFQcm9qZWN0OwotCQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRVbm1hbmdlZEh0bWxQYXRoKFN0cmluZyBjb250YWluZXJQYXRoU3RyaW5nKSB7Ci0JCWlmIChjb250YWluZXJQYXRoU3RyaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChjb250YWluZXJQYXRoU3RyaW5nLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihXZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLk1BTkdMRURfQlVUVDEpICE9IC0xICYmIGNvbnRhaW5lclBhdGhTdHJpbmcudG9Mb3dlckNhc2UoKS5pbmRleE9mKFdlYlByb2plY3RKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIuTUFOR0xFRF9CVVRUMikgIT0gLTEpIHsKLQkJCXJldHVybiBKc05hbWVNYW5nbGVyVXRpbC51bm1hbmdsZShjb250YWluZXJQYXRoU3RyaW5nKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIExpYnJhcnlMb2NhdGlvbiBnZXRMaWJyYXJ5TG9jYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyI2NhblVwZGF0ZUpzR2xvYmFsU2NvcGVDb250YWluZXIob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFByb2plY3QpCi0JICovCi0JCi0JcHVibGljIGJvb2xlYW4gY2FuVXBkYXRlSnNHbG9iYWxTY29wZUNvbnRhaW5lcihJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVNjcmlwdFByb2plY3QgcHJvamVjdCkgewotCQkvKiBkb250IHJlbW92ZSBmcm9tIHRoaXMgcHJvamVjdCAqLwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCXByb3RlY3RlZCBJSnNHbG9iYWxTY29wZUNvbnRhaW5lciBnZXRDb250YWluZXIoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFTY3JpcHRQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBXZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLkNPTlRBSU5FUl9ERVNDUklQVElPTjsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplciNnZXREZXNjcmlwdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0UHJvamVjdCkKLQkgKi8KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhU2NyaXB0UHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlpZiAoY29udGFpbmVyUGF0aC5lcXVhbHMobmV3IFBhdGgoSnNXZWJOYXR1cmUuVklSVFVBTF9DT05UQUlORVIpKSkgewotCQkJcmV0dXJuIFdlYlByb2plY3RKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIuQ09OVEFJTkVSX0RFU0NSSVBUSU9OOwotCQl9Ci0JCQotCQlTdHJpbmcgY29udGFpbmVyUGF0aFN0cmluZyA9IGNvbnRhaW5lclBhdGgudG9TdHJpbmcoKTsKLQkJSVBhdGggd2ViQ29udGV4dCA9IGdldFdlYkNvbnRleHRSb290KGphdmFQcm9qZWN0KTsKLQkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSBjb250YWluZXJQYXRoLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJaWYoY29udGFpbmVyUGF0aC5lcXVhbHMoZ2V0V2ViQ29udGV4dFJvb3QoamF2YVByb2plY3QpKSB8fCAoZmlsZUV4dGVuc2lvbiE9bnVsbCAmJiBmaWxlRXh0ZW5zaW9uLmVxdWFscygianMiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHdlYkNvbnRleHQudG9TdHJpbmcoKTsKLQkJfQotCQlTdHJpbmcgdW5tYW5nbGVkID0gV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplci5nZXRVbm1hbmdlZEh0bWxQYXRoKGNvbnRhaW5lclBhdGhTdHJpbmcpOwotCQlpZiAodW5tYW5nbGVkICE9IG51bGwpIHsKLQkJCUlQYXRoIHByb2plY3RQYXRoID0gamF2YVByb2plY3QuZ2V0UGF0aCgpOwotCQkJLyogUmVwbGFjZSB0aGUgcHJvamVjdCBwYXRoIHdpdGggdGhlIHByb2plY3QgbmFtZSAqLwotCQkJaWYgKHVubWFuZ2xlZC5pbmRleE9mKHByb2plY3RQYXRoLnRvU3RyaW5nKCkpID49IDApIHsKLQkJCQl1bm1hbmdsZWQgPSBqYXZhUHJvamVjdC5nZXREaXNwbGF5TmFtZSgpICsgIjoiICsgdW5tYW5nbGVkLnN1YnN0cmluZyhwcm9qZWN0UGF0aC50b1N0cmluZygpLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIHVubWFuZ2xlZDsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyUGF0aFN0cmluZzsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplciNnZXRIb3N0UGF0aChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JICovCi0JCi0JcHVibGljIFVSSSBnZXRIb3N0UGF0aChJUGF0aCBwYXRoLCBJSmF2YVNjcmlwdFByb2plY3QgcHJvamVjdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCVN0cmluZyBodG1sUGF0aCA9IFdlYlByb2plY3RKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIuZ2V0VW5tYW5nZWRIdG1sUGF0aChwYXRoLnRvU3RyaW5nKCkpOwotCQlpZiAoaHRtbFBhdGggIT0gbnVsbCkgewotCQkJVVJJIGZpbGVVcmkgPSAgbmV3IFBhdGgoaHRtbFBhdGgpLnRvRmlsZSgpLnRvVVJJKCk7Ci0JCQlyZXR1cm4gZmlsZVVyaTsKLQkJCS8vCQkJdHJ5IHsKLS8vCQkJCXJldHVybiBuZXcgVVJJKGh0bWxQYXRoKTsKLS8vCQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGV4KSB7Ci0vLwkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQkJfQotCQl9Ci0vLwkJZWxzZSB7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlyZXR1cm4gbmV3IFVSSShwYXRoLnRvU3RyaW5nKCkpOwotLy8JCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZXgpIHsKLS8vCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLS8vCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotLy8JCQl9Ci0vLwkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4gSUpzR2xvYmFsU2NvcGVDb250YWluZXIuS19TWVNURU07Ci0JfQotCQotCQotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotCQlyZXR1cm4gbmV3IFBhdGgoSnNXZWJOYXR1cmUuVklSVFVBTF9DT05UQUlORVIpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldEluY2x1ZGVwYXRoRW50cmllcygpfSBpbnN0ZWFkCi0JICovCi0JcHVibGljIElJbmNsdWRlUGF0aEVudHJ5W10gZ2V0Q2xhc3NwYXRoRW50cmllcygpIHsKLQkJcmV0dXJuIGdldEluY2x1ZGVwYXRoRW50cmllcygpOwotCX0KLQlwdWJsaWMgSUluY2x1ZGVQYXRoRW50cnlbXSBnZXRJbmNsdWRlcGF0aEVudHJpZXMoKSB7Ci0JCQotCQkvL0lJbmNsdWRlUGF0aEVudHJ5IGVudHJ5PW51bGw7Ci0JCQotCXJldHVybiBuZXcgSUluY2x1ZGVQYXRoRW50cnlbMF07Ci0vLwkJdHJ5IHsKLS8vCQkKLS8vCQkJCi0vLwkJCQotLy8JCQlJUGF0aCBjb250ZXh0UGF0aCA9IGdldFdlYkNvbnRleHRSb290KGphdmFQcm9qZWN0KTsKLS8vCQkJLy9lbnRyeSA9SmF2YVNjcmlwdENvcmUubmV3TGlicmFyeUVudHJ5KGNvbnRleHRQYXRoLm1ha2VBYnNvbHV0ZSgpLCBudWxsLG51bGwsIG5ldyBJQWNjZXNzUnVsZVswXSwgbmV3IElJbmNsdWRlUGF0aEF0dHJpYnV0ZVswXSwgdHJ1ZSk7Ci0vLwkJCS8vZW50cnkgPUphdmFTY3JpcHRDb3JlLm5ld0xpYnJhcnlFbnRyeShjb250ZXh0UGF0aC5tYWtlQWJzb2x1dGUoKSwgbnVsbCwgbnVsbCwgbmV3IElBY2Nlc3NSdWxlWzBdLCBuZXcgSUluY2x1ZGVQYXRoQXR0cmlidXRlWzBdLCB0cnVlKTsKLS8vCQkJLy9lbnRyeSA9SmF2YVNjcmlwdENvcmUubmV3U291cmNlRW50cnkoY29udGV4dFBhdGgubWFrZUFic29sdXRlKCkpOwotLy8JCQllbnRyeSA9IG5ldyBDbGFzc3BhdGhFbnRyeSgKLS8vCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSwKLS8vCQkJCQlJSW5jbHVkZVBhdGhFbnRyeS5DUEVfU09VUkNFLAotLy8JCQkJCWNvbnRleHRQYXRoLm1ha2VBYnNvbHV0ZSgpLAotLy8JCQkJCUNsYXNzcGF0aEVudHJ5LklOQ0xVREVfQUxMLCBDbGFzc3BhdGhFbnRyeS5FWENMVURFX05PTkUsCi0vLwkJCQkJbnVsbCwgLy8gc291cmNlIGF0dGFjaG1lbnQKLS8vCQkJCQludWxsLCAvLyBzb3VyY2UgYXR0YWNobWVudCByb290Ci0vLwkJCQkJbnVsbCwgLy8gY3VzdG9tIG91dHB1dCBsb2NhdGlvbgotLy8JCQkJCWZhbHNlLAotLy8JCQkJCW51bGwsCi0vLwkJCQkJZmFsc2UsIC8vIG5vIGFjY2VzcyBydWxlcyB0byBjb21iaW5lCi0vLwkJCQkJbmV3IElJbmNsdWRlUGF0aEF0dHJpYnV0ZVtdIHtDbGFzc3BhdGhFbnRyeS5FWENMVURFX1ZBTElEQVRFfSk7IAotLy8JCQkKLS8vCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLS8vCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJfQotLy8JCQotLy8JCWlmKGVudHJ5IT1udWxsKSByZXR1cm4gbmV3IElJbmNsdWRlUGF0aEVudHJ5W10ge2VudHJ5fTsKLS8vCQlyZXR1cm4gbmV3IElJbmNsdWRlUGF0aEVudHJ5WzBdOwotCX0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhU2NyaXB0UHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vdGhpcy5qYXZhUHJvamVjdCA9IHByb2plY3Q7Ci0JCXN1cGVyLmluaXRpYWxpemUoY29udGFpbmVyUGF0aCwgcHJvamVjdCk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFdlYkNvbnRleHRSb290KElKYXZhU2NyaXB0UHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlJUGF0aCBwcm9qZWN0UmVsYXRpdmVXZWJSb290ID0gV2ViUm9vdEZpbmRlci5nZXRXZWJDb250ZW50Rm9sZGVyKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7CQotCQlJUGF0aCB3ZWJSb290UGF0aCA9IGphdmFQcm9qZWN0LmdldFBhdGgoKS5hcHBlbmQocHJvamVjdFJlbGF0aXZlV2ViUm9vdCk7Ci0JCXJldHVybiB3ZWJSb290UGF0aDsKLQl9Ci0JCi0vLwlwdWJsaWMgSVBhdGhbXSBnZXRBbGxIdG1sSW5Qcm9qZWN0KCkgewotLy8JCWZpbmFsIEFycmF5TGlzdCBmb3VuZCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlTdHJpbmcgd2ViUm9vdCA9IGdldFdlYkNvbnRleHRSb290KGphdmFQcm9qZWN0KS50b1N0cmluZygpOwkKLS8vCQkJSVJlc291cmNlUHJveHlWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVJlc291cmNlUHJveHlWaXNpdG9yKCkKLS8vCQkJewotLy8JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoIElSZXNvdXJjZVByb3h5IHByb3h5ICkgdGhyb3dzIENvcmVFeGNlcHRpb24KLS8vCQkJCXsKLS8vCQkJCQlpZiAoIHByb3h5LmdldE5hbWUoKS5lbmRzV2l0aCggIi5odG0iICkgKQotLy8JCQkJCXsKLS8vCQkJCQkJSVBhdGggcGF0aCA9IHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLmdldExvY2F0aW9uKCk7Ci0vLwkJCQkJCWZvdW5kLmFkZChwYXRoKTsKLS8vCQkJCQkJLy9JSW5jbHVkZVBhdGhFbnRyeSBuZXdMaWJyYXJ5RW50cnkgPSBKYXZhU2NyaXB0Q29yZS5uZXdMaWJyYXJ5RW50cnkoIHBhdGgsbnVsbCwgbnVsbCwgbmV3IElBY2Nlc3NSdWxlWyAwIF0sIG5ldyBJSW5jbHVkZVBhdGhBdHRyaWJ1dGVbIDAgXSwgdHJ1ZSApOwotLy8JCQkJCQkvL2VudHJpZXMuYWRkKCBuZXdMaWJyYXJ5RW50cnkgKTsKLS8vCQkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJCX0KLS8vCQkJCQkKLS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCX0KLS8vCQkJfTsKLS8vCQkJdHJ5Ci0vLwkJCXsKLS8vCQkJCWphdmFQcm9qZWN0LmdldFByb2plY3QoKS5maW5kTWVtYmVyKCBuZXcgUGF0aCh3ZWJSb290KSApLmFjY2VwdCggdmlzaXRvciwgMCApOwotLy8JCQl9Ci0vLwkJCWNhdGNoICggQ29yZUV4Y2VwdGlvbiBlICkKLS8vCQkJewotLy8JCQl9Ci0vLwkJCi0vLwkJCi0vLwkJcmV0dXJuIChJUGF0aFtdKWZvdW5kLnRvQXJyYXkobmV3IElQYXRoW2ZvdW5kLnNpemUoKV0pOwotLy8JCi0vLwl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MDFiZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUpzTmF0dXJlVW5pbnN0YWxsZXIuMT1Vbmluc3RhbGxpbmcgSmF2YVNjcmlwdCBEZXZlbG9wbWVudCBUb29scy4uLgotSnNOYXR1cmVVbmluc3RhbGxlci4yPVJlbW92aW5nIEphdmFTY3JpcHQgRGV2ZWxvcG1lbnQgVG9vbHMgTmF0dXJlLi4uCi1Kc05hdHVyZVVuaW5zdGFsbGVyLjM9RXJyb3IgaW5zdGFsbGluZyBydW50aW1lXCEgSmF2YVNjcmlwdCBEZXZlbG9wbWVudCBUb29scyBjb3VsZCBub3QgYmUgcmVtb3ZlZCwgb3IgaXMgbm90IHByZXNlbnQgaW4gdGFyZ2V0IHByb2plY3QuLgotSnNOYXR1cmVJbnN0YWxsZXIuMT1JbnN0YWxsaW5nIEphdmFTY3JpcHQgRGV2ZWxvcG1lbnQgVG9vbHMuLi4KLUpzTmF0dXJlSW5zdGFsbGVyLjI9QWRkaW5nIEphdmFTY3JpcHQgRGV2ZWxvcG1lbnQgVG9vbGtpdCBOYXR1cmUuLi4KLUpzTmF0dXJlSW5zdGFsbGVyLjM9RXJyb3IgaW5zdGFsbGluZyBydW50aW1lXCEgSmF2YVNjcmlwdCBEZXZlbG9wbWVudCBUb29scyBjb3VsZCBub3QgYmUgYWRkZWQuLgotSnNXZWJOYXR1cmUuNT1FcnJvciBjaGVja2luZyBzb3VyY2VwYXRoOgotSnNXZWJOYXR1cmUuNj1FcnJvciBjaGVja2luZyBzb3VyY2VwYXRoOgotV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplci4wPUphdmFTY3JpcHQgV2ViIFByb2plY3Qgc3VwcG9ydApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckVtYmVkZWRKcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckVtYmVkZWRKcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGY4NzM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JFbWJlZGVkSnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7Ci0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50VHlwZUlkRm9yRW1iZWRlZEpzIHsKLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4KLQkgKiBwbHVnaW4ueG1sIGZpbGUuIE5vdGU6IHRoaXMgdmFsdWUgaXMgaW50ZW50aWFsbHkgc2V0IHdpdGggZGVmYXVsdAotCSAqIHByb3RlY3RlZCBtZXRob2Qgc28gaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZ1tdIENvbnRlbnRUeXBlSWRzID0gQ29udGVudFR5cGVJZEZvckVtYmVkZWRKcy4gZ2V0SnNDb25zdGFudFN0cmluZygpOwotCi0Jc3RhdGljIFN0cmluZ1tdIGdldEpzQ29uc3RhbnRTdHJpbmcoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiLCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQkKLQlwcml2YXRlIENvbnRlbnRUeXBlSWRGb3JFbWJlZGVkSnMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjQ4Zjg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0lDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvZGVkUmVzb3VyY2VQbHVnaW47Ci0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUCB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lIENPTlRFTlRfRkFNSUxZX0FUVFJJQlVURSA9IG5ldyBRdWFsaWZpZWROYW1lKElDb2RlZFJlc291cmNlUGx1Z2luLklELCAiY29udGVudEZhbWlseUF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkOwotCS8qKgotCSAqIEV4dHJhIHByb3BlcnRpZXMgYXMgcGFydCBvZiBDb250ZW50RGVzY3JpcHRpb24sIGlmIHRoZSBjb250ZW50IGlzIEpTUC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgQ09OVEVOVF9UWVBFX0FUVFJJQlVURSA9IG5ldyBRdWFsaWZpZWROYW1lKElDb2RlZFJlc291cmNlUGx1Z2luLklELCAiY29udGVudFR5cGVBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBMQU5HVUFHRV9BVFRSSUJVVEUgPSBuZXcgUXVhbGlmaWVkTmFtZShJQ29kZWRSZXNvdXJjZVBsdWdpbi5JRCwgImxhbmd1YWdlQXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSnNWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSnNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEyNGZkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBKc1ZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciwgSUV4ZWN1dGFibGVFeHRlbnNpb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBCb29sZWFuLnZhbHVlT2YoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzdmFsaWRhdG9yIikpLmJvb2xlYW5WYWx1ZSgpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJVmFsaWRhdG9yIGZNZXNzYWdlT3JpZ2luYXRvcjsKLQlwcml2YXRlIFNldCBmVmFsaWRGaWxlRXh0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTUVUQURBVEFfRklMRVMgPSBuZXcgU3RyaW5nW117Ii5zZXR0aW5ncy8uanNkdHNjb3BlIiwiLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnN1cGVyVHlwZS5jb250YWluZXIiLCIuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc3VwZXJUeXBlLm5hbWUifTsKLQkKLS8vCXByaXZhdGUgc3RhdGljIFN0cmluZyBbXSBqc2R0VmFsaWRhdG9yID0geyJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpzQmF0Y2hWYWxpZGF0b3IifTsgLy8kTk9OLU5MUy0xJAotCi0JCi0JcHJvdGVjdGVkIGNsYXNzIExvY2FsaXplZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgX21lc3NhZ2UgPSBudWxsOwotCQkKLQkJcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQpIHsKLQkJCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCBudWxsKTsKLQkJfQotCQkKLQkJcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIElSZXNvdXJjZSB0YXJnZXRPYmplY3QpIHsKLQkJCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCAoT2JqZWN0KSB0YXJnZXRPYmplY3QpOwotCQl9Ci0JCQotCQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgT2JqZWN0IHRhcmdldE9iamVjdCkgewotCQkJc3VwZXIobnVsbCwgc2V2ZXJpdHksIG51bGwpOwotCQkJc2V0TG9jYWxpemVkTWVzc2FnZShtZXNzYWdlVGV4dCk7Ci0JCQlzZXRUYXJnZXRPYmplY3QodGFyZ2V0T2JqZWN0KTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkgewotCQkJcmV0dXJuIF9tZXNzYWdlOwotCQl9Ci0JCQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChDbGFzc0xvYWRlciBjbCkgewotCQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCkgewotCQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCwgQ2xhc3NMb2FkZXIgY2wpIHsKLQkJCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldExvY2FsaXplZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCV9tZXNzYWdlID0gbWVzc2FnZTsKLQkJfQotCX0KLQlwdWJsaWMgSnNWYWxpZGF0b3IoKSB7Ci0JCXRoaXMuZk1lc3NhZ2VPcmlnaW5hdG9yID0gdGhpczsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBJTWVzc2FnZSBmcm9tIGFuIElQcm9ibGVtCi0JICogCi0JICogQHBhcmFtIHByb2JsZW0KLQkgKiBAcGFyYW0gZgotCSAqIEBwYXJhbSB0cmFuc2xhdGlvbgotCSAqIEBwYXJhbSB0ZXh0RG9jCi0JICogQHJldHVybiBtZXNzYWdlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm9ibGVtLCBvciBudWxsIGlmIGl0IGNvdWxkIG5vdAotCSAqICAgICAgICAgY3JlYXRlIG9uZQotCSAqLwotCXByaXZhdGUgSU1lc3NhZ2UgY3JlYXRlTWVzc2FnZUZyb21Qcm9ibGVtKElQcm9ibGVtIHByb2JsZW0sIElGaWxlIGYsIElKc1RyYW5zbGF0aW9uIHRyYW5zbGF0aW9uLCBJRG9jdW1lbnQgdGV4dERvYykgewotCQlpbnQgc291cmNlU3RhcnQgPSBwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCk7Ci0JCWludCBzb3VyY2VFbmQgPSBwcm9ibGVtLmdldFNvdXJjZUVuZCgpOwotCQlpZiAoc291cmNlU3RhcnQgPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQkvKgotCQkgKiBCdWcgMjQxNzk0IC0gVmFsaWRhdGlvbiBzaG93cyBlcnJvcnMgd2hlbiB1c2luZyBKU1AgRXhwcmVzc2lvbnMKLQkJICogaW5zaWRlIEphdmFTY3JpcHQgY29kZQotCQkgKi8KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgdGV4dERvYzsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGRvYy5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzb3VyY2VTdGFydCk7Ci0JCWlmIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc291cmNlU3RhcnQpOwotCQkJLyoKLQkJCSAqIEZpbHRlciBvdXQgcHJvYmxlbXMgZnJvbSBhcmVhcyB0aGF0IGFyZW4ndCBzaW1wbGUgSmF2YVNjcmlwdCwKLQkJCSAqIGUuZy4gSlNQLgotCQkJICovCi0JCQlpZiAodGV4dFJlZ2lvbiAhPSBudWxsICYmIHRleHRSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpbnQgc2V2ID0gcHJvYmxlbS5pc0Vycm9yKCkgPyBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZIDogKHByb2JsZW0uaXNXYXJuaW5nKCkgPyBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkgOiBJTWVzc2FnZS5MT1dfU0VWRVJJVFkpOwotCQlJTWVzc2FnZSBtID0gbmV3IExvY2FsaXplZE1lc3NhZ2Uoc2V2LCBwcm9ibGVtLmdldE1lc3NhZ2UoKSwgZik7Ci0JCS8vIGxpbmUgbnVtYmVycyBmb3IgbWFya2VyIHN0YXJ0cyBAIDEKLQkJLy8gbGluZSBudW1iZXJzIGZyb20gZG9jdW1lbnQgc3RhcnRzIEAgMAotCQl0cnkgewotCQkJaW50IGxpbmVObyA9IHRleHREb2MuZ2V0TGluZU9mT2Zmc2V0KHNvdXJjZVN0YXJ0KSArIDE7Ci0JCQltLnNldExpbmVObyhsaW5lTm8pOwotCQkJbS5zZXRPZmZzZXQoc291cmNlU3RhcnQpOwotCQkJbS5zZXRMZW5ndGgoc291cmNlRW5kIC0gc291cmNlU3RhcnQgKyAxKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gbTsKLQl9Ci0JCi0Jdm9pZCBwZXJmb3JtVmFsaWRhdGlvbihJRmlsZSBmLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaW5CYXRjaCkgewotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIG1vZGVsOwotCQkJc2V0dXBBZGFwdGVyRmFjdG9yeShkb21Nb2RlbCk7Ci0JCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyIHRyYW5zbGF0aW9uQWRhcHRlciA9IChKc1RyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJLy90cmFuc2xhdGlvbkFkYXB0ZXIucmVzb3VyY2VDaGFuZ2VkKCk7Ci0JCQlJSnNUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uQWRhcHRlci5nZXRKc1RyYW5zbGF0aW9uKGZhbHNlKTsKLQkJCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJCXRyYW5zbGF0aW9uLnNldFByb2JsZW1Db2xsZWN0aW5nQWN0aXZlKHRydWUpOwotCQkJCXRyYW5zbGF0aW9uLnJlY29uY2lsZUNvbXBpbGF0aW9uVW5pdCgpOwotCQkJCUxpc3QgcHJvYmxlbXMgPSB0cmFuc2xhdGlvbi5nZXRQcm9ibGVtcygpOwotLy8JCQkJaWYoIWluQmF0Y2gpIHJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMsIGYpOwotCQkJCS8vIGFkZCBuZXcgbWVzc2FnZXMKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2JsZW1zLnNpemUoKSAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKTsgaSsrKSB7Ci0JCQkJCUlNZXNzYWdlIG0gPSBjcmVhdGVNZXNzYWdlRnJvbVByb2JsZW0oKElQcm9ibGVtKSBwcm9ibGVtcy5nZXQoaSksIGYsIHRyYW5zbGF0aW9uLCBkb21Nb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQkJCWlmIChtICE9IG51bGwpIHsKLQkJCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKiBSZWFkIHRoZSBkZWZpbml0aW9uIGZvciB0aGlzIHZhbGlkYXRvciBhbmQgdGhlIGRlY2xhcmVkIHZhbGlkIGZpbGUgZXh0ZW5zaW9ucwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uI3NldEluaXRpYWxpemF0aW9uRGF0YShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxpemF0aW9uRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZGF0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBpbmNsdWRlcyA9IGNvbmZpZy5nZXRDaGlsZHJlbigiaW5jbHVkZSIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGZpbGVleHRzID0gaW5jbHVkZXNbaV0uZ2V0Q2hpbGRyZW4oImZpbGVleHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmaWxlZXh0cy5sZW5ndGg7IGorKykgewotCQkJCVN0cmluZyBmaWxlZXh0ID0gZmlsZWV4dHNbal0uZ2V0QXR0cmlidXRlKCJleHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChmaWxlZXh0ICE9IG51bGwpIHsKLQkJCQkJZlZhbGlkRmlsZUV4dHMuYWRkKGZpbGVleHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgb3VyIHRyYW5zbGF0aW9uIGFkYXB0ZXIgaXMgcHJlc2VudCBiZWZvcmUgd2UgdHJ5IHRvIHVzZSBpdAotCSAqIAotCSAqIEBwYXJhbSBzbQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cEFkYXB0ZXJGYWN0b3J5KElTdHJ1Y3R1cmVkTW9kZWwgc20pIHsKLQkJaWYgKHNtLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpID09IG51bGwpIHsKLQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEpzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSgpOwotCQkJc20uZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCX0KLQkKLQlib29sZWFuIHNob3VsZFZhbGlkYXRlKElGaWxlIGZpbGUpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZmlsZTsKLQkJZG8gewotCQkJaWYgKHJlc291cmNlLmlzRGVyaXZlZCgpIHx8IHJlc291cmNlLmlzVGVhbVByaXZhdGVNZW1iZXIoKSB8fCAhcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkgfHwgcmVzb3VyY2UuZ2V0TmFtZSgpLmNoYXJBdCgwKSA9PSAnLicpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXNvdXJjZSA9IHJlc291cmNlLmdldFBhcmVudCgpOwotCQl9IHdoaWxlICgocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLlBST0pFQ1QpID09IDApOwotCQlyZXR1cm4gZlZhbGlkRmlsZUV4dHMuaXNFbXB0eSgpIHx8IGZWYWxpZEZpbGVFeHRzLmNvbnRhaW5zKGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8qIEFkZGVkIGJ5IEJDIC0tLS0gKi8KLQkJLy8gaWYodHJ1ZSkgcmV0dXJuOwotCQkvKiBlbmQgQWRkZWQgYnkgQkMgLS0tLSAqLwotCQkKLQkJU3RyaW5nW10gdXJpcyA9IGhlbHBlci5nZXRVUklzKCk7Ci0JCWlmICh1cmlzLmxlbmd0aCA+IDApIHsKLQkJCUlXb3Jrc3BhY2VSb290IHdzUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQlJRmlsZSBjdXJyZW50RmlsZSA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaXMubGVuZ3RoICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIHsKLQkJCQljdXJyZW50RmlsZSA9IHdzUm9vdC5nZXRGaWxlKG5ldyBQYXRoKHVyaXNbaV0pKTsKLQkJCQlyZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzLCBjdXJyZW50RmlsZSk7Ci0JCQkJaWYgKGN1cnJlbnRGaWxlICE9IG51bGwgJiYgY3VycmVudEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJaWYgKHNob3VsZFZhbGlkYXRlKGN1cnJlbnRGaWxlKSApeyAvLyYmIGZyYWdtZW50Q2hlY2soY3VycmVudEZpbGUpKSB7Ci0JCQkJCQlpbnQgcGVyY2VudCA9IChpICogMTAwKSAvIHVyaXMubGVuZ3RoICsgMTsKLQkJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksIHBlcmNlbnQgKyAiJSAiICsgdXJpc1tpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQkJdmFsaWRhdGVGaWxlKGN1cnJlbnRGaWxlLCByZXBvcnRlcik7Ci0JCQkJCX0KLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInZhbGlkYXRpbmc6IFsiICsgdXJpc1tpXSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gaWYgdXJpc1tdIGxlbmd0aCAwIC0+IHZhbGlkYXRlKCkgZ2V0cyBjYWxsZWQgZm9yIGVhY2ggcHJvamVjdAotCQkJaWYgKGhlbHBlciBpbnN0YW5jZW9mIElXb3JrYmVuY2hDb250ZXh0KSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9ICgoSVdvcmtiZW5jaENvbnRleHQpIGhlbHBlcikuZ2V0UHJvamVjdCgpOwotCQkJCUpTRmlsZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBKU0ZpbGVWaXNpdG9yKHJlcG9ydGVyKTsKLQkJCQl0cnkgewotCQkJCQkvLyBjb2xsZWN0IGFsbCBqc3AgZmlsZXMgZm9yIHRoZSBwcm9qZWN0Ci0JCQkJCXByb2plY3QuYWNjZXB0KHZpc2l0b3IsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlJRmlsZVtdIGZpbGVzID0gdmlzaXRvci5nZXRGaWxlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIHsKLQkJCQkJaW50IHBlcmNlbnQgPSAoaSAqIDEwMCkgLyBmaWxlcy5sZW5ndGggKyAxOwotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBwZXJjZW50ICsgIiUgIiArIGZpbGVzW2ldLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sodGhpcywgbWVzc2FnZSk7Ci0JCQkJCXZhbGlkYXRlRmlsZShmaWxlc1tpXSwgcmVwb3J0ZXIpOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidmFsaWRhdGluZzogWyIgKyBmaWxlc1tpXSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEpTRmlsZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCQlwcml2YXRlIExpc3QgZkZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlwcml2YXRlIElSZXBvcnRlciBmUmVwb3J0ZXIgPSBudWxsOwotCQkKLQkJcHVibGljIEpTRmlsZVZpc2l0b3IoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCQlmUmVwb3J0ZXIgPSByZXBvcnRlcjsKLQkJfQotCQkKLQkJcHVibGljIGZpbmFsIElGaWxlW10gZ2V0RmlsZXMoKSB7Ci0JCQlyZXR1cm4gKElGaWxlW10pIGZGaWxlcy50b0FycmF5KG5ldyBJRmlsZVtmRmlsZXMuc2l6ZSgpXSk7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJLy8gY2hlY2sgdmFsaWRhdGlvbgotCQkJaWYgKGZSZXBvcnRlci5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCWlmIChVdGlsLmlzSnNUeXBlKHByb3h5LmdldE5hbWUoKSkpIHsKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcHJveHkucmVxdWVzdFJlc291cmNlKCk7Ci0JCQkJCWlmIChmaWxlLmV4aXN0cygpICYmIHNob3VsZFZhbGlkYXRlKGZpbGUpKSB7Ci0JCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigrKSBKU1BWYWxpZGF0b3IgYWRkaW5nIGZpbGU6ICIgKyBmaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWZGaWxlcy5hZGQoZmlsZSk7Ci0JCQkJCQkvLyBkb24ndCBzZWFyY2ggZGVlcGVyIGZvciBmaWxlcwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQkvKioKLQkgKiBWYWxpZGF0ZSBvbmUgZmlsZS4gSXQncyBhc3N1bWVkIHRoYXQgdGhlIGZpbGUgaGFzIEpTUCBjb250ZW50IHR5cGUuCi0JICogCi0JICogQHBhcmFtIGYKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKi8KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUZpbGUoSUZpbGUgZiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmIChKc1ZhbGlkYXRvci5ERUJVRykgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHZhbGlkYXRpbmc6ICIgKyBmKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJLy8gZ2V0IGpzcCBtb2RlbCwgZ2V0IHRyYW5sc2F0aW9uCi0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGYpOwotCQkJaWYgKCFyZXBvcnRlci5pc0NhbmNlbGxlZCgpICYmIG1vZGVsICE9IG51bGwpIHsKLQkJCQkvLyBnZXQgRE9NIG1vZGVsIHRoZW4gdHJhbnNsYXRpb24KLQkJCQkvL1dvcmtiZW5jaFJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKGYuZ2V0UHJvamVjdCgpLCBqc2R0VmFsaWRhdG9yLCBmLnRvU3RyaW5nKCkpOwotCQkJCS8vcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXMoZk1lc3NhZ2VPcmlnaW5hdG9yLCBmKTsKLQkJCQlwZXJmb3JtVmFsaWRhdGlvbihmLCByZXBvcnRlciwgbW9kZWwsIGZhbHNlKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCX0KLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFIHx8ICFzaG91bGRWYWxpZGF0ZSgoSUZpbGUpIHJlc291cmNlKSkKLQkJCXJldHVybiBudWxsOwotCQlWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7Ci0JCUlSZXBvcnRlciByZXBvcnRlciA9IHJlc3VsdC5nZXRSZXBvcnRlcihtb25pdG9yKTsKLQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7Ci0JCXZhbGlkYXRlRmlsZShmaWxlLCByZXBvcnRlcik7Ci0JCXJlc3VsdC5zZXREZXBlbmRzT24oY3JlYXRlRGVwZW5kZW5jaWVzKGZpbGUpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZVtdIGNyZWF0ZURlcGVuZGVuY2llcyhJRmlsZSBmaWxlKSB7Ci0JCUlGaWxlW10gZGVwZW5kcyA9IG5ldyBJRmlsZVtNRVRBREFUQV9GSUxFUy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IE1FVEFEQVRBX0ZJTEVTLmxlbmd0aDsgaSsrKSB7Ci0JCQlkZXBlbmRzW2ldID0gZmlsZS5nZXRQcm9qZWN0KCkuZ2V0RmlsZShNRVRBREFUQV9GSUxFU1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGRlcGVuZHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU4NGE3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JFbWJlZGVkSnM7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIFV0aWwgewotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pzVHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaWYoZmlsZU5hbWU9PW51bGwpIHJldHVybiBmYWxzZTsKLQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9Z2V0SmF2YXNjcmlwdENvbnRlbnRUeXBlcygpOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlICh0eXBlcyE9bnVsbCAmJiBpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJdmFsaWQgPSB0eXBlc1tpXSE9bnVsbCAmJiB0eXBlc1tpXS5pc0Fzc29jaWF0ZWRXaXRoKGZpbGVOYW1lKTsKLQkJCSsraTsKLQkJfQotCQlyZXR1cm4gdmFsaWQ7Ci0JCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElDb250ZW50VHlwZVtdIGdldEphdmFzY3JpcHRDb250ZW50VHlwZXMoKSB7Ci0KLQkJU3RyaW5nW10gY29udGVudFR5cGVJZHMgPSBDb250ZW50VHlwZUlkRm9yRW1iZWRlZEpzLkNvbnRlbnRUeXBlSWRzOwotCQlBcnJheUxpc3QgZkNvbnRlbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCQotCQlmb3IoaW50IGkgPSAwO2k8Y29udGVudFR5cGVJZHMubGVuZ3RoO2krKykgewotCQkJSUNvbnRlbnRUeXBlIGN0ID0gIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWRzW2ldKTsKLQkJCWlmKGN0IT1udWxsKSBmQ29udGVudFR5cGVzLmFkZChjdCk7Ci0JCX0KLQkJCi0JCXJldHVybiAoSUNvbnRlbnRUeXBlW10pZkNvbnRlbnRUeXBlcy50b0FycmF5KG5ldyBJQ29udGVudFR5cGVbZkNvbnRlbnRUeXBlcy5zaXplKCldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0NvbXBpbGF0aW9uVW5pdEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Db21waWxhdGlvblVuaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiZWI4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0NvbXBpbGF0aW9uVW5pdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JUHJvYmxlbVJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLldvcmtpbmdDb3B5T3duZXI7Ci0KLS8qKgotCi0KLQotCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIDxicj48YnI+IHRoaXMgY29kZSB3YXMgdGFrZW4gZnJvbSB0aGUgSlNQIHBsdWdpbi4gIFRoaXMgY2xhc3MgaXMgdG8gZW5zdXJlIG9ubHkgb25lIGNvcHkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgZXhpdHMuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21waWxhdGlvblVuaXRIZWxwZXIgewotCXByaXZhdGUgc3RhdGljIENvbXBpbGF0aW9uVW5pdEhlbHBlciBpbnN0YW5jZTsKLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBmaW5hbCBDb21waWxhdGlvblVuaXRIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChDb21waWxhdGlvblVuaXRIZWxwZXIuaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJQ29tcGlsYXRpb25Vbml0SGVscGVyLmluc3RhbmNlID0gbmV3IENvbXBpbGF0aW9uVW5pdEhlbHBlcigpOwotCQl9Ci0JCXJldHVybiBDb21waWxhdGlvblVuaXRIZWxwZXIuaW5zdGFuY2U7Ci0JfQotCXByaXZhdGUgSnNQcm9ibGVtUmVxdWVzdG9yIGZQcm9ibGVtUmVxdWVzdG9yID0gbnVsbDsKLQlwcml2YXRlIFdvcmtpbmdDb3B5T3duZXIgZldvcmtpbmdDb3B5T3duZXIgPSBudWxsOwotCQotCXByaXZhdGUgQ29tcGlsYXRpb25Vbml0SGVscGVyKCkgewotCS8vIGZvcmNlIHVzZSBvZiBpbnN0YW5jZQotCX0KLQkKLQlwdWJsaWMgSnNQcm9ibGVtUmVxdWVzdG9yIGdldFByb2JsZW1SZXF1ZXN0b3IoKSB7Ci0JCWlmIChmUHJvYmxlbVJlcXVlc3RvciA9PSBudWxsKSB7Ci0JCQlmUHJvYmxlbVJlcXVlc3RvciA9IG5ldyBKc1Byb2JsZW1SZXF1ZXN0b3IoKTsKLQkJfQotCQlyZXR1cm4gZlByb2JsZW1SZXF1ZXN0b3I7Ci0JfQotCQotCXB1YmxpYyBXb3JraW5nQ29weU93bmVyIGdldFdvcmtpbmdDb3B5T3duZXIoKSB7Ci0JCWlmIChmV29ya2luZ0NvcHlPd25lciA9PSBudWxsKSB7Ci0JCQlmV29ya2luZ0NvcHlPd25lciA9IG5ldyBXb3JraW5nQ29weU93bmVyKCkgewotCQkJCS8qIChub24tSmF2YWRvYykKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuV29ya2luZ0NvcHlPd25lciNnZXRQcm9ibGVtUmVxdWVzdG9yKG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRVbml0KQotCQkJCSAqLwotCQkJCXB1YmxpYyBJUHJvYmxlbVJlcXVlc3RvciBnZXRQcm9ibGVtUmVxdWVzdG9yKElKYXZhU2NyaXB0VW5pdCB3b3JraW5nQ29weSkgewotCQkJCQlyZXR1cm4gQ29tcGlsYXRpb25Vbml0SGVscGVyLnRoaXMuZ2V0UHJvYmxlbVJlcXVlc3RvcigpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQlyZXR1cm4gIkNsaWVudCBKYXZhU2NyaXB0IFdvcmtpbmdDb3B5T3duZXIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gZldvcmtpbmdDb3B5T3duZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Eb2N1bWVudENoYW5nZUxpc3RlbmVyVG9UZXh0RWRpdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Eb2N1bWVudENoYW5nZUxpc3RlbmVyVG9UZXh0RWRpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzIwYmE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lclRvVGV4dEVkaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuRGVsZXRlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSogPGJyPjxicj4KLSogCi0qIHRoaXMgY2xhc3MgYXR0YWNoZXMgdG8gYSAiY2xvbmVkIiBkb2N1bWVudCwgbGlzdGVucyBmb3IgY2hhbmdlcyB0byB0aGF0IGRvY3VtZW50IHRoZW4gdHJhbnNsYXRlcwotKiB0aGUgY2hhbmdlcyB0byB0ZXh0IGVkaXRzLiAgdGhlc2UgY2hhbmdlcyBjYW4gdGhlbiBiZSBhcHBsaWVkIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGRvY3VtZW50LgotKiAKLSoKLSovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lclRvVGV4dEVkaXQgaW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBNdWx0aVRleHRFZGl0IHRleHRFZGl0OwotCQotCXB1YmxpYyBEb2N1bWVudENoYW5nZUxpc3RlbmVyVG9UZXh0RWRpdCgpIHsKLQkJdGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiVW5pbXBsZW1lbnRlZAotCS8vIG1ldGhvZDpEb2N1bWVudENoYW5nZUxpc3RlbmVyVG9UZXh0RWRpdC5kb2N1bWVudEFib3V0VG9CZUNoYW5nZWQiKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJaW50IGxlbmd0aCA9IGV2ZW50LmdldExlbmd0aCgpOwotCQlpbnQgb2Zmc2V0ID0gZXZlbnQuZ2V0T2Zmc2V0KCk7Ci0JCVN0cmluZyB0ZXh0ID0gZXZlbnQuZ2V0VGV4dCgpOwotCQlpZiAobGVuZ3RoIDwgMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChsZW5ndGggPT0gMCkgewotCQkJLyogaW5zZXJ0aW5nIHRleHQgb3BlcmF0aW9uICovCi0JCQlJbnNlcnRFZGl0IGVkaXQgPSBuZXcgSW5zZXJ0RWRpdChvZmZzZXQsIHRleHQpOwotCQkJdGV4dEVkaXQuYWRkQ2hpbGQoZWRpdCk7Ci0JCQkKLQkJfSBlbHNlIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8qIGRlbGV0ZSBvcGVyYXRpb24gKi8KLQkJCURlbGV0ZUVkaXQgZWRpdCA9IG5ldyBEZWxldGVFZGl0KG9mZnNldCwgbGVuZ3RoKTsKLQkJCXRleHRFZGl0LmFkZENoaWxkKGVkaXQpOwotCQkJCi0JCX0gZWxzZSBpZiAobGVuZ3RoID4gMCkgewotCQkJLyogcmVwbGFjZSB0ZXh0IG9wZXJhdGlvbiAqLwotCQkJUmVwbGFjZUVkaXQgZWRpdCA9IG5ldyBSZXBsYWNlRWRpdChvZmZzZXQsIGxlbmd0aCwgdGV4dCk7Ci0JCQl0ZXh0RWRpdC5hZGRDaGlsZChlZGl0KTsKLQkJCi0JCX0KLQl9Ci0JCi0JcHVibGljIE11bHRpVGV4dEVkaXQgZ2V0VGV4dEVkaXRzKCkgewotCQlyZXR1cm4gdGV4dEVkaXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9IVE1MNDBOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSFRNTDQwTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNGQyMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9IVE1MNDBOYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSUpzVHJhbnNsYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSUpzVHJhbnNsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE2ZGQyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0lKc1RyYW5zbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0VW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLjxicj4KLSogCi0qLwotcHVibGljIGludGVyZmFjZSBJSnNUcmFuc2xhdGlvbiB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIElKYXZhU2NyaXB0UHJvamVjdCB0aGF0IHRoaXMgdHJhbnNsYXRpb24gYmVsb25ncyB0bwotCSAqLwotCXB1YmxpYyBJSmF2YVNjcmlwdFByb2plY3QgZ2V0SmF2YVByb2plY3QoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gT3JpZ2luYWwgSFRNTCBkb2N1bWVudCBmcm9tIHRoZSB0cmFuc2xhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGdldEh0bWxEb2N1bWVudCgpOwotCi0JLyoqCi0JICogQHJldHVybiBpbnRlZ2VyIHBvc2l0aW9uIG9mIGEgbWlzc2luZyA8L3NjcmlwdD4gdGFnICh0aGUgZG9jdW1lbnQgaXNuJ3Qgd2VsbCBmb3JtZWQgYW5kIHJlc3VsdGVkIGluIHRyYW5zbGF0aW9uIGVycm9yLikuCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRNaXNzaW5nVGFnU3RhcnQoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBqYXZhUG9zaXRpb25TdGFydAotCSAqIEBwYXJhbSBqYXZhUG9zaXRpb25FbmQKLQkgKiBAcmV0dXJuIGFsbCBqYXZhc2NyaXB0IGVsZW1lbnRzIHdpdGhpbiB0aGUgZ2l2ZW4gcmFuZ2UKLQkgKi8KLQlwdWJsaWMgSUphdmFTY3JpcHRFbGVtZW50W10gZ2V0QWxsRWxlbWVudHNJbkpzUmFuZ2UoaW50IGphdmFQb3NpdGlvblN0YXJ0LCBpbnQgamF2YVBvc2l0aW9uRW5kKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGphdmFzY3JpcHQgdW5pdCBmcm9tIHRoZSBqc2R0LmNvcmUKLQkgKi8KLQlwdWJsaWMgSUphdmFTY3JpcHRVbml0IGdldENvbXBpbGF0aW9uVW5pdCgpOwotCi0JLyoqCi0JICogQHBhcmFtIGphdmFQb3NpdGlvblN0YXJ0Ci0JICogQHBhcmFtIGphdmFQb3NpdGlvbkVuZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUphdmFTY3JpcHRFbGVtZW50W10gZ2V0RWxlbWVudHNGcm9tSnNSYW5nZShpbnQgamF2YVBvc2l0aW9uU3RhcnQsIGludCBqYXZhUG9zaXRpb25FbmQpOwotCi0JLyoqCi0JICogQHJldHVybiBzdHJpbmcgb2YgdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHRtbFRleHQoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBqc09mZnNldAotCSAqIEByZXR1cm4gYSBzaW5nbGUgamF2YXNjcmlwdCBlbGVtZW50IGF0IHRoZSBnaXZlbiBvZmZzZXQuCi0JICovCi0JcHVibGljIElKYXZhU2NyaXB0RWxlbWVudCBnZXRKc0VsZW1lbnRBdE9mZnNldChpbnQganNPZmZzZXQpOwotCi0JLyoqCi0JICogQHJldHVybiBvbmx5IHRoZSB0cmFuc2xhdGVkIGphdmFzY3JpcHQgdGV4dAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SnNUZXh0KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0aGUgc2NyaXB0IHJlZ2lvbnMgd2l0aGluIHRoZSB0cmFuc2xhdGlvbi4KLQkgKi8KLQlwdWJsaWMgUG9zaXRpb25bXSBnZXRTY3JpcHRQb3NpdGlvbnMoKTsKLQotCS8qKgotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0SW5GaXJzdFNjcmlwdFJlZ2lvbihTdHJpbmcgdGV4dCk7Ci0KLQkvKioKLQkgKiBpbnNlcnQgamF2YXNjcmlwdCBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LiAgbWV0aG9kIHNob3VsZCBlbnN1cmUgdGhlIGRvY3VtZW50cyB3ZWxsLWZvcm1lZG5lc3MgYW5kIHByb3BlciBzY3JpcHQgcmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydFNjcmlwdChpbnQgb2Zmc2V0LCBTdHJpbmcgdGV4dCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBqYXZhc2NyaXB0IGVycm9ycwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb2JsZW1zKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBpZiB0aGUgb2Zmc2V0IGlzIHdpdGhpbiBhIHNjcmlwdCBpbXBvcnQgbm9kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpZk9mZnNldEluSW1wb3J0Tm9kZShpbnQgb2Zmc2V0KTsKLQotCS8qKgotCSAqIGNoZWNrcyB0aGUgQ1UgZm9yIGVycm9ycy9jb25zaXN0YW5jeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGVDb21waWxhdGlvblVuaXQoKTsKLQotCS8qKgotCSAqIHJlbGVhc2UgdGhlIHRyYW5zbGF0aW9uLiAgYWx3YXlzIGEgZ29vZCBpZGVhIHRvIGRvIHdoZW4geW91J3JlIGRvbmUuICB5b3UgbWF5IG5vdGljZSBkb2N1bWVudCBhbmQgbW9kZWwgbG9ja3MgaWYgbm90LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKTsKLQkKLQkvKioKLQkgKiBmaXhlcyBhIG1hbmdsZWQgaHRtbC0tPiBwdXJlIGpzIG5hbWUuCi0JICogQHBhcmFtIGRpc3BsYXlTdHJpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBmaXh1cE1hbmdsZWROYW1lKFN0cmluZyBkaXNwbGF5U3RyaW5nKTsgCi0JCi0JLyoqCi0JICogc3RhcnQvc3RvcCBjb2xsZWN0aW5nIHByb2JsZW1zIHdpdGhpbiB0aGUgamF2YXNjcmlwdCB1bml0LgotCSAqIEBwYXJhbSBjb2xsZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvYmxlbUNvbGxlY3RpbmdBY3RpdmUoYm9vbGVhbiBjb2xsZWN0KTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKYXZhUGF0aCgpOwotCQotCS8qKgotCSAqIAotCSAqIAotCSAqIEBwYXJhbSBodG1sRG9jdW1lbnQKLQkgKiBAcGFyYW0gamF2YVByb2oKLQkgKiBAcGFyYW0gbGlzdGVuRm9yQ2hhbmdlcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUpzVHJhbnNsYXRpb24gZ2V0SW5zdGFuY2UoSVN0cnVjdHVyZWREb2N1bWVudCBodG1sRG9jdW1lbnQsIElKYXZhU2NyaXB0UHJvamVjdCBqYXZhUHJvaiwgYm9vbGVhbiBsaXN0ZW5Gb3JDaGFuZ2VzKSA7Ci0KLQkvKioKLQkgKiBub3RpZnkgdGhlIHRyYW5zbGF0aW9uIHRvIHVwZGF0ZSBhbnkgZXh0ZXJuYWwgZGVwZW5kYW5jaWVzIHRoYXQgYXJlIGNyZWF0ZWQgZHVyaW5nIHRyYW5zbGF0aW9uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgY2xhc3NwYXRoQ2hhbmdlKCkgOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSUpzVHJhbnNsYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9JSnNUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MjZjYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9JSnNUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElKc1RyYW5zbGF0b3IgZXh0ZW5kcyBJRG9jdW1lbnRMaXN0ZW5lcnsKLQotCS8qKgotCSAqIEByZXR1cm4gc3RyaW5nIG9mIGphdmFzY3JpcHQgZnJvbSB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpzVGV4dCgpOwotCi0JLyoqCi0JICogc2V0cyB0aGUgamF2YXNjcmlwdCB1bml0IGJ1ZmZlcgotCSAqIEBwYXJhbSBidWZmZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCdWZmZXIoSUJ1ZmZlciBidWZmZXIpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgaHRtbCBsb2NhdGlvbnMgd2l0aGluIHRoZSBkb2N1ZW1udC4KLQkgKi8KLQlwdWJsaWMgUG9zaXRpb25bXSBnZXRIdG1sTG9jYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSByZWdpb24gb2YgYSBtaXNzaW5nIDwvc2NyaXB0PiB0YWcKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pc3NpbmdFbmRUYWdSZWdpb25TdGFydCgpOwotCi0JLyoqCi0JICogQHJldHVybiBwb3NpdGlvbiBhcnJheSBvZiA8c2NyaXB0IHNyYz0iLi4iPiB3aXRoaW4gdGhlIGRvYy4KLQkgKi8KLQlwdWJsaWMgUG9zaXRpb25bXSBnZXRJbXBvcnRIdG1sUmFuZ2VzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHJhdy91bnJlc29sdmVkIDxzY3JpcHQgaW1wb3J0cz4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UmF3SW1wb3J0cygpOwotCi0JLyoqCi0JICogIGJlZ2luIHRyYW5zbGF0aW5nIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFuc2xhdGUoKTsKLQotCS8qKgotCSAqIHRyYW5zbGF0ZXMgYW4gaW5saW5lIChldmVudD0iLi4iKSBqcyBjb250YWluZXIgcmVnaW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBkb2N1bWVudCB0ZXh0LiAgbXVzdCBiZSBjYWxsZWQgaW4gb3JkZXIKLQkgKiBAcGFyYW0gY29udGFpbmVyCi0JICovCi0JcHVibGljIHZvaWQgdHJhbnNsYXRlSW5saW5lSlNOb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGFpbmVyKTsKLQotCS8qKgotCSAqIHRyYW5zbGF0ZXMgYSBzY3JpcHQgYmxvY2suICBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgb3JkZXIgaXQgYXBwZWFycyB3aXRoaW4gdGhlIGRvY3VtZW50LgotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFuc2xhdGVKU05vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250YWluZXIpOwotCi0JLyoqCi0JICogdHJhbnNsYXRlcyBhIDxzY3JpcHQgc3JjPSIuLiI+IGVsZW1lbnQsIHBhcnNpbmcgb3V0IGFuIGltcG9ydC4KLQkgKiBAcGFyYW0gcmVnaW9uCi0JICovCi0JcHVibGljIHZvaWQgdHJhbnNsYXRlU2NyaXB0SW1wb3J0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbik7Ci0KLQkvKioKLQkgKiByZWxlYXNlIGFueSByZXNvdXJjZXMgdGhlIHRyYW5zbGF0aW9uIGlzIGhvbGRpbmcgb250by4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzRGF0YVR5cGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzRGF0YVR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZDJhZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc0RhdGFUeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnNEYXRhVHlwZXMgZXh0ZW5kcyBIVE1MNDBOYW1lc3BhY2UgewotCS8qCi0JICogcmVtb3ZlIHdoZW4gd2hlbiB3ZSByZWZhY3RvciAobmVlZCB0byBhZGQgdGhpcyBjb250ZW50IHR5cGUgdG8gbWFueQotCSAqIHByb2plY3QgdHlwZXMgaW4gd3N0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfRklMRV9FWFRFTlNJT04gPSAiLmpzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gQ09OU1RBTlRTID0geyAiZmFsc2UiLCAibnVsbCIsICJ0cnVlIiB9OyAvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVWRU5UUyA9IHsgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkNMSUNLLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OREJMQ0xJQ0ssIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05NT1VTRURPV04sCi0JCQlIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OTU9VU0VVUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTk1PVVNFT1ZFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTk1PVVNFTU9WRSwKLQkJCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05NT1VTRU9VVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTktFWVBSRVNTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OS0VZRE9XTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTktFWVVQLAotCQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkhFTFAgfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhUTUxBVFJFVkVOVFMgPSB7ICJvbmxvYWQgIiwgIm9udW5sb2FkIiwgIm9uY2xpY2siLCAib25tb3VzZWRvd24iLCAib25tb3VzZXVwIiwgIm9ubW91c2VvdmVyIiwgIm9ubW91c2Vtb3ZlIiwgIm9ubW91c2VvdXQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSJvbmZvY3VzIiwgIm9uYmx1ciIsICJvbmtleXByZXNzIiwgIm9ua2V5ZG93biIsICJvbmtleXVwIiwgIm9uc3VibWl0IiwgIm9ucmVzZXQiLCAib25zZWxlY3QiLCAib25jaGFuZ2UiLCB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQgLy8kTk9OLU5MUy05JAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSlNWQUxJRERBVEFUWVBFUyA9IHsgIkpBVkFTQ1JJUFQiLCAiVEVYVC9KQVZBU0NSSVBUIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIEtFWVdPUkRTID0geyAiYWJzdHJhY3QiLCAiYnJlYWsiLCAiY2FzZSIsICJjYXRjaCIsICJjbGFzcyIsICJjb25zdCIsICJjb250aW51ZSIsICJkZWJ1Z2dlciIsICJkZWZhdWx0IiwgImRlbGV0ZSIsICJkbyIsICJlbHNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkIC8vJE5PTi1OTFMtOSQgLy8kTk9OLU5MUy0xMCQgLy8kTk9OLU5MUy0xMSQgLy8kTk9OLU5MUy0xMiQKLQkJCSJlbnVtIiwgImV4cG9ydCIsICJleHRlbmRzIiwgImZpbmFsIiwgImZpbmFsbHkiLCAiZm9yIiwgImZ1bmN0aW9uIiwgImdvdG8iLCAiaWYiLCAiaW1wbGVtZW50cyIsICJpbXBvcnQiLCAiaW4iLCAiaW5zdGFuY2VvZiIsICJpbnRlcmZhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQgLy8kTk9OLU5MUy05JCAvLyROT04tTkxTLTEwJCAvLyROT04tTkxTLTExJCAvLyROT04tTkxTLTEyJCAvLyROT04tTkxTLTEzJCAvLyROT04tTkxTLTE0JAotCQkJIm5hdGl2ZSIsICJuZXciLCAicGFja2FnZSIsICJwcml2YXRlIiwgInByb3RlY3RlZCIsICJwdWJsaWMiLCAicmV0dXJuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JAotCQkJInN0YXRpYyIsICJzdXBlciIsICJzd2l0Y2giLCAic3luY2hyb25pemVkIiwgInRoaXMiLCAidGhyb3ciLCAidGhyb3dzIiwgInRyYW5zaWVudCIsICJ0cnkiLCAidHlwZW9mIiwgInZvbGF0aWxlIiwgIndoaWxlIiwgIndpdGgiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JCAvLyROT04tTkxTLTkkIC8vJE5PTi1OTFMtMTAkIC8vJE5PTi1OTFMtMTEkIC8vJE5PTi1OTFMtMTIkIC8vJE5PTi1OTFMtMTMkCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcKLQkvLyBORVdfUEFSVElUSU9OX1RZUEU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LlN0cnVjdHVyZWRKcyI7Ci0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1BBUlRJVElPTl9UWVBFPUlIVE1MUGFydGl0aW9ucy5TQ1JJUFQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1BBUlRJVElPTl9UWVBFID0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRBS0VPVkVSX1BBUlRJVElPTl9UWVBFUyA9IHsgIm5vbmUiIH07IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIFRZUEVTID0geyAiYm9vbGVhbiIsICJieXRlIiwgImNoYXIiLCAiZG91YmxlIiwgImludCIsICJsb25nIiwgInNob3J0IiwgImZsb2F0IiwgInZhciIsICJ2b2lkIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQgLy8kTk9OLU5MUy05JCAvLyROT04tTkxTLTEwJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc05hbWVNYW5nbGVyVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc05hbWVNYW5nbGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGNlZThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNOYW1lTWFuZ2xlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSnNOYW1lTWFuZ2xlclV0aWwgewotCS8qKgotCSAqIERldGVybWluZSBpZiBnaXZlbiBzdHJpbmcgaXMgYSB2YWxpZCBIZXggcmVwcmVzZW50YXRpb24gb2YgYW4gQVNDSUkKLQkgKiBjaGFyYWN0ZXIgKGVnLiAyRiAtPiAvKQotCSAqIAotCSAqIEBwYXJhbSBwb3NzaWJsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHBvc3NpYmxlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChwb3NzaWJsZS5sZW5ndGgoKSA9PSAyKSB7Ci0JCQljaGFyIGMxID0gcG9zc2libGUuY2hhckF0KDApOwotCQkJY2hhciBjMiA9IHBvc3NpYmxlLmNoYXJBdCgxKTsKLQkJCS8vIDFzdCBjaGFyYWN0ZXIgbXVzdCBiZSBhIGRpZ2l0Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoYzEpKSB7Ci0JCQkJLy8gMm5kIGNoYXJhY3RlciBtdXN0IGJlIGRpZ2l0IG9yIHVwcGVyIGNhc2UgbGV0dGVyIEEtRgotCQkJCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChjMikpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShjMikgJiYgKGMyID09ICdBJyB8fCBjMiA9PSAnQicgfHwgYzIgPT0gJ0MnIHx8IGMyID09ICdEJyB8fCBjMiA9PSAnRScgfHwgYzIgPT0gJ0YnKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBNYW5nbGUgc3RyaW5nIHRvIFdBUy1saWtlIHNwZWNpZmljYXRpb25zCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgbWFuZ2xlKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBtb2RpZmllZE5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vIGV4dGVuc2lvbiAoLmpzcCwgLmpzcGYsIC5qc3B4LCBldGMuLi4pIHNob3VsZCBhbHJlYWR5IGJlIGVuY29kZWQgaW4KLQkJLy8gbmFtZQotCQlpbnQgbGVuZ3RoID0gbmFtZS5sZW5ndGgoKTsKLQkJLy8gaW4gY2FzZSBuYW1lIGlzIGZvcmJpZGRlbiAoYSBudW1iZXIsIGNsYXNzLCBmb3IsIGV0Yy4uLikKLQkJbW9kaWZpZWROYW1lLmFwcGVuZCgnXycpOwotCQkvLyBlbnN1cmUgcmVzdCBvZiBjaGFyYWN0ZXJzIGFyZSB2YWxpZAotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGN1cnJlbnRDaGFyID0gbmFtZS5jaGFyQXQoaSk7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGN1cnJlbnRDaGFyKSA9PSB0cnVlKSB7Ci0JCQkJbW9kaWZpZWROYW1lLmFwcGVuZChjdXJyZW50Q2hhcik7Ci0JCQl9IGVsc2UgewotCQkJCW1vZGlmaWVkTmFtZS5hcHBlbmQoSnNOYW1lTWFuZ2xlclV0aWwubWFuZ2xlQ2hhcihjdXJyZW50Q2hhcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZE5hbWUudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogdGFrZSBhIGNoYXJhY3RlciBhbmQgcmV0dXJuIGl0cyBoZXggZXF1aXZhbGVudAotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBtYW5nbGVDaGFyKGNoYXIgY2gpIHsKLQkJaWYgKGNoID09IEZpbGUuc2VwYXJhdG9yQ2hhcikgewotCQkJY2ggPSAnLyc7Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoY2gpID09IHRydWUpIHsKLQkJCXJldHVybiAiIiArIGNoOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuICJfIiArIEludGVnZXIudG9IZXhTdHJpbmcoY2gpLnRvVXBwZXJDYXNlKCkgKyAiXyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQkKLQkvKioKLQkgKiBXQVMgbWFuZ2xlcyBUb20mSmVycnkgYXM6IF9Ub21fMjZfSmVycnk7IHRoaXMgdGFrZXMgaW4gdGhlIG1hbmdsZWQgbmFtZQotCSAqIGFuZCByZXR1cm5zIHRoZSBvcmlnaW5hbCBuYW1lLgotCSAqIAotCSAqIFVubWFuZ2xlcyB0aGUgcXVhbGlmaWVkIHR5cGUgbmFtZS4gSWYgYW4gdW5kZXJzY29yZSBpcyBmb3VuZCBpdCBpcwotCSAqIGFzc3VtZWQgdG8gYmUgYSBtYW5nbGVkIHJlcHJlc2VudGF0aW9uIG9mIGEgbm9uLWFscGhhLCBub24tZGlnaXQKLQkgKiBjaGFyYWN0ZXIgb2YgdGhlIGZvcm0gX05OXywgd2hlcmUgTk4gYXJlIGhleCBkaWdpdHMgcmVwcmVzZW50aW5nIHRoZQotCSAqIGVuY29kZWQgY2hhcmFjdGVyLiBUaGlzIHJvdXRpbmUgY29udmVydHMgaXQgYmFjayB0byB0aGUgb3JpZ2luYWwKLQkgKiBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgdW5tYW5nbGUoU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCWlmIChxdWFsaWZpZWRUeXBlTmFtZS5jaGFyQXQoMCkgIT0gJ18nKSB7Ci0JCQlyZXR1cm4gcXVhbGlmaWVkVHlwZU5hbWU7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIHBvc3NpYmxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcmVtb3ZlIHRoZSAuamF2YSBleHRlbnNpb24gaWYgdGhlcmUgaXMgb25lCi0JCWlmIChxdWFsaWZpZWRUeXBlTmFtZS5lbmRzV2l0aCgiLmpzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcXVhbGlmaWVkVHlwZU5hbWUgPSBxdWFsaWZpZWRUeXBlTmFtZS5zdWJzdHJpbmcoMCwgcXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoKCkgLSAzKTsKLQkJfQotCQlmb3IgKGludCBpID0gMTsgaSA8IHF1YWxpZmllZFR5cGVOYW1lLmxlbmd0aCgpOyBpKyspIHsgLy8gc3RhcnQgYXQKLQkJCS8vIGluZGV4IDEgYi9jCi0JCQkvLyAxc3QgY2hhciBpcwotCQkJLy8gYWx3YXlzICdfJwotCQkJY2hhciBjID0gcXVhbGlmaWVkVHlwZU5hbWUuY2hhckF0KGkpOwotCQkJaWYgKGMgPT0gJ18nKSB7Ci0JCQkJaW50IGVuZEluZGV4ID0gcXVhbGlmaWVkVHlwZU5hbWUuaW5kZXhPZignXycsIGkgKyAxKTsKLQkJCQlpZiAoZW5kSW5kZXggPT0gLTEpIHsKLQkJCQkJYnVmLmFwcGVuZChjKTsKLQkJCQl9IGVsc2UgewotCQkJCQljaGFyIHVubWFuZ2xlZDsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBvc3NpYmxlID0gcXVhbGlmaWVkVHlwZU5hbWUuc3Vic3RyaW5nKGkgKyAxLCBlbmRJbmRleCk7Ci0JCQkJCQlpZiAoSnNOYW1lTWFuZ2xlclV0aWwuaXNWYWxpZChwb3NzaWJsZSkpIHsKLQkJCQkJCQl1bm1hbmdsZWQgPSAoY2hhcikgSW50ZWdlci5kZWNvZGUoIjB4IiArIHBvc3NpYmxlKS5pbnRWYWx1ZSgpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpID0gZW5kSW5kZXg7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXVubWFuZ2xlZCA9IGM7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl1bm1hbmdsZWQgPSBjOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodW5tYW5nbGVkKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWJ1Zi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNQcm9ibGVtUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzUHJvYmxlbVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzk0ZGQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNQcm9ibGVtUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQ7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVByb2JsZW1SZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLQotY2xhc3MgSnNQcm9ibGVtUmVxdWVzdG9yIGltcGxlbWVudHMgSVByb2JsZW1SZXF1ZXN0b3IgewotCXByaXZhdGUgTGlzdCBmQ29sbGVjdGVkUHJvYmxlbXM7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0FjdGl2ZSA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNSdW5uaW5nID0gZmFsc2U7Ci0JCi0JcHVibGljIHZvaWQgYWNjZXB0UHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtKSB7Ci0JCWlmIChpc0FjdGl2ZSgpKSB7Ci0JCQlnZXRDb2xsZWN0ZWRQcm9ibGVtcygpLmFkZChwcm9ibGVtKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBiZWdpblJlcG9ydGluZygpIHsKLQkJZklzUnVubmluZyA9IHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGVuZFJlcG9ydGluZygpIHsKLQkJZklzUnVubmluZyA9IGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNvbGxlY3RlZCBwcm9ibGVtcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldENvbGxlY3RlZFByb2JsZW1zKCkgewotCQlpZiAoZkNvbGxlY3RlZFByb2JsZW1zID09IG51bGwpCi0JCQlmQ29sbGVjdGVkUHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBmQ29sbGVjdGVkUHJvYmxlbXM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgewotCQlyZXR1cm4gZklzQWN0aXZlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7Ci0JCXJldHVybiBmSXNSdW5uaW5nOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBhY3RpdmUgc3RhdGUgb2YgdGhpcyBwcm9ibGVtIHJlcXVlc3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gaXNBY3RpdmUKLQkgKiAgICAgICAgICAgIHRoZSBzdGF0ZSBvZiB0aGlzIHByb2JsZW0gcmVxdWVzdG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNBY3RpdmUoYm9vbGVhbiBpc0FjdGl2ZSkgewotCQlmSXNBY3RpdmUgPSBpc0FjdGl2ZTsKLQl9Ci0JCi0JLyoqCi0JICogVGVsbHMgdGhpcyBhbm5vdGF0aW9uIG1vZGVsIHRvIGNvbGxlY3QgdGVtcG9yYXJ5IHByb2JsZW1zIGZyb20gbm93IG9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBzdGFydENvbGxlY3RpbmdQcm9ibGVtcygpIHsKLQkJZ2V0Q29sbGVjdGVkUHJvYmxlbXMoKS5jbGVhcigpOwotCX0KLQkKLQkvKioKLQkgKiBUZWxscyB0aGlzIGFubm90YXRpb24gbW9kZWwgdG8gbm8gbG9uZ2VyIGNvbGxlY3QgdGVtcG9yYXJ5IHByb2JsZW1zLgotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9wQ29sbGVjdGluZ1Byb2JsZW1zKCkgewotCS8vIGRvIG5vdGhpbmcKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzVHJhbnNsYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjA3NjllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgYnVnOjI0NDgzOSAtIGV1Z2VuZUBnZW51aXRlYy5jb20KLSAqICAgICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklTb3VyY2VSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLldvcmtpbmdDb3B5T3duZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLkRvY3VtZW50Q29udGV4dEZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLlNvdXJjZVJlZkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3QuSnNXZWJOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzVHJhbnNsYXRpb24gaW1wbGVtZW50cyBJSnNUcmFuc2xhdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc3RyYW5zbGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAJCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIElKYXZhU2NyaXB0VW5pdCBmQ29tcGlsYXRpb25Vbml0ID0gbnVsbDsKLQlwcml2YXRlIERvY3VtZW50Q29udGV4dEZyYWdtZW50Um9vdCBmRG9jdW1lbnRTY29wZTsKLQlwcml2YXRlIElKYXZhU2NyaXB0UHJvamVjdCBmSmF2YVByb2plY3QgPSBudWxsOwotCXByaXZhdGUgYnl0ZVtdIGZMb2NrID0gbnVsbDsKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZkh0bWxEb2N1bWVudDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZNb2RlbEJhc2VMb2NhdGlvbjsKLQotCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRVJfVFlQRV9OQU1FID0gIldpbmRvdyI7IC8vJE5PTi1OTFMtMSQKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUl9UWVBFX0xJQlJBUlkgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQubGF1bmNoaW5nLmJhc2VCcm93c2VyTGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJSnNUcmFuc2xhdG9yIGZUcmFuc2xhdG9yOwotCi0JcHJpdmF0ZSBTdHJpbmcgbWFuZ2xlZE5hbWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbGlzdGVuRm9yQ2hhbmdlczsKLQotCXB1YmxpYyBKc1RyYW5zbGF0aW9uKCkgewotCQkvKiBkbyBub3RoaW5nICovCi0JfQotCQotCXB1YmxpYyBJSnNUcmFuc2xhdG9yIGdldFRyYW5zbGF0b3IoKSB7Ci0JCWlmKGZUcmFuc2xhdG9yIT1udWxsKSB7Ci0JCQlyZXR1cm4gZlRyYW5zbGF0b3I7Ci0JCX0KLQkJCi0JCWZUcmFuc2xhdG9yID0gbmV3IEpzVHJhbnNsYXRvcihmSHRtbERvY3VtZW50LCBmTW9kZWxCYXNlTG9jYXRpb24sIGxpc3RlbkZvckNoYW5nZXMpOwotCQlyZXR1cm4gdGhpcy5mVHJhbnNsYXRvcjsKLQl9Ci0JCi0KLQkKLQlwcm90ZWN0ZWQgSnNUcmFuc2xhdGlvbihJU3RydWN0dXJlZERvY3VtZW50IGh0bWxEb2N1bWVudCwgSUphdmFTY3JpcHRQcm9qZWN0IGphdmFQcm9qLCBib29sZWFuIGxpc3RlbkZvckNoYW5nZXMpIHsKLQkJZkxvY2sgPSBuZXcgYnl0ZVswXTsKLQkJZkphdmFQcm9qZWN0ID0gamF2YVByb2o7Ci0JCWZIdG1sRG9jdW1lbnQgPSBodG1sRG9jdW1lbnQ7Ci0JCXNldEJhc2VMb2NhdGlvbigpOwotCQltYW5nbGVkTmFtZSA9IGNyZWF0ZU1hbmdsZWROYW1lKCk7Ci0JCXRoaXMubGlzdGVuRm9yQ2hhbmdlcz1saXN0ZW5Gb3JDaGFuZ2VzOwotCX0KLQotCXB1YmxpYyBJSnNUcmFuc2xhdGlvbiBnZXRJbnN0YW5jZShJU3RydWN0dXJlZERvY3VtZW50IGh0bWxEb2N1bWVudCwgSUphdmFTY3JpcHRQcm9qZWN0IGphdmFQcm9qLCBib29sZWFuIGxpc3RlbkZvckNoYW5nZXMpIHsKLQkJcmV0dXJuIG5ldyBKc1RyYW5zbGF0aW9uKGh0bWxEb2N1bWVudCxqYXZhUHJvaiwgbGlzdGVuRm9yQ2hhbmdlcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jZ2V0SmF2YVByb2plY3QoKQotCSAqLwotCXB1YmxpYyBJSmF2YVNjcmlwdFByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBmSmF2YVByb2plY3Q7Ci0JfQotCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXREb2NTY29wZShib29sZWFuIHJlc2V0KSB7Ci0JCWlmIChmRG9jdW1lbnRTY29wZSA9PSBudWxsKSB7Ci0JCQkvLyBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCQkvLyBJUmVzb3VyY2UgYWJzb2x1dGVSb290ID0KLQkJCS8vICgoSUNvbnRhaW5lcilnZXRKYXZhUHJvamVjdCgpLmdldFJlc291cmNlKCkpLmZpbmRNZW1iZXIoCi0JCQkvLyBXZWJSb290RmluZGVyLmdldFdlYkNvbnRlbnRGb2xkZXIoZkphdmFQcm9qZWN0LmdldFByb2plY3QoKSkpOwotCQkJZkRvY3VtZW50U2NvcGUgPSBuZXcgRG9jdW1lbnRDb250ZXh0RnJhZ21lbnRSb290KGZKYXZhUHJvamVjdCwgZ2V0RmlsZSgpLCBXZWJSb290RmluZGVyLmdldFdlYkNvbnRlbnRGb2xkZXIoZkphdmFQcm9qZWN0LmdldFByb2plY3QoKSksIFdlYlJvb3RGaW5kZXIuZ2V0U2VydmVyQ29udGV4dFJvb3QoZkphdmFQcm9qZWN0LmdldFByb2plY3QoKSksIEpzV2ViTmF0dXJlLlZJUlRVQUxfU0NPUEVfRU5UUlkpOwotCQkJZkRvY3VtZW50U2NvcGUuc2V0SW5jbHVkZWRGaWxlcyhnZXRUcmFuc2xhdG9yKCkuZ2V0UmF3SW1wb3J0cygpKTsKLQkJCXJldHVybiBmRG9jdW1lbnRTY29wZTsKLQkJfQotCi0JCWlmIChyZXNldCkKLQkJCWZEb2N1bWVudFNjb3BlLnNldEluY2x1ZGVkRmlsZXMoZ2V0VHJhbnNsYXRvcigpLmdldFJhd0ltcG9ydHMoKSk7Ci0JCXJldHVybiBmRG9jdW1lbnRTY29wZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0QmFzZUxvY2F0aW9uKCkgewotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZIdG1sRG9jdW1lbnQpOwotCQkJaWYgKHhtbE1vZGVsID09IG51bGwpIHsKLQkJCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZIdG1sRG9jdW1lbnQpOwotCQkJfQotCQkJZk1vZGVsQmFzZUxvY2F0aW9uID0geG1sTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQkvLyByZXR1cm4geG1sTW9kZWw7Ci0JfQotCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihuZXcgUGF0aChmTW9kZWxCYXNlTG9jYXRpb24pKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jZ2V0SHRtbERvY3VtZW50KCkKLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGdldEh0bWxEb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZIdG1sRG9jdW1lbnQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNnZXRNaXNzaW5nVGFnU3RhcnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWlzc2luZ1RhZ1N0YXJ0KCkgewotCQlyZXR1cm4gZ2V0VHJhbnNsYXRvcigpLmdldE1pc3NpbmdFbmRUYWdSZWdpb25TdGFydCgpOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0V2ViUm9vdCgpIHsKLQkJcmV0dXJuIFdlYlJvb3RGaW5kZXIuZ2V0V2ViQ29udGVudEZvbGRlcihmSmF2YVByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0b3J5VW5kZXJSb290KCkgewotCQlJUGF0aCB3ZWJSb290ID0gZ2V0V2ViUm9vdCgpOwotCQlJUGF0aCBwcm9qZWN0V2ViUm9vdFBhdGggPSBnZXRKYXZhUHJvamVjdCgpLmdldFBhdGgoKS5hcHBlbmQod2ViUm9vdCk7Ci0JCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoZk1vZGVsQmFzZUxvY2F0aW9uKS5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCXJldHVybiBmaWxlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHByb2plY3RXZWJSb290UGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMoZmlsZVBhdGgpKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIE9yaWdpbmFsbHkgZnJvbSBSZWNvbmNpbGVTdGVwRm9ySmF2YS4gQ3JlYXRlcyBhbiBJSmF2YVNjcmlwdFVuaXQgZnJvbQotCSAqIHRoZSBjb250ZW50cyBvZiB0aGUgSlNQIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gYW4gSUphdmFTY3JpcHRVbml0IGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoZSBKU1AgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIElKYXZhU2NyaXB0VW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoKSB0aHJvd3MgSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldERvY1Njb3BlKHRydWUpOwotCQlJSmF2YVNjcmlwdFVuaXQgY3UgPSByb290LmdldFBhY2thZ2VGcmFnbWVudCgiIikuZ2V0SmF2YVNjcmlwdFVuaXQoZ2V0TWFuZ2xlZE5hbWUoKSArIEpzRGF0YVR5cGVzLkJBU0VfRklMRV9FWFRFTlNJT04pLmdldFdvcmtpbmdDb3B5KGdldFdvcmtpbmdDb3B5T3duZXIoKSwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOyAvLyROT04tTkxTLTEkCi0JCUlCdWZmZXIgYnVmZmVyOwotCQl0cnkgewotCQkJYnVmZmVyID0gY3UuZ2V0QnVmZmVyKCk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJYnVmZmVyID0gbnVsbDsKLQkJfQotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCWdldFRyYW5zbGF0b3IoKS5zZXRCdWZmZXIoYnVmZmVyKTsKLQkJfQotCQlyZXR1cm4gY3U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBmaXh1cE1hbmdsZWROYW1lKFN0cmluZyBkaXNwbGF5U3RyaW5nKSB7Ci0JCWlmIChkaXNwbGF5U3RyaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBkaXNwbGF5U3RyaW5nLnJlcGxhY2VBbGwoZ2V0TWFuZ2xlZE5hbWUoKSArICIuanMiLCBnZXRIdG1sUGFnZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2dldEFsbEVsZW1lbnRzSW5Kc1JhbmdlKGludCwgaW50KQotCSAqLwotCXB1YmxpYyBJSmF2YVNjcmlwdEVsZW1lbnRbXSBnZXRBbGxFbGVtZW50c0luSnNSYW5nZShpbnQgamF2YVBvc2l0aW9uU3RhcnQsIGludCBqYXZhUG9zaXRpb25FbmQpIHsKLQkJSUphdmFTY3JpcHRFbGVtZW50W10gRU1UUFlfUkVTVUxUX1NFVCA9IG5ldyBJSmF2YVNjcmlwdEVsZW1lbnRbMF07Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIHJlc3VsdCA9IEVNVFBZX1JFU1VMVF9TRVQ7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIGFsbENoaWxkcmVuID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFsbENoaWxkcmVuID0gZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0Q2hpbGRyZW4oKTsKLQkJfQotCQljYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlWZWN0b3IgdmFsaWRDaGlsZHJlbiA9IG5ldyBWZWN0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJSVNvdXJjZVJhbmdlIHJhbmdlID0gZ2V0SlNTb3VyY2VSYW5nZU9mKGFsbENoaWxkcmVuW2ldKTsKLQkJCWlmIChqYXZhUG9zaXRpb25TdGFydCA8PSByYW5nZS5nZXRPZmZzZXQoKSAmJiByYW5nZS5nZXRMZW5ndGgoKSArIHJhbmdlLmdldE9mZnNldCgpIDw9IChqYXZhUG9zaXRpb25FbmQpKSB7Ci0JCQkJdmFsaWRDaGlsZHJlbi5hZGQoYWxsQ2hpbGRyZW5baV0pOwotCQkJfQotCQkJZWxzZSBpZiAoYWxsQ2hpbGRyZW5baV0uZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YVNjcmlwdEVsZW1lbnQuVFlQRSkgewotCQkJCXZhbGlkQ2hpbGRyZW4uYWRkKGFsbENoaWxkcmVuW2ldKTsKLQkJCX0KLQkJfQotCQlpZiAodmFsaWRDaGlsZHJlbi5zaXplKCkgPiAwKSB7Ci0JCQlyZXN1bHQgPSAoSUphdmFTY3JpcHRFbGVtZW50W10pIHZhbGlkQ2hpbGRyZW4udG9BcnJheShuZXcgSUphdmFTY3JpcHRFbGVtZW50W117fSk7Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIEVNVFBZX1JFU1VMVF9TRVQ7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2dldENvbXBpbGF0aW9uVW5pdCgpCi0JICovCi0JcHVibGljIElKYXZhU2NyaXB0VW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSB7Ci0gICAgICAgIC8vIEdlbnVpdGVjIEJlZ2luIEZpeCA2MTQ5OiBFeGNlcHRpb24gb3BlbmluZyBleHRlcm5hbCBIVE1MIGZpbGUKLQkgICAgaWYgKCFnZXRKYXZhUHJvamVjdCgpLmV4aXN0cygpKSB7Ci0JICAgICAgICByZXR1cm4gbnVsbDsKLQkgICAgfQotCSAgICAvLyBHZW51aXRlYyBFbmQgRml4IDYxNDk6IEV4Y2VwdGlvbiBvcGVuaW5nIGV4dGVybmFsIEhUTUwgZmlsZQotCQlzeW5jaHJvbml6ZWQgKGZMb2NrKSB7Ci0JCQl0cnkgewotCQkJCWlmIChmQ29tcGlsYXRpb25Vbml0ID09IG51bGwpIHsKLQkJCQkJZkNvbXBpbGF0aW9uVW5pdCA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgpOwotCQkJCQlyZXR1cm4gZkNvbXBpbGF0aW9uVW5pdDsKLQkJCQl9Ci0KLQkJCX0KLQkJCWNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQkJaWYgKEpzVHJhbnNsYXRpb24uREVCVUcpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXJyb3IgY3JlYXRpbmcgSlNQIHdvcmtpbmcgY29weS4uLiAiLCBqbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCX0KLQkJZ2V0RG9jU2NvcGUodHJ1ZSk7Ci0JCXRyeSB7Ci0JCQlmQ29tcGlsYXRpb25Vbml0ID0gZkNvbXBpbGF0aW9uVW5pdC5nZXRXb3JraW5nQ29weShnZXRXb3JraW5nQ29weU93bmVyKCksIGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCS8vIGZDb21waWxhdGlvblVuaXQubWFrZUNvbnNpc3RlbnQoZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCWNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBmQ29tcGlsYXRpb25Vbml0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jZ2V0RWxlbWVudHNGcm9tSnNSYW5nZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgSUphdmFTY3JpcHRFbGVtZW50W10gZ2V0RWxlbWVudHNGcm9tSnNSYW5nZShpbnQgamF2YVBvc2l0aW9uU3RhcnQsIGludCBqYXZhUG9zaXRpb25FbmQpIHsKLQkJSUphdmFTY3JpcHRFbGVtZW50W10gRU1UUFlfUkVTVUxUX1NFVCA9IG5ldyBJSmF2YVNjcmlwdEVsZW1lbnRbMF07Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIHJlc3VsdCA9IEVNVFBZX1JFU1VMVF9TRVQ7Ci0JCXRyeSB7Ci0JCQlJSmF2YVNjcmlwdFVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCWlmIChjdSAhPSBudWxsKSB7Ci0JCQkJc3luY2hyb25pemVkIChmTG9jaykgewotCQkJCQlpbnQgY3VEb2NMZW5ndGggPSBjdS5nZXRCdWZmZXIoKS5nZXRMZW5ndGgoKTsKLQkJCQkJaW50IGphdmFMZW5ndGggPSBqYXZhUG9zaXRpb25FbmQgLSBqYXZhUG9zaXRpb25TdGFydDsKLQkJCQkJaWYgKGN1RG9jTGVuZ3RoID4gMCAmJiBqYXZhUG9zaXRpb25TdGFydCA+PSAwICYmIGphdmFMZW5ndGggPj0gMCAmJiBqYXZhUG9zaXRpb25FbmQgPD0gY3VEb2NMZW5ndGgpIHsKLQkJCQkJCXJlc3VsdCA9IGN1LmNvZGVTZWxlY3QoamF2YVBvc2l0aW9uU3RhcnQsIGphdmFMZW5ndGgsIGdldFdvcmtpbmdDb3B5T3duZXIoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0Lmxlbmd0aCA9PSAwKSB7Ci0JCQkJcmV0dXJuIEVNVFBZX1JFU1VMVF9TRVQ7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiB4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKHgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SHRtbFBhZ2VOYW1lKCkgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoZk1vZGVsQmFzZUxvY2F0aW9uKTsKLQkJcmV0dXJuIHBhdGgubGFzdFNlZ21lbnQoKTsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jZ2V0SHRtbFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHRtbFRleHQoKSB7Ci0JCXJldHVybiBmSHRtbERvY3VtZW50LmdldCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVBhdGgoKSB7Ci0JCUlQYXRoIHJvb3RQYXRoID0gbmV3IFBhdGgoZk1vZGVsQmFzZUxvY2F0aW9uKS5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCVN0cmluZyBjdVBhdGggPSByb290UGF0aC5hcHBlbmQoIi8iICsgZ2V0TWFuZ2xlZE5hbWUoKSArIEpzRGF0YVR5cGVzLkJBU0VfRklMRV9FWFRFTlNJT04pLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGN1UGF0aDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2dldEpzRWxlbWVudEF0T2Zmc2V0KGludCkKLQkgKi8KLQlwdWJsaWMgSUphdmFTY3JpcHRFbGVtZW50IGdldEpzRWxlbWVudEF0T2Zmc2V0KGludCBqc09mZnNldCkgewotCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudHMgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudHMgPSBnZXRDb21waWxhdGlvblVuaXQoKS5nZXRFbGVtZW50QXQoanNPZmZzZXQpOwotCQl9Ci0JCWNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJaWYgKEpzVHJhbnNsYXRpb24uREVCVUcpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJlcnJvciByZXRyaWV2aW5nIGphdmEgZWxlbXRudCBmcm9tIGNvbXBpbGF0aW9uIHVuaXQuLi4gIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIH0KLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JcHJpdmF0ZSBJU291cmNlUmFuZ2UgZ2V0SlNTb3VyY2VSYW5nZU9mKElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIHJldHVybnMgdGhlIG9mZnNldCBpbiBodG1sIG9mIGdpdmVuIGVsZW1lbnQKLQkJSVNvdXJjZVJhbmdlIHJhbmdlID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZW1iZXIpIHsKLQkJCXRyeSB7Ci0JCQkJcmFuZ2UgPSAoKE1lbWJlcikgZWxlbWVudCkuZ2V0TmFtZVJhbmdlKCk7Ci0JCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9ZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNvdXJjZVJlZkVsZW1lbnQpIHsKLQkJCXRyeSB7Ci0JCQkJcmFuZ2UgPSAoKFNvdXJjZVJlZkVsZW1lbnQpIGVsZW1lbnQpLmdldFNvdXJjZVJhbmdlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByYW5nZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2dldEpzVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKc1RleHQoKSB7Ci0JCXJldHVybiBnZXRUcmFuc2xhdG9yKCkuZ2V0SnNUZXh0KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNnZXRTY3JpcHRQb3NpdGlvbnMoKQotCSAqLwotCXB1YmxpYyBQb3NpdGlvbltdIGdldFNjcmlwdFBvc2l0aW9ucygpIHsKLQkJcmV0dXJuIGdldFRyYW5zbGF0b3IoKS5nZXRIdG1sTG9jYXRpb25zKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNpbnNlcnRJbkZpcnN0U2NyaXB0UmVnaW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0SW5GaXJzdFNjcmlwdFJlZ2lvbihTdHJpbmcgdGV4dCkgewotCQlQb3NpdGlvbiBwb3NbXSA9IGdldFNjcmlwdFBvc2l0aW9ucygpOwotCQlpbnQgc2NyaXB0U3RhcnRPZmZzZXQgPSAwOwotCQlpZihwb3MhPW51bGwgJiYgcG9zLmxlbmd0aD4wKSB7Ci0JCQlzY3JpcHRTdGFydE9mZnNldCA9IHBvc1swXS5nZXRPZmZzZXQoKTsKLQkJCQotCQl9Ci0JCVN0cmluZyBpbnNlcnRUZXh0ID0gKHNjcmlwdFN0YXJ0T2Zmc2V0PT0wPyIiOiJcbiIpICsgdGV4dDsKLQkJaW5zZXJ0U2NyaXB0KHNjcmlwdFN0YXJ0T2Zmc2V0LGluc2VydFRleHQpOwotCQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNpbnNlcnRTY3JpcHQoaW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydFNjcmlwdChpbnQgb2Zmc2V0LCBTdHJpbmcgdGV4dCkgewotCi0JCUlET01Nb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCVBvc2l0aW9uW10gaW5IdG1sID0gZ2V0U2NyaXB0UG9zaXRpb25zKCk7Ci0JCWJvb2xlYW4gaXNJbnNpZGVFeGlzdGluZ1NjcmlwdFJlZ2lvbiA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluSHRtbC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGluSHRtbFtpXS5vdmVybGFwc1dpdGgob2Zmc2V0LCAxKSkgewotCQkJCS8vICogaW5zZXJ0aW5nIGludG8gYSBzY3JpcHQgcmVnaW9uCi0JCQkJaXNJbnNpZGVFeGlzdGluZ1NjcmlwdFJlZ2lvbiA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgaW5zZXJ0VGV4dCA9IG51bGw7Ci0KLQkJaWYgKGlzSW5zaWRlRXhpc3RpbmdTY3JpcHRSZWdpb24pIHsKLQkJCWluc2VydFRleHQgPSB0ZXh0OwotCQl9Ci0JCWVsc2UgewotCQkJaW5zZXJ0VGV4dCA9IG9mZnNldCAhPSAwID8gIlxuIiA6ICIiICsgIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPlxuIiArIHRleHQgKyAiXG48L3NjcmlwdD5cbiI7Ci0JCX0KLQkvLwl0cmFuc2xhdG9yLmRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChudWxsKTsKLQotCQlzeW5jaHJvbml6ZWQgKGZMb2NrKSB7Ci0JCQl0cnkgewotCQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChmSHRtbERvY3VtZW50KTsKLQkJCQlpZiAoeG1sTW9kZWwgPT0gbnVsbCkgewotCQkJCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KGZIdG1sRG9jdW1lbnQpOwotCQkJCX0KLQkJCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCi0KLQkJCQkJeG1sTW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQkJCXhtbE1vZGVsLmdldERvY3VtZW50KCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCAwLCBpbnNlcnRUZXh0KTsKLQkJCQkJeG1sTW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl4bWxNb2RlbC5zYXZlKCk7Ci0JCQkJCX0KLQotCQkJCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7fQotCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkge30KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCQkJeG1sTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0JCX0KLQotCS8vCXRyYW5zbGF0b3IuZG9jdW1lbnRDaGFuZ2VkKG51bGwpOwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYW5nbGVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubWFuZ2xlZE5hbWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlTWFuZ2xlZE5hbWUoKSB7Ci0JCXJldHVybiBKc05hbWVNYW5nbGVyVXRpbC5tYW5nbGUoZk1vZGVsQmFzZUxvY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9ibGVtIHJlcXVlc3RvciBmb3IgdGhlIEphdmFTY3JpcHRVbml0IGluIHRoaXMKLQkgKiAgICAgICAgIEpzVHJhbnNsYXRpb24KLQkgKi8KLQlwcml2YXRlIEpzUHJvYmxlbVJlcXVlc3RvciBnZXRQcm9ibGVtUmVxdWVzdG9yKCkgewotCQlyZXR1cm4gQ29tcGlsYXRpb25Vbml0SGVscGVyLmdldEluc3RhbmNlKCkuZ2V0UHJvYmxlbVJlcXVlc3RvcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jZ2V0UHJvYmxlbXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb2JsZW1zKCkgewotCQlMaXN0IHByb2JsZW1MaXN0ID0gZ2V0UHJvYmxlbVJlcXVlc3RvcigpLmdldENvbGxlY3RlZFByb2JsZW1zKCk7Ci0JCWdldFByb2JsZW1SZXF1ZXN0b3IoKS5lbmRSZXBvcnRpbmcoKTsKLQkJSVByb2JsZW1bXSBwcm9ibGVtcyA9IG51bGw7Ci0JCWlmIChwcm9ibGVtTGlzdCA9PSBudWxsKQotCQkJcHJvYmxlbXMgPSBuZXcgSVByb2JsZW1bMF07Ci0JCWVsc2UgCi0JCQlwcm9ibGVtcyA9IChJUHJvYmxlbVtdKSBwcm9ibGVtTGlzdC50b0FycmF5KG5ldyBJUHJvYmxlbVtwcm9ibGVtTGlzdC5zaXplKCldKTsKLQkJCi0JCUlKc1RyYW5zbGF0b3IgdHJhbnNsYXRvciA9IGdldFRyYW5zbGF0b3IoKTsKLQkJaWYgKHRyYW5zbGF0b3IgaW5zdGFuY2VvZiBKc1RyYW5zbGF0b3IgJiYgcHJvYmxlbXMubGVuZ3RoID4gMCkgewotCQkJUmVnaW9uW10gZ2VuZXJhdGVkUmFuZ2VzID0gKChKc1RyYW5zbGF0b3IpIHRyYW5zbGF0b3IpLmdldEdlbmVyYXRlZFJhbmdlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9ibGVtcy5sZW5ndGg7IGkrKykgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZ2VuZXJhdGVkUmFuZ2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCS8vIHJlbW92ZSBhbnkgcHJvYmxlbXMgdGhhdCBhcmUgZnVsbHkgcmVwb3J0ZWQgd2l0aGluIGEgcmVnaW9uIGdlbmVyYXRlZCBieSB0aGUgdHJhbnNsYXRvcgotCQkJCQlpZiAocHJvYmxlbXNbaV0uZ2V0U291cmNlU3RhcnQoKSA+PSBnZW5lcmF0ZWRSYW5nZXNbal0uZ2V0T2Zmc2V0KCkgJiYgcHJvYmxlbXNbaV0uZ2V0U291cmNlRW5kKCkgPD0gKGdlbmVyYXRlZFJhbmdlc1tqXS5nZXRPZmZzZXQoKSArIGdlbmVyYXRlZFJhbmdlc1tqXS5nZXRMZW5ndGgoKSkpIHsKLQkJCQkJCXByb2JsZW1MaXN0LnJlbW92ZShwcm9ibGVtc1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2JsZW1MaXN0OwotCX0KLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCWlmIChmUHJvZ3Jlc3NNb25pdG9yID09IG51bGwpIHsKLQkJCWZQcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCXJldHVybiBmUHJvZ3Jlc3NNb25pdG9yOwotCX0KLQotCXB1YmxpYyBXb3JraW5nQ29weU93bmVyIGdldFdvcmtpbmdDb3B5T3duZXIoKSB7Ci0JCXJldHVybiBDb21waWxhdGlvblVuaXRIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRXb3JraW5nQ29weU93bmVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNpZk9mZnNldEluSW1wb3J0Tm9kZShpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaWZPZmZzZXRJbkltcG9ydE5vZGUoaW50IG9mZnNldCkgewotCQlQb3NpdGlvbltdIGltcG9ydFJhbmdlcyA9IGdldFRyYW5zbGF0b3IoKS5nZXRJbXBvcnRIdG1sUmFuZ2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0UmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaW1wb3J0UmFuZ2VzW2ldLmluY2x1ZGVzKG9mZnNldCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNyZWNvbmNpbGVDb21waWxhdGlvblVuaXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlY29uY2lsZUNvbXBpbGF0aW9uVW5pdCgpIHsKLQkJLy8gaWYodHJ1ZSkgcmV0dXJuOwotCQlJSmF2YVNjcmlwdFVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaWYgKGZDb21waWxhdGlvblVuaXQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChjdSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXN5bmNocm9uaXplZCAoZkxvY2spIHsKLQkJCQkJLy8gY2xlYXIgb3V0IG9sZCB2YWxpZGF0aW9uIG1lc3NhZ2VzCi0JCQkJCVdvcmtpbmdDb3B5T3duZXIgd29ya2luZ0NvcHlPd25lciA9IGdldFdvcmtpbmdDb3B5T3duZXIoKTsKLQkJCQkJSnNQcm9ibGVtUmVxdWVzdG9yIHByb2JsZW1SZXF1ZXN0b3IgPSAoSnNQcm9ibGVtUmVxdWVzdG9yKSB3b3JraW5nQ29weU93bmVyLmdldFByb2JsZW1SZXF1ZXN0b3IoY3UuZ2V0V29ya2luZ0NvcHkoZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpKTsKLQkJCQkJaWYocHJvYmxlbVJlcXVlc3RvciAhPSBudWxsICYmIHByb2JsZW1SZXF1ZXN0b3IuZ2V0Q29sbGVjdGVkUHJvYmxlbXMoKSAhPSBudWxsKQotCQkJCQkJcHJvYmxlbVJlcXVlc3Rvci5nZXRDb2xsZWN0ZWRQcm9ibGVtcygpLmNsZWFyKCk7Ci0JCQkJCWN1LnJlY29uY2lsZShJSmF2YVNjcmlwdFVuaXQuTk9fQVNULCB0cnVlLCB0cnVlLCBnZXRXb3JraW5nQ29weU93bmVyKCksIGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI3JlbGVhc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChnZXRUcmFuc2xhdG9yKCkgIT0gbnVsbCkKLQkJCWdldFRyYW5zbGF0b3IoKS5yZWxlYXNlKCk7Ci0JCXN5bmNocm9uaXplZCAoZkxvY2spIHsKLQkJCWlmIChmQ29tcGlsYXRpb25Vbml0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoSnNUcmFuc2xhdGlvbi5ERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIoLSkgSnNUcmFuc2xhdGlvbiBbIiArIHRoaXMgKyAiXSBkaXNjYXJkaW5nIEphdmFTY3JpcHRVbml0OiAiICsgZkNvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWZDb21waWxhdGlvblVuaXQuZGlzY2FyZFdvcmtpbmdDb3B5KCk7Ci0JCQkJfQotCQkJCWNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkvLyB3ZSdyZSBkb25lIHcvIGl0IGFueXdheQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jc2V0UHJvYmxlbUNvbGxlY3RpbmdBY3RpdmUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ibGVtQ29sbGVjdGluZ0FjdGl2ZShib29sZWFuIGNvbGxlY3QpIHsKLQkJSUphdmFTY3JpcHRVbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCWlmIChjdSAhPSBudWxsKSB7Ci0JCQlnZXRQcm9ibGVtUmVxdWVzdG9yKCkuc2V0SXNBY3RpdmUoY29sbGVjdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGFzc3BhdGhDaGFuZ2UoKSB7Ci0KLQkJaWYgKGZEb2N1bWVudFNjb3BlICE9IG51bGwpIHsKLQkJCWZEb2N1bWVudFNjb3BlLmNsYXNzcGF0aENoYW5nZSgpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFhYTYzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzVHJhbnNsYXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCi0gKiA8YnI+PGJyPiB0aGlzIGFkYXB0ZXIgbG9hZHMgdHJhbnNsYXRpb24gaW5mb3JtYXRpb24gZnJvbSBleHRlbnNpb24gcG9pbnRzLiAgdGhpcyBpcyB0byBhbGxvdyBtb3JlIGNvbXBsaWNhdGVkIGh0bWwvanMgdHJhbnNsYXRpb25zIHRocm91Z2ggZXh0ZW5zaW9ucy4KLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKc1RyYW5zbGF0aW9uQWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciwgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc3RyYW5zbGF0aW9uIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZIdG1sRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgSUpzVHJhbnNsYXRpb24gZkpTVHJhbnNsYXRpb24gPSBudWxsOwotCXByaXZhdGUgTnVsbFByb2dyZXNzTW9uaXRvciBmVHJhbnNsYXRpb25Nb25pdG9yID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBiYXNlTG9jYXRpb247Ci0JcHJpdmF0ZSBib29sZWFuIGxpc3RlbkZvckNoYW5nZXM9ZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU9SSVRZX0FUVFJJQiA9ICJwcmlvcml0eSI7Ci0JcHJpdmF0ZSBJSnNUcmFuc2xhdGlvbiBmVHJhbnNsYXRpb25Bc0ZhY3Rvcnk7Ci0JCi0JcHVibGljIEpzVHJhbnNsYXRpb25BZGFwdGVyKElET01Nb2RlbCB4bWxNb2RlbCkgewotCQlmSHRtbERvY3VtZW50ID0geG1sTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWJhc2VMb2NhdGlvbiA9IHhtbE1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpbml0aWFsaXplSmF2YVBsdWdpbnMoKTsKLQkJCi0JCQotCX0KLQlwdWJsaWMgdm9pZCBzaG91bGRMaXN0ZW5Gb3JDaGFuZ2VzKGJvb2xlYW4gbGlzdGVuRm9yUHJvamVjdENoYW5nZXMpIHsKLQkJaWYobGlzdGVuRm9yUHJvamVjdENoYW5nZXMpIHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJSmF2YVNjcmlwdFByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCUlKYXZhU2NyaXB0UHJvamVjdCBqYXZhUHJvamVjdCA9IG51bGw7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGJhc2VMb2NhdGlvbik7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlpZiAoZmlsZVBhdGguc2VnbWVudENvdW50KCkgPiAwKSB7Ci0JCQlwcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGZpbGVQYXRoLnNlZ21lbnQoMCkpOwotCQl9Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCWphdmFQcm9qZWN0ID0gSmF2YVNjcmlwdENvcmUuY3JlYXRlKHByb2plY3QpOwotCQl9Ci0JCQotCQlyZXR1cm4gamF2YVByb2plY3Q7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIElKc1RyYW5zbGF0aW9uIGZvciB0aGlzIGFkYXB0ZXIuCi0JICogCi0JICogQHJldHVybiBhIElKc1RyYW5zbGF0aW9uCi0JICovCi0JcHVibGljIElKc1RyYW5zbGF0aW9uIGdldEpzVHJhbnNsYXRpb24oYm9vbGVhbiBsaXN0ZW5Gb3JDaGFuZ2VzKSB7Ci0JCS8qCi0JCSAqIElmIG5vIHRyYW5zbGF0aW9uIGV4aXN0cyBvciBzd2l0Y2hpbmcgZnJvbSBub3QgbGlzdGVuaW5nIHRvCi0JCSAqIGxpc3RlbmluZwotCQkgKi8KLQkJaWYgKGZKU1RyYW5zbGF0aW9uID09IG51bGwgfHwgKCF0aGlzLmxpc3RlbkZvckNoYW5nZXMgJiYgbGlzdGVuRm9yQ2hhbmdlcykpIHsKLQkJCWlmIChmSlNUcmFuc2xhdGlvbiAhPSBudWxsKQotCQkJCWZKU1RyYW5zbGF0aW9uLnJlbGVhc2UoKTsKLQkJCWlmIChmVHJhbnNsYXRpb25Bc0ZhY3RvcnkgPT0gbnVsbCkgewotCQkJCS8qIGxvYWQgdGhlIHRyYW5zbGF0aW9uIGZhY3RvcnkgZnJvbSB0aGUgZXh0ZW5zaW9uIHBvaW50ICovCi0JCQkJdHJ5IHsKLQkJCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHRQcmVQcm9jZXNzb3IiKTsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IHBvaW50c1tdID0gZXh0ZW5zaW9uUG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0KLQkJCQkJaW50IGhpZ2hlc3RQcmlvcml0eVZhbHVlID0gLTE7Ci0JCQkJCWludCBoaWdoZXN0UHJpb3JpdHlJbmRleCA9IC0xOwotCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlTdHJpbmcgcHJpb3JpdHkgPSBwb2ludHNbaV0uZ2V0QXR0cmlidXRlKFBSSU9SSVRZX0FUVFJJQik7Ci0JCQkJCQlpbnQgdmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KHByaW9yaXR5KTsKLQkJCQkJCWlmICh2YWx1ZSA+IGhpZ2hlc3RQcmlvcml0eVZhbHVlKSB7Ci0JCQkJCQkJaGlnaGVzdFByaW9yaXR5SW5kZXggPSBpOwotCQkJCQkJCWhpZ2hlc3RQcmlvcml0eVZhbHVlID0gdmFsdWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZlRyYW5zbGF0aW9uQXNGYWN0b3J5ID0gKElKc1RyYW5zbGF0aW9uKSBwb2ludHNbaGlnaGVzdFByaW9yaXR5SW5kZXhdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmVHJhbnNsYXRpb25Bc0ZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZKU1RyYW5zbGF0aW9uID0gZlRyYW5zbGF0aW9uQXNGYWN0b3J5LmdldEluc3RhbmNlKGZIdG1sRG9jdW1lbnQsIGdldEphdmFQcm9qZWN0KCksIGxpc3RlbkZvckNoYW5nZXMpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZkpTVHJhbnNsYXRpb24gPSBuZXcgSnNUcmFuc2xhdGlvbihmSHRtbERvY3VtZW50LCBnZXRKYXZhUHJvamVjdCgpLCBsaXN0ZW5Gb3JDaGFuZ2VzKTsKLQkJCX0KLQkJCXRoaXMubGlzdGVuRm9yQ2hhbmdlcyA9IGxpc3RlbkZvckNoYW5nZXM7Ci0JCX0KLQkJc2hvdWxkTGlzdGVuRm9yQ2hhbmdlcyhsaXN0ZW5Gb3JDaGFuZ2VzKTsKLQkJcmV0dXJuIGZKU1RyYW5zbGF0aW9uOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUphdmFQbHVnaW5zKCkgewotCQlKYXZhU2NyaXB0Q29yZS5nZXRQbHVnaW4oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZS5lcXVhbHMoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHt9Ci0JCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKGZUcmFuc2xhdGlvbk1vbml0b3IgIT0gbnVsbCkgewotCQkJZlRyYW5zbGF0aW9uTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJfQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKGZKU1RyYW5zbGF0aW9uICE9IG51bGwpIHsKLQkJCWlmIChKc1RyYW5zbGF0aW9uQWRhcHRlci5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNUcmFuc2xhdGlvbkFkYXB0ZXIgcmVsZWFzaW5nOiIgKyBmSlNUcmFuc2xhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWZKU1RyYW5zbGF0aW9uLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJSVByb2plY3QgY2hhbmdlZFByb2plY3QgPSAoZXZlbnQ9PW51bGwgfHwgZXZlbnQuZ2V0UmVzb3VyY2UoKT09bnVsbCk/bnVsbDpldmVudC5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKTsKLQkJaWYoY2hhbmdlZFByb2plY3QhPW51bGwgJiYgZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZXF1YWxzKGNoYW5nZWRQcm9qZWN0KSAmJiBmSlNUcmFuc2xhdGlvbiE9bnVsbCl7Ci0JCQlmSlNUcmFuc2xhdGlvbi5jbGFzc3BhdGhDaGFuZ2UoKTsKLQkJfQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MjExNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQotICogQGF1dGhvciBwYXZlcnkKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0JCi0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzdHJhbnNsYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotIAkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlwcml2YXRlIEpzVHJhbnNsYXRpb25BZGFwdGVyIGZBZGFwdGVyID0gbnVsbDsKLQkKLQlwdWJsaWMgSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcihJSnNUcmFuc2xhdGlvbi5jbGFzcywgdHJ1ZSk7Ci0JfQotCQotCQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURPTU5vZGUgJiYgZkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJZkFkYXB0ZXIgPSBuZXcgSnNUcmFuc2xhdGlvbkFkYXB0ZXIoKChJRE9NTm9kZSkgdGFyZ2V0KS5nZXRNb2RlbCgpKTsKLQkJCWlmIChKc1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigrKSBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IFsiICsgdGhpcyArICJdIGNyZWF0ZWQgYWRhcHRlcjogIiArIGZBZGFwdGVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZBZGFwdGVyOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoZkFkYXB0ZXIgIT0gbnVsbCkgewotCQkJaWYgKEpzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeS5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKC0pIEpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkgWyIgKyB0aGlzICsgIl0gcmVsZWFzaW5nIGFkYXB0ZXI6ICIgKyBmQWRhcHRlcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJZkFkYXB0ZXIucmVsZWFzZSgpOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldHVwQWRhcHRlckZhY3RvcnkoSVN0cnVjdHVyZWRNb2RlbCBzbSkgewotCQlpZiAoc20uZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcykgPT0gbnVsbCkgewotCQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlzbS5nZXRGYWN0b3J5UmVnaXN0cnkoKS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDY3MmRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCi0gKiBUcmFuc2xhdGVzIGEgd2ViIHBhZ2UgaW50byBpdHMgSmF2YVNjcmlwdCBwaWVjZXMuIAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKc1RyYW5zbGF0b3IgZXh0ZW5kcyBKb2IgaW1wbGVtZW50cyBJSnNUcmFuc2xhdG9yLCBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfU0FWRV9PVVRQVVQgPSBmYWxzZTsgIC8vInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzdHJhbnNsYXRpb25zdG9kaXNrIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5ETCA9ICJcbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTU1FTlRfU1RBUlQgPSAiPCEtLSI7IC8vJE5PTi1OTFMtMSQKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ09NTUVOVF9FTkQgPSAiLS0+IjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQV9TVEFSVCA9ICI8IVtDREFUQVsiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX1NUQVJUX1BBRCA9IG5ldyBTdHJpbmcoVXRpbC5nZXRQYWQoQ0RBVEFfU1RBUlQubGVuZ3RoKCkpKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfRU5EID0gIl1dPiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfRU5EX1BBRCA9IG5ldyBTdHJpbmcoVXRpbC5nZXRQYWQoQ0RBVEFfRU5ELmxlbmd0aCgpKSk7Ci0JCi0JCi0JLy9UT0RPOiBzaG91bGQgYmUgYW4gaW5jbHVzaXZlIHJ1bGUgcmF0aGVyIHRoYW4gZXhjbHVzaXZlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBmQ2xpZW50U2lkZVRhZ1BhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIjxbXjwlPykhPl0rLz8+Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEZJWE1FOiBXb3JrYXJvdW5kIGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA3NDAxCi0JcHJpdmF0ZSBTdHJpbmdbXVtdIGZTZXJ2ZXJTaWRlRGVsaW1pdGVycyA9IG5ldyBTdHJpbmdbXVtde3siPCUiLCIlPiJ9LHsiPD8iLCI/PiJ9fTsKLQlwcml2YXRlIGludCBmU2hvcnRlc3RTZXJ2ZXJTaWRlRGVsaW1pdGVyUGFpckxlbmd0aCA9IDQ7Ci0JCi0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzamF2YW1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotIAkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIGNsYXNzIERvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lciBpbXBsZW1lbnRzIElEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBkb2N1bWVudFJld3JpdGVTZXNzaW9uQ2hhbmdlZChEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQuU0VTU0lPTl9TVEFSVC5lcXVhbHMoZXZlbnQuZ2V0Q2hhbmdlVHlwZSgpKSkgewotCQkJCWZJc0luUmV3cml0ZVNlc3Npb24gPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAoRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50LlNFU1NJT05fU1RPUC5lcXVhbHMoZXZlbnQuZ2V0Q2hhbmdlVHlwZSgpKSkgewotCQkJCWZJc0luUmV3cml0ZVNlc3Npb24gPSBmYWxzZTsKLQkJCQlzY2hlZHVsZSgpOwotCQkJfQotCQl9CQkKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZkN1cnJlbnROb2RlOwotCWJvb2xlYW4gZklzSW5SZXdyaXRlU2Vzc2lvbiA9IGZhbHNlOwotCXByb3RlY3RlZCBTdHJpbmdCdWZmZXIgZlNjcmlwdFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZlN0cnVjdHVyZWREb2N1bWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIEFycmF5TGlzdCBpbXBvcnRMb2NhdGlvbnNJbkh0bWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLyogdXNlIGphdmEgc2NyaXB0IGJ5IGRlZmF1bHQgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSXNHbG9iYWxKcyA9IHRydWU7Ci0JcHJvdGVjdGVkIEFycmF5TGlzdCByYXdJbXBvcnRzID0gbmV3IEFycmF5TGlzdCgpOyAvLyB0cmFuc2xhdGVkCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBzY3JpcHRMb2NhdGlvbkluSHRtbCA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgaW50IHNjcmlwdE9mZnNldCA9IDA7Ci0JCi0JcHJvdGVjdGVkIGJ5dGVbXSBmTG9jayA9IG5ldyBieXRlWzBdOwotCXByb3RlY3RlZCBieXRlW10gZmluaXNoZWQgPSBuZXcgYnl0ZVswXTsKLQkKLQlwcm90ZWN0ZWQgSUJ1ZmZlciBmQ29tcFVuaXRCdWZmOwotCXByb3RlY3RlZCBib29sZWFuIGNhbmNlbFBhcnNlID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGludCBtaXNzaW5nRW5kVGFnUmVnaW9uU3RhcnQgPSAtMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQUREX1NFTUlDT0xPTl9BVF9JTkxJTkU9dHJ1ZTsKLQlwcml2YXRlIElEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIgZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lciA9IG5ldyBEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIoKTsKLQotCS8qCi0JICogb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb25zIHRoYXQgY29udGFpbiBwdXJlbHkgZ2VuZXJhdGVkIGNvZGUsIGZvcgotCSAqIHdoaWNoIG5vIHZhbGlkYXRpb24gbWVzc2FnZXMgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSB1c2VyCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZHZW5lcmF0ZWRSYW5nZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNHbG9iYWxKcygpIHsKLQkJcmV0dXJuIGZJc0dsb2JhbEpzOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUJ1ZmZlciBnZXRDb21wVW5pdEJ1ZmZlcigpIHsKLQkJcmV0dXJuIGZDb21wVW5pdEJ1ZmY7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmdCdWZmZXIgZ2V0U2NyaXB0VGV4dEJ1ZmZlcigpIHsKLQkJcmV0dXJuIGZTY3JpcHRUZXh0OwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRJc0dsb2JhbEpzKGJvb2xlYW4gdmFsdWUpIHsKLQkJdGhpcy5mSXNHbG9iYWxKcyA9IHZhbHVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZHZhbmNlTmV4dE5vZGUoKSB7Ci0JCXNldEN1cnJlbnROb2RlKGdldEN1cnJlbnROb2RlKCkuZ2V0TmV4dCgpKTsKLQl9CQotCQotCXB1YmxpYyBKc1RyYW5zbGF0b3IoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgCVN0cmluZyBmaWxlTmFtZSkgewotCQl0aGlzKGRvY3VtZW50LCBmaWxlTmFtZSwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBKc1RyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKCJKYXZhU2NyaXB0IFRyYW5zbGF0aW9uIik7Ci0JfQotCQotCXB1YmxpYyBKc1RyYW5zbGF0b3IoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgCVN0cmluZyBmaWxlTmFtZSwgYm9vbGVhbiBsaXN0ZW5Gb3JDaGFuZ2VzKSB7Ci0JCXN1cGVyKCJKYXZhU2NyaXB0IHRyYW5zbGF0aW9uIGZvciA6ICIgKyBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJZlN0cnVjdHVyZWREb2N1bWVudCA9IGRvY3VtZW50OwotCQlpZiAobGlzdGVuRm9yQ2hhbmdlcykgewotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJKChJRG9jdW1lbnRFeHRlbnNpb240KSBmU3RydWN0dXJlZERvY3VtZW50KS5hZGREb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIoZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcik7Ci0JCQl9Ci0JCQlzZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0JCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCQlzY2hlZHVsZSgpOwotCQl9Ci0JCXJlc2V0KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciNnZXRKc1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SnNUZXh0KCkgewotCQlzeW5jaHJvbml6ZWQoZmluaXNoZWQpIHsKLQkJCS8qIGlmIG1pZCByZS13cml0ZSBzZXNzaW9uIGRvYyBjaGFuZ2VzIGhhdmUgYmVlbiBpZ25vcmVkLAotCQkJICogYnV0IGlmIGpzVGV4dCBpcyBzcGVjaWZpY2FsbHkgcmVxdWVzdCB3ZSBzaG91bGQgcmUtdHJhbnNsYXRlCi0JCQkgKiB0byBwaWNrIHVwIGFueSBjaGFuZ2VzIHRodXMgZmFyCi0JCQkgKi8KLQkJCWlmKHRoaXMuZklzSW5SZXdyaXRlU2Vzc2lvbikgewotCQkJCXRoaXMucmVzZXQoKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGZTY3JpcHRUZXh0LnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdG9yI2dldEN1cnJlbnROb2RlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRDdXJyZW50Tm9kZSgpIHsKLQkJCi0JCXJldHVybiBmQ3VycmVudE5vZGU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciNzZXRCdWZmZXIob3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JQnVmZmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJ1ZmZlcihJQnVmZmVyIGJ1ZmZlcikgewotCQlmQ29tcFVuaXRCdWZmID0gYnVmZmVyOwotCQlzeW5jaHJvbml6ZWQoZmluaXNoZWQpIHsKLQkJCWZDb21wVW5pdEJ1ZmYuc2V0Q29udGVudHMoZlNjcmlwdFRleHQudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0b3IjZ2V0SHRtbExvY2F0aW9ucygpCi0JICovCi0JcHVibGljIFBvc2l0aW9uW10gZ2V0SHRtbExvY2F0aW9ucygpIHsKLQkJc3luY2hyb25pemVkKGZpbmlzaGVkKSB7Ci0JCQlyZXR1cm4gKFBvc2l0aW9uW10pIHNjcmlwdExvY2F0aW9uSW5IdG1sLnRvQXJyYXkobmV3IFBvc2l0aW9uW3NjcmlwdExvY2F0aW9uSW5IdG1sLnNpemUoKV0pOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdG9yI2dldE1pc3NpbmdFbmRUYWdSZWdpb25TdGFydCgpCi0JICovCi0JcHVibGljIGludCBnZXRNaXNzaW5nRW5kVGFnUmVnaW9uU3RhcnQoKSB7Ci0JCXJldHVybiBtaXNzaW5nRW5kVGFnUmVnaW9uU3RhcnQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciNnZXRJbXBvcnRIdG1sUmFuZ2VzKCkKLQkgKi8KLQlwdWJsaWMgUG9zaXRpb25bXSBnZXRJbXBvcnRIdG1sUmFuZ2VzKCkgewotCQlzeW5jaHJvbml6ZWQoZmluaXNoZWQpIHsKLQkJCXJldHVybiAoUG9zaXRpb25bXSkgaW1wb3J0TG9jYXRpb25zSW5IdG1sLnRvQXJyYXkobmV3IFBvc2l0aW9uW2ltcG9ydExvY2F0aW9uc0luSHRtbC5zaXplKCldKTsKLQkJfQotCX0KLQkKLQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciNnZXRSYXdJbXBvcnRzKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UmF3SW1wb3J0cygpIHsKLQkJc3luY2hyb25pemVkKGZpbmlzaGVkKSB7Ci0JCQlyZXR1cm4gKFN0cmluZ1tdKSB0aGlzLnJhd0ltcG9ydHMudG9BcnJheShuZXcgU3RyaW5nW3Jhd0ltcG9ydHMuc2l6ZSgpXSk7Ci0JCX0KLQl9Ci0KLQkJCi0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSB0cmFuc2xhdG9yJ3MgcHJvZ3JzcyBtb25pdG9yLCBmYWxzZSBpZiB0aGUKLQkgKiAgICAgICAgIG1vbml0b3IgaXMgbnVsbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0JCXJldHVybiBjYW5jZWxQYXJzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmVpbml0aWFsaXplIHNvbWUgZmllbGRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7Ci0JCXN5bmNocm9uaXplZChmTG9jaykgewotCQkJc2NyaXB0T2Zmc2V0ID0gMDsKLQkJCS8vIHJlc2V0IHByb2dyZXNzIG1vbml0b3IKLQkJCWZTY3JpcHRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZkN1cnJlbnROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJcmF3SW1wb3J0cy5jbGVhcigpOwotCQkJaW1wb3J0TG9jYXRpb25zSW5IdG1sLmNsZWFyKCk7Ci0JCQlzY3JpcHRMb2NhdGlvbkluSHRtbC5jbGVhcigpOwotCQkJbWlzc2luZ0VuZFRhZ1JlZ2lvblN0YXJ0ID0gLTE7Ci0JCQljYW5jZWxQYXJzZSA9IGZhbHNlOwotCQkJZkdlbmVyYXRlZFJhbmdlcy5jbGVhcigpOwotCQl9Ci0JCXRyYW5zbGF0ZSgpOwotCX0KLQotCi0JCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2V0Q3VycmVudE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSkgewotCQlzeW5jaHJvbml6ZWQoZkxvY2spIHsKLQkJCXJldHVybiB0aGlzLmZDdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciN0cmFuc2xhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRyYW5zbGF0ZSgpIHsKLQkJLy9zZXRDdXJyZW50Tm9kZShmU3RydWN0dXJlZERvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkKLQkJc3luY2hyb25pemVkKGZpbmlzaGVkKSB7Ci0JCQlpZihnZXRDdXJyZW50Tm9kZSgpICE9IG51bGwpIHsKLQkJCU5vZGVIZWxwZXIgbmggPSBuZXcgTm9kZUhlbHBlcihnZXRDdXJyZW50Tm9kZSgpKTsKLQkJCXdoaWxlIChnZXRDdXJyZW50Tm9kZSgpICE9IG51bGwgJiYgIWlzQ2FuY2VsZWQoKSkgewotCQkJCW5oLnNldERvY3VtZW50UmVnaW9uKGdldEN1cnJlbnROb2RlKCkpOwotCQkJCQotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHJhbnNsYXRvciBMb29raW5nIGF0IE5vZGUKLQkJCQkvLyB0eXBlOiIrZ2V0Q3VycmVudE5vZGUoKS5nZXRUeXBlKCkrIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLToiKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4obmV3IE5vZGVIZWxwZXIoZ2V0Q3VycmVudE5vZGUoKSkpOwotCQkJCS8vIGkucHJpbnRsbigiLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotCQkJCWlmIChnZXRDdXJyZW50Tm9kZSgpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCQlpZiAoKCFuaC5pc0VuZFRhZygpIHx8IG5oLmlzU2VsZkNsb3NpbmdUYWcoKSkgJiYgbmgubmFtZUVxdWFscygic2NyaXB0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLyoKLQkJCQkJCSAqIEhhbmRsZXMgdGhlIGZvbGxvd2luZyBjYXNlczogPHNjcmlwdAotCQkJCQkJICogdHlwZT0iamF2YXNjcmlwdHlwZSI+IDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHR5cGU+Ci0JCQkJCQkgKiA8c2NyaXB0IHNyYz0nJyB0eXBlPWphdmFzY3JpcHR5cGU+IDxzY3JpcHQgc3JjPScnCi0JCQkJCQkgKiBsYW5ndWFnZT1qYXZhc2NyaXB0dHlwZSA8c2NyaXB0IHNyYz0nJz4gZ2xvYmFsIGpzIHR5cGUuCi0JCQkJCQkgKiA8c2NyaXB0PiAoZ2xvYmFsIGpzIHR5cGUpCi0JCQkJCQkgKi8KLQkJCQkJCWlmIChOb2RlSGVscGVyLmlzSW5BcnJheShKc0RhdGFUeXBlcy5KU1ZBTElEREFUQVRZUEVTLCBuaC5nZXRBdHRyaWJ1dGVWYWx1ZSgidHlwZSIpKSB8fCBOb2RlSGVscGVyLmlzSW5BcnJheShKc0RhdGFUeXBlcy5KU1ZBTElEREFUQVRZUEVTLCBuaC5nZXRBdHRyaWJ1dGVWYWx1ZSgibGFuZ3VhZ2UiKSkgfHwgKG5oLmdldEF0dHJpYnV0ZVZhbHVlKCJ0eXBlIik9PW51bGwgJiYgbmguZ2V0QXR0cmlidXRlVmFsdWUoImxhbmd1YWdlIik9PW51bGwgJiYgaXNHbG9iYWxKcygpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQlpZiAobmguY29udGFpbnNBdHRyaWJ1dGUobmV3IFN0cmluZ1tdIHsgInNyYyIgfSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkvLyBIYW5kbGUgaW1wb3J0Ci0JCQkJCQkJCXRyYW5zbGF0ZVNjcmlwdEltcG9ydE5vZGUoZ2V0Q3VycmVudE5vZGUoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIH0gZWxzZSB7Ci0JCQkJCQkJLy8gaGFuZGxlIHNjcmlwdCBzZWN0aW9uCi0JCQkJCQkJCi0JCQkJCQkJaWYgKGdldEN1cnJlbnROb2RlKCkuZ2V0TmV4dCgpICE9IG51bGwgLyomJiBnZXRDdXJyZW50Tm9kZSgpLmdldE5leHQoKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKi8pIHsKLQkJCQkJCQkJdHJhbnNsYXRlSlNOb2RlKGdldEN1cnJlbnROb2RlKCkuZ2V0TmV4dCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IC8vIEVuZCBzZWFyY2ggZm9yIDxzY3JpcHQ+IHNlY3Rpb25zCi0JCQkJCX0gZWxzZSBpZiAobmguY29udGFpbnNBdHRyaWJ1dGUoSnNEYXRhVHlwZXMuSFRNTEFUUkVWRU5UUykpIHsKLQkJCQkJCS8qIENoZWNrIGZvciBlbWJlZGRlZCBKUyBldmVudHMgaW4gYW55IHRhZ3MgKi8KLQkJCQkJCXRyYW5zbGF0ZUlubGluZUpTTm9kZShnZXRDdXJyZW50Tm9kZSgpKTsKLQkJCQkJfSBlbHNlIGlmIChuaC5uYW1lRXF1YWxzKCJNRVRBIikgJiYgbmguYXR0ckVxdWFscygiaHR0cC1lcXVpdiIsICJDb250ZW50LVNjcmlwdC1UeXBlIikgJiYgbmguY29udGFpbnNBdHRyaWJ1dGUobmV3IFN0cmluZ1tdIHsgImNvbnRlbnQiIH0pKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJCS8vIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InR5cGUiPgotCQkJCQkJc2V0SXNHbG9iYWxKcyggTm9kZUhlbHBlci5pc0luQXJyYXkoSnNEYXRhVHlwZXMuSlNWQUxJRERBVEFUWVBFUywgbmguZ2V0QXR0cmlidXRlVmFsdWUoImNvbnRlbnQiKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gLy8gRW5kIGJpZyBpZiBvZiBKUyB0eXBlcwotCQkJCX0KLQkJCQlpZiAoZ2V0Q3VycmVudE5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJCWFkdmFuY2VOZXh0Tm9kZSgpOwotCQkJCX0KLQkJCX0gLy8gZW5kIHdoaWxlIGxvb3AKLQkJCWlmKGdldENvbXBVbml0QnVmZmVyKCkhPW51bGwpIGdldENvbXBVbml0QnVmZmVyKCkuc2V0Q29udGVudHMoZlNjcmlwdFRleHQudG9TdHJpbmcoKSk7Ci0JCX0KLQkJZmluaXNoZWRUcmFuc2xhdGlvbigpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGZpbmlzaGVkVHJhbnNsYXRpb24oKSB7Ci0JCWlmKERFQlVHX1NBVkVfT1VUUFVUKXsKLQkJCUlET01Nb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJCUZpbGVPdXRwdXRTdHJlYW0gZm91dCA9IG51bGw7Ci0JCQlQcmludFN0cmVhbSBvdXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQkJaWYgKHhtbE1vZGVsID09IG51bGwpIHsKLQkJCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJCQl9Ci0JCQkJYmFzZUxvY2F0aW9uID0geG1sTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCQkKLQkJCWlmKGJhc2VMb2NhdGlvbiE9bnVsbCl7Ci0JCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IHdvcmtzcGFjZS5nZXRSb290KCk7Ci0JCQkJSUZpbGUgdEZpbGUgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoYmFzZUxvY2F0aW9uICsgIi5qcyIpKTsKLQkJCQlGaWxlIHRlbXBGaWxlID0gdEZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLQkJCQkKLQkJCQkgIGlmKHRlbXBGaWxlLmV4aXN0cygpKXsKLQkJCQkJICB0ZW1wRmlsZS5kZWxldGUoKTsKLQkJCQkgIH0KLQkJCQkgCi0JCQkJICB0cnkgewotCQkJCQkgIHRlbXBGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQkJICBmb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEZpbGUpOwotCQkJCQkgIG91dCA9IG5ldyBQcmludFN0cmVhbShmb3V0KTsKLQkJCQkJICBvdXQucHJpbnRsbihmU2NyaXB0VGV4dCk7Ci0JCQkJCSAgb3V0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQotCQkJCX1maW5hbGx5ewotCQkJCQlpZihvdXQhPW51bGwpIG91dC5jbG9zZSgpOwotCQkJCQotCQkJCQkKLQkJCQl9Ci0JCQkJIHRyeSB7Ci0JCQkJCXJvb3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciN0cmFuc2xhdGVJbmxpbmVKU05vZGUob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFuc2xhdGVJbmxpbmVKU05vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250YWluZXIpIHsKLQkJLy8gU3lzdGVtLm91dAotCQkvLyAucHJpbnRsbigiSlNQVHJhbnNsYXRvci50cmFuc2xhdGVJbmxpbmVKU05vZGUgRW50ZXJlZAotCQkvLyB3L1NjcmlwdE9mZnNldDoiCi0JCS8vICsgc2NyaXB0T2Zmc2V0KTsKLQkJCi0JCQkvL05vZGVIZWxwZXIgbmggPSBuZXcgTm9kZUhlbHBlcihjb250YWluZXIpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpbmxpbmUganMgbm9kZSBsb29raW5nIGF0OlxuIiArIG5oKTsKLQkJCS8qIHN0YXJ0IGEgZnVuY3Rpb24gaGVhZGVyLi4gd2lsbCBhbWVuZCBsYXRlciAqLwotCQkJSVRleHRSZWdpb25MaXN0IHQgPSBjb250YWluZXIuZ2V0UmVnaW9ucygpOwotCQkJSVRleHRSZWdpb24gcjsKLQkJCUl0ZXJhdG9yIHJlZ2lvbkl0ZXJhdG9yID0gdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHJlZ2lvbkl0ZXJhdG9yLmhhc05leHQoKSAmJiAhaXNDYW5jZWxlZCgpICkgewotCQkJCXIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCWludCBzdGFydCA9IHIuZ2V0U3RhcnQoKTsKLQkJCQkJaW50IG9mZnNldCA9IHIuZ2V0VGV4dEVuZCgpOwotCQkJCQlTdHJpbmcgdGFnQXR0cm5hbWUgPSBjb250YWluZXIuZ2V0VGV4dCgpLnN1YnN0cmluZyhzdGFydCwgb2Zmc2V0KS50cmltKCk7Ci0JCQkJCS8qCi0JCQkJCSAqIEF0dHJpYnV0ZSB2YWx1ZXMgYXJlbid0IGNhc2Ugc2Vuc2F0aXZlLCBhbHNvIG1ha2Ugc3VyZSBuZXh0Ci0JCQkJCSAqIHJlZ2lvbiBpcyBhdHRyaWIgdmFsdWUKLQkJCQkJICovCi0JCQkJCWlmIChOb2RlSGVscGVyLmlzSW5BcnJheShKc0RhdGFUeXBlcy5IVE1MQVRSRVZFTlRTLCB0YWdBdHRybmFtZSkpIHsKLQkJCQkJCWlmIChyZWdpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCQlyZWdpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJciA9ICgoSVRleHRSZWdpb24pIHJlZ2lvbkl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJCWludCB2YWxTdGFydE9mZnNldCA9IGNvbnRhaW5lci5nZXRTdGFydE9mZnNldChyKTsKLQkJCQkJCQkvLyBpbnQgdmFsRW5kT2Zmc2V0ID0gci5nZXRUZXh0RW5kKCk7Ci0JCQkJCQkJU3RyaW5nIHJhd1RleHQgPSBjb250YWluZXIuZ2V0VGV4dCgpLnN1YnN0cmluZyhyLmdldFN0YXJ0KCksIHIuZ2V0VGV4dEVuZCgpKTsKLQkJCQkJCQlpZiAocmF3VGV4dCA9PSBudWxsIHx8IHJhd1RleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCS8qIFN0cmlwIHF1b3RlcyAqLwotCQkJCQkJCXN3aXRjaCAocmF3VGV4dC5jaGFyQXQoMCkpIHsKLQkJCQkJCQkJY2FzZSAnXCcnOgotCQkJCQkJCQljYXNlICciJzoKLQkJCQkJCQkJCXJhd1RleHQgPSByYXdUZXh0LnN1YnN0cmluZygxKTsKLQkJCQkJCQkJCXZhbFN0YXJ0T2Zmc2V0Kys7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChyYXdUZXh0ID09IG51bGwgfHwgcmF3VGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJc3dpdGNoIChyYXdUZXh0LmNoYXJBdChyYXdUZXh0Lmxlbmd0aCgpIC0gMSkpIHsKLQkJCQkJCQkJY2FzZSAnXCcnOgotCQkJCQkJCQljYXNlICciJzoKLQkJCQkJCQkJCXJhd1RleHQgPSByYXdUZXh0LnN1YnN0cmluZygwLCByYXdUZXh0Lmxlbmd0aCgpIC0gMSk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIFBvc2l0aW9uIGluU2NyaXB0ID0gbmV3IFBvc2l0aW9uKHNjcmlwdE9mZnNldCwKLQkJCQkJCQkvLyByYXdUZXh0Lmxlbmd0aCgpKTsKLQkJCQkJCQkvKiBRdW90ZWQgdGV4dCBzdGFydHMgKzEgYW5kIGVuZHMgLTEgY2hhciAqLwotCQkJCQkJCWlmKEFERF9TRU1JQ09MT05fQVRfSU5MSU5FKSByYXdUZXh0ID0gcmF3VGV4dCArICI7IjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVBvc2l0aW9uIGluSHRtbCA9IG5ldyBQb3NpdGlvbih2YWxTdGFydE9mZnNldCwgcmF3VGV4dC5sZW5ndGgoKSk7Ci0JCQkJCQkJc2NyaXB0TG9jYXRpb25Jbkh0bWwuYWRkKGluSHRtbCk7Ci0JCQkJCQkJLyogbmVlZCB0byBwYWQgdGhlIHNjcmlwdCB0ZXh0IHdpdGggc3BhY2VzICovCi0JCQkJCQkJY2hhcltdIHNwYWNlcyA9IFV0aWwuZ2V0UGFkKHZhbFN0YXJ0T2Zmc2V0IC0gc2NyaXB0T2Zmc2V0KTsKLQkJCQkJCQlmU2NyaXB0VGV4dC5hcHBlbmQoc3BhY2VzKTsKLQkJCQkJCQlmU2NyaXB0VGV4dC5hcHBlbmQocmF3VGV4dCk7Ci0JCQkJCQkJc2NyaXB0T2Zmc2V0ID0gZlNjcmlwdFRleHQubGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0b3IjdHJhbnNsYXRlSlNOb2RlKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JICovCi0JcHVibGljIHZvaWQgdHJhbnNsYXRlSlNOb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGFpbmVyKSB7Ci0JCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXJSZWdpb24gPSBjb250YWluZXI7Ci0JCUl0ZXJhdG9yIHJlZ2lvbnMgPSBjb250YWluZXJSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCQotCQlpZihjb250YWluZXI9PW51bGwpIHJldHVybjsKLQkJCi0JCWNoYXJbXSBzcGFjZXMgPSBVdGlsLmdldFBhZChjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQoKSAtIHNjcmlwdE9mZnNldCk7Ci0JCWZTY3JpcHRUZXh0LmFwcGVuZChzcGFjZXMpOwotCQlzY3JpcHRPZmZzZXQgPSBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkKLQkJaWYoY29udGFpbmVyLmdldFR5cGUoKSE9RE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUICYmIGNvbnRhaW5lci5nZXRUeXBlKCkhPSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSAmJiAhaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJLy8gY29udGVudCBhc3Npc3Qgd2FzIG5vdCBzaG93aW5nIHVwIGluIEpTUCBpbnNpZGUgYSBqYXZhc2NyaXB0Ci0JCQkvLyByZWdpb24KLQkJCQotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJlZ2lvbiB0ZXh0OiAiICsgY29udGFpbmVyLmdldFRleHQoKS5zdWJzdHJpbmcocmVnaW9uLmdldFN0YXJ0KCksIHJlZ2lvbi5nZXRFbmQoKSkpOwotCQkJYm9vbGVhbiBpc0NvbnRhaW5lclJlZ2lvbiA9IHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyOwotCQkJLyogbWFrZSBzdXJlIGl0cyBub3QgYSBzdWIgY29udGFpbmVyIHJlZ2lvbiwgcHJvYmFibHkgSlNQICovCi0JCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgKSB7Ci0JCQkJaW50IHNjcmlwdFN0YXJ0ID0gY29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IHNjcmlwdFRleHRMZW5ndGggPSBjb250YWluZXIuZ2V0TGVuZ3RoKCk7Ci0JCQkJU3RyaW5nIHJlZ2lvblRleHQgPSBjb250YWluZXIuZ2V0RnVsbFRleHQocmVnaW9uKTsKLQkJCQlyZWdpb25UZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZShyZWdpb25UZXh0LCBDREFUQV9TVEFSVCwgQ0RBVEFfU1RBUlRfUEFEKTsKLQkJCQlyZWdpb25UZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZShyZWdpb25UZXh0LCBDREFUQV9FTkQsIENEQVRBX0VORF9QQUQpOwotCQkJCWludCByZWdpb25MZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJCi0JCQkJc3BhY2VzID0gVXRpbC5nZXRQYWQoc2NyaXB0U3RhcnQgLSBzY3JpcHRPZmZzZXQpOwotCQkJCWZTY3JpcHRUZXh0LmFwcGVuZChzcGFjZXMpOyAJCi0JCQkJLy8gc2tpcCBvdmVyIFhNTC9IVE1MIGNvbW1lbnQgc3RhcnRzCi0JCQkJaWYgKHJlZ2lvblRleHQuaW5kZXhPZihYTUxfQ09NTUVOVF9TVEFSVCkgPj0gMCkgewotCQkJCQlpbnQgaW5kZXggPSByZWdpb25UZXh0LmluZGV4T2YoWE1MX0NPTU1FTlRfU1RBUlQpOwotCQkJCQkKLQkJCQkJYm9vbGVhbiByZXBsYWNlQ29tbWVudFN0YXJ0ID0gdHJ1ZTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7Ci0JCQkJCQkvKgotCQkJCQkJICogcmVwbGFjZSB0aGUgY29tbWVudCBzdGFydCBpbiB0aGUgdHJhbnNsYXRpb24gd2hlbgotCQkJCQkJICogaXQncyBwcmVjZWRlZCBvbmx5IGJ5IHdoaXRlIHNwYWNlCi0JCQkJCQkgKi8KLQkJCQkJCXJlcGxhY2VDb21tZW50U3RhcnQgPSByZXBsYWNlQ29tbWVudFN0YXJ0ICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UocmVnaW9uVGV4dC5jaGFyQXQoaSkpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAocmVwbGFjZUNvbW1lbnRTdGFydCkgewotCQkJCQkJSVJlZ2lvbiBsaW5lOwotCQkJCQkJaW50IGVuZDsKLQkJCQkJCWludCBsZW5ndGg7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWxpbmUgPSBjb250YWluZXIuZ2V0UGFyZW50RG9jdW1lbnQoKS5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChpbmRleCArIHNjcmlwdFN0YXJ0KTsKLQkJCQkJCQllbmQgPSBsaW5lLmdldE9mZnNldCgpICsgbGluZS5nZXRMZW5ndGgoKSAtIHNjcmlwdFN0YXJ0OwotCQkJCQkJCWlmKGVuZCA+IHJlZ2lvblRleHQubGVuZ3RoKCkpIHsKLQkJCQkJCQkJZW5kID0gcmVnaW9uVGV4dC5sZW5ndGgoKS0xOwotCQkJCQkJCX0KLQkJCQkJCQlsZW5ndGggPSBlbmQgLSBpbmRleDsKLQkJCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJDb3VsZCBub3QgZ2V0IEhUTUwgc3R5bGUgY29tbWVudCBsaW5lIGluZm9ybWF0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkKLQkJCQkJCQllbmQgPSBpbmRleCArIFhNTF9DT01NRU5UX1NUQVJULmxlbmd0aCgpOwotCQkJCQkJCWxlbmd0aCA9IFhNTF9DT01NRU5UX1NUQVJULmxlbmd0aCgpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlTdHJpbmdCdWZmZXIgbmV3UmVnaW9uVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIocmVnaW9uVGV4dC5zdWJzdHJpbmcoMCwgaW5kZXgpKTsKLQkJCQkJCXNwYWNlcyA9IFV0aWwuZ2V0UGFkKGxlbmd0aCk7Ci0JCQkJCQluZXdSZWdpb25UZXh0LmFwcGVuZChzcGFjZXMpOwotCQkJCQkJbmV3UmVnaW9uVGV4dC5hcHBlbmQocmVnaW9uVGV4dC5zdWJzdHJpbmcoZW5kKSk7Ci0JCQkJCQlyZWdpb25UZXh0ID0gbmV3UmVnaW9uVGV4dC50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHNlcnZlci1zaWRlIGNvZGUKLS8vCQkJCWVsc2UgewotCQkJCQkvKgotCQkJCQkgKiBGaXggZm9yCi0JCQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODQ3NzQKLQkJCQkJICogZW5kIG9mIGxhc3QgdmFsaWQgSlMgc291cmNlLCBzdGFydCBvZiBuZXh0IGNvbnRlbnQgdG8KLQkJCQkJICogc2tpcAotCQkJCQkgKi8KLQkJCQkJLy8gbGFzdCBvZmZzZXQgb2YgdmFsaWQgSlMgc291cmNlLCBhZnRlciB3aGljaCB0aGVyZSdzIHNlcnZlci1zaWRlIHN0dWZmCi0JCQkJCWludCB2YWxpZEpTZW5kID0gMDsKLQkJCQkJLy8gc3RhcnQgb2YgbmV4dCB2YWxpZCBKUyBzb3VyY2UsIGxhc3Qgb2Zmc2V0IG9mIGNvbnRlbnQgdGhhdCB3YXMgc2tpcHBlZAotCQkJCQlpbnQgdmFsaWRKU3N0YXJ0ID0gMDsKLQotCQkJCQlNYXRjaGVyIG1hdGNoZXIgPSBmQ2xpZW50U2lkZVRhZ1BhdHRlcm4ubWF0Y2hlcihyZWdpb25UZXh0KTsKLQkJCQkJLy8gbm90ZSB0aGUgc3RhcnQgb2YgYSBIVE1MIHRhZyBpZiBvbmUncyBwcmVzZW50Ci0JCQkJCWludCBjbGllbnRNYXRjaFN0YXJ0ID0gbWF0Y2hlci5maW5kKCkgPyBtYXRjaGVyLnN0YXJ0KCkgOiAtMTsKLQotCQkJCQlTdHJpbmdCdWZmZXIgY29udGVudHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQotCQkJCQlpbnQgc2VydmVyU2lkZVN0YXJ0ID0gLTE7Ci0JCQkJCWludCBzZXJ2ZXJTaWRlRGVsaW1pdGVyID0gMDsKLQotCQkJCQkvLyBmaW5kIGFueSBpbnN0YW5jZSBvZiBzZXJ2ZXIgY29kZSBibG9ja3MgaW4gdGhlIHJlZ2lvbiB0ZXh0Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlNlcnZlclNpZGVEZWxpbWl0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpbnQgaW5kZXggPSByZWdpb25UZXh0LmluZGV4T2YoZlNlcnZlclNpZGVEZWxpbWl0ZXJzW2ldWzBdKTsKLQkJCQkJCWlmIChzZXJ2ZXJTaWRlU3RhcnQgPCAwKSB7Ci0JCQkJCQkJc2VydmVyU2lkZVN0YXJ0ID0gaW5kZXg7Ci0JCQkJCQkJc2VydmVyU2lkZURlbGltaXRlciA9IGk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChpbmRleCA+PSAwKSB7Ci0JCQkJCQkJc2VydmVyU2lkZVN0YXJ0ID0gTWF0aC5taW4oc2VydmVyU2lkZVN0YXJ0LCBpbmRleCk7Ci0JCQkJCQkJaWYgKHNlcnZlclNpZGVTdGFydCA9PSBpbmRleCkgewotCQkJCQkJCQlzZXJ2ZXJTaWRlRGVsaW1pdGVyID0gaTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gY29udGFpbnMgc29tZXRoaW5nIG90aGVyIHRoYW4gcHVyZSBKYXZhU2NyaXB0Ci0JCQkJCXdoaWxlIChzZXJ2ZXJTaWRlU3RhcnQgPiAtMSB8fCBjbGllbnRNYXRjaFN0YXJ0ID4gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdmFsaWRKU2VuZCA9IHZhbGlkSlNzdGFydDsKLQkJCQkJCWJvb2xlYW4gYmlhc0NsaWVudCA9IGZhbHNlOwotCQkJCQkJYm9vbGVhbiBiaWFzU2VydmVyID0gZmFsc2U7Ci0JCQkJCQkvLyB1cGRhdGUgdGhlIHN0YXJ0IG9mIGNvbnRlbnQgdG8gc2tpcAotCQkJCQkJaWYgKGNsaWVudE1hdGNoU3RhcnQgPiAtMSAmJiBzZXJ2ZXJTaWRlU3RhcnQgPiAtMSkgewotCQkJCQkJCXZhbGlkSlNlbmQgPSBNYXRoLm1pbihjbGllbnRNYXRjaFN0YXJ0LCBzZXJ2ZXJTaWRlU3RhcnQpOwotCQkJCQkJCWJpYXNDbGllbnQgPSB2YWxpZEpTZW5kID09IGNsaWVudE1hdGNoU3RhcnQ7Ci0JCQkJCQkJYmlhc1NlcnZlciA9IHZhbGlkSlNlbmQgPT0gc2VydmVyU2lkZVN0YXJ0OwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoY2xpZW50TWF0Y2hTdGFydCA+IC0xICYmIHNlcnZlclNpZGVTdGFydCA8IDApIHsKLQkJCQkJCQl2YWxpZEpTZW5kID0gY2xpZW50TWF0Y2hTdGFydDsKLQkJCQkJCQliaWFzQ2xpZW50ID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGNsaWVudE1hdGNoU3RhcnQgPCAwICYmIHNlcnZlclNpZGVTdGFydCA+IC0xKSB7Ci0JCQkJCQkJdmFsaWRKU2VuZCA9IHNlcnZlclNpZGVTdGFydDsKLQkJCQkJCQliaWFzU2VydmVyID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLy8gYXBwZW5kIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIHdlIHdhbnQgdG8gaW5jbHVkZQotCQkJCQkJaWYgKC0xIDwgdmFsaWRKU3N0YXJ0ICYmIC0xIDwgdmFsaWRKU2VuZCkgewotCQkJCQkJCS8vIGFwcGVuZCB3aGF0IHdlIHdhbnQgdG8gaW5jbHVkZQotCQkJCQkJCWNvbnRlbnRzLmFwcGVuZChyZWdpb25UZXh0LnN1YnN0cmluZyh2YWxpZEpTc3RhcnQsIHZhbGlkSlNlbmQpKTsKLQkJCQkJCQkKLQkJCQkJCQkvLyBjaGFuZ2UgdGhlIHNraXBwZWQgY29udGVudCB0byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUgYW5kIGFwcGVuZCBpdCBhcyBhIHBsYWNlaG9sZGVyCi0JCQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gY29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgKyB2YWxpZEpTZW5kOwotCi0JCQkJCQkJU3RyaW5nIHNlcnZlckVuZCA9IGZTZXJ2ZXJTaWRlRGVsaW1pdGVyc1tzZXJ2ZXJTaWRlRGVsaW1pdGVyXVsxXTsKLQkJCQkJCQlpbnQgc2VydmVyU2lkZUVuZCA9IChyZWdpb25MZW5ndGggPiB2YWxpZEpTZW5kICsgc2VydmVyRW5kLmxlbmd0aCgpKSA/IHJlZ2lvblRleHQuaW5kZXhPZihzZXJ2ZXJFbmQsIHZhbGlkSlNlbmQgKyBmU2VydmVyU2lkZURlbGltaXRlcnNbc2VydmVyU2lkZURlbGltaXRlcl1bMV0ubGVuZ3RoKCkpIDogLTE7Ci0JCQkJCQkJaWYgKHNlcnZlclNpZGVFbmQgPiAtMSkKLQkJCQkJCQkJc2VydmVyU2lkZUVuZCArPSBzZXJ2ZXJFbmQubGVuZ3RoKCk7Ci0JCQkJCQkJaW50IGNsaWVudE1hdGNoRW5kID0gbWF0Y2hlci5maW5kKHZhbGlkSlNlbmQpID8gbWF0Y2hlci5lbmQoKSA6IC0xOwotCQkJCQkJCS8vIHVwZGF0ZSBlbmQgb2Ygd2hhdCB3ZSBza2lwcGVkCi0JCQkJCQkJdmFsaWRKU3N0YXJ0ID0gLTE7Ci0JCQkJCQkJaWYgKGNsaWVudE1hdGNoRW5kID4gdmFsaWRKU2VuZCAmJiBzZXJ2ZXJTaWRlRW5kID4gdmFsaWRKU2VuZCkgewotCQkJCQkJCQlpZiAoYmlhc0NsaWVudCkKLQkJCQkJCQkJCXZhbGlkSlNzdGFydCA9IGNsaWVudE1hdGNoRW5kOwotCQkJCQkJCQllbHNlIGlmIChiaWFzU2VydmVyKQotCQkJCQkJCQkJdmFsaWRKU3N0YXJ0ID0gc2VydmVyU2lkZUVuZDsKLQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJdmFsaWRKU3N0YXJ0ID0gTWF0aC5taW4oY2xpZW50TWF0Y2hFbmQsIHNlcnZlclNpZGVFbmQpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoY2xpZW50TWF0Y2hFbmQgPj0gdmFsaWRKU2VuZCAmJiBzZXJ2ZXJTaWRlRW5kIDwgMCkKLQkJCQkJCQkJdmFsaWRKU3N0YXJ0ID0gbWF0Y2hlci5lbmQoKTsKLQkJCQkJCQlpZiAoY2xpZW50TWF0Y2hFbmQgPCAwICYmIHNlcnZlclNpZGVFbmQgPj0gdmFsaWRKU2VuZCkKLQkJCQkJCQkJdmFsaWRKU3N0YXJ0ID0gc2VydmVyU2lkZUVuZDsKLQkJCQkJCQlpbnQgbGluZSA9IGNvbnRhaW5lci5nZXRQYXJlbnREb2N1bWVudCgpLmdldExpbmVPZk9mZnNldChzdGFydE9mZnNldCk7Ci0JCQkJCQkJaW50IGNvbHVtbjsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQljb2x1bW4gPSBzdGFydE9mZnNldCAtIGNvbnRhaW5lci5nZXRQYXJlbnREb2N1bWVudCgpLmdldExpbmVPZmZzZXQobGluZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCWNvbHVtbiA9IC0xOwotCQkJCQkJCX0KLQkJCQkJCQkvLyBzdWJzdGl0dXRlZCB0ZXh0IGxlbmd0aCBtdWNoIG1hdGNoIG9yaWdpbmFsIGxlbmd0aCBleGFjdGx5LCBmaW5kIHRleHQgb2YgdGhlIHJpZ2h0IGxlbmd0aAotCQkJCQkJCWludCBzdGFydCA9IHZhbGlkSlNlbmQgKyBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJCQljb250ZW50cy5hcHBlbmQoJ18nKTsKLQkJCQkJCQlmb3IgKGludCBpID0gdmFsaWRKU2VuZCArIDE7IGkgPCB2YWxpZEpTc3RhcnQ7IGkrKykgewotCQkJCQkJCQlzd2l0Y2ggKGkgLSB2YWxpZEpTZW5kKSB7Ci0JCQkJCQkJCQljYXNlIDEgOgotCQkJCQkJCQkJCWNvbnRlbnRzLmFwcGVuZCgnJCcpOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSAyIDoKLQkJCQkJCQkJCQljb250ZW50cy5hcHBlbmQoJ3QnKTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgMyA6Ci0JCQkJCQkJCQkJY29udGVudHMuYXBwZW5kKCdhJyk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIDQgOgotCQkJCQkJCQkJCWNvbnRlbnRzLmFwcGVuZCgnZycpOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJY29udGVudHMuYXBwZW5kKCdfJyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaW50IGVuZCA9IHZhbGlkSlNzdGFydCArIGNvbnRhaW5lci5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQkJCS8vIHJlbWVtYmVyIHRoYXQgdGhpcyBzb3VyY2UgcmFuZ2UgdwotCQkJCQkJCWZHZW5lcmF0ZWRSYW5nZXMuYWRkKG5ldyBSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBzZXQgdXAgdG8gZW5kIHdoaWxlIGlmIG5vIGVuZCBmb3IgdmFsaWQKLQkJCQkJCWlmICh2YWxpZEpTc3RhcnQgPiAwKSB7Ci0JCQkJCQkJaW50IHNlcnZlclNpZGVTdGFydEd1ZXNzID0gLTE7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmU2VydmVyU2lkZURlbGltaXRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJaW50IGluZGV4ID0gcmVnaW9uVGV4dC5pbmRleE9mKGZTZXJ2ZXJTaWRlRGVsaW1pdGVyc1tpXVswXSwgdmFsaWRKU3N0YXJ0KTsKLQkJCQkJCQkJaWYgKHNlcnZlclNpZGVTdGFydEd1ZXNzIDwgMCkgewotCQkJCQkJCQkJc2VydmVyU2lkZVN0YXJ0R3Vlc3MgPSBpbmRleDsKLQkJCQkJCQkJCXNlcnZlclNpZGVEZWxpbWl0ZXIgPSBpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgaWYgKGluZGV4ID49IDApIHsKLQkJCQkJCQkJCXNlcnZlclNpZGVTdGFydEd1ZXNzID0gTWF0aC5taW4oc2VydmVyU2lkZVN0YXJ0R3Vlc3MsIGluZGV4KTsKLQkJCQkJCQkJCWlmIChzZXJ2ZXJTaWRlU3RhcnRHdWVzcyA9PSBpbmRleCkgewotCQkJCQkJCQkJCXNlcnZlclNpZGVEZWxpbWl0ZXIgPSBpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCXNlcnZlclNpZGVTdGFydCA9IHZhbGlkSlNzdGFydCA8IHJlZ2lvbkxlbmd0aCAtIGZTaG9ydGVzdFNlcnZlclNpZGVEZWxpbWl0ZXJQYWlyTGVuZ3RoID8gc2VydmVyU2lkZVN0YXJ0R3Vlc3MgOiAtMTsKLQkJCQkJCQljbGllbnRNYXRjaFN0YXJ0ID0gdmFsaWRKU3N0YXJ0IDwgcmVnaW9uTGVuZ3RoID8gKG1hdGNoZXIuZmluZCh2YWxpZEpTc3RhcnQpID8gbWF0Y2hlci5zdGFydCgpIDogLTEpIDogLTE7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlzZXJ2ZXJTaWRlU3RhcnQgPSBjbGllbnRNYXRjaFN0YXJ0ID0gLTE7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHZhbGlkSlNzdGFydCA+PSAwKSB7Ci0JCQkJCQljb250ZW50cy5hcHBlbmQocmVnaW9uVGV4dC5zdWJzdHJpbmcodmFsaWRKU3N0YXJ0KSk7Ci0JCQkJCX0KLQkJCQkJaWYgKGNvbnRlbnRzLmxlbmd0aCgpICE9IDApIHsKLQkJCQkJCWZTY3JpcHRUZXh0LmFwcGVuZChjb250ZW50cy50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWZTY3JpcHRUZXh0LmFwcGVuZChyZWdpb25UZXh0KTsKLQkJCQkJfQotCQkJCQlQb3NpdGlvbiBpbkh0bWwgPSBuZXcgUG9zaXRpb24oc2NyaXB0U3RhcnQsIHNjcmlwdFRleHRMZW5ndGgpOwotCQkJCQlzY3JpcHRMb2NhdGlvbkluSHRtbC5hZGQoaW5IdG1sKTsKLS8vCQkJCX0KLQkJCQkJCQkJCi0JCQkJc2NyaXB0T2Zmc2V0ID0gZlNjcmlwdFRleHQubGVuZ3RoKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnID0gY29udGFpbmVyLmdldE5leHQoKTsKLQkJCi0JCWlmKGVuZFRhZz09bnVsbCkgewotCQkJbWlzc2luZ0VuZFRhZ1JlZ2lvblN0YXJ0ID0gY29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX1lbHNlIGlmKGVuZFRhZyE9bnVsbCkgewotCQkJTm9kZUhlbHBlciBuaCA9IG5ldyBOb2RlSGVscGVyKGVuZFRhZyk7Ci0JCQlTdHJpbmcgbmFtZSA9IG5oLmdldFRhZ05hbWUoKTsKLQkJCQotCQkJaWYobmFtZT09bnVsbCB8fCAhbmFtZS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgic2NyaXB0IikgfHwgIW5oLmlzRW5kVGFnKCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW1pc3NpbmdFbmRUYWdSZWdpb25TdGFydCA9IGNvbnRhaW5lci5nZXRTdGFydE9mZnNldCgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciN0cmFuc2xhdGVTY3JpcHRJbXBvcnROb2RlKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JICovCi0JcHVibGljIHZvaWQgdHJhbnNsYXRlU2NyaXB0SW1wb3J0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlOb2RlSGVscGVyIG5oID0gbmV3IE5vZGVIZWxwZXIocmVnaW9uKTsKLQkJU3RyaW5nIGltcG9ydE5hbWUgPSBuaC5nZXRBdHRyaWJ1dGVWYWx1ZSgic3JjIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGltcG9ydE5hbWUgIT0gbnVsbCAmJiAhaW1wb3J0TmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJhd0ltcG9ydHMuYWRkKGltcG9ydE5hbWUpOwotCQkJUG9zaXRpb24gaW5IdG1sID0gbmV3IFBvc2l0aW9uKHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCByZWdpb24uZ2V0RW5kT2Zmc2V0KCkpOwotCQkJaW1wb3J0TG9jYXRpb25zSW5IdG1sLmFkZChpbkh0bWwpOwotCQl9Ci0JfQotCi0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0b3IjZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQljYW5jZWxQYXJzZSA9IHRydWU7Ci0JCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0b3IjZG9jdW1lbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpZiAoZklzSW5SZXdyaXRlU2Vzc2lvbikgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcmVzZXQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2IjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmVzZXQoKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciNyZWxlYXNlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlmU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uNCkgewotCQkJKChJRG9jdW1lbnRFeHRlbnNpb240KSBmU3RydWN0dXJlZERvY3VtZW50KS5yZW1vdmVEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIoZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBmR2VuZXJhdGVkUmFuZ2VzCi0JICovCi0JcHVibGljIFJlZ2lvbltdIGdldEdlbmVyYXRlZFJhbmdlcygpIHsKLQkJcmV0dXJuIChSZWdpb25bXSkgZkdlbmVyYXRlZFJhbmdlcy50b0FycmF5KG5ldyBSZWdpb25bZkdlbmVyYXRlZFJhbmdlcy5zaXplKCldKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjBiYWZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzCi0gKiBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlCi0gKiByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8KLSAqIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55Ci0gKiBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUKLSAqIEFQSSBldm9sdmVzLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoTWVzc2FnZXMuQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb2RlSGVscGVyMDA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9kZUhlbHBlcjAxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vZGVIZWxwZXIwMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb2RlSGVscGVyMTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9kZUhlbHBlcjEyOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L05vZGVIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvTm9kZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWZkODNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvTm9kZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAgICAgCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBOb2RlSGVscGVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgRE9VQkxFX1FVT1RFX0NIQVIgPSAnXCInOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRV9RVU9URV9FTlRJVFkgPSAiJnF1b3Q7IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBTSU5HTEVfUVVPVEVfQ0hBUiA9ICdcJyc7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFX1FVT1RFX0VOVElUWSA9ICImIzAzOTsiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5BcnJheShTdHJpbmcgU3RyaW5nQXJyYXlbXSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKFN0cmluZ0FycmF5ID09IG51bGwgfHwgdGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBTdHJpbmdBcnJheS5sZW5ndGg7IGkrKykgewotCQkJaWYgKFN0cmluZ0FycmF5W2ldLmVxdWFsc0lnbm9yZUNhc2UodGV4dC50cmltKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNRdW90ZWQoU3RyaW5nIHN0cmluZykgewotCQlpZiAoKHN0cmluZyA9PSBudWxsKSB8fCAoc3RyaW5nLmxlbmd0aCgpIDwgMikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgbGFzdEluZGV4ID0gc3RyaW5nLmxlbmd0aCgpIC0gMTsKLQkJY2hhciBmaXJzdENoYXIgPSBzdHJpbmcuY2hhckF0KDApOwotCQljaGFyIGxhc3RDaGFyID0gc3RyaW5nLmNoYXJBdChsYXN0SW5kZXgpOwotCQlyZXR1cm4gKCgoZmlyc3RDaGFyID09IE5vZGVIZWxwZXIuU0lOR0xFX1FVT1RFX0NIQVIpICYmIChsYXN0Q2hhciA9PSBOb2RlSGVscGVyLlNJTkdMRV9RVU9URV9DSEFSKSkgfHwgKChmaXJzdENoYXIgPT0gTm9kZUhlbHBlci5ET1VCTEVfUVVPVEVfQ0hBUikgJiYgKGxhc3RDaGFyID09IE5vZGVIZWxwZXIuRE9VQkxFX1FVT1RFX0NIQVIpKSk7Ci0JfQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbjsKLQkKLQlwdWJsaWMgTm9kZUhlbHBlcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQl0aGlzLnJlZ2lvbiA9IHJlZ2lvbjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gYXR0ckVxdWFscyhTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIGF0dFZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYXR0cmlidXRlKTsKLQkJaWYoYXR0VmFsdWU9PW51bGwpIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGF0dFZhbHVlLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIEF0dHJUb1N0cmluZygpIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvLyBGb3IgZGVidWdnaW5nCi0JCUlUZXh0UmVnaW9uTGlzdCB0ID0gcmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gcjsKLQkJSXRlcmF0b3IgcmVnaW9uSXRlcmF0b3IgPSB0Lml0ZXJhdG9yKCk7Ci0JCVN0cmluZyBTdHJ1Y3R1cmVkVmFsdWUgPSBNZXNzYWdlcy5Ob2RlSGVscGVyMDAgKyBnZXRUYWdOYW1lKCkgKyBNZXNzYWdlcy5Ob2RlSGVscGVyMDE7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl3aGlsZSAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJU3RydWN0dXJlZFZhbHVlICs9ICJcdFx0IiArIHJlZ2lvbi5nZXRUZXh0KHIpOyAvLyROT04tTkxTLTEkCi0JCQkJLyoKLQkJCQkgKiBUaGVyZXMgYSBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMgYWZ0ZXIgdGhlCi0JCQkJICogWE1MX1RBR19BVFRSSUJVVEVfTkFNRSB3ZSBoYXZlIHRvIGdldCByaWQgb2YKLQkJCQkgKi8KLQkJCQlpZiAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCXJlZ2lvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCQl9Ci0JCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJCWlmIChyZWdpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCXIgPSAoKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCkpOwotCQkJCQl9Ci0JCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQlTdHJ1Y3R1cmVkVmFsdWUgKz0gIlx0XHQiICsgc3RyaXBFbmRRdW90ZXMocmVnaW9uLmdldFRleHQocikpICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0cnVjdHVyZWRWYWx1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBdHRyaWJ1dGUoU3RyaW5nIG5hbWVbXSkgewotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJSVRleHRSZWdpb25MaXN0IHQgPSByZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiByOwotCQlJdGVyYXRvciByZWdpb25JdGVyYXRvciA9IHQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHJlZ2lvbkl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJciA9IChJVGV4dFJlZ2lvbikgcmVnaW9uSXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCVN0cmluZyB0YWduYW1lID0gcmVnaW9uLmdldFRleHQocikudHJpbSgpOwotCQkJCS8qIEF0dHJpYnV0ZSB2YWx1ZXMgYXJlbid0IGNhc2Ugc2Vuc2F0aXZlICovCi0JCQkJaWYgKE5vZGVIZWxwZXIuaXNJbkFycmF5KG5hbWUsIHRhZ25hbWUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJVGV4dFJlZ2lvbkxpc3QgdCA9IHJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHI7Ci0JCUl0ZXJhdG9yIHJlZ2lvbkl0ZXJhdG9yID0gdC5pdGVyYXRvcigpOwotCQl3aGlsZSAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJU3RyaW5nIHRhZ25hbWUgPSByZWdpb24uZ2V0VGV4dChyKS50cmltKCk7Ci0JCQkJLyoKLQkJCQkgKiBBdHRyaWJ1dGUgdmFsdWVzIGFyZW4ndCBjYXNlIHNlbnNhdGl2ZSwgYWxzbyBtYWtlIHN1cmUgbmV4dAotCQkJCSAqIHJlZ2lvbiBpcyBhdHRyaWIgdmFsdWUKLQkJCQkgKi8KLQkJCQlpZiAodGFnbmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7Ci0JCQkJCWlmIChyZWdpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCXJlZ2lvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJfQotCQkJCQlpZiAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlyID0gKChJVGV4dFJlZ2lvbikgcmVnaW9uSXRlcmF0b3IubmV4dCgpKTsKLQkJCQkJfQotCQkJCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJcmV0dXJuIHN0cmlwRW5kUXVvdGVzKHJlZ2lvbi5nZXRUZXh0KHIpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50QXNGbGF0U3RyaW5nKCkgewotCQkvKgotCQkgKiBSZXR1cm5zIGEgZnVsbCBzdHJpbmcgb2YgdGhpcyBlbGVtZW50IG1pbnVzIGFuZCAnaWxsZWdhbCcgY2hhcmFjdGVycwotCQkgKiAodXNlZnVsbCBmb3IgaWRlbnRpZnlpbmcgdGhlIEhUTUwgZWxlbWVudCBpbiBhIGdlbmVyaWMgSlMgZnVuY3Rpb24pCi0JCSAqLwotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBmdWxsUmVnaW9uVGV4dCA9IHJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQlpZiAoZnVsbFJlZ2lvblRleHQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZ1bGxSZWdpb25UZXh0LnJlcGxhY2VBbGwoIlteYS16QS1aMC05XSIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJVGV4dFJlZ2lvbkxpc3QgdCA9IHJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHI7Ci0JCUl0ZXJhdG9yIHJlZ2lvbkl0ZXJhdG9yID0gdC5pdGVyYXRvcigpOwotCQl3aGlsZSAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQlyZXR1cm4gcmVnaW9uLmdldFRleHQocik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRW5kVGFnKCkgewotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOLmVxdWFscyhyZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1NlbGZDbG9zaW5nVGFnKCkgewotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFLmVxdWFscyhyZWdpb24uZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVFcXVhbHMoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsIHx8IG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoZ2V0VGFnTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdSZWdpb24pIHsKLQkJaWYgKG5ld1JlZ2lvbiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQlyZWdpb24gPSBuZXdSZWdpb247Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgc3RyaXBFbmRRdW90ZXMoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKE5vZGVIZWxwZXIuaXNRdW90ZWQodGV4dCkpIHsKLQkJCXJldHVybiB0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCB0ID0gcmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSXRlcmF0b3IgcmVnaW9uSXRlcmF0b3IgPSB0Lml0ZXJhdG9yKCk7Ci0JCVN0cmluZyBub2RlVGV4dCA9IG5ldyBTdHJpbmcoKTsKLQkJd2hpbGUgKHJlZ2lvbkl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gciA9IChJVGV4dFJlZ2lvbikgcmVnaW9uSXRlcmF0b3IubmV4dCgpOwotCQkJU3RyaW5nIG5vZGVUeXBlID0gci5nZXRUeXBlKCk7Ci0JCQlub2RlVGV4dCArPSAoTWVzc2FnZXMuTm9kZUhlbHBlcjExICsgbm9kZVR5cGUgKyBNZXNzYWdlcy5Ob2RlSGVscGVyMTIgKyByZWdpb24uZ2V0VGV4dChyKSArICJcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5vZGVUZXh0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L1V0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDJhZWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICoKLSAqLwotcHVibGljIGNsYXNzIFV0aWwgewotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGdldFBhZChpbnQgbnVtYmVyT2ZDaGFycykgewotCQlpZihudW1iZXJPZkNoYXJzIDwgMCkgcmV0dXJuIG5ldyBjaGFyWzBdOwotCQlmaW5hbCBjaGFyW10gc3BhY2VBcnJheSA9IG5ldyBjaGFyW251bWJlck9mQ2hhcnNdOwotCQlBcnJheXMuZmlsbChzcGFjZUFycmF5LCAnICcpOwotCQlyZXR1cm4gc3BhY2VBcnJheTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQWxsKFN0cmluZyBzb3VyY2UsIGNoYXIgcmVtb3ZlKSB7Ci0JCQotCQlTdHJpbmcgbmV3U3RyaW5nID0gIiI7Ci0JCQotCQljaGFyW10gb2xkU3RyaW5nQXJyYXkgPSBzb3VyY2UudG9DaGFyQXJyYXkoKTsKLQkJCi0JCWZvcihpbnQgaSA9IDA7aTxvbGRTdHJpbmdBcnJheS5sZW5ndGg7aSsrKSB7Ci0JCQlpZihvbGRTdHJpbmdBcnJheVtpXSE9cmVtb3ZlKSBuZXdTdHJpbmcrPW9sZFN0cmluZ0FycmF5W2ldOwotCQl9Ci0JCXJldHVybiBuZXdTdHJpbmc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9XZWJSb290RmluZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L1dlYlJvb3RGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5NThlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L1dlYlJvb3RGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAgICAgCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0Lk1vZHVsZUNvcmVTdXBwb3J0OwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBXZWJSb290RmluZGVyIHsKLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFNlcnZlckNvbnRleHRSb290KElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVBhdGggcm9vdCA9IE1vZHVsZUNvcmVTdXBwb3J0LmdldFdlYkNvbnRlbnRSb290UGF0aChwcm9qZWN0KTsKLQkJaWYgKHJvb3QgIT0gbnVsbCkKLQkJCXJldHVybiByb290OwotCQlyZXR1cm4gUGF0aC5ST09UOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gcHJvamVjdC1yZWxhdGl2ZSBwYXRoIHRvIHRoZSB3ZWIgY29udGVudCByb290Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRXZWJDb250ZW50Rm9sZGVyKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVBhdGggcm9vdCA9IE1vZHVsZUNvcmVTdXBwb3J0LmdldFdlYkNvbnRlbnRSb290UGF0aChwcm9qZWN0KTsKLQkJaWYgKHJvb3QgIT0gbnVsbCkKLQkJCXJldHVybiByb290LnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCXJldHVybiBQYXRoLlJPT1Q7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdlYkNvbnRleHQoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViY2NkZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLU5vZGVIZWxwZXIuMD1UYWcgbmFtZToKLU5vZGVIZWxwZXIuMT1cdEF0dHJpYnV0ZVx0VmFsdWVcbgotTm9kZUhlbHBlci4zPWF0dHJpYiB0eXBlCi1Ob2RlSGVscGVyLjExPVx0Tm9kZSBUeXBlOgotTm9kZUhlbHBlci4xMj1cIFx0XHRWYWx1ZToKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0luZGV4V29ya3NwYWNlSm9iLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9JbmRleFdvcmtzcGFjZUpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjU5MjgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0luZGV4V29ya3NwYWNlSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Kc0NvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlV0aWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSogKGNvcGllZCBmcm9tIEpTUCkKLSAqIFJlLWluZGV4ZXMgdGhlIGVudGlyZSB3b3Jrc3BhY2UuCi0gKiBFbnN1cmVzIHRoZSBKU1AgSW5kZXggaXMgaW4gYSBzdGFibGUgc3RhdGUgYmVmb3JlIHBlcmZvcm1pbmcgYSBzZWFyY2guCi0gKiAobGlrZSBhZnRlciBhIGNyYXNoIG9yIGlmIHByZXZpb3VzIGluZGV4aW5nIHdhcyBjYW5jZWxlZCkKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEluZGV4V29ya3NwYWNlSm9iIGV4dGVuZHMgSm9iIHsKLQotCS8vIGZvciBkZWJ1Z2dpbmcKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanNpbmRleG1hbmFnZXIiKTsgLy8kTk9OLU5MUy0xJAotIAkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBWaXNpdG9yIHRoYXQgcmV0cmlldmVzIGpzcCBwcm9qZWN0IHBhdGhzIGZvciBhbGwganNwIGZpbGVzIGluIHRoZSB3b3Jrc3BhY2UsCi0JICogYW5kIGFkZHMgdGhlIGZpbGVzIHRvIGJlIGluZGV4ZWQgYXMgdGhleSBhcmUgZW5jb3VudGVyZWQKLQkgKi8KLQlwcml2YXRlIGNsYXNzIEpTUEZpbGVWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlUHJveHlWaXNpdG9yIHsKLQkgICAgcHJpdmF0ZSBMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOyAKLQkJCi0JCS8vIG1vbml0b3IgZnJvbSB0aGUgSm9iCi0JCUlQcm9ncmVzc01vbml0b3IgZklubmVyTW9uaXRvciA9IG51bGw7Ci0JCXB1YmxpYyBKU1BGaWxlVmlzaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXRoaXMuZklubmVyTW9uaXRvciA9IG1vbml0b3I7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkKLQkJCS8vIGNoZWNrIGpvYiBjYW5jZWxlZAotCQkJaWYgKCh0aGlzLmZJbm5lck1vbml0b3IgIT0gbnVsbCkgJiYgdGhpcy5mSW5uZXJNb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCS8vIGNoZWNrIHNlYXJjaCBzdXBwb3J0IGNhbmNlbGVkCi0JCQlpZihKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCQlzZXRDYW5jZWxlZFN0YXRlKCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJCi0JCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM1NTMKLQkJCQkvLyBjaGVjayB0aGlzIGJlZm9yZSBkZXNjcmlwdGlvbgotCQkJCS8vIGNoZWNrIG5hbWUgYmVmb3JlIGFjdHVhbGx5IGdldHRpbmcgdGhlIGZpbGUgKGxlc3Mgd29yaykKLQkJCQlpZihVdGlsLmlzSnNUeXBlKHByb3h5LmdldE5hbWUoKSkpIHsKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcHJveHkucmVxdWVzdFJlc291cmNlKCk7Ci0JCQkJCWlmKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQotCQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigrKSBJbmRleFdvcmtzcGFjZUpvYiBhZGRpbmcgZmlsZTogIiArIGZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJLy8gdGhpcyBjYWxsIHdpbGwgY2hlY2sgdGhlIENvbnRlbnRUeXBlRGVzY3JpcHRpb24sIHNvIGRvbid0IG5lZWQgdG8gZG8gaXQgaGVyZS4KLQkJCQkJCS8vSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmFkZEpzcEZpbGUoZmlsZSk7Ci0JCQkJCQl0aGlzLmZpbGVzLmFkZChmaWxlKTsKLQkJCQkJCXRoaXMuZklubmVyTW9uaXRvci5zdWJUYXNrKHByb3h5LmdldE5hbWUoKSk7Ci0JCQkJCQkKLQkJCQkJCS8vIGRvbid0IHNlYXJjaCBkZWVwZXIgZm9yIGZpbGVzCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHVibGljIGZpbmFsIElGaWxlW10gZ2V0RmlsZXMoKSB7Ci0JCSAgICByZXR1cm4gKElGaWxlW10pdGhpcy5maWxlcy50b0FycmF5KG5ldyBJRmlsZVt0aGlzLmZpbGVzLnNpemUoKV0pOwotCQl9Ci0JfQotCQotCS8vcHJpdmF0ZSBJQ29udGVudFR5cGUgZkNvbnRlbnRUeXBlSlNQID0gbnVsbDsKLQkKLQlwdWJsaWMgSW5kZXhXb3Jrc3BhY2VKb2IoKSB7Ci0JCS8vIHBhX1RPRE8gbWF5IHdhbnQgdG8gc2F5IHNvbWV0aGluZyBsaWtlICJSZWJ1aWxkaW5nIEpTUCBJbmRleCIgdG8gYmUgbW9yZQotCQkvLyBkZXNjcmlwdGl2ZSBpbnN0ZWFkIG9mICJVcGRhdGluZyBKU1AgSW5kZXgiIHNpbmNlIHRoZXkgYXJlIDIgZGlmZmVyZW50IHRoaW5ncwotCQlzdXBlcihKc0NvcmVNZXNzYWdlcy5KU1BJbmRleE1hbmFnZXJfMCk7Ci0JCXNldFByaW9yaXR5KEpvYi5MT05HKTsKLQkJc2V0U3lzdGVtKHRydWUpOwotCX0KLQotLy8JSUNvbnRlbnRUeXBlIGdldEpzcENvbnRlbnRUeXBlKCkgewotLy8JCWlmKHRoaXMuZkNvbnRlbnRUeXBlSlNQID09IG51bGwpCi0vLwkJCXRoaXMuZkNvbnRlbnRUeXBlSlNQID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0vLwkJcmV0dXJuIHRoaXMuZkNvbnRlbnRUeXBlSlNQOwotLy8JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnIGVjbGlwc2UuY29yZS5pbnRlcm5hbC5qb2JzLkludGVybmFsSm9iI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikgCi0JICogZm9yIHNpbWlsYXIgbWV0aG9kCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQkKLQkJaWYobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJfQotCQkKLQkJaWYoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIF4gSW5kZXhXb3Jrc3BhY2VKb2Igc3RhcnRlZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkKLQkJdHJ5IHsKLQkJICAgIEpTUEZpbGVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSlNQRmlsZVZpc2l0b3IobW9uaXRvcik7Ci0JCSAgICAvLyBjb2xsZWN0IGFsbCBqc3AgZmlsZXMKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuYWNjZXB0KHZpc2l0b3IsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQkvLyByZXF1ZXN0IGluZGV4aW5nCi0JCQkvLyB0aGlzIGlzIHByZXR0eSBtdWNoIGxpa2UgZmFraW5nIGFuIGVudGlyZSB3b3Jrc3BhY2UgcmVzb3VyY2UgZGVsdGEKLQkJCUpzSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkuaW5kZXhGaWxlcyh2aXNpdG9yLmdldEZpbGVzKCkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWlmKERFQlVHKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCWxvbmcgZmluaXNoID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWlmKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBeIEluZGV4V29ya3NwYWNlSm9iIGZpbmlzaGVkXG4gICB0b3RhbCB0aW1lIHJ1bm5pbmc6ICIgKyAoZmluaXNoIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQl2b2lkIHNldENhbmNlbGVkU3RhdGUoKSB7Ci0JCUpzSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2V0SW5kZXhTdGF0ZShKc0luZGV4TWFuYWdlci5TX0NBTkNFTEVEKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9KU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg2MmI0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9KU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guSmF2YVNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSooY29waWVkIGZyb20gSlNQKQotICogV3JhcHBlciBtZXRob2QgdG8gc2V0IGdldFBhdGgoKSBwYXRoIHRvIGJlIHRoZSBwYXRoIG9mIHRoZSBjb21waWxhdGlvbiB1bml0IAotICogZm9yIHRoZSBqc3AgZmlsZS4gKHNpbmNlIGl0J3MgYSBmaW5hbCBtZXRob2QsIGl0IG5lZWRzIHRvIGJlIHNldCB2aWEgY29uc3RydWN0b3IpCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBleHRlbmRzIEphdmFTZWFyY2hEb2N1bWVudCB7Ci0JCi0JcHJpdmF0ZSBKc1NlYXJjaERvY3VtZW50IGZKU1BTZWFyY2hEb2MgPSBudWxsOwotCQotCXB1YmxpYyBKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZShKc1NlYXJjaERvY3VtZW50IGpzcFNlYXJjaERvYykgewotCQkKLQkJc3VwZXIoanNwU2VhcmNoRG9jLmdldFBhdGgoKSwganNwU2VhcmNoRG9jLmdldFBhcnRpY2lwYW50KCkpOwotCQl0aGlzLmZKU1BTZWFyY2hEb2MgPSBqc3BTZWFyY2hEb2M7Ci0JfQotCi0JcHVibGljIGJ5dGVbXSBnZXRCeXRlQ29udGVudHMoKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEJ5dGVDb250ZW50cygpOwotCX0KLQotCXB1YmxpYyBjaGFyW10gZ2V0Q2hhckNvbnRlbnRzKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRDaGFyQ29udGVudHMoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKYXZhVGV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRKYXZhVGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEVuY29kaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRGaWxlKCk7Ci0JfQotCQotCXB1YmxpYyBJSnNUcmFuc2xhdGlvbiBnZXRKc3BUcmFuc2xhdGlvbigpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0SlNUcmFuc2xhdGlvbigpOwotCX0KLQkKLS8vCXB1YmxpYyBpbnQgZ2V0SnNwT2Zmc2V0KGludCBqYXZhT2Zmc2V0KSB7Ci0vLwkJCi0vLwkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRKc3BPZmZzZXQoamF2YU9mZnNldCk7Ci0vLwl9Ci0JCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJdGhpcy5mSlNQU2VhcmNoRG9jLnJlbGVhc2UoKTsKLQl9Ci0JcHVibGljIElKYXZhU2NyaXB0RWxlbWVudCBnZXRKYXZhRWxlbWVudCgpIHsKLQkJcmV0dXJuIGdldEpzcFRyYW5zbGF0aW9uKCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNJbmRleE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzSW5kZXhNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYjExNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNJbmRleE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuaW5kZXguSW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuSW5kZXhNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkpzQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkpzQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5Kc1dlYk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlV0aWw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKihjb3BpZWQgZnJvbSBKU1ApCi0gKiBSZXNwb25zaWJsZSBmb3Iga2VlcGluZyB0aGUgSlNQIGluZGV4IHVwIHRvIGRhdGUuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKc0luZGV4TWFuYWdlciB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0JLy8gVE9ETyBtb3ZlIHRoaXMgdG8gTG9nZ2VyLCBhcyB3ZSBoYXZlIGluIFNTRQotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc2luZGV4bWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0gCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLRVlfSU5ERVhfU1RBVEUgPSAianNwSW5kZXhTdGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSW5kZXhXb3Jrc3BhY2VKb2IgaW5kZXhpbmdKb2IgPSBuZXcgSW5kZXhXb3Jrc3BhY2VKb2IoKTsKLQotCi0KLQkvLyBUT0RPOiBjb25zaWRlciBlbnVtZXJhdGlvbiBmb3IgdGhlc2UgaW50IGNvbnN0YW50cwotCS8vIHNldCB0byBTX1VQREFUSU5HIG9uY2UgYSByZXNvdXJjZSBjaGFuZ2UgY29tZXMgaW4KLQkvLyBzZXQgdG8gU19TVEFCTEUgaWY6Ci0JLy8gLSB3ZSBrbm93IHdlIGFyZW4ndCBpbnRlcmVzdGVkIGluIHRoZSByZXNvdXJjZSBjaGFuZ2UKLQkvLyAtIG9yIHRoZSBQcm9jZXNzRmlsZXNKb2IgY29tcGxldGVzCi0JLy8gc2V0IHRvIFNfQ0FOQ0VMRUQgaWYgYW4gaW5kZXhpbmcgam9iIGlzIGNhbmNlbGVkCi0JLy8gc2V0IHRvIFNfUkVCVUlMRElORyBpZiByZS1pbmRleGluZyB0aGUgZW50aXJlIHdvcmtzcGFjZQotCi0JLy8gdGhlIGludCAnMCcgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBkZWZhdWx0IHZhbHVlIGlmIGEgcHJlZmVyZW5jZSBpcyBub3QKLQkvLyB0aGVyZQotCS8qKiBpbmRleCBpcyByZWxpYWJsZSB0byB1c2UgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX1NUQUJMRSA9IDE7Ci0JLyoqIGluZGV4IGlzIGJlaW5nIHVwZGF0ZWQgKGZyb20gYSByZXNvdXJjZSBkZWx0YSkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX1VQREFUSU5HID0gMjsKLQkvKiogZW50aXJlIGluZGV4IGlzIGJlaW5nIHJlYnVpbHQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX1JFQlVJTERJTkcgPSAzOwotCS8qKgotCSAqIGluZGV4aW5nIGpvYiB3YXMgY2FuY2VsZWQgaW4gdGhlIG1pZGRsZSBvZiBpdCwgaW5kZXggbmVlZHMgdG8gYmUKLQkgKiByZWJ1aWx0Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19DQU5DRUxFRCA9IDQ7Ci0KLQkvKiogc3ltYm9saWMgbmFtZSBmb3IgT1NHSSBmcmFtZXdvcmsgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBPU0dJX0ZSQU1FV09SS19JRCA9ICJvcmcuZWNsaXBzZS5vc2dpIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29sbGVjdHMgSlNQIGZpbGVzIGZyb20gYSByZXNvdXJjZSBkZWx0YS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIEpTUFJlc291cmNlVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCS8vIHVzaW5nIGhhc2ggbWFwIGVuc3VyZXMgb25seSBvbmUgb2YgZWFjaCBmaWxlCi0JCS8vIG11c3QgYmUgcmVzZXQgYmVmb3JlIGV2ZXJ5IHVzZQotCQlwcml2YXRlIEhhc2hNYXAganNwRmlsZXMgPSBudWxsOwotCi0JCXB1YmxpYyBKU1BSZXNvdXJjZVZpc2l0b3IoKSB7Ci0JCQl0aGlzLmpzcEZpbGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJCS8vIGluIGNhc2UgSlNQIHNlYXJjaCB3YXMgY2FuY2VsZWQgKGVnLiB3aGVuIGNsb3NpbmcgdGhlIGVkaXRvcikKLQkJCWlmIChKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkgfHwgZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJaWYgKCFpc0hpZGRlblJlc291cmNlKGRlbHRhLmdldEZ1bGxQYXRoKCkpKSB7Ci0KLQkJCQkJaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCQkJCWJvb2xlYW4gYWRkZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLkFEREVEKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRDsKLQkJCQkJYm9vbGVhbiBpc0ludGVyZXN0aW5nQ2hhbmdlID0gZmFsc2U7Ci0JCQkJCWlmICgoa2luZCAmIElSZXNvdXJjZURlbHRhLkNIQU5HRUQpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsKLQkJCQkJCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCQkJCQkvLyBpZ25vcmUgdGhpbmdzIGxpa2UgbWFya2VyIGNoYW5nZXMKLQkJCQkJCWlzSW50ZXJlc3RpbmdDaGFuZ2UgPSAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgPT0gSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgfHwgKChmbGFncyAmIElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSA9PSBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCk7Ci0JCQkJCX0KLQkJCQkJYm9vbGVhbiByZW1vdmVkID0gKGtpbmQgJiBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOwotCQkJCQlpZiAoYWRkZWQgfHwgaXNJbnRlcmVzdGluZ0NoYW5nZSkgewotCi0JCQkJCQl2aXNpdEFkZGVkKGRlbHRhKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChyZW1vdmVkKSB7Ci0JCQkJCQl2aXNpdFJlbW92ZWQoZGVsdGEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbmVlZCB0byBzZXQgc3RhdGUgaGVyZSBzb21laG93LCBhbmQgcmVpbmRleAotCQkJCS8vIG90aGVyd2lzZSBpbmRleCB3aWxsIGJlIHVucmVsaWFibGUKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRGVsdGEgYW5hbHlzaXMgbWF5IG5vdCBiZSBjb21wbGV0ZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJLy8gaWYgdGhlIGRlbHRhIGhhcyBjaGlsZHJlbiwgY29udGludWUgdG8gYWRkL3JlbW92ZSBmaWxlcwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgdmlzaXRSZW1vdmVkKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQkvLyBoYW5kbGUgY2xlYW51cAotCQkJaWYgKGRlbHRhLmdldFJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCUlSZXNvdXJjZSByID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCQlpZiAoKHIuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpICYmIHIuZXhpc3RzKCkpIHsKLQkJCQkJZGVsZXRlSW5kZXgoKElGaWxlKSByKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgdmlzaXRBZGRlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM1NTMKLQkJCS8vIHF1aWNrIGNoZWNrIGlmIGl0J3MgZXZlbiBKU1AgcmVsYXRlZCB0byBpbXByb3ZlCi0JCQkvLyBwZXJmb3JtYW5jZQotCQkJLy8gY2hlY2tpbmcgbmFtZSBmcm9tIHRoZSBkZWx0YSBiZWZvcmUgZ2V0dGluZwotCQkJLy8gcmVzb3VyY2UgYmVjYXVzZSBpdCdzIGxpZ2h0ZXIKLQkJCVN0cmluZyBmaWxlbmFtZSA9IGRlbHRhLmdldEZ1bGxQYXRoKCkubGFzdFNlZ21lbnQoKTsKLQkJCWlmICgoZmlsZW5hbWUgIT0gbnVsbCkgJiYgVXRpbC5pc0pzVHlwZShmaWxlbmFtZSkpIHsKLQkJCQlJUmVzb3VyY2UgciA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJaWYgKChyICE9IG51bGwpICYmIHIuZXhpc3RzKCkgJiYgKHIuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSkgewotCQkJCQl0aGlzLmpzcEZpbGVzLnB1dChyLmdldEZ1bGxQYXRoKCksIHIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MzQ2MwotCQlwcml2YXRlIGJvb2xlYW4gaXNIaWRkZW5SZXNvdXJjZShJUGF0aCBwKSB7Ci0JCQlTdHJpbmdbXSBzZWdtZW50cyA9IHAuc2VnbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc2VnbWVudHNbaV0uc3RhcnRzV2l0aCgiLiIpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBkZWxldGVJbmRleChJRmlsZSBmb2xkZXIpIHsKLQkJCS8vIGNsZWFudXAgaW5kZXgKLQkJCUluZGV4TWFuYWdlciBpbSA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEluZGV4TWFuYWdlcigpOwotCQkJSVBhdGggZm9sZGVyUGF0aCA9IGZvbGRlci5nZXRGdWxsUGF0aCgpOwotCQkJSVBhdGggaW5kZXhMb2NhdGlvbiA9IEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmNvbXB1dGVJbmRleExvY2F0aW9uKGZvbGRlclBhdGgpOwotCQkJaW0ucmVtb3ZlSW5kZXgoaW5kZXhMb2NhdGlvbik7Ci0JCQkvLyBpbS5pbmRleExvY2F0aW9ucy5yZW1vdmVLZXkoZm9sZGVyUGF0aCk7Ci0JCQkvLyBpbS5pbmRleExvY2F0aW9ucy5yZW1vdmVWYWx1ZShpbmRleExvY2F0aW9uKTsKLQkJCUZpbGUgZiA9IGluZGV4TG9jYXRpb24udG9GaWxlKCk7Ci0JCQlmLmRlbGV0ZSgpOwotCQl9Ci0KLQkJcHVibGljIElGaWxlW10gZ2V0RmlsZXMoKSB7Ci0JCQlyZXR1cm4gKElGaWxlW10pIHRoaXMuanNwRmlsZXMudmFsdWVzKCkudG9BcnJheShuZXcgSUZpbGVbdGhpcy5qc3BGaWxlcy5zaXplKCldKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQkJdGhpcy5qc3BGaWxlcy5jbGVhcigpOwotCQl9Ci0JfQotCi0JLy8gZW5kIGNsYXNzIEpTUFJlc291cmNlVmlzaXRvcgotCi0JLyoqCi0JICogc2NoZWR1bGVzIEpTUCBmaWxlcyBmb3IgaW5kZXhpbmcgYnkgSmF2YSBjb3JlCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQcm9jZXNzRmlsZXNKb2IgZXh0ZW5kcyBKb2IgewotCQlMaXN0IGZpbGVMaXN0ID0gbnVsbDsKLQkJLy8ga2VlcCB0cmFjayBvZiBob3cgbWFueSBmaWxlcyB3ZSd2ZSBpbmRleGVkCi0JCWludCBsYXN0RmlsZUN1cnNvciA9IDA7Ci0KLQkJUHJvY2Vzc0ZpbGVzSm9iKFN0cmluZyB0YXNrTmFtZSkgewotCQkJc3VwZXIodGFza05hbWUpOwotCQkJZmlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgdm9pZCBwcm9jZXNzKElGaWxlW10gZmlsZXMpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlmaWxlTGlzdC5hZGQoZmlsZXNbaV0pOwotCQkJfQotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BJbmRleE1hbmFnZXIgcXVldWluZyAiICsgZmlsZXMubGVuZ3RoICsgIiBmaWxlcyIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXN5bmNocm9uaXplZCBJRmlsZVtdIGdldEZpbGVzKCkgewotCQkJcmV0dXJuIChJRmlsZVtdKSBmaWxlTGlzdC50b0FycmF5KG5ldyBJRmlsZVtmaWxlTGlzdC5zaXplKCldKTsKLQkJfQotCi0JCXN5bmNocm9uaXplZCB2b2lkIGNsZWFyRmlsZXMoKSB7Ci0JCQlmaWxlTGlzdC5jbGVhcigpOwotCQkJbGFzdEZpbGVDdXJzb3IgPSAwOwotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImNsZWFyZWQgZmlsZXMiKTsKLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaW5kZXhlciBtb25pdG9yIiArIG1vbml0b3IpOwotCQkJaWYgKGlzQ2FuY2VsZWQobW9uaXRvcikgfHwgZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQl9Ci0KLQkJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQkJdHJ5IHsKLQkJCQlJRmlsZVtdIGZpbGVzVG9CZVByb2Nlc3NlZCA9IGdldEZpbGVzKCk7Ci0KLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BJbmRleE1hbmFnZXIgaW5kZXhpbmcgIiArIGZpbGVzVG9CZVByb2Nlc3NlZC5sZW5ndGggKyAiIGZpbGVzIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQkvLyBBUEkgaW5kaWNhdGVzIHRoYXQgbW9uaXRvciBpcyBuZXZlciBudWxsCi0JCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIGZpbGVzVG9CZVByb2Nlc3NlZC5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQkJSnNTZWFyY2hTdXBwb3J0IHNzID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCQkJU3RyaW5nIHByb2Nlc3NpbmdORmlsZXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkJCQlmb3IgKDtsYXN0RmlsZUN1cnNvciA8IGZpbGVzVG9CZVByb2Nlc3NlZC5sZW5ndGg7IGxhc3RGaWxlQ3Vyc29yKyspIHsKLQotCQkJCQlpZiAoaXNDYW5jZWxlZChtb25pdG9yKSB8fCBmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKSB7Ci0JCQkJCQlzZXRDYW5jZWxlZFN0YXRlKCk7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJCX0KLQkJCQkJSUZpbGUgZmlsZSA9IGZpbGVzVG9CZVByb2Nlc3NlZFtsYXN0RmlsZUN1cnNvcl07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJSmF2YVNjcmlwdFByb2plY3QgcHJvamVjdCA9IEphdmFTY3JpcHRDb3JlLmNyZWF0ZShmaWxlLmdldFByb2plY3QoKSk7Ci0JCQkJCQlpZiAocHJvamVjdC5leGlzdHMoKSkgewotCQkJCQkJCXNzLmFkZEpzcEZpbGUoZmlsZSk7Ci0JCQkJCQkJLy8gSlNQIEluZGV4ZXIgcHJvY2Vzc2luZyBuIGZpbGVzCi0JCQkJCQkJcHJvY2Vzc2luZ05GaWxlcyA9IE5MUy5iaW5kKEpzQ29yZU1lc3NhZ2VzLkpTUEluZGV4TWFuYWdlcl8yLCBuZXcgU3RyaW5nW117SW50ZWdlci50b1N0cmluZygoZmlsZXNUb0JlUHJvY2Vzc2VkLmxlbmd0aCAtIGxhc3RGaWxlQ3Vyc29yKSl9KTsKLQkJCQkJCQltb25pdG9yLnN1YlRhc2socHJvY2Vzc2luZ05GaWxlcyArICIgLSAiICsgZmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0KLQkJCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BJbmRleE1hbmFnZXIgSm9iIGFkZGVkIGZpbGU6ICIgKyBmaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBSQVRMQzAwMjg0Nzc2Ci0JCQkJCQkvLyBJU1NVRTogd2UgcHJvYmFibHkgc2hvdWxkbid0IGJlIGNhdGNoaW5nIEVWRVJZCi0JCQkJCQkvLyBleGNlcHRpb24sIGJ1dAotCQkJCQkJLy8gdGhlIGZyYW1ld29yayBvbmx5IGFsbG93cyB0byByZXR1cm4gSVN0YXR1cyBpbgotCQkJCQkJLy8gb3JkZXIgdG8gY29tbXVuaWNhdGUKLQkJCQkJCS8vIHRoYXQgc29tZXRoaW5nIHdlbnQgd3JvbmcsIHdoaWNoIG1lYW5zIHRoZSBsb29wCi0JCQkJCQkvLyB3b24ndCBjb21wbGV0ZSwgYW5kIHdlIHdvdWxkIGhpdCB0aGUgc2FtZSBwcm9ibGVtCi0JCQkJCQkvLyB0aGUgbmV4dCB0aW1lLgotCQkJCQkJLy8gCi0JCQkJCQkvLyBhIHBvc3NpYmxlIHNvbHV0aW9uIGlzIHRvIGtlZXAgdHJhY2sgb2YgdGhlCi0JCQkJCQkvLyBleGNlcHRpb25zIGxvZ2dlZAotCQkJCQkJLy8gYW5kIG9ubHkgbG9nIGEgY2VydGFpbiBhbXQgb2YgdGhlIHNhbWUgb25lLAotCQkJCQkJLy8gb3RoZXJ3aXNlIHNraXAgaXQuCi0JCQkJCQlpZiAoIWZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpIHsKLQkJCQkJCQlTdHJpbmcgZmlsZW5hbWUgPSBmaWxlICE9IG51bGwgPyBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiSlNQSW5kZXhlciBwcm9ibGVtIGluZGV4aW5nOiIgKyBmaWxlbmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gLy8gZW5kIGZvcgotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy8ganVzdCBpbiBjYXNlIHNvbWV0aGluZyBkaWRuJ3QgZm9sbG93IEFQSSAobW9uaXRvciBpcyBudWxsKQotCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBzdWNjZXNzZnVsbHkgZmluaXNoZWQsIGNsZWFyIGZpbGVzIGxpc3QKLQkJCWNsZWFyRmlsZXMoKTsKLQkJCQotCQkJbG9uZyBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWxvbmcgZGlmZiA9IGZpbmlzaCAtIHN0YXJ0OwotCQkJaWYgKERFQlVHKSB7Ci0JCQkJZlRvdGFsVGltZSArPSBkaWZmOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0aGlzIHRpbWU6ICIgKyBkaWZmICsgIiBjdW11bGF0aXZlIHRpbWUgZm9yIHJlc291cmNlIGNoYW5nZWQ6ICIgKyBmVG90YWxUaW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzQ2FuY2VsZWQoSVByb2dyZXNzTW9uaXRvciBydW5Nb25pdG9yKSB7Ci0KLQkJCWJvb2xlYW4gY2FuY2VsZWQgPSBmYWxzZTsKLQkJCS8vIGNoZWNrIHNwZWNpZmljIG1vbml0b3IgcGFzc2VkIGludG8gcnVuIG1ldGhvZCAodGhlIHByb2dyZXNzCi0JCQkvLyBncm91cCBpbiB0aGlzIGNhc2UpCi0JCQkvLyBjaGVjayBtYWluIHNlYXJjaCBzdXBwb3J0IGNhbmNlbGVkCi0JCQlpZiAoKHJ1bk1vbml0b3IgIT0gbnVsbCkgJiYgcnVuTW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQljYW5jZWxlZCA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkgewotCQkJCWNhbmNlbGVkID0gdHJ1ZTsKLQkJCQlpZiAocnVuTW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJCXJ1bk1vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNhbmNlbGVkOwotCQl9Ci0JCQotCX0KLQotCS8vIGVuZCBjbGFzcyBQcm9jZXNzRmlsZXNKb2IKLQotCXByaXZhdGUgc3RhdGljIEpzSW5kZXhNYW5hZ2VyIGZTaW5nbGV0b24gPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZDsKLQlwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6aW5nID0gdHJ1ZTsKLQotCXByaXZhdGUgSW5kZXhKb2JDb29yZGluYXRvciBpbmRleEpvYkNvb3JkaW5hdG9yOwotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIganNwUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLQotCXByaXZhdGUgSlNQUmVzb3VyY2VWaXNpdG9yIGZWaXNpdG9yID0gbnVsbDsKLQlzdGF0aWMgbG9uZyBmVG90YWxUaW1lID0gMDsKLQotCS8vIEpvYiBmb3IgcHJvY2Vzc2luZyByZXNvdXJjZSBkZWx0YQotCXByaXZhdGUgUHJvY2Vzc0ZpbGVzSm9iIHByb2Nlc3NGaWxlc0pvYiA9IG51bGw7Ci0KLQlwcml2YXRlIEpzSW5kZXhNYW5hZ2VyKCkgewotCQlwcm9jZXNzRmlsZXNKb2IgPSBuZXcgUHJvY2Vzc0ZpbGVzSm9iKEpzQ29yZU1lc3NhZ2VzLkpTUEluZGV4TWFuYWdlcl8wKTsKLQkJLy8gb25seSBzaG93IGluIHZlcmJvc2UgbW9kZQotCQlwcm9jZXNzRmlsZXNKb2Iuc2V0U3lzdGVtKHRydWUpOwotCQlwcm9jZXNzRmlsZXNKb2Iuc2V0UHJpb3JpdHkoSm9iLkxPTkcpOwotCQlwcm9jZXNzRmlsZXNKb2IuYWRkSm9iQ2hhbmdlTGlzdGVuZXIobmV3IEpvYkNoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXN1cGVyLmRvbmUoZXZlbnQpOwotCQkJCXNldFN0YWJsZVN0YXRlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEpzSW5kZXhNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCi0JCWlmIChmU2luZ2xldG9uID09IG51bGwpIHsKLQkJCWZTaW5nbGV0b24gPSBuZXcgSnNJbmRleE1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gZlNpbmdsZXRvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCi0JCUpzSW5kZXhNYW5hZ2VyIHNpbmdsZUluc3RhbmNlID0gZ2V0SW5zdGFuY2UoKTsKLQotCi0JCWlmICghc2luZ2xlSW5zdGFuY2UuaW5pdGlhbGl6ZWQpIHsKLQkJCXNpbmdsZUluc3RhbmNlLmluaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkJc2luZ2xlSW5zdGFuY2UuaW5kZXhKb2JDb29yZGluYXRvciA9IG5ldyBJbmRleEpvYkNvb3JkaW5hdG9yKCk7Ci0JCQlzaW5nbGVJbnN0YW5jZS5qc3BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IEpTUFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQotCQkJLy8gYWRkZWQgYXMgSm9iQ2hhbmdlIGxpc3RlbmVyIHNvIEpTUEluZGV4TWFuYWdlciBjYW4gYmUgc21hcnRlcgotCQkJLy8gYWJvdXQgd2hlbiBpdCBydW5zCi0JCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuYWRkSm9iQ2hhbmdlTGlzdGVuZXIoc2luZ2xlSW5zdGFuY2UuaW5kZXhKb2JDb29yZGluYXRvcik7Ci0KLQkJCS8vIGFkZCBKU1BJbmRleE1hbmFnZXIgdG8ga2VlcCBKU1AgSW5kZXggdXAgdG8gZGF0ZQotCQkJLy8gbGlzdGVuaW5nIGZvciBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFIGFuZAotCQkJLy8gSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGpzcFJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQotCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwOTEKLQkJCS8vIG1ha2VzIHN1cmUgSW5kZXhNYW5hZ2VyIGlzIGF3YXJlIG9mIG91ciBpbmRleGVzCi0JCQlzYXZlSW5kZXhlcygpOwotCQkJLy9yZWJ1aWxkSW5kZXhJZk5lZWRlZCgpOwotCQkJc2luZ2xlSW5zdGFuY2UuaW5pdGlhbGl6aW5nID0gZmFsc2U7Ci0KLQkJfQotCi0JfQotCQotCXN5bmNocm9uaXplZCB2b2lkIHNldEluZGV4U3RhdGUoaW50IHN0YXRlKSB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BJbmRleE1hbmFnZXIgc2V0dGluZyBpbmRleCBzdGF0ZSB0bzogIiArIHN0YXRlMlN0cmluZyhzdGF0ZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJUGx1Z2luIGpzcE1vZGVsUGx1Z2luID0gSnNDb3JlUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJanNwTW9kZWxQbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShQS0VZX0lOREVYX1NUQVRFLCBzdGF0ZSk7Ci0JCWpzcE1vZGVsUGx1Z2luLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgc3RhdGUyU3RyaW5nKGludCBzdGF0ZSkgewotCQlTdHJpbmcgcyA9ICJVTktOT1dOIjsgLy8kTk9OLU5MUy0xJAotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCQljYXNlIChTX1NUQUJMRSkgOgotCQkJCXMgPSAiU19TVEFCTEUiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIChTX1VQREFUSU5HKSA6Ci0JCQkJcyA9ICJTX1VQREFUSU5HIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAoU19DQU5DRUxFRCkgOgotCQkJCXMgPSAiU19DQU5DRUxFRCI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgKFNfUkVCVUlMRElORykgOgotCQkJCXMgPSAiU19SRUJVSUxESU5HIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBzOwotCX0KLQotCWludCBnZXRJbmRleFN0YXRlKCkgewotCQlyZXR1cm4gSnNDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChQS0VZX0lOREVYX1NUQVRFKTsKLQl9Ci0KLQl2b2lkIHNldFVwZGF0aW5nU3RhdGUoKSB7Ci0JCS8vaWYgKGdldEluZGV4U3RhdGUoKSAhPSBTX0NBTkNFTEVEKQotCQlzZXRJbmRleFN0YXRlKFNfVVBEQVRJTkcpOwotCX0KLQotCXZvaWQgc2V0Q2FuY2VsZWRTdGF0ZSgpIHsKLQkJc2V0SW5kZXhTdGF0ZShKc0luZGV4TWFuYWdlci5TX0NBTkNFTEVEKTsKLQl9Ci0KLQl2b2lkIHNldFN0YWJsZVN0YXRlKCkgewotCQkvL2lmIChnZXRJbmRleFN0YXRlKCkgIT0gU19DQU5DRUxFRCkKLQkJc2V0SW5kZXhTdGF0ZShTX1NUQUJMRSk7Ci0JfQotCi0Jdm9pZCBzZXRSZWJ1aWxkaW5nU3RhdGUoKSB7Ci0JCXNldEluZGV4U3RhdGUoU19SRUJVSUxESU5HKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCByZWJ1aWxkSW5kZXhJZk5lZWRlZCgpIHsKLQkJaWYgKGdldEluZGV4U3RhdGUoKSAhPSBTX1NUQUJMRSkgewotCQkJcmVidWlsZEluZGV4KCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlYnVpbGRJbmRleCgpIHsKLQotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqIEpTUCBJbmRleCB1bnN0YWJsZSwgcmVxdWVzdGluZyByZS1pbmRleGluZyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlnZXRJbmRleGluZ0pvYigpLmFkZEpvYkNoYW5nZUxpc3RlbmVyKG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWJvdXRUb1J1bihJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlzdXBlci5hYm91dFRvUnVuKGV2ZW50KTsKLQkJCQlzZXRSZWJ1aWxkaW5nU3RhdGUoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlzdXBlci5kb25lKGV2ZW50KTsKLQkJCQlzZXRTdGFibGVTdGF0ZSgpOwotCQkJCWdldEluZGV4aW5nSm9iKCkucmVtb3ZlSm9iQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQl9Ci0JCX0pOwotCQkvLyB3ZSdyZSBhYm91dCB0byByZWluZGV4IGV2ZXJ5dGhpbmcgYW55d2F5Ci0JCWdldFByb2Nlc3NGaWxlc0pvYigpLmNsZWFyRmlsZXMoKTsKLQkJZ2V0SW5kZXhpbmdKb2IoKS5zY2hlZHVsZSgpOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgc2NoZWR1bGVzIGEgSm9iIHRvIHByb2Nlc3MgY29sbGVjdGVkIGZpbGVzLiBBbGwgSlNQCi0JICogaW5kZXhpbmcgc2hvdWxkIGJlIGRvbmUgdGhyb3VnaCB0aGlzIG1ldGhvZCBvciBwcm9jZXNzRmlsZXMoSUZpbGUgZmlsZSkKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZXMKLQkgKi8KLQlmaW5hbCB2b2lkIGluZGV4RmlsZXMoSUZpbGVbXSBmaWxlcykgewotCQkvLyBkb24ndCB1c2UgdGhpcyBydWxlCi0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00OTMxCi0JCS8vIHByb2Nlc3NGaWxlcy5zZXRSdWxlKG5ldyBJbmRleEZpbGVSdWxlKCkpOwotCQlwcm9jZXNzRmlsZXNKb2IucHJvY2VzcyhmaWxlcyk7Ci0JfQotCi0KLQkvKioKLQkgKiBQYWNrYWdlIHByb3RlY3RlZCBmb3IgYWNjZXNzIGJ5IGlubmVyIEpvYiBjbGFzcyBpbiByZXNvdXJjZUNoYW5nZWQoLi4uKQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlKU1BSZXNvdXJjZVZpc2l0b3IgZ2V0VmlzaXRvcigpIHsKLQotCQlpZiAodGhpcy5mVmlzaXRvciA9PSBudWxsKSB7Ci0JCQl0aGlzLmZWaXNpdG9yID0gbmV3IEpTUFJlc291cmNlVmlzaXRvcigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmZWaXNpdG9yOwotCX0KLQl2b2lkIHNhdmVJbmRleGVzKCkgewotCQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7Ci0JCUlQcm9qZWN0W10gYWxsUHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgYWxsUHJvamVjdHMubGVuZ3RoOyBqKyspIHsKLQkJCWlmICghSnNXZWJOYXR1cmUuaGFzTmF0dXJlKGFsbFByb2plY3RzW2pdKSB8fCAhYWxsUHJvamVjdHNbal0uaXNPcGVuKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUlQYXRoIGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0TW9kZWxKc3BQbHVnaW5Xb3JraW5nTG9jYXRpb24oYWxsUHJvamVjdHNbal0pOwotCQkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShqc3BNb2RlbFdvcmtpbmdMb2NhdGlvbi50b09TU3RyaW5nKCkpOwotCQkJU3RyaW5nW10gZmlsZXMgPSBmb2xkZXIubGlzdCgpOwotCQkJU3RyaW5nIGxvY2F5ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZmlsZXNbaV0udG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmluZGV4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbG9jYXkgPSBqc3BNb2RlbFdvcmtpbmdMb2NhdGlvbi50b1N0cmluZygpICsgIi8iICsgZmlsZXNbaV07IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIHJldXNlIGluZGV4IGZpbGUKLS8vIGluZGV4ID0gbmV3IEluZGV4KGxvY2F5LCBhbGxQcm9qZWN0c1tqXS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSwgdHJ1ZSk7Ci0vLyAvLyROT04tTkxTLTEkCi0vLyBpbmRleC5zYXZlKCk7Ci0JCQkJCQlpbmRleE1hbmFnZXIuZ2V0SW5kZXgoYWxsUHJvamVjdHNbal0uZ2V0RnVsbFBhdGgoKSwgbmV3IFBhdGgobG9jYXkpLCB0cnVlLCBmYWxzZSk7Ci0JCQkJCQkvLyBpbmRleE1hbmFnZXIuc2F2ZUluZGV4KGluZGV4KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gd2Ugc2hvdWxkIGJlIHNodXR0aW5nIGRvd24sIHdhbnQgdG8gc2h1dCBkb3duIHF1aWV0bHkKLQkJCQlpZiAoSnNJbmRleE1hbmFnZXIuREVCVUcpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwOTEKLQkvLyBtYWtlcyBzdXJlIEluZGV4TWFuYWdlciBpcyBhd2FyZSBvZiBvdXIgaW5kZXhlcwotCXZvaWQgc2F2ZUluZGV4ZXNPUklHSU5BTCgpIHsKLQkJSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEluZGV4TWFuYWdlcigpOwotCQlJUGF0aCBqc3BNb2RlbFdvcmtpbmdMb2NhdGlvbiA9IEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldE1vZGVsSnNwUGx1Z2luV29ya2luZ0xvY2F0aW9uKCk7Ci0KLQkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShqc3BNb2RlbFdvcmtpbmdMb2NhdGlvbi50b09TU3RyaW5nKCkpOwotCQlTdHJpbmdbXSBmaWxlcyA9IGZvbGRlci5saXN0KCk7Ci0JCVN0cmluZyBsb2NheSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUluZGV4IGluZGV4ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZmlsZXNbaV0udG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmluZGV4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2NheSA9IGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uLnRvU3RyaW5nKCkgKyAiLyIgKyBmaWxlc1tpXTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyByZXVzZSBpbmRleCBmaWxlCi0JCQkJCWluZGV4ID0gbmV3IEluZGV4KGxvY2F5LCAiSW5kZXggZm9yICIgKyBsb2NheSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaW5kZXhNYW5hZ2VyLnNhdmVJbmRleChpbmRleCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gd2Ugc2hvdWxkIGJlIHNodXR0aW5nIGRvd24sIHdhbnQgdG8gc2h1dCBkb3duIHF1aWV0bHkKLQkJCWlmIChERUJVRykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLS8vCUlDb250ZW50VHlwZSBnZXRKc3BDb250ZW50VHlwZSgpIHsKLS8vCQlpZiAodGhpcy5mQ29udGVudFR5cGVKU1AgPT0gbnVsbCkKLS8vCQkJdGhpcy5mQ29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLS8vCQlyZXR1cm4gdGhpcy5mQ29udGVudFR5cGVKU1A7Ci0vLwl9Ci0KLQkvKioKLQkgKiBBIGNoZWNrIHRvIHNlZSBpZiB0aGUgT1NHSSBmcmFtZXdvcmsgaXMgc2h1dHRpbmcgZG93bi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFN5c3RlbSBCdW5kbGUgaXMgc3RvcHBlZCAoaWUuIHRoZSBmcmFtZXdvcmsgaXMKLQkgKiAgICAgICAgIHNodXR0aW5nIGRvd24pCi0JICovCi0JYm9vbGVhbiBmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpIHsKLQkJLy8gaW4gdGhlIEZyYW1ld29yayBjbGFzcyB0aGVyZSdzIGEgbm90ZToKLQkJLy8gc2V0IHRoZSBzdGF0ZSBvZiB0aGUgU3lzdGVtIEJ1bmRsZSB0byBTVE9QUElORy4KLQkJLy8gdGhpcyBtdXN0IGJlIGRvbmUgZmlyc3QgYWNjb3JkaW5nIHRvIHNlY3Rpb24gNC4xOS4yIGZyb20gdGhlIE9TR2kKLQkJLy8gUjMgc3BlYy4KLQkJYm9vbGVhbiBzaHV0dGluZ0Rvd24gPSBQbGF0Zm9ybS5nZXRCdW5kbGUoT1NHSV9GUkFNRVdPUktfSUQpLmdldFN0YXRlKCkgPT0gQnVuZGxlLlNUT1BQSU5HOwotCQlpZiAoREVCVUcgJiYgc2h1dHRpbmdEb3duKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlcjogc3lzdGVtIGlzIHNodXR0aW5nIGRvd24hIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc2h1dHRpbmdEb3duOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0KLQkJLy8gc3RvcCBsaXN0ZW5pbmcKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoanNwUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0KLQotCQkvLyBzdG9wIGFueSBzZWFyY2hpbmcKLQkJSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0KLQkJLy8gc3RvcCBsaXN0ZW5pbmcgdG8gam9icwotCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkucmVtb3ZlSm9iQ2hhbmdlTGlzdGVuZXIoaW5kZXhKb2JDb29yZGluYXRvcik7Ci0KLQotCQlpbnQgbWF4d2FpdCA9IDUwMDA7Ci0JCWlmIChwcm9jZXNzRmlsZXNKb2IgIT0gbnVsbCkgewotCQkJcHJvY2Vzc0ZpbGVzSm9iLmNhbmNlbCgpOwotCQl9Ci0JCS8vIGF0dGVtcHQgdG8gbWFrZSBzdXJlIHRoaXMgaW5kZXhpbmcgam9iIGlzIGxpdHRlcmFsbHkKLQkJLy8gZG9uZSBiZWZvcmUgY29udGludWluZywgc2luY2Ugd2UgYXJlIHNodXR0aW5nIGRvd24KLQkJd2FpdFRpbGxOb3RSdW5uaW5nKG1heHdhaXQsIHByb2Nlc3NGaWxlc0pvYik7Ci0KLQkJaWYgKGluZGV4aW5nSm9iICE9IG51bGwpIHsKLQkJCWluZGV4aW5nSm9iLmNhbmNlbCgpOwotCQl9Ci0JCXdhaXRUaWxsTm90UnVubmluZyhtYXh3YWl0LCBwcm9jZXNzRmlsZXNKb2IpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3YWl0VGlsbE5vdFJ1bm5pbmcoaW50IG1heFNlY29uZHMsIEpvYiBqb2IpIHsKLQkJaW50IHBhdXNlVGltZSA9IDEwOwotCQlpbnQgbWF4dHJpZXMgPSBtYXhTZWNvbmRzIC8gcGF1c2VUaW1lOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAoKGNvdW50KysgPCBtYXh0cmllcykgJiYgKGpvYi5nZXRTdGF0ZSgpID09IEpvYi5SVU5OSU5HKSkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAocGF1c2VUaW1lKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvdW50OiAiICsgY291bnQgKyAiIG1heDogIiArCi0JCQkJLy8gbWF4dHJpZXMpOwotCQkJfQotCQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBJbmRleEpvYkNvb3JkaW5hdG9yIGV4dGVuZHMgSm9iQ2hhbmdlQWRhcHRlciB7Ci0JCQotCQlwdWJsaWMgdm9pZCBhYm91dFRvUnVuKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSm9iIGpvYlRvQ29vcmRpbmF0ZSA9IGV2ZW50LmdldEpvYigpOwotCQkJaWYgKGlzSm9iVG9Bdm9pZChqb2JUb0Nvb3JkaW5hdGUpKSB7Ci0JCQkJLy8gam9iIHdpbGwgYmUgcmVzY2hlZHVsZWQgd2hlbiB0aGUgam9iIHdlCi0JCQkJLy8gYXJlIGF2b2lkaW5nIChlZy4gYnVpbGQpIGlzIGRvbmUKLQkJCQlnZXRQcm9jZXNzRmlsZXNKb2IoKS5jYW5jZWwoKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiY2FuY2VsOiIgKyBqb2JUb0Nvb3JkaW5hdGUuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0KLQkJCUpvYiBqb2JUb0Nvb3JkaW5hdGUgPSBldmVudC5nZXRKb2IoKTsKLQkJCWlmIChpc0pvYlRvQXZvaWQoam9iVG9Db29yZGluYXRlKSkgewotCQkJCWlmIChnZXRQcm9jZXNzRmlsZXNKb2IoKS5nZXRGaWxlcygpLmxlbmd0aCA+IDApIHsKLQkJCQkJZ2V0UHJvY2Vzc0ZpbGVzSm9iKCkuc2NoZWR1bGUoNTAwKTsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInNjaGVkdWxlOiIgKyBqb2JUb0Nvb3JkaW5hdGUuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJCQotCi0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNKb2JUb0F2b2lkKEpvYiBqb2JUb0Nvb3JkaW5hdGUpIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZiAoam9iVG9Db29yZGluYXRlLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQpIHx8IGpvYlRvQ29vcmRpbmF0ZS5iZWxvbmdzVG8oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfQlVJTEQpIHx8IGpvYlRvQ29vcmRpbmF0ZS5iZWxvbmdzVG8oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX1JFRlJFU0gpKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBKU1BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCi0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0KLQkJCWlmIChpc0luaXRpYWxpemluZygpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBpZ25vcmUgcmVzb3VyY2UgY2hhbmdlcyBpZiBhbHJlYWR5IHJlYnVpbGRpbmcKLQkJCWlmIChnZXRJbmRleFN0YXRlKCkgPT0gU19SRUJVSUxESU5HKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gcHJldmlvdXNseSBjYW5jZWxlZCwgbmVlZHMgZW50aXJlIGluZGV4IHJlYnVpbGQKLQkJCWlmIChnZXRJbmRleFN0YXRlKCkgPT0gU19DQU5DRUxFRCkgewotCQkJCS8vIHJlYnVpbGRJbmRleCgpOwotCQkJCS8vIGp1c3QgcmVzdW1lIGluZGV4aW5nCi0JCQkJZ2V0UHJvY2Vzc0ZpbGVzSm9iKCkuc2NoZWR1bGUoNTAwKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic2NoZWR1bGU6IHJlc291cmNlIGNoYW5nZWQsIHByZXZpb3VzbHkgY2FuY2VsZWQiKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmIChkZWx0YSAhPSBudWxsKSB7Ci0JCQkJLy8gb25seSBjYXJlIGFib3V0IGFkZHMgb3IgY2hhbmdlcyByaWdodCBub3cuLi4KLQkJCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJCQlib29sZWFuIGFkZGVkID0gKGtpbmQgJiBJUmVzb3VyY2VEZWx0YS5BRERFRCkgPT0gSVJlc291cmNlRGVsdGEuQURERUQ7Ci0JCQkJYm9vbGVhbiBjaGFuZ2VkID0gKGtpbmQgJiBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOwotCQkJCWlmIChhZGRlZCB8fCBjaGFuZ2VkKSB7Ci0KLQkJCQkJLy8gb25seSBhbmFseXplIHRoZSBmdWxsIChzdGFydGluZyBhdCByb290KSBkZWx0YQotCQkJCQkvLyBoaWVyYXJjaHkKLQkJCQkJaWYgKGRlbHRhLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS5lcXVhbHMoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQl0cnkgewotCQkJCQkJCUpTUFJlc291cmNlVmlzaXRvciB2ID0gZ2V0VmlzaXRvcigpOwotCQkJCQkJCS8vIGNsZWFyIGZyb20gbGFzdCBydW4KLQkJCQkJCQl2LnJlc2V0KCk7Ci0JCQkJCQkJLy8gY291bnQgZmlsZXMsIHBvc3NpYmx5IGRvIHRoaXMgaW4gYSBqb2IgdG9vLi4uCi0JCQkJCQkJLy8gZG9uJ3QgaW5jbHVkZSBQSEFOVE9NIHJlc291cmNlcwotCQkJCQkJCWRlbHRhLmFjY2VwdCh2LCBmYWxzZSk7Ci0KLQkJCQkJCQkvLyBwcm9jZXNzIGZpbGVzIGZyb20gdGhpcyBkZWx0YQotCQkJCQkJCUlGaWxlW10gZmlsZXMgPSB2LmdldEZpbGVzKCk7Ci0JCQkJCQkJaWYgKGZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQkJLyoKLQkJCQkJCQkJICogSm9iIGNoYW5nZSBsaXN0ZW5lciBzaG91bGQgc2V0IGJhY2sgdG8KLQkJCQkJCQkJICogc3RhYmxlIHdoZW4gZmluaXNoZWQKLQkJCQkJCQkJICovCi0JCQkJCQkJCXNldFVwZGF0aW5nU3RhdGUoKTsKLQkJCQkJCQkJLy8gcHJvY2Vzc0ZpbGVzKGZpbGVzKTsKLQkJCQkJCQkJaW5kZXhGaWxlcyhmaWxlcyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIG5lZWQgdG8gc2V0IHN0YXRlIGhlcmUgc29tZWhvdywgYW5kIHJlaW5kZXgKLQkJCQkJCQkvLyBvdGhlcndpc2UgaW5kZXggd2lsbCBiZSB1bnJlbGlhYmxlCi0JCQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gbmVlZCB0byBzZXQgc3RhdGUgaGVyZSBzb21laG93LCBhbmQgcmVpbmRleAotCQkJCQkJCS8vIG90aGVyd2lzZSBpbmRleCB3aWxsIGJlIHVucmVsaWFibGUKLQkJCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfQotCi0JfQotCi0JSW5kZXhXb3Jrc3BhY2VKb2IgZ2V0SW5kZXhpbmdKb2IoKSB7Ci0JCXJldHVybiBpbmRleGluZ0pvYjsKLQl9Ci0KLQlQcm9jZXNzRmlsZXNKb2IgZ2V0UHJvY2Vzc0ZpbGVzSm9iKCkgewotCQlyZXR1cm4gcHJvY2Vzc0ZpbGVzSm9iOwotCX0KLQotCWJvb2xlYW4gaXNJbml0aWFsaXppbmcoKSB7Ci0JCXJldHVybiBpbml0aWFsaXppbmc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1BhdGhJbmRleGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1BhdGhJbmRleGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZWJhYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNQYXRoSW5kZXhlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5JSmF2YVNjcmlwdFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5VdGlsOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qKGNvcGllZCBmcm9tIEpTUCkKLSAqIHBhX1RPRE8gU3RpbGwgbmVlZCB0byB0YWtlIGludG8gY29uc2lkZXJhdGlvbjoKLSAqIAktIGZvY3VzIGluIHdvcmtzcGFjZQotICogIC0gc2VhcmNoIHBhdHRlcm4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzUGF0aEluZGV4ZXIgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCQotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanNzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotIAkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCQotCS8vIHZpc2l0b3IgdGhhdCByZXRyaWV2ZXMganNwIHByb2plY3QgcGF0aHMgZm9yIGFsbCBqc3AgZmlsZXMgaW4gdGhlIHdvcmtzcGFjZQotCWNsYXNzIEpTUEZpbGVWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlUHJveHlWaXNpdG9yIHsKLQkJLy8gaGFzaCBtYXAgZm9yY2VzIG9ubHkgb25lIG9mIGVhY2ggZmlsZQotCQlwcml2YXRlIEhhc2hNYXAgZlBhdGhzID0gbmV3IEhhc2hNYXAoKTsKLQkJSUphdmFTY3JpcHRTZWFyY2hTY29wZSBmU2NvcGUgPSBudWxsOwotCQlTZWFyY2hQYXR0ZXJuIGZQYXR0ZXJuID0gbnVsbDsKLQotCQlwdWJsaWMgSlNQRmlsZVZpc2l0b3IoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIHNjb3BlKSB7Ci0JCQl0aGlzLmZQYXR0ZXJuID0gcGF0dGVybjsKLQkJCXRoaXMuZlNjb3BlID0gc2NvcGU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCi0JCQlpZihKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCWlmIChwcm94eS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQotCQkJCS8vSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlSlNQID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0JCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM1NTMKLQkJCQkvLyBjaGVjayB0aGlzIGJlZm9yZSBkZXNjcmlwdGlvbgotCQkJCS8vIGNoZWNrIG5hbWUgYmVmb3JlIGFjdHVhbGx5IGdldHRpbmcgdGhlIGZpbGUgKGxlc3Mgd29yaykKLQkJCQkvL2lmKGNvbnRlbnRUeXBlSlNQLmlzQXNzb2NpYXRlZFdpdGgocHJveHkuZ2V0TmFtZSgpKSkgewotCQkJCWlmKFV0aWwuaXNKc1R5cGUocHJveHkuZ2V0TmFtZSgpKSl7CQotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKXByb3h5LnJlcXVlc3RSZXNvdXJjZSgpOwotCQkJCQkvL0lDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQkJLy9TdHJpbmcgY3RJZCA9IG51bGw7Ci0vLwkJCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0vLwkJCQkJCWN0SWQgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKS5nZXRJZCgpOwotLy8JCQkJCX0KLQkJCQkJLy9pZiAoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUC5lcXVhbHMoY3RJZCkpIHsKLQkJCQkJLy9pZihVdGlsLmlzSnNUeXBlKGZpbGUuZ2V0TmFtZSgpKSl7Ci0JCQkJCQlpZiAodGhpcy5mU2NvcGUuZW5jbG9zZXMocHJveHkucmVxdWVzdEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpIHsKLQkKLQkJCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgc2VsZWN0ZWQgaW5kZXggcGF0aDoiICsgZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQotCQkJCQkJCWZQYXRocy5wdXQoZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLCBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5jb21wdXRlSW5kZXhMb2NhdGlvbihmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkpKTsKLQkJCQkJCX0KLQkJCQkJLy99Ci0JCQkJfQotCQkJCS8vIGRvbid0IHNlYXJjaCBkZWVwZXIgZm9yIGZpbGVzCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgSVBhdGhbXSBnZXRQYXRocygpIHsKLQkJCXJldHVybiAoSVBhdGhbXSkgZlBhdGhzLnZhbHVlcygpLnRvQXJyYXkobmV3IElQYXRoW2ZQYXRocy5zaXplKCldKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJUGF0aFtdIGdldFZpc2libGVKc3BQYXRocyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgc2NvcGUpIHsKLQotCQlKU1BGaWxlVmlzaXRvciBqc3BGaWxlVmlzaXRvciA9IG5ldyBKU1BGaWxlVmlzaXRvcihwYXR0ZXJuLCBzY29wZSk7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmFjY2VwdChqc3BGaWxlVmlzaXRvciwgMCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4ganNwRmlsZVZpc2l0b3IuZ2V0UGF0aHMoKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzU2VhcmNoRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzU2VhcmNoRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U4N2JiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1NlYXJjaERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnMuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSooY29waWVkIGZyb20gSlNQKQotICogQ3JlYXRlZCB3aXRoIGEgLmpzcCBmaWxlLCBidXQgc2hvdWxkIGFwcGVhciB0byBiZSBhIC5qYXZhIGZpbGUgZm9yIGluZGV4aW5nCi0gKiBhbmQgc2VhcmNoaW5nIHB1cnBvc2VzLiBUaGVyZSBhcmUgcHVycG9zZWx5IGZldyBmaWVsZHMgaW4gdGhpcyBjbGFzcywgYW5kCi0gKiB0aG9zZSBmaWVsZHMgYXJlIGxpZ2h0d2VpZ2h0IHNpbmNlIGl0J3MgcG9zc2libGUgZm9yIG1hbnkgSlNQIHNlYXJjaAotICogZG9jdW1lbnRzIHRvIGV4aXN0IGluIG1lbW9yeSBhdCBvbmUgdGltZSAoZWcuIGFmdGVyIGltcG9ydGluZyBhIHByb2plY3QKLSAqIHdpdGggYSBsYXJnZSBudW1iZXIgb2YgSlNQIGZpbGVzKQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSnNTZWFyY2hEb2N1bWVudCB7Ci0KLQlwcml2YXRlIFN0cmluZyBVTktOT1dOX1BBVEggPSAiKipwYXRoIHVua25vd24qKiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBmSlNQUGF0aFN0cmluZyA9IFVOS05PV05fUEFUSDsKLQlwcml2YXRlIFN0cmluZyBmQ1VQYXRoID0gVU5LTk9XTl9QQVRIOwotCXByaXZhdGUgU2VhcmNoUGFydGljaXBhbnQgZlBhcnRpY2lwYW50ID0gbnVsbDsKLQlwcml2YXRlIGxvbmcgZkxhc3RNb2RpZmllZFN0YW1wOwotCXByaXZhdGUgY2hhcltdIGZDYWNoZWRDaGFyQ29udGVudHM7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcGFyYW0gcGFydGljaXBhbnQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSnNTZWFyY2hEb2N1bWVudChTdHJpbmcgZmlsZVBhdGgsIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7Ci0KLQkJdGhpcy5mSlNQUGF0aFN0cmluZyA9IGZpbGVQYXRoOwotCQl0aGlzLmZQYXJ0aWNpcGFudCA9IHBhcnRpY2lwYW50OwotCX0KLQotCXB1YmxpYyBTZWFyY2hQYXJ0aWNpcGFudCBnZXRQYXJ0aWNpcGFudCgpIHsKLQkJcmV0dXJuIHRoaXMuZlBhcnRpY2lwYW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50I2dldENoYXJDb250ZW50cygpCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDaGFyQ29udGVudHMoKSB7Ci0JCQotCQlpZigoZkNhY2hlZENoYXJDb250ZW50cyA9PSBudWxsKSB8fCBpc0RpcnR5KCkpIHsKLQkJICAgIElKc1RyYW5zbGF0aW9uIHRyYW5zID0gZ2V0SlNUcmFuc2xhdGlvbigpOyAgICAKLQkJICAgIGZDYWNoZWRDaGFyQ29udGVudHMgPSB0cmFucyAhPSBudWxsID8gdHJhbnMuZ2V0SnNUZXh0KCkudG9DaGFyQXJyYXkoKSA6IG5ldyBjaGFyWzBdOwotCQkgICAgZkNVUGF0aCA9IHRyYW5zLmdldEphdmFQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIGZDYWNoZWRDaGFyQ29udGVudHM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhVGV4dCgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoZ2V0Q2hhckNvbnRlbnRzKCkpOwotCX0KLQotCXByaXZhdGUgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCX0KLQotCS8qKgotCSAqIEl0J3Mgbm90IHJlY29tbWVuZGVkIGZvciBjbGllbnRzIHRvIGhvbGQgb24gdG8gdGhpcyBKU1BUcmFuc2xhdGlvbgotCSAqIHNpbmNlIGl0J3Mga2luZCBvZiBsYXJnZS4gSWYgcG9zc2libGUsIGhvbGQgb24gdG8gdGhlCi0JICogSlNQU2VhcmNoRG9jdW1lbnQsIHdoaWNoIGlzIG1vcmUgb2YgYSBsaWdodHdlaWdodCBwcm94eS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBKU1BUcmFuc2xhdGlvbiBmb3IgdGhlIGpzcCBmaWxlLCBvciBudWxsIGlmIGl0J3MgYW4KLQkgKiAgICAgICAgIHVuc3VwcG9ydGVkIGZpbGUuCi0JICovCi0JcHVibGljIGZpbmFsIElKc1RyYW5zbGF0aW9uIGdldEpTVHJhbnNsYXRpb24oKSB7Ci0JCUlKc1RyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gbnVsbDsKLQkJSUZpbGUganNwRmlsZSA9IGdldEZpbGUoKTsKLQkJaWYgKCFKc1NlYXJjaFN1cHBvcnQuaXNKc3AoanNwRmlsZSkpIHsKLQkJCXJldHVybiB0cmFuc2xhdGlvbjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJLy8gZ2V0IGV4aXN0aW5nIG1vZGVsIGZvciByZWFkLCB0aGVuIGdldCBkb2N1bWVudCBmcm9tIGl0Ci0JCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCQkJaWYgKG1vZGVsTWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJanNwRmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCW1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChqc3BGaWxlKTsKLQkJCX0KLQkJCS8vIGhhbmRsZSB1bnN1cHBvcnRlZAotCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJSURPTU1vZGVsIHhtbE1vZGVsID0gKElET01Nb2RlbCltb2RlbDsKLQkJCQlzZXR1cEFkYXB0ZXJGYWN0b3J5KHhtbE1vZGVsKTsKLQkJCQlJRE9NRG9jdW1lbnQgZG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQlKc1RyYW5zbGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKEpzVHJhbnNsYXRpb25BZGFwdGVyKSBkb2MuZ2V0QWRhcHRlckZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkJdHJhbnNsYXRpb24gPSBhZGFwdGVyLmdldEpzVHJhbnNsYXRpb24oZmFsc2UpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwgZSkgewotCQkJLy8gbm8gbmVlZCB0byBsb2cgdGhpcy4gSnVzdCBjb25zaWRlciBpdCBhbiBpbnZhbGlkIGZpbGUgZm9yIG91cgotCQkJLy8gcHVycG9zZXMuCi0JCQkvLyBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJhbnNsYXRpb247Ci0JfQotCi0JLyoqCi0JICogYWRkIHRoZSBmYWN0b3J5IGZvciBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgaGVyZQotCSAqIAotCSAqIEBwYXJhbSBzbQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cEFkYXB0ZXJGYWN0b3J5KElTdHJ1Y3R1cmVkTW9kZWwgc20pIHsKLQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5LnNldHVwQWRhcHRlckZhY3Rvcnkoc20pOwotCX0KLQotCS8qKgotCSAqIHRoZSBwYXRoIHRvIHRoZSBKYXZhIGNvbXBpbGF0aW9uIHVuaXQKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudCNnZXRQYXRoKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JICAgIC8vIGNhY2hpbmcgdGhlIHBhdGggc2luY2UgaXQncyBleHBlbnNpdmUgdG8gZ2V0IHRyYW5zbGF0aW9uCi0JCS8vIGltcG9ydGFudCB0aGF0IGlzRGlydHkoKSBjaGVjayBpcyBzZWNvbmQgdG8gY2FjaGUgbW9kaWZpY2F0aW9uIHN0YW1wCi0JICAgIGlmKCh0aGlzLmZDVVBhdGggPT0gbnVsbCkgfHwgaXNEaXJ0eSgpIHx8ICh0aGlzLmZDVVBhdGggPT0gVU5LTk9XTl9QQVRIKSkgewotCSAgICAgICAgSUpzVHJhbnNsYXRpb24gdHJhbnMgPSBnZXRKU1RyYW5zbGF0aW9uKCk7Ci0JICAgICAgICBpZih0cmFucyAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgdGhpcy5mQ1VQYXRoID0gdHJhbnMuZ2V0SmF2YVBhdGgoKTsKLQkgICAgICAgICAgICAvLyBzYXZlIHNpbmNlIGl0J3MgZXhwZW5zaXZlIHRvIGNhbGN1bGF0ZSBhZ2FpbiBsYXRlcgotCSAgICAgICAgICAgIGZDYWNoZWRDaGFyQ29udGVudHMgPSB0cmFucy5nZXRKc1RleHQoKS50b0NoYXJBcnJheSgpOwotCSAgICAgICAgfQotCSAgICB9Ci0JCXJldHVybiBmQ1VQYXRoICE9IG51bGwgPyBmQ1VQYXRoIDogVU5LTk9XTl9QQVRIOwotCX0KLQotLy8JcHVibGljIGludCBnZXRKc3BPZmZzZXQoaW50IGphdmFPZmZzZXQpIHsKLS8vCQkvLyBjb3BpZWQgZnJvbSBKU1BUcmFuc2xhdGlvbgotLy8JCWludCByZXN1bHQgPSAtMTsKLS8vCQlpbnQgb2Zmc2V0SW5SYW5nZSA9IDA7Ci0vLwkJUG9zaXRpb24ganNwUG9zLCBqYXZhUG9zID0gbnVsbDsKLS8vCQlJSnNUcmFuc2xhdGlvbiB0cmFucyA9IGdldEpTUFRyYW5zbGF0aW9uKCk7Ci0vLwkJaWYgKHRyYW5zICE9IG51bGwpIHsKLS8vCQkJSGFzaE1hcCBqYXZhMmpzcE1hcCA9IHRyYW5zLmdldEphdmEySnNwTWFwKCk7Ci0vLwotLy8JCQkvLyBpdGVyYXRlIGFsbCBtYXBwZWQgamF2YSByYW5nZXMKLS8vCQkJSXRlcmF0b3IgaXQgPSBqYXZhMmpzcE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotLy8JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0vLwkJCQlqYXZhUG9zID0gKFBvc2l0aW9uKSBpdC5uZXh0KCk7Ci0vLwkJCQkvLyBuZWVkIHRvIGNvdW50IHRoZSBsYXN0IHBvc2l0aW9uIGFzIGluY2x1ZGVkCi0vLwkJCQlpZiAoIWphdmFQb3MuaW5jbHVkZXMoamF2YU9mZnNldCkgJiYgIShqYXZhUG9zLm9mZnNldCArIGphdmFQb3MubGVuZ3RoID09IGphdmFPZmZzZXQpKQotLy8JCQkJCWNvbnRpbnVlOwotLy8KLS8vCQkJCW9mZnNldEluUmFuZ2UgPSBqYXZhT2Zmc2V0IC0gamF2YVBvcy5vZmZzZXQ7Ci0vLwkJCQlqc3BQb3MgPSAoUG9zaXRpb24pIGphdmEyanNwTWFwLmdldChqYXZhUG9zKTsKLS8vCi0vLwkJCQlpZiAoanNwUG9zICE9IG51bGwpCi0vLwkJCQkJcmVzdWx0ID0ganNwUG9zLm9mZnNldCArIG9mZnNldEluUmFuZ2U7Ci0vLwkJCQllbHNlIHsKLS8vCQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgImpzcFBvc2l0aW9uIHdhcyBudWxsISIgKyBqYXZhT2Zmc2V0KTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJfQotLy8JCQkJYnJlYWs7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJcmV0dXJuIHJlc3VsdDsKLS8vCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSVBhdGgganNwUGF0aCA9IG5ldyBQYXRoKHRoaXMuZkpTUFBhdGhTdHJpbmcpOwotCQlJRmlsZSBqc3BGaWxlID0gcm9vdC5nZXRGaWxlKGpzcFBhdGgpOwotCQlpZiAoIWpzcEZpbGUuZXhpc3RzKCkpIHsKLQkJCS8vIHBvc3NpYmx5IG91dHNpZGUgd29ya3NwYWNlCi0JCQlqc3BGaWxlID0gcm9vdC5nZXRGaWxlRm9yTG9jYXRpb24oanNwUGF0aCk7Ci0JCX0KLQkJcmV0dXJuIGpzcEZpbGU7Ci0JfQotCi0JCi0JcHJpdmF0ZSBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJSUZpbGUgZiA9IGdldEZpbGUoKTsKLQkJaWYoZiAhPSBudWxsKSB7Ci0JCQlsb25nIGN1cnJlbnRTdGFtcCA9IGYuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJCWlmKGN1cnJlbnRTdGFtcCAhPSBmTGFzdE1vZGlmaWVkU3RhbXApIHsKLQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCQlmTGFzdE1vZGlmaWVkU3RhbXAgPSBjdXJyZW50U3RhbXA7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBub3RoaW5nIHRvIGRvIG5vdyBzaW5jZSBKU1BUcmFuc2xhdGlvbiBpcyBjcmVhdGVkIG9uIHRoZSBmbHkKLQl9Ci0KLQkvKioKLQkgKiBmb3IgZGVidWdnaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJbSlNQU2VhcmNoRG9jdW1lbnQ6IiArIHRoaXMuZkpTUFBhdGhTdHJpbmcgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudCNnZXRFbmNvZGluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudCNnZXRCeXRlQ29udGVudHMoKQotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZUNvbnRlbnRzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzU2VhcmNoUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzU2VhcmNoUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhhYzNhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1NlYXJjaFBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guSUphdmFTY3JpcHRTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSooY29waWVkIGZyb20gSlNQKQotICogSW50ZWdyYXRpb24gb2YgSlNQIHcvIGphdmEgc2VhcmNoLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSnNTZWFyY2hQYXJ0aWNpcGFudCBleHRlbmRzIFNlYXJjaFBhcnRpY2lwYW50IHsKLQotCS8vIGZvciBkZWJ1Z2dpbmcKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gY2FsY3VsYXRlVmFsdWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2FsY3VsYXRlVmFsdWUoKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwc2VhcmNoIik7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBkZWJ1ZyA9ICh2YWx1ZSAhPSBudWxsKSAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGRlYnVnOwotCX0KLQotCS8qKgotCSAqIEltcG9ydGFudCB0byBuZXZlciByZXR1cm4gbnVsbCBoZXJlIG9yIGVsc2UgSmF2YSBzZWFyY2ggcGFydGljaXBhdGlvbgotCSAqIHdpbGwgYnJlYWsuCi0JICovCi0JcHVibGljIFNlYXJjaERvY3VtZW50IGdldERvY3VtZW50KFN0cmluZyBkb2N1bWVudFBhdGgpIHsKLQkJU2VhcmNoRG9jdW1lbnQgc0RvYyA9IEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFNlYXJjaERvY3VtZW50KGRvY3VtZW50UGF0aCk7Ci0KLQkJaWYgKHNEb2MgPT0gbnVsbCkgewotCQkJLy8gcmV0dXJuIGEgZHVtbXkgZG9jIGhlcmUgc28gc2VhcmNoIHBhcnRpY2lwYXRpb24gZG9lc24ndCBicmVhawotCQkJcmV0dXJuIG5ldyBOdWxsU2VhcmNoRG9jdW1lbnQoZG9jdW1lbnRQYXRoKTsKLQkJfQotCQlyZXR1cm4gc0RvYzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIkVtYmVkZWQgSmF2YVNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVBhdGhbXSBzZWxlY3RJbmRleGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUphdmFTY3JpcHRTZWFyY2hTY29wZSBzY29wZSkgewotCQlKc1BhdGhJbmRleGVyIGluZGV4ZXIgPSBuZXcgSnNQYXRoSW5kZXhlcigpOwotCQlyZXR1cm4gaW5kZXhlci5nZXRWaXNpYmxlSnNwUGF0aHMocGF0dGVybiwgc2NvcGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluZGV4RG9jdW1lbnQoU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQsIElQYXRoIGluZGV4UGF0aCkgewotCQlpZiAoIShkb2N1bWVudCBpbnN0YW5jZW9mIEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gdXNlIEphdmEgc2VhcmNoIGluZGV4aW5nCi0JCVNlYXJjaEVuZ2luZS5nZXREZWZhdWx0U2VhcmNoUGFydGljaXBhbnQoKS5pbmRleERvY3VtZW50KGRvY3VtZW50LCBpbmRleFBhdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvY2F0ZU1hdGNoZXMoU2VhcmNoRG9jdW1lbnRbXSBpbmRleE1hdGNoZXMsIFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUphdmFTY3JpcHRTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKChtb25pdG9yICE9IG51bGwpICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBmaWx0ZXIgb3V0IG51bGwgbWF0Y2hlcwotCQlMaXN0IGZpbHRlcmVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlTZWFyY2hEb2N1bWVudCBtYXRjaCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhNYXRjaGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIHBvc3NpYmxlIG1hdGNoaW5nIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlOiAiICsgaW5kZXhNYXRjaGVzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJbWF0Y2ggPSBpbmRleE1hdGNoZXNbaV07Ci0JCQlpZiAobWF0Y2ggIT0gbnVsbCkgewotCQkJCS8vIHNvbWUgbWF0Y2hlcyBtYXkgYmUgbnVsbCwgb3IgaWYgdGhlIGluZGV4IGlzIG91dCBvZiBkYXRlLAotCQkJCS8vIHRoZSBmaWxlIG1heSBub3QgZXZlbiBleGlzdAotCQkJCWlmICgobWF0Y2ggaW5zdGFuY2VvZiBKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkgJiYgKChKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkgbWF0Y2gpLmdldEZpbGUoKS5leGlzdHMoKSkgewotCQkJCQlmaWx0ZXJlZC5hZGQobWF0Y2gpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWluZGV4TWF0Y2hlcyA9IChTZWFyY2hEb2N1bWVudFtdKSBmaWx0ZXJlZC50b0FycmF5KG5ldyBTZWFyY2hEb2N1bWVudFtmaWx0ZXJlZC5zaXplKCldKTsKLQkJU2VhcmNoRW5naW5lLmdldERlZmF1bHRTZWFyY2hQYXJ0aWNpcGFudCgpLmxvY2F0ZU1hdGNoZXMoaW5kZXhNYXRjaGVzLCBwYXR0ZXJuLCBzY29wZSwgcmVxdWVzdG9yLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudCNnZXREb2N1bWVudChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgU2VhcmNoRG9jdW1lbnQgZ2V0RG9jdW1lbnQoSUZpbGUgZmlsZSkgewotCQkvLyBuZXZlciBnZXRzIGNhbGxlZD8KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNTZWFyY2hTY29wZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNTZWFyY2hTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTVlN2Y3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzU2VhcmNoU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guSUphdmFTY3JpcHRTZWFyY2hTY29wZTsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSooY29waWVkIGZyb20gSlNQKQotICogVXNlZCB0byBjb25zdHJhaW4gSlNQL2phdmEgc2VhcmNoIHRvIGNlcnRhaW4gcGF0aHMgYW5kIGVsZW1lbnRzLgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzU2VhcmNoU2NvcGUgaW1wbGVtZW50cyBJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmRW5jbG9zZXNBbGwgPSBmYWxzZTsKLQlwcml2YXRlIExpc3QgZlJlc291cmNlUGF0aHMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmSmF2YUVsZW1lbnRzID0gbnVsbDsKLQotCXB1YmxpYyBKc1NlYXJjaFNjb3BlKCkgewotCQkvLyBlbXB0eSBjb25zdHJ1Y3RvciBqdXN0IHJldHVybnMgdHJ1ZSBmb3IgZXZlcnl0aGluZwotCQkvLyBldmVyeXRoaW5nIGlzIGluIHNjb3BlCi0JCXRoaXMuZkVuY2xvc2VzQWxsID0gdHJ1ZTsKLQkJaW5pdCgpOwotCX0KLQotCXB1YmxpYyBKc1NlYXJjaFNjb3BlKFN0cmluZ1tdIHJlc291cmNlU3RyaW5nUGF0aCkgewotCQlpbml0KCk7Ci0JCWZSZXNvdXJjZVBhdGhzLmFkZEFsbChBcnJheXMuYXNMaXN0KHJlc291cmNlU3RyaW5nUGF0aCkpOwotCX0KLQotCXB1YmxpYyBKc1NlYXJjaFNjb3BlKElKYXZhU2NyaXB0RWxlbWVudFtdIGphdmFFbGVtZW50KSB7Ci0JCWluaXQoKTsKLQkJZkphdmFFbGVtZW50cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChqYXZhRWxlbWVudCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQl0aGlzLmZSZXNvdXJjZVBhdGhzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0aGlzLmZKYXZhRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW5jbG9zZXMoU3RyaW5nIHJlc291cmNlUGF0aFN0cmluZykgewotCi0JCWlmICh0aGlzLmZFbmNsb3Nlc0FsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZW5jbG9zZXNQYXRoKHJlc291cmNlUGF0aFN0cmluZykpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVuY2xvc2VzKElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50KSB7Ci0KLQkJLy8gcGFfVE9EIGltcGxlbWVudAotCQlpZiAodGhpcy5mRW5jbG9zZXNBbGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW5jbG9zZXMoSVJlc291cmNlUHJveHkgZWxlbWVudCkgewotCi0JCWlmICh0aGlzLmZFbmNsb3Nlc0FsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZW5jbG9zZXNQYXRoKGVsZW1lbnQucmVxdWVzdEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCXRoaXMuZlJlc291cmNlUGF0aHMuYWRkKHBhdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5mSmF2YUVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZW5jbG9zZXNQYXRoKFN0cmluZyBwb3NzaWJsZSkgewotCi0JCVN0cmluZ1tdIHBhdGhzID0gKFN0cmluZ1tdKSBmUmVzb3VyY2VQYXRocy50b0FycmF5KG5ldyBTdHJpbmdbZlJlc291cmNlUGF0aHMuc2l6ZSgpXSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwb3NzaWJsZS5lcXVhbHMocGF0aHNbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0KLQkJcmV0dXJuICJKYXZhU2NyaXB0IFNlYXJjaCBTY29wZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVBhdGhbXSBlbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMoKSB7Ci0JCXJldHVybiAoSVBhdGhbXSkgZlJlc291cmNlUGF0aHMudG9BcnJheShuZXcgSVBhdGhbZlJlc291cmNlUGF0aHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkRXhjbHVkZShTdHJpbmcgY29udGFpbmVyLCBTdHJpbmcgcmVzb3VyY2VOYW1lKSB7Ci0JCS8qIGF1dG8gZ2VuICovCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1NlYXJjaFN1cHBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzU2VhcmNoU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGYwM2YwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzU2VhcmNoU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLklKYXZhU2NyaXB0U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLklKYXZhU2NyaXB0U2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Kc0NvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Kc0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzTmFtZU1hbmdsZXJVdGlsOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKihjb3BpZWQgZnJvbSBKU1ApCi0gKiBDZW50cmFsIGFjY2VzcyB0byBqYXZhIGluZGV4aW5nIGFuZCBzZWFyY2guIEFsbCBjb250YWN0IGJldHdlZW4gSkRUIGluZGV4aW5nCi0gKiBhbmQgU2VhcmNoaW5nIHNob3VsZCBiZSBkb25lIHRocm91Z2ggaGVyZS4KLSAqIAotICogQ2xpZW50cyBzaG91bGQgYWNjZXNzIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MgdmlhIHRoZSBzaW5nbGUgaW5zdGFuY2UgdmlhCi0gKiA8Y29kZT5nZXRJbnN0YW5jZSgpPC9jb2RlPi4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzU2VhcmNoU3VwcG9ydCB7Ci0KLSAgICAvLyBmb3IgZGVidWdnaW5nCi0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0gICAgc3RhdGljIHsKLSAgICAJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzc2VhcmNoIik7IC8vJE5PTi1OTFMtMSQKLSAJCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBKc1NlYXJjaFN1cHBvcnQgc2luZ2xldG9uID0gbnVsbDsKLQotICAgIHByaXZhdGUgSnNTZWFyY2hQYXJ0aWNpcGFudCBmUGFydGljaXBhbnQgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBJUGF0aCBmSnNQbHVnaW5Mb2NhdGlvbiA9IG51bGw7Ci0KLSAgICAvLyBwYV9UT0RPIG1heSBiZSBzbG93IChlc3AgZm9yIGluZGV4aW5nIGVudGlyZSB3b3Jrc3BhY2UpCi0gICAgcHJpdmF0ZSBmaW5hbCBDUkMzMiBmQ2hlY2tzdW1DYWxjdWxhdG9yID0gbmV3IENSQzMyKCk7Ci0KLSAgICAvKiogbWFpbiBjYW5jZWwgbW9udGlvciBmb3IgYWxsIHNlYXJjaCBzdXBwb3J0ICovCi0gICAgcHJpdmF0ZSBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIGZNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQotICAgIHByaXZhdGUgSnNTZWFyY2hTdXBwb3J0KCkgewotICAgICAgICAvLyBmb3JjZSB1c2Ugb2Ygc2luZ2xlIGluc3RhbmNlCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBvcGVyYXRpb24gZW5zdXJlcyB0aGF0IHRoZSBsaXZlIHJlc291cmNlJ3Mgc2VhcmNoIG1hcmtlcnMgc2hvdyB1cCBpbgotICAgICAqIHRoZSBvcGVuIGVkaXRvci4gSXQgYWxzbyBhbGxvd3MgdGhlIGFiaWxpdHkgdG8gcGFzcyBpbiBhIFByb2dyZXNzTW9uaXRvcgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgU2VhcmNoSm9iIGV4dGVuZHMgSm9iIGltcGxlbWVudHMgSUphdmFTY3JpcHRTZWFyY2hDb25zdGFudHMgewotCi0gICAgICAgIFN0cmluZyBmU2VhcmNoVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgSUphdmFTY3JpcHRTZWFyY2hTY29wZSBmU2NvcGUgPSBudWxsOwotCi0gICAgICAgIGludCBmU2VhcmNoRm9yID0gRklFTEQ7Ci0KLSAgICAgICAgaW50IGZMaW1pdFRvID0gQUxMX09DQ1VSUkVOQ0VTOwotCi0gICAgICAgIGludCBmTWF0Y2hNb2RlID0gU2VhcmNoUGF0dGVybi5SX1BBVFRFUk5fTUFUQ0g7Ci0KLSAgICAgICAvLyBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmUgPSBmYWxzZTsKLQotICAgICAgICBTZWFyY2hSZXF1ZXN0b3IgZlJlcXVlc3RvciA9IG51bGw7Ci0KLSAgICAgICAgSUphdmFTY3JpcHRFbGVtZW50IGZFbGVtZW50ID0gbnVsbDsKLQotICAgICAgICAvLyBjb25zdHJ1Y3RvciB3LyBqYXZhIGVsZW1lbnQKLSAgICAgICAgcHVibGljIFNlYXJjaEpvYihJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCwgSUphdmFTY3JpcHRTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgICAgICBzdXBlcihKc0NvcmVNZXNzYWdlcy5KU1BfU2VhcmNoICsgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgIHRoaXMuZkVsZW1lbnQgPSBlbGVtZW50OwotICAgICAgICAgICAgdGhpcy5mU2NvcGUgPSBzY29wZTsKLSAgICAgICAgICAgIHRoaXMuZlJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yIHcvIHNlYXJjaCB0ZXh0Ci0gICAgICAgIHB1YmxpYyBTZWFyY2hKb2IoU3RyaW5nIHNlYXJjaFRleHQsIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgc2NvcGUsIGludCBzZWFyY2hGb3IsIGludCBsaW1pdFRvLCBpbnQgbWF0Y2hNb2RlLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgICAgICBzdXBlcihKc0NvcmVNZXNzYWdlcy5KU1BfU2VhcmNoICsgc2VhcmNoVGV4dCk7Ci0gICAgICAgICAgICB0aGlzLmZTZWFyY2hUZXh0ID0gc2VhcmNoVGV4dDsKLSAgICAgICAgICAgIHRoaXMuZlNjb3BlID0gc2NvcGU7Ci0gICAgICAgICAgICB0aGlzLmZTZWFyY2hGb3IgPSBzZWFyY2hGb3I7Ci0gICAgICAgICAgICB0aGlzLmZMaW1pdFRvID0gbGltaXRUbzsKLSAgICAgICAgICAgIHRoaXMuZk1hdGNoTW9kZSA9IG1hdGNoTW9kZTsKLSAgICAgICAgICAgLy8gdGhpcy5mSXNDYXNlU2Vuc2l0aXZlID0gaXNDYXNlU2Vuc2l0aXZlOwotICAgICAgICAgICAgdGhpcy5mUmVxdWVzdG9yID0gcmVxdWVzdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3Igam9iTW9uaXRvcikgewotCi0gICAgICAgICAgICBpZiAoKGpvYk1vbml0b3IgIT0gbnVsbCkgJiYgam9iTW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQl9Ci0gICAgICAgICAgICBpZiAoSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJfQotCi0gICAgICAgICAgICBTZWFyY2hQYXR0ZXJuIGphdmFTZWFyY2hQYXR0ZXJuID0gbnVsbDsKLSAgICAgICAgICAgIC8vIGlmIGFuIGVsZW1lbnQgaXMgYXZhaWxhYmxlLCB1c2UgdGhhdCB0byBjcmVhdGUgc2VhcmNoIHBhdHRlcm4KLSAgICAgICAgICAgIC8vIChlZy4gTG9jYWxWYXJpYWJsZSkKLSAgICAgICAgICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIHRleHQgYW5kIG90aGVyIHBhcmFtdGVycwotICAgICAgICAgICAgaWYgKHRoaXMuZkVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWphdmFTZWFyY2hQYXR0ZXJuID0gU2VhcmNoUGF0dGVybi5jcmVhdGVQYXR0ZXJuKHRoaXMuZkVsZW1lbnQsIHRoaXMuZkxpbWl0VG8pOwotCQkJfSBlbHNlIHsKLQkJCQlqYXZhU2VhcmNoUGF0dGVybiA9IFNlYXJjaFBhdHRlcm4uY3JlYXRlUGF0dGVybih0aGlzLmZTZWFyY2hUZXh0LCB0aGlzLmZTZWFyY2hGb3IsIHRoaXMuZkxpbWl0VG8sIHRoaXMuZk1hdGNoTW9kZSk7Ci0JCQl9Ci0KLSAgICAgICAgICAgIGlmIChqYXZhU2VhcmNoUGF0dGVybiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSnNTZWFyY2hQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cyA9IHsgZ2V0U2VhcmNoUGFydGljaXBhbnQoKSB9OwotICAgICAgICAgICAgICAgIFNlYXJjaEVuZ2luZSBlbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGpvYk1vbml0b3IgIT0gbnVsbCkgewotCQkJCQkJam9iTW9uaXRvci5iZWdpblRhc2soIiIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotICAgICAgICAgICAgICAgICAgICBlbmdpbmUuc2VhcmNoKGphdmFTZWFyY2hQYXR0ZXJuLCBwYXJ0aWNpcGFudHMsIHRoaXMuZlNjb3BlLCB0aGlzLmZSZXF1ZXN0b3IsIGpvYk1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gbm9uLUNvcmVFeGNlcHRpb25zIHdpbGwgcGVybWFuZW50bHkgc3RhbGwgdGhlIFdvcmtlciB0aHJlYWQKLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGpvYk1vbml0b3IgIT0gbnVsbCkgewotCQkJCQkJam9iTW9uaXRvci5kb25lKCk7Ci0JCQkJCX0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGVuZCBTZWFyY2hKb2IKLSAgICAvKioKLSAgICAgKiBSdW5uYWJsZSBmb3JjZXMgY2FsbGVyIHRvIHdhaXQgdW50aWwgZmluaXNoZWQgKGFzIG9wcG9zZWQgdG8gdXNpbmcgYSBKb2IpCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBTZWFyY2hSdW5uYWJsZSBpbXBsZW1lbnRzIElXb3Jrc3BhY2VSdW5uYWJsZSwgSUphdmFTY3JpcHRTZWFyY2hDb25zdGFudHMgewotCi0gICAgICAgIFN0cmluZyBmU2VhcmNoVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgSUphdmFTY3JpcHRTZWFyY2hTY29wZSBmU2NvcGUgPSBudWxsOwotCi0gICAgICAgIGludCBmU2VhcmNoRm9yID0gRklFTEQ7Ci0KLSAgICAgICAgaW50IGZMaW1pdFRvID0gQUxMX09DQ1VSUkVOQ0VTOwotCi0gICAgICAgIGludCBmTWF0Y2hNb2RlID0gU2VhcmNoUGF0dGVybi5SX1BBVFRFUk5fTUFUQ0g7Ci0KLSAgICAgICAgLy9ib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmUgPSBmYWxzZTsKLQotICAgICAgICBTZWFyY2hSZXF1ZXN0b3IgZlJlcXVlc3RvciA9IG51bGw7Ci0KLSAgICAgICAgSUphdmFTY3JpcHRFbGVtZW50IGZFbGVtZW50ID0gbnVsbDsKLQotICAgICAgICAvLyBjb25zdHJ1Y3RvciB3LyBqYXZhIGVsZW1lbnQKLSAgICAgICAgcHVibGljIFNlYXJjaFJ1bm5hYmxlKElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50LCBJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgICAgIHRoaXMuZkVsZW1lbnQgPSBlbGVtZW50OwotICAgICAgICAgICAgdGhpcy5mU2NvcGUgPSBzY29wZTsKLSAgICAgICAgICAgIHRoaXMuZlJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yIHcvIHNlYXJjaCB0ZXh0Ci0vLyAgICAgICAgcHVibGljIFNlYXJjaFJ1bm5hYmxlKFN0cmluZyBzZWFyY2hUZXh0LCBJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIHNjb3BlLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLS8vCi0vLyAgICAgICAgICAgIHRoaXMuZlNlYXJjaFRleHQgPSBzZWFyY2hUZXh0OwotLy8gICAgICAgICAgICB0aGlzLmZTY29wZSA9IHNjb3BlOwotLy8gICAgICAgICAgICB0aGlzLmZTZWFyY2hGb3IgPSBzZWFyY2hGb3I7Ci0vLyAgICAgICAgICAgIHRoaXMuZkxpbWl0VG8gPSBsaW1pdFRvOwotLy8gICAgICAgICAgICB0aGlzLmZNYXRjaE1vZGUgPSBtYXRjaE1vZGU7Ci0vLyAgICAgICAgICAgIHRoaXMuZklzQ2FzZVNlbnNpdGl2ZSA9IGlzQ2FzZVNlbnNpdGl2ZTsKLS8vICAgICAgICAgICAgdGhpcy5mUmVxdWVzdG9yID0gcmVxdWVzdG9yOwotLy8gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmICgobW9uaXRvciAhPSBudWxsKSAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLSAgICAgICAgICAgIGlmIChKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLSAgICAgICAgICAgIFNlYXJjaFBhdHRlcm4gamF2YVNlYXJjaFBhdHRlcm4gPSBudWxsOwotICAgICAgICAgICAgLy8gaWYgYW4gZWxlbWVudCBpcyBhdmFpbGFibGUsIHVzZSB0aGF0IHRvIGNyZWF0ZSBzZWFyY2ggcGF0dGVybgotICAgICAgICAgICAgLy8gKGVnLiBMb2NhbFZhcmlhYmxlKQotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgdGV4dCBhbmQgb3RoZXIgcGFyYW10ZXJzCi0gICAgICAgICAgICBpZiAodGhpcy5mRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4odGhpcy5mRWxlbWVudCwgZkxpbWl0VG8pOwotCQkJfSBlbHNlIHsKLQkJCQlqYXZhU2VhcmNoUGF0dGVybiA9IFNlYXJjaFBhdHRlcm4uY3JlYXRlUGF0dGVybihmU2VhcmNoVGV4dCwgZlNlYXJjaEZvciwgZkxpbWl0VG8sIGZNYXRjaE1vZGUpOwotCQkJfQotCi0gICAgICAgICAgICBpZiAoamF2YVNlYXJjaFBhdHRlcm4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEpzU2VhcmNoUGFydGljaXBhbnRbXSBwYXJ0aWNpcGFudHMgPSB7IGdldFNlYXJjaFBhcnRpY2lwYW50KCkgfTsKLSAgICAgICAgICAgICAgICBTZWFyY2hFbmdpbmUgZW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAwKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgIGVuZ2luZS5zZWFyY2goamF2YVNlYXJjaFBhdHRlcm4sIHBhcnRpY2lwYW50cywgZlNjb3BlLCBmUmVxdWVzdG9yLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBub24tQ29yZUV4Y2VwdGlvbnMgd2lsbCBwZXJtYW5lbnRseSBzdGFsbCB0aGUgV29ya2VyIHRocmVhZAotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gZW5kIFNlYXJjaFJ1bm5hYmxlCi0KLSAgICAvKioKLSAgICAgKiBDbGllbnRzIHNob3VsZCBhY2Nlc3MgdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyB2aWEgdGhlIHNpbmdsZSBpbnN0YW5jZQotICAgICAqIHZpYSBnZXRJbnN0YW5jZSgpCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEpzU2VhcmNoU3VwcG9ydCBnZXRJbnN0YW5jZSgpIHsKLQotICAgICAgICBpZiAoc2luZ2xldG9uID09IG51bGwpIHsKLQkJCXNpbmdsZXRvbiA9IG5ldyBKc1NlYXJjaFN1cHBvcnQoKTsKLQkJfQotICAgICAgICByZXR1cm4gc2luZ2xldG9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGNoZWNrIGlmIGEgZmlsZSBpcyBhIGpzcCBmaWxlIChzaW5jZSB0aGlzIGlzIGRvbmUKLSAgICAgKiBmcmVxdWVudGx5KQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pzcChJRmlsZSBmaWxlKSB7Ci0gICAgCXJldHVybiBVdGlsLmlzSnNUeXBlKGZpbGUuZ2V0TmFtZSgpKTsKLSAgICAJLy8gKHBhKSAyMDA1MTAyNSByZW1vdmluZyBkZWVwIGNvbnRlbnQgdHlwZSBjaGVjawotICAgIAkvLyBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcmVxdWVudGx5Ci0gICAgCS8vIGFuZCBJTyBpcyBleHBlbnNpdmUKLS8vICAgICAgICBib29sZWFuIGlzSnNwID0gZmFsc2U7Ci0vLwotLy8gICAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotLy8gICAgICAgIAkKLS8vICAgICAgICAgICAgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlSlNQID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0vLyAgICAgICAgICAgIC8vIGNoZWNrIHRoaXMgYmVmb3JlIGRlc2NyaXB0aW9uLCBpdCdzIGxlc3MgZXhwZW5zaXZlCi0vLyAgICAgICAgICAgIGlmIChjb250ZW50VHlwZUpTUC5pc0Fzc29jaWF0ZWRXaXRoKGZpbGUuZ2V0TmFtZSgpKSkgewotLy8gICAgICAgICAgICAJaXNKc3AgPSB0cnVlOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8KLS8vICAgICAgICByZXR1cm4gaXNKc3A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2NoZWR1bGVzIGEgc2VhcmNoIGRvY3VtZW50IHJlcHJlc2VudGluZyB0aGlzIEpTUCBmaWxlIGZvciBpbmRleGluZyAoYnkKLSAgICAgKiB0aGUgamF2YSBpbmRleGVyKQotICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICB0aGUgSlNQIGZpbGUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgaW5kZXhpbmcgd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTZWFyY2hEb2N1bWVudCBhZGRKc3BGaWxlKElGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYgKEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSB8fCAhZmlsZS5pc0FjY2Vzc2libGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkaW5nIEpTUCBmaWxlOiIgKyBmaWxlLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotICAgICAgICAvLyBjcmVhdGUKLSAgICAgICAgU2VhcmNoRG9jdW1lbnQgZGVsZWdhdGUgPSBjcmVhdGVTZWFyY2hEb2N1bWVudChmaWxlKTsKLSAgICAgICAgLy8gbnVsbCBpZiBub3QgYSBqc3AgZmlsZQotICAgICAgICBpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBnZXRTZWFyY2hQYXJ0aWNpcGFudCgpLnNjaGVkdWxlRG9jdW1lbnRJbmRleGluZyhkZWxlZ2F0ZSwgY29tcHV0ZUluZGV4TG9jYXRpb24oZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGZhaWx1cmUgaGVyZSBkb2Vzbid0IGtlZXAgb3RoZXIgZG9jdW1lbnRzIGZyb20KLSAgICAgICAgICAgICAgICAvLyBiZWluZyBpbmRleGVkCi0gICAgICAgICAgICAgICAgLy8gaWYgcGVmb3JtZWQgaW4gYSBiYXRjaCBjYWxsIChsaWtlIEpTUEluZGV4TWFuYWdlcikKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2NoZWR1bGVkIiArIGRlbGVnYXRlICsgImZvciBpbmRleGluZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSBhIGphdmEgc2VhcmNoIHcvIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBSdW5zIGluIGEgYmFja2dyb3VuZCBKb2IKLSAgICAgKiAocmVzdWx0cyBtYXkgc3RpbGwgY29tZSBpbiBhZnRlciB0aGlzIG1ldGhvZCBjYWxsKQotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWFyY2hUZXh0Ci0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIG9mIHRleHQgdG8gc2VhcmNoIG9uCi0gICAgICogQHBhcmFtIHNlYXJjaEZvcgotICAgICAqICAgICAgICAgICAgSUphdmFTY3JpcHRTZWFyY2hDb25zdGFudHMuVFlQRSwgTUVUSE9ELCBGSUVMRCwgUEFDS0FHRSwgZXRjLi4uCi0gICAgICogQHBhcmFtIGxpbWl0VG8KLSAgICAgKiAgICAgICAgICAgIElKYXZhU2NyaXB0U2VhcmNoQ29uc3RhbnRzLkRFQ0xBUkFUSU9OUywKLSAgICAgKiAgICAgICAgICAgIElKYXZhU2NyaXB0U2VhcmNoQ29uc3RhbnRzLlJFRkVSRU5DRVMsCi0gICAgICogICAgICAgICAgICBJSmF2YVNjcmlwdFNlYXJjaENvbnN0YW50cy5JTVBMRU1FTlRPUlMsIG9yCi0gICAgICogICAgICAgICAgICBJSmF2YVNjcmlwdFNlYXJjaENvbnN0YW50cy5BTExfT0NDVVJSRU5DRVMKLSAgICAgKiBAcGFyYW0gbWF0Y2hNb2RlCi0gICAgICogICAgICAgICAgICBhbGxvdyAqIHdpbGRjYXJkcyBvciBub3QKLSAgICAgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlCi0gICAgICogQHBhcmFtIHJlcXVlc3RvcgotICAgICAqICAgICAgICAgICAgcGFzc2VkIGluIHRvIGFjY2VwdCBzZWFyY2ggbWF0Y2hlcyAoYW5kIGRvICJzb21ldGhpbmciIHdpdGgKLSAgICAgKiAgICAgICAgICAgIHRoZW0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VhcmNoKFN0cmluZyBzZWFyY2hUZXh0LCBJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIHNjb3BlLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICBKc0luZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlYnVpbGRJbmRleElmTmVlZGVkKCk7Ci0KLSAgICAgICAgU2VhcmNoSm9iIGpvYiA9IG5ldyBTZWFyY2hKb2Ioc2VhcmNoVGV4dCwgc2NvcGUsIHNlYXJjaEZvciwgbGltaXRUbywgbWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUsIHJlcXVlc3Rvcik7Ci0gICAgICAgIHNldENhbmNlbGVkKGZhbHNlKTsKLSAgICAgICAgam9iLnNldFVzZXIodHJ1ZSk7Ci0gICAgICAgIC8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MDMyCi0gICAgICAgIC8vIHBvcHMgdXAgdXNlciBvcGVyYXRpb24gYmxvY2tlZCBkaWFsb2cgaWYgeW91IHBlcmZvcm0gYSBsb25nIHNlYXJjaCwKLSAgICAgICAgLy8gdGhlbiBvcGVuIGEgZmlsZSBiZWNhdXNlIGl0IGxvY2tzIHRoZSB3b3Jrc3BhY2UKLSAgICAgICAgLy9qb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLSAgICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoIGZvciBhbiBJSmF2YVNjcmlwdEVsZW1lbnQsIGNvbnN0cmFpbmVkIGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBSdW5zIGluCi0gICAgICogYSBiYWNrZ3JvdW5kIEpvYiAocmVzdWx0cyBtYXkgc3RpbGwgY29tZSBpbiBhZnRlciB0aGlzIG1ldGhvZCBjYWxsKQotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICogQHBhcmFtIHNjb3BlCi0gICAgICogQHBhcmFtIHJlcXVlc3RvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlYXJjaChJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCwgSUphdmFTY3JpcHRTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgIEpzSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVidWlsZEluZGV4SWZOZWVkZWQoKTsKLQotICAgICAgICBTZWFyY2hKb2Igam9iID0gbmV3IFNlYXJjaEpvYihlbGVtZW50LCBzY29wZSwgcmVxdWVzdG9yKTsKLSAgICAgICAgc2V0Q2FuY2VsZWQoZmFsc2UpOwotICAgICAgICBqb2Iuc2V0VXNlcih0cnVlKTsKLSAgICAgICAgLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwMzIKLSAgICAgICAgLy9qb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLSAgICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoIGZvciBhbiBJSmF2YVNjcmlwdEVsZW1lbnQsIGNvbnN0cmFpbmVkIGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBSdW5zIGluCi0gICAgICogYW4gSVdvcmtzcGFjZSBydW5uYWJsZSAocmVzdWx0cyB3aWxsIGJlIHJlcG9ydGVkIGJ5IHRoZSBlbmQgb2YgdGhpcwotICAgICAqIG1ldGhvZCkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqIEBwYXJhbSBzY29wZQotICAgICAqIEBwYXJhbSByZXF1ZXN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWFyY2hSdW5uYWJsZShJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCwgSUphdmFTY3JpcHRTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgIEpzSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVidWlsZEluZGV4SWZOZWVkZWQoKTsKLQotICAgICAgICBTZWFyY2hSdW5uYWJsZSBzZWFyY2hSdW5uYWJsZSA9IG5ldyBTZWFyY2hSdW5uYWJsZShlbGVtZW50LCBzY29wZSwgcmVxdWVzdG9yKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldENhbmNlbGVkKGZhbHNlKTsKLSAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4oc2VhcmNoUnVubmFibGUsIEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGpzcEZpbGUKLSAgICAgKiBAcmV0dXJuIFNlYXJjaERvY3VtZW50IGlmIHRoZSBmaWxlIGlzIG5vdCBudWxsLCBleGlzdHMsIGFuZCBpcyBhIEpTUAotICAgICAqICAgICAgICAgZmlsZSwgb3RoZXJ3aXNlIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTZWFyY2hEb2N1bWVudCBjcmVhdGVTZWFyY2hEb2N1bWVudChJRmlsZSBqc3BGaWxlKSB7Ci0KLSAgICAgICAgSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUgZGVsZWdhdGUgPSBudWxsOwotICAgICAgICBpZiAoKGpzcEZpbGUgIT0gbnVsbCkgJiYganNwRmlsZS5leGlzdHMoKSAmJiBpc0pzcChqc3BGaWxlKSkgewotCi0gICAgICAgICAgICBkZWxlZ2F0ZSA9IG5ldyBKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZShuZXcgSnNTZWFyY2hEb2N1bWVudChqc3BGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgZ2V0U2VhcmNoUGFydGljaXBhbnQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENlbnRyYWxpemVkIHBsYWNlIHRvIGFjY2VzcyBKU1BTZWFyY2hEb2N1bWVudHMgKHVzZWQgYnkKLSAgICAgKiBKU1BTZWFyY2hQYXJ0aWNpcGFudCBhbmQgSlNQU2VhcmNoUmVxdWVzdG9yKQotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWFyY2hEb2NQYXRoCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEByZXR1cm4gdGhlIEpTUFNlYXJjaERvY3VtZW50IG9yIG51bGwgaWYgb25lIGlzIG5vdCBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBTZWFyY2hEb2N1bWVudCBnZXRTZWFyY2hEb2N1bWVudChTdHJpbmcgc2VhcmNoRG9jUGF0aCkgewotICAgICAgICAgCi0gICAgICAgIFNlYXJjaERvY3VtZW50IGRlbGVnYXRlID0gbnVsbDsKLSAgICAgICAgSUZpbGUgZiA9IGZpbGVGb3JDVVBhdGgoc2VhcmNoRG9jUGF0aCk7Ci0gICAgICAgIGlmIChmICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRlbGVnYXRlID0gY3JlYXRlU2VhcmNoRG9jdW1lbnQoZik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBoYW5kbGUgZmFpbHVyZSBjYXNlLi4uIChmaWxlIGRlbGV0ZWQgbWF5YmU/KQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbm1hbmdsZXMgdGhlIHNlYXJjaERvY1BhdGggYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgSlNQIGZpbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlYXJjaERvY1BhdGgKLSAgICAgKi8KLSAgICBwcml2YXRlIElGaWxlIGZpbGVGb3JDVVBhdGgoU3RyaW5nIHNlYXJjaERvY1BhdGgpIHsKLSAgICAKLSAgICAgICAgU3RyaW5nW10gc3BsaXQgPSBzZWFyY2hEb2NQYXRoLnNwbGl0KCIvIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IHNwbGl0W3NwbGl0Lmxlbmd0aCAtIDFdOwotCi0gICAgICAgIC8vIGlnbm9yZSBhbnl0aGluZyBidXQgLmphdmEgbWF0Y2hlcyAobGlrZSAuY2xhc3MgYmluYXJ5IG1hdGNoZXMpCi0gICAgICAgIGlmKCFzZWFyY2hEb2NQYXRoLmVuZHNXaXRoKCIuanMiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IEpzTmFtZU1hbmdsZXJVdGlsLnVubWFuZ2xlKGNsYXNzbmFtZSk7Ci0gICAgICAgCi0gICAgICAgIC8vIHRyeSBhYnNvbHV0ZSBwYXRoCi0gICAgICAgIElGaWxlIGYgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlUGF0aCkpOwotICAgICAgICAvLyB3b3Jrc3BhY2UgcmVsYXRpdmUgdGhlbgotICAgICAgICBpZihmID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjAwOQotICAgICAgICAgICAgLy8gbXVzdCBoYXZlIGEgcHJvamVjdCBuYW1lIGFzIHdlbGwKLSAgICAgICAgICAgIC8vIHdoaWNoIHdvdWxkIG1lYW4gPj0gMiBwYXRoIHNlZ21lbnRzCi0gICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZVBhdGgpOwotICAgICAgICAgICAgaWYocGF0aC5zZWdtZW50Q291bnQoKSA+PSAyKSB7Ci0gICAgICAgICAgICAgICAgZiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZjsKLSAgICB9Ci0KLSAgICBKc1NlYXJjaFBhcnRpY2lwYW50IGdldFNlYXJjaFBhcnRpY2lwYW50KCkgewotCi0gICAgICAgIGlmICh0aGlzLmZQYXJ0aWNpcGFudCA9PSBudWxsKSB7Ci0JCQl0aGlzLmZQYXJ0aWNpcGFudCA9IG5ldyBKc1NlYXJjaFBhcnRpY2lwYW50KCk7Ci0JCX0KLSAgICAgICAgcmV0dXJuIHRoaXMuZlBhcnRpY2lwYW50OwotICAgIH0KLQotICAgIC8vIFRoaXMgaXMgY2FsbGVkIGZyb20gSlNQUGF0aEluZGV4ZXIKLSAgICAvLyBwYV9UT0RPCi0gICAgLy9ob3cgY2FuIHdlIG1ha2Ugc3VyZSBwYXJ0aWNpcGFudCBpbmRleExvY2F0aW9ucyBhcmUgdXBkYXRlZCBhdCBzdGFydHVwPwotICAgIHB1YmxpYyBmaW5hbCBJUGF0aCBjb21wdXRlSW5kZXhMb2NhdGlvbihJUGF0aCBjb250YWluZXJQYXRoKSB7Ci0KLSAgICAgICAgSVBhdGggaW5kZXhMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gaW5hZHZlcnRlbnRseSB1c2UgYSBKRFQgSW5kZXgKLSAgICAgICAgLy8gd2Ugd2FudCB0byBiZSBzdXJlIHRvIHVzZSB0aGUgSW5kZXggZnJvbSB0aGUgSlNQIGxvY2F0aW9uCi0gICAgICAgIC8vT2JqZWN0IG9iaiA9IGluZGV4TG9jYXRpb25zLmdldChjb250YWluZXJQYXRoKTsKLSAgICAgICAgLy9pZiAob2JqICE9IG51bGwpIHsKLSAgICAgICAgLy8gICAgaW5kZXhMb2NhdGlvbiA9IChTdHJpbmcpIG9iajsKLSAgICAgICAgLy99IGVsc2UgewotICAgICAgICAgICAgLy8gY3JlYXRlIGluZGV4IGVudHJ5Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aFN0cmluZyA9IGNvbnRhaW5lclBhdGgudG9PU1N0cmluZygpOwotICAgICAgICAgICAgdGhpcy5mQ2hlY2tzdW1DYWxjdWxhdG9yLnJlc2V0KCk7Ci0gICAgICAgICAgICB0aGlzLmZDaGVja3N1bUNhbGN1bGF0b3IudXBkYXRlKHBhdGhTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBMb25nLnRvU3RyaW5nKHRoaXMuZkNoZWNrc3VtQ2FsY3VsYXRvci5nZXRWYWx1ZSgpKSArICIuaW5kZXgiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBvbmx5IGRpZmZlcmVuY2UgZnJvbQotICAgICAgICAgICAgLy8gSW5kZXhNYW5hZ2VyI2NvbXB1dGVJbmRleExvY2F0aW9uKC4uLikKLSAgICAgICAgICAgIGluZGV4TG9jYXRpb24gPSBnZXRNb2RlbEpzcFBsdWdpbldvcmtpbmdMb2NhdGlvbigpLmFwcGVuZChmaWxlTmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIHBhX1RPRE8gbmVlZCB0byBhZGQgdG8gamF2YSBwYXRoIHRvbywgc28gSkRUIHNlYXJjaCBzdXBwb3J0IGtub3dzCi0gICAgICAgICAgICAvLyB0aGVyZSBzaG91bGQgYmUgYSBub24gaW50ZXJuYWwgd2F5IHRvIGRvIHRoaXMuCi0gICAgICAgICAgICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NjQKLSAgICAgICAgICAgIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEluZGV4TWFuYWdlcigpLmluZGV4TG9jYXRpb25zLnB1dChjb250YWluZXJQYXRoLCBpbmRleExvY2F0aW9uKTsKLSAgICAgICAgLy99Ci0gICAgICAgIHJldHVybiBpbmRleExvY2F0aW9uOwotICAgIH0KLQlwdWJsaWMgSVBhdGggZ2V0TW9kZWxKc3BQbHVnaW5Xb3JraW5nTG9jYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk51bGwgcHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSVBhdGggd29ya2luZ0xvY2F0aW9uRmlsZSA9IHByb2plY3QuZ2V0V29ya2luZ0xvY2F0aW9uKEpzQ29yZVBsdWdpbi5QTFVHSU5fSUQpLmFwcGVuZCgianNzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBlbnN1cmUgdGhhdCBpdCBleGlzdHMgb24gZGlzawotCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKHdvcmtpbmdMb2NhdGlvbkZpbGUudG9PU1N0cmluZygpKTsKLQkJaWYgKCFmb2xkZXIuaXNEaXJlY3RvcnkoKSkgewotCQkJdHJ5IHsKLQkJCQlmb2xkZXIubWtkaXIoKTsKLQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gd29ya2luZ0xvY2F0aW9uRmlsZTsKLQl9Ci0gICAgLy8gY29waWVkIGZyb20gSkRUIEluZGV4TWFuYWdlcgotICAgIHB1YmxpYyBJUGF0aCBnZXRNb2RlbEpzcFBsdWdpbldvcmtpbmdMb2NhdGlvbigpIHsKLQotICAgICAgICBpZiAodGhpcy5mSnNQbHVnaW5Mb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5mSnNQbHVnaW5Mb2NhdGlvbjsKLQkJfQotCi0gICAgICAgIC8vIEFwcGVuZCB0aGUgZm9sZGVyIG5hbWUgImpzc2VhcmNoIiB0byBrZWVwIHRoZSBzdGF0ZSBsb2NhdGlvbiBhcmVhIGNsZWFuZXIKLSAgICAgICAgSVBhdGggc3RhdGVMb2NhdGlvbiA9IEpzQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkuYXBwZW5kKCJqc3NlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgLy8gcGFfVE9ETyB3b3JrYXJvdW5kIGZvcgotICAgICAgICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjIyNjcKLSAgICAgICAgLy8gY29waWVkIGZyb20gSW5kZXhNYW5hZ2VyCi0gICAgICAgIFN0cmluZyBkZXZpY2UgPSBzdGF0ZUxvY2F0aW9uLmdldERldmljZSgpOwotICAgICAgICBpZiAoKGRldmljZSAhPSBudWxsKSAmJiAoZGV2aWNlLmNoYXJBdCgwKSA9PSAnLycpKSB7Ci0JCQlzdGF0ZUxvY2F0aW9uID0gc3RhdGVMb2NhdGlvbi5zZXREZXZpY2UoZGV2aWNlLnN1YnN0cmluZygxKSk7Ci0JCX0KLQotICAgICAgICAvLyBlbnN1cmUgdGhhdCBpdCBleGlzdHMgb24gZGlzawotICAgICAgICBGaWxlIGZvbGRlciA9IG5ldyBGaWxlKHN0YXRlTG9jYXRpb24udG9PU1N0cmluZygpKTsKLQkJaWYgKCFmb2xkZXIuaXNEaXJlY3RvcnkoKSkgewotCQkJdHJ5IHsKLQkJCQlmb2xkZXIubWtkaXIoKTsKLQkJCX0KLQkJCWNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotICAgICAgICByZXR1cm4gdGhpcy5mSnNQbHVnaW5Mb2NhdGlvbiA9IHN0YXRlTG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSlNQIEluZGV4aW5nIGFuZCBTZWFyY2ggam9icyBjaGVjayB0aGlzCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgZmluYWwgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIGNhbmNlbCkgewotICAgIAkvL1N5c3RlbS5vdXQucHJpbnRsbigic2VhcmNoIHN1cHBvcnQgbW9uaXRvciIgKyBmTW9uaXRvcik7Ci0gICAgICAgIGZNb25pdG9yLnNldENhbmNlbGVkKGNhbmNlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSlNQIEluZGV4aW5nIGFuZCBTZWFyY2ggam9icyBjaGVjayB0aGlzCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgZmluYWwgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCi0gICAgICAgIHJldHVybiBmTW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSlNQIEluZGV4aW5nIGFuZCBTZWFyY2ggam9icyBjaGVjayB0aGlzCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQotICAgICAgICByZXR1cm4gdGhpcy5mTW9uaXRvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9OdWxsU2VhcmNoRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL051bGxTZWFyY2hEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjFjZTc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL051bGxTZWFyY2hEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotCi0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEFuIGVtcHR5IHNlcnZsZXQsIHNhZmUgZm9yIEphdmEgc2VhcmNoIHBhcnRpY2lwYXRpb24KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIE51bGxTZWFyY2hEb2N1bWVudCBleHRlbmRzIFNlYXJjaERvY3VtZW50IHsKLQkKLQlTdHJpbmdCdWZmZXIgZkVtcHR5U2VydmxldEJ1ZmZlciA9IG51bGw7Ci0JCi0JcHVibGljIE51bGxTZWFyY2hEb2N1bWVudChTdHJpbmcgZG9jdW1lbnRQYXRoKSB7Ci0JCXN1cGVyKGRvY3VtZW50UGF0aCwgbmV3IEpzU2VhcmNoUGFydGljaXBhbnQoKSk7IAotCQl0aGlzLmZFbXB0eVNlcnZsZXRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JfQotCQotCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZUNvbnRlbnRzKCkgewotCQlyZXR1cm4gdGhpcy5mRW1wdHlTZXJ2bGV0QnVmZmVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKTsKLQl9Ci0JCi0JcHVibGljIGNoYXJbXSBnZXRDaGFyQ29udGVudHMoKSB7Ci0JCXJldHVybiB0aGlzLmZFbXB0eVNlcnZsZXRCdWZmZXIudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL3RleHQvSUpzUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvdGV4dC9JSnNQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YWIxNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvdGV4dC9JSnNQYXJ0aXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGludGVyZmFjZSBJSnNQYXJ0aXRpb25zIHsKLQlTdHJpbmcgSHRtbEpzUGFydGl0aW9uID0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVDsKLQkvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3MzkzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2U4YmE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLUBkb3QKLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwotb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwXzEuMC4wLjIwMDgwNjAzMTMwNC5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZTA3OTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNTM3MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1NhdCBNYXIgMjQgMTE6MjM6NTQgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNNb24gQXByIDE3IDAyOjAxOjMzIEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFkOGE1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3A7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjQwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC5BY3RpdmF0b3IKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjUwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2U7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjUwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNDAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjMwMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS40MDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjUwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwMCwyLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40Ci1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzNiMGYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxODllY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotI1Byb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwDQotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0NCi1CdW5kbGUtTmFtZS4wID0gSlNEVCBzdXBwb3J0IGZvciBKU1AgUGx1Zy1pbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTBmMWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTxzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLkpTRFRTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2Uuc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJjb250ZW50YXNzaXN0cHJvY2Vzc29yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkpTRFRDb250ZW50QXNzaXN0YW50IgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLlNDUklQVC5KQVZBU0NSSVBUIiAvPgotCQk8ZG9jdW1lbnRhdGlvblRleHRIb3ZlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50YWdpbmZvLkpTRFRIb3ZlclByb2Nlc3NvciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5TQ1JJUFQuSkFWQVNDUklQVCIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5Kc0ZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5TQ1JJUFQsb3JnLmVjbGlwc2UuanN0LmpzcC5TQ1JJUFQuRVZFTlRIQU5ETEVSIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJzbGF2ZWZvcm1hdHRpbmdzdHJhdGVneSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuZm9ybWF0LkZvcm1hdHRpbmdTdHJhdGVneUpTRFQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuU0NSSVBULkpBVkFTQ1JJUFQiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5Kc1ZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AuanNzb3VyY2V2YWxpZGF0b3IiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllciBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCI+PC9wYXJ0aXRpb25UeXBlPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlQiPjwvcGFydGl0aW9uVHlwZT4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2hhcmFjdGVyUGFpcmluZyI+Ci0JCTxpbnNlcnRlciBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnRleHQuSnNDaGFyYWN0ZXJQYWlySW5zZXJ0ZXIiIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuanNwLnVpLmluc2VydGVyIj4KLQkJICA8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiCi0JCSAgICAgICAgcGFydGl0aW9ucz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBULCBvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlRIQU5ETEVSIj4KLQkJICA8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC9pbnNlcnRlcj4KLQk8L2V4dGVuc2lvbj4KLSAgIDwhLS0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyI+Ci0JCTxldmVudC1oYW5kbGVyIGZhY2V0PSJqc3Qud2ViIiB0eXBlPSJQT1NUX0lOU1RBTEwiICB2ZXJzaW9uPSJbMi4wIj4KLQkgICAJCTxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5Kc05hdHVyZUluc3RhbGxlciIvPgotCQk8L2V2ZW50LWhhbmRsZXI+Ci0JCi0JCTxldmVudC1oYW5kbGVyIGZhY2V0PSJqc3Qud2ViIiB0eXBlPSJQT1NUX1VOSU5TVEFMTCIgdmVyc2lvbj0iWzIuMCI+Ci0JCQk8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3QuSnNOYXR1cmVVbmluc3RhbGxlciIvPgotCQk8L2V2ZW50LWhhbmRsZXI+Ci0JPC9leHRlbnNpb24+LS0+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvc3VwcG9ydC9qc3AvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3N1cHBvcnQvanNwL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDE3OWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvc3VwcG9ydC9qc3AvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICoqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi0KLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2YXRvcigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5zI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3N1cHBvcnQvanNwL0pTRFRTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvc3VwcG9ydC9qc3AvSlNEVFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDRkM2M0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvc3VwcG9ydC9qc3AvSlNEVFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLnRleHQuSUpzUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNEVDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuY29udGVudGFzc2lzdC5KU0RUU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmF1dG9lZGl0LkF1dG9FZGl0U3RyYXRlZ3lGb3JKczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUHsKLQotCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGZIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLQotCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGdldEpTRFRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJaWYgKGZIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlmSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNEVCgpOwotCQl9Ci0JCXJldHVybiBmSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRJbmRlbnRQcmVmaXhlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCVN0cmluZ1tdIGluZGVudGF0aW9ucyA9IG51bGw7Ci0JCWlmIChJSFRNTFBhcnRpdGlvbnMuU0NSSVBULmVxdWFscyhjb250ZW50VHlwZSkgfHwgSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVC5lcXVhbHMoY29udGVudFR5cGUpIHx8IElIVE1MUGFydGl0aW9ucy5TQ1JJUFRfRVZFTlRIQU5ETEVSLmVxdWFscyhjb250ZW50VHlwZSkpCi0JCQlpbmRlbnRhdGlvbnMgPSBnZXRKU0RUSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRJbmRlbnRQcmVmaXhlcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJZWxzZQotCQkJaW5kZW50YXRpb25zID0gc3VwZXIuZ2V0SW5kZW50UHJlZml4ZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCXJldHVybiBpbmRlbnRhdGlvbnM7Ci0JfQotCQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJTGluZVN0eWxlUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBudWxsOwotCQlpZiAoSUhUTUxQYXJ0aXRpb25zLlNDUklQVC5lcXVhbHMocGFydGl0aW9uVHlwZSkgfHwgSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVC5lcXVhbHMocGFydGl0aW9uVHlwZSkgfHwgSUhUTUxQYXJ0aXRpb25zLlNDUklQVF9FVkVOVEhBTkRMRVIuZXF1YWxzKHBhcnRpdGlvblR5cGUpKSB7Ci0JCQlwcm92aWRlcnMgPSBnZXRKU0RUSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKTsKLQkJfQotCQllbHNlewotCQkJcHJvdmlkZXJzID0gc3VwZXIuZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvdmlkZXJzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQI2dldEF1dG9FZGl0U3RyYXRlZ2llcyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQXV0b0VkaXRTdHJhdGVneVtdIGdldEF1dG9FZGl0U3RyYXRlZ2llcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCWlmKGNvbnRlbnRUeXBlLmVxdWFscyhJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKSB8fCBjb250ZW50VHlwZS5lcXVhbHMoSUhUTUxQYXJ0aXRpb25zLlNDUklQVF9FVkVOVEhBTkRMRVIpKSB7Ci0JCQlJQXV0b0VkaXRTdHJhdGVneVtdIHN0cmF0ZWdpZXMgPSBuZXcgSUF1dG9FZGl0U3RyYXRlZ3lbMV07Ci0JCQlzdHJhdGVnaWVzWzBdID0gbmV3IEF1dG9FZGl0U3RyYXRlZ3lGb3JKcygpOwotCQkJcmV0dXJuIHN0cmF0ZWdpZXM7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AjZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcnMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlciwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycygKLQkJCUlTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBwcm9jZXNzb3JzOwotCQkKLQkJaWYoaXNKYXZhc2NyaXB0UGFydGl0aW9uVHlwZShwYXJ0aXRpb25UeXBlKSkgewotCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEpTRFRTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvcigKLQkJCQkJdGhpcy5nZXRDb250ZW50QXNzaXN0YW50KCksIHBhcnRpdGlvblR5cGUsIHNvdXJjZVZpZXdlcik7Ci0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117cHJvY2Vzc29yfTsKLQkJfSBlbHNlIHsKLQkJCXByb2Nlc3NvcnMgPSBzdXBlci5nZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQl9IAotCQkKLQkJcmV0dXJuIHByb2Nlc3NvcnM7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlSUQgY2hlY2sgdG8gc2VlIGlmIHRoaXMgcGFydGl0aW9uIHR5cGUgSUQgaXMgZm9yIGEgSmF2YXNjcmlwdCBwYXJ0aXRpb24gdHlwZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBhcnRpdG9uIHR5cGUgaXMgYSBKYXZhc2NyaXB0IHBhcnRpdGlvbiB0eXBlLAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSmF2YXNjcmlwdFBhcnRpdGlvblR5cGUoU3RyaW5nIHBhcnRpdGlvblR5cGVJRCkgewotCQlyZXR1cm4gSUpzUGFydGl0aW9ucy5IdG1sSnNQYXJ0aXRpb24uZXF1YWxzKHBhcnRpdGlvblR5cGVJRCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMTY1ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxNzg1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwNzIxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0jV2VkIE9jdCAyNCAxOTo0OTo0NSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTFkMDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jV2VkIE9jdCAyNCAxOTo0MTozMSBFRFQgMjAwNwotY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLWNsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9ZmFsc2UKLWNsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCi1jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCi1jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKLWNsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLWNsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLWNsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCi1jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT1mYWxzZQotY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPXRydWUKLWNsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD1mYWxzZQotY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLWNsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLWNsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLWNsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLWNsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKLWNsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKLWNsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPXRydWUKLWNsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPXRydWUKLWNsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKLWNsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPXRydWUKLWNsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQotY2xlYW51cC51c2VfYmxvY2tzPXRydWUKLWNsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotY2xlYW51cF9wcm9maWxlPV9TU0UgVGVhbSBTdHlsZXMKLWNsZWFudXBfc2V0dGluZ3NfdmVyc2lvbj0yCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS5leGNlcHRpb24ubmFtZT1lCi1vcmcuZWNsaXBzZS5qZHQudWkuZ2V0dGVyc2V0dGVyLnVzZS5pcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkua2V5d29yZHRoaXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC51aS5vdmVycmlkZWFubm90YXRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjJiMGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jRnJpIEZlYiAyNyAxMjo0NTozNSBFU1QgMjAwOQotY29tcGlsZXJzLmYudW5yZXNvbHZlZC1mZWF0dXJlcz0xCi1jb21waWxlcnMuZi51bnJlc29sdmVkLXBsdWdpbnM9MQotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmRpc2NvdXJhZ2VkLWNsYXNzPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLmludGVybmFsPTEKLWNvbXBpbGVycy5wLm1pc3NpbmctcGFja2FnZXM9MgotY29tcGlsZXJzLnAubWlzc2luZy12ZXJzaW9uLWV4cG9ydC1wYWNrYWdlPTIKLWNvbXBpbGVycy5wLm1pc3NpbmctdmVyc2lvbi1pbXBvcnQtcGFja2FnZT0yCi1jb21waWxlcnMucC5taXNzaW5nLXZlcnNpb24tcmVxdWlyZS1idW5kbGU9MgotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24taWRlbnRpZmllcj0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucy5jcmVhdGUtZG9jcz1mYWxzZQotY29tcGlsZXJzLnMuZG9jLWZvbGRlcj1kb2MKLWNvbXBpbGVycy5zLm9wZW4tdGFncz0xCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZjUxMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNDAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5jb250ZW50YXNzaXN0LAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5hdXRvZWRpdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmRlcml2ZWQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuZWRpdG9yO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmZvcm1hdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbms7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaC51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5yZWdpc3RyeTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5zdHlsZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5zdHlsZS5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnRhZ2luZm87eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZQotSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnV0aWw7IHZlcnNpb249IjMuOCIsCi0gY29tLmlibS5pY3UudGV4dDsgdmVyc2lvbj0iMy44IiwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0sCi0gb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjEwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS40MDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjUwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uuc2VhcmNoO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC41MDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjQwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0Lm1hbmlwdWxhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMC4yMDAsMi4wLjApIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40Ci1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2NjdkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvaWNvbnMvZXllX2ljb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvaWNvbnMvZXllX2ljb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzgzOThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL2ljb25zL2V5ZV9pY29uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2phdmFhc3Npc3RfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvaWNvbnMvZnVsbC9lbGNsMTYvamF2YWFzc2lzdF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YTZiZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvaWNvbnMvZnVsbC9lbGNsMTYvamF2YWFzc2lzdF9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWQxOTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotQnVuZGxlLU5hbWUuMCA9IEpTRFQgV2ViIFN1cHBvcnQgVUkKLWh5cGVybGlua0RldGVjdG9yLm5hbWUuMCA9IEphdmFTY3JpcHQgRWxlbWVudAotbWVudS5sYWJlbC4wID0gRGVjbGFyYXRpb25zCi1hY3Rpb24udG9vbHRpcC4wID0gV29ya2luZyBTZXQKLWFjdGlvbi5sYWJlbC4wID0gV29ya2luZyBTZXQKLWFjdGlvbi5sYWJlbC4xID0gSGllcmFyY2h5Ci1hY3Rpb24udG9vbHRpcC4xID0gSGllcmFyY2h5Ci1hY3Rpb24ubGFiZWwuMiA9IFByb2plY3QKLWFjdGlvbi50b29sdGlwLjIgPSBQcm9qZWN0Ci1hY3Rpb24ubGFiZWwuMyA9IFdvcmtzcGFjZQotYWN0aW9uLnRvb2x0aXAuMyA9IERlY2xhcmF0aW9ucwotbWVudS5sYWJlbC4xID0gUmVmZXJlbmNlcwotYWN0aW9uLmxhYmVsLjQgPSBXb3JraW5nIFNldAotYWN0aW9uLnRvb2x0aXAuNCA9IFdvcmtpbmcgU2V0Ci1hY3Rpb24ubGFiZWwuNSA9IEhpZXJhcmNoeQotYWN0aW9uLnRvb2x0aXAuNSA9IEhpZXJhcmNoeQotYWN0aW9uLmxhYmVsLjYgPSBQcm9qZWN0Ci1hY3Rpb24udG9vbHRpcC42ID0gUHJvamVjdAotYWN0aW9uLmxhYmVsLjcgPSBXb3Jrc3BhY2UKLWFjdGlvbi50b29sdGlwLjcgPSAKLW1lbnUubGFiZWwuMiA9IFJlZmFjdG9yCi1tZW51LmxhYmVsLjMgPSBTb3VyY2UKLWFjdGlvbi5sYWJlbC44ID0gR2VuZXJhdGUgRWxlbWVudCBDb21tZW50Ci1hY3Rpb24udG9vbHRpcC44ID0gR2VuZXJhdGUgRWxlbWVudCBDb21tZW50Ci1hY3Rpb24ubGFiZWwuOSA9IENoYW5nZSBGdW5jdGlvbiBTaWduYXR1cmUKLWFjdGlvbi50b29sdGlwLjkgPSBDaGFuZ2UgRnVuY3Rpb24gU2lnbmF0dXJlCi1hY3Rpb24ubGFiZWwuMTAgPSBNb3ZlCi1hY3Rpb24udG9vbHRpcC4xMCA9IE1vdmUKLWFjdGlvbi5sYWJlbC4xMSA9IFJlbmFtZQotYWN0aW9uLnRvb2x0aXAuMTEgPSBSZW5hbWUKLWFjdGlvbi5sYWJlbC4xMiA9IERlbGV0ZQotYWN0aW9uLnRvb2x0aXAuMTIgPSBEZWxldGUKLWFjdGlvbi5sYWJlbC4xMyA9IFBhc3RlIEFmdGVyCi1hY3Rpb24udG9vbHRpcC4xMyA9IFBhc3RlCi1hY3Rpb24ubGFiZWwuMTQgPSBQYXN0ZSBCZWZvcmUKLWFjdGlvbi50b29sdGlwLjE0ID0gUGFzdGUKLWFjdGlvbi5sYWJlbC4xNSA9IENvcHkKLWFjdGlvbi50b29sdGlwLjE1ID0gQ29weQotYWN0aW9uLmxhYmVsLjE2ID0gQ3V0Ci1hY3Rpb24udG9vbHRpcC4xNiA9IEN1dAotbWVudS5sYWJlbC40ID0gU2hvdyBJbgotYWN0aW9uLmxhYmVsLjE3ID0gTmF2aWdhdG9yCi1hY3Rpb24udG9vbHRpcC4xNyA9IFNob3cgSW4gTmF2aWdhdG9yCi1hY3Rpb24ubGFiZWwuMTggPSBTY3JpcHQgRXhwbG9yZXIKLWFjdGlvbi50b29sdGlwLjE4ID0gU2hvdyBJbiBTY3JpcHQgRXhwbG9yZXIKLWFjdGlvbi5sYWJlbC4xOSA9IE9wZW4gQ2FsbCBIaWVyYXJjaHkKLWFjdGlvbi50b29sdGlwLjE5ID0gT3BlbiBDYWxsIEhpZXJhcmNoeQotYWN0aW9uLmxhYmVsLjIwID0gT3BlbiBUeXBlIEhpZXJhcmNoeQotYWN0aW9uLnRvb2x0aXAuMjAgPSBPcGVuIFR5cGUgSGllcmFyY2h5Ci1yZW5hbWVQYXJ0aWNpcGFudC5uYW1lLjAgPSBKU0RUIFdlYiBSZW5hbWUgUGFydGljaXBhbnQKLXJlbmFtZVBhcnRpY2lwYW50Lm5hbWUuMSA9IEpTRFQgV2ViIFJlbmFtZSBQYXJ0aWNpcGFudAotcmVuYW1lUGFydGljaXBhbnQubmFtZS4yID0gSlNEVCBXZWIgUmVuYW1lIFBhcnRpY2lwYW50Ci1yZW5hbWVQYXJ0aWNpcGFudC5uYW1lLjMgPSBKU0RUIFdlYiBSZW5hbWUgUGFydGljaXBhbnQKLXF1ZXJ5UGFydGljaXBhbnQubmFtZS4wID0gSmF2YVNjcmlwdCBRdWVyeSBQYXJ0aWNpcGFudAotamF2YVNjcmlwdFByb3Bvc2FscyA9IEphdmFTY3JpcHQgUHJvcG9zYWxzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZmZjdlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiI+Ci0gCQk8Y29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLnByb3Zpc2lvbmFsLmNvbnRlbnRvdXRsaW5lLkpzQ29udGVudE91dGxpbmVDb25maWciCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiIC8+CQotCQk8c291cmNlVmlld2VyQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU0RUIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2Uuc291cmNlIiAvPgkKLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ibGluZXN0eWxlcHJvdmlkZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnN0eWxlLmphdmEuTGluZVN0eWxlUHJvdmlkZXJGb3JKU0RUIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQsb3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBULkVWRU5USEFORExFUiIgLz4KLQkJPGRvY3VtZW50YXRpb25UZXh0SG92ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGFnaW5mby5KU0RUSG92ZXJQcm9jZXNzb3IiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCxvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlRIQU5ETEVSIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJjaGFyYWN0ZXJwYWlybWF0Y2hlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGV4dC5Kc0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCxvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlRIQU5ETEVSIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJhdXRvZWRpdHN0cmF0ZWd5IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5hdXRvZWRpdC5BdXRvRWRpdFN0cmF0ZWd5Rm9ySnMiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCxvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlRIQU5ETEVSIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5GaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoLkpzRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQsb3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBULkVWRU5USEFORExFUiIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ic2xhdmVmb3JtYXR0aW5nc3RyYXRlZ3kiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmZvcm1hdC5Gb3JtYXR0aW5nU3RyYXRlZ3lKU0RUIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQiIC8+Ci0JPC9leHRlbnNpb24+CQkKLQkKLQkgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmh5cGVybGlua0RldGVjdG9ycyI+Ci0gICAgICA8aHlwZXJsaW5rRGV0ZWN0b3IgCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluay5KU0RUSHlwZXJsaW5rRGV0ZWN0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLkpTRFRIeXBlcmxpbmtEZXRlY3Rvci5TQ1JJUFQiCi0gICAgICAgICAgICBuYW1lPSIlaHlwZXJsaW5rRGV0ZWN0b3IubmFtZS4wIgotICAgICAgICAgICAgdGFyZ2V0SWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCIvPgotICAgICAgPGh5cGVybGlua0RldGVjdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluay5KU0RUSHlwZXJsaW5rRGV0ZWN0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLkpTRFRIeXBlcmxpbmtEZXRlY3Rvci5TQ1JJUFQuZXZlbnRzIgotICAgICAgICAgICAgbmFtZT0iJWh5cGVybGlua0RldGVjdG9yLm5hbWUuMCIKLSAgICAgICAgICAgIHRhcmdldElkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlRIQU5ETEVSIi8+ICAKLSAgICAgIDxoeXBlcmxpbmtEZXRlY3RvcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbmsuSlNEVEh5cGVybGlua0RldGVjdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5KU0RUSHlwZXJsaW5rRGV0ZWN0b3IuSFRNTCIKLQkJCW5hbWU9IiVoeXBlcmxpbmtEZXRlY3Rvci5uYW1lLjAiCi0JCQl0YXJnZXRJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgCi0gIAotICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQk8IS0tIGNvbnRlbnQgb3V0bGluZSBjb250cmlidXRpb25zIGZvciBPcGVuIFR5cGUgYW5kIE9wZW4gSGllcmFyY2h5IG1lbnUuICBNZW51cyBzaG93IHVwIGluIHJldmVyc2Ugb3JkZXIgb2YgZGVjbGlyYXRpb24gKGdvb2dsZSBpdCkuIC0tPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5JSmF2YVdlYk5vZGUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLkphdmFBY3Rpb25zIj4KLSAgICAgICAgICAgIDwhLS0gRGVjbGFyYXRpb25zIFNlYXJjaCBNZW51IC0tPgotICAgICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmRlY2xlcmF0aW9ucyIKLSAgICAgICAgIAkJbGFiZWw9IiVtZW51LmxhYmVsLjAiCi0gICAgICAgICAJCXBhdGg9Imdyb3VwLnNlYXJjaCI+Ci0gICAgIAkJIAk8c2VwYXJhdG9yIG5hbWU9ImRlY2xlcmF0aW9ucyIvPgotICAgICAgICAgPC9tZW51PgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuMCIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuMCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuZGVjbGVyYXRpb25zL2RlY2xlcmF0aW9ucyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5GaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuYWN0aW9ucy5GaW5kRGVjbGFyYXRpb25zSW5Xb3JraW5nU2V0QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPiAgCi0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4xIiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4xIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5kZWNsZXJhdGlvbnMvZGVjbGVyYXRpb25zIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLkZpbmRSZWZlcmVuY2VzQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLkZpbmREZWNsYXJhdGlvbnNJbkhpZXJhcmNoeUFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4gCi0gICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuMiIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuMiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuZGVjbGVyYXRpb25zL2RlY2xlcmF0aW9ucyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5GaW5kUmVmZXJlbmNlc0FjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuYWN0aW9ucy5GaW5kRGVjbGFyYXRpb25zSW5Qcm9qZWN0QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgCi0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4zIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjMiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmRlY2xlcmF0aW9ucy9kZWNsZXJhdGlvbnMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuRmluZFJlZmVyZW5jZXNBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLmFjdGlvbnMuRmluZERlY2xhcmF0aW9uc0FjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4gICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgPCEtLSBSZWZyZW5jZXMgU2VhcmNoIG1lbnUgLS0+Ci0gICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnJlZmVyZW5jZXMiCi0gICAgICAgICAJCWxhYmVsPSIlbWVudS5sYWJlbC4xIgotICAgICAgICAgCQlwYXRoPSJncm91cC5zZWFyY2giPgotICAgICAJCSAJPHNlcGFyYXRvciBuYW1lPSJyZWZlcmVuY2VzIi8+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC40IiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC40IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5yZWZlcmVuY2VzL3JlZmVyZW5jZXMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLmFjdGlvbnMuRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+ICAKLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjUiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjUiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnJlZmVyZW5jZXMvcmVmZXJlbmNlcyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5GaW5kUmVmZXJlbmNlc0FjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuYWN0aW9ucy5GaW5kUmVmZXJlbmNlc0luSGllcmFyY2h5QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPiAKLSAgICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC42IiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC42IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5yZWZlcmVuY2VzL3JlZmVyZW5jZXMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuRmluZFJlZmVyZW5jZXNBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLmFjdGlvbnMuRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICAKLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjciCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuNyIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIucmVmZXJlbmNlcy9yZWZlcmVuY2VzIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLkZpbmRSZWZlcmVuY2VzQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLkZpbmRSZWZlcmVuY2VzQWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPiAgIAotICAgICAgICAgPCEtLSBTb3VyY2UgYW5kIFJlZmFjdG9yaW5nIE1lbnUncyAtLT4KLSAgICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIucmVmYWN0b3IiCi0gICAgICAgICAJCWxhYmVsPSIlbWVudS5sYWJlbC4yIgotICAgICAgICAgCQlwYXRoPSJncm91cC5nZW5lcmF0ZSI+Ci0gICAgIAkJIAk8c2VwYXJhdG9yIG5hbWU9InJlZmFjdG9yIi8+Ci0gICAgICAgICA8L21lbnU+Ci0KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zb3VyY2UiCi0gICAgICAgICAJCWxhYmVsPSIlbWVudS5sYWJlbC4zIgotICAgICAgICAgCQlwYXRoPSJncm91cC5nZW5lcmF0ZSI+Ci0gICAgIAkJIAk8c2VwYXJhdG9yIG5hbWU9InNvdXJjZSIvPgotICAgICAgICAgPC9tZW51PgotICAgICAgICAgPCEtLSBTb3VyY2UgQWN0aW9ucyAtLT4KLQkJIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjgiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjgiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnNvdXJjZS9zb3VyY2UiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5BZGRKYXZhRG9jU3R1YkFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IioiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmdlbmVyYXRlLmVsZW1lbnQuY29tbWVudCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDwhLS0gUmVmYWN0b3IgQWN0aW9ucyAtLT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjkiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjkiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnJlZmFjdG9yL3JlZmFjdG9yIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuU291cmNlQWN0aW9uc0FjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IioiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmNoYW5nZS5mdW5jdGlvbi5zaWduYXR1cmUiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4xMCIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuMTAiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnJlZmFjdG9yL3JlZmFjdG9yIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuU291cmNlQWN0aW9uc0FjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IioiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLk1vdmUiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4xMSIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuMTEiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnJlZmFjdG9yL3JlZmFjdG9yIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuU291cmNlQWN0aW9uc0FjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IioiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnJlbmFtZSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgICA8IS0tIEVkaXQgIChjdXQgY29weSBwYXN0ZSBldGMuLiAtLT4KLSAgICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4xMiIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuMTIiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iZ3JvdXAuZWRpdCIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLlN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IioiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmRlbGV0ZSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgCi0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4xMyIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuMTMiCi0gICAgICAgICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iZ3JvdXAuZWRpdCIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLlN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnBhc3RlLmFmdGVyIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjE0IiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4xNCIKLSAgICAgICAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJncm91cC5lZGl0IgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkucGFzdGUuYmVmb3JlIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuMTUiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjE1IgotICAgICAgICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Imdyb3VwLmVkaXQiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIqIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5jb3B5Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotCi0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4xNiIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuMTYiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iZ3JvdXAuZWRpdCIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLlN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IioiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmN1dCI+Ci0gICAgICAgICA8L2FjdGlvbj4gICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgPCEtLSBTaG93IGluIFNjcmlwdCBFeHBsb3JlciwgSGlzdG9yeSBhbmQgTmF2aWdhdG9yIC0tPiAgICAgICAKLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zaG93aW4iCi0gICAgICAgICAJCWxhYmVsPSIlbWVudS5sYWJlbC40IgotICAgICAgICAgCQlwYXRoPSJncm91cC5zaG93Ij4KLSAgICAgCQkgCTxzZXBhcmF0b3IgbmFtZT0ic2hvd2luIi8+Ci0gICAgICAgICA8L21lbnU+ICAKLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjE3IiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4xNyIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc2hvd2luL3Nob3dpbiIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLlNob3dJbk5hdmlnYXRvckFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuYWN0aW9ucy5TaG93SW5OYXZpZ2F0b3JWaWV3QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPCEtLSBIaXN0b3J5IG5vdCB3b3JraW5nIHdlbGwgLS0+Ci0gICAgICAgICA8IS0tCi0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iSGlzdG9yeSIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSJTaG93IEluIEhpc3RvcnkiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnNob3dpbi9zaG93aW4iCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5TaG93SGlzdG9yeUFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkuY2FsbGhpZXJhcmNoeS5PcGVuQ2FsbEhpZXJhcmNoeUFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4gCi0gICAgICAgICAtLT4KLSAgICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4xOCIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuMTgiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnNob3dpbi9zaG93aW4iCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5TaG93SW5TY3JpcHRFeHBsb3JlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuYWN0aW9ucy5TaG93SW5TY3JpcHRFeHBsb3JlciI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIAotICAgICAgICAgPCEtLSBPcGVuIENhbGwgYW5kIFR5cGUgSGllcmFyY2hpZXMgLS0+Ci0gICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuMTkiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjE5IgotICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJncm91cC5zaG93IgotICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLk9wZW5DYWxsSGllcmFyY2h5QWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS5jYWxsaGllcmFyY2h5Lk9wZW5DYWxsSGllcmFyY2h5QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuMjAiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuMjAiCi0gICAJCQltZW51YmFyUGF0aD0iZ3JvdXAuc2hvdyIKLSAgIAkJCXN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLk9wZW5UeXBlSGllcmFyY2h5IgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLk9wZW5UeXBlSGllcmFyY2h5QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAKLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0gIAotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBzb3VyY2UgdmFsaWRhdGlvbiBmb3IgSlNQCQkJCQkJCQkJCQkJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5Kc1ZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuanNzb3VyY2V2YWxpZGF0b3IiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllciBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBUIi8+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVEhBTkRMRVIiLz4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllciBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlRIQU5ETEVSIi8+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBKU1AgVUkgQWRhcHRlciBmYWN0b3JpZXMJCQkJCSAgIAkJCQkJCSAgCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uIj4KLQkJPGFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTRFQiPgotCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiIC8+Ci0JCTwvYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCQotCi0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIGZvciBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIHJlbW92ZWQgZm9yIG5vdyAtLT4KLQk8IS0tCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5icmVha3BvaW50Ij4KLQkJPGJyZWFrcG9pbnRDb250cmlidXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5wcm92aWRlcnMiPgotCQkJPHByb3ZpZGVyCi0JCQkJY29udGVudFR5cGVzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzLkphdmFTdHJhdHVtQnJlYWtwb2ludFByb3ZpZGVyOipodG1sLGpzLGh0bSoiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzLkphdmFTdHJhdHVtQnJlYWtwb2ludFByb3ZpZGVyIiAvPgotCQk8L2JyZWFrcG9pbnRDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JLS0+Ci0JCi0JCi0JPCEtLSBFZGl0b3IgYWN0aW9uc2V0cyAtLT4KLQk8IS0tCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0UGFydEFzc29jaWF0aW9ucyI+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5lZGl0LnRleHQuYWN0aW9uU2V0LmFubm90YXRpb25OYXZpZ2F0aW9uIj4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qc3Bzb3VyY2Uuc291cmNlIiAvPgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ij4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qc3Bzb3VyY2Uuc291cmNlIiAvPgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQktLT4KLQotCQotCQotCQotCTwhLS0gS2V5YmluZGluZ3MgZm9yIGpzcCBzb3VyY2UgZWRpdG9yIC0tPgotCTwhLS0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5iaW5kaW5ncyI+IC0tPgotCSAgICA8IS0tICB3aW4zMjogIE0xPUNUUkwsIE0yPVNISUZULCBNMz1BTFQgLS0+Ci0JCTwhLS0gcmVuYW1lIHJlZmFjdG9yIC0tPgotCQk8IS0tCi0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMitNMytSIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5qc3Auc2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLmVkaXQudGV4dC5qYXZhLnJlbmFtZS5lbGVtZW50IgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQkJLS0+Ci0JCTwhLS0gbW92ZSByZWZhY3RvciAtLT4KLQkJPCEtLQotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTIrTTMrViIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuanNwLnNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkucmVmYWN0b3IubW92ZSIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXk+Ci0JPC9leHRlbnNpb24+Ci0JLS0+Ci0JCi0JCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBxdWVyeVBhcnRpY2lwYW50IHRvIHBhcnRpY2lwYXRlIGluIGphdmEgc2VyYWNoZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkucXVlcnlQYXJ0aWNpcGFudHMiPgotCQk8cXVlcnlQYXJ0aWNpcGFudAotCQkJbmFtZT0iJXF1ZXJ5UGFydGljaXBhbnQubmFtZS4wIgotCQkJbmF0dXJlPSJvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmpzTmF0dXJlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaC51aS5Kc1F1ZXJ5UGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmphdmEuc2VhcmNoLnVpLkpzUXVlcnlQYXJ0aWNpcGFudCIgLz4KLQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gRG9jdW1lbnQgcHJvdmlkZXIgZm9yIEV4dGVybmFsRmlsZUVkaXRvcklucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLmRvY3VtZW50UHJvdmlkZXJzIj4KLQkJPHByb3ZpZGVyCi0JCQlpbnB1dFR5cGVzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rLkV4dGVybmFsRmlsZUVkaXRvcklucHV0IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RmlsZURvY3VtZW50UHJvdmlkZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkV4dGVybmFsRmlsZURvY3VtZW50UHJvdmlkZXIiIC8+Ci0KLQk8L2V4dGVuc2lvbj4KLQktLT4KLQk8IS0tCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JCTx2aWV3ZXJDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qc3Bzb3VyY2Uuc291cmNlLlJ1bGVyQ29udGV4dCIKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnJ1bGVyLmNvbnRleHQuYWN0aW9ucyI+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRUYXNrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLkFkZFRhc2tfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRUYXNrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iIC8+Ci0KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZEJvb2ttYXJrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIiAvPgotCi0JCTwvdmlld2VyQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotLS0+Ci0KLQotPCEtLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotCQk8ZWRpdG9yQ29udHJpYnV0aW9uCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuanNwc291cmNlLnNvdXJjZS5lZGl0b3JBY3Rpb25zIgotCQkJY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkuamF2YWVkaXRvci5Db21waWxhdGlvblVuaXRFZGl0b3JBY3Rpb25Db250cmlidXRvciIKLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiPgotCQkJPGFjdGlvbgotCQkJCWlkPSJDbGVhbnVwRG9jdW1lbnQiCi0JCQkJbGFiZWw9IiVDbGVhbnVwRG9jdW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNsZWFudXAuZG9jdW1lbnQiCi0JCQkJdG9vbHRpcD0iJUNsZWFudXBEb2N1bWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpLkNsZWFudXBBY3Rpb25IVE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkNsZWFudXBEb2N1bWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iVG9nZ2xlQ29tbWVudCIKLQkJCQlsYWJlbD0iJVRvZ2dsZUNvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZ2dsZS5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVUb2dnbGVDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5Ub2dnbGVDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlRvZ2dsZUNvbW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkFkZEJsb2NrQ29tbWVudCIKLQkJCQlsYWJlbD0iJUFkZEJsb2NrQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRkLmJsb2NrLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJUFkZEJsb2NrQ29tbWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQWRkQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkFkZEJsb2NrQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iUmVtb3ZlQmxvY2tDb21tZW50IgotCQkJCWxhYmVsPSIlUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5yZW1vdmUuYmxvY2suY29tbWVudCIKLQkJCQl0b29sdGlwPSIlUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5SZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iUmVtb3ZlQmxvY2tDb21tZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJSZW5hbWVFbGVtZW50IgotCQkJCWxhYmVsPSIlUmVuYW1lRWxlbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5yZWZhY3Rvci5yZW5hbWUiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUFJlbmFtZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iUmVuYW1lRWxlbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iTW92ZUVsZW1lbnQiCi0JCQkJbGFiZWw9IiVNb3ZlRWxlbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5yZWZhY3Rvci5tb3ZlIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BNb3ZlRWxlbWVudEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJNb3ZlRWxlbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iRmluZE9jY3VycmVuY2VzIgotCQkJCWxhYmVsPSIlRmluZE9jY3VycmVuY2VzX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zZWFyY2guZmluZC5vY2N1cnJlbmNlcyIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoLkpzRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkZpbmRPY2N1cnJlbmNlcyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nIgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LmVuY2xvc2luZyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3ROZXh0IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5uZXh0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3ROZXh0WE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QucHJldmlvdXMiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RQcmV2aW91c1hNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0SGlzdG9yeSIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubGFzdCIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5Ij4KLQkJCTwvYWN0aW9uPgotCQk8L2VkaXRvckNvbnRyaWJ1dGlvbj4KLSAgICAgICAgPGVkaXRvckNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qc3Bzb3VyY2UucnVsZXIuYWN0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyRG91YmxlQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIi8+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVNlbGVjdFJ1bGVyLmxhYmVsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIi8+Ci0gICAgICAgIDwvZWRpdG9yQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCS0tPgotCQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIEZPUiBKU1AvSkFWQSBSRU5BTUUgUEFSVElDSVBBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5yZW5hbWVQYXJ0aWNpcGFudHMiPgotCQk8cmVuYW1lUGFydGljaXBhbnQKLQkJCW5hbWU9IiVyZW5hbWVQYXJ0aWNpcGFudC5uYW1lLjAiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWZmZWN0ZWROYXR1cmVzIj4KLQkJCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuanNOYXR1cmUiIC8+Ci0JCQkJCTwvaXRlcmF0ZT4KLQkJCQk8L3dpdGg+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JVHlwZSIgLz4KLQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQkJPHJlbmFtZVBhcnRpY2lwYW50Ci0JCQluYW1lPSIlcmVuYW1lUGFydGljaXBhbnQubmFtZS4xIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BUeXBlUmVuYW1lUGFydGljaXBhbnQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFmZmVjdGVkTmF0dXJlcyI+Ci0JCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmpzTmF0dXJlIiAvPgotCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJPC93aXRoPgotCQkJCTx3aXRoIHZhcmlhYmxlPSJlbGVtZW50Ij4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5JSmF2YVdlYk5vZGUiIC8+Ci0KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvcmVuYW1lUGFydGljaXBhbnQ+Ci0JCTxyZW5hbWVQYXJ0aWNpcGFudAotCQkJbmFtZT0iJXJlbmFtZVBhcnRpY2lwYW50Lm5hbWUuMiIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWZmZWN0ZWROYXR1cmVzIj4KLQkJCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuanNOYXR1cmUiIC8+Ci0KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklGdW5jdGlvbiIgLz4KLQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQkJPHJlbmFtZVBhcnRpY2lwYW50Ci0JCQluYW1lPSIlcmVuYW1lUGFydGljaXBhbnQubmFtZS4zIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUE1ldGhvZFJlbmFtZVBhcnRpY2lwYW50IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUE1ldGhvZFJlbmFtZVBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJhZmZlY3RlZE5hdHVyZXMiPgotCQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5qc05hdHVyZSIgLz4KLQotCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJPC93aXRoPgotCQkJCTx3aXRoIHZhcmlhYmxlPSJlbGVtZW50Ij4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5JSmF2YVdlYk5vZGUiIC8+Ci0KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvcmVuYW1lUGFydGljaXBhbnQ+Ci0KLQkgIDwvZXh0ZW5zaW9uPgotCi0JICA8IS0tCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLkpzR2xvYmFsU2NvcGVVSUluaXRpYWxpemVyIj4KLSAgICAgPEpzR2xvYmFsU2NvcGVVSUluaXRpYWxpemVyCi0gICAgIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQubGF1bmNoaW5nLldlYlByb2plY3QiCi0gICAgIAljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLldlYlByb2plY3RKc0dsb2JhbFNjb3BlVUlJbml0aWFsaXplciI+Ci0gICAgIDwvSnNHbG9iYWxTY29wZVVJSW5pdGlhbGl6ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLS0tPgotCi0gIAkgPCEtLQotICAJIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgCQk8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmpzZHRTZXR1cCI+Ci0gICAgICAgCSA8dmlzaWJpbGl0eT4KLSAgICAgICAgCTxub3Q+Ci0JICAgICAgICAJPG9yPgotCQkgICAgICAgICAgICA8b2JqZWN0U3RhdGUgCi0JCQkgICAgICAgICAgICBuYW1lPSJwcm9qZWN0TmF0dXJlIiAKLQkJCSAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmpzTmF0dXJlIi8+Ci0JCQkgICAgICAgIDxvYmplY3RTdGF0ZQotCQkJICAgICAgICAJbmFtZT0ib3BlbiIKLQkJCSAgICAgICAgCXZhbHVlPSJmYWxzZSIvPgotCSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgICA8L25vdD4KLSAgICAgICAJIDwvdmlzaWJpbGl0eT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuU2V0dXBQcm9qZWN0c1dpenphcmQiCi0gICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4yMSIKLSAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS51aS5wcm9qZWN0Q29uZmlndXJlL2FkZGl0aW9ucyIKLSAgICAgICAgICAgIGVuYWJsZXNGb3I9IisiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwud2ViLnVpLmNvbnZlcnRQcm9qZWN0cyI+Ci0gICAgICAJPC9hY3Rpb24+Ci0gICAJCTwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+IAotLS0+Ci0KLSAgCSA8IS0tIFVuY29tbWVudCBmb3IgU3RhbmRhbG9uZSArIEhUTUwgYXMgc2VwZXJhdGUgb3B0aW9ucyAtLT4KLSAgCSA8IS0tCi0gIAkgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotIAkJPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5qc2R0U2V0dXAiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgbGFiZWw9IkFkZCBTdXBwb3J0IGZvciBKYXZhU2NyaXB0IGluIEhUTUwiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLlNldHVwUHJvamVjdHNXaXp6YXJkIgotICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnByb2plY3QudG9vbHMvZ3JvdXAwIgotICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuaW50ZXJuYWwudWkuY29udmVydFByb2plY3RzIj4KLSAgICAgIAk8L2FjdGlvbj4KLSAgIAkJPC9vYmplY3RDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4gIAotICAgLS0+Ci0gPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21wbGV0aW9uUHJvcG9zYWwiPgotICA8cHJvcG9zYWxDYXRlZ29yeQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5Db250ZW50QXNzaXN0UHJvcG9zYWxzIgotICAgICAgbmFtZT0iJWphdmFTY3JpcHRQcm9wb3NhbHMiCi0gICAgICBpY29uPSJpY29ucy9mdWxsL2VsY2wxNi9qYXZhYXNzaXN0X2NvLmdpZiI+Ci0gIDwvcHJvcG9zYWxDYXRlZ29yeT4KLSAgPHByb3Bvc2FsQ29tcHV0ZXIKLSAgICAgIGFjdGl2YXRlPSJ0cnVlIgotICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLkNvbnRlbnRBc3Npc3RQcm9wb3NhbHMiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSlNEVENvbnRlbnRBc3Npc3RhbnQiCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLkNvbnRlbnRBc3Npc3RQcm9wb3NhbHMiPgotICAgICA8Y29udGVudFR5cGUKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotICAgICAgPHBhcnRpdGlvblR5cGUKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBUIj4KLSAgICAgIDwvcGFydGl0aW9uVHlwZT4KLSAgICAgICAgICAgIDxwYXJ0aXRpb25UeXBlCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVEhBTkRMRVIiPgotICAgICAgPC9wYXJ0aXRpb25UeXBlPgotICAgIDwvY29udGVudFR5cGU+Ci0gICAgIDxjb250ZW50VHlwZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIj4KLSAgICAgIDxwYXJ0aXRpb25UeXBlCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCI+Ci0gICAgICA8L3BhcnRpdGlvblR5cGU+Ci0gICAgICAgICAgICA8cGFydGl0aW9uVHlwZQotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlRIQU5ETEVSIj4KLSAgICAgIDwvcGFydGl0aW9uVHlwZT4KLSAgICA8L2NvbnRlbnRUeXBlPgotICA8L3Byb3Bvc2FsQ29tcHV0ZXI+Ci08L2V4dGVuc2lvbj4KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2hhcmFjdGVyUGFpcmluZyI+Ci0JPGluc2VydGVyIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGV4dC5Kc0NoYXJhY3RlclBhaXJJbnNlcnRlciIgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnNlcnRlciI+Ci0JICA8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIgotCSAgICAgICAgcGFydGl0aW9ucz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBULCBvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlRIQU5ETEVSIj4KLQkgIDwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCTwvaW5zZXJ0ZXI+Ci08L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzc2NTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICoKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9TZXR1cFByb2plY3RzV2l6emFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9TZXR1cFByb2plY3RzV2l6emFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTgyMTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvU2V0dXBQcm9qZWN0c1dpenphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSW5jbHVkZVBhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0LkpzV2ViTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJUGx1Z2luOwotCi0vKioKLSAqIE5vdCBBUEkKLSAqLwotcHVibGljIGNsYXNzIFNldHVwUHJvamVjdHNXaXp6YXJkIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUgewotCUlXb3JrYmVuY2hQYXJ0IGZQYXJ0OwotCU9iamVjdFtdIGZUYXJnZXQ7Ci0KLQlwcml2YXRlIHZvaWQgZG9JbnN0YWxsKElQcm9qZWN0IHByb2plY3QsIGZpbmFsIGJvb2xlYW4gb3BlblByb3BlcnRpZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlib29sZWFuIGNvbmZpZ3VyZWQgPSBmYWxzZTsKLQkJSnNXZWJOYXR1cmUgbmF0dXJlID0gbmV3IEpzV2ViTmF0dXJlKHByb2plY3QsIG1vbml0b3IpOwotCQl0cnkgewotCQkJYm9vbGVhbiBoYWRCYXNpY05hdHVyZSA9IEpzV2ViTmF0dXJlLmhhc05hdHVyZShwcm9qZWN0KTsKLQotCQkJbmF0dXJlLmNvbmZpZ3VyZSgpOwotCi0JCQlpZiAoIWhhZEJhc2ljTmF0dXJlKSB7Ci0JCQkJLyoKLQkJCQkgKiBObyBuYXR1cmUgYmVmb3JlLCBzbyBubyBleGlzdGluZyBidWlsZCBwYXRoLiBEZWZpbmUgdGhlCi0JCQkJICogcHJvamVjdCBpdHNlbGYgYXMgYW4gaW5jbHVkZSBmb2xkZXIuCi0JCQkJICovCi0JCQkJSUphdmFTY3JpcHRQcm9qZWN0IGpwID0gSmF2YVNjcmlwdENvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJCUlJbmNsdWRlUGF0aEVudHJ5W10gb2xkRW50cmllcyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJb2xkRW50cmllcyA9IGpwLmdldFJhd0luY2x1ZGVwYXRoKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgxKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBudWxsLCBleDEpOwotCQkJCX0KLQkJCQkKLQkJCQlJUGF0aCBwcm9qZWN0UGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsKLQkJCQlJSW5jbHVkZVBhdGhFbnRyeSBwcm9qZWN0UGF0aEVudHJ5ID0gSmF2YVNjcmlwdENvcmUubmV3U291cmNlRW50cnkocHJvamVjdFBhdGgpOwotCQkJCQotCQkJCWlmICghIEFycmF5cy5hc0xpc3Qob2xkRW50cmllcykuY29udGFpbnMocHJvamVjdFBhdGhFbnRyeSkpIHsKLQkJCQkJSUluY2x1ZGVQYXRoRW50cnlbXSBuZXdFbnRyaWVzID0gbmV3IElJbmNsdWRlUGF0aEVudHJ5W29sZEVudHJpZXMubGVuZ3RoICsgMV07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkob2xkRW50cmllcywgMCwgbmV3RW50cmllcywgMCwgb2xkRW50cmllcy5sZW5ndGgpOwotCQkJCQkKLQkJCQkJbmV3RW50cmllc1tvbGRFbnRyaWVzLmxlbmd0aF0gPSBwcm9qZWN0UGF0aEVudHJ5OwotCQkJCQlqcC5zZXRSYXdJbmNsdWRlcGF0aChuZXdFbnRyaWVzLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCQljb25maWd1cmVkID0gdHJ1ZTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCX0KLQotCQlpZiAoY29uZmlndXJlZCAmJiBvcGVuUHJvcGVydGllcykgewotCQkJc2hvd1Byb3BlcnRpZXNPbihwcm9qZWN0LCBtb25pdG9yKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZG9Vbmluc3RhbGwoSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUpzV2ViTmF0dXJlIG5hdHVyZSA9IG5ldyBKc1dlYk5hdHVyZShwcm9qZWN0LCBtb25pdG9yKTsKLQkJdHJ5IHsKLQkJCW5hdHVyZS5kZWNvbmZpZ3VyZSgpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIGJvb2xlYW4gb3BlblByb3BlcnRpZXMpIHsKLQkJSVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLQkJaWYgKGZQYXJ0ICE9IG51bGwpIHsKLQkJCXNlcnZpY2UgPSAoSVByb2dyZXNzU2VydmljZSkgZlBhcnQuZ2V0U2l0ZSgpLmdldFNlcnZpY2UoSVByb2dyZXNzU2VydmljZS5jbGFzcyk7Ci0JCX0KLQkJaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotCQkJZG9JbnN0YWxsKHByb2plY3QsIG9wZW5Qcm9wZXJ0aWVzLCBudWxsKTsKLQkJfQotCQllbHNlIHsKLQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJZG9JbnN0YWxsKHByb2plY3QsIG9wZW5Qcm9wZXJ0aWVzLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQl9OwotCQkJdHJ5IHsKLQkJCQlzZXJ2aWNlLnJ1bihmYWxzZSwgZmFsc2UsIHJ1bm5hYmxlKTsKLQkJCX0KLQkJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChmVGFyZ2V0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFyZ2V0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZlRhcmdldFtpXSBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSAoKElSZXNvdXJjZSkgZlRhcmdldFtpXSkuZ2V0UHJvamVjdCgpOwotCi0JCQkJaWYgKCFKc1dlYk5hdHVyZS5oYXNOYXR1cmUocHJvamVjdCkpIHsKLQkJCQkJLyogRG9lc24ndCBoYXZlIG5hdHVyZSwgZG8gYSBmdWxsIGluc3RhbGwuICovCi0JCQkJCWluc3RhbGwocHJvamVjdCwgaSA9PSBmVGFyZ2V0Lmxlbmd0aCAtIDEpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogSGFzIG5hdHVyZSwgY2hlY2sgZm9yIGJyb3dzZXIgbGlicmFyeSBvbiBpbmNsdWRlIHBhdGgKLQkJCQkJICogYW5kIHNldHVwIGlmIG5vdCBmb3VuZC4KLQkJCQkJICovCi0JCQkJCUlKYXZhU2NyaXB0UHJvamVjdCBqcCA9IEphdmFTY3JpcHRDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQkJSUluY2x1ZGVQYXRoRW50cnlbXSByYXdDbGFzc3BhdGggPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJcmF3Q2xhc3NwYXRoID0ganAuZ2V0UmF3SW5jbHVkZXBhdGgoKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGV4MSkgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIG51bGwsIGV4MSk7Ci0JCQkJCX0KLQotCQkJCQlib29sZWFuIGJyb3dzZXJGb3VuZCA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBrID0gMDsgcmF3Q2xhc3NwYXRoICE9IG51bGwgJiYgIWJyb3dzZXJGb3VuZCAmJiBrIDwgcmF3Q2xhc3NwYXRoLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQlpZiAocmF3Q2xhc3NwYXRoW2tdLmdldFBhdGgoKS5lcXVhbHMoSnNXZWJOYXR1cmUuVklSVFVBTF9CUk9XU0VSX0NMQVNTUEFUSCkpIHsKLQkJCQkJCQlicm93c2VyRm91bmQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghYnJvd3NlckZvdW5kKSB7Ci0JCQkJCQlpbnN0YWxsKHByb2plY3QsIGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlmVGFyZ2V0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0FycmF5KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmVGFyZ2V0ID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJZlBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLQotCXByaXZhdGUgdm9pZCBzaG93UHJvcGVydGllc09uKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoIm9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiKS5nZXRFeHRlbnNpb25zKCk7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgTGlzdCBwYWdlSWRzID0gbmV3IEFycmF5TGlzdCg4KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZXh0ZW5zaW9uc1tpXS5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCkuc3RhcnRzV2l0aCgib3JnLmVjbGlwc2Uud3N0LmpzZHQuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ3VyYXRpb25FbGVtZW50cyA9IGV4dGVuc2lvbnNbaV0uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWd1cmF0aW9uRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKCJwYWdlIi5lcXVhbHMoY29uZmlndXJhdGlvbkVsZW1lbnRzW2pdLmdldE5hbWUoKSkpIHsKLQkJCQkJCXBhZ2VJZHMuYWRkKGNvbmZpZ3VyYXRpb25FbGVtZW50c1tqXS5nZXRBdHRyaWJ1dGUoImlkIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU2hlbGwgc2hlbGwgPSAoU2hlbGwpIGZQYXJ0LmdldEFkYXB0ZXIoU2hlbGwuY2xhc3MpOwotCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXb3JrYmVuY2hXaW5kb3cgPSBKc1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCWlmIChhY3RpdmVXb3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLQkJCQlzaGVsbCA9IGFjdGl2ZVdvcmtiZW5jaFdpbmRvdy5nZXRTaGVsbCgpOwotCQl9Ci0JCWZpbmFsIFNoZWxsIGZpbmFsU2hlbGwgPSBzaGVsbDsKLQkJaWYgKGZpbmFsU2hlbGwgIT0gbnVsbCkgewotCQkJZmluYWxTaGVsbC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCVByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByb3BlcnR5RGlhbG9nT24oZmluYWxTaGVsbCwgcHJvamVjdCwgIm9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnByb3BlcnR5UGFnZXMuQnVpbGRQYXRoc1Byb3BlcnR5UGFnZSIsIChTdHJpbmdbXSkgcGFnZUlkcy50b0FycmF5KG5ldyBTdHJpbmdbcGFnZUlkcy5zaXplKCldKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJCQkJZG9Vbmluc3RhbGwocHJvamVjdCwgbW9uaXRvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTRFQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNEVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjU1NTBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNEVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS50ZXh0LklKc1BhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmNvbnRlbnRhc3Npc3QuSlNEVFN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5hdXRvZWRpdC5BdXRvRWRpdFN0cmF0ZWd5Rm9ySnM7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSogCi0gKiBDb25maWd1cmF0aW9uIGZvciBhIHNvdXJjZSB2aWV3ZXIgd2hpY2ggc2hvd3MgSHRtbCBhbmQgc3VwcG9ydHMgSlNEVC4KLSAqIDxwPgotICogQ2xpZW50cyBjYW4gc3ViY2xhc3MgYW5kIG92ZXJyaWRlIGp1c3QgdGhvc2UgbWV0aG9kcyB3aGljaCBtdXN0IGJlIHNwZWNpZmljCi0gKiB0byB0aGVpciBuZWVkcy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNEVCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwgewotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU0RUKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwjZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElBdXRvRWRpdFN0cmF0ZWd5W10gZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJaWYoY29udGVudFR5cGUuZXF1YWxzKElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpIHx8IGNvbnRlbnRUeXBlLmVxdWFscyhJSFRNTFBhcnRpdGlvbnMuU0NSSVBUX0VWRU5USEFORExFUikpIHsKLQkJCUlBdXRvRWRpdFN0cmF0ZWd5W10gc3RyYXRlZ2llcyA9IG5ldyBJQXV0b0VkaXRTdHJhdGVneVsxXTsKLQkJCXN0cmF0ZWdpZXNbMF0gPSBuZXcgQXV0b0VkaXRTdHJhdGVneUZvckpzKCk7Ci0JCQlyZXR1cm4gc3RyYXRlZ2llczsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBzdXBlci5nZXRBdXRvRWRpdFN0cmF0ZWdpZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MI2dldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIElDb250ZW50QXNzaXN0UHJvY2Vzc29yW10gZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcnMoCi0JCQlJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCi0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yW10gcHJvY2Vzc29yczsKLQkJCi0JCWlmKGlzSmF2YXNjcmlwdFBhcnRpdGlvblR5cGUocGFydGl0aW9uVHlwZSkpIHsKLQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBKU0RUU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoCi0JCQkJCXRoaXMuZ2V0Q29udGVudEFzc2lzdGFudCgpLCBwYXJ0aXRpb25UeXBlLCBzb3VyY2VWaWV3ZXIpOwotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde3Byb2Nlc3Nvcn07Ci0JCX0gZWxzZSB7Ci0JCQlwcm9jZXNzb3JzID0gc3VwZXIuZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJfSAKLQkJCi0JCXJldHVybiBwcm9jZXNzb3JzOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcGFydGl0aW9uVHlwZUlEIGNoZWNrIHRvIHNlZSBpZiB0aGlzIHBhcnRpdGlvbiB0eXBlIElEIGlzIGZvciBhIEphdmFzY3JpcHQgcGFydGl0aW9uIHR5cGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBwYXJ0aXRvbiB0eXBlIGlzIGEgSmF2YXNjcmlwdCBwYXJ0aXRpb24gdHlwZSwKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0phdmFzY3JpcHRQYXJ0aXRpb25UeXBlKFN0cmluZyBwYXJ0aXRpb25UeXBlSUQpIHsKLQkJcmV0dXJuIElKc1BhcnRpdGlvbnMuSHRtbEpzUGFydGl0aW9uLmVxdWFscyhwYXJ0aXRpb25UeXBlSUQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVVSUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL1dlYlByb2plY3RKc0dsb2JhbFNjb3BlVUlJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2FlY2NlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVVSUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkuSUpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplckV4dGVuc2lvbjsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICoKLSAqLwotcHVibGljIGNsYXNzIFdlYlByb2plY3RKc0dsb2JhbFNjb3BlVUlJbml0aWFsaXplciBpbXBsZW1lbnRzIElKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXJFeHRlbnNpb257Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkuSUpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsemVyRXh0ZW5zaW9uI2dldEltYWdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFByb2plY3QpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZShJUGF0aCBjb250YWluZXJQYXRoLCBTdHJpbmcgZWxlbWVudCwgSUphdmFTY3JpcHRQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZSh0aGlzLmdldENsYXNzKCksIndlYjEuSlBHIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvQWRkSmF2YURvY1N0dWJBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9BZGRKYXZhRG9jU3R1YkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjA0NDRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9BZGRKYXZhRG9jU3R1YkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS5hY3Rpb25zLldvcmtiZW5jaFJ1bm5hYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS51dGlsLkV4Y2VwdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkpzSmZhY2VOb2RlOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFkZEphdmFEb2NTdHViQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldERpYWxvZ1RpdGxlKCkgewotCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJBZGRKYXZhRG9jU3R1YkFjdGlvbi4wIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIFNoZWxsIGdldFNoZWxsKCkgewotCQlyZXR1cm4gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JfQotCQotCXB1YmxpYyBJV29ya2JlbmNoUGFydFNpdGUgZ2V0U2l0ZSgpIHsKLQkJcmV0dXJuIHRhcmdldFBhcnQuZ2V0U2l0ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJSUphdmFTY3JpcHRFbGVtZW50W10gZWxlbWVudHMgPSBKc0VsZW1lbnRBY3Rpb25Qcm94eS5nZXRKc0VsZW1lbnRzRnJvbVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5sZW5ndGggPCAxKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUphdmFTY3JpcHRFbGVtZW50IHBhcmVudCA9IGVsZW1lbnRzWzBdLmdldFBhcmVudCgpOwotCQkvKiBmaW5kIHRoZSBjdSAqLwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdFVuaXQpKSB7Ci0JCQkKLQkJfQotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCUFycmF5TGlzdCBtZW1iZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChlbGVtZW50c1tpXSBpbnN0YW5jZW9mIElNZW1iZXIpIHsKLQkJCQkJbWVtYmVycy5hZGQoZWxlbWVudHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJCUpzSmZhY2VOb2RlIG5vZGVbXSA9IFNpbXBsZUpTRFRBY3Rpb25Qcm94eS5nZXRKc0pmYWNlTm9kZXNGcm9tU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQkvKiBvbmx5IHNob3VsZCBiZSBvbmUgbm9kZSAqLwotCQkJcnVuKChJSmF2YVNjcmlwdFVuaXQpIHBhcmVudCwgKElNZW1iZXJbXSkgbWVtYmVycy50b0FycmF5KG5ldyBJTWVtYmVyW21lbWJlcnMuc2l6ZSgpXSksIG5vZGVbMF0pOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihJSmF2YVNjcmlwdFVuaXQgY3UsIElNZW1iZXJbXSBtZW1iZXJzLCBKc0pmYWNlTm9kZSBub2RlKSB7Ci0JCXRyeSB7Ci0JCQlBZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbiBvcCA9IG5ldyBBZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbihtZW1iZXJzLCBub2RlKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkucnVuSW5VSShQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLCBuZXcgV29ya2JlbmNoUnVubmFibGVBZGFwdGVyKG9wLCBvcC5nZXRTY2hlZHVsZVJ1bGUoKSksIG9wLmdldFNjaGVkdWxlUnVsZSgpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlFeGNlcHRpb25IYW5kbGVyLmhhbmRsZShlLCBnZXRTaGVsbCgpLCBnZXREaWFsb2dUaXRsZSgpLCBNZXNzYWdlcy5nZXRTdHJpbmcoIkFkZEphdmFEb2NTdHViQWN0aW9uLjEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gb3BlcmF0aW9uIGNhbmNlbGVkCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvQWRkSmF2YURvY1N0dWJPcGVyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9BZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGRlNjA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9BZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lclRvVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5Kc0pmYWNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFkZEphdmFEb2NTdHViT3BlcmF0aW9uIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZXh0LmNvZGVtYW5pcHVsYXRpb24uQWRkSmF2YURvY1N0dWJPcGVyYXRpb24gewotCXByaXZhdGUgSURvY3VtZW50IGNvcHk7Ci0JLyoqCi0JICogQHBhcmFtIG1lbWJlcnMKLQkgKi8KLQlwcml2YXRlIEpzSmZhY2VOb2RlIG5vZGU7Ci0JcHJpdmF0ZSBEb2N1bWVudENoYW5nZUxpc3RlbmVyVG9UZXh0RWRpdCB0ZXh0RWRpdExpc3RlbmVyOwotCQotCXB1YmxpYyBBZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbihJTWVtYmVyW10gbWVtYmVycywgSnNKZmFjZU5vZGUgbm9kZSkgewotCQlzdXBlcihtZW1iZXJzKTsKLQkJdGhpcy5ub2RlID0gbm9kZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYXBwbHlDaGFuZ2VzKCkgewotCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXRyeSB7Ci0JCQlNdWx0aVRleHRFZGl0IGVkaXRzID0gdGV4dEVkaXRMaXN0ZW5lci5nZXRUZXh0RWRpdHMoKTsKLQkJCW1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvYyk7Ci0JCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIE1lc3NhZ2VzLmdldFN0cmluZygiQWRkSmF2YURvY1N0dWJPcGVyYXRpb24uMCIpLCBNZXNzYWdlcy5nZXRTdHJpbmcoIkFkZEphdmFEb2NTdHViT3BlcmF0aW9uLjEiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZWRpdHMuYXBwbHkoZG9jKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZXh0LmNvZGVtYW5pcHVsYXRpb24uQWRkSmF2YURvY1N0dWJPcGVyYXRpb24jZ2V0RG9jdW1lbnQob3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFVuaXQsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQkKLQlwcm90ZWN0ZWQgSURvY3VtZW50IGdldERvY3VtZW50KElKYXZhU2NyaXB0VW5pdCBjdSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRKYXZhRG9jdW1lbnRGcm9tTm9kZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURvY3VtZW50IGdldEphdmFEb2N1bWVudEZyb21Ob2RlKCkgewotCQlpZiAoY29weSA9PSBudWxsKSB7Ci0JCQlJSnNUcmFuc2xhdGlvbiB0cmFuID0gbm9kZS5nZXRUcmFuc2xhdGlvbigpOwotCQkJY29weSA9IG5ldyBEb2N1bWVudCh0cmFuLmdldEpzVGV4dCgpKTsKLQkJCXRleHRFZGl0TGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lclRvVGV4dEVkaXQoKTsKLQkJCWNvcHkuYWRkRG9jdW1lbnRMaXN0ZW5lcih0ZXh0RWRpdExpc3RlbmVyKTsKLQkJfQotCQlyZXR1cm4gY29weTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJc3VwZXIucnVuKG1vbml0b3IpOwotCQlhcHBseUNoYW5nZXMoKTsKLQkJLyogbmVlZCB0byBhcHBseSB0aGUgdGV4dCBlZGl0cyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBkb2MgKi8KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvRmluZFJlZmVyZW5jZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGE0YzcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEZpbmRSZWZlcmVuY2VzQWN0aW9uIGV4dGVuZHMgSnNFbGVtZW50QWN0aW9uUHJveHkgewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuSnNFbGVtZW50QWN0aW9uUHJveHkjZ2V0UnVuQXJncyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0UnVuQXJncyhJQWN0aW9uIGFjdGlvbikgewotCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudHNbXSA9IEpzRWxlbWVudEFjdGlvblByb3h5LmdldEpzRWxlbWVudHNGcm9tU2VsZWN0aW9uKGdldEN1cnJlbnRTZWxlY3Rpb24oKSk7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLQkJCXJldHVybiBuZXcgT2JqZWN0W10geyBlbGVtZW50c1swXSB9OwotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLkpzRWxlbWVudEFjdGlvblByb3h5I2dldFJ1bkFyZ1R5cGVzKCkKLQkgKi8KLQkKLQlwdWJsaWMgQ2xhc3NbXSBnZXRSdW5BcmdUeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tdIHsgSUphdmFTY3JpcHRFbGVtZW50LmNsYXNzIH07Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOGY0MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uIGV4dGVuZHMgRmluZFJlZmVyZW5jZXNBY3Rpb24gewotCQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQl0cnkgewotCQkJT2JqZWN0IGhhbmRsZXIgPSBnZXRBY3Rpb25IYW5kbGVyKGFjdGlvbik7Ci0JCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudHNbXSA9IEpzRWxlbWVudEFjdGlvblByb3h5LmdldEpzRWxlbWVudHNGcm9tU2VsZWN0aW9uKGdldEN1cnJlbnRTZWxlY3Rpb24oKSk7Ci0JCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5sZW5ndGggPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVNpbXBsZUpTRFRBY3Rpb25Qcm94eS5leGVjdXRlTWV0aG9kKGhhbmRsZXIsICJydW4iLCBuZXcgQ2xhc3NbXSB7IElKYXZhU2NyaXB0RWxlbWVudC5jbGFzcyB9LCBuZXcgT2JqZWN0W10geyBlbGVtZW50c1swXSB9KTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJLy8gSWYgdXNlciBkb2Vzbid0IHNlbGVjdCBhIHdvcmtpbmcgc2V0IGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gc28gd2UKLQkJCS8vIHdvbnQgcHJpbnQgc3RhY2sgdHJhY2UgaGVyZQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0pzRWxlbWVudEFjdGlvblByb3h5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvSnNFbGVtZW50QWN0aW9uUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3NzFmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvSnNFbGVtZW50QWN0aW9uUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5JSmF2YVdlYk5vZGU7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKc0VsZW1lbnRBY3Rpb25Qcm94eSBleHRlbmRzIFNpbXBsZUpTRFRBY3Rpb25Qcm94eSB7Ci0JLyogVXRpbCBtZXRob2QgdG8gZ2V0IGFsbCB0aGUgamF2YSBlbGVtZW50cyBpbiBhIHNlbGVjdGlvbiAqLwotCXB1YmxpYyBzdGF0aWMgSUphdmFTY3JpcHRFbGVtZW50W10gZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElKYXZhU2NyaXB0RWxlbWVudFswXTsKLQkJfQotCQlBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSXRlcmF0b3IgaXR0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0dC5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0dC5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhV2ViTm9kZSkgewotCQkJCQllbGVtZW50cy5hZGQoKChJSmF2YVdlYk5vZGUpIGVsZW1lbnQpLmdldEphdmFFbGVtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAoSUphdmFTY3JpcHRFbGVtZW50W10pIGVsZW1lbnRzLnRvQXJyYXkobmV3IElKYXZhU2NyaXB0RWxlbWVudFtlbGVtZW50cy5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gbmV3IElKYXZhU2NyaXB0RWxlbWVudFswXTsKLQl9Ci0JCi0JCi0JcHVibGljIE9iamVjdFtdIGdldFJ1bkFyZ3MoSUFjdGlvbiBhY3Rpb24pIHsKLQkJLyoKLQkJICogTmVlZHMgdG8gcmV0dXJuIGFuIGFycmF5IG9mIElKYXZhRWxlbWVudHMuIFNpbmNlIGl0cyBvbmUgYXJnIG9mIHR5cGUKLQkJICogSUphdmFTY3JpcHRFbGVtZW50W10gbmVlZCB0byBwdXQgaW50byBhbiBvYmplY3QgYXJyYXkKLQkJICovCi0JCXJldHVybiBuZXcgT2JqZWN0W10geyBKc0VsZW1lbnRBY3Rpb25Qcm94eS5nZXRKc0VsZW1lbnRzRnJvbVNlbGVjdGlvbihnZXRDdXJyZW50U2VsZWN0aW9uKCkpIH07Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuU2ltcGxlSlNEVEFjdGlvblByb3h5I2dldFJ1bkFyZ1R5cGVzKCkKLQkgKi8KLQkKLQlwdWJsaWMgQ2xhc3NbXSBnZXRSdW5BcmdUeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tdIHsgKG5ldyBJSmF2YVNjcmlwdEVsZW1lbnRbMF0pLmdldENsYXNzKCkgfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmZhMTdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9PcGVuQ2FsbEhpZXJhcmNoeUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL09wZW5DYWxsSGllcmFyY2h5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MDgzYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL09wZW5DYWxsSGllcmFyY2h5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkNhbGxIaWVyYXJjaHlBY3Rpb24gZXh0ZW5kcyBKc0VsZW1lbnRBY3Rpb25Qcm94eSB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5TaW1wbGVKU0RUQWN0aW9uUHJveHkjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSBlbGVtZW50cyA9IEpzRWxlbWVudEFjdGlvblByb3h5LmdldEpzRWxlbWVudHNGcm9tU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCS8qIE9wZW4gY2FsbCBoaWVyYXJjaHkgbmVlZHMgdG8gYmUgZGlzYWJsZWQgZm9yIFRZUEVzICovCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbGVtZW50c1tpXS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhU2NyaXB0RWxlbWVudC5UWVBFKSB7Ci0JCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgc2VsZWN0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvT3BlblR5cGVIaWVyYXJjaHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9PcGVuVHlwZUhpZXJhcmNoeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDVhNGM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9PcGVuVHlwZUhpZXJhcmNoeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuVHlwZUhpZXJhcmNoeSBleHRlbmRzIEpzRWxlbWVudEFjdGlvblByb3h5IHsKLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSBlbGVtZW50cyA9IEpzRWxlbWVudEFjdGlvblByb3h5LmdldEpzRWxlbWVudHNGcm9tU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCS8qIE9wZW4gY2FsbCBoaWVyYXJjaHkgbmVlZHMgdG8gYmUgZGlzYWJsZWQgZm9yIFRZUEVzICovCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbGVtZW50c1tpXS5nZXRFbGVtZW50VHlwZSgpICE9IElKYXZhU2NyaXB0RWxlbWVudC5UWVBFKSB7Ci0JCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgc2VsZWN0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU2hvd0hpc3RvcnlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9TaG93SGlzdG9yeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzhjMDJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9TaG93SGlzdG9yeUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnV0aWwuRXhjZXB0aW9uSGFuZGxlcjsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG93SGlzdG9yeUFjdGlvbiBleHRlbmRzIEpzRWxlbWVudEFjdGlvblByb3h5IHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0SG9zdFJlc291cmNlKElKYXZhU2NyaXB0RWxlbWVudCB2aXJ0dWFsRWxlbWVudCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gdmlydHVhbEVsZW1lbnQuZ2V0SmF2YVNjcmlwdFByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aCh2aXJ0dWFsRWxlbWVudC5nZXRIb3N0UGF0aCgpLmdldFBhdGgoKSk7Ci0JCUlSZXNvdXJjZSBob3N0ID0gcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihwYXRoKTsKLQkJcmV0dXJuIGhvc3Q7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudHNbXSA9IEpzRWxlbWVudEFjdGlvblByb3h5LmdldEpzRWxlbWVudHNGcm9tU2VsZWN0aW9uKGdldEN1cnJlbnRTZWxlY3Rpb24oKSk7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRzWzBdLmlzVmlydHVhbCgpKSB7Ci0JCQlyZXNvdXJjZSA9IGdldEhvc3RSZXNvdXJjZShlbGVtZW50c1swXSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXNvdXJjZSA9IGVsZW1lbnRzWzBdLmdldFJlc291cmNlKCk7Ci0JCX0KLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHRhcmdldFdvcmtiZW5jaFBhcnQuZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQkJCUlWaWV3UGFydCB2aWV3ID0gcGFnZS5zaG93VmlldyhJUGFnZUxheW91dC5JRF9SRVNfTkFWKTsKLQkJCWlmICh2aWV3IGluc3RhbmNlb2YgSVNldFNlbGVjdGlvblRhcmdldCkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocmVzb3VyY2UpOwotCQkJCSgoSVNldFNlbGVjdGlvblRhcmdldCkgdmlldykuc2VsZWN0UmV2ZWFsKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCUV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlKGUsIHRhcmdldFdvcmtiZW5jaFBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCksIE1lc3NhZ2VzLmdldFN0cmluZygiU2hvd0hpc3RvcnlBY3Rpb24uMCIpLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlNob3dIaXN0b3J5QWN0aW9uLjEiKSArIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnRzW10gPSBKc0VsZW1lbnRBY3Rpb25Qcm94eS5nZXRKc0VsZW1lbnRzRnJvbVNlbGVjdGlvbihnZXRDdXJyZW50U2VsZWN0aW9uKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZWxlbWVudHNbaV0uaXNWaXJ0dWFsKCkpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRIb3N0UmVzb3VyY2UoZWxlbWVudHNbaV0pOwotCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8ICFyZXNvdXJjZS5leGlzdHMoKSkgewotCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1Nob3dJbk5hdmlnYXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1Nob3dJbk5hdmlnYXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjhiOTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9TaG93SW5OYXZpZ2F0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNldFNlbGVjdGlvblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS51dGlsLkV4Y2VwdGlvbkhhbmRsZXI7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2hvd0luTmF2aWdhdG9yQWN0aW9uIGV4dGVuZHMgSnNFbGVtZW50QWN0aW9uUHJveHkgewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZSBnZXRIb3N0UmVzb3VyY2UoSUphdmFTY3JpcHRFbGVtZW50IHZpcnR1YWxFbGVtZW50KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB2aXJ0dWFsRWxlbWVudC5nZXRKYXZhU2NyaXB0UHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHZpcnR1YWxFbGVtZW50LmdldEhvc3RQYXRoKCkuZ2V0UGF0aCgpKTsKLQkJSVJlc291cmNlIGhvc3QgPSBwcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOwotCQlyZXR1cm4gaG9zdDsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50c1tdID0gSnNFbGVtZW50QWN0aW9uUHJveHkuZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAoZWxlbWVudHNbMF0uaXNWaXJ0dWFsKCkpIHsKLQkJCXJlc291cmNlID0gZ2V0SG9zdFJlc291cmNlKGVsZW1lbnRzWzBdKTsKLQkJfSBlbHNlIHsKLQkJCXJlc291cmNlID0gZWxlbWVudHNbMF0uZ2V0UmVzb3VyY2UoKTsKLQkJfQotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gdGFyZ2V0V29ya2JlbmNoUGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQkJSVZpZXdQYXJ0IHZpZXcgPSBwYWdlLnNob3dWaWV3KElQYWdlTGF5b3V0LklEX1JFU19OQVYpOwotCQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihyZXNvdXJjZSk7Ci0JCQkJKChJU2V0U2VsZWN0aW9uVGFyZ2V0KSB2aWV3KS5zZWxlY3RSZXZlYWwoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJRXhjZXB0aW9uSGFuZGxlci5oYW5kbGUoZSwgdGFyZ2V0V29ya2JlbmNoUGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJTaG93SW5OYXZpZ2F0b3JBY3Rpb24uMCIpLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlNob3dJbk5hdmlnYXRvckFjdGlvbi4xIikgKyBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50c1tdID0gSnNFbGVtZW50QWN0aW9uUHJveHkuZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVsZW1lbnRzW2ldLmlzVmlydHVhbCgpKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0SG9zdFJlc291cmNlKGVsZW1lbnRzW2ldKTsKLQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCB8fCAhcmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9TaG93SW5TY3JpcHRFeHBsb3JlckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1Nob3dJblNjcmlwdEV4cGxvcmVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5OWVhMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1Nob3dJblNjcmlwdEV4cGxvcmVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTZXRTZWxlY3Rpb25UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkucGFja2FnZXZpZXcuUGFja2FnZUV4cGxvcmVyUGFydDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNob3dJblNjcmlwdEV4cGxvcmVyQWN0aW9uIGV4dGVuZHMgSnNFbGVtZW50QWN0aW9uUHJveHkgewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZSBnZXRIb3N0UmVzb3VyY2UoSUphdmFTY3JpcHRFbGVtZW50IHZpcnR1YWxFbGVtZW50KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB2aXJ0dWFsRWxlbWVudC5nZXRKYXZhU2NyaXB0UHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHZpcnR1YWxFbGVtZW50LmdldEhvc3RQYXRoKCkuZ2V0UGF0aCgpKTsKLQkJSVJlc291cmNlIGhvc3QgPSBwcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOwotCQlyZXR1cm4gaG9zdDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5Kc0VsZW1lbnRBY3Rpb25Qcm94eSNnZXRSdW5BcmdzKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRSdW5BcmdzKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50c1tdID0gSnNFbGVtZW50QWN0aW9uUHJveHkuZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGVsZW1lbnRzWzBdIH07Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuSnNFbGVtZW50QWN0aW9uUHJveHkjZ2V0UnVuQXJnVHlwZXMoKQotCSAqLwotCQotCXB1YmxpYyBDbGFzc1tdIGdldFJ1bkFyZ1R5cGVzKCkgewotCQlyZXR1cm4gbmV3IENsYXNzW10geyBJSmF2YVNjcmlwdEVsZW1lbnQuY2xhc3MgfTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50c1tdID0gSnNFbGVtZW50QWN0aW9uUHJveHkuZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAoZWxlbWVudHNbMF0uaXNWaXJ0dWFsKCkpIHsKLQkJCXJlc291cmNlID0gZ2V0SG9zdFJlc291cmNlKGVsZW1lbnRzWzBdKTsKLQkJfSBlbHNlIHsKLQkJCXJlc291cmNlID0gZWxlbWVudHNbMF0uZ2V0UmVzb3VyY2UoKTsKLQkJfQotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlQYWNrYWdlRXhwbG9yZXJQYXJ0IHZpZXcgPSBQYWNrYWdlRXhwbG9yZXJQYXJ0Lm9wZW5JbkFjdGl2ZVBlcnNwZWN0aXZlKCk7Ci0JCQl2aWV3LnRyeVRvUmV2ZWFsKHJlc291cmNlKTsKLS8vIElXb3JrYmVuY2hQYWdlIHBhZ2U9IHRhcmdldFdvcmtiZW5jaFBhcnQuZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLS8vIElWaWV3UGFydCB2aWV3PSBwYWdlLnNob3dWaWV3KElQYWdlTGF5b3V0LklEX1JFU19OQVYpOwotCQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihyZXNvdXJjZSk7Ci0JCQkJKChJU2V0U2VsZWN0aW9uVGFyZ2V0KSB2aWV3KS5zZWxlY3RSZXZlYWwoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlKGUsCi0JCQkvLyB0YXJnZXRXb3JrYmVuY2hQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpLCAiRXJyb3IgT3BlbmluZyBpbgotCQkJLy8gU2NyaXB0IFZpZXciLCAiRXJyb3Igd2hpbGUgZGlzcGxheWluZyBlbGVtZW50IGluIFNjcmlwdCBWaWV3OlxuIgotCQkJLy8gKyBlKTsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnRzW10gPSBKc0VsZW1lbnRBY3Rpb25Qcm94eS5nZXRKc0VsZW1lbnRzRnJvbVNlbGVjdGlvbihnZXRDdXJyZW50U2VsZWN0aW9uKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZWxlbWVudHNbaV0uaXNWaXJ0dWFsKCkpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRIb3N0UmVzb3VyY2UoZWxlbWVudHNbaV0pOwotCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8ICFyZXNvdXJjZS5leGlzdHMoKSkgewotCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1NpbXBsZUpTRFRBY3Rpb25Qcm94eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1NpbXBsZUpTRFRBY3Rpb25Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDI0YjcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9TaW1wbGVKU0RUQWN0aW9uUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkpzSmZhY2VOb2RlOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlSlNEVEFjdGlvblByb3h5IGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCBoYW5kbGVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBwYXJhbWF0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1hdGVyVmFsdWVzKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sCi0JCQlOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCUNsYXNzIHRhcmdldCA9IGhhbmRsZXIuZ2V0Q2xhc3MoKTsKLQkJTWV0aG9kIG0gPSB0YXJnZXQuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtYXRlclR5cGVzKTsKLQkJcmV0dXJuIG0uaW52b2tlKGhhbmRsZXIsIHBhcmFtYXRlclZhbHVlcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSnNKZmFjZU5vZGVbXSBnZXRKc0pmYWNlTm9kZXNGcm9tU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBKc0pmYWNlTm9kZVswXTsKLQkJfQotCQlBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSXRlcmF0b3IgaXR0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0dC5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0dC5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBKc0pmYWNlTm9kZSkgewotCQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIChKc0pmYWNlTm9kZVtdKSBlbGVtZW50cy50b0FycmF5KG5ldyBKc0pmYWNlTm9kZVtlbGVtZW50cy5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gbmV3IEpzSmZhY2VOb2RlWzBdOwotCX0KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdGlvbkhhbmRsZXJUYXJnZXQ7Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb247Ci0JcHJvdGVjdGVkIElBY3Rpb24gaGFuZGxlclRhcmdldEFjdGlvbjsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0V29ya2JlbmNoUGFydDsKLQkKLQlwdWJsaWMgU2ltcGxlSlNEVEFjdGlvblByb3h5KCkge30KLQkKLQkvKgotCSAqIE1vc3QgaGFuZGxlcnMgbG9vayBmb3IgV29ya0JlbmNoU2l0ZSwgc28gd2UgY29udmVydCB0aGUgV29ya0JlbmNoUGFydCB0bwotCSAqIFdvcmtCZW5jaFNpdGUgZm9yIGluaXQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldEFjdGlvbkhhbmRsZXIoSUFjdGlvbiBhY3Rpb24pIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKLQkJCUludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkvKiBUYXJnZXQgY2xhc3MgaXMgY2FjaGVkICovCi0JCWlmIChoYW5kbGVyVGFyZ2V0QWN0aW9uID09IGFjdGlvbiAmJiBhY3Rpb25IYW5kbGVyVGFyZ2V0ICE9IG51bGwpIHsKLQkJCXJldHVybiBhY3Rpb25IYW5kbGVyVGFyZ2V0OwotCQl9Ci0JCUNsYXNzIHRhcmdldCA9IG51bGw7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBnZXRBY3Rpb25IYW5kbGVyQ2xhc3NOYW1lKGFjdGlvbik7Ci0JCXRyeSB7Ci0JCQl0YXJnZXQgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IuLiBDbGFzcyB0YXJnZXQgb2YgYWN0aW9uIGhhbmRsZXIgbm90IGZvdW5kOiAiICsgYWN0aW9uKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlcy5nZXRTdHJpbmcoIlNpbXBsZUpTRFRBY3Rpb25Qcm94eS4wIikgKyBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyB1c2UgdGhlIGxvYWRlZCBjbGFzcwotCQlDbGFzc1tdIHR5cGVzID0gbmV3IENsYXNzW10geyBJV29ya2JlbmNoU2l0ZS5jbGFzcyB9OwotCQlDb25zdHJ1Y3RvciBjb25zID0gdGFyZ2V0LmdldENvbnN0cnVjdG9yKHR5cGVzKTsKLQkJT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7IHRhcmdldFdvcmtiZW5jaFBhcnQuZ2V0U2l0ZSgpIH07Ci0JCQotCQlhY3Rpb25IYW5kbGVyVGFyZ2V0ID0gY29ucy5uZXdJbnN0YW5jZShhcmdzKTsKLQkJaGFuZGxlclRhcmdldEFjdGlvbiA9IGFjdGlvbjsKLQkJcmV0dXJuIGFjdGlvbkhhbmRsZXJUYXJnZXQ7Ci0JfQotCQotCS8qCi0JICogRGVmYXVsdCB3YXkgb2YgZGV0ZXJtaW5pbmcgdGhlIGFjdGlvbiBoYW5kbGVycyBjbGFzcyBuYW1lLi4gbWF5IGJlCi0JICogc3ViY2xhc3NlZC9vdmVycmlkZGVuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBY3Rpb25IYW5kbGVyQ2xhc3NOYW1lKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXJldHVybiBhY3Rpb24uZ2V0SWQoKTsKLQl9Ci0JCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb247Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRSdW5BcmdzKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0W10geyBnZXRDdXJyZW50U2VsZWN0aW9uKCkgfTsKLQl9Ci0JCi0JcHVibGljIENsYXNzW10gZ2V0UnVuQXJnVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXSB7IElTdHJ1Y3R1cmVkU2VsZWN0aW9uLmNsYXNzIH07Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRTZWxlY3Rpb25DaGFuZ2VBcmdzKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgZ2V0Q3VycmVudFNlbGVjdGlvbigpIH07Ci0JfQotCQotCXB1YmxpYyBDbGFzc1tdIGdldFNlbGVjdGlvbkNoYW5nZUFyZ1R5cGVzKCkgewotCQlyZXR1cm4gbmV3IENsYXNzW10geyBJU3RydWN0dXJlZFNlbGVjdGlvbi5jbGFzcyB9OwotCX0KLQkKLQkvKgotCSAqIEdlbmVyaWMgcmVmbGVjdGlvbiB1dGlsIG1ldGhvZCB0byBleGVjdXRlIGEgbmFtZWQgbWV0aG9kIHdpdGggdW5rbm93bgotCSAqIHBhcmFtYXRlcnMgb24gYW4gb2JqZWN0Ci0JICovCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQl0cnkgewotCQkJT2JqZWN0IGhhbmRsZXIgPSBnZXRBY3Rpb25IYW5kbGVyKGFjdGlvbik7Ci0JCQlTaW1wbGVKU0RUQWN0aW9uUHJveHkuZXhlY3V0ZU1ldGhvZChoYW5kbGVyLCAicnVuIiwgZ2V0UnVuQXJnVHlwZXMoKSwgZ2V0UnVuQXJncyhhY3Rpb24pKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJaWYodGFyZ2V0V29ya2JlbmNoUGFydD09bnVsbCkgcmV0dXJuOwotCQkKLQkJdHJ5IHsKLQkJCU9iamVjdCBoYW5kbGVyID0gZ2V0QWN0aW9uSGFuZGxlcihhY3Rpb24pOwotCQkJU2ltcGxlSlNEVEFjdGlvblByb3h5LmV4ZWN1dGVNZXRob2QoaGFuZGxlciwgInNlbGVjdGlvbkNoYW5nZWQiLCBnZXRTZWxlY3Rpb25DaGFuZ2VBcmdUeXBlcygpLCBnZXRTZWxlY3Rpb25DaGFuZ2VBcmdzKGFjdGlvbiwgc2VsZWN0aW9uKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCXRoaXMudGFyZ2V0V29ya2JlbmNoUGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLmN1cnJlbnRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1NvdXJjZUFjdGlvbnNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9Tb3VyY2VBY3Rpb25zQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ODE1ZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1NvdXJjZUFjdGlvbnNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU291cmNlQWN0aW9uc0FjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1N0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1N0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Njc3ZWU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklKYXZhV2ViTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUuSnNKZmFjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBBUFBFTkRfTkVXX0xJTkVTX1RPX0NPUFkgPSB0cnVlOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPUFkgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmNvcHkiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VUID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5jdXQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5kZWxldGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBORVdfTElORSA9ICdcbic7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTVEVfQUZURVIgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnBhc3RlLmFmdGVyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1RFX0JFRk9SRSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkucGFzdGUuYmVmb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXByaXZhdGUgdm9pZCBjb3B5KElBY3Rpb24gYWN0aW9uKSB7Ci0JCUpzSmZhY2VOb2RlW10gbm9kZXMgPSBwYXJzZVNlbGVjdGlvbigpOwotCQlpZiAobm9kZXMgPT0gbnVsbCB8fCBub2Rlcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUNsaXBib2FyZCBjbGlwYm9hcmQgPSBudWxsOwotCQlTdHJpbmdCdWZmZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKFN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5BUFBFTkRfTkVXX0xJTkVTX1RPX0NPUFkpIHsKLQkJCXRleHQuYXBwZW5kKFN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5ORVdfTElORSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlKc0pmYWNlTm9kZSBjdXJyZW50Tm9kZSA9IG5vZGVzW2ldOwotCQkJCWludCBzdGFydCA9IGN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGxlbmd0aCA9IGN1cnJlbnROb2RlLmdldExlbmd0aCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gY3VycmVudE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIGVsZW1lbnRUZXh0ID0gZG9jLmdldChzdGFydCwgbGVuZ3RoKTsKLQkJCQkJdGV4dC5hcHBlbmQoZWxlbWVudFRleHQpOwotCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCWlmIChTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uQVBQRU5EX05FV19MSU5FU19UT19DT1BZKSB7Ci0JCQkJCXRleHQuYXBwZW5kKFN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5ORVdfTElORSk7Ci0JCQkJfQotCQkJCWNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQkJCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgT2JqZWN0W10geyB0ZXh0LnRvU3RyaW5nKCkgfSwgbmV3IFRyYW5zZmVyW10geyBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjbGlwYm9hcmQgIT0gbnVsbCkgewotCQkJCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZShJQWN0aW9uIGFjdGlvbikgewotCQlKc0pmYWNlTm9kZVtdIG5vZGVzID0gcGFyc2VTZWxlY3Rpb24oKTsKLQkJaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50IGxhc3REb2MgPSBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJaW50IHN0YXJ0OwotCQkJaW50IGxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlKc0pmYWNlTm9kZSBjdXJyZW50Tm9kZSA9IG5vZGVzW2ldOwotCQkJCXN0YXJ0ID0gY3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlsZW5ndGggPSBjdXJyZW50Tm9kZS5nZXRMZW5ndGgoKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IGN1cnJlbnROb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCWlmIChkb2MgIT0gbGFzdERvYykgewotCQkJCQlsYXN0RG9jID0gZG9jOwotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKGFjdGlvbik7Ci0JCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQl9Ci0JCQkJCWlmIChtb2RlbE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQkJbW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jKTsKLQkJCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcoYWN0aW9uLCAiRGVsZXRlIEphdmFTY3JpcHQgRWxlbWVudCIsICJEZWxldGUgSmF2YVNjcmlwdCBFbGVtZW50Iik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZG9jLnJlcGxhY2VUZXh0KGFjdGlvbiwgc3RhcnQsIGxlbmd0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQltb2RlbC5lbmRSZWNvcmRpbmcoYWN0aW9uKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlcy5nZXRTdHJpbmcoIlN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi44IikgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIEpzSmZhY2VOb2RlW10gcGFyc2VTZWxlY3Rpb24oKSB7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBKc0pmYWNlTm9kZVswXTsKLQkJfQotCQlBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSXRlcmF0b3IgaXR0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0dC5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0dC5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhV2ViTm9kZSkgewotCQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIChKc0pmYWNlTm9kZVtdKSBlbGVtZW50cy50b0FycmF5KG5ldyBKc0pmYWNlTm9kZVtlbGVtZW50cy5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gbmV3IEpzSmZhY2VOb2RlWzBdOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcGFzdGUoSUFjdGlvbiBhY3Rpb24sIGJvb2xlYW4gYXRFbmQpIHsKLQkJSnNKZmFjZU5vZGVbXSBub2RlcyA9IHBhcnNlU2VsZWN0aW9uKCk7Ci0JCWlmIChub2RlcyA9PSBudWxsIHx8IG5vZGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IHN0YXJ0T2ZQYXN0ZSA9IC0xOwotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IG51bGw7Ci0JCS8qIEZpZ3VyZSBvdXQgd2hlcmUgdG8gcGFzdGUgdGhlIGNvbnRlbnQgKi8KLQkJaWYgKGF0RW5kKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKChub2Rlc1tpXS5nZXRTdGFydE9mZnNldCgpICsgbm9kZXNbaV0uZ2V0TGVuZ3RoKCkpID4gc3RhcnRPZlBhc3RlKSB7Ci0JCQkJCXN0YXJ0T2ZQYXN0ZSA9IChub2Rlc1tpXS5nZXRTdGFydE9mZnNldCgpICsgbm9kZXNbaV0uZ2V0TGVuZ3RoKCkpOwotCQkJCQlkb2MgPSBub2Rlc1tpXS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKChub2Rlc1tpXS5nZXRTdGFydE9mZnNldCgpIDwgc3RhcnRPZlBhc3RlIHx8IHN0YXJ0T2ZQYXN0ZSA8IDApKSB7Ci0JCQkJCXN0YXJ0T2ZQYXN0ZSA9IG5vZGVzW2ldLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWRvYyA9IG5vZGVzW2ldLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlDbGlwYm9hcmQgY2xpcGJvYXJkID0gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQkJU3RyaW5nIHBhc3RlU3RyaW5nID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCW1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvYyk7Ci0JCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKGFjdGlvbiwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uOSIpICsgKGF0RW5kID8gTWVzc2FnZXMuZ2V0U3RyaW5nKCJTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTAiKSA6IE1lc3NhZ2VzLmdldFN0cmluZygiU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjExIikpICsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTIiKSwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTMiKSArIChhdEVuZCA/IE1lc3NhZ2VzLmdldFN0cmluZygiU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjE0IikgOiBNZXNzYWdlcy5nZXRTdHJpbmcoIlN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi4xNSIpKSArIE1lc3NhZ2VzLmdldFN0cmluZygiU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjE2IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCWRvYy5yZXBsYWNlVGV4dChhY3Rpb24sIHN0YXJ0T2ZQYXN0ZSwgMCwgcGFzdGVTdHJpbmcpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNsaXBib2FyZCAhPSBudWxsKSB7Ci0JCQkJY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwuZW5kUmVjb3JkaW5nKGFjdGlvbik7Ci0JCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uLmdldElkKCkuZXF1YWxzKFN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5DVVQpKSB7Ci0JCQljb3B5KGFjdGlvbik7Ci0JCQlkZWxldGUoYWN0aW9uKTsKLQkJfSBlbHNlIGlmIChhY3Rpb24uZ2V0SWQoKS5lcXVhbHMoU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLkNPUFkpKSB7Ci0JCQljb3B5KGFjdGlvbik7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uLmdldElkKCkuZXF1YWxzKFN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5QQVNURV9CRUZPUkUpKSB7Ci0JCQlwYXN0ZShhY3Rpb24sIGZhbHNlKTsKLQkJfSBlbHNlIGlmIChhY3Rpb24uZ2V0SWQoKS5lcXVhbHMoU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLlBBU1RFX0FGVEVSKSkgewotCQkJcGFzdGUoYWN0aW9uLCB0cnVlKTsKLQkJfSBlbHNlIGlmIChhY3Rpb24uZ2V0SWQoKS5lcXVhbHMoU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLkRFTEVURSkpIHsKLQkJCWRlbGV0ZShhY3Rpb24pOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7fQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg5Yjc2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uOD1FcnJvciBpbiBTdGFuZGFyZCBFZGl0b3IgQWN0aW9uIDogCi1TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uOT1JbnNlcnQgVGV4dCAKLVN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi4xMD1iZWZvcmUKLVN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi4xMT1hZnRlcgotU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjEyPVwgYSBKYXZhU2NyaXB0IEVsZW1lbnQuCi1TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTM9SW5zZXJ0IFRleHQgCi1TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTQ9YmVmb3JlCi1TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTU9YWZ0ZXIKLVN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi4xNj1cIGEgSmF2YVNjcmlwdCBFbGVtZW50LgotU2ltcGxlSlNEVEFjdGlvblByb3h5LjA9RXhjZXB0aW9uIDogCi1TaG93SGlzdG9yeUFjdGlvbi4wPUVycm9yIE9wZW5pbmcgaW4gU2NyaXB0IFZpZXcKLVNob3dIaXN0b3J5QWN0aW9uLjE9RXJyb3Igd2hpbGUgZGlzcGxheWluZyBlbGVtZW50IGluIFNjcmlwdCBWaWV3OlxuCi1TaG93SW5OYXZpZ2F0b3JBY3Rpb24uMD1FcnJvciBPcGVuaW5nIGluIFNjcmlwdCBWaWV3Ci1TaG93SW5OYXZpZ2F0b3JBY3Rpb24uMT1FcnJvciB3aGlsZSBkaXNwbGF5aW5nIGVsZW1lbnQgaW4gU2NyaXB0IFZpZXc6XG4KLUFkZEphdmFEb2NTdHViQWN0aW9uLjA9SmF2YVNjcmlwdCBEb2MKLUFkZEphdmFEb2NTdHViQWN0aW9uLjE9RXJyb3Igd2hpbGUgYWRkaW5nIGNvbW1lbnQKLUFkZEphdmFEb2NTdHViT3BlcmF0aW9uLjA9R2VuZXJhdGUgSnNEb2MKLUFkZEphdmFEb2NTdHViT3BlcmF0aW9uLjE9R2VuZXJhdGUgSnNEb2MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvY29udGVudGFzc2lzdC9KU0RUU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvY29udGVudGFzc2lzdC9KU0RUU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4YTc0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2NvbnRlbnRhc3Npc3QvSlNEVFN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LlN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotCi0vKioKLSAqIDxwPkNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvciBmb3IgSmF2YXNjcmlwdCByZWdpb25zIHNvIHRoYXQgYXV0b2FjdGl2YXRpb24gd2lsbCB3b3JrIGluIHRob3NlIHJlZ2lvbnMuPC9wPgotICogCi0gKiA8cD48Yj5OT1RFOjwvYj4gVGhpcyBjbGFzcyBkb2VzIG5vdCBjaGVjayB0aGF0IHRoZSBnaXZlbiBwYXJ0aXRpb24gdHlwZSBpcyBhIGphdmFzY3JpcHQgcmVnaW9uLCBpdCBqdXN0Ci0gKiBhc3N1bWVzIGl0IGlzLCBzbyB0aGUgaW5zdGFudGlhdG9yIG9mIHRoaXMgY2xhc3MgbXVzdCBiZSBzdXJlIHRoZXkgd2FudCB0aGUgZ2l2ZW4gcGFydGl0aW9uIHR5cGUgdG8gYmUKLSAqIHRyZWF0ZWQgYXMgaWYgaXQgd2FzIEphdmFzY3JpcHQuPC9wPgotICovCi1wdWJsaWMgY2xhc3MgSlNEVFN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewotCS8qKiBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyAqLwotCXByaXZhdGUgY2hhcltdIGZDb21wbGV0aW9uUHJvcG9hc2xBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYXNzaXN0YW50IHtAbGluayBDb250ZW50QXNzaXN0YW50fSB0byB1c2UKLQkgKiBAcGFyYW0gcGFydGl0aW9uVHlwZUlEIHRoZSBKYXZhc2NyaXB0IHBhcnRpdGlvbiB0eXBlIHRoaXMgcHJvY2Vzc29yIGlzIGZvcgotCSAqIEBwYXJhbSB2aWV3ZXIge0BsaW5rIElUZXh0Vmlld2VyfSB0aGlzIHByb2Nlc3NvciBpcyBhY3RpbmcgaW4KLQkgKi8KLQlwdWJsaWMgSlNEVFN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yKENvbnRlbnRBc3Npc3RhbnQgYXNzaXN0YW50LAotCQkJU3RyaW5nIHBhcnRpdGlvblR5cGVJRCwgSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKGFzc2lzdGFudCwgcGFydGl0aW9uVHlwZUlELCB2aWV3ZXIsIFByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQkKLQkJLy9nZXQgdGhlIGN1cnJlbnQgdXNlciBwcmVmZXJlbmNlCi0JCWdldEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyUHJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIHRoaXMuZkNvbXBsZXRpb25Qcm9wb2FzbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyczsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IjcHJvcGVydHlDaGFuZ2UoCi0JICogCW9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCWlmKHByb3BlcnR5LmVxdWFscyhQcmVmZXJlbmNlQ29uc3RhbnRzLkNPREVBU1NJU1RfQVVUT0FDVElWQVRJT04pIHx8Ci0JCQkJcHJvcGVydHkuZXF1YWxzKFByZWZlcmVuY2VDb25zdGFudHMuQ09ERUFTU0lTVF9BVVRPQUNUSVZBVElPTl9UUklHR0VSU19KQVZBKSkgewotCQkJCi0JCQlnZXRBdXRvQWN0aXZhdGlvbkNoYXJhY3RlclByZWZlcmVuY2VzKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+R2V0cyB0aGUgYXV0byBhY3RpdmF0aW9uIGNoYXJhY3RlciB1c2VyIHByZWZlcmVuY2VzIGZvciBKYXZhc2NyaXB0IGFuZCBzdG9yZXMgdGhlbSBmb3IgbGF0ZXIgdXNlPC9wPgotCSAqLwotCXByaXZhdGUgdm9pZCBnZXRBdXRvQWN0aXZhdGlvbkNoYXJhY3RlclByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQotCQlib29sZWFuIGRvQXV0byA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5DT0RFQVNTSVNUX0FVVE9BQ1RJVkFUSU9OKTsKLQkJaWYgKGRvQXV0bykgewotCQkJZkNvbXBsZXRpb25Qcm9wb2FzbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycyA9Ci0JCQkJc3RvcmUuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuQ09ERUFTU0lTVF9BVVRPQUNUSVZBVElPTl9UUklHR0VSU19KQVZBKS50b0NoYXJBcnJheSgpOwotCQl9IGVsc2UgewotCQkJZkNvbXBsZXRpb25Qcm9wb2FzbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycyA9IG51bGw7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9JQWN0aW9uQ29uc3RhbnRzSnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSUFjdGlvbkNvbnN0YW50c0pzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMWFmNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9JQWN0aW9uQ29uc3RhbnRzSnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aW9uQ29uc3RhbnRzSnMgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX01PVkVfRUxFTUVOVCA9ICJNb3ZlRWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9SRU5BTUVfRUxFTUVOVCA9ICJSZW5hbWVFbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9JQWN0aW9uRGVmaW5pdGlvbklkc0pzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0lBY3Rpb25EZWZpbml0aW9uSWRzSnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE2MTY4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0lBY3Rpb25EZWZpbml0aW9uSWRzSnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuYWN0aW9ucy5JSmF2YUVkaXRvckFjdGlvbkRlZmluaXRpb25JZHM7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvbkRlZmluaXRpb25JZHNKcyB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTU9WRV9FTEVNRU5UID0gSUphdmFFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLk1PVkVfRUxFTUVOVDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRU5BTUVfRUxFTUVOVCA9IElKYXZhRWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5SRU5BTUVfRUxFTUVOVDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSlNQVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSlNQVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNiNWQyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0pTUFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBUaGUgZm9sbG93aW5nIGxpbmUgaXMgYSBzYW1wbGUgSlNQIGRvY3VtZW50LiAgUGxlYXNlIHRyYW5zbGF0ZSBvbmx5IHRoZSBmb2xsb3dpbmcgcGFydHM6Ci0jIyBVc2UgYmVsb3cgdGFncyBPTkxZIGZvciBKU1AgMS4xCi0jIyBXZWxjb21lIQotIyMgVXNlIGJlbG93IHRhZ3MgT05MWSBmb3IgSlNQIDEuMgotIyMgV2VsY29tZSEKLVNhbXBsZV9KU1BfZG9jPTwlQCBwYWdlIFxuXHRsYW5ndWFnZT1cImphdmFcIiBcblx0Y29udGVudFR5cGU9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMVwiXG4lPlxuPGpzcDppbmNsdWRlIGZsdXNoPVwidHJ1ZVwiIHBhZ2U9XCJ0aXRsZUJhci5qc3BcIi8+XG5cbjwlLS0gVXNlIGJlbG93IHRhZ3MgT05MWSBmb3IgSlNQIDEuMSAtLSU+XG48JVxuXHRTeXN0ZW0ub3V0LnByaW50bG4oXCJXZWxjb21lIVwiKTtcbiU+XG48JS0tIFVzZSBiZWxvdyB0YWdzIE9OTFkgZm9yIEpTUCAxLjIgLS0lPlxuPGpzcDpzY3JpcHRsZXQ+XG5cdFN5c3RlbS5vdXQucHJpbnRsbihcIldlbGNvbWUhXCIpO1xuPC9qc3A6c2NyaXB0bGV0PgotSlNQX0RlbGltaXRlcnNfVUlfPUpTUCBEZWxpbWl0ZXJzCi1SZWZhY3Rvcl9sYWJlbD1SZWZhY3RvcgotUmVuYW1lRWxlbWVudF9sYWJlbD1SZW5hbWUKLU1vdmVFbGVtZW50X2xhYmVsPU1vdmUKLU1vdmVFbGVtZW50V2l6YXJkPU1vdmUgdGhlIHNlbGVjdGVkIGVsZW1lbnRzCi0jCi1PSz1PSwotSlNQX2NoYW5nZXM9SlNQIGNoYW5nZXMKLUFjdGlvbkNvbnRyaWJ1dG9ySlNQXzA9UmVmYSZjdG9yCi1KU1BSZW5hbWVFbGVtZW50QWN0aW9uXzA9RWRpdG9yIHNlbGVjdGlvbiBkb2VzIG5vdCByZXNvbHZlIHRvIGEgcmVuYW1hYmxlIEphdmEgZWxlbWVudAotSlNQTW92ZUVsZW1lbnRBY3Rpb25fMD1FZGl0b3Igc2VsZWN0aW9uIGRvZXMgbm90IHJlc29sdmUgdG8gbW92YWJsZSBKYXZhIGVsZW1lbnRzCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzA9SlNQIFJlbmFtZQotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8xPWluIGZpbGU6IHswfSBsaW5lOiB7MX0KLUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMj1Nb3ZlIFR5cGUgJyd7MH0nJyB0byBwYWNrYWdlICcnezF9JycKLUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMz1SZW5hbWUgTWV0aG9kICcnezB9JycgdG8gJyd7MX0nJwotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl80PVJlbmFtZSBUeXBlICcnezB9JycgdG8gJyd7MX0nJwotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl81PVJlbmFtZSBQYWNrYWdlICcnezB9JycgdG8gJyd7MX0nJwotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl82PUpTUCBSZW5hbWUgQ2hhbmdlCi0jCi1fVUlfV0laQVJEX05FV19USVRMRSA9IE5ldyBKYXZhU2VydmVyIFBhZ2UKLV9VSV9XSVpBUkRfTkVXX0hFQURJTkcgPSBKYXZhU2VydmVyIFBhZ2UKLV9VSV9XSVpBUkRfTkVXX0RFU0NSSVBUSU9OID0gQ3JlYXRlIGEgbmV3IEphdmFTZXJ2ZXIgUGFnZS4KLV9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9KU1AgPSBUaGUgZmlsZSBuYW1lIG11c3QgZW5kIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGV4dGVuc2lvbnMgezB9LiAKLV9XQVJOSU5HX0ZJTEVfTVVTVF9CRV9JTlNJREVfSkFWQV9QUk9KRUNUID0gSmF2YVNlcnZlciBQYWdlcyBjcmVhdGVkIGluIHByb2plY3RzIHRoYXQgZG8gbm90IHN1cHBvcnQgSmF2YSBtaWdodCBub3Qgd29yayBhcyBleHBlY3RlZC4gCi1fV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQgPSBGaWxlcyBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIFdlYiBDb250ZW50IGZvbGRlciB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB5b3VyIGRlcGxveWVkIFdlYiBhcHBsaWNhdGlvbi4gCi1SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHMgPSBUaGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8wPVNlbGVjdCBKU1AgVGVtcGxhdGUKLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMT1TZWxlY3QgYSB0ZW1wbGF0ZSBhcyBpbml0aWFsIGNvbnRlbnQgaW4gdGhlIEpTUCBwYWdlLgotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8yPU5hbWUKLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMz1EZXNjcmlwdGlvbgotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV80PVVzZSBKU1AgVGVtcGxhdGUKLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNT1QcmV2aWV3Ci1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzY9VGVtcGxhdGVzIGFyZSAnTmV3IEpTUCcgdGVtcGxhdGVzIGZvdW5kIGluIHRoZSA8YT5KU1AgVGVtcGxhdGVzPC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi0jIENvcGllZCBmcm9tIHNzZS51aQotQ2xlYW51cERvY3VtZW50X2xhYmVsPUNsZWFudXAgRG9jdW1lbnQuLi4KLUNsZWFudXBEb2N1bWVudF90b29sdGlwPUNsZWFudXAgRG9jdW1lbnQKLUNsZWFudXBEb2N1bWVudF9kZXNjcmlwdGlvbj1DbGVhbnVwIERvY3VtZW50Ci1Ub2dnbGVDb21tZW50X2xhYmVsPVRvZ2dsZSBDb21tZW50Ci1Ub2dnbGVDb21tZW50X3Rvb2x0aXA9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfZGVzY3JpcHRpb249VG9nZ2xlIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF9sYWJlbD1BZGQgQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X3Rvb2x0aXA9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbj1BZGQgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcD1SZW1vdmUgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uPVJlbW92ZSBCbG9jayBDb21tZW50Ci1GaW5kT2NjdXJyZW5jZXNfbGFiZWw9T2NjdXJyZW5jZXMgaW4gRmlsZQotT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8wPXswfSAtIHsxfSBPY2N1cnJlbmNlcyBpbiB7Mn0KLU9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMj1maWxlCi1Db250ZW50X0Fzc2lzdF9ub3RfYXZhaWxhYl9VSV89Q29udGVudCBBc3Npc3Qgbm90IGF2YWlsYWJsZSBhdCB0aGUgY3VycmVudCBsb2NhdGlvbgotSmF2YV9Db250ZW50X0Fzc2lzdF9pc19ub3RfVUlfPUphdmEgQ29udGVudCBBc3Npc3QgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhlIGN1cnJlbnQgY3Vyc29yIGxvY2F0aW9uCi0jCi1PdmVycmlkZV9tZXRob2RfaW49T3ZlcnJpZGUgbWV0aG9kIGluICcKLUNyZWF0aW5nX2ZpbGVzX2VuY29kaW5nPUNyZWF0aW5nIGZpbGVzIGVuY29kaW5nIHByZWZlcmVuY2UKLSMKLUpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzA9SlNQIFNvdXJjZSBwcmVmZXJlbmNlcyBhcmUgYmFzZWQgb24gdGhlIGNvbnRlbnQgd2l0aGluIHRoZSBKU1AuCi1KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8xPVNlZSA8YT4nJ3swfScnPC9hPiBmb3IgSlNQIHdpdGggSFRNTCBjb250ZW50LgotSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMj1TZWUgPGE+Jyd7MH0nJzwvYT4gZm9yIEpTUCB3aXRoIFhNTCBjb250ZW50LgotSlNQQ29sb3JQYWdlX2pzcF9jb250ZW50PUpTUCBDb250ZW50Ci1KU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzA9VmFsaWRhdGluZyBmaWxlcwotSlNQRmlsZXNQcmVmZXJlbmNlUGFnZV8xPVZhbGlkYXRlIEpTUCBmcmFnbWVudHMKLSMgSlNQIEZyYWdtZW50cwotSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wPW5vbmUKLUpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMT1UaGUgcHJvcGVydGllcyB1c2VkIGluc3RlYWQgb2YgdGhlIHBhZ2UgZGlyZWN0aXZlIHRoYXQgY2Fubm90IGJlIHNwZWNpZmllZCBpbiBKU1AgZnJhZ21lbnQgZmlsZXMuICBUaGUgcHJvamVjdCBzZXR0aW5nIGlzIHVzZWQgaWYgeW91IHNwZWNpZnkgIm5vbmUuIgotSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8yPUxhbmd1YWdlOgotSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8zPUNvbnRlbnQgVHlwZToKLUpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfND1FbmFibGUgc3BlY2lmaWMgc2V0dGluZzoKLVByb2plY3RKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA9VGhlIHByb3BlcnRpZXMgZm9yIEoyRUUgV2ViIHByb2plY3RzIGFjdCBhcyAicHJvamVjdCIgZGVmYXVsdCB0byBiZSBsb29rZWQgdXAgd2hlbiBubyBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQgZm9yIGEgcGFydGljdWxhciBKU1AgZnJhZ21lbnQgZmlsZS4KLSMgQ1NTIEpTUAotVGl0bGVfSW52YWxpZFZhbHVlPUludmFsaWQgVmFsdWUKLU1lc3NhZ2VfSW52YWxpZFZhbHVlPUludmFsaWQgcHJvcGVydHkgdmFsdWUuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0pzVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9Kc1VJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJkOWNmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0pzVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotIAotICovCi1wdWJsaWMgY2xhc3MgSnNVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfSlNQOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX0RFU0NSSVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1dBUk5JTkdfRklMRV9NVVNUX0JFX0lOU0lERV9KQVZBX1BST0pFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1dBUk5JTkdfRk9MREVSX01VU1RfQkVfSU5TSURFX1dFQl9DT05URU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGlvbkNvbnRyaWJ1dG9ySlNQXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzY7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5KU1BVSVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF9kZXNjcmlwdGlvbjsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudF9Bc3Npc3Rfbm90X2F2YWlsYWJfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0aW5nX2ZpbGVzX2VuY29kaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbmRPY2N1cnJlbmNlc19sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZlJlc291cmNlQnVuZGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphdmFfQ29udGVudF9Bc3Npc3RfaXNfbm90X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BfY2hhbmdlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BfRGVsaW1pdGVyc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQQ29sb3JQYWdlX2pzcF9jb250ZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRmlsZXNQcmVmZXJlbmNlUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BNb3ZlRWxlbWVudEFjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFJlbmFtZUVsZW1lbnRBY3Rpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXNzYWdlX0ludmFsaWRWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRWxlbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZUVsZW1lbnRXaXphcmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT0s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcnJpZGVfbWV0aG9kX2luOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVmYWN0b3JfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVFbGVtZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUdyb3VwX25hbWVFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2FtcGxlX0pTUF9kb2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGl0bGVfSW52YWxpZFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoSnNVSU1lc3NhZ2VzLkJVTkRMRV9OQU1FLCBKc1VJTWVzc2FnZXMuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKEpzVUlNZXNzYWdlcy5mUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotCQkJCUpzVUlNZXNzYWdlcy5mUmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoSnNVSU1lc3NhZ2VzLkJVTkRMRV9OQU1FKTsKLQkJCX0KLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCUpzVUlNZXNzYWdlcy5mUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiBKc1VJTWVzc2FnZXMuZlJlc291cmNlQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSnNVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9Kc1VJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYjgzNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9Kc1VJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLkphdmFTY3JpcHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSnNVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEpzVUlQbHVnaW4gaW5zdGFuY2UgPSBudWxsOwotCQotCXB1YmxpYyBzdGF0aWMgSnNVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gSnNVSVBsdWdpbi5pbnN0YW5jZTsKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSnNVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIEpzVUlQbHVnaW4uaW5zdGFuY2U7Ci0JfQotCS8qKgotCSAqIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBqc3AgZWRpdG9yLgotCSAqLwotCXByaXZhdGUgQ29udGV4dFR5cGVSZWdpc3RyeSBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBqc3AgZWRpdG9yLgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQkKLQlwdWJsaWMgSnNVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJSnNVSVBsdWdpbi5pbnN0YW5jZSA9IHRoaXM7Ci0JfQotCQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGdldEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBqc3AgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGpzcCBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpIHsKLQkJaWYgKGZDb250ZXh0VHlwZVJlZ2lzdHJ5ID09IG51bGwpIHsKLS8vIENvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcKLS8vIENvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkoKTsKLS8vIHJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuQUxMKTsKLS8vIHJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuTkVXKTsKLS8vIHJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuVEFHKTsKLS8vIHJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuQVRUUklCVVRFKTsKLS8vIHJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuQVRUUklCVVRFX1ZBTFVFKTsKLQkJCWZDb250ZXh0VHlwZVJlZ2lzdHJ5ID0gSmF2YVNjcmlwdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29kZVRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGpzcCBlZGl0b3IgdGVtcGxhdGVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUganNwIGVkaXRvciB0ZW1wbGF0ZXMKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGVTdG9yZSBnZXRUZW1wbGF0ZVN0b3JlKCkgewotCQlpZiAoZlRlbXBsYXRlU3RvcmUgPT0gbnVsbCkgewotLy8gZlRlbXBsYXRlU3RvcmUgPSBuZXcgQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZSgKLS8vIGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCksIGdldFByZWZlcmVuY2VTdG9yZSgpLAotLy8gSlNQVUlQcmVmZXJlbmNlTmFtZXMuVEVNUExBVEVTX0tFWSk7Ci0JCQlKYXZhU2NyaXB0UGx1Z2luIGpwID0gSmF2YVNjcmlwdFBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCQlmVGVtcGxhdGVTdG9yZSA9IGpwLmdldFRlbXBsYXRlU3RvcmUoKTsKLQkJCXRyeSB7Ci0JCQkJZlRlbXBsYXRlU3RvcmUubG9hZCgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZUZW1wbGF0ZVN0b3JlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJaW5zdGFuY2UgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzljNzUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIExvZ2dlci5FUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIExvZ2dlci5JTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgTG9nZ2VyLk9LOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBMb2dnZXIuV0FSTklORzsKLQkKLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBMb2dnZXIuT0tfREVCVUcgfHwgbGV2ZWwgPT0gTG9nZ2VyLklORk9fREVCVUcgfHwgbGV2ZWwgPT0gTG9nZ2VyLldBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gTG9nZ2VyLkVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIUxvZ2dlci5pc0RlYnVnZ2luZygpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRzoKLQkJCWNhc2UgSU5GTzoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHOgotCQkJY2FzZSBXQVJOSU5HOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHOgotCQkJY2FzZSBFUlJPUjoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgTG9nZ2VyLlBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoTG9nZ2VyLlBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoTG9nZ2VyLmlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIExvZ2dlci5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKExvZ2dlci5QTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQkKLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFMb2dnZXIuaXNEZWJ1Z2dpbmcoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKExvZ2dlci5QTFVHSU5fSUQgKyBMb2dnZXIuVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlMb2dnZXIuX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlMb2dnZXIuX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlMb2dnZXIuX2xvZyhMb2dnZXIuRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlMb2dnZXIuX2xvZyhMb2dnZXIuRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCUxvZ2dlci5fdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlMb2dnZXIuX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCUxvZ2dlci5fdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9hdXRvZWRpdC9BdXRvRWRpdFN0cmF0ZWd5Rm9ySnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvckpzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMWY5N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9hdXRvZWRpdC9BdXRvRWRpdFN0cmF0ZWd5Rm9ySnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmF1dG9lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuSmF2YUF1dG9JbmRlbnRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuU21hcnRTZW1pY29sb25BdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnRleHQuamF2YWRvYy5KYXZhRG9jQXV0b0luZGVudFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEF1dG9FZGl0U3RyYXRlZ3lGb3JKcyBpbXBsZW1lbnRzIElBdXRvRWRpdFN0cmF0ZWd5IHsKLQlwcml2YXRlIElBdXRvRWRpdFN0cmF0ZWd5W10gZlN0cmF0ZWdpZXM7Ci0JCi0JcHVibGljIEF1dG9FZGl0U3RyYXRlZ3lGb3JKcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJSUF1dG9FZGl0U3RyYXRlZ3lbXSBzdHJhdHMgPSBnZXRBdXRvRWRpdFN0cmF0ZWdpZXMoZG9jdW1lbnQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cmF0cy5sZW5ndGg7IGkrKykgewotCQkJc3RyYXRzW2ldLmN1c3RvbWl6ZURvY3VtZW50Q29tbWFuZChkb2N1bWVudCwgY29tbWFuZCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElBdXRvRWRpdFN0cmF0ZWd5W10gZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZlN0cmF0ZWdpZXMgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZTdHJhdGVnaWVzOwotCQl9Ci0JCVN0cmluZyBwYXJ0aXRpb25pbmcgPSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUOwotCQlmU3RyYXRlZ2llcyA9IG5ldyBJQXV0b0VkaXRTdHJhdGVneVtdIHsgbmV3IFNtYXJ0U2VtaWNvbG9uQXV0b0VkaXRTdHJhdGVneShwYXJ0aXRpb25pbmcpLAotCQkJCW5ldyBKYXZhQXV0b0luZGVudFN0cmF0ZWd5KHBhcnRpdGlvbmluZywgZ2V0SmF2YVByb2plY3QoZG9jdW1lbnQpLCBudWxsKSwgbmV3IEphdmFEb2NBdXRvSW5kZW50U3RyYXRlZ3kocGFydGl0aW9uaW5nKSB9OwotCQkvKiBuZXcgQXV0b0VkaXRTdHJhdGVneUZvclRhYnMoKSAqLwotCQlyZXR1cm4gZlN0cmF0ZWdpZXM7Ci0JfQotCQotCXByaXZhdGUgSUphdmFTY3JpcHRQcm9qZWN0IGdldEphdmFQcm9qZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJRE9NTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJSmF2YVNjcmlwdFByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJSVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOwotCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCQlpZiAoZmlsZVBhdGguc2VnbWVudENvdW50KCkgPiAwKSB7Ci0JCQkJcHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChmaWxlUGF0aC5zZWdtZW50KDApKTsKLQkJCX0KLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlqYXZhUHJvamVjdCA9IEphdmFTY3JpcHRDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGphdmFQcm9qZWN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhYjQ0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuYXV0b2VkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBBdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicyBpbXBsZW1lbnRzIElBdXRvRWRpdFN0cmF0ZWd5IHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBUQUJfQ0hBUkFDVEVSID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyB2b2lkIGN1c3RvbWl6ZURvY3VtZW50Q29tbWFuZChJRG9jdW1lbnQgZG9jdW1lbnQsIERvY3VtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCS8vIGlmIG5vdCBpbiBzbWFydCBpbnNlcnQgbW9kZSBqdXN0IGlnbm9yZQotCQlpZiAoIWlzU21hcnRJbnNlcnRNb2RlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBzcGFjZXMgZm9yIHRhYiBjaGFyYWN0ZXIKLQkJaWYgKGNvbW1hbmQubGVuZ3RoID09IDAgJiYgY29tbWFuZC50ZXh0ICE9IG51bGwgJiYgY29tbWFuZC50ZXh0Lmxlbmd0aCgpID4gMCAmJiBjb21tYW5kLnRleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSKSAhPSAtMSkgewotCQkJc21hcnRJbnNlcnRGb3JUYWIoY29tbWFuZCwgZG9jdW1lbnQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgaW5kZW50YXRpb24gd2lkdGggaWYgdXNpbmcgc3BhY2VzIGZvciBpbmRlbnRhdGlvbiwgLTEgb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGdldEluZGVudGF0aW9uV2lkdGgoKSB7Ci0JCWludCB3aWR0aCA9IC0xOwotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UuZXF1YWxzKHByZWZlcmVuY2VzLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKSkpIHsKLQkJCXdpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCQl9Ci0JCXJldHVybiB3aWR0aDsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsY3VsYXRlIG51bWJlciBvZiBzcGFjZXMgZm9yIG5leHQgdGFiIHN0b3AKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnRTdHJpbmcoaW50IGluZGVudGF0aW9uV2lkdGgsIGludCBsaW5lT2Zmc2V0LCBJTGluZVRyYWNrZXIgbGluZVRyYWNrZXIsIGludCBpbmRleCkgewotCQlpbnQgaW5kZW50U2l6ZSA9IGluZGVudGF0aW9uV2lkdGg7Ci0JCWludCBvZmZzZXRJbkxpbmUgPSAtMTsKLQkJaWYgKGxpbmVUcmFja2VyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiBsaW5lSW5mbyA9IGxpbmVUcmFja2VyLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGluZGV4KTsKLQkJCQlpZiAobGluZUluZm8uZ2V0T2Zmc2V0KCkgPT0gMCAmJiBsaW5lT2Zmc2V0ID4gLTEpIHsKLQkJCQkJb2Zmc2V0SW5MaW5lID0gbGluZU9mZnNldCArIGluZGV4OwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9mZnNldEluTGluZSA9IGluZGV4IC0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChsaW5lT2Zmc2V0ID4gLTEpIHsKLQkJCQlvZmZzZXRJbkxpbmUgPSBsaW5lT2Zmc2V0ICsgaW5kZXg7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9mZnNldEluTGluZSA+IC0xICYmIGluZGVudGF0aW9uV2lkdGggPiAwKSB7Ci0JCQlpbnQgcmVtYWluZGVyID0gb2Zmc2V0SW5MaW5lICUgaW5kZW50YXRpb25XaWR0aDsKLQkJCWluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoIC0gcmVtYWluZGVyOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50U2l6ZTsgaSsrKSB7Ci0JCQlpbmRlbnQuYXBwZW5kKCcgJyk7Ci0JCX0KLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdXAgYSBsaW5lIHRyYWNrZXIgZm9yIHRleHQgd2l0aGluIGNvbW1hbmQgaWYgdGV4dCBpcyBtdWx0aS1saW5lCi0JICovCi0JcHJpdmF0ZSBJTGluZVRyYWNrZXIgZ2V0TGluZVRyYWNrZXIoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgb3JpZ2luYWxUZXh0KSB7Ci0JCUNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyIGxpbmVUcmFja2VyID0gbnVsbDsKLQkJaW50W10gZGVsaW1zID0gVGV4dFV0aWxpdGllcy5pbmRleE9mKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSwgb3JpZ2luYWxUZXh0LCAwKTsKLQkJaWYgKGRlbGltc1swXSAhPSAtMSB8fCBkZWxpbXNbMV0gIT0gLTEpIHsKLQkJCWxpbmVUcmFja2VyID0gbmV3IENvbmZpZ3VyYWJsZUxpbmVUcmFja2VyKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSk7Ci0JCQlsaW5lVHJhY2tlci5zZXQob3JpZ2luYWxUZXh0KTsKLQkJfQotCQlyZXR1cm4gbGluZVRyYWNrZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGFjdGl2ZSBlZGl0b3IgaXMgaW4gc21hcnQgaW5zZXJ0IG1vZGUsIGZhbHNlIG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNTbWFydEluc2VydE1vZGUoKSB7Ci0JCWJvb2xlYW4gaXNTbWFydEluc2VydE1vZGUgPSBmYWxzZTsKLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvcjsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvci5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBjaGVjayBpZiBzbWFydCBpbnNlcnQgbW9kZQotCQlpZiAodGV4dEVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yRXh0ZW5zaW9uMyAmJiAoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpIHsKLQkJCWlzU21hcnRJbnNlcnRNb2RlID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gaXNTbWFydEluc2VydE1vZGU7Ci0JfQotCQotCS8qKgotCSAqIEluc2VydCBzcGFjZXMgZm9yIHRhYnMKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqLwotCXByaXZhdGUgdm9pZCBzbWFydEluc2VydEZvclRhYihEb2N1bWVudENvbW1hbmQgY29tbWFuZCwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIHRhYiBrZXkgd2FzIHByZXNzZWQuIG5vdyBjaGVjayBwcmVmZXJlbmNlcyB0byBzZWUgaWYgbmVlZCB0byBpbnNlcnQKLQkJLy8gc3BhY2VzIGluc3RlYWQgb2YgdGFiCi0JCWludCBpbmRlbnRhdGlvbldpZHRoID0gZ2V0SW5kZW50YXRpb25XaWR0aCgpOwotCQlpZiAoaW5kZW50YXRpb25XaWR0aCA+IC0xKSB7Ci0JCQlTdHJpbmcgb3JpZ2luYWxUZXh0ID0gY29tbWFuZC50ZXh0OwotCQkJU3RyaW5nQnVmZmVyIG5ld1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKG9yaWdpbmFsVGV4dCk7Ci0JCQkvLyBkZXRlcm1pbmUgd2hlcmUgaW4gbGluZSB0aGlzIGNvbW1hbmQgYmVnaW5zCi0JCQlpbnQgbGluZU9mZnNldCA9IC0xOwotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIGxpbmVJbmZvID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoY29tbWFuZC5vZmZzZXQpOwotCQkJCWxpbmVPZmZzZXQgPSBjb21tYW5kLm9mZnNldCAtIGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJCUlMaW5lVHJhY2tlciBsaW5lVHJhY2tlciA9IGdldExpbmVUcmFja2VyKGRvY3VtZW50LCBvcmlnaW5hbFRleHQpOwotCQkJaW50IHN0YXJ0SW5kZXggPSAwOwotCQkJaW50IGluZGV4ID0gbmV3VGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIpOwotCQkJd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGluZGVudCA9IGdldEluZGVudFN0cmluZyhpbmRlbnRhdGlvbldpZHRoLCBsaW5lT2Zmc2V0LCBsaW5lVHJhY2tlciwgaW5kZXgpOwotCQkJCS8vIHJlcGxhY2UgXHQgY2hhcmFjdGVyIHdpdGggc3BhY2VzCi0JCQkJbmV3VGV4dC5yZXBsYWNlKGluZGV4LCBpbmRleCArIDEsIGluZGVudCk7Ci0JCQkJaWYgKGxpbmVUcmFja2VyICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWxpbmVUcmFja2VyLnJlcGxhY2UoaW5kZXgsIDEsIGluZGVudCk7Ci0JCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggcmVwbGFjaW5nIHRleHQsIGp1c3QKLQkJCQkJCS8vIHJlc2V0IHRvIGN1cnJlbnQgc3RyaW5nCi0JCQkJCQlsaW5lVHJhY2tlci5zZXQobmV3VGV4dC50b1N0cmluZygpKTsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlzdGFydEluZGV4ID0gaW5kZXggKyBpbmRlbnQubGVuZ3RoKCk7Ci0JCQkJaW5kZXggPSBuZXdUZXh0LmluZGV4T2YoVEFCX0NIQVJBQ1RFUiwgc3RhcnRJbmRleCk7Ci0JCQl9Ci0JCQljb21tYW5kLnRleHQgPSBuZXdUZXh0LnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbXBsZXRpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRDb21wbGV0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMyZjY2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uNTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnRleHQuamF2YS5KYXZhQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnRleHQuamF2YS5MYXp5SmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuTGF6eUphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKU0RUQ29tcGxldGlvblByb3Bvc2FsIGV4dGVuZHMgSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCBpbXBsZW1lbnRzIElKYXZhQ29tcGxldGlvblByb3Bvc2FsIHsKLQkvKgotCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ0ODMKLQkgKiAKLQkgKiBUaGlzIGlzIGEgd3JhcHBlZCBwcm9wb3NhbCBzbyB3ZSBkb24ndCBuZWVkIHRvIG1ha2UgInNsb3ciIGNhbGxzIHRvIHRoZQotCSAqIGphdmEgcHJvcG9zYWwgdXAgZnJvbnQsIG9ubHkgd2hlbiBuZWVkZWQgZm9yIGV4YW1wbGUsIGdldEFkZGl0aW9uYWxJbmZvKCkKLQkgKiByZWFkcyBleHRlcm5hbCBqYXZhZG9jLCBhbmQgaXQgbWFrZXMgbm8gc2Vuc2UKLQkgKi8KLQlJQ29tcGxldGlvblByb3Bvc2FsIGZKYXZhQ29tcGxldGlvblByb3Bvc2FsID0gbnVsbDsKLQkKLQlwdWJsaWMgSlNEVENvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIGludCByZXBsYWNlbWVudE9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBpbnQgY3Vyc29yUG9zaXRpb24sIEltYWdlIGltYWdlLAotCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcsIElDb250ZXh0SW5mb3JtYXRpb24gY29udGV4dEluZm9ybWF0aW9uLCBTdHJpbmcgYWRkaXRpb25hbFByb3Bvc2FsSW5mbywgaW50IHJlbGV2YW5jZSwKLQkJCWJvb2xlYW4gdXBkYXRlUmVwbGFjZW1lbnRMZW5ndGhPblZhbGlkYXRlKSB7Ci0JCXN1cGVyKHJlcGxhY2VtZW50U3RyaW5nLCByZXBsYWNlbWVudE9mZnNldCwgcmVwbGFjZW1lbnRMZW5ndGgsIGltYWdlLCBkaXNwbGF5U3RyaW5nLCByZWxldmFuY2UpOwotCQlzdXBlci5zZXRDdXJzb3JQb3NpdGlvbihjdXJzb3JQb3NpdGlvbik7Ci0JCXN1cGVyLnNldENvbnRleHRJbmZvcm1hdGlvbihjb250ZXh0SW5mb3JtYXRpb24pOwotLy8gc3VwZXIocmVwbGFjZW1lbnRTdHJpbmcsIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwKLS8vIGN1cnNvclBvc2l0aW9uLCBpbWFnZSwgZGlzcGxheVN0cmluZywgY29udGV4dEluZm9ybWF0aW9uLAotLy8gYWRkaXRpb25hbFByb3Bvc2FsSW5mbywgcmVsZXZhbmNlLAotLy8gdXBkYXRlUmVwbGFjZW1lbnRMZW5ndGhPblZhbGlkYXRlKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+VXNlcyB0aGUgd3JhcHBlZCBwcm9wb3NhbCBpZiBpdHMgbGF6eTwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseShJVGV4dFZpZXdlciB2aWV3ZXIsIGNoYXIgdHJpZ2dlciwgaW50IHN0YXRlTWFzaywgaW50IG9mZnNldCkgewotCQlpZiAodGhpcy5mSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCBpbnN0YW5jZW9mIExhenlKYXZhQ29tcGxldGlvblByb3Bvc2FsKSB7Ci0JCQkoKExhenlKYXZhQ29tcGxldGlvblByb3Bvc2FsKSB0aGlzLmZKYXZhQ29tcGxldGlvblByb3Bvc2FsKS5hcHBseSh2aWV3ZXIsIHRyaWdnZXIsIHN0YXRlTWFzaywgb2Zmc2V0KTsKLQkJfQotCQllbHNlIHsKLQkJCXN1cGVyLmFwcGx5KHZpZXdlciwgdHJpZ2dlciwgc3RhdGVNYXNrLCBvZmZzZXQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPlVzZXMgdGhlIHdyYXBwZWQgcHJvcG9zYWwgaWYgaXRzIGxhenk8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24gYWZ0ZXIgdGhlIHByb3Bvc2FsIGhhcyBiZWVuIGFwcGxpZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlQb2ludCBzZWxlY3Rpb247Ci0JCWlmICh0aGlzLmZKYXZhQ29tcGxldGlvblByb3Bvc2FsIGluc3RhbmNlb2YgTGF6eUphdmFDb21wbGV0aW9uUHJvcG9zYWwpIHsKLQkJCXNlbGVjdGlvbiA9IHRoaXMuZkphdmFDb21wbGV0aW9uUHJvcG9zYWwuZ2V0U2VsZWN0aW9uKGRvY3VtZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCXNlbGVjdGlvbiA9IHN1cGVyLmdldFNlbGVjdGlvbihkb2N1bWVudCk7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlPYmplY3QgYWRkaXRpb25hbEluZm8gPSBzdXBlci5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKG1vbml0b3IpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsIGphdmFQcm9wb3NhbCA9IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWwoKTsKLQkJaWYgKChqYXZhUHJvcG9zYWwgIT0gbnVsbCkgJiYgKGphdmFQcm9wb3NhbCBpbnN0YW5jZW9mIElDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb241KSkgewotCQkJYWRkaXRpb25hbEluZm8gPSAoKElDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb241KSBqYXZhUHJvcG9zYWwpLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8obW9uaXRvcik7Ci0JCX0KLQkJcmV0dXJuIGFkZGl0aW9uYWxJbmZvOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCVN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IHN1cGVyLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBqYXZhUHJvcG9zYWwgPSBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKCk7Ci0JCWlmIChqYXZhUHJvcG9zYWwgIT0gbnVsbCkgewotCQkJYWRkaXRpb25hbEluZm8gPSBqYXZhUHJvcG9zYWwuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQl9Ci0JCXJldHVybiBhZGRpdGlvbmFsSW5mbzsKLQl9Ci0JCi0JZmluYWwgcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWwgZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbCgpIHsKLQkJcmV0dXJuIGZKYXZhQ29tcGxldGlvblByb3Bvc2FsOwotCX0KLQkKLQlmaW5hbCBwdWJsaWMgdm9pZCBzZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKElDb21wbGV0aW9uUHJvcG9zYWwgamF2YUNvbXBsZXRpb25Qcm9wb3NhbCkgewotCQlmSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCA9IGphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRQcmVmaXgoU3RyaW5nIHByZWZpeCkgewotCQlpZiAodGhpcy5mSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCBpbnN0YW5jZW9mIExhenlKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCkgewotCQkJcmV0dXJuICgoTGF6eUphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsKSB0aGlzLmZKYXZhQ29tcGxldGlvblByb3Bvc2FsKS5pc1ZhbGlkVHlwZVByZWZpeChwcmVmaXgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1ZhbGlkUHJlZml4KHByZWZpeCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRDb250ZW50QXNzaXN0YW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbnRlbnRBc3Npc3RhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzODNiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbnRlbnRBc3Npc3RhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvcjsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVENvbnRlbnRBc3Npc3RhbnQgZXh0ZW5kcyBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgaW1wbGVtZW50cyBJQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgewotCXByaXZhdGUgSlNEVENvbnRlbnRBc3Npc3RhbnRQcm9jZXNzb3IgZkNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci0JcHJpdmF0ZSBKU0RUVGVtcGxhdGVBc3Npc3RQcm9jZXNzb3IgZlRlbXBsYXRlQXNzaXN0UHJvY2Vzc29yOwotCXByaXZhdGUgSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yIGZIaHRtbGNvbXA7Ci0JCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCVZlY3RvciBwcm9wb3NhbHMgPSBuZXcgVmVjdG9yKCk7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wbGV0aW9uUHJvcG9zYWxzOwotCQlJQ29tcGxldGlvblByb3Bvc2FsIGVuZFNjcmlwdCA9IGdldEh0bWxDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkuZ2V0RW5kU2NyaXB0UHJvcG9zYWwodmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYoZW5kU2NyaXB0IT1udWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbXSB7ZW5kU2NyaXB0fTsKLQkJCS8vcHJvcG9zYWxzLmFkZChlbmRTY3JpcHQpOwotCQl9Ci0JCUpTRFRQcm9wb3NhbENvbGxlY3RvciB0aGVDb2xsZWN0b3IgPSBnZXRQcm9wb3NhbENvbGxlY3Rvcih2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkvKiBhZGQgZW5kIHNjcmlwdCB0YWcgaWYgbmVlZGVkICovCi0KLQkJLyogLS0tLS0tLS0tIENvbnRlbnQgQXNzaXN0YW50IC0tLS0tLS0tLSAqLwotCQlpZih0aGVDb2xsZWN0b3I9PW51bGwpIHJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJCi0JCWdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKS5zZXRQcm9wb3NhbENvbGxlY3Rvcih0aGVDb2xsZWN0b3IpOwotCQljb21wbGV0aW9uUHJvcG9zYWxzID0gZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcigpLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCXByb3Bvc2Fscy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb21wbGV0aW9uUHJvcG9zYWxzKSk7Ci0JCS8qIEhUTUwgUHJvcG9zYWxzICovCi0JCWNvbXBsZXRpb25Qcm9wb3NhbHMgPSBnZXRIdG1sQ29udGVudEFzc2lzdFByb2Nlc3NvcigpLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCXByb3Bvc2Fscy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb21wbGV0aW9uUHJvcG9zYWxzKSk7Ci0JCS8qIC0tLS0tLS0tLSB0ZW1wbGF0ZSBjb21wbGV0aW9ucyAtLS0tLS0tLS0gKi8KLQkJZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuc2V0UHJvcG9zYWxDb2xsZWN0b3IodGhlQ29sbGVjdG9yKTsKLQkJY29tcGxldGlvblByb3Bvc2FscyA9IGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCXByb3Bvc2Fscy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb21wbGV0aW9uUHJvcG9zYWxzKSk7Ci0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBwcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXSk7Ci0JfQotCQotCXByaXZhdGUgSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yIGdldEh0bWxDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCQlpZiAoZkhodG1sY29tcCA9PSBudWxsKSB7Ci0JCQlmSGh0bWxjb21wID0gbmV3IEpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3NvcigpOwotCQl9Ci0JCXJldHVybiBmSGh0bWxjb21wOwotCX0KLQkKLQlwcml2YXRlIEpTRFRDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yIGdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCWlmIChmQ29udGVudEFzc2lzdFByb2Nlc3NvciA9PSBudWxsKSB7Ci0JCQlmQ29udGVudEFzc2lzdFByb2Nlc3NvciA9IG5ldyBKU0RUQ29udGVudEFzc2lzdGFudFByb2Nlc3NvcigpOwotCQl9Ci0JCXJldHVybiBmQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQl9Ci0JcHJpdmF0ZSBJSnNUcmFuc2xhdGlvbiBnZXRKU1BUcmFuc2xhdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZCh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXIgdHJhbnNsYXRpb25BZGFwdGVyID0gKEpzVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkKLQkJCWlmICh0cmFuc2xhdGlvbkFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiB0cmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SnNUcmFuc2xhdGlvbih0cnVlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgSlNEVFByb3Bvc2FsQ29sbGVjdG9yIGdldFByb3Bvc2FsQ29sbGVjdG9yKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlJSnNUcmFuc2xhdGlvbiB0cmFuID0gZ2V0SlNQVHJhbnNsYXRpb24odmlld2VyLCBvZmZzZXQpOwotCQlpZih0cmFuPT1udWxsKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBKU0RUUHJvcG9zYWxDb2xsZWN0b3IodHJhbik7Ci0JfQotCQotCXByaXZhdGUgSlNEVFRlbXBsYXRlQXNzaXN0UHJvY2Vzc29yIGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGZUZW1wbGF0ZUFzc2lzdFByb2Nlc3NvciA9PSBudWxsKSB7Ci0JCQlmVGVtcGxhdGVBc3Npc3RQcm9jZXNzb3IgPSBuZXcgSlNEVFRlbXBsYXRlQXNzaXN0UHJvY2Vzc29yKCk7Ci0JCX0KLQkJcmV0dXJuIGZUZW1wbGF0ZUFzc2lzdFByb2Nlc3NvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXNzaW9uU3RhcnRlZCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscygKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJVmVjdG9yIHByb3Bvc2FscyA9IG5ldyBWZWN0b3IoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXBsZXRpb25Qcm9wb3NhbHM7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWwgZW5kU2NyaXB0ID0gZ2V0SHRtbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKS5nZXRFbmRTY3JpcHRQcm9wb3NhbChjb250ZXh0LmdldFZpZXdlcigpLCBjb250ZXh0LmdldEludm9jYXRpb25PZmZzZXQoKSk7Ci0JCWlmKGVuZFNjcmlwdCE9bnVsbCkgewotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoMCk7Ci0JCQkvL3Byb3Bvc2Fscy5hZGQoZW5kU2NyaXB0KTsKLQkJfQotCQlKU0RUUHJvcG9zYWxDb2xsZWN0b3IgdGhlQ29sbGVjdG9yID0gZ2V0UHJvcG9zYWxDb2xsZWN0b3IoY29udGV4dC5nZXRWaWV3ZXIoKSwgY29udGV4dC5nZXRJbnZvY2F0aW9uT2Zmc2V0KCkpOwotCQkvKiBhZGQgZW5kIHNjcmlwdCB0YWcgaWYgbmVlZGVkICovCi0KLQkJLyogLS0tLS0tLS0tIENvbnRlbnQgQXNzaXN0YW50IC0tLS0tLS0tLSAqLwotCQlpZih0aGVDb2xsZWN0b3I9PW51bGwpIHJldHVybiBuZXcgQXJyYXlMaXN0KDApOwotCQkKLQkJZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcigpLnNldFByb3Bvc2FsQ29sbGVjdG9yKHRoZUNvbGxlY3Rvcik7Ci0JCWNvbXBsZXRpb25Qcm9wb3NhbHMgPSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoY29udGV4dC5nZXRWaWV3ZXIoKSwgY29udGV4dC5nZXRJbnZvY2F0aW9uT2Zmc2V0KCkpOwotCQlwcm9wb3NhbHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoY29tcGxldGlvblByb3Bvc2FscykpOwotCQkvKiBIVE1MIFByb3Bvc2FscyAqLwotCQljb21wbGV0aW9uUHJvcG9zYWxzID0gZ2V0SHRtbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhjb250ZXh0LmdldFZpZXdlcigpLCBjb250ZXh0LmdldEludm9jYXRpb25PZmZzZXQoKSk7Ci0JCXByb3Bvc2Fscy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb21wbGV0aW9uUHJvcG9zYWxzKSk7Ci0JCS8qIC0tLS0tLS0tLSB0ZW1wbGF0ZSBjb21wbGV0aW9ucyAtLS0tLS0tLS0gKi8KLQkJZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuc2V0UHJvcG9zYWxDb2xsZWN0b3IodGhlQ29sbGVjdG9yKTsKLQkJY29tcGxldGlvblByb3Bvc2FscyA9IGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGNvbnRleHQuZ2V0Vmlld2VyKCksIGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpKTsKLQkJcHJvcG9zYWxzLmFkZEFsbChBcnJheXMuYXNMaXN0KGNvbXBsZXRpb25Qcm9wb3NhbHMpKTsKLQkJcmV0dXJuIHByb3Bvc2FsczsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKGNvbnRleHQuZ2V0Vmlld2VyKCksIGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2Vzc2lvbkVuZGVkKCkgewotCQlmQ29udGVudEFzc2lzdFByb2Nlc3NvciA9IG51bGw7Ci0JCWZUZW1wbGF0ZUFzc2lzdFByb2Nlc3NvciA9IG51bGw7Ci0JCWZIaHRtbGNvbXAgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU0RUQ29udGVudEFzc2lzdGFudFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YjVlMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMKLSAqIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUKLSAqIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0bwotICogc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkKLSAqIGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZQotICogQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU0RUQ29udGVudEFzc2lzdGFudFByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTRFRfQ09SRV9QTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZSI7IC8vJE5PTi1OTFMtMSQKLS8vCXN0YXRpYyB7Ci0vLwkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkvL0RFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLS8vCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZFcnJvck1lc3NhZ2UgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZkpzcFNvdXJjZVBvc2l0aW9uLCBmSmF2YVBvc2l0aW9uOwotCXByaXZhdGUgSlNEVFByb3Bvc2FsQ29sbGVjdG9yIGZQcm9wb3NhbENvbGxlY3RvcjsKLQlwcm90ZWN0ZWQgSVRleHRWaWV3ZXIgZlZpZXdlciA9IG51bGw7Ci0JCi0JcHVibGljIEpTRFRDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBjb21wbGV0aW9uIHByb3Bvc2FscyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uCi0JICogd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbgotCSAqIHdpdGhpbiB0aGUgdGV4dCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlciB3aG9zZSBkb2N1bWVudCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIHByb3Bvc2FscwotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogICAgICAgICAgICBhbiBvZmZzZXQgd2l0aGluIHRoZSBkb2N1bWVudCBmb3Igd2hpY2ggY29tcGxldGlvbnMgc2hvdWxkIGJlCi0JICogICAgICAgICAgICBjb21wdXRlZAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8KLQkgKiAgICAgICAgIHByb3Bvc2FscyBhcmUgcG9zc2libGUKLQkgKi8KLQkKLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IHBvcykgewotCQlpbml0aWFsaXplKHBvcyk7Ci0JCUpTRFRQcm9wb3NhbENvbGxlY3RvciBjb2xsZWN0b3IgPSBudWxsOwotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJZlZpZXdlciA9IHZpZXdlcjsKLQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmVmlld2VyLmdldERvY3VtZW50KCkpOwotCQkJSURPTURvY3VtZW50IHhtbERvYyA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQlKc1RyYW5zbGF0aW9uQWRhcHRlciB0cmFuc2xhdGlvbkFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQotCQkJaWYgKHRyYW5zbGF0aW9uQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJSUpzVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SnNUcmFuc2xhdGlvbih0cnVlKTsKLQkJCQlmSmF2YVBvc2l0aW9uID0gZ2V0RG9jdW1lbnRQb3NpdGlvbigpOwotCQkJCXRyeSB7Ci0JCQkJCUlKYXZhU2NyaXB0VW5pdCBjdSA9IHRyYW5zbGF0aW9uLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJCQkvLyBjYW4ndCBnZXQgamF2YSBwcm9wb3NhbHMgdy9vdXQgYSBjb21waWxhdGlvbiB1bml0Ci0JCQkJCS8vIG9yIHdpdGhvdXQgYSB2YWxpZCBwb3NpdGlvbgotCQkJCQlpZiAoY3UgPT0gbnVsbCB8fCAtMSA9PSBmSmF2YVBvc2l0aW9uKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCQkJCX0KLQkJCQkJY29sbGVjdG9yID0gZ2V0UHJvcG9zYWxDb2xsZWN0b3IoKTsKLQkJCQkJc3luY2hyb25pemVkIChjdSkgewotCQkJCQkJY3UuY29kZUNvbXBsZXRlKGZKYXZhUG9zaXRpb24sIGNvbGxlY3RvciwgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNvcmVFeCkgewotCQkJCQkvLyBhIHBvc3NpYmxlIEphdmEgTW9kZWwgRXhjZXB0aW9uIGR1ZSB0byBub3QgYmVpbmcgYSBXZWIKLQkJCQkJLy8gKEphdmEpIFByb2plY3QKLQkJCQkJY29yZUV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQkJLy8gdGhyb3cgb3V0IGV4Y2VwdGlvbnMgb24gY29kZSBhc3Npc3QuCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXN1bHRzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCWlmIChjb2xsZWN0b3IgIT0gbnVsbCkgewotCQkJcmVzdWx0cyA9IGNvbGxlY3Rvci5nZXRKU1BDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JCQlpZiAocmVzdWx0cyA9PSBudWxsIHx8IHJlc3VsdHMubGVuZ3RoIDwgMSkgewotCQkJCWZFcnJvck1lc3NhZ2UgPSBKc1VJTWVzc2FnZXMuSmF2YV9Db250ZW50X0Fzc2lzdF9pc19ub3RfVUlfOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHBvc3NpYmxlIGNvbnRleHRzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQKLQkgKiBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgY3Vyc29yCi0JICogcG9zaXRpb24gd2l0aGluIHRoZSB0ZXh0IHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyIHdob3NlIGRvY3VtZW50IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgcG9zc2libGUKLQkgKiAgICAgICAgICAgIGNvbnRleHRzCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiAgICAgICAgICAgIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRvY3VtZW50IGZvciB3aGljaCBjb250ZXh0IGluZm9ybWF0aW9uCi0JICogICAgICAgICAgICBzaG91bGQgYmUgY29tcHV0ZWQKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvbnRleHQgaW5mb3JtYXRpb24gb2JqZWN0cyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgbm8gY29udGV4dCBjb3VsZCBiZSBmb3VuZAotCSAqLwotCQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbltdIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gcHJlc3NlZCBzaG91bGQgYXV0b21hdGljYWxseQotCSAqIGRpc3BsYXkgY29udGVudC1hc3Npc3QgcHJvcG9zYWxzLgotCSAqIAotCSAqIEByZXR1cm4gc3RyaW5nIG9mIGNoYXJhY3RlcnMKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdXRvUHJvcG9zYWxJbnZvY2F0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB3aGljaCB3aGVuIHByZXNzZWQgc2hvdWxkIGF1dG9tYXRpY2FsbHkKLQkgKiBkaXNwbGF5IGEgY29udGVudC1hc3Npc3QgdGlwLgotCSAqIAotCSAqIEByZXR1cm4gc3RyaW5nIG9mIGNoYXJhY3RlcnMKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdXRvVGlwSW52b2NhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gZW50ZXJlZCBieSB0aGUgdXNlciBzaG91bGQKLQkgKiBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgdGhlIHByZXNlbnRhdGlvbiBvZiBwb3NzaWJsZSBjb21wbGV0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyBmb3IgY29tcGxldGlvbiBwcm9wb3NhbCBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXV0byBhY3RpdmF0aW9uIGlzIGRlc2lyZWQKLQkgKi8KLQkKLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIGNvbnRleHQgaW5mb3JtYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgYXV0byBhY3RpdmF0aW9uIGNoYXJhY3RlcnMgZm9yIHByZXNlbnRpbmcgY29udGV4dCBpbmZvcm1hdGlvbgotCSAqICAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXV0byBhY3RpdmF0aW9uIGlzIGRlc2lyZWQKLQkgKi8KLQkKLQlwdWJsaWMgY2hhcltdIGdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSB2YWxpZGF0b3IgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiBkaXNwbGF5ZWQgY29udGV4dCBpbmZvcm1hdGlvbgotCSAqIHNob3VsZCBiZSBkaXNtaXNzZWQuIE1heSBvbmx5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcHJvY2Vzc29yCi0JICogaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb250ZXh0IGluZm9ybWF0aW9uIHZhbGlkYXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uCi0JICovCi0JCi0JcHVibGljIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgZ2V0RG9jdW1lbnRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZKc3BTb3VyY2VQb3NpdGlvbjsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCS8vIFRPRE86IGdldCBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlCi0JCS8vIGlmIChmQ29sbGVjdG9yLmdldEVycm9yTWVzc2FnZSgpICE9IG51bGwgJiYKLQkJLy8gZkNvbGxlY3Rvci5nZXRFcnJvck1lc3NhZ2UoKS5sZW5ndGgoKSA+IDApCi0JCS8vIHJldHVybiBmQ29sbGVjdG9yLmdldEVycm9yTWVzc2FnZSgpOwotCQlyZXR1cm4gZkVycm9yTWVzc2FnZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpTRFRQcm9wb3NhbENvbGxlY3RvciBnZXRQcm9wb3NhbENvbGxlY3RvcigpIHsKLQkJcmV0dXJuIGZQcm9wb3NhbENvbGxlY3RvcjsKLQkJLy8gcmV0dXJuIG5ldyBKU1BQcm9wb3NhbENvbGxlY3Rvcih0cmFuc2xhdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGNvZGUgYXNzaXN0IHByb2Nlc3Nvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKGludCBwb3MpIHsKLQkJaW5pdGlhbGl6ZUphdmFQbHVnaW5zKCk7Ci0JCWZKc3BTb3VyY2VQb3NpdGlvbiA9IHBvczsKLQkJZkVycm9yTWVzc2FnZSA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIEphdmEgUGx1Z2lucyB0aGF0IHRoZSBKU1AgcHJvY2Vzc29yIHJlcXVpcmVzLiBTZWUKLQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQzNzY1IFdlIHNob3VsZCBub3QgY2FsbAotCSAqICJzdGFydCIsIGJlY2F1c2UgdGhhdCB3aWxsIGNhdXNlIHRoYXQgc3RhdGUgdG8gYmUgcmVtZW1iZXJlZCwgYW5kCi0JICogcmUtc3RhcnRlZCBhdXRvbWF0aWNhbGx5IGR1cmluZyB0aGUgbmV4dCBib290IHVwIHNlcXVlbmNlLgotCSAqIAotCSAqIElTU1VFOiB3ZSBtYXkgYmUgYWJsZSB0byBnZXQgcmlkIG9mIHRoaXMgYWxsIHRvZ2V0aGVyLCBpbiBmdXR1cmUsIHNpbmNlCi0JICogOTklIHdlIHByb2JhYmx5IGhhdmUgYWxyZWFkeSB1c2VkIHNvbWUgSkRUIGNsYXNzIGJ5IHRoZSB0aW1lIHdlIG5lZWQgSkRUCi0JICogdG8gYmUgYWN0aXZlIC4uLiBidXQgLi4uIHRoaXMgaXMgdGhlIHNhZmVzdCBmaXggZm9yIHRoaXMgcG9pbnQgaW4gMS41Ci0JICogc3RyZWFtLiBOZXh0IHJlbGVhc2UsIGxldCdzIGp1c3QgcmVtb3ZlIHRoaXMsIHJlLWRpc2NvdmVyIHdoYXQgZXZlciBidWcKLQkgKiB0aGlzIHdhcyBmaXhpbmcgKGlmIGFueSkgYW5kIGlmIHRoZXJlIGlzIG9uZSwgdGhlbiB3ZSdsbCBlaXRoZXIgcHV0IGJhY2sKLQkgKiBpbiwgYXMgaXMsIG9yIGNvbWUgdXAgd2l0aCBhIG1vcmUgYXBwcm9wcmlhdGUgZml4LgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKYXZhUGx1Z2lucygpIHsKLQkJdHJ5IHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoSlNEVENvbnRlbnRBc3Npc3RhbnRQcm9jZXNzb3IuSlNEVF9DT1JFX1BMVUdJTl9JRCk7Ci0JCQlidW5kbGUubG9hZENsYXNzKCJkdW1teUNsYXNzTmFtZVRoYXRTaG91bGROZXZlckV4aXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB0aGlzIGlzIHRoZSBleHBlY3RlZCByZXN1bHQsIHdlIGp1c3Qgd2FudCB0bwotCQkJLy8gbnVkZ2UgdGhlIGJ1bmRsZSB0byBiZSBzdXJlIGl0cyBhY3RpdmF0ZWQuCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvcG9zYWxDb2xsZWN0b3IoSlNEVFByb3Bvc2FsQ29sbGVjdG9yIHRyYW5zbGF0aW9uKSB7Ci0JCXRoaXMuZlByb3Bvc2FsQ29sbGVjdG9yID0gdHJhbnNsYXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRDb250ZXRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRDb250ZXRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2QwN2E4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU0RUQ29udGV0QXNzaXN0SW52b2NhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnRleHQuamF2YS5KYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpTRFRDb250ZXRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBleHRlbmRzIEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgewotCXB1YmxpYyBzdGF0aWMgSlNEVENvbnRldEFzc2lzdEludm9jYXRpb25Db250ZXh0IGdldEluc3RhbmNlKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCwgSlNEVFByb3Bvc2FsQ29sbGVjdG9yIHRoZUNvbGxlY3RvcikgewotCQlKU0RUQ29udGV0QXNzaXN0SW52b2NhdGlvbkNvbnRleHQuZ2V0SlNQVHJhbnNsYXRpb24odmlld2VyKTsKLQkJcmV0dXJuIG5ldyBKU0RUQ29udGV0QXNzaXN0SW52b2NhdGlvbkNvbnRleHQodmlld2VyLCBvZmZzZXQsIHRoZUNvbGxlY3Rvcik7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElKc1RyYW5zbGF0aW9uIGdldEpTUFRyYW5zbGF0aW9uKElUZXh0Vmlld2VyIHZpZXdlcikgewotCQlJSnNUcmFuc2xhdGlvbiBmVHJhbnNsYXRpb24gPSBudWxsOwotCQkKLQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZCh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyIGZUcmFuc2xhdGlvbkFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCWlmIChmVHJhbnNsYXRpb25BZGFwdGVyICE9IG51bGwpIHsKLQkJCQlmVHJhbnNsYXRpb24gPSBmVHJhbnNsYXRpb25BZGFwdGVyLmdldEpzVHJhbnNsYXRpb24odHJ1ZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlRyYW5zbGF0aW9uOwotCX0KLQlJVGV4dFZpZXdlciB2aWV3ZXI7Ci0JCi0JcHJpdmF0ZSBKU0RUQ29udGV0QXNzaXN0SW52b2NhdGlvbkNvbnRleHQoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0LCBKU0RUUHJvcG9zYWxDb2xsZWN0b3IgdGhlQ29sbGVjdG9yKSB7Ci0JCXN1cGVyKHZpZXdlciwgb2Zmc2V0LCBudWxsKTsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JCS8vIHRoaXMub2Zmc2V0PWdldEpTUFRyYW5zbGF0aW9uKCkuZ2V0SmF2YU9mZnNldChvZmZzZXQpOwotCQkvLyBDb21wbGV0aW9uUHJvcG9zYWxDb2xsZWN0b3IgdGhlQ29sbGVjdG9yID0gZ2V0UHJvcG9zYWxDb2xsZWN0b3IoKTsKLQkJc3VwZXIuc2V0Q29sbGVjdG9yKHRoZUNvbGxlY3Rvcik7Ci0JfQotCQotLy8gcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLS8vIHJldHVybgotLy8gKChKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbilnZXRKU1BUcmFuc2xhdGlvbih2aWV3ZXIpKS5nZXRKYXZhRG9jdW1lbnQoKTsKLS8vICAgICAgCi0vLyB9Ci0vLyBwcm90ZWN0ZWQgQ29tcGxldGlvblByb3Bvc2FsQ29sbGVjdG9yIGdldFByb3Bvc2FsQ29sbGVjdG9yKCkgewotLy8gICAgICAgCi0vLyByZXR1cm4gKChDb21wbGV0aW9uUHJvcG9zYWxDb2xsZWN0b3IpICggbmV3IEpTUFByb3Bvc2FsQ29sbGVjdG9yKAotLy8gZ2V0SlNQVHJhbnNsYXRpb24oKSkgKSk7Ci0vLyB9Ci0JCi0JcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIHZpZXdlci5nZXREb2N1bWVudCgpOwotCX0KLS8vIHB1YmxpYyBJSmF2YVNjcmlwdFVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCkgewotLy8gcmV0dXJuIGdldEpTUFRyYW5zbGF0aW9uKHZpZXdlcikuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0vLyB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNzI3YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRIdG1sQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3NvciB7Ci0JCi0JcHVibGljIEpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3NvcigpIHt9Ci0JCi0JCi0JCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJLyogYWRkIDwvc2NyaXB0IGlmIG5lY2lzYXJ5ICovCi0JCUFycmF5TGlzdCBhbGxQcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldEpTUFRyYW5zbGF0aW9uKHZpZXdlcik7Ci0JCQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSlhbGxQcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFthbGxQcm9wb3NhbHMuc2l6ZSgpXSk7Ci0JfQotCQotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsIGdldEVuZFNjcmlwdFByb3Bvc2FsKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQkvKiBhZGQgPC9zY3JpcHQgaWYgbmVjaXNhcnkgKi8KLQkKLQkJSUpzVHJhbnNsYXRpb24gdHJhbiA9IGdldEpTUFRyYW5zbGF0aW9uKHZpZXdlcik7Ci0JCWlmKHRyYW49PW51bGwpIHJldHVybiBudWxsOwotCQkKLQkJaW50IG1pc3NpbmdBdE9mZnNldCA9IHRyYW4uZ2V0TWlzc2luZ1RhZ1N0YXJ0KCk7Ci0JCQotCQlpZihvZmZzZXQ+PW1pc3NpbmdBdE9mZnNldCYmIG1pc3NpbmdBdE9mZnNldD4tMSkgewotCQkJCi0JCQlTdHJpbmcgYWxsVGV4dCA9IHZpZXdlci5nZXREb2N1bWVudCgpLmdldCgpOwotCQkJU3RyaW5nIHRleHQgPSAiPC9zY3JpcHQ+IjsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlpbnQgc3RhcnRJblRhZyA9IC0xOwotCQkJCi0JCQlmb3IoaW50IGk9MDtpPHRleHQubGVuZ3RoKCkgJiYgYWxsVGV4dC5sZW5ndGgoKT5vZmZzZXQtMTtpKyspIHsKLQkJCQlpZihhbGxUZXh0LmNoYXJBdChvZmZzZXQtMSk9PXRleHQuY2hhckF0KGkpKSB7Ci0JCQkJCXN0YXJ0SW5UYWcgPSBpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKHN0YXJ0SW5UYWc9PS0xICkgewotCQkJCVN0cmluZyBkaXNwbGF5VGV4dCA9IE1lc3NhZ2VzLmdldFN0cmluZygiSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yLjEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCJcbiIgKyB0ZXh0ICsgIlxuIiAsb2Zmc2V0LDAsb2Zmc2V0LG51bGwsZGlzcGxheVRleHQsbnVsbCxNZXNzYWdlcy5nZXRTdHJpbmcoIkpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3Nvci40IiksMTAwKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCQotCQkJU3RyaW5nIHRleHQxID0gYWxsVGV4dC5zdWJzdHJpbmcob2Zmc2V0IC0gc3RhcnRJblRhZyAtIDEsIG9mZnNldCkudG9Mb3dlckNhc2UoKTsKLQkJCVN0cmluZyB0ZXh0MiA9IHRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0SW5UYWcrMSkudG9Mb3dlckNhc2UoKTsKLQkJCWlmKHN0YXJ0SW5UYWc+LTEgICYmIHRleHQyLmNvbXBhcmVUbyh0ZXh0MSk9PTAgKSB7Ci0JCQkJU3RyaW5nIGRpc3BsYXlUZXh0ID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJKU0RUSHRtbENvbXBsZXRpb25Qcm9jZXNzb3IuNSIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwodGV4dCAgLG9mZnNldC1zdGFydEluVGFnLTEsMCx0ZXh0Lmxlbmd0aCgpLG51bGwsZGlzcGxheVRleHQsbnVsbCxNZXNzYWdlcy5nZXRTdHJpbmcoIkpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3Nvci42IiksMTAwKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQlwcml2YXRlIElKc1RyYW5zbGF0aW9uIGdldEpTUFRyYW5zbGF0aW9uKElUZXh0Vmlld2VyIHZpZXdlcikgewotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCi0JCQlKc1RyYW5zbGF0aW9uQWRhcHRlciBmVHJhbnNsYXRpb25BZGFwdGVyID0gKEpzVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkKLQkJCWlmIChmVHJhbnNsYXRpb25BZGFwdGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZlRyYW5zbGF0aW9uQWRhcHRlci5nZXRKc1RyYW5zbGF0aW9uKHRydWUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRQcm9wb3NhbENvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRQcm9wb3NhbENvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTk1NTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU0RUUHJvcG9zYWxDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkudGV4dC5qYXZhLkNvbXBsZXRpb25Qcm9wb3NhbENvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS50ZXh0LmphdmEuQ29tcGxldGlvblByb3Bvc2FsQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS50ZXh0LmphdmEuSUphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLQotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpTRFRQcm9wb3NhbENvbGxlY3RvciBleHRlbmRzIENvbXBsZXRpb25Qcm9wb3NhbENvbGxlY3RvciB7Ci0Jc3RhdGljIGNoYXJbXSBnZXRUeXBlVHJpZ2dlcnMoKSB7Ci0JCXJldHVybiBDb21wbGV0aW9uUHJvcG9zYWxDb2xsZWN0b3IuVFlQRV9UUklHR0VSUzsKLQl9Ci0JcHJpdmF0ZSBDb21wYXJhdG9yIGZDb21wYXJhdG9yOwotCXByaXZhdGUgSUpzVHJhbnNsYXRpb24gZlRyYW5zbGF0aW9uOwotCQotLy8gcHVibGljIExpc3QgZ2V0R2VuZXJhdGVkRnVuY3Rpb25OYW1lcygpewotLy8gaWYoZkdlbmVyYXRlZEZ1bmN0aW9uTmFtZXM9PW51bGwpewotLy8gZkdlbmVyYXRlZEZ1bmN0aW9uTmFtZXMgPSBmVHJhbnNsYXRpb24uZ2V0R2VuZXJhdGVkRnVuY3Rpb25OYW1lcygpOwotLy8gfQotLy8gcmV0dXJuIGZHZW5lcmF0ZWRGdW5jdGlvbk5hbWVzOwotLy8gfQotCXB1YmxpYyBKU0RUUHJvcG9zYWxDb2xsZWN0b3IoSUpzVHJhbnNsYXRpb24gdHJhbnNsYXRpb24pIHsKLQkJc3VwZXIodHJhbnNsYXRpb24hPW51bGw/dHJhbnNsYXRpb24uZ2V0Q29tcGlsYXRpb25Vbml0KCk6bnVsbCk7Ci0JCWlmICh0cmFuc2xhdGlvbiA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJKU1BUcmFuc2xhdGlvbiBjYW5ub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZlRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb247Ci0JfQotCQotCS8qKgotCSAqIENhY2x1YXRlcyB0aGUgd2hlcmUgdGhlIGN1cnNvciBzaG91bGQgYmUgYWZ0ZXIgYXBwbHlpbmcgdGhpcyBwcm9wb3NhbC4KLQkgKiBlZy4gbWV0aG9kKHwpIGlmIHRoZSBtZXRob2QgcHJvcG9zYWwgY2hvc2VuIGhhZCBwYXJhbXMuCi0JICogCi0JICogQHBhcmFtIHByb3Bvc2FsCi0JICogQHBhcmFtIGNvbXBsZXRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgY2FsY3VsYXRlUG9zaXRpb25BZnRlcihDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwsIFN0cmluZyBjb21wbGV0aW9uKSB7Ci0JCWludCBwb3NpdGlvbkFmdGVyID0gY29tcGxldGlvbi5sZW5ndGgoKTsKLQkJaW50IGtpbmQgPSBwcm9wb3NhbC5nZXRLaW5kKCk7Ci0JCS8vIG1heSBuZWVkIGJldHRlciBsb2dpYyBoZXJlLi4uCi0JCS8vIHB1dCBjdXJzb3IgaW5zaWRlIHBhcmVudGhlc2lzIGlmIHRoZXJlJ3MgcGFyYW1zCi0JCS8vIG9ubHkgY2hlY2tpbmcgZm9yIGFueSBraW5kIG9mIGRlY2xhcmF0aW9uCi0JCWlmIChraW5kID09IENvbXBsZXRpb25Qcm9wb3NhbC5BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT04gfHwga2luZCA9PSBDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX0RFQ0xBUkFUSU9OIHx8IGtpbmQgPT0gQ29tcGxldGlvblByb3Bvc2FsLlBPVEVOVElBTF9NRVRIT0RfREVDTEFSQVRJT04gfHwga2luZCA9PSBDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRikgewotCQkJaW50IHBhcmFtQ291bnQgPSBTaWduYXR1cmUuZ2V0UGFyYW1ldGVyQ291bnQocHJvcG9zYWwuZ2V0U2lnbmF0dXJlKCkpOwotCQkJaWYgKGNvbXBsZXRpb24ubGVuZ3RoKCkgPiAwICYmIHBhcmFtQ291bnQgPiAwKSB7Ci0JCQkJcG9zaXRpb25BZnRlci0tOwotCQkJfQotCQl9Ci0JCXJldHVybiBwb3NpdGlvbkFmdGVyOwotCX0KLQkKLQkvKioKLQkgKiBPdmVycmlkZGVuIHRvOiAtIHRyYW5zbGF0ZSBKYXZhIC0+IEpTUCBvZmZzZXRzIC0gZml4Ci0JICogY3Vyc29yLXBvc2l0aW9uLWFmdGVyIC0gZml4IG1hbmdsZWQgc2VydmxldCBuYW1lIGluIGRpc3BsYXkgc3RyaW5nIC0KLQkgKiByZW1vdmUgdW53YW50ZWQgcHJvcG9zYWxzIChzZXJ2bGV0IGNvbnN0cnVjdG9yKQotCSAqLwotCQotCXByb3RlY3RlZCBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVKYXZhQ29tcGxldGlvblByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCkgewotCQlKU0RUQ29tcGxldGlvblByb3Bvc2FsIGpzcFByb3Bvc2FsID0gbnVsbDsKLQkJLy8gaWdub3JlIGNvbnN0cnVjdG9yIHByb3Bvc2FscyAodGhleSdyZSBub3QgcmVsZXZhbnQgZm9yIG91ciBKU1AKLQkJLy8gcHJvcG9zYWwgbGlzdCkKLQkJaWYgKCFwcm9wb3NhbC5pc0NvbnN0cnVjdG9yKCkpIHsKLS8vIGlmIChwcm9wb3NhbC5nZXRLaW5kKCkgPT0gQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSB7Ci0vLyBTdHJpbmcgc2lnbmF0dXJlID0gU3RyaW5nLnZhbHVlT2YocHJvcG9zYWwKLS8vIC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpKTsKLS8vIFN0cmluZyBjb21wbGV0aW9uID0gU3RyaW5nLnZhbHVlT2YocHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpKTsKLS8vIGlmIChjb21wbGV0aW9uLmluZGV4T2Yoc2lnbmF0dXJlKSAhPSAtMSkgewotLy8ganNwUHJvcG9zYWwgPSBjcmVhdGVBdXRvSW1wb3J0UHJvcG9zYWwocHJvcG9zYWwpOwotLy8gfQotLy8gfQotCQkJLy8gZGVmYXVsdCBiZWhhdmlvcgotLy8gaWYgKGpzcFByb3Bvc2FsID09IG51bGwpIHsKLS8vIGZvcihpbnQgaSA9IDA7aTxnZXRHZW5lcmF0ZWRGdW5jdGlvbk5hbWVzKCkuc2l6ZSgpO2krKyl7Ci0vLyBpZigobmV3Ci0vLyBTdHJpbmcocHJvcG9zYWwuZ2V0TmFtZSgpKSkuZXF1YWxzSWdub3JlQ2FzZSgoU3RyaW5nKWdldEdlbmVyYXRlZEZ1bmN0aW9uTmFtZXMoKS5nZXQoaSkpKQotLy8gcmV0dXJuIGpzcFByb3Bvc2FsOwotLy8gfQotCQkJanNwUHJvcG9zYWwgPSBjcmVhdGVKc3BQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkvLyB9Ci0JCX0KLQkJcmV0dXJuIGpzcFByb3Bvc2FsOwotCX0KLQkKLS8vIHByaXZhdGUgSlNQQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZUF1dG9JbXBvcnRQcm9wb3NhbCgKLS8vIENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCkgewotLy8KLS8vIEpTUENvbXBsZXRpb25Qcm9wb3NhbCBqc3BQcm9wb3NhbCA9IG51bGw7Ci0vLwotLy8gU3RyaW5nIHNpZ25hdHVyZSA9IG5ldyBTdHJpbmcocHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKSk7Ci0vLyBTdHJpbmcgY29tcGxldGlvbiA9IG5ldyBTdHJpbmcocHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpKTsKLS8vCi0vLyAvLyBpdCdzIGZ1bGx5IHF1YWxpZmllZCBzbyB3ZSBzaG91bGQKLS8vIC8vIGFkZCBhbiBpbXBvcnQgc3RhdGVtZW50Ci0vLyAvLyBjcmVhdGUgYW4gYXV0b2ltcG9ydCBwcm9wb3NhbAotLy8gU3RyaW5nIG5ld0NvbXBsZXRpb24gPSBjb21wbGV0aW9uLnJlcGxhY2VBbGwoc2lnbmF0dXJlICsgIi4iLCAiIik7Ci0vLyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLS8vCi0vLyAvLyBqYXZhIG9mZnNldAotLy8gaW50IG9mZnNldCA9IHByb3Bvc2FsLmdldFJlcGxhY2VTdGFydCgpOwotLy8gLy8gcmVwbGFjZW1lbnQgbGVuZ3RoCi0vLyBpbnQgbGVuZ3RoID0gcHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpIC0gb2Zmc2V0OwotLy8gLy8gdHJhbnNsYXRlIG9mZnNldCBmcm9tIEphdmEgPiBKU1AKLS8vIG9mZnNldCA9IGZUcmFuc2xhdGlvbi5nZXRKc3BPZmZzZXQob2Zmc2V0KTsKLS8vIC8vIGN1cnNvciBwb3NpdGlvbiBhZnRlciBtdXN0IGJlIGNhbGN1bGF0ZWQKLS8vIGludCBwb3NpdGlvbkFmdGVyID0gY2FsY3VsYXRlUG9zaXRpb25BZnRlcihwcm9wb3NhbCwgbmV3Q29tcGxldGlvbiwKLS8vIG9mZnNldCk7Ci0vLwotLy8gLy8gZnJvbSBqYXZhIHByb3Bvc2FsCi0vLyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCBqYXZhUHJvcG9zYWwgPSBzdXBlcgotLy8gLmNyZWF0ZUphdmFDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwpOwotLy8gcHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKTsKLS8vIEltYWdlIGltYWdlID0gamF2YVByb3Bvc2FsLmdldEltYWdlKCk7Ci0vLyBTdHJpbmcgZGlzcGxheVN0cmluZyA9IGphdmFQcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCk7Ci0vLyBkaXNwbGF5U3RyaW5nID0gZ2V0VHJhbnNsYXRpb24oKS5maXh1cE1hbmdsZWROYW1lKGRpc3BsYXlTdHJpbmcpOwotLy8gSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24gPSBqYXZhUHJvcG9zYWwKLS8vIC5nZXRDb250ZXh0SW5mb3JtYXRpb24oKTsKLS8vIC8vIGRvbid0IGRvIHRoaXMsIGl0J3Mgc2xvdwotLy8gLy8gU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gamF2YVByb3Bvc2FsLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLS8vIGludCByZWxldmFuY2UgPSBqYXZhUHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCk7Ci0vLwotLy8gYm9vbGVhbiB1cGRhdGVMZW5ndGhPblZhbGlkYXRlID0gdHJ1ZTsKLS8vCi0vLyBqc3BQcm9wb3NhbCA9IG5ldyBBdXRvSW1wb3J0UHJvcG9zYWwoY29tcGxldGlvbiwgbmV3Q29tcGxldGlvbiwgb2Zmc2V0LAotLy8gbGVuZ3RoLCBwb3NpdGlvbkFmdGVyLCBpbWFnZSwgZGlzcGxheVN0cmluZywKLS8vIGNvbnRleHRJbmZvcm1hdGlvbiwgbnVsbCwgcmVsZXZhbmNlLCB1cGRhdGVMZW5ndGhPblZhbGlkYXRlKTsKLS8vCi0vLyAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0NDgzCi0vLyAvLyBzZXQgd3JhcHBlZCBqYXZhIHByb3Bvc2FsIHNvIGFkZGl0aW9uYWwgaW5mbyBjYW4gYmUgY2FsY3VsYXRlZCBvbgotLy8gLy8gZGVtYW5kCi0vLyBqc3BQcm9wb3NhbC5zZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKGphdmFQcm9wb3NhbCk7Ci0vLwotLy8gcmV0dXJuIGpzcFByb3Bvc2FsOwotLy8gfQotCXByaXZhdGUgSlNEVENvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVKc3BQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwpIHsKLQkJSlNEVENvbXBsZXRpb25Qcm9wb3NhbCBqc3BQcm9wb3NhbDsKLQkJU3RyaW5nIGNvbXBsZXRpb24gPSBTdHJpbmcudmFsdWVPZihwcm9wb3NhbC5nZXRDb21wbGV0aW9uKCkpOwotCQkvLyBqYXZhIG9mZnNldAotCQlpbnQgb2Zmc2V0ID0gcHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCk7Ci0JCS8vIHJlcGxhY2VtZW50IGxlbmd0aAotCQlpbnQgbGVuZ3RoID0gcHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpIC0gb2Zmc2V0OwotCQkvLyB0cmFuc2xhdGUgb2Zmc2V0IGZyb20gSmF2YSA+IEpTUAotCQkvLyBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgbXVzdCBiZSBjYWxjdWxhdGVkCi0JCWludCBwb3NpdGlvbkFmdGVyID0gY2FsY3VsYXRlUG9zaXRpb25BZnRlcihwcm9wb3NhbCwgY29tcGxldGlvbik7Ci0JCS8vIGZyb20gamF2YSBwcm9wb3NhbAotCQlJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCBqYXZhUHJvcG9zYWwgPSBzdXBlci5jcmVhdGVKYXZhQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJcHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBqYXZhUHJvcG9zYWwuZ2V0SW1hZ2UoKTsKLQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBqYXZhUHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpOwotCQlkaXNwbGF5U3RyaW5nID0gZ2V0VHJhbnNsYXRpb24oKS5maXh1cE1hbmdsZWROYW1lKGRpc3BsYXlTdHJpbmcpOwotLy8gZm9yKGludCBpID0gMDtpPGdldEdlbmVyYXRlZEZ1bmN0aW9uTmFtZXMoKS5zaXplKCk7aSsrKXsKLS8vIGRpc3BsYXlTdHJpbmcucmVwbGFjZSgoU3RyaW5nKWdldEdlbmVyYXRlZEZ1bmN0aW9uTmFtZXMoKS5nZXQoaSksICIiKTsKLS8vIH0KLQkJSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24gPSBqYXZhUHJvcG9zYWwuZ2V0Q29udGV4dEluZm9ybWF0aW9uKCk7Ci0JCS8vIFN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IGphdmFQcm9wb3NhbC5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCWludCByZWxldmFuY2UgPSBqYXZhUHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCk7Ci0JCWJvb2xlYW4gdXBkYXRlTGVuZ3RoT25WYWxpZGF0ZSA9IHRydWU7Ci0JCWpzcFByb3Bvc2FsID0gbmV3IEpTRFRDb21wbGV0aW9uUHJvcG9zYWwoY29tcGxldGlvbiwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uQWZ0ZXIsIGltYWdlLCBkaXNwbGF5U3RyaW5nLCBjb250ZXh0SW5mb3JtYXRpb24sIG51bGwsIHJlbGV2YW5jZSwgdXBkYXRlTGVuZ3RoT25WYWxpZGF0ZSk7Ci0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ0ODMKLQkJLy8gc2V0IHdyYXBwZWQgamF2YSBwcm9wb3NhbCBzbyBhZGRpdGlvbmFsIGluZm8gY2FuIGJlIGNhbGN1bGF0ZWQgb24KLQkJLy8gZGVtYW5kCi0JCWpzcFByb3Bvc2FsLnNldEphdmFDb21wbGV0aW9uUHJvcG9zYWwoamF2YVByb3Bvc2FsKTsKLQkJcmV0dXJuIGpzcFByb3Bvc2FsOwotCX0KLQkKLQlwcml2YXRlIENvbXBhcmF0b3IgZ2V0Q29tcGFyYXRvcigpIHsKLQkJaWYgKGZDb21wYXJhdG9yID09IG51bGwpIHsKLQkJCWZDb21wYXJhdG9yID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbENvbXBhcmF0b3IoKTsKLQkJfQotCQlyZXR1cm4gZkNvbXBhcmF0b3I7Ci0JfQotCQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCB3ZSBvbmx5IHJldHVybiBKU1BDb21wbGV0aW9uUHJvcG9zYWxzLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgSlNQQ29tcGxldGlvblByb3Bvc2FscwotCSAqLwotCXB1YmxpYyBKU0RUQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0SlNQQ29tcGxldGlvblByb3Bvc2FscygpIHsKLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdIGphdmFQcm9wb3NhbHMgPSBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscygpOwotCQkvLyBuZWVkIHRvIGZpbHRlciBvdXQgbm9uIEpTUENvbXBsZXRpb25Qcm9wb3NhbHMKLQkJLy8gYmVjYXVzZSB0aGVpciBvZmZzZXRzIGhhdmVuJ3QgYmVlbiB0cmFuc2xhdGVkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YVByb3Bvc2Fscy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGphdmFQcm9wb3NhbHNbaV0gaW5zdGFuY2VvZiBKU0RUQ29tcGxldGlvblByb3Bvc2FsKSB7Ci0JCQkJcmVzdWx0cy5hZGQoamF2YVByb3Bvc2Fsc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJQ29sbGVjdGlvbnMuc29ydChyZXN1bHRzLCBnZXRDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gKEpTRFRDb21wbGV0aW9uUHJvcG9zYWxbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBKU0RUQ29tcGxldGlvblByb3Bvc2FsW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCQotCXB1YmxpYyBJSnNUcmFuc2xhdGlvbiBnZXRUcmFuc2xhdGlvbigpIHsKLQkJcmV0dXJuIGZUcmFuc2xhdGlvbjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRUZW1wbGF0ZUFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRUZW1wbGF0ZUFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjk4MTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU0RUVGVtcGxhdGVBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLlRlbXBsYXRlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkudGV4dC5qYXZhLkphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlcjsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVFRlbXBsYXRlQXNzaXN0UHJvY2Vzc29yIHsKLQlUZW1wbGF0ZUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIGZKYXZhVGVtcGxhdGVDb21wbGV0aW9uOwotCUpTRFRQcm9wb3NhbENvbGxlY3RvciBmUHJvcG9zYWxDb2xsZWN0b3I7Ci0JSnNUcmFuc2xhdGlvbkFkYXB0ZXIgZlRyYW5zbGF0aW9uQWRhcHRlcjsKLQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0JCi0JcHVibGljIEpTRFRUZW1wbGF0ZUFzc2lzdFByb2Nlc3NvcigpIHsKLQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JfQotCQotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCUphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCA9IGdldEludm9jYXRpb25Db250ZXh0KHZpZXdlciwgb2Zmc2V0KTsKLQkJTGlzdCBwcm9wcyA9IGdldFRlbXBsYXRlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhjb250ZXh0LCBtb25pdG9yKTsKLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIHByb3BzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbXSB7fSk7Ci0JfQotCQotCXByaXZhdGUgSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBnZXRJbnZvY2F0aW9uQ29udGV4dChJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIEpTRFRDb250ZXRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dC5nZXRJbnN0YW5jZSh2aWV3ZXIsIG9mZnNldCwgZ2V0UHJvcG9zYWxDb2xsZWN0b3IoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBKU0RUUHJvcG9zYWxDb2xsZWN0b3IgZ2V0UHJvcG9zYWxDb2xsZWN0b3IoKSB7Ci0JCXJldHVybiBmUHJvcG9zYWxDb2xsZWN0b3I7Ci0JCS8vIHJldHVybiBuZXcgSlNQUHJvcG9zYWxDb2xsZWN0b3IodHJhbnNsYXRpb24pOwotCX0KLQkKLQlwcml2YXRlIFRlbXBsYXRlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcigpIHsKLQkJaWYgKGZKYXZhVGVtcGxhdGVDb21wbGV0aW9uID09IG51bGwpIHsKLQkJCWZKYXZhVGVtcGxhdGVDb21wbGV0aW9uID0gbmV3IFRlbXBsYXRlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIoKTsKLQkJfQotCQlyZXR1cm4gZkphdmFUZW1wbGF0ZUNvbXBsZXRpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb3Bvc2FsQ29sbGVjdG9yKEpTRFRQcm9wb3NhbENvbGxlY3RvciB0cmFuc2xhdGlvbikgewotCQl0aGlzLmZQcm9wb3NhbENvbGxlY3RvciA9IHRyYW5zbGF0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OWUyMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmRmODA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3Nvci4xPTw+IGVuZCB3aXRoIDwvc2NyaXB0PgotSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yLjQ9Q2xvc2UgdGhlIHNjcmlwdCB0YWcuCi1KU0RUSHRtbENvbXBsZXRpb25Qcm9jZXNzb3IuNT08PiBlbmQgd2l0aCA8L3NjcmlwdD4KLUpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3Nvci42PUNsb3NlIHRoZSBzY3JpcHQgdGFnLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvZGVyaXZlZC9TaW5nbGVDaGFyUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OTNkNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmRlcml2ZWQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbmdsZUNoYXJSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRlbnQgYXMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBjaDsKLQkJd2hpbGUgKChjaCA9IHJlYWQoKSkgIT0gLTEpIHsKLQkJCWJ1Zi5hcHBlbmQoKGNoYXIpIGNoKTsKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI3JlYWQoKQotCSAqLwotCQotCXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkKGNoYXJbXSxpbnQsaW50KQotCSAqLwotCQotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNidWZbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGVuZCA9IG9mZiArIGxlbjsKLQkJZm9yIChpbnQgaSA9IG9mZjsgaSA8IGVuZDsgaSsrKSB7Ci0JCQlpbnQgY2ggPSByZWFkKCk7Ci0JCQlpZiAoY2ggPT0gLTEpIHsKLQkJCQlpZiAoaSA9PSBvZmYpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlyZXR1cm4gaSAtIG9mZjsKLQkJCX0KLQkJCWNidWZbaV0gPSAoY2hhcikgY2g7Ci0JCX0KLQkJcmV0dXJuIGxlbjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZHkoKQotCSAqLwotCQotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9lZGl0b3IvQWN0aW9uQ29udHJpYnV0b3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhOWY1ZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9lZGl0b3IvQWN0aW9uQ29udHJpYnV0b3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpLkFjdGlvbkNvbnRyaWJ1dG9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLlJlZmFjdG9yQWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLklBY3Rpb25Db25zdGFudHNKczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSUFjdGlvbkRlZmluaXRpb25JZHNKczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5TdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Db250cmlidXRvckpTUCBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9ySFRNTCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRURJVE9SX0lEUyA9IHsgIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHJpdmF0ZSBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gbW92ZUVsZW1lbnRBY3Rpb24gPSBudWxsOwotCXByaXZhdGUgSU1lbnVNYW5hZ2VyIHJlZmFjdG9yTWVudSA9IG51bGw7Ci0JcHJpdmF0ZSBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gcmVuYW1lRWxlbWVudEFjdGlvbiA9IG51bGw7Ci0JCi0JcHVibGljIEFjdGlvbkNvbnRyaWJ1dG9ySlNQKCkgewotCQlzdXBlcigpOwotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBKc1VJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihidW5kbGUsIElBY3Rpb25Db25zdGFudHNKcy5BQ1RJT05fTkFNRV9SRU5BTUVfRUxFTUVOVCArIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVOREVSU0NPUkUpOwotCQl0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElBY3Rpb25EZWZpbml0aW9uSWRzSnMuUkVOQU1FX0VMRU1FTlQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMucmVuYW1lRWxlbWVudEFjdGlvbiwgSUhlbHBDb250ZXh0SWRzLkpTUF9SRUZBQ1RPUlJFTkFNRV9IRUxQSUQpOwotCQl0aGlzLm1vdmVFbGVtZW50QWN0aW9uID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihidW5kbGUsIElBY3Rpb25Db25zdGFudHNKcy5BQ1RJT05fTkFNRV9NT1ZFX0VMRU1FTlQgKyBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRFUlNDT1JFKTsKLQkJdGhpcy5tb3ZlRWxlbWVudEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUFjdGlvbkRlZmluaXRpb25JZHNKcy5NT1ZFX0VMRU1FTlQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMubW92ZUVsZW1lbnRBY3Rpb24sIElIZWxwQ29udGV4dElkcy5KU1BfUkVGQUNUT1JNT1ZFX0hFTFBJRCk7Ci0JCS8vIHRoZSByZWZhY3RvciBtZW51LCBhZGQgdGhlIG1lbnUgaXRzZWxmIHRvIGFkZCBhbGwgcmVmYWN0b3IgYWN0aW9ucwotCQl0aGlzLnJlZmFjdG9yTWVudSA9IG5ldyBNZW51TWFuYWdlcihKc1VJTWVzc2FnZXMuQWN0aW9uQ29udHJpYnV0b3JKU1BfMCwgUmVmYWN0b3JBY3Rpb25Hcm91cC5NRU5VX0lEKTsKLQkJcmVmYWN0b3JNZW51LmFkZCh0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24pOwotCQlyZWZhY3Rvck1lbnUuYWRkKHRoaXMubW92ZUVsZW1lbnRBY3Rpb24pOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuYWRkVG9NZW51KG1lbnUpOwotCQltZW51Lmluc2VydEFmdGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElULCB0aGlzLnJlZmFjdG9yTWVudSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRFeHRlbnNpb25JRHMoKSB7Ci0JCXJldHVybiBBY3Rpb25Db250cmlidXRvckpTUC5FRElUT1JfSURTOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0JCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCQl0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24uc2V0QWN0aW9uKGdldEFjdGlvbihnZXRUZXh0RWRpdG9yKGdldEFjdGl2ZUVkaXRvclBhcnQoKSksIElBY3Rpb25Db25zdGFudHNKcy5BQ1RJT05fTkFNRV9SRU5BTUVfRUxFTUVOVCkpOwotCQl0aGlzLm1vdmVFbGVtZW50QWN0aW9uLnNldEFjdGlvbihnZXRBY3Rpb24oZ2V0VGV4dEVkaXRvcihnZXRBY3RpdmVFZGl0b3JQYXJ0KCkpLCBJQWN0aW9uQ29uc3RhbnRzSnMuQUNUSU9OX05BTUVfTU9WRV9FTEVNRU5UKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoZW5hYmxlZCk7Ci0JCXRoaXMucmVuYW1lRWxlbWVudEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl0aGlzLm1vdmVFbGVtZW50QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ0MThmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJUGx1Z2luOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGludGVyZmFjZSBJSGVscENvbnRleHRJZHMgewotCS8vIEpTUCBGcmFnbWVudCBQcm9wZXJ0eSBQYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0ZSQUdNRU5UX0hFTFBJRCA9IElIZWxwQ29udGV4dElkcy5QUkVGSVggKyAianNwZjEwMDAiOyAvLyROT04tTkxTLTEkCi0JLy8gLy8gZmlndXJlZCBvdXQgb24gdGhlIGZseQotCS8vIC8vIEpTUCBTb3VyY2UgcGFnZSBlZGl0b3IKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfU09VUkNFVklFV19IRUxQSUQgPQotCS8vIENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1AgKyJfc291cmNlX0hlbHBJZCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBKU1AgTmV3IEZpbGUgV2l6YXJkIC0gVGVtcGxhdGUgUGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEID0gSUhlbHBDb250ZXh0SWRzLlBSRUZJWCArICJqc3B3MDAxMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBKU1AgRmlsZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCA9IElIZWxwQ29udGV4dElkcy5QUkVGSVggKyAid2VieDAwNTAiOyAvLyROT04tTkxTLTEkCi0JLy8gSlNQIFN0eWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCA9IElIZWxwQ29udGV4dElkcy5QUkVGSVggKyAid2VieDAwNTEiOyAvLyROT04tTkxTLTEkCi0JLy8gSlNQIFRlbXBsYXRlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUFJFRldFQlhfVEVNUExBVEVTX0hFTFBJRCA9IElIZWxwQ29udGV4dElkcy5QUkVGSVggKyAid2VieDAwNTIiOyAvLyROT04tTkxTLTEkCi0JLy8gUmVmYWN0b3IgTW92ZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9SRUZBQ1RPUk1PVkVfSEVMUElEID0gSUhlbHBDb250ZXh0SWRzLlBSRUZJWCArICJqc3ByMDAyMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBKU1AgU291cmNlIEVkaXRvciBDb250ZXh0IE1lbnUKLQkvLyBSZWZhY3RvciBSZW5hbWUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUkVGQUNUT1JSRU5BTUVfSEVMUElEID0gSUhlbHBDb250ZXh0SWRzLlBSRUZJWCArICJqc3ByMDAxMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gSnNVSVBsdWdpbi5JRCArICIuIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0dGluZ1N0cmF0ZWd5SlNEVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0dGluZ1N0cmF0ZWd5SlNEVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTkzZDY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvZm9ybWF0L0Zvcm1hdHRpbmdTdHJhdGVneUpTRFQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UeXBlZFBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Gb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZm9ybWF0dGVyLkNvZGVGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZXh0LnV0aWwuQ29kZUZvcm1hdHRlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBGb3JtYXR0aW5nU3RyYXRlZ3lKU0RUIGV4dGVuZHMgQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5IHsKLQkvKiogbWF0Y2hlcyBvbiAvLy0tPiBhdCBlbmQgb2Ygc2NyaXB0IHJlZ2lvbiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gRU5EX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIigoLy8uKi0tPlxccyopXFx6KSIpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCByZWdpb25TdGFydEluZGVudExldmVsID0gMTsKLQkvKiogRG9jdW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBieSB0aGlzIHN0cmF0ZWd5ICovCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZEb2N1bWVudHMgPSBuZXcgTGlua2VkTGlzdCgpOwotCS8qKiBQYXJ0aXRpb25zIHRvIGJlIGZvcm1hdHRlZCBieSB0aGlzIHN0cmF0ZWd5ICovCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZQYXJ0aXRpb25zID0gbmV3IExpbmtlZExpc3QoKTsKLQlwcml2YXRlIGludCBzdGFydEluZGVudExldmVsOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgamF2YSBmb3JtYXR0aW5nIHN0cmF0ZWd5LgotCSAqLwotCXB1YmxpYyBGb3JtYXR0aW5nU3RyYXRlZ3lKU0RUKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQljbGFzcyBNb2RlbElycml0YW50IGltcGxlbWVudHMgSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIgewotCQlwdWJsaWMgTW9kZWxJcnJpdGFudChJRG9jdW1lbnQgYXR0YWNoZWREb2MpIHt9Ci0JCQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQlkb2N1bWVudC5yZW1vdmVEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKHRoaXMpOwotCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQl0cnkgewotCQkJCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCkucmVwbGFjZSgwLCBkb2N1bWVudC5nZXRMZW5ndGgoKSwgZG9jdW1lbnQuZ2V0KCkpOwotCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kjZm9ybWF0KCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBmb3JtYXQoKSB7Ci0JCXN1cGVyLmZvcm1hdCgpOwotCQlmaW5hbCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudHMucmVtb3ZlRmlyc3QoKTsKLQkJZmluYWwgVHlwZWRQb3NpdGlvbiBwYXJ0aXRpb24gPSAoVHlwZWRQb3NpdGlvbikgZlBhcnRpdGlvbnMucmVtb3ZlRmlyc3QoKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBsaW5lRGVsaW0gPSBUZXh0VXRpbGl0aWVzLmdldERlZmF1bHRMaW5lRGVsaW1pdGVyKGRvY3VtZW50KTsKLQkJCXRyeSB7Ci0JCQkJLy9nZXQgdGhlIEpTIHRleHQgZnJvbSB0aGUgZG9jdW1lbnQgKG5vdCB0cmFuc2xhdGVkKQotCQkJCVN0cmluZyBqc1RleHROb3RUcmFuc2xhdGVkID0gZG9jdW1lbnQuZ2V0KHBhcnRpdGlvbi5nZXRPZmZzZXQoKSwgcGFydGl0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkKLQkJCQkvL2RlYWwgd2l0aCBnZXR0aW5nIHRoZSBKUyB0ZXh0IGFuZCB1bndyYXBwaW5nIGl0IGZyb20gYW55IDwhLS0gLy8tLT4gc3RhdGVtZW50cwotCQkJCVN0cmluZyBwcmVUZXh0ID0gIiI7Ci0JCQkJU3RyaW5nIHBvc3RUZXh0ID0gbGluZURlbGltOwotCi0JCQkJLy9maW5kIHN0YXJ0IGNvbW1lbnQgdGFnCi0JCQkJUGF0dGVybiBzdGFydFBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIihcXEEoXFxzKjwhLS0uKigiICsgbGluZURlbGltICsgIik/KSkiKTsKLQkJCQlNYXRjaGVyIG1hdGNoZXIgPSBzdGFydFBhdHRlcm4ubWF0Y2hlcihqc1RleHROb3RUcmFuc2xhdGVkKTsKLQkJCQlpZihtYXRjaGVyLmZpbmQoKSkgewotCQkJCQlqc1RleHROb3RUcmFuc2xhdGVkID0gbWF0Y2hlci5yZXBsYWNlRmlyc3QoIiIpOwotCQkJCQlwcmVUZXh0ID0gbGluZURlbGltICsgbWF0Y2hlci5ncm91cCgpLnRyaW0oKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy9maW5kIGVuZCB0YWcKLQkJCQltYXRjaGVyID0gRU5EX1BBVFRFUk4ubWF0Y2hlcihqc1RleHROb3RUcmFuc2xhdGVkKTsKLQkJCQlpZihtYXRjaGVyLmZpbmQoKSkgewotCQkJCQlqc1RleHROb3RUcmFuc2xhdGVkID0gbWF0Y2hlci5yZXBsYWNlRmlyc3QoIiIpOwotCQkJCQlwb3N0VGV4dCA9IGxpbmVEZWxpbSArIG1hdGNoZXIuZ3JvdXAoKS50cmltKCkgKyBsaW5lRGVsaW07Ci0JCQkJfQotCQkJCQotCQkJCS8vcmVwbGFjZSB0aGUgdGV4dCBpbiB0aGUgZG9jdW1lbnQgd2l0aCB0aGUgbm9uZS10cmFuc2xhdGVkIEpTIHRleHQgYnV0IHdpdGhvdXQgSFRNTCBsZWFkaW5nIGFuZCB0cmFpbGluZyBjb21tZW50cwotCQkJCVRleHRFZGl0IHJlcGxhY2VFZGl0ID0gbmV3IFJlcGxhY2VFZGl0KHBhcnRpdGlvbi5nZXRPZmZzZXQoKSwgcGFydGl0aW9uLmdldExlbmd0aCgpLCBqc1RleHROb3RUcmFuc2xhdGVkKTsKLQkJCQlyZXBsYWNlRWRpdC5hcHBseShkb2N1bWVudCk7Ci0JCQkJaW50IGpzUmVnaW9uTGVuZ3RoID0ganNUZXh0Tm90VHJhbnNsYXRlZC5sZW5ndGgoKTsKLQkJCQkKLQkJCQkvL3RyYW5zbGF0ZSB0aGUgdXBkYXRlZCBkb2N1bWVudAotCQkJCUlKc1RyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gZ2V0VHJhbnNsYXRpb24oZG9jdW1lbnQpOwotCQkJCVN0cmluZyBqc1RleHRUcmFuc2xhdGVkID0gdHJhbnNsYXRpb24uZ2V0SnNUZXh0KCk7Ci0JCQkJCi0JCQkJLy9mb3JtYXQgdGhlIHRleHQgdHJhbnNsYXRlZCB0ZXh0Ci0JCQkJVGV4dEVkaXQgZWRpdCA9IENvZGVGb3JtYXR0ZXJVdGlsLmZvcm1hdDIoQ29kZUZvcm1hdHRlci5LX0pBVkFTQ1JJUFRfVU5JVCwganNUZXh0VHJhbnNsYXRlZCwgcGFydGl0aW9uLmdldE9mZnNldCgpLCBqc1JlZ2lvbkxlbmd0aCwgc3RhcnRJbmRlbnRMZXZlbCwgbGluZURlbGltLCBnZXRQcmVmZXJlbmNlcygpKTsKLQkJCQlJRG9jdW1lbnQganNEb2MgPSBuZXcgRG9jdW1lbnQoanNUZXh0VHJhbnNsYXRlZCk7Ci0JCQkJCi0JCQkJLy9VbmRvIHRoZSB0ZXh0IHJlcGxhY2VtZW50cyBkb25lIGJ5IHRoZSB0cmFuc2xhdG9yIHNvIHRoYXQgaXQgY291bGQgYnVpbGQgYSBDVSBmb3IgdGhlIEpTIHJlZ2lvbgotCQkJCWlmKHRyYW5zbGF0aW9uIGluc3RhbmNlb2YgSnNUcmFuc2xhdGlvbikgewotCQkJCQlJSnNUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSAoKEpzVHJhbnNsYXRpb24pdHJhbnNsYXRpb24pLmdldFRyYW5zbGF0b3IoKTsKLQkJCQkJCi0JCQkJCWlmKHRyYW5zbGF0b3IgaW5zdGFuY2VvZiBKc1RyYW5zbGF0b3IpIHsKLQkJCQkJCVJlZ2lvbltdIHJlZ2lvbnMgPSAoKEpzVHJhbnNsYXRvcil0cmFuc2xhdG9yKS5nZXRHZW5lcmF0ZWRSYW5nZXMoKTsKLQkJCQkJCS8vZm9yIGVhY2ggZ2VuZXJhdGVkIHJhbmdlLCByZXBsYWNlIGl0IHdpdGggdGhlIG9yaWdpbmFsIHRleHQKLQkJCQkJCWZvcihpbnQgciA9IDA7IHIgPCByZWdpb25zLmxlbmd0aDsgKytyKSB7Ci0JCQkJCQkJanNEb2MucmVwbGFjZShyZWdpb25zW3JdLmdldE9mZnNldCgpLCByZWdpb25zW3JdLmdldExlbmd0aCgpLAotCQkJCQkJCQkJZG9jdW1lbnQuZ2V0KHJlZ2lvbnNbcl0uZ2V0T2Zmc2V0KCksIHJlZ2lvbnNbcl0uZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvKiBlcnJvciBmb3JtYXRpbmcgdGhlIGNvZGUgc28gYWJvcnQgKi8KLQkJCQlpZihlZGl0PT1udWxsKSByZXR1cm47Ci0JCQkJZWRpdC5hcHBseShqc0RvYyk7Ci0JCQkJU3RyaW5nIHJlcGxhY2VUZXh0ID0gbGluZURlbGltICsgZ2V0SW5kZW50YXRpb25TdHJpbmcoZ2V0UHJlZmVyZW5jZXMoKSwgc3RhcnRJbmRlbnRMZXZlbCkgKyAoanNEb2MuZ2V0KGVkaXQuZ2V0T2Zmc2V0KCksIGVkaXQuZ2V0TGVuZ3RoKCkpKS50cmltKCk7Ci0JCQkJCi0JCQkJLy9hcHBseSBlZGl0IHRvIGh0bWwgZG9jIHVzaW5nIHRoZSBmb3JtYXRlZCB0cmFuc2xhdGVkIHRleHQgYW5kIHRoZSBwb3NzaWJsZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBodG1sIGNvbW1lbnRzCi0JCQkJcmVwbGFjZVRleHQgPSBwcmVUZXh0ICsgcmVwbGFjZVRleHQgKyBwb3N0VGV4dDsKLQkJCQlyZXBsYWNlRWRpdCA9IG5ldyBSZXBsYWNlRWRpdChwYXJ0aXRpb24uZ2V0T2Zmc2V0KCksIGpzUmVnaW9uTGVuZ3RoLCByZXBsYWNlVGV4dCk7Ci0JCQkJcmVwbGFjZUVkaXQuYXBwbHkoZG9jdW1lbnQpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kjZm9ybWF0dGVyU3RhcnRzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nQ29udGV4dCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBmb3JtYXR0ZXJTdGFydHMoZmluYWwgSUZvcm1hdHRpbmdDb250ZXh0IGNvbnRleHQpIHsKLQkJZlBhcnRpdGlvbnMuYWRkTGFzdChjb250ZXh0LmdldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX1BBUlRJVElPTikpOwotCQlmRG9jdW1lbnRzLmFkZExhc3QoY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9NRURJVU0pKTsKLQkJc3RhcnRJbmRlbnRMZXZlbCA9IEZvcm1hdHRpbmdTdHJhdGVneUpTRFQucmVnaW9uU3RhcnRJbmRlbnRMZXZlbCArIDA7Ci0JCU1hcCBwcm9qZWN0T3B0aW9ucyA9IChNYXApIGNvbnRleHQuZ2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfUFJFRkVSRU5DRVMpOwotCQlpZiAocHJvamVjdE9wdGlvbnMgPT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvYyA9IChJRG9jdW1lbnQpIGNvbnRleHQuZ2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfTUVESVVNKTsKLQkJCWNvbnRleHQuc2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfUFJFRkVSRU5DRVMsIGdldFByb2plY3RPcHRpb25zKGRvYykpOwotCQl9Ci0JCXN1cGVyLmZvcm1hdHRlclN0YXJ0cyhjb250ZXh0KTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXR0ZXJTdG9wcygpCi0JICovCi0JCi0JcHVibGljIHZvaWQgZm9ybWF0dGVyU3RvcHMoKSB7Ci0JCXN1cGVyLmZvcm1hdHRlclN0b3BzKCk7Ci0JCWZQYXJ0aXRpb25zLmNsZWFyKCk7Ci0JCWZEb2N1bWVudHMuY2xlYXIoKTsKLQkJc3RhcnRJbmRlbnRMZXZlbCA9IDA7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5kZW50YXRpb25TdHJpbmcoTWFwIG9wdGlvbnMsIGludCBpbmRlbnRhdGlvbkxldmVsKSB7Ci0JCURlZmF1bHRDb2RlRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBEZWZhdWx0Q29kZUZvcm1hdHRlcihvcHRpb25zKTsKLQkJcmV0dXJuIGZvcm1hdHRlci5jcmVhdGVJbmRlbnRhdGlvblN0cmluZyhpbmRlbnRhdGlvbkxldmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNYXAgZ2V0UHJvamVjdE9wdGlvbnMoSURvY3VtZW50IGJhc2VEb2N1bWVudCkgewotCQlJSmF2YVNjcmlwdFByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQlNYXAgb3B0aW9ucyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoYmFzZURvY3VtZW50KTsKLQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSB4bWxNb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJSVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOwotCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCQlpZiAoZmlsZVBhdGguc2VnbWVudENvdW50KCkgPiAwKSB7Ci0JCQkJcHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChmaWxlUGF0aC5zZWdtZW50KDApKTsKLQkJCX0KLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlqYXZhUHJvamVjdCA9IEphdmFTY3JpcHRDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCW9wdGlvbnMgPSBqYXZhUHJvamVjdC5nZXRPcHRpb25zKHRydWUpOwotCQl9Ci0JCXJldHVybiBvcHRpb25zOwotCX0KLQkKLQlwdWJsaWMgSUpzVHJhbnNsYXRpb24gZ2V0VHJhbnNsYXRpb24oSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlJSnNUcmFuc2xhdGlvbiB0cmFuID0gbnVsbDsKLQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyIHRyYW5zbGF0aW9uQWRhcHRlciA9IChKc1RyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJaWYgKHRyYW5zbGF0aW9uQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJdHJhbiA9IHRyYW5zbGF0aW9uQWRhcHRlci5nZXRKc1RyYW5zbGF0aW9uKHRydWUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJhbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVFZGl0b3JJbnB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE4YzQyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGF0aEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotY2xhc3MgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJRWRpdG9ySW5wdXQsIElMb2NhdGlvblByb3ZpZGVyIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvKioKLQkgKiBUaGUgd29ya2JlbmNoIGFkYXB0ZXIgd2hpY2ggc2ltcGx5IHByb3ZpZGVzIHRoZSBsYWJlbC4KLQkgKiAKLQkgKiBAc2VlIEVjbGlwc2UgMy4xCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBXb3JrYmVuY2hBZGFwdGVyIGltcGxlbWVudHMgSVdvcmtiZW5jaEFkYXB0ZXIgewotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldEltYWdlRGVzY3JpcHRvcihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0TGFiZWwoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pIHsKLQkJCXJldHVybiAoKEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSBvKS5nZXROYW1lKCk7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBGaWxlIGZGaWxlOwotCXByaXZhdGUgV29ya2JlbmNoQWRhcHRlciBmV29ya2JlbmNoQWRhcHRlciA9IG5ldyBXb3JrYmVuY2hBZGFwdGVyKCk7Ci0JCi0JcHVibGljIEV4dGVybmFsRmlsZUVkaXRvcklucHV0KEZpbGUgZmlsZSkgewotCQlzdXBlcigpOwotCQlmRmlsZSA9IGZpbGU7Ci0JCWZXb3JrYmVuY2hBZGFwdGVyID0gbmV3IFdvcmtiZW5jaEFkYXB0ZXIoKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvIGluc3RhbmNlb2YgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUV4dGVybmFsRmlsZUVkaXRvcklucHV0IGlucHV0ID0gKEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSBvOwotCQkJcmV0dXJuIGZGaWxlLmVxdWFscyhpbnB1dC5mRmlsZSk7Ci0JCX0KLQkJaWYgKG8gaW5zdGFuY2VvZiBJUGF0aEVkaXRvcklucHV0KSB7Ci0JCQlJUGF0aEVkaXRvcklucHV0IGlucHV0ID0gKElQYXRoRWRpdG9ySW5wdXQpIG87Ci0JCQlyZXR1cm4gZ2V0UGF0aCgpLmVxdWFscyhpbnB1dC5nZXRQYXRoKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNleGlzdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGZGaWxlLmV4aXN0cygpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKElMb2NhdGlvblByb3ZpZGVyLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJaWYgKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJcmV0dXJuIGZXb3JrYmVuY2hBZGFwdGVyOwotCQl9Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0SW1hZ2VEZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZkZpbGUuZ2V0TmFtZSgpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBhdGhFZGl0b3JJbnB1dCNnZXRQYXRoKCkKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JCXJldHVybiBQYXRoLmZyb21PU1N0cmluZyhmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUxvY2F0aW9uUHJvdmlkZXIjZ2V0UGF0aChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUV4dGVybmFsRmlsZUVkaXRvcklucHV0IGlucHV0ID0gKEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSBlbGVtZW50OwotCQkJcmV0dXJuIFBhdGguZnJvbU9TU3RyaW5nKGlucHV0LmZGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRQZXJzaXN0YWJsZSgpCi0JICovCi0JcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gZkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQkKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZkZpbGUuaGFzaENvZGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODkwNWVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1jbGFzcyBFeHRlcm5hbEZpbGVIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQlwcml2YXRlIEZpbGUgZkh5cGVybGlua0ZpbGU7Ci0JcHJpdmF0ZSBJUmVnaW9uIGZIeXBlcmxpbmtSZWdpb247Ci0JCi0JcHVibGljIEV4dGVybmFsRmlsZUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgRmlsZSBmaWxlKSB7Ci0JCWZIeXBlcmxpbmtGaWxlID0gZmlsZTsKLQkJZkh5cGVybGlua1JlZ2lvbiA9IHJlZ2lvbjsKLQl9Ci0JCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZkh5cGVybGlua1JlZ2lvbjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQlTdHJpbmcgcGF0aCA9IGZIeXBlcmxpbmtGaWxlLmdldFBhdGgoKTsKLQkJaWYgKHBhdGgubGVuZ3RoKCkgPiA2MCkgewotCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIDI1KSArICIuLi4iICsgcGF0aC5zdWJzdHJpbmcocGF0aC5sZW5ndGgoKSAtIDI1LCBwYXRoLmxlbmd0aCgpKTsKLQkJfQotCQlyZXR1cm4gTkxTLmJpbmQoSFRNTFVJTWVzc2FnZXMuT3BlbiwgcGF0aCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJaWYgKGZIeXBlcmxpbmtGaWxlICE9IG51bGwpIHsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dChmSHlwZXJsaW5rRmlsZSk7Ci0JCQlJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCQkJdHJ5IHsKLQkJCQlkZXNjcmlwdG9yID0gSURFLmdldEVkaXRvckRlc2NyaXB0b3IoaW5wdXQuZ2V0TmFtZSgpLCB0cnVlKTsKLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgaW5wdXQsIGRlc2NyaXB0b3IuZ2V0SWQoKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0pTRFRIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0pTRFRIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjODA5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9KU0RUSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS5hY3Rpb25zLkFjdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLkphdmFTY3JpcHRVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuTG9nZ2VyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWNsYXNzIEpTRFRIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQlwcml2YXRlIElKYXZhU2NyaXB0RWxlbWVudCBmRWxlbWVudDsKLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQkKLQlwdWJsaWMgSlNEVEh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZkVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rUmVnaW9uKCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmUmVnaW9uOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQlyZXR1cm4gQWN0aW9uTWVzc2FnZXMuT3BlbkFjdGlvbl9kZWNsYXJhdGlvbl9sYWJlbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldFR5cGVMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNvcGVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQl0cnkgewotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSmF2YVNjcmlwdFVJLm9wZW5JbkVkaXRvcihmRWxlbWVudCk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlKYXZhU2NyaXB0VUkucmV2ZWFsSW5FZGl0b3IoZWRpdG9yLCBmRWxlbWVudCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9KU0RUSHlwZXJsaW5rRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0pTRFRIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTkzMDk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0pTRFRIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLkFic3RyYWN0SHlwZXJsaW5rRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklDbGFzc0ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JRnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklTb3VyY2VSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklTb3VyY2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0TW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5KYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVEh5cGVybGlua0RldGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RIeXBlcmxpbmtEZXRlY3RvciB7Ci0JcHJpdmF0ZSBJSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCwgSVJlZ2lvbiByZWdpb24sIElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJSHlwZXJsaW5rIGxpbmsgPSBudWxsOwotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIG9wZW4gbG9jYWwgdmFyaWFibGUgaW4gdGhlIEpTUCBmaWxlLi4uCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTb3VyY2VSZWZlcmVuY2UpIHsKLQkJCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJCQlJUGF0aCBvdXRzaWRlUGF0aCA9IG51bGw7Ci0JCQkJaW50IGpzcE9mZnNldCA9IDA7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJCS8vIHRyeSB0byBsb2NhdGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZQotCQkJCXRyeSB7Ci0JCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBzTW9kZWwuZ2V0UmVzb2x2ZXIoKTsKLQkJCQkJCS8vaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLQkJCQkJCS8vCVN0cmluZyB1cmlTdHJpbmcgPSByZXNvbHZlci5nZXRGaWxlQmFzZUxvY2F0aW9uKCk7Ci0JCQkJCQlTdHJpbmcgdXJpU3RyaW5nID0gc01vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCQkJCWZpbGUgPSBnZXRGaWxlKHVyaVN0cmluZyk7Ci0JCQkJCS8vCX0KLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIGdldCBKYXZhIHJhbmdlLCB0cmFuc2xhdGUgY29vcmRpbmF0ZSB0byBKU1AKLQkJCQl0cnkgewotCQkJCQlJU291cmNlUmFuZ2UgcmFuZ2UgPSBudWxsOwotCQkJCQlJSnNUcmFuc2xhdGlvbiBqc3BUcmFuc2xhdGlvbiA9IGdldEpzVHJhbnNsYXRpb24oZG9jdW1lbnQpOwotCQkJCQlpZiAoanNwVHJhbnNsYXRpb24gIT0gbnVsbCkgewotCQkJCQkJLy8gbGluayB0byBsb2NhbCB2YXJpYWJsZSBkZWZpbml0aW9ucwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9jYWxWYXJpYWJsZSkgewotCQkJCQkJCXJhbmdlID0gKChJTG9jYWxWYXJpYWJsZSkgZWxlbWVudCkuZ2V0TmFtZVJhbmdlKCk7Ci0JCQkJCQkJSUphdmFTY3JpcHRFbGVtZW50IHVuaXQ9KChJTG9jYWxWYXJpYWJsZSkgZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0JCQkJCQkJSUphdmFTY3JpcHRVbml0IG15VW5pdCA9IGpzcFRyYW5zbGF0aW9uLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJCQkJCQotCQkJCQkJCXdoaWxlKCEodW5pdCBpbnN0YW5jZW9mIElKYXZhU2NyaXB0VW5pdCB8fCB1bml0IGluc3RhbmNlb2YgSUNsYXNzRmlsZSB8fCB1bml0PT1udWxsKSkgewotCQkJCQkJCQl1bml0ID0gKChKYXZhRWxlbWVudCkgdW5pdCkuZ2V0UGFyZW50KCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmKHVuaXQgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdFVuaXQpIHsKLQkJCQkJCQkJSUphdmFTY3JpcHRVbml0IGN1ID0gKElKYXZhU2NyaXB0VW5pdCl1bml0OwotCQkJCQkJCQlpZihjdSE9bXlVbml0KSB7Ci0JCQkJCQkJCQlmaWxlID0gZ2V0RmlsZShjdS5nZXRQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCQlpZihmaWxlPT1udWxsKSB7Ci0JCQkJCQkJCQkJb3V0c2lkZVBhdGggPSBjdS5nZXRQYXRoKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9ZWxzZSBpZih1bml0IGluc3RhbmNlb2YgSUNsYXNzRmlsZSkgewotCQkJCQkJCQlJQ2xhc3NGaWxlIGN1ID0gKElDbGFzc0ZpbGUpdW5pdDsKLQkJCQkJCQkJaWYoY3UhPW15VW5pdCkgewotCQkJCQkJCQkJZmlsZSA9IGdldEZpbGUoY3UuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCQkJCQkJaWYoZmlsZT09bnVsbCkgewotCQkJCQkJCQkJCW91dHNpZGVQYXRoID0gY3UuZ2V0UGF0aCgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJfQotCQkJCQkJLy8gbGlua2luZyB0byBmaWVsZHMgb2YgdGhlIHNhbWUgY29tcGlsYXRpb24gdW5pdAotCQkJCQkJZWxzZSBpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhU2NyaXB0RWxlbWVudC5GSUVMRCkgewotCQkJCQkJCU9iamVjdCBjdSA9ICgoSUZpZWxkKSBlbGVtZW50KS5nZXRKYXZhU2NyaXB0VW5pdCgpOwotCQkJCQkJCWlmIChjdSAhPSBudWxsICYmIGN1LmVxdWFscyhqc3BUcmFuc2xhdGlvbi5nZXRDb21waWxhdGlvblVuaXQoKSkpIHsKLQkJCQkJCQkJcmFuZ2UgPSAoKElTb3VyY2VSZWZlcmVuY2UpIGVsZW1lbnQpLmdldFNvdXJjZVJhbmdlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gbGlua2luZyB0byBtZXRob2RzIG9mIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQKLQkJCQkJCWVsc2UgaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YVNjcmlwdEVsZW1lbnQuTUVUSE9EKSB7Ci0JCQkJCQkJT2JqZWN0IGN1ID0gKChJRnVuY3Rpb24pIGVsZW1lbnQpLmdldEphdmFTY3JpcHRVbml0KCk7Ci0JCQkJCQkJaWYgKGN1ICE9IG51bGwgJiYgY3UuZXF1YWxzKGpzcFRyYW5zbGF0aW9uLmdldENvbXBpbGF0aW9uVW5pdCgpKSkgewotCQkJCQkJCQlyYW5nZSA9ICgoSVNvdXJjZVJlZmVyZW5jZSkgZWxlbWVudCkuZ2V0U291cmNlUmFuZ2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHJhbmdlICE9IG51bGwgJiYgZmlsZSAhPSBudWxsKSB7Ci0JCQkJCQlqc3BPZmZzZXQgPSByYW5nZS5nZXRPZmZzZXQoKTsKLQkJCQkJCWlmIChqc3BPZmZzZXQgPj0gMCkgewotCQkJCQkJCWxpbmsgPSBuZXcgV29ya3NwYWNlRmlsZUh5cGVybGluayhyZWdpb24sIGZpbGUsIG5ldyBSZWdpb24oanNwT2Zmc2V0LCByYW5nZS5nZXRMZW5ndGgoKSkpOwotCQkJCQkJfQotCQkJCQl9ZWxzZSBpZiAocmFuZ2UhPW51bGwgJiYgb3V0c2lkZVBhdGghPW51bGwpIHsKLQkJCQkJCWpzcE9mZnNldCA9IHJhbmdlLmdldE9mZnNldCgpOwotCQkJCQkJaWYgKGpzcE9mZnNldCA+PSAwKSB7Ci0JCQkJCQkJbGluayA9IG5ldyBFeHRlcm5hbEZpbGVIeXBlcmxpbmsocmVnaW9uLG91dHNpZGVQYXRoLnRvRmlsZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgam1lLmdldE1lc3NhZ2UoKSwgam1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobGluayA9PSBudWxsKSB7Ci0JCQkJbGluayA9IG5ldyBKU0RUSHlwZXJsaW5rKHJlZ2lvbiwgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGlua0RldGVjdG9yI2RldGVjdEh5cGVybGlua3Mob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSUh5cGVybGlua1tdIGRldGVjdEh5cGVybGlua3MoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiByZWdpb24sIGJvb2xlYW4gY2FuU2hvd011bHRpcGxlSHlwZXJsaW5rcykgewotCQlMaXN0IGh5cGVybGlua3MgPSBuZXcgQXJyYXlMaXN0KDApOwotCQlpZiAocmVnaW9uICE9IG51bGwgJiYgdGV4dFZpZXdlciAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQlJSnNUcmFuc2xhdGlvbiBqc1RyYW5zbGF0aW9uID0gZ2V0SnNUcmFuc2xhdGlvbihkb2N1bWVudCk7Ci0JCQlpZiAoanNUcmFuc2xhdGlvbiAhPSBudWxsKSB7Ci0JCQkJSUphdmFTY3JpcHRFbGVtZW50W10gZWxlbWVudHMgPSBqc1RyYW5zbGF0aW9uLmdldEVsZW1lbnRzRnJvbUpzUmFuZ2UocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWlmIChlbGVtZW50cyAhPSBudWxsICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLQkJCQkJLy8gY3JlYXRlIGEgaHlwZXJsaW5rIGZvciBlYWNoIEphdmFTY3JpcHQgZWxlbWVudAotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7Ci0JCQkJCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCQkJLy8gZmluZCBoeXBlcmxpbmsgcmFuZ2UgZm9yIEphdmEgZWxlbWVudAotCQkJCQkJSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24gPSBzZWxlY3RXb3JkKGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCQkJSUh5cGVybGluayBsaW5rID0gY3JlYXRlSHlwZXJsaW5rKGVsZW1lbnQsIGh5cGVybGlua1JlZ2lvbiwgZG9jdW1lbnQpOwotCQkJCQkJaWYgKGxpbmsgIT0gbnVsbCkgewotCQkJCQkJCWh5cGVybGlua3MuYWRkKGxpbmspOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChoeXBlcmxpbmtzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKElIeXBlcmxpbmtbXSkgaHlwZXJsaW5rcy50b0FycmF5KG5ldyBJSHlwZXJsaW5rWzBdKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBJRmlsZSBmcm9tIHRoZSBnaXZlbiB1cmkgaWYgcG9zc2libGUsIG51bGwgaWYgY2Fubm90IGZpbmQgZmlsZQotCSAqIGZyb20gdXJpLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlU3RyaW5nCi0JICogICAgICAgICAgICBmaWxlIHN5c3RlbSBwYXRoCi0JICogQHJldHVybiByZXR1cm5zIElGaWxlIGlmIGZpbGVTdHJpbmcgZXhpc3RzIGluIHRoZSB3b3Jrc3BhY2UKLQkgKi8KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoU3RyaW5nIGZpbGVTdHJpbmcpIHsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWlmIChmaWxlU3RyaW5nICE9IG51bGwpIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSAgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZmlsZVN0cmluZyk7Ci0JCQlpZihyZXNvdXJjZSE9bnVsbCAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJZmlsZSA9IChJRmlsZSlyZXNvdXJjZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IEpTUCB0cmFuc2xhdGlvbiBvYmplY3QKLQkgKiAKLQkgKiBAcmV0dXJuIEpTUFRyYW5zbGF0aW9uIGlmIG9uZSBleGlzdHMsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBJSnNUcmFuc2xhdGlvbiBnZXRKc1RyYW5zbGF0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJSnNUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IG51bGw7Ci0JCUlET01Nb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQlKc1RyYW5zbGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKEpzVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQl0cmFuc2xhdGlvbiA9IGFkYXB0ZXIuZ2V0SnNUcmFuc2xhdGlvbih0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cmFuc2xhdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogSmF2YSBhbHdheXMgc2VsZWN0cyB3b3JkIHdoZW4gZGVmaW5pbmcgcmVnaW9uCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHBhcmFtIGFuY2hvcgotCSAqIEByZXR1cm4gSVJlZ2lvbgotCSAqLwotCXByaXZhdGUgSVJlZ2lvbiBzZWxlY3RXb3JkKElEb2N1bWVudCBkb2N1bWVudCwgaW50IGFuY2hvcikgewotCQl0cnkgewotCQkJaW50IG9mZnNldCA9IGFuY2hvcjsKLQkJCWNoYXIgYzsKLQkJCXdoaWxlIChvZmZzZXQgPj0gMCkgewotCQkJCWMgPSBkb2N1bWVudC5nZXRDaGFyKG9mZnNldCk7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS0tb2Zmc2V0OwotCQkJfQotCQkJaW50IHN0YXJ0ID0gb2Zmc2V0OwotCQkJb2Zmc2V0ID0gYW5jaG9yOwotCQkJaW50IGxlbmd0aCA9IGRvY3VtZW50LmdldExlbmd0aCgpOwotCQkJd2hpbGUgKG9mZnNldCA8IGxlbmd0aCkgewotCQkJCWMgPSBkb2N1bWVudC5nZXRDaGFyKG9mZnNldCk7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCSsrb2Zmc2V0OwotCQkJfQotCQkJaW50IGVuZCA9IG9mZnNldDsKLQkJCWlmIChzdGFydCA9PSBlbmQpIHsKLQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihzdGFydCwgMCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFJlZ2lvbihzdGFydCArIDEsIGVuZCAtIHN0YXJ0IC0gMSk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvV29ya3NwYWNlRmlsZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvV29ya3NwYWNlRmlsZUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTQ4ZmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1dvcmtzcGFjZUZpbGVIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLQotY2xhc3MgV29ya3NwYWNlRmlsZUh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluawotCXByaXZhdGUgSUZpbGUgZkZpbGU7Ci0JcHJpdmF0ZSBJUmVnaW9uIGZIaWdobGlnaHRSYW5nZTsKLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQkKLQlwdWJsaWMgV29ya3NwYWNlRmlsZUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgSUZpbGUgZmlsZSkgewotCQlmUmVnaW9uID0gcmVnaW9uOwotCQlmRmlsZSA9IGZpbGU7Ci0JfQotCQotCXB1YmxpYyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBJRmlsZSBmaWxlLCBJUmVnaW9uIHJhbmdlKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZGaWxlID0gZmlsZTsKLQkJZkhpZ2hsaWdodFJhbmdlID0gcmFuZ2U7Ci0JfQotCQotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZSZWdpb247Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCVN0cmluZyBwYXRoID0gZkZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQlpZiAocGF0aC5sZW5ndGgoKSA+IDYwKSB7Ci0JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgMjUpICsgIi4uLiIgKyBwYXRoLnN1YnN0cmluZyhwYXRoLmxlbmd0aCgpIC0gMjUsIHBhdGgubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiBOTFMuYmluZChIVE1MVUlNZXNzYWdlcy5PcGVuLCBwYXRoKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldFR5cGVMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCWlmIChmRmlsZSAhPSBudWxsICYmIGZGaWxlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBJREUub3BlbkVkaXRvcihwYWdlLCBmRmlsZSwgdHJ1ZSk7Ci0JCQkJLy8gaGlnaGxpZ2h0IHJhbmdlIGluIGVkaXRvciBpZiBwb3NzaWJsZQotCQkJCWlmIChmSGlnaGxpZ2h0UmFuZ2UgIT0gbnVsbCAmJiBlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJCQkoKElUZXh0RWRpdG9yKSBlZGl0b3IpLnNlbGVjdEFuZFJldmVhbChmSGlnaGxpZ2h0UmFuZ2UuZ2V0T2Zmc2V0KCksIGZIaWdobGlnaHRSYW5nZS5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgcGllLmdldE1lc3NhZ2UoKSwgcGllKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1hNTEh5cGVybGlua0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9YTUxIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjYwM2QwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1hNTEh5cGVybGlua0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5VUkxIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgWE1MSHlwZXJsaW5rRGV0ZWN0b3IgaW1wbGVtZW50cyBJSHlwZXJsaW5rRGV0ZWN0b3IgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluawotCXByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBfUFJPVE9DT0wgPSAiaHR0cDovLyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIE5PX05BTUVTUEFDRV9TQ0hFTUFfTE9DQVRJT04gPSAibm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBTQ0hFTUFfTE9DQVRJT04gPSAic2NoZW1hTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWE1MTlMgPSAieG1sbnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWFNJX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBoeXBlcmxpbmsKLQkgKiAKLQkgKiBAcGFyYW0gdXJpU3RyaW5nCi0JICogQHBhcmFtIGh5cGVybGlua1JlZ2lvbgotCSAqIEByZXR1cm4gSUh5cGVybGluawotCSAqLwotCXByaXZhdGUgSUh5cGVybGluayBjcmVhdGVIeXBlcmxpbmsoU3RyaW5nIHVyaVN0cmluZywgSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24sIElEb2N1bWVudCBkb2N1bWVudCwgTm9kZSBub2RlKSB7Ci0JCUlIeXBlcmxpbmsgbGluayA9IG51bGw7Ci0JCWlmIChpc0h0dHAodXJpU3RyaW5nKSkgewotCQkJbGluayA9IG5ldyBVUkxIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCB1cmlTdHJpbmcpOwotCQl9IGVsc2UgewotCQkJLy8gdHJ5IHRvIGxvY2F0ZSB0aGUgZmlsZSBpbiB0aGUgd29ya3NwYWNlCi0JCQlGaWxlIHN5c3RlbUZpbGUgPSBnZXRGaWxlRnJvbVVyaVN0cmluZyh1cmlTdHJpbmcpOwotCQkJaWYgKHN5c3RlbUZpbGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBzeXN0ZW1QYXRoID0gc3lzdGVtRmlsZS5nZXRQYXRoKCk7Ci0JCQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoc3lzdGVtUGF0aCk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQkvLyB0aGlzIGlzIGEgV29ya3NwYWNlRmlsZUh5cGVybGluayBzaW5jZSBmaWxlIGV4aXN0cyBpbgotCQkJCQkvLyB3b3Jrc3BhY2UKLQkJCQkJbGluayA9IG5ldyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgZmlsZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gdGhpcyBpcyBhbiBFeHRlcm5hbEZpbGVIeXBlcmxpbmsgc2luY2UgZmlsZSBkb2VzIG5vdAotCQkJCQkvLyBleGlzdCBpbiB3b3Jrc3BhY2UKLQkJCQkJbGluayA9IG5ldyBFeHRlcm5hbEZpbGVIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCBzeXN0ZW1GaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCQotCXB1YmxpYyBJSHlwZXJsaW5rW10gZGV0ZWN0SHlwZXJsaW5rcyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgYm9vbGVhbiBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKSB7Ci0JCS8vIGZvciBub3csIG9ubHkgY2FwYWJsZSBvZiBjcmVhdGluZyAxIGh5cGVybGluawotCQlMaXN0IGh5cGVybGlua3MgPSBuZXcgQXJyYXlMaXN0KDApOwotCQlpZiAocmVnaW9uICE9IG51bGwgJiYgdGV4dFZpZXdlciAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQlOb2RlIGN1cnJlbnROb2RlID0gZ2V0Q3VycmVudE5vZGUoZG9jdW1lbnQsIHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyB1cmlTdHJpbmcgPSBudWxsOwotCQkJCWlmIChjdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQkJCS8vIGRvY3R5cGUgbm9kZXMKLQkJCQkJdXJpU3RyaW5nID0gZ2V0VVJJU3RyaW5nKGN1cnJlbnROb2RlLCBkb2N1bWVudCk7Ci0JCQkJfSBlbHNlIGlmIChjdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCS8vIGVsZW1lbnQgbm9kZXMKLQkJCQkJQXR0ciBjdXJyZW50QXR0ciA9IGdldEN1cnJlbnRBdHRyTm9kZShjdXJyZW50Tm9kZSwgcmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCQkJaWYgKGN1cnJlbnRBdHRyICE9IG51bGwpIHsKLQkJCQkJCS8vIHRyeSB0byBmaW5kIGxpbmsgZm9yIGN1cnJlbnQgYXR0cmlidXRlCi0JCQkJCQkvLyByZXNvbHZlIGF0dHJpYnV0ZSB2YWx1ZQotCQkJCQkJdXJpU3RyaW5nID0gZ2V0VVJJU3RyaW5nKGN1cnJlbnRBdHRyLCBkb2N1bWVudCk7Ci0JCQkJCQkvLyB2ZXJpZnkgdmFsaWRpdHkgb2YgdXJpIHN0cmluZwotCQkJCQkJaWYgKHVyaVN0cmluZyA9PSBudWxsIHx8ICFpc1ZhbGlkVVJJKHVyaVN0cmluZykpIHsKLQkJCQkJCQkvLyByZXNldCBjdXJyZW50IGF0dHJpYnV0ZQotCQkJCQkJCWN1cnJlbnRBdHRyID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoY3VycmVudEF0dHIgPT0gbnVsbCkgewotCQkJCQkJLy8gdHJ5IHRvIGZpbmQgYSBsaW5rYWJsZSBhdHRyaWJ1dGUgd2l0aGluIGVsZW1lbnQKLQkJCQkJCWN1cnJlbnRBdHRyID0gZ2V0TGlua2FibGVBdHRyKChFbGVtZW50KSBjdXJyZW50Tm9kZSk7Ci0JCQkJCQlpZiAoY3VycmVudEF0dHIgIT0gbnVsbCkgewotCQkJCQkJCXVyaVN0cmluZyA9IGdldFVSSVN0cmluZyhjdXJyZW50QXR0ciwgZG9jdW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWN1cnJlbnROb2RlID0gY3VycmVudEF0dHI7Ci0JCQkJfQotCQkJCS8vIHRyeSB0byBjcmVhdGUgaHlwZXJsaW5rIGZyb20gaW5mb3JtYXRpb24gZ2F0aGVyZWQKLQkJCQlpZiAodXJpU3RyaW5nICE9IG51bGwgJiYgY3VycmVudE5vZGUgIT0gbnVsbCAmJiBpc1ZhbGlkVVJJKHVyaVN0cmluZykpIHsKLQkJCQkJSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24gPSBnZXRIeXBlcmxpbmtSZWdpb24oY3VycmVudE5vZGUpOwotCQkJCQlJSHlwZXJsaW5rIGh5cGVybGluayA9IGNyZWF0ZUh5cGVybGluayh1cmlTdHJpbmcsIGh5cGVybGlua1JlZ2lvbiwgZG9jdW1lbnQsIGN1cnJlbnROb2RlKTsKLQkJCQkJaWYgKGh5cGVybGluayAhPSBudWxsKSB7Ci0JCQkJCQloeXBlcmxpbmtzLmFkZChoeXBlcmxpbmspOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChoeXBlcmxpbmtzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKElIeXBlcmxpbmtbXSkgaHlwZXJsaW5rcy50b0FycmF5KG5ldyBJSHlwZXJsaW5rWzBdKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBiYXNlIGxvY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgbW9kZWwgKGxvY2FsIGZpbGUgc3lzdGVtKQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEJhc2VMb2NhdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJU3RyaW5nIGJhc2VMb2MgPSBudWxsOwotCQkvLyBnZXQgdGhlIGJhc2UgbG9jYXRpb24gZnJvbSB0aGUgY3VycmVudCBtb2RlbAotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCUlQYXRoIGxvY2F0aW9uID0gbmV3IFBhdGgoc01vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJCQlpZiAobG9jYXRpb24udG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQkJYmFzZUxvYyA9IGxvY2F0aW9uLnRvU3RyaW5nKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGxvY2F0aW9uLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCQkJYmFzZUxvYyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShsb2NhdGlvbikuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYmFzZUxvYyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5hcHBlbmQobG9jYXRpb24pLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJhc2VMb2M7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgQ01FbGVtZW50RGVjbGFyYXRpb24gZm9yIGFuIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwcml2YXRlIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG51bGw7Ci0JCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCWVkID0gbXEuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGVkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgbm9kZSB3aXRoaW4gbm9kZSBhdCBvZmZzZXQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIEF0dHIKLQkgKi8KLQlwcml2YXRlIEF0dHIgZ2V0Q3VycmVudEF0dHJOb2RlKE5vZGUgbm9kZSwgaW50IG9mZnNldCkgewotCQlpZiAoKG5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmNvbnRhaW5zKG9mZnNldCkgJiYgKG5vZGUuaGFzQXR0cmlidXRlcygpKSkgewotCQkJTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkvLyBnbyB0aHJvdWdoIGVhY2ggYXR0cmlidXRlIGluIG5vZGUgYW5kIGlmIGF0dHJpYnV0ZSBjb250YWlucwotCQkJLy8gb2Zmc2V0LCByZXR1cm4gdGhhdCBhdHRyaWJ1dGUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7ICsraSkgewotCQkJCS8vIGFzc3VtcHRpb24gdGhhdCBpZiBwYXJlbnQgbm9kZSBpcyBvZiB0eXBlIEluZGV4ZWRSZWdpb24sCi0JCQkJLy8gdGhlbiBpdHMgYXR0cmlidXRlcyB3aWxsIGFsc28gYmUgb2YgdHlwZSBJbmRleGVkUmVnaW9uCi0JCQkJSW5kZXhlZFJlZ2lvbiBhdHRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgYXR0cnMuaXRlbShpKTsKLQkJCQlpZiAoYXR0UmVnaW9uLmNvbnRhaW5zKG9mZnNldCkpIHsKLQkJCQkJcmV0dXJuIChBdHRyKSBhdHRycy5pdGVtKGkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbm9kZSB0aGUgY3Vyc29yIGlzIGN1cnJlbnRseSBvbiBpbiB0aGUgZG9jdW1lbnQuIG51bGwgaWYgbm8KLQkgKiBub2RlIGlzIHNlbGVjdGVkCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4gTm9kZSBlaXRoZXIgZWxlbWVudCwgZG9jdHlwZSwgdGV4dCwgb3IgbnVsbAotCSAqLwotCXByaXZhdGUgTm9kZSBnZXRDdXJyZW50Tm9kZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJLy8gZ2V0IHRoZSBjdXJyZW50IG5vZGUgYXQgdGhlIG9mZnNldCAocmV0dXJucyBlaXRoZXI6IGVsZW1lbnQsCi0JCS8vIGRvY3R5cGUsIHRleHQpCi0JCUluZGV4ZWRSZWdpb24gaW5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCWlub2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0KTsKLQkJCWlmIChpbm9kZSA9PSBudWxsKSB7Ci0JCQkJaW5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQgLSAxKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlpZiAoaW5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gKE5vZGUpIGlub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIElGaWxlIGZyb20gdGhlIGdpdmVuIHVyaSBpZiBwb3NzaWJsZSwgbnVsbCBpZiBjYW5ub3QgZmluZCBmaWxlCi0JICogZnJvbSB1cmkuCi0JICogCi0JICogQHBhcmFtIGZpbGVTdHJpbmcKLQkgKiAgICAgICAgICAgIGZpbGUgc3lzdGVtIHBhdGgKLQkgKiBAcmV0dXJuIHJldHVybnMgSUZpbGUgaWYgZmlsZVN0cmluZyBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZQotCSAqLwotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZShTdHJpbmcgZmlsZVN0cmluZykgewotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJaWYgKGZpbGVTdHJpbmcgIT0gbnVsbCkgewotCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24obmV3IFBhdGgoZmlsZVN0cmluZykpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGggJiYgZmlsZSA9PSBudWxsOyBpKyspIHsKLQkJCQlpZiAoZmlsZXNbaV0uZXhpc3RzKCkpIHsKLQkJCQkJZmlsZSA9IGZpbGVzW2ldOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZmlsZSBmcm9tIHRoZSBnaXZlbiB1cmkgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIHVyaVN0cmluZyAtCi0JICogICAgICAgICAgICBhc3N1bWVzIHVyaVN0cmluZyBpcyBub3QgaHR0cDovLwotCSAqIEByZXR1cm4gRmlsZSBjcmVhdGVkIGZyb20gdXJpU3RyaW5nIGlmIHBvc3NpYmxlLCBudWxsIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgRmlsZSBnZXRGaWxlRnJvbVVyaVN0cmluZyhTdHJpbmcgdXJpU3RyaW5nKSB7Ci0JCUZpbGUgZmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBmaXJzdCBqdXN0IHRyeSB0byBjcmVhdGUgYSBmaWxlIGRpcmVjdGx5IGZyb20gdXJpU3RyaW5nIGFzCi0JCQkvLyBkZWZhdWx0IGluIGNhc2UgY3JlYXRlIGZpbGUgZnJvbSB1cmkgZG9lcyBub3Qgd29yawotCQkJZmlsZSA9IG5ldyBGaWxlKHVyaVN0cmluZyk7Ci0JCQkvLyB0cnkgdG8gY3JlYXRlIGZpbGUgZnJvbSB1cmkKLQkJCVVSSSB1cmkgPSBuZXcgVVJJKHVyaVN0cmluZyk7Ci0JCQlmaWxlID0gbmV3IEZpbGUodXJpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hpbGUgdHJ5aW5nIHRvIGNyZWF0ZSBGaWxlIGp1c3QgaWdub3JlCi0JCQkvLyBhbmQgZmlsZSB3aWxsIGJlIG51bGwKLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbihOb2RlIG5vZGUpIHsKLQkJSVJlZ2lvbiBoeXBlclJlZ2lvbiA9IG51bGw7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQkJLy8gaGFuZGxlIGRvYyB0eXBlIG5vZGUKLQkJCQlJRE9NTm9kZSBkb2NOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkJCWh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihkb2NOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGRvY05vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBkb2NOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJfSBlbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJLy8gaGFuZGxlIGF0dHJpYnV0ZSBub2RlcwotCQkJCUlET01BdHRyIGF0dCA9IChJRE9NQXR0cikgbm9kZTsKLQkJCQkvLyBkbyBub3QgaW5jbHVkZSBxdW90ZXMgaW4gYXR0cmlidXRlIHZhbHVlIHJlZ2lvbgotCQkJCWludCByZWdPZmZzZXQgPSBhdHQuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gYXR0LmdldFZhbHVlUmVnaW9uKCk7Ci0JCQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaW50IHJlZ0xlbmd0aCA9IHZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJU3RyaW5nIGF0dFZhbHVlID0gYXR0LmdldFZhbHVlUmVnaW9uVGV4dCgpOwotCQkJCQlpZiAoU3RyaW5nVXRpbHMuaXNRdW90ZWQoYXR0VmFsdWUpKSB7Ci0JCQkJCQkrK3JlZ09mZnNldDsKLQkJCQkJCXJlZ0xlbmd0aCA9IHJlZ0xlbmd0aCAtIDI7Ci0JCQkJCX0KLQkJCQkJaHlwZXJSZWdpb24gPSBuZXcgUmVnaW9uKHJlZ09mZnNldCwgcmVnTGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGh5cGVyUmVnaW9uOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0cyB0byBmaW5kIGFuIGF0dHJpYnV0ZSB3aXRoaW4gZWxlbWVudCB0aGF0IGlzIG9wZW5hYmxlLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IC0KLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsCi0JICogQHJldHVybiBBdHRyIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBvcGVuIG9uLCBudWxsIGlmIG5vIGF0dHJpYnV0ZQotCSAqICAgICAgICAgY291bGQgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEF0dHIgZ2V0TGlua2FibGVBdHRyKEVsZW1lbnQgZWxlbWVudCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkvLyBnZXQgdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyBmb3IgdGhpcyBub2RlCi0JCU5hbWVkTm9kZU1hcCBhdHRycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyArK2kpIHsKLQkJCS8vIGNoZWNrIGlmIHRoaXMgYXR0cmlidXRlIGlzICJvcGVuT24tYWJsZSIKLQkJCUF0dHIgYXR0ID0gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQlpZiAoaXNMaW5rYWJsZUF0dHIoYXR0LCBlZCkpIHsKLQkJCQlyZXR1cm4gYXR0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBGaW5kIHRoZSBsb2NhdGlvbiBoaW50IGZvciB0aGUgZ2l2ZW4gbmFtZXNwYWNlVVJJIGlmIGl0IGV4aXN0cwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Tm9kZSAtCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgLQotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKiBAcmV0dXJuIGxvY2F0aW9uIGhpbnQgKHN5c3RlbUlkKSBpZiBpdCB3YXMgZm91bmQsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYXRpb25IaW50KEVsZW1lbnQgZWxlbWVudE5vZGUsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJQXR0ciBzY2hlbWFMb2NOb2RlID0gZWxlbWVudE5vZGUuZ2V0QXR0cmlidXRlTm9kZU5TKFhTSV9OQU1FU1BBQ0VfVVJJLCBTQ0hFTUFfTE9DQVRJT04pOwotCQlpZiAoc2NoZW1hTG9jTm9kZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNjaGVtYUxvY05vZGUuZ2V0VmFsdWUoKSk7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIHB1YmxpY0lkID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotCQkJCVN0cmluZyBzeXN0ZW1JZCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsKLQkJCQkvLyBmb3VuZCBsb2NhdGlvbiBoaW50Ci0JCQkJaWYgKG5hbWVzcGFjZVVSSS5lcXVhbHNJZ25vcmVDYXNlKHB1YmxpY0lkKSkgewotCQkJCQlyZXR1cm4gc3lzdGVtSWQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkkgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIG5vZGUgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyBub3QgbnVsbAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFVSSVN0cmluZyhOb2RlIG5vZGUsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQlTdHJpbmcgcmVzb2x2ZWRVUkkgPSBudWxsOwotCQkvLyBuZWVkIHRoZSBiYXNlIGxvY2F0aW9uLCBwdWJsaWNJZCwgYW5kIHN5c3RlbUlkIGZvciBVUklSZXNvbHZlcgotCQlTdHJpbmcgYmFzZUxvYyA9IG51bGw7Ci0JCVN0cmluZyBwdWJsaWNJZCA9IG51bGw7Ci0JCVN0cmluZyBzeXN0ZW1JZCA9IG51bGw7Ci0JCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkvLyBoYW5kbGUgZG9jIHR5cGUgbm9kZQotCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCWJhc2VMb2MgPSBnZXRCYXNlTG9jYXRpb24oZG9jdW1lbnQpOwotCQkJcHVibGljSWQgPSAoKERvY3VtZW50VHlwZSkgbm9kZSkuZ2V0UHVibGljSWQoKTsKLQkJCXN5c3RlbUlkID0gKChEb2N1bWVudFR5cGUpIG5vZGUpLmdldFN5c3RlbUlkKCk7Ci0JCX0gZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJLy8gaGFuZGxlIGF0dHJpYnV0ZSBub2RlCi0JCQlBdHRyIGF0dHJOb2RlID0gKEF0dHIpIG5vZGU7Ci0JCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyTm9kZS5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgYXR0clZhbHVlID0gYXR0ck5vZGUuZ2V0VmFsdWUoKTsKLQkJCWF0dHJWYWx1ZSA9IFN0cmluZ1V0aWxzLnN0cmlwKGF0dHJWYWx1ZSk7Ci0JCQlpZiAoYXR0clZhbHVlICE9IG51bGwgJiYgYXR0clZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCWJhc2VMb2MgPSBnZXRCYXNlTG9jYXRpb24oZG9jdW1lbnQpOwotCQkJCS8vIGhhbmRsZSBzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUKLQkJCQlTdHJpbmcgcHJlZml4ID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFByZWZpeChhdHRyTmFtZSk7Ci0JCQkJU3RyaW5nIHVucHJlZml4ZWROYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dHJOYW1lKTsKLQkJCQlpZiAoKFhNTE5TLmVxdWFscyhwcmVmaXgpKSB8fCAoWE1MTlMuZXF1YWxzKHVucHJlZml4ZWROYW1lKSkpIHsKLQkJCQkJcHVibGljSWQgPSBhdHRyVmFsdWU7Ci0JCQkJCXN5c3RlbUlkID0gZ2V0TG9jYXRpb25IaW50KGF0dHJOb2RlLmdldE93bmVyRWxlbWVudCgpLCBwdWJsaWNJZCk7Ci0JCQkJCWlmIChzeXN0ZW1JZCA9PSBudWxsKSB7Ci0JCQkJCQlzeXN0ZW1JZCA9IGF0dHJWYWx1ZTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoKFhTSV9OQU1FU1BBQ0VfVVJJLmVxdWFscyhET01OYW1lc3BhY2VIZWxwZXIuZ2V0TmFtZXNwYWNlVVJJKGF0dHJOb2RlKSkpICYmIChTQ0hFTUFfTE9DQVRJT04uZXF1YWxzKHVucHJlZml4ZWROYW1lKSkpIHsKLQkJCQkJLy8gZm9yIG5vdyBqdXN0IHVzZSB0aGUgZmlyc3QgcGFpcgotCQkJCQkvLyBuZWVkIHRvIGxvb2sgaW50byBiZWluZyBtb3JlIHByZWNpc2UKLQkJCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyVmFsdWUpOwotCQkJCQlwdWJsaWNJZCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsKLQkJCQkJc3lzdGVtSWQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0JCQkJCS8vIGVsc2UgY2hlY2sgaWYgeG1sbnMgcHVibGljSWQgPSB2YWx1ZQotCQkJCX0gZWxzZSB7Ci0JCQkJCXN5c3RlbUlkID0gYXR0clZhbHVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXNvbHZlZFVSSSA9IHJlc29sdmVVUkkoYmFzZUxvYywgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJcmV0dXJuIHJlc29sdmVkVVJJOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB1cmlTdHJpbmcgaXMgYW4gaHR0cCBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gdXJpU3RyaW5nCi0JICogQHJldHVybiB0cnVlIGlmIHVyaVN0cmluZyBpcyBodHRwIHN0cmluZywgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSHR0cChTdHJpbmcgdXJpU3RyaW5nKSB7Ci0JCWJvb2xlYW4gaXNIdHRwID0gZmFsc2U7Ci0JCWlmICh1cmlTdHJpbmcgIT0gbnVsbCkgewotCQkJU3RyaW5nIHRlbXBTdHJpbmcgPSB1cmlTdHJpbmcudG9Mb3dlckNhc2UoKTsKLQkJCWlmICh0ZW1wU3RyaW5nLnN0YXJ0c1dpdGgoSFRUUF9QUk9UT0NPTCkpIHsKLQkJCQlpc0h0dHAgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBpc0h0dHA7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIGF0dHJpYnV0ZSBpcyBvcGVuYWJsZS4gQXR0cmlidXRlIGlzIG9wZW5hYmxlCi0JICogaWYgaXQgaXMgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gYXR0cmlidXRlIG9yIGlmIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMKLQkgKiBvZiB0eXBlIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cgotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKiBAcGFyYW0gY21FbGVtZW50Ci0JICogICAgICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGF0dHJpYnV0ZSAoY2FuIGJlCi0JICogICAgICAgICAgICBudWxsKQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGF0dHJpYnV0ZSBpcyAib3Blbk9uLWFibGUiIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0xpbmthYmxlQXR0cihBdHRyIGF0dHIsIENNRWxlbWVudERlY2xhcmF0aW9uIGNtRWxlbWVudCkgewotCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJU3RyaW5nIHByZWZpeCA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRQcmVmaXgoYXR0ck5hbWUpOwotCQlTdHJpbmcgdW5wcmVmaXhlZE5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VW5wcmVmaXhlZE5hbWUoYXR0ck5hbWUpOwotCQkvLyBkZXRlcm1pbmUgaWYgYXR0cmlidXRlIGlzIG5hbWVzcGFjZSBkZWNsYXJhdGlvbgotCQlpZiAoKFhNTE5TLmVxdWFscyhwcmVmaXgpKSB8fCAoWE1MTlMuZXF1YWxzKHVucHJlZml4ZWROYW1lKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIGRldGVybWluZSBpZiBhdHRyaWJ1dGUgY29udGFpbnMgc2NoZW1hIGxvY2F0aW9uCi0JCWlmICgoWFNJX05BTUVTUEFDRV9VUkkuZXF1YWxzKERPTU5hbWVzcGFjZUhlbHBlci5nZXROYW1lc3BhY2VVUkkoYXR0cikpKSAmJiAoKFNDSEVNQV9MT0NBVElPTi5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSB8fCAoTk9fTkFNRVNQQUNFX1NDSEVNQV9MT0NBVElPTi5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIGRldGVybWluZSBpZiBhdHRyaWJ1dGUgdmFsdWUgaXMgb2YgdHlwZSBVUkkKLQkJaWYgKGNtRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtRWxlbWVudC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJCWlmICgoYXR0ckRlY2wgIT0gbnVsbCkgJiYgKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkgIT0gbnVsbCkgJiYgKENNRGF0YVR5cGUuVVJJLmVxdWFscyhhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldERhdGFUeXBlTmFtZSgpKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB1cmlTdHJpbmcgaXMgcmVhbGx5IHBvaW50aW5nIHRvIGEgZmlsZQotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFVSSShTdHJpbmcgdXJpU3RyaW5nKSB7Ci0JCWJvb2xlYW4gaXNWYWxpZCA9IGZhbHNlOwotCQlpZiAoaXNIdHRwKHVyaVN0cmluZykpIHsKLQkJCWlzVmFsaWQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJRmlsZSBmaWxlID0gZ2V0RmlsZUZyb21VcmlTdHJpbmcodXJpU3RyaW5nKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlpc1ZhbGlkID0gZmlsZS5pc0ZpbGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNWYWxpZDsKLQl9Ci0JCi0JLyoqCi0JICogUmVzb2x2ZXMgdGhlIGdpdmVuIFVSSSBpbmZvcm1hdGlvbgotCSAqIAotCSAqIEBwYXJhbSBiYXNlTG9jYXRpb24KLQkgKiBAcGFyYW0gcHVibGljSWQKLQkgKiBAcGFyYW0gc3lzdGVtSWQKLQkgKiBAcmV0dXJuIFN0cmluZyByZXNvbHZlZCB1cmkuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZVVSSShTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQkvLyBkb250IHJlc29sdmUgaWYgdGhlcmUncyBub3RoaW5nIHRvIHJlc29sdmUKLQkJaWYgKChiYXNlTG9jYXRpb24gPT0gbnVsbCkgJiYgKHB1YmxpY0lkID09IG51bGwpICYmIChzeXN0ZW1JZCA9PSBudWxsKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShiYXNlTG9jYXRpb24sIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0Jhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNjVmN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0Jhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuRG9jdW1lbnRDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5KU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5Kc1NlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRTdHJlYW1DcmVhdG9yOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciBleHRlbmRzIFNlYXJjaFJlcXVlc3RvciB7Ci0JLyoqCi0JICogQ2hhbmdlIGNsYXNzIHRoYXQgd3JhcHMgYSB0ZXh0IGVkaXQgb24gdGhlIGpzcCBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgY2xhc3MgUmVuYW1lQ2hhbmdlIGV4dGVuZHMgRG9jdW1lbnRDaGFuZ2UgewotCQlwcml2YXRlIFN0cmluZyBmRGVzY3JpcHRpb24gPSBKc1VJTWVzc2FnZXMuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8wOwotCQlwcml2YXRlIFRleHRFZGl0IGZFZGl0ID0gbnVsbDsKLQkJcHJpdmF0ZSBJRG9jdW1lbnQgZkpTUERvYyA9IG51bGw7Ci0JCXByaXZhdGUgSUZpbGUgZkpTUEZpbGUgPSBudWxsOwotCQkKLQkJcHVibGljIFJlbmFtZUNoYW5nZShJRmlsZSBqc3BGaWxlLCBJRG9jdW1lbnQganNwRG9jLCBUZXh0RWRpdCBlZGl0LCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXN1cGVyKEpzVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzYsIGpzcERvYyk7Ci0JCQl0aGlzLmZFZGl0ID0gZWRpdDsKLQkJCXRoaXMuZkpTUEZpbGUgPSBqc3BGaWxlOwotCQkJdGhpcy5mSlNQRG9jID0ganNwRG9jOwotCQkJdGhpcy5mRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLmZEZXNjcmlwdGlvbjsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBJRG9jdW1lbnQgZ2V0UHJldmlld0RvY3VtZW50KElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlEb2N1bWVudCBjb3B5RG9jID0gbmV3IERvY3VtZW50KGZKU1BEb2MuZ2V0KCkpOwotCQkJdHJ5IHsKLQkJCQlmRWRpdC5hcHBseShjb3B5RG9jKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJcmV0dXJuIGNvcHlEb2M7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBDaGVja3MgaWYgYSBkb2N1bWVudCBpcyBvcGVuIGluIGFuIGVkaXRvcgotCQkgKiAKLQkJICogQHBhcmFtIGpzcERvYwotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gaXNPcGVuSW5FZGl0b3IoSURvY3VtZW50IGpzcERvYykgewotCQkJSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgdyA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspIHsKLQkJCQl3ID0gd2luZG93c1tpXTsKLQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCQlJRWRpdG9yUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBudWxsOwotCQkJCQlPYmplY3QgbyA9IG51bGw7Ci0JCQkJCUlEb2N1bWVudCBkb2MgPSBudWxsOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZmVyZW5jZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWVkaXRvciA9IHJlZmVyZW5jZXNbal0uZ2V0RWRpdG9yKHRydWUpOwotCQkJCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM3NjQKLQkJCQkJCS8vIHVzZSBhZGFwdGVyIHRvIGdldCBJVGV4dEVkaXRvciAoZm9yIHRoaW5ncyBsaWtlCi0JCQkJCQkvLyBwYWdlIGRlc2lnbmVyKQotCQkJCQkJbyA9IGVkaXRvci5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJCQkJCWlmIChvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQkJCQkJZG9jID0gKChJVGV4dEVkaXRvcikgbykuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJCQlpZiAoZG9jICE9IG51bGwgJiYgZG9jLmVxdWFscyhqc3BEb2MpKSB7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBDaGFuZ2UgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlSZW5hbWVDaGFuZ2UgdW5kb0NoYW5nZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlmICghaXNPcGVuSW5FZGl0b3IodGhpcy5mSlNQRG9jKSkgewotCQkJCQkvLyBhcHBseSBlZGl0IHRvIEpTUCBkb2MgQU5EIHNhdmUgbW9kZWwKLQkJCQkJdW5kb0NoYW5nZSA9IG5ldyBSZW5hbWVDaGFuZ2UodGhpcy5mSlNQRmlsZSwgdGhpcy5mSlNQRG9jLCB0aGlzLmZFZGl0LmFwcGx5KGZKU1BEb2MpLCB0aGlzLmZEZXNjcmlwdGlvbik7Ci0JCQkJCXNhdmVGaWxlKHRoaXMuZkpTUEZpbGUsIHRoaXMuZkpTUERvYyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8ganVzdCBhcHBseSBlZGl0IHRvIEpTUCBkb2N1bWVudAotCQkJCQl1bmRvQ2hhbmdlID0gbmV3IFJlbmFtZUNoYW5nZSh0aGlzLmZKU1BGaWxlLCB0aGlzLmZKU1BEb2MsIHRoaXMuZkVkaXQuYXBwbHkoZkpTUERvYyksIHRoaXMuZkRlc2NyaXB0aW9uKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdW5kb0NoYW5nZTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFBlcmZvcm1lZCBpbiBhbiBvcGVyYXRpb24gc2luY2UgaXQgbW9kaWZpZXMgcmVzb3VyY2VzIGluIHRoZQotCQkgKiB3b3Jrc3BhY2UKLQkJICogCi0JCSAqIEBwYXJhbSBqc3BEb2MKLQkJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2F2ZUZpbGUoSUZpbGUganNwRmlsZSwgSURvY3VtZW50IGpzcERvYykgewotCQkJU2F2ZUpzcEZpbGVPcCBvcCA9IG5ldyBTYXZlSnNwRmlsZU9wKGpzcEZpbGUsIGpzcERvYyk7Ci0JCQl0cnkgewotCQkJCW9wLnJ1bihKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLy8gZW5kIGlubmVyIGNsYXNzIFNhdmVKc3BGaWxlT3AKLQkvKioKLQkgKiBXb3Jrc3BhY2Ugb3BlcmF0aW9uIHRvIHBlcmZvcm0gc2F2ZSBvbiBtb2RlbCBmb3IgdXBkYXRlZCBkb2N1bWVudHMuCi0JICogU2hvdWxkIG9ubHkgYmUgZG9uZSBvbiBtb2RlbHMgbm90IG9wZW4gaW4gYW4gZWRpdG9yLgotCSAqLwotCXByaXZhdGUgY2xhc3MgU2F2ZUpzcEZpbGVPcCBleHRlbmRzIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiB7Ci0JCXByaXZhdGUgSURvY3VtZW50IGZKU1BEb2MgPSBudWxsOwotCQlwcml2YXRlIElGaWxlIGZKU1BGaWxlID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBTYXZlSnNwRmlsZU9wKElGaWxlIGpzcEZpbGUsIElEb2N1bWVudCBqc3BEb2MpIHsKLQkJCXRoaXMuZkpTUERvYyA9IGpzcERvYzsKLQkJCXRoaXMuZkpTUEZpbGUgPSBqc3BGaWxlOwotCQl9Ci0JCQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9Mzc2NQotCQkJLy8gc2F2ZSBmaWxlIHcvIG5vIGludGVybWVkaWF0ZSBtb2RlbCBjcmVhdGlvbgotCQkJQ29kZWRTdHJlYW1DcmVhdG9yIGNvZGVkU3RyZWFtQ3JlYXRvciA9IG5ldyBDb2RlZFN0cmVhbUNyZWF0b3IoKTsKLQkJCVJlYWRlciByZWFkZXIgPSBuZXcgRG9jdW1lbnRSZWFkZXIodGhpcy5mSlNQRG9jKTsKLQkJCWNvZGVkU3RyZWFtQ3JlYXRvci5zZXQodGhpcy5mSlNQRmlsZSwgcmVhZGVyKTsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBjb2RlZEJ5dGVTdHJlYW0gPSBudWxsOwotCQkJSW5wdXRTdHJlYW0gY29kZWRTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQljb2RlZEJ5dGVTdHJlYW0gPSBjb2RlZFN0cmVhbUNyZWF0b3IuZ2V0Q29kZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQljb2RlZFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb2RlZEJ5dGVTdHJlYW0udG9CeXRlQXJyYXkoKSk7Ci0JCQkJaWYgKHRoaXMuZkpTUEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJdGhpcy5mSlNQRmlsZS5zZXRDb250ZW50cyhjb2RlZFN0cmVhbSwgdHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhpcy5mSlNQRmlsZS5jcmVhdGUoY29kZWRTdHJlYW0sIGZhbHNlLCBudWxsKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChjb2RlZEJ5dGVTdHJlYW0gIT0gbnVsbCkgewotCQkJCQkJY29kZWRCeXRlU3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGNvZGVkU3RyZWFtICE9IG51bGwpIHsKLQkJCQkJCWNvZGVkU3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHVubGlrZWx5Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCS8vIGVuZCBpbm5lciBjbGFzcyBSZW5hbWVDaGFuZ2UKLQkvKiogVGhlIHR5cGUgYmVpbmcgcmVuYW1lZCAodGhlIG9sZCB0eXBlKSAqLwotCUlKYXZhU2NyaXB0RWxlbWVudCBmRWxlbWVudCA9IG51bGw7Ci0JLyoqIFRoZSBuZXcgbmFtZSBvZiB0aGUgdHlwZSBiZWluZyByZW5hbWVkICovCi0JcHJpdmF0ZSBTdHJpbmcgZk5ld05hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCS8qKiBtYXBzIGEgSlNQU2VhcmNoRG9jdW1lbnQgcGF0aCAtPiBNdWx0aVRleHRFZGl0IGZvciB0aGUgamF2YSBmaWxlICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwID0gbnVsbDsKLQkKLQlwdWJsaWMgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvcihJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhpcy5mTmV3TmFtZSA9IG5ld05hbWU7Ci0JCXRoaXMuZkVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLmZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3IjYWNjZXB0U2VhcmNoTWF0Y2gob3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2gpCi0JICovCi0JCi0JcHVibGljIHZvaWQgYWNjZXB0U2VhcmNoTWF0Y2goU2VhcmNoTWF0Y2ggamF2YU1hdGNoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBtYXRjaERvY3VtZW50UGF0aCA9IGphdmFNYXRjaC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJU2VhcmNoRG9jdW1lbnQgc2VhcmNoRG9jID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0U2VhcmNoRG9jdW1lbnQobWF0Y2hEb2N1bWVudFBhdGgpOwotCQlpZiAoc2VhcmNoRG9jICE9IG51bGwgJiYgc2VhcmNoRG9jIGluc3RhbmNlb2YgSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUpIHsKLQkJCVN0cmluZyByZW5hbWVUZXh0ID0gZ2V0UmVuYW1lVGV4dCgoSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUpIHNlYXJjaERvYywgamF2YU1hdGNoKTsKLQkJCS8vIGFkZCBpdCBmb3IgdGhlIGNvcnJlY3QgZG9jdW1lbnQKLQkJCWFkZEphdmFFZGl0KHNlYXJjaERvYy5nZXRQYXRoKCksIG5ldyBSZXBsYWNlRWRpdChqYXZhTWF0Y2guZ2V0T2Zmc2V0KCksIGphdmFNYXRjaC5nZXRMZW5ndGgoKSwgcmVuYW1lVGV4dCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgdG8gdGhlIG11bHRpIGVkaXQgZm9yIGEgZ2l2ZSBqYXZhIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBqYXZhRG9jdW1lbnQKLQkgKiBAcGFyYW0gamF2YUVkaXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkSmF2YUVkaXQoU3RyaW5nIHNlYXJjaERvY1BhdGgsIFJlcGxhY2VFZGl0IGphdmFFZGl0KSB7Ci0JCU9iamVjdCBvID0gdGhpcy5mU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcC5nZXQoc2VhcmNoRG9jUGF0aCk7Ci0JCWlmIChvICE9IG51bGwpIHsKLQkJCU11bHRpVGV4dEVkaXQgbXVsdGkgPSAoTXVsdGlUZXh0RWRpdCkgbzsKLQkJCW11bHRpLmFkZENoaWxkKGphdmFFZGl0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIHVzZSBhIG11bHRpIGVkaXQgc28gZG9jIHBvc2l0aW9uIG9mZnNldHMgZ2V0IHVwZGF0ZWQKLQkJCS8vIGF1dG9tYXRpY2FsbHkKLQkJCS8vIHdoZW4gYWRkaW5nIG11bHRpcGxlIGNoaWxkIGVkaXRzCi0JCQlNdWx0aVRleHRFZGl0IG11bHRpID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCW11bHRpLmFkZENoaWxkKGphdmFFZGl0KTsKLQkJCXRoaXMuZlNlYXJjaERvY1BhdGgySmF2YUVkaXRNYXAucHV0KHNlYXJjaERvY1BhdGgsIG11bHRpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIENoYW5nZSBjcmVhdGVDaGFuZ2UoSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBUZXh0RWRpdCBlZGl0KSB7Ci0JCUlEb2N1bWVudCBkb2MgPSBzZWFyY2hEb2MuZ2V0SnNwVHJhbnNsYXRpb24oKS5nZXRIdG1sRG9jdW1lbnQoKTsKLQkJU3RyaW5nIGZpbGUgPSBzZWFyY2hEb2MuZ2V0RmlsZSgpLmdldE5hbWUoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZ2V0RGVzY3JpcHRpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIGRvY3VtZW50IGxpbmVzIGFyZSAwIGJhc2VkCi0JCQlTdHJpbmcgbGluZU51bWJlciA9IEludGVnZXIudG9TdHJpbmcoZG9jLmdldExpbmVPZk9mZnNldChlZGl0LmdldE9mZnNldCgpKSArIDEpOwotCQkJZGVzY3JpcHRpb24gKz0gIiAiICsgTkxTLmJpbmQoSnNVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMSwgbmV3IFN0cmluZ1tdIHsgZmlsZSwgbGluZU51bWJlciB9KTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBuZXcgUmVuYW1lQ2hhbmdlKHNlYXJjaERvYy5nZXRGaWxlKCksIGRvYywgZWRpdCwgZGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCBKU1AgY2hhbmdlcyBmb3IgdGhlIHNlYXJjaCBtYXRjaGVzIGZvciB0aGUgZ2l2ZW4gVHlwZQotCSAqLwotCXB1YmxpYyBDaGFuZ2VbXSBnZXRDaGFuZ2VzKCkgewotCQlKc1NlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQlMaXN0IGNoYW5nZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGtleXMgPSBmU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlTdHJpbmcgc2VhcmNoRG9jUGF0aCA9IG51bGw7Ci0JCVNlYXJjaERvY3VtZW50IGRlbGVnYXRlID0gbnVsbDsKLQkJd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0JCQkvLyBjcmVhdGUgb24gdGhlIGZseQotCQkJc2VhcmNoRG9jUGF0aCA9IChTdHJpbmcpIGtleXMubmV4dCgpOwotCQkJTXVsdGlUZXh0RWRpdCBqYXZhRWRpdCA9IChNdWx0aVRleHRFZGl0KSBmU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcC5nZXQoc2VhcmNoRG9jUGF0aCk7Ci0JCQlkZWxlZ2F0ZSA9IHN1cHBvcnQuZ2V0U2VhcmNoRG9jdW1lbnQoc2VhcmNoRG9jUGF0aCk7Ci0JCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCAmJiBkZWxlZ2F0ZSBpbnN0YW5jZW9mIEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlKSB7Ci0JCQkJSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUgamF2YURlbGVnYXRlID0gKEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlKSBkZWxlZ2F0ZTsKLQkJCQljaGFuZ2VzLmFkZChjcmVhdGVDaGFuZ2UoamF2YURlbGVnYXRlLCBqYXZhRWRpdCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoQ2hhbmdlW10pIGNoYW5nZXMudG9BcnJheShuZXcgQ2hhbmdlW2NoYW5nZXMuc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIGJldHRlciBkZXNjcmliZSB0aGUgY2hhbmdlLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIElKYXZhU2NyaXB0RWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5mRWxlbWVudDsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgbmV3IG5hbWUgZm9yIHRoZSBUeXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROZXdOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5mTmV3TmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNlYXJjaERvYwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbmFtZVRleHQoSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHsKLQkJcmV0dXJuIGdldE5ld05hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQSmF2YVNlbGVjdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQSmF2YVNlbGVjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NzFmY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUEphdmFTZWxlY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1jbGFzcyBKU1BKYXZhU2VsZWN0aW9uUHJvdmlkZXIgewotCXN0YXRpYyBJSmF2YVNjcmlwdEVsZW1lbnRbXSBnZXRTZWxlY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvcikgewotCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSBlbGVtZW50cyA9IG51bGw7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCS8vIGdldCB0aGUgSlNQIHRyYW5zbGF0aW9uIG9iamVjdCBmb3IgdGhpcyBlZGl0b3IncyBkb2N1bWVudAotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCUlET01Nb2RlbCB4bWxNb2RlbCA9IChJRE9NTW9kZWwpIG1vZGVsOwotCQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChKc1RyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlJSnNUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IGFkYXB0ZXIuZ2V0SnNUcmFuc2xhdGlvbih0cnVlKTsKLQkJCQkJCWVsZW1lbnRzID0gdHJhbnNsYXRpb24uZ2V0RWxlbWVudHNGcm9tSnNSYW5nZSh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJZWxlbWVudHMgPSBuZXcgSUphdmFTY3JpcHRFbGVtZW50WzBdOwotCQl9Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lQ2hhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0N2FmY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZUNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklGdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5Kc1NlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUE1ldGhvZFJlbmFtZUNoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0JcHVibGljIHN0YXRpYyBDaGFuZ2VbXSBjcmVhdGVDaGFuZ2VzRm9yKElGdW5jdGlvbiBtZXRob2QsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCUpzU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCS8vIHNob3VsZCBiZSBoYW5kbGVkIGJ5IEpTUEluZGV4TWFuYWdlcgotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzAzNgotCQkvLyBzdXBwb3J0LmluZGV4V29ya3NwYWNlQW5kV2FpdCgpOwotCQlCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBKU1BNZXRob2RSZW5hbWVSZXF1ZXN0b3IobWV0aG9kLCBuZXdOYW1lKTsKLQkJc3VwcG9ydC5zZWFyY2hSdW5uYWJsZShtZXRob2QsIG5ldyBKc1NlYXJjaFNjb3BlKCksIHJlcXVlc3Rvcik7Ci0JCXJldHVybiByZXF1ZXN0b3IuZ2V0Q2hhbmdlcygpOwotCX0KLQkKLQkKLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJLy8gcGFfVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSnNVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JLy8gbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBkZWNpZGUgY29ycmVjdCB2YWx1ZSBvZiBpc1ZhbGlkCi0JfQotCQotCQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gVGhpcyBtZXRob2QgbXVzdCBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIG9iamVjdCBpcyBzdGlsbCB2YWxpZC4KLQkJLy8gVGhpcyBpcyBpbiBwYXJ0aWN1bGFyIGludGVyZXN0aW5nIHdoZW4gcGVyZm9ybWluZyBhbiB1bmRvIGNoYW5nZQotCQkvLyBzaW5jZSB0aGUgd29ya3NwYWNlIGNvdWxkIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgdW5kbyBjaGFuZ2UgaGFzCi0JCS8vIGJlZW4gY3JlYXRlZC4KLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQkKLQkKLQlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBwYV9UT0RPIHJldHVybiB0aGUgInVuZG8iIGNoYW5nZSBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZjdkZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDYsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNvbXBvc2l0ZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JRnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0TW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5JSmF2YVdlYk5vZGU7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIFJlbmFtZVBhcnRpY2lwYW50IHsKLQlwcml2YXRlIElGdW5jdGlvbiBmTWV0aG9kID0gbnVsbDsKLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NoZWNrQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0KQotCSAqLwotCQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY3JlYXRlQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCQotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQ2hhbmdlW10gY2hhbmdlcyA9IEpTUE1ldGhvZFJlbmFtZUNoYW5nZS5jcmVhdGVDaGFuZ2VzRm9yKHRoaXMuZk1ldGhvZCwgZ2V0QXJndW1lbnRzKCkuZ2V0TmV3TmFtZSgpKTsKLQkJQ29tcG9zaXRlQ2hhbmdlIG11bHRpQ2hhbmdlID0gbnVsbDsKLQkJaWYgKGNoYW5nZXMubGVuZ3RoID4gMCkgewotCQkJbXVsdGlDaGFuZ2UgPSBuZXcgQ29tcG9zaXRlQ2hhbmdlKEpzVUlNZXNzYWdlcy5KU1BfY2hhbmdlcywgY2hhbmdlcyk7Ci0JCX0KLQkJcmV0dXJuIG11bHRpQ2hhbmdlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2dldE5hbWUoKQotCSAqLwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGhpcy5mTWV0aG9kICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbmFtZSA9IHRoaXMuZk1ldGhvZC5nZXRTb3VyY2UoKTsKLQkJCX0gY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGdW5jdGlvbikgewotCQkJdGhpcy5mTWV0aG9kID0gKElGdW5jdGlvbikgZWxlbWVudDsKLQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhV2ViTm9kZSkgewotCQkJaWYoKChJSmF2YVdlYk5vZGUpZWxlbWVudCkuZ2V0SmF2YUVsZW1lbnQoKSBpbnN0YW5jZW9mIElGdW5jdGlvbikgewotCQkJCXRoaXMuZk1ldGhvZCA9IChJRnVuY3Rpb24pICgoSUphdmFXZWJOb2RlKWVsZW1lbnQpLmdldEphdmFFbGVtZW50KCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlNjgzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5KU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUE1ldGhvZFJlbmFtZVJlcXVlc3RvciBleHRlbmRzIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgewotCXB1YmxpYyBKU1BNZXRob2RSZW5hbWVSZXF1ZXN0b3IoSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG5ld05hbWUpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IjZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCVN0cmluZyBtZXRob2ROYW1lID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChKc1VJTWVzc2FnZXMuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8zLCBuZXcgU3RyaW5nW10geyBtZXRob2ROYW1lLCBuZXdOYW1lIH0pOwotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVuYW1lVGV4dChKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBzZWFyY2hEb2MsIFNlYXJjaE1hdGNoIGphdmFNYXRjaCkgewotCQlTdHJpbmcgamF2YVRleHQgPSBzZWFyY2hEb2MuZ2V0SnNwVHJhbnNsYXRpb24oKS5nZXRKc1RleHQoKTsKLQkJU3RyaW5nIG1ldGhvZFRleHQgPSBqYXZhVGV4dC5zdWJzdHJpbmcoamF2YU1hdGNoLmdldE9mZnNldCgpLCBqYXZhTWF0Y2guZ2V0T2Zmc2V0KCkgKyBqYXZhTWF0Y2guZ2V0TGVuZ3RoKCkpOwotCQlTdHJpbmcgbWV0aG9kU3VmZml4ID0gbWV0aG9kVGV4dC5zdWJzdHJpbmcobWV0aG9kVGV4dC5pbmRleE9mKCIoIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBnZXROZXdOYW1lKCkgKyBtZXRob2RTdWZmaXg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1vdmVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNb3ZlRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NzlhMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1vdmVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLlBsYXRmb3JtU3RhdHVzTGluZVV0aWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEFuIGFjdGlvbiBkZWxlZ2F0ZSB0aGF0IGxhdW5jaGVzIEpEVCBtb3ZlIGVsZW1lbnQgd2l6YXJkCi0gKiAKLSAqIFN0aWxsIHJlbGllcyBoZWF2aWx5IG9uIGludGVybmFsIEFQSSB3aWxsIGNoYW5nZSBwb3N0IDMuMCB3aXRoIHB1YmxpYyBtb3ZlCi0gKiBzdXBwb3J0IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTgxNwotICovCi1wdWJsaWMgY2xhc3MgSlNQTW92ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSwgSUFjdGlvbkRlbGVnYXRlMiwgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0JLy8gcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JLy8gbnVsbGluZyBvdXQganVzdCBpbiBjYXNlCi0JLy8gZkVkaXRvciA9IG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChKc1VJTWVzc2FnZXMuTW92ZUVsZW1lbnRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KEpzVUlNZXNzYWdlcy5Nb3ZlRWxlbWVudF9sYWJlbCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JLy8gbm8tb3AgdW50aWwgd2Uga25vdyBob3cgd2UncmUgc3VwcG9zZWQgdG8gdXNlIHRoaXMKLQkvLyBlY2xpcHNlIDMuMk01Ci0JLy8gcHVibGljIG1vdmUgc3VwcG9ydDoKLQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE4MTcKLQkvLyBJSmF2YVNjcmlwdEVsZW1lbnRbXSBlbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoKTsKLQkvLyBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgewotCS8vCi0JLy8gLy8gbmVlZCB0byBjaGVjayBpZiBpdCdzIG1vdmFibGUKLQkvLyB0cnkgewotCS8vIEphdmFNb3ZlUHJvY2Vzc29yIHByb2Nlc3NvciA9Ci0JLy8gSmF2YU1vdmVQcm9jZXNzb3IuY3JlYXRlKGdldFJlc291cmNlcyhlbGVtZW50cyksIGVsZW1lbnRzKTsKLQkvLwkJCQkKLQkvLyBTaGVsbCBwYXJlbnQgPQotCS8vIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkvLyBNb3ZlUmVmYWN0b3JpbmcgcmVmYWN0b3JpbmcgPSBuZXcgTW92ZVJlZmFjdG9yaW5nKHByb2Nlc3Nvcik7Ci0JLy8KLQkvLyBSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBjcmVhdGVXaXphcmQocmVmYWN0b3JpbmcpOwotCS8vCi0JLy8gLyoKLQkvLyAqIFdlIHdhbnQgdG8gZ2V0IHRoZSBzaGVsbCBmcm9tIHRoZSByZWZhY3RvcmluZyBkaWFsb2cgYnV0Ci0JLy8gKiBpdCdzIG5vdCBrbm93biBhdCB0aGlzIHBvaW50LCBzbyB3ZSBwYXNzIHRoZSB3aXphcmQgYW5kCi0JLy8gKiB0aGVuLCBvbmNlIHRoZSBkaWFsb2cgaXMgb3Blbiwgd2Ugd2lsbCBoYXZlIGFjY2VzcyB0byBpdHMKLQkvLyAqIHNoZWxsLgotCS8vICovCi0JLy8KLQkvLyBwcm9jZXNzb3Iuc2V0Q3JlYXRlVGFyZ2V0UXVlcmllcyhuZXcgQ3JlYXRlVGFyZ2V0UXVlcmllcyh3aXphcmQpKTsKLQkvLyBwcm9jZXNzb3Iuc2V0UmVvcmdRdWVyaWVzKG5ldyBSZW9yZ1F1ZXJpZXMod2l6YXJkKSk7Ci0JLy8gLy8gU3RyaW5nIG9wZW5SZWZhY3RvcmluZ1dpek1zZyA9Ci0JLy8gLy8KLQkvLyBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiT3BlblJlZmFjdG9yaW5nV2l6YXJkQWN0aW9uLnJlZmFjdG9yaW5nIik7Ci0JLy8gLy8gLy8kTk9OLU5MUy0xJAotCS8vIFN0cmluZyBvcGVuUmVmYWN0b3JpbmdXaXpNc2cgPSBKU1BVSU1lc3NhZ2VzLk1vdmVFbGVtZW50V2l6YXJkOyAvLwotCS8vICJNb3ZlCi0JLy8gLy8gdGhlCi0JLy8gLy8gc2VsZWN0ZWQKLQkvLyAvLyBlbGVtZW50cyI7Ci0JLy8gLy8gLy8kTk9OLU5MUy0xJAotCS8vIG5ldyBSZWZhY3RvcmluZ1N0YXJ0ZXIoKS5hY3RpdmF0ZShyZWZhY3RvcmluZywgd2l6YXJkLCBwYXJlbnQsCi0JLy8gb3BlblJlZmFjdG9yaW5nV2l6TXNnLCB0cnVlKTsKLQkvLwotCS8vIFBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JLy8KLQkvLyB9Ci0JLy8gY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JLy8gTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkvLyB9Ci0JLy8gfQotCS8vIGVsc2UgewotCS8vIFBsYXRmb3JtU3RhdHVzTGluZVV0aWwuZGlzcGxheUVycm9yTWVzc2FnZShKU1BVSU1lc3NhZ2VzLkpTUE1vdmVFbGVtZW50QWN0aW9uXzApOwotCS8vIC8vJE5PTi1OTFMtMSQKLQkvLyB9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsKLQkJcnVuKGFjdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JLy8gZkVkaXRvciA9IHRhcmdldEVkaXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZUNoYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVDaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE4YTM3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZUNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5Kc1NlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQYWNrYWdlUmVuYW1lQ2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKLQlwdWJsaWMgc3RhdGljIENoYW5nZVtdIGNyZWF0ZUNoYW5nZXNGb3IoSVBhY2thZ2VGcmFnbWVudCBwa2csIFN0cmluZyBuZXdOYW1lKSB7Ci0JCUpzU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCS8vIHNob3VsZCBiZSBoYW5kbGVkIGJ5IEpTUEluZGV4TWFuYWdlcgotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzAzNgotCQkvLyBzdXBwb3J0LmluZGV4V29ya3NwYWNlQW5kV2FpdCgpOwotCQlCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBKU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yKHBrZywgbmV3TmFtZSk7Ci0JCXN1cHBvcnQuc2VhcmNoUnVubmFibGUocGtnLCBuZXcgSnNTZWFyY2hTY29wZSgpLCByZXF1ZXN0b3IpOwotCQlyZXR1cm4gcmVxdWVzdG9yLmdldENoYW5nZXMoKTsKLQl9Ci0JCi0JCi0JcHVibGljIE9iamVjdCBnZXRNb2RpZmllZEVsZW1lbnQoKSB7Ci0JCS8vIHJldHVybiB0aGlzLnBrZzsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpzVUlNZXNzYWdlcy5KU1BfY2hhbmdlczsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkvLyBwYV9UT0RPIGltcGxlbWVudAotCS8vIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZGVjaWRlIGNvcnJlY3QgdmFsdWUgb2YgaXNWYWxpZAotCX0KLQkKLQkKLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIFRoaXMgbWV0aG9kIG11c3QgZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBvYmplY3QgaXMgc3RpbGwgdmFsaWQuCi0JCS8vIFRoaXMgaXMgaW4gcGFydGljdWxhciBpbnRlcmVzdGluZyB3aGVuIHBlcmZvcm1pbmcgYW4gdW5kbyBjaGFuZ2UKLQkJLy8gc2luY2UgdGhlIHdvcmtzcGFjZSBjb3VsZCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIHVuZG8gY2hhbmdlIGhhcwotCQkvLyBiZWVuIGNyZWF0ZWQuCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0JCi0JCi0JcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyByZXR1cm4gdGhlICJ1bmRvIiBjaGFuZ2UgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWY3M2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBSZW1lbWJlciB0byBjaGFuZ2UgdGhlIHBsdWdpbi54bWwgZmlsZSBpZiB0aGUgbmFtZSBvZiB0aGlzIGNsYXNzIGNoYW5nZXMuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQYWNrYWdlUmVuYW1lUGFydGljaXBhbnQgZXh0ZW5kcyBSZW5hbWVQYXJ0aWNpcGFudCB7Ci0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IGZQa2cgPSBudWxsOwotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY2hlY2tDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCi0JICovCi0JCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLCBDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjcmVhdGVDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlDaGFuZ2VbXSBjaGFuZ2VzID0gSlNQUGFja2FnZVJlbmFtZUNoYW5nZS5jcmVhdGVDaGFuZ2VzRm9yKHRoaXMuZlBrZywgZ2V0QXJndW1lbnRzKCkuZ2V0TmV3TmFtZSgpKTsKLQkJQ29tcG9zaXRlQ2hhbmdlIG11bHRpQ2hhbmdlID0gbnVsbDsKLQkJaWYgKGNoYW5nZXMubGVuZ3RoID4gMCkgewotCQkJbXVsdGlDaGFuZ2UgPSBuZXcgQ29tcG9zaXRlQ2hhbmdlKEpzVUlNZXNzYWdlcy5KU1BfY2hhbmdlcywgY2hhbmdlcyk7Ci0JCX0KLQkJcmV0dXJuIG11bHRpQ2hhbmdlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2dldE5hbWUoKQotCSAqLwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGhpcy5mUGtnICE9IG51bGwpIHsKLQkJCW5hbWUgPSB0aGlzLmZQa2cuZ2V0RWxlbWVudE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpIHsKLQkJCXRoaXMuZlBrZyA9IChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50OwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmE0NTkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFBhY2thZ2VSZW5hbWVSZXF1ZXN0b3IgZXh0ZW5kcyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIHsKLQkvKioKLQkgKiBFbGVtZW50IGlzIHRoZSBvbGQgcGFja2FnZS4gbmV3TmFtZSBpcyB0aGUgbmV3IHBhY2thZ2UgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBuZXdOYW1lCi0JICovCi0JcHVibGljIEpTUFBhY2thZ2VSZW5hbWVSZXF1ZXN0b3IoSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG5ld05hbWUpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBOTFMuYmluZChKc1VJTWVzc2FnZXMuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl81LCAobmV3IFN0cmluZ1tdIHsgcGFja2FnZU5hbWUsIG5ld05hbWUgfSkpOwotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFJlbmFtZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFJlbmFtZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmQyZmI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklGdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5yZWZhY3RvcmluZy5SZW5hbWVTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElBY3Rpb25EZWxlZ2F0ZTIsIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSUVkaXRvclBhcnQgZkVkaXRvcjsKLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBudWxsaW5nIG91dCBqdXN0IGluIGNhc2UKLQkJZkVkaXRvciA9IG51bGw7Ci0JfQotCQotCXByaXZhdGUgSUphdmFTY3JpcHRFbGVtZW50IGdldFNlbGVjdGVkRWxlbWVudCgpIHsKLQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQlpZiAoZkVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSBlbGVtZW50cyA9IEpTUEphdmFTZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKElUZXh0RWRpdG9yKSBmRWRpdG9yKTsKLQkJCWlmIChlbGVtZW50cy5sZW5ndGggPT0gMSkgewotCQkJCWVsZW1lbnQgPSBlbGVtZW50c1swXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KEpzVUlNZXNzYWdlcy5SZW5hbWVFbGVtZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChKc1VJTWVzc2FnZXMuUmVuYW1lRWxlbWVudF9sYWJlbCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50ID0gZ2V0U2VsZWN0ZWRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCVJlbmFtZVN1cHBvcnQgcmVuYW1lU3VwcG9ydCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgSUphdmFTY3JpcHRFbGVtZW50LlRZUEU6Ci0JCQkJCQlyZW5hbWVTdXBwb3J0ID0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoKElUeXBlKSBlbGVtZW50LCBlbGVtZW50LmdldEVsZW1lbnROYW1lKCksIFJlbmFtZVN1cHBvcnQuVVBEQVRFX1JFRkVSRU5DRVMpOwotCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJSmF2YVNjcmlwdEVsZW1lbnQuTUVUSE9EOgotCQkJCQkJcmVuYW1lU3VwcG9ydCA9IFJlbmFtZVN1cHBvcnQuY3JlYXRlKChJRnVuY3Rpb24pIGVsZW1lbnQsIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSwgUmVuYW1lU3VwcG9ydC5VUERBVEVfUkVGRVJFTkNFUyk7Ci0JCQkJCWJyZWFrOwotCQkJCQljYXNlIElKYXZhU2NyaXB0RWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UOgotCQkJCQkJcmVuYW1lU3VwcG9ydCA9IFJlbmFtZVN1cHBvcnQuY3JlYXRlKChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50LCBlbGVtZW50LmdldEVsZW1lbnROYW1lKCksIFJlbmFtZVN1cHBvcnQuVVBEQVRFX1JFRkVSRU5DRVMpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHJlbmFtZVN1cHBvcnQgIT0gbnVsbCkgewotCQkJCQlyZW5hbWVTdXBwb3J0Lm9wZW5EaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpKTsKLQkJCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5jbGVhclN0YXR1c0xpbmUoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5RXJyb3JNZXNzYWdlKEpzVUlNZXNzYWdlcy5KU1BSZW5hbWVFbGVtZW50QWN0aW9uXzApOwotCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5hZGRPbmVUaW1lQ2xlYXJMaXN0ZW5lcigpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsKLQkJcnVuKGFjdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCWZFZGl0b3IgPSB0YXJnZXRFZGl0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlQ2hhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVDaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVhYTM5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5Kc1NlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpTUFR5cGVNb3ZlQ2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKLQlwdWJsaWMgc3RhdGljIENoYW5nZVtdIGNyZWF0ZUNoYW5nZXNGb3IoSVR5cGUgdHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJSnNTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJLy8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgSlNQSW5kZXhNYW5hZ2VyCi0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMDM2Ci0JCS8vIHN1cHBvcnQuaW5kZXhXb3Jrc3BhY2VBbmRXYWl0KCk7Ci0JCUpTUFR5cGVNb3ZlUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBKU1BUeXBlTW92ZVJlcXVlc3Rvcih0eXBlLCBuZXdOYW1lKTsKLQkJc3VwcG9ydC5zZWFyY2hSdW5uYWJsZSh0eXBlLCBuZXcgSnNTZWFyY2hTY29wZSgpLCByZXF1ZXN0b3IpOwotCQlyZXR1cm4gcmVxdWVzdG9yLmdldENoYW5nZXMoKTsKLQl9Ci0JCi0JCi0JcHVibGljIE9iamVjdCBnZXRNb2RpZmllZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKc1VJTWVzc2FnZXMuSlNQX2NoYW5nZXM7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkvLyBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGRlY2lkZSBjb3JyZWN0IHZhbHVlIG9mIGlzVmFsaWQKLQl9Ci0JCi0JCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBUaGlzIG1ldGhvZCBtdXN0IGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2Ugb2JqZWN0IGlzIHN0aWxsIHZhbGlkLgotCQkvLyBUaGlzIGlzIGluIHBhcnRpY3VsYXIgaW50ZXJlc3Rpbmcgd2hlbiBwZXJmb3JtaW5nIGFuIHVuZG8gY2hhbmdlCi0JCS8vIHNpbmNlIHRoZSB3b3Jrc3BhY2UgY291bGQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSB1bmRvIGNoYW5nZSBoYXMKLQkJLy8gYmVlbiBjcmVhdGVkLgotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCQotCQotCXB1YmxpYyBDaGFuZ2UgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gcmV0dXJuIHRoZSAidW5kbyIgY2hhbmdlIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwODhlNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5Nb3ZlUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNQVHlwZU1vdmVQYXJ0aWNpcGFudCBleHRlbmRzIE1vdmVQYXJ0aWNpcGFudCB7Ci0JSVR5cGUgZlR5cGUgPSBudWxsOwotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY2hlY2tDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCi0JICovCi0JCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLCBDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjcmVhdGVDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocG0gIT0gbnVsbCAmJiBwbS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUNvbXBvc2l0ZUNoYW5nZSBtdWx0aUNoYW5nZSA9IG51bGw7Ci0JCU9iamVjdCBkZXN0ID0gZ2V0QXJndW1lbnRzKCkuZ2V0RGVzdGluYXRpb24oKTsKLQkJaWYgKGRlc3QgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0JCQlDaGFuZ2VbXSBjaGFuZ2VzID0gSlNQVHlwZU1vdmVDaGFuZ2UuY3JlYXRlQ2hhbmdlc0ZvcihmVHlwZSwgKChJUGFja2FnZUZyYWdtZW50KSBkZXN0KS5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCWlmIChjaGFuZ2VzLmxlbmd0aCA+IDApIHsKLQkJCQltdWx0aUNoYW5nZSA9IG5ldyBDb21wb3NpdGVDaGFuZ2UoSnNVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzLCBjaGFuZ2VzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbXVsdGlDaGFuZ2U7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0TmFtZSgpCi0JICovCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmICh0aGlzLmZUeXBlICE9IG51bGwpIHsKLQkJCW5hbWUgPSB0aGlzLmZUeXBlLmdldEVsZW1lbnROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCQotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgewotCQkJdGhpcy5mVHlwZSA9IChJVHlwZSkgZWxlbWVudDsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzYwODA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLkpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVNb3ZlUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciB7Ci0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqLwotCXB1YmxpYyBKU1BUeXBlTW92ZVJlcXVlc3RvcihJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5ld1BhY2thZ2UpIHsKLQkJc3VwZXIoZWxlbWVudCwgbmV3UGFja2FnZSk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChKc1VJTWVzc2FnZXMuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8yLCBuZXcgU3RyaW5nW10geyB0eXBlTmFtZSwgbmV3TmFtZSB9KTsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbmFtZVRleHQoSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHsKLQkJU3RyaW5nIHJlbmFtZVRleHQgPSBnZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkvLwlKc1RyYW5zbGF0aW9uIHRyYW5zID0gc2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCk7Ci0JCS8vU3RyaW5nIG1hdGNoVGV4dCA9IHRyYW5zLmdldEpzVGV4dCgpLnN1YnN0cmluZyhqYXZhTWF0Y2guZ2V0T2Zmc2V0KCksIGphdmFNYXRjaC5nZXRPZmZzZXQoKSArIGphdmFNYXRjaC5nZXRMZW5ndGgoKSk7Ci0JCS8vIGlmIGl0J3MgYW4gaW1wb3J0IG9yIGpzcDp1c2VCZWFuLCB3ZSBuZWVkIHRvIGFkZCB0aGUgcGFja2FnZSBuYW1lIGFzCi0JCS8vIHdlbGwKLS8vIGlmICh0cmFucy5pc0ltcG9ydChqYXZhTWF0Y2guZ2V0T2Zmc2V0KCkpCi0vLwkJCQotLy8gfHwgaXNGdWxseVF1YWxpZmllZChtYXRjaFRleHQpKSB7Ci0vLyBpZiAoIWdldE5ld05hbWUoKS5lcXVhbHMoIiIpKSB7Ci0vLyAvLyBnZXROZXdOYW1lKCkgaXMgdGhlIHBrZyBuYW1lCi0vLyByZW5hbWVUZXh0ID0gZ2V0TmV3TmFtZSgpICsgIi4iICsgcmVuYW1lVGV4dDsgLy8kTk9OLU5MUy0xJAotLy8gfQotLy8gfQotCQlyZXR1cm4gcmVuYW1lVGV4dDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZUNoYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVDaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhZDg4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZUNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQVHlwZVJlbmFtZUNoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0JcHVibGljIHN0YXRpYyBDaGFuZ2VbXSBjcmVhdGVDaGFuZ2VzRm9yKElUeXBlIHR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCUpzU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCS8vIHNob3VsZCBiZSBoYW5kbGVkIGJ5IEpTUEluZGV4TWFuYWdlcgotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzAzNgotCQkvLyBzdXBwb3J0LmluZGV4V29ya3NwYWNlQW5kV2FpdCgpOwotCQlKU1BUeXBlUmVuYW1lUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBKU1BUeXBlUmVuYW1lUmVxdWVzdG9yKHR5cGUsIG5ld05hbWUpOwotCQlzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKHR5cGUsIG5ldyBKc1NlYXJjaFNjb3BlKCksIHJlcXVlc3Rvcik7Ci0JCXJldHVybiByZXF1ZXN0b3IuZ2V0Q2hhbmdlcygpOwotCX0KLQkKLQkKLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSnNVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JLy8gbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBkZWNpZGUgY29ycmVjdCB2YWx1ZSBvZiBpc1ZhbGlkCi0JfQotCQotCQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gVGhpcyBtZXRob2QgbXVzdCBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIG9iamVjdCBpcyBzdGlsbCB2YWxpZC4KLQkJLy8gVGhpcyBpcyBpbiBwYXJ0aWN1bGFyIGludGVyZXN0aW5nIHdoZW4gcGVyZm9ybWluZyBhbiB1bmRvIGNoYW5nZQotCQkvLyBzaW5jZSB0aGUgd29ya3NwYWNlIGNvdWxkIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgdW5kbyBjaGFuZ2UgaGFzCi0JCS8vIGJlZW4gY3JlYXRlZC4KLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQkKLQkKLQlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIHJldHVybiB0aGUgInVuZG8iIGNoYW5nZSBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhNDZkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNvbXBvc2l0ZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklKYXZhV2ViTm9kZTsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIFJlbWVtYmVyIHRvIGNoYW5nZSB0aGUgcGx1Z2luLnhtbCBmaWxlIGlmIHRoZSBuYW1lIG9mIHRoaXMgY2xhc3MgY2hhbmdlcy4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIFJlbmFtZVBhcnRpY2lwYW50IHsKLQlwcml2YXRlIElUeXBlIGZUeXBlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NoZWNrQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0KQotCSAqLwotCQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY3JlYXRlQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCQotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQ2hhbmdlW10gY2hhbmdlcyA9IEpTUFR5cGVSZW5hbWVDaGFuZ2UuY3JlYXRlQ2hhbmdlc0ZvcihmVHlwZSwgZ2V0QXJndW1lbnRzKCkuZ2V0TmV3TmFtZSgpKTsKLQkJQ29tcG9zaXRlQ2hhbmdlIG11bHRpQ2hhbmdlID0gbnVsbDsKLQkJaWYgKGNoYW5nZXMubGVuZ3RoID4gMCkgewotCQkJbXVsdGlDaGFuZ2UgPSBuZXcgQ29tcG9zaXRlQ2hhbmdlKEpzVUlNZXNzYWdlcy5KU1BfY2hhbmdlcywgY2hhbmdlcyk7Ci0JCX0KLQkJcmV0dXJuIG11bHRpQ2hhbmdlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2dldE5hbWUoKQotCSAqLwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGhpcy5mVHlwZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW5hbWUgPSB0aGlzLmZUeXBlLmdldFNvdXJjZSgpOwotCQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKLQkJCXRoaXMuZlR5cGUgPSAoSVR5cGUpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVdlYk5vZGUpIHsKLQkJCWlmKCgoSUphdmFXZWJOb2RlKWVsZW1lbnQpLmdldEphdmFFbGVtZW50KCkgaW5zdGFuY2VvZiBJVHlwZSkgewotCQkJCXRoaXMuZlR5cGUgPSAoSVR5cGUpICgoSUphdmFXZWJOb2RlKWVsZW1lbnQpLmdldEphdmFFbGVtZW50KCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmNlODZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5Kc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIENyZWF0ZXMgZG9jdW1lbnQgY2hhbmdlKHMpIGZvciBhIHR5cGUgcmVuYW1lLiBDaGFuZ2VzIGFyZSBjcmVhdGVkIGZvciBldmVyeQotICogdHlwZSAibWF0Y2giIGluIHRoZSB3b3Jrc3BhY2UKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVSZW5hbWVSZXF1ZXN0b3IgZXh0ZW5kcyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIHsKLQlwdWJsaWMgSlNQVHlwZVJlbmFtZVJlcXVlc3RvcihJVHlwZSB0eXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcih0eXBlLCBuZXdOYW1lKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlTdHJpbmcgdHlwZU5hbWUgPSBnZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJU3RyaW5nIG5ld05hbWUgPSBnZXROZXdOYW1lKCk7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpzVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzQsIG5ldyBTdHJpbmdbXSB7IHR5cGVOYW1lLCBuZXdOYW1lIH0pOwotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVuYW1lVGV4dChKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBzZWFyY2hEb2MsIFNlYXJjaE1hdGNoIGphdmFNYXRjaCkgewotCQlTdHJpbmcgcmVuYW1lVGV4dCA9IGdldE5ld05hbWUoKTsKLQkvLwlTdHJpbmcgcGtnID0gZ2V0VHlwZSgpLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JLy8JSnNUcmFuc2xhdGlvbiB0cmFucyA9IHNlYXJjaERvYy5nZXRKc3BUcmFuc2xhdGlvbigpOwotCS8vCVN0cmluZyBtYXRjaFRleHQgPSB0cmFucy5nZXRKc1RleHQoKS5zdWJzdHJpbmcoamF2YU1hdGNoLmdldE9mZnNldCgpLCBqYXZhTWF0Y2guZ2V0T2Zmc2V0KCkgKyBqYXZhTWF0Y2guZ2V0TGVuZ3RoKCkpOwotCQkvLyBpZiBpdCdzIGFuIGltcG9ydCBvciBqc3A6dXNlQmVhbiBvciBmdWxseSBxdWFsaWZpZWQgdHlwZSwgd2UgbmVlZCB0bwotCQkvLyBhZGQgdGhlIHBhY2thZ2UgbmFtZSBhcyB3ZWxsCi0vLyBpZiAodHJhbnMuaXNJbXBvcnQoamF2YU1hdGNoLmdldE9mZnNldCgpKQotLy8gfHwgLyogdHJhbnMuaXNVc2VCZWFuKGphdmFNYXRjaC5nZXRPZmZzZXQoKSkgfHwKLS8vICovaXNGdWxseVF1YWxpZmllZChtYXRjaFRleHQpKSB7Ci0vLyBpZiAoIXBrZy5lcXVhbHMoIiIpKSB7Ci0vLyByZW5hbWVUZXh0ID0gcGtnICsgIi4iICsgcmVuYW1lVGV4dDsgLy8kTk9OLU5MUy0xJAotLy8gfQotLy8gfQotCQlyZXR1cm4gcmVuYW1lVGV4dDsKLQl9Ci0JCi0vLwlwcml2YXRlIElUeXBlIGdldFR5cGUoKSB7Ci0vLwkJcmV0dXJuIChJVHlwZSkgZ2V0RWxlbWVudCgpOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9CYXNpY0pzU2VhcmNoUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0Jhc2ljSnNTZWFyY2hSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFkMTBiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0Jhc2ljSnNTZWFyY2hSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTdXBwb3J0OwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgQmFzaWNKc1NlYXJjaFJlcXVlc3RvciBleHRlbmRzIFNlYXJjaFJlcXVlc3RvciB7Ci0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzcHNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogTWFwcyBqYXZhIHNlYXJjaCBjb29yZGluYXRlcyB0byBjb3JyZXNwb25kaW5nIEpTUCBjb29yZGluYXRlcy4gQWRkcyB0aGUKLQkgKiBtYXRjaGVzIHRvIHRoZSBTZWFyY2ggUmVzdWx0cyB2aWV3LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2FjY2VwdFNlYXJjaE1hdGNoKG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoKQotCSAqLwotCQotCXB1YmxpYyB2b2lkIGFjY2VwdFNlYXJjaE1hdGNoKFNlYXJjaE1hdGNoIG1hdGNoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgbWF0Y2hEb2N1bWVudFBhdGggPSBtYXRjaC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJU2VhcmNoRG9jdW1lbnQgc2VhcmNoRG9jID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0U2VhcmNoRG9jdW1lbnQobWF0Y2hEb2N1bWVudFBhdGgpOwotCQlpZiAoc2VhcmNoRG9jICE9IG51bGwgJiYgc2VhcmNoRG9jIGluc3RhbmNlb2YgSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUpIHsKLQkJCUpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlIGphdmFTZWFyY2hEb2MgPSAoSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUpIHNlYXJjaERvYzsKLQkJCWludCBqc3BTdGFydCA9IG1hdGNoLmdldE9mZnNldCgpOwotCQkJaW50IGpzcEVuZCA9IG1hdGNoLmdldE9mZnNldCgpICsgbWF0Y2guZ2V0TGVuZ3RoKCk7Ci0JCQlJSnNUcmFuc2xhdGlvbiB0cmFucyA9IGphdmFTZWFyY2hEb2MuZ2V0SnNwVHJhbnNsYXRpb24oKTsKLQkJCVN0cmluZyBqc3BUZXh0ID0gdHJhbnMuZ2V0SHRtbFRleHQoKTsKLQkJCVN0cmluZyBqYXZhVGV4dCA9IGphdmFTZWFyY2hEb2MuZ2V0SmF2YVRleHQoKTsKLQkJCWlmIChCYXNpY0pzU2VhcmNoUmVxdWVzdG9yLkRFQlVHKSB7Ci0JCQkJZGlzcGxheURlYnVnSW5mbyhtYXRjaCwganNwU3RhcnQsIGpzcEVuZCwganNwVGV4dCwgamF2YVRleHQpOwotCQkJfQotCQkJaWYgKGpzcFN0YXJ0ID4gLTEgJiYganNwRW5kID4gLTEpIHsKLQkJCQlhZGRTZWFyY2hNYXRjaChuZXcgRG9jdW1lbnQodHJhbnMuZ2V0SHRtbFRleHQoKSksIGphdmFTZWFyY2hEb2MuZ2V0RmlsZSgpLCBqc3BTdGFydCwganNwRW5kLCBqc3BUZXh0KTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc2VhcmNoRG9jCi0JICogQHBhcmFtIGpzcFN0YXJ0Ci0JICogQHBhcmFtIGpzcEVuZAotCSAqIEBwYXJhbSBqc3BUcmFuc2xhdGlvbgotCSAqIEBwYXJhbSBqc3BUZXh0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VhcmNoTWF0Y2goSURvY3VtZW50IGpzcERvY3VtZW50LCBJRmlsZSBqc3BGaWxlLCBpbnQganNwU3RhcnQsIGludCBqc3BFbmQsIFN0cmluZyBqc3BUZXh0KSB7Ci0JLy8gaW1wbGVtZW50IGluIHN1YmNsYXNzCi0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2JlZ2luUmVwb3J0aW5nKCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBiZWdpblJlcG9ydGluZygpIHsKLQkJaWYgKEJhc2ljSnNTZWFyY2hSZXF1ZXN0b3IuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQIFNlYXJjaCByZXF1ZXN0b3I6IGJlZ2luUmVwb3J0aW5nKCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCS8qKgotCSAqIEZvciBkZWJ1Zy4KLQkgKiAKLQkgKiBAcGFyYW0gb3JpZ01hdGNoCi0JICogQHBhcmFtIGpzcFN0YXJ0Ci0JICogQHBhcmFtIGpzcEVuZAotCSAqIEBwYXJhbSBqc3BUZXh0Ci0JICogQHBhcmFtIGphdmFUZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlEZWJ1Z0luZm8oU2VhcmNoTWF0Y2ggb3JpZ01hdGNoLCBpbnQganNwU3RhcnQsIGludCBqc3BFbmQsIFN0cmluZyBqc3BUZXh0LCBTdHJpbmcgamF2YVRleHQpIHsKLQkJaWYgKG9yaWdNYXRjaCA9PSBudWxsIHx8IGpzcFN0YXJ0ID09IC0xIHx8IGpzcEVuZCA9PSAtMSB8fCBqc3BFbmQgPCBqc3BTdGFydCB8fCBqc3BUZXh0ID09IG51bGwgfHwgamF2YVRleHQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiYWNjZXB0IHBvc3NpYmxlIG1hdGNoIFtqc3BEb2M6ICIgKyBvcmlnTWF0Y2guZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSArICIgIiArIG9yaWdNYXRjaC5nZXRPZmZzZXQoKSArICI6IiArIG9yaWdNYXRjaC5nZXRPZmZzZXQoKSArIG9yaWdNYXRjaC5nZXRMZW5ndGgoKSArICJdPyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigibWF0Y2ggaW5mbzoiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oInRoZSBqYXZhIHRleHQgaXM6IiArIGphdmFUZXh0LnN1YnN0cmluZyhvcmlnTWF0Y2guZ2V0T2Zmc2V0KCksIG9yaWdNYXRjaC5nZXRPZmZzZXQoKSArIG9yaWdNYXRjaC5nZXRMZW5ndGgoKSkpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiamF2YSBzZWFyY2ggbWF0Y2ggdHJhbnNsYXRlcyB0byBqc3AgY29vcmRzIFtzdGFydDogIiArIGpzcFN0YXJ0ICsgIiBlbmQ6IiArIGpzcEVuZCArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiIHRoZSBqc3AgdGV4dCBpczoiICsganNwVGV4dC5zdWJzdHJpbmcoanNwU3RhcnQsIGpzcEVuZCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2VuZFJlcG9ydGluZygpCi0JICovCi0JCi0JcHVibGljIHZvaWQgZW5kUmVwb3J0aW5nKCkgewotCQlpZiAoQmFzaWNKc1NlYXJjaFJlcXVlc3Rvci5ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1AgU2VhcmNoIHJlcXVlc3RvcjogZW5kUmVwb3J0aW5nKCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2VudGVyUGFydGljaXBhbnQob3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQpCi0JICovCi0JCi0JcHVibGljIHZvaWQgZW50ZXJQYXJ0aWNpcGFudChTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCkgewotCQlpZiAoQmFzaWNKc1NlYXJjaFJlcXVlc3Rvci5ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1AgU2VhcmNoIHJlcXVlc3RvcjogZW50ZXJQYXJ0aWNpcGFudCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvciNleGl0UGFydGljaXBhbnQob3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQpCi0JICovCi0JCi0JcHVibGljIHZvaWQgZXhpdFBhcnRpY2lwYW50KFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7Ci0JCWlmIChCYXNpY0pzU2VhcmNoUmVxdWVzdG9yLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBTZWFyY2ggcmVxdWVzdG9yOiBleGl0UGFydGljaXBhbnQoKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmZjNjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc2VhcmNoLkhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSnNGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIExpc3QgZlByb2Nlc3NvcnM7Ci0JCi0JCi0JcHJvdGVjdGVkIExpc3QgZ2V0UHJvY2Vzc29ycygpIHsKLQkJaWYgKGZQcm9jZXNzb3JzID09IG51bGwpIHsKLQkJCWZQcm9jZXNzb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBodG1sUHJvY2Vzc29yID0gbmV3IEhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IoKTsKLQkJCWZQcm9jZXNzb3JzLmFkZChodG1sUHJvY2Vzc29yKTsKLQkJCS8vIHRlbXBvcmFyeSwgd29ya2Fyb3VuZCB0byBkaXNhYmxlIGZ1bmN0aW9uLCBzaW5jZSB1c2luZyB0aGUKLQkJCS8vIGZ1bmN0aW9uCi0JCQkvLyBjYW4gZWFzaWx5IGNhdXNlIGRlYWRsb2NrIHRvIG9jY3VyLgotCQkJLy8gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDM2NjIKLS8vIEpTUEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBqc3BQcm9jZXNzb3IgPSBuZXcKLS8vIEpTUEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcigpOwotLy8gZlByb2Nlc3NvcnMuYWRkKGpzcFByb2Nlc3Nvcik7Ci0JCX0KLQkJcmV0dXJuIGZQcm9jZXNzb3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EwZDkzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUudGV4dC5JSnNQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc0ZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBleHRlbmRzIEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciB7Ci0JcHJpdmF0ZSBJSmF2YVNjcmlwdEVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIGVsZW1lbnRzID0gZ2V0SmF2YUVsZW1lbnRzRm9yQ3VycmVudFNlbGVjdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCXJldHVybiBlbGVtZW50cy5sZW5ndGggPiAwID8gZWxlbWVudHNbMF0gOiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiB1c2VzIEpTUFRyYW5zbGF0aW9uIHRvIGdldCBjdXJyZW50bHkgc2VsZWN0ZWQgSmF2YSBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGN1cnJlbnRseSBzZWxlY3RlZCBJSmF2YUVsZW1lbnRzCi0JICovCi0JcHJpdmF0ZSBJSmF2YVNjcmlwdEVsZW1lbnRbXSBnZXRKYXZhRWxlbWVudHNGb3JDdXJyZW50U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhU2NyaXB0RWxlbWVudFswXTsKLQkJLy8gZ2V0IEpTUCB0cmFuc2xhdGlvbiBvYmplY3QgZm9yIHRoaXMgdmlld2VyJ3MgZG9jdW1lbnQKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCUlKc1RyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKc1RyYW5zbGF0aW9uKGZhbHNlKTsKLQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjIxMQotCQkJCQllbGVtZW50cyA9IHRyYW5zbGF0aW9uLmdldEVsZW1lbnRzRnJvbUpzUmFuZ2Uoc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UGFydGl0aW9uVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBJSnNQYXJ0aXRpb25zLkh0bWxKc1BhcnRpdGlvbiB9OwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UmVnaW9uVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgfTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIElTZWFyY2hRdWVyeSBnZXRTZWFyY2hRdWVyeShJRmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcmVnaW9uVGV4dCwgU3RyaW5nIHJlZ2lvblR5cGUsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSUphdmFTY3JpcHRFbGVtZW50IGphdmFTY3JpcHRFbGVtZW50ID0gZ2V0SmF2YUVsZW1lbnQoZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24pOwotCQlpZiAoamF2YVNjcmlwdEVsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBKc1NlYXJjaFF1ZXJ5KGZpbGUsIGphdmFTY3JpcHRFbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDQ5ODdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLk9jY3VycmVuY2VzU2VhcmNoUmVzdWx0OwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQgZXh0ZW5kcyBPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdCB7Ci0JcHVibGljIEpzT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQoSVNlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCXN1cGVyKHF1ZXJ5KTsKLQl9Ci0JCi0JCi0JcHVibGljIE1hdGNoW10gZ2V0TWF0Y2hlcygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE1hdGNoZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzU2VhcmNoUXVlcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNTZWFyY2hRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzgwN2UwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNTZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guQmFzaWNTZWFyY2hRdWVyeTsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzU2VhcmNoUXVlcnkgZXh0ZW5kcyBCYXNpY1NlYXJjaFF1ZXJ5IHsKLQkvKiogdGhlIElKYXZhU2NyaXB0RWxlbWVudCB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZmlsZSAqICovCi0JcHJpdmF0ZSBJSmF2YVNjcmlwdEVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCQotCXB1YmxpYyBKc1NlYXJjaFF1ZXJ5KElGaWxlIGZpbGUsIElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKGZpbGUpOwotCQl0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gY2FuUmVydW4oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2NhblJ1bkluQmFja2dyb3VuZCgpCi0JICovCi0JCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuSW5CYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9RdWVyeSgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQl0cnkgewotCQkJSnNTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJCS8vIGluZGV4IHRoZSBmaWxlCi0JCQlTZWFyY2hEb2N1bWVudCBkZWxlZ2F0ZSA9IHN1cHBvcnQuYWRkSnNwRmlsZShnZXRGaWxlKCkpOwotCQkJU3RyaW5nIHNjb3BlUGF0aCA9IGRlbGVnYXRlLmdldFBhdGgoKTsKLQkJCUpzU2VhcmNoU2NvcGUgc2luZ2xlRmlsZVNjb3BlID0gbmV3IEpzU2VhcmNoU2NvcGUobmV3IFN0cmluZ1tdIHsgZ2V0RmlsZSgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgc2NvcGVQYXRoIH0pOwotCQkJLy8gcGVyZm9ybSBhIHNlYXJjaHMKLQkJCS8vIGJ5IHBhc3NpbmcgaW4gdGhpcyBqc3Agc2VhcmNoIHF1ZXJ5LCByZXF1c3RvciBjYW4gYWRkIG1hdGNoZXMKLQkJCS8vIHN1cHBvcnQuc2VhcmNoUnVubmFibGUoZ2V0SmF2YUVsZW1lbnQoKSwgc2luZ2xlRmlsZVNjb3BlLCBuZXcKLQkJCS8vIEpTUFNpbmdsZUZpbGVTZWFyY2hSZXF1ZXN0b3IoZ2V0SW5zdGFuY2UoKSkpOwotCQkJc3VwcG9ydC5zZWFyY2hSdW5uYWJsZShnZXRKYXZhRWxlbWVudCgpLCBzaW5nbGVGaWxlU2NvcGUsIG5ldyBKc1NpbmdsZUZpbGVTZWFyY2hSZXF1ZXN0b3IoZ2V0SW5zdGFuY2UoKSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIsIElTdGF0dXMuT0ssICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZW5hbWUoKSB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IEpzVUlNZXNzYWdlcy5PY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzI7Ci0JCWlmIChnZXRGaWxlKCkgIT0gbnVsbCkgewotCQkJZmlsZW5hbWUgPSBnZXRGaWxlKCkuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBmaWxlbmFtZTsKLQl9Ci0JCi0JLy8gZm9yIGFjY2VzcyBieSBpbm5lciBjbGFzcwotCXB1YmxpYyBKc1NlYXJjaFF1ZXJ5IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JcHVibGljIElKYXZhU2NyaXB0RWxlbWVudCBnZXRKYXZhRWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZkVsZW1lbnQ7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNnZXRMYWJlbCgpCi0JICovCi0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJU3RyaW5nW10gYXJncyA9IHsgZ2V0U2VhcmNoVGV4dCgpLCBnZXRPY2N1cnJlbmNlc0NvdW50VGV4dCgpLCBnZXRGaWxlbmFtZSgpIH07Ci0JCXJldHVybiBOTFMuYmluZChKc1VJTWVzc2FnZXMuT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8wLCBhcmdzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0T2NjdXJyZW5jZXNDb3VudFRleHQoKSB7Ci0JCVN0cmluZyBjb3VudCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIHBhX1RPRE8gbWFrZSBkeW5hbWljCi0JCXJldHVybiBjb3VudDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldFNlYXJjaFJlc3VsdCgpCi0JICovCi0JCi0JcHVibGljIElTZWFyY2hSZXN1bHQgZ2V0U2VhcmNoUmVzdWx0KCkgewotCQlyZXR1cm4gbmV3IEpzT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQodGhpcyk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VhcmNoVGV4dCgpIHsKLQkJcmV0dXJuIGZFbGVtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc1NlYXJjaFJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc1NlYXJjaFJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2ZlYjUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNTZWFyY2hSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5JU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSnNTZWFyY2hSZXF1ZXN0b3IgZXh0ZW5kcyBCYXNpY0pzU2VhcmNoUmVxdWVzdG9yIHsKLQlwcml2YXRlIElTZWFyY2hSZXF1ZXN0b3IgZkphdmFSZXF1ZXN0b3IgPSBudWxsOwotCQotCXB1YmxpYyBKc1NlYXJjaFJlcXVlc3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIEpzU2VhcmNoUmVxdWVzdG9yKElTZWFyY2hSZXF1ZXN0b3IgamF2YVJlcXVlc3RvcikgewotCQkvLyBuZWVkIHRvIHJlcG9ydCBtYXRjaGVzIHRvIGphdmFSZXF1ZXN0b3IKLQkJdGhpcy5mSmF2YVJlcXVlc3RvciA9IGphdmFSZXF1ZXN0b3I7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFNlYXJjaE1hdGNoKElEb2N1bWVudCBqc3BEb2N1bWVudCwgSUZpbGUganNwRmlsZSwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBTdHJpbmcganNwVGV4dCkgewotCQlpZiAoIWpzcEZpbGUuZXhpc3RzKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgbGluZU51bWJlciA9IC0xOwotCQl0cnkgewotCQkJbGluZU51bWJlciA9IGpzcERvY3VtZW50LmdldExpbmVPZk9mZnNldChqc3BTdGFydCk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIm9mZnNldDogIiArIEludGVnZXIudG9TdHJpbmcoanNwU3RhcnQpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNyZWF0ZVNlYXJjaE1hcmtlcihqc3BGaWxlLCBqc3BTdGFydCwganNwRW5kLCBsaW5lTnVtYmVyKTsKLQkJaWYgKHRoaXMuZkphdmFSZXF1ZXN0b3IgIT0gbnVsbCkgewotCQkJTWF0Y2ggbWF0Y2ggPSBuZXcgTWF0Y2goanNwRmlsZSwganNwU3RhcnQsIGpzcEVuZCAtIGpzcFN0YXJ0KTsKLQkJCXRoaXMuZkphdmFSZXF1ZXN0b3IucmVwb3J0TWF0Y2gobWF0Y2gpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBqc3BGaWxlCi0JICogQHBhcmFtIGpzcFN0YXJ0Ci0JICogQHBhcmFtIGpzcEVuZAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWFyY2hNYXJrZXIoSUZpbGUganNwRmlsZSwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBpbnQgbGluZU51bWJlcikgewotCQl0cnkgewotCQkJSU1hcmtlciBtYXJrZXIgPSBqc3BGaWxlLmNyZWF0ZU1hcmtlcihOZXdTZWFyY2hVSS5TRUFSQ0hfTUFSS0VSKTsKLQkJCUhhc2hNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKDQpOwotCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX1NUQVJULCBuZXcgSW50ZWdlcihqc3BTdGFydCkpOwotCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX0VORCwgbmV3IEludGVnZXIoanNwRW5kKSk7Ci0JCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkxJTkVfTlVNQkVSLCBuZXcgSW50ZWdlcihsaW5lTnVtYmVyKSk7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc1NpbmdsZUZpbGVTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NTY1MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc1NpbmdsZUZpbGVTZWFyY2hSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKc1NpbmdsZUZpbGVTZWFyY2hSZXF1ZXN0b3IgZXh0ZW5kcyBCYXNpY0pzU2VhcmNoUmVxdWVzdG9yIHsKLQlwcml2YXRlIEpzU2VhcmNoUXVlcnkgZlF1ZXJ5ID0gbnVsbDsKLQkKLQlwdWJsaWMgSnNTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yKEpzU2VhcmNoUXVlcnkgcXVlcnkpIHsKLQkJdGhpcy5mUXVlcnkgPSBxdWVyeTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VhcmNoTWF0Y2goSURvY3VtZW50IGpzcERvY3VtZW50LCBJRmlsZSBqc3BGaWxlLCBpbnQganNwU3RhcnQsIGludCBqc3BFbmQsIFN0cmluZyBqc3BUZXh0KSB7Ci0JCS8vIGFkZCBtYXRjaCB0byBKU1AgcXVlcnkuLi4KLQkJdGhpcy5mUXVlcnkuYWRkTWF0Y2goanNwRG9jdW1lbnQsIGpzcFN0YXJ0LCBqc3BFbmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSnNNYXRjaFByZXNlbnRhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC91aS9Kc01hdGNoUHJlc2VudGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYTg4ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC91aS9Kc01hdGNoUHJlc2VudGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLklNYXRjaFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5CYXNpY1NlYXJjaExhYmVsUHJvdmlkZXI7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSnNNYXRjaFByZXNlbnRhdGlvbiBpbXBsZW1lbnRzIElNYXRjaFByZXNlbnRhdGlvbiB7Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guSU1hdGNoUHJlc2VudGF0aW9uI2NyZWF0ZUxhYmVsUHJvdmlkZXIoKQotCSAqLwotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBjcmVhdGVMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEJhc2ljU2VhcmNoTGFiZWxQcm92aWRlcigpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5JTWF0Y2hQcmVzZW50YXRpb24jc2hvd01hdGNoKG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoLAotCSAqICAgICAgaW50LCBpbnQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2hvd01hdGNoKE1hdGNoIG1hdGNoLCBpbnQgY3VycmVudE9mZnNldCwgaW50IGN1cnJlbnRMZW5ndGgsIGJvb2xlYW4gYWN0aXZhdGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIE9iamVjdCBvYmogPSBtYXRjaC5nZXRFbGVtZW50KCk7Ci0JCS8vIHNob3cgbWF0Y2ggaW4gSlNQIGVkaXRvcgotCQlpZiAoYWN0aXZhdGUpIHsKLQkJCS8vIHVzZSBzaG93IGluIHRhcmdldD8KLQkJfSBlbHNlIHsKLQkJCS8vIGp1c3Qgc2VsZWN0Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL3VpL0pzUXVlcnlQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC91aS9Kc1F1ZXJ5UGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFmNTI5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL3VpL0pzUXVlcnlQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2gudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLkVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLklNYXRjaFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guSVF1ZXJ5UGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLklTZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLlBhdHRlcm5RdWVyeVNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLlF1ZXJ5U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5Kc1NlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2guSnNTZWFyY2hSZXF1ZXN0b3I7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSnNRdWVyeVBhcnRpY2lwYW50IGltcGxlbWVudHMgSVF1ZXJ5UGFydGljaXBhbnQgewotCS8vIGZvciBkZWJ1Z2dpbmcKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc3BzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLklRdWVyeVBhcnRpY2lwYW50I2VzdGltYXRlVGlja3Mob3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLlF1ZXJ5U3BlY2lmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGVzdGltYXRlVGlja3MoUXVlcnlTcGVjaWZpY2F0aW9uIGRhdGEpIHsKLQkJLy8gcGFfVE9ETyB1c2UgcHJvamVjdCBmaWxlIGNvdW50ZXIgZnJvbSBKU1BTZWFyY2hTdXBwb3J0Li4uCi0JCXJldHVybiAwOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5JUXVlcnlQYXJ0aWNpcGFudCNnZXRVSVBhcnRpY2lwYW50KCkKLQkgKi8KLQlwdWJsaWMgSU1hdGNoUHJlc2VudGF0aW9uIGdldFVJUGFydGljaXBhbnQoKSB7Ci0JCXJldHVybiBuZXcgSnNNYXRjaFByZXNlbnRhdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5JUXVlcnlQYXJ0aWNpcGFudCNzZWFyY2gob3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLklTZWFyY2hSZXF1ZXN0b3IsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guUXVlcnlTcGVjaWZpY2F0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2VhcmNoKElTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBRdWVyeVNwZWNpZmljYXRpb24gcXVlcnlTcGVjaWZpY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gaW5kZXhJZk5lZWRlZCgpOwotCQkvLyBkbyBzZWFyY2ggYmFzZWQgb24gdGhlIHBhcnRpY3VsYXIgSmF2YSBxdWVyeQotCQlpZiAocXVlcnlTcGVjaWZpY2F0aW9uIGluc3RhbmNlb2YgRWxlbWVudFF1ZXJ5U3BlY2lmaWNhdGlvbikgewotCQkJLy8gZWxlbWVudCBzZWFyY2ggKGVnLiBmcm9tIGdsb2JhbCBmaW5kIHJlZmVyZW5jZXMgaW4gSmF2YSBmaWxlKQotCQkJRWxlbWVudFF1ZXJ5U3BlY2lmaWNhdGlvbiBlbGVtZW50UXVlcnkgPSAoRWxlbWVudFF1ZXJ5U3BlY2lmaWNhdGlvbikgcXVlcnlTcGVjaWZpY2F0aW9uOwotCQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50UXVlcnkuZ2V0RWxlbWVudCgpOwotCQkJaWYgKEpzUXVlcnlQYXJ0aWNpcGFudC5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQIFF1ZXJ5IFBhcnRpY2lwYW50IHNlYXJjaGluZyBvbiBFTEVNRU5UOiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVNlYXJjaFJlcXVlc3RvciBqc3BSZXF1ZXN0b3IgPSBuZXcgSnNTZWFyY2hSZXF1ZXN0b3IocmVxdWVzdG9yKTsKLQkJCS8vIHBhX1RPRE8gbmVlZCB0byBhZGFwdCBKYXZhU2VhcmNoU2NvcGUgdG8gYSBKU1BTZWFyY2hTY29wZQotCQkJSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuc2VhcmNoKGVsZW1lbnQsIG5ldyBKc1NlYXJjaFNjb3BlKCksIGpzcFJlcXVlc3Rvcik7Ci0JCX0gZWxzZSBpZiAocXVlcnlTcGVjaWZpY2F0aW9uIGluc3RhbmNlb2YgUGF0dGVyblF1ZXJ5U3BlY2lmaWNhdGlvbikgewotCQkJLy8gcGF0dGVybiBzZWFyY2ggKGVnLiBmcm9tIEphdmEgc2VhcmNoIHBhZ2UpCi0JCQlQYXR0ZXJuUXVlcnlTcGVjaWZpY2F0aW9uIHBhdHRlcm5RdWVyeSA9IChQYXR0ZXJuUXVlcnlTcGVjaWZpY2F0aW9uKSBxdWVyeVNwZWNpZmljYXRpb247Ci0JCQlTdHJpbmcgcGF0dGVybiA9IHBhdHRlcm5RdWVyeS5nZXRQYXR0ZXJuKCk7Ci0JCQlpZiAoSnNRdWVyeVBhcnRpY2lwYW50LkRFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1AgUXVlcnkgUGFydGljaXBhbnQgc2VhcmNoaW5nIG9uIFBBVFRFUk46ICIgKyBwYXR0ZXJuKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJU2VhcmNoUmVxdWVzdG9yIGpzcFJlcXVlc3RvciA9IG5ldyBKc1NlYXJjaFJlcXVlc3RvcihyZXF1ZXN0b3IpOwotCQkJSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuc2VhcmNoKHBhdHRlcm4sIG5ldyBKc1NlYXJjaFNjb3BlKCksIHBhdHRlcm5RdWVyeS5nZXRTZWFyY2hGb3IoKSwgcGF0dGVyblF1ZXJ5LmdldExpbWl0VG8oKSwgU2VhcmNoUGF0dGVybi5SX1BBVFRFUk5fTUFUQ0gsIGZhbHNlLCBqc3BSZXF1ZXN0b3IpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNEVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNEVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGI2YTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTRFQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JKU0RUOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTRFQgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQkvKgotCSAqIEBzZWUgQWRhcHRlckZhY3RvcnlQcm92aWRlciNhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWRhcHRlckZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyB0aGVzZSBhcmUgdGhlIG1haW4gZmFjdG9yaWVzLCBvbiBtb2RlbCdzIGZhY3RvcnkgcmVnaXN0cnkKLQkJYWRkQ29udGVudEJhc2VkRmFjdG9yaWVzKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCS8vIC0tLS0tLS0KLQkJLy8gTXVzdCB1cGRhdGUvYWRkIHRvIHByb3BhZ2F0aW5nIGFkYXB0ZXJzIGhlcmUgdG9vCi0JCWFkZFByb3BhZ2F0aW5nQWRhcHRlcnMoc3RydWN0dXJlZE1vZGVsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udGVudEJhc2VkRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZmFjdG9yeVJlZ2lzdHJ5LCAiUHJvZ3JhbSBFcnJvcjogY2xpZW50IGNhbGxlciBtdXN0IGVuc3VyZSBtb2RlbCBoYXMgZmFjdG9yeSByZWdpc3RyeSIpOyAvLyROT04tTkxTLTEkCi0JCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCWZhY3RvcnkgPSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCWlmICghKGZhY3RvcnkgaW5zdGFuY2VvZiBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckpTRFQpKSB7Ci0JCQlmYWN0b3J5UmVnaXN0cnkucmVtb3ZlRmFjdG9yaWVzRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCWZhY3RvcnkgPSBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JKU0RUKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQkJCWZhY3RvcnlSZWdpc3RyeS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JCQotCQlKc1RyYW5zbGF0aW9uQWRhcHRlckZhY3Rvcnkuc2V0dXBBZGFwdGVyRmFjdG9yeShzdHJ1Y3R1cmVkTW9kZWwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wYWdhdGluZ0FkYXB0ZXJzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7fQotCQotCS8qCi0JICogQHNlZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2lzRm9yKENvbnRlbnRUeXBlRGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSURvY3VtZW50VHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbikgewotCQkvLyByZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JKU1ApOwotCQlyZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JIVE1MKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVpbml0aWFsaXplRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWFkZEFkYXB0ZXJGYWN0b3JpZXMoc3RydWN0dXJlZE1vZGVsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0pzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0pzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMjM3ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNKcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuc3R5bGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVDb25zdGFudHNKcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTlRFTlQgPSAianNwX2NvbnRlbnQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSVN0eWxlQ29uc3RhbnRzSlNEVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0lTdHlsZUNvbnN0YW50c0pTRFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjNTFjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSVN0eWxlQ29uc3RhbnRzSlNEVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuc3R5bGUuamF2YTsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZUNvbnN0YW50c0pTRFQgewotCVN0cmluZyBKQVZBX0RFRkFVTFQgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSkFWQV9LRVlXT1JEID0gImtleXdvcmQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVCA9ICJzaW5nbGVfbGluZV9jb21tZW50IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKQVZBX01VTFRJX0xJTkVfQ09NTUVOVCA9ICJtdWx0aV9saW5lX2NvbW1lbnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpBVkFfU1RSSU5HID0gInN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KU0RUQ29kZVNjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KU0RUQ29kZVNjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkNTBlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSlNEVENvZGVTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuc3R5bGUuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLkVuZE9mTGluZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JQ2hhcmFjdGVyU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdvcmREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLk11bHRpTGluZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5QYXR0ZXJuUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlNpbmdsZUxpbmVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5Xb3JkUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzRGF0YVR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotY2xhc3MgSlNEVENvZGVTY2FubmVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5SdWxlQmFzZWRTY2FubmVyIHsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmZ0NvbnN0YW50cyA9IEpzRGF0YVR5cGVzLkNPTlNUQU5UUzsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmZ0tleXdvcmRzID0gSnNEYXRhVHlwZXMuS0VZV09SRFM7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZmdUeXBlcyA9IEpzRGF0YVR5cGVzLlRZUEVTOwotCXByaXZhdGUgSVRva2VuIGZEZWZhdWx0VG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZktleXdvcmRUb2tlbjsKLQlwcml2YXRlIElUb2tlbiBmU2luZ2xlTGluZUNvbW1lbnRUb2tlbjsKLQlwcml2YXRlIElUb2tlbiBmTXVsdGlMaW5lQ29tbWVudFRva2VuOwotCXByaXZhdGUgSVRva2VuIGZTdHJpbmdUb2tlbjsKLQlwcml2YXRlIElUb2tlbiBmVHlwZVRva2VuOwotCXByaXZhdGUgSVRva2VuIGZIVE1MQ29tbWVudEJvcmRlclRva2VuOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBKYXZhIGNvZGUgc2Nhbm5lcgotCSAqLwotCXB1YmxpYyBKU0RUQ29kZVNjYW5uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVSdWxlcygpIHsKLQkJTGlzdCBydWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gQWRkIHJ1bGUgZm9yIG11bHRpcGxlIGxpbmUgY29tbWVudHMuCi0JCXJ1bGVzLmFkZChuZXcgTXVsdGlMaW5lUnVsZSgiLyoiLCAiKi8iLCBmTXVsdGlMaW5lQ29tbWVudFRva2VuKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCS8vIEFkZCBydWxlIGZvciBzaW5nbGUgbGluZSBjb21tZW50cy4KLQkJcnVsZXMuYWRkKG5ldyBOb25lSW5jbHVzaXZlRW5kU2VxdWVuY2VTaW5nbGVMaW5lUnVsZSgiLy8iLCAiLS0+IiwgZlNpbmdsZUxpbmVDb21tZW50VG9rZW4pKTsvLyROT04tTkxTLTEkCi0JCS8vIEFkZCBydWxlIGZvciBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLgotCQlydWxlcy5hZGQobmV3IFNpbmdsZUxpbmVSdWxlKCJcIiIsICJcIiIsIGZTdHJpbmdUb2tlbiwgJ1xcJykpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJ1bGVzLmFkZChuZXcgU2luZ2xlTGluZVJ1bGUoIiciLCAiJyIsIGZTdHJpbmdUb2tlbiwgJ1xcJykpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCS8vIEFkZCBnZW5lcmljIHdoaXRlc3BhY2UgcnVsZS4KLQkJLy8gcnVsZXMuYWRkKG5ldyBXaGl0ZXNwYWNlUnVsZShuZXcgSmF2YVdoaXRlc3BhY2VEZXRlY3RvcigpKSk7Ci0JCS8vIEFkZCB3b3JkIHJ1bGUgZm9yIGtleXdvcmRzLCB0eXBlcywgYW5kIGNvbnN0YW50cy4KLQkJV29yZFJ1bGUgd29yZFJ1bGUgPSBuZXcgV29yZFJ1bGUobmV3IEphdmFXb3JkRGV0ZWN0b3IoKSwgZkRlZmF1bHRUb2tlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgSlNEVENvZGVTY2FubmVyLmZnS2V5d29yZHMubGVuZ3RoOyBpKyspIHsKLQkJCXdvcmRSdWxlLmFkZFdvcmQoSlNEVENvZGVTY2FubmVyLmZnS2V5d29yZHNbaV0sIGZLZXl3b3JkVG9rZW4pOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgSlNEVENvZGVTY2FubmVyLmZnVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCXdvcmRSdWxlLmFkZFdvcmQoSlNEVENvZGVTY2FubmVyLmZnVHlwZXNbaV0sIGZUeXBlVG9rZW4pOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgSlNEVENvZGVTY2FubmVyLmZnQ29uc3RhbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl3b3JkUnVsZS5hZGRXb3JkKEpTRFRDb2RlU2Nhbm5lci5mZ0NvbnN0YW50c1tpXSwgZlR5cGVUb2tlbik7Ci0JCX0KLQkJcnVsZXMuYWRkKHdvcmRSdWxlKTsKLQkJCi0JCS8vYWRkIHdvcmQgcnVsZSBmb3IgSFRNTCBzdHlsZSBjb21tZW50IGRlbGltaXRlcnMKLQkJcnVsZXMuYWRkKG5ldyBXb3JkUnVsZShuZXcgSFRNTENvbW1lbnREZXRlY3RvcigpLCB0aGlzLmZIVE1MQ29tbWVudEJvcmRlclRva2VuKSk7Ci0JCQotCQkvL2FkZCBydWxlIGZvciB0ZXh0IGFmdGVyIGxlYWRpbmcgSFRNTCBjb21tZW50IGRlbGltaXRlcgotCQlydWxlcy5hZGQobmV3IE5vbmVJbmNsdXNpdmVTdGFydFNlcXVlbmNlRW5kT2ZMaW5lUnVsZSgiPCEtLSIsIHRoaXMuZlNpbmdsZUxpbmVDb21tZW50VG9rZW4pKTsKLQkJCi0JCUlSdWxlW10gcmVzdWx0ID0gbmV3IElSdWxlW3J1bGVzLnNpemUoKV07Ci0JCXJ1bGVzLnRvQXJyYXkocmVzdWx0KTsKLQkJc2V0UnVsZXMocmVzdWx0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VG9rZW5EYXRhKFN0cmluZyB0b2tlbktleSwgT2JqZWN0IGRhdGEpIHsKLQkJaWYgKHRva2VuS2V5ID09IElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9LRVlXT1JEKSB7Ci0JCQlmS2V5d29yZFRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQkJZlR5cGVUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJfSBlbHNlIGlmICh0b2tlbktleSA9PSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfU1RSSU5HKSB7Ci0JCQlmU3RyaW5nVG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCX0gZWxzZSBpZiAodG9rZW5LZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX1NJTkdMRV9MSU5FX0NPTU1FTlQpIHsKLQkJCWZTaW5nbGVMaW5lQ29tbWVudFRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQl9IGVsc2UgaWYgKHRva2VuS2V5ID09IElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9NVUxUSV9MSU5FX0NPTU1FTlQpIHsKLQkJCWZNdWx0aUxpbmVDb21tZW50VG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCX0gZWxzZSBpZiAodG9rZW5LZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX0RFRkFVTFQpIHsKLQkJCWZEZWZhdWx0VG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCX0gZWxzZSBpZih0b2tlbktleSA9PSBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpIHsKLQkJCWZIVE1MQ29tbWVudEJvcmRlclRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPkRldGVjdG9yIGZvciBIVE1MIGNvbW1lbnQgZGVsaW1pdGVycy48L3A+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSFRNTENvbW1lbnREZXRlY3RvciBpbXBsZW1lbnRzIElXb3JkRGV0ZWN0b3IgewotCi0JCS8qKgotCQkgKiBAc2VlIElXb3JkRGV0ZWN0b3IjaXNXb3JkU3RhcnQoY2hhcikKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzV29yZFN0YXJ0KGNoYXIgYykgewotCQkJcmV0dXJuIChjID09ICc8JyB8fCBjID09ICctJyk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBJV29yZERldGVjdG9yI2lzV29yZFBhcnQoY2hhcikKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzV29yZFBhcnQoY2hhciBjKSB7Ci0JCQlyZXR1cm4gKGMgPT0gJy0nIHx8IGMgPT0gJyEnIHx8IGMgPT0gJz4nKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD5TYW1lIGFzIGEge0BsaW5rIFNpbmdsZUxpbmVSdWxlfSBleGNlcHQgdGhlIGdpdmVuIGVuZCBzZXF1ZW5jZSBpcyBub3QgY291bnRlZCBhcyBwYXJ0IG9mIHRoZSBtYXRjaC48L3A+Ci0JICogCi0JICogQHNlZSBTaW5nbGVMaW5lUnVsZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5vbmVJbmNsdXNpdmVFbmRTZXF1ZW5jZVNpbmdsZUxpbmVSdWxlIGV4dGVuZHMgU2luZ2xlTGluZVJ1bGUgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gc3RhcnRTZXF1ZW5jZSBzdGFydCBzZXF1ZW5jZSBpbmNsdWRlZCBpbiBydWxlIG1hdGNoCi0JCSAqIEBwYXJhbSBlbmRTZXF1ZW5jZSBlbmQgc2VxdWVuY2UgdGhhdCB3aWxsIGVuZCB0aGlzIHJ1bGUgYnV0IHdpbGwgbm90IGJlIGNvdW50ZWQgYXMgcGFydCBvZiB0aGUgbWF0Y2gKLQkJICogQHBhcmFtIHRva2VuIHRvIHJldHVybiBvbiBhIG1hdGNoIGJ5IHRoaXMgcnVsZQotCQkgKi8KLQkJcHVibGljIE5vbmVJbmNsdXNpdmVFbmRTZXF1ZW5jZVNpbmdsZUxpbmVSdWxlKFN0cmluZyBzdGFydFNlcXVlbmNlLCBTdHJpbmcgZW5kU2VxdWVuY2UsIElUb2tlbiB0b2tlbikgewotCQkJc3VwZXIoc3RhcnRTZXF1ZW5jZSwgZW5kU2VxdWVuY2UsIHRva2VuKTsKLQkJfQotCi0JCS8qKgotCQkgKiA8cD5JZiB0aGUgZW5kIHNlcXVlbmNlIGlzIGRldGVjdGVkIHRoZW4gc2Nhbm5lciBpcyByZXdpbmQgdG8ganVzdCBiZWZvcmUgdGhlIGVuZCBzZXF1ZW5jZSwKLQkJICogb3RoZXJ3aXNlIGFjdHMgdGhlIHNhbWUgYXMge0BsaW5rIFBhdHRlcm5SdWxlI2VuZFNlcXVlbmNlRGV0ZWN0ZWR9PC9wPgotCQkgKiAKLQkJICogQHNlZSBQYXR0ZXJuUnVsZSNlbmRTZXF1ZW5jZURldGVjdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiBlbmRTZXF1ZW5jZURldGVjdGVkKElDaGFyYWN0ZXJTY2FubmVyIHNjYW5uZXIpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHN1cGVyLmVuZFNlcXVlbmNlRGV0ZWN0ZWQoc2Nhbm5lcik7Ci0JCQlpZihzdWNjZXNzKSB7Ci0JCQkJZm9yIChpbnQgbGVuZ3RoID0gdGhpcy5mRW5kU2VxdWVuY2UubGVuZ3RoLTE7IGxlbmd0aCA+IDA7IGxlbmd0aC0tKSB7Ci0JCQkJCXNjYW5uZXIudW5yZWFkKCk7Ci0JCQkJfQotCQkJCQotCQkJCWlmKHRoaXMuc2VxdWVuY2VEZXRlY3RlZChzY2FubmVyLCB0aGlzLmZFbmRTZXF1ZW5jZSwgZmFsc2UpKSB7Ci0JCQkJCWZvciAoaW50IGxlbmd0aCA9IHRoaXMuZkVuZFNlcXVlbmNlLmxlbmd0aDsgbGVuZ3RoID4gMDsgbGVuZ3RoLS0pIHsKLQkJCQkJCXNjYW5uZXIudW5yZWFkKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzczsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD5TYW1lIGFzIGFuIHtAbGluayBFbmRPZkxpbmVSdWxlfSBleGNlcHQgdGhlIGdpdmVuIHN0YXJ0IHNlcXVlbmNlIGlzIG5vdCBjb3VudGVkIGFzIHBhcnQgb2YgdGhlIG1hdGNoLjwvcD4KLQkgKiAKLQkgKiBAc2VlIEVuZE9mTGluZVJ1bGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb25lSW5jbHVzaXZlU3RhcnRTZXF1ZW5jZUVuZE9mTGluZVJ1bGUgZXh0ZW5kcyBFbmRPZkxpbmVSdWxlIHsKLQotCQkvKioKLQkJICogQHBhcmFtIHN0YXJ0U2VxdWVuY2Ugc3RhcnQgc2VxdWVuY2UgdGhlIGlkZW50aWZpZXMgdGhlIHN0YXJ0IG9mIHRoaXMgbWF0Y2ggYnV0IGlzIG5vdCBjb3VudGVkIGFzIHBhcnQgb2YgdGhlIG1hdGNoCi0JCSAqIEBwYXJhbSB0b2tlbiB0byByZXR1cm4gb24gYSBtYXRjaCBieSB0aGlzIHJ1bGUKLQkJICovCi0JCXB1YmxpYyBOb25lSW5jbHVzaXZlU3RhcnRTZXF1ZW5jZUVuZE9mTGluZVJ1bGUoU3RyaW5nIHN0YXJ0U2VxdWVuY2UsIElUb2tlbiB0b2tlbikgewotCQkJc3VwZXIoc3RhcnRTZXF1ZW5jZSwgdG9rZW4pOwotCQl9Ci0JCQotCQkvKioKLQkJICogPHA+U2FtZSBhcyBvdmVycmlkZGVuIGZ1bmN0aW9uIGV4Y2VwdCB1bnJlYWRzIHRoZSBzY2FubmVyIGJhY2sgdGhlIGxlbmd0aCBvZiB0aGUgc3RhcnQgc2VxdWVuY2UKLQkJICogc2luY2UgdGhlIHN0YXJ0IHNlcXVlbmNlIGlzIG5vdCBjb3VudGVkIGFzIHBhcnQgb2YgdGhlIG1hdGNoLjwvcD4KLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5QYXR0ZXJuUnVsZSNkb0V2YWx1YXRlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSUNoYXJhY3RlclNjYW5uZXIsIGJvb2xlYW4pCi0JCSAqLwotCQlwcm90ZWN0ZWQgSVRva2VuIGRvRXZhbHVhdGUoSUNoYXJhY3RlclNjYW5uZXIgc2Nhbm5lciwgYm9vbGVhbiByZXN1bWUpIHsKLQkJCWlmIChyZXN1bWUpIHsKLQkJCQlpZiAoZW5kU2VxdWVuY2VEZXRlY3RlZChzY2FubmVyKSkKLQkJCQkJcmV0dXJuIGZUb2tlbjsKLQkJCX0gZWxzZSB7Ci0JCQkJLy91bnJlYWQgdGhlIGxlbmd0aCBvZiB0aGUgc3RhcnQgc2VxdWVuY2Ugc2luY2UgaXQgaXMgbm90IGNvdW50ZWQgYXMgcGFydCBvZiB0aGUgbWF0Y2gKLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdGhpcy5mU3RhcnRTZXF1ZW5jZS5sZW5ndGggJiYgc2Nhbm5lci5nZXRDb2x1bW4oKSA+PSAwOyArK2kpIHsKLQkJCQkJc2Nhbm5lci51bnJlYWQoKTsKLQkJCQl9Ci0KLQkJCQlpbnQgYz0gc2Nhbm5lci5yZWFkKCk7Ci0JCQkJaWYgKGMgPT0gZlN0YXJ0U2VxdWVuY2VbMF0pIHsKLQkJCQkJaWYgKHNlcXVlbmNlRGV0ZWN0ZWQoc2Nhbm5lciwgZlN0YXJ0U2VxdWVuY2UsIGZhbHNlKSkgewotCQkJCQkJaWYgKGVuZFNlcXVlbmNlRGV0ZWN0ZWQoc2Nhbm5lcikpCi0JCQkJCQkJcmV0dXJuIGZUb2tlbjsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvL2JlIHN1cmUgdG8gcmUtcmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBzdGFydCBzZXF1ZW5jZSBpZiB3ZSBkaWQgbm90IG1hdGNoCi0JCQkJZm9yKGludCBpID0gMDsgaSA8IHRoaXMuZlN0YXJ0U2VxdWVuY2UubGVuZ3RoICYmIHNjYW5uZXIuZ2V0Q29sdW1uKCkgPj0gMDsgKytpKSB7Ci0JCQkJCXNjYW5uZXIucmVhZCgpOwotCQkJCX0KLQkJCX0KLQotCQkJc2Nhbm5lci51bnJlYWQoKTsKLQkJCXJldHVybiBUb2tlbi5VTkRFRklORUQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YVdvcmREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFXb3JkRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE2MjY4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YVdvcmREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuc3R5bGUuamF2YTsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKYXZhV29yZERldGVjdG9yIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV29yZERldGVjdG9yIHsKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdvcmREZXRlY3RvciNpc1dvcmRJZGVudGlmaWVyUGFydAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV29yZFBhcnQoY2hhciBjKSB7Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV29yZERldGVjdG9yI2lzV29yZElkZW50aWZpZXJTdGFydAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV29yZFN0YXJ0KGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL2phdmEvTGluZVN0eWxlUHJvdmlkZXJGb3JKU0RULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL2phdmEvTGluZVN0eWxlUHJvdmlkZXJGb3JKU0RULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MzU3ZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0xpbmVTdHlsZVByb3ZpZGVyRm9ySlNEVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnN0eWxlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0pzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9ySlNEVCBleHRlbmRzIEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIgaW1wbGVtZW50cyBMaW5lU3R5bGVQcm92aWRlciB7Ci0JLyoqIFRoZSBzY2FubmVyIGl0IHVzZXMgKi8KLQlwcml2YXRlIEpTRFRDb2RlU2Nhbm5lciBmU2Nhbm5lcjsKLQkKLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZQcmVmZXJlbmNlTGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBoYXZlIHRvIGRvIGl0IHRoaXMgd2F5IHNvIG90aGVycyBjYW4gb3ZlcnJpZGUgdGhlIG1ldGhvZAotCQkJaGFuZGxlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQl9Ci0JfTsKLQkKLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JKU0RUKCkgewotCQlzdXBlcigpOwotCQlmU2Nhbm5lciA9IG5ldyBKU0RUQ29kZVNjYW5uZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIGNvbG9yS2V5IGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGFuZCBhZGRzIHRoZSBzdHlsZQotCSAqIGluZm9ybWF0aW9uIHRvIGxpc3Qgb2YgVGV4dEF0dHJpYnV0ZXMKLQkgKiAKLQkgKiBAcGFyYW0gY29sb3JLZXkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUZXh0QXR0cmlidXRlKFN0cmluZyBjb2xvcktleSkgewotCQlJUHJlZmVyZW5jZVN0b3JlIGphdmFTdG9yZSA9IGdldEphdmFDb2xvclByZWZlcmVuY2VzKCk7Ci0JCWlmIChqYXZhU3RvcmUgIT0gbnVsbCAmJiBjb2xvcktleSAhPSBudWxsKSB7Ci0JCQlUZXh0QXR0cmlidXRlIHRhID0gbnVsbDsKLQkJCWlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfS0VZV09SRCkgewotCQkJCS8vIGtleXdvcmQKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamF2YVN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQ09MT1IpOwotCQkJCWJvb2xlYW4gYm9sZCA9IGphdmFTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBqYXZhU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfSVRBTElDKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBqYXZhU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfU1RSSUtFVEhST1VHSCk7Ci0JCQkJYm9vbGVhbiB1bmRlcmxpbmUgPSBqYXZhU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfVU5ERVJMSU5FKTsKLQkJCQlpbnQgc3R5bGUgPSBTV1QuTk9STUFMOwotCQkJCWlmIChib2xkKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKGl0YWxpY3MpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHJpa2V0aHJvdWdoKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmICh1bmRlcmxpbmUpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgbnVsbCwgc3R5bGUpOwotCQkJfSBlbHNlIGlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfU1RSSU5HKSB7Ci0JCQkJLy8gc3RyaW5nCi0JCQkJUkdCIGZvcmVncm91bmQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGphdmFTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0NPTE9SKTsKLQkJCQlib29sZWFuIGJvbGQgPSBqYXZhU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQk9MRCk7Ci0JCQkJYm9vbGVhbiBpdGFsaWNzID0gamF2YVN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0lUQUxJQyk7Ci0JCQkJYm9vbGVhbiBzdHJpa2V0aHJvdWdoID0gamF2YVN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX1NUUklLRVRIUk9VR0gpOwotCQkJCWJvb2xlYW4gdW5kZXJsaW5lID0gamF2YVN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX1VOREVSTElORSk7Ci0JCQkJaW50IHN0eWxlID0gU1dULk5PUk1BTDsKLQkJCQlpZiAoYm9sZCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChpdGFsaWNzKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuSVRBTElDOwotCQkJCX0KLQkJCQlpZiAoc3RyaWtldGhyb3VnaCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAodW5kZXJsaW5lKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlVOREVSTElORTsKLQkJCQl9Ci0JCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIG51bGwsIHN0eWxlKTsKLQkJCX0gZWxzZSBpZiAoY29sb3JLZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX1NJTkdMRV9MSU5FX0NPTU1FTlQpIHsKLQkJCQkvLyBzaW5nbGUgbGluZSBjb21tZW50Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGphdmFTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9DT0xPUik7Ci0JCQkJYm9vbGVhbiBib2xkID0gamF2YVN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBqYXZhU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0lUQUxJQyk7Ci0JCQkJYm9vbGVhbiBzdHJpa2V0aHJvdWdoID0gamF2YVN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9TVFJJS0VUSFJPVUdIKTsKLQkJCQlib29sZWFuIHVuZGVybGluZSA9IGphdmFTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfVU5ERVJMSU5FKTsKLQkJCQlpbnQgc3R5bGUgPSBTV1QuTk9STUFMOwotCQkJCWlmIChib2xkKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKGl0YWxpY3MpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHJpa2V0aHJvdWdoKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmICh1bmRlcmxpbmUpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgbnVsbCwgc3R5bGUpOwotCQkJfSBlbHNlIGlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfTVVMVElfTElORV9DT01NRU5UKSB7Ci0JCQkJLy8gbXVsdGkgbGluZSBjb21tZW50Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGphdmFTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfTVVMVElfTElORV9DT01NRU5UX0NPTE9SKTsKLQkJCQlib29sZWFuIGJvbGQgPSBqYXZhU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9NVUxUSV9MSU5FX0NPTU1FTlRfQk9MRCk7Ci0JCQkJYm9vbGVhbiBpdGFsaWNzID0gamF2YVN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfTVVMVElfTElORV9DT01NRU5UX0lUQUxJQyk7Ci0JCQkJYm9vbGVhbiBzdHJpa2V0aHJvdWdoID0gamF2YVN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfTVVMVElfTElORV9DT01NRU5UX1NUUklLRVRIUk9VR0gpOwotCQkJCWJvb2xlYW4gdW5kZXJsaW5lID0gamF2YVN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfTVVMVElfTElORV9DT01NRU5UX1VOREVSTElORSk7Ci0JCQkJaW50IHN0eWxlID0gU1dULk5PUk1BTDsKLQkJCQlpZiAoYm9sZCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChpdGFsaWNzKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuSVRBTElDOwotCQkJCX0KLQkJCQlpZiAoc3RyaWtldGhyb3VnaCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAodW5kZXJsaW5lKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlVOREVSTElORTsKLQkJCQl9Ci0JCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIG51bGwsIHN0eWxlKTsKLQkJCX0gZWxzZSBpZiAoY29sb3JLZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX0RFRkFVTFQpIHsKLQkJCQkvLyBkZWZhdWx0Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGphdmFTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0NPTE9SKTsKLQkJCQlib29sZWFuIGJvbGQgPSBqYXZhU3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQk9MRCk7Ci0JCQkJYm9vbGVhbiBpdGFsaWNzID0gamF2YVN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0lUQUxJQyk7Ci0JCQkJYm9vbGVhbiBzdHJpa2V0aHJvdWdoID0gamF2YVN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX1NUUklLRVRIUk9VR0gpOwotCQkJCWJvb2xlYW4gdW5kZXJsaW5lID0gamF2YVN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX1VOREVSTElORSk7Ci0JCQkJaW50IHN0eWxlID0gU1dULk5PUk1BTDsKLQkJCQlpZiAoYm9sZCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChpdGFsaWNzKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuSVRBTElDOwotCQkJCX0KLQkJCQlpZiAoc3RyaWtldGhyb3VnaCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAodW5kZXJsaW5lKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlVOREVSTElORTsKLQkJCQl9Ci0JCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIG51bGwsIHN0eWxlKTsKLQkJCX0gZWxzZSBpZihjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIgfHwKLQkJCQkJY29sb3JLZXkgPT0gSVN0eWxlQ29uc3RhbnRzSnMuSlNQX0NPTlRFTlQpIHsKLQkJCQkKLQkJCQkvKiogQHNlZSBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyI2FkZFRleHRBdHRyaWJ1dGUgKi8KLQkJCQl0YSA9IChUZXh0QXR0cmlidXRlKWdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KGNvbG9yS2V5KTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldEhUTUxDb2xvclByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKGNvbG9yS2V5KTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVJHQiBmb3JlZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1swXSk7Ci0JCQkJCVJHQiBiYWNrZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1sxXSk7Ci0JCQkJCWJvb2xlYW4gYm9sZCA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzJdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJYm9vbGVhbiBpdGFsaWMgPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1szXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWJvb2xlYW4gc3RyaWtldGhyb3VnaCA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzRdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJYm9vbGVhbiB1bmRlcmxpbmUgPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1s1XSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWludCBzdHlsZSA9IFNXVC5OT1JNQUw7Ci0JCQkJCWlmIChib2xkKSB7Ci0JCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULkJPTEQ7Ci0JCQkJCX0KLQkJCQkJaWYgKGl0YWxpYykgewotCQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCQkJCX0KLQkJCQkJaWYgKHN0cmlrZXRocm91Z2gpIHsKLQkJCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJCX0KLQkJCQkJaWYgKHVuZGVybGluZSkgewotCQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCQl9Ci0KLQkJCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIGJhY2tncm91bmQsIHN0eWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodGEgIT0gbnVsbCkgewotCQkJCWdldFRleHRBdHRyaWJ1dGVzKCkucHV0KGNvbG9yS2V5LCB0YSk7Ci0JCQkJZlNjYW5uZXIuc2V0VG9rZW5EYXRhKGNvbG9yS2V5LCB0YSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQWRkcyBzdHlsZSBpbmZvcm1hdGlvbiB0byB0aGUgZ2l2ZW4gdGV4dCBwcmVzZW50YXRpb24uCi0JICogCi0JICogQHBhcmFtIHByZXNlbnRhdGlvbgotCSAqICAgICAgICAgICAgdGhlIHRleHQgcHJlc2VudGF0aW9uIHRvIGJlIGV4dGVuZGVkCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgcmFuZ2UgdG8gYmUgc3R5bGVkCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2UgdG8gYmUgc3R5bGVkCi0JICogQHBhcmFtIGF0dHIKLQkgKiAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGUgZGVzY3JpYmluZyB0aGUgc3R5bGUgb2YgdGhlIHJhbmdlIHRvIGJlIHN0eWxlZAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRSYW5nZShDb2xsZWN0aW9uIHByZXNlbnRhdGlvbiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgVGV4dEF0dHJpYnV0ZSBhdHRyKSB7Ci0JCS8vIHN1cHBvcnQgZm9yIHVzZXIgZGVmaW5lZCBiYWNrZ3JvdWQgZm9yIEpTUCBzY3JpcHRsZXQgcmVnaW9ucwotCQlUZXh0QXR0cmlidXRlIHRhID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0pzLkpTUF9DT05URU5UKTsKLQkJQ29sb3IgYmdDb2xvciA9IHRhLmdldEJhY2tncm91bmQoKTsKLQkJaWYgKGJnQ29sb3IgPT0gbnVsbCkgewotCQkJYmdDb2xvciA9IGF0dHIuZ2V0QmFja2dyb3VuZCgpOwotCQl9Ci0JCVN0eWxlUmFuZ2UgcmVzdWx0ID0gbmV3IFN0eWxlUmFuZ2Uob2Zmc2V0LCBsZW5ndGgsIGF0dHIuZ2V0Rm9yZWdyb3VuZCgpLCBiZ0NvbG9yLCBhdHRyLmdldFN0eWxlKCkpOwotCQlpZiAoKGF0dHIuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSCkgIT0gMCkgewotCQkJcmVzdWx0LnN0cmlrZW91dCA9IHRydWU7Ci0JCX0KLQkJaWYgKChhdHRyLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlVOREVSTElORSkgIT0gMCkgewotCQkJcmVzdWx0LnVuZGVybGluZSA9IHRydWU7Ci0JCX0KLQkJcHJlc2VudGF0aW9uLmFkZChyZXN1bHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSnNVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBnZXRKYXZhQ29sb3JQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBnZXRIVE1MQ29sb3JQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSB0ZXh0IGF0dHJpYnV0ZSBlbmNvZGVkIGluIHRoZSBnaXZlbiB0b2tlbi4gSWYgdGhlIHRva2VuJ3MgZGF0YQotCSAqIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiBhbmQgYSB0ZXh0IGF0dHJpYnV0ZSBpdCBpcyBhc3N1bWVkIHRoYXQgaXQgaXMKLQkgKiB0aGUgZW5jb2RlZCB0ZXh0IGF0dHJpYnV0ZS4gSXQgcmV0dXJucyB0aGUgZGVmYXVsdCB0ZXh0IGF0dHJpYnV0ZSBpZgotCSAqIHRoZXJlIGlzIG5vIGVuY29kZWQgdGV4dCBhdHRyaWJ1dGUgZm91bmQuCi0JICogCi0JICogQHBhcmFtIHRva2VuCi0JICogICAgICAgICAgICB0aGUgdG9rZW4gd2hvc2UgdGV4dCBhdHRyaWJ1dGUgaXMgdG8gYmUgZGV0ZXJtaW5lZAotCSAqIEByZXR1cm4gdGhlIHRva2VuJ3MgdGV4dCBhdHRyaWJ1dGUKLQkgKi8KLQlwcml2YXRlIFRleHRBdHRyaWJ1dGUgZ2V0VG9rZW5UZXh0QXR0cmlidXRlKElUb2tlbiB0b2tlbikgewotCQlUZXh0QXR0cmlidXRlIHRhID0gbnVsbDsKLQkJT2JqZWN0IGRhdGEgPSB0b2tlbi5nZXREYXRhKCk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgVGV4dEF0dHJpYnV0ZSkgewotCQkJdGEgPSAoVGV4dEF0dHJpYnV0ZSkgZGF0YTsKLQkJfSBlbHNlIHsKLQkJCXRhID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9ERUZBVUxUKTsKLQkJfQotCQlyZXR1cm4gdGE7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0eWxlS2V5ID0gbnVsbDsKLQkJaWYgKGV2ZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmS2V5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCS8vIGNoZWNrIGlmIHByZWZlcmVuY2UgY2hhbmdlZCBpcyBhIHN0eWxlIHByZWZlcmVuY2UKLQkJCWlmKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUjsKLQkJCX0gZWxzZSBpZihJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVDsKLQkJCX0gZWxzZSBpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0NPTE9SLmVxdWFscyhwcmVmS2V5KSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0JPTEQuZXF1YWxzKHByZWZLZXkpKSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0lUQUxJQy5lcXVhbHMocHJlZktleSkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfS0VZV09SRDsKLQkJCX0gZWxzZSBpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0NPTE9SLmVxdWFscyhwcmVmS2V5KSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0JPTEQuZXF1YWxzKHByZWZLZXkpKSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0lUQUxJQy5lcXVhbHMocHJlZktleSkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfU1RSSU5HOwotCQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0NPTE9SLmVxdWFscyhwcmVmS2V5KSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9CT0xELmVxdWFscyhwcmVmS2V5KSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfSVRBTElDLmVxdWFscyhwcmVmS2V5KSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9TSU5HTEVfTElORV9DT01NRU5UOwotCQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9NVUxUSV9MSU5FX0NPTU1FTlRfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9NVUxUSV9MSU5FX0NPTU1FTlRfQk9MRC5lcXVhbHMocHJlZktleSkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9NVUxUSV9MSU5FX0NPTU1FTlRfSVRBTElDLmVxdWFscyhwcmVmS2V5KSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9NVUxUSV9MSU5FX0NPTU1FTlQ7Ci0JCQl9IGVsc2UgaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9DT0xPUi5lcXVhbHMocHJlZktleSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9CT0xELmVxdWFscyhwcmVmS2V5KSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX0RFRkFVTFQ7Ci0JCQl9Ci0JCX0KLQkJaWYgKHN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIG92ZXJ3cml0ZSBzdHlsZSBwcmVmZXJlbmNlIHdpdGggbmV3IHZhbHVlCi0JCQlhZGRUZXh0QXR0cmlidXRlKHN0eWxlS2V5KTsKLQkJCWZSZWNIaWdobGlnaHRlci5yZWZyZXNoRGlzcGxheSgpOwotCQkJZlNjYW5uZXIuaW5pdGlhbGl6ZVJ1bGVzKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9hZENvbG9ycygpIHsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0pzLkpTUF9DT05URU5UKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfS0VZV09SRCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX1NUUklORyk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX1NJTkdMRV9MSU5FX0NPTU1FTlQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9NVUxUSV9MSU5FX0NPTU1FTlQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9ERUZBVUxUKTsKLQkJZlNjYW5uZXIuaW5pdGlhbGl6ZVJ1bGVzKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHByZXBhcmVSZWdpb25zKElUeXBlZFJlZ2lvbiB0eXBlZFJlZ2lvbiwgaW50IHNzc3NyZXF1ZXN0ZWRTdGFydCwgaW50IHNzc3NyZXF1ZXN0ZWRMZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQkvKiBJbml0aWFsaXplIHRoZSB0ZXh0IGF0dHJpYnV0ZXMuIEFsc28gbG9hZCB0aGUgY29sb3JzIGFuZCBpbml0aWFsaXplIHRoZSBydWxlcyBvZiB0aGUgc2Nhbm5lciAqLwotCQlnZXRUZXh0QXR0cmlidXRlcygpOwotCQl0cnkgewotCQkJLy8gaWRlYWxseSwgZXZlbnR1YWxseSwgd2UnbGwgaGF2ZSBhICJ2aXJ0dWFsRG9jdW1lbnQiIHdlIGNhbgotCQkJLy8gcmVmZXIgdG8sIGJ1dCBmb3Igbm93IC4uLiB3ZSdsbCBzaW1wbGUgcmVzY2FuIHRoZSBvbmUgcmVnaW9uLgotCQkJLy8gdXNlIHNpbXBsZSBhZGp1c3RtZW50IChzaW5jZSAic3ViLWNvbnRlbnQiIHN0YXJ0cyBhdCAwCi0JCQlpbnQgbGFzdFN0YXJ0ID0gdHlwZWRSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgbGVuZ3RoID0gMDsKLQkJCUlUb2tlbiBsYXN0VG9rZW4gPSBUb2tlbi5VTkRFRklORUQ7Ci0JCQlmU2Nhbm5lci5zZXRSYW5nZShnZXREb2N1bWVudCgpLCBsYXN0U3RhcnQsIHR5cGVkUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJSVRva2VuIHRva2VuID0gZlNjYW5uZXIubmV4dFRva2VuKCk7Ci0JCQkJaWYgKHRva2VuLmlzRU9GKCkpIHsKLQkJCQkJaWYgKCFsYXN0VG9rZW4uaXNVbmRlZmluZWQoKSAmJiBsZW5ndGggIT0gMCkgewotCQkJCQkJYWRkUmFuZ2UoaG9sZFJlc3VsdHMsIGxhc3RTdGFydCwgbGVuZ3RoLCBnZXRUb2tlblRleHRBdHRyaWJ1dGUobGFzdFRva2VuKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICh0b2tlbi5pc1doaXRlc3BhY2UoKSkgewotCQkJCQlsZW5ndGggKz0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChsYXN0VG9rZW4uaXNVbmRlZmluZWQoKSkgewotCQkJCQlsYXN0VG9rZW4gPSB0b2tlbjsKLQkJCQkJbGVuZ3RoICs9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAodG9rZW4gIT0gbGFzdFRva2VuKSB7Ci0JCQkJCWFkZFJhbmdlKGhvbGRSZXN1bHRzLCBsYXN0U3RhcnQsIGxlbmd0aCwgZ2V0VG9rZW5UZXh0QXR0cmlidXRlKGxhc3RUb2tlbikpOwotCQkJCQlsYXN0VG9rZW4gPSB0b2tlbjsKLQkJCQkJbGFzdFN0YXJ0ID0gZlNjYW5uZXIuZ2V0VG9rZW5PZmZzZXQoKTsKLQkJCQkJbGVuZ3RoID0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWxlbmd0aCArPSBmU2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkbid0IGhhcHBlbiwgYnV0IHdlIGRvbid0IHdhbnQgaXQgdG8gc3RvcCBvdGhlcgotCQkJLy8gaGlnaGxpZ2h0aW5nLCBpZiBpdCBkb2VzLgotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCkgewotCQlnZXRDb2xvclByZWZlcmVuY2VzKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCQl0aGlzLmdldEhUTUxDb2xvclByZWZlcmVuY2VzKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCQlmU2Nhbm5lciA9IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVuUmVnaXN0ZXJQcmVmZXJlbmNlTWFuYWdlcigpIHsKLQkJZ2V0Q29sb3JQcmVmZXJlbmNlcygpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCWdldEphdmFDb2xvclByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJdGhpcy5nZXRIVE1MQ29sb3JQcmVmZXJlbmNlcygpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MUHJpbnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90YWdpbmZvL0hUTUxQcmludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMDBlNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90YWdpbmZvL0hUTUxQcmludGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1jbGFzcyBIVE1MUHJpbnRlciB7Ci0Jc3RhdGljIFJHQiBCR19DT0xPUl9SR0IgPSBudWxsOwotCXN0YXRpYyB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQlpZiAoZGlzcGxheSAhPSBudWxsICYmICFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJdHJ5IHsKLQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCQkJCSAqLwotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlIVE1MUHJpbnRlci5CR19DT0xPUl9SR0IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpLmdldFJHQigpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9IGNhdGNoIChTV1RFcnJvciBlcnIpIHsKLQkJCQkvLyBzZWU6IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00NTI5NAotCQkJCWlmIChlcnIuY29kZSAhPSBTV1QuRVJST1JfREVWSUNFX0RJU1BPU0VEKSB7Ci0JCQkJCXRocm93IGVycjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEJ1bGxldChTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgYnVsbGV0KSB7Ci0JCWlmIChidWxsZXQgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgiPGxpPiIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKGJ1bGxldCk7Ci0JCQlidWZmZXIuYXBwZW5kKCI8L2xpPiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFBhZ2VFcGlsb2coU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlidWZmZXIuYXBwZW5kKCI8L2ZvbnQ+PC9ib2R5PjwvaHRtbD4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUGFnZVByb2xvZyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCUhUTUxQcmludGVyLmluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCBidWZmZXIubGVuZ3RoKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUGFyYWdyYXBoKFN0cmluZ0J1ZmZlciBidWZmZXIsIFJlYWRlciBwYXJhZ3JhcGhSZWFkZXIpIHsKLQkJaWYgKHBhcmFncmFwaFJlYWRlciAhPSBudWxsKSB7Ci0JCQlIVE1MUHJpbnRlci5hZGRQYXJhZ3JhcGgoYnVmZmVyLCBIVE1MUHJpbnRlci5yZWFkKHBhcmFncmFwaFJlYWRlcikpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQYXJhZ3JhcGgoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHBhcmFncmFwaCkgewotCQlpZiAocGFyYWdyYXBoICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIjxwPiIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKHBhcmFncmFwaCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFNtYWxsSGVhZGVyKFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBoZWFkZXIpIHsKLQkJaWYgKGhlYWRlciAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCI8aDU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQoaGVhZGVyKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIjwvaDU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGVuZENvbG9yKFN0cmluZ0J1ZmZlciBidWZmZXIsIFJHQiByZ2IpIHsKLQkJYnVmZmVyLmFwcGVuZCgnIycpOwotCQlidWZmZXIuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcocmdiLnJlZCkpOwotCQlidWZmZXIuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcocmdiLmdyZWVuKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhyZ2IuYmx1ZSkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGVuZFN0eWxlU2hlZXRMaW5rKFN0cmluZ0J1ZmZlciBidWZmZXIsIFVSTCBzdHlsZVNoZWV0VVJMKSB7Ci0JCWlmIChzdHlsZVNoZWV0VVJMID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCI8aGVhZD4iKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCI8TElOSyBSRUw9XCJzdHlsZXNoZWV0XCIgSFJFRj0gXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKHN0eWxlU2hlZXRVUkwpOwotCQlidWZmZXIuYXBwZW5kKCJcIiBDSEFSU0VUPVwiSVNPLTg4NTktMVwiIFRZUEU9XCJ0ZXh0L2Nzc1wiPiIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIjwvaGVhZD4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9IVE1MQ29udGVudChTdHJpbmcgY29udGVudCkgewotCQljb250ZW50ID0gSFRNTFByaW50ZXIucmVwbGFjZShjb250ZW50LCAnJicsICImYW1wOyIpOyAvLyROT04tTkxTLTEkCi0JCWNvbnRlbnQgPSBIVE1MUHJpbnRlci5yZXBsYWNlKGNvbnRlbnQsICciJywgIiZxdW90OyIpOyAvLyROT04tTkxTLTEkCi0JCWNvbnRlbnQgPSBIVE1MUHJpbnRlci5yZXBsYWNlKGNvbnRlbnQsICc8JywgIiZsdDsiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gSFRNTFByaW50ZXIucmVwbGFjZShjb250ZW50LCAnPicsICImZ3Q7Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGVuZEJ1bGxldExpc3QoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlidWZmZXIuYXBwZW5kKCI8L3VsPiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgc3RhdGljIFJHQiBnZXRCZ0NvbG9yKCkgewotCQlpZiAoSFRNTFByaW50ZXIuQkdfQ09MT1JfUkdCICE9IG51bGwpIHsKLQkJCXJldHVybiBIVE1MUHJpbnRlci5CR19DT0xPUl9SR0I7Ci0JCX0KLQkJLy8gUkdCIHZhbHVlIG9mIGluZm8gYmcgY29sb3Igb24gV2luZG93c1hQCi0JCXJldHVybiBuZXcgUkdCKDI1NSwgMjU1LCAyMjUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0UGFnZVByb2xvZyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgcG9zaXRpb24pIHsKLQkJSFRNTFByaW50ZXIuaW5zZXJ0UGFnZVByb2xvZyhidWZmZXIsIHBvc2l0aW9uLCBIVE1MUHJpbnRlci5nZXRCZ0NvbG9yKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0UGFnZVByb2xvZyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgcG9zaXRpb24sIFJHQiBiZ1JHQikgewotCQlpZiAoYmdSR0IgPT0gbnVsbCkgewotCQkJSFRNTFByaW50ZXIuaW5zZXJ0UGFnZVByb2xvZyhidWZmZXIsIHBvc2l0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ0J1ZmZlciBwYWdlUHJvbG9nID0gbmV3IFN0cmluZ0J1ZmZlcig2MCk7Ci0JCQlwYWdlUHJvbG9nLmFwcGVuZCgiPGh0bWw+PGJvZHkgdGV4dD1cIiMwMDAwMDBcIiBiZ2NvbG9yPVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCUhUTUxQcmludGVyLmFwcGVuZENvbG9yKHBhZ2VQcm9sb2csIGJnUkdCKTsKLQkJCXBhZ2VQcm9sb2cuYXBwZW5kKCJcIj48Zm9udCBzaXplPS0xPiIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuaW5zZXJ0KHBvc2l0aW9uLCBwYWdlUHJvbG9nLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRQYWdlUHJvbG9nKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBwb3NpdGlvbiwgUkdCIGJnUkdCLCBVUkwgc3R5bGVTaGVldFVSTCkgewotCQlpZiAoYmdSR0IgPT0gbnVsbCkgewotCQkJSFRNTFByaW50ZXIuaW5zZXJ0UGFnZVByb2xvZyhidWZmZXIsIHBvc2l0aW9uLCBzdHlsZVNoZWV0VVJMKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ0J1ZmZlciBwYWdlUHJvbG9nID0gbmV3IFN0cmluZ0J1ZmZlcigzMDApOwotCQkJcGFnZVByb2xvZy5hcHBlbmQoIjxodG1sPiIpOyAvLyROT04tTkxTLTEkCi0JCQlIVE1MUHJpbnRlci5hcHBlbmRTdHlsZVNoZWV0TGluayhwYWdlUHJvbG9nLCBzdHlsZVNoZWV0VVJMKTsKLQkJCXBhZ2VQcm9sb2cuYXBwZW5kKCI8Ym9keSB0ZXh0PVwiIzAwMDAwMFwiIGJnY29sb3I9XCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJSFRNTFByaW50ZXIuYXBwZW5kQ29sb3IocGFnZVByb2xvZywgYmdSR0IpOwotCQkJcGFnZVByb2xvZy5hcHBlbmQoIlwiPjxmb250IHNpemU9LTE+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5pbnNlcnQocG9zaXRpb24sIHBhZ2VQcm9sb2cudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFBhZ2VQcm9sb2coU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IHBvc2l0aW9uLCBVUkwgc3R5bGVTaGVldFVSTCkgewotCQlIVE1MUHJpbnRlci5pbnNlcnRQYWdlUHJvbG9nKGJ1ZmZlciwgcG9zaXRpb24sIEhUTUxQcmludGVyLmdldEJnQ29sb3IoKSwgc3R5bGVTaGVldFVSTCk7Ci0JfQotCQotCXN0YXRpYyBTdHJpbmcgcmVhZChSZWFkZXIgcmQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclsyMDQ4XTsKLQkJdHJ5IHsKLQkJCWludCBuID0gcmQucmVhZChyZWFkQnVmZmVyKTsKLQkJCXdoaWxlIChuID4gMCkgewotCQkJCWJ1ZmZlci5hcHBlbmQocmVhZEJ1ZmZlciwgMCwgbik7Ci0JCQkJbiA9IHJkLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl9Ci0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCS8vIG5ldmVyIGV4cGVjdGVkCi0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCB4LmdldE1lc3NhZ2UoKSwgeCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyByZXBsYWNlKFN0cmluZyB0ZXh0LCBjaGFyIGMsIFN0cmluZyBzKSB7Ci0JCWludCBwcmV2aW91cyA9IDA7Ci0JCWludCBjdXJyZW50ID0gdGV4dC5pbmRleE9mKGMsIHByZXZpb3VzKTsKLQkJaWYgKGN1cnJlbnQgPT0gLTEpIHsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXdoaWxlIChjdXJyZW50ID4gLTEpIHsKLQkJCWJ1ZmZlci5hcHBlbmQodGV4dC5zdWJzdHJpbmcocHJldmlvdXMsIGN1cnJlbnQpKTsKLQkJCWJ1ZmZlci5hcHBlbmQocyk7Ci0JCQlwcmV2aW91cyA9IGN1cnJlbnQgKyAxOwotCQkJY3VycmVudCA9IHRleHQuaW5kZXhPZihjLCBwcmV2aW91cyk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhwcmV2aW91cykpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydEJ1bGxldExpc3QoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlidWZmZXIuYXBwZW5kKCI8dWw+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBIVE1MUHJpbnRlcigpIHsKLQkvLyBub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90YWdpbmZvL0pTRFRIb3ZlclByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90YWdpbmZvL0pTRFRIb3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWUxNjY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGFnaW5mby9KU0RUSG92ZXJQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0TW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuSlNkb2NDb250ZW50QWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLkphdmFTY3JpcHRFbGVtZW50TGFiZWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm8uQWJzdHJhY3RIb3ZlclByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVEhvdmVyUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RIb3ZlclByb2Nlc3NvciB7Ci0JLyoKLQkgKiBCdWxrIG9mIHRoZSB3b3JrIHdhcyBjb3BpZWQgZnJvbQotCSAqIG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnRleHQuamF2YS5ob3Zlci5KYXZhZG9jSG92ZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGxvbmcgTEFCRUxfRkxBR1MgPSBKYXZhU2NyaXB0RWxlbWVudExhYmVscy5BTExfRlVMTFlfUVVBTElGSUVEIHwgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuTV9QUkVfUkVUVVJOVFlQRSB8IEphdmFTY3JpcHRFbGVtZW50TGFiZWxzLk1fUEFSQU1FVEVSX1RZUEVTIHwgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuTV9QQVJBTUVURVJfTkFNRVMgfCBKYXZhU2NyaXB0RWxlbWVudExhYmVscy5NX0VYQ0VQVElPTlMgfCBKYXZhU2NyaXB0RWxlbWVudExhYmVscy5GX1BSRV9UWVBFX1NJR05BVFVSRSB8IEphdmFTY3JpcHRFbGVtZW50TGFiZWxzLk1fUFJFX1RZUEVfUEFSQU1FVEVSUyB8IEphdmFTY3JpcHRFbGVtZW50TGFiZWxzLlRfVFlQRV9QQVJBTUVURVJTIHwgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuVVNFX1JFU09MVkVEOwotCXByaXZhdGUgZmluYWwgbG9uZyBMT0NBTF9WQVJJQUJMRV9GTEFHUyA9IExBQkVMX0ZMQUdTICYgfkphdmFTY3JpcHRFbGVtZW50TGFiZWxzLkZfRlVMTFlfUVVBTElGSUVEIHwgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuRl9QT1NUX1FVQUxJRklFRDsKLQkKLQlwcml2YXRlIFN0cmluZyBnZXRIb3ZlckluZm8oSUphdmFTY3JpcHRFbGVtZW50W10gcmVzdWx0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBuUmVzdWx0cyA9IHJlc3VsdC5sZW5ndGg7Ci0JCWlmIChuUmVzdWx0cyA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoblJlc3VsdHMgPiAxKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJCUhUTUxQcmludGVyLnN0YXJ0QnVsbGV0TGlzdChidWZmZXIpOwotCQkJCUlKYXZhU2NyaXB0RWxlbWVudCBjdXJyID0gcmVzdWx0W2ldOwotCQkJCWlmIChjdXJyIGluc3RhbmNlb2YgSU1lbWJlciB8fCBjdXJyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LkxPQ0FMX1ZBUklBQkxFKSB7Ci0JCQkJCUhUTUxQcmludGVyLmFkZEJ1bGxldChidWZmZXIsIGdldEluZm9UZXh0KGN1cnIpKTsKLQkJCQl9Ci0JCQkJSFRNTFByaW50ZXIuZW5kQnVsbGV0TGlzdChidWZmZXIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJSUphdmFTY3JpcHRFbGVtZW50IGN1cnIgPSByZXN1bHRbMF07Ci0JCQlpZiAoY3VyciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlpZiAoY3VyciBpbnN0YW5jZW9mIElNZW1iZXIpIHsKLQkJCQlJTWVtYmVyIG1lbWJlciA9IChJTWVtYmVyKSBjdXJyOwotCQkJCUhUTUxQcmludGVyLmFkZFNtYWxsSGVhZGVyKGJ1ZmZlciwgZ2V0SW5mb1RleHQobWVtYmVyKSk7Ci0JCQkJUmVhZGVyIHJlYWRlcjsKLQkJCQl0cnkgewotCQkJCQlyZWFkZXIgPSBKU2RvY0NvbnRlbnRBY2Nlc3MuZ2V0SFRNTENvbnRlbnRSZWFkZXIobWVtYmVyLCB0cnVlLCB0cnVlKTsKLQkJCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgewotCQkJCQlIVE1MUHJpbnRlci5hZGRQYXJhZ3JhcGgoYnVmZmVyLCByZWFkZXIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY3Vyci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhU2NyaXB0RWxlbWVudC5MT0NBTF9WQVJJQUJMRSkgewotCQkJCUhUTUxQcmludGVyLmFkZFNtYWxsSGVhZGVyKGJ1ZmZlciwgZ2V0SW5mb1RleHQoY3VycikpOwotCQkJfQotCQl9Ci0JCWlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQlIVE1MUHJpbnRlci5pbnNlcnRQYWdlUHJvbG9nKGJ1ZmZlciwgMCk7Ci0JCQlIVE1MUHJpbnRlci5hZGRQYWdlRXBpbG9nKGJ1ZmZlcik7Ci0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVySW5mbyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG92ZXJJbmZvKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gaG92ZXJSZWdpb24pIHsKLQkJLy8gZ2V0IEpTUCB0cmFuc2xhdGlvbiBvYmplY3QgZm9yIHRoaXMgdmlld2VyJ3MgZG9jdW1lbnQKLQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZCh0ZXh0Vmlld2VyLmdldERvY3VtZW50KCkpOwotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQlKc1RyYW5zbGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKEpzVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlJSnNUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IGFkYXB0ZXIuZ2V0SnNUcmFuc2xhdGlvbih0cnVlKTsKLQkJCQkJSUphdmFTY3JpcHRFbGVtZW50W10gcmVzdWx0ID0gdHJhbnNsYXRpb24uZ2V0RWxlbWVudHNGcm9tSnNSYW5nZShob3ZlclJlZ2lvbi5nZXRPZmZzZXQoKSwgaG92ZXJSZWdpb24uZ2V0T2Zmc2V0KCkgKyBob3ZlclJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0vLyBWZWN0b3IgZmlsdGVyZWRSZXN1bHRzID0gbmV3IFZlY3RvcigpOwotLy8gTGlzdCBiYWRGdW5jdGlvbnMgPSB0cmFuc2xhdGlvbi5nZXRHZW5lcmF0ZWRGdW5jdGlvbk5hbWVzKCk7Ci0vLyBib29sZWFuIGJhZCA9IGZhbHNlOwotLy8gZm9yKGludCBpID0gMDtpPHJlc3VsdC5sZW5ndGg7aSsrKXsKLS8vIGJhZD1mYWxzZTsKLS8vIGlmKHJlc3VsdFtpXSBpbnN0YW5jZW9mIElGdW5jdGlvbil7Ci0vLyBmb3IoaW50IGo9MDtqPGJhZEZ1bmN0aW9ucy5zaXplKCkgJiYgISBiYWQ7aisrKXsKLS8vIGlmKCgoSUZ1bmN0aW9uKXJlc3VsdFtpXSkuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpYmFkRnVuY3Rpb25zLmdldChqKSkpewotLy8gYmFkPXRydWU7Ci0vLyBjb250aW51ZTsKLS8vIH0KLS8vIH0KLS8vIGlmKCFiYWQpZmlsdGVyZWRSZXN1bHRzLmFkZChyZXN1bHRbaV0pOwotLy8gfQotLy8gfQotLy8gaWYoZmlsdGVyZWRSZXN1bHRzLnNpemUoKTwxKSByZXR1cm4gbmV3IFN0cmluZygpOwotLy8JCQkJCQotLy8gU3RyaW5nIGZpbHRlcmVkUmVzdWx0ID0KLS8vIHRyYW5zbGF0aW9uLmZpeHVwTWFuZ2xlZE5hbWUoZ2V0SG92ZXJJbmZvKChJSmF2YVNjcmlwdEVsZW1lbnRbXSlmaWx0ZXJlZFJlc3VsdHMudG9BcnJheShuZXcKLS8vIElKYXZhU2NyaXB0RWxlbWVudFtde30pKSk7Ci0vLyBmb3IoaW50IGkgPSAwO2k8YmFkRnVuY3Rpb25zLnNpemUoKTtpKyspewotLy8gZmlsdGVyZWRSZXN1bHQucmVwbGFjZSgoU3RyaW5nKWJhZEZ1bmN0aW9ucy5nZXQoaSksICIiKTsKLS8vIH0KLS8vIHJldHVybiBmaWx0ZXJlZFJlc3VsdDsKLQkJCQkJcmV0dXJuIHRyYW5zbGF0aW9uLmZpeHVwTWFuZ2xlZE5hbWUoZ2V0SG92ZXJJbmZvKHJlc3VsdCkpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVyUmVnaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gSnNXb3JkRmluZGVyLmZpbmRXb3JkKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSwgb2Zmc2V0KTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5mb1RleHQoSUphdmFTY3JpcHRFbGVtZW50IG1lbWJlcikgewotCQlsb25nIGZsYWdzID0gbWVtYmVyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LkxPQ0FMX1ZBUklBQkxFID8gTE9DQUxfVkFSSUFCTEVfRkxBR1MgOiBMQUJFTF9GTEFHUzsKLQkJU3RyaW5nIGxhYmVsID0gSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuZ2V0RWxlbWVudExhYmVsKG1lbWJlciwgZmxhZ3MpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxhYmVsLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBsYWJlbC5jaGFyQXQoaSk7Ci0JCQlpZiAoY2ggPT0gJzwnKSB7Ci0JCQkJYnVmLmFwcGVuZCgiJmx0OyIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGNoID09ICc+JykgewotCQkJCWJ1Zi5hcHBlbmQoIiZndDsiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlidWYuYXBwZW5kKGNoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90YWdpbmZvL0pzV29yZEZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90YWdpbmZvL0pzV29yZEZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTMxMWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGFnaW5mby9Kc1dvcmRGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWNsYXNzIEpzV29yZEZpbmRlciB7Ci0JcHVibGljIHN0YXRpYyBJUmVnaW9uIGZpbmRXb3JkKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCQlpbnQgc3RhcnQgPSAtMTsKLQkJaW50IGVuZCA9IC0xOwotCQl0cnkgewotCQkJaW50IHBvcyA9IG9mZnNldDsKLQkJCWNoYXIgYzsKLQkJCXdoaWxlIChwb3MgPj0gMCkgewotCQkJCWMgPSBkb2N1bWVudC5nZXRDaGFyKHBvcyk7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJKYXZhV29yZEZpbmRlci5maW5kV29yZCgpIFRlc3QgamF2YSBjaGFyCi0JCQkJLy8gKC0tKToiICsgYyk7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS0tcG9zOwotCQkJfQotCQkJc3RhcnQgPSBwb3M7Ci0JCQlwb3MgPSBvZmZzZXQ7Ci0JCQlpbnQgbGVuZ3RoID0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCQl3aGlsZSAocG9zIDwgbGVuZ3RoKSB7Ci0JCQkJYyA9IGRvY3VtZW50LmdldENoYXIocG9zKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkphdmFXb3JkRmluZGVyLmZpbmRXb3JkKCkgVGVzdCBqYXZhIGNoYXIKLQkJCQkvLyAoKyspOiIgKyBjKTsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJKytwb3M7Ci0JCQl9Ci0JCQllbmQgPSBwb3M7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0OiIgKyBzdGFydCArICJFbmQ6IitlbmQpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJKYXZhV29yZEZpbmRlci5maW5kV29yZCgpIFJldHJpZXZlZCBqYXZhCi0JCQkvLyB0b2tlbiBvZjoiICsgZG9jdW1lbnQuZ2V0KHN0YXJ0LCBlbmQtc3RhcnQpICk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJfQotCQlpZiAoc3RhcnQgPiAtMSAmJiBlbmQgPiAtMSkgewotCQkJaWYgKHN0YXJ0ID09IG9mZnNldCAmJiBlbmQgPT0gb2Zmc2V0KSB7Ci0JCQkJcmV0dXJuIG5ldyBSZWdpb24ob2Zmc2V0LCAwKTsKLQkJCX0gZWxzZSBpZiAoc3RhcnQgPT0gb2Zmc2V0KSB7Ci0JCQkJcmV0dXJuIG5ldyBSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG5ldyBSZWdpb24oc3RhcnQgKyAxLCBlbmQgLSBzdGFydCAtIDEpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGV4dC9Kc0NoYXJhY3RlclBhaXJJbnNlcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzQ2hhcmFjdGVyUGFpckluc2VydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZDAyZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzQ2hhcmFjdGVyUGFpckluc2VydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuSUxpbmtlZE1vZGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5MaW5rZWRNb2RlVUkuRXhpdEZsYWdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5MaW5rZWRNb2RlVUkuSUV4aXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkuSmF2YVNjcmlwdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS50ZXh0LkphdmFIZXVyaXN0aWNTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnRleHQuU3ltYm9sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS50eXBpbmcuQWJzdHJhY3RDaGFyYWN0ZXJQYWlySW5zZXJ0ZXI7Ci0KLS8qKgotICogPHA+SW5zZXJ0cyBjaGFyYWN0ZXIgcGFpcnMgaW4gc2NyaXB0IHJlZ2lvbnMgaW4gSFRNTCBhbmQgSlNQIGRvY3VtZW50cyBiYXNlZCBvbiB0aGUgSmF2YXNjcmlwdAotICogY2hhcmFjdGVyIHBhaXJpbmcgcHJlZmVyZW5jZXMuPC9wPgotICovCi1wdWJsaWMgY2xhc3MgSnNDaGFyYWN0ZXJQYWlySW5zZXJ0ZXIgZXh0ZW5kcyBBYnN0cmFjdENoYXJhY3RlclBhaXJJbnNlcnRlciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyewotCi0JcHJpdmF0ZSBib29sZWFuIGZDbG9zZVN0cmluZ3M7Ci0JcHJpdmF0ZSBib29sZWFuIGZDbG9zZUJyYWNrZXRzOwotCXByaXZhdGUgYm9vbGVhbiBmQ2xvc2VCcmFjZXM7Ci0JcHJpdmF0ZSBib29sZWFuIGZDbG9zZUFuZ3VsYXJCcmFja2V0czsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudHlwaW5nLkFic3RyYWN0Q2hhcmFjdGVyUGFpckluc2VydGVyI2hhc1BhaXIoY2hhcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQYWlyKGNoYXIgYykgewotCQlzd2l0Y2ggKGMpIHsKLQkJCWNhc2UgJygnOgotCQkJY2FzZSAnPCc6Ci0JCQljYXNlICdbJzoKLQkJCWNhc2UgJ1wnJzoKLQkJCWNhc2UgJ1wiJzoKLQkJCWNhc2UgJ3snOgotCQkJCXJldHVybiB0cnVlOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnR5cGluZy5BYnN0cmFjdENoYXJhY3RlclBhaXJJbnNlcnRlciNzaG91bGRQYWlyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIsIGNoYXIpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkUGFpcihJU291cmNlVmlld2VyIHZpZXdlciwgY2hhciBjKSB7Ci0JCUlEb2N1bWVudCBkb2N1bWVudD0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0KLQkJZmluYWwgUG9pbnQgc2VsZWN0aW9uPSB2aWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpOwotCQlmaW5hbCBpbnQgb2Zmc2V0PSBzZWxlY3Rpb24ueDsKLQkJZmluYWwgaW50IGxlbmd0aD0gc2VsZWN0aW9uLnk7Ci0KLQkJdHJ5IHsKLQkJCUlSZWdpb24gc3RhcnRMaW5lPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChvZmZzZXQpOwotCQkJSVJlZ2lvbiBlbmRMaW5lPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChvZmZzZXQgKyBsZW5ndGgpOwotCi0JCQlKYXZhSGV1cmlzdGljU2Nhbm5lciBzY2FubmVyPSBuZXcgSmF2YUhldXJpc3RpY1NjYW5uZXIoZG9jdW1lbnQpOwotCQkJaW50IG5leHRUb2tlbj0gc2Nhbm5lci5uZXh0VG9rZW4ob2Zmc2V0ICsgbGVuZ3RoLCBlbmRMaW5lLmdldE9mZnNldCgpICsgZW5kTGluZS5nZXRMZW5ndGgoKSk7Ci0JCQlTdHJpbmcgbmV4dD0gbmV4dFRva2VuID09IFN5bWJvbHMuVG9rZW5FT0YgPyBudWxsIDogZG9jdW1lbnQuZ2V0KG9mZnNldCwgc2Nhbm5lci5nZXRQb3NpdGlvbigpIC0gb2Zmc2V0KS50cmltKCk7Ci0JCQlpbnQgcHJldlRva2VuPSBzY2FubmVyLnByZXZpb3VzVG9rZW4ob2Zmc2V0IC0gMSwgc3RhcnRMaW5lLmdldE9mZnNldCgpKTsKLQkJCWludCBwcmV2VG9rZW5PZmZzZXQ9IHNjYW5uZXIuZ2V0UG9zaXRpb24oKSArIDE7Ci0JCQlTdHJpbmcgcHJldmlvdXM9IHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuRU9GID8gbnVsbCA6IGRvY3VtZW50LmdldChwcmV2VG9rZW5PZmZzZXQsIG9mZnNldCAtIHByZXZUb2tlbk9mZnNldCkudHJpbSgpOwotCi0JCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICcoJzoKLQkJCQkJaWYgKCFmQ2xvc2VCcmFja2V0cwotCQkJCQkJCXx8IG5leHRUb2tlbiA9PSBTeW1ib2xzLlRva2VuTFBBUkVOCi0JCQkJCQkJfHwgbmV4dFRva2VuID09IFN5bWJvbHMuVG9rZW5JREVOVAotCQkJCQkJCXx8IG5leHQgIT0gbnVsbCAmJiBuZXh0Lmxlbmd0aCgpID4gMSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlICc8JzoKLQkJCQkJaWYgKCEoZkNsb3NlQW5ndWxhckJyYWNrZXRzICYmIGZDbG9zZUJyYWNrZXRzKQotCQkJCQkJCXx8IG5leHRUb2tlbiA9PSBTeW1ib2xzLlRva2VuTEVTU1RIQU4KLQkJCQkJCQl8fCAJCSAgIHByZXZUb2tlbiAhPSBTeW1ib2xzLlRva2VuTEJSQUNFCi0JCQkJCQkJCQkmJiBwcmV2VG9rZW4gIT0gU3ltYm9scy5Ub2tlblJCUkFDRQotCQkJCQkJCQkJJiYgcHJldlRva2VuICE9IFN5bWJvbHMuVG9rZW5TRU1JQ09MT04KLQkJCQkJCQkJCSYmIHByZXZUb2tlbiAhPSBTeW1ib2xzLlRva2VuU1lOQ0hST05JWkVECi0JCQkJCQkJCQkmJiBwcmV2VG9rZW4gIT0gU3ltYm9scy5Ub2tlblNUQVRJQwotCQkJCQkJCQkJJiYgKHByZXZUb2tlbiAhPSBTeW1ib2xzLlRva2VuSURFTlQgfHwgIWlzQW5ndWxhckludHJvZHVjZXIocHJldmlvdXMpKQotCQkJCQkJCQkJJiYgcHJldlRva2VuICE9IFN5bWJvbHMuVG9rZW5FT0YpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSAneyc6Ci0JCQkJCWlmICghZkNsb3NlQnJhY2VzCi0JCQkJCQkJfHwgbmV4dFRva2VuID09IFN5bWJvbHMuVG9rZW5JREVOVAotCQkJCQkJCXx8IG5leHQgIT0gbnVsbCAmJiBuZXh0Lmxlbmd0aCgpID4gMSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnWyc6Ci0JCQkJCWlmICghZkNsb3NlQnJhY2tldHMKLQkJCQkJCQl8fCBuZXh0VG9rZW4gPT0gU3ltYm9scy5Ub2tlbklERU5UCi0JCQkJCQkJfHwgbmV4dCAhPSBudWxsICYmIG5leHQubGVuZ3RoKCkgPiAxKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgJ1wnJzoKLQkJCQljYXNlICciJzoKLQkJCQkJaWYgKCFmQ2xvc2VTdHJpbmdzCi0JCQkJCQkJfHwgbmV4dFRva2VuID09IFN5bWJvbHMuVG9rZW5JREVOVAotCQkJCQkJCXx8IHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuSURFTlQKLQkJCQkJCQl8fCBuZXh0ICE9IG51bGwgJiYgbmV4dC5sZW5ndGgoKSA+IDEKLQkJCQkJCQl8fCBwcmV2aW91cyAhPSBudWxsICYmIHByZXZpb3VzLmxlbmd0aCgpID4gMSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS50eXBpbmcuQWJzdHJhY3RDaGFyYWN0ZXJQYWlySW5zZXJ0ZXIjZ2V0UGFpcihjaGFyKQotCSAqLwotCXByb3RlY3RlZCBjaGFyIGdldFBhaXIoY2hhciBjKSB7Ci0JCXN3aXRjaCAoYykgewotCQkJY2FzZSAnKCc6Ci0JCQkJcmV0dXJuICcpJzsKLQkJCWNhc2UgJzwnOgotCQkJCXJldHVybiAnPic7Ci0JCQljYXNlICdbJzoKLQkJCQlyZXR1cm4gJ10nOwotCQkJY2FzZSAneyc6Ci0JCQkJcmV0dXJuICd9JzsKLQkJCWNhc2UgJ1wnJzoKLQkJCQlyZXR1cm4gYzsKLQkJCWNhc2UgJ1wiJzoKLQkJCQlyZXR1cm4gYzsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPkluaXRpYWxpemUgdGhlIHByZWZlcmVuY2UgbGlzdGVuZXI8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnR5cGluZy5BYnN0cmFjdENoYXJhY3RlclBhaXJJbnNlcnRlciNpbml0aWFsaXplKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZVN0b3JlID0gSmF2YVNjcmlwdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXRoaXMuZkNsb3NlU3RyaW5ncyA9IHByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0NMT1NFX1NUUklOR1MpOwotCQl0aGlzLmZDbG9zZUJyYWNrZXRzID0gcHJlZmVyZW5jZVN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfQ0xPU0VfQlJBQ0tFVFMpOwotCQl0aGlzLmZDbG9zZUJyYWNlcyA9IHByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0NMT1NFX0JSQUNFUyk7Ci0JCXRoaXMuZkNsb3NlQW5ndWxhckJyYWNrZXRzID0gSmF2YVNjcmlwdENvcmUuVkVSU0lPTl8xXzUuY29tcGFyZVRvKAotCQkJCXByZWZlcmVuY2VTdG9yZS5nZXRTdHJpbmcoSmF2YVNjcmlwdENvcmUuQ09NUElMRVJfU09VUkNFKSkgPD0gMDsKLQkJcHJlZmVyZW5jZVN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIDxwPkRpc3Bvc2UgdGhlIHByZWZlcmVuY2UgbGlzdGVuZXI8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnR5cGluZy5BYnN0cmFjdENoYXJhY3RlclBhaXJJbnNlcnRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlKYXZhU2NyaXB0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9DTE9TRV9TVFJJTkdTLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKSl7Ci0JCQl0aGlzLmZDbG9zZVN0cmluZ3MgPSAoKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQl9IGVsc2UgaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0NMT1NFX0JSQUNLRVRTLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKSkgewotCQkJdGhpcy5mQ2xvc2VCcmFja2V0cyA9ICgoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0gZWxzZSBpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfQ0xPU0VfQlJBQ0VTLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKSkgewotCQkJdGhpcy5mQ2xvc2VCcmFjZXMgPSAoKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQl9IGVsc2UgaWYgKEphdmFTY3JpcHRDb3JlLkNPTVBJTEVSX1NPVVJDRS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoKSkpIHsKLQkJCUlQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZVN0b3JlID0gSmF2YVNjcmlwdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQl0aGlzLmZDbG9zZUFuZ3VsYXJCcmFja2V0cyA9IEphdmFTY3JpcHRDb3JlLlZFUlNJT05fMV81LmNvbXBhcmVUbyhwcmVmZXJlbmNlU3RvcmUuZ2V0U3RyaW5nKAotCQkJCQkJSmF2YVNjcmlwdENvcmUuQ09NUElMRVJfU09VUkNFKSkgPD0gMDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUT0RPOiBJQU46IGNvbW1lbnQgbWUKLQkgKiBAcGFyYW0gaWRlbnRpZmllcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNBbmd1bGFySW50cm9kdWNlcihTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gaWRlbnRpZmllci5sZW5ndGgoKSA+IDAKLQkJCQkmJiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGlkZW50aWZpZXIuY2hhckF0KDApKQotCQkJCQkJfHwgaWRlbnRpZmllci5zdGFydHNXaXRoKCJmaW5hbCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXx8IGlkZW50aWZpZXIuc3RhcnRzV2l0aCgicHVibGljIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJfHwgaWRlbnRpZmllci5zdGFydHNXaXRoKCJwdWJsaWMiKSAvLyROT04tTkxTLTEkCi0JCQkJCQl8fCBpZGVudGlmaWVyLnN0YXJ0c1dpdGgoInByb3RlY3RlZCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXx8IGlkZW50aWZpZXIuc3RhcnRzV2l0aCgicHJpdmF0ZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudHlwaW5nLkFic3RyYWN0Q2hhcmFjdGVyUGFpckluc2VydGVyI2dldEV4aXRQb2xpY3koY2hhciwgY2hhciwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHJvdGVjdGVkIElFeGl0UG9saWN5IGdldEV4aXRQb2xpY3koY2hhciBleGl0LCBjaGFyIGVzY2FwZSwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXJldHVybiBuZXcgRXhpdFBvbGljeShleGl0LCBlc2NhcGUsIGRvY3VtZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+QW4gZXhpdCBwb2xpY3kgdGhhdCBkZWFscyB3aXRoIGEgdXNlciBhZGRpbmcgYSBjYXJyaWFnZSByZXR1cm4gYmV0d2VlbiB7fS4KLQkgKiBJbiB0aGF0IGNhc2UgcmF0aGVyIHRoZW4gZXhpdGluZyB0byB0aGUgZXhpdCBwb3NpdGlvbiB0aGUgbGlua2VkIG1vZGUgaXMgZXhpdGVkCi0JICogYW5kIHRoZSBjYXJyaWFnZSByZXR1cm4gaW5zZXJ0ZWQuPC9wPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIEV4aXRQb2xpY3kgaW1wbGVtZW50cyBJRXhpdFBvbGljeSB7Ci0KLQkJLyoqIGV4aXQgY2hhcmFjdGVyICovCi0JCXByaXZhdGUgY2hhciBmRXhpdDsKLQkJCi0JCS8qKiBlc2NhcGUgY2hhcmFjdGVyIGZvciB0aGUgZXhpdCBjaGFyYWN0ZXIgKi8KLQkJcHJpdmF0ZSBjaGFyIGZFc2NhcGU7Ci0JCQotCQkvKiogZG9jdW1lbnQgdG8gZXhlY3V0ZSB0aGlzIGV4aXQgcG9saWN5IG9uICovCi0JCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQotCQkvKioKLQkJICogPHA+RGVmYXVsdCBjb25zdHJ1Y3RvcjwvcD4KLQkJICogCi0JCSAqIEBwYXJhbSBleGl0IGV4aXQgY2hhcmFjdGVyCi0JCSAqIEBwYXJhbSBlc2NhcGUgZXNjYXBlIGNoYXJhY3RlciBmb3IgdGhlIGV4aXQgY2hhcmFjdGVyCi0JCSAqIEBwYXJhbSBkb2N1bWVudCBkb2N1bWVudCB0byBleGVjdXRlIHRoaXMgZXhpdCBwb2xpY3kgb24KLQkJICovCi0JCXB1YmxpYyBFeGl0UG9saWN5KGNoYXIgZXhpdCwgY2hhciBlc2NhcGUsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQkJZkV4aXQgPSBleGl0OwotCQkJZkVzY2FwZSA9IGVzY2FwZTsKLQkJCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVVSS5JRXhpdFBvbGljeSNkb0V4aXQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVNb2RlbCwgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudCwgaW50LCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgRXhpdEZsYWdzIGRvRXhpdChMaW5rZWRNb2RlTW9kZWwgbW9kZWwsIFZlcmlmeUV2ZW50IGV2ZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCQlpZighaXNNYXNrZWQob2Zmc2V0KSkgewotCQkJCS8vIGlmIGV4aXQgY2hhcmFjdGVyIHRoZW4gZXhpdCB0byBleGl0IGxvY2F0aW9uCi0JCQkJaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBmRXhpdCkgewotCQkJCQlyZXR1cm4gbmV3IEV4aXRGbGFncyhJTGlua2VkTW9kZUxpc3RlbmVyLlVQREFURV9DQVJFVCwgZmFsc2UpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBpZiBjYXJyaWFnZSByZXR1cm4gYW5kIHByZXZpb3VzIGNoYXJhY3RlciBpcyB7IHRoZW4gZXhpdCBsaW5rZWQgbW9kZSBhbmQgaW5zZXJ0IHJldHVybgotCQkJCWlmIChldmVudC5jaGFyYWN0ZXIgPT0gU1dULkNSICYmIG9mZnNldCA+IDApIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmICh0aGlzLmZEb2N1bWVudC5nZXRDaGFyKG9mZnNldCAtIDEpID09ICd7JykgewotCQkJCQkJCXJldHVybiBuZXcgRXhpdEZsYWdzKElMaW5rZWRNb2RlTGlzdGVuZXIuRVhJVF9BTEwsIHRydWUpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFcnJvciB3aGlsZSB0cnlpbmcgdG8gZXhpdCBsaW5rZWQgbW9kZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiA8cD5EZXRlcm1pbmUgaWYgdGhlIGV4aXQgY2hhcmFjdGVyIGhhcyBiZWVuIGVzY2FwZWQuPHA+Ci0JCSAqIAotCQkgKiBAcGFyYW0gb2Zmc2V0IGN1cnJlbnQgb2Zmc2V0IGluIHRoZSBkb2N1bWVudAotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGV4aXQgY2hhcmFjdGVyIGVzY2FwZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBpc01hc2tlZChpbnQgb2Zmc2V0KSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmRXNjYXBlID09IGZEb2N1bWVudC5nZXRDaGFyKG9mZnNldCAtIDEpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzQ29kZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzQ29kZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTkzN2QwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGV4dC9Kc0NvZGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmRlcml2ZWQuU2luZ2xlQ2hhclJlYWRlcjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWNsYXNzIEpzQ29kZVJlYWRlciBleHRlbmRzIFNpbmdsZUNoYXJSZWFkZXIgewotCS8qKiBUaGUgRU9GIGNoYXJhY3RlciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVPRiA9IC0xOwotCXByaXZhdGUgaW50IGZDYWNoZWRMaW5lTnVtYmVyID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZkNhY2hlZExpbmVPZmZzZXQgPSAtMTsKLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBpbnQgZkVuZCA9IC0xOwotCXByaXZhdGUgYm9vbGVhbiBmRm9yd2FyZCA9IGZhbHNlOwotCXByaXZhdGUgaW50IGZPZmZzZXQ7Ci0JcHJpdmF0ZSBib29sZWFuIGZTa2lwQ29tbWVudHMgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZlNraXBTdHJpbmdzID0gZmFsc2U7Ci0JCi0JcHVibGljIEpzQ29kZVJlYWRlcigpIHt9Ci0JCi0JLyoKLQkgKiBAc2VlIFJlYWRlciNjbG9zZSgpCi0JICovCi0JCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmRG9jdW1lbnQgPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjb25maWd1cmVCYWNrd2FyZFJlYWRlcihJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGJvb2xlYW4gc2tpcENvbW1lbnRzLCBib29sZWFuIHNraXBTdHJpbmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQkJZlNraXBDb21tZW50cyA9IHNraXBDb21tZW50czsKLQkJZlNraXBTdHJpbmdzID0gc2tpcFN0cmluZ3M7Ci0JCWZGb3J3YXJkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlmQ2FjaGVkTGluZU51bWJlciA9IGZEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZk9mZnNldCk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbih4LmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgY29uZmlndXJlRm9yd2FyZFJlYWRlcihJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gc2tpcENvbW1lbnRzLCBib29sZWFuIHNraXBTdHJpbmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQkJZlNraXBDb21tZW50cyA9IHNraXBDb21tZW50czsKLQkJZlNraXBTdHJpbmdzID0gc2tpcFN0cmluZ3M7Ci0JCWZGb3J3YXJkID0gdHJ1ZTsKLQkJZkVuZCA9IE1hdGgubWluKGZEb2N1bWVudC5nZXRMZW5ndGgoKSwgZk9mZnNldCArIGxlbmd0aCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgbGFzdCByZWFkIGNoYXJhY3Rlci4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkCi0JICogYWZ0ZXIgcmVhZCBoYXMgYmVlbiBjYWxsZWQuCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRm9yd2FyZCA/IGZPZmZzZXQgLSAxIDogZk9mZnNldDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdvdG9Db21tZW50RW5kKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKGZPZmZzZXQgPCBmRW5kKSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KyspOwotCQkJaWYgKGN1cnJlbnQgPT0gJyonKSB7Ci0JCQkJaWYgKGZPZmZzZXQgPCBmRW5kICYmIGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpID09ICcvJykgewotCQkJCQkrK2ZPZmZzZXQ7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdvdG9Db21tZW50U3RhcnQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoMCA8IGZPZmZzZXQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQtLSk7Ci0JCQlpZiAoY3VycmVudCA9PSAnKicgJiYgMCA8PSBmT2Zmc2V0ICYmIGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpID09ICcvJykgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ290b0xpbmVFbmQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlpbnQgbGluZSA9IGZEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZk9mZnNldCk7Ci0JCWZPZmZzZXQgPSBmRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lICsgMSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBnb3RvU3RyaW5nRW5kKGNoYXIgZGVsaW1pdGVyKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoZk9mZnNldCA8IGZFbmQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQrKyk7Ci0JCQlpZiAoY3VycmVudCA9PSAnXFwnKSB7Ci0JCQkJLy8gaWdub3JlIGVzY2FwZWQgY2hhcmFjdGVycwotCQkJCSsrZk9mZnNldDsKLQkJCX0gZWxzZSBpZiAoY3VycmVudCA9PSBkZWxpbWl0ZXIpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdvdG9TdHJpbmdTdGFydChjaGFyIGRlbGltaXRlcikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKDAgPCBmT2Zmc2V0KSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KTsKLQkJCWlmIChjdXJyZW50ID09IGRlbGltaXRlcikgewotCQkJCWlmICghKDAgPD0gZk9mZnNldCAmJiBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0IC0gMSkgPT0gJ1xcJykpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCS0tZk9mZnNldDsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlU2luZ2xlTGluZUNvbW1lbnQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlpbnQgbGluZSA9IGZEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZk9mZnNldCk7Ci0JCWlmIChsaW5lIDwgZkNhY2hlZExpbmVOdW1iZXIpIHsKLQkJCWZDYWNoZWRMaW5lTnVtYmVyID0gbGluZTsKLQkJCWZDYWNoZWRMaW5lT2Zmc2V0ID0gZkRvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSk7Ci0JCQlpbnQgb2Zmc2V0ID0gZk9mZnNldDsKLQkJCXdoaWxlIChmQ2FjaGVkTGluZU9mZnNldCA8IG9mZnNldCkgewotCQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKG9mZnNldC0tKTsKLQkJCQlpZiAoY3VycmVudCA9PSAnLycgJiYgZkNhY2hlZExpbmVPZmZzZXQgPD0gb2Zmc2V0ICYmIGZEb2N1bWVudC5nZXRDaGFyKG9mZnNldCkgPT0gJy8nKSB7Ci0JCQkJCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIFNpbmdsZUNoYXJSZWFkZXIjcmVhZCgpCi0JICovCi0JCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmRm9yd2FyZCA/IHJlYWRGb3J3YXJkcygpIDogcmVhZEJhY2t3YXJkcygpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oeC5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgaW50IHJlYWRCYWNrd2FyZHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoMCA8IGZPZmZzZXQpIHsKLQkJCS0tZk9mZnNldDsKLQkJCWhhbmRsZVNpbmdsZUxpbmVDb21tZW50KCk7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KTsKLQkJCXN3aXRjaCAoY3VycmVudCkgewotCQkJCWNhc2UgJy8nOgotCQkJCQlpZiAoZlNraXBDb21tZW50cyAmJiBmT2Zmc2V0ID4gMSkgewotCQkJCQkJY2hhciBuZXh0ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCAtIDEpOwotCQkJCQkJaWYgKG5leHQgPT0gJyonKSB7Ci0JCQkJCQkJLy8gYSBjb21tZW50IGVuZHMsIGFkdmFuY2UgdG8gdGhlIGNvbW1lbnQgc3RhcnQKLQkJCQkJCQlmT2Zmc2V0IC09IDI7Ci0JCQkJCQkJZ290b0NvbW1lbnRTdGFydCgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBjdXJyZW50OwotCQkJCWNhc2UgJyInOgotCQkJCWNhc2UgJ1wnJzoKLQkJCQkJaWYgKGZTa2lwU3RyaW5ncykgewotCQkJCQkJLS1mT2Zmc2V0OwotCQkJCQkJZ290b1N0cmluZ1N0YXJ0KGN1cnJlbnQpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCQl9Ci0JCQlyZXR1cm4gY3VycmVudDsKLQkJfQotCQlyZXR1cm4gSnNDb2RlUmVhZGVyLkVPRjsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgcmVhZEZvcndhcmRzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKGZPZmZzZXQgPCBmRW5kKSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KyspOwotCQkJc3dpdGNoIChjdXJyZW50KSB7Ci0JCQkJY2FzZSAnLyc6Ci0JCQkJCWlmIChmU2tpcENvbW1lbnRzICYmIGZPZmZzZXQgPCBmRW5kKSB7Ci0JCQkJCQljaGFyIG5leHQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KTsKLQkJCQkJCWlmIChuZXh0ID09ICcqJykgewotCQkJCQkJCS8vIGEgY29tbWVudCBzdGFydHMsIGFkdmFuY2UgdG8gdGhlIGNvbW1lbnQgZW5kCi0JCQkJCQkJKytmT2Zmc2V0OwotCQkJCQkJCWdvdG9Db21tZW50RW5kKCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9IGVsc2UgaWYgKG5leHQgPT0gJy8nKSB7Ci0JCQkJCQkJLy8gJy8vJy1jb21tZW50IHN0YXJ0cywgYWR2YW5jZSB0byB0aGUgbGluZSBlbmQKLQkJCQkJCQlnb3RvTGluZUVuZCgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBjdXJyZW50OwotCQkJCWNhc2UgJyInOgotCQkJCWNhc2UgJ1wnJzoKLQkJCQkJaWYgKGZTa2lwU3RyaW5ncykgewotCQkJCQkJZ290b1N0cmluZ0VuZChjdXJyZW50KTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCXJldHVybiBjdXJyZW50OwotCQkJfQotCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCX0KLQkJcmV0dXJuIEpzQ29kZVJlYWRlci5FT0Y7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmMxMGQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGV4dC9Kc0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRleHQuRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgZXh0ZW5kcyBEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGNoYXJbXSBCUkFDS0VUUyA9IHsgJ3snLCAnfScsICcoJywgJyknLCAnWycsICddJyB9OwotCQotCS8qKgotCSAqIEBwYXJhbSB2YWxpZENvbnRleHRzCi0JICogQHBhcmFtIG5leHRNYXRjaGVyCi0JICovCi0JcHVibGljIEpzRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcigpIHsKLQkJc3VwZXIobmV3IFN0cmluZ1tdIHsgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUsIERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCwgRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCwgRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTiwKLQkJCQlET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5UIH0sIG5ldyBKc1BhaXJNYXRjaGVyKEpzRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5CUkFDS0VUUykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGV4dC9Kc1BhaXJNYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RleHQvSnNQYWlyTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk2NWEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGV4dC9Kc1BhaXJNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXI7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1jbGFzcyBKc1BhaXJNYXRjaGVyIGltcGxlbWVudHMgSUNoYXJhY3RlclBhaXJNYXRjaGVyIHsKLQlwcm90ZWN0ZWQgaW50IGZBbmNob3I7Ci0JcHJvdGVjdGVkIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJvdGVjdGVkIGludCBmRW5kUG9zOwotCXByb3RlY3RlZCBpbnQgZk9mZnNldDsKLQlwcm90ZWN0ZWQgY2hhcltdIGZQYWlyczsKLQlwcm90ZWN0ZWQgSnNDb2RlUmVhZGVyIGZSZWFkZXIgPSBuZXcgSnNDb2RlUmVhZGVyKCk7Ci0JcHJvdGVjdGVkIGludCBmU3RhcnRQb3M7Ci0JCi0JcHVibGljIEpzUGFpck1hdGNoZXIoY2hhcltdIHBhaXJzKSB7Ci0JCWZQYWlycyA9IHBhaXJzOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2NsZWFyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKGZSZWFkZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmUmVhZGVyLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY2xlYXIoKTsKLQkJZkRvY3VtZW50ID0gbnVsbDsKLQkJZlJlYWRlciA9IG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2dldEFuY2hvcigpCi0JICovCi0JcHVibGljIGludCBnZXRBbmNob3IoKSB7Ci0JCXJldHVybiBmQW5jaG9yOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNtYXRjaChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBtYXRjaChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQkJaWYgKGZPZmZzZXQgPCAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsICYmIG1hdGNoUGFpcnNBdCgpICYmIGZTdGFydFBvcyAhPSBmRW5kUG9zKSB7Ci0JCQlyZXR1cm4gbmV3IFJlZ2lvbihmU3RhcnRQb3MsIGZFbmRQb3MgLSBmU3RhcnRQb3MgKyAxKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hQYWlyc0F0KCkgewotCQlpbnQgaTsKLQkJaW50IHBhaXJJbmRleDEgPSBmUGFpcnMubGVuZ3RoOwotCQlpbnQgcGFpckluZGV4MiA9IGZQYWlycy5sZW5ndGg7Ci0JCWZTdGFydFBvcyA9IC0xOwotCQlmRW5kUG9zID0gLTE7Ci0JCS8vIGdldCB0aGUgY2hhcnMgcHJlY2VkaW5nIGFuZCBmb2xsb3dpbmcgdGhlIHN0YXJ0IHBvc2l0aW9uCi0JCXRyeSB7Ci0JCQljaGFyIHByZXZDaGFyID0gZkRvY3VtZW50LmdldENoYXIoTWF0aC5tYXgoZk9mZnNldCAtIDEsIDApKTsKLQkJCS8vIG1vZGlmaWVkIGJlaGF2aW9yIGZvcgotCQkJLy8gaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjg3OQotCQkJLy8gY2hhciBuZXh0Q2hhcj0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCk7Ci0JCQkvLyBzZWFyY2ggZm9yIG9wZW5pbmcgcGVlciBjaGFyYWN0ZXIgbmV4dCB0byB0aGUgYWN0aXZhdGlvbiBwb2ludAotCQkJZm9yIChpID0gMDsgaSA8IGZQYWlycy5sZW5ndGg7IGkgPSBpICsgMikgewotCQkJCS8vIGlmIChuZXh0Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkvLyBmU3RhcnRQb3M9IGZPZmZzZXQ7Ci0JCQkJLy8gcGFpckluZGV4MT0gaTsKLQkJCQkvLyB9IGVsc2UKLQkJCQlpZiAocHJldkNoYXIgPT0gZlBhaXJzW2ldKSB7Ci0JCQkJCWZTdGFydFBvcyA9IGZPZmZzZXQgLSAxOwotCQkJCQlwYWlySW5kZXgxID0gaTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBzZWFyY2ggZm9yIGNsb3NpbmcgcGVlciBjaGFyYWN0ZXIgbmV4dCB0byB0aGUgYWN0aXZhdGlvbiBwb2ludAotCQkJZm9yIChpID0gMTsgaSA8IGZQYWlycy5sZW5ndGg7IGkgPSBpICsgMikgewotCQkJCWlmIChwcmV2Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkJZkVuZFBvcyA9IGZPZmZzZXQgLSAxOwotCQkJCQlwYWlySW5kZXgyID0gaTsKLQkJCQl9Ci0JCQkJLy8gZWxzZSBpZiAobmV4dENoYXIgPT0gZlBhaXJzW2ldKSB7Ci0JCQkJLy8gZkVuZFBvcz0gZk9mZnNldDsKLQkJCQkvLyBwYWlySW5kZXgyPSBpOwotCQkJCS8vIH0KLQkJCX0KLQkJCWlmIChmRW5kUG9zID4gLTEpIHsKLQkJCQlmQW5jaG9yID0gSUNoYXJhY3RlclBhaXJNYXRjaGVyLlJJR0hUOwotCQkJCWZTdGFydFBvcyA9IHNlYXJjaEZvck9wZW5pbmdQZWVyKGZFbmRQb3MsIGZQYWlyc1twYWlySW5kZXgyIC0gMV0sIGZQYWlyc1twYWlySW5kZXgyXSwgZkRvY3VtZW50KTsKLQkJCQlpZiAoZlN0YXJ0UG9zID4gLTEpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZkVuZFBvcyA9IC0xOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZlN0YXJ0UG9zID4gLTEpIHsKLQkJCQlmQW5jaG9yID0gSUNoYXJhY3RlclBhaXJNYXRjaGVyLkxFRlQ7Ci0JCQkJZkVuZFBvcyA9IHNlYXJjaEZvckNsb3NpbmdQZWVyKGZTdGFydFBvcywgZlBhaXJzW3BhaXJJbmRleDFdLCBmUGFpcnNbcGFpckluZGV4MSArIDFdLCBmRG9jdW1lbnQpOwotCQkJCWlmIChmRW5kUG9zID4gLTEpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZlN0YXJ0UG9zID0gLTE7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgc2VhcmNoRm9yQ2xvc2luZ1BlZXIoaW50IG9mZnNldCwgaW50IG9wZW5pbmdQZWVyLCBpbnQgY2xvc2luZ1BlZXIsIElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZlJlYWRlci5jb25maWd1cmVGb3J3YXJkUmVhZGVyKGRvY3VtZW50LCBvZmZzZXQgKyAxLCBkb2N1bWVudC5nZXRMZW5ndGgoKSwgdHJ1ZSwgdHJ1ZSk7Ci0JCWludCBzdGFjayA9IDE7Ci0JCWludCBjID0gZlJlYWRlci5yZWFkKCk7Ci0JCXdoaWxlIChjICE9IEpzQ29kZVJlYWRlci5FT0YpIHsKLQkJCWlmIChjID09IG9wZW5pbmdQZWVyICYmIGMgIT0gY2xvc2luZ1BlZXIpIHsKLQkJCQlzdGFjaysrOwotCQkJfSBlbHNlIGlmIChjID09IGNsb3NpbmdQZWVyKSB7Ci0JCQkJc3RhY2stLTsKLQkJCX0KLQkJCWlmIChzdGFjayA9PSAwKSB7Ci0JCQkJcmV0dXJuIGZSZWFkZXIuZ2V0T2Zmc2V0KCk7Ci0JCQl9Ci0JCQljID0gZlJlYWRlci5yZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IHNlYXJjaEZvck9wZW5pbmdQZWVyKGludCBvZmZzZXQsIGludCBvcGVuaW5nUGVlciwgaW50IGNsb3NpbmdQZWVyLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZSZWFkZXIuY29uZmlndXJlQmFja3dhcmRSZWFkZXIoZG9jdW1lbnQsIG9mZnNldCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWludCBzdGFjayA9IDE7Ci0JCWludCBjID0gZlJlYWRlci5yZWFkKCk7Ci0JCXdoaWxlIChjICE9IEpzQ29kZVJlYWRlci5FT0YpIHsKLQkJCWlmIChjID09IGNsb3NpbmdQZWVyICYmIGMgIT0gb3BlbmluZ1BlZXIpIHsKLQkJCQlzdGFjaysrOwotCQkJfSBlbHNlIGlmIChjID09IG9wZW5pbmdQZWVyKSB7Ci0JCQkJc3RhY2stLTsKLQkJCX0KLQkJCWlmIChzdGFjayA9PSAwKSB7Ci0JCQkJcmV0dXJuIGZSZWFkZXIuZ2V0T2Zmc2V0KCk7Ci0JCQl9Ci0JCQljID0gZlJlYWRlci5yZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNjFjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplci4wPVdlYiBQcm9qZWN0IHN1cHBvcnQgZm9yIEpTRFQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvcmluby5qcGcgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3Jpbm8uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWE2YWY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvcmluby5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0lKYXZhV2ViTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9JSmF2YVdlYk5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5OTE4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0lKYXZhV2ViTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFXZWJOb2RlIHsKLQlwdWJsaWMgSUphdmFTY3JpcHRFbGVtZW50IGdldEphdmFFbGVtZW50KCk7Ci0JCi0JcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZSgpOwotCQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpOwotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckpTRFQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JKU0RULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZmE5NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckpTRFQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLnByb3Zpc2lvbmFsLmNvbnRlbnRvdXRsaW5lLkpzQ29udGVudE91dGxpbmVDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3Rvcnk7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySlNEVCBleHRlbmRzIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JKU0RUKCkgewotCQl0aGlzKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySlNEVChPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQkKLQkKLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySlNEVChnZXRBZGFwdGVyS2V5KCksIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciBub2RlKSB7Ci0JCWlmIChzaW5nbGV0b25BZGFwdGVyID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSB0aGUgSkZhY2VOb2RlQWRhcHRlcgotCQkJLy8gc2luZ2xldG9uQWRhcHRlciA9IG5ldyBKRmFjZU5vZGVBZGFwdGVyRm9ySlNEVCh0aGlzKTsKLQkJCWlmIChKc0NvbnRlbnRPdXRsaW5lQ29uZmlnLlVTRV9BRFZBTkNFRCkgewotCQkJCXNpbmdsZXRvbkFkYXB0ZXIgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLnByb3Zpc2lvbmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGb3JKcyh0aGlzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2luZ2xldG9uQWRhcHRlciA9IG5ldyBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZvckpzKHRoaXMpOwotCQkJfQotCQkJaW5pdEFkYXB0ZXIoc2luZ2xldG9uQWRhcHRlciwgbm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHNpbmdsZXRvbkFkYXB0ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRm9ySnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZvckpzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NmVmNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRm9ySnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIGJ1ZzoyNDQ4MzkgLSBldWdlbmVAZ2VudWl0ZWMuY29tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklTb3VyY2VSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklTb3VyY2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLkphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuU291cmNlUmVmRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5KYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuU3RhbmRhcmRKYXZhU2NyaXB0RWxlbWVudENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKRmFjZU5vZGVBZGFwdGVyRm9ySnMgZXh0ZW5kcyBKRmFjZU5vZGVBZGFwdGVyRm9ySFRNTCB7Ci0JCi0JcHVibGljIEpGYWNlTm9kZUFkYXB0ZXJGb3JKcyhKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCXByaXZhdGUgSUphdmFTY3JpcHRVbml0IGxhenlDdTsKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQlwcml2YXRlIEphdmFTY3JpcHRFbGVtZW50TGFiZWxQcm92aWRlciBqYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50UHJvdmlkZXIoKS5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJSmF2YVdlYk5vZGUpIHsKLQkJCUphdmFFbGVtZW50IGVuY2xvc2VkRWxlbWVudCA9IChKYXZhRWxlbWVudCkgKChJSmF2YVdlYk5vZGUpIG9iamVjdCkuZ2V0SmF2YUVsZW1lbnQoKTsKLQkJCWlmIChlbmNsb3NlZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUlKYXZhU2NyaXB0RWxlbWVudFtdIGNoaWxkcmVuID0gZW5jbG9zZWRFbGVtZW50LmdldENoaWxkcmVuKCk7Ci0JCQkJCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IElKYXZhU2NyaXB0RWxlbWVudFswXTsKLQkJCQkJfQotCQkJCQlPYmplY3RbXSBub2RlcyA9IG5ldyBPYmplY3RbY2hpbGRyZW4ubGVuZ3RoXTsKLQkJCQkJTm9kZSBwYXJlbnQgPSAoKElKYXZhV2ViTm9kZSkgb2JqZWN0KS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCS8vCWludCBodG1sbGVuZ3RoID0gKChTb3VyY2VSZWZFbGVtZW50KSAoY2hpbGRyZW5baV0pKS5nZXRTb3VyY2VSYW5nZSgpLmdldExlbmd0aCgpOwotCQkJCQkvLwlpbnQgaHRtbG9mZnNldCA9ICgoU291cmNlUmVmRWxlbWVudCkgKGNoaWxkcmVuW2ldKSkuZ2V0U291cmNlUmFuZ2UoKS5nZXRPZmZzZXQoKTsKLQkJCQkJCUlKYXZhU2NyaXB0RWxlbWVudCBqYXZhRWxlbWVudCA9IGNoaWxkcmVuW2ldOwotCQkJCQkJSVNvdXJjZVJhbmdlIHJhbmdlID0gbnVsbDsKLQkJCQkJCWlmIChqYXZhRWxlbWVudCBpbnN0YW5jZW9mIE1lbWJlcikgewotCQkJCQkJCQlyYW5nZSA9ICgoSU1lbWJlcikgamF2YUVsZW1lbnQpLmdldE5hbWVSYW5nZSgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmFuZ2UgPSAoKElTb3VyY2VSZWZlcmVuY2UpIGphdmFFbGVtZW50KS5nZXRTb3VyY2VSYW5nZSgpOwotCQkJCQkJfQotCQkJCQkJaW50IGh0bWxsZW5ndGggPSByYW5nZS5nZXRMZW5ndGgoKTsKLQkJCQkJCWludCBodG1sb2Zmc2V0ID0gcmFuZ2UuZ2V0T2Zmc2V0KCk7Ci0KLQkJCQkJCQotCQkJCQkJUG9zaXRpb24gcG9zaXRpb24gPSBuZXcgUG9zaXRpb24oaHRtbG9mZnNldCwgaHRtbGxlbmd0aCk7Ci0JCQkJCQlub2Rlc1tpXSA9IGdldEpzTm9kZShwYXJlbnQsIGphdmFFbGVtZW50LCBwb3NpdGlvbik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG5vZGVzOwotCQkJCX0gY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJCX0KLQkJCX0KLQkJfQotCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQlpZiAoaXNKU0VsZW1lbnRQYXJlbnQobm9kZSkpIHsKLQkJCU9iamVjdFtdIHJlc3VsdHMgPSBnZXRKU0VsZW1lbnRzRnJvbU5vZGUobm9kZS5nZXRGaXJzdENoaWxkKCksIHRydWUpOwotCQkJCi0JCQkKLQkJCXJldHVybiBmaWx0ZXIoIHJlc3VsdHMgKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0JCi0JLyoKLQkgKiBAR0lOTzogQW5vbnltb3VzIC0tIG1hdGNoZXMgYW5vbnltb3VzIHR5cGVzIG9uIHRoZSB0b3AgbGV2ZWwKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBlbGVtZW50T2JqKSB7Ci0JCQotCQlpZiggZWxlbWVudE9iaiBpbnN0YW5jZW9mIElKYXZhV2ViTm9kZSApewotCQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQgPSAoKElKYXZhV2ViTm9kZSllbGVtZW50T2JqKS5nZXRKYXZhRWxlbWVudCgpOwotCQkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YVNjcmlwdEVsZW1lbnQuVFlQRSAmJiBlbGVtZW50LmdldFBhcmVudCgpLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LkpBVkFTQ1JJUFRfVU5JVCApIHsKLQkJCQkKLQkJCQlJVHlwZSB0eXBlID0gKElUeXBlKWVsZW1lbnQ7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIHR5cGUuaXNBbm9ueW1vdXMoKTsKLQkJCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAR0lOTzogQW5vbnltb3VzIEZpbHRlciBmcm9tIHRvcCBsZXZlbAotCSAqCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIGZpbHRlcihPYmplY3RbXSBjaGlsZHJlbikgewotCQlib29sZWFuIGluaXRpYWxpemVycz0gZmFsc2U7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJaWYgKG1hdGNoZXMoY2hpbGRyZW5baV0pKSB7Ci0JCQkJaW5pdGlhbGl6ZXJzPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFpbml0aWFsaXplcnMpCi0JCQlyZXR1cm4gY2hpbGRyZW47Ci0KLQkJVmVjdG9yIHY9IG5ldyBWZWN0b3IoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobWF0Y2hlcyhjaGlsZHJlbltpXSkpCi0JCQkJY29udGludWU7Ci0JCQl2LmFkZEVsZW1lbnQoY2hpbGRyZW5baV0pOwotCQl9Ci0KLQkJT2JqZWN0W10gcmVzdWx0PSBuZXcgT2JqZWN0W3Yuc2l6ZSgpXTsKLQkJdi5jb3B5SW50byhyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YUVsZW1lbnRQcm92aWRlcigpLmdldEVsZW1lbnRzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKG9iamVjdCk7Ci0JfQotCQotCXByaXZhdGUgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyIGdldEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpIHsKLQkJaWYoamF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyPT1udWxsKSB7Ci0JCQlqYXZhRWxlbWVudExhYmVsUHJvdmlkZXIgPSBuZXcgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBTdGFuZGFyZEphdmFTY3JpcHRFbGVtZW50Q29udGVudFByb3ZpZGVyIGdldEphdmFFbGVtZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RhbmRhcmRKYXZhU2NyaXB0RWxlbWVudENvbnRlbnRQcm92aWRlcih0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3RbXSBmaWx0ZXJDaGlsZHJlbkZvclJhbmdlKElKYXZhU2NyaXB0RWxlbWVudFtdIGFsbENoaWxkcmVuLCBOb2RlIG5vZGUpIHsKLQkvLwlpbnQgamF2YVBvc2l0aW9uU3RhcnQgPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCS8vCWludCBqYXZhUG9zaXRpb25FbmQgICA9ICgoTm9kZUltcGwpIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkKLQkvLwlPYmplY3RbXSByZXN1bHQgPW5ldyBPYmplY3RbMF07Ci0JCQotCQlpbnQgamF2YVBvc2l0aW9uRW5kID0gKChOb2RlSW1wbCkgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWludCBqYXZhUG9zaXRpb25TdGFydCA9ICgoTm9kZUltcGwpIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJVmVjdG9yIHZhbGlkQ2hpbGRyZW4gPSBuZXcgVmVjdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhbGxDaGlsZHJlbltpXSBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJCUlTb3VyY2VSYW5nZSByYW5nZSA9IG51bGw7Ci0JCQkJaWYgKGFsbENoaWxkcmVuW2ldIGluc3RhbmNlb2YgTWVtYmVyKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyYW5nZSA9ICgoTWVtYmVyKSBhbGxDaGlsZHJlbltpXSkuZ2V0TmFtZVJhbmdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGFsbENoaWxkcmVuW2ldICBpbnN0YW5jZW9mIFNvdXJjZVJlZkVsZW1lbnQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJhbmdlID0gKChTb3VyY2VSZWZFbGVtZW50KWFsbENoaWxkcmVuW2ldICkuZ2V0U291cmNlUmFuZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGFsbENoaWxkcmVuW2ldLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LlRZUEUgfHwgKGphdmFQb3NpdGlvblN0YXJ0IDw9IHJhbmdlLmdldE9mZnNldCgpICYmIHJhbmdlLmdldExlbmd0aCgpICsgcmFuZ2UuZ2V0T2Zmc2V0KCkgPD0gKGphdmFQb3NpdGlvbkVuZCkpKSB7Ci0JCQkJCQotCQkJCQkKLQkJCQkJCQlpbnQgaHRtbGxlbmd0aCA9IHJhbmdlID09IG51bGwgPyAwIDogcmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQkJaW50IGh0bWxvZmZzZXQgPSByYW5nZSA9PSBudWxsID8gMCA6IHJhbmdlLmdldE9mZnNldCgpOwotCQkJCQkJCWlmIChodG1sbGVuZ3RoIDwgMCB8fCBodG1sb2Zmc2V0IDwgMCkgewotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJUG9zaXRpb24gcG9zaXRpb24gPSBuZXcgUG9zaXRpb24oaHRtbG9mZnNldCwgaHRtbGxlbmd0aCk7Ci0JCQkJCQkJdmFsaWRDaGlsZHJlbi5hZGQoZ2V0SnNOb2RlKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBhbGxDaGlsZHJlbltpXSwgcG9zaXRpb24pKTsKLQkJCQkJCi0JCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMF07Ci0KLQotCQlpZiAodmFsaWRDaGlsZHJlbi5zaXplKCkgPiAwKSB7Ci0JCQlyZXN1bHQgPSB2YWxpZENoaWxkcmVuLnRvQXJyYXkoKTsKLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0Lmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gbmV3IElKYXZhU2NyaXB0RWxlbWVudFswXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIHN5bmNocm9uaXplZCBPYmplY3RbXSBnZXRKU0VsZW1lbnRzRnJvbU5vZGUoTm9kZSBub2RlLCBib29sZWFuIGVuc3VyZUNvbnNpc3RhbnQpIHsKLQkJCQkKLS8vCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotLy8JCWludCBlbmRPZmZzZXQgPSAwOwotLy8JCWludCB0eXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlPYmplY3RbXSByZXN1bHQgPSBudWxsOwotCQkvL0pzVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSBudWxsOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIChub2RlIGluc3RhbmNlb2YgTm9kZUltcGwpKSB7Ci0vLwkJCXN0YXJ0T2Zmc2V0ID0gKChOb2RlSW1wbCkgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLS8vCQkJZW5kT2Zmc2V0ID0gKChOb2RlSW1wbCkgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlJSmF2YVNjcmlwdFVuaXQgdW5pdCA9IGdldExhenlDdShub2RlKTsKLQkgICAgICAgIC8vIEdlbnVpdGVjIEJlZ2luIEZpeCA2MTQ5OiBFeGNlcHRpb24gb3BlbmluZyBleHRlcm5hbCBIVE1MIGZpbGUKLQkJCWlmICh1bml0ID09IG51bGwpIHsKLQkJCSAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCX0KLQkgICAgICAgIC8vIEdlbnVpdGVjIEVuZCBGaXggNjE0OTogRXhjZXB0aW9uIG9wZW5pbmcgZXh0ZXJuYWwgSFRNTCBmaWxlCi0JCQl0cnkgewotCQkJCWlmKGVuc3VyZUNvbnNpc3RhbnQpIHVuaXQubWFrZUNvbnNpc3RlbnQoZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGV4MSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQlleDEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCXJlc3VsdCA9IGZpbHRlckNoaWxkcmVuRm9yUmFuZ2UodW5pdC5nZXRDaGlsZHJlbigpLG5vZGUpOwotCQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCXJlc3VsdCA9IG5ldyBPYmplY3RbMF07Ci0JCQkJbGF6eUN1PW51bGw7Ci0JCQl9Ci0JCQkKLQkJCS8vdHJhbnNsYXRpb24gPSBnZXRUcmFuc2xhdGlvbihub2RlKTsKLQkJCS8vcmVzdWx0ID0gdHJhbnNsYXRpb24uZ2V0QWxsRWxlbWVudHNJbkpzUmFuZ2Uoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJaWYobW9uaXRvcj09bnVsbCkgewotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBtb25pdG9yOwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgZ2V0SnNOb2RlKE5vZGUgcGFyZW50LCBJSmF2YVNjcmlwdEVsZW1lbnQgcm9vdCwgUG9zaXRpb24gcG9zaXRpb24pIHsKLQkJSnNKZmFjZU5vZGUgaW5zdGFuY2UgPSBudWxsOwotCQlpZiAocm9vdC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhU2NyaXB0RWxlbWVudC5UWVBFKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBKc0pmYWNlTm9kZShwYXJlbnQsIHJvb3QsIHBvc2l0aW9uLCAoKFNvdXJjZVJlZkVsZW1lbnQpIHJvb3QpLmdldEVsZW1lbnROYW1lKCkpOwotCQl9IGVsc2UgaWYgKHJvb3QuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YVNjcmlwdEVsZW1lbnQuRklFTEQpIHsKLQkJCS8qIEZpZWxkIHJlZnJlbmNlLCBwb3NzaWJseSB0byBhIHR5cGUgbWF5IG5lZWQgdG8gaW1wbGVtZW50IGxhdGVyICovCi0JCQlpbnN0YW5jZSA9IG5ldyBKc0pmYWNlTm9kZShwYXJlbnQsIHJvb3QsICBwb3NpdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBKc0pmYWNlTm9kZShwYXJlbnQsIHJvb3QsIHBvc2l0aW9uKTsKLQkJfQotCQlTdHJpbmcgbmFtZSA9IGdldEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLmdldFRleHQocm9vdCk7Ci0JCWluc3RhbmNlLnNldE5hbWUobmFtZSk7Ci0JCS8vICgoSnNKZmFjZU5vZGUpaW5zdGFuY2UpLnNldEFkYXB0ZXJSZWdpc3RyeShyZWdpc3RyeSk7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKGluc3RhbmNlKS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKCEoYWRhcHRlciBpbnN0YW5jZW9mIEpGYWNlTm9kZUFkYXB0ZXJGb3JKcykpIHsKLQkJCShpbnN0YW5jZSkucmVtb3ZlQWRhcHRlcihhZGFwdGVyKTsKLQkJCShpbnN0YW5jZSkuYWRkQWRhcHRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRMYWJlbEltYWdlKE9iamVjdCBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSnNKZmFjZU5vZGUpIHsKLQkJCXJldHVybiAoKEpzSmZhY2VOb2RlKSBub2RlKS5nZXRJbWFnZSgpOwotCQl9Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCkuZ2V0SW1hZ2Uobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldExhYmVsSW1hZ2Uobm9kZSk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxUZXh0KE9iamVjdCBub2RlKSB7Ci0vLwkJaWYgKG5vZGUgaW5zdGFuY2VvZiBKc0pmYWNlTm9kZSkgewotLy8JCQlyZXR1cm4gKChKc0pmYWNlTm9kZSkgbm9kZSkuZ2V0TmFtZSgpOwotLy8JCX0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKS5nZXRUZXh0KG5vZGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRMYWJlbFRleHQobm9kZSk7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YUVsZW1lbnRQcm92aWRlcigpLmdldFBhcmVudChlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCX0KLQkKLQlwcml2YXRlIElKYXZhU2NyaXB0VW5pdCBnZXRMYXp5Q3UoTm9kZSBub2RlKSB7Ci0JCWlmKGxhenlDdT09bnVsbCkgewotCQkJSUpzVHJhbnNsYXRpb24gdHJhbiA9IGdldFRyYW5zbGF0aW9uKG5vZGUpOwotCQkJaWYodHJhbj09IG51bGwpIHJldHVybiBudWxsOwotCQkJbGF6eUN1ID0gdHJhbi5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCWlmKGxhenlDdT09bnVsbCkgcmV0dXJuIG51bGw7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbGF6eUN1Lm1ha2VDb25zaXN0ZW50KCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpICk7Ci0JCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsYXp5Q3U7Ci0JfQotCQotCXByaXZhdGUgSUpzVHJhbnNsYXRpb24gZ2V0VHJhbnNsYXRpb24oTm9kZSBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlET01Eb2N1bWVudCB4bWxEb2MgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKG1vZGVsTWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQltb2RlbCA9IG1vZGVsTWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2MpOwotCQkJCS8vIG1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChkb2MpOwotCQkJfQotCQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgbW9kZWw7Ci0JCQlpZihkb21Nb2RlbCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJCXhtbERvYyA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkvLyBtb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlpZiAoeG1sRG9jID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUpzVHJhbnNsYXRpb25BZGFwdGVyIHRyYW5zbGF0aW9uQWRhcHRlciA9IChKc1RyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCQlyZXR1cm4gdHJhbnNsYXRpb25BZGFwdGVyLmdldEpzVHJhbnNsYXRpb24odHJ1ZSk7Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50UHJvdmlkZXIoKS5oYXNDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSUphdmFXZWJOb2RlKSB7Ci0JCQlyZXR1cm4gKChJSmF2YVdlYk5vZGUpIG9iamVjdCkuaGFzQ2hpbGRyZW4oKTsKLQkJCQotCQl9Ci0JCWlmIChpc0pTRWxlbWVudFBhcmVudChub2RlKSkgewotCQkJT2JqZWN0W10gbm9kZXMgPSBnZXRKU0VsZW1lbnRzRnJvbU5vZGUobm9kZS5nZXRGaXJzdENoaWxkKCksZmFsc2UpOwotCQkJYm9vbGVhbiBoYXNFbGVtZW50cyA9IChub2RlcyAhPSBudWxsICYmIG5vZGVzLmxlbmd0aCA+IDApOwotCQkJcmV0dXJuIGhhc0VsZW1lbnRzOwotCQl9Ci0JCXJldHVybiBzdXBlci5oYXNDaGlsZHJlbihvYmplY3QpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNKU0VsZW1lbnRQYXJlbnQoTm9kZSBub2RlKSB7Ci0JCXJldHVybiAobm9kZS5oYXNDaGlsZE5vZGVzKCkgJiYgbm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoInNjcmlwdCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvSnNKZmFjZU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvSnNKZmFjZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1YjM0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pzSmZhY2VOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3ROb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc0pmYWNlTm9kZSBleHRlbmRzIEVsZW1lbnRJbXBsIGltcGxlbWVudHMgSW5kZXhlZFJlZ2lvbiwgSU5vZGVOb3RpZmllciwgTm9kZSwgSUphdmFXZWJOb2RlIHsKLQlwcml2YXRlIGNsYXNzIEpzQWRhcHRhYmxlTm9kZSBleHRlbmRzIEFic3RyYWN0Tm90aWZpZXIgewotCQkKLQkJcHVibGljIEZhY3RvcnlSZWdpc3RyeSBnZXRGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCQlyZXR1cm4gYWRhcHRlclJlZ2lzdHJ5OwotCQl9Ci0JfQotCXByaXZhdGUgSnNBZGFwdGFibGVOb2RlIGFkYXB0YWJsZURvbU5vZGUgPSBuZXcgSnNBZGFwdGFibGVOb2RlKCk7Ci0JcHJpdmF0ZSBGYWN0b3J5UmVnaXN0cnkgYWRhcHRlclJlZ2lzdHJ5OwotCXByaXZhdGUgUG9zaXRpb24gZkRvY1Bvc2l0aW9uOwotLy8JcHJpdmF0ZSBOb2RlIHBhcmVudDsKLQlwcml2YXRlIFN0cmluZyB0eXBlTmFtZTsKLQkvL3ByaXZhdGUgSUphdmFTY3JpcHRFbGVtZW50IGRpcnR5RWxlbWVudDsKLQlwcml2YXRlIGJvb2xlYW4gaGFzQ2hpbGRyZW47Ci0JLy9wcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgSW1hZ2UgbWU7Ci0JCi0JcHVibGljIEpzSmZhY2VOb2RlKE5vZGUgcGFyZW50LCBJSmF2YVNjcmlwdEVsZW1lbnQgb3JpZ2luYWxFbGVtZW50LCBQb3NpdGlvbiBzdHJ1Y3R1cmVEb2NMb2NhdGlvbikgewotCQl0aGlzKHBhcmVudCwgb3JpZ2luYWxFbGVtZW50LCBzdHJ1Y3R1cmVEb2NMb2NhdGlvbiwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBKc0pmYWNlTm9kZShOb2RlIHBhcmVudCwgSUphdmFTY3JpcHRFbGVtZW50IG9yaWdpbmFsRWxlbWVudCwgUG9zaXRpb24gc3RydWN0dXJlRG9jTG9jYXRpb24sIFN0cmluZyB0eXBlTmFtZSkgewotCQkvL3N1cGVyKCk7Ci0JCXN1cGVyKCgoRWxlbWVudEltcGwpcGFyZW50KSk7Ci0JCS8vIHN1cGVyKHBhcmVudE9iamVjdCwgcGFyZW50T2JqZWN0LmdldEVsZW1lbnROYW1lKCkpOwotCQlmRG9jUG9zaXRpb24gPSBzdHJ1Y3R1cmVEb2NMb2NhdGlvbjsKLQkJLy90aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy50eXBlTmFtZSA9IHR5cGVOYW1lOwotCQl0cnkgewotCQkJaGFzQ2hpbGRyZW49KChKYXZhRWxlbWVudClvcmlnaW5hbEVsZW1lbnQpLmhhc0NoaWxkcmVuKCk7Ci0JCX0gY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJaGFzQ2hpbGRyZW49ZmFsc2U7Ci0JCX0KLQkJcmVtb3ZlQXR0cmlidXRlcygpOwotCQltZSA9IChuZXcgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyKEphdmFTY3JpcHRFbGVtZW50TGFiZWxQcm92aWRlci5TSE9XX0RFRkFVTFR8SmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyLlNIT1dfU01BTExfSUNPTlMpKS5nZXRJbWFnZShvcmlnaW5hbEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBtZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLS8vCQl0cnkgewotLy8JCQlyZXR1cm4gKChKYXZhRWxlbWVudCl0aGlzLmRpcnR5RWxlbWVudCkuaGFzQ2hpbGRyZW4oKTsKLS8vCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgpIHsKLS8vCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotLy8JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQl9Ci0JCXJldHVybiBoYXNDaGlsZHJlbjsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyLnNldFRhZ05hbWUobmFtZSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyKElOb2RlQWRhcHRlciBhZGFwdGVyKSB7Ci0JCWFkYXB0YWJsZURvbU5vZGUuYWRkQWRhcHRlcihhZGFwdGVyKTsKLQl9Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHRlc3RQb3NpdGlvbikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlyZXR1cm4gKG8gIT0gbnVsbCAmJiBvIGluc3RhbmNlb2YgSnNKZmFjZU5vZGUgJiYgKChKc0pmYWNlTm9kZSkgbykuZkRvY1Bvc2l0aW9uID09IHRoaXMuZkRvY1Bvc2l0aW9uKTsKLQl9Ci0JCi0vLyBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRJbnN0YW5jZShPYmplY3QgcGFyZW50LCBQb3NpdGlvbiBzdHJ1Y3R1cmVEb2NMb2NhdGlvbgotLy8gKXsKLS8vIC8vcmV0dXJuIG5ldyBKc0pmYWNlTm9kZSgoSmF2YUVsZW1lbnQpcGFyZW50LmdldFBhcmVudCgpLAotLy8gcGFyZW50LmdldEVsZW1lbnROYW1lKCksc3RydWN0dXJlRG9jTG9jYXRpb24pOwotLy8gVmVjdG9yIGludGVyZmFjZXMgPSBuZXcgVmVjdG9yKCk7Ci0vLyBpbnRlcmZhY2VzLmFkZEFsbChBcnJheXMuYXNMaXN0KHBhcmVudC5nZXRDbGFzcygpLmdldEludGVyZmFjZXMoKSkpOwotLy8gSnNKZmFjZU5vZGUgbWUgPSBuZXcgSnNKZmFjZU5vZGUocGFyZW50LHN0cnVjdHVyZURvY0xvY2F0aW9uKTsKLS8vIGludGVyZmFjZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QobWUuZ2V0Q2xhc3MoKS5nZXRJbnRlcmZhY2VzKCkpKTsKLS8vIE9iamVjdCBwcm94eSA9IG51bGw7Ci0vLyB0cnkgewotLy8gcHJveHk9IFByb3h5Lm5ld1Byb3h5SW5zdGFuY2UoCi0vLyBwYXJlbnQuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLAotLy8gKENsYXNzW10paW50ZXJmYWNlcy50b0FycmF5KG5ldyBDbGFzc1tde30pLG1lKTsKLS8vIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLyAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0vLyBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0vLyB9Ci0vLyByZXR1cm4gcHJveHk7Ci0vLyB9Ci0vLyAgIAotCQotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgZ2V0QWRhcHRlckZvcihPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gYWRhcHRhYmxlRG9tTm9kZS5nZXRBZGFwdGVyRm9yKHR5cGUpOwotCX0KLQkKLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZGFwdGVycygpIHsKLQkJcmV0dXJuIGFkYXB0YWJsZURvbU5vZGUuZ2V0QWRhcHRlcnMoKTsKLQl9Ci0JCi0JCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRG9jUG9zaXRpb24uZ2V0T2Zmc2V0KCkgKyBmRG9jUG9zaXRpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgZ2V0RXhpc3RpbmdBZGFwdGVyKE9iamVjdCB0eXBlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGFkYXB0YWJsZURvbU5vZGUuZ2V0RXhpc3RpbmdBZGFwdGVyKHR5cGUpOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIElKYXZhU2NyaXB0RWxlbWVudCBnZXRKYXZhRWxlbWVudCgpIHsKLQkJLyoKLQkJICogc2luY2UgdGhpcyBtYXkgYmVjb21lICdzdGFsZScgd2UgbmVlZCB0byByZWRpc2NvdmVyIG91ciBlbGVtZW50IGV2ZXJ5Ci0JCSAqIHRpbWUgd2UncmUgYXNrZWQKLQkJICovCi0JCUlKc1RyYW5zbGF0aW9uIHRyYW4gPSBnZXRUcmFuc2xhdGlvbigpOwotCQlpbnQgc3RhcnRPZmZzZXQgPSBnZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kT2Zmc2V0ID0gZ2V0TGVuZ3RoKCk7Ci0JCWlmICh0eXBlTmFtZSAhPSBudWxsKSB7Ci0JCQlJSmF2YVNjcmlwdEVsZW1lbnQgbXlUeXBlID0gdHJhbi5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRUeXBlKHR5cGVOYW1lKTsKLQkJCXJldHVybiBteVR5cGU7Ci0JCX0KLQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnRzW10gPSB0cmFuLmdldEFsbEVsZW1lbnRzSW5Kc1JhbmdlKHN0YXJ0T2Zmc2V0LCBzdGFydE9mZnNldCArIGVuZE9mZnNldCk7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZWxlbWVudHNbMF07Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZXMuZ2V0U3RyaW5nKCJKc0pmYWNlTm9kZS4xIikpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZEb2NQb3NpdGlvbi5nZXRMZW5ndGgoKTsKLQl9Ci0JCi0JCi0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuTm9kZUltcGwjZ2V0T3duZXJEb2N1bWVudCgpCi0JICovCi0JCi0KLQkKLQkKLQotCQotCQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRG9jUG9zaXRpb24uZ2V0T2Zmc2V0KCk7Ci0JfQotCQotLy8gcHJpdmF0ZSBNZXRob2RbXSBnZXRNZXRob2RzKCl7Ci0vLyAvLyByZXR1cm5zIHRoZSBtZXRob2RzIHRoaXMgY2xhc3Mgc3VwcG9ydHMgKGFzIGRlY2xhcmVkIGluIGludGVyZmFjZXMpCi0vLyBDbGFzc1tdIGludGVyZmFjZXMgPSBnZXRDbGFzcygpLmdldEludGVyZmFjZXMoKTsKLS8vIFZlY3RvciB2TWV0aG9kcyA9IG5ldyBWZWN0b3IoKTsKLS8vIGZvcihpbnQgaSA9IDA7aTxpbnRlcmZhY2VzLmxlbmd0aDtpKyspewotLy8gTWV0aG9kIG1ldGhvZHNbXSA9IGludGVyZmFjZXNbaV0uZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0vLyB2TWV0aG9kcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChtZXRob2RzKSk7Ci0vLyB9Ci0vLyAgICAgICAgCi0vLyByZXR1cm4gKE1ldGhvZFtdKXZNZXRob2RzLnRvQXJyYXkoKTsKLS8vIH0KLS8vIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBwcm94eSwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykgdGhyb3dzCi0vLyBUaHJvd2FibGUgewotLy8gT2JqZWN0IHJlc3VsdDsKLS8vIE1ldGhvZFtdIG15TWV0aG9kcyA9IGdldE1ldGhvZHMoKTsKLS8vICAgICAgICAKLS8vIHRyeSB7Ci0vLyBmb3IoaW50IGkgPSAwO2k8bXlNZXRob2RzLmxlbmd0aDtpKyspewotLy8gaWYobXlNZXRob2RzW2ldPT1tZXRob2QpewotLy8gcmV0dXJuIG1ldGhvZC5pbnZva2UodGhpcywgYXJncyk7Ci0vLyB9Ci0vLyB9Ci0vLyByZXN1bHQgPSBtZXRob2QuaW52b2tlKHBhcmVudFR5cGUsIGFyZ3MpOwotLy8gfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0vLyB0aHJvdyBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotLy8gfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGludm9jYXRpb24gZXhjZXB0aW9uOiAiICsKLS8vIGUuZ2V0TWVzc2FnZSgpKTsKLS8vIH0KLS8vCi0vLyByZXR1cm4gcmVzdWx0OwotLy8gfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50Lk5vZGVJbXBsI2dldFN0cnVjdHVyZWREb2N1bWVudCgpCi0JICovCi0JCi0KLQkKLQlwdWJsaWMgSUpzVHJhbnNsYXRpb24gZ2V0VHJhbnNsYXRpb24oKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlET01Eb2N1bWVudCB4bWxEb2MgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKG1vZGVsTWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQltb2RlbCA9IG1vZGVsTWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2MpOwotCQkJCS8vIG1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChkb2MpOwotCQkJfQotCQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgbW9kZWw7Ci0JCQl4bWxEb2MgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHhtbERvYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlKc1RyYW5zbGF0aW9uQWRhcHRlciB0cmFuc2xhdGlvbkFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJcmV0dXJuIHRyYW5zbGF0aW9uQWRhcHRlci5nZXRKc1RyYW5zbGF0aW9uKHRydWUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBub3RpZnkoaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlhZGFwdGFibGVEb21Ob2RlLm5vdGlmeShldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcyk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFkYXB0ZXIoSU5vZGVBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJYWRhcHRhYmxlRG9tTm9kZS5yZW1vdmVBZGFwdGVyKGFkYXB0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBZGFwdGVyUmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCXRoaXMuYWRhcHRlclJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTQ0ODEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICoKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzZlNWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Kc0pmYWNlTm9kZS4xPWVycm9yIGluIEpzSmZhY2VOb2RlLi4uIEkgY291bGRuJ3QgcmV0cmlldmUgbXkgamF2YSBlbGVtZW50IGZyb20gdGhlIG9yaWdpbmFsIHBhZ2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZvckpzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGb3JKcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTQ3YzM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZvckpzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MucHJvdmlzaW9uYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLlN0YW5kYXJkSmF2YVNjcmlwdEVsZW1lbnRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKRmFjZU5vZGVBZGFwdGVyRm9ySnMgZXh0ZW5kcyBKRmFjZU5vZGVBZGFwdGVyRm9ySFRNTCB7Ci0JcHVibGljIEpGYWNlTm9kZUFkYXB0ZXJGb3JKcyhKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudFByb3ZpZGVyKCkuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJfQotCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQlpZiAoaXNKU0VsZW1lbnRQYXJlbnQobm9kZSkpIHsKLS8vIE9iamVjdFtdIHJlc3VsdHMgPSBnZXRKU0VsZW1lbnRzRnJvbU5vZGUobm9kZS5nZXRGaXJzdENoaWxkKCkpOwotLy8gSU1lbWJlcltdIGFsbFJlc3VsdHMgPSBuZXcgSU1lbWJlcltyZXN1bHRzLmxlbmd0aF07Ci0vLyBmb3IoaW50IGkgPSAwO2k8cmVzdWx0cy5sZW5ndGg7aSsrKSB7Ci0vLyBpZihyZXN1bHRzW2ldPT1udWxsKSBjb250aW51ZTsKLS8vIElNZW1iZXIgbWVtYmVyID0gKChJTWVtYmVyKXJlc3VsdHNbaV0pOwotLy8gYWxsUmVzdWx0c1tpXSA9IG1lbWJlcjsKLQkJCS8vIH0KLQkJCXJldHVybiBnZXRKU0VsZW1lbnRzRnJvbU5vZGUobm9kZS5nZXRGaXJzdENoaWxkKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQkKLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YUVsZW1lbnRQcm92aWRlcigpLmdldEVsZW1lbnRzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKG9iamVjdCk7Ci0JfQotCQotCXByaXZhdGUgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyIGdldEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdGFuZGFyZEphdmFTY3JpcHRFbGVtZW50Q29udGVudFByb3ZpZGVyIGdldEphdmFFbGVtZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RhbmRhcmRKYXZhU2NyaXB0RWxlbWVudENvbnRlbnRQcm92aWRlcih0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgT2JqZWN0W10gZ2V0SlNFbGVtZW50c0Zyb21Ob2RlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJfQotCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQlpbnQgZW5kT2Zmc2V0ID0gMDsKLQkJSUphdmFTY3JpcHRFbGVtZW50W10gcmVzdWx0ID0gbnVsbDsKLQkJSUpzVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSBudWxsOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIChub2RlIGluc3RhbmNlb2YgTm9kZUltcGwpKSB7Ci0JCQlzdGFydE9mZnNldCA9ICgoTm9kZUltcGwpIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQllbmRPZmZzZXQgPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJCXRyYW5zbGF0aW9uID0gZ2V0VHJhbnNsYXRpb24obm9kZSk7Ci0JCQlyZXN1bHQgPSB0cmFuc2xhdGlvbi5nZXRBbGxFbGVtZW50c0luSnNSYW5nZShzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotLy8JCQkKLS8vIGlmIChyZXN1bHQgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0vLyBPYmplY3RbXSBuZXdSZXN1bHRzID0gbmV3IE9iamVjdFtyZXN1bHQubGVuZ3RoXTsKLS8vIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0vLyBpbnQgaHRtbGxlbmd0aCA9IDA7Ci0vLyBpbnQgaHRtbG9mZnNldCA9IDA7Ci0vLyBQb3NpdGlvbiBwb3NpdGlvbiA9IG51bGw7Ci0vLyB0cnkgewotLy8gaHRtbGxlbmd0aCA9ICgoU291cmNlUmVmRWxlbWVudCkgKHJlc3VsdFtpXSkpLmdldFNvdXJjZVJhbmdlKCkuZ2V0TGVuZ3RoKCk7Ci0vLyBodG1sb2Zmc2V0ID0gdHJhbnNsYXRpb24uZ2V0SnNwT2Zmc2V0KCgoU291cmNlUmVmRWxlbWVudCkKLS8vIChyZXN1bHRbaV0pKS5nZXRTb3VyY2VSYW5nZSgpLmdldE9mZnNldCgpKTsKLS8vIHBvc2l0aW9uID0gbmV3IFBvc2l0aW9uKGh0bWxvZmZzZXQsIGh0bWxsZW5ndGgpOwotLy8gfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLyB9Ci0vLyBuZXdSZXN1bHRzW2ldID0gZ2V0SnNOb2RlKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCAoSUphdmFTY3JpcHRFbGVtZW50KSByZXN1bHRbaV0sCi0vLyBwb3NpdGlvbik7Ci0vLyB9Ci0vLyByZXR1cm4gbmV3UmVzdWx0czsKLQl9Ci0JCi0JCi0JcHVibGljIEltYWdlIGdldExhYmVsSW1hZ2UoT2JqZWN0IG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKS5nZXRJbWFnZShub2RlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TGFiZWxJbWFnZShub2RlKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoT2JqZWN0IG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKS5nZXRUZXh0KG5vZGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRMYWJlbFRleHQobm9kZSk7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YUVsZW1lbnRQcm92aWRlcigpLmdldFBhcmVudChlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCX0KLQkKLQlwcml2YXRlIElKc1RyYW5zbGF0aW9uIGdldFRyYW5zbGF0aW9uKE5vZGUgbm9kZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChtb2RlbE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gKChOb2RlSW1wbCkgbm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJbW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jKTsKLQkJCQkvLyBtb2RlbCA9IG1vZGVsTWFuYWdlci5nZXRNb2RlbEZvclJlYWQoZG9jKTsKLQkJCX0KLQkJCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIG1vZGVsOwotCQkJeG1sRG9jID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCS8vIG1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCWlmICh4bWxEb2MgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXIgdHJhbnNsYXRpb25BZGFwdGVyID0gKEpzVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCXJldHVybiB0cmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SnNUcmFuc2xhdGlvbih0cnVlKTsKLQl9Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YUVsZW1lbnRQcm92aWRlcigpLmhhc0NoaWxkcmVuKG9iamVjdCk7Ci0JCX0KLQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJaWYgKGlzSlNFbGVtZW50UGFyZW50KG5vZGUpKSB7Ci0JCQlPYmplY3RbXSByZXN1bHRzID0gZ2V0SlNFbGVtZW50c0Zyb21Ob2RlKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKTsKLQkJCXJldHVybiAocmVzdWx0cyAhPSBudWxsICYmIHJlc3VsdHMubGVuZ3RoID4gMCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKG9iamVjdCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0pTRWxlbWVudFBhcmVudChOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgic2NyaXB0IikpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9Kc0NvbnRlbnRPdXRsaW5lQ29uZmlnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzQ29udGVudE91dGxpbmVDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4OTYzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzQ29udGVudE91dGxpbmVDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLnByb3Zpc2lvbmFsLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudmlld3MuY29udGVudG91dGxpbmUuSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc0NvbnRlbnRPdXRsaW5lQ29uZmlnIGV4dGVuZHMgSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9BRFZBTkNFRCA9IGZhbHNlOwotCUlMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyID0gbnVsbDsKLQkKLQlwdWJsaWMgSnNDb250ZW50T3V0bGluZUNvbmZpZygpIHt9Ci0JCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBnZXRKYXZhTGFiZWxQcm92aWRlcigpIHsKLQkJaWYgKGZMYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZMYWJlbFByb3ZpZGVyID0gbmV3IEpzTGFiZWxQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmTGFiZWxQcm92aWRlcjsKLQl9Ci0JCi0JCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKCFKc0NvbnRlbnRPdXRsaW5lQ29uZmlnLlVTRV9BRFZBTkNFRCkgewotCQkJcmV0dXJuIHN1cGVyLmdldExhYmVsUHJvdmlkZXIodmlld2VyKTsKLQkJfQotCQlyZXR1cm4gZ2V0SmF2YUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIElNZW51TGlzdGVuZXIgZ2V0TWVudUxpc3RlbmVyKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQkvLyBpZighVVNFX0FEVkFOQ0VEKQotCQkvLyByZXR1cm4gc3VwZXIuZ2V0TWVudUxpc3RlbmVyKHRyZWVWaWV3ZXIpOwotCQlyZXR1cm4gbmV3IEpzTWVudUxpc3RlbmVyKHRyZWVWaWV3ZXIpOwotCX0KLQkKLQkKLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0U3RhdHVzTGluZUxhYmVsUHJvdmlkZXIoVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCWlmICghSnNDb250ZW50T3V0bGluZUNvbmZpZy5VU0VfQURWQU5DRUQpIHsKLQkJCXJldHVybiBzdXBlci5nZXRTdGF0dXNMaW5lTGFiZWxQcm92aWRlcih0cmVlVmlld2VyKTsKLQkJfQotCQlyZXR1cm4gZ2V0SmF2YUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9Kc0xhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzMGYxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MucHJvdmlzaW9uYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBYTUxMYWJlbFByb3ZpZGVyIHsKLQlKYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXIgPSBudWxsOwotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLmdldEltYWdlKG8pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXIgZ2V0SmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCkgewotCQlpZiAoZkxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkxhYmVsUHJvdmlkZXIgPSBuZXcgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZMYWJlbFByb3ZpZGVyOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKS5nZXRUZXh0KG8pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KG8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSnNNZW51TGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSnNNZW51TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwZmQwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzTWVudUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MucHJvdmlzaW9uYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uR3JvdXBNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLmphdmFlZGl0b3IuQ29tcGlsYXRpb25Vbml0RWRpdG9yQWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuSUNvbnRleHRNZW51Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5JSmF2YVdlYk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlhNTE5vZGVBY3Rpb25NYW5hZ2VyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc01lbnVMaXN0ZW5lciBleHRlbmRzIFhNTE5vZGVBY3Rpb25NYW5hZ2VyIGltcGxlbWVudHMgSU1lbnVMaXN0ZW5lciwgSVJlbGVhc2FibGUgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfR1JPVVBfSUQgPSAiZ3JvdXAuZWRpdCI7IC8vJE5PTi1OTFMtMSQKLQlDb21waWxhdGlvblVuaXRFZGl0b3JBY3Rpb25Db250cmlidXRvciBjb250cmliOwotCXByaXZhdGUgWE1MTm9kZUFjdGlvbk1hbmFnZXIgZkFjdGlvbk1hbmFnZXI7Ci0JcHJpdmF0ZSBUcmVlVmlld2VyIGZUcmVlVmlld2VyOwotCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsKLQkKLQlwdWJsaWMgSnNNZW51TGlzdGVuZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIoKElTdHJ1Y3R1cmVkTW9kZWwpIHZpZXdlci5nZXRJbnB1dCgpLCB2aWV3ZXIpOwotCQljb250cmliID0gbmV3IENvbXBpbGF0aW9uVW5pdEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yKCk7Ci0JCWZUcmVlVmlld2VyID0gdmlld2VyOwotLy8JCQkKLS8vIGZBY3Rpb25Hcm91cHM9IG5ldyBDb21wb3NpdGVBY3Rpb25Hcm91cChuZXcgQWN0aW9uR3JvdXBbXSB7Ci0vLyBuZXcgT3BlblZpZXdBY3Rpb25Hcm91cChnZXRXb3JrYmVuY2hTaXRlKCksIGdldFNlbGVjdGlvblByb3ZpZGVyKCkpLAotLy8gbmV3IENDUEFjdGlvbkdyb3VwKGdldFdvcmtiZW5jaFNpdGUoKSksCi0vLyBuZXcgR2VuZXJhdGVBY3Rpb25Hcm91cChnZXRXb3JrYmVuY2hTaXRlKCkpLAotLy8gbmV3IFJlZmFjdG9yQWN0aW9uR3JvdXAoZ2V0V29ya2JlbmNoU2l0ZSgpKSwKLS8vIG5ldyBKYXZhU2VhcmNoQWN0aW9uR3JvdXAoZ2V0V29ya2JlbmNoU2l0ZSgpKX0pOwotCX0KLQkKLQlwdWJsaWMgSUFjdGlvbltdIGdldEFsbEpzQWN0aW9ucygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotLy8JcHJpdmF0ZSBJV29ya2JlbmNoU2l0ZSBnZXRXb3JrYmVuY2hTaXRlKCkgewotLy8JCXJldHVybiBJbnRlcm5hbEhhbmRsZXJVdGlsLmdldEFjdGl2ZVNpdGUoZlRyZWVWaWV3ZXIpOwotLy8JfQotCQotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGZUcmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgVHJlZVNlbGVjdGlvbikgewotCQkJVHJlZVNlbGVjdGlvbiB0c2VsZWN0ID0gKFRyZWVTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCU9iamVjdFtdIGVsZW1lbnRzID0gdHNlbGVjdC50b0FycmF5KCk7Ci0JCQlpbnQgamF2YUNvdW50ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJSmF2YVdlYk5vZGUpIHsKLQkJCQkJamF2YUNvdW50Kys7Ci0JCQkJfQotCQkJfQotCQkJLy9JQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOwotLy8gbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfTkVXKSk7Ci0vLyBtZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX0dPVE8pKTsKLS8vIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX09QRU4pKTsKLS8vIG1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfU0hPVykpOwotLy8gbWVudS5hZGQobmV3IFNlcGFyYXRvcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9FRElUKSk7Ci0vLyBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9SRU9SR0FOSVpFKSk7Ci0vLyBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9HRU5FUkFURSkpOwotLy8gbWVudS5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfU0VBUkNIKSk7Ci0vLyBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9CVUlMRCkpOwotLy8gbWVudS5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfQURESVRJT05TKSk7Ci0vLyBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9WSUVXRVJfU0VUVVApKTsKLS8vIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1BST1BFUlRJRVMpKTsKLQkJCWlmIChqYXZhQ291bnQgPT0gZWxlbWVudHMubGVuZ3RoICYmIGphdmFDb3VudCAhPSAwKSB7Ci0JCQkJLy8gc2VlIHBsdWdpbi54bWwgZm9yIG9iamVjdCBjb250cmlidXRpb25zIHRoYXQgcG9wdWxhdGUgdGhlc2UKLQkJCQkvLyBtZW51cwotCQkJCS8qCi0JCQkJICogTWVudSBmb3I6Ci0JCQkJICogCi0JCQkJICogT3BlbiBUeXBlIEhpZXJhcmNoeSBPcGVuIENhbGwgSGllcmFyY2h5IFNob3cgSW4tLT4gU2NyaXB0Ci0JCQkJICogRXhwbG9yZXIgTmF2aWdhdG9yCi0JCQkJICovCi0JCQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfU0hPVykpOwotCQkJCW1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfU0hPVykpOwotCQkJCS8qCi0JCQkJICogTWVudSBmb3I6IEN1dCBDb3B5IFBhc3RlIERlbGV0ZQotCQkJCSAqLwotCQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSnNNZW51TGlzdGVuZXIuRURJVF9HUk9VUF9JRCkpOwotCQkJCW1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcihKc01lbnVMaXN0ZW5lci5FRElUX0dST1VQX0lEKSk7Ci0JCQkJLyoKLQkJCQkgKiBNZW51IGZvcjoKLQkJCQkgKiAKLQkJCQkgKiBTb3VyY2UtLT4gR2VuZXJhdGUgRWxlbWVudCBDb21tZW50Ci0JCQkJICogCi0JCQkJICogCi0JCQkJICogUmVmYWN0b3ItLT4gUmVuYW1lIE1vdmUgQ2hhbmdlIEZ1bmN0aW9uIFNpZ25hdHVyZSBJbmxpbmUKLQkJCQkgKiBJbnRyb2R1Y2UgSW5kaXJlY3Rpb24gSW5mZXIgR2VuZXJpYyBUeXBlIEFyZ3VtZW50cwotCQkJCSAqLwotCQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1NPVVJDRSkpOwotCQkJCW1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfU09VUkNFKSk7Ci0JCQkJLyoKLQkJCQkgKiBNZW51IGZvcjoKLQkJCQkgKiAKLQkJCQkgKiBSZWZyZW5jZXMtLT4gV29ya3NwYWNlIFByb2plY3QgSGllcmFyY2h5IFdvcmtpbmcgU2V0Ci0JCQkJICogCi0JCQkJICogRGVjbGVyYXRpb25zLS0+IFdvcmtzcGFjZSBQcm9qZWN0IEhpZXJhcmNoeSBXb3JraW5nIFNldAotCQkJCSAqIAotCQkJCSAqLwotCQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1NFQVJDSCkpOwotCQkJCW1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfU0VBUkNIKSk7Ci0JCQkJLyogYWxsIEphdmEgRWxlbWVudHMgKi8KLS8vCQkJCQkKLS8vCQkJCQkKLS8vCQkJCQkKLS8vIEphdmFTY3JpcHRQbHVnaW4uY3JlYXRlU3RhbmRhcmRHcm91cHMobWFuYWdlcik7Ci0vLyBTdHJpbmdbXSBhY3Rpb25TZXRzID0gSlNEVEFjdGlvblNldFV0aWwuZ2V0QWxsQWN0aW9uU2V0cygpOwotLy8KLS8vIElBY3Rpb25bXSBhY3Rpb25zID0gSlNEVEFjdGlvblNldFV0aWwuZ2V0QWN0aW9uc0Zyb21TZXQoYWN0aW9uU2V0cyk7Ci0vLyBmb3IoaW50IGkgPSAwO2k8YWN0aW9ucy5sZW5ndGg7aSsrKSB7Ci0vLyBtYW5hZ2VyLmFkZChhY3Rpb25zW2ldKTsKLS8vIH0KLS8vIGZBY3Rpb25Hcm91cHMuc2V0Q29udGV4dChuZXcgQWN0aW9uQ29udGV4dChzZWxlY3Rpb24pKTsKLS8vIGZBY3Rpb25Hcm91cHMuZmlsbENvbnRleHRNZW51KG1hbmFnZXIpOwotLy8JCQkJCQotCQkJfSBlbHNlIGlmIChqYXZhQ291bnQgPT0gMCkgewotCQkJCWZpbGxDb250ZXh0TWVudShtYW5hZ2VyLCBzZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZSNyZWxlYXNlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlmVHJlZVZpZXdlciA9IG51bGw7Ci0JCWlmIChmQWN0aW9uTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmQWN0aW9uTWFuYWdlci5zZXRNb2RlbChudWxsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSnNXZWJFbGVtZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSnNXZWJFbGVtZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwZGI1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzV2ViRWxlbWVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5wcm92aXNpb25hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLlN0YW5kYXJkSmF2YVNjcmlwdEVsZW1lbnRDb250ZW50UHJvdmlkZXI7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzV2ViRWxlbWVudFByb3ZpZGVyIGV4dGVuZHMgU3RhbmRhcmRKYXZhU2NyaXB0RWxlbWVudENvbnRlbnRQcm92aWRlciB7fQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9YTUxMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL1hNTExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y1YzYyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL1hNTExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5wcm92aXNpb25hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgWE1MTGFiZWxQcm92aWRlciBleHRlbmRzIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIgewotCWJvb2xlYW4gZlNob3dBdHRyaWJ1dGVzID0gZmFsc2U7Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvKSB7Ci0JCVN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci5nZXRUZXh0KG8pKTsKLQkJaWYgKG8gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgbzsKLQkJCWlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSAmJiBmU2hvd0F0dHJpYnV0ZXMpIHsKLQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg0NDQKLQkJCQlpZiAobm9kZS5oYXNBdHRyaWJ1dGVzKCkpIHsKLQkJCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCU5vZGUgaWRUeXBlZEF0dHJpYnV0ZSA9IG51bGw7Ci0JCQkJCU5vZGUgcmVxdWlyZWRBdHRyaWJ1dGUgPSBudWxsOwotCQkJCQlib29sZWFuIGhhc0lkID0gZmFsc2U7Ci0JCQkJCWJvb2xlYW4gaGFzTmFtZSA9IGZhbHNlOwotCQkJCQlOb2RlIHNob3duQXR0cmlidXRlID0gbnVsbDsKLQkJCQkJLy8gdHJ5IHRvIGdldCBjb250ZW50IG1vZGVsIGVsZW1lbnQKLQkJCQkJLy8gZGVjbGFyYXRpb24KLQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBudWxsOwotCQkJCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQkJCWlmIChtcSAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50RGVjbCA9IG1xLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJCS8vIGZpbmQgYW4gYXR0cmlidXRlIG9mIHR5cGUgKG9yIGp1c3QgbmFtZWQpCi0JCQkJCS8vIElECi0JCQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgaSA9IDA7Ci0JCQkJCQl3aGlsZSAoKGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpKSAmJiAoaWRUeXBlZEF0dHJpYnV0ZSA9PSBudWxsKSkgewotCQkJCQkJCU5vZGUgYXR0ciA9IGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyLmdldE5vZGVOYW1lKCk7Ci0JCQkJCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBlbGVtZW50RGVjbC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJCQkJCQlpZiAoYXR0ckRlY2wgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAoKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkgIT0gbnVsbCkgJiYgKENNRGF0YVR5cGUuSUQuZXF1YWxzKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0RGF0YVR5cGVOYW1lKCkpKSkgewotCQkJCQkJCQkJaWRUeXBlZEF0dHJpYnV0ZSA9IGF0dHI7Ci0JCQkJCQkJCX0gZWxzZSBpZiAoKGF0dHJEZWNsLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgJiYgKHJlcXVpcmVkQXR0cmlidXRlID09IG51bGwpKSB7Ci0JCQkJCQkJCQkvLyBhcyBhIGJhY2t1cCwga2VlcCB0YWJzIG9uCi0JCQkJCQkJCQkvLyBhbnkgcmVxdWlyZWQKLQkJCQkJCQkJCS8vIGF0dHJpYnV0ZXMKLQkJCQkJCQkJCXJlcXVpcmVkQXR0cmlidXRlID0gYXR0cjsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWhhc0lkID0gaGFzSWQgfHwgYXR0ck5hbWUuZXF1YWxzKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQloYXNOYW1lID0gaGFzTmFtZSB8fCBhdHRyTmFtZS5lcXVhbHMoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCSsraTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvKgotCQkJCQkgKiBJZiBubyBzdWl0YWJsZSBhdHRyaWJ1dGUgd2FzIGZvdW5kLCB0cnkgdXNpbmcgYQotCQkJCQkgKiByZXF1aXJlZCBhdHRyaWJ1dGUsIGlmIG5vbmUsIHRoZW4gcHJlZmVyICJpZCIgb3IKLQkJCQkJICogIm5hbWUiLCBvdGhlcndpc2UganVzdCB1c2UgZmlyc3QgYXR0cmlidXRlCi0JCQkJCSAqLwotCQkJCQlpZiAoaWRUeXBlZEF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJCQlzaG93bkF0dHJpYnV0ZSA9IGlkVHlwZWRBdHRyaWJ1dGU7Ci0JCQkJCX0gZWxzZSBpZiAocmVxdWlyZWRBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCQkJc2hvd25BdHRyaWJ1dGUgPSByZXF1aXJlZEF0dHJpYnV0ZTsKLQkJCQkJfSBlbHNlIGlmIChoYXNJZCkgewotCQkJCQkJc2hvd25BdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgaWYgKGhhc05hbWUpIHsKLQkJCQkJCXNob3duQXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmIChzaG93bkF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQkJCQlzaG93bkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuaXRlbSgwKTsKLQkJCQkJfQotCQkJCQkvLyBkaXNwbGF5IHRoZSBhdHRyaWJ1dGUgYW5kIHZhbHVlICh3aXRob3V0IHF1b3RlcykKLQkJCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBzaG93bkF0dHJpYnV0ZS5nZXROb2RlTmFtZSgpOwotCQkJCQlpZiAoKGF0dHJpYnV0ZU5hbWUgIT0gbnVsbCkgJiYgKGF0dHJpYnV0ZU5hbWUubGVuZ3RoKCkgPiAwKSkgewotCQkJCQkJdGV4dC5hcHBlbmQoIiAiICsgYXR0cmlidXRlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IHNob3duQXR0cmlidXRlLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJaWYgKChhdHRyaWJ1dGVWYWx1ZSAhPSBudWxsKSAmJiAoYXR0cmlidXRlVmFsdWUubGVuZ3RoKCkgPiAwKSkgewotCQkJCQkJCXRleHQuYXBwZW5kKCI9IiArIFN0cmluZ1V0aWxzLnN0cmlwKGF0dHJpYnV0ZVZhbHVlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdGV4dC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvd2ViMS5HSUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3dlYjEuR0lGCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWEyMjBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvd2ViMS5HSUYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3dlYjEuSlBHIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS93ZWIxLkpQRwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiZjljNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3dlYjEuSlBHCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmOWRlYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1lbmNvZGluZyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy10YXNrdGFncyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1jb250ZW50cHJvcGVydGllcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvdzNjL2RvbS90cmF2ZXJzYWwvTm9kZUl0ZXJhdG9yIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MTIzMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotYmluCi1tb2RlbC5qYXIKLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZV8xLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLS5mYndhcm5pbmdzCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGIwYjE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2RlYnVnPXRydWUKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb20vYWRhcHRlci9ub3RpZmljYXRpb24vdGltZT1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2RvbS9hZGFwdGVyL25vdGlmaWNhdGlvbi90aW1lL2NyaXRlcmlhPTEwCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3RydWN0dXJlZGRvY3VtZW50PWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZmlsZWJ1ZmZlcnMvbW9kZWxtYW5hZ2VtZW50PWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZmlsZWJ1ZmZlcnMvbGVha3M9dHJ1ZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2ZpbGVidWZmZXJzL2xpZmVjeWNsZT1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRtb2RlbC9saWZlY3ljbGU9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvc3RhdGU9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvbG9ja3M9dHJ1ZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRtb2RlbC9tb2RlbG1hbmFnZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcz1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL2RldGVjdGlvbj1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL2pvYj1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL292ZXJhbGx0aW1lPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvdGltZT1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL3ByZWZlcmVuY2VzPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvcmVnaXN0cnk9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9mb3JtYXQ9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YzViMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNGU2MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1NhdCBNYXIgMjQgMTE6MjM6NTQgRURUIDIwMDcNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4NCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuakZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNzI3MmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyLmpGbGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKm5sc1hYWCovDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOw0KLQ0KLQ0KLQ0KLSUlDQotDQotJXsNCi0NCi0NCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOw0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOw0KLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nDQotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsNCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsNCi0NCi0NCi0NCi0JcHVibGljIENTU0hlYWRUb2tlbml6ZXIoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCSAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgew0KLQkgIAkvKiB0aGUgaW5wdXQgZGV2aWNlICovDQotCSAgCXl5X3JlYWRlciA9IGluOw0KLQ0KLSAgCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotICAJCXl5X3N0YXRlID0gMDsNCi0NCi0gIAkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLw0KLSAgCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOw0KLQ0KLSAgCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzDQotICAJCSB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0gIAkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7DQotDQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovDQotICAJCXl5X21hcmtlZFBvcyA9IDA7DQotDQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotICAJCXl5X3B1c2hiYWNrUG9zID0gMDsNCi0NCi0gIAkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovDQotICAJCXl5X2N1cnJlbnRQb3MgPSAwOw0KLQ0KLSAgCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8NCi0gIAkJeXlfc3RhcnRSZWFkID0gMDsNCi0NCi0gIAkJLyoqIA0KLSAgCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQNCi0gIAkJICogZnJvbSBpbnB1dCANCi0gIAkJICovDQotICAJCXl5X2VuZFJlYWQgPSAwOw0KLQ0KLSAgCQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIAkJeXlsaW5lID0gMDsNCi0NCi0gIAkJLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotICAJCXl5Y2hhciA9IDA7DQotDQotICAJCS8qKg0KLSAgCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydA0KLSAgCQkgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0DQotICAJCSAqLw0KLSAgCQl5eWNvbHVtbiA9IDA7IA0KLQ0KLSAgCQkvKiogDQotICAJCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIA0KLSAgCQkgKiBvZiBhIGxpbmUNCi0gIAkJICovDQotICAJCXl5X2F0Qk9MID0gZmFsc2U7DQotDQotICAJCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0gIAkJeXlfYXRFT0YgPSBmYWxzZTsNCi0NCi0gIAkJLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovDQotICAJCXl5X2VvZl9kb25lID0gZmFsc2U7DQotDQotDQotICAJCWZTdGF0ZVN0YWNrLmNsZWFyKCk7DQotICAJCQ0KLSAgCQloYXNNb3JlID0gdHJ1ZTsNCi0gIAkJDQotCQkvLyBpdHMgYSBsaXR0bGUgd2FzdGVmdWwgdG8gInRocm93IGF3YXkiIGZpcnN0IGNoYXIgYXJyYXkgZ2VuZXJhdGVkDQotCQkvLyBieSBjbGFzcyBpbml0ICh2aWEgYXV0byBnZW5lcmF0ZWQgY29kZSksIGJ1dCB3ZSByZWFsbHkgZG8gd2FudA0KLQkJLy8gYSBzbWFsbCBidWZmZXIgZm9yIG91ciBoZWFkIHBhcnNlcnMuDQotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBNQVhfVE9fU0NBTikgew0KLQkJCXl5X2J1ZmZlciA9IG5ldyBjaGFyW01BWF9UT19TQ0FOXTsNCi0JCX0NCi0gIAkJDQotDQotICAJfQ0KLQ0KLQ0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlTdHJpbmcgY29udGV4dCA9IG51bGw7DQotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7DQotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsNCi0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7DQotCQkJdmFsdWVUZXh0ID0gbnVsbDsNCi0JCX0gZWxzZSB7DQotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7DQotCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7DQotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsNCi0JfQ0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsNCi0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7DQotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JfQ0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgew0KLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOw0KLQl9DQotCQ0KLQ0KLSV9DQotDQotJWVvZnsNCi0JaGFzTW9yZT1mYWxzZTsNCi0lZW9mfQ0KLQ0KLSVwdWJsaWMNCi0lY2xhc3MgQ1NTSGVhZFRva2VuaXplcg0KLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuDQotJXR5cGUgU3RyaW5nDQotJWNoYXINCi0ldW5pY29kZQ0KLSVpZ25vcmVjYXNlIA0KLSVkZWJ1Zw0KLSVzd2l0Y2gNCi0NCi0NCi1VVEYxNkJFID0gXHhGRVx4RkYNCi1VVEYxNkxFID0gXHhGRlx4RkUNCi1VVEY4M0J5dGVCT00gPSBceEVGXHhCQlx4QkYNCi0NCi0vL1NwYWNlQ2hhciA9IFtceDIwXHgwOV0NCi0NCi0NCi0NCi0vLyBbM10gUyA6Oj0gKDB4MjAgfCAweDkgfCAweEQgfCAweEEpKw0KLVMgPSBbXHgyMFx4MDlceDBEXHgwQV0NCi0NCi0vL0JlZ2luQXR0cmliZVZhbHVlID0ge1N9KiBcPSB7U30qDQotDQotTGluZVRlcm1pbmF0b3IgPSBccnxcbg0KLQ0KLS8vIFogaXMgdGhlIHNpbmdsZS1ieXRlIHplcm8gY2hhcmFjdGVyIHRvIGJlIHVzZWQgaW4gcGFyc2luZyBkb3VibGUtYnl0ZSBmaWxlcw0KLVogPSAoXHgwMCk/DQotU19VVEYgPSB7Wn17U317Wn0NCi1CZWdpbkF0dHJpYnV0ZVZhbHVlVVRGID0ge1NfVVRGfSogXD0ge1NfVVRGfSoNCi0NCi0lc3RhdGUgU1RfWE1MRGVjbA0KLSVzdGF0ZSBDSEFSU0VUX1JVTEUNCi0lc3RhdGUgUXVvdGVkQXR0cmlidXRlVmFsdWUNCi0lc3RhdGUgRFFfU1RSSU5HDQotJXN0YXRlIFNRX1NUUklORw0KLSVzdGF0ZSBVbkRlbGltaXRlZFN0cmluZw0KLQ0KLSUlDQotDQotDQotPFlZSU5JVElBTD4gIA0KLXsNCi0Je1VURjE2QkV9ICAgCQl7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9DQotCXtVVEYxNkxFfSAgIAkJe2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7fQ0KLQl7VVRGODNCeXRlQk9NfSAgIAl7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NO30NCi0NCi0JLy8gZm9yY2UgdG8gYmUgc3RhcnRlZCBvbiBmaXJzdCBsaW5lLCBidXQgd2UgZG8gYWxsb3cgcHJlY2VlZGluZyBzcGFjZXMNCi0JXiB7Wn0oe1N9e1p9KSogKHtafTx7Wn1cP3tafXh7Wn1te1p9bHtafSl7U19VVEZ9KyB7aWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9fQ0KLQkNCi0JXiB7Wn0oe1N9e1p9KSooe1p9QHtafWN7Wn1oe1p9YXtafXJ7Wn1ze1p9ZXtafXR7Wn0pICAge2lmICh5eWNoYXIgPT0gMCApICB7eXliZWdpbihDSEFSU0VUX1JVTEUpOyByZXR1cm4gQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5DSEFSU0VUX1JVTEU7fX0NCi19CQ0KLQ0KLS8vIEkgZG9uJ3QgdGhpbmsgdGhlcmUncyByZWFsbHkgYW4gWE1MIGZvcm0gb2YgQ1NTIGZpbGVzIC4uLiBidXQgd2lsbCBsZWF2ZSBoZXJlIGZvciBjb25zaXN0ZW5jeQkNCi08U1RfWE1MRGVjbD4gDQotew0KLQkvLyJ2ZXJzaW9uIiB7QmVnaW5BdHRyaWJlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsVmVyc2lvbjt9DQotCXtafWV7Wn1ue1p9Y3tafW97Wn1ke1p9aXtafW57Wn1ne1p9IHtCZWdpbkF0dHJpYnV0ZVZhbHVlVVRGfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7fQ0KLQkvLyBub3RlIHRoaXMgImZvcmNlZCBlbmQiIG9uY2UgZW5kIG9mIFhNTCBEZWNsYXJhdGlvbiBmb3VuZA0KLQl7Wn1cP3tafT57Wn0gICAge3l5YmVnaW4oWVlJTklUSUFMKTsgIHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7fQ0KLX0JDQotDQotPENIQVJTRVRfUlVMRT4gDQotew0KLQ0KLQl7U19VVEZ9KiAge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7fQ0KLQl7Wn07e1p9ICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyAgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5SdWxlRW5kO30NCi19DQotCQ0KLQ0KLTxRdW90ZWRBdHRyaWJ1dGVWYWx1ZT4NCi17DQotCXtafVwie1p9ICAgICAgICAgICAgICAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0NCi0Je1p9XCd7Wn0JCQl7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQ0KLQkvLyBpbiB0aGlzIHN0YXRlLCBhbnl0aGluZyBvdGhlciB0aGFuIGEgc3BhY2UgY2hhcmFjdGVyIGNhbiBzdGFydCBhbiB1bmRlbGltaXRlZCBzdHJpbmcNCi0Je1NfVVRGfSouICAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApO30NCi0NCi19CQ0KLQ0KLQ0KLTxEUV9TVFJJTkc+DQotew0KLQ0KLQl7Wn1cIntafSAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7IH0NCi0gIAl7Wn17TGluZVRlcm1pbmF0b3J9e1p9ICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9XD97Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn08e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCQ0KLQl7Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafVwve1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9O3tafSAgICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQ0KLQlbXlx4MDBdCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9DQotDQotDQotfQ0KLQ0KLTxTUV9TVFJJTkc+DQotew0KLQ0KLQl7Wn1cJ3tafSAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7fQ0KLSAgCXtafXtMaW5lVGVybWluYXRvcn17Wn0gICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn0le1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn08e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafT57Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9XC97Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn07e1p9ICAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9DQotCVteXHgwMF0JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0NCi0NCi19DQotDQotPFVuRGVsaW1pdGVkU3RyaW5nPg0KLXsNCi0NCi0NCi0Je1NfVVRGfSAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0NCi0gIAl7Wn17TGluZVRlcm1pbmF0b3J9e1p9ICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9XD97Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafTx7Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0JLy8gdGhlc2UgYXJlIGEgYml0IHNwZWNpYWwsIHNpbmNlIHdlIHN0YXJ0ZWQgYW4gdW5kZWxpbWl0IHN0cmluZywgYnV0IGZvdW5kIGEgcXVvdGUgLi4uIHByb2JhYmx5IGluZGljYXRlcyBhIG1pc3NpbmcgYmVnaW5uaW5nIHF1b3RlDQotCXtafVwne1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafVwie1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9DQotCQ0KLQl7Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafVwve1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9O3tafSAgICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgfQ0KLQlbXlx4MDBdCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9DQotfQ0KLQ0KLS8vIFRoZSAibWF0Y2ggYW55dGhpbmciIHJ1bGUgc2hvdWxkIGFsd2F5cyBiZSBpbiBlZmZlY3QgZXhjZXB0IGZvciB3aGVuIGxvb2tpbmcgZm9yIGVuZCBvZiBzdHJpbmcNCi0vLyAoVGhhdCBpcywgcmVtZW1iZXIgdG8gdXBkYXRlIHN0YXRlIGxpc3QgaWYvd2hlbiBuZXcgc3RhdGVzIGFkZGVkKQ0KLS58XG4Je2lmKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO319DQotDQotLy8gdGhpcyBydWxlIGFsd2F5cyBpbiBlZmZlY3QNCi08PEVPRj4+ICAgICAgICAge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjt9DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIzMDlkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NDEgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gNy8yOC8wOCA1OjE5IFBNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDcvMjgvMDggNToxOSBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi93b3Jrc3BhY2VzL3d0cDMwMS93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplci5qRmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDU1NIZWFkVG9rZW5pemVyIHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRFFfU1RSSU5HID0gODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1FfU1RSSU5HID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTERlY2wgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZSA9IDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IENIQVJTRVRfUlVMRSA9IDQ7Ci0KLSAgLyoqCi0gICAqIFlZX0xFWFNUQVRFW2xdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqIFlZX0xFWFNUQVRFW2wrMV0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogICAgICAgICAgICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKiBsIGlzIG9mIHRoZSBmb3JtIGwgPSAyKmssIGsgYSBub24gbmVnYXRpdmUgaW50ZWdlcgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFlZX0xFWFNUQVRFW10gPSB7IAotICAgICAwLCAgMSwgIDIsICAyLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LCA3Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gCi0gICAgIlwxXDExXDEwXDBcMVw2XDFcMTBcMlwwXDFcN1wyMlwwXDFcNlwxXDBcMVwzNyIrCi0gICAgIlwyXDBcMVw0MlwxXDBcMVw0MFw3XDBcMVw0MVwxM1wwXDFcMzZcMVwxM1wxXDEyIisKLSAgICAiXDFcMzVcMVwxNFwxXDIwXDFcMjNcMVwwXDFcMjFcMVwzMlwxXDI2XDFcMFwxXDM0IisKLSAgICAiXDFcMjJcMVwzM1wyXDBcMVwxN1wxXDE2XDFcMzBcMVwzMVwyXDBcMVwyNFwxXDI1IisKLSAgICAiXDFcMjdcM1wwXDFcMTVcMTBcMFwxXDIzXDFcMFwxXDIxXDFcMzJcMVwyNlwxXDAiKwotICAgICJcMVwzNFwxXDIyXDFcMzNcMlwwXDFcMTdcMVwxNlwxXDMwXDFcMzFcMlwwXDFcMjQiKwotICAgICJcMVwyNVwxXDI3XDNcMFwxXDE1XDEwMlwwXDFcNFwzXDBcMVw1XDE3XDBcMVwzIisKLSAgICAiXDE2XDBcMVwxXDIwXDBcMVwzXDE2XDBcMVwxXDFcMlwxNzBcMFwxXDJcdWZlODdcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOwotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotCi0KLQotCXB1YmxpYyBDU1NIZWFkVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCSAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgewotCSAgCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkgIAl5eV9yZWFkZXIgPSBpbjsKLQotICAJCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgCQl5eV9zdGF0ZSA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIAkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAJCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgCQkgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIAkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAJCXl5X21hcmtlZFBvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICAJCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0gIAkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfc3RhcnRSZWFkID0gMDsKLQotICAJCS8qKiAKLSAgCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgCQkgKiBmcm9tIGlucHV0IAotICAJCSAqLwotICAJCXl5X2VuZFJlYWQgPSAwOwotCi0gIAkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIAkJeXlsaW5lID0gMDsKLQotICAJCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5Y2hhciA9IDA7Ci0KLSAgCQkvKioKLSAgCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydAotICAJCSAqIG9mIHRoZSBtYXRjaGVkIHRleHQKLSAgCQkgKi8KLSAgCQl5eWNvbHVtbiA9IDA7IAotCi0gIAkJLyoqIAotICAJCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIAotICAJCSAqIG9mIGEgbGluZQotICAJCSAqLwotICAJCXl5X2F0Qk9MID0gZmFsc2U7Ci0KLSAgCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIAkJeXlfYXRFT0YgPSBmYWxzZTsKLQotICAJCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAJCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotICAJCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0gIAkJCi0gIAkJaGFzTW9yZSA9IHRydWU7Ci0gIAkJCi0JCS8vIGl0cyBhIGxpdHRsZSB3YXN0ZWZ1bCB0byAidGhyb3cgYXdheSIgZmlyc3QgY2hhciBhcnJheSBnZW5lcmF0ZWQKLQkJLy8gYnkgY2xhc3MgaW5pdCAodmlhIGF1dG8gZ2VuZXJhdGVkIGNvZGUpLCBidXQgd2UgcmVhbGx5IGRvIHdhbnQKLQkJLy8gYSBzbWFsbCBidWZmZXIgZm9yIG91ciBoZWFkIHBhcnNlcnMuCi0JCWlmICh5eV9idWZmZXIubGVuZ3RoICE9IE1BWF9UT19TQ0FOKSB7Ci0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltNQVhfVE9fU0NBTl07Ci0JCX0KLSAgCQkKLQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQotCQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgQ1NTSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBDU1NIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTYwKSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotCi0gICAgU3lzdGVtLmV4aXQoMSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9kb19lb2YoKSB7Ci0gICAgaWYgKCF5eV9lb2ZfZG9uZSkgewotICAgICAgeXlfZW9mX2RvbmUgPSB0cnVlOwotICAgIAloYXNNb3JlPWZhbHNlOwotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICB5eV9hdEJPTCA9IHl5X21hcmtlZFBvcyA8PSAwIHx8IHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MtMV0gPT0gJ1xuJzsKLSAgICAgIGlmICgheXlfYXRCT0wgJiYgeXlfYnVmZmVyW3l5X21hcmtlZFBvcy0xXSA9PSAnXHInKSB7Ci0gICAgICAgIHl5X2F0Qk9MID0geXlfYWR2YW5jZSgpICE9ICdcbic7Ci0gICAgICAgIGlmICgheXlfYXRFT0YpIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIGlmICh5eV9hdEJPTCkKLSAgICAgICAgeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlKzFdOwotICAgICAgZWxzZQotICAgICAgICB5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGVdOwotCi0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eWNtYXBbeXlfaW5wdXRdOwotCi0gICAgICAgICAgYm9vbGVhbiB5eV9pc0ZpbmFsID0gZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiB5eV9ub0xvb2tBaGVhZCA9IGZhbHNlOwotCi0gICAgICAgICAgeXlfZm9yTmV4dDogeyBzd2l0Y2ggKHl5X3N0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDogeXlfc3RhdGUgPSA0MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDQ0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gNDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSA0NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDQ5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDUwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gNTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDUyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHl5X3N0YXRlID0gNTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSA1NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA1OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA2MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA2NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9zdGF0ZSA9IDY1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDY2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDY3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDY4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X3N0YXRlID0gNjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogeXlfc3RhdGUgPSA2OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA3MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X3N0YXRlID0gNjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA2OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDQ0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gNDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSA0NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDQ5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDUwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gNTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDQ5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDc1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHl5X3N0YXRlID0gNzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDUxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDc3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gNzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSA1NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDU1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDc5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSA1NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA4MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDgxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDgyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA2MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDYxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA4MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA3MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogeXlfc3RhdGUgPSA3NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA4NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB5eV9zdGF0ZSA9IDg1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA3ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA4NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDg3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA4MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA4ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9zdGF0ZSA9IDg5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogeXlfc3RhdGUgPSA4NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA5MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9zdGF0ZSA9IDkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA4NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA5MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDkzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfc3RhdGUgPSA4OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA5NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB5eV9zdGF0ZSA9IDk1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA5MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA5NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gOTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gOTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSA5OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHl5X3N0YXRlID0gOTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTAwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHl5X3N0YXRlID0gMTAxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTAzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSA5OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfc3RhdGUgPSAxMDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogeXlfc3RhdGUgPSAxMDE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEwNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9zdGF0ZSA9IDEwNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTAzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHl5X3N0YXRlID0gMTA1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X3N0YXRlID0gMTA3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSAxMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSAxMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDExMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX0lMTEVHQUxfU1RBVEUpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9IH0KLQotICAgICAgICAgIGlmICggeXlfaXNGaW5hbCApIHsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCB5eV9ub0xvb2tBaGVhZCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICBjYXNlIDY0OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDExOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICBjYXNlIDgzOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotICAgICAgICBjYXNlIDEyMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICBjYXNlIDU5OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFlZSU5JVElBTCk7ICBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBDU1NIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlJ1bGVFbmQ7IH0KLSAgICAgICAgY2FzZSAxMjE6IGJyZWFrOwotICAgICAgICBjYXNlIDM5OiAKLSAgICAgICAgY2FzZSA3MzogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSAxMjI6IGJyZWFrOwotICAgICAgICBjYXNlIDEwOTogCi0gICAgICAgIGNhc2UgMTEyOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApICB7eXliZWdpbihDSEFSU0VUX1JVTEUpOyByZXR1cm4gQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5DSEFSU0VUX1JVTEU7fSB9Ci0gICAgICAgIGNhc2UgMTIzOiBicmVhazsKLSAgICAgICAgY2FzZSA5NjogCi0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fSB9Ci0gICAgICAgIGNhc2UgMTI0OiBicmVhazsKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgIGNhc2UgMTE6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgIGNhc2UgMzc6IAotICAgICAgICAgIHsgaWYoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fSB9Ci0gICAgICAgIGNhc2UgMTI1OiBicmVhazsKLSAgICAgICAgY2FzZSA1NTogCi0gICAgICAgIGNhc2UgNzk6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyAgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDsgfQotICAgICAgICBjYXNlIDEyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE0OiAKLSAgICAgICAgY2FzZSAxMTY6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7IH0KLSAgICAgICAgY2FzZSAxMjc6IGJyZWFrOwotICAgICAgICBjYXNlIDM6IAotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSA1ODogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyB9Ci0gICAgICAgIGNhc2UgMTI4OiBicmVhazsKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFOyB9Ci0gICAgICAgIGNhc2UgMTI5OiBicmVhazsKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFOyB9Ci0gICAgICAgIGNhc2UgMTMwOiBicmVhazsKLSAgICAgICAgY2FzZSA3NDogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007IH0KLSAgICAgICAgY2FzZSAxMzE6IGJyZWFrOwotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgIGNhc2UgMzU6IAotICAgICAgICAgIHsgIHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7ICB9Ci0gICAgICAgIGNhc2UgMTMyOiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgIGNhc2UgNjM6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgIH0KLSAgICAgICAgY2FzZSAxMzM6IGJyZWFrOwotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgY2FzZSA2MjogCi0gICAgICAgICAgeyAgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDEzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICBjYXNlIDY3OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMTM1OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICAgIHsgIHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMTM2OiBicmVhazsKLSAgICAgICAgY2FzZSAzNjogCi0gICAgICAgIGNhc2UgNzE6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDEzNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzg6IAotICAgICAgICBjYXNlIDcyOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMTM4OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB5eV9kb19lb2YoKTsKLSAgICAgICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7IH0KLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0gIC8qKgotICAgKiBSdW5zIHRoZSBzY2FubmVyIG9uIGlucHV0IGZpbGVzLgotICAgKgotICAgKiBUaGlzIG1haW4gbWV0aG9kIGlzIHRoZSBkZWJ1Z2dpbmcgcm91dGluZSBmb3IgdGhlIHNjYW5uZXIuCi0gICAqIEl0IHByaW50cyBlYWNoIHJldHVybmVkIHRva2VuIHRvIFN5c3RlbS5vdXQgdW50aWwgdGhlIGVuZCBvZgotICAgKiBmaWxlIGlzIHJlYWNoZWQsIG9yIGFuIGVycm9yIG9jY3VyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBhcmd2ICAgdGhlIGNvbW1hbmQgbGluZSwgY29udGFpbnMgdGhlIGZpbGVuYW1lcyB0byBydW4KLSAgICogICAgICAgICAgICAgICB0aGUgc2Nhbm5lciBvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHsKLSAgICAgIENTU0hlYWRUb2tlbml6ZXIgc2Nhbm5lciA9IG51bGw7Ci0gICAgICB0cnkgewotICAgICAgICBzY2FubmVyID0gbmV3IENTU0hlYWRUb2tlbml6ZXIoIG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJndltpXSkgKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQgOiBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb3BlbmluZyBmaWxlIFwiIithcmd2W2ldKyJcIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIDogamF2YSBDU1NIZWFkVG9rZW5pemVyIDxpbnB1dGZpbGU+Iik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotCi0gICAgICB0cnkgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNjYW5uZXIucHJpbUdldE5leHRUb2tlbigpKTsKLSAgICAgICAgfSB3aGlsZSAoIXNjYW5uZXIueXlfYXRFT0YpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplckdlbkphdmEuY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjA2ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1AZWNobyBvZmYNCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbmVlZCB0byBiZSBzZXQvc3BlY2lmaWVkIGZvciBlYWNoICJkZXZlbG9wbWVudCBtYWNoaW5lIg0KLXNldCBQQVRIPSVQQVRIJTtkOmpka3NcajJzZGsxLjQuMV8wMlxiaW4NCi1zZXQgV09SS1NQQUNFX0xPQ0FUSU9OPUQ6XGJ1aWxkc1xXb3Jrc3BhY2VzXFB1cmVIZWFkV29ya3NwYWNlDQotc2V0IEpGTEVYX0xJQl9MT0NBVElPTj1EOlxEZXZUaW1lU3VwcG9ydFxKRmxleFxsaWINCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgZGlmZmVyIGZyb20gcHJvamVjdCB0byBwcm9qZWN0LCBidXQgc2hvdWxkIGJlIG90aGVyd2lzZSBjb25zdGFudA0KLXNldCBNQUlOX05BTUU9Q1NTSGVhZFRva2VuaXplcg0KLXNldCBQUk9KRUNUX1NSQz1cb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWNcc3JjXA0KLXNldCBQQUNLQUdFX0RJUj1jb21caWJtXGVuY29kaW5nXHJlc291cmNlXGNvbnRlbnRzcGVjaWZpY1xjc3NcDQotDQotcmVtIEdpdmVuIHRoZSBhYm92ZSAiZnJhbWV3b3JrIiBhbmQgdGhlIGNvbW1hbmQgdGhlbXNlbHZlcywgdGhlc2UgdmFyaWFibGVzIHNob3VsZCBuZXZlciBuZWVkIHRvIGJlIG1vZGlmaWVkDQotc2V0IEpBVkFfRklMRT0lTUFJTl9OQU1FJS5qYXZhDQotc2V0IEpGTEVYX1JVTEVTPSVNQUlOX05BTUUlLmpmbGV4DQotc2V0IFNLRUxFVE9OX0ZJTEU9JU1BSU5fTkFNRSUuc2tlbGV0b24NCi0NCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBkZWwgJUpBVkFfRklMRSUNCi1yZW0gamF2YSAtWG14NDcwMDAwMDAwIC1jcCAlSkZMRVhfTElCX0xPQ0FUSU9OJVxzZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlIC1za2VsICVTS0VMRVRPTl9GSUxFJSAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBjb3B5ICVKQVZBX0ZJTEUlICVXT1JLU1BBQ0VfTE9DQVRJT04lJVBST0pFQ1RfU1JDJSVQQUNLQUdFX0RJUiUlSkFWQV9GSUxFJQ0KLQ0KLXJlbSBwYXVzZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvamZsZXhlcnIudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9qZmxleG91dC50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA3NDNjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotUmVhZGluZyAiQ1NTSGVhZFRva2VuaXplci5qZmxleCIKLUNvbnN0cnVjdGluZyBORkEgOiA0NTggc3RhdGVzIGluIE5GQQotQ29udmVydGluZyBORkEgdG8gREZBIDogCi0uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0xMDIgc3RhdGVzIGJlZm9yZSBtaW5pbWl6YXRpb24sIDY0IHN0YXRlcyBpbiBtaW5pbWl6ZWQgREZBCi1Xcml0aW5nIGNvZGUgdG8gIkNTU0hlYWRUb2tlbml6ZXIuamF2YSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmpGbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXIuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMTFhNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXIuakZsZXgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qbmxzWFhYKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOw0KLQ0KLQ0KLQ0KLSUlDQotDQotJXsNCi0NCi0NCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOw0KLQlwcml2YXRlIGJvb2xlYW4gaGFzQ2hhcnNldEF0dHIgPSBmYWxzZTsNCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsNCi0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZw0KLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7DQotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7DQotCWJvb2xlYW4gZm91bmRDb250ZW50VHlwZVZhbHVlID0gZmFsc2U7DQotDQotDQotDQotCXB1YmxpYyBIVE1MSGVhZFRva2VuaXplcigpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7DQotCSAgCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8NCi0JICAJeXlfcmVhZGVyID0gaW47DQotDQotICAJCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8NCi0gIAkJeXlfc3RhdGUgPSAwOw0KLQ0KLSAgCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotICAJCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7DQotDQotICAJCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMNCi0gIAkJIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLw0KLSAgCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsNCi0NCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8NCi0gIAkJeXlfbWFya2VkUG9zID0gMDsNCi0NCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8NCi0gIAkJeXlfcHVzaGJhY2tQb3MgPSAwOw0KLQ0KLSAgCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0gIAkJeXlfY3VycmVudFBvcyA9IDA7DQotDQotICAJCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLw0KLSAgCQl5eV9zdGFydFJlYWQgPSAwOw0KLQ0KLSAgCQkvKiogDQotICAJCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZA0KLSAgCQkgKiBmcm9tIGlucHV0IA0KLSAgCQkgKi8NCi0gIAkJeXlfZW5kUmVhZCA9IDA7DQotDQotICAJCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLSAgCQkvLyB5eWxpbmUgPSAwOw0KLQ0KLSAgCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIAkJeXljaGFyID0gMDsNCi0NCi0gIAkJLyoqDQotICAJCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0DQotICAJCSAqIG9mIHRoZSBtYXRjaGVkIHRleHQNCi0gIAkJICovDQotICAJCS8vIHl5Y29sdW1uID0gMDsgDQotDQotICAJCS8qKiANCi0gIAkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgDQotICAJCSAqIG9mIGEgbGluZQ0KLSAgCQkgKi8NCi0gIAkJeXlfYXRCT0wgPSBmYWxzZTsNCi0NCi0gIAkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLw0KLSAgCQl5eV9hdEVPRiA9IGZhbHNlOw0KLQ0KLSAgCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8NCi0gIAkJeXlfZW9mX2RvbmUgPSBmYWxzZTsNCi0NCi0NCi0gIAkJZlN0YXRlU3RhY2suY2xlYXIoKTsNCi0gIAkJDQotICAJCWhhc01vcmUgPSB0cnVlOw0KLSAgCQloYXNDaGFyc2V0QXR0ciA9IGZhbHNlOw0KLSAgCQkNCi0JCS8vIGl0cyBhIGxpdHRsZSB3YXN0ZWZ1bCB0byAidGhyb3cgYXdheSIgZmlyc3QgY2hhciBhcnJheSBnZW5lcmF0ZWQNCi0JCS8vIGJ5IGNsYXNzIGluaXQgKHZpYSBhdXRvIGdlbmVyYXRlZCBjb2RlKSwgYnV0IHdlIHJlYWxseSBkbyB3YW50DQotCQkvLyBhIHNtYWxsIGJ1ZmZlciBmb3Igb3VyIGhlYWQgcGFyc2Vycy4NCi0JCWlmICh5eV9idWZmZXIubGVuZ3RoICE9IE1BWF9UT19TQ0FOKSB7DQotCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbTUFYX1RPX1NDQU5dOw0KLQkJfQ0KLSAgCQkNCi0NCi0gIAl9DQotDQotDQotCXB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsNCi0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJfQ0KLQkJY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7DQotCQkJaGFzTW9yZSA9IGZhbHNlOw0KLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlVOREVGSU5FRCwgeXljaGFyLCB5eXRleHQoKSk7DQotCQkJd2hpbGUoeXlfYWR2YW5jZSgpICE9IFlZRU9GKSB7fQ0KLQkJCXJldHVybiByZXN1bHQ7DQotCQl9DQotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsNCi0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7DQotCQkJdmFsdWVUZXh0ID0gbnVsbDsNCi0JCX0gZWxzZSB7DQotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7DQotCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7DQotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsNCi0JfQ0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsNCi0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0NCi0JfQ0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNDaGFyc2V0QXR0cigpIHsNCi0JCXJldHVybiBoYXNDaGFyc2V0QXR0cjsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7DQotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JfQ0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgew0KLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOw0KLQl9DQotCQ0KLQ0KLSV9DQotDQotJWVvZnsNCi0JaGFzTW9yZT1mYWxzZTsNCi0lZW9mfQ0KLQ0KLSVwdWJsaWMNCi0lY2xhc3MgSFRNTEhlYWRUb2tlbml6ZXINCi0lZnVuY3Rpb24gcHJpbUdldE5leHRUb2tlbg0KLSV0eXBlIFN0cmluZw0KLSVjaGFyDQotJXVuaWNvZGUNCi0laWdub3JlY2FzZSANCi0vLyVkZWJ1Zw0KLSVzd2l0Y2gNCi0NCi0NCi1VVEYxNkJFID0gXHhGRVx4RkYNCi1VVEYxNkxFID0gXHhGRlx4RkUNCi1VVEY4M0J5dGVCT00gPSBceEVGXHhCQlx4QkYNCi0NCi1TcGFjZUNoYXIgPSBbXHgyMFx4MDldDQotDQotDQotDQotLy8gWzNdIFMgOjo9ICgweDIwIHwgMHg5IHwgMHhEIHwgMHhBKSsNCi1TID0gW1x4MjBceDA5XHgwRFx4MEFdDQotDQotLy8gQmVnaW5BdHRyaWJlVmFsdWUgPSB7U30qIFw9IHtTfSoNCi0NCi1MaW5lVGVybWluYXRvciA9IFxyfFxuDQotDQotWiA9IChceDAwKT8NCi1TX1VURiA9IHtafXtTfXtafQ0KLUJlZ2luQXR0cmlidXRlVmFsdWVVVEYgPSB7U19VVEZ9KiBcPSB7U19VVEZ9Kg0KLQ0KLSVzdGF0ZSBTVF9YTUxEZWNsDQotJXN0YXRlIFNUX01FVEFfVEFHDQotJXN0YXRlIFF1b3RlZEF0dHJpYnV0ZVZhbHVlDQotJXN0YXRlIERRX1NUUklORw0KLSVzdGF0ZSBTUV9TVFJJTkcNCi0lc3RhdGUgVW5EZWxpbWl0ZWRTdHJpbmcNCi0lc3RhdGUgVW5EZWxpbWl0ZWRDaGFyc2V0DQotDQotJSUNCi0NCi0NCi08WVlJTklUSUFMPiAgDQotew0KLQl7VVRGMTZCRX0gICAJCXtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFO30NCi0Je1VURjE2TEV9ICAgCQl7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTt9DQotCXtVVEY4M0J5dGVCT019ICAgCXtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007fQ0KLQ0KLQkvLyBmb3JjZSB0byBiZSBzdGFydGVkIG9uIGZpcnN0IGxpbmUsIGJ1dCB3ZSBkbyBhbGxvdyBwcmVjZWVkaW5nIHNwYWNlcw0KLQleIHtTX1VURn0qICh7Wn08e1p9XD97Wn14e1p9bXtafWx7Wn0pe1NfVVRGfSsge2lmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fX0NCi0JKHtafTx7Wn1Ne1p9RXtafVR7Wn1Be1p9KSAgICAgICB7eXliZWdpbihTVF9NRVRBX1RBRyk7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnU3RhcnQ7fQ0KLQkNCi0NCi19CQ0KLQkNCi08U1RfWE1MRGVjbD4gDQotew0KLQkvLyJ2ZXJzaW9uIiB7QmVnaW5BdHRyaWJlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsVmVyc2lvbjt9DQotCSh7Wn1le1p9bntafWN7Wn1ve1p9ZHtafWl7Wn1ue1p9Z3tafSkge0JlZ2luQXR0cmlidXRlVmFsdWVVVEZ9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzt9DQotCS8vIG5vdGUgdGhpcyAiZm9yY2VkIGVuZCIgb25jZSBlbmQgb2YgWE1MIERlY2xhcmF0aW9uIGZvdW5kDQotCSh7Wn1cP3tafT57Wn0pICAgIHt5eWJlZ2luKFlZSU5JVElBTCk7ICByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kO30NCi19CQ0KLQ0KLTxTVF9NRVRBX1RBRz4gDQotew0KLQ0KLS8vCSJodHRwLWVxdWl2IiB7U30qIFw9IHtTfSogXCI/ICJDb250ZW50LVR5cGUiIFwiPyB7U30rICJjb250ZW50IiB7QmVnaW5BdHRyaWJlVmFsdWV9ICB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgZm91bmRDb250ZW50VHlwZVZhbHVlPXRydWU7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnQ29udGVudFR5cGU7fQ0KLQl7Wn1oe1p9dHtafXR7Wn1we1p9LXtafWV7Wn1xe1p9dXtafWl7Wn12e1p9IHtTX1VURn0qIFw9IHtTX1VURn0qIHtafVwiP3tafSAoe1p9Q3tafW97Wn1ue1p9dHtafWV7Wn1ue1p9dHtafS17Wn1Ue1p9eXtafXB7Wn1le1p9KSBcIj97Wn0gKHtTX1VURn0pKyAoe1p9Y3tafW97Wn1ue1p9dHtafWV7Wn1ue1p9dHtafSkge0JlZ2luQXR0cmlidXRlVmFsdWVVVEZ9ICB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgZm91bmRDb250ZW50VHlwZVZhbHVlPXRydWU7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnQ29udGVudFR5cGU7fQ0KLQl7Wn1je1p9aHtafWF7Wn1ye1p9c3tafWV7Wn10e1p9IHtCZWdpbkF0dHJpYnV0ZVZhbHVlVVRGfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgZm91bmRDb250ZW50VHlwZVZhbHVlPXRydWU7IGhhc0NoYXJzZXRBdHRyPXRydWU7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnQ29udGVudFR5cGU7fQ0KLQl7Wn0+e1p9ICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyAgaWYgKGZvdW5kQ29udGVudFR5cGVWYWx1ZSkgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ0VuZDt9DQotCXtafVwve1p9PntafSAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgaWYgKGZvdW5kQ29udGVudFR5cGVWYWx1ZSkgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ0VuZDt9DQotfQ0KLQkNCi0NCi08UXVvdGVkQXR0cmlidXRlVmFsdWU+DQotew0KLQl7Wn1cIntafSAgICAgICAgICAgIHsgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9DQotCXtafVwne1p9CQkJeyB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0NCi0JLy8gaW4gdGhpcyBzdGF0ZSwgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHNwYWNlIGNoYXJhY3RlciBjYW4gc3RhcnQgYW4gdW5kZWxpbWl0ZWQgc3RyaW5nDQotCXtTX1VURn0qLiAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTt9DQotDQotfQkNCi0NCi0NCi08RFFfU1RSSU5HPg0KLXsNCi0NCi0Je1p9XCJ7Wn0gICAgICAgICAgICAgICAgICAgICAgeyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOyB9DQotICAJe1p9e0xpbmVUZXJtaW5hdG9yfXtafSAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafVw/e1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9PHtafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQkNCi0Je1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn1cL3tafT57Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCVteXHgwMF0JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0NCi0NCi0NCi19DQotDQotPFNRX1NUUklORz4NCi17DQotDQotCXtafVwne1p9ICAgICAgICAgICAgICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTt9DQotICAJe1p9e0xpbmVUZXJtaW5hdG9yfXtafSAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafSV7Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafTx7Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn1cL3tafT57Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCVteXHgwMF0JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0NCi0NCi0NCi19DQotDQotPFVuRGVsaW1pdGVkU3RyaW5nPg0KLXsNCi0NCi0NCi0JLy8gbm90ZSB0aGlzIGluaXRpYWwgc3BlY2lhbCBjYXNlIGZvciBIVFRQIGNvbnRlbnR0eXBlIHZhbHVlcw0KLQkvLyBMb29rIGFoZWFkIGFuZCBzZWUgaWYgdGhlcmUgYXJlIHNwYWNlcywgYnV0IGRvbid0IGFwcGVuZCB0aGUgc3BhY2VzIGFzIHRoZXkgbWF5IGJlIGRvdWJsZS1ieXRlDQotCS8vIExldCB0aGUgbmV4dCBzdGF0ZSBoYW5kbGUgcmVtb3ZhbCBvZiB0aGUgXHgwMCBhbmQgcHJvcGVybHkgYXBwZW5kIHNwYWNlcw0KLQkiOyIve1NfVVRGfSoJCQl7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihVbkRlbGltaXRlZENoYXJzZXQpOyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9DQotCXtTX1VURn0gICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9DQotICAJe1p9e0xpbmVUZXJtaW5hdG9yfXtafSAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafVw/e1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn08e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCS8vIHRoZXNlIGFyZSBhIGJpdCBzcGVjaWFsLCBzaW5jZSB3ZSBzdGFydGVkIGFuIHVuZGVsaW1pdCBzdHJpbmcsIGJ1dCBmb3VuZCBhIHF1b3RlIC4uLiBwcm9iYWJseSBpbmRpY2F0ZXMgYSBtaXNzaW5nIGJlZ2lubmluZyBxdW90ZQ0KLQl7Wn1cJ3tafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn1cIntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7fQ0KLQkNCi0Je1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn1cL3tafT57Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCVteXHgwMF0JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0NCi0NCi19DQotDQotPFVuRGVsaW1pdGVkQ2hhcnNldD4NCi17DQotCXtTfSB7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0NCi0JLy8gRm9yIG5vbiBceDAwIGNoYXJhY3RlcnMsIGxldCB0aGUgcHJldmlvdXMgc3RhdGUgaGFuZGxlIGl0DQotCVteXHgwMF0ge3l5cHVzaGJhY2soMSk7IHBvcFN0YXRlKCk7IH0NCi19DQotDQotLy8gVGhlICJtYXRjaCBhbnl0aGluZyIgcnVsZSBzaG91bGQgYWx3YXlzIGJlIGluIGVmZmVjdCBleGNlcHQgZm9yIHdoZW4gbG9va2luZyBmb3IgZW5kIG9mIHN0cmluZw0KLS8vIChUaGF0IGlzLCByZW1lbWJlciB0byB1cGRhdGUgc3RhdGUgbGlzdCBpZi93aGVuIG5ldyBzdGF0ZXMgYWRkZWQpDQotLnxcbgl7aWYoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fX0NCi0NCi0vLyB0aGlzIHJ1bGUgYWx3YXlzIGluIGVmZmVjdA0KLTw8RU9GPj4gICAgICAgICB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GO30NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdkNmM4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDEvMjcvMDQgNjo0MSBQTSAqLwotCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLmh0bWw7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkhlYWRQYXJzZXJUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5JbnRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy54bWwuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4PC9hPiAxLjIuMgotICogb24gMS8yNy8wNCA2OjQxIFBNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PmZpbGU6L0Q6L0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxIZWFkVG9rZW5pemVyIHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfTUVUQV9UQUcgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBVbkRlbGltaXRlZFN0cmluZyA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBEUV9TVFJJTkcgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTUV9TVFJJTkcgPSAxMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFF1b3RlZEF0dHJpYnV0ZVZhbHVlID0gNjsKLQotICAvKioKLSAgICogWVlfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogWVlfTEVYU1RBVEVbbCsxXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqIGwgaXMgb2YgdGhlIGZvcm0gbCA9IDIqaywgayBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgWVlfTEVYU1RBVEVbXSA9IHsgCi0gICAgIDAsICAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsIDcKLSAgfTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw2XDFcN1wyXDBcMVwxMVwyMlwwXDFcMjJcMVwwXDFcNDBcMlwwIisKLSAgICAiXDFcNDRcMVwwXDFcNDNcNVwwXDFcMzRcMVwwXDFcNDJcMTNcMFwxXDQ1XDFcMTIiKwotICAgICJcMVwxMFwxXDMxXDFcMTNcMVwwXDFcMjFcMVwwXDFcMjRcMVwyNlwxXDE3XDFcMCIrCi0gICAgIlwxXDMwXDFcMzJcMVwyN1wyXDBcMVwxNlwxXDE1XDFcMjNcMVwyNVwxXDMzXDFcMzUiKwotICAgICJcMlwwXDFcMjBcMVwzNlwxXDM3XDFcMFwxXDE0XDFcNDFcN1wwXDFcMjFcMVwwIisKLSAgICAiXDFcMjRcMVwyNlwxXDE3XDFcMFwxXDMwXDFcMzJcMVwyN1wyXDBcMVwxNlwxXDE1IisKLSAgICAiXDFcMjNcMVwyNVwxXDMzXDFcMzVcMlwwXDFcMjBcMVwzNlwxXDM3XDFcMFwxXDE0IisKLSAgICAiXDFcNDFcMTAxXDBcMVw0XDNcMFwxXDVcMTdcMFwxXDNcMTZcMFwxXDFcMjBcMCIrCi0gICAgIlwxXDNcMTZcMFwxXDFcMVwyXDE3MFwwXDFcMlx1ZmU4N1wwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDgwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0JYm9vbGVhbiBmb3VuZENvbnRlbnRUeXBlVmFsdWUgPSBmYWxzZTsKLQotCi0KLQlwdWJsaWMgSFRNTEhlYWRUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7Ci0JICAJLyogdGhlIGlucHV0IGRldmljZSAqLwotCSAgCXl5X3JlYWRlciA9IGluOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICAJCXl5X3N0YXRlID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIAkJLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAJCSB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIAkJeXlfbWFya2VkUG9zID0gMDsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIAkJeXlfcHVzaGJhY2tQb3MgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfY3VycmVudFBvcyA9IDA7Ci0KLSAgCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9zdGFydFJlYWQgPSAwOwotCi0gIAkJLyoqIAotICAJCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAJCSAqIGZyb20gaW5wdXQgCi0gIAkJICovCi0gIAkJeXlfZW5kUmVhZCA9IDA7Ci0KLSAgCQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWxpbmUgPSAwOwotCi0gIAkJLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIAkJeXljaGFyID0gMDsKLQotICAJCS8qKgotICAJCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0Ci0gIAkJICogb2YgdGhlIG1hdGNoZWQgdGV4dAotICAJCSAqLwotICAJCXl5Y29sdW1uID0gMDsgCi0KLSAgCQkvKiogCi0gIAkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgCi0gIAkJICogb2YgYSBsaW5lCi0gIAkJICovCi0gIAkJeXlfYXRCT0wgPSBmYWxzZTsKLQotICAJCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgCQl5eV9hdEVPRiA9IGZhbHNlOwotCi0gIAkJLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIAkJeXlfZW9mX2RvbmUgPSBmYWxzZTsKLQotCi0gIAkJZlN0YXRlU3RhY2suY2xlYXIoKTsKLSAgCQkKLSAgCQloYXNNb3JlID0gdHJ1ZTsKLSAgCQkKLQkJLy8gaXRzIGEgbGl0dGxlIHdhc3RlZnVsIHRvICJ0aHJvdyBhd2F5IiBmaXJzdCBjaGFyIGFycmF5IGdlbmVyYXRlZAotCQkvLyBieSBjbGFzcyBpbml0ICh2aWEgYXV0byBnZW5lcmF0ZWQgY29kZSksIGJ1dCB3ZSByZWFsbHkgZG8gd2FudAotCQkvLyBhIHNtYWxsIGJ1ZmZlciBmb3Igb3VyIGhlYWQgcGFyc2Vycy4KLQkJaWYgKHl5X2J1ZmZlci5sZW5ndGggIT0gTUFYX1RPX1NDQU4pIHsKLQkJCXl5X2J1ZmZlciA9IG5ldyBjaGFyW01BWF9UT19TQ0FOXTsKLQkJfQotICAJCQotCi0gIAl9Ci0KLQotCXB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7Ci0JCQl2YWx1ZVRleHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7Ci0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3BTdGF0ZSgpIHsKLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JfQotCXByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBuZXcgSGVhZFBhcnNlclRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0KTsKLQl9Ci0JCi0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBIVE1MSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBIVE1MSGVhZFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE3NCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLQotICAgIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotICAgIGlmICgheXlfZW9mX2RvbmUpIHsKLSAgICAgIHl5X2VvZl9kb25lID0gdHJ1ZTsKLSAgICAJaGFzTW9yZT1mYWxzZTsKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotCi0gICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgeXljaGFyKz0geXlsZW5ndGgoKTsKLQotICAgICAgeXlfYXRCT0wgPSB5eV9tYXJrZWRQb3MgPD0gMCB8fCB5eV9idWZmZXJbeXlfbWFya2VkUG9zLTFdID09ICdcbic7Ci0gICAgICBpZiAoIXl5X2F0Qk9MICYmIHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MtMV0gPT0gJ1xyJykgewotICAgICAgICB5eV9hdEJPTCA9IHl5X2FkdmFuY2UoKSAhPSAnXG4nOwotICAgICAgICBpZiAoIXl5X2F0RU9GKSB5eV9jdXJyZW50UG9zLS07Ci0gICAgICB9Ci0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOwotCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0gICAgICBpZiAoeXlfYXRCT0wpCi0gICAgICAgIHl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZSsxXTsKLSAgICAgIGVsc2UKLSAgICAgICAgeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlXTsKLQotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOwotCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLQotICAgICAgICAgIHl5X2lucHV0ID0geXljbWFwW3l5X2lucHV0XTsKLQotICAgICAgICAgIGJvb2xlYW4geXlfaXNGaW5hbCA9IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4geXlfbm9Mb29rQWhlYWQgPSBmYWxzZTsKLQotICAgICAgICAgIHl5X2Zvck5leHQ6IHsgc3dpdGNoICh5eV9zdGF0ZSkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxMDogCi0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzY6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogCi0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDMwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IAotICAgICAgICAgICAgICAgIGNhc2UgMzU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6IHl5X3N0YXRlID0gMzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB5eV9zdGF0ZSA9IDM2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSAzNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogeXlfc3RhdGUgPSAzNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDM5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gNDE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDQyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X3N0YXRlID0gNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfc3RhdGUgPSA0NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA0ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gMzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSAzODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gMzk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDQ5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA1MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9zdGF0ZSA9IDQ0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB5eV9zdGF0ZSA9IDUzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSA1NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHl5X3N0YXRlID0gNTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDU2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogeXlfc3RhdGUgPSA1NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHl5X3N0YXRlID0gNTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9zdGF0ZSA9IDU5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDYxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfc3RhdGUgPSA2MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X3N0YXRlID0gNjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gNjQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9zdGF0ZSA9IDY1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSA2NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X3N0YXRlID0gNjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDY2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB5eV9zdGF0ZSA9IDY5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9zdGF0ZSA9IDcwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA3MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDcxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gNzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfc3RhdGUgPSA3MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHl5X3N0YXRlID0gNzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDcyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA3NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9zdGF0ZSA9IDc3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA3ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNzk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9zdGF0ZSA9IDgwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA4MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X3N0YXRlID0gODI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB5eV9zdGF0ZSA9IDgzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA4NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gODU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfc3RhdGUgPSA4NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gODU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA4NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gODU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9zdGF0ZSA9IDg4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA4OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gOTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9zdGF0ZSA9IDkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA5MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gOTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDkzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX0lMTEVHQUxfU1RBVEUpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9IH0KLQotICAgICAgICAgIGlmICggeXlfaXNGaW5hbCApIHsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCB5eV9ub0xvb2tBaGVhZCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgOTY6IGJyZWFrOwotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLSAgICAgICAgY2FzZSA5NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgIGlmIChmb3VuZENvbnRlbnRUeXBlVmFsdWUpIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdFbmQ7IH0KLSAgICAgICAgY2FzZSA5ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgOTk6IGJyZWFrOwotICAgICAgICBjYXNlIDQzOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFlZSU5JVElBTCk7IGlmIChmb3VuZENvbnRlbnRUeXBlVmFsdWUpIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdFbmQ7IH0KLSAgICAgICAgY2FzZSAxMDA6IGJyZWFrOwotICAgICAgICBjYXNlIDQ1OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSAxMDE6IGJyZWFrOwotICAgICAgICBjYXNlIDQ2OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDEwMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9IH0KLSAgICAgICAgY2FzZSAxMDM6IGJyZWFrOwotICAgICAgICBjYXNlIDg6IAotICAgICAgICBjYXNlIDk6IAotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9IH0KLSAgICAgICAgY2FzZSAxMDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDYwOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfTUVUQV9UQUcpOyByZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ1N0YXJ0OyB9Ci0gICAgICAgIGNhc2UgMTA1OiBicmVhazsKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7ICByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kOyB9Ci0gICAgICAgIGNhc2UgMTA2OiBicmVhazsKLSAgICAgICAgY2FzZSA5NDogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyBmb3VuZENvbnRlbnRUeXBlVmFsdWU9dHJ1ZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdDb250ZW50VHlwZTsgfQotICAgICAgICBjYXNlIDEwNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7IH0KLSAgICAgICAgY2FzZSAxMDg6IGJyZWFrOwotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7IH0KLSAgICAgICAgY2FzZSAxMDk6IGJyZWFrOwotICAgICAgICBjYXNlIDM0OiAKLSAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7IH0KLSAgICAgICAgY2FzZSAxMTA6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3OiAKLSAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTsgfQotICAgICAgICBjYXNlIDExMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICAgIHsgIHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMTEyOiBicmVhazsKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgICAgeyAgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgIH0KLSAgICAgICAgY2FzZSAxMTM6IGJyZWFrOwotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7ICB9Ci0gICAgICAgIGNhc2UgMTE0OiBicmVhazsKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgICAgeyAgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDExNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDExNjogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GOyB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotICAvKioKLSAgICogUnVucyB0aGUgc2Nhbm5lciBvbiBpbnB1dCBmaWxlcy4KLSAgICoKLSAgICogVGhpcyBtYWluIG1ldGhvZCBpcyB0aGUgZGVidWdnaW5nIHJvdXRpbmUgZm9yIHRoZSBzY2FubmVyLgotICAgKiBJdCBwcmludHMgZWFjaCByZXR1cm5lZCB0b2tlbiB0byBTeXN0ZW0ub3V0IHVudGlsIHRoZSBlbmQgb2YKLSAgICogZmlsZSBpcyByZWFjaGVkLCBvciBhbiBlcnJvciBvY2N1cmVkLgotICAgKgotICAgKiBAcGFyYW0gYXJndiAgIHRoZSBjb21tYW5kIGxpbmUsIGNvbnRhaW5zIHRoZSBmaWxlbmFtZXMgdG8gcnVuCi0gICAqICAgICAgICAgICAgICAgdGhlIHNjYW5uZXIgb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICBIVE1MSGVhZFRva2VuaXplciBzY2FubmVyID0gbnVsbDsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHNjYW5uZXIgPSBuZXcgSFRNTEhlYWRUb2tlbml6ZXIoIG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJndltpXSkgKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQgOiBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb3BlbmluZyBmaWxlIFwiIithcmd2W2ldKyJcIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIDogamF2YSBIVE1MSGVhZFRva2VuaXplciA8aW5wdXRmaWxlPiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLQotICAgICAgdHJ5IHsKLSAgICAgICAgZG8gewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzY2FubmVyLnByaW1HZXROZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0gd2hpbGUgKCFzY2FubmVyLnl5X2F0RU9GKTsKLQotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFuIEkvTyBlcnJvciBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIDoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplckdlbkphdmEuY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXJHZW5KYXZhLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmMjMyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplckdlbkphdmEuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotQGVjaG8gb2ZmDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG5lZWQgdG8gYmUgc2V0L3NwZWNpZmllZCBmb3IgZWFjaCAiZGV2ZWxvcG1lbnQgbWFjaGluZSINCi1zZXQgUEFUSD0lUEFUSCU7ZDpqZGtzXGoyc2RrMS40LjFfMDJcYmluDQotc2V0IFdPUktTUEFDRV9MT0NBVElPTj1EOlxidWlsZHNcV29ya3NwYWNlc1xQdXJlSGVhZFdvcmtzcGFjZQ0KLXNldCBKRkxFWF9MSUJfTE9DQVRJT049RDpcRGV2VGltZVN1cHBvcnRcSkZsZXhcbGliDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGRpZmZlciBmcm9tIHByb2plY3QgdG8gcHJvamVjdCwgYnV0IHNob3VsZCBiZSBvdGhlcndpc2UgY29uc3RhbnQNCi1zZXQgTUFJTl9OQU1FPUhUTUxIZWFkVG9rZW5pemVyDQotc2V0IFBST0pFQ1RfU1JDPVxvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpY1xzcmNcDQotc2V0IFBBQ0tBR0VfRElSPWNvbVxpYm1cZW5jb2RpbmdccmVzb3VyY2VcY29udGVudHNwZWNpZmljXGh0bWxcDQotDQotcmVtIEdpdmVuIHRoZSBhYm92ZSAiZnJhbWV3b3JrIiBhbmQgdGhlIGNvbW1hbmQgdGhlbXNlbHZlcywgdGhlc2UgdmFyaWFibGVzIHNob3VsZCBuZXZlciBuZWVkIHRvIGJlIG1vZGlmaWVkDQotc2V0IEpBVkFfRklMRT0lTUFJTl9OQU1FJS5qYXZhDQotc2V0IEpGTEVYX1JVTEVTPSVNQUlOX05BTUUlLmpmbGV4DQotc2V0IFNLRUxFVE9OX0ZJTEU9JU1BSU5fTkFNRSUuc2tlbGV0b24NCi0NCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBkZWwgJUpBVkFfRklMRSUNCi1yZW0gamF2YSAtWG14NDcwMDAwMDAwIC1jcCAlSkZMRVhfTElCX0xPQ0FUSU9OJVxzZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlIC1za2VsICVTS0VMRVRPTl9GSUxFJSAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBjb3B5ICVKQVZBX0ZJTEUlICVXT1JLU1BBQ0VfTE9DQVRJT04lJVBST0pFQ1RfU1JDJSVQQUNLQUdFX0RJUiUlSkFWQV9GSUxFJQ0KLQ0KLXJlbSBwYXVzZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL2pmbGV4ZXJyLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL2pmbGV4ZXJyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvamZsZXhvdXQudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvamZsZXhvdXQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDY5ZTljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotUmVhZGluZyAiSFRNTEhlYWRUb2tlbml6ZXIuamZsZXgiCi0KLVdhcm5pbmcgOiBNYWNybyAiU3BhY2VDaGFyIiBoYXMgYmVlbiBkZWNsYXJlZCBidXQgbmV2ZXIgdXNlZC4KLUNvbnN0cnVjdGluZyBORkEgOiA2NjAgc3RhdGVzIGluIE5GQQotQ29udmVydGluZyBORkEgdG8gREZBIDogCi0uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0xMzUgc3RhdGVzIGJlZm9yZSBtaW5pbWl6YXRpb24sIDk1IHN0YXRlcyBpbiBtaW5pbWl6ZWQgREZBCi1Xcml0aW5nIGNvZGUgdG8gIkhUTUxIZWFkVG9rZW5pemVyLmphdmEiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9za2VsZXRvbiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL3NrZWxldG9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTliM2Y3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL3NrZWxldG9uCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLQ0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovDQotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOw0KLQ0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovDQotLS0tICBsZXhpY2FsIHN0YXRlcywgY2hhcm1hcA0KLQ0KLSAgLyogZXJyb3IgY29kZXMgKi8NCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsNCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsNCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7DQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7DQotDQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovDQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7DQotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsDQotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsDQotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwNCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIg0KLSAgfTsNCi0NCi0tLS0gaXNGaW5hbCBsaXN0DQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLw0KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7DQotDQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7DQotDQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsNCi0NCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzDQotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovDQotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07DQotDQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8NCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsNCi0NCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7DQotDQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovDQotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOw0KLQ0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOw0KLQ0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZA0KLSAgICAgIGZyb20gaW5wdXQgKi8NCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7DQotDQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotICAvL3ByaXZhdGUgaW50IHl5bGluZTsNCi0NCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsNCi0NCi0gIC8qKg0KLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIA0KLSAgICogbWF0Y2hlZCB0ZXh0DQotICAgKi8NCi0gIC8vcHJpdmF0ZSBpbnQgeXljb2x1bW47IA0KLQ0KLSAgLyoqIA0KLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lDQotICAgKi8NCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsNCi0NCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovDQotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7DQotDQotLS0tIHVzZXIgY2xhc3MgY29kZQ0KLQ0KLSAgLyoqDQotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXINCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4NCi0gICAqDQotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4NCi0gICAqLw0KLS0tLSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbg0KLQ0KLQ0KLSAgLyoqDQotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4NCi0gICAqDQotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUNCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLg0KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3Vycw0KLSAgICovDQotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gew0KLQ0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovDQotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOw0KLQ0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIA0KLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsNCi0NCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovDQotDQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovDQotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7DQotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgDQotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOw0KLQ0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovDQotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOw0KLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9zdGFydFJlYWQgPSAwOw0KLSAgICB9DQotDQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8NCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgew0KLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLw0KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOw0KLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOw0KLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsNCi0gICAgfQ0KLQ0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8NCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsNCi0NCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOw0KLQ0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsNCi0NCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOw0KLSAgfQ0KLQ0KLSAgICANCi0gIC8qKg0KLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7DQotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLw0KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8NCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7DQotICB9DQotDQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4NCi0gICAqLw0KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgew0KLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUNCi0gICAqDQotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7DQotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsNCi0gIH0NCi0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4NCi0gICAqLw0KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7DQotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7DQotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOw0KLSAgfQ0KLQ0KLQ0KLSAgLyoqDQotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4NCi0gICAqDQotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQ0KLSAgICovDQotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsNCi0gICAgdHJ5IHsNCi0gICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW5zdGFuY2U6ICIgKyBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZSh0aGlzKSArICIgb2Zmc2V0OiIgKyB5eWNoYXIgKyAiIHN0YXRlOiIgKyB5eXN0YXRlKCkpOw0KLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSArICJcbiIgKyBpc2UpOw0KLSAgICAgIHRocm93IGlzZTsNCi0gICAgfQ0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsNCi0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsNCi0gICAgfQ0KLQ0KLSAgfSANCi0NCi0NCi0gIC8qKg0KLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uDQotICAgKg0KLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZA0KLSAgICoNCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLg0KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhDQotICAgKi8NCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsNCi0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkNCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7DQotDQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7DQotICB9DQotDQotDQotLS0tIHl5X2RvRW9mDQotICAvKioNCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsDQotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuDQotICAgKg0KLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuDQotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzDQotICAgKi8NCi0tLS0geXlsZXggZGVjbGFyYXRpb24NCi0gICAgaW50IHl5X2lucHV0Ow0KLSAgICBpbnQgeXlfYWN0aW9uOw0KLQ0KLS0tLSBsb2NhbCBkZWNsYXJhdGlvbnMNCi0NCi0gICAgd2hpbGUgKHRydWUpIHsNCi0NCi0tLS0gc3RhcnQgYWRtaW4gKGxpbmUsIGNoYXIsIGNvbCBjb3VudCkNCi0gICAgICB5eV9hY3Rpb24gPSAtMTsNCi0NCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOw0KLQ0KLS0tLSBzdGFydCBhZG1pbiAobGV4c3RhdGUgZXRjKQ0KLQ0KLSAgICAgIHl5X2ZvckFjdGlvbjogew0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsNCi0gICAgDQotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOw0KLQ0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOw0KLQ0KLS0tLSBsaW5lLCBjb2wsIGNoYXIgY291bnQsIG5leHQgdHJhbnNpdGlvbiwgaXNGaW5hbCBhY3Rpb24NCi0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgDQotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgDQotLS0tIGxpbmUgY291bnQgdXBkYXRlDQotICAgICAgICAgIH0NCi0NCi0gICAgICAgIH0NCi0gICAgICB9DQotDQotLS0tIGNoYXIgY291bnQgdXBkYXRlDQotDQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgDQotDQotLS0tIGFjdGlvbnMNCi0gICAgICAgIGRlZmF1bHQ6IA0KLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsNCi0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7DQotLS0tIGVvZnZhbHVlDQotICAgICAgICAgIH0gDQotICAgICAgICAgIGVsc2Ugew0KLS0tLSBubyBtYXRjaA0KLSAgICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICB9ICAgIA0KLQ0KLS0tLSBtYWluDQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL3NrZWxldG9uLnJlYWRtZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL3NrZWxldG9uLnJlYWRtZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4OTcwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9za2VsZXRvbi5yZWFkbWUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVRoZSBza2VsZXRvbi5zZWQgZmlsZSBjb250YWlucyB0aGUgbW9kaWZpZWQgSkZsZXggMS4yLjIgc2tlbGV0b24gZmlsZSB3aXRoDQotY2hhbmdlcyBmb3IgdXNlIHdpdGggdGhlIHRva2VuaXplcnMgd2l0aGluIHRoZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUueG1sIGFuZA0KLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5qc3AgcGx1Z2lucy4NCi0NCi1UaGUgc2tlbGV0b24gZmlsZSdzIG1ldGhvZCBkZWZpbml0aW9ucyBhcmUgY29waWVkIGludG8gdGhlIGdlbmVyYXRlZCBvdXRwdXQNCi1kaXJlY3RseS4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXMuakZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXMuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMDczODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzLmpGbGV4CisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwyMDA4IElCTSBDb3Jwb3JhdGlvbiwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIGtiLmh1YW5nICAtIEJ1ZyAyMTQ0MTYgIERvdCBjaGFyIGlzIG5vdCBlc2NhcGVkIGluIFhNTDEwTmFtZXMuakZsZXgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotJSUKLQotJXRhYmxlCi0lcHVibGljCi0lZmluYWwKLSVjbGFzcyBYTUwxME5hbWVzCi0lZnVuY3Rpb24gaXNWYWxpZFhNTDEwTmFtZQotJXR5cGUgYm9vbGVhbgotJXVuaWNvZGUKLSVpZ25vcmVjYXNlCi0lYnVmZmVyIDIwNDgKLSVhcGlwcml2YXRlCi0KLUJhc2VDaGFyID0gW1x1MDA0MS1cdTAwNUFcdTAwNjEtXHUwMDdBXHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMEZGXHUwMTAwLVx1MDEzMVx1MDEzNC1cdTAxM0VcdTAxNDEtXHUwMTQ4XHUwMTRBLVx1MDE3RVx1MDE4MC1cdTAxQzNcdTAxQ0QtXHUwMUYwXHUwMUY0LVx1MDFGNVx1MDFGQS1cdTAyMTdcdTAyNTAtXHUwMkE4XHUwMkJCLVx1MDJDMVx1MDM4Nlx1MDM4OC1cdTAzOEFcdTAzOENcdTAzOEUtXHUwM0ExXHUwM0EzLVx1MDNDRVx1MDNEMC1cdTAzRDZcdTAzREFcdTAzRENcdTAzREVcdTAzRTBcdTAzRTItXHUwM0YzXHUwNDAxLVx1MDQwQ1x1MDQwRS1cdTA0NEZcdTA0NTEtXHUwNDVDXHUwNDVFLVx1MDQ4MVx1MDQ5MC1cdTA0QzRcdTA0QzctXHUwNEM4XHUwNENCLVx1MDRDQ1x1MDREMC1cdTA0RUJcdTA0RUUtXHUwNEY1XHUwNEY4LVx1MDRGOVx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg2XHUwNUQwLVx1MDVFQVx1MDVGMC1cdTA1RjJcdTA2MjEtXHUwNjNBXHUwNjQxLVx1MDY0QVx1MDY3MS1cdTA2QjdcdTA2QkEtXHUwNkJFXHUwNkMwLVx1MDZDRVx1MDZEMC1cdTA2RDNcdTA2RDVcdTA2RTUtXHUwNkU2XHUwOTA1LVx1MDkzOVx1MDkzRFx1MDk1OC1cdTA5NjFcdTA5ODUtXHUwOThDXHUwOThGLVx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlEQy1cdTA5RERcdTA5REYtXHUwOUUxXHUwOUYwLVx1MDlGMVx1MEEwNS1cdTBBMEFcdTBBMEYtXHUwQTEwXHUwQTEzLVx1MEEyOFx1MEEyQS1cdTBBMzBcdTBBMzItXHUwQTMzXHUwQTM1LVx1MEEzNlx1MEEzOC1cdTBBMzlcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTcyLVx1MEE3NFx1MEE4NS1cdTBBOEJcdTBBOERcdTBBOEYtXHUwQTkxXHUwQTkzLVx1MEFBOFx1MEFBQS1cdTBBQjBcdTBBQjItXHUwQUIzXHUwQUI1LVx1MEFCOVx1MEFCRFx1MEFFMFx1MEIwNS1cdTBCMENcdTBCMEYtXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzItXHUwQjMzXHUwQjM2LVx1MEIzOVx1MEIzRFx1MEI1Qy1cdTBCNURcdTBCNUYtXHUwQjYxXHUwQjg1LVx1MEI4QVx1MEI4RS1cdTBCOTBcdTBCOTItXHUwQjk1XHUwQjk5LVx1MEI5QVx1MEI5Q1x1MEI5RS1cdTBCOUZcdTBCQTMtXHUwQkE0XHUwQkE4LVx1MEJBQVx1MEJBRS1cdTBCQjVcdTBCQjctXHUwQkI5XHUwQzA1LVx1MEMwQ1x1MEMwRS1cdTBDMTBcdTBDMTItXHUwQzI4XHUwQzJBLVx1MEMzM1x1MEMzNS1cdTBDMzlcdTBDNjAtXHUwQzYxXHUwQzg1LVx1MEM4Q1x1MEM4RS1cdTBDOTBcdTBDOTItXHUwQ0E4XHUwQ0FBLVx1MENCM1x1MENCNS1cdTBDQjlcdTBDREVcdTBDRTAtXHUwQ0UxXHUwRDA1LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDI4XHUwRDJBLVx1MEQzOVx1MEQ2MC1cdTBENjFcdTBFMDEtXHUwRTJFXHUwRTMwXHUwRTMyLVx1MEUzM1x1MEU0MC1cdTBFNDVcdTBFODEtXHUwRTgyXHUwRTg0XHUwRTg3LVx1MEU4OFx1MEU4QVx1MEU4RFx1MEU5NC1cdTBFOTdcdTBFOTktXHUwRTlGXHUwRUExLVx1MEVBM1x1MEVBNVx1MEVBN1x1MEVBQS1cdTBFQUJcdTBFQUQtXHUwRUFFXHUwRUIwXHUwRUIyLVx1MEVCM1x1MEVCRFx1MEVDMC1cdTBFQzRcdTBGNDAtXHUwRjQ3XHUwRjQ5LVx1MEY2OVx1MTBBMC1cdTEwQzVcdTEwRDAtXHUxMEY2XHUxMTAwXHUxMTAyLVx1MTEwM1x1MTEwNS1cdTExMDdcdTExMDlcdTExMEItXHUxMTBDXHUxMTBFLVx1MTExMlx1MTEzQ1x1MTEzRVx1MTE0MFx1MTE0Q1x1MTE0RVx1MTE1MFx1MTE1NC1cdTExNTVcdTExNTlcdTExNUYtXHUxMTYxXHUxMTYzXHUxMTY1XHUxMTY3XHUxMTY5XHUxMTZELVx1MTE2RVx1MTE3Mi1cdTExNzNcdTExNzVcdTExOUVcdTExQThcdTExQUJcdTExQUUtXHUxMUFGXHUxMUI3LVx1MTFCOFx1MTFCQVx1MTFCQy1cdTExQzJcdTExRUJcdTExRjBcdTExRjlcdTFFMDAtXHUxRTlCXHUxRUEwLVx1MUVGOVx1MUYwMC1cdTFGMTVcdTFGMTgtXHUxRjFEXHUxRjIwLVx1MUY0NVx1MUY0OC1cdTFGNERcdTFGNTAtXHUxRjU3XHUxRjU5XHUxRjVCXHUxRjVEXHUxRjVGLVx1MUY3RFx1MUY4MC1cdTFGQjRcdTFGQjYtXHUxRkJDXHUxRkJFXHUxRkMyLVx1MUZDNFx1MUZDNi1cdTFGQ0NcdTFGRDAtXHUxRkQzXHUxRkQ2LVx1MUZEQlx1MUZFMC1cdTFGRUNcdTFGRjItXHUxRkY0XHUxRkY2LVx1MUZGQ1x1MjEyNlx1MjEyQS1cdTIxMkJcdTIxMkVcdTIxODAtXHUyMTgyXHUzMDQxLVx1MzA5NFx1MzBBMS1cdTMwRkFcdTMxMDUtXHUzMTJDXHVBQzAwLVx1RDdBM10KLQotSWRlb2dyYXBoaWMgPSBbXHU0RTAwLVx1OUZBNVx1MzAwN1x1MzAyMS1cdTMwMjldCi0KLUNvbWJpbmluZ0NoYXIgPSBbXHUwMzAwLVx1MDM0NVx1MDM2MC1cdTAzNjFcdTA0ODMtXHUwNDg2XHUwNTkxLVx1MDVBMVx1MDVBMy1cdTA1QjlcdTA1QkItXHUwNUJEXHUwNUJGXHUwNUMxLVx1MDVDMlx1MDVDNFx1MDY0Qi1cdTA2NTJcdTA2NzBcdTA2RDYtXHUwNkRDXHUwNkRELVx1MDZERlx1MDZFMC1cdTA2RTRcdTA2RTctXHUwNkU4XHUwNkVBLVx1MDZFRFx1MDkwMS1cdTA5MDNcdTA5M0NcdTA5M0UtXHUwOTRDXHUwOTREXHUwOTUxLVx1MDk1NFx1MDk2Mi1cdTA5NjNcdTA5ODEtXHUwOTgzXHUwOUJDXHUwOUJFXHUwOUJGXHUwOUMwLVx1MDlDNFx1MDlDNy1cdTA5QzhcdTA5Q0ItXHUwOUNEXHUwOUQ3XHUwOUUyLVx1MDlFM1x1MEEwMlx1MEEzQ1x1MEEzRVx1MEEzRlx1MEE0MC1cdTBBNDJcdTBBNDctXHUwQTQ4XHUwQTRCLVx1MEE0RFx1MEE3MC1cdTBBNzFcdTBBODEtXHUwQTgzXHUwQUJDXHUwQUJFLVx1MEFDNVx1MEFDNy1cdTBBQzlcdTBBQ0ItXHUwQUNEXHUwQjAxLVx1MEIwM1x1MEIzQ1x1MEIzRS1cdTBCNDNcdTBCNDctXHUwQjQ4XHUwQjRCLVx1MEI0RFx1MEI1Ni1cdTBCNTdcdTBCODItXHUwQjgzXHUwQkJFLVx1MEJDMlx1MEJDNi1cdTBCQzhcdTBCQ0EtXHUwQkNEXHUwQkQ3XHUwQzAxLVx1MEMwM1x1MEMzRS1cdTBDNDRcdTBDNDYtXHUwQzQ4XHUwQzRBLVx1MEM0RFx1MEM1NS1cdTBDNTZcdTBDODItXHUwQzgzXHUwQ0JFLVx1MENDNFx1MENDNi1cdTBDQzhcdTBDQ0EtXHUwQ0NEXHUwQ0Q1LVx1MENENlx1MEQwMi1cdTBEMDNcdTBEM0UtXHUwRDQzXHUwRDQ2LVx1MEQ0OFx1MEQ0QS1cdTBENERcdTBENTdcdTBFMzFcdTBFMzQtXHUwRTNBXHUwRTQ3LVx1MEU0RVx1MEVCMVx1MEVCNC1cdTBFQjlcdTBFQkItXHUwRUJDXHUwRUM4LVx1MEVDRFx1MEYxOC1cdTBGMTlcdTBGMzVcdTBGMzdcdTBGMzlcdTBGM0VcdTBGM0ZcdTBGNzEtXHUwRjg0XHUwRjg2LVx1MEY4Qlx1MEY5MC1cdTBGOTVcdTBGOTdcdTBGOTktXHUwRkFEXHUwRkIxLVx1MEZCN1x1MEZCOVx1MjBEMC1cdTIwRENcdTIwRTFcdTMwMkEtXHUzMDJGXHUzMDk5XHUzMDlBXQotCi1EaWdpdCA9ICBbXHUwMDMwLVx1MDAzOVx1MDY2MC1cdTA2NjlcdTA2RjAtXHUwNkY5XHUwOTY2LVx1MDk2Rlx1MDlFNi1cdTA5RUZcdTBBNjYtXHUwQTZGXHUwQUU2LVx1MEFFRlx1MEI2Ni1cdTBCNkZcdTBCRTctXHUwQkVGXHUwQzY2LVx1MEM2Rlx1MENFNi1cdTBDRUZcdTBENjYtXHUwRDZGXHUwRTUwLVx1MEU1OVx1MEVEMC1cdTBFRDlcdTBGMjAtXHUwRjI5XQotCi1FeHRlbmRlciA9IFtcdTAwQjdcdTAyRDBcdTAyRDFcdTAzODdcdTA2NDBcdTBFNDZcdTBFQzZcdTMwMDVcdTMwMzEtXHUzMDM1XHUzMDlELVx1MzA5RVx1MzBGQy1cdTMwRkVdCi0KLUxldHRlciA9ICh7QmFzZUNoYXJ9IHwge0lkZW9ncmFwaGljfSkKLQotTmFtZUNoYXIgPSAoe0xldHRlcn0gfCB7RGlnaXR9IHwgIi4iIHwgIi0iIHwgIl8iIHwgIjoiIHwge0NvbWJpbmluZ0NoYXJ9IHwge0V4dGVuZGVyfSkKLQotTmFtZSA9ICh7TGV0dGVyfSB8ICJfIiB8ICI6IiApICh7TmFtZUNoYXJ9KSoKLQotCi0KLSV7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0OwotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgWE1MMTBOYW1lcygpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnp6UmVhZGVyID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRYTUwxME5hbWUoU3RyaW5nIHN0cmluZ1RvQ2hlY2spIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHl5cmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKHN0cmluZ1RvQ2hlY2spKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNWYWxpZFhNTDEwTmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgaW1wb3NzaWJsZSB3aXRoIHN0cmluZ3MsIGJ1dCBpZiBvY2N1cnMsIGp1c3QgbWVhbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJub3QiCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0lfQotCi0KLQotCi0lJQotCi08WVlJTklUSUFMPgotewotCi0gICAgICAgIC8vIG5hbWUgbXVzdCBiZSB3aG9sZSBsaW5lIChpbnB1dCksIG5vdCBwYXJ0aWFsCi0gICAgICAgIC8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE0NDE2Ci0gICAgICAgIHtOYW1lfSAgICAgICAgICAgIHtyZXR1cm4gdHJ1ZTsgLyogZXhhY3QgbmFtZSAqL30KLSAgICAgICAge05hbWV9LisgICAgICAgICAge3JldHVybiBmYWxzZTsgLyogbW9yZSB0aGFuIG5hbWUgKi99Ci0KLSAgICAgICAgLy8gbWF0Y2ggYW55dGhpbmcgKGVsc2UpIHNob3VsZCBub3JtYWxseSBjb21lIGxhc3QKLSAgICAgICAgLiAgICAgICAgICAgICAgICAge3JldHVybiBmYWxzZTsgLyogbWF0Y2hlZCB3aWxkICovfQotCi19Ci0KLQotLy8gdGhpcyBydWxlIGFsd2F5cyBpbiBlZmZlY3QKLTw8RU9GPj4KLXsKLSAgICAgICAge3JldHVybiBmYWxzZTsgLyogaGl0IGVuZCB3aXRoIG5vIG1hdGNoICovfQotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOTEyMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTUgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS40IG9uIDIvMjUvMDggMTA6MjUgQU0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwyMDA4IElCTSBDb3Jwb3JhdGlvbiwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIGtiLmh1YW5nICAtIEJ1ZyAyMTQ0MTYgIERvdCBjaGFyIGlzIG5vdCBlc2NhcGVkIGluIFhNTDEwTmFtZXMuakZsZXgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleDwvYT4gMS40Ci0gKiBvbiAyLzI1LzA4IDEwOjI1IEFNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PlhNTDEwTmFtZXMuamZsZXg8L3R0PgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MMTBOYW1lcyB7Ci0KLSAgLyoqIFRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX0JVRkZFUlNJWkUgPSAyMDQ4OwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWVlJTklUSUFMID0gMDsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0NNQVBfUEFDS0VEID0gCi0gICAgIlwxMlwwXDFcM1w0MlwwXDFcMlwxXDJcMVwwXDEyXDJcMVwxXDZcMFwzMlwxIisKLSAgICAiXDRcMFwxXDFcMVwwXDMyXDFcNzRcMFwxXDJcMTBcMFwyN1wxXDFcMFwzN1wxIisKLSAgICAiXDFcMFw3MlwxXDJcMFwxM1wxXDJcMFwxMFwxXDFcMFw2NVwxXDFcMFwxMDRcMSIrCi0gICAgIlwxMVwwXDQ0XDFcM1wwXDJcMVw0XDBcMzZcMVw3MFwwXDEzMVwxXDIyXDBcN1wxIisKLSAgICAiXDE2XDBcMlwyXDU2XDBcMTA2XDJcMzJcMFwyXDJcNDRcMFwxXDFcMVwyXDNcMSIrCi0gICAgIlwxXDBcMVwxXDFcMFwyNFwxXDFcMFw1NFwxXDFcMFw3XDFcM1wwXDFcMSIrCi0gICAgIlwxXDBcMVwxXDFcMFwxXDFcMVwwXDFcMVwxXDBcMjJcMVwxNVwwXDE0XDEiKwotICAgICJcMVwwXDEwMlwxXDFcMFwxNFwxXDFcMFw0NFwxXDFcMFw0XDJcMTFcMFw2NVwxIisKLSAgICAiXDJcMFwyXDFcMlwwXDJcMVwzXDBcMzRcMVwyXDBcMTBcMVwyXDBcMlwxIisKLSAgICAiXDY3XDBcNDZcMVwyXDBcMVwxXDdcMFw0NlwxXDEyXDBcMjFcMlwxXDBcMjdcMiIrCi0gICAgIlwxXDBcM1wyXDFcMFwxXDJcMVwwXDJcMlwxXDBcMVwyXDEzXDBcMzNcMSIrCi0gICAgIlw1XDBcM1wxXDU2XDBcMzJcMVw1XDBcMVwyXDEyXDFcMTBcMlwxNVwwXDEyXDIiKwotICAgICJcNlwwXDFcMlwxMDdcMVwyXDBcNVwxXDFcMFwxN1wxXDFcMFw0XDFcMVwwIisKLSAgICAiXDFcMVwxN1wyXDJcMVwyXDJcMVwwXDRcMlwyXDBcMTJcMlx1MDIwN1wwXDNcMiIrCi0gICAgIlwxXDBcNjVcMVwyXDBcMVwyXDFcMVwyMFwyXDNcMFw0XDJcM1wwXDEyXDEiKwotICAgICJcMlwyXDJcMFwxMlwyXDIxXDBcM1wyXDFcMFwxMFwxXDJcMFwyXDFcMlwwIisKLSAgICAiXDI2XDFcMVwwXDdcMVwxXDBcMVwxXDNcMFw0XDFcMlwwXDFcMlwxXDAiKwotICAgICJcN1wyXDJcMFwyXDJcMlwwXDNcMlwxMVwwXDFcMlw0XDBcMlwxXDFcMCIrCi0gICAgIlwzXDFcMlwyXDJcMFwxMlwyXDJcMVwyMFwwXDFcMlwyXDBcNlwxXDRcMCIrCi0gICAgIlwyXDFcMlwwXDI2XDFcMVwwXDdcMVwxXDBcMlwxXDFcMFwyXDFcMVwwIisKLSAgICAiXDJcMVwyXDBcMVwyXDFcMFw1XDJcNFwwXDJcMlwyXDBcM1wyXDEzXDAiKwotICAgICJcNFwxXDFcMFwxXDFcN1wwXDEyXDJcMlwyXDNcMVwxNFwwXDNcMlwxXDAiKwotICAgICJcN1wxXDFcMFwxXDFcMVwwXDNcMVwxXDBcMjZcMVwxXDBcN1wxXDFcMCIrCi0gICAgIlwyXDFcMVwwXDVcMVwyXDBcMVwyXDFcMVwxMFwyXDFcMFwzXDJcMVwwIisKLSAgICAiXDNcMlwyMlwwXDFcMVw1XDBcMTJcMlwyMVwwXDNcMlwxXDBcMTBcMVwyXDAiKwotICAgICJcMlwxXDJcMFwyNlwxXDFcMFw3XDFcMVwwXDJcMVwyXDBcNFwxXDJcMCIrCi0gICAgIlwxXDJcMVwxXDZcMlwzXDBcMlwyXDJcMFwzXDJcMTBcMFwyXDJcNFwwIisKLSAgICAiXDJcMVwxXDBcM1wxXDRcMFwxMlwyXDIyXDBcMlwyXDFcMFw2XDFcM1wwIisKLSAgICAiXDNcMVwxXDBcNFwxXDNcMFwyXDFcMVwwXDFcMVwxXDBcMlwxXDNcMCIrCi0gICAgIlwyXDFcM1wwXDNcMVwzXDBcMTBcMVwxXDBcM1wxXDRcMFw1XDJcM1wwIisKLSAgICAiXDNcMlwxXDBcNFwyXDExXDBcMVwyXDE3XDBcMTFcMlwyMVwwXDNcMlwxXDAiKwotICAgICJcMTBcMVwxXDBcM1wxXDFcMFwyN1wxXDFcMFwxMlwxXDFcMFw1XDFcNFwwIisKLSAgICAiXDdcMlwxXDBcM1wyXDFcMFw0XDJcN1wwXDJcMlwxMVwwXDJcMVw0XDAiKwotICAgICJcMTJcMlwyMlwwXDJcMlwxXDBcMTBcMVwxXDBcM1wxXDFcMFwyN1wxXDFcMCIrCi0gICAgIlwxMlwxXDFcMFw1XDFcNFwwXDdcMlwxXDBcM1wyXDFcMFw0XDJcN1wwIisKLSAgICAiXDJcMlw3XDBcMVwxXDFcMFwyXDFcNFwwXDEyXDJcMjJcMFwyXDJcMVwwIisKLSAgICAiXDEwXDFcMVwwXDNcMVwxXDBcMjdcMVwxXDBcMjBcMVw0XDBcNlwyXDJcMCIrCi0gICAgIlwzXDJcMVwwXDRcMlwxMVwwXDFcMlwxMFwwXDJcMVw0XDBcMTJcMlwyMjFcMCIrCi0gICAgIlw1NlwxXDFcMFwxXDFcMVwyXDJcMVw3XDJcNVwwXDZcMVwxXDJcMTBcMiIrCi0gICAgIlwxXDBcMTJcMlw0N1wwXDJcMVwxXDBcMVwxXDJcMFwyXDFcMVwwXDFcMSIrCi0gICAgIlwyXDBcMVwxXDZcMFw0XDFcMVwwXDdcMVwxXDBcM1wxXDFcMFwxXDEiKwotICAgICJcMVwwXDFcMVwyXDBcMlwxXDFcMFwyXDFcMVwwXDFcMVwxXDJcMlwxIisKLSAgICAiXDZcMlwxXDBcMlwyXDFcMVwyXDBcNVwxXDFcMFwxXDJcMVwwXDZcMiIrCi0gICAgIlwyXDBcMTJcMlw3NlwwXDJcMlw2XDBcMTJcMlwxM1wwXDFcMlwxXDBcMVwyIisKLSAgICAiXDFcMFwxXDJcNFwwXDJcMlwxMFwxXDFcMFw0MVwxXDdcMFwyNFwyXDFcMCIrCi0gICAgIlw2XDJcNFwwXDZcMlwxXDBcMVwyXDFcMFwyNVwyXDNcMFw3XDJcMVwwIisKLSAgICAiXDFcMlwzNDZcMFw0NlwxXDEyXDBcNDdcMVwxMVwwXDFcMVwxXDBcMlwxXDFcMCIrCi0gICAgIlwzXDFcMVwwXDFcMVwxXDBcMlwxXDFcMFw1XDFcNTFcMFwxXDFcMVwwIisKLSAgICAiXDFcMVwxXDBcMVwxXDEzXDBcMVwxXDFcMFwxXDFcMVwwXDFcMVwzXDAiKwotICAgICJcMlwxXDNcMFwxXDFcNVwwXDNcMVwxXDBcMVwxXDFcMFwxXDFcMVwwIisKLSAgICAiXDFcMVwxXDBcMVwxXDNcMFwyXDFcM1wwXDJcMVwxXDBcMVwxXDUwXDAiKwotICAgICJcMVwxXDExXDBcMVwxXDJcMFwxXDFcMlwwXDJcMVw3XDBcMlwxXDFcMCIrCi0gICAgIlwxXDFcMVwwXDdcMVw1MFwwXDFcMVw0XDBcMVwxXDEwXDBcMVwxXHUwYzA2XDAiKwotICAgICJcMjM0XDFcNFwwXDEzMlwxXDZcMFwyNlwxXDJcMFw2XDFcMlwwXDQ2XDFcMlwwIisKLSAgICAiXDZcMVwyXDBcMTBcMVwxXDBcMVwxXDFcMFwxXDFcMVwwXDFcMVwxXDAiKwotICAgICJcMzdcMVwyXDBcNjVcMVwxXDBcN1wxXDFcMFwxXDFcM1wwXDNcMVwxXDAiKwotICAgICJcN1wxXDNcMFw0XDFcMlwwXDZcMVw0XDBcMTVcMVw1XDBcM1wxXDFcMCIrCi0gICAgIlw3XDFcMzIzXDBcMTVcMlw0XDBcMVwyXDEwNFwwXDFcMVwzXDBcMlwxXDJcMCIrCi0gICAgIlwxXDFcMTIxXDBcM1wxXHUwZTgyXDBcMVwyXDFcMFwxXDFcMzFcMFwxMVwxXDZcMiIrCi0gICAgIlwxXDBcNVwyXDEzXDBcMTI0XDFcNFwwXDJcMlwyXDBcMlwyXDJcMFwxMzJcMSIrCi0gICAgIlwxXDBcM1wyXDZcMFw1MFwxXHUxY2QzXDBcdTUxYTZcMVx1MGM1YVwwXHUyYmE0XDFcdTI4NWNcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgW10gWlpfQ01BUCA9IHp6VW5wYWNrQ01hcChaWl9DTUFQX1BBQ0tFRCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIERGQSBzdGF0ZXMgdG8gYWN0aW9uIHN3aXRjaCBsYWJlbHMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfQUNUSU9OID0genpVbnBhY2tBY3Rpb24oKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQUNUSU9OX1BBQ0tFRF8wID0KLSAgICAiXDFcMFwxXDFcMVwyXDFcMyI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrQWN0aW9uKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzRdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQWN0aW9uKFpaX0FDVElPTl9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBY3Rpb24oU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9ST1dNQVAgPSB6elVucGFja1Jvd01hcCgpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9ST1dNQVBfUEFDS0VEXzAgPQotICAgICJcMFwwXDBcNFwwXDEwXDBcMTQiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja1Jvd01hcCgpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs0XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja1Jvd01hcChaWl9ST1dNQVBfUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrUm93TWFwKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBoaWdoID0gcGFja2VkLmNoYXJBdChpKyspIDw8IDE2OwotICAgICAgcmVzdWx0W2orK10gPSBoaWdoIHwgcGFja2VkLmNoYXJBdChpKyspOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1RSQU5TIFtdID0gewotICAgIDEsIDIsIDEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMywgMiwgCi0gICAgMiwgLTEsIDMsIDMsIDMsIC0xCi0gIH07Ci0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1VOS05PV05fRVJST1IgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTk9fTUFUQ0ggPSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfUFVTSEJBQ0tfMkJJRyA9IDI7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKgotICAgKiBaWl9BVFRSSUJVVEVbYVN0YXRlXSBjb250YWlucyB0aGUgYXR0cmlidXRlcyBvZiBzdGF0ZSA8Y29kZT5hU3RhdGU8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfQVRUUklCVVRFID0genpVbnBhY2tBdHRyaWJ1dGUoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQVRUUklCVVRFX1BBQ0tFRF8wID0KLSAgICAiXDFcMFwxXDExXDJcMSI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrQXR0cmlidXRlKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzRdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQXR0cmlidXRlKFpaX0FUVFJJQlVURV9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBdHRyaWJ1dGUoU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgenpSZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB6ekJ1ZmZlcltdID0gbmV3IGNoYXJbWlpfQlVGRkVSU0laRV07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB6elB1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpDdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB6ekVuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICBwcml2YXRlIGludCB5eWNvbHVtbjsKLQotICAvKiogCi0gICAqIHp6QXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4genpBdEJPTCA9IHRydWU7Ci0KLSAgLyoqIHp6QXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgYXQgdGhlIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4genpBdEVPRjsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0OwotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgWE1MMTBOYW1lcygpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnp6UmVhZGVyID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRYTUwxME5hbWUoU3RyaW5nIHN0cmluZ1RvQ2hlY2spIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHl5cmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKHN0cmluZ1RvQ2hlY2spKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNWYWxpZFhNTDEwTmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgaW1wb3NzaWJsZSB3aXRoIHN0cmluZ3MsIGJ1dCBpZiBvY2N1cnMsIGp1c3QgbWVhbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJub3QiCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MMTBOYW1lcyhqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMuenpSZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTDEwTmFtZXMoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB6elVucGFja0NNYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTIxOCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLSAgICogCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6UmVmaWxsKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoenpTdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6RW5kUmVhZC16elN0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB6ekVuZFJlYWQtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6Q3VycmVudFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpNYXJrZWRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6UHVzaGJhY2tQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6U3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHp6Q3VycmVudFBvcyA+PSB6ekJ1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3p6Q3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgenpCdWZmZXIubGVuZ3RoKTsKLSAgICAgIHp6QnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0genpSZWFkZXIucmVhZCh6ekJ1ZmZlciwgenpFbmRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlci5sZW5ndGgtenpFbmRSZWFkKTsKLQotICAgIGlmIChudW1SZWFkIDwgMCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgenpFbmRSZWFkKz0gbnVtUmVhZDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB6ekF0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLQotICAgIGlmICh6elJlYWRlciAhPSBudWxsKQotICAgICAgenpSZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc2V0cyB0aGUgc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcgaW5wdXQgc3RyZWFtLgotICAgKiBEb2VzIG5vdCBjbG9zZSB0aGUgb2xkIHJlYWRlci4KLSAgICoKLSAgICogQWxsIGludGVybmFsIHZhcmlhYmxlcyBhcmUgcmVzZXQsIHRoZSBvbGQgaW5wdXQgc3RyZWFtIAotICAgKiA8Yj5jYW5ub3Q8L2I+IGJlIHJldXNlZCAoaW50ZXJuYWwgYnVmZmVyIGlzIGRpc2NhcmRlZCBhbmQgbG9zdCkuCi0gICAqIExleGljYWwgc3RhdGUgaXMgc2V0IHRvIDx0dD5aWl9JTklUSUFMPC90dD4uCi0gICAqCi0gICAqIEBwYXJhbSByZWFkZXIgICB0aGUgbmV3IGlucHV0IHN0cmVhbSAKLSAgICovCi0gIHByaXZhdGUgZmluYWwgdm9pZCB5eXJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlcikgewotICAgIHp6UmVhZGVyID0gcmVhZGVyOwotICAgIHp6QXRCT0wgID0gdHJ1ZTsKLSAgICB6ekF0RU9GICA9IGZhbHNlOwotICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkID0gMDsKLSAgICB6ekN1cnJlbnRQb3MgPSB6ek1hcmtlZFBvcyA9IHp6UHVzaGJhY2tQb3MgPSAwOwotICAgIHl5bGluZSA9IHl5Y2hhciA9IHl5Y29sdW1uID0gMDsKLSAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHp6TGV4aWNhbFN0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwgenpNYXJrZWRQb3MtenpTdGFydFJlYWQgKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA8dHQ+cG9zPC90dD4gZnJvbSB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dC4gCi0gICAqIAotICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvIHl5dGV4dCgpLmNoYXJBdChwb3MpLCBidXQgZmFzdGVyCi0gICAqCi0gICAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgdG8gZmV0Y2guIAotICAgKiAgICAgICAgICAgIEEgdmFsdWUgZnJvbSAwIHRvIHl5bGVuZ3RoKCktMS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIHBvcwotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBjaGFyIHl5Y2hhcmF0KGludCBwb3MpIHsKLSAgICByZXR1cm4genpCdWZmZXJbenpTdGFydFJlYWQrcG9zXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBJbiBhIHdlbGxmb3JtZWQgc2Nhbm5lciAobm8gb3Igb25seSBjb3JyZWN0IHVzYWdlIG9mIAotICAgKiB5eXB1c2hiYWNrKGludCkgYW5kIGEgbWF0Y2gtYWxsIGZhbGxiYWNrIHJ1bGUpIHRoaXMgbWV0aG9kIAotICAgKiB3aWxsIG9ubHkgYmUgY2FsbGVkIHdpdGggdGhpbmdzIHRoYXQgIkNhbid0IFBvc3NpYmx5IEhhcHBlbiIuCi0gICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZwotICAgKiAoZS5nLiBhIEpGbGV4IGJ1ZyBwcm9kdWNpbmcgYSBmYXVsdHkgc2Nhbm5lciBldGMuKS4KLSAgICoKLSAgICogVXN1YWwgc3ludGF4L3NjYW5uZXIgbGV2ZWwgZXJyb3IgaGFuZGxpbmcgc2hvdWxkIGJlIGRvbmUKLSAgICogaW4gZXJyb3IgZmFsbGJhY2sgcnVsZXMuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgenpTY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIFN0cmluZyBtZXNzYWdlOwotICAgIHRyeSB7Ci0gICAgICBtZXNzYWdlID0gWlpfRVJST1JfTVNHW2Vycm9yQ29kZV07Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1taWl9VTktOT1dOX0VSUk9SXTsKLSAgICB9Ci0KLSAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgenpTY2FuRXJyb3IoWlpfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB6ek1hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkWE1MMTBOYW1lKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB6eklucHV0OwotICAgIGludCB6ekFjdGlvbjsKLQotICAgIC8vIGNhY2hlZCBmaWVsZHM6Ci0gICAgaW50IHp6Q3VycmVudFBvc0w7Ci0gICAgaW50IHp6TWFya2VkUG9zTDsKLSAgICBpbnQgenpFbmRSZWFkTCA9IHp6RW5kUmVhZDsKLSAgICBjaGFyIFtdIHp6QnVmZmVyTCA9IHp6QnVmZmVyOwotICAgIGNoYXIgW10genpDTWFwTCA9IFpaX0NNQVA7Ci0KLSAgICBpbnQgW10genpUcmFuc0wgPSBaWl9UUkFOUzsKLSAgICBpbnQgW10genpSb3dNYXBMID0gWlpfUk9XTUFQOwotICAgIGludCBbXSB6ekF0dHJMID0gWlpfQVRUUklCVVRFOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHp6TWFya2VkUG9zTCA9IHp6TWFya2VkUG9zOwotCi0gICAgICB6ekFjdGlvbiA9IC0xOwotCi0gICAgICB6ekN1cnJlbnRQb3NMID0genpDdXJyZW50UG9zID0genpTdGFydFJlYWQgPSB6ek1hcmtlZFBvc0w7Ci0gIAotICAgICAgenpTdGF0ZSA9IHp6TGV4aWNhbFN0YXRlOwotCi0KLSAgICAgIHp6Rm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgaWYgKHp6Q3VycmVudFBvc0wgPCB6ekVuZFJlYWRMKQotICAgICAgICAgICAgenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotICAgICAgICAgIGVsc2UgaWYgKHp6QXRFT0YpIHsKLSAgICAgICAgICAgIHp6SW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9ucwotICAgICAgICAgICAgenpDdXJyZW50UG9zICA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvcyAgID0genpNYXJrZWRQb3NMOwotICAgICAgICAgICAgYm9vbGVhbiBlb2YgPSB6elJlZmlsbCgpOwotICAgICAgICAgICAgLy8gZ2V0IHRyYW5zbGF0ZWQgcG9zaXRpb25zIGFuZCBwb3NzaWJseSBuZXcgYnVmZmVyCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3NMICA9IHp6Q3VycmVudFBvczsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCAgID0genpNYXJrZWRQb3M7Ci0gICAgICAgICAgICB6ekJ1ZmZlckwgICAgICA9IHp6QnVmZmVyOwotICAgICAgICAgICAgenpFbmRSZWFkTCAgICAgPSB6ekVuZFJlYWQ7Ci0gICAgICAgICAgICBpZiAoZW9mKSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpbnQgenpOZXh0ID0genpUcmFuc0xbIHp6Um93TWFwTFt6elN0YXRlXSArIHp6Q01hcExbenpJbnB1dF0gXTsKLSAgICAgICAgICBpZiAoenpOZXh0ID09IC0xKSBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB6elN0YXRlID0genpOZXh0OwotCi0gICAgICAgICAgaW50IHp6QXR0cmlidXRlcyA9IHp6QXR0ckxbenpTdGF0ZV07Ci0gICAgICAgICAgaWYgKCAoenpBdHRyaWJ1dGVzICYgMSkgPT0gMSApIHsKLSAgICAgICAgICAgIHp6QWN0aW9uID0genpTdGF0ZTsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICBpZiAoICh6ekF0dHJpYnV0ZXMgJiA4KSA9PSA4ICkgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb24KLSAgICAgIHp6TWFya2VkUG9zID0genpNYXJrZWRQb3NMOwotCi0gICAgICBzd2l0Y2ggKHp6QWN0aW9uIDwgMCA/IHp6QWN0aW9uIDogWlpfQUNUSU9OW3p6QWN0aW9uXSkgewotICAgICAgICBjYXNlIDE6IAotICAgICAgICAgIHsgcmV0dXJuIGZhbHNlOyAvKiBtYXRjaGVkIHdpbGQgKi8KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogCi0gICAgICAgICAgeyByZXR1cm4gdHJ1ZTsgLyogZXhhY3QgbmFtZSAqLwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA1OiBicmVhazsKLSAgICAgICAgY2FzZSAzOiAKLSAgICAgICAgICB7IHJldHVybiBmYWxzZTsgLyogbW9yZSB0aGFuIG5hbWUgKi8KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh6eklucHV0ID09IFlZRU9GICYmIHp6U3RhcnRSZWFkID09IHp6Q3VycmVudFBvcykgewotICAgICAgICAgICAgenpBdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICAgIHsge3JldHVybiBmYWxzZTsgLyogaGl0IGVuZCB3aXRoIG5vIG1hdGNoICovfSB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHp6U2NhbkVycm9yKFpaX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzR2VuSmF2YUpGbGV4MTQuY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzR2VuSmF2YUpGbGV4MTQuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzgxNmQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lc0dlbkphdmFKRmxleDE0LmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLUBlY2hvIG9uDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG5lZWQgdG8gYmUgc2V0L3NwZWNpZmllZCBmb3IgZWFjaCAiZGV2ZWxvcG1lbnQgbWFjaGluZSINCi1zZXQgUEFUSD0lUEFUSCU7RDpcSkRLc1xpYm0tamF2YTItc2RrLTUwLXdpbi1pMzg2XGJpbg0KLXNldCBXT1JLU1BBQ0VfTE9DQVRJT049RDpcYnVpbGRzXFdvcmtzcGFjZXNcbmV3V1RQcHVyZWhlYWQNCi1zZXQgSkZMRVhfTElCX0xPQ0FUSU9OPUQ6XERldlRpbWVTdXBwb3J0XEpGbGV4LTEuNFxsaWINCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgZGlmZmVyIGZyb20gcHJvamVjdCB0byBwcm9qZWN0LCBidXQgc2hvdWxkIGJlIG90aGVyd2lzZSBjb25zdGFudA0KLXNldCBNQUlOX05BTUU9WE1MMTBOYW1lcw0KLQ0KLXNldCBQUk9KRUNUX1NSQz1cb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlXHNyY1wNCi1zZXQgUEFDS0FHRV9ESVI9b3JnXGVjbGlwc2Vcd3N0XHhtbFxjb3JlXGludGVybmFsXHBhcnNlclwNCi0NCi0NCi1yZW0gR2l2ZW4gdGhlIGFib3ZlICJmcmFtZXdvcmsiIGFuZCB0aGUgY29tbWFuZCB0aGVtc2VsdmVzLCB0aGVzZSB2YXJpYWJsZXMgc2hvdWxkIG5ldmVyIG5lZWQgdG8gYmUgbW9kaWZpZWQNCi1zZXQgSkFWQV9GSUxFPSVNQUlOX05BTUUlLmphdmENCi1zZXQgSkZMRVhfUlVMRVM9JU1BSU5fTkFNRSUuamZsZXgNCi1zZXQgU0tFTEVUT05fRklMRT0lTUFJTl9OQU1FJS5za2VsZXRvbg0KLQ0KLUlGIEVYSVNUICVKQVZBX0ZJTEUlIGRlbCAlSkFWQV9GSUxFJQ0KLXJlbSBqYXZhIC1YbXg0NzAwMDAwMDAgLWNwICVKRkxFWF9MSUJfTE9DQVRJT04lXEpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAtc2tlbCAlU0tFTEVUT05fRklMRSUgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwICVKRkxFWF9MSUJfTE9DQVRJT04lXEpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBjb3B5ICVKQVZBX0ZJTEUlICVXT1JLU1BBQ0VfTE9DQVRJT04lJVBST0pFQ1RfU1JDJSVQQUNLQUdFX0RJUiUlSkFWQV9GSUxFJQ0KLQ0KLXBhdXNlDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9qZmxleGVyci50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL2pmbGV4ZXJyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL2pmbGV4ZXJyLnR4dAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL2pmbGV4b3V0LnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvamZsZXhvdXQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzM2ZjEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvamZsZXhvdXQudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1SZWFkaW5nICJYTUwxME5hbWVzLmpmbGV4IgotQ29uc3RydWN0aW5nIE5GQSA6IDg0IHN0YXRlcyBpbiBORkEKLUNvbnZlcnRpbmcgTkZBIHRvIERGQSA6IAotLi4uLi4uLi4uLi4uCi0xNCBzdGF0ZXMgYmVmb3JlIG1pbmltaXphdGlvbiwgNCBzdGF0ZXMgaW4gbWluaW1pemVkIERGQQotV3JpdGluZyBjb2RlIHRvICJYTUwxME5hbWVzLmphdmEiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL1hNTEhlYWRUb2tlbml6ZXIuakZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL1hNTEhlYWRUb2tlbml6ZXIuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZmU4OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyLmpGbGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMueG1sOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5IZWFkUGFyc2VyVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSW50U3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMueG1sLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotCi0KLSUlCi0KLSV7Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOwotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotCi0KLQlwdWJsaWMgWE1MSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLSAgICAgICAgICAgICAgICAvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gICAgICAgICAgICAgICAgenpSZWFkZXIgPSBpbjsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgICAgICAgICAgICAgICB6elN0YXRlID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAgICAgICAgICAgICAgIC8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgICAgICAgICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5cy5maWxsKHp6QnVmZmVyLCAoY2hhcikwKTsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgenpNYXJrZWRQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgICAgICAgICAgICAgICB6elB1c2hiYWNrUG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHp6Q3VycmVudFBvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICB6elN0YXJ0UmVhZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgICAgICAgICAgICAgKiBmcm9tIGlucHV0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgenpFbmRSZWFkID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAgICAgICAgICAgICAgIHl5bGluZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgICAgICAgICAgICAgICB5eWNoYXIgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgICAgICAgICAgICAgICAgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgeXljb2x1bW4gPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcKLSAgICAgICAgICAgICAgICAgKiBvZiBhIGxpbmUKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB6ekF0Qk9MID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIC8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgICAgICAgICAgICAgICB6ekF0RU9GID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgICAgICAgICAgICAgICB6ekVPRkRvbmUgPSBmYWxzZTsKLQotCi0gICAgICAgICAgICAgICAgZlN0YXRlU3RhY2suY2xlYXIoKTsKLQotICAgICAgICAgICAgICAgIGhhc01vcmUgPSB0cnVlOwotICAJCQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQkKLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQkKLQotJX0KLQotJWVvZnsKLQloYXNNb3JlPWZhbHNlOwotJWVvZn0KLQotJXB1YmxpYwotJWNsYXNzIFhNTEhlYWRUb2tlbml6ZXIKLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuCi0ldHlwZSBTdHJpbmcKLSVjaGFyCi0ldW5pY29kZQotJWlnbm9yZWNhc2UgCi0vLyVkZWJ1ZwotJXN3aXRjaAotJWJ1ZmZlciA4MTkyCi0KLVVURjE2QkUgPSBceEZFXHhGRgotVVRGMTZMRSA9IFx4RkZceEZFCi1VVEY4M0J5dGVCT00gPSBceEVGXHhCQlx4QkYKLQotU3BhY2VDaGFyID0gW1x4MjBceDA5XQotCi0vLyBbM10gUyA6Oj0gKDB4MjAgfCAweDkgfCAweEQgfCAweEEpKwotUyA9IFtceDIwXHgwOVx4MERceDBBXQotCi1CZWdpbkF0dHJpYmVWYWx1ZSA9IHtTfSogXD0ge1N9KgotCi1MaW5lVGVybWluYXRvciA9IFxyfFxuCi0KLQotJXN0YXRlIFNUX1hNTERlY2wKLSVzdGF0ZSBRdW90ZWRBdHRyaWJ1dGVWYWx1ZQotJXN0YXRlIERRX1NUUklORwotJXN0YXRlIFNRX1NUUklORwotJXN0YXRlIFVuRGVsaW1pdGVkU3RyaW5nCi0KLSUlCi0KLQotPFlZSU5JVElBTD4gIAotewotCS8vIGZvcmNlIHRvIHN0YXJ0IGF0IGJlZ2lubmluZyBvZiBsaW5lICheKSBhbmQgYXQgYmVnaW5uaW5nIG9mIGZpbGUgKHl5Y2hhciA9PSAwKQotCV57VVRGMTZCRX0gICAJCXtpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9fQotCV57VVRGMTZMRX0gICAJCXtpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTt9fQotCV57VVRGODNCeXRlQk9NfSAgIAl7aWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTt9fQotCQotCS8vIGZvcmNlIHRvIGJlIHN0YXJ0ZWQgb24gZmlyc3QgbGluZSwgYnV0IHdlIGRvIGFsbG93IHByZWNlZWRpbmcgc3BhY2VzCi0JXiB7U30qICI8XD94bWwiIHtTfSsge2lmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fX0KLQkKLX0JCi0JCi08U1RfWE1MRGVjbD4gCi17Ci0JInZlcnNpb24iIHtCZWdpbkF0dHJpYmVWYWx1ZX0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xWZXJzaW9uO30KLQkiZW5jb2RpbmciIHtCZWdpbkF0dHJpYmVWYWx1ZX0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nO30KLQkvLyBub3RlIHRoZSAiZm9yY2VkIGVuZCIgKHZpYSAnaGFzTW9yZT1mYWxzZScpIG9uY2UgdGhlIGVuZCBvZiBYTUwgRGVjbGFyYXRpb24gZm91bmQKLQkvLyBUaGlzIGlzIHNpbmNlIG5vbi1hc2NpaSBjaGFycyBtYXkgZm9sbG93IGFuZCBtYXkgY2F1c2UgSU9FeGNlcHRpb25zIHdoaWNoIHdvdWxkIG5vdCBvY2N1ciBvbmNlIHN0cmVhbSBpcyAKLQkvLyByZWFkIHdpdGggaW5jb3JyZWN0IGVuY29kaW5nIChzdWNoIGFzIGlmIHBsYXRmb3JtIGVuY29kaW5nIGlzIGluIGVmZmVjdCB1bnRpbCB0cnVlIGVuY29kaW5nIGRldGVjdGVkKS4gCi0JIlw/PiIgICAge3l5YmVnaW4oWVlJTklUSUFMKTsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kO30KLX0JCi0KLQkKLQotPFF1b3RlZEF0dHJpYnV0ZVZhbHVlPgotewotCVwiICAgICAgICAgICAgICAgICAgICAgIHsgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0JXCcJCQl7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotCS8vIGluIHRoaXMgc3RhdGUsIGFueXRoaW5nIG90aGVyIHRoYW4gYSBzcGFjZSBjaGFyYWN0ZXIgY2FuIHN0YXJ0IGFuIHVuZGVsaW1pdGVkIHN0cmluZwotCXtTfSouICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApO30KLQotfQkKLQotCi08RFFfU1RSSU5HPgotewotCi0JXCIgICAgICAgICAgICAgICAgICAgICAgeyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOyB9Ci0gIAl7TGluZVRlcm1pbmF0b3J9ICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiXD8+IgkJCXsgeXlwdXNoYmFjaygyKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQknPCcJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkuCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0KLQotfQotCi08U1FfU1RSSU5HPgotewotCi0JXCcgICAgICAgICAgICAgICAgICAgICAgeyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlO30KLSAgCXtMaW5lVGVybWluYXRvcn0gICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSIlPiIJCQl7IHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQknPCcJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkuCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0KLQotfQotCi08VW5EZWxpbWl0ZWRTdHJpbmc+Ci17Ci0KLQl7U30gICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gIAl7TGluZVRlcm1pbmF0b3J9ICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiXD8+IgkJCXsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSc8JwkKLQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkvLyB0aGVzZSBhcmUgYSBiaXQgc3BlY2lhbCwgc2luY2Ugd2Ugc3RhcnRlZCBhbiB1bmRlbGltaXQgc3RyaW5nLCBidXQgZm91bmQgYSBxdW90ZSAuLi4gcHJvYmFibHkgaW5kaWNhdGVzIGEgbWlzc2luZyBiZWdpbm5pbmcgcXVvdGUKLQlcJwkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7fQotCQotCVwiCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9Ci0JCi0JLgkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotCi19Ci0KLS8vIFRoZSAibWF0Y2ggYW55dGhpbmciIHJ1bGUgc2hvdWxkIGFsd2F5cyBiZSBpbiBlZmZlY3QgZXhjZXB0IGZvciB3aGVuIGxvb2tpbmcgZm9yIGVuZCBvZiBzdHJpbmcKLS8vIChUaGF0IGlzLCByZW1lbWJlciB0byB1cGRhdGUgc3RhdGUgbGlzdCBpZi93aGVuIG5ldyBzdGF0ZXMgYWRkZWQpCi08WVlJTklUSUFMLCBTVF9YTUxEZWNsLCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZT4KLXsKLS8vIHRoaXMgaXMgdGhlIGZhbGxiYWNrIChtYXRjaCAiYW55dGhpbmciKSBydWxlICAoZm9yIHRoaXMgc2Nhbm5lciwgaW5wdXQgaXMgaWdub3JlZCwgYW5kIHBvc2l0aW9uIGFkdmFuY2VkLCBpZiBub3QgcmVjb2duaXplZCkKLS58XG4gICAgICAgICAgICAgIHtpZiAoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fX0KLX0KLQotLy8gdGhpcyBydWxlIGFsd2F5cyBpbiBlZmZlY3QKLTw8RU9GPj4gICAgICAgICB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GO30KLQotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNTMwNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiA0LzYvMDQgMTE6MTMgUE0gKi8KLQotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy54bWw7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkhlYWRQYXJzZXJUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5JbnRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy54bWwuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXg8L2E+IDEuMi4yCi0gKiBvbiA0LzYvMDQgMTE6MTMgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIFhNTEhlYWRUb2tlbml6ZXIgewotCi0gIC8qKiB0aGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBVbkRlbGltaXRlZFN0cmluZyA9IDEwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBEUV9TVFJJTkcgPSA2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTUV9TVFJJTkcgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxEZWNsID0gMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgUXVvdGVkQXR0cmlidXRlVmFsdWUgPSA0OwotCi0gIC8qKgotICAgKiBZWV9MRVhTVEFURVtsXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiBZWV9MRVhTVEFURVtsKzFdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICogbCBpcyBvZiB0aGUgZm9ybSBsID0gMiprLCBrIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIKLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBZWV9MRVhTVEFURVtdID0geyAKLSAgICAgMCwgIDEsICAyLCAgMiwgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsIDYKLSAgfTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw2XDFcN1wyXDBcMVwxMVwyMlwwXDFcNlwxXDBcMVwyN1wyXDAiKwotICAgICJcMVwzMVwxXDBcMVwzMFwyNFwwXDFcMTJcMVwxMFwxXDI2XDFcMTNcM1wwXDFcMjEiKwotICAgICJcMVwyM1wxXDE3XDFcMFwxXDI1XDFcMFwxXDI0XDJcMFwxXDE2XDFcMTVcMVwyMCIrCi0gICAgIlwxXDIyXDEwXDBcMVwxNFwxMlwwXDFcMjFcMVwyM1wxXDE3XDFcMFwxXDI1XDFcMCIrCi0gICAgIlwxXDI0XDJcMFwxXDE2XDFcMTVcMVwyMFwxXDIyXDEwXDBcMVwxNFwxMDJcMFwxXDQiKwotICAgICJcM1wwXDFcNVwxN1wwXDFcM1wxNlwwXDFcMVwyMFwwXDFcM1wxNlwwXDFcMSIrCi0gICAgIlwxXDJcMTcwXDBcMVwyXHVmZTg3XDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICBwcml2YXRlIGludCB5eWNvbHVtbjsgCi0KLSAgLyoqIAotICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsKLQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLSAgLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfZW9mX2RvbmU7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQotCi0JcHVibGljIFhNTEhlYWRUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7Ci0JICAJLyogdGhlIGlucHV0IGRldmljZSAqLwotCSAgCXl5X3JlYWRlciA9IGluOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICAJCXl5X3N0YXRlID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIAkJLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAJCSB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIAkJeXlfbWFya2VkUG9zID0gMDsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIAkJeXlfcHVzaGJhY2tQb3MgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfY3VycmVudFBvcyA9IDA7Ci0KLSAgCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9zdGFydFJlYWQgPSAwOwotCi0gIAkJLyoqIAotICAJCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAJCSAqIGZyb20gaW5wdXQgCi0gIAkJICovCi0gIAkJeXlfZW5kUmVhZCA9IDA7Ci0KLSAgCQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWxpbmUgPSAwOwotCi0gIAkJLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIAkJeXljaGFyID0gMDsKLQotICAJCS8qKgotICAJCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0Ci0gIAkJICogb2YgdGhlIG1hdGNoZWQgdGV4dAotICAJCSAqLwotICAJCXl5Y29sdW1uID0gMDsgCi0KLSAgCQkvKiogCi0gIAkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgCi0gIAkJICogb2YgYSBsaW5lCi0gIAkJICovCi0gIAkJeXlfYXRCT0wgPSBmYWxzZTsKLQotICAJCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgCQl5eV9hdEVPRiA9IGZhbHNlOwotCi0gIAkJLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIAkJeXlfZW9mX2RvbmUgPSBmYWxzZTsKLQotCi0gIAkJZlN0YXRlU3RhY2suY2xlYXIoKTsKLSAgCQkKLSAgCQloYXNNb3JlID0gdHJ1ZTsKLSAgCQkKLSAgCQkvLyBpdHMgYSBsaXR0bGUgd2FzdGVmdWwgdG8gInRocm93IGF3YXkiIGZpcnN0IGNoYXIgYXJyYXkgZ2VuZXJhdGVkCi0gIAkJLy8gYnkgY2xhc3MgaW5pdCAodmlhIGF1dG8gZ2VuZXJhdGVkIGNvZGUpLCBidXQgd2UgcmVhbGx5IGRvIHdhbnQgCi0gIAkJLy8gYSBzbWFsbCBidWZmZXIgZm9yIG91ciBoZWFkIHBhcnNlcnMuIAotICAJCWlmICh5eV9idWZmZXIubGVuZ3RoICE9IE1BWF9UT19TQ0FOKSB7Ci0gIAkJCXl5X2J1ZmZlciA9IG5ldyBjaGFyW01BWF9UT19TQ0FOXTsKLSAgCQl9Ci0KLQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQkKLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQkKLQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTEhlYWRUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MSGVhZFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDEyOCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLQotICAgIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotICAgIGlmICgheXlfZW9mX2RvbmUpIHsKLSAgICAgIHl5X2VvZl9kb25lID0gdHJ1ZTsKLSAgICAJaGFzTW9yZT1mYWxzZTsKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotCi0gICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgeXljaGFyKz0geXlsZW5ndGgoKTsKLQotICAgICAgeXlfYXRCT0wgPSB5eV9tYXJrZWRQb3MgPD0gMCB8fCB5eV9idWZmZXJbeXlfbWFya2VkUG9zLTFdID09ICdcbic7Ci0gICAgICBpZiAoIXl5X2F0Qk9MICYmIHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MtMV0gPT0gJ1xyJykgewotICAgICAgICB5eV9hdEJPTCA9IHl5X2FkdmFuY2UoKSAhPSAnXG4nOwotICAgICAgICBpZiAoIXl5X2F0RU9GKSB5eV9jdXJyZW50UG9zLS07Ci0gICAgICB9Ci0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOwotCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0gICAgICBpZiAoeXlfYXRCT0wpCi0gICAgICAgIHl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZSsxXTsKLSAgICAgIGVsc2UKLSAgICAgICAgeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlXTsKLQotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOwotCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLQotICAgICAgICAgIHl5X2lucHV0ID0geXljbWFwW3l5X2lucHV0XTsKLQotICAgICAgICAgIGJvb2xlYW4geXlfaXNGaW5hbCA9IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4geXlfbm9Mb29rQWhlYWQgPSBmYWxzZTsKLQotICAgICAgICAgIHl5X2Zvck5leHQ6IHsgc3dpdGNoICh5eV9zdGF0ZSkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDE1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDMxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OiB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9zdGF0ZSA9IDM0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSAzNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDM3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfc3RhdGUgPSAzODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDE1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9zdGF0ZSA9IDQwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9zdGF0ZSA9IDQwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9zdGF0ZSA9IDM0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSAzNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDQ0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfc3RhdGUgPSAzODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDE1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogeXlfc3RhdGUgPSA0NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gNDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB5eV9zdGF0ZSA9IDQ3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA0ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA1MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA1MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHl5X3N0YXRlID0gNTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDUyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA1MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX0lMTEVHQUxfU1RBVEUpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9IH0KLQotICAgICAgICAgIGlmICggeXlfaXNGaW5hbCApIHsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCB5eV9ub0xvb2tBaGVhZCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICAgIHsgIHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSA1NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgNTY6IGJyZWFrOwotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLSAgICAgICAgY2FzZSA1NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDU4OiBicmVhazsKLSAgICAgICAgY2FzZSAzOTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygyKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgNTk6IGJyZWFrOwotICAgICAgICBjYXNlIDQxOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDYwOiBicmVhazsKLSAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgIGNhc2UgMTE6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9IH0KLSAgICAgICAgY2FzZSA2MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7fSB9Ci0gICAgICAgIGNhc2UgNjI6IGJyZWFrOwotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFO30gfQotICAgICAgICBjYXNlIDYzOiBicmVhazsKLSAgICAgICAgY2FzZSA0MjogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NO30gfQotICAgICAgICBjYXNlIDY0OiBicmVhazsKLSAgICAgICAgY2FzZSA0OTogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O30gfQotICAgICAgICBjYXNlIDY1OiBicmVhazsKLSAgICAgICAgY2FzZSAzNjogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDsgfQotICAgICAgICBjYXNlIDY2OiBicmVhazsKLSAgICAgICAgY2FzZSA1MzogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzsgfQotICAgICAgICBjYXNlIDY3OiBicmVhazsKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgICAgeyAgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsgIH0KLSAgICAgICAgY2FzZSA2ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICAgIHsgIHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7ICB9Ci0gICAgICAgIGNhc2UgNjk6IGJyZWFrOwotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7ICB9Ci0gICAgICAgIGNhc2UgNzA6IGJyZWFrOwotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7ICB9Ci0gICAgICAgIGNhc2UgNzE6IGJyZWFrOwotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgIH0KLSAgICAgICAgY2FzZSA3MjogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GOyB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotICAvKioKLSAgICogUnVucyB0aGUgc2Nhbm5lciBvbiBpbnB1dCBmaWxlcy4KLSAgICoKLSAgICogVGhpcyBtYWluIG1ldGhvZCBpcyB0aGUgZGVidWdnaW5nIHJvdXRpbmUgZm9yIHRoZSBzY2FubmVyLgotICAgKiBJdCBwcmludHMgZWFjaCByZXR1cm5lZCB0b2tlbiB0byBTeXN0ZW0ub3V0IHVudGlsIHRoZSBlbmQgb2YKLSAgICogZmlsZSBpcyByZWFjaGVkLCBvciBhbiBlcnJvciBvY2N1cmVkLgotICAgKgotICAgKiBAcGFyYW0gYXJndiAgIHRoZSBjb21tYW5kIGxpbmUsIGNvbnRhaW5zIHRoZSBmaWxlbmFtZXMgdG8gcnVuCi0gICAqICAgICAgICAgICAgICAgdGhlIHNjYW5uZXIgb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICBYTUxIZWFkVG9rZW5pemVyIHNjYW5uZXIgPSBudWxsOwotICAgICAgdHJ5IHsKLSAgICAgICAgc2Nhbm5lciA9IG5ldyBYTUxIZWFkVG9rZW5pemVyKCBuZXcgamF2YS5pby5GaWxlUmVhZGVyKGFyZ3ZbaV0pICk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIDogXCIiK2FyZ3ZbaV0rIlwiIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG9wZW5pbmcgZmlsZSBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEgWE1MSGVhZFRva2VuaXplciA8aW5wdXRmaWxlPiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLQotICAgICAgdHJ5IHsKLSAgICAgICAgZG8gewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzY2FubmVyLnByaW1HZXROZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0gd2hpbGUgKCFzY2FubmVyLnl5X2F0RU9GKTsKLQotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFuIEkvTyBlcnJvciBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIDoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL1hNTEhlYWRUb2tlbml6ZXJHZW5KYXZhLmNtZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplckdlbkphdmEuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWMxYzdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplckdlbkphdmEuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotQGVjaG8gb24NCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbmVlZCB0byBiZSBzZXQvc3BlY2lmaWVkIGZvciBlYWNoICJkZXZlbG9wbWVudCBtYWNoaW5lIg0KLXNldCBQQVRIPSVQQVRIJTtEOlxKREtzXGoyc2RrMS40LjJfMDNcYmluDQotc2V0IFdPUktTUEFDRV9MT0NBVElPTj1EOlxidWlsZHNcV29ya3NwYWNlc1xXU1dCTTgNCi1zZXQgSkZMRVhfTElCX0xPQ0FUSU9OPUQ6XERldlRpbWVTdXBwb3J0XEpGbGV4XGxpYg0KLQ0KLXJlbSBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBkaWZmZXIgZnJvbSBwcm9qZWN0IHRvIHByb2plY3QsIGJ1dCBzaG91bGQgYmUgb3RoZXJ3aXNlIGNvbnN0YW50DQotc2V0IE1BSU5fTkFNRT1YTUxIZWFkVG9rZW5pemVyDQotDQotcmVtIHNldCBQUk9KRUNUX1NSQz1cb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnhtbFxzcmNcDQotcmVtIHNldCBQQUNLQUdFX0RJUj1jb21caWJtXHNzZVxtb2RlbFx4bWxcZW5jb2RpbmdcDQotDQotc2V0IFBST0pFQ1RfU1JDPVxvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpY1xzcmNcDQotc2V0IFBBQ0tBR0VfRElSPWNvbVxpYm1cZW5jb2RpbmdccmVzb3VyY2VcY29udGVudHNwZWNpZmljXHhtbFwNCi0NCi0NCi1yZW0gR2l2ZW4gdGhlIGFib3ZlICJmcmFtZXdvcmsiIGFuZCB0aGUgY29tbWFuZCB0aGVtc2VsdmVzLCB0aGVzZSB2YXJpYWJsZXMgc2hvdWxkIG5ldmVyIG5lZWQgdG8gYmUgbW9kaWZpZWQNCi1zZXQgSkFWQV9GSUxFPSVNQUlOX05BTUUlLmphdmENCi1zZXQgSkZMRVhfUlVMRVM9JU1BSU5fTkFNRSUuamZsZXgNCi1zZXQgU0tFTEVUT05fRklMRT0lTUFJTl9OQU1FJS5za2VsZXRvbg0KLQ0KLUlGIEVYSVNUICVKQVZBX0ZJTEUlIGRlbCAlSkFWQV9GSUxFJQ0KLXJlbSBqYXZhIC1YbXg0NzAwMDAwMDAgLWNwICVKRkxFWF9MSUJfTE9DQVRJT04lXHNlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluICVKRkxFWF9SVUxFUyUgLXNrZWwgJVNLRUxFVE9OX0ZJTEUlIDE+amZsZXhvdXQudHh0IDI+amZsZXhlcnIudHh0DQotamF2YSAtWG14NDcwMDAwMDAwIC1jcCAlSkZMRVhfTElCX0xPQ0FUSU9OJVxzZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlICAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLUlGIEVYSVNUICVKQVZBX0ZJTEUlIGNvcHkgJUpBVkFfRklMRSUgJVdPUktTUEFDRV9MT0NBVElPTiUlUFJPSkVDVF9TUkMlJVBBQ0tBR0VfRElSJSVKQVZBX0ZJTEUlDQotDQotcGF1c2UNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL2pmbGV4ZXJyLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvamZsZXhlcnIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvamZsZXhlcnIudHh0CisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvamZsZXhvdXQudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9qZmxleG91dC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNmMzMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9qZmxleG91dC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVJlYWRpbmcgIlhNTEhlYWRUb2tlbml6ZXIuamZsZXgiCi0KLVdhcm5pbmcgOiBNYWNybyAiU3BhY2VDaGFyIiBoYXMgYmVlbiBkZWNsYXJlZCBidXQgbmV2ZXIgdXNlZC4KLUNvbnN0cnVjdGluZyBORkEgOiAzNTggc3RhdGVzIGluIE5GQQotQ29udmVydGluZyBORkEgdG8gREZBIDogCi0uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi03OSBzdGF0ZXMgYmVmb3JlIG1pbmltaXphdGlvbiwgNTQgc3RhdGVzIGluIG1pbmltaXplZCBERkEKLVdyaXRpbmcgY29kZSB0byAiWE1MSGVhZFRva2VuaXplci5qYXZhIgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9vbGRYTUxIZWFkVG9rZW5pemVyLnNrZWxldG9uIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9vbGRYTUxIZWFkVG9rZW5pemVyLnNrZWxldG9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODA5NjAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvb2xkWE1MSGVhZFRva2VuaXplci5za2VsZXRvbgorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0NCi0gIC8qKiB0aGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLw0KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsNCi0NCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLw0KLS0tLSAgbGV4aWNhbCBzdGF0ZXMsIGNoYXJtYXANCi0NCi0gIC8qIGVycm9yIGNvZGVzICovDQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7DQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7DQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOw0KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOw0KLQ0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLw0KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gew0KLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAkJLy8kTk9OLU5MUy0xJA0KLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAkJLy8kTk9OLU5MUy0xJA0KLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCQkvLyROT04tTkxTLTEkDQotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIJLy8kTk9OLU5MUy0xJA0KLSAgfTsNCi0NCi0tLS0gaXNGaW5hbCBsaXN0DQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLw0KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7DQotDQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7DQotDQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsNCi0NCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzDQotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovDQotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07DQotDQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8NCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsNCi0NCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7DQotDQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovDQotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOw0KLQ0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOw0KLQ0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZA0KLSAgICAgIGZyb20gaW5wdXQgKi8NCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7DQotDQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotICBwcml2YXRlIGludCB5eWxpbmU7DQotDQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotICBwcml2YXRlIGludCB5eWNoYXI7DQotDQotICANCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovDQotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7DQotDQotCS8vIHN0YXRlIHN0YWNrIGZvciBoYW5kbGluZyBlbWJlZGRlZCByZWdpb25zDQotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsNCi0NCi0NCi0tLS0gdXNlciBjbGFzcyBjb2RlDQotDQotICAvKioNCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcg0KLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLg0KLSAgICoNCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLg0KLSAgICovDQotLS0tIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uDQotDQotDQotICAvKioNCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLg0KLSAgICoNCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQ0KLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuDQotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzDQotICAgKi8NCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7DQotDQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8NCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107DQotDQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gDQotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOw0KLQ0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8NCi0NCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8NCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsNCi0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCANCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgDQotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7DQotDQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8NCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOw0KLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOw0KLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOw0KLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7DQotICAgIH0NCi0NCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLw0KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7DQotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovDQotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07DQotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7DQotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOw0KLSAgICB9DQotDQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLw0KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOw0KLQ0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7DQotDQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOw0KLQ0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107DQotICB9DQotDQotICAgIA0KLSAgLyoqDQotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4NCi0gICAqLw0KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsNCi0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovDQotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLw0KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsNCi0gIH0NCi0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7DQotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQ0KLSAgICoNCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUNCi0gICAqLw0KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsNCi0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOw0KLSAgfQ0KLQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsNCi0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7DQotICB9DQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4NCi0gICAqLw0KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsNCi0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7DQotICB9DQotDQotDQotICAvKioNCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIC0gZnJvbSB0aGUgU0VEIEpGbGV4IHNrZWxldG9uDQotICAgKg0KLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkNCi0gICAqLw0KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7DQotICAgIHRyeSB7DQotICAgICAgLy9Mb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOw0KLQlTeXN0ZW0ub3V0LnByaW50bG4oIlNjYW5FcnJvcjogIiArIGVycm9yQ29kZSArICI6ICIgKyBZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7DQotICAgIH0NCi0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7DQotICAgICAgLy9Mb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsNCi0JU3lzdGVtLm91dC5wcmludGxuKCJTY2FuRXJyb3I6ICIgKyBlcnJvckNvZGUgKyAiOiAiICsgWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsNCi0gICB9DQotICAgIC8vIERPIE5PVCBFWElUIHRoZSBWTSBvbiBhbiBlcnJvcg0KLSAgICAvLyBTeXN0ZW0uZXhpdCgxKTsNCi0gIH0gDQotDQotDQotICAvKioNCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLg0KLSAgICoNCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QNCi0gICAqDQotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4NCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQ0KLSAgICovDQotICBwcml2YXRlIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7DQotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApDQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOw0KLQ0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOw0KLSAgfQ0KLQ0KLQ0KLS0tLSB5eV9kb0VvZg0KLSAgLyoqDQotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLA0KLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLg0KLSAgICoNCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbg0KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3Vycw0KLSAgICovDQotLS0tIHl5bGV4IGRlY2xhcmF0aW9uDQotICAgIGludCB5eV9pbnB1dDsNCi0gICAgaW50IHl5X2FjdGlvbjsNCi0NCi0tLS0gbG9jYWwgZGVjbGFyYXRpb25zDQotDQotICAgIHdoaWxlICh0cnVlKSB7DQotDQotLS0tIHN0YXJ0IGFkbWluIChsaW5lLCBjaGFyLCBjb2wgY291bnQpDQotICAgICAgeXlfYWN0aW9uID0gLTE7DQotDQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsNCi0NCi0tLS0gc3RhcnQgYWRtaW4gKGxleHN0YXRlIGV0YykNCi0NCi0gICAgICB5eV9mb3JBY3Rpb246IHsNCi0gICAgICAgIHdoaWxlICh0cnVlKSB7DQotICAgIA0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsNCi0NCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsNCi0NCi0tLS0gbGluZSwgY29sLCBjaGFyIGNvdW50LCBuZXh0IHRyYW5zaXRpb24sIGlzRmluYWwgYWN0aW9uDQotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IA0KLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IA0KLS0tLSBsaW5lIGNvdW50IHVwZGF0ZQ0KLSAgICAgICAgICB9DQotDQotICAgICAgICB9DQotICAgICAgfQ0KLQ0KLS0tLSBjaGFyIGNvdW50IHVwZGF0ZQ0KLQ0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIA0KLQ0KLS0tLSBhY3Rpb25zDQotICAgICAgICBkZWZhdWx0OiANCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7DQotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOw0KLS0tLSBlb2Z2YWx1ZQ0KLSAgICAgICAgICB9IA0KLSAgICAgICAgICBlbHNlIHsNCi0tLS0gbm8gbWF0Y2gNCi0gICAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfSAgICANCi0NCi0tLS0gbWFpbg0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvQ1NTVG9rZW5pemVyLmpmbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL0NTU1Rva2VuaXplci5qZmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE3YzZhZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL0NTU1Rva2VuaXplci5qZmxleAorKysgL2Rldi9udWxsCkBAIC0xLDUyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLypubHNYWFgqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjsNCi0NCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuQ1NTVGV4dFJlZ2lvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOw0KLQ0KLSUlDQotDQotJXB1YmxpYw0KLSVjbGFzcyBDU1NUb2tlbml6ZXINCi0laW1wbGVtZW50cyBDU1NSZWdpb25Db250ZXh0cywgSUNTU1Rva2VuaXplcg0KLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuDQotJXR5cGUgU3RyaW5nDQotJWNoYXINCi0ldW5pY29kZQ0KLSVjYXNlbGVzcw0KLS8vJWRlYnVnDQotJXBhY2sNCi0NCi0lew0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5ERUZJTkVEID0gInVuZGVmaW5lZCI7DQotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRTdGFydDsNCi0vLwlwcml2YXRlIGludCBmQnVmZmVyZWRUZXh0TGVuZ3RoOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGg7DQotLy8JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZkJ1ZmZlcmVkVGV4dCA9IG51bGw7DQotCXByaXZhdGUgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBDU1NUZXh0UmVnaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOw0KLQlwcml2YXRlIGludCBmSW5pdGlhbFN0YXRlID0gWVlJTklUSUFMOw0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCVUZGRVJfU0laRV9OT1JNQUwgPSAxNjM4NDsNCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfU01BTEwgPSAyNTY7DQotCXByaXZhdGUgaW50IGZJbml0aWFsQnVmZmVyU2l6ZSA9IEJVRkZFUl9TSVpFX05PUk1BTDsNCi0NCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFN0YXRlKGludCBzdGF0ZSkgew0KLQkJZkluaXRpYWxTdGF0ZSA9IHN0YXRlOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsQnVmZmVyU2l6ZShpbnQgc2l6ZSkgew0KLQkJZkluaXRpYWxCdWZmZXJTaXplID0gc2l6ZTsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLSAgCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJU3RyaW5nIGNvbnRleHQ7DQotCQlTdHJpbmcgbmV4dFRva2VuVHlwZTsNCi0JCWJvb2xlYW4gc3BhY2VGb2xsb3dzOw0KLS8vCQlTdHJpbmdCdWZmZXIgdGV4dDsNCi0JCWludCBzdGFydDsNCi0JCWludCB0ZXh0TGVuZ3RoOw0KLQkJaW50IGxlbmd0aDsNCi0JCWlmIChmQnVmZmVyZWRDb250ZXh0ICE9IG51bGwpIHsNCi0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsNCi0vLwkJCXRleHQgPSBmQnVmZmVyZWRUZXh0Ow0KLQkJCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7DQotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsNCi0NCi0JCQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsNCi0JCX0gZWxzZSB7DQotCQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0vLwkJCXRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsNCi0JCQlzdGFydCA9IHl5Y2hhcjsNCi0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCX0NCi0NCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsNCi0JCQlpZiAoY29udGV4dCA9PSBVTkRFRklORUQpIHsNCi0JCQkJLy8gdW5kZWYgLT4gY29uY2F0ZW5hdGUgdW5kZWYncw0KLQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQl3aGlsZSAobmV4dFRva2VuVHlwZSA9PSBVTkRFRklORUQpIHsNCi0vLwkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOw0KLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOw0KLQkJCQkJbGVuZ3RoID0gdGV4dExlbmd0aDsNCi0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCX0NCi0JCQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG5leHRUb2tlblR5cGU7DQotLy8JCQkJZkJ1ZmZlcmVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOw0KLQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsNCi0JCQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQluZXh0VG9rZW5UeXBlID0gbnVsbDsNCi0JCQkJc3BhY2VGb2xsb3dzID0gZmFsc2U7DQotCQkJCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25WYWx1ZVR5cGUoY29udGV4dCkpIHsgLy8gZGVjbGFyYXRpb24gdmFsdWUgY2FuIGNvbnRhaW4gVkFMVUVfUw0KLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19ERUNMQVJBVElPTl9WQUxVRV9TKTsNCi0JCQkJfSBlbHNlIGlmIChjYW5Db250YWluU3BhY2UoY29udGV4dCkpIHsNCi0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQlzcGFjZUZvbGxvd3MgPSAobmV4dFRva2VuVHlwZSA9PSBDU1NfUyk7DQotCQkJCX0NCi0JCQkJaWYgKG5leHRUb2tlblR5cGUgIT0gbnVsbCkgeyAvLyBuZXh0VG9rZW4gaXMgcmV0cmlldmVkDQotCQkJCQlpZiAoc3BhY2VGb2xsb3dzICYmIChjb250ZXh0ICE9IENTU19DT01NRU5UKSkgew0KLQkJCQkJCS8vIG5leHQgaXMgc3BhY2UgLT4gYXBwZW5kDQotLy8JCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7DQotCQkJCQkJbGVuZ3RoICs9IHl5bGVuZ3RoKCk7DQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCS8vIG5leHQgaXMgTk9UIHNwYWNlIC0+IHB1c2ggdGhpcyBmb3IgbmV4dCB0aW1lLCByZXR1cm4gaXRzZWxmDQotCQkJCQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG5leHRUb2tlblR5cGU7DQotLy8JCQkJCQlmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7DQotCQkJCQkJZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7DQotCQkJCQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsNCi0JCQlpZiAoY29udGV4dCA9PSBVTkRFRklORUQpIHsNCi0JCQkJY29udGV4dCA9IENTU19VTktOT1dOOw0KLQkJCX0NCi0JCQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOw0KLQkJfSBlbHNlIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0gIAl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotCS8qIGZvciBzdGFuZGFsb25lIHVzZSAqLw0KLSAgCXB1YmxpYyBmaW5hbCBMaXN0IHBhcnNlVGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAJCUxpc3QgdG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOw0KLQ0KLSAgCQlDU1NUZXh0VG9rZW4gdG9rZW47DQotCQlmb3IgKFN0cmluZyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpOyBraW5kICE9IG51bGw7IGtpbmQgPSBwcmltR2V0TmV4dFRva2VuKCkpIHsNCi0JCQl0b2tlbiA9IG5ldyBDU1NUZXh0VG9rZW4oKTsNCi0JCQl0b2tlbi5raW5kID0ga2luZDsgIAkJCQkNCi0JCQl0b2tlbi5zdGFydCA9IHl5Y2hhcjsNCi0JCQl0b2tlbi5sZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJCXRva2VuLmltYWdlID0geXl0ZXh0KCk7DQotCQkJdG9rZW5zLmFkZCh0b2tlbik7DQotCQl9DQotDQotICAJCXJldHVybiB0b2tlbnM7DQotICAJfQ0KLSAgCQ0KLSAgCS8qIHVzZXIgbWV0aG9kICovDQotICAJcHJpdmF0ZSBib29sZWFuIGNhbkNvbnRhaW5TcGFjZShTdHJpbmcgdHlwZSkgew0KLSAgCQlpZiAodHlwZSA9PSBDU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsNCi0gIAkJCXJldHVybiBmYWxzZTsNCi0gIAkJfSBlbHNlIHsNCi0gIAkJCXJldHVybiB0cnVlOw0KLSAgCQl9DQotICAJfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsNCi0JCXJldHVybiB5eWNoYXI7DQotCX0NCi0JDQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgew0KLQkJcmV0dXJuIHp6QXRFT0Y7DQotCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSkgew0KLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgew0KLQkJLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8NCi0JCXp6UmVhZGVyID0gaW47DQotDQotCQkvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLw0KLQkJenpTdGF0ZSA9IDA7DQotDQotCQkvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLw0KLQkJenpMZXhpY2FsU3RhdGUgPSBmSW5pdGlhbFN0YXRlOyAvL1lZSU5JVElBTDsNCi0NCi0JCS8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzDQotCQkJdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovDQotCQlpZiAoenpCdWZmZXIubGVuZ3RoICE9IGZJbml0aWFsQnVmZmVyU2l6ZSkgew0KLQkJCXp6QnVmZmVyID0gbmV3IGNoYXJbZkluaXRpYWxCdWZmZXJTaXplXTsNCi0JCX0NCi0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh6ekJ1ZmZlciwgKGNoYXIpMCk7DQotDQotCQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8NCi0JCXp6TWFya2VkUG9zID0gMDsNCi0NCi0JCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLw0KLS8vCQl5eV9wdXNoYmFja1BvcyA9IDA7DQotDQotCQkvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovDQotCQl6ekN1cnJlbnRQb3MgPSAwOw0KLQ0KLQkJLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLw0KLQkJenpTdGFydFJlYWQgPSAwOw0KLQ0KLQkJLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZA0KLQkJCWZyb20gaW5wdXQgKi8NCi0JCXp6RW5kUmVhZCA9IDA7DQotDQotCQkvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotCQl5eWxpbmUgPSAwOw0KLQ0KLQkJLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLQkJeXljaGFyID0gMDsNCi0NCi0JCS8qKg0KLQkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIA0KLQkJICogbWF0Y2hlZCB0ZXh0DQotCQkgKi8NCi0vLwkJeXljb2x1bW4gPSAwOyANCi0NCi0JCS8qKiANCi0JCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQ0KLQkJICovDQotLy8JCXl5X2F0Qk9MID0gZmFsc2U7DQotCQkNCi0JCS8qKiB6ekF0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0JCXp6QXRFT0YgPSBmYWxzZTsNCi0NCi0JCS8qIHVzZXIgdmFyaWFibGVzICovDQotCQkvLwkJZlVuZGVmaW5lZC5kZWxldGUoMCwgZlVuZGVmaW5lZC5sZW5ndGgoKSk7DQotCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIENTU1Rva2VuaXplcigpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEFkZGVkIHRvIHdvcmthcm91bmQgc3RyaWN0ZXIgY29tcGlsYXRpb24gb3B0aW9ucyB3aXRob3V0IGNyZWF0aW5nDQotCSAqIGFuIGFsdGVybmF0ZSBza2VsZXRvbiBmaWxlDQotCSAqLw0KLQl2b2lkIF91c2VQcml2YXRlcygpIHsNCi0JCVN5c3RlbS5vdXQucHJpbnQoeXljb2x1bW4pOw0KLQkJU3lzdGVtLm91dC5wcmludCh5eWxpbmUpOw0KLQkJU3lzdGVtLm91dC5wcmludChCb29sZWFuLnRvU3RyaW5nKHp6QXRCT0wpKTsNCi0JfQ0KLSV9DQotDQotJXN0YXRlIFNUX0NIQVJTRVRfTkFNRQ0KLSVzdGF0ZSBTVF9DSEFSU0VUX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9JTVBPUlRfVVJJDQotJXN0YXRlIFNUX0lNUE9SVF9NRURJVU0NCi0lc3RhdGUgU1RfSU1QT1JUX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9NRURJQV9NRURJVU0NCi0lc3RhdGUgU1RfTUVESUFfREVMSU1JVEVSDQotJXN0YXRlIFNUX1BBR0VfUFNFVURPX1BBR0UNCi0lc3RhdGUgU1RfUEFHRV9ERUxJTUlURVINCi0lc3RhdGUgU1RfRk9OVF9GQUNFX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9TRUxFQ1RPUg0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9NT0RJRklFUg0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRQ0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1INCi0lc3RhdGUgU1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFDQotJXN0YXRlIFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQNCi0lc3RhdGUgU1RfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SDQotJXN0YXRlIFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRQ0KLSVzdGF0ZSBTVF9ERUNMQVJBVElPTl9WQUxVRQ0KLQ0KLWggPSBbMC05YS1mXQ0KLW5vbmFzY2lpID0gW1x1MDA4MC1cdWZmZmZdDQotdW5pY29kZSA9IFxce2h9ezEsNn1bIFx0XHJcblxmXT8NCi1lc2NhcGUgPSB7dW5pY29kZX18XFxbIC1+XHUwMDgwLVx1ZmZmZl0NCi0NCi0NCi0NCi1ubXN0YXJ0ID0gW19hLXpBLVpdfHtub25hc2NpaX18e2VzY2FwZX0NCi1ubWNoYXIgPSBbX2EtekEtWjAtOS1dfHtub25hc2NpaX18e2VzY2FwZX0NCi1zdHJpbmcxID0gXCIoW1x0ICEjJCUmKC1+XXxcXHtubH18XCd8e25vbmFzY2lpfXx7ZXNjYXBlfSkqXCINCi1zdHJpbmcyID0gXCcoW1x0ICEjJCUmKC1+XXxcXHtubH18XCJ8e25vbmFzY2lpfXx7ZXNjYXBlfSkqXCcNCi0NCi1pZGVudCA9IC0/e25tc3RhcnR9e25tY2hhcn0qDQotdmFsdWVfaWRlbnQgPSAtP3tubXN0YXJ0fSIuIj8oe25tY2hhcn0rIi4iPykqDQotDQotbmFtZSA9IHtubWNoYXJ9Kw0KLW51bSA9IFsrLV0/KFswLTldK3xbMC05XSoiLiJbMC05XSspDQotc3RyaW5nID0ge3N0cmluZzF9fHtzdHJpbmcyfQ0KLXVybCA9IChbICEjJCUmKi1+XXx7bm9uYXNjaWl9fHtlc2NhcGV9KSoNCi1zID0gWyBcdFxyXG5cZl0NCi13ID0ge3N9Kg0KLW5sID0gXG58XHJcbnxccnxcZg0KLQ0KLS8vcmFuZ2UgPSBcP3sxLDZ9fHtofShcP3swLDV9fHtofShcP3swLDR9fHtofShcP3swLDN9fHtofShcP3swLDJ9fHtofShcPz98e2h9KSkpKSkNCi0NCi1oYXNoID0gIiMie25hbWV9DQotdXJpID0gKCJ1cmwoInt3fXtzdHJpbmd9e3d9IikifCJ1cmwoInt3fXt1cmx9e3d9IikiKQ0KLWZ1bmN0aW9uID0ge2lkZW50fSIoIg0KLXVuaWNvZGVfcmFuZ2UgPSAiVSJcK1swLTlhLWZBLUY/XXsxLDZ9KCItIlswLTlhLWZBLUY/XXsxLDZ9KT8NCi0NCi0lJQ0KLQ0KLS8qDQotICogKioqIGdsb2JhbCAqKioNCi0gKi8NCi0NCi17c30rIHsgcmV0dXJuIENTU19TOyB9DQotIjwhLS0iIHsgcmV0dXJuIENTU19DRE87IH0NCi0iLS0+IiB7IHJldHVybiBDU1NfQ0RDOyB9DQotIn0iIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX1JCUkFDRTsgfQ0KLVwvXCpbXipdKlwqKyhbXi8qXVteKl0qXCorKSpcLyB7IHJldHVybiBDU1NfQ09NTUVOVDsgfQ0KLQ0KLS8vPFlZSU5JVElBTD4gew0KLS8vCSJAaW1wb3J0IiB7CXl5YmVnaW4oU1RfSU1QT1JUX1VSSSk7IHJldHVybiBDU1NfSU1QT1JUOyB9DQotLy99DQotDQotLyoNCi0gKiAqKiogY2hhcnNldCBydWxlICoqKg0KLSAqIENIQVJTRVRfU1lNIFMqIFNUUklORyBTKiAnOycNCi0gKi8NCi0NCi0iQGNoYXJzZXQiIHsgeXliZWdpbihTVF9DSEFSU0VUX05BTUUpOyByZXR1cm4gQ1NTX0NIQVJTRVQ7IH0NCi0NCi08U1RfQ0hBUlNFVF9OQU1FPiB7DQotCXtzdHJpbmd9IHsgeXliZWdpbihTVF9DSEFSU0VUX0RFTElNSVRFUik7IHJldHVybiBDU1NfU1RSSU5HOyB9DQotfQ0KLQ0KLTxTVF9DSEFSU0VUX0RFTElNSVRFUj4gew0KLQkiOyIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfREVMSU1JVEVSOyB9DQotfQ0KLQ0KLS8qDQotICogKioqIGltcG9ydCBydWxlICoqKg0KLSAqIElNUE9SVF9TWU0gUyogW1NUUklOR3xVUkldIFMqIFsgbWVkaXVtIFsgQ09NTUEgUyogbWVkaXVtXSogXT8gJzsnIFMqDQotICovDQotDQotIkBpbXBvcnQiIHsgeXliZWdpbihTVF9JTVBPUlRfVVJJKTsgcmV0dXJuIENTU19JTVBPUlQ7IH0NCi0NCi08U1RfSU1QT1JUX1VSST4gew0KLQl7c3RyaW5nfSB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfU1RSSU5HOyB9DQotCS8vCSJ1cmwoInt3fXtzdHJpbmd9e3d9IikiIHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19VUkk7IH0NCi0JLy8JInVybCgie3d9e3VybH17d30iKSIgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX1VSSTsgfQ0KLQl7dXJpfSB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfVVJJOyB9DQotCSI7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7IH0NCi19DQotDQotPFNUX0lNUE9SVF9NRURJVU0+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfSU1QT1JUX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOyB9DQotCSI7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7IH0NCi19DQotDQotPFNUX0lNUE9SVF9ERUxJTUlURVI+IHsNCi0JIjsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsgfQ0KLQkiLCIgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBX1NFUEFSQVRPUjsgfQ0KLX0NCi0NCi0vKg0KLSAqICoqKiBtZWRpYSBydWxlICoqKg0KLSAqIE1FRElBX1NZTSBTKiBtZWRpdW0gWyBDT01NQSBTKiBtZWRpdW0gXSogTEJSQUNFIFMqIHJ1bGVzZXQqICd9JyBTKg0KLSAqLw0KLQ0KLSJAbWVkaWEiIHsgeXliZWdpbihTVF9NRURJQV9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBOyB9DQotDQotLyogDQotICogbWVkaXVtDQotICogSURFTlQgUyoNCi0gKi8NCi08U1RfTUVESUFfTUVESVVNPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX01FRElBX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOyB9DQotCSJ7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi19DQotDQotPFNUX01FRElBX0RFTElNSVRFUj4gew0KLQkieyIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfTEJSQUNFOyB9DQotCSIsIiB7IHl5YmVnaW4oU1RfTUVESUFfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQV9TRVBBUkFUT1I7IH0NCi19DQotDQotLyoNCi0gKiAqKiogcGFnZSBydWxlICoqDQotICogUEFHRV9TWU0gUyogcHNldWRvX3BhZ2U/IFMqIExCUkFDRSBTKiBkZWNsYXJhdGlvbiBbICc7JyBTKiBkZWNsYXJhdGlvbiBdKiAnfScgUyoNCi0gKi8NCi0NCi0iQHBhZ2UiIHsgeXliZWdpbihTVF9QQUdFX1BTRVVET19QQUdFKTsgcmV0dXJuIENTU19QQUdFOyB9DQotIA0KLS8qDQotICogcHNldWRvX3BhZ2UNCi0gKiAnOicgSURFTlQNCi0gKi8NCi0NCi08U1RfUEFHRV9QU0VVRE9fUEFHRT4gew0KLQkiOiI/e2lkZW50fSB7IHl5YmVnaW4oU1RfUEFHRV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX1BBR0VfU0VMRUNUT1I7IH0NCi0JInsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOyB9DQotfQ0KLQ0KLTxTVF9QQUdFX0RFTElNSVRFUj4gew0KLQkieyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi19DQotDQotLyoNCi0gKiBmb250LWZhY2UNCi0gKiBGT05UX0ZBQ0VfU1lNIFMqICd7JyBTKiBkZWNsYXJhdGlvbiBbICc7JyBTKiBkZWNsYXJhdGlvbiAnKiAnfScgUyoNCi0gKi8NCi0NCi0iQGZvbnQtZmFjZSIgeyB5eWJlZ2luKFNUX0ZPTlRfRkFDRV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX0ZPTlRfRkFDRTsgfQ0KLQ0KLTxTVF9GT05UX0ZBQ0VfREVMSU1JVEVSPiB7DQotCSJ7IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLX0NCi0NCi0vKg0KLSAqIHNlbGVjdG9yDQotICogc2ltcGxlX3NlbGVjdG9yIFsgY29tYmluYXRvciBzaW1wbGVfc2VsZWN0b3IgXSoNCi0gKi8NCi0NCi0vKg0KLSAqIHNpbXBsZV9zZWxlY3Rvcg0KLSAqIGVsZW1lbnRfbmFtZSBbIEhBU0ggfCBjbGFzcyB8IGF0dHJpYiB8IHBzZXVkbyBdKiB8IFsgSEFTSCB8IGNsYXNzIHwgYXR0cmliIHwgcHNldWRvIF0rDQotICovDQotDQotPFlZSU5JVElBTCwgU1RfU0VMRUNUT1JfTU9ESUZJRVIsIFNUX1NFTEVDVE9SPiB7DQotCSIqIiB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTDsgfQ0KLQl7aGFzaH0geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9JRDsgfQ0KLS8vCSI6IntpZGVudH0oIigie3N9KntpZGVudH17c30qIikiKT8geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9QU0VVRE87IH0NCi0JIjoiKHtpZGVudH0oIigie3N9KntpZGVudH17c30qIikiKT8pPyB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1BTRVVETzsgfQ0KLQkiLiJ7bmFtZX0geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9DTEFTUzsgfQ0KLQkiWyIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQ7IH0NCi19DQotDQotPFlZSU5JVElBTCwgU1RfU0VMRUNUT1I+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRTsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfTU9ESUZJRVI+IHsNCi0JIiwiIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfU0VQQVJBVE9SOyB9DQotCS8vIHVzaW5nIExPT0tBSEVBRA0KLQl7c30rL1teKz5ceywvXSB7IHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1I7IH0NCi0JIisifCI+IiB7IHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1I7IH0NCi0JInsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOyB9DQotfQ0KLQ0KLS8qDQotICogYXR0cmliDQotICogJ1snIFMqIElERU5UIFMqIFsgWyAnPScgfCBJTkNMVURFUyB8IERBU0hNQVRDSCBdIFMqIFsgSURFTlQgfCBTVFJJTkcgXSBTKiBdPyAnXScNCi0gKi8NCi0NCi08U1RfU0VMRUNUT1JfQVRUUklCVVRFX05BTUU+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRTsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SPiB7DQotCSI9Inwifj0ifCJ8PSIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SOyB9DQotCSJdIiB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQ7IH0NCi19DQotDQotPFNUX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRT4gew0KLQl7aWRlbnR9fHtzdHJpbmd9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUU7IH0NCi19DQotDQotPFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQ+IHsNCi0JIl0iIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORDsgfQ0KLX0NCi0NCi0vKg0KLSAqIGRlY2xhcmF0aW9uDQotICogcHJvcGVydHkgJzonIFMqIGV4cHIgcHJpbz8gfCAvLyBlbXB0eSAvLw0KLSAqLw0KLQ0KLTxTVF9ERUNMQVJBVElPTj4gew0KLQlceDJBP3tpZGVudH0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fUFJPUEVSVFk7IH0NCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUj4gew0KLQkiOiIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SOyB9DQotfQ0KLQ0KLTxTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUsIFNUX0RFQ0xBUkFUSU9OX1ZBTFVFPiB7DQotCSIhIntzfSoiaW1wb3J0YW50IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVDsgfQ0KLQkNCi0JDQotCSIpIiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFOyB9DQotCQ0KLQkvLyBvcmRlcmVkIGZvbGxvd2luZyB0d28gcnVsZXMgZGVsaWJlcmF0ZWx5LCBzZWUgDQotCS8vICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5OTAyDQotCXtudW19e2lkZW50fSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTjsgfQ0KLQl7dmFsdWVfaWRlbnR9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQ7IH0NCi0NCi0NCi0Je251bX0iJSIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFOyB9DQotCQkNCi0Je251bX0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVI7IH0NCi0JDQotCQ0KLQkNCi0Je2Z1bmN0aW9ufSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OOyB9DQotCXtzdHJpbmd9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HOyB9DQotCXt1cml9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJOyB9DQotCSIjIntuYW1lfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0g7IH0NCi0Je3VuaWNvZGVfcmFuZ2V9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRTsgfQ0KLQlbLC9dIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1I7IH0NCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OX1ZBTFVFPiB7DQotCXtzfSsvW147fV0geyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1M7IH0NCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OLCBTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1IsIFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSwgU1RfREVDTEFSQVRJT05fVkFMVUU+IHsNCi0JIjsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSOyB9DQotCS8vCSJ9IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19SQlJBQ0U7IH0NCi19DQotDQotDQotLy88WVlJTklUSUFMLCBTVF9JTVBPUlRfVVJJLCBTVF9JTVBPUlRfTUVESVVNLCBTVF9JTVBPUlRfREVMSU1JVEVSPiB7DQotLy8JXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvIHsgcmV0dXJuIENTU19DT01NRU5UOyB9DQotLy8Je3N9KyB7IHJldHVybiBDU1NfUzsgfQ0KLS8vCS4geyByZXR1cm4gVU5ERUZJTkVEOyB9DQotLy99DQotDQotLy88WVlJTklUSUFMLCBTVF9JTVBPUlRfVVJJLCBTVF9JTVBPUlRfTUVESVVNLCBTVF9JTVBPUlRfREVMSU1JVEVSPiB7DQotLy8JW14gXHRcclxuXGZdKyB7IHJldHVybiBDU1NfVU5LTk9XTjsgfQ0KLS8vfQ0KLQ0KLS4gew0KLQlyZXR1cm4gVU5ERUZJTkVEOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvZmxleC5jbWQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvZmxleC5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOWFlNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL2ZsZXguY21kCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1AZWNobyBvZmYNCi1zZXQgSkFWQV9IT01FPWQ6XGpkazZfMDMNCi1zZXQgSkZMRVhfSE9NRT1EOlxKRmxleFxqZmxleC0xLjQuMg0KLQ0KLSVKQVZBX0hPTUUlXGJpblxqYXZhIC1YbXg0NzBNIC1qYXIgJUpGTEVYX0hPTUUlXGxpYlxKRmxleC5qYXIgQ1NTVG9rZW5pemVyLmpmbGV4DQotbW92ZSBDU1NUb2tlbml6ZXIuamF2YSAuLlwuLlwuLlwuLlwuLlxvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmVcc3JjXG9yZ1xlY2xpcHNlXHdzdFxjc3NcY29yZVxpbnRlcm5hbFxwYXJzZXJcICYmIGRlbCBDU1NUb2tlbml6ZXIuamF2YSoNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL1JFQURNRSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDgyMGUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1kZXZlbCAgICAgLSB0aGUgYWN0aXZlIGRldmVsb3BtZW50IGVudmlyb25tZW50IChzYW5zIEpESykNCi0gICAgICAgICAgICAtIGxhdGVzdCB2ZXJzaW9uIG9mIEhUTUxUb2tlbml6ZXIgc3BlY2lmaWNhdGlvbiBhbmQgZ2VuZXJhdGVkIGNvZGUNCi0gICAgICAgICAgICAtIG1vZGlmaWVkIHNrZWxldG9uIHRvIHByZXZlbnQgVk0gZXhpdHMgb24gdW5tYXRjaGVkIGlucHV0DQotICAgICAgICAgICAgLSAiZmxleCIgc2NyaXB0cyB0byBydW4gSkZsZXggd2l0aCBtb2RpZmllZCBza2VsZXRvbg0KLSAgICAgICAgICAgIC0gYWN0aXZlIFJDUyBhcmNoaXZlDQotcmVzb3VyY2VzIC0gYmFja3VwL3ByaXN0aW5lIHJlc291cmNlcw0KLSAgICAgICAgICAgIC0gVW5tb2RpZmllZCBKRmxleCAxLjIuMiBkb3dubG9hZA0KLSAgICAgICAgICAgIC0gU2VwYXJhdGUgbW9kaWZpY2F0aW9ucyB0byB0aGUgSkZsZXggc2tlbGV0b24NCi0gICAgICAgICAgICAtIFczQyBYTUwgcmVjb21tZW5kYXRpb24gdXNlZCBmb3Igc2V2ZXJhbCBvZiB0aGUgSFRNTFRva2VuaXplciBydWxlcw0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvSlNQVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pTUFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDI0NDc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvSlNQVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODM4ICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDEwLzI0LzA3IDU6MTYgQU0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5UYWdNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5JbnRTdGFjazsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXg8L2E+IDEuMi4yCi0gKiBvbiAxMC8yNC8wNyA1OjE2IEFNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PmZpbGU6L0Q6L2VjbGlwc2Uud3RwL3dvcmtzcGFjZS9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9KU1BUb2tlbml6ZXIuamZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgSlNQVG9rZW5pemVyIGltcGxlbWVudHMgQmxvY2tUb2tlbml6ZXIsIERPTUpTUFJlZ2lvbkNvbnRleHRzIHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTF9EUVVPVEVTID0gNTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkxfU1FVT1RFUyA9IDUwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMX1NRVU9URVNfRU5EID0gNTI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9DT01NRU5UX0VORCA9IDQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFID0gMjE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTF9TUVVPVEVTX0VORCA9IDQ1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRUxfRFFVT1RFUyA9IDQ0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRUwgPSA0MjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQkxPQ0tfVEFHX1NDQU4gPSAzNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMX1NRVU9URVMgPSA0MzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFID0gMTQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSA9IDg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX1RBR19DTE9TRSA9IDE1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQgPSA0MTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfRVFVQUxTID0gMTM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUgPSAxMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSA9IDI1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMID0gNDk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9TUVVPVEVEX1ZCTCA9IDU1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQgPSA0MDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9OQU1FID0gMjM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FUVVBTFMgPSAyNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRSA9IDE5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfQ09OVEVOVCA9IDE2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0gPSAzMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04gPSAzMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFID0gMjc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTID0gMjA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkxfRFFVT1RFU19FTkQgPSA1MzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RRVU9URURfRUwgPSA0NzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04gPSAyODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0RBVEFfRU5EID0gMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUElfV1MgPSA2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DREFUQV9URVhUID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0UgPSAxODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCA9IDMzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTiA9IDM0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRUxfRFFVT1RFU19FTkQgPSA0NjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1NRVU9URURfRUwgPSA0ODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0NPTU1FTlRfRU5EID0gMzk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9FUVVBTFMgPSA5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UID0gMzU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyA9IDMwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRFFVT1RFRF9WQkwgPSA1NDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfQVRUUklCVVRFX05BTUUgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQUJPUlRfRU1CRURERUQgPSAzNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQgPSAyOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0NPTU1FTlQgPSAzODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUElfQ09OVEVOVCA9IDc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOID0gMzc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJID0gNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RFQ0xBUkFUSU9OID0gMjY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSA9IDE3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfVEFHX05BTUUgPSAyMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX1RBR19DTE9TRSA9IDExOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQ09NTUVOVCA9IDM7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gCi0gICAgIlwxMVwwXDFcNVwxXDI2XDJcMFwxXDE3XDIyXDBcMVwxN1wxXDI1XDFcMTJcMVw2NSIrCi0gICAgIlwxXDE1XDFcMjJcMVwxM1wxXDE0XDFcMjRcMVwyNFwxXDI0XDFcMjRcMVwyNFwxXDciKwotICAgICJcMVw2XDFcM1wxMlwyMFwxXDExXDFcNzJcMVwxXDFcNTFcMVwyXDFcNFwxXDIxIisKLSAgICAiXDFcNDBcMVw3M1wxXDM2XDFcMzdcMVw1NVwxXDcwXDFcNjJcMVw2MlwxXDYzXDFcNjIiKwotICAgICJcMVw2MlwxXDMzXDFcMzFcMVw2NFwxXDUyXDFcNTRcMVw2MlwxXDY3XDFcNjZcMVw0MSIrCi0gICAgIlwxXDcxXDJcNjJcMVwyN1wxXDUzXDFcNjJcMVwzNVwxXDEwNFwxXDIzXDFcMFwxXDEwIisKLSAgICAiXDFcMFwxXDU3XDFcMTAzXDFcNzRcMVw2MFwxXDQzXDFcNzBcMVw3NVwxXDEwNlwxXDQ2IisKLSAgICAiXDFcMTAwXDFcNjJcMVwzNFwxXDMyXDFcNTBcMVw0N1wxXDEwMVwxXDYyXDFcNDRcMVw0NSIrCi0gICAgIlwxXDU2XDFcMTAyXDFcNDJcMVw2MlwxXDMwXDFcNjFcMVw2MlwxXDE2XDFcMFwxXDEwNSIrCi0gICAgIlw3MVwwXDFcNzdcMTBcMFwyN1w3NlwxXDBcMzdcNzZcMVwwXDcyXDc2XDJcMFwxM1w3NiIrCi0gICAgIlwyXDBcMTBcNzZcMVwwXDY1XDc2XDFcMFwxMDRcNzZcMTFcMFw0NFw3NlwzXDBcMlw3NiIrCi0gICAgIlw0XDBcMzZcNzZcNzBcMFwxMzFcNzZcMjJcMFw3XDc2XDE2XDBcMlw3N1w1NlwwXDEwNlw3NyIrCi0gICAgIlwzMlwwXDJcNzdcNDRcMFwxXDc2XDFcNzdcM1w3NlwxXDBcMVw3NlwxXDBcMjRcNzYiKwotICAgICJcMVwwXDU0XDc2XDFcMFw3XDc2XDNcMFwxXDc2XDFcMFwxXDc2XDFcMFwxXDc2IisKLSAgICAiXDFcMFwxXDc2XDFcMFwyMlw3NlwxNVwwXDE0XDc2XDFcMFwxMDJcNzZcMVwwXDE0XDc2IisKLSAgICAiXDFcMFw0NFw3NlwxXDBcNFw3N1wxMVwwXDY1XDc2XDJcMFwyXDc2XDJcMFwyXDc2IisKLSAgICAiXDNcMFwzNFw3NlwyXDBcMTBcNzZcMlwwXDJcNzZcNjdcMFw0Nlw3NlwyXDBcMVw3NiIrCi0gICAgIlw3XDBcNDZcNzZcMTJcMFwyMVw3N1wxXDBcMjdcNzdcMVwwXDNcNzdcMVwwXDFcNzciKwotICAgICJcMVwwXDJcNzdcMVwwXDFcNzdcMTNcMFwzM1w3Nlw1XDBcM1w3Nlw1NlwwXDMyXDc2IisKLSAgICAiXDVcMFwxXDc3XDEyXDc2XDEwXDc3XDE1XDBcMTJcNzdcNlwwXDFcNzdcMTA3XDc2XDJcMCIrCi0gICAgIlw1XDc2XDFcMFwxN1w3NlwxXDBcNFw3NlwxXDBcMVw3NlwxN1w3N1wyXDc2XDJcNzciKwotICAgICJcMVwwXDRcNzdcMlwwXDEyXDc3XHUwMjA3XDBcM1w3N1wxXDBcNjVcNzZcMlwwXDFcNzciKwotICAgICJcMVw3NlwyMFw3N1wzXDBcNFw3N1wzXDBcMTJcNzZcMlw3N1wyXDBcMTJcNzdcMjFcMCIrCi0gICAgIlwzXDc3XDFcMFwxMFw3NlwyXDBcMlw3NlwyXDBcMjZcNzZcMVwwXDdcNzZcMVwwIisKLSAgICAiXDFcNzZcM1wwXDRcNzZcMlwwXDFcNzdcMVwwXDdcNzdcMlwwXDJcNzdcMlwwIisKLSAgICAiXDNcNzdcMTFcMFwxXDc3XDRcMFwyXDc2XDFcMFwzXDc2XDJcNzdcMlwwXDEyXDc3IisKLSAgICAiXDJcNzZcMjBcMFwxXDc3XDJcMFw2XDc2XDRcMFwyXDc2XDJcMFwyNlw3NlwxXDAiKwotICAgICJcN1w3NlwxXDBcMlw3NlwxXDBcMlw3NlwxXDBcMlw3NlwyXDBcMVw3N1wxXDAiKwotICAgICJcNVw3N1w0XDBcMlw3N1wyXDBcM1w3N1wxM1wwXDRcNzZcMVwwXDFcNzZcN1wwIisKLSAgICAiXDEyXDc3XDJcNzdcM1w3NlwxNFwwXDNcNzdcMVwwXDdcNzZcMVwwXDFcNzZcMVwwIisKLSAgICAiXDNcNzZcMVwwXDI2XDc2XDFcMFw3XDc2XDFcMFwyXDc2XDFcMFw1XDc2XDJcMCIrCi0gICAgIlwxXDc3XDFcNzZcMTBcNzdcMVwwXDNcNzdcMVwwXDNcNzdcMjJcMFwxXDc2XDVcMCIrCi0gICAgIlwxMlw3N1wyMVwwXDNcNzdcMVwwXDEwXDc2XDJcMFwyXDc2XDJcMFwyNlw3NlwxXDAiKwotICAgICJcN1w3NlwxXDBcMlw3NlwyXDBcNFw3NlwyXDBcMVw3N1wxXDc2XDZcNzdcM1wwIisKLSAgICAiXDJcNzdcMlwwXDNcNzdcMTBcMFwyXDc3XDRcMFwyXDc2XDFcMFwzXDc2XDRcMCIrCi0gICAgIlwxMlw3N1wyMlwwXDJcNzdcMVwwXDZcNzZcM1wwXDNcNzZcMVwwXDRcNzZcM1wwIisKLSAgICAiXDJcNzZcMVwwXDFcNzZcMVwwXDJcNzZcM1wwXDJcNzZcM1wwXDNcNzZcM1wwIisKLSAgICAiXDEwXDc2XDFcMFwzXDc2XDRcMFw1XDc3XDNcMFwzXDc3XDFcMFw0XDc3XDExXDAiKwotICAgICJcMVw3N1wxN1wwXDExXDc3XDIxXDBcM1w3N1wxXDBcMTBcNzZcMVwwXDNcNzZcMVwwIisKLSAgICAiXDI3XDc2XDFcMFwxMlw3NlwxXDBcNVw3Nlw0XDBcN1w3N1wxXDBcM1w3N1wxXDAiKwotICAgICJcNFw3N1w3XDBcMlw3N1wxMVwwXDJcNzZcNFwwXDEyXDc3XDIyXDBcMlw3N1wxXDAiKwotICAgICJcMTBcNzZcMVwwXDNcNzZcMVwwXDI3XDc2XDFcMFwxMlw3NlwxXDBcNVw3Nlw0XDAiKwotICAgICJcN1w3N1wxXDBcM1w3N1wxXDBcNFw3N1w3XDBcMlw3N1w3XDBcMVw3NlwxXDAiKwotICAgICJcMlw3Nlw0XDBcMTJcNzdcMjJcMFwyXDc3XDFcMFwxMFw3NlwxXDBcM1w3NlwxXDAiKwotICAgICJcMjdcNzZcMVwwXDIwXDc2XDRcMFw2XDc3XDJcMFwzXDc3XDFcMFw0XDc3XDExXDAiKwotICAgICJcMVw3N1wxMFwwXDJcNzZcNFwwXDEyXDc3XDIyMVwwXDU2XDc2XDFcMFwxXDc2XDFcNzciKwotICAgICJcMlw3Nlw3XDc3XDVcMFw2XDc2XDFcNzdcMTBcNzdcMVwwXDEyXDc3XDQ3XDBcMlw3NiIrCi0gICAgIlwxXDBcMVw3NlwyXDBcMlw3NlwxXDBcMVw3NlwyXDBcMVw3Nlw2XDBcNFw3NiIrCi0gICAgIlwxXDBcN1w3NlwxXDBcM1w3NlwxXDBcMVw3NlwxXDBcMVw3NlwyXDBcMlw3NiIrCi0gICAgIlwxXDBcMlw3NlwxXDBcMVw3NlwxXDc3XDJcNzZcNlw3N1wxXDBcMlw3N1wxXDc2IisKLSAgICAiXDJcMFw1XDc2XDFcMFwxXDc3XDFcMFw2XDc3XDJcMFwxMlw3N1w3NlwwXDJcNzciKwotICAgICJcNlwwXDEyXDc3XDEzXDBcMVw3N1wxXDBcMVw3N1wxXDBcMVw3N1w0XDBcMlw3NyIrCi0gICAgIlwxMFw3NlwxXDBcNDFcNzZcN1wwXDI0XDc3XDFcMFw2XDc3XDRcMFw2XDc3XDFcMCIrCi0gICAgIlwxXDc3XDFcMFwyNVw3N1wzXDBcN1w3N1wxXDBcMVw3N1wzNDZcMFw0Nlw3NlwxMlwwIisKLSAgICAiXDQ3XDc2XDExXDBcMVw3NlwxXDBcMlw3NlwxXDBcM1w3NlwxXDBcMVw3NlwxXDAiKwotICAgICJcMlw3NlwxXDBcNVw3Nlw1MVwwXDFcNzZcMVwwXDFcNzZcMVwwXDFcNzZcMTNcMCIrCi0gICAgIlwxXDc2XDFcMFwxXDc2XDFcMFwxXDc2XDNcMFwyXDc2XDNcMFwxXDc2XDVcMCIrCi0gICAgIlwzXDc2XDFcMFwxXDc2XDFcMFwxXDc2XDFcMFwxXDc2XDFcMFwxXDc2XDNcMCIrCi0gICAgIlwyXDc2XDNcMFwyXDc2XDFcMFwxXDc2XDUwXDBcMVw3NlwxMVwwXDFcNzZcMlwwIisKLSAgICAiXDFcNzZcMlwwXDJcNzZcN1wwXDJcNzZcMVwwXDFcNzZcMVwwXDdcNzZcNTBcMCIrCi0gICAgIlwxXDc2XDRcMFwxXDc2XDEwXDBcMVw3Nlx1MGMwNlwwXDIzNFw3Nlw0XDBcMTMyXDc2XDZcMCIrCi0gICAgIlwyNlw3NlwyXDBcNlw3NlwyXDBcNDZcNzZcMlwwXDZcNzZcMlwwXDEwXDc2XDFcMCIrCi0gICAgIlwxXDc2XDFcMFwxXDc2XDFcMFwxXDc2XDFcMFwzN1w3NlwyXDBcNjVcNzZcMVwwIisKLSAgICAiXDdcNzZcMVwwXDFcNzZcM1wwXDNcNzZcMVwwXDdcNzZcM1wwXDRcNzZcMlwwIisKLSAgICAiXDZcNzZcNFwwXDE1XDc2XDVcMFwzXDc2XDFcMFw3XDc2XDMyM1wwXDE1XDc3XDRcMCIrCi0gICAgIlwxXDc3XDEwNFwwXDFcNzZcM1wwXDJcNzZcMlwwXDFcNzZcMTIxXDBcM1w3Nlx1MGU4MlwwIisKLSAgICAiXDFcNzdcMVwwXDFcNzZcMzFcMFwxMVw3Nlw2XDc3XDFcMFw1XDc3XDEzXDBcMTI0XDc2IisKLSAgICAiXDRcMFwyXDc3XDJcMFwyXDc3XDJcMFwxMzJcNzZcMVwwXDNcNzdcNlwwXDUwXDc2IisKLSAgICAiXHUxY2QzXDBcdTUxYTZcNzZcdTBjNWFcMFx1MmJhNFw3NlwxMzRcMFx1MDgwMFwwXHUxZmZlXDBcMlwwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgYSBzdGF0ZSB0byBhIHJvdyBpbmRleCBpbiB0aGUgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5X3Jvd01hcCBbXSA9IHsgCi0gICAgICAgIDAsICAgIDcxLCAgIDE0MiwgICAyMTMsICAgMjg0LCAgIDM1NSwgICA0MjYsICAgNDk3LCAgIDU2OCwgICA2MzksIAotICAgICAgNzEwLCAgIDc4MSwgICA4NTIsICAgOTIzLCAgIDk5NCwgIDEwNjUsICAxMTM2LCAgMTIwNywgIDEyNzgsICAxMzQ5LCAKLSAgICAgMTQyMCwgIDE0OTEsICAxNTYyLCAgMTYzMywgIDE3MDQsICAxNzc1LCAgMTg0NiwgIDE5MTcsICAxOTg4LCAgMjA1OSwgCi0gICAgIDIxMzAsICAyMjAxLCAgMjI3MiwgIDIzNDMsICAyNDE0LCAgMjQ4NSwgIDI1NTYsICAyNjI3LCAgMjY5OCwgIDI3NjksIAotICAgICAyODQwLCAgMjkxMSwgIDI5ODIsICAzMDUzLCAgMzEyNCwgIDMxOTUsICAzMjY2LCAgMzMzNywgIDM0MDgsICAzNDc5LCAKLSAgICAgMzU1MCwgIDM2MjEsICAzNjkyLCAgMzc2MywgIDM4MzQsICAzOTA1LCAgMzk3NiwgIDQwNDcsICA0MTE4LCAgNDE4OSwgCi0gICAgIDQyNjAsICA0MzMxLCAgNDQwMiwgIDQ0NzMsICA0NDAyLCAgNDQ3MywgIDQ1NDQsICA0NDAyLCAgNDQwMiwgIDQ0NzMsIAotICAgICA0NjE1LCAgNDY4NiwgIDQ3NTcsICA0ODI4LCAgNDg5OSwgIDQ5NzAsICA1MDQxLCAgNTExMiwgIDQ0MDIsICA0NDczLCAKLSAgICAgNTE4MywgIDUyNTQsICA1MzI1LCAgNDQwMiwgIDUzOTYsICA1Mzk2LCAgNTQ2NywgIDU1MzgsICA1NjA5LCAgNTE4MywgCi0gICAgIDQ0MDIsICA1NjgwLCAgNTc1MSwgIDQ0MDIsICA1ODIyLCAgNTg5MywgIDU5NjQsICA2MDM1LCAgNDQwMiwgIDQ0NzMsIAotICAgICA2MTA2LCAgNjE3NywgIDYyNDgsICA2MzE5LCAgNjM5MCwgIDY0NjEsICA0NDAyLCAgNjUzMiwgIDY1MzIsICA2NjAzLCAKLSAgICAgNjY3NCwgIDY3NDUsICA2ODE2LCAgNjg4NywgIDQ0MDIsICA2OTU4LCAgNzAyOSwgIDcxMDAsICA3MTcxLCAgNzI0MiwgCi0gICAgIDczMTMsICA0NDAyLCAgNzM4NCwgIDc0NTUsICA3NTI2LCAgNzU5NywgIDc2NjgsICA3NzM5LCAgNzgxMCwgIDc4ODEsIAotICAgICA0NDAyLCAgNzk1MiwgIDgwMjMsICA4MDk0LCAgODE2NSwgIDgyMzYsICA4MzA3LCAgODM3OCwgIDg0NDksICA4NDQ5LCAKLSAgICAgODUyMCwgIDg1OTEsICA4NjYyLCAgODczMywgIDg3MzMsICA4ODA0LCAgODg3NSwgIDg5NDYsICA5MDE3LCAgOTAxNywgCi0gICAgIDkwODgsICA5MTU5LCAgOTIzMCwgIDkzMDEsICA0NDAyLCAgOTM3MiwgIDkzNzIsICA5NDQzLCAgOTUxNCwgIDk1ODUsIAotICAgICA5NjU2LCAgNDQwMiwgIDQ0MDIsICA0NDczLCAgNDQwMiwgIDQ0NzMsICA5NzI3LCAgOTc5OCwgIDk4NjksICA5OTQwLCAKLSAgICAgNDQwMiwgMTAwMTEsIDEwMDgyLCAxMDE1MywgMTAyMjQsICA0NDAyLCAxMDI5NSwgMTAzNjYsIDEwNDM3LCAxMDUwOCwgCi0gICAgIDQ0MDIsICA0NDAyLCAxMDU3OSwgIDQ0MDIsIDEwNjUwLCAxMDcyMSwgMTA2NTAsIDEwNzkyLCAxMDg2MywgMTA3OTIsIAotICAgICA0NDAyLCAgNDQwMiwgMTA5MzQsIDExMDA1LCAxMTA3NiwgIDQ0MDIsIDExMTQ3LCAxMTIxOCwgMTEyODksIDExMzYwLCAKLSAgICAxMTQzMSwgIDQ0MDIsICA0NDAyLCAxMTUwMiwgIDQ0MDIsIDExNTczLCAxMTY0NCwgMTE1NzMsIDExNzE1LCAxMTc4NiwgCi0gICAgMTE3MTUsICA0NDAyLCAgNDQwMiwgMTE4NTcsIDExOTI4LCAxMTk5OSwgIDQ0MDIsIDEyMDcwLCAxMjE0MSwgMTIyMTIsIAotICAgICA0NDAyLCAgNDQwMiwgMTIyODMsIDEyMzU0LCAxMjQyNSwgMTI0OTYsIDEyNTY3LCAgNDQwMiwgMTI2MzgsIDEyNzA5LCAKLSAgICAxMjc4MCwgMTI4NTEsIDEyOTIyLCAxMjk5MywgMTMwNjQsIDEzMTM1LCAgNDQwMiwgMTMyMDYsIDEzMjc3LCAxMzM0OCwgCi0gICAgIDQ0MDIsICA0NDAyLCAgNTM5NiwgIDU1MzgsICA0NDAyLCAxMzQxOSwgIDU2MDksIDEzNDkwLCAgNTY4MCwgIDU4MjIsIAotICAgICA1ODkzLCAxMzU2MSwgIDU5NjQsICA0NDAyLCAxMzYzMiwgMTM3MDMsICA2MDM1LCAxMzc3NCwgIDQ0MDIsIDEyMzU0LCAKLSAgICAgNDQwMiwgIDY1MzIsICA2NjAzLCAgNDQwMiwgMTM4NDUsICA2Njc0LCAxMzkxNiwgIDQ0MDIsIDEzOTg3LCAxNDA1OCwgCi0gICAgIDczODQsIDE0MTI5LCAgNzU5NywgIDQ0MDIsIDE0MjAwLCAgNzY2OCwgMTQyNzEsIDE0MzQyLCAxNDQxMywgMTQ0ODQsIAotICAgIDE0NTU1LCAxNDYyNiwgIDgxNjUsICA0NDAyLCAxNDY5NywgMTQ3NjgsICA4NDQ5LCAgODUyMCwgIDQ0MDIsIDE0ODM5LCAKLSAgICAxNDkxMCwgMTQ5ODEsIDE1MDUyLCAxNTEyMywgIDg2NjIsICA4NDQ5LCAgODczMywgIDg4MDQsICA0NDAyLCAgODg3NSwgCi0gICAgIDg5NDYsICA4NzMzLCAgOTAxNywgIDkwODgsICA0NDAyLCAxNTE5NCwgMTUyNjUsIDE1MzM2LCAxNTQwNywgMTU0NzgsIAotICAgIDE1NTQ5LCAxNTYyMCwgIDkzNzIsICA5NDQzLCAgNDQwMiwgMTU2OTEsIDE1NzYyLCAxNTgzMywgMTU5MDQsIDE1OTc1LCAKLSAgICAxNjA0NiwgMTYxMTcsIDE2MTg4LCAxNjI1OSwgIDQ0MDIsICA0NDAyLCAgNDQwMiwgMTYzMzAsICA0NDAyLCAgNDQwMiwgCi0gICAgMTY0MDEsIDE2NDcyLCAxNjU0MywgMTY2MTQsIDEwNjUwLCAgNDQwMiwgMTY2ODUsIDE2NzU2LCAxMDc5MiwgIDQ0MDIsIAotICAgIDE2ODI3LCAxNjg5OCwgMTY5NjksIDE3MDQwLCAxNzExMSwgMTcxODIsIDE3MjUzLCAxNzMyNCwgMTczOTUsIDExMzYwLCAKLSAgICAxMTU3MywgIDQ0MDIsIDE3NDY2LCAxNzUzNywgMTE3MTUsICA0NDAyLCAxNzYwOCwgMTc2NzksIDE3NzUwLCAxNzgyMSwgCi0gICAgMTc4OTIsIDE3OTYzLCAxODAzNCwgMTgxMDUsIDE4MTc2LCAgNDQwMiwgIDQ0MDIsICA0NDAyLCAxODI0NywgMTgzMTgsIAotICAgIDE4Mzg5LCAxODQ2MCwgMTg1MzEsICA0NDAyLCAxODYwMiwgMTg2NzMsICA0NDAyLCAgNDQwMiwgIDQ0MDIsICA0NDAyLCAKLSAgICAgNDQwMiwgIDQ4MjgsIDE4NzQ0LCAxODgxNSwgMTg4ODYsIDE4OTU3LCAxOTAyOCwgMTkwOTksIDE5MTcwLCAxOTA5OSwgCi0gICAgMTkyNDEsIDE5MzEyLCAxOTI0MSwgMTkzODMsIDE5NDU0LCAxOTUyNSwgMTk1OTYsIDE5NjY3LCAxOTczOCwgMTk4MDksIAotICAgIDE5ODA5LCAxOTg4MCwgMTk5NTEsIDE5OTUxLCAyMDAyMiwgIDkyMzAsICA5MjMwLCAgOTIzMCwgMjAwOTMsIDIwMTY0LCAKLSAgICAyMDIzNSwgMjAyMzUsIDIwMzA2LCAgOTU4NSwgIDk1ODUsICA5NTg1LCAyMDM3NywgMjA0NDgsIDE2NTQzLCAyMDUxOSwgCi0gICAgMTA0MzcsIDEwNDM3LCAxMDQzNywgMjA1OTAsIDIwNjYxLCAxMDY1MCwgMTA2NTAsIDEwNjUwLCAyMDczMiwgMjA4MDMsIAotICAgIDEwNzkyLCAxMDc5MiwgMTA3OTIsIDIwODc0LCAyMDk0NSwgMTA5MzQsIDEwOTM0LCAxMDkzNCwgMTcxMTEsIDIxMDE2LCAKLSAgICAyMTA4NywgMTExNDcsIDExMTQ3LCAxMTE0NywgMTczMjQsIDIxMTU4LCAyMTIyOSwgMTEzNjAsIDExMzYwLCAxMTM2MCwgCi0gICAgMjEzMDAsIDExNTczLCAxMTU3MywgMTE1NzMsIDIxMzcxLCAyMTQ0MiwgMTE3MTUsIDExNzE1LCAxMTcxNSwgMjE1MTMsIAotICAgIDIxNTg0LCAxMTg1NywgMTE4NTcsIDExODU3LCAxNzg5MiwgMjE2NTUsIDIxNzI2LCAxMjA3MCwgMTIwNzAsIDEyMDcwLCAKLSAgICAxODEwNSwgMjE3OTcsICA0NDAyLCAgNDQwMiwgMjE4NjgsIDIxOTM5LCAgNDQwMiwgMjIwMTAsIDIyMDgxLCAyMjE1MiwgCi0gICAgMjIyMjMsICA3Mzg0LCAgNDQwMiwgIDQ0MDIsIDIyMjk0LCAyMjM2NSwgMjI0MzYsIDIyNTA3LCAyMjU3OCwgMTUwNTIsIAotICAgIDE1NDA3LCAgOTIzMCwgMjI2NDksIDE1OTA0LCAgOTU4NSwgMjI3MjAsICA0NDAyLCAxMDQzNywgMTA2NTAsIDIyNzkxLCAKLSAgICAxMDc5MiwgMjI4NjIsIDEwOTM0LCAyMjkzMywgIDQ0MDIsIDExMTQ3LCAyMzAwNCwgMTEzNjAsIDExNTczLCAyMzA3NSwgCi0gICAgMTE3MTUsIDIzMTQ2LCAxMTg1NywgMjMyMTcsICA0NDAyLCAxMjA3MCwgMjMyODgsIDIzMzU5LCAyMzQzMCwgMjM1MDEsIAotICAgIDIzNTcyLCAyMzY0MywgMjM3MTQsIDIzNzg1LCAyMzg1NiwgMjM5MjcsIDIzOTk4LCAyNDA2OSwgMjQxNDAsIDI0MjExLCAKLSAgICAyNDI4MiwgMjQzNTMsIDI0NDI0LCAyNDQ5NSwgMjQ1NjYsIDI0NjM3LCAyNDcwOCwgMjQ3NzksIDI0ODUwLCAgNDgyOCwgCi0gICAgMjQ5MjEsIDI0OTkyLCAyNTA2MywgMjUxMzQsIDI1MjA1LCAgNDQwMiwgIDQ0MDIsIDI1Mjc2LCAyNTM0NywgMjU0MTgsIAotICAgIDI1NDg5LCAxNzExMSwgMTczMjQsIDI1NTYwLCAyNTYzMSwgMTc4OTIsIDE4MTA1LCAyNTcwMiwgMjU3NzMsIDI1ODQ0LCAKLSAgICAyNTkxNSwgIDQ0MDIsICA0NDAyLCAgNDQwMiwgMjU5ODYsIDI2MDU3LCAyNjEyOCwgMjYxOTksIDI2MjcwLCAyNjM0MSwgCi0gICAgMjY0MTIsIDI2NDgzLCAgNzEwMCwgMjY1NTQsIDI2NjI1LCAyNjY5NiwgMjY3NjcsIDI2ODM4LCAyNjkwOSwgMjY5ODAsIAotICAgICA0NDAyLCAyNzA1MSwgMjcxMjIsICA5MjMwLCAgOTU4NSwgMTA2NTAsIDEwNzkyLCAxMTU3MywgMTE3MTUsIDI3MTkzLCAKLSAgICAyNzI2NCwgMjczMzUsIDI3NDA2LCAyNzQ3NywgMjc1NDgsIDI3NjE5LCAyNzY5MCwgIDQ4MjgsIDI3NzYxLCAyNzgzMiwgCi0gICAgMjc5MDMsIDI3OTc0LCAyODA0NSwgMjgxMTYsIDI4MTg3LCAyODI1OCwgMjgzMjksIDI4NDAwLCAyODQ3MSwgMjg1NDIsIAotICAgIDI4NjEzLCAyODY4NCwgMjg3NTUsIDI4ODI2LCAyODg5NywgMjg5NjgsIDI5MDM5LCAyOTExMCwgMjkxODEsIDI5MjUyLCAKLSAgICAyOTMyMywgMjkzOTQsIDI5NDY1LCAyOTUzNiwgMjk2MDcsIDI5Njc4LCAyOTc0OSwgMjk4MjAsIDI5ODkxLCAyOTk2MiwgCi0gICAgMzAwMzMsIDMwMTA0LCAzMDE3NSwgMzAyNDYsICA0NDAyLCAzMDMxNywgMzAzODgsIDMwNDU5LCAzMDUzMCwgIDcxMDAsIAotICAgIDMwNjAxLCAzMDY3MiwgMzA3NDMsIDMwODE0LCAzMDg4NSwgMzA5NTYsIDMxMDI3LCAzMTA5OCwgMzExNjksIDMxMjQwLCAKLSAgICAzMTMxMSwgMzEzODIsIDMxNDUzLCAzMTUyNAotICB9OwotCi0gIC8qKiAKLSAgICogVGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eV9wYWNrZWQgPSAKLSAgICAiXDFcNzFcMVw3MlwxMVw3MVwxXDczXDFcNzFcMVw3NFw0XDcxXDFcNzUiKwotICAgICJcNDJcNzFcMVw3NlwyMVw3MVwxXDc3XDFcMTAwXDEwNVw3N1wxXDEwMVwxXDEwMiIrCi0gICAgIlwyMVwxMDFcMVwxMDNcMlwxMDFcMVwxMDRcNjBcMTAxXDFcMTA1XDFcMTA2XDEwNVwxMDUiKwotICAgICJcMVwxMDFcMVwxMDJcNVwxMDFcMVwxMDdcMTZcMTAxXDFcMTA0XDYxXDEwMVwxXDEwMiIrCi0gICAgIlwyXDEwMVwxXDExMFwxXDExMVwyXDEwMVwyXDExMlw1XDEwMVwxXDExMVw2XDEwMSIrCi0gICAgIlwxXDExMVwxXDExM1wxXDExNFw0XDExMlwxXDEwMVwxMFwxMTJcMVwxMTVcMlwxMTIiKwotICAgICJcMVwxMDFcMTFcMTEyXDFcMTE1XDFcMTEyXDFcMTAxXDRcMTEyXDFcMTAxXDRcMTEyIisKLSAgICAiXDFcMTAxXDRcMTEyXDJcMTAxXDFcMTEyXDFcMTAxXDFcMTAyXDJcMTAxXDFcMTEwIisKLSAgICAiXDFcMTE2XDExXDEwMVwxXDExNlw2XDEwMVwxXDExNlw2MFwxMDFcMVwxMTdcMVwxMjAiKwotICAgICJcMlwxMTdcMVwxMjFcMjFcMTE3XDFcMTA0XDYwXDExN1wxXDEwMVwxXDEwMlwyXDEwMSIrCi0gICAgIlwxXDEyMlwxXDExMVwyXDEwMVwyXDEyM1w1XDEwMVwxXDExMVw2XDEwMVwxXDExMSIrCi0gICAgIlw2XDEyM1wxXDEwMVwxM1wxMjNcMVwxMDFcMTNcMTIzXDFcMTAxXDRcMTIzXDFcMTAxIisKLSAgICAiXDRcMTIzXDFcMTAxXDRcMTIzXDJcMTAxXDFcMTIzXDFcMTAxXDFcMTAyXDJcMTAxIisKLSAgICAiXDFcMTIyXDFcMTExXDJcMTAxXDJcMTIzXDVcMTAxXDFcMTExXDZcMTAxXDFcMTExIisKLSAgICAiXDZcMTIzXDFcMTAxXDEzXDEyM1wxXDEyNFwxM1wxMjNcMVwxMDFcNFwxMjNcMVwxMDEiKwotICAgICJcNFwxMjNcMVwxMDFcNFwxMjNcMlwxMDFcMVwxMjNcMVwxMjVcMVwxMDJcMVwxMDEiKwotICAgICJcMVwxMjZcMVwxMjdcMVwxMTFcNFwxMjVcMVwxMzBcMVwxMjVcMVwxMzFcMlwxMjUiKwotICAgICJcMVwxMTFcNlwxMjVcMVwxMTFcNjBcMTI1XDFcMTAxXDFcMTAyXDJcMTAxXDFcMTMyIisKLSAgICAiXDIxXDEwMVwxXDEwNFw2MVwxMDFcMVwxMDJcMVwxMzNcMVwxMzRcMVwxMDFcMVwxMTEiKwotICAgICJcMlwxMDFcMlwxMzVcNVwxMDFcMVwxMTFcNlwxMDFcMVwxMTFcNlwxMzVcMVwxMDEiKwotICAgICJcMTNcMTM1XDFcMTAxXDEzXDEzNVwxXDEwMVw0XDEzNVwxXDEwMVw0XDEzNVwxXDEwMSIrCi0gICAgIlw0XDEzNVwyXDEwMVwxXDEzNVwxXDEwMVwxXDEwMlwxXDEzM1wxXDEzNFwxXDEwMSIrCi0gICAgIlwxXDExMVwyXDEwMVwyXDEzNVw1XDEwMVwxXDExMVw2XDEwMVwxXDExMVw2XDEzNSIrCi0gICAgIlwxXDEwMVwxM1wxMzVcMVwxMzZcMTNcMTM1XDFcMTAxXDRcMTM1XDFcMTAxXDRcMTM1IisKLSAgICAiXDFcMTAxXDRcMTM1XDJcMTAxXDFcMTM1XDFcMTM3XDFcMTAyXDFcMTMzXDFcMTQwIisKLSAgICAiXDFcMTM3XDFcMTExXDRcMTM3XDFcMTQxXDFcMTM3XDFcMTQyXDJcMTM3XDFcMTExIisKLSAgICAiXDZcMTM3XDFcMTExXDYwXDEzN1wxXDEwMVwxXDEwMlwzXDEwMVwxXDExMVwxMVwxMDEiKwotICAgICJcMVwxMTFcNlwxMDFcMVwxMTFcNjBcMTAxXDFcMTQzXDFcMTQ0XDIwXDE0M1wxXDE0NSIrCi0gICAgIlw2NFwxNDNcMVwxMDFcMVwxNDZcM1wxMDFcMVwxMTFcMlwxMDFcMlwxNDdcNVwxMDEiKwotICAgICJcMVwxMTFcMlwxMDFcMVwxNTBcM1wxMDFcMVwxMTFcNlwxNDdcMVwxMDFcMTNcMTQ3IisKLSAgICAiXDFcMTAxXDEzXDE0N1wxXDEwMVw0XDE0N1wxXDEwMVw0XDE0N1wxXDEwMVw0XDE0NyIrCi0gICAgIlwyXDEwMVwxXDE0N1wxXDEwMVwxXDE0NlwzXDEwMVwxXDE1MVwxMVwxMDFcMVwxNTEiKwotICAgICJcMlwxMDFcMVwxNTBcM1wxMDFcMVwxNTFcNjFcMTAxXDFcMTQ2XDNcMTAxXDFcMTExIisKLSAgICAiXDJcMTAxXDJcMTUyXDVcMTAxXDFcMTExXDJcMTAxXDFcMTUwXDNcMTAxXDFcMTExIisKLSAgICAiXDZcMTUyXDFcMTAxXDEzXDE1MlwxXDEwMVwxM1wxNTJcMVwxMDFcNFwxNTJcMVwxMDEiKwotICAgICJcNFwxNTJcMVwxMDFcNFwxNTJcMlwxMDFcMVwxNTJcMVwxMDFcMVwxNDZcM1wxMDEiKwotICAgICJcMVwxMTFcMlwxMDFcMlwxNTJcNVwxMDFcMVwxMTFcMlwxMDFcMVwxNTBcM1wxMDEiKwotICAgICJcMVwxMTFcNlwxNTJcMVwxMDFcMTNcMTUyXDFcMTUzXDEzXDE1MlwxXDEwMVw0XDE1MiIrCi0gICAgIlwxXDEwMVw0XDE1MlwxXDEwMVw0XDE1MlwyXDEwMVwxXDE1MlwxXDE1NFwxXDE0NiIrCi0gICAgIlwxXDEwMVwxXDE1NVwxXDE1NFwxXDExMVw0XDE1NFwxXDE1NlwxXDE1NFwxXDE1NyIrCi0gICAgIlwyXDE1NFwxXDExMVwyXDE1NFwxXDE2MFwzXDE1NFwxXDExMVw2MFwxNTRcMVwxNjEiKwotICAgICJcMVwxNjJcMVwxNjNcMVwxNjRcNFwxNjFcMlwxNjVcMTVcMTYxXDZcMTY2XDFcMTYxIisKLSAgICAiXDEzXDE2NlwxXDE2MVwxM1wxNjZcMVwxNjFcNFwxNjZcMVwxNjFcNFwxNjZcMVwxNjEiKwotICAgICJcMVwxNjdcM1wxNjZcMlwxNjFcMVwxNjZcMVwxMDFcMVwxNzBcMVwxNjNcMVwxNjQiKwotICAgICJcMVwxMDFcMVwxMTFcMlwxMDFcMlwxNzFcNVwxMDFcMVwxMTFcNlwxMDFcMVwxMTEiKwotICAgICJcNlwxNzFcMVwxMDFcMTNcMTcxXDFcMTAxXDEzXDE3MVwxXDEwMVw0XDE3MVwxXDEwMSIrCi0gICAgIlw0XDE3MVwxXDEwMVw0XDE3MVwyXDEwMVwxXDE3MVwxXDEwMVwxXDE3MFwxXDE2MyIrCi0gICAgIlwxXDE2NFwxXDEwMVwxXDExMVwyXDEwMVwyXDE3MVw1XDEwMVwxXDExMVw2XDEwMSIrCi0gICAgIlwxXDExMVw2XDE3MVwxXDEwMVwxM1wxNzFcMVwxNzJcMTNcMTcxXDFcMTAxXDRcMTcxIisKLSAgICAiXDFcMTAxXDRcMTcxXDFcMTAxXDRcMTcxXDJcMTAxXDFcMTcxXDFcMTczXDFcMTc0IisKLSAgICAiXDFcMTYzXDFcMTc1XDFcMTczXDFcMTExXDRcMTczXDFcMTc2XDFcMTczXDFcMTc3IisKLSAgICAiXDFcMjAwXDFcMTczXDFcMTExXDZcMTczXDFcMTExXDM2XDE3M1wxXDIwMVwyMVwxNzMiKwotICAgICJcMVwxMDFcMVwyMDJcMVwyMDNcMlwxMDFcMVwxMTFcMTFcMTAxXDFcMTExXDZcMTAxIisKLSAgICAiXDFcMTExXDEwXDEwMVwxXDIwNFwxXDIwNVwyXDEwMVwxXDIwNlwxMVwxMDFcMVwyMDYiKwotICAgICJcMVwxMDFcMVwyMDVcMVwyMDRcMjdcMTAxXDFcMTAyXDFcMjAzXDJcMTAxXDFcMTExIisKLSAgICAiXDExXDEwMVwxXDExMVw2XDEwMVwxXDExMVw2XDEwMVwxXDIwN1w1MlwxMDFcMVwxMDIiKwotICAgICJcMVwyMDNcMlwxMDFcMVwxMTFcMlwxMDFcMlwyMTBcNVwxMDFcMVwxMTFcNlwxMDEiKwotICAgICJcMVwxMTFcNlwyMTBcMVwyMDdcMTNcMjEwXDFcMTAxXDEzXDIxMFwxXDEwMVw0XDIxMCIrCi0gICAgIlwxXDEwMVw0XDIxMFwxXDEwMVw0XDIxMFwyXDEwMVwxXDIxMFwxXDEwMVwxXDEwMiIrCi0gICAgIlwxXDIwM1wyXDEwMVwxXDExMVwxMVwxMDFcMVwxMTFcNlwxMDFcMVwxMTFcNlwxMDEiKwotICAgICJcMVwyMDdcN1wxMDFcMVwyMTFcNlwxMDFcMVwyMTJcMTFcMTAxXDFcMjExXDEyXDEwMSIrCi0gICAgIlwxXDIxMlw1XDEwMVwxXDIxM1wxXDEwMlwxXDIwM1wxXDIxNFwxXDIxM1wxXDExMSIrCi0gICAgIlw0XDIxM1wxXDIxNVwxXDIxM1wxXDIxNlwyXDIxM1wxXDExMVw2XDIxM1wxXDExMSIrCi0gICAgIlw2XDIxM1wxXDIxN1w1MVwyMTNcMVwyMjBcMVwxMDJcMVwyMDNcMVwyMjFcMVwyMjAiKwotICAgICJcMVwxMTFcNFwyMjBcMVwyMjJcMVwyMjBcMVwyMjNcMlwyMjBcMVwxMTFcNlwyMjAiKwotICAgICJcMVwxMTFcNlwyMjBcMVwyMjRcNTFcMjIwXDFcMjI1XDFcMTAyXDFcMjAzXDFcMjI2IisKLSAgICAiXDFcMjI1XDFcMTExXDRcMjI1XDFcMjI3XDFcMjI1XDFcMjMwXDJcMjI1XDFcMTExIisKLSAgICAiXDZcMjI1XDFcMTExXDYwXDIyNVwxXDIzMVwxXDIzMlwxXDIzM1wxMDRcMjMxXDFcMjM0IisKLSAgICAiXDFcMTAyXDFcMjAzXDFcMjM1XDFcMjM0XDFcMTExXDRcMjM0XDFcMjM2XDFcMjM0IisKLSAgICAiXDFcMjM3XDJcMjM0XDFcMTExXDZcMjM0XDFcMTExXDYwXDIzNFwxXDI0MFwxXDI0MSIrCi0gICAgIlwxXDI0MlwxMDRcMjQwXDFcMjQzXDFcMjQ0XDEwNVwyNDNcMVwxMDFcMVwxMDJcMjRcMTAxIisKLSAgICAiXDFcMTA0XDYwXDEwMVwxXDI0NVwxXDI0NlwxMDVcMjQ1XDFcMTAxXDFcMTAyXDVcMTAxIisKLSAgICAiXDFcMjQ3XDE2XDEwMVwxXDEwNFw2MFwxMDFcMVwyNTBcMVwyNTFcM1wyNTBcMVwyNTIiKwotICAgICJcNlwyNTBcMVwyNTNcMVwyNTRcMVwyNTBcMVwyNTJcNlwyNTBcMVwyNTJcMzZcMjUwIisKLSAgICAiXDFcMjU1XDIxXDI1MFwxXDI1NlwxXDI1MVwzXDI1NlwxXDI1N1w0XDI1NlwxXDI2MCIrCi0gICAgIlwyXDI1NlwxXDI2MVwxXDI1NlwxXDI1N1w2XDI1NlwxXDI1N1wzNlwyNTZcMVwyNjIiKwotICAgICJcMjFcMjU2XDFcMjYzXDFcMjY0XDEwXDI2M1wxXDI2NVwxXDI2M1wxXDI2NlwxXDI2NyIrCi0gICAgIlw2N1wyNjNcMVwyNzBcMVwyNjNcMVwyNzFcMVwyNzJcMTJcMjcxXDFcMTAxXDExXDI3MSIrCi0gICAgIlwxXDI3M1w2MFwyNzFcMVwyNzRcMVwyNzVcMTBcMjc0XDFcMTAxXDEzXDI3NFwxXDI3NiIrCi0gICAgIlw2MFwyNzRcMVwxMDFcMVwxMDJcMTJcMTAxXDFcMjc3XDExXDEwMVwxXDEwNFw2MVwxMDEiKwotICAgICJcMVwxMDJcMTBcMTAxXDFcMzAwXDEzXDEwMVwxXDEwNFw2MFwxMDFcMVwzMDFcMVwzMDIiKwotICAgICJcMTBcMzAxXDFcMjYwXDcxXDMwMVwxXDMwM1wxXDMwNFwxXDMwMVwxXDMwNVwxXDMwNiIrCi0gICAgIlwxMlwzMDVcMVwyNTNcNjdcMzA1XDFcMzA3XDFcMzA0XDFcMzA1XDFcMzEwXDFcMzExIisKLSAgICAiXDEwXDMxMFwxXDMxMlwxXDMxMFwxXDMxM1w1MFwzMTBcMVwzMTRcMTdcMzEwXDFcMzE1IisKLSAgICAiXDFcMzEwXDFcMzE2XDFcMzE3XDEyXDMxNlwxXDEwMVwxMVwzMTZcMVwzMjBcNjBcMzE2IisKLSAgICAiXDFcMzIxXDFcMzIyXDEwXDMyMVwxXDEwMVwxM1wzMjFcMVwzMjNcNjBcMzIxXDFcMTAxIisKLSAgICAiXDFcMTAyXDEyXDEwMVwxXDMyNFwxMVwxMDFcMVwxMDRcNjFcMTAxXDFcMTAyXDEwXDEwMSIrCi0gICAgIlwxXDMyNVwxM1wxMDFcMVwxMDRcNjBcMTAxXDFcMzI2XDFcMzI3XDEwXDMyNlwxXDI2MCIrCi0gICAgIlw3MVwzMjZcMVwzMzBcMVwzMzFcMVwzMjZcMVwzMzJcMVwzMzNcMTJcMzMyXDFcMjUzIisKLSAgICAiXDY3XDMzMlwxXDMzNFwxXDMzMVwxXDMzMlwxXDcxXDFcMFwxMVw3MVwxXDAiKwotICAgICJcMVw3MVwxXDBcNFw3MVwxXDBcNDJcNzFcMVwwXDIxXDcxXDNcMCIrCi0gICAgIlwxXDMzNVwxXDMzNlwxNVwwXDFcMzM3XDJcMFwxXDM0MFw2NlwwXDFcMzQxIisKLSAgICAiXDJcMFwyXDM0Mlw1XDBcMVwzNDFcNlwwXDFcMzQxXDZcMzQyXDFcMCIrCi0gICAgIlwxM1wzNDJcMVwwXDEzXDM0MlwxXDM0M1w0XDM0MlwxXDBcNFwzNDJcMVwwIisKLSAgICAiXDRcMzQyXDJcMFwxXDM0MlwxXDM0NFwxXDBcMTFcMzQ0XDFcMFwxXDM0NCIrCi0gICAgIlwxXDM0NVwxXDM0NlwzXDM0NFwxXDBcNjRcMzQ0XDVcMFwxXDM0MVwyXDAiKwotICAgICJcMlwzNDdcNVwwXDFcMzQxXDZcMFwxXDM0MVw2XDM0N1wxXDBcMTNcMzQ3IisKLSAgICAiXDFcMFwxM1wzNDdcMVwwXDRcMzQ3XDFcMFw0XDM0N1wxXDBcNFwzNDciKwotICAgICJcMlwwXDFcMzQ3XDFcMzQ0XDFcMFwxMVwzNDRcMVwwXDJcMzQ0XDFcMzUwIisKLSAgICAiXDNcMzQ0XDFcMFw0MlwzNDRcMVwzNTFcMjFcMzQ0XDEzMVwwXDFcMzM3XDJcMCIrCi0gICAgIlwxXDM1MlwxMDRcMFwxXDM1M1w3MlwwXDFcMzU0XDEwMVwwXDFcMzU1XDExMVwwIisKLSAgICAiXDFcMTExXDExXDBcMVwxMTFcNlwwXDFcMTExXDY2XDBcNFwxMTJcNlwwIisKLSAgICAiXDFcMTEyXDZcMFw2XDExMlwxXDBcMTNcMTEyXDFcMFwxM1wxMTJcMVwwIisKLSAgICAiXDRcMTEyXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDZcMFw0XDExMlw2XDAiKwotICAgICJcMVwxMTJcNlwwXDJcMTEyXDJcMzU2XDJcMTEyXDFcMFwxM1wxMTJcMVwwIisKLSAgICAiXDEzXDExMlwxXDBcNFwxMTJcMVwwXDExXDExMlwyXDBcMVwxMTJcNlwwIisKLSAgICAiXDRcMTEyXDZcMFwxXDExMlw2XDBcMlwxMTJcMVwzNTZcMVwzNTdcMlwxMTIiKwotICAgICJcMVwwXDEzXDExMlwxXDBcMTNcMTEyXDFcMFw0XDExMlwxXDBcMTFcMTEyIisKLSAgICAiXDJcMFwxXDExMlw2XDBcNFwxMTJcNlwwXDFcMTEyXDZcMFwyXDExMiIrCi0gICAgIlwyXDM2MFwyXDExMlwxXDBcMTNcMTEyXDFcMFwxM1wxMTJcMVwwXDRcMTEyIisKLSAgICAiXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDVcMFwxXDExNlwxMVwwXDFcMTE2IisKLSAgICAiXDZcMFwxXDExNlw2MlwwXDFcMzYxXDEwNlwwXDFcMzYyXDExMlwwXDRcMTIzIisKLSAgICAiXDZcMFwxXDEyM1w2XDBcNlwxMjNcMVwwXDEzXDEyM1wxXDBcMTNcMTIzIisKLSAgICAiXDFcMFw0XDEyM1wxXDBcMTFcMTIzXDJcMFwxXDEyM1wxXDEyNVwyXDAiKwotICAgICJcMVwzNjNcMVwxMjVcMVwwXDRcMTI1XDFcMFwxXDEyNVwxXDBcMlwxMjUiKwotICAgICJcMVwwXDZcMTI1XDFcMFw2MVwxMjVcMVwwXDFcMzYyXDFcMzYzXDFcMTI1IisKLSAgICAiXDFcMFw0XDEyNVwxXDBcMVwxMjVcMVwwXDJcMTI1XDFcMFw2XDEyNSIrCi0gICAgIlwxXDBcNjBcMTI1XDFcMzY0XDFcMFwxMFwzNjRcMVwzNjVcMlwzNjRcMVwzNjYiKwotICAgICJcNDdcMzY0XDFcMzY2XDIxXDM2NFwxXDM2N1wxXDBcMTJcMzY3XDFcMzY1XDFcMzcwIisKLSAgICAiXDQ3XDM2N1wxXDM3MFwyMVwzNjdcMlwwXDFcMTMzXDFcMzcxXDExMVwwXDRcMTM1IisKLSAgICAiXDZcMFwxXDEzNVw2XDBcNlwxMzVcMVwwXDEzXDEzNVwxXDBcMTNcMTM1IisKLSAgICAiXDFcMFw0XDEzNVwxXDBcMTFcMTM1XDJcMFwxXDEzNVwxXDEzN1wyXDAiKwotICAgICJcMVwzNzJcMVwxMzdcMVwwXDRcMTM3XDFcMFwxXDEzN1wxXDBcMlwxMzciKwotICAgICJcMVwwXDZcMTM3XDFcMFw2MVwxMzdcMVwwXDFcMTMzXDFcMzczXDFcMTM3IisKLSAgICAiXDFcMFw0XDEzN1wxXDBcMVwxMzdcMVwwXDJcMTM3XDFcMFw2XDEzNyIrCi0gICAgIlwxXDBcNjBcMTM3XDFcMTQxXDFcMFwxXDM3NFwxXDM3NVwxXDE0MVwxXDM3NCIrCi0gICAgIlw0XDE0MVwxXDM3NlwxXDE0MVwxXDM3NFwxXDM3N1wxXDE0MVwxXDM3NFw2XDE0MSIrCi0gICAgIlwxXDM3NFwzNlwxNDFcMVwzNzdcMjFcMTQxXDFcMTQyXDFcMFwxXHUwMTAwXDFcdTAxMDEiKwotICAgICJcMVwxNDJcMVx1MDEwMFw0XDE0MlwxXHUwMTAwXDFcMTQyXDFcMzc2XDFcdTAxMDJcMVwxNDIiKwotICAgICJcMVx1MDEwMFw2XDE0MlwxXHUwMTAwXDM2XDE0MlwxXHUwMTAyXDIxXDE0MlwyXDBcMVx1MDEwMyIrCi0gICAgIlwxMjZcMFwxXDMzN1wyXDBcMVx1MDEwNFw2N1wwXDRcMTQ3XDZcMFwxXDE0NyIrCi0gICAgIlw2XDBcNlwxNDdcMVwwXDEzXDE0N1wxXDBcMTNcMTQ3XDFcMFw0XDE0NyIrCi0gICAgIlwxXDBcMTFcMTQ3XDJcMFwxXDE0N1wyXDBcMVx1MDEwNVwxMTFcMFwxXDE1MSIrCi0gICAgIlwxMVwwXDFcMTUxXDZcMFwxXDE1MVw2NlwwXDRcMTUyXDZcMFwxXDE1MiIrCi0gICAgIlw2XDBcNlwxNTJcMVwwXDEzXDE1MlwxXDBcMTNcMTUyXDFcMFw0XDE1MiIrCi0gICAgIlwxXDBcMTFcMTUyXDJcMFwxXDE1MlwxXDE1NFwyXDBcMVx1MDEwNlwxXDE1NCIrCi0gICAgIlwxXDBcNFwxNTRcMVwwXDFcMTU0XDFcMFwyXDE1NFwxXDBcNlwxNTQiKwotICAgICJcMVwwXDYwXDE1NFwxXHUwMTA3XDFcMFwxMFx1MDEwN1wxXHUwMTA4XDJcdTAxMDdcMVx1MDEwOSIrCi0gICAgIlw0N1x1MDEwN1wxXHUwMTA5XDIxXHUwMTA3XDFcdTAxMGFcMVwwXDEyXHUwMTBhXDFcdTAxMDhcMVx1MDEwYiIrCi0gICAgIlw0N1x1MDEwYVwxXHUwMTBiXDIxXHUwMTBhXDFcMTU0XDFcMFwxXHUwMTA1XDFcdTAxMDZcMVwxNTQiKwotICAgICJcMVwwXDRcMTU0XDFcMFwxXDE1NFwxXDBcMlwxNTRcMVwwXDZcMTU0IisKLSAgICAiXDFcMFw2MFwxNTRcMVwxNjFcM1wwXDIzXDE2MVw2XDBcMVwxNjFcMTNcMCIrCi0gICAgIlwxXDE2MVwxM1wwXDFcMTYxXDRcMFwxXDE2MVw0XDBcMVwxNjFcNFwwIisKLSAgICAiXDJcMTYxXDRcMFwxXDMzNVwxNlwwXDFcMzM3XDJcMFwxXDM0MFw2M1wwIisKLSAgICAiXDFcdTAxMGNcMTA0XDBcMVwxNjFcM1wwXDJcMTYxXDRcMTY1XDZcMTYxXDFcMTY1IisKLSAgICAiXDZcMTYxXDZcMTY2XDFcMTYxXDEzXDE2NlwxXDE2MVwxM1wxNjZcMVwxNjFcNFwxNjYiKwotICAgICJcMVwxNjFcNFwxNjZcMVwxNjVcNFwxNjZcMlwxNjFcMVwxNjZcNlwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDBcMTNcMTY2IisKLSAgICAiXDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcN1wxNjZcMVx1MDEwZFwzXDE2NiIrCi0gICAgIlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2NiIrCi0gICAgIlwzXDBcMVwzMzVcNFwwXDJcdTAxMGVcMTBcMFwxXDMzN1wyXDBcMVwzNDAiKwotICAgICJcMVwwXDZcdTAxMGVcMVwwXDEzXHUwMTBlXDFcMFwxM1x1MDEwZVwxXDBcNFx1MDEwZSIrCi0gICAgIlwxXDBcNFx1MDEwZVwxXDBcNFx1MDEwZVwyXDBcMVx1MDEwZVw2XDBcNFwxNzEiKwotICAgICJcNlwwXDFcMTcxXDZcMFw2XDE3MVwxXDBcMTNcMTcxXDFcMFwxM1wxNzEiKwotICAgICJcMVwwXDRcMTcxXDFcMFwxMVwxNzFcMlwwXDFcMTcxXDFcMTczXDJcMCIrCi0gICAgIlwxXHUwMTBmXDFcMTczXDFcMFw0XDE3M1wxXDBcMVwxNzNcMVwwXDJcMTczIisKLSAgICAiXDFcMFw2XDE3M1wxXDBcNjBcMTczXDNcMFwxXDMzNVw0XDBcMlx1MDExMCIrCi0gICAgIlwxMFwwXDFcMzM3XDJcMFwxXDM0MFwxXDBcNlx1MDExMFwxXDBcMTNcdTAxMTAiKwotICAgICJcMVwwXDEzXHUwMTEwXDFcMFw0XHUwMTEwXDFcMFw0XHUwMTEwXDFcMFw0XHUwMTEwIisKLSAgICAiXDJcMFwxXHUwMTEwXDFcMTczXDFcMFwxXHUwMTBjXDFcdTAxMGZcMVwxNzNcMVwwIisKLSAgICAiXDRcMTczXDFcMFwxXDE3M1wxXDBcMlwxNzNcMVwwXDZcMTczXDFcMCIrCi0gICAgIlw2MFwxNzNcMVx1MDExMVwxXDBcMTBcdTAxMTFcMVx1MDExMlwyXHUwMTExXDFcdTAxMTNcNDdcdTAxMTEiKwotICAgICJcMVx1MDExM1wyMVx1MDExMVwxXHUwMTE0XDFcMFwxMlx1MDExNFwxXHUwMTEyXDFcdTAxMTVcNDdcdTAxMTQiKwotICAgICJcMVx1MDExNVwyMVx1MDExNFwxXDE3M1wyXDBcMVx1MDEwZlwxXDE3M1wxXDBcNFwxNzMiKwotICAgICJcMVwwXDFcMTczXDFcMFwxXDE3M1wxXHUwMTE2XDFcMFw2XDE3M1wxXDAiKwotICAgICJcNjFcMTczXDJcMFwxXHUwMTBmXDFcMTczXDFcMFw0XDE3M1wxXDBcMVwxNzMiKwotICAgICJcMVwwXDFcMTczXDFcdTAxMTdcMVwwXDZcMTczXDFcMFw2MFwxNzNcM1wwIisKLSAgICAiXDFcMzM1XDE2XDBcMVwzMzdcMlwwXDFcdTAxMDRcMTMwXDBcMVx1MDExOFwyXDAiKwotICAgICJcMVx1MDExOFw3NVwwXDFcdTAxMTlcMTRcMFwxXHUwMTE5XDYzXDBcMlx1MDExYVw1MlwwIisKLSAgICAiXDIzXHUwMTFiXDFcdTAxMWNcNjNcdTAxMWJcNlwwXDRcMjEwXDZcMFwxXDIxMFw2XDAiKwotICAgICJcNlwyMTBcMVwwXDEzXDIxMFwxXDBcMTNcMjEwXDFcMFw0XDIxMFwxXDAiKwotICAgICJcMTFcMjEwXDJcMFwxXDIxMFw1M1wwXDFcdTAxMWRcNVwwXDFcdTAxMWRcMTE2XDAiKwotICAgICJcMVx1MDExZVwxMFwwXDFcdTAxMWVcNFwwXDFcMjEzXDJcMFwxXHUwMTFmXDFcMjEzIisKLSAgICAiXDFcMFw0XDIxM1wxXDBcMVwyMTNcMVwwXDJcMjEzXDFcMFw2XDIxMyIrCi0gICAgIlwxXDBcNjBcMjEzXDFcdTAxMjBcMVwwXDEwXHUwMTIwXDFcdTAxMjFcMlx1MDEyMFwxXHUwMTIyIisKLSAgICAiXDQ3XHUwMTIwXDFcdTAxMjJcMjFcdTAxMjBcMVx1MDEyM1wxXDBcMVx1MDEyM1wyXHUwMTI0XDFcdTAxMjMiKwotICAgICJcNFx1MDEyNFwyXHUwMTIzXDFcdTAxMjVcMVx1MDEyNlwxXHUwMTIzXDRcdTAxMjRcMVx1MDEyM1wxMVx1MDEyNCIrCi0gICAgIlwxXHUwMTIzXDI3XHUwMTI0XDFcdTAxMjZcMTBcdTAxMjRcMlx1MDEyM1w0XHUwMTI0XDJcdTAxMjNcMVx1MDEyNCIrCi0gICAgIlwxXDIxN1wyXHUwMTFiXDFcdTAxMjdcMVwyMTdcMVx1MDExYlw0XDIxN1wxXHUwMTFiXDFcMjE3IisKLSAgICAiXDFcdTAxMWJcMlwyMTdcMVx1MDExYlwzXDIxN1wxXHUwMTI4XDJcMjE3XDFcdTAxMWJcNjBcMjE3IisKLSAgICAiXDFcMjIwXDJcMFwxXHUwMTI5XDFcMjIwXDFcMFw0XDIyMFwxXDBcMVwyMjAiKwotICAgICJcMVwwXDJcMjIwXDFcMFw2XDIyMFwxXDBcNjBcMjIwXDEyXHUwMTJhXDFcdTAxMmIiKwotICAgICJcNzRcdTAxMmFcMTRcdTAxMmNcMVx1MDEyYlw3Mlx1MDEyY1wxXDIyNFwyXHUwMTFiXDFcdTAxMmRcMVwyMjQiKwotICAgICJcMVx1MDExYlw0XDIyNFwxXHUwMTFiXDFcMjI0XDFcdTAxMWJcMlwyMjRcMVx1MDExYlwzXDIyNCIrCi0gICAgIlwxXHUwMTJlXDJcMjI0XDFcdTAxMWJcNjBcMjI0XDFcMjI1XDJcMFwxXHUwMTJmXDFcMjI1IisKLSAgICAiXDFcMFw0XDIyNVwxXDBcMVwyMjVcMVwwXDJcMjI1XDFcMFw2XDIyNSIrCi0gICAgIlwxXDBcNjBcMjI1XDFcdTAxMzBcMVwwXDEwXHUwMTMwXDFcdTAxMzFcMlx1MDEzMFwxXHUwMTMyIisKLSAgICAiXDQ3XHUwMTMwXDFcdTAxMzJcMjFcdTAxMzBcMVx1MDEzM1wxXDBcMVx1MDEzM1wyXHUwMTM0XDFcdTAxMzMiKwotICAgICJcNFx1MDEzNFwyXHUwMTMzXDFcdTAxMzVcMVx1MDEzNlwxXHUwMTMzXDRcdTAxMzRcMVx1MDEzM1wxMVx1MDEzNCIrCi0gICAgIlwxXHUwMTMzXDI3XHUwMTM0XDFcdTAxMzZcMTBcdTAxMzRcMlx1MDEzM1w0XHUwMTM0XDJcdTAxMzNcMVx1MDEzNCIrCi0gICAgIlwyXDIzMVwxXDBcMTA2XDIzMVwxXDBcMTdcMjMxXDFcdTAxMzdcMlwyMzFcMVx1MDEzOCIrCi0gICAgIlw2MVwyMzFcMVwyMzRcMlwwXDFcdTAxMzlcMVwyMzRcMVwwXDRcMjM0XDFcMCIrCi0gICAgIlwxXDIzNFwxXDBcMlwyMzRcMVwwXDZcMjM0XDFcMFw2MFwyMzRcMVx1MDEzYSIrCi0gICAgIlwxXDBcMTBcdTAxM2FcMVx1MDEzYlwyXHUwMTNhXDFcdTAxM2NcNDdcdTAxM2FcMVx1MDEzY1wyMVx1MDEzYSIrCi0gICAgIlwxXHUwMTNkXDFcMFwxXHUwMTNkXDJcdTAxM2VcMVx1MDEzZFw0XHUwMTNlXDJcdTAxM2RcMVx1MDEzZiIrCi0gICAgIlwxXHUwMTQwXDFcdTAxM2RcNFx1MDEzZVwxXHUwMTNkXDExXHUwMTNlXDFcdTAxM2RcMjdcdTAxM2VcMVx1MDE0MCIrCi0gICAgIlwxMFx1MDEzZVwyXHUwMTNkXDRcdTAxM2VcMlx1MDEzZFwxXHUwMTNlXDJcMjQwXDFcMFwxMDZcMjQwIisKLSAgICAiXDFcMFwxN1wyNDBcMVx1MDE0MVwyXDI0MFwxXHUwMTQyXDYxXDI0MFw3XDBcMVx1MDE0MyIrCi0gICAgIlw3N1wwXDFcMjUwXDFcMFwxMlwyNTBcMVwwXDFcdTAxNDRcNDdcMjUwXDFcdTAxNDQiKwotICAgICJcMjFcMjUwXDNcMFwxXHUwMTQ1XDE2XDBcMVwzMzdcMlwwXDFcMzUyXDYxXDAiKwotICAgICJcMVwyNTBcMVwwXDNcMjUwXDFcMjUyXDZcMjUwXDFcMFwxXHUwMTQ0XDFcMjUwIisKLSAgICAiXDFcMjUyXDZcMjUwXDFcMjUyXDM2XDI1MFwxXHUwMTQ0XDM3XDI1MFwxXHUwMTQ2XDEwNlwyNTAiKwotICAgICJcMVx1MDE0N1w3MFwyNTBcMVwyNTZcMVwwXDEwXDI1NlwxXDBcMlwyNTZcMVx1MDE0OCIrCi0gICAgIlw0N1wyNTZcMVx1MDE0OFwyMlwyNTZcMVwwXDNcMjU2XDFcMjU3XDRcMjU2XDFcMCIrCi0gICAgIlwyXDI1NlwxXHUwMTQ4XDFcMjU2XDFcMjU3XDZcMjU2XDFcMjU3XDM2XDI1NlwxXHUwMTQ4IisKLSAgICAiXDM3XDI1NlwxXHUwMTQ5XDEwNlwyNTZcMVx1MDE0YVw3MFwyNTZcMTJcMjYzXDFcMFwxXDI2MyIrCi0gICAgIlwxXDBcMVx1MDE0Ylw2N1wyNjNcMVwwXDEzXDI2M1wxXDBcMVwyNjNcMVwwIisKLSAgICAiXDFcdTAxNGJcNFwyNjNcMVx1MDE0Y1w2MlwyNjNcMVwwXDEzXDI2M1wxXDBcMVwyNjMiKwotICAgICJcMVwwXDFcMjYzXDFcdTAxNGRcNjZcMjYzXDFcdTAxNGVcMVwyNjNcMTRcdTAxNGZcMVx1MDE1MCIrCi0gICAgIlwxMDZcdTAxNGZcMVx1MDE1MFw1XHUwMTRmXDFcdTAxNTFcMlx1MDE0ZlwxXHUwMTUyXDYxXHUwMTRmXDEyXHUwMTUzIisKLSAgICAiXDFcdTAxNTRcMTA2XHUwMTUzXDFcdTAxNTRcN1x1MDE1M1wxXHUwMTU1XDJcdTAxNTNcMVx1MDE1Nlw2MVx1MDE1MyIrCi0gICAgIlwxMlwzMDFcMVwwXDcxXDMwMVwxXHUwMTU3XDFcMFwxM1wzMDFcMVwwXDdcMzAxIisKLSAgICAiXDFcdTAxNThcNjFcMzAxXDFcdTAxNTdcMVwwXDEzXDMwMVwxXHUwMTU5XDc0XDMwMVwxNFwzMDUiKwotICAgICJcMVwwXDY3XDMwNVwxXHUwMTVhXDFcMFwxNVwzMDVcMVwwXDVcMzA1XDFcdTAxNWIiKwotICAgICJcNjFcMzA1XDFcdTAxNWFcMVwwXDE1XDMwNVwxXHUwMTVjXDcyXDMwNVwxMlwzMTBcMVwwIisKLSAgICAiXDFcMzEwXDFcMFw3MFwzMTBcMVwwXDEzXDMxMFwxXDBcMVwzMTBcMVwwIisKLSAgICAiXDVcMzEwXDFcdTAxNWRcNjJcMzEwXDFcMFwxM1wzMTBcMVwwXDFcMzEwXDFcMCIrCi0gICAgIlwxXDMxMFwxXHUwMTVlXDY2XDMxMFwxXDBcMVwzMTBcMTRcdTAxNWZcMVx1MDE2MFwxMDZcdTAxNWYiKwotICAgICJcMVx1MDE2MFw1XHUwMTVmXDFcdTAxNjFcMlx1MDE1ZlwxXHUwMTYyXDYxXHUwMTVmXDEyXHUwMTYzXDFcdTAxNjQiKwotICAgICJcMTA2XHUwMTYzXDFcdTAxNjRcN1x1MDE2M1wxXHUwMTY1XDJcdTAxNjNcMVx1MDE2Nlw2MVx1MDE2M1wxMlwzMjYiKwotICAgICJcMVwwXDcxXDMyNlwxXHUwMTY3XDFcMFwxM1wzMjZcMVwwXDdcMzI2XDFcdTAxNjgiKwotICAgICJcNjFcMzI2XDFcdTAxNjdcMVwwXDEzXDMyNlwxXHUwMTY5XDc0XDMyNlwxNFwzMzJcMVwwIisKLSAgICAiXDY3XDMzMlwxXHUwMTZhXDFcMFwxNVwzMzJcMVwwXDVcMzMyXDFcdTAxNmJcNjFcMzMyIisKLSAgICAiXDFcdTAxNmFcMVwwXDE1XDMzMlwxXHUwMTZjXDcyXDMzMlw3XDBcMVx1MDE2ZFwxMVwwIisKLSAgICAiXDFcdTAxNmVcM1wwXDFcdTAxNmZcMjNcMFwxXHUwMTcwXDQ0XDBcMVx1MDE3MVwyNVwwIisKLSAgICAiXDFcdTAxNzJcNTZcMFwxXDM0MVwyXDBcMlx1MDE3M1w1XDBcMVwzNDFcNlwwIisKLSAgICAiXDFcMzQxXDZcdTAxNzNcMVwwXDEzXHUwMTczXDFcMFwxM1x1MDE3M1wxXDBcNFx1MDE3MyIrCi0gICAgIlwxXDBcNFx1MDE3M1wxXDBcNFx1MDE3M1wyXDBcMVx1MDE3M1wxXHUwMTc0XDFcMCIrCi0gICAgIlwzXHUwMTc0XDFcdTAxNzVcNFwzNDJcMVx1MDE3NFwxXDBcM1x1MDE3NFwxXHUwMTc1XDFcMzQyIisKLSAgICAiXDFcdTAxNzRcMVwwXDNcdTAxNzRcMVx1MDE3NVw2XDM0MlwxXHUwMTc0XDEzXDM0MlwxXHUwMTc0IisKLSAgICAiXDEzXDM0MlwxXHUwMTc0XDRcMzQyXDFcdTAxNzZcMTFcMzQyXDJcdTAxNzRcMVwzNDJcMjBcMCIrCi0gICAgIlwxXHUwMTc3XDdcMFwxXHUwMTc4XDczXDBcMVwzNDVcNzFcMFwxMDVcMzQ2XDFcdTAxNzkiKwotICAgICJcMVwzNDZcMVx1MDE3NFwxXDBcM1x1MDE3NFwxXHUwMTc1XDRcMzQ3XDFcdTAxNzRcMVwwIisKLSAgICAiXDNcdTAxNzRcMVx1MDE3NVwxXDM0N1wxXHUwMTc0XDFcMFwzXHUwMTc0XDFcdTAxNzVcNlwzNDciKwotICAgICJcMVx1MDE3NFwxM1wzNDdcMVx1MDE3NFwxM1wzNDdcMVx1MDE3NFw0XDM0N1wxXHUwMTdhXDExXDM0NyIrCi0gICAgIlwyXHUwMTc0XDFcMzQ3XDEwNVwzNTBcMVx1MDE3YlwxXDM1MFw2NVwwXDFcMzUxXDU2XDAiKwotICAgICJcMVx1MDE3Mlw1M1wwXDFcdTAxN2NcMTA2XDBcMVx1MDE3ZFwxMTJcMFw0XDExMlw2XDAiKwotICAgICJcMVwxMTJcNlwwXDRcMTEyXDJcdTAxN2VcMVwwXDEzXDExMlwxXDBcMTNcMTEyIisKLSAgICAiXDFcMFw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXDExMlw2XDBcNFwxMTIiKwotICAgICJcNlwwXDFcMTEyXDZcMFw0XDExMlwxXHUwMTdlXDFcdTAxN2ZcMVwwXDEzXDExMiIrCi0gICAgIlwxXDBcMTNcMTEyXDFcMFw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXDExMiIrCi0gICAgIlw2XDBcNFwxMTJcNlwwXDFcMTEyXDZcMFw2XDExMlwxXDBcMTNcMTEyIisKLSAgICAiXDFcMFwyXDExMlwxXHUwMTgwXDEwXDExMlwxXDBcNFwxMTJcMVwwXDZcMTEyIisKLSAgICAiXDFcdTAxODBcMlwxMTJcMlwwXDFcMTEyXDEyXDM2NFwxXDM2NVwzXDM2NFwxXDAiKwotICAgICJcNzBcMzY0XDE0XDM2N1wxXDM2NVwxXDM2N1wxXDBcNzBcMzY3XDFcMzc0XDFcMCIrCi0gICAgIlwxMFwzNzRcMVwzNzZcMlwzNzRcMVx1MDE4MVw0N1wzNzRcMVx1MDE4MVwyMVwzNzRcMVwxNDEiKwotICAgICJcMlwzNzRcMVwzNzVcMVwxNDFcMVwzNzRcNFwxNDFcMVwzNzZcMVwxNDFcMVwzNzQiKwotICAgICJcMVwxNDFcMVwxMzdcMVwzNzRcNlwxNDFcMVwzNzRcNjBcMTQxXDFcdTAxMDBcMVwwIisKLSAgICAiXDEyXHUwMTAwXDFcMzc2XDFcdTAxODJcNDdcdTAxMDBcMVx1MDE4MlwyMVx1MDEwMFwxXDE0MlwyXHUwMTAwIisKLSAgICAiXDFcdTAxMDFcMVwxNDJcMVx1MDEwMFw0XDE0MlwxXHUwMTAwXDFcMTQyXDFcMzc2XDFcMTQyIisKLSAgICAiXDFcMTM3XDFcdTAxMDBcNlwxNDJcMVx1MDEwMFw2MFwxNDJcMTJcdTAxMDdcMVx1MDEwOFwzXHUwMTA3IisKLSAgICAiXDFcMFw3MFx1MDEwN1wxNFx1MDEwYVwxXHUwMTA4XDFcdTAxMGFcMVwwXDcwXHUwMTBhXDZcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDZcMTY2XDFcdTAxODNcMlwxNjZcMlwwIisKLSAgICAiXDFcMTY2XDZcMFw0XHUwMTBlXDZcMFwxXHUwMTBlXDZcMFw2XHUwMTBlXDFcMCIrCi0gICAgIlwxM1x1MDEwZVwxXDBcMTNcdTAxMGVcMVwwXDRcdTAxMGVcMVwwXDExXHUwMTBlXDJcMCIrCi0gICAgIlwxXHUwMTBlXDZcMFw0XHUwMTEwXDZcMFwxXHUwMTEwXDZcMFw2XHUwMTEwXDFcMCIrCi0gICAgIlwxM1x1MDExMFwxXDBcMTNcdTAxMTBcMVwwXDRcdTAxMTBcMVwwXDExXHUwMTEwXDJcMCIrCi0gICAgIlwxXHUwMTEwXDEyXHUwMTExXDFcdTAxMTJcM1x1MDExMVwxXDBcNzBcdTAxMTFcMTRcdTAxMTRcMVx1MDExMiIrCi0gICAgIlwxXHUwMTE0XDFcMFw3MFx1MDExNFwxXHUwMTg0XDJcdTAxODVcMVx1MDE4NlwxXHUwMTg0XDFcdTAxODUiKwotICAgICJcNFx1MDE4NFwxXHUwMTg1XDFcdTAxODRcMVx1MDE4NVwyXHUwMTg0XDFcdTAxODVcNlx1MDE4NFwxXHUwMTg1IisKLSAgICAiXDU2XHUwMTg0XDFcMTczXDFcdTAxODRcMVx1MDE4N1wyXHUwMTg4XDFcdTAxODlcMVx1MDE4N1wxXHUwMTg4IisKLSAgICAiXDRcdTAxODdcMVx1MDE4OFwxXHUwMTg3XDFcdTAxODhcMlx1MDE4N1wxXHUwMTg4XDZcdTAxODdcMVx1MDE4OCIrCi0gICAgIlw1Nlx1MDE4N1wxXDE3M1wxXHUwMTg3XDM2XDBcMVx1MDE4YVwzNVwwXDFcdTAxOGFcNTNcMCIrCi0gICAgIlwxXHUwMThiXDE0XDBcMVx1MDE4Ylw3M1wwXDFcdTAxOGNcMTFcMFwxXHUwMThjXDc2XDAiKwotICAgICJcMVx1MDE4ZFwyMFwwXDFcdTAxOGRcMTEzXDBcMVx1MDE4ZVw3XDBcMVx1MDE4ZVwzXDAiKwotICAgICJcMTJcdTAxMjBcMVx1MDEyMVwzXHUwMTIwXDFcMFw3MFx1MDEyMFwxXHUwMTIzXDFcMFwxMlx1MDEyMyIrCi0gICAgIlwxXHUwMTIxXDFcdTAxOGZcNDdcdTAxMjNcMVx1MDE4ZlwyMlx1MDEyM1wxXDBcMTJcdTAxMjNcMVx1MDE5MCIrCi0gICAgIlwxXHUwMThmXDQ3XHUwMTIzXDFcdTAxOGZcMjFcdTAxMjNcMTRcMFwxXHUwMTkxXDcyXDBcMTRcdTAxMjMiKwotICAgICJcMVx1MDE5MFwxXHUwMTIzXDFcMFw3MFx1MDEyM1wxMlx1MDEzMFwxXHUwMTMxXDNcdTAxMzBcMVwwIisKLSAgICAiXDcwXHUwMTMwXDFcdTAxMzNcMVwwXDEyXHUwMTMzXDFcdTAxMzFcMVx1MDE5Mlw0N1x1MDEzM1wxXHUwMTkyIisKLSAgICAiXDIyXHUwMTMzXDFcMFwxMlx1MDEzM1wxXHUwMTkzXDFcdTAxOTJcNDdcdTAxMzNcMVx1MDE5MlwyMVx1MDEzMyIrCi0gICAgIlwxNFwwXDFcdTAxOTRcNzJcMFwxNFx1MDEzM1wxXHUwMTkzXDFcdTAxMzNcMVwwXDcwXHUwMTMzIisKLSAgICAiXDJcMjMxXDFcMFw0XDIzMVwxXHUwMTk1XDExXDIzMVwxXHUwMTk2XDNcMjMxXDFcdTAxOTciKwotICAgICJcMjNcMjMxXDFcdTAxOThcMzdcMjMxXDFcMFwzMlwyMzFcMVx1MDE5OVw1MVwyMzFcMTJcdTAxM2EiKwotICAgICJcMVx1MDEzYlwzXHUwMTNhXDFcMFw3MFx1MDEzYVwxXHUwMTNkXDFcMFwxMlx1MDEzZFwxXHUwMTNiIisKLSAgICAiXDFcdTAxOWFcNDdcdTAxM2RcMVx1MDE5YVwyMlx1MDEzZFwxXDBcMTJcdTAxM2RcMVx1MDE5YlwxXHUwMTlhIisKLSAgICAiXDQ3XHUwMTNkXDFcdTAxOWFcMjFcdTAxM2RcMTRcMFwxXHUwMTljXDcyXDBcMTRcdTAxM2RcMVx1MDE5YiIrCi0gICAgIlwxXHUwMTNkXDFcMFw3MFx1MDEzZFwyXDI0MFwxXDBcNFwyNDBcMVx1MDE5ZFwxMVwyNDAiKwotICAgICJcMVx1MDE5ZVwzXDI0MFwxXHUwMTlmXDIzXDI0MFwxXHUwMWEwXDM3XDI0MFwxXDBcMzJcMjQwIisKLSAgICAiXDFcdTAxYTFcNTFcMjQwXDIyXDBcMVx1MDFhMlw2NFwwXDE2XDI1MFwxXDBcNzBcMjUwIisKLSAgICAiXDE2XDI1NlwxXDBcNzBcMjU2XDEyXDI2M1wxXDBcMVwyNjNcMVwwXDFcMjYzIisKLSAgICAiXDFcdTAxYTNcNjZcMjYzXDFcdTAxNGVcMTBcMjYzXDFcdTAxYTRcMlwyNjNcMVwwXDFcMjYzIisKLSAgICAiXDFcMFwxXHUwMTRiXDNcMjYzXDFcdTAxYTVcM1wyNjNcMVx1MDFhNlwyM1wyNjNcMVx1MDFhNyIrCi0gICAgIlwzM1wyNjNcMVwwXDFcMjYzXDEyXHUwMWEzXDFcMFwxXHUwMWEzXDFcMFw3MFx1MDFhMyIrCi0gICAgIlwxXDBcMVx1MDFhM1wxMlx1MDE0ZVwxXDBcMVx1MDE0ZVwxXDBcMVx1MDFhOFw2N1x1MDE0ZSIrCi0gICAgIlwxXDBcMVx1MDE0ZVw3XHUwMTRmXDFcdTAxYTlcNFx1MDE0ZlwxXHUwMTUwXDRcdTAxNGZcMVx1MDFhYSIrCi0gICAgIlwzXHUwMTRmXDFcdTAxYWJcMjNcdTAxNGZcMVx1MDFhY1w1MVx1MDE0ZlwxXHUwMTUwXDIwXHUwMTRmXDFcdTAxYWQiKwotICAgICJcNTFcdTAxNGZcN1x1MDE1M1wxXHUwMWFlXDJcdTAxNTNcMVx1MDE1NFw2XHUwMTUzXDFcdTAxYWZcM1x1MDE1MyIrCi0gICAgIlwxXHUwMWIwXDIzXHUwMTUzXDFcdTAxYjFcNDdcdTAxNTNcMVx1MDE1NFwyMlx1MDE1M1wxXHUwMWIyXDUxXHUwMTUzIisKLSAgICAiXDEyXDMwMVwxXDBcMTAzXDMwMVwxXHUwMWIzXDJcMzAxXDFcMFw2XDMwMVwxXHUwMWI0IisKLSAgICAiXDNcMzAxXDFcdTAxYjVcMjNcMzAxXDFcdTAxYjZcMzJcMzAxXDFcdTAxNTdcMVwwXDFcMzAxIisKLSAgICAiXDEwNFx1MDFiN1wxXHUwMWI4XDJcdTAxYjdcMTRcMzA1XDFcMFwxMDFcMzA1XDFcdTAxYjlcNFwzMDUiKwotICAgICJcMVwwXDRcMzA1XDFcdTAxYmFcM1wzMDVcMVx1MDFiYlwyM1wzMDVcMVx1MDFiY1wzMlwzMDUiKwotICAgICJcMVx1MDE1YVwxXDBcMVwzMDVcMTA0XHUwMWJkXDFcdTAxYmVcMlx1MDFiZFw3XDMxMFwxXHUwMWJmIisKLSAgICAiXDJcMzEwXDFcMFwxXDMxMFwxXDBcNFwzMTBcMVx1MDFjMFwzXDMxMFwxXHUwMWMxIisKLSAgICAiXDIzXDMxMFwxXHUwMWMyXDMzXDMxMFwxXDBcMVwzMTBcN1x1MDE1ZlwxXHUwMWMzXDRcdTAxNWYiKwotICAgICJcMVx1MDE2MFw0XHUwMTVmXDFcdTAxYzRcM1x1MDE1ZlwxXHUwMWM1XDIzXHUwMTVmXDFcdTAxYzZcNTFcdTAxNWYiKwotICAgICJcMVx1MDE2MFwyMFx1MDE1ZlwxXHUwMWM3XDUxXHUwMTVmXDdcdTAxNjNcMVx1MDFjOFwyXHUwMTYzXDFcdTAxNjQiKwotICAgICJcNlx1MDE2M1wxXHUwMWM5XDNcdTAxNjNcMVx1MDFjYVwyM1x1MDE2M1wxXHUwMWNiXDQ3XHUwMTYzXDFcdTAxNjQiKwotICAgICJcMjJcdTAxNjNcMVx1MDFjY1w1MVx1MDE2M1wxMlwzMjZcMVwwXDEwM1wzMjZcMVx1MDFjZFwyXDMyNiIrCi0gICAgIlwxXDBcNlwzMjZcMVx1MDFjZVwzXDMyNlwxXHUwMWNmXDIzXDMyNlwxXHUwMWQwXDMyXDMyNiIrCi0gICAgIlwxXHUwMTY3XDFcMFwxXDMyNlwxMDRcdTAxZDFcMVx1MDFkMlwyXHUwMWQxXDE0XDMzMlwxXDAiKwotICAgICJcMTAxXDMzMlwxXHUwMWQzXDRcMzMyXDFcMFw0XDMzMlwxXHUwMWQ0XDNcMzMyXDFcdTAxZDUiKwotICAgICJcMjNcMzMyXDFcdTAxZDZcMzJcMzMyXDFcdTAxNmFcMVwwXDFcMzMyXDEwNFx1MDFkN1wxXHUwMWQ4IisKLSAgICAiXDJcdTAxZDdcN1wwXDFcdTAxZDlcMTA2XDBcMVx1MDFkYVwxMzVcMFwxXHUwMWRiXDUwXDAiKwotICAgICJcMVx1MDE3M1wxXDBcMTFcdTAxNzNcMVwwXDZcdTAxNzNcMVwwXDY0XHUwMTczXDFcdTAxNzQiKwotICAgICJcMVwwXDExXHUwMTc0XDFcMFw2XHUwMTc0XDFcMFw0N1x1MDE3NFwxXDBcMTVcdTAxNzQiKwotICAgICJcMVwwXDNcdTAxNzRcMVx1MDE3NVw1XHUwMTc0XDFcMFwzXHUwMTc0XDFcdTAxNzVcMlx1MDE3NCIrCi0gICAgIlwxXDBcM1x1MDE3NFwxXHUwMTc1XDQzXHUwMTc0XDFcdTAxZGNcMTRcdTAxNzRcMjBcMFwxXHUwMTc3IisKLSAgICAiXDUxXDBcMVx1MDFkZFwzNFwwXDFcdTAxZGVcMTVcMFwzXHUwMWRlXDJcMFwxXHUwMWRlIisKLSAgICAiXDExXDBcMVx1MDFkZVwxXDBcMlx1MDFkZVw3XDBcMVx1MDFkZVwyXDBcMlx1MDFkZSIrCi0gICAgIlw2XDBcMVx1MDFkZVwxMVwwXDFcMTEyXDFcdTAxZGZcMlwxMTJcNlwwXDFcMTEyIisKLSAgICAiXDZcMFw2XDExMlwxXDBcMTNcMTEyXDFcMFwxM1wxMTJcMVwwXDRcMTEyIisKLSAgICAiXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDZcMFw0XDExMlw2XDBcMVwxMTIiKwotICAgICJcNlwwXDZcMTEyXDFcMFwxMVwxMTJcMVx1MDFlMFwxXDExMlwxXDBcMVx1MDFlMCIrCi0gICAgIlwxMlwxMTJcMVwwXDRcMTEyXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDEyXDM3NCIrCi0gICAgIlwxXDM3NlwzXDM3NFwxXDBcNzBcMzc0XDE0XHUwMTAwXDFcMzc2XDFcdTAxMDBcMVwwIisKLSAgICAiXDcwXHUwMTAwXDZcMFwzXDE2NlwxXHUwMWUxXDZcMFwxXDE2Nlw2XDBcNlwxNjYiKwotICAgICJcMVwwXDEzXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2IisKLSAgICAiXDJcMFwxXDE2NlwxXHUwMTg0XDJcdTAxODVcMVx1MDE4NlwxXHUwMTg0XDFcdTAxODVcNFx1MDE4NCIrCi0gICAgIlwxXHUwMTg1XDFcdTAxODRcMVx1MDE4NVwyXHUwMTg0XDFcdTAxODVcNlx1MDE4NFwxXHUwMTg1XDU2XHUwMTg0IisKLSAgICAiXDFcdTAxZTJcMVx1MDE4NFwxMDVcdTAxODVcMVx1MDFlM1wxXHUwMTg1XDFcdTAxODdcMlx1MDE4OFwxXHUwMTg5IisKLSAgICAiXDFcdTAxODdcMVx1MDE4OFw0XHUwMTg3XDFcdTAxODhcMVx1MDE4N1wxXHUwMTg4XDJcdTAxODdcMVx1MDE4OCIrCi0gICAgIlw2XHUwMTg3XDFcdTAxODhcNTZcdTAxODdcMVx1MDFlMlwxXHUwMTg3XDEwNVx1MDE4OFwxXHUwMWU0XDFcdTAxODgiKwotICAgICJcNDFcMFwxXHUwMWU1XDE0XDBcMVx1MDFlNVw2M1wwXDJcdTAxZTZcMTAzXDBcMlx1MDFlNyIrCi0gICAgIlwxMTVcMFwxXHUwMWU4XDE0XDBcMVx1MDFlOFw2M1wwXDJcdTAxZTlcNTJcMFwxNFx1MDEyMyIrCi0gICAgIlwxXHUwMTIxXDFcdTAxMjNcMVwwXDcwXHUwMTIzXDNcMFwyXHUwMWVhXDFcMFw0XHUwMWVhIisKLSAgICAiXDJcMFwxXHUwMTI1XDFcdTAxZWFcMVwwXDRcdTAxZWFcMVwwXDExXHUwMWVhXDFcMCIrCi0gICAgIlw0MFx1MDFlYVwyXDBcNFx1MDFlYVwyXDBcMVx1MDFlYVwxNFx1MDEzM1wxXHUwMTMxXDFcdTAxMzMiKwotICAgICJcMVwwXDcwXHUwMTMzXDNcMFwyXHUwMWViXDFcMFw0XHUwMWViXDJcMFwxXHUwMTM1IisKLSAgICAiXDFcdTAxZWJcMVwwXDRcdTAxZWJcMVwwXDExXHUwMWViXDFcMFw0MFx1MDFlYlwyXDAiKwotICAgICJcNFx1MDFlYlwyXDBcMVx1MDFlYlwyXDIzMVwxXDBcNFwyMzFcMVx1MDFlY1wxMDFcMjMxIisKLSAgICAiXDFcMFwzM1wyMzFcMVx1MDFlZFw1MFwyMzFcMTRcdTAxM2RcMVx1MDEzYlwxXHUwMTNkXDFcMCIrCi0gICAgIlw3MFx1MDEzZFwzXDBcMlx1MDFlZVwxXDBcNFx1MDFlZVwyXDBcMVx1MDEzZlwxXHUwMWVlIisKLSAgICAiXDFcMFw0XHUwMWVlXDFcMFwxMVx1MDFlZVwxXDBcNDBcdTAxZWVcMlwwXDRcdTAxZWUiKwotICAgICJcMlwwXDFcdTAxZWVcMlwyNDBcMVwwXDRcMjQwXDFcdTAxZWZcMTAxXDI0MFwxXDAiKwotICAgICJcMzNcMjQwXDFcdTAxZjBcNTBcMjQwXDJcMFwxXHUwMWYxXDEwNFwwXDdcMjYzXDFcdTAxZjIiKwotICAgICJcMlwyNjNcMVwwXDFcMjYzXDFcMFwxXHUwMTRiXDY3XDI2M1wxXDBcMVwyNjMiKwotICAgICJcMTJcdTAxNGVcMVwwXDFcdTAxNGVcMVwwXDFcdTAxNGVcMVwwXDcwXHUwMTRlXDdcdTAxNGYiKwotICAgICJcMVx1MDFmM1w0XHUwMTRmXDFcdTAxNTBcMTA2XHUwMTRmXDFcdTAxNTBcMjFcdTAxNGZcMVx1MDFmNFw1MFx1MDE0ZiIrCi0gICAgIlw3XHUwMTUzXDFcdTAxZjVcMlx1MDE1M1wxXHUwMTU0XDEwNlx1MDE1M1wxXHUwMTU0XDIzXHUwMTUzXDFcdTAxZjYiKwotICAgICJcNTBcdTAxNTNcN1wzMDFcMVx1MDFmN1wyXDMwMVwxXDBcNzFcMzAxXDFcdTAxNTdcMVwwIisKLSAgICAiXDFcMzAxXDEyXHUwMWY4XDFcdTAxZjlcNzJcdTAxZjhcMVwwXDFcdTAxZjhcN1wzMDVcMVx1MDFmYSIrCi0gICAgIlw0XDMwNVwxXDBcNjdcMzA1XDFcdTAxNWFcMVwwXDFcMzA1XDE0XHUwMWZiXDFcdTAxZjkiKwotICAgICJcNzBcdTAxZmJcMVwwXDFcdTAxZmJcN1wzMTBcMVx1MDFmY1wyXDMxMFwxXDBcMVwzMTAiKwotICAgICJcMVwwXDcwXDMxMFwxXDBcMVwzMTBcN1x1MDE1ZlwxXHUwMWZkXDRcdTAxNWZcMVx1MDE2MCIrCi0gICAgIlwxMDZcdTAxNWZcMVx1MDE2MFwyMVx1MDE1ZlwxXHUwMWZlXDUwXHUwMTVmXDdcdTAxNjNcMVx1MDFmZlwyXHUwMTYzIisKLSAgICAiXDFcdTAxNjRcMTA2XHUwMTYzXDFcdTAxNjRcMjNcdTAxNjNcMVx1MDIwMFw1MFx1MDE2M1w3XDMyNlwxXHUwMjAxIisKLSAgICAiXDJcMzI2XDFcMFw3MVwzMjZcMVx1MDE2N1wxXDBcMVwzMjZcMTJcdTAyMDJcMVx1MDIwMyIrCi0gICAgIlw3Mlx1MDIwMlwxXDBcMVx1MDIwMlw3XDMzMlwxXHUwMjA0XDRcMzMyXDFcMFw2N1wzMzIiKwotICAgICJcMVx1MDE2YVwxXDBcMVwzMzJcMTRcdTAyMDVcMVx1MDIwM1w3MFx1MDIwNVwxXDBcMVx1MDIwNSIrCi0gICAgIlwzN1wwXDFcdTAyMDZcMTQxXDBcMVx1MDFkY1wzNFwwXDFcdTAxZGVcMTVcMFwzXHUwMWRlIisKLSAgICAiXDJcMFwxXHUwMWRlXDExXDBcMVx1MDFkZVwxXDBcMlx1MDFkZVw3XDBcMVx1MDFkZSIrCi0gICAgIlwxXDBcMVx1MDFkZFwyXHUwMWRlXDZcMFwxXHUwMWRlXDExXDBcNFwxMTJcNlwwIisKLSAgICAiXDFcMTEyXDZcMFw2XDExMlwxXDBcN1wxMTJcMVx1MDIwN1wzXDExMlwxXDAiKwotICAgICJcMTNcMTEyXDFcMFw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXDExMlw2XDAiKwotICAgICJcNFwxMTJcNlwwXDFcMTEyXDZcMFw2XDExMlwxXDBcNlwxMTJcMVx1MDIwOCIrCi0gICAgIlw0XDExMlwxXDBcMTNcMTEyXDFcMFwxXDExMlwxXHUwMjA4XDJcMTEyXDFcMCIrCi0gICAgIlwxMVwxMTJcMlwwXDFcMTEyXDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDZcMTY2XDFcMFw2XDE2NlwxXHUwMjA5XDRcMTY2XDFcMFw2XDE2NlwxXHUwMjBhIisKLSAgICAiXDRcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw1M1wwIisKLSAgICAiXDFcdTAyMGJcNVwwXDFcdTAyMGJcNzNcMFwxXHUwMjBjXDE0XDBcMVx1MDIwY1w2NlwwIisKLSAgICAiXDFcdTAyMGRcMTFcMFwxXHUwMjBkXDc0XDBcMVx1MDIwZVwxMVwwXDFcdTAyMGVcNzdcMCIrCi0gICAgIlwxXHUwMjBmXDE0XDBcMVx1MDIwZlwyM1wwXDJcMjMxXDFcMFwzNFwyMzFcMVx1MDIxMCIrCi0gICAgIlw0N1wyMzFcMlwyNDBcMVwwXDM0XDI0MFwxXHUwMjExXDQ3XDI0MFwxNFx1MDE0ZlwxXHUwMTUwIisKLSAgICAiXDIyXHUwMTRmXDFcdTAyMTJcNDdcdTAxNGZcMTJcdTAxNTNcMVx1MDE1NFwyNFx1MDE1M1wxXHUwMjEzXDQ3XHUwMTUzIisKLSAgICAiXDEyXHUwMWY4XDFcdTAxYjdcNzFcdTAxZjhcMVx1MDIxNFwxXHUwMWI3XDFcdTAxZjhcMTRcdTAxZmJcMVx1MDFiZCIrCi0gICAgIlw2N1x1MDFmYlwxXHUwMjE1XDFcdTAxYmRcMVx1MDFmYlwxNFx1MDE1ZlwxXHUwMTYwXDIyXHUwMTVmXDFcdTAyMTYiKwotICAgICJcNDdcdTAxNWZcMTJcdTAxNjNcMVx1MDE2NFwyNFx1MDE2M1wxXHUwMjE3XDQ3XHUwMTYzXDEyXHUwMjAyXDFcdTAxZDEiKwotICAgICJcNzFcdTAyMDJcMVx1MDIxOFwxXHUwMWQxXDFcdTAyMDJcMTRcdTAyMDVcMVx1MDFkN1w2N1x1MDIwNVwxXHUwMjE5IisKLSAgICAiXDFcdTAxZDdcMVx1MDIwNVw0MFwwXDFcdTAyMWFcNTRcMFw0XDExMlw2XDBcMVwxMTIiKwotICAgICJcNlwwXDZcMTEyXDFcMFwxM1wxMTJcMVwwXDRcMTEyXDFcdTAyMWJcNlwxMTIiKwotICAgICJcMVwwXDRcMTEyXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDZcMFw0XDExMiIrCi0gICAgIlw2XDBcMVwxMTJcNlwwXDZcMTEyXDFcMFwzXDExMlwxXHUwMjFjXDdcMTEyIisKLSAgICAiXDFcMFw0XDExMlwxXHUwMjFjXDZcMTEyXDFcMFw0XDExMlwxXDBcMTFcMTEyIisKLSAgICAiXDJcMFwxXDExMlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NiIrCi0gICAgIlwxXDBcMTFcMTY2XDFcdTAyMWRcMVwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2NiIrCi0gICAgIlw2XDBcNlwxNjZcMVwwXDEwXDE2NlwxXHUwMjFlXDJcMTY2XDFcMFwxM1wxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDU0XDBcMVx1MDIxZiIrCi0gICAgIlwyNFwwXDFcdTAyMWZcNTJcMFwxXHUwMjIwXDIwXDBcMVx1MDIyMFw3MFwwXDFcdTAyMjEiKwotICAgICJcMTNcMFwxXHUwMjIxXDUzXDBcMlx1MDIyMlwxMTJcMFwxXHUwMjIzXDM1XDBcMVx1MDIyMyIrCi0gICAgIlwxMlwwXDJcMjMxXDFcMFwzNVwyMzFcMVx1MDIyNFw0NlwyMzFcMlwyNDBcMVwwIisKLSAgICAiXDM1XDI0MFwxXHUwMjI1XDQ2XDI0MFwxNFx1MDE0ZlwxXHUwMTUwXDIzXHUwMTRmXDFcdTAyMjZcNDZcdTAxNGYiKwotICAgICJcMTJcdTAxNTNcMVx1MDE1NFwyNVx1MDE1M1wxXHUwMjI3XDQ2XHUwMTUzXDEyXHUwMWY4XDFcdTAyMjhcNzFcdTAxZjgiKwotICAgICJcMVx1MDIxNFwxXHUwMWI3XDFcdTAxZjhcMTRcdTAxZmJcMVx1MDIyOVw2N1x1MDFmYlwxXHUwMjE1XDFcdTAxYmQiKwotICAgICJcMVx1MDFmYlwxNFx1MDE1ZlwxXHUwMTYwXDIzXHUwMTVmXDFcdTAyMmFcNDZcdTAxNWZcMTJcdTAxNjNcMVx1MDE2NCIrCi0gICAgIlwyNVx1MDE2M1wxXHUwMjJiXDQ2XHUwMTYzXDEyXHUwMjAyXDFcdTAyMmNcNzFcdTAyMDJcMVx1MDIxOFwxXHUwMWQxIisKLSAgICAiXDFcdTAyMDJcMTRcdTAyMDVcMVx1MDIyZFw2N1x1MDIwNVwxXHUwMjE5XDFcdTAxZDdcMVx1MDIwNVw0MVwwIisKLSAgICAiXDFcdTAyMmVcNTNcMFw0XDExMlw2XDBcMVwxMTJcNlwwXDZcMTEyXDFcMCIrCi0gICAgIlwxM1wxMTJcMVwwXDdcMTEyXDFcdTAyMmZcM1wxMTJcMVwwXDRcMTEyXDFcMCIrCi0gICAgIlwxMVwxMTJcMlwwXDFcMTEyXDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDZcMTY2XDFcMFwxMVwxNjZcMVx1MDIzMFwxXDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw2XDE2NlwxXDBcNlwxNjZcMVx1MDIzMVw0XDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw0M1wwIisKLSAgICAiXDFcdTAyMzJcMTFcMFwxXHUwMjMyXDcyXDBcMVx1MDIzM1wxNFwwXDFcdTAyMzNcNzFcMCIrCi0gICAgIlwxXHUwMjM0XDE0XDBcMVx1MDIzNFwzMFwwXDJcMjMxXDFcMFwzNlwyMzFcMVx1MDIzNSIrCi0gICAgIlw0NVwyMzFcMlwyNDBcMVwwXDM2XDI0MFwxXHUwMjM2XDQ1XDI0MFwxNFx1MDE0ZlwxXHUwMTUwIisKLSAgICAiXDI0XHUwMTRmXDFcdTAyMzdcNDVcdTAxNGZcMTJcdTAxNTNcMVx1MDE1NFwyNlx1MDE1M1wxXHUwMjM4XDQ1XHUwMTUzIisKLSAgICAiXDE0XHUwMTVmXDFcdTAxNjBcMjRcdTAxNWZcMVx1MDIzOVw0NVx1MDE1ZlwxMlx1MDE2M1wxXHUwMTY0XDI2XHUwMTYzIisKLSAgICAiXDFcdTAyM2FcNDVcdTAxNjNcNDBcMFwxXHUwMjNiXDU0XDBcNFwxMTJcNlwwXDFcMTEyIisKLSAgICAiXDZcMFw1XDExMlwxXHUwMjNjXDFcMFwxM1wxMTJcMVwwXDEzXDExMlwxXDAiKwotICAgICJcNFwxMTJcMVwwXDExXDExMlwyXDBcMVwxMTJcNlwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVx1MDIzZCIrCi0gICAgIlw2XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDVcMTY2XDFcdTAyM2UiKwotICAgICJcNVwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDAiKwotICAgICJcMVwxNjZcMlwyMzFcMVwwXDM1XDIzMVwxXHUwMjNmXDQ2XDIzMVwyXDI0MFwxXDAiKwotICAgICJcMzVcMjQwXDFcdTAyNDBcNDZcMjQwXDE0XHUwMTRmXDFcdTAxNTBcMjNcdTAxNGZcMVx1MDI0MVw0Nlx1MDE0ZiIrCi0gICAgIlwxMlx1MDE1M1wxXHUwMTU0XDI1XHUwMTUzXDFcdTAyNDJcNDZcdTAxNTNcMTRcdTAxNWZcMVx1MDE2MFwyM1x1MDE1ZiIrCi0gICAgIlwxXHUwMjQzXDQ2XHUwMTVmXDEyXHUwMTYzXDFcdTAxNjRcMjVcdTAxNjNcMVx1MDI0NFw0Nlx1MDE2M1wzNVwwIisKLSAgICAiXDFcdTAyNDVcNTdcMFw0XDExMlw2XDBcMVwxMTJcNlwwXDZcMTEyXDFcMCIrCi0gICAgIlw1XDExMlwxXHUwMjQ2XDVcMTEyXDFcMFwxM1wxMTJcMVwwXDRcMTEyXDFcMCIrCi0gICAgIlwxMVwxMTJcMlwwXDFcMTEyXDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDZcMTY2XDFcMFwxM1wxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDFcMTY2XDFcdTAyNDdcN1wxNjZcMlwwXDFcMTY2XDJcMjMxXDFcMFwzMlwyMzEiKwotICAgICJcMVx1MDI0OFw1MVwyMzFcMlwyNDBcMVwwXDMyXDI0MFwxXHUwMjQ5XDUxXDI0MFwxNFx1MDE0ZiIrCi0gICAgIlwxXHUwMTUwXDIwXHUwMTRmXDFcdTAyNGFcNTFcdTAxNGZcMTJcdTAxNTNcMVx1MDE1NFwyMlx1MDE1M1wxXHUwMjRiIisKLSAgICAiXDUxXHUwMTUzXDE0XHUwMTVmXDFcdTAxNjBcMjBcdTAxNWZcMVx1MDI0Y1w1MVx1MDE1ZlwxMlx1MDE2M1wxXHUwMTY0IisKLSAgICAiXDIyXHUwMTYzXDFcdTAyNGRcNTFcdTAxNjNcNlwwXDRcMTEyXDZcMFwxXDExMlw2XDAiKwotICAgICJcNlwxMTJcMVwwXDdcMTEyXDFcdTAyNGVcM1wxMTJcMVwwXDEzXDExMlwxXDAiKwotICAgICJcNFwxMTJcMVwwXDExXDExMlwyXDBcMVwxMTJcNlwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVx1MDI0ZiIrCi0gICAgIlw2XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwIisKLSAgICAiXDRcMTEyXDZcMFwxXDExMlw2XDBcNlwxMTJcMVwwXDEzXDExMlwxXDAiKwotICAgICJcMTNcMTEyXDFcMFw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXHUwMjUwXDZcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFwxMFwxNjZcMVx1MDI1MSIrCi0gICAgIlwyXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNFwxMTJcNlwwXDFcMTEyXDZcMFw2XDExMlwxXDAiKwotICAgICJcNVwxMTJcMVx1MDI1Mlw1XDExMlwxXDBcMTNcMTEyXDFcMFw0XDExMlwxXDAiKwotICAgICJcMTFcMTEyXDJcMFwxXDExMlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw2XDE2NlwxXDBcNFwxNjZcMVx1MDI1M1w2XDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxMTJcNlwwIisKLSAgICAiXDFcMTEyXDZcMFw2XDExMlwxXDBcNVwxMTJcMVx1MDI1NFw1XDExMlwxXDAiKwotICAgICJcMTNcMTEyXDFcMFw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXDExMlw2XDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcNVwxNjZcMVx1MDI1NSIrCi0gICAgIlw1XDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNFwxMTJcNlwwXDFcMTEyXDZcMFw2XDExMlwxXDAiKwotICAgICJcMTNcMTEyXDFcMFw0XDExMlwxXHUwMjU2XDZcMTEyXDFcMFw0XDExMlwxXDAiKwotICAgICJcMTFcMTEyXDJcMFwxXDExMlw2XHUwMjU3XDRcdTAyNThcNlx1MDI1N1wxXHUwMjU4XDVcdTAyNTciKwotICAgICJcMVwwXDZcdTAyNThcMVx1MDI1N1wxM1x1MDI1OFwxXHUwMjU3XDEzXHUwMjU4XDFcdTAyNTdcNFx1MDI1OCIrCi0gICAgIlwxXHUwMjU3XDExXHUwMjU4XDJcdTAyNTdcMVx1MDI1OFw0MlwwXDFcdTAyNTlcM1wwXDFcdTAyNWEiKwotICAgICJcN1wwXDFcdTAyNWJcMVx1MDI1Y1wyMVwwXDFcdTAyNWRcMTNcMFw0XDE2Nlw2XDAiKwotICAgICJcMVwxNjZcNlwwXDZcMTY2XDFcMFw0XDE2NlwxXHUwMjVlXDNcMTY2XDFcdTAyNWYiKwotICAgICJcMlwxNjZcMVwwXDRcMTY2XDFcdTAyNjBcMVx1MDI2MVw1XDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDZcMTY2XDFcdTAyNjJcMlwxNjZcMlwwXDFcMTY2XDU3XDBcMVx1MDI2MyIrCi0gICAgIlw3N1wwXDFcdTAyNjRcMTE1XDBcMVx1MDI2NVwxMDVcMFwxXHUwMjY2XDEwN1wwXDFcdTAyNjciKwotICAgICJcMzVcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjYiKwotICAgICJcMVwwXDVcMTY2XDFcdTAyNjhcNVwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjYiKwotICAgICJcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVx1MDI2OVwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw2XDE2NlwxXDBcMTNcMTY2XDFcMFw1XDE2NlwxXHUwMjZhXDVcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXHUwMjZiIisKLSAgICAiXDZcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlw1XDE2NlwxXHUwMjZjXDVcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMCIrCi0gICAgIlwxXDE2Nlw0NFwwXDFcdTAyNmRcMTM2XDBcMVx1MDI2ZVwxMDdcMFwxXHUwMjZmXDY3XDAiKwotICAgICJcMVx1MDI3MFwxMjVcMFwxXHUwMjcxXDE3XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw2XDE2NlwxXDBcNlwxNjZcMVx1MDI3Mlw0XDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2XDFcMFwxM1wxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxXDE2NlwxXHUwMjczXDdcMTY2XDJcMFwxXDE2Nlw2XDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlwxM1wxNjZcMVwwXDRcMTY2XDFcMFwyXDE2NlwxXHUwMjc0XDZcMTY2XDJcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFw0XDE2NlwxXHUwMjc1XDZcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw2XDE2NlwxXDBcMTNcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMCIrCi0gICAgIlwyXDE2NlwxXHUwMjc2XDZcMTY2XDJcMFwxXDE2Nlw0NlwwXDFcdTAyNzdcNzRcMCIrCi0gICAgIlwxXHUwMjc4XDEwNlwwXDFcdTAyNzlcMTE2XDBcMVx1MDI3YVwxMDVcMFwxXHUwMjdiXDUxXDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTBcMTY2XDFcdTAyN2MiKwotICAgICJcMlwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDAiKwotICAgICJcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVx1MDI3ZCIrCi0gICAgIlwxXDBcMTNcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjYiKwotICAgICJcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2IisKLSAgICAiXDFcdTAyN2VcMVwwXDEzXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw2XDE2NlwxXDBcNlwxNjZcMVx1MDI3Zlw0XDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw2XDE2NlwxXDBcNVwxNjZcMVx1MDI4MFw1XDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw1N1wwIisKLSAgICAiXDFcdTAyODFcMTMxXDBcMVx1MDI4Mlw1MlwwXDFcdTAyODNcMTA2XDBcMVx1MDI4NFw0NlwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDAiKwotICAgICJcNVwxNjZcMVx1MDI4NVw1XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDAiKwotICAgICJcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcN1wxNjZcMVx1MDI4NiIrCi0gICAgIlwxXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNlwxNjZcMVwwXDEwXDE2NlwxXHUwMjg3XDJcMTY2XDFcMFwxM1wxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDAiKwotICAgICJcMVwxNjZcNlwwXDZcMTY2XDFcMFwxMFwxNjZcMVx1MDI4OFwyXDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2NlwxMDNcMCIrCi0gICAgIlwxXHUwMjg5XDYzXDBcMVx1MDI3MVwxMzFcMFwxXHUwMjdiXDEwNlwwXDFcdTAyOGFcMTFcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDEwXDE2NlwxXHUwMjhiXDJcMFwxXDE2NiIrCi0gICAgIlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2IisKLSAgICAiXDFcMFw2XDE2NlwxXHUwMjc2XDRcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2IisKLSAgICAiXDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NiIrCi0gICAgIlwxXDBcMTNcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMFwxNjYiKwotICAgICJcMVx1MDI4MFwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNlwxNjZcMVwwXDEzXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcMTBcMTY2XDFcdTAyOGNcMlwwXDFcMTY2XDM0XDBcMVx1MDI3MVwxNTRcMFwxXHUwMjhkIisKLSAgICAiXDEyXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXHUwMjc2XDFcMCIrCi0gICAgIlwxM1wxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDAiKwotICAgICJcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcN1wxNjZcMVx1MDI4ZSIrCi0gICAgIlwxXDE2NlwyXDBcMVwxNjZcNTZcMFwxXHUwMjcxXDM2XDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXHUwMjc2IisKLSAgICAiXDZcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2NiI7Ci0KLSAgLyoqIAotICAgKiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXl0cmFucyBbXSA9IHl5X3VucGFjayh5eV9wYWNrZWQpOwotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotICAvLyBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAkJLy8kTk9OLU5MUy0xJAotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCQkvLyROT04tTkxTLTEkCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAkJLy8kTk9OLU5MUy0xJAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIJLy8kTk9OLU5MUy0xJAotICB9OwotCi0gIC8qKgotICAgKiBZWV9BVFRSSUJVVEVbYVN0YXRlXSBjb250YWlucyB0aGUgYXR0cmlidXRlcyBvZiBzdGF0ZSA8Y29kZT5hU3RhdGU8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFlZX0FUVFJJQlVURVtdID0gewotICAgICAxLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsIAotICAgICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAKLSAgICAgOSwgIDEsICAxLCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICA5LCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDksICA5LCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgOSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICA5LCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgOSwgIDksIAotICAgICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICA5LCAgMywgIDMsICAzLCAKLSAgICAgMywgIDMsICAzLCAgOSwgIDksICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgMSwgCi0gICAgIDAsICAxLCAgMCwgIDksICAxLCAgMiwgIDEsICAyLCAgMSwgIDAsICAwLCAgMCwgIDksICAxLCAgMSwgIDEsIAotICAgICA5LCAgOSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgIDEsICAwLCAKLSAgICAgMCwgIDEsICA5LCAgMCwgIDksICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICA5LCAgMSwgIDEsICAwLCAgMSwgCi0gICAgIDAsICA5LCAgMCwgIDAsICAwLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDAsIAotICAgICA5LCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMSwgIDAsICAwLCAKLSAgICAgOSwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDEsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAxLCAgMCwgCi0gICAgIDEsICAxLCAgMCwgIDAsICA5LCAgOSwgIDksICAwLCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAgMiwgMTMsIAotICAgICAzLCAgMiwgIDIsIDEzLCAgMywgIDIsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDIsIDEzLCAKLSAgICAgMywgIDIsICAyLCAxMywgIDMsICAyLCAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAgMCwgIDksICA5LCAgOSwgCi0gICAgIDAsICAwLCAgMSwgIDEsICAxLCAgOSwgIDAsICAwLCAxMywgIDksIDEzLCAgOSwgIDksICAxLCAgMSwgIDEsIAotICAgICAwLCAgMCwgIDEsICAzLCAgMiwgIDIsICAzLCAgMiwgIDIsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAKLSAgICAgMCwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMiwgIDMsICAzLCAgMywgIDIsICAyLCAgMywgIDMsIAotICAgICAzLCAgMiwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAyLCAgMywgIDMsICAzLCAgMiwgIDIsICAzLCAgMywgIDMsICAyLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgOSwgIDksICAwLCAgMSwgIDksICAwLCAgMSwgIDEsIAotICAgICAxLCAgNSwgMTMsIDEzLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAKLSAgICAgOSwgIDEsICAzLCAgMiwgIDMsICAyLCAgMSwgIDAsICA5LCAgMSwgIDAsICAxLCAgMywgIDIsICAzLCAgMiwgCi0gICAgIDEsICAwLCAgOSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsIAotICAgICAxLCAgMiwgIDIsICAwLCAgMCwgIDIsICAyLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAKLSAgICAgMCwgIDksICA5LCAgMSwgIDEsICAyLCAgMiwgIDEsICAxLCAgMiwgIDIsICAxLCAgMSwgIDAsICAxLCAgMSwgCi0gICAgIDEsICA5LCAgOSwgIDksICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAyLCAgMiwgIDIsICAyLCAgOSwgIDEsICAxLCAgMSwgIDEsICAzLCAgMywgIDMsICAzLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDAsIAotICAgICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICAvLyBwcml2YXRlIGludCB5eWNvbHVtbjsgCi0KLSAgLyoqIAotICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIC8vIHByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsKLQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLSAgLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfZW9mX2RvbmU7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCXByaXZhdGUgaW50IGZUb2tlbkNvdW50ID0gMDsKLSAKLQkvLyByZXF1aXJlZCBob2xkZXJzIGZvciB3aGl0ZS1zcGFjZSBjb21wYWN0aW5nCi0JcHJpdmF0ZSBib29sZWFuIGZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRTdGFydCA9IDE7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkTGVuZ3RoID0gMDsKLQlwcml2YXRlIENvbnRleHRSZWdpb25Db250YWluZXIgZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZfY29udGV4dCA9IG51bGw7Ci0KLQkvLyBzdGF0ZSBzdGFjayBmb3IgaGFuZGxpbmcgZW1iZWRkZWQgcmVnaW9ucwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQkvLyBhICJoaW50IiBhcyB0byB3aGF0IGFuIGVtYmVkZGVkIHJlZ2lvbiBzaG91bGQgYmUgZXZhbHVhdGVkCi0JcHJpdmF0ZSBTdHJpbmcgZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQkvLyBhICJoaW50IiBhcyB0byB3aGF0IHN0YXRlIHRvIGVudGVyIG9uY2UgYW4gZW1iZWRkZWQgcmVnaW9uIGhhcwotCS8vICAgYmVlbiBjb21wbGV0ZWQKLQlwcml2YXRlIGludCBmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JLy8gdGhlIGNvbnRhaW5lciB1c2VkIHRvIGNyZWF0ZSBlbWJlZGRlZCByZWdpb25zCi0JcHJpdmF0ZSBDb250ZXh0UmVnaW9uQ29udGFpbmVyIGZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0NPTlRFWFQgPSAiUFJPWFlfQ09OVEVYVCI7Ci0KLQlwcml2YXRlIFN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIGludCBzdGFydCA9IDA7Ci0JcHJpdmF0ZSBpbnQgdGV4dExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLQotCS8vIG9mZnNldCBmb3IgdHJhY2tpbmcgcG9zaXRpb24gc3BlY2lmaWMgYmxvY2sgdGFncwotCXByaXZhdGUgaW50IGZPZmZzZXQgPSAwOwotCQotCS8vIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhZyBiZWluZyBvcGVuZWQKLQlwcml2YXRlIFN0cmluZyBmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCi0JLy8gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGFnIGluc2lkZSBvZiBhbiBlbWJlZGRlZCByZWdpb24KLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbFRhZ05hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGludGVybmFsQ29udGV4dCA9IG51bGw7Ci0KLQkvLyB0aGUgbGlzdCBvZiB0YWcgbmFtZSBCbG9ja01hcmtlcnMKLQlwcml2YXRlIExpc3QgZkJsb2NrTWFya2VycyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JcHJpdmF0ZSBMaXN0IGZOZXN0YWJsZVByZWZpeGVzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkKLQkvLyB3aGVyZSB0aGUgbGFzdCBpbnRlcm5hbCBjb250YWluZXIgYmxvY2sgd2FzIGZvdW5kCi0JcHJpdmF0ZSBpbnQgZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSAtMTsKLQotCS8vIHJlcXVpcmVkIHRvIG5vdCBzZWVrIHRleHQgYmxvY2tzIG9uIGFuIGVuZCB0YWcKLQlwcml2YXRlIGJvb2xlYW4gZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IHRydWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGZGb3JiaWRKU1AgPSBmYWxzZTsKLQkKLQlwcml2YXRlIGludCBmRUxsZXZlbCA9IDA7Ci0KLQlwcml2YXRlIEpTUFBhcnNlclJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBuZXcgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSgpOwotCi0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JCWlmKGNvbnRhaW5zVGFnTmFtZShtYXJrZXIuZ2V0VGFnTmFtZSgpKSkKLQkJCXJldHVybjsKLQkJZkJsb2NrTWFya2Vycy5hZGQobWFya2VyKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGROZXN0YWJsZVByZWZpeChUYWdNYXJrZXIgbWFya2VyKSB7Ci0JCWZOZXN0YWJsZVByZWZpeGVzLmFkZChtYXJrZXIpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBMaXN0IGdldE5lc3RhYmxlUHJlZml4ZXMoKSB7Ci0JCXJldHVybiBmTmVzdGFibGVQcmVmaXhlczsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXN0YWJsZShTdHJpbmcgdGFnTmFtZSkgewotCQkvL0l0ZXJhdG9yIGJsb2NrcyA9IGZOZXN0YWJsZVByZWZpeGVzLml0ZXJhdG9yKCk7Ci0JCS8vd2hpbGUoYmxvY2tzLmhhc05leHQoKSkgewotCQkvLwlUYWdNYXJrZXIgbWFya2VyID0gKFRhZ01hcmtlcilibG9ja3MubmV4dCgpOwotCQkvLwlTdHJpbmcgbWFya2VyTmFtZSA9IG1hcmtlci5nZXRUYWdOYW1lKCk7Ci0JCS8vCWlmKHRhZ05hbWUubGVuZ3RoKCkgPiBtYXJrZXJOYW1lLmxlbmd0aCgpICsgMSAmJiB0YWdOYW1lLnN0YXJ0c1dpdGgobWFya2VyTmFtZSkgJiYgdGFnTmFtZS5jaGFyQXQobWFya2VyTmFtZS5sZW5ndGgoKSkgPT0gJzonKSB7Ci0JCS8vCQlyZXR1cm4gbWFya2VyLmlzR2xvYmFsKCkgfHwgZ2V0T2Zmc2V0KCkgPj0gbWFya2VyLmdldE1hcmtlcigpLmdldFN0YXJ0KCk7Ci0JCS8vCX0KLQkJLy99Ci0JCS8vcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlTmVzdGFibGVQcmVmaXgoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGZOZXN0YWJsZVByZWZpeGVzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIG5lc3RhYmxlcyA9IGZOZXN0YWJsZVByZWZpeGVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAobmVzdGFibGVzLmhhc05leHQoKSkgewotCQkJCWlmICgoKFRhZ01hcmtlcikgbmVzdGFibGVzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQkJCW5lc3RhYmxlcy5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQkJZkJsb2NrTWFya2Vycy5yZW1vdmUobWFya2VyKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ25hbWUpIHsKLQkJaWYgKGZCbG9ja01hcmtlcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoKChCbG9ja01hcmtlcikgYmxvY2tzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWduYW1lKSkKLQkJCQkJYmxvY2tzLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmcgZW5kVGFnTmFtZSkgewotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgbnVsbCwgZW5kVGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nW10gZW5kVHlwZXMpIHsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihzdGFydFR5cGUsIGVuZFR5cGVzLCBudWxsKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmcgZW5kVHlwZSkgewotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgbmV3IFN0cmluZ1tde2VuZFR5cGV9LCBudWxsKTsKLQl9Ci0JLyoqCi0JICogIHVzZXIgbWV0aG9kIAotCSAqIAotCSAqIEFzc2VtYmxlcyBhbiBlbWJlZGRlZCBjb250YWluZXIgYmVnaW5uaW5nIHdpdGggdGhlIGdpdmVuIHN0YXJ0VHlwZSBhcwotCSAqIHRoZSBmaXJzdCBDb250ZXh0UmVnaW9uIHdpdGhpbiBpdCBhbmQgb2YgdGhlIHR5cGUgZkVtYmVkZGVkSGludC4gIFRoZQotCSAqIGVuZFR5cGVzW10gYXJyYXkgY29udGFpbnMgdGhlIGNvbnRleHQgdHlwZXMgdGhhdCB3aWxsIGNhdXNlIGEgc3VjY2Vzc2Z1bAotCSAqIGV4aXQuICBVc2Ugb2YgdGhlIGVuZFRhZ05hbWUgcGFyYW1ldGVyIGFsdGVycyB0aGlzIGJlaGF2aW9yIHRvIGZvcmNlIGFuCi0JICogZXhpdCBvbiBhbiBYTUxfVEFHX0NMT1NFIGFmdGVyIHNlZWluZyBhbiBYTUxfVEFHX05BTUUgd2hvc2Ugc2lnbmlmaWNhbnQKLQkgKiB0ZXh0IG1hdGNoZXMgdGhlIGVuZFRhZ05hbWUgU3RyaW5nLiAgQWxsIGNvbnRlbnRzIGluIGJldHdlZW4gYXJlCi0JICogaW5zaWduaWZpY2FudCwgYW5kIHllcywgdGhpcyBtZWFucyBjb21tZW50cyBhcmUgYWxsb3dlZCBpbnNpZGUuCi0JICoqLwotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZ1tdIGVuZFR5cGVzLCBTdHJpbmcgZW5kVGFnTmFtZSkgewotCQkvLyB0aGUgY29udGV4dCBvZiB0aGUgcmVnaW9uIGJlaW5nIGFkZGVkIHRvIHRoZSBlbWJlZGRlZCBjb250YWluZXIKLQkJaW50ZXJuYWxDb250ZXh0ID0gc3RhcnRUeXBlOwotCQkvLyBrZWVwIHRyYWNrIG9mIHdoZXJlIHRoaXMgY29udGFpbmVyIGJlZ2FuOyB0byBwcm92aWRlIHJlbGF0aXZlIGluZGVjZXMgZm9yIHRoZSByZWdpb25zCi0JCWludCBjb250YWluZXJTdGFydCA9IHl5Y2hhcjsKLQkJYm9vbGVhbiBub3RGaW5pc2hlZCA9IHRydWU7Ci0JCS8vIGtlZXAgdHJhY2sgb2Ygd2hlcmUgd2Ugc2VlbSB0byBiZSBzbyB0aGF0IHRoZSBlbmRUYWdOYW1lIGNhbiBiZSBjaGVja2VkCi0JCWJvb2xlYW4gaXNJbkVuZFRhZyA9IGZhbHNlOwotCQlib29sZWFuIGlzSW5GaXJzdFRhZyA9IHRydWU7Ci0JCS8vIGNyZWF0ZSB0aGUgZW1iZWRkZWQgY29udGFpbmVyIGFuZCBzZXR1cCBpdHMgInR5cGUiCi0JCWlmIChmRW1iZWRkZWRDb250YWluZXIgPT0gbnVsbCkgewotCQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbmV3IENvbnRleHRSZWdpb25Db250YWluZXIoKTsKLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUeXBlKGZFbWJlZGRlZEhpbnQpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFN0YXJ0KGNvbnRhaW5lclN0YXJ0KTsKLQkJCS8vIFRPRE86IHBhcmVudCByZWdpb24gbmVlZHMgdG8gYmUgc2V0IC4uLi4gYnV0IG5vdCBzdXJlIHdoZXJlIHRvIGdldCBpdCBmcm9tIAotCQkJLy8JCWZFbWJlZGRlZENvbnRhaW5lci5zZXRQYXJlbnQocGFyZW50UmVnaW9uKTsKLQkJfQotCQljb250YWluZXJTdGFydCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRTdGFydCgpOwotCQl3aGlsZSAobm90RmluaXNoZWQpIHsKLQkJCS8vIGFkZCB0aGUgcmVnaW9uIHRvIHRoZSBjb250YWluZXIKLQkJCWlmIChpbnRlcm5hbENvbnRleHQgIT0gbnVsbCAmJiBpbnRlcm5hbENvbnRleHQgIT0gUFJPWFlfQ09OVEVYVCkgewotCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy9uZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJLy8gbG9uZ3NjYW4gZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGF0dGVtcHQgYSBibG9ja1RhZ1NjYW4gd2l0aGluIHRoZSBlbWJlZGRlZCBjb250YWluZXIKLQkJCQlib29sZWFuIGxvbmdzY2FuID0gZmFsc2U7Ci0JCQkJLy8gc2F2ZSB0aGUgdG9rZW5pemVyIHN0YXRlIGluIGNhc2Ugb2YgYSBibG9jayB0YWcgc2NhbgotCQkJCWludCBwcmV2aW91c1N0YXRlID0geXlzdGF0ZSgpOwotCQkJCVN0cmluZyBwcmV2aW91c0N1cnJlbnRUYWdOYW1lID0gZkN1cnJlbnRUYWdOYW1lOwotCQkJCWludCBwcmV2aW91c1Bvc3RTdGF0ZSA9IGZFbWJlZGRlZFBvc3RTdGF0ZTsKLQkJCQlTdHJpbmcgcHJldmlvdXNFbWJlZGRlZEhpbnQgPSBmRW1iZWRkZWRIaW50OwotCQkJCS8vIGRldGVybWluZSBpZiBhIGJsb2NrIHRhZyBzY2FuIGlzIG5lY2Vzc2FyeQotCQkJCWlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7Ci0JCQkJCWludGVybmFsVGFnTmFtZSA9IHl5dGV4dCgpOwotCQkJCQlpZighaXNOZXN0YWJsZShpbnRlcm5hbFRhZ05hbWUpKSB7Ci0JCQkJCQlpbnRlcm5hbFRhZ05hbWUgPSBudWxsOwotCQkJCQkJLy8gc25hZ2dlZCBhIHRhZyBuYW1lIHdlIHNob3VsZG4ndCBoYXZlCi0JCQkJCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9BQk9SVF9FTUJFRERFRDsKLQkJCQkJCW5vdEZpbmlzaGVkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfT1BFTiB8fCBpbnRlcm5hbENvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJCQlpbnRlcm5hbFRhZ05hbWUgPSBudWxsOwotCQkJCX0KLQkJCQkvLyBkbyB1cGtlZXAgZm9yIGVuZFRhZ05hbWUgdXNhZ2U7IG11c3QgYmUgaGVyZSBzaW5jZSB0aGUgbmV4dCB0b2tlbiBjb3VsZCBiZSB0aGUgY2xvc2UKLQkJCQlpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkJaXNJbkVuZFRhZyA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19DTE9TRSkgewotCQkJCQlpc0luRmlyc3RUYWcgPSBpc0luRW5kVGFnID0gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkgCUlUZXh0UmVnaW9uTGlzdCBlbWJlZGRlZFJlZ2lvbnMgPSBmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpOwotCQkJCQlpZiAoZW1iZWRkZWRSZWdpb25zLnNpemUoKSA+IDIgJiYgKGVtYmVkZGVkUmVnaW9ucy5nZXQoZW1iZWRkZWRSZWdpb25zLnNpemUoKS0xKSkuZ2V0VHlwZSgpID09IFhNTF9UQUdfQ0xPU0UgJiYgKGVtYmVkZGVkUmVnaW9ucy5nZXQoZW1iZWRkZWRSZWdpb25zLnNpemUoKSAtIDMpKS5nZXRUeXBlKCkgPT0gWE1MX1RBR19PUEVOICYmIGludGVybmFsVGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoY29udGFpbnNUYWdOYW1lKGludGVybmFsVGFnTmFtZSkpIHsKLQkJCQkJCQlsb25nc2NhbiA9IHRydWU7Ci0JCQkJCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGxvbmdzY2FuKQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSBpbnRlcm5hbFRhZ05hbWU7Ci0JCQkJLy8gcmVhZCB0aGUgbmV4dCByZWdpb24gYW5kIGNvbnRleHQKLQkJCQlpbnRlcm5hbENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJaWYgKGxvbmdzY2FuKSB7Ci0JCQkJCS8vIFJldHVybmluZyBmcm9tIGEgYmxvY2sgdGFnIHNjYW4gcmVxdWlyZXMgcmVzdG9yaW5nIHNvbWUgc3RhdGUgdmFyaWFibGVzCi0JCQkJCS8vIGFzIHdlbGwgYXMgaGFuZGxpbmcgdGhlIGJsb2NrIHJlZ2lvbiBhbmQgc2V0dGluZyB1cCBmb3Igbm9ybWFsIHNjYW5uaW5nCi0JCQkJCS8vIGluc2lkZSB0aGUgZW1iZWRkZWQgY29udGFpbmVyCi0JCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCQkvLyBuZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsKLQkJCQkJbG9uZ3NjYW4gPSBmYWxzZTsKLQkJCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gcHJldmlvdXNQb3N0U3RhdGU7Ci0JCQkJCWZFbWJlZGRlZEhpbnQgPSBwcmV2aW91c0VtYmVkZGVkSGludDsKLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gcHJldmlvdXNDdXJyZW50VGFnTmFtZTsKLQkJCQkJeXliZWdpbihwcmV2aW91c1N0YXRlKTsKLQkJCQkJaW50ZXJuYWxDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBwcmltR2V0TmV4dFRva2VuKCkgY2FsbHMgbWF5IHRocm93IGFuIElPRXhjZXB0aW9uCi0JCQkJLy8gY2F0Y2ggYW5kIGRvIG5vdGhpbmcgc2luY2UgdGhlIGlzRU9GIGNoZWNrIGJlbG93Ci0JCQkJLy8gd2lsbCBwcm9wZXJseSBleGl0IGlmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZikgewotCQkJCS8vIHNvbWUgb3RoZXIgZXhjZXB0aW9uIGhhcHBlbmVkOyBuZXZlciBzaG91bGQKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGYpOwotCQkJfQotCQkJYm9vbGVhbiBpc0VuZGluZ1R5cGUgPSB5eXN0YXRlKCkgPT0gU1RfQUJPUlRfRU1CRURERUQ7Ci0JCQlpZighaXNFbmRpbmdUeXBlKSB7Ci0JCQkJLy8gY2hlY2sgZm9yIGVuZGluZyBjb250ZXh0Ci0JCQkJaWYgKGVuZFRhZ05hbWUgPT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVuZFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpc0VuZGluZ1R5cGUgPSBpc0VuZGluZ1R5cGUgfHwgKGludGVybmFsQ29udGV4dCA9PSBlbmRUeXBlc1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlzRW5kaW5nVHlwZSA9ICgoaXNJbkVuZFRhZyAmJiBpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19DTE9TRSkgfHwgKGlzSW5GaXJzdFRhZyAmJiBpbnRlcm5hbENvbnRleHQgPT0gWE1MX0VNUFRZX1RBR19DTE9TRSkpICYmIGludGVybmFsVGFnTmFtZSAhPSBudWxsICYmIGludGVybmFsVGFnTmFtZS5lcXVhbHMoZW5kVGFnTmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkTGlzdCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCk7Ci0JCQlub3RGaW5pc2hlZCA9IG5vdEZpbmlzaGVkICYmICgoIWlzRW5kaW5nVHlwZSkgJiYgIWlzRU9GKCkgJiYgKGVuZFRhZ05hbWUgIT0gbnVsbCB8fCBpbnRlcm5hbENvbnRleHQgIT0gVU5ERUZJTkVEKSAmJiAhKGludGVybmFsQ29udGV4dCA9PSBQUk9YWV9DT05URVhUICYmIChlbWJlZGRlZExpc3QuZ2V0KGVtYmVkZGVkTGlzdC5zaXplKCktMSkpLmdldFR5cGUoKSA9PSBVTkRFRklORUQpKTsKLQkJfQotCQkvLyBmaW5pc2ggYWRkaW5nIHRoZSBsYXN0IGNvbnRleHQKLQkJaWYgKGludGVybmFsQ29udGV4dCAhPSBudWxsICYmIGludGVybmFsQ29udGV4dCAhPSBQUk9YWV9DT05URVhUKSB7Ci0JCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGludGVybmFsQ29udGV4dCwgeXljaGFyIC0gY29udGFpbmVyU3RhcnQsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOwotCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCS8vbmV3VG9rZW4uc2V0UGFyZW50KGZFbWJlZGRlZENvbnRhaW5lcik7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0ICsgeXlsZW5ndGgoKSk7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aCh5eWNoYXIgLSBjb250YWluZXJTdGFydCArIHl5bGVuZ3RoKCkpOwotCQl9Ci0JCXl5YmVnaW4oZkVtYmVkZGVkUG9zdFN0YXRlKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmVCbG9ja2luZygpIHsKLQkJcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgewotCQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBuZXdWYWx1ZTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckFsbG93c0pTUCgpIHsKLQkJcmV0dXJuIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsKLQkJCWlmKGNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQkJcmV0dXJuIG1hcmtlci5hbGxvd3NKU1AoKTsKLQkJCWVsc2UgaWYoIWNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJCXJldHVybiBtYXJrZXIuYWxsb3dzSlNQKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKSB7Ci0JCXJldHVybiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShmQ3VycmVudFRhZ05hbWUpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShTdHJpbmcgbmFtZSkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJYm9vbGVhbiBjYXNlc2Vuc2l0aXZlID0gbWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpOwotCQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQkJCWVsc2UgaWYoIWNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KCkgewotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBtYXJrZXIuZ2V0Q29udGV4dCgpOwotCQl9Ci0JCXJldHVybiBCTE9DS19URVhUOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQkJcmV0dXJuIGZCbG9ja01hcmtlcnM7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBmT2Zmc2V0ICsgeXljaGFyOwotCX0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcigpIHsKLQkJcmV0dXJuIGlzQmxvY2tNYXJrZXIoZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKCFmSXNCbG9ja2luZ0VuYWJsZWQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBjb250YWluc1RhZ05hbWUodGFnTmFtZSk7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQkJYmVnaW5CbG9ja01hcmtlclNjYW4obmV3VGFnTmFtZSwgQkxPQ0tfVEVYVCk7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKiBTcGVjaWFsIHRva2VuaXplciBzZXR1cC4gIEFsbG93cyB0b2tlbml6YXRpb24gdG8gYmUgaW5pdGlhdGVkIGF0IHRoZQotCSAqIHN0YXJ0IG9mIGEgdGV4dCBibG9jayB3aXRoaW4gYSAibmV3VGFnTmFtZSIgdGFnLgotCSAqCi0JICogRXhhbXBsZTogCi0JICoJVG9rZW5pemVyIHRva2VyID0gbmV3IFRva2VuaXplcigpOwotCSAqCXRva2VyLnNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhmYWxzZSk7Ci0JICoJdG9rZXIucmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCJhZml1aHF3a2VqaHRhc2loZ2Fsa3dodHE8L3NjcmlwdGVyPjwvc2NyPjwvc2NyaXB0PmFzZ2Rhc2dhIikpOwotCSAqCXRva2VyLmJlZ2luQmxvY2tNYXJrZXJTY2FuKCJzY3JpcHQiLCBCTE9DS19URVhUKTsKLQkgKgl0b2tlci5nZXRSZWdpb25zKCk7IAotCSAqCi0JICogUmV0dXJuczoKLQkgKglCTE9DS19URVhUOiAwLTQwCi0JICoJWE1MX0VORF9UQUdfT1BFTjogNDEtNDIKLQkgKglYTUxfVEFHX05BTUU6IDQzLTQ4Ci0JICoJWE1MX1RBR19DTE9TRTogNDktNDkKLQkgKglYTUxfQ09OVEVOVDogNTAtNTcKLQkgKgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgYmxvY2tjb250ZXh0KSB7Ci0JCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQlmQ3VycmVudFRhZ05hbWUgPSBuZXdUYWdOYW1lOwotCX0KLQotLyoqCi0gKiBNZXRob2QgZG9TY2FuLgotICogCi0gKiBSZXR1cm5zIGEgY29udGV4dCByZWdpb24gZm9yIGFsbCBvZiB0aGUgdGV4dCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIHVwdG8gdGhlIGVuZCBvZiBpbnB1dCBvcgotICogdG8gcmlnaHQgKmJlZm9yZSogdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBzZWFyY2hTdHJpbmcKLSAqIAotICogQHBhcmFtIHNlYXJjaFN0cmluZyAtIHRhcmdldCBzdHJpbmcgdG8gc2VhcmNoIGZvciBleC46ICItLT4iLCAiPC90YWduYW1lIgotICogQHBhcmFtIHJlcXVpcmVUYWlsU2VwYXJhdG9yIC0gd2hldGhlciB0aGUgdGFyZ2V0IG11c3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBvciAnPicKLSAqIEBwYXJhbSBhbGxvd0pTUCAtIGNoZWNrIGZvciBhbmQgYWxsb3cgZm9yIEpTUCBtYXJrdXAgPCUlPgotICogQHBhcmFtIGNvbnRleHQgLSB0aGUgY29udGV4dCBvZiB0aGUgc2Nhbm5lZCByZWdpb24gaWYgbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gZXhpdFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSByZWdpb24gd2FzIG9mIG5vbi16ZXJvIGxlbmd0aAotICogQHBhcmFtIGFib3J0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHNlYXJjaFN0cmluZyB3YXMgZm91bmQgaW1tZWRpYXRlbHkKLSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIGNvbnRleHQgZm91bmQ6IHRoZSBkZXNpcmVkIGNvbnRleHQgb24gYSBub24temVybyBsZW5ndGggbWF0Y2gsIHRoZSBhYm9ydENvbnRleHQgb24gaW1tZWRpYXRlIHN1Y2Nlc3MKLSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9TY2FuKFN0cmluZyBzZWFyY2hTdHJpbmcsIGJvb2xlYW4gcmVxdWlyZVRhaWxTZXBhcmF0b3IsIGJvb2xlYW4gYWxsb3dKU1AsIGJvb2xlYW4gYWxsb3dDREFUQSwgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOwotCS8vIERpc2FibGUgZnVydGhlciBibG9jayAocHJvYmFibHkpCi0JZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQlpbnQgbiA9IDA7Ci0JY2hhciBsYXN0Q2hlY2tDaGFyOwotCWludCBpOwotCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCS8vIENoZWNrIGZvciBKU1Agc3RhcnRzICgiPCUiKSBpZiB0aGUgdGFnIGlzIGdsb2JhbCBsaWtlIFNDUklQVCBvciBTVFlMRQotCWJvb2xlYW4gY2hlY2tKU1BzID0gYWxsb3dKU1AgJiYgIWZGb3JiaWRKU1A7Ci0JYm9vbGVhbiBjaGVja2VkRm9ySlNQc09uY2UgPSAhY2hlY2tKU1BzOwotCWJvb2xlYW4gY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSA9IGZhbHNlOwotCQotCXdoaWxlIChzdGlsbFNlYXJjaGluZykgewotCQluID0gMDsKLQkJLy8gRW5zdXJlIHRoYXQgZW5vdWdoIGRhdGEgZnJvbSB0aGUgaW5wdXQgZXhpc3RzIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgc2VhcmNoIFN0cmluZy4KLQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQotCQkJbiA9IHl5X2FkdmFuY2UoKTsKLS8vCQljID0gKGNoYXIpIG47Ci0JCS8vIElmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0IG9yIHdlJ3ZlIGV4aGF1c3RlZCB0aGUgaW5wdXQsIHN0b3AgaW1tZWRpYXRlbHkuCi0JCWlmIChuID09IFlZRU9GICYmIGNoZWNrZWRGb3JKU1BzT25jZSkgewotCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCS8qKgotCQkJICogTG9vayBmb3Igc3RhcnRpbmcgSlNQcyAiPCUiCi0JCQkgKi8KLQkJCWNoZWNrZWRGb3JKU1BzT25jZSA9IHRydWU7Ci0JCQkvLyAxKSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoIDogVGhlcmUncyBhdCBsZWFzdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBvbmNlIHRoYXQncyByZWFkLCBjaGVjayBmb3IgSlNQcwotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgYXQgY3VycmVudC1zZWFyY2hTdHJpbmdMZW5ndGg7IGlmIHNvLCBiYWNrdXAgYW5kIHN3aXRjaCBzY2FubmVyIHN0YXRlcyB0byBoYW5kbGUgaXQuCi0JCQkvLyBFbnN1cmUgdGhhdCB3ZSd2ZSBub3QgZW5jb3VudGVyZWQgYSBjb21wbGV0ZSBibG9jayAoPCUlPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZAotCQkJLy8gdGh1cyBmb3VuZCB0d2ljZSBhdCBjdXJyZW50LXRhcmdldExlbmd0aCBbc2luY2UgdGhlIGZpcnN0IHNjYW4gd291bGQgaGF2ZSBjb21lIG91dCB0aGlzIGZhciBhbnl3YXldLgotCQkJaWYoY2hlY2tKU1BzICYmIHl5X2N1cnJlbnRQb3MgPiBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiAKLQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICsgMV0gPT0gJyUnKSB7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotCQkJLy8gMikgeXlfY3VycmVudFBvcyAtIGpzcHN0YXJ0ZXIubGVuZ3RoIDogVGhlcmUncyBub3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgY2hlY2sgZm9yIGEgSlNQIDIgc3BvdHMgYmFjayBpbiB3aGF0IHdlIGNvdWxkIHJlYWQKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uICpoYXZpbmcqIGNsb3NlVGFnU3RyaW5nTGVuZ3RoIGFtb3VudCBvZiBpbnB1dCB0byB3b3JrIGFzIGRlc2lnbmVkLiAgTXVzdCBiZSBzdXJlIHdlIGRvbid0Ci0JCQkvLyBzcGlsbCBvdmVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3aGlsZSBjaGVja2luZy4KLQkJCWVsc2UgaWYoY2hlY2tKU1BzICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9jdXJyZW50UG9zID4gMCAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYKLQkJCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSAxXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdID09ICclJykgewotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIDE7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0JCQkvLyAzKSB5eV9jdXJyZW50UG9zLi4oeXlfY3VycmVudFBvcytqc3BTdGFydGxlbmd0aC0xKSA6IENoZWNrIGF0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgb25lIHRpbWUKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGltbWVkaWF0ZWx5IGluIHRoZSBibG9jayBhcmVhOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uIHl5X2N1cnJlbnRQb3MgZXF1YWxpbmcgZXhhY3RseSB0aGUgcHJldmlvdXMgZW5kICsxIHRvIHdvcmsgYXMgZGVzaWduZWQuCi0JCQllbHNlIGlmKGNoZWNrSlNQcyAmJiAhY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfc3RhcnRSZWFkID4gMCAmJgotCQkJCQl5eV9zdGFydFJlYWQgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZCArIDFdID09ICclJykgewotCQkJCWNoZWNrZWRKU1BzQXRTdGFydE9uY2UgPSB0cnVlOwotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfc3RhcnRSZWFkOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotCi0KLQkJCS8qKgotCQkJICogTG9vayBmb3Igc3RhcnRpbmcgQ0RBVEEgIjwhW0NEQVRBWyIKLQkJCSAqLwotCQkJLy8gMSkgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDogVGhlcmUncyBhdCBsZWFzdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBvbmNlIHRoYXQncyByZWFkLCBjaGVjayBmb3IgQ0RBVEEKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBDREFUQSBiZWdpbm5pbmcgYXQgY3VycmVudC1zZWFyY2hTdHJpbmdMZW5ndGg7IGlmIHNvLCBiYWNrdXAgYW5kIHN3aXRjaCBzY2FubmVyIHN0YXRlcyB0byBoYW5kbGUgaXQuCi0JCQkvLyBFbnN1cmUgdGhhdCB3ZSd2ZSBub3QgZW5jb3VudGVyZWQgYSBjb21wbGV0ZSBibG9jayAoPFshQ0RBVEFbXV0+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uCi0vKgkJCWlmKGNoZWNrQ0RBVEEgJiYgeXlfY3VycmVudFBvcyA+IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zICsgc2VhcmNoU3RyaW5nTGVuZ3RoIDwgeXlfYnVmZmVyLmxlbmd0aCAmJiB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIAotCQkJCWNoYXJzTWF0Y2goY2RhdGFTdGFydGVyLCB5eV9idWZmZXIsIDAsIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGgpKSB7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQkvLyBnbyB0byBhIHN0YXRlIHdoZXJlIENEQVRBIGNhbiBiZSBmb3VuZAotCQkJCWlmIChmRW1iZWRkZWRDb250YWluZXIgPT0gbnVsbCkgewotCQkJCQlmRW1iZWRkZWRDb250YWluZXIgPSBuZXcgQ29udGV4dFJlZ2lvbkNvbnRhaW5lcigpOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VHlwZShzZWFyY2hDb250ZXh0KTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFN0YXJ0KHl5Y2hhcik7Ci0JCQkJfQotCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oc2VhcmNoQ29udGV4dCwgeXljaGFyLCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQkJCVN0cmluZyBjb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCWlmKGNvbnRleHQuZXF1YWxzKFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9PUEVOKSkgewotCQkJCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9PUEVOLCBYTUxSZWdpb25Db250ZXh0cy5YTUxfQ0RBVEFfQ0xPU0UpOwotCQkJCX0KLQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLSovLyoKLQkJCS8vIDIpIHl5X2N1cnJlbnRQb3MgLSBjZGF0YVN0YXJ0ZXIubGVuZ3RoOiBUaGVyZSdzIG5vdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBjaGVjayBmb3IgYSBDREFUQSByaWdodCBoZXJlIHNwb3RzIGJhY2sgaW4gd2hhdCB3ZSBjb3VsZCByZWFkCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbjsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiAqaGF2aW5nKiBjbG9zZVRhZ1N0cmluZ0xlbmd0aCBhbW91bnQgb2YgaW5wdXQgdG8gd29yayBhcyBkZXNpZ25lZC4gIE11c3QgYmUgc3VyZSB3ZSBkb24ndAotCQkJLy8gc3BpbGwgb3ZlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgd2hpbGUgY2hlY2tpbmcuCi0JCQllbHNlIGlmKGNoZWNrQ0RBVEEgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X2N1cnJlbnRQb3MgPiAwICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJgotCQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIDFdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfY3VycmVudFBvc10gPT0gJyUnKSB7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gMTsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7Ci0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCX0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLQkJCS8vIDMpIHl5X2N1cnJlbnRQb3MgOiBDaGVjayBhdCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9uZSB0aW1lCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBpbW1lZGlhdGVseSBpbiB0aGUgYmxvY2sgYXJlYTsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiB5eV9jdXJyZW50UG9zIGVxdWFsaW5nIGV4YWN0bHkgdGhlIHByZXZpb3VzIGVuZCArMSB0byB3b3JrIGFzIGRlc2lnbmVkLgotCQkJZWxzZSBpZihjaGVja0NEQVRBICYmICFjaGVja2VkRm9yQ0RBVEFPbmNlICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9zdGFydFJlYWQgPiAwICYmCi0JCQkJCXl5X3N0YXJ0UmVhZCA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWRdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkICsgMV0gPT0gJyUnKSB7Ci0JCQkJY2hlY2tlZEZvckNEQVRBT25jZSA9IHRydWU7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9zdGFydFJlYWQ7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0qLwotCQkJLy8gQ2hlY2sgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHRhcmdldCB2ZXJzdXMgdGhlIGxhc3QgdGFyZ2V0TGVuZ3RoIGNoYXJhY3RlcnMgcmVhZCBmcm9tIHRoZSBidWZmZXIKLQkJCS8vIGFuZCBzZWUgaWYgaXQgbWF0Y2hlcwotCQkJaWYgKG4gPT0gWVlFT0YpIHsKLQkJCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2FtZSA9IHRydWU7Ci0JCQkJLy8gc2FmZXR5IGNoZWNrIGZvciBhcnJheSBhY2Nlc3NlcwotCQkJCWlmKHl5X2N1cnJlbnRQb3MgPj0gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgPD0geXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCQlmb3IoaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdMZW5ndGg7IGkrKykgewotCQkJCQkJaWYoc2FtZSAmJiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpCi0JCQkJCQkJc2FtZSA9IHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKTsKLQkJCQkJCWVsc2UgaWYoc2FtZSAmJiAhZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJCXNhbWUgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoeXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNlYXJjaFN0cmluZy5jaGFyQXQoaSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHNhZmV0eSBjaGVjayBmYWlsZWQ7IG5vIG1hdGNoIGlzIHBvc3NpYmxlIHJpZ2h0IG5vdwotCQkJCWVsc2UgewotCQkJCQlzYW1lID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNhbWUgJiYgcmVxdWlyZVRhaWxTZXBhcmF0b3IgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCQkvLyBBZGRpdGlvbmFsIGNoZWNrIGZvciBjbG9zZSB0YWdzIHRvIGVuc3VyZSB0aGF0IHRhcmdldFN0cmluZz0iPC9zY3JpcHQiIGRvZXNuJ3QgbWF0Y2gKLQkJCQkvLyAiPC9zY3JpcHRTIgotCQkJCWxhc3RDaGVja0NoYXIgPSB5eV9idWZmZXJbeXlfY3VycmVudFBvc107Ci0JCQkJLy8gU3VjY2VlZCBvbiAiPC9zY3JpcHQ+IiBhbmQgIjwvc2NyaXB0ICIKLQkJCQlpZihsYXN0Q2hlY2tDaGFyID09ICc+JyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGxhc3RDaGVja0NoYXIpKQotCQkJCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RpbGxTZWFyY2hpbmcgPSAhc2FtZSB8fCAoeXlfY3VycmVudFBvcyA8IHl5X3N0YXJ0UmVhZCArIHNlYXJjaFN0cmluZ0xlbmd0aCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKG4gIT0gWVlFT0YgfHwgc2FtZSkgewotCQkvLyBXZSd2ZSBzdG9wcGVkIHNob3J0IG9mIHRoZSBlbmQgb3IgZGVmaW5pdGVseSBmb3VuZCBhIG1hdGNoCi0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7Ci0JCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkvLyBJZiB0aGUgc2VhcmNoU3RyaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlCi0JCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5Ci0JCWlmICh5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQl5eWJlZ2luKGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOwotCQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJLy8gV2UgcmFuIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGlucHV0Ci0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7Ci0JCXl5X2N1cnJlbnRQb3MrKzsKLQl9Ci0JeXliZWdpbihleGl0U3RhdGUpOwotCS8vIElmIHRoZSBlbmRpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUKLQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQotCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpCi0JCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7Ci0JcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICogZG9lcyBhIGxvb2thaGVhZCBmb3IgdGhlIGN1cnJlbnQgdGFnIG5hbWUKLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1RhZ1NjYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCk7Ci0JcmV0dXJuIGRvU2NhbigiPC8iICsgZkN1cnJlbnRUYWdOYW1lLCB0cnVlLCBnZXRCbG9ja01hcmtlckFsbG93c0pTUCgpLCB0cnVlLCBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKSwgWVlJTklUSUFMLCBZWUlOSVRJQUwpOwotfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKiBDb252ZXJ0cyB0aGUgcmF3IGNvbnRleHQgU3RyaW5nIHJldHVybmVkIGJ5IHRoZSBwcmltR2V0TmV4dFRva2VuKCkKLQkgKiBtZXRob2QgaW50byBhIGZ1bGwgSVRleHRSZWdpb24gYnkgcHVsbGluZyBpbiB2YWx1ZXMgZm9yIHRoZQotCSAqIGN1cnJlbnQgb2Zmc2V0IHdpdGhpbiB0aGUgc2Nhbm5pbmcgdGV4dC4KLQkgKgotCSAqIFJldHVybnMgbnVsbCB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBhbmQgYXR0YWNoZXMgaW50ZXJtaXR0ZW50bHkKLQkgKiBkaXNjb3ZlcmVkIHdoaXRlc3BhY2Ugb250byB0aGUgZW5kIG9mIHVzZWZ1bCByZWdpb25zLgotCSAqCi0JICogTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIGNhY2hlcyB0aGUgdG9rZW4gZm9sbG93aW5nIHRoZSBvbmUgYmVpbmcgcmV0dXJuZWQKLQkgKiBzbyB0aGF0IHdoaXRlc3BhY2UgY2FuIGJlIGNvbGxhcHNlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQkJLy8gbG9hZCB0aGUgc3RhcnRpbmcgbm9uLXdoaXRlc3BhY2UgdG9rZW4gKGFzc3VtZSB0aGF0IGl0IGlzIHNvKQotCQlpZiAoZlNob3VsZExvYWRCdWZmZXJlZCkgewotCQkJaWYgKGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbiBjb250YWluZXIgPSBmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lcjsKLQkJCQlmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQkJCXJldHVybiBjb250YWluZXI7Ci0JCQl9Ci0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsKLQkJCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7Ci0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0gZkJ1ZmZlcmVkTGVuZ3RoOwotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQl9IGVsc2UgewotCQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCWlmIChjb250ZXh0ID09IFBST1hZX0NPTlRFWFQpIHsKLQkJCQlyZXR1cm4gZkVtYmVkZGVkQ29udGFpbmVyOwotCQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX1JPT1RfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpCi0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOwotCQkJCWVsc2UKLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQkJCX0gZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQkJCX0KLQkJCXN0YXJ0ID0geXljaGFyOwotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQlpZiAoeXlfYXRFT0YpIHsKLQkJCQlmVG9rZW5Db3VudCsrOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCS8vIHN0b3JlIHRoZSBuZXh0IHRva2VuCi0JCWZfY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJaWYgKGZfY29udGV4dCA9PSBQUk9YWV9DT05URVhUKSB7Ci0JCQlmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciA9IGZFbWJlZGRlZENvbnRhaW5lcjsKLQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ST09UX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCQllbHNlCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQkJfQotCQlmQnVmZmVyZWRDb250ZXh0ID0gZl9jb250ZXh0OwotCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IHRydWU7Ci0JCWlmIChmQnVmZmVyZWRDb250ZXh0ID09IFdISVRFX1NQQUNFKSB7Ci0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCQlsZW5ndGggKz0gZkJ1ZmZlcmVkTGVuZ3RoOwotCQl9Ci0JCWlmIChjb250ZXh0ID09IG51bGwpIHsKLQkJCS8vIEVPRgotCQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkaXNjb3ZlcmVkICIgKyBmVG9rZW5Db3VudCArICIgdG9rZW5zLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZlRva2VuQ291bnQrKzsKLQkJcmV0dXJuIGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgsIG51bGwsIGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIEpTUFRva2VuaXplcigpewotCQlzdXBlcigpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBKU1BUb2tlbml6ZXIoY2hhcltdIGNoYXJBcnJheSl7Ci0JCQl0aGlzKG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSkgewotCQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIDApOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXksIGludCBuZXdPZmZzZXQpIHsKLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCBuZXdPZmZzZXQpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQkJcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCAwKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgbmV3T2Zmc2V0KTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbikgewotCQlyZXNldChpbiwgMCk7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kICoKLQkgKgotCSAqIFJlc2V0IGludGVybmFsIGNvdW50ZXJzIGFuZCB2YXJzIHRvICJuZXdseSBjcmVhdGVkIiB2YWx1ZXMsIGluIHRoZSBob3BlcwotCSAqIHRoYXQgcmVzZXR0aW5nIGEgcHJlLWV4aXN0aW5nIHRva2VuaXplciBpcyBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuCi0JICoKLQkgKiBUaGlzIG1ldGhvZCBjb250YWlucyBjb2RlIGJsb2NrcyB0aGF0IHdlcmUgZXNzZW50aWFsbHkgZHVwbGljYXRlZCBmcm9tIHRoZQotCSAqIDxlbT5nZW5lcmF0ZWQ8L2VtPiBvdXRwdXQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGJlZm9yZSB0aGlzIG1ldGhvZCB3YXMKLQkgKiBhZGRlZC4gIFRob3NlIGNvZGUgYmxvY2tzIHdlcmUgdW5kZXIgdGhlIGFib3ZlIGNvcHlyaWdodC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVzZXR0aW5nIHRva2VuaXplciIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlmT2Zmc2V0ID0gbmV3T2Zmc2V0OwotCQotCQkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JCXl5X3JlYWRlciA9IGluOwotCQotCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JCXl5X3N0YXRlID0gMDsKLQkKLQkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCQotCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsKLQkKLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLQkJeXlfbWFya2VkUG9zID0gMDsKLQkKLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLQkJeXlfcHVzaGJhY2tQb3MgPSAwOwotCQotCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLQkJeXlfY3VycmVudFBvcyA9IDA7Ci0JCi0JCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotCQl5eV9zdGFydFJlYWQgPSAwOwotCQotCQkvKiogCi0JCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCQkgKiBmcm9tIGlucHV0IAotCQkgKi8KLQkJeXlfZW5kUmVhZCA9IDA7Ci0JCi0JCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQl5eWxpbmUgPSAwOwotCQotCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXljaGFyID0gMDsKLQkKLQkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotCQl5eV9hdEVPRiA9IGZhbHNlOwotCQotCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLQkJeXlfZW9mX2RvbmUgPSBmYWxzZTsKLQkKLQkKLQkJLyogdXNlciB2YXJzOiAqLwotCQlmVG9rZW5Db3VudCA9IDA7Ci0JIAotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCQlmQnVmZmVyZWRTdGFydCA9IDE7Ci0JCWZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JCWZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JCi0JCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0gLTE7Ci0JCi0JCWNvbnRleHQgPSBudWxsOwotCQlzdGFydCA9IDA7Ci0JCXRleHRMZW5ndGggPSAwOwotCQlsZW5ndGggPSAwOwotCQotCQlmRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCQkKLQkJZkVMbGV2ZWwgPSAwOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqCi0JICovCi0JcHVibGljIEJsb2NrVG9rZW5pemVyIG5ld0luc3RhbmNlKCkgewotCQlKU1BUb2tlbml6ZXIgbmV3SW5zdGFuY2UgPSBuZXcgSlNQVG9rZW5pemVyKCk7Ci0JCS8vIGdsb2JhbCB0YWdtYXJrZXJzIGNhbiBiZSBzaGFyZWQ7IHRoZXkgaGF2ZSBubyBzdGF0ZSBhbmQgCi0JCS8vIGFyZSBuZXZlciBkZXN0cm95ZWQgKGUuZy4gJ3JlbGVhc2UnKQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJQmxvY2tNYXJrZXIgYmxvY2tNYXJrZXIgPSAoQmxvY2tNYXJrZXIpIGZCbG9ja01hcmtlcnMuZ2V0KGkpOwotCQkJaWYoYmxvY2tNYXJrZXIuaXNHbG9iYWwoKSkKLQkJCQluZXdJbnN0YW5jZS5hZGRCbG9ja01hcmtlcihibG9ja01hcmtlcik7Ci0JCX0KLQkJZm9yKGludCBpID0gMDsgaSA8IGZOZXN0YWJsZVByZWZpeGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlUYWdNYXJrZXIgbWFya2VyID0gKFRhZ01hcmtlcikgZk5lc3RhYmxlUHJlZml4ZXMuZ2V0KGkpOwotCQkJaWYobWFya2VyLmlzR2xvYmFsKCkpCi0JCQkJbmV3SW5zdGFuY2UuYWRkTmVzdGFibGVQcmVmaXgobWFya2VyKTsKLQkJfQotCQlyZXR1cm4gbmV3SW5zdGFuY2U7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NhblhNTENvbW1lbnRUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gU2NhbiBmb3IgJy0tPicgYW5kIHJldHVybiB0aGUgdGV4dCB1cCB0byB0aGF0IHBvaW50IGFzCi0JCS8vICAgWE1MX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoCi0JCS8vICBjYXNlIGNoYW5nZSB0byB0aGUgU1RfWE1MX0NPTU1FTlRfRU5EIHN0YXRlIGFuZCByZXR1cm4gdGhlIG5leHQKLQkJLy8gIGNvbnRleHQgYXMgdXN1YWwuCi0JCXJldHVybiBkb1NjYW4oIi0tPiIsIGZhbHNlLCB0cnVlLCB0cnVlLCBYTUxfQ09NTUVOVF9URVhULCBTVF9YTUxfQ09NTUVOVF9FTkQsIFNUX1hNTF9DT01NRU5UX0VORCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NhbkpTUENvbW1lbnRUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gU2NhbiBmb3IgJy0tJT4nIGFuZCByZXR1cm4gdGhlIHRleHQgdXAgdG8gdGhhdCBwb2ludCBhcwotCQkvLyAgIEpTUF9DT01NRU5UX1RFWFQgdW5sZXNzIHRoZSBzdHJpbmcgb2NjdXJzIElNTUVESUFURUxZLCBpbiB3aGljaAotCQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX0pTUF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0Ci0JCS8vICBjb250ZXh0IGFzIHVzdWFsLgotCQlyZXR1cm4gZG9TY2FuKCItLSU+IiwgZmFsc2UsIGZhbHNlLCB0cnVlLCBKU1BfQ09NTUVOVF9URVhULCBTVF9KU1BfQ09NTUVOVF9FTkQsIFNUX0pTUF9DT01NRU5UX0VORCk7Ci0JfQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEpTUFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBKU1BUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBERkEgdHJhbnNpdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB5eV91bnBhY2soU3RyaW5nIHBhY2tlZCkgewotICAgIGludCBbXSB0cmFucyA9IG5ldyBpbnRbMzE1OTVdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDgyMDYpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIHZhbHVlLS07Ci0gICAgICBkbyB0cmFuc1tqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiB0cmFuczsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMzc2KSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZyAtIGZyb20gdGhlIFNFRCBKRmxleCBza2VsZXRvbgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotICAgIC8vIERPIE5PVCBFWElUIHRoZSBWTSBvbiBhbiBlcnJvcgotICAgIC8vIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKGNoYXJbXSBtYXJrZXJUYWdOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgdGFnbmFtZUxlbmd0aCkgewotCQlmb3IoaW50IGogPSAwOyBqIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGorKykgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWZCbG9ja01hcmtlcnMuZ2V0KGopOwotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5sZW5ndGgoKSA9PSB0YWduYW1lTGVuZ3RoKSB7Ci0JCQkJYm9vbGVhbiBtYXRjaGVzU29GYXIgPSB0cnVlOwotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCB0YWduYW1lTGVuZ3RoICYmIG1hdGNoZXNTb0ZhcjsgaSsrKSB7Ci0JCQkJCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkgIT0gbWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkKLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmKENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXIuZ2V0VGFnTmFtZSgpLmNoYXJBdChpKSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pKQotCQkJCQkJCW1hdGNoZXNTb0ZhciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKG1hdGNoZXNTb0ZhcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICoKLQkgKiBSZXR1cm4gQUxMIG9mIHRoZSByZWdpb25zIHNjYW5uYWJsZSB3aXRoaW4gdGhlIHJlbWFpbmluZyB0ZXh0Ci0JICogTm90ZTogZm9yIHZlcmlmaWNhdGlvbiB1c2UKLQkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdCBnZXRSZWdpb25zKCkgewotCQlMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZ2lvbiA9IGdldE5leHRUb2tlbigpOwotCQkJd2hpbGUocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkJdG9rZW5zLmFkZChyZWdpb24pOwotCQkJCX0KLQkJCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIjogaW5wdXQgY291bGQgbm90IGJlIHRva2VuaXplZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldE9mZnNldCgpLCBlKTsvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBlOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gU2luY2UgdGhpcyBpcyBjb252ZW5pZW5jZSBtZXRob2QgYW5kIE5PVCB0aGUgcmVjb21tZW5kZWQgCi0JCQkvLyB3YXkgb2YgZ2V0dGluZyB0b2tlbnMsIG1hbnkgZXJyb3JzIGFyZSBzaW1wbHkgaGlkZGVuCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gbm90IGhhbmRsZWQgcmV0cmlldmluZyByZWdpb25zOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGUpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdG9rZW5zOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBkdW1wKFN0cmluZyBzKSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHMgKyAiICgiICsgeXljaGFyICsgIi0iICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkoeXlsZW5ndGgoKSArIHl5Y2hhcikgKyAiKTpcJyIgKy8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nVXRpbHMuZXNjYXBlKHl5dGV4dCgpKSArICJcJyIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkvKiB1c2VyIG1ldGhvZCAgLSBza2VsZXRvbi5zZWQgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VPRigpIHsKLQkJcmV0dXJuIHl5X2F0RU9GOwotCX0KLS8qIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkICovCi1wcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoU3RyaW5nIG1hcmtlclRhZ05hbWUpIHsKLQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoYmxvY2tzLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpYmxvY2tzLm5leHQoKTsKLQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhtYXJrZXJUYWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShtYXJrZXJUYWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotICAgIGlmICgheXlfZW9mX2RvbmUpIHsKLSAgICAgIHl5X2VvZl9kb25lID0gdHJ1ZTsKLSAgICAvLyBkbyBub3RoaW5nLCB0aGlzIGlzIHRoZSBkb3duc3RyZWFtIHBhcnNlcidzIGpvYgotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0gICAgeXlfcHVzaGJhY2tQb3MgPSAtMTsKLSAgICBib29sZWFuIHl5X3dhc19wdXNoYmFjazsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgIHl5Y2hhcis9IHl5bGVuZ3RoKCk7Ci0KLSAgICAgIGJvb2xlYW4geXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgZm9yICh5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkOyB5eV9jdXJyZW50UG9zIDwgeXlfbWFya2VkUG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfY3VycmVudFBvcysrKSB7Ci0gICAgICAgIHN3aXRjaCAoeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdKSB7Ci0gICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB5eV9jb3VudGVkID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgIGlmICh5eV9jb3VudGVkKQotICAgICAgICAgICAgeXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoeXlfY291bnRlZCkgewotICAgICAgICBpZiAoIHl5X2FkdmFuY2UoKSA9PSAnXG4nICkgeXlsaW5lLS07Ci0gICAgICAgIGlmICggIXl5X2F0RU9GICkgeXlfY3VycmVudFBvcy0tOwotICAgICAgfQotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgeXlfc3RhdGUgPSB5eV9sZXhpY2FsX3N0YXRlOwotCi0gICAgICB5eV93YXNfcHVzaGJhY2sgPSBmYWxzZTsKLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgaW50IHl5X25leHQgPSB5eXRyYW5zWyB5eV9yb3dNYXBbeXlfc3RhdGVdICsgeXljbWFwW3l5X2lucHV0XSBdOwotICAgICAgICAgIGlmICh5eV9uZXh0ID09IC0xKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgeXlfc3RhdGUgPSB5eV9uZXh0OwotCi0gICAgICAgICAgaW50IHl5X2F0dHJpYnV0ZXMgPSBZWV9BVFRSSUJVVEVbeXlfc3RhdGVdOwotICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiAyKSA+IDAgKQotICAgICAgICAgICAgeXlfcHVzaGJhY2tQb3MgPSB5eV9jdXJyZW50UG9zOwotCi0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDEpID4gMCApIHsKLSAgICAgICAgICAgIHl5X3dhc19wdXNoYmFjayA9ICh5eV9hdHRyaWJ1dGVzICYgNCkgPiAwOwotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgOCkgPiAwICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh5eV93YXNfcHVzaGJhY2spCi0gICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X3B1c2hiYWNrUG9zOwotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICAKLQotICAgICAgICBjYXNlIDYyMjogCi0gICAgICAgIGNhc2UgNjI3OiAKLSAgICAgICAgY2FzZSA2MzQ6IAotICAgICAgICBjYXNlIDYzOTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgianNwIGRpcmVjdGl2ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBKU1BfRElSRUNUSVZFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY1NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTk3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYU0wgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2NTY6IGJyZWFrOwotICAgICAgICBjYXNlIDU4MDogCi0gICAgICAgIGNhc2UgNTgzOiAKLSAgICAgICAgY2FzZSA1ODQ6IAotICAgICAgICBjYXNlIDU4NTogCi0gICAgICAgIGNhc2UgNTg2OiAKLSAgICAgICAgY2FzZSA1ODc6IAotICAgICAgICBjYXNlIDU4ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5DREFUQSBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JeXliZWdpbihTVF9DREFUQV9URVhUKTsKLQlyZXR1cm4gWE1MX0NEQVRBX09QRU47Ci0gfQotICAgICAgICBjYXNlIDY1NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTcyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJqc3A6cm9vdCB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBKU1BfUk9PVF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjU4OiBicmVhazsKLSAgICAgICAgY2FzZSA1NjM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSA2NTk6IGJyZWFrOwotICAgICAgICBjYXNlIDU2MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDY2MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTYxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfRE9DVFlQRV9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgNjYxOiBicmVhazsKLSAgICAgICAgY2FzZSA1NDY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgZXh0ZXJuYWwgaWQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQzsKLSB9Ci0gICAgICAgIGNhc2UgNjYyOiBicmVhazsKLSAgICAgICAgY2FzZSA1NDU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgZXh0ZXJuYWwgaWQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1RFTTsKLSB9Ci0gICAgICAgIGNhc2UgNjYzOiBicmVhazsKLSAgICAgICAgY2FzZSA1Mzk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2NjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDUxNDogCi0gICAgICAgIGNhc2UgNTU1OiAKLSAgICAgICAgY2FzZSA1NTY6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY2NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA0OiAKLSAgICAgICAgY2FzZSA1NTE6IAotICAgICAgICBjYXNlIDU1MjogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX0VMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2NjY6IGJyZWFrOwotICAgICAgICBjYXNlIDQ5NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5KU1AgY29tbWVudCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIEpTUF9DT01NRU5UX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2Njc6IGJyZWFrOwotICAgICAgICBjYXNlIDQ4MzogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLTIpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJWQkwgaW4gYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX0pTUF9WQkwpOwotCWZFTGxldmVsKys7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFfSk7Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY2ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDgyOiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoeXlsZW5ndGgoKSA+IDIpCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtMik7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkVMIGluIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9KU1BfRUwpOwotCWZFTGxldmVsKys7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9FTF9DTE9TRX0pOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2Njk6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5DaGFyUmVmIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQ0hBUl9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDY3MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDczOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9DT01NRU5UX1RFWFQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0NPTU1FTlQ7Ci0JeXliZWdpbihTVF9YTUxfQ09NTUVOVCk7Ci0JcmV0dXJuIFhNTF9DT01NRU5UX09QRU47Ci0gfQotICAgICAgICBjYXNlIDY3MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDcyOiAKLSAgICAgICAgY2FzZSA0OTE6IAotICAgICAgICBjYXNlIDQ5NDogCi0gICAgICAgIGNhc2UgNDk3OiAKLSAgICAgICAgY2FzZSA0OTg6IAotICAgICAgICBjYXNlIDUwMDogCi0gICAgICAgIGNhc2UgNTAyOiAKLSAgICAgICAgY2FzZSA1MDU6IAotICAgICAgICBjYXNlIDUwNzogCi0gICAgICAgIGNhc2UgNTA4OiAKLSAgICAgICAgY2FzZSA1MTA6IAotICAgICAgICBjYXNlIDUxMjogCi0gICAgICAgIGNhc2UgNTE1OiAKLSAgICAgICAgICB7IAotCS8qIEpTUCBjb21tZW50IGJlZ3VuIChhbnl3aGVyZSkKLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQKLQkgKi8KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7Ci0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7Ci0JCXl5cHVzaGJhY2soNCk7Ci0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDQpOwotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soNCk7Ci0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pICB7Ci0JCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9DT01NRU5UX09QRU4sIEpTUF9DT01NRU5UX0NMT1NFKTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKQotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCXJldHVybiBQUk9YWV9DT05URVhUOwotCX0KLQkvLyBmaW5pc2hlZCBzYW5pdHkgY2hlY2tzCi0JaWYoeXlzdGF0ZSgpPT1ZWUlOSVRJQUwpIHsKLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgcmVndWxhciBzY3JpcHRsZXQgb3V0IGluIGNvbnRlbnQKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBjb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsKLQkJcmV0dXJuIEpTUF9DT01NRU5UX09QRU47Ci0JfQotCWVsc2UgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIGNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgewotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQkJfQotCQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsKLQkJLy8gdGhlIGNvbW1lbnQgY29udGFpbmVyIGl0c2VsZiB3aWxsIGFjdCBhcyBjb21tZW50IHRleHQKLQkJZkVtYmVkZGVkSGludCA9IEpTUF9DT01NRU5UX1RFWFQ7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0NPTU1FTlRfT1BFTiwgSlNQX0NPTU1FTlRfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLyoKLQkJICogcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zOyBtYXJrIHRoaXMgb25lIGFzIGEKLQkJICogY29tbWVudCBzbyBpdCB3aWxsIGJlIG90aGVyd2lzZSBpZ25vcmVkIGJ1dCBwcmVzZXJ2ZWQgKHdoaWNoIGlzIHdoeQotCQkgKiB3ZSBjYW4ndCB1c2Ugd2hpdGUtc3BhY2UpCi0JCSAqLwotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JCX0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCXJldHVybiBQUk9YWV9DT05URVhUOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjcyOiBicmVhazsKLSAgICAgICAgY2FzZSAzODE6IAotICAgICAgICBjYXNlIDM4MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjczOiBicmVhazsKLSAgICAgICAgY2FzZSAzODA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImNvbW1lbnQgZW5kIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBYTUxfQ09NTUVOVF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjc0OiBicmVhazsKLSAgICAgICAgY2FzZSAzNzk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0NEQVRBX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2NzU6IGJyZWFrOwotICAgICAgICBjYXNlIDM3ODogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkwpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAyKTsKLQlmRUxsZXZlbCsrOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIEpTUF9WQkxfQ0xPU0UpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY3NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcblBFUmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfUEVfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSA2Nzc6IGJyZWFrOwotICAgICAgICBjYXNlIDM3NjogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTCk7Ci0JaWYoeXlsZW5ndGgoKSA+IDIpCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDIpOwotCWZFTGxldmVsKys7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBKU1BfRUxfQ0xPU0UpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY3ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzczOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkVudGl0eVJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0VOVElUWV9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDY3OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY3OiAKLSAgICAgICAgY2FzZSA0MDc6IAotICAgICAgICBjYXNlIDQxNTogCi0gICAgICAgIGNhc2UgNDIyOiAKLSAgICAgICAgY2FzZSA0Mjc6IAotICAgICAgICBjYXNlIDQzMjogCi0gICAgICAgIGNhc2UgNDM3OiAKLSAgICAgICAgY2FzZSA0NDM6IAotICAgICAgICBjYXNlIDQ0OTogCi0gICAgICAgIGNhc2UgNDUzOiAKLSAgICAgICAgY2FzZSA0NTg6IAotICAgICAgICBjYXNlIDQ2MzogCi0gICAgICAgIGNhc2UgNDY5OiAKLSAgICAgICAgICB7IAotCS8qIEpTUCBleHByZXNzaW9uIGJlZ3VuIChhbnl3aGVyZSkKLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQKLQkgKi8KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7Ci0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLQl9Ci0JLy8gZW5kIHNhbml0eSBjaGVja3MKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsKLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGFuIGV4cHJlc3Npb24gb3V0IGluIGNvbnRlbnQKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBleHByZXNzaW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJcmV0dXJuIEpTUF9FWFBSRVNTSU9OX09QRU47Ci0JfQotCWVsc2UgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIGV4cHJlc3Npb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgewotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQkJfQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRVhQUkVTU0lPTl9PUEVOLCBKU1BfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2ODA6IGJyZWFrOwotICAgICAgICBjYXNlIDM2NjogCi0gICAgICAgIGNhc2UgNDA2OiAKLSAgICAgICAgY2FzZSA0MTQ6IAotICAgICAgICBjYXNlIDQyMTogCi0gICAgICAgIGNhc2UgNDI2OiAKLSAgICAgICAgY2FzZSA0MzE6IAotICAgICAgICBjYXNlIDQzNjogCi0gICAgICAgIGNhc2UgNDQyOiAKLSAgICAgICAgY2FzZSA0NDg6IAotICAgICAgICBjYXNlIDQ1MjogCi0gICAgICAgIGNhc2UgNDU3OiAKLSAgICAgICAgY2FzZSA0NjI6IAotICAgICAgICBjYXNlIDQ2ODogCi0gICAgICAgICAgeyAKLQkvKiBKU1AgZGVjbGFyYXRpb24gYmVndW4gKGFueXdoZXJlKQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMKLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZAotCSAqLwotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsKLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hCi0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBKU1BfQ09OVEVOVDsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotCX0KLQkvLyBlbmQgc2FuaXR5IGNoZWNrcwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgewotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYSBkZWNsYXJhdGlvbiBvdXQgaW4gY29udGVudAotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIlxuSlNQIGRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJcmV0dXJuIEpTUF9ERUNMQVJBVElPTl9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBkZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCQl9Ci0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9ERUNMQVJBVElPTl9PUEVOLCBKU1BfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2ODE6IGJyZWFrOwotICAgICAgICBjYXNlIDM2NTogCi0gICAgICAgIGNhc2UgNDA1OiAKLSAgICAgICAgY2FzZSA0MTM6IAotICAgICAgICBjYXNlIDQyMDogCi0gICAgICAgIGNhc2UgNDI1OiAKLSAgICAgICAgY2FzZSA0MzA6IAotICAgICAgICBjYXNlIDQzNTogCi0gICAgICAgIGNhc2UgNDQxOiAKLSAgICAgICAgY2FzZSA0NDc6IAotICAgICAgICBjYXNlIDQ1MTogCi0gICAgICAgIGNhc2UgNDU2OiAKLSAgICAgICAgY2FzZSA0NjE6IAotICAgICAgICBjYXNlIDQ2NzogCi0gICAgICAgICAgeyAKLQkvKiBKU1AgZGlyZWN0aXZlIGJlZ3VuIChhbnl3aGVyZSkKLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQKLQkgKi8KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7Ci0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLQl9Ci0JLy8gZW5kIHNhbml0eSBjaGVja3MKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsKLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgZGVjbGFyYXRpb24gb3V0IGluIGNvbnRlbnQKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBkaXJlY3RpdmUgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FKTsKLQkJcmV0dXJuIEpTUF9ESVJFQ1RJVkVfT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJKU1AgZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgewotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQkJfQotCQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0RJUkVDVElWRV9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0RJUkVDVElWRV9DTE9TRSwgSlNQX0NMT1NFfSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCQl9Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY4MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzU1OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTF9EUVVPVEVTX0VORCk7Ci0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY4MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzUxOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTF9TUVVPVEVTX0VORCk7Ci0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY4NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzQ5OiAKLSAgICAgICAgICB7IAotCWZFTGxldmVsKys7Ci0JaWYoZkVMbGV2ZWwgPT0gMSkgewotCQlyZXR1cm4gSlNQX1ZCTF9PUEVOOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjg1OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzk6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUxfRFFVT1RFU19FTkQpOwotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY4NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM1OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMX1NRVU9URVNfRU5EKTsKLQlyZXR1cm4gSlNQX0VMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2ODc6IGJyZWFrOwotICAgICAgICBjYXNlIDMzMzogCi0gICAgICAgICAgeyAKLQkvL1N5c3RlbS5vdXQucHJpbnRsbihKU1BfRUxfQ09OVEVOVCsgIjpbIiArIHl5dGV4dCgpICsgIl0iKTsKLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY4ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzMyOiAKLSAgICAgICAgICB7IAotCWZFTGxldmVsKys7Ci0JaWYoZkVMbGV2ZWwgPT0gMSkgewotCQlyZXR1cm4gSlNQX0VMX09QRU47Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2ODk6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOTogCi0gICAgICAgICAgeyAKLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsKLQl5eWJlZ2luKFNUX0pTUF9EUVVPVEVEX1ZCTCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEV9KTsKLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBkb3VibGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIFZCTAotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JfQotCWVsc2UgewotCQl5eWJlZ2luKGVudGVyU3RhdGUpOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjkwOiBicmVhazsKLSAgICAgICAgY2FzZSAzMjg6IAotICAgICAgICAgIHsgCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7Ci0JeXliZWdpbihTVF9KU1BfRFFVT1RFRF9FTCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9FTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFfSk7Ci0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgZG91YmxlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBFTAotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JfQotCWVsc2UgewotCQl5eWJlZ2luKGVudGVyU3RhdGUpOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjkxOiBicmVhazsKLSAgICAgICAgY2FzZSAzMjY6IAotICAgICAgICAgIHsgCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7Ci0JeXliZWdpbihTVF9KU1BfU1FVT1RFRF9WQkwpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX1ZCTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFfSk7Ci0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgc2luZ2xlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBWQkwKLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCX0KLQllbHNlIHsKLQkJeXliZWdpbihlbnRlclN0YXRlKTsKLQl9Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY5MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI1OiAKLSAgICAgICAgICB7IAotCWludCBlbnRlclN0YXRlID0geXlzdGF0ZSgpOwotCXl5YmVnaW4oU1RfSlNQX1NRVU9URURfRUwpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URX0pOwotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIHNpbmdsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgRUwKLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCX0KLQllbHNlIHsKLQkJeXliZWdpbihlbnRlclN0YXRlKTsKLQl9Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY5MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI0OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JaW50IGluY29taW5nU3RhdGUgPSB5eXN0YXRlKCk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGVuZCB0YWciKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX0VORF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOwotCWlmKHl5c3RhdGUoKSAhPSBTVF9BQk9SVF9FTUJFRERFRCkKLSAgICAgICAgeXliZWdpbihpbmNvbWluZ1N0YXRlKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjk0OiBicmVhazsKLSAgICAgICAgY2FzZSAyODM6IAotICAgICAgICBjYXNlIDI5NTogCi0gICAgICAgIGNhc2UgMzAxOiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQ7Ci0gfQotICAgICAgICBjYXNlIDY5NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjcxOiAKLSAgICAgICAgICB7IAotCVN0cmluZyB0YWdOYW1lID0geXl0ZXh0KCkuc3Vic3RyaW5nKDEpOwotCS8vIHB1c2hiYWNrIHRvIGp1c3QgYWZ0ZXIgdGhlIG9wZW5pbmcgYnJhY2tldAotCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDEpOwotCS8qCi0JICogSWYgdGhpcyB0YWcgY2FuIG5vdCBiZSBuZXN0ZWQgb3Igd2UncmUgYWxyZWFkeSBzZWFyY2hpbmcgZm9yIGFuCi0JICogYXR0cmlidXRlIG5hbWUsIGVxdWFscywgb3IgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlpZiAoIWlzTmVzdGFibGUodGFnTmFtZSkgfHwgKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfRVFVQUxTIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSkpIHsKLQkJeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCQlyZXR1cm4gWE1MX1RBR19PUEVOOwotCX0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGluIHBsYWNlIG9mIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JLy8gZW1iZWRkZWQgY29udGFpbmVyIHNob3VsZCBiZSBsb29raW5nIGZvciB0aGUgbmFtZSAoYWdhaW4pIG5leHQKLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JYXNzZW1ibGVFbWJlZGRlZFRhZ1NlcXVlbmNlKFhNTF9UQUdfT1BFTiwgdGFnTmFtZSk7IC8vID8KLQlmU3RhdGVTdGFjay5wb3AoKTsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY5NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY5OiAKLSAgICAgICAgICB7IAotCVN0cmluZyB0YWdOYW1lID0geXl0ZXh0KCkuc3Vic3RyaW5nKDEpOwotCS8vIHB1c2hiYWNrIHRvIGp1c3QgYWZ0ZXIgdGhlIG9wZW5pbmcgYnJhY2tldAotCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDEpOwotCS8qCi0JICogSWYgdGhpcyB0YWcgY2FuIG5vdCBiZSBuZXN0ZWQgb3Igd2UncmUgYWxyZWFkeSBzZWFyY2hpbmcgZm9yIGFuCi0JICogYXR0cmlidXRlIG5hbWUsIGVxdWFscywgb3IgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlpZiAoIWlzTmVzdGFibGUodGFnTmFtZSkgfHwgKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfRVFVQUxTIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSkpIHsKLQkJeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCQlyZXR1cm4gWE1MX1RBR19PUEVOOwotCX0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGluIHBsYWNlIG9mIGF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCS8vIGVtYmVkZGVkIGNvbnRhaW5lciBzaG91bGQgYmUgbG9va2luZyBmb3IgdGhlIG5hbWUgKGFnYWluKSBuZXh0Ci0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShYTUxfVEFHX09QRU4sIHRhZ05hbWUpOyAvLyA/Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JeXliZWdpbihTVF9YTUxfRVFVQUxTKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjk3OiBicmVhazsKLSAgICAgICAgY2FzZSAyNjc6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbXB0eSB0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBYTUxfRU1QVFlfVEFHX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2OTg6IGJyZWFrOwotICAgICAgICBjYXNlIDEyNTogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGNvbXBsZXggZG91YmxlIHF1b3RlZCIpOy8vJE5PTi1OTFMtMSQKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFKTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjk5OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjM6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIHRhZyBlbWJlZGRlZCBuYW1lIHN0YXJ0IC0gc3RhcnQgdGFnIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNzAwOiBicmVhazsKLSAgICAgICAgY2FzZSAxMjI6IAotICAgICAgICBjYXNlIDEyNzogCi0gICAgICAgIGNhc2UgMTI4OiAKLSAgICAgICAgY2FzZSAyNzM6IAotICAgICAgICBjYXNlIDI3NzogCi0gICAgICAgIGNhc2UgMjc4OiAKLSAgICAgICAgY2FzZSAzODc6IAotICAgICAgICBjYXNlIDM5MDogCi0gICAgICAgIGNhc2UgNDgxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSA3MDE6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZXF1YWxzIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDcwMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzAzOiBicmVhazsKLSAgICAgICAgY2FzZSAxMTY6IAotICAgICAgICBjYXNlIDExNzogCi0gICAgICAgIGNhc2UgMTE4OiAKLSAgICAgICAgY2FzZSAyNjg6IAotICAgICAgICBjYXNlIDM4NjogCi0gICAgICAgIGNhc2UgNDgwOiAKLSAgICAgICAgY2FzZSA1MjA6IAotICAgICAgICBjYXNlIDUyMTogCi0gICAgICAgIGNhc2UgNTQwOiAKLSAgICAgICAgY2FzZSA1NDE6IAotICAgICAgICBjYXNlIDU1OTogCi0gICAgICAgIGNhc2UgNTYwOiAKLSAgICAgICAgY2FzZSA1NzM6IAotICAgICAgICBjYXNlIDU4MjogCi0gICAgICAgIGNhc2UgNTkwOiAKLSAgICAgICAgY2FzZSA1OTI6IAotICAgICAgICBjYXNlIDU5NDogCi0gICAgICAgIGNhc2UgNTk2OiAKLSAgICAgICAgY2FzZSA1OTk6IAotICAgICAgICBjYXNlIDYwNTogCi0gICAgICAgIGNhc2UgNjA2OiAKLSAgICAgICAgY2FzZSA2MDc6IAotICAgICAgICBjYXNlIDYwODogCi0gICAgICAgIGNhc2UgNjA5OiAKLSAgICAgICAgY2FzZSA2MTU6IAotICAgICAgICBjYXNlIDYxNjogCi0gICAgICAgIGNhc2UgNjE3OiAKLSAgICAgICAgY2FzZSA2MTg6IAotICAgICAgICBjYXNlIDYxOTogCi0gICAgICAgIGNhc2UgNjI1OiAKLSAgICAgICAgY2FzZSA2MjY6IAotICAgICAgICBjYXNlIDYyODogCi0gICAgICAgIGNhc2UgNjI5OiAKLSAgICAgICAgY2FzZSA2MzU6IAotICAgICAgICBjYXNlIDYzNjogCi0gICAgICAgIGNhc2UgNjM3OiAKLSAgICAgICAgY2FzZSA2Mzg6IAotICAgICAgICBjYXNlIDY0NDogCi0gICAgICAgIGNhc2UgNjQ1OiAKLSAgICAgICAgY2FzZSA2NDY6IAotICAgICAgICBjYXNlIDY0NzogCi0gICAgICAgIGNhc2UgNjUwOiAKLSAgICAgICAgY2FzZSA2NTE6IAotICAgICAgICBjYXNlIDY1MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDExNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JaWYoaXNCbG9ja01hcmtlcigpKSB7Ci0JCWZFbWJlZGRlZEhpbnQgPSBnZXRCbG9ja01hcmtlckNvbnRleHQoKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQkxPQ0tfVEFHX1NDQU47Ci0gICAgICAgIAl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQl9Ci0JZWxzZQotICAgICAgICAJeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzA1OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDc6IAotICAgICAgICBjYXNlIDExMTogCi0gICAgICAgIGNhc2UgMjYzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDcwNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlcXVhbHMiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSA3MDc6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcwODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgZGlyZWN0aXZlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRSk7Ci0JcmV0dXJuIEpTUF9ESVJFQ1RJVkVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzA5OiBicmVhazsKLSAgICAgICAgY2FzZSA5ODogCi0gICAgICAgIGNhc2UgOTk6IAotICAgICAgICBjYXNlIDEwMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGNvZGUgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZG9TY2FuKCIlPiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIEpTUF9DT05URU5ULCBTVF9KU1BfQ09OVEVOVCwgU1RfSlNQX0NPTlRFTlQpOwotIH0KLSAgICAgICAgY2FzZSA3MTA6IGJyZWFrOwotICAgICAgICBjYXNlIDk0OiAKLSAgICAgICAgY2FzZSA5NjogCi0gICAgICAgIGNhc2UgOTc6IAotICAgICAgICBjYXNlIDI1MzogCi0gICAgICAgIGNhc2UgMjU0OiAKLSAgICAgICAgY2FzZSAyNTc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDcxMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgNzEyOiBicmVhazsKLSAgICAgICAgY2FzZSA5MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzEzOiBicmVhazsKLSAgICAgICAgY2FzZSA5MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3MTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDg0OiAKLSAgICAgICAgY2FzZSA4NjogCi0gICAgICAgIGNhc2UgMjQ0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDcxNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgODM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSA3MTY6IGJyZWFrOwotICAgICAgICBjYXNlIDQ5OiAKLSAgICAgICAgY2FzZSAxOTk6IAotICAgICAgICBjYXNlIDIwMDogCi0gICAgICAgIGNhc2UgMjAzOiAKLSAgICAgICAgY2FzZSAyMTM6IAotICAgICAgICBjYXNlIDIxNDogCi0gICAgICAgIGNhc2UgMjE3OiAKLSAgICAgICAgY2FzZSAyMTg6IAotICAgICAgICBjYXNlIDM2MDogCi0gICAgICAgIGNhc2UgMzYzOiAKLSAgICAgICAgY2FzZSA0NDY6IAotICAgICAgICBjYXNlIDQ2MDogCi0gICAgICAgIGNhc2UgNDY2OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDcxNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDI6IAotICAgICAgICBjYXNlIDE3ODogCi0gICAgICAgIGNhc2UgMTc5OiAKLSAgICAgICAgY2FzZSAxODI6IAotICAgICAgICBjYXNlIDE5MjogCi0gICAgICAgIGNhc2UgMTkzOiAKLSAgICAgICAgY2FzZSAxOTY6IAotICAgICAgICBjYXNlIDE5NzogCi0gICAgICAgIGNhc2UgMzMwOiAKLSAgICAgICAgY2FzZSAzNDQ6IAotICAgICAgICBjYXNlIDM0NzogCi0gICAgICAgIGNhc2UgNDE4OiAKLSAgICAgICAgY2FzZSA0MTk6IAotICAgICAgICBjYXNlIDQzNDogCi0gICAgICAgIGNhc2UgNDQwOiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzE4OiBicmVhazsKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgMTU5OiAKLSAgICAgICAgY2FzZSAxNjA6IAotICAgICAgICBjYXNlIDMyMTogCi0gICAgICAgIGNhc2UgNDEyOiAKLSAgICAgICAgY2FzZSA0MTY6IAotICAgICAgICBjYXNlIDQ5NTogCi0gICAgICAgIGNhc2UgNTI4OiAKLSAgICAgICAgY2FzZSA1NDg6IAotICAgICAgICBjYXNlIDU2NTogCi0gICAgICAgIGNhc2UgNTc1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDcxOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICBjYXNlIDE1MjogCi0gICAgICAgIGNhc2UgMTUzOiAKLSAgICAgICAgY2FzZSAzMTE6IAotICAgICAgICBjYXNlIDQwNDogCi0gICAgICAgIGNhc2UgNDA4OiAKLSAgICAgICAgY2FzZSA0OTI6IAotICAgICAgICBjYXNlIDUyNzogCi0gICAgICAgIGNhc2UgNTQ3OiAKLSAgICAgICAgY2FzZSA1NjQ6IAotICAgICAgICBjYXNlIDU3NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzIwOiBicmVhazsKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgIGNhc2UgMTEyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJpbmFwcHJvcHJpYXRlIHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWlmKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCk9PVNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRHx8ZlN0YXRlU3RhY2sucGVlaygpPT1TVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCktMSk7Ci0JCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQl9Ci0JeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDcyMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICBjYXNlIDEwNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgid2hpdGUgc3BhY2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FKTsKLQlyZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDcyMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogCi0gICAgICAgIGNhc2UgODogCi0gICAgICAgIGNhc2UgOTogCi0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICBjYXNlIDM0OiAKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICBjYXNlIDcyOiAKLSAgICAgICAgY2FzZSAxNjk6IAotICAgICAgICBjYXNlIDE3NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgid2hpdGUgc3BhY2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgNzIzOiBicmVhazsKLSAgICAgICAgY2FzZSAwOiAKLSAgICAgICAgY2FzZSA1NjogCi0gICAgICAgIGNhc2UgNTk6IAotICAgICAgICBjYXNlIDYxOiAKLSAgICAgICAgY2FzZSAyMjU6IAotICAgICAgICBjYXNlIDIyNzogCi0gICAgICAgIGNhc2UgMjI4OiAKLSAgICAgICAgY2FzZSAyMzA6IAotICAgICAgICBjYXNlIDIzMjogCi0gICAgICAgIGNhc2UgMzcwOiAKLSAgICAgICAgY2FzZSAzNzE6IAotICAgICAgICBjYXNlIDM3MjogCi0gICAgICAgIGNhc2UgNDc1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcblhNTCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzI0OiBicmVhazsKLSAgICAgICAgY2FzZSA1NzogCi0gICAgICAgIGNhc2UgMTAxOiAKLSAgICAgICAgY2FzZSAxMTM6IAotICAgICAgICBjYXNlIDExOTogCi0gICAgICAgIGNhc2UgMTI5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbnN0YXJ0IHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX09QRU47Ci0gfQotICAgICAgICBjYXNlIDcyNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTg6IAotICAgICAgICBjYXNlIDYwOiAKLSAgICAgICAgY2FzZSA2NDogCi0gICAgICAgIGNhc2UgNjU6IAotICAgICAgICBjYXNlIDY2OiAKLSAgICAgICAgY2FzZSA3MDogCi0gICAgICAgIGNhc2UgNzE6IAotICAgICAgICBjYXNlIDgxOiAKLSAgICAgICAgY2FzZSA4NTogCi0gICAgICAgIGNhc2UgODc6IAotICAgICAgICBjYXNlIDg4OiAKLSAgICAgICAgY2FzZSA4OTogCi0gICAgICAgIGNhc2UgOTE6IAotICAgICAgICBjYXNlIDk1OiAKLSAgICAgICAgY2FzZSAxMDM6IAotICAgICAgICBjYXNlIDEwODogCi0gICAgICAgIGNhc2UgMTA5OiAKLSAgICAgICAgY2FzZSAxMTA6IAotICAgICAgICBjYXNlIDExNTogCi0gICAgICAgIGNhc2UgMTI0OiAKLSAgICAgICAgY2FzZSAxMzE6IAotICAgICAgICBjYXNlIDEzMjogCi0gICAgICAgIGNhc2UgMTMzOiAKLSAgICAgICAgY2FzZSAxMzQ6IAotICAgICAgICBjYXNlIDEzNjogCi0gICAgICAgIGNhc2UgMTM3OiAKLSAgICAgICAgY2FzZSAxMzk6IAotICAgICAgICBjYXNlIDE0MDogCi0gICAgICAgIGNhc2UgMTQxOiAKLSAgICAgICAgY2FzZSAxNDQ6IAotICAgICAgICBjYXNlIDE0NTogCi0gICAgICAgIGNhc2UgMTQ2OiAKLSAgICAgICAgY2FzZSAxNDk6IAotICAgICAgICBjYXNlIDE1MDogCi0gICAgICAgIGNhc2UgMTUxOiAKLSAgICAgICAgY2FzZSAxNTY6IAotICAgICAgICBjYXNlIDE1NzogCi0gICAgICAgIGNhc2UgMTU4OiAKLSAgICAgICAgY2FzZSAxNjY6IAotICAgICAgICBjYXNlIDE3MTogCi0gICAgICAgIGNhc2UgMTcyOiAKLSAgICAgICAgY2FzZSAxNzY6IAotICAgICAgICBjYXNlIDE3NzogCi0gICAgICAgIGNhc2UgMTg0OiAKLSAgICAgICAgY2FzZSAxODU6IAotICAgICAgICBjYXNlIDE4NzogCi0gICAgICAgIGNhc2UgMTg4OiAKLSAgICAgICAgY2FzZSAxOTQ6IAotICAgICAgICBjYXNlIDE5ODogCi0gICAgICAgIGNhc2UgMjA1OiAKLSAgICAgICAgY2FzZSAyMDY6IAotICAgICAgICBjYXNlIDIwODogCi0gICAgICAgIGNhc2UgMjA5OiAKLSAgICAgICAgY2FzZSAyMTU6IAotICAgICAgICBjYXNlIDIxOTogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiISEhdW5leHBlY3RlZCEhITogXCIiICsgeXl0ZXh0KCkgKyAiXCI6IiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl5eWNoYXIgKyAiLSIgKyAoeXljaGFyICsgeXlsZW5ndGgoKSkpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gVU5ERUZJTkVEOwotIH0KLSAgICAgICAgY2FzZSA3MjY6IGJyZWFrOwotICAgICAgICBjYXNlIDYyOiAKLSAgICAgICAgY2FzZSA2MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiQ0RBVEEgdGV4dCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQlTdHJpbmcgcmV0dXJuZWRDb250ZXh0ID0gZG9TY2FuKCJdXT4iLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgWE1MX0NEQVRBX1RFWFQsIFNUX0NEQVRBX0VORCwgIFNUX0NEQVRBX0VORCk7Ly8kTk9OLU5MUy0xJAotCWlmKHJldHVybmVkQ29udGV4dCA9PSBYTUxfQ0RBVEFfVEVYVCkKLQkJeXliZWdpbihTVF9DREFUQV9FTkQpOwotCXJldHVybiByZXR1cm5lZENvbnRleHQ7Ci0gfQotICAgICAgICBjYXNlIDcyNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjc6IAotICAgICAgICBjYXNlIDE4NjogCi0gICAgICAgIGNhc2UgMTg5OiAKLSAgICAgICAgY2FzZSAyMDc6IAotICAgICAgICBjYXNlIDIxMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiTElORSBGRUVEIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgNzI4OiBicmVhazsKLSAgICAgICAgY2FzZSA2ODogCi0gICAgICAgIGNhc2UgNjk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImNvbW1lbnQgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0gfQotICAgICAgICBjYXNlIDcyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzM6IAotICAgICAgICBjYXNlIDc0OiAKLSAgICAgICAgY2FzZSA3NTogCi0gICAgICAgIGNhc2UgNzY6IAotICAgICAgICBjYXNlIDIzNzogCi0gICAgICAgIGNhc2UgMjM4OiAKLSAgICAgICAgY2FzZSAyMzk6IAotICAgICAgICBjYXNlIDM4MzogCi0gICAgICAgIGNhc2UgNDc4OiAKLSAgICAgICAgY2FzZSA0Nzk6IAotICAgICAgICBjYXNlIDUxODogCi0gICAgICAgIGNhc2UgNTE5OiAKLSAgICAgICAgY2FzZSA1Mzg6IAotICAgICAgICBjYXNlIDU1ODogCi0gICAgICAgIGNhc2UgNTcxOiAKLSAgICAgICAgY2FzZSA1ODE6IAotICAgICAgICBjYXNlIDU4OTogCi0gICAgICAgIGNhc2UgNTkxOiAKLSAgICAgICAgY2FzZSA1OTM6IAotICAgICAgICBjYXNlIDU5NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOwotICAgICAgICB5eWJlZ2luKFNUX1BJX1dTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzMwOiBicmVhazsKLSAgICAgICAgY2FzZSA3NzogCi0gICAgICAgICAgeyAKLSAgICAgICAgeXliZWdpbihTVF9QSV9DT05URU5UKTsKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSA3MzE6IGJyZWFrOwotICAgICAgICBjYXNlIDc4OiAKLSAgICAgICAgY2FzZSA3OTogCi0gICAgICAgIGNhc2UgODA6IAotICAgICAgICAgIHsgCi0JCS8vIGJsb2NrIHNjYW4gdW50aWwgY2xvc2UgaXMgZm91bmQKLQlyZXR1cm4gZG9TY2FuKCI/PiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIFhNTF9QSV9DT05URU5ULCBTVF9YTUxfUElfVEFHX0NMT1NFLCBTVF9YTUxfUElfVEFHX0NMT1NFKTsKLSB9Ci0gICAgICAgIGNhc2UgNzMyOiBicmVhazsKLSAgICAgICAgY2FzZSA4MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MzM6IGJyZWFrOwotICAgICAgICBjYXNlIDEyNjogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGNvbXBsZXggc2luZ2xlIHF1b3RlZCIpOy8vJE5PTi1OTFMtMSQKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDczNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTMwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkZWNsYXJhdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3MzU6IGJyZWFrOwotICAgICAgICBjYXNlIDEzNTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSB0eXBlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQpOwotCXJldHVybiBYTUxfRE9DVFlQRV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MzY6IGJyZWFrOwotICAgICAgICBjYXNlIDEzODogCi0gICAgICAgIGNhc2UgMTQyOiAKLSAgICAgICAgY2FzZSAyODg6IAotICAgICAgICBjYXNlIDI5MjogCi0gICAgICAgIGNhc2UgMzk5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHB1YmxpYyByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0gfQotICAgICAgICBjYXNlIDczNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQzOiAKLSAgICAgICAgY2FzZSAxNDc6IAotICAgICAgICBjYXNlIDI5ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBzeXN0ZW0gcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCXl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOwotIH0KLSAgICAgICAgY2FzZSA3Mzg6IGJyZWFrOwotICAgICAgICBjYXNlIDE0ODogCi0gICAgICAgIGNhc2UgMzA0OiAKLSAgICAgICAgY2FzZSAzMDg6IAotICAgICAgICBjYXNlIDQwMjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDczOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc0MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU1OiAKLSAgICAgICAgY2FzZSAzMTQ6IAotICAgICAgICBjYXNlIDMxODogCi0gICAgICAgIGNhc2UgNDEwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UKTsKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3NDE6IGJyZWFrOwotICAgICAgICBjYXNlIDE2MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc0MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY0OiAKLSAgICAgICAgY2FzZSAxNjU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgdGV4dCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0gfQotICAgICAgICBjYXNlIDc0MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY3OiAKLSAgICAgICAgY2FzZSAxNzM6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSA3NDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDE2ODogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWludCBpbmNvbWluZ1N0YXRlID0geXlzdGF0ZSgpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBpbnNpZGUgb2YgSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX09QRU4sIG5ldyBTdHJpbmdbXXtYTUxfVEFHX0NMT1NFLFhNTF9FTVBUWV9UQUdfQ0xPU0V9KTsKLQlpZih5eXN0YXRlKCkgIT0gU1RfQUJPUlRfRU1CRURERUQpCi0gICAgICAgIHl5YmVnaW4oaW5jb21pbmdTdGF0ZSk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDc0NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTcwOiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDc0NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc1OiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDc0NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgwOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMX0RRVU9URVMpOwotCXJldHVybiBKU1BfRUxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3NDg6IGJyZWFrOwotICAgICAgICBjYXNlIDE4MTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTF9TUVVPVEVTKTsKLQlyZXR1cm4gSlNQX0VMX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzQ5OiBicmVhazsKLSAgICAgICAgY2FzZSAxODM6IAotICAgICAgICAgIHsgCi0JZkVMbGV2ZWwtLTsKLQlpZihmRUxsZXZlbCA9PSAwKSB7Ci0JCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJcmV0dXJuIEpTUF9FTF9DTE9TRTsKLQl9Ci0JcmV0dXJuIEpTUF9FTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3NTA6IGJyZWFrOwotICAgICAgICBjYXNlIDE5MDogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTCk7Ci0JcmV0dXJuIEpTUF9FTF9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDc1MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTkxOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMKTsKLQlyZXR1cm4gSlNQX0VMX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzUyOiBicmVhazsKLSAgICAgICAgY2FzZSAxOTU6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9FTF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzUzOiBicmVhazsKLSAgICAgICAgY2FzZSAyMDE6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMX0RRVU9URVMpOwotCXJldHVybiBKU1BfVkJMX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzU0OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDI6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMX1NRVU9URVMpOwotCXJldHVybiBKU1BfVkJMX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzU1OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDQ6IAotICAgICAgICAgIHsgCi0JZkVMbGV2ZWwtLTsKLQlpZihmRUxsZXZlbCA9PSAwKSB7Ci0JCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJcmV0dXJuIEpTUF9WQkxfQ0xPU0U7Ci0JfQotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDc1NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjExOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7Ci0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3NTc6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMjogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkwpOwotCXJldHVybiBKU1BfVkJMX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzU4OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTY6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9WQkxfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc1OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjIwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmVuZCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX0VORF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNzYwOiBicmVhazsKLSAgICAgICAgY2FzZSAyMjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxucHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1BJKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA3NjE6IGJyZWFrOwotICAgICAgICBjYXNlIDIyMjogCi0gICAgICAgIGNhc2UgMzEwOiAKLSAgICAgICAgY2FzZSAzMjA6IAotICAgICAgICBjYXNlIDMzMTogCi0gICAgICAgIGNhc2UgMzM2OiAKLSAgICAgICAgY2FzZSAzNDA6IAotICAgICAgICBjYXNlIDM0MzogCi0gICAgICAgIGNhc2UgMzQ2OiAKLSAgICAgICAgY2FzZSAzNDg6IAotICAgICAgICBjYXNlIDM1MjogCi0gICAgICAgIGNhc2UgMzU2OiAKLSAgICAgICAgY2FzZSAzNTk6IAotICAgICAgICBjYXNlIDM2MjogCi0gICAgICAgICAgeyAKLQkvKiBKU1Agc2NyaXB0bGV0IGJlZ3VuIChhbnl3aGVyZSkKLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQKLQkgKi8KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7Ci0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQotCQl5eXB1c2hiYWNrKDEpOwotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7Ci0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLQl9Ci0JLy8gZmluaXNoZWQgc2FuaXR5IGNoZWNrcwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgewotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYSByZWd1bGFyIHNjcmlwdGxldCBvdXQgaW4gY29udGVudAotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIlxuSlNQIHNjcmlwdGxldCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCXJldHVybiBKU1BfU0NSSVBUTEVUX09QRU47Ci0JfQotCWVsc2UgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIHNjcmlwdGxldCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCQl9Ci0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9TQ1JJUFRMRVRfT1BFTiwgSlNQX0NMT1NFKTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7Ci0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCXJldHVybiBCTE9DS19URVhUOwotCQl9Ci0JCS8vIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9ucwotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JCX0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCXJldHVybiBQUk9YWV9DT05URVhUOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNzYyOiBicmVhazsKLSAgICAgICAgY2FzZSAyMjM6IAotICAgICAgICAgIHsgCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA3NjM6IGJyZWFrOwotICAgICAgICBjYXNlIDIzNjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDI0MDogCi0gICAgICAgICAgeyAKLQkJLy8gZW5kZWQgd2l0aCBub3RoaW5nIGluc2lkZQotCQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc2NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NjY6IGJyZWFrOwotICAgICAgICBjYXNlIDI1ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBKU1BfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc2NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjYwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgZW5kIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIEpTUF9ESVJFQ1RJVkVfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc2ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTYyOiAKLSAgICAgICAgY2FzZSAxNjM6IAotICAgICAgICAgIHsgCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCSB9Ci0gICAgICAgIGNhc2UgNzY5OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB5eV9kb19lb2YoKTsKLSAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pTUFRva2VuaXplci5qZmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvSlNQVG9rZW5pemVyLmpmbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmQ0YmFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvSlNQVG9rZW5pemVyLmpmbGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjgxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICogICAgIEZyaXRzIEphbHZpbmdoIC0gY29udHJpYnV0aW9ucyBmb3IgYnVnIDE1MDc5NA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUb2tlbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlRhZ01hcmtlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uQ29udGFpbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLkludFN0YWNrOw0KLQ0KLSUlDQotDQotJXsNCi0JcHJpdmF0ZSBpbnQgZlRva2VuQ291bnQgPSAwOw0KLSANCi0JLy8gcmVxdWlyZWQgaG9sZGVycyBmb3Igd2hpdGUtc3BhY2UgY29tcGFjdGluZw0KLQlwcml2YXRlIGJvb2xlYW4gZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQlwcml2YXRlIFN0cmluZyBmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsNCi0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQgPSAxOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGggPSAwOw0KLQlwcml2YXRlIElUZXh0UmVnaW9uIGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsNCi0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBmUHJveHlVbmtub3duUmVnaW9uID0gbnVsbDsNCi0JcHJpdmF0ZSBTdHJpbmcgZl9jb250ZXh0ID0gbnVsbDsNCi0NCi0JLy8gc3RhdGUgc3RhY2sgZm9yIGhhbmRsaW5nIGVtYmVkZGVkIHJlZ2lvbnMNCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOw0KLQkvLyBhICJoaW50IiBhcyB0byB3aGF0IGFuIGVtYmVkZGVkIHJlZ2lvbiBzaG91bGQgYmUgZXZhbHVhdGVkDQotCXByaXZhdGUgU3RyaW5nIGZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotCS8vIGEgImhpbnQiIGFzIHRvIHdoYXQgc3RhdGUgdG8gZW50ZXIgb25jZSBhbiBlbWJlZGRlZCByZWdpb24gaGFzDQotCS8vICAgYmVlbiBjb21wbGV0ZWQNCi0JcHJpdmF0ZSBpbnQgZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOw0KLQkNCi0JLy8gdGhlIGNvbnRhaW5lciB1c2VkIHRvIGNyZWF0ZSBlbWJlZGRlZCByZWdpb25zDQotCXByaXZhdGUgQ29udGV4dFJlZ2lvbkNvbnRhaW5lciBmRW1iZWRkZWRDb250YWluZXIgPSBudWxsOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfQ09OVEVYVCA9ICJQUk9YWV9DT05URVhUIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1VOS05PV05fQ09OVEVYVCA9ICJQUk9YWV9VTktOT1dOX0NPTlRFWFQiOw0KLQ0KLQlwcml2YXRlIFN0cmluZyBjb250ZXh0ID0gbnVsbDsNCi0JcHJpdmF0ZSBpbnQgc3RhcnQgPSAwOw0KLQlwcml2YXRlIGludCB0ZXh0TGVuZ3RoID0gMDsNCi0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsNCi0NCi0JLy8gb2Zmc2V0IGZvciB0cmFja2luZyBwb3NpdGlvbiBzcGVjaWZpYyBibG9jayB0YWdzDQotCXByaXZhdGUgaW50IGZPZmZzZXQgPSAwOw0KLQkNCi0JLy8gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGFnIGJlaW5nIG9wZW5lZA0KLQlwcml2YXRlIFN0cmluZyBmQ3VycmVudFRhZ05hbWUgPSBudWxsOw0KLQ0KLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgaW5zaWRlIG9mIGFuIGVtYmVkZGVkIHJlZ2lvbg0KLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbFRhZ05hbWUgPSBudWxsOw0KLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbENvbnRleHQgPSBudWxsOw0KLQ0KLQkvLyB0aGUgbGlzdCBvZiB0YWcgbmFtZSBCbG9ja01hcmtlcnMNCi0JcHJpdmF0ZSBMaXN0IGZCbG9ja01hcmtlcnMgPSBuZXcgQXJyYXlMaXN0KDApOw0KLQlwcml2YXRlIExpc3QgZk5lc3RhYmxlUHJlZml4ZXMgPSBuZXcgQXJyYXlMaXN0KDEpOw0KLQkNCi0JLy8gd2hlcmUgdGhlIGxhc3QgaW50ZXJuYWwgY29udGFpbmVyIGJsb2NrIHdhcyBmb3VuZA0KLQlwcml2YXRlIGludCBmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IC0xOw0KLQ0KLQkvLyByZXF1aXJlZCB0byBub3Qgc2VlayB0ZXh0IGJsb2NrcyBvbiBhbiBlbmQgdGFnDQotCXByaXZhdGUgYm9vbGVhbiBmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsNCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IHRydWU7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZkZvcmJpZEpTUCA9IGZhbHNlOw0KLQkNCi0JcHJpdmF0ZSBpbnQgZkVMbGV2ZWwgPSAwOw0KLQ0KLQlwcml2YXRlIEpTUFBhcnNlclJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBuZXcgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSgpOw0KLQ0KLQkvLyBJcyB0aGUgZW1iZWRkZWQgdGFnIGEgSlNQIHRhZw0KLQlwcml2YXRlIGJvb2xlYW4gZkVtYmVkZGVkVGFnID0gZmFsc2U7DQotCS8vIElzIHRoZSBub24tZW1iZWRkZWQgdGFnIGEgSlNQIHRhZw0KLQlwcml2YXRlIGJvb2xlYW4gZkNvbnRhaW5lclRhZyA9IGZhbHNlOw0KLQkvLyBJcyB0aGUgdG9rZW5pemVyIGluIGEgbm9uLWVtYmVkZGVkIHRhZyAoYmV0d2VlbiA8IGFuZCA+KQ0KLQlwcml2YXRlIGJvb2xlYW4gZkluVGFnQ29udGFpbmVyID0gZmFsc2U7DQotCS8vIElzIHRoZSB0b2tlbml6ZXIgaW4gYW4gZW1iZWRkZWQgdGFnIChiZXR3ZWVuIDwgYW5kID4pDQotCXByaXZhdGUgYm9vbGVhbiBmSW5UYWdFbWJlZGRlZCA9IGZhbHNlOw0KLQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QgDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsNCi0JCWlmKGNvbnRhaW5zVGFnTmFtZShtYXJrZXIuZ2V0VGFnTmFtZSgpKSkNCi0JCQlyZXR1cm47DQotCQlmQmxvY2tNYXJrZXJzLmFkZChtYXJrZXIpOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZA0KLQkgKi8NCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkTmVzdGFibGVQcmVmaXgoVGFnTWFya2VyIG1hcmtlcikgew0KLQkJZk5lc3RhYmxlUHJlZml4ZXMuYWRkKG1hcmtlcik7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIExpc3QgZ2V0TmVzdGFibGVQcmVmaXhlcygpIHsNCi0JCXJldHVybiBmTmVzdGFibGVQcmVmaXhlczsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QNCi0JICovDQotCXByaXZhdGUgYm9vbGVhbiBpc05lc3RhYmxlKFN0cmluZyB0YWdOYW1lKSB7DQotCQkvL0l0ZXJhdG9yIGJsb2NrcyA9IGZOZXN0YWJsZVByZWZpeGVzLml0ZXJhdG9yKCk7DQotCQkvL3doaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsNCi0JCS8vCVRhZ01hcmtlciBtYXJrZXIgPSAoVGFnTWFya2VyKWJsb2Nrcy5uZXh0KCk7DQotCQkvLwlTdHJpbmcgbWFya2VyTmFtZSA9IG1hcmtlci5nZXRUYWdOYW1lKCk7DQotCQkvLwlpZih0YWdOYW1lLmxlbmd0aCgpID4gbWFya2VyTmFtZS5sZW5ndGgoKSArIDEgJiYgdGFnTmFtZS5zdGFydHNXaXRoKG1hcmtlck5hbWUpICYmIHRhZ05hbWUuY2hhckF0KG1hcmtlck5hbWUubGVuZ3RoKCkpID09ICc6Jykgew0KLQkJLy8JCXJldHVybiBtYXJrZXIuaXNHbG9iYWwoKSB8fCBnZXRPZmZzZXQoKSA+PSBtYXJrZXIuZ2V0TWFya2VyKCkuZ2V0U3RhcnQoKTsNCi0JCS8vCX0NCi0JCS8vfQ0KLQkJLy9yZXR1cm4gZmFsc2U7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QgDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVOZXN0YWJsZVByZWZpeChTdHJpbmcgbmFtZSkgew0KLQkJaWYgKGZOZXN0YWJsZVByZWZpeGVzICE9IG51bGwpIHsNCi0JCQlJdGVyYXRvciBuZXN0YWJsZXMgPSBmTmVzdGFibGVQcmVmaXhlcy5pdGVyYXRvcigpOw0KLQkJCXdoaWxlIChuZXN0YWJsZXMuaGFzTmV4dCgpKSB7DQotCQkJCWlmICgoKFRhZ01hcmtlcikgbmVzdGFibGVzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpDQotCQkJCQluZXN0YWJsZXMucmVtb3ZlKCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCANCi0JICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgew0KLQkJZkJsb2NrTWFya2Vycy5yZW1vdmUobWFya2VyKTsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QgDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnbmFtZSkgew0KLQkJaWYgKGZCbG9ja01hcmtlcnMgIT0gbnVsbCkgew0KLQkJCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsNCi0JCQl3aGlsZSAoYmxvY2tzLmhhc05leHQoKSkgew0KLQkJCQlpZiAoKChCbG9ja01hcmtlcikgYmxvY2tzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWduYW1lKSkNCi0JCQkJCWJsb2Nrcy5yZW1vdmUoKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmcgZW5kVGFnTmFtZSkgew0KLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihzdGFydFR5cGUsIG51bGwsIGVuZFRhZ05hbWUpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZ1tdIGVuZFR5cGVzKSB7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgZW5kVHlwZXMsIG51bGwpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZyBlbmRUeXBlKSB7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgbmV3IFN0cmluZ1tde2VuZFR5cGV9LCBudWxsKTsNCi0JfQ0KLQkvKioNCi0JICogIHVzZXIgbWV0aG9kIA0KLQkgKiANCi0JICogQXNzZW1ibGVzIGFuIGVtYmVkZGVkIGNvbnRhaW5lciBiZWdpbm5pbmcgd2l0aCB0aGUgZ2l2ZW4gc3RhcnRUeXBlIGFzDQotCSAqIHRoZSBmaXJzdCBDb250ZXh0UmVnaW9uIHdpdGhpbiBpdCBhbmQgb2YgdGhlIHR5cGUgZkVtYmVkZGVkSGludC4gIFRoZQ0KLQkgKiBlbmRUeXBlc1tdIGFycmF5IGNvbnRhaW5zIHRoZSBjb250ZXh0IHR5cGVzIHRoYXQgd2lsbCBjYXVzZSBhIHN1Y2Nlc3NmdWwNCi0JICogZXhpdC4gIFVzZSBvZiB0aGUgZW5kVGFnTmFtZSBwYXJhbWV0ZXIgYWx0ZXJzIHRoaXMgYmVoYXZpb3IgdG8gZm9yY2UgYW4NCi0JICogZXhpdCBvbiBhbiBYTUxfVEFHX0NMT1NFIGFmdGVyIHNlZWluZyBhbiBYTUxfVEFHX05BTUUgd2hvc2Ugc2lnbmlmaWNhbnQNCi0JICogdGV4dCBtYXRjaGVzIHRoZSBlbmRUYWdOYW1lIFN0cmluZy4gIEFsbCBjb250ZW50cyBpbiBiZXR3ZWVuIGFyZQ0KLQkgKiBpbnNpZ25pZmljYW50LCBhbmQgeWVzLCB0aGlzIG1lYW5zIGNvbW1lbnRzIGFyZSBhbGxvd2VkIGluc2lkZS4NCi0JICoqLw0KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmdbXSBlbmRUeXBlcywgU3RyaW5nIGVuZFRhZ05hbWUpIHsNCi0JCS8vIHRoZSBjb250ZXh0IG9mIHRoZSByZWdpb24gYmVpbmcgYWRkZWQgdG8gdGhlIGVtYmVkZGVkIGNvbnRhaW5lcg0KLQkJaW50ZXJuYWxDb250ZXh0ID0gc3RhcnRUeXBlOw0KLQkJLy8ga2VlcCB0cmFjayBvZiB3aGVyZSB0aGlzIGNvbnRhaW5lciBiZWdhbjsgdG8gcHJvdmlkZSByZWxhdGl2ZSBpbmRlY2VzIGZvciB0aGUgcmVnaW9ucw0KLQkJaW50IGNvbnRhaW5lclN0YXJ0ID0geXljaGFyOw0KLQkJYm9vbGVhbiBub3RGaW5pc2hlZCA9IHRydWU7DQotCQkvLyBrZWVwIHRyYWNrIG9mIHdoZXJlIHdlIHNlZW0gdG8gYmUgc28gdGhhdCB0aGUgZW5kVGFnTmFtZSBjYW4gYmUgY2hlY2tlZA0KLQkJYm9vbGVhbiBpc0luRW5kVGFnID0gZmFsc2U7DQotCQlib29sZWFuIGlzSW5GaXJzdFRhZyA9IHRydWU7DQotCQkvLyBjcmVhdGUgdGhlIGVtYmVkZGVkIGNvbnRhaW5lciBhbmQgc2V0dXAgaXRzICJ0eXBlIg0KLQkJaWYgKGZFbWJlZGRlZENvbnRhaW5lciA9PSBudWxsKSB7DQotCQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbmV3IENvbnRleHRSZWdpb25Db250YWluZXIoKTsNCi0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VHlwZShmRW1iZWRkZWRIaW50KTsNCi0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0U3RhcnQoY29udGFpbmVyU3RhcnQpOw0KLQkJCS8vIFRPRE86IHBhcmVudCByZWdpb24gbmVlZHMgdG8gYmUgc2V0IC4uLi4gYnV0IG5vdCBzdXJlIHdoZXJlIHRvIGdldCBpdCBmcm9tIA0KLQkJCS8vCQlmRW1iZWRkZWRDb250YWluZXIuc2V0UGFyZW50KHBhcmVudFJlZ2lvbik7DQotCQl9DQotCQljb250YWluZXJTdGFydCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRTdGFydCgpOw0KLQkJd2hpbGUgKG5vdEZpbmlzaGVkKSB7DQotCQkJLy8gYWRkIHRoZSByZWdpb24gdG8gdGhlIGNvbnRhaW5lcg0KLQkJCWlmIChpbnRlcm5hbENvbnRleHQgIT0gbnVsbCAmJiBpbnRlcm5hbENvbnRleHQgIT0gUFJPWFlfQ09OVEVYVCkgew0KLQkJCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGludGVybmFsQ29udGV4dCwgeXljaGFyIC0gY29udGFpbmVyU3RhcnQsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOw0KLQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7DQotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7DQotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsNCi0JCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMNCi0JCQkJLy9uZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsNCi0JCQl9DQotCQkJdHJ5IHsNCi0JCQkJLy8gbG9uZ3NjYW4gZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGF0dGVtcHQgYSBibG9ja1RhZ1NjYW4gd2l0aGluIHRoZSBlbWJlZGRlZCBjb250YWluZXINCi0JCQkJYm9vbGVhbiBsb25nc2NhbiA9IGZhbHNlOw0KLQkJCQkvLyBzYXZlIHRoZSB0b2tlbml6ZXIgc3RhdGUgaW4gY2FzZSBvZiBhIGJsb2NrIHRhZyBzY2FuDQotCQkJCWludCBwcmV2aW91c1N0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQlTdHJpbmcgcHJldmlvdXNDdXJyZW50VGFnTmFtZSA9IGZDdXJyZW50VGFnTmFtZTsNCi0JCQkJaW50IHByZXZpb3VzUG9zdFN0YXRlID0gZkVtYmVkZGVkUG9zdFN0YXRlOw0KLQkJCQlTdHJpbmcgcHJldmlvdXNFbWJlZGRlZEhpbnQgPSBmRW1iZWRkZWRIaW50Ow0KLQkJCQkvLyBkZXRlcm1pbmUgaWYgYSBibG9jayB0YWcgc2NhbiBpcyBuZWNlc3NhcnkNCi0JCQkJaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX05BTUUpIHsNCi0JCQkJCWludGVybmFsVGFnTmFtZSA9IHl5dGV4dCgpOw0KLQkJCQkJaWYoIWlzTmVzdGFibGUoaW50ZXJuYWxUYWdOYW1lKSkgew0KLQkJCQkJCWludGVybmFsVGFnTmFtZSA9IG51bGw7DQotCQkJCQkJLy8gc25hZ2dlZCBhIHRhZyBuYW1lIHdlIHNob3VsZG4ndCBoYXZlDQotCQkJCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQUJPUlRfRU1CRURERUQ7DQotCQkJCQkJbm90RmluaXNoZWQgPSBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQllbHNlIGlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19PUEVOIHx8IGludGVybmFsQ29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7DQotCQkJCQlpbnRlcm5hbFRhZ05hbWUgPSBudWxsOw0KLQkJCQl9DQotCQkJCS8vIGRvIHVwa2VlcCBmb3IgZW5kVGFnTmFtZSB1c2FnZTsgbXVzdCBiZSBoZXJlIHNpbmNlIHRoZSBuZXh0IHRva2VuIGNvdWxkIGJlIHRoZSBjbG9zZQ0KLQkJCQlpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsNCi0JCQkJCWlzSW5FbmRUYWcgPSB0cnVlOw0KLQkJCQl9IGVsc2UgaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX0NMT1NFKSB7DQotCQkJCQlpc0luRmlyc3RUYWcgPSBpc0luRW5kVGFnID0gZmFsc2U7DQotCQkJCX0gZWxzZSB7DQotCQkJCSAJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkUmVnaW9ucyA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCk7DQotCQkJCQlpZiAoZW1iZWRkZWRSZWdpb25zLnNpemUoKSA+IDIgJiYgKGVtYmVkZGVkUmVnaW9ucy5nZXQoZW1iZWRkZWRSZWdpb25zLnNpemUoKS0xKSkuZ2V0VHlwZSgpID09IFhNTF9UQUdfQ0xPU0UgJiYgKGVtYmVkZGVkUmVnaW9ucy5nZXQoZW1iZWRkZWRSZWdpb25zLnNpemUoKSAtIDMpKS5nZXRUeXBlKCkgPT0gWE1MX1RBR19PUEVOICYmIGludGVybmFsVGFnTmFtZSAhPSBudWxsKSB7DQotCQkJCQkJaWYgKGNvbnRhaW5zVGFnTmFtZShpbnRlcm5hbFRhZ05hbWUpKSB7DQotCQkJCQkJCWxvbmdzY2FuID0gdHJ1ZTsNCi0JCQkJCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWlmIChsb25nc2NhbikNCi0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IGludGVybmFsVGFnTmFtZTsNCi0JCQkJLy8gcmVhZCB0aGUgbmV4dCByZWdpb24gYW5kIGNvbnRleHQNCi0JCQkJaW50ZXJuYWxDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQlpZiAobG9uZ3NjYW4pIHsNCi0JCQkJCS8vIFJldHVybmluZyBmcm9tIGEgYmxvY2sgdGFnIHNjYW4gcmVxdWlyZXMgcmVzdG9yaW5nIHNvbWUgc3RhdGUgdmFyaWFibGVzDQotCQkJCQkvLyBhcyB3ZWxsIGFzIGhhbmRsaW5nIHRoZSBibG9jayByZWdpb24gYW5kIHNldHRpbmcgdXAgZm9yIG5vcm1hbCBzY2FubmluZw0KLQkJCQkJLy8gaW5zaWRlIHRoZSBlbWJlZGRlZCBjb250YWluZXINCi0JCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7DQotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7DQotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOw0KLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOw0KLQkJCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMNCi0JCQkJCS8vIG5ld1Rva2VuLnNldFBhcmVudChmRW1iZWRkZWRDb250YWluZXIpOw0KLQkJCQkJbG9uZ3NjYW4gPSBmYWxzZTsNCi0JCQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IHByZXZpb3VzUG9zdFN0YXRlOw0KLQkJCQkJZkVtYmVkZGVkSGludCA9IHByZXZpb3VzRW1iZWRkZWRIaW50Ow0KLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gcHJldmlvdXNDdXJyZW50VGFnTmFtZTsNCi0JCQkJCXl5YmVnaW4ocHJldmlvdXNTdGF0ZSk7DQotCQkJCQlpbnRlcm5hbENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCX0NCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJCS8vIHByaW1HZXROZXh0VG9rZW4oKSBjYWxscyBtYXkgdGhyb3cgYW4gSU9FeGNlcHRpb24NCi0JCQkJLy8gY2F0Y2ggYW5kIGRvIG5vdGhpbmcgc2luY2UgdGhlIGlzRU9GIGNoZWNrIGJlbG93DQotCQkJCS8vIHdpbGwgcHJvcGVybHkgZXhpdCBpZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydA0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBmKSB7DQotCQkJCS8vIHNvbWUgb3RoZXIgZXhjZXB0aW9uIGhhcHBlbmVkOyBuZXZlciBzaG91bGQNCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihmKTsNCi0JCQl9DQotCQkJYm9vbGVhbiBpc0VuZGluZ1R5cGUgPSB5eXN0YXRlKCkgPT0gU1RfQUJPUlRfRU1CRURERUQ7DQotCQkJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkTGlzdCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCk7DQotCQkJaWYoIWlzRW5kaW5nVHlwZSkgew0KLQkJCQkvLyBjaGVjayBmb3IgZW5kaW5nIGNvbnRleHQNCi0JCQkJaWYgKGVuZFRhZ05hbWUgPT0gbnVsbCkgew0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbmRUeXBlcy5sZW5ndGg7IGkrKykgew0KLQkJCQkJCWlzRW5kaW5nVHlwZSA9IGlzRW5kaW5nVHlwZSB8fCAoaW50ZXJuYWxDb250ZXh0ID09IGVuZFR5cGVzW2ldKSB8fCAoZW1iZWRkZWRMaXN0LnNpemUoKSA+PTIgJiYgKGVtYmVkZGVkTGlzdC5nZXQoZW1iZWRkZWRMaXN0LnNpemUoKS0xKSkuZ2V0VHlwZSgpID09IGVuZFR5cGVzW2ldKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWlzRW5kaW5nVHlwZSA9ICgoaXNJbkVuZFRhZyAmJiBpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19DTE9TRSkgfHwgKGlzSW5GaXJzdFRhZyAmJiBpbnRlcm5hbENvbnRleHQgPT0gWE1MX0VNUFRZX1RBR19DTE9TRSkpICYmIGludGVybmFsVGFnTmFtZSAhPSBudWxsICYmIGludGVybmFsVGFnTmFtZS5lcXVhbHMoZW5kVGFnTmFtZSk7DQotCQkJCX0NCi0JCQl9DQotCQkJbm90RmluaXNoZWQgPSBub3RGaW5pc2hlZCAmJiAoKCFpc0VuZGluZ1R5cGUpICYmICFpc0VPRigpICYmIChlbmRUYWdOYW1lICE9IG51bGwgfHwgaW50ZXJuYWxDb250ZXh0ICE9IFVOREVGSU5FRCkgJiYgIShpbnRlcm5hbENvbnRleHQgPT0gUFJPWFlfQ09OVEVYVCAmJiAoZW1iZWRkZWRMaXN0LmdldChlbWJlZGRlZExpc3Quc2l6ZSgpLTEpKS5nZXRUeXBlKCkgPT0gVU5ERUZJTkVEKSk7DQotCQl9DQotCQkvLyBmaW5pc2ggYWRkaW5nIHRoZSBsYXN0IGNvbnRleHQNCi0JCWlmIChpbnRlcm5hbENvbnRleHQgIT0gbnVsbCAmJiBpbnRlcm5hbENvbnRleHQgIT0gUFJPWFlfQ09OVEVYVCkgew0KLQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7DQotCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOw0KLQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzDQotCQkJLy9uZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsNCi0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0ICsgeXlsZW5ndGgoKSk7DQotCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoeXljaGFyIC0gY29udGFpbmVyU3RhcnQgKyB5eWxlbmd0aCgpKTsNCi0JCX0NCi0JCXl5YmVnaW4oZkVtYmVkZGVkUG9zdFN0YXRlKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmVCbG9ja2luZygpIHsNCi0JCXJldHVybiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmc7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGJvb2xlYW4gbmV3VmFsdWUpIHsNCi0JCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IG5ld1ZhbHVlOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKCkgew0KLQkJcmV0dXJuIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKGZDdXJyZW50VGFnTmFtZSk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoU3RyaW5nIG5hbWUpIHsNCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsNCi0JCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7DQotCQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQkJcmV0dXJuIG1hcmtlci5hbGxvd3NKU1AoKTsNCi0JCQllbHNlIGlmKCFjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkNCi0JCQkJcmV0dXJuIG1hcmtlci5hbGxvd3NKU1AoKTsNCi0JCX0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCkgew0KLQkJcmV0dXJuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KGZDdXJyZW50VGFnTmFtZSk7DQotCX0NCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoU3RyaW5nIG5hbWUpIHsNCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsNCi0JCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7DQotCQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7DQotCQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpDQotCQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOw0KLQkJfQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoKSB7DQotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoU3RyaW5nIG5hbWUpIHsNCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsNCi0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQkJcmV0dXJuIG1hcmtlci5nZXRDb250ZXh0KCk7DQotCQl9DQotCQlyZXR1cm4gQkxPQ0tfVEVYVDsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgTGlzdCBnZXRCbG9ja01hcmtlcnMoKSB7DQotCQlyZXR1cm4gZkJsb2NrTWFya2VyczsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsNCi0JCXJldHVybiBmT2Zmc2V0ICsgeXljaGFyOw0KLQl9DQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKCkgew0KLQkJcmV0dXJuIGlzQmxvY2tNYXJrZXIoZkN1cnJlbnRUYWdOYW1lKTsNCi0JfQ0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgew0KLQkJaWYgKCFmSXNCbG9ja2luZ0VuYWJsZWQpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJcmV0dXJuIGNvbnRhaW5zVGFnTmFtZSh0YWdOYW1lKTsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QNCi0JICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tUYWdTY2FuKFN0cmluZyBuZXdUYWdOYW1lKSB7DQotCQliZWdpbkJsb2NrTWFya2VyU2NhbihuZXdUYWdOYW1lLCBCTE9DS19URVhUKTsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QNCi0JICoNCi0JICogU3BlY2lhbCB0b2tlbml6ZXIgc2V0dXAuICBBbGxvd3MgdG9rZW5pemF0aW9uIHRvIGJlIGluaXRpYXRlZCBhdCB0aGUNCi0JICogc3RhcnQgb2YgYSB0ZXh0IGJsb2NrIHdpdGhpbiBhICJuZXdUYWdOYW1lIiB0YWcuDQotCSAqDQotCSAqIEV4YW1wbGU6IA0KLQkgKglUb2tlbml6ZXIgdG9rZXIgPSBuZXcgVG9rZW5pemVyKCk7DQotCSAqCXRva2VyLnNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhmYWxzZSk7DQotCSAqCXRva2VyLnJlc2V0KG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcigiYWZpdWhxd2tlamh0YXNpaGdhbGt3aHRxPC9zY3JpcHRlcj48L3Njcj48L3NjcmlwdD5hc2dkYXNnYSIpKTsNCi0JICoJdG9rZXIuYmVnaW5CbG9ja01hcmtlclNjYW4oInNjcmlwdCIsIEJMT0NLX1RFWFQpOw0KLQkgKgl0b2tlci5nZXRSZWdpb25zKCk7IA0KLQkgKg0KLQkgKiBSZXR1cm5zOg0KLQkgKglCTE9DS19URVhUOiAwLTQwDQotCSAqCVhNTF9FTkRfVEFHX09QRU46IDQxLTQyDQotCSAqCVhNTF9UQUdfTkFNRTogNDMtNDgNCi0JICoJWE1MX1RBR19DTE9TRTogNDktNDkNCi0JICoJWE1MX0NPTlRFTlQ6IDUwLTU3DQotCSAqDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrTWFya2VyU2NhbihTdHJpbmcgbmV3VGFnTmFtZSwgU3RyaW5nIGJsb2NrY29udGV4dCkgew0KLQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQlmQ3VycmVudFRhZ05hbWUgPSBuZXdUYWdOYW1lOw0KLQl9DQotDQotLyoqDQotICogTWV0aG9kIGRvU2Nhbi4NCi0gKiANCi0gKiBSZXR1cm5zIGEgY29udGV4dCByZWdpb24gZm9yIGFsbCBvZiB0aGUgdGV4dCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIHVwdG8gdGhlIGVuZCBvZiBpbnB1dCBvcg0KLSAqIHRvIHJpZ2h0ICpiZWZvcmUqIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2Ygc2VhcmNoU3RyaW5nDQotICogDQotICogQHBhcmFtIHNlYXJjaFN0cmluZyAtIHRhcmdldCBzdHJpbmcgdG8gc2VhcmNoIGZvciBleC46ICItLT4iLCAiPC90YWduYW1lIg0KLSAqIEBwYXJhbSByZXF1aXJlVGFpbFNlcGFyYXRvciAtIHdoZXRoZXIgdGhlIHRhcmdldCBtdXN0IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2Ugb3IgJz4nDQotICogQHBhcmFtIGFsbG93SlNQIC0gY2hlY2sgZm9yIGFuZCBhbGxvdyBmb3IgSlNQIG1hcmt1cCA8JSU+DQotICogQHBhcmFtIGNvbnRleHQgLSB0aGUgY29udGV4dCBvZiB0aGUgc2Nhbm5lZCByZWdpb24gaWYgbm9uLXplcm8gbGVuZ3RoDQotICogQHBhcmFtIGV4aXRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgcmVnaW9uIHdhcyBvZiBub24temVybyBsZW5ndGgNCi0gKiBAcGFyYW0gYWJvcnRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgc2VhcmNoU3RyaW5nIHdhcyBmb3VuZCBpbW1lZGlhdGVseQ0KLSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIGNvbnRleHQgZm91bmQ6IHRoZSBkZXNpcmVkIGNvbnRleHQgb24gYSBub24temVybyBsZW5ndGggbWF0Y2gsIHRoZSBhYm9ydENvbnRleHQgb24gaW1tZWRpYXRlIHN1Y2Nlc3MNCi0gKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICovDQotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9TY2FuKFN0cmluZyBzZWFyY2hTdHJpbmcsIGJvb2xlYW4gcmVxdWlyZVRhaWxTZXBhcmF0b3IsIGJvb2xlYW4gYWxsb3dKU1AsIGJvb2xlYW4gYWxsb3dDREFUQSwgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQlib29sZWFuIHN0aWxsU2VhcmNoaW5nID0gdHJ1ZTsNCi0JYm9vbGVhbiB3YXNCbG9ja2luZ0VuYWJsZWQgPSBmSXNCbG9ja2luZ0VuYWJsZWQ7DQotCXRyeSB7DQotCQkvLyBEaXNhYmxlIGZ1cnRoZXIgYmxvY2sgKHByb2JhYmx5KQ0KLQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCQlpbnQgc2VhcmNoU3RyaW5nTGVuZ3RoID0gc2VhcmNoU3RyaW5nLmxlbmd0aCgpOw0KLQkJaW50IG4gPSAwOw0KLQkJY2hhciBsYXN0Q2hlY2tDaGFyOw0KLQkJaW50IGk7DQotCQlib29sZWFuIHNhbWUgPSBmYWxzZTsNCi0JCS8vIENoZWNrIGZvciBKU1Agc3RhcnRzICgiPCUiKSBpZiB0aGUgdGFnIGlzIGdsb2JhbCBsaWtlIFNDUklQVCBvciBTVFlMRQ0KLQkJYm9vbGVhbiBjaGVja0pTUHMgPSBhbGxvd0pTUCAmJiAhZkZvcmJpZEpTUDsNCi0JCWJvb2xlYW4gY2hlY2tlZEZvckpTUHNPbmNlID0gIWNoZWNrSlNQczsNCi0JCWJvb2xlYW4gY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSA9IGZhbHNlOw0KLQkJDQotCQl3aGlsZSAoc3RpbGxTZWFyY2hpbmcpIHsNCi0JCQluID0gMDsNCi0JCQkvLyBFbnN1cmUgdGhhdCBlbm91Z2ggZGF0YSBmcm9tIHRoZSBpbnB1dCBleGlzdHMgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBzZWFyY2ggU3RyaW5nLg0KLQkJCW4gPSB5eV9hZHZhbmNlKCk7DQotCQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQ0KLQkJCQluID0geXlfYWR2YW5jZSgpOw0KLQkvLwkJYyA9IChjaGFyKSBuOw0KLQkJCS8vIElmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0IG9yIHdlJ3ZlIGV4aGF1c3RlZCB0aGUgaW5wdXQsIHN0b3AgaW1tZWRpYXRlbHkuDQotCQkJaWYgKG4gPT0gWVlFT0YgJiYgY2hlY2tlZEZvckpTUHNPbmNlKSB7DQotCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQkvKioNCi0JCQkJICogTG9vayBmb3Igc3RhcnRpbmcgSlNQcyAiPCUiDQotCQkJCSAqLw0KLQkJCQljaGVja2VkRm9ySlNQc09uY2UgPSB0cnVlOw0KLQkJCQkvLyAxKSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoIDogVGhlcmUncyBhdCBsZWFzdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBvbmNlIHRoYXQncyByZWFkLCBjaGVjayBmb3IgSlNQcw0KLQkJCQkvLyAtLS0NCi0JCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IGN1cnJlbnQtc2VhcmNoU3RyaW5nTGVuZ3RoOyBpZiBzbywgYmFja3VwIGFuZCBzd2l0Y2ggc2Nhbm5lciBzdGF0ZXMgdG8gaGFuZGxlIGl0Lg0KLQkJCQkvLyBFbnN1cmUgdGhhdCB3ZSd2ZSBub3QgZW5jb3VudGVyZWQgYSBjb21wbGV0ZSBibG9jayAoPCUlPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZA0KLQkJCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uDQotCQkJCWlmKGNoZWNrSlNQcyAmJiB5eV9jdXJyZW50UG9zID4gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgDQotCQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICsgMV0gPT0gJyUnKSB7DQotCQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7DQotCQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOw0KLQkJCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOw0KLQkJCQkJCXJldHVybiBqc3BDb250ZXh0Ow0KLQkJCQkJfQ0KLQkJCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7DQotCQkJCX0NCi0JCQkJLy8gMikgeXlfY3VycmVudFBvcyAtIGpzcHN0YXJ0ZXIubGVuZ3RoIDogVGhlcmUncyBub3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgY2hlY2sgZm9yIGEgSlNQIDIgc3BvdHMgYmFjayBpbiB3aGF0IHdlIGNvdWxkIHJlYWQNCi0JCQkJLy8gLS0tDQotCQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbjsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uDQotCQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uICpoYXZpbmcqIGNsb3NlVGFnU3RyaW5nTGVuZ3RoIGFtb3VudCBvZiBpbnB1dCB0byB3b3JrIGFzIGRlc2lnbmVkLiAgTXVzdCBiZSBzdXJlIHdlIGRvbid0DQotCQkJCS8vIHNwaWxsIG92ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdoaWxlIGNoZWNraW5nLg0KLQkJCQllbHNlIGlmKGNoZWNrSlNQcyAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfY3VycmVudFBvcyA+IDAgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmDQotCQkJCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSAxXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdID09ICclJykgew0KLQkJCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gMTsNCi0JCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOw0KLQkJCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7DQotCQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7DQotCQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7DQotCQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7DQotCQkJCQl9DQotCQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsNCi0JCQkJfQ0KLQkJCQkvLyAzKSB5eV9jdXJyZW50UG9zLi4oeXlfY3VycmVudFBvcytqc3BTdGFydGxlbmd0aC0xKSA6IENoZWNrIGF0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgb25lIHRpbWUNCi0JCQkJLy8gLS0tDQotCQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBpbW1lZGlhdGVseSBpbiB0aGUgYmxvY2sgYXJlYTsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uDQotCQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uIHl5X2N1cnJlbnRQb3MgZXF1YWxpbmcgZXhhY3RseSB0aGUgcHJldmlvdXMgZW5kICsxIHRvIHdvcmsgYXMgZGVzaWduZWQuDQotCQkJCWVsc2UgaWYoY2hlY2tKU1BzICYmICFjaGVja2VkSlNQc0F0U3RhcnRPbmNlICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9zdGFydFJlYWQgPiAwICYmDQotCQkJCQkJeXlfc3RhcnRSZWFkIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWQgKyAxXSA9PSAnJScpIHsNCi0JCQkJCWNoZWNrZWRKU1BzQXRTdGFydE9uY2UgPSB0cnVlOw0KLQkJCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9zdGFydFJlYWQ7DQotCQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOw0KLQkJCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOw0KLQkJCQkJCXJldHVybiBqc3BDb250ZXh0Ow0KLQkJCQkJfQ0KLQkJCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7DQotCQkJCX0NCi0JDQotCQ0KLQkJCQkvKioNCi0JCQkJICogTG9vayBmb3Igc3RhcnRpbmcgQ0RBVEEgIjwhW0NEQVRBWyINCi0JCQkJICovDQotCQkJCS8vIDEpIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg6IFRoZXJlJ3MgYXQgbGVhc3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgb25jZSB0aGF0J3MgcmVhZCwgY2hlY2sgZm9yIENEQVRBDQotCQkJCS8vIC0tLQ0KLQkJCQkvLyBMb29rIGZvciBhIENEQVRBIGJlZ2lubmluZyBhdCBjdXJyZW50LXNlYXJjaFN0cmluZ0xlbmd0aDsgaWYgc28sIGJhY2t1cCBhbmQgc3dpdGNoIHNjYW5uZXIgc3RhdGVzIHRvIGhhbmRsZSBpdC4NCi0JCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDxbIUNEQVRBW11dPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZA0KLQkJCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uDQotCS8qCQkJaWYoY2hlY2tDREFUQSAmJiB5eV9jdXJyZW50UG9zID4gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgKyBzZWFyY2hTdHJpbmdMZW5ndGggPCB5eV9idWZmZXIubGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgDQotCQkJCQljaGFyc01hdGNoKGNkYXRhU3RhcnRlciwgeXlfYnVmZmVyLCAwLCB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoKSkgew0KLQkJCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOw0KLQkJCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7DQotCQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7DQotCQkJCQkvLyBnbyB0byBhIHN0YXRlIHdoZXJlIENEQVRBIGNhbiBiZSBmb3VuZA0KLQkJCQkJaWYgKGZFbWJlZGRlZENvbnRhaW5lciA9PSBudWxsKSB7DQotCQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbmV3IENvbnRleHRSZWdpb25Db250YWluZXIoKTsNCi0JCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VHlwZShzZWFyY2hDb250ZXh0KTsNCi0JCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0U3RhcnQoeXljaGFyKTsNCi0JCQkJCX0NCi0JCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oc2VhcmNoQ29udGV4dCwgeXljaGFyLCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsNCi0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsNCi0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7DQotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpICsgeXlsZW5ndGgoKSk7DQotCQkJCQl5eWJlZ2luKFlZSU5JVElBTCk7DQotCQkJCQlTdHJpbmcgY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCWlmKGNvbnRleHQuZXF1YWxzKFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9PUEVOKSkgew0KLQkJCQkJCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MUmVnaW9uQ29udGV4dHMuWE1MX0NEQVRBX09QRU4sIFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9DTE9TRSk7DQotCQkJCQl9DQotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsNCi0JCQkJCXJldHVybiBzZWFyY2hDb250ZXh0Ow0KLQkJCQl9DQotCSovLyoNCi0JCQkJLy8gMikgeXlfY3VycmVudFBvcyAtIGNkYXRhU3RhcnRlci5sZW5ndGg6IFRoZXJlJ3Mgbm90IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IGNoZWNrIGZvciBhIENEQVRBIHJpZ2h0IGhlcmUgc3BvdHMgYmFjayBpbiB3aGF0IHdlIGNvdWxkIHJlYWQNCi0JCQkJLy8gLS0tDQotCQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbjsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uDQotCQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uICpoYXZpbmcqIGNsb3NlVGFnU3RyaW5nTGVuZ3RoIGFtb3VudCBvZiBpbnB1dCB0byB3b3JrIGFzIGRlc2lnbmVkLiAgTXVzdCBiZSBzdXJlIHdlIGRvbid0DQotCQkJCS8vIHNwaWxsIG92ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdoaWxlIGNoZWNraW5nLg0KLQkJCQllbHNlIGlmKGNoZWNrQ0RBVEEgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X2N1cnJlbnRQb3MgPiAwICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJg0KLQkJCQkJCXl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gMV0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSA9PSAnJScpIHsNCi0JCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIDE7DQotCQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOw0KLQkJCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOw0KLQkJCQkJCXJldHVybiBqc3BDb250ZXh0Ow0KLQkJCQkJfQ0KLQkJCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7DQotCQkJCX0NCi0JCQkJLy8gMykgeXlfY3VycmVudFBvcyA6IENoZWNrIGF0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgb25lIHRpbWUNCi0JCQkJLy8gLS0tDQotCQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBpbW1lZGlhdGVseSBpbiB0aGUgYmxvY2sgYXJlYTsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uDQotCQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uIHl5X2N1cnJlbnRQb3MgZXF1YWxpbmcgZXhhY3RseSB0aGUgcHJldmlvdXMgZW5kICsxIHRvIHdvcmsgYXMgZGVzaWduZWQuDQotCQkJCWVsc2UgaWYoY2hlY2tDREFUQSAmJiAhY2hlY2tlZEZvckNEQVRBT25jZSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfc3RhcnRSZWFkID4gMCAmJg0KLQkJCQkJCXl5X3N0YXJ0UmVhZCA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWRdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkICsgMV0gPT0gJyUnKSB7DQotCQkJCQljaGVja2VkRm9yQ0RBVEFPbmNlID0gdHJ1ZTsNCi0JCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfc3RhcnRSZWFkOw0KLQkJCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7DQotCQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7DQotCQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsNCi0JCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsNCi0JCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsNCi0JCQkJCQlyZXR1cm4ganNwQ29udGV4dDsNCi0JCQkJCX0NCi0JCQkJCXJldHVybiBzZWFyY2hDb250ZXh0Ow0KLQkJCQl9DQotCSovDQotCQkJCS8vIENoZWNrIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSB0YXJnZXQgdmVyc3VzIHRoZSBsYXN0IHRhcmdldExlbmd0aCBjaGFyYWN0ZXJzIHJlYWQgZnJvbSB0aGUgYnVmZmVyDQotCQkJCS8vIGFuZCBzZWUgaWYgaXQgbWF0Y2hlcw0KLQkJCQlpZiAobiA9PSBZWUVPRikgew0KLQkJCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCXNhbWUgPSB0cnVlOw0KLQkJCQkJLy8gc2FmZXR5IGNoZWNrIGZvciBhcnJheSBhY2Nlc3Nlcw0KLQkJCQkJaWYoeXlfY3VycmVudFBvcyA+PSBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyA8PSB5eV9idWZmZXIubGVuZ3RoKSB7DQotCQkJCQkJZm9yKGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHNhbWU7IGkrKykgew0KLQkJCQkJCQlpZihmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpDQotCQkJCQkJCQlzYW1lID0geXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSA9PSBzZWFyY2hTdHJpbmcuY2hhckF0KGkpOw0KLQkJCQkJCQllbHNlDQotCQkJCQkJCQlzYW1lID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0pID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShzZWFyY2hTdHJpbmcuY2hhckF0KGkpKTsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCQkvLyBzYWZldHkgY2hlY2sgZmFpbGVkOyBubyBtYXRjaCBpcyBwb3NzaWJsZSByaWdodCBub3cNCi0JCQkJCWVsc2Ugew0KLQkJCQkJCXNhbWUgPSBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlpZiAoc2FtZSAmJiByZXF1aXJlVGFpbFNlcGFyYXRvciAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCkgew0KLQkJCQkJLy8gQWRkaXRpb25hbCBjaGVjayBmb3IgY2xvc2UgdGFncyB0byBlbnN1cmUgdGhhdCB0YXJnZXRTdHJpbmc9Ijwvc2NyaXB0IiBkb2Vzbid0IG1hdGNoDQotCQkJCQkvLyAiPC9zY3JpcHRTIg0KLQkJCQkJbGFzdENoZWNrQ2hhciA9IHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXTsNCi0JCQkJCS8vIFN1Y2NlZWQgb24gIjwvc2NyaXB0PiIgYW5kICI8L3NjcmlwdCAiDQotCQkJCQlpZihsYXN0Q2hlY2tDaGFyID09ICc+JyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGxhc3RDaGVja0NoYXIpKQ0KLQkJCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlzdGlsbFNlYXJjaGluZyA9ICFzYW1lIHx8ICh5eV9jdXJyZW50UG9zIDwgeXlfc3RhcnRSZWFkICsgc2VhcmNoU3RyaW5nTGVuZ3RoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWlmIChuICE9IFlZRU9GIHx8IHNhbWUpIHsNCi0JCQkvLyBXZSd2ZSBzdG9wcGVkIHNob3J0IG9mIHRoZSBlbmQgb3IgZGVmaW5pdGVseSBmb3VuZCBhIG1hdGNoDQotCQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsNCi0JCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkvLyBJZiB0aGUgc2VhcmNoU3RyaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlDQotCQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkNCi0JCQlpZiAoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQl5eWJlZ2luKGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOw0KLQkJCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCX0NCi0JCX0NCi0JCWVsc2Ugew0KLQkJCS8vIFdlIHJhbiB0aHJvdWdoIHRoZSByZXN0IG9mIHRoZSBpbnB1dA0KLQkJCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7DQotCQkJeXlfY3VycmVudFBvcysrOw0KLQkJfQ0KLQkJeXliZWdpbihleGl0U3RhdGUpOw0KLQkJLy8gSWYgdGhlIGVuZGluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQ0KLQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkNCi0JCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpDQotCQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCXJldHVybiBzZWFyY2hDb250ZXh0Ow0KLQl9DQotCWZpbmFsbHkgew0KLQkJZklzQmxvY2tpbmdFbmFibGVkID0gd2FzQmxvY2tpbmdFbmFibGVkOw0KLQl9DQotfQ0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kIA0KLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lDQotICovDQotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1RhZ1NjYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpOw0KLQlyZXR1cm4gZG9TY2FuKCI8LyIgKyBmQ3VycmVudFRhZ05hbWUsIHRydWUsIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKCksIHRydWUsIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpLCBZWUlOSVRJQUwsIFlZSU5JVElBTCk7DQotfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QNCi0JICoNCi0JICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpDQotCSAqIG1ldGhvZCBpbnRvIGEgZnVsbCBJVGV4dFJlZ2lvbiBieSBwdWxsaW5nIGluIHZhbHVlcyBmb3IgdGhlDQotCSAqIGN1cnJlbnQgb2Zmc2V0IHdpdGhpbiB0aGUgc2Nhbm5pbmcgdGV4dC4NCi0JICoNCi0JICogUmV0dXJucyBudWxsIHdoZW4gRU9GIGlzIGVuY291bnRlcmVkIGFuZCBhdHRhY2hlcyBpbnRlcm1pdHRlbnRseQ0KLQkgKiBkaXNjb3ZlcmVkIHdoaXRlc3BhY2Ugb250byB0aGUgZW5kIG9mIHVzZWZ1bCByZWdpb25zLg0KLQkgKg0KLQkgKiBOb3RlIHRoYXQgdGhpcyBhbGdvcml0aG0gY2FjaGVzIHRoZSB0b2tlbiBmb2xsb3dpbmcgdGhlIG9uZSBiZWluZyByZXR1cm5lZA0KLQkgKiBzbyB0aGF0IHdoaXRlc3BhY2UgY2FuIGJlIGNvbGxhcHNlZC4NCi0JICovDQotCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsNCi0JCS8vIGxvYWQgdGhlIHN0YXJ0aW5nIG5vbi13aGl0ZXNwYWNlIHRva2VuIChhc3N1bWUgdGhhdCBpdCBpcyBzbykNCi0JCWlmIChmU2hvdWxkTG9hZEJ1ZmZlcmVkKSB7DQotCQkJaWYgKGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyICE9IG51bGwpIHsNCi0JCQkJSVRleHRSZWdpb24gY29udGFpbmVyID0gZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXI7DQotCQkJCWZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsNCi0JCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQkJCQlyZXR1cm4gY29udGFpbmVyOw0KLQkJCX0NCi0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsNCi0JCQlzdGFydCA9IGZCdWZmZXJlZFN0YXJ0Ow0KLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7DQotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQkJfSBlbHNlIHsNCi0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCWlmIChjb250ZXh0ID09IFBST1hZX0NPTlRFWFQpIHsNCi0JCQkJcmV0dXJuIGZFbWJlZGRlZENvbnRhaW5lcjsNCi0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfUk9PVF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX0RJUkVDVElWRV9OQU1FKSB7DQotCQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpDQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsNCi0JCQkJZWxzZQ0KLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsNCi0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7DQotCQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7DQotCQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsNCi0JCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCQkJfQ0KLQkJCXN0YXJ0ID0geXljaGFyOw0KLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJCWlmICh5eV9hdEVPRikgew0KLQkJCQlmVG9rZW5Db3VudCsrOw0KLQkJCQlyZXR1cm4gbnVsbDsNCi0JCQl9DQotCQl9DQotCQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbg0KLQkJZl9jb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJaWYgKGZfY29udGV4dCA9PSBQUk9YWV9DT05URVhUKSB7DQotCQkJZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBmRW1iZWRkZWRDb250YWluZXI7DQotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IHRydWU7DQotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ST09UX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfRElSRUNUSVZFX05BTUUpIHsNCi0JCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQ0KLQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsNCi0JCQllbHNlDQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7DQotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsNCi0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOw0KLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgew0KLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOw0KLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gUFJPWFlfVU5LTk9XTl9DT05URVhUKSB7DQotCQkJZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBmUHJveHlVbmtub3duUmVnaW9uOw0KLQkJfQ0KLQkJZkJ1ZmZlcmVkQ29udGV4dCA9IGZfY29udGV4dDsNCi0JCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOw0KLQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOw0KLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgPT0gV0hJVEVfU1BBQ0UpIHsNCi0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7DQotCQkJbGVuZ3RoICs9IGZCdWZmZXJlZExlbmd0aDsNCi0JCX0NCi0JCWlmIChjb250ZXh0ID09IG51bGwpIHsNCi0JCQkvLyBFT0YNCi0JCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkaXNjb3ZlcmVkICIgKyBmVG9rZW5Db3VudCArICIgdG9rZW5zLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCWZUb2tlbkNvdW50Kys7DQotCQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgZkN1cnJlbnRUYWdOYW1lKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgSlNQVG9rZW5pemVyKCl7DQotCQlzdXBlcigpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBKU1BUb2tlbml6ZXIoY2hhcltdIGNoYXJBcnJheSl7DQotCQkJdGhpcyhuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSkpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsNCi0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSwgaW50IG5ld09mZnNldCkgew0KLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCBuZXdPZmZzZXQpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsNCi0JCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgMCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbiwgaW50IG5ld09mZnNldCkgew0KLQkJcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCBuZXdPZmZzZXQpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluKSB7DQotCQlyZXNldChpbiwgMCk7DQotCX0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kICoNCi0JICoNCi0JICogUmVzZXQgaW50ZXJuYWwgY291bnRlcnMgYW5kIHZhcnMgdG8gIm5ld2x5IGNyZWF0ZWQiIHZhbHVlcywgaW4gdGhlIGhvcGVzDQotCSAqIHRoYXQgcmVzZXR0aW5nIGEgcHJlLWV4aXN0aW5nIHRva2VuaXplciBpcyBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuDQotCSAqDQotCSAqIFRoaXMgbWV0aG9kIGNvbnRhaW5zIGNvZGUgYmxvY2tzIHRoYXQgd2VyZSBlc3NlbnRpYWxseSBkdXBsaWNhdGVkIGZyb20gdGhlDQotCSAqIDxlbT5nZW5lcmF0ZWQ8L2VtPiBvdXRwdXQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGJlZm9yZSB0aGlzIG1ldGhvZCB3YXMNCi0JICogYWRkZWQuICBUaG9zZSBjb2RlIGJsb2NrcyB3ZXJlIHVuZGVyIHRoZSBhYm92ZSBjb3B5cmlnaHQuDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgew0KLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXNldHRpbmcgdG9rZW5pemVyIik7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJZk9mZnNldCA9IG5ld09mZnNldDsNCi0JDQotCQkvKiB0aGUgaW5wdXQgZGV2aWNlICovDQotCQl5eV9yZWFkZXIgPSBpbjsNCi0JDQotCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotCQl5eV9zdGF0ZSA9IDA7DQotCQ0KLQkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLw0KLQkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsNCi0JDQotCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzDQotCQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOw0KLQkNCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovDQotCQl5eV9tYXJrZWRQb3MgPSAwOw0KLQkNCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotCQl5eV9wdXNoYmFja1BvcyA9IDA7DQotCQ0KLQkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovDQotCQl5eV9jdXJyZW50UG9zID0gMDsNCi0JDQotCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8NCi0JCXl5X3N0YXJ0UmVhZCA9IDA7DQotCQ0KLQkJLyoqIA0KLQkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotCQkgKiBmcm9tIGlucHV0IA0KLQkJICovDQotCQl5eV9lbmRSZWFkID0gMDsNCi0JDQotCQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JCXl5bGluZSA9IDA7DQotCQ0KLQkJLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotCQl5eWNoYXIgPSAwOw0KLQkNCi0JCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0JCXl5X2F0RU9GID0gZmFsc2U7DQotCQ0KLQkJLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovDQotCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOw0KLQkNCi0JDQotCQkvKiB1c2VyIHZhcnM6ICovDQotCQlmVG9rZW5Db3VudCA9IDA7DQotCSANCi0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsNCi0JCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOw0KLQkJZkJ1ZmZlcmVkU3RhcnQgPSAxOw0KLQkJZkJ1ZmZlcmVkTGVuZ3RoID0gMDsNCi0JCWZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7DQotCQ0KLQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSAtMTsNCi0JDQotCQljb250ZXh0ID0gbnVsbDsNCi0JCXN0YXJ0ID0gMDsNCi0JCXRleHRMZW5ndGggPSAwOw0KLQkJbGVuZ3RoID0gMDsNCi0JDQotCQlmRW1iZWRkZWRDb250YWluZXIgPSBudWxsOw0KLQkJDQotCQlmRUxsZXZlbCA9IDA7DQotCX0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kDQotCSAqDQotCSAqLw0KLQlwdWJsaWMgQmxvY2tUb2tlbml6ZXIgbmV3SW5zdGFuY2UoKSB7DQotCQlKU1BUb2tlbml6ZXIgbmV3SW5zdGFuY2UgPSBuZXcgSlNQVG9rZW5pemVyKCk7DQotCQkvLyBnbG9iYWwgdGFnbWFya2VycyBjYW4gYmUgc2hhcmVkOyB0aGV5IGhhdmUgbm8gc3RhdGUgYW5kIA0KLQkJLy8gYXJlIG5ldmVyIGRlc3Ryb3llZCAoZS5nLiAncmVsZWFzZScpDQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGkrKykgew0KLQkJCUJsb2NrTWFya2VyIGJsb2NrTWFya2VyID0gKEJsb2NrTWFya2VyKSBmQmxvY2tNYXJrZXJzLmdldChpKTsNCi0JCQlpZihibG9ja01hcmtlci5pc0dsb2JhbCgpKQ0KLQkJCQluZXdJbnN0YW5jZS5hZGRCbG9ja01hcmtlcihibG9ja01hcmtlcik7DQotCQl9DQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZk5lc3RhYmxlUHJlZml4ZXMuc2l6ZSgpOyBpKyspIHsNCi0JCQlUYWdNYXJrZXIgbWFya2VyID0gKFRhZ01hcmtlcikgZk5lc3RhYmxlUHJlZml4ZXMuZ2V0KGkpOw0KLQkJCWlmKG1hcmtlci5pc0dsb2JhbCgpKQ0KLQkJCQluZXdJbnN0YW5jZS5hZGROZXN0YWJsZVByZWZpeChtYXJrZXIpOw0KLQkJfQ0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHNjYW5YTUxDb21tZW50VGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQkvLyBTY2FuIGZvciAnLS0+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMNCi0JCS8vICAgWE1MX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoDQotCQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX1hNTF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0DQotCQkvLyAgY29udGV4dCBhcyB1c3VhbC4NCi0JCXJldHVybiBkb1NjYW4oIi0tPiIsIGZhbHNlLCB0cnVlLCB0cnVlLCBYTUxfQ09NTUVOVF9URVhULCBTVF9YTUxfQ09NTUVOVF9FTkQsIFNUX1hNTF9DT01NRU5UX0VORCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NhbkpTUENvbW1lbnRUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCS8vIFNjYW4gZm9yICctLSU+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMNCi0JCS8vICAgSlNQX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoDQotCQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX0pTUF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0DQotCQkvLyAgY29udGV4dCBhcyB1c3VhbC4NCi0JCXJldHVybiBkb1NjYW4oIi0tJT4iLCBmYWxzZSwgZmFsc2UsIHRydWUsIEpTUF9DT01NRU5UX1RFWFQsIFNUX0pTUF9DT01NRU5UX0VORCwgU1RfSlNQX0NPTU1FTlRfRU5EKTsNCi0JfQ0KLQkNCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHJpdmF0ZSBib29sZWFuIGlzSnNwVGFnKCkgew0KLQkJcmV0dXJuIChmQ29udGFpbmVyVGFnICYmIGZFbWJlZGRlZENvbnRhaW5lciAhPSBudWxsKSB8fCAoZkNvbnRhaW5lclRhZyAmJiBmSW5UYWdDb250YWluZXIpIHx8IChmRW1iZWRkZWRUYWcgJiYgZkluVGFnRW1iZWRkZWQpOw0KLQl9DQotJX0NCi0NCi0lZW9mew0KLS8vIGRvIG5vdGhpbmcsIHRoaXMgaXMgdGhlIGRvd25zdHJlYW0gcGFyc2VyJ3Mgam9iDQotJWVvZn0NCi0NCi0lcHVibGljDQotJWNsYXNzIEpTUFRva2VuaXplcg0KLSVpbXBsZW1lbnRzIEJsb2NrVG9rZW5pemVyLCBET01KU1BSZWdpb25Db250ZXh0cw0KLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuDQotJXR5cGUgU3RyaW5nDQotJWNoYXINCi0lbGluZQ0KLSV1bmljb2RlDQotJXBhY2sNCi0NCi0lc3RhdGUgU1RfQ0RBVEFfVEVYVA0KLSVzdGF0ZSBTVF9DREFUQV9FTkQNCi0lc3RhdGUgU1RfWE1MX0NPTU1FTlQNCi0lc3RhdGUgU1RfWE1MX0NPTU1FTlRfRU5EDQotJXN0YXRlIFNUX1BJDQotJXN0YXRlIFNUX1BJX1dTDQotJXN0YXRlIFNUX1BJX0NPTlRFTlQNCi0lc3RhdGUgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX1hNTF9QSV9FUVVBTFMNCi0lc3RhdGUgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRQ0KLSVzdGF0ZSBTVF9YTUxfUElfVEFHX0NMT1NFDQotJXN0YXRlIFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX0RIVE1MX0VRVUFMUw0KLSVzdGF0ZSBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUNCi0lc3RhdGUgU1RfREhUTUxfVEFHX0NMT1NFDQotDQotLy8gc2NyaXB0bGV0IHN0YXRlKHMpDQotJXN0YXRlIFNUX0pTUF9DT05URU5UDQotJXN0YXRlIFNUX0pTUF9ESVJFQ1RJVkVfTkFNRQ0KLSVzdGF0ZSBTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRQ0KLSVzdGF0ZSBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTDQotJXN0YXRlIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFDQotDQotLy8gbm9ybWFsIHRhZyBzdGF0ZXMNCi0lc3RhdGUgU1RfWE1MX1RBR19OQU1FDQotJXN0YXRlIFNUX1hNTF9BVFRSSUJVVEVfTkFNRQ0KLSVzdGF0ZSBTVF9YTUxfRVFVQUxTDQotJXN0YXRlIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUNCi0NCi0vLyBkZWNsYXJhdGlvbiAoRFREKSBzdGF0ZXMNCi0lc3RhdGUgU1RfWE1MX0RFQ0xBUkFUSU9ODQotJXN0YXRlIFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRQ0KLQ0KLSVzdGF0ZSBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRA0KLSVzdGF0ZSBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMNCi0lc3RhdGUgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNDQotDQotJXN0YXRlIFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9ODQotJXN0YXRlIFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQNCi0NCi0lc3RhdGUgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVA0KLQ0KLQ0KLSVzdGF0ZSBTVF9CTE9DS19UQUdfU0NBTg0KLSVzdGF0ZSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTg0KLQ0KLSVzdGF0ZSBTVF9KU1BfQ09NTUVOVA0KLSVzdGF0ZSBTVF9KU1BfQ09NTUVOVF9FTkQNCi0NCi0lc3RhdGUgU1RfSlNQX0FUVFJJQlVURV9WQUxVRQ0KLSVzdGF0ZSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQNCi0lc3RhdGUgU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEDQotDQotJXN0YXRlIFNUX0FCT1JUX0VNQkVEREVEDQotDQotJXN0YXRlIFNUX0pTUF9FTA0KLSVzdGF0ZSBTVF9KU1BfRUxfU1FVT1RFUw0KLSVzdGF0ZSBTVF9KU1BfRUxfRFFVT1RFUw0KLSVzdGF0ZSBTVF9KU1BfRUxfU1FVT1RFU19FTkQNCi0lc3RhdGUgU1RfSlNQX0VMX0RRVU9URVNfRU5EDQotDQotJXN0YXRlIFNUX0pTUF9EUVVPVEVEX0VMDQotJXN0YXRlIFNUX0pTUF9TUVVPVEVEX0VMDQotDQotJXN0YXRlIFNUX0pTUF9WQkwNCi0lc3RhdGUgU1RfSlNQX1ZCTF9TUVVPVEVTDQotJXN0YXRlIFNUX0pTUF9WQkxfRFFVT1RFUw0KLSVzdGF0ZSBTVF9KU1BfVkJMX1NRVU9URVNfRU5EDQotJXN0YXRlIFNUX0pTUF9WQkxfRFFVT1RFU19FTkQNCi0NCi0lc3RhdGUgU1RfSlNQX0RRVU9URURfVkJMDQotJXN0YXRlIFNUX0pTUF9TUVVPVEVEX1ZCTA0KLQ0KLS8vIExldHRlciA9IChbQS1aYS16XSkNCi0vLyBEaWdpdCA9IChbMC05XSkNCi0NCi0vKioNCi0gKiBzbWFsbGVyIHRva2Vucw0KLSAqLw0KLWdlbmVyaWNUYWdPcGVuICAgICAgID0gPA0KLWdlbmVyaWNUYWdDbG9zZSAgICAgID0gPg0KLWdlbmVyaWNFbmRUYWdPcGVuICAgID0gPFwvDQotZ2VuZXJpY0VtcHR5VGFnQ2xvc2UgPSBcLz4NCi0NCi1QSXN0YXJ0ID0gPFw/DQotUEllbmQgICA9IFw/Pg0KLQ0KLQ0KLS8vIFsxXSBkb2N1bWVudCA6Oj0gcHJvbG9nIGVsZW1lbnQgTWlzYyoNCi1kb2N1bWVudCA9ICh7cHJvbG9nfSB7ZWxlbWVudH0ge01pc2N9KikNCi0NCi0vLyBbMl0gQ2hhciA6Oj0gI3g5IHwgI3hBIHwgI3hEIHwgWyN4MjAtI3hEN0ZGXSB8IFsjeEUwMDAtI3hGRkZEXSB8IFsjeDEwMDAwLSN4MTBGRkZGXQ0KLSAvL0NoYXIgPSAoLikNCi1DaGFyID0gW1x4MDlceDBBXHgwRFx4MjAtXHVEN0ZGXHVFMDAwLVx1RkZGRF0gDQotDQotLy8gWzNdIFMgOjo9ICgweDIwIHwgMHg5IHwgMHhEIHwgMHhBKSsNCi1TID0gW1x4MjBceDA5XHgwRFx4MEFdKw0KLQ0KLS8vIFs0XSBOYW1lQ2hhciA6Oj0gTGV0dGVyIHwgRGlnaXQgfCAnLicgfCAnLScgfCAnXycgfCAnOicgfCBDb21iaW5pbmdDaGFyIHwgRXh0ZW5kZXINCi1OYW1lQ2hhciA9ICh7TGV0dGVyfSB8IHtEaWdpdH0gfCBcLiB8IFwtIHwgXyB8IDogfCB7Q29tYmluaW5nQ2hhcn0gfCB7RXh0ZW5kZXJ9KQ0KLQ0KLS8vIFs1XSBOYW1lIDo6PSAoTGV0dGVyIHwgJ18nIHwgJzonKSBOYW1lQ2hhcioNCi0vL05hbWUgPSAoe05hbWVDaGFyfXtOYW1lQ2hhcn0qKQ0KLU5hbWUgPSAoe0xldHRlcn0gfCBfIHwgOil7TmFtZUNoYXJ9Kg0KLQ0KLS8vIFs2XSBOYW1lcyA6Oj0ge05hbWV9ICh7U30ge05hbWV9KSoNCi1OYW1lcyA9ICh7TmFtZX0gKHtTfSB7TmFtZX0pKikNCi0NCi0vLyBbN10gTm10b2tlbiA6Oj0gKE5hbWVDaGFyKSsNCi1ObXRva2VuID0gKHtOYW1lQ2hhcn0rKQ0KLQ0KLS8vIFs4XSBObXRva2VucyA6Oj0gTm10b2tlbiAoUyBObXRva2VuKSoNCi1ObXRva2VucyA9ICh7Tm10b2tlbn0gKHtTfSB7Tm10b2tlbn0pKikNCi0NCi0vLyBbOV0gRW50aXR5VmFsdWUgOjo9ICciJyAoW14lJiJdIHwgUEVSZWZlcmVuY2UgfCBSZWZlcmVuY2UpKiAnIicgfCAgIiciIChbXiUmJ10gfCBQRVJlZmVyZW5jZSB8IFJlZmVyZW5jZSkqICInIg0KLUVudGl0eVZhbHVlID0gKFwiIChbXiUmXCJdIHwge1BFUmVmZXJlbmNlfSB8IHtSZWZlcmVuY2V9KSogXCIgfCAgXCcgKFteJSZcJ10gfCB7UEVSZWZlcmVuY2V9IHwge1JlZmVyZW5jZX0pKiBcJykNCi0NCi0vLyBceDI0ID0gJyQnLCBceDdiID0gJ3snLCBceDIzID0gJyMnDQotLy8gWzEwXSBBdHRWYWx1ZSA6Oj0gJyInIChbXjwmIl0gfCBSZWZlcmVuY2UpKiAnIicgfCAgIiciIChbXjwmJ10gfCBSZWZlcmVuY2UpKiAiJyINCi1BdHRWYWx1ZSA9ICggXCIoW148Ilx4MjRceDIzXSB8IFtceDI0XHgyM11bXlx4N2IiXSB8IFxcW1x4MjRceDIzXVtceDdiXSB8IHtSZWZlcmVuY2V9KSogW1x4MjRceDIzXSpcIiB8IFwnKFtePCdceDI0XHgyM10gfCBbXHgyNFx4MjNdW15ceDdiJ10gfCBcXFtceDI0XHgyM11bXHg3Yl0gfCB7UmVmZXJlbmNlfSkqW1x4MjRceDIzXSpcJyAgfCAoW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSopDQotDQotLy8gQXMgQXR0dmFsdWUsIGJ1dCBhY2NlcHRzIGVzY2FwZWQgdmVyc2lvbnMgb2YgdGhlIGxlYWQtaW4gcXVvdGUgYWxzbw0KLVF1b3RlZEF0dFZhbHVlID0gKCBcIihbXjwiXHgyNFx4MjNdIHwgW1x4MjRceDIzXVteXHg3YiJdIHwgXFxbXHgyNFx4MjNdW1x4N2JdIHwgXFxcIiB8IHtSZWZlcmVuY2V9KSpbXHgyNFx4MjNdKlwiIHwgXCcoW148J1x4MjRceDIzXSB8IFtceDI0XHgyM11bXlx4N2InXSB8IFxcW1x4MjRceDIzXVtceDdiXSB8IFxcXCcgfCB7UmVmZXJlbmNlfSkqW1x4MjRceDIzXSpcJyAgfCAoW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSopDQotDQotLy8gWzExXSBTeXN0ZW1MaXRlcmFsIDo6PSAoJyInIFteIl0qICciJykgfCAoIiciIFteJ10qICInIikgDQotU3lzdGVtTGl0ZXJhbCA9ICgoXCIgW15cIl0qIFwiKSB8IChcJyBbXlwnXSogXCcpKSANCi0NCi0vLyBbMTJdIFB1YmlkTGl0ZXJhbCA6Oj0gJyInIFB1YmlkQ2hhciogJyInIHwgIiciIChQdWJpZENoYXIgLSAiJyIpKiAiJyINCi1QdWJpZExpdGVyYWwgPSAoXCIge1B1YmlkQ2hhcn0qIFwiIHwgXCcgKHtQdWJpZENoYXJ9XCcpKiAiJyIpDQotDQotLy8gWzEzXSBQdWJpZENoYXIgOjo9ICN4MjAgfCAjeEQgfCAjeEEgfCBbYS16QS1aMC05XSB8IFstJygpKywuLzo9PzshKiNAJF8lXQ0KLVB1YmlkQ2hhciA9IChbXDA0MFwwMTVcMDEyXSB8IFthLXpBLVowLTldIHwgW1wtXCcoKVwrLC5cLzo9PzshXCojQFwkXyVdKQ0KLQ0KLS8vIFsxNF0gQ2hhckRhdGEgOjo9IFtePCZdKiAtIChbXjwmXSogJ11dPicgW148Jl0qKQ0KLS8vIGltcGxlbWVudCBsb29rYWhlYWQgYmVoYXZpb3IgZHVyaW5nIGFjdGlvbiBkZWZpbml0aW9uDQotQ2hhckRhdGEgPSAoW148JihcXVxdPildKikNCi0NCi0vLyBbMTVdIENvbW1lbnQgOjo9ICc8IS0tJyAoKENoYXIgLSAnLScpIHwgKCctJyAoQ2hhciAtICctJykpKSogJy0tPicNCi1Db21tZW50U3RhcnQgPSAoPCFcLVwtKQ0KLUNvbW1lbnRFbmQgICA9IChcLVwtPikNCi1Db21tZW50ID0gKHtDb21tZW50U3RhcnR9Lip7Q29tbWVudEVuZH0pDQotDQotLy8gWzE2XSBQSSA6Oj0gJzw/JyBQSVRhcmdldCAoUyAoQ2hhciogLSAoQ2hhciogJz8+JyBDaGFyKikpKT8gJz8+Jw0KLVBJID0gKDxcP3tQSVRhcmdldH0ge0NoYXJ9KiBcPz4pDQotDQotLy8gWzE3XSBQSVRhcmdldCA6Oj0gTmFtZSAtICgoJ1gnIHwgJ3gnKSAoJ00nIHwgJ20nKSAoJ0wnIHwgJ2wnKSkNCi1QSVRhcmdldCA9ICh7TmFtZX0oKFh8eCkoTXxtKShMfGwpKSkNCi0NCi0vLyBbMThdIENEU2VjdCA6Oj0gQ0RTdGFydCBDRGF0YSBDREVuZA0KLUNEU2VjdCA9ICh7Q0RTdGFydH17Q0RhdGF9e0NERW5kfSkNCi0NCi0vLyBbMTldIENEU3RhcnQgOjo9ICc8IVtDREFUQVsnDQotQ0RTdGFydCA9IDwhXFtDREFUQVxbDQotDQotLy8gWzIwXSBDRGF0YSA6Oj0gKENoYXIqIC0gKENoYXIqICddXT4nIENoYXIqKSkgDQotLy8gaW1wbGVtZW50IGxvb2thaGVhZCBiZWhhdmlvciBkdXJpbmcgYWN0aW9uIGRlZmluaXRpb24NCi1DRGF0YSA9IChbXihcXVxdPildKikNCi0NCi0vLyBbMjFdIENERW5kIDo6PSAnXV0+Jw0KLUNERW5kID0gKFxdXF0+KQ0KLQ0KLS8vIFsyMl0gcHJvbG9nIDo6PSBYTUxEZWNsPyBNaXNjKiAoZG9jdHlwZWRlY2wgTWlzYyopPw0KLXByb2xvZyA9ICh7WE1MRGVjbH0/IHtNaXNjfSogKHtkb2N0eXBlZGVjbH0ge01pc2N9Kik/KQ0KLQ0KLS8vIFsyM10gWE1MRGVjbCA6Oj0gJzw/eG1sJyBWZXJzaW9uSW5mbyBFbmNvZGluZ0RlY2w/IFNERGVjbD8gUz8gJz8+Jw0KLVhNTERlY2wgPSAoPFw/eG1sIHtWZXJzaW9uSW5mb30ge0VuY29kaW5nRGVjbH0/IHtTRERlY2x9PyB7U30/IFw/PikNCi0NCi0vLyBbMjRdIFZlcnNpb25JbmZvIDo6PSBTICd2ZXJzaW9uJyBFcSAoJyBWZXJzaW9uTnVtICcgfCAiIFZlcnNpb25OdW0gIikNCi1WZXJzaW9uSW5mbyA9ICh7U312ZXJzaW9ue0VxfShcJ3tWZXJzaW9uTnVtfVwnIHwgXCJ7VmVyc2lvbk51bX1cIikpDQotDQotLy8gWzI1XSBFcSA6Oj0gUz8gJz0nIFM/DQotRXEgPSAoXD0pDQotDQotLy8gWzI2XSBWZXJzaW9uTnVtIDo6PSAoW2EtekEtWjAtOV8uOl0gfCAnLScpKw0KLVZlcnNpb25OdW0gPSAoKFthLXpBLVowLTlfLjpdfFwtKSspDQotDQotLy8gWzI3XSBNaXNjIDo6PSBDb21tZW50IHwgUEkgfCAgUw0KLU1pc2MgPSAoe0NvbW1lbnR9IHwge1BJfSB8IHtTfSkNCi0NCi0vLyBbMjhdIGRvY3R5cGVkZWNsIDo6PSAnPCFET0NUWVBFJyBTIE5hbWUgKFMgRXh0ZXJuYWxJRCk/ICBTPyAoJ1snIChtYXJrdXBkZWNsIHwgUEVSZWZlcmVuY2UgfCBTKSogJ10nIFM/KT8gJz4nDQotZG9jdHlwZWRlY2wgPSAoPFwhRE9DVFlQRXtTfXtOYW1lfSAoe1N9e0V4dGVybmFsSUR9KT8ge1N9PyAoXFsgKHttYXJrdXBkZWNsfXx7UEVSZWZlcmVuY2V9fHtTfSkqIFxde1N9Pyk/PikNCi0NCi0vLyBbMjldIG1hcmt1cGRlY2wgOjo9IGVsZW1lbnRkZWNsIHwgQXR0bGlzdERlY2wgfCBFbnRpdHlEZWNsIHwgTm90YXRpb25EZWNsIHwgUEkgfCBDb21tZW50DQotbWFya3VwZGVjbCA9ICh7ZWxlbWVudGRlY2x9IHwge0F0dGxpc3REZWNsfSB8IHtFbnRpdHlEZWNsfSB8IHtOb3RhdGlvbkRlY2x9IHwge1BJfSB8IHtDb21tZW50fSkNCi0NCi0vLyBbMzBdIGV4dFN1YnNldCA6Oj0gVGV4dERlY2w/IGV4dFN1YnNldERlY2wNCi1leHRTdWJzZXQgPSAoe1RleHREZWNsfT8ge2V4dFN1YnNldERlY2x9KQ0KLQ0KLS8vIFszMV0gZXh0U3Vic2V0RGVjbCA6Oj0gKCBtYXJrdXBkZWNsIHwgY29uZGl0aW9uYWxTZWN0IHwgUEVSZWZlcmVuY2UgfCBTICkqDQotZXh0U3Vic2V0RGVjbCA9ICgoIHttYXJrdXBkZWNsfSB8IHtjb25kaXRpb25hbFNlY3R9IHwge1BFUmVmZXJlbmNlfSB8IHtTfSApKikNCi0NCi0vLyBbMzJdICBTRERlY2wgIDo6PSBTICdzdGFuZGFsb25lJyBFcSAoKCInIiAoJ3llcycgfCAnbm8nKSAiJyIpIHwgKCciJyAoJ3llcycgfCAnbm8nKSAnIicpKQ0KLVNERGVjbCAgPSAoe1N9c3RhbmRhbG9uZXtFcX17U30qKChcJyh5ZXN8bm8pXCcpfChcIih5ZXN8bm8pXCIpKSkNCi0NCi0vLyBbMzNdICBMYW5ndWFnZUlEICA6Oj0gTGFuZ2NvZGUgKCctJyBTdWJjb2RlKSoNCi1MYW5ndWFnZUlEICA9ICh7TGFuZ2NvZGV9KFwte1N1YmNvZGV9KSopDQotDQotLy8gWzM0XSAgTGFuZ2NvZGUgOjo9IElTTzYzOUNvZGUgfCAgSWFuYUNvZGUgfCAgVXNlckNvZGUNCi1MYW5nY29kZSA9ICh7SVNPNjM5Q29kZX0gfCAge0lhbmFDb2RlfSB8ICB7VXNlckNvZGV9KQ0KLQ0KLS8vIFszNV0gIElTTzYzOUNvZGUgOjo9IChbYS16XSB8IFtBLVpdKSAoW2Etel0gfCBbQS1aXSkNCi1JU082MzlDb2RlID0gKChbYS16XXxbQS1aXSkoW2Etel18W0EtWl0pKQ0KLQ0KLS8vIFszNl0gIElhbmFDb2RlIDo6PSAoJ2knIHwgJ0knKSAnLScgKFthLXpdIHwgW0EtWl0pKw0KLUlhbmFDb2RlID0gKChpfEkpXC0oW2Etel18W0EtWl0pKykNCi0NCi0vLyBbMzddICBVc2VyQ29kZSA6Oj0gKCd4JyB8ICdYJykgJy0nIChbYS16XSB8IFtBLVpdKSsNCi1Vc2VyQ29kZSA9ICgoeHxYKVwtKFthLXpdfFtBLVpdKSspDQotDQotLy8gWzM4XSAgU3ViY29kZSA6Oj0gKFthLXpdIHwgW0EtWl0pKw0KLVN1YmNvZGUgPSAoKFthLXpdfFtBLVpdKSspDQotDQotLy8gWzM5XSAgZWxlbWVudCAgOjo9IEVtcHR5RWxlbVRhZyB8IFNUYWcgY29udGVudCBFVGFnDQotZWxlbWVudCAgPSAoe0VtcHR5RWxlbVRhZ30gfCB7U1RhZ30ge2NvbnRlbnR9IHtFVGFnfSkNCi0NCi0vLyBbNDBdICBTVGFnICA6Oj0gJzwnIE5hbWUgKFMgQXR0cmlidXRlKSogUz8gJz4nDQotU1RhZyA9ICg8e05hbWV9KHtTfXtBdHRyaWJ1dGV9KSp7U30/PikNCi0NCi0vLyBbNDFdICBBdHRyaWJ1dGUgOjo9IE5hbWUgRXEgQXR0VmFsdWUNCi1BdHRyaWJ1dGUgPSAoe05hbWV9e1N9KntFcX17U30qe0F0dFZhbHVlfSkNCi0NCi0vLyBbNDJdICBFVGFnICA6Oj0gJ05hbWUgUz8gJz4nDQotRVRhZyA9ICg8XC97TmFtZX17U30/PikNCi0NCi0vLyBbNDNdICBjb250ZW50ICA6Oj0gKGVsZW1lbnQgfCBDaGFyRGF0YSB8IFJlZmVyZW5jZSB8IENEU2VjdCB8IFBJIHwgQ29tbWVudCkqDQotY29udGVudCA9ICgoe2VsZW1lbnR9IHwge0NoYXJEYXRhfSB8IHtSZWZlcmVuY2V9IHwge0NEU2VjdH0gfCB7UEl9IHwge0NvbW1lbnR9KSopDQotDQotLy8gWzQ0XSAgRW1wdHlFbGVtVGFnICA6Oj0gJzwnIE5hbWUgKFMgQXR0cmlidXRlKSogUz8gJy8+Jw0KLUVtcHR5RWxlbVRhZyA9ICg8e05hbWV9KHtTfXtBdHRyaWJ1dGV9KSp7U30/XC8+KQ0KLQ0KLS8vIFs0NV0gZWxlbWVudGRlY2wgOjo9ICc8IUVMRU1FTlQnIFMgTmFtZSBTIGNvbnRlbnRzcGVjIFM/ICc+Jw0KLWVsZW1lbnRkZWNsID0gKDxcIUVMRU1FTlR7U317TmFtZX17U317Y29udGVudHNwZWN9e1N9Pz4pDQotDQotLy8gWzQ2XSBjb250ZW50c3BlYyA6Oj0gJ0VNUFRZJyB8ICdBTlknIHwgTWl4ZWQgfCBjaGlsZHJlbg0KLWNvbnRlbnRzcGVjID0gKEVNUFRZfEFOWXx7TWl4ZWR9fHtjaGlsZHJlbn0pDQotDQotLy8gWzQ3XSBjaGlsZHJlbiA6Oj0gKGNob2ljZSB8IHNlcSkgKCc/JyB8ICcqJyB8ICcrJyk/DQotY2hpbGRyZW4gPSAoKHtjaG9pY2V9fHtzZXF9KShcP3xcKnxcKyk/KQ0KLQ0KLS8vIENBVVNFUyBMT09QIFRIUk9VR0ggREVGUyBPRiBDSE9JQ0UgQU5EIFNFUQ0KLS8vIFs0OF0gY3AgOjo9IChOYW1lIHwgY2hvaWNlIHwgc2VxKSAoJz8nIHwgJyonIHwgJysnKT8NCi1jcCA9ICgoe05hbWV9IHwge2Nob2ljZX0gfCB7c2VxfSkgKFw/fFwqfFwrKT8pDQotDQotLy8gWzQ5XSBjaG9pY2UgOjo9ICcoJyBTPyBjcCAoIFM/ICd8JyBTPyBjcCApKiBTPyAnKScNCi0vLyBjaG9pY2UgPSBcKHtTfT97Y3B9KHtTfT9cfHtTfT97Y3B9KSp7U30/XCkNCi1jaG9pY2UgPSBcKHtTfT97TmFtZX0oe1N9P1x8e1N9P3tOYW1lfSkqe1N9P1wpDQotDQotLy8gWzUwXSBzZXEgOjo9ICcoJyBTPyBjcCAoIFM/ICcsJyBTPyBjcCApKiBTPyAnKScNCi0vLyBzZXEgPSAoXCh7U30/e2NwfSh7U30/XCx7U30/e2NwfSkqe1N9P1wpKQ0KLXNlcSA9IChcKHtTfT97TmFtZX0oe1N9P1wse1N9P3tOYW1lfSkqe1N9P1wpKQ0KLQ0KLS8vIFs1MV0gTWl4ZWQgOjo9ICcoJyBTPyAnI1BDREFUQScgKFM/ICd8JyBTPyBOYW1lKSogUz8gICcpKicgfCAnKCcgUz8gJyNQQ0RBVEEnIFM/ICcpJw0KLU1peGVkID0gKHtTfT9cI1BDREFUQSh7U30/XHx7U30/e05hbWV9KSp7U30/KSpcfCh7U30/XCNQQ0RBVEF7U30/KQ0KLQ0KLS8vIFs1Ml0gQXR0bGlzdERlY2wgOjo9ICc8IUFUVExJU1QnIFMgTmFtZSBBdHREZWYqIFM/ICc+Jw0KLUF0dGxpc3REZWNsID0gKDxcIUFUVExJU1R7U317TmFtZX17QXR0RGVmfSp7U30/PikNCi0NCi0vLyBbNTNdIEF0dERlZiA6Oj0gUyBOYW1lIFMgQXR0VHlwZSBTIERlZmF1bHREZWNsDQotQXR0RGVmID0gKHtTfXtOYW1lfXtTfXtBdHRUeXBlfXtTfXtEZWZhdWx0RGVjbH0pDQotDQotLy8gWzU0XSBBdHRUeXBlIDo6PSBTdHJpbmdUeXBlIHwgVG9rZW5pemVkVHlwZSB8IEVudW1lcmF0ZWRUeXBlIA0KLUF0dFR5cGUgPSAoe1N0cmluZ1R5cGV9IHwge1Rva2VuaXplZFR5cGV9IHwge0VudW1lcmF0ZWRUeXBlfSkNCi0NCi0vLyBbNTVdIFN0cmluZ1R5cGUgOjo9ICdDREFUQScNCi1TdHJpbmdUeXBlID0gKENEQVRBKQ0KLQ0KLS8vIFs1Nl0gVG9rZW5pemVkVHlwZSA6Oj0gJ0lEJyB8ICdJRFJFRicgfCAnSURSRUZTJyB8ICdFTlRJVFknIHwgJ0VOVElUSUVTJyB8ICdOTVRPS0VOJyB8ICdOTVRPS0VOUycNCi1Ub2tlbml6ZWRUeXBlID0gKElEfElEUkVGfElEUkVGU3xFTlRJVFl8RU5USVRJRVN8Tk1UT0tFTnxOTVRPS0VOUykNCi0NCi0vLyBbNTddIEVudW1lcmF0ZWRUeXBlIDo6PSBOb3RhdGlvblR5cGUgfCBFbnVtZXJhdGlvbiANCi1FbnVtZXJhdGVkVHlwZSA9ICh7Tm90YXRpb25UeXBlfSB8IHtFbnVtZXJhdGlvbn0pDQotDQotLy8gWzU4XSBOb3RhdGlvblR5cGUgOjo9ICdOT1RBVElPTicgUyAnKCcgUz8gTmFtZSAoUz8gJ3wnIFM/IE5hbWUpKiBTPyAnKScgDQotTm90YXRpb25UeXBlID0gKE5PVEFUSU9Oe1N9XCh7U30/e05hbWV9KHtTfT9cfHtTfT97TmFtZX0pKntTfT9cKSkNCi0NCi0vLyBbNTldIEVudW1lcmF0aW9uIDo6PSAnKCcgUz8gTm10b2tlbiAoUz8gJ3wnIFM/ICBObXRva2VuKSogUz8gJyknDQotRW51bWVyYXRpb24gPSAoXCh7U30/e05tdG9rZW59KHtTfT9cfHtTfT97Tm10b2tlbn0pKntTfT9cKSkNCi0NCi0vLyBbNjBdIERlZmF1bHREZWNsIDo6PSAnI1JFUVVJUkVEJyB8ICcjSU1QTElFRCcgfCAoKCcjRklYRUQnIFMpPyBBdHRWYWx1ZSkNCi1EZWZhdWx0RGVjbCA9IChcI1JFUVVJUkVEfFwjSU1QTElFRHwoKFwjRklYRUR7U30pP3tBdHRWYWx1ZX0pKQ0KLQ0KLS8vIFs2MV0gY29uZGl0aW9uYWxTZWN0IDo6PSBpbmNsdWRlU2VjdCB8IGlnbm9yZVNlY3QgDQotY29uZGl0aW9uYWxTZWN0ID0gKHtpbmNsdWRlU2VjdH0gfCB7aWdub3JlU2VjdH0pDQotDQotLy8gWzYyXSBpbmNsdWRlU2VjdCA6Oj0gJzwhWycgUz8gJ0lOQ0xVREUnIFM/ICdbJyBleHRTdWJzZXREZWNsICddXT4nIA0KLWluY2x1ZGVTZWN0ID0gKDxcIVxbe1N9P0lOQ0xVREV7U30/XFt7ZXh0U3Vic2V0RGVjbH1cXVxdPikNCi0NCi0vLyBbNjNdIGlnbm9yZVNlY3QgOjo9ICc8IVsnIFM/ICdJR05PUkUnIFM/ICdbJyBpZ25vcmVTZWN0Q29udGVudHMqICddXT4nDQotaWdub3JlU2VjdCA9ICg8XCFcW3tTfT9JR05PUkV7U30/XFt7aWdub3JlU2VjdENvbnRlbnRzfSpcXVxdPikNCi0NCi0vLyBbNjRdIGlnbm9yZVNlY3RDb250ZW50cyA6Oj0gSWdub3JlICgnPCFbJyBpZ25vcmVTZWN0Q29udGVudHMgJ11dPicgSWdub3JlKSoNCi1pZ25vcmVTZWN0Q29udGVudHMgPSAoe0lnbm9yZX0oPFwhXFt7aWdub3JlU2VjdENvbnRlbnRzfVxdXF0+e0lnbm9yZX0pKikNCi0NCi0vLyBbNjVdIElnbm9yZSA6Oj0gQ2hhciogLSAoQ2hhciogKCc8IVsnIHwgJ11dPicpIENoYXIqKQ0KLUlnbm9yZSA9ICAoW14oXDxcIVxbfFxdXF1cPildKikNCi0NCi0vLyBbNjZdIENoYXJSZWYgOjo9ICcmIycgWzAtOV0rICc7JyB8ICcmI3gnIFswLTlhLWZBLUZdKyAnOycNCi1DaGFyUmVmID0gKCYjWzAtOV0rO3wmI3hbMC05YS1mQS1GXSs7KQ0KLQ0KLS8vIFs2N10gUmVmZXJlbmNlIDo6PSBFbnRpdHlSZWYgfCBDaGFyUmVmDQotUmVmZXJlbmNlID0gKHtFbnRpdHlSZWZ9IHwge0NoYXJSZWZ9KQ0KLQ0KLS8vIFs2OF0gRW50aXR5UmVmID0gJyYnIE5hbWUgJzsnDQotRW50aXR5UmVmID0gKCZ7TmFtZX07KQ0KLQ0KLS8vIFs2OV0gUEVSZWZlcmVuY2UgOjo9ICclJyBOYW1lICc7Jw0KLVBFUmVmZXJlbmNlID0gKCV7TmFtZX07KQ0KLQ0KLS8vIFs3MF0gRW50aXR5RGVjbCA6Oj0gR0VEZWNsIHwgUEVEZWNsDQotRW50aXR5RGVjbCA9ICh7R0VEZWNsfSB8IHtQRURlY2x9KQ0KLQ0KLS8vIFs3MV0gR0VEZWNsIDo6PSAnPCFFTlRJVFknIFMgTmFtZSBTIEVudGl0eURlZiBTPyAnPicNCi1HRURlY2wgPSAoPFwhRU5USVRZe1N9e05hbWV9e1N9e0VudGl0eURlZn17U30/PikNCi0NCi0vLyBbNzJdIFBFRGVjbCA6Oj0gJzwhRU5USVRZJyBTICclJyBTIE5hbWUgUyBQRURlZiBTPyAnPicNCi1QRURlY2wgPSAoPFwhRU5USVRZe1N9XCV7U317TmFtZX17U317UEVEZWZ9e1N9Pz4pDQotDQotLy8gWzczXSBFbnRpdHlEZWYgOjo9IEVudGl0eVZhbHVlIHwgKEV4dGVybmFsSUQgTkRhdGFEZWNsPykNCi1FbnRpdHlEZWYgPSAoe0VudGl0eVZhbHVlfSB8ICh7RXh0ZXJuYWxJRH17TkRhdGFEZWNsfT8pKQ0KLQ0KLS8vIFs3NF0gUEVEZWYgOjo9IEVudGl0eVZhbHVlIHwgRXh0ZXJuYWxJRA0KLVBFRGVmID0gKHtFbnRpdHlWYWx1ZX0gfCB7RXh0ZXJuYWxJRH0pDQotDQotLy8gWzc1XSBFeHRlcm5hbElEIDo6PSAnU1lTVEVNJyBTIFN5c3RlbUxpdGVyYWwgfCAnUFVCTElDJyBTIFB1YmlkTGl0ZXJhbCBTIFN5c3RlbUxpdGVyYWwgDQotRXh0ZXJuYWxJRCA9IChTWVNURU17U317U3lzdGVtTGl0ZXJhbH18UFVCTElDe1N9e1B1YmlkTGl0ZXJhbH17U317U3lzdGVtTGl0ZXJhbH0gKQ0KLQ0KLS8vIFs3Nl0gTkRhdGFEZWNsIDo6PSBTICdOREFUQScgUyBOYW1lDQotTkRhdGFEZWNsID0gKHtTfU5EQVRBe1N9e05hbWV9KQ0KLQ0KLS8vIFs3N10gVGV4dERlY2wgOjo9ICc8P3htbCcgVmVyc2lvbkluZm8/IEVuY29kaW5nRGVjbCBTPyAnPz4nDQotVGV4dERlY2wgPSAoPFw/eG1se1ZlcnNpb25JbmZvfT97RW5jb2RpbmdEZWNsfXtTfT9cPz4pDQotDQotLy8gWzc4XSBleHRQYXJzZWRFbnQgOjo9IFRleHREZWNsPyBjb250ZW50DQotZXh0UGFyc2VkRW50ID0gKHtUZXh0RGVjbH0/e2NvbnRlbnR9KQ0KLQ0KLS8vIFs3OV0gZXh0UEUgOjo9IFRleHREZWNsPyBleHRTdWJzZXREZWNsDQotZXh0UEUgPSAoe1RleHREZWNsfT97ZXh0U3Vic2V0RGVjbH0pDQotDQotLy8gWzgwXSBFbmNvZGluZ0RlY2wgOjo9IFMgJ2VuY29kaW5nJyBFcSAoJyInIEVuY05hbWUgJyInIHwgICInIiBFbmNOYW1lICInIiApIA0KLUVuY29kaW5nRGVjbCA9ICh7U31lbmNvZGluZ3tTfSp7RXF9e1N9KihcIntFbmNOYW1lfVwifFwne0VuY05hbWV9XCcpKQ0KLQ0KLS8vIFs4MV0gRW5jTmFtZSA6Oj0gW0EtWmEtel0gKFtBLVphLXowLTkuX10gfCAnLScpKg0KLUVuY05hbWUgPSAoW0EtWmEtel0oW0EtWmEtejAtOS5fXXxcLSkqKQ0KLQ0KLS8vIFs4Ml0gTm90YXRpb25EZWNsIDo6PSAnPCFOT1RBVElPTicgUyBOYW1lIFMgKEV4dGVybmFsSUQgfCAgUHVibGljSUQpIFM/ICc+Jw0KLU5vdGF0aW9uRGVjbCA9ICg8XCFOT1RBVElPTntTfXtOYW1lfXtTfSh7RXh0ZXJuYWxJRH18e1B1YmxpY0lEfSl7U30/PikNCi0NCi0vLyBbODNdIFB1YmxpY0lEIDo6PSAnUFVCTElDJyBTIFB1YmlkTGl0ZXJhbA0KLVB1YmxpY0lEID0gKFBVQkxJQ3tTfXtQdWJpZExpdGVyYWx9KQ0KLQ0KLS8vIFs4NF0gIExldHRlciA6Oj0gQmFzZUNoYXIgfCBJZGVvZ3JhcGhpYw0KLUxldHRlciA9ICh7QmFzZUNoYXJ9IHwge0lkZW9ncmFwaGljfSkNCi0NCi0vLyBbODVdICBCYXNlQ2hhciA6Oj0gWyN4MDA0MS0jeDAwNUFdIHwgWyN4MDA2MS0jeDAwN0FdIHwgWyN4MDBDMC0jeDAwRDZdDQotLy8gfCBbI3gwMEQ4LSN4MDBGNl0gfCBbI3gwMEY4LSN4MDBGRl0gfCBbI3gwMTAwLSN4MDEzMV0NCi0vLyB8IFsjeDAxMzQtI3gwMTNFXSB8IFsjeDAxNDEtI3gwMTQ4XSB8IFsjeDAxNEEtI3gwMTdFXQ0KLS8vIHwgWyN4MDE4MC0jeDAxQzNdIHwgWyN4MDFDRC0jeDAxRjBdIHwgWyN4MDFGNC0jeDAxRjVdDQotLy8gfCBbI3gwMUZBLSN4MDIxN10gfCBbI3gwMjUwLSN4MDJBOF0gfCBbI3gwMkJCLSN4MDJDMV0gfCAjeDAzODYNCi0vLyB8IFsjeDAzODgtI3gwMzhBXSB8ICN4MDM4QyB8IFsjeDAzOEUtI3gwM0ExXSB8IFsjeDAzQTMtI3gwM0NFXQ0KLS8vIHwgWyN4MDNEMC0jeDAzRDZdIHwgI3gwM0RBIHwgI3gwM0RDIHwgI3gwM0RFIHwgI3gwM0UwDQotLy8gfCBbI3gwM0UyLSN4MDNGM10gfCBbI3gwNDAxLSN4MDQwQ10gfCBbI3gwNDBFLSN4MDQ0Rl0NCi0vLyB8IFsjeDA0NTEtI3gwNDVDXSB8IFsjeDA0NUUtI3gwNDgxXSB8IFsjeDA0OTAtI3gwNEM0XQ0KLS8vIHwgWyN4MDRDNy0jeDA0QzhdIHwgWyN4MDRDQi0jeDA0Q0NdIHwgWyN4MDREMC0jeDA0RUJdDQotLy8gfCBbI3gwNEVFLSN4MDRGNV0gfCBbI3gwNEY4LSN4MDRGOV0gfCBbI3gwNTMxLSN4MDU1Nl0gfCAjeDA1NTkNCi0vLyB8IFsjeDA1NjEtI3gwNTg2XSB8IFsjeDA1RDAtI3gwNUVBXSB8IFsjeDA1RjAtI3gwNUYyXQ0KLS8vIHwgWyN4MDYyMS0jeDA2M0FdIHwgWyN4MDY0MS0jeDA2NEFdIHwgWyN4MDY3MS0jeDA2QjddDQotLy8gfCBbI3gwNkJBLSN4MDZCRV0gfCBbI3gwNkMwLSN4MDZDRV0gfCBbI3gwNkQwLSN4MDZEM10gfCAjeDA2RDUNCi0vLyB8IFsjeDA2RTUtI3gwNkU2XSB8IFsjeDA5MDUtI3gwOTM5XSB8ICN4MDkzRCB8IFsjeDA5NTgtI3gwOTYxXQ0KLS8vIHwgWyN4MDk4NS0jeDA5OENdIHwgWyN4MDk4Ri0jeDA5OTBdIHwgWyN4MDk5My0jeDA5QThdDQotLy8gfCBbI3gwOUFBLSN4MDlCMF0gfCAjeDA5QjIgfCBbI3gwOUI2LSN4MDlCOV0gfCBbI3gwOURDLSN4MDlERF0NCi0vLyB8IFsjeDA5REYtI3gwOUUxXSB8IFsjeDA5RjAtI3gwOUYxXSB8IFsjeDBBMDUtI3gwQTBBXQ0KLS8vIHwgWyN4MEEwRi0jeDBBMTBdIHwgWyN4MEExMy0jeDBBMjhdIHwgWyN4MEEyQS0jeDBBMzBdDQotLy8gfCBbI3gwQTMyLSN4MEEzM10gfCBbI3gwQTM1LSN4MEEzNl0gfCBbI3gwQTM4LSN4MEEzOV0NCi0vLyB8IFsjeDBBNTktI3gwQTVDXSB8ICN4MEE1RSB8IFsjeDBBNzItI3gwQTc0XSB8IFsjeDBBODUtI3gwQThCXQ0KLS8vIHwgI3gwQThEIHwgWyN4MEE4Ri0jeDBBOTFdIHwgWyN4MEE5My0jeDBBQThdIHwgWyN4MEFBQS0jeDBBQjBdDQotLy8gfCBbI3gwQUIyLSN4MEFCM10gfCBbI3gwQUI1LSN4MEFCOV0gfCAjeDBBQkQgfCAjeDBBRTANCi0vLyB8IFsjeDBCMDUtI3gwQjBDXSB8IFsjeDBCMEYtI3gwQjEwXSB8IFsjeDBCMTMtI3gwQjI4XQ0KLS8vIHwgWyN4MEIyQS0jeDBCMzBdIHwgWyN4MEIzMi0jeDBCMzNdIHwgWyN4MEIzNi0jeDBCMzldIHwgI3gwQjNEDQotLy8gfCBbI3gwQjVDLSN4MEI1RF0gfCBbI3gwQjVGLSN4MEI2MV0gfCBbI3gwQjg1LSN4MEI4QV0NCi0vLyB8IFsjeDBCOEUtI3gwQjkwXSB8IFsjeDBCOTItI3gwQjk1XSB8IFsjeDBCOTktI3gwQjlBXSB8ICN4MEI5Qw0KLS8vIHwgWyN4MEI5RS0jeDBCOUZdIHwgWyN4MEJBMy0jeDBCQTRdIHwgWyN4MEJBOC0jeDBCQUFdDQotLy8gfCBbI3gwQkFFLSN4MEJCNV0gfCBbI3gwQkI3LSN4MEJCOV0gfCBbI3gwQzA1LSN4MEMwQ10NCi0vLyB8IFsjeDBDMEUtI3gwQzEwXSB8IFsjeDBDMTItI3gwQzI4XSB8IFsjeDBDMkEtI3gwQzMzXQ0KLS8vIHwgWyN4MEMzNS0jeDBDMzldIHwgWyN4MEM2MC0jeDBDNjFdIHwgWyN4MEM4NS0jeDBDOENdDQotLy8gfCBbI3gwQzhFLSN4MEM5MF0gfCBbI3gwQzkyLSN4MENBOF0gfCBbI3gwQ0FBLSN4MENCM10NCi0vLyB8IFsjeDBDQjUtI3gwQ0I5XSB8ICN4MENERSB8IFsjeDBDRTAtI3gwQ0UxXSB8IFsjeDBEMDUtI3gwRDBDXQ0KLS8vIHwgWyN4MEQwRS0jeDBEMTBdIHwgWyN4MEQxMi0jeDBEMjhdIHwgWyN4MEQyQS0jeDBEMzldDQotLy8gfCBbI3gwRDYwLSN4MEQ2MV0gfCBbI3gwRTAxLSN4MEUyRV0gfCAjeDBFMzAgfCBbI3gwRTMyLSN4MEUzM10NCi0vLyB8IFsjeDBFNDAtI3gwRTQ1XSB8IFsjeDBFODEtI3gwRTgyXSB8ICN4MEU4NCB8IFsjeDBFODctI3gwRTg4XQ0KLS8vIHwgI3gwRThBIHwgI3gwRThEIHwgWyN4MEU5NC0jeDBFOTddIHwgWyN4MEU5OS0jeDBFOUZdDQotLy8gfCBbI3gwRUExLSN4MEVBM10gfCAjeDBFQTUgfCAjeDBFQTcgfCBbI3gwRUFBLSN4MEVBQl0NCi0vLyB8IFsjeDBFQUQtI3gwRUFFXSB8ICN4MEVCMCB8IFsjeDBFQjItI3gwRUIzXSB8ICN4MEVCRA0KLS8vIHwgWyN4MEVDMC0jeDBFQzRdIHwgWyN4MEY0MC0jeDBGNDddIHwgWyN4MEY0OS0jeDBGNjldDQotLy8gfCBbI3gxMEEwLSN4MTBDNV0gfCBbI3gxMEQwLSN4MTBGNl0gfCAjeDExMDAgfCBbI3gxMTAyLSN4MTEwM10NCi0vLyB8IFsjeDExMDUtI3gxMTA3XSB8ICN4MTEwOSB8IFsjeDExMEItI3gxMTBDXSB8IFsjeDExMEUtI3gxMTEyXQ0KLS8vIHwgI3gxMTNDIHwgI3gxMTNFIHwgI3gxMTQwIHwgI3gxMTRDIHwgI3gxMTRFIHwgI3gxMTUwDQotLy8gfCBbI3gxMTU0LSN4MTE1NV0gfCAjeDExNTkgfCBbI3gxMTVGLSN4MTE2MV0gfCAjeDExNjMgfCAjeDExNjUNCi0vLyB8ICN4MTE2NyB8ICN4MTE2OSB8IFsjeDExNkQtI3gxMTZFXSB8IFsjeDExNzItI3gxMTczXSB8ICN4MTE3NQ0KLS8vIHwgI3gxMTlFIHwgI3gxMUE4IHwgI3gxMUFCIHwgWyN4MTFBRS0jeDExQUZdIHwgWyN4MTFCNy0jeDExQjhdDQotLy8gfCAjeDExQkEgfCBbI3gxMUJDLSN4MTFDMl0gfCAjeDExRUIgfCAjeDExRjAgfCAjeDExRjkNCi0vLyB8IFsjeDFFMDAtI3gxRTlCXSB8IFsjeDFFQTAtI3gxRUY5XSB8IFsjeDFGMDAtI3gxRjE1XQ0KLS8vIHwgWyN4MUYxOC0jeDFGMURdIHwgWyN4MUYyMC0jeDFGNDVdIHwgWyN4MUY0OC0jeDFGNERdDQotLy8gfCBbI3gxRjUwLSN4MUY1N10gfCAjeDFGNTkgfCAjeDFGNUIgfCAjeDFGNUQgfCBbI3gxRjVGLSN4MUY3RF0NCi0vLyB8IFsjeDFGODAtI3gxRkI0XSB8IFsjeDFGQjYtI3gxRkJDXSB8ICN4MUZCRSB8IFsjeDFGQzItI3gxRkM0XQ0KLS8vIHwgWyN4MUZDNi0jeDFGQ0NdIHwgWyN4MUZEMC0jeDFGRDNdIHwgWyN4MUZENi0jeDFGREJdDQotLy8gfCBbI3gxRkUwLSN4MUZFQ10gfCBbI3gxRkYyLSN4MUZGNF0gfCBbI3gxRkY2LSN4MUZGQ10gfCAjeDIxMjYNCi0vLyB8IFsjeDIxMkEtI3gyMTJCXSB8ICN4MjEyRSB8IFsjeDIxODAtI3gyMTgyXSB8IFsjeDMwNDEtI3gzMDk0XQ0KLS8vIHwgWyN4MzBBMS0jeDMwRkFdIHwgWyN4MzEwNS0jeDMxMkNdIHwgWyN4QUMwMC0jeEQ3QTNdDQotQmFzZUNoYXIgPSBbXHUwMDQxLVx1MDA1QVx1MDA2MS1cdTAwN0FcdTAwQzAtXHUwMEQ2XHUwMEQ4LVx1MDBGNlx1MDBGOC1cdTAwRkZcdTAxMDAtXHUwMTMxXHUwMTM0LVx1MDEzRVx1MDE0MS1cdTAxNDhcdTAxNEEtXHUwMTdFXHUwMTgwLVx1MDFDM1x1MDFDRC1cdTAxRjBcdTAxRjQtXHUwMUY1XHUwMUZBLVx1MDIxN1x1MDI1MC1cdTAyQThcdTAyQkItXHUwMkMxXHUwMzg2XHUwMzg4LVx1MDM4QVx1MDM4Q1x1MDM4RS1cdTAzQTFcdTAzQTMtXHUwM0NFXHUwM0QwLVx1MDNENlx1MDNEQVx1MDNEQ1x1MDNERVx1MDNFMFx1MDNFMi1cdTAzRjNcdTA0MDEtXHUwNDBDXHUwNDBFLVx1MDQ0Rlx1MDQ1MS1cdTA0NUNcdTA0NUUtXHUwNDgxXHUwNDkwLVx1MDRDNFx1MDRDNy1cdTA0QzhcdTA0Q0ItXHUwNENDXHUwNEQwLVx1MDRFQlx1MDRFRS1cdTA0RjVcdTA0RjgtXHUwNEY5XHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MS1cdTA1ODZcdTA1RDAtXHUwNUVBXHUwNUYwLVx1MDVGMlx1MDYyMS1cdTA2M0FcdTA2NDEtXHUwNjRBXHUwNjcxLVx1MDZCN1x1MDZCQS1cdTA2QkVcdTA2QzAtXHUwNkNFXHUwNkQwLVx1MDZEM1x1MDZENVx1MDZFNS1cdTA2RTZcdTA5MDUtXHUwOTM5XHUwOTNEXHUwOTU4LVx1MDk2MVx1MDk4NS1cdTA5OENcdTA5OEYtXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOURDLVx1MDlERFx1MDlERi1cdTA5RTFcdTA5RjAtXHUwOUYxXHUwQTA1LVx1MEEwQVx1MEEwRi1cdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMi1cdTBBMzNcdTBBMzUtXHUwQTM2XHUwQTM4LVx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4Qlx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMi1cdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUUwXHUwQjA1LVx1MEIwQ1x1MEIwRi1cdTBCMTBcdTBCMTMtXHUwQjI4XHUwQjJBLVx1MEIzMFx1MEIzMi1cdTBCMzNcdTBCMzYtXHUwQjM5XHUwQjNEXHUwQjVDLVx1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTktXHUwQjlBXHUwQjlDXHUwQjlFLVx1MEI5Rlx1MEJBMy1cdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCNVx1MEJCNy1cdTBCQjlcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzMzXHUwQzM1LVx1MEMzOVx1MEM2MC1cdTBDNjFcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENERVx1MENFMC1cdTBDRTFcdTBEMDUtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEMjhcdTBEMkEtXHUwRDM5XHUwRDYwLVx1MEQ2MVx1MEUwMS1cdTBFMkVcdTBFMzBcdTBFMzItXHUwRTMzXHUwRTQwLVx1MEU0NVx1MEU4MS1cdTBFODJcdTBFODRcdTBFODctXHUwRTg4XHUwRThBXHUwRThEXHUwRTk0LVx1MEU5N1x1MEU5OS1cdTBFOUZcdTBFQTEtXHUwRUEzXHUwRUE1XHUwRUE3XHUwRUFBLVx1MEVBQlx1MEVBRC1cdTBFQUVcdTBFQjBcdTBFQjItXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEY0MC1cdTBGNDdcdTBGNDktXHUwRjY5XHUxMEEwLVx1MTBDNVx1MTBEMC1cdTEwRjZcdTExMDBcdTExMDItXHUxMTAzXHUxMTA1LVx1MTEwN1x1MTEwOVx1MTEwQi1cdTExMENcdTExMEUtXHUxMTEyXHUxMTNDXHUxMTNFXHUxMTQwXHUxMTRDXHUxMTRFXHUxMTUwXHUxMTU0LVx1MTE1NVx1MTE1OVx1MTE1Ri1cdTExNjFcdTExNjNcdTExNjVcdTExNjdcdTExNjlcdTExNkQtXHUxMTZFXHUxMTcyLVx1MTE3M1x1MTE3NVx1MTE5RVx1MTFBOFx1MTFBQlx1MTFBRS1cdTExQUZcdTExQjctXHUxMUI4XHUxMUJBXHUxMUJDLVx1MTFDMlx1MTFFQlx1MTFGMFx1MTFGOVx1MUUwMC1cdTFFOUJcdTFFQTAtXHUxRUY5XHUxRjAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMTI2XHUyMTJBLVx1MjEyQlx1MjEyRVx1MjE4MC1cdTIxODJcdTMwNDEtXHUzMDk0XHUzMEExLVx1MzBGQVx1MzEwNS1cdTMxMkNcdUFDMDAtXHVEN0EzXQ0KLQ0KLS8vIFs4Nl0gIElkZW9ncmFwaGljIDo6PSBbI3g0RTAwLSN4OUZBNV0gfCAjeDMwMDcgfCBbI3gzMDIxLSN4MzAyOV0NCi1JZGVvZ3JhcGhpYyA9IFtcdTRFMDAtXHU5RkE1XHUzMDA3XHUzMDIxLVx1MzAyOV0NCi0NCi0vLyBbODddICAgICAgQ29tYmluaW5nQ2hhciAgICA6Oj0gICAgWyN4MDMwMC0jeDAzNDVdICAgIHwgWyN4MDM2MC0jeDAzNjFdDQotLy8gfCBbI3gwNDgzLSN4MDQ4Nl0gICAgICAgICAgfCBbI3gwNTkxLSN4MDVBMV0gICAgICAgICB8IFsjeDA1QTMtI3gwNUI5XQ0KLS8vIHwgWyN4MDVCQi0jeDA1QkRdICAgICAgIHwgI3gwNUJGICAgICAgIHwgWyN4MDVDMS0jeDA1QzJdCSB8ICN4MDVDNA0KLS8vIHwgWyN4MDY0Qi0jeDA2NTJdICAgIHwgI3gwNjcwICAgIHwgWyN4MDZENi0jeDA2RENdICAgfCBbI3gwNkRELSN4MDZERl0NCi0vLyB8IFsjeDA2RTAtI3gwNkU0XSAgICAgICAgICB8IFsjeDA2RTctI3gwNkU4XSAgICAgICAgIHwgWyN4MDZFQS0jeDA2RURdDQotLy8gfCBbI3gwOTAxLSN4MDkwM10gICAgICAgfCAjeDA5M0MgICAgICAgfCBbI3gwOTNFLSN4MDk0Q10gICAgICB8ICN4MDk0RA0KLS8vIHwgWyN4MDk1MS0jeDA5NTRdICAgIHwgWyN4MDk2Mi0jeDA5NjNdICAgIHwgWyN4MDk4MS0jeDA5ODNdICAgfCAjeDA5QkMNCi0vLyB8ICN4MDlCRSAgICAgICB8ICN4MDlCRiAgICAgICB8IFsjeDA5QzAtI3gwOUM0XSAgICAgIHwgWyN4MDlDNy0jeDA5QzhdDQotLy8gfCBbI3gwOUNCLSN4MDlDRF0gICB8ICN4MDlENyAgIHwgWyN4MDlFMi0jeDA5RTNdICAgfCAjeDBBMDIgICB8ICN4MEEzQw0KLS8vIHwgI3gwQTNFICAgICAgIHwgI3gwQTNGICAgICAgIHwgWyN4MEE0MC0jeDBBNDJdICAgICAgfCBbI3gwQTQ3LSN4MEE0OF0NCi0vLyB8IFsjeDBBNEItI3gwQTREXSAgICB8IFsjeDBBNzAtI3gwQTcxXSAgICB8IFsjeDBBODEtI3gwQTgzXSAgIHwgI3gwQUJDDQotLy8gfCBbI3gwQUJFLSN4MEFDNV0gICAgICAgICAgfCBbI3gwQUM3LSN4MEFDOV0gICAgICAgICB8IFsjeDBBQ0ItI3gwQUNEXQ0KLS8vIHwgWyN4MEIwMS0jeDBCMDNdICAgIHwgI3gwQjNDICAgIHwgWyN4MEIzRS0jeDBCNDNdICAgfCBbI3gwQjQ3LSN4MEI0OF0NCi0vLyB8IFsjeDBCNEItI3gwQjREXSAgICAgICAgICB8IFsjeDBCNTYtI3gwQjU3XSAgICAgICAgIHwgWyN4MEI4Mi0jeDBCODNdDQotLy8gfCBbI3gwQkJFLSN4MEJDMl0gICAgfCBbI3gwQkM2LSN4MEJDOF0gICAgfCBbI3gwQkNBLSN4MEJDRF0gICB8ICN4MEJENw0KLS8vIHwgWyN4MEMwMS0jeDBDMDNdICAgICAgICAgIHwgWyN4MEMzRS0jeDBDNDRdICAgICAgICAgfCBbI3gwQzQ2LSN4MEM0OF0NCi0vLyB8IFsjeDBDNEEtI3gwQzREXSAgICAgICAgICB8IFsjeDBDNTUtI3gwQzU2XSAgICAgICAgIHwgWyN4MEM4Mi0jeDBDODNdDQotLy8gfCBbI3gwQ0JFLSN4MENDNF0gICAgICAgICAgfCBbI3gwQ0M2LSN4MENDOF0gICAgICAgICB8IFsjeDBDQ0EtI3gwQ0NEXQ0KLS8vIHwgWyN4MENENS0jeDBDRDZdICAgICAgICAgIHwgWyN4MEQwMi0jeDBEMDNdICAgICAgICAgfCBbI3gwRDNFLSN4MEQ0M10NCi0vLyB8IFsjeDBENDYtI3gwRDQ4XSAgICAgICB8IFsjeDBENEEtI3gwRDREXSAgICAgICB8ICN4MEQ1NyAgICAgIHwgI3gwRTMxDQotLy8gfCBbI3gwRTM0LSN4MEUzQV0gICAgfCBbI3gwRTQ3LSN4MEU0RV0gICAgfCAjeDBFQjEgICB8IFsjeDBFQjQtI3gwRUI5XQ0KLS8vIHwgWyN4MEVCQi0jeDBFQkNdICAgIHwgWyN4MEVDOC0jeDBFQ0RdICAgIHwgWyN4MEYxOC0jeDBGMTldICAgfCAjeDBGMzUNCi0vLyB8ICN4MEYzNyAgICAgIHwgI3gwRjM5ICAgICB8ICN4MEYzRSAgICAgfCAjeDBGM0YgICAgIHwgWyN4MEY3MS0jeDBGODRdDQotLy8gfCBbI3gwRjg2LSN4MEY4Ql0gICAgfCBbI3gwRjkwLSN4MEY5NV0gICAgfCAjeDBGOTcgICB8IFsjeDBGOTktI3gwRkFEXQ0KLS8vIHwgWyN4MEZCMS0jeDBGQjddICAgICAgIHwgI3gwRkI5ICAgICAgIHwgWyN4MjBEMC0jeDIwRENdICAgICAgfCAjeDIwRTENCi0vLyB8IFsjeDMwMkEtI3gzMDJGXSB8ICN4MzA5OSB8ICN4MzA5QQ0KLUNvbWJpbmluZ0NoYXIgPSAgICBbXHUwMzAwLVx1MDM0NVx1MDM2MC1cdTAzNjFcdTA0ODMtXHUwNDg2XHUwNTkxLVx1MDVBMVx1MDVBMy1cdTA1QjlcdTA1QkItXHUwNUJEXHUwNUJGXHUwNUMxLVx1MDVDMlx1MDVDNFx1MDY0Qi1cdTA2NTJcdTA2NzBcdTA2RDYtXHUwNkRDXHUwNkRELVx1MDZERlx1MDZFMC1cdTA2RTRcdTA2RTctXHUwNkU4XHUwNkVBLVx1MDZFRFx1MDkwMS1cdTA5MDNcdTA5M0NcdTA5M0UtXHUwOTRDXHUwOTREXHUwOTUxLVx1MDk1NFx1MDk2Mi1cdTA5NjNcdTA5ODEtXHUwOTgzXHUwOUJDXHUwOUJFXHUwOUJGXHUwOUMwLVx1MDlDNFx1MDlDNy1cdTA5QzhcdTA5Q0ItXHUwOUNEXHUwOUQ3XHUwOUUyLVx1MDlFM1x1MEEwMlx1MEEzQ1x1MEEzRVx1MEEzRlx1MEE0MC1cdTBBNDJcdTBBNDctXHUwQTQ4XHUwQTRCLVx1MEE0RFx1MEE3MC1cdTBBNzFcdTBBODEtXHUwQTgzXHUwQUJDXHUwQUJFLVx1MEFDNVx1MEFDNy1cdTBBQzlcdTBBQ0ItXHUwQUNEXHUwQjAxLVx1MEIwM1x1MEIzQ1x1MEIzRS1cdTBCNDNcdTBCNDctXHUwQjQ4XHUwQjRCLVx1MEI0RFx1MEI1Ni1cdTBCNTdcdTBCODItXHUwQjgzXHUwQkJFLVx1MEJDMlx1MEJDNi1cdTBCQzhcdTBCQ0EtXHUwQkNEXHUwQkQ3XHUwQzAxLVx1MEMwM1x1MEMzRS1cdTBDNDRcdTBDNDYtXHUwQzQ4XHUwQzRBLVx1MEM0RFx1MEM1NS1cdTBDNTZcdTBDODItXHUwQzgzXHUwQ0JFLVx1MENDNFx1MENDNi1cdTBDQzhcdTBDQ0EtXHUwQ0NEXHUwQ0Q1LVx1MENENlx1MEQwMi1cdTBEMDNcdTBEM0UtXHUwRDQzXHUwRDQ2LVx1MEQ0OFx1MEQ0QS1cdTBENERcdTBENTdcdTBFMzFcdTBFMzQtXHUwRTNBXHUwRTQ3LVx1MEU0RVx1MEVCMVx1MEVCNC1cdTBFQjlcdTBFQkItXHUwRUJDXHUwRUM4LVx1MEVDRFx1MEYxOC1cdTBGMTlcdTBGMzVcdTBGMzdcdTBGMzlcdTBGM0VcdTBGM0ZcdTBGNzEtXHUwRjg0XHUwRjg2LVx1MEY4Qlx1MEY5MC1cdTBGOTVcdTBGOTdcdTBGOTktXHUwRkFEXHUwRkIxLVx1MEZCN1x1MEZCOVx1MjBEMC1cdTIwRENcdTIwRTFcdTMwMkEtXHUzMDJGXHUzMDk5XHUzMDlBXQ0KLQ0KLS8vIFs4OF0gICBEaWdpdCAgOjo9ICBbI3gwMDMwLSN4MDAzOV0gfCBbI3gwNjYwLSN4MDY2OV0gfCBbI3gwNkYwLSN4MDZGOV0NCi0vLyB8IFsjeDA5NjYtI3gwOTZGXSAgICAgICAgICB8IFsjeDA5RTYtI3gwOUVGXSAgICAgICAgIHwgWyN4MEE2Ni0jeDBBNkZdDQotLy8gfCBbI3gwQUU2LSN4MEFFRl0gICAgICAgICAgfCBbI3gwQjY2LSN4MEI2Rl0gICAgICAgICB8IFsjeDBCRTctI3gwQkVGXQ0KLS8vIHwgWyN4MEM2Ni0jeDBDNkZdICAgICAgICAgIHwgWyN4MENFNi0jeDBDRUZdICAgICAgICAgfCBbI3gwRDY2LSN4MEQ2Rl0NCi0vLyB8IFsjeDBFNTAtI3gwRTU5XSB8IFsjeDBFRDAtI3gwRUQ5XSB8IFsjeDBGMjAtI3gwRjI5XQ0KLURpZ2l0ID0gIFtcdTAwMzAtXHUwMDM5XHUwNjYwLVx1MDY2OVx1MDZGMC1cdTA2RjlcdTA5NjYtXHUwOTZGXHUwOUU2LVx1MDlFRlx1MEE2Ni1cdTBBNkZcdTBBRTYtXHUwQUVGXHUwQjY2LVx1MEI2Rlx1MEJFNy1cdTBCRUZcdTBDNjYtXHUwQzZGXHUwQ0U2LVx1MENFRlx1MEQ2Ni1cdTBENkZcdTBFNTAtXHUwRTU5XHUwRUQwLVx1MEVEOVx1MEYyMC1cdTBGMjldDQotDQotLy8gWzg5XSAgRXh0ZW5kZXIgOjo9ICN4MDBCNyB8ICN4MDJEMCB8ICN4MDJEMSB8ICN4MDM4NyB8ICN4MDY0MCB8ICN4MEU0Ng0KLS8vIHwgI3gwRUM2ICAgICAgIHwgI3gzMDA1ICAgICAgIHwgWyN4MzAzMS0jeDMwMzVdICAgICAgfCBbI3gzMDlELSN4MzA5RV0NCi0vLyB8IFsjeDMwRkMtI3gzMEZFXQ0KLUV4dGVuZGVyID0gW1x1MDBCN1x1MDJEMFx1MDJEMVx1MDM4N1x1MDY0MFx1MEU0Nlx1MEVDNlx1MzAwNVx1MzAzMS1cdTMwMzVcdTMwOUQtXHUzMDlFXHUzMEZDLVx1MzBGRV0NCi0NCi0NCi0NCi0vKioNCi0gKiBKU1AgYW5kIHNjcmlwdGluZyBtYXJrZXIgYWxsb3dhbmNlcw0KLSAqLw0KLQ0KLWpzcENvbW1lbnRTdGFydCA9IDwlLS0NCi1qc3BDb21tZW50RW5kICAgPSAtLSU+DQotDQotanNwU2NyaXB0bGV0U3RhcnQgICAgICAgID0gPCUNCi1qc3BFeHByZXNzaW9uU3RhcnQgICAgICAgPSB7anNwU2NyaXB0bGV0U3RhcnR9PQ0KLWpzcERlY2xhcmF0aW9uU3RhcnQgICAgICA9IHtqc3BTY3JpcHRsZXRTdGFydH1cIQ0KLWpzcFNjcmlwdGxldEVuZCAgICAgICAgICA9ICU+DQotanNwRGlyZWN0aXZlU3RhcnQgICAgICAgID0ge2pzcFNjcmlwdGxldFN0YXJ0fUANCi0NCi0lJQ0KLQ0KLS8qIHdoaXRlIHNwYWNlIHdpdGhpbiBhIHRhZyAqLw0KLTxTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUsIFNUX0pTUF9BVFRSSUJVVEVfVkFMVUUsIFNUX1BJLCBTVF9YTUxfUElfRVFVQUxTLCBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUsIFNUX1hNTF9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04sIFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OLCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTiwgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFLCBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMsIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQsIFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSwgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRSwgU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMsIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFLFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQsU1RfREhUTUxfQVRUUklCVVRFX05BTUUsU1RfREhUTUxfRVFVQUxTLFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSxTVF9ESFRNTF9UQUdfQ0xPU0U+IHtTfSogew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIndoaXRlIHNwYWNlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi0NCi0vLyBCRUdJTiBSRUdVTEFSIFhNTA0KLS8qIGhhbmRsZSBvcGVuaW5nIGEgbmV3IHRhZyBhbG1vc3QgYW55d2hlcmUgKi8NCi0NCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0RFQ0xBUkFUSU9OLCBTVF9KU1BfRElSRUNUSVZFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfTkFNRV9XSElURVNQQUNFLCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FLCBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUywgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljVGFnT3Blbn0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuc3RhcnQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX09QRU47DQotfQ0KLS8qIFZFUlkgc3BlY2lhbCBjYXNlcyBmb3IgdGFncyBhcyB2YWx1ZXMgKi8NCi0vKiBxdW90ZWQgSlNQICovDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRD4gWyJdIHsNCi0JcmV0dXJuIGlzSnNwVGFnKCk/IEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSA6IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URTsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRD4gWyddIHsNCi0JcmV0dXJuIGlzSnNwVGFnKCkgPyBKU1BfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUgOiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEU7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFLCBTVF9KU1BfQVRUUklCVVRFX1ZBTFVFPiBbIl0gew0KLQlTdHJpbmcgdHlwZSA9IHl5X2xleGljYWxfc3RhdGUgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSA/IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSA6IEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URTsNCi0NCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQrIiwgIit0eXBlKTsvLyROT04tTkxTLTEkDQotCX0NCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7DQotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKTsNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQgLSBjb21wbGV4IGRvdWJsZSBxdW90ZWQiKTsvLyROT04tTkxTLTEkDQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIodHlwZSwgdHlwZSk7DQotCWZTdGF0ZVN0YWNrLnBvcCgpOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLQlpZiAoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gVU5ERUZJTkVEKSB7DQotCQlmUHJveHlVbmtub3duUmVnaW9uID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUsIGZFbWJlZGRlZENvbnRhaW5lci5nZXRTdGFydCgpLCBmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpLCBmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkpOw0KLQkJcmV0dXJuIFBST1hZX1VOS05PV05fQ09OVEVYVDsNCi0JfQ0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUsIFNUX0pTUF9BVFRSSUJVVEVfVkFMVUU+IFsnXSB7DQotCVN0cmluZyB0eXBlID0geXlfbGV4aWNhbF9zdGF0ZSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFID8gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFIDogSlNQX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFOw0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCsiLCAiK3R5cGUpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsNCi0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpOw0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGNvbXBsZXggc2luZ2xlIHF1b3RlZCIpOy8vJE5PTi1OTFMtMSQNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcih0eXBlLCB0eXBlKTsNCi0JZlN0YXRlU3RhY2sucG9wKCk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLSAgICBpZiAoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gVU5ERUZJTkVEKSB7DQotCQlmUHJveHlVbmtub3duUmVnaW9uID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUsIGZFbWJlZGRlZENvbnRhaW5lci5nZXRTdGFydCgpLCBmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpLCBmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkpOw0KLQkJcmV0dXJuIFBST1hZX1VOS05PV05fQ09OVEVYVDsNCi0JfQ0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRD4gKFtePCJceDI0XHgyM10rfFtceDI0XHgyM117U30qKQ0KLXsNCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLX0NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEPiAoW148J1x4MjRceDIzXSt8W1x4MjRceDIzXXtTfSopDQotew0KLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLQ0KLQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQsU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEPiB7Z2VuZXJpY1RhZ09wZW59IHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQrIiwgZ2VuZXJpY1RhZ09wZW4iKTsvLyROT04tTkxTLTEkDQotCX0NCi0JaW50IGluY29taW5nU3RhdGUgPSB5eXN0YXRlKCk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInRhZyBpbnNpZGUgb2YgSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOw0KLQlpZih5eXN0YXRlKCkgIT0gU1RfQUJPUlRfRU1CRURERUQpDQotICAgICAgICB5eWJlZ2luKGluY29taW5nU3RhdGUpOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ+IHtnZW5lcmljRW5kVGFnT3Blbn0gew0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCsiLCBnZW5lcmljRW5kVGFnT3BlbiIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlpbnQgaW5jb21pbmdTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGVuZCB0YWciKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfRU5EX1RBR19PUEVOLCBuZXcgU3RyaW5nW117WE1MX1RBR19DTE9TRSxYTUxfRU1QVFlfVEFHX0NMT1NFfSk7DQotCWlmKHl5c3RhdGUoKSAhPSBTVF9BQk9SVF9FTUJFRERFRCkNCi0gICAgICAgIHl5YmVnaW4oaW5jb21pbmdTdGF0ZSk7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi0NCi0vKiB1bnF1b3RlZCAqLw0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFPiB7Z2VuZXJpY1RhZ09wZW59IHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQrIiwgdW5xdW90ZWQgZ2VuZXJpY1RhZ09wZW4iKTsvLyROT04tTkxTLTEkDQotCX0NCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJKU1AgdGFnIGVtYmVkZGVkIG5hbWUgc3RhcnQgLSBzdGFydCB0YWciKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX09QRU4sIG5ldyBTdHJpbmdbXXtYTUxfVEFHX0NMT1NFLFhNTF9FTVBUWV9UQUdfQ0xPU0V9KTsNCi0JZlN0YXRlU3RhY2sucG9wKCk7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotDQotPFlZSU5JVElBTCwgU1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUsIFNUX0pTUF9BVFRSSUJVVEVfVkFMVUUsIFNUX1hNTF9ERUNMQVJBVElPTj4ge2dlbmVyaWNFbmRUYWdPcGVufSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5lbmQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfRU5EX1RBR19PUEVOOw0KLX0NCi0vKiBzcGVjaWFsbHkgdHJlYXRlZCBKU1AgdGFnIG5hbWVzICovDQotPFNUX1hNTF9UQUdfTkFNRT4ganNwOnJvb3Qgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImpzcDpyb290IHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBKU1BfUk9PVF9UQUdfTkFNRTsNCi19DQotPFNUX1hNTF9UQUdfTkFNRT4ganNwOmRpcmVjdGl2ZS4ocGFnZXxpbmNsdWRlfHRhZ3x0YWdsaWJ8YXR0cmlidXRlfHZhcmlhYmxlKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgianNwIGRpcmVjdGl2ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gSlNQX0RJUkVDVElWRV9OQU1FOw0KLX0NCi0vKiB0aGUgdGFnJ3MgbmFtZSB3YXMgZm91bmQsIHN0YXJ0IHNjYW5uaW5nIGZvciBhdHRyaWJ1dGVzICovDQotPFNUX1hNTF9UQUdfTkFNRT4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJ0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgU3RyaW5nIHRhZ25hbWUgPSB5eXRleHQoKTsNCi0gICAgYm9vbGVhbiBqc3BUYWcgPSB0YWduYW1lLmluZGV4T2YoJzonKSAhPSAtMTsNCi0JaWYgKGZFbWJlZGRlZENvbnRhaW5lciAhPSBudWxsKSB7DQotICAgIAlmRW1iZWRkZWRUYWcgPSBqc3BUYWc7DQotCQlmSW5UYWdFbWJlZGRlZCA9IHRydWU7DQotICAgIH0NCi0JZWxzZSB7DQotCQlmQ29udGFpbmVyVGFnID0ganNwVGFnOw0KLQkJZkluVGFnQ29udGFpbmVyID0gdHJ1ZTsNCi0JfQ0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLQ0KLS8qIGFub3RoZXIgYXR0cmlidXRlIG5hbWUgd2FzIGZvdW5kLCByZXN1bWUgbG9va2luZyBmb3IgdGhlIGVxdWFscyBzaWduICovDQotPFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9FUVVBTFMpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotfQ0KLS8qIGFuIGVxdWFsIHNpZ24gd2FzIGZvdW5kLCB3aGF0J3MgbmV4dCBpcyB0aGUgdmFsdWUgKi8NCi08U1RfWE1MX0VRVUFMUz4ge0VxfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZXF1YWxzIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0gICAgICAgIHl5YmVnaW4oaXNKc3BUYWcoKSA/IFNUX0pTUF9BVFRSSUJVVEVfVkFMVUUgOiBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7DQotfQ0KLS8qIHRoZSB2YWx1ZSB3YXMgZm91bmQsIGxvb2sgZm9yIHRoZSBuZXh0IG5hbWUgKi8NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge0F0dFZhbHVlfSB7IC8qIG9ubHkgYWxsb3cgZm9yIG5vbi1KU1AgdGFncyBmb3IgdGhpcyBkb2VzIG5vdCBvYmV5IEpTUCBxdW90aW5nIHJ1bGVzICovDQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLTxTVF9KU1BfQVRUUklCVVRFX1ZBTFVFPiB7UXVvdGVkQXR0VmFsdWV9IHsgLyogSlNQIGF0dHJpYnV0ZSB2YWx1ZXMgaGF2ZSBlc2NhcGUgc2VtYW50aWNzICovDQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgianNwIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi19DQotDQotLyogdGhlIHRhZydzIGNsb3NlIHdhcyBmb3VuZCAqLw0KLTxTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSwgU1RfSlNQX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNUYWdDbG9zZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0JaWYoaXNCbG9ja01hcmtlcigpKSB7DQotCQlmRW1iZWRkZWRIaW50ID0gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KCk7DQotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9CTE9DS19UQUdfU0NBTjsNCi0gICAgICAgIAl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JfQ0KLQllbHNlDQotICAgICAgICAJeXliZWdpbihZWUlOSVRJQUwpOw0KLQ0KLQlpZiAoZkVtYmVkZGVkQ29udGFpbmVyICE9IG51bGwpDQotCQlmSW5UYWdFbWJlZGRlZCA9IGZhbHNlOw0KLQllbHNlDQotCQlmSW5UYWdDb250YWluZXIgPSBmYWxzZTsNCi0NCi0JcmV0dXJuIFhNTF9UQUdfQ0xPU0U7DQotfQ0KLS8qIHRoZSB0YWcncyBjbG9zZSB3YXMgZm91bmQsIGJ1dCB0aGUgdGFnIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIGVuZCB0YWcgKi8NCi08U1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUsIFNUX0pTUF9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljRW1wdHlUYWdDbG9zZX0gew0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVtcHR5IHRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQNCi0NCi0JaWYgKGZFbWJlZGRlZENvbnRhaW5lciAhPSBudWxsKQ0KLQkJZkluVGFnRW1iZWRkZWQgPSBmYWxzZTsNCi0JZWxzZQ0KLQkJZkluVGFnQ29udGFpbmVyID0gZmFsc2U7DQotDQotCXJldHVybiBYTUxfRU1QVFlfVEFHX0NMT1NFOw0KLX0NCi0NCi08U1RfWE1MX1RBR19OQU1FPiBbXjwvPlx1MDA0MS1cdTAwNUFcdTAwNjEtXHUwMDdBXHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMEZGXHUwMTAwLVx1MDEzMVx1MDEzNC1cdTAxM0VcdTAxNDEtXHUwMTQ4XHUwMTRBLVx1MDE3RVx1MDE4MC1cdTAxQzNcdTAxQ0QtXHUwMUYwXHUwMUY0LVx1MDFGNVx1MDFGQS1cdTAyMTdcdTAyNTAtXHUwMkE4XHUwMkJCLVx1MDJDMVx1MDM4Nlx1MDM4OC1cdTAzOEFcdTAzOENcdTAzOEUtXHUwM0ExXHUwM0EzLVx1MDNDRVx1MDNEMC1cdTAzRDZcdTAzREFcdTAzRENcdTAzREVcdTAzRTBcdTAzRTItXHUwM0YzXHUwNDAxLVx1MDQwQ1x1MDQwRS1cdTA0NEZcdTA0NTEtXHUwNDVDXHUwNDVFLVx1MDQ4MVx1MDQ5MC1cdTA0QzRcdTA0QzctXHUwNEM4XHUwNENCLVx1MDRDQ1x1MDREMC1cdTA0RUJcdTA0RUUtXHUwNEY1XHUwNEY4LVx1MDRGOVx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg2XHUwNUQwLVx1MDVFQVx1MDVGMC1cdTA1RjJcdTA2MjEtXHUwNjNBXHUwNjQxLVx1MDY0QVx1MDY3MS1cdTA2QjdcdTA2QkEtXHUwNkJFXHUwNkMwLVx1MDZDRVx1MDZEMC1cdTA2RDNcdTA2RDVcdTA2RTUtXHUwNkU2XHUwOTA1LVx1MDkzOVx1MDkzRFx1MDk1OC1cdTA5NjFcdTA5ODUtXHUwOThDXHUwOThGLVx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlEQy1cdTA5RERcdTA5REYtXHUwOUUxXHUwOUYwLVx1MDlGMVx1MEEwNS1cdTBBMEFcdTBBMEYtXHUwQTEwXHUwQTEzLVx1MEEyOFx1MEEyQS1cdTBBMzBcdTBBMzItXHUwQTMzXHUwQTM1LVx1MEEzNlx1MEEzOC1cdTBBMzlcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTcyLVx1MEE3NFx1MEE4NS1cdTBBOEJcdTBBOERcdTBBOEYtXHUwQTkxXHUwQTkzLVx1MEFBOFx1MEFBQS1cdTBBQjBcdTBBQjItXHUwQUIzXHUwQUI1LVx1MEFCOVx1MEFCRFx1MEFFMFx1MEIwNS1cdTBCMENcdTBCMEYtXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzItXHUwQjMzXHUwQjM2LVx1MEIzOVx1MEIzRFx1MEI1Qy1cdTBCNURcdTBCNUYtXHUwQjYxXHUwQjg1LVx1MEI4QVx1MEI4RS1cdTBCOTBcdTBCOTItXHUwQjk1XHUwQjk5LVx1MEI5QVx1MEI5Q1x1MEI5RS1cdTBCOUZcdTBCQTMtXHUwQkE0XHUwQkE4LVx1MEJBQVx1MEJBRS1cdTBCQjVcdTBCQjctXHUwQkI5XHUwQzA1LVx1MEMwQ1x1MEMwRS1cdTBDMTBcdTBDMTItXHUwQzI4XHUwQzJBLVx1MEMzM1x1MEMzNS1cdTBDMzlcdTBDNjAtXHUwQzYxXHUwQzg1LVx1MEM4Q1x1MEM4RS1cdTBDOTBcdTBDOTItXHUwQ0E4XHUwQ0FBLVx1MENCM1x1MENCNS1cdTBDQjlcdTBDREVcdTBDRTAtXHUwQ0UxXHUwRDA1LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDI4XHUwRDJBLVx1MEQzOVx1MEQ2MC1cdTBENjFcdTBFMDEtXHUwRTJFXHUwRTMwXHUwRTMyLVx1MEUzM1x1MEU0MC1cdTBFNDVcdTBFODEtXHUwRTgyXHUwRTg0XHUwRTg3LVx1MEU4OFx1MEU4QVx1MEU4RFx1MEU5NC1cdTBFOTdcdTBFOTktXHUwRTlGXHUwRUExLVx1MEVBM1x1MEVBNVx1MEVBN1x1MEVBQS1cdTBFQUJcdTBFQUQtXHUwRUFFXHUwRUIwXHUwRUIyLVx1MEVCM1x1MEVCRFx1MEVDMC1cdTBFQzRcdTBGNDAtXHUwRjQ3XHUwRjQ5LVx1MEY2OVx1MTBBMC1cdTEwQzVcdTEwRDAtXHUxMEY2XHUxMTAwXHUxMTAyLVx1MTEwM1x1MTEwNS1cdTExMDdcdTExMDlcdTExMEItXHUxMTBDXHUxMTBFLVx1MTExMlx1MTEzQ1x1MTEzRVx1MTE0MFx1MTE0Q1x1MTE0RVx1MTE1MFx1MTE1NC1cdTExNTVcdTExNTlcdTExNUYtXHUxMTYxXHUxMTYzXHUxMTY1XHUxMTY3XHUxMTY5XHUxMTZELVx1MTE2RVx1MTE3Mi1cdTExNzNcdTExNzVcdTExOUVcdTExQThcdTExQUJcdTExQUUtXHUxMUFGXHUxMUI3LVx1MTFCOFx1MTFCQVx1MTFCQy1cdTExQzJcdTExRUJcdTExRjBcdTExRjlcdTFFMDAtXHUxRTlCXHUxRUEwLVx1MUVGOVx1MUYwMC1cdTFGMTVcdTFGMTgtXHUxRjFEXHUxRjIwLVx1MUY0NVx1MUY0OC1cdTFGNERcdTFGNTAtXHUxRjU3XHUxRjU5XHUxRjVCXHUxRjVEXHUxRjVGLVx1MUY3RFx1MUY4MC1cdTFGQjRcdTFGQjYtXHUxRkJDXHUxRkJFXHUxRkMyLVx1MUZDNFx1MUZDNi1cdTFGQ0NcdTFGRDAtXHUxRkQzXHUxRkQ2LVx1MUZEQlx1MUZFMC1cdTFGRUNcdTFGRjItXHUxRkY0XHUxRkY2LVx1MUZGQ1x1MjEyNlx1MjEyQS1cdTIxMkJcdTIxMkVcdTIxODAtXHUyMTgyXHUzMDQxLVx1MzA5NFx1MzBBMS1cdTMwRkFcdTMxMDUtXHUzMTJDXHVBQzAwLVx1RDdBM1x1NEUwMC1cdTlGQTVcdTMwMDdcdTMwMjEtXHUzMDI5XSogew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImluYXBwcm9wcmlhdGUgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCWlmKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCk9PVNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRHx8ZlN0YXRlU3RhY2sucGVlaygpPT1TVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpKSB7DQotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsNCi0JCWNoYXIgYyA9IHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MgLSAxXTsNCi0JCWlmIChmU3RhdGVTdGFjay5wZWVrKCk9PVNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCAmJiBjID09ICdcIicpIHsNCi0JCQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFOw0KLQkJfQkJDQotCQlpZiAoZlN0YXRlU3RhY2sucGVlaygpPT1TVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQgJiYgYyA9PSAnXCcnKSB7DQotCQkJcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URTsNCi0JCX0NCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKS0xKTsNCi0JCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JfQ0KLQl5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX0NPTlRFTlQ7DQotfQ0KLQ0KLS8vIEVORCBSRUdVTEFSIFhNTA0KLQ0KLS8vIEJFR0lOIE5FU1RFRCBYTUwgVEFHUw0KLTxTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9FUVVBTFM+IDx7TmFtZX0gew0KLQlTdHJpbmcgdGFnTmFtZSA9IHl5dGV4dCgpLnN1YnN0cmluZygxKTsNCi0JLy8gcHVzaGJhY2sgdG8ganVzdCBhZnRlciB0aGUgb3BlbmluZyBicmFja2V0DQotCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDEpOw0KLQkvKg0KLQkgKiBJZiB0aGlzIHRhZyBjYW4gbm90IGJlIG5lc3RlZCBvciB3ZSdyZSBhbHJlYWR5IHNlYXJjaGluZyBmb3IgYW4NCi0JICogYXR0cmlidXRlIG5hbWUsIGVxdWFscywgb3IgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4NCi0JICovDQotCWlmICghaXNOZXN0YWJsZSh0YWdOYW1lKSB8fCAoIWZTdGF0ZVN0YWNrLmVtcHR5KCkgJiYgKGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9FUVVBTFMgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX0pTUF9BVFRSSUJVVEVfVkFMVUUpKSkgew0KLQkJeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQkJcmV0dXJuIFhNTF9UQUdfT1BFTjsNCi0JfQ0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInRhZyBpbiBwbGFjZSBvZiBhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JLy8gZW1iZWRkZWQgY29udGFpbmVyIHNob3VsZCBiZSBsb29raW5nIGZvciB0aGUgbmFtZSAoYWdhaW4pIG5leHQNCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQlhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoWE1MX1RBR19PUEVOLCB0YWdOYW1lKTsgLy8gPw0KLQlmU3RhdGVTdGFjay5wb3AoKTsNCi0JeXliZWdpbihTVF9YTUxfRVFVQUxTKTsNCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFLCBTVF9KU1BfQVRUUklCVVRFX1ZBTFVFPiA8e05hbWV9IHsNCi0JU3RyaW5nIHRhZ05hbWUgPSB5eXRleHQoKS5zdWJzdHJpbmcoMSk7DQotCS8vIHB1c2hiYWNrIHRvIGp1c3QgYWZ0ZXIgdGhlIG9wZW5pbmcgYnJhY2tldA0KLQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAxKTsNCi0JLyoNCi0JICogSWYgdGhpcyB0YWcgY2FuIG5vdCBiZSBuZXN0ZWQgb3Igd2UncmUgYWxyZWFkeSBzZWFyY2hpbmcgZm9yIGFuDQotCSAqIGF0dHJpYnV0ZSBuYW1lLCBlcXVhbHMsIG9yIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuDQotCSAqLw0KLQlpZiAoIWlzTmVzdGFibGUodGFnTmFtZSkgfHwgKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfRVFVQUxTIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9KU1BfQVRUUklCVVRFX1ZBTFVFKSkpIHsNCi0JCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0JCXJldHVybiBYTUxfVEFHX09QRU47DQotCX0NCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJ0YWcgaW4gcGxhY2Ugb2YgYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JLy8gZW1iZWRkZWQgY29udGFpbmVyIHNob3VsZCBiZSBsb29raW5nIGZvciB0aGUgbmFtZSAoYWdhaW4pIG5leHQNCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQlhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoWE1MX1RBR19PUEVOLCB0YWdOYW1lKTsgLy8gPw0KLQlmU3RhdGVTdGFjay5wb3AoKTsNCi0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotLy8gRU5EIE5FU1RFRCBYTUwNCi0NCi0vLyBYTUwgJiBKU1AgQ29tbWVudHMNCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSwgU1RfSlNQX0FUVFJJQlVURV9WQUxVRSwgU1RfWE1MX0RFQ0xBUkFUSU9OLCBTVF9KU1BfRElSRUNUSVZFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfTkFNRV9XSElURVNQQUNFLCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FLCBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUywgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUU+IHtDb21tZW50U3RhcnR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbmNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09NTUVOVF9URVhUOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQ09NTUVOVDsNCi0JeXliZWdpbihTVF9YTUxfQ09NTUVOVCk7DQotCXJldHVybiBYTUxfQ09NTUVOVF9PUEVOOw0KLX0NCi08U1RfWE1MX0NPTU1FTlQ+IC58XHJ8XG4gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImNvbW1lbnQgY29udGVudCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOw0KLX0NCi0NCi08U1RfWE1MX0NPTU1FTlRfRU5EPiB7Q29tbWVudEVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImNvbW1lbnQgZW5kIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLQl5eWJlZ2luKFlZSU5JVElBTCk7DQotCXJldHVybiBYTUxfQ09NTUVOVF9DTE9TRTsNCi19DQotDQotPFNUX0pTUF9DT05URU5UPiB7anNwU2NyaXB0bGV0RW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiSlNQIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkDQotCX0NCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCXJldHVybiBKU1BfQ0xPU0U7DQotfQ0KLTxTVF9KU1BfQ09OVEVOVD4gLnxcbnxcciB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiSlNQIGNvZGUgY29udGVudCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIGRvU2NhbigiJT4iLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBKU1BfQ09OVEVOVCwgU1RfSlNQX0NPTlRFTlQsIFNUX0pTUF9DT05URU5UKTsNCi19DQote2pzcFNjcmlwdGxldFN0YXJ0fSB7DQotCS8qIEpTUCBzY3JpcHRsZXQgYmVndW4gKGFueXdoZXJlKQ0KLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQ0KLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cw0KLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZA0KLQkgKi8NCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcw0KLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsNCi0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQ0KLQkJeXlwdXNoYmFjaygxKTsNCi0JCXJldHVybiBKU1BfQ09OVEVOVDsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgew0KLQkJeXlwdXNoYmFjaygyKTsNCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDIpOw0KLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDIpOw0KLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOw0KLQl9DQotCS8vIGZpbmlzaGVkIHNhbml0eSBjaGVja3MNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgew0KLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgcmVndWxhciBzY3JpcHRsZXQgb3V0IGluIGNvbnRlbnQNCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIlxuSlNQIHNjcmlwdGxldCBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOw0KLQkJcmV0dXJuIEpTUF9TQ1JJUFRMRVRfT1BFTjsNCi0JfQ0KLQllbHNlIHsNCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCsiLCBqc3BTY3JpcHRsZXRTdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIkpTUCBzY3JpcHRsZXQgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQ0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsNCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7DQotCQl9DQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsNCi0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1NDUklQVExFVF9PUEVOLCBKU1BfQ0xPU0UpOw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7DQotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7DQotCQl9DQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JCX0NCi0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JCX0NCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLSAgICAgICAgZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0FUVFJJQlVURV9WQUxVRSkgew0KLSAgICAgICAgICAgIGZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0gICAgICAgICAgICBmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotICAgICAgICB9DQotCQkNCi0JCXJldHVybiBQUk9YWV9DT05URVhUOw0KLQl9DQotfQ0KLXtqc3BFeHByZXNzaW9uU3RhcnR9IHsNCi0JLyogSlNQIGV4cHJlc3Npb24gYmVndW4gKGFueXdoZXJlKQ0KLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQ0KLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cw0KLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZA0KLQkgKi8NCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcw0KLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsNCi0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQ0KLQkJeXlwdXNoYmFjaygyKTsNCi0JCXJldHVybiBKU1BfQ09OVEVOVDsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgew0KLQkJeXlwdXNoYmFjaygzKTsNCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOw0KLQl9DQotCS8vIGVuZCBzYW5pdHkgY2hlY2tzDQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsNCi0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhbiBleHByZXNzaW9uIG91dCBpbiBjb250ZW50DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJcbkpTUCBleHByZXNzaW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7DQotCQlyZXR1cm4gSlNQX0VYUFJFU1NJT05fT1BFTjsNCi0JfQ0KLQllbHNlIHsNCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCsiLCBqc3BFeHByZXNzaW9uU3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJKU1AgZXhwcmVzc2lvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpDQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOw0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQ0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsNCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOw0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsNCi0JCX0NCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOw0KLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRVhQUkVTU0lPTl9PUEVOLCBKU1BfQ0xPU0UpOw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7DQotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7DQotCQl9DQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JCX0NCi0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JCX0NCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0FUVFJJQlVURV9WQUxVRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCQl9DQotCQkNCi0JCXJldHVybiBQUk9YWV9DT05URVhUOw0KLQl9DQotfQ0KLXtqc3BEZWNsYXJhdGlvblN0YXJ0fSB7DQotCS8qIEpTUCBkZWNsYXJhdGlvbiBiZWd1biAoYW55d2hlcmUpDQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlDQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzDQotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkDQotCSAqLw0KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzDQotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgew0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hDQotCQl5eXB1c2hiYWNrKDIpOw0KLQkJcmV0dXJuIEpTUF9DT05URU5UOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7DQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7DQotCX0NCi0JLy8gZW5kIHNhbml0eSBjaGVja3MNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgew0KLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgZGVjbGFyYXRpb24gb3V0IGluIGNvbnRlbnQNCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIlxuSlNQIGRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7DQotCQlyZXR1cm4gSlNQX0RFQ0xBUkFUSU9OX09QRU47DQotCX0NCi0JZWxzZSB7DQotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQrIiwganNwRGVjbGFyYXRpb25TdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIkpTUCBkZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpDQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOw0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQ0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsNCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOw0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsNCi0JCX0NCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOw0KLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfREVDTEFSQVRJT05fT1BFTiwgSlNQX0NMT1NFKTsNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgew0KLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQkJCXJldHVybiBCTE9DS19URVhUOw0KLQkJfQ0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zDQotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCQl9DQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotCQl9DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JCX0NCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9BVFRSSUJVVEVfVkFMVUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotCX0NCi19DQote2pzcENvbW1lbnRTdGFydH0gew0KLQkvKiBKU1AgY29tbWVudCBiZWd1biAoYW55d2hlcmUpDQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlDQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzDQotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkDQotCSAqLw0KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzDQotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgew0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hDQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIEpTUF9DT05URU5UOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7DQotCQl5eXB1c2hiYWNrKDQpOw0KLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soNCk7DQotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soNCk7DQotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pICB7DQotCQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsNCi0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0NPTU1FTlRfT1BFTiwgSlNQX0NPTU1FTlRfQ0xPU0UpOw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKQ0KLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotCX0NCi0JLy8gZmluaXNoZWQgc2FuaXR5IGNoZWNrcw0KLQlpZih5eXN0YXRlKCk9PVlZSU5JVElBTCkgew0KLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgcmVndWxhciBzY3JpcHRsZXQgb3V0IGluIGNvbnRlbnQNCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIlxuSlNQIGNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsNCi0JCXJldHVybiBKU1BfQ09NTUVOVF9PUEVOOw0KLQl9DQotCWVsc2Ugew0KLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KyIsIGpzcENvbW1lbnRTdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIkpTUCBjb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpDQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOw0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgew0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOw0KLQkJfQ0KLQkJeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7DQotCQkvLyB0aGUgY29tbWVudCBjb250YWluZXIgaXRzZWxmIHdpbGwgYWN0IGFzIGNvbW1lbnQgdGV4dA0KLQkJZkVtYmVkZGVkSGludCA9IEpTUF9DT01NRU5UX1RFWFQ7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9DT01NRU5UX09QRU4sIEpTUF9DT01NRU5UX0NMT1NFKTsNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgew0KLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQkJCXJldHVybiBCTE9DS19URVhUOw0KLQkJfQ0KLQkJLyoNCi0JCSAqIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9uczsgbWFyayB0aGlzIG9uZSBhcyBhDQotCQkgKiBjb21tZW50IHNvIGl0IHdpbGwgYmUgb3RoZXJ3aXNlIGlnbm9yZWQgYnV0IHByZXNlcnZlZCAod2hpY2ggaXMgd2h5DQotCQkgKiB3ZSBjYW4ndCB1c2Ugd2hpdGUtc3BhY2UpDQotCQkgKi8NCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JCX0NCi0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JCX0NCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0FUVFJJQlVURV9WQUxVRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCQl9DQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi0JfQ0KLX0NCi0NCi08U1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4+IHtqc3BDb21tZW50U3RhcnR9ICB7DQotCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9DT01NRU5UX09QRU4sIEpTUF9DT01NRU5UX0NMT1NFKTsNCi0JaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKQ0KLQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi0NCi17anNwRGlyZWN0aXZlU3RhcnR9IHsNCi0JLyogSlNQIGRpcmVjdGl2ZSBiZWd1biAoYW55d2hlcmUpDQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlDQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzDQotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkDQotCSAqLw0KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzDQotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgew0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hDQotCQl5eXB1c2hiYWNrKDIpOw0KLQkJcmV0dXJuIEpTUF9DT05URU5UOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7DQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7DQotCX0NCi0JLy8gZW5kIHNhbml0eSBjaGVja3MNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgew0KLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgZGVjbGFyYXRpb24gb3V0IGluIGNvbnRlbnQNCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIlxuSlNQIGRpcmVjdGl2ZSBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FKTsNCi0JCXJldHVybiBKU1BfRElSRUNUSVZFX09QRU47DQotCX0NCi0JZWxzZSB7DQotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQrIiwganNwRGlyZWN0aXZlU3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJKU1AgZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQ0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsNCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7DQotCQl9DQotCQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSk7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9ESVJFQ1RJVkVfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9ESVJFQ1RJVkVfQ0xPU0UsIEpTUF9DTE9TRX0pOw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7DQotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7DQotCQl9DQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JCX0NCi0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JCX0NCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotCX0NCi19DQotDQotDQotPFNUX0pTUF9ESVJFQ1RJVkVfTkFNRT4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJKU1AgZGlyZWN0aXZlIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0UpOw0KLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9OQU1FOw0KLX0NCi08U1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0U+IHtTfT8gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIndoaXRlIHNwYWNlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUpOw0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLTxTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FLCBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLX0NCi08U1RfSlNQX0RJUkVDVElWRV9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotPFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFPiB7QXR0VmFsdWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi19DQotPFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSwgU1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0UsIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTLCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRT4ge2pzcFNjcmlwdGxldEVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkpTUCBlbmQiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9DTE9TRTsNCi19DQotDQotPFlZSU5JVElBTD4ge2pzcENvbW1lbnRTdGFydH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOw0KLQlyZXR1cm4gSlNQX0NPTU1FTlRfT1BFTjsNCi19DQotDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRD4gXHgyNFx4N2Igew0KLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JeXliZWdpbihTVF9KU1BfRFFVT1RFRF9FTCk7DQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSwgSlNQX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFfSk7DQotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIGRvdWJsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgRUwNCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSkgfHwgZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSkpIHsNCi0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOw0KLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQl9DQotCWVsc2Ugew0KLQkJeXliZWdpbihlbnRlclN0YXRlKTsNCi0JfQ0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRD4gXHgyM1x4N2Igew0KLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JeXliZWdpbihTVF9KU1BfRFFVT1RFRF9WQkwpOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9WQkxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSwgSlNQX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFfSk7DQotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIGRvdWJsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgVkJMDQotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpIHx8IGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhKU1BfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpKSB7DQotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsNCi0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JfQ0KLQllbHNlIHsNCi0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7DQotCX0NCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ+IFx4MjRceDdiIHsNCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7DQotCXl5YmVnaW4oU1RfSlNQX1NRVU9URURfRUwpOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0VMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUsIEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URX0pOw0KLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBzaW5nbGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIEVMDQotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpIHx8IGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhKU1BfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpKSB7DQotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsNCi0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JfQ0KLQllbHNlIHsNCi0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7DQotCX0NCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ+IFx4MjNceDdiIHsNCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7DQotCXl5YmVnaW4oU1RfSlNQX1NRVU9URURfVkJMKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUsIEpTUF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URX0pOw0KLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBzaW5nbGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIFZCTA0KLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSB8fCBmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoSlNQX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSkgew0KLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7DQotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCX0NCi0JZWxzZSB7DQotCQl5eWJlZ2luKGVudGVyU3RhdGUpOw0KLQl9DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi0NCi0vLyB1bmVzY2FwZWQgZG91YmxlIHF1b3RlLCByZXR1cm4gYXMgZW5kaW5nIHJlZ2lvbg0KLTxTVF9KU1BfRFFVT1RFRF9FTCxTVF9KU1BfRFFVT1RFRF9WQkw+IFsiXSB7DQotCXJldHVybiBpc0pzcFRhZygpID8gSlNQX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFOiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEU7DQotfQ0KLS8vIHVuZXNjYXBlZCBzaW5nbGUgcXVvdGUsIHJldHVybiBhcyBlbmRpbmcgcmVnaW9uDQotPFNUX0pTUF9TUVVPVEVEX0VMLFNUX0pTUF9TUVVPVEVEX1ZCTD4gWyddIHsNCi0JcmV0dXJuIGlzSnNwVGFnKCkgPyBKU1BfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUgOiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEU7DQotfQ0KLQ0KLQ0KLS8vIHBhaXJlZCBlc2NhcGVkIGRvdWJsZSBxdW90ZXMNCi08U1RfSlNQX0RRVU9URURfRUw+IFxcXCIgKFteXFxdfFxcW14ifV0rKSogXFxcIiB7DQotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLS8vIGV2ZXJ5dGhpbmcgZWxzZSBFTA0KLTxTVF9KU1BfRFFVT1RFRF9FTD4gKFteXFx9Il18XFxbXiJdKSsgew0KLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRFFVT1RFRF9FTD4gXFxcIiB7DQotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsNCi19DQotLy8gcGFpcmVkIGVzY2FwZWQgcXVvdGVzDQotPFNUX0pTUF9TUVVPVEVEX0VMPiBcXFwnIChbXlxcXXxcXFteJ31dKykqIFxcXCcgew0KLQlyZXR1cm4gSlNQX0VMX1FVT1RFRF9DT05URU5UOw0KLX0NCi0vLyBldmVyeXRoaW5nIGVsc2UgRUwNCi08U1RfSlNQX1NRVU9URURfRUw+IChbXlxcfSddfFxcW14nXSkrIHsNCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOw0KLX0NCi08U1RfSlNQX1NRVU9URURfRUw+IFxcXCcgew0KLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRFFVT1RFRF9FTCxTVF9KU1BfU1FVT1RFRF9FTD4gfSB7DQotCXJldHVybiBKU1BfRUxfQ0xPU0U7DQotfQ0KLQ0KLQ0KLS8vIHBhaXJlZCBlc2NhcGVkIHF1b3Rlcw0KLTxTVF9KU1BfRFFVT1RFRF9WQkw+IFxcXCIgKFteXFxdfFxcW14ifV0rKSogXFxcIiB7DQotCXJldHVybiBKU1BfVkJMX1FVT1RFRF9DT05URU5UOw0KLX0NCi0vLyBldmVyeXRoaW5nIGVsc2UgVkJMDQotPFNUX0pTUF9EUVVPVEVEX1ZCTD4gKFteXFx9Il18XFxbXiJdKSsgew0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOw0KLX0NCi08U1RfSlNQX0RRVU9URURfVkJMPiBcXFwiIHsNCi0JcmV0dXJuIEpTUF9WQkxfQ09OVEVOVDsNCi19DQotLy8gcGFpcmVkIGVzY2FwZWQgcXVvdGVzDQotPFNUX0pTUF9TUVVPVEVEX1ZCTD4gXFxcJyAoW15cXF18XFxbXid9XSspKiBcXFwnIHsNCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLS8vIGV2ZXJ5dGhpbmcgZWxzZSBWQkwNCi08U1RfSlNQX1NRVU9URURfVkJMPiAoW15cXH0nXXxcXFteJ10pKyB7DQotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfU1FVT1RFRF9WQkw+IFxcXCcgew0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOw0KLX0NCi0NCi08U1RfSlNQX0RRVU9URURfVkJMLFNUX0pTUF9TUVVPVEVEX1ZCTD4gfSB7DQotCXJldHVybiBKU1BfVkJMX0NMT1NFOw0KLX0NCi0NCi0NCi0vLyBYTUwgY29udGVudCBhcmVhIEVMDQotPFlZSU5JVElBTD4gXHgyNFx4N2JbXlx4N2RdKi9ceDdkIHsNCi0JeXliZWdpbihTVF9KU1BfRUwpOw0KLQlpZih5eWxlbmd0aCgpID4gMikNCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDIpOw0KLQlmRUxsZXZlbCsrOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgSlNQX0VMX0NMT1NFKTsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOw0KLQl5eWJlZ2luKFlZSU5JVElBTCk7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi08U1RfSlNQX0VMPiBceDI0XHg3YiB7DQotCWZFTGxldmVsKys7DQotCWlmKGZFTGxldmVsID09IDEpIHsNCi0JCXJldHVybiBKU1BfRUxfT1BFTjsNCi0JfQ0KLX0NCi0vLyBYTUwgY29udGVudCBhcmVhIFZCTA0KLTxZWUlOSVRJQUw+IFx4MjNceDdiW15ceDdkXSovXHg3ZCB7DQotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7DQotCWlmKHl5bGVuZ3RoKCkgPiAyKQ0KLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMik7DQotCWZFTGxldmVsKys7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgSlNQX1ZCTF9DTE9TRSk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsNCi0JeXliZWdpbihZWUlOSVRJQUwpOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX0pTUF9WQkw+IFx4MjNceDdiIHsNCi0JZkVMbGV2ZWwrKzsNCi0JaWYoZkVMbGV2ZWwgPT0gMSkgew0KLQkJcmV0dXJuIEpTUF9WQkxfT1BFTjsNCi0JfQ0KLX0NCi0vLyByZXR1cm4gYW55dGhpbmcgbm90IHN0YXJ0aW5nIHF1b3RlcyBvciBlbmRpbmcgdGhlIFZCTCBhcyBjb250ZW50DQotPFNUX0pTUF9WQkw+IFteXHg3ZFx4MjJceDI3XSogew0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOw0KLX0NCi0vLyByZXR1cm4gYW55dGhpbmcgbm90IHN0YXJ0aW5nIHF1b3RlcyBvciBlbmRpbmcgdGhlIEVMIGFzIGNvbnRlbnQNCi08U1RfSlNQX0VMPiBbXlx4N2RceDIyXHgyN10qIHsNCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOw0KLX0NCi0NCi0NCi0vLyBxdW90ZXMNCi08U1RfSlNQX0VMPiBceDIyIHsNCi0JeXliZWdpbihTVF9KU1BfRUxfRFFVT1RFUyk7DQotCXJldHVybiBKU1BfRUxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX0VMX0RRVU9URVM+IFx4MjIgew0KLQl5eWJlZ2luKFNUX0pTUF9FTCk7DQotCXJldHVybiBKU1BfRUxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX0VMX0RRVU9URVM+IFteXHgyMl0rL1x4MjIgew0KLQl5eWJlZ2luKFNUX0pTUF9FTF9EUVVPVEVTX0VORCk7DQotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRUxfRFFVT1RFU19FTkQ+IFx4MjIgew0KLQl5eWJlZ2luKFNUX0pTUF9FTCk7DQotCXJldHVybiBKU1BfRUxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX0VMPiBceDI3IHsNCi0JeXliZWdpbihTVF9KU1BfRUxfU1FVT1RFUyk7DQotCXJldHVybiBKU1BfRUxfU1FVT1RFOw0KLX0NCi08U1RfSlNQX0VMX1NRVU9URVM+IFx4Mjcgew0KLQl5eWJlZ2luKFNUX0pTUF9FTCk7DQotCXJldHVybiBKU1BfRUxfU1FVT1RFOw0KLX0NCi08U1RfSlNQX0VMX1NRVU9URVM+IFteXHgyN10rL1x4Mjcgew0KLQl5eWJlZ2luKFNUX0pTUF9FTF9TUVVPVEVTX0VORCk7DQotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRUxfU1FVT1RFU19FTkQ+IFx4Mjcgew0KLQl5eWJlZ2luKFNUX0pTUF9FTCk7DQotCXJldHVybiBKU1BfRUxfU1FVT1RFOw0KLX0NCi0vLyBxdW90ZXMNCi08U1RfSlNQX1ZCTD4gXHgyMiB7DQotCXl5YmVnaW4oU1RfSlNQX1ZCTF9EUVVPVEVTKTsNCi0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTF9EUVVPVEVTPiBceDIyIHsNCi0JeXliZWdpbihTVF9KU1BfVkJMKTsNCi0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTF9EUVVPVEVTPiBbXlx4MjJdKy9ceDIyIHsNCi0JeXliZWdpbihTVF9KU1BfVkJMX0RRVU9URVNfRU5EKTsNCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfVkJMX0RRVU9URVNfRU5EPiBceDIyIHsNCi0JeXliZWdpbihTVF9KU1BfVkJMKTsNCi0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTD4gXHgyNyB7DQotCXl5YmVnaW4oU1RfSlNQX1ZCTF9TUVVPVEVTKTsNCi0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTF9TUVVPVEVTPiBceDI3IHsNCi0JeXliZWdpbihTVF9KU1BfVkJMKTsNCi0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTF9TUVVPVEVTPiBbXlx4MjddKy9ceDI3IHsNCi0JeXliZWdpbihTVF9KU1BfVkJMX1NRVU9URVNfRU5EKTsNCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfVkJMX1NRVU9URVNfRU5EPiBceDI3IHsNCi0JeXliZWdpbihTVF9KU1BfVkJMKTsNCi0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOw0KLX0NCi0NCi0vLyB1bnF1b3RlZCBjb250ZW50DQotPFNUX0pTUF9FTD4gKFtefVx4MjdceDIyXHgyNF18XHgyNFteXHg3Ylx4MjdceDIyXSkrIHsNCi0JLy9TeXN0ZW0ub3V0LnByaW50bG4oSlNQX0VMX0NPTlRFTlQrICI6WyIgKyB5eXRleHQoKSArICJdIik7DQotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsNCi19DQotPFNUX0pTUF9FTD4gfSB7DQotCWZFTGxldmVsLS07DQotCWlmKGZFTGxldmVsID09IDApIHsNCi0JCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JCXJldHVybiBKU1BfRUxfQ0xPU0U7DQotCX0NCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOw0KLX0NCi08U1RfSlNQX1ZCTD4gfSB7DQotCWZFTGxldmVsLS07DQotCWlmKGZFTGxldmVsID09IDApIHsNCi0JCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JCXJldHVybiBKU1BfVkJMX0NMT1NFOw0KLQl9DQotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7DQotfQ0KLS8vIEVMIHVucXVvdGVkIGluIHRhZyAoc2VjdGlvbiAyLjEgZGVjbGFyZXMgaXQgYXMgdmFsaWQgaW4gdGVtcGxhdGUgdGV4dCAoWE1MX0NPTlRFTlQpIG9yIGF0dHJpYnV0ZSB2YWx1ZXMNCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRSwgU1RfSlNQX0FUVFJJQlVURV9WQUxVRT4gXHgyNFx4N2JbXlx4N2RdKy9ceDdkIHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQrIiwgZWwtdW5xdW90ZWQiKTsvLyROT04tTkxTLTEkDQotCX0NCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoeXlsZW5ndGgoKSA+IDIpDQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLTIpOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkVMIGluIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfSlNQX0VMKTsNCi0JZkVMbGV2ZWwrKzsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9FTF9DTE9TRX0pOw0KLQlmU3RhdGVTdGFjay5wb3AoKTsNCi0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLS8vIFZCTCB1bnF1b3RlZCBpbiB0YWcgb3IgYXR0cmlidXRlIHZhbHVlcw0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFLCBTVF9KU1BfQVRUUklCVVRFX1ZBTFVFPiBceDIzXHg3YlteXHg3ZF0rL1x4N2Qgew0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCsiLCBlbC11bnF1b3RlZCIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZih5eWxlbmd0aCgpID4gMikNCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtMik7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiVkJMIGluIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7DQotCWZFTGxldmVsKys7DQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX1ZCTF9DTE9TRX0pOw0KLQlmU3RhdGVTdGFjay5wb3AoKTsNCi0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLQ0KLTxTVF9KU1BfQ09NTUVOVD4gLnxccnxcbiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5KU1AgY29tbWVudCB0ZXh0Iik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7DQotfQ0KLTxTVF9KU1BfQ09NTUVOVF9FTkQ+IHtqc3BDb21tZW50RW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5KU1AgY29tbWVudCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihZWUlOSVRJQUwpOw0KLQlyZXR1cm4gSlNQX0NPTU1FTlRfQ0xPU0U7DQotfQ0KLQ0KLS8vIFhNTCBtaXNjDQotDQote0NEU3RhcnR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbkNEQVRBIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCXl5YmVnaW4oU1RfQ0RBVEFfVEVYVCk7DQotCXJldHVybiBYTUxfQ0RBVEFfT1BFTjsNCi19DQotPFNUX0NEQVRBX1RFWFQ+IC58XHJ8XG4gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkNEQVRBIHRleHQiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsNCi0JU3RyaW5nIHJldHVybmVkQ29udGV4dCA9IGRvU2NhbigiXV0+IiwgZmFsc2UsIHRydWUsIHRydWUsIFhNTF9DREFUQV9URVhULCBTVF9DREFUQV9FTkQsICBTVF9DREFUQV9FTkQpOy8vJE5PTi1OTFMtMSQNCi0JaWYocmV0dXJuZWRDb250ZXh0ID09IFhNTF9DREFUQV9URVhUKQ0KLQkJeXliZWdpbihTVF9DREFUQV9FTkQpOw0KLQlyZXR1cm4gcmV0dXJuZWRDb250ZXh0Ow0KLX0NCi08U1RfQ0RBVEFfRU5EPiB7Q0RFbmR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJDREFUQSBlbmQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0NEQVRBX0NMT1NFOw0KLX0NCi0NCi08WVlJTklUSUFMPiB7UEVSZWZlcmVuY2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcblBFUmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX1BFX1JFRkVSRU5DRTsNCi19DQotPFlZSU5JVElBTD4ge0NoYXJSZWZ9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbkNoYXJSZWYiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfQ0hBUl9SRUZFUkVOQ0U7DQotfQ0KLTxZWUlOSVRJQUw+IHtFbnRpdHlSZWZ9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbkVudGl0eVJlZiIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9FTlRJVFlfUkVGRVJFTkNFOw0KLX0NCi0NCi08WVlJTklUSUFMPiB7UElzdGFydH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxucHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9QSSk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX09QRU47DQotfQ0KLS8vIHRoZSBuZXh0IGZvdXIgYXJlIG9yZGVyIGRlcGVuZGVudA0KLTxTVF9QST4gKChYfHgpKE18bSkoTHxsKSkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOw0KLX0NCi08U1RfUEk+IChbaUldW21NXVtwUF1bb09dW3JSXVt0VF0pIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QST4geG1sLXN0eWxlc2hlZXQgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhTTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QST4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOw0KLSAgICAgICAgeXliZWdpbihTVF9QSV9XUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOw0KLX0NCi08U1RfUElfV1M+IHtTfSsgew0KLSAgICAgICAgeXliZWdpbihTVF9QSV9DT05URU5UKTsNCi0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsNCi19DQotPFNUX1BJLCBTVF9QSV9XUz4gXD8+IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7DQotfQ0KLTxTVF9QSV9DT05URU5UPiAuIHsNCi0JCS8vIGJsb2NrIHNjYW4gdW50aWwgY2xvc2UgaXMgZm91bmQNCi0JcmV0dXJuIGRvU2NhbigiPz4iLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBYTUxfUElfQ09OVEVOVCwgU1RfWE1MX1BJX1RBR19DTE9TRSwgU1RfWE1MX1BJX1RBR19DTE9TRSk7DQotfQ0KLTxTVF9QSV9DT05URU5ULFNUX1hNTF9QSV9UQUdfQ0xPU0U+IFw/PiB7DQotCQkvLyBlbmRlZCB3aXRoIG5vdGhpbmcgaW5zaWRlDQotCQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsNCi19DQotDQotPFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX1BJX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0VRVUFMUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi19DQotPFNUX1hNTF9QSV9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotLyogdGhlIHZhbHVlIHdhcyBmb3VuZCwgbG9vayBmb3IgdGhlIG5leHQgbmFtZSAqLw0KLTxTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFPiB7QXR0VmFsdWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLX0NCi0vKiB0aGUgUEkncyBjbG9zZSB3YXMgZm91bmQgKi8NCi08U1RfWE1MX1BJX0VRVUFMUywgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFPiB7UEllbmR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOw0KLX0NCi0vLyBESFRNTA0KLTxTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSwgU1RfREhUTUxfRVFVQUxTPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0VRVUFMUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi19DQotPFNUX0RIVE1MX0VRVUFMUz4ge0VxfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotLyogdGhlIHZhbHVlIHdhcyBmb3VuZCwgbG9vayBmb3IgdGhlIG5leHQgbmFtZSAqLw0KLTxTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gfCAoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLX0NCi0vKiBUaGUgREhUTUwgUEkncyBjbG9zZSB3YXMgZm91bmQgKi8NCi08U1RfREhUTUxfRVFVQUxTLCBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSwgU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFPiBbL10qPiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOw0KLX0NCi0NCi0vLyBYTUwgZGVjbGFyYXRpb25zDQotDQotPFlZSU5JVElBTCwgU1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUsIFNUX0pTUF9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljVGFnT3Blbn0hIHsNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTik7DQotCXJldHVybiBYTUxfREVDTEFSQVRJT05fT1BFTjsNCi19DQotPFNUX1hNTF9ERUNMQVJBVElPTj4gW0VlXVtMbF1bRWVdW01tXVtFZV1bTm5dW1R0XSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTik7DQotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMQVJBVElPTjsNCi19DQotPFNUX1hNTF9ERUNMQVJBVElPTj4gW0RkXVtPb11bQ2NdW1R0XVtZeV1bUHBdW0VlXSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTik7DQotCXJldHVybiBYTUxfRE9DVFlQRV9ERUNMQVJBVElPTjsNCi19DQotPFNUX1hNTF9ERUNMQVJBVElPTj4gW0FhXVtUdF1bVHRdW0xsXVtJaV1bU3NdW1R0XSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTik7DQotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMQVJBVElPTjsNCi19DQotDQotLy8gYmVnaW4gRE9DVFlQRSBoYW5kbGluZyBwcm9jZWR1cmUNCi08U1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04sIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lELCBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0sIFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQywgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFPiBcW1teXF1dKlxdIHsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVDsNCi19DQotDQotPFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImRvY3R5cGUgdHlwZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9OQU1FOw0KLX0NCi08U1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQ+IFtQcF1bVXVdW0JiXVtMbF1bSWldW0NjXSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMpOw0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDOw0KLX0NCi08U1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQ+IFtTc11bWXldW1NzXVtUdF1bRWVdW01tXSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOw0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNOw0KLX0NCi08U1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDPiB7QXR0VmFsdWV9fHtQdWJpZExpdGVyYWx9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIHB1YmxpYyByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOw0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOw0KLX0NCi08U1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNPiB7QXR0VmFsdWV9fHtTeXN0ZW1MaXRlcmFsfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSBzeXN0ZW0gcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7DQotCXl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsNCi19DQotLy8gZW5kIERPQ1RZUEUgaGFuZGxpbmcNCi0NCi0vLyBiZWdpbiBFTEVNRU5UIGhhbmRsaW5nIHByb2NlZHVyZQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTj4ge0F0dFZhbHVlfXx7UHViaWRMaXRlcmFsfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudGRlY2wgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOw0KLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOw0KLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9OQU1FOw0KLX0NCi08U1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVD4gW14+XSogew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9DT05URU5UOw0KLX0NCi0NCi08U1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVD4ge2dlbmVyaWNUYWdDbG9zZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNsb3NlIik7Ly8kTk9OLU5MUy0xJA0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsNCi19DQotLy8gZW5kIEVMRU1FTlQgaGFuZGxpbmcNCi0NCi0vLyBiZWdpbiBBVFRMSVNUIGhhbmRsaW5nIHByb2NlZHVyZQ0KLTxTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTj4ge0F0dFZhbHVlfXx7UHViaWRMaXRlcmFsfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7DQotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCk7DQotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX05BTUU7DQotfQ0KLTxTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UPiBbXj5dKiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfQ09OVEVOVDsNCi19DQotDQotPFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQ+IHtnZW5lcmljVGFnQ2xvc2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0IGNsb3NlIik7Ly8kTk9OLU5MUy0xJA0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsNCi19DQotLy8gZW5kIEFUVExJU1QgaGFuZGxpbmcNCi0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQsIFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiwgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFLCBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMsIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQ+IHtnZW5lcmljVGFnQ2xvc2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkZWNsYXJhdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOw0KLX0NCi0vLyBlbmQgREVDTEFSQVRJT04gaGFuZGxpbmcNCi0NCi08WVlJTklUSUFMPiAoW148JiVceDI0XHgyM10qfFx4MjMrfFx4MjQrfFsmJV17U30re05hbWV9W14mJTxdKnxbXHgyNFx4MjNdW15ceDdiPCYlXVtePCYlXHgyNFx4MjNdKnxcXFtceDI0XHgyM11bXHg3Yl18WyYlXXtOYW1lfShbXjsmJTxdKnx7U30rOyopKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5YTUwgY29udGVudCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9DT05URU5UOw0KLX0NCi0NCi0NCi08U1RfQkxPQ0tfVEFHX1NDQU4+IC58XHJ8XG4gew0KLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7DQotCX0NCi0NCi0uIHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJU3lzdGVtLm91dC5wcmludGxuKCIhISF1bmV4cGVjdGVkISEhOiBcIiIgKyB5eXRleHQoKSArICJcIjoiICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQNCi0JCQl5eWNoYXIgKyAiLSIgKyAoeXljaGFyICsgeXlsZW5ndGgoKSkpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFVOREVGSU5FRDsNCi19DQotDQotXDA0MCB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiU1BBQ0UiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBXSElURV9TUEFDRTsNCi19DQotXDAxMSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiMHg5Iik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLVwwMTUgDQotew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkNBUlJJQUdFIFJFVFVSTiIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi1cMDEyIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJMSU5FIEZFRUQiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBXSElURV9TUEFDRTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9YTUxUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvWE1MVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NjA3YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9YTUxUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MzcgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gMTAvMTcvMDcgNDoyNyBBTSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuWE1MUGFyc2VyUmVnaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDEwLzE3LzA3IDQ6MjcgQU0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovZWNsaXBzZS53dHAvd29ya3NwYWNlL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL1hNTFRva2VuaXplci5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxUb2tlbml6ZXIgaW1wbGVtZW50cyBCbG9ja1Rva2VuaXplciwgRE9NUmVnaW9uQ29udGV4dCB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEID0gMjM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQgPSAyNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfQVRUUklCVVRFX05BTUUgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX1RBR19DTE9TRSA9IDExOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UgPSAyMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSA9IDEwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9FUVVBTFMgPSAxMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1RBR19OQU1FID0gMTY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUgPSAxOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFID0gMTQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSA9IDI1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX05BTUUgPSAxNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04gPSAyNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04gPSAyMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04gPSAyODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0NPTU1FTlRfRU5EID0gNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0RBVEFfVEVYVCA9IDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX1RBR19DTE9TRSA9IDE1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQ09NTUVOVCA9IDM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX0NPTlRFTlQgPSA3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSV9XUyA9IDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NEQVRBX0VORCA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQgPSAyOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQkxPQ0tfVEFHX1NDQU4gPSAzMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0VRVUFMUyA9IDk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTiA9IDIwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMgPSAyNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VRVUFMUyA9IDE4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSSA9IDU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSA9IDg7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gCi0gICAgIlwxMVwwXDFcNVwxXDIyXDJcMFwxXDE0XDIyXDBcMVwxNFwxXDIxXDFcMTFcMVw1NSIrCi0gICAgIlwxXDE2XDFcMTdcMVwxMlwxXDEzXDFcMTZcMVwxNlwxXDE2XDFcMTZcMVwxNlwxXDciKwotICAgICJcMVw2XDFcM1wxMlwxNVwxXDEwXDFcNjFcMVwxXDFcNDVcMVwyXDFcNFwxXDE2IisKLSAgICAiXDFcMzRcMVw2MlwxXDMyXDFcMzNcMVw1MFwxXDU3XDFcMzZcMVwzNlwxXDQyXDFcMzYiKwotICAgICJcMVwzNlwxXDI3XDFcMjVcMVw0NFwxXDQzXDFcNDdcMVwzNlwxXDQwXDFcNTZcMVwzNSIrCi0gICAgIlwxXDYwXDJcMzZcMVwyM1wxXDQ2XDFcMzZcMVwzMVwxXDBcMVwyMFwxXDBcMVwxMCIrCi0gICAgIlwxXDBcMVw1MlwxXDYyXDFcNjNcMVw1M1wxXDM3XDFcNTdcMVwzNlwxXDY2XDFcNDIiKwotICAgICJcMlwzNlwxXDMwXDFcMjZcMVw0NFwxXDQzXDFcNDdcMVwzNlwxXDQwXDFcNDFcMVw1MSIrCi0gICAgIlwxXDYwXDFcMzZcMVwzNlwxXDI0XDFcNTRcMVwzNlwxXDBcMVwwXDcyXDBcMVw2NSIrCi0gICAgIlwxMFwwXDI3XDY0XDFcMFwzN1w2NFwxXDBcNzJcNjRcMlwwXDEzXDY0XDJcMFwxMFw2NCIrCi0gICAgIlwxXDBcNjVcNjRcMVwwXDEwNFw2NFwxMVwwXDQ0XDY0XDNcMFwyXDY0XDRcMFwzNlw2NCIrCi0gICAgIlw3MFwwXDEzMVw2NFwyMlwwXDdcNjRcMTZcMFwyXDY1XDU2XDBcMTA2XDY1XDMyXDBcMlw2NSIrCi0gICAgIlw0NFwwXDFcNjRcMVw2NVwzXDY0XDFcMFwxXDY0XDFcMFwyNFw2NFwxXDBcNTRcNjQiKwotICAgICJcMVwwXDdcNjRcM1wwXDFcNjRcMVwwXDFcNjRcMVwwXDFcNjRcMVwwXDFcNjQiKwotICAgICJcMVwwXDIyXDY0XDE1XDBcMTRcNjRcMVwwXDEwMlw2NFwxXDBcMTRcNjRcMVwwXDQ0XDY0IisKLSAgICAiXDFcMFw0XDY1XDExXDBcNjVcNjRcMlwwXDJcNjRcMlwwXDJcNjRcM1wwXDM0XDY0IisKLSAgICAiXDJcMFwxMFw2NFwyXDBcMlw2NFw2N1wwXDQ2XDY0XDJcMFwxXDY0XDdcMFw0Nlw2NCIrCi0gICAgIlwxMlwwXDIxXDY1XDFcMFwyN1w2NVwxXDBcM1w2NVwxXDBcMVw2NVwxXDBcMlw2NSIrCi0gICAgIlwxXDBcMVw2NVwxM1wwXDMzXDY0XDVcMFwzXDY0XDU2XDBcMzJcNjRcNVwwXDFcNjUiKwotICAgICJcMTJcNjRcMTBcNjVcMTVcMFwxMlw2NVw2XDBcMVw2NVwxMDdcNjRcMlwwXDVcNjRcMVwwIisKLSAgICAiXDE3XDY0XDFcMFw0XDY0XDFcMFwxXDY0XDE3XDY1XDJcNjRcMlw2NVwxXDBcNFw2NSIrCi0gICAgIlwyXDBcMTJcNjVcdTAyMDdcMFwzXDY1XDFcMFw2NVw2NFwyXDBcMVw2NVwxXDY0XDIwXDY1IisKLSAgICAiXDNcMFw0XDY1XDNcMFwxMlw2NFwyXDY1XDJcMFwxMlw2NVwyMVwwXDNcNjVcMVwwIisKLSAgICAiXDEwXDY0XDJcMFwyXDY0XDJcMFwyNlw2NFwxXDBcN1w2NFwxXDBcMVw2NFwzXDAiKwotICAgICJcNFw2NFwyXDBcMVw2NVwxXDBcN1w2NVwyXDBcMlw2NVwyXDBcM1w2NVwxMVwwIisKLSAgICAiXDFcNjVcNFwwXDJcNjRcMVwwXDNcNjRcMlw2NVwyXDBcMTJcNjVcMlw2NFwyMFwwIisKLSAgICAiXDFcNjVcMlwwXDZcNjRcNFwwXDJcNjRcMlwwXDI2XDY0XDFcMFw3XDY0XDFcMCIrCi0gICAgIlwyXDY0XDFcMFwyXDY0XDFcMFwyXDY0XDJcMFwxXDY1XDFcMFw1XDY1XDRcMCIrCi0gICAgIlwyXDY1XDJcMFwzXDY1XDEzXDBcNFw2NFwxXDBcMVw2NFw3XDBcMTJcNjVcMlw2NSIrCi0gICAgIlwzXDY0XDE0XDBcM1w2NVwxXDBcN1w2NFwxXDBcMVw2NFwxXDBcM1w2NFwxXDAiKwotICAgICJcMjZcNjRcMVwwXDdcNjRcMVwwXDJcNjRcMVwwXDVcNjRcMlwwXDFcNjVcMVw2NCIrCi0gICAgIlwxMFw2NVwxXDBcM1w2NVwxXDBcM1w2NVwyMlwwXDFcNjRcNVwwXDEyXDY1XDIxXDAiKwotICAgICJcM1w2NVwxXDBcMTBcNjRcMlwwXDJcNjRcMlwwXDI2XDY0XDFcMFw3XDY0XDFcMCIrCi0gICAgIlwyXDY0XDJcMFw0XDY0XDJcMFwxXDY1XDFcNjRcNlw2NVwzXDBcMlw2NVwyXDAiKwotICAgICJcM1w2NVwxMFwwXDJcNjVcNFwwXDJcNjRcMVwwXDNcNjRcNFwwXDEyXDY1XDIyXDAiKwotICAgICJcMlw2NVwxXDBcNlw2NFwzXDBcM1w2NFwxXDBcNFw2NFwzXDBcMlw2NFwxXDAiKwotICAgICJcMVw2NFwxXDBcMlw2NFwzXDBcMlw2NFwzXDBcM1w2NFwzXDBcMTBcNjRcMVwwIisKLSAgICAiXDNcNjRcNFwwXDVcNjVcM1wwXDNcNjVcMVwwXDRcNjVcMTFcMFwxXDY1XDE3XDAiKwotICAgICJcMTFcNjVcMjFcMFwzXDY1XDFcMFwxMFw2NFwxXDBcM1w2NFwxXDBcMjdcNjRcMVwwIisKLSAgICAiXDEyXDY0XDFcMFw1XDY0XDRcMFw3XDY1XDFcMFwzXDY1XDFcMFw0XDY1XDdcMCIrCi0gICAgIlwyXDY1XDExXDBcMlw2NFw0XDBcMTJcNjVcMjJcMFwyXDY1XDFcMFwxMFw2NFwxXDAiKwotICAgICJcM1w2NFwxXDBcMjdcNjRcMVwwXDEyXDY0XDFcMFw1XDY0XDRcMFw3XDY1XDFcMCIrCi0gICAgIlwzXDY1XDFcMFw0XDY1XDdcMFwyXDY1XDdcMFwxXDY0XDFcMFwyXDY0XDRcMCIrCi0gICAgIlwxMlw2NVwyMlwwXDJcNjVcMVwwXDEwXDY0XDFcMFwzXDY0XDFcMFwyN1w2NFwxXDAiKwotICAgICJcMjBcNjRcNFwwXDZcNjVcMlwwXDNcNjVcMVwwXDRcNjVcMTFcMFwxXDY1XDEwXDAiKwotICAgICJcMlw2NFw0XDBcMTJcNjVcMjIxXDBcNTZcNjRcMVwwXDFcNjRcMVw2NVwyXDY0XDdcNjUiKwotICAgICJcNVwwXDZcNjRcMVw2NVwxMFw2NVwxXDBcMTJcNjVcNDdcMFwyXDY0XDFcMFwxXDY0IisKLSAgICAiXDJcMFwyXDY0XDFcMFwxXDY0XDJcMFwxXDY0XDZcMFw0XDY0XDFcMFw3XDY0IisKLSAgICAiXDFcMFwzXDY0XDFcMFwxXDY0XDFcMFwxXDY0XDJcMFwyXDY0XDFcMFwyXDY0IisKLSAgICAiXDFcMFwxXDY0XDFcNjVcMlw2NFw2XDY1XDFcMFwyXDY1XDFcNjRcMlwwXDVcNjQiKwotICAgICJcMVwwXDFcNjVcMVwwXDZcNjVcMlwwXDEyXDY1XDc2XDBcMlw2NVw2XDBcMTJcNjUiKwotICAgICJcMTNcMFwxXDY1XDFcMFwxXDY1XDFcMFwxXDY1XDRcMFwyXDY1XDEwXDY0XDFcMCIrCi0gICAgIlw0MVw2NFw3XDBcMjRcNjVcMVwwXDZcNjVcNFwwXDZcNjVcMVwwXDFcNjVcMVwwIisKLSAgICAiXDI1XDY1XDNcMFw3XDY1XDFcMFwxXDY1XDM0NlwwXDQ2XDY0XDEyXDBcNDdcNjRcMTFcMCIrCi0gICAgIlwxXDY0XDFcMFwyXDY0XDFcMFwzXDY0XDFcMFwxXDY0XDFcMFwyXDY0XDFcMCIrCi0gICAgIlw1XDY0XDUxXDBcMVw2NFwxXDBcMVw2NFwxXDBcMVw2NFwxM1wwXDFcNjRcMVwwIisKLSAgICAiXDFcNjRcMVwwXDFcNjRcM1wwXDJcNjRcM1wwXDFcNjRcNVwwXDNcNjRcMVwwIisKLSAgICAiXDFcNjRcMVwwXDFcNjRcMVwwXDFcNjRcMVwwXDFcNjRcM1wwXDJcNjRcM1wwIisKLSAgICAiXDJcNjRcMVwwXDFcNjRcNTBcMFwxXDY0XDExXDBcMVw2NFwyXDBcMVw2NFwyXDAiKwotICAgICJcMlw2NFw3XDBcMlw2NFwxXDBcMVw2NFwxXDBcN1w2NFw1MFwwXDFcNjRcNFwwIisKLSAgICAiXDFcNjRcMTBcMFwxXDY0XHUwYzA2XDBcMjM0XDY0XDRcMFwxMzJcNjRcNlwwXDI2XDY0XDJcMCIrCi0gICAgIlw2XDY0XDJcMFw0Nlw2NFwyXDBcNlw2NFwyXDBcMTBcNjRcMVwwXDFcNjRcMVwwIisKLSAgICAiXDFcNjRcMVwwXDFcNjRcMVwwXDM3XDY0XDJcMFw2NVw2NFwxXDBcN1w2NFwxXDAiKwotICAgICJcMVw2NFwzXDBcM1w2NFwxXDBcN1w2NFwzXDBcNFw2NFwyXDBcNlw2NFw0XDAiKwotICAgICJcMTVcNjRcNVwwXDNcNjRcMVwwXDdcNjRcMzIzXDBcMTVcNjVcNFwwXDFcNjVcMTA0XDAiKwotICAgICJcMVw2NFwzXDBcMlw2NFwyXDBcMVw2NFwxMjFcMFwzXDY0XHUwZTgyXDBcMVw2NVwxXDAiKwotICAgICJcMVw2NFwzMVwwXDExXDY0XDZcNjVcMVwwXDVcNjVcMTNcMFwxMjRcNjRcNFwwXDJcNjUiKwotICAgICJcMlwwXDJcNjVcMlwwXDEzMlw2NFwxXDBcM1w2NVw2XDBcNTBcNjRcdTFjZDNcMFx1NTFhNlw2NCIrCi0gICAgIlx1MGM1YVwwXHUyYmE0XDY0XDEzNFwwXHUwODAwXDBcdTFmZmVcMFwyXDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXlfcm93TWFwIFtdID0geyAKLSAgICAgICAgMCwgICAgNTUsICAgMTEwLCAgIDE2NSwgICAyMjAsICAgMjc1LCAgIDMzMCwgICAzODUsICAgNDQwLCAgIDQ5NSwgCi0gICAgICA1NTAsICAgNjA1LCAgIDY2MCwgICA3MTUsICAgNzcwLCAgIDgyNSwgICA4ODAsICAgOTM1LCAgIDk5MCwgIDEwNDUsIAotICAgICAxMTAwLCAgMTE1NSwgIDEyMTAsICAxMjY1LCAgMTMyMCwgIDEzNzUsICAxNDMwLCAgMTQ4NSwgIDE1NDAsICAxNTk1LCAKLSAgICAgMTY1MCwgIDE3MDUsICAxNzYwLCAgMTgxNSwgIDE4NzAsICAxOTI1LCAgMTk4MCwgIDE5MjUsICAxOTgwLCAgMjAzNSwgCi0gICAgIDE5MjUsICAxOTI1LCAgMTk4MCwgIDIwOTAsICAyMTQ1LCAgMjIwMCwgIDIyNTUsICAyMzEwLCAgMjM2NSwgIDI0MjAsIAotICAgICAyNDc1LCAgMTkyNSwgIDE5ODAsICAyNTMwLCAgMjU4NSwgIDI2NDAsICAxOTI1LCAgMjY5NSwgIDI2OTUsICAyNzUwLCAKLSAgICAgMjgwNSwgIDI4NjAsICAyNTMwLCAgMTkyNSwgIDI5MTUsICAyOTcwLCAgMTkyNSwgIDMwMjUsICAzMDgwLCAgMzEzNSwgCi0gICAgIDMxOTAsICAzMjQ1LCAgMzMwMCwgIDE5MjUsICAzMzU1LCAgMzQxMCwgIDM0NjUsICAzNTIwLCAgMTkyNSwgIDM1NzUsIAotICAgICAzNjMwLCAgMzY4NSwgIDM3NDAsICAzNzk1LCAgMTkyNSwgIDM4NTAsICAzOTA1LCAgMzk2MCwgIDQwMTUsICA0MDcwLCAKLSAgICAgNDEyNSwgIDQxODAsICA0MjM1LCAgNDIzNSwgIDQyOTAsICA0MzQ1LCAgNDQwMCwgIDQ0NTUsICA0NDU1LCAgNDUxMCwgCi0gICAgIDQ1NjUsICA0NjIwLCAgNDY3NSwgIDQ2NzUsICA0NzMwLCAgNDc4NSwgIDQ4NDAsICA0ODk1LCAgMTkyNSwgIDQ5NTAsIAotICAgICA0OTUwLCAgNTAwNSwgIDUwNjAsICA1MTE1LCAgNTE3MCwgIDE5MjUsICAxOTI1LCAgMTk4MCwgIDE5MjUsICAxOTI1LCAKLSAgICAgNTIyNSwgIDUyODAsICA1MzM1LCAgNTM5MCwgIDU0NDUsICA1NTAwLCAgNTU1NSwgIDU2MTAsICAxOTI1LCAgNTY2NSwgCi0gICAgIDU3MjAsICA1Nzc1LCAgMTkyNSwgIDE5MjUsICAyNjk1LCAgNTgzMCwgIDI4MDUsICAxOTI1LCAgNTg4NSwgIDI4NjAsIAotICAgICAyOTE1LCAgMzAyNSwgIDMwODAsICA1OTQwLCAgMzEzNSwgIDE5MjUsICA1OTk1LCAgMzE5MCwgIDE5MjUsICAzNTc1LCAKLSAgICAgNjA1MCwgIDM2ODUsICAxOTI1LCAgNjEwNSwgIDM3NDAsICA1MjI1LCAgNjE2MCwgIDYyMTUsICA2MjcwLCAgNDAxNSwgCi0gICAgIDE5MjUsICA2MzI1LCAgNjM4MCwgIDQyMzUsICA2NDM1LCAgNDI5MCwgIDE5MjUsICA2NDkwLCAgNjU0NSwgIDY2MDAsIAotICAgICA2NjAwLCAgNjY1NSwgIDY3MTAsICA0NDAwLCAgNDIzNSwgIDQ0NTUsICA2NzY1LCAgNDUxMCwgIDE5MjUsICA2ODIwLCAKLSAgICAgNDU2NSwgIDQ2MjAsICA0NDU1LCAgNDY3NSwgIDY4NzUsICA0NzMwLCAgMTkyNSwgIDY5MzAsICA2OTg1LCAgNzA0MCwgCi0gICAgIDcwNDAsICA3MDk1LCAgNzE1MCwgIDcyMDUsICA0OTUwLCAgNzI2MCwgIDUwMDUsICAxOTI1LCAgNzMxNSwgIDczNzAsIAotICAgICA3NDI1LCAgNzQyNSwgIDc0ODAsICA3NTM1LCAgNzU5MCwgIDc2NDUsICA3NzAwLCAgNzc1NSwgIDc4MTAsICAxOTI1LCAKLSAgICAgNzg2NSwgIDc5MjAsICAxOTI1LCAgMTkyNSwgIDE5MjUsICAyMjU1LCAgNzk3NSwgIDgwMzAsICA4MDg1LCAgODE0MCwgCi0gICAgIDgxOTUsICA4MjUwLCAgODMwNSwgIDY0OTAsICA4MzYwLCAgODM2MCwgIDY5MzAsICA4NDE1LCAgODQxNSwgIDg0NzAsIAotICAgICA3MzE1LCAgODUyNSwgIDg1MjUsICA4NTgwLCAgMTkyNSwgIDg2MzUsICA4NjkwLCAgMTkyNSwgIDg3NDUsICA4ODAwLCAKLSAgICAgODg1NSwgIDg5MTAsICA4OTY1LCAgOTAyMCwgIDkwNzUsICA5MTMwLCAgNjY1NSwgIDcwOTUsICA5MTg1LCAgNzQ4MCwgCi0gICAgIDkyNDAsICA5Mjk1LCAgOTM1MCwgIDk0MDUsICA5NDYwLCAgOTUxNSwgIDk1NzAsICA5NjI1LCAgOTY4MCwgIDk3MzUsIAotICAgICA5NzkwLCAgOTg0NSwgIDk5MDAsICA5OTU1LCAxMDAxMCwgMTAwNjUsIDEwMTIwLCAgMTkyNSwgIDE5MjUsIDEwMTc1LCAKLSAgICAxMDIzMCwgMTAyODUsIDEwMzQwLCAxMDM5NSwgIDE5MjUsICAxOTI1LCAgMTkyNSwgMTA0NTAsIDEwNTA1LCAxMDU2MCwgCi0gICAgMTA2MTUsIDEwNjcwLCAxMDcyNSwgIDE5MjUsIDEwNzgwLCAgNDg0MCwgIDUxMTUsIDEwODM1LCAxMDg5MCwgMTA5NDUsIAotICAgIDExMDAwLCAgMjI1NQotICB9OwotCi0gIC8qKiAKLSAgICogVGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eV9wYWNrZWQgPSAKLSAgICAiXDFcNDBcMVw0MVwxMFw0MFwxXDQyXDRcNDBcMVw0M1w0N1w0MFwxXDQ0IisKLSAgICAiXDFcNDVcNjVcNDRcMVw0NlwxXDQ3XDE2XDQ2XDFcNTBcMVw0NlwxXDUxIisKLSAgICAiXDQ0XDQ2XDFcNTJcMVw1M1w2NVw1MlwxXDQ2XDFcNDdcNVw0NlwxXDU0IisKLSAgICAiXDEyXDQ2XDFcNTFcNDVcNDZcMVw0N1wyXDQ2XDFcNTVcMVw1NlwyXDQ2IisKLSAgICAiXDFcNTdcM1w0NlwxXDU2XDVcNDZcMVw1NlwxXDYwXDFcNjFcNFw1NyIrCi0gICAgIlwxXDQ2XDEwXDU3XDFcNjJcMlw1N1wxXDQ2XDdcNTdcMVw0NlwzXDU3IisKLSAgICAiXDFcNDZcM1w1N1wxXDQ2XDFcNTdcMVw0NlwxXDQ3XDJcNDZcMVw1NSIrCi0gICAgIlwxXDYzXDZcNDZcMVw2M1w1XDQ2XDFcNjNcNDRcNDZcMVw2NFwxXDY1IisKLSAgICAiXDJcNjRcMVw2NlwxNVw2NFwxXDUxXDQ0XDY0XDFcNDZcMVw0N1wyXDQ2IisKLSAgICAiXDFcNjdcMVw1NlwyXDQ2XDFcNzBcM1w0NlwxXDU2XDVcNDZcMVw1NiIrCi0gICAgIlw2XDcwXDFcNDZcMTNcNzBcMVw0Nlw3XDcwXDFcNDZcM1w3MFwxXDQ2IisKLSAgICAiXDNcNzBcMVw0NlwxXDcwXDFcNDZcMVw0N1wyXDQ2XDFcNjdcMVw1NiIrCi0gICAgIlwyXDQ2XDFcNzBcM1w0NlwxXDU2XDVcNDZcMVw1Nlw2XDcwXDFcNDYiKwotICAgICJcMTNcNzBcMVw3MVw3XDcwXDFcNDZcM1w3MFwxXDQ2XDNcNzBcMVw0NiIrCi0gICAgIlwxXDcwXDFcNzJcMVw0N1wxXDQ2XDFcNzNcMVw3NFwxXDU2XDNcNzIiKwotICAgICJcMVw3NVwxXDcyXDFcNzZcMVw1Nlw1XDcyXDFcNTZcNDRcNzJcMVw0NiIrCi0gICAgIlwxXDQ3XDJcNDZcMVw3N1wxNVw0NlwxXDUxXDQ1XDQ2XDFcNDdcMVwxMDAiKwotICAgICJcMVwxMDFcMVw0NlwxXDU2XDJcNDZcMVwxMDJcM1w0NlwxXDU2XDVcNDYiKwotICAgICJcMVw1Nlw2XDEwMlwxXDQ2XDEzXDEwMlwxXDQ2XDdcMTAyXDFcNDZcM1wxMDIiKwotICAgICJcMVw0NlwzXDEwMlwxXDQ2XDFcMTAyXDFcNDZcMVw0N1wxXDEwMFwxXDEwMSIrCi0gICAgIlwxXDQ2XDFcNTZcMlw0NlwxXDEwMlwzXDQ2XDFcNTZcNVw0NlwxXDU2IisKLSAgICAiXDZcMTAyXDFcNDZcMTNcMTAyXDFcMTAzXDdcMTAyXDFcNDZcM1wxMDJcMVw0NiIrCi0gICAgIlwzXDEwMlwxXDQ2XDFcMTAyXDFcMTA0XDFcNDdcMVwxMDBcMVwxMDVcMVwxMDQiKwotICAgICJcMVw1NlwzXDEwNFwxXDEwNlwxXDEwNFwxXDEwN1wxXDU2XDVcMTA0XDFcNTYiKwotICAgICJcNDRcMTA0XDFcNDZcMVw0N1wzXDQ2XDFcNTZcNlw0NlwxXDU2XDVcNDYiKwotICAgICJcMVw1Nlw0NFw0NlwxXDExMFwxXDExMVwxXDExMlwxXDExM1w0XDExMFwxXDExNCIrCi0gICAgIlwxMlwxMTBcNlwxMTVcMVwxMTBcMTNcMTE1XDFcMTEwXDdcMTE1XDFcMTEwXDNcMTE1IisKLSAgICAiXDFcMTEwXDNcMTE1XDFcMTEwXDFcMTE1XDFcNDZcMVwxMTFcMVwxMTJcMVwxMTMiKwotICAgICJcMVw0NlwxXDU2XDJcNDZcMVwxMTZcM1w0NlwxXDU2XDVcNDZcMVw1NiIrCi0gICAgIlw2XDExNlwxXDQ2XDEzXDExNlwxXDQ2XDdcMTE2XDFcNDZcM1wxMTZcMVw0NiIrCi0gICAgIlwzXDExNlwxXDQ2XDFcMTE2XDFcNDZcMVwxMTFcMVwxMTJcMVwxMTNcMVw0NiIrCi0gICAgIlwxXDU2XDJcNDZcMVwxMTZcM1w0NlwxXDU2XDVcNDZcMVw1Nlw2XDExNiIrCi0gICAgIlwxXDQ2XDEzXDExNlwxXDExN1w3XDExNlwxXDQ2XDNcMTE2XDFcNDZcM1wxMTYiKwotICAgICJcMVw0NlwxXDExNlwxXDEyMFwxXDExMVwxXDExMlwxXDEyMVwxXDEyMFwxXDU2IisKLSAgICAiXDNcMTIwXDFcMTIyXDFcMTIwXDFcMTIzXDFcNTZcNVwxMjBcMVw1Nlw0NFwxMjAiKwotICAgICJcMVw0NlwxXDEyNFwxXDEyNVwyXDQ2XDFcNTZcNlw0NlwxXDU2XDVcNDYiKwotICAgICJcMVw1NlwxMFw0NlwxXDEyNlwxXDEyN1wyXDQ2XDFcMTMwXDEwXDQ2XDFcMTMwIisKLSAgICAiXDFcNDZcMVwxMjdcMVwxMjZcMTRcNDZcMVw0N1wxXDEyNVwyXDQ2XDFcNTYiKwotICAgICJcNlw0NlwxXDU2XDVcNDZcMVw1Nlw2XDQ2XDFcMTMxXDM2XDQ2XDFcNDciKwotICAgICJcMVwxMjVcMlw0NlwxXDU2XDJcNDZcMVwxMzJcM1w0NlwxXDU2XDVcNDYiKwotICAgICJcMVw1Nlw2XDEzMlwxXDEzMVwxM1wxMzJcMVw0Nlw3XDEzMlwxXDQ2XDNcMTMyIisKLSAgICAiXDFcNDZcM1wxMzJcMVw0NlwxXDEzMlwxXDQ2XDFcNDdcMVwxMjVcMlw0NiIrCi0gICAgIlwxXDU2XDZcNDZcMVw1Nlw1XDQ2XDFcNTZcNlw0NlwxXDEzMVw3XDQ2IisKLSAgICAiXDFcMTMzXDVcNDZcMVwxMzRcNlw0NlwxXDEzM1wxMFw0NlwxXDEzNVwxXDQ3IisKLSAgICAiXDFcMTI1XDFcMTM2XDFcMTM1XDFcNTZcM1wxMzVcMVwxMzdcMVwxMzVcMVwxNDAiKwotICAgICJcMVw1Nlw1XDEzNVwxXDU2XDZcMTM1XDFcMTQxXDM1XDEzNVwxXDE0MlwxXDQ3IisKLSAgICAiXDFcMTI1XDFcMTQzXDFcMTQyXDFcNTZcM1wxNDJcMVwxNDRcMVwxNDJcMVwxNDUiKwotICAgICJcMVw1Nlw1XDE0MlwxXDU2XDZcMTQyXDFcMTQ2XDM1XDE0MlwxXDE0N1wxXDQ3IisKLSAgICAiXDFcMTI1XDFcMTUwXDFcMTQ3XDFcNTZcM1wxNDdcMVwxNTFcMVwxNDdcMVwxNTIiKwotICAgICJcMVw1Nlw1XDE0N1wxXDU2XDQ0XDE0N1wxXDE1M1wxXDE1NFwxXDE1NVw2NFwxNTMiKwotICAgICJcMVwxNTZcMVw0N1wxXDEyNVwxXDE1N1wxXDE1NlwxXDU2XDNcMTU2XDFcMTYwIisKLSAgICAiXDFcMTU2XDFcMTYxXDFcNTZcNVwxNTZcMVw1Nlw0NFwxNTZcMVwxNjJcMVwxNjMiKwotICAgICJcMVwxNjRcNjRcMTYyXDFcMTY1XDFcMTY2XDY1XDE2NVwxXDQwXDFcMFwxMFw0MCIrCi0gICAgIlwxXDBcNFw0MFwxXDBcNDdcNDBcM1wwXDFcMTY3XDFcMTcwXDE0XDAiKwotICAgICJcMVwxNzFcNTJcMFwxXDE3MlwyXDBcMVwxNzNcM1wwXDFcMTcyXDVcMCIrCi0gICAgIlwxXDE3Mlw2XDE3M1wxXDBcMTNcMTczXDFcMFw3XDE3M1wxXDE3NFwzXDE3MyIrCi0gICAgIlwxXDBcM1wxNzNcMVwwXDFcMTczXDVcMFwxXDE3MlwyXDBcMVwxNzUiKwotICAgICJcM1wwXDFcMTcyXDVcMFwxXDE3Mlw2XDE3NVwxXDBcMTNcMTc1XDFcMCIrCi0gICAgIlw3XDE3NVwxXDBcM1wxNzVcMVwwXDNcMTc1XDFcMFwxXDE3NVwxMTBcMCIrCi0gICAgIlwxXDE3Nlw2NVwwXDFcMTc3XDU1XDBcMVwyMDBcNjFcMFwxXDIwMVw3MVwwIisKLSAgICAiXDFcNTZcNlwwXDFcNTZcNVwwXDFcNTZcNTJcMFwzXDU3XDRcMCIrCi0gICAgIlwxXDU3XDVcMFw2XDU3XDFcMFwxM1w1N1wxXDBcN1w1N1wxXDAiKwotICAgICJcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDAiKwotICAgICJcMlw1N1wyXDIwMlwyXDU3XDFcMFwxM1w1N1wxXDBcN1w1N1wxXDAiKwotICAgICJcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDAiKwotICAgICJcMlw1N1wxXDIwMlwxXDIwM1wyXDU3XDFcMFwxM1w1N1wxXDBcN1w1NyIrCi0gICAgIlwxXDBcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1NyIrCi0gICAgIlw1XDBcMlw1N1wyXDIwNFwyXDU3XDFcMFwxM1w1N1wxXDBcN1w1NyIrCi0gICAgIlwxXDBcM1w1N1wxXDBcNVw1N1w1XDBcMVw2M1w2XDBcMVw2MyIrCi0gICAgIlw1XDBcMVw2M1w0NlwwXDFcMjA1XDY2XDBcMVwyMDZcNzJcMFwzXDcwIisKLSAgICAiXDRcMFwxXDcwXDVcMFw2XDcwXDFcMFwxM1w3MFwxXDBcN1w3MCIrCi0gICAgIlwxXDBcM1w3MFwxXDBcNVw3MFwxXDcyXDJcMFwxXDIwN1wxXDcyIisKLSAgICAiXDFcMFwzXDcyXDFcMFwxXDcyXDJcMFw1XDcyXDFcMFw0NVw3MiIrCi0gICAgIlwxXDBcMVwyMDZcMVwyMDdcMVw3MlwxXDBcM1w3MlwxXDBcMVw3MiIrCi0gICAgIlwyXDBcNVw3MlwxXDBcNDRcNzJcMVw3NVwxXDBcMVwyMTBcMVwyMTEiKwotICAgICJcMVw3NVwxXDIxMFwzXDc1XDFcMjEyXDFcNzVcMlwyMTBcNVw3NVwxXDIxMCIrCi0gICAgIlw0NFw3NVwxXDc2XDFcMFwxXDIxM1wxXDIxNFwxXDc2XDFcMjEzXDNcNzYiKwotICAgICJcMVwyMTNcMVw3NlwxXDIxMlwxXDIxM1w1XDc2XDFcMjEzXDQ0XDc2XDJcMCIrCi0gICAgIlwxXDEwMFwxXDIxNVw3MVwwXDNcMTAyXDRcMFwxXDEwMlw1XDBcNlwxMDIiKwotICAgICJcMVwwXDEzXDEwMlwxXDBcN1wxMDJcMVwwXDNcMTAyXDFcMFw1XDEwMiIrCi0gICAgIlwxXDEwNFwyXDBcMVwyMTZcMVwxMDRcMVwwXDNcMTA0XDFcMFwxXDEwNCIrCi0gICAgIlwyXDBcNVwxMDRcMVwwXDQ1XDEwNFwxXDBcMVwxMDBcMVwyMTdcMVwxMDQiKwotICAgICJcMVwwXDNcMTA0XDFcMFwxXDEwNFwyXDBcNVwxMDRcMVwwXDQ0XDEwNCIrCi0gICAgIlwxXDEwNlwxXDBcMVwyMjBcMVwyMjFcMVwxMDZcMVwyMjBcM1wxMDZcMVwyMjIiKwotICAgICJcMVwxMDZcMlwyMjBcNVwxMDZcMVwyMjBcNDRcMTA2XDFcMTA3XDFcMFwxXDIyMyIrCi0gICAgIlwxXDIyNFwxXDEwN1wxXDIyM1wzXDEwN1wxXDIyM1wxXDEwN1wxXDIyMlwxXDIyMyIrCi0gICAgIlw1XDEwN1wxXDIyM1w0NFwxMDdcMVwxMTBcM1wwXDE3XDExMFw2XDBcMVwxMTAiKwotICAgICJcMTNcMFwxXDExMFw3XDBcMVwxMTBcM1wwXDFcMTEwXDNcMFwxXDExMCIrCi0gICAgIlw0XDBcMVwxNjdcMTVcMFwxXDE3MVw0N1wwXDFcMjI1XDY0XDBcMVwxMTAiKwotICAgICJcM1wwXDJcMTEwXDNcMTE0XDRcMTEwXDFcMTE0XDVcMTEwXDZcMTE1XDFcMTEwIisKLSAgICAiXDEzXDExNVwxXDExMFw3XDExNVwxXDExMFwzXDExNVwxXDExMFwzXDExNVwxXDExNCIrCi0gICAgIlwxXDExNVw2XDBcM1wxMTVcNFwwXDFcMTE1XDVcMFw2XDExNVwxXDAiKwotICAgICJcMTNcMTE1XDFcMFw3XDExNVwxXDBcM1wxMTVcMVwwXDVcMTE1XDZcMCIrCi0gICAgIlwzXDExNlw0XDBcMVwxMTZcNVwwXDZcMTE2XDFcMFwxM1wxMTZcMVwwIisKLSAgICAiXDdcMTE2XDFcMFwzXDExNlwxXDBcNVwxMTZcMVwxMjBcMlwwXDFcMjI2IisKLSAgICAiXDFcMTIwXDFcMFwzXDEyMFwxXDBcMVwxMjBcMlwwXDVcMTIwXDFcMCIrCi0gICAgIlw0NVwxMjBcMVwwXDFcMjI1XDFcMjI2XDFcMTIwXDFcMFwzXDEyMFwxXDAiKwotICAgICJcMVwxMjBcMlwwXDVcMTIwXDFcMFw0NFwxMjBcMVwxMjJcMVwwXDFcMjI3IisKLSAgICAiXDFcMjMwXDFcMTIyXDFcMjI3XDNcMTIyXDFcMjMxXDFcMTIyXDJcMjI3XDVcMTIyIisKLSAgICAiXDFcMjI3XDQ0XDEyMlwxXDEyM1wxXDBcMVwyMzJcMVwyMzNcMVwxMjNcMVwyMzIiKwotICAgICJcM1wxMjNcMVwyMzJcMVwxMjNcMVwyMzFcMVwyMzJcNVwxMjNcMVwyMzJcNDRcMTIzIisKLSAgICAiXDNcMFwxXDE2N1wxNVwwXDFcMjM0XDExMFwwXDFcMjM1XDYwXDBcMVwyMzYiKwotICAgICJcMTNcMFwxXDIzNlw0NFwwXDJcMjM3XDM2XDBcMjBcMjQwXDFcMjQxXDQ2XDI0MCIrCi0gICAgIlw2XDBcM1wxMzJcNFwwXDFcMTMyXDVcMFw2XDEzMlwxXDBcMTNcMTMyIisKLSAgICAiXDFcMFw3XDEzMlwxXDBcM1wxMzJcMVwwXDVcMTMyXDQ2XDBcMVwyNDIiKwotICAgICJcNVwwXDFcMjQyXDcyXDBcMVwyNDNcNlwwXDFcMTM1XDJcMFwxXDI0NCIrCi0gICAgIlwxXDEzNVwxXDBcM1wxMzVcMVwwXDFcMTM1XDJcMFw1XDEzNVwxXDAiKwotICAgICJcNDRcMTM1XDFcMTM3XDFcMFwxXDI0NVwxXDI0NlwxXDEzN1wxXDI0NVwzXDEzNyIrCi0gICAgIlwxXDI0N1wxXDEzN1wyXDI0NVw1XDEzN1wxXDI0NVw0NFwxMzdcMVwyNTBcMVwwIisKLSAgICAiXDFcMjUxXDFcMjUyXDFcMjUzXDFcMjUxXDNcMjUzXDFcMjUxXDFcMjUwXDFcMjU0IisKLSAgICAiXDFcMjU1XDNcMjUzXDFcMjUwXDFcMjUzXDFcMjU1XDZcMjUzXDFcMjUwXDMyXDI1MyIrCi0gICAgIlwyXDI1MFwxXDI1M1wxXDE0MVwyXDI0MFwxXDI1NlwxXDE0MVwxXDI0MFwzXDE0MSIrCi0gICAgIlwxXDI0MFwxXDE0MVwyXDI0MFwzXDE0MVwxXDI1N1wxXDE0MVwxXDI0MFw0NFwxNDEiKwotICAgICJcMVwxNDJcMlwwXDFcMjYwXDFcMTQyXDFcMFwzXDE0MlwxXDBcMVwxNDIiKwotICAgICJcMlwwXDVcMTQyXDFcMFw0NFwxNDJcMVwxNDRcMlwyNjFcMVwyNjJcMVwxNDQiKwotICAgICJcMVwyNjFcM1wxNDRcMVwyNjNcMVwxNDRcMlwyNjFcNVwxNDRcMVwyNjFcNDRcMTQ0IisKLSAgICAiXDFcMTQ1XDJcMjY0XDFcMjY1XDFcMTQ1XDFcMjY0XDNcMTQ1XDFcMjY0XDFcMTQ1IisKLSAgICAiXDFcMjYzXDFcMjY0XDVcMTQ1XDFcMjY0XDQ0XDE0NVwxXDE0NlwyXDI0MFwxXDI2NiIrCi0gICAgIlwxXDE0NlwxXDI0MFwzXDE0NlwxXDI0MFwxXDE0NlwyXDI0MFwzXDE0NlwxXDI2NyIrCi0gICAgIlwxXDE0NlwxXDI0MFw0NFwxNDZcMVwxNDdcMlwwXDFcMjcwXDFcMTQ3XDFcMCIrCi0gICAgIlwzXDE0N1wxXDBcMVwxNDdcMlwwXDVcMTQ3XDFcMFw0NFwxNDdcMVwxNTEiKwotICAgICJcMVwwXDFcMjcxXDFcMjcyXDFcMTUxXDFcMjcxXDNcMTUxXDFcMjczXDFcMTUxIisKLSAgICAiXDJcMjcxXDVcMTUxXDFcMjcxXDQ0XDE1MVwxXDI3NFwxXDBcMVwyNzVcMVwyNzYiKwotICAgICJcMVwyNzdcMVwyNzVcM1wyNzdcMVwyNzVcMVwyNzRcMVwzMDBcMVwzMDFcM1wyNzciKwotICAgICJcMVwyNzRcMVwyNzdcMVwzMDFcNlwyNzdcMVwyNzRcMzJcMjc3XDJcMjc0XDFcMjc3IisKLSAgICAiXDJcMTUzXDFcMFw2NlwxNTNcMVwwXDE2XDE1M1wxXDMwMlw0NVwxNTNcMVwxNTYiKwotICAgICJcMlwwXDFcMzAzXDFcMTU2XDFcMFwzXDE1NlwxXDBcMVwxNTZcMlwwIisKLSAgICAiXDVcMTU2XDFcMFw0NFwxNTZcMVwxNjBcMVwwXDFcMzA0XDFcMzA1XDFcMTYwIisKLSAgICAiXDFcMzA0XDNcMTYwXDFcMzA2XDFcMTYwXDJcMzA0XDVcMTYwXDFcMzA0XDQ0XDE2MCIrCi0gICAgIlwxXDMwN1wxXDBcMVwzMTBcMVwzMTFcMVwzMTJcMVwzMTBcM1wzMTJcMVwzMTAiKwotICAgICJcMVwzMDdcMVwzMTNcMVwzMTRcM1wzMTJcMVwzMDdcMVwzMTJcMVwzMTRcNlwzMTIiKwotICAgICJcMVwzMDdcMzJcMzEyXDJcMzA3XDFcMzEyXDJcMTYyXDFcMFw2NlwxNjJcMVwwIisKLSAgICAiXDE2XDE2MlwxXDMxNVw0NVwxNjJcN1wwXDFcMzE2XDIxXDBcMVwzMTdcNDJcMCIrCi0gICAgIlwxXDE3MlwyXDBcMVw0MFwzXDBcMVwxNzJcNVwwXDFcMTcyXDZcNDAiKwotICAgICJcMVwwXDEzXDQwXDFcMFw3XDQwXDFcMFwzXDQwXDFcMFwzXDQwIisKLSAgICAiXDFcMFwxXDQwXDFcMzIwXDFcMFwzXDMyMFwxXDMyMVwzXDE3M1wxXDMyMCIrCi0gICAgIlwxXDBcMVwzMjBcMVwzMjFcMVwxNzNcMVwzMjBcMVwwXDJcMzIwXDFcMzIxIisKLSAgICAiXDZcMTczXDFcMzIwXDEzXDE3M1wxXDMyMFw3XDE3M1wxXDMyMFwzXDE3M1wxXDMyMiIrCi0gICAgIlw1XDE3M1wxNVwwXDFcMzIzXDZcMFwxXDMyNFw0MlwwXDFcMzIwXDFcMCIrCi0gICAgIlwzXDMyMFwxXDMyMVwzXDE3NVwxXDMyMFwxXDBcMVwzMjBcMVwzMjFcMVwxNzUiKwotICAgICJcMVwzMjBcMVwwXDJcMzIwXDFcMzIxXDZcMTc1XDFcMzIwXDEzXDE3NVwxXDMyMCIrCi0gICAgIlw3XDE3NVwxXDMyMFwzXDE3NVwxXDMyNVw1XDE3NVwzMVwwXDFcMzE3XDM3XDAiKwotICAgICJcMVwzMjZcNjZcMFwxXDMyN1w3MlwwXDNcNTdcNFwwXDFcNTdcNVwwIisKLSAgICAiXDRcNTdcMlwzMzBcMVwwXDEzXDU3XDFcMFw3XDU3XDFcMFwzXDU3IisKLSAgICAiXDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMFw0XDU3IisKLSAgICAiXDFcMzMwXDFcMzMxXDFcMFwxM1w1N1wxXDBcN1w1N1wxXDBcM1w1NyIrCi0gICAgIlwxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDBcNlw1NyIrCi0gICAgIlwxXDBcMTNcNTdcMVwwXDFcNTdcMVwzMzJcNVw1N1wxXDBcM1w1NyIrCi0gICAgIlwxXDBcNVw1N1wxXDIxMFwxXDBcN1wyMTBcMVwyMTJcNTVcMjEwXDFcMjEzIisKLSAgICAiXDFcMFwxMVwyMTNcMVwyMTJcNTNcMjEzXDFcMjIwXDFcMFw3XDIyMFwxXDIyMiIrCi0gICAgIlw1NVwyMjBcMVwyMjNcMVwwXDExXDIyM1wxXDIyMlw1M1wyMjNcMVwyMjdcMVwwIisKLSAgICAiXDdcMjI3XDFcMjMxXDU1XDIyN1wxXDIzMlwxXDBcMTFcMjMyXDFcMjMxXDUzXDIzMiIrCi0gICAgIlwzMlwwXDFcMzMzXDMwXDBcMVwzMzNcNDBcMFwxXDMzNFwxM1wwXDFcMzM0IisKLSAgICAiXDU0XDBcMVwzMzVcMTBcMFwxXDMzNVw1N1wwXDFcMzM2XDE0XDBcMVwzMzYiKwotICAgICJcNzJcMFwxXDMzN1w0XDBcMVwyNDVcMVwwXDdcMjQ1XDFcMjQ3XDU1XDI0NSIrCi0gICAgIlwxXDI1MFwxXDBcMVwyNTFcMVwzNDBcMVwyNTBcMVwyNTFcM1wyNTBcMVwyNTEiKwotICAgICJcMVwyNTBcMVwyNDdcMVwyNTFcNVwyNTBcMVwyNTFcNDRcMjUwXDFcMjUxXDFcMCIrCi0gICAgIlwxMVwyNTFcMVwyNDdcNTNcMjUxXDFcMjUwXDFcMFwxXDI1MVwxXDM0MFwxXDI1MCIrCi0gICAgIlwxXDI1MVwzXDI1MFwxXDI1MVwxXDI1MFwxXDM0MVwxXDI1MVw1XDI1MFwxXDI1MSIrCi0gICAgIlw0NFwyNTBcMTNcMFwxXDM0Mlw1M1wwXDFcMjUxXDFcMFwxMVwyNTFcMVwzNDEiKwotICAgICJcNTNcMjUxXDExXDI2MVwxXDI2M1w1NVwyNjFcMTNcMjY0XDFcMjYzXDUzXDI2NFwxXDI3MSIrCi0gICAgIlwxXDBcN1wyNzFcMVwyNzNcNTVcMjcxXDFcMjc0XDFcMFwxXDI3NVwxXDM0MyIrCi0gICAgIlwxXDI3NFwxXDI3NVwzXDI3NFwxXDI3NVwxXDI3NFwxXDI3M1wxXDI3NVw1XDI3NCIrCi0gICAgIlwxXDI3NVw0NFwyNzRcMVwyNzVcMVwwXDExXDI3NVwxXDI3M1w1M1wyNzVcMVwyNzQiKwotICAgICJcMVwwXDFcMjc1XDFcMzQzXDFcMjc0XDFcMjc1XDNcMjc0XDFcMjc1XDFcMjc0IisKLSAgICAiXDFcMzQ0XDFcMjc1XDVcMjc0XDFcMjc1XDQ0XDI3NFwxM1wwXDFcMzQ1XDUzXDAiKwotICAgICJcMVwyNzVcMVwwXDExXDI3NVwxXDM0NFw1M1wyNzVcMlwxNTNcMVwwXDI2XDE1MyIrCi0gICAgIlwxXDM0NlwzNVwxNTNcMVwzMDRcMVwwXDdcMzA0XDFcMzA2XDU1XDMwNFwxXDMwNyIrCi0gICAgIlwxXDBcMVwzMTBcMVwzNDdcMVwzMDdcMVwzMTBcM1wzMDdcMVwzMTBcMVwzMDciKwotICAgICJcMVwzMDZcMVwzMTBcNVwzMDdcMVwzMTBcNDRcMzA3XDFcMzEwXDFcMFwxMVwzMTAiKwotICAgICJcMVwzMDZcNTNcMzEwXDFcMzA3XDFcMFwxXDMxMFwxXDM0N1wxXDMwN1wxXDMxMCIrCi0gICAgIlwzXDMwN1wxXDMxMFwxXDMwN1wxXDM1MFwxXDMxMFw1XDMwN1wxXDMxMFw0NFwzMDciKwotICAgICJcMTNcMFwxXDM1MVw1M1wwXDFcMzEwXDFcMFwxMVwzMTBcMVwzNTBcNTNcMzEwIisKLSAgICAiXDJcMTYyXDFcMFwyNlwxNjJcMVwzNTJcMzVcMTYyXDdcMFwxXDM1M1wxMTFcMCIrCi0gICAgIlwxXDM1NFwzNFwwXDFcMzIwXDFcMFwxMFwzMjBcMVwwXDRcMzIwXDFcMCIrCi0gICAgIlw0MVwzMjBcMVwwXDZcMzIwXDFcMFwzXDMyMFwxXDMyMVw0XDMyMFwxXDAiKwotICAgICJcMVwzMjBcMVwzMjFcMlwzMjBcMVwwXDJcMzIwXDFcMzIxXDM2XDMyMFwxXDM1NSIrCi0gICAgIlw1XDMyMFwxNVwwXDFcMzIzXDQzXDBcMVwzNTZcMjJcMFwxXDM1N1wxNFwwIisKLSAgICAiXDNcMzU3XDJcMFwxXDM1N1wxMFwwXDFcMzU3XDFcMFwyXDM1N1wzXDAiKwotICAgICJcMVwzNTdcMlwwXDJcMzU3XDExXDBcMVw1N1wxXDM2MFwxXDU3XDRcMCIrCi0gICAgIlwxXDU3XDVcMFw2XDU3XDFcMFwxM1w1N1wxXDBcN1w1N1wxXDAiKwotICAgICJcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDAiKwotICAgICJcNlw1N1wxXDBcMTFcNTdcMVwzNjFcMVw1N1wxXDBcN1w1N1wxXDAiKwotICAgICJcM1w1N1wxXDBcNVw1N1wzNVwwXDFcMzYyXDEzXDBcMVwzNjJcNDRcMCIrCi0gICAgIlwyXDM2M1w2M1wwXDJcMzY0XDc1XDBcMVwzNjVcMTNcMFwxXDM2NVw0NFwwIisKLSAgICAiXDJcMzY2XDQxXDBcMlwzNjdcMVwwXDNcMzY3XDJcMFwxXDI1NFw0XDM2NyIrCi0gICAgIlwxXDBcMTBcMzY3XDFcMFwzMlwzNjdcMlwwXDFcMzY3XDNcMFwyXDM3MCIrCi0gICAgIlwxXDBcM1wzNzBcMlwwXDFcMzAwXDRcMzcwXDFcMFwxMFwzNzBcMVwwIisKLSAgICAiXDMyXDM3MFwyXDBcMVwzNzBcMlwxNTNcMVwwXDI3XDE1M1wxXDM3MVwzNFwxNTMiKwotICAgICJcM1wwXDJcMzcyXDFcMFwzXDM3MlwyXDBcMVwzMTNcNFwzNzJcMVwwIisKLSAgICAiXDEwXDM3MlwxXDBcMzJcMzcyXDJcMFwxXDM3MlwyXDE2MlwxXDBcMjdcMTYyIisKLSAgICAiXDFcMzczXDM0XDE2MlwzM1wwXDFcMzc0XDExNFwwXDFcMzU1XDIyXDBcMVwzNTciKwotICAgICJcMTRcMFwzXDM1N1wyXDBcMVwzNTdcMTBcMFwxXDM1N1wxXDBcMlwzNTciKwotICAgICJcM1wwXDFcMzU3XDFcMFwxXDM1NlwyXDM1N1wxMVwwXDNcNTdcNFwwIisKLSAgICAiXDFcNTdcNVwwXDZcNTdcMVwwXDdcNTdcMVwzNzVcM1w1N1wxXDAiKwotICAgICJcN1w1N1wxXDBcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDAiKwotICAgICJcMVw1N1w1XDBcNlw1N1wxXDBcNlw1N1wxXDM3Nlw0XDU3XDFcMCIrCi0gICAgIlw3XDU3XDFcMFwzXDU3XDFcMFw1XDU3XDQ2XDBcMVwzNzdcNVwwIisKLSAgICAiXDFcMzc3XDU0XDBcMVx1MDEwMFw2M1wwXDFcdTAxMDFcMTBcMFwxXHUwMTAxXDU1XDAiKwotICAgICJcMVx1MDEwMlwxMFwwXDFcdTAxMDJcNjBcMFwxXHUwMTAzXDI0XDBcMlwxNTNcMVwwIisKLSAgICAiXDMwXDE1M1wxXHUwMTA0XDMzXDE1M1wyXDE2MlwxXDBcMzBcMTYyXDFcdTAxMDVcMzNcMTYyIisKLSAgICAiXDM0XDBcMVx1MDEwNlw0MFwwXDNcNTdcNFwwXDFcNTdcNVwwXDZcNTciKwotICAgICJcMVwwXDEzXDU3XDFcMFwzXDU3XDFcdTAxMDdcM1w1N1wxXDBcM1w1NyIrCi0gICAgIlwxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDBcNlw1NyIrCi0gICAgIlwxXDBcM1w1N1wxXHUwMTA4XDdcNTdcMVwwXDNcNTdcMVx1MDEwOFwzXDU3IisKLSAgICAiXDFcMFwzXDU3XDFcMFw1XDU3XDQ3XDBcMVx1MDEwOVw2MFwwXDFcdTAxMGEiKwotICAgICJcMTRcMFwxXHUwMTBhXDU0XDBcMVx1MDEwYlw0N1wwXDJcdTAxMGNcNzJcMFwxXHUwMTBkIisKLSAgICAiXDMwXDBcMVx1MDEwZFwzXDBcMlwxNTNcMVwwXDMxXDE1M1wxXHUwMTBlXDMyXDE1MyIrCi0gICAgIlwyXDE2MlwxXDBcMzFcMTYyXDFcdTAxMGZcMzJcMTYyXDM1XDBcMVx1MDExMFwzN1wwIisKLSAgICAiXDNcNTdcNFwwXDFcNTdcNVwwXDZcNTdcMVwwXDEzXDU3XDFcMCIrCi0gICAgIlw2XDU3XDFcdTAxMTFcMVwwXDNcNTdcMVwwXDVcNTdcNVwwXDFcdTAxMTIiKwotICAgICJcM1w1N1wzXDBcMVx1MDExMlwxXDU3XDRcMFwxXHUwMTEyXDZcNTdcMVwwIisKLSAgICAiXDEzXDU3XDFcMFw3XDU3XDFcMFwzXDU3XDFcMFw1XDU3XDM3XDAiKwotICAgICJcMVx1MDExM1wxMFwwXDFcdTAxMTNcNTNcMFwxXHUwMTE0XDEzXDBcMVx1MDExNFw1MlwwIisKLSAgICAiXDFcdTAxMTVcMTNcMFwxXHUwMTE1XDE1XDBcMlwxNTNcMVwwXDMyXDE1M1wxXHUwMTE2IisKLSAgICAiXDMxXDE1M1wyXDE2MlwxXDBcMzJcMTYyXDFcdTAxMTdcMzFcMTYyXDM0XDBcMVx1MDExOCIrCi0gICAgIlw0MFwwXDNcNTdcNFwwXDFcNTdcNVwwXDVcNTdcMVx1MDExOVwxXDAiKwotICAgICJcMTNcNTdcMVwwXDdcNTdcMVwwXDNcNTdcMVwwXDVcNTdcNVwwIisKLSAgICAiXDFcdTAxMTJcNlwwXDFcdTAxMTJcNVwwXDFcdTAxMTJcNDRcMFwyXDE1M1wxXDAiKwotICAgICJcMzFcMTUzXDFcdTAxMWFcMzJcMTUzXDJcMTYyXDFcMFwzMVwxNjJcMVx1MDExYlwzMlwxNjIiKwotICAgICJcMzFcMFwxXHUwMTFjXDQzXDBcM1w1N1w0XDBcMVw1N1w1XDBcNlw1NyIrCi0gICAgIlwxXDBcNVw1N1wxXHUwMTFkXDVcNTdcMVwwXDdcNTdcMVwwXDNcNTciKwotICAgICJcMVwwXDVcNTdcMlwxNTNcMVwwXDI2XDE1M1wxXHUwMTFlXDM1XDE1M1wyXDE2MiIrCi0gICAgIlwxXDBcMjZcMTYyXDFcdTAxMWZcMzVcMTYyXDZcMFwzXDU3XDRcMFwxXDU3IisKLSAgICAiXDVcMFw2XDU3XDFcMFw3XDU3XDFcdTAxMjBcM1w1N1wxXDBcN1w1NyIrCi0gICAgIlwxXDBcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1NyIrCi0gICAgIlw1XDBcNlw1N1wxXDBcMTNcNTdcMVwwXDdcNTdcMVwwXDNcNTciKwotICAgICJcMVwwXDRcNTdcMVx1MDEyMVw2XDBcM1w1N1w0XDBcMVw1N1w1XDAiKwotICAgICJcNlw1N1wxXDBcNVw1N1wxXHUwMTIyXDVcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDNcNTdcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTdcNVwwIisKLSAgICAiXDZcNTdcMVwwXDVcNTdcMVx1MDEyM1w1XDU3XDFcMFw3XDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlw2XDU3XDFcMFwxM1w1N1wxXDBcM1w1N1wxXHUwMTI0XDNcNTdcMVwwIisKLSAgICAiXDNcNTdcMVwwXDVcNTciOwotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5dHJhbnMgW10gPSB5eV91bnBhY2soeXlfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgLy8gZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAkJLy8kTk9OLU5MUy0xJAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCS8vJE5PTi1OTFMtMSQKLSAgfTsKLQotICAvKioKLSAgICogWVlfQVRUUklCVVRFW2FTdGF0ZV0gY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgb2Ygc3RhdGUgPGNvZGU+YVN0YXRlPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBZWV9BVFRSSUJVVEVbXSA9IHsKLSAgICAgMSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsIAotICAgICAxLCAgMSwgIDEsICA5LCAgMSwgIDksICAxLCAgMSwgIDksICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDksICA5LCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsIAotICAgICA5LCAgMSwgIDEsICAxLCAgOSwgIDksICAwLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDksICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDksICAxLCAgMCwgIDAsICAxLCAgMSwgIDAsICAwLCAgMSwgIDAsIAotICAgICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAgOSwgIDEsICAwLCAgMCwgIDEsICAxLCAKLSAgICAgMCwgIDEsICAwLCAgMCwgIDAsICA5LCAgMSwgIDAsICAwLCAgMSwgIDEsICAwLCAgMSwgIDAsICAwLCAgMSwgCi0gICAgIDEsICA5LCAgMCwgIDAsICA5LCAgOSwgIDksICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIAotICAgICAxLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgOSwgIDAsICAxLCAgOSwgIDAsICAxLCAKLSAgICAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAgMCwgIDAsICAwLCAgOSwgIDksICAxLCAgMSwgIDAsIAotICAgICAxLCAgMSwgIDksICA5LCAgOSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMQotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIC8vIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgLy8gcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0JcHJpdmF0ZSBpbnQgZlRva2VuQ291bnQgPSAwOwotIAotCS8vIHJlcXVpcmVkIGhvbGRlcnMgZm9yIHdoaXRlLXNwYWNlIGNvbXBhY3RpbmcKLQlwcml2YXRlIGJvb2xlYW4gZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0ID0gMTsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGggPSAwOwotCXByaXZhdGUgU3RyaW5nIGZfY29udGV4dCA9IG51bGw7Ci0KLQkvLyBzdGF0ZSBzdGFjayBmb3IgaGFuZGxpbmcgZW1iZWRkZWQgcmVnaW9ucwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQotCXByaXZhdGUgU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IHN0YXJ0ID0gMDsKLQlwcml2YXRlIGludCB0ZXh0TGVuZ3RoID0gMDsKLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCi0JLy8gb2Zmc2V0IGZvciB0cmFja2luZyBwb3NpdGlvbiBzcGVjaWZpYyBibG9jayB0YWdzCi0JcHJpdmF0ZSBpbnQgZk9mZnNldCA9IDA7Ci0JCi0JLy8gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGFnIGJlaW5nIG9wZW5lZAotCXByaXZhdGUgU3RyaW5nIGZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0KLQkvLyB0aGUgbGlzdCBvZiB0YWcgbmFtZSBCbG9ja01hcmtlcnMKLQlwcml2YXRlIExpc3QgZkJsb2NrTWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIHJlcXVpcmVkIHRvIG5vdCBzZWVrIHRleHQgYmxvY2tzIG9uIGFuIGVuZCB0YWcKLQlwcml2YXRlIGJvb2xlYW4gZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IHRydWU7Ci0KLQlwcml2YXRlIFhNTFBhcnNlclJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBuZXcgWE1MUGFyc2VyUmVnaW9uRmFjdG9yeSgpOwotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgYWRkQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JaWYoY29udGFpbnNUYWdOYW1lKG1hcmtlci5nZXRUYWdOYW1lKCkpKQotCQlyZXR1cm47Ci0JZkJsb2NrTWFya2Vycy5hZGQobWFya2VyKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QgCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgewotCWZCbG9ja01hcmtlcnMucmVtb3ZlKG1hcmtlcik7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICovCi1wdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnbmFtZSkgewotCWlmIChmQmxvY2tNYXJrZXJzICE9IG51bGwpIHsKLQkJSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoYmxvY2tzLmhhc05leHQoKSkgewotCQkJaWYgKCgoQmxvY2tNYXJrZXIpIGJsb2Nrcy5uZXh0KCkpLmdldFRhZ05hbWUoKS5lcXVhbHModGFnbmFtZSkpCi0JCQkJYmxvY2tzLnJlbW92ZSgpOwotCQl9Ci0JfQotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKCkgewotCXJldHVybiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmc7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGJvb2xlYW4gbmV3VmFsdWUpIHsKLQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBuZXdWYWx1ZTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KGZDdXJyZW50VGFnTmFtZSk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoU3RyaW5nIG5hbWUpIHsKLQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJYm9vbGVhbiBjYXNlc2Vuc2l0aXZlID0gbWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpOwotCQlpZihjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7Ci0JCWVsc2UgaWYoIWNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7Ci0JfQotCXJldHVybiB0cnVlOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KCkgewotCXJldHVybiBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dChTdHJpbmcgbmFtZSkgewotCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXJldHVybiBtYXJrZXIuZ2V0Q29udGV4dCgpOwotCX0KLQlyZXR1cm4gQkxPQ0tfVEVYVDsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgTGlzdCBnZXRCbG9ja01hcmtlcnMoKSB7Ci0JcmV0dXJuIGZCbG9ja01hcmtlcnM7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIGZpbmFsIGludCBnZXRPZmZzZXQoKSB7Ci0JcmV0dXJuIGZPZmZzZXQgKyB5eWNoYXI7Ci19Ci1wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcigpIHsKLQlyZXR1cm4gaXNCbG9ja01hcmtlcihmQ3VycmVudFRhZ05hbWUpOwotfQotcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUpIHsKLQlpZiAoIWZJc0Jsb2NraW5nRW5hYmxlZCkKLQkJcmV0dXJuIGZhbHNlOwotCXJldHVybiBjb250YWluc1RhZ05hbWUodGFnTmFtZSk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tUYWdTY2FuKFN0cmluZyBuZXdUYWdOYW1lKSB7Ci0JYmVnaW5CbG9ja01hcmtlclNjYW4obmV3VGFnTmFtZSwgQkxPQ0tfVEVYVCk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kCi0gKgotICogU3BlY2lhbCB0b2tlbml6ZXIgc2V0dXAuICBBbGxvd3MgdG9rZW5pemF0aW9uIHRvIGJlIGluaXRpYXRlZCBhdCB0aGUKLSAqIHN0YXJ0IG9mIGEgdGV4dCBibG9jayB3aXRoaW4gYSAibmV3VGFnTmFtZSIgdGFnLgotICoKLSAqIEV4YW1wbGU6IAotICoJVG9rZW5pemVyIHRva2VyID0gbmV3IFRva2VuaXplcigpOwotICoJdG9rZXIuc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGZhbHNlKTsKLSAqCXRva2VyLnJlc2V0KG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcigiYWZpdWhxd2tlamh0YXNpaGdhbGt3aHRxPC9zY3JpcHRlcj48L3Njcj48L3NjcmlwdD5hc2dkYXNnYSIpKTsKLSAqCXRva2VyLmJlZ2luQmxvY2tNYXJrZXJTY2FuKCJzY3JpcHQiLCBCTE9DS19URVhUKTsKLSAqCXRva2VyLmdldFJlZ2lvbnMoKTsgCi0gKgotICogUmV0dXJuczoKLSAqCUJMT0NLX1RFWFQ6IDAtNDAKLSAqCVhNTF9FTkRfVEFHX09QRU46IDQxLTQyCi0gKglYTUxfVEFHX05BTUU6IDQzLTQ4Ci0gKglYTUxfVEFHX0NMT1NFOiA0OS00OQotICoJWE1MX0NPTlRFTlQ6IDUwLTU3Ci0gKgotICovCi1wdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrTWFya2VyU2NhbihTdHJpbmcgbmV3VGFnTmFtZSwgU3RyaW5nIGJsb2NrY29udGV4dCkgewotCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCWZDdXJyZW50VGFnTmFtZSA9IG5ld1RhZ05hbWU7Ci19Ci0vKioKLSAqIE1ldGhvZCBkb1NjYW4uCi0gKiAKLSAqIFJldHVybnMgYSBjb250ZXh0IHJlZ2lvbiBmb3IgYWxsIG9mIHRoZSB0ZXh0IGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gdXB0byB0aGUgZW5kIG9mIGlucHV0IG9yCi0gKiB0byByaWdodCAqYmVmb3JlKiB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIHNlYXJjaFN0cmluZwotICogCi0gKiBAcGFyYW0gc2VhcmNoU3RyaW5nIC0gdGFyZ2V0IHN0cmluZyB0byBzZWFyY2ggZm9yIGV4LjogIi0tPiIsICI8L3RhZ25hbWUiCi0gKiBAcGFyYW0gcmVxdWlyZVRhaWxTZXBhcmF0b3IgLSB3aGV0aGVyIHRoZSB0YXJnZXQgbXVzdCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIG9yICc+JwotICogQHBhcmFtIGNvbnRleHQgLSB0aGUgY29udGV4dCBvZiB0aGUgc2Nhbm5lZCByZWdpb24gaWYgbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gZXhpdFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSByZWdpb24gd2FzIG9mIG5vbi16ZXJvIGxlbmd0aAotICogQHBhcmFtIGFib3J0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHNlYXJjaFN0cmluZyB3YXMgZm91bmQgaW1tZWRpYXRlbHkKLSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIGNvbnRleHQgZm91bmQ6IHRoZSBkZXNpcmVkIGNvbnRleHQgb24gYSBub24temVybyBsZW5ndGggbWF0Y2gsIHRoZSBhYm9ydENvbnRleHQgb24gaW1tZWRpYXRlIHN1Y2Nlc3MKLSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9TY2FuKFN0cmluZyBzZWFyY2hTdHJpbmcsIGJvb2xlYW4gcmVxdWlyZVRhaWxTZXBhcmF0b3IsIFN0cmluZyBzZWFyY2hDb250ZXh0LCBpbnQgZXhpdFN0YXRlLCBpbnQgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlib29sZWFuIHN0aWxsU2VhcmNoaW5nID0gdHJ1ZTsKLQkvLyBEaXNhYmxlIGZ1cnRoZXIgYmxvY2sgKHByb2JhYmx5KQotCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCWludCBzZWFyY2hTdHJpbmdMZW5ndGggPSBzZWFyY2hTdHJpbmcubGVuZ3RoKCk7Ci0JaW50IG4gPSAwOwotCWNoYXIgbGFzdENoZWNrQ2hhcjsKLQlpbnQgaTsKLQlib29sZWFuIHNhbWUgPSBmYWxzZTsKLQl3aGlsZSAoc3RpbGxTZWFyY2hpbmcpIHsKLQkJbiA9IDA7Ci0JCS8vIEVuc3VyZSB0aGF0IGVub3VnaCBkYXRhIGZyb20gdGhlIGlucHV0IGV4aXN0cyB0byBjb21wYXJlIGFnYWluc3QgdGhlIHNlYXJjaCBTdHJpbmcuCi0JCW4gPSB5eV9hZHZhbmNlKCk7Ci0JCXdoaWxlKG4gIT0gWVlFT0YgJiYgeXlfY3VycmVudFBvcyA8IHNlYXJjaFN0cmluZ0xlbmd0aCkKLQkJCW4gPSB5eV9hZHZhbmNlKCk7Ci0JCS8vIElmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0IG9yIHdlJ3ZlIGV4aGF1c3RlZCB0aGUgaW5wdXQsIHN0b3AgaW1tZWRpYXRlbHkuCi0JCWlmIChuID09IFlZRU9GKSB7Ci0JCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJc2FtZSA9IHRydWU7Ci0JCQkvLyBFbnN1cmUgdGhhdCB3ZSd2ZSBub3QgZW5jb3VudGVyZWQgYSBjb21wbGV0ZSBibG9jayAoPCUlPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZAotCQkJLy8gdGh1cyBmb3VuZCB0d2ljZSBhdCBjdXJyZW50LXRhcmdldExlbmd0aCBbc2luY2UgdGhlIGZpcnN0IHNjYW4gd291bGQgaGF2ZSBjb21lIG91dCB0aGlzIGZhciBhbnl3YXldLgotCQkJLy8gQ2hlY2sgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHRhcmdldCB2ZXJzdXMgdGhlIGxhc3QgdGFyZ2V0TGVuZ3RoIGNoYXJhY3RlcnMgcmVhZCBmcm9tIHRoZSBidWZmZXIKLQkJCS8vIGFuZCBzZWUgaWYgaXQgbWF0Y2hlcwotCQkJCi0JCQkvLyBzYWZldHkgY2hlY2sgZm9yIGFycmF5IGFjY2Vzc2VzICh5eV9jdXJyZW50UG9zIGlzIHRoZSAqbGFzdCogY2hhcmFjdGVyIHdlIGNhbiBjaGVjayBhZ2FpbnN0KQotCQkJaWYoeXlfY3VycmVudFBvcyA+PSBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyA8PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0JCQkJZm9yKGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5nTGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYoc2FtZSAmJiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpCi0JCQkJCQlzYW1lID0geXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSA9PSBzZWFyY2hTdHJpbmcuY2hhckF0KGkpOwotCQkJCQllbHNlIGlmKHNhbWUgJiYgIWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykKLQkJCQkJCXNhbWUgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoeXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNlYXJjaFN0cmluZy5jaGFyQXQoaSkpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHNhZmV0eSBjaGVjayBmYWlsZWQ7IG5vIG1hdGNoIGlzIHBvc3NpYmxlIHJpZ2h0IG5vdwotCQkJZWxzZSB7Ci0JCQkJc2FtZSA9IGZhbHNlOwotCQkJfQotCQkJaWYgKHNhbWUgJiYgcmVxdWlyZVRhaWxTZXBhcmF0b3IgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCQkvLyBBZGRpdGlvbmFsIGNoZWNrIGZvciBjbG9zZSB0YWdzIHRvIGVuc3VyZSB0aGF0IHRhcmdldFN0cmluZz0iPC9zY3JpcHQiIGRvZXNuJ3QgbWF0Y2gKLQkJCQkvLyAiPC9zY3JpcHRTIgotCQkJCWxhc3RDaGVja0NoYXIgPSB5eV9idWZmZXJbeXlfY3VycmVudFBvc107Ci0JCQkJLy8gU3VjY2VlZCBvbiAiPC9zY3JpcHQ+IiBhbmQgIjwvc2NyaXB0ICIKLQkJCQlpZihsYXN0Q2hlY2tDaGFyID09ICc+JyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGxhc3RDaGVja0NoYXIpKQotCQkJCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RpbGxTZWFyY2hpbmcgPSAhc2FtZSB8fCAoeXlfY3VycmVudFBvcyA8IHl5X3N0YXJ0UmVhZCArIHNlYXJjaFN0cmluZ0xlbmd0aCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKG4gIT0gWVlFT0YgfHwgc2FtZSkgewotCQkvLyBXZSd2ZSBzdG9wcGVkIHNob3J0IG9mIHRoZSBlbmQgb3IgZGVmaW5pdGVseSBmb3VuZCBhIG1hdGNoCi0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7Ci0JCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkvLyBJZiB0aGUgc2VhcmNoU3RyaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlCi0JCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5Ci0JCWlmICh5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQl5eWJlZ2luKGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOwotCQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJLy8gV2UgcmFuIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGlucHV0Ci0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7Ci0JCXl5X2N1cnJlbnRQb3MrKzsKLQl9Ci0JeXliZWdpbihleGl0U3RhdGUpOwotCS8vIElmIHRoZSBlbmRpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUKLQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQotCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpCi0JCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7Ci0JcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kCi0gKgotICogQSBnZW5lcmljIGxvb2thaGVhZC1saWtlIG9wZXJhdGlvbgotICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb0Jsb2NrU2NhbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgdGFyZ2V0Q29udGV4dCwgaW50IGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JcmV0dXJuIGRvU2Nhbih0YXJnZXQsIGZhbHNlLCB0YXJnZXRDb250ZXh0LCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlLCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QgCi0gKiBkb2VzIGEgbG9va2FoZWFkIGZvciB0aGUgY3VycmVudCB0YWcgbmFtZQotICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb0Jsb2NrVGFnU2NhbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCk7Ci0JcmV0dXJuIGRvU2NhbigiPC8iICsgZkN1cnJlbnRUYWdOYW1lLCB0cnVlLCBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKSwgWVlJTklUSUFMLCBZWUlOSVRJQUwpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZAotICoKLSAqIENvbnZlcnRzIHRoZSByYXcgY29udGV4dCBTdHJpbmcgcmV0dXJuZWQgYnkgdGhlIHByaW1HZXROZXh0VG9rZW4oKQotICogbWV0aG9kIGludG8gYSBmdWxsIElUZXh0UmVnaW9uIGJ5IHB1bGxpbmcgaW4gdmFsdWVzIGZvciB0aGUKLSAqIGN1cnJlbnQgb2Zmc2V0IHdpdGhpbiB0aGUgc2Nhbm5pbmcgdGV4dC4KLSAqCi0gKiBSZXR1cm5zIG51bGwgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgYW5kIGF0dGFjaGVzIGludGVybWl0dGVudGx5Ci0gKiBkaXNjb3ZlcmVkIHdoaXRlc3BhY2Ugb250byB0aGUgZW5kIG9mIHVzZWZ1bCByZWdpb25zLgotICoKLSAqIE5vdGUgdGhhdCB0aGlzIGFsZ29yaXRobSBjYWNoZXMgdGhlIHRva2VuIGZvbGxvd2luZyB0aGUgb25lIGJlaW5nIHJldHVybmVkCi0gKiBzbyB0aGF0IHdoaXRlc3BhY2UgY2FuIGJlIGNvbGxhcHNlZC4KLSAqLwotcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8gbG9hZCB0aGUgc3RhcnRpbmcgbm9uLXdoaXRlc3BhY2UgdG9rZW4gKGFzc3VtZSB0aGF0IGl0IGlzIHNvKQotCWlmIChmU2hvdWxkTG9hZEJ1ZmZlcmVkKSB7Ci0JCWNvbnRleHQgPSBmQnVmZmVyZWRDb250ZXh0OwotCQlzdGFydCA9IGZCdWZmZXJlZFN0YXJ0OwotCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0gZkJ1ZmZlcmVkTGVuZ3RoOwotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JfQotCWVsc2UgewotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlpZiAoY29udGV4dCA9PSBYTUxfVEFHX05BTUUpIHsKLQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCQllbHNlCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IFhNTF9UQUdfT1BFTikgewotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JCXN0YXJ0ID0geXljaGFyOwotCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJaWYgKHl5X2F0RU9GKSB7Ci0JCQlmVG9rZW5Db3VudCsrOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JLy8gc3RvcmUgdGhlIG5leHQgdG9rZW4KLQlmX2NvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX05BTUUpIHsKLQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkKLQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOwotCQllbHNlCi0JCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCX0KLQllbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7Ci0JfQotCWVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCX0KLQlmQnVmZmVyZWRDb250ZXh0ID0gZl9jb250ZXh0OwotCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOwotCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JZlNob3VsZExvYWRCdWZmZXJlZCA9IHRydWU7Ci0JaWYgKGZCdWZmZXJlZENvbnRleHQgPT0gV0hJVEVfU1BBQ0UpIHsKLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQlsZW5ndGggKz0gZkJ1ZmZlcmVkTGVuZ3RoOwotCX0KLQlpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0JCS8vIEVPRgotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGlzY292ZXJlZCAiICsgZlRva2VuQ291bnQgKyAiIHRva2Vucy4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JZlRva2VuQ291bnQrKzsKLQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgZkN1cnJlbnRUYWdOYW1lKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgWE1MVG9rZW5pemVyKCl7Ci0Jc3VwZXIoKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgWE1MVG9rZW5pemVyKGNoYXJbXSBjaGFyQXJyYXkpewotCQl0aGlzKG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSkgewotCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSwgaW50IG5ld09mZnNldCkgewotCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgbmV3T2Zmc2V0KTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0JcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCAwKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCBuZXdPZmZzZXQpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluKSB7Ci0JcmVzZXQoaW4sIDApOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAqCi0gKgotICogUmVzZXQgaW50ZXJuYWwgY291bnRlcnMgYW5kIHZhcnMgdG8gIm5ld2x5IGNyZWF0ZWQiIHZhbHVlcywgaW4gdGhlIGhvcGVzCi0gKiB0aGF0IHJlc2V0dGluZyBhIHByZS1leGlzdGluZyB0b2tlbml6ZXIgaXMgZmFzdGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgb25lLgotICoKLSAqIFRoaXMgbWV0aG9kIGNvbnRhaW5zIGNvZGUgYmxvY2tzIHRoYXQgd2VyZSBlc3NlbnRpYWxseSBkdXBsaWNhdGVkIGZyb20gdGhlCi0gKiA8ZW0+Z2VuZXJhdGVkPC9lbT4gb3V0cHV0IG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBiZWZvcmUgdGhpcyBtZXRob2Qgd2FzCi0gKiBhZGRlZC4gIFRob3NlIGNvZGUgYmxvY2tzIHdlcmUgdW5kZXIgdGhlIGFib3ZlIGNvcHlyaWdodC4KLSAqLwotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4sIGludCBuZXdPZmZzZXQpIHsKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXNldHRpbmcgdG9rZW5pemVyIik7Ly8kTk9OLU5MUy0xJAotCX0KLQlmT2Zmc2V0ID0gbmV3T2Zmc2V0OwotCi0JLyogdGhlIGlucHV0IGRldmljZSAqLwotCXl5X3JlYWRlciA9IGluOwotCi0JLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotCXl5X3N0YXRlID0gMDsKLQotCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0JLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCi0JLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLQl5eV9tYXJrZWRQb3MgPSAwOwotCi0JLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLQl5eV9jdXJyZW50UG9zID0gMDsKLQotCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLQkvKiogCi0JICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0JICogZnJvbSBpbnB1dCAKLQkgKi8KLQl5eV9lbmRSZWFkID0gMDsKLQotCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCXl5bGluZSA9IDA7Ci0KLQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQl5eWNoYXIgPSAwOwotCi0JLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotCXl5X2F0RU9GID0gZmFsc2U7Ci0KLQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCi0KLQkvKiB1c2VyIHZhcnM6ICovCi0JZlRva2VuQ291bnQgPSAwOwotIAotCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQlmQnVmZmVyZWRTdGFydCA9IDE7Ci0JZkJ1ZmZlcmVkTGVuZ3RoID0gMDsKLQlmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCi0JY29udGV4dCA9IG51bGw7Ci0Jc3RhcnQgPSAwOwotCXRleHRMZW5ndGggPSAwOwotCWxlbmd0aCA9IDA7Ci19Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqCi0JICovCi0JcHVibGljIEJsb2NrVG9rZW5pemVyIG5ld0luc3RhbmNlKCkgewotCQlYTUxUb2tlbml6ZXIgbmV3SW5zdGFuY2UgPSBuZXcgWE1MVG9rZW5pemVyKCk7Ci0JCS8vIGdsb2JhbCB0YWdtYXJrZXJzIGNhbiBiZSBzaGFyZWQ7IHRoZXkgaGF2ZSBubyBzdGF0ZSBhbmQgCi0JCS8vIGFyZSBuZXZlciBkZXN0cm95ZWQgKGUuZy4gJ3JlbGVhc2UnKQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJQmxvY2tNYXJrZXIgYmxvY2tNYXJrZXIgPSAoQmxvY2tNYXJrZXIpIGZCbG9ja01hcmtlcnMuZ2V0KGkpOwotCQkJaWYoYmxvY2tNYXJrZXIuaXNHbG9iYWwoKSkKLQkJCQluZXdJbnN0YW5jZS5hZGRCbG9ja01hcmtlcihibG9ja01hcmtlcik7Ci0JCX0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOwotCX0KLS8qIHVzZXIgbWV0aG9kICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuWE1MQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCS8vIFNjYW4gZm9yICctLT4nIGFuZCByZXR1cm4gdGhlIHRleHQgdXAgdG8gdGhhdCBwb2ludCBhcwotCS8vICAgWE1MX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoCi0JLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9YTUxfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dAotCS8vICBjb250ZXh0IGFzIHVzdWFsLgotCXJldHVybiBkb1NjYW4oIi0tPiIsIGZhbHNlLCBYTUxfQ09NTUVOVF9URVhULCBTVF9YTUxfQ09NTUVOVF9FTkQsIFNUX1hNTF9DT01NRU5UX0VORCk7Ci19Ci0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy55eV9yZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIERGQSB0cmFuc2l0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHl5X3VucGFjayhTdHJpbmcgcGFja2VkKSB7Ci0gICAgaW50IFtdIHRyYW5zID0gbmV3IGludFsxMTA1NV07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMzczNCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgdmFsdWUtLTsKLSAgICAgIGRvIHRyYW5zW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYW5zOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDEzNzIpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUKLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIAotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOwotCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovCi0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsKLQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLSAgfQotCi0gICAgCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIC0gZnJvbSB0aGUgU0VEIEpGbGV4IHNrZWxldG9uCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICB0cnkgewotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLSAgICB9Ci0gICAgLy8gRE8gTk9UIEVYSVQgdGhlIFZNIG9uIGFuIGVycm9yCi0gICAgLy8gU3lzdGVtLmV4aXQoMSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoY2hhcltdIG1hcmtlclRhZ05hbWUsIGludCBvZmZzZXQsIGludCB0YWduYW1lTGVuZ3RoKSB7Ci0JCWZvcihpbnQgaiA9IDA7IGogPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaisrKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpZkJsb2NrTWFya2Vycy5nZXQoaik7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmxlbmd0aCgpID09IHRhZ25hbWVMZW5ndGgpIHsKLQkJCQlib29sZWFuIG1hdGNoZXNTb0ZhciA9IHRydWU7Ci0JCQkJZm9yKGludCBpID0gMDsgaSA8IHRhZ25hbWVMZW5ndGggJiYgbWF0Y2hlc1NvRmFyOyBpKyspIHsKLQkJCQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQkJCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmNoYXJBdChpKSAhPSBtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKQotCQkJCQkJCW1hdGNoZXNTb0ZhciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1hcmtlci5nZXRUYWdOYW1lKCkuY2hhckF0KGkpKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkpCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYobWF0Y2hlc1NvRmFyKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKgotCSAqIFJldHVybiBBTEwgb2YgdGhlIHJlZ2lvbnMgc2Nhbm5hYmxlIHdpdGhpbiB0aGUgcmVtYWluaW5nIHRleHQKLQkgKiBOb3RlOiBmb3IgdmVyaWZpY2F0aW9uIHVzZQotCSAqLwotCXB1YmxpYyBmaW5hbCBMaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCUxpc3QgdG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQl0cnkgewotCQkJcmVnaW9uID0gZ2V0TmV4dFRva2VuKCk7Ci0JCQl3aGlsZShyZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQl0b2tlbnMuYWRkKHJlZ2lvbik7Ci0JCQkJfQotCQkJCXJlZ2lvbiA9IGdldE5leHRUb2tlbigpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChTdGFja092ZXJmbG93RXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSsiOiBpbnB1dCBjb3VsZCBub3QgYmUgdG9rZW5pemVkIGNvcnJlY3RseSBhdCBwb3NpdGlvbiAiICsgZ2V0T2Zmc2V0KCksIGUpOy8vJE5PTi1OTFMtMSQKLQkJCXRocm93IGU7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTaW5jZSB0aGlzIGlzIGNvbnZlbmllbmNlIG1ldGhvZCBhbmQgTk9UIHRoZSByZWNvbW1lbmRlZCAKLQkJCS8vIHdheSBvZiBnZXR0aW5nIHRva2VucywgbWFueSBlcnJvcnMgYXJlIHNpbXBseSBoaWRkZW4KLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiBub3QgaGFuZGxlZCByZXRyaWV2aW5nIHJlZ2lvbnM6ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0b2tlbnM7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGR1bXAoU3RyaW5nIHMpIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4ocyArICIgKCIgKyB5eWNoYXIgKyAiLSIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSh5eWxlbmd0aCgpICsgeXljaGFyKSArICIpOlwnIiArLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdVdGlscy5lc2NhcGUoeXl0ZXh0KCkpICsgIlwnIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCS8qIHVzZXIgbWV0aG9kICAtIHNrZWxldG9uLnNlZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgewotCQlyZXR1cm4geXlfYXRFT0Y7Ci0JfQotLyogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQgKi8KLXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShTdHJpbmcgbWFya2VyVGFnTmFtZSkgewotCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQl3aGlsZShibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilibG9ja3MubmV4dCgpOwotCQlpZihtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG1hcmtlclRhZ05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG1hcmtlclRhZ05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9kb19lb2YoKSB7Ci0gICAgaWYgKCF5eV9lb2ZfZG9uZSkgewotICAgICAgeXlfZW9mX2RvbmUgPSB0cnVlOwotICAgIC8vIGRvIG5vdGhpbmcsIHRoaXMgaXMgdGhlIGRvd25zdHJlYW0gcGFyc2VyJ3Mgam9iCi0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLQotICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgIHl5Y2hhcis9IHl5bGVuZ3RoKCk7Ci0KLSAgICAgIGJvb2xlYW4geXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgZm9yICh5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkOyB5eV9jdXJyZW50UG9zIDwgeXlfbWFya2VkUG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfY3VycmVudFBvcysrKSB7Ci0gICAgICAgIHN3aXRjaCAoeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdKSB7Ci0gICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB5eV9jb3VudGVkID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgIGlmICh5eV9jb3VudGVkKQotICAgICAgICAgICAgeXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoeXlfY291bnRlZCkgewotICAgICAgICBpZiAoIHl5X2FkdmFuY2UoKSA9PSAnXG4nICkgeXlsaW5lLS07Ci0gICAgICAgIGlmICggIXl5X2F0RU9GICkgeXlfY3VycmVudFBvcy0tOwotICAgICAgfQotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgeXlfc3RhdGUgPSB5eV9sZXhpY2FsX3N0YXRlOwotCi0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOwotCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLQotICAgICAgICAgIGludCB5eV9uZXh0ID0geXl0cmFuc1sgeXlfcm93TWFwW3l5X3N0YXRlXSArIHl5Y21hcFt5eV9pbnB1dF0gXTsKLSAgICAgICAgICBpZiAoeXlfbmV4dCA9PSAtMSkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIHl5X3N0YXRlID0geXlfbmV4dDsKLQotICAgICAgICAgIGludCB5eV9hdHRyaWJ1dGVzID0gWVlfQVRUUklCVVRFW3l5X3N0YXRlXTsKLSAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgMSkgPiAwICkgewotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgOCkgPiAwICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgCi0KLSAgICAgICAgY2FzZSAyOTE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhTTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSAyOTM6IGJyZWFrOwotICAgICAgICBjYXNlIDI4MzogCi0gICAgICAgIGNhc2UgMjg1OiAKLSAgICAgICAgY2FzZSAyODY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ0RBVEEgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCXl5YmVnaW4oU1RfQ0RBVEFfVEVYVCk7Ci0JcmV0dXJuIFhNTF9DREFUQV9PUEVOOwotIH0KLSAgICAgICAgY2FzZSAyOTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDI3NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDI5NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgMjk2OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSAyOTc6IGJyZWFrOwotICAgICAgICBjYXNlIDI2ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQzsKLSB9Ci0gICAgICAgIGNhc2UgMjk4OiBicmVhazsKLSAgICAgICAgY2FzZSAyNjc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgZXh0ZXJuYWwgaWQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU07Ci0gfQotICAgICAgICBjYXNlIDI5OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjYzOiAKLSAgICAgICAgY2FzZSAyNzM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzAwOiBicmVhazsKLSAgICAgICAgY2FzZSAyMzc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ2hhclJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NIQVJfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSAzMDE6IGJyZWFrOwotICAgICAgICBjYXNlIDIzNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5jb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0NPTU1FTlQpOwotCXJldHVybiBYTUxfQ09NTUVOVF9PUEVOOwotIH0KLSAgICAgICAgY2FzZSAzMDI6IGJyZWFrOwotICAgICAgICBjYXNlIDIxNTogCi0gICAgICAgIGNhc2UgMjE2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzAzOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImNvbW1lbnQgZW5kIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gWE1MX0NPTU1FTlRfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMwNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJDREFUQSBlbmQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9DREFUQV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzA1OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuUEVSZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9QRV9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDMwNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkVudGl0eVJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0VOVElUWV9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDMwNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTYwOiAKLSAgICAgICAgY2FzZSAxNzQ6IAotICAgICAgICBjYXNlIDE4MjogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUOwotIH0KLSAgICAgICAgY2FzZSAzMDg6IGJyZWFrOwotICAgICAgICBjYXNlIDE0ODogCi0gICAgICAgICAgeyAKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbXB0eSB0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBYTUxfRU1QVFlfVEFHX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMDk6IGJyZWFrOwotICAgICAgICBjYXNlIDEzMzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMxMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTMyOiAKLSAgICAgICAgICB7IAotCQkvLyBlbmRlZCB3aXRoIG5vdGhpbmcgaW5zaWRlCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzExOiBicmVhazsKLSAgICAgICAgY2FzZSAxMjg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMxMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIwOiAKLSAgICAgICAgICB7IAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5kZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzEzOiBicmVhazsKLSAgICAgICAgY2FzZSAxMTk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxucHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1BJKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9PUEVOOwotIH0KLSAgICAgICAgY2FzZSAzMTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDYzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMTU6IGJyZWFrOwotICAgICAgICBjYXNlIDU3OiAKLSAgICAgICAgY2FzZSA1OTogCi0gICAgICAgIGNhc2UgNjA6IAotICAgICAgICBjYXNlIDYxOiAKLSAgICAgICAgY2FzZSAxMzc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDMxNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgMzE3OiBicmVhazsKLSAgICAgICAgY2FzZSA1NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMTg6IGJyZWFrOwotICAgICAgICBjYXNlIDUxOiAKLSAgICAgICAgY2FzZSA1MjogCi0gICAgICAgIGNhc2UgNTM6IAotICAgICAgICAgIHsgCi0JLy8gYmxvY2sgc2NhbiB1bnRpbCBjbG9zZSBpcyBmb3VuZAotCXJldHVybiBkb1NjYW4oIj8+IiwgZmFsc2UsIFhNTF9QSV9DT05URU5ULCBTVF9YTUxfUElfVEFHX0NMT1NFLCBTVF9YTUxfUElfVEFHX0NMT1NFKTsKLSB9Ci0gICAgICAgIGNhc2UgMzE5OiBicmVhazsKLSAgICAgICAgY2FzZSA1MDogCi0gICAgICAgICAgeyAKLSAgICAgICAgeXliZWdpbihTVF9QSV9DT05URU5UKTsKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSAzMjA6IGJyZWFrOwotICAgICAgICBjYXNlIDQ2OiAKLSAgICAgICAgY2FzZSA0NzogCi0gICAgICAgIGNhc2UgNDg6IAotICAgICAgICBjYXNlIDQ5OiAKLSAgICAgICAgY2FzZSAxMjk6IAotICAgICAgICBjYXNlIDEzMDogCi0gICAgICAgIGNhc2UgMTMxOiAKLSAgICAgICAgY2FzZSAyMTc6IAotICAgICAgICBjYXNlIDIzOTogCi0gICAgICAgIGNhc2UgMjQwOiAKLSAgICAgICAgY2FzZSAyNTI6IAotICAgICAgICBjYXNlIDI1MzogCi0gICAgICAgIGNhc2UgMjYyOiAKLSAgICAgICAgY2FzZSAyNzI6IAotICAgICAgICBjYXNlIDI4MDogCi0gICAgICAgIGNhc2UgMjg0OiAKLSAgICAgICAgY2FzZSAyODc6IAotICAgICAgICBjYXNlIDI4ODogCi0gICAgICAgIGNhc2UgMjg5OiAKLSAgICAgICAgY2FzZSAyOTA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1BJX1dTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzIxOiBicmVhazsKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgIGNhc2UgNDI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImNvbW1lbnQgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0gfQotICAgICAgICBjYXNlIDMyMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkxJTkUgRkVFRCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDMyMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMDogCi0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICBjYXNlIDEyMjogCi0gICAgICAgIGNhc2UgMTI0OiAKLSAgICAgICAgY2FzZSAyMDc6IAotICAgICAgICBjYXNlIDIwODogCi0gICAgICAgIGNhc2UgMjM2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcblhNTCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzI0OiBicmVhazsKLSAgICAgICAgY2FzZSA1OiAKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgIGNhc2UgNDU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIndoaXRlIHNwYWNlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDMyNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6IAotICAgICAgICBjYXNlIDcxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJpbmFwcHJvcHJpYXRlIHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSAzMjY6IGJyZWFrOwotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgY2FzZSAxMDY6IAotICAgICAgICBjYXNlIDEwNzogCi0gICAgICAgIGNhc2UgMTkzOiAKLSAgICAgICAgY2FzZSAyMjk6IAotICAgICAgICBjYXNlIDI0ODogCi0gICAgICAgIGNhc2UgMjU5OiAKLSAgICAgICAgY2FzZSAyNjk6IAotICAgICAgICBjYXNlIDI3NzogCi0gICAgICAgIGNhc2UgMjgxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSAzMjc6IGJyZWFrOwotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgY2FzZSAxMTM6IAotICAgICAgICBjYXNlIDExNDogCi0gICAgICAgIGNhc2UgMjA0OiAKLSAgICAgICAgY2FzZSAyMzM6IAotICAgICAgICBjYXNlIDI1MDogCi0gICAgICAgIGNhc2UgMjYwOiAKLSAgICAgICAgY2FzZSAyNzA6IAotICAgICAgICBjYXNlIDI3ODogCi0gICAgICAgIGNhc2UgMjgyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDMyODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICBjYXNlIDcyOiAKLSAgICAgICAgY2FzZSA4MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5zdGFydCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19PUEVOOwotIH0KLSAgICAgICAgY2FzZSAzMjk6IGJyZWFrOwotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgIGNhc2UgMzc6IAotICAgICAgICBjYXNlIDM4OiAKLSAgICAgICAgY2FzZSAzOTogCi0gICAgICAgIGNhc2UgNDM6IAotICAgICAgICBjYXNlIDQ0OiAKLSAgICAgICAgY2FzZSA1NDogCi0gICAgICAgIGNhc2UgNTg6IAotICAgICAgICBjYXNlIDYyOiAKLSAgICAgICAgY2FzZSA2NDogCi0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICBjYXNlIDc0OiAKLSAgICAgICAgY2FzZSA4MDogCi0gICAgICAgIGNhc2UgODU6IAotICAgICAgICBjYXNlIDg2OiAKLSAgICAgICAgY2FzZSA4NzogCi0gICAgICAgIGNhc2UgODg6IAotICAgICAgICBjYXNlIDkwOiAKLSAgICAgICAgY2FzZSA5MTogCi0gICAgICAgIGNhc2UgOTM6IAotICAgICAgICBjYXNlIDk4OiAKLSAgICAgICAgY2FzZSAxMDM6IAotICAgICAgICBjYXNlIDExMDogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiISEhdW5leHBlY3RlZCEhITogXCIiICsgeXl0ZXh0KCkgKyAiXCI6IiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl5eWNoYXIgKyAiLSIgKyAoeXljaGFyICsgeXlsZW5ndGgoKSkpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gVU5ERUZJTkVEOwotIH0KLSAgICAgICAgY2FzZSAzMzA6IGJyZWFrOwotICAgICAgICBjYXNlIDM1OiAKLSAgICAgICAgY2FzZSAzNjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiQ0RBVEEgdGV4dCIpOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgYmxvY2tDb250ZXh0ID0gZG9CbG9ja1NjYW4oIl1dPiIsIFhNTF9DREFUQV9URVhULCBTVF9DREFUQV9FTkQpOy8vJE5PTi1OTFMtMSQKLQlpZihibG9ja0NvbnRleHQgPT0gWE1MX0NEQVRBX1RFWFQpCi0JCXl5YmVnaW4oU1RfQ0RBVEFfRU5EKTsKLQlyZXR1cm4gYmxvY2tDb250ZXh0OwotIH0KLSAgICAgICAgY2FzZSAzMzE6IGJyZWFrOwotICAgICAgICBjYXNlIDY1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMzI6IGJyZWFrOwotICAgICAgICBjYXNlIDY2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSAzMzM6IGJyZWFrOwotICAgICAgICBjYXNlIDY3OiAKLSAgICAgICAgY2FzZSA2OTogCi0gICAgICAgIGNhc2UgNzA6IAotICAgICAgICBjYXNlIDE0NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDMzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZihpc0Jsb2NrTWFya2VyKCkpIHsKLSAgICAgICAgCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCX0KLQllbHNlCi0gICAgICAgIAl5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMzU6IGJyZWFrOwotICAgICAgICBjYXNlIDc1OiAKLSAgICAgICAgY2FzZSA3NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzM2OiBicmVhazsKLSAgICAgICAgY2FzZSA3NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzM3OiBicmVhazsKLSAgICAgICAgY2FzZSA3ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZXF1YWxzIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSAzMzg6IGJyZWFrOwotICAgICAgICBjYXNlIDc5OiAKLSAgICAgICAgY2FzZSA4MTogCi0gICAgICAgIGNhc2UgODI6IAotICAgICAgICBjYXNlIDE1MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDMzOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgODQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRlY2xhcmF0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDM0MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgODk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzQxOiBicmVhazsKLSAgICAgICAgY2FzZSA5MjogCi0gICAgICAgIGNhc2UgOTQ6IAotICAgICAgICBjYXNlIDk1OiAKLSAgICAgICAgY2FzZSA5NjogCi0gICAgICAgIGNhc2UgMTY2OiAKLSAgICAgICAgY2FzZSAxNjc6IAotICAgICAgICBjYXNlIDE3MDogCi0gICAgICAgIGNhc2UgMTcxOiAKLSAgICAgICAgY2FzZSAyMjQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgcHVibGljIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsKLSB9Ci0gICAgICAgIGNhc2UgMzQyOiBicmVhazsKLSAgICAgICAgY2FzZSA5NzogCi0gICAgICAgIGNhc2UgOTk6IAotICAgICAgICBjYXNlIDEwMDogCi0gICAgICAgIGNhc2UgMTAxOiAKLSAgICAgICAgY2FzZSAxNzg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgc3lzdGVtIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsKLSB9Ci0gICAgICAgIGNhc2UgMzQzOiBicmVhazsKLSAgICAgICAgY2FzZSAxMDI6IAotICAgICAgICBjYXNlIDEwNDogCi0gICAgICAgIGNhc2UgMTA1OiAKLSAgICAgICAgY2FzZSAxODY6IAotICAgICAgICBjYXNlIDE4NzogCi0gICAgICAgIGNhc2UgMTkwOiAKLSAgICAgICAgY2FzZSAxOTE6IAotICAgICAgICBjYXNlIDIyNzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDM0NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDM0NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA5OiAKLSAgICAgICAgY2FzZSAxMTE6IAotICAgICAgICBjYXNlIDExMjogCi0gICAgICAgIGNhc2UgMTk3OiAKLSAgICAgICAgY2FzZSAxOTg6IAotICAgICAgICBjYXNlIDIwMTogCi0gICAgICAgIGNhc2UgMjAyOiAKLSAgICAgICAgY2FzZSAyMzE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDM0NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzQ3OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZW5kIHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfRU5EX1RBR19PUEVOOwotIH0KLSAgICAgICAgY2FzZSAzNDg6IGJyZWFrOwotICAgICAgICBjYXNlIDExNjogCi0gICAgICAgIGNhc2UgMTE3OiAKLSAgICAgICAgICB7IAotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQkgfQotICAgICAgICBjYXNlIDM0OTogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9YTUxUb2tlbml6ZXIuamZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL1hNTFRva2VuaXplci5qZmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyYTkxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL1hNTFRva2VuaXplci5qZmxleAorKysgL2Rldi9udWxsCkBAIC0xLDEzMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsNCi0NCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1Rva2VuaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5YTUxQYXJzZXJSZWdpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0Ow0KLQ0KLSUlDQotDQotJXsNCi0JcHJpdmF0ZSBpbnQgZlRva2VuQ291bnQgPSAwOw0KLSANCi0JLy8gcmVxdWlyZWQgaG9sZGVycyBmb3Igd2hpdGUtc3BhY2UgY29tcGFjdGluZw0KLQlwcml2YXRlIGJvb2xlYW4gZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQlwcml2YXRlIFN0cmluZyBmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsNCi0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQgPSAxOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGggPSAwOw0KLQlwcml2YXRlIFN0cmluZyBmX2NvbnRleHQgPSBudWxsOw0KLQ0KLQkvLyBzdGF0ZSBzdGFjayBmb3IgaGFuZGxpbmcgZW1iZWRkZWQgcmVnaW9ucw0KLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7DQotDQotCXByaXZhdGUgU3RyaW5nIGNvbnRleHQgPSBudWxsOw0KLQlwcml2YXRlIGludCBzdGFydCA9IDA7DQotCXByaXZhdGUgaW50IHRleHRMZW5ndGggPSAwOw0KLQlwcml2YXRlIGludCBsZW5ndGggPSAwOw0KLQ0KLQkvLyBvZmZzZXQgZm9yIHRyYWNraW5nIHBvc2l0aW9uIHNwZWNpZmljIGJsb2NrIHRhZ3MNCi0JcHJpdmF0ZSBpbnQgZk9mZnNldCA9IDA7DQotCQ0KLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgYmVpbmcgb3BlbmVkDQotCXByaXZhdGUgU3RyaW5nIGZDdXJyZW50VGFnTmFtZSA9IG51bGw7DQotDQotCS8vIHRoZSBsaXN0IG9mIHRhZyBuYW1lIEJsb2NrTWFya2Vycw0KLQlwcml2YXRlIExpc3QgZkJsb2NrTWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsNCi0NCi0JLy8gcmVxdWlyZWQgdG8gbm90IHNlZWsgdGV4dCBibG9ja3Mgb24gYW4gZW5kIHRhZw0KLQlwcml2YXRlIGJvb2xlYW4gZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCXByaXZhdGUgYm9vbGVhbiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSB0cnVlOw0KLQ0KLQlwcml2YXRlIFhNTFBhcnNlclJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBuZXcgWE1MUGFyc2VyUmVnaW9uRmFjdG9yeSgpOw0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kIA0KLSAqLw0KLXB1YmxpYyBmaW5hbCB2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgew0KLQlpZihjb250YWluc1RhZ05hbWUobWFya2VyLmdldFRhZ05hbWUoKSkpDQotCQlyZXR1cm47DQotCWZCbG9ja01hcmtlcnMuYWRkKG1hcmtlcik7DQotfQ0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kIA0KLSAqLw0KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgew0KLQlmQmxvY2tNYXJrZXJzLnJlbW92ZShtYXJrZXIpOw0KLX0NCi0vKioNCi0gKiB1c2VyIG1ldGhvZCANCi0gKi8NCi1wdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnbmFtZSkgew0KLQlpZiAoZkJsb2NrTWFya2VycyAhPSBudWxsKSB7DQotCQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCQl3aGlsZSAoYmxvY2tzLmhhc05leHQoKSkgew0KLQkJCWlmICgoKEJsb2NrTWFya2VyKSBibG9ja3MubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzKHRhZ25hbWUpKQ0KLQkJCQlibG9ja3MucmVtb3ZlKCk7DQotCQl9DQotCX0NCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmVCbG9ja2luZygpIHsNCi0JcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgew0KLQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBuZXdWYWx1ZTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShmQ3VycmVudFRhZ05hbWUpOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KFN0cmluZyBuYW1lKSB7DQotCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7DQotCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7DQotCQlpZihjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOw0KLQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpDQotCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7DQotCX0NCi0JcmV0dXJuIHRydWU7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoKSB7DQotCXJldHVybiBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dChTdHJpbmcgbmFtZSkgew0KLQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsNCi0Jd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOw0KLQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpDQotCQkJcmV0dXJuIG1hcmtlci5nZXRDb250ZXh0KCk7DQotCX0NCi0JcmV0dXJuIEJMT0NLX1RFWFQ7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIExpc3QgZ2V0QmxvY2tNYXJrZXJzKCkgew0KLQlyZXR1cm4gZkJsb2NrTWFya2VyczsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsNCi0JcmV0dXJuIGZPZmZzZXQgKyB5eWNoYXI7DQotfQ0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKCkgew0KLQlyZXR1cm4gaXNCbG9ja01hcmtlcihmQ3VycmVudFRhZ05hbWUpOw0KLX0NCi1wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgew0KLQlpZiAoIWZJc0Jsb2NraW5nRW5hYmxlZCkNCi0JCXJldHVybiBmYWxzZTsNCi0JcmV0dXJuIGNvbnRhaW5zVGFnTmFtZSh0YWdOYW1lKTsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QNCi0gKi8NCi1wdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrVGFnU2NhbihTdHJpbmcgbmV3VGFnTmFtZSkgew0KLQliZWdpbkJsb2NrTWFya2VyU2NhbihuZXdUYWdOYW1lLCBCTE9DS19URVhUKTsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QNCi0gKg0KLSAqIFNwZWNpYWwgdG9rZW5pemVyIHNldHVwLiAgQWxsb3dzIHRva2VuaXphdGlvbiB0byBiZSBpbml0aWF0ZWQgYXQgdGhlDQotICogc3RhcnQgb2YgYSB0ZXh0IGJsb2NrIHdpdGhpbiBhICJuZXdUYWdOYW1lIiB0YWcuDQotICoNCi0gKiBFeGFtcGxlOiANCi0gKglUb2tlbml6ZXIgdG9rZXIgPSBuZXcgVG9rZW5pemVyKCk7DQotICoJdG9rZXIuc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGZhbHNlKTsNCi0gKgl0b2tlci5yZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoImFmaXVocXdrZWpodGFzaWhnYWxrd2h0cTwvc2NyaXB0ZXI+PC9zY3I+PC9zY3JpcHQ+YXNnZGFzZ2EiKSk7DQotICoJdG9rZXIuYmVnaW5CbG9ja01hcmtlclNjYW4oInNjcmlwdCIsIEJMT0NLX1RFWFQpOw0KLSAqCXRva2VyLmdldFJlZ2lvbnMoKTsgDQotICoNCi0gKiBSZXR1cm5zOg0KLSAqCUJMT0NLX1RFWFQ6IDAtNDANCi0gKglYTUxfRU5EX1RBR19PUEVOOiA0MS00Mg0KLSAqCVhNTF9UQUdfTkFNRTogNDMtNDgNCi0gKglYTUxfVEFHX0NMT1NFOiA0OS00OQ0KLSAqCVhNTF9DT05URU5UOiA1MC01Nw0KLSAqDQotICovDQotcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja01hcmtlclNjYW4oU3RyaW5nIG5ld1RhZ05hbWUsIFN0cmluZyBibG9ja2NvbnRleHQpIHsNCi0JeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCWZDdXJyZW50VGFnTmFtZSA9IG5ld1RhZ05hbWU7DQotfQ0KLS8qKg0KLSAqIE1ldGhvZCBkb1NjYW4uDQotICogDQotICogUmV0dXJucyBhIGNvbnRleHQgcmVnaW9uIGZvciBhbGwgb2YgdGhlIHRleHQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiB1cHRvIHRoZSBlbmQgb2YgaW5wdXQgb3INCi0gKiB0byByaWdodCAqYmVmb3JlKiB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIHNlYXJjaFN0cmluZw0KLSAqIA0KLSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgLSB0YXJnZXQgc3RyaW5nIHRvIHNlYXJjaCBmb3IgZXguOiAiLS0+IiwgIjwvdGFnbmFtZSINCi0gKiBAcGFyYW0gcmVxdWlyZVRhaWxTZXBhcmF0b3IgLSB3aGV0aGVyIHRoZSB0YXJnZXQgbXVzdCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIG9yICc+Jw0KLSAqIEBwYXJhbSBjb250ZXh0IC0gdGhlIGNvbnRleHQgb2YgdGhlIHNjYW5uZWQgcmVnaW9uIGlmIG5vbi16ZXJvIGxlbmd0aA0KLSAqIEBwYXJhbSBleGl0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHJlZ2lvbiB3YXMgb2Ygbm9uLXplcm8gbGVuZ3RoDQotICogQHBhcmFtIGFib3J0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHNlYXJjaFN0cmluZyB3YXMgZm91bmQgaW1tZWRpYXRlbHkNCi0gKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBjb250ZXh0IGZvdW5kOiB0aGUgZGVzaXJlZCBjb250ZXh0IG9uIGEgbm9uLXplcm8gbGVuZ3RoIG1hdGNoLCB0aGUgYWJvcnRDb250ZXh0IG9uIGltbWVkaWF0ZSBzdWNjZXNzDQotICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAqLw0KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvU2NhbihTdHJpbmcgc2VhcmNoU3RyaW5nLCBib29sZWFuIHJlcXVpcmVUYWlsU2VwYXJhdG9yLCBTdHJpbmcgc2VhcmNoQ29udGV4dCwgaW50IGV4aXRTdGF0ZSwgaW50IGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOw0KLQkvLyBEaXNhYmxlIGZ1cnRoZXIgYmxvY2sgKHByb2JhYmx5KQ0KLQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsNCi0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsNCi0JaW50IG4gPSAwOw0KLQljaGFyIGxhc3RDaGVja0NoYXI7DQotCWludCBpOw0KLQlib29sZWFuIHNhbWUgPSBmYWxzZTsNCi0Jd2hpbGUgKHN0aWxsU2VhcmNoaW5nKSB7DQotCQluID0gMDsNCi0JCS8vIEVuc3VyZSB0aGF0IGVub3VnaCBkYXRhIGZyb20gdGhlIGlucHV0IGV4aXN0cyB0byBjb21wYXJlIGFnYWluc3QgdGhlIHNlYXJjaCBTdHJpbmcuDQotCQluID0geXlfYWR2YW5jZSgpOw0KLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQ0KLQkJCW4gPSB5eV9hZHZhbmNlKCk7DQotCQkvLyBJZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydCBvciB3ZSd2ZSBleGhhdXN0ZWQgdGhlIGlucHV0LCBzdG9wIGltbWVkaWF0ZWx5Lg0KLQkJaWYgKG4gPT0gWVlFT0YpIHsNCi0JCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJc2FtZSA9IHRydWU7DQotCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDwlJT4pIHRoYXQgd2FzICpzaG9ydGVyKiB0aGFuIHRoZSBjbG9zZVRhZ1N0cmluZyBhbmQNCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uDQotCQkJLy8gQ2hlY2sgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHRhcmdldCB2ZXJzdXMgdGhlIGxhc3QgdGFyZ2V0TGVuZ3RoIGNoYXJhY3RlcnMgcmVhZCBmcm9tIHRoZSBidWZmZXINCi0JCQkvLyBhbmQgc2VlIGlmIGl0IG1hdGNoZXMNCi0JCQkNCi0JCQkvLyBzYWZldHkgY2hlY2sgZm9yIGFycmF5IGFjY2Vzc2VzICh5eV9jdXJyZW50UG9zIGlzIHRoZSAqbGFzdCogY2hhcmFjdGVyIHdlIGNhbiBjaGVjayBhZ2FpbnN0KQ0KLQkJCWlmKHl5X2N1cnJlbnRQb3MgPj0gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgPD0geXlfYnVmZmVyLmxlbmd0aCkgew0KLQkJCQlmb3IoaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdMZW5ndGg7IGkrKykgew0KLQkJCQkJaWYoc2FtZSAmJiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpDQotCQkJCQkJc2FtZSA9IHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKTsNCi0JCQkJCWVsc2UgaWYoc2FtZSAmJiAhZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQ0KLQkJCQkJCXNhbWUgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoeXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNlYXJjaFN0cmluZy5jaGFyQXQoaSkpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCS8vIHNhZmV0eSBjaGVjayBmYWlsZWQ7IG5vIG1hdGNoIGlzIHBvc3NpYmxlIHJpZ2h0IG5vdw0KLQkJCWVsc2Ugew0KLQkJCQlzYW1lID0gZmFsc2U7DQotCQkJfQ0KLQkJCWlmIChzYW1lICYmIHJlcXVpcmVUYWlsU2VwYXJhdG9yICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoKSB7DQotCQkJCS8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIGNsb3NlIHRhZ3MgdG8gZW5zdXJlIHRoYXQgdGFyZ2V0U3RyaW5nPSI8L3NjcmlwdCIgZG9lc24ndCBtYXRjaA0KLQkJCQkvLyAiPC9zY3JpcHRTIg0KLQkJCQlsYXN0Q2hlY2tDaGFyID0geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdOw0KLQkJCQkvLyBTdWNjZWVkIG9uICI8L3NjcmlwdD4iIGFuZCAiPC9zY3JpcHQgIg0KLQkJCQlpZihsYXN0Q2hlY2tDaGFyID09ICc+JyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGxhc3RDaGVja0NoYXIpKQ0KLQkJCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXN0aWxsU2VhcmNoaW5nID0gIXNhbWUgfHwgKHl5X2N1cnJlbnRQb3MgPCB5eV9zdGFydFJlYWQgKyBzZWFyY2hTdHJpbmdMZW5ndGgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlpZiAobiAhPSBZWUVPRiB8fCBzYW1lKSB7DQotCQkvLyBXZSd2ZSBzdG9wcGVkIHNob3J0IG9mIHRoZSBlbmQgb3IgZGVmaW5pdGVseSBmb3VuZCBhIG1hdGNoDQotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOw0KLQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7DQotCQkvLyBJZiB0aGUgc2VhcmNoU3RyaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlDQotCQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQ0KLQkJaWYgKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsNCi0JCQl5eWJlZ2luKGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOw0KLQkJCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7DQotCQl9DQotCX0NCi0JZWxzZSB7DQotCQkvLyBXZSByYW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQNCi0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7DQotCQl5eV9jdXJyZW50UG9zKys7DQotCX0NCi0JeXliZWdpbihleGl0U3RhdGUpOw0KLQkvLyBJZiB0aGUgZW5kaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlDQotCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5DQotCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpDQotCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOw0KLQlyZXR1cm4gc2VhcmNoQ29udGV4dDsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QNCi0gKg0KLSAqIEEgZ2VuZXJpYyBsb29rYWhlYWQtbGlrZSBvcGVyYXRpb24NCi0gKi8NCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb0Jsb2NrU2NhbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgdGFyZ2V0Q29udGV4dCwgaW50IGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCXJldHVybiBkb1NjYW4odGFyZ2V0LCBmYWxzZSwgdGFyZ2V0Q29udGV4dCwgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSwgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7DQotfQ0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kIA0KLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lDQotICovDQotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1RhZ1NjYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKTsNCi0JcmV0dXJuIGRvU2NhbigiPC8iICsgZkN1cnJlbnRUYWdOYW1lLCB0cnVlLCBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKSwgWVlJTklUSUFMLCBZWUlOSVRJQUwpOw0KLX0NCi0vKioNCi0gKiB1c2VyIG1ldGhvZA0KLSAqDQotICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpDQotICogbWV0aG9kIGludG8gYSBmdWxsIElUZXh0UmVnaW9uIGJ5IHB1bGxpbmcgaW4gdmFsdWVzIGZvciB0aGUNCi0gKiBjdXJyZW50IG9mZnNldCB3aXRoaW4gdGhlIHNjYW5uaW5nIHRleHQuDQotICoNCi0gKiBSZXR1cm5zIG51bGwgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgYW5kIGF0dGFjaGVzIGludGVybWl0dGVudGx5DQotICogZGlzY292ZXJlZCB3aGl0ZXNwYWNlIG9udG8gdGhlIGVuZCBvZiB1c2VmdWwgcmVnaW9ucy4NCi0gKg0KLSAqIE5vdGUgdGhhdCB0aGlzIGFsZ29yaXRobSBjYWNoZXMgdGhlIHRva2VuIGZvbGxvd2luZyB0aGUgb25lIGJlaW5nIHJldHVybmVkDQotICogc28gdGhhdCB3aGl0ZXNwYWNlIGNhbiBiZSBjb2xsYXBzZWQuDQotICovDQotcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCS8vIGxvYWQgdGhlIHN0YXJ0aW5nIG5vbi13aGl0ZXNwYWNlIHRva2VuIChhc3N1bWUgdGhhdCBpdCBpcyBzbykNCi0JaWYgKGZTaG91bGRMb2FkQnVmZmVyZWQpIHsNCi0JCWNvbnRleHQgPSBmQnVmZmVyZWRDb250ZXh0Ow0KLQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsNCi0JCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7DQotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7DQotCX0NCi0JZWxzZSB7DQotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJaWYgKGNvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7DQotCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkNCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7DQotCQkJZWxzZQ0KLQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOw0KLQkJfQ0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsNCi0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOw0KLQkJfQ0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7DQotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCQl9DQotCQlzdGFydCA9IHl5Y2hhcjsNCi0JCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJaWYgKHl5X2F0RU9GKSB7DQotCQkJZlRva2VuQ291bnQrKzsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JfQ0KLQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbg0KLQlmX2NvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCWlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7DQotCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQ0KLQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOw0KLQkJZWxzZQ0KLQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7DQotCX0NCi0JZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfT1BFTikgew0KLQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsNCi0JfQ0KLQllbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgew0KLQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCX0NCi0JZkJ1ZmZlcmVkQ29udGV4dCA9IGZfY29udGV4dDsNCi0JZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7DQotCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7DQotCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOw0KLQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCA9PSBXSElURV9TUEFDRSkgew0KLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQkJbGVuZ3RoICs9IGZCdWZmZXJlZExlbmd0aDsNCi0JfQ0KLQlpZiAoY29udGV4dCA9PSBudWxsKSB7DQotCQkvLyBFT0YNCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGlzY292ZXJlZCAiICsgZlRva2VuQ291bnQgKyAiIHRva2Vucy4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCWZUb2tlbkNvdW50Kys7DQotCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBmQ3VycmVudFRhZ05hbWUpOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyBYTUxUb2tlbml6ZXIoKXsNCi0Jc3VwZXIoKTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgWE1MVG9rZW5pemVyKGNoYXJbXSBjaGFyQXJyYXkpew0KLQkJdGhpcyhuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSkpOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsNCi0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KSB7DQotCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgbmV3T2Zmc2V0KTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7DQotCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgMCk7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbiwgaW50IG5ld09mZnNldCkgew0KLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIG5ld09mZnNldCk7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4pIHsNCi0JcmVzZXQoaW4sIDApOw0KLX0NCi0vKioNCi0gKiB1c2VyIG1ldGhvZCAqDQotICoNCi0gKiBSZXNldCBpbnRlcm5hbCBjb3VudGVycyBhbmQgdmFycyB0byAibmV3bHkgY3JlYXRlZCIgdmFsdWVzLCBpbiB0aGUgaG9wZXMNCi0gKiB0aGF0IHJlc2V0dGluZyBhIHByZS1leGlzdGluZyB0b2tlbml6ZXIgaXMgZmFzdGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgb25lLg0KLSAqDQotICogVGhpcyBtZXRob2QgY29udGFpbnMgY29kZSBibG9ja3MgdGhhdCB3ZXJlIGVzc2VudGlhbGx5IGR1cGxpY2F0ZWQgZnJvbSB0aGUNCi0gKiA8ZW0+Z2VuZXJhdGVkPC9lbT4gb3V0cHV0IG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBiZWZvcmUgdGhpcyBtZXRob2Qgd2FzDQotICogYWRkZWQuICBUaG9zZSBjb2RlIGJsb2NrcyB3ZXJlIHVuZGVyIHRoZSBhYm92ZSBjb3B5cmlnaHQuDQotICovDQotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4sIGludCBuZXdPZmZzZXQpIHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc2V0dGluZyB0b2tlbml6ZXIiKTsvLyROT04tTkxTLTEkDQotCX0NCi0JZk9mZnNldCA9IG5ld09mZnNldDsNCi0NCi0JLyogdGhlIGlucHV0IGRldmljZSAqLw0KLQl5eV9yZWFkZXIgPSBpbjsNCi0NCi0JLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLw0KLQl5eV9zdGF0ZSA9IDA7DQotDQotCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8NCi0JeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsNCi0NCi0JLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcw0KLQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0JamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7DQotDQotCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovDQotCXl5X21hcmtlZFBvcyA9IDA7DQotDQotCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotCXl5X3B1c2hiYWNrUG9zID0gMDsNCi0NCi0JLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovDQotCXl5X2N1cnJlbnRQb3MgPSAwOw0KLQ0KLQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8NCi0JeXlfc3RhcnRSZWFkID0gMDsNCi0NCi0JLyoqIA0KLQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQNCi0JICogZnJvbSBpbnB1dCANCi0JICovDQotCXl5X2VuZFJlYWQgPSAwOw0KLQ0KLQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JeXlsaW5lID0gMDsNCi0NCi0JLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotCXl5Y2hhciA9IDA7DQotDQotCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0JeXlfYXRFT0YgPSBmYWxzZTsNCi0NCi0JLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovDQotCXl5X2VvZl9kb25lID0gZmFsc2U7DQotDQotDQotCS8qIHVzZXIgdmFyczogKi8NCi0JZlRva2VuQ291bnQgPSAwOw0KLSANCi0JZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsNCi0JZkJ1ZmZlcmVkU3RhcnQgPSAxOw0KLQlmQnVmZmVyZWRMZW5ndGggPSAwOw0KLQlmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOw0KLQ0KLQljb250ZXh0ID0gbnVsbDsNCi0Jc3RhcnQgPSAwOw0KLQl0ZXh0TGVuZ3RoID0gMDsNCi0JbGVuZ3RoID0gMDsNCi19DQotDQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZA0KLQkgKg0KLQkgKi8NCi0JcHVibGljIEJsb2NrVG9rZW5pemVyIG5ld0luc3RhbmNlKCkgew0KLQkJWE1MVG9rZW5pemVyIG5ld0luc3RhbmNlID0gbmV3IFhNTFRva2VuaXplcigpOw0KLQkJLy8gZ2xvYmFsIHRhZ21hcmtlcnMgY2FuIGJlIHNoYXJlZDsgdGhleSBoYXZlIG5vIHN0YXRlIGFuZCANCi0JCS8vIGFyZSBuZXZlciBkZXN0cm95ZWQgKGUuZy4gJ3JlbGVhc2UnKQ0KLQkJZm9yKGludCBpID0gMDsgaSA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBpKyspIHsNCi0JCQlCbG9ja01hcmtlciBibG9ja01hcmtlciA9IChCbG9ja01hcmtlcikgZkJsb2NrTWFya2Vycy5nZXQoaSk7DQotCQkJaWYoYmxvY2tNYXJrZXIuaXNHbG9iYWwoKSkNCi0JCQkJbmV3SW5zdGFuY2UuYWRkQmxvY2tNYXJrZXIoYmxvY2tNYXJrZXIpOw0KLQkJfQ0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOw0KLQl9DQotLyogdXNlciBtZXRob2QgKi8NCi1wcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuWE1MQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkvLyBTY2FuIGZvciAnLS0+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMNCi0JLy8gICBYTUxfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gNCi0JLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9YTUxfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dA0KLQkvLyAgY29udGV4dCBhcyB1c3VhbC4NCi0JcmV0dXJuIGRvU2NhbigiLS0+IiwgZmFsc2UsIFhNTF9DT01NRU5UX1RFWFQsIFNUX1hNTF9DT01NRU5UX0VORCwgU1RfWE1MX0NPTU1FTlRfRU5EKTsNCi19DQotJX0NCi0NCi0lZW9mew0KLS8vIGRvIG5vdGhpbmcsIHRoaXMgaXMgdGhlIGRvd25zdHJlYW0gcGFyc2VyJ3Mgam9iDQotJWVvZn0NCi0NCi0lcHVibGljDQotJWNsYXNzIFhNTFRva2VuaXplcg0KLSVpbXBsZW1lbnRzIEJsb2NrVG9rZW5pemVyLCBET01SZWdpb25Db250ZXh0DQotJWZ1bmN0aW9uIHByaW1HZXROZXh0VG9rZW4NCi0ldHlwZSBTdHJpbmcNCi0lY2hhcg0KLSVsaW5lDQotJXVuaWNvZGUNCi0lcGFjaw0KLQ0KLSVzdGF0ZSBTVF9DREFUQV9URVhUDQotJXN0YXRlIFNUX0NEQVRBX0VORA0KLSVzdGF0ZSBTVF9YTUxfQ09NTUVOVA0KLSVzdGF0ZSBTVF9YTUxfQ09NTUVOVF9FTkQNCi0lc3RhdGUgU1RfUEkNCi0lc3RhdGUgU1RfUElfV1MNCi0lc3RhdGUgU1RfUElfQ09OVEVOVA0KLSVzdGF0ZSBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUNCi0lc3RhdGUgU1RfWE1MX1BJX0VRVUFMUw0KLSVzdGF0ZSBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFDQotJXN0YXRlIFNUX1hNTF9QSV9UQUdfQ0xPU0UNCi0lc3RhdGUgU1RfREhUTUxfQVRUUklCVVRFX05BTUUNCi0lc3RhdGUgU1RfREhUTUxfRVFVQUxTDQotJXN0YXRlIFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRQ0KLSVzdGF0ZSBTVF9ESFRNTF9UQUdfQ0xPU0UNCi0NCi0vLyBub3JtYWwgdGFnIHN0YXRlcw0KLSVzdGF0ZSBTVF9YTUxfVEFHX05BTUUNCi0lc3RhdGUgU1RfWE1MX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX1hNTF9FUVVBTFMNCi0lc3RhdGUgU1RfWE1MX0FUVFJJQlVURV9WQUxVRQ0KLQ0KLS8vIGRlY2xhcmF0aW9uIChEVEQpIHN0YXRlcw0KLSVzdGF0ZSBTVF9YTUxfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFDQotDQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9ODQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEDQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQw0KLSVzdGF0ZSBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0NCi0NCi0lc3RhdGUgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVA0KLQ0KLSVzdGF0ZSBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UDQotDQotJXN0YXRlIFNUX0JMT0NLX1RBR19TQ0FODQotDQotLy8gTGV0dGVyID0gKFtBLVphLXpdKQ0KLS8vIERpZ2l0ID0gKFswLTldKQ0KLQ0KLS8qKg0KLSAqIHNtYWxsZXIgdG9rZW5zDQotICovDQotZ2VuZXJpY1RhZ09wZW4gICAgICAgPSA8DQotZ2VuZXJpY1RhZ0Nsb3NlICAgICAgPSA+DQotZ2VuZXJpY0VuZFRhZ09wZW4gICAgPSA8XC8NCi1nZW5lcmljRW1wdHlUYWdDbG9zZSA9IFwvPg0KLQ0KLVBJc3RhcnQgPSA8XD8NCi1QSWVuZCAgID0gXD8+DQotDQotDQotLy8gWzFdIGRvY3VtZW50IDo6PSBwcm9sb2cgZWxlbWVudCBNaXNjKg0KLWRvY3VtZW50ID0gKHtwcm9sb2d9IHtlbGVtZW50fSB7TWlzY30qKQ0KLQ0KLS8vIFsyXSBDaGFyIDo6PSAjeDkgfCAjeEEgfCAjeEQgfCBbI3gyMC0jeEQ3RkZdIHwgWyN4RTAwMC0jeEZGRkRdIHwgWyN4MTAwMDAtI3gxMEZGRkZdDQotIC8vQ2hhciA9ICguKQ0KLUNoYXIgPSBbXHgwOVx4MEFceDBEXHgyMC1cdUQ3RkZcdUUwMDAtXHVGRkZEXSANCi0NCi0vLyBbM10gUyA6Oj0gKDB4MjAgfCAweDkgfCAweEQgfCAweEEpKw0KLVMgPSBbXHgyMFx4MDlceDBEXHgwQV0rDQotDQotLy8gWzRdIE5hbWVDaGFyIDo6PSBMZXR0ZXIgfCBEaWdpdCB8ICcuJyB8ICctJyB8ICdfJyB8ICc6JyB8IENvbWJpbmluZ0NoYXIgfCBFeHRlbmRlcg0KLU5hbWVDaGFyID0gKHtMZXR0ZXJ9IHwge0RpZ2l0fSB8IFwuIHwgXC0gfCBfIHwgOiB8IHtDb21iaW5pbmdDaGFyfSB8IHtFeHRlbmRlcn0pDQotDQotLy8gWzVdIE5hbWUgOjo9IChMZXR0ZXIgfCAnXycgfCAnOicpIE5hbWVDaGFyKg0KLS8vTmFtZSA9ICh7TmFtZUNoYXJ9e05hbWVDaGFyfSopDQotTmFtZSA9ICh7TGV0dGVyfSB8IF8gfCA6KXtOYW1lQ2hhcn0qDQotDQotLy8gWzZdIE5hbWVzIDo6PSB7TmFtZX0gKHtTfSB7TmFtZX0pKg0KLU5hbWVzID0gKHtOYW1lfSAoe1N9IHtOYW1lfSkqKQ0KLQ0KLS8vIFs3XSBObXRva2VuIDo6PSAoTmFtZUNoYXIpKw0KLU5tdG9rZW4gPSAoe05hbWVDaGFyfSspDQotDQotLy8gWzhdIE5tdG9rZW5zIDo6PSBObXRva2VuIChTIE5tdG9rZW4pKg0KLU5tdG9rZW5zID0gKHtObXRva2VufSAoe1N9IHtObXRva2VufSkqKQ0KLQ0KLS8vIFs5XSBFbnRpdHlWYWx1ZSA6Oj0gJyInIChbXiUmIl0gfCBQRVJlZmVyZW5jZSB8IFJlZmVyZW5jZSkqICciJyB8ICAiJyIgKFteJSYnXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogIiciDQotRW50aXR5VmFsdWUgPSAoXCIgKFteJSZcIl0gfCB7UEVSZWZlcmVuY2V9IHwge1JlZmVyZW5jZX0pKiBcIiB8ICBcJyAoW14lJlwnXSB8IHtQRVJlZmVyZW5jZX0gfCB7UmVmZXJlbmNlfSkqIFwnKQ0KLQ0KLS8vIFsxMF0gQXR0VmFsdWUgOjo9ICciJyAoW148JiJdIHwgUmVmZXJlbmNlKSogJyInIHwgICInIiAoW148JiddIHwgUmVmZXJlbmNlKSogIiciDQotQXR0VmFsdWUgPSAoIFwiIChbXlwiXSB8IHtSZWZlcmVuY2V9KSogXCIgfCBcJyAoW15cJ10gfCB7UmVmZXJlbmNlfSkqIFwnICB8IChbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXXxcLytbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXSApKiApDQotDQotLy8gWzExXSBTeXN0ZW1MaXRlcmFsIDo6PSAoJyInIFteIl0qICciJykgfCAoIiciIFteJ10qICInIikgDQotU3lzdGVtTGl0ZXJhbCA9ICgoXCIgW15cIl0qIFwiKSB8IChcJyBbXlwnXSogXCcpKSANCi0NCi0vLyBbMTJdIFB1YmlkTGl0ZXJhbCA6Oj0gJyInIFB1YmlkQ2hhciogJyInIHwgIiciIChQdWJpZENoYXIgLSAiJyIpKiAiJyINCi1QdWJpZExpdGVyYWwgPSAoXCIge1B1YmlkQ2hhcn0qIFwiIHwgXCcgKHtQdWJpZENoYXJ9XCcpKiAiJyIpDQotDQotLy8gWzEzXSBQdWJpZENoYXIgOjo9ICN4MjAgfCAjeEQgfCAjeEEgfCBbYS16QS1aMC05XSB8IFstJygpKywuLzo9PzshKiNAJF8lXQ0KLVB1YmlkQ2hhciA9IChbXDA0MFwwMTVcMDEyXSB8IFthLXpBLVowLTldIHwgW1wtXCcoKVwrLC5cLzo9PzshXCojQFwkXyVdKQ0KLQ0KLS8vIFsxNF0gQ2hhckRhdGEgOjo9IFtePCZdKiAtIChbXjwmXSogJ11dPicgW148Jl0qKQ0KLS8vIGltcGxlbWVudCBsb29rYWhlYWQgYmVoYXZpb3IgZHVyaW5nIGFjdGlvbiBkZWZpbml0aW9uDQotQ2hhckRhdGEgPSAoW148JihcXVxdPildKikNCi0NCi0vLyBbMTVdIENvbW1lbnQgOjo9ICc8IS0tJyAoKENoYXIgLSAnLScpIHwgKCctJyAoQ2hhciAtICctJykpKSogJy0tPicNCi1Db21tZW50U3RhcnQgPSAoPCFcLVwtKQ0KLUNvbW1lbnRFbmQgICA9IChcLVwtPikNCi1Db21tZW50ID0gKHtDb21tZW50U3RhcnR9Lip7Q29tbWVudEVuZH0pDQotDQotLy8gWzE2XSBQSSA6Oj0gJzw/JyBQSVRhcmdldCAoUyAoQ2hhciogLSAoQ2hhciogJz8+JyBDaGFyKikpKT8gJz8+Jw0KLVBJID0gKDxcP3tQSVRhcmdldH0ge0NoYXJ9KiBcPz4pDQotDQotLy8gWzE3XSBQSVRhcmdldCA6Oj0gTmFtZSAtICgoJ1gnIHwgJ3gnKSAoJ00nIHwgJ20nKSAoJ0wnIHwgJ2wnKSkNCi1QSVRhcmdldCA9ICh7TmFtZX0oKFh8eCkoTXxtKShMfGwpKSkNCi0NCi0vLyBbMThdIENEU2VjdCA6Oj0gQ0RTdGFydCBDRGF0YSBDREVuZA0KLUNEU2VjdCA9ICh7Q0RTdGFydH17Q0RhdGF9e0NERW5kfSkNCi0NCi0vLyBbMTldIENEU3RhcnQgOjo9ICc8IVtDREFUQVsnDQotQ0RTdGFydCA9IDwhXFtDREFUQVxbDQotDQotLy8gWzIwXSBDRGF0YSA6Oj0gKENoYXIqIC0gKENoYXIqICddXT4nIENoYXIqKSkgDQotLy8gaW1wbGVtZW50IGxvb2thaGVhZCBiZWhhdmlvciBkdXJpbmcgYWN0aW9uIGRlZmluaXRpb24NCi1DRGF0YSA9IChbXihcXVxdPildKikNCi0NCi0vLyBbMjFdIENERW5kIDo6PSAnXV0+Jw0KLUNERW5kID0gKFxdXF0+KQ0KLQ0KLS8vIFsyMl0gcHJvbG9nIDo6PSBYTUxEZWNsPyBNaXNjKiAoZG9jdHlwZWRlY2wgTWlzYyopPw0KLXByb2xvZyA9ICh7WE1MRGVjbH0/IHtNaXNjfSogKHtkb2N0eXBlZGVjbH0ge01pc2N9Kik/KQ0KLQ0KLS8vIFsyM10gWE1MRGVjbCA6Oj0gJzw/eG1sJyBWZXJzaW9uSW5mbyBFbmNvZGluZ0RlY2w/IFNERGVjbD8gUz8gJz8+Jw0KLVhNTERlY2wgPSAoPFw/eG1sIHtWZXJzaW9uSW5mb30ge0VuY29kaW5nRGVjbH0/IHtTRERlY2x9PyB7U30/IFw/PikNCi0NCi0vLyBbMjRdIFZlcnNpb25JbmZvIDo6PSBTICd2ZXJzaW9uJyBFcSAoJyBWZXJzaW9uTnVtICcgfCAiIFZlcnNpb25OdW0gIikNCi1WZXJzaW9uSW5mbyA9ICh7U312ZXJzaW9ue0VxfShcJ3tWZXJzaW9uTnVtfVwnIHwgXCJ7VmVyc2lvbk51bX1cIikpDQotDQotLy8gWzI1XSBFcSA6Oj0gUz8gJz0nIFM/DQotRXEgPSAoXD0pDQotDQotLy8gWzI2XSBWZXJzaW9uTnVtIDo6PSAoW2EtekEtWjAtOV8uOl0gfCAnLScpKw0KLVZlcnNpb25OdW0gPSAoKFthLXpBLVowLTlfLjpdfFwtKSspDQotDQotLy8gWzI3XSBNaXNjIDo6PSBDb21tZW50IHwgUEkgfCAgUw0KLU1pc2MgPSAoe0NvbW1lbnR9IHwge1BJfSB8IHtTfSkNCi0NCi0vLyBbMjhdIGRvY3R5cGVkZWNsIDo6PSAnPCFET0NUWVBFJyBTIE5hbWUgKFMgRXh0ZXJuYWxJRCk/ICBTPyAoJ1snIChtYXJrdXBkZWNsIHwgUEVSZWZlcmVuY2UgfCBTKSogJ10nIFM/KT8gJz4nDQotZG9jdHlwZWRlY2wgPSAoPFwhRE9DVFlQRXtTfXtOYW1lfSAoe1N9e0V4dGVybmFsSUR9KT8ge1N9PyAoXFsgKHttYXJrdXBkZWNsfXx7UEVSZWZlcmVuY2V9fHtTfSkqIFxde1N9Pyk/PikNCi0NCi0vLyBbMjldIG1hcmt1cGRlY2wgOjo9IGVsZW1lbnRkZWNsIHwgQXR0bGlzdERlY2wgfCBFbnRpdHlEZWNsIHwgTm90YXRpb25EZWNsIHwgUEkgfCBDb21tZW50DQotbWFya3VwZGVjbCA9ICh7ZWxlbWVudGRlY2x9IHwge0F0dGxpc3REZWNsfSB8IHtFbnRpdHlEZWNsfSB8IHtOb3RhdGlvbkRlY2x9IHwge1BJfSB8IHtDb21tZW50fSkNCi0NCi0vLyBbMzBdIGV4dFN1YnNldCA6Oj0gVGV4dERlY2w/IGV4dFN1YnNldERlY2wNCi1leHRTdWJzZXQgPSAoe1RleHREZWNsfT8ge2V4dFN1YnNldERlY2x9KQ0KLQ0KLS8vIFszMV0gZXh0U3Vic2V0RGVjbCA6Oj0gKCBtYXJrdXBkZWNsIHwgY29uZGl0aW9uYWxTZWN0IHwgUEVSZWZlcmVuY2UgfCBTICkqDQotZXh0U3Vic2V0RGVjbCA9ICgoIHttYXJrdXBkZWNsfSB8IHtjb25kaXRpb25hbFNlY3R9IHwge1BFUmVmZXJlbmNlfSB8IHtTfSApKikNCi0NCi0vLyBbMzJdICBTRERlY2wgIDo6PSBTICdzdGFuZGFsb25lJyBFcSAoKCInIiAoJ3llcycgfCAnbm8nKSAiJyIpIHwgKCciJyAoJ3llcycgfCAnbm8nKSAnIicpKQ0KLVNERGVjbCAgPSAoe1N9c3RhbmRhbG9uZXtFcX17U30qKChcJyh5ZXN8bm8pXCcpfChcIih5ZXN8bm8pXCIpKSkNCi0NCi0vLyBbMzNdICBMYW5ndWFnZUlEICA6Oj0gTGFuZ2NvZGUgKCctJyBTdWJjb2RlKSoNCi1MYW5ndWFnZUlEICA9ICh7TGFuZ2NvZGV9KFwte1N1YmNvZGV9KSopDQotDQotLy8gWzM0XSAgTGFuZ2NvZGUgOjo9IElTTzYzOUNvZGUgfCAgSWFuYUNvZGUgfCAgVXNlckNvZGUNCi1MYW5nY29kZSA9ICh7SVNPNjM5Q29kZX0gfCAge0lhbmFDb2RlfSB8ICB7VXNlckNvZGV9KQ0KLQ0KLS8vIFszNV0gIElTTzYzOUNvZGUgOjo9IChbYS16XSB8IFtBLVpdKSAoW2Etel0gfCBbQS1aXSkNCi1JU082MzlDb2RlID0gKChbYS16XXxbQS1aXSkoW2Etel18W0EtWl0pKQ0KLQ0KLS8vIFszNl0gIElhbmFDb2RlIDo6PSAoJ2knIHwgJ0knKSAnLScgKFthLXpdIHwgW0EtWl0pKw0KLUlhbmFDb2RlID0gKChpfEkpXC0oW2Etel18W0EtWl0pKykNCi0NCi0vLyBbMzddICBVc2VyQ29kZSA6Oj0gKCd4JyB8ICdYJykgJy0nIChbYS16XSB8IFtBLVpdKSsNCi1Vc2VyQ29kZSA9ICgoeHxYKVwtKFthLXpdfFtBLVpdKSspDQotDQotLy8gWzM4XSAgU3ViY29kZSA6Oj0gKFthLXpdIHwgW0EtWl0pKw0KLVN1YmNvZGUgPSAoKFthLXpdfFtBLVpdKSspDQotDQotLy8gWzM5XSAgZWxlbWVudCAgOjo9IEVtcHR5RWxlbVRhZyB8IFNUYWcgY29udGVudCBFVGFnDQotZWxlbWVudCAgPSAoe0VtcHR5RWxlbVRhZ30gfCB7U1RhZ30ge2NvbnRlbnR9IHtFVGFnfSkNCi0NCi0vLyBbNDBdICBTVGFnICA6Oj0gJzwnIE5hbWUgKFMgQXR0cmlidXRlKSogUz8gJz4nDQotU1RhZyA9ICg8e05hbWV9KHtTfXtBdHRyaWJ1dGV9KSp7U30/PikNCi0NCi0vLyBbNDFdICBBdHRyaWJ1dGUgOjo9IE5hbWUgRXEgQXR0VmFsdWUNCi1BdHRyaWJ1dGUgPSAoe05hbWV9e1N9KntFcX17U30qe0F0dFZhbHVlfSkNCi0NCi0vLyBbNDJdICBFVGFnICA6Oj0gJ05hbWUgUz8gJz4nDQotRVRhZyA9ICg8XC97TmFtZX17U30/PikNCi0NCi0vLyBbNDNdICBjb250ZW50ICA6Oj0gKGVsZW1lbnQgfCBDaGFyRGF0YSB8IFJlZmVyZW5jZSB8IENEU2VjdCB8IFBJIHwgQ29tbWVudCkqDQotY29udGVudCA9ICgoe2VsZW1lbnR9IHwge0NoYXJEYXRhfSB8IHtSZWZlcmVuY2V9IHwge0NEU2VjdH0gfCB7UEl9IHwge0NvbW1lbnR9KSopDQotDQotLy8gWzQ0XSAgRW1wdHlFbGVtVGFnICA6Oj0gJzwnIE5hbWUgKFMgQXR0cmlidXRlKSogUz8gJy8+Jw0KLUVtcHR5RWxlbVRhZyA9ICg8e05hbWV9KHtTfXtBdHRyaWJ1dGV9KSp7U30/XC8+KQ0KLQ0KLS8vIFs0NV0gZWxlbWVudGRlY2wgOjo9ICc8IUVMRU1FTlQnIFMgTmFtZSBTIGNvbnRlbnRzcGVjIFM/ICc+Jw0KLWVsZW1lbnRkZWNsID0gKDxcIUVMRU1FTlR7U317TmFtZX17U317Y29udGVudHNwZWN9e1N9Pz4pDQotDQotLy8gWzQ2XSBjb250ZW50c3BlYyA6Oj0gJ0VNUFRZJyB8ICdBTlknIHwgTWl4ZWQgfCBjaGlsZHJlbg0KLWNvbnRlbnRzcGVjID0gKEVNUFRZfEFOWXx7TWl4ZWR9fHtjaGlsZHJlbn0pDQotDQotLy8gWzQ3XSBjaGlsZHJlbiA6Oj0gKGNob2ljZSB8IHNlcSkgKCc/JyB8ICcqJyB8ICcrJyk/DQotY2hpbGRyZW4gPSAoKHtjaG9pY2V9fHtzZXF9KShcP3xcKnxcKyk/KQ0KLQ0KLS8vIENBVVNFUyBMT09QIFRIUk9VR0ggREVGUyBPRiBDSE9JQ0UgQU5EIFNFUQ0KLS8vIFs0OF0gY3AgOjo9IChOYW1lIHwgY2hvaWNlIHwgc2VxKSAoJz8nIHwgJyonIHwgJysnKT8NCi1jcCA9ICgoe05hbWV9IHwge2Nob2ljZX0gfCB7c2VxfSkgKFw/fFwqfFwrKT8pDQotDQotLy8gWzQ5XSBjaG9pY2UgOjo9ICcoJyBTPyBjcCAoIFM/ICd8JyBTPyBjcCApKiBTPyAnKScNCi0vLyBjaG9pY2UgPSBcKHtTfT97Y3B9KHtTfT9cfHtTfT97Y3B9KSp7U30/XCkNCi1jaG9pY2UgPSBcKHtTfT97TmFtZX0oe1N9P1x8e1N9P3tOYW1lfSkqe1N9P1wpDQotDQotLy8gWzUwXSBzZXEgOjo9ICcoJyBTPyBjcCAoIFM/ICcsJyBTPyBjcCApKiBTPyAnKScNCi0vLyBzZXEgPSAoXCh7U30/e2NwfSh7U30/XCx7U30/e2NwfSkqe1N9P1wpKQ0KLXNlcSA9IChcKHtTfT97TmFtZX0oe1N9P1wse1N9P3tOYW1lfSkqe1N9P1wpKQ0KLQ0KLS8vIFs1MV0gTWl4ZWQgOjo9ICcoJyBTPyAnI1BDREFUQScgKFM/ICd8JyBTPyBOYW1lKSogUz8gICcpKicgfCAnKCcgUz8gJyNQQ0RBVEEnIFM/ICcpJw0KLU1peGVkID0gKHtTfT9cI1BDREFUQSh7U30/XHx7U30/e05hbWV9KSp7U30/KSpcfCh7U30/XCNQQ0RBVEF7U30/KQ0KLQ0KLS8vIFs1Ml0gQXR0bGlzdERlY2wgOjo9ICc8IUFUVExJU1QnIFMgTmFtZSBBdHREZWYqIFM/ICc+Jw0KLUF0dGxpc3REZWNsID0gKDxcIUFUVExJU1R7U317TmFtZX17QXR0RGVmfSp7U30/PikNCi0NCi0vLyBbNTNdIEF0dERlZiA6Oj0gUyBOYW1lIFMgQXR0VHlwZSBTIERlZmF1bHREZWNsDQotQXR0RGVmID0gKHtTfXtOYW1lfXtTfXtBdHRUeXBlfXtTfXtEZWZhdWx0RGVjbH0pDQotDQotLy8gWzU0XSBBdHRUeXBlIDo6PSBTdHJpbmdUeXBlIHwgVG9rZW5pemVkVHlwZSB8IEVudW1lcmF0ZWRUeXBlIA0KLUF0dFR5cGUgPSAoe1N0cmluZ1R5cGV9IHwge1Rva2VuaXplZFR5cGV9IHwge0VudW1lcmF0ZWRUeXBlfSkNCi0NCi0vLyBbNTVdIFN0cmluZ1R5cGUgOjo9ICdDREFUQScNCi1TdHJpbmdUeXBlID0gKENEQVRBKQ0KLQ0KLS8vIFs1Nl0gVG9rZW5pemVkVHlwZSA6Oj0gJ0lEJyB8ICdJRFJFRicgfCAnSURSRUZTJyB8ICdFTlRJVFknIHwgJ0VOVElUSUVTJyB8ICdOTVRPS0VOJyB8ICdOTVRPS0VOUycNCi1Ub2tlbml6ZWRUeXBlID0gKElEfElEUkVGfElEUkVGU3xFTlRJVFl8RU5USVRJRVN8Tk1UT0tFTnxOTVRPS0VOUykNCi0NCi0vLyBbNTddIEVudW1lcmF0ZWRUeXBlIDo6PSBOb3RhdGlvblR5cGUgfCBFbnVtZXJhdGlvbiANCi1FbnVtZXJhdGVkVHlwZSA9ICh7Tm90YXRpb25UeXBlfSB8IHtFbnVtZXJhdGlvbn0pDQotDQotLy8gWzU4XSBOb3RhdGlvblR5cGUgOjo9ICdOT1RBVElPTicgUyAnKCcgUz8gTmFtZSAoUz8gJ3wnIFM/IE5hbWUpKiBTPyAnKScgDQotTm90YXRpb25UeXBlID0gKE5PVEFUSU9Oe1N9XCh7U30/e05hbWV9KHtTfT9cfHtTfT97TmFtZX0pKntTfT9cKSkNCi0NCi0vLyBbNTldIEVudW1lcmF0aW9uIDo6PSAnKCcgUz8gTm10b2tlbiAoUz8gJ3wnIFM/ICBObXRva2VuKSogUz8gJyknDQotRW51bWVyYXRpb24gPSAoXCh7U30/e05tdG9rZW59KHtTfT9cfHtTfT97Tm10b2tlbn0pKntTfT9cKSkNCi0NCi0vLyBbNjBdIERlZmF1bHREZWNsIDo6PSAnI1JFUVVJUkVEJyB8ICcjSU1QTElFRCcgfCAoKCcjRklYRUQnIFMpPyBBdHRWYWx1ZSkNCi1EZWZhdWx0RGVjbCA9IChcI1JFUVVJUkVEfFwjSU1QTElFRHwoKFwjRklYRUR7U30pP3tBdHRWYWx1ZX0pKQ0KLQ0KLS8vIFs2MV0gY29uZGl0aW9uYWxTZWN0IDo6PSBpbmNsdWRlU2VjdCB8IGlnbm9yZVNlY3QgDQotY29uZGl0aW9uYWxTZWN0ID0gKHtpbmNsdWRlU2VjdH0gfCB7aWdub3JlU2VjdH0pDQotDQotLy8gWzYyXSBpbmNsdWRlU2VjdCA6Oj0gJzwhWycgUz8gJ0lOQ0xVREUnIFM/ICdbJyBleHRTdWJzZXREZWNsICddXT4nIA0KLWluY2x1ZGVTZWN0ID0gKDxcIVxbe1N9P0lOQ0xVREV7U30/XFt7ZXh0U3Vic2V0RGVjbH1cXVxdPikNCi0NCi0vLyBbNjNdIGlnbm9yZVNlY3QgOjo9ICc8IVsnIFM/ICdJR05PUkUnIFM/ICdbJyBpZ25vcmVTZWN0Q29udGVudHMqICddXT4nDQotaWdub3JlU2VjdCA9ICg8XCFcW3tTfT9JR05PUkV7U30/XFt7aWdub3JlU2VjdENvbnRlbnRzfSpcXVxdPikNCi0NCi0vLyBbNjRdIGlnbm9yZVNlY3RDb250ZW50cyA6Oj0gSWdub3JlICgnPCFbJyBpZ25vcmVTZWN0Q29udGVudHMgJ11dPicgSWdub3JlKSoNCi1pZ25vcmVTZWN0Q29udGVudHMgPSAoe0lnbm9yZX0oPFwhXFt7aWdub3JlU2VjdENvbnRlbnRzfVxdXF0+e0lnbm9yZX0pKikNCi0NCi0vLyBbNjVdIElnbm9yZSA6Oj0gQ2hhciogLSAoQ2hhciogKCc8IVsnIHwgJ11dPicpIENoYXIqKQ0KLUlnbm9yZSA9ICAoW14oXDxcIVxbfFxdXF1cPildKikNCi0NCi0vLyBbNjZdIENoYXJSZWYgOjo9ICcmIycgWzAtOV0rICc7JyB8ICcmI3gnIFswLTlhLWZBLUZdKyAnOycNCi1DaGFyUmVmID0gKCYjWzAtOV0rO3wmI3hbMC05YS1mQS1GXSs7KQ0KLQ0KLS8vIFs2N10gUmVmZXJlbmNlIDo6PSBFbnRpdHlSZWYgfCBDaGFyUmVmDQotUmVmZXJlbmNlID0gKHtFbnRpdHlSZWZ9IHwge0NoYXJSZWZ9KQ0KLQ0KLS8vIFs2OF0gRW50aXR5UmVmID0gJyYnIE5hbWUgJzsnDQotRW50aXR5UmVmID0gKCZ7TmFtZX07KQ0KLQ0KLS8vIFs2OV0gUEVSZWZlcmVuY2UgOjo9ICclJyBOYW1lICc7Jw0KLVBFUmVmZXJlbmNlID0gKCV7TmFtZX07KQ0KLQ0KLS8vIFs3MF0gRW50aXR5RGVjbCA6Oj0gR0VEZWNsIHwgUEVEZWNsDQotRW50aXR5RGVjbCA9ICh7R0VEZWNsfSB8IHtQRURlY2x9KQ0KLQ0KLS8vIFs3MV0gR0VEZWNsIDo6PSAnPCFFTlRJVFknIFMgTmFtZSBTIEVudGl0eURlZiBTPyAnPicNCi1HRURlY2wgPSAoPFwhRU5USVRZe1N9e05hbWV9e1N9e0VudGl0eURlZn17U30/PikNCi0NCi0vLyBbNzJdIFBFRGVjbCA6Oj0gJzwhRU5USVRZJyBTICclJyBTIE5hbWUgUyBQRURlZiBTPyAnPicNCi1QRURlY2wgPSAoPFwhRU5USVRZe1N9XCV7U317TmFtZX17U317UEVEZWZ9e1N9Pz4pDQotDQotLy8gWzczXSBFbnRpdHlEZWYgOjo9IEVudGl0eVZhbHVlIHwgKEV4dGVybmFsSUQgTkRhdGFEZWNsPykNCi1FbnRpdHlEZWYgPSAoe0VudGl0eVZhbHVlfSB8ICh7RXh0ZXJuYWxJRH17TkRhdGFEZWNsfT8pKQ0KLQ0KLS8vIFs3NF0gUEVEZWYgOjo9IEVudGl0eVZhbHVlIHwgRXh0ZXJuYWxJRA0KLVBFRGVmID0gKHtFbnRpdHlWYWx1ZX0gfCB7RXh0ZXJuYWxJRH0pDQotDQotLy8gWzc1XSBFeHRlcm5hbElEIDo6PSAnU1lTVEVNJyBTIFN5c3RlbUxpdGVyYWwgfCAnUFVCTElDJyBTIFB1YmlkTGl0ZXJhbCBTIFN5c3RlbUxpdGVyYWwgDQotRXh0ZXJuYWxJRCA9IChTWVNURU17U317U3lzdGVtTGl0ZXJhbH18UFVCTElDe1N9e1B1YmlkTGl0ZXJhbH17U317U3lzdGVtTGl0ZXJhbH0gKQ0KLQ0KLS8vIFs3Nl0gTkRhdGFEZWNsIDo6PSBTICdOREFUQScgUyBOYW1lDQotTkRhdGFEZWNsID0gKHtTfU5EQVRBe1N9e05hbWV9KQ0KLQ0KLS8vIFs3N10gVGV4dERlY2wgOjo9ICc8P3htbCcgVmVyc2lvbkluZm8/IEVuY29kaW5nRGVjbCBTPyAnPz4nDQotVGV4dERlY2wgPSAoPFw/eG1se1ZlcnNpb25JbmZvfT97RW5jb2RpbmdEZWNsfXtTfT9cPz4pDQotDQotLy8gWzc4XSBleHRQYXJzZWRFbnQgOjo9IFRleHREZWNsPyBjb250ZW50DQotZXh0UGFyc2VkRW50ID0gKHtUZXh0RGVjbH0/e2NvbnRlbnR9KQ0KLQ0KLS8vIFs3OV0gZXh0UEUgOjo9IFRleHREZWNsPyBleHRTdWJzZXREZWNsDQotZXh0UEUgPSAoe1RleHREZWNsfT97ZXh0U3Vic2V0RGVjbH0pDQotDQotLy8gWzgwXSBFbmNvZGluZ0RlY2wgOjo9IFMgJ2VuY29kaW5nJyBFcSAoJyInIEVuY05hbWUgJyInIHwgICInIiBFbmNOYW1lICInIiApIA0KLUVuY29kaW5nRGVjbCA9ICh7U31lbmNvZGluZ3tTfSp7RXF9e1N9KihcIntFbmNOYW1lfVwifFwne0VuY05hbWV9XCcpKQ0KLQ0KLS8vIFs4MV0gRW5jTmFtZSA6Oj0gW0EtWmEtel0gKFtBLVphLXowLTkuX10gfCAnLScpKg0KLUVuY05hbWUgPSAoW0EtWmEtel0oW0EtWmEtejAtOS5fXXxcLSkqKQ0KLQ0KLS8vIFs4Ml0gTm90YXRpb25EZWNsIDo6PSAnPCFOT1RBVElPTicgUyBOYW1lIFMgKEV4dGVybmFsSUQgfCAgUHVibGljSUQpIFM/ICc+Jw0KLU5vdGF0aW9uRGVjbCA9ICg8XCFOT1RBVElPTntTfXtOYW1lfXtTfSh7RXh0ZXJuYWxJRH18e1B1YmxpY0lEfSl7U30/PikNCi0NCi0vLyBbODNdIFB1YmxpY0lEIDo6PSAnUFVCTElDJyBTIFB1YmlkTGl0ZXJhbA0KLVB1YmxpY0lEID0gKFBVQkxJQ3tTfXtQdWJpZExpdGVyYWx9KQ0KLQ0KLS8vIFs4NF0gIExldHRlciA6Oj0gQmFzZUNoYXIgfCBJZGVvZ3JhcGhpYw0KLUxldHRlciA9ICh7QmFzZUNoYXJ9IHwge0lkZW9ncmFwaGljfSkNCi0NCi0vLyBbODVdICBCYXNlQ2hhciA6Oj0gWyN4MDA0MS0jeDAwNUFdIHwgWyN4MDA2MS0jeDAwN0FdIHwgWyN4MDBDMC0jeDAwRDZdDQotLy8gfCBbI3gwMEQ4LSN4MDBGNl0gfCBbI3gwMEY4LSN4MDBGRl0gfCBbI3gwMTAwLSN4MDEzMV0NCi0vLyB8IFsjeDAxMzQtI3gwMTNFXSB8IFsjeDAxNDEtI3gwMTQ4XSB8IFsjeDAxNEEtI3gwMTdFXQ0KLS8vIHwgWyN4MDE4MC0jeDAxQzNdIHwgWyN4MDFDRC0jeDAxRjBdIHwgWyN4MDFGNC0jeDAxRjVdDQotLy8gfCBbI3gwMUZBLSN4MDIxN10gfCBbI3gwMjUwLSN4MDJBOF0gfCBbI3gwMkJCLSN4MDJDMV0gfCAjeDAzODYNCi0vLyB8IFsjeDAzODgtI3gwMzhBXSB8ICN4MDM4QyB8IFsjeDAzOEUtI3gwM0ExXSB8IFsjeDAzQTMtI3gwM0NFXQ0KLS8vIHwgWyN4MDNEMC0jeDAzRDZdIHwgI3gwM0RBIHwgI3gwM0RDIHwgI3gwM0RFIHwgI3gwM0UwDQotLy8gfCBbI3gwM0UyLSN4MDNGM10gfCBbI3gwNDAxLSN4MDQwQ10gfCBbI3gwNDBFLSN4MDQ0Rl0NCi0vLyB8IFsjeDA0NTEtI3gwNDVDXSB8IFsjeDA0NUUtI3gwNDgxXSB8IFsjeDA0OTAtI3gwNEM0XQ0KLS8vIHwgWyN4MDRDNy0jeDA0QzhdIHwgWyN4MDRDQi0jeDA0Q0NdIHwgWyN4MDREMC0jeDA0RUJdDQotLy8gfCBbI3gwNEVFLSN4MDRGNV0gfCBbI3gwNEY4LSN4MDRGOV0gfCBbI3gwNTMxLSN4MDU1Nl0gfCAjeDA1NTkNCi0vLyB8IFsjeDA1NjEtI3gwNTg2XSB8IFsjeDA1RDAtI3gwNUVBXSB8IFsjeDA1RjAtI3gwNUYyXQ0KLS8vIHwgWyN4MDYyMS0jeDA2M0FdIHwgWyN4MDY0MS0jeDA2NEFdIHwgWyN4MDY3MS0jeDA2QjddDQotLy8gfCBbI3gwNkJBLSN4MDZCRV0gfCBbI3gwNkMwLSN4MDZDRV0gfCBbI3gwNkQwLSN4MDZEM10gfCAjeDA2RDUNCi0vLyB8IFsjeDA2RTUtI3gwNkU2XSB8IFsjeDA5MDUtI3gwOTM5XSB8ICN4MDkzRCB8IFsjeDA5NTgtI3gwOTYxXQ0KLS8vIHwgWyN4MDk4NS0jeDA5OENdIHwgWyN4MDk4Ri0jeDA5OTBdIHwgWyN4MDk5My0jeDA5QThdDQotLy8gfCBbI3gwOUFBLSN4MDlCMF0gfCAjeDA5QjIgfCBbI3gwOUI2LSN4MDlCOV0gfCBbI3gwOURDLSN4MDlERF0NCi0vLyB8IFsjeDA5REYtI3gwOUUxXSB8IFsjeDA5RjAtI3gwOUYxXSB8IFsjeDBBMDUtI3gwQTBBXQ0KLS8vIHwgWyN4MEEwRi0jeDBBMTBdIHwgWyN4MEExMy0jeDBBMjhdIHwgWyN4MEEyQS0jeDBBMzBdDQotLy8gfCBbI3gwQTMyLSN4MEEzM10gfCBbI3gwQTM1LSN4MEEzNl0gfCBbI3gwQTM4LSN4MEEzOV0NCi0vLyB8IFsjeDBBNTktI3gwQTVDXSB8ICN4MEE1RSB8IFsjeDBBNzItI3gwQTc0XSB8IFsjeDBBODUtI3gwQThCXQ0KLS8vIHwgI3gwQThEIHwgWyN4MEE4Ri0jeDBBOTFdIHwgWyN4MEE5My0jeDBBQThdIHwgWyN4MEFBQS0jeDBBQjBdDQotLy8gfCBbI3gwQUIyLSN4MEFCM10gfCBbI3gwQUI1LSN4MEFCOV0gfCAjeDBBQkQgfCAjeDBBRTANCi0vLyB8IFsjeDBCMDUtI3gwQjBDXSB8IFsjeDBCMEYtI3gwQjEwXSB8IFsjeDBCMTMtI3gwQjI4XQ0KLS8vIHwgWyN4MEIyQS0jeDBCMzBdIHwgWyN4MEIzMi0jeDBCMzNdIHwgWyN4MEIzNi0jeDBCMzldIHwgI3gwQjNEDQotLy8gfCBbI3gwQjVDLSN4MEI1RF0gfCBbI3gwQjVGLSN4MEI2MV0gfCBbI3gwQjg1LSN4MEI4QV0NCi0vLyB8IFsjeDBCOEUtI3gwQjkwXSB8IFsjeDBCOTItI3gwQjk1XSB8IFsjeDBCOTktI3gwQjlBXSB8ICN4MEI5Qw0KLS8vIHwgWyN4MEI5RS0jeDBCOUZdIHwgWyN4MEJBMy0jeDBCQTRdIHwgWyN4MEJBOC0jeDBCQUFdDQotLy8gfCBbI3gwQkFFLSN4MEJCNV0gfCBbI3gwQkI3LSN4MEJCOV0gfCBbI3gwQzA1LSN4MEMwQ10NCi0vLyB8IFsjeDBDMEUtI3gwQzEwXSB8IFsjeDBDMTItI3gwQzI4XSB8IFsjeDBDMkEtI3gwQzMzXQ0KLS8vIHwgWyN4MEMzNS0jeDBDMzldIHwgWyN4MEM2MC0jeDBDNjFdIHwgWyN4MEM4NS0jeDBDOENdDQotLy8gfCBbI3gwQzhFLSN4MEM5MF0gfCBbI3gwQzkyLSN4MENBOF0gfCBbI3gwQ0FBLSN4MENCM10NCi0vLyB8IFsjeDBDQjUtI3gwQ0I5XSB8ICN4MENERSB8IFsjeDBDRTAtI3gwQ0UxXSB8IFsjeDBEMDUtI3gwRDBDXQ0KLS8vIHwgWyN4MEQwRS0jeDBEMTBdIHwgWyN4MEQxMi0jeDBEMjhdIHwgWyN4MEQyQS0jeDBEMzldDQotLy8gfCBbI3gwRDYwLSN4MEQ2MV0gfCBbI3gwRTAxLSN4MEUyRV0gfCAjeDBFMzAgfCBbI3gwRTMyLSN4MEUzM10NCi0vLyB8IFsjeDBFNDAtI3gwRTQ1XSB8IFsjeDBFODEtI3gwRTgyXSB8ICN4MEU4NCB8IFsjeDBFODctI3gwRTg4XQ0KLS8vIHwgI3gwRThBIHwgI3gwRThEIHwgWyN4MEU5NC0jeDBFOTddIHwgWyN4MEU5OS0jeDBFOUZdDQotLy8gfCBbI3gwRUExLSN4MEVBM10gfCAjeDBFQTUgfCAjeDBFQTcgfCBbI3gwRUFBLSN4MEVBQl0NCi0vLyB8IFsjeDBFQUQtI3gwRUFFXSB8ICN4MEVCMCB8IFsjeDBFQjItI3gwRUIzXSB8ICN4MEVCRA0KLS8vIHwgWyN4MEVDMC0jeDBFQzRdIHwgWyN4MEY0MC0jeDBGNDddIHwgWyN4MEY0OS0jeDBGNjldDQotLy8gfCBbI3gxMEEwLSN4MTBDNV0gfCBbI3gxMEQwLSN4MTBGNl0gfCAjeDExMDAgfCBbI3gxMTAyLSN4MTEwM10NCi0vLyB8IFsjeDExMDUtI3gxMTA3XSB8ICN4MTEwOSB8IFsjeDExMEItI3gxMTBDXSB8IFsjeDExMEUtI3gxMTEyXQ0KLS8vIHwgI3gxMTNDIHwgI3gxMTNFIHwgI3gxMTQwIHwgI3gxMTRDIHwgI3gxMTRFIHwgI3gxMTUwDQotLy8gfCBbI3gxMTU0LSN4MTE1NV0gfCAjeDExNTkgfCBbI3gxMTVGLSN4MTE2MV0gfCAjeDExNjMgfCAjeDExNjUNCi0vLyB8ICN4MTE2NyB8ICN4MTE2OSB8IFsjeDExNkQtI3gxMTZFXSB8IFsjeDExNzItI3gxMTczXSB8ICN4MTE3NQ0KLS8vIHwgI3gxMTlFIHwgI3gxMUE4IHwgI3gxMUFCIHwgWyN4MTFBRS0jeDExQUZdIHwgWyN4MTFCNy0jeDExQjhdDQotLy8gfCAjeDExQkEgfCBbI3gxMUJDLSN4MTFDMl0gfCAjeDExRUIgfCAjeDExRjAgfCAjeDExRjkNCi0vLyB8IFsjeDFFMDAtI3gxRTlCXSB8IFsjeDFFQTAtI3gxRUY5XSB8IFsjeDFGMDAtI3gxRjE1XQ0KLS8vIHwgWyN4MUYxOC0jeDFGMURdIHwgWyN4MUYyMC0jeDFGNDVdIHwgWyN4MUY0OC0jeDFGNERdDQotLy8gfCBbI3gxRjUwLSN4MUY1N10gfCAjeDFGNTkgfCAjeDFGNUIgfCAjeDFGNUQgfCBbI3gxRjVGLSN4MUY3RF0NCi0vLyB8IFsjeDFGODAtI3gxRkI0XSB8IFsjeDFGQjYtI3gxRkJDXSB8ICN4MUZCRSB8IFsjeDFGQzItI3gxRkM0XQ0KLS8vIHwgWyN4MUZDNi0jeDFGQ0NdIHwgWyN4MUZEMC0jeDFGRDNdIHwgWyN4MUZENi0jeDFGREJdDQotLy8gfCBbI3gxRkUwLSN4MUZFQ10gfCBbI3gxRkYyLSN4MUZGNF0gfCBbI3gxRkY2LSN4MUZGQ10gfCAjeDIxMjYNCi0vLyB8IFsjeDIxMkEtI3gyMTJCXSB8ICN4MjEyRSB8IFsjeDIxODAtI3gyMTgyXSB8IFsjeDMwNDEtI3gzMDk0XQ0KLS8vIHwgWyN4MzBBMS0jeDMwRkFdIHwgWyN4MzEwNS0jeDMxMkNdIHwgWyN4QUMwMC0jeEQ3QTNdDQotQmFzZUNoYXIgPSBbXHUwMDQxLVx1MDA1QVx1MDA2MS1cdTAwN0FcdTAwQzAtXHUwMEQ2XHUwMEQ4LVx1MDBGNlx1MDBGOC1cdTAwRkZcdTAxMDAtXHUwMTMxXHUwMTM0LVx1MDEzRVx1MDE0MS1cdTAxNDhcdTAxNEEtXHUwMTdFXHUwMTgwLVx1MDFDM1x1MDFDRC1cdTAxRjBcdTAxRjQtXHUwMUY1XHUwMUZBLVx1MDIxN1x1MDI1MC1cdTAyQThcdTAyQkItXHUwMkMxXHUwMzg2XHUwMzg4LVx1MDM4QVx1MDM4Q1x1MDM4RS1cdTAzQTFcdTAzQTMtXHUwM0NFXHUwM0QwLVx1MDNENlx1MDNEQVx1MDNEQ1x1MDNERVx1MDNFMFx1MDNFMi1cdTAzRjNcdTA0MDEtXHUwNDBDXHUwNDBFLVx1MDQ0Rlx1MDQ1MS1cdTA0NUNcdTA0NUUtXHUwNDgxXHUwNDkwLVx1MDRDNFx1MDRDNy1cdTA0QzhcdTA0Q0ItXHUwNENDXHUwNEQwLVx1MDRFQlx1MDRFRS1cdTA0RjVcdTA0RjgtXHUwNEY5XHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MS1cdTA1ODZcdTA1RDAtXHUwNUVBXHUwNUYwLVx1MDVGMlx1MDYyMS1cdTA2M0FcdTA2NDEtXHUwNjRBXHUwNjcxLVx1MDZCN1x1MDZCQS1cdTA2QkVcdTA2QzAtXHUwNkNFXHUwNkQwLVx1MDZEM1x1MDZENVx1MDZFNS1cdTA2RTZcdTA5MDUtXHUwOTM5XHUwOTNEXHUwOTU4LVx1MDk2MVx1MDk4NS1cdTA5OENcdTA5OEYtXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOURDLVx1MDlERFx1MDlERi1cdTA5RTFcdTA5RjAtXHUwOUYxXHUwQTA1LVx1MEEwQVx1MEEwRi1cdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMi1cdTBBMzNcdTBBMzUtXHUwQTM2XHUwQTM4LVx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4Qlx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMi1cdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUUwXHUwQjA1LVx1MEIwQ1x1MEIwRi1cdTBCMTBcdTBCMTMtXHUwQjI4XHUwQjJBLVx1MEIzMFx1MEIzMi1cdTBCMzNcdTBCMzYtXHUwQjM5XHUwQjNEXHUwQjVDLVx1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTktXHUwQjlBXHUwQjlDXHUwQjlFLVx1MEI5Rlx1MEJBMy1cdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCNVx1MEJCNy1cdTBCQjlcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzMzXHUwQzM1LVx1MEMzOVx1MEM2MC1cdTBDNjFcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENERVx1MENFMC1cdTBDRTFcdTBEMDUtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEMjhcdTBEMkEtXHUwRDM5XHUwRDYwLVx1MEQ2MVx1MEUwMS1cdTBFMkVcdTBFMzBcdTBFMzItXHUwRTMzXHUwRTQwLVx1MEU0NVx1MEU4MS1cdTBFODJcdTBFODRcdTBFODctXHUwRTg4XHUwRThBXHUwRThEXHUwRTk0LVx1MEU5N1x1MEU5OS1cdTBFOUZcdTBFQTEtXHUwRUEzXHUwRUE1XHUwRUE3XHUwRUFBLVx1MEVBQlx1MEVBRC1cdTBFQUVcdTBFQjBcdTBFQjItXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEY0MC1cdTBGNDdcdTBGNDktXHUwRjY5XHUxMEEwLVx1MTBDNVx1MTBEMC1cdTEwRjZcdTExMDBcdTExMDItXHUxMTAzXHUxMTA1LVx1MTEwN1x1MTEwOVx1MTEwQi1cdTExMENcdTExMEUtXHUxMTEyXHUxMTNDXHUxMTNFXHUxMTQwXHUxMTRDXHUxMTRFXHUxMTUwXHUxMTU0LVx1MTE1NVx1MTE1OVx1MTE1Ri1cdTExNjFcdTExNjNcdTExNjVcdTExNjdcdTExNjlcdTExNkQtXHUxMTZFXHUxMTcyLVx1MTE3M1x1MTE3NVx1MTE5RVx1MTFBOFx1MTFBQlx1MTFBRS1cdTExQUZcdTExQjctXHUxMUI4XHUxMUJBXHUxMUJDLVx1MTFDMlx1MTFFQlx1MTFGMFx1MTFGOVx1MUUwMC1cdTFFOUJcdTFFQTAtXHUxRUY5XHUxRjAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMTI2XHUyMTJBLVx1MjEyQlx1MjEyRVx1MjE4MC1cdTIxODJcdTMwNDEtXHUzMDk0XHUzMEExLVx1MzBGQVx1MzEwNS1cdTMxMkNcdUFDMDAtXHVEN0EzXQ0KLQ0KLS8vIFs4Nl0gIElkZW9ncmFwaGljIDo6PSBbI3g0RTAwLSN4OUZBNV0gfCAjeDMwMDcgfCBbI3gzMDIxLSN4MzAyOV0NCi1JZGVvZ3JhcGhpYyA9IFtcdTRFMDAtXHU5RkE1XHUzMDA3XHUzMDIxLVx1MzAyOV0NCi0NCi0vLyBbODddICAgICAgQ29tYmluaW5nQ2hhciAgICA6Oj0gICAgWyN4MDMwMC0jeDAzNDVdICAgIHwgWyN4MDM2MC0jeDAzNjFdDQotLy8gfCBbI3gwNDgzLSN4MDQ4Nl0gICAgICAgICAgfCBbI3gwNTkxLSN4MDVBMV0gICAgICAgICB8IFsjeDA1QTMtI3gwNUI5XQ0KLS8vIHwgWyN4MDVCQi0jeDA1QkRdICAgICAgIHwgI3gwNUJGICAgICAgIHwgWyN4MDVDMS0jeDA1QzJdCSB8ICN4MDVDNA0KLS8vIHwgWyN4MDY0Qi0jeDA2NTJdICAgIHwgI3gwNjcwICAgIHwgWyN4MDZENi0jeDA2RENdICAgfCBbI3gwNkRELSN4MDZERl0NCi0vLyB8IFsjeDA2RTAtI3gwNkU0XSAgICAgICAgICB8IFsjeDA2RTctI3gwNkU4XSAgICAgICAgIHwgWyN4MDZFQS0jeDA2RURdDQotLy8gfCBbI3gwOTAxLSN4MDkwM10gICAgICAgfCAjeDA5M0MgICAgICAgfCBbI3gwOTNFLSN4MDk0Q10gICAgICB8ICN4MDk0RA0KLS8vIHwgWyN4MDk1MS0jeDA5NTRdICAgIHwgWyN4MDk2Mi0jeDA5NjNdICAgIHwgWyN4MDk4MS0jeDA5ODNdICAgfCAjeDA5QkMNCi0vLyB8ICN4MDlCRSAgICAgICB8ICN4MDlCRiAgICAgICB8IFsjeDA5QzAtI3gwOUM0XSAgICAgIHwgWyN4MDlDNy0jeDA5QzhdDQotLy8gfCBbI3gwOUNCLSN4MDlDRF0gICB8ICN4MDlENyAgIHwgWyN4MDlFMi0jeDA5RTNdICAgfCAjeDBBMDIgICB8ICN4MEEzQw0KLS8vIHwgI3gwQTNFICAgICAgIHwgI3gwQTNGICAgICAgIHwgWyN4MEE0MC0jeDBBNDJdICAgICAgfCBbI3gwQTQ3LSN4MEE0OF0NCi0vLyB8IFsjeDBBNEItI3gwQTREXSAgICB8IFsjeDBBNzAtI3gwQTcxXSAgICB8IFsjeDBBODEtI3gwQTgzXSAgIHwgI3gwQUJDDQotLy8gfCBbI3gwQUJFLSN4MEFDNV0gICAgICAgICAgfCBbI3gwQUM3LSN4MEFDOV0gICAgICAgICB8IFsjeDBBQ0ItI3gwQUNEXQ0KLS8vIHwgWyN4MEIwMS0jeDBCMDNdICAgIHwgI3gwQjNDICAgIHwgWyN4MEIzRS0jeDBCNDNdICAgfCBbI3gwQjQ3LSN4MEI0OF0NCi0vLyB8IFsjeDBCNEItI3gwQjREXSAgICAgICAgICB8IFsjeDBCNTYtI3gwQjU3XSAgICAgICAgIHwgWyN4MEI4Mi0jeDBCODNdDQotLy8gfCBbI3gwQkJFLSN4MEJDMl0gICAgfCBbI3gwQkM2LSN4MEJDOF0gICAgfCBbI3gwQkNBLSN4MEJDRF0gICB8ICN4MEJENw0KLS8vIHwgWyN4MEMwMS0jeDBDMDNdICAgICAgICAgIHwgWyN4MEMzRS0jeDBDNDRdICAgICAgICAgfCBbI3gwQzQ2LSN4MEM0OF0NCi0vLyB8IFsjeDBDNEEtI3gwQzREXSAgICAgICAgICB8IFsjeDBDNTUtI3gwQzU2XSAgICAgICAgIHwgWyN4MEM4Mi0jeDBDODNdDQotLy8gfCBbI3gwQ0JFLSN4MENDNF0gICAgICAgICAgfCBbI3gwQ0M2LSN4MENDOF0gICAgICAgICB8IFsjeDBDQ0EtI3gwQ0NEXQ0KLS8vIHwgWyN4MENENS0jeDBDRDZdICAgICAgICAgIHwgWyN4MEQwMi0jeDBEMDNdICAgICAgICAgfCBbI3gwRDNFLSN4MEQ0M10NCi0vLyB8IFsjeDBENDYtI3gwRDQ4XSAgICAgICB8IFsjeDBENEEtI3gwRDREXSAgICAgICB8ICN4MEQ1NyAgICAgIHwgI3gwRTMxDQotLy8gfCBbI3gwRTM0LSN4MEUzQV0gICAgfCBbI3gwRTQ3LSN4MEU0RV0gICAgfCAjeDBFQjEgICB8IFsjeDBFQjQtI3gwRUI5XQ0KLS8vIHwgWyN4MEVCQi0jeDBFQkNdICAgIHwgWyN4MEVDOC0jeDBFQ0RdICAgIHwgWyN4MEYxOC0jeDBGMTldICAgfCAjeDBGMzUNCi0vLyB8ICN4MEYzNyAgICAgIHwgI3gwRjM5ICAgICB8ICN4MEYzRSAgICAgfCAjeDBGM0YgICAgIHwgWyN4MEY3MS0jeDBGODRdDQotLy8gfCBbI3gwRjg2LSN4MEY4Ql0gICAgfCBbI3gwRjkwLSN4MEY5NV0gICAgfCAjeDBGOTcgICB8IFsjeDBGOTktI3gwRkFEXQ0KLS8vIHwgWyN4MEZCMS0jeDBGQjddICAgICAgIHwgI3gwRkI5ICAgICAgIHwgWyN4MjBEMC0jeDIwRENdICAgICAgfCAjeDIwRTENCi0vLyB8IFsjeDMwMkEtI3gzMDJGXSB8ICN4MzA5OSB8ICN4MzA5QQ0KLUNvbWJpbmluZ0NoYXIgPSAgICBbXHUwMzAwLVx1MDM0NVx1MDM2MC1cdTAzNjFcdTA0ODMtXHUwNDg2XHUwNTkxLVx1MDVBMVx1MDVBMy1cdTA1QjlcdTA1QkItXHUwNUJEXHUwNUJGXHUwNUMxLVx1MDVDMlx1MDVDNFx1MDY0Qi1cdTA2NTJcdTA2NzBcdTA2RDYtXHUwNkRDXHUwNkRELVx1MDZERlx1MDZFMC1cdTA2RTRcdTA2RTctXHUwNkU4XHUwNkVBLVx1MDZFRFx1MDkwMS1cdTA5MDNcdTA5M0NcdTA5M0UtXHUwOTRDXHUwOTREXHUwOTUxLVx1MDk1NFx1MDk2Mi1cdTA5NjNcdTA5ODEtXHUwOTgzXHUwOUJDXHUwOUJFXHUwOUJGXHUwOUMwLVx1MDlDNFx1MDlDNy1cdTA5QzhcdTA5Q0ItXHUwOUNEXHUwOUQ3XHUwOUUyLVx1MDlFM1x1MEEwMlx1MEEzQ1x1MEEzRVx1MEEzRlx1MEE0MC1cdTBBNDJcdTBBNDctXHUwQTQ4XHUwQTRCLVx1MEE0RFx1MEE3MC1cdTBBNzFcdTBBODEtXHUwQTgzXHUwQUJDXHUwQUJFLVx1MEFDNVx1MEFDNy1cdTBBQzlcdTBBQ0ItXHUwQUNEXHUwQjAxLVx1MEIwM1x1MEIzQ1x1MEIzRS1cdTBCNDNcdTBCNDctXHUwQjQ4XHUwQjRCLVx1MEI0RFx1MEI1Ni1cdTBCNTdcdTBCODItXHUwQjgzXHUwQkJFLVx1MEJDMlx1MEJDNi1cdTBCQzhcdTBCQ0EtXHUwQkNEXHUwQkQ3XHUwQzAxLVx1MEMwM1x1MEMzRS1cdTBDNDRcdTBDNDYtXHUwQzQ4XHUwQzRBLVx1MEM0RFx1MEM1NS1cdTBDNTZcdTBDODItXHUwQzgzXHUwQ0JFLVx1MENDNFx1MENDNi1cdTBDQzhcdTBDQ0EtXHUwQ0NEXHUwQ0Q1LVx1MENENlx1MEQwMi1cdTBEMDNcdTBEM0UtXHUwRDQzXHUwRDQ2LVx1MEQ0OFx1MEQ0QS1cdTBENERcdTBENTdcdTBFMzFcdTBFMzQtXHUwRTNBXHUwRTQ3LVx1MEU0RVx1MEVCMVx1MEVCNC1cdTBFQjlcdTBFQkItXHUwRUJDXHUwRUM4LVx1MEVDRFx1MEYxOC1cdTBGMTlcdTBGMzVcdTBGMzdcdTBGMzlcdTBGM0VcdTBGM0ZcdTBGNzEtXHUwRjg0XHUwRjg2LVx1MEY4Qlx1MEY5MC1cdTBGOTVcdTBGOTdcdTBGOTktXHUwRkFEXHUwRkIxLVx1MEZCN1x1MEZCOVx1MjBEMC1cdTIwRENcdTIwRTFcdTMwMkEtXHUzMDJGXHUzMDk5XHUzMDlBXQ0KLQ0KLS8vIFs4OF0gICBEaWdpdCAgOjo9ICBbI3gwMDMwLSN4MDAzOV0gfCBbI3gwNjYwLSN4MDY2OV0gfCBbI3gwNkYwLSN4MDZGOV0NCi0vLyB8IFsjeDA5NjYtI3gwOTZGXSAgICAgICAgICB8IFsjeDA5RTYtI3gwOUVGXSAgICAgICAgIHwgWyN4MEE2Ni0jeDBBNkZdDQotLy8gfCBbI3gwQUU2LSN4MEFFRl0gICAgICAgICAgfCBbI3gwQjY2LSN4MEI2Rl0gICAgICAgICB8IFsjeDBCRTctI3gwQkVGXQ0KLS8vIHwgWyN4MEM2Ni0jeDBDNkZdICAgICAgICAgIHwgWyN4MENFNi0jeDBDRUZdICAgICAgICAgfCBbI3gwRDY2LSN4MEQ2Rl0NCi0vLyB8IFsjeDBFNTAtI3gwRTU5XSB8IFsjeDBFRDAtI3gwRUQ5XSB8IFsjeDBGMjAtI3gwRjI5XQ0KLURpZ2l0ID0gIFtcdTAwMzAtXHUwMDM5XHUwNjYwLVx1MDY2OVx1MDZGMC1cdTA2RjlcdTA5NjYtXHUwOTZGXHUwOUU2LVx1MDlFRlx1MEE2Ni1cdTBBNkZcdTBBRTYtXHUwQUVGXHUwQjY2LVx1MEI2Rlx1MEJFNy1cdTBCRUZcdTBDNjYtXHUwQzZGXHUwQ0U2LVx1MENFRlx1MEQ2Ni1cdTBENkZcdTBFNTAtXHUwRTU5XHUwRUQwLVx1MEVEOVx1MEYyMC1cdTBGMjldDQotDQotLy8gWzg5XSAgRXh0ZW5kZXIgOjo9ICN4MDBCNyB8ICN4MDJEMCB8ICN4MDJEMSB8ICN4MDM4NyB8ICN4MDY0MCB8ICN4MEU0Ng0KLS8vIHwgI3gwRUM2ICAgICAgIHwgI3gzMDA1ICAgICAgIHwgWyN4MzAzMS0jeDMwMzVdICAgICAgfCBbI3gzMDlELSN4MzA5RV0NCi0vLyB8IFsjeDMwRkMtI3gzMEZFXQ0KLUV4dGVuZGVyID0gW1x1MDBCN1x1MDJEMFx1MDJEMVx1MDM4N1x1MDY0MFx1MEU0Nlx1MEVDNlx1MzAwNVx1MzAzMS1cdTMwMzVcdTMwOUQtXHUzMDlFXHUzMEZDLVx1MzBGRV0NCi0NCi0lJQ0KLQ0KLQ0KLS8qIHdoaXRlIHNwYWNlIHdpdGhpbiBhIHRhZyAqLw0KLTxTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUsIFNUX1BJLCBTVF9YTUxfUElfRVFVQUxTLCBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUsIFNUX1hNTF9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04sIFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OLCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTiwgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFLCBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMsIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQsU1RfREhUTUxfQVRUUklCVVRFX05BTUUsU1RfREhUTUxfRVFVQUxTLFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSxTVF9ESFRNTF9UQUdfQ0xPU0U+IHtTfSogew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIndoaXRlIHNwYWNlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi0NCi0vLyBCRUdJTiBSRUdVTEFSIFhNTA0KLS8qIGhhbmRsZSBvcGVuaW5nIGEgbmV3IHRhZyBhbG1vc3QgYW55d2hlcmUgKi8NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0RFQ0xBUkFUSU9OLCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFPiB7Z2VuZXJpY1RhZ09wZW59IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbnN0YXJ0IHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfT1BFTjsNCi19DQotDQotLyogdW5xdW90ZWQgKi8NCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSwgU1RfWE1MX0RFQ0xBUkFUSU9OPiB7Z2VuZXJpY0VuZFRhZ09wZW59IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbmVuZCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfRU5EX1RBR19PUEVOOw0KLX0NCi0vKiB0aGUgdGFnJ3MgbmFtZSB3YXMgZm91bmQsIHN0YXJ0IHNjYW5uaW5nIGZvciBhdHRyaWJ1dGVzICovDQotPFNUX1hNTF9UQUdfTkFNRT4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJ0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLS8qIGFub3RoZXIgYXR0cmlidXRlIG5hbWUgd2FzIGZvdW5kLCByZXN1bWUgbG9va2luZyBmb3IgdGhlIGVxdWFscyBzaWduICovDQotPFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9FUVVBTFMpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotfQ0KLS8qIGFuIGVxdWFsIHNpZ24gd2FzIGZvdW5kLCB3aGF0J3MgbmV4dCBpcyB0aGUgdmFsdWUgKi8NCi08U1RfWE1MX0VRVUFMUz4ge0VxfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZXF1YWxzIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7DQotfQ0KLS8qIHRoZSB2YWx1ZSB3YXMgZm91bmQsIGxvb2sgZm9yIHRoZSBuZXh0IG5hbWUgKi8NCi0vKiBhbGxvdyBmb3IgdW5iYWxhbmNlZCBxdW90ZXMsIG1vc3RseSBhIGR1cGxpY2F0ZSBvZiB0aGUgQXR0VmFsdWUgcnVsZSAqLw0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFPiB7QXR0VmFsdWV9IHwgKFtcJ1wiXShbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXXxcLytbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXSApKiApIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLX0NCi0NCi0NCi0vKiB0aGUgdGFnJ3MgY2xvc2Ugd2FzIGZvdW5kICovDQotPFNUX1hNTF9UQUdfTkFNRSwgU1RfWE1MX0VRVUFMUywgU1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFPiB7Z2VuZXJpY1RhZ0Nsb3NlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgidGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJA0KLQlpZihpc0Jsb2NrTWFya2VyKCkpIHsNCi0gICAgICAgIAl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JfQ0KLQllbHNlDQotICAgICAgICAJeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQ0xPU0U7DQotfQ0KLS8qIHRoZSB0YWcncyBjbG9zZSB3YXMgZm91bmQsIGJ1dCB0aGUgdGFnIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIGVuZCB0YWcgKi8NCi08U1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljRW1wdHlUYWdDbG9zZX0gew0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVtcHR5IHRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHJldHVybiBYTUxfRU1QVFlfVEFHX0NMT1NFOw0KLX0NCi0NCi08U1RfWE1MX1RBR19OQU1FPiBbXjwvPlx1MDA0MS1cdTAwNUFcdTAwNjEtXHUwMDdBXHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMEZGXHUwMTAwLVx1MDEzMVx1MDEzNC1cdTAxM0VcdTAxNDEtXHUwMTQ4XHUwMTRBLVx1MDE3RVx1MDE4MC1cdTAxQzNcdTAxQ0QtXHUwMUYwXHUwMUY0LVx1MDFGNVx1MDFGQS1cdTAyMTdcdTAyNTAtXHUwMkE4XHUwMkJCLVx1MDJDMVx1MDM4Nlx1MDM4OC1cdTAzOEFcdTAzOENcdTAzOEUtXHUwM0ExXHUwM0EzLVx1MDNDRVx1MDNEMC1cdTAzRDZcdTAzREFcdTAzRENcdTAzREVcdTAzRTBcdTAzRTItXHUwM0YzXHUwNDAxLVx1MDQwQ1x1MDQwRS1cdTA0NEZcdTA0NTEtXHUwNDVDXHUwNDVFLVx1MDQ4MVx1MDQ5MC1cdTA0QzRcdTA0QzctXHUwNEM4XHUwNENCLVx1MDRDQ1x1MDREMC1cdTA0RUJcdTA0RUUtXHUwNEY1XHUwNEY4LVx1MDRGOVx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg2XHUwNUQwLVx1MDVFQVx1MDVGMC1cdTA1RjJcdTA2MjEtXHUwNjNBXHUwNjQxLVx1MDY0QVx1MDY3MS1cdTA2QjdcdTA2QkEtXHUwNkJFXHUwNkMwLVx1MDZDRVx1MDZEMC1cdTA2RDNcdTA2RDVcdTA2RTUtXHUwNkU2XHUwOTA1LVx1MDkzOVx1MDkzRFx1MDk1OC1cdTA5NjFcdTA5ODUtXHUwOThDXHUwOThGLVx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlEQy1cdTA5RERcdTA5REYtXHUwOUUxXHUwOUYwLVx1MDlGMVx1MEEwNS1cdTBBMEFcdTBBMEYtXHUwQTEwXHUwQTEzLVx1MEEyOFx1MEEyQS1cdTBBMzBcdTBBMzItXHUwQTMzXHUwQTM1LVx1MEEzNlx1MEEzOC1cdTBBMzlcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTcyLVx1MEE3NFx1MEE4NS1cdTBBOEJcdTBBOERcdTBBOEYtXHUwQTkxXHUwQTkzLVx1MEFBOFx1MEFBQS1cdTBBQjBcdTBBQjItXHUwQUIzXHUwQUI1LVx1MEFCOVx1MEFCRFx1MEFFMFx1MEIwNS1cdTBCMENcdTBCMEYtXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzItXHUwQjMzXHUwQjM2LVx1MEIzOVx1MEIzRFx1MEI1Qy1cdTBCNURcdTBCNUYtXHUwQjYxXHUwQjg1LVx1MEI4QVx1MEI4RS1cdTBCOTBcdTBCOTItXHUwQjk1XHUwQjk5LVx1MEI5QVx1MEI5Q1x1MEI5RS1cdTBCOUZcdTBCQTMtXHUwQkE0XHUwQkE4LVx1MEJBQVx1MEJBRS1cdTBCQjVcdTBCQjctXHUwQkI5XHUwQzA1LVx1MEMwQ1x1MEMwRS1cdTBDMTBcdTBDMTItXHUwQzI4XHUwQzJBLVx1MEMzM1x1MEMzNS1cdTBDMzlcdTBDNjAtXHUwQzYxXHUwQzg1LVx1MEM4Q1x1MEM4RS1cdTBDOTBcdTBDOTItXHUwQ0E4XHUwQ0FBLVx1MENCM1x1MENCNS1cdTBDQjlcdTBDREVcdTBDRTAtXHUwQ0UxXHUwRDA1LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDI4XHUwRDJBLVx1MEQzOVx1MEQ2MC1cdTBENjFcdTBFMDEtXHUwRTJFXHUwRTMwXHUwRTMyLVx1MEUzM1x1MEU0MC1cdTBFNDVcdTBFODEtXHUwRTgyXHUwRTg0XHUwRTg3LVx1MEU4OFx1MEU4QVx1MEU4RFx1MEU5NC1cdTBFOTdcdTBFOTktXHUwRTlGXHUwRUExLVx1MEVBM1x1MEVBNVx1MEVBN1x1MEVBQS1cdTBFQUJcdTBFQUQtXHUwRUFFXHUwRUIwXHUwRUIyLVx1MEVCM1x1MEVCRFx1MEVDMC1cdTBFQzRcdTBGNDAtXHUwRjQ3XHUwRjQ5LVx1MEY2OVx1MTBBMC1cdTEwQzVcdTEwRDAtXHUxMEY2XHUxMTAwXHUxMTAyLVx1MTEwM1x1MTEwNS1cdTExMDdcdTExMDlcdTExMEItXHUxMTBDXHUxMTBFLVx1MTExMlx1MTEzQ1x1MTEzRVx1MTE0MFx1MTE0Q1x1MTE0RVx1MTE1MFx1MTE1NC1cdTExNTVcdTExNTlcdTExNUYtXHUxMTYxXHUxMTYzXHUxMTY1XHUxMTY3XHUxMTY5XHUxMTZELVx1MTE2RVx1MTE3Mi1cdTExNzNcdTExNzVcdTExOUVcdTExQThcdTExQUJcdTExQUUtXHUxMUFGXHUxMUI3LVx1MTFCOFx1MTFCQVx1MTFCQy1cdTExQzJcdTExRUJcdTExRjBcdTExRjlcdTFFMDAtXHUxRTlCXHUxRUEwLVx1MUVGOVx1MUYwMC1cdTFGMTVcdTFGMTgtXHUxRjFEXHUxRjIwLVx1MUY0NVx1MUY0OC1cdTFGNERcdTFGNTAtXHUxRjU3XHUxRjU5XHUxRjVCXHUxRjVEXHUxRjVGLVx1MUY3RFx1MUY4MC1cdTFGQjRcdTFGQjYtXHUxRkJDXHUxRkJFXHUxRkMyLVx1MUZDNFx1MUZDNi1cdTFGQ0NcdTFGRDAtXHUxRkQzXHUxRkQ2LVx1MUZEQlx1MUZFMC1cdTFGRUNcdTFGRjItXHUxRkY0XHUxRkY2LVx1MUZGQ1x1MjEyNlx1MjEyQS1cdTIxMkJcdTIxMkVcdTIxODAtXHUyMTgyXHUzMDQxLVx1MzA5NFx1MzBBMS1cdTMwRkFcdTMxMDUtXHUzMTJDXHVBQzAwLVx1RDdBM1x1NEUwMC1cdTlGQTVcdTMwMDdcdTMwMjEtXHUzMDI5XSogew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImluYXBwcm9wcmlhdGUgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfQ09OVEVOVDsNCi19DQotDQotLy8gRU5EIFJFR1VMQVIgWE1MDQotDQotDQotLy8gWE1MIENvbW1lbnRzDQotDQotPFlZSU5JVElBTCwgU1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUsIFNUX1hNTF9ERUNMQVJBVElPTj4ge0NvbW1lbnRTdGFydH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfQ09NTUVOVCk7DQotCXJldHVybiBYTUxfQ09NTUVOVF9PUEVOOw0KLX0NCi08U1RfWE1MX0NPTU1FTlQ+IC58XHJ8XG4gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImNvbW1lbnQgY29udGVudCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOw0KLX0NCi0NCi08U1RfWE1MX0NPTU1FTlRfRU5EPiB7Q29tbWVudEVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImNvbW1lbnQgZW5kIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFlZSU5JVElBTCk7DQotCXJldHVybiBYTUxfQ09NTUVOVF9DTE9TRTsNCi19DQotDQotLy8gWE1MIG1pc2MNCi0NCi17Q0RTdGFydH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuQ0RBVEEgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JeXliZWdpbihTVF9DREFUQV9URVhUKTsNCi0JcmV0dXJuIFhNTF9DREFUQV9PUEVOOw0KLX0NCi08U1RfQ0RBVEFfVEVYVD4gLnxccnxcbiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiQ0RBVEEgdGV4dCIpOy8vJE5PTi1OTFMtMSQNCi0JU3RyaW5nIGJsb2NrQ29udGV4dCA9IGRvQmxvY2tTY2FuKCJdXT4iLCBYTUxfQ0RBVEFfVEVYVCwgU1RfQ0RBVEFfRU5EKTsvLyROT04tTkxTLTEkDQotCWlmKGJsb2NrQ29udGV4dCA9PSBYTUxfQ0RBVEFfVEVYVCkNCi0JCXl5YmVnaW4oU1RfQ0RBVEFfRU5EKTsNCi0JcmV0dXJuIGJsb2NrQ29udGV4dDsNCi19DQotPFNUX0NEQVRBX0VORD4ge0NERW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiQ0RBVEEgZW5kIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JcmV0dXJuIFhNTF9DREFUQV9DTE9TRTsNCi19DQotDQotPFlZSU5JVElBTD4ge1BFUmVmZXJlbmNlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5QRVJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9QRV9SRUZFUkVOQ0U7DQotfQ0KLTxZWUlOSVRJQUw+IHtDaGFyUmVmfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5DaGFyUmVmIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX0NIQVJfUkVGRVJFTkNFOw0KLX0NCi08WVlJTklUSUFMPiB7RW50aXR5UmVmfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5FbnRpdHlSZWYiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfRU5USVRZX1JFRkVSRU5DRTsNCi19DQotDQotPFlZSU5JVElBTD4ge1BJc3RhcnR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfUEkpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9PUEVOOw0KLX0NCi0vLyB0aGUgbmV4dCBmb3VyIGFyZSBvcmRlciBkZXBlbmRlbnQNCi08U1RfUEk+ICgoWHx4KShNfG0pKEx8bCkpIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOw0KLX0NCi08U1RfUEk+IChbaUldW21NXVtwUF1bb09dW3JSXVt0VF17U30qKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QST4geG1sLXN0eWxlc2hlZXQgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhTTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QST4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfUElfV1MpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsNCi19DQotPFNUX1BJX1dTPiB7U30rIHsNCi0gICAgICAgIHl5YmVnaW4oU1RfUElfQ09OVEVOVCk7DQotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLTxTVF9QSSwgU1RfUElfV1M+IFw/PiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOw0KLX0NCi08U1RfUElfQ09OVEVOVD4gLiB7DQotCS8vIGJsb2NrIHNjYW4gdW50aWwgY2xvc2UgaXMgZm91bmQNCi0JcmV0dXJuIGRvU2NhbigiPz4iLCBmYWxzZSwgWE1MX1BJX0NPTlRFTlQsIFNUX1hNTF9QSV9UQUdfQ0xPU0UsIFNUX1hNTF9QSV9UQUdfQ0xPU0UpOw0KLX0NCi08U1RfUElfQ09OVEVOVCxTVF9YTUxfUElfVEFHX0NMT1NFPiBcPz4gew0KLQkJLy8gZW5kZWQgd2l0aCBub3RoaW5nIGluc2lkZQ0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsNCi19DQotPFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX1BJX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0VRVUFMUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi19DQotPFNUX1hNTF9QSV9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOw0KLX0NCi0vKiB0aGUgdmFsdWUgd2FzIGZvdW5kLCBsb29rIGZvciB0aGUgbmV4dCBuYW1lICovDQotPFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gfCAoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi19DQotLyogdGhlIFBJJ3MgY2xvc2Ugd2FzIGZvdW5kICovDQotPFNUX1hNTF9QSV9FUVVBTFMsIFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRT4ge1BJZW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsNCi19DQotLy8gREhUTUwNCi08U1RfREhUTUxfQVRUUklCVVRFX05BTUUsIFNUX0RIVE1MX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9FUVVBTFMpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotfQ0KLTxTVF9ESFRNTF9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotLyogdGhlIHZhbHVlIHdhcyBmb3VuZCwgbG9vayBmb3IgdGhlIG5leHQgbmFtZSAqLw0KLTxTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gfCAoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLS8qIFRoZSBESFRNTCBQSSdzIGNsb3NlIHdhcyBmb3VuZCAqLw0KLTxTVF9ESFRNTF9FUVVBTFMsIFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FLCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUU+IFsvXSo+IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7DQotfQ0KLQ0KLS8vIFhNTCBkZWNsYXJhdGlvbnMNCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNUYWdPcGVufSEgew0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5kZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9PUEVOOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbRWVdW0xsXVtFZV1bTW1dW0VlXVtObl1bVHRdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlbGVtZW50Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbRGRdW09vXVtDY11bVHRdW1l5XVtQcF1bRWVdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbQWFdW1R0XVtUdF1bTGxdW0lpXVtTc11bVHRdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OOw0KLX0NCi0NCi0vLyBiZWdpbiBET0NUWVBFIGhhbmRsaW5nIHByb2NlZHVyZQ0KLTxTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQsIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSwgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDLCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0U+IFxbW15cXV0qXF0gew0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUOw0KLX0NCi0NCi08U1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04+IHtOYW1lfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSB0eXBlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX05BTUU7DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRD4gW1BwXVtVdV1bQmJdW0xsXVtJaV1bQ2NdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUM7DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRD4gW1NzXVtZeV1bU3NdW1R0XVtFZV1bTW1dIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU07DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUM+IHtBdHRWYWx1ZX18e1B1YmlkTGl0ZXJhbH18KFtcJ1wiXShbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXXxcLytbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXSApKiApIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIHB1YmxpYyByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsNCi19DQotPFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTT4ge0F0dFZhbHVlfXx7U3lzdGVtTGl0ZXJhbH18KFtcJ1wiXShbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXXxcLytbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXSApKiApIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIHN5c3RlbSByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsNCi19DQotLy8gZW5kIERPQ1RZUEUgaGFuZGxpbmcNCi0NCi0vLyBiZWdpbiBFTEVNRU5UIGhhbmRsaW5nIHByb2NlZHVyZQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTj4ge0F0dFZhbHVlfXx7UHViaWRMaXRlcmFsfXwoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVsZW1lbnRkZWNsIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCk7DQotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX05BTUU7DQotfQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UPiBbXj5dKiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudGRlY2wgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX0NPTlRFTlQ7DQotfQ0KLQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UPiB7Z2VuZXJpY1RhZ0Nsb3NlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudGRlY2wgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOw0KLX0NCi0vLyBlbmQgRUxFTUVOVCBoYW5kbGluZw0KLQ0KLS8vIGJlZ2luIEFUVExJU1QgaGFuZGxpbmcgcHJvY2VkdXJlDQotPFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OPiB7QXR0VmFsdWV9fHtQdWJpZExpdGVyYWx9fChbXCdcIl0oW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSogKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOw0KLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9OQU1FOw0KLX0NCi08U1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVD4gW14+XSogew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dGxpc3QgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQ7DQotfQ0KLQ0KLTxTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UPiB7Z2VuZXJpY1RhZ0Nsb3NlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkDQotCX0NCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7DQotfQ0KLS8vIGVuZCBBVFRMSVNUIGhhbmRsaW5nDQotDQotPFNUX1hNTF9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04sIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lELCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTiwgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04sIFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSwgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDLCBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0sIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEPiB7Z2VuZXJpY1RhZ0Nsb3NlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZGVjbGFyYXRpb24gZW5kIik7Ly8kTk9OLU5MUy0xJA0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsNCi19DQotLy8gZW5kIERFQ0xBUkFUSU9OIGhhbmRsaW5nDQotDQotPFlZSU5JVElBTD4gW148JiVdKnxbJiVde1N9K3tOYW1lfVteJiU8XSp8WyYlXXtOYW1lfShbXjsmJTxdKnx7U30rOyopIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcblhNTCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX0NPTlRFTlQ7DQotfQ0KLQ0KLQ0KLTxTVF9CTE9DS19UQUdfU0NBTj4gLnxccnxcbiB7DQotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsNCi0JfQ0KLQ0KLS4gew0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiEhIXVuZXhwZWN0ZWQhISE6IFwiIiArIHl5dGV4dCgpICsgIlwiOiIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJA0KLQkJCXl5Y2hhciArICItIiArICh5eWNoYXIgKyB5eWxlbmd0aCgpKSk7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gVU5ERUZJTkVEOw0KLX0NCi0NCi1cMDQwIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJTUEFDRSIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi1cMDExIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCIweDkiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBXSElURV9TUEFDRTsNCi19DQotXDAxNSANCi17DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiQ0FSUklBR0UgUkVUVVJOIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLVwwMTIgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkxJTkUgRkVFRCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXguY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4LmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTllODExYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXguY21kCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1AZWNobyBvZmYNCi1jbWQgL2MgZmxleHguY21kDQotY21kIC9jIGZsZXhqLmNtZA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleC5zaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNiNmUzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMhL2Jpbi9zaA0KLWV4cG9ydCBQQVRIPSRQQVRIOi9vcHQvSUJNSmF2YTItMTMxL2Jpbi86L29wdC9JQk1KYXZhMi0xMy9iaW4vOi9vcHQvamRrMS40DQotamF2YSAtWG14NDcwMDAwMDAwIC1jcCBKRmxleC9saWIvc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gSlNQVG9rZW5pemVyLmpmbGV4IC1za2VsIHNrZWxldG9uLnNzZQ0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgSkZsZXgvbGliL3NlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluIFhNTFRva2VuaXplci5qZmxleCAtc2tlbCBza2VsZXRvbi5zc2UNCi1ybSAtZiBKU1BUb2tlbml6ZXIuamF2YX4gSlNQVG9rZW5pemVyfiBYTUxUb2tlbml6ZXIuamF2YX4gWE1MVG9rZW5pemVyfg0KLWNwIC12IFhNTFRva2VuaXplci5qYXZhIC4uLy4uLy4uLy4uL3NlZG1vZGVsL2NvbS9pYm0vc2VkL3BhcnNlci9pbnRlcm5hbA0KLWNwIC12IEpTUFRva2VuaXplci5qYXZhIC4uLy4uLy4uLy4uL3NlZG1vZGVsL2NvbS9pYm0vc2VkL3BhcnNlci9pbnRlcm5hbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleGouY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4ai5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMTBlMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4ai5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUBlY2hvIG9mZg0KLVBBVEg9JVBBVEglO2Q6XGpkazZfMDFcYmluDQotamF2YSAtWG14NDcwMDAwMDAwIC1jcCBkOlxKRmxleFwxLjIuMlxsaWJcSkZsZXguamFyOy4gSkZsZXguTWFpbiBKU1BUb2tlbml6ZXIuamZsZXggLXNrZWwgc2tlbGV0b24uc3NlICYmIHJtIC1mIEpTUFRva2VuaXplci5qYXZhfiBKU1BUb2tlbml6ZXJ+ICYmIGNvcHkgSlNQVG9rZW5pemVyLmphdmEgLi5cLi5cLi5cLi5cLi5cb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlXHNyY1xvcmdcZWNsaXBzZVxqc3RcanNwXGNvcmVcaW50ZXJuYWxccGFyc2VyXFxpbnRlcm5hbFxKU1BUb2tlbml6ZXIuamF2YQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleHguY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4eC5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYjFmODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4eC5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUBlY2hvIG9mZg0KLVBBVEg9JVBBVEglO2M6XGpkazEuNC4yXzA4XGJpbg0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgZDpcSkZsZXhcMS4yLjJcbGliXEpGbGV4LmphcjsuIEpGbGV4Lk1haW4gWE1MVG9rZW5pemVyLmpmbGV4IC1za2VsIHNrZWxldG9uLnNzZSAmJiBybSAtZiBYTUxUb2tlbml6ZXIuamF2YX4gWE1MVG9rZW5pemVyfiAmJiBjb3B5IFhNTFRva2VuaXplci5qYXZhIC4uXC4uXC4uXC4uXC4uXG9yZy5lY2xpcHNlLndzdC54bWwuY29yZVxzcmNcb3JnXGVjbGlwc2Vcd3N0XHhtbFxjb3JlXGludGVybmFsXHBhcnNlclxYTUxUb2tlbml6ZXIuamF2YQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvc2tlbGV0b24uc3NlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9za2VsZXRvbi5zc2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYjc2MzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9za2VsZXRvbi5zc2UKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotDQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8NCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7DQotDQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8NCi0tLS0gIGxleGljYWwgc3RhdGVzLCBjaGFybWFwDQotDQotICAvKiBlcnJvciBjb2RlcyAqLw0KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOw0KLSAgLy8gZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOw0KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsNCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsNCi0NCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8NCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsNCi0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwJCS8vJE5PTi1OTFMtMSQNCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwJCS8vJE5PTi1OTFMtMSQNCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAkJLy8kTk9OLU5MUy0xJA0KLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCS8vJE5PTi1OTFMtMSQNCi0gIH07DQotDQotLS0tIGlzRmluYWwgbGlzdA0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8NCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOw0KLQ0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8NCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOw0KLQ0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8NCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7DQotDQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcw0KLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLw0KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOw0KLQ0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovDQotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7DQotDQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8NCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOw0KLQ0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsNCi0NCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8NCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsNCi0NCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQNCi0gICAgICBmcm9tIGlucHV0ICovDQotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOw0KLQ0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOw0KLQ0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOw0KLQ0KLSAgLyoqDQotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgDQotICAgKiBtYXRjaGVkIHRleHQNCi0gICAqLw0KLSAgLy8gcHJpdmF0ZSBpbnQgeXljb2x1bW47IA0KLQ0KLSAgLyoqIA0KLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lDQotICAgKi8NCi0gIC8vIHByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsNCi0NCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovDQotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7DQotDQotLS0tIHVzZXIgY2xhc3MgY29kZQ0KLQ0KLSAgLyoqDQotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXINCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4NCi0gICAqDQotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4NCi0gICAqLw0KLS0tLSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbg0KLQ0KLQ0KLSAgLyoqDQotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4NCi0gICAqDQotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUNCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLg0KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3Vycw0KLSAgICovDQotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gew0KLQ0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovDQotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOw0KLQ0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIA0KLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsNCi0NCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovDQotDQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovDQotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7DQotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgDQotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOw0KLQ0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovDQotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOw0KLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9zdGFydFJlYWQgPSAwOw0KLSAgICB9DQotDQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8NCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgew0KLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLw0KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOw0KLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOw0KLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsNCi0gICAgfQ0KLQ0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8NCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsNCi0NCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOw0KLQ0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsNCi0NCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOw0KLSAgfQ0KLQ0KLSAgICANCi0gIC8qKg0KLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7DQotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLw0KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8NCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7DQotICB9DQotDQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4NCi0gICAqLw0KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgew0KLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUNCi0gICAqDQotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7DQotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsNCi0gIH0NCi0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4NCi0gICAqLw0KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7DQotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7DQotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOw0KLSAgfQ0KLQ0KLQ0KLSAgLyoqDQotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZyAtIGZyb20gdGhlIFNFRCBKRmxleCBza2VsZXRvbg0KLSAgICoNCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5DQotICAgKi8NCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgew0KLSAgICB0cnkgew0KLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7DQotICAgIH0NCi0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7DQotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7DQotICAgIH0NCi0gICAgLy8gRE8gTk9UIEVYSVQgdGhlIFZNIG9uIGFuIGVycm9yDQotICAgIC8vIFN5c3RlbS5leGl0KDEpOw0KLSAgfSANCi0NCi0NCi0gIC8qKg0KLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uDQotICAgKg0KLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZA0KLSAgICoNCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLg0KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhDQotICAgKi8NCi0gIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7DQotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApDQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOw0KLQ0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOw0KLSAgfQ0KLQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQNCi0JICovDQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShjaGFyW10gbWFya2VyVGFnTmFtZSwgaW50IG9mZnNldCwgaW50IHRhZ25hbWVMZW5ndGgpIHsNCi0JCWZvcihpbnQgaiA9IDA7IGogPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaisrKSB7DQotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWZCbG9ja01hcmtlcnMuZ2V0KGopOw0KLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkubGVuZ3RoKCkgPT0gdGFnbmFtZUxlbmd0aCkgew0KLQkJCQlib29sZWFuIG1hdGNoZXNTb0ZhciA9IHRydWU7DQotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCB0YWduYW1lTGVuZ3RoICYmIG1hdGNoZXNTb0ZhcjsgaSsrKSB7DQotCQkJCQlpZihtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsNCi0JCQkJCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmNoYXJBdChpKSAhPSBtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKQ0KLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJCWVsc2Ugew0KLQkJCQkJCWlmKENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXIuZ2V0VGFnTmFtZSgpLmNoYXJBdChpKSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pKQ0KLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlpZihtYXRjaGVzU29GYXIpDQotCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkDQotCSAqDQotCSAqIFJldHVybiBBTEwgb2YgdGhlIHJlZ2lvbnMgc2Nhbm5hYmxlIHdpdGhpbiB0aGUgcmVtYWluaW5nIHRleHQNCi0JICogTm90ZTogZm9yIHZlcmlmaWNhdGlvbiB1c2UNCi0JICovDQotCXB1YmxpYyBmaW5hbCBMaXN0IGdldFJlZ2lvbnMoKSB7DQotCQlMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsNCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7DQotCQl0cnkgew0KLQkJCXJlZ2lvbiA9IGdldE5leHRUb2tlbigpOw0KLQkJCXdoaWxlKHJlZ2lvbiAhPSBudWxsKSB7DQotCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgew0KLQkJCQkJdG9rZW5zLmFkZChyZWdpb24pOw0KLQkJCQl9DQotCQkJCXJlZ2lvbiA9IGdldE5leHRUb2tlbigpOw0KLQkJCX0NCi0JCX0NCi0JCWNhdGNoIChTdGFja092ZXJmbG93RXJyb3IgZSkgew0KLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIjogaW5wdXQgY291bGQgbm90IGJlIHRva2VuaXplZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldE9mZnNldCgpLCBlKTsvLyROT04tTkxTLTEkDQotCQkJdGhyb3cgZTsNCi0JCX0NCi0JCWNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCS8vIFNpbmNlIHRoaXMgaXMgY29udmVuaWVuY2UgbWV0aG9kIGFuZCBOT1QgdGhlIHJlY29tbWVuZGVkIA0KLQkJCS8vIHdheSBvZiBnZXR0aW5nIHRva2VucywgbWFueSBlcnJvcnMgYXJlIHNpbXBseSBoaWRkZW4NCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gbm90IGhhbmRsZWQgcmV0cmlldmluZyByZWdpb25zOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGUpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXJldHVybiB0b2tlbnM7DQotCX0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkDQotCSAqLw0KLQlwcml2YXRlIGZpbmFsIHZvaWQgZHVtcChTdHJpbmcgcykgew0KLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKHMgKyAiICgiICsgeXljaGFyICsgIi0iICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQNCi0JCQkJKHl5bGVuZ3RoKCkgKyB5eWNoYXIpICsgIik6XCciICsvLyROT04tTkxTLTEkDQotCQkJCQlTdHJpbmdVdGlscy5lc2NhcGUoeXl0ZXh0KCkpICsgIlwnIik7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICAtIHNrZWxldG9uLnNlZCAqLw0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VPRigpIHsNCi0JCXJldHVybiB5eV9hdEVPRjsNCi0JfQ0KLS8qIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkICovDQotcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKFN0cmluZyBtYXJrZXJUYWdOYW1lKSB7DQotCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsNCi0Jd2hpbGUoYmxvY2tzLmhhc05leHQoKSkgew0KLQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWJsb2Nrcy5uZXh0KCk7DQotCQlpZihtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsNCi0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhtYXJrZXJUYWdOYW1lKSkNCi0JCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQllbHNlIHsNCi0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobWFya2VyVGFnTmFtZSkpDQotCQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotLS0tIHl5X2RvRW9mDQotICAvKioNCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsDQotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuDQotICAgKg0KLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuDQotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzDQotICAgKi8NCi0tLS0geXlsZXggZGVjbGFyYXRpb24NCi0gICAgaW50IHl5X2lucHV0Ow0KLSAgICBpbnQgeXlfYWN0aW9uOw0KLQ0KLS0tLSBsb2NhbCBkZWNsYXJhdGlvbnMNCi0NCi0gICAgd2hpbGUgKHRydWUpIHsNCi0NCi0tLS0gc3RhcnQgYWRtaW4gKGxpbmUsIGNoYXIsIGNvbCBjb3VudCkNCi0gICAgICB5eV9hY3Rpb24gPSAtMTsNCi0NCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOw0KLQ0KLS0tLSBzdGFydCBhZG1pbiAobGV4c3RhdGUgZXRjKQ0KLQ0KLSAgICAgIHl5X2ZvckFjdGlvbjogew0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsNCi0gICAgDQotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOw0KLQ0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOw0KLQ0KLS0tLSBsaW5lLCBjb2wsIGNoYXIgY291bnQsIG5leHQgdHJhbnNpdGlvbiwgaXNGaW5hbCBhY3Rpb24NCi0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgDQotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgDQotLS0tIGxpbmUgY291bnQgdXBkYXRlDQotICAgICAgICAgIH0NCi0NCi0gICAgICAgIH0NCi0gICAgICB9DQotDQotLS0tIGNoYXIgY291bnQgdXBkYXRlDQotDQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgDQotDQotLS0tIGFjdGlvbnMNCi0gICAgICAgIGRlZmF1bHQ6IA0KLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsNCi0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7DQotLS0tIGVvZnZhbHVlDQotICAgICAgICAgIH0gDQotICAgICAgICAgIGVsc2Ugew0KLS0tLSBubyBtYXRjaA0KLSAgICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICB9ICAgIA0KLQ0KLS0tLSBtYWluDQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvc2tlbGV0b24uc3NlLnJlYWRtZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvc2tlbGV0b24uc3NlLnJlYWRtZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4OTcwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL3NrZWxldG9uLnNzZS5yZWFkbWUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVRoZSBza2VsZXRvbi5zZWQgZmlsZSBjb250YWlucyB0aGUgbW9kaWZpZWQgSkZsZXggMS4yLjIgc2tlbGV0b24gZmlsZSB3aXRoDQotY2hhbmdlcyBmb3IgdXNlIHdpdGggdGhlIHRva2VuaXplcnMgd2l0aGluIHRoZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUueG1sIGFuZA0KLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5qc3AgcGx1Z2lucy4NCi0NCi1UaGUgc2tlbGV0b24gZmlsZSdzIG1ldGhvZCBkZWZpbml0aW9ucyBhcmUgY29waWVkIGludG8gdGhlIGdlbmVyYXRlZCBvdXRwdXQNCi1kaXJlY3RseS4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZDgzZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9InRva2VuaXplciIgZGVmYXVsdD0iQ1NTVG9rZW5pemVyIj4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9InByb3BlcnRpZXMiPgotCQk8cHJvcGVydHkgbmFtZT0id29ya3NwYWNlLmRpciIgdmFsdWU9Ii4uLy4uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJqZmxleC5qYXIiIHZhbHVlPSIvRGV2VGltZVN1cHBvcnQvSkZsZXgvbGliL3NlZC1qZmxleC5qYXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImpmbGV4Lm1heG1lbW9yeSIgdmFsdWU9IjQ3MDAwMDAwMCIvPgotCQk8cHJvcGVydHkgbmFtZT0iamZsZXgub3B0IiB2YWx1ZT0iLXNrZWwgU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9za2VsZXRvbi5zc2UiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icHJvcGVydGllcyIgaWY9ImVjbGlwc2UucnVubmluZyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlciIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLkpEVENvbXBpbGVyQWRhcHRlciIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJDU1NUb2tlbml6ZXIiIGRlcGVuZHM9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9IlNlZE1vZGVsL0NTU1Rva2VuaXplci9kZXZlbCIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmZpbGUiIHZhbHVlPSJDU1NUb2tlbml6ZXIuamZsZXgiLz4JCQkKLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNzcy9zcmMvY29tL2libS9zc2UvbW9kZWwvY3NzL2ludGVybmFsL3BhcnNlciIvPgotCQk8cHJvcGVydHkgbmFtZT0iZmluYWxkZXN0LmRpciIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlciIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkLXRva2VuaXplciI+Ci0JCQk8cGFyYW0gbmFtZT0iamZsZXgub3B0IiB2YWx1ZT0iIi8+Ci0JCTwvYW50Y2FsbD4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iWE1MVG9rZW5pemVyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJTZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZmlsZSIgdmFsdWU9IlhNTFRva2VuaXplciIvPgkJCQotCQk8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUueG1sL3NyYy9jb20vaWJtL3NzZS9tb2RlbC94bWwvaW50ZXJuYWwvcGFyc2VyIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYnVpbGQtdG9rZW5pemVyIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IkpTUFRva2VuaXplciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbCIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmZpbGUiIHZhbHVlPSJKU1BUb2tlbml6ZXIuamZsZXgiLz4JCQkKLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmpzcC9zcmMvY29tL2libS9zc2UvbW9kZWwvanNwL3BhcnNlci9pbnRlcm5hbCIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkLXRva2VuaXplciIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZC10b2tlbml6ZXIiIGRlcGVuZHM9ImluaXQiPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJ1bi1qZmxleCIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImNvcHkiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjbGVhbiIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJydW4tamZsZXgiIGRlcGVuZHM9ImluaXQiPgotCQk8amF2YSBjbGFzc25hbWU9IkpGbGV4Lk1haW4iIG1heG1lbW9yeT0iJHtqZmxleC5tYXhtZW1vcnl9IiBmb3JrPSJ5ZXMiID4KLQkJCTxhcmcgbGluZT0iJHtzcmMuZGlyfS8ke3NyYy5maWxlfSAke2pmbGV4Lm9wdH0iLz4KLQkJCTxjbGFzc3BhdGg+Ci0JCQkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pmbGV4Lmphcn0iLz4KLQkJCTwvY2xhc3NwYXRoPgotCQk8L2phdmE+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJjb3B5IiBkZXBlbmRzPSJpbml0Ij4KLQkJPGNvcHkgdG9kaXI9IiR7d29ya3NwYWNlLmRpcn0vJHtkZXN0LmRpcn0iIG92ZXJ3cml0ZT0idHJ1ZSIgdmVyYm9zZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iPgotCQkJCTxpbmNsdWRlIG5hbWU9IiouamF2YSIvPgotCQkJPC9maWxlc2V0PgotCQk8L2NvcHk+Ci0JCTxjb3B5IHRvZGlyPSIke3dvcmtzcGFjZS5kaXJ9LyR7ZmluYWxkZXN0LmRpcn0iIG92ZXJ3cml0ZT0idHJ1ZSIgdmVyYm9zZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iPgotCQkJCTxpbmNsdWRlIG5hbWU9IiouamF2YSIvPgotCQkJPC9maWxlc2V0PgotCQk8L2NvcHk+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxkZWxldGUgdmVyYm9zZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iIGRlZmF1bHRleGNsdWRlcz0ibm8iPgotCQkJCTxpbmNsdWRlIG5hbWU9Iip+Ii8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCTwvZGVsZXRlPgotCTwvdGFyZ2V0PgotCQotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvZGV2VGltZVN1cHBvcnRJbmZvLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L2RldlRpbWVTdXBwb3J0SW5mby50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Yzc3NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvZGV2VGltZVN1cHBvcnRJbmZvLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQotCi1UaGlzIGRpcmVjdG9yeSwgRGV2VGltZVN1cHBvcnQsIG5vcm1hbGx5IGNvbnRhaW5zCi10aGUgc291cmNlIGZvciBzb21lIG9mIG91ciBwYXJzZXIgZ2VuZXJhdG9ycy4gCi0KLVNlZSA6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3Qvd2VidG9vbHMvc291cmNlZWRpdGluZy9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydAotCi1UaGlzIHBhcnRpY3VsYXIgdGV4dCBmaWxlIHlvdSBhcmUgcmVhZGluZyAKLWlzIHRoZSBvbmx5IG9uZSBzaGlwcGVkIAotd2l0aCBhbiBTREsgYnVpbGQsIHNpbmNlIHRoZSBvdGhlciBmaWxlcyAKLWFyZSBzZWxkb20gbmVlZGVkIGR1cmluZyBkZXZlbG9wbWVudCBvciBkZWJ1Z2dpbmcsIAotYW5kIHNvbWUgb2YgdGhvc2UgZmlsZXMgY2F1c2UgcHJvYmxlbXMgd2l0aCBsb25nIAotZmlsZW5hbWUgb3IgcGF0aHMgdGhhdCBlbmQgdXAgYmVpbmcgdG9vIGxvbmcgZm9yIAotc29tZSBwbGF0Zm9ybXMsIGFuZCBzb21lIHVuemlwIHByb2dyYW1zLiAKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3YmNmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS42MDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5maWxlYnVmZmVyczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50czt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9uczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwubW9kZWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kbzt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIKLUltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS51dGlsOyB2ZXJzaW9uPSIzLjgiLAotIGNvbS5pYm0uaWN1LnRleHQ7IHZlcnNpb249IjMuOCIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuY29yZS5qb2JzO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnM7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAxLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMTAwLDIuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuNC4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzO2J1bmRsZS12ZXJzaW9uPSIzLjIuMCIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5O2V4Y2x1ZGU6PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvcGVydHl0ZXN0ZXIiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL1JFQURNRS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWIzY2NmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVRoZSBjb3JlIG1vZGVsIG9mIHRoZSBzc2UgZnJhbWV3b3JrLiBJdCBwcm92aWRlcyB0aGUgYmFzZSBkb2N1bWVudCBjbGFzc2VzLAotYnVpbGRlcnMgYW5kIHBhcnNlcnMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTQxYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy1lbmNvZGluZy8sXAotICAgICAgICAgICBzcmMvLFwKLSAgICAgICAgICAgc3JjLXRhc2t0YWdzLyxcCi0gICAgICAgICAgIHNyYy1jb250ZW50cHJvcGVydGllcy8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgY29uZmlnLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBkb2MvLFwKLSAgICAgICAgICAgICAgIGNvbXBvbmVudC54bWwsXAotICAgICAgICAgICAgICAgRGV2VGltZVN1cHBvcnQvCi1vdXRwdXQuLiA9IGJpbi8KLXNyYy5leGNsdWRlcyA9IERldlRpbWVTdXBwb3J0L2J1aWxkLnhtbCxcCi0gICAgICAgICAgICAgICBEZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC8sXAotICAgICAgICAgICAgICAgRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9jb21wb25lbnQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlMjIzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZSI+Ci0JPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3dlYnRvb2xzL3dzdC9jb21wb25lbnRzL3NzZS9vdmVydmlldy5odG1sIj48L2Rlc2NyaXB0aW9uPgotCTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlciIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCQk8dHlwZSBuYW1lPSJJUHJvcGVydHlTb3VyY2VFeHRlbnNpb24iIGltcGxlbWVudD0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IlN0cnVjdHVyZWRUZXh0RWRpdG9yIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCQk8dHlwZSBuYW1lPSJTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AiIGZyYWdtZW50PSJmYWxzZSIgLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbmZpZy9jaGFyc2V0LnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9jb25maWcvY2hhcnNldC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODE1ZTVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbmZpZy9jaGFyc2V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hIHRoZSBudW1iZXIgb2YgY29kZXNldCBuYW1lcwotdG90YWxudW1iZXI9MjYKLQotISBPbmx5IHRyYW5zbGF0ZSB0aGUgeHgubGFiZWwgc3RyaW5ncy4gIERvIG5vdCB0cmFuc2xhdGUgdGhlIHh4LmlhbmEgb3IgeHguamF2YSBzdHJpbmdzLgotCi1jb2Rlc2V0LjAubGFiZWw9SVNPIDEwNjQ2L1VuaWNvZGUoVVRGLTgpCi1jb2Rlc2V0LjAuaWFuYT1VVEYtOAotCi1jb2Rlc2V0LjEubGFiZWw9SVNPIDEwNjQ2L1VuaWNvZGUoVVRGLTE2KSBCaWcgRW5kaWFuCi1jb2Rlc2V0LjEuaWFuYT1VVEYtMTYKLQotY29kZXNldC4yLmxhYmVsPUlTTyAxMDY0Ni9Vbmljb2RlKFVURi0xNkJFKSBCaWcgRW5kaWFuCi1jb2Rlc2V0LjIuaWFuYT1VVEYtMTZCRQotCi1jb2Rlc2V0LjMubGFiZWw9SVNPIDEwNjQ2L1VuaWNvZGUoVVRGLTE2TEUpIExpdHRsZSBFbmRpYW4KLWNvZGVzZXQuMy5pYW5hPVVURi0xNkxFCi0KLWNvZGVzZXQuNC5sYWJlbD1VUyBBU0NJSQotY29kZXNldC40LmlhbmE9VVMtQVNDSUkKLQotY29kZXNldC41LmxhYmVsPUlTTyBMYXRpbi0xCi1jb2Rlc2V0LjUuaWFuYT1JU08tODg1OS0xCi0KLWNvZGVzZXQuNi5sYWJlbD1JU08gTGF0aW4tOQotY29kZXNldC42LmlhbmE9SVNPLTg4NTktMTUKLQotISAoU2xhdmljOiBDemVjaCwgQ3JvYXQsIEdlcm1hbiwgSHVuZ2FyaWFuLCBQb2xpc2gsIFJvbWFuaWFuLCBTbG92YWssIFNsb3ZlbmlhbikKLWNvZGVzZXQuNy5sYWJlbD1DZW50cmFsL0Vhc3QgRXVyb3BlYW4gKFNsYXZpYykgCi1jb2Rlc2V0LjcuaWFuYT1JU08tODg1OS0yCi0KLSEgKEVzcGVyYW50bywgR2FsaWNpYW4sIE1hbHRlc2UsIFR1cmtpc2gpCi1jb2Rlc2V0LjgubGFiZWw9U291dGhlcm4gRXVyb3BlYW4KLWNvZGVzZXQuOC5pYW5hPUlTTy04ODU5LTMKLQotY29kZXNldC45LmxhYmVsPUFyYWJpYywgTG9naWNhbAotY29kZXNldC45LmlhbmE9SVNPLTg4NTktNgotCi1jb2Rlc2V0LjEwLmxhYmVsPUFyYWJpYwotY29kZXNldC4xMC5pYW5hPXdpbmRvd3MtMTI1NgotCi1jb2Rlc2V0LjExLmxhYmVsPUNoaW5lc2UsIE5hdGlvbmFsIFN0YW5kYXJkCi1jb2Rlc2V0LjExLmlhbmE9R0IxODAzMAotCi1jb2Rlc2V0LjEyLmxhYmVsPVRyYWRpdGlvbmFsIENoaW5lc2UsIEJpZzUKLWNvZGVzZXQuMTIuaWFuYT1CSUc1Ci0KLSEgKEVzdG9uaWFuLCBMYXR2aWFuLCBMaXRodWFuaWFuKQotY29kZXNldC4xMy5sYWJlbD1DeXJpbGxpYywgSVNPLTg4NTktNAotY29kZXNldC4xMy5pYW5hPUlTTy04ODU5LTQKLQotISAoQnVsZ2FyaWFuLCBCeWVsb3J1c3NpYW4sIE1hY2Vkb25pYW4sIFNlcmJpYW4sIFVrcmFpbmlhbikKLWNvZGVzZXQuMTQubGFiZWw9Q3lyaWxsaWMsIElTTy04ODU5LTUKLWNvZGVzZXQuMTQuaWFuYT1JU08tODg1OS01Ci0KLWNvZGVzZXQuMTUubGFiZWw9R3JlZWsKLWNvZGVzZXQuMTUuaWFuYT1JU08tODg1OS03Ci0KLWNvZGVzZXQuMTYubGFiZWw9SGVicmV3LCBWaXN1YWwKLWNvZGVzZXQuMTYuaWFuYT1JU08tODg1OS04Ci0KLSEgbGFiZWw9SGVicmV3LCBMb2dpY2FsCi0hIGlhbmE9SVNPLTg4NTktOC1JCi0KLWNvZGVzZXQuMTcubGFiZWw9SGVicmV3Ci1jb2Rlc2V0LjE3LmlhbmE9d2luZG93cy0xMjU1Ci0KLWNvZGVzZXQuMTgubGFiZWw9SmFwYW5lc2UsIEVVQy1KUAotY29kZXNldC4xOC5pYW5hPUVVQy1KUAotCi1jb2Rlc2V0LjE5LmxhYmVsPUphcGFuZXNlLCBJU08gMjAyMgotY29kZXNldC4xOS5pYW5hPUlTTy0yMDIyLUpQCi0KLWNvZGVzZXQuMjAubGFiZWw9SmFwYW5lc2UsIFNoaWZ0LUpJUwotY29kZXNldC4yMC5pYW5hPVNoaWZ0X0pJUwotCi1jb2Rlc2V0LjIxLmxhYmVsPUphcGFuZXNlLCBXaW5kb3dzLTMxSgotY29kZXNldC4yMS5pYW5hPXdpbmRvd3MtMzFqCi0KLWNvZGVzZXQuMjIubGFiZWw9S29yZWFuLCBFVUMtS1IKLWNvZGVzZXQuMjIuaWFuYT1FVUMtS1IKLQotY29kZXNldC4yMy5sYWJlbD1Lb3JlYW4sIElTTyAyMDIyCi1jb2Rlc2V0LjIzLmlhbmE9SVNPLTIwMjItS1IKLQotY29kZXNldC4yNC5sYWJlbD1UaGFpLCBUSVNJCi1jb2Rlc2V0LjI0LmlhbmE9VElTLTYyMAotCi1jb2Rlc2V0LjI1LmxhYmVsPVR1cmtpc2gKLWNvZGVzZXQuMjUuaWFuYT1JU08tODg1OS05CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9jb25maWcvZGVmYXVsdElBTkEucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbmZpZy9kZWZhdWx0SUFOQS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDdlZDZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbmZpZy9kZWZhdWx0SUFOQS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUaGlzIGZpbGUgbGlzdHMgY2hhcnNldCBtYXBwaW5ncyBiZXR3ZWVuIGFuIGVuY29kaW5nIGFuZCBpdHMgZGVmYXVsdAotIyBlcXVpdmFsZW50IGVuY29kaW5nIGxpc3RlZCBpbiBjaGFyc2V0LnByb3BlcnRpZXMKLSMgZm9ybWF0OiBhbnluYW1lPWlhbmEgbmFtZSBsaXN0ZWQgaW4gY2hhcnNldC5wcm9wZXJ0aWVzCi0KLSMgTm8gdHJhbnNsYXRpb24gbmVjZXNzYXJ5Ci13aW5kb3dzLTEyNTI9SVNPLTg4NTktMQotd2luZG93cy05MzI9U2hpZnRfSklTCi14LWV1Yy1qcC1saW51eD1FVUMtSlAgCi13aW5kb3dzLTk0OT1FVUMtS1IKLXgtd2luZG93cy05NDk9RVVDLUtSCi13aW5kb3dzLTk1MD1CSUc1Ci14LXdpbmRvd3MtOTUwPUJJRzUKLXdpbmRvd3MtOTM2PUdCMTgwMzAKLXgtbXN3aW4tOTM2PUdCMTgwMzAKLUdCMjMxMj1HQjE4MDMwCi14LUVVQy1DTj1HQjE4MDMwCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9jb25maWcvb3ZlcnJpZGUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbmZpZy9vdmVycmlkZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTcwM2JhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbmZpZy9vdmVycmlkZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVGhpcyBmaWxlIGxpc3RzIGNoYXJzZXQgbWFwcGluZ3Mgd2hpY2ggc3VwcGxlbWVudCBvciBvdmVycmlkZSB0aG9zZQotIyBwcm92aWRlZCBieSB0aGUgVk0uIFRoZXJlIGFyZSBmZXcgY2FzZXMgd2hlcmUgdGhpcyBzaG91bGQgYmUgcmVxdWlyZWQuCi0jIE5vdGU6IHRoZXJlIGlzIG5vIGludGVncmV0eSBjaGVja2luZyB0byBzZWUgaWYgdGhlIHZhbGlkQ2hhcnNldE5hbWUgaXMgaW5kZWVkCi0jIHZhbGlkIGZvciBhIGdpdmVuIFZNLCBzbyBlcnJvcnMgd291bGQgb25seSBzaG93IHVwIHdoZW4gYXR0ZW1wdGVkIHRvIAotIyBiZSB1c2VkLgotCi0jIE5vIHRyYW5zbGF0aW9uIG5lY2Vzc2FyeQotCi0jIGZvcm1hdDogYW55bmFtZT12YWxpZGphdmFDaGFyc2V0TmFtZQotSVNPLTg4NTktOC1JPUlTTy04ODU5LTgKLVgtU0pJUz1TaGlmdF9KSVMKLVgtRVVDLUpQPVNoaWZ0X0pJUwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL2Jvb2suY3NzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL2Jvb2suY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mjc4Y2Q4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2RvYy9ib29rLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi1QLkNvZGUgew0KLQlkaXNwbGF5OiBibG9jazsNCi0JdGV4dC1hbGlnbjogbGVmdDsNCi0JdGV4dC1pbmRlbnQ6IDAuMDBwdDsNCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMTVwdDsNCi0JZm9udC1zaXplOiAxMC4wMDAwMDBwdDsNCi0JZm9udC13ZWlnaHQ6IG1lZGl1bTsNCi0JZm9udC1zdHlsZTogUmVndWxhcjsNCi0JY29sb3I6ICM0NDQ0Q0M7DQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOw0KLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsNCi0JZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyI7DQotfQ0KLUg2LkNhcHRpb25GaWdDb2x1bW4gew0KLQlkaXNwbGF5OiBibG9jazsNCi0JdGV4dC1hbGlnbjogbGVmdDsNCi0JdGV4dC1pbmRlbnQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi10b3A6IDMuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDExLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAwLjAwMDAwMHB0Ow0KLQlmb250LXNpemU6IDkuMDAwMDAwcHQ7DQotCWZvbnQtd2VpZ2h0OiBtZWRpdW07DQotCWZvbnQtc3R5bGU6IEl0YWxpYzsNCi0JY29sb3I6ICMwMDAwMDA7DQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOw0KLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsNCi0JZm9udC1mYW1pbHk6ICJBcmlhbCI7DQotfQ0KLVAuTm90ZSB7DQotCWRpc3BsYXk6IGJsb2NrOw0KLQl0ZXh0LWFsaWduOiBsZWZ0Ow0KLQl0ZXh0LWluZGVudDogMHB0Ow0KLQltYXJnaW4tdG9wOiAxOS41MDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMTkuNTAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDMwcHQ7DQotCWZvbnQtc2l6ZTogMTEuMDAwMDAwcHQ7DQotCWZvbnQtd2VpZ2h0OiBtZWRpdW07DQotCWZvbnQtc3R5bGU6IEl0YWxpYzsNCi0JY29sb3I6ICMwMDAwMDA7DQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOw0KLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsNCi0JZm9udC1mYW1pbHk6ICJBcmlhbCI7DQotfQ0KLUVNLlVJTGFiZWwgew0KLQlmb250LXdlaWdodDogQm9sZDsNCi0JZm9udC1zdHlsZTogUmVndWxhcjsNCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7DQotCXRleHQtdHJhbnNmb3JtOiBub25lOw0KLX0NCi1FTS5Db2RlTmFtZSB7DQotCWZvbnQtd2VpZ2h0OiBCb2xkOw0KLQlmb250LXN0eWxlOiBSZWd1bGFyOw0KLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsNCi0JdGV4dC10cmFuc2Zvcm06IG5vbmU7DQotCWZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7DQotfQ0KLQ0KLQ0KLQ0KLQ0KLS8qIGZvbGxvd2luZyBmb250IGZhY2UgZGVjbGFyYXRpb25zIG5lZWQgdG8gYmUgcmVtb3ZlZCBmb3IgREJDUyAqLw0KLQ0KLWJvZHksIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIHAsIHRhYmxlLCB0ZCwgY2FwdGlvbiwgdGgsIHVsLCBvbCwgZGwsIGxpLCBkZCwgZHQge2ZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBjb2xvcjogIzAwMDAwMH0NCi1wcmUJCQkJeyBmb250LWZhbWlseTogQ291cmllciwgbW9ub3NwYWNlfQ0KLQ0KLS8qIGVuZCBmb250IGZhY2UgZGVjbGFyYXRpb25zICovDQotDQotLyogZm9sbG93aW5nIGZvbnQgc2l6ZSBkZWNsYXJhdGlvbnMgc2hvdWxkIGJlIE9LIGZvciBEQkNTICovDQotYm9keSwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgcCwgdGFibGUsIHRkLCBjYXB0aW9uLCB0aCwgdWwsIG9sLCBkbCwgbGksIGRkLCBkdCB7Zm9udC1zaXplOiAxMHB0OyB9DQotcHJlCQkJCXsgZm9udC1zaXplOiAxMHB0fQ0KLQ0KLS8qIGVuZCBmb250IHNpemUgZGVjbGFyYXRpb25zICovDQotDQotYm9keQkgICAgIHsgYmFja2dyb3VuZDogI0ZGRkZGRn0NCi1oMSAgICAgICAgICAgeyBmb250LXNpemU6IDE4cHQ7IG1hcmdpbi10b3A6IDU7IG1hcmdpbi1ib3R0b206IDEgfQkNCi1oMiAgICAgICAgICAgeyBmb250LXNpemU6IDE0cHQ7IG1hcmdpbi10b3A6IDI1OyBtYXJnaW4tYm90dG9tOiAzIH0NCi1oMyAgICAgICAgICAgeyBmb250LXNpemU6IDExcHQ7IG1hcmdpbi10b3A6IDIwOyBtYXJnaW4tYm90dG9tOiAzIH0NCi1oNCAgICAgICAgICAgeyBmb250LXNpemU6IDEwcHQ7IG1hcmdpbi10b3A6IDIwOyBtYXJnaW4tYm90dG9tOiAzOyBmb250LXN0eWxlOiBpdGFsaWMgfQ0KLXAgICAgICAgICAgICB7IG1hcmdpbi10b3A6IDEwcHg7IG1hcmdpbi1ib3R0b206IDEwcHggfQ0KLXByZQkgICAgIHsgbWFyZ2luLWxlZnQ6IDY7IGZvbnQtc2l6ZTogOXB0IH0NCi1hOmxpbmsJICAgICB7IGNvbG9yOiAjMDAwMEZGIH0NCi1hOmhvdmVyCSAgICAgeyBjb2xvcjogIzAwMDA4MCB9DQotYTp2aXNpdGVkICAgIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgfQ0KLXVsCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAxMCB9DQotbGkJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDAgfSANCi1saSBwCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAwIH0gDQotb2wJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDEwIH0NCi1kbAkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMTAgfQ0KLWR0CSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAwOyBmb250LXdlaWdodDogYm9sZCB9DQotZGQJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDAgfQ0KLXN0cm9uZwkgICAgIHsgZm9udC13ZWlnaHQ6IGJvbGR9DQotZW0JICAgICB7IGZvbnQtc3R5bGU6IGl0YWxpY30NCi12YXIJICAgICB7IGZvbnQtc3R5bGU6IGl0YWxpY30NCi1kaXYucmV2aXNpb24geyBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7IGJvcmRlci1sZWZ0LXdpZHRoOiB0aGluOyANCi0JCQkJICAgYm9yZGVyLWxlZnQtY29sb3I6ICM3QjY4RUU7IHBhZGRpbmctbGVmdDo1IH0NCi10aAkgICAgIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2RvYy9zY2hlbWEuY3NzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL3NjaGVtYS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZmJmMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL3NjaGVtYS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi1INi5DYXB0aW9uRmlnQ29sdW1uI2hlYWRlciB7DQotCWZvbnQtc2l6ZToxNnB4OyANCi0JZGlzcGxheTppbmxpbmUNCi19DQotDQotUC5Ob3RlI2NvcHlyaWdodCB7DQotCWZvbnQtc2l6ZTogc21hbGxlcjsgDQotCWZvbnQtc3R5bGU6IG5vcm1hbDsNCi0JY29sb3I6ICMzMzY2OTk7IA0KLQlkaXNwbGF5OmlubGluZTsNCi0JbWFyZ2luLXRvcDogMy4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMTEuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDAuMDAwMDAwcHQ7DQotfQ0KLQ0KLVAuQ29kZSNkdGQgew0KLQljb2xvcjogIzgwMDAwMDsgDQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDEwLjAwMDAwMHB0Ow0KLX0NCi0NCi1QLkNvZGUjZHRkQXR0bGlzdCB7DQotCWNvbG9yOiAjODAwMDAwOyANCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMjAuMDAwMDAwcHQ7DQotfQ0KLQ0KLVAuQ29kZSN0YWcgew0KLQljb2xvcjogIzAwMDA4MDsgDQotCWRpc3BsYXk6aW5saW5lOw0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAwLjAwMDAwMHB0Ow0KLX0NCi0NCi1QLkNvZGUjY3N0cmluZyB7DQotCWNvbG9yOiAjMDA4MDAwOyANCi0JZGlzcGxheTppbmxpbmU7DQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDAuMDAwMDAwcHQ7CQ0KLX0NCi0NCi0uQ29uZmlnTWFya3VwI2VsZW1lbnREZXNjIHsNCi0JY29sb3I6IGJsYWNrOw0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAxMC4wMDAwMDBwdDsNCi19DQotDQotLkNvbmZpZ01hcmt1cCNhdHRsaXN0RGVzYyB7DQotCWNvbG9yOiBibGFjazsNCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMzIuMDAwMDAwcHQ7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2hhbmR5U3R1ZmYuanBhZ2UgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9oYW5keVN0dWZmLmpwYWdlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDQ3YjRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2hhbmR5U3R1ZmYuanBhZ2UKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTIzMjc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotcGx1Z2luTmFtZT1TdHJ1Y3R1cmVkIFNvdXJjZSBNb2RlbAotIyBleHRlbnNpb24gbmFtZXMKLUFkYXB0X09uX0NyZWF0ZV9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lPUFkYXB0IE9uIENyZWF0ZSBGYWN0b3J5IEV4dGVuc2lvbgotRG9jdW1lbnRfVHlwZXNfRXh0ZW5zaW9uLm5hbWU9RG9jdW1lbnQgVHlwZXMgRXh0ZW5zaW9uCi1KU1BfRW1iZWRkZWRfQ29udGVudF9UeXBlX0hhbmRsZXJfRXh0ZW5zaW9uLm5hbWU9SlNQIEVtYmVkZGVkIENvbnRlbnQgVHlwZSBIYW5kbGVyIEV4dGVuc2lvbgotQ29udGVudF9UeXBlX0ZhY3RvcnlfQ29udHJpYnV0aW9uX0V4dGVuc2lvbi5uYW1lPUNvbnRlbnQgVHlwZSBGYWN0b3J5IENvbnRyaWJ1dGlvbiBFeHRlbnNpb24KLUNTU19Qcm9maWxlX0V4dGVuc2lvbi5uYW1lPUNTUyBQcm9maWxlIEV4dGVuc2lvbgotQ29tbWVudF9FbGVtZW50X0hhbmRsZXJfRXh0ZW5zaW9uLm5hbWU9Q29tbWVudCBFbGVtZW50IEhhbmRsZXIgRXh0ZW5zaW9uCi1Nb2RlbF9IYW5kbGVyX0V4dGVuc2lvbi5uYW1lPU1vZGVsIEhhbmRsZXIgRXh0ZW5zaW9uCi1Gb3JtYXRfUHJvY2Vzc29yc19FeHRlbnNpb25fUG9pbnQubmFtZT1Gb3JtYXQgUHJvY2Vzc29ycyBFeHRlbnNpb24gUG9pbnQKLVRhc2tfU2Nhbm5lcl9FeHRlbnNpb25fUG9pbnQubmFtZT1UYXNrIFNjYW5uZXIgRXh0ZW5zaW9uIFBvaW50Ci1TdHJ1Y3R1cmVkX1NvdXJjZXNfVGFza19FeHRlbnNpb24ubmFtZT1EZXRlY3RlZCBUYXNrCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5ZDc2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQotCTwhLS0gZGVwcmVjYXRlZCAtLT4KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJhZGFwdE9uQ3JlYXRlRmFjdG9yeSIgbmFtZT0iJUFkYXB0X09uX0NyZWF0ZV9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9hZGFwdE9uQ3JlYXRlRmFjdG9yeS5leHNkIi8+Ci0JPCEtLSBub3QgZm9yIHVzZSBieSBjbGllbnRzIChpbnRlcm5hbCktLT4KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkb2N1bWVudFR5cGVzIiBuYW1lPSIlRG9jdW1lbnRfVHlwZXNfRXh0ZW5zaW9uLm5hbWUiIHNjaGVtYT0ic2NoZW1hL2RvY3VtZW50VHlwZXMuZXhzZCIvPgotCTwhLS0gbm90IGZvciB1c2UgYnkgY2xpZW50cyAoaW50ZXJuYWwpLS0+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0iZW1iZWRkZWRUeXBlSGFuZGxlciIgbmFtZT0iJUpTUF9FbWJlZGRlZF9Db250ZW50X1R5cGVfSGFuZGxlcl9FeHRlbnNpb24ubmFtZSIgc2NoZW1hPSJzY2hlbWEvZW1iZWRkZWRUeXBlSGFuZGxlci5leHNkIi8+Ci0JPCEtLSBkZXByZWNhdGVkIC0tPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9ImNvbnRlbnRUeXBlRmFjdG9yeUNvbnRyaWJ1dGlvbiIgbmFtZT0iJUNvbnRlbnRfVHlwZV9GYWN0b3J5X0NvbnRyaWJ1dGlvbl9FeHRlbnNpb24ubmFtZSIgc2NoZW1hPSJzY2hlbWEvY29udGVudFR5cGVGYWN0b3J5Q29udHJpYnV0aW9uLmV4c2QiLz4KLQk8IS0tIEkgY29tbWVudGVkIG91dCAuLi4gY2xpZW50cyBzaG91bGQganVzdCB1c2UgdGhlIG5vcm1hbCBwbGF0Zm9ybSB3YXkgb2YgcmVnaXN0ZXJpbmcgdGhlc2UgCi0JCWFkYXB0ZXJGYWN0b3JpZXMuIEF0IHdvcnN0LCB0aGV5J2QgbmVlZCBhIHNtYWxsIHBsdWdpbiB3aXRoICdzdGFydHVwJyBzcGVjaWZpZWQgLi4uIGJ1dCB0aGF0J3MgCi0JCWJldHRlciB0aGFuIHVzIGdldHRpbmcgaGl0IHdpdGggdGhlIHBlcmZvcm1hbmNlIGltcGFjdCAob2YgbG9hZGluZyBwbHVnaW5zIGFuZCBwcmUtcmVxcywgZXRjLikuIAotCQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ1cmlSZXNvbHZlckFkYXB0ZXJGYWN0b3J5IiBuYW1lPSJSZXNvdXJjZSBBZGFwdGVyIEZhY3RvcnkgZm9yIENyZWF0aW5nIFVSSVJlc29sdmVycyIvPgotCS0tPgotCTwhLS0gbm90IGZvciB1c2UgYnkgY2xpZW50cyAoaW50ZXJuYWwpLS0+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0iY3NzcHJvZmlsZSIgbmFtZT0iJUNTU19Qcm9maWxlX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9jc3Nwcm9maWxlLmV4c2QiLz4KLQk8IS0tIG5vdCBmb3IgdXNlIGJ5IGNsaWVudHMgKGludGVybmFsKS0tPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9ImNvbW1lbnRFbGVtZW50SGFuZGxlciIgbmFtZT0iJUNvbW1lbnRfRWxlbWVudF9IYW5kbGVyX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9jb21tZW50RWxlbWVudEhhbmRsZXIuZXhzZCIvPgotCi0JPCEtLSBub3QgZm9yIHVzZSBieSBjbGllbnRzIChpbnRlcm5hbCktLT4KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtb2RlbEhhbmRsZXIiIG5hbWU9IiVNb2RlbF9IYW5kbGVyX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9tb2RlbEhhbmRsZXIuZXhzZCIvPgotCTwhLS0gbm90IGZvciB1c2UgYnkgY2xpZW50cyAoaW50ZXJuYWwpLS0+Ci0JPGV4dGVuc2lvbi1wb2ludAotCQlpZD0iZm9ybWF0UHJvY2Vzc29ycyIKLQkJbmFtZT0iJUZvcm1hdF9Qcm9jZXNzb3JzX0V4dGVuc2lvbl9Qb2ludC5uYW1lIgotCQlzY2hlbWE9InNjaGVtYS9mb3JtYXRQcm9jZXNzb3JzLmV4c2QiIC8+Ci0KLQk8IS0tIG5vdCBmb3IgdXNlIGJ5IGNsaWVudHMgKGludGVybmFsKS0tPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9InRhc2tzY2FubmVyIiBuYW1lPSIlVGFza19TY2FubmVyX0V4dGVuc2lvbl9Qb2ludC5uYW1lIiBzY2hlbWE9InNjaGVtYS90YXNrc2Nhbm5lci5leHNkIi8+Ci0KLQk8IS0tIE1ha2Ugc3VyZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzIGFyZSBzZXQgYXQgcnVudGltZSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yR3JvdXAiPgotCQk8Z3JvdXAgaWQ9InN0cnVjdHVyZWRNb2RlbEdyb3VwIj4KLQkJCTxsaXN0ZW5lciBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRvckdyb3VwTGlzdGVuZXIiLz4KLQkJPC9ncm91cD4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIERlZmluZSB0aGUgU3RydWN0dXJlZEZpbGVQcm9wZXJ0eVRlc3RlciBhcyBpdCB3aWxsIGhhbmRsZSB0cmFjaW5nIHRoZSBlbnRpcmUgLS0+Ci0JPCEtLSBjb250ZW50IHR5cGUgaGllcmFyY2h5IGZvciBhIGZpbGUuIE9ubHkgb3BlcmF0ZXMgb24gSUZpbGVzICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gRGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODgyMTYgICAgICAgICAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVycyI+Ci0JCTxwcm9wZXJ0eVRlc3RlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm9wZXJ0eXRlc3Rlci5TdHJ1Y3R1cmVkRmlsZVByb3BlcnR5VGVzdGVyIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3Rlci5TdHJ1Y3R1cmVkRmlsZVByb3BlcnR5VGVzdGVyIgotCQkJbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucmVzb3VyY2VzIgotCQkJcHJvcGVydGllcz0iY29udGVudFR5cGVJZCIKLQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICA8L3Byb3BlcnR5VGVzdGVyPgotIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvYWRhcHRPbkNyZWF0ZUZhY3RvcnkuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9hZGFwdE9uQ3JlYXRlRmFjdG9yeS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGJmODk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9hZGFwdE9uQ3JlYXRlRmFjdG9yeS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIGlkPSJhZGFwdE9uQ3JlYXRlRmFjdG9yeSIgbmFtZT0iQWRhcHQgT24gQ3JlYXRlIEZhY3RvcnkgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9jb21tZW50RWxlbWVudEhhbmRsZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9jb21tZW50RWxlbWVudEhhbmRsZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzYzgwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvY29tbWVudEVsZW1lbnRIYW5kbGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgaWQ9ImNvbW1lbnRFbGVtZW50SGFuZGxlciIgbmFtZT0iQ29tbWVudCBFbGVtZW50IEhhbmRsZXIgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KLSAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaGFuZGxlci1jdXN0b20iLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iaGFuZGxlci1jdXN0b20iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzdGFydHdpdGgiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1lbnR0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic3RhcnR3aXRoIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2NvbnRlbnRUeXBlRmFjdG9yeUNvbnRyaWJ1dGlvbi5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2NvbnRlbnRUeXBlRmFjdG9yeUNvbnRyaWJ1dGlvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjg0MThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9jb250ZW50VHlwZUZhY3RvcnlDb250cmlidXRpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiBpZD0iY29udGVudFR5cGVGYWN0b3J5Q29udHJpYnV0aW9uIiBuYW1lPSJDb250ZW50IFR5cGUgRmFjdG9yeSBDb250cmlidXRpb24gRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OyAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvY3NzcHJvZmlsZS5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2Nzc3Byb2ZpbGUuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzZTg1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvY3NzcHJvZmlsZS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiBpZD0iY3NzcHJvZmlsZSIgbmFtZT0iQ1NTIFByb2ZpbGUgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9maWxlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb2ZpbGUiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJpIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvZG9jdW1lbnRUeXBlcy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2RvY3VtZW50VHlwZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkwZjM1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvZG9jdW1lbnRUeXBlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiBpZD0iZG9jdW1lbnRUeXBlcyIgbmFtZT0iRG9jdW1lbnQgVHlwZXMgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkb2N1bWVudFR5cGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZG9jdW1lbnRUeXBlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZWxlbWVudE5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlzcGxheU5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2VVUkkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaXNYSFRNTCIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGFzRnJhbWVzZXQiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InB1YmxpY0lEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN5c3RlbUlEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHRYSFRNTCIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaXNXTUwiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHRXTUwiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvZW1iZWRkZWRUeXBlSGFuZGxlci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2VtYmVkZGVkVHlwZUhhbmRsZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJjZGU4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvZW1iZWRkZWRUeXBlSGFuZGxlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiBpZD0iZW1iZWRkZWRUeXBlSGFuZGxlciIgbmFtZT0iSlNQIEVtYmVkZGVkIENvbnRlbnQgVHlwZSBIYW5kbGVyIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZW1iZWRkZWRUeXBlSGFuZGxlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJlbWJlZGRlZFR5cGVIYW5kbGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9mb3JtYXRQcm9jZXNzb3JzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvZm9ybWF0UHJvY2Vzc29ycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWQ3MzA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9mb3JtYXRQcm9jZXNzb3JzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgaWQ9ImZvcm1hdFByb2Nlc3NvcnMiIG5hbWU9IkZvcm1hdCBQcm9jZXNzb3JzIEV4dGVuc2lvbiBQb2ludCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuJmx0Oy9iJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvY2Vzc29yIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InByb2Nlc3NvciI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRlbnRUeXBlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXRQcm9jZXNzb3JzJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtwcm9jZXNzb3INCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUueG1sLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUwmcXVvdDsNCi0gICAgICAgICAgICBjb250ZW50VHlwZUlkPSZxdW90O29yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwmcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9wcm9jZXNzb3ImZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9tb2RlbEhhbmRsZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9tb2RlbEhhbmRsZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzMWRmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvbW9kZWxIYW5kbGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgaWQ9Im1vZGVsSGFuZGxlciIgbmFtZT0iTW9kZWwgSGFuZGxlciBFeHRlbnNpb24gUG9pbnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtb2RlbEhhbmRsZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibW9kZWxIYW5kbGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJpZGVudGlmaWVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjoiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhc3NvY2lhdGVkQ29udGVudFR5cGVJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL3Rhc2tzY2FubmVyLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvdGFza3NjYW5uZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4MGE4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvdGFza3NjYW5uZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiBpZD0idGFza3NjYW5uZXIiIG5hbWU9IlRhc2sgU2Nhbm5lciBFeHRlbnNpb24gUG9pbnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBpbnRlcm5hbD0idHJ1ZSIgLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2Nhbm5lciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzY2FubmVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGVudFR5cGVJZHMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQ29udGVudCB0eXBlIGlkZW50aWZpZXJzIGZvciB3aGljaCB0aGlzIHNjYW5uZXIgYXBwbGllcywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBTY2FubmVyIGltcGxlbWVudGF0aW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50YXNrcy5JRmlsZVRhc2tTY2FubmVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9BYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0Fic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjBlM2EwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0Fic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIHNvIG5vIG9uZSBjYXJlcyBhbnl3YXlzLgotICovCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIgaW1wbGVtZW50cyBJQ29udGVudFNldHRpbmdzSGFuZGxlciB7Ci0KLQotCXByaXZhdGUgSUNvbnRlbnRTZXR0aW5ncyBjb250ZW50U2V0dGluZ3MgPSBDb250ZW50U2V0dGluZ3NDcmVhdG9yLmNyZWF0ZSgpOwotCXByaXZhdGUgSVJlc291cmNlRGVsdGEgZkRlbHRhOwotCi0JcHJpdmF0ZSB2b2lkIGNvbW1vbldpdGhSZXNwZWN0VG9LaW5kKCkgewotCQlnZXRDb250ZW50U2V0dGluZ3MoKS5yZWxlYXNlQ2FjaGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSUNvbnRlbnRTZXR0aW5ncyBnZXRDb250ZW50U2V0dGluZ3MoKSB7Ci0JCXJldHVybiBjb250ZW50U2V0dGluZ3M7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIElSZXNvdXJjZURlbHRhIGdldERlbHRhKCkgewotCQlyZXR1cm4gZkRlbHRhOwotCX0KLQotCi0JLyoKLQkgKiBAc2VlIElDb250ZW50U2V0dGluZ3NIYW5kbGVyI2hhbmRsZShJUmVzb3VyY2VEZWx0YSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGUoZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJdGhpcy5mRGVsdGEgPSBkZWx0YTsKLQkJLy8gZ2V0IFJlc291cmNlIGRlbHRhIGtpbmQKLQkJZmluYWwgaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCS8vIG5ldmVyIHVzZWQhPwotCQkvL0lSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0KLQotCQlzd2l0Y2ggKGtpbmQpIHsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6IHsKLQkJCQloYW5kbGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOiB7Ci0JCQkJaGFuZGxlUmVtb3ZlZCgpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6IHsKLQkJCQloYW5kbGVBZGRlZCgpOwotCQkJfQotCQkJCWJyZWFrOwotCi0KLQkJfQotCi0KLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZGVkKCkgewotCQljb21tb25XaXRoUmVzcGVjdFRvS2luZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZWQoKSB7Ci0JCWNvbW1vbldpdGhSZXNwZWN0VG9LaW5kKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVtb3ZlZCgpIHsKLQkJY29tbW9uV2l0aFJlc3BlY3RUb0tpbmQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0Fic3RyYWN0U3ViamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQWJzdHJhY3RTdWJqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYzk4YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQWJzdHJhY3RTdWJqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBTZWUKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5IVE1MQ29udGVudFByb3BlcnRpZXMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3ViamVjdCBpbXBsZW1lbnRzIElOb3RpZnksIElTdWJqZWN0IHsKLQotCi0KLQlwcml2YXRlIHN0YXRpYyBNYXAgbGlzdGVuZXJMaXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZExpc3RlbmVyKElDb250ZW50U2V0dGluZ3NMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lckxpc3QucHV0KGxpc3RlbmVyLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElDb250ZW50U2V0dGluZ3NFdmVudFN1YmplY3Qjbm90aWZ5Q29udGVudFNldHRpbmdzTGlzdGVuZXJzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSBjaGFuZ2VkUmVzb3VyY2UpIHsKLQotCQlTZXQga2V5cyA9IGxpc3RlbmVyTGlzdC5rZXlTZXQoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGtleXMuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlDb250ZW50U2V0dGluZ3NMaXN0ZW5lciBjc2wgPSAoSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCWNzbC5jb250ZW50U2V0dGluZ3NDaGFuZ2VkKGNoYW5nZWRSZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5ncy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkY2EzODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIERhdmlkIENhcnZlciAoSW50YWxpbykgLSBidWcgMzAwNDQzIC0gc29tZSBjb25zdGFudHMgYXJlbid0IHN0YXRpYyBmaW5hbAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFNlZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllcwotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFNldHRpbmdzIGltcGxlbWVudHMgSUNvbnRlbnRTZXR0aW5ncyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGNvbnRlbnRTZXR0aW5nc05hbWUgPSAiLmNvbnRlbnRzZXR0aW5ncyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgU2ltcGxlTm9kZU9wZXJhdG9yIGRvbU9wZXJhdG9yOwotCi0JcHJpdmF0ZSBzdGF0aWMgSVByb2plY3QgcHJlUHJvamVjdDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElDb250ZW50U2V0dGluZ3Mgc2luZ2xldG9uID0gbmV3IENvbnRlbnRTZXR0aW5ncygpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0Q29udGVudFNldHRpbmdzTmFtZSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRTZXR0aW5nc05hbWU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSUNvbnRlbnRTZXR0aW5ncyBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjb250ZW50U2V0dGluZ3NQYXRoOwotCXByaXZhdGUgSVByb2plY3QgY3VyclByb2plY3Q7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZpbGVFbGVtZW50TmFtZSA9ICJmaWxlIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhBVFRSID0gInBhdGgiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHByb2plY3RFbGVtZW50TmFtZSA9ICJwcm9qZWN0IjsvLyROT04tTkxTLTEkCi0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHJvb3RFbGVtZW50TmFtZSA9ICJjb250ZW50c2V0dGluZ3MiOy8vJE5PTi1OTFMtMSQKLQotCi0KLQlwcml2YXRlIENvbnRlbnRTZXR0aW5ncygpIHsKLQkJY3VyclByb2plY3QgPSBudWxsOwotCQljb250ZW50U2V0dGluZ3NQYXRoID0gbnVsbDsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBfc2V0UHJvcGVydGllcyhmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8IHByb3BlcnRpZXMgPT0gbnVsbCB8fCBwcm9wZXJ0aWVzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJaWYgKCEocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUIHx8IHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkpCi0JCQlyZXR1cm47Ci0KLQkJY29udGVudFNldHRpbmdzUGF0aCA9IGdldENvbnRlbnRTZXR0aW5nc1BhdGgocmVzb3VyY2UpOwotCQlpZiAoY29udGVudFNldHRpbmdzUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0KLQkJCWlmICghZXhpc3RzQ29udGVudFNldHRpbmdzKCkpIHsKLQkJCQkvLyBjcmVhdGUgRE9NIHRyZWUgZm9yIG5ldyBYTUwgRG9jdW1lbnQKLQkJCQljcmVhdGVOZXdET01UcmVlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBjcmVhdGUgRE9NIHRyZWUgZnJvbSBleGlzdGluZyBjb250ZW50c2V0dGluZ3MuCi0JCQkJY3JlYXRlRE9NVHJlZSgpOwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5SZWFkQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJdHJ5IHsKLQkJCQljcmVhdGVOZXdET01UcmVlKCk7Ci0JCQkJd3JpdGVET01Eb2N1bWVudCgpOwotCQkJfQotCQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5DcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUyKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0JCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUyKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0JCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJCXJldHVybjsKLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRWxlbWVudCBlID0gbnVsbDsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aE5vZGVOYW1lKHByb2plY3RFbGVtZW50TmFtZSk7Ci0JCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJLy8gY3JlYXRlIHByb2plY3QgRWxlbWVudCBhbmQgYWRkIGl0IGludG8gdHJlZQotCQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuYWRkRWxlbWVudFVuZGVyUm9vdChwcm9qZWN0RWxlbWVudE5hbWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJLy8gY2hlY2sgZXhpc3RzIGZpbGUgRWxlbWVudAotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShnZXRQYXRoQXR0cigpLCBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChyZXNvdXJjZSkpOwotCQkJaWYgKGUgPT0gbnVsbCkgewotCQkJCS8vIGNyZWF0ZSBmaWxlIEVsZW1lbnQgYW5kIGFkZCBwYXRoIGludG8gaXQuCi0JCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5hZGRFbGVtZW50VW5kZXJSb290KGZpbGVFbGVtZW50TmFtZSk7Ci0JCQkJZG9tT3BlcmF0b3IuYWRkQXR0cmlidXRlQXQoZSwgZ2V0UGF0aEF0dHIoKSwgZ2V0UmVsYXRpdmVQYXRoRnJvbVByb2plY3QocmVzb3VyY2UpKTsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGV4aXN0cyBwcm9wZXJ0eU5hbWUgYXR0cmlidXRlCi0JCU1hcCBhdHRyTGlzdCA9IGRvbU9wZXJhdG9yLmdldEF0dHJpYnV0ZXNPZihlKTsKLQkJYm9vbGVhbiBoYXNBdHRyID0gdHJ1ZTsKLQkJaWYgKGF0dHJMaXN0ID09IG51bGwgfHwgYXR0ckxpc3QuaXNFbXB0eSgpKQotCQkJaGFzQXR0ciA9IGZhbHNlOwotCQlTZXQga2V5cyA9IHByb3BlcnRpZXMua2V5U2V0KCk7Ci0JCUl0ZXJhdG9yIGlpID0ga2V5cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaWkuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgaWkubmV4dCgpOwotCQkJU3RyaW5nIHByb3BlcnR5VmFsdWUgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChwcm9wZXJ0eU5hbWUpOwotCi0KLQkJCWlmICghaGFzQXR0ciB8fCAoU3RyaW5nKSBhdHRyTGlzdC5nZXQocHJvcGVydHlOYW1lKSA9PSBudWxsKQotCQkJCS8vIGNyZWF0ZSBwcm9wZXJ0eU5hbWUgYXR0cmlidXRlIGFuZCBhZGQKLQkJCQlkb21PcGVyYXRvci5hZGRBdHRyaWJ1dGVBdChlLCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQkJZWxzZQotCQkJCS8vIHNldCBhdHRyaWJ1dGUgdmFsdWUKLQkJCQlkb21PcGVyYXRvci51cGRhdGVBdHRyaWJ1dGVBdChlLCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQl9Ci0KLQkJLy8gd3JpdGUgZG9tIHRyZWUgaW50byAuY29udGVudHNldHRpbmdzCi0JCXRyeSB7Ci0JCQl3cml0ZURPTURvY3VtZW50KCk7Ci0JCX0KLQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCi0KLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBfc2V0UHJvcGVydHkoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCB8fCBwcm9wZXJ0eU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCEocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUIHx8IHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkpCi0JCQlyZXR1cm47Ci0KLQkJY29udGVudFNldHRpbmdzUGF0aCA9IGdldENvbnRlbnRTZXR0aW5nc1BhdGgocmVzb3VyY2UpOwotCQlpZiAoY29udGVudFNldHRpbmdzUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0KLQkJCWlmICghZXhpc3RzQ29udGVudFNldHRpbmdzKCkpIHsKLQkJCQkvLyBjcmVhdGUgRE9NIHRyZWUgZm9yIG5ldyBYTUwgRG9jdW1lbnQKLQkJCQljcmVhdGVOZXdET01UcmVlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBjcmVhdGUgRE9NIHRyZWUgZnJvbSBleGlzdGluZyBjb250ZW50c2V0dGluZ3MuCi0JCQkJY3JlYXRlRE9NVHJlZSgpOwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5SZWFkQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJdHJ5IHsKLQkJCQljcmVhdGVOZXdET01UcmVlKCk7Ci0JCQkJd3JpdGVET01Eb2N1bWVudCgpOwotCQkJfQotCQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5DcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUyKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0JCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUyKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0JCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJCXJldHVybjsKLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRWxlbWVudCBlID0gbnVsbDsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aE5vZGVOYW1lKHByb2plY3RFbGVtZW50TmFtZSk7Ci0JCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJLy8gY3JlYXRlIHByb2plY3QgRWxlbWVudCBhbmQgYWRkIGl0IGludG8gdHJlZQotCQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuYWRkRWxlbWVudFVuZGVyUm9vdChwcm9qZWN0RWxlbWVudE5hbWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJLy8gY2hlY2sgZXhpc3RzIGZpbGUgRWxlbWVudAotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShnZXRQYXRoQXR0cigpLCBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChyZXNvdXJjZSkpOwotCQkJaWYgKGUgPT0gbnVsbCkgewotCQkJCS8vIGNyZWF0ZSBmaWxlIEVsZW1lbnQgYW5kIGFkZCBwYXRoIGludG8gaXQuCi0JCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5hZGRFbGVtZW50VW5kZXJSb290KGZpbGVFbGVtZW50TmFtZSk7Ci0JCQkJZG9tT3BlcmF0b3IuYWRkQXR0cmlidXRlQXQoZSwgZ2V0UGF0aEF0dHIoKSwgZ2V0UmVsYXRpdmVQYXRoRnJvbVByb2plY3QocmVzb3VyY2UpKTsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGV4aXN0cyBwcm9wZXJ0eU5hbWUgYXR0cmlidXRlCi0KLQkJTWFwIGF0dHJMaXN0ID0gZG9tT3BlcmF0b3IuZ2V0QXR0cmlidXRlc09mKGUpOwotCQlpZiAoYXR0ckxpc3QgPT0gbnVsbCB8fCBhdHRyTGlzdC5pc0VtcHR5KCkgfHwgKFN0cmluZykgYXR0ckxpc3QuZ2V0KHByb3BlcnR5TmFtZSkgPT0gbnVsbCkKLQkJCS8vIGNyZWF0ZSBwcm9wZXJ0eU5hbWUgYXR0cmlidXRlIGFuZCBhZGQKLQkJCWRvbU9wZXJhdG9yLmFkZEF0dHJpYnV0ZUF0KGUsIHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCWVsc2UKLQkJCS8vIHNldCBhdHRyaWJ1dGUgdmFsdWUKLQkJCWRvbU9wZXJhdG9yLnVwZGF0ZUF0dHJpYnV0ZUF0KGUsIHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0KLQotCQkvLyB3cml0ZSBkb20gdHJlZSBpbnRvIC5jb250ZW50c2V0dGluZ3MKLQkJdHJ5IHsKLQkJCXdyaXRlRE9NRG9jdW1lbnQoKTsKLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0KLQotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURPTVRyZWUoKSB0aHJvd3MgU2ltcGxlTm9kZU9wZXJhdG9yLlJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIHsKLQkJaWYgKGRvbU9wZXJhdG9yID09IG51bGwgfHwgKGN1cnJQcm9qZWN0ICE9IG51bGwgJiYgKCFjdXJyUHJvamVjdC5lcXVhbHMocHJlUHJvamVjdCkpICYmIGNvbnRlbnRTZXR0aW5nc1BhdGggIT0gbnVsbCkpCi0JCQlkb21PcGVyYXRvciA9IG5ldyBTaW1wbGVOb2RlT3BlcmF0b3IoY29udGVudFNldHRpbmdzUGF0aCk7Ci0KLQotCX0KLQotCS8qCi0JICogcHJpdmF0ZSB2b2lkIGNyZWF0ZU5ld0RPTVRyZWUoKSB0aHJvd3MKLQkgKiBTaW1wbGVOb2RlT3BlcmF0b3IuQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbnsgLy8gY3JlYXRlIE5ldwotCSAqIGRvY3VtZW50IHdoZW4gbm8gZmlsZSBleGlzdHMuIERPTUltcGxlbWVudGF0aW9uIGltcGwgPQotCSAqIERPTUltcGxlbWVudGF0aW9uSW1wbC5nZXRET01JbXBsZW1lbnRhdGlvbigpOyBEb2N1bWVudCBkb2N1bWVudCA9Ci0JICogaW1wbC5jcmVhdGVEb2N1bWVudChudWxsLHJvb3RFbGVtZW50TmFtZSxudWxsKTsgZG9tT3BlcmF0b3IgPSBuZXcKLQkgKiBTaW1wbGVOb2RlT3BlcmF0b3IoZG9jdW1lbnQpOyB9Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU5ld0RPTVRyZWUoKSB0aHJvd3MgU2ltcGxlTm9kZU9wZXJhdG9yLkNyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gewotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudCA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImV4Y2VwdGlvbiBjcmVhdGluZyBkb2N1bWVudCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIGNyZWF0aW5nIGRvY3VtZW50IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChyb290RWxlbWVudE5hbWUpKTsKLQkJCWRvbU9wZXJhdG9yID0gbmV3IFNpbXBsZU5vZGVPcGVyYXRvcihkb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZWxldGVBbGxQcm9wZXJ0aWVzKGZpbmFsIElSZXNvdXJjZSBkZWxldGVkRmlsZSkgewotCQlpZiAoZGVsZXRlZEZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gaWYgKGRlbGV0ZWRGaWxlLmV4aXN0cygpKSByZXR1cm47Ci0JCWlmICgoZGVsZXRlZEZpbGUpLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSAmJiAoZGVsZXRlZEZpbGUpLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuUFJPSkVDVCkKLQkJCXJldHVybjsKLQotCi0JCWNvbnRlbnRTZXR0aW5nc1BhdGggPSBnZXRDb250ZW50U2V0dGluZ3NQYXRoKGRlbGV0ZWRGaWxlKTsvLyBnZXRQcm9qZWN0T2YoKElSZXNvdXJjZSlkZWxldGVkRmlsZSkKLQkJLy8gKwotCQkvLyBJUGF0aC5TRVBBUkFUT1IKLQkJLy8gKwotCQkvLyBjb250ZW50U2V0dGluZ3NOYW1lOwotCQlpZiAoY29udGVudFNldHRpbmdzUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoIWV4aXN0c0NvbnRlbnRTZXR0aW5ncygpKQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQljcmVhdGVET01UcmVlKCk7Ci0JCX0KLQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5SZWFkQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRWxlbWVudCBlID0gbnVsbDsKLQkJaWYgKGRlbGV0ZWRGaWxlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkKLQkJCS8vIHNlbGVjdCBwcm9qZWN0IGVsZW1lbnQgYW5kIGdldCBhdHRyaWJ1dGUKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhOb2RlTmFtZShwcm9qZWN0RWxlbWVudE5hbWUpOwotCQllbHNlIGlmIChkZWxldGVkRmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoQXR0cmlidXRlKGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KGRlbGV0ZWRGaWxlKSk7Ci0JCWlmIChlID09IG51bGwpIHsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCXJldHVybjsKLQkJfQotCi0KLQkJLy8gd2hlbiBkZWxldGVkRmlsZSBlbnRyeSBleGlzdHMuCi0JCWlmIChkZWxldGVkRmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpCi0JCQlkb21PcGVyYXRvci5yZW1vdmVFbGVtZW50V2l0aChwcm9qZWN0RWxlbWVudE5hbWUpOwotCQllbHNlIGlmIChkZWxldGVkRmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQlkb21PcGVyYXRvci5yZW1vdmVFbGVtZW50V2l0aChnZXRQYXRoQXR0cigpLCBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChkZWxldGVkRmlsZSkpOwotCi0KLQkJLy8gd3JpdGUgZG9tIHRyZWUgaW50byAuY29udGVudHNldHRpbmdzCi0JCXRyeSB7Ci0JCQl3cml0ZURPTURvY3VtZW50KCk7Ci0JCX0KLQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCi0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVsZXRlUHJvcGVydHkoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoIShyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QgfHwgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSkKLQkJCXJldHVybjsKLQkJY29udGVudFNldHRpbmdzUGF0aCA9IGdldENvbnRlbnRTZXR0aW5nc1BhdGgocmVzb3VyY2UpOwotCQlpZiAoY29udGVudFNldHRpbmdzUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghZXhpc3RzQ29udGVudFNldHRpbmdzKCkpIHsKLQkJCXJldHVybjsgLy8gd2hlbiAuY29udGVudHNldHRpbmdzLnhtbCBpcyBOT1QgZXhpc3QuCi0JCX0KLQkJdHJ5IHsKLQkJCWNyZWF0ZURPTVRyZWUoKTsKLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLlJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl0cnkgewotCQkJCWNyZWF0ZU5ld0RPTVRyZWUoKTsKLQkJCQl3cml0ZURPTURvY3VtZW50KCk7Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLkNyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJRWxlbWVudCBlID0gbnVsbDsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkKLQkJCS8vIHNlbGVjdCBwcm9qZWN0IGVsZW1lbnQgYW5kIGdldCBhdHRyaWJ1dGUKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhOb2RlTmFtZShwcm9qZWN0RWxlbWVudE5hbWUpOwotCQllbHNlIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoQXR0cmlidXRlKGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KHJlc291cmNlKSk7Ci0KLQotCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQlkb21PcGVyYXRvci5yZW1vdmVBdHRyaWJ1dGVBdChlLCBwcm9wZXJ0eU5hbWUpOwotCQkJLy8gd3JpdGUgZG9tIHRyZWUgaW50byAuY29udGVudHNldHRpbmdzCi0JCQl0cnkgewotCQkJCXdyaXRlRE9NRG9jdW1lbnQoKTsKLQkJCX0KLQkJCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQotCX0KLQotCi0JcHJpdmF0ZSBib29sZWFuIGV4aXN0c0NvbnRlbnRTZXR0aW5ncygpIHsKLQkJaWYgKGNvbnRlbnRTZXR0aW5nc1BhdGggPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJUmVzb3VyY2UgZmlsZSA9IGN1cnJQcm9qZWN0LmdldEZpbGUoY29udGVudFNldHRpbmdzTmFtZSk7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4aXN0c1Byb3BlcnRpZXMoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmICghKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCB8fCByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWNvbnRlbnRTZXR0aW5nc1BhdGggPSBnZXRDb250ZW50U2V0dGluZ3NQYXRoKHJlc291cmNlKTsKLQkJaWYgKGNvbnRlbnRTZXR0aW5nc1BhdGggPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoIWV4aXN0c0NvbnRlbnRTZXR0aW5ncygpKQotCQkJcmV0dXJuIGZhbHNlOyAvLyB3aGVuIC5jb250ZW50c2V0dGluZ3MueG1sIGlzIE5PVCBleGlzdC4KLQotCQl0cnkgewotCQkJY3JlYXRlRE9NVHJlZSgpOwotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUVsZW1lbnQgZSA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpCi0JCQkvLyBzZWxlY3QgcHJvamVjdCBlbGVtZW50IGFuZCBnZXQgYXR0cmlidXRlCi0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoTm9kZU5hbWUocHJvamVjdEVsZW1lbnROYW1lKTsKLQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShnZXRQYXRoQXR0cigpLCBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChyZXNvdXJjZSkpOwotCi0JCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlNYXAgcHJvcGVydGllcyA9IGRvbU9wZXJhdG9yLmdldEF0dHJpYnV0ZXNPZihlKTsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcHJvcGVydGllcy5yZW1vdmUoZ2V0UGF0aEF0dHIoKSk7Ly8gaWYgSUZpbGUscmVtb3ZlZAotCQlpZiAocHJvcGVydGllcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q29udGVudFNldHRpbmdzUGF0aChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpCi0JCQlwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJZWxzZQotCQkJcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQotCQlJUGF0aCBwcm9qZWN0TG9jYXRpb24gPSBwcm9qZWN0LmdldExvY2F0aW9uKCk7Ci0JCWlmIChwcm9qZWN0TG9jYXRpb24gPT0gbnVsbCkgewotCQkJLyoqCi0JCQkgKiBBcyBhIGRlcHJlY2F0ZWQgY2xhc3MsIHBlcmZlY3Qgb3BlcmF0aW9uIGluIG5ldyBzY2VuYXJpb3Mgc3VjaAotCQkJICogYXMgd2l0aCBFRlMgaXMgbm90IHByb21pc2VkLgotCQkJICovCi0JCQlyZXR1cm4gU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChyb290RWxlbWVudE5hbWUpLmFwcGVuZChwcm9qZWN0LmdldE5hbWUoKSkudG9TdHJpbmcoKTsKLQkJfQotCi0JCXJldHVybiBwcm9qZWN0TG9jYXRpb24uYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS5hcHBlbmQoY29udGVudFNldHRpbmdzTmFtZSkudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldFBhdGhBdHRyKCkgewotCQlyZXR1cm4gUEFUSEFUVFI7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBNYXAgZ2V0UHJvcGVydGllcyhmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoIShyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QgfHwgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWNvbnRlbnRTZXR0aW5nc1BhdGggPSBnZXRDb250ZW50U2V0dGluZ3NQYXRoKHJlc291cmNlKTsKLQkJaWYgKGNvbnRlbnRTZXR0aW5nc1BhdGggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICghZXhpc3RzQ29udGVudFNldHRpbmdzKCkpIHsKLQkJCXJldHVybiBudWxsOyAvLyB3aGVuIC5jb250ZW50c2V0dGluZ3MueG1sIGlzIE5PVCBleGlzdC4KLQkJfQotCi0KLQkJdHJ5IHsKLQkJCWNyZWF0ZURPTVRyZWUoKTsKLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLlJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUxKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJCS8vIGNyZWF0ZSBET00gdHJlZSBmb3IgbmV3IFhNTCBEb2N1bWVudAotCQkJdHJ5IHsKLQkJCQljcmVhdGVOZXdET01UcmVlKCk7Ci0JCQkJd3JpdGVET01Eb2N1bWVudCgpOwotCQkJfQotCQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5DcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUyKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0JCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJfQotCi0KLQkJRWxlbWVudCBlID0gbnVsbDsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkKLQkJCS8vIHNlbGVjdCBwcm9qZWN0IGVsZW1lbnQgYW5kIGdldCBhdHRyaWJ1dGUKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhOb2RlTmFtZShwcm9qZWN0RWxlbWVudE5hbWUpOwotCQllbHNlIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoQXR0cmlidXRlKGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KHJlc291cmNlKSk7Ci0KLQotCQlpZiAoZSAhPSBudWxsKSB7Ci0KLQkJCU1hcCBwcm9wZXJ0aWVzID0gZG9tT3BlcmF0b3IuZ2V0QXR0cmlidXRlc09mKGUpOwotCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChwcm9wZXJ0aWVzLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXByb3BlcnRpZXMucmVtb3ZlKGdldFBhdGhBdHRyKCkpOwotCQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQlyZXR1cm4gbnVsbDsvLyB3aGVuIHByb2plY3Qgb3IgZmlsZSBlbGVtZW50IGlzIE5PVCBleGlzdC4KLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldFByb3BlcnR5KGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICghKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCB8fCByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJY29udGVudFNldHRpbmdzUGF0aCA9IGdldENvbnRlbnRTZXR0aW5nc1BhdGgocmVzb3VyY2UpOwotCQlpZiAoY29udGVudFNldHRpbmdzUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKCFleGlzdHNDb250ZW50U2V0dGluZ3MoKSkgewotCQkJcmV0dXJuIG51bGw7IC8vIHdoZW4gLmNvbnRlbnRzZXR0aW5ncy54bWwgaXMgTk9UIGV4aXN0LgotCQl9Ci0KLQotCQl0cnkgewotCQkJY3JlYXRlRE9NVHJlZSgpOwotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTEpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQkJLy8gY3JlYXRlIERPTSB0cmVlIGZvciBuZXcgWE1MIERvY3VtZW50Ci0JCQl0cnkgewotCQkJCWNyZWF0ZU5ld0RPTVRyZWUoKTsKLQkJCQl3cml0ZURPTURvY3VtZW50KCk7Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLkNyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQl9Ci0KLQotCQlFbGVtZW50IGUgPSBudWxsOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKQotCQkJLy8gc2VsZWN0IHByb2plY3QgZWxlbWVudCBhbmQgZ2V0IGF0dHJpYnV0ZQotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aE5vZGVOYW1lKHByb2plY3RFbGVtZW50TmFtZSk7Ci0JCWVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUoZ2V0UGF0aEF0dHIoKSwgZ2V0UmVsYXRpdmVQYXRoRnJvbVByb2plY3QocmVzb3VyY2UpKTsKLQotCi0JCWlmIChlICE9IG51bGwpIHsKLQkJCVN0cmluZyByZXN1bHQgPSBlLmdldEF0dHJpYnV0ZShwcm9wZXJ0eU5hbWUpOwotCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQllbHNlIHsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCXJldHVybiBudWxsOy8vIHdoZW4gcHJvamVjdCBvciBmaWxlIGVsZW1lbnQgaXMgTk9UIGV4aXN0LgotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoRnJvbVByb2plY3QoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVBhdGggcGF0aCA9IHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBpZiByZXNvdXJjZSBpcyBwcm9qZWN0IG9yIHdvcmtzcGFjZSByb290Ci0JCVN0cmluZyByZXNvdXJjZVBhdGggPSBwYXRoLnRvU3RyaW5nKCk7Ci0KLQkJcmV0dXJuIHJlc291cmNlUGF0aDsKLQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlQ2FjaGUoKSB7Ci0JCWRvbU9wZXJhdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UHJvcGVydGllcyhmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCS8vIGRlbnkgdG8gc2V0ICJwYXRoIiBhdHRyaWJ1dGUgdmFsdWUuCi0JCVNldCBrZXlzID0gcHJvcGVydGllcy5rZXlTZXQoKTsKLQkJSXRlcmF0b3IgaWkgPSBrZXlzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpaS5oYXNOZXh0KCkpIHsKLQkJCWlmICh0aGlzLmdldFBhdGhBdHRyKCkuZXF1YWxzKGlpLm5leHQoKSkpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuX3NldFByb3BlcnRpZXMocmVzb3VyY2UsIHByb3BlcnRpZXMpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQcm9wZXJ0eShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCS8vIGRlbnkgdG8gc2V0ICJwYXRoIiBhdHRyaWJ1dGUgdmFsdWUuCi0JCWlmICh0aGlzLmdldFBhdGhBdHRyKCkuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0JCQlyZXR1cm47Ci0JCXRoaXMuX3NldFByb3BlcnR5KHJlc291cmNlLCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZURPTURvY3VtZW50KCkgdGhyb3dzIFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gewotCQl0cnkgewotCi0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJZG9tT3BlcmF0b3Iud3JpdGVEb2N1bWVudChvdXRwdXRTdHJlYW0pOwotCQkJb3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0JCQlvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCi0JCQlJRmlsZSBvdXRwdXRGaWxlID0gY3VyclByb2plY3QuZ2V0RmlsZShjb250ZW50U2V0dGluZ3NOYW1lKTsKLQkJCWlmIChvdXRwdXRGaWxlLmV4aXN0cygpKQotCQkJCW91dHB1dEZpbGUuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0sIHRydWUsIHRydWUsIG51bGwpOwotCQkJZWxzZQotCQkJCW91dHB1dEZpbGUuY3JlYXRlKGlucHV0U3RyZWFtLCB0cnVlLCBudWxsKTsKLQotCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJdGhyb3cgbmV3IFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oImludmFsaWQgb3V0cHV0RmlsZSBpbiB3cml0ZURPTURvY3VtZW50KCkiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl0aHJvdyBuZXcgU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbigiaW52YWxpZCBvdXRwdXRTdHJlYW0gb3IgaW5wdXRTdHJlYW0gaW4gd3JpdGVET01Eb2N1bWVudCgpIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NDaGFuZ2VTdWJqZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NDaGFuZ2VTdWJqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYzU4MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzQ2hhbmdlU3ViamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBTZWUKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5IVE1MQ29udGVudFByb3BlcnRpZXMKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRTZXR0aW5nc0NoYW5nZVN1YmplY3QgZXh0ZW5kcyBBYnN0cmFjdFN1YmplY3QgewotCi0KLQlwcml2YXRlIHN0YXRpYyBJTm90aWZ5IG5vdGlmeTsKLQlwcml2YXRlIHN0YXRpYyBJU3ViamVjdCBzdWJqZWN0OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTm90aWZ5IGdldE5vdGlmeSgpIHsKLQkJaWYgKG5vdGlmeSA9PSBudWxsICYmIHN1YmplY3QgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChDb250ZW50U2V0dGluZ3NDaGFuZ2VTdWJqZWN0LmNsYXNzKSB7Ci0JCQkJaWYgKG5vdGlmeSA9PSBudWxsICYmIHN1YmplY3QgPT0gbnVsbCkgewotCQkJCQlub3RpZnkgPSBuZXcgQ29udGVudFNldHRpbmdzQ2hhbmdlU3ViamVjdCgpOwotCQkJCQlzdWJqZWN0ID0gKElTdWJqZWN0KSBub3RpZnk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5vdGlmeTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdWJqZWN0IGdldFN1YmplY3QoKSB7Ci0JCWlmIChzdWJqZWN0ID09IG51bGwgJiYgbm90aWZ5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoQ29udGVudFNldHRpbmdzQ2hhbmdlU3ViamVjdC5jbGFzcykgewotCQkJCWlmIChzdWJqZWN0ID09IG51bGwgJiYgbm90aWZ5ID09IG51bGwpIHsKLQkJCQkJc3ViamVjdCA9IG5ldyBDb250ZW50U2V0dGluZ3NDaGFuZ2VTdWJqZWN0KCk7Ci0JCQkJCW5vdGlmeSA9IChJTm90aWZ5KSBzdWJqZWN0OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3ViamVjdDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTGlzdGVuZXIoSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSBjaGFuZ2VkUmVzb3VyY2UpIHsKLQkJc3VwZXIubm90aWZ5TGlzdGVuZXJzKGNoYW5nZWRSZXNvdXJjZSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUxpc3RlbmVyKElDb250ZW50U2V0dGluZ3NMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzQ3JlYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGQzNTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc0NyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgU2VlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50U2V0dGluZ3NDcmVhdG9yIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSUNvbnRlbnRTZXR0aW5ncyBjcmVhdGUoKSB7Ci0JCXJldHVybiBDb250ZW50U2V0dGluZ3MuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc0ZpbGVIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NGaWxlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzUyNjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc0ZpbGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0vKioKLSogQGRlcHJlY2F0ZWQgVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBzbyBubyBvbmUgY2FyZXMgYW55d2F5cy4KLSovCi1jbGFzcyBDb250ZW50U2V0dGluZ3NGaWxlSGFuZGxlciBleHRlbmRzIEFic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlciB7Ci0KLQotCi0JcHJpdmF0ZSBNYXAgcHJvcGVydGllczsKLQotCi0JcHJpdmF0ZSB2b2lkIGdldFByb3BlcnRpZXMoSVJlc291cmNlIGZpbGUpIHsKLQkJcHJvcGVydGllcyA9IGdldENvbnRlbnRTZXR0aW5ncygpLmdldFByb3BlcnRpZXMoZmlsZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlciNoYW5kbGVBZGRlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWRkZWQoKSB7Ci0JCXN1cGVyLmhhbmRsZUFkZGVkKCk7Ci0KLQkJaWYgKHN1cGVyLmdldERlbHRhKCkuZ2V0RmxhZ3MoKSA9PSAwKSB7Ci0JCQkvLyBwdWxsZG93biBtZW11LT5jb3B5LT5jcmVhdGUgZmlsZSB3aXRob3V0IG92ZXJyaWRlLCBuZXcgZmlsZSwKLQkJCS8vIGltcG9ydCB3aXRob3V0IG92ZXJyaWRlCi0JCQkvLyBjb3B5LG5ldyxpbXBvcnQgaGFzIHNhbWUga2luZCg9MSkgYW5kIGZsYWcoPTApLgotCi0JCX0gZWxzZSBpZiAoKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX0ZST00pICE9IDApIHsKLQkJCS8vIHB1bGxkb3duIG1lbnUtPiByZW5hbWUgd2l0aG91dCBvdmVycmlkZSxwdWxsZG93biBtZW51LT5tb3ZlCi0JCQkvLyB3aXRob3V0IG92ZXJyaWRlCi0JCQkvLyBpbnN0ZWFkIG9mIHRoaXMgbWV0aG9kLGhhbmRsZVJlbW92ZWQoKSB3b3JrcyBmb3IgdGhpcyBkZWx0YQotCi0JCX0KLQotCX0KLQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlciNoYW5kbGVDaGFuZ2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkKCkgewotCQkvLyBlZGl0Ci0JCWlmIChnZXREZWx0YSgpLmdldEZsYWdzKCkgPT0gSVJlc291cmNlRGVsdGEuQ09OVEVOVCAmJiAoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpID09IDApIHsKLQkJCXN1cGVyLmhhbmRsZUNoYW5nZWQoKTsKLQotCQl9IGVsc2UgaWYgKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSA9PSBJUmVzb3VyY2VEZWx0YS5DT05URU5UICYmIChnZXREZWx0YSgpLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgIT0gMCkgewotCQkJLy8gb3ZlcnJpZGUgYXMgYSByZXN1bHQgb2YgY29weSBvciBpbXBvcnQKLQkJCS8vIGluIFdlYiBwcm9qZWN0LCBjb3B5IHdpdGggb3ZlcnJpZGUgZG9lc24ndCBoYXBwZW4KLQotCQkJLy8gb3ZlcnJpZGUgYXMgbW92ZSBvciByZW5hbWUKLQkJCS8vIGhhbmRsZVJlbW92ZWQoKSB3b3JrcyBmb3IgdGhpcyBkZWx0YQotCQkJc3VwZXIuaGFuZGxlQ2hhbmdlZCgpOwotCi0JCX0KLQotCi0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlciNoYW5kbGVSZW1vdmVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZW1vdmVkKCkgewotCQlzdXBlci5oYW5kbGVSZW1vdmVkKCk7Ci0JCUlGaWxlIGRlbGV0ZWRGaWxlID0gbnVsbDsKLQotCQkvLyBpZiBlbnRyeSBleGlzdHMgdGhlbiByZW1vdmUgaXQuCi0JCWlmIChnZXREZWx0YSgpLmdldEZsYWdzKCkgPT0gMCkgewotCQkJLy8gcHVsbGRvd24gbWVudS0+ZGVsZXRlCi0JCQlkZWxldGVkRmlsZSA9IChJRmlsZSkgZ2V0RGVsdGEoKS5nZXRSZXNvdXJjZSgpOwotCi0JCQlpZiAoZGVsZXRlZEZpbGUgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlnZXRDb250ZW50U2V0dGluZ3MoKS5kZWxldGVBbGxQcm9wZXJ0aWVzKGRlbGV0ZWRGaWxlKTsKLQotCQkJZ2V0Q29udGVudFNldHRpbmdzKCkucmVsZWFzZUNhY2hlKCk7Ci0JCX0KLQotCQllbHNlIGlmICgoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfVE8pICE9IDApIHsKLQotCQkJLy8gcHVsbGRvd24gbWVudS0+IHJlbmFtZSwgcHVsbGRvd24gbWVudS0+bW92ZQotCQkJZGVsZXRlZEZpbGUgPSAoSUZpbGUpIGdldERlbHRhKCkuZ2V0UmVzb3VyY2UoKTsKLQkJCWdldFByb3BlcnRpZXMoZGVsZXRlZEZpbGUpOwotCi0JCQkvLyBnZXQgZGVzdGluYXRpb24gSVJlc291cmNlCi0JCQlJUGF0aCB0YXJnZXRQYXRoID0gZ2V0RGVsdGEoKS5nZXRNb3ZlZFRvUGF0aCgpOwotCQkJSVdvcmtzcGFjZVJvb3QgaXdyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlSZXNvdXJjZSB0YXJnZXRGaWxlID0gaXdyLmdldEZpbGUodGFyZ2V0UGF0aCk7Ly9pd3IuZmluZE1lbWJlcih0YXJnZXRQYXRoKTsKLQotCQkJLy8gc2V0IHByb3BlcnR5IG9mIGRlc3RpbmF0aW9uIGZpbGUKLQkJCWdldENvbnRlbnRTZXR0aW5ncygpLmRlbGV0ZUFsbFByb3BlcnRpZXModGFyZ2V0RmlsZSk7Ci0JCQlzZXRQcm9wZXJ0aWVzKHRhcmdldEZpbGUpOwotCQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkKLQkJCQlwcm9wZXJ0aWVzLmNsZWFyKCk7Ci0JCQlwcm9wZXJ0aWVzID0gbnVsbDsKLQkJfQotCi0JCWlmIChkZWxldGVkRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRDb250ZW50U2V0dGluZ3MoKS5kZWxldGVBbGxQcm9wZXJ0aWVzKGRlbGV0ZWRGaWxlKTsKLQotCQlnZXRDb250ZW50U2V0dGluZ3MoKS5yZWxlYXNlQ2FjaGUoKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRQcm9wZXJ0aWVzKElSZXNvdXJjZSBmaWxlKSB7Ci0JCWlmIChmaWxlLmdldEZpbGVFeHRlbnNpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoIShmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJzaHRtbCIpLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJodG0iKS8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgiaHRtbCIpLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJqaHRtbCIpLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJ4aHRtbCIpLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJqc3AiKS8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgiY3NzIikvLyROT04tTkxTLTEkCi0JCQkJCXx8IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImpzZiIpLy8kTk9OLU5MUy0xJAotCQl8fCBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJqc3BmIikpKS8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCB8fCBwcm9wZXJ0aWVzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJZ2V0Q29udGVudFNldHRpbmdzKCkuc2V0UHJvcGVydGllcyhmaWxlLCBwcm9wZXJ0aWVzKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzU2VsZkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc1NlbGZIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YWEyYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzU2VsZkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotCi0vKioKLSogQGRlcHJlY2F0ZWQgVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBzbyBubyBvbmUgY2FyZXMgYW55d2F5cy4KLSovCi1maW5hbCBjbGFzcyBDb250ZW50U2V0dGluZ3NTZWxmSGFuZGxlciBleHRlbmRzIEFic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBJTm90aWZ5IG5vdGlmeTsvLyA9IG5ldyBDb250ZW50U2V0dGluZ3NDaGFuZ2VkU3ViamVjdCgpOwotCi0KLQlwcml2YXRlIGZpbmFsIHZvaWQgZ2V0U3ViamVjdCgpIHsKLQkJbm90aWZ5ID0gQ29udGVudFNldHRpbmdzQ2hhbmdlU3ViamVjdC5nZXROb3RpZnkoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQWJzdHJhY3RDb250ZW50U2V0dGluZ3NIYW5kbGVyI2hhbmRsZUFkZGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBZGRlZCgpIHsKLQkJZ2V0U3ViamVjdCgpOwotCQlpZiAoc3VwZXIuZ2V0RGVsdGEoKS5nZXRGbGFncygpID09IDApIHsKLQkJCS8vIHB1bGxkb3duIG1lbXUtPmNvcHktPmNyZWF0ZSBmaWxlIHdpdGhvdXQgb3ZlcnJpZGUsIG5ldyBmaWxlLAotCQkJLy8gcHJvcGVydHkgcGFnZSBjcmVhdGUgLmNvbnRlbnRzZXR0aW5ncwotCQkJc3VwZXIuaGFuZGxlQWRkZWQoKTsKLQkJCW5vdGlmeS5ub3RpZnlMaXN0ZW5lcnMoZ2V0RGVsdGEoKS5nZXRSZXNvdXJjZSgpKTsKLQotCQl9IGVsc2UgaWYgKChnZXREZWx0YSgpLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9GUk9NKSAhPSAwKSB7Ci0JCQkvLyBwdWxsZG93biBtZW51LT4gcmVuYW1lIHdpdGhvdXQgb3ZlcnJpZGUscHVsbGRvd24gbWVudS0+bW92ZQotCQkJLy8gd2l0aG91dCBvdmVycmlkZQotCQkJc3VwZXIuaGFuZGxlQWRkZWQoKTsKLQkJCW5vdGlmeS5ub3RpZnlMaXN0ZW5lcnMoZ2V0RGVsdGEoKS5nZXRSZXNvdXJjZSgpKTsKLQotCQl9Ci0KLQl9Ci0KLQotCS8qCi0JICogQHNlZSBBYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIjaGFuZGxlQ2hhbmdlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZCgpIHsKLQkJZ2V0U3ViamVjdCgpOwotCQlpZiAoKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQpICE9IDAgJiYgKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSA9PSAwKSB7Ci0JCQkvLyByZXN1bHQgb2YgZWRpdCwgcHJvcGVydHkgcGFnZSBvcGVyYXRlIHNldFByb3BlcnR5KGFwcGx5IG9yIG9rCi0JCQkvLyBidXR0b24pIGluIC5jb250ZW50c2V0dGluZ3MKLQkJCXN1cGVyLmhhbmRsZUNoYW5nZWQoKTsKLQotCQkJbm90aWZ5Lm5vdGlmeUxpc3RlbmVycyhnZXREZWx0YSgpLmdldFJlc291cmNlKCkpOwotCi0JCX0gZWxzZSBpZiAoKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQpICE9IDAgJiYgKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSAhPSAwKSB7Ci0JCQlzdXBlci5oYW5kbGVDaGFuZ2VkKCk7Ci0JCQlub3RpZnkubm90aWZ5TGlzdGVuZXJzKGdldERlbHRhKCkuZ2V0UmVzb3VyY2UoKSk7Ci0KLQkJfQotCi0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQWJzdHJhY3RDb250ZW50U2V0dGluZ3NIYW5kbGVyI2hhbmRsZVJlbW92ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJlbW92ZWQoKSB7Ci0JCWdldFN1YmplY3QoKTsKLQkJaWYgKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSA9PSAwKSB7Ci0JCQkvLyBwdWxsZG93biBtZW51LT5kZWxldGUKLQkJCXN1cGVyLmhhbmRsZVJlbW92ZWQoKTsKLQkJCW5vdGlmeS5ub3RpZnlMaXN0ZW5lcnMoZ2V0RGVsdGEoKS5nZXRSZXNvdXJjZSgpKTsKLQotCQl9IGVsc2UgaWYgKChnZXREZWx0YSgpLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTykgIT0gMCkgewotCQkJLy8gcHVsbGRvd24gbWVudS0+IHJlbmFtZSwgcHVsbGRvd24gbWVudS0+bW92ZQotCQkJc3VwZXIuaGFuZGxlUmVtb3ZlZCgpOwotCQkJbm90aWZ5Lm5vdGlmeUxpc3RlbmVycyhnZXREZWx0YSgpLmdldFJlc291cmNlKCkpOwotCi0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzU3luY2hyb25pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5OGI2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChJbnRhbGlvKSAtIGJ1ZyAzMDA0MzQgLSBNYWtlIGlubmVyIGNsYXNzZXMgc3RhdGljIHdoZXJlIHBvc3NpYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBTZWUKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5IVE1MQ29udGVudFByb3BlcnRpZXMKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRTZXR0aW5nc1N5bmNocm9uaXplciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQlzdGF0aWMgY2xhc3MgQ29udGVudFNldHRpbmdzVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCS8vIHJlZGVmaW5pdGlvbiBpbiBDb250ZW50U2V0dGluZ3MuamF2YQotCQlwcml2YXRlIFN0cmluZyBjb250ZW50U2V0dGluZ3NOYW1lID0gQ29udGVudFNldHRpbmdzLmdldENvbnRlbnRTZXR0aW5nc05hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUV2ZW50IGZFdmVudDsKLQkJcHJpdmF0ZSBJQ29udGVudFNldHRpbmdzSGFuZGxlciBoYW5kbGVyOwotCi0JCXB1YmxpYyBDb250ZW50U2V0dGluZ3NWaXNpdG9yKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQl0aGlzLmZFdmVudCA9IGV2ZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSVJlc291cmNlRGVsdGFWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCWlmIChkZWx0YSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBwYXJlbnQgZm9sZGVyIG9yIHByb2plY3QKLQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiBkZWx0YS5nZXRGbGFncygpID09IDApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlmaW5hbCBpbnQgcmVzb3VyY2VUeXBlID0gcmVzb3VyY2UuZ2V0VHlwZSgpOwotCQkJc3dpdGNoIChyZXNvdXJjZVR5cGUpIHsKLQkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCQkvLyB3aGV0aGVyIHJlc291cmNlIGlzIC5jb250ZW50c2V0dGluZ3MgZmlsZSBvciBub3QKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IGRlbHRhLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpOwotCQkJCQlpZiAodGhpcy5mRXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFICYmIHJlc291cmNlLmVxdWFscyhwcm9qZWN0LmdldEZpbGUodGhpcy5jb250ZW50U2V0dGluZ3NOYW1lKSkpIHsKLQkJCQkJCS8vIG5ldyBvYmplY3QgZm9yIC5jb250ZW50c2V0dGluZ3MKLQkJCQkJCWhhbmRsZXIgPSBuZXcgQ29udGVudFNldHRpbmdzU2VsZkhhbmRsZXIoKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICh0aGlzLmZFdmVudC5nZXRUeXBlKCkgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0JVSUxEICYmIHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBUT0RPIGNoYW5nZSB0byBjb250ZW50IHR5cGUhCi0JCQkJCQlpZiAocmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoInNodG1sIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImh0bSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXx8IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJodG1sIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImpodG1sIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoInhodG1sIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImpzcCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXx8IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJjc3MiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl8fCByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgianNmIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImpzcGYiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJLy8gbmV3IG9iamVjdCBmb3IgSUZpbGUKLQkJCQkJCQloYW5kbGVyID0gbmV3IENvbnRlbnRTZXR0aW5nc0ZpbGVIYW5kbGVyKCk7Ci0JCQkJCQkJaGFuZGxlci5oYW5kbGUoZGVsdGEpOwotCQkJCQkJCWhhbmRsZXIgPSBudWxsOwotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBmYWxzZTsgLy8gdHJ1ZSBvciBmYWxzZTttb3RvbW90byB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0vLwkJCWZpbmFsIElSZXNvdXJjZURlbHRhIGZEZWx0YSA9IGRlbHRhOwotLy8JCQlmaW5hbCBJQ29udGVudFNldHRpbmdzSGFuZGxlciBkZWx0YUhhbmRsZXIgPSB0aGlzLmhhbmRsZXI7Ci0JCQkvLyBYWFggRklYTUUKLQkJCS8vIEkgY29tbWVudGVkIG91dCBmb2xsb3dpbmcgdG8gbW92ZSB0aGlzIHRvICJtb2RlbCIgCi0JCQkvLyBwYWNrYWdlcy4gU2luY2Ugd2FzbnQndCBob29rZWQgdXAvd29ya2luZyBhbnl3YXksIEkgdGhpbmsgCi0JCQkvLyBvayBmb3Igbm93LCBidXQgbmVlZCB0byByZS13b3JrIGFzIEpvYiwgb25jZSB3ZSBkbyBpbXBsZW1lbnQgCi0JCQkvLyBzZXR0aW5ncyBmb3IgcmVzb3VyY2VzIGFnYWluLiAKLS8vCQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotLy8JCQlpZiAoZGlzcGxheSAhPSBudWxsICYmICFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotLy8JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotLy8JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLS8vCQkJCQkJaWYgKGRlbHRhSGFuZGxlciAhPSBudWxsKSB7Ci0vLwkJCQkJCQlkZWx0YUhhbmRsZXIuaGFuZGxlKGZEZWx0YSk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9KTsKLS8vCQkJfQotLy8JCQllbHNlIGlmIChkZWx0YUhhbmRsZXIgIT0gbnVsbCkgewotLy8JCQkJZGVsdGFIYW5kbGVyLmhhbmRsZShmRGVsdGEpOwotLy8JCQl9Ci0JCQloYW5kbGVyID0gbnVsbDsKLQkJCXJldHVybiB0cnVlOyAvLyB0cnVlIG9yIGZhbHNlO21vdG9tb3RvIHRydWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDb250ZW50U2V0dGluZ3NTeW5jaHJvbml6ZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ29udGVudFNldHRpbmdzU3luY2hyb25pemVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IENvbnRlbnRTZXR0aW5nc1N5bmNocm9uaXplcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZW50U2V0dGluZ3NWaXNpdG9yIGNzVmlzaXRvcjsKLQlwcml2YXRlIGJvb2xlYW4gZkxpc3RlbmluZyA9IGZhbHNlOwotCXByaXZhdGUgSVByb2plY3QgZlByb2plY3Q7Ci0KLQotCXByaXZhdGUgZmluYWwgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIGZQcm9qZWN0OwotCX0KLQotCXByaXZhdGUgZmluYWwgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCWlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCkKLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGluc3RhbGwoKSB7Ci0JCWlmICghZkxpc3RlbmluZykgewotCQkJZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQlVJTEQgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JCQlmTGlzdGVuaW5nID0gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNMaXN0ZW5pbmcoKSB7Ci0JCXJldHVybiBmTGlzdGVuaW5nOwotCX0KLQotCS8qCi0JICogQHNlZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGNzVmlzaXRvciA9PSBudWxsKQotCQkJCQljc1Zpc2l0b3IgPSBuZXcgQ29udGVudFNldHRpbmdzVmlzaXRvcihldmVudCk7Ci0JCQkJZGVsdGEuYWNjZXB0KGNzVmlzaXRvcik7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQljc1Zpc2l0b3IgPSBudWxsOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB1bkluc3RhbGwoKSB7Ci0JCWdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWZMaXN0ZW5pbmcgPSBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JQ29udGVudFNldHRpbmdzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JQ29udGVudFNldHRpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OGRkNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBTZWUKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5IVE1MQ29udGVudFByb3BlcnRpZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudFNldHRpbmdzIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIENTU19QUk9GSUxFID0gImNzcy1wcm9maWxlIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgREVWSUNFX1BST0ZJTEUgPSAidGFyZ2V0LWRldmljZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfVFlQRSA9ICJkb2N1bWVudC10eXBlIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgSFRNTF9ET0NVTUVOVF9UWVBFID0gImh0bWwtZG9jdW1lbnQtdHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUFsbFByb3BlcnRpZXMoZmluYWwgSVJlc291cmNlIGRlbGV0ZWRGaWxlKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVByb3BlcnR5KGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHNQcm9wZXJ0aWVzKElSZXNvdXJjZSByZXNvdXJjZSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTWFwIGdldFByb3BlcnRpZXMoZmluYWwgSVJlc291cmNlIHJlc291cmNlKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIHJlbGVhc2UgY2FjaGUgb2YgRE9NIHRyZWUgaW4gLmNvbnRlbnRzZXR0aW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VDYWNoZSgpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIE1hcCBwcm9wZXJ0aWVzKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5VmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5nc0hhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lDb250ZW50U2V0dGluZ3NIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZjhiNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5nc0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotCi0vKioKLSogQGRlcHJlY2F0ZWQgVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBzbyBubyBvbmUgY2FyZXMgYW55d2F5cy4KLSovCi1pbnRlcmZhY2UgSUNvbnRlbnRTZXR0aW5nc0hhbmRsZXIgewotCi0JcHVibGljIHZvaWQgaGFuZGxlKGZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lDb250ZW50U2V0dGluZ3NMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMTUxZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBTZWUKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5IVE1MQ29udGVudFByb3BlcnRpZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudFNldHRpbmdzTGlzdGVuZXIgewotCi0Jdm9pZCBjb250ZW50U2V0dGluZ3NDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSBlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lOb3RpZnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lOb3RpZnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRjZjVmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JTm90aWZ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotCi0vKioKLSogQGRlcHJlY2F0ZWQgVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBzbyBubyBvbmUgY2FyZXMgYW55d2F5cy4KLSovCi1pbnRlcmZhY2UgSU5vdGlmeSB7Ci0KLQl2b2lkIG5vdGlmeUxpc3RlbmVycyhvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgcmVzb3VyY2UpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSVN1YmplY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lTdWJqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZjQwMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSVN1YmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgU2VlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN1YmplY3QgewotCi0Jdm9pZCBhZGRMaXN0ZW5lcihJQ29udGVudFNldHRpbmdzTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0Jdm9pZCByZW1vdmVMaXN0ZW5lcihJQ29udGVudFNldHRpbmdzTGlzdGVuZXIgbGlzdGVuZXIpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9TaW1wbGVOb2RlT3BlcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL1NpbXBsZU5vZGVPcGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2U3YTM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL1NpbXBsZU5vZGVPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKEludGFsaW8pIC0gYnVnIDMwMDQzNCAtIE1ha2UgaW5uZXIgY2xhc3NlcyBzdGF0aWMgd2hlcmUgcG9zc2libGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSogQGRlcHJlY2F0ZWQgVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBzbyBubyBvbmUgY2FyZXMgYW55d2F5cy4KLSovCi1jbGFzcyBTaW1wbGVOb2RlT3BlcmF0b3IgewotCi0Jc3RhdGljIGNsYXNzIENyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBDcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKFN0cmluZyByZWFzb24pIHsKLQkJCXN1cGVyKHJlYXNvbik7Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBSZWFkQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHVibGljIFJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKFN0cmluZyByZWFzb24pIHsKLQkJCXN1cGVyKHJlYXNvbik7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKFN0cmluZyByZWFzb24pIHsKLQkJCXN1cGVyKHJlYXNvbik7Ci0JCX0KLQl9Ci0KLQkvLyB3cml0ZXIgY2xhc3MgZm9yIC5jb250ZW50U2V0dGluZ3MuCi0Jc3RhdGljIGNsYXNzIFhNTERvY3VtZW50V3JpdGVyIHsKLQkJT3V0cHV0U3RyZWFtIGZPdXQ7Ci0KLQkJcHJvdGVjdGVkIFhNTERvY3VtZW50V3JpdGVyKE91dHB1dFN0cmVhbSBvdXQpIHsKLQkJCXRoaXMuZk91dCA9IG91dDsKLQkJfQotCi0JCXByb3RlY3RlZCBmaW5hbCB2b2lkIGNsb3NlKCkgewotCQkJdHJ5IHsKLQkJCQlmT3V0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZywgc2hvdWxkbid0IG1hdHRlcgotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgc2VyaWFsaXplKERvY3VtZW50IHNvdXJjZURvY3VtZW50KSB0aHJvd3MgV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIHsKLQkJCS8vIEpBWFAgdHJhbnNmb3JtYXRpb24KLQkJCVNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKHNvdXJjZURvY3VtZW50KTsKLQkJCXRyeSB7Ci0JCQkJVHJhbnNmb3JtZXIgc2VyaWFsaXplciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gdW5zdXBwb3J0ZWQgcHJvcGVydGllcwotCQkJCX0KLQkJCQlzZXJpYWxpemVyLnRyYW5zZm9ybShkb21Tb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQoZk91dCkpOwotCQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0gY2F0Y2ggKFRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQkJdGhyb3cgbmV3IFdyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IFdyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVNpbXBsZU5vZGVPcGVyYXRvciBhID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWEgPSBuZXcgU2ltcGxlTm9kZU9wZXJhdG9yKCJ3b3Jrc3BhY2Uvb3JnLmVjbGlwc2UuZXhhbXBsZXMuY29udGVudHNldHRpbmdzLy5jb250ZW50c2V0dGluZ3MueG1sIik7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCX0KLQotCQkvLyBwcmludCBhbGwgRWxlbWVudHMKLQkJLy9hLnByaW50VHJlZShpdGVyKTsKLQotCQkvLyBhZGQgRWxlbWVudAotCQlNYXAgYXR0TWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQlhdHRNYXAucHV0KCJwYXRoIiwgImhvZ2VwYXRoIik7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWF0dE1hcC5wdXQoImZEb2N1bWVudC10eXBlIiwgImRvY3VtZW50aG9nZWhvZ2UiKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYS5hZGRFbGVtZW50VW5kZXJSb290KCJmaWxlIiwgYXR0TWFwKTsvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCWEud3JpdGVEb2N1bWVudChTeXN0ZW0ub3V0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQl9Ci0KLQkvL25ldmVyIHVzZWQKLQkvL3ByaXZhdGUgRE9NUGFyc2VyIHBhcnNlcjsKLQlwcml2YXRlIERvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIE5vZGUgcm9vdDsKLQotCXByaXZhdGUgU3RyaW5nIHNldHRpbmdzRmlsZU5hbWU7Ci0KLQotCXB1YmxpYyBTaW1wbGVOb2RlT3BlcmF0b3IoRG9jdW1lbnQgZG9jKSB0aHJvd3MgQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IENyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oIkRvY3VtZW50IGRvYz09bnVsbCIpOy8vJE5PTi1OTFMtMSQKLQkJZkRvY3VtZW50ID0gZG9jOwotCQlyb290ID0gZkRvY3VtZW50LmdldExhc3RDaGlsZCgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IENyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oIk5vZGUgcm9vdD09bnVsbCIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlTm9kZU9wZXJhdG9yKFN0cmluZyBmdWxsUGF0aCkgdGhyb3dzIFJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIHsKLQkJdGhpcy5zZXR0aW5nc0ZpbGVOYW1lID0gZnVsbFBhdGg7Ci0JCWNyZWF0ZU9iamVjdE9mRG9jdW1lbnQoKTsKLQl9Ci0KLQkvLyBhZGQgYXR0cmlidXRlKGF0dE5hbWU9YXR0VmFsdWUpIG9mIGVsZSB3aXRob3V0IGNoZWNraW5nIG92ZXJsYXBwaW5nIG9mCi0JLy8gYW5vdGhlciBhdHRyaWJ1dGVzIG9mIGVsZS4KLQkvLyBpZiBvdmVybGFwcGluZyAsb3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTm9kZSBhZGRBdHRyaWJ1dGVBdChFbGVtZW50IGVsZSwgU3RyaW5nIGF0dE5hbWUsIFN0cmluZyBhdHRWYWx1ZSkgewotCQlBdHRyIGF0dCA9IGZEb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoYXR0TmFtZSk7Ci0JCWF0dC5zZXRWYWx1ZShhdHRWYWx1ZSk7Ci0JCWlmIChlbGUgIT0gbnVsbCkKLQkJCWVsZS5zZXRBdHRyaWJ1dGVOb2RlKGF0dCk7Ci0JCXJldHVybiBlbGU7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgYWRkRWxlbWVudFVuZGVyKE5vZGUgcGFyZW50LCBTdHJpbmcgdGFnTmFtZSwgTWFwIGF0dE1hcCkgewotCQlpZiAocGFyZW50ID09IG51bGwgfHwgdGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUVsZW1lbnQgZSA9IGZEb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpOwotCQlpZiAoYXR0TWFwICE9IG51bGwpIHsKLQkJCWlmICghYXR0TWFwLmlzRW1wdHkoKSkgewotCQkJCVNldCBhdHRLZXlzID0gYXR0TWFwLmtleVNldCgpOwotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBhdHRLZXlzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQkJZS5zZXRBdHRyaWJ1dGUoa2V5LCAoU3RyaW5nKSBhdHRNYXAuZ2V0KGtleSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwYXJlbnQuYXBwZW5kQ2hpbGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBOb2RlIGFkZEVsZW1lbnRVbmRlclJvb3QoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIGFkZEVsZW1lbnRVbmRlcihyb290LCB0YWdOYW1lLCBudWxsKTsKLQl9Ci0KLQkvLyBhZGQgZWxlbWVudCB3aXRoIGF0dE1hcCBhcyBhdHRyaWJ1dGUgd2l0aG91dCBjaGVja2luZyBvdmVybGFwcGluZy4KLQlwcm90ZWN0ZWQgZmluYWwgTm9kZSBhZGRFbGVtZW50VW5kZXJSb290KFN0cmluZyB0YWdOYW1lLCBNYXAgYXR0TWFwKSB7Ci0JCXJldHVybiBhZGRFbGVtZW50VW5kZXIocm9vdCwgdGFnTmFtZSwgYXR0TWFwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlT2JqZWN0T2ZEb2N1bWVudCgpIHRocm93cyBSZWFkQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlmRG9jdW1lbnQgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IEZpbGUoc2V0dGluZ3NGaWxlTmFtZSkpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIHBhcnNpbmciICsgc2V0dGluZ3NGaWxlTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiSS9PIGV4Y2VwdGlvbiBwYXJzaW5nIiArIHNldHRpbmdzRmlsZU5hbWUsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIGFjY2Vzc2luZyBET01JbXBsZW1lbnRhdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIGFjY2Vzc2luZyBET01JbXBsZW1lbnRhdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy9nZXQgdGhlIHJvb3Qgb2YgdGhlIFhNTCBmRG9jdW1lbnQKLQkJcm9vdCA9IGZEb2N1bWVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKCJFcnJvcjogTm9kZSByb290PT1udWxsIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBnZXRBdHRyaWJ1dGVzT2YoTm9kZSBub2RlKSB7Ci0JCWlmICghbm9kZS5oYXNBdHRyaWJ1dGVzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCU5hbWVkTm9kZU1hcCBhdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQlpbnQgc2l6ZSA9IGF0dHJzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJQXR0ciBhdHRyID0gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQltYXAucHV0KGF0dHIuZ2V0TmFtZSgpLCBhdHRyLmdldFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiAobWFwKTsKLQl9Ci0KLQlwcml2YXRlIE5vZGUgZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUoTm9kZSBmaXJzdCwgU3RyaW5nIGF0dE5hbWUsIFN0cmluZyBhdHRWYWx1ZSkgewotCQlOb2RlIG5hdnBvaW50ID0gZmlyc3Q7Ci0JCXdoaWxlIChuYXZwb2ludCAhPSBudWxsKSB7Ci0JCQlpZiAobmF2cG9pbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCU5hbWVkTm9kZU1hcCBtID0gbmF2cG9pbnQuZ2V0QXR0cmlidXRlcygpOwotCQkJCWlmIChtID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChtLmdldE5hbWVkSXRlbShhdHROYW1lKSAhPSBudWxsKSB7Ci0JCQkJCWlmIChhdHRWYWx1ZS5lcXVhbHMoKChBdHRyKSBtLmdldE5hbWVkSXRlbShhdHROYW1lKSkuZ2V0Tm9kZVZhbHVlKCkpKQotCQkJCQkJcmV0dXJuIG5hdnBvaW50OwotCQkJCX0KLQkJCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gbmF2cG9pbnQuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWlmIChjaGlsZE5vZGVzICE9IG51bGwgJiYgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkJTm9kZSBob2xkTm9kZSA9IGdldEVsZW1lbnRXaXRoQXR0cmlidXRlKG5hdnBvaW50LmdldEZpcnN0Q2hpbGQoKSwgYXR0TmFtZSwgYXR0VmFsdWUpOwotCQkJCQlpZiAoaG9sZE5vZGUgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGhvbGROb2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJbmF2cG9pbnQgPSBuYXZwb2ludC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gcmV0dXJuIGEgKGZpcnN0KSBFbGVtZW50IHdpdGggYXR0cihhdHROYW1lPWF0dFZhbHVlKSBpdCBpZiBleGlzdHMsCi0JLy8gb3RoZXJ3aXNlIHJldHVybiBudWxsCi0JcHJvdGVjdGVkIE5vZGUgZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUoU3RyaW5nIGF0dE5hbWUsIFN0cmluZyBhdHRWYWx1ZSkgewotCQlpZiAoYXR0TmFtZSA9PSBudWxsIHx8IGF0dFZhbHVlID09IG51bGwgfHwgIWZEb2N1bWVudC5oYXNDaGlsZE5vZGVzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldEVsZW1lbnRXaXRoQXR0cmlidXRlKGZEb2N1bWVudC5nZXRGaXJzdENoaWxkKCksIGF0dE5hbWUsIGF0dFZhbHVlKTsKLQl9Ci0KLQkvLyByZXRydW4gRWxlbWVudCB3aGljaCBoYXMgbm9kZU5hbWUgYXMgTm9kZSBOYW1lCi0JcHJvdGVjdGVkIE5vZGUgZ2V0RWxlbWVudFdpdGhOb2RlTmFtZShTdHJpbmcgbm9kZU5hbWUpIHsKLQkJaWYgKG5vZGVOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZUxpc3Qgbm9kZXMgPSBmRG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobm9kZU5hbWUpOwotCQlpZiAobm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXR1cm4gbm9kZXMuaXRlbSgwKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludFRyZWUoTm9kZUl0ZXJhdG9yIGl0ZXIpIHsKLQkJTm9kZSBuOwotCQl3aGlsZSAoKG4gPSBpdGVyLm5leHROb2RlKCkpICE9IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihuLmdldE5vZGVOYW1lKCkgKyAiOiIpOy8vJE5PTi1OTFMtMSQKLQkJCU5hbWVkTm9kZU1hcCBtID0gbi5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlpZiAobSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlTdHJpbmcgYXR0TmFtZSA9IG0uaXRlbShpKS5nZXROb2RlTmFtZSgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnQoIiAiICsgYXR0TmFtZSArICI9IiArIG0uaXRlbShpKS5nZXROb2RlVmFsdWUoKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCi0JLy8gcmVtb3ZlIGF0dHJpYnV0ZShhdHROYW1lKSBhdCBlbGUuCi0JcHJvdGVjdGVkIEF0dHIgcmVtb3ZlQXR0cmlidXRlQXQoRWxlbWVudCBlbGUsIFN0cmluZyBhdHROYW1lKSB7Ci0JCWlmIChlbGUgPT0gbnVsbCB8fCBhdHROYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQXR0ciBhdHQgPSBlbGUuZ2V0QXR0cmlidXRlTm9kZShhdHROYW1lKTsKLQkJZWxlLnJlbW92ZUF0dHJpYnV0ZShhdHROYW1lKTsKLQkJcmV0dXJuIGF0dDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudCByZW1vdmVFbGVtZW50V2l0aChTdHJpbmcgbm9kZU5hbWUpIHsKLQkJTm9kZUxpc3Qgbm9kZXMgPSBmRG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobm9kZU5hbWUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCW5vZGVzLml0ZW0oaSkuZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKG5vZGVzLml0ZW0oaSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIHJlbW92ZSBhIChmaXJzdCkgRWxlbWVudCB3aXRoIGF0dHIoYXR0TmFtZT1hdHRWYWx1ZSkgYW5kIHJldHVybiBpdCBpZgotCS8vIGV4aXN0cywgb3RoZXJ3aXNlIHJldHVybiBudWxsCi0JcHJvdGVjdGVkIEVsZW1lbnQgcmVtb3ZlRWxlbWVudFdpdGgoU3RyaW5nIGF0dE5hbWUsIFN0cmluZyBhdHRWYWx1ZSkgewotCQlpZiAoZkRvY3VtZW50Lmhhc0NoaWxkTm9kZXMoKSkgewotCQkJTm9kZSBlbGVtZW50ID0gZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0VmFsdWUpOwotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQllbGVtZW50LmdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZChlbGVtZW50KTsKLQkJCQlyZXR1cm4gKEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQkvLyB1cGRhdGUgYXR0cmlidXRlKGF0dE5hbWU9bmV3VmFsdWUpIGF0IGVsZSBpZiBib3RoIGVsZSBhbmQgYXR0cmlidXRlIG9mCi0JLy8gZWxlIGV4aXN0Ci0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQXR0cmlidXRlQXQoRWxlbWVudCBlbGUsIFN0cmluZyBhdHROYW1lLCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJQXR0ciBhdHQgPSBudWxsOwotCQlpZiAoZWxlICE9IG51bGwpCi0JCQlpZiAoKGF0dCA9IGVsZS5nZXRBdHRyaWJ1dGVOb2RlKGF0dE5hbWUpKSAhPSBudWxsKQotCQkJCWF0dC5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGVEb2N1bWVudChPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIHsKLQkJWE1MRG9jdW1lbnRXcml0ZXIgd3JpdGVyID0gbmV3IFhNTERvY3VtZW50V3JpdGVyKG91dCk7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIuc2VyaWFsaXplKGZEb2N1bWVudCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl3cml0ZXIuY2xvc2UoKTsKLQkJfQotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvZGVkSU8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29kZWRJTy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjMxODI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29kZWRJTy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LklsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvZGVkSU8gewotCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0JVRl9TSVpFID0gMTAyNCAqIDg7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfTUFSS19TSVpFID0gTUFYX0JVRl9TSVpFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fU1BFQ19ERUZBVUxUID0gIk5vU3BlY0RlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIG92ZXJyaWRlbkNoYXJzZXRzID0gbnVsbDsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZXJlIGFyZSB0d28gd2VsbCBrbm93biB1bmRlcnN0b29kIGNhc2VzIHdoZXJlIHRoZSBzdGFuZGFyZC9kZWZhdWx0Ci0JICogSmF2YSBNYXBwaW5ncyBhcmUgbm90IHN1ZmZpY2llbnQuIChUaGFua3MgdG8gSGlyb3Rha2EgTWF0c3Vtb3RvIGZvcgotCSAqIHByb3ZpZGluZyB0aGVzZSB0d28pLiBJIGJlbGlldmUgdGhlcmUgYXJlIG90aGVycyB0aGF0IGluZGl2aWR1YWwKLQkgKiBjdXN0b21lcnMgaGF2ZSByZXF1ZXN0ZWQgdG8gb3ZlcnJpZGUgb24gYSBjYXNlIGJ5IGNhc2UgYmFzaXMsIGJ1dCBJJ3ZlCi0JICogbG9zdCB0aGUgZGV0YWlscy4gVE9ETy1mdXR1cmU6IGRvY3VtZW50IHNvbWUgb2YgdGhvc2UgdXNlLWNhc2VzLgotCSAqIDwvcD4KLQkgKiA8dWw+Ci0JICogPGxpPklTTy04ODU5LTgtSTwvbGk+Ci0JICogPHA+Ci0JICogSW4gdGhlIGNvZGUgY29udmVyc2lvbiBwb2ludCBvZiB2aWV3LCBJU08tOTk1OS04IGFuZCBJU08tODg1OS04LUkgYXJlCi0JICogdGhlIHNhbWUuIEhvd2V2ZXIuIHRoZSByZXByZXNlbnRhdGlvbiBvbiB0aGUgYnJvd3NlciBpcyBkaWZmZXJlbnQuICgKLQkgKiBJdCdzIHZlcnkgdmVyeSBoYXJkIHRvIGV4cGxhaW4gdGhpcyBpbnRvIHRoZSB3b3JkcywgYnV0IG9uY2UgeW91IHdpbGwKLQkgKiBzZWUsIHlvdSB3aWxsIHVuZGVyc3RhbmQgaXQgOikgTWFueSBCaURpIEhUTUwvSlNQcyB1c2UgSVNPLTg4NTktOC1JIGluCi0JICogTUVUQS9wYWdlIGRpcmVjdGl2ZS4gU28gV1NBRCBuZWVkcyB0byBzdXBwb3J0IHRoaXMgZW5jb2RpbmcuCi0JICogPC9wPgotCSAqIDxsaT5YLVNKSVM8L2xpPgotCSAqIDxwPgotCSAqIEJlY2F1c2UgTW9zYWljL05hdmlnYXRvciAyLjAgc3VwcG9ydGVkIG9ubHkgWC1TSklTL1gtRVVDLUpQLCBsb3RzIG9mCi0JICogb2xkIEhUTUwgZmlsZXMgdXNlZCBYLVNKSVMvWC1FVUMtSlAgc28gdGhhdCB0aGUgY3VzdG9tZXJzIHN0aWxsIHdhbnQgdXMKLQkgKiB0byBzdXBwb3J0IHRoaXMgY29kZSBjb252ZXJzaW9uIGZvciBIVE1MIGZpbGVzLgotCSAqIDwvcD4KLQkgKiA8L3VsPgotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHJldHVybiB0aGUgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgaWYgbm8gb3ZlcnJpZGVzLCBvdGhlcndpc2UgdGhlIGNoYXJzZXQKLQkgKiAgICAgICAgIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKi8KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWxpYmVyYXRseSAnZGVmYXVsdCBhY2Nlc3MnIHNpbmNlIGNsaWVudHMgc2hvdWxkIG5vdAotCSAqIG5lZWQgdG8gYWNjZXNzIHRoaXMgaW5mb3JtYXRpb24gZGlyZWN0bHkuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCS8vIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdoYXQgd2FzIHBhc3NlZCBpbiwgaWYKLQkJLy8gdGhlcmUgYXJlIG5vCi0JCS8vIG92ZXJyaWRlcy4KLQkJU3RyaW5nIHJlc3VsdCA9IGRldGVjdGVkQ2hhcnNldE5hbWU7Ci0JCVN0cmluZyBuZXdSZXN1bHQgPSBnZXRPdmVycmlkZW5DaGFyc2V0cygpLmdldFByb3BlcnR5KGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQlpZiAobmV3UmVzdWx0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IG5ld1Jlc3VsdDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBFbmNvZGluZ01lbWVudG8gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGJ5dGVbXSBkZXRlY3RlZEJvbSwgU3RyaW5nIGphdmFDaGFyc2V0TmFtZSwgU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUsIFN0cmluZyB1blN1cHBvcnRlZE5hbWUsIFN0cmluZyBzcGVjRGVmYXVsdEVuY29kaW5nLCBTdHJpbmcgcmVhc29uKSB7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCXJlc3VsdC5zZXRKYXZhQ2hhcnNldE5hbWUoamF2YUNoYXJzZXROYW1lKTsKLQkJcmVzdWx0LnNldERldGVjdGVkQ2hhcnNldE5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIFRPRE86IGlmIGRldGVjdGVkQ2hhcnNldCBhbmQgc3BlYyBkZWZhdWx0IGlzCi0JCS8vIG51bGwsIG5lZWQgdG8gdXNlICJ3b3JrCi0JCS8vIGJlbmNoIGJhc2VkIiBkZWZhdWx0cy4KLQkJaWYgKHNwZWNEZWZhdWx0RW5jb2RpbmcgPT0gbnVsbCkKLQkJCXJlc3VsdC5zZXRBcHByb3ByaWF0ZURlZmF1bHQoTk9fU1BFQ19ERUZBVUxUKTsKLQkJZWxzZQotCQkJcmVzdWx0LnNldEFwcHJvcHJpYXRlRGVmYXVsdChzcGVjRGVmYXVsdEVuY29kaW5nKTsKLQkJaWYgKHVuU3VwcG9ydGVkTmFtZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0SW52YWxpZEVuY29kaW5nKHVuU3VwcG9ydGVkTmFtZSk7Ci0JCX0KLQkJLy8gY2hlY2sgaWYgdmFsaWQKLQkJdHJ5IHsKLQkJCUNoYXJzZXQuaXNTdXBwb3J0ZWQoamF2YUNoYXJzZXROYW1lKTsKLQkJfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdC5zZXRJbnZhbGlkRW5jb2RpbmcoamF2YUNoYXJzZXROYW1lKTsKLQkJfQotCi0JCS8vIGNoZWNrIFVURjgzQnl0ZUJPTVVzZWQgYW5kIFVuaWNvZGVTdHJlYW0KLQkJaWYgKGRldGVjdGVkQm9tICE9IG51bGwpIHsKLQkJCWlmIChkZXRlY3RlZEJvbS5sZW5ndGggPT0gMikKLQkJCQlyZXN1bHQuc2V0VW5pY29kZVN0cmVhbSh0cnVlKTsKLQkJCWVsc2UgaWYgKGRldGVjdGVkQm9tLmxlbmd0aCA9PSAzKQotCQkJCXJlc3VsdC5zZXRVVEY4M0J5dGVCT01Vc2VkKHRydWUpOwotCQkJcmVzdWx0LnNldFVuaWNvZGVCT00oZGV0ZWN0ZWRCb20pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVuY29kaW5nTWVtZW50byBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJcmV0dXJuIGNyZWF0ZUVuY29kaW5nTWVtZW50byhkZXRlY3RlZENoYXJzZXROYW1lLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBvbmNlIHRoaXMgaW5zdGFuY2UgaXMgY3JlYXRlZCwgdHJhY2UgaW5mbyBzdGlsbCBuZWVkcyB0byBiZQotCSAqIGFwcGVuZGVkIGJ5IGNhbGxlciwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IGl0cyBjcmVhdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW5jb2RpbmdNZW1lbnRvIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbikgewotCQlyZXR1cm4gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGRldGVjdGVkQ2hhcnNldE5hbWUsIHJlYXNvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVuY29kaW5nTWVtZW50byBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUsIFN0cmluZyByZWFzb24sIFN0cmluZyBzcGVjRGVmYXVsdEVuY29kaW5nKSB7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCXJlc3VsdCA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJU3RyaW5nIGphdmFDaGFyc2V0ID0gZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJcmVzdWx0LnNldEphdmFDaGFyc2V0TmFtZShqYXZhQ2hhcnNldCk7Ci0JCXJlc3VsdC5zZXREZXRlY3RlZENoYXJzZXROYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyBUT0RPOiBpZiBkZXRlY3RlZENoYXJzZXQgYW5kIHNwZWMgZGVmYXVsdCBpcwotCQkvLyBudWxsLCBuZWVkIHRvIHVzZSAid29yawotCQkvLyBiZW5jaCBiYXNlZCIgZGVmYXVsdHMuCi0JCWlmIChzcGVjRGVmYXVsdEVuY29kaW5nID09IG51bGwpCi0JCQlyZXN1bHQuc2V0QXBwcm9wcmlhdGVEZWZhdWx0KE5PX1NQRUNfREVGQVVMVCk7Ci0JCWVsc2UKLQkJCXJlc3VsdC5zZXRBcHByb3ByaWF0ZURlZmF1bHQoc3BlY0RlZmF1bHRFbmNvZGluZyk7Ci0JCS8vIGNoZWNrIGlmIHZhbGlkCi0JCXRyeSB7Ci0JCQlDaGFyc2V0LmlzU3VwcG9ydGVkKGphdmFDaGFyc2V0KTsKLQkJfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdC5zZXRJbnZhbGlkRW5jb2RpbmcoamF2YUNoYXJzZXQpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuIG51bGwsIGlmIGludmFsaWQgY2hhcnNldCBuYW1lIChpbiB3aGljaCBjYXNlCi0JICogImFwcHJvcHJpYXRlRGVmYXVsdCIgc2hvdWxkIGJlIHVzZWQsIGlmIGEgbmFtZSBpcyByZWFsbHkgbmVlZCBmb3Igc29tZQotCSAqICJzYXZlIGFueXdheSIgY2FzZXMpLgotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJLy8gd2UgZG9uJ3QgYWxsb3cgbnVsbCBhcmd1bWVudCAob3IgcmlzayBOUEUgb3IKLQkJLy8gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGxhdGVyIGF0IHNldmVyYWwKLQkJLy8gcG9pbnRzLgotCQlBc3NlcnQuaXNOb3ROdWxsKGRldGVjdGVkQ2hhcnNldE5hbWUsICJpbGxlZ2FsIGNoYXJzZXQgYXJndW1lbnQuIGl0IGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZXN1bHQgPSBkZXRlY3RlZENoYXJzZXROYW1lOwotCQkvLyAxLiBDaGVjayBleHBsaWNpdCBtYXBwaW5nIG92ZXJyaWRlcyBmcm9tCi0JCS8vIHByb3BlcnR5IGZpbGUKLQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIDIuIFVzZSB0aGUgImNhbm9uaWNhbCIgbmFtZSBmcm9tIEpSRSBtYXBwaW5ncwotCQkvLyBOb3RlOiBzZWUgQ2hhcnNldCBKYXZhRG9jLCB0aGUgbmFtZSB5b3UgZ2V0IG9uZQotCQkvLyB3aXRoIGNhbiBiZSBhbGlhcywKLQkJLy8gdGhlIG5hbWUgeW91IGdldCBiYWNrIGlzICJzdGFuZGFyZCIgbmFtZS4KLQkJQ2hhcnNldCBqYXZhQ2hhcnNldCA9IG51bGw7Ci0JCS8vIE5vdGU6IHRoaXMgd2lsbCBpbW1lZGlhdGx5IHRocm93Ci0JCS8vICJVbnN1cHBvdGVkQ2hhcnNldEV4Y2VwdGlvbiIgaWYgaXQKLQkJLy8gaW52YWxpZC4gSXNzdWU6IElzIGl0IG1vcmUgY2xpZW50IGZyaWVuZGx5IHRvCi0JCS8vIGVhdCB0aGF0IGV4Y2VwdGlvbiBhbmQgcmV0dXJuIG51bGw/Ci0JCWphdmFDaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKHJlc3VsdCk7Ci0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBqYXZhQ2hhcnNldC5uYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG92ZXJyaWRlbkNoYXJzZXRzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgZ2V0T3ZlcnJpZGVuQ2hhcnNldHMoKSB7Ci0JCWlmIChvdmVycmlkZW5DaGFyc2V0cyA9PSBudWxsKSB7Ci0JCQlvdmVycmlkZW5DaGFyc2V0cyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlCdW5kbGUga2V5QnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKElDb2RlZFJlc291cmNlUGx1Z2luLklEKTsKLQkJCUlQYXRoIGtleVBhdGggPSBuZXcgUGF0aCgiY29uZmlnL292ZXJyaWRlLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJVVJMIGxvY2F0aW9uID0gUGxhdGZvcm0uZmluZChrZXlCdW5kbGUsIGtleVBhdGgpOwotCQkJSW5wdXRTdHJlYW0gcHJvcGVydGllc0lucHV0U3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcHJvcGVydGllc0lucHV0U3RyZWFtID0gbG9jYXRpb24ub3BlblN0cmVhbSgpOwotCQkJCW92ZXJyaWRlbkNoYXJzZXRzLmxvYWQocHJvcGVydGllc0lucHV0U3RyZWFtKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZiBjYW4ndCByZWFkLCBqdXN0IGFzc3VtZSB0aGVyZSdzIG5vCi0JCQkJLy8gb3ZlcnJpZGVzCi0JCQkJLy8gYW5kIHJlcGVhdGVkIGF0dGVtcHRzIHdpbGwgbm90IG9jY3VyLAotCQkJCS8vIHNpbmNlIHRoZXkKLQkJCQkvLyB3aWxsIGJlIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5Ci0JCQkJLy8gUHJvcGVydGllcyBvYmplY3QKLQkJCX0KLQkJfQotCQlyZXR1cm4gb3ZlcnJpZGVuQ2hhcnNldHM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjbGFzcyBuZWVkIG5vdCBiZSBpbnN0YW50aWF0ZWQgKHRob3VnaCBpdHMgc3ViY2xhc3NlcyBjYW4gYmUpLgotCSAqLwotCXByb3RlY3RlZCBDb2RlZElPKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBFbmNvZGluZ01lbWVudG8gY3JlYXRlTWVtZW50byhJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbikgewotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0OwotCQlTdHJpbmcgYXBwcm9wcmlhdGVEZWZhdWx0ID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCkuZ2V0RGVmYXVsdENoYXJzZXQoKTsKLQkJU3RyaW5nIGRldGVjdGVkQ2hhcnNldCA9IChTdHJpbmcpIGNvbnRlbnREZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCk7Ci0JCVN0cmluZyB1blN1cHBvcnRlZENoYXJzZXQgPSAoU3RyaW5nKSBjb250ZW50RGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQpOwotCQlTdHJpbmcgamF2YUNoYXJzZXQgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q2hhcnNldCgpOwotCQkvLyBpbnRlZ3JpdHkgY2hlY2tzIGZvciBkZWJ1Z2dpbmcKLQkJaWYgKGphdmFDaGFyc2V0ID09IG51bGwpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJjaGFyc2V0IGVxdWFsZWQgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGphdmFDaGFyc2V0Lmxlbmd0aCgpID09IDApIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJjaGFyc2V0IGVxdWFsZWQgZW1wdHlTdHJpbmchIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlieXRlW10gQk9NID0gKGJ5dGVbXSkgY29udGVudERlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKTsKLQkJLy9yZXN1bHQgPSAoRW5jb2RpbmdNZW1lbnRvKQotCQkvLyBjb250ZW50RGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkVOQ09ESU5HX01FTUVOVE8pOwotCQlyZXN1bHQgPSBjcmVhdGVFbmNvZGluZ01lbWVudG8oQk9NLCBqYXZhQ2hhcnNldCwgZGV0ZWN0ZWRDaGFyc2V0LCB1blN1cHBvcnRlZENoYXJzZXQsIGFwcHJvcHJpYXRlRGVmYXVsdCwgbnVsbCk7Ci0JCWlmICghcmVzdWx0LmlzVmFsaWQoKSkgewotCQkJcmVzdWx0LnNldEFwcHJvcHJpYXRlRGVmYXVsdChhcHByb3ByaWF0ZURlZmF1bHQpOwotCQkJLy8gaW50ZWdyaXR5IGNoZWNrIGZvciBkZWJ1Z2dpbmcgImludmFsaWQiIGNhc2VzLgotCQkJLy8gdGhlIGFwcHJyaWF0ZSBkZWZhdWx0IHdlIGhhdmUsIHNob3VsZCBlcXVhbCB3aGF0J3MgaW4gdGhlCi0JCQkvLyBkZXRlY3RlZCBmaWVsZC4gKG5vdCBzdXJlIHRoaXMgaXMgYWx3YXlzIHJlcXVpcmVkKQotCQkJaWYgKERFQlVHICYmIGFwcHJvcHJpYXRlRGVmYXVsdCAhPSBudWxsICYmICFhcHByb3ByaWF0ZURlZmF1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldCkpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiYXBwcm9wcmlhdGUgZGlkIG5vdCBlcXVhbCBkZXRlY3RlZCwgYXMgZXhwZWN0ZWQgZm9yIGludmFsaWQgY2hhcnNldCBjYXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29kZWRSZWFkZXJDcmVhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvZGVkUmVhZGVyQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTVjY2RiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29kZWRSZWFkZXJDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ29kaW5nRXJyb3JBY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLkJ1ZmZlcmVkTGltaXRlZFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuTnVsbElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLlVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zLlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWw7Ci0KLQotLyoqCi0gKiBUaGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIGNlbnRyYWxpemUgYW5hbHlzaXMgb2YgYSBmaWxlIHRvIGRldGVybWluZQotICogdGhlIG1vc3QgYXBwcm9wcmlhdGUgcnVsZXMgb2YgZGVjb2RpbmcgaXQuIFRoZSBpbnRlbmRlZCB1c2UgaXMgdG8gc2V0IHRoZQotICogaW5wdXQsIHRoZW4gZ2V0IHRoZSByZWFkZXIgZm9yIHRoYXQgaW5wdXQgd2hpY2ggd2lsbCBoYXZlIGl0cyBlbmNvZGluZyBzZXQKLSAqIGFwcHJvcHJpYXRlbHkuIEFkZGl0aW9uYWxseSwgdGhlcmUgaXMgYW4gRW5jb2RpbmdNZW1lbnRvIHByb3ZpZGVkLCB3aGljaAotICogd2lsbCBiZSByZXF1aXJlZCwgaW4gc29tZSBjYXNlcywgdG8gbGF0ZXIgZGV0ZXJtaW5lIHRoZSBtb3N0IGFwcHJvcHJpYXRlCi0gKiBmb3JtIG9mIGVuY29kZWQgb3V0cHV0LgotICovCi1wdWJsaWMgY2xhc3MgQ29kZWRSZWFkZXJDcmVhdG9yIGV4dGVuZHMgQ29kZWRJTyB7Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBmQ2xpZW50U3VwcGxpZWRTdHJlYW07Ci0KLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcml2YXRlIEVuY29kaW5nUnVsZSBmRW5jb2RpbmdSdWxlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZkZpbGVuYW1lOwotCi0JcHJpdmF0ZSBJRmlsZSBmSUZpbGU7Ci0KLQotCXByaXZhdGUgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSU0VUX1VURl8xNj0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUlNFVF9VVEZfMTZMRT0gIlVURi0xNkxFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIENvZGVkUmVhZGVyQ3JlYXRvcigpIHsKLQotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDb2RlZFJlYWRlckNyZWF0b3IoSUZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQl0aGlzKCk7Ci0JCXNldChmaWxlKTsKLQkJc2V0RW5jb2RpbmdSdWxlKEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQl9Ci0KLQlwdWJsaWMgQ29kZWRSZWFkZXJDcmVhdG9yKElGaWxlIGZpbGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJdGhpcygpOwotCQlzZXQoZmlsZSk7Ci0JCXNldEVuY29kaW5nUnVsZShlbmNvZGluZ1J1bGUpOwotCX0KLQotCXB1YmxpYyBDb2RlZFJlYWRlckNyZWF0b3IoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCi0JCXRoaXMoKTsKLQkJc2V0KGZpbGVuYW1lLCBpbnB1dFN0cmVhbSk7Ci0JCXNldEVuY29kaW5nUnVsZShFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0JfQotCi0JcHVibGljIENvZGVkUmVhZGVyQ3JlYXRvcihTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB7Ci0KLQkJdGhpcygpOwotCQlzZXQoZmlsZW5hbWUsIGlucHV0U3RyZWFtKTsKLQkJc2V0RW5jb2RpbmdSdWxlKGVuY29kaW5nUnVsZSk7Ci0JfQotCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gY2hlY2tGb3JFbmNvZGluZ0luQ29udGVudHMoSW5wdXRTdHJlYW0gbGltaXRlZFN0cmVhbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0KLQkJLy8gaWYgZW5jb2RpbmcgbWVtZW50byBhbHJlYWR5IHNldCwgdGhlbiBpRmlsZSBtdXN0Ci0JCS8vIGhhdmUgYmVlbiBzZXQsIGFuZCBubyBuZWVkIHRvIGdldCBhZ2Fpbi4KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChmQ2xpZW50U3VwcGxpZWRTdHJlYW0pIHsKLQkJCQl0cnkgewotCQkJCQlsaW1pdGVkU3RyZWFtLnJlc2V0KCk7Ci0JCQkJCUlDb250ZW50VHlwZU1hbmFnZXIgY29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JCQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gY29udGVudFR5cGVNYW5hZ2VyLmdldERlc2NyaXB0aW9uRm9yKGxpbWl0ZWRTdHJlYW0sIGZGaWxlbmFtZSwgSUNvbnRlbnREZXNjcmlwdGlvbi5BTEwpOwotCQkJCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCWZFbmNvZGluZ01lbWVudG8gPSBjcmVhdGVNZW1lbnRvKGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQkJCX0KLQkJCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWxpbWl0ZWRTdHJlYW0ucmVzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHN0YXRlOgotCQkJCS8vIGVuY29kaW5nTWVtZW50byB3YXMgbnVsbCBidXQgbm8gaW5wdXQgc3RyZWFtIHN1cHBsaWVkIGJ5Ci0JCQkJLy8gY2xpZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlc3VsdCAhPSBudWxsICYmICFyZXN1bHQuaXNWYWxpZCgpICYmICFmb3JjZURlZmF1bHQoKSkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwocmVzdWx0KTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc2V0dGFibGVMaW1pdGVkU3RyZWFtCi0JICovCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gY2hlY2tTdHJlYW1Gb3JCT00oSW5wdXRTdHJlYW0gcmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0pIHsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCVVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yIHVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yID0gbmV3IFVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yKCk7Ci0JCXVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yLnNldChyZXNldHRhYmxlTGltaXRlZFN0cmVhbSk7Ci0JCXJlc3VsdCA9IHVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yLmdldEVuY29kaW5nTWVtZW50bygpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpRmlsZQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBmaW5kTWVtZW50b0Zyb21GaWxlQ2FzZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBUaGlzIG1ldGhvZCBwcm92aWRlcyBwb3NzaWJsZSBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhdCB0aGUKLQkJCS8vIGNvc3Qgb2Ygc29tZXRpbWVzIHJldHVybmluZyBudWxsCi0JCQlpZiAoZklGaWxlLmV4aXN0cygpKQotCQkJCWNvbnRlbnREZXNjcmlwdGlvbiA9IGZJRmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBBc3N1bWUgaWYgY29yZSBleGNlcHRpb24gb2NjdXJzLCB3ZSBjYW4gc3RpbGwgdHJ5IG1vcmUKLQkJCS8vIGV4cGVuc2l2ZQotCQkJLy8gZGlzY292ZXJ5IG9wdGlvbnMuCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWlmIChjb250ZW50RGVzY3JpcHRpb24gPT0gbnVsbCAmJiBmSUZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY29udGVudHMgPSBmSUZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQljb250ZW50RGVzY3JpcHRpb24gPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXREZXNjcmlwdGlvbkZvcihjb250ZW50cywgZklGaWxlLmdldE5hbWUoKSwgSUNvbnRlbnREZXNjcmlwdGlvbi5BTEwpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCQkvLyBBc3N1bWUgaWYgY29yZSBleGNlcHRpb24gb2NjdXJzLCB3ZSBjYW4ndCByZWFsbHkgZG8gbXVjaAotCQkJCS8vIHdpdGgKLQkJCQkvLyBkZXRlcm1pbmluZyBlbmNvZGluZywgZXRjLgotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQkJCXRocm93IGUxOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0JCQkJLy8gV2UgbGlrZWx5IGNvdWxkbid0IGdldCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUsIHNvbWV0aGluZwotCQkJCS8vIGlzIHJlYWxseSB3cm9uZwotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXRocm93IGUyOwotCQkJfQotCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQljb250ZW50cy5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZTIpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlTWVtZW50byhjb250ZW50RGVzY3JpcHRpb24pOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcHJpbWFyeSBtZXRob2Qgd2hpY2ggY29udGFpbnMgdGhlIGhpZ2hlc3QgbGV2ZWwgcnVsZXMgZm9yIGhvdyB0bwotCSAqIGRlY2lkZSBhcHByb3ByaWF0ZSBkZWNvZGluZyBydWxlczogMS4gZmlyc3QgY2hlY2sgZm9yIHVuaWNvZGUgc3RyZWFtIDIuCi0JICogdGhlbiBsb29rZWQgZm9yIGVuY29kaW5nIHNwZWNpZmllZCBpbiBjb250ZW50IChhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YKLQkgKiBjb250ZW50IHRoYXQgaXMgaXQgLi4uIHhtbCwgaHRtbCwganNwLCBldGMuIDMuIHRoZW4gY2hlY2sgZm9yIHZhcmlvdXMKLQkgKiBzZXR0aW5nczogZmlsZSBzZXR0aW5ncyBmaXJzdCwgaWYgbnVsbCBjaGVjayBwcm9qZWN0IHNldHRpbmdzLCBpZiBudWxsLAotCSAqIGNoZWNrIHVzZXIgcHJlZmVyZW5jZXMuIDQuIGxhc3RseSAob3IsIHdoYXQgaXMgdGhlIGxhc3QgdXNlcgotCSAqIHByZWZlcmVuY2UpIGlzIHRvIHVzZSAid29ya2JlbmNoIGRlZmF1bHRzIi4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZmluZE1lbWVudG9Gcm9tU3RyZWFtQ2FzZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIHJlc2V0dGFibGVMaW1pdGVkU3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc2V0dGFibGVMaW1pdGVkU3RyZWFtID0gZ2V0TGltaXRlZFN0cmVhbShnZXRSZXNldHRhYmxlU3RyZWFtKCkpOwotCQkJaWYgKHJlc2V0dGFibGVMaW1pdGVkU3RyZWFtICE9IG51bGwpIHsKLQkJCQkvLyBmaXJzdCBjaGVjayBmb3IgdW5pY29kZSBzdHJlYW0KLQkJCQlyZXN1bHQgPSBjaGVja1N0cmVhbUZvckJPTShyZXNldHRhYmxlTGltaXRlZFN0cmVhbSk7Ci0JCQkJLy8gaWYgbm90IHRoYXQsIHRoZW4gY2hlY2sgY29udGVudHMKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0ucmVzZXQoKTsKLQkJCQkJcmVzdWx0ID0gY2hlY2tGb3JFbmNvZGluZ0luQ29udGVudHMocmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0pOwotCQkJCX0KLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gc3RyZWFtIG51bGwsIG1heSBuYW1lJ3Mgbm90LgotCQkJCWlmIChmRmlsZW5hbWUgIT0gbnVsbCkgewotCQkJCQkvLyBmaWxlbmFtZSBub3QgbnVsbAotCQkJCQlJQ29udGVudFR5cGVNYW5hZ2VyIGNvbnRlbnRUeXBlTWFuYWdlciA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOwotCQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGNvbnRlbnRUeXBlTWFuYWdlci5nZXREZXNjcmlwdGlvbkZvcihuZXcgTnVsbElucHV0U3RyZWFtKCksIGZGaWxlbmFtZSwgSUNvbnRlbnREZXNjcmlwdGlvbi5BTEwpOwotCQkJCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IGNyZWF0ZU1lbWVudG8oY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChyZXNldHRhYmxlTGltaXRlZFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJaGFuZGxlU3RyZWFtQ2xvc2UocmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0pOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGZvcmNlRGVmYXVsdCgpIHsKLQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZkVuY29kaW5nUnVsZSAhPSBudWxsICYmIGZFbmNvZGluZ1J1bGUgPT0gRW5jb2RpbmdSdWxlLkZPUkNFX0RFRkFVTFQpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBSZWFkZXIgZ2V0Q29kZWRSZWFkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0JCVJlYWRlciByZXN1bHQgPSBudWxsOwotCQkvLyB3ZSBtYWtlIGEgbG9jYWwgY29weSBvZiBlbmNvZGluZyBtZW1lbnRvIHNvCi0JCS8vIHN0cmVhbSB3b24ndAotCQkvLyBiZSBhY2Nlc3NlZCBzaW11bHRhbmVvdXNseS4KLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9IGdldEVuY29kaW5nTWVtZW50bygpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGVuY29kaW5nTWVtZW50bywgIkFwcGVhcnMgcmVhZGVyIHJlcXVlc3RlZCBiZWZvcmUgZmlsZSBvciBzdHJlYW0gc2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJSW5wdXRTdHJlYW0gc3RyZWFtVG9SZXR1cm4gPSBnZXRSZXNldHRhYmxlU3RyZWFtKCk7Ci0JCXN0cmVhbVRvUmV0dXJuLnJlc2V0KCk7Ci0JCS8vIGlmIFVURiAzIGJ5dGUgQk9NIGlzIHVzZWQgKG9yIFVURi0xNkxFKSwgdGhlCi0JCS8vIGJ1aWx0IGluIGNvbnZlcnRlcnMKLQkJLy8gZG9uJ3QKLQkJLy8gY29ycmVjdCBza2lwIGFsbCB0aHJlZSBieXRlcyAuLi4gc28gc2tpcAotCQkvLyByZW1haW5pbmcgb25lIHRvIGxlYXZlCi0JCS8vIHN0cmVhbSB0cmFuc3BhcmVudGx5IHJlYWR5IGZvciBjbGllbnQuCi0JCS8vIHNlZSAuLi4gVE9ETyBsb29rIHVwIGJ1ZyBudW1iZXIKLQkJaWYgKGVuY29kaW5nTWVtZW50by5pc1VuaWNvZGVTdHJlYW0oKSkgewotCQkJc3RyZWFtVG9SZXR1cm4uc2tpcCgyKTsKLQkJfQotCQllbHNlIGlmIChlbmNvZGluZ01lbWVudG8uaXNVVEY4M0J5dGVCT01Vc2VkKCkpIHsKLQkJCXN0cmVhbVRvUmV0dXJuLnNraXAoMyk7Ci0JCX0KLQkJU3RyaW5nIGNoYXJzZXROYW1lID0gZW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCQlpZiAoY2hhcnNldE5hbWUgPT0gbnVsbCkgewotCQkJY2hhcnNldE5hbWUgPSBlbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQl9Ci0JCWlmICghZW5jb2RpbmdNZW1lbnRvLmlzVmFsaWQoKSAmJiAhZm9yY2VEZWZhdWx0KCkpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsKGVuY29kaW5nTWVtZW50byk7Ci0JCX0KLQotCQlpZiAoZkVuY29kaW5nUnVsZSA9PSBFbmNvZGluZ1J1bGUuRk9SQ0VfREVGQVVMVCkgewotCQkJY2hhcnNldE5hbWUgPSBlbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCk7Ci0JCX0KLQkJCi0JCS8vIFsyMjgzNjZdIEZvciBmaWxlcyB0aGF0IGhhdmUgYSB1bmljb2RlIEJPTSwgYW5kIGEgY2hhcnNldCBuYW1lIG9mIFVURi0xNiwgdGhlIGNoYXJzZXQgZGVjb2RlciBuZWVkcyAiVVRGLTE2TEUiCi0JCWlmKENIQVJTRVRfVVRGXzE2LmVxdWFscyhjaGFyc2V0TmFtZSkgJiYgZW5jb2RpbmdNZW1lbnRvLmdldFVuaWNvZGVCT00oKSA9PSBJQ29udGVudERlc2NyaXB0aW9uLkJPTV9VVEZfMTZMRSkKLQkJCWNoYXJzZXROYW1lID0gQ0hBUlNFVF9VVEZfMTZMRTsKLQkJCi0JCUNoYXJzZXQgY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShjaGFyc2V0TmFtZSk7Ci0JCUNoYXJzZXREZWNvZGVyIGNoYXJzZXREZWNvZGVyID0gY2hhcnNldC5uZXdEZWNvZGVyKCk7Ci0JCWlmIChmRW5jb2RpbmdSdWxlID09IEVuY29kaW5nUnVsZS5JR05PUkVfQ09OVkVSU0lPTl9FUlJPUikgewotCQkJY2hhcnNldERlY29kZXIub25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbi5SRVBMQUNFKTsKLQkJCWNoYXJzZXREZWNvZGVyLm9uVW5tYXBwYWJsZUNoYXJhY3RlcihDb2RpbmdFcnJvckFjdGlvbi5SRVBMQUNFKTsKLQkJfQotCQllbHNlIHsKLQkJCWNoYXJzZXREZWNvZGVyLm9uTWFsZm9ybWVkSW5wdXQoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUKTsKLQkJCWNoYXJzZXREZWNvZGVyLm9uVW5tYXBwYWJsZUNoYXJhY3RlcihDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlQpOwotCQl9Ci0JCS8vIG1vcmUgZWZmaWNpZW50IHRvIGJlIGJ1ZmZlcmVkLCBhbmQgSSBrbm93IG9mIG5vCi0JCS8vIHJlYXNvbiBub3QgdG8gcmV0dXJuCi0JCS8vIHRoYXQgZGlyZWN0bHkuCi0JCXJlc3VsdCA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtVG9SZXR1cm4sIGNoYXJzZXREZWNvZGVyKSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQlyZXN1bHQubWFyayhDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvLyBmaWd1cmUgb3V0IGVuY29kaW5nIG1lbWVudG8gZnJvbSBlbmNvZGluZyBzdHJhdGVneQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQlpZiAoZkNsaWVudFN1cHBsaWVkU3RyZWFtKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50byA9IGZpbmRNZW1lbnRvRnJvbVN0cmVhbUNhc2UoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZJRmlsZSAhPSBudWxsKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50byA9IGZpbmRNZW1lbnRvRnJvbUZpbGVDYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiBlbmNvZGluZyBzdHJhdGFneSBkb2Vzbid0IHByb3ZpZGUgYW5zd2VyLAotCQkvLyB0aGVuIHRyeSBmaWxlIHNldHRpbmdzLCBwcm9qZWN0IHNldHRpbmdzLAotCQkvLyB1c2VyIHByZWZlcmVuY2VzLCBhbmQKLQkJLy8gZmluYWxseSB3b3JrYmVuY2ggZGVmYXVsdC4KLQkJLy8KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCB8fCBmRW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gZ2V0RW5jb2RpbmdNZW1lbnRvRnJvbVJlc291cmNlQW5kUHJlZmVyZW5jZSgpOwotCQl9Ci0KLQkJLy8gdXNlIERlZmF1bHROYW1lUnVsZXMgZnJvbSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzIGFzIHRoZSBmaW5hbAotCQkvLyBkZWZhdWx0Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBoYW5kbGVOb3RQcm92aWRlZEZyb21Db250ZW50Q2FzZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGZFbmNvZGluZ01lbWVudG87Ci0JfQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25seSB3aGVuIGVuY29kaW5nIGlzIG5vdCBkZXRlY3RlZCBpbiB0aGUgZmlsZS4KLQkgKiAKLQkgKiBIZXJlIGlzIGVuY29kaW5nIGxvb2t1cCBvcmRlciB3ZSB3aWxsIHRyeTogLSB0cnkgcmVzb3VyY2UgY29udGVudAotCSAqIGRlc2NyaXB0aW9uIChFY2xpcHNlIFRleHQgZmlsZSBlbmNvZGluZykgLSB0cnkgcmVzb3VyY2UgY29udGVudAotCSAqIHByb3BlcnRpZXMgKGZvciBKU1Agb25seSkgLSB0cnkgY29udGVudCB0eXBlIGVuY29kaW5nIHByZWZlcmVuY2VzIChmb3IKLQkgKiBIVE1MIG9ubHkpIC0gdHJ5IHJlc291cmNlIGNvbnRlbnQgZGVzY3JpcHRpb24gKEVjbGlwc2UgVGV4dCBmaWxlCi0JICogZW5jb2RpbmcsIGltcGxpY2l0IGNoZWNrKQotCSAqIAotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGFwcGVhcnMgaW4gYm90aCBDb2RlZFJlYWRlckNyZWF0b3IgYW5kCi0JICogQ29kZWRTdHJlYW1DcmVhdG9yICh3aXRoIGp1c3QgYSBtaW5vciBkaWZmZXJlbmNlKS4gVGhleSBzaG91bGQgYmUga2VwdAotCSAqIHRoZSBzYW1lLgotCSAqLwotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50b0Zyb21SZXNvdXJjZUFuZFByZWZlcmVuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gZkVuY29kaW5nTWVtZW50bzsKLQotCQkvLyBGb2xsb3cgRWNsaXBzZSBQbGF0Zm9ybSdzIGRpcmVjdGlvbi4gR2V0IHRoZSBjaGFyc2V0IGZyb20gSUZpbGUuCi0JCWlmIChmSUZpbGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNoYXJzZXQgPSBmSUZpbGUuZ2V0Q2hhcnNldCgpOwotCQkJZW5jb2RpbmdNZW1lbnRvID0gQ29kZWRJTy5jcmVhdGVFbmNvZGluZ01lbWVudG8oY2hhcnNldCk7Ci0JCX0KLQotCQlyZXR1cm4gZW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCBhbiBJbnB1dFN0cmVhbSBoYXMgbWFyay9yZXNldCBzdXBwb3J0LCBpcyByZWFkbGltaXQgaXMKLQkgKiBzZXQsIGFuZCB0aGF0IHRoZSBzdHJlYW0gaXMgImxpbWl0YWJsZSIgKHRoYXQgaXMsIHJlcG9ydHMgImVuZCBvZgotCSAqIGlucHV0IiByYXRoZXIgdGhhbiBhbGxvdyBnb2luZyBwYXN0IG1hcmspLiBUaGlzIGlzIHZlcnkgc3BlY2lhbGl6ZWQKLQkgKiBzdHJlYW0gaW50cm9kdWNlZCB0byBvdmVyY29tZQotCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NzIxMS4gU2VlIGFsc28KLQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njg1NjUKLQkgKi8KLQlwcml2YXRlIElucHV0U3RyZWFtIGdldExpbWl0ZWRTdHJlYW0oSW5wdXRTdHJlYW0gb3JpZ2luYWwpIHsKLQkJaWYgKG9yaWdpbmFsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG9yaWdpbmFsIGluc3RhbmNlb2YgQnVmZmVyZWRMaW1pdGVkU3RyZWFtKQotCQkJcmV0dXJuIG9yaWdpbmFsOwotCQlJbnB1dFN0cmVhbSBzID0gbmV3IEJ1ZmZlcmVkTGltaXRlZFN0cmVhbShvcmlnaW5hbCwgQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJcy5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCXJldHVybiBzOwotCX0KLQotCXByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0UmVzZXR0YWJsZVN0cmVhbSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG51bGw7Ci0KLQkJaWYgKGZJRmlsZSAhPSBudWxsKSB7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIG5vdGUgd2UgYWx3YXlzIGdldCBjb250ZW50cywgZXZlbiBpZiBvdXQgb2Ygc3luY2gKLQkJCQlpbnB1dFN0cmVhbSA9IGZJRmlsZS5nZXRDb250ZW50cyh0cnVlKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBTSE9VTEQgYWN0dWFsbHkgY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZgotCQkJCS8vIGZJU3RvcmFnZSwgYnV0Ci0JCQkJLy8gZm9yIG5vdyB3aWxsIGp1c3QgYXNzdW1lIGNvcmUgZXhjZXB0aW9uCi0JCQkJLy8gbWVhbnMgaXQKLQkJCQkvLyBkb2Vzbid0IGV4aXN0IG9uIGZpbGUgc3lzdGVtLCB5ZXQuCi0JCQkJLy8gYW5kIHdlJ2xsIGxvZywganVzdCBpbiBjYXNlIGl0cyBhIG5vdGVhYmxlIGVycm9yCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQlpbnB1dFN0cmVhbSA9IG5ldyBOdWxsSW5wdXRTdHJlYW0oKTsKLQkJCX0KLQkJCXJlc2V0dGFibGVTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGZJbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJaWYgKGZJbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCQkJcmVzZXR0YWJsZVN0cmVhbSA9IGZJbnB1dFN0cmVhbTsKLQkJCQkJLy8gdHJ5IHsKLQkJCQkJcmVzZXR0YWJsZVN0cmVhbS5yZXNldCgpOwotCQkJCQkvLyB9Ci0JCQkJCS8vIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIC8vIGFzc3VtZWQganVzdCBoYXNuJ3QgYmVlbiBtYXJrZWQgeWV0LCBzbyBpZ25vcmUKLQkJCQkJLy8gfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGZJbnB1dFN0cmVhbSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChyZXNldHRhYmxlU3RyZWFtID09IG51bGwpIHsKLQkJCXJlc2V0dGFibGVTdHJlYW0gPSBuZXcgTnVsbElucHV0U3RyZWFtKCk7Ci0JCX0KLQotCQkvLyBtYXJrIHRoaXMgb25jZSwgc3RyZWFtIGF0ICJ6ZXJvIiBwb3NpdGlvbgotCQlyZXNldHRhYmxlU3RyZWFtLm1hcmsoTUFYX01BUktfU0laRSk7Ci0JCXJldHVybiByZXNldHRhYmxlU3RyZWFtOwotCX0KLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGhhbmRsZU5vdFByb3ZpZGVkRnJvbUNvbnRlbnRDYXNlKCkgewotCi0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgc3BlY0RlZmF1bHQgPSBudWxsOwotCQkvLyB0cnkgewotCQkvLyBzcGVjRGVmYXVsdCA9IGdldEVuY29kaW5nRGV0ZWN0b3IoKS5nZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCS8vIH0KLQkJLy8gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkvLyAvLyBJZiB0aGlzIGV4Y2VwdGlvbiBvY2N1cnMsIGFzc3VtZXMgdGhlcmUgaXMKLQkJLy8gLy8gbm8gc3BlY0RlZmF1bHQKLQkJLy8gfQotCQkvLyBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkvLyAvLyBJZiB0aGlzIGV4Y2VwdGlvbiBvY2N1cnMsIGFzc3VtZXMgdGhlcmUgaXMKLQkJLy8gLy8gbm8gc3BlY0RlZmF1bHQKLQkJLy8gfQotCQkvLyBmaW5hbGx5IHsKLQkJLy8gdHJ5IHsKLQkJLy8gaGFuZGxlU3RyZWFtQ2xvc2UoZkVuY29kaW5nRGV0ZWN0b3JTdHJlYW0pOwotCQkvLyB9Ci0JCS8vIGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkvLyAvLyBzZXZlcmUgZXJyb3IsIG5vdCBtdWNoIHRvIGRvIGhlcmUKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHRoaXMgbG9naWMgc2hvdWxkIGJlIG1vdmVkIHRvICdkZXRlY3Rpb24nIGlmIG5vdCBhbHJlYWR5Ci0JCVN0cmluZyBjaGFyc2V0ID0gTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy51c2VEZWZhdWx0TmFtZVJ1bGVzKHNwZWNEZWZhdWx0KTsKLQkJQXNzZXJ0LmlzTm90TnVsbChjaGFyc2V0LCAicG9zdCBjb25kaXRpb24gZmFpbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0ID0gQ29kZWRJTy5jcmVhdGVFbmNvZGluZ01lbWVudG8oY2hhcnNldCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc2V0dGFibGVJbnB1dFN0cmVhbQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlU3RyZWFtQ2xvc2UoSW5wdXRTdHJlYW0gcmVzZXR0YWJsZUlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWlmIChyZXNldHRhYmxlSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJaWYgKGZDbGllbnRTdXBwbGllZFN0cmVhbSkgewotCQkJCXJlc2V0dGFibGVJbnB1dFN0cmVhbS5yZXNldCgpOwotCQkJfQotCQkJZWxzZSB7Ci0KLQkJCQlyZXNldHRhYmxlSW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIFRPRE8gV2UganVzdCBjb3B5IHRoZSBjb250ZW50IHByb3BlcnRpZXMgZW5jb2RpbmcgdG8gY3VycmVudCByZXNvdXJjZSdzCi0JLy8gZW5jb2RpbmcgZm9yIG5vdy4gTWF5IGltcHJvdmUgdGhlIFVJIGxhdGVyIGJ5IHNldHRpbmcgYW4gaW5mb3JtYXRpb25hbAotCS8vIG1lc3NhZ2UgYW5kL29yIGRpc2FibGUgdGhlIGNvbnRlbnQgcHJvcGVydGllcyBlbmNvZGluZyBmaWVsZC4KLQkvLyBUT0RPOiByZW1ha2UgcHJpdmF0ZSBlbHNlIHJlbW92ZQotCXZvaWQgbWlncmF0ZUNvbnRlbnRQcm9wZXJ0aWVzRW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElGaWxlIGZpbGUgPSBmSUZpbGU7Ci0JCWZpbmFsIFN0cmluZyBjaGFyc2V0ID0gZW5jb2Rpbmc7Ci0JCS8vIFRPRE86IGV4dGVybmFsaXplIHN0cmluZyBsYXRlcgotCQlKb2IgbWlncmF0ZXIgPSBuZXcgSm9iKFNTRUNvcmVNZXNzYWdlcy5NaWdyYXRlX0NoYXJzZXQpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZpbGUuc2V0Q2hhcnNldChjaGFyc2V0LCBudWxsKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQltaWdyYXRlci5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCW1pZ3JhdGVyLnNjaGVkdWxlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCi0JCWZFbmNvZGluZ1J1bGUgPSBudWxsOwotCQlmSUZpbGUgPSBudWxsOwotCQlmRmlsZW5hbWUgPSBudWxsOwotCQlmSW5wdXRTdHJlYW0gPSBudWxsOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQkJZkNsaWVudFN1cHBsaWVkU3RyZWFtID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KElGaWxlIGlGaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiaWxsZWdhbCBhcmd1bWVudCIpOyAvLyROT04tTkxTLTEkCi0JCXJlc2V0QWxsKCk7Ci0JCWZJRmlsZSA9IGlGaWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0KLQkJcmVzZXRBbGwoKTsKLQkJZkZpbGVuYW1lID0gZmlsZW5hbWU7Ci0JCWZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCQlmQ2xpZW50U3VwcGxpZWRTdHJlYW0gPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nUnVsZShFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB7Ci0KLQkJZkVuY29kaW5nUnVsZSA9IGVuY29kaW5nUnVsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvZGVkU3RyZWFtQ3JlYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db2RlZFN0cmVhbUNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMxMjI0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvZGVkU3RyZWFtQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5DaGFyQ29udmVyc2lvbkVycm9yV2l0aERldGFpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5NYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zLlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWw7Ci0KLQotcHVibGljIGNsYXNzIENvZGVkU3RyZWFtQ3JlYXRvciBleHRlbmRzIENvZGVkSU8gewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOSVRJQUxfQlVGRkVSX1NJWkUgPSAxMDI0ICogMTY7Ci0KLQkvLyB0aGUgMzIgYnl0ZXMgdXNlZCBieSBkZWZhdWx0IGJ5IEJ5dGVPdXRwdXRTdHJlYW0gaXMKLQkvLyBhIGxpdHRsZSBzbWFsbAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9HUkFNX0VSUk9SX19GQUlMRURfVE9fRklORF9BTllfQ0hBUlNFVF9BTllXSEVSRV8gPSAiUHJvZ3JhbSBlcnJvcjogZmFpbGVkIHRvIGZpbmQgYW55IGNoYXJzZXQgYW55d2hlcmUhIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl8xNkJFX0NIQVJTRVRfTkFNRSA9ICJVVEYtMTZCRSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzE2TEVfQ0hBUlNFVF9OQU1FID0gIlVURi0xNkxFIjsgLy8kTk9OLU5MUy0xJAotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfMTZfQ0hBUlNFVF9OQU1FID0gIlVURi0xNiI7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl84X0NIQVJTRVRfTkFNRSA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgYm9vbGVhbiBmQ2xpZW50U3VwcGxpZWRSZWFkZXI7Ci0KLQkvLyBmdXR1cmVfVE9ETzogdGhpcyAnY2hlY2tDb252ZXJzaW9uJyBjYW4gYmUgYSBsaXR0bGUKLQkvLyBwcmljZXkgZm9yIGxhcmdlCi0JLy8gZmlsZXMsIGNob3VsZCBiZSBhIHVzZXIgcHJlZmVyZW5jZSwgb3Igc29tZXRoaW5nLgotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2hlY2tDb252ZXJzaW9uID0gdHJ1ZTsKLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBmQ3VycmVudEVuY29kaW5nTWVtZW50bzsKLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcml2YXRlIFN0cmluZyBmRmlsZW5hbWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkhhc0JlZW5BbmFseXplZDsKLQotCXByaXZhdGUgSUZpbGUgZklGaWxlOwotCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZlByZXZpb3VzRW5jb2RpbmdNZW1lbnRvOwotCi0JcHJpdmF0ZSBSZWFkZXIgZlJlYWRlcjsKLQotCXByaXZhdGUgUmVhZGVyIGZSZXNldHRhYmxlUmVhZGVyOwotCXByaXZhdGUgYnl0ZVtdIFVURjE2QkVCT00gPSBuZXcgYnl0ZVtdeyhieXRlKSAweEZFLCAoYnl0ZSkgMHhGRn07Ci0KLQlwcml2YXRlIGJ5dGVbXSBVVEYxNkxFQk9NID0gbmV3IGJ5dGVbXXsoYnl0ZSkgMHhGRiwgKGJ5dGUpIDB4RkV9OwotCXByaXZhdGUgYnl0ZVtdIFVURjNCWVRFQk9NID0gbmV3IGJ5dGVbXXsoYnl0ZSkgMHhFRiwgKGJ5dGUpIDB4QkIsIChieXRlKSAweEJGfTsKLQotCXB1YmxpYyBDb2RlZFN0cmVhbUNyZWF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENvZGVkU3RyZWFtQ3JlYXRvcihTdHJpbmcgZmlsZW5hbWUsIGNoYXJbXSBjaGFyYWN0ZXJBcnJheSkgewotCQlzdXBlcigpOwotCQlmRmlsZW5hbWUgPSBmaWxlbmFtZTsKLQkJZlJlYWRlciA9IG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhcmFjdGVyQXJyYXkpOwotCX0KLQotCXB1YmxpYyBDb2RlZFN0cmVhbUNyZWF0b3IoU3RyaW5nIGZpbGVuYW1lLCBSZWFkZXIgcmVhZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWZGaWxlbmFtZSA9IGZpbGVuYW1lOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCX0KLQotCXB1YmxpYyBDb2RlZFN0cmVhbUNyZWF0b3IoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgdGV4dFN0cmluZykgewotCQlzdXBlcigpOwotCQlmRmlsZW5hbWUgPSBmaWxlbmFtZTsKLQkJZlJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIodGV4dFN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHByaW1hcnkgbWV0aG9kIHdoaWNoIGNvbnRhaW5zIHRoZSBoaWdoZXN0IGxldmVsIHJ1bGVzIGZvciBob3cgdG8KLQkgKiBkZWNpZGUgYXBwcm9wcmlhdGUgZGVjb2RpbmcgcnVsZXM6IDEuIGZpcnN0IGNoZWNrIGZvciB1bmljb2RlIHN0cmVhbSAyLgotCSAqIHRoZW4gbG9va2VkIGZvciBlbmNvZGluZyBzcGVjaWZpZWQgaW4gY29udGVudCAoYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mCi0JICogY29udGVudCB0aGF0IGlzIGl0IC4uLiB4bWwsIGh0bWwsIGpzcCwgZXRjLiAzLiB0aGVuIGNoZWNrIGZvciB2YXJpb3VzCi0JICogc2V0dGluZ3M6IGZpbGUgc2V0dGluZ3MgZmlyc3QsIGlmIG51bGwgY2hlY2sgcHJvamVjdCBzZXR0aW5ncywgaWYgbnVsbCwKLQkgKiBjaGVjayB1c2VyIHByZWZlcmVuY2VzLiA0LiBsYXN0bHkgKG9yLCB3aGF0IGlzIHRoZSBsYXN0IHVzZXIKLQkgKiBwcmVmZXJlbmNlKSBpcyB0byB1c2UgIndvcmtiZW5jaCBkZWZhdWx0cyIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFuYWx5emUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlSZWFkZXIgcmVzZXR0YWJsZVJlYWRlciA9IGdldFJlc2V0dGFibGVSZWFkZXIoKTsKLQkJdHJ5IHsKLQkJCWlmIChmQ3VycmVudEVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQkJcmVzZXR0YWJsZVJlYWRlci5yZXNldCgpOwotCQkJCWZDdXJyZW50RW5jb2RpbmdNZW1lbnRvID0gY2hlY2tGb3JFbmNvZGluZ0luQ29udGVudHMoKTsKLQkJCX0KLQkJCS8vIGlmIGVuY29kaW5nIHN0cmF0YWd5IGRvZXNuJ3QgcHJvdmlkZSBhbnN3ZXIsCi0JCQkvLyB0aGVuIHRyeSBmaWxlIHNldHRpbmdzLCBwcm9qZWN0IHNldHRpbmdzLAotCQkJLy8gdXNlciBwcmVmZXJlbmNlcywgYW5kCi0JCQkvLyBmaW5hbGx5IHdvcmtiZW5jaCBkZWZhdWx0LgotCQkJLy8KLQkJCWlmIChmQ3VycmVudEVuY29kaW5nTWVtZW50byA9PSBudWxsIHx8IGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJcmVzZXR0YWJsZVJlYWRlci5yZXNldCgpOwotCQkJCWZDdXJyZW50RW5jb2RpbmdNZW1lbnRvID0gZ2V0RW5jb2RpbmdNZW1lbnRvRnJvbVJlc291cmNlQW5kUHJlZmVyZW5jZSgpOwotCQkJfQotCi0JCQkvLyB1c2UgRGVmYXVsdE5hbWVSdWxlcyBmcm9tIE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMgYXMgdGhlCi0JCQkvLyBmaW5hbCBkZWZhdWx0Ci0JCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQkJaGFuZGxlTm90UHJvdmlkZWRGcm9tQ29udGVudENhc2UoKTsKLQkJCX0KLQotCQkJZkhhc0JlZW5BbmFseXplZCA9IHRydWU7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVzZXR0YWJsZVJlYWRlciAhPSBudWxsKSB7Ci0JCQkJcmVzZXR0YWJsZVJlYWRlci5yZXNldCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTmVlZCB0byBjaGVjayBjb252ZXJzaW9uIGVhcmx5IG9uLiBUaGVyZSdzIHNvbWUgZGFuZ2VyIHRoYW4gb2xkCi0JICogY29udGVudHMgb2YgYSBmaWxlIGFyZSBzZXQgdG8gZW1wdHksIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMuCi0JICogCi0JICogQHBhcmFtIGFsbFRleHQKLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiBAcGFyYW0gZW5jb2RpbmdSdWxlCi0JICogQHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLQkgKiBAdGhyb3dzIE1hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWwKLQkgKiBAZGVwcmVjYXRlZCAtIHdlIG5lZWQgdG8gZmluZCAiY2hlYXBlciIgd2F5IHRvIHRvIHRoaXMgZnVuY3Rpb25hbGl0eSBzbwotCSAqICAgICAgICAgICAgIGxpa2VseSB0byBnbyBhd2F5IGluIGZ1dHVyZQotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0NvbnZlcnNpb24oRW5jb2RpbmdNZW1lbnRvIG1lbWVudG8sIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBqYXZhRW5jb2RpbmcgPSBtZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCQlTdHJpbmcgZGV0ZWN0ZWRFbmNvZGluZyA9IG1lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQlDaGFyc2V0IGNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoamF2YUVuY29kaW5nKTsKLQkJQ2hhcnNldEVuY29kZXIgY2hhcnNldEVuY29kZXIgPSBjaGFyc2V0Lm5ld0VuY29kZXIoKTsKLQkJY2hhcnNldEVuY29kZXIub25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlQpOwotCQljaGFyc2V0RW5jb2Rlci5vblVubWFwcGFibGVDaGFyYWN0ZXIoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUKTsKLQkJUmVhZGVyIHJlYWRlciA9IGdldFJlc2V0dGFibGVSZWFkZXIoKTsKLQkJcmVhZGVyLnJlc2V0KCk7Ci0JCWludCBjdXJyZW50Q2hhciA9IHJlYWRlci5yZWFkKCk7Ci0JCWludCBjdXJyZW50UG9zID0gMTsKLQkJdHJ5IHsKLQkJCXdoaWxlIChjdXJyZW50Q2hhciAhPSAtMSkgewotCQkJCS8vIG5vdGU6IHRoaXMgY2FuIHByb2JhYmx5IGJlIG1hZGUgbW9yZQotCQkJCS8vIGVmZmljaWVudCBsYXRlciB0bwotCQkJCS8vIGNoZWNrIGJ1ZmZlciBieSBidWZmZXIsIGluc3RlYWQgb2YKLQkJCQkvLyBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyLgotCQkJCXRyeSB7Ci0JCQkJCWJvb2xlYW4gY2FuQ29udmVydCA9IGNoYXJzZXRFbmNvZGVyLmNhbkVuY29kZSgoY2hhcikgY3VycmVudENoYXIpOwotCQkJCQlpZiAoIWNhbkNvbnZlcnQpIHsKLQkJCQkJCWlmIChlbmNvZGluZ1J1bGUgPT0gRW5jb2RpbmdSdWxlLklHTk9SRV9DT05WRVJTSU9OX0VSUk9SKSB7Ci0JCQkJCQkJLy8gaWYgd2UncmUgdG9sZCB0byBpZ25vcmUgdGhlCi0JCQkJCQkJLy8gZW5jb2RpbmcgY29udmVyc2lvbgotCQkJCQkJCS8vIGVycm9yLAotCQkJCQkJCS8vIG5vdGljZSB3ZSBzdGlsbCB3YW50IHRvIGRldGVjdAotCQkJCQkJCS8vIGFuZCBsb2cgaXQuIFdlIHNpbXBseQotCQkJCQkJCS8vIGRvbid0IHRocm93IHRoZSBleGNlcHRpb24sIGFuZAotCQkJCQkJCS8vIHdlIGRvIGNvbnRpbnVlIHdpdGgKLQkJCQkJCQkvLyB0aGUKLQkJCQkJCQkvLyBzYXZlLgotCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiRW5jb2RpbmcgQ29udmVyc2lvbiBFcnJvciBkdXJpbmcgc2F2ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXRocm93IG5ldyBNYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsKGphdmFFbmNvZGluZywgZGV0ZWN0ZWRFbmNvZGluZywgY3VycmVudFBvcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY3VycmVudENoYXIgPSByZWFkZXIucmVhZCgpOwotCQkJCQljdXJyZW50UG9zKys7Ci0JCQkJfQotCQkJCS8vIElCTSdzIEpSRSBzZWVtcyB0byB0aHJvdyBOUEUgd2hlbiBEQkNTIGNoYXIgaXMgZ2l2ZW4gdG8KLQkJCQkvLyBTQkNTIGNoYXJzZXRFbmNvZGVyCi0JCQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IENoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsKGphdmFFbmNvZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBpZiB3ZSBnZXQgYWxsIHRoZSB3YXkgdGhyb3VnaCBsb29wIHdpdGhvdXQgdGhyb3dpbmcgZXhjZXB0aW9uLAotCQkJLy8gdGhlbiB0aGVyZSBtdXN0Ci0JCQkvLyBiZSBhbiBlcnJvciBub3QgZGV0ZWN0YWJsZSB3aGVuIGdvaW5nIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIuCi0JCQl0aHJvdyBuZXcgQ2hhckNvbnZlcnNpb25FcnJvcldpdGhEZXRhaWwoamF2YUVuY29kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJcmVhZGVyLnJlc2V0KCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBjaGVja0ZvckVuY29kaW5nSW5Db250ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCi0JCS8vIGlmIGVuY29kaW5nIG1lbWVudG8gYWxyZWFkeSBzZXQsIGFuZCBubyBuZWVkIHRvIGdldCBhZ2Fpbi4KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfSBlbHNlIHsKLQkJCWlmIChmQ2xpZW50U3VwcGxpZWRSZWFkZXIpIHsKLQkJCQlmUmVhZGVyLnJlc2V0KCk7Ci0JCQkJSUNvbnRlbnRUeXBlTWFuYWdlciBjb250ZW50VHlwZU1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJCQl0cnkgewotCQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGNvbnRlbnRUeXBlTWFuYWdlci5nZXREZXNjcmlwdGlvbkZvcihmUmVhZGVyLCBmRmlsZW5hbWUsIElDb250ZW50RGVzY3JpcHRpb24uQUxMKTsKLQkJCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlmRW5jb2RpbmdNZW1lbnRvID0gY3JlYXRlTWVtZW50byhjb250ZW50RGVzY3JpcHRpb24pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZkVuY29kaW5nTWVtZW50byA9IENvZGVkSU8uY3JlYXRlRW5jb2RpbmdNZW1lbnRvKCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRPRE86IHdvcmsgYXJvdW5kIGZvciA1LzE0IGJ1ZyBpbiBiYXNlLCBzaG91bGQgYmUKLQkJCQkJLy8gcmVtb3ZlZCB3aGVuIG1vdmUgdXAgdG8gNS8yMQotCQkJCQkvLyBqdXN0IGNyZWF0ZWQgYSBzaW1wbGUgZGVmYXVsdCBvbmUKLQkJCQkJZkVuY29kaW5nTWVtZW50byA9IENvZGVkSU8uY3JlYXRlRW5jb2RpbmdNZW1lbnRvKCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJlc3VsdCA9IGZFbmNvZGluZ01lbWVudG87Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgc3RhdGU6IGVuY29kaW5nTWVtZW50byB3YXMgbnVsbCBidXQgbm8gaW5wdXQgc3RyZWFtIHN1cHBsaWVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkvLwkJdHJ5IHsKLQkJLy8JCQlyZXN1bHQgPSBnZXRFbmNvZGluZ0RldGVjdG9yKCkuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCS8vCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmICFyZXN1bHQuaXNWYWxpZCgpICYmICFmb3JjZURlZmF1bHQoKSkgewotCQkvLwkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbChyZXN1bHQpOwotCQkvLwkJCX0KLQkJLy8JCX0KLQkJLy8JCWZpbmFsbHkgewotCQkvLwkJCWhhbmRsZVN0cmVhbUNsb3NlKGZFbmNvZGluZ0RldGVjdG9yU3RyZWFtKTsKLQkJLy8JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBkdW1wKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUsIGJvb2xlYW4gdXNlM0J5dGVCT01pZlVURjgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWdldEN1cnJlbnRFbmNvZGluZ01lbWVudG8oKTsKLQkJU3RyaW5nIGphdmFFbmNvZGluZ05hbWUgPSBudWxsOwotCQlpZiAoZW5jb2RpbmdSdWxlID09IEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKSB7Ci0JCQlpZiAoZkN1cnJlbnRFbmNvZGluZ01lbWVudG8uaXNWYWxpZCgpKSB7Ci0JCQkJamF2YUVuY29kaW5nTmFtZSA9IGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbChmQ3VycmVudEVuY29kaW5nTWVtZW50byk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZW5jb2RpbmdSdWxlID09IEVuY29kaW5nUnVsZS5JR05PUkVfQ09OVkVSU0lPTl9FUlJPUikKLQkJCWphdmFFbmNvZGluZ05hbWUgPSBmQ3VycmVudEVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQkJZWxzZSBpZiAoZW5jb2RpbmdSdWxlID09IEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUKQotCQkJamF2YUVuY29kaW5nTmFtZSA9IGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLmdldEFwcHJvcHJpYXRlRGVmYXVsdCgpOwotCQkvLyB3cml0ZSBhcHByb3ByaWF0ZSAiaGVhZGVyIiB1bmljb2RlIEJPTSBieXRlcwotCQkvLyBOb3RlOiBKYXZhIHNlZW1zIHRvIHdyaXRlIGFwcHJvcHJpYXRlIGhlYWRlciBmb3IKLQkJLy8gVVRGLTE2LCBidXQgbm90Ci0JCS8vIFVURi04IG5vciBVVEYtMTZCRS4gVGhpcwotCQkvLyBtYXkgdmFyeSBieSBKUkUgdmVyc2lvbiwgc28gbmVlZCB0byB0ZXN0IHdlbGwuCi0JCS8vIE5vdGU6IGphdmFFbmNvZGluZ05hbWUgY2FuIGJlIG51bGwgaW4gaW52YWxpZAotCQkvLyBjYXNlcywgc28gd2Ugbm8gaGFyZAotCQkvLyB0byBza2lwIHdob2xlIGNoZWNrIGlmIHRoYXQncyB0aGUgY2FzZS4KLQkJaWYgKGphdmFFbmNvZGluZ05hbWUgIT0gbnVsbCkgewotCQkJaWYgKChqYXZhRW5jb2RpbmdOYW1lLmVxdWFscyhVVEZfOF9DSEFSU0VUX05BTUUpICYmIHVzZTNCeXRlQk9NaWZVVEY4KSB8fCAoamF2YUVuY29kaW5nTmFtZS5lcXVhbHMoVVRGXzhfQ0hBUlNFVF9OQU1FKSAmJiBmQ3VycmVudEVuY29kaW5nTWVtZW50by5pc1VURjgzQnl0ZUJPTVVzZWQoKSkpIHsKLQkJCQlvdXRwdXRTdHJlYW0ud3JpdGUoVVRGM0JZVEVCT00pOwotCQkJfSBlbHNlIGlmIChqYXZhRW5jb2RpbmdOYW1lLmVxdWFscyhVVEZfMTZMRV9DSEFSU0VUX05BTUUpKSB7Ci0JCQkJb3V0cHV0U3RyZWFtLndyaXRlKFVURjE2TEVCT00pOwotCQkJfSBlbHNlIGlmIChqYXZhRW5jb2RpbmdOYW1lLmVxdWFscyhVVEZfMTZCRV9DSEFSU0VUX05BTUUpKSB7Ci0JCQkJb3V0cHV0U3RyZWFtLndyaXRlKFVURjE2QkVCT00pOwotCQkJfQotCQl9Ci0JCS8vIFRPRE8gYWRkIGJhY2sgaW4gbGluZSBkZWxpbWl0ZXIgaGFuZGxpbmcgdGhlCi0JCS8vICJyaWdodCIgd2F5ICh1cGRhdGluZwotCQkvLyBtYXJrZXJzLCBub3QgcmVxdWlyaW5nIHN0cmluZywgZXRjLiAuLiBtYXkgbmVlZAotCQkvLyB0byBtb3ZlIHRvIGRvY3VtZW50Ci0JCS8vIGxldmVsKQotCQkvL2FsbFRleHRCdWZmZXIgPQotCQkvLyBoYW5kbGVMaW5lRGVsaW1pdGVyKGFsbFRleHRCdWZmZXIsIGRvY3VtZW50KTsKLQkJUmVhZGVyIHJlYWRlciA9IGdldFJlc2V0dGFibGVSZWFkZXIoKTsKLQkJLy8gYmUgc3VyZSB0byB0ZXN0IGxhcmdlICJyZWFkZXJzIiAuLi4gd2UnbGwgbmVlZAotCQkvLyB0byBtYWtlIHN1cmUgdGhleSBhbGwKLQkJLy8gY2FuIHJlc2V0IHRvIGluaXRpYWwgcG9zaXRpb24gKFN0cmluZ1JlYWRlciwKLQkJLy8gQ2hhckFycmF5UmVhZGVyLCBhbmQKLQkJLy8gRG9jdW1lbnRSZWFkZXIgc2hvdWxkIGFsbCB3b3JrIG9rKS4KLQkJcmVhZGVyLnJlc2V0KCk7Ci0JCS8vIFRoZXJlIG11c3QgYmUgY2xlYW5lciBsb2dpYyBzb21laG93LCBidXQgdGhlCi0JCS8vIGlkZWEgaXMgdGhhdAotCQkvLyBqYXZhRW5jb2RpbmdOYW1lIGNhbiBiZSBudWxsCi0JCS8vIGlmIG9yaWdpbmFsIGRldGVjdGVkIGVuY29kaW5nIGlzIG5vdCB2YWxpZCAoYW5kCi0JCS8vIGlmIEZPUkNFX0RFRkFVTFQgd2FzCi0JCS8vIG5vdCBzcGVjaWZpZWQpLiBIZW5jZSwgd2UgV0FOVCB0aGUgZmlyc3QKLQkJLy8gQ2hhcnNldC5mb3JOYW1lIHRvCi0JCS8vIHRocm93IGFwcHJvcHJpYXRlIGV4Y2VwdGlvbi4KLQkJQ2hhcnNldCBjaGFyc2V0ID0gbnVsbDsKLQotCQkvLyB0aGlzIGNhbGwgY2hlY2tzICJvdmVycmlkZSIgcHJvcGVydGllcyBmaWxlCi0JCWphdmFFbmNvZGluZ05hbWUgPSBDb2RlZElPLmdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoamF2YUVuY29kaW5nTmFtZSk7Ci0KLQkJaWYgKGphdmFFbmNvZGluZ05hbWUgPT0gbnVsbCkgewotCQkJY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShmQ3VycmVudEVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCkpOwotCQl9IGVsc2UgewotCQkJY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShqYXZhRW5jb2RpbmdOYW1lKTsKLQkJfQotCQlDaGFyc2V0RW5jb2RlciBjaGFyc2V0RW5jb2RlciA9IGNoYXJzZXQubmV3RW5jb2RlcigpOwotCQlpZiAoIShlbmNvZGluZ1J1bGUgPT0gRW5jb2RpbmdSdWxlLklHTk9SRV9DT05WRVJTSU9OX0VSUk9SKSkgewotCQkJY2hhcnNldEVuY29kZXIub25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlQpOwotCQkJY2hhcnNldEVuY29kZXIub25Vbm1hcHBhYmxlQ2hhcmFjdGVyKENvZGluZ0Vycm9yQWN0aW9uLlJFUE9SVCk7Ci0JCX0gZWxzZSB7Ci0JCQljaGFyc2V0RW5jb2Rlci5vbk1hbGZvcm1lZElucHV0KENvZGluZ0Vycm9yQWN0aW9uLlJFUExBQ0UpOwotCQkJY2hhcnNldEVuY29kZXIub25Vbm1hcHBhYmxlQ2hhcmFjdGVyKENvZGluZ0Vycm9yQWN0aW9uLlJFUExBQ0UpOwotCi0JCX0KLQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyc2V0RW5jb2Rlcik7Ci0JCS8vVE9ETzogdGhpcyBtYXkgbm8gbG9uZ2VyIGJlIG5lZWRlZCAoYW5kIGlzIGF0Ci0JCS8vIGxlYXN0IHdyb25nIHNwb3QgZm9yCi0JCS8vIGl0KS4KLQkJLy8JCWlmIChjaGVja0NvbnZlcnNpb24gJiYgKCEoZW5jb2RpbmdSdWxlID09Ci0JCS8vIEVuY29kaW5nUnVsZS5JR05PUkVfQ09OVkVSU0lPTl9FUlJPUikpKSB7Ci0JCS8vCQkJY2hlY2tDb252ZXJzaW9uKGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLAotCQkvLyBlbmNvZGluZ1J1bGUpOwotCQkvLwkJfQotCQljaGFyW10gY2hhcmJ1ZiA9IG5ldyBjaGFyW0NvZGVkSU8uTUFYX0JVRl9TSVpFXTsKLQkJaW50IG5SZWFkID0gMDsKLQkJdHJ5IHsKLQkJCXdoaWxlIChuUmVhZCAhPSAtMSkgewotCQkJCW5SZWFkID0gcmVhZGVyLnJlYWQoY2hhcmJ1ZiwgMCwgTUFYX0JVRl9TSVpFKTsKLQkJCQlpZiAoblJlYWQgPiAwKSB7Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci5mbHVzaCgpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIud3JpdGUoY2hhcmJ1ZiwgMCwgblJlYWQpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvbiBlKSB7Ci0JCQljaGVja0NvbnZlcnNpb24oZkN1cnJlbnRFbmNvZGluZ01lbWVudG8sIGVuY29kaW5nUnVsZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBzaW5jZSB3ZSBkb24ndCBvd24gdGhlIG9yaWdpbmFsIG91dHB1dCBzdHJlYW0sIHdlCi0JCQkvLyB3b24ndCBjbG9zZSBpdCBvdXJzLgotCQkJLy8gdGhlIGNhbGxlciB3aG8gcGFzc2VkIGl0IHRvIHVzIG11c3QgY2xvc2Ugb3JpZ2luYWwgb25lCi0JCQkvLyB3aGVuIGFwcHJvcHJpYXRlLgotCQkJLy8gKGJ1dCB3ZSBkbyBmbHVzaCB0byBiZSBzdXJlIGFsbCB1cC10by1kYXRlKQotCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2V0M0J5dGVCT01QcmVmZXJlbmNlKCkgewotCQlyZXR1cm4gU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlVTRV8zQllURV9CT01fV0lUSF9VVEY4KTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtKEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtKEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCS8vQXNzZXJ0LmlzTm90TnVsbChmUHJldmlvdXNFbmNvZGluZ01lbWVudG8sCi0JCS8vICJwcmV2aW91c0VuY29kaW5nTWVtZW50bwotCQkvLyBuZWVkcyB0byBiZSBzZXQgZmlyc3QiKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVBcnJheU91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oSU5JVElBTF9CVUZGRVJfU0laRSk7Ci0JCWR1bXAoYnl0ZUFycmF5T3V0cHV0U3RyZWFtLCBlbmNvZGluZ1J1bGUsIGdldDNCeXRlQk9NUHJlZmVyZW5jZSgpKTsKLQkJcmV0dXJuIGJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEN1cnJlbnRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvL0Fzc2VydC5pc05vdE51bGwoZlByZXZpb3VzRW5jb2RpbmdNZW1lbnRvLAotCQkvLyAicHJldmlvdXNFbmNvZGluZ01lbWVudG8KLQkJLy8gbmVlZHMgdG8gYmUgc2V0IGZpcnN0Iik7Ci0JCWlmICghZkhhc0JlZW5BbmFseXplZCkgewotCQkJYW5hbHl6ZSgpOwotCQl9Ci0JCS8vIHBvc3QgY29uZGl0aW9uCi0JCUFzc2VydC5pc05vdE51bGwoZkN1cnJlbnRFbmNvZGluZ01lbWVudG8sICJpbGxlZ2FsIHBvc3QgY29uZGl0aW9uIHN0YXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYmUgc3VyZSB0byBjYXJyeSBvdmVyIGFwcHJvcHJpYXRlIGVuY29kaW5nCi0JCS8vICJzdGF0ZSIgdGhhdCBtYXkgYmUKLQkJLy8gcmVsZXZlbnQuCi0JCWlmIChmUHJldmlvdXNFbmNvZGluZ01lbWVudG8gIT0gbnVsbCkgewotCQkJZkN1cnJlbnRFbmNvZGluZ01lbWVudG8uc2V0VVRGODNCeXRlQk9NVXNlZChmUHJldmlvdXNFbmNvZGluZ01lbWVudG8uaXNVVEY4M0J5dGVCT01Vc2VkKCkpOwotCQl9Ci0JCXJldHVybiBmQ3VycmVudEVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmx5IHdoZW4gZW5jb2RpbmcgaXMgbm90IGRldGVjdGVkIGluIHRoZSBmaWxlLgotCSAqIAotCSAqIEhlcmUgaXMgZW5jb2RpbmcgbG9va3VwIG9yZGVyIHdlIHdpbGwgdHJ5OiAtIHRyeSByZXNvdXJjZSBjb250ZW50Ci0JICogZGVzY3JpcHRpb24gKEVjbGlwc2UgVGV4dCBmaWxlIGVuY29kaW5nKSAtIHRyeSByZXNvdXJjZSBjb250ZW50Ci0JICogcHJvcGVydGllcyAoZm9yIEpTUCBvbmx5KSAtIHRyeSBjb250ZW50IHR5cGUgZW5jb2RpbmcgcHJlZmVyZW5jZXMgKGZvcgotCSAqIEhUTUwgb25seSkgLSB0cnkgcmVzb3VyY2UgY29udGVudCBkZXNjcmlwdGlvbiAoRWNsaXBzZSBUZXh0IGZpbGUKLQkgKiBlbmNvZGluZywgaW1wbGljaXQgY2hlY2spCi0JICogCi0JICogTm90ZTogVGhpcyBtZXRob2QgYXBwZWFycyBpbiBib3RoIENvZGVkUmVhZGVyQ3JlYXRvciBhbmQKLQkgKiBDb2RlZFN0cmVhbUNyZWF0b3IgKHdpdGgganVzdCBhIG1pbm9yIGRpZmZlcmVuY2UpLiBUaGV5IHNob3VsZCBiZSBrZXB0Ci0JICogdGhlIHNhbWUuCi0JICovCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvRnJvbVJlc291cmNlQW5kUHJlZmVyZW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8gPSBmRW5jb2RpbmdNZW1lbnRvOwotCi0JCS8vIEZvbGxvdyBFY2xpcHNlIFBsYXRmb3JtJ3MgZGlyZWN0aW9uLiBHZXQgdGhlIGNoYXJzZXQgZnJvbSBJRmlsZS4KLQkJaWYgKGZJRmlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY2hhcnNldCA9IGZJRmlsZS5nZXRDaGFyc2V0KCk7Ci0JCQllbmNvZGluZ01lbWVudG8gPSBDb2RlZElPLmNyZWF0ZUVuY29kaW5nTWVtZW50byhjaGFyc2V0KTsKLQkJfQotCi0JCXJldHVybiBlbmNvZGluZ01lbWVudG87Ci0JfQotCi0JcHJpdmF0ZSBSZWFkZXIgZ2V0UmVzZXR0YWJsZVJlYWRlcigpIHsKLQkJaWYgKGZSZXNldHRhYmxlUmVhZGVyID09IG51bGwpIHsKLQkJCWlmIChmUmVhZGVyLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJCWZSZXNldHRhYmxlUmVhZGVyID0gZlJlYWRlcjsKLQkJCX0gZWxzZSB7Ci0JCQkJZlJlc2V0dGFibGVSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZlJlYWRlcik7Ci0JCQkJdHJ5IHsKLQkJCQkJZlJlc2V0dGFibGVSZWFkZXIubWFyayhNQVhfTUFSS19TSVpFKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGp1c3QgY2hlY2tlZCBpZgotCQkJCQkvLyBtYXJrYWJsZQotCQkJCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZSZXNldHRhYmxlUmVhZGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdFByb3ZpZGVkRnJvbUNvbnRlbnRDYXNlKCkgewotCQkvLyBtb3ZlIHRvICJkZXRlY3RvcnMiIGlmIG5vdCBhbHJlYWR5Ci0JCVN0cmluZyBzcGVjRGVmYXVsdCA9IG51bGw7Ci0JCS8vc3BlY0RlZmF1bHQgPSBnZXRFbmNvZGluZ0RldGVjdG9yKCkuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlTdHJpbmcgY2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhzcGVjRGVmYXVsdCk7Ci0JCUFzc2VydC5pc05vdE51bGwoY2hhcnNldCwgUFJPR1JBTV9FUlJPUl9fRkFJTEVEX1RPX0ZJTkRfQU5ZX0NIQVJTRVRfQU5ZV0hFUkVfKTsKLQkJZkN1cnJlbnRFbmNvZGluZ01lbWVudG8gPSBDb2RlZElPLmNyZWF0ZUVuY29kaW5nTWVtZW50byhjaGFyc2V0KTsKLQl9Ci0KLQkvLyBUT0RPIFdlIGp1c3QgY29weSB0aGUgY29udGVudCBwcm9wZXJ0aWVzIGVuY29kaW5nIHRvIGN1cnJlbnQgcmVzb3VyY2UncwotCS8vIGVuY29kaW5nIGZvciBub3cuIE1heSBpbXByb3ZlIHRoZSBVSSBsYXRlciBieSBzZXR0aW5nIGFuIGluZm9ybWF0aW9uYWwKLQkvLyBtZXNzYWdlIGFuZC9vciBkaXNhYmxlIHRoZSBjb250ZW50IHByb3BlcnRpZXMgZW5jb2RpbmcgZmllbGQuCi0JLy8gVE9ETyBtYWtlIHByaXZpYXRlIGlmIG5lZWRlZCwgZWxzZSByZW1vdmUKLQl2b2lkIG1pZ3JhdGVDb250ZW50UHJvcGVydGllc0VuY29kaW5nKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZklGaWxlICE9IG51bGwpCi0JCQlmSUZpbGUuc2V0Q2hhcnNldChlbmNvZGluZywgbnVsbCk7Ci0JCWZpbmFsIElGaWxlIGZpbGUgPSBmSUZpbGU7Ci0JCWZpbmFsIFN0cmluZyBjaGFyc2V0ID0gZW5jb2Rpbmc7Ci0JCS8vIFRPRE86IGV4dGVybmFsaXplIHN0cmluZyBsYXRlcgotCQlKb2IgbWlncmF0ZXIgPSBuZXcgSm9iKFNTRUNvcmVNZXNzYWdlcy5NaWdyYXRlX0NoYXJzZXQpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZpbGUuc2V0Q2hhcnNldChjaGFyc2V0LCBudWxsKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQltaWdyYXRlci5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCW1pZ3JhdGVyLnNjaGVkdWxlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmRmlsZW5hbWUgPSBudWxsOwotCQlmUmVhZGVyID0gbnVsbDsKLQkJZlByZXZpb3VzRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQkJZkN1cnJlbnRFbmNvZGluZ01lbWVudG8gPSBudWxsOwotCQlmSGFzQmVlbkFuYWx5emVkID0gZmFsc2U7Ci0JCWZDbGllbnRTdXBwbGllZFJlYWRlciA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChJRmlsZSBmaWxlLCBSZWFkZXIgcmVhZGVyKSB7Ci0JCWZJRmlsZSA9IGZpbGU7Ci0JCXNldChmaWxlLmdldE5hbWUoKSwgcmVhZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIGZpbGVuYW1lLCBjaGFyW10gY2hhcmFjdGVyQXJyYXkpIHsKLQkJcmVzZXRBbGwoKTsKLQkJZkZpbGVuYW1lID0gZmlsZW5hbWU7Ci0JCWZSZWFkZXIgPSBuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJhY3RlckFycmF5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIGZpbGVuYW1lLCBSZWFkZXIgcmVhZGVyKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZGaWxlbmFtZSA9IGZpbGVuYW1lOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlmQ2xpZW50U3VwcGxpZWRSZWFkZXIgPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB0ZXh0U3RyaW5nKSB7Ci0JCXNldChmaWxlbmFtZSwgbmV3IFN0cmluZ1JlYWRlcih0ZXh0U3RyaW5nKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJldmlvdXNFbmNvZGluZ01lbWVudG8oRW5jb2RpbmdNZW1lbnRvIHByZXZpb3VzRW5jb2RpbmdNZW1lbnRvKSB7Ci0JCWZQcmV2aW91c0VuY29kaW5nTWVtZW50byA9IHByZXZpb3VzRW5jb2RpbmdNZW1lbnRvOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29tbW9uQ2hhcnNldE5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbW1vbkNoYXJzZXROYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MThjN2I0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29tbW9uQ2hhcnNldE5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydHlSZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLkxvZ2dlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIENvbW1vbkNoYXJzZXRzIGlzIGEgdXRpbGl0eSBjbGFzcyB0byBwcm92aWRlIGEgY2VudHJhbCBwbGFjZSB0byBtYXAgc29tZQotICogSUFOQSBjaGFyc2V0IG5hbWUgdG8gYSBKYXZhIGNoYXJzZXQgbmFtZS4gSW4gMS40IEpSRSdzIHRoaXMgbW9zdGx5IGlzIGEKLSAqIHRoaW4gd3JhcHBlciBvZiBleGlzdGluZyBDaGFyc2V0IGZ1bmN0aW9uYWxpdHkuIEl0IGRvZXMsIGhvd2V2ZXIsIGFsbG93Ci0gKiBzb21lICJvdmVycmlkaW5nIiBvZiB0aGUgYnVpbHQgaW4gSlJFIG1hcHBpbmdzIGluIHRoZSBldmVudCB0aGV5IGFyZQotICogbmVjZXNzYXJ5LiBTZWUgQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgYWxzbyBwcm92aWRlcyBzb21lIGNvbnZlbmllbnQgaHVtYW4gcmVhZGFibGUgZGVzY3JpcHRpb24gZm9yIHRoZQotICogY2hhcnNldCBuYW1lcyB3aGljaCBjYW4gYmUgdXNlZCBpbiB1c2VyIGludGVyZmFjZXMuIFRoZSBkZXNjcmlwdGlvbiBpcyBOTAotICogYXdhcmUgYmFzZWQgb24gbG9jYWxlLiBUaGUgZGF0YSBpcyBwb3B1bGF0ZWQgdmlhIHRoZSBjaGFyc2V0LnByb3BlcnRpZXMKLSAqIGZpbGUgb25seSBvbmNlLCBiYXNlZCBvbiBzdGF0aWMgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGhhc2h0YWJsZXMuCi0gKiA8cD4KLSAqIFRoZSBJQU5BIHRhZ3MgYXJlIGJhc2VkIG9uIHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBmb3VuZCBhdCB0aGUKLSAqIGh0dHA6Ly93d3cuaWFuYS5vcmcgc2l0ZS4gU3BlY2lmaWNhbGx5IHNlZQotICogaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9jaGFyYWN0ZXItc2V0cwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tbW9uQ2hhcnNldE5hbWVzIHsKLQotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgZGVmYXVsdElBTkFtYXBwaW5ncyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgZW5jb2RpbmdzID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBzdXBwb3J0ZWRFbmNvZGluZ0Rpc3BsYXlOYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGxpc3Qgb2YgY29tbW9ubHkgYXZhaWxhYmxlIGVuY29kaW5nIG5hbWVzLiBTdWl0YWJsZSBmb3IKLQkgKiBwb3B1bGF0aW5nIGEgVUkgZGlhbG9nIG9yIGRyb3AgZG93bi4gVGhpcyBsaXN0IHdvdWxkIGJlIGEgc3Vic2V0IG9mIGFsbAotCSAqIHBvc3NpYmxlIGNoYXJzZXRzIHRoZSBWTSBzdXBwb3J0cyAod2hpY2ggY2FuIGdldCBpbnRvIHRoZSBodW5kcmVkcykuCi0JICogRm9yIHRoZSBWTSBzdXBwb3J0ZWQgY2hhcnNldHMsIHVzZQotCSAqIDxjb2RlPkNoYXJzZXQuYXZhaWxhYmxlQ2hhcnNldHMoKTwvY29kZT4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZ1tdCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDb21tb25DaGFyc2V0TmFtZXMoKSB7Ci0JCVN0cmluZ1tdIGVuYyA9IG5ldyBTdHJpbmdbZ2V0RW5jb2RpbmdzKCkuc2l6ZSgpXTsKLQkJZ2V0RW5jb2RpbmdzKCkudG9BcnJheShlbmMpOwotCQlyZXR1cm4gZW5jOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVmYXVsdElBTkFtYXBwaW5ncy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIGdldERlZmF1bHRJQU5BTWFwcGluZ3MoKSB7Ci0JCWlmIChkZWZhdWx0SUFOQW1hcHBpbmdzID09IG51bGwpIHsKLQkJCWRlZmF1bHRJQU5BbWFwcGluZ3MgPSBuZXcgUHJvcGVydGllcygpOwotCQkJQnVuZGxlIGtleUJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShJQ29kZWRSZXNvdXJjZVBsdWdpbi5JRCk7Ci0JCQlJUGF0aCBrZXlQYXRoID0gbmV3IFBhdGgoImNvbmZpZy9kZWZhdWx0SUFOQS5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCVVSTCBsb2NhdGlvbiA9IFBsYXRmb3JtLmZpbmQoa2V5QnVuZGxlLCBrZXlQYXRoKTsKLQkJCUlucHV0U3RyZWFtIHByb3BlcnRpZXNJbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXByb3BlcnRpZXNJbnB1dFN0cmVhbSA9IGxvY2F0aW9uLm9wZW5TdHJlYW0oKTsKLQkJCQlkZWZhdWx0SUFOQW1hcHBpbmdzLmxvYWQocHJvcGVydGllc0lucHV0U3RyZWFtKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWYgY2FuJ3QgcmVhZCwganVzdCBhc3N1bWUgdGhlcmUncyBubwotCQkJCS8vIGRlZmF1bHQgSUFOQSBtYXBwaW5ncwotCQkJCS8vIGFuZCByZXBlYXRlZCBhdHRlbXB0cyB3aWxsIG5vdCBvY2N1ciwKLQkJCQkvLyBzaW5jZSB0aGV5Ci0JCQkJLy8gd2lsbCBiZSByZXByZXNlbnRlZCBieSBhbiBlbXB0eQotCQkJCS8vIFByb3BlcnRpZXMgb2JqZWN0Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRJQU5BbWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBkaXNwbGF5ICh0cmFuc2xhdGVkKSBzdHJpbmcgZm9yIGVuY29kaW5nIG5hbWUuIElmIHRoZXJlIGlzIG5vCi0JICogImN1c3RvbSIgdHJhbnNsYXRlZCB2ZXJzaW9uIGF2YWlsYWJsZSwgaXQgZGVmZXJzIHRvIHRoZXIgVk0ncyBDaGFyc2V0Ci0JICogc3VwcG9ydC4gSXQgd2lsbCByZXR1cm4gbnVsbCBpZiBubyBkaXNwbGF5IG5hbWUgaXMgYXZhaWxhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIGNoYXJzZXQgbmFtZQotCSAqIEByZXR1cm4gSHVtYW4gZnJpZW5kbHkgZGlzcGxheSBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZyhTdHJpbmcgY2hhcnNldE5hbWUpIHsKLQkJaWYgKGNoYXJzZXROYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHJlc3VsdCA9IChTdHJpbmcpIGdldFN1cHBvcnRlZEVuY29kaW5nRGlzcGxheU5hbWVzKCkuZ2V0KGNoYXJzZXROYW1lKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkvLyBpZiB3ZSBkb24ndCBoYXZlIGEgc3BlY2lhbCBvbmUsIGp1c3QgcmV0dXJuCi0JCQkvLyB3aGF0J3MgcHJvdmlkZWQgYnkgQ2hhcnNldAotCi0JCQl0cnkgewotCQkJCUNoYXJzZXQgY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShjaGFyc2V0TmFtZSk7Ci0JCQkJcmVzdWx0ID0gY2hhcnNldC5kaXNwbGF5TmFtZSgpOwotCQkJfQotCQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWYgbm90IHN1cHBvcnRlZCwgdGhlIGRpc3BsYXkgbmFtZSBpcwotCQkJCS8vIHRoZSBsZWFzdCBvZiBjbGllbnRzIGNvbmNlcm5zIDopCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGphdmFFbmNvZGluZ3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGdldEVuY29kaW5ncygpIHsKLQkJaWYgKGVuY29kaW5ncyA9PSBudWxsKSB7Ci0JCQlpbml0SGFzaFRhYmxlcygpOwotCQl9Ci0JCXJldHVybiBlbmNvZGluZ3M7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SWFuYVByZWZlcnJlZENoYXJzZXROYW1lKFN0cmluZyBjaGFyc2V0TmFtZSkgewotCQlTdHJpbmcgcHJlZmVycmVkTmFtZSA9IGNoYXJzZXROYW1lOwotCi0JCXRyeSB7Ci0JCQlDaGFyc2V0IGNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoY2hhcnNldE5hbWUpOwotCQkJaWYgKGNoYXJzZXQubmFtZSgpICE9IG51bGwpIHsKLQkJCQlwcmVmZXJyZWROYW1lID0gY2hhcnNldC5uYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBqdXN0IHJldHVybiBpbnB1dCBpZiBpbGxlZ2FsCi0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBqdXN0IHJldHVybiBpbnB1dCBpZiBpbGxlZ2FsCi0JCX0KLQkJcmV0dXJuIHByZWZlcnJlZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRlZmF1bHQgSUFOQSBuYW1lIHRoYXQgaXMgbGlzdGVkIGluIENvbW1vbkNoYXJzZXROYW1lcy4gSGVyZQotCSAqIGlzIGhvdyBpdCBjaGVja3M6IDEuIGNoZWNrIHRvIHNlZSBpZiBjaGFyc2V0TmFtZSBpcyBpbiB0aGUKLQkgKiBDb21tb25DaGFyc2V0TmFtZXMgbGlzdCBhbmQgaWYgc28sIGp1c3QgcmV0dXJuIGl0LiAyLiBjaGVjayB0byBzZWUgaWYKLQkgKiBjaGFyc2V0TmFtZSBpcyBsaXN0ZWQgaW4gZGVmYXVsdElBTkFtYXBwaW5ncyB3aGljaCBjb250YWlucyBhIG1hcHBpbmcKLQkgKiBvZiBtb3JlIGNvbW1vbiBlbmNvZGluZ3MgYW5kIHRoZSBkZWZhdWx0IElBTkEgbmFtZSB0aGV5IHNob3VsZCBtYXAgdG8uCi0JICogMy4gcmV0dXJuIGRlZmF1bHRJYW5hTmFtZSBpZiBhbGwgZWxzZSBmYWlscwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZWZlcnJlZERlZmF1bHRJYW5hTmFtZShTdHJpbmcgY2hhcnNldE5hbWUsIFN0cmluZyBkZWZhdWx0SWFuYU5hbWUpIHsKLQkJU3RyaW5nIHByZWZlcnJlZE5hbWUgPSBkZWZhdWx0SWFuYU5hbWU7Ci0JCVN0cmluZyBndWVzc2VkTmFtZSA9IGNoYXJzZXROYW1lOwotCQl0cnkgewotCQkJZ3Vlc3NlZE5hbWUgPSBDb2RlZElPLmdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoY2hhcnNldE5hbWUpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgewotCQkJLy8ganVzdCBpZ25vcmUgaWYgaWxsZWdhbAotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJLy8ganVzdCBpZ25vcmUgaWYgaWxsZWdhbAotCQl9Ci0JCWlmIChnZXRFbmNvZGluZ3MoKS5jb250YWlucyhndWVzc2VkTmFtZSkpCi0JCQlwcmVmZXJyZWROYW1lID0gZ3Vlc3NlZE5hbWU7Ci0JCWVsc2UgewotCQkJcHJlZmVycmVkTmFtZSA9IGdldERlZmF1bHRJQU5BTWFwcGluZ3MoKS5nZXRQcm9wZXJ0eShndWVzc2VkTmFtZSwgcHJlZmVycmVkTmFtZSk7Ci0JCX0KLQotCQlyZXR1cm4gcHJlZmVycmVkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGdldFN1cHBvcnRlZEVuY29kaW5nRGlzcGxheU5hbWVzKCkgewotCQlpZiAoc3VwcG9ydGVkRW5jb2RpbmdEaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJaW5pdEhhc2hUYWJsZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwcG9ydGVkRW5jb2RpbmdEaXNwbGF5TmFtZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0SGFzaFRhYmxlcygpIHsKLQkJaWYgKHN1cHBvcnRlZEVuY29kaW5nRGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCS8vIEluaXRpYWxpemUgaGFzaCB0YWJsZSBmb3IgZW5jb2RpbmcgdGFibGUKLQkJCXN1cHBvcnRlZEVuY29kaW5nRGlzcGxheU5hbWVzID0gbmV3IEhhc2h0YWJsZSgpOwotCQkJZW5jb2RpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQkJSW5wdXRTdHJlYW0gYnVuZGxlU3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJVVJMIGJ1bmRsZVVSTCA9IFBsYXRmb3JtLmZpbmQoUGxhdGZvcm0uZ2V0QnVuZGxlKElDb2RlZFJlc291cmNlUGx1Z2luLklEKSwgUGF0aC5mcm9tT1NTdHJpbmcoIiRubCQvY29uZmlnL2NoYXJzZXQucHJvcGVydGllcyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChidW5kbGVVUkwgIT0gbnVsbCkgewotCQkJCQlidW5kbGVTdHJlYW0gPSBidW5kbGVVUkwub3BlblN0cmVhbSgpOwotCQkJCQlidW5kbGUgPSBuZXcgUHJvcGVydHlSZXNvdXJjZUJ1bmRsZShidW5kbGVTdHJlYW0pOwotCQkJCX0KLQotCQkJCVN0cmluZyB0b3RhbE51bVN0cmluZyA9IGJ1bmRsZS5nZXRTdHJpbmcoInRvdGFsbnVtYmVyIik7Ly8kTk9OLU5MUy0xJAotCQkJCWludCB0b3RhbE51bSA9IDA7Ci0JCQkJaWYgKHRvdGFsTnVtU3RyaW5nLmxlbmd0aCgpICE9IDApIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXRvdGFsTnVtID0gSW50ZWdlci52YWx1ZU9mKHRvdGFsTnVtU3RyaW5nKS5pbnRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkJdG90YWxOdW0gPSAwOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbE51bTsgaSsrKSB7Ci0JCQkJCVN0cmluZyBpYW5hID0gYnVuZGxlLmdldFN0cmluZygiY29kZXNldC4iICsgaSArICIuaWFuYSIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBkaXNwbGF5TmFtZSA9IGJ1bmRsZS5nZXRTdHJpbmcoImNvZGVzZXQuIiArIGkgKyAiLmxhYmVsIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCQkJCQllbmNvZGluZ3MuYWRkKGlhbmEpOwotCQkJCQlzdXBwb3J0ZWRFbmNvZGluZ0Rpc3BsYXlOYW1lcy5wdXQoaWFuYSwgZGlzcGxheU5hbWUpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiaW52YWxpZCBpbnN0YWxsIG9yIGNvbmZpZ3VyYXRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGJ1bmRsZVN0cmVhbSAhPSBudWxsKQotCQkJCQkJYnVuZGxlU3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQkvLyB1bml0IHRlc3Qgb25seQotCQlTdHJpbmcgdGVzdCA9ICJDcDEyNTIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZXN1bHQgPSBDb21tb25DaGFyc2V0TmFtZXMuZ2V0SWFuYVByZWZlcnJlZENoYXJzZXROYW1lKHRlc3QpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4odGVzdCArICIgLS0+ICIgKyByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0KLQkJdGVzdCA9ICJNUzkzMiI7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0ID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldElhbmFQcmVmZXJyZWRDaGFyc2V0TmFtZSh0ZXN0KTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3QgKyAiIC0tPiAiICsgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIENvbW1vbkNoYXJzZXROYW1lcygpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdEhhc2hUYWJsZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4N2UwM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotLyoqCi0gKiBDb21tb24gcHJlZmVyZW5jZSBrZXlzIHVzZWQgdG8gc3BlY2lmeSBlbmNvZGluZyBhbmQgZW5kIG9mIGxpbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcyB7Ci0JCi0JcHJpdmF0ZSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcygpIHsKLQkJLy8gZW1wdHkgcHJpdmF0ZSBjb25zdHJ1Y3RvciBzbyB1c2VycyBjYW5ub3QgaW5zdGFudGlhdGUgY2xhc3MKLQl9Ci0KLQkvKioKLQkgKiBDb25zdGFudCB0byBiZSB1c2VkIHdoZW4gcmVmZXJyaW5nIHRvIENSL01BQyBsaW5lIGRlbGltaXRlcgotCSAqIEBkZXByZWNhdGVkIC0gbm8gbG9uZ2VyIHVzZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9ICJFT0xfTWFjIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIENvbnN0YW50IHRvIGJlIHVzZWQgd2hlbiByZWZlcnJpbmcgdG8gQ1JMRi9XSU5ET1dTIGxpbmUgZGVsaW1pdGVyCi0JICogQGRlcHJlY2F0ZWQgLSBubyBsb25nZXIgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSTEYgPSAiRU9MX1dpbmRvd3MiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIGVuZC1vZi1saW5lIGNoYXJhY3RlcihzKSB0byB1c2UuCi0JICogQGRlcHJlY2F0ZWQgLSBubyBsb25nZXIgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9PRl9MSU5FX0NPREUgPSAiZW5kT2ZMaW5lQ29kZSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBjaGFyYWN0ZXIgY29kZSB0byB1c2Ugd2hlbiByZWFkaW5nIGEgZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9DT0RFU0VUID0gImlucHV0Q29kZXNldCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RhbnQgdG8gYmUgdXNlZCB3aGVuIHJlZmVycmluZyB0byBMRi9VTklYIGxpbmUgZGVsaW1pdGVyCi0JICogQGRlcHJlY2F0ZWQgLSBubyBsb25nZXIgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExGID0gIkVPTF9Vbml4IjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIENvbnN0YW50IHRvIGJlIHVzZWQgd2hlbiByZWZlcnJpbmcgdG8gTm8gdHJhbnNsYXRpb24gb2YgbGluZSBkZWxpbWl0ZXJzCi0JICogQGRlcHJlY2F0ZWQgLSBubyBsb25nZXIgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX1RSQU5TTEFUSU9OID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgY2hhcmFjdGVyIGNvZGUgdG8gdXNlIHdoZW4gd3JpdGluZyBhIGZpbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0NPREVTRVQgPSAib3V0cHV0Q29kZXNldCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIENSL01BQyBsaW5lIGRlbGltaXRlcgotCSAqIEBkZXByZWNhdGVkIC0gbm8gbG9uZ2VyIHVzZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfQ1IgPSAiXHIiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBDUkxGL1dJTkRPV1MgbGluZSBkZWxpbWl0ZXIKLQkgKiBAZGVwcmVjYXRlZCAtIG5vIGxvbmdlciB1c2VkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX0NSTEYgPSAiXHJcbiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIExGL1VOSVggbGluZSBkZWxpbWl0ZXIKLQkgKiBAZGVwcmVjYXRlZCAtIG5vIGxvbmdlciB1c2VkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX0xGID0gIlxuIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdHJpbmcgVXNlIDMgYnl0ZSBCT00gKEJ5dGUgT3JkZXIgTWFyaykgd2hlbiBzYXZpbmcgVVRGLTggZW5jb2RlZCBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV8zQllURV9CT01fV0lUSF9VVEY4ID0gIlVzZTNCeXRlQk9NV2l0aFVURjgiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMjhkYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db250ZW50QmFzZWRQcmVmZXJlbmNlR2F0ZXdheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOwotCi0KLXB1YmxpYyBjbGFzcyBDb250ZW50QmFzZWRQcmVmZXJlbmNlR2F0ZXdheSB7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERFRkFVTFRfTE9DQVRJT04gPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBSVU5USU1FX1hNTF9JRCA9ICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBTU0VfWE1MX0lEID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gcGx1Z2luSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBidW5kbGVFeGlzdHMoU3RyaW5nIHBsdWdpbklkKSB7Ci0KLQkJLy8gdGhpcyBqdXN0IHZlcmlmaWVzIHRoZXJlJ3MgcmVhbGx5IGEgcGx1Z2luIHdpdGggdGhpcyBJRCBpbiAic3RhY2siCi0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQlyZXR1cm4gKCEoYnVuZGxlID09IG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENvbnRyaWJ1dG9yUGx1Z2luSWQoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gaGF2ZSByZWdpc3RyYXRpb24gaW5mbyBoZXJlLCBidXQgZm9yIG5vdywgd2UnbGwgdXNlCi0JCS8vIHNpbXBsZSBoZXVyaXN0aWMgdG8gY292ZXIgdGhlIGNhc2VzIHdlIGtub3cgYWJvdXQuCi0JCVN0cmluZyBmdWxsSWQgPSBudWxsOwotCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJZnVsbElkID0gREVGQVVMVF9MT0NBVElPTjsKLQkJfSBlbHNlIHsKLQkJCWZ1bGxJZCA9IGNvbnRlbnRUeXBlLmdldElkKCk7Ci0JCX0KLQkJLy8gb25seSBvbmUga25vd24gY2FzZSwgc28gZmFyLCBvZiBoYXJkIGNvZGVkIHJlLWRpcmVjdGlvbgotCQkvLyAobm90IHN1cmUgdGhpcyBpcyBldmVuIG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSkuCi0JCS8vIFdlIGRvbid0IHdhbnQgdG8gc3RvcmUvY2hhbmdlIHJ1bnRpbWUueG1sIHByZWZlcmVuY2VzCi0JCWlmIChSVU5USU1FX1hNTF9JRC5lcXVhbHMoZnVsbElkKSkgewotCQkJZnVsbElkID0gU1NFX1hNTF9JRDsKLQkJfQotCQlTdHJpbmcgcGx1Z2luSWQgPSBpbmZlclBsdWdpbklkKGZ1bGxJZCk7Ci0JCXJldHVybiBwbHVnaW5JZDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQcmVmZXJlbmNlcyBnZXREZWZhdWx0UHJlZmVyZW5jZXMoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgZWNsaXBzZVByZWZlcmVuY2VzID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0Um9vdE5vZGUoKTsKLQkJLy8gVE9ETzogZXZlbnRhdWxseSBuZWVkIGV4dGVuc2lvbiBtZWNoYW5pc20gdG8gYXZvaWQgdGhlc2UgaGFyZCBjb2RlZAotCQkvLyBtZWNoYW5pc20uCi0JCS8vIFRoZSBpZGVhIGlzIHRvIGxvYWQvc3RvcmUgYmFzZWQgb24gcGx1Z2luJ3MgcHJlZmVyZW5jZXMsIHdoZXJlIHRoZQotCQkvLyBjb250ZW50IHR5cGUgd2FzIGNvbnRyaWJ1dGVkCi0JCS8vIEV2ZW50dWFsbHksIHRvbywgd2UgY291bGQgZG8gbW9yZSAiZHluYW1pYyBsb29rdXAiIHRvIGdldCBwYXJlbnQKLQkJLy8gdHlwZXMgZm9yIGRlZmF1bHRzLCBldGMuCi0KLQkJLy8gR2V0IGRlZmF1bHQgcGx1Z2luIHByZWZlcmVuY2VzCi0JCVN0cmluZyBwbHVnaW5QcmVmZXJlbmNlTG9jYXRpb24gPSBEZWZhdWx0U2NvcGUuU0NPUEUgKyBJUGF0aC5TRVBBUkFUT1IgKyBnZXRDb250cmlidXRvclBsdWdpbklkKGNvbnRlbnRUeXBlKTsKLQkJUHJlZmVyZW5jZXMgcGx1Z2luUHJlZmVyZW5jZXMgPSBlY2xpcHNlUHJlZmVyZW5jZXMubm9kZShwbHVnaW5QcmVmZXJlbmNlTG9jYXRpb24pOwotCi0JCS8vIHRoZSBiZWxvdyBjb2RlIGRvZXMgbm90IHdvcmsgYXQgdGhpcyB0aW1lIGJlY2F1c2UgY29udGVudCB0eXBlCi0JCS8vIHByZWZlcmVuY2VzIGFyZSBzdG9yZWQgaW4gdGhlIHBsYWNlIGFzIHBsdWdpbiBwcmVmZXJlbmNlcwotCi0JCS8vCQlQcmVmZXJlbmNlcyBjb250ZW50UHJlZmVyZW5jZXMgPSBudWxsOwotCQkvLwkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJLy8JCQljb250ZW50UHJlZmVyZW5jZXMgPSBwbHVnaW5QcmVmZXJlbmNlcy5ub2RlKGNvbnRlbnRUeXBlLmdldElkKCkpOwotCQkvLwkJfQotCQkvLwkJZWxzZSB7Ci0JCS8vCQkJY29udGVudFByZWZlcmVuY2VzID0gcGx1Z2luUHJlZmVyZW5jZXMubm9kZShERUZBVUxUX0xPQ0FUSU9OICk7Ci0JCS8vCQl9Ci0JCS8vCi0JCS8vCQlyZXR1cm4gY29udGVudFByZWZlcmVuY2VzOwotCi0JCXJldHVybiBwbHVnaW5QcmVmZXJlbmNlczsKLQotCX0KLQotCXByaXZhdGUgc3RhdGljIFByZWZlcmVuY2VzIGdldERlZmF1bHRQcmVmZXJlbmNlcyhTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlkKTsKLQkJcmV0dXJuIGdldERlZmF1bHRQcmVmZXJlbmNlcyhjb250ZW50VHlwZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcyhJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBlY2xpcHNlUHJlZmVyZW5jZXMgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRSb290Tm9kZSgpOwotCQkvLyBUT0RPOiBldmVudGF1bGx5IG5lZWQgZXh0ZW5zaW9uIG1lY2hhbmlzbSB0byBhdm9pZCB0aGVzZSBoYXJkIGNvZGVkCi0JCS8vIG1lY2hhbmlzbS4KLQkJLy8gVGhlIGlkZWEgaXMgdG8gbG9hZC9zdG9yZSBiYXNlZCBvbiBwbHVnaW4ncyBwcmVmZXJlbmNlcywgd2hlcmUgdGhlCi0JCS8vIGNvbnRlbnQgdHlwZSB3YXMgY29udHJpYnV0ZWQKLQkJLy8gRXZlbnR1YWxseSwgdG9vLCB3ZSBjb3VsZCBkbyBtb3JlICJkeW5hbWljIGxvb2t1cCIgdG8gZ2V0IHBhcmVudAotCQkvLyB0eXBlcyBmb3IgZGVmYXVsdHMsIGV0Yy4KLQotCQkvLyBHZXQgaW5zdGFuY2UgcGx1Z2luIHByZWZlcmVuY2VzCi0JCVN0cmluZyBwbHVnaW5QcmVmZXJlbmNlTG9jYXRpb24gPSBQbHVnaW4uUExVR0lOX1BSRUZFUkVOQ0VfU0NPUEUgKyBJUGF0aC5TRVBBUkFUT1IgKyBnZXRDb250cmlidXRvclBsdWdpbklkKGNvbnRlbnRUeXBlKTsKLQkJUHJlZmVyZW5jZXMgcGx1Z2luUHJlZmVyZW5jZXMgPSBlY2xpcHNlUHJlZmVyZW5jZXMubm9kZShwbHVnaW5QcmVmZXJlbmNlTG9jYXRpb24pOwotCi0JCS8vIHRoZSBiZWxvdyBjb2RlIGRvZXMgbm90IHdvcmsgYXQgdGhpcyB0aW1lIGJlY2F1c2UgY29udGVudCB0eXBlCi0JCS8vIHByZWZlcmVuY2VzIGFyZSBzdG9yZWQgaW4gdGhlIHBsYWNlIGFzIHBsdWdpbiBwcmVmZXJlbmNlcwotCi0JCS8vCQlQcmVmZXJlbmNlcyBjb250ZW50UHJlZmVyZW5jZXMgPSBudWxsOwotCQkvLwkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJLy8JCQljb250ZW50UHJlZmVyZW5jZXMgPSBwbHVnaW5QcmVmZXJlbmNlcy5ub2RlKGNvbnRlbnRUeXBlLmdldElkKCkpOwotCQkvLwkJfQotCQkvLwkJZWxzZSB7Ci0JCS8vCQkJY29udGVudFByZWZlcmVuY2VzID0gcGx1Z2luUHJlZmVyZW5jZXMubm9kZShERUZBVUxUX0xPQ0FUSU9OICk7Ci0JCS8vCQl9Ci0JCS8vCi0JCS8vCQlyZXR1cm4gY29udGVudFByZWZlcmVuY2VzOwotCQlyZXR1cm4gcGx1Z2luUHJlZmVyZW5jZXM7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpOwotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoY29udGVudFR5cGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZWZlcmVuY2VzU3RyaW5nKElDb250ZW50VHlwZSBjb250ZW50VHlwZSwgU3RyaW5nIGtleSkgewotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKGNvbnRlbnRUeXBlKTsKLQkJU3RyaW5nIHZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0KGtleSwgZ2V0RGVmYXVsdFByZWZlcmVuY2VzKGNvbnRlbnRUeXBlKS5nZXQoa2V5LCBudWxsKSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcmVmZXJlbmNlc1N0cmluZyhTdHJpbmcgY29udGVudFR5cGVJZCwgU3RyaW5nIGtleSkgewotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKGNvbnRlbnRUeXBlSWQpOwotCQlTdHJpbmcgdmFsdWUgPSBwcmVmZXJlbmNlcy5nZXQoa2V5LCBnZXREZWZhdWx0UHJlZmVyZW5jZXMoY29udGVudFR5cGVJZCkuZ2V0KGtleSwgbnVsbCkpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZ1bGxJZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgaW5mZXJQbHVnaW5JZChTdHJpbmcgZnVsbElkKSB7Ci0JCS8vIHNpbXBseSB0cmltIG9mZiBsYXN0ICJzZWdtZW50IiBmcm9tIGZ1bGwgSUQuCi0JCWludCBsYXN0U2VnbWVudFBvcyA9IGZ1bGxJZC5sYXN0SW5kZXhPZignLicpOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBudWxsOwotCQlpZiAobGFzdFNlZ21lbnRQb3MgIT0gLTEpIHsKLQkJCXBsdWdpbklkID0gZnVsbElkLnN1YnN0cmluZygwLCBsYXN0U2VnbWVudFBvcyk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyB3ZWlyZCBjYXNlPyBXZSdsbCBhdCBsZWFzdCBwdXQvZ2V0IHRoZW0gc29tZXdoZXJlCi0JCQlwbHVnaW5JZCA9IERFRkFVTFRfTE9DQVRJT047Ci0JCX0KLQkJaWYgKCFidW5kbGVFeGlzdHMocGx1Z2luSWQpKSB7Ci0JCQkvLyB1c2UgZGVmYXVsdCBsb2NhdGlvbgotCQkJcGx1Z2luSWQgPSBERUZBVUxUX0xPQ0FUSU9OOwotCQl9Ci0JCXJldHVybiBwbHVnaW5JZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM4MjY3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5Bc3NlcnQ7Ci0KLQotLyoqCi0gKiBBIGNvbnZlbmllbmNlIGNsYXNzIHRvIHN0YXRpY2FsbHkgZ2V0IHByZWZlcmVuZW5jZXMuCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcyB7Ci0KLQkvLyBhY3R1YWxseSBhIG51bGwvZW1wdHkgc3RyaW5nIGFsc28gbWVhbnMgdXNlIHdvcmtiZW5jaCBkZWZhdWx0IHNvIHRoaXMKLQkvLyBjb25zdGFudCBtaWdodCBub3QgcmVhbGx5IGJlIG5lY2Vzc2FyeQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktCRU5DSF9ERUZBVUxUID0gIldPUktCRU5DSF9ERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0SmF2YVBsYXRmb3JtRGVmYXVsdEVuY29kaW5nKCkgewotCQkvLyBub3RlOiBpdHMgaW1wb3J0YW50IHRvIHVzZSB0aGlzIHN5c3RlbSBwcm9wZXJ0eSwKLQkJLy8gaW5zdGVhZAotCQkvLyBvZgotCQkvLyBCeXRlVG9DaGFyQ29udmVydGVyLmdldERlZmF1bHQoKS5nZXRDaGFyYWN0ZXJFbmNvZGluZygpCi0JCS8vIGlub3JkZXIgdG8gaGFuZGxlIGNoYW5nZXMgIm9uIHRoZSBmbHkiLiB0aGUKLQkJLy8gQnl0ZVRvQ2hhckNvbnZlcnRlcgotCQkvLyBkZWZhdWx0IGlzIGFwcGFyZW50bHkgc2V0IG9ubHkgd2hlbiBWTSBzdGFydHMuCi0JCS8vIFRoZXJlJ3Mgbm90IHJlYWxseSBhbnkgImN1c29tdGVyIHNjbmVyZXJpb3MiCi0JCS8vIHRoYXQgY2hhbmdlIHRoZQotCQkvLyBkZWZhdWx0IGVuY29kaW5nICJvbiB0aGUgZmx5IiwgYnV0IGl0cyBhdCBsZWFzdAotCQkvLyB1c2VkIGR1cmluZwotCQkvLyBvdXIgYXV0b21hdGVkIHRlc3RzLgotCQlTdHJpbmcgZW5jID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcmV0dXJuIGJsYW5rIGFzIG51bGwKLQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZW5jOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIG5ld0xpbmVDb2RlID0gbnVsbDsKLQkJbmV3TGluZUNvZGUgPSBDb250ZW50QmFzZWRQcmVmZXJlbmNlR2F0ZXdheS5nZXRQcmVmZXJlbmNlc1N0cmluZyhjb250ZW50VHlwZUlkLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5FTkRfT0ZfTElORV9DT0RFKTsKLQkJaWYgKG5ld0xpbmVDb2RlID09IG51bGwpCi0JCQlyZXN1bHQgPSBudWxsOwotCQllbHNlIGlmIChuZXdMaW5lQ29kZS5lcXVhbHMoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1IpKQotCQkJcmVzdWx0ID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuU1RSSU5HX0NSOwotCQllbHNlIGlmIChuZXdMaW5lQ29kZS5lcXVhbHMoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuTEYpKQotCQkJcmVzdWx0ID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuU1RSSU5HX0xGOwotCQllbHNlIGlmIChuZXdMaW5lQ29kZS5lcXVhbHMoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1JMRikpCi0JCQlyZXN1bHQgPSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5TVFJJTkdfQ1JMRjsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGN1cnJlbnQgb3V0cHV0IGVuY29kaW5nIHByZWZlcmVuY2UgZm9yIGNvbnRlbnRUeXBlSWRlbnRpZmllcgotCSAqICh1bmlxdWUgSUFOQSBlbmNvZGluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRVc2VyUHJlZmVycmVkQ2hhcnNldE5hbWUoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJU3RyaW5nIHByZWZFbmNvZGluZyA9IENvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmdldFByZWZlcmVuY2VzU3RyaW5nKGNvbnRlbnRUeXBlSWQsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQkJU3RyaW5nIGVuY29kaW5nID0gcHJlZkVuY29kaW5nOwotCQkvLyBnZXQgd29ya2JlbmNoIGVuY29kaW5nIHByZWZlcmVuY2UgaWYgcHJlZmVyZW5jZQotCQkvLyByZXF1ZXN0cyBpdAotCQlpZiAocHJlZkVuY29kaW5nID09IG51bGwgfHwgcHJlZkVuY29kaW5nLnRyaW0oKS5sZW5ndGgoKSA9PSAwIHx8IHByZWZFbmNvZGluZy5lcXVhbHMoQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLldPUktCRU5DSF9ERUZBVUxUKSkgewotCQkJZW5jb2RpbmcgPSBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuZ2V0V29ya2JlbmNoUHJlZmVycmVkQ2hhcnNldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gZW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdG8gZ2V0IHNwZWNpZmllZCBwcmVmZXJlbmNlLiBTdWJjbGFzc2VzIGNhbid0IG92ZXJyaWRlLAotCSAqIHNpbmNlIHdlIGV4cGVjdCB0aGlzIHRvIHdvcmsgaW4gYSBjb25zaXN0ZW50IHdheS4gTm90ZTogdGhpcyBpcwotCSAqIHNwZWNpZmljIHRvIEhUTUwgYW5kIENTUyBhbmQgaXMgaW50ZW5kZWQgdG8gc3VwcGx5IGEgImRlZmF1bHQgc3BlYyIKLQkgKiBvdGhlciB0aGFuIHRoZSB3b3JrYmVuY2ggcGxhdGZvcm0ncyBkZWZhdWx0LCBvbmx5IGZvciB0aG9zZSBjYXNlcyB3aGVyZQotCSAqIHRoZXJlIGlzIG5vIGVuY29kaW5nIHNwZWNpZmllZCBhbnl3aGVyZSBlbHNlLCBlLmcuIGluIHRoZSBmaWxlLCBvciBhcyBhCi0JICogZmlsZSBvciBmb2xkZXIgcHJvcGVydHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0VXNlclNwZWNpZmllZERlZmF1bHRFbmNvZGluZ1ByZWZlcmVuY2UoKSB7Ci0JCVN0cmluZyBDb250ZW50VHlwZUlEX0hUTUwgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZ2V0VXNlclNwZWNpZmllZERlZmF1bHRFbmNvZGluZ1ByZWZlcmVuY2UoQ29udGVudFR5cGVJRF9IVE1MKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRVc2VyU3BlY2lmaWVkRGVmYXVsdEVuY29kaW5nUHJlZmVyZW5jZShTdHJpbmcgY29udGVudFR5cGVJRCkgewotCQlTdHJpbmcgZW5jID0gbnVsbDsKLQotCQkvLyBmaXJzdCB0cnkgdG8gZ2V0IGJhc2UncyBkZWZhdWx0IGVuY29kaW5nIGZvciBjb250ZW50IHR5cGUKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJRCk7Ci0JCWlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQllbmMgPSBjb250ZW50VHlwZS5nZXREZWZhdWx0Q2hhcnNldCgpOwotCQl9Ci0JCQotCQkvLyBuZXh0IHRyeSB0byBnZXQgc3NlJ3MgZGVmYXVsdCBlbmNvZGluZyBmb3IgY29udGVudCB0eXBlCi0JCWlmIChlbmMgPT0gbnVsbCB8fCBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWVuYyA9IENvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmdldFByZWZlcmVuY2VzU3RyaW5nKGNvbnRlbnRUeXBlSUQsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLklOUFVUX0NPREVTRVQpOwotCQl9Ci0JCQotCQkvLyBuZXh0LCBqdXN0IHRyeSBhbmQgdXNlIHdvcmtiZW5jaCBlbmNvZGluZwotCQlpZiAoZW5jID09IG51bGwgfHwgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQllbmMgPSBnZXRXb3JrYmVuY2hTcGVjaWZpZWREZWZhdWx0RW5jb2RpbmcoKTsKLQkJfQotCQkKLQkJLy8gcmV0dXJuIGJsYW5rIGFzIG51bGwKLQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZW5jOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgV29ya2JlbmNoIGVuY29kaW5nIHByZWZlcmVuY2UuIE5vdGU6IGlmIHdvcmtiZW5jaCBlbmNvZGluZyBpcwotCSAqIG51bGwsIHBsYXRmb3JtIGVuY29kaW5nIHdpbGwgYmUgcmV0dXJuZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFdvcmtiZW5jaFByZWZlcnJlZENoYXJzZXROYW1lKCkgewotCQlTdHJpbmcgY2hhcnNldCA9IFJlc291cmNlc1BsdWdpbi5nZXRFbmNvZGluZygpOwotCQljaGFyc2V0ID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldElhbmFQcmVmZXJyZWRDaGFyc2V0TmFtZShjaGFyc2V0KTsKLQkJcmV0dXJuIGNoYXJzZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBXb3JrYmVuY2ggZW5jb2RpbmcgcHJlZmVyZW5jZS4gV2lsbCByZXR1cm4gbnVsbCBpZiBub25lCi0JICogc3BlY2lmaWVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRXb3JrYmVuY2hTcGVjaWZpZWREZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCVJlc291cmNlc1BsdWdpbiByZXNvdXJjZVBsdWdpbiA9IFJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKTsKLQkJU3RyaW5nIGVuYyA9IHJlc291cmNlUGx1Z2luLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFJlc291cmNlc1BsdWdpbi5QUkVGX0VOQ09ESU5HKTsKLQkJLy8gcmV0dXJuIGJsYW5rIGFzIG51bGwKLQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZW5jOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHVzZURlZmF1bHROYW1lUnVsZXMoSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGVuY29kaW5nUHJvdmlkZXIpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBlbmMgPSBudWxsOwotCQllbmMgPSBlbmNvZGluZ1Byb3ZpZGVyLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBlbmM7Ci0JCX0gZWxzZSB7Ci0JCQllbmMgPSBnZXRVc2VyU3BlY2lmaWVkRGVmYXVsdEVuY29kaW5nUHJlZmVyZW5jZSgpOwotCQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcmVzdWx0ID0gZW5jOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZW5jID09IG51bGwgfHwgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCWVuYyA9IGdldFdvcmtiZW5jaFNwZWNpZmllZERlZmF1bHRFbmNvZGluZygpOwotCQkJCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IGVuYzsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZW5jID09IG51bGwgfHwgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCWVuYyA9IGdldEphdmFQbGF0Zm9ybURlZmF1bHRFbmNvZGluZygpOwotCQkJCQkvLyBlbmMgc2hvdWxkIG5ldmVyIGJlIG51bGwgKGJ1dCB3ZSdsbAotCQkJCQkvLyBjaGVjayBhbnl3YXkpCi0JCQkJCWlmIChlbmMgIT0gbnVsbCkgewotCQkJCQkJcmVzdWx0ID0gZW5jOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUFzc2VydC5pc05vdE51bGwoZW5jLCAicG9zdCBjb25kaXRpb24gaW52YWxpZCIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKGVuYyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0VuY29kaW5nTWVtZW50by5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9FbmNvZGluZ01lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE5NWE4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0VuY29kaW5nTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0byBzaW1wbHkgaG9sZCBpbmZvcm1hdGlvbiBhbmQgZGF0YSBhYm91dCB0aGUgdHlwZSBvZgotICogZW5jb2RpbmcgZm91bmQgZm9yIGEgcmVzb3VyY2UuIEl0IG5vdCBvbmx5IGluY2x1ZGVzIG5hbWVzLCBldGMuLCBidXQgYWxzbwotICogZ2l2ZXMgaGludHMgYWJvdXQgdGhlIGFsZ29yaXRobSwgb3IgcnVsZSwgdGhhdCB0aGUgZW5jb2RuZyB3YXMgZGV0ZXJtaW5lZC4KLSAqIEhhdmluZyBhbGwgdGhpcyBpbmZvIGluIGEgY2VudHJhbCBvYmplY3QsIGFzc29jaWF0ZWQgd2l0aCB0aGUgRG9jdW1lbnQKLSAqICh0ZWNobmljYWxseSwgSVN0cnVjdHVyZWREb2N1bWVudCksIGFsbG93cyBmb3IgYmV0dGVyIHVzZXIgZXJyb3IgbWVzc2FnZXMsCi0gKiBhbmQgYmV0dGVyIGhhbmRsaW5nIG9mIGtub3dpbmcgaG93IHRvIGR1bXAgYSBmaWxlLCBnaXZlbiB3ZSBrbm93IGhvdyBpdCB3YXMKLSAqIGxvYWRlZC4KLSAqIAotICogTm90ZTogdGhlIGRhdGEgaW4gdGhpcyBjbGFzcyBpcyBvbmx5IHZhbGlkIGlmIGl0cyBoYXMgYWN0dWFsbHkgZ29uZSB0aHJvdWdoCi0gKiB0aGUgbG9hZGluZyBvciBkdW1waW5nIHNlcXVlbmNlLiBJdCBpcyBub3QgYWNjdXJhdGUsIGZvciBleGFtcGxlLCBpZiBhCi0gKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgc2ltcGx5IGNyZWF0ZWQgYW5kIHRoZW4gc2V0VGV4dCBjYWxsZWQuIEluIHRoaXMgdHlwZQotICogb2YgY2FzZSwgYWNjdXJhY3kgZm9yIGxvYWRpbmcgYW5kIGR1bXBpbmcgaXMgbm90IHJlcXVpcmVkLCBzaW5jZSBpdHMgYWxsCi0gKiByZS1kaXNjb3ZlcmVkLiBPbmUgbGltaXRhdGlvbiBpcyB0aGF0IHN0cnVjdHVyZWREb2N1bWVudCdzIGNyZWF0ZWQgImZyb20KLSAqIHNjcmF0Y2giIHRoaXMgd2F5LCBkb24ndCBoYXZlIGFueSBlbmNvZGluZyBpbmZvcm1hdGlvbiB0byBjb3VudCBvbiwgYW5kCi0gKiB3b3VsZCBoYXZlIHRvIGFycmFuZ2UgdGhlIHByb2Nlc3NpbmcgdG8gYmUgZG9uZS4gKEFuZCBpdCBpcyBkb25lLAotICogYXV0b21hdGljYWxseSBpZiBnb2luZyB0aHJvdWdoIGxvYWRlciBvciBkdW1wZXIsIGJ1dCBwZXJoYXBzIG5vdCBpbiBmdXR1cmUKLSAqIG5ldyB1c2VzLiBUT0RPOiB0aGlzIGNhbiBiZSBpbnByb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuKQotICogCi0gKiBpc0luaXRpYWxpemVkIGlzIHNldCB3aGVuIHRoZSBsb2FkZXIgb3IgZHVtcGVyIHByb2Nlc3NlcyBoYXZlIGJlZW4gdXNlZCwKLSAqIGJ1dCBldmVuIHRoaXMgY2FuJ3QgYmUgY291bnRlZCBvbiAxMDAlIGlmIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBtb2RpZmllZAotICogc2luY2UuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEVuY29kaW5nTWVtZW50byBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTE9ORUQgPSAiY2xvbmVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVUID0gIkRlZmF1bHRzQXNzdW1lZEZvckVtcHR5SW5wdXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVFNfVVNFRF9EVUVfVE9fU01BTExfU1RSRUFNID0gImRlZmF1bHRzVXNlZER1ZVRvU21hbGxTdHJlYW0iOyAvLyROT04tTkxTLTEkCi0KLQotCS8qCi0JICogU3RyaW5ncyB0byBiZSB1c2VkIGZvciB0cmFjaW5nLiBUT0RPOiBuZWVkIHRvIGNsZWFuIHRoaXMgdXAsIHdlIG5vCi0JICogbG9uZ2VyIHVzZSBhbGwgb2YgdGhlbQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMgPSAiZGV0ZWN0ZWRTdGFuZGFyZFVuaWNvZGVCeXRlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1VORF9FTkNPRElOR19JTl9DT05URU5UID0gImZvdW5kRW5jb2RpbmdJbkNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9VTkRfRU5DT0RJTkdfSU5fU1RSRUFNID0gImZvdW5kRW5jb2RpbmdJblN0cmVhbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1VORF9FTkNPRElOR19JTl9TVFJVQ1RVUkVEX0RPQ1VNRU5UID0gImZvdW5kRW5jb2RpbmdJblN0cnVjdHVyZWREb2N1bWVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBHVUVTU0VEX0VOQ09ESU5HX0ZST01fU1RSRUFNID0gIkd1ZXNzRW5jb2RpbmdGcm9tU3RyZWFtIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfTkFNRV9GT1VORF9BU19JQU5BX05BTUUgPSAibm9NYXBwaW5nRm91bmRCdXRKYXZhTmFtZUZvdW5kVG9CZUlBTkFOYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfTkFNRV9GT1VORF9JTl9BTElBU19OQU1FID0gIm5vTWFwcGluZ0ZvdW5kQnV0SmF2YU5hbWVGb3VuZEluQWxpYXNUYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOT19JQU5BX05BTUVfRk9VTkQgPSAibm9NYXBwaW5nRm91bmRGcm9tSmF2YU5hbWVUb0lBTkFOYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRURfQ09OVEVOVF9UWVBFX0RFRkFVTFQgPSAiVXNlZENvbnRlbnRUeXBlRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVU0VEX0pBVkFfREVGQVVMVCA9ICJVc2VkSmF2YURlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFRF9NRU1FTlRPX0ZST01fTE9BRCA9ICJ1c2VkTWVtZW50b0Zyb21Mb2FkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRURfUFJPUEVSVFlfU0VUVElOR1MgPSAiVVNFRF9QUk9QRVJUWV9TRVRUSU5HUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVU0VEX1VTRVJfU1BFQ0lGSUVEX1BSRUZFUkVOQ0UgPSAiVXNlZFVzZXJTcGVjaWZpZWRQcmVmZXJlbmNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRURfV09SS1NQQUNFX0RFRkFVTFQgPSAiVXNlZFdvcmtzcGFjZURlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFUl9JU19VU0lOR19KQVZBX0VOQ09ESU5HID0gIlVzZXJJc1VzaW5nSmF2YUVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZBcHByb3ByaWF0ZURlZmF1bHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRldGVjdGVkQ2hhcnNldE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZkludmFsaWRFbmNvZGluZzsKLQotCi0JcHJpdmF0ZSBTdHJpbmcgZkphdmFDaGFyc2V0TmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gZlVuaWNvZGVTdHJlYW07Ci0JcHJpdmF0ZSBib29sZWFuIGZVVEY4M0J5dGVCT01Vc2VkOwotCQotCXByaXZhdGUgYnl0ZVtdIGZCT007Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQlFbmNvZGluZ01lbWVudG8gb2JqZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW9iamVjdCA9IChFbmNvZGluZ01lbWVudG8pIHN1cGVyLmNsb25lKCk7Ci0JCX0KLQkJY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlJ3JlIGltcGxlbWVudGluZyBoZXJlCi0JCX0KLQotCQlyZXR1cm4gb2JqZWN0OwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGVEZWZhdWx0LiBUaGlzIGlzIG9ubHkgc2V0IGlmIGFuIGludmFsaWQgZW5jb2RpbmcKLQkgKiB3YXMgZm91bmQsIGFuZCBjb250YWlucyBhbiBjaGFyc2V0IGFwcHJvcHJpYXRlIHRvIHVzZSBhcyBhIGRlZmF1bHQKLQkgKiB2YWx1ZSwgaWYsIGZvciBleGFtcGxlLCB0aGUgdXNlciBkZWNpZGVzIHRvIGxvYWQgdGhlIGRvY3VtZW50IGFueXdheSwKLQkgKiBldmVuIHRob3VnaCB0aGUgY2hhcnNldCB3YXMgZm91bmQgdG8gYmUgaW52YWxpZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCkgewotCQlpZiAoZkFwcHJvcHJpYXRlRGVmYXVsdCA9PSBudWxsKSB7Ci0JCQlmQXBwcm9wcmlhdGVEZWZhdWx0ID0gTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy51c2VEZWZhdWx0TmFtZVJ1bGVzKG51bGwpOwotCQl9Ci0JCXJldHVybiBmQXBwcm9wcmlhdGVEZWZhdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJzZXQgbmFtZSwgaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIGNoYXJzZXQgbmFtZQotCSAqIGZvdW5kIGluIGdldEphdmFDaGFyc2V0TmFtZS4gVGhpcyBjYW4gaGFwcGVuLCBmb3IgZXhhbXBsZSwgaWYgdGhlcmUgYXJlCi0JICogZGlmZmVyZW5jZXMgaW4gY2FzZS4gVGhpcyBtZXRob2QgbWlnaHQgcmV0dXJuIFNISUZUX0pJUywgYW5kIHRoZSB0aGUKLQkgKiBnZXRKYXZhQ2hhcnNldE5hbWUgbWlnaHQgcmV0dXJuIFNoaWZ0X0pJUyAtLSBpZiBTSElGVF9KSVMgd2FzIGRldGVjdGVkCi0JICogaW4gZmlsZS9kb2N1bWVudC4gSWYgdGhlIG9yaWdpbmFsIGZpbGUgY29udGFpbmVkIHRoZSBjb3JyZWN0IGNhc2UsIHRoZW4KLQkgKiB0aGlzIG1ldGhvZCB3b3VsZCByZXR1cm4gbnVsbC4gVGhlIGdldEphdmFDaGFyc2V0TmFtZSBpcyB0eXBpY2FsbHkgdGhlCi0JICogb25lIHRoYXQgc2hvdWxkIGFsd2F5cyBiZSB1c2VkLCBhbmQgdGhpcyBvbmUgb25seSB1c2VkIGZvciBjZXJ0YWluCi0JICogZXJyb3IgY29uZGl0aW9ucywgb3Igb3IgaWYgd2hlbiBjcmVhdGluZyBhICJkdXBsaWNhdGUiIHJlc291cmNlLCBpdCB3YXMKLQkgKiBkZXNpcmVkIHRvIHVzZSBleGFjdGx5IHRoZSBjaGFyc2V0IG5hbWUgYXMgaW4gdGhlIG9yaWdpbmFsIGRvY3VtZW50LiBBcwotCSAqIGFuIGV4YW1wbGUgb2YgdGhpcyBsYXRlciBjYXNlLCB0aGUgb3JpZ2luYWwgZG9jdW1lbnQgbWlnaHQgY29udGFpbgotCSAqIElTTy04ODU5LTksIGJ1dCB0aGUgZGV0ZWN0ZWQgY2hhcnNldCBuYW1lIG1pZ2h0IGNvbnRhaW4gSVNPLTg4NTktOS1JLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXRlY3RlZENoYXJzZXROYW1lKCkgewotCQlyZXR1cm4gZkRldGVjdGVkQ2hhcnNldE5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNoYXJzZXQgbmFtZSB0aGF0IHdhcyBkZXRlY3RlZCwgYnV0IG5vdCBmb3VuZCB0byBiZSBhIGNoYXJzZXQKLQkgKiBzdXBwb29ydGVkIGJ5IHRoZSBWTS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW52YWxpZEVuY29kaW5nKCkgewotCQlyZXR1cm4gZkludmFsaWRFbmNvZGluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBqYXZhIGNvbm9uaWNhbCBjaGFyc2V0IG5hbWUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFDaGFyc2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZKYXZhQ2hhcnNldE5hbWU7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogd2UgbWF5IGJlIGFibGUgdG8gcmVtb3ZlIHRoaXMgbWV0aG9kLCBpZiBpdCB0dXJucyBvdXQgdGhpcyB3b3JrCi0JICogaXMgZG9uZSBieSAidGV4dCIgdHlwZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRVbmljb2RlQk9NKCkgewotCQlieXRlW10gYm9tID0gbnVsbDsKLQkJaWYgKGlzVVRGODNCeXRlQk9NVXNlZCgpKQotCQkJYm9tID0gSUNvbnRlbnREZXNjcmlwdGlvbi5CT01fVVRGXzg7Ci0JCWVsc2UgaWYgKGlzVW5pY29kZVN0cmVhbSgpKQotCQkJYm9tID0gZkJPTTsKLQkJcmV0dXJuIGJvbTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBpbiBvdXIgaW1wbGVtZW50YXRpb24sIHRoZSBzdHJlYW0gaXMgYSB1bmljb2RlIHN0cmVhbSBpZiB0aGUKLQkgKiBjaGFyc2V0IGlzIFVURi0xNiwgVVRGLTE2TEUsIG9yIFVURi0xNkJFLiBBIHN0cmVhbSB3aXRoIDMgYnl0ZSBCT00gaXMKLQkgKiBub3QgY29uc2lkZXJlZCB1bmljb2RlIHN0cmVhbSBoZXJlLgotCSAqIAotCSAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIGlzIGEgdW5pY29kZSAoVVRGLTE2KSBzdHJlYW0KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VuaWNvZGVTdHJlYW0oKSB7Ci0JCXJldHVybiBmVW5pY29kZVN0cmVhbTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBpbiBvdXIgaW1wbGVtZW50YXRpb24sIHRoZSBzdHJlYW0gaXMgYSB1bmljb2RlIHN0cmVhbSBpZiB0aGUKLQkgKiBjaGFyc2V0IGlzIFVURi0xNiwgVVRGLTE2TEUsIG9yIFVURi0xNkJFLiBBIHN0cmVhbSB3aXRoIDMgYnl0ZSBCT00gaXMKLQkgKiBub3QgY29uc2lkZXJlZCB1bmljb2RlIHN0cmVhbSBoZXJlLgotCSAqIAotCSAqIFNldCBkdXJpbmcgbG9hZCwgY2FuIGJlIHVzZWQgYnkgZHVtcGVyIHRvIHdyaXRlIDMgYnl0ZSBCT00sIHdoaWNoIEphdmEKLQkgKiBkb2VzIG5vdCBub3JtYWxseSBkby4gVGhpcyBoZWxwcyBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKLQkgKiBwcm9ncmFtcyAodGhvc2UgdGhhdCB3cm90ZSB0aGUgMyBieXRlIEJPTSB0aGVyZSB0byBiZWdpbiB3aXRoLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVVRGODNCeXRlQk9NVXNlZCgpIHsKLQkJcmV0dXJuIGZVVEY4M0J5dGVCT01Vc2VkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiBnZXRJbnZhbGlkRW5jb2RpbmcoKSA9PSBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFwcHJvcHJpYXRlRGVmYXVsdC4KLQkgKiAKLQkgKiBAcGFyYW0gYXBwcm9wcmlhdGVEZWZhdWx0Ci0JICogICAgICAgICAgICBUaGUgYXBwcm9wcmlhdGVEZWZhdWx0IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFwcHJvcHJpYXRlRGVmYXVsdChTdHJpbmcgYXBwcm9wcmlhdGVEZWZhdWx0KSB7Ci0JCWZBcHByb3ByaWF0ZURlZmF1bHQgPSBhcHByb3ByaWF0ZURlZmF1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXREZXRlY3RlZENoYXJzZXROYW1lKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCWZEZXRlY3RlZENoYXJzZXROYW1lID0gZGV0ZWN0ZWRDaGFyc2V0TmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnZhbGlkRW5jb2RpbmcoU3RyaW5nIGludmFsaWRFbmNvZGluZykgewotCQlmSW52YWxpZEVuY29kaW5nID0gaW52YWxpZEVuY29kaW5nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGphdmFFbmNvZGluZ05hbWUuCi0JICogCi0JICogQHBhcmFtIGphdmFFbmNvZGluZ05hbWUKLQkgKiAgICAgICAgICAgIFRoZSBqYXZhRW5jb2RpbmdOYW1lIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFDaGFyc2V0TmFtZShTdHJpbmcgamF2YUNoYXJzZXROYW1lKSB7Ci0JCWZKYXZhQ2hhcnNldE5hbWUgPSBqYXZhQ2hhcnNldE5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmljb2RlU3RyZWFtKGJvb2xlYW4gdW5pY29kZVN0cmVhbSkgewotCQlmVW5pY29kZVN0cmVhbSA9IHVuaWNvZGVTdHJlYW07Ci0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB1VEY4M0J5dGVCT01mb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gdVRGODNCeXRlQk9NZm91bmQKLQkgKiAgICAgICAgICAgIFRoZSB1VEY4M0J5dGVCT01mb3VuZCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVVEY4M0J5dGVCT01Vc2VkKGJvb2xlYW4gdVRGODNCeXRlQk9NVXNlZCkgewotCQlmVVRGODNCeXRlQk9NVXNlZCA9IHVURjgzQnl0ZUJPTVVzZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5pY29kZUJPTShieXRlW10gYm9tKSB7Ci0JCWZCT00gPSBib207Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9FbmNvZGluZ1J1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvRW5jb2RpbmdSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMjk4OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9FbmNvZGluZ1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLQotLyoqCi0gKiBDbGFzcyB0byBwcm92aWRlZCAiZW51bWVyYXRlZCB0eXBlcyIgZm9yIGVuY29kaW5nIHJ1bGUgcGFyYW1ldGVyLiBUaGlzIGlzCi0gKiB0byBiZSB1c2VkIGJ5IGNsaWVudCB0byBoYXZlIHNvbWUgY29udHJvbCBvdmVyIGhvdyBlbmNvZGluZyBpcyBkZXRlcm1pbmVkLgotICovCi1wdWJsaWMgY2xhc3MgRW5jb2RpbmdSdWxlIHsKLQkvKioKLQkgKiBDT05URU5UX0JBU0VEIG1lYW5zIHRoZSBjbGFzcyB3aGljaCB1c2VzIHRoZSBwYXJhbWV0ZXIgKHN1Y2ggYXMKLQkgKiBjb250ZW50VHlwZSBMb2FkZXJzKSBzaG91bGQgdXNlIHdoYXQgZXZlciBydWxlcyBpdCBub3JtYWxseSB3b3VsZC4KLQkgKiAoTm90ZSwgc29tZSBjb250ZW50IHR5cGUgbG9hZGVycyBtYXkgbm90IGFsd2F5cyBsaXRlcmFsbHkgdXNlIHRoZSBmaWxlCi0JICogY29udGVudCB0byBkZXRlcm1pbmUgZW5jb2RpbmcsIGJ1dCB0aGUgcG9pbnQgaXMgdGhleSBzaG91bGQgdXNlIHdoYXQKLQkgKiBldmVyIHJ1bGVzIHRoZXkgbm9ybWFsbHkgd291bGQuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRW5jb2RpbmdSdWxlIENPTlRFTlRfQkFTRUQgPSBuZXcgRW5jb2RpbmdSdWxlKCJDT05URU5UX0JBU0VEIik7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBGT1JDRV9ERUZBVUxUIG1lYW5zIHRoZSBjbGFzcyB3aGljaCB1c2VzIHRoZSBwYXJhbWV0ZXIgKHN1Y2ggYXMKLQkgKiBjb250ZW50VHlwZSBMb2FkZXJzKSBzaG91bGQgdXNlIHdoYXQgZXZlciBpdCBkZWZpbmVzIGFzIHRoZSBkZWZhdWx0Ci0JICogZW5jb2RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbmNvZGluZ1J1bGUgRk9SQ0VfREVGQVVMVCA9IG5ldyBFbmNvZGluZ1J1bGUoIkZPUkNFX0RFRkFVTFQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSUdOT1JFX0NPTlZFUlNJT05fRVJST1IgbWVhbnMgdGhhdCB0aGUgc2F2ZSBvcGVyYXRpb24gc2hvdWxkIHNhdmUgZXZlbgotCSAqIGlmIGl0IGVuY291bnRlcnMgY29udmVyc2lvbiBlcnJvcnMuIFRoaXMgd2lsbCByZXN1bHQgaW4gc29tZSBkYXRhIGxvc3MsCi0JICogc28gc2hvdWxkIG9ubHkgYmUgdXNlZCBhZnRlciB0aGUgdXNlciBjb25maXJtcyB0aGF0IGlzIGluZGVlZCB3aGF0IHRoZXkKLQkgKiB3YW50IHRvIGRvLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRW5jb2RpbmdSdWxlIElHTk9SRV9DT05WRVJTSU9OX0VSUk9SID0gbmV3IEVuY29kaW5nUnVsZSgiSUdOT1JFX0NPTlZFUlNJT05fRVJST1IiKTsgLy8kTk9OLU5MUy0xJAotCi0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBlbmNvZGluZ1J1bGU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRW5jb2RpbmdSdWxlIGlzIHByaXZhdGUsIHNvIG5vIG9uZSBjYW4gaW5zdGFudGlhdGUKLQkgKiBleGNlcHQgdGhpcyBjbGFzcyBpdHNlbGYuCi0JICovCi0JcHJpdmF0ZSBFbmNvZGluZ1J1bGUoU3RyaW5nIHJ1bGVOYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCWVuY29kaW5nUnVsZSA9IHJ1bGVOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBlbmNvZGluZ1J1bGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JQ29kZWRSZXNvdXJjZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JQ29kZWRSZXNvdXJjZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjQ5MDBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSUNvZGVkUmVzb3VyY2VQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLQotcHVibGljIGludGVyZmFjZSBJQ29kZWRSZXNvdXJjZVBsdWdpbiB7Ci0JU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMmUwYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZCB7Ci0JLyoqCi0JICogVGhlIEFQUFJPUFJJQVRFX0RFRkFVTFQgZmllbGQgaXMgdXNlZCBvbmx5IHdoZW4gdGhlCi0JICogSUNvbnRlbnRUeXBlLmdldERlZmF1bHRDaGFyc2V0IHJldHVybnMgbnVsbC4gSXRzIHR5cGljYWxseSBzZXQgZnJvbQotCSAqIHVzZXIgcHJlZmVyZW5jZXMuIEtub3duIHVzZXMgY2FzZXMgYXJlIEhUTUwgYW5kIENTUywgd2hlcmUgdGhlcmUgaXMgbm8KLQkgKiAic3BlYyBkZWZhdWx0IiBmb3IgdGhvc2UgY29udGVudCB0eXBlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgQVBQUk9QUklBVEVfREVGQVVMVCA9IG5ldyBRdWFsaWZpZWROYW1lKElDb2RlZFJlc291cmNlUGx1Z2luLklELCAiYXBwcm9wcmlhdGVEZWZhdWx0Iik7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgREVURUNURURfQ0hBUlNFVCBwcm9wZXJ0eSBzaG91bGQgYmUgc2V0IHdoZW4gdGhlICJkZXRlY3RlZCIgY2hhcnNldAotCSAqIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBqYXZhIGNoYXJzZXQsIGV2ZW4gdGhvdWdoIGZ1bmN0aW9uYWxseQotCSAqIGVxdWl2ZWxlbnQuIFRoaXMgY2FuIG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgY2FzZXMgYXJlIGRpZmZlcmVudCwKLQkgKiBvciB3aGVuIGFuIGFsaWFzIG5hbWUgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBjb25hbmljYWwgbmFtZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgREVURUNURURfQ0hBUlNFVCA9IG5ldyBRdWFsaWZpZWROYW1lKElDb2RlZFJlc291cmNlUGx1Z2luLklELCAiZGV0ZWN0ZWRDaGFyc2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgVU5TVVBQT1JURURfQ0hBUlNFVCBwcm9wZXJ0eSBob2xkcyB0aGUgY2hhcnNldCB2YWx1ZSwgaWYgaXRzIGJlZW4KLQkgKiBmb3VuZCB0byBiZSBhbiB1bnN1cHBvdGVkIGNoYXJzZXQuIFRoaXMgaXMgaGVscGZ1bCBpbiBlcnJvciBtZXNzYWdlcywKLQkgKiBvciBpbiBjYXNlcyB3aGVuIGV2ZW4gdGhvdWdoIHRoZSBjaGFyc2V0IGlzIGludmFsaWQsIHRoZSBqYXZhIGNoYXJzZXQKLQkgKiBpcyBhc3N1bWVkIHRvIGJlIHRoZSBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBVTlNVUFBPUlRFRF9DSEFSU0VUID0gbmV3IFF1YWxpZmllZE5hbWUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQsICJ1bnN1cHBvcnRlZENoYXJzZXQiKTsgLy8kTk9OLU5MUy0xJAotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSVJlc291cmNlQ2hhcnNldERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lSZXNvdXJjZUNoYXJzZXREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGRjYmJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSVJlc291cmNlQ2hhcnNldERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGV4dGVuZHMgSVN0cmVhbUNoYXJzZXREZXRlY3RvciB7Ci0Jdm9pZCBzZXQoSVN0b3JhZ2UgaVN0b3JhZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lTdHJlYW1DaGFyc2V0RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSVN0cmVhbUNoYXJzZXREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjUwOGYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSVN0cmVhbUNoYXJzZXREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotcHVibGljIGludGVyZmFjZSBJU3RyZWFtQ2hhcnNldERldGVjdG9yIHsKLQlTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCi0Jdm9pZCBzZXQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pOwotCi0Jdm9pZCBzZXQoUmVhZGVyIHJlYWRlcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Ob25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNzE1OGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Ob25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotCi1wdWJsaWMgY2xhc3MgTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0SmF2YVBsYXRmb3JtRGVmYXVsdEVuY29kaW5nKCkgewotCQlTdHJpbmcgZW5jID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcmV0dXJuIGJsYW5rIGFzIG51bGwKLQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZW5jOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VXNlclNwZWNpZmllZERlZmF1bHRGb3JDb250ZW50VHlwZShJRmlsZSBpRmlsZSkgewotCQlTdHJpbmcgZW5jID0gbnVsbDsKLQkJCi0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb250ZW50VHlwZSA9IGlGaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkKLQkJCS8vIGZpcnN0IHRyeSB0byBnZXQgYmFzZSdzIGRlZmF1bHQgZW5jb2RpbmcgZm9yIGNvbnRlbnQgdHlwZSAKLQkJCWlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkJZW5jID0gY29udGVudFR5cGUuZ2V0RGVmYXVsdENoYXJzZXQoKTsKLQkJCX0KLQotCQkJLy8gbmV4dCB0cnkgdG8gZ2V0IHNzZSdzIGRlZmF1bHQgZW5jb2RpbmcgZm9yIGNvbnRlbnQgdHlwZQotCQkJaWYgKGVuYyA9PSBudWxsIHx8IGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWVuYyA9IENvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmdldFByZWZlcmVuY2VzU3RyaW5nKGNvbnRlbnRUeXBlLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5JTlBVVF9DT0RFU0VUKTsKLQkJCX0KLQkJCQotCQkJLy8gcmV0dXJuIGJsYW5rIGFzIG51bGwKLQkJCWlmIChlbmMgIT0gbnVsbCAmJiBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQllbmMgPSBudWxsOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIGNvcmUgZXhjZXB0aW9uIG9jY3VycywgYXNzdW1lIG5vIHByZWZlcmVuY2UhCi0JCQllbmMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBlbmM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VXNlclNwZWNpZmllZERlZmF1bHRGb3JDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlTdHJpbmcgZW5jID0gbnVsbDsKLQkJCi0JCS8vIGZpcnN0IHRyeSB0byBnZXQgYmFzZSdzIGRlZmF1bHQgZW5jb2RpbmcgZm9yIGNvbnRlbnQgdHlwZQotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlkKTsKLQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCWVuYyA9IGNvbnRlbnRUeXBlLmdldERlZmF1bHRDaGFyc2V0KCk7Ci0JCX0KLQkJCi0JCS8vIG5leHQgdHJ5IHRvIGdldCBzc2UncyBkZWZhdWx0IGVuY29kaW5nIGZvciBjb250ZW50IHR5cGUKLQkJaWYgKGVuYyA9PSBudWxsIHx8IGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gQ29udGVudEJhc2VkUHJlZmVyZW5jZUdhdGV3YXkuZ2V0UHJlZmVyZW5jZXNTdHJpbmcoY29udGVudFR5cGVJZCwgQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCk7Ci0JCX0KLQkJCi0JCS8vIHJldHVybiBibGFuayBhcyBudWxsCi0JCWlmIChlbmMgIT0gbnVsbCAmJiBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWVuYyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVuYzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0V29ya2JlbmNoU3BlY2lmaWVkRGVmYXVsdEVuY29kaW5nKCkgewotCQlSZXNvdXJjZXNQbHVnaW4gcmVzb3VyY2VQbHVnaW4gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCk7Ci0JCVN0cmluZyBlbmMgPSByZXNvdXJjZVBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhSZXNvdXJjZXNQbHVnaW4uUFJFRl9FTkNPRElORyk7Ci0JCS8vIHJldHVybiBibGFuayBhcyBudWxsCi0JCWlmIChlbmMgIT0gbnVsbCAmJiBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWVuYyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVuYzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3BlY0RlZmF1bHQKLQkgKiAgICAgICAgICAgIFRoaXMgaXMgdGhlIGRlZmF1bHQgY2hhcnNldCBuYW1lIHRoYXQgd291bGQgb3JkaW5hcmlseSBiZQotCSAqICAgICAgICAgICAgdXNlZCBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgY29udGVudC4gTnVsbCBtYXkgYmUKLQkgKiAgICAgICAgICAgIHNwZWNpZmlmZWQgZm9yIHRob3NlIHR5cGVzIHdpdGggbm8gc3BlYyBkZWZhdWx0LiBJZiB0aGUgc3BlYwotCSAqICAgICAgICAgICAgZGVmYXVsdCBpcyBrbm93biAoYW5kIHBhc3NlZCBpbiksIHRoZW4gaXQgd2lsbCBiZSByZXR1cm5lZAotCSAqICAgICAgICAgICAgYWZ0ZXIgYmVpbmcgY2hlY2tlZCB0byBzZWUgaWYgdGhlcmUncyBiZSBhbnkgdXNlciBzcGVjaWZpZWQKLQkgKiAgICAgICAgICAgICJvdmVycmlkZSIgZm9yIHRoYXQgY2hhcnNldCAod2hpY2ggd291bGQgYmUgcmFyZSkuIEluIG90aGVyCi0JICogICAgICAgICAgICB3b3JkcywgaWYgdGhlIHNwZWMgaXMga25vd24sIHRoZXJlJ3MgbGl0dGxlIHJlYXNvbiB0byB1c2UKLQkgKiAgICAgICAgICAgIHRoaXMgbWV0aG9kLgotCSAqIEByZXR1cm4gdGhlIGNoYXJzZXQgdGhhdCBzaG91bGQgYmUgdXNlZCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzCi0JICogICAgICAgICBlc3RhYmxpc2hlZCBieSB0aGlzIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHVzZURlZmF1bHROYW1lUnVsZXMoU3RyaW5nIHNwZWNEZWZhdWx0KSB7Ci0JCVN0cmluZyBlbmMgPSBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJZW5jID0gc3BlY0RlZmF1bHQ7Ci0JCWlmIChlbmMgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZW5jOwotCQl9IGVsc2UgewotCQkJZW5jID0gQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmdldFVzZXJTcGVjaWZpZWREZWZhdWx0RW5jb2RpbmdQcmVmZXJlbmNlKCk7Ci0JCQlpZiAoZW5jICE9IG51bGwgJiYgZW5jLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlyZXN1bHQgPSBlbmMudHJpbSgpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZW5jID09IG51bGwgfHwgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCWVuYyA9IGdldFdvcmtiZW5jaFNwZWNpZmllZERlZmF1bHRFbmNvZGluZygpOwotCQkJCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IGVuYy50cmltKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVuYyA9PSBudWxsIHx8IGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQllbmMgPSBnZXRKYXZhUGxhdGZvcm1EZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQkJLy8gZW5jIHNob3VsZCBuZXZlciBiZSBudWxsIChidXQgd2UnbGwKLQkJCQkJLy8gY2hlY2sgYW55d2F5KQotCQkJCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IGVuYzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQXNzZXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQXNzZXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMWIzNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0Fzc2VydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbDsKLQotLyoqCi0gKiA8Y29kZT5Bc3NlcnQ8L2NvZGU+IGlzIHVzZWZ1bCBmb3IgZm9yIGVtYmVkZGluZyBydW50aW1lIHNhbml0eSBjaGVja3MgaW4KLSAqIGNvZGUuIFRoZSBwcmVkaWNhdGUgbWV0aG9kcyBhbGwgdGVzdCBhIGNvbmRpdGlvbiBhbmQgdGhyb3cgc29tZSB0eXBlIG9mCi0gKiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlmIHRoZSBjb25kaXRpb24gZG9lcyBub3QgaG9sZC4KLSAqIDxwPgotICogQXNzZXJ0aW9uIGZhaWx1cmUgZXhjZXB0aW9ucywgbGlrZSBtb3N0IHJ1bnRpbWUgZXhjZXB0aW9ucywgYXJlIHRocm93biB3aGVuCi0gKiBzb21ldGhpbmcgaXMgbWlzYmVoYXZpbmcuIEFzc2VydGlvbiBmYWlsdXJlcyBhcmUgaW52YXJpYWJseSB1bnNwZWNpZmllZAotICogYmVoYXZpb3I7IGNvbnNlcXVlbnRseSwgY2xpZW50cyBzaG91bGQgbmV2ZXIgcmVseSBvbiB0aGVzZSBiZWluZyB0aHJvd24KLSAqIChhbmQgY2VydGFpbmx5IHNob3VsZCBub3QgYmVpbmcgY2F0Y2hpbmcgdGhlbSBzcGVjaWZpY2FsbHkpLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXNzZXJ0IHsKLQotCS8qKgotCSAqIDxjb2RlPkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjwvY29kZT4gaXMgYSBydW50aW1lIGV4Y2VwdGlvbiB0aHJvd24KLQkgKiBieSBzb21lIG9mIHRoZSBtZXRob2RzIGluIDxjb2RlPkFzc2VydDwvY29kZT4uCi0JICogPHA+Ci0JICogVGhpcyBjbGFzcyBpcyBub3QgZGVjbGFyZWQgcHVibGljIHRvIHByZXZlbnQgc29tZSBtaXN1c2VzOyBwcm9ncmFtcwotCSAqIHRoYXQgY2F0Y2ggb3Igb3RoZXJ3aXNlIGRlcGVuZCBvbiBhc3NlcnRpb24gZmFpbHVyZXMgYXJlIHN1c2NlcHRpYmxlIHRvCi0JICogdW5leHBlY3RlZCBicmVha2FnZSB3aGVuIGFzc2VydGlvbnMgaW4gdGhlIGNvZGUgYXJlIGFkZGVkIG9yIHJlbW92ZWQuCi0JICogPC9wPgotCSAqLwotCXN0YXRpYyBjbGFzcyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkvKioKLQkJICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24uCi0JCSAqLwotCQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgotCQkgKi8KLQkJcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsKSB7Ci0JCQlzdXBlcihkZXRhaWwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IGFuIGFyZ3VtZW50IGlzIGxlZ2FsLiBJZiB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyBub3QKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiwgYW4gPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpcwotCSAqIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZAotCSAqIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZQotCSAqICAgICAgICAgY2hlY2sgZmFpbHMpCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgbGVnYWxpdHkgdGVzdCBmYWlsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhbChib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICghZXhwcmVzc2lvbikKLQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24obWVzc2FnZSk7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcyBpcwotCSAqIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLiBUaGUgZ2l2ZW4KLQkgKiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB0ZXN0Ci0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpc05vdE51bGwoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMgaXMgbm90Ci0JICogdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UKLQkgKiBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZQotCSAqICAgICAgICAgY2hlY2sgZmFpbHMpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICghZXhwcmVzc2lvbikgewotCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZC4gKi8KLQlwcml2YXRlIEFzc2VydCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQnVmZmVyZWRMaW1pdGVkUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQnVmZmVyZWRMaW1pdGVkUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMjZiZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0J1ZmZlcmVkTGltaXRlZFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgcHJldHR5IGxpbWl0ZWQgaW1wbGVtZW50YXRpb24sIHNvcnQgb2Ygc3BlY2lmaWMgCi0gKiB0byB0aGUgd2F5IGl0cyB1c2VkIGJ5IHRva2VuaXplcnMgKEpGbGV4KS4gVG8gcmVhbGx5IAotICogYmUgZ2VuZXJhbCBwdXJwb3NlLCB3b3VsZCBuZWVkIG1vcmUgd29yay4gCi0gKgotICovCi0KLQotcHVibGljIGNsYXNzIEJ1ZmZlcmVkTGltaXRlZFJlYWRlciBleHRlbmRzIEJ1ZmZlcmVkUmVhZGVyIHsKLQlwcml2YXRlIGludCBsaW1pdGVkQ291bnQ7Ci0JcHJpdmF0ZSBpbnQgblJlYWQ7Ci0KLQlwdWJsaWMgQnVmZmVyZWRMaW1pdGVkUmVhZGVyKFJlYWRlciByZWFkZXIsIGludCBzaXplKSB7Ci0JCXN1cGVyKHJlYWRlciwgc2l6ZSk7Ci0JCWlmIChyZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0cnkgewotCQkJCW1hcmsoc2l6ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGltcG9zc2libGUKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCWxpbWl0ZWRDb3VudCA9IHNpemU7Ci0JfQotCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCW5SZWFkKys7Ci0JCWlmIChuUmVhZCA+IGxpbWl0ZWRDb3VudCkgewotCQkJcmVzdWx0ID0gLTE7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBzdXBlci5yZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNidWZbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCWlmIChuUmVhZCArIGxlbiA+IGxpbWl0ZWRDb3VudCkgewotCQkJcmVzdWx0ID0gLTE7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBzdXBlci5yZWFkKGNidWYsIG9mZiwgbGVuKTsKLQkJCW5SZWFkID0gblJlYWQgKyByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQnVmZmVyZWRMaW1pdGVkU3RyZWFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQnVmZmVyZWRMaW1pdGVkU3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5Mjg2NTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0J1ZmZlcmVkTGltaXRlZFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEJ1ZmZlcmVkTGltaXRlZFN0cmVhbSBleHRlbmRzIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gewotCi0JcHJpdmF0ZSBpbnQgbGltaXRlZENvdW50OwotCi0JcHVibGljIEJ1ZmZlcmVkTGltaXRlZFN0cmVhbShJbnB1dFN0cmVhbSBpblN0cmVhbSwgaW50IHNpemUpIHsKLQkJc3VwZXIoaW5TdHJlYW0sIHNpemUpOwotCQltYXJrKHNpemUpOwotCQl0cnkgewotCQkJbGltaXRlZENvdW50ID0gTWF0aC5taW4oc2l6ZSwgaW5TdHJlYW0uYXZhaWxhYmxlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB1bmxpa2VseQotCQkJbGltaXRlZENvdW50ID0gMDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNhdmFpbGFibGUoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJcmV0dXJuIGxpbWl0ZWRDb3VudCAtIHBvczsKLQl9Ci0KLQkvKioKLQkgKiBjb3BpZWQgZG93biBmcm9tIHN1cGVyIGNsYXNzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZU9wZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaW4gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIGNsb3NlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogY29waWVkIGRvd24gZnJvbSBzdXBlciBjbGFzcyB0aGVuLCBjaGFuZ2VkIHRvIHNpbWl1bGF0ZSBFT0YgaWYgZ29lcwotCSAqIGJleW9uZCBidWZmZXJlZCBhbW91bnQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlT3BlbigpOwotCQkvLyBmb3IgdGhpcyBzcGVjaWFsIHN0cmVhbSwgaW5kaWNhdGUgImVuZCBvZiBmaWxlIiB3aGVuIGJ1ZmZlciBpcwotCQkvLyBmdWxsCi0JCWlmIChwb3MgPj0gbGltaXRlZENvdW50KSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnJlYWQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGZvciB0aGlzIHNwZWNpYWwgc3RyZWFtLCBpbmRpY2F0ZSAiZW5kIG9mIGZpbGUiIHdoZW4gYnVmZmVyIGlzCi0JCS8vIGZ1bGwKLQkJaWYgKHBvcyA+PSBsaW1pdGVkQ291bnQpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXR1cm4gc3VwZXIucmVhZChiLCBvZmYsIGxlbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0J5dGVSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9CeXRlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MDQ2ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0J5dGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLQotLyoqCi0gKiBUaGlzIGlzIGFuICJhZGFwdGVyIiBjbGFzcywgc2ltcGx5IHRvIGdldCBpbiBpbnB1dCBzdHJlYW0gdG8gYWN0IGxpa2UgYQotICogcmVhZGVyLiBXZSBjb3VsZCBub3QgdXNlIElucHV0U3RyZWFtUmVhZGVyIGRpcmVjdGx5IGJlY2F1c2UgaXRzIGludGVybmFsCi0gKiBidWZmZXJzIGFyZSBub3QgY29udHJvbGxhYmxlLCBhbmQgaXQgc29tZXRpbWVzIHB1bGxzIHRvbyBtdWNoIG91dCBvZiBpbnB1dAotICogc3RyZWFtIChldmVuIHdoZW4gaXQgd2Fzbid0IG5lZWRlZCBmb3Igb3VyIHB1cnBvc2VzKS4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIGhpZ2hseSBzcGVjaWFsaXplZCBhbmQgYnkgbm90IG1lYW5zIG1lYW50IHRvIGJlCi0gKiBnZW5lcmFsIHB1cnBvc2UuIEl0cyB1c2UgaXMgcmVzdHJpY3RlZCB0byB0aG9zZSBjYXNlcyB3aGVyZSB0aGUgaW5wdXQKLSAqIHN0cmVhbSBjYW4gYmUgcmVnYXJkZWQgYXMgYXNjaWkganVzdCBsb25nIGVub3VnaCB0byBkZXRlcm1pbmUgd2hhdCB0aGUgcmVhbAotICogZW5jb2Rpbmcgc2hvdWxkIGJlLgotICovCi0KLXB1YmxpYyBjbGFzcyBCeXRlUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKLQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSBDb2RlZElPLk1BWF9CVUZfU0laRTsKLQotCXByb3RlY3RlZCBieXRlW10gZkJ1ZmZlcjsKLQotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBmSW5wdXRTdHJlYW07Ci0KLQlwcm90ZWN0ZWQgQnl0ZVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQl0aGlzKGlucHV0U3RyZWFtLCBERUZBVUxUX0JVRkZFUl9TSVpFKTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBpbnQgc2l6ZSkgewotCQl0aGlzLmZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuZkJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZJbnB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRBaGVhZExpbWl0KSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLm1hcmsocmVhZEFoZWFkTGltaXQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBiMCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQoKTsKLQkJcmV0dXJuIChiMCAmIDB4MDBGRik7Ci0JfQotCi0JcHVibGljIGludCByZWFkKGNoYXIgY2hbXSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGxlbmd0aCA+IHRoaXMuZkJ1ZmZlci5sZW5ndGgpIHsKLQkJCWxlbmd0aCA9IHRoaXMuZkJ1ZmZlci5sZW5ndGg7Ci0JCX0KLQotCQlpbnQgY291bnQgPSB0aGlzLmZJbnB1dFN0cmVhbS5yZWFkKHRoaXMuZkJ1ZmZlciwgMCwgbGVuZ3RoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWludCBiMCA9IHRoaXMuZkJ1ZmZlcltpXTsKLQkJCS8vIHRoZSAweDAwRkYgaXMgdG8gImxvc2UiIHRoZSBuZWdhdGl2ZSBiaXRzIGZpbGxlZCBpbiB0aGUgYnl0ZSB0bwotCQkJLy8gaW50IGNvbnZlcnNpb24KLQkJCS8vIChhbmQgd2hpY2ggd291bGQgYmUgdGhlcmUgaWYgY2FzdCBkaXJlY3RseSBmcm9tIGJ5dGUgdG8gY2hhcikuCi0JCQljaGFyIGMwID0gKGNoYXIpIChiMCAmIDB4MDBGRik7Ci0JCQljaFtvZmZzZXQgKyBpXSA9IGMwOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZJbnB1dFN0cmVhbS5yZXNldCgpOwotCX0KLQotCXB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5mSW5wdXRTdHJlYW0uc2tpcChuKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Db2RlZFJlc291cmNlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQ29kZWRSZXNvdXJjZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzkyOGNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Db2RlZFJlc291cmNlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklDb2RlZFJlc291cmNlUGx1Z2luOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgQ29kZWRSZXNvdXJjZVBsdWdpbiBleHRlbmRzIFBsdWdpbiBpbXBsZW1lbnRzIElDb2RlZFJlc291cmNlUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgQ29kZWRSZXNvdXJjZVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2RlZFJlc291cmNlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBDb2RlZFJlc291cmNlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UGx1Z2luUHJlZmVyZW5jZXMoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5VU0VfM0JZVEVfQk9NX1dJVEhfVVRGOCwgZmFsc2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU5MTFiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLAotCSAqICAgICAgICAgICAgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGxldmVsID09IE9LX0RFQlVHIHx8IGxldmVsID09IElORk9fREVCVUcgfHwgbGV2ZWwgPT0gV0FSTklOR19ERUJVRyB8fCBsZXZlbCA9PSBFUlJPUl9ERUJVRykgewotCQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRyA6Ci0JCQljYXNlIElORk8gOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHIDoKLQkJCWNhc2UgV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHIDoKLQkJCWNhc2UgRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJfQotCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aAotCSAqICAgICAgICAgICAgL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChpc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvTnVsbElucHV0U3RyZWFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvTnVsbElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNDRmMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL051bGxJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0KLXB1YmxpYyBjbGFzcyBOdWxsSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jbWFyayhpbnQpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI21hcmtTdXBwb3J0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCS8vIHdlIGNhbiBtYXJrIG5vdGhpbmcuCi0JCS8vIGFuZCwgd2UgYXJlIHVzaW5nIHRoaXMgTnVsbCBjbGFzcyBzcGVjaWZpY2FsbHkgZm9yCi0JCS8vIGEgImZha2UiIHJlc2V0dGFibGUgc3RyZWFtLgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jcmVhZCgpCi0JICovCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI3NraXAobG9uZykKLQkgKi8KLQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIDA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL1Jlc291cmNlQnVuZGxlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvUmVzb3VyY2VCdW5kbGVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhYWExZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvUmVzb3VyY2VCdW5kbGVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLy9UT0RPOiByZXdvcmsgdGhpcyB3aXRoIG5ldyBwbGF0Zm9ybS9ydW50aW1lIEFQSXMgKGlmIHN0aWxsIG5lZWRlZCkuCi0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUJ1bmRsZUhlbHBlciB7Ci0KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKFN0cmluZyByZXNvdXJjZVVSSSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VCdW5kbGUocmVzb3VyY2VVUkksIExvY2FsZS5nZXREZWZhdWx0KCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoU3RyaW5nIHJlc291cmNlVVJJLCBMb2NhbGUgdGFyZ2V0TG9jYWxlKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCS8vIHRyeSB0byBsb2FkIGJ1bmRsZSBmcm9tIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gdGhlIHJlc291cmNlVVJJCi0JCS8vIHdlIG1ha2UgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgcmVzb3VyY2VVUkkgcG9pbnRzIHRvIHRoZSBsb2NhbAotCQkvLyBmaWxlIHN5c3RlbQotCi0JCWludCBpbmRleCA9IHJlc291cmNlVVJJLmxhc3RJbmRleE9mKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHJlc291cmNlVVJJIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIEJlbG93IHdlIHNldCAncmVzb3VyY2VEaXJlY3RvcnknIHNvIHRoYXQgaXQgZW5kcyB3aXRoIGEgJy8nLgotCQkvLyBIZXJlJ3MgYW4gZXhjZXJwdCBmcm9tIHRoZSBDbGFzc0xvYWRlciBKYXZhZG9jIC4uLgotCQkvLyBBbnkgVVJMIHRoYXQgZW5kcyB3aXRoIGEgJy8nIGlzIGFzc3VtZWQgdG8gcmVmZXIgdG8gYSBkaXJlY3RvcnkuCi0JCS8vIE90aGVyd2lzZSwgdGhlIFVSTCBpcyBhc3N1bWVkCi0JCS8vIHRvIHJlZmVyIHRvIGEgSkFSIGZpbGUgd2hpY2ggd2lsbCBiZSBvcGVuZWQgYXMgbmVlZGVkLgotCQkvLwotCQlTdHJpbmcgcmVzb3VyY2VEaXJlY3RvcnkgPSByZXNvdXJjZVVSSS5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTsKLQkJU3RyaW5nIHJlc291cmNlQnVuZGxlTmFtZSA9IHJlc291cmNlVVJJLnN1YnN0cmluZyhpbmRleCArIDEpOwotCi0JCS8vIGNyZWF0ZSBhIGNsYXNzIGxvYWRlciB3aXRoIGEgY2xhc3MgcGF0aCB0aGF0IHBvaW50cyB0byB0aGUgcmVzb3VyY2UKLQkJLy8gYnVuZGxlJ3MgbG9jYXRpb24KLQkJLy8gICAgICAgICAKLQkJVVJMW10gY2xhc3NwYXRoID0gbmV3IFVSTFsxXTsKLQkJY2xhc3NwYXRoWzBdID0gUGxhdGZvcm0ucmVzb2x2ZShuZXcgVVJMKHJlc291cmNlRGlyZWN0b3J5KSk7Ci0JCUNsYXNzTG9hZGVyIHJlc291cmNlTG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKGNsYXNzcGF0aCwgbnVsbCk7Ci0KLQkJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShyZXNvdXJjZUJ1bmRsZU5hbWUsIHRhcmdldExvY2FsZSwgcmVzb3VyY2VMb2FkZXIpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL1VuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvVW5pY29kZUJPTUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjOWQ5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvVW5pY29kZUJPTUVuY29kaW5nRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSAiY29tbW9uIGZ1bmN0aW9uIiBjbGFzcyB0byBkZWNpZGUgaWYgYW4gaW5wdXQgc3RyZWFtLCBpcyBhCi0gKiB1bmljb2RlIHN0cmVhbS4KLSAqLwotcHVibGljIGNsYXNzIFVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHsKLQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl8xNl9DSEFSU0VUX05BTUUgPSAiVVRGLTE2IjsKLQkvLyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE5vdEVub3VnaElucHV0Rm9yQk9NRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewotCi0JCS8qKgotCQkgKiBEZWZhdWx0IDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgTm90RW5vdWdoSW5wdXRGb3JCT01FeGNlcHRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIE5vdEVub3VnaElucHV0Rm9yQk9NRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCQlzdXBlcihzKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBCQiA9IChieXRlKSAweEJCOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgQkYgPSAoYnl0ZSkgMHhCRjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIEVGID0gKGJ5dGUpIDB4RUY7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBGRSA9IChieXRlKSAtMjsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgRkYgPSAoYnl0ZSkgLTE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl8xNkJFX0NIQVJTRVRfTkFNRSA9ICJVVEYtMTZCRSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzE2TEVfQ0hBUlNFVF9OQU1FID0gIlVURi0xNkxFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl84X0NIQVJTRVRfTkFNRSA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZk5vQk9NUG9zc2libGU7Ci0KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBjaGVja0ZvckJPTShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQotCQl0cnkgewotCQkJYnl0ZSBiMSA9IGdldE5leHRCeXRlKGlucHV0U3RyZWFtKTsKLQkJCWJ5dGUgYjIgPSBnZXROZXh0Qnl0ZShpbnB1dFN0cmVhbSk7Ci0JCQlpZiAoYjEgPT0gRkUgJiYgYjIgPT0gRkYpIHsKLQkJCQlyZXN1bHQgPSBjcmVhdGVFbmNvZGluZ01lbWVudG8oVVRGXzE2QkVfQ0hBUlNFVF9OQU1FKTsKLQkJCQlyZXN1bHQuc2V0VW5pY29kZVN0cmVhbSh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGIxID09IEZGICYmIGIyID09IEZFKSB7Ci0JCQkJCXJlc3VsdCA9IGNyZWF0ZUVuY29kaW5nTWVtZW50byhVVEZfMTZMRV9DSEFSU0VUX05BTUUpOwotCQkJCQlyZXN1bHQuc2V0VW5pY29kZVN0cmVhbSh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlieXRlIGIzID0gZ2V0TmV4dEJ5dGUoKGlucHV0U3RyZWFtKSk7Ci0JCQkJCWlmIChiMSA9PSBFRiAmJiBiMiA9PSBCQiAmJiBiMyA9PSBCRikgewotCQkJCQkJcmVzdWx0ID0gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFVURl84X0NIQVJTRVRfTkFNRSk7Ci0JCQkJCQlyZXN1bHQuc2V0VVRGODNCeXRlQk9NVXNlZCh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoTm90RW5vdWdoSW5wdXRGb3JCT01FeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBpcyBzb3J0IG9mIHVuZXhwZWN0ZWQgZm9yIG5vcm1hbCBjYXNlcywgYnV0IGNhbiBvY2N1ciBmb3IKLQkJCS8vIGVtcHR5Ci0JCQkvLyBzdHJlYW1zLiBBbmQsIHRoaXMgY2FuIG9jY3VyICJub3JtYWxseSIgZm9yIG5vbi1CT00gc3RyZWFtcwotCQkJLy8gdGhhdAotCQkJLy8gaGF2ZSBvbmx5IHR3bwotCQkJLy8gYnl0ZXMsIGFuZCBmb3Igd2hpY2ggdGhvc2UgdHdvIGJ5dGVzIG1hdGNoIHRoZSBmaXJzdCB0d28gYnl0ZXMKLQkJCS8vIG9mIFVURi04Ci0JCQkvLyBCT00gSW4gYW55IGNhc2UsIHdlJ2xsIHNpbXBseSByZXR1cm4gbnVsbDsKLQkJCXJlc3VsdCA9IG51bGw7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG90aGVyIGVycm9ycyBzaG91bGQgYmUgaW1wb3NzaWJsZQotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGphdmFFbmNvZGluZ05hbWUpIHsKLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJZW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShqYXZhRW5jb2RpbmdOYW1lKTsKLQkJU3RyaW5nIGlhbmFOYW1lID0gQ2hhcnNldC5mb3JOYW1lKGphdmFFbmNvZGluZ05hbWUpLm5hbWUoKTsKLQkJZW5jb2RpbmdNZW1lbnRvLnNldERldGVjdGVkQ2hhcnNldE5hbWUoaWFuYU5hbWUpOwotCQlpZiAoamF2YUVuY29kaW5nTmFtZS5lcXVhbHMoVVRGXzhfQ0hBUlNFVF9OQU1FKSkgewotCQkJZW5jb2RpbmdNZW1lbnRvLnNldFVURjgzQnl0ZUJPTVVzZWQodHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIGVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlyZXR1cm4gZ2V0RW5jb2RpbmdNZW1lbnRvKCkuZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgSUFOQSBlbmNvZGluZyBuYW1lIGlmIEJPTSBkZXRlY3RlZCBpbiBzdHJlYW0uIElmIGEgQk9NIGlzCi0JICogZGV0ZWN0ZWQsIHRoZSBzdHJlYW0gaXMgbGVmdCBwb3NpdGlvbmVkIGFmdGVyIHJlYWR5aW5nIHRoZSBCT00uIElmIGEKLQkgKiBCT00gaXMgbm90IGRldGVjdGVkLCB0aGUgc3RlYW0gaXMgcmVzZXQuCi0JICogCi0JICogMHhGRUZGIFVURi0xNiwgYmlnLWVuZGlhbiAweEZGRkUgVVRGLTE2LCBsaXR0bGUtZW5kaWFuIDB4RUZCQkJGIFVURi04Ci0JICogKEJPTSBpcyBvcHRpb25hbCkKLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXRTdHJlYW0gLQotCSAqICAgICAgICAgICAgbXVzdCBiZSBhIHJlc2V0YWJsZSAobWFyayBzdXBwb3J0ZWQpIHN0cmVhbSBzbyBpdCBjYW4gYmUKLQkgKiAgICAgICAgICAgIHJlc2V0LCBpZiBub3QgQk9NIGVuY29kZWQgc3RyZWFtCi0JICogQHJldHVybiBTdHJpbmcgLSBJQU5BIGVuY29kaW5nbmFtZSAobWF5IG5vdCB3b3JrIHdlbGwgb24gMS4zLCBidXQgMS40Ci0JICogICAgICAgICBzZWVtcyB0byBoYXZlIGdvb2Qgc3VwcG9ydCBmb3IgSUFOQSBuYW1lcykKLQkgKi8KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHsKLQotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKCFmTm9CT01Qb3NzaWJsZSkgewotCi0JCQlpZiAoZklucHV0U3RyZWFtID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5wdXQgbXVzdCBiZSBzZXQgYmVmb3JlIHVzZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmICghZklucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlucHV0U3RyZWFtIG11c3QgYmUgcmVzZXRhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJcmVzdWx0ID0gY2hlY2tGb3JCT00oZklucHV0U3RyZWFtKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQlwcml2YXRlIGJ5dGUgZ2V0TmV4dEJ5dGUoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJaW50IGJ5dGVDaGFyQXNJbnQgPSAtMTsKLQkJLy8gYmUgc3VyZSB3ZSB3b24ndCBibG9jawotCQlpZiAoaW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwKSB7Ci0JCQlieXRlQ2hhckFzSW50ID0gaW5wdXRTdHJlYW0ucmVhZCgpOwotCQkJYnl0ZUNoYXJBc0ludCA9IGJ5dGVDaGFyQXNJbnQgJiAwWEZGOwotCQl9Ci0JCS8vIHRvIGF2b2lkIGNvbmZ1c3Rpb24gb3ZlciBtZWFuaW5nIG9mIHJldHVybmVkIGJ5dGUsCi0JCS8vIHRocm93IGV4Y2VwdGlvbiBpZiBFT0YgcmVhY2hlZC4KLQkJaWYgKGJ5dGVDaGFyQXNJbnQgPT0gLTEpCi0JCQl0aHJvdyBuZXcgTm90RW5vdWdoSW5wdXRGb3JCT01FeGNlcHRpb24oInR5cGljYWxseSBub3QgYW4gZXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gKGJ5dGUpIGJ5dGVDaGFyQXNJbnQ7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQkvLyBUaGVyZSBpcyBubyBkZWZhdWx0IGZvciB0aGlzIGNhc2UKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldEFsbCgpIHsKLQkJZk5vQk9NUG9zc2libGUgPSBmYWxzZTsKLQkJZklucHV0U3RyZWFtID0gbnVsbDsKLQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldEFsbCgpOwotCQlmSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSVN0b3JhZ2UgaVN0b3JhZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2V0KG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlTdG9yYWdlLmdldENvbnRlbnRzKCksIENvZGVkSU8uTUFYX0JVRl9TSVpFKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlpZiAocmVhZGVyIGluc3RhbmNlb2YgQnl0ZVJlYWRlcikgewotCQkJQnl0ZVJlYWRlciBieXRlUmVhZGVyID0gKEJ5dGVSZWFkZXIpIHJlYWRlcjsKLQkJCWZJbnB1dFN0cmVhbSA9IGJ5dGVSZWFkZXIuZklucHV0U3RyZWFtOwotCQl9IGVsc2UgewotCQkJZk5vQk9NUG9zc2libGUgPSB0cnVlOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9DaGFyQ29udmVyc2lvbkVycm9yV2l0aERldGFpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9leGNlcHRpb25zL0NoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTk0NDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9leGNlcHRpb25zL0NoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQ2hhckNvbnZlcnNpb25FcnJvcldpdGhEZXRhaWwgZXh0ZW5kcyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNoYXJzZXROYW1lOwotCi0JcHVibGljIENoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzCi0JICovCi0JcHVibGljIENoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsKFN0cmluZyBjaGFyc2V0TmFtZSkgewotCQlzdXBlcigpOwotCQlmQ2hhcnNldE5hbWUgPSBjaGFyc2V0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZDaGFyc2V0TmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENoYXJzZXROYW1lKCkgewotCQlyZXR1cm4gZkNoYXJzZXROYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYzMWJiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zOwotCi1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBJbnRlbmRlZCB0byBiZSBhIG1vcmUgcHJlY2lzZSBmb3JtIG9mIHRoZSBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbiwgd2hlcmUKLSAqIGNoYXJhY3RlciBwb3NpdGlvbiBhbmQgYXR0ZW1wdGVkIGVuY29kaW5nIGNhbiBiZSBhdHRlbXB0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwgZXh0ZW5kcyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewotCi0JLyoqCi0JICogRGVmYXVsdCA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgaW50IGZDaGFyUG9zaXRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgZkRldGVjdGVkQ2hhcnNldE5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGZFeGNlZWRlZE1heCA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIGZKYXZhQ2hhcnNldE5hbWU7Ci0JcHJpdmF0ZSBpbnQgZk1heEJ1ZmZlcjsKLQotCS8qKgotCSAqIERpc2FsbG93IGRlZmF1bHQgY29uc3RydWN0b3IuIElmIGF0dGVtcHRlZEVuY29kaW5nIGFuZCBjaGFyUG9zdGlvbiBjYW4KLQkgKiBub3QgYmUgcHJvdmlkZWQsIHVzZSBvbmUgb2YgamF2YSdzIE1hbGZvcm1lZEV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsKCkgewotCQkvLyBOb3RoaW5nIHRvIGRvCi0JfQotCi0JcHVibGljIE1hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbChTdHJpbmcgZW5jb2RpbmdOYW1lLCBpbnQgY2hhclBvc3Rpb24pIHsKLQkJdGhpcy5mSmF2YUNoYXJzZXROYW1lID0gZW5jb2RpbmdOYW1lOwotCQl0aGlzLmZEZXRlY3RlZENoYXJzZXROYW1lID0gZW5jb2RpbmdOYW1lOwotCQl0aGlzLmZDaGFyUG9zaXRpb24gPSBjaGFyUG9zdGlvbjsKLQl9Ci0KLQlwdWJsaWMgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsKFN0cmluZyBhdHRlbXB0ZWRKYXZhRW5jb2RpbmcsIFN0cmluZyBhdHRlbXB0ZWRJQU5BRW5jb2RpbmcsIGludCBjaGFyUG9zdGlvbikgewotCQl0aGlzLmZKYXZhQ2hhcnNldE5hbWUgPSBhdHRlbXB0ZWRKYXZhRW5jb2Rpbmc7Ci0JCXRoaXMuZkRldGVjdGVkQ2hhcnNldE5hbWUgPSBhdHRlbXB0ZWRJQU5BRW5jb2Rpbmc7Ci0JCXRoaXMuZkNoYXJQb3NpdGlvbiA9IGNoYXJQb3N0aW9uOwotCX0KLQotCS8qKgotCSAqIElmIGNoYXJQb3NpdGlvbiA9IC0xIHRoaXMgY291bGQgYmUgYmVjYXVzZSB0aGUgY2hhcmFjdGVyIHBvc2l0aW9uCi0JICogZXhjZWVkZWQgdGhlIG1heGltdW0gYnVmZmVyIHNpemUsIG1heEJ1ZmZlciwgdGhlbiBleGNlZWRlZE1heCA9IHRydWUuCi0JICovCi0JcHVibGljIE1hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbChTdHJpbmcgYXR0ZW1wdGVkSmF2YUVuY29kaW5nLCBTdHJpbmcgYXR0ZW1wdGVkSUFOQUVuY29kaW5nLCBpbnQgY2hhclBvc3Rpb24sIGJvb2xlYW4gZXhjZWVkZWRNYXgsIGludCBtYXhCdWZmZXIpIHsKLQkJdGhpcy5mSmF2YUNoYXJzZXROYW1lID0gYXR0ZW1wdGVkSmF2YUVuY29kaW5nOwotCQl0aGlzLmZEZXRlY3RlZENoYXJzZXROYW1lID0gYXR0ZW1wdGVkSUFOQUVuY29kaW5nOwotCQl0aGlzLmZDaGFyUG9zaXRpb24gPSBjaGFyUG9zdGlvbjsKLQkJdGhpcy5mRXhjZWVkZWRNYXggPSBleGNlZWRlZE1heDsKLQkJdGhpcy5mTWF4QnVmZmVyID0gbWF4QnVmZmVyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dGVtcHRlZElBTkFFbmNvZGluZygpIHsKLQkJcmV0dXJuIGZEZXRlY3RlZENoYXJzZXROYW1lOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dGVtcHRlZEphdmFFbmNvZGluZygpIHsKLQkJcmV0dXJuIGZKYXZhQ2hhcnNldE5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoYXJQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZDaGFyUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWF4QnVmZmVyLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRNYXhCdWZmZXIoKSB7Ci0JCXJldHVybiBmTWF4QnVmZmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4Y2VlZGVkTWF4LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhjZWVkZWRNYXgoKSB7Ci0JCXJldHVybiBmRXhjZWVkZWRNYXg7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvTWFsZm9ybWVkT3V0cHV0RXhjZXB0aW9uV2l0aERldGFpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9leGNlcHRpb25zL01hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlYzY4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvTWFsZm9ybWVkT3V0cHV0RXhjZXB0aW9uV2l0aERldGFpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zOwotCi0KLXB1YmxpYyBjbGFzcyBNYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsIGV4dGVuZHMgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsIHsKLQotCS8qKgotCSAqIERlZmF1bHQgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWwuIElmIGF0dGVtcHRlZEVuY29kaW5nIGFuZCBjaGFyUG9zdGlvbiBjYW4KLQkgKiBub3QgYmUgcHJvdmlkZWQsIHVzZSBzdW4uaW8uTWFsZm9ybWVkRXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBhdHRlbXB0ZWRKYXZhRW5jb2RpbmcKLQkgKiBAcGFyYW0gYXR0ZW1wdGVkSUFOQUVuY29kaW5nCi0JICogQHBhcmFtIGNoYXJQb3N0aW9uCi0JICovCi0JcHVibGljIE1hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWwoU3RyaW5nIGF0dGVtcHRlZEphdmFFbmNvZGluZywgU3RyaW5nIGF0dGVtcHRlZElBTkFFbmNvZGluZywgaW50IGNoYXJQb3N0aW9uKSB7Ci0JCXN1cGVyKGF0dGVtcHRlZEphdmFFbmNvZGluZywgYXR0ZW1wdGVkSUFOQUVuY29kaW5nLCBjaGFyUG9zdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9leGNlcHRpb25zL1Vuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzYWY4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zOwotCi1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotCi0KLS8qKgotICogVGhpcyBpcyBpbnRlbmRlZCBmb3Igc2FtZSBwdXJwb3NlIGFzIGl0IHN1cGVyIGNsYXNzLCBidXQgc2ltcGx5IHByb3ZpZGVzCi0gKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoYW4gdGhlIG5hbWUgaW4gZXJyb3IuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwKLSAqIGZvciAiVUlzIiB3aGljaCBjYW4gcHJlc2VudCB1c2VycyB3aXRoIHRoZSBlcnJvciwgYW5kIHRoZQotICogImFwcHJvcHJpYXRlRGVmYXVsdCIgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYSBwYXJ0aWN1bGFyIGlucHV0LgotICovCi1wdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbCBleHRlbmRzIFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZkVuY29kaW5nTWVtZW50aW87Ci0KLQlwdWJsaWMgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbChFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvKSB7Ci0JCXRoaXMoZW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKSk7Ci0JCWZFbmNvZGluZ01lbWVudGlvID0gZW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCXByb3RlY3RlZCBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsKFN0cmluZyBjaGFyc2V0TmFtZSkgewotCQlzdXBlcihjaGFyc2V0TmFtZSk7Ci0JfQotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJldHVybiBmRW5jb2RpbmdNZW1lbnRpbzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGFza3MvSUZpbGVUYXNrU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90YXNrcy9JRmlsZVRhc2tTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNjU1YjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90YXNrcy9JRmlsZVRhc2tTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotCi0vKioKLSAqIFNjYW5uZXJzIGZvciB0aGUgbWFpbiBUYXNrIFNjYW5uZXIuIFNjYW5uZXJzIG1heSBiZSBjb250cmlidXRlZCB1c2luZyB0aGUKLSAqIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50YXNrc2Nhbm5lciBleHRlbnNpb24gcG9pbnQuIEZvciByZXNvdXJjZXMgYW5kCi0gKiByZXNvdXJjZSBkZWx0YXMgd2l0aCBtYXRjaGluZyBjb250ZW50IHR5cGVzLCB0aGUgbWFpbiBzY2FubmVyIHdpbGwgZmlyc3QKLSAqIGNhbGwgdGhlIHN0YXJ0dXAoKSBtZXRob2QsIHNjYW4oKSwgYW5kIHRoZW4gc2h1dGRvd24oKSBpbiBzZXF1ZW5jZS4gU2Nhbm5lcgotICogaW5zdGFuY2VzIHdpbGwgYmUgcmV1c2VkIGFjcm9zcyBwcm9qZWN0cyBidXQgYXJlIG5vdCBzaGFyZWQgcGVyIGNvbnRlbnQKLSAqIHR5cGUuIFNjYW5uZXJzIHNob3VsZCBub3QgaG9sZCBvbiB0byByZWZlcmVuY2VzIHRvIG1vZGVscyBvciByZXNvdXJjZXMKLSAqIGFmdGVyIHNodXRkb3duKCkgYW5kIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvIGxlYWsgbWVtb3J5IG9yIHJlc291cmNlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRmlsZVRhc2tTY2FubmVyIHsKLQkvKioKLQkgKiBEZWZhdWx0IG1hcmtlciB0eXBlIElEIG9mIHRhc2sgbWFya2VycyB0aGF0IGFyZSBjcmVhdGVkLgotCSAqLwotCVN0cmluZyBUQVNLX01BUktFUl9JRCA9IFNTRUNvcmVQbHVnaW4uSUQgKyAiLnRhc2siOyAvLyROT04tTkxTLTEkOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgdGFzayBtYXJrZXIgdHlwZSB0aGF0IHNob3VsZCBiZSByZW1vdmVkIGVhY2ggdGltZSB0YXNrcyBhcmUKLQkgKiAgICAgICAgIHJlc2Nhbm5lZCBhbmQgdXNlZCBieSBkZWZhdWx0IHdoZW4gY3JlYXRpbmcgdGFzayBtYXJrZXJzLgotCSAqICAgICAgICAgQ2hpbGRyZW4gb2YgdGhpcyBtYXJrZXIgdHlwZSB3aWxsIGJlIHJlbW92ZWQgYXV0b21hdGljYWxseS4KLQkgKi8KLQlTdHJpbmcgZ2V0TWFya2VyVHlwZSgpOwotCi0JLyoqCi0JICogUmVxdWVzdHMgdGhhdCB0aGUgbGlzdCBvZiBhdXRvbWF0aWNhbGx5IGRpc2NvdmVyZWQgdGFza3MgZm9yIHRoZSBnaXZlbgotCSAqIGZpbGUgYmUgdXBkYXRlZC4gT25jZSBjb21wbGV0ZWQsIHRoZSBsaXN0IG9mIHRhc2tzIHNob3VsZCBjb3JyZXNwb25kCi0JICogZXhhY3RseSB0byB0aGUgZmlsZSdzIGNvbnRlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIC0KLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIGJlIHNjYW5uZWQKLQkgKiBAcGFyYW0gdGFza1RhZ3MgLQotCSAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgdGFzayB0YWdzIGZvciB3aGljaCB0byBzY2FuCi0JICogQHBhcmFtIG1vbml0b3IgLQotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBtYXBzIGNvbnRhaW5pbmcgdGhlIGF0dHJpYnV0ZXMgb2YgdGFzayBtYXJrZXJzIHRvCi0JICogICAgICAgICBiZSBjcmVhdGVkCi0JICogICAgICAgICA8cD4KLQkgKiAgICAgICAgIFRoZSByZXNlcnZlZCBhdHRyaWJ1dGUgbmFtZQotCSAqICAgICAgICAgPGI+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGFza21hcmtlcjwvYj4gbWF5IGJlIHVzZWQgdG8KLQkgKiAgICAgICAgIHNwZWNpZnkgYSB0eXBlIHRvIHVzZSB3aGVuIGNyZWF0aW5nIHRoZSB0YXNrIG1hcmtlci4KLQkgKiAgICAgICAgIDwvcD4KLQkgKi8KLQlNYXBbXSBzY2FuKElGaWxlIGZpbGUsIFRhc2tUYWdbXSB0YXNrVGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBzY2FubmVyIHRoYXQgc2Nhbm5pbmcgaXMgZG9uZSBmb3Igbm93LiBSZXNvdXJjZXMgaGVsZCBmcm9tCi0JICogc3RhcnR1cCBzaG91bGQgbm93IGJlIHJlbGVhc2VkLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IC0KLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IHRoYXQgd2FzIGp1c3Qgc2Nhbm5lZAotCSAqLwotCXZvaWQgc2h1dGRvd24oSVByb2plY3QgcHJvamVjdCk7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgc2Nhbm5lciB0aGF0IGEgc2VxdWVuY2Ugb2Ygc2NhbnMgaXMgYWJvdXQgdG8gYmUgcmVxdWVzdGVkLgotCSAqIElkZWFsbHkgdGhlIHRpbWUgdG8gbG9hZCBwcmVmZXJlbmNlcyBhbmQgcGVyZm9ybSBhbnkgZXhwZW5zaXZlCi0JICogY29uZmlndXJhdGlvbiBmb3IgdGhlIGdpdmVuIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgLQotCSAqICAgICAgICAgICAgdGhlIHByb2plY3QgdGhhdCBpcyBhYm91dCB0byBiZSBzY2FubmVkCi0JICogCi0JICovCi0Jdm9pZCBzdGFydHVwKElQcm9qZWN0IHByb2plY3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90YXNrcy9UYXNrVGFnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3Rhc2tzL1Rhc2tUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiNzI1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3Rhc2tzL1Rhc2tUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLQotLyoqCi0gKiBTaW1wbGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlcyB0aGF0IG1ha2UgdXAgYSBUYXNrIFRhZwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGFza1RhZyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9ISUdIID0gSU1hcmtlci5QUklPUklUWV9ISUdIOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX0xPVyA9IElNYXJrZXIuUFJJT1JJVFlfTE9XOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX05PUk1BTCA9IElNYXJrZXIuUFJJT1JJVFlfTk9STUFMOwotCi0JLyoqCi0JICogdGhpcyB0YXNrIHRhZydzIHByaW9yaXR5Ci0JICovCi0JcHJpdmF0ZSBpbnQgZlByaW9yaXR5ID0gUFJJT1JJVFlfTk9STUFMOwotCQotCS8qKgotCSAqIHRoaXMgdGFzayB0YWcncyAidGFnZ2luZyIgdGV4dAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZUYWcgPSBudWxsOwotCi0JcHVibGljIFRhc2tUYWcoU3RyaW5nIHRhZywgaW50IHByaW9yaXR5KSB7Ci0JCXN1cGVyKCk7Ci0JCWZUYWcgPSB0YWc7Ci0JCWZQcmlvcml0eSA9IHByaW9yaXR5OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKSB7Ci0JCXJldHVybiBmUHJpb3JpdHk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYWcoKSB7Ci0JCXJldHVybiBmVGFnOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRUYWcoKSArICI6IiArIGdldFByaW9yaXR5KCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL0ZpbGVUYXNrU2Nhbm5lclJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL0ZpbGVUYXNrU2Nhbm5lclJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YjljMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9GaWxlVGFza1NjYW5uZXJSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKEludGFsaW8pIC0gYnVnIDMwMDQzNCAtIE1ha2UgaW5uZXIgY2xhc3NlcyBzdGF0aWMgd2hlcmUgcG9zc2libCAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzLklGaWxlVGFza1NjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi1wdWJsaWMgY2xhc3MgRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIgewotCXByaXZhdGUgc3RhdGljIGNsYXNzIFNjYW5uZXJJbmZvIHsKLQkJU3RyaW5nIGZJZDsKLQkJSUZpbGVUYXNrU2Nhbm5lciBmU2Nhbm5lcjsKLQotCQlTY2FubmVySW5mbyhTdHJpbmcgaWQsIElGaWxlVGFza1NjYW5uZXIgc2Nhbm5lcikgewotCQkJc3VwZXIoKTsKLQkJCWZJZCA9IGlkOwotCQkJZlNjYW5uZXIgPSBzY2FubmVyOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBTY2FubmVySW5mbyAmJiBmSWQuZXF1YWxzKCgoU2Nhbm5lckluZm8pIG9iaikuZklkKTsKLQkJfQotCi0JCXB1YmxpYyBJRmlsZVRhc2tTY2FubmVyIGdldFNjYW5uZXIoKSB7Ci0JCQlyZXR1cm4gZlNjYW5uZXI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBGaWxlVGFza1NjYW5uZXJSZWdpc3RyeVJlYWRlciBfaW5zdGFuY2UgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBGaWxlVGFza1NjYW5uZXJSZWdpc3RyeVJlYWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKF9pbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlfaW5zdGFuY2UgPSBuZXcgRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIoKTsKLQkJfQotCQlyZXR1cm4gX2luc3RhbmNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIEFUVF9DT05URU5UX1RZUEVTID0gImNvbnRlbnRUeXBlSWRzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBmU2Nhbm5lckVsZW1lbnRzOwotCi0JLy8gYSBtYXBwaW5nIGZyb20gY29udGVudCB0eXBlcyB0byBTY2FubmVySW5mbyBpbnN0YW5jZXMKLQlwcml2YXRlIE1hcCBmU2Nhbm5lckluZm9zID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIE5BTUVfU0NBTk5FUiA9ICJzY2FubmVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgU0NBTk5FUl9FWFRFTlNJT05fUE9JTlRfSUQgPSBTU0VDb3JlUGx1Z2luLklEICsgIi50YXNrc2Nhbm5lciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JSUZpbGVUYXNrU2Nhbm5lcltdIGdldEZpbGVUYXNrU2Nhbm5lcnMoSUNvbnRlbnRUeXBlW10gY29udGVudFR5cGVzKSB7Ci0JCWlmIChmU2Nhbm5lckVsZW1lbnRzID09IG51bGwpIHsKLQkJCXJlYWRSZWdpc3RyeSgpOwotCQl9Ci0KLQkJTGlzdCBzY2FubmVySW5mb3MgPSBuZXcgQXJyYXlMaXN0KDEpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTY2FubmVySW5mb1tdIHNjYW5uZXJJbmZvc0ZvckNvbnRlbnRUeXBlID0gKFNjYW5uZXJJbmZvW10pIGZTY2FubmVySW5mb3MuZ2V0KGNvbnRlbnRUeXBlc1tpXS5nZXRJZCgpKTsKLQkJCWlmIChzY2FubmVySW5mb3NGb3JDb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQkJc2Nhbm5lckluZm9zRm9yQ29udGVudFR5cGUgPSBsb2FkU2Nhbm5lcnMoY29udGVudFR5cGVzW2ldKTsKLQkJCX0KLQkJCS8vIG9ubHkgYWRkIG5vbi1kdXBsaWNhdGUgc2Nhbm5lcnMKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2Nhbm5lckluZm9zRm9yQ29udGVudFR5cGUubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAoIXNjYW5uZXJJbmZvcy5jb250YWlucyhzY2FubmVySW5mb3NGb3JDb250ZW50VHlwZVtqXSkpIHsKLQkJCQkJc2Nhbm5lckluZm9zLmFkZChzY2FubmVySW5mb3NGb3JDb250ZW50VHlwZVtqXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUlGaWxlVGFza1NjYW5uZXJbXSBzY2FubmVycyA9IG5ldyBJRmlsZVRhc2tTY2FubmVyW3NjYW5uZXJJbmZvcy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNjYW5uZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzY2FubmVyc1tpXSA9ICgoU2Nhbm5lckluZm8pIHNjYW5uZXJJbmZvcy5nZXQoaSkpLmdldFNjYW5uZXIoKTsKLQkJfQotCQlyZXR1cm4gc2Nhbm5lcnM7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZENvbnRlbnRUeXBlSWRzKCkgewotCQlpZiAoZlNjYW5uZXJFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlyZWFkUmVnaXN0cnkoKTsKLQkJfQotCi0JCS8vIGZpbmQgdGhlIHJlbGV2YW50IGV4dGVuc2lvbnMKLQkJTGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHNjYW5uZXJFbGVtZW50cyA9IGZTY2FubmVyRWxlbWVudHM7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgc2Nhbm5lckVsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQlpZiAoIXNjYW5uZXJFbGVtZW50c1tqXS5nZXROYW1lKCkuZXF1YWxzKE5BTUVfU0NBTk5FUikpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmdbXSBjb250ZW50VHlwZUlkcyA9IFN0cmluZ1V0aWxzLnVucGFjayhzY2FubmVyRWxlbWVudHNbal0uZ2V0QXR0cmlidXRlKEFUVF9DT05URU5UX1RZUEVTKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRUeXBlSWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCF0eXBlcy5jb250YWlucyhjb250ZW50VHlwZUlkc1tpXSkpIHsKLQkJCQkJdHlwZXMuYWRkKGNvbnRlbnRUeXBlSWRzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKFN0cmluZ1tdKSB0eXBlcy50b0FycmF5KG5ldyBTdHJpbmdbdHlwZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBTY2FubmVySW5mb1tdIGxvYWRTY2FubmVycyhJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCVNjYW5uZXJJbmZvW10gc2Nhbm5lckluZm9zID0gbnVsbDsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZGVsZWdhdGVFbGVtZW50cyA9IGZTY2FubmVyRWxlbWVudHM7Ci0JCWlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGVNYW5hZ2VyIGNvbnRlbnRUeXBlTWFuYWdlciA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZWxlZ2F0ZUVsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKCFkZWxlZ2F0ZUVsZW1lbnRzW2pdLmdldE5hbWUoKS5lcXVhbHMoTkFNRV9TQ0FOTkVSKSkKLQkJCQkJY29udGludWU7Ci0JCQkJU3RyaW5nW10gc3VwcG9ydGVkQ29udGVudFR5cGVJZHMgPSBTdHJpbmdVdGlscy51bnBhY2soZGVsZWdhdGVFbGVtZW50c1tqXS5nZXRBdHRyaWJ1dGUoQVRUX0NPTlRFTlRfVFlQRVMpKTsKLQkJCQlJQ29udGVudFR5cGVbXSBzdXBwb3J0ZWRDb250ZW50VHlwZXMgPSBuZXcgSUNvbnRlbnRUeXBlW3N1cHBvcnRlZENvbnRlbnRUeXBlSWRzLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBzdXBwb3J0ZWRDb250ZW50VHlwZUlkcy5sZW5ndGg7IGsrKykgewotCQkJCQlzdXBwb3J0ZWRDb250ZW50VHlwZXNba10gPSBjb250ZW50VHlwZU1hbmFnZXIuZ2V0Q29udGVudFR5cGUoc3VwcG9ydGVkQ29udGVudFR5cGVJZHNba10udHJpbSgpKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBzdXBwb3J0ZWRDb250ZW50VHlwZUlkcy5sZW5ndGg7IGsrKykgewotCQkJCQkvLyBhbGxvdyBzdWJ0eXBlcyB0byBiZSByZXR1cm5lZCBhcyB3ZWxsCi0JCQkJCWlmIChzdXBwb3J0ZWRDb250ZW50VHlwZXNba10gIT0gbnVsbCAmJiBjb250ZW50VHlwZS5pc0tpbmRPZihzdXBwb3J0ZWRDb250ZW50VHlwZXNba10pKSB7Ci0JCQkJCQllbGVtZW50cy5hZGQoZGVsZWdhdGVFbGVtZW50c1tqXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBpbnN0YW50aWF0ZSBhbmQgc2F2ZSB0aGUgc2Nhbm5lcnMKLQkJCUxpc3Qgc2Nhbm5lckluZm9MaXN0ID0gbmV3IEFycmF5TGlzdChlbGVtZW50cy5zaXplKCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCUlGaWxlVGFza1NjYW5uZXIgc2Nhbm5lciA9IChJRmlsZVRhc2tTY2FubmVyKSAoKElDb25maWd1cmF0aW9uRWxlbWVudCkgZWxlbWVudHMuZ2V0KGkpKS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9DTEFTUyk7Ci0JCQkJCWlmIChzY2FubmVyICE9IG51bGwpIHsKLQkJCQkJCXNjYW5uZXJJbmZvTGlzdC5hZGQobmV3IFNjYW5uZXJJbmZvKCgoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBlbGVtZW50cy5nZXQoaSkpLmdldEF0dHJpYnV0ZShBVFRfSUQpLCBzY2FubmVyKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJOb24tZmF0YWwgZXhjZXB0aW9uIGNyZWF0aW5nIHRhc2sgc2Nhbm5lciBmb3IgIiArIGNvbnRlbnRUeXBlLmdldElkKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJc2Nhbm5lckluZm9zID0gKFNjYW5uZXJJbmZvW10pIHNjYW5uZXJJbmZvTGlzdC50b0FycmF5KG5ldyBTY2FubmVySW5mb1tzY2FubmVySW5mb0xpc3Quc2l6ZSgpXSk7Ci0JCQlmU2Nhbm5lckluZm9zLnB1dChjb250ZW50VHlwZS5nZXRJZCgpLCBzY2FubmVySW5mb3MpOwotCQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU1JFR0lTVFJZKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGVkICIgKyBzY2FubmVySW5mb3MubGVuZ3RoICsgIiB0YXNrIHNjYW5uZXIgZm9yICIgKyBjb250ZW50VHlwZS5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNjYW5uZXJJbmZvczsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZFJlZ2lzdHJ5KCkgewotCQlmU2Nhbm5lckluZm9zID0gbmV3IEhhc2hNYXAoKTsKLQkJLy8gSnVzdCByZW1lbWJlciB0aGUgZWxlbWVudHMsIHNvIHBsdWdpbnMgZG9uJ3QgaGF2ZSB0byBiZSBhY3RpdmF0ZWQsCi0JCS8vIHVubGVzcyBleHRlbnNpb24gYXR0cmlidXRlcyBtYXRjaCB0aG9zZSBvZiBpbnRlcmVzdAotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KFNDQU5ORVJfRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCWZTY2FubmVyRWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9TdHJ1Y3R1cmVkRmlsZVRhc2tTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMjcxYjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9TdHJ1Y3R1cmVkRmlsZVRhc2tTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50YXNrcy5JRmlsZVRhc2tTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50YXNrcy5UYXNrVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLS8qKgotICogQSBkZWxlZ2F0ZSB0byBjcmVhdGUgSU1hcmtlci5UQVNLcyBmb3IgInRvZG9zIiBhbmQgc2ltaWxhciBjb21tZW50cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXIgaW1wbGVtZW50cyBJRmlsZVRhc2tTY2FubmVyLCBJRXhlY3V0YWJsZUV4dGVuc2lvbiB7Ci0JLy8gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyBmb3IgdGhlIG5ldyB0YXNrcyBmb3IgdGhlIGN1cnJlbnQgZmlsZQotCXByb3RlY3RlZCBMaXN0IGZOZXdNYXJrZXJBdHRyaWJ1dGVNYXBzID0gbnVsbDsKLQotCUxpc3Qgb2xkTWFya2VycyA9IG51bGw7Ci0JcHJpdmF0ZSBsb25nIHRpbWUwOwotCXByaXZhdGUgU3RyaW5nIHJ1bnRpbWVNYXJrZXJUeXBlOwotCi0JcHVibGljIFN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZOZXdNYXJrZXJBdHRyaWJ1dGVNYXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbmNlIGNyZWF0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXR0cmlidXRlcyB3aXRoIHdoaWNoIGEgbmV3bHkgY3JlYXRlZCBtYXJrZXIgd2lsbCBiZQotCSAqIGluaXRpYWxpemVkLiBNb2RpZmllZCBmcm9tIHRoZSBtZXRob2QgaW4gTWFya2VyUnVsZXJBY3Rpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbml0aWFsIG1hcmtlciBhdHRyaWJ1dGVzCi0JICovCi0JcHJvdGVjdGVkIE1hcCBjcmVhdGVJbml0aWFsTWFya2VyQXR0cmlidXRlcyhTdHJpbmcgdGV4dCwgaW50IGRvY3VtZW50TGluZSwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgcHJpb3JpdHkpIHsKLQkJTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCg2KTsKLQkJLy8gbWFya2VyIGxpbmUgbnVtYmVycyBhcmUgMS1iYXNlZAotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkxJTkVfTlVNQkVSLCBuZXcgSW50ZWdlcihkb2N1bWVudExpbmUgKyAxKSk7Ci0JCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuVEFTSywgZ2V0TWFya2VyVHlwZSgpKTsKLQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX1NUQVJULCBuZXcgSW50ZWdlcihzdGFydE9mZnNldCkpOwotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfRU5ELCBuZXcgSW50ZWdlcihzdGFydE9mZnNldCArIGxlbmd0aCkpOwotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLk1FU1NBR0UsIHRleHQpOwotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLlVTRVJfRURJVEFCTEUsIEJvb2xlYW4uRkFMU0UpOwotCi0JCXN3aXRjaCAocHJpb3JpdHkpIHsKLQkJCWNhc2UgSU1hcmtlci5QUklPUklUWV9ISUdIIDogewotCQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuUFJJT1JJVFksIG5ldyBJbnRlZ2VyKElNYXJrZXIuUFJJT1JJVFlfSElHSCkpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBJTWFya2VyLlBSSU9SSVRZX0xPVyA6IHsKLQkJCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLlBSSU9SSVRZLCBuZXcgSW50ZWdlcihJTWFya2VyLlBSSU9SSVRZX0xPVykpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6IHsKLQkJCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLlBSSU9SSVRZLCBuZXcgSW50ZWdlcihJTWFya2VyLlBSSU9SSVRZX05PUk1BTCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3MuSUZpbGVUYXNrU2Nhbm5lciNnZXRNYXJrZXJUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmtlclR5cGUoKSB7Ci0JCWlmIChydW50aW1lTWFya2VyVHlwZSAhPSBudWxsKQotCQkJcmV0dXJuIHJ1bnRpbWVNYXJrZXJUeXBlOwotCi0JCXJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyLlRBU0s7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGV0ZWN0Q2hhcnNldChJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiBmaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmaWxlLmdldENoYXJzZXQodHJ1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHBhcmFtIGRvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIGNvbW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaW5kVGFza3MoSURvY3VtZW50IGRvY3VtZW50LCBUYXNrVGFnW10gdGFza1RhZ3MsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIGNvbW1lbnQpIHsKLQkJaWYgKGlzQ29tbWVudFJlZ2lvbihkb2N1bWVudFJlZ2lvbiwgY29tbWVudCkpIHsKLQkJCWludCBzdGFydE9mZnNldCA9IGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbW1lbnQpOwotCQkJaW50IGVuZE9mZnNldCA9IGRvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQoY29tbWVudCk7Ci0JCQl0cnkgewotCQkJCWludCBzdGFydExpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoc3RhcnRPZmZzZXQpOwotCQkJCWludCBlbmRMaW5lID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGVuZE9mZnNldCk7Ci0JCQkJZm9yIChpbnQgbGluZU51bWJlciA9IHN0YXJ0TGluZTsgbGluZU51bWJlciA8PSBlbmRMaW5lOyBsaW5lTnVtYmVyKyspIHsKLQkJCQkJSVJlZ2lvbiBsaW5lID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGxpbmVOdW1iZXIpOwotCQkJCQlpbnQgYmVnaW4gPSBNYXRoLm1heChzdGFydE9mZnNldCwgbGluZS5nZXRPZmZzZXQoKSk7Ci0JCQkJCWludCBlbmQgPSBNYXRoLm1pbihlbmRPZmZzZXQsIGxpbmUuZ2V0T2Zmc2V0KCkgKyBsaW5lLmdldExlbmd0aCgpKTsKLQkJCQkJaW50IGxlbmd0aCA9IGVuZCAtIGJlZ2luOwotCi0JCQkJCS8qIFhYWDogVGhpcyBnZW5lcmF0ZXMgYSBsb3Qgb2YgZ2FyYmFnZSBvYmplY3RzICovCi0KLQkJCQkJU3RyaW5nIGNvbW1lbnRlZFRleHQgPSBnZXRDb21tZW50ZWRUZXh0KGRvY3VtZW50LCBiZWdpbiwgbGVuZ3RoKTsKLQkJCQkJU3RyaW5nIGNvbXBhcmlzb25UZXh0ID0gY29tbWVudGVkVGV4dC50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXNrVGFncy5sZW5ndGg7IGkrKykgewotCQkJCQkJaW50IHRhZ0luZGV4ID0gY29tcGFyaXNvblRleHQuaW5kZXhPZih0YXNrVGFnc1tpXS5nZXRUYWcoKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkpOwotCQkJCQkJaWYgKHRhZ0luZGV4ID49IDApIHsKLQkJCQkJCQlTdHJpbmcgbWFya2VyRGVzY3JpcHRpb24gPSBjb21tZW50ZWRUZXh0LnN1YnN0cmluZyh0YWdJbmRleCk7Ci0JCQkJCQkJaW50IG1hcmtlck9mZnNldCA9IGJlZ2luICsgdGFnSW5kZXg7Ci0JCQkJCQkJaW50IG1hcmtlckxlbmd0aCA9IGVuZCAtIG1hcmtlck9mZnNldDsKLQkJCQkJCQlmTmV3TWFya2VyQXR0cmlidXRlTWFwcy5hZGQoY3JlYXRlSW5pdGlhbE1hcmtlckF0dHJpYnV0ZXMobWFya2VyRGVzY3JpcHRpb24sIGxpbmVOdW1iZXIsIG1hcmtlck9mZnNldCwgbWFya2VyTGVuZ3RoLCB0YXNrVGFnc1tpXS5nZXRQcmlvcml0eSgpKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmluZFRhc2tzKElGaWxlIGZpbGUsIGZpbmFsIFRhc2tUYWdbXSB0YXNrVGFncywgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBNb2RlbEhhbmRsZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEhhbmRsZXJGb3IoZmlsZSk7Ci0KLQkJCS8vIHJlY29yZHMgaWYgdGhlIG9wdGltaXplZCBzdHJlYW1pc2ggcGFyc2Ugd2FzIHBvc3NpYmxlCi0JCQlib29sZWFuIGRpZFN0cmVhbVBhcnNlID0gZmFsc2U7Ci0JCQlmaW5hbCBJRW5jb2RlZERvY3VtZW50IGRlZmF1bHREb2N1bWVudCA9IGhhbmRsZXIuZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWlmIChkZWZhdWx0RG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJUmVnaW9uUGFyc2VyIHBhcnNlciA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgZGVmYXVsdERvY3VtZW50KS5nZXRQYXJzZXIoKTsKLQkJCQlpZiAocGFyc2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyKSB7Ci0JCQkJCWRpZFN0cmVhbVBhcnNlID0gdHJ1ZTsKLQkJCQkJU3RyaW5nIGNoYXJzZXQgPSBkZXRlY3RDaGFyc2V0KGZpbGUpOwotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIgZG9jdW1lbnRQYXJzZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyKSBwYXJzZXI7Ci0JCQkJCWZpbmFsIElEb2N1bWVudCB0ZXh0RG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoKTsKLQkJCQkJc2V0RG9jdW1lbnRDb250ZW50KHRleHREb2N1bWVudCwgZmlsZS5nZXRDb250ZW50cyh0cnVlKSwgY2hhcnNldCk7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCB0ZXh0RG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOwotCQkJCQlkb2N1bWVudFBhcnNlci5yZXNldChuZXcgRG9jdW1lbnRSZWFkZXIodGV4dERvY3VtZW50KSk7Ci0JCQkJCWRvY3VtZW50UGFyc2VyLmFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIobmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBub2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZ2lvbnMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCQkJSVRleHRSZWdpb24gY29tbWVudCA9IHJlZ2lvbnMuZ2V0KGopOwotCQkJCQkJCQlmaW5kVGFza3ModGV4dERvY3VtZW50LCB0YXNrVGFncywgZG9jdW1lbnRSZWdpb24sIGNvbW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCQkvLyBkaXNjb25uZWN0IHRoZSBkb2N1bWVudCByZWdpb25zCi0JCQkJCQkJaWYgKGRvY3VtZW50UmVnaW9uLmdldFByZXZpb3VzKCkgIT0gbnVsbCkgewotCQkJCQkJCQlkb2N1bWVudFJlZ2lvbi5nZXRQcmV2aW91cygpLnNldFByZXZpb3VzKG51bGwpOwotCQkJCQkJCQlkb2N1bWVudFJlZ2lvbi5nZXRQcmV2aW91cygpLnNldE5leHQobnVsbCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJCQl0ZXh0RG9jdW1lbnQuc2V0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQltb25pdG9yLndvcmtlZChkb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJlc2V0Tm9kZXMoKSB7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCQlkb2N1bWVudFBhcnNlci5nZXREb2N1bWVudFJlZ2lvbnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWRpZFN0cmVhbVBhcnNlKSB7Ci0JCQkJLy8gVXNlIGEgU3RydWN0dXJlZERvY3VtZW50Ci0JCQkJSUVuY29kZWREb2N1bWVudCBkb2N1bWVudCA9IGhhbmRsZXIuZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoZmlsZSk7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIGRvY3VtZW50LmdldExlbmd0aCgpKTsKLQkJCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZ2lvbnMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCQlJVGV4dFJlZ2lvbiBjb21tZW50ID0gcmVnaW9ucy5nZXQoaik7Ci0JCQkJCQkJZmluZFRhc2tzKGRvY3VtZW50LCB0YXNrVGFncywgZG9jdW1lbnRSZWdpb24sIGNvbW1lbnQpOwotCQkJCQkJfQotCQkJCQkJbW9uaXRvci53b3JrZWQoZG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIHdpdGggIiArIGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXIgZW5jb3VudGVyZWQgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHJlYWRpbmcgIiArIGZpbGUuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiB3aXRoICIgKyBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQltb25pdG9yLmRvbmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbW1lbnRlZFRleHQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgYmVnaW4sIGludCBsZW5ndGgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBkb2N1bWVudC5nZXQoYmVnaW4sIGxlbmd0aCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNDb21tZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uKTsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgTWFwW10gc2NhbihJRmlsZSBmaWxlLCBUYXNrVGFnW10gdGFza1RhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmTmV3TWFya2VyQXR0cmlidXRlTWFwcy5jbGVhcigpOwotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkgfHwgIXNob3VsZFNjYW4oZmlsZSkpIHsKLQkJCXJldHVybiBuZXcgTWFwWzBdOwotCQl9Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1NQRVJGKSB7Ci0JCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCWlmICh0YXNrVGFncy5sZW5ndGggPiAwKSB7Ci0JCQlmaW5kVGFza3MoZmlsZSwgdGFza1RhZ3MsIG1vbml0b3IpOwotCQl9Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1NQRVJGKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMgZm9yICIgKyBmaWxlLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gKE1hcFtdKSBmTmV3TWFya2VyQXR0cmlidXRlTWFwcy50b0FycmF5KG5ldyBNYXBbZk5ld01hcmtlckF0dHJpYnV0ZU1hcHMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZG9jdW1lbnQgY29udGVudCBmcm9tIHRoaXMgc3RyZWFtIGFuZCBjbG9zZXMgdGhlIHN0cmVhbQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50Q29udGVudChJRG9jdW1lbnQgZG9jdW1lbnQsIElucHV0U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFN0cmluZyBjaGFyc2V0KSB7Ci0JCVJlYWRlciBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoY29udGVudFN0cmVhbSwgY2hhcnNldCksIDIwNDgpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMjA0OCk7Ci0JCQljaGFyW10gcmVhZEJ1ZmZlciA9IG5ldyBjaGFyWzIwNDhdOwotCQkJaW50IG4gPSBpbi5yZWFkKHJlYWRCdWZmZXIpOwotCQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChyZWFkQnVmZmVyLCAwLCBuKTsKLQkJCQluID0gaW4ucmVhZChyZWFkQnVmZmVyKTsKLQkJCX0KLQkJCWRvY3VtZW50LnNldChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChpbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbiNzZXRJbml0aWFsaXphdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJcnVudGltZU1hcmtlclR5cGUgPSBkYXRhLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQlib29sZWFuIHNob3VsZFNjYW4oSVJlc291cmNlIHIpIHsKLQkJLy8gc2tpcCAiZG90IiBmaWxlcwotCQlTdHJpbmcgcyA9IHIuZ2V0TmFtZSgpOwotCQlyZXR1cm4gcy5sZW5ndGgoKSA9PSAwIHx8IHMuY2hhckF0KDApICE9ICcuJzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1MpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzICsgIiBzaHV0ZG93biBmb3IgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnR1cChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1MpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzICsgIiBzdGFydHVwIGZvciAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU1BFUkYpIHsKLQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU1BFUkYpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyBsb2FkaW5nIHByZWZzIGZvciAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvVGFza1NjYW5uaW5nSm9iLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1Rhc2tTY2FubmluZ0pvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmZkYTYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvVGFza1NjYW5uaW5nSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAoSW50YWxpbykgLSBidWcgMzAwNDQzIC0gc29tZSBjb25zdGFudHMgYXJlbid0IHN0YXRpYyBmaW5hbAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogUXVldWVpbmcgSm9iIGZvciBwcm9jZXNzaW5nIGRlbHRhcyBhbmQgcHJvamVjdHMuCi0gKi8KLWNsYXNzIFRhc2tTY2FubmluZ0pvYiBleHRlbmRzIEpvYiB7Ci0Jc3RhdGljIGZpbmFsIGludCBKT0JfREVMQVlfREVMVEEgPSAxMDAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKT0JfREVMQVlfUFJPSkVDVCA9IDUwMDA7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1RBR19QUk9KRUNUU19BTFJFQURZX1NDQU5ORUQgPSAidGFzay10YWctcHJvamVjdHMtYWxyZWFkeS1zY2FubmVkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgTGlzdCBmUXVldWUgPSBudWxsOwotCi0JLyoqIHN5bWJvbGljIG5hbWUgZm9yIE9TR0kgZnJhbWV3b3JrICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TR0lfRlJBTUVXT1JLX0lEID0gIm9yZy5lY2xpcHNlLm9zZ2kiOyAvLyROT04tTkxTLTEkCi0KLQlUYXNrU2Nhbm5pbmdKb2IoKSB7Ci0JCXN1cGVyKFNTRUNvcmVNZXNzYWdlcy5UYXNrU2Nhbm5lcl8wKTsKLQkJZlF1ZXVlID0gbmV3IEFycmF5TGlzdCgpOwotCQlzZXRQcmlvcml0eShKb2IuREVDT1JBVEUpOwotCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCXNldFVzZXIoZmFsc2UpOwotCi0JCVNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChUQVNLX1RBR19QUk9KRUNUU19BTFJFQURZX1NDQU5ORUQsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIGFkZFByb2plY3REZWx0YShJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlJUmVzb3VyY2UgcHJvamVjdFJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQotCQlpZiAocHJvamVjdFJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJaWYgKGlzRW5hYmxlZE9uUHJvamVjdCgoSVByb2plY3QpIHByb2plY3RSZXNvdXJjZSkpIHsKLQkJCQlmUXVldWUuYWRkKGRlbHRhKTsKLQkJCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTSk9CKSB7Ci0JCQkJCVN0cmluZyBraW5kID0gbnVsbDsKLQkJCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQgOgotCQkJCQkJCWtpbmQgPSAiIFtJUmVzb3VyY2VEZWx0YS5BRERFRF0iOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOgotCQkJCQkJCWtpbmQgPSAiIFtJUmVzb3VyY2VEZWx0YS5DSEFOR0VEXSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6Ci0JCQkJCQkJa2luZCA9ICIgW0lSZXNvdXJjZURlbHRhLlJFTU9WRURdIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRF9QSEFOVE9NIDoKLQkJCQkJCQlraW5kID0gIiBbSVJlc291cmNlRGVsdGEuQURERURfUEhBTlRPTV0iOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRURfUEhBTlRPTSA6Ci0JCQkJCQkJa2luZCA9ICIgW0lSZXNvdXJjZURlbHRhLlJFTU9WRURfUEhBTlRPTV0iOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgZGVsdGEgIiArIGRlbHRhLmdldEZ1bGxQYXRoKCkgKyBraW5kKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlzY2hlZHVsZShKT0JfREVMQVlfREVMVEEpOwotCQkJfQotCQl9Ci0JfQotCi0Jc3luY2hyb25pemVkIHZvaWQgYWRkUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0SGFzTm90QmVlbkZ1bGx5U2Nhbm5lZChwcm9qZWN0KSkgewotCQkJZlF1ZXVlLmFkZChwcm9qZWN0KTsKLQkJCWlmIChMb2dnZXIuREVCVUdfVEFTS1NKT0IpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXNjaGVkdWxlKEpPQl9ERUxBWV9QUk9KRUNUKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgY2hlY2sgdG8gc2VlIGlmIHRoZSBPU0dJIGZyYW1ld29yayBpcyBzaHV0dGluZyBkb3duLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgU3lzdGVtIEJ1bmRsZSBpcyBzdG9wcGVkIChpZS4gdGhlIGZyYW1ld29yayBpcwotCSAqICAgICAgICAgc2h1dHRpbmcgZG93bikKLQkgKi8KLQlib29sZWFuIGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkgewotCQkvLyBpbiB0aGUgRnJhbWV3b3JrIGNsYXNzIHRoZXJlJ3MgYSBub3RlOgotCQkvLyBzZXQgdGhlIHN0YXRlIG9mIHRoZSBTeXN0ZW0gQnVuZGxlIHRvIFNUT1BQSU5HLgotCQkvLyB0aGlzIG11c3QgYmUgZG9uZSBmaXJzdCBhY2NvcmRpbmcgdG8gc2VjdGlvbiA0LjE5LjIgZnJvbSB0aGUgT1NHaQotCQkvLyBSMyBzcGVjLgotCQlib29sZWFuIHNodXR0aW5nRG93biA9ICFQbGF0Zm9ybS5pc1J1bm5pbmcoKSB8fCBQbGF0Zm9ybS5nZXRCdW5kbGUoT1NHSV9GUkFNRVdPUktfSUQpLmdldFN0YXRlKCkgPT0gQnVuZGxlLlNUT1BQSU5HOwotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTSk9CICYmIHNodXR0aW5nRG93bikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJUYXNrU2Nhbm5pbmdKb2I6IHN5c3RlbSBpcyBzaHV0dGluZyBkb3duISIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHNodXR0aW5nRG93bjsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZE9uUHJvamVjdChJUHJvamVjdCBwKSB7Ci0JCUlQcmVmZXJlbmNlc1NlcnZpY2UgcHJlZmVyZW5jZXNTZXJ2aWNlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCk7Ci0JCUlTY29wZUNvbnRleHRbXSBsb29rdXBPcmRlciA9IG5ldyBJU2NvcGVDb250ZXh0W117bmV3IFByb2plY3RTY29wZShwKSwgbmV3IEluc3RhbmNlU2NvcGUoKSwgbmV3IERlZmF1bHRTY29wZSgpfTsKLQkJcmV0dXJuIHByZWZlcmVuY2VzU2VydmljZS5nZXRCb29sZWFuKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFLCBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfRU5BQkxFLCBmYWxzZSwgbG9va3VwT3JkZXIpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwcm9qZWN0SGFzTm90QmVlbkZ1bGx5U2Nhbm5lZChJUmVzb3VyY2UgcHJvamVjdCkgewotCQlTdHJpbmdbXSBwcm9qZWN0c1NjYW5uZWQgPSBTdHJpbmdVdGlscy51bnBhY2soU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoVEFTS19UQUdfUFJPSkVDVFNfQUxSRUFEWV9TQ0FOTkVEKSk7Ci0KLQkJYm9vbGVhbiBzaG91bGRTY2FuID0gdHJ1ZTsKLQkJU3RyaW5nIG5hbWUgPSBwcm9qZWN0LmdldE5hbWUoKTsKLQkJZm9yIChpbnQgaiA9IDA7IHNob3VsZFNjYW4gJiYgaiA8IHByb2plY3RzU2Nhbm5lZC5sZW5ndGg7IGorKykgewotCQkJaWYgKHByb2plY3RzU2Nhbm5lZFtqXS5lcXVhbHMobmFtZSkpIHsKLQkJCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTSk9CKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNjYW5uaW5nIEpvYiBza2lwcGluZyAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJc2hvdWxkU2NhbiA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzaG91bGRTY2FuOwotCX0KLQotCXN5bmNocm9uaXplZCBMaXN0IHJldHJpZXZlUXVldWUoKSB7Ci0JCUxpc3QgcXVldWUgPSBmUXVldWU7Ci0JCWZRdWV1ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHF1ZXVlOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpCi0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0KLQkJY2xlYW51cFJlbWVtYmVyZWRQcm9qZWN0TGlzdChUQVNLX1RBR19QUk9KRUNUU19BTFJFQURZX1NDQU5ORUQpOwotCi0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJTGlzdCBjdXJyZW50UXVldWUgPSByZXRyaWV2ZVF1ZXVlKCk7Ci0JCQotCQl0cnkgewotCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRQcmlvcml0eShUaHJlYWQuTUlOX1BSSU9SSVRZKTsKLQkJfQotCQljYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJLy8gbm90IGEgY3JpdGljYWwgcHJvYmxlbQotCQl9Ci0JCQotCQlMaXN0IGVycm9ycyA9IG51bGw7Ci0JCWludCB0aWNrcyA9IGN1cnJlbnRRdWV1ZS5zaXplKCk7Ci0JCVN0cmluZyB0YXNrTmFtZSA9IG51bGw7Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1NKT0IpIHsKLQkJCXRhc2tOYW1lID0gU1NFQ29yZU1lc3NhZ2VzLlRhc2tTY2FubmluZ0pvYl8wICsgIiAoIiArIHRpY2tzICsgIiB3b3JrIGl0ZW1zKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJdGFza05hbWUgPSBTU0VDb3JlTWVzc2FnZXMuVGFza1NjYW5uaW5nSm9iXzA7Ci0JCX0KLQkJbW9uaXRvci5iZWdpblRhc2sodGFza05hbWUsIHRpY2tzKTsKLQotCQlJUHJvZ3Jlc3NNb25pdG9yIHNjYW5Nb25pdG9yID0gbnVsbDsKLQkJd2hpbGUgKCFjdXJyZW50UXVldWUuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3QgbyA9IGN1cnJlbnRRdWV1ZS5yZW1vdmUoMCk7Ci0JCQlpZiAoZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSB8fCBtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQl0cnkgewotCQkJCXNjYW5Nb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxLCBTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spOwotCQkJCWlmIChvIGluc3RhbmNlb2YgSVJlc291cmNlRGVsdGEpIHsKLQkJCQkJV29ya3NwYWNlVGFza1NjYW5uZXIuZ2V0SW5zdGFuY2UoKS5zY2FuKChJUmVzb3VyY2VEZWx0YSkgbywgc2Nhbk1vbml0b3IpOwotCQkJCX0KLQkJCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJV29ya3NwYWNlVGFza1NjYW5uZXIuZ2V0SW5zdGFuY2UoKS5zY2FuKChJUHJvamVjdCkgbywgc2Nhbk1vbml0b3IpOwotCQkJCQlpZighc2Nhbk1vbml0b3IuaXNDYW5jZWxlZCgpICkgewotCQkJCQkJU3RyaW5nW10gcHJvamVjdHNQcmV2aW91c2x5U2Nhbm5lZCA9IFN0cmluZ1V0aWxzLnVucGFjayhTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhUQVNLX1RBR19QUk9KRUNUU19BTFJFQURZX1NDQU5ORUQpKTsKLQkJCQkJCVN0cmluZ1tdIHVwZGF0ZWRQcm9qZWN0cyA9IG5ldyBTdHJpbmdbcHJvamVjdHNQcmV2aW91c2x5U2Nhbm5lZC5sZW5ndGggKyAxXTsKLQkJCQkJCXVwZGF0ZWRQcm9qZWN0c1twcm9qZWN0c1ByZXZpb3VzbHlTY2FubmVkLmxlbmd0aF0gPSAoKElSZXNvdXJjZSkgbykuZ2V0TmFtZSgpOwotCQkJCQkJU3lzdGVtLmFycmF5Y29weShwcm9qZWN0c1ByZXZpb3VzbHlTY2FubmVkLCAwLCB1cGRhdGVkUHJvamVjdHMsIDAsIHByb2plY3RzUHJldmlvdXNseVNjYW5uZWQubGVuZ3RoKTsKLQkJCQkJCVNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoVEFTS19UQUdfUFJPSkVDVFNfQUxSRUFEWV9TQ0FOTkVELCBTdHJpbmdVdGlscy5wYWNrKHVwZGF0ZWRQcm9qZWN0cykpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGVycm9ycyA9PSBudWxsKSB7Ci0JCQkJCWVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQl9Ci0JCQkJZXJyb3JzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNTRUNvcmVQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQltb25pdG9yLmRvbmUoKTsKLQotCQlpZiAoZXJyb3JzID09IG51bGwgfHwgZXJyb3JzLmlzRW1wdHkoKSkgewotCQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChlcnJvcnMuc2l6ZSgpID09IDEpIHsKLQkJCQlzdGF0dXMgPSAoSVN0YXR1cykgZXJyb3JzLmdldCgwKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlTdGF0dXNbXSBzdGF0aWkgPSAoSVN0YXR1c1tdKSBlcnJvcnMudG9BcnJheShuZXcgSVN0YXR1c1tlcnJvcnMuc2l6ZSgpXSk7Ci0JCQkJc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFNTRUNvcmVQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIHN0YXRpaSwgU1NFQ29yZU1lc3NhZ2VzLlRhc2tTY2FubmluZ0pvYl8xLCBudWxsKTsKLQkJCX0KLQkJfQotCi0JCVNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhbnVwUmVtZW1iZXJlZFByb2plY3RMaXN0KFN0cmluZyBwcmVmZXJlbmNlTmFtZSkgewotCQlTdHJpbmdbXSByZW1lbWJlcmVkUHJvamVjdE5hbWVzID0gU3RyaW5nVXRpbHMudW5wYWNrKFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKHByZWZlcmVuY2VOYW1lKSk7Ci0JCUlSZXNvdXJjZVtdIHdvcmtzcGFjZVByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlTdHJpbmdbXSBwcm9qZWN0TmFtZXMgPSBuZXcgU3RyaW5nW3dvcmtzcGFjZVByb2plY3RzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9qZWN0TmFtZXNbaV0gPSB3b3Jrc3BhY2VQcm9qZWN0c1tpXS5nZXROYW1lKCk7Ci0JCX0KLQotCQlMaXN0IHByb2plY3ROYW1lc1RvUmVtZW1iZXIgPSBuZXcgQXJyYXlMaXN0KHJlbWVtYmVyZWRQcm9qZWN0TmFtZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZW1lbWJlcmVkUHJvamVjdE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIHJlbWVtYmVyZWRQcm9qZWN0RXhpc3RzID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgIXJlbWVtYmVyZWRQcm9qZWN0RXhpc3RzICYmIGogPCBwcm9qZWN0TmFtZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAocmVtZW1iZXJlZFByb2plY3ROYW1lc1tpXS5lcXVhbHMocHJvamVjdE5hbWVzW2pdKSkgewotCQkJCQlyZW1lbWJlcmVkUHJvamVjdEV4aXN0cyA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlbWVtYmVyZWRQcm9qZWN0RXhpc3RzKSB7Ci0JCQkJcHJvamVjdE5hbWVzVG9SZW1lbWJlci5hZGQocmVtZW1iZXJlZFByb2plY3ROYW1lc1tpXSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChMb2dnZXIuREVCVUdfVEFTS1NKT0IpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlbW92aW5nICIgKyByZW1lbWJlcmVkUHJvamVjdE5hbWVzW2ldICsgIiByZW1vdmVkIGZyb20gIiArIHByZWZlcmVuY2VOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQotCQlpZiAocHJvamVjdE5hbWVzVG9SZW1lbWJlci5zaXplKCkgIT0gcmVtZW1iZXJlZFByb2plY3ROYW1lcy5sZW5ndGgpIHsKLQkJCVNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUocHJlZmVyZW5jZU5hbWUsIFN0cmluZ1V0aWxzLnBhY2soKFN0cmluZ1tdKSBwcm9qZWN0TmFtZXNUb1JlbWVtYmVyLnRvQXJyYXkobmV3IFN0cmluZ1twcm9qZWN0TmFtZXNUb1JlbWVtYmVyLnNpemUoKV0pKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1Rhc2tTY2FubmluZ1NjaGVkdWxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9UYXNrU2Nhbm5pbmdTY2hlZHVsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA5NWE2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1Rhc2tTY2FubmluZ1NjaGVkdWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBUYXNrU2Nhbm5pbmdTY2hlZHVsZXIgewotCWNsYXNzIExpc3RlbmVyVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQlpbnQgcmVzb3VyY2VUeXBlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlc291cmNlVHlwZSA9PSBJUmVzb3VyY2UuUFJPSkVDVCB8fCByZXNvdXJjZVR5cGUgPT0gSVJlc291cmNlLlJPT1QpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWRlbHRhLmFjY2VwdCh0aGlzKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gaGFuZGxpbmcgcmVzb3VyY2UgY2hhbmdlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlpZiAoKGRlbHRhLmdldEtpbmQoKSAmIElSZXNvdXJjZURlbHRhLk1BUktFUlMpID4gMCB8fCAoZGVsdGEuZ2V0S2luZCgpICYgSVJlc291cmNlRGVsdGEuRU5DT0RJTkcpID4gMCB8fCAoZGVsdGEuZ2V0S2luZCgpICYgSVJlc291cmNlRGVsdGEuTk9fQ0hBTkdFKSA+IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5ST09UKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJZkpvYi5hZGRQcm9qZWN0RGVsdGEoZGVsdGEpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUYXNrU2Nhbm5pbmdTY2hlZHVsZXIgc2NoZWR1bGVyOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCVNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoVGFza1NjYW5uaW5nSm9iLlRBU0tfVEFHX1BST0pFQ1RTX0FMUkVBRFlfU0NBTk5FRCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXNjaGVkdWxlci5lbnF1ZXVlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJU3RyaW5nW10gcHJvamVjdE5hbWVzID0gU3RyaW5nVXRpbHMudW5wYWNrKFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFRhc2tTY2FubmluZ0pvYi5UQVNLX1RBR19QUk9KRUNUU19BTFJFQURZX1NDQU5ORUQpKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGZyZXNoUHJvamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIXByb2plY3ROYW1lc1tpXS5lcXVhbHMocHJvamVjdC5nZXROYW1lKCkpKSB7Ci0JCQkJZnJlc2hQcm9qZWN0TGlzdC5hZGQocHJvamVjdE5hbWVzW2ldKTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgZnJlc2hQcm9qZWN0cyA9IFN0cmluZ1V0aWxzLnBhY2soKFN0cmluZ1tdKSBmcmVzaFByb2plY3RMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tmcmVzaFByb2plY3RMaXN0LnNpemUoKV0pKTsKLQkJU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShUYXNrU2Nhbm5pbmdKb2IuVEFTS19UQUdfUFJPSkVDVFNfQUxSRUFEWV9TQ0FOTkVELCBmcmVzaFByb2plY3RzKTsgLy8kTk9OLU5MUy0xJAotCi0JCXNjaGVkdWxlci5lbnF1ZXVlKHByb2plY3QpOwotCX0KLQotCi0JLyoqCi0JICogT25seSBmb3IgdXNlIGJ5IFNTRUNvcmVQbHVnaW4gY2xhc3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWlmIChzY2hlZHVsZXIgIT0gbnVsbCkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoc2NoZWR1bGVyLnZpc2l0b3IpOwotCQkJc2NoZWR1bGVyLmZKb2IuY2FuY2VsKCk7Ci0JCQl0cnkgewotCQkJCXNjaGVkdWxlci5mSm9iLmpvaW4oKTsKLQkJCX0KLQkJCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE9ubHkgZm9yIHVzZSBieSBTU0VVSVBsdWdpbiBjbGFzcywgVUkgYnkgbmF0dXJlIG9mIGl0cyBvdXRwdXQgYmVpbmcgbWVhbnQgZm9yIHRoZSB1c2VyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0JCXNjaGVkdWxlciA9IG5ldyBUYXNrU2Nhbm5pbmdTY2hlZHVsZXIoKTsKLQotCQkvKgotCQkgKiBBY2NvcmRpbmcgdG8KLQkJICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlL2RldmVsb3BtZW50L3BlcmZvcm1hbmNlL2Jsb29wZXJzLmh0bWwsCi0JCSAqIFBPU1RfQ0hBTkdFIGxpc3RlbmVycyBhZGQgYSB0cml2aWFsIHBlcmZvcm1hbmNlIGNvc3QuCi0JCSAqIAotCQkgKiBBbHdheXMgYWRkIGxpc3RlbmVyIHNpbmNlIHdlIG1pZ2h0IGJlIGVuYWJsZWQgcGVyLXByb2plY3QgZXZlbiBpZiBkaXNhYmxlZCB3b3Jrc3BhY2Utd2lkZS4KLQkJICovCi0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHNjaGVkdWxlci52aXNpdG9yLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0KLQkJc2NoZWR1bGVyLmVucXVldWUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JfQotCi0JVGFza1NjYW5uaW5nSm9iIGZKb2IgPSBudWxsOwotCi0JTGlzdGVuZXJWaXNpdG9yIHZpc2l0b3IgPSBudWxsOwotCi0JcHJpdmF0ZSBUYXNrU2Nhbm5pbmdTY2hlZHVsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZKb2IgPSBuZXcgVGFza1NjYW5uaW5nSm9iKCk7Ci0JCXZpc2l0b3IgPSBuZXcgTGlzdGVuZXJWaXNpdG9yKCk7Ci0JfQotCi0Jdm9pZCBlbnF1ZXVlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJZkpvYi5hZGRQcm9qZWN0KHByb2plY3QpOwotCX0KLQotCXZvaWQgZW5xdWV1ZShJV29ya3NwYWNlUm9vdCByb290KSB7Ci0JCUlQcm9qZWN0W10gYWxsUHJvamVjdHMgPSByb290LmdldFByb2plY3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWZKb2IuYWRkUHJvamVjdChhbGxQcm9qZWN0c1tpXSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1Rhc2tUYWdQcmVmZXJlbmNlS2V5cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9UYXNrVGFnUHJlZmVyZW5jZUtleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzZTMwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1Rhc2tUYWdQcmVmZXJlbmNlS2V5cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBUYXNrVGFnUHJlZmVyZW5jZUtleXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfVEFHX0NPTlRFTlRUWVBFU19JR05PUkVEID0gImlnbm9yZWQtY29udGVudFR5cGVzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfVEFHX0VOQUJMRSA9ICJlbmFibGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfVEFHX05PREUgPSBTU0VDb3JlUGx1Z2luLklEICsgSVBhdGguU0VQQVJBVE9SICsgInRhc2stdGFncyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1RBR19QRVJfUFJPSkVDVCA9ICJ1c2UtcHJvamVjdC1zZXR0aW5ncyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1RBR19QUklPUklUSUVTID0gInRhc2tQcmlvcml0aWVzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfVEFHX1RBR1MgPSAidGFza1RhZ3MiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1dvcmtzcGFjZVRhc2tTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1dvcmtzcGFjZVRhc2tTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmM2ZmYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9Xb3Jrc3BhY2VUYXNrU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKEludGFsaW8pIC0gYnVnIDMwMDQ0MyAtIHNvbWUgY29uc3RhbnRzIGFyZW4ndCBzdGF0aWMgZmluYWwKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzLklGaWxlVGFza1NjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzLlRhc2tUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi0vKioKLSAqIERpc3BhdGNoZXIgZm9yIHNjYW5uaW5nIGJhc2VkIG9uIGRlbHRhcyBhbmQgcmVxdWVzdGVkIHByb2plY3RzCi0gKi8KLWNsYXNzIFdvcmtzcGFjZVRhc2tTY2FubmVyIHsKLQlwcml2YXRlIHN0YXRpYyBXb3Jrc3BhY2VUYXNrU2Nhbm5lciBfaW5zdGFuY2UgPSBudWxsOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOVEhFVElDX1RBU0sgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS50YXNrLXN5bnRoZXRpYyI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBNT0RJRklDQVRJT05fU1RBTVAgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5tb2RpZmljYXRpb24tc3RhbXAiOwotCXByaXZhdGUgYm9vbGVhbiBwcm9jZWVkID0gZmFsc2U7Ci0KLQlzdGF0aWMgc3luY2hyb25pemVkIFdvcmtzcGFjZVRhc2tTY2FubmVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoX2luc3RhbmNlID09IG51bGwpIHsKLQkJCV9pbnN0YW5jZSA9IG5ldyBXb3Jrc3BhY2VUYXNrU2Nhbm5lcigpOwotCQl9Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX01BUktFUl9UWVBFID0gSUZpbGVUYXNrU2Nhbm5lci5UQVNLX01BUktFUl9JRDsKLQlwcml2YXRlIExpc3QgZkFjdGl2ZVNjYW5uZXJzID0gbnVsbDsKLQlwcml2YXRlIElDb250ZW50VHlwZVtdIGZDdXJyZW50SWdub3JlQ29udGVudFR5cGVzID0gbnVsbDsKLQlwcml2YXRlIFRhc2tUYWdbXSBmQ3VycmVudFRhc2tUYWdzID0gbnVsbDsKLQotCXByaXZhdGUgRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIgcmVnaXN0cnkgPSBudWxsOwotCi0JcHJpdmF0ZSBsb25nIHRpbWUwOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBXb3Jrc3BhY2VUYXNrU2Nhbm5lcigpIHsKLQkJc3VwZXIoKTsKLQkJcmVnaXN0cnkgPSBGaWxlVGFza1NjYW5uZXJSZWdpc3RyeVJlYWRlci5nZXRJbnN0YW5jZSgpOwotCQlmQWN0aXZlU2Nhbm5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZDdXJyZW50VGFza1RhZ3MgPSBuZXcgVGFza1RhZ1swXTsKLQkJZkN1cnJlbnRJZ25vcmVDb250ZW50VHlwZXMgPSBuZXcgSUNvbnRlbnRUeXBlWzBdOwotCX0KLQotCXByaXZhdGUgSUNvbnRlbnRUeXBlW10gZGV0ZWN0Q29udGVudFR5cGVzKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCXR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihyZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJaWYgKHR5cGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQkvLyBvcHRpbWl6ZWQgZGVzY3JpcHRpb24gbG9va3VwLCBtaWdodCBub3Qgc3VjY2VlZAotCQkJCQlkID0gKChJRmlsZSkgcmVzb3VyY2UpLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQkJCQl0eXBlcyA9IG5ldyBJQ29udGVudFR5cGVbXXtkLmdldENvbnRlbnRUeXBlKCl9OwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLyoKLQkJCQkJICogc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSBnaXZlbiB0aGUgYWNjZXNzaWJsZSBhbmQgZmlsZQotCQkJCQkgKiB0eXBlIGNoZWNrIGFib3ZlCi0JCQkJCSAqLwotCQkJCX0KLQkJCX0KLQkJCWlmICh0eXBlcyA9PSBudWxsKSB7Ci0JCQkJdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKHJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTQ09OVEVOVFRZUEUpIHsKLQkJCQlpZiAodHlwZXMubGVuZ3RoID4gMCkgewotCQkJCQlpZiAodHlwZXMubGVuZ3RoID4gMSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHJlc291cmNlLmdldEZ1bGxQYXRoKCkgKyAiOiAiICsgIm11bHRpcGxlIGJhc2VkIG9uIG5hbWUgKHByb2JhYmx5IGhpZXJhcmNoaWNhbCkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHJlc291cmNlLmdldEZ1bGxQYXRoKCkgKyAiIG1hdGNoZWQ6ICIgKyB0eXBlc1tpXS5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0eXBlczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0KElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpbml0KElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdChyZXNvdXJjZSk7Ci0KLQkJSVByZWZlcmVuY2VzU2VydmljZSBwcmVmZXJlbmNlc1NlcnZpY2UgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKTsKLQkJSVNjb3BlQ29udGV4dFtdIGxvb2t1cE9yZGVyID0gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpLCBuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCi0JCWJvb2xlYW4gcHJvY2VlZCA9IHByZWZlcmVuY2VzU2VydmljZS5nZXRCb29sZWFuKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFLCBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfRU5BQkxFLCBmYWxzZSwgbG9va3VwT3JkZXIpOwotCi0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1NQUkVGUykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzY2FuIG9mICIgKyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpICsgIjoiICsgcHJvY2VlZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJaWYgKHByb2NlZWQpIHsKLQkJCVN0cmluZ1tdIHRhZ3MgPSBTdHJpbmdVdGlscy51bnBhY2socHJlZmVyZW5jZXNTZXJ2aWNlLmdldFN0cmluZyhUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSwgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1RBR1MsIG51bGwsIGxvb2t1cE9yZGVyKSk7Ci0JCQlTdHJpbmdbXSBwcmlvcml0aWVzID0gU3RyaW5nVXRpbHMudW5wYWNrKHByZWZlcmVuY2VzU2VydmljZS5nZXRTdHJpbmcoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUsIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QUklPUklUSUVTLCBudWxsLCBsb29rdXBPcmRlcikpOwotCQkJU3RyaW5nW10gY3VycmVudElnbm9yZUNvbnRlbnRUeXBlSURzID0gU3RyaW5nVXRpbHMudW5wYWNrKHByZWZlcmVuY2VzU2VydmljZS5nZXRTdHJpbmcoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUsIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCwgbnVsbCwgbG9va3VwT3JkZXIpKTsKLQkJCWlmIChMb2dnZXIuREVCVUdfVEFTS1NQUkVGUykgewotCQkJCVN5c3RlbS5vdXQucHJpbnQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHRhZ3M6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpID4gMCkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJU3lzdGVtLm91dC5wcmludCh0YWdzW2ldKTsKLQkJCQl9Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludChnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcHJpb3JpdGllczogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByaW9yaXRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgPiAwKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlTeXN0ZW0ub3V0LnByaW50KHByaW9yaXRpZXNbaV0pOwotCQkJCX0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpZ25vcmVkIGNvbnRlbnQgdHlwZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50SWdub3JlQ29udGVudFR5cGVJRHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgPiAwKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlTeXN0ZW0ub3V0LnByaW50KGN1cnJlbnRJZ25vcmVDb250ZW50VHlwZUlEc1tpXSk7Ci0JCQkJfQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJZkN1cnJlbnRJZ25vcmVDb250ZW50VHlwZXMgPSBuZXcgSUNvbnRlbnRUeXBlW2N1cnJlbnRJZ25vcmVDb250ZW50VHlwZUlEcy5sZW5ndGhdOwotCQkJSUNvbnRlbnRUeXBlTWFuYWdlciBjb250ZW50VHlwZU1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudElnbm9yZUNvbnRlbnRUeXBlSURzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZkN1cnJlbnRJZ25vcmVDb250ZW50VHlwZXNbaV0gPSBjb250ZW50VHlwZU1hbmFnZXIuZ2V0Q29udGVudFR5cGUoY3VycmVudElnbm9yZUNvbnRlbnRUeXBlSURzW2ldKTsKLQkJCX0KLQkJCWludCBtYXggPSBNYXRoLm1pbih0YWdzLmxlbmd0aCwgcHJpb3JpdGllcy5sZW5ndGgpOwotCQkJZkN1cnJlbnRUYXNrVGFncyA9IG5ldyBUYXNrVGFnW21heF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJaW50IHByaW9yaXR5ID0gVGFza1RhZy5QUklPUklUWV9OT1JNQUw7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJpb3JpdHkgPSBJbnRlZ2VyLnBhcnNlSW50KHByaW9yaXRpZXNbaV0pOwotCQkJCX0KLQkJCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gZGVmYXVsdCB0byBub3JtYWwgcHJpb3JpdHkKLQkJCQl9Ci0JCQkJZkN1cnJlbnRUYXNrVGFnc1tpXSA9IG5ldyBUYXNrVGFnKHRhZ3NbaV0sIHByaW9yaXR5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvY2VlZDsKLQl9Ci0KLQl2b2lkIGludGVybmFsU2NhbihmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIElQcm9ncmVzc01vbml0b3Igc2Nhbk1vbml0b3IpIHsKLQkJaWYgKHNjYW5Nb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCVN0cmluZyBuYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotCQkJaWYgKHJlc291cmNlLmlzQWNjZXNzaWJsZSgpICYmICFyZXNvdXJjZS5pc0Rlcml2ZWQoKSAmJiAhcmVzb3VyY2UuaXNQaGFudG9tKCkgJiYgIXJlc291cmNlLmlzVGVhbVByaXZhdGVNZW1iZXIoKSAmJiBuYW1lLmxlbmd0aCgpICE9IDAgJiYgbmFtZS5jaGFyQXQoMCkgIT0gJy4nKSB7Ci0JCQkJaWYgKChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuRk9MREVSKSA+IDAgfHwgKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5QUk9KRUNUKSA+IDApIHsKLQkJCQkJSVJlc291cmNlW10gY2hpbGRyZW4gPSAoKElDb250YWluZXIpIHJlc291cmNlKS5tZW1iZXJzKCk7Ci0JCQkJCXNjYW5Nb25pdG9yLmJlZ2luVGFzaygiIiwgY2hpbGRyZW4ubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpbnRlcm5hbFNjYW4ocHJvamVjdCwgY2hpbGRyZW5baV0sIG5ldyBTdWJQcm9ncmVzc01vbml0b3Ioc2Nhbk1vbml0b3IsIDEsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSykpOwotCQkJCQl9Ci0JCQkJCXNjYW5Nb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GSUxFKSA+IDApIHsKLQkJCQkJc2NhbkZpbGUocHJvamVjdCwgZkN1cnJlbnRUYXNrVGFncywgKElGaWxlKSByZXNvdXJjZSwgc2Nhbk1vbml0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0Jdm9pZCBpbnRlcm5hbFNjYW4oSVJlc291cmNlRGVsdGEgZGVsdGEsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGRlbHRhLmdldEZ1bGxQYXRoKCkubGFzdFNlZ21lbnQoKTsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlpZiAoIXJlc291cmNlLmlzRGVyaXZlZCgpICYmICFyZXNvdXJjZS5pc1BoYW50b20oKSAmJiAhcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpICYmIG5hbWUubGVuZ3RoKCkgIT0gMCAmJiBuYW1lLmNoYXJBdCgwKSAhPSAnLicpIHsKLQkJCQlpZiAoKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GT0xERVIpID4gMCB8fCAocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLlBST0pFQ1QpID4gMCkgewotCQkJCQlJUmVzb3VyY2VEZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgY2hpbGRyZW4ubGVuZ3RoKTsKLQkJCQkJaWYgKG5hbWUubGVuZ3RoKCkgIT0gMCAmJiBuYW1lLmNoYXJBdCgwKSAhPSAnLicgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkgewotCQkJCQkJZm9yIChpbnQgaSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJCQkJaW50ZXJuYWxTY2FuKGNoaWxkcmVuW2ldLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSykpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCQllbHNlIGlmICgocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLkZJTEUpID4gMCkgewotCQkJCQlpZiAoKGRlbHRhLmdldEtpbmQoKSAmIElSZXNvdXJjZURlbHRhLkFEREVEKSA+IDAgfHwgKChkZWx0YS5nZXRLaW5kKCkgJiBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSA+IDAgJiYgKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSA+IDApKSB7Ci0JCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLQkJCQkJCXNjYW5GaWxlKGZpbGUuZ2V0UHJvamVjdCgpLCBmQ3VycmVudFRhc2tUYWdzLCBmaWxlLCBtb25pdG9yKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVwbGFjZVRhc2tNYXJrZXJzKGZpbmFsIElGaWxlIGZpbGUsIGZpbmFsIFN0cmluZ1tdIG1hcmtlclR5cGVzLCBmaW5hbCBNYXAgbWFya2VyQXR0cmlidXRlTWFwc1tdLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmluYWwgSUZpbGUgZmluYWxGaWxlID0gZmlsZTsKLQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHIgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soIiIsIDIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLyoKLQkJCQkJCQkgKiBEZWxldGUgb2xkIFRhc2sgbWFya2VycyAoZG9uJ3QgZGVsZXRlIHJlZ3VsYXIKLQkJCQkJCQkgKiBUYXNrcyBzaW5jZSB0aGF0IGluY2x1ZGVzIHVzZXItZGVmaW5lZCBvbmVzKQotCQkJCQkJCSAqLwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2VyVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJaWYgKElNYXJrZXIuVEFTSy5lcXVhbHMobWFya2VyVHlwZXNbaV0pKSB7Ci0JCQkJCQkJCQkvLyBvbmx5IHJlbW92ZSBpZiBzeW50aGV0aWMKLQkJCQkJCQkJCUlNYXJrZXJbXSBmb3VuZE1hcmtlcnMgPSBmaWxlLmZpbmRNYXJrZXJzKG1hcmtlclR5cGVzW2ldLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZvdW5kTWFya2Vycy5sZW5ndGg7IGorKykgewotCQkJCQkJCQkJCWlmIChmb3VuZE1hcmtlcnNbal0uZ2V0QXR0cmlidXRlKFNZTlRIRVRJQ19UQVNLKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCWZvdW5kTWFya2Vyc1tqXS5kZWxldGUoKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQlmaWxlLmRlbGV0ZU1hcmtlcnMobWFya2VyVHlwZXNbaV0sIHRydWUsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gZGVsZXRpbmcgb2xkIHRhc2tzIiwgZSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCQl9Ci0JCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQlwcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOwotCQkJCQkJfQotCQkJCQkJaWYgKHByb2NlZWQgJiYgbWFya2VyQXR0cmlidXRlTWFwcyAhPSBudWxsICYmIG1hcmtlckF0dHJpYnV0ZU1hcHMubGVuZ3RoID4gMCkgewotCQkJCQkJCWlmIChMb2dnZXIuREVCVUdfVEFTS1MpIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIiICsgbWFya2VyQXR0cmlidXRlTWFwcy5sZW5ndGggKyAiIHRhc2tzIGZvciAiICsgZmlsZS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJfQotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2VyQXR0cmlidXRlTWFwcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlTdHJpbmcgc3BlY2lmaWVkTWFya2VyVHlwZSA9IChTdHJpbmcpIG1hcmtlckF0dHJpYnV0ZU1hcHNbaV0uZ2V0KElNYXJrZXIuVEFTSyk7Ci0JCQkJCQkJCUlNYXJrZXIgbWFya2VyID0gZmluYWxGaWxlLmNyZWF0ZU1hcmtlcihzcGVjaWZpZWRNYXJrZXJUeXBlKTsKLQkJCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZXMobWFya2VyQXR0cmlidXRlTWFwc1tpXSk7Ci0JCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5VU0VSX0VESVRBQkxFLCBCb29sZWFuLkZBTFNFKTsKLQkJCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShNT0RJRklDQVRJT05fU1RBTVAsIExvbmcudG9TdHJpbmcoZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpKSk7Ci0JCQkJCQkJCWlmIChJTWFya2VyLlRBU0suZXF1YWxzKHNwZWNpZmllZE1hcmtlclR5cGUpKSB7Ci0JCQkJCQkJCQkvLyBzZXQgdG8gc3ludGhldGljIGFuZCBtYWtlIHVzZXIgZWRpdGFibGUKLQkJCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoU1lOVEhFVElDX1RBU0ssIHRydWUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCXByb2dyZXNzTW9uaXRvci5kb25lKCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCWZpbmFsRmlsZS5nZXRXb3Jrc3BhY2UoKS5ydW4ociwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkubW9kaWZ5UnVsZShmaWxlKSwgSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsIG1vbml0b3IpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMSk7Ci0JCQl9Ci0JCQljYXRjaChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbm90IGFuIGVycm9yIGNvbmRpdGlvbgotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBzY2FuKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIElQcm9ncmVzc01vbml0b3Igc2Nhbk1vbml0b3IpIHsKLQkJaWYgKHNjYW5Nb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLUykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzY2FubmluZyBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfVEFTS1MpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNraXBwaW5nIGluYWNjZXNzaWJsZSBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1NPVkVSQUxMUEVSRikgewotCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlwcm9jZWVkID0gaW5pdChwcm9qZWN0KTsKLQkJaW50ZXJuYWxTY2FuKHByb2plY3QsIHByb2plY3QsIHNjYW5Nb25pdG9yKTsKLQkJc2h1dGRvd25EZWxlZ2F0ZXMocHJvamVjdCk7Ci0JCQotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTT1ZFUkFMTFBFUkYpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyBmb3IgIiArIHByb2plY3QuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0KLQl2b2lkIHNjYW4oSVJlc291cmNlRGVsdGEgZGVsdGEsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1NPVkVSQUxMUEVSRikgewotCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlpZiAoaW5pdChkZWx0YS5nZXRSZXNvdXJjZSgpKSkgewotCQkJaW50ZXJuYWxTY2FuKGRlbHRhLCBtb25pdG9yKTsKLQkJCXNodXRkb3duRGVsZWdhdGVzKGRlbHRhLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpKTsKLQkJfQotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTT1ZFUkFMTFBFUkYpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyBmb3IgIiArIGRlbHRhLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCXZvaWQgc2NhbkZpbGUoSVByb2plY3QgcHJvamVjdCwgVGFza1RhZ1tdIHRhc2tUYWdzLCBJRmlsZSBmaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCi0JCS8vIDMgInN0YWdlcyIKLQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDgpOy8vJE5PTi1OTFMtMSQKLQkJbW9uaXRvci5zdWJUYXNrKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLnN1YnN0cmluZygxKSk7Ci0KLQkJZmluYWwgTGlzdCBtYXJrZXJBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IGRldGVjdENvbnRlbnRUeXBlcyhmaWxlKTsKLQkJU2V0IG1hcmtlclR5cGVzID0gbmV3IEhhc2hTZXQoMyk7Ci0JCS8vIEFsd2F5cyBpbmNsdWRlZCBmb3Igc2FmZXR5IGFuZCBtaWdyYXRpb24KLQkJbWFya2VyVHlwZXMuYWRkKERFRkFVTFRfTUFSS0VSX1RZUEUpOwotCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQlJRmlsZVRhc2tTY2FubmVyW10gZmlsZVNjYW5uZXJzID0gbnVsbDsKLQkJSUZpbGVUYXNrU2Nhbm5lcltdIGlnbm9yZWRGaWxlU2Nhbm5lcnMgPSBudWxsOwotCQlpZiAodHlwZXMgIT0gbnVsbCkgewotCQkJaWYgKGZDdXJyZW50SWdub3JlQ29udGVudFR5cGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJZmlsZVNjYW5uZXJzID0gcmVnaXN0cnkuZ2V0RmlsZVRhc2tTY2FubmVycyh0eXBlcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlMaXN0IHZhbGlkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJLy8gb2J0YWluIGEgZmlsdGVyZWQgbGlzdCBvZiBkZWxlZ2F0ZXMKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWJvb2xlYW4gaWdub3JlQ29udGVudFR5cGUgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmQ3VycmVudElnbm9yZUNvbnRlbnRUeXBlcy5sZW5ndGg7IGorKykgewotCQkJCQkJaWdub3JlQ29udGVudFR5cGUgPSBpZ25vcmVDb250ZW50VHlwZSB8fCB0eXBlc1tpXS5pc0tpbmRPZihmQ3VycmVudElnbm9yZUNvbnRlbnRUeXBlc1tqXSk7Ci0JCQkJCX0KLQkJCQkJaWYgKCFpZ25vcmVDb250ZW50VHlwZSkgewotCQkJCQkJdmFsaWRUeXBlcy5hZGQodHlwZXNbaV0pOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWdub3JlZEZpbGVTY2FubmVycyA9IHJlZ2lzdHJ5LmdldEZpbGVUYXNrU2Nhbm5lcnMobmV3IElDb250ZW50VHlwZVtdIHt0eXBlc1tpXX0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbGVTY2FubmVycyA9IHJlZ2lzdHJ5LmdldEZpbGVUYXNrU2Nhbm5lcnMoKElDb250ZW50VHlwZVtdKSB2YWxpZFR5cGVzLnRvQXJyYXkobmV3IElDb250ZW50VHlwZVt2YWxpZFR5cGVzLnNpemUoKV0pKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJaWYgKGlnbm9yZWRGaWxlU2Nhbm5lcnMgIT0gbnVsbCAmJiBpZ25vcmVkRmlsZVNjYW5uZXJzLmxlbmd0aCA+IDApIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGlnbm9yZWRGaWxlU2Nhbm5lcnMubGVuZ3RoOyBpKyspCi0JCQkJCW1hcmtlclR5cGVzLmFkZChpZ25vcmVkRmlsZVNjYW5uZXJzW2ldLmdldE1hcmtlclR5cGUoKSk7Ci0JCQl9Ci0KLQkJCWlmIChmaWxlU2Nhbm5lcnMubGVuZ3RoID4gMCkgewotCQkJCUlQcm9ncmVzc01vbml0b3Igc2Nhbm5lck1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDMsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSyk7Ci0JCQkJc2Nhbm5lck1vbml0b3IuYmVnaW5UYXNrKCIiLCBmaWxlU2Nhbm5lcnMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGogPSAwOyBmaWxlU2Nhbm5lcnMgIT0gbnVsbCAmJiBqIDwgZmlsZVNjYW5uZXJzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl0cnkgewotCQkJCQkJaWYgKCFmQWN0aXZlU2Nhbm5lcnMuY29udGFpbnMoZmlsZVNjYW5uZXJzW2pdKSAmJiAhbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCQlmaWxlU2Nhbm5lcnNbal0uc3RhcnR1cChmaWxlLmdldFByb2plY3QoKSk7Ci0JCQkJCQkJZkFjdGl2ZVNjYW5uZXJzLmFkZChmaWxlU2Nhbm5lcnNbal0pOwotCQkJCQkJfQotCQkJCQkJbWFya2VyVHlwZXMuYWRkKGZpbGVTY2FubmVyc1tqXS5nZXRNYXJrZXJUeXBlKCkpOwotCQkJCQkJTWFwW10gdGFza01hcmtlckF0dHJpYnV0ZXMgPSBmaWxlU2Nhbm5lcnNbal0uc2NhbihmaWxlLCB0YXNrVGFncywgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihzY2FubmVyTW9uaXRvciwgMSwgU3ViUHJvZ3Jlc3NNb25pdG9yLlBSRVBFTkRfTUFJTl9MQUJFTF9UT19TVUJUQVNLKSk7Ci0JCQkJCQkvKgotCQkJCQkJICogVE9ETzogcG9vbCB0aGUgbWFya2VyIHJlc3VsdHMgc28gdGhlcmUncyBvbmx5IG9uZQotCQkJCQkJICogb3BlcmF0aW9uIGNyZWF0aW5nIHRoZW0KLQkJCQkJCSAqLwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXNrTWFya2VyQXR0cmlidXRlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWlmICghdGFza01hcmtlckF0dHJpYnV0ZXNbaV0uY29udGFpbnNLZXkoSU1hcmtlci5UQVNLKSkgewotCQkJCQkJCQl0YXNrTWFya2VyQXR0cmlidXRlc1tpXS5wdXQoSU1hcmtlci5UQVNLLCBmaWxlU2Nhbm5lcnNbal0uZ2V0TWFya2VyVHlwZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJdGFza01hcmtlckF0dHJpYnV0ZXNbaV0ucHV0KElNYXJrZXIuU09VUkNFX0lELCBmaWxlU2Nhbm5lcnNbal0uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQkJCQkJCW1hcmtlckF0dHJpYnV0ZXMuYWRkKHRhc2tNYXJrZXJBdHRyaWJ1dGVzW2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXNjYW5uZXJNb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCW1vbml0b3Iud29ya2VkKDQpOwotCQl9Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQkvLyBvbmx5IHVwZGF0ZSBtYXJrZXJzIGlmIHdlIHJhbiBhIHNjYW5uZXIgb24gdGhpcyBmaWxlCi0JCWlmIChmaWxlU2Nhbm5lcnMgIT0gbnVsbCAmJiBmaWxlU2Nhbm5lcnMubGVuZ3RoID4gMCB8fAotCQkJCWlnbm9yZWRGaWxlU2Nhbm5lcnMgIT0gbnVsbCAmJiBpZ25vcmVkRmlsZVNjYW5uZXJzLmxlbmd0aCA+IDApIHsKLQkJCUlQcm9ncmVzc01vbml0b3IgbWFya2VyVXBkYXRlTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMywgU3ViUHJvZ3Jlc3NNb25pdG9yLlBSRVBFTkRfTUFJTl9MQUJFTF9UT19TVUJUQVNLKTsKLQkJCWlmIChtYXJrZXJBdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXBsYWNlVGFza01hcmtlcnMoZmlsZSwgKFN0cmluZ1tdKSBtYXJrZXJUeXBlcy50b0FycmF5KG5ldyBTdHJpbmdbbWFya2VyVHlwZXMuc2l6ZSgpXSksIChNYXBbXSkgbWFya2VyQXR0cmlidXRlcy50b0FycmF5KG5ldyBNYXBbbWFya2VyQXR0cmlidXRlcy5zaXplKCldKSwgbWFya2VyVXBkYXRlTW9uaXRvcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQltb25pdG9yLndvcmtlZCgzKTsKLQkJfQotCQltb25pdG9yLmRvbmUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2h1dGRvd25EZWxlZ2F0ZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlmb3IgKGludCBqID0gMDsgaiA8IGZBY3RpdmVTY2FubmVycy5zaXplKCk7IGorKykgewotCQkJdHJ5IHsKLQkJCQkoKElGaWxlVGFza1NjYW5uZXIpIGZBY3RpdmVTY2FubmVycy5nZXQoaikpLnNodXRkb3duKHByb2plY3QpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihwcm9qZWN0LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgZSk7Ci0JCQl9Ci0JCX0KLQkJZkFjdGl2ZVNjYW5uZXJzID0gbmV3IEFycmF5TGlzdCgxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL1N0cnVjdHVyZWRNb2RlbE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvU3RydWN0dXJlZE1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU4ZDMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvU3RydWN0dXJlZE1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuTW9kZWxNYW5hZ2VySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIENsYXNzIHRvIGFsbG93IGFjY2VzcyB0byBwcm9wZXJseSBjb25maWd1cmVkIGltcGxlbWVudG9ycyBvZiBJTW9kZWxNYW5hZ2VyLgotICogCi0gKiBAc2luY2UgIDEuNSAgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlCi0gKi8KLWZpbmFsIHB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyIHsKLQkvKioKLQkgKiBEbyBub3QgYWxsb3cgaW5zdGFuY2VzIHRvIGJlIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgaW5zdGFuY2Ugb2YgSU1vZGVsTWFuYWdlci4gUmV0dXJucyBudWxsIGlmIG1vZGVsCi0JICogbWFuYWdlciBjYW4gbm90IGJlIGNyZWF0ZWQgb3IgaXMgbm90IHZhbGlkIChzdWNoIGFzLCB3aGVuIHdvcmtiZW5jaCBpcwotCSAqIHNodXR0aW5nIGRvd24pLgotCSAqIAotCSAqIEByZXR1cm4gSU1vZGVsTWFuYWdlciAtIHJldHVybnMgdGhlIG9uZSBtb2RlbCBtYW5hZ2VyIGZvciBzdHJ1Y3R1cmVkCi0JICogICAgICAgICBtb2RlbHMgb3IgbnVsbCBpZiB0aGUgb3duaW5nIGJ1bmRsZSBpcyBuZWl0aGVyIGFjdGl2ZSBub3IKLQkgKiAgICAgICAgIHN0YXJ0aW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0JCWJvb2xlYW4gaXNSZWFkeSA9IGZhbHNlOwotCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCXdoaWxlICghaXNSZWFkeSkgewotCQkJQnVuZGxlIGxvY2FsQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFNTRUNvcmVQbHVnaW4uSUQpOwotCQkJaW50IHN0YXRlID0gbG9jYWxCdW5kbGUuZ2V0U3RhdGUoKTsKLQkJCWlmIChzdGF0ZSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQkJaXNSZWFkeSA9IHRydWU7Ci0JCQkJLy8gZ2V0SW5zdGFuY2UgaXMgYSBzeW5jaHJvbml6ZWQgc3RhdGljIG1ldGhvZC4KLQkJCQltb2RlbE1hbmFnZXIgPSBNb2RlbE1hbmFnZXJJbXBsLmdldEluc3RhbmNlKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzdGF0ZSA9PSBCdW5kbGUuU1RBUlRJTkcpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlLCBqdXN0IGxvb3AgYWdhaW4KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChzdGF0ZSA9PSBCdW5kbGUuU1RPUFBJTkcgfHwgc3RhdGUgPT0gQnVuZGxlLlVOSU5TVEFMTEVEKSB7Ci0JCQkJaXNSZWFkeSA9IHRydWU7Ci0JCQkJbW9kZWxNYW5hZ2VyID0gbnVsbDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5vdCBzdXJlIGFib3V0IG90aGVyIHN0YXRlcywgJ3Jlc29sdmVkJywgJ2luc3RhbGxlZCcKLQkJCQlpc1JlYWR5ID0gdHJ1ZTsKLQkJCQltb2RlbE1hbmFnZXIgPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbE1hbmFnZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9GaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0ZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0OTA3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0ZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChJbnRhbGlvKSAtIGJ1ZyAzMDA0MzQgLSBNYWtlIGlubmVyIGNsYXNzZXMgc3RhdGljIHdoZXJlIHBvc3NpYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuTG9jYXRpb25LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLQotLyoqCi0gKiBOb3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCwgcmVmZXJlbmNlZCBvciBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KLSAqIAotICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgY29vcmRpbmF0aW5nIHRoZSBjcmVhdGlvbiBhbmQgZGlzcG9zYWwgb2YKLSAqIHN0cnVjdHVyZWQgbW9kZWxzIGJ1aWx0IG9uIHN0cnVjdHVyZWQgZG9jdW1lbnRzIGZvdW5kIGluIEZpbGVCdWZmZXJzLiBJdAotICogYWxsb3dzIHRoZSBTU0UgTW9kZWwgTWFuYWdlciB0byBhY3QgYXMgYSBjbGllbnQgdG8gdGhlCi0gKiBUZXh0RmlsZUJ1ZmZlck1hbmFnZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIHsKLQotCXN0YXRpYyBjbGFzcyBEb2N1bWVudEluZm8gewotCQkvKioKLQkJICogVGhlIElUZXh0RmlsZUJ1ZmZlcgotCQkgKi8KLQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIFRoZSBwbGF0Zm9ybSBjb250ZW50LXR5cGUgSUQgb2YgdGhpcyBkb2N1bWVudAotCQkgKi8KLQkJU3RyaW5nIGNvbnRlbnRUeXBlSUQgPSBudWxsOwotCi0JCS8qKgotCQkgKiBUaGUgSVN0cnVjdHVyZU1vZGVsIGNvbnRhaW5pbmcgdGhpcyBkb2N1bWVudDsgbWlnaHQgYmUgbnVsbCBhdAotCQkgKiBwb2ludHMgaW4gdGhlIElUZXh0RmlsZUJ1ZmZlcidzIGxpZmVjeWNsZQotCQkgKi8KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIFdoZXRoZXIgRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciBjYWxsZWQgY29ubmVjdCgpIGZvciB0aGlzCi0JCSAqIERvY3VtZW50SW5mbydzIHRleHQgZmlsZWJ1ZmZlcgotCQkgKi8KLQkJYm9vbGVhbiBzZWxmQ29ubmVjdGVkID0gZmFsc2U7Ci0KLQkJaW50IGJ1ZmZlclJlZmVyZW5jZUNvdW50ID0gMDsKLQkJaW50IG1vZGVsUmVmZXJlbmNlQ291bnQgPSAwOwotCi0JCS8qKgotCQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgImNvbXBhdGliaWxpdHkiIGtpbmQgZnJvbSBiZWZvcmUgdGhlcmUgd2FzCi0JCSAqIGEgTG9jYXRpb25LaW5kIGhpbnQgb2JqZWN0LS10aGlzIGlzIGV4cGVjdGVkIHRvIGJlIG92ZXJyaWRkZW4gYXQKLQkJICogcnVudGltZS4KLQkJICovCi0JCUxvY2F0aW9uS2luZCBsb2NhdGlvbktpbmQgPSBMb2NhdGlvbktpbmQuTk9STUFMSVpFOwotCX0KLQotCS8qKgotCSAqIEEgVVJJUmVzb2x2ZXIgaW5zdGFuY2Ugb2YgbW9kZWxzIGJ1aWx0IG9uIGphdmEuaW8uRmlsZXMKLQkgKi8KLQlzdGF0aWMgY2xhc3MgRXh0ZXJuYWxVUklSZXNvbHZlciBpbXBsZW1lbnRzIFVSSVJlc29sdmVyIHsKLQkJSVBhdGggZkxvY2F0aW9uOwotCi0JCUV4dGVybmFsVVJJUmVzb2x2ZXIoSVBhdGggbG9jYXRpb24pIHsKLQkJCWZMb2NhdGlvbiA9IGxvY2F0aW9uOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRGaWxlQmFzZUxvY2F0aW9uKCkgewotCQkJaWYgKGZMb2NhdGlvbiA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJZWxzZQotCQkJCXJldHVybiBmTG9jYXRpb24udG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGdldEZpbGVCYXNlTG9jYXRpb24oKSwgZmFsc2UpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGdldEZpbGVCYXNlTG9jYXRpb24oKSwgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSkgewotCQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBiYXNlUmVmZXJlbmNlLCBmYWxzZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2VSZWZlcmVuY2UsIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCQkvLyBpZ25vcmUgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzIHZhbHVlCi0JCQlpZiAodXJpID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAodXJpLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCVVSTCB1cmwgPSBuZXcgVVJMKHVyaSk7Ci0JCQkJCXJldHVybiB1cmwuZ2V0RmlsZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gVVJJSGVscGVyLm5vcm1hbGl6ZSh1cmksIGJhc2VSZWZlcmVuY2UsIFBhdGguUk9PVC50b1N0cmluZygpKTsKLQkJfQotCi0JCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgSUNvbnRhaW5lciBnZXRSb290TG9jYXRpb24oKSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJfQotCi0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRVUklTdHJlYW0oU3RyaW5nIHVyaSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRGaWxlQmFzZUxvY2F0aW9uKFN0cmluZyBuZXdMb2NhdGlvbikgewotCQkJaWYgKG5ld0xvY2F0aW9uICE9IG51bGwpCi0JCQkJZkxvY2F0aW9uID0gbmV3IFBhdGgobmV3TG9jYXRpb24pOwotCQkJZWxzZQotCQkJCWZMb2NhdGlvbiA9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IG5ld1Byb2plY3QpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgVVJJUmVzb2x2ZXIgaW5zdGFuY2Ugb2YgbW9kZWxzIGJ1aWx0IG9uIHRoZSBleHRlbnNpYmxlIFdTVCBVUkkKLQkgKiByZXNvbHZlcgotCSAqLwotCXN0YXRpYyBjbGFzcyBDb21tb25VUklSZXNvbHZlciBpbXBsZW1lbnRzIFVSSVJlc29sdmVyIHsKLQkJU3RyaW5nIGZMb2NhdGlvbjsKLQkJSVBhdGggZlBhdGg7Ci0JCXByaXZhdGUgSVByb2plY3QgZlByb2plY3Q7Ci0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgU0VQQVJBVE9SID0gIi8iOyAvLyROT04tTkxTLTEkIAotCQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZJTEVfUFJFRklYID0gImZpbGU6Ly8iOyAvLyROT04tTkxTLTEkCi0KLQkJQ29tbW9uVVJJUmVzb2x2ZXIoSUZpbGUgd29ya3NwYWNlRmlsZSkgewotCQkJZlBhdGggPSB3b3Jrc3BhY2VGaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCQlmUHJvamVjdCA9IHdvcmtzcGFjZUZpbGUuZ2V0UHJvamVjdCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRGaWxlQmFzZUxvY2F0aW9uKCkgewotCQkJcmV0dXJuIGZMb2NhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGdldEZpbGVCYXNlTG9jYXRpb24oKSwgZmFsc2UpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGdldEZpbGVCYXNlTG9jYXRpb24oKSwgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSkgewotCQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBiYXNlUmVmZXJlbmNlLCBmYWxzZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2VSZWZlcmVuY2UsIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCQlib29sZWFuIGJhc2VIYXNQcmVmaXggPSBiYXNlUmVmZXJlbmNlICE9IG51bGwgJiYgYmFzZVJlZmVyZW5jZS5zdGFydHNXaXRoKEZJTEVfUFJFRklYKTsKLQkJCVN0cmluZyByZWZlcmVuY2UgPSBudWxsOwotCQkJaWYgKGJhc2VIYXNQcmVmaXgpIHsKLQkJCQlyZWZlcmVuY2UgPSBiYXNlUmVmZXJlbmNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVmZXJlbmNlID0gRklMRV9QUkVGSVggKyBiYXNlUmVmZXJlbmNlOwotCQkJfQotCQkJU3RyaW5nIHJlc3VsdCA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShyZWZlcmVuY2UsIG51bGwsIHVyaSk7Ci0JCQkvLyBMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLAotCQkJLy8gIlVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZSgiCi0JCQkvLyArIHJlZmVyZW5jZSArICIsIG51bGwsICIgK3VyaSsiKSA9ICIgKyByZXN1bHQpOwotCQkJaWYgKCFiYXNlSGFzUHJlZml4ICYmIHJlc3VsdC5zdGFydHNXaXRoKEZJTEVfUFJFRklYKSAmJiByZXN1bHQubGVuZ3RoKCkgPiBGSUxFX1BSRUZJWC5sZW5ndGgoKSkgewotCQkJCXJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoRklMRV9QUkVGSVgubGVuZ3RoKCkpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQkJcmV0dXJuIGZQcm9qZWN0OwotCQl9Ci0KLQkJcHVibGljIElDb250YWluZXIgZ2V0Um9vdExvY2F0aW9uKCkgewotCQkJU3RyaW5nIHJvb3QgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoRklMRV9QUkVGSVggKyBnZXRGaWxlQmFzZUxvY2F0aW9uKCksIG51bGwsIFNFUEFSQVRPUik7Ci0JCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihuZXcgUGF0aChyb290KSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKChmaWxlc1tpXS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuRk9MREVSKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0JCQkJCWlmIChmUGF0aC5pc1ByZWZpeE9mKCgoSUZvbGRlcikgZmlsZXNbaV0pLmdldEZ1bGxQYXRoKCkpKSB7Ci0JCQkJCQlyZXR1cm4gKElGb2xkZXIpIGZpbGVzW2ldOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGdldFByb2plY3QoKTsKLQkJfQotCi0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRVUklTdHJlYW0oU3RyaW5nIHVyaSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRGaWxlQmFzZUxvY2F0aW9uKFN0cmluZyBuZXdMb2NhdGlvbikgewotCQkJZkxvY2F0aW9uID0gbmV3TG9jYXRpb247Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IG5ld1Byb2plY3QpIHsKLQkJCWZQcm9qZWN0ID0gbmV3UHJvamVjdDsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hcHMgaW50ZXJlc3RpbmcgZG9jdW1lbnRzIGluIGZpbGUgYnVmZmVycyB0byB0aG9zZSBmaWxlIGJ1ZmZlcnMuCi0JICogUmVxdWlyZWQgdG8gYWxsb3cgdXMgdG8gZ28gZnJvbSB0aGUgZG9jdW1lbnQgaW5zdGFuY2VzIHRvIGNvbXBsZXRlCi0JICogbW9kZWxzLgotCSAqLwotCWNsYXNzIEZpbGVCdWZmZXJNYXBwZXIgaW1wbGVtZW50cyBJRmlsZUJ1ZmZlckxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgYnVmZmVyQ29udGVudEFib3V0VG9CZVJlcGxhY2VkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgYnVmZmVyQ29udGVudFJlcGxhY2VkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgYnVmZmVyQ3JlYXRlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJCWlmIChidWZmZXIgaW5zdGFuY2VvZiBJVGV4dEZpbGVCdWZmZXIpIHsKLQkJCQlJVGV4dEZpbGVCdWZmZXIgdGV4dEJ1ZmZlciA9IChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcjsKLQkJCQlpZiAoISh0ZXh0QnVmZmVyLmdldERvY3VtZW50KCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSkKLQkJCQkJcmV0dXJuOwotCi0JCQkJaWYgKExvZ2dlci5ERUJVR19URVhUQlVGRkVSTElGRUNZQ0xFKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJMZWFybmVkIG5ldyBidWZmZXI6ICIgKyBidWZmZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpICsgIiAiICsgYnVmZmVyICsgIiAiICsgKChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcikuZ2V0RG9jdW1lbnQoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCQkJCURvY3VtZW50SW5mbyBpbmZvID0gbmV3IERvY3VtZW50SW5mbygpOwotCQkJCWluZm8uYnVmZmVyID0gdGV4dEJ1ZmZlcjsKLQkJCQlpbmZvLmNvbnRlbnRUeXBlSUQgPSBkZXRlY3RDb250ZW50VHlwZShidWZmZXIuZ2V0TG9jYXRpb24oKSkuZ2V0SWQoKTsKLQkJCQlpbmZvLmJ1ZmZlclJlZmVyZW5jZUNvdW50Kys7Ci0JCQkJZkRvY3VtZW50TWFwLnB1dCh0ZXh0QnVmZmVyLmdldERvY3VtZW50KCksIGluZm8pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYnVmZmVyRGlzcG9zZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCQlpZiAoYnVmZmVyIGluc3RhbmNlb2YgSVRleHRGaWxlQnVmZmVyKSB7Ci0JCQkJSVRleHRGaWxlQnVmZmVyIHRleHRCdWZmZXIgPSAoSVRleHRGaWxlQnVmZmVyKSBidWZmZXI7Ci0JCQkJaWYgKCEodGV4dEJ1ZmZlci5nZXREb2N1bWVudCgpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoTG9nZ2VyLkRFQlVHX1RFWFRCVUZGRVJMSUZFQ1lDTEUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkRpc2NhcmRlZCBidWZmZXI6ICIgKyBidWZmZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpICsgIiAiICsgYnVmZmVyICsgIiAiICsgKChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcikuZ2V0RG9jdW1lbnQoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCQkJCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldCh0ZXh0QnVmZmVyLmdldERvY3VtZW50KCkpOwotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJaW5mby5idWZmZXJSZWZlcmVuY2VDb3VudC0tOwotCQkJCQljaGVja1JlZmVyZW5jZUNvdW50cyhpbmZvLCB0ZXh0QnVmZmVyLmdldERvY3VtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpcnR5U3RhdGVDaGFuZ2VkKElGaWxlQnVmZmVyIGJ1ZmZlciwgYm9vbGVhbiBpc0RpcnR5KSB7Ci0JCQlpZiAoYnVmZmVyIGluc3RhbmNlb2YgSVRleHRGaWxlQnVmZmVyKSB7Ci0JCQkJaWYgKExvZ2dlci5ERUJVR19URVhUQlVGRkVSTElGRUNZQ0xFKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJCdWZmZXIgZGlydHkgc3RhdGUgY2hhbmdlZDogKCIgKyBpc0RpcnR5ICsgIikgIiArIGJ1ZmZlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyAiICIgKyBidWZmZXIgKyAiICIgKyAoKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyKS5nZXREb2N1bWVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCX0KLQkJCQlJVGV4dEZpbGVCdWZmZXIgdGV4dEJ1ZmZlciA9IChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcjsKLQkJCQlpZiAoISh0ZXh0QnVmZmVyLmdldERvY3VtZW50KCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSkKLQkJCQkJcmV0dXJuOwotCQkJCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldCh0ZXh0QnVmZmVyLmdldERvY3VtZW50KCkpOwotCQkJCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5tb2RlbCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBtc2cgPSAiVXBkYXRpbmcgbW9kZWwgZGlydHkgc3RhdGUgZm9yIiArIGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKExvZ2dlci5ERUJVR19GSUxFQlVGRkVSTU9ERUxNQU5BR0VNRU5UIHx8IExvZ2dlci5ERUJVR19URVhUQlVGRkVSTElGRUNZQ0xFKSB7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBtc2cpOwotCQkJCQl9Ci0JCQkJCWluZm8ubW9kZWwuc2V0RGlydHlTdGF0ZShpc0RpcnR5KTsKLQotCQkJCQlJRmlsZSB3b3Jrc3BhY2VGaWxlID0gRmlsZUJ1ZmZlcnMuZ2V0V29ya3NwYWNlRmlsZUF0TG9jYXRpb24oaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCWlmICghaXNEaXJ0eSAmJiB3b3Jrc3BhY2VGaWxlICE9IG51bGwpIHsKLQkJCQkJCWluZm8ubW9kZWwucmVzZXRTeW5jaHJvbml6YXRpb25TdGFtcCh3b3Jrc3BhY2VGaWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlRmFpbGVkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2luZyhJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXRlVmFsaWRhdGlvbkNoYW5nZWQoSUZpbGVCdWZmZXIgYnVmZmVyLCBib29sZWFuIGlzU3RhdGVWYWxpZGF0ZWQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVuZGVybHlpbmdGaWxlRGVsZXRlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJCWlmIChidWZmZXIgaW5zdGFuY2VvZiBJVGV4dEZpbGVCdWZmZXIpIHsKLQkJCQlpZiAoTG9nZ2VyLkRFQlVHX1RFWFRCVUZGRVJMSUZFQ1lDTEUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkRlbGV0ZWQgYnVmZmVyOiAiICsgYnVmZmVyLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpICsgIiAiICsgYnVmZmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgdW5kZXJseWluZ0ZpbGVNb3ZlZChJRmlsZUJ1ZmZlciBidWZmZXIsIElQYXRoIHBhdGgpIHsKLQkJCWlmIChidWZmZXIgaW5zdGFuY2VvZiBJVGV4dEZpbGVCdWZmZXIpIHsKLQkJCQlpZiAoTG9nZ2VyLkRFQlVHX1RFWFRCVUZGRVJMSUZFQ1lDTEUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIk1vdmVkIGJ1ZmZlciBmcm9tOiAiICsgYnVmZmVyLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpICsgIiAiICsgYnVmZmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJNb3ZlZCBidWZmZXIgdG86ICIgKyBwYXRoLnRvT1NTdHJpbmcoKSArICIgIiArIGJ1ZmZlcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgaW5zdGFuY2UgPSBuZXcgRmlsZUJ1ZmZlck1vZGVsTWFuYWdlcigpOwotCi0JcHVibGljIHN0YXRpYyBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0Jc3RhdGljIHN5bmNocm9uaXplZCBmaW5hbCB2b2lkIHNodXRkb3duKCkgewotCQlGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5yZW1vdmVGaWxlQnVmZmVyTGlzdGVuZXIoaW5zdGFuY2UuZkZpbGVCdWZmZXJMaXN0ZW5lcik7Ci0KLQkJaWYgKExvZ2dlci5ERUJVR19GSUxFQlVGRkVSTU9ERUxNQU5BR0VNRU5UIHx8IExvZ2dlci5ERUJVR19GSUxFQlVGRkVSTU9ERUxMRUFLUykgewotCQkJSURvY3VtZW50W10gZGFuZ2xpbmdEb2N1bWVudHMgPSAoSURvY3VtZW50W10pIGluc3RhbmNlLmZEb2N1bWVudE1hcC5rZXlTZXQoKS50b0FycmF5KG5ldyBJRG9jdW1lbnRbMF0pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYW5nbGluZ0RvY3VtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgaW5zdGFuY2UuZkRvY3VtZW50TWFwLmdldChkYW5nbGluZ0RvY3VtZW50c1tpXSk7Ci0JCQkJaWYgKGluZm8ubW9kZWxSZWZlcmVuY2VDb3VudCA+IDApCi0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTEVBS0VEIE1PREVMOiAiICsgaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKSArICIgIiArIChpbmZvLm1vZGVsICE9IG51bGwgPyBpbmZvLm1vZGVsLmdldElkKCkgOiBudWxsKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWlmIChpbmZvLmJ1ZmZlclJlZmVyZW5jZUNvdW50ID4gMCkKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJMRUFLRUQgQlVGRkVSOiAiICsgaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKSArICIgIiArIGluZm8uYnVmZmVyLmdldERvY3VtZW50KCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCX0KLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgZmluYWwgdm9pZCBzdGFydHVwKCkgewotCQlGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5hZGRGaWxlQnVmZmVyTGlzdGVuZXIoZ2V0SW5zdGFuY2UoKS5mRmlsZUJ1ZmZlckxpc3RlbmVyKTsKLQl9Ci0KLQkvLyBhIG1hcCBvZiBJU3RydWN0dXJlZERvY3VtZW50cyB0byBEb2N1bWVudEluZm8gb2JqZWN0cwotCU1hcCBmRG9jdW1lbnRNYXAgPSBudWxsOwotCi0JRmlsZUJ1ZmZlck1hcHBlciBmRmlsZUJ1ZmZlckxpc3RlbmVyID0gbmV3IEZpbGVCdWZmZXJNYXBwZXIoKTsKLQotCUZpbGVCdWZmZXJNb2RlbE1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZEb2N1bWVudE1hcCA9IG5ldyBIYXNodGFibGUoNCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBjYWxjdWxhdGVJZChJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCUV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IGNhbGN1bGF0ZSBhIG1vZGVsIElEIHdpdGhvdXQgYW4gSUZpbGUiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIGlkID0gbnVsbDsKLQkJSVBhdGggcGF0aCA9IGZpbGUuZ2V0RnVsbFBhdGgoKTsKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJLyoKLQkJCSAqIFRoZSBJRCBvZiBtb2RlbHMgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbm9ybWFsaXplZCBwYXRocwotCQkJICogc3RvcmVkIGluIHRoZSB1bmRlcmx5aW5nIEZpbGVCdWZmZXJzIHRvIHJldHJpZXZlIHRoZW0gYnkgY29tbW9uCi0JCQkgKiBJRCBsYXRlciBvbi4gV2UgY2hvc2UgdGhlIEZpbGVCdWZmZXIgbm9ybWFsaXplZCBwYXRoIG92ZXIgdGhlCi0JCQkgKiBwcmV2aW91c2x5IHVzZWQgYWJzb2x1dGUgSUZpbGUgcGF0aCBiZWNhdXNlIHRoZSBidWZmZXJzIHNob3VsZAotCQkJICogYWxyZWFkeSBleGlzdCBiZWZvcmUgd2UgYnVpbGQgYSBtb2RlbCBhbmQgd2UgY2FuJ3QgcmV0cmlldmUgYQotCQkJICogRmlsZUJ1ZmZlciB1c2luZyB0aGUgSUQgb2YgYSBtb2RlbCB0aGF0IGRvZXNuJ3QgeWV0IGV4aXN0LgotCQkJICovCi0JCQlpZCA9IEZpbGVCdWZmZXJzLm5vcm1hbGl6ZUxvY2F0aW9uKHBhdGgpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGlkOwotCi0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZUlkKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgY2FsY3VsYXRlIGEgbW9kZWwgSUQgd2l0aG91dCBhIGRvY3VtZW50IHJlZmVyZW5jZSIpOyAvLyROT04tTkxTLTEkIAotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihpYWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgaWQgPSBudWxsOwotCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gZ2V0QnVmZmVyKGRvY3VtZW50KTsKLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlpZCA9IGJ1ZmZlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyAiaW50ZXJlc3QiIGluIGEgZG9jdW1lbnQsIG9yIHJhdGhlciB0aGUgZmlsZSBidWZmZXIgdGhhdAotCSAqIGJhY2tzIGl0LiBJbnRlbnRpb25hbGx5IHVzZWQgdG8gYWx0ZXIgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgZmlsZQotCSAqIGJ1ZmZlciBzbyBpdCBpcyBub3QgYWNjaWRlbnRhbGx5IGRpc3Bvc2VkIG9mIHdoaWxlIHdlIGhhdmUgYSBtb2RlbCBvcGVuCi0JICogb24gdG9wIG9mIGl0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBjb25uZWN0KCkgd2l0aG91dCBhIGRvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQgCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGlhZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVRleHRGaWxlQnVmZmVyTWFuYWdlciBidWZmZXJNYW5hZ2VyID0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCk7Ci0JCUlQYXRoIGJ1ZmZlckxvY2F0aW9uID0gaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKTsKLQkJYm9vbGVhbiBpc09LID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCWJ1ZmZlck1hbmFnZXIuY29ubmVjdChidWZmZXJMb2NhdGlvbiwgaW5mby5sb2NhdGlvbktpbmQsIG51bGwpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQlpc09LID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGlzT0s7Ci0JfQotCi0JVVJJUmVzb2x2ZXIgY3JlYXRlVVJJUmVzb2x2ZXIoSVRleHRGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQlJUGF0aCBsb2NhdGlvbiA9IGJ1ZmZlci5nZXRMb2NhdGlvbigpOwotCQlJRmlsZSB3b3Jrc3BhY2VGaWxlID0gRmlsZUJ1ZmZlcnMuZ2V0V29ya3NwYWNlRmlsZUF0TG9jYXRpb24obG9jYXRpb24pOwotCQlVUklSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0JCWlmICh3b3Jrc3BhY2VGaWxlICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2VGaWxlLmdldFByb2plY3QoKTsKLQkJCXJlc29sdmVyID0gKFVSSVJlc29sdmVyKSBwcm9qZWN0LmdldEFkYXB0ZXIoVVJJUmVzb2x2ZXIuY2xhc3MpOwotCQkJaWYgKHJlc29sdmVyID09IG51bGwpIHsKLQkJCQlyZXNvbHZlciA9IG5ldyBDb21tb25VUklSZXNvbHZlcih3b3Jrc3BhY2VGaWxlKTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JCQlpZiAod29ya3NwYWNlRmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQliYXNlTG9jYXRpb24gPSB3b3Jrc3BhY2VGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChiYXNlTG9jYXRpb24gPT0gbnVsbCAmJiB3b3Jrc3BhY2VGaWxlLmdldExvY2F0aW9uVVJJKCkgIT0gbnVsbCkgewotCQkJCWJhc2VMb2NhdGlvbiA9IHdvcmtzcGFjZUZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGJhc2VMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJYmFzZUxvY2F0aW9uID0gd29ya3NwYWNlRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlyZXNvbHZlci5zZXRGaWxlQmFzZUxvY2F0aW9uKGJhc2VMb2NhdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXNvbHZlciA9IG5ldyBFeHRlcm5hbFVSSVJlc29sdmVyKGxvY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzb2x2ZXI7Ci0JfQotCi0KLQlJQ29udGVudFR5cGUgZGV0ZWN0Q29udGVudFR5cGUoSVBhdGggbG9jYXRpb24pIHsKLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBudWxsOwotCi0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGQgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCS8vIE9wdGltaXplZCBkZXNjcmlwdGlvbiBsb29rdXAsIG1pZ2h0IG5vdCBzdWNjZWVkCi0JCQkJCWQgPSAoKElGaWxlKSByZXNvdXJjZSkuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQkJCXR5cGUgPSBkLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBTaG91bGQgbm90IGJlIHBvc3NpYmxlIGdpdmVuIHRoZSBhY2Nlc3NpYmxlIGFuZCBmaWxlCi0JCQkJCS8vIHR5cGUgY2hlY2sgYWJvdmUKLQkJCQl9Ci0JCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCQl0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKHJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJRmlsZSBmaWxlID0gRmlsZUJ1ZmZlcnMuZ2V0U3lzdGVtRmlsZUF0TG9jYXRpb24obG9jYXRpb24pOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQkJCXR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoaW5wdXQsIGxvY2F0aW9uLnRvT1NTdHJpbmcoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJdHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihmaWxlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShJQ29udGVudFR5cGVNYW5hZ2VyLkNUX1RFWFQpOwotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIERlcmVnaXN0ZXJzICJpbnRlcmVzdCIgaW4gYSBkb2N1bWVudCwgb3IgcmF0aGVyIHRoZSBmaWxlIGJ1ZmZlciB0aGF0Ci0JICogYmFja3MgaXQuIEludGVudGlvbmFsbHkgdXNlZCB0byBhbHRlciB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBmaWxlCi0JICogYnVmZmVyIHNvIHRoYXQgaXQga25vd3MgaXQgY2FuIHNhZmVseSBiZSBkaXNwb3NlZCBvZi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgZGlzY29ubmVjdCgpIHdpdGhvdXQgYSBkb2N1bWVudCIpOyAvLyROT04tTkxTLTEkIAotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihpYWUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCWlmKCBpbmZvID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgYnVmZmVyTWFuYWdlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotCQlJUGF0aCBidWZmZXJMb2NhdGlvbiA9IGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCk7Ci0JCWJvb2xlYW4gaXNPSyA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlidWZmZXJNYW5hZ2VyLmRpc2Nvbm5lY3QoYnVmZmVyTG9jYXRpb24sIGluZm8ubG9jYXRpb25LaW5kLCBudWxsKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJaXNPSyA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiBpc09LOwotCX0KLQotCXB1YmxpYyBJVGV4dEZpbGVCdWZmZXIgZ2V0QnVmZmVyKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgZ2V0IGEgYnVmZmVyIHdpdGhvdXQgYSBkb2N1bWVudCByZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkKLQkJCXJldHVybiBpbmZvLmJ1ZmZlcjsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JU3RyaW5nIGdldENvbnRlbnRUeXBlSUQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpCi0JCQlyZXR1cm4gaW5mby5jb250ZW50VHlwZUlEOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsKEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBnZXQvY3JlYXRlIGEgbW9kZWwgd2l0aG91dCBhIGphdmEuaW8uRmlsZSIpOyAvLyROT04tTkxTLTEkIAotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihpYWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJSVRleHRGaWxlQnVmZmVyTWFuYWdlciBidWZmZXJNYW5hZ2VyID0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCk7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBsb2NhdGlvbiA9IG5ldyBQYXRoKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJaWYgKExvZ2dlci5ERUJVR19GSUxFQlVGRkVSTU9ERUxNQU5BR0VNRU5UKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgY29ubmVjdGluZyB0byBGaWxlICIgKyBsb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJ1ZmZlck1hbmFnZXIuY29ubmVjdChsb2NhdGlvbiwgTG9jYXRpb25LaW5kLkxPQ0FUSU9OLCBnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gYnVmZmVyTWFuYWdlci5nZXRUZXh0RmlsZUJ1ZmZlcihsb2NhdGlvbiwgTG9jYXRpb25LaW5kLkxPQ0FUSU9OKTsKLQkJCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChidWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQkvKgotCQkJCQkgKiBOb3RlOiAiaW5mbyIgYmVpbmcgbnVsbCBhdCB0aGlzIHBvaW50IGlzIGEgc2xpZ2h0Ci0JCQkJCSAqIGVycm9yLgotCQkJCQkgKiAKLQkJCQkJICogVGhlIGNvbm5lY3QgY2FsbCBmcm9tIGFib3ZlIChvciBhdCBzb21lIHRpbWUgZWFybGllciBpbgotCQkJCQkgKiB0aGUgc2Vzc2lvbikgd291bGQgaGF2ZSBub3RpZmllZCB0aGUgRmlsZUJ1ZmZlck1hcHBlcgotCQkJCQkgKiBvZiB0aGUgY3JlYXRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcgdGV4dCBidWZmZXIgYW5kCi0JCQkJCSAqIGNyZWF0ZWQgdGhlIERvY3VtZW50SW5mbyBvYmplY3QgZm9yCi0JCQkJCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRzLgotCQkJCQkgKi8KLQkJCQkJaW5mby5sb2NhdGlvbktpbmQgPSBMb2NhdGlvbktpbmQuTE9DQVRJT047Ci0JCQkJCWluZm8uc2VsZkNvbm5lY3RlZCA9IHRydWU7Ci0JCQkJfQotCQkJCS8qCi0JCQkJICogQ2hlY2sgdGhlIGRvY3VtZW50IHR5cGUuIEFsdGhvdWdoIHJldHVybmluZyBudWxsIGZvcgotCQkJCSAqIHVua25vd24gZG9jdW1lbnRzIHdvdWxkIGJlIGZhaXIsIHRyeSB0byBnZXQgYSBtb2RlbCBpZgotCQkJCSAqIHRoZSBkb2N1bWVudCBpcyBhdCBsZWFzdCBhIHZhbGlkIHR5cGUuCi0JCQkJICovCi0JCQkJSURvY3VtZW50IGJ1ZmZlckRvY3VtZW50ID0gYnVmZmVyLmdldERvY3VtZW50KCk7Ci0JCQkJaWYgKGJ1ZmZlckRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQltb2RlbCA9IGdldE1vZGVsKChJU3RydWN0dXJlZERvY3VtZW50KSBidWZmZXJEb2N1bWVudCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvKgotCQkJCQkgKiAxOTA3NjggLSBRdWljayBkaWZmIG1hcmtzIGRvIG5vdCBkaXNhcHBlYXIgaW4gdGhlCi0JCQkJCSAqIHZlcnRpY2FsIHJ1bGVyIG9mIEphdmFTY3JpcHQgZWRpdG9yIGFuZAotCQkJCQkgKiAKLQkJCQkJICogMTkzODA1IC0gQ2hhbmdlcyBhcmUgbm90IHRocm93biBhd2F5IHdoZW4gY2xvc2UKLQkJCQkJICogd2l0aCBubyBzYXZlIGZvciBmaWxlcyB3aXRoIG5vIHN0cnVjdHVyZWQgbW9kZWwKLQkJCQkJICogYXNzb2NpYXRlZCB3aXRoIHRoZW0gKHRleHQgZmlsZXMsIGphdmFzY3JpcHQgZmlsZXMsCi0JCQkJCSAqIGV0YykgaW4gd2ViIHByb2plY3QKLQkJCQkJICovCi0JCQkJCWJ1ZmZlck1hbmFnZXIuZGlzY29ubmVjdChsb2NhdGlvbiwgTG9jYXRpb25LaW5kLklGSUxFLCBnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkVycm9yIGdldHRpbmcgbW9kZWwgZm9yICIgKyBmaWxlLmdldFBhdGgoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBnZXQvY3JlYXRlIGEgbW9kZWwgd2l0aG91dCBhbiBJRmlsZSIpOyAvLyROT04tTkxTLTEkIAotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihpYWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJSVRleHRGaWxlQnVmZmVyTWFuYWdlciBidWZmZXJNYW5hZ2VyID0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX0ZJTEVCVUZGRVJNT0RFTE1BTkFHRU1FTlQpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciBjb25uZWN0aW5nIHRvIElGaWxlICIgKyBmaWxlLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkvLyBzZWUgVGV4dEZpbGVEb2N1bWVudFByb3ZpZGVyI2NyZWF0ZUZpbGVJbmZvIGFib3V0IHdoeSB3ZSB1c2UKLQkJCS8vIElGaWxlI2dldEZ1bGxQYXRoCi0JCQkvLyBoZXJlLCBub3QgSUZpbGUjZ2V0TG9jYXRpb24uCi0JCQlJUGF0aCBsb2NhdGlvbiA9IGZpbGUuZ2V0RnVsbFBhdGgoKTsKLQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJYnVmZmVyTWFuYWdlci5jb25uZWN0KGxvY2F0aW9uLCBMb2NhdGlvbktpbmQuSUZJTEUsIGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gYnVmZmVyTWFuYWdlci5nZXRUZXh0RmlsZUJ1ZmZlcihsb2NhdGlvbiwgTG9jYXRpb25LaW5kLklGSUxFKTsKLQkJCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGJ1ZmZlci5nZXREb2N1bWVudCgpKTsKLQkJCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQkJLyoKLQkJCQkJCSAqIE5vdGU6ICJpbmZvIiBiZWluZyBudWxsIGF0IHRoaXMgcG9pbnQgaXMgYSBzbGlnaHQKLQkJCQkJCSAqIGVycm9yLgotCQkJCQkJICogCi0JCQkJCQkgKiBUaGUgY29ubmVjdCBjYWxsIGZyb20gYWJvdmUgKG9yIGF0IHNvbWUgdGltZQotCQkJCQkJICogZWFybGllciBpbiB0aGUgc2Vzc2lvbikgd291bGQgaGF2ZSBub3RpZmllZCB0aGUKLQkJCQkJCSAqIEZpbGVCdWZmZXJNYXBwZXIgb2YgdGhlIGNyZWF0aW9uIG9mIHRoZQotCQkJCQkJICogY29ycmVzcG9uZGluZyB0ZXh0IGJ1ZmZlciBhbmQgY3JlYXRlZCB0aGUKLQkJCQkJCSAqIERvY3VtZW50SW5mbyBvYmplY3QgZm9yIElTdHJ1Y3R1cmVkRG9jdW1lbnRzLgotCQkJCQkJICovCi0JCQkJCQlpbmZvLnNlbGZDb25uZWN0ZWQgPSB0cnVlOwotCQkJCQkJaW5mby5sb2NhdGlvbktpbmQgPSBMb2NhdGlvbktpbmQuSUZJTEU7Ci0JCQkJCX0KLQkJCQkJLyoKLQkJCQkJICogQ2hlY2sgdGhlIGRvY3VtZW50IHR5cGUuIEFsdGhvdWdoIHJldHVybmluZyBudWxsIGZvcgotCQkJCQkgKiB1bmtub3duIGRvY3VtZW50cyB3b3VsZCBiZSBmYWlyLCB0cnkgdG8gZ2V0IGEgbW9kZWwgaWYKLQkJCQkJICogdGhlIGRvY3VtZW50IGlzIGF0IGxlYXN0IGEgdmFsaWQgdHlwZS4KLQkJCQkJICovCi0JCQkJCUlEb2N1bWVudCBidWZmZXJEb2N1bWVudCA9IGJ1ZmZlci5nZXREb2N1bWVudCgpOwotCQkJCQlpZiAoYnVmZmVyRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCQltb2RlbCA9IGdldE1vZGVsKChJU3RydWN0dXJlZERvY3VtZW50KSBidWZmZXJEb2N1bWVudCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvKgotCQkJCQkJICogMTkwNzY4IC0gUXVpY2sgZGlmZiBtYXJrcyBkbyBub3QgZGlzYXBwZWFyIGluIHRoZQotCQkJCQkJICogdmVydGljYWwgcnVsZXIgb2YgSmF2YVNjcmlwdCBlZGl0b3IgYW5kCi0JCQkJCQkgKiAKLQkJCQkJCSAqIDE5MzgwNSAtIENoYW5nZXMgYXJlIG5vdCB0aHJvd24gYXdheSB3aGVuIGNsb3NlCi0JCQkJCQkgKiB3aXRoIG5vIHNhdmUgZm9yIGZpbGVzIHdpdGggbm8gc3RydWN0dXJlZCBtb2RlbAotCQkJCQkJICogYXNzb2NpYXRlZCB3aXRoIHRoZW0gKHRleHQgZmlsZXMsIGphdmFzY3JpcHQgZmlsZXMsCi0JCQkJCQkgKiBldGMpIGluIHdlYiBwcm9qZWN0Ci0JCQkJCQkgKi8KLQkJCQkJCWJ1ZmZlck1hbmFnZXIuZGlzY29ubmVjdChsb2NhdGlvbiwgTG9jYXRpb25LaW5kLklGSUxFLCBnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXJyb3IgZ2V0dGluZyBtb2RlbCBmb3IgIiArIGZpbGUuZ2V0RnVsbFBhdGgoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgZ2V0L2NyZWF0ZSBhIG1vZGVsIHdpdGhvdXQgYSBkb2N1bWVudCByZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLm1vZGVsID09IG51bGwpIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfRklMRUJVRkZFUk1PREVMTUFOQUdFTUVOVCkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIGNyZWF0aW5nIG1vZGVsIGZvciAiICsgaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKSArICIgIiArIGluZm8uYnVmZmVyLmdldERvY3VtZW50KCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWluZm8ubW9kZWxSZWZlcmVuY2VDb3VudCsrOwotCi0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IE1vZGVsSGFuZGxlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlSWQoaW5mby5jb250ZW50VHlwZUlEKTsKLQkJCUlNb2RlbExvYWRlciBsb2FkZXIgPSBoYW5kbGVyLmdldE1vZGVsTG9hZGVyKCk7Ci0JCQltb2RlbCA9IGxvYWRlci5jcmVhdGVNb2RlbChkb2N1bWVudCwgaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLCBoYW5kbGVyKTsKLQkJCXRyeSB7Ci0JCQkJaW5mby5tb2RlbCA9IG1vZGVsOwotCQkJCW1vZGVsLnNldElkKGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCQkJLy8gaGFuZGxlciBub3cgc2V0IGJ5IGxvYWRlciwgZm9yIG5vdwotCQkJCS8vIG1vZGVsLnNldE1vZGVsSGFuZGxlcihoYW5kbGVyKTsKLQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgewotCQkJCQkoKEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSBtb2RlbCkuc2V0Q29udGVudFR5cGVJZGVudGlmaWVyKGluZm8uY29udGVudFR5cGVJRCk7Ci0JCQkJfQotCQkJCW1vZGVsLnNldFJlc29sdmVyKGNyZWF0ZVVSSVJlc29sdmVyKGdldEJ1ZmZlcihkb2N1bWVudCkpKTsKLQkJCQlpZiAoaW5mby5idWZmZXIuaXNEaXJ0eSgpKSB7Ci0JCQkJCW1vZGVsLnNldERpcnR5U3RhdGUodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFJlc291cmNlSW5Vc2UgZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImF0dGVtcHRlZCB0byBjcmVhdGUgbmV3IG1vZGVsIHdpdGggZXhpc3RpbmcgSUQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCW1vZGVsID0gbnVsbDsKLQkJCX0KLQkJfQotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW5mby5tb2RlbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogV2lsbCByZW1vdmUgdGhlIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gPGNvZGU+ZG9jdW1lbnQ8L2NvZGU+IGlmIGJvdGgKLQkgKiB0aGVyZSBhcmUgbm8gbW9yZSBidWZmZXIgb3IgbW9kZWwgcmVmZXJlbmNlIGNvdW50cyBmb3IgPGNvZGU+aW5mbzwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gaW5mbyB0aGUgZG9jdW1lbnQgaW5mbyB0byBjaGVjayBmb3IgcmVmZXJlbmNlIGNvdW50cwotCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUga2V5IHRvIHJlbW92ZSBmcm9tIHRoZSBkb2N1bWVudCBtYXAgaWYgdGhlcmUgYXJlIG5vIG1vcmUKLQkgKiByZWZlcmVuY2VzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUmVmZXJlbmNlQ291bnRzKERvY3VtZW50SW5mbyBpbmZvLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGluZm8uYnVmZmVyUmVmZXJlbmNlQ291bnQgPT0gMCAmJiBpbmZvLm1vZGVsUmVmZXJlbmNlQ291bnQgPT0gMCkKLQkJCWZEb2N1bWVudE1hcC5yZW1vdmUoZG9jdW1lbnQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRXhpc3RpbmdCdWZmZXIoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBjaGVjayBmb3IgYW4gZXhpc3RpbmcgYnVmZmVyIHdpdGhvdXQgYSBkb2N1bWVudCByZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCXJldHVybiBpbmZvICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZU1vZGVsKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgcmVsZWFzZSBhIG1vZGVsIHdpdGhvdXQgYSBkb2N1bWVudCByZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybjsKLQkJfQotCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGZEb2N1bWVudE1hcC5nZXQoZG9jdW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX0ZJTEVCVUZGRVJNT0RFTE1BTkFHRU1FTlQpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciBub3RpY2VkIGZ1bGwgcmVsZWFzZSBvZiBtb2RlbCBmb3IgIiArIGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCkgKyAiICIgKyBpbmZvLmJ1ZmZlci5nZXREb2N1bWVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlpbmZvLm1vZGVsID0gbnVsbDsKLQkJCWluZm8ubW9kZWxSZWZlcmVuY2VDb3VudC0tOwotCQkJaWYgKGluZm8uc2VsZkNvbm5lY3RlZCkgewotCQkJCWlmIChMb2dnZXIuREVCVUdfRklMRUJVRkZFUk1PREVMTUFOQUdFTUVOVCkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciBkaXNjb25uZWN0aW5nIGZyb20gIiArIGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCkgKyAiICIgKyBpbmZvLmJ1ZmZlci5nZXREb2N1bWVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCUlQYXRoIGxvY2F0aW9uID0gaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKTsKLQkJCQl0cnkgewotCQkJCQlGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5kaXNjb25uZWN0KGxvY2F0aW9uLCBpbmZvLmxvY2F0aW9uS2luZCwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkVycm9yIHJlbGVhc2luZyBtb2RlbCBmb3IgIiArIGxvY2F0aW9uLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCS8vIFsyNjU4OTldCi0JCQkvLyBJbiBzb21lIHNjZW5hcmlvcywgYSBtb2RlbCBjYW4gYmUgaGVsZCBvbnRvIGFmdGVyIHRoZSBlZGl0b3IgaGFzIGJlZW4gZGlzcG9zZWQgZXZlbiBpZiB0aGUgbGlmZWN5Y2xlIGlzCi0JCQkvLyBtYWludGFpbmVkIHByb3Blcmx5IChlLmcuLCBhbiBlZGl0b3IgYmVpbmcgY2xvc2VkIGJlZm9yZSBhIERpcnR5UmVnaW9uUHJvY2Vzc29yIGhhcyBhIGNoYW5jZSB0byBjb21wbGV0ZSkuIEJlY2F1c2Ugb2YgdGhpcywKLQkJCS8vIHRoZSBtYW5hZ2VyIGNhbm5vdCBiZSByZWxpYW50IHVwb24gdGhlIEZpbGVCdWZmZXJNYXBwZXIgaGF2aW5nIHRoZSBzb2xlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBmRG9jdW1lbnRNYXAgY2xlYW51cAotCQkJY2hlY2tSZWZlcmVuY2VDb3VudHMoaW5mbywgZG9jdW1lbnQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmV2ZXJ0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgcmVsZWFzZSBhIG1vZGVsIHdpdGhvdXQgYSBkb2N1bWVudCByZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybjsKLQkJfQotCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGZEb2N1bWVudE1hcC5nZXQoZG9jdW1lbnQpOwotCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgd2FzIGFza2VkIHRvIHJldmVydCBhIGRvY3VtZW50IGJ1dCB3YXMgbm90IGJlaW5nIG1hbmFnZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJLy8gZ2V0IHBhdGgganVzdCBmb3IgcG90ZW50aWFsIGVycm9yIG1lc3NhZ2UKLQkJCUlQYXRoIGxvY2F0aW9uID0gaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJLy8gSVNTVUU6IGluIGZ1dHVyZSwgY2xpZW50cyBzaG91bGQgcHJvdmlkZSBwcm9ncmVzcyBtb25pdG9yCi0JCQkJaW5mby5idWZmZXIucmV2ZXJ0KGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJU1NVRTogc2hvdWRsIHdlIG5vdCBiZSByZS10aHJvd2luZyBDb3JlRXhjZXB0aW9ucz8gT3IKLQkJCQkvLyBub3QgY2F0Y2ggdGhlbSBhdCBhbGw/Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXJyb3IgcmV2ZXJ0aW5nIG1vZGVsIGZvciAiICsgbG9jYXRpb24sIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0lFeGVjdXRpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9JRXhlY3V0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNjNTg5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0lFeGVjdXRpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7Ci0KLS8qKgotICogQW4gYWJzdHJhY3Rpb24gdGhhdCBhbGxvd3MgZXZlbiBwcm9jZXNzaW5nIHRvIGJlIHBlcmZvcm1lZCBpbiBhIGRpZmZlcmVudAotICogY29udGV4dCwgZS5nLiBhIGRpZmZlcmVudCBUaHJlYWQsIGlmIG5lZWRlZC4KLSAqIAotICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFeGVjdXRpb25EZWxlZ2F0ZSB7Ci0KLQl2b2lkIGV4ZWN1dGUoSVNhZmVSdW5uYWJsZSBydW5uYWJsZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0lMb2NrYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9JTG9ja2FibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhhYTUwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0lMb2NrYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci0KLS8qKgotICogCi0gKiBOb3QgQVBJOiBub3QgdG8gYmUgdXNlZCBvciBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiBUaGlzIGlzIGEgc3BlY2lhbAotICogcHVycG9zZSBpbnRlcmZhY2UgdG8gaGVscCBndWFyZCBzb21lIHRocmVhZGluZyBpc3N1ZXMgYmV0d2VlZW4gbW9kZWwgYW5kCi0gKiBkb2N1bWVudC4gV2lsbCBiZSBjaGFuZ2VkIHNvb24uCi0gKiAgCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJTG9ja2FibGUgewotCi0JSUxvY2sgZ2V0TG9ja09iamVjdCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0pTUEF3YXJlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvSlNQQXdhcmVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWUyMjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvSlNQQXdhcmVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci0KLQotcHVibGljIGludGVyZmFjZSBKU1BBd2FyZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQl2b2lkIGluaXRpYWxpemVXaXRoKEVtYmVkZGVkVHlwZUhhbmRsZXIgZW1iZWRkZWRDb250ZW50VHlwZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgyNjg2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogdHJ1ZSBpZiBib3RoIHBsYXRmb3JtIGFuZCB0aGlzIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IFBsYXRmb3JtLmluRGVidWdNb2RlKCkgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kZWJ1ZyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgYWRhcHRlcgotCSAqIG5vdGlmaWNhdGlvbiB0aW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0FEQVBURVJOT1RJRklDQVRJT05USU1FID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb20vYWRhcHRlci9ub3RpZmljYXRpb24vdGltZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgc3RydWN0dXJlZAotCSAqIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0RPQ1VNRU5UID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkZG9jdW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIGZpbGUgYnVmZmVyCi0JICogbW9kZWwgbWFuYWdlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19GSUxFQlVGRkVSTU9ERUxNQU5BR0VNRU5UID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9maWxlYnVmZmVycy9tb2RlbG1hbmFnZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIGZpbGUgYnVmZmVyCi0JICogbW9kZWxzIG5vdCBiZWluZyByZWxlYXNlZCBvbiBzaHV0ZG93bgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19GSUxFQlVGRkVSTU9ERUxMRUFLUyA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZmlsZWJ1ZmZlcnMvbGVha3MiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIGZvcm1hdHRpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRk9STUFUID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9mb3JtYXQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIHRleHQgYnVmZmVyCi0JICogbGlmZWN5Y2xlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RFWFRCVUZGRVJMSUZFQ1lDTEUgPSBERUJVRyAmJiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2ZpbGVidWZmZXJzL2xpZmVjeWNsZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgbW9kZWwKLQkgKiBsaWZlY3ljbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfTElGRUNZQ0xFID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvbGlmZWN5Y2xlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKioKLQkgKiB0cnVlIGlmIHBsYXRmb3JtIGFuZCBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUgYW5kIGRlYnVnZ2luZyBtb2RlbCBzdGF0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19NT0RFTFNUQVRFID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvc3RhdGUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIG1vZGVsIGxvY2sKLQkgKiBzdGF0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19NT0RFTExPQ0sgPSBERUJVRyAmJiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRtb2RlbC9sb2NrcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgbW9kZWwKLQkgKiBtYW5hZ2VyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX01PREVMTUFOQUdFUiA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3RydWN0dXJlZG1vZGVsL21vZGVsbWFuYWdlciIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgdGFzayB0YWdzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RBU0tTID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgdGFzayB0YWdzCi0JICogY29udGVudCB0eXBlIGRldGVjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19UQVNLU0NPTlRFTlRUWVBFID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9kZXRlY3Rpb24iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIHRhc2sgdGFncwotCSAqIGpvYnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEFTS1NKT0IgPSBERUJVRyAmJiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL2pvYiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgdGFzayB0YWdzCi0JICogb3ZlcmFsbCBwZXJmb3JtYW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19UQVNLU09WRVJBTExQRVJGID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9vdmVyYWxsdGltZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgdGFzayB0YWdzCi0JICogcGVyZm9ybWFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEFTS1NQRVJGID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy90aW1lIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKioKLQkgKiB0cnVlIGlmIHBsYXRmb3JtIGFuZCBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUgYW5kIGRlYnVnZ2luZyB0YXNrIHRhZ3MKLQkgKiBwcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19UQVNLU1BSRUZTID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9wcmVmZXJlbmNlcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgdGFzayB0YWdzCi0JICogcmVnaXN0cnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEFTS1NSRUdJU1RSWSA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvcmVnaXN0cnkiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoKLQkgKiBLZWVwIG91ciBvd24gY29weSBpbiBjYXNlIHdlIHdhbnQgdG8gYWRkIG90aGVyIHNldmVyaXR5IGxldmVscwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGxldmVsID09IE9LX0RFQlVHIHx8IGxldmVsID09IElORk9fREVCVUcgfHwgbGV2ZWwgPT0gV0FSTklOR19ERUJVRyB8fCBsZXZlbCA9PSBFUlJPUl9ERUJVRykgewotCQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJCXJldHVybjsKLQkJfQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFdyaXRlIGEgbWVzc2FnZSB0byB0aGUgbG9nIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5IGxldmVsCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBFUlJPUiwgV0FSTklORywgSU5GTywgT0sKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgbWVzc2FnZSB0byBhZGQgdG8gdGhlIGxvZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZXMgYSBtZXNzYWdlIGFuZCBleGNlcHRpb24gdG8gdGhlIGxvZyB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSBsZXZlbAotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgRVJST1IsIFdBUk5JTkcsIElORk8sIE9LCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdG8gYWRkIHRvIHRoZSBsb2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZXMgdGhlIGV4Y2VwdGlvbiBhcyBhbiBlcnJvciBpbiB0aGUgbG9nIGFsb25nIHdpdGggYW4gYWNjb21wYW55aW5nCi0JICogbWVzc2FnZQotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBtZXNzYWdlIHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRvIGFkZCB0byB0aGUgbG9nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBleGNlcHRpb24gYXMgYW4gZXJyb3IgaW4gdGhlIGxvZwotCSAqIAotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0byBhZGQgdG8gdGhlIGxvZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKElTdGF0dXMuRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Nb2RlbE1hbmFnZXJQbHVnaW5SZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Nb2RlbE1hbmFnZXJQbHVnaW5SZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjkwMjVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTW9kZWxNYW5hZ2VyUGx1Z2luUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsTWFuYWdlclBsdWdpblJlZ2lzdHJ5UmVhZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBNb2RlbE1hbmFnZXJQbHVnaW5SZWdpc3RyeVJlYWRlciByZWFkZXIgPSBudWxsOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgTW9kZWxNYW5hZ2VyUGx1Z2luUmVnaXN0cnlSZWFkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChyZWFkZXIgPT0gbnVsbCkgewotCQkJcmVhZGVyID0gbmV3IE1vZGVsTWFuYWdlclBsdWdpblJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHJlYWRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEFUVFJfQURBUFRFUktFWSA9ICJhZGFwdGVyS2V5Q2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBBVFRSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQVRUUl9DT05URU5UVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQVRUUl9SRUdJU1RFUkFEQVBURVIgPSAicmVnaXN0ZXJBZGFwdGVycyI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImFkYXB0T25DcmVhdGVGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiQWRhcHRPbkNyZWF0ZUZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBYTUxFZGl0b3JQbHVnaW5SZWdpc3RyeVJlYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBNb2RlbE1hbmFnZXJQbHVnaW5SZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRGYWN0b3JpZXMoSURvY3VtZW50VHlwZUhhbmRsZXIgaGFuZGxlcikgewotCQlyZXR1cm4gbG9hZFJlZ2lzdHJ5KGhhbmRsZXIuZ2V0SWQoKSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RmFjdG9yaWVzKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBsb2FkUmVnaXN0cnkodHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlckZhY3RvcnkgbG9hZEZhY3RvcnlGcm9tQ29uZmlndXJhdGlvbkVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIE9iamVjdCByZXF1ZXN0ZXJUeXBlKSB7Ci0JCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKSB7Ci0JCQlTdHJpbmcgY29udGVudFR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0NPTlRFTlRUWVBFKTsKLQkJCWlmICghY29udGVudFR5cGUuZXF1YWxzKHJlcXVlc3RlclR5cGUpKQotCQkJCXJldHVybiBudWxsOwotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfQ0xBU1MpOwotCQkJU3RyaW5nIGFkYXB0ZXJLZXlDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfQURBUFRFUktFWSk7Ci0JCQlTdHJpbmcgcmVnaXN0ZXJBZGFwdGVycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfUkVHSVNURVJBREFQVEVSKTsKLQotCQkJLy8gaWYgY2xhc3NOYW1lIGlzIG51bGwsIHRoZW4gbm8gb25lIGRlZmluZWQgdGhlIGV4dGVuc2lvbiBwb2ludAotCQkJLy8gZm9yIGFkYXB0ZXIgZmFjdG9yaWVzCi0JCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKG5hbWUpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWYgYW4gZXJyb3Igb2NjdXJzIGhlcmUsIGl0cyBwcm9iYWJseSB0aGF0IHRoZSBwbHVnaW4KLQkJCQkJLy8gY291bGQgbm90IGJlIGZvdW5kL2xvYWRlZAotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBidW5kbGU6ICIgKyBuYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJfQotCQkJCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJCQlib29sZWFuIHVzZUV4dGVuZGVkQ29uc3RydWN0b3IgPSBmYWxzZTsKLQkJCQkJYm9vbGVhbiBkb1JlZ2lzdGVyQWRhcHRlcnMgPSBmYWxzZTsKLQkJCQkJT2JqZWN0IGFkYXB0ZXJLZXkgPSBudWxsOwotCi0JCQkJCWlmIChyZWdpc3RlckFkYXB0ZXJzICE9IG51bGwgJiYgcmVnaXN0ZXJBZGFwdGVycy5sZW5ndGgoKSA+IDAgJiYgQm9vbGVhbi52YWx1ZU9mKHJlZ2lzdGVyQWRhcHRlcnMpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQlkb1JlZ2lzdGVyQWRhcHRlcnMgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmIChhZGFwdGVyS2V5Q2xhc3MgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlDbGFzcyBhQ2xhc3MgPSBudWxsOwotCQkJCQkJCS8vIGFDbGFzcyA9IGNsYXNzTG9hZGVyICE9IG51bGwgPwotCQkJCQkJCS8vIGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhhZGFwdGVyS2V5Q2xhc3MpIDoKLQkJCQkJCQkvLyBDbGFzcy5mb3JOYW1lKGFkYXB0ZXJLZXlDbGFzcyk7Ci0JCQkJCQkJaWYgKGJ1bmRsZS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5VTklOU1RBTExFRCkgewotCQkJCQkJCQlhQ2xhc3MgPSBidW5kbGUubG9hZENsYXNzKGFkYXB0ZXJLZXlDbGFzcyk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlhQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGFkYXB0ZXJLZXlDbGFzcyk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChhQ2xhc3MgIT0gbnVsbCkgewotCQkJCQkJCQl1c2VFeHRlbmRlZENvbnN0cnVjdG9yID0gdHJ1ZTsKLQkJCQkJCQkJYWRhcHRlcktleSA9IGFDbGFzczsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWFkYXB0ZXJLZXkgPSBhZGFwdGVyS2V5Q2xhc3M7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBhbnlFcnJvcnMpIHsKLQkJCQkJCQlhZGFwdGVyS2V5ID0gYWRhcHRlcktleUNsYXNzOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJdHJ5IHsKLQkJCQkJCUNsYXNzIHRoZUNsYXNzID0gbnVsbDsKLQkJCQkJCS8vIENsYXNzIHRoZUNsYXNzID0gY2xhc3NMb2FkZXIgIT0gbnVsbCA/Ci0JCQkJCQkvLyBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKSA6Ci0JCQkJCQkvLyBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCQkJCQlpZiAoYnVuZGxlLmdldFN0YXRlKCkgIT0gQnVuZGxlLlVOSU5TVEFMTEVEKSB7Ci0JCQkJCQkJdGhlQ2xhc3MgPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQl0aGVDbGFzcyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJCQkJCX0KLQkJCQkJCWlmICh1c2VFeHRlbmRlZENvbnN0cnVjdG9yKSB7Ci0JCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3JbXSBjdG9ycyA9IHRoZUNsYXNzLmdldENvbnN0cnVjdG9ycygpOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3RvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJQ2xhc3NbXSBwYXJhbVR5cGVzID0gY3RvcnNbaV0uZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCQkJCQkJaWYgKGN0b3JzW2ldLmlzQWNjZXNzaWJsZSgpICYmIHBhcmFtVHlwZXMubGVuZ3RoID09IDIgJiYgcGFyYW1UeXBlc1swXS5lcXVhbHMoT2JqZWN0LmNsYXNzKSAmJiBwYXJhbVR5cGVzWzFdLmVxdWFscyhib29sZWFuLmNsYXNzKSkgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGN0b3JzW2ldLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXthZGFwdGVyS2V5LCBuZXcgQm9vbGVhbihkb1JlZ2lzdGVyQWRhcHRlcnMpfSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbgotCQkJCQkJCQkJCS8vIG5vdCB0bwotCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24KLQkJCQkJCQkJCQkvLyBub3QgdG8KLQkJCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbgotCQkJCQkJCQkJCS8vIG5vdCB0bwotCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uCi0JCQkJCQkJCQkJLy8gbm90IHRvCi0JCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciBlKSB7Ci0JCQkJCQkJCQkJLy8gbG9nIG9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uCi0JCQkJCQkJCQkJLy8gbm90IHRvCi0JCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQkJCWZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVFJfQ0xBU1MpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGxvZyBvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBsb2cgb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgbG9hZFJlZ2lzdHJ5KE9iamVjdCBjb250ZW50VHlwZSkgewotCQlMaXN0IGZhY3RvcnlMaXN0ID0gbmV3IFZlY3RvcigpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChTU0VDb3JlUGx1Z2luLklELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBsb2FkRmFjdG9yeUZyb21Db25maWd1cmF0aW9uRWxlbWVudChlbGVtZW50c1tpXSwgY29udGVudFR5cGUpOwotCQkJCWlmIChmYWN0b3J5ICE9IG51bGwpCi0JCQkJCWZhY3RvcnlMaXN0LmFkZChmYWN0b3J5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFjdG9yeUxpc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Ob0NhbmNlbFByb2dyZXNzTW9uaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Ob0NhbmNlbFByb2dyZXNzTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWYxMjlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTm9DYW5jZWxQcm9ncmVzc01vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgTm9DYW5jZWxQcm9ncmVzc01vbml0b3IgZXh0ZW5kcyBOdWxsUHJvZ3Jlc3NNb25pdG9yIHsKLQotCi0JcHVibGljIE5vQ2FuY2VsUHJvZ3Jlc3NNb25pdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IjaXNDYW5jZWxlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTBiOTg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTm90SW1wbGVtZW50ZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi0KLXB1YmxpYyBjbGFzcyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlwdWJsaWMgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLQl9Ci0KLQlwdWJsaWMgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCXN1cGVyKGNhdXNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL051bGxNZW1lbnRvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL051bGxNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYTQzMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9OdWxsTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLk5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXM7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgYW4gRW5jb2RpbmdNZW1lbnRvIChpdHMgc3VwZXIgY2xhc3MpLAotICogd2hlbiB0aGVyZSBpcyBub3QgaW4gZmFjdCBBTlkgZW5jb2RpbmcgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCB3aGVuIGEKLSAqIHN0cnVjdHVyZWREb2N1bWVudCBpcyBjcmVhdGVkIGRpcmVjdGx5IGZyb20gYSBTdHJpbmcKLSAqLwotcHVibGljIGNsYXNzIE51bGxNZW1lbnRvIGV4dGVuZHMgRW5jb2RpbmdNZW1lbnRvIHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIE51bGxNZW1lbnRvKCkgewotCQlzdXBlcigpOwotCQlTdHJpbmcgZGVmYXVsdENoYXJzZXQgPSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLnVzZURlZmF1bHROYW1lUnVsZXMobnVsbCk7Ci0JCXNldEphdmFDaGFyc2V0TmFtZShkZWZhdWx0Q2hhcnNldCk7Ci0JCXNldEFwcHJvcHJpYXRlRGVmYXVsdChkZWZhdWx0Q2hhcnNldCk7Ci0JCXNldERldGVjdGVkQ2hhcnNldE5hbWUobnVsbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1Byb3BhZ2F0aW5nQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Qcm9wYWdhdGluZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAxYzQ4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1Byb3BhZ2F0aW5nQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotcHVibGljIGludGVyZmFjZSBQcm9wYWdhdGluZ0FkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0Jdm9pZCBhZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpOwotCi0JTGlzdCBnZXRBZGFwdE9uQ3JlYXRlRmFjdG9yaWVzKCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGFkZGluZyBhIGZhY3RvcnksCi0JICogdHlwaWNhbGx5IG9uIHRoZSBkb2N1bWVudCAodG9wIGxldmVsKSBub2RlLCBzbyBhbGwgbm9kZXMgY2FuIGJlCi0JICogYWRhcHRlZCwgaWYgbmVlZGVkLiBUaGlzIGlzIG5lZWRlZCBmb3IgdGhvc2Ugb2NjYXNpb25zIHdoZW4gYSBmYWN0b3J5Ci0JICogaXMgYWRkZWRlZCBhZnRlciBzb21lIG5vZGVzIG1heSBoYXZlIGFscmVhZHkgYmVlbiBjcmVhdGVkIGF0IHRoZSB0aW1lCi0JICogdGhlIGZhY3RvcnkgaXMgYWRkZWQuCi0JICovCi0Jdm9pZCBpbml0aWFsaXplRm9yRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksIElOb2RlTm90aWZpZXIgbm9kZSk7Ci0KLQkvLyBkbXc6IHNob3VsZCBoYXZlIGdldEZhY3RvcnlGb3I/Ci0Jdm9pZCByZWxlYXNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1Byb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGM4NGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBJTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQotCXZvaWQgYWRkQ29udHJpYnV0ZWRGYWN0b3JpZXMoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KTsKLQotCXZvaWQgc2V0Q29udHJpYnV0ZWRGYWN0b3JpZXMoQXJyYXlMaXN0IGxpc3QpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9TU0VDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmZDFhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgU1NFIENvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTU0VDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFNTRUNvcmVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBTU0VDb3JlTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQV9tb2RlbF9zX2lkX2Nhbl9ub3RfYmVfbnVfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9ncmFtX0Vycm9yX19Nb2RlbE1hbmFnZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9yaWdpbmFsX0Vycm9yX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dF9DaGFuZ2VfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tTY2FubmVyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1NjYW5uaW5nSm9iXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1NjYW5uaW5nSm9iXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlncmF0ZV9DaGFyc2V0OwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9TU0VDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVlMzJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrcy5UYXNrU2Nhbm5pbmdTY2hlZHVsZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLQotLyoqCi0gKiBTU0UgQ29yZSBQbHVnaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBTU0VDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlzdGF0aWMgU1NFQ29yZVBsdWdpbiBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFNTRUNvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBTU0VDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogU2V0IGRlZmF1bHQgbm9uLVVJCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJLy8gc2V0IG1vZGVsIHByZWZlcmVuY2UgZGVmYXVsdHMKLQotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlVTRV8zQllURV9CT01fV0lUSF9VVEY4LCBmYWxzZSk7Ci0JCQotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlRBU0tfVEFHX0VOQUJMRSwgZmFsc2UpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlRBU0tfVEFHX1RBR1MsICJUT0RPLEZJWE1FLFhYWCIpOyAvLyROT04tTkxTLTEkCi0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVEFTS19UQUdfUFJJT1JJVElFUywgIjEsMiwxIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkKLQkJVGFza1NjYW5uaW5nU2NoZWR1bGVyLnNodXRkb3duKCk7Ci0KLQkJRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5zaHV0ZG93bigpOwotCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCi0JCS8vIGluaXRpYWxpemUgRmlsZUJ1ZmZlciBoYW5kbGluZwotCQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLnN0YXJ0dXAoKTsKLQotCQkvKioKLQkJICogSWYgdGhlIHVzZXIgc3RhcnRzIHRoZSB3b3JrYmVuY2ggd2l0aAotCQkgKiAtRG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50YXNrc2Nhbm5lcj1vZmYsIHRoZSBzY2FubmVyIHNob3VsZCBiZQotCQkgKiBkaXNhYmxlZAotCQkgKi8KLQkJU3RyaW5nIHNjYW4gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50YXNrc2Nhbm5lciIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzY2FuID09IG51bGwgfHwgIXNjYW4uZXF1YWxzSWdub3JlQ2FzZSgib2ZmIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJVGFza1NjYW5uaW5nU2NoZWR1bGVyLnN0YXJ0dXAoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIE1vZGVsSGFuZGxlclJlZ2lzdHJ5IGdldE1vZGVsSGFuZGxlclJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gTW9kZWxIYW5kbGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCSAqLwotCXB1YmxpYyBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9TU0VDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmMDFmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQV9tb2RlbF9zX2lkX2Nhbl9ub3RfYmVfbnVfRVhDXz1BIG1vZGVsJ3MgaWQgY2FuIG5vdCBiZSBudWxsCi1Qcm9ncmFtX0Vycm9yX19Nb2RlbE1hbmFnZV9FWENfPVByb2dyYW0gRXJyb3I6IE1vZGVsTWFuYWdlckltcGw6OnNhdmVNb2RlbC4gTW9kZWwgc2hvdWxkIGJlIGluIHRoZSBjYWNoZQotT3JpZ2luYWxfRXJyb3JfX1VJXz1PcmlnaW5hbCBFcnJvcjoKLVRleHRfQ2hhbmdlX1VJXz1UZXh0IENoYW5nZQotVGFza1NjYW5uZXJfMD1TY2FubmluZyBmb3IgVGFza3MKLVRhc2tTY2FubmluZ0pvYl8wPVNjYW5uaW5nCi1UYXNrU2Nhbm5pbmdKb2JfMT1FcnJvcnMgd2hpbGUgZGV0ZWN0aW5nIFRhc2tzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1NaWdyYXRlX0NoYXJzZXQ9TWlncmF0ZSBDaGFyc2V0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0Fic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUyNWQ1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgaW1wbGVtZW50cyBJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgewotCXB1YmxpYyBib29sZWFuIHJlZnJlc2hDbGVhbnVwUHJlZmVyZW5jZXMgPSB0cnVlOyAvLyBzcGVjaWFsIGZsYWcgZm9yIEpVbml0Ci0KLQkvLyB0ZXN0cyB0byBza2lwIHJlZnJlc2gKLQkvLyBvZiBjbGVhbnVwIHByZWZlcmVuY2VzCi0JLy8gd2hlbiBpdCdzIHNldCB0byBmYWxzZQotCi0JcHVibGljIFN0cmluZyBjbGVhbnVwQ29udGVudChTdHJpbmcgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygiVVRGOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGlkID0gaW5wdXRTdHJlYW0udG9TdHJpbmcoKSArIGdldENvbnRlbnRUeXBlKCk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChpZCwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCAwLCBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpOwotCi0JCQkvLyByZXR1cm4gb3V0cHV0Ci0JCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpOwotCQl9IGZpbmFsbHkgewotCQkJZW5zdXJlQ2xvc2VkKG51bGwsIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBjbGVhbnVwQ29udGVudChTdHJpbmcgaW5wdXQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCWlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCJVVEY4IikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgaWQgPSBpbnB1dFN0cmVhbS50b1N0cmluZygpICsgZ2V0Q29udGVudFR5cGUoKTsKLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGlkLCBpbnB1dFN0cmVhbSwgbnVsbCk7Ci0KLQkJCS8vIGNsZWFudXAKLQkJCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCi0JCQkvLyByZXR1cm4gb3V0cHV0Ci0JCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpOwotCQl9IGZpbmFsbHkgewotCQkJZW5zdXJlQ2xvc2VkKG51bGwsIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZiBtb2RlbAotCQkJLy8gY2hhbmdlZC4KLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsKTsKLQotCQkJLy8gc2F2ZSBtb2RlbCBpZiBuZWVkZWQKLQkJCWlmICghc3RydWN0dXJlZE1vZGVsLmlzU2hhcmVkRm9yRWRpdCgpICYmIHN0cnVjdHVyZWRNb2RlbC5pc1NhdmVOZWVkZWQoKSkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZSgpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gZW5zdXJlQ2xvc2VkKG91dHB1dFN0cmVhbSwgbnVsbCk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBEb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHN0YXJ0ID49IDAgJiYgbGVuZ3RoID49IDAgJiYgc3RhcnQgKyBsZW5ndGggPD0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJCS8vIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCQkvLyBOb3RlOiBXZSBhcmUgZ2V0dGluZyBtb2RlbCBmb3IgZWRpdC4gV2lsbCBzYXZlIG1vZGVsIGlmCi0JCQkJLy8gbW9kZWwgY2hhbmdlZC4KLQkJCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQotCQkJCS8vIGNsZWFudXAKLQkJCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQotCQkJCS8vIHNhdmUgbW9kZWwgaWYgbmVlZGVkCi0JCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cEZpbGUoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0KLQkJCS8vIGNsZWFudXAKLQkJCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIDAsIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKSk7Ci0KLQkJCS8vIHNhdmUgb3V0cHV0IHRvIGZpbGUKLQkJCS8vIG91dHB1dFN0cmVhbSA9IG5ldwotCQkJLy8gRmlsZU91dHB1dFN0cmVhbShmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZShmaWxlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIGVuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIG51bGwpOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwRmlsZShJRmlsZSBmaWxlLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQotCQkJLy8gc2F2ZSBvdXRwdXQgdG8gZmlsZQotCQkJLy8gb3V0cHV0U3RyZWFtID0gbmV3Ci0JCQkvLyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKGZpbGUpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gZW5zdXJlQ2xvc2VkKG91dHB1dFN0cmVhbSwgbnVsbCk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGVOYW1lLCBpbnB1dFN0cmVhbSwgbnVsbCk7Ci0KLQkJCS8vIGNsZWFudXAKLQkJCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIDAsIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKSk7Ci0KLQkJCS8vIHNhdmUgb3V0cHV0IHRvIGZpbGUKLQkJCS8vIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBpbnB1dFN0cmVhbSk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCS8vIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZmlsZU5hbWUsIGlucHV0U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gY2xlYW51cAotCQkJY2xlYW51cE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCS8vIHNhdmUgb3V0cHV0IHRvIGZpbGUKLQkJCS8vIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBpbnB1dFN0cmVhbSk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCi0JCWludCBzdGFydCA9IDA7Ci0JCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0JCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0KLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlpZiAoKHN0YXJ0ID49IDApICYmIChsZW5ndGggPD0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpKSkgewotCQkJCVZlY3RvciBhY3RpdmVOb2RlcyA9IGdldEFjdGl2ZU5vZGVzKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0JCQkJaWYgKGFjdGl2ZU5vZGVzLnNpemUoKSA+IDApIHsKLQkJCQkJTm9kZSBmaXJzdE5vZGUgPSAoTm9kZSkgYWN0aXZlTm9kZXMuZmlyc3RFbGVtZW50KCk7Ci0JCQkJCU5vZGUgbGFzdE5vZGUgPSAoTm9kZSkgYWN0aXZlTm9kZXMubGFzdEVsZW1lbnQoKTsKLQkJCQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCQkJCU5vZGUgZWFjaE5vZGUgPSBmaXJzdE5vZGU7Ci0JCQkJCU5vZGUgbmV4dE5vZGUgPSBudWxsOwotCi0JCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjM2MjEKLQkJCQkJLy8gaWYgZG9pbmcgYW55IHNvcnQgb2YgY2xlYW51cCwgc2V0IHVwIHJld3JpdGUgc2Vzc2lvbi9tb2RlbGNoYW5nZWQKLQkJCQkJSURvY3VtZW50RXh0ZW5zaW9uNCBkb2NFeHQ0ID0gbnVsbDsKLQkJCQkJaWYgKHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjQpIHsKLQkJCQkJCWRvY0V4dDQgPSAoSURvY3VtZW50RXh0ZW5zaW9uNCkgc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQl9Ci0JCQkJCURvY3VtZW50UmV3cml0ZVNlc3Npb24gcmV3cml0ZVNlc3Npb24gPSBudWxsOwotCi0JCQkJCXRyeSB7Ci0JCQkJCQkvLyB3aGVuZXZlciBmb3JtYXR0aW5nIG1vZGVsLCBmaXJlCi0JCQkJCQkvLyBhYm91dHRvY2hhbmdlL21vZGVsY2hhbmdlZAotCQkJCQkJc3RydWN0dXJlZE1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCQkJcmV3cml0ZVNlc3Npb24gPSAoZG9jRXh0NCA9PSBudWxsIHx8IGRvY0V4dDQuZ2V0QWN0aXZlUmV3cml0ZVNlc3Npb24oKSAhPSBudWxsKSA/IG51bGwgOiBkb2NFeHQ0LnN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEKTsKLQotCQkJCQkJd2hpbGUgKCFkb25lKSB7Ci0JCQkJCQkJLy8gdXBkYXRlICJkb25lIgotCQkJCQkJCWRvbmUgPSAoZWFjaE5vZGUgPT0gbGFzdE5vZGUpOwotCi0JCQkJCQkvLyBnZXQgbmV4dCBzaWJsaW5nIGJlZm9yZSBjbGVhbnVwIGJlY2F1c2UgZWFjaE5vZGUKLQkJCQkJCQkvLyBtYXkKLQkJCQkJCQkvLyBiZSBkZWxldGVkLAotCQkJCQkJCS8vIGZvciBleGFtcGxlIHdoZW4gaXQncyBhbiBlbXB0eSB0ZXh0IG5vZGUKLQkJCQkJCQluZXh0Tm9kZSA9IGVhY2hOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQkJCQkvLyBjbGVhbnVwIHNlbGVjdGVkIG5vZGUocykKLQkJCQkJCQljbGVhbnVwTm9kZShlYWNoTm9kZSk7Ci0KLQkJCQkJCQkvLyB1cGRhdGUgZWFjaCBub2RlCi0JCQkJCQkJaWYgKG5leHROb2RlICE9IG51bGwgJiYgbmV4dE5vZGUuZ2V0UGFyZW50Tm9kZSgpID09IG51bGwpCi0JCQkJCQkJCS8vIG5leHROb2RlIGlzIGRlbGV0ZWQgZHVyaW5nIGNsZWFudXAKLQkJCQkJCQkJZWFjaE5vZGUgPSBlYWNoTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJZWFjaE5vZGUgPSBuZXh0Tm9kZTsKLQotCQkJCQkJCS8vIFRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UKLQkJCQkJCQkvLyBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHdpdGggZWFjaE5vZGUuCi0JCQkJCQkJLy8gV2UgZG9uJ3Qgd2FudCBhbiBpbmZpbml0ZSBsb29wIGhlcmUuCi0JCQkJCQkJaWYgKGVhY2hOb2RlID09IG51bGwpCi0JCQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQkJfQotCi0JCQkJCQkvLyBmb3JtYXQgc291cmNlCi0JCQkJCQlpZiAoZ2V0Rm9ybWF0U291cmNlUHJlZmVyZW5jZShzdHJ1Y3R1cmVkTW9kZWwpKSB7Ci0JCQkJCQkJLy8gZm9ybWF0IHRoZSBkb2N1bWVudAotCQkJCQkJCUlTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IGdldEZvcm1hdFByb2Nlc3NvcigpOwotCQkJCQkJCWZvcm1hdFByb2Nlc3Nvci5mb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJLy8gd2UgbmVlZCB0d28gZmluYWxseSdzLCBqdXN0IGluIGNhc2UgZmlyc3QgZmFpbHMKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaWYgKChkb2NFeHQ0ICE9IG51bGwpICYmIChyZXdyaXRlU2Vzc2lvbiAhPSBudWxsKSkKLQkJCQkJCQkJZG9jRXh0NC5zdG9wUmV3cml0ZVNlc3Npb24ocmV3cml0ZVNlc3Npb24pOwotCQkJCQkJfQotCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJLy8gYWx3YXlzIG1ha2Ugc3VyZSB0byBmaXJlIGNoYW5nZWRtb2RlbCB3aGVuIGRvbmUKLQkJCQkJCQlzdHJ1Y3R1cmVkTW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwTm9kZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJTm9kZSBjbGVhbnVwTm9kZSA9IG5vZGU7Ci0KLQkJCS8vIGNsZWFudXAgdGhlIG93bmVyIG5vZGUgaWYgaXQncyBhbiBhdHRyaWJ1dGUgbm9kZQotCQkJaWYgKGNsZWFudXBOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLQkJCQljbGVhbnVwTm9kZSA9ICgoQXR0cikgY2xlYW51cE5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCi0JCQkvLyByZWZyZXNoIGNsZWFudXAgcHJlZmVyZW5jZXMgYmVmb3JlIGdldHRpbmcgY2xlYW51cCBoYW5kbGVyCi0JCQlpZiAocmVmcmVzaENsZWFudXBQcmVmZXJlbmNlcykKLQkJCQlyZWZyZXNoQ2xlYW51cFByZWZlcmVuY2VzKCk7Ci0KLQkJCS8vIGdldCBjbGVhbnVwIGhhbmRsZXIKLQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgY2xlYW51cEhhbmRsZXIgPSBnZXRDbGVhbnVwSGFuZGxlcihjbGVhbnVwTm9kZSk7Ci0JCQlpZiAoY2xlYW51cEhhbmRsZXIgIT0gbnVsbCkgewotCQkJCS8vIGNsZWFudXAgZWFjaCBub2RlCi0JCQkJY2xlYW51cEhhbmRsZXIuY2xlYW51cChjbGVhbnVwTm9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb252ZXJ0TGluZURlbGltaXRlcnMoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgbmV3RGVsaW1pdGVyKSB7Ci0JCWZpbmFsIGludCBsaW5lQ291bnQgPSBkb2N1bWVudC5nZXROdW1iZXJPZkxpbmVzKCk7Ci0JCU1hcCBwYXJ0aXRpb25lcnMgPSBUZXh0VXRpbGl0aWVzLnJlbW92ZURvY3VtZW50UGFydGl0aW9uZXJzKGRvY3VtZW50KTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZUNvdW50OyBpKyspIHsKLQkJCQlmaW5hbCBTdHJpbmcgZGVsaW1pdGVyID0gZG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcihpKTsKLQkJCQlpZiAoZGVsaW1pdGVyICE9IG51bGwgJiYgZGVsaW1pdGVyLmxlbmd0aCgpID4gMCAmJiAhZGVsaW1pdGVyLmVxdWFscyhuZXdEZWxpbWl0ZXIpKSB7Ci0JCQkJCUlSZWdpb24gcmVnaW9uID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGkpOwotCQkJCQlkb2N1bWVudC5yZXBsYWNlKHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSwgZGVsaW1pdGVyLmxlbmd0aCgpLCBuZXdEZWxpbWl0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCVRleHRVdGlsaXRpZXMuYWRkRG9jdW1lbnRQYXJ0aXRpb25lcnMoZG9jdW1lbnQsIHBhcnRpdGlvbmVycyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbnN1cmVDbG9zZWQoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJdHJ5IHsKLQkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsgLy8gaG9wZWxlc3MKLQkJfQotCQl0cnkgewotCQkJaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7IC8vIGhvcGVsZXNzCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVmVjdG9yIGdldEFjdGl2ZU5vZGVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnROb2RlT2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCVZlY3RvciBhY3RpdmVOb2RlcyA9IG5ldyBWZWN0b3IoKTsKLQotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCU5vZGUgc3RhcnROb2RlID0gKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0Tm9kZU9mZnNldCk7Ci0JCQlOb2RlIGVuZE5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnROb2RlT2Zmc2V0ICsgbGVuZ3RoKTsKLQotCQkJLy8gbWFrZSBzdXJlIGl0J3MgYW4gbm9uLWVtcHR5IGRvY3VtZW50Ci0JCQlpZiAoc3RhcnROb2RlICE9IG51bGwpIHsKLQkJCQl3aGlsZSAoaXNTaWJsaW5nT2Yoc3RhcnROb2RlLCBlbmROb2RlKSA9PSBmYWxzZSkgewotCQkJCQlpZiAoZW5kTm9kZSAhPSBudWxsKQotCQkJCQkJZW5kTm9kZSA9IGVuZE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlpZiAoZW5kTm9kZSA9PSBudWxsKSB7Ci0JCQkJCQlzdGFydE5vZGUgPSBzdGFydE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJZW5kTm9kZSA9IChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJd2hpbGUgKHN0YXJ0Tm9kZSAhPSBlbmROb2RlKSB7Ci0JCQkJCWFjdGl2ZU5vZGVzLmFkZEVsZW1lbnQoc3RhcnROb2RlKTsKLQkJCQkJc3RhcnROb2RlID0gc3RhcnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJCWlmIChzdGFydE5vZGUgIT0gbnVsbCkKLQkJCQkJYWN0aXZlTm9kZXMuYWRkRWxlbWVudChzdGFydE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGFjdGl2ZU5vZGVzOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGdldENsZWFudXBIYW5kbGVyKE5vZGUgbm9kZSk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlKCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRDb252ZXJ0RU9MQ29kZXNQcmVmZXJlbmNlKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQkJYm9vbGVhbiBjb252ZXJ0RU9MQ29kZXMgPSB0cnVlOwotCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gZ2V0Q2xlYW51cEhhbmRsZXIoKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKDApKTsKLQkJaWYgKGNsZWFudXBIYW5kbGVyICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGNsZWFudXBQcmVmZXJlbmNlcyA9IGNsZWFudXBIYW5kbGVyLmdldENsZWFudXBQcmVmZXJlbmNlcygpOwotCQkJY29udmVydEVPTENvZGVzID0gY2xlYW51cFByZWZlcmVuY2VzLmdldENvbnZlcnRFT0xDb2RlcygpOwotCQl9Ci0JCXJldHVybiBjb252ZXJ0RU9MQ29kZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFT0xDb2RlUHJlZmVyZW5jZShJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCi0JCUlTY29wZUNvbnRleHRbXSBzY29wZUNvbnRleHQgPSBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBJbnN0YW5jZVNjb3BlKCl9OwotCQlTdHJpbmcgZW9sQ29kZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFN0cmluZyhQbGF0Zm9ybS5QSV9SVU5USU1FLCBQbGF0Zm9ybS5QUkVGX0xJTkVfU0VQQVJBVE9SLCBudWxsLCBzY29wZUNvbnRleHQpOwotCi0JCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgY2xlYW51cEhhbmRsZXIgPSBnZXRDbGVhbnVwSGFuZGxlcigoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oMCkpOwotCQlpZiAoY2xlYW51cEhhbmRsZXIgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgY2xlYW51cFByZWZlcmVuY2VzID0gY2xlYW51cEhhbmRsZXIuZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCk7Ci0JCQllb2xDb2RlID0gY2xlYW51cFByZWZlcmVuY2VzLmdldEVPTENvZGUoKTsKLQkJfQotCQlyZXR1cm4gZW9sQ29kZTsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZ2V0Rm9ybWF0UHJvY2Vzc29yKCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRGb3JtYXRTb3VyY2VQcmVmZXJlbmNlKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQkJYm9vbGVhbiBmb3JtYXRTb3VyY2UgPSB0cnVlOwotCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gZ2V0Q2xlYW51cEhhbmRsZXIoKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKDApKTsKLQkJaWYgKGNsZWFudXBIYW5kbGVyICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGNsZWFudXBQcmVmZXJlbmNlcyA9IGNsZWFudXBIYW5kbGVyLmdldENsZWFudXBQcmVmZXJlbmNlcygpOwotCQkJZm9ybWF0U291cmNlID0gY2xlYW51cFByZWZlcmVuY2VzLmdldEZvcm1hdFNvdXJjZSgpOwotCQl9Ci0JCXJldHVybiBmb3JtYXRTb3VyY2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaWJsaW5nT2YoTm9kZSBub2RlLCBOb2RlIGVuZE5vZGUpIHsKLQkJaWYgKGVuZE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlOb2RlIHNpYmxpbmdOb2RlID0gbm9kZTsKLQkJCXdoaWxlIChzaWJsaW5nTm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHNpYmxpbmdOb2RlID09IGVuZE5vZGUpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UKLQkJCQkJc2libGluZ05vZGUgPSBzaWJsaW5nTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENsZWFudXBQcmVmZXJlbmNlcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0lTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOTg5NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0lTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciB7Ci0JTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSk7Ci0KLQlJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLQotCXZvaWQgc2V0Q2xlYW51cFByZWZlcmVuY2VzKElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGNsZWFudXBQcmVmZXJlbmNlcyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjUwNThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIHsKLQotCWludCBnZXRBdHRyTmFtZUNhc2UoKTsKLQotCWJvb2xlYW4gZ2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKCk7Ci0KLQlib29sZWFuIGdldENvbnZlcnRFT0xDb2RlcygpOwotCi0JU3RyaW5nIGdldEVPTENvZGUoKTsKLQotCWJvb2xlYW4gZ2V0Rm9ybWF0U291cmNlKCk7Ci0KLQlib29sZWFuIGdldEluc2VydE1pc3NpbmdUYWdzKCk7Ci0KLQlib29sZWFuIGdldEluc2VydFJlcXVpcmVkQXR0cnMoKTsKLQotCWJvb2xlYW4gZ2V0UXVvdGVBdHRyVmFsdWVzKCk7Ci0KLQlpbnQgZ2V0VGFnTmFtZUNhc2UoKTsKLQotCXZvaWQgc2V0QXR0ck5hbWVDYXNlKGludCBhdHRyTmFtZUNhc2UpOwotCi0Jdm9pZCBzZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MoYm9vbGVhbiBjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MpOwotCi0Jdm9pZCBzZXRDb252ZXJ0RU9MQ29kZXMoYm9vbGVhbiBjb252ZXJ0RU9MQ29kZXMpOwotCi0Jdm9pZCBzZXRFT0xDb2RlKFN0cmluZyBFT0xDb2RlKTsKLQotCXZvaWQgc2V0Rm9ybWF0U291cmNlKGJvb2xlYW4gZm9ybWF0U291cmNlKTsKLQotCXZvaWQgc2V0SW5zZXJ0TWlzc2luZ1RhZ3MoYm9vbGVhbiBpbnNlcnRNaXNzaW5nVGFncyk7Ci0KLQl2b2lkIHNldEluc2VydFJlcXVpcmVkQXR0cnMoYm9vbGVhbiBpbnNlcnRSZXF1aXJlZEF0dHJzKTsKLQotCXZvaWQgc2V0UHJlZmVyZW5jZXMoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpOwotCi0Jdm9pZCBzZXRRdW90ZUF0dHJWYWx1ZXMoYm9vbGVhbiBxdW90ZUF0dHJWYWx1ZXMpOwotCi0Jdm9pZCBzZXRUYWdOYW1lQ2FzZShpbnQgdGFnTmFtZUNhc2UpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0lTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0lTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2JjZTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBhbmQgcmVsYXRlZCBjbGFzc2VzIGFyZSAnaW50ZXJuYWwnIGFuZCBzaG91bGQgbm90IAotICogYmUgdHJlYXRlZCBhcyBBUEksIGV2ZW4gdGhvdWdoIHVzZWQgYWNyb3NzIGNvbXBvbmVudHMgaW4gV1RQLiAKLSAqIENvbnNpZGVyIGl0IGEgd29yayBpbiBwcm9ncmVzcy4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciB7Ci0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGFuIGlucHV0IHN0cmluZyBhcyBpbnB1dCwKLQkgKiBjcmVhdGVzIGFuIElucHV0U3RyZWFtIGZyb20gdGhlIGlucHV0IHN0cmluZywgY3JlYXRlIGEgdGVtcG9yYXJ5IG1vZGVsCi0JICogb2YgdGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQsIGNsZWFudXBzIHRoZSB3aG9sZSBtb2RlbCwgdGhlbiByZXR1cm5zCi0JICogdGhlIGNsZWFuZWQgdXAgaW5wdXQgc3RyaW5nLgotCSAqLwotCVN0cmluZyBjbGVhbnVwQ29udGVudChTdHJpbmcgY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGFuIGlucHV0IHN0cmluZyBhcyBpbnB1dCwKLQkgKiBjcmVhdGVzIGFuIElucHV0U3RyZWFtIGZyb20gdGhlIGlucHV0IHN0cmluZywgY3JlYXRlIGEgdGVtcG9yYXJ5IG1vZGVsCi0JICogb2YgdGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQsIGNsZWFudXBzIHRoZSBtb2RlbCB3aXRoaW4gc3RhcnQgYW5kCi0JICogbGVuZ3RoLCB0aGVuIHJldHVybnMgdGhlIGNsZWFuZWQgdXAgaW5wdXQgc3RyaW5nLgotCSAqLwotCVN0cmluZyBjbGVhbnVwQ29udGVudChTdHJpbmcgY29udGVudCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYW4gSURvY3VtZW50IGFzIGlucHV0LCBjcmVhdGVzCi0JICogYSB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIElEb2N1bWVudCdzIGZpbGUKLQkgKiBleHRlbnNpb24sIGNsZWFudXBzIHRoZSB3aG9sZSBtb2RlbCwgdGhlbiByZWxlYXNlcyB0aGUgbW9kZWwuCi0JICovCi0Jdm9pZCBjbGVhbnVwRG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYW4gSURvY3VtZW50IGFzIGlucHV0LCBjcmVhdGVzCi0JICogYSB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIElEb2N1bWVudCdzIGZpbGUKLQkgKiBleHRlbnNpb24sIGNsZWFudXBzIHRoZSBtb2RlbCB3aXRoaW4gc3RhcnQgYW5kIGxlbmd0aCwgdGhlbiByZWxlYXNlcwotCSAqIHRoZSBtb2RlbC4KLQkgKi8KLQl2b2lkIGNsZWFudXBEb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGFuIElGaWxlIGFzIGlucHV0LCBjcmVhdGVzIGEKLQkgKiB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIElGaWxlJ3MgZmlsZQotCSAqIGV4dGVuc2lvbiwgY2xlYW51cHMgdGhlIHdob2xlIG1vZGVsLCB0aGVuIHJlbGVhc2VzIHRoZSBtb2RlbC4gVGhlIElGaWxlCi0JICogaXMgdXBkYXRlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSBvZiB0aGUgbW9kZWwgaXMgcmVsZWFzZWQgaW4gdGhlCi0JICogbW9kZWwgbWFuYWdlci4KLQkgKi8KLQl2b2lkIGNsZWFudXBGaWxlKElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhbiBJRmlsZSBhcyBpbnB1dCwgY3JlYXRlcyBhCi0JICogdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBJRmlsZSdzIGZpbGUKLQkgKiBleHRlbnNpb24sIGNsZWFudXBzIHRoZSBtb2RlbCB3aXRoaW4gc3RhcnQgYW5kIGxlbmd0aCwgdGhlbiByZWxlYXNlcwotCSAqIHRoZSBtb2RlbC4gVGhlIElGaWxlIGlzIHVwZGF0ZWQgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2Ugb2YgdGhlIG1vZGVsIGlzCi0JICogcmVsZWFzZWQgaW4gdGhlIG1vZGVsIG1hbmFnZXIuCi0JICovCi0Jdm9pZCBjbGVhbnVwRmlsZShJRmlsZSBmaWxlLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhIGZpbGUgbmFtZSBhcyBpbnB1dCxjcmVhdGVzIGFuCi0JICogSW5wdXRTdHJlYW0gZnJvbSB0aGUgZmlsZSwgY3JlYXRlIGEgdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZQotCSAqIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIGZpbGUgbmFtZSdzIGZpbGUgZXh0ZW5zaW9uLCBjbGVhbnVwcyB0aGUgd2hvbGUKLQkgKiBtb2RlbCwgdGhlbiByZWxlYXNlcyB0aGUgbW9kZWwuIFRoZSBmaWxlIGlzIHVwZGF0ZWQgd2hlbiB0aGUgbGFzdAotCSAqIHJlZmVyZW5jZSBvZiB0aGUgbW9kZWwgaXMgcmVsZWFzZWQgaW4gdGhlIG1vZGVsIG1hbmFnZXIuCi0JICovCi0Jdm9pZCBjbGVhbnVwRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYSBmaWxlIG5hbWUgYXMgaW5wdXQsY3JlYXRlcyBhbgotCSAqIElucHV0U3RyZWFtIGZyb20gdGhlIGZpbGUsIGNyZWF0ZSBhIHRlbXBvcmFyeSBtb2RlbCBvZiBjb250ZW50IHR5cGUKLQkgKiBjYWxjdWxhdGVkIHVzaW5nIHRoZSBmaWxlIG5hbWUncyBmaWxlIGV4dGVuc2lvbiwgY2xlYW51cHMgdGhlIG1vZGVsCi0JICogd2l0aGluIHN0YXJ0IGFuZCBsZW5ndGgsIHRoZW4gcmVsZWFzZXMgdGhlIG1vZGVsLiBUaGUgZmlsZSBpcyB1cGRhdGVkCi0JICogd2hlbiB0aGUgbGFzdCByZWZlcmVuY2Ugb2YgdGhlIG1vZGVsIGlzIHJlbGVhc2VkIGluIHRoZSBtb2RlbCBtYW5hZ2VyLgotCSAqLwotCXZvaWQgY2xlYW51cEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYSBtb2RlbCBhcyBpbnB1dCwgYW5kIGNsZWFudXBzCi0JICogdGhlIHdob2xlIG1vZGVsLgotCSAqLwotCXZvaWQgY2xlYW51cE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKTsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhIG1vZGVsIGFzIGlucHV0LCBhbmQgY2xlYW51cHMKLQkgKiB0aGUgbW9kZWwgd2l0aGluIHN0YXJ0IGFuZCBsZW5ndGguCi0JICovCi0Jdm9pZCBjbGVhbnVwTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIGludCBzdGFydCwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYSBub2RlIGFzIGlucHV0LCBhbmQgZm9ybWF0cwotCSAqIHRoZSBub2RlIGFuZCBhbGwgaXRzIGNoaWxkcmVuLgotCSAqLwotCXZvaWQgY2xlYW51cE5vZGUoTm9kZSBub2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODM0NDE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgewotCXByaXZhdGUgaW50IGZBdHRyTmFtZUNhc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3M7Ci0JcHJpdmF0ZSBib29sZWFuIGZDb252ZXJ0RU9MQ29kZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZkVPTENvZGU7Ci0JcHJpdmF0ZSBib29sZWFuIGZGb3JtYXRTb3VyY2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJbnNlcnRNaXNzaW5nVGFnczsKLQlwcml2YXRlIGJvb2xlYW4gZkluc2VydFJlcXVpcmVkQXR0cnM7Ci0JLy9wcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZlByZWZlcmVuY2VTdG9yZSA9IG51bGw7Ci0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBmUHJlZmVyZW5jZXMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmUXVvdGVBdHRyVmFsdWVzOwotCi0JcHJpdmF0ZSBpbnQgZlRhZ05hbWVDYXNlOwotCi0JcHVibGljIGludCBnZXRBdHRyTmFtZUNhc2UoKSB7Ci0KLQkJcmV0dXJuIGZBdHRyTmFtZUNhc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKCkgewotCi0JCXJldHVybiBmQ29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldENvbnZlcnRFT0xDb2RlcygpIHsKLQotCQlyZXR1cm4gZkNvbnZlcnRFT0xDb2RlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVPTENvZGUoKSB7Ci0KLQkJcmV0dXJuIGZFT0xDb2RlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEZvcm1hdFNvdXJjZSgpIHsKLQotCQlyZXR1cm4gZkZvcm1hdFNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRJbnNlcnRNaXNzaW5nVGFncygpIHsKLQotCQlyZXR1cm4gZkluc2VydE1pc3NpbmdUYWdzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEluc2VydFJlcXVpcmVkQXR0cnMoKSB7Ci0KLQkJcmV0dXJuIGZJbnNlcnRSZXF1aXJlZEF0dHJzOwotCX0KLQotCXB1YmxpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQotCQlpZiAoZlByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZQcmVmZXJlbmNlcyA9IFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCX0KLQkJcmV0dXJuIGZQcmVmZXJlbmNlczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRRdW90ZUF0dHJWYWx1ZXMoKSB7Ci0KLQkJcmV0dXJuIGZRdW90ZUF0dHJWYWx1ZXM7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWdOYW1lQ2FzZSgpIHsKLQotCQlyZXR1cm4gZlRhZ05hbWVDYXNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJOYW1lQ2FzZShpbnQgYXR0ck5hbWVDYXNlKSB7Ci0KLQkJZkF0dHJOYW1lQ2FzZSA9IGF0dHJOYW1lQ2FzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MoYm9vbGVhbiBjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MpIHsKLQotCQlmQ29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzID0gY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRFT0xDb2Rlcyhib29sZWFuIGNvbnZlcnRFT0xDb2RlcykgewotCi0JCWZDb252ZXJ0RU9MQ29kZXMgPSBjb252ZXJ0RU9MQ29kZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RU9MQ29kZShTdHJpbmcgRU9MQ29kZSkgewotCi0JCWZFT0xDb2RlID0gRU9MQ29kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb3JtYXRTb3VyY2UoYm9vbGVhbiBmb3JtYXRTb3VyY2UpIHsKLQotCQlmRm9ybWF0U291cmNlID0gZm9ybWF0U291cmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluc2VydE1pc3NpbmdUYWdzKGJvb2xlYW4gaW5zZXJ0TWlzc2luZ1RhZ3MpIHsKLQotCQlmSW5zZXJ0TWlzc2luZ1RhZ3MgPSBpbnNlcnRNaXNzaW5nVGFnczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRSZXF1aXJlZEF0dHJzKGJvb2xlYW4gaW5zZXJ0UmVxdWlyZWRBdHRycykgewotCi0JCWZJbnNlcnRSZXF1aXJlZEF0dHJzID0gaW5zZXJ0UmVxdWlyZWRBdHRyczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlcyhQcmVmZXJlbmNlcyBwcmVmcykgewotCi0JCWZQcmVmZXJlbmNlcyA9IHByZWZzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFF1b3RlQXR0clZhbHVlcyhib29sZWFuIHF1b3RlQXR0clZhbHVlcykgewotCi0JCWZRdW90ZUF0dHJWYWx1ZXMgPSBxdW90ZUF0dHJWYWx1ZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFnTmFtZUNhc2UoaW50IHRhZ05hbWVDYXNlKSB7Ci0KLQkJZlRhZ05hbWVDYXNlID0gdGFnTmFtZUNhc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL1N0cnVjdHVyZWRDb250ZW50Q2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMDZjYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL1N0cnVjdHVyZWRDb250ZW50Q2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotcHVibGljIGludGVyZmFjZSBTdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVyIHsKLQotCUlTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBnZXRDbGVhbnVwUHJvY2Vzc29yKFN0cmluZyBjb250ZW50VHlwZSk7Ci0KLQl2b2lkIHNldENsZWFudXBQcm9jZXNzb3IoSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IsIFN0cmluZyBjb250ZW50VHlwZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2E2MjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlckltcGwgaW1wbGVtZW50cyBTdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVyIHsKLQlwcm90ZWN0ZWQgTWFwIGZDbGVhbnVwUHJvY2Vzc29yczsKLQotCXB1YmxpYyBJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZ2V0Q2xlYW51cFByb2Nlc3NvcihTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChjb250ZW50VHlwZSk7Ci0KLQkJaWYgKGZDbGVhbnVwUHJvY2Vzc29ycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIChJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IpIGZDbGVhbnVwUHJvY2Vzc29ycy5nZXQoY29udGVudFR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsZWFudXBQcm9jZXNzb3IoSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRlbnRUeXBlKTsKLQotCQlpZiAoZkNsZWFudXBQcm9jZXNzb3JzID09IG51bGwpCi0JCQlmQ2xlYW51cFByb2Nlc3NvcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCWlmIChmQ2xlYW51cFByb2Nlc3NvcnMgPT0gbnVsbCkKLQkJCWZDbGVhbnVwUHJvY2Vzc29ycy5yZW1vdmUoY29udGVudFR5cGUpOwotCQllbHNlCi0JCQlmQ2xlYW51cFByb2Nlc3NvcnMucHV0KGNvbnRlbnRUeXBlLCBjbGVhbnVwUHJvY2Vzc29yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0Fic3RyYWN0RG9jdW1lbnRMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQWJzdHJhY3REb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTk5NTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQWJzdHJhY3REb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkUmVhZGVyQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYSBmaWxlIGFuZCBjcmVhdGVzIGFuIFN0cnVjdHVyZWQgTW9kZWwuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERvY3VtZW50TG9hZGVyIGltcGxlbWVudHMgSURvY3VtZW50TG9hZGVyIHsKLQotCXByaXZhdGUgQ29kZWRSZWFkZXJDcmVhdG9yIGZDb2RlZFJlYWRlckNyZWF0b3I7Ci0JcHJvdGVjdGVkIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCS8vIHByaXZhdGUgYm9vbGVhbiBmUHJvcGVydGllc09idGFpbmVkOwotCi0JcHJvdGVjdGVkIEVuY29kaW5nTWVtZW50byBmRW5jb2RpbmdNZW1lbnRvOwotCXByb3RlY3RlZCBSZWFkZXIgZkZ1bGxQcmVwYXJlZFJlYWRlcjsKLQotCS8qKgotCSAqIEFic3RyYWN0TG9hZGVyIGNvbnN0cnVjdG9yIGFsc28gaW5pdGlhbGl6ZXMgZW5jb2RpbmcgY29udmVydGVyL21hcHBlcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdERvY3VtZW50TG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdCdWZmZXIgY29udmVydExpbmVEZWxpbWl0ZXJzKFN0cmluZ0J1ZmZlciBhbGxUZXh0QnVmZmVyLCBTdHJpbmcgbGluZURlbGltaXRlclRvVXNlKSB7Ci0JCS8vIFRPRE86IGF2b2lkIHVzZSBvZiBTdHJpbmcgaW5zdGFuY2UKLQkJU3RyaW5nIGFsbFRleHQgPSBhbGxUZXh0QnVmZmVyLnRvU3RyaW5nKCk7Ci0JCUlEb2N1bWVudCB0ZW1wRG9jID0gbmV3IERvY3VtZW50KGFsbFRleHQpOwotCQlpZiAobGluZURlbGltaXRlclRvVXNlID09IG51bGwpCi0JCQlsaW5lRGVsaW1pdGVyVG9Vc2UgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIG5ld1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBsaW5lQ291bnQgPSB0ZW1wRG9jLmdldE51bWJlck9mTGluZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lQ291bnQ7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24gbGluZUluZm8gPSB0ZW1wRG9jLmdldExpbmVJbmZvcm1hdGlvbihpKTsKLQkJCQlpbnQgbGluZVN0YXJ0T2Zmc2V0ID0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQkJaW50IGxpbmVMZW5ndGggPSBsaW5lSW5mby5nZXRMZW5ndGgoKTsKLQkJCQlpbnQgbGluZUVuZE9mZnNldCA9IGxpbmVTdGFydE9mZnNldCArIGxpbmVMZW5ndGg7Ci0JCQkJbmV3VGV4dC5hcHBlbmQoYWxsVGV4dC5zdWJzdHJpbmcobGluZVN0YXJ0T2Zmc2V0LCBsaW5lRW5kT2Zmc2V0KSk7Ci0JCQkJaWYgKChpIDwgbGluZUNvdW50IC0gMSkgJiYgKHRlbXBEb2MuZ2V0TGluZURlbGltaXRlcihpKSAhPSBudWxsKSkKLQkJCQkJbmV3VGV4dC5hcHBlbmQobGluZURlbGltaXRlclRvVXNlKTsKLQkJCX0KLQkJCWNhdGNoIChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCS8vIHNob3VsZCBmaXggdXAgdG8gZWl0aGVyIHRocm93IG5vdGhpbmcsIG9yIHRoZSByaWdodCB0aGluZywKLQkJCQkvLyBidXQKLQkJCQkvLyBpbiB0aGUgY291cnNlIG9mIHJlZmFjdG9yaW5nLCB0aGlzIHdhcyBlYXNpZXN0ICJxdWljayBmaXgiLgotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1RleHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgSUVuY29kZWREb2N1bWVudCwgdGhhdCBoYXMKLQkgKiBiZWVuIGluaXRpYWxpemVkIHdpdGggYXBwcm9wcmlhdGUgcGFyc2VyLiBGb3IgbWFueSBsb2FkZXJzLCB0aGUKLQkgKiAoZGVmYXVsdCkgcGFyc2VyIHVzZWQgaXMga25vd24gZm9yIGFueSBpbnB1dC4gRm9yIG90aGVycywgdGhlIGNvcnJlY3QKLQkgKiBwYXJzZXIgKGFuZCBpdHMgaW5pdGlhbGl6YXRpb24pIGlzIG5vcm1hbGx5IGRlcGVuZGVudCBvbiB0aGUgY29udGVudCBvZgotCSAqIHRoZSBmaWxlLiBUaGlzIG5vLWFyZ3VtZW50IG1ldGhvZCBzaG91bGQgYXNzdW1lICJlbXB0eSBpbnB1dCIgYW5kIHdvdWxkCi0JICogdGhlcmVmb3JlIHJldHVybiB0aGUgZGVmYXVsdCBwYXJzZXIgZm9yIHRoZSBkZWZhdWx0IGNvbnRlbnRUeXBlLgotCSAqLwotCXB1YmxpYyBJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJSUVuY29kZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBuZXdFbmNvZGVkRG9jdW1lbnQoKTsKLQkJLy8gTWFrZSBzdXJlIGV2ZXJ5IHN0cnVjdHVyZWREb2N1bWVudCBoYXMgYW4gRW5jb2RpbmcgTWVtZW50bywKLQkJLy8gd2hpY2ggaXMgdGhlIGRlZmF1bHQgb25lIGZvciAiZW1wdHkiIHN0cnVjdHVyZWREb2N1bWVudHMKLQkJU3RyaW5nIGNoYXJzZXQgPSBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKSk7Ci0JCVN0cmluZyBzcGVjRGVmYXVsdENoYXJzZXQgPSBnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKS5nZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5zZXRFbmNvZGluZ01lbWVudG8oQ29kZWRJTy5jcmVhdGVFbmNvZGluZ01lbWVudG8oY2hhcnNldCwgRW5jb2RpbmdNZW1lbnRvLkRFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVULCBzcGVjRGVmYXVsdENoYXJzZXQpKTsKLQotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIobnVsbCk7Ci0JCWlmIChsaW5lRGVsaW1pdGVyICE9IG51bGwpCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0UHJlZmVycmVkTGluZURlbGltaXRlcihsaW5lRGVsaW1pdGVyKTsKLQotCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBkZWZhdWx0UGFydGl0aW9uZXIgPSBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lcigpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMykgewotCQkJKChJRG9jdW1lbnRFeHRlbnNpb24zKSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnNldERvY3VtZW50UGFydGl0aW9uZXIoSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORywgZGVmYXVsdFBhcnRpdGlvbmVyKTsKLQkJfQotCQllbHNlIHsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5zZXREb2N1bWVudFBhcnRpdGlvbmVyKGRlZmF1bHRQYXJ0aXRpb25lcik7Ci0JCX0KLQkJZGVmYXVsdFBhcnRpdGlvbmVyLmNvbm5lY3Qoc3RydWN0dXJlZERvY3VtZW50KTsKLQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWJzdHJhY3QgdmVyc2lvbiBzaG91bGQgaGFuZGxlIG1vc3QgY2FzZXMsIGJ1dCB3b24ndCBpZgotCSAqIGNvbnRlbnRUeXBlIGlzIHNlbnNpdGl2ZSB0byBlbmNvZGluZywgYW5kL29yIGVtYmVkZGVkIHR5cGVzCi0JICovCi0JcHVibGljIElFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJRW5jb2RlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihpRmlsZSk7Ci0JCWlmIChsaW5lRGVsaW1pdGVyICE9IG51bGwpCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0UHJlZmVycmVkTGluZURlbGltaXRlcihsaW5lRGVsaW1pdGVyKTsKLQotCQl0cnkgewotCi0JCQlDb2RlZFJlYWRlckNyZWF0b3IgY3JlYXRvciA9IGdldENvZGVkUmVhZGVyQ3JlYXRvcigpOwotCQkJY3JlYXRvci5zZXQoaUZpbGUpOwotCQkJZkVuY29kaW5nTWVtZW50byA9IGNyZWF0b3IuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RW5jb2RpbmdNZW1lbnRvKGZFbmNvZGluZ01lbWVudG8pOwotCQkJZkZ1bGxQcmVwYXJlZFJlYWRlciA9IGdldENvZGVkUmVhZGVyQ3JlYXRvcigpLmdldENvZGVkUmVhZGVyKCk7Ci0KLQkJCXNldERvY3VtZW50Q29udGVudHNGcm9tUmVhZGVyKHN0cnVjdHVyZWREb2N1bWVudCwgZkZ1bGxQcmVwYXJlZFJlYWRlcik7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoZkZ1bGxQcmVwYXJlZFJlYWRlciAhPSBudWxsKSB7Ci0JCQkJZkZ1bGxQcmVwYXJlZFJlYWRlci5jbG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoZmlsZW5hbWUsIGlucHV0U3RyZWFtLCBFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0JfQotCi0JcHVibGljIElFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlbmFtZSA9PSBudWxsICYmIGlucHV0U3RyZWFtID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgaGF2ZSBib3RoIG51bGwgZmlsZW5hbWUgYW5kIGlucHV0c3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJRW5jb2RlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb2RlZFJlYWRlckNyZWF0b3IgY29kZWRSZWFkZXJDcmVhdG9yID0gZ2V0Q29kZWRSZWFkZXJDcmVhdG9yKCk7Ci0JCXRyeSB7Ci0JCQljb2RlZFJlYWRlckNyZWF0b3Iuc2V0KGZpbGVuYW1lLCBpbnB1dFN0cmVhbSk7Ci0JCQljb2RlZFJlYWRlckNyZWF0b3Iuc2V0RW5jb2RpbmdSdWxlKGVuY29kaW5nUnVsZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gY29kZWRSZWFkZXJDcmVhdG9yLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkJZkZ1bGxQcmVwYXJlZFJlYWRlciA9IGNvZGVkUmVhZGVyQ3JlYXRvci5nZXRDb2RlZFJlYWRlcigpOwotCQkJc3RydWN0dXJlZERvY3VtZW50LnNldEVuY29kaW5nTWVtZW50byhmRW5jb2RpbmdNZW1lbnRvKTsKLQkJCXNldERvY3VtZW50Q29udGVudHNGcm9tUmVhZGVyKHN0cnVjdHVyZWREb2N1bWVudCwgZkZ1bGxQcmVwYXJlZFJlYWRlcik7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSBpbiB0aGlzIGNvbnRleHQKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChmRnVsbFByZXBhcmVkUmVhZGVyICE9IG51bGwpIHsKLQkJCQlmRnVsbFByZXBhcmVkUmVhZGVyLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXByaXZhdGUgaW50IGdldENoYXJQb3N0aW9uT2ZGYWlsdXJlKEJ1ZmZlcmVkUmVhZGVyIGlucHV0U3RyZWFtKSB7Ci0JCWludCBjaGFyUG9zaXRpb24gPSAxOwotCQlpbnQgY2hhclJlYWQgPSAtMTsKLQkJYm9vbGVhbiBlcnJvckZvdW5kID0gZmFsc2U7Ci0JCWRvIHsKLQkJCXRyeSB7Ci0JCQkJY2hhclJlYWQgPSBpbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCQkJY2hhclBvc2l0aW9uKys7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIHRoaXMgaXMgZXhwZWN0ZWQsIHNpbmNlIHdlJ3JlIGV4cGVjdGluZyBmYWlsdXJlLAotCQkJCS8vIHNvIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcuCi0JCQkJZXJyb3JGb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKCEoY2hhclJlYWQgPT0gLTEgfHwgZXJyb3JGb3VuZCkpOwotCi0JCWlmIChlcnJvckZvdW5kKQotCQkJLy8gZG13LCBibGluZGx5IG1vZGlmaWVkIHRvICsxIHRvIGdldCB1bml0IHRlc3RzIHRvIHdvcmssIG1vdmluZwotCQkJLy8gZnJvbSBKYXZhIDEuMywgdG8gMS40Ci0JCQkvLyBub3Qgc3VyZSBob3cvd2h5IHRoaXMgYmVoYXZpb3Igd291bGQgaGF2ZSBjaGFuZ2VkLiAoSXRzIGFzIGlmCi0JCQkvLyAncmVhZCcgaXMgcmVwb3J0aW5nIGVycm9yCi0JCQkvLyBvbmUgY2hhcmFjdGVyIGVhcmx5KS4KLQkJCXJldHVybiBjaGFyUG9zaXRpb24gKyAxOwotCQllbHNlCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjb2RlZFJlYWRlckNyZWF0b3IuCi0JICovCi0JcHJvdGVjdGVkIENvZGVkUmVhZGVyQ3JlYXRvciBnZXRDb2RlZFJlYWRlckNyZWF0b3IoKSB7Ci0JCWlmIChmQ29kZWRSZWFkZXJDcmVhdG9yID09IG51bGwpIHsKLQkJCWZDb2RlZFJlYWRlckNyZWF0b3IgPSBuZXcgQ29kZWRSZWFkZXJDcmVhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGZDb2RlZFJlYWRlckNyZWF0b3I7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgcGFydGl0aW9uZXIgdG8gYmUgdXNlZCB3aXRoIHRoZQotCSAqIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcgcGFydGl0aW9uaW5nCi0JICogCi0JICogQHJldHVybiBJRG9jdW1lbnRQYXJ0aXRpb25lcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5jb2RpbmdNZW1lbnRvLgotCSAqIAotCSAqIEByZXR1cm4gRW5jb2RpbmdNZW1lbnRvCi0JICovCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb2dyYW0gRXJyb3I6IGVuY29kaW5nTWVtZW50byB3YXMgYWNjZXNzZWQgYmVmb3JlIGl0IHdhcyBzZXQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmRW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZnVsbFByZXBhcmVkUmVhZGVyLgotCSAqLwotCXByb3RlY3RlZCBSZWFkZXIgZ2V0RnVsbFByZXBhcmVkUmVhZGVyKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZGdWxsUHJlcGFyZWRSZWFkZXIgPT0gbnVsbCkgewotCQkJZkZ1bGxQcmVwYXJlZFJlYWRlciA9IGdldENvZGVkUmVhZGVyQ3JlYXRvcigpLmdldENvZGVkUmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZGdWxsUHJlcGFyZWRSZWFkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBsaW5lIGRlbGltaXRlciBwcmVmZXJlbmNlIGZvciB0aGUgZ2l2ZW4gZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIGZpbGUKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGxpbmUgZGVsaW1pdGVyCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFBsYXRmb3JtTGluZURlbGltaXRlclByZWZlcmVuY2UoSUZpbGUgZmlsZSkgewotCQlJU2NvcGVDb250ZXh0W10gc2NvcGVDb250ZXh0OwotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCS8vIHByb2plY3QgcHJlZmVyZW5jZQotCQkJc2NvcGVDb250ZXh0ID0gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgUHJvamVjdFNjb3BlKGZpbGUuZ2V0UHJvamVjdCgpKX07Ci0JCQlTdHJpbmcgbGluZURlbGltaXRlciA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFN0cmluZyhQbGF0Zm9ybS5QSV9SVU5USU1FLCBQbGF0Zm9ybS5QUkVGX0xJTkVfU0VQQVJBVE9SLCBudWxsLCBzY29wZUNvbnRleHQpOwotCQkJaWYgKGxpbmVEZWxpbWl0ZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbGluZURlbGltaXRlcjsKLQkJfQotCQkvLyB3b3Jrc3BhY2UgcHJlZmVyZW5jZQotCQlzY29wZUNvbnRleHQgPSBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBJbnN0YW5jZVNjb3BlKCl9OwotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0U3RyaW5nKFBsYXRmb3JtLlBJX1JVTlRJTUUsIFBsYXRmb3JtLlBSRUZfTElORV9TRVBBUkFUT1IsIG51bGwsIHNjb3BlQ29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoSUZpbGUpIGluc3RlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKG51bGwpOwotCX0KLQotCS8qKgotCSAqIElmIHN1YmNsYXNzIGRvZXNuJ3QgaW1wbGVtZW50LCByZXR1cm4gcGxhdGZvcm0gZGVmYXVsdAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBnZXRQbGF0Zm9ybUxpbmVEZWxpbWl0ZXJQcmVmZXJlbmNlKGZpbGUpOwotCX0KLQotCS8qKgotCSAqIEEgdXRpbGl0eSBtZXRob2QsIGJ1dCBkZXBlbmRzIG9uIHN1YmNsYXNzZXMgdG8gaW1wbGltZW50IHRoZSBwcmVmZXJyZWQKLQkgKiBlbmQgb2YgbGluZSBmb3IgYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZS4gTm90ZTogc3ViY2xhc3NlcyBzaG91bGQgbm90Ci0JICogcmUtaW1wbGVtZW50IHRoaXMgbWV0aG9kICh0aGVyZSdzIG5vIHJlYXNvbiB0bywgZXZlbiB0aG91Z2ggaXRzIHBhcnQgb2YKLQkgKiBpbnRlcmZhY2UpLiBUaGlzIG1ldGhvZCBub3Qgb25seSBjb252ZXJ0cyBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzLCBpZgotCSAqIG5lZWRlZCwgYnV0IHNldHMgdGhlIGNvcnJlY3QgZW5kLW9mLWxpbmUgZGVsaW1pdGVyIGluCi0JICogc3RydWN0dXJlZERvY3VtZW50LiBNaW5vciBub3RlOiBjYW4ndCB1c2UgdGhpcyBleGFjdCBtZXRob2QgaW4gZHVtcGVycywKLQkgKiBzaW5jZSB0aGUgZGVjaXNpb24gdG8gY2hhbmdlIG9yIG5vdCBpcyBhIGxpdHRsZSBkaWZmZXJlbnQsIGFuZCBzaW5jZQotCSAqIHRoZXJlIHdlIGhhdmUgdG8gY2hhbmdlIHRleHQgb2Ygc3RydWN0dXJlZERvY3VtZW50IGlmIGZvdW5kIHRvIG5lZWQKLQkgKiBjb252ZXJzaW9uLiAoV2hlcmUgYXMgZm9yIGxvYWRpbmcsIHdlIGFzc3VtZSB3ZSBoYXZlbid0IHlldCBzZXQgdGV4dCBpbgotCSAqIHN0cnVjdHVyZWREb2N1bWVudCwgYnV0IHdpbGwgYmUgZG9uZSBieSBvdGhlciBtZXRob2QganVzdCBhIHRpbnkgYml5Ci0JICogbGF0ZXIpLiBOZWVkcyB0byBiZSBwdWJsaWMgdG8gaGFuZGxlIGludGVyZmFjZS4gSXQgaXMgaW4gdGhlIGludGVyZmFjZQotCSAqIGp1c3Qgc28gTW9kZWxNYW5hZ2VySW1wbCBjYW4gdXNlIGl0IGluIGEgc3BlY2lhbCBjaXJjdW1zdGFuY2UuCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBoYW5kbGVMaW5lRGVsaW1pdGVyKFN0cmluZ0J1ZmZlciBvcmlnaW5hbFN0cmluZywgSUVuY29kZWREb2N1bWVudCB0aGVGbGF0TW9kZWwpIHsKLQkJLy8gVE9ETzogbmVlZCB0byBoYW5kbGUgbGluZSBkZWxpbWl0ZXJzIHNvIE1hcmtlciBQb3NpdGlvbnMgYXJlCi0JCS8vIHVwZGF0ZWQKLQkJU3RyaW5nQnVmZmVyIGNvbnZlcnRlZFRleHQgPSBudWxsOwotCQkvLyBiYXNlZCBvbiB0ZXh0LCBtYWtlIGEgZ3Vlc3Mgb24gd2hhdCdzIGJlaW5nIHVzZWQgYXMKLQkJLy8gbGluZSBkZWxpbWl0ZXIKLQkJU3RyaW5nIHByb2JhYmxlTGluZURlbGltaXRlciA9IFRleHRVdGlsaXRpZXMuZGV0ZXJtaW5lTGluZURlbGltaXRlcihvcmlnaW5hbFN0cmluZywgdGhlRmxhdE1vZGVsLmdldExlZ2FsTGluZURlbGltaXRlcnMoKSwgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcHJlZmVycmVkTGluZURlbGltaXRlciA9IGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIobnVsbCk7Ci0JCWlmIChwcmVmZXJyZWRMaW5lRGVsaW1pdGVyID09IG51bGwpIHsKLQkJCS8vIHdoZW4gcHJlZmVycmVkTGluZURlbGltaXRlciBpcyBudWxsLCBpdCBtZWFucyAibGVhdmUgYWxvbmUiCi0JCQkvLyBzbyBubyBjb252ZXJzaW9uIG5lZWRlZC4KLQkJCS8vIHNldCBoZXJlLCBvbmx5IGlmIG51bGwgKHNob3VsZCBhbHJlYWR5IGJlIHNldCwgYnV0IGlmIG5vdCwKLQkJCS8vIHdlJ2xsIHNldCBzbyBhbnkgc3Vic2VxdWVudCBlZGl0aW5nIGluc2VydHMgd2hhdCB3ZSdyZQotCQkJLy8gYXNzdW1pbmcpCi0JCQlpZiAoIXRoZUZsYXRNb2RlbC5nZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKCkuZXF1YWxzKHByb2JhYmxlTGluZURlbGltaXRlcikpIHsKLQkJCQl0aGVGbGF0TW9kZWwuc2V0UHJlZmVycmVkTGluZURlbGltaXRlcihwcm9iYWJsZUxpbmVEZWxpbWl0ZXIpOwotCQkJfQotCQkJY29udmVydGVkVGV4dCA9IG9yaWdpbmFsU3RyaW5nOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCFwcmVmZXJyZWRMaW5lRGVsaW1pdGVyLmVxdWFscyhwcm9iYWJsZUxpbmVEZWxpbWl0ZXIpKSB7Ci0JCQkJLy8gdGVjaG5pY2FsbHksIHdvdWxkbid0IGhhdmUgdG8gY29udmVydCBsaW5lIGRlbGltaXRlcnMKLQkJCQkvLyBoZXJlIGF0IGJlZ2lubmluZywgYnV0IHdoZW4gd2Ugc2F2ZSwgaWYgdGhlIHByZWZlcnJlZAotCQkJCS8vIGxpbmUgZGVsaW10ZXIgaXMgImxlYXZlIGFsb25lIiB0aGVuIHdlIGRvIGxlYXZlIGFsb25lLAotCQkJCS8vIHNvIGJlc3QgdG8gYmUgcmlnaHQgZnJvbSBiZWdpbm5pbmcuCi0JCQkJY29udmVydGVkVGV4dCA9IGNvbnZlcnRMaW5lRGVsaW1pdGVycyhvcmlnaW5hbFN0cmluZywgcHJlZmVycmVkTGluZURlbGltaXRlcik7Ci0JCQkJdGhlRmxhdE1vZGVsLnNldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIocHJlZmVycmVkTGluZURlbGltaXRlcik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB0aGV5IGFyZSBhbHJlYWR5IHRoZSBzYW1lLCBubyBjb252ZXJzaW9uIG5lZWRlZAotCQkJCXRoZUZsYXRNb2RlbC5zZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKHByZWZlcnJlZExpbmVEZWxpbWl0ZXIpOwotCQkJCWNvbnZlcnRlZFRleHQgPSBvcmlnaW5hbFN0cmluZzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udmVydGVkVGV4dDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUVuY29kZWREb2N1bWVudCBuZXdFbmNvZGVkRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIFZlcnkgbWVjaGFuaWNhbCBtZXRob2QsIGp1c3QgdG8gcmVhZCB0aGUgY2hhcmFjdGVycywgb25jZSB0aGUgcmVhZGVyIGlzCi0JICogY29ycmVjdGx5IGNyZWF0ZWQuIENhbiB0aHJvdyBNYWxGb3JtZWRJbnB1dEV4Y2VwdGlvbi4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ0J1ZmZlciByZWFkSW5wdXRTdHJlYW0oUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlpbnQgZkJsb2Nrc1JlYWQgPSAwOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbnVtUmVhZCA9IDA7Ci0JCXRyeSB7Ci0JCQljaGFyIHRCdWZmW10gPSBuZXcgY2hhcltDb2RlZElPLk1BWF9CVUZfU0laRV07Ci0JCQl3aGlsZSAobnVtUmVhZCAhPSAtMSkgewotCQkJCW51bVJlYWQgPSByZWFkZXIucmVhZCh0QnVmZiwgMCwgdEJ1ZmYubGVuZ3RoKTsKLQkJCQlpZiAobnVtUmVhZCA+IDApIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCh0QnVmZiwgMCwgbnVtUmVhZCk7Ci0JCQkJCWZCbG9ja3NSZWFkKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsKGZFbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCksIGZCbG9ja3NSZWFkICogQ29kZWRJTy5NQVhfQlVGX1NJWkUgKyBudW1SZWFkICsgZS5nZXRJbnB1dExlbmd0aCgpKTsKLQkJfQotCQljYXRjaCAoVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsKGZFbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCksIGZCbG9ja3NSZWFkICogQ29kZWRJTy5NQVhfQlVGX1NJWkUgKyBudW1SZWFkICsgZS5nZXRJbnB1dExlbmd0aCgpKTsKLQotCQl9Ci0JCXJldHVybiBidWZmZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsb2FkKElFbmNvZGVkRG9jdW1lbnQgZW5jb2RlZERvY3VtZW50LCBSZWFkZXIgaW5wdXRTdHJlYW1SZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpbnB1dFN0cmVhbVJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdHJlYW0gcmVhZGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaW50IFJFQURfQlVGRkVSX1NJWkUgPSA4MTkyOwotCQlpbnQgTUFYX0JVRkZFUkVEX1NJWkVfRk9SX1JFU0VUX01BUksgPSAyMDAwMDA7Ci0JCS8vIHRlbXAgLi4uLiBldmVudHVhbGx5IHdlJ2xsbCBvbmx5IHJlYWQgYXMgbmVlZGVkCi0JCUJ1ZmZlcmVkUmVhZGVyIGJ1ZmZlcmVkUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlucHV0U3RyZWFtUmVhZGVyLCBNQVhfQlVGRkVSRURfU0laRV9GT1JfUkVTRVRfTUFSSyk7Ci0JCWJ1ZmZlcmVkUmVhZGVyLm1hcmsoTUFYX0JVRkZFUkVEX1NJWkVfRk9SX1JFU0VUX01BUkspOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0cnkgewotCQkJaW50IG51bVJlYWQgPSAwOwotCQkJY2hhciB0QnVmZltdID0gbmV3IGNoYXJbUkVBRF9CVUZGRVJfU0laRV07Ci0JCQl3aGlsZSAoKG51bVJlYWQgPSBidWZmZXJlZFJlYWRlci5yZWFkKHRCdWZmLCAwLCB0QnVmZi5sZW5ndGgpKSAhPSAtMSkgewotCQkJCWJ1ZmZlci5hcHBlbmQodEJ1ZmYsIDAsIG51bVJlYWQpOwotCQkJfQotCQkJLy8gcmVtZW1iZXIgLS0gd2UgZGlkbid0IG9wZW4gc3RyZWFtIC4uLiBzbyB3ZSBkb24ndCBjbG9zZSBpdAotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbnQgcG9zID0gZS5nZXRJbnB1dExlbmd0aCgpOwotCQkJRW5jb2RpbmdNZW1lbnRvIGxvY2FsRW5jb2RpbmdNZW1lbnRvID0gZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlib29sZWFuIGNvdWxkUmVzZXQgPSB0cnVlOwotCQkJU3RyaW5nIGVuY29kaW5nTmFtZUluRXJyb3IgPSBsb2NhbEVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQkJCWlmIChlbmNvZGluZ05hbWVJbkVycm9yID09IG51bGwpIHsKLQkJCQllbmNvZGluZ05hbWVJbkVycm9yID0gbG9jYWxFbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlidWZmZXJlZFJlYWRlci5yZXNldCgpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIHJlc2V0RXhjZXB0aW9uKSB7Ci0JCQkJLy8gdGhlIG9ubHkgZXJycm8gdGhhdCBjYW4gb2NjdXIgZHVyaW5nIHJlc2V0IGlzIGFuCi0JCQkJLy8gSU9FeGNlcHRpb24KLQkJCQkvLyBkdWUgdG8gYWxyZWFkeSBiZWluZyBwYXN0IHRoZSByZXN0IG1hcmsuIEluIHRoYXQgY2FzZSwgd2UKLQkJCQkvLyB0aHJvdyBtb3JlIGdlbmVyaWMgbWVzc2FnZQotCQkJCWNvdWxkUmVzZXQgPSBmYWxzZTsKLQkJCX0KLQkJCS8vIC0xIGNhbiBiZSB1c2VkIGJ5IFVJIGxheWVyIGFzIGEgY29kZSB0aGF0ICJwb3NpdGlvbiBjb3VsZCBub3QKLQkJCS8vIGJlCi0JCQkvLyBkZXRlcm1pbmVkIgotCQkJaW50IGNoYXJQb3N0aW9uID0gLTE7Ci0JCQlpZiAoY291bGRSZXNldCkgewotCi0JCQkJY2hhclBvc3Rpb24gPSBnZXRDaGFyUG9zdGlvbk9mRmFpbHVyZShidWZmZXJlZFJlYWRlcik7Ci0JCQkJLy8gZ2V0Q2hhclBvc3Rpb25PZkZhaWx1cmUobmV3IElucHV0U3RyZWFtUmVhZGVyKGluU3RyZWFtLAotCQkJCS8vIGphdmFFbmNvZGluZ05hbWVJbkVycm9yKSk7Ci0JCQl9Ci0JCQkvLyBhbGwgb2YgdGhhdCBqdXN0IHRvIHRocm93IG1vcmUgYWNjdXJhdGUgZXJyb3IKLQkJCS8vIG5vdGU6IHdlIGRvIHRoZSBjb252ZXJzaW9uIHRvIGlhbmFOYW1lLCBpbnN0ZWFkIG9mIHVzaW5nIHRoZQotCQkJLy8gbG9jYWwKLQkJCS8vIHZhcmlhYmxlLAotCQkJLy8gYmVjYXVzZSB0aGlzIGlzIHVsdGltYXRlbHkgb25seSBmb3IgdGhlIHVzZXIgZXJyb3IgbWVzc2FnZQotCQkJLy8gKHRoYXQKLQkJCS8vIGlzLAotCQkJLy8gdGhlIGVycm9yIG9jY3VycmVkCi0JCQkvLyBpbiBjb250ZXh0IG9mIGphdmFFbmNvZGluZ05hbWUgbm8gbWF0dGVyIHdoYXQgaWFuYUVuY29kaW5nTmFtZQotCQkJLy8gaXMKLQkJCXRocm93IG5ldyBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwoZW5jb2RpbmdOYW1lSW5FcnJvciwgQ29kZWRJTy5nZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGVuY29kaW5nTmFtZUluRXJyb3IpLCBjaGFyUG9zdGlvbiwgIWNvdWxkUmVzZXQsIE1BWF9CVUZGRVJFRF9TSVpFX0ZPUl9SRVNFVF9NQVJLKTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgc3RyaW5nYnVmZmVyID0gYnVmZmVyOwotCQllbmNvZGVkRG9jdW1lbnQuc2V0KHN0cmluZ2J1ZmZlci50b1N0cmluZygpKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50Q29udGVudHNGcm9tUmVhZGVyKElFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCVN0cmluZ0J1ZmZlciBhbGxUZXh0ID0gcmVhZElucHV0U3RyZWFtKHJlYWRlcik7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5zZXQoYWxsVGV4dC50b1N0cmluZygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMjgwMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci0KLS8qKgotICogQSBqYXZhLmlvLlJlYWRlciB0aGF0IGNhbiBvcGVyYXRlIG9mZiBvZiBhbiBJRG9jdW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIGludCBtYXJrID0gMDsKLQlwcml2YXRlIGludCBwb3NpdGlvbiA9IDA7Ci0KLQlwdWJsaWMgRG9jdW1lbnRSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIERvY3VtZW50UmVhZGVyKElEb2N1bWVudCBkb2N1bWVudCkgewotCQl0aGlzKGRvY3VtZW50LCAwKTsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnRSZWFkZXIoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgaW5pdGlhbFBvc2l0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlwb3NpdGlvbiA9IGluaXRpYWxQb3NpdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLlJlYWRlciNtYXJrKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkQWhlYWRMaW1pdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJbWFyayA9IHBvc2l0aW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZChjaGFyW10gY2J1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYoZkRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCQotCQljaGFyW10gcmVhZENoYXJzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChwb3NpdGlvbiA+PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0JCQkJcmV0dXJuIC0xOwotCQkJLy8gdGhlIElEb2N1bWVudCBpcyBsaWtlbHkgdXNpbmcgYSBHYXBUZXh0U3RvcmUsIHNvIHdlIGNhbid0Ci0JCQkvLyByZXRyaWV2ZSBhIGNoYXJbXSBkaXJlY3RseQotCQkJaWYgKHBvc2l0aW9uICsgbGVuID4gZkRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJCXJlYWRDaGFycyA9IGZEb2N1bWVudC5nZXQocG9zaXRpb24sIGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIHBvc2l0aW9uKS50b0NoYXJBcnJheSgpOwotCQkJZWxzZQotCQkJCXJlYWRDaGFycyA9IGZEb2N1bWVudC5nZXQocG9zaXRpb24sIGxlbikudG9DaGFyQXJyYXkoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocmVhZENoYXJzLCAwLCBjYnVmLCBvZmYsIHJlYWRDaGFycy5sZW5ndGgpOwotCQkJLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIiICsgcG9zaXRpb24gKyAiOiIgKyByZWFkQ2hhcnMubGVuZ3RoICsgIiAiCi0JCQkvLyArIFN0cmluZ1V0aWxzLmVzY2FwZShuZXcgU3RyaW5nKHJlYWRDaGFycykpKTsKLQkJCXBvc2l0aW9uICs9IHJlYWRDaGFycy5sZW5ndGg7Ci0JCQlyZXR1cm4gcmVhZENoYXJzLmxlbmd0aDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIHJlYWRpbmcgZnJvbSBJRG9jdW1lbnQ6ICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLlJlYWRlciNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlwb3NpdGlvbiA9IG1hcms7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgaW5pdGlhbFBvc2l0aW9uKSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlwb3NpdGlvbiA9IGluaXRpYWxQb3NpdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uUmVhZGVyI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChpbnQgcG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlwb3NpdGlvbiA9IHBvczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uUmVhZGVyI3NraXAobG9uZykKLQkgKi8KLQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYoZkRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQotCQlsb25nIHNraXBwZWQgPSBuOwotCQlpZiAocG9zaXRpb24gKyBuID4gZkRvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQlza2lwcGVkID0gZkRvY3VtZW50LmdldExlbmd0aCgpIC0gcG9zaXRpb247Ci0JCQlwb3NpdGlvbiA9IGZEb2N1bWVudC5nZXRMZW5ndGgoKTsKLQkJfSBlbHNlIHsKLQkJCXBvc2l0aW9uICs9IG47Ci0JCX0KLQkJcmV0dXJuIHNraXBwZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSURvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYThiMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLQotcHVibGljIGludGVyZmFjZSBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZXh0ZW5kcyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCXZvaWQgc2V0KElEb2N1bWVudCBkb2N1bWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lEb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JRG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdlZmYxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lEb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLQotCi0vKioKLSAqIFByb3ZpZGVzIG1ldGhvZHMgZm9yIHRoZSBjcmVhdGlvbiBvZiBhbiBJU3RydWN0dXJlZERvY3VtZW50IGNvcnJlY3RseQotICogcHJlcGFyZWQgdG8gd29yayB3aXRoIGEgcGFydGljdWxhciB0eXBlIG9mIGNvbnRlbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURvY3VtZW50TG9hZGVyIHsKLQotCS8qKgotCSAqIEByZXR1cm4gYSBuZXcgSVN0cnVjdHVyZWREb2N1bWVudCBwcmVwYXJlZCBieSB0aGlzIGxvYWRlcgotCSAqLwotCUlFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBUaGlzIEFQSSBpcyBsaWtlIGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCwgZXhjZXB0IGl0IHNob3VsZCBwb3B1bGF0ZQotCSAqIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQgd2l0aCB0aGUgY29udGVudHMgb2YgSUZpbGUuIEFsc28sIHRob3NlCi0JICogU3RydWN0dXJlZERvY3VtZW50cyB3aGljaCBhcmUgc2Vuc2l0aXZlIHRvIHRoZSBpbnB1dCAodGhhdCBpcywgdGhlCi0JICogcGFyc2VyIG9yIHBhcnNlciBpbml0aWFsaXphdGlvbiBteSByZXF1aXJlIHRoZSBpbnB1dCkgc2hvdWxkCi0JICogYWRkaXRpb25hbGx5IGluaXRpYWxpemUgdGhlIHBhcnNlciwgZXRjLiwgYXBwcm9wcmlhdGUgdG8gdGhlIGlucHV0LgotCSAqIAotCSAqIEFzIGFsd2F5cywgdGhlIGFwcHJvcHJpYXRlIGRlY29kaW5nIHNob3VsZCBiZSB1c2VkLgotCSAqLwotCUlFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KElGaWxlIGlGaWxlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIElFbmNvZGVkRG9jdW1lbnQsIHRoYXQgaGFzCi0JICogYmVlbiBpbml0aWFsaXplZCB3aXRoIGFwcHJvcHJpYXRlIHBhcnNlci4gRm9yIG1hbnkgbG9hZGVycywgdGhlCi0JICogKGRlZmF1bHQpIHBhcnNlciB1c2VkIGlzIGtub3duIGZvciBhbnkgaW5wdXQuIEZvciBvdGhlcnMsIHRoZSBjb3JyZWN0Ci0JICogcGFyc2VyIChhbmQgaXRzIGluaXRpYWxpemF0aW9uKSBpcyBub3JtYWxseSBkZXBlbmRlbnQgb24gdGhlIGNvbnRlbnQgb2YKLQkgKiB0aGUgZmlsZS4gVGhpcyBuby1hcmd1bWVudCBtZXRob2Qgc2hvdWxkIGFzc3VtZSAiZW1wdHkgaW5wdXQiIGFuZCB3b3VsZAotCSAqIHRoZXJlZm9yZSByZXR1cm4gdGhlIGRlZmF1bHQgcGFyc2VyIGZvciB0aGUgZGVmYXVsdCBjb250ZW50VHlwZS4KLQkgKi8KLQlJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlzdHJlYW0pIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0JSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpc3RyZWFtLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50IHBhcnRpdGlvbmVyCi0JICovCi0JSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKTsKLQotCUlEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKTsKLQotCS8qKgotCSAqIEEgdXRpbGl0eSBtZXRob2QsIGJ1dCBkZXBlbmRzIG9uIHN1YmNsYXNzZXMgdG8gaW1wbGVtZW50IHRoZSBwcmVmZXJyZWQKLQkgKiBlbmQgb2YgbGluZSBmb3IgYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZS4gTm90ZTogc3ViY2xhc3NlcyBzaG91bGQgbm90Ci0JICogcmUtaW1wbGVtZW50IHRoaXMgbWV0aG9kICh0aGVyZSdzIG5vIHJlYXNvbiB0bywgZXZlbiB0aG91Z2ggaXRzIHBhcnQgb2YKLQkgKiBpbnRlcmZhY2UpLiBUaGlzIG1ldGhvZCBub3Qgb25seSBjb252ZXJ0cyBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzLCBpZgotCSAqIG5lZWRlZCwgYnV0IHNldHMgdGhlIGNvcnJlY3QgZW5kLW9mLWxpbmUgZGVsaW1pdGVyIGluCi0JICogc3RydWN0dXJlZERvY3VtZW50LiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgZWl0aGVyIHRoZSBvcmlnaW5hbCBzdHJpbmcsCi0JICogaWYgbm8gY29udmVyc2lvbiBpcyBuZWVkZWQsIG9yIGEgbmV3IHN0cmluZyB3aXRoIGVuZC1vZi1saW5lcwotCSAqIGNvbnZlcnRlZC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtIHRoZSBjb250ZW50J3MgbGluZSBkZWxpbWl0ZXJzIHNob3VsZCBiZSBwcmVzZXJ2ZWQKLQkgKi8KLQlTdHJpbmdCdWZmZXIgaGFuZGxlTGluZURlbGltaXRlcihTdHJpbmdCdWZmZXIgb3JpZ2luYWxTdHJpbmcsIElFbmNvZGVkRG9jdW1lbnQgdGhlU3RydWN0dXJlZERvY3VtZW50KTsKLQotCXZvaWQgcmVsb2FkKElFbmNvZGVkRG9jdW1lbnQgZG9jdW1lbnQsIFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNjE4ZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudDsKLQotCi0vKioKLSAqIEF0IHRoZSBtb21lbnQsIHRoaXMgaXMgcHJpbWFyaWx5IGludGVuZGVkIGFzIGEgY29udmVuaWVuY2UgdG8gaGVscCBzd2l0Y2gKLSAqIGJldHdlZW4gdmFyaW91cyB0eXBlcyBvZiB0aHJlYWRpbmcgbW9kZWxzIGluIHRoZSBkb2N1bWVudCwgYWxsIGluIGEgY2VudHJhbAotICogcGllY2Ugb2YgY29kZS4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXUklURV9TWU5DSFJPTklaRUQgPSAzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUID0gV1JJVEVfU1lOQ0hST05JWkVEOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTlNZTkNIUk9OSVpFRCA9IDE7Ci0KLQlwcml2YXRlIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKGludCB0eXBlLCBSZWdpb25QYXJzZXIgcGFyc2VyKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIFVOU1lOQ0hST05JWkVEIDoKLQkJCQlyZXN1bHQgPSBuZXcgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQocGFyc2VyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgV1JJVEVfU1lOQ0hST05JWkVEIDoKLQkJCQlyZXN1bHQgPSBuZXcgSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudChwYXJzZXIpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZXF1ZXN0IGRvY3VtZW50IHR5cGUgd2FzIG5vdCBrbm93biIpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIHRoZSAoc3lzdGVtIGRlZmF1bHQpIHN0cnVjdHVyZWQgZG9jdW1lbnQgaW5pdGlhbGl6ZWQgd2l0aCB0aGUKLQkgKiBwYXJzZXIuCi0JICogCi0JICogQHBhcmFtIHBhcnNlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoUmVnaW9uUGFyc2VyIHBhcnNlcikgewotCQlyZXR1cm4gZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoREVGQVVMVCwgcGFyc2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkCi0JICogCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGV4dFV0aWxpdGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UZXh0VXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZWM1OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UZXh0VXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0vKioKLSAqIENvbGxlY3Rpb24gb2YgdGV4dCBmdW5jdGlvbnMuCi0gKiAKLSAqIEBkZXByZWNhdGVkIC0gbWFya2VkIGFzIGRlcHJlY2F0ZWQgdG8gcmVtaW5kIHVzIHRvIHBoYXNlIHRoaXMgb3V0IChhbmQvb3IKLSAqICAgICAgICAgICAgIG1vdmUgdG8gImZpbmlzaGVkIiB2ZXJzaW9uKS4KLSAqLwotcHVibGljIGNsYXNzIFRleHRVdGlsaXRpZXMgewotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgaWYgcG9zc2libGUsIGl0cyBiZXN0IHRvIHVzZQotCSAqICAgICAgICAgICAgIElEb2N1bWVudC5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZ1tdIGZnRGVsaW1pdGVycyA9IG5ldyBTdHJpbmdbXXsiXG4iLCAiXHIiLCAiXHJcbiJ9Oy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGljaCBvbmUgb2YgZmdEZWxpbWl0ZXJzIGFwcGVhcnMgZmlyc3QgaW4gdGhlIHRleHQuIElmIG5vbmUKLQkgKiBvZiB0aGVtIHRoZSBoaW50IGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRldGVybWluZUxpbmVEZWxpbWl0ZXIoU3RyaW5nQnVmZmVyIHRleHRCdWZmZXIsIFN0cmluZ1tdIHBvc3NpYmxlcywgU3RyaW5nIGhpbnQpIHsKLQkJdHJ5IHsKLQkJCS8vIFRPRE86IGF2b2lkIHVzZSBvZiBTdHJpbmcgaW5zdGFuY2UKLQkJCVN0cmluZyB0ZXh0ID0gdGV4dEJ1ZmZlci50b1N0cmluZygpOwotCQkJaW50W10gaW5mbyA9IGluZGV4T2YocG9zc2libGVzLCB0ZXh0LCAwKTsKLQkJCXJldHVybiBwb3NzaWJsZXNbaW5mb1sxXV07Ci0JCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB4KSB7Ci0JCX0KLQkJcmV0dXJuIGhpbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcG9zaXRpb24gaW4gdGhlIHN0cmluZyBncmVhdGVyIHRoYW4gb2Zmc2V0IG9mIHRoZSBsb25nZXN0Ci0JICogbWF0Y2hpbmcgc2VhcmNoIHN0cmluZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBpbmRleE9mKFN0cmluZ1tdIHNlYXJjaFN0cmluZ3MsIFN0cmluZyB0ZXh0LCBpbnQgb2Zmc2V0KSB7Ci0KLQkJaW50W10gcmVzdWx0ID0gey0xLCAtMX07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgaW5kZXggPSB0ZXh0LmluZGV4T2Yoc2VhcmNoU3RyaW5nc1tpXSwgb2Zmc2V0KTsKLQkJCWlmIChpbmRleCA+PSAwKSB7Ci0KLQkJCQlpZiAocmVzdWx0WzBdID09IC0xKSB7Ci0JCQkJCXJlc3VsdFswXSA9IGluZGV4OwotCQkJCQlyZXN1bHRbMV0gPSBpOwotCQkJCX0gZWxzZSBpZiAoaW5kZXggPCByZXN1bHRbMF0pIHsKLQkJCQkJcmVzdWx0WzBdID0gaW5kZXg7Ci0JCQkJCXJlc3VsdFsxXSA9IGk7Ci0JCQkJfSBlbHNlIGlmIChpbmRleCA9PSByZXN1bHRbMF0gJiYgc2VhcmNoU3RyaW5nc1tpXS5sZW5ndGgoKSA+IHNlYXJjaFN0cmluZ3NbcmVzdWx0WzFdXS5sZW5ndGgoKSkgewotCQkJCQlyZXN1bHRbMF0gPSBpbmRleDsKLQkJCQkJcmVzdWx0WzFdID0gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9maWxlYnVmZmVycy9CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZmlsZWJ1ZmZlcnMvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NDY3YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9maWxlYnVmZmVycy9CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5Kb2JTYWZlU3RydWN0dXJlZERvY3VtZW50OwotCi0KLS8qKgotICogR2VuZXJpYyBJRG9jdW1lbnRGYWN0b3J5IGZvciBJU3RydWN0dXJlZERvY3VtZW50cyB0byBiZSB1c2VkIGJ5IHRoZQotICogb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5kb2N1bWVudENyZWF0aW9uIGV4dGVuc2lvbiBwb2ludC4gVGhpcyBjbGFzcwotICogaXMgbm90IG1lYW50IHRvIGJlIHN1YmNsYXNzZWQuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IGltcGxlbWVudHMgSURvY3VtZW50RmFjdG9yeSwgSUV4ZWN1dGFibGVFeHRlbnNpb24gewotCi0JLyoKLQkgKiBUaGUgY29udGVudCB0eXBlIElEIHVzZWQgdG8gZGVjbGFyZSB0aGlzIGZhY3Rvcnk7IGl0IGlzIHVzZWQgdG8gZmluZAotCSAqIHRoZSBjb3JyZXNwb25kaW5nIHN1cHBvcnQgZm9yIGNyZWF0aW5nIHRoZSBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZDb250ZW50VHlwZUlkZW50aWZpZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IsIG9ubHkgdG8gYmUgdXNlZCBieSB0aGUKLQkgKiBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmRvY3VtZW50Q3JlYXRpb24gZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXB1YmxpYyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudEZhY3RvcnkjY3JlYXRlRG9jdW1lbnQoKQotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoKSB7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpKTsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJd2hpbGUgKGhhbmRsZXIgPT0gbnVsbCAmJiAhSUNvbnRlbnRUeXBlTWFuYWdlci5DVF9URVhULmVxdWFscyhjb250ZW50VHlwZS5nZXRJZCgpKSkgewotCQkJaGFuZGxlciA9IE1vZGVsSGFuZGxlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlSWQoY29udGVudFR5cGUuZ2V0SWQoKSk7Ci0JCQljb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLmdldEJhc2VUeXBlKCk7Ci0JCX0KLQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkgewotCQkJZG9jdW1lbnQgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkb2N1bWVudCA9IG5ldyBKb2JTYWZlU3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIGZDb250ZW50VHlwZUlkZW50aWZpZXI7Ci0JfQotCi0JLyoKLQkgKiBMb2FkcyB0aGUgY29udGVudCB0eXBlIElEIHRvIGJlIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgU3RydWN0dXJlZCBEb2N1bWVudC4gCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb24jc2V0SW5pdGlhbGl6YXRpb25EYXRhKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxpemF0aW9uRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZGF0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmQ29udGVudFR5cGVJZGVudGlmaWVyID0gY29uZmlnLmdldEF0dHJpYnV0ZSgiY29udGVudFR5cGVJZCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCWlmIChkYXRhIGluc3RhbmNlb2YgU3RyaW5nICYmIGRhdGEudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlmQ29udGVudFR5cGVJZGVudGlmaWVyID0gKFN0cmluZykgZGF0YTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0Fic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOGQ2OTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTfhsbGVyIC0gaW5pdGlhbCBJRG9jdW1lbnRFeHRlbnNpb240IHN1cHBvcnQgLSAjMTAyODIyCi0gKiAgICAgRGF2aWQgQ2FydmVyIChJbnRhbGlvKSAtIGJ1ZyAzMDA0NDMgLSBzb21lIGNvbnN0YW50cyBhcmVuJ3Qgc3RhdGljIGZpbmFsCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIHsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZGb3JtYXRDb250cmFpbnRzID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQlwdWJsaWMgYm9vbGVhbiByZWZyZXNoRm9ybWF0UHJlZmVyZW5jZXMgPSB0cnVlOyAvLyBzcGVjaWFsIGZsYWcgZm9yIEpVbml0Ci0JLyoKLQkgKiBNYXggbGVuZ3RoIG9mIHRleHQgdG8gYmUgZm9ybWF0dGVkIHRvIGJlIGNvbnNpZGVyZWQgYSAic21hbGwgY2hhbmdlIgotCSAqIFVzZWQgZm9yIGRvY3VtZW50IHJld3JpdGUgc2Vzc2lvbiB0eXBlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfU01BTExfRk9STUFUX1NJWkUgPSAxMDAwOwotCi0JcHJvdGVjdGVkIHZvaWQgZW5zdXJlQ2xvc2VkKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0KLQkJdHJ5IHsKLQkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsgLy8gaG9wZWxlc3MKLQkJfQotCQl0cnkgewotCQkJaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7IC8vIGhvcGVsZXNzCi0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGZvcm1hdENvbnRlbnQoU3RyaW5nIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoaW5wdXQgPT0gbnVsbCkKLQkJCXJldHVybiBpbnB1dDsKLQotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIHJlYWQuIFdpbGwgcmV0dXJuIGZvcm1hdHRlZAotCQkJLy8gc3RyaW5nIGFuZCBOT1Qgc2F2ZSBtb2RlbC4KLQkJCWlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCJVVEY4IikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgaWQgPSBpbnB1dFN0cmVhbS50b1N0cmluZygpICsgIi4iICsgZ2V0RmlsZUV4dGVuc2lvbigpOyAvLyROT04tTkxTLTEkCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChpZCwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkvLyBmb3JtYXQKLQkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkJCS8vIHJldHVybiBvdXRwdXQKLQkJCXJldHVybiBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQllbnN1cmVDbG9zZWQobnVsbCwgaW5wdXRTdHJlYW0pOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGZvcm1hdENvbnRlbnQoU3RyaW5nIGlucHV0LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChpbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuIGlucHV0OwotCi0JCWlmICgoc3RhcnQgPj0gMCkgJiYgKGxlbmd0aCA+PSAwKSAmJiAoc3RhcnQgKyBsZW5ndGggPD0gaW5wdXQubGVuZ3RoKCkpKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciByZWFkLiBXaWxsIHJldHVybiBmb3JtYXR0ZWQKLQkJCQkvLyBzdHJpbmcgYW5kIE5PVCBzYXZlIG1vZGVsLgotCQkJCWlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCJVVEY4IikpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGlkID0gaW5wdXRTdHJlYW0udG9TdHJpbmcoKSArICIuIiArIGdldEZpbGVFeHRlbnNpb24oKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGlkLCBpbnB1dFN0cmVhbSwgbnVsbCk7Ci0KLQkJCQkvLyBmb3JtYXQKLQkJCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCi0JCQkJLy8gcmV0dXJuIG91dHB1dAotCQkJCXJldHVybiBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQllbnN1cmVDbG9zZWQobnVsbCwgaW5wdXRTdHJlYW0pOwotCQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIGlucHV0OwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZiBtb2RlbAotCQkJLy8gY2hhbmdlZC4KLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwotCi0JCQkvLyBmb3JtYXQKLQkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkJCS8vIHNhdmUgbW9kZWwgaWYgbmVlZGVkCi0JCQlpZiAoIXN0cnVjdHVyZWRNb2RlbC5pc1NoYXJlZEZvckVkaXQoKSAmJiBzdHJ1Y3R1cmVkTW9kZWwuaXNTYXZlTmVlZGVkKCkpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIGVuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIG51bGwpOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKChzdGFydCA+PSAwKSAmJiAobGVuZ3RoID49IDApICYmIChzdGFydCArIGxlbmd0aCA8PSBkb2N1bWVudC5nZXRMZW5ndGgoKSkpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJCS8vIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCQkvLyBOb3RlOiBXZSBhcmUgZ2V0dGluZyBtb2RlbCBmb3IgZWRpdC4gV2lsbCBzYXZlIG1vZGVsIGlmCi0JCQkJLy8gbW9kZWwgY2hhbmdlZC4KLQkJCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQotCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJCQkvLyBmb3JtYXQKLQkJCQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQotCQkJCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJCQlpZiAoIXN0cnVjdHVyZWRNb2RlbC5pc1NoYXJlZEZvckVkaXQoKSAmJiBzdHJ1Y3R1cmVkTW9kZWwuaXNTYXZlTmVlZGVkKCkpCi0JCQkJCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZSgpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vIGVuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIG51bGwpOwotCQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXRGaWxlKElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZiBtb2RlbAotCQkJLy8gY2hhbmdlZC4KLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KGZpbGUpOwotCi0JCQkvLyBmb3JtYXQKLQkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkJCS8vIHNhdmUgbW9kZWwgaWYgbmVlZGVkCi0JCQlpZiAoIXN0cnVjdHVyZWRNb2RlbC5pc1NoYXJlZEZvckVkaXQoKSAmJiBzdHJ1Y3R1cmVkTW9kZWwuaXNTYXZlTmVlZGVkKCkpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIGVuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIG51bGwpOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RmlsZShJRmlsZSBmaWxlLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZiBtb2RlbAotCQkJLy8gY2hhbmdlZC4KLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KGZpbGUpOwotCi0JCQkvLyBmb3JtYXQKLQkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCS8vIHNhdmUgbW9kZWwgaWYgbmVlZGVkCi0JCQlpZiAoIXN0cnVjdHVyZWRNb2RlbC5pc1NoYXJlZEZvckVkaXQoKSAmJiBzdHJ1Y3R1cmVkTW9kZWwuaXNTYXZlTmVlZGVkKCkpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIGVuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIG51bGwpOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXRGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZiBtb2RlbAotCQkJLy8gY2hhbmdlZC4KLQkJCWlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChmaWxlTmFtZSwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkvLyBmb3JtYXQKLQkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkJCS8vIHNhdmUgbW9kZWwgaWYgbmVlZGVkCi0JCQlpZiAoIXN0cnVjdHVyZWRNb2RlbC5pc1NoYXJlZEZvckVkaXQoKSAmJiBzdHJ1Y3R1cmVkTW9kZWwuaXNTYXZlTmVlZGVkKCkpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIGVuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZiBtb2RlbAotCQkJLy8gY2hhbmdlZC4KLQkJCWlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChmaWxlTmFtZSwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkvLyBmb3JtYXQKLQkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCS8vIHNhdmUgbW9kZWwgaWYgbmVlZGVkCi0JCQlpZiAoIXN0cnVjdHVyZWRNb2RlbC5pc1NoYXJlZEZvckVkaXQoKSAmJiBzdHJ1Y3R1cmVkTW9kZWwuaXNTYXZlTmVlZGVkKCkpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIGVuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0TW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW50IGxlbmd0aCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQotCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQkvLyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCi0JCQlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCQlJRG9jdW1lbnRFeHRlbnNpb240IGRvY0V4dDQgPSBudWxsOwotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjQpIHsKLQkJCQlkb2NFeHQ0ID0gKElEb2N1bWVudEV4dGVuc2lvbjQpIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCX0KLQkJCURvY3VtZW50UmV3cml0ZVNlc3Npb24gcmV3cml0ZVNlc3Npb24gPSBudWxsOwotCi0JCQl0cnkgewotCQkJCS8vIHdoZW5ldmVyIGZvcm1hdHRpbmcgbW9kZWwsIGZpcmUgYWJvdXR0b2NoYW5nZS9tb2RlbGNoYW5nZWQKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUgcmV3cml0ZVR5cGUgPSAobGVuZ3RoID4gTUFYX1NNQUxMX0ZPUk1BVF9TSVpFKSA/IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRCA6IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRF9TTUFMTDsKLQkJCQlyZXdyaXRlU2Vzc2lvbiA9IChkb2NFeHQ0ID09IG51bGwgfHwgZG9jRXh0NC5nZXRBY3RpdmVSZXdyaXRlU2Vzc2lvbigpICE9IG51bGwpID8gbnVsbCA6IGRvY0V4dDQuc3RhcnRSZXdyaXRlU2Vzc2lvbihyZXdyaXRlVHlwZSk7Ci0KLQkJCQlpZiAoKHN0YXJ0ID09IDApICYmIChsZW5ndGggPT0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpKSkKLQkJCQkJc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoc3RydWN0dXJlZE1vZGVsLCBmYWxzZSk7Ci0JCQkJZWxzZQotCQkJCQlzZXRGb3JtYXRXaXRoU2libGluZ0luZGVudChzdHJ1Y3R1cmVkTW9kZWwsIHRydWUpOwotCi0JCQkJaWYgKChzdGFydCA+PSAwKSAmJiAobGVuZ3RoID49IDApICYmIChzdGFydCArIGxlbmd0aCA8PSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQkJCUxpc3QgYWN0aXZlTm9kZXMgPSBnZXRBbGxBY3RpdmVOb2RlcyhzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCQkJCQlpZiAoYWN0aXZlTm9kZXMuc2l6ZSgpID4gMCkgewotCQkJCQkJTm9kZSBmaXJzdE5vZGUgPSAoTm9kZSkgYWN0aXZlTm9kZXMuZ2V0KDApOwotCQkJCQkJTm9kZSBsYXN0Tm9kZSA9IChOb2RlKSBhY3RpdmVOb2Rlcy5nZXQoYWN0aXZlTm9kZXMuc2l6ZSgpIC0gMSk7Ci0KLQkJCQkJCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQkJCQkJTm9kZSBlYWNoTm9kZSA9IGZpcnN0Tm9kZTsKLQkJCQkJCU5vZGUgbmV4dE5vZGUgPSBudWxsOwotCQkJCQkJd2hpbGUgKCFkb25lKSB7Ci0JCQkJCQkJLy8gdXBkYXRlICJkb25lIgotCQkJCQkJCWRvbmUgPSAoZWFjaE5vZGUgPT0gbGFzdE5vZGUpOwotCi0JCQkJCQkJLyoKLQkJCQkJCQkgKiBnZXQgbmV4dCBzaWJsaW5nIGJlZm9yZSBmb3JtYXQgYmVjYXVzZSBlYWNoTm9kZQotCQkJCQkJCSAqIG1heSBiZSBkZWxldGVkLCBmb3IgZXhhbXBsZSB3aGVuIGl0J3MgYW4gZW1wdHkKLQkJCQkJCQkgKiB0ZXh0IG5vZGUKLQkJCQkJCQkgKi8KLQkJCQkJCQluZXh0Tm9kZSA9IGVhY2hOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQkJCQkvLyBmb3JtYXQgZWFjaCBub2RlCi0JCQkJCQkJZm9ybWF0Tm9kZShlYWNoTm9kZSk7Ci0KLQkJCQkJCQkvLyB1cGRhdGUgZWFjaCBub2RlCi0JCQkJCQkJaWYgKChuZXh0Tm9kZSAhPSBudWxsKSAmJiAobmV4dE5vZGUuZ2V0UGFyZW50Tm9kZSgpID09IG51bGwpKQotCQkJCQkJCQkvLyBuZXh0Tm9kZSBpcyBkZWxldGVkIGR1cmluZyBmb3JtYXQKLQkJCQkJCQkJZWFjaE5vZGUgPSBlYWNoTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJZWFjaE5vZGUgPSBuZXh0Tm9kZTsKLQotCQkJCQkJCS8vIFRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UKLQkJCQkJCQkvLyBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHdpdGggZWFjaE5vZGUuCi0JCQkJCQkJLy8gV2UgZG9uJ3Qgd2FudCBhbiBpbmZpbml0ZSBsb29wIGhlcmUuCi0JCQkJCQkJaWYgKGVhY2hOb2RlID09IG51bGwpCi0JCQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyB3ZSBuZWVkIHR3byBmaW5hbGx5J3MsIGp1c3QgaW4gY2FzZSBmaXJzdCBmYWlscwotCQkJCXRyeSB7Ci0JCQkJCWlmICgoZG9jRXh0NCAhPSBudWxsKSAmJiAocmV3cml0ZVNlc3Npb24gIT0gbnVsbCkpCi0JCQkJCQlkb2NFeHQ0LnN0b3BSZXdyaXRlU2Vzc2lvbihyZXdyaXRlU2Vzc2lvbik7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQkvLyBhbHdheXMgbWFrZSBzdXJlIHRvIGZpcmUgY2hhbmdlZG1vZGVsIHdoZW4gZG9uZQotCQkJCQlzdHJ1Y3R1cmVkTW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoTG9nZ2VyLkRFQlVHX0ZPUk1BVCkgewotCQkJCWxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZm9ybWF0TW9kZWwgdGltZTogIiArIChlbmRUaW1lIC0gc3RhcnRUaW1lKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdE5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCU5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0KLQkJCS8vIGZvcm1hdCB0aGUgb3duZXIgbm9kZSBpZiBpdCdzIGFuIGF0dHJpYnV0ZSBub2RlCi0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpCi0JCQkJbmV3Tm9kZSA9ICgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0KLQkJCS8vIHJlZnJlc2ggZm9ybWF0IHByZWZlcmVuY2VzIGJlZm9yZSBnZXR0aW5nIGZvcm1hdHRlcgotCQkJaWYgKHJlZnJlc2hGb3JtYXRQcmVmZXJlbmNlcykKLQkJCQlyZWZyZXNoRm9ybWF0UHJlZmVyZW5jZXMoKTsKLQotCQkJLy8gZ2V0IGZvcm1hdHRlciBhbmQgZm9ybWF0IGNvbnRyYWludHMKLQkJCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IGdldEZvcm1hdHRlcihuZXdOb2RlKTsKLQkJCS8vIFRPRE9fZnV0dXJlOiBhZGRlZCBhc3NlcnQgdG8gcmVwbGFjZSAicmVkdW5kYW50IG51bGwgY2hlY2siLgotCQkJLy8gaWYgZm9ybWF0dGVyIGlzIGV2ZXIgbnVsbCwgd2Ugc2hvdWxkIHByb3ZpZGUgc29tZQotCQkJLy8gZGVmYXVsdCBmb3JtYXR0ZXIgdG8gc2VydmUgYXMgcGxhY2UgaG9sZGVyLgotCQkJQXNzZXJ0LmlzTm90TnVsbChmb3JtYXR0ZXIsICJmb3JtYXR0ZXIgd2FzIG51bGwgZm9yIGEgbm9kZSwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCUlTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzID0gZm9ybWF0dGVyLmdldEZvcm1hdENvbnRyYWludHMoKTsKLQkJCWZvcm1hdENvbnRyYWludHMuc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQodHJ1ZSk7Ci0JCQkvLyBmb3JtYXQgZWFjaCBub2RlCi0JCQlmb3JtYXR0ZXIuZm9ybWF0KG5ld05vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVXNlIGdldEFsbEFjdGl2ZU5vZGVzIGluc3RlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmVjdG9yIGdldEFjdGl2ZU5vZGVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnROb2RlT2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCUxpc3QgYWxsQWN0aXZlTm9kZXMgPSBnZXRBbGxBY3RpdmVOb2RlcyhzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0Tm9kZU9mZnNldCwgbGVuZ3RoKTsKLQkJcmV0dXJuIG5ldyBWZWN0b3IoYWxsQWN0aXZlTm9kZXMpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEFsbEFjdGl2ZU5vZGVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnROb2RlT2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCUxpc3QgYWN0aXZlTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlOb2RlIHN0YXJ0Tm9kZSA9IChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE5vZGVPZmZzZXQpOwotCQkJLy8gc2VlIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00NzExCi0JCQkvLwotCQkJLy8gV2UgaGF2ZSB0byB3YXRjaCBmb3Igc2VsZWN0aW9uIGJvdW5kYXJ5IGNvbmRpdGlvbnMuIFVzZSB0aGlzIGFzCi0JCQkvLyBhbiBleGFtcGxlOiA8YT50ZXh0PC9hPjxiPnRleHQ8L2I+LAotCQkJLy8gSWYgdGhlIHdob2xlIDxhPiBub2RlIGlzIHNlbGVjdGVkLCBsaWtlOgotCQkJLy8gfDxhPnRleHQ8L2E+fDxiPnRleHQ8L2I+LCB3ZSBuZWVkIHRvIHN1YnN0cmFjdCB0aGUgbGVuZ3RoIGJ5IDEKLQkJCS8vIHRvIGZpbmQKLQkJCS8vIHRoZSBub2RlIGF0IHRoZSBlbmQgb2YgdGhlIHNlbGVjdGlvbjoKLQkJCS8vIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0Tm9kZU9mZnNldCArIGxlbmd0aCAtIDEpLAotCQkJLy8gb3IgZWxzZQotCQkJLy8gd2UnZCBmaW5kIHRoZSBuZXh0IGFkamFjZW50IG5vZGUuCi0JCQkvLwotCQkJLy8gSG93ZXZlciwgd2hlbiB0aGUgc2VsZWN0aW9uIGxlbmd0aCBpcyAwIChtZWFuaW5nIG5vIHRleHQgaXMKLQkJCS8vIHNlbGVjdGVkKSwgdGhlIGN1cnNvciBpcyBhdCB0aGUgYmVnaW5uaW5nCi0JCQkvLyBvZiB0aGUgbm9kZSB3ZSB3YW50IHRvIGZvcm1hdDogfDxhPnRleHQ8L2E+PGI+dGV4dDwvYj4sIHRoZQotCQkJLy8gbm9kZSBhdCB0aGUgZW5kIG9mIHRoZSBzZWxlY3Rpb24gaXM6Ci0JCQkvLyBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGgpLgotCQkJaW50IGVuZE5vZGVPZmZzZXQgPSBsZW5ndGggPiAwID8gc3RhcnROb2RlT2Zmc2V0ICsgbGVuZ3RoIC0gMSA6IHN0YXJ0Tm9kZU9mZnNldCArIGxlbmd0aDsKLQkJCU5vZGUgZW5kTm9kZSA9IChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihlbmROb2RlT2Zmc2V0KTsKLQotCQkJLy8gbWFrZSBzdXJlIGl0J3MgYW4gbm9uLWVtcHR5IGRvY3VtZW50Ci0JCQlpZiAoc3RhcnROb2RlICE9IG51bGwpIHsKLQkJCQl3aGlsZSAoaXNTaWJsaW5nT2Yoc3RhcnROb2RlLCBlbmROb2RlKSA9PSBmYWxzZSkgewotCQkJCQlpZiAoZW5kTm9kZSAhPSBudWxsKQotCQkJCQkJZW5kTm9kZSA9IGVuZE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlpZiAoZW5kTm9kZSA9PSBudWxsKSB7Ci0JCQkJCQlzdGFydE5vZGUgPSBzdGFydE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJLy8gc2VlCi0JCQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDcxMQotCQkJCQkJLy8gYW5kIG5vdGVzIGFib3ZlCi0JCQkJCQllbmROb2RlT2Zmc2V0ID0gbGVuZ3RoID4gMCA/IHN0YXJ0Tm9kZU9mZnNldCArIGxlbmd0aCAtIDEgOiBzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGg7Ci0JCQkJCQllbmROb2RlID0gKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKGVuZE5vZGVPZmZzZXQpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJd2hpbGUgKHN0YXJ0Tm9kZSAhPSBlbmROb2RlKSB7Ci0JCQkJCWFjdGl2ZU5vZGVzLmFkZChzdGFydE5vZGUpOwotCQkJCQlzdGFydE5vZGUgPSBzdGFydE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9Ci0JCQkJaWYgKHN0YXJ0Tm9kZSAhPSBudWxsKQotCQkJCQlhY3RpdmVOb2Rlcy5hZGQoc3RhcnROb2RlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhY3RpdmVOb2RlczsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oKTsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZ2V0Rm9ybWF0Q29udHJhaW50cyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyAyNjIxMzUgLSBOUEUgZHVyaW5nIGZvcm1hdCBvZiBlbXB0eSBkb2N1bWVudAotCQlpZiAoKGZGb3JtYXRDb250cmFpbnRzID09IG51bGwpICYmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbigwKTsKLQotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IGdldEZvcm1hdHRlcihub2RlKTsKLQkJCQlpZiAoZm9ybWF0dGVyICE9IG51bGwpIHsKLQkJCQkJZkZvcm1hdENvbnRyYWludHMgPSBmb3JtYXR0ZXIuZ2V0Rm9ybWF0Q29udHJhaW50cygpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmRm9ybWF0Q29udHJhaW50czsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZ2V0Rm9ybWF0dGVyKE5vZGUgbm9kZSk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NpYmxpbmdPZihOb2RlIG5vZGUsIE5vZGUgZW5kTm9kZSkgewotCQlpZiAoZW5kTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgewotCQkJTm9kZSBzaWJsaW5nTm9kZSA9IG5vZGU7Ci0JCQl3aGlsZSAoc2libGluZ05vZGUgIT0gbnVsbCkgewotCQkJCWlmIChzaWJsaW5nTm9kZSA9PSBlbmROb2RlKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCXNpYmxpbmdOb2RlID0gc2libGluZ05vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb3JtYXRQcmVmZXJlbmNlcygpOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIGJvb2xlYW4gZm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQpIHsKLQkJLy8gMjYyMTM1IC0gTlBFIGR1cmluZyBmb3JtYXQgb2YgZW1wdHkgZG9jdW1lbnQKLQkJSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMgPSBnZXRGb3JtYXRDb250cmFpbnRzKHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkJaWYgKGZvcm1hdENvbnRyYWludHMgIT0gbnVsbCkKLQkJCWZvcm1hdENvbnRyYWludHMuc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoZm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZlByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjczMDA0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi0vKioKLSAqIFRoZXNlIGFyZSBpdGVtcyB0aGF0IGNoYW5nZSBmcm9tIGVsZW1lbnQgdG8gZWxlbWVudC4KLSAqIFBhc3NlZCBmcm9tIG5vZGUgdG8gbm9kZSBpbiBhIHJlY3Vyc2l2ZSBjYWxsLgotICogZWcuIGN1cnJlbnQgaW5kZW50IGlzIDIgZGVlcCwgYnV0IGZvciB0aGUgbmV4dCBub2RlIG1pZ2h0IGJlIDMuLi4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgewotCWJvb2xlYW4gZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCk7Ci0KLQlTdHJpbmcgZ2V0Q3VycmVudEluZGVudCgpOwotCi0JYm9vbGVhbiBnZXRGb3JtYXRXaXRoU2libGluZ0luZGVudCgpOwotCi0JYm9vbGVhbiBnZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCk7Ci0KLQkvKiogCi0JICogc29tZSBzcGVjaWFsIGVsZW1lbnRzIGNhbiBpZ25vcmUgY2xlYXJpbmcgYmxhbmsgbGluZXMKLQkgKiAqLwotCXZvaWQgc2V0Q2xlYXJBbGxCbGFua0xpbmVzKGJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzKTsKLQotCXZvaWQgc2V0Q3VycmVudEluZGVudChTdHJpbmcgY3VycmVudEluZGVudCk7Ci0KLQl2b2lkIHNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KGJvb2xlYW4gZm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQpOwotCQotCXZvaWQgc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudChib29sZWFuIGluUHJlc2VydmVTcGFjZUVsZW1lbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2VmMTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi0vKioKLSAqIFRoZXNlIGFyZSBpdGVtcyB0aGF0IGRvIG5vdCBjaGFuZ2UgZnJvbSBlbGVtZW50IHRvIGVsZW1lbnQuCi0gKiBQYXNzZWQgZnJvbSBub2RlIHRvIG5vZGUgaW4gYSByZWN1cnNpdmUgY2FsbCBiZWNhdXNlIHNvbWV0aW1lcwotICogY2hpbGQgbm9kZXMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyB7Ci0JCi0JYm9vbGVhbiBnZXRDbGVhckFsbEJsYW5rTGluZXMoKTsKLQotCVN0cmluZyBnZXRJbmRlbnQoKTsKLQotCWludCBnZXRMaW5lV2lkdGgoKTsKLQotCXZvaWQgc2V0Q2xlYXJBbGxCbGFua0xpbmVzKGJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzKTsKLQotCXZvaWQgc2V0SW5kZW50KFN0cmluZyBpbmRlbnQpOwotCi0Jdm9pZCBzZXRMaW5lV2lkdGgoaW50IGxpbmVXaWR0aCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgzYWFjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGUgbWFpbiBmb3JtYXR0aW5nIGVuZ2luZS4gIAotICogTG9vcHMgdGhyb3VnaCBhbGwgdGhlIG5vZGVzIGluIGFuIElTdHJ1Y3R1cmVkTW9kZWwuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgewotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBGb3JtYXRQcm9jZXNzb3IgdGFrZXMgYW4gSURvY3VtZW50IGFzIGlucHV0LCBjcmVhdGVzIGEKLQkgKiB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIElEb2N1bWVudCdzIGZpbGUKLQkgKiBleHRlbnNpb24sIGZvcm1hdHMgdGhlIG1vZGVsIHdpdGhpbiBzdGFydCBhbmQgbGVuZ3RoLCB0aGVuIHJlbGVhc2VzIHRoZQotCSAqIG1vZGVsLgotCSAqLwotCXZvaWQgZm9ybWF0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgRm9ybWF0UHJvY2Vzc29yIHRha2VzIGFuIElGaWxlIGFzIGlucHV0LCBjcmVhdGVzIGEKLQkgKiB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIElGaWxlJ3MgZmlsZQotCSAqIGV4dGVuc2lvbiwgZm9ybWF0cyB0aGUgd2hvbGUgbW9kZWwsIHRoZW4gcmVsZWFzZXMgdGhlIG1vZGVsLgotCSAqLwotCXZvaWQgZm9ybWF0RmlsZShJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIEZvcm1hdFByb2Nlc3NvciB0YWtlcyBhIG1vZGVsIGFzIGlucHV0LCBhbmQgZm9ybWF0cwotCSAqIHRoZSB3aG9sZSBtb2RlbC4KLQkgKi8KLQl2b2lkIGZvcm1hdE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKTsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgRm9ybWF0UHJvY2Vzc29yIHRha2VzIGEgbW9kZWwgYXMgaW5wdXQsIGFuZCBmb3JtYXRzCi0JICogdGhlIG1vZGVsIHdpdGhpbiBzdGFydCBhbmQgbGVuZ3RoLgotCSAqLwotCXZvaWQgZm9ybWF0TW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIGludCBzdGFydCwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIEZvcm1hdFByb2Nlc3NvciB0YWtlcyBhIG5vZGUgYXMgaW5wdXQsIGFuZCBmb3JtYXRzIHRoZQotCSAqIG5vZGUgYW5kIGFsbCBpdHMgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBmb3JtYXROb2RlKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGlzIDxjb2RlPklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yPC9jb2RlPi4KLQkgKiBUaGUgbW9uaXRvciBpcyB1c2VkIHRvIGRpc3BsYXkgcHJvZ3Jlc3Mgb3IgY2FuY2VsIGlmIHRoZSBmb3JtYXR0ZXIgaXMgcnVuIAotCSAqIGluIGEgYmFja2dyb3VuZCBqb2IuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQl2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMjNkMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBLbm93cyBob3cgdG8gZm9ybWF0IGEgcGFydGljdWxhciBub2RlLgotICogCi0gKiBlZy4gZ2VuZXJpYyBub2RlLCB0ZXh0IG5vZGUsIGRvY3VtZW50IG5vZGUsIGNvbW1lbnQsIGV0Yy4uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRm9ybWF0dGVyIHsKLQkKLQl2b2lkIGZvcm1hdChOb2RlIG5vZGUpOwotCi0Jdm9pZCBmb3JtYXQoTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cyk7Ci0KLQlJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZ2V0Rm9ybWF0Q29udHJhaW50cygpOwotCi0JSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBnZXRGb3JtYXRQcmVmZXJlbmNlcygpOwotCi0Jdm9pZCBzZXRGb3JtYXRQcmVmZXJlbmNlcyhJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGZvcm1hdFByZWZlcmVuY2VzKTsKLQotCXZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E0N2U0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSB4bWw6c3BhY2U9J3ByZXNlcnZlJyBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIHsKLQlwcml2YXRlIGJvb2xlYW4gZkNsZWFyQWxsQmxhbmtMaW5lczsKLQlwcml2YXRlIFN0cmluZyBmQ3VycmVudEluZGVudCA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBib29sZWFuIGZGb3JtYXRXaXRoU2libGluZ0luZGVudCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCA9IGZhbHNlOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCkgewotCQlyZXR1cm4gZkNsZWFyQWxsQmxhbmtMaW5lczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRJbmRlbnQoKSB7Ci0JCXJldHVybiBmQ3VycmVudEluZGVudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRGb3JtYXRXaXRoU2libGluZ0luZGVudCgpIHsKLQkJcmV0dXJuIGZGb3JtYXRXaXRoU2libGluZ0luZGVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGVhckFsbEJsYW5rTGluZXMoYm9vbGVhbiBjbGVhckFsbEJsYW5rTGluZXMpIHsKLQkJZkNsZWFyQWxsQmxhbmtMaW5lcyA9IGNsZWFyQWxsQmxhbmtMaW5lczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50SW5kZW50KFN0cmluZyBjdXJyZW50SW5kZW50KSB7Ci0JCWZDdXJyZW50SW5kZW50ID0gY3VycmVudEluZGVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb3JtYXRXaXRoU2libGluZ0luZGVudChib29sZWFuIGZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KSB7Ci0JCWZGb3JtYXRXaXRoU2libGluZ0luZGVudCA9IGZvcm1hdFdpdGhTaWJsaW5nSW5kZW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBmSW5QcmVzZXJ2ZVNwYWNlRWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KGJvb2xlYW4gaW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCkgewotCQlmSW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCA9IGluUHJlc2VydmVTcGFjZUVsZW1lbnQ7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmYxYjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgaW1wbGVtZW50cyBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIHsKLQlwcml2YXRlIGJvb2xlYW4gZkNsZWFyQWxsQmxhbmtMaW5lczsKLQlwcml2YXRlIFN0cmluZyBmSW5kZW50OwotCXByaXZhdGUgaW50IGZMaW5lV2lkdGg7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDbGVhckFsbEJsYW5rTGluZXMoKSB7Ci0JCXJldHVybiBmQ2xlYXJBbGxCbGFua0xpbmVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5kZW50KCkgewotCQlyZXR1cm4gZkluZGVudDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExpbmVXaWR0aCgpIHsKLQkJcmV0dXJuIGZMaW5lV2lkdGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xlYXJBbGxCbGFua0xpbmVzKGJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzKSB7Ci0JCWZDbGVhckFsbEJsYW5rTGluZXMgPSBjbGVhckFsbEJsYW5rTGluZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5kZW50KFN0cmluZyBpbmRlbnQpIHsKLQkJZkluZGVudCA9IGluZGVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaW5lV2lkdGgoaW50IGxpbmVXaWR0aCkgewotCQlmTGluZVdpZHRoID0gbGluZVdpZHRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9BYnN0cmFjdE1vZGVsSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0Fic3RyYWN0TW9kZWxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNDU1NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0Fic3RyYWN0TW9kZWxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLlBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlcjsKLQotLyoqCi0gKiBJU1NVRTogbmVlZCB0byBwcm92aWRlIHRoaXMgZnVuY3Rpb25hbGl0eSBpbiBpbXByb3ZlZCBBUEkuCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TW9kZWxIYW5kbGVyIGltcGxlbWVudHMgSU1vZGVsSGFuZGxlciB7Ci0JcHJpdmF0ZSBTdHJpbmcgYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRTZXR0aW5nOwotCXByaXZhdGUgU3RyaW5nIG1vZGVsSGFuZGxlcklEOwotCi0JcHVibGljIEFic3RyYWN0TW9kZWxIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRoZXNlIGZhY3RvcmllcyBhcmUgYWRkZWQgYXV0b21hdGljYWxseSBieSBtb2RlbCBtYW5hZ2VyCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNvbGxlY3Rpb24gaG9sZEZhY3RvcmllcyA9IFBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldEZhY3Rvcmllcyh0aGlzKTsKLQkJaWYgKGhvbGRGYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJcmVzdWx0LmFkZEFsbChob2xkRmFjdG9yaWVzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoKSB7Ci0JCXJldHVybiBhc3NvY2lhdGVkQ29udGVudFR5cGVJZDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldEVuY29kaW5nRGV0ZWN0b3IoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBtb2RlbEhhbmRsZXJJRDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0JCXJldHVybiBkZWZhdWx0U2V0dGluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlhc3NvY2lhdGVkQ29udGVudFR5cGVJZCA9IGNvbnRlbnRUeXBlSWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChib29sZWFuIGRlZmF1bHRQYXJhbSkgewotCQlkZWZhdWx0U2V0dGluZyA9IGRlZmF1bHRQYXJhbTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLQkJbW9kZWxIYW5kbGVySUQgPSBpZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1MTE5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBFbWJlZGRlZFR5cGVIYW5kbGVyIHsKLQotCS8qKgotCSAqIFRoZXNlIEFkYXB0ZXJGYWN0b3JpZXMgYXJlIE5PVCBhZGRlZCB0byBJU3RydWN0dXJlZE1vZGVsJ3MKLQkgKiBJQWRhcHRlckZhY3RvcnkgUmVnaXN0cnksIGJ1dCBpbnN0ZWFkIGV4cGVjdGVkIHRvIGJlIGNvbnN1bHRlZCBhcwotCSAqIG5lZWRlZCBieSBmdW5jdGlvbmFsaXR5IGF3YXJlIG9mIGVtYmVkZGVkIGNvbnRlbnQgdHlwZXMuICBBZGRpdGlvbnMKLQkgKiB0byB0aGUgbW9kZWwncyBvd24gZmFjdG9yeSByZWdpc3RyeSBzaG91bGQgYmUgZG9uZSBpbgotCSAqIHtAbGluayAjaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShGYWN0b3J5UmVnaXN0cnkpfQotCSAqLwotCUxpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjb250ZW50IHR5cGUgZmFtaWx5IHRoaXMKLQkgKiBDb250ZW50VHlwZURlc2NyaXB0aW9uIGJlbG9uZ3MgdG8uCi0JICovCi0JU3RyaW5nIGdldEZhbWlseUlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBtaW1lIHR5cGVzIChhcyBTdHJpbmdzKSB0aGlzIGhhbmRsZXIgaXMgYXBwcm9wcmlhdGUKLQkgKiBmb3IKLQkgKi8KLQlMaXN0IGdldFN1cHBvcnRlZE1pbWVUeXBlcygpOwotCQotCS8qKgotCSAqIElmIHRoaXMgaGFuZGVyIGNhbiBoYW5kbGUgYSBnaXZlbiBtaW1lVHlwZS4KLQkgKiAKLQkgKiBUaGlzIGlzIGEgbG9vc2VyIGNoZWNrIHRoYW4gc2ltcGx5IGNoZWNraW5nIGlmIGEgZ2l2ZSBtaW1lVHlwZQotCSAqIGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCB0eXBlcywgc28gaXQgc2hvdWxkIGJlIHVzZWQgd2l0aCB0aGF0Ci0JICogaW4gbWluZC4gIFRoYXQgaXMsIHRoZSBzdXBwb3J0ZWQgbWltZVR5cGUgbGlzdCBzaG91bGQgaWRlYWxseSBiZQotCSAqIGNoZWNrZWQgZmlyc3QuCi0JICogCi0JICogZWcuIGlmIGEgbWltZSB0eXBlIGVuZHMgd2l0aCAiK3htbCIsIGxpa2Ugdm9pY2UreG1sCi0JICogICAgIHRoZSBFbWJlZGRlZFhNTCBoYW5kbGVyIHNob3VsZCBiZSBhYmxlIHRvIGhhbmRsZSBpdAotCSAqICAgICAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBoYW5kbGVyIHRoaW5rcyBjYW4gaGFuZGxlIHRoZSBnaXZlbiBtaW1lVHlwZQotCSAqLwotCWJvb2xlYW4gY2FuSGFuZGxlTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHRvIGdpdmUgdGhlIEVtYmVkZGVkQ29udGVudFR5cGUgYW4gb3Bwb3J0dW5pdHkgdG8gYWRkCi0JICogZmFjdG9yaWVzIGRpcmVjdGx5IHRvIHRoZSBJU3RydWN0dXJlZE1vZGVsJ3MgSUFkYXB0ZXJGYWN0b3J5IHJlZ2lzdHJ5LiAKLQkgKi8KLQl2b2lkIGluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KTsKLQotCS8qKgotCSAqIGluaXRpYWxpemVQYXJzZXIsIGZvciBleGFtcGxlLCBzZXR0aW5nIHVwIGEgImJsb2NrIiB0YWdzIGxpc3QgdXNpbmcgYW4KLQkgKiBleHRlbmRlZCBpbnRlcmZhY2UKLQkgKi8KLQl2b2lkIGluaXRpYWxpemVQYXJzZXIoUmVnaW9uUGFyc2VyIHBhcnNlcik7Ci0KLQlib29sZWFuIGlzRGVmYXVsdCgpOwotCi0JRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdJbnN0YW5jZSgpOwotCi0Jdm9pZCB1bmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KTsKLQotCXZvaWQgdW5pbml0aWFsaXplUGFyc2VyKFJlZ2lvblBhcnNlciBwYXJzZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0lEb2N1bWVudFR5cGVIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvSURvY3VtZW50VHlwZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE2Mjk2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvSURvY3VtZW50VHlwZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLQotLyoqCi0gKiBSZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIHRoZSBtZWNoYW5pc21zIHVzZWQgaW4gdGhlIGNvcnJlY3QgbG9hZGluZyBvZiBhbgotICogSVN0cnVjdHVyZWREb2N1bWVudCdzIGNvbnRlbnRzIGFuZCBkZXRlcm1pbmUgaXRzIHNlbGYtZGVzY3JpYmVkIGVuY29kaW5nLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEb2N1bWVudFR5cGVIYW5kbGVyIHsKLQotCS8qKgotCSAqIFRoZSBMb2FkZXIgaXMgcmVwb25zaWJsZSBmb3IgZGVjb2RpbmcgdGhlIFJlc291cmNlLAotCSAqLwotCUlEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBsaWtlbHkgdG8gZ28gYXdheSwgc28gSSBtYXJrZWQgYXMgZGVwcmVjYXRlZCB0bwotCSAqICAgICAgICAgICAgIGRpc2NvdXJzYWdlIHVzZQotCSAqLwotCUlEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCk7Ci0KLQkvKioKLQkgKiBNdXN0IHJldHVybiB1bmlxdWUgSUQgdGhhdCBpcyB0aGUgc2FtZSBhcyBpZGVudGlmaWVkIGluIHBsdWdpbiByZWdpc3RyeQotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0lNb2RlbEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9JTW9kZWxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OGYzOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0lNb2RlbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLQotCi0vKioKLSAqIFJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgdGhlIG1lY2hhbmlzbXMgdXNlZCBpbiB0aGUgY29ycmVjdCBsb2FkaW5nIG9mIGFuCi0gKiBJU3RydWN0dXJlZE1vZGVsJ3MgY29udGVudHMgYW5kIGluaXRpYWxpemF0aW9uIG9mIGl0cyBhZGFwdGVyIGZhY3Rvcmllcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxIYW5kbGVyIGV4dGVuZHMgSURvY3VtZW50VHlwZUhhbmRsZXIgewotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gRmFjdG9yaWVzIHdoaWNoIGFyZSBhZGRlZCBhdXRvbWF0aWNhbGx5IGJ5Ci0JICogSU1vZGVsTWFuYWdlci4gVGhpcyBjYW4gYW5kIHdpbGwgb2Z0ZW4gYmUgYW4gZW1wdHkgTGlzdCAob3IgbnVsbCksCi0JICogc2luY2Ugc29tZSBBZGFwdGVyRmFjdG9yaWVzIG11c3QgYmUgYWRkZWQgYnkgTG9hZGVyIGRpcmVjdGx5LCBhbmQgbW9zdAotCSAqIHNob3VsZCBiZSBhZGRlZCBieSBFZGl0b3JzLiBGb3JtYXRBZGFwdGVyRmFjdG9yeSBpcyBhbiBleGFtcGxlIG9mIG9uZQotCSAqIHRoYXQgY2FuIGJlIHJldHVybmVkIGhlcmUsIHNpbmNlIHRoZSB0aW1pbmcgb2YgYWRkaW5nIGl0IGlzIG5vdAotCSAqIGNyaXRpY2FsLCBidXQgaXQgbWF5IGJlIG5lZWRlZCBldmVuIHdoZW4gYW4gZWRpdG9yIGlzIG5vdCBiZWluZyB1c2VkLgotCSAqLwotCUxpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUQgZm9yIHRoZSBhc3NvY2lhdGVkIENvbnRlbnRUeXBlSGFuZGxlciBCdXQgaXMgbmVlZGVkIGZvcgotCSAqIG5vdy4KLQkgKi8KLQlTdHJpbmcgZ2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoKTsKLQotCS8qKgotCSAqIFRoZSBMb2FkZXIgaXMgcmVwb25zaWJsZSBmb3IgZGVjb2RpbmcgdGhlIFJlc291cmNlLAotCSAqLwotCUlNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpOwotCi0JYm9vbGVhbiBpc0RlZmF1bHQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9CbG9ja01hcmtlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0Jsb2NrTWFya2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OGIzNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0Jsb2NrTWFya2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogSVNTVUU6IG5lZWQgdG8gcHJvdmlkZSBmdW5jdGlvbmFsaXR5IGluIGltcHJvdmVkIEFQSS4gCi0gKi8KLXB1YmxpYyBjbGFzcyBCbG9ja01hcmtlciBleHRlbmRzIFRhZ01hcmtlciB7Ci0KLQkvLyBhbGxvdyBmb3IgSlNQIGV4cHJlc3Npb25zIHdpdGhpbiB0aGUgYmxvY2sKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmQWxsb3dKU1AgPSB0cnVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZkNhc2VTZW5zaXRpdmUgPSBmYWxzZTsKLQotCS8vIHRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudHMgb2YgdGhpcyB0YWcgKEJMT0NLX1RFWFQsIEpTUF9DT05URU5ULAotCS8vIGV0Yy4pCi0JcHJvdGVjdGVkIFN0cmluZyBmQ29udGV4dDsKLQotCXB1YmxpYyBCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSwgSVRleHRSZWdpb24gbWFya2VyLCBTdHJpbmcgY29udGV4dCkgewotCQl0aGlzKHRhZ05hbWUsIG1hcmtlciwgY29udGV4dCwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIEJsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lLCBJVGV4dFJlZ2lvbiBtYXJrZXIsIFN0cmluZyBjb250ZXh0LCBib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKLQkJdGhpcyh0YWdOYW1lLCBtYXJrZXIsIGNvbnRleHQsIGNhc2VTZW5zaXRpdmUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSwgSVRleHRSZWdpb24gbWFya2VyLCBTdHJpbmcgY29udGV4dCwgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlLCBib29sZWFuIGFsbG93SlNQKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIG1hcmtlcik7Ci0JCXNldENvbnRleHQoY29udGV4dCk7Ci0JCXNldENhc2VTZW5zaXRpdmUoY2FzZVNlbnNpdGl2ZSk7Ci0JCXNldEFsbG93SlNQKGFsbG93SlNQKTsKLQl9Ci0KLQlwdWJsaWMgQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUsIFN0cmluZyByZWdpb25Db250ZXh0LCBib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKLQkJdGhpcyh0YWdOYW1lLCBudWxsLCByZWdpb25Db250ZXh0LCBjYXNlU2Vuc2l0aXZlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWxsb3dKU1AuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFsbG93c0pTUCgpIHsKLQkJcmV0dXJuIGZBbGxvd0pTUDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb250ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGZDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIGZDYXNlU2Vuc2l0aXZlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFsbG93SlNQLgotCSAqIAotCSAqIEBwYXJhbSBhbGxvd0pTUAotCSAqICAgICAgICAgICAgVGhlIGFsbG93SlNQIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbG93SlNQKGJvb2xlYW4gYWxsb3dKU1ApIHsKLQkJZkFsbG93SlNQID0gYWxsb3dKU1A7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZShib29sZWFuIHNlbnNpdGl2ZSkgewotCQlmQ2FzZVNlbnNpdGl2ZSA9IHNlbnNpdGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICBUaGUgY29udGV4dCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCWZDb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9CbG9ja1RhZ1BhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0Jsb2NrVGFnUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZDZiNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0Jsb2NrVGFnUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQmxvY2tUYWdQYXJzZXIgewotCi0Jdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpOwotCi0Jdm9pZCBiZWdpbkJsb2NrU2NhbihTdHJpbmcgdGFnTmFtZSk7Ci0KLQlCbG9ja01hcmtlciBnZXRCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSk7Ci0KLQlMaXN0IGdldEJsb2NrTWFya2VycygpOwotCi0Jdm9pZCByZW1vdmVCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpOwotCi0Jdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvQmxvY2tUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9CbG9ja1Rva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWFkNTM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9CbG9ja1Rva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQmxvY2tUb2tlbml6ZXIgewotCi0Jdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpOwotCi0Jdm9pZCBiZWdpbkJsb2NrTWFya2VyU2NhbihTdHJpbmcgbmV3VGFnTmFtZSwgU3RyaW5nIGNvbnRleHQpOwotCi0Jdm9pZCBiZWdpbkJsb2NrVGFnU2NhbihTdHJpbmcgbmV3VGFnTmFtZSk7Ci0KLQlMaXN0IGdldEJsb2NrTWFya2VycygpOwotCi0JSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JaW50IGdldE9mZnNldCgpOwotCi0JYm9vbGVhbiBpc0VPRigpOwotCi0JQmxvY2tUb2tlbml6ZXIgbmV3SW5zdGFuY2UoKTsKLQotCXZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKTsKLQotCXZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ25hbWUpOwotCi0Jdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KTsKLQotCXZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSwgaW50IG5ld09mZnNldCk7Ci0KLQl2b2lkIHJlc2V0KElucHV0U3RyZWFtIGluKTsKLQotCXZvaWQgcmVzZXQoSW5wdXRTdHJlYW0gaW4sIGludCBuZXdPZmZzZXQpOwotCi0Jdm9pZCByZXNldChSZWFkZXIgaW4pOwotCi0Jdm9pZCByZXNldChSZWFkZXIgaW4sIGludCBuZXdPZmZzZXQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0lCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvSUJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlYWIwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvSUJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0vKioKLSAqIElCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIGp1c3QgbGlrZSBhbiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0gKiBleGNlcHQgcmVzdWx0cyBmcm9tIHBhcnNpbmcgYSAiYmxvY2sgdGFnIiAoc3VjaCBhcyBTQ1JJUFQgb3IgU1RZTEUpLgotICogQmVjYXVzZSB0aGVzZSBhcmUgInZhcmlhYmxlIiBwYXJ0aXRpb24gdHlwZXMsIGl0cyBvZnRlbiBoYW5keSAoZWZmaWNpZW50KQotICogdG8ga2VlcCB0cmFjayBvZiB0aGUgcGFydGl0aW9uIHR5cGUuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGV4dGVuZHMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXJ0aW9uIHR5cGUgZm9yIHRoaXMgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcnRpb24gdHlwZS4KLQkgKi8KLQlTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcGFydGlvbiB0eXBlLgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmUtcGFyc2VycyBvbmx5LgotCSAqIAotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICovCi0Jdm9pZCBzZXRQYXJ0aXRpb25UeXBlKFN0cmluZyBwYXJ0aXRpb25UeXBlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9KU1BDYXBhYmxlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvSlNQQ2FwYWJsZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDU1OTczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9KU1BDYXBhYmxlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBKU1BDYXBhYmxlUGFyc2VyIGV4dGVuZHMgUmVnaW9uUGFyc2VyLCBCbG9ja1RhZ1BhcnNlciB7Ci0Jdm9pZCBhZGROZXN0YWJsZVByZWZpeChUYWdNYXJrZXIgbWFya2VyKTsKLQotCS8qKgotCSAqIHJldHVybnMgdGhlIFRhZ01hcmtlcnMgZm9yIHByZWZpeGVzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgbmVzdGFibGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JTGlzdCBnZXROZXN0YWJsZVByZWZpeGVzKCk7Ci0KLQl2b2lkIHJlbW92ZU5lc3RhYmxlUHJlZml4KFN0cmluZyB0YWdOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9SZWdpb25QYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9SZWdpb25QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI4ZGZjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvUmVnaW9uUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgUmVnaW9uUGFyc2VyIHsKLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RG9jdW1lbnRSZWdpb25zKCk7Ci0KLQlMaXN0IGdldFJlZ2lvbnMoKTsKLQotCS8qKgotCSAqIFRoZSAnbmV3SW5zdGFuY2UnIG1ldGhvZCBpcyBzaW1pbGFyIHRvICdjbG9uZScsIGJ1dCBkb2VzIG5vdCBpbmNsdWRlCi0JICogdGhlIGNvcHlpbmcgb2YgYW55IGNvbnRlbnQuIEZvciBhIHB1cmUgUmVnaW9uUGFyc2VyIGl0c2VsZiwgdGhlcmUgd291bGQKLQkgKiBiZSBsaXR0bGUgc3RhdGUgdG8gImNsb25lIiwgYnV0IGZvciBzb21lIHN1YnR5cGVzLCBzdWNoIGFzCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIGFuZCBKU1BDYXBhYmxlUGFyc2VyLCB0aGVyZSBjb3VsZCB0aGUKLQkgKiBtb3JlIGludGVybmFsIGRhdGEgdG8gImNsb25lIiwgc3VjaCBhcyB0aGUgaW50ZXJuYWwgdG9rZW5pemVyIHNob3VsZCBiZQotCSAqIGNsb25lZCAoaW5jbHVkaW5nIGJsb2NrIHRhZ3MsIGV0YykuCi0JICovCi0JUmVnaW9uUGFyc2VyIG5ld0luc3RhbmNlKCk7Ci0KLQl2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIpOwotCi0JLyoqCi0JICogQW4gYWRkaXRpb25hbCBvZmZzZXQgZm9yIHVzZSB3aXRoIGFueSBwb3NpdGlvbi1kZXBlbmRhbnQgcGFyc2luZyBydWxlcwotCSAqLwotCXZvaWQgcmVzZXQoUmVhZGVyIHJlYWRlciwgaW50IG9mZnNldCk7Ci0KLQl2b2lkIHJlc2V0KFN0cmluZyBpbnB1dCk7Ci0KLQkvKioKLQkgKiBBbiBhZGRpdGlvbmFsIG9mZnNldCBmb3IgdXNlIHdpdGggYW55IHBvc2l0aW9uLWRlcGVuZGFudCBwYXJzaW5nIHJ1bGVzCi0JICovCi0Jdm9pZCByZXNldChTdHJpbmcgaW5wdXQsIGludCBvZmZzZXQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZTVjYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgewotCi0JLy8gU2VudCB3aGVuIGEgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBmaXJzdCBwYXJzZWQKLQlwdWJsaWMgdm9pZCBub2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JLy8gU2VudCB3aGVuIHRoZSBjYWxsaW5nIHBhcnNlcidzIG1vZGVsIHVuZGVyZ29lcyBhIGZ1bGwgcmVzZXQKLQkvLyAgIGFuZCBhbnkgaW5mb3JtYXRpb24gYmFzZWQgdXBvbiB0aGUgb2xkIG1vZGVsIHNob3VsZCBiZQotCS8vICAgY2xlYXJlZAotCXB1YmxpYyB2b2lkIHJlc2V0Tm9kZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWYyZDdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbiBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgewotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3RG9jdW1lbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGJiZTVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlcjsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIGV4dGVuZHMgUmVnaW9uUGFyc2VyIHsKLQotCXZvaWQgYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIGhhbmRsZXIpOwotCi0Jdm9pZCByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgaGFuZGxlcik7Ci0KLQl2b2lkIHJlc2V0SGFuZGxlcnMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0OTUwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uIGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxpc3Qgb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgbGlzdGVuaW5nCi0JICogdG8gdGhpcyBwYXJzZXIuCi0JICogCi0JICogQHJldHVybiBMaXN0IC0gdGhlIGxpc3Qgb2YgbGlzdGVuZXJzLCB0aGUgbGlzdCBtYXkgbm90IGJlIG51bGwgYW5kIGVhY2gKLQkgKiAgICAgICAgIGVsZW1lbnQgaW4gaXQgbXVzdCBpbXBsZW1lbnQgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcgotCSAqLwotCUxpc3QgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9UYWdNYXJrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9UYWdNYXJrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlMjI1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvVGFnTWFya2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotLyoqCi0gKiBJU1NVRTogbmVlZCB0byBwcm92aWRlIGZ1bmN0aW9uYWxpdHkgaW4gaW1wcm92ZWQgQVBJLiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgVGFnTWFya2VyIHsKLQotCS8vIGEgSVRleHRSZWdpb24gKG1lYW50IHRvIGJlIHVwZGF0ZWQgd2l0aCB0aGUgbW9kZWwpIG1hcmtpbmcgdGhlIHBvc2l0aW9uCi0JLy8gd2hlcmUgdGhpcyB0YWduYW1lIGJlY29tZXMgZWZmZWN0aXZlCi0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIGZNYXJrZXIgPSBudWxsOwotCi0JLy8gdGhlIHRhZ25hbWUKLQlwcm90ZWN0ZWQgU3RyaW5nIGZUYWdOYW1lID0gbnVsbDsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgVGFnTWFya2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUYWdNYXJrZXIoU3RyaW5nIHRhZ25hbWUpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VGFnTmFtZSh0YWduYW1lKTsKLQl9Ci0KLQlwdWJsaWMgVGFnTWFya2VyKFN0cmluZyB0YWduYW1lLCBJVGV4dFJlZ2lvbiBtYXJrZXIpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VGFnTmFtZSh0YWduYW1lKTsKLQkJc2V0TWFya2VyKG1hcmtlcik7Ci0JfQotCi0JcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE1hcmtlcigpIHsKLQkJcmV0dXJuIGZNYXJrZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRUYWdOYW1lKCkgewotCQlyZXR1cm4gZlRhZ05hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKSB7Ci0JCXJldHVybiBmTWFya2VyID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld01hcmtlcgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldE1hcmtlcihJVGV4dFJlZ2lvbiBuZXdNYXJrZXIpIHsKLQkJZk1hcmtlciA9IG5ld01hcmtlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VGFnbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFRhZ05hbWUoU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQkJZlRhZ05hbWUgPSBuZXdUYWdOYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYWZhYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUYWdQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYSBmaWxlIGFuZCBjcmVhdGVzIGFuIFN0cnVjdHVyZWQgTW9kZWwuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1vZGVsTG9hZGVyIGltcGxlbWVudHMgSU1vZGVsTG9hZGVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBlbmNvZGluZ05hbWVTZWFyY2hMaW1pdCA9IDEwMDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBsb25nIGNvbXB1dGVNZW0oKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCQlTeXN0ZW0uZ2MoKTsKLQkJCVN5c3RlbS5ydW5GaW5hbGl6YXRpb24oKTsKLQkJfQotCQlyZXR1cm4gUnVudGltZS5nZXRSdW50aW1lKCkudG90YWxNZW1vcnkoKSAtIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgSURvY3VtZW50TG9hZGVyIGRvY3VtZW50TG9hZGVySW5zdGFuY2U7Ci0KLQkvKioKLQkgKiBBYnN0cmFjdExvYWRlciBjb25zdHJ1Y3RvciBhbHNvIGluaXRpYWxpemVzIGVuY29kaW5nIGNvbnZlcnRlci9tYXBwZXIKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RNb2RlbExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgTGlzdCBmYWN0b3J5TGlzdCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG1vZGVsKTsKLQkJRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwocmVnaXN0cnksICJJU3RydWN0dXJlZE1vZGVsICIgKyBtb2RlbC5nZXRJZCgpICsgIiBoYXMgYSBudWxsIEZhY3RvcnlSZWdpc3RyeSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKGZhY3RvcnlMaXN0ICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmFjdG9yeUxpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCXJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgcGVyZm9ybSBhbGwgdGhlIG1vZGVsIGluaXRpYWxpemF0aW9uIHJlcXVpcmVkIGJlZm9yZQotCSAqIGl0IGNvbnRhaW5zIGNvbnRlbnQsIG5hbWVseSwgaXQgc2hvdWxkIGNhbGwgbmV3TW9kZWwsIHRoZQotCSAqIGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpLCB0aGVuIGFkZCB0aG9zZSBhZGFwdGVyIGZhY3RvcmllcyB3aGljaAotCSAqIG11c3QgYmUgc2V0IGJlZm9yZSBjb250ZW50IGlzIGFwcGxpZWQuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkKLQkgKiAibG9hZCIgbWV0aG9kLiAodGhpcyBpcyB0ZW50YXRpdmUgQVBJKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU1vZGVsKCkgewotCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG5ld01vZGVsKCk7Ci0JCUlFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCW1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudCgoSVN0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KTsKLQkJCWFkZEZhY3Rvcmllcyhtb2RlbCwgZ2V0QWRhcHRlckZhY3RvcmllcygpKTsKLQkJCS8vCi0JCQlpbml0RW1iZWRkZWRUeXBlUHJlKG1vZGVsLCAoSVN0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KTsKLQkJCWluaXRFbWJlZGRlZFR5cGVQb3N0KG1vZGVsKTsKLQkJCS8vIEZvciB0eXBlcyB3aXRoIHByb3BhZ2F0aW5nIGFkYXB0ZXJzLCBpdHMgaW1wb3J0YW50Ci0JCQkvLyB0aGF0IHRoZSBwcm9wYWdhdGluZyBhZGFwdGVyIGJlIGluIHBsYWNlIGJlZm9yZSB0aGUgY29udGVudHMKLQkJCS8vIGFyZSBzZXQuCi0JCQlwcmVMb2FkQWRhcHQobW9kZWwpOwotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVNb2RlbChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgU3RyaW5nIGJhc2VMb2NhdGlvbiwgSU1vZGVsSGFuZGxlciBoYW5kbGVyKSB7Ci0JCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbmV3TW9kZWwoKTsKLQkJbW9kZWwuc2V0QmFzZUxvY2F0aW9uKGJhc2VMb2NhdGlvbik7Ci0JCQotCQkvLyBoYW5kbGVyIG11c3QgYmUgc2V0IGVhcmx5LCBpbmNhc2UgYSByZS1pbml0IGlzIAotCQkvLyByZXF1aXJlZCBkdXJpbmcgY3JlYXRpb24uCi0JCW1vZGVsLnNldE1vZGVsSGFuZGxlcihoYW5kbGVyKTsKLQkJCi0JCWFkZEZhY3Rvcmllcyhtb2RlbCwgZ2V0QWRhcHRlckZhY3RvcmllcygpKTsKLQkJLy8gRm9yIHR5cGVzIHdpdGggcHJvcGFnYXRpbmcgYWRhcHRlcnMsIGl0J3MgaW1wb3J0YW50Ci0JCS8vIHRoYXQgdGhlIHByb3BhZ2F0aW5nIGFkYXB0ZXIgYmUgaW4gcGxhY2UgYmVmb3JlIHRoZSBjb250ZW50cwotCQkvLyBhcmUgc2V0LgotCQlwcmVMb2FkQWRhcHQobW9kZWwpOwotCQlpbml0RW1iZWRkZWRUeXBlUHJlKG1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCi0JCW1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkvLwotCQlpbml0RW1iZWRkZWRUeXBlUG9zdChtb2RlbCk7Ci0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGNsb25pbmcgbW9kZWxzLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwpIHsKLQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwgPSBuZXdNb2RlbCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IG9sZFN0cnVjdHVyZWREb2N1bWVudCA9IG9sZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IG5ld1N0cnVjdHVyZWREb2N1bWVudCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudC5uZXdJbnN0YW5jZSgpOwotCQluZXdNb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQobmV3U3RydWN0dXJlZERvY3VtZW50KTsKLQkJLy8gTk9URTogd2UgRE8gTk9UIHNpbXBseSBhZGQgdGhlIHN0YW5kYXJkIG9uZXMgdG8gdGhlIG5ldyBtb2RlbAotCQkvLyBhZGRGYWN0b3JpZXMobmV3TW9kZWwsIGdldEFkYXB0ZXJGYWN0b3JpZXMoKSk7Ci0JCS8vIE5vdywgd2UgdGFrZSB0aGUgb3Bwb3J0dW5pdHkgdG8gYWRkIEZhY3RvcmllcyBmcm9tIHRoZSBvbGRNb2RlbCdzCi0JCS8vIHJlZ2lzdHJ5IHRvIHRoZSBuZXcgbW9kZWwncyByZWdpc3RyeSAuLiBpZiB0aGV5IGRvIG5vdCBhbHJlYWR5Ci0JCS8vIGV4aXN0IHRoZXJlLgotCQlkdXBsaWNhdGVGYWN0b3J5UmVnaXN0cnkobmV3TW9kZWwsIG9sZE1vZGVsKTsKLQkJaWYgKG5ld01vZGVsIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCSgoQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIG5ld01vZGVsKS5zZXRDb250ZW50VHlwZUlkZW50aWZpZXIob2xkTW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCQl9Ci0JCS8vIGFkZEZhY3RvcmllcyhuZXdNb2RlbCwgb2xkTW9kZWwpOwotCQlpbml0RW1iZWRkZWRUeXBlKG9sZE1vZGVsLCBuZXdNb2RlbCk7Ci0JCS8vIEZvciB0eXBlcyB3aXRoIHByb3BhZ2F0aW5nIGFkYXB0ZXJzLCBpdHMgaW1wb3J0YW50Ci0JCS8vIHRoYXQgdGhlIHByb3BhZ2F0aW5nIGFkYXB0ZXIgYmUgaW4gcGxhY2UgYmVmb3JlIHRoZSBjb250ZW50cwotCQkvLyBhcmUgc2V0LgotCQlwcmVMb2FkQWRhcHQobmV3TW9kZWwpOwotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGR1cGxpY2F0ZUZhY3RvcnlSZWdpc3RyeShJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsKSB7Ci0JCUxpc3Qgb2xkQWRhcHRlckZhY3RvcmllcyA9IG9sZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcmllcygpOwotCQlMaXN0IG5ld0FkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIG9sZExpc3RJdGVyYXRvciA9IG9sZEFkYXB0ZXJGYWN0b3JpZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKG9sZExpc3RJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlOb2RlQWRhcHRlckZhY3Rvcnkgb2xkQWRhcHRlckZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgb2xkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCS8vIG5vdyAiY2xvbmUiIHRoZSBhZGFwdGVyZmFjdG9yeQotCQkJbmV3QWRhcHRlckZhY3Rvcmllcy5hZGQob2xkQWRhcHRlckZhY3RvcnkuY29weSgpKTsKLQkJfQotCQkvLyBub3cgdGhhdCB3ZSBoYXZlIHRoZSAiY2xvbmVkIiBsaXN0LCBhZGQgdG8gbmV3IG1vZGVsCi0JCWFkZEZhY3RvcmllcyhuZXdNb2RlbCwgbmV3QWRhcHRlckZhY3Rvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdGhvc2UgZmFjdG9yaWVzIHdoaWNoIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlCi0JICogc3RydWN0dXJlZE1vZGVsIGJlZm9yZSBjb250ZW50IGlzIGFwcGxpZWQuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpIHsKLQkJLy8gYWJzdHJhY3QgbWV0aG9kIHJldHVybnMgbm9uZQotCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgwKTsKLQl9Ci0KLQlhYnN0cmFjdCBwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCk7Ci0KLQkvKioKLQkgKiBNZXRob2QgaW5pdEVtYmVkZGVkVHlwZSwgInByZSItc3RhZ2UuIE5vdGhpbmcgdG8gZG8gaGVyZSBpbiBzdXBlciBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RW1iZWRkZWRUeXBlUHJlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgaW5pdEVtYmVkZGVkVHlwZSwgInByZSItc3RhZ2UuIEJ5IGRlZmF1bHQgc2ltcGx5IGNhbGxzIHRoZQotCSAqIHZlcnNpb24gb2YgdGhpcyBtZXRob2QgdGhhdCB1c2VzIG9ubHkgdGhlIHN0cnVjdHVyZWQgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICB0aGUgbW9kZWwgZm9yIHdoaWNoIHRvIGluaXRpYWxpemUKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50Ci0JICogICAgICAgICAgICBUaGUgc3RydWN0dXJlZCBkb2N1bWVudCBjb250YWluaW5nIHRoZSB0ZXh0IGNvbnRlbnQgZm9yIHRoZQotCSAqICAgICAgICAgICAgbW9kZWwsIHdoaWNoIG1heSBiZSBhIGRpZmZlcmVudCBpbnN0YW5jZSB0aGFuIHdoYXQgaXMgaW4gdGhlCi0JICogICAgICAgICAgICBtb2RlbCBhdCB0aGlzIHN0YWdlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRFbWJlZGRlZFR5cGVQcmUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJaW5pdEVtYmVkZGVkVHlwZVByZShtb2RlbCk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0RW1iZWRkZWRUeXBlUG9zdChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGluaXRFbWJlZGRlZFR5cGUuIE5vdGhpbmcgdG8gZG8gaGVyZSBpbiBzdXBlciBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkTW9kZWwKLQkgKiBAcGFyYW0gbmV3TW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RW1iZWRkZWRUeXBlKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQllbHNlCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChmaWxlKTsKLQotCQkvLyBUT0RPOiBuZWVkIHRvIHN0cmFpZ2h0ZW4gb3V0IElFbmNvZGVkRG9jdW1lbnQgbWVzcwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkKLQkJCXRyYW5zZm9ybUluc3RhbmNlKG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCAoSVN0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KTsKLQkJZWxzZQotCQkJbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuc2V0KHN0cnVjdHVyZWREb2N1bWVudC5nZXQoKSk7Ci0KLQkJLy8gb3JpZ2luYWwgaGFjawotCQkvLyBtb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCS8vIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vICgoSVN0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KS5maXJlTmV3RG9jdW1lbnQodGhpcyk7Ci0JCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCQkvLyB0ZWNobmljcSBvZiBmdXR1cmUKLQkJLy8gbW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KChJU3RydWN0dXJlZERvY3VtZW50KQotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkvLyBkb2N1bWVudExvYWRlckluc3RhbmNlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGUgd2UgZG9uJ3Qgb3BlbiB0aGUgc3RyZWFtLCBzbyB3ZSBkb24ndCBjbG9zZSBpdAotCQlJRW5jb2RlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotCQkJc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGFzc3VtZSdzIG1vZGVsIGhhcyBiZWVuIGluaXRpYWxpemVkIGFscmVhZHkgd2l0aCBiYXNlIGxvY2F0aW9uCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSwgaW5wdXRTdHJlYW0sIGVuY29kaW5nUnVsZSk7Ci0JCQkvLyBUT0RPOiBtb2RlbCdzIG5vdCBkZXNpZ25lZCBmb3IgdGhpcyEKLQkJCS8vIHdlIHdhbnQgdG8gbW92ZSB0byB0aGlzICJzZXQiIG1ldGhvZCwgYnV0IHRoZSAnZmlyZScgd2FzIG5lZWRlZAotCQkJLy8gYXMKLQkJCS8vIGEgd29yayBhcm91bmQgZm9yIHN0cnVjdXRyZWRNb2RlbCBub3QgaGFuZGxpbmcgJ3NldCcgcmlnaHQsIGJ1dAotCQkJLy8gdGhhdCAnZmlyZU5ld0RvY3VtZW50JyBtZXRob2Qgd2FzIGNhdXNpbmcgdW5iYWxhbmNlCi0JCQkvLyAiYWJvdXRUb0NoYW5nZSIgYW5kICJjaGFuZ2VkIgotCQkJLy8gZXZlbnRzLgotCQkJLy8gbW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KChJU3RydWN0dXJlZERvY3VtZW50KQotCQkJLy8gc3RydWN0dXJlZERvY3VtZW50KTsKLQkJCS8vICgoSVN0cnVjdHVyZWREb2N1bWVudCkKLQkJCS8vIHN0cnVjdHVyZWREb2N1bWVudCkuZmlyZU5ld0RvY3VtZW50KHRoaXMpOwotCQkJbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuc2V0KHN0cnVjdHVyZWREb2N1bWVudC5nZXQoKSk7Ci0KLQkJfQotCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbnVsbDsKLQotCX0KLQotCS8qKgotCSAqIGRlcHJlY2F0ZWQgLS0gdXNlIEVuY29kaW5nUnVsZSBmb3JtCi0JICovCi0Jc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIGxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFN0cmluZyBlbmNvZGluZ05hbWUsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGUgd2UgZG9uJ3Qgb3BlbiB0aGUgc3RyZWFtLCBzbyB3ZSBkb24ndCBjbG9zZSBpdAotCQkvLyBURU1QIHdvcmsgYXJvdW5kIHRvIG1haW50YWluIHByZXZpb3VzIGZ1bmN0aW9uLAotCQkvLyB1bnRpbCBldmVyeW9uZSBjYW4gY2hhbmdlIHRvIEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUCi0JCWlmIChlbmNvZGluZ05hbWUgIT0gbnVsbCAmJiBlbmNvZGluZ05hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCS8vIHJlZGlyZWN0IHRvIG5ldyBtZXRob2QKLQkJCWxvYWQoaW5wdXRTdHJlYW0sIG1vZGVsLCBFbmNvZGluZ1J1bGUuRk9SQ0VfREVGQVVMVCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlsb2FkKGlucHV0U3RyZWFtLCBtb2RlbCwgRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBTdHJpbmcganVuaywgU3RyaW5nIGR1bW15KSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLQkJbG9uZyBtZW1vcnlVc2VkID0gMDsKLQkJaWYgKERFQlVHKSB7Ci0JCQltZW1vcnlVc2VkID0gY29tcHV0ZU1lbSgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJtZWFzdXJpbmcgaGVhcCBtZW1vcnkgZm9yICIgKyBmaWxlbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaGVhcCBtZW1vcnkgdXNlZCBiZWZvcmUgbG9hZDogIiArCi0JCQkvLyBtZW1vcnlVc2VkKTsKLQkJfQotCi0JCS8vIGR1cmluZyBhbiBpbml0aWFsIGxvYWQsIHdlIGV4cGVjdCB0aGUgb2xkZG9jdW1lbnQgdG8gYmUgZW1wdHkKLQkJLy8gZHVyaW5nIHJlLWxvYWQsIGhvd2V2ZXIsIGl0IHdvdWxkIGJlIGZ1bGwuCi0JCUlFbmNvZGVkRG9jdW1lbnQgbmV3c3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQkJSUVuY29kZWREb2N1bWVudCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkvLyBnZXQgbmV3IGRvY3VtZW50Ci0JCWlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0JCQluZXdzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJbmV3c3RydWN0dXJlZERvY3VtZW50ID0gZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoZmlsZW5hbWUsIGlucHV0U3RyZWFtKTsKLQkJfQotCQlpZiAoREVCVUcpIHsKLQkJCWxvbmcgbWVtb3J5QXRFbmQgPSBjb21wdXRlTWVtKCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImhlYXAgbWVtb3J5IHVzZWQgYWZ0ZXIgbG9hZGluZyBuZXcKLQkJCS8vIGRvY3VtZW50OiAiICsgbWVtb3J5QXRFbmQpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgaGVhcCBtZW1vcnkgaW1wbGllZCB1c2VkIGJ5IGRvY3VtZW50OiAiICsgKG1lbW9yeUF0RW5kIC0gbWVtb3J5VXNlZCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCi0JCS8vIFRPRE86IG5lZWQgdG8gc3RyYWlnaHRlbiBvdXQgSUVuY29kZWREb2N1bWVudCBtZXNzCi0JCWlmIChuZXdzdHJ1Y3R1cmVkRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQl0cmFuc2Zvcm1JbnN0YW5jZSgoSVN0cnVjdHVyZWREb2N1bWVudCkgb2xkU3RydWN0dXJlZERvY3VtZW50LCAoSVN0cnVjdHVyZWREb2N1bWVudCkgbmV3c3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHdlIGRvbid0IHJlYWxseSBleHBlY3QgdGhpcyBjYXNlLCBqdXN0IGluY2x1ZGVkIGZvciBzYWZldHkKLQkJCW9sZFN0cnVjdHVyZWREb2N1bWVudC5zZXQobmV3c3RydWN0dXJlZERvY3VtZW50LmdldCgpKTsKLQkJfQotCQkvLyBvcmlnaW5hbCBoYWNrCi0JCS8vIG1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudCgoSVN0cnVjdHVyZWREb2N1bWVudCkKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50KTsKLQkJLy8gKChJU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLmZpcmVOZXdEb2N1bWVudCh0aGlzKTsKLQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG51bGw7Ci0JCS8vIHRlY2huaWNxIG9mIGZ1dHVyZQotCQkvLyBtb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCS8vIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vIGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCQlpZiAoREVCVUcpIHsKLQkJCWxvbmcgbWVtb3J5QXRFbmQgPSBjb21wdXRlTWVtKCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImhlYXAgbWVtb3J5IHVzZWQgYWZ0ZXIgc2V0dGluZyB0byBtb2RlbDogIgotCQkJLy8gKyBtZW1vcnlBdEVuZCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBoZWFwIG1lbW9yeSBpbXBsaWVkIHVzZWQgYnkgZG9jdW1lbnQgYW5kIG1vZGVsOiAiICsgKG1lbW9yeUF0RW5kIC0gbWVtb3J5VXNlZCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIHJlcXVpcmVkIGJ5IGludGVyZmFjZSwgYmVpbmcgZGVjbGFyZWQgaGVyZSBhYnN0cmFjdGx5IGp1c3QgYXMgYW5vdGhlcgotCSAqIHJlbWluZGVyLgotCSAqLwotCWFic3RyYWN0IHB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKCk7Ci0KLQkvKioKLQkgKiBUaGVyZSdzIG5vdGhpbmcgdG8gZG8gaGVyZSBpbiBhYnN0cmFjdCBjbGFzcyBmb3IgaW5pdGlhbGl6aW5nIGFkYXB0ZXJzLgotCSAqIFN1YmNsYXNzZXMgY2FuIGFuZCBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIHByb3ZpZGUgcHJvcGVyCi0JICogaW50aWFsaXphdGlvbiAoRm9yIGV4YW1wbGUsIHRvIGdldCBET00gZG9jdW1lbnQgYW5kICdnZXRBZGFwdGVyJyBvbiBpdCwKLQkgKiBzbyB0aGF0IHRoZSBmaXJzdCBub2RlL25vdGlmaWVyIGhhcyB0aGUgYWRhcHRlciBvbiBpdC4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJlTG9hZEFkYXB0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQotCX0KLQotCS8qKgotCSAqIE5vcm1hbGx5LCBoZXJlIGluIHRoZSBhYnN0YWN0IGNsYXNzLCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8sIGJ1dCB3ZSB3aWxsCi0JICogcmVzZXQgdGV4dCwgc2luY2UgdGhpcyBNSUdIVCBlbmQgdXAgYmVpbmcgY2FsbGVkIHRvIHJlY292ZXIgZnJvbSBlcnJvcgotCSAqIGNvbmRpdGlvbnMgKGUuZy4gSVN0cnVjdHVyZWREb2N1bWVudCBleGNlcHRpb25zKSBBbmQsIGNhbiBiZSBjYWxsZWQgYnkKLQkgKiBzdWJjbGFzc2VzLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIHJlaW5pdGlhbGl6ZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCS8vIE5vdGU6IHRoZSAibWluaW11bWl6YXRpb24iIHJvdXRpbmVzCi0JCS8vIG9mICdyZXBsYWNlVGV4dCcgYWxsb3cgbWFueSBvbGQgbm9kZXMgdG8gcGFzcyB0aHJvdWdoLCB3aGVuCi0JCS8vIHJlYWxseSBpdHMgYXNzdW1lZCB0aGV5IGFyZSBjcmVhdGVkIGFuZXcuCi0JCS8vIHNvIHdlIG5lZWQgdG8gdXNlICdzZXRUZXh0JyAoSSB0aGluayAic2V0VGV4dCcgZW5kcyB1cAotCQkvLyB0aHJvd2luZyBhICduZXdNb2RlbCcgZXZlbnQgdGhvdWdoLCB0aGF0IG1heSBoYXZlIHNvbWUKLQkJLy8gaW1wbGljYXRpb25zLgotCQltb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5zZXRUZXh0KHRoaXMsIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpKTsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgYSBmcmVzaCBjb3B5IG9mIHRoZSBkYXRhLCBhbmQgcmVwb3B1bGF0ZXMgdGhlIG1vZGVscwotCSAqIC4uLiBieSBhIGNhbGwgdG8gc2V0VGV4dCBvbiB0aGUgc3RydWN0dXJlZERvY3VtZW50LiBUaGlzIG1ldGhvZCBpcwotCSAqIG5lZWRlZCBpbiBzb21lIGNhc2VzIHdoZXJlIGNsaWVudHMgYXJlIHNoYXJpbmcgYSBtb2RlbCBhbmQgdGhlbiBjaGFuZ2VzCi0JICogY2FuY2VsZWQuIFNheSBmb3IgZXhhbXBsZSwgb25lIGVkaXRvciBhbmQgc2V2ZXJhbCAiZGlzcGxheXMiIGFyZQotCSAqIHNoYXJpbmcgYSBtb2RlbCwgaWYgdGhlIGVkaXRvciBpcyBjbG9zZWQgd2l0aG91dCBzYXZpbmcgY2hhbmdlcywgdGhlbgotCSAqIHRoZSBkaXNwbGF5cyBzdGlsbCBuZWVkIGEgbW9kZWwsIGJ1dCB0aGV5IHNob3VsZCByZXZlcnQgdG8gdGhlIG9yaWdpbmFsCi0JICogdW5zYXZlZCB2ZXJzaW9uLgotCSAqLwotCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCByZWxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCQl0cnkgewotCQkJLy8gdGVtcCBzb2x1dGlvbiAuLi4gd2Ugc2hvdWxkIGJlIGFibGUgdG8gZG8gYmV0dGVyIChtb3JlCi0JCQkvLyBlZmZpY2llbnQpIGluIGZ1dHVyZS4KLQkJCS8vIEFkYXB0ZXJzIHdpbGwgKHByb2JhYmx5KSBuZWVkIHRvIGJlIHNlbnNpdGl2ZSB0byB0aGUgZmFjdCB0aGF0Ci0JCQkvLyB0aGUgZG9jdW1lbnQgaW5zdGFuY2UgY2hhbmdlZAotCQkJLy8gKGJ5IGJlaW5nIGxpZmUgY3ljbGUgbGlzdGVuZXJzKQotCQkJbG9hZChpbnB1dFN0cmVhbSwgc3RydWN0dXJlZE1vZGVsLCBFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0KLQkJCS8vIC8vIE5vdGU6IHdlIGFwcGFyZW50bHkgcmVhZCB0aGUgZGF0YSAoYW5kIGVuY29kaW5nKSBjb3JyZWN0bHkKLQkJCS8vIC8vIGJlZm9yZSwgd2UganVzdCBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBmb2xsb3dlZCB0aGUgc2FtZSBydWxlCi0JCQkvLyBhcwotCQkJLy8gLy8gYmVmb3JlLgotCQkJLy8gRW5jb2RpbmdNZW1lbnRvIHByZXZpb3VzTWVtZW50byA9Ci0JCQkvLyBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQkvLyBFbmNvZGluZ1J1bGUgcHJldmlvdXNSdWxlID0gcHJldmlvdXNNZW1lbnRvLmdldEVuY29kaW5nUnVsZSgpOwotCQkJLy8gLy9JRmlsZSBmaWxlID0gUmVzb3VyY2VVdGlsLmdldEZpbGVGb3Ioc3RydWN0dXJlZE1vZGVsKTsKLQkJCS8vIC8vIE5vdGU6IHRoZXJlJ3Mgb3Bwb3J0dW5pdHkgaGVyZSBmb3Igc29tZSBvZGQgYmVoYXZpb3IsIGlmIHRoZQotCQkJLy8gLy8gc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkIGZyb20gdGhlIGZpcnN0IGxvYWQgdG8gdGhlIHJlbG9hZC4KLQkJCS8vIEJ1dCwKLQkJCS8vIC8vIGhvcGVmdWxseSwKLQkJCS8vIC8vIHdpbGwgcmVzdWx0IGluIHRoZSBpbnRlbmRlZCBiZWhhdmlvci4KLQkJCS8vIFJlYWRlciBhbGxUZXh0UmVhZGVyID0KLQkJCS8vIGdldERvY3VtZW50TG9hZGVyKCkucmVhZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBwcmV2aW91c1J1bGUpOwotCQkJLy8KLQkJCS8vIC8vIFRPRE86IGF2b2lkIHVzZSBvZiBTdHJpbmcgaW5zdGFuY2UKLQkJCS8vIGdldERvY3VtZW50TG9hZGVyKCkucmVsb2FkKHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwKLQkJCS8vIGFsbFRleHRSZWFkZXIpOwotCQkJLy8gLy8gYW5kIG5vdyAicmVzZXQiIGVuY29kaW5nIG1lbWVudG8gdG8ga2VlcCBpdCBjdXJyZW50IHdpdGggdGhlCi0JCQkvLyAvLyBvbmUKLQkJCS8vIC8vIHRoYXQgd2FzIGp1c3QgZGV0ZXJtaW5lZC4KLQkJCS8vIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5zZXRFbmNvZGluZ01lbWVudG8oZ2V0RG9jdW1lbnRMb2FkZXIoKS5nZXRFbmNvZGluZ01lbWVudG8oKSk7Ci0JCQkvLyBzdHJ1Y3R1cmVkTW9kZWwuc2V0RGlydHlTdGF0ZShmYWxzZSk7Ci0JCQkvLyBTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVuZG9NZ3IgPQotCQkJLy8gc3RydWN0dXJlZE1vZGVsLmdldFVuZG9NYW5hZ2VyKCk7Ci0JCQkvLyBpZiAodW5kb01nciAhPSBudWxsKSB7Ci0JCQkvLyB1bmRvTWdyLnJlc2V0KCk7Ci0JCQkvLyB9Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJLy8gY291bGRuJ3QgaGFwcGVuLiBUaGUgcHJvZ3JhbSBoYXMgYXBwYXJlbnRseQotCQkJLy8gcmVhZCB0aGUgbW9kZWwgb25jZSwgYW5kIHRoZXJlJ2QgYmUgbm8gcmVhc29uIHRoZSBlbmNvZGluZwotCQkJLy8gY291bGQgbm90IGJlIHVzZWQgYWdhaW4uCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJXYXJuaW5nOiAgWE1MTG9hZGVyOjpyZWxvYWQuICBUaGlzIGV4Y2VwdGlvbiByZWFsbHkgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkISEgQnV0IHdpbGwgYXR0ZW1wIHRvIGNvbnRpbnVlIGFmdGVyIGR1bXBpbmcgc3RhY2sgdHJhY2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEVycm9yKCJQcm9ncmFtIEVycm9yIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gY291bGRuJ3QgaGFwcGVuLiBUaGUgcHJvZ3JhbSBoYXMgYXBwYXJlbnRseQotCQkJLy8gcmVhZCB0aGUgbW9kZWwgb25jZSwgYW5kIHRoZXJlJ2QgYmUgbm8gKGNvbW1vbikgcmVhc29uIGl0Ci0JCQkvLyBjb3VsZG4ndCBiZSBsb2FkZWQgYWdhaW4uCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJXYXJuaW5nOiAgWE1MTG9hZGVyOjpyZWxvYWQuICBUaGlzIGV4Y2VwdGlvbiByZWFsbHkgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkISEgQnV0IHdpbGwgYXR0ZW1wIHRvIGNvbnRpbnVlIGFmdGVyIGR1bXBpbmcgc3RhY2sgdHJhY2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEVycm9yKCJQcm9ncmFtIEVycm9yIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIHRoaXMgd29yayBpcyBkb25lIGJldHRlciBlbHNld2hlcmUsIGJ1dCBkb25lIGhlcmUgZm9yIHRoaXMgdmVyc2lvbiB0bwotCSAqIHJlZHVjZSBjaGFuZ2VzLiBlc3BlY2lhbGx5IHNpbmNlIHRoZSBuZWVkIGZvciBpdCBzaG91bGQgZ28gYXdheSBvbmNlIHdlCi0JICogbm8gbG9uZ2VyIG5lZWQgdG8gcmUtdXNlIG9sZCBkb2N1bWVudCBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJhbnNmb3JtSW5zdGFuY2UoSVN0cnVjdHVyZWREb2N1bWVudCBvbGRJbnN0YW5jZSwgSVN0cnVjdHVyZWREb2N1bWVudCBuZXdJbnN0YW5jZSkgewotCQkvKioKLQkJICogaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ5MjAKLQkJICogCi0JCSAqIEpTUCB0YWdsaWIgc3VwcG9ydCBicm9rZW4sIGNvcnJlY3QgYnkgZHVwbGljYXRpbmcgZXh0ZW5kZWQgc2V0dXAKLQkJICogaW5mb3JtYXRpb24gKEJsb2NrVGFnUGFyc2VyIGV4dGVuc2lvbiwKLQkJICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIGV4dGVuc2lvbnMpCi0JCSAqLwotCQlSZWdpb25QYXJzZXIgb2xkUGFyc2VyID0gb2xkSW5zdGFuY2UuZ2V0UGFyc2VyKCk7Ci0JCVJlZ2lvblBhcnNlciBuZXdQYXJzZXIgPSBuZXdJbnN0YW5jZS5nZXRQYXJzZXIoKS5uZXdJbnN0YW5jZSgpOwotCQkvLyBSZWdpc3RlciBhbGwgb2YgdGhlIG9sZCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyBvbiB0aGUgbmV3Ci0JCS8vIHBhcnNlcgotCQlpZiAob2xkUGFyc2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uICYmIG5ld1BhcnNlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbikgewotCQkJTGlzdCBvbGRIYW5kbGVycyA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uKSBvbGRQYXJzZXIpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZEhhbmRsZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBoYW5kbGVyID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKSBvbGRIYW5kbGVycy5nZXQoaSkpOwotCQkJCWlmIChoYW5kbGVyIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbikgewotCQkJCQkvKioKLQkJCQkJICogU2tpcCB0aGUgdHJhbnNmZXJyaW5nIGhlcmUsIHRoZSBoYW5kbGVyIHdpbGwgZG8gdGhpcwotCQkJCQkgKiBhZnRlciBldmVyeXRoaW5nIGVsc2UgYnV0IHRoZSBzb3VyY2UgaXMgdHJhbnNmZXJyZWQuCi0JCQkJCSAqLwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIpIG9sZFBhcnNlcikucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihoYW5kbGVyKTsKLQkJCQkJKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIpIG5ld1BhcnNlcikuYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihoYW5kbGVyKTsKLQkJCQkJaGFuZGxlci5yZXNldE5vZGVzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIEFkZCBhbnkgZ2xvYmFsIEJsb2NrTWFya2VycyB0byB0aGUgbmV3IHBhcnNlcgotCQlpZiAob2xkUGFyc2VyIGluc3RhbmNlb2YgQmxvY2tUYWdQYXJzZXIgJiYgbmV3UGFyc2VyIGluc3RhbmNlb2YgQmxvY2tUYWdQYXJzZXIpIHsKLQkJCUxpc3Qgb2xkQmxvY2tNYXJrZXJzID0gKChCbG9ja1RhZ1BhcnNlcikgb2xkUGFyc2VyKS5nZXRCbG9ja01hcmtlcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkQmxvY2tNYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQmxvY2tNYXJrZXIgYmxvY2tNYXJrZXIgPSAoKEJsb2NrTWFya2VyKSBvbGRCbG9ja01hcmtlcnMuZ2V0KGkpKTsKLQkJCQlpZiAoYmxvY2tNYXJrZXIuaXNHbG9iYWwoKSkgewotCQkJCQkoKEJsb2NrVGFnUGFyc2VyKSBuZXdQYXJzZXIpLmFkZEJsb2NrTWFya2VyKGJsb2NrTWFya2VyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBvbGRJbnN0YW5jZSkuc2V0UGFyc2VyKG5ld1BhcnNlcik7Ci0KLQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgb2xkSW5zdGFuY2UpLnNldFJlUGFyc2VyKG5ld0luc3RhbmNlLmdldFJlUGFyc2VyKCkubmV3SW5zdGFuY2UoKSk7Ci0KLQkJaWYgKG5ld0luc3RhbmNlLmdldERvY3VtZW50UGFydGl0aW9uZXIoKSBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIpIHsKLQkJCVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBudWxsOwotCQkJaWYgKG9sZEluc3RhbmNlIGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMyAmJiBuZXdJbnN0YW5jZSBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjMpIHsKLQkJCQlwYXJ0aXRpb25lciA9ICgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgKChJRG9jdW1lbnRFeHRlbnNpb24zKSBuZXdJbnN0YW5jZSkuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HKSk7Ci0JCQkJaWYgKHBhcnRpdGlvbmVyICE9IG51bGwpIHsKLQkJCQkJcGFydGl0aW9uZXIgPSAoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgcGFydGl0aW9uZXIubmV3SW5zdGFuY2UoKTsKLQkJCQl9Ci0JCQkJKChJRG9jdW1lbnRFeHRlbnNpb24zKSBvbGRJbnN0YW5jZSkuc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCBwYXJ0aXRpb25lcik7Ci0JCQl9Ci0JCQlpZiAocGFydGl0aW9uZXIgPT0gbnVsbCkgewotCQkJCXBhcnRpdGlvbmVyID0gKFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIpICgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgbmV3SW5zdGFuY2UuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpKS5uZXdJbnN0YW5jZSgpOwotCQkJCW9sZEluc3RhbmNlLnNldERvY3VtZW50UGFydGl0aW9uZXIocGFydGl0aW9uZXIpOwotCQkJfQotCQkJaWYgKHBhcnRpdGlvbmVyICE9IG51bGwpIHsKLQkJCQlwYXJ0aXRpb25lci5jb25uZWN0KG9sZEluc3RhbmNlKTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBleGlzdGluZ0xpbmVEZWxpbWl0ZXIgPSBudWxsOwotCQl0cnkgewotCQkJZXhpc3RpbmdMaW5lRGVsaW1pdGVyID0gbmV3SW5zdGFuY2UuZ2V0TGluZURlbGltaXRlcigwKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gaWYgZW1wdHkgZmlsZSwgYXNzdW1lIHBsYXRmb3JtIGRlZmF1bHQKLQkJCS8vIFRPRE86IHNob3VsZCBiZSB1c2luZyB1c2VyIHNldCBwcmVmZXJlbmNlLCBwZXIgY29udGVudCB0eXBlPwotCQkJZXhpc3RpbmdMaW5lRGVsaW1pdGVyID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlvbGRJbnN0YW5jZS5zZXRMaW5lRGVsaW1pdGVyKGV4aXN0aW5nTGluZURlbGltaXRlcik7IC8vJE5PTi1OTFMtMSQpOwotCQlpZiAobmV3SW5zdGFuY2UuZ2V0RW5jb2RpbmdNZW1lbnRvKCkgIT0gbnVsbCkgewotCQkJb2xkSW5zdGFuY2Uuc2V0RW5jb2RpbmdNZW1lbnRvKChFbmNvZGluZ01lbWVudG8pIG5ld0luc3RhbmNlLmdldEVuY29kaW5nTWVtZW50bygpLmNsb25lKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00OTIwCi0JCSAqIAotCQkgKiBKU1AgdGFnbGliIHN1cHBvcnQgYnJva2VuLCBjb3JyZWN0IGJ5IGR1cGxpY2F0aW5nIGV4dGVuZGVkIHNldHVwCi0JCSAqIGluZm9ybWF0aW9uIChCbG9ja1RhZ1BhcnNlciBleHRlbnNpb24sCi0JCSAqIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlciBleHRlbnNpb25zKQotCQkgKi8KLQkJaWYgKG9sZFBhcnNlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbiAmJiBuZXdQYXJzZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb24pIHsKLQkJCUxpc3Qgb2xkSGFuZGxlcnMgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbikgb2xkUGFyc2VyKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRIYW5kbGVycy5zaXplKCk7IGkrKykgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgaGFuZGxlciA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcikgb2xkSGFuZGxlcnMuZ2V0KGkpKTsKLQkJCQlpZiAoaGFuZGxlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24pIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbiBoYW5kbGVyRXh0ZW5zaW9uID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24pIGhhbmRsZXI7Ci0JCQkJCWhhbmRsZXJFeHRlbnNpb24uc2V0U3RydWN0dXJlZERvY3VtZW50KG9sZEluc3RhbmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGhvbGRTdHJpbmcgPSBuZXdJbnN0YW5jZS5nZXQoKTsKLQkJbmV3SW5zdGFuY2UgPSBudWxsOwotCQlvbGRJbnN0YW5jZS5zZXQoaG9sZFN0cmluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdFN0cnVjdHVyZWRNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdFN0cnVjdHVyZWRNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODE4ZmNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLklMb2NrYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5Eb2N1bWVudENoYW5nZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExpZmVjeWNsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuQWJvdXRUb0JlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsIGltcGxlbWVudHMgSVN0cnVjdHVyZWRNb2RlbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfTUFOQUdFUl9OVUxMID0gIldhcm5pbmc6IEFic3RyYWN0U3RydWN0dXJlZE1vZGVsOjpjbG9zZTogIG1vZGVsIG1hbmFnZXIgd2FzIG51bGwgZHVyaW5nIGEgY2xvc2Ugb2YgYSBtb2RlbCAod2hpY2ggc2hvdWxkIGJlIGltcG9zc2libGUpIjsgLy8kTk9OLU5MUy0xJAotCi0JY2xhc3MgRGlydHlTdGF0ZVdhdGNoZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQkJLy8gSSBkb24ndCB0aGluayBpdHMgc2FmZSB0byBhc3N1bWUgYSBuZXcgbW9kZWwKLQkJCS8vIGlzIGFsd2F5cyAiZnJlc2giLCBzbyB3ZSdsbCBsZWF2ZSBkaXJ0eSBzdGF0ZQotCQkJLy8gdW5jaGFuZ2VkOwotCQkJLy8gYnV0IHdlJ2xsIHRlbGwgZXZlcnlvbmUgYWJvdXQgaXQuCi0JCQlzZXREaXJ0eVN0YXRlKGZEaXJ0eVN0YXRlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQkJLy8gZG9uJ3QgY2hhbmdlIGRpcnR5IHN0YXRlCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCXNldERpcnR5U3RhdGUodHJ1ZSk7Ci0JCQkvLyBubyBuZWVkIHRvIGxpc3RlbiBhbnkgbW9yZQotCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkRpcnR5U3RhdGVXYXRjaGVyKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCXNldERpcnR5U3RhdGUodHJ1ZSk7Ci0JCQkvLyBubyBuZWVkIHRvIGxpc3RlbiBhbnkgbW9yZQotCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkRpcnR5U3RhdGVXYXRjaGVyKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCQlzZXREaXJ0eVN0YXRlKHRydWUpOwotCQkJLy8gbm8gbmVlZCB0byBsaXN0ZW4gYW55IG1vcmUKLQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZEaXJ0eVN0YXRlV2F0Y2hlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBEb2N1bWVudFRvTW9kZWxOb3RpZmllciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciwgSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyIHsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyI21vZGVsQWJvdXRUb0JlQ2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLkFib3V0VG9CZUNoYW5nZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChBYm91dFRvQmVDaGFuZ2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCS8vIElmIHdlIGRpZG4ndCBvcmlnaW5hdGUgdGhlIGNoYW5nZSwgdGFrZSBub3RlIHdlIGFyZSBhYm91dCB0bwotCQkJLy8gY2hhbmdlIGJhc2VkIG9uIG91ciB1bmRlcmx5aW5nIGRvY3VtZW50IGNoYW5naW5nLgotCQkJLy8gSWYgd2UgZGlkIG9yaWdpbmF0ZSB0aGUgY2hhbmdlLCB3ZSwgb3IgY2xpZW50LCBzaG91bGQgaGF2ZQotCQkJLy8gYWxyZWFkeSBjYWxsZWQgYWJvdXRUb0NoYW5nZU1vZGVsLgotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgIT0gdGhpcykgewotCQkJCWFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJfQotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI25ld01vZGVsKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuTmV3RG9jdW1lbnRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCS8vIGlmIHdlIGRpZG4ndCBvcmlnaW5hdGUgdGhlIGNoYW5nZSwgdGFrZSBub3RlIHdlIGhhdmUgY2hhbmdlZAotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgIT0gdGhpcykgewotCQkJCWNoYW5nZWRNb2RlbCgpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNub0NoYW5nZShvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5vQ2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBpZiB3ZSBkaWRuJ3Qgb3JpZ2luYXRlIHRoZSBjaGFuZ2UsIHRha2Ugbm90ZSB3ZSBoYXZlIGNoYW5nZWQKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpICE9IHRoaXMpIHsKLQkJCQljaGFuZ2VkTW9kZWwoKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIjbm9kZXNSZXBsYWNlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJLy8gaWYgd2UgZGlkbid0IG9yaWdpbmF0ZSB0aGUgY2hhbmdlLCB0YWtlIG5vdGUgd2UgaGF2ZSBjaGFuZ2VkCi0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSAhPSB0aGlzKSB7Ci0JCQkJY2hhbmdlZE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI3JlZ2lvbkNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJLy8gaWYgd2UgZGlkbid0IG9yaWdpbmF0ZSB0aGUgY2hhbmdlLCB0YWtlIG5vdGUgd2UgaGF2ZSBjaGFuZ2VkCi0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSAhPSB0aGlzKSB7Ci0JCQkJY2hhbmdlZE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI3JlZ2lvbnNSZXBsYWNlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBpZiB3ZSBkaWRuJ3Qgb3JpZ2luYXRlIHRoZSBjaGFuZ2UsIHRha2Ugbm90ZSB3ZSBoYXZlIGNoYW5nZWQKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpICE9IHRoaXMpIHsKLQkJCQljaGFuZ2VkTW9kZWwoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5OwotCXByaXZhdGUgU3RyaW5nIGZCYXNlTG9jYXRpb247Ci0JYm9vbGVhbiBmRGlydHlTdGF0ZTsKLQlEaXJ0eVN0YXRlV2F0Y2hlciBmRGlydHlTdGF0ZVdhdGNoZXI7Ci0JRG9jdW1lbnRUb01vZGVsTm90aWZpZXIgZkRvY3VtZW50VG9Nb2RlbE5vdGlmaWVyOwotCXByaXZhdGUgU3RyaW5nIGZFeHBsaWNpdENvbnRlbnRUeXBlSWRlbnRpZmllcjsKLQlwcml2YXRlIFN0cmluZyBmSWQ7Ci0KLQlwcml2YXRlIExpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIgZkxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXI7Ci0KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBmTGlzdGVuZXJMb2NrID0gbmV3IGJ5dGVbMF07Ci0JcHJvdGVjdGVkIElMb2NrIGZMb2NrT2JqZWN0OwotCS8vIHByaXZhdGUgU3RyaW5nIGZMaW5lRGVsaW1pdGVyOwotCS8vIHByaXZhdGUgT2JqZWN0IGZUeXBlOwotCXByaXZhdGUgSU1vZGVsSGFuZGxlciBmTW9kZWxIYW5kbGVyOwotCS8vIGlzc3VlOiB3ZSBzaG91bGQgbm90ICJob2xkIG9uIiB0byBtb2RlbCBtYW5hZ2VyLCBjYW4gCi0JLy8gZWFzaWx5IGdldCB3aXRoIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JLy8gYnV0IHdpbGwgbmVlZCB0byBhZGQgbW9yZSBudWxsIGNoZWNrcy4KLQlwcml2YXRlIElNb2RlbE1hbmFnZXIgZk1vZGVsTWFuYWdlcjsKLQlwcml2YXRlIGludCBmTW9kZWxTdGF0ZUNoYW5naW5nOwotCXByaXZhdGUgT2JqZWN0W10gZk1vZGVsU3RhdGVMaXN0ZW5lcnM7Ci0JcHJpdmF0ZSBib29sZWFuIGZOZXdTdGF0ZSA9IGZhbHNlOwotCXByaXZhdGUgVVJJUmVzb2x2ZXIgZlJlc29sdmVyOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JLyoqCi0JICogVGhlIHRpbWUgc3RhbXAgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UncyBtb2RpZmljYXRpb24gZGF0ZSwgYXQgdGhlCi0JICogdGltZSB0aGlzIG1vZGVsIHdhcyBjcmVhdGVkLCBvciB0aGUgbGFzdCB0aW1lIGl0IHdhcyBzYXZlZC4gTm90ZTogZm9yCi0JICogdGhpcyB2ZXJzaW9uLCB0aGlzIHZhcmlhYmxlIGlzIG5vdCBzZXQgYXV0b21hdGljYWxseSwgYmUgbmVlZHMgdG8gYmUKLQkgKiBtYW5hZ2VkIGJ5IGNsaWVudC4gVGhlIEZpbGVNb2RlbFByb3ZpZGVyIGRvZXMgdGhpcyBmb3IgbW9zdCBjYXNlcywgYnV0Ci0JICogaWYgY2xpZW50IGRvIG5vdCB1c2UgRmlsZU1vZGVsUHJvdmlkZXIsIHRoZXkgbXVzdCBzZXQgdGhpcyB2YXJpYWJsZQotCSAqLwotCXB1YmxpYyBsb25nIGZTeW5jaHJvbml6YXRpb25TdGFtcCA9IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCXByaXZhdGUgYm9vbGVhbiByZWluaXRpYWxpemF0aW9uTmVlZGVkOwotCXByaXZhdGUgT2JqZWN0IHJlaW5pdGlhbGl6ZVN0YXRlRGF0YTsKLQotCS8qKgotCSAqIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKCkgewotCi0JCXN1cGVyKCk7Ci0JCWZEaXJ0eVN0YXRlV2F0Y2hlciA9IG5ldyBEaXJ0eVN0YXRlV2F0Y2hlcigpOwotCQlmRG9jdW1lbnRUb01vZGVsTm90aWZpZXIgPSBuZXcgRG9jdW1lbnRUb01vZGVsTm90aWZpZXIoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGp1c3QgZm9yIGdldHRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIG1hbmFnZXIgb2YgdGhlCi0JICogcmlnaHQgSW1wbCB0eXBlLCB0byBiZSB1c2VkICJpbnRlcm5hbGx5IiBmb3IgbWFraW5nIHByb3RlY3RlZCBjYWxscwotCSAqIGRpcmVjdGx5IHRvIHRoZSBpbXBsIGNsYXNzLgotCSAqLwotCXByaXZhdGUgTW9kZWxNYW5hZ2VySW1wbCBfZ2V0TW9kZWxNYW5hZ2VyKCkgewotCQkvLyBUT0RPX2Z1dHVyZTogcmVkZXNpZ24gc28gd2UgZG9uJ3QgbmVlZCB0aGlzICdJbXBsJyB2ZXJzaW9uCi0JCWlmIChmTW9kZWxNYW5hZ2VyID09IG51bGwpIHsKLQkJCWZNb2RlbE1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQl9Ci0KLQkJcmV0dXJuIChNb2RlbE1hbmFnZXJJbXBsKSBmTW9kZWxNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgQVBJIGFsbG93cyBjbGllbnRzIHRvIGRlY2xhcmUgdGhhdCB0aGV5IGFyZSBhYm91dCB0byBtYWtlIGEKLQkgKiAibGFyZ2UiIGNoYW5nZSB0byB0aGUgbW9kZWwuIFRoaXMgY2hhbmdlIG1pZ2h0IGJlIGluIHRlcm1zIG9mIGNvbnRlbnQKLQkgKiBvciBpdCBtaWdodCBiZSBpbiB0ZXJtcyBvZiB0aGUgbW9kZWwgaWQgb3IgYmFzZSBsb2NhdGlvbi4gTm90ZSB0aGF0IGluCi0JICogdGhlIGNhc2Ugb2YgZW1iZWRkZWQgY2FsbHMsIG5vdGlmaWNhdGlvbiB0byBsaXN0ZW5lcnMgaXMgc2VudCBvbmx5Ci0JICogb25jZS4gTm90ZSB0aGF0IHRoZSBjbGllbnQgd2hvIGlzIG1ha2luZyB0aGVzZSBjaGFuZ2VzIGhhcyB0aGUKLQkgKiByZXNwb25zaWJpbGl0eSB0byByZXN0b3JlIHRoZSBtb2RlbHMgc3RhdGUgb25jZSBmaW5pc2hlZCB3aXRoIHRoZQotCSAqIGNoYW5nZXMuIFNlZSBnZXRNZW1lbnRvIGFuZCByZXN0b3JlU3RhdGUuIFRoZSBtZXRob2QKLQkgKiBpc01vZGVsU3RhdGVDaGFuZ2luZyBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZGVsCi0JICogaXMgYWxyZWFkeSBpbiBhIGNoYW5nZSBzZXF1ZW5jZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhYm91dFRvQ2hhbmdlTW9kZWwoKSB7Ci0KLQotCQkvLyBub3RpY2UgdGhpcyBpcyBqdXN0IGEgcHVibGljIGF2ZW51ZSB0byBvdXIgcHJvdGVjdGVkIG1ldGhvZAotCQlpbnRlcm5hbEFib3V0VG9CZUNoYW5nZWQoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFib3V0VG9SZWluaXRpYWxpemVNb2RlbCgpIHsKLQotCi0KLQkJLy8gbm90aWNlIHRoaXMgaXMganVzdCBhIHB1YmxpYyBhdmVudWUgdG8gb3VyIHByb3RlY3RlZCBtZXRob2QKLQkJZmlyZU1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZCgpOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRkTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcihJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JCXN5bmNocm9uaXplZCAoZkxpc3RlbmVyTG9jaykgewotCQkJaWYgKGZMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwpIHsKLQkJCQlmTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlciA9IG5ldyBMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyKCk7Ci0JCQl9Ci0JCQlmTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNb2RlbFN0YXRlTGlzdGVuZXIoSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JCXN5bmNocm9uaXplZCAoZkxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoIVV0aWxpdGllcy5jb250YWlucyhmTW9kZWxTdGF0ZUxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJaW50IG9sZFNpemUgPSAwOwotCQkJCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCS8vIG5vcm1hbGx5IHdvbid0IGJlIG51bGwsIGJ1dCB3ZSBuZWVkIHRvIGJlIHN1cmUsIGZvcgotCQkJCQkvLyBmaXJzdAotCQkJCQkvLyB0aW1lIHRocm91Z2gKLQkJCQkJb2xkU2l6ZSA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzLmxlbmd0aDsKLQkJCQl9Ci0JCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCQlPYmplY3RbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W25ld1NpemVdOwotCQkJCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoZk1vZGVsU3RhdGVMaXN0ZW5lcnMsIDAsIG5ld0xpc3RlbmVycywgMCwgb2xkU2l6ZSk7Ci0JCQkJfQotCQkJCS8vIGFkZCBsaXN0ZW5lciB0byBsYXN0IHBvc2l0aW9uCi0JCQkJbmV3TGlzdGVuZXJzW25ld1NpemUgLSAxXSA9IGxpc3RlbmVyOwotCQkJCS8vCi0JCQkJLy8gbm93IHN3aXRjaCBuZXcgZm9yIG9sZAotCQkJCWZNb2RlbFN0YXRlTGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBsb2NrIHRvIGxvY2sgdGhlIHNtYWxsIGJpdHMgb2YgZGF0YSBhbmQgb3BlcmF0aW9ucyBpbiB0aGUgbW9kZWxzCi0JICogdGhlbXNlbGZlcy4gdGhpcyBsb2NrIGlzICJzaGFyZWQiIHdpdGggZG9jdW1lbnQsIHNvLCBldmVudHVhbGx5LAotCSAqIGNoYW5nZXMgY2FuIGJlIG1hZGUgc2FmZWZseSBmcm9tIGVpdGhlciBzaWRlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGJlZ2luTG9jaygpIHsKLQotCQkvLyBpZiB3ZSBnZXQgYSBkaWZmZXJlbnQgbG9jayBvYmplY3QKLQkJLy8gdGhhbiB3ZSBoYWQgYmVmb3JlLCBiZXN1cmUgdG8gcmVsZWFzZQotCQkvLyBvbGQgb25lIGZpcnN0IGJlZm9yZSBsb3NpbmcgaXQuCi0JCS8vIElTU1VFOiB0aGlzIHNtZWxscyBsaWtlIGFuIGVycm9yIGNvbmRpdGlvbiwKLQkJLy8gd2hlbiB3b3VsZCB0aGlzIGhhcHBlbj8gYmV0dGVyIHRvIGNoZWNrIGluIHNldCBkb2N1bWVudD8KLQkJSUxvY2sgZG9jdW1lbnRMb2NrID0gZ2V0TG9ja09iamVjdEZyb21Eb2N1bWVudCgpOwotCi0JCWlmIChmTG9ja09iamVjdCAhPSBudWxsICYmIGZMb2NrT2JqZWN0ICE9IGRvY3VtZW50TG9jaykgewotCQkJZkxvY2tPYmplY3QucmVsZWFzZSgpOwotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTFNUQVRFKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIk1vZGVsIGxvY2sgcmVsZWFzZWQgZWFybHkiICsgZkxvY2tPYmplY3QgKyAiIGFwcGFyZW50bHkgZG9jdW1lbnQgc3dpdGNoZWQ/Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCX0KLQkJZkxvY2tPYmplY3QgPSBkb2N1bWVudExvY2s7Ci0JCWlmIChmTG9ja09iamVjdCAhPSBudWxsKSB7Ci0JCQlmTG9ja09iamVjdC5hY3F1aXJlKCk7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMU1RBVEUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiTW9kZWwgbG9jayBhY3F1aXJlZDogIiArIGZMb2NrT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlcikgewotCi0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0KLQkJYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBudWxsLCBudWxsLCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwpIHsKLQotCQliZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIGxhYmVsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCi0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIG51bGwsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0KLQkJaWYgKGdldFVuZG9NYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCWdldFVuZG9NYW5hZ2VyKCkuYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQotCQlpZiAoZ2V0VW5kb01hbmFnZXIoKSAhPSBudWxsKQotCQkJZ2V0VW5kb01hbmFnZXIoKS5iZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIGxhYmVsLCBkZXNjcmlwdGlvbiwgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBBUEkgYWxsb3dzIGEgY2xpZW50IGNvbnRyb2xsZWQgd2F5IG9mIG5vdGlmeWluZyBhbGwgTW9kZWxFdmVudAotCSAqIGxpc3RuZXJzIHRoYXQgdGhlIG1vZGVsIGhhcyBiZWVuIGNoYW5nZWQuIFRoaXMgbWV0aG9kIGlzIGEgbWF0Y2hlZCBwYWlyCi0JICogdG8gYWJvdXRUb0NoYW5nZU1vZGVsLCBhbmQgKm11c3QqIGJlIGNhbGxlZCBhZnRlciBhYm91dFRvQ2hhbmdlTW9kZWwKLQkgKiAuLi4gb3Igc29tZSBsaXN0ZW5lcnMgY291bGQgYmUgbGVmdCB3YWl0aW5nIGluZGVmaW5pdGVseSBmb3IgdGhlCi0JICogY2hhbmdlZCBldmVudC4gU28sIGl0cyBzdWdnZXN0ZWQgdGhhdCBjaGFuZ2VkTW9kZWwgYWx3YXlzIGJlIGluIGEKLQkgKiBmaW5hbGx5IGNsYXVzZS4gTGlrZXdpc2UsIGEgY2xpZW50IHNob3VsZCBuZXZlciBjYWxsIGNoYW5nZWRNb2RlbAotCSAqIHdpdGhvdXQgY2FsbGluZyBhYm91dFRvQ2hhbmdlTW9kZWwgZmlyc3QuIEluIHRoZSBjYXNlIG9mIGVtYmVkZGVkCi0JICogY2FsbHMsIHRoZSBub3RpZmljYXRpb24gaXMganVzdCBzZW50IG9uY2UuCi0JICovCi0JcHVibGljIHZvaWQgY2hhbmdlZE1vZGVsKCkgewotCi0KLQkJLy8gbm90aWNlIHRoaXMgaXMganVzdCBhIHB1YmxpYyBhdmVudWUgdG8gb3VyIHByb3RlY3RlZCBtZXRob2QKLQkJaW50ZXJuYWxNb2RlbENoYW5nZWQoKTsKLQkJLy8gYWxzbyBub3RlIQotCQkvLyBpZiB3ZSd2ZSBiZWVuICJjaGFuZ2VkIiBieSBhIGNsaWVudCwgd2UgbWlnaHQgc3RpbGwgbmVlZAotCQkvLyB0byBiZSByZS1pbml0aWFsaXplZCwgc28gd2UnbGwgY2hlY2sgYW5kIGhhbmRsZSB0aGF0IGhlcmUuCi0JCS8vIE5vdGUgb25seSBkb2VzIHRoaXMgcHJvdmlkZSBhIHNvbHV0aW9uIHRvIHNvbWUgIm1pc3NlZCIKLQkJLy8gcmUtaW5pdHMsIGluIHByb3ZpZGVzIGEgYnVpbHQgaW4gd2F5IGZvciBjbGllbnRzIHRvCi0JCS8vICJmb3JjZSIgdGhlIG1vZGVsIHRvIGhhbmRsZSBpdHNlbGYsIGJ5IGJyYWNrZXRpbmcgYW55Ci0JCS8vIGNoYW5nZXMgd2l0aCBhYm91dFRvQ2hhbmdlIGFuZCBjaGFuZ2VkLCB0aGUgbW9kZWwgaXRzZWxmCi0JCS8vIHdpbGwgY2hlY2suIEJ1dCBvbmx5IGNhbGwgcmUtaW5pdCBpZiBhbGwgb3RoZXIgcGVuZGluZwotCQkvLyBtb2RlbENoYW5nZWQgc3RhdGVzIGhhdmUgYmVlbiBoYW5kbGVkLgotCQlpZiAoZk1vZGVsU3RhdGVDaGFuZ2luZyA9PSAwICYmIGlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpKSB7Ci0JCQlyZWluaXQoKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQmFzZWQgb24gc2ltaWxhciBtZXRob2QgaW4gRmlsZURvY3VtZW50UHJvdmlkZXIuIEl0IHdpbGwgcHJvdmlkZSB3aGF0Ci0JICogdGhlIG1vZGlmaWNhdGlvblN0YW1wIHdvdWxkIGJlIGlmIHJlc2V0U3luY2hyb256YXRpb25TdGFtcChyZXNvdXJjZSkKLQkgKiB3ZXJlIHVzZWQsIGFsdGhvdWdoIGZvciB0aGlzICdjb21wdXRlJyBBUEksIG5vIGNoYW5nZXMgdG8gdGhlIGluc3RhbmNlCi0JICogYXJlIG1hZGUuCi0JICovCi0JcHVibGljIGxvbmcgY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKElSZXNvdXJjZSByZXNvdXJjZSkgewotCi0KLQkJbG9uZyBtb2RpZmljYXRpb25TdGFtcCA9IHJlc291cmNlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQkJLy8gTm90ZTogY2hlY2tpbmcgZXhpc3RlbmNlIG9mIGZpbGUgaXMgYSBsaXR0bGUgZGlmZmVyZW50IHRoYW4KLQkJLy8gaW1wbCBpbgotCQkvLyB0aGUgRmlsZURvY3VtZW50UHJvdmlkZXIuIFNlZSBkZWZlY3QgbnVtYmVyIDIyMzc5MC4KLQkJRmlsZSBmaWxlID0gcGF0aC50b0ZpbGUoKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQkJbW9kaWZpY2F0aW9uU3RhbXAgPSBmaWxlLmxhc3RNb2RpZmllZCgpOwotCQlyZXR1cm4gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JfQotCi0KLQkvKioKLQkgKiBQcm92aWRlcyBhIGNvcHkgb2YgdGhlIG1vZGVsLCBidXQgYSBuZXcgSUQgbXVzdCBiZSBwcm92aWRlZC4gVGhlCi0JICogcHJpbmNpcGxlIG9mIHRoaXMgY29weSBpcyBub3QgdG8gY29weSBmaWVsZHMsIGV0Yy4sIGFzIGlzIHR5cGljYWxseQotCSAqIGRvbmUgaW4gYSBjbG9uZSBtZXRob2QsIGJ1dCB0byByZXR1cm4gYSBtb2RlbCB3aXRoIHRoZSBzYW1lIGNvbnRlbnQgaW4KLQkgKiB0aGUgc3RydWN0dXJlZERvY3VtZW50LiBOb3RlOiBJdCBpcyB0aGUgY2FsbGVycyByZXNwb25zaWJpbGl0eSB0bwotCSAqIHNldEJhc2VMb2NhdGlvbiwgbGlzdG5lcnMsIGV0Yy4sIGFzIGFwcHJvcHJpYXRlLiBUeXBlIGFuZCBFbmNvZGluZyBhcmUKLQkgKiB0aGUgb25seSBmaWVsZHMgc2V0IGJ5IHRoaXMgbWV0aG9kLiBJZiB0aGUgbmV3SWQgcHJvdmlkZWQgYWxyZWFkeSBleGlzdAotCSAqIGluIHRoZSBtb2RlbCBtYW5hZ2VyLCBhIFJlc291cmNlSW5Vc2UgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjb3B5KFN0cmluZyBuZXdJZCkgdGhyb3dzIFJlc291cmNlSW5Vc2UgewotCi0KLQkJSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCA9IG51bGw7Ci0JCS8vIHRoaXMgZmlyc3Qgb25lIHNob3VsZCBmYWlsLCBpZiBub3QsIGl0cyB0cmVhdGVkIGFzIGFuIGVycm9yCi0JCS8vIElmIHRoZSBjYWxsZXIgd2FudHMgdG8gdXNlIGFuIGV4aXN0aW5nIG9uZSwgdGhleSBjYW4gY2FsbAotCQkvLyBnZXRFeGlzdGluZwotCQkvLyBhZnRlciB0aGlzIGZhaWx1cmUKLQkJbmV3TW9kZWwgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChuZXdJZCk7Ci0JCWlmIChuZXdNb2RlbCAhPSBudWxsKSB7Ci0JCQkvLyBiZSBzdXJlIHRvIHJlbGVhc2UgdGhlIHJlZmVyZW5jZSB3ZSBnb3QgImJ5IGFjY2lkZW50IiAoYW5kCi0JCQkvLyBubwotCQkJLy8gbG9uZ2VyIG5lZWQpCi0JCQluZXdNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCXRocm93IG5ldyBSZXNvdXJjZUluVXNlKCk7Ci0JCX0KLQkJbmV3TW9kZWwgPSBnZXRNb2RlbE1hbmFnZXIoKS5jb3B5TW9kZWxGb3JFZGl0KGdldElkKCksIG5ld0lkKTsKLQkJcmV0dXJuIG5ld01vZGVsOwotCX0KLQotCi0JLyoqCi0JICogRGlzYWJsZSB1bmRvIG1hbmFnZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzYWJsZVVuZG9NYW5hZ2VtZW50KCkgewotCi0JCWlmIChnZXRVbmRvTWFuYWdlcigpICE9IG51bGwpCi0JCQlnZXRVbmRvTWFuYWdlcigpLmRpc2FibGVVbmRvTWFuYWdlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZSB1bmRvIG1hbmFnZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgZW5hYmxlVW5kb01hbmFnZW1lbnQoKSB7Ci0KLQkJaWYgKGdldFVuZG9NYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCWdldFVuZG9NYW5hZ2VyKCkuZW5hYmxlVW5kb01hbmFnZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBlbmRMb2NrIGlzIHByb3RlY3RlZCBvbmx5IGZvciBhIHZlcnkgc3BlY2lhbCBwdXJwb3NlLiBTbyBzdWJjbGFzc2VzIGNhbgotCSAqIGNhbGwgaXQgdG8gZW5kIHRoZSBsb2NrIGFmdGVyIHVwZGF0ZXMgaGF2ZSBiZWVuIG1hZGUsIGJ1dCBiZWZvcmUKLQkgKiBub3RpZmljYXRpb25zIGFyZSBzZW50Ci0JICogCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZW5kTG9jaygpIHsKLQkJaWYgKGZMb2NrT2JqZWN0ICE9IG51bGwpIHsKLQkJCWZMb2NrT2JqZWN0LnJlbGVhc2UoKTsKLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxTVEFURSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJNb2RlbCBsb2NrIHJlbGVhc2VkOiAiICsgZkxvY2tPYmplY3QpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKSB7Ci0KLQkJaWYgKGdldFVuZG9NYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCWdldFVuZG9NYW5hZ2VyKCkuZW5kUmVjb3JkaW5nKHJlcXVlc3Rlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCi0JCWlmIChnZXRVbmRvTWFuYWdlcigpICE9IG51bGwpCi0JCQlnZXRVbmRvTWFuYWdlcigpLmVuZFJlY29yZGluZyhyZXF1ZXN0ZXIsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIEluZm9ybXMgYWxsIHJlZ2lzdGVyZWQgbW9kZWwgc3RhdGUgbGlzdGVuZXJzIHRoYXQgdGhlIHRoZSBtb2RlbCBpcwotCSAqIGFib3V0IHRvIHVuZGVyIGdvIGEgY2hhbmdlLiBUaGlzIGNoYW5nZSBtaWdodCBiZSBpbiB0ZXJtcyBvZiBjb250ZW50cwotCSAqIG9yIG1pZ2h0IGJlIGluIHRlcm1zIG9mIHRoZSBtb2RlbCdzIGlkIG9yIGJhc2UgbG9jYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpcmVNb2RlbEFib3V0VG9CZUNoYW5nZWQoKSB7Ci0KLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUgbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkKLQkJLy8gZnJvbSBhbm90aGVyIHRocmVhZAotCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJKChJTW9kZWxTdGF0ZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5tb2RlbEFib3V0VG9CZUNoYW5nZWQodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoKSB7Ci0KLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTFNUQVRFKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIklNb2RlbFN0YXRlTGlzdGVuZXIgZXZlbnQgZm9yICIgKyBnZXRJZCgpICsgIiA6IG1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBmTW9kZWxTdGF0ZUxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCS8vIE5PVEU6IHRyaWNrIGZvciB0cmFuc2l0aW9uLiBXZSBhY3R1YWwgdXNlIHRoZSBzYW1lCi0JCQkJLy8gbGlzdGVuZXJzCi0JCQkJLy8gYXMgbW9kZWxTdGF0ZSwgYnV0IG9ubHkgc2VuZCB0aGlzIHRvIHRob3NlIHRoYXQgaGF2ZQotCQkJCS8vIGltcGxlbWVudGVkIE1vZGVsU3RhdGVFeHRlbmRlZC4KLQkJCQlJTW9kZWxTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyID0gKElNb2RlbFN0YXRlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV07Ci0JCQkJbGlzdGVuZXIubW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVNb2RlbENoYW5nZWQoKSB7Ci0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycwotCQkvLyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZAotCQkvLyBhbmQgcmVtb3ZlIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyCi0JCS8vIGFycmF5IGZyb20gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGZNb2RlbFN0YXRlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBmTW9kZWxTdGF0ZUxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCSgoSU1vZGVsU3RhdGVMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkubW9kZWxDaGFuZ2VkKHRoaXMpOwotCQkJCX0KLQkJCQkvLyBpdHMgc28gY3JpdGljaWFsIHRoYXQgdGhlIGJlZ2luL2VuZCBhcnJpdmUgaW4KLQkJCQkvLyBwYWlycywKLQkJCQkvLyBpZiB0aGVyZSBoYXBwZW5kcyB0byBiZSBhbiBlcnJvciBpbiBvbmUgb2YgdGhlCi0JCQkJLy8gbW9kZWxDaGFuZ2VkLAotCQkJCS8vIHRoZXkgd2Ugd2FudCB0byBiZSBzdXJlIHJlc3QgY29tcGxldGUgb2suCi0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbmZvcm1zIGFsbCByZWdpc3RlcmVkIG1vZGVsIHN0YXRlIGxpc3RlbmVycyBhYm91dCBhIGNoYW5nZSBpbiB0aGUKLQkgKiBkaXJ0eSBzdGF0ZSBvZiB0aGUgbW9kZWwuIFRoZSBkaXJ0eSBzdGF0ZSBpcyBlbnRpcmVseSBhYm91dCBjaGFuZ2VzIGluCi0JICogdGhlIGNvbnRlbnQgb2YgdGhlIG1vZGVsIChub3QsIGZvciBleGFtcGxlLCBhYm91dCBjaGFuZ2VzIHRvIGlkLCBvcgotCSAqIGJhc2UgbG9jYXRpb24gLS0gc2VlIG1vZGVsTW92ZWQpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgZWxlbWVudCwgYm9vbGVhbiBpc0RpcnR5KSB7Ci0KLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTFNUQVRFKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIklNb2RlbFN0YXRlTGlzdGVuZXIgZXZlbnQgZm9yICIgKyBnZXRJZCgpICsgIiA6IG1vZGVsRGlydHlTdGF0ZUNoYW5nZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gZk1vZGVsU3RhdGVMaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkoKElNb2RlbFN0YXRlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLm1vZGVsRGlydHlTdGF0ZUNoYW5nZWQoZWxlbWVudCwgaXNEaXJ0eSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTW9kZWxSZWluaXRpYWxpemVkKCkgewotCi0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGZNb2RlbFN0YXRlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxTVEFURSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJJTW9kZWxTdGF0ZUxpc3RlbmVyIGV2ZW50IGZvciAiICsgZ2V0SWQoKSArICIgOiBtb2RlbFJlaW5pdGlhbGl6ZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gZk1vZGVsU3RhdGVMaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJTW9kZWxTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyID0gKElNb2RlbFN0YXRlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV07Ci0JCQkJbGlzdGVuZXIubW9kZWxSZWluaXRpYWxpemVkKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5mb3JtcyBhbGwgcmVnaXN0ZXJlZCBtb2RlbCBzdGF0ZSBsaXN0ZW5lcnMgYWJvdXQgdGhlIGRlbGV0aW9uIG9mIGEKLQkgKiBtb2RlbCdzIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZU1vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwgZWxlbWVudCkgewotCi0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGZNb2RlbFN0YXRlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxTVEFURSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJJTW9kZWxTdGF0ZUxpc3RlbmVyIGV2ZW50IGZvciAiICsgZ2V0SWQoKSArICIgOiBtb2RlbFJlc291cmNlRGVsZXRlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBmTW9kZWxTdGF0ZUxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCSgoSU1vZGVsU3RhdGVMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkubW9kZWxSZXNvdXJjZURlbGV0ZWQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbmZvcm1zIGFsbCByZWdpc3RlcmVkIG1vZGVsIHN0YXRlIGxpc3RlbmVycyB0aGF0IHRoZSByZXNvdXJjZQotCSAqIHVuZGVybHlpbmcgYSBtb2RlbCBoYXMgYmVlbiBtb3ZlZC4gVGhpcyBpcyB0eXBpY2FsbHkgcmVmbGVjdGVkIGluIGEKLQkgKiBjaGFuZ2UgdG8gdGhlIGlkLCBiYXNlTG9jYXRpb24sIG9yIGJvdGguCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZU1vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG9yaWdpbmFsRWxlbWVudCwgSVN0cnVjdHVyZWRNb2RlbCBtb3ZlZEVsZW1lbnQpIHsKLQotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMU1RBVEUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiSU1vZGVsU3RhdGVMaXN0ZW5lciBldmVudCBmb3IgIiArIGdldElkKCkgKyAiIDogbW9kZWxSZXNvdXJjZU1vdmVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJKChJTW9kZWxTdGF0ZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5tb2RlbFJlc291cmNlTW92ZWQob3JpZ2luYWxFbGVtZW50LCBtb3ZlZEVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEJhc2VMb2NhdGlvbigpIHsKLQotCQlyZXR1cm4gZkJhc2VMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsI2dldENvbnRlbnRUeXBlSWRlbnRpZmllcigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSB7Ci0JCWlmIChmRXhwbGljaXRDb250ZW50VHlwZUlkZW50aWZpZXIgIT0gbnVsbCkKLQkJCXJldHVybiBmRXhwbGljaXRDb250ZW50VHlwZUlkZW50aWZpZXI7Ci0JCXJldHVybiBmTW9kZWxIYW5kbGVyLmdldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEZhY3RvcnlSZWdpc3RyeSBnZXRGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCWlmIChmYWN0b3J5UmVnaXN0cnkgPT0gbnVsbCkgewotCQkJZmFjdG9yeVJlZ2lzdHJ5ID0gbmV3IEZhY3RvcnlSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBmYWN0b3J5UmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGlkIGlzIHRoZSBpZCB0aGF0IHRoZSBtb2RlbCBtYW5hZ2VyIHVzZXMgdG8gaWRlbnRpZnkgdGhpcyBtb2RlbAotCSAqIAotCSAqIEBJU1NVRSAtIG5vIG9uZSBzaG91bGQgbmVlZCB0byBrbm93IElELCBzbyB0aGlzIHNob3VsZCBiZSBkZWZhdWx0IGFjY2VzcyBldmVudHVhbGx5LiAKLQkgKiBJZiBjbGllbnRzIGJlbGlldmUgdGhleSBkbyBuZWVkIElELCBiZSBzdXJlIHRvIGxldCB1cyBrbm93IChvcGVuIGEgYnVnKS4gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQotCQlyZXR1cm4gZklkOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJTG9jayBnZXRMb2NrT2JqZWN0RnJvbURvY3VtZW50KCkgewotCi0JCS8vIHdlIGFsd2F5cyAiZ2V0IGFmcmVzaCIgdGhlIGxvY2sgb2JqZWN0IGZyb20gb3VyIGRvY3VtZW50LAotCQkvLyBqdXN0IGluIGNhc2UgdGhlIGluc3RhbmNlIG9mIHRoZSBkb2N1bWVudCBjaGFuZ2VzLgotCQlJTG9jayByZXN1bHQgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJaWYgKGRvYyBpbnN0YW5jZW9mIElMb2NrYWJsZSkgewotCQkJCS8vIHJlbWVtYmVyLCBtb3JlIHRoYW4gb25lIGNsaWVudCBjYW4gZ2V0IHRoZQotCQkJCS8vIGxvY2sgb2JqZWN0LCBpdHMgZHVyaW5nIHRoZSBhcXVpcmUgdGhhdCB0aGUKLQkJCQkvLyBsb2NrIG9uIHRoZSB0aHJlYWQgaXMgb2J0YWluZWQuCi0JCQkJcmVzdWx0ID0gKChJTG9ja2FibGUpIGRvYykuZ2V0TG9ja09iamVjdCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGVudFR5cGVEZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBDb250ZW50VHlwZURlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIElNb2RlbEhhbmRsZXIgZ2V0TW9kZWxIYW5kbGVyKCkgewotCi0JCXJldHVybiBmTW9kZWxIYW5kbGVyOwotCX0KLQotCi0JcHVibGljIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCi0JCXJldHVybiBfZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQkvLyBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24gbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JcHVibGljIGludCBnZXRSZWZlcmVuY2VDb3VudCgpIHsKLQotCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBnZXRNb2RlbE1hbmFnZXIoKS5nZXRSZWZlcmVuY2VDb3VudChnZXRJZCgpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JLy8gVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCXB1YmxpYyBpbnQgZ2V0UmVmZXJlbmNlQ291bnRGb3JFZGl0KCkgewotCi0KLQotCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0UmVmZXJlbmNlQ291bnRGb3JFZGl0KGdldElkKCkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQkvLyBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24gbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JcHVibGljIGludCBnZXRSZWZlcmVuY2VDb3VudEZvclJlYWQoKSB7Ci0KLQotCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBnZXRNb2RlbE1hbmFnZXIoKS5nZXRSZWZlcmVuY2VDb3VudEZvclJlYWQoZ2V0SWQoKSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRSZWluaXRpYWxpemVTdGF0ZURhdGEoKSB7Ci0KLQkJcmV0dXJuIHJlaW5pdGlhbGl6ZVN0YXRlRGF0YTsKLQl9Ci0KLQotCi0JcHVibGljIFVSSVJlc29sdmVyIGdldFJlc29sdmVyKCkgewotCi0JCXJldHVybiBmUmVzb2x2ZXI7Ci0JfQotCi0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBmU3RydWN0dXJlZERvY3VtZW50OwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDkvNy8yMDAxIDI6MzA6MjYKLQkgKiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGxvbmcKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRTeW5jaHJvbml6YXRpb25TdGFtcCgpIHsKLQotCQlyZXR1cm4gZlN5bmNocm9uaXphdGlvblN0YW1wOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciBnZXRVbmRvTWFuYWdlcigpIHsKLQotCQlJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciBzdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlzdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCXN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0VW5kb01hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0SWQoU3RyaW5nIGlkKSB7Ci0JCWZJZCA9IGlkOwotCX0KLQotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGludGVybmFsQWJvdXRUb0JlQ2hhbmdlZCgpIHsKLQotCQkvLyBub3RpY2Ugd2Ugb25seSBmaXJlIHRoaXMgZXZlbnQgaWYgd2UgYXJlIG5vdAotCQkvLyBhbHJlYWR5IGluIGEgbW9kZWwgc3RhdGUgY2hhbmdpbmcgc2VxdWVuY2UKLQkJaWYgKGZNb2RlbFN0YXRlQ2hhbmdpbmcgPT0gMCkgewotCi0JCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMU1RBVEUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiSU1vZGVsU3RhdGVMaXN0ZW5lciBldmVudCBmb3IgIiArIGdldElkKCkgKyAiIDogbW9kZWxBYm91dFRvQmVDaGFuZ2VkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQl0cnkgewotCQkJCWZpcmVNb2RlbEFib3V0VG9CZUNoYW5nZWQoKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBub3RpZnlpbmcgbW9kZWwgc3RhdGUgbGlzdGVycyBvZiBhYm91dCB0byBjaGFuZ2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy8gYmVnaW4gbG9jayBhZnRlciBsaXN0ZW5lcnMgbm90aWZpZWQsIG90aGVyd2lzZQotCQkJCS8vIGRlYWRsb2NrIGNvdWxkIG9jY3VyIGlmIHRoZXkgY2FsbCB1cyBiYWNrLgotCQkJCWJlZ2luTG9jaygpOwotCQkJfQotCi0JCX0KLQkJLy8gd2UgYWx3YXlzIGluY3JlbWVudCBjb3VudGVyLCBmb3IgZXZlcnkgcmVxdWVzdCAoc28gKm11c3QqIHJlY2VpdmUKLQkJLy8gY29ycmVzcG9uZGluZyBudW1iZXIgb2YgJ2NoYW5nZWRNb2RlbCcgcmVxdWVzdHMpCi0JCWZNb2RlbFN0YXRlQ2hhbmdpbmcrKzsKLQl9Ci0KLQkvKioKLQkgKiBJbmZvcm1zIGFsbCByZWdpc3RlcmVkIG1vZGVsIHN0YXRlIGxpc3RlbmVycyB0aGF0IGFuIGltcGVuZGluZyBjaGFuZ2UKLQkgKiBpcyBub3cgY29tcGxldGUuIFRoaXMgbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgYnkgJ21vZGVsQ2hhbmdlZCcKLQkgKiBzaW5jZSBpdCBrZWVwcyB0cmFjayBvZiBjb3VudHMuCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxNb2RlbENoYW5nZWQoKSB7Ci0KLQkJLy8gYWx3YXlzIGRlY3JlbWVudAotCQlmTW9kZWxTdGF0ZUNoYW5naW5nLS07Ci0KLQotCQkvLyBDaGVjayBpbnRlZ3JpdHkKLQkJLy8gdG8gYmUgbGVzcyB0aGFuIHplcm8gaXMgYSBwcm9ncmFtbWluZyBlcnJvciwKLQkJLy8gYnV0IHdlJ2xsIHJlc2V0IHRvIHplcm8KLQkJLy8gYW5kIHRyeSB0byBjb250aW51ZQotCQlpZiAoZk1vZGVsU3RhdGVDaGFuZ2luZyA8IDApIHsKLQkJCWZNb2RlbFN0YXRlQ2hhbmdpbmcgPSAwOwotCQkJLy8gc2hvdWxkIG5vdCBiZSBsb2NrZWQsIGJ1dCBqdXN0IGluIGNhc2UKLQkJCWVuZExvY2soKTsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb2dyYW0gRXJyb3I6IG1vZGVsU3RhdGVDaGFuZ2luZyB3YXMgbGVzcyB0aGFuIHplcm8iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQotCQkvLyBXZSBvbmx5IGZpcmUgdGhpcyBldmVudCBpZiBhbGwgcGVuZGluZyByZXF1ZXN0cyBhcmUgZG9uZS4KLQkJLy8gVGhhdCBpcywgaWYgd2UndmUgcmVjZWl2ZWQgdGhlIHNhbWUgbnVtYmVyIG9mIG1vZGVsQ2hhbmdlZCBhcwotCQkvLyB3ZSBoYXZlIGFib3V0VG9DaGFuZ2VNb2RlbC4KLQkJaWYgKGZNb2RlbFN0YXRlQ2hhbmdpbmcgPT0gMCkgewotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTFNUQVRFKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIklNb2RlbFN0YXRlTGlzdGVuZXIgZXZlbnQgZm9yICIgKyBnZXRJZCgpICsgIiA6IG1vZGVsQ2hhbmdlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJZW5kTG9jaygpOwotCQkJLy8gbm90aWZpZnkgbGlzdGVuZXJzIG91dHNpZGUgb2YgbG9ja2VkIHN0YXRlIChvciBkZWFkbG9jawotCQkJLy8gY2FuIG9jY3VyIGlmIG9uZSBvZiB0aGVtIGNhbGxzIHVzIGJhY2suCi0JCQlmaXJlTW9kZWxDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCi0JCXJldHVybiBmRGlydHlTdGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBoYXMgdmVyeSBzcGVjaWFsIHB1cnBvc2UsIGl0cyB1c2VkIGluIHN1YmNsYXNzCi0JICogJ2NoYW5nZWRNb2RlbCcgdG8ga25vdyB3aGVuIHRvIGRvICJlbmRpbmciIHNvcnRzIG9mIHRoaW5ncywgcmlnaHQKLQkgKiBiZWZvcmUgYSBjYWxsIHRvIHN1cGVyLkNoYW5nZWRNb2RlbCB3b3VsZCBpbiBkZWVkIHB1dCB0aGUgbW9kZWwgaW4KLQkgKiAnZW5kJyBzdGF0ZS4gUHV0IGFub3RoZXIgd2F5LCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdWJjbGFzc2VzJ3MKLQkgKiBjaGFuZ2VkTW9kZWwsIHRoZSBpc01vZGVsU3RhdGVDaGFuZ2luZyBpcyB0cnVlLCBidXQgYXQgZW5kLCBpdCB3aWxsIGJlCi0JICogZmFsc2UuIFNvLCB0aGlzIG1ldGhvZCBhbGxvd3MgYSBzbWFsbCAicGVlayBhaGVhZCIuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNNb2RlbENoYW5nZVN0YXRlT25WZXJnZU9mRW5kaW5nKCkgewotCi0KLQkJcmV0dXJuIGZNb2RlbFN0YXRlQ2hhbmdpbmcgPT0gMTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIGRldGVybWluZSBpZiB0aGUgbW9kZWwgaXMgd2l0aGluIGEKLQkgKiAiYWJvdXRUb0NoYW5nZSIgYW5kICJjaGFuZ2VkIiBzZXF1ZW5jZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGVsU3RhdGVDaGFuZ2luZygpIHsKLQotCi0JCXJldHVybiBmTW9kZWxTdGF0ZUNoYW5naW5nID4gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05ldygpIHsKLQotCQlyZXR1cm4gZk5ld1N0YXRlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpIHsKLQotCQlyZXR1cm4gcmVpbml0aWFsaXphdGlvbk5lZWRlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKSB7Ci0KLQotCQlpZiAoIWlzU2hhcmVkRm9yRWRpdCgpKQotCQkJcmV0dXJuIGlzRGlydHkoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJaWYgKGdldE1vZGVsTWFuYWdlcigpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRNb2RlbE1hbmFnZXIoKS5pc1NoYXJlZChnZXRJZCgpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWRGb3JFZGl0KCkgewotCi0KLQkJaWYgKGdldE1vZGVsTWFuYWdlcigpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRNb2RlbE1hbmFnZXIoKS5pc1NoYXJlZEZvckVkaXQoZ2V0SWQoKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkRm9yUmVhZCgpIHsKLQotCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuaXNTaGFyZWRGb3JSZWFkKGdldElkKCkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKCkgewotCi0KLQkJLy8gbm90aWNlIHRoaXMgaXMganVzdCBhIHB1YmxpYyBhdmVudWUgdG8gb3VyIHByb3RlY3RlZCBtZXRob2QKLQkJZmlyZU1vZGVsUmVpbml0aWFsaXplZCgpOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIG5ld0luc3RhbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gbnVsbDsKLQkJLy8gd2UgZGVsZWdhdGUgdG8gdGhlIG1vZGVsIG1hbmFnZXIsIHNvIGxvYWRlciwgZXRjLiwgY2FuIGJlCi0JCS8vIHVzZWQuCi0JCW5ld01vZGVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlTmV3SW5zdGFuY2UodGhpcyk7Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCByZWluaXQoKSB7Ci0KLQotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChmTW9kZWxTdGF0ZUNoYW5naW5nID09IDApIHsKLQkJCXRyeSB7Ci0JCQkJYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQkJYWJvdXRUb1JlaW5pdGlhbGl6ZU1vZGVsKCk7Ci0JCQkJcmVzdWx0ID0gX2dldE1vZGVsTWFuYWdlcigpLnJlaW5pdGlhbGl6ZSh0aGlzKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXNldFJlaW5pdGlhbGl6ZU5lZWRlZChmYWxzZSk7Ci0JCQkJc2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKG51bGwpOwotCQkJCW1vZGVsUmVpbml0aWFsaXplZCgpOwotCQkJCWNoYW5nZWRNb2RlbCgpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTFNUQVRFKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImluZGVlZCEhISIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBtb2RlbCB0byBmcmVlIHVwIGFueSByZXNvdXJjZXMgaXQgbWlnaHQgYmUKLQkgKiB1c2luZy4gSW4gcGFydGljdWxhciwgaXRzZWxmLCBhcyBzdG9yZWQgaW4gdGhlIElNb2RlbE1hbmFnZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21FZGl0KCkgewotCi0KLQkJaWYgKGdldE1vZGVsTWFuYWdlcigpID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTU9ERUxfTUFOQUdFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJLyoKLQkJCSAqIEJlIHN1cmUgdG8gY2hlY2sgdGhlIHNoYXJlZCBzdGF0ZSBiZWZvcmUgcmVsZWFzaW5nLiAoU2luY2UKLQkJCSAqIGlzU2hhcmVkIGFzc3VtZXMgYSBjb3VudCBvZiAxIG1lYW5zIG5vdCBzaGFyZWQgLi4uIGFuZCB3ZSB3YW50Ci0JCQkgKiBvdXIgJzEnIHRvIGJlIHRoYXQgb25lLikgVGhlIHByb2JsZW0sIG9mIGNvdXJzZSwgaXMgdGhhdAotCQkJICogYmV0d2VlbiBwcmUtY3ljbGUgbm90aWZpY2F0aW9uIGFuZCBwb3N0LXJlbGVhc2Ugbm90aWZpY2F0aW9uLAotCQkJICogdGhlIG1vZGVsIGNvdWxkIG9uY2UgYWdhaW4gaGF2ZSBiZWNvbWUgc2hhcmVkLCByZW5kZXJpbmcgdGhlCi0JCQkgKiByZWxlYXNlIG5vdGlmaWNhdGlvbiBpbmNvcnJlY3QuCi0JCQkgKi8KLQkJCWJvb2xlYW4gaXNTaGFyZWQgPSBpc1NoYXJlZCgpOwotCi0JCQlpZiAoIWlzU2hhcmVkKSB7Ci0JCQkJc2lnbmFsUHJlTGlmZUN5Y2xlRXZlbnRSZWxlYXNlKHRoaXMpOwotCQkJfQotCi0JCQlfZ2V0TW9kZWxNYW5hZ2VyKCkucmVsZWFzZUZyb21FZGl0KHRoaXMpOwotCQkJaWYgKCFpc1NoYXJlZCkgewotCQkJCXNpZ25hbFBvc3RMaWZlQ3ljbGVMaXN0ZW5lclJlbGVhc2UodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBtb2RlbCB0byBmcmVlIHVwIGFueSByZXNvdXJjZXMgaXQgbWlnaHQgYmUKLQkgKiB1c2luZy4gSW4gcGFydGljdWxhciwgaXRzZWxmLCBhcyBzdG9yZWQgaW4gdGhlIElNb2RlbE1hbmFnZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21SZWFkKCkgewotCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1PREVMX01BTkFHRVJfTlVMTCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCS8qCi0JCQkgKiBCZSBzdXJlIHRvIGNoZWNrIHRoZSBzaGFyZWQgc3RhdGUgYmVmb3JlIHJlbGVhc2luZy4gKFNpbmNlCi0JCQkgKiBpc1NoYXJlZCBhc3N1bWVzIGEgY291bnQgb2YgMSBtZWFucyBub3Qgc2hhcmVkIC4uLiBhbmQgd2Ugd2FudAotCQkJICogb3VyICcxJyB0byBiZSB0aGF0IG9uZS4pIFRoZSBwcm9ibGVtLCBvZiBjb3Vyc2UsIGlzIHRoYXQKLQkJCSAqIGJldHdlZW4gcHJlLWN5Y2xlIG5vdGlmaWNhdGlvbiBhbmQgcG9zdC1yZWxlYXNlIG5vdGlmaWNhdGlvbiwKLQkJCSAqIHRoZSBtb2RlbCBjb3VsZCBvbmNlIGFnYWluIGhhdmUgYmVjb21lIHNoYXJlZCwgcmVuZGVyaW5nIHRoZQotCQkJICogcmVsZWFzZSBub3RpZmljYXRpb24gaW5jb3JyZWN0LgotCQkJICovCi0JCQlib29sZWFuIGlzU2hhcmVkID0gaXNTaGFyZWQoKTsKLQotCQkJaWYgKCFpc1NoYXJlZCkgewotCQkJCXNpZ25hbFByZUxpZmVDeWNsZUV2ZW50UmVsZWFzZSh0aGlzKTsKLQkJCX0KLQotCQkJX2dldE1vZGVsTWFuYWdlcigpLnJlbGVhc2VGcm9tUmVhZCh0aGlzKTsKLQotCQkJaWYgKCFpc1NoYXJlZCkgewotCQkJCXNpZ25hbFBvc3RMaWZlQ3ljbGVMaXN0ZW5lclJlbGVhc2UodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmVwbGVuaXNoZXMgdGhlIG1vZGVsIHdpdGggdGhlIHJlc291cmNlIHdpdGhvdXQgc2F2aW5nCi0JICogYW55IHBvc3NpYmxlIGNoYW5nZXMuIEl0IGlzIHVzZWQgd2hlbiBvbmUgZWRpdG9yIG1heSBiZSBjbG9zaW5nLCBhbmQKLQkgKiBzcGVjaWZpYWxseSBzYXlzIG5vdCB0byBzYXZlIHRoZSBtb2RlbCwgYnV0IGFub3RoZXIgImRpc3BsYXkiIG9mIHRoZQotCSAqIG1vZGVsIHN0aWxsIG5lZWRzIHRvIGhhbmcgb24gdG8gc29tZSBtb2RlbCwgc28gbmVlZHMgYSBmcmVzaCBjb3B5LgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIHJlbG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQlyZXN1bHQgPSBfZ2V0TW9kZWxNYW5hZ2VyKCkucmVsb2FkTW9kZWwoZ2V0SWQoKSwgaW5wdXRTdHJlYW0pOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQljaGFuZ2VkTW9kZWwoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQkvLyBpZiBtYW5hZ2VyIGlzIG51bGwsIHRoZW4gbm9uZSBoYXZlIGJlZW4gYWRkZWQsIHNvCi0JCS8vIG5vIG5lZWQgdG8gcmVtb3ZlIGFueQotCQlpZiAoZkxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc3luY2hyb25pemVkIChmTGlzdGVuZXJMb2NrKSB7Ci0JCQlmTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcihJTW9kZWxTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyBpZiBpdHMgbm90IGluIHRoZSBsaXN0ZW5lcnMsIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQlzeW5jaHJvbml6ZWQgKGZMaXN0ZW5lckxvY2spIHsKLQkJCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZk1vZGVsU3RhdGVMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCWludCBvbGRTaXplID0gZk1vZGVsU3RhdGVMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkU2l6ZTsgaSsrKSB7Ci0JCQkJCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikgeyAvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlCi0JCQkJCQkvLyByZW1vdmluZwotCQkJCQkJbmV3TGlzdGVuZXJzW2luZGV4KytdID0gZk1vZGVsU3RhdGVMaXN0ZW5lcnNbaV07Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3Mgc3dpdGNoIGl0IGZvciB0aGUKLQkJCQkvLyBvbGQKLQkJCQkvLyBvbmUKLQkJCQlmTW9kZWxTdGF0ZUxpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogQSBtZXRob2QgdGhhdCBtb2RpZmllcyB0aGUgbW9kZWwncyBzeW5jaHJvbml6YXRpb24gc3RhbXAgdG8gbWF0Y2ggdGhlCi0JICogcmVzb3VyY2UuIFR1cm5zIG91dCB0aGVyZSdzIHNldmVyYWwgd2F5cyBvZiBkb2luZyBpdCwgc28gdGhpcyBlbnN1cmVzIGEKLQkgKiBjb21tb24gYWxnb3JpdGhtLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0U3luY2hyb25pemF0aW9uU3RhbXAoSVJlc291cmNlIHJlc291cmNlKSB7Ci0KLQotCQlzZXRTeW5jaHJvbml6YXRpb25TdGFtcChjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAocmVzb3VyY2UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgQVBJIGFsbG93cyBhIGNsaWVudCB0byBpbml0aWF0ZSBub3RpZmljYXRpb24gdG8gYWxsIGludGVyZXN0ZWQKLQkgKiBwYXJ0aWVzIHRoYXQgYSBtb2RlbCdzIHVuZGVybHlpbmcgcmVzb3VyY2UgaGFzIGJlZW4gZGVsZXRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZURlbGV0ZWQoKSB7Ci0KLQotCQkvLyBub3RpY2UgdGhpcyBpcyBqdXN0IGEgcHVibGljIGF2ZW51ZSB0byBvdXIgcHJvdGVjdGVkIG1ldGhvZAotCQlmaXJlTW9kZWxSZXNvdXJjZURlbGV0ZWQodGhpcyk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhbGxvd3MgYSBtb2RlbCBjbGllbnQgdG8gaW5pdGlhdGUgbm90aWZpY2F0aW9uIHRvIGFsbAotCSAqIGludGVyZXN0ZWQgcGFydGllcyB0aGF0IGEgbW9kZWwncyB1bmRlcmx5aW5nIHJlc291cmNlIGxvY2F0aW9uIGhhcwotCSAqIGNoYW5nZWQuIE5vdGU6IHdlIGFzc3VtZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hhbmdlZCBiYXNlTG9jYXRpb24sIElkLAotCSAqIGV0Yy4sIHNpbmNlIGl0cyByZWFsbHkgdXAgdG8gdGhlIGNsaWVudCB0byBkZXRlcm1pbmUgd2hhdCdzICJuZXciIGFib3V0Ci0JICogYSBtb3ZlZCBtb2RlbC4gQ2F1dGlvbjogJ3RoaXMnIGFuZCAnbmV3TW9kZWwnIG1heSBiZSB0aGUgc2FtZSBvYmplY3QuCi0JICogVGhpcyBpcyB0aGUgY2FzZSBmb3IgY3VycmVudCB3b3JraW5nIHdpdGggRmlsZU1vZGVsUHJvdmlkZXIsIGJ1dCBoYXZlCi0JICogbGVmdCB0aGUgZHVhbCBhcmd1bWVudCBmb3IgZnV0dXJlIHBvc3NpYmlsaXRpZXMuCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0KLQotCQkvLyBub3RpY2UgdGhpcyBpcyBqdXN0IGEgcHVibGljIGF2ZW51ZSB0byBvdXIgcHJvdGVjdGVkIG1ldGhvZAotCQlmaXJlTW9kZWxSZXNvdXJjZU1vdmVkKHRoaXMsIG5ld01vZGVsKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9TQVZFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UOwotCQlNb2RlbExpZmVjeWNsZUV2ZW50IG1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyBzdHJpbmdJZCA9IGdldElkKCk7Ci0JCQlfZ2V0TW9kZWxNYW5hZ2VyKCkuc2F2ZU1vZGVsKHN0cmluZ0lkLCBFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0JCX0KLQotCQlmaW5hbGx5IHsKLQkJCS8vIHdlIHB1dCBlbmQgbm90aWZpY2F0aW9uIGluIGZpbmFsbHkgYmxvY2ssIHNvIGV2ZW4gaWYKLQkJCS8vIGVycm9yIG9jY3VycyBkdXJpbmcgc2F2ZSwgbGlzdGVuZXJzIGFyZSBzdGlsbCBub3RpZmllZCwKLQkJCS8vIHNpbmNlIHRoZWlyIGNvZGUgY291bGQgZGVwZW5kIG9uIHJlY2VpdmluZywgdG8gY2xlYW4gdXAKLQkJCS8vIHNvbWUgc3RhdGUsIG9yIGNvb3JkaW5hdGUgb3RoZXIgcmVzb3VyY2VzLgotCQkJdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQ7Ci0JCQltb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgc2F2ZShFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9TQVZFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UOwotCQlNb2RlbExpZmVjeWNsZUV2ZW50IG1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyBzdHJpbmdJZCA9IGdldElkKCk7Ci0JCQlfZ2V0TW9kZWxNYW5hZ2VyKCkuc2F2ZU1vZGVsKHN0cmluZ0lkLCBlbmNvZGluZ1J1bGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gd2UgcHV0IGVuZCBub3RpZmljYXRpb24gaW4gZmluYWxseSBibG9jaywgc28gZXZlbiBpZgotCQkJLy8gZXJyb3Igb2NjdXJzIGR1cmluZyBzYXZlLCBsaXN0ZW5lcnMgYXJlIHN0aWxsIG5vdGlmaWVkLAotCQkJLy8gc2luY2UgdGhlaXIgY29kZSBjb3VsZCBkZXBlbmQgb24gcmVjZWl2aW5nLCB0byBjbGVhbiB1cAotCQkJLy8gc29tZSBzdGF0ZSwgb3IgY29vcmRpbmF0ZSBvdGhlciByZXNvdXJjZXMuCi0JCQl0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9TQVZFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVDsKLQkJCW1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzYXZlKElGaWxlIGlGaWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9TQVZFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UOwotCQlNb2RlbExpZmVjeWNsZUV2ZW50IG1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyBzdHJpbmdJZCA9IGdldElkKCk7Ci0JCQlfZ2V0TW9kZWxNYW5hZ2VyKCkuc2F2ZU1vZGVsKGlGaWxlLCBzdHJpbmdJZCwgRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCQl9Ci0KLQkJZmluYWxseSB7Ci0JCQkvLyB3ZSBwdXQgZW5kIG5vdGlmaWNhdGlvbiBpbiBmaW5hbGx5IGJsb2NrLCBzbyBldmVuIGlmCi0JCQkvLyBlcnJvciBvY2N1cnMgZHVyaW5nIHNhdmUsIGxpc3RlbmVycyBhcmUgc3RpbGwgbm90aWZpZWQsCi0JCQkvLyBzaW5jZSB0aGVpciBjb2RlIGNvdWxkIGRlcGVuZCBvbiByZWNlaXZpbmcsIHRvIGNsZWFuIHVwCi0JCQkvLyBzb21lIHN0YXRlLCBvciBjb29yZGluYXRlIG90aGVyIHJlc291cmNlcy4KLQkJCXR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UOwotCQkJbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNhdmUoSUZpbGUgaUZpbGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaW50IHR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QUkVfRVZFTlQ7Ci0JCU1vZGVsTGlmZWN5Y2xlRXZlbnQgbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQotCQl0cnkgewotCQkJU3RyaW5nIHN0cmluZ0lkID0gZ2V0SWQoKTsKLQkJCV9nZXRNb2RlbE1hbmFnZXIoKS5zYXZlTW9kZWwoaUZpbGUsIHN0cmluZ0lkLCBlbmNvZGluZ1J1bGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gd2UgcHV0IGVuZCBub3RpZmljYXRpb29uIGluIGZpbmFsbHkgYmxvY2ssIHNvIGV2ZW4gaWYKLQkJCS8vIGVycm9yIG9jY3VycyBkdXJpbmcgc2F2ZSwgbGlzdGVuZXJzIGFyZSBzdGlsbCBub3RpZmllZCwKLQkJCS8vIHNpbmNlIHRoZWlyIGNvZGUgY291bGQgZGVwZW5kIG9uIHJlY2VpdmluZywgdG8gY2xlYW4gdXAKLQkJCS8vIHNvbWUgc3RhdGUsIG9yIGNvb3JkaW5hdGUgb3RoZXIgcmVzb3VyY2VzLgotCQkJdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQ7Ci0JCQltb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0JCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9TQVZFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UOwotCQlNb2RlbExpZmVjeWNsZUV2ZW50IG1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyBzdHJpbmdJZCA9IGdldElkKCk7Ci0JCQlfZ2V0TW9kZWxNYW5hZ2VyKCkuc2F2ZU1vZGVsKHN0cmluZ0lkLCBvdXRwdXRTdHJlYW0sIEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQkJfQotCi0JCWZpbmFsbHkgewotCQkJLy8gd2UgcHV0IGVuZCBub3RpZmljYXRpb24gaW4gZmluYWxseSBibG9jaywgc28gZXZlbiBpZgotCQkJLy8gZXJyb3Igb2NjdXJzIGR1cmluZyBzYXZlLCBsaXN0ZW5lcnMgYXJlIHN0aWxsIG5vdGlmaWVkLAotCQkJLy8gc2luY2UgdGhlaXIgY29kZSBjb3VsZCBkZXBlbmQgb24gcmVjZWl2aW5nLCB0byBjbGVhbiB1cAotCQkJLy8gc29tZSBzdGF0ZSwgb3IgY29vcmRpbmF0ZSBvdGhlciByZXNvdXJjZXMuCi0JCQl0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9TQVZFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVDsKLQkJCW1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB0eXBpY2FsbHkgdXNlZCB0byBkZW5vdGUgdGhlIG1vZGVsJ3MgdW5kZXJseWluZwotCSAqIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhc2VMb2NhdGlvbihqYXZhLmxhbmcuU3RyaW5nIG5ld0Jhc2VMb2NhdGlvbikgewotCQlmQmFzZUxvY2F0aW9uID0gbmV3QmFzZUxvY2F0aW9uOwotCQlpZiAoZlJlc29sdmVyICE9IG51bGwpIHsKLQkJCWZSZXNvbHZlci5zZXRGaWxlQmFzZUxvY2F0aW9uKG5ld0Jhc2VMb2NhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZUlkZW50aWZpZXIoU3RyaW5nIGNvbnRlbnRUeXBlSWRlbnRpZmllcikgewotCQlmRXhwbGljaXRDb250ZW50VHlwZUlkZW50aWZpZXIgPSBjb250ZW50VHlwZUlkZW50aWZpZXI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlydHlTdGF0ZShib29sZWFuIGRpcnR5U3RhdGUpIHsKLQotCQkvLyBubyBuZWVkIHRvIHByb2Nlc3MgKHNldCBvciBmaXJlIGV2ZW50KSwgaWYgc2FtZSB2YWx1ZQotCQlpZiAoZkRpcnR5U3RhdGUgIT0gZGlydHlTdGF0ZSkgewotCQkJLy8gcHJlLWNoYW5nZSBub3RpZmljYXRpb24KLQkJCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9ESVJUWV9TVEFURSB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UOwotCQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQotCi0JCQkvLyB0aGUgYWN0dWFsIGNoYW5nZQotCQkJZkRpcnR5U3RhdGUgPSBkaXJ0eVN0YXRlOwotCi0JCQkvLyBvbGQgbm90aWZpY2F0aW9uCi0JCQkvLyBUT0RPOiBDMyByZW1vdmUgb2xkIG5vdGlmaWNhdGlvbgotCQkJaWYgKGZEaXJ0eVN0YXRlID09IGZhbHNlKSB7Ci0JCQkJLy8gaWYgd2UgYXJlIGJlaW5nIHNldCB0byBub3QgZGlydHkgKHN1Y2ggYXMganVzdCBiZWVuIHNhdmVkKQotCQkJCS8vIHRoZW4gd2UgbmVlZCB0byBzdGFydCBsaXN0ZW5pbmcgZm9yIGNoYW5nZXMKLQkJCQkvLyBhZ2FpbiB0byBrbm93IHdoZW4gdG8gc2V0IHN0YXRlIHRvIHRydWU7Ci0JCQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkRpcnR5U3RhdGVXYXRjaGVyKTsKLQkJCX0KLQkJCWZpcmVNb2RlbERpcnR5U3RhdGVDaGFuZ2VkKHRoaXMsIGRpcnR5U3RhdGUpOwotCi0KLQkJCS8vIHBvc3QgY2hhbmdlIG5vdGlmaWNhdGlvbgotCQkJdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfRElSVFlfU1RBVEUgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQ7Ci0JCQltb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gd2lsbCBsaWtlbHkgYmUgZGVwcmVjYXRlZCBzb29uLCBpbiBmYXZvciBvZiBkaXJlY3QgJ2FkZHMnCi0JICogICAgICAgICAgICAgLi4uIGJ1dCB0YWtlcyBzb21lIHJlZGVzaWduLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZhY3RvcnlSZWdpc3RyeShGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5KSB7Ci0JCXRoaXMuZmFjdG9yeVJlZ2lzdHJ5ID0gZmFjdG9yeVJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFRoZSBpZCBpcyB0aGUgaWQgdGhhdCB0aGUgbW9kZWwgbWFuYWdlciB1c2VzIHRvIGlkZW50aWZ5IHRoaXMgbW9kZWwuIElmCi0JICogaXQgaXMgYmVpbmcgc2V0IGhlcmUsIGl0IG1lYW5zIHRoZSBtb2RlbCBtYW5nZXIgaXMgYWxyZWFkeSBtYW5hZ2luZyB0aGUKLQkgKiBtb2RlbCB3aXRoIGFub3RoZXIgaWQsIHNvIHdlIGhhdmUgdG8ga2VlcCBpdCBpbiBzeW5jLiBUaGlzIG1ldGhvZCBjYWxscwotCSAqIG5vdGlmaWVzIGxpc3RuZXJzLCBpZiB0aGV5IGhhdmVuJ3QgYmVlbiBub3RpZmllZCBhbHJlYWR5LCB0aGF0IGEgIm1vZGVsCi0JICogc3RhdGUgY2hhbmdlIiBpcyBhYm91dCB0byBvY2N1ci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHRocm93cyBSZXNvdXJjZUluVXNlIHsKLQotCi0JCS8vIEl0IG1ha2VzIG5vIHNlbnNlLCBJIGRvbid0IHRoaW5rLCB0byBoYXZlIGFuIGlkIG9mIG51bGwsIHNvCi0JCS8vIHdlJ2xsIHRocm93IGFuIGlsbGVnYWwgYXJndW1lbnQgZXhjZXB0aW9uIGlmIHNvbWVvbmUgdHJ5cy4gTm90ZToKLQkJLy8gdGhlIElNb2RlbE1hbmFnZXIgY291bGQgbm90IG1hbmFnZSBhIG1vZGVsIHdpdGggYW4gaWQgb2YgbnVsbCwKLQkJLy8gc2luY2UgaXQgdXNlcyBoYXNodGFibGVzLCBhbmQgeW91IGNhbid0IGhhdmUgYSBudWxsIGlkIGZvciBhCi0JCS8vIGhhc2h0YWJsZS4KLQkJaWYgKG5ld0lkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFNTRUNvcmVNZXNzYWdlcy5BX21vZGVsX3NfaWRfY2FuX25vdF9iZV9udV9FWENfKTsgLy8kTk9OLU5MUy0xJCA9ICJBIG1vZGVsJ3MgaWQgY2FuIG5vdCBiZSBudWxsIgotCQkvLyBUbyBndWFyZCBhZ2FpbnN0IHRocm93aW5nIGEgc3B1cmlvdXMgUmVzb3VyY2VJblVzZSBleGNlcHRpb24sCi0JCS8vIHdoaWNoIGNhbiBvY2N1ciB3aGVuIHR3byBwaWVjZXMgb2YgY29kZSBib3RoIHdhbnQgdG8gY2hhbmdlIHRoZSBpZCwKLQkJLy8gc28gdGhlIHNlY29uZCByZXF1ZXN0IGlzIHNwdXJpb3VzLCB3ZSdsbCBpZ25vcmUgYW55IHJlcXVlc3RzIHRoYXQKLQkJLy8gYXR0ZW1wdCB0byBjaGFuZ2UgdGhlIGlkIHRvIHdoYXQgaXQgYWxyZWFkeSBpcyAuLi4gbm90ZSwgd2UgdXNlCi0JCS8vICdlcXVhbHMnLCBub3QgaWRlbnRpdHkgKCc9PScpIHNvIHRoYXQgdGhpbmdzIGxpa2UKLQkJLy8gc3RyaW5ncyBjYW4gYmUgdXNlZC4gVGhpcyBpcyB0aGUgc2FtZSBjcml0ZXJpYSB0aGF0IGlkcyBhcmUKLQkJLy8gZm91bmQgaW4gbW9kZWwgbWFuYWdlciAtLSB3ZWxsLCBhY3R1YWxseSwgSSBqdXN0IGNoZWNrZWQsIGFuZCBmb3IKLQkJLy8gdGhlIGhhc2h0YWJsZSBpbXBsLCB0aGUgY3JpdGVyaWEgdXNlcyAuZXF1YWxzIEFORCB0aGUgY29uZGl0aW9uCi0JCS8vIHRoYXQgdGhlIGhhc2ggdmFsdWVzIGJlIGlkZW50aWNhbCAoSSdtIGFzc3VtaW5nIHRoaXMgaXMgYWx3YXlzCi0JCS8vIHRydWUsIGlmIGVxdWFscyBpcyB0cnVlLCBmb3Igbm93LCBJJ20gbm90IHN1cmUKLQkJLy8gd2UgY2FuIGFzc3VtZSB0aGF0IGhhc2h0YWJsZSB3aWxsIGFsd2F5cyBiZSB1c2VkLCBidXQgaW4KLQkJLy8gZ2VuZXJhbCwgc2hvdWxkIG1hdGNoLikKLQkJLy8KLQkJaWYgKG5ld0lkLmVxdWFscyhmSWQpKQotCQkJcmV0dXJuOwotCQkvLyB3ZSBtdXN0IGd1YXJkIGFnYWluc3QgcmVhc3NpZ25pbmcgYW4gaWQgdG8gb25lIHRoYXQgd2UgYWxyZWFkeQotCQkvLyBhcmUgbWFuYWdpbmcuCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGluVXNlID0gKChNb2RlbE1hbmFnZXJJbXBsKWdldE1vZGVsTWFuYWdlcigpKS5pc0lkSW5Vc2UobmV3SWQpOwotCQkJaWYgKGluVXNlKSB7Ci0JCQkJdGhyb3cgbmV3IFJlc291cmNlSW5Vc2UoKTsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJLy8gbm9ybWFsIGNvZGUgcGF0aAotCQkJYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQlTdHJpbmcgb2xkSWQgPSBmSWQ7Ci0JCQlmSWQgPSBuZXdJZDsKLQkJCWlmIChnZXRNb2RlbE1hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQkJLy8gaWYgbWFuYWdlZCBhbmQgdGhlIGlkIGhhcyBjaGFuZ2VkLCBub3RpZnkgdG8KLQkJCQkvLyBJTW9kZWxNYW5hZ2VyCi0JCQkJLy8gVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduIG5vdCB0byBkbyB0aGF0Ci0JCQkJaWYgKG9sZElkICE9IG51bGwgJiYgbmV3SWQgIT0gbnVsbCAmJiAhbmV3SWQuZXF1YWxzKG9sZElkKSkgewotCQkJCQlnZXRNb2RlbE1hbmFnZXIoKS5tb3ZlTW9kZWwob2xkSWQsIG5ld0lkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBtYWtlIHN1cmUgdGhpcyBmaW5hbGx5IGlzIG9ubHkgZXhlY3V0ZWQgaWYgJ2Fib3V0IHRvIENoYW5nZQotCQkJLy8gbW9kZWwnIGhhcwotCQkJLy8gYmVlbiBleGVjdXRlZC4KLQkJCWNoYW5nZWRNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udGVudFR5cGVEZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFR5cGVEZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgVGhlIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWxIYW5kbGVyKElNb2RlbEhhbmRsZXIgbW9kZWxIYW5kbGVyKSB7Ci0KLQkJLy8gbm8gbmVlZCB0byBmaXJlIGV2ZW50cyBpZiBtb2RlbEhhbmRsZXIgaGFzIGJlZW4gbnVsbAotCQkvLyBmb3IgdGhpcyBtb2RlbCAtLQotCQkvLyB0aGlzIGlzIGFuIGF0dGVtcHQgYXQgaW5pdGlhbGl6YXRpb24gb3B0aW1pemF0aW9uIGFuZCBtYXkgbmVlZAotCQkvLyB0byBjaGFuZ2UgaW4gZnV0dXJlLgotCQlib29sZWFuIHRydWVDaGFuZ2UgPSBmYWxzZTsKLQkJaWYgKGZNb2RlbEhhbmRsZXIgIT0gbnVsbCkKLQkJCXRydWVDaGFuZ2UgPSB0cnVlOwotCQlpZiAodHJ1ZUNoYW5nZSkgewotCQkJaW50ZXJuYWxBYm91dFRvQmVDaGFuZ2VkKCk7Ci0JCX0KLQkJZk1vZGVsSGFuZGxlciA9IG1vZGVsSGFuZGxlcjsKLQkJaWYgKHRydWVDaGFuZ2UpIHsKLQkJCWludGVybmFsTW9kZWxDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQotCi0JcHVibGljIHZvaWQgc2V0TW9kZWxNYW5hZ2VyKElNb2RlbE1hbmFnZXIgbmV3TW9kZWxNYW5hZ2VyKSB7Ci0KLQkJZk1vZGVsTWFuYWdlciA9IG5ld01vZGVsTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXdTdGF0ZShib29sZWFuIG5ld1N0YXRlKSB7Ci0KLQkJZk5ld1N0YXRlID0gbmV3U3RhdGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhICJmbGFnIiB0aGF0IHJlaW5pdGlhbGl6YXRpb24gaXMgbmVlZGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlaW5pdGlhbGl6ZU5lZWRlZChib29sZWFuIG5lZWRlZCkgewotCi0JCXJlaW5pdGlhbGl6YXRpb25OZWVkZWQgPSBuZWVkZWQ7Ci0JfQotCi0JLyoqCi0JICogSG9sZHMgYW55IGRhdGEgdGhhdCB0aGUgcmVpbml0IHByb2NlZHVyZSBtaWdodCBmaW5kIHVzZWZ1bCBpbgotCSAqIHJlaW5pdGlhbGl6aW5nIHRoZSBtb2RlbC4gVGhpcyBpcyBoYW5keSwgc2luY2UgdGhlIHJlaW5pdGlhbGl6YXRpb24gbWF5Ci0JICogbm90IHRha2UgcGxhY2UgYXQgb25jZSwgYW5kIHNvbWUgIm9sZCIgZGF0YSBtYXkgYmUgbmVlZGVkIHRvIHByb3Blcmx5Ci0JICogdW5kbyBwcmV2aW91cyBzZXR0aW5ncy4gTm90ZTogdGhlIHBhcmFtZXRlciB3YXMgaW50ZW50aW9uYWxseSBtYWRlIHRvCi0JICogYmUgb2YgdHlwZSAnT2JqZWN0JyBzbyBkaWZmZXJlbnQgbW9kZWxzIGNhbiB1c2UgaW4gZGlmZmVyZW50IHdheXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKE9iamVjdCBvYmplY3QpIHsKLQotCQlyZWluaXRpYWxpemVTdGF0ZURhdGEgPSBvYmplY3Q7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvbHZlcihVUklSZXNvbHZlciBuZXdSZXNvbHZlcikgewotCi0JCWZSZXNvbHZlciA9IG5ld1Jlc29sdmVyOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCWJvb2xlYW4gbGlmZUN5Y2xlTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkRpcnR5U3RhdGVXYXRjaGVyKTsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXIoZkRvY3VtZW50VG9Nb2RlbE5vdGlmaWVyKTsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkRvY3VtZW50VG9Nb2RlbE5vdGlmaWVyKTsKLQkJCS8vIHByZWNoYW5nZSBub3RpZmljYXRpb24KLQkJCWxpZmVDeWNsZU5vdGlmaWNhdGlvbiA9IHRydWU7Ci0JCQlNb2RlbExpZmVjeWNsZUV2ZW50IG1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgRG9jdW1lbnRDaGFuZ2VkKE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5ULCB0aGlzLCBmU3RydWN0dXJlZERvY3VtZW50LCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0JCX0KLQotCQkvLyBob2xkIGZvciBsaWZlIGN5Y2xlIG5vdGlmaWNhdGlvbgotCQlJU3RydWN0dXJlZERvY3VtZW50IHByZXZpb3VzRG9jdW1lbnQgPSBmU3RydWN0dXJlZERvY3VtZW50OwotCQkvLyB0aGUgYWN0dWFsIGNoYW5nZQotCQlmU3RydWN0dXJlZERvY3VtZW50ID0gbmV3U3RydWN0dXJlZERvY3VtZW50OwotCi0KLQkJLy8gYXQgdGhlIHN1cGVyIGNsYXNzIGxldmVsLCB3ZSdsbCBsaXN0ZW4gZm9yIHN0cnVjdHVyZWREb2N1bWVudAotCQkvLyBjaGFuZ2VzCi0JCS8vIHNvIHdlIGNhbiBzZXQgb3VyIGRpcnR5IHN0YXRlIGZsYWcKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmRGlydHlTdGF0ZVdhdGNoZXIpOwotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihmRG9jdW1lbnRUb01vZGVsTm90aWZpZXIpOwotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmRG9jdW1lbnRUb01vZGVsTm90aWZpZXIpOwotCQl9Ci0KLQkJaWYgKGxpZmVDeWNsZU5vdGlmaWNhdGlvbikgewotCQkJLy8gcG9zdCBjaGFuZ2Ugbm90aWZpY2F0aW9uCi0JCQlNb2RlbExpZmVjeWNsZUV2ZW50IG1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgRG9jdW1lbnRDaGFuZ2VkKE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVCwgdGhpcywgcHJldmlvdXNEb2N1bWVudCwgbmV3U3RydWN0dXJlZERvY3VtZW50KTsKLQkJCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOS83LzIwMDEgMjozMDoyNgotCSAqIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdTeW5jaHJvbml6YXRpb25TdGFtcAotCSAqICAgICAgICAgICAgbG9uZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFN5bmNocm9uaXphdGlvblN0YW1wKGxvbmcgbmV3U3luY2hyb25pemF0aW9uU3RhbXApIHsKLQotCQlmU3luY2hyb25pemF0aW9uU3RhbXAgPSBuZXdTeW5jaHJvbml6YXRpb25TdGFtcDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmRvTWFuYWdlcihJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlcikgewotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZG9jdW1lbnQgd2FzIG51bGwgd2hlbiB1bmRvIG1hbmFnZXIgc2V0IG9uIG1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0VW5kb01hbmFnZXIodW5kb01hbmFnZXIpOwotCX0KLQotCS8qKgotCSAqIFRvIGJlIGNhbGxlZCBvbmx5IGJ5ICJmcmllbmRseSIgY2xhc3Nlcywgc3VjaCBhcyBNb2RlbE1hbmFnZXIsIGFuZAotCSAqIHN1YmNsYXNzZXMuCi0JICovCi0Jdm9pZCBzaWduYWxMaWZlY3ljbGVFdmVudChNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChmTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlci5zaWduYWxMaWZlY3ljbGVFdmVudChldmVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNpZ25hbFBvc3RMaWZlQ3ljbGVMaXN0ZW5lclJlbGVhc2UoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJaW50IHR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1JFTEVBU0VEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UOwotCQkvLyB3aGF0J3Mgd3Jvbmcgd2l0aCB0aGlzIGRlc2lnbiB0aGF0IGEgY2FzdCBpcyBuZWVkZWQgaGVyZSE/Ci0JCU1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudChzdHJ1Y3R1cmVkTW9kZWwsIHR5cGUpOwotCQkoKEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLnNpZ25hbExpZmVjeWNsZUV2ZW50KGV2ZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2lnbmFsUHJlTGlmZUN5Y2xlRXZlbnRSZWxlYXNlKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9SRUxFQVNFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UOwotCQkvLyB3aGF0J3Mgd3Jvbmcgd2l0aCB0aGlzIGRlc2lnbiB0aGF0IGEgY2FzdCBpcyBuZWVkZWQgaGVyZSE/Ci0JCU1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudChzdHJ1Y3R1cmVkTW9kZWwsIHR5cGUpOwotCQkoKEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLnNpZ25hbExpZmVjeWNsZUV2ZW50KGV2ZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL0ZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9GYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzMDM5MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9GYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBzaW1wbHkgbWFpbnRhaW5zIHRoZSBsaXN0IG9mIGZhY3RvcmllcyBhbmQgcmV0dXJucyBzaW5nbGV0b24KLSAqIGluc3RhbmNlcyBvZiB0aGVtLiBTb21lICJidWlsdCBpbiIgdHlwZXMgYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmb3JtCi0gKiBGYWN0b3J5Q29uZmlnLCBpZiBub3QgZm91bmQgcmVnaXN0ZXJkLCBidXQgbm9ybWFsbHkgY2xpZW50cyBjYW4vc2hvdWxkCi0gKiByZWdpc3RlciB0aGVpciBvd24gZmFjdG9yaWVzLgotICogCi0gKiBOb3QgaW50ZW5kZWQgZm9yIGNsaWVudHMgdG8gc3ViY2xhc3Mgb3IgaW5zdGFudGlhdGUuCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZhY3RvcnlSZWdpc3RyeSB7Ci0KLQlwcml2YXRlIExpc3QgZmFjdG9yaWVzOwotCi0JLyoqCi0JICogaW50ZW50aW9uYWxseSBkZWZhdWx0IGFjY2VzcwotCSAqLwotCUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQotCX0KLQotCXByaXZhdGUgTGlzdCBfZ2V0RmFjdG9yaWVzKCkgewotCi0JCWlmIChmYWN0b3JpZXMgPT0gbnVsbCkgewotCQkJLy8gbWF5IG5lZWQgdG8gdXNlIGphdmEudXRpbC5Db2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KCkgaWYKLQkJCS8vIHN5bmNyb25pemF0aW9uIGJlY29tZXMKLQkJCS8vIG5lY2Vzc2FyeSAoYW5kIGlmIHNvLCByZW1lbWJlciB0byBzeW5jaHJvbml6ZSBvbiBmYWN0b3JpZXMpCi0JCQlmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGZhY3RvcmllczsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEZhY3RvcnkoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCV9nZXRGYWN0b3JpZXMoKS5hZGQoZmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJGYWN0b3JpZXMoKSB7Ci0JCWZhY3Rvcmllcy5jbGVhcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBGYWN0b3J5UmVnaXN0cnkjY29udGFpbnMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCB0eXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIG5vdGU6IHdlJ3JlIG5vdCB1c2luZyBjbG9uZWQgbGlzdCwgc28gc3RyaWN0bHkgc3BlYWtpbmcKLQkJLy8gaXMgbm90IHRocmVhZCBzYWZlLgotCQlMaXN0IGludGVybmFsTGlzdCA9IF9nZXRGYWN0b3JpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcm5hbExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBpbnRlcm5hbExpc3QuZ2V0KGkpOwotCQkJaWYgKGZhY3RvcnkuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBsaXN0IG9mIGZhY3RvcmllcyBpbiB0aGUgcmVnaXN0cnkuIE5vdGU6Ci0JICogdGhpcyBjYW4gbm90IGJlIHVzZWQgdG8gYWRkL3JlbW92ZSBmYWN0b3JpZXMuIEl0cyBwcmltYXJpbHkgcHJvdmlkZWQKLQkgKiBmb3IgdGhvc2UgZmV3IGNhc2VzIHdoZXJlIGEgbGlzdCBvZiBmYWN0b3JpZXMgbXVzdCBiZSBjb3BpZWQgZnJvbSBvbmUKLQkgKiBtb2RlbCBhbmQgYWRkZWQgdG8gYW5vdGhlci4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGYWN0b3JpZXMoKSB7Ci0JCS8vIG5vdGU6IGZvciBvYmplY3QgaW50ZWdyaXR5LCB3ZSBkb24ndCBsZXQgYW55b25lIGdldAotCQkvLyBvdXIgbWFpbiBsaXN0IChzbyB0aGV5IGhhdmUgdG8gYWRkIHRocm91Z2ggYWRkRmFjdG9yeSksCi0JCS8vIGJ1dCB3ZSB3aWxsIHJldHVybiBhIHNoYWxsb3cgImNsb25lZCIgbGlzdC4KLQkJTGlzdCBmYWN0b3J5TGlzdCA9IG5ldyBBcnJheUxpc3QoX2dldEZhY3RvcmllcygpKTsKLQkJcmV0dXJuIGZhY3RvcnlMaXN0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGEgbm90IGEgcHVyZSByZXNpc3RyeS4gRmFjdG9yaWVzIHJldHJpZXZlZCBiYXNlZCBvbgotCSAqIHRoZWlyIHJlc3BvbnNlIHRvICJpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpIi4gTm90ZSB0aGF0IGlmIHRoZXJlIGlzIG1vcmUKLQkgKiB0aGFuIG9uZSBmYWN0b3J5IHRoYXQgY2FuIGFuc3dlciAndHJ1ZScgdGhhdCB0aGUgbW9zdCByZWNlbnRseSBhZGRlZAotCSAqIGZhY3RvcnkgaXMgdXNlZC4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBnZXRGYWN0b3J5Rm9yKE9iamVjdCB0eXBlKSB7Ci0KLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSByZXN1bHQgPSBudWxsOwotCQlpZiAoZmFjdG9yaWVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGxpc3RTaXplID0gZmFjdG9yaWVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IGxpc3RTaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCS8vIEl0IGlzIHRoZSBhZGFwdGVyIGZhY3RvcmllcyByZXNwb25zaWJpbGl0eSB0byBhbnN3ZXIKLQkJCS8vIGlzRmFjdG9yeUZvclR5cGUgc28gaXQgZ2V0cyBjaG9vc2VuLgotCQkJLy8gTm90aWNlIHdlIGFyZSBnb2luZyB0aHJvdWdoIHRoZSBsaXN0IGJhY2t3YXJkcyB0byBnZXQgdGhlCi0JCQkvLyBmYWN0b3J5IGFkZGVkIGxhc3QuCi0JCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGEgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgZmFjdG9yaWVzLmdldChpKTsKLQkJCWlmIChhLmlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCQlyZXN1bHQgPSBhOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBtb2RpZmllZCB0byB3b3JrIG9uIGNvcHkgb2YgbGlzdCwgZm9yIFY1UFRGMQotCQkvLyBzZW5kIHJlbGVhc2UgdG8gbG9jYWwgY29weSBvZiBsaXN0Ci0JCS8vIG9mIGZhY3Rvcmllcywgc2luY2Ugc29tZSBmYWN0b3JpZXMsIGR1cmluZwotCQkvLyB0aGVpciByZWxlYXNlIGZ1bmN0aW9uLCBtYXkgcmVtb3ZlCi0JCS8vIHRoZW1zZWx2ZXMgZnJvbSB0aGUgcmVnaXN0cnkuCi0JCUxpc3QgbG9jYWxMaXN0ID0gZ2V0RmFjdG9yaWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGEgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgbG9jYWxMaXN0LmdldChpKTsKLQkJCS8vIFRvIGhlbHAgYnVsbGV0IHByb29mIGNvZGUsIHdlJ2xsIGNhdGNoIGFuZCBsb2cKLQkJCS8vIGFueSBtZXNzYWdlcyB0aHJvd24gYnkgZmFjdG9yaWVzIGR1cmluZyByZWxlYXNlLAotCQkJLy8gYnV0IHdlJ2xsIGF0dGVtcHQgdG8ga2VlcCBnb2luZy4KLQkJCS8vIEluIG5lYXJseSBhbGwgY2FzZXMsIHRob3VnaCwgc3VjaCBlcnJvcnMgYXJlCi0JCQkvLyBzZXZlcmUgZm9yIHByb2R1Y3QvY2xpZW50LCBhbmQgbmVlZCB0byBiZSBmaXhlZC4KLQkJCXRyeSB7Ci0JCQkJYS5yZWxlYXNlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJQcm9ncmFtIHByb2JsZW0gcmVsZWFzaW5nIGZhY3RvcnkiICsgYSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBmYWN0b3J5IGlmIGl0IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0RmFjdG9yeUZvcih0eXBlKS4gSWYKLQkgKiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lLCBhbGwgYXJlIHJlbW92ZWQuIElmIHRoZXJlIGlzIG5vbmUsIHRoZSBjYWxsCi0JICogc2ltcGx5IHJldHVybnMgKHRoYXQgaXMsIGl0IGlzIG5vdCBjb25zaWRlcmVkIGFuIGVycm9yKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVGYWN0b3JpZXNGb3IoamF2YS5sYW5nLk9iamVjdCB0eXBlKSB7Ci0JCWlmIChmYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJaW50IGxpc3RTaXplID0gZmFjdG9yaWVzLnNpemUoKTsKLQkJCS8vIHdlJ2xsIGdvIGJhY2t3YXJkcyB0aHJvdWdoIGxpc3QsIHNpbmNlIHdlJ3JlIHJlbW92aW5nLCBzbwotCQkJLy8gJ3NpemUnIGNoYW5nZSB3b24ndCBtYXR0ZXIuCi0JCQkvLyBOb3RlOiBJJ20gYXNzdW1pbmcgb3RoZXIgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24gZG8gbm90IGNoYW5nZQotCQkJLy8gcG9zaXRpb24KLQkJCS8vIHNpbXBseSBiZWNhdXNlIGFub3RoZXIgd2FzIHJlbW92ZWQuCi0JCQlmb3IgKGludCBpID0gbGlzdFNpemUgLSAxOyBpID49IDA7IGktLSkgewotCQkJCS8vIEl0IGlzIHRoZSBhZGFwdGVyIGZhY3RvcmllcyByZXNwb25zaWJpbGl0eSB0byBhbnN3ZXIKLQkJCQkvLyBpc0ZhY3RvcnlGb3JUeXBlIHNvIGl0IGdldHMgY2hvb3Nlbi4KLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGEgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgZmFjdG9yaWVzLmdldChpKTsKLQkJCQlpZiAoYS5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQkJCWZhY3Rvcmllcy5yZW1vdmUoYSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJX2dldEZhY3RvcmllcygpLnJlbW92ZShmYWN0b3J5KTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9MaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL0xpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjZjAxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL0xpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotCi0KLS8qKgotICogRm9yICJpbnRlcm5hbCB1c2UiIG9ubHkgYnkgQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwKLSAqLwotCi1jbGFzcyBMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyIHsKLQlwcml2YXRlIE9iamVjdFtdIGZMaXN0ZW5lcnM7Ci0KLQlMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgY29weSBvZiB0aGUgZ2l2ZW4gbGlzdGVuZXIgdG8gdGhlIGxpc3Qgb2YgTGlmZSBDeWNsZQotCSAqIExpc3RlbmVycy4KLQkgKiAKLQkgKiBNdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgbGlzdGVuZXIgYXJlIGFsbG93ZWQuIFRoaXMgaXMgcmVxdWlyZWQgdG8KLQkgKiBzdXBwb3J0IHRocmVhZGVkIGxpc3RlbmVyIG1hbmFnZW1lbnQgcHJvcGVybHkgYW5kIGZvciBtb2RlbC1kcml2ZW4gbW92ZQotCSAqIHRvIHdvcmsuIEZvciBleGFtcGxlLCB0d28gYWRkcyBhbmQgYSBzaW5nbGUgcmVtb3ZlIHNob3VsZCByZXN1bHQgaW4gdGhlCi0JICogbGlzdGVuZXIgc3RpbGwgbGlzdGVuaW5nIGZvciBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0Jdm9pZCBhZGRMaXN0ZW5lcihJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoTG9nZ2VyLkRFQlVHICYmIFV0aWxpdGllcy5jb250YWlucyhmTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIGxpc3RlbmluZyBtb3JlIHRoYW4gb25jZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpbnQgb2xkU2l6ZSA9IDA7Ci0JCWlmIChmTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCS8vIG5vcm1hbGx5IHdvbid0IGJlIG51bGwsIGJ1dCB3ZSBuZWVkIHRvIGJlIHN1cmUsIGZvciBmaXJzdAotCQkJLy8gdGltZSB0aHJvdWdoCi0JCQlvbGRTaXplID0gZkxpc3RlbmVycy5sZW5ndGg7Ci0JCX0KLQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJaWYgKGZMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJU3lzdGVtLmFycmF5Y29weShmTGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQl9Ci0JCS8vIGFkZCBsaXN0ZW5lciB0byBsYXN0IHBvc2l0aW9uCi0JCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJLy8KLQkJLy8gbm93IHN3aXRjaCBuZXcgZm9yIG9sZAotCQlmTGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBzaW5nbGUgY29weSBvZiB0aGUgZ2l2ZW4gbGlzdGVuZXIgZnJvbSB0aGUgbGlzdCBvZiBMaWZlIEN5Y2xlCi0JICogTGlzdGVuZXJzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXZvaWQgcmVtb3ZlTGlzdGVuZXIoSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCS8vIGlmIGl0cyBub3QgaW4gdGhlIGxpc3RlbmVycywgd2UnbGwgaWdub3JlIHRoZSByZXF1ZXN0Ci0JCQlpbnQgb2xkU2l6ZSA9IGZMaXN0ZW5lcnMubGVuZ3RoOwotCQkJaW50IG5ld1NpemUgPSBvbGRTaXplIC0gMTsKLQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQlpbnQgaW5kZXggPSAwOwotCQkJYm9vbGVhbiByZW1vdmVkT25jZSA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRTaXplOyBpKyspIHsKLQkJCQlpZiAoZkxpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lciAmJiAhcmVtb3ZlZE9uY2UpIHsKLQkJCQkJLy8gaWdub3JlIG9uIHRoZSBmaXJzdCBtYXRjaAotCQkJCQlyZW1vdmVkT25jZSA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gY29weSBvbGQgdG8gbmV3IGlmIGl0J3Mgbm90IHRoZSBvbmUgd2UgYXJlIHJlbW92aW5nCi0JCQkJCW5ld0xpc3RlbmVyc1tpbmRleCsrXSA9IGZMaXN0ZW5lcnNbaV07Ci0JCQkJfQotCQkJfQotCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3Mgc3dpdGNoIGl0IGZvciB0aGUgb2xkCi0JCQkvLyBvbmUKLQkJCWZMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCX0KLQkJaWYgKExvZ2dlci5ERUJVRyAmJiBVdGlsaXRpZXMuY29udGFpbnMoZkxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgIiArIGxpc3RlbmVyICsgIiByZW1vdmVkIG9uY2UgYnV0IHN0aWxsIGxpc3RlbmluZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCXZvaWQgc2lnbmFsTGlmZWN5Y2xlRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCkgewotCQlpZiAoTG9nZ2VyLkRFQlVHX0xJRkVDWUNMRSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIk1vZGVsTGlmZWN5Y2xlRXZlbnQgZmlyZWQgZm9yICIgKyBldmVudC5nZXRNb2RlbCgpLmdldElkKCkgKyAiOiAiICsgZXZlbnQudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb2RlbExpZmVjeWNsZUV2ZW50IGZpcmVkIGZvciAiICsgZXZlbnQuZ2V0TW9kZWwoKS5nZXRJZCgpICsgIjogIiArIGV2ZW50LnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQkvLyBXZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZSBsaXN0ZW5lciBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUKLQkJLy8gbGlzdGVuZXIgYXJyYXkgZnJvbSBhbm90aGVyIHRocmVhZAotCQlpZiAoZkxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gZkxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCUlNb2RlbExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyID0gKElNb2RlbExpZmVjeWNsZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldOwotCQkJCS8vIG9ubHkgb25lIHR5cGUgb2YgbGlzdGVuZXIgZm9yIG5vdyAuLi4gdGhpcyBjb3VsZCBiZWNvbWUKLQkJCQkvLyBtb3JlIGNvbXBsZXgKLQkJCQlpZiAoKGV2ZW50LmdldEludGVybmFsVHlwZSgpICYgTW9kZWxMaWZlY3ljbGVFdmVudC5QUkVfRVZFTlQpID09IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UKSB7Ci0JCQkJCWxpc3RlbmVyLnByb2Nlc3NQcmVNb2RlbEV2ZW50KGV2ZW50KTsKLQkJCQl9Ci0JCQkJaWYgKChldmVudC5nZXRJbnRlcm5hbFR5cGUoKSAmIE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVCkgPT0gTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UKSB7Ci0JCQkJCWxpc3RlbmVyLnByb2Nlc3NQb3N0TW9kZWxFdmVudChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9Nb2RlbExpZmVjeWNsZUV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL01vZGVsTGlmZWN5Y2xlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVmNjZkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL01vZGVsTGlmZWN5Y2xlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLS8qKgotICogVGhpcyBpcyBhbiBlYXJseSB2ZXJzaW9uIG9mIGEgY2xhc3MgdGhhdCBtYXkgY2hhbmdlIG92ZXIgdGhlIG5leHQgZmV3Ci0gKiBtaWxlc3RvbmVzLgotICovCi0KLQotcHVibGljIGNsYXNzIE1vZGVsTGlmZWN5Y2xlRXZlbnQgewotCi0KLQkvLyB0aGlzIGxpc3QgaXMgZm9yICJwdWJsaWMiIGNvbnN1bXB0aW9uCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfU0FWRUQgPSAweDAwMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfUkVMRUFTRUQgPSAweDAwMDAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX0RPQ1VNRU5UX0NIQU5HRUQgPSAweDAwMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfRElSVFlfU1RBVEUgPSAweDAwMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfUkVWRVJUPSAweDAwMDU7Ci0KLQkvLyBUT0RPOiBmaW5pc2ggc3VwcG9ydCBmb3IgdGhlc2UKLQkvLyBmb2xsb3dpbmcgbm90IGltcGxlbWVudGVkIHlldAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX1JFSU5JVElBTElaRUQgPSAweDAwMDY7Ci0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBREFQVEVSU19OT1RJRklFRCA9IDB4MDAwNzsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX1JFU09VUkNFX01PVkVEID0gMHgwMDA4OwotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfUkVTT1VSQ0VfREVMRVRFRCA9IDB4MDAwOTsKLQotCS8vIFRoaXMgbGlzdCAodXBwZXIgdHdvIGJ5dGVzKSBpcyBmb3Igb25seSBpbnRlcm5hbCBtZWNoYW5pc21zIGFuZAotCS8vIHN1YmNsYXNzZXMKLQkvLyBGb3Igc2ltcGxpY2l0eSB0aGV5IGFyZSAibWFza2VkIG91dCIgd2hlbiBjbGllbnQgY2FsbHMgZ2V0VHlwZSgpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUFJFX0VWRU5UID0gMHgwMTAwOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVNLID0gMHgwMEZGOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBPU1RfRVZFTlQgPSAweDAyMDA7Ci0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBmTW9kZWw7Ci0JcHJpdmF0ZSBpbnQgZlR5cGU7Ci0KLQlwdWJsaWMgTW9kZWxMaWZlY3ljbGVFdmVudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTW9kZWxMaWZlY3ljbGVFdmVudChpbnQgdHlwZSkgewotCQl0aGlzKCk7Ci0JCWZUeXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgTW9kZWxMaWZlY3ljbGVFdmVudChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHR5cGUpIHsKLQkJdGhpcyh0eXBlKTsKLQkJZk1vZGVsID0gc3RydWN0dXJlZE1vZGVsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGRlYnVnU3RyaW5nKGludCB0eXBlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlzd2l0Y2ggKHR5cGUgJiBNQVNLKSB7Ci0JCQljYXNlIE1PREVMX1NBVkVEIDoKLQkJCQlyZXN1bHQgPSAiTU9ERUxfU0FWRUQiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PREVMX1JFTEVBU0VEIDoKLQkJCQlyZXN1bHQgPSAiTU9ERUxfUkVMRUFTRUQiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PREVMX0RPQ1VNRU5UX0NIQU5HRUQgOgotCQkJCXJlc3VsdCA9ICJNT0RFTF9ET0NVTUVOVF9DSEFOR0VEIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBNT0RFTF9ESVJUWV9TVEFURSA6Ci0JCQkJcmVzdWx0ID0gIk1PREVMX0RJUlRZX1NUQVRFIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJLyoKLQkJCSAqIGNhc2UgTU9ERUxfUkVJTklUSUFMSVpFRCA6IHJlc3VsdCA9ICJNT0RFTF9SRUlOSVRJQUxJWkVEIjsKLQkJCSAqIGJyZWFrOyBjYXNlIE1PREVMX1JFTE9BREVEIDogcmVzdWx0ID0gIk1PREVMX1JFTE9BREVEIjsgYnJlYWs7Ci0JCQkgKiBjYXNlIEFEQVBURVJTX05PVElGSUVEIDogcmVzdWx0ID0gIkFEQVBURVJTX05PVElGSUVEIjsgYnJlYWs7Ci0JCQkgKiBjYXNlIE1PREVMX1JFU09VUkNFX01PVkVEIDogcmVzdWx0ID0gIk1PREVMX1JFU09VUkNFX01PVkVEIjsKLQkJCSAqIGJyZWFrOyBjYXNlIE1PREVMX1JFU09VUkNFX0RFTEVURUQgOiByZXN1bHQgPQotCQkJICogIk1PREVMX1JFU09VUkNFX0RFTEVURUQiOyBicmVhazsKLQkJCSAqLwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTW9kZWxMaWZlY3ljbGVFdmVudCBkaWQgbm90IGhhdmUgdmFsaWQgdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldEludGVybmFsVHlwZSgpIHsKLQotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoKSB7Ci0KLQkJcmV0dXJuIGZNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0KLQkJLy8gZm9yIG5vdywgd2UnbGwgbWFzayB0eXBlIHRvICJwdWJsaWMiIG9uZXMgdGhpcyBlYXN5Ci0JCS8vIHdheSAuLi4gYnV0IEkga25vdyB0aGVyZSBtdXN0IGJlIGEgYmV0dGVyIHdheQotCQlyZXR1cm4gZlR5cGUgJiBNQVNLOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSAiTW9kZWxMaWZlY3ljbGVFdmVudDogIiArIGRlYnVnU3RyaW5nKGZUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9Nb2RlbE1hbmFnZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL01vZGVsTWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlhOTZlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL01vZGVsTWFuYWdlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICogICAgIEZyYW5rIFppZ2xlci9XZWIgUGVyZm9ybWFuY2UsIEluYy4gLSAyODgxOTYgLSBEZWFkbG9jayBpbiBNb2RlbE1hbmFnZXJJbXBsIGFmdGVyIElPRXhjZXB0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuRmlsZUJ1ZmZlck1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5OdWxsTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZFN0cmVhbUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db250ZW50QmFzZWRQcmVmZXJlbmNlR2F0ZXdheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnMuTWFsZm9ybWVkT3V0cHV0RXhjZXB0aW9uV2l0aERldGFpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUFscmVhZHlFeGlzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Qcm9qZWN0UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotCi0vKioKLSAqIDxwPk5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLCByZWZlcmVuY2VkIG9yIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgotICogQ2xpZW50cyBzaG91bGQgb2J0YWluIGFuIGluc3RhbmNlIG9mIHRoZSBJTW9kZWxNYW5hZ2VyIGludGVyZmFjZSB0aHJvdWdoCi0gKiB7QGxpbmsgU3RydWN0dXJlZE1vZGVsTWFuYWdlciNnZXRNb2RlbE1hbmFnZXIoKX0uPC9wPgotICogCi0gKiA8cD5UaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZywgcmV0cmlldmluZywgYW5kIGNhY2hpbmcKLSAqIFN0cnVjdHVyZWRNb2RlbHMgSXQgcmV0cmlldmVzIHRoZSBjYWNoZWQgb2JqZWN0cyBieSBhbiBpZCB3aGljaCBpcwotICogdHlwaWNhbGx5IGEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcmVzb3VyY2VzIFVSSS4gTm90ZTogSXRzIGltcG9ydGFudCB0aGF0Ci0gKiBhbGwgY2xpZW50cyB0aGF0IHNoYXJlIGEgcmVzb3VyY2UgZG8gc28gdXNpbmcgPGI+aWRlbnRpY2FsIDwvYj4KLSAqIGlkZW50aWZpZXJzLCBvciBlbHNlIGRpZmZlcmVudCBpbnN0YW5jZXMgd2lsbCBiZSBjcmVhdGVkIGFuZCByZXRyaWV2ZWQsCi0gKiBldmVuIGlmIHRoZXkgYWxsIHRlY2huaWNhbGx5IHBvaW50IHRvIHRoZSBzYW1lIHJlc291cmNlIG9uIHRoZSBmaWxlIHN5c3RlbS4KLSAqIFRoaXMgY2xhc3MgYWxzbyBwcm92aWRlcyBhIGNvbnZlbmllbnQgcGxhY2UgdG8gcmVnaXN0ZXIgTW9kZWwgTG9hZGVycyBhbmQKLSAqIER1bXBlcnMgYmFzZWQgb24gJ3R5cGUnLjwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1vZGVsTWFuYWdlckltcGwgaW1wbGVtZW50cyBJTW9kZWxNYW5hZ2VyIHsKLQotCQotCQotCXN0YXRpYyBjbGFzcyBSZWFkRWRpdFR5cGUgewotCQlSZWFkRWRpdFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJfQotCX0KLQotCWNsYXNzIFNoYXJlZE9iamVjdCB7Ci0JCWludCByZWZlcmVuY2VDb3VudEZvckVkaXQ7Ci0JCWludCByZWZlcmVuY2VDb3VudEZvclJlYWQ7Ci0JCXZvbGF0aWxlIElTdHJ1Y3R1cmVkTW9kZWwgdGhlU2hhcmVkTW9kZWw7Ci0JCWZpbmFsIElMb2NrIExPQURfTE9DSyA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkubmV3TG9jaygpOwotCQl2b2xhdGlsZSBib29sZWFuIGluaXRpYWxpemluZyA9IHRydWU7Ci0JCXZvbGF0aWxlIGJvb2xlYW4gZG9XYWl0ID0gdHJ1ZTsKLQkJLy8gVGhlIGZpZWxkICdpZCcgaXMgb25seSBtZWFudCBmb3IgZGVidWcKLQkJZmluYWwgU3RyaW5nIGlkOwotCi0JCVNoYXJlZE9iamVjdChTdHJpbmcgaWQpIHsKLQkJCXRoaXMuaWQ9aWQ7Ci0JCQkvLyBiZSBhd2FyZSwgdGhpcyBsb2NrIHdpbGwgbGVhayBhbmQgY2F1c2UgdGhlIGRlYWRsb2NrIGRldGVjdG9yIHRvIGJlIGhvcnJpYmxlIGlmIHdlIG5ldmVyIHJlbGVhc2UgaXQKLQkJCUxPQURfTE9DSy5hY3F1aXJlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogV2FpdHMgdW50aWwgdGhpcyBzaGFyZWQgb2JqZWN0IGhhcyBiZWVuIGF0dGVtcHRlZCB0byBiZSBsb2FkZWQuIFRoZQotCQkgKiBsb2FkIGlzICJhdHRlbXB0ZWQiIGJlY2F1c2Ugbm90IGFsbCBsb2FkcyByZXN1bHQgaW4gYSBtb2RlbC4gSG93ZXZlciwKLQkJICogdXBvbiBsZWF2aW5nIHRoaXMgbWV0aG9kLCB0aGVTaGFyZU1vZGVsIHZhcmlhYmxlIGlzIHVwLXRvLWRhdGUuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3YWl0Rm9yTG9hZEF0dGVtcHQoKSB7Ci0JCQlmaW5hbCBib29sZWFuIGFsbG93SW50ZXJydXB0ID0gUHJlZlV0aWwuQUxMT1dfSU5URVJSVVBUX1dBSVRJTkdfVEhSRUFEOwotCQkJZmluYWwgbG9uZyB0aW1lTGltaXQgPSAoUHJlZlV0aWwuV0FJVF9ERUxBWT09MCkgPyBMb25nLk1BWF9WQUxVRSA6IFByZWZVdGlsLm5vdygpICsgUHJlZlV0aWwuV0FJVF9ERUxBWTsKLQkJCWZpbmFsIEpvYiBjdXJyZW50ID0gSm9iLmdldEpvYk1hbmFnZXIoKS5jdXJyZW50Sm9iKCk7Ci0JCQlib29sZWFuIGludGVycnVwdGVkID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCXdoaWxlIChpbml0aWFsaXppbmcpIHsKLQkJCQkJaWYgKGN1cnJlbnQhPW51bGwpIHsKLQkJCQkJCWN1cnJlbnQueWllbGRSdWxlKG51bGwpOwotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsb29wKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWlmIChhbGxvd0ludGVycnVwdCkgewotCQkJCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigiV2FpdGluZyB0aHJlYWQgaW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3IgbW9kZWwgaWQ6ICIraWQgKyAiIHRvIGxvYWQiKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaW50ZXJydXB0ZWQ9dHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoUHJlZlV0aWwubm93KCkgPj0gdGltZUxpbWl0CSkKLQkJCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigiV2FpdGluZyB0aHJlYWQgdGltZW91dCBleGNlZWRlZCB3aGlsZSB3YWl0aW5nIGZvciBtb2RlbCBpZDogIitpZCArICIgdG8gbG9hZCIpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChpbnRlcnJ1cHRlZCkgewotCQkJCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBsb29wKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsJCi0JCQlpZiAoaW5pdGlhbGl6aW5nKSB7Ci0JCQkJaWYgKExPQURfTE9DSy5hY3F1aXJlKFByZWZVdGlsLldBSVRfSU5URVJWQUxfTVMpKSB7Ci0JCQkJCS8vIGlmIHdlIGdvdCB0aGUgbG9jaywgYnV0IGluaXRpYWxpemluZyBpcyBzdGlsbCBub3QgdHJ1ZSB0aGUgZGVhZGxvY2sgZGV0ZWN0b3IgZ2F2ZSB1cwotCQkJCQkvLyB0aGUgbG9jayBhbmQgY2F1c2VkIHJlZW50cmFuY3kgaW50byB0aGlzIGNyaXRpY2FsIHNlY3Rpb24uIFRoaXMgaXMgaW52YWxpZCBhbmQgdGhlIAotCQkJCQkvLyBzaWduIG9mIGEgY3ljbGljYWwgbG9hZCBhdHRlbXB0LiBJbiB0aGlzIGNhc2UsIHdlIHRocm91Z2ggYW4gCi0JCQkJCS8vIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGluIGxldyBvZiBlbnRlcmluZyBhIHNwaW4tbG9vcC4gCi0JCQkJCWlmIChpbml0aWFsaXppbmcpIHsKLQkJCQkJCUxPQURfTE9DSy5yZWxlYXNlKCk7Ci0JCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oIkFib3J0ZWQgY3ljbGljIGxvYWQgYXR0ZW1wdCBmb3IgbW9kZWwgd2l0aCBpZDogIisgaWQgKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUxPQURfTE9DSy5yZWxlYXNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogRmxhZ3MgdGhpcyBtb2RlbCBhcyBsb2FkZWQuIEFsbCB3YWl0aW5nIG1ldGhvZHMgb24KLQkJICoge0BsaW5rICN3YWl0Rm9yTG9hZEF0dGVtcHQoKX0gd2lsbCBwcm9jZWVkIGFmdGVyIHRoaXMgbWV0aG9kIHJldHVybnMuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRMb2FkZWQoKSB7Ci0JCQlpbml0aWFsaXppbmcgPSBmYWxzZTsKLQkJCUxPQURfTE9DSy5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEV4Y2VwdGlvbiBkZWJ1Z0V4Y2VwdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBPdXIgc2luZ2xldG9uIGluc3RhbmNlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTW9kZWxNYW5hZ2VySW1wbCBpbnN0YW5jZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgUkVBRF9CVUZGRVJfU0laRSA9IDQwOTY7Ci0KLQkvKioKLQkgKiBOb3QgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMsIHdpbGwgYmUgbWFkZSByZXN0cmljdGVkIGFjY2Vzcy4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSU1vZGVsTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgTW9kZWxNYW5hZ2VySW1wbCgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBPdXIgY2FjaGUgb2YgbWFuYWdlZCBvYmplY3RzCi0JICovCi0JcHJpdmF0ZSBNYXAgZk1hbmFnZWRPYmplY3RzOwotCi0JcHJpdmF0ZSBNb2RlbEhhbmRsZXJSZWdpc3RyeSBmTW9kZWxIYW5kbGVyUmVnaXN0cnk7Ci0JcHJpdmF0ZSBmaW5hbCBSZWFkRWRpdFR5cGUgUkVBRCA9IG5ldyBSZWFkRWRpdFR5cGUoInJlYWQiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgUmVhZEVkaXRUeXBlIEVESVQgPSBuZXcgUmVhZEVkaXRUeXBlKCJlZGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIGZpbmFsIElMb2NrIFNZTkMgPSBKb2IuZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKLQkvKioKLQkgKiBJbnRlbnRpb25hbGx5IGRlZmF1bHQgYWNjZXNzIG9ubHkuCi0JICogCi0JICovCi0JTW9kZWxNYW5hZ2VySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJZk1hbmFnZWRPYmplY3RzID0gbmV3IEhhc2hNYXAoKTsKLQkJLy8gVG8gcHJldmVudCBkZWFkbG9ja3M6ICBhbHdheXMgYWNxdWlyZSBtdWx0aXBsZSBsb2NrcyBpbiB0aGlzIG9yZGVyOiBTWU5DLCBzaGFyZWRPYmplY3QuIAotCQkvLyBETyBOT1QgYWNxdWlyZSBhIFNZTkMgd2l0aGluIGEgc2hhcmVkT2JqZWN0IGxvY2ssIHVubGVzcyB5b3UgYWxyZWFkeSBvd24gdGhlIFNZTkMgbG9jawotCQkvLyBUaXA6IFRyeSB0byBob2xkIHRoZSBzbWFsbGVzdCBudW1iZXIgb2YgbG9ja3MgeW91IGNhbgotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBfY29tbW9uQ3JlYXRlTW9kZWwoSUZpbGUgZmlsZSwgU3RyaW5nIGlkLCBJTW9kZWxIYW5kbGVyIGhhbmRsZXIsIFVSSVJlc29sdmVyIHJlc29sdmVyLCBSZWFkRWRpdFR5cGUgcndUeXBlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sQ29yZUV4Y2VwdGlvbiB7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSBudWxsOwotCQkKLQkJU1lOQy5hY3F1aXJlKCk7Ci0JCXNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlTWU5DLnJlbGVhc2UoKTsKLQkJCi0JCXdoaWxlKHRydWUpIHsKLQkJCWlmIChzaGFyZWRPYmplY3QhPW51bGwpIHsKLQkJCQlzaGFyZWRPYmplY3Qud2FpdEZvckxvYWRBdHRlbXB0KCk7Ci0JCQl9Ci0JCQlTWU5DLmFjcXVpcmUoKTsKLQkJCS8vIHdlIGtub3cgdGhpcyBvYmplY3QncyBtb2RlbCBoYXMgcGFzc2VkIHRoZSBsb2FkLCBob3dldmVyLCB3ZSBkb24ndCBrbm93IAotCQkJLy8gaXQncyByZWZlcmVuY2UgY291bnQgc3RhdHVzLiBJdCBtaWdodCBoYXZlIGFscmVhZHkgYmVlbiBkaXNwb3NlZC4gT3IgaXQgY291bGQgaGF2ZSAKLQkJCS8vIGJlZW4gZGlzcG9zZWQgYW5kIGEgY29uY3VycmVudCB0aHJlYWQgaGFzIGFscmVhZHkgYmVndW4gbG9hZGluZyBpdCwgaW4gd2hpY2ggY2FzZQotCQkJLy8gd2Ugc2hvdWxkIHVzZSB0aGUgc2hhcmVkb2JqZWN0IHRoZXkgYXJlIGxvYWRpbmcuIAotCQkJLy8gTk9URTogVGhpcyBwYXR0ZXJuIGlzIGFwcGxpZWQgMyB0aW1lcyBpbiB0aGlzIGNsYXNzLCBidXQgb25seSBkb2MnZCBvbmNlLiBUaGUgbG9naWMgaXMgCi0JCQkvLyBleGFjdGx5IHRoZSBzYW1lLiAKLQkJCVNoYXJlZE9iamVjdCB0ZXN0T2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCQlpZiAodGVzdE9iamVjdD09bnVsbCkgewotCQkJCS8vIG51bGwgbWVhbnMgaXQncyBiZWVuIGRpc3Bvc2VkLCB3ZSBuZWVkIHRvIGRvIHRoZSB3b3JrIHRvIHJlbG9hZCBpdC4KLQkJCQlzaGFyZWRPYmplY3QgPSBuZXcgU2hhcmVkT2JqZWN0KGlkKTsKLQkJCQlmTWFuYWdlZE9iamVjdHMucHV0KGlkLCBzaGFyZWRPYmplY3QpOwotCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJCV9kb0NvbW1vbkNyZWF0ZU1vZGVsKGZpbGUsIGlkLCBoYW5kbGVyLCByZXNvbHZlciwgcndUeXBlLCBlbmNvZGluZ1J1bGUsCi0JCQkJCQlzaGFyZWRPYmplY3QpOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChzaGFyZWRPYmplY3QgPT0gdGVzdE9iamVjdCkgewotCQkJCS8vIGlmIG5vdGhpbmcgaGFwcGVuZWQsIGp1c3QgaW5jcmVtZW50IHRoZSBjb3VsZCBhbmQgcmV0dXJuIHRoZSBzaGFyZWQgbW9kZWwKLQkJCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJCWlmIChzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwhPW51bGwpIHsKLQkJCQkJCV9pbmNyQ291bnQoc2hhcmVkT2JqZWN0LCByd1R5cGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBzaGFyZWRPYmplY3QgIT0gdGVzdE9iamVjdCB3aGljaCBtZWFucyB0aGUgb2JqZWN0IHdlIHdlcmUgd2FpdGluZyBvbiBoYXMgYmVlbiBkaXNwb3NlZAotCQkJCS8vIGEgcmVwbGFjZW1lbnQgaGFzIGFscmVhZHkgYmVlbiBwbGFjZWQgaW4gdGhlIG1hbmFnZWRPYmplY3RzIHRhYmxlLiBUaHJvdWdoIGF3YXkgb3VyCi0JCQkJLy8gc3RhbGUgc2hhcmVkT2JqZWN0IGFuZCBjb250aW51ZSBvbiB3aXRoIHRoZSBvbmUgd2UgZ290IGZyb20gdGhlIHF1ZXVlLiBOb3RlOiBXZSBkb24ndCBrbm93IGl0cwotCQkJCS8vIHN0YXRlLCBzbyBjb250aW51ZSB0aGUgd2FpdEZvckxvYWQtY2hlY2sgbG9vcC4gCi0JCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkJc2hhcmVkT2JqZWN0ID0gdGVzdE9iamVjdDsKLQkJCX0KLQkJfQotCQkKLQkJLy8gd2UgZXhwZWN0IHRvIGFsd2F5cyByZXR1cm4gc29tZXRoaW5nCi0JCWlmIChzaGFyZWRPYmplY3QgPT0gbnVsbCkgewotCQkJZGVidWdFeGNlcHRpb24gPSBuZXcgRXhjZXB0aW9uKCJpbnN0YW5jZSBvbmx5IGZvciBzdGFjayB0cmFjZSIpOyAvLyROT04tTkxTLTEkCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJQcm9ncmFtIEVycm9yOiBubyBtb2RlbCByZWNvcmRlZCBmb3IgaWQgIiArIGlkLCBkZWJ1Z0V4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJLy8gbm90ZTogY2xpZW50cyBtdXN0IGNhbGwgcmVsZWFzZSBmb3IgZWFjaCB0aW1lIHRoZXkgY2FsbCBnZXQuCi0JCXJldHVybiBzaGFyZWRPYmplY3Q9PW51bGwgPyBudWxsIDogc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBfZGVjckNvdW50KFNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QsIFJlYWRFZGl0VHlwZSB0eXBlKSB7Ci0JCWlmICh0eXBlID09IFJFQUQpIHsKLQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQtLTsKLQkJCUZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5kaXNjb25uZWN0KHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBFRElUKSB7Ci0JCQlzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0LS07Ci0JCQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZGlzY29ubmVjdChzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQl9Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2RvQ29tbW9uQ3JlYXRlTW9kZWwoSUZpbGUgZmlsZSwgU3RyaW5nIGlkLCBJTW9kZWxIYW5kbGVyIGhhbmRsZXIsCi0JCQlVUklSZXNvbHZlciByZXNvbHZlciwgUmVhZEVkaXRUeXBlIHJ3VHlwZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSwKLQkJCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFhYWDogRG9lcyBub3QgaW50ZWdyYXRlIHdpdGggRmlsZUJ1ZmZlcnMKLQkJYm9vbGVhbiBkb1JlbW92ZSA9IHRydWU7Ci0JCXRyeSB7Ci0JCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IF9jb21tb25DcmVhdGVNb2RlbChpZCwgaGFuZGxlciwgcmVzb2x2ZXIpOwotCQkJCUlNb2RlbExvYWRlciBsb2FkZXIgPSBoYW5kbGVyLmdldE1vZGVsTG9hZGVyKCk7Ci0JCQkJaW5wdXRTdHJlYW0gPSBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShmaWxlLmdldENvbnRlbnRzKHRydWUpKTsKLQkJCQlsb2FkZXIubG9hZChVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSksIG1vZGVsLCBlbmNvZGluZ1J1bGUpOwotCQkJfQotCQkJY2F0Y2ggKFJlc291cmNlSW5Vc2UgZSkgewotCQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlJ3ZlIGFscmVhZHkgZm91bmQKLQkJCQloYW5kbGVQcm9ncmFtRXJyb3IoZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChpbnB1dFN0cmVhbSE9bnVsbCkgewotCQkJCQl0cnkgeyAKLQkJCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkvLyBhZGQgdG8gb3VyIGNhY2hlCi0JCQkJc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsPW1vZGVsOwotCQkJCV9pbml0Q291bnQoc2hhcmVkT2JqZWN0LCByd1R5cGUpOwotCQkJCWRvUmVtb3ZlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJfQotCQlmaW5hbGx5ewotCQlpZiAoZG9SZW1vdmUpIHsKLQkJCVNZTkMuYWNxdWlyZSgpOwkKLQkJCWZNYW5hZ2VkT2JqZWN0cy5yZW1vdmUoaWQpOwkKLQkJCVNZTkMucmVsZWFzZSgpOwotCQl9Ci0JCXNoYXJlZE9iamVjdC5zZXRMb2FkZWQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBfY29tbW9uQ3JlYXRlTW9kZWwoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBpZCwgSU1vZGVsSGFuZGxlciBoYW5kbGVyLCBVUklSZXNvbHZlciByZXNvbHZlciwgUmVhZEVkaXRUeXBlIHJ3VHlwZSwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCi0JCWlmIChpZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9ncmFtIEVycm9yOiBpZCBtYXkgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSBudWxsOwotCQotCQlTWU5DLmFjcXVpcmUoKTsKLQkJc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCVNZTkMucmVsZWFzZSgpOwotCQkKLQkJd2hpbGUodHJ1ZSkgewotCQkJaWYgKHNoYXJlZE9iamVjdCE9bnVsbCkgewotCQkJCXNoYXJlZE9iamVjdC53YWl0Rm9yTG9hZEF0dGVtcHQoKTsKLQkJCX0KLQkJCVNZTkMuYWNxdWlyZSgpOwotCQkJU2hhcmVkT2JqZWN0IHRlc3RPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJCWlmICh0ZXN0T2JqZWN0PT1udWxsKSB7Ci0JCQkJLy8gaXQgd2FzIHJlbW92ZWQgLHNvIGxldHMgY3JlYXRlIGl0Ci0JCQkJc2hhcmVkT2JqZWN0ID0gbmV3IFNoYXJlZE9iamVjdChpZCk7Ci0JCQkJZk1hbmFnZWRPYmplY3RzLnB1dChpZCwgc2hhcmVkT2JqZWN0KTsKLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQlfZG9Db21tb25DcmVhdGVNb2RlbChpbnB1dFN0cmVhbSwgaWQsIGhhbmRsZXIsIHJlc29sdmVyLCByd1R5cGUsCi0JCQkJCQllbmNvZGluZywgbGluZURlbGltaXRlciwgc2hhcmVkT2JqZWN0KTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoc2hhcmVkT2JqZWN0ID09IHRlc3RPYmplY3QpIHsKLQkJCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJCWlmIChzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwhPW51bGwpIHsKLQkJCQkJCV9pbmNyQ291bnQoc2hhcmVkT2JqZWN0LCByd1R5cGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQlzaGFyZWRPYmplY3QgPSB0ZXN0T2JqZWN0OwotCQkJfQotCQl9Ci0JCQotCQkvLyB3ZSBleHBlY3QgdG8gYWx3YXlzIHJldHVybiBzb21ldGhpbmcKLQkJQXNzZXJ0LmlzTm90TnVsbChzaGFyZWRPYmplY3QsICJQcm9ncmFtIEVycm9yOiBubyBtb2RlbCByZWNvcmRlZCBmb3IgaWQgIiArIGlkKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBub3RlOiBjbGllbnRzIG11c3QgY2FsbCByZWxlYXNlIGZvciBlYWNoIHRpbWUgdGhleSBjYWxsIGdldC4KLQkJcmV0dXJuIHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2RvQ29tbW9uQ3JlYXRlTW9kZWwoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBpZCwgSU1vZGVsSGFuZGxlciBoYW5kbGVyLAotCQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIsIFJlYWRFZGl0VHlwZSByd1R5cGUsIFN0cmluZyBlbmNvZGluZywgU3RyaW5nIGxpbmVEZWxpbWl0ZXIsCi0JCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlib29sZWFuIGRvUmVtb3ZlID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gX2NvbW1vbkNyZWF0ZU1vZGVsKGlkLCBoYW5kbGVyLCByZXNvbHZlcik7Ci0JCQkJSU1vZGVsTG9hZGVyIGxvYWRlciA9IGhhbmRsZXIuZ2V0TW9kZWxMb2FkZXIoKTsKLQkJCQlpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAibW9kZWwgd2FzIHJlcXVlc3RlZCBmb3IgaWQgIiArIGlkICsgIiB3aXRob3V0IGEgY29udGVudCBJbnB1dFN0cmVhbSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJbG9hZGVyLmxvYWQoaWQsIFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKSwgbW9kZWwsIGVuY29kaW5nLCBsaW5lRGVsaW1pdGVyKTsKLQkJCX0KLQkJCWNhdGNoIChSZXNvdXJjZUluVXNlIGUpIHsKLQkJCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSd2ZSBhbHJlYWR5IGZvdW5kCi0JCQkJaGFuZGxlUHJvZ3JhbUVycm9yKGUpOwotCQkJfQotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkvKioKLQkJCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY0MjI4Ci0JCQkJICogCi0JCQkJICogRW5zdXJlIHRoYXQgdGhlIGNvbnRlbnQgdHlwZSBpZGVudGlmaWVyIGZpZWxkIG9mIHRoZSBtb2RlbAotCQkJCSAqIGlzIHByb3Blcmx5IHNldC4gVGhpcyBpcyBub3JtYWxseSBoYW5kbGVkIGJ5IHRoZQotCQkJCSAqIEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgd2hlbiB3b3JraW5nIHdpdGggZmlsZXMgYXMgaXQga25vd3MKLQkJCQkgKiB0aGUgY29udGVudCB0eXBlIGluIGFkdmFuY2U7IGhlcmUgaXMgd2hlcmUgd2UgaGFuZGxlIGl0IGZvcgotCQkJCSAqIHN0cmVhbXMuCi0JCQkJICovCi0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCQkJRG9jdW1lbnRSZWFkZXIgcmVhZGVyID0gbmV3IERvY3VtZW50UmVhZGVyKG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldERlc2NyaXB0aW9uRm9yKHJlYWRlciwgaWQsIG5ldyBRdWFsaWZpZWROYW1lWzBdKTsKLQkJCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsICYmIGRlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCkgIT0gbnVsbCkgewotCQkJCQkJKChBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgbW9kZWwpLnNldENvbnRlbnRUeXBlSWRlbnRpZmllcihkZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpLmdldElkKCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsID0gbW9kZWw7Ci0JCQkJX2luaXRDb3VudChzaGFyZWRPYmplY3QsIHJ3VHlwZSk7Ci0JCQkJZG9SZW1vdmUgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQlpZiAoZG9SZW1vdmUpIHsKLQkJCVNZTkMuYWNxdWlyZSgpOwotCQkJLy8gcmVtb3ZlIGl0IGlmIHdlIGRpZG4ndCBnZXQgb25lIGJhY2sKLQkJCWZNYW5hZ2VkT2JqZWN0cy5yZW1vdmUoaWQpOwotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCX0KLQkJc2hhcmVkT2JqZWN0LnNldExvYWRlZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIF9jb21tb25DcmVhdGVNb2RlbChTdHJpbmcgaWQsIElNb2RlbEhhbmRsZXIgaGFuZGxlciwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBSZXNvdXJjZUluVXNlIHsKLQotCQlJTW9kZWxMb2FkZXIgbG9hZGVyID0gaGFuZGxlci5nZXRNb2RlbExvYWRlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IGxvYWRlci5jcmVhdGVNb2RlbCgpOwotCQkvLyBpbiB0aGUgcGFzdCwgaWQgd2FzIG51bGwgZm9yICJ1bm1hbmFnZWQiIGNhc2UsIHNvIHdlIHdvbid0Ci0JCS8vIHRyeSBhbmQgc2V0IGl0Ci0JCWlmIChpZCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0SWQoaWQpOwotCQl9Ci0JCXJlc3VsdC5zZXRNb2RlbEhhbmRsZXIoaGFuZGxlcik7Ci0JCXJlc3VsdC5zZXRSZXNvbHZlcihyZXNvbHZlcik7Ci0JCS8vIHNvbWUgb2J2aW91cyByZWR1bmFuY3kgaGVyZSB0aGF0IG1heWJlIGNvdWxkIGJlIGltcHJvdmVkCi0JCS8vIGluIGZ1dHVyZSwgYnV0IGlzIG5lY2Vzc2FyeSBmb3Igbm93Ci0JCXJlc3VsdC5zZXRCYXNlTG9jYXRpb24oaWQpOwotCQlpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotCQkJcmVzb2x2ZXIuc2V0RmlsZUJhc2VMb2NhdGlvbihpZCk7Ci0JCX0KLQkJYWRkRmFjdG9yaWVzKHJlc3VsdCwgaGFuZGxlcik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIF9jb21tb25HZXRNb2RlbChJRmlsZSBpRmlsZSwgUmVhZEVkaXRUeXBlIHJ3VHlwZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0KLQkJaWYgKGlGaWxlICE9IG51bGwgJiYgaUZpbGUuZXhpc3RzKCkpIHsKLQkJCVN0cmluZyBpZCA9IGNhbGN1bGF0ZUlkKGlGaWxlKTsKLQkJCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaUZpbGUpOwotCQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBjYWxjdWxhdGVVUklSZXNvbHZlcihpRmlsZSk7Ci0JCQltb2RlbCA9IF9jb21tb25DcmVhdGVNb2RlbChpRmlsZSwgaWQsIGhhbmRsZXIsIHJlc29sdmVyLCByd1R5cGUsIGVuY29kaW5nUnVsZSk7Ci0JCX0KLQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIF9jb21tb25HZXRNb2RlbChJRmlsZSBpRmlsZSwgUmVhZEVkaXRUeXBlIHJ3VHlwZSwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gX2NvbW1vbkdldE1vZGVsKGlGaWxlLCBpZCwgcndUeXBlLCBlbmNvZGluZywgbGluZURlbGltaXRlcik7Ci0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBfY29tbW9uR2V0TW9kZWwoSUZpbGUgZmlsZSwgU3RyaW5nIGlkLCBSZWFkRWRpdFR5cGUgcndUeXBlLCBTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb2dyYW0gRXJyb3I6IGlkIG1heSBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0KLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IG51bGw7Ci0JCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQlzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJCi0JCQl3aGlsZSh0cnVlKSB7Ci0JCQkJaWYgKHNoYXJlZE9iamVjdCE9bnVsbCkgewotCQkJCQlzaGFyZWRPYmplY3Qud2FpdEZvckxvYWRBdHRlbXB0KCk7Ci0JCQkJfQotCQkJCVNZTkMuYWNxdWlyZSgpOwotCQkJCVNoYXJlZE9iamVjdCB0ZXN0T2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCQkJaWYgKHRlc3RPYmplY3Q9PW51bGwpIHsKLQkJCQkJLy8gaXQgd2FzIHJlbW92ZWQgLHNvIGxldHMgY3JlYXRlIGl0Ci0JCQkJCXNoYXJlZE9iamVjdCA9IG5ldyBTaGFyZWRPYmplY3QoaWQpOwotCQkJCQlmTWFuYWdlZE9iamVjdHMucHV0KGlkLCBzaGFyZWRPYmplY3QpOwotCQkJCQkKLQkJCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkJCV9kb0NvbW1vbkdldE1vZGVsKGZpbGUsIGlkLCBzaGFyZWRPYmplY3QscndUeXBlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIGlmIChzaGFyZWRPYmplY3QgPT0gdGVzdE9iamVjdCkgewotCQkJCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJCQlpZiAoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsIT1udWxsKSB7Ci0JCQkJCQkJX2luY3JDb3VudChzaGFyZWRPYmplY3QsIHJ3VHlwZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHdlIGdvdCBhIGRpZmZlcmVudCBvYmplY3QgdGhhbiB3aGF0IHdlIHdlcmUgZXhwZWN0aW5nCi0JCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJCQkvLyB0d28gdGhyZWFkcyB3ZXJlIGludGVyZXN0ZWQgaW4gbW9kZWxzIGZvciB0aGUgc2FtZSBpZC4gCi0JCQkJCS8vIFRoZSBvdGhlciB0aHJlYWQgb25lLCBzbyBsZXRzIGJhY2sgb2ZmIGFuZCB0cnkgYWdhaW4uIAotCQkJCQlzaGFyZWRPYmplY3QgPSB0ZXN0T2JqZWN0OyAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGlmIHdlIGRvbid0IGtub3cgaG93IHRvIGNyZWF0ZSBhIG1vZGVsCi0JCS8vIGZvciB0aGlzIHR5cGUgb2YgZmlsZSwgcmV0dXJuIG51bGwKLQkKLQkJLy8gbm90ZTogY2xpZW50cyBtdXN0IGNhbGwgcmVsZWFzZSBmb3IgZWFjaCB0aW1lIHRoZXkgY2FsbAotCQkvLyBnZXQuCi0JCQkKLQkJcmV0dXJuIHNoYXJlZE9iamVjdD09bnVsbCA/IG51bGwgOiBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9kb0NvbW1vbkdldE1vZGVsKElGaWxlIGZpbGUsIFN0cmluZyBpZCwgU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCxSZWFkRWRpdFR5cGUgcndUeXBlKSB7Ci0JCWJvb2xlYW4gZG9SZW1vdmUgPSB0cnVlOwotCQl0cnkgewotCQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJCXNoYXJlZE9iamVjdC5kb1dhaXQ9ZmFsc2U7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9kZWwgPSBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoZmlsZSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlzaGFyZWRPYmplY3QuZG9XYWl0PXRydWU7Ci0JCQkJfQotCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbD1tb2RlbDsKLQkJCQkJX2luaXRDb3VudChzaGFyZWRPYmplY3QsIHJ3VHlwZSk7Ci0JCQkJCWRvUmVtb3ZlID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGRvUmVtb3ZlKSB7Ci0JCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQkJZk1hbmFnZWRPYmplY3RzLnJlbW92ZShpZCk7Ci0JCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQl9Ci0JCQlzaGFyZWRPYmplY3Quc2V0TG9hZGVkKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNoYXJlZE9iamVjdCBfY29tbW9uTmV3TW9kZWwoSUZpbGUgaUZpbGUsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMsIFJlc291cmNlSW5Vc2UsIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBhU2hhcmVkTW9kZWwgPSBudWxsOwotCQkvLyBGaXJzdCwgY2hlY2sgaWYgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgb24gZmlsZSBzeXN0ZW0uCi0JCS8vIGlmIGlzIGRvZXMsIHRoZW4gdGhyb3cgUmVzb3VyY2UgaW4gVXNlIGlmZiBmb3JjZT09ZmFsc2UKLQotCQlpZiAoaUZpbGUuZXhpc3RzKCkgJiYgIWZvcmNlKSB7Ci0JCQl0aHJvdyBuZXcgUmVzb3VyY2VBbHJlYWR5RXhpc3RzKCk7Ci0JCX0KLQkJCi0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSBudWxsOwotCQlTdHJpbmcgaWQgPSBjYWxjdWxhdGVJZChpRmlsZSk7Ci0JCXRyeSB7Ci0JCQlTWU5DLmFjcXVpcmUoKTsKLQkJCi0JCQkgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCi0JCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwgJiYgIWZvcmNlKSB7Ci0JCQkJLy8gaWYgaW4gY2FjaGUgYWxyZWFkeSwgYW5kIGZvcmNlIGlzIG5vdCB0cnVlLCB0aGVuIHRoaXMgaXMgYW4KLQkJCQkvLyBlcnJvcgotCQkJCS8vIGluIGNhbGwKLQkJCQl0aHJvdyBuZXcgUmVzb3VyY2VJblVzZSgpOwotCQkJfQotCQkJCi0JCQlzaGFyZWRPYmplY3QgPSBuZXcgU2hhcmVkT2JqZWN0KGlkKTsKLQkJCWZNYW5hZ2VkT2JqZWN0cy5wdXQoaWQsIHNoYXJlZE9iamVjdCk7Ci0JCQkKLQkJfSBmaW5hbGx5IHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQl9Ci0JCQotCQkvLyBpZiB3ZSBnZXQgdG8gaGVyZSB3aXRob3V0IGFib3ZlIGV4Y2VwdGlvbnMsIHRoZW4gYWxsIGlzIG9rCi0JCS8vIHRvIGdldCBtb2RlbCBsaWtlIG5vcm1hbCwgYnV0IHNldCAnbmV3JyBhdHRyaWJ1dGUgKHdoZXJlIHRoZQotCQkvLyAnbmV3JyBhdHRyaWJ1dGUgbWVhbnMgdGhpcyBpcyBhIG1vZGVsIHdpdGhvdXQgYSBjb3JyZXNwb25kaW5nCi0JCS8vIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0JCWFTaGFyZWRNb2RlbCA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbChpRmlsZSk7Ci0JCWFTaGFyZWRNb2RlbC5zZXROZXdTdGF0ZSh0cnVlKTsKLQkJCi0JCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbD1hU2hhcmVkTW9kZWw7Ci0JCS8vIHdoZW4gcmVzb3VyY2UgaXMgcHJvdmlkZWQsIHdlIGNhbiBzZXQKLQkJLy8gc3luY2hyb25pemF0aW9uIHN0YW1wIC4uLiBvdGhlcndpc2UgY2xpZW50IHNob3VsZAotCQkvLyBOb3RlOiBvbmUgY2xpZW50IHdoaWNoIGRvZXMgdGhpcyBpcyBGaWxlTW9kZWxQcm92aWRlci4KLQkJYVNoYXJlZE1vZGVsLnJlc2V0U3luY2hyb25pemF0aW9uU3RhbXAoaUZpbGUpOwotCQlyZXR1cm4gc2hhcmVkT2JqZWN0OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIF9nZXRNb2RlbEZvcihJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBSZWFkRWRpdFR5cGUgYWNjZXNzVHlwZSkgewotCi0JCVN0cmluZyBpZCA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jYWxjdWxhdGVJZChkb2N1bWVudCk7Ci0JCWlmIChpZCA9PSBudWxsKSB7Ci0JCQlpZiAoUkVBRCA9PSBhY2Nlc3NUeXBlKQotCQkJCXJldHVybiBnZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAoRURJVCA9PSBhY2Nlc3NUeXBlKQotCQkJCXJldHVybiBnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAidW5rbm93biBJU3RydWN0dXJlZERvY3VtZW50ICIgKyBkb2N1bWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IG51bGw7Ci0JCVNZTkMuYWNxdWlyZSgpOwotCQlzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQotCQl3aGlsZSh0cnVlKSB7Ci0JCQlpZiAoc2hhcmVkT2JqZWN0IT1udWxsKSB7Ci0JCQkJc2hhcmVkT2JqZWN0LndhaXRGb3JMb2FkQXR0ZW1wdCgpOwotCQkJfQotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQlTaGFyZWRPYmplY3QgdGVzdE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQkJaWYgKHRlc3RPYmplY3Q9PW51bGwpIHsKLQkJCQlzaGFyZWRPYmplY3QgPSBuZXcgU2hhcmVkT2JqZWN0KGlkKTsKLQkJCQlmTWFuYWdlZE9iamVjdHMucHV0KGlkLCBzaGFyZWRPYmplY3QpOwotCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCQkJc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKGRvY3VtZW50KTsKLQkJCQkJX2luaXRDb3VudChzaGFyZWRPYmplY3QsIGFjY2Vzc1R5cGUpOwotCQkJCQlzaGFyZWRPYmplY3Quc2V0TG9hZGVkKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChzaGFyZWRPYmplY3QgPT0gdGVzdE9iamVjdCkgewotCQkJCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCQkJQXNzZXJ0LmlzVHJ1ZShzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0ICsgc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCA+IDAsICJyZWZlcmVuY2UgY291bnQgd2FzIGxlc3MgdGhhbiB6ZXJvIik7Ci0JCQkJCWlmIChzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwhPW51bGwpIHsKLQkJCQkJCV9pbmNyQ291bnQoc2hhcmVkT2JqZWN0LCBhY2Nlc3NUeXBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkJc2hhcmVkT2JqZWN0ID0gdGVzdE9iamVjdDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHNoYXJlZE9iamVjdD09bnVsbCA/IG51bGwgOiBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9pbmNyQ291bnQoU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCwgUmVhZEVkaXRUeXBlIHR5cGUpIHsKLQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJaWYgKHR5cGUgPT0gUkVBRCkgewotCQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQrKzsKLQkJCQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY29ubmVjdChzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBFRElUKSB7Ci0JCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCsrOwotCQkJCUZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jb25uZWN0KHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9pbml0Q291bnQoU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCwgUmVhZEVkaXRUeXBlIHR5cGUpIHsKLQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJaWYgKHR5cGUgPT0gUkVBRCkgewotCQkJCUZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jb25uZWN0KHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCA9IDE7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IEVESVQpIHsKLQkJCQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY29ubmVjdChzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQgPSAxOwotCQkJfQotCQkJZWxzZQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgSU1vZGVsSGFuZGxlciBoYW5kbGVyKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobW9kZWwsICJtb2RlbCBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSBtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChyZWdpc3RyeSwgIm1vZGVsJ3MgRmFjdG9yeSBSZWdpc3RyeSBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGZhY3RvcnlMaXN0ID0gaGFuZGxlci5nZXRBZGFwdGVyRmFjdG9yaWVzKCk7Ci0JCWFkZEZhY3Rvcmllcyhtb2RlbCwgZmFjdG9yeUxpc3QpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgTGlzdCBmYWN0b3J5TGlzdCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG1vZGVsLCAibW9kZWwgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwocmVnaXN0cnksICJtb2RlbCdzIEZhY3RvcnkgUmVnaXN0cnkgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gTm90ZTogd2UgYWRkIGFsbCBvZiB0aGVtIGZyb20gaGFuZGxlciwgZXZlbiBpZgotCQkvLyBhbHJlYWR5IGV4aXN0cy4gTWF5IG5lZWQgdG8gcmVjb25zaWRlciB0aGlzLgotCQlpZiAoZmFjdG9yeUxpc3QgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmYWN0b3J5TGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJcmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIGlkIHByb3ZpZGVzIGEgY29tbW9uIHdheSB0byBkZXRlcm1pbmUgdGhlIGlkIGZyb20gdGhlIGlucHV0Ci0JICogLi4uIG5lZWRlZCB0byBnZXQgYW5kIHNhdmUgdGhlIG1vZGVsLiBJdCBpcyBhIHNpbXBsZSBjbGFzcyB1dGlsaXR5LCBidXQKLQkgKiBpcyBhbiBpbnN0YW5jZSBtZXRob2Qgc28gY2FuIGJlIGFjY2Vzc2VkIHZpYSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBjYWxjdWxhdGVJZChJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY2FsY3VsYXRlSWQoZmlsZSk7Ci0JfQotCi0JcHJpdmF0ZSBJTW9kZWxIYW5kbGVyIGNhbGN1bGF0ZVR5cGUoSUZpbGUgaUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gSU1vZGVsTWFuYWdlciBtbSA9ICgoTW9kZWxNYW5hZ2VyUGx1Z2luKQotCQkvLyBQbGF0Zm9ybS5nZXRQbHVnaW4oTW9kZWxNYW5hZ2VyUGx1Z2luLklEKSkuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCU1vZGVsSGFuZGxlclJlZ2lzdHJ5IGNyID0gZ2V0TW9kZWxIYW5kbGVyUmVnaXN0cnkoKTsKLQkJSU1vZGVsSGFuZGxlciBjZCA9IGNyLmdldEhhbmRsZXJGb3IoaUZpbGUpOwotCQlyZXR1cm4gY2Q7Ci0JfQotCi0JcHJpdmF0ZSBJTW9kZWxIYW5kbGVyIGNhbGN1bGF0ZVR5cGUoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJTW9kZWxIYW5kbGVyUmVnaXN0cnkgY3IgPSBnZXRNb2RlbEhhbmRsZXJSZWdpc3RyeSgpOwotCQlJTW9kZWxIYW5kbGVyIGNkID0gY3IuZ2V0SGFuZGxlckZvcihmaWxlbmFtZSwgaW5wdXRTdHJlYW0pOwotCQlyZXR1cm4gY2Q7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBVUklSZXNvbHZlciBjYWxjdWxhdGVVUklSZXNvbHZlcihJRmlsZSBmaWxlKSB7Ci0JCS8vIE5vdGU6IHNlZSBjb21tZW50IGluIHBsdWdpbi54bWwgZm9yIHBvdGVudGlhbGx5Ci0JCS8vIGJyZWFraW5nIGNoYW5nZSBpbiBiZWhhdmlvci4KLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCVVSSVJlc29sdmVyIHJlc29sdmVyID0gKFVSSVJlc29sdmVyKSBwcm9qZWN0LmdldEFkYXB0ZXIoVVJJUmVzb2x2ZXIuY2xhc3MpOwotCQlpZiAocmVzb2x2ZXIgPT0gbnVsbCkKLQkJCXJlc29sdmVyID0gbmV3IFByb2plY3RSZXNvbHZlcihwcm9qZWN0KTsKLQkJT2JqZWN0IGxvY2F0aW9uID0gZmlsZS5nZXRMb2NhdGlvbigpOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCWxvY2F0aW9uID0gZmlsZS5nZXRMb2NhdGlvblVSSSgpOwotCQlpZiAobG9jYXRpb24gIT0gbnVsbCkKLQkJCXJlc29sdmVyLnNldEZpbGVCYXNlTG9jYXRpb24obG9jYXRpb24udG9TdHJpbmcoKSk7Ci0JCXJldHVybiByZXNvbHZlcjsKLQl9Ci0KLQkvKgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGFwcGVhcnMgaW4gYm90aCBNb2RlbE1hbmFnZXJJbXBsIGFuZCBKU0VkaXRvciAod2l0aAotCSAqIGp1c3QgYSBtaW5vciBkaWZmZXJlbmNlKS4gVGhleSBzaG91bGQgYmUga2VwdCB0aGUgc2FtZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtIGhhbmRsZWQgYnkgcGxhdGZvcm0KLQkgKi8KLQlwcml2YXRlIHZvaWQgY29udmVydExpbmVEZWxpbWl0ZXJzKElEb2N1bWVudCBkb2N1bWVudCwgSUZpbGUgaUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gTm90ZTogY2FsY3VsYXRlVHlwZShpRmlsZSkgcmV0dXJucyBhIGRlZmF1bHQgeG1sIG1vZGVsIGhhbmRsZXIgaWYKLQkJLy8gY29udGVudCB0eXBlIGlzIG51bGwuCi0JCVN0cmluZyBjb250ZW50VHlwZUlkID0gY2FsY3VsYXRlVHlwZShpRmlsZSkuZ2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoKTsKLQkJU3RyaW5nIGVuZE9mTGluZUNvZGUgPSBDb250ZW50QmFzZWRQcmVmZXJlbmNlR2F0ZXdheS5nZXRQcmVmZXJlbmNlc1N0cmluZyhjb250ZW50VHlwZUlkLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5FTkRfT0ZfTElORV9DT0RFKTsKLQkJLy8gZW5kT2ZMaW5lQ29kZSA9PSBudWxsIG1lYW5zIHRoZSBjb250ZW50IHR5cGUgZG9lcyBub3Qgc3VwcG9ydCB0aGlzCi0JCS8vIGZ1bmN0aW9uIChlLmcuIERURCkKLQkJLy8gZW5kT2ZMaW5lQ29kZSA9PSAiIiBtZWFucyBubyB0cmFuc2xhdGlvbgotCQlpZiAoZW5kT2ZMaW5lQ29kZSAhPSBudWxsICYmIGVuZE9mTGluZUNvZGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgbGluZURlbGltaXRlclRvVXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZW5kT2ZMaW5lQ29kZS5lcXVhbHMoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1IpKQotCQkJCWxpbmVEZWxpbWl0ZXJUb1VzZSA9IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlNUUklOR19DUjsKLQkJCWVsc2UgaWYgKGVuZE9mTGluZUNvZGUuZXF1YWxzKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkxGKSkKLQkJCQlsaW5lRGVsaW1pdGVyVG9Vc2UgPSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5TVFJJTkdfTEY7Ci0JCQllbHNlIGlmIChlbmRPZkxpbmVDb2RlLmVxdWFscyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUkxGKSkKLQkJCQlsaW5lRGVsaW1pdGVyVG9Vc2UgPSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5TVFJJTkdfQ1JMRjsKLQotCQkJVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQlpbnQgbGluZUNvdW50ID0gZG9jdW1lbnQuZ2V0TnVtYmVyT2ZMaW5lcygpOwotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVDb3VudDsgaSsrKSB7Ci0JCQkJCUlSZWdpb24gbGluZUluZm8gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24oaSk7Ci0JCQkJCWludCBsaW5lU3RhcnRPZmZzZXQgPSBsaW5lSW5mby5nZXRPZmZzZXQoKTsKLQkJCQkJaW50IGxpbmVMZW5ndGggPSBsaW5lSW5mby5nZXRMZW5ndGgoKTsKLQkJCQkJaW50IGxpbmVFbmRPZmZzZXQgPSBsaW5lU3RhcnRPZmZzZXQgKyBsaW5lTGVuZ3RoOwotCi0JCQkJCWlmIChpIDwgbGluZUNvdW50IC0gMSkgewotCQkJCQkJU3RyaW5nIGN1cnJlbnRMaW5lRGVsaW1pdGVyID0gZG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcihpKTsKLQkJCQkJCWlmIChjdXJyZW50TGluZURlbGltaXRlciAhPSBudWxsICYmIGN1cnJlbnRMaW5lRGVsaW1pdGVyLmNvbXBhcmVUbyhsaW5lRGVsaW1pdGVyVG9Vc2UpICE9IDApCi0JCQkJCQkJbXVsdGlUZXh0RWRpdC5hZGRDaGlsZChuZXcgUmVwbGFjZUVkaXQobGluZUVuZE9mZnNldCwgY3VycmVudExpbmVEZWxpbWl0ZXIubGVuZ3RoKCksIGxpbmVEZWxpbWl0ZXJUb1VzZSkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKG11bHRpVGV4dEVkaXQuZ2V0Q2hpbGRyZW5TaXplKCkgPiAwKQotCQkJCQltdWx0aVRleHRFZGl0LmFwcGx5KGRvY3VtZW50KTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkvLyBqdXN0IGFkZGluZyBnZW5lcmljIHJ1bnRpbWUgaGVyZSwgdW50aWwgd2hvbGUgbWV0aG9kCi0JCQkJLy8gZGVsZXRlZC4KLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHRoaXMgdXNlZCB0byBiZSBpbiBsb2FkZXIsIGJ1dCBoYXMgYmVlbiBtb3ZlZCBoZXJlCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGNvcHkoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgU3RyaW5nIG5ld0lkKSB0aHJvd3MgUmVzb3VyY2VJblVzZSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwgPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsID0gbW9kZWw7Ci0JCUlNb2RlbEhhbmRsZXIgbW9kZWxIYW5kbGVyID0gb2xkTW9kZWwuZ2V0TW9kZWxIYW5kbGVyKCk7Ci0JCUlNb2RlbExvYWRlciBsb2FkZXIgPSBtb2RlbEhhbmRsZXIuZ2V0TW9kZWxMb2FkZXIoKTsKLQkJLy8gbmV3TW9kZWwgPSBsb2FkZXIubmV3TW9kZWwoKTsKLQkJbmV3TW9kZWwgPSBsb2FkZXIuY3JlYXRlTW9kZWwob2xkTW9kZWwpOwotCQkvLyBuZXdJZCwgb2xkTW9kZWwuZ2V0UmVzb2x2ZXIoKSwgb2xkTW9kZWwuZ2V0TW9kZWxNYW5hZ2VyKCkpOwotCQluZXdNb2RlbC5zZXRNb2RlbEhhbmRsZXIobW9kZWxIYW5kbGVyKTsKLQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgPQotCQkvLyBvbGRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgPQotCQkvLyBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQubmV3SW5zdGFuY2UoKTsKLQkJLy8gbmV3TW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KG5ld1N0cnVjdHVyZWREb2N1bWVudCk7Ci0JCW5ld01vZGVsLnNldFJlc29sdmVyKG9sZE1vZGVsLmdldFJlc29sdmVyKCkpOwotCQluZXdNb2RlbC5zZXRNb2RlbE1hbmFnZXIob2xkTW9kZWwuZ2V0TW9kZWxNYW5hZ2VyKCkpOwotCQkvLyBkdXBsaWNhdGVGYWN0b3J5UmVnaXN0cnkobmV3TW9kZWwsIG9sZE1vZGVsKTsKLQkJbmV3TW9kZWwuc2V0SWQobmV3SWQpOwotCQkvLyBzZXQgdGV4dCBvZiBuZXcgb25lIGFmdGVyIGFsbCBpbml0aWFsaXphdGlvbiBpcyBkb25lCi0JCVN0cmluZyBjb250ZW50cyA9IG9sZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFRleHQoKTsKLQkJbmV3TW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuc2V0VGV4dCh0aGlzLCBjb250ZW50cyk7Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjb3B5TW9kZWxGb3JFZGl0KFN0cmluZyBvbGRJZCwgU3RyaW5nIG5ld0lkKSB0aHJvd3MgUmVzb3VyY2VJblVzZSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwgPSBudWxsOwotCQkvLyBnZXQgdGhlIGV4aXN0aW5nIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlkCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKG9sZElkKTsKLQkJLy8gaWYgaXQgZG9lc24ndCBleGlzdCwgaWdub3JlIHJlcXVlc3QgKHRob3VnaCB0aGlzIHdvdWxkIG5vcm1hbGx5Ci0JCS8vIGJlIGEgcHJvZ3JhbW1pbmcgZXJyb3IuCi0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSBudWxsOwotCQl0cnkgewotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQkvLyBub3cgYmUgc3VyZSBuZXdNb2RlbCBkb2VzIG5vdCBleGlzdAotCQkJc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChuZXdJZCk7Ci0JCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgUmVzb3VyY2VJblVzZSgpOwotCQkJfQotCQkJc2hhcmVkT2JqZWN0ID0gbmV3IFNoYXJlZE9iamVjdChuZXdJZCk7Ci0JCQlmTWFuYWdlZE9iamVjdHMucHV0KG5ld0lkLHNoYXJlZE9iamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJfQotCQkvLyBnZXQgbG9hZGVyIGJhc2VkIG9uIGV4aXN0aW5nIHR5cGUgKG5vdGUgdGhlIHR5cGUgYXNzdW1wdGlvbikKLQkJLy8gT2JqZWN0IHR5cGUgPSAoKElTdHJ1Y3R1cmVkTW9kZWwpIG1vZGVsKS5nZXRUeXBlKCk7Ci0JCS8vIElNb2RlbEhhbmRsZXIgdHlwZSA9IG1vZGVsLmdldE1vZGVsSGFuZGxlcigpOwotCQkvLyBJTW9kZWxMb2FkZXIgbG9hZGVyID0gKElNb2RlbExvYWRlcikgZ2V0TW9kZWxMb2FkZXJzKCkuZ2V0KHR5cGUpOwotCQkvLyBJTW9kZWxMb2FkZXIgbG9hZGVyID0gKElNb2RlbExvYWRlcikgZ2V0TW9kZWxMb2FkZXJzKCkuZ2V0KHR5cGUpOwotCQkvLyBhc2sgdGhlIGxvYWRlciB0byBjb3B5Ci0JCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCXNoYXJlZE9iamVjdC5kb1dhaXQgPSBmYWxzZTsKLQkJCW5ld01vZGVsID0gY29weShtb2RlbCwgbmV3SWQpOwotCQkJc2hhcmVkT2JqZWN0LmRvV2FpdCA9IHRydWU7Ci0JCX0KLQkJaWYgKG5ld01vZGVsICE9IG51bGwpIHsKLQkJCS8vIGFkZCB0byBvdXIgY2FjaGUKLQkJCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw9bmV3TW9kZWw7Ci0JCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCA9IDE7Ci0JCQkJdHJhY2UoImNvcGllZCBtb2RlbCIsIG5ld0lkLCBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQlmTWFuYWdlZE9iamVjdHMucmVtb3ZlKG5ld0lkKTsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQl9Ci0JCXNoYXJlZE9iamVjdC5zZXRMb2FkZWQoKTsKLQkJcmV0dXJuIG5ld01vZGVsOwotCX0KLQotCS8qKgotCSAqIFNpbWlsYXIgdG8gY2xvbmUsIGV4Y2VwdCB0aGUgbmV3IGluc3RhbmNlIGhhcyBubyBjb250ZW50LiBOb3RlOiB0aGlzCi0JICogcHJvZHVjZXMgYW4gdW5tYW5hZ2VkIG1vZGVsLCBmb3IgdGVtcG9yYXJ5IHVzZS4gSWYgYSB0cnVlIHNoYXJlZCBtb2RlbAotCSAqIGlzIGRlc2lyZWQsIHVzZSAiY29weSIuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlTmV3SW5zdGFuY2UoSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gb2xkTW9kZWwuZ2V0TW9kZWxIYW5kbGVyKCk7Ci0JCUlNb2RlbExvYWRlciBsb2FkZXIgPSBoYW5kbGVyLmdldE1vZGVsTG9hZGVyKCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwgPSBsb2FkZXIuY3JlYXRlTW9kZWwob2xkTW9kZWwpOwotCQluZXdNb2RlbC5zZXRNb2RlbEhhbmRsZXIoaGFuZGxlcik7Ci0JCWlmIChuZXdNb2RlbCBpbnN0YW5jZW9mIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSB7Ci0JCQkoKEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSBuZXdNb2RlbCkuc2V0Q29udGVudFR5cGVJZGVudGlmaWVyKG9sZE1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpKTsKLQkJfQotCQlVUklSZXNvbHZlciBvbGRSZXNvbHZlciA9IG9sZE1vZGVsLmdldFJlc29sdmVyKCk7Ci0JCW5ld01vZGVsLnNldFJlc29sdmVyKG9sZFJlc29sdmVyKTsKLQkJdHJ5IHsKLQkJCW5ld01vZGVsLnNldElkKERVUExJQ0FURURfTU9ERUwpOwotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUluVXNlIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHRoaXMgaXMgYW4gdW5tYW5hZ2VkIG1vZGVsCi0JCX0KLQkJLy8gYmFzZSBsb2NhdGlvbiBzaG91bGQgYmUgbnVsbCwgYnV0IHdlJ2xsIHNldCB0bwotCQkvLyBudWxsIHRvIGJlIHN1cmUuCi0JCW5ld01vZGVsLnNldEJhc2VMb2NhdGlvbihudWxsKTsKLQkJcmV0dXJuIG5ld01vZGVsOwotCX0KLQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kLCBzaW5jZSBhIHByb3BlciBJU3RydWN0dXJlZERvY3VtZW50IG11c3QgaGF2ZSBhIHByb3BlcgotCSAqIHBhcnNlciBhc3NpZ25lZC4gTm90ZTogaXRzIGFzc3VtZSB0aGF0IElGaWxlIGRvZXMgbm90IGFjdHVhbGx5IGV4aXN0IGFzCi0JICogYSByZXNvdXJjZSB5ZXQuIElmIGl0IGRvZXMsIFJlc291cmNlQWxyZWFkeUV4aXN0cyBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIHRoZSByZXNvdXJjZSBkb2VzIGFscmVhZHkgZXhpc3QsIHRoZW4gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yIGlzCi0JICogdGhlIHJpZ2h0IEFQSSB0byB1c2UuCi0JICogCi0JICogQHRocm93cyBSZXNvdXJjZUluVXNlCi0JICogCi0JICovCi0JcHVibGljICBJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudEZvcihJRmlsZSBpRmlsZSkgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoaUZpbGUuZXhpc3RzKCkpIHsKLQkJCXRocm93IG5ldyBSZXNvdXJjZUFscmVhZHlFeGlzdHMoaUZpbGUuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpOwotCQl9Ci0JCS8vIFdpbGwgcmVjb25zaWRlciBpbiBmdXR1cmUgdmVyc2lvbgotCQkvLyBTdHJpbmcgaWQgPSBjYWxjdWxhdGVJZChpRmlsZSk7Ci0JCS8vIGlmIChpc1Jlc291cmNlSW5Vc2UoaWQpKSB7Ci0JCS8vIHRocm93IG5ldyBSZXNvdXJjZUluVXNlKGlGaWxlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsKLQkJLy8gfQotCQlJRG9jdW1lbnRMb2FkZXIgbG9hZGVyID0gbnVsbDsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY2FsY3VsYXRlVHlwZShpRmlsZSk7Ci0JCWxvYWRlciA9IGhhbmRsZXIuZ2V0RG9jdW1lbnRMb2FkZXIoKTsKLQkJLy8gZm9yIHRoaXMgQVBJLCAiY3JlYXRlTmV3IiB3ZSBhc3N1bWUgdGhlIElGaWxlIGRvZXMgbm90IGV4aXN0IHlldAotCQkvLyBhcyBjaGVja2VkIGFib3ZlLCBzbyBqdXN0IGNyZWF0ZSBlbXB0eSBkb2N1bWVudC4KLQkJSVN0cnVjdHVyZWREb2N1bWVudCByZXN1bHQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kLCBzaW5jZSBhIHByb3BlciBJU3RydWN0dXJlZERvY3VtZW50IG11c3QgaGF2ZSBhIHByb3BlcgotCSAqIHBhcnNlciBhc3NpZ25lZC4gTm90ZTogY2xpZW50cyBzaG91bGQgdmVyaWZ5IElGaWxlIGV4aXN0cyBiZWZvcmUgdXNpbmcKLQkgKiB0aGlzIG1ldGhvZC4gSWYgdGhpcyBJRmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlbgotCSAqIGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCBpcyB0aGUgY29ycmVjdCBBUEkgdG8gdXNlLgotCSAqIAotCSAqIEB0aHJvd3MgUmVzb3VyY2VJblVzZQotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghaUZpbGUuZXhpc3RzKCkpIHsKLQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oaUZpbGUuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpOwotCQl9Ci0JCS8vIFdpbGwgcmVjb25zaWRlciBpbiBmdXR1cmUgdmVyc2lvbgotCQkvLyBTdHJpbmcgaWQgPSBjYWxjdWxhdGVJZChpRmlsZSk7Ci0JCS8vIGlmIChpc1Jlc291cmNlSW5Vc2UoaWQpKSB7Ci0JCS8vIHRocm93IG5ldyBSZXNvdXJjZUluVXNlKGlGaWxlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsKLQkJLy8gfQotCQlJRG9jdW1lbnRMb2FkZXIgbG9hZGVyID0gbnVsbDsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY2FsY3VsYXRlVHlwZShpRmlsZSk7Ci0JCWxvYWRlciA9IGhhbmRsZXIuZ2V0RG9jdW1lbnRMb2FkZXIoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCByZXN1bHQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChpRmlsZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVpZW5jZSBtZXRob2QsIHNpbmNlIGEgcHJvcGVyIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbXVzdCBoYXZlIGEKLQkgKiBwcm9wZXIgcGFyc2VyIGFzc2lnbmVkLiBJdCBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gYW4gZW1wdHkKLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgbmVlZGVkLiBPdGhlcndpc2UsIHVzZSBJRmlsZSBmb3JtLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gVE9ETzogdG8gYmUgcmVtb3ZlZCBieSBDNCBkbyB3ZSByZWFsbHkgbmVlZCB0aGlzPyBJCi0JICogICAgICAgICAgICAgcmVjb21tZW5kIHRvIC0gdXNlIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihmaWxlbmFtZSwKLQkgKiAgICAgICAgICAgICBudWxsLCBudWxsKSAtIHRoZSBmaWxlbmFtZSBkb2VzIG5vdCBuZWVkIHRvIHJlcHJlc2VudCBhCi0JICogICAgICAgICAgICAgcmVhbCAtIGZpbGUsIGJ1dCBjYW4gdGFrZSBmb3IgZm9ybSBvZiBkdW1teS5qc3AsIHRlc3QueG1sLAotCSAqICAgICAgICAgICAgIGV0Yy4gLSBUaGF0IHdheSB3ZSBkb24ndCBoYXJkIGNvZGUgdGhlIGhhbmRsZXIsIGJ1dCBzcGVjaWZ5Ci0JICogICAgICAgICAgICAgd2UgLSB3YW50IHRoZSBoYW5kbGVyIHRoYXQgImdvZXMgd2l0aCIgYSBjZXJ0YWluIHR5cGUgb2YgLQotCSAqICAgICAgICAgICAgIGZpbGUuCi0JICovCi0JcHVibGljICBJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlJRG9jdW1lbnRMb2FkZXIgbG9hZGVyID0gbnVsbDsKLQkJTW9kZWxIYW5kbGVyUmVnaXN0cnkgY3IgPSBnZXRNb2RlbEhhbmRsZXJSZWdpc3RyeSgpOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjci5nZXRIYW5kbGVyRm9yQ29udGVudFR5cGVJZChjb250ZW50VHlwZUlkKTsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiUHJvZ3JhbSBlcnJvcjogbm8gbW9kZWwgaGFuZGxlciBmb3VuZCBmb3IgIiArIGNvbnRlbnRUeXBlSWQpOyAvLyROT04tTkxTLTEkCi0JCWxvYWRlciA9IGhhbmRsZXIuZ2V0RG9jdW1lbnRMb2FkZXIoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCByZXN1bHQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbnZlaWVuY2UgbWV0aG9kLCBzaW5jZSBhIHByb3BlciBJU3RydWN0dXJlZERvY3VtZW50IG11c3QgaGF2ZSBhCi0JICogcHJvcGVyIHBhcnNlciBhc3NpZ25lZC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtLSAtIFRPRE86IHRvIGJlIHJlbW92ZWQgYnkgQzQgSSBtYXJrZWQgYXMgZGVwcmVjYXRlZCB0bwotCSAqICAgICAgICAgICAgIGRpc2NvdWFnZSB1c2Ugb2YgdGhpcyBtZXRob2QuIEl0IGRvZXMgbm90IHJlYWxseSB3b3JrIGZvcgotCSAqICAgICAgICAgICAgIEpTUCBmcmFnbWVudHMsIHNpbmNlIEpTUCBGcmFnbWVudHMgbmVlZCBhbiBJRmlsZSB0bwotCSAqICAgICAgICAgICAgIGNvcnJlY3RseSBsb29rIHVwIHRoZSBjb250ZW50IHNldHRpbmdzLiBVc2UgSUZpbGUgZm9ybQotCSAqICAgICAgICAgICAgIGluc3RlYWQuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJRG9jdW1lbnRMb2FkZXIgbG9hZGVyID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaXN0cmVhbSA9IFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKTsKLQkJaWYgKGlzdHJlYW0gIT0gbnVsbCkgewotCQkJaXN0cmVhbS5yZXNldCgpOwotCQl9Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoZmlsZW5hbWUsIGlzdHJlYW0pOwotCQlsb2FkZXIgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBsb2FkZXIuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChmaWxlbmFtZSwgaXN0cmVhbSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTcGVjaWFsIGNhc2UgbWV0aG9kLiBUaGlzIG1ldGhvZCB3YXMgY3JlYXRlZCBmb3IgdGhlIHNwZWNpYWwgY2FzZSB3aGVyZQotCSAqIHRoZXJlIGlzIGFuIGVuY29kaW5nIGZvciBpbnB1dCBzdHJlYW0gdGhhdCBzaG91bGQgb3ZlcnJpZGUgYWxsIHRoZQotCSAqIG5vcm1hbCBydWxlcyBmb3IgZW5jb2RpbmcuIEZvciBleGFtcGxlLCBpZiB0aGVyZSBpcyBhbiBlbmNvZGluZwotCSAqIChjaGFyc2V0KSBzcGVjaWZpZWQgaW4gSFRUUCByZXNwb25zZSBoZWFkZXIsIHRoZW4gdGhhdCBlbmNvZGluZyBpcyB1c2VkCi0JICogdG8gdHJhbnNsYXRlIHRoZSBpbnB1dCBzdHJlYW0gdG8gYSBzdHJpbmcsIGJ1dCB0aGVuIHRoZSBub3JtYWwgZW5jb2RpbmcKLQkgKiBydWxlcyBhcmUgaWdub3JlZCwgc28gdGhhdCB0aGUgc3RyaW5nIGlzIG5vdCB0cmFuc2xhdGVkIHR3aWNlIChmb3IKLQkgKiBleGFtcGxlLCBpZiBpdHMgYW4gSFRNTCAiZmlsZSIsIHRoZW4gZXZlbiBpZiBpdCBjb250YWlucyBhIGNoYXJzZXQgaW4KLQkgKiBtZXRhIHRhZywgaXRzIGlnbm9yZWQgc2luY2UgaXRzIGFzc3VtZWQgaXRzIGFsbCBjb3JyZWN0bHkgZGVjb2RlZCBieQotCSAqIHRoZSBIVFRQIGNoYXJzZXQuCi0JICovCi0JcHVibGljICBJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlciwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGVudCA9IHJlYWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgZW5jb2RpbmcpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHJlc3VsdCA9IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihmaWxlbmFtZSwgY29udGVudCwgcmVzb2x2ZXIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgd2hlbiB0aGUgcmVzb3VyY2UgZG9lcyBub3QKLQkgKiByZWFsbHkgZXhpc3QgKGUuZy4gd2hlbiBjb250ZW50IGlzIGJlaW5nIGNyZWF0ZWQsIGJ1dCBoYXNuJ3QgYmVlbgotCSAqIHdyaXR0ZW4gdG8gZGlzayB5ZXQpLiBOb3RlIHRoYXQgc2luY2UgdGhlIGNvbnRlbnQgaXMgYmVpbmcgcHJvdmlkZWQgYXMKLQkgKiBhIFN0cmluZywgaXQgaXMgYXNzdW1lZCB0byBhbHJlYWR5IGJlIGRlY29kZWQgY29ycmVjdGx5IHNvIG5vCi0JICogdHJhbnNmb3JtYXRpb24gaXMgZG9uZS4KLQkgKi8KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGNvbnRlbnQsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBUT0RPOiBhdm9pZCBhbGwgdGhlc2UgU3RyaW5nIGluc3RhbmNlcwotCQlTdHJpbmdCdWZmZXIgY29udGVudEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoY29udGVudCk7Ci0JCUlEb2N1bWVudExvYWRlciBsb2FkZXIgPSBudWxsOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGZpbGVuYW1lLCBudWxsKTsKLQkJbG9hZGVyID0gaGFuZGxlci5nZXREb2N1bWVudExvYWRlcigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHJlc3VsdCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBsb2FkZXIuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCVN0cmluZ0J1ZmZlciBjb252ZXJ0ZWRDb250ZW50ID0gbG9hZGVyLmhhbmRsZUxpbmVEZWxpbWl0ZXIoY29udGVudEJ1ZmZlciwgcmVzdWx0KTsKLQkJcmVzdWx0LnNldEVuY29kaW5nTWVtZW50byhuZXcgTnVsbE1lbWVudG8oKSk7Ci0JCXJlc3VsdC5zZXRUZXh0KHRoaXMsIGNvbnZlcnRlZENvbnRlbnQudG9TdHJpbmcoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlGaWxlCi0JICogQHBhcmFtIHJlc3VsdAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlVW5NYW5hZ2VkRW1wdHlNb2RlbEZvcihJRmlsZSBpRmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaUZpbGUpOwotCQlTdHJpbmcgaWQgPSBjYWxjdWxhdGVJZChpRmlsZSk7Ci0JCVVSSVJlc29sdmVyIHJlc29sdmVyID0gY2FsY3VsYXRlVVJJUmVzb2x2ZXIoaUZpbGUpOwotCi0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBfY29tbW9uQ3JlYXRlTW9kZWwoaWQsIGhhbmRsZXIsIHJlc29sdmVyKTsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VJblVzZSBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSdyZSBub3Qgc2hhcmluZwotCQkJLy8gKGV2ZW4gaWYgaXQgcmVhbGx5IGlzIGluIHVzZSAuLi4gd2UgZG9uJ3QgY2FyZSkKLQkJCS8vIHRoaXMgbWF5IG5lZWQgdG8gYmUgcmUtZXhhbWluZWQuCi0JCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMTUFOQUdFUikKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiTW9kZWxNYW5nZXJJbXBsOjpjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IuIE1vZGVsIHVuZXhwZWN0ZWRseSBpbiB1c2UuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZWllbmNlIG1ldGhvZC4gSXQgZGVwZW5kcyBvbiB0aGUgbG9hZGVycyBuZXdNb2RlbCBtZXRob2QgdG8gcmV0dXJuCi0JICogYW4gYXBwcm9wcmlhdGUgU3RydWN1dHVyZWRNb2RlbCBhcHByb3ByaWF0ZWx5IGluaXRpYWxpemVkLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihJRmlsZSBpRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjcmVhdGVVbk1hbmFnZWRFbXB0eU1vZGVsRm9yKGlGaWxlKTsKLQotCQlJRG9jdW1lbnRMb2FkZXIgbG9hZGVyID0gcmVzdWx0LmdldE1vZGVsSGFuZGxlcigpLmdldERvY3VtZW50TG9hZGVyKCk7Ci0JCUlFbmNvZGVkRG9jdW1lbnQgZG9jdW1lbnQgPSBsb2FkZXIuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KGlGaWxlKTsKLQotCQlyZXN1bHQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuc2V0VGV4dCh0aGlzLCBkb2N1bWVudC5nZXQoKSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZWllbmNlIG1ldGhvZC4gSXQgZGVwZW5kcyBvbiB0aGUgbG9hZGVycyBuZXdNb2RlbCBtZXRob2QgdG8gcmV0dXJuCi0JICogYW4gYXBwcm9wcmlhdGUgU3RydWN1dHVyZWRNb2RlbCBhcHByb3ByaWF0ZWx5IGluaXRpYWxpemVkLgotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJcmV0dXJuIGNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihjb250ZW50VHlwZUlkLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZWllbmNlIG1ldGhvZC4gSXQgZGVwZW5kcyBvbiB0aGUgbG9hZGVycyBuZXdNb2RlbCBtZXRob2QgdG8gcmV0dXJuCi0JICogYW4gYXBwcm9wcmlhdGUgU3RydWN1dHVyZWRNb2RlbCBhcHByb3ByaWF0ZWx5IGluaXRpYWxpemVkLgotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJTW9kZWxIYW5kbGVyUmVnaXN0cnkgY3IgPSBnZXRNb2RlbEhhbmRsZXJSZWdpc3RyeSgpOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjci5nZXRIYW5kbGVyRm9yQ29udGVudFR5cGVJZChjb250ZW50VHlwZUlkKTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IF9jb21tb25DcmVhdGVNb2RlbChVTk1BTkFHRURfTU9ERUwsIGhhbmRsZXIsIHJlc29sdmVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUluVXNlIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlJ3JlIG5vdCBzaGFyaW5nCi0JCQkvLyAoZXZlbiBpZiBpdCByZWFsbHkgaXMgaW4gdXNlIC4uLiB3ZSBkb24ndCBjYXJlKQotCQkJLy8gdGhpcyBtYXkgbmVlZCB0byBiZSByZS1leGFtaW5lZC4KLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxNQU5BR0VSKQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJNb2RlbE1hbmdlckltcGw6OmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvci4gTW9kZWwgdW5leHBlY3RlZGx5IGluIHVzZS4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbChPYmplY3QgaWQpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQkKLQkJU1lOQy5hY3F1aXJlKCk7Ci0JCS8qKgotCQkgKiBXaGlsZSBhIGdvb2QgY2hlY2sgaW4gdGhlb3J5LCBpdCdzIHBvc3NpYmxlIGZvciBhbiBldmVudCBmaXJlZCB0bwotCQkgKiBjYXVzZSBhIGxpc3RlbmVyIHRvIGFjY2VzcyBhIG1ldGhvZCB0aGF0IGNhbGxzIHRoaXMgb25lLgotCQkgKi8KLQkJLy9Bc3NlcnQuaXNUcnVlKFNZTkMuZ2V0RGVwdGgoKT09MSwgImRlcHRoIG5vdCBlcXVhbCB0byAxIik7Ci0JCS8vIGxldCdzIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgaXQgaW4gb3VyIGNhY2hlCi0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJLy8gaWYgbm90LCB0aGVuIHdlJ2xsIHNpbXBseSByZXR1cm4gbnVsbAotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJc2hhcmVkT2JqZWN0LndhaXRGb3JMb2FkQXR0ZW1wdCgpOwotCQkJcmVzdWx0ID0gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCQl9IGVsc2UgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogdXNlcnMgb2YgdGhpcyAnbW9kZWwnIG11c3Qgc3RpbGwgcmVsZWFzZSBpdCB3aGVuIGZpbmlzaGVkLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSdzIG5vdCBhIG1vZGVsIGNvcnJlc3BvbmRpbmcgdG8gZG9jdW1lbnQuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJCi0JCVNZTkMuYWNxdWlyZSgpOwkJCi0JCS8vIGNyZWF0ZSBhIHNuYXBzaG90Ci0JCVNldCBpZHMgPSBuZXcgSGFzaFNldChmTWFuYWdlZE9iamVjdHMua2V5U2V0KCkpOwotCQlTWU5DLnJlbGVhc2UoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGlkcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcG90ZW50aWFsSWQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlTWU5DLmFjcXVpcmUoKTsJCi0JCQlpZiAoZk1hbmFnZWRPYmplY3RzLmNvbnRhaW5zS2V5KHBvdGVudGlhbElkKSkgewotCQkJCS8vIGNoZWNrIHRvIHNlZSBpZiBzdGlsbCB2YWxpZAotCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgdGVtcFJlc3VsdCA9IGdldEV4aXN0aW5nTW9kZWwocG90ZW50aWFsSWQpOwotCQkJCWlmICh0ZW1wUmVzdWx0IT1udWxsICYmIGRvY3VtZW50ID09IHRlbXBSZXN1bHQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpIHsKLQkJCQkJcmVzdWx0ID0gZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQocG90ZW50aWFsSWQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgZ2V0TW9kZWwgbWV0aG9kLCBleGNlcHQgdGhpcyBtZXRob2QgZG9lcyBub3QKLQkgKiBjcmVhdGUgYSBtb2RlbC4gVGhpcyBtZXRob2QgZG9lcyBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCAoaWYgaXQKLQkgKiBleGlzdHMpLiBJZiB0aGUgbW9kZWwgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgY2FjaGUgb2YgbW9kZWxzLAotCSAqIG51bGwgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpRmlsZSwgIklGaWxlIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlPYmplY3QgaWQgPSBjYWxjdWxhdGVJZChpRmlsZSk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoaWQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgZ2V0TW9kZWwgbWV0aG9kLCBleGNlcHQgdGhpcyBtZXRob2QgZG9lcyBub3QKLQkgKiBjcmVhdGUgYSBtb2RlbC4gVGhpcyBtZXRob2QgZG9lcyBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCAoaWYgaXQKLQkgKiBleGlzdHMpLiBJZiB0aGUgbW9kZWwgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgY2FjaGUgb2YgbW9kZWxzLAotCSAqIG51bGwgaXMgcmV0dXJuZWQuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgdXNlIElGaWxlIGZvcm0gLSB0aGlzIG9uZSB3aWxsIGJlY29tZSBwcm90ZWN0ZWQgb3IgcHJpdmF0ZQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KE9iamVjdCBpZCkgewotCi0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlib29sZWFuIGRvUmVsZWFzZSA9IHRydWU7Ci0JCS8vIGxldCdzIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgaXQgaW4gb3VyIGNhY2hlCi0JCXRyeSB7Ci0JCQlTWU5DLmFjcXVpcmUoKTsKLQkJCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJCS8vIGlmIG5vdCwgdGhlbiB3ZSdsbCBzaW1wbHkgcmV0dXJuIG51bGwKLQkJCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkgewotCQkJCS8vIGlmIHNoYXJlZCBvYmplY3QgaXMgaW4gb3VyIGNhY2hlLCB0aGVuIHNpbXBseSBpbmNyZW1lbnQgaXRzIHJlZgotCQkJCS8vIGNvdW50LAotCQkJCS8vIGFuZCByZXR1cm4gdGhlIG9iamVjdC4KLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQlkb1JlbGVhc2U9ZmFsc2U7Ci0JCQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJCQlpZiAoc2hhcmVkT2JqZWN0LmRvV2FpdCkgewotCQkJCQkJc2hhcmVkT2JqZWN0LndhaXRGb3JMb2FkQXR0ZW1wdCgpOwotCQkJCQl9Ci0JCQkJCWlmIChzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwhPW51bGwpIHsKLQkJCQkJCV9pbmNyQ291bnQoc2hhcmVkT2JqZWN0LCBFRElUKTsKLQkJCQkJfQotCQkJCQlyZXN1bHQgPSBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JCQkJfQotCQkJCXRyYWNlKCJnb3QgZXhpc3RpbmcgbW9kZWwgZm9yIEVkaXQ6ICIsIGlkKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRyYWNlKCIgICBpbmNyZW1lbnRlZCByZWZlcmVuY2VDb3VudEZvckVkaXQgIiwgaWQsIHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZG9SZWxlYXNlKSB7Ci0JCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogdXNlcnMgb2YgdGhpcyAnbW9kZWwnIG11c3Qgc3RpbGwgcmVsZWFzZSBpdCB3aGVuIGZpbmlzaGVkLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSdzIG5vdCBhIG1vZGVsIGNvcnJlc3BvbmRpbmcgdG8gZG9jdW1lbnQuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJCi0JCVNZTkMuYWNxdWlyZSgpOwkJCi0JCS8vIGNyZWF0ZSBhIHNuYXBzaG90Ci0JCVNldCBpZHMgPSBuZXcgSGFzaFNldChmTWFuYWdlZE9iamVjdHMua2V5U2V0KCkpOwotCQlTWU5DLnJlbGVhc2UoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGlkcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcG90ZW50aWFsSWQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlTWU5DLmFjcXVpcmUoKTsJCi0JCQlpZiAoZk1hbmFnZWRPYmplY3RzLmNvbnRhaW5zS2V5KHBvdGVudGlhbElkKSkgewotCQkJCS8vIGNoZWNrIHRvIHNlZSBpZiBzdGlsbCB2YWxpZAotCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgdGVtcFJlc3VsdCA9IGdldEV4aXN0aW5nTW9kZWwocG90ZW50aWFsSWQpOwotCQkJCWlmICh0ZW1wUmVzdWx0IT1udWxsICYmIGRvY3VtZW50ID09IHRlbXBSZXN1bHQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpIHsKLQkJCQkJcmVzdWx0ID0gZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQocG90ZW50aWFsSWQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpRmlsZSwgIklGaWxlIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlPYmplY3QgaWQgPSBjYWxjdWxhdGVJZChpRmlsZSk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoaWQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgZ2V0TW9kZWwgbWV0aG9kLCBleGNlcHQgdGhpcyBtZXRob2QgZG9lcyBub3QKLQkgKiBjcmVhdGUgYSBtb2RlbC4gVGhpcyBtZXRob2QgZG9lcyBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCAoaWYgaXQKLQkgKiBleGlzdHMpLiBJZiB0aGUgbW9kZWwgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgY2FjaGUgb2YgbW9kZWxzLAotCSAqIG51bGwgaXMgcmV0dXJuZWQuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgdXNlIElGaWxlIGZvcm0gLSB0aGlzIG9uZSB3aWxsIGJlY29tZSBwcm90ZWN0ZWQgb3IgcHJpdmF0ZQotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yUmVhZChPYmplY3QgaWQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCWJvb2xlYW4gZG9SZWxlYXNlID0gdHJ1ZTsKLQkJLy8gbGV0J3Mgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBpbiBvdXIgY2FjaGUKLQkJdHJ5IHsKLQkJCVNZTkMuYWNxdWlyZSgpOwotCQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQkJLy8gaWYgbm90LCB0aGVuIHdlJ2xsIHNpbXBseSByZXR1cm4gbnVsbAotCQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQkJLy8gaWYgc2hhcmVkIG9iamVjdCBpcyBpbiBvdXIgY2FjaGUsIHRoZW4gc2ltcGx5IGluY3JlbWVudCBpdHMgcmVmCi0JCQkJLy8gY291bnQsCi0JCQkJLy8gYW5kIHJldHVybiB0aGUgb2JqZWN0LgotCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJCWRvUmVsZWFzZT1mYWxzZTsKLQotCQkJCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCQkJaWYgKHNoYXJlZE9iamVjdC5kb1dhaXQpIHsKLQkJCQkJCXNoYXJlZE9iamVjdC53YWl0Rm9yTG9hZEF0dGVtcHQoKTsKLQkJCQkJfQotCQkJCQlpZiAoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsIT1udWxsKSB7Ci0JCQkJCQlfaW5jckNvdW50KHNoYXJlZE9iamVjdCwgUkVBRCk7Ci0JCQkJCX0KLQkJCQkJcmVzdWx0ID0gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChkb1JlbGVhc2UpCi0JCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBETVc6IFRvbSwgdGhpcyBpcyAic3BlY2lhbCIgZm9yIGxpbmtzIGJ1aWxkZXIgQXNzdW1pbmcgaXRzCi0JICogICAgICAgICAgICAgc3RpbGwgbmVlZGVkLCB3b3VsZG4ndCBpdCBiZSBiZXR0ZXIgdG8gY2hhbmdlIHRvCi0JICogICAgICAgICAgICAgZ2V0RXhpc3RpbmdNb2RlbHMoKT8gLS0gd2lsbCBiZSByZW1vdmVkLiBJdHMgbm90IHRocmVhZAotCSAqICAgICAgICAgICAgIHNhZmUgZm9yIG9uZSB0aHJlYWQgdG8gZ2V0IHRoZSBFbnVtZXJhdGlvbiwgd2hlbiB1bmRlcmx5aW5nCi0JICogICAgICAgICAgICAgZGF0YSBjb3VsZCBiZSBjaGFuZ2VkIGluIGFub3RoZXIgdGhyZWFkLgotCSAqLwotCXB1YmxpYyAgRW51bWVyYXRpb24gZ2V0RXhpc3RpbmdNb2RlbElkcygpIHsKLQkJdHJ5IHsKLQkJCVNZTkMuYWNxdWlyZSgpOwotCQkJLy8gY3JlYXRlIGEgY29weQotCQkJVmVjdG9yIGtleXMgPSBuZXcgVmVjdG9yKCBmTWFuYWdlZE9iamVjdHMua2V5U2V0KCkgKTsKLQkJCXJldHVybiBrZXlzLmVsZW1lbnRzKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCS8vIFRPRE86IHJlcGxhY2UgKG9yIHN1cHBsZW1lbnQpIHRoaXMgaXMgYSAibW9kZWwgaW5mbyIgYXNzb2NpYXRpb24gdG8gdGhlCi0JLy8gSUZpbGUgdGhhdCBjcmVhdGVkIHRoZSBtb2RlbAotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZUZvcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBwYXRoID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlPYmplY3QgaWQgPSBtb2RlbC5nZXRJZCgpOwotCQkJaWYgKGlkID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlwYXRoID0gaWQudG9TdHJpbmcoKTsKLQkJfQotCQkvLyBUT09ETyBuZWVkcyByZXdvcmsgZm9yIGxpbmtlZCByZXNvdXJjZXMKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlGaWxlIGZpbGUgPSByb290LmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChwYXRoKSk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgcHJpbWFyeSBmb3JtcyB0byBnZXQgYSBtYW5hZ2VkIG1vZGVsCi0JICovCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpRmlsZSwgIklGaWxlIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gX2NvbW1vbkdldE1vZGVsKGlGaWxlLCBFRElULCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIF9jb21tb25HZXRNb2RlbChpRmlsZSwgRURJVCwgZW5jb2RpbmdSdWxlKTsKLQl9Ci0KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlLCBTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpRmlsZSwgIklGaWxlIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gX2NvbW1vbkdldE1vZGVsKGlGaWxlLCBFRElULCBlbmNvZGluZywgbGluZURlbGltaXRlcik7Ci0JfQotCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXJldHVybiBfZ2V0TW9kZWxGb3IoZG9jdW1lbnQsIEVESVQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsTWFuYWdlcgotCSAqIEBkZXByZWNhdGVkIHVzZSBJRmlsZSBvciBTdHJpbmcgZm9ybQotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoT2JqZWN0IGlkLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAicmVxdWVzdGVkIG1vZGVsIGlkIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzdHJpbmdJZCA9IGlkLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBnZXRNb2RlbEZvckVkaXQoc3RyaW5nSWQsIFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKSwgcmVzb2x2ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsTWFuYWdlcgotCSAqIEBkZXByZWNhdGVkIC0gdXNlIElGaWxlIG9yIFN0cmluZyBmb3JtCi0JICovCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChPYmplY3QgaWQsIE9iamVjdCBtb2RlbFR5cGUsIFN0cmluZyBlbmNvZGluZ05hbWUsIFN0cmluZyBsaW5lRGVsaW1pdGVyLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzdHJpbmdJZCA9IGlkLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBnZXRNb2RlbEZvckVkaXQoc3RyaW5nSWQsIFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKSwgcmVzb2x2ZXIpOwotCX0KLQotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoU3RyaW5nIGlkLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9ncmFtIEVycm9yOiBpZCBtYXkgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQotCQlJbnB1dFN0cmVhbSBpc3RyZWFtID0gVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGlkLCBpc3RyZWFtKTsKLQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gX2NvbW1vbkNyZWF0ZU1vZGVsKGlzdHJlYW0sIGlkLCBoYW5kbGVyLCByZXNvbHZlciwgRURJVCwgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAibm8gbW9kZWwgaGFuZGxlciBmb3VuZCBmb3IgaWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBwcmltYXJ5IGZvcm1zIHRvIGdldCBhIG1hbmFnZWQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIF9jb21tb25HZXRNb2RlbChpRmlsZSwgUkVBRCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpRmlsZSwgIklGaWxlIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gX2NvbW1vbkdldE1vZGVsKGlGaWxlLCBSRUFELCBlbmNvZGluZ1J1bGUpOwotCX0KLQotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUsIFN0cmluZyBlbmNvZGluZ05hbWUsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIF9jb21tb25HZXRNb2RlbChpRmlsZSwgUkVBRCwgZW5jb2RpbmdOYW1lLCBsaW5lRGVsaW1pdGVyKTsKLQl9Ci0KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJcmV0dXJuIF9nZXRNb2RlbEZvcihkb2N1bWVudCwgUkVBRCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxNYW5hZ2VyCi0JICogQGRlcHJlY2F0ZWQgdXNlIElGaWxlIG9yIFN0cmluZyBmb3JtCi0JICovCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChPYmplY3QgaWQsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzdHJpbmdJZCA9IGlkLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBnZXRNb2RlbEZvclJlYWQoc3RyaW5nSWQsIFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKSwgcmVzb2x2ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsTWFuYWdlcgotCSAqIEBkZXByZWNhdGVkIHVzZSBJRmlsZSBmb3JtCi0JICovCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChPYmplY3QgaWQsIE9iamVjdCBtb2RlbFR5cGUsIFN0cmluZyBlbmNvZGluZ05hbWUsIFN0cmluZyBsaW5lRGVsaW1pdGVyLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3RyaW5nSWQgPSBpZC50b1N0cmluZygpOwotCQlyZXR1cm4gZ2V0TW9kZWxGb3JSZWFkKHN0cmluZ0lkLCBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSksIHJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKFN0cmluZyBpZCwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpc3RyZWFtID0gVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGlkLCBpc3RyZWFtKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBfY29tbW9uQ3JlYXRlTW9kZWwoaXN0cmVhbSwgaWQsIGhhbmRsZXIsIHJlc29sdmVyLCBSRUFELCBudWxsLCBudWxsKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIG9ubHkgdGVtcG9yYXJpbHkgdmlzaWJsZQotCSAqLwotCXB1YmxpYyBNb2RlbEhhbmRsZXJSZWdpc3RyeSBnZXRNb2RlbEhhbmRsZXJSZWdpc3RyeSgpIHsKLQkJaWYgKGZNb2RlbEhhbmRsZXJSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlmTW9kZWxIYW5kbGVyUmVnaXN0cnkgPSBNb2RlbEhhbmRsZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBmTW9kZWxIYW5kbGVyUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxNYW5hZ2VyI2dldE5ld01vZGVsRm9yRWRpdChJRmlsZSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBSZXNvdXJjZUluVXNlLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IF9jb21tb25OZXdNb2RlbChpRmlsZSwgZm9yY2UpOwotCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQlzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0ID0gMTsKLQkJfQotCQlzaGFyZWRPYmplY3Quc2V0TG9hZGVkKCk7Ci0JCXJldHVybiBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxNYW5hZ2VyI2dldE5ld01vZGVsRm9yUmVhZChJRmlsZSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBSZXNvdXJjZUluVXNlLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpRmlsZSwgIklGaWxlIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gX2NvbW1vbk5ld01vZGVsKGlGaWxlLCBmb3JjZSk7Ci0JCVNZTkMuYWNxdWlyZSgpOwotCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQlpZiAoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsIT1udWxsKSB7Ci0JCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCA9IDE7Ci0JCQl9Ci0JCX0KLQkJU1lOQy5yZWxlYXNlKCk7Ci0JCXNoYXJlZE9iamVjdC5zZXRMb2FkZWQoKTsKLQkJcmV0dXJuIHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKi8KLQlwdWJsaWMgIGludCBnZXRSZWZlcmVuY2VDb3VudChPYmplY3QgaWQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgY291bnQgPSAwOwotCQotCQlTWU5DLmFjcXVpcmUoKTsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJc2hhcmVkT2JqZWN0LndhaXRGb3JMb2FkQXR0ZW1wdCgpOwotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHNoYXJlZE9iamVjdCkgewotCQkJCWNvdW50ID0gc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCArIHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQ7Ci0JCQl9Ci0JCX0KLQkJU1lOQy5yZWxlYXNlKCk7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlZmVyZW5jZUNvdW50Rm9yRWRpdChPYmplY3QgaWQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgY291bnQgPSAwOwotCQlTWU5DLmFjcXVpcmUoKTsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJc2hhcmVkT2JqZWN0LndhaXRGb3JMb2FkQXR0ZW1wdCgpOwotCQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJCWNvdW50ID0gc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlZmVyZW5jZUNvdW50Rm9yUmVhZChPYmplY3QgaWQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgY291bnQgPSAwOwotCQlTWU5DLmFjcXVpcmUoKTsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJc2hhcmVkT2JqZWN0LndhaXRGb3JMb2FkQXR0ZW1wdCgpOwotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJY291bnQgPSBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkOwotCQkJfQotCQl9Ci0JCVNZTkMucmVsZWFzZSgpOwotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNvbnZlcnRMaW5lRGVsaW1pdGVycyhJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgSUZpbGUgaUZpbGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUsIEVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8pIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudC5nZXROdW1iZXJPZkxpbmVzKCkgPiAxKSB7Ci0JCQljb252ZXJ0TGluZURlbGltaXRlcnMoc3RydWN0dXJlZERvY3VtZW50LCBpRmlsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlUHJvZ3JhbUVycm9yKFRocm93YWJsZSB0KSB7Ci0KLQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiSW1wb3NzaWJsZSBQcm9ncmFtIEVycm9yIiwgdCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXB1YmxpYyAgYm9vbGVhbiBpc1NoYXJlZChPYmplY3QgaWQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgY291bnQgPSAwOwotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlTWU5DLmFjcXVpcmUoKTsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJc2hhcmVkT2JqZWN0LndhaXRGb3JMb2FkQXR0ZW1wdCgpOwotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJY291bnQgPSBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkICsgc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdDsKLQkJCX0KLQkJfQotCQlTWU5DLnJlbGVhc2UoKTsKLQkJcmVzdWx0ID0gY291bnQgPiAxOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbAotCSAqLwotCXB1YmxpYyAgYm9vbGVhbiBpc1NoYXJlZEZvckVkaXQoT2JqZWN0IGlkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGNvdW50ID0gMDsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU1lOQy5hY3F1aXJlKCk7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJCXNoYXJlZE9iamVjdC53YWl0Rm9yTG9hZEF0dGVtcHQoKTsKLQkJCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCQljb3VudCA9IHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQ7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJfQotCQlyZXN1bHQgPSBjb3VudCA+IDE7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsCi0JICovCi0JcHVibGljICBib29sZWFuIGlzU2hhcmVkRm9yUmVhZChPYmplY3QgaWQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgY291bnQgPSAwOwotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlTWU5DLmFjcXVpcmUoKTsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJc2hhcmVkT2JqZWN0LndhaXRGb3JMb2FkQXR0ZW1wdCgpOwotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJY291bnQgPSBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkOwotCQkJfQotCQl9Ci0JCVNZTkMucmVsZWFzZSgpOwotCQlyZXN1bHQgPSBjb3VudCA+IDE7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZGVsIG1hbmFnZXIgaXMgd2l0aGluIGEKLQkgKiAiYWJvdXRUb0NoYW5nZSIgYW5kICJjaGFuZ2VkIiBzZXF1ZW5jZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB0aGUgbWFuYWdlciBkb2VzIG5vdCBvdGhlcndpc2UgaW50ZXJhY3Qgd2l0aCB0aGVzZSBzdGF0ZXMKLQkgKiBAcmV0dXJuIGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdGF0ZUNoYW5naW5nKCkgewotCQkvLyBkb2Vzbid0IHNlZW0gdG8gYmUgdXNlZCBhbnltb3JlCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjaGFuZ2VzIHRoZSBpZCBvZiB0aGUgbW9kZWwuIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmVNb2RlbChPYmplY3Qgb2xkSWQsIE9iamVjdCBuZXdJZCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG9sZElkLCAib2xkIGlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlBc3NlcnQuaXNOb3ROdWxsKG5ld0lkLCAibmV3IGlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTWU5DLmFjcXVpcmUoKTsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQob2xkSWQpOwotCQkvLyBpZiBub3QgZm91bmQgaW4gY2FjaGUsIGlnbm9yZSByZXF1ZXN0LgotCQkvLyB0aGlzIHdvdWxkIG5vcm1hbGx5IGJlIGEgcHJvZ3JhbSBlcnJvcgotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCWZNYW5hZ2VkT2JqZWN0cy5yZW1vdmUob2xkSWQpOwotCQkJZk1hbmFnZWRPYmplY3RzLnB1dChuZXdJZCwgc2hhcmVkT2JqZWN0KTsKLQkJfQotCQlTWU5DLnJlbGVhc2UoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyByZWFkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBpYW5hRW5jb2RpbmdOYW1lKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0JCVN0cmluZyBhbGxUZXh0ID0gbnVsbDsKLQkJaWYgKChpYW5hRW5jb2RpbmdOYW1lICE9IG51bGwpICYmIChpYW5hRW5jb2RpbmdOYW1lLmxlbmd0aCgpICE9IDApKSB7Ci0JCQlTdHJpbmcgZW5jID0gQ29kZWRJTy5nZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGlhbmFFbmNvZGluZ05hbWUpOwotCQkJaWYgKGVuYyA9PSBudWxsKSB7Ci0JCQkJLy8gaWYgbm8gY29udmVyc2lvbiB3YXMgcG9zc2libGUsIGxldCdzIGFzc3VtZSB0aGF0Ci0JCQkJLy8gdGhlIGVuY29kaW5nIGlzIGFscmVhZHkgYSBqYXZhIGVuY29kaW5nIG5hbWUsIHNvIHdlJ2xsCi0JCQkJLy8gcHJvY2VlZCB3aXRoIHRoYXQgYXNzdW1wdGlvbi4gVGhpcyBpcyB0aGUgY2FzZSwgZm9yCi0JCQkJLy8gZXhhbXBsZSwKLQkJCQkvLyBmb3IgdGhlIHJlbG9hZCgpIHByb2NlZHVyZS4KLQkJCQkvLyBJZiBpbiBmYWN0IGl0IGlzIG5vdCBhIHZhbGlkIGphdmEgZW5jb2RpbmcsIHRoZW4KLQkJCQkvLyB0aGUgImFsbFRleHQ9IiBsaW5lIHdpbGwgY2F1c2UgYW4KLQkJCQkvLyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0JCQkJZW5jID0gaWFuYUVuY29kaW5nTmFtZTsKLQkJCX0KLQkJCWFsbFRleHQgPSByZWFkSW5wdXRTdHJlYW0obmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtLCBlbmMpKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHdlIG5vcm1hbGx5IGFzc3VtZSBlbmNvZGluZyBpcyBwcm92aWRlZCBmb3IgdGhpcyBtZXRob2QsIGJ1dCBpZgotCQkJLy8gbm90LAotCQkJLy8gd2UnbGwgdXNlIHBsYXRmb3JtIGRlZmF1bHQKLQkJCWFsbFRleHQgPSByZWFkSW5wdXRTdHJlYW0obmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKSk7Ci0JCX0KLQkJcmV0dXJuIGFsbFRleHQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcmVhZElucHV0U3RyZWFtKElucHV0U3RyZWFtUmVhZGVyIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWludCBudW1SZWFkID0gMDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJY2hhciB0QnVmZltdID0gbmV3IGNoYXJbUkVBRF9CVUZGRVJfU0laRV07Ci0JCXdoaWxlICgobnVtUmVhZCA9IGlucHV0U3RyZWFtLnJlYWQodEJ1ZmYsIDAsIHRCdWZmLmxlbmd0aCkpICE9IC0xKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHRCdWZmLCAwLCBudW1SZWFkKTsKLQkJfQotCQkvLyByZW1lbWJlciAtLSB3ZSBkaWRuJ3Qgb3BlbiBzdHJlYW0gLi4uIHNvIHdlIGRvbid0IGNsb3NlIGl0Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1vZGVsTWFuYWdlciNyZWluaXRpYWxpemUoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCByZWluaXRpYWxpemUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCi0JCS8vIGdldEhhbmRsZXIgKGFzc3VtZSBpdHMgdGhlICJuZXcgb25lIikKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gbW9kZWwuZ2V0TW9kZWxIYW5kbGVyKCk7Ci0JCS8vIGdldExvYWRlciBmb3IgdGhhdCBuZXcgb25lCi0JCUlNb2RlbExvYWRlciBsb2FkZXIgPSBoYW5kbGVyLmdldE1vZGVsTG9hZGVyKCk7Ci0JCS8vIGFzayBpdCB0byByZWluaXRpYWxpemUKLQkJbW9kZWwgPSBsb2FkZXIucmVpbml0aWFsaXplKG1vZGVsKTsKLQkJLy8gdGhlIGxvYWRlciBzaG91bGQgY2hlY2sgdG8gc2VlIGlmIHRoZSBvbmUgaXQgcmVjZWl2ZWQKLQkJLy8gaXMgdGhlIHNhbWUgdHlwZSBpdCB3b3VsZCBub3JtYWxseSBjcmVhdGUuCi0JCS8vIGlmIG5vdCwgaXQgbXVzdCAic3RhcnQgZnJvbSBzY3JhdGNoIiBhbmQgY3JlYXRlIGEgd2hvbGUKLQkJLy8gbmV3IG9uZS4KLQkJLy8gaWYgaXQgaXMgb2YgdGhlIHNhbWUgdHlwZSwgaXQgc2hvdWxkIGp1c3QgJ3JlcGxhY2UgdGV4dCcKLQkJLy8gcmVwbGFjaW5nIGFsbCB0aGUgZXhpc3RpbmcgdGV4dCB3aXRoIHRoZSBuZXcgdGV4dC4KLQkJLy8gdGhlIGltcG9ydGFudCBvbmUgaXMgdGhlIEpTUCBsb2FkZXIgLi4uIGl0IHNob3VsZCBnbyB0aHJvdWdoCi0JCS8vIGl0cyBlbWJlZGRlZCBjb250ZW50IGNoZWNraW5nIGFuZCBpbml0aWFsaXphdGlvbgotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JIHZvaWQgcmVsZWFzZUZyb21FZGl0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCU9iamVjdCBpZCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRJZCgpOwotCQlpZiAoaWQuZXF1YWxzKFVOTUFOQUdFRF9NT0RFTCkgfHwgaWQuZXF1YWxzKERVUExJQ0FURURfTU9ERUwpKSB7Ci0JCQljbGVhbnVwRGlzY2FyZGVkTW9kZWwoc3RydWN0dXJlZE1vZGVsKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlbGVhc2VGcm9tRWRpdChpZCk7Ci0JCX0KLQotCX0KLQkKLQkgdm9pZCByZWxlYXNlRnJvbVJlYWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJT2JqZWN0IGlkID0gc3RydWN0dXJlZE1vZGVsLmdldElkKCk7Ci0JCWlmIChpZC5lcXVhbHMoVU5NQU5BR0VEX01PREVMKSB8fCBpZC5lcXVhbHMoRFVQTElDQVRFRF9NT0RFTCkpIHsKLQkJCWNsZWFudXBEaXNjYXJkZWRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVsZWFzZUZyb21SZWFkKGlkKTsKLQkJfQotCi0JfQotCS8qKgotCSAqIGRlZmF1bHQgZm9yIHVzZSBpbiBzYW1lIHBhY2thZ2UsIG5vdCBzdWJjbGFzc2VzCi0JICogCi0JICovCi0JIHByaXZhdGUgdm9pZCByZWxlYXNlRnJvbUVkaXQoT2JqZWN0IGlkKSB7Ci0JCS8vIElTU1VFOiBtYW55IG9mIHRoZXNlIGFzc2VydHMgc2hvdWxkIGJlIGNoYW5nZWQgdG8gImxvZ3MiCi0JCS8vIGFuZCBjb250aW51ZSB0byBsaW1wIGFsb25nPwotCi0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IG51bGw7Ci0KLQkJLy8gSVNTVUU6IGhlcmUgd2UgbmVlZCBiZXR0ZXIgInNwZWMiIHdoYXQgdG8gZG8gd2l0aAotCQkvLyB1bm1hbmFnZWQgb3IgZHVwbGljYXRlZCBtb2RlbHMuIFJlbGVhc2Ugc3RpbGwgbmVlZHMKLQkJLy8gdG8gYmUgY2FsbGVkIG9uIHRoZW0sIGZvciBub3csIGJ1dCB0aGUgbW9kZWwgbWFuYWdlcgotCQkvLyBkb2Vzbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCi0JCWlmIChpZC5lcXVhbHMoVU5NQU5BR0VEX01PREVMKSB8fCBpZC5lcXVhbHMoRFVQTElDQVRFRF9NT0RFTCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklkcyBvZiBVTk1BTkFHRURfTU9ERUwgb3IgRFVQTElDQVRFRF9NT0RFTCBhcmUgaWxsZWdhbCBoZXJlIik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTWU5DLmFjcXVpcmUoKTsKLQkJCXNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkKLQkJCUFzc2VydC5pc05vdE51bGwoc2hhcmVkT2JqZWN0LCAicmVsZWFzZSB3YXMgcmVxdWVzdGVkIG9uIGEgbW9kZWwgdGhhdCB3YXMgbm90IGJlaW5nIG1hbmFnZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hhcmVkT2JqZWN0LndhaXRGb3JMb2FkQXR0ZW1wdCgpOwotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJX2RlY3JDb3VudChzaGFyZWRPYmplY3QsIEVESVQpOwotCQkJCWlmICgoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCA9PSAwKSAmJiAoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCA9PSAwKSkgewotCQkJCQlkaXNjYXJkTW9kZWwoaWQsIHNoYXJlZE9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkvLyBpZiBlZGl0IGdvZXMgdG8gemVybywgYnV0IHN0aWxsIG9wZW4gZm9yIHJlYWQsCi0JCQkvLyB0aGVuIHdlIHNob3VsZCByZWxvYWQgaGVyZSwgc28gd2UgYXJlIGluIHN5bmNoIHdpdGgKLQkJCS8vIGNvbnRlbnRzIG9uIGRpc2suCi0JCQkvLyBJU1NVRTogc2hvdWxkIHdlIGNoZWNrIGlzRGlydHkgaGVyZT8KLQkJCS8vIEFOU1dFUjogaGVyZSwgZm9yIG5vdyBub3cuIG1vZGVsIHN0aWxsIGhhcyBpdHMgb3duIGRpcnR5Ci0JCQkvLyBmbGFnIGZvciBzb21lIHJlYXNvbi4KLQkJCS8vIHdlIG5lZWQgdG8gYWRkcmVzcyAqIHRoYXQgKiB0b28uCi0KLQkJCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCQlpZiAoKHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQgPiAwKSAmJiAoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCA9PSAwKSAmJiBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuaXNEaXJ0eSgpKSB7Ci0JCQkJCXNpZ25hbFByZUxpZmVDeWNsZUxpc3RlbmVyUmV2ZXJ0KHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCk7Ci0JCQkJCXJldmVydE1vZGVsKGlkLCBzaGFyZWRPYmplY3QpOwotCQkJCQkvKgotCQkJCQkgKiBCZWNhdXNlIG1vZGVsIGV2ZW50cyBhcmUgZmlyZWQgdG8gbm90aWZ5IGFib3V0IHRoZQotCQkJCQkgKiByZXZlcnQncyBjaGFuZ2VzLCBhbmQgbGlzdGVuZXJzIGNhbiBzdGlsbCBnZXQvcmVsZWFzZQotCQkJCQkgKiB0aGUgbW9kZWwgZnJvbSB0aGlzIHRocmVhZCAobG9ja2luZyBwcmV2ZW50cyBpdCBiZWluZwotCQkJCQkgKiBkb25lIGZyb20gb3RoZXIgdGhyZWFkcyksIHRoZSByZWZlcmVuY2UgY291bnRzIGNvdWxkCi0JCQkJCSAqIGhhdmUgY2hhbmdlZCBzaW5jZSB3ZSBlbnRlcmVkIHRoaXMgaWYgYmxvY2ssIGFuZCB0aGUKLQkJCQkJICogbW9kZWwgY291bGQgaGF2ZSBiZWVuIGRpc2NhcmRlZC4gIENoZWNrIHRoZSBjb3VudHMgYWdhaW4uCi0JCQkJCSAqLwotCQkJCQlpZiAoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCA+IDAgJiYgc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCA9PSAwKSB7Ci0JCQkJCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuc2V0RGlydHlTdGF0ZShmYWxzZSk7Ci0JCQkJCX0KLQkJCQkJc2lnbmFsUG9zdExpZmVDeWNsZUxpc3RlbmVyUmV2ZXJ0KHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIGZvciBub3csIHRob3VnaCBwdWJsaWMgZm9ybXMgaGF2ZSBiZWVuIHJlcXVlc3RlZCwgaW4gcGFzdC4KLQlwcml2YXRlIHZvaWQgcmV2ZXJ0TW9kZWwoT2JqZWN0IGlkLCBTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkucmV2ZXJ0KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNpZ25hbFByZUxpZmVDeWNsZUxpc3RlbmVyUmV2ZXJ0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9SRVZFUlQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJLy8gd2hhdCdzIHdyb25nIHdpdGggdGhpcyBkZXNpZ24gdGhhdCBhIGNhc3QgaXMgbmVlZGVkIGhlcmUhPwotCQlNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQoc3RydWN0dXJlZE1vZGVsLCB0eXBlKTsKLQkJKChBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgc3RydWN0dXJlZE1vZGVsKS5zaWduYWxMaWZlY3ljbGVFdmVudChldmVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNpZ25hbFBvc3RMaWZlQ3ljbGVMaXN0ZW5lclJldmVydChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfUkVWRVJUIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UOwotCQkvLyB3aGF0J3Mgd3Jvbmcgd2l0aCB0aGlzIGRlc2lnbiB0aGF0IGEgY2FzdCBpcyBuZWVkZWQgaGVyZSE/Ci0JCU1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudChzdHJ1Y3R1cmVkTW9kZWwsIHR5cGUpOwotCQkoKEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLnNpZ25hbExpZmVjeWNsZUV2ZW50KGV2ZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzY2FyZE1vZGVsKE9iamVjdCBpZCwgU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCkgewotCQlTWU5DLmFjcXVpcmUoKTsKLQkJZk1hbmFnZWRPYmplY3RzLnJlbW92ZShpZCk7Ci0JCVNZTkMucmVsZWFzZSgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpIHsKLQkJCVBsYXRmb3JtLmdldExvZyhTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKSkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFQ29yZVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgIkF0dGVtcHRlZCB0byBkaXNjYXJkIGEgc3RydWN0dXJlZCBtb2RlbCBidXQgdGhlIHVuZGVybHlpbmcgZG9jdW1lbnQgaGFzIGFscmVhZHkgYmVlbiBzZXQgdG8gbnVsbDogIiArIHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRCYXNlTG9jYXRpb24oKSwgbnVsbCkpOwotCQl9Ci0KLQkJY2xlYW51cERpc2NhcmRlZE1vZGVsKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXBEaXNjYXJkZWRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJLyoKLQkJICogVGhpcyBjYWxsIChhbmQgc2V0dGluZyB0aGUgU3RydWN0dXJlZERvY3VtZW50IHRvIG51bGwpIHdlcmUKLQkJICogcHJldmlvdXNseSBkb25lIHdpdGhpbiB0aGUgbW9kZWwgaXRzZWxmLCBidXQgZm9yIGNvbmN1cnJlbmN5IGl0Ci0JCSAqIG11c3QgYmUgZG9uZSBoZXJlIGR1cmluZyBhIHN5bmNocm9uaXplZCByZWxlYXNlLgotCQkgKi8KLQkJc3RydWN0dXJlZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpLnJlbGVhc2UoKTsKLQotCQkvKgotCQkgKiBGb3Igc3RydWN0dXJlZCBkb2N1bWVudHMgb3JpZ2luYXRpbmcgZnJvbSBmaWxlIGJ1ZmZlcnMsIGRpc2Nvbm5lY3QKLQkJICogdXMgZnJvbSB0aGUgZmlsZSBidWZmZXIsIG5vdy4KLQkJICovCi0JCUZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlTW9kZWwoc3RydWN0dXJlZERvY3VtZW50KTsKLQotCQkvKgotCQkgKiBTZXR0aW5nIHRoZSBkb2N1bWVudCB0byBudWxsIGlzIHJlcXVpcmVkIHNpbmNlIHNvbWUgc3ViY2xhc3NlcyBvZgotCQkgKiBtb2RlbCBtaWdodCBoYXZlICJjbGVhbnVwIiBvZiBsaXN0ZW5lcnMsIGV0Yy4sIHRvIHJlbW92ZSwgd2hpY2gKLQkJICogd2VyZSBpbml0aWFsaXplZCBkdXJpbmcgdGhlIGluaXRpYWwgc2V0U3RydWN0dXJlZERvY3VtZW50LgotCQkgKiAKLQkJICogVGhlIG1vZGVsIGl0c2VsZiBpbiBwYXJ0aWN1bGFyIG1heSBoYXZlIGludGVybmFsIGxpc3RlbmVycyB1c2VkIHRvCi0JCSAqIGNvb3JkaW5hdGUgdGhlIGRvY3VtZW50IHdpdGggaXRzIG93biAic3RydWN0dXJlIi4KLQkJICovCi0JCXN0cnVjdHVyZWRNb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQobnVsbCk7Ci0JfQotCi0JCi0JLyoqCi0JICogZGVmYXVsdCBmb3IgdXNlIGluIHNhbWUgcGFja2FnZSwgbm90IHN1YmNsYXNzZXMKLQkgKiAKLQkgKi8KLQkgcHJpdmF0ZSB2b2lkIHJlbGVhc2VGcm9tUmVhZChPYmplY3QgaWQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gbnVsbDsKLQotCQlpZiAoaWQuZXF1YWxzKFVOTUFOQUdFRF9NT0RFTCkgfHwgaWQuZXF1YWxzKERVUExJQ0FURURfTU9ERUwpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJZHMgb2YgVU5NQU5BR0VEX01PREVMIG9yIERVUExJQ0FURURfTU9ERUwgYXJlIGlsbGVnYWwgaGVyZSIpOwotCQl9Ci0JCWVsc2UgewotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQlzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJQXNzZXJ0LmlzTm90TnVsbChzaGFyZWRPYmplY3QsICJyZWxlYXNlIHdhcyByZXF1ZXN0ZWQgb24gYSBtb2RlbCB0aGF0IHdhcyBub3QgYmVpbmcgbWFuYWdlZCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaGFyZWRPYmplY3Qud2FpdEZvckxvYWRBdHRlbXB0KCk7Ci0JCX0KLQkJU1lOQy5hY3F1aXJlKCk7Ci0JCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCV9kZWNyQ291bnQoc2hhcmVkT2JqZWN0LCBSRUFEKTsKLQkJCWlmICgoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCA9PSAwKSAmJiAoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCA9PSAwKSkgewotCQkJCWRpc2NhcmRNb2RlbChpZCwgc2hhcmVkT2JqZWN0KTsKLQkJCX0KLQkJfQotCQlTWU5DLnJlbGVhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90IHVzZQotCSAqIHRoZSBjYWNoZWQgdmVyc2lvbiwgYnV0IGZvcmNlcyB0aGUgY2FjaGVkIHZlcnNpb24gdG8gYmUgcmVwbGFjZWQgd2l0aCBhCi0JICogZnJlc2gsIHVuY2hhbmdlZCB2ZXJzaW9uLiBOb3RlOiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBjaGFuZ2UgYW55Ci0JICogcmVmZXJlbmNlIGNvdW50cy4gQWxzbywgaWYgdGhlcmUgaXMgbm90IGFscmVhZHkgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUKLQkgKiBtb2RlbCwgdGhlbiB0aGlzIGNhbGwgaXMgZXNzZW50aWFsbHkgaWdub3JlZCAodGhhdCBpcywgaXQgZG9lcyBub3QgcHV0Ci0JICogYSBtb2RlbCBpbiB0aGUgY2FjaGUpIGFuZCByZXR1cm5zIG51bGwuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSB3aWxsIGJlY29tZSBwcm90ZWN0ZWQsIHVzZSByZWxvYWQgZGlyZWN0bHkgb24gbW9kZWwKLQkgKi8KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgcmVsb2FkTW9kZWwoT2JqZWN0IGlkLCBqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGdldCB0aGUgZXhpc3RpbmcgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaWQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKGlkKTsKLQkJLy8gZm9yIHRoZSBtb2RlbCB0byBiZSBudWxsIGlzIHByb2JhYmx5IGFuIGVycm9yICh0aGF0IGlzLAotCQkvLyByZWxvYWQgc2hvdWxkIG5vdCBoYXZlIGJlZW4gY2FsbGVkLCBidXQgd2UnbGwgZ3VhcmQgYWdhaW5zdAotCQkvLyBhIG51bGwgcG9pbnRlciBleGFtcGxlIGFuZCByZXR1cm4gbnVsbCBpZiB3ZSBhcmUgbm8gbG9uZ2VyIG1hbmFnaW5nCi0JCS8vIHRoYXQgbW9kZWwuCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJLy8gZ2V0IGxvYWRlciBiYXNlZCBvbiBleGlzdGluZyB0eXBlCi0JCQkvLyBkbXdUT0RPIGV2YWx1YXRlIHdoZW4gcmVsb2FkIHNob3VsZCBvY2N1cgotCQkJLy8gd2l0aCBwb3RlbnRpYWxseSBuZXcgdHlwZSAoZS5nLiBodG1sICdzYXZlIGFzJyBqc3ApLgotCQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gc3RydWN0dXJlZE1vZGVsLmdldE1vZGVsSGFuZGxlcigpOwotCQkJSU1vZGVsTG9hZGVyIGxvYWRlciA9IGhhbmRsZXIuZ2V0TW9kZWxMb2FkZXIoKTsKLQkJCS8vIGFzayB0aGUgbG9hZGVyIHRvIHJlLWxvYWQKLQkJCWxvYWRlci5yZWxvYWQoVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pLCBzdHJ1Y3R1cmVkTW9kZWwpOwotCQkJdHJhY2UoInJlLWxvYWRpbmcgbW9kZWwiLCBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVNb2RlbChJRmlsZSBpRmlsZSwgU3RyaW5nIGlkLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiZmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGxldCdzIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgaXQgaW4gb3VyIGNhY2hlCi0JCi0JCVNZTkMuYWNxdWlyZSgpOwotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgPT0gbnVsbCB8fCBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwgPT0gbnVsbCkgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFNTRUNvcmVNZXNzYWdlcy5Qcm9ncmFtX0Vycm9yX19Nb2RlbE1hbmFnZV9FWENfKTsgLy8kTk9OLU5MUy0xJCA9ICJQcm9ncmFtIEVycm9yOiBNb2RlbE1hbmFnZXJJbXBsOjpzYXZlTW9kZWwuIE1vZGVsIHNob3VsZCBiZSBpbiB0aGUgY2FjaGUiCi0JCX0gCi0JCWVsc2UgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQlzaGFyZWRPYmplY3Qud2FpdEZvckxvYWRBdHRlbXB0KCk7Ci0JCQkKLQkJCS8qKgotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMTYxMAotCQkJICogCi0JCQkgKiBTeW5jIHJlbW92ZWQgZnJvbSBoZXJlIHRvIHByZXZlbnQgZGVhZGxvY2suIEFsdGhvdWdoIHRoZSBtb2RlbAotCQkJICogaW5zdGFuY2UgbWF5IGRpc2FwcGVhciBvciBiZSBtYWRlIGludmFsaWQgd2hpbGUgdGhlIHNhdmUgaXMKLQkJCSAqIGhhcHBlbmluZywgdGhlIGRvY3VtZW50IGl0c2VsZiBzdGlsbCBoYXMgdGhlIGNvbnRlbnRzIHdlJ3JlCi0JCQkgKiB0cnlpbmcgdG8gc2F2ZS4gU2ltdWx0YW5lb3VzIHNhdmVzIHNob3VsZCBiZSB0aHJvdHRsZWQgYnkKLQkJCSAqIHJlc291cmNlIGxvY2tpbmcgd2l0aG91dCBvdXIgaW50ZXJ2ZW50aW9uLgotCQkJICovCi0JCQlib29sZWFuIHNhdmVkID0gZmFsc2U7Ci0JCQkvLyBpZiB0aGlzIG1vZGVsIHdhcyBiYXNlZCBvbiBhIEZpbGUgQnVmZmVyIGFuZCB3ZSdyZSB3cml0aW5nIGJhY2sKLQkJCS8vIHRvIHRoZSBzYW1lIGxvY2F0aW9uLCB1c2UgdGhlIGJ1ZmZlciB0byBkbyB0aGUgd3JpdGluZwotCQkJaWYgKEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc0V4aXN0aW5nQnVmZmVyKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSkpIHsKLQkJCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEJ1ZmZlcihzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCUlQYXRoIGZpbGVMb2NhdGlvbiA9IEZpbGVCdWZmZXJzLm5vcm1hbGl6ZUxvY2F0aW9uKGlGaWxlLmdldEZ1bGxQYXRoKCkpOwotCQkJCWlmIChmaWxlTG9jYXRpb24uZXF1YWxzKGJ1ZmZlci5nZXRMb2NhdGlvbigpKSkgewotCQkJCQlidWZmZXIuY29tbWl0KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRydWUpOwotCQkJCQlzYXZlZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFzYXZlZCkgewotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCXNhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQoZG9jdW1lbnQsIGlGaWxlLCBlbmNvZGluZ1J1bGUpOwotCQkJCXRyYWNlKCJzYXZpbmcgbW9kZWwiLCBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5zZXREaXJ0eVN0YXRlKGZhbHNlKTsKLQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5zZXROZXdTdGF0ZShmYWxzZSk7Ci0JCX0JCi0JfQotCi0JLyoqCi0JICogU2F2aW5nIHRoZSBtb2RlbCByZWFsbHkganVzdCBtZWFucyB0byBzYXZlIGl0J3Mgc3RydWN0dXJlZCBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gb3V0cHV0U3RyZWFtCi0JICogQHBhcmFtIGVuY29kaW5nUnVsZQotCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTW9kZWwoU3RyaW5nIGlkLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gbGV0J3Mgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBpbiBvdXIgY2FjaGUKLQotCQlTWU5DLmFjcXVpcmUoKTsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ID09IG51bGwpIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTU0VDb3JlTWVzc2FnZXMuUHJvZ3JhbV9FcnJvcl9fTW9kZWxNYW5hZ2VfRVhDXyk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvZ3JhbSBFcnJvcjogTW9kZWxNYW5hZ2VySW1wbDo6c2F2ZU1vZGVsLiBNb2RlbCBzaG91bGQgYmUgaW4gdGhlIGNhY2hlIgotCQl9Ci0JCWVsc2UgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQlzaGFyZWRPYmplY3Qud2FpdEZvckxvYWRBdHRlbXB0KCk7Ci0JCQkvKioKLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjE2MTAKLQkJCSAqIAotCQkJICogU3luYyByZW1vdmVkIGZyb20gaGVyZSB0byBwcmV2ZW50IGRlYWRsb2NrLiBBbHRob3VnaCB0aGUgbW9kZWwKLQkJCSAqIGluc3RhbmNlIG1heSBkaXNhcHBlYXIgb3IgYmUgbWFkZSBpbnZhbGlkIHdoaWxlIHRoZSBzYXZlIGlzCi0JCQkgKiBoYXBwZW5pbmcsIHRoZSBkb2N1bWVudCBpdHNlbGYgc3RpbGwgaGFzIHRoZSBjb250ZW50cyB3ZSdyZQotCQkJICogdHJ5aW5nIHRvIHNhdmUuIFNpbXVsdGFuZW91cyBzYXZlcyBzaG91bGQgYmUgdGhyb3R0bGVkIGJ5Ci0JCQkgKiByZXNvdXJjZSBsb2NraW5nIHdpdGhvdXQgb3VyIGludGVydmVudGlvbi4KLQkJCSAqLwotCQkJLyoKLQkJCSAqIGlmIHRoaXMgbW9kZWwgd2FzIGJhc2VkIG9uIGEgRmlsZSBCdWZmZXIgYW5kIHdlJ3JlIHdyaXRpbmcgYmFjawotCQkJICogdG8gdGhlIHNhbWUgbG9jYXRpb24sIHVzZSB0aGUgYnVmZmVyIHRvIGRvIHRoZSB3cml0aW5nCi0JCQkgKi8KLQkJCWlmIChGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuaXNFeGlzdGluZ0J1ZmZlcihzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpKSB7Ci0JCQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRCdWZmZXIoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQlidWZmZXIuY29tbWl0KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRydWUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSUZpbGUgaUZpbGUgPSBnZXRGaWxlRm9yKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCk7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJc2F2ZVN0cnVjdHVyZWREb2N1bWVudChkb2N1bWVudCwgaUZpbGUpOwotCQkJCXRyYWNlKCJzYXZpbmcgbW9kZWwiLCBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5zZXREaXJ0eVN0YXRlKGZhbHNlKTsKLQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5zZXROZXdTdGF0ZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHRoaXMgbWV0aG9kIGlzIGxlc3MgZWZmaWNpZW50IHRoYW4gSUZpbGUgZm9ybSwgc2luY2UgaXQKLQkgKiAgICAgICAgICAgICByZXF1aXJlcyBhbiBleHRyYSAiY29weSIgb2YgYnl0ZSBhcnJheSwgYW5kIHNob3VsZCBiZSBhdm9pZAotCSAqICAgICAgICAgICAgIGluIGZhdm9yIG9mIHRoZSBJRmlsZSBmb3JtLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVNb2RlbChTdHJpbmcgaWQsIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQotCQlTWU5DLmFjcXVpcmUoKTsKLQkJLy8gbGV0J3Mgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBpbiBvdXIgY2FjaGUKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ID09IG51bGwpIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTU0VDb3JlTWVzc2FnZXMuUHJvZ3JhbV9FcnJvcl9fTW9kZWxNYW5hZ2VfRVhDXyk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvZ3JhbSBFcnJvcjogTW9kZWxNYW5hZ2VySW1wbDo6c2F2ZU1vZGVsLiBNb2RlbCBzaG91bGQgYmUgaW4gdGhlIGNhY2hlIgotCQl9Ci0JCWVsc2UgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQlzaGFyZWRPYmplY3Qud2FpdEZvckxvYWRBdHRlbXB0KCk7Ci0JCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJQ29kZWRTdHJlYW1DcmVhdG9yIGNvZGVkU3RyZWFtQ3JlYXRvciA9IG5ldyBDb2RlZFN0cmVhbUNyZWF0b3IoKTsKLQkJCQljb2RlZFN0cmVhbUNyZWF0b3Iuc2V0KHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRJZCgpLCBuZXcgRG9jdW1lbnRSZWFkZXIoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKSk7Ci0JCQkJY29kZWRTdHJlYW1DcmVhdG9yLnNldFByZXZpb3VzRW5jb2RpbmdNZW1lbnRvKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRFbmNvZGluZ01lbWVudG8oKSk7Ci0JCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVBcnJheU91dHB1dFN0cmVhbSA9IGNvZGVkU3RyZWFtQ3JlYXRvci5nZXRDb2RlZEJ5dGVBcnJheU91dHB1dFN0cmVhbShlbmNvZGluZ1J1bGUpOwotCQkJCWJ5dGVbXSBvdXRwdXRCeXRlcyA9IGJ5dGVBcnJheU91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpOwotCQkJCW91dHB1dFN0cmVhbS53cml0ZShvdXRwdXRCeXRlcyk7Ci0JCQkJdHJhY2UoInNhdmluZyBtb2RlbCIsIGlkKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5zZXREaXJ0eVN0YXRlKGZhbHNlKTsKLQkJCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuc2V0TmV3U3RhdGUoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZVN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgSUZpbGUgaUZpbGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXNhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50LCBpRmlsZSwgRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiZmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc0V4aXN0aW5nQnVmZmVyKHN0cnVjdHVyZWREb2N1bWVudCkpIHsKLQkJCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0QnVmZmVyKHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQlpZiAoYnVmZmVyLmdldExvY2F0aW9uKCkuZXF1YWxzKGlGaWxlLmdldEZ1bGxQYXRoKCkpIHx8IGJ1ZmZlci5nZXRMb2NhdGlvbigpLmVxdWFscyhpRmlsZS5nZXRMb2NhdGlvbigpKSkgewotCQkJCWJ1ZmZlci5jb21taXQobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGlGaWxlKTsKLQkJCS8vIElEb2N1bWVudER1bXBlciBkdW1wZXIgPSBoYW5kbGVyLmdldERvY3VtZW50RHVtcGVyKCk7Ci0JCQlDb2RlZFN0cmVhbUNyZWF0b3IgY29kZWRTdHJlYW1DcmVhdG9yID0gbmV3IENvZGVkU3RyZWFtQ3JlYXRvcigpOwotCQkJUmVhZGVyIHJlYWRlciA9IG5ldyBEb2N1bWVudFJlYWRlcihzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJY29kZWRTdHJlYW1DcmVhdG9yLnNldChpRmlsZSwgcmVhZGVyKTsKLQkJCWNvZGVkU3RyZWFtQ3JlYXRvci5zZXRQcmV2aW91c0VuY29kaW5nTWVtZW50byhzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0RW5jb2RpbmdNZW1lbnRvKCkpOwotCQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9IGNvZGVkU3RyZWFtQ3JlYXRvci5nZXRDdXJyZW50RW5jb2RpbmdNZW1lbnRvKCk7Ci0KLQkJCS8vIGJlIHN1cmUgZG9jdW1lbnQncyBpcyB1cGRhdGVkLCBpbiBjYXNlIGV4Y2VwdGlvbiBpcyB0aHJvd24gaW4KLQkJCS8vIGdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RW5jb2RpbmdNZW1lbnRvKGVuY29kaW5nTWVtZW50byk7Ci0KLQkJCS8vIENvbnZlcnQgbGluZSBkZWxpbWl0ZXJzIGFmdGVyIGVuY29kaW5nIG1lbWVudG8gaXMgZmlndXJlZCBvdXQsCi0JCQkvLyBidXQKLQkJCS8vIGJlZm9yZSB3cml0aW5nIHRvIG91dHB1dCBzdHJlYW0uCi0JCQloYW5kbGVDb252ZXJ0TGluZURlbGltaXRlcnMoc3RydWN0dXJlZERvY3VtZW50LCBpRmlsZSwgZW5jb2RpbmdSdWxlLCBlbmNvZGluZ01lbWVudG8pOwotCi0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gY29kZWRCeXRlU3RyZWFtID0gY29kZWRTdHJlYW1DcmVhdG9yLmdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGVuY29kaW5nUnVsZSk7Ci0JCQlJbnB1dFN0cmVhbSBjb2RlZFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb2RlZEJ5dGVTdHJlYW0udG9CeXRlQXJyYXkoKSk7Ci0JCQlpZiAoaUZpbGUuZXhpc3RzKCkpCi0JCQkJaUZpbGUuc2V0Q29udGVudHMoY29kZWRTdHJlYW0sIHRydWUsIHRydWUsIG51bGwpOwotCQkJZWxzZQotCQkJCWlGaWxlLmNyZWF0ZShjb2RlZFN0cmVhbSwgZmFsc2UsIG51bGwpOwotCQkJY29kZWRCeXRlU3RyZWFtLmNsb3NlKCk7Ci0JCQljb2RlZFN0cmVhbS5jbG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tbW9uIHRyYWNlIG1ldGhvZAotCSAqLwotCXByaXZhdGUgdm9pZCB0cmFjZShTdHJpbmcgbXNnLCBPYmplY3QgaWQpIHsKLQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTE1BTkFHRVIpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIG1zZyArICIgIiArIFV0aWxpdGllcy5tYWtlU2hvcnRJZChpZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbW1vbiB0cmFjZSBtZXRob2QKLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJhY2UoU3RyaW5nIG1zZywgT2JqZWN0IGlkLCBpbnQgdmFsdWUpIHsKLQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTE1BTkFHRVIpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIG1zZyArIFV0aWxpdGllcy5tYWtlU2hvcnRJZChpZCkgKyAiICgiICsgdmFsdWUgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JfQotCi0JIGJvb2xlYW4gaXNJZEluVXNlKFN0cmluZyBuZXdJZCkgewotCQkJYm9vbGVhbiBpblVzZSA9IGZhbHNlOwotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQlTaGFyZWRPYmplY3Qgb2JqZWN0ID0oU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KG5ld0lkKTsKLQkJCWlmIChvYmplY3QhPW51bGwpIHsKLQkJCQlpblVzZSA9IG9iamVjdC50aGVTaGFyZWRNb2RlbCE9bnVsbDsKLQkJCX0KLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJcmV0dXJuIGluVXNlOwotCQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL1ByZWZVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL1ByZWZVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMjlhZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9QcmVmVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqICAgICANCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQ29uZmlndXJhdGlvblNjb3BlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNoYW5nZUV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOw0KLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOw0KLQ0KLWNsYXNzIFByZWZVdGlsIHsNCi0NCi0Jc3RhdGljIGxvbmcgV0FJVF9JTlRFUlZBTF9NUyA9IDUwMDsNCi0Jc3RhdGljIGludCBXQUlUX0RFTEFZID0gZ2V0SW50KCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxtYW5hZ2VyLm1heFdhaXREdXJpbmdDb25jdXJyZW50TG9hZCIpOw0KLQlzdGF0aWMgYm9vbGVhbiBBTExPV19JTlRFUlJVUFRfV0FJVElOR19USFJFQUQgPSBnZXRCb29sZWFuKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxtYW5hZ2VyLmFsbG93SW50ZXJydXB0c0R1cmluZ0NvbmN1cnJlbnRMb2FkIik7DQotDQotCS8qKiBCYXNlIG9mIG1pbGxpc2Vjb25kIHRpbWluZ3MsIHRvIGF2b2lkIHdyYXBwaW5nICovDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUlMTElfT1JJR0lOID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIG1pbGxpc2Vjb25kIHRpbWUgb2Zmc2V0IGJ5IG9yaWdpbg0KLQkgKi8NCi0Jc3RhdGljIGZpbmFsIGxvbmcgbm93KCkgew0KLQkJcmV0dXJuIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gTUlMTElfT1JJR0lOOw0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyBJRWNsaXBzZVByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgTElTVEVORVI7DQotCXN0YXRpYyB7DQotCQlJbnN0YW5jZVNjb3BlIHNjb3BlID0gbmV3IEluc3RhbmNlU2NvcGUoKTsNCi0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgaW5zdGFuY2VQcmVmcyA9IHNjb3BlLmdldE5vZGUoU1NFQ29yZVBsdWdpbi5JRCk7DQotCQlMSVNURU5FUiA9IG5ldyBJRWNsaXBzZVByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7DQotDQotCQkJcHVibGljIHZvaWQgcHJlZmVyZW5jZUNoYW5nZShQcmVmZXJlbmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsNCi0NCi0JCQkJaWYgKCJtb2RlbG1hbmFnZXIubWF4V2FpdER1cmluZ0NvbmN1cnJlbnRMb2FkIi5lcXVhbHMoZXZlbnQuZ2V0S2V5KCkpKSB7DQotCQkJCQlXQUlUX0RFTEFZID0gZ2V0SW50KCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxtYW5hZ2VyLm1heFdhaXREdXJpbmdDb25jdXJyZW50TG9hZCIpOw0KLQkJCQl9DQotCQkJCWVsc2UgaWYgKCJtb2RlbG1hbmFnZXIuYWxsb3dJbnRlcnJ1cHRzRHVyaW5nQ29uY3VycmVudExvYWQiLmVxdWFscyhldmVudC5nZXRLZXkoKSkpIHsNCi0JCQkJCUFMTE9XX0lOVEVSUlVQVF9XQUlUSU5HX1RIUkVBRCA9IGdldEJvb2xlYW4oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbG1hbmFnZXIuYWxsb3dJbnRlcnJ1cHRzRHVyaW5nQ29uY3VycmVudExvYWQiKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX07DQotCQlpbnN0YW5jZVByZWZzLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcihMSVNURU5FUik7DQotCX0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgew0KLQkJLy8gSW1wb3J0YW5jZSBvcmRlciBpczoNCi0JCS8vIGRlZmF1bHQtZGVmYXVsdCA8IGluc3RhbmNlU2NvcGUgPCBjb25maWd1cmF0aW9uU2NvcGUgPCBzeXN0ZW1Qcm9wZXJ0eQ0KLQkJLy8gPCBlbnZWYXINCi0JCVN0cmluZyB2YWx1ZSA9IG51bGw7DQotDQotCQlpZiAodmFsdWUgPT0gbnVsbCkgew0KLQkJCXZhbHVlID0gU3lzdGVtLmdldGVudihwcm9wZXJ0eSk7DQotCQl9DQotCQlpZiAodmFsdWUgPT0gbnVsbCkgew0KLQkJCXZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KHByb3BlcnR5KTsNCi0JCX0NCi0JCWlmICh2YWx1ZSA9PSBudWxsKSB7DQotCQkJSVByZWZlcmVuY2VzU2VydmljZSBwcmVmZXJlbmNlc1NlcnZpY2UgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKTsNCi0JCQkNCi0JCQlTdHJpbmcga2V5ID0gcHJvcGVydHk7DQotCQkJaWYgKHByb3BlcnR5ICE9IG51bGwgJiYgcHJvcGVydHkuc3RhcnRzV2l0aChTU0VDb3JlUGx1Z2luLklEKSkgew0KLQkJCQkvLyArMSwgaW5jbHVkZSB0aGUgIi4iDQotCQkJCWtleSA9IHByb3BlcnR5LnN1YnN0cmluZyhTU0VDb3JlUGx1Z2luLklELmxlbmd0aCgpICsgMSwgcHJvcGVydHkubGVuZ3RoKCkpOw0KLQkJCX0NCi0JCQlJbnN0YW5jZVNjb3BlIGluc3RhbmNlID0gbmV3IEluc3RhbmNlU2NvcGUoKTsNCi0JCQlDb25maWd1cmF0aW9uU2NvcGUgY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb25TY29wZSgpOw0KLQkJCQ0KLQkJCVByZWZlcmVuY2VzIGluc3RhbmNlTm9kZSA9IGluc3RhbmNlLmdldE5vZGUoU1NFQ29yZVBsdWdpbi5JRCk7DQotCQkJUHJlZmVyZW5jZXMgY29uZmlnTm9kZSA9IGNvbmZpZy5nZXROb2RlKFNTRUNvcmVQbHVnaW4uSUQpOw0KLQkJCXZhbHVlID0gcHJlZmVyZW5jZXNTZXJ2aWNlLmdldChrZXksIGdldERlZmF1bHQocHJvcGVydHkpLCBuZXcgUHJlZmVyZW5jZXNbXXtjb25maWdOb2RlLGluc3RhbmNlTm9kZX0pOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHZhbHVlOw0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0KFN0cmluZyBwcm9wZXJ0eSkgew0KLQkJLy8gdGhpcyBpcyB0aGUgImRlZmF1bHQtZGVmYXVsdCINCi0JCWlmICgib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsbWFuYWdlci5tYXhXYWl0RHVyaW5nQ29uY3VycmVudExvYWQiLmVxdWFscyhwcm9wZXJ0eSkpIHsNCi0JCQlyZXR1cm4gIjAiOw0KLQkJfQ0KLQkJZWxzZSBpZiAoIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbG1hbmFnZXIuYWxsb3dJbnRlcnJ1cHRzRHVyaW5nQ29uY3VycmVudExvYWQiLmVxdWFscyhwcm9wZXJ0eSkpIHsNCi0JCQlyZXR1cm4gImZhbHNlIjsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcga2V5KSB7DQotCQlTdHJpbmcgcHJvcGVydHkgPSBnZXRQcm9wZXJ0eShrZXkpOw0KLQkJLy8gaWYgKHByb3BlcnR5ICE9IG51bGwpIHsNCi0JCS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJUd2VhazogIiArIGtleSArICI9IiArIEJvb2xlYW4ucGFyc2VCb29sZWFuKHByb3BlcnR5KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJLy8gfQ0KLQkJcmV0dXJuIChwcm9wZXJ0eSAhPSBudWxsID8gQm9vbGVhbi52YWx1ZU9mKHByb3BlcnR5KSA6IEJvb2xlYW4udmFsdWVPZihnZXREZWZhdWx0KGtleSkpKQ0KLQkJCQkuYm9vbGVhblZhbHVlKCk7DQotCX0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldEludChTdHJpbmcga2V5KSB7DQotCQlTdHJpbmcgcHJvcGVydHkgPSBnZXRQcm9wZXJ0eShrZXkpOw0KLQkJaW50IHNpemUgPSAwOw0KLQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsNCi0JCQl0cnkgew0KLQkJCQlzaXplID0gSW50ZWdlci5wYXJzZUludChwcm9wZXJ0eSk7DQotCQkJCS8vCVN5c3RlbS5vdXQucHJpbnRsbigiVHdlYWs6ICIgKyBrZXkgKyAiPSIgKyBzaXplKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJfQ0KLQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgew0KLQkJCQlzaXplID0gZ2V0RGVmYXVsdEludChrZXksIHByb3BlcnR5LCBzaXplKTsNCi0JCQl9DQotCQl9DQotCQllbHNlIHsNCi0JCQlzaXplID0gZ2V0RGVmYXVsdEludChrZXksIHByb3BlcnR5LCBzaXplKTsNCi0JCX0NCi0JCXJldHVybiBzaXplOw0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIGludCBnZXREZWZhdWx0SW50KFN0cmluZyBrZXksIFN0cmluZyBwcm9wZXJ0eSwgaW50IHNpemUpIHsNCi0JCS8vIGlnbm9yZWQNCi0JCXRyeSB7DQotCQkJc2l6ZSA9IEludGVnZXIucGFyc2VJbnQoZ2V0RGVmYXVsdChrZXkpKTsNCi0JCX0NCi0JCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZTEpIHsNCi0JCQloYW5kbGVJbnRQYXJzZUV4Y2VwdGlvbihrZXksIHByb3BlcnR5LCBlMSk7DQotCQkJc2l6ZSA9IDA7DQotCQl9DQotCQlyZXR1cm4gc2l6ZTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZUludFBhcnNlRXhjZXB0aW9uKFN0cmluZyBrZXksIFN0cmluZyBwcm9wZXJ0eSwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUxKSB7DQotCQlFeGNlcHRpb24gbiA9IG5ldyBFeGNlcHRpb24oTkxTLmJpbmQoDQotCQkJCSJFeGNlcHRpb24gZHVyaW5nIHBhcnNlIG9mIGRlZmF1bHQgdmFsdWUgZm9yIGtleSAnJ3swfScnIHZhbHVlIHdhcyAnJ3sxfScnLiBVc2luZyAwIGluc3RlYWQiLCAvLyROT04tTkxTLTEkDQotCQkJCWtleSwgcHJvcGVydHkpLCBlMSk7DQotCQluLnByaW50U3RhY2tUcmFjZSgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGExMGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci0KLS8qKgotICogVGhlIGVudHJpZXMgaW4gdGhpcyByZWdpc3RyeSBhcmUsIGNvbmNlcHR1YWxseSwgc2luZ2xldG9uJ3MgU2luY2Ugb25seSBvbmUKLSAqIGluc3RhbmNlIGlzIGNyZWF0ZWQgaW4gdGhlIHJlZ2lzdHJ5LCBhbmQgdGhlbiB0aGF0IGluc3RhbmNlIHJldHVybmVkIHdoZW4KLSAqIHJlcXVpcmVkLgotICogCi0gKiBOb3RlIHRoYXQgdGhlcmUgaXMgaW50ZW50aW9uYWxseSBubyAncmVtb3ZlJyBtZXRob2QsIFNpbmNlIHRoZSByZWdpc3RyeQotICogaXRzZWxmIGlzIHJlYWQgaXQgd2hlbiBvbmNlLCBmcm9tIHRoZSBwbGF0Zm9ybSdzIHBsdWdpbiByZWdpc3RyeSwgYW5kIGlzCi0gKiBub3QgaW50ZW5kZWQgdG8gYmUgbW9kaWZpZWQgYWZ0ZXIgdGhhdC4gQSBjaGFuZ2UgaW4gYW4gZXh0ZW5zdGlvbiBpbiBhCi0gKiBwbHVnaW4ueG1sIHdpbGwgb25seSB0YWtlIGVmZmVjdCB3aGVuIHRoZSB3b3JrYmVuY2ggaXMgcmUtc3RhcnRlZC4KLSAqICAKLSAqLwotcHVibGljIGludGVyZmFjZSBFbWJlZGRlZFR5cGVSZWdpc3RyeSB7Ci0KLQkvKioKLQkgKiBNZXRob2QgdG8gcmV0dXJuIHRoZSBzcGVjaWZpYyB0eXBlIGZvciB0aGUgc3BlY2lmaWMgbWltZXR5cGUuCi0JICovCi0JcHVibGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0VHlwZUZvcihTdHJpbmcgbWltZVR5cGUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWE4OTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLQotCi0vKioKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbCBpbXBsZW1lbnRzIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgc3RhdGljIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGluc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgSGFzaFNldCBoYXNoU2V0ID0gbnVsbDsKLQlwcml2YXRlIEVtYmVkZGVkVHlwZUhhbmRsZXIgcmVnaXN0cnlEZWZhdWx0SGFuZGxlciA9IG51bGw7Ci0KLQkvKgotCSAqIEBzZWUgQ29udGVudFR5cGVSZWdpc3RyeSNnZXRUeXBlRm9yKFN0cmluZykKLQkgKi8KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29udGVudFR5cGVSZWdpc3RyeUltcGwuCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWhhc2hTZXQgPSBuZXcgSGFzaFNldCgpOwotCQluZXcgRW1iZWRkZWRUeXBlUmVnaXN0cnlSZWFkZXIoKS5yZWFkUmVnaXN0cnkoaGFzaFNldCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb250ZW50VHlwZVJlZ2lzdHJ5I2FkZChDb250ZW50VHlwZURlc2NyaXB0aW9uKQotCSAqLwotCXZvaWQgYWRkKElEb2N1bWVudFR5cGVIYW5kbGVyIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24pIHsKLQkJaGFzaFNldC5hZGQoY29udGVudFR5cGVEZXNjcmlwdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKSB7Ci0JCXJldHVybiBnZXRUeXBlRm9yKCJ0ZXh0L2h0bWwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRSZWdpc3RyeURlZmF1bHQuIFdlIGNhY2hlIHRoZSBkZWZhdWx0IGhhbmRsZXIsIHNpbmNlIGNhbid0Ci0JICogY2hhbmdlIG9uY2UgcGx1Z2luIGRlc2NyaXB0b3JzIGFyZSBsb2FkZWQuCi0JICogCi0JICogQHJldHVybiBFbWJlZGRlZFR5cGVIYW5kbGVyCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldFJlZ2lzdHJ5RGVmYXVsdCgpIHsKLQkJaWYgKHJlZ2lzdHJ5RGVmYXVsdEhhbmRsZXIgPT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBoYXNoU2V0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoKHJlZ2lzdHJ5RGVmYXVsdEhhbmRsZXIgPT0gbnVsbCkgJiYgKGl0Lmhhc05leHQoKSkpIHsgLy8gc2FmZQotCQkJCS8vIGNhc3QKLQkJCQkvLyBzaW5jZQotCQkJCS8vICdhZGQnCi0JCQkJLy8gcmVxdWlyZXMKLQkJCQkvLyBFbWJlZGRlZENvbnRlbnRUeXBlRGVzY3JpcHRpb24KLQkJCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGl0ZW0gPSAoRW1iZWRkZWRUeXBlSGFuZGxlcikgaXQubmV4dCgpOwotCQkJCWlmICgoaXRlbSAhPSBudWxsKSAmJiAoaXRlbS5pc0RlZmF1bHQoKSkpIHsKLQkJCQkJcmVnaXN0cnlEZWZhdWx0SGFuZGxlciA9IGl0ZW07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVnaXN0cnlEZWZhdWx0SGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgY29udGVudFR5cGVEZXNjcmlwdGlvbiBiYXNlZCBvbiBsaXRlcmFsIGlkLiBJdHMgYmFzaWNhbGx5IGEKLQkgKiAiZmlyc3QgZm91bmQgZmlyc3QgcmV0dXJuZWQiLiBOb3RlIHRoZSBvcmRlciBpcyBmYWlybHkgdW5wcmVkaWN0YWJsZSwKLQkgKiBzbyBub24tdW5pcXVlIGlkcyB3b3VsZCBjYXVzZSBwcm9ibGVtcy4KLQkgKi8KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRUeXBlRm9yKFN0cmluZyBtaW1lVHlwZSkgewotCQkvLyBOb3RlOiB0aGUgcmVhc29uIHdlIGhhdmUgdGhpcyBwcmVjb25kaXRpb24gaXMgdGhhdCB0aGUKLQkJLy8gZGVmYXVsdCBpcyBkaWZmZXJlbnQgaW5zaWRlIHRoZSByZWdpc3RyeSB0aGFuIHdoZW4gY2FsbGVkLAotCQkvLyBmb3IgZXhhbXBsZSwgZnJvbSB0aGUgSlNQTG9hZGVyLiBGb3IgdGhlIEpTUExvYWRlciwgaWYgdGhlcmUKLQkJLy8gaXMgbm8gbWltZXR5cGUsIHRoZSBkZWZhdWx0IHNob3VsZCBiZSBIVE1MLiBIZXJlLCBpZiB0aGVyZSBpcwotCQkvLyBzb21lIG1pbWV0eXBlLCBidXQgaXQgaXMgbm90IHJlY29nbml6ZWQsIHdlIHJldHVybiBhIGRlZmF1bHQKLQkJLy8gZm9yIFhNTC4gVGhpcyBpcyByZXF1aXJlZCBmb3IgdmFyaW91cyB2b2ljZSB4bWwgdHlwZXMsIGV0Yy4KLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBmb3VuZCA9IG51bGw7Ci0JCWlmIChtaW1lVHlwZSA9PSBudWxsIHx8IG1pbWVUeXBlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlmb3VuZCA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJfSBlbHNlIHsKLQkJCUl0ZXJhdG9yIGl0ID0gaGFzaFNldC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKChmb3VuZCA9PSBudWxsKSAmJiAoaXQuaGFzTmV4dCgpKSkgeyAvLyBzYWZlIGNhc3Qgc2luY2UKLQkJCQkvLyAnYWRkJyByZXF1aXJlcwotCQkJCS8vIEVtYmVkZGVkQ29udGVudFR5cGVEZXNjcmlwdGlvbgotCQkJCUVtYmVkZGVkVHlwZUhhbmRsZXIgaXRlbSA9IChFbWJlZGRlZFR5cGVIYW5kbGVyKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKChpdGVtICE9IG51bGwpICYmIChpdGVtLmdldFN1cHBvcnRlZE1pbWVUeXBlcygpLmNvbnRhaW5zKG1pbWVUeXBlKSkpIHsKLQkJCQkJZm91bmQgPSBpdGVtOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBpZiBubyBleGFjdCBtYXRjaCwgZG8gdGhlICJsb29zZXIiIGNoZWNrCi0JCQlpZihmb3VuZCA9PSBudWxsKSB7Ci0JCQkJaXQgPSBoYXNoU2V0Lml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKChmb3VuZCA9PSBudWxsKSAmJiAoaXQuaGFzTmV4dCgpKSkgeyAKLQkJCQkJRW1iZWRkZWRUeXBlSGFuZGxlciBpdGVtID0gKEVtYmVkZGVkVHlwZUhhbmRsZXIpIGl0Lm5leHQoKTsKLQkJCQkJaWYgKChpdGVtICE9IG51bGwpICYmIChpdGVtLmNhbkhhbmRsZU1pbWVUeXBlKG1pbWVUeXBlKSkpIHsKLQkJCQkJCWZvdW5kID0gaXRlbTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIG5vIG1hdGNoZXMsIHVzZSBkZWZhdWx0Ci0JCWlmIChmb3VuZCA9PSBudWxsKSB7Ci0JCQlmb3VuZCA9IGdldFJlZ2lzdHJ5RGVmYXVsdCgpOwotCQl9Ci0JCXJldHVybiBmb3VuZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OThmN2ExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRUeXBlUmVnaXN0cnlSZWFkZXIgewotCXByb3RlY3RlZCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImVtYmVkZGVkVHlwZUhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0KLQotCXByb3RlY3RlZCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIFRBR19OQU1FID0gImVtYmVkZGVkVHlwZUhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0KLQlFbWJlZGRlZFR5cGVSZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW1iZWRkZWRUeXBlSGFuZGxlciByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCi0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbiA9IG51bGw7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKSB7Ci0JCQl0cnkgewotCQkJCWNvbnRlbnRUeXBlRGVzY3JpcHRpb24gPSAoRW1iZWRkZWRUeXBlSGFuZGxlcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9DTEFTUyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJQXNzZXJ0LmlzTm90TnVsbChjb250ZW50VHlwZURlc2NyaXB0aW9uLCAiRXJyb3IgcmVhZGluZyBjb250ZW50IHR5cGUgZGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gY29udGVudFR5cGVEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBXZSBzaW1wbHkgcmVxdWlyZSBhbiAnYWRkJyBtZXRob2QsIG9mIHdoYXQgZXZlciBpdCBpcyB3ZSBhcmUgdG8gcmVhZAotCSAqIGludG8KLQkgKi8KLQl2b2lkIHJlYWRSZWdpc3RyeShTZXQgc2V0KSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZENvbnRlbnRUeXBlID0gcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQkJCS8vIG51bGwgY2FuIGJlIHJldHVybmVkIGlmIHRoZXJlJ3MgYW4gZXJyb3IgcmVhZGluZyB0aGUKLQkJCQkvLyBlbGVtZW50Ci0JCQkJaWYgKGVtYmVkZGVkQ29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJCQlzZXQuYWRkKGVtYmVkZGVkQ29udGVudFR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmJmYTEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJSZWdpc3RyeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgTW9kZWxIYW5kbGVyUmVnaXN0cnkgaW5zdGFuY2UgPSBudWxsOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJOQUxfREVGQVVMVF9FWFRFTlNJT04gPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIE1vZGVsSGFuZGxlclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgTW9kZWxIYW5kbGVyUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBJTW9kZWxIYW5kbGVyIGRlZmF1bHRIYW5kbGVyID0gbnVsbDsKLQlwcml2YXRlIE1vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IG5ldyBNb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlcigpOwotCi0JcHJpdmF0ZSBNb2RlbEhhbmRsZXJSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQkJcmVhZGVyID0gbmV3IE1vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyKCkucmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIGRlZmF1bHQgbW9kZWwgaGFuZGxlci4gTm90ZTogd2Ugc3RpbGwgZ28gdGhyb3VnaCB0aGUgcmVnaXN0cnkKLQkgKiB0byBiZSBzdXJlIHRvIGdldCB0aGUgZXhpc3RpbmcgaW5zdGFuY2UsIGJ1dCB0aGVuIHdlIGRvIHJlbWVtYmVyIGl0LCBzbwotCSAqIHN1YnNlcXVlbnQgcmVxdWVzdHMgd2lsbCBiZSBmYXN0ZXIuIFRoZSBmaXJzdCB0aW1lIHRocm91Z2gsIHdlIGRvIGNoZWNrCi0JICogdGhlIHdob2xlIGxpc3QsIHRvIGJlIHN1cmUgdGhlcmUgaXMgb25seSBvbmUuCi0JICogCi0JICovCi0JZmluYWwgcHVibGljIElNb2RlbEhhbmRsZXIgZ2V0RGVmYXVsdCgpIHsKLQkJaWYgKGRlZmF1bHRIYW5kbGVyID09IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcmVhZGVyLmVsZW1lbnRzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWJvb2xlYW4gb2ZJbnRlcmVzdCA9IHJlYWRlci5pc0VsZW1lbnREZWZhdWx0KGVsZW1lbnRzW2ldKTsKLQkJCQlpZiAob2ZJbnRlcmVzdCkgewotCQkJCQkvKgotCQkJCQkgKiBJZiwgaGVyZSB3aXRoaW4gdGhlIHNlYXJjaCBsb29wIHdlJ3ZlIGFscmVhZHkgZm91bmQgb25lCi0JCQkJCSAqIGRlZmF1bHRIYW5kbGVyLCB0aGVuIHNvbWV0aGluZyBpcyB3cm9uZyEKLQkJCQkJICovCi0JCQkJCWlmIChkZWZhdWx0SGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCQlkZWZhdWx0SGFuZGxlciA9IHJlYWRlci5nZXRJbnN0YW5jZShlbGVtZW50c1tpXSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlTdHJpbmcgZXJyb3JTdHJpbmcgPSAiUHJvZ3JhbSBvciBjb25maWd1cmF0aW9uIGVycm9yLiBNb3JlIHRoYW4gb25lIGRlZmF1bHQgY29udGVudCBoYW5kbGVyIGZvdW5kIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIGVycm9yU3RyaW5nKTsKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXJyb3JTdHJpbmcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChkZWZhdWx0SGFuZGxlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgZXJyb3JTdHJpbmcgPSAiUHJvZ3JhbSBvciBjb25maWd1cmF0aW9uIGVycm9yLiBObyBkZWZhdWx0IGNvbnRlbnQgdHlwZSBoYW5kbGVyIGZvdW5kLiI7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBlcnJvclN0cmluZyk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGVycm9yU3RyaW5nKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgYSBNb2RlbEhhbmRsZXIgYmFzZWQgb24gbGl0ZXJhbCBleHRlbnNpb24gaWQuIEl0J3MgYmFzaWNhbGx5IGEKLQkgKiAiZmlyc3QgZm91bmQgZmlyc3QgcmV0dXJuZWQiLiBObyBzcGVjaWZpYyBvcmRlciBpcyBndWFyYW50ZWVkIGFuZCB0aGUKLQkgKiB1bmlxdWVuZXNzIG9mIElEcyBpcyBub3QgY29uc2lkZXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uSWQKLQkgKiBAcmV0dXJuIHRoZSBnaXZlbiBleHRlbnNpb24sIG9yIG51bGwKLQkgKi8KLQlwcml2YXRlIElNb2RlbEhhbmRsZXIgZ2V0SGFuZGxlckV4dGVuc2lvbihTdHJpbmcgZXh0ZW5zaW9uSWQpIHsKLQkJSU1vZGVsSGFuZGxlciBmb3VuZCA9IG51bGw7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcmVhZGVyLmVsZW1lbnRzOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBjdXJyZW50SWQgPSByZWFkZXIuZ2V0SWQoZWxlbWVudHNbaV0pOwotCQkJCWlmIChleHRlbnNpb25JZC5lcXVhbHMoY3VycmVudElkKSkgewotCQkJCQlJTW9kZWxIYW5kbGVyIGl0ZW0gPSByZWFkZXIuZ2V0SW5zdGFuY2UoZWxlbWVudHNbaV0pOwotCQkJCQlmb3VuZCA9IGl0ZW07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKExvZ2dlci5ERUJVRyl7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiVGhlcmUgd2VyZSBubyBNb2RlbCBIYW5kbGVyIGZvdW5kIGluIHJlZ2lzdHJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZm91bmQ7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIHJlZ2lzdGVyZWQgSU1vZGVsSGFuZGxlciBmb3IgYSBnaXZlbiBuYW1lZCBmaWxlJ3MgY29udGVudAotCSAqIHR5cGUuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcGFyYW0gcHJvdmlkZURlZmF1bHQgc2hvdWxkIHRoZSBkZWZhdWx0IGV4dGVuc2lvbiBiZSB1c2VkIGluIHRoZSBhYnNlbmNlIG9mIG90aGVyIG1ldGhvZHMKLQkgKiBAcmV0dXJuIFRoZSBJTW9kZWxIYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIGdpdmVuCi0JICogICAgICAgICBmaWxlLiBJZiBhbiBleGFjdCBtYXRjaCBpcyBub3QgZm91bmQsIHRoZSBtb3N0LXNwZWNpZmljIG1hdGNoCi0JICogICAgICAgICBhY2NvcmRpbmcgdG8gSUNvbnRlbnRUeXBlLmlzS2luZE9mKCkgd2lsbCBiZSByZXR1cm5lZC4gSWYgbm9uZQotCSAqICAgICAgICAgYXJlIGZvdW5kLCBlaXRoZXIgYSBkZWZhdWx0IG9yIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSU1vZGVsSGFuZGxlciBnZXRIYW5kbGVyRm9yKElGaWxlIGZpbGUsIGJvb2xlYW4gcHJvdmlkZURlZmF1bHQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSU1vZGVsSGFuZGxlciBtb2RlbEhhbmRsZXIgPSBudWxsOwotCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IG51bGw7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IG51bGw7Ci0JCWJvb2xlYW4gYWNjZXNzaWJsZSA9IGZpbGUuaXNBY2Nlc3NpYmxlKCk7Ci0JCWlmIChhY2Nlc3NpYmxlKSB7Ci0JCQkvKiBUcnkgdGhlIG9wdGltaXplZCBtZXRob2QgZmlyc3QgYXMgdGhlIGRlc2NyaXB0aW9uIG1heSBiZSBjYWNoZWQgKi8KLQkJCWNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkvLyB1c2UgdGhlIHByb3ZpZGVkIGRlc2NyaXB0aW9uCi0JCQkJY29udGVudFR5cGUgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIHVzZSB0aGUgbW9yZSB0aG9yb3VnaCBkaXNjb3ZlcnkgbWV0aG9kIHRvIGdldCBhIGRlc2NyaXB0aW9uICovCi0JCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWNvbnRlbnRzID0gZmlsZS5nZXRDb250ZW50cyhmYWxzZSk7Ci0JCQkJCWNvbnRlbnREZXNjcmlwdGlvbiA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldERlc2NyaXB0aW9uRm9yKGNvbnRlbnRzLCBmaWxlLmdldE5hbWUoKSwgSUNvbnRlbnREZXNjcmlwdGlvbi5BTEwpOwotCQkJCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCWNvbnRlbnRUeXBlID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm90aGluZyBmdXJ0aGVyIGNhbiBiZSBkb25lLCBidXQgd2lsbCBsb2cgZm9yIGRlYnVnZ2luZwotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCQkJCS8vIG5vdGhpbmcgY2FuIGJlIGRvbmUKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIElmIHdlIGNvdWxkbid0IGdldCB0aGUgY29udGVudCB0eXBlIGZyb20gYSBkZXNjcmlwdGlvbiwgdHJ5IGJhc2luZwotCQkgKiBpdCBvbiBqdXN0IHRoZSBmaWxlbmFtZQotCQkgKi8KLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKGZpbGUuZ2V0TmFtZSgpKTsKLQkJfQotCi0JCWlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQltb2RlbEhhbmRsZXIgPSBnZXRIYW5kbGVyRm9yQ29udGVudFR5cGUoY29udGVudFR5cGUpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlID09IG51bGwgJiYgcHJvdmlkZURlZmF1bHQpIHsKLQkJCS8vIGhhcmQgY29kaW5nIGZvciBudWxsIGNvbnRlbnQgdHlwZQotCQkJbW9kZWxIYW5kbGVyID0gZ2V0SGFuZGxlckV4dGVuc2lvbihJTlRFUk5BTF9ERUZBVUxUX0VYVEVOU0lPTik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBtb2RlbEhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIHJlZ2lzdGVyZWQgSU1vZGVsSGFuZGxlciBmb3IgYSBnaXZlbiBuYW1lZCBmaWxlJ3MgY29udGVudAotCSAqIHR5cGUuIFdpbGwgY2hlY2sgZm9yIGEgZGVmYXVsdC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4gVGhlIElNb2RlbEhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgIGZpbGUuIElmIGFuIGV4YWN0IG1hdGNoIGlzIG5vdCBmb3VuZCwgdGhlIG1vc3Qtc3BlY2lmaWMgbWF0Y2gKLQkgKiAgICAgICAgIGFjY29yZGluZyB0byBJQ29udGVudFR5cGUuaXNLaW5kT2YoKSB3aWxsIGJlIHJldHVybmVkLiBJZiBub25lCi0JICogICAgICAgICBhcmUgZm91bmQsIGVpdGhlciBhIGRlZmF1bHQgb3IgbnVsbCB3aWxsIGJlIHJldHVybmVkLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJTW9kZWxIYW5kbGVyIGdldEhhbmRsZXJGb3IoSUZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0SGFuZGxlckZvcihmaWxlLCB0cnVlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSByZWdpc3RlcmVkIElNb2RlbEhhbmRsZXIgZm9yIGEgZ2l2ZW4gbmFtZWQgSW5wdXRTdHJlYW0uCi0JICogCi0JICogQHBhcmFtIGlucHV0TmFtZQotCSAqIEBwYXJhbSBpbnB1dFN0cmVhbQotCSAqIEByZXR1cm4gVGhlIElNb2RlbEhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgIGlucHV0LiBJZiBhbiBleGFjdCBtYXRjaCBpcyBub3QgZm91bmQsIHRoZSBtb3N0LXNwZWNpZmljIG1hdGNoCi0JICogICAgICAgICBhY2NvcmRpbmcgdG8gSUNvbnRlbnRUeXBlLmlzS2luZE9mKCkgd2lsbCBiZSByZXR1cm5lZC4gSWYgbm9uZQotCSAqICAgICAgICAgYXJlIGZvdW5kLCBlaXRoZXIgYSBkZWZhdWx0IG9yIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElNb2RlbEhhbmRsZXIgZ2V0SGFuZGxlckZvcihTdHJpbmcgaW5wdXROYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaVN0cmVhbSA9IFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKTsKLQkJSU1vZGVsSGFuZGxlciBtb2RlbEhhbmRsZXIgPSBudWxsOwotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBudWxsOwotCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpU3RyZWFtLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJCQljb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihVdGlsaXRpZXMuZ2V0TGltaXRlZFN0cmVhbShpU3RyZWFtKSwgaW5wdXROYW1lKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChpU3RyZWFtICE9IG51bGwgJiYgaVN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCQkJaVN0cmVhbS5yZXNldCgpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQljb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihpbnB1dE5hbWUpOwotCQl9Ci0JCS8vIGlmIGFsbCBlbHNlIGZhaWxlZCwgdHJ5IHRvIGRldGVjdCBzb2xlbHkgb24gY29udGVudHM7IGRvbmUgbGFzdCBmb3IKLQkJLy8gcGVyZm9ybWFuY2UgcmVhc29ucwotCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoVXRpbGl0aWVzLmdldExpbWl0ZWRTdHJlYW0oaVN0cmVhbSksIG51bGwpOwotCQl9Ci0JCW1vZGVsSGFuZGxlciA9IGdldEhhbmRsZXJGb3JDb250ZW50VHlwZShjb250ZW50VHlwZSk7Ci0JCXJldHVybiBtb2RlbEhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIHJlZ2lzdGVyZWQgSU1vZGVsSGFuZGxlciBmb3IgYSBnaXZlbiBJQ29udGVudFR5cGUuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogQHJldHVybiBUaGUgSU1vZGVsSGFuZGxlciByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY29udGVudCB0eXBlLiBJZiBhbgotCSAqICAgICAgICAgZXhhY3QgbWF0Y2ggaXMgbm90IGZvdW5kLCB0aGUgbW9zdC1zcGVjaWZpYyBtYXRjaCBhY2NvcmRpbmcgdG8KLQkgKiAgICAgICAgIElDb250ZW50VHlwZS5pc0tpbmRPZigpIHdpbGwgYmUgcmV0dXJuZWQuIElmIG5vbmUgYXJlIGZvdW5kLAotCSAqICAgICAgICAgZWl0aGVyIGEgZGVmYXVsdCBvciBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCi0JICovCi0JcHJpdmF0ZSBJTW9kZWxIYW5kbGVyIGdldEhhbmRsZXJGb3JDb250ZW50VHlwZShJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBleGFjdENvbnRlbnRUeXBlRWxlbWVudCA9IG51bGw7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQga2luZE9mQ29udGVudFR5cGVFbGVtZW50ID0gbnVsbDsKLQkJCWludCBraW5kT2ZDb250ZW50VHlwZURlcHRoID0gMDsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcmVhZGVyLmVsZW1lbnRzOwotCQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aCAmJiBleGFjdENvbnRlbnRUeXBlRWxlbWVudCA9PSBudWxsOyBpKyspIHsKLQkJCQkJU3RyaW5nIGN1cnJlbnRJZCA9IHJlYWRlci5nZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChlbGVtZW50c1tpXSk7Ci0JCQkJCUlDb250ZW50VHlwZSBhc3NvY2lhdGVkQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjdXJyZW50SWQpOwotCQkJCQlpZiAoY29udGVudFR5cGUuZXF1YWxzKGFzc29jaWF0ZWRDb250ZW50VHlwZSkpIHsKLQkJCQkJCWV4YWN0Q29udGVudFR5cGVFbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY29udGVudFR5cGUuaXNLaW5kT2YoYXNzb2NpYXRlZENvbnRlbnRUeXBlKSkgewotCQkJCQkJLyoKLQkJCQkJCSAqIFVwZGF0ZSB0aGUga2luZE9mRWxlbWVudCB2YXJpYWJsZSBvbmx5IGlmIHRoaXMKLQkJCQkJCSAqIGVsZW1lbnQncyBjb250ZW50IHR5cGUgaXMgImRlZXBlciIgKGRlcHRoIHRlc3QKLQkJCQkJCSAqIGVuc3VyZXMgdGhlIGZpcnN0IGNvbnRlbnQgdHlwZSBpcyByZW1lbWJlcmVkKQotCQkJCQkJICovCi0JCQkJCQlJQ29udGVudFR5cGUgdGVzdENvbnRlbnRUeXBlID0gYXNzb2NpYXRlZENvbnRlbnRUeXBlOwotCQkJCQkJaW50IHRlc3REZXB0aCA9IDA7Ci0JCQkJCQl3aGlsZSAodGVzdENvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCQkJCQl0ZXN0RGVwdGgrKzsKLQkJCQkJCQl0ZXN0Q29udGVudFR5cGUgPSB0ZXN0Q29udGVudFR5cGUuZ2V0QmFzZVR5cGUoKTsKLQkJCQkJCX0KLQkJCQkJCWlmICh0ZXN0RGVwdGggPiBraW5kT2ZDb250ZW50VHlwZURlcHRoKSB7Ci0JCQkJCQkJa2luZE9mQ29udGVudFR5cGVFbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkJCQkJa2luZE9mQ29udGVudFR5cGVEZXB0aCA9IHRlc3REZXB0aDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKExvZ2dlci5ERUJVRyl7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlRoZXJlIHdlcmUgbm8gTW9kZWwgSGFuZGxlciBmb3VuZCBpbiByZWdpc3RyeSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZXhhY3RDb250ZW50VHlwZUVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWhhbmRsZXIgPSByZWFkZXIuZ2V0SW5zdGFuY2UoZXhhY3RDb250ZW50VHlwZUVsZW1lbnQpOwotCQkJfQotCQkJZWxzZSBpZiAoa2luZE9mQ29udGVudFR5cGVFbGVtZW50ICE9IG51bGwpIHsKLQkJCQloYW5kbGVyID0gcmVhZGVyLmdldEluc3RhbmNlKGtpbmRPZkNvbnRlbnRUeXBlRWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaGFuZGxlciA9PSBudWxsKSB7Ci0JCQkvLyB0ZW1wIGhhcmQgY29kaW5nIGZvciBudWxsIGNvbnRlbnQgdHlwZSBhcmd1bWVudHMKLQkJCWhhbmRsZXIgPSBnZXRIYW5kbGVyRXh0ZW5zaW9uKElOVEVSTkFMX0RFRkFVTFRfRVhURU5TSU9OKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBoYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSByZWdpc3RlcmVkIElNb2RlbEhhbmRsZXIgZm9yIGEgZ2l2ZW4gY29udGVudCB0eXBlIElELiBObwotCSAqIHNwZWNpZmljIG9yZGVyIGlzIGd1YXJhbnRlZWQgYW5kIHRoZSB1bmlxdWVuZXNzIG9mIElEcyBpcyBub3QKLQkgKiBjb25zaWRlcmVkLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50VHlwZQotCSAqIEByZXR1cm4gVGhlIElNb2RlbEhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNvbnRlbnQgdHlwZSBJRC4gSWYKLQkgKiAgICAgICAgIGFuIGV4YWN0IG1hdGNoIGlzIG5vdCBmb3VuZCwgdGhlIG1vc3Qtc3BlY2lmaWMgbWF0Y2ggYWNjb3JkaW5nCi0JICogICAgICAgICB0byBJQ29udGVudFR5cGUuaXNLaW5kT2YoKSB3aWxsIGJlIHJldHVybmVkLiBJZiBub25lIGFyZSBmb3VuZCwKLQkgKiAgICAgICAgIGVpdGhlciBhIGRlZmF1bHQgb3IgbnVsbCB3aWxsIGJlIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBJTW9kZWxIYW5kbGVyIGdldEhhbmRsZXJGb3JDb250ZW50VHlwZUlkKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpOwotCQlyZXR1cm4gZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkNjExZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuQWJzdHJhY3RNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MganVzdCBjb252ZXJ0cyB3aGF0J3MgaW4gdGhlIHBsdWdpbnMgcmVnaXN0cnkgaW50byBhIGZvcm0gbW9yZQotICogZWFzaWx5IHVzZWFibGUgYnkgb3RoZXJzLCB0aGUgQ29udGVudFR5cGVSZWdpc3RyeS4KLSAqLwotY2xhc3MgTW9kZWxIYW5kbGVyUmVnaXN0cnlSZWFkZXIgewotCXByaXZhdGUgSGFzaE1hcCBhbGxSZWFkeUNyZWF0ZUluc3RhbmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJvdGVjdGVkIFN0cmluZyBBVFRfQVNTT0NJQVRFRF9DT05URU5UX1RZUEUgPSAiYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBBVFRfREVGQVVMVCA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzOwotCXByb3RlY3RlZCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gIm1vZGVsSGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQkvLwotCXByb3RlY3RlZCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIFRBR19OQU1FID0gIm1vZGVsSGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vCi0JLyoqCi0JICogQ29udGVudFR5cGVSZWdpc3RyeVJlYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCU1vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCVN0cmluZyBnZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQVNTT0NJQVRFRF9DT05URU5UX1RZUEUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JU3RyaW5nIGdldElkKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBpZFZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJcmV0dXJuIGlkVmFsdWU7Ci0JfQotCi0Jc3luY2hyb25pemVkIElNb2RlbEhhbmRsZXIgZ2V0SW5zdGFuY2UoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJLy8gTWF5IG5lZWQgdG8gcmVjb25zaWRlciwgYnV0IGZvciBub3csIHdlJ2xsIGFzc3VtZSBhbGwgY2xpZW50cyBtdXN0Ci0JCS8vIHN1YmNsYXNzIEFic3RyYWN0Q29udGVudFR5cGVJZGVudGlmaWVyLiBJdHMgZWFzaWVyIGFuZCBzYWZlciwgZm9yCi0JCS8vIHRoaXMKLQkJLy8gbG93IGxldmVsICJzeXN0ZW0iIG9iamVjdC4gKFRoYXQgaXMsIHdlIGNhbiBjaGVjayBhbmQgc2V0ICJwYWNrYWdlCi0JCS8vIHByb3RlY3RlZCIKLQkJLy8gYXR0cmlidXRlcy4KLQkJQWJzdHJhY3RNb2RlbEhhbmRsZXIgbW9kZWxIYW5kbGVyID0gKEFic3RyYWN0TW9kZWxIYW5kbGVyKSBhbGxSZWFkeUNyZWF0ZUluc3RhbmNlcy5nZXQoZ2V0SWQoZWxlbWVudCkpOwotCQlpZiAobW9kZWxIYW5kbGVyID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbW9kZWxIYW5kbGVyID0gKEFic3RyYWN0TW9kZWxIYW5kbGVyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTKTsKLQkJCQlpZiAobW9kZWxIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJYWxsUmVhZHlDcmVhdGVJbnN0YW5jZXMucHV0KGdldElkKGVsZW1lbnQpLCBtb2RlbEhhbmRsZXIpOwotCQkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0RFRkFVTFQpOwotCQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwgJiYgInRydWUiLmVxdWFscyhkZWZhdWx0VmFsdWUpKSAvLyROT04tTkxTLTEkCi0JCQkJCQltb2RlbEhhbmRsZXIuc2V0RGVmYXVsdCh0cnVlKTsKLQkJCQkJZWxzZQotCQkJCQkJbW9kZWxIYW5kbGVyLnNldERlZmF1bHQoZmFsc2UpOwotCQkJCQkvLyBUT0RPIC0tIHNldCBhbmQgY2hlY2sgYXR0cmlidXRlcyB2cy4gY3JlYXRlZCBpbnN0YW5jZQotCQkJCQkvL2NvbnRlbnRUeXBlSWRlbnRpZmllci5zZXRPckNoZWNrSWQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsSGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnREZWZhdWx0KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfREVGQVVMVCk7Ci0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiAidHJ1ZSIuZXF1YWxzKGRlZmF1bHRWYWx1ZSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JTW9kZWxIYW5kbGVyUmVnaXN0cnlSZWFkZXIgcmVhZFJlZ2lzdHJ5KCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQkvLyBqdXN0IHJlbWVtYmVyIHRoZSBlbGVtZW50cywgc28gcGx1Z2lucyBkb24ndCBoYXZlIHRvCi0JCQkvLyBiZSBhY3RpdmF0ZWQsIHVubGVzcyBleHRlbnNpb24gbWF0Y2hlcyB0aG9zZSAib2YgaW50ZXJlc3QiLgotCQkJZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJfQotCQlyZXR1cm4gdGhpczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJVdGlsaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYjJhNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotCi0vKioKLSAqIAotICogTGlrZWx5IGEgdGVtcG9yYXJ5IGNsYXNzIHRvIGJlIHJlcGxhY2VkIGJ5IHBsdWdpbiwgZXZlbnR1YWxseS4KLSAqLwotcHVibGljIGNsYXNzIE1vZGVsSGFuZGxlclV0aWxpdHkgewotCi0JcHJpdmF0ZSBzdGF0aWMgTW9kZWxIYW5kbGVyUmVnaXN0cnkgY29udGVudFR5cGVSZWdpc3RyeTsKLQotCXB1YmxpYyBzdGF0aWMgSURvY3VtZW50VHlwZUhhbmRsZXIgZ2V0Q29udGVudFR5cGVGb3IoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gZ2V0Q29udGVudFR5cGVSZWdpc3RyeSgpLmdldEhhbmRsZXJGb3JDb250ZW50VHlwZUlkKHN0cmluZyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTW9kZWxIYW5kbGVyUmVnaXN0cnkgZ2V0Q29udGVudFR5cGVSZWdpc3RyeSgpIHsKLQkJaWYgKGNvbnRlbnRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJY29udGVudFR5cGVSZWdpc3RyeSA9IE1vZGVsSGFuZGxlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRUeXBlUmVnaXN0cnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldERlZmF1bHRFbWJlZGRlZFR5cGUoKSB7Ci0JCXJldHVybiBnZXRFbWJlZGRlZENvbnRlbnRUeXBlRm9yKCJ0ZXh0L2h0bWwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRFbWJlZGRlZENvbnRlbnRUeXBlRm9yKFN0cmluZyBzdHJpbmcpIHsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBpbnN0YW5jZSA9IG51bGw7Ci0JCWluc3RhbmNlID0gRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCkuZ2V0VHlwZUZvcihzdHJpbmcpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIE1vZGVsSGFuZGxlclV0aWxpdHkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9QbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QyZTJkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9QbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiAKLSAqIENsaWVudHMgY2FuIG1ha2UgdXNlIG9mIElFeGVjdXRhYmxlRXh0ZW5zaW9uIHRvIGhhbmRsZSB0aGUgb3B0aW9uYWwgYWRhcHRlcgotICogY2xhc3MgYW5kIGtleS4gVHlwaWNhbGx5LCBtYW55IGNsaWVudHMgdXNlIGEgdHlwaWNhbCBwYXR0ZXJuIG9mIHByb3ZpZGluZwotICogYW4gYWRhcHRlciBjbGFzcyBhbmQga2V5IGluIHRoZWlyIG51bGwgYXJndW1lbnQgY29uc3RydWN0b3IgYW55d2F5LCBzbwotICogdGhleSdkIG9ubHkgaGF2ZSB0byB1c2UgSUV4ZWN1dGFibGVFeHRlbnNpb24gaWYgdGhlIGZhY3Rvcnkgd2FzIGZvciBtb3JlCi0gKiB0aGFuIG9uZS4KLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlciB7Ci0JLy8JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBBVFRSX0FEQVBURVJLRVkgPSAiYWRhcHRlcktleUNsYXNzIjsKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBBVFRSX1JFR0lTVEVSQURBUFRFUiA9ICJyZWdpc3RlckFkYXB0ZXJzIjsKLQkvLyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyIHJlYWRlciA9IG51bGw7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBQbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChyZWFkZXIgPT0gbnVsbCkgewotCQkJcmVhZGVyID0gbmV3IFBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlcigpOwotCQl9Ci0JCXJldHVybiByZWFkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBBVFRSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQVRUUl9DT05URU5UVFlQRSA9ICJjb250ZW50VHlwZUlkZW50aWZlcklkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiY29udGVudFR5cGVGYWN0b3J5Q29udHJpYnV0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiZmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBQbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RmFjdG9yaWVzKElEb2N1bWVudFR5cGVIYW5kbGVyIGhhbmRsZXIpIHsKLQkJcmV0dXJuIGxvYWRSZWdpc3RyeShoYW5kbGVyLmdldElkKCkpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEZhY3RvcmllcyhTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gbG9hZFJlZ2lzdHJ5KHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXJGYWN0b3J5IGxvYWRGYWN0b3J5RnJvbUNvbmZpZ3VyYXRpb25FbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBPYmplY3QgcmVxdWVzdGVyVHlwZSkgewotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkgewotCQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9DT05URU5UVFlQRSk7Ci0JCQlpZiAoIXJlcXVlc3RlclR5cGUuZXF1YWxzKGNvbnRlbnRUeXBlKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0NMQVNTKTsKLQkJCS8vCQkJU3RyaW5nIGFkYXB0ZXJLZXlDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfQURBUFRFUktFWSk7Ci0JCQkvLwkJCVN0cmluZyByZWdpc3RlckFkYXB0ZXJzID0KLQkJCS8vIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfUkVHSVNURVJBREFQVEVSKTsKLQotCQkJLy8gaWYgY2xhc3NOYW1lIGlzIG51bGwsIHRoZW4gbm8gb25lIGRlZmluZWQgdGhlIGV4dGVuc2lvbiBwb2ludAotCQkJLy8gZm9yIGFkYXB0ZXIgZmFjdG9yaWVzCi0JCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRSX0NMQVNTKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWYgYW4gZXJyb3Igb2NjdXJzIGhlcmUsIGl0cyBwcm9iYWJseSB0aGF0IHRoZSBwbHVnaW4KLQkJCQkJLy8gY291bGQgbm90IGJlIGZvdW5kL2xvYWRlZAotCQkJCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgY2xhc3M6ICIgKyBjbGFzc05hbWUsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWYgYW4gZXJyb3Igb2NjdXJzIGhlcmUsIGl0cyBwcm9iYWJseSB0aGF0IHRoZSBwbHVnaW4KLQkJCQkJLy8gY291bGQgbm90IGJlIGZvdW5kL2xvYWRlZCAtLSBidXQgaW4gYW55IGNhc2Ugd2UganVzdAotCQkJCQkvLyB3YW50Ci0JCQkJCS8vIHRvIGxvZyB0aGUgZXJyb3IgYW5kIGNvbnRpbnVlIHJ1bm5pbmcgYW5kIGJlc3Qgd2UgY2FuLgotCQkJCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgY2xhc3M6ICIgKyBjbGFzc05hbWUsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCS8vCQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCS8vCQkJCQlmYWN0b3J5ID0gb2xkQXR0cmlidXRlc0NvZGUoZWxlbWVudCwgZmFjdG9yeSwgY2xhc3NOYW1lLAotCQkJCS8vIHBsdWdpbik7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGxvYWRSZWdpc3RyeShPYmplY3QgY29udGVudFR5cGUpIHsKLQkJTGlzdCBmYWN0b3J5TGlzdCA9IG51bGw7IC8vIG5ldyBWZWN0b3IoKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoU1NFQ29yZVBsdWdpbi5JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJCS8vIHRoaXMgaXMgY2FsbGVkIGEgbG90LCBzbyBkb24ndCBjcmVhdGUgdmVjdG9yIHVubGVzcyByZWFsbHkKLQkJCQkvLyBuZWVkZWQKLQkJCQkvLyBUT0RPOiBjb3VsZCBldmVudHVhbGx5IGNhY2hlIGluIGEgaGFzaHRhYmxlLCBvciBzb21ldGhpbmcsCi0JCQkJLy8gdG8gYXZvaWQgcmVwZWF0IHByb2Nlc3NpbmcKLQkJCQlmYWN0b3J5TGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGxvYWRGYWN0b3J5RnJvbUNvbmZpZ3VyYXRpb25FbGVtZW50KGVsZW1lbnRzW2ldLCBjb250ZW50VHlwZSk7Ci0JCQkJCWlmIChmYWN0b3J5ICE9IG51bGwpCi0JCQkJCQlmYWN0b3J5TGlzdC5hZGQoZmFjdG9yeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWN0b3J5TGlzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3BhcnNlci9Db250ZXh0UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3BhcnNlci9Db250ZXh0UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYWFmZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ29udGV4dFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIFJlZ2lvbnMgb2YgdGhpcyBjbGFzcyBhcmUgaW50ZW5kZWQgc3BlY2lmaWNhbGx5IGZvciBYTUwvSFRNTC9KU1BzLiBPdGhlcgotICogbGFuZ3VhZ2VzIG1heSBuZWVkIHRoZWlyIG93biBzdWJjbGFzc2VzLiAoU2VlIHRoZSB1cGRhdGVNb2RlbCBtZXRob2QpLgotICovCi1wdWJsaWMgY2xhc3MgQ29udGV4dFJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlwcm90ZWN0ZWQgaW50IGZMZW5ndGg7Ci0KLQlwcm90ZWN0ZWQgaW50IGZTdGFydDsKLQlwcm90ZWN0ZWQgaW50IGZUZXh0TGVuZ3RoOwotCXByb3RlY3RlZCBTdHJpbmcgZlR5cGU7Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dFJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ29udGV4dFJlZ2lvbihTdHJpbmcgbmV3Q29udGV4dCwgaW50IG5ld1N0YXJ0LCBpbnQgbmV3VGV4dExlbmd0aCwgaW50IG5ld0xlbmd0aCkgewotCQlmVHlwZSA9IG5ld0NvbnRleHQ7Ci0JCWZTdGFydCA9IG5ld1N0YXJ0OwotCQlmVGV4dExlbmd0aCA9IG5ld1RleHRMZW5ndGg7Ci0JCWZMZW5ndGggPSBuZXdMZW5ndGg7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3QoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gaTsKLQotCX0KLQotCWJvb2xlYW4gYWxsTGV0dGVyT3JEaWdpdChTdHJpbmcgY2hhbmdlcykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkvLyBUT19ET19GVVRVUkU6IGNoZWNrIHRoYXQgYSBKYXZhIExldHRlciBvciBEaWdpdCBpcwotCQkJLy8gdGhlIHNhbWUgdGhpbmcgYXMgYW4gWE1MIGxldHRlciBvciBkaWdpdAotCQkJaWYgKCEoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjaGFuZ2VzLmNoYXJBdChpKSkpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlib29sZWFuIGFsbFdoaXRlU3BhY2UoU3RyaW5nIGNoYW5nZXMpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoYW5nZXMuY2hhckF0KGkpKSkgewotCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlib29sZWFuIGNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdChTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBNYWtlIHN1cmUgd2UgYXJlIGluIGEgbm9uLXdoaXRlIHNwYWNlIGFyZWEKLQkJaWYgKChyZXF1ZXN0U3RhcnQgPD0gKGdldFRleHRFbmQoKSkpICYmIChhbGxMZXR0ZXJPckRpZ2l0KGNoYW5nZXMpKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCWJvb2xlYW4gY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGlmIHdlIGFyZSBpbiB0aGUgIndoaXRlIHNwYWNlIiBhcmVhIG9mIGEgcmVnaW9uLCB0aGVuCi0JCS8vIHdlIGRvbid0IHdhbnQgdG8gaGFuZGxlLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkvLyB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uIGlzIGNvbnNpZGVyIGFueXdoZXJlIHRoYXQgd291bGQKLQkJLy8gbGVhdmUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoaXMgY2hhcmFjdGVyIGFuZCB0aGUgdGV4dCBwYXJ0LgotCQkvLyBhbmQgb2YgY291cnNlLCB3ZSBjYW4gaW5zZXJ0IHdoaXRlc3BhY2UgaW4gd2hpdGVzcGFjZSByZWdpb24KLQkJLy8KLQkJLy8gaWYgdGhlcmUgaXMgbm8gd2hpdGVzcGFjZSBpbiB0aGlzIHJlZ2lvbiwgbm8gbmVlZCB0byBsb29rIGZ1cnRoZXIKLQkJaWYgKGdldEVuZCgpID4gZ2V0VGV4dEVuZCgpKSB7Ci0JCQkvLyBubyBuZWVkIHRvIGFkZCBvbmUgdG8gZW5kIG9mIHRleHQsIGFzIHdlIHVzZWQgdG8sIHNpbmNlIHdlCi0JCQkvLyBjaGFuZ2UgZGVmaW5pdGlvbiBvZiBsZW5ndGggdG8gZXF1YXRlIHRvIG9mZnNldCBwbHVzIG9uZS4KLQkJCWlmIChyZXF1ZXN0U3RhcnQgPiBnZXRUZXh0RW5kKCkpIHsKLQkJCQkvLyBvaywgd2UgYXJlIGluIHRoZSB3aGl0ZXNwYWNlIHJlZ2lvbiwgc28gd2UgY2FuJ3QgaGFuZGxlLAotCQkJCS8vIHVubGVzcwotCQkJCS8vIHdlIGFyZSBqdXN0IGluc2VydGluZyB3aGl0ZXNwYWNlLgotCQkJCWlmIChhbGxXaGl0ZVNwYWNlKGNoYW5nZXMpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHBvc2l0aW9uKSB7Ci0KLQkJcmV0dXJuIGZTdGFydCA8PSBwb3NpdGlvbiAmJiBwb3NpdGlvbiA8IGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZlRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCA9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ID0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoID0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBzdHJpbmcpIHsKLQkJZlR5cGUgPSBzdHJpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgc2hvcnRDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlc3VsdCA9IHNob3J0Q2xhc3NOYW1lICsgIi0tPiAiICsgZ2V0VHlwZSgpICsgIjogIiArIGdldFN0YXJ0KCkgKyAiLSIgKyBnZXRUZXh0RW5kKCkgKyAoZ2V0VGV4dEVuZCgpICE9IGdldEVuZCgpID8gKCIvIiArIGdldEVuZCgpKSA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCS8vIE5PVEU6IGlmIHRoZSBkb2N1bWVudCBoZWxkIGJ5IGFueSByZWdpb24gaGFzIGJlZW4gdXBkYXRlZCBhbmQgdGhlCi0JCS8vIHJlZ2lvbiBvZmZzZXRzIGhhdmUgbm90Ci0JCS8vIHlldCBiZWVuIHVwZGF0ZWQsIHRoZSBvdXRwdXQgZnJvbSB0aGlzIG1ldGhvZCBpbnZhbGlkLgotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIHRoZSBmb3VyIHR5cGVzIHdlIHVzZWQgdG8gaGFuZGxlIGhlcmUsIGhhdmUgYWxsIGJlZW4gbW92ZWQgdG8KLQkJLy8gc3BlY2lmaWMgcmVnaW9uIGNsYXNzZXMuCi0JCS8vIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFCi0JCS8vIFhNTF9UQUdfQVRUUklCVVRFX05BTUUKLQkJLy8gWE1MX0NPTlRFTlQKLQkJLy8gWE1MX0NEQVRBX1RFWFQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3BhcnNlci9Gb3JlaWduUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3BhcnNlci9Gb3JlaWduUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYjVhMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wYXJzZXIvRm9yZWlnblJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBGb3JlaWduUmVnaW9uIGV4dGVuZHMgQ29udGV4dFJlZ2lvbiB7Ci0KLQlwcml2YXRlIFN0cmluZyBsYW5ndWFnZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgc3Vycm91bmRpbmdUYWcgPSBudWxsOwotCi0JcHVibGljIEZvcmVpZ25SZWdpb24oU3RyaW5nIG5ld0NvbnRleHQsIGludCBuZXdTdGFydCwgaW50IG5ld1RleHRMZW5ndGgsIGludCBuZXdMZW5ndGgpIHsKLQkJc3VwZXIobmV3Q29udGV4dCwgbmV3U3RhcnQsIG5ld1RleHRMZW5ndGgsIG5ld0xlbmd0aCk7Ci0JfQotCi0JcHVibGljIEZvcmVpZ25SZWdpb24oU3RyaW5nIG5ld0NvbnRleHQsIGludCBuZXdTdGFydCwgaW50IG5ld1RleHRMZW5ndGgsIGludCBuZXdMZW5ndGgsIFN0cmluZyBuZXdMYW5ndWFnZSkgewotCQlzdXBlcihuZXdDb250ZXh0LCBuZXdTdGFydCwgbmV3VGV4dExlbmd0aCwgbmV3TGVuZ3RoKTsKLQkJc2V0TGFuZ3VhZ2UobmV3TGFuZ3VhZ2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldExhbmd1YWdlKCkgewotCQlyZXR1cm4gbGFuZ3VhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U3Vycm91bmRpbmdUYWcoKSB7Ci0JCXJldHVybiBzdXJyb3VuZGluZ1RhZzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3TGFuZ3VhZ2UKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShqYXZhLmxhbmcuU3RyaW5nIG5ld0xhbmd1YWdlKSB7Ci0JCWxhbmd1YWdlID0gbmV3TGFuZ3VhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1N1cnJvdW5kaW5nVGFnCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3Vycm91bmRpbmdUYWcoamF2YS5sYW5nLlN0cmluZyBuZXdTdXJyb3VuZGluZ1RhZykgewotCQlzdXJyb3VuZGluZ1RhZyA9IG5ld1N1cnJvdW5kaW5nVGFnOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRk9SRUlHTjogIiArIHN1cGVyLnRvU3RyaW5nKCk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0bm9kZSwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IGxlbmd0aERpZmZlcmVuY2UgPSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXMuY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShjaGFuZ2VzLCBsZW5ndGhUb1JlcGxhY2UpOwotCQlmTGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCWZUZXh0TGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQoZmxhdG5vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKSwgcmVxdWVzdGVyLCBmbGF0bm9kZSwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2VmMjc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMgYXJlIG5vdyBtYW5hZ2VkIGJ5IGVhY2ggaW5kaXZpZHVhbAotICogICAgICAgICAgICAgY29udGVudCB0eXBlLiAoWFhDb3JlUHJlZmVyZW5jZU5hbWVzKQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMgewotCVN0cmluZyBUQUJfV0lEVEggPSAidGFiV2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTElORV9XSURUSCA9ICJsaW5lV2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU1BMSVRfTVVMVElfQVRUUlMgPSAic3BsaXRNdWx0aUF0dHJzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIElOREVOVF9VU0lOR19UQUJTID0gImluZGVudFVzaW5nVGFicyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDTEVBUl9BTExfQkxBTktfTElORVMgPSAiY2xlYXJBbGxCbGFua0xpbmVzIjsvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVEFHX05BTUVfQ0FTRSA9ICJ0YWdOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfQ0FTRSA9ICJhdHRyTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBGT1JNQVRUSU5HX1NVUFBPUlRFRCA9ICJmb3JtYXR0aW5nU3VwcG9ydGVkIjsvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgUFJFRkVSUkVEX01BUktVUF9DQVNFX1NVUFBPUlRFRCA9ICJwcmVmZXJyZWRNYXJrdXBDYXNlU3VwcG9ydGVkIjsvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVEFTS19UQUdfVEFHUyA9ICJ0YXNrLXRhZy10YWdzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUQVNLX1RBR19QUklPUklUSUVTID0gInRhc2stdGFnLXByaW9yaXRpZXMiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBU0tfVEFHX0VOQUJMRSA9ICJ0YXNrLXRhZ3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBU0tfVEFHX1BST0pFQ1RTX0lHTk9SRUQgPSAidGFzay10YWctcHJvamVjdHMtdG9JZ25vcmUiOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIHRoZXNlIGFyZSBwcmVmZXJlbmNlcyB0aGF0IHNob3VsZCBiZSBpbmhlcml0ZWQgZnJvbSB0aGUgImVtYmVkZGVkCi0JICogcHJlZmVyZW5jZSBzdG9yZSIgZm9yIGV4YW1wbGU6IGlmIHlvdSBhc2sgZm9yIHRoIE9WRVJWSUVXX1JVTEVSCi0JICogcHJlZmVyZW5jZSBmb3IgSlNQLCB5b3Ugd2lsbCBhdXRvbWF0aWNhbGx5IGdldCB0aGUgcHJlZmVyZW5jZSBmcm9tIHRoZQotCSAqIEhUTUwgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlTdHJpbmcgRU1CRURERURfQ09OVEVOVF9UWVBFX1BSRUZFUkVOQ0VTW10gPSB7VEFCX1dJRFRILCBMSU5FX1dJRFRILCBTUExJVF9NVUxUSV9BVFRSUywgSU5ERU5UX1VTSU5HX1RBQlMsIENMRUFSX0FMTF9CTEFOS19MSU5FUywgVEFHX05BTUVfQ0FTRSwgQVRUUl9OQU1FX0NBU0UsfTsKLQotCVN0cmluZyBGT1JNQVRUSU5HX1BSRUZFUkVOQ0VTW10gPSB7VEFCX1dJRFRILCBMSU5FX1dJRFRILCBTUExJVF9NVUxUSV9BVFRSUywgSU5ERU5UX1VTSU5HX1RBQlMsIENMRUFSX0FMTF9CTEFOS19MSU5FUyx9OwotCi0JU3RyaW5nIEFVVE8gPSAiQXV0byI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBVVEZfOCA9ICJVVEYtOCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBJU09fODg1OV8xID0gIklTTy04ODU5LTEiOy8vJE5PTi1OTFMtMSQKLQotCWludCBBU0lTID0gMDsKLQlpbnQgTE9XRVIgPSAxOwotCWludCBVUFBFUiA9IDI7Ci0KLQkvLyBjbGVhbnVwIHByZWZlcmVuY2UgbmFtZXMKLQlTdHJpbmcgQ0xFQU5VUF9UQUdfTkFNRV9DQVNFID0gImNsZWFudXBUYWdOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDTEVBTlVQX0FUVFJfTkFNRV9DQVNFID0gImNsZWFudXBBdHRyTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTID0gImNvbXByZXNzRW1wdHlFbGVtZW50VGFncyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBJTlNFUlRfUkVRVUlSRURfQVRUUlMgPSAiaW5zZXJ0UmVxdWlyZWRBdHRycyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBJTlNFUlRfTUlTU0lOR19UQUdTID0gImluc2VydE1pc3NpbmdUYWdzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFFVT1RFX0FUVFJfVkFMVUVTID0gInF1b3RlQXR0clZhbHVlcyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBGT1JNQVRfU09VUkNFID0gImZvcm1hdFNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05WRVJUX0VPTF9DT0RFUyA9ICJjb252ZXJ0RU9MQ29kZXMiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0xFQU5VUF9FT0xfQ09ERSA9ICJjbGVhbnVwRU9MQ29kZSI7Ly8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIExBU1RfQUNUSVZFX1BBR0UgPSAibGFzdEFjdGl2ZVBhZ2UiOy8vJE5PTi1OTFMtMSQJCi0KLQkvLyBuZWVkIHRvIHB1dCBkZWZhdWx0IHRhYiB3aWR0aCBwcmVmZXJlbmNlIGhlcmUgc28gaXQgaXMgYWNjZXNzaWJsZSBieQotCS8vIGJvdGggbW9kZWwgYW5kIGVkaXRvcgotCS8vIHRoaXMgd2F5LCBlZGl0b3IgZG9lcyBub3QgbmVlZCB0byBxdWVyeSBtb2RlbCdzIGRlZmF1bHQgdGFiIHdpZHRoCi0JLy8gcHJlZmVyZW5jZQotCWludCBERUZBVUxUX1RBQl9XSURUSCA9IDQ7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUwNTYzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrcy5UYXNrVGFnUHJlZmVyZW5jZUtleXM7Ci0KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyB0YXNrVGFnRGVmYXVsdHMgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSk7Ci0JCXRhc2tUYWdEZWZhdWx0cy5wdXRCb29sZWFuKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUsIGZhbHNlKTsKLQkJdGFza1RhZ0RlZmF1bHRzLnB1dChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfVEFHUywgIlRPRE8sRklYTUUsWFhYIik7IC8vJE5PTi1OTFMtMSQKLQkJdGFza1RhZ0RlZmF1bHRzLnB1dChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUFJJT1JJVElFUywgIjEsMiwxIik7IC8vJE5PTi1OTFMtMSQKLQkJdGFza1RhZ0RlZmF1bHRzLnB1dChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvcGVydHl0ZXN0ZXIvU3RydWN0dXJlZEZpbGVQcm9wZXJ0eVRlc3Rlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm9wZXJ0eXRlc3Rlci9TdHJ1Y3R1cmVkRmlsZVByb3BlcnR5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NGJjMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm9wZXJ0eXRlc3Rlci9TdHJ1Y3R1cmVkRmlsZVByb3BlcnR5VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm9wZXJ0eXRlc3RlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBBIFByb3BlcnR5IFRlc3RlciB0aGF0IG9wZXJhdGVzIG9uIElGaWxlcyBhbmQgdmFsaWRhdGVzCi0gKiB0aGF0IHRoZSBleHBlY3RlZCBjb250ZW50IHR5cGUgaWQgbWF0Y2hlcyB0aGF0IG9mIHRoZSBjb250ZW50Ci0gKiB0eXBlIG9mIHRoZSBmaWxlLCBvciBhbnkgb2YgdGhlIGJhc2UgY29udGVudCB0eXBlcy4KLSAqIAotICogQmFzZWQgb24gb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5wcm9wZXJ0eXRlc3Rlci5GaWxlUHJvcGVydHlUZXN0ZXIKLSAqIAotICogQGRlcHJlY2F0ZWQgdXNlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQgaW5zdGVhZAotICogCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg4MjE2IAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEZpbGVQcm9wZXJ0eVRlc3RlciBleHRlbmRzIFByb3BlcnR5VGVzdGVyIHsKLQotCS8qKgotCSAqIEEgcHJvcGVydHkgaW5kaWNhdGluZyB0aGF0IHdlIGFyZSBsb29raW5nIHRvIHZlcmlmeSB0aGF0IHRoZSBmaWxlIG1hdGNoZXMKLQkgKiB0aGUgY29udGVudCB0eXBlIG1hdGNoaW5nIHRoZSBnaXZlbiBpZGVudGlmaWVyLiBUaGUgaWRlbnRpZmllciBpcwotCSAqIHByb3ZpZGVkIGFzIHRoZSBleHBlY3RlZCB2YWx1ZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ09OVEVOVF9UWVBFX0lEID0gImNvbnRlbnRUeXBlSWQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLklQcm9wZXJ0eVRlc3RlciN0ZXN0KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3RbXSBhcmdzLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQlpZihQUk9QRVJUWV9DT05URU5UX1RZUEVfSUQuZXF1YWxzKHByb3BlcnR5KSAmJiAoZXhwZWN0ZWRWYWx1ZSAhPSBudWxsKSAmJiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBJRmlsZSkgJiYgKChJRmlsZSkgcmVjZWl2ZXIpLmV4aXN0cygpKQotCQkJcmV0dXJuIHRlc3RDb250ZW50VHlwZSgoSUZpbGUpIHJlY2VpdmVyLCBleHBlY3RlZFZhbHVlLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgdGhlIGNvbnRlbnQgdHlwZSBmb3IgPGNvZGU+ZmlsZTwvY29kZT4gKG9yIGFueSBiYXNlIGNvbnRlbnQgdHlwZXMpIAotCSAqIG1hdGNoZXMgdGhlIDxjb2RlPmNvbnRlbnRUeXBlSWQ8L2NvZGU+LiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoaXMgbWV0aG9kIGNhbGwgY291bGQKLQkgKiBjYXVzZSB0aGUgZmlsZSB0byBiZSByZWFkLiBJdCBpcyBhbHNvIHBvc3NpYmxlICh0aHJvdWdoIHBvb3IgcGx1Zy1pbgotCSAqIGRlc2lnbikgZm9yIHRoaXMgbWV0aG9kIHRvIGxvYWQgcGx1Zy1pbnMuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBmaWxlIGZvciB3aGljaCB0aGUgY29udGVudCB0eXBlIHNob3VsZCBiZSBkZXRlcm1pbmVkOyBtdXN0Ci0JICogICAgICAgICAgICBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlSWQKLQkgKiAgICAgICAgICAgIFRoZSBleHBlY3RlZCBjb250ZW50IHR5cGU7IG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGUncyBjb250ZW50IHR5cGUgKG9yIGJhc2UgY29udGVudCB0eXBlcykgCi0JICogICAgICAgICBoYXMgYW4gaWRlbnRpZmllciB0aGF0IG1hdGNoZXMgPGNvZGU+Y29udGVudFR5cGVJZDwvY29kZT47Ci0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB0ZXN0Q29udGVudFR5cGUoZmluYWwgSUZpbGUgZmlsZSwgU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJZmluYWwgU3RyaW5nIGV4cGVjdGVkVmFsdWUgPSBjb250ZW50VHlwZUlkLnRyaW0oKTsKLQotCQl0cnkgewotCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJd2hpbGUgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCQkJaWYgKGV4cGVjdGVkVmFsdWUuZXF1YWxzKGNvbnRlbnRUeXBlLmdldElkKCkpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuZ2V0QmFzZVR5cGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBbMjMyODMxXSAtIExvZyBtZXNzYWdlcyBvbmx5IHdoZW4gZGVidWdnaW5nCi0JCQlpZihMb2dnZXIuREVCVUcpCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0Fic3RyYWN0QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhOWM4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0Fic3RyYWN0QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBJQWRhcHRlckZhY3RvcnkuIEFsbCBpbXBsZW1lbnRlcnMgb2YKLSAqIElBZGFwdGVyRmFjdG9yeSBzaG91bGQgc3ViY2xhc3MgdGhpcyBjbGFzcy4gVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgdXNlcwotICogaXRzZWxmICh0aGlzKSBhcyB0aGUga2V5LiBTdWJjbGFzc2VzIG5lZWQgdG8gcHJvdmlkZSBhIHdheSB0byBjcmVhdGUgdGhlCi0gKiBhZGFwdGVyLCBhbmQgY2FuIG92ZXJyaWRlIG9yIGNhbGwgb3RoZXIgbWV0aG9kcy4KLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQotCi0KLQlwcml2YXRlIE9iamVjdCBmQWRhcHRlcktleTsKLQotCXByaXZhdGUgYm9vbGVhbiBmU2hvdWxkUmVnaXN0ZXJBZGFwdGVyOwotCi0JLyoqCi0JICogSWYgdGhpcyBkZWZhdWx0IGNvbnN0cnVjdG9yIHVzZWQsIHNldEFkYXB0ZXJLZXkgYW5kIHNldFNob3VsZFJlZ2lzdGVyCi0JICogc2hvdWxkIGJlIHVzZWQgdG8gcHJvcGVybHkgaW5pdGlhbGl6ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQotCX0KLQotCi0JcHVibGljIEFic3RyYWN0QWRhcHRlckZhY3RvcnkoT2JqZWN0IGFkYXB0ZXJLZXkpIHsKLQkJdGhpcyhhZGFwdGVyS2V5LCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWNsYXNzZXMgbWF5IGV4dGVuZGVkIHRoaXMgY29uc3RydWN0b3IsIGlmIG5lZWRlZC4KLQkgKi8KLQotCXB1YmxpYyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5KE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQotCQlzdXBlcigpOwotCQlmQWRhcHRlcktleSA9IGFkYXB0ZXJLZXk7Ci0JCWZTaG91bGRSZWdpc3RlckFkYXB0ZXIgPSByZWdpc3RlckFkYXB0ZXJzOwotCi0JfQotCi0JLyoqCi0JICogSVNTVUU6IHNob3VsZCBiZSBmaW5hbC4gU2VlIHRob3NlIHRoYXQgaW1wbGVtZW50IGl0IAotCSAqIGZvciBjb21wbGljYXRpbmcgZGV0YWlscyBhbmQgInVua25vd25zIi4gCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0JCWlmICh0YXJnZXQgIT0gbnVsbCkgewotCQkJYWRhcHRlciA9IHRhcmdldC5nZXRFeGlzdGluZ0FkYXB0ZXIoZkFkYXB0ZXJLZXkpOwotCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCWFkYXB0ZXIgPSBhZGFwdE5ldyh0YXJnZXQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG5vcm1hbGx5IGltcGxlbWVudCB0aGVpciBvd24gJ2NvcHknIG1ldGhvZC4gQnkKLQkgKiBkZWZhdWx0LCB3ZSdsbCByZXR1cm4gdGhlIHNhbWUgaW5zdGFuY2UsIGZvciBjb252ZW5pZW5jZSBvZiB0aG9zZSB1c2luZwotCSAqIHNpbmdsZXRvbiBmYWN0b3JpZXMgKHdoaWNoIGhhdmUgbm8gc3RhdGUsIGFuZCBzbyBuZWVkIHRvIGRvIGFueXRoaW5nIG9uCi0JICogJ3JlbGVhc2UnKS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBuZWVkcyB0byByZXR1cm4gdHJ1ZSBvZiB0aGlzIGZhY3RvcnkgaXMgZm9yIGFkYXB0ZXJzIG9mCi0JICogdHlwZSAndHlwZScuIEl0IGlzIHJlcXVpcmVkIHRoYXQgaXQgcmV0dXJuIHRydWUgaWYgJ2VxdWFscycgYW5kIHRoaXMKLQkgKiBkZWZhdWx0IGJlaGF2aW9yIGlzIHByb3ZpZGVkIGJ5IHRoaXMgc3VwZXIgY2xhc3MuIENsaWVudHMgbWF5IGV4dGVuZAotCSAqIHRoaXMgYmVoYXZpb3IgaWYgbW9yZSBjb21wbGV4IGxvZ2ljIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUuZXF1YWxzKGZBZGFwdGVyS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBuZWVkIHRvICJjbGVhbnVwIiB0aGVpciBhZGFwdGVyIGZhY3RvcnksIHJlbGVhc2UKLQkgKiBhZGFwdGVycywgcmVzb3VyY2VzLCBldGMuIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCBpZiBzdWNoCi0JICogY2xlYW4gdXAgaXMgcmVxdWlyZWQuIE5vdGU6IHdoaWxlIGN1cnJlbnQgYmVoYXZpb3IgaXMgdG8gZG8gbm90aGluZywKLQkgKiBzdWJjbGFzc2VzIHNob3VsZCBub3QgYXNzdW1lIHRoaXMgd291bGQgYWx3YXlzIGJlIHRydWUsIHNvIHNob3VsZAotCSAqIGFsd2F5cyBjYWxsIHN1cGVyLnJlbGVhc2UgYXQgdGhlIGVuZCBvZiB0aGVpciBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZGVmYXVsdCBmb3Igc3VwZXJjbGFzcyBpcyB0byBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogT25seSBmb3Igc3BlY2lhbCBjYXNlcyB0aGVyZSB0aGUgYWRhcHRlciBrZXkgY2FuIGJlIHNldCBpbiB0aGUKLQkgKiBjb25zdHJ1Y3Rvci4gSXQgY2FuIGJlIHNldCBoZXJlLiBJZiBpdCBpcyBzZXQgbW9yZSB0aGFuLCBhbmQKLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBzZXRBZGFwdGVyS2V5KE9iamVjdCBrZXkpIHsKLQkJaWYgKGZBZGFwdGVyS2V5ICE9IG51bGwgJiYgIShmQWRhcHRlcktleS5lcXVhbHMoa2V5KSkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJTm9kZUFkYXB0ZXIgS2V5IGNhbm5vdCBiZSBjaGFuZ2VkLiIpOyAvLyROT04tTkxTLTEkCi0JCWZBZGFwdGVyS2V5ID0ga2V5OwotCX0KLQotCS8qKgotCSAqIENhbiBiZSBjYWxsZWQgYnkgc3ViY2xhc3NlcyBkdXJpbmcgJ2FkYXB0JyBwcm9jZXNzLCBidXQgbXVzdCBub3QgYmUKLQkgKiBvdmVycmlkZGVuIG9yIHJlaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJTm9kZUFkYXB0ZXIgYWRhcHROZXcoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBjcmVhdGVBZGFwdGVyKHRhcmdldCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCWlmIChmU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKSB7Ci0JCQkJdGFyZ2V0LmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZC4gSXQgaXMgY2FsbGVkIGJ5IGluZnJhc3RydWN0dXJlCi0JICogd2hlbiBhbiBpbnN0YW5jZSBpcyBuZWVkZWQuIEl0IGlzIHByb3ZpZGVkIHRoZSBub2RlIG5vdGlmaWVyLCB3aGljaCBtYXkKLQkgKiBvciBtYXkgbm90IGJlIHJlbGV2ZW50IHdoZW4gY3JlYXRpbmcgdGhlIGFkYXB0ZXIuIE5vdGU6IHRoZSBhZGFwdGVyCi0JICogZG9lcyBub3QgaGF2ZSB0byBsaXRlcmFsbHkgYmUgYSBuZXcgaW50YW5jZSBhbmQgaXMgYWN0dWFsbHkgcmVjb21tZW5kZWQKLQkgKiB0byB0eXBpY2FsbHkgYmUgYSBzaW5nbGV0b24gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCi0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEByZXR1cm4KLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpOwotCi0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIGZTaG91bGRSZWdpc3RlckFkYXB0ZXI7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRTaG91bGRSZWdpc3RlckFkYXB0ZXIoYm9vbGVhbiBzaG91bGRSZWdpc3RlckFkYXB0ZXIpIHsKLQkJLy8gSVNTVUU6IHRlY2huaWNhbGx5IHdlIHByb2JhYmx5IHNob3VsZCBub3QgYWxsb3cgdGhpcyB2YWx1ZSB0bwotCQkvLyBjaGFuZ2UsIGFmdGVyIGluaXRpYWxpemF0aW9uLCBidXQgaXMgbm90IHNvIGVhc3kgdG8gZG8sCi0JCS8vIGFuZCBJJ20gbm90IHN1cmUgaXRzICJ3b3J0aCIgdGhlIHByb3RlY3Rpb24uCi0JCWZTaG91bGRSZWdpc3RlckFkYXB0ZXIgPSBzaG91bGRSZWdpc3RlckFkYXB0ZXI7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IGdldEFkYXB0ZXJLZXkoKSB7Ci0JCXJldHVybiBmQWRhcHRlcktleTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0Fic3RyYWN0Tm90aWZpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQWJzdHJhY3ROb3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjE4NDcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQWJzdHJhY3ROb3RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci0KLQotCi0vKioKLSAqIEFic3RyYWN0Tm90aWZpZXIgaXMgc2ltaWxhciB0byAoYW5kIGJhc2VkIG9uKSB0aGUgRU1GIE5vdGlmaWVySW1wbCBjbGFzcywKLSAqIGJ1dCBpcyBub3QgcmVsYXRlZCB0byBFTUYgcGVyIHNlLiBUaGlzIGNsYXNzIGlzIHNpbXBsZXIgKHRoYXQgaXMsIG5vdCBhcwotICogbWFueSBmdW5jdGlvbnMpLgotICogCi0gKiBJbXBsZW1lbnRlcnMgb2YgdGhpcyBJTm9kZU5vdGlmaWVyIG11c3Qgc3ViY2xhc3MgdGhpcyBjbGFzcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Tm90aWZpZXIgaW1wbGVtZW50cyBJTm9kZU5vdGlmaWVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgZ3Jvd3RoQ29uc3RhbnQgPSAzOwotCXByaXZhdGUgaW50IGFkYXB0ZXJDb3VudCA9IDA7Ci0KLQlwcml2YXRlIElOb2RlQWRhcHRlcltdIGZBZGFwdGVyczsKLQotCS8qKgotCSAqIEFic3RyYWN0Tm90aWZpZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3ROb3RpZmllcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGRBZGFwdGVyIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRBZGFwdGVyKElOb2RlQWRhcHRlciBhZGFwdGVyKSB7Ci0KLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZW5zdXJlQ2FwYWNpdHkoYWRhcHRlckNvdW50ICsgMSk7Ci0JCWZBZGFwdGVyc1thZGFwdGVyQ291bnQrK10gPSBhZGFwdGVyOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgZW5zdXJlQ2FwYWNpdHkoaW50IG5lZWRlZCkgewotCQlpZiAoZkFkYXB0ZXJzID09IG51bGwpIHsKLQkJCS8vIGZpcnN0IHRpbWUKLQkJCWZBZGFwdGVycyA9IG5ldyBJTm9kZUFkYXB0ZXJbbmVlZGVkICsgZ3Jvd3RoQ29uc3RhbnRdOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBvbGRMZW5ndGggPSBmQWRhcHRlcnMubGVuZ3RoOwotCQlpZiAob2xkTGVuZ3RoIDwgbmVlZGVkKSB7Ci0JCQlJTm9kZUFkYXB0ZXJbXSBvbGRBZGFwdGVycyA9IGZBZGFwdGVyczsKLQkJCUlOb2RlQWRhcHRlcltdIG5ld0FkYXB0ZXJzID0gbmV3IElOb2RlQWRhcHRlcltuZWVkZWQgKyBncm93dGhDb25zdGFudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEFkYXB0ZXJzLCAwLCBuZXdBZGFwdGVycywgMCwgYWRhcHRlckNvdW50KTsKLQkJCWZBZGFwdGVycyA9IG5ld0FkYXB0ZXJzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTk9UIEFQSTogdXNlZCBvbmx5IGZvciB0ZXN0aW5nLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRBZGFwdGVyQ291bnQoKSB7Ci0JCXJldHVybiBhZGFwdGVyQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBiZWhhdmlvciBmb3IgZ2V0dGluZyBhbiBhZGFwdGVyLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSU5vZGVBZGFwdGVyIGdldEFkYXB0ZXJGb3IoT2JqZWN0IHR5cGUpIHsKLQkJLy8gZmlyc3QsIHdlJ2xsIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgb25lCi0JCUlOb2RlQWRhcHRlciByZXN1bHQgPSBnZXRFeGlzdGluZ0FkYXB0ZXIodHlwZSk7Ci0JCS8vIGlmIHdlIGRpZG4ndCBmaW5kIG9uZSBpbiBvdXIgbGlzdCBhbHJlYWR5LAotCQkvLyBsZXQncyBjcmVhdGUgaXQKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlGYWN0b3J5UmVnaXN0cnkgcmVnID0gZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCQlpZiAocmVnICE9IG51bGwpIHsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSByZWcuZ2V0RmFjdG9yeUZvcih0eXBlKTsKLQkJCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IGZhY3RvcnkuYWRhcHQodGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJLy8gV2Ugd29uJ3QgcHJldmVudCBudWxsIGZyb20gYmVpbmcgcmV0dXJuZWQsIGJ1dCBpdCB3b3VsZCBiZQotCQkJLy8gdW51c3VhbC4KLQkJCS8vIEl0IG1pZ2h0IGJlIGJlY2F1c2UgRmFjdG9yeSBpcyBub3Qgd29ya2luZyBjb3JyZWN0bHksIG9yCi0JCQkvLyBub3QgaW5zdGFsbGVkLCBzbyB3ZSdsbCBhbGxvdyB3YXJuaW5nIG1lc3NhZ2UuCi0JCQlpZiAoKHJlc3VsdCA9PSBudWxsKSAmJiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcuZGlzcGxheVdhcm5pbmdzKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogbm8gYWRhcHRlciB3YXMgZm91bmQgb3IgY3JlYXRlZCBmb3IgIiArIHR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhbGxvdyBjbG9uZSBvZiBsaXN0LCBzaW5jZSBjbGllbnRzIHNob3VsZCBub3QgbWFuaXB1bGF0ZQotCSAqIG91ciBsaXN0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCB1c2UgYWRkL3JlbW92ZUFkYXB0ZXIuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uIGdldEFkYXB0ZXJzKCkgewotCQlpZiAoZkFkYXB0ZXJzICE9IG51bGwpIHsKLQkJCWlmIChhZGFwdGVyQ291bnQgPT0gMCkgewotCQkJCWZBZGFwdGVycyA9IG51bGw7Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3ZSBuZWVkIHRvIG1ha2UgYSBuZXcgYXJyYXksIHRvIGJlIHN1cmUKLQkJCQkvLyBpdCBkb2Vzbid0IGNvbnRhaW4gbnVsbHMgYXQgZW5kLCB3aGljaCBtYXkgYmUKLQkJCQkvLyBwcmVzZW50IHRoZXJlIGZvciAiZ3Jvd3RoIi4KLQkJCQlJTm9kZUFkYXB0ZXJbXSB0ZW1wQWRhcHRlcnMgPSBuZXcgSU5vZGVBZGFwdGVyW2FkYXB0ZXJDb3VudF07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShmQWRhcHRlcnMsIDAsIHRlbXBBZGFwdGVycywgMCwgYWRhcHRlckNvdW50KTsKLQkJCQkvLyBFTUYgdXNlcyB0aGUgdW5tb2RpZmlhYmxlQ29sbGVjdGlvbi4gSXRzIGEgYml0IG9mIGEKLQkJCQkvLyBwZXJmb3JtYW5jZQotCQkJCS8vIGRyYWluLCBidXQgbWF5IHdhbnQgdG8gbGVhdmUgaW4gc2luY2UKLQkJCQkvLyBpdCB3b3VsZCAiZmFpbCBmYXN0IiBpZiBzb21lb25lIHdhcyB0cnlpbmcgdG8gbW9kaWZ5IHRoZQotCQkJCS8vIGxpc3QuCi0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oQXJyYXlzLmFzTGlzdCh0ZW1wQWRhcHRlcnMpKTsKLQkJCQkvLyByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXdBZGFwdGVycyk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHJpdmF0ZSBsb25nIGdldEFkYXB0ZXJUaW1lQ3JpdGVyaWEoKSB7Ci0JCS8vIHRvICJyZS1nZXQiIHRoZSBwcm9wZXJ0eSBlYWNoIHRpbWUgaXMgYSBsaXR0bGUgYXdrd2FyZCwgYnV0IHdlCi0JCS8vIGRvIGl0IHRoYXQgd2F5IHRvIGF2b2lkIGFkZGluZyBpbnN0YW5jZSB2YXJpYWJsZSBqdXN0IGZvcgotCQkvLyBkZWJ1Z2dpbmcuCi0JCS8vIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBkZWJ1Z0FkYXB0ZXJOb3RpZmNhdGlvblRpbWUKLQkJLy8gaXMgdHJ1ZS4KLQkJZmluYWwgU3RyaW5nIGNyaXRlcmlhU3RyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb20vYWRhcHRlci9ub3RpZmljYXRpb24vdGltZS9jcml0ZXJpYSIpOyAvLyROT04tTkxTLTEkCi0JCWxvbmcgY3JpdGVyaWEgPSAtMTsKLQkJaWYgKGNyaXRlcmlhU3RyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJY3JpdGVyaWEgPSBMb25nLnBhcnNlTG9uZyhjcml0ZXJpYVN0cik7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjYXRjaCB0byBiZSBzdXJlIHdlIGRvbid0IGJ1cmIgaW4gbm90aWZpY2F0aW9uIGxvb3AsCi0JCQkJLy8gYnV0IGlnbm9yZSwgc2luY2UganVzdCBhIGRlYnVnIGFpZAotCQkJfQotCQl9Ci0JCXJldHVybiBjcml0ZXJpYTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIElOb2RlQWRhcHRlciBnZXRFeGlzdGluZ0FkYXB0ZXIoT2JqZWN0IHR5cGUpIHsKLQkJSU5vZGVBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlckNvdW50OyBpKyspIHsKLQkJCUlOb2RlQWRhcHRlciBhID0gZkFkYXB0ZXJzW2ldOwotCQkJaWYgKGEgIT0gbnVsbCAmJiBhLmlzQWRhcHRlckZvclR5cGUodHlwZSkpIHsKLQkJCQlyZXN1bHQgPSBhOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8vIGlmIHdlIGRpZG4ndCBmaW5kIG9uZSBpbiBvdXIgbGlzdCwKLQkJLy8gcmV0dXJuIHRoZSBudWxsIHJlc3VsdAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCWFic3RyYWN0IHB1YmxpYyBGYWN0b3J5UmVnaXN0cnkgZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnkoaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCi0JCWludCBsb2NhbEFkYXB0ZXJDb3VudCA9IDA7Ci0JCUlOb2RlQWRhcHRlcltdIGxvY2FsQWRhcHRlcnMgPSBudWxsOwotCi0JCS8vIGxvY2sgb2JqZWN0IHdoaWxlIG1ha2luZyBsb2NhbCBhc3NpZ25tZW50cwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmIChmQWRhcHRlcnMgIT0gbnVsbCkgewotCQkJCWxvY2FsQWRhcHRlckNvdW50ID0gYWRhcHRlckNvdW50OwotCQkJCWxvY2FsQWRhcHRlcnMgPSBuZXcgSU5vZGVBZGFwdGVyW2xvY2FsQWRhcHRlckNvdW50XTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZBZGFwdGVycywgMCwgbG9jYWxBZGFwdGVycywgMCwgbG9jYWxBZGFwdGVyQ291bnQpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEFkYXB0ZXJDb3VudDsgaSsrKSB7Ci0JCQlJTm9kZUFkYXB0ZXIgYSA9IGxvY2FsQWRhcHRlcnNbaV07Ci0KLQkJCWlmIChMb2dnZXIuREVCVUdfQURBUFRFUk5PVElGSUNBVElPTlRJTUUpIHsKLQkJCQlsb25nIGdldEFkYXB0ZXJUaW1lQ3JpdGVyaWEgPSBnZXRBZGFwdGVyVGltZUNyaXRlcmlhKCk7Ci0JCQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkvLyAqKiBrZWVwIHRoaXMgbGluZSBpZGVudGljYWwgd2l0aCBub24tZGVidWcgdmVyc2lvbiEhCi0JCQkJYS5ub3RpZnlDaGFuZ2VkKHRoaXMsIGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKTsKLQkJCQlsb25nIG5vdGlmeUR1cmF0aW9uID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7Ci0JCQkJaWYgKGdldEFkYXB0ZXJUaW1lQ3JpdGVyaWEgPj0gMCAmJiBub3RpZnlEdXJhdGlvbiA+IGdldEFkYXB0ZXJUaW1lQ3JpdGVyaWEpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJhZGFwdGVyIG5vdGlmeUR1cmF0aW9uOiAiICsgbm90aWZ5RHVyYXRpb24gKyAiICBjbGFzczogIiArIGEuZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXRyeSB7Ci0JCQkJCS8vICoqIGtlZXAgdGhpcyBsaW5lIGlkZW50aWNhbCB3aXRoIGRlYnVnIHZlcnNpb24hIQotCQkJCQlhLm5vdGlmeUNoYW5nZWQodGhpcywgZXZlbnRUeXBlLCBjaGFuZ2VkRmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwb3MpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSXRzIGltcG9ydGFudCB0byAia2VlcCBnb2luZyIsIHNpbmNlIG5vdGlmaWNhdGlvbnMKLQkJCQkJLy8gb2NjdXIgYmV0d2VlbiBhbgotCQkJCQkvLyBhYm91dFRvQ2hhbmdlIGV2ZW50IGFuZCBhIGNoYW5nZWQgZXZlbnQgLS0gdGhlCi0JCQkJCS8vIGNoYW5nZWQgZXZlbnQgdHlwaWNhbGx5IGJlaW5nIHJlcXVpcmUKLQkJCQkJLy8gdG8gcmVzdG9yZSBzdGF0ZSwgZXRjLiBTbywgd2UganVzdCBsb2cgbWVzc2FnZSwgZG8KLQkJCQkJLy8gbm90IHJlLXRocm93IGl0LCBidXQKLQkJCQkJLy8gdHlwaWNhbGx5IHRoZSBleGNlcHRpb24gZG9lcyBpbmRpY2F0ZSBhIHNlcmlvdXMKLQkJCQkJLy8gcHJvZ3JhbSBlcnJvci4KLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQSBzdHJ1Y3R1cmVkIG1vZGVsIGNsaWVudCwgIiArIGEgKyAiIHRocmV3IGZvbGxvd2luZyBleGNlcHRpb24gZHVyaW5nIGFkYXB0ZXIgbm90aWZpY2F0aW9uICgiICsgSU5vZGVOb3RpZmllci5FVkVOVF9UWVBFX1NUUklOR1NbZXZlbnRUeXBlXSArICIgKSIsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCX0KLQotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUFkYXB0ZXIoSU5vZGVBZGFwdGVyIGEpIHsKLQkJaWYgKGZBZGFwdGVycyA9PSBudWxsIHx8IGEgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IG5ld0luZGV4ID0gMDsKLQkJSU5vZGVBZGFwdGVyW10gbmV3QWRhcHRlcnMgPSBuZXcgSU5vZGVBZGFwdGVyW2ZBZGFwdGVycy5sZW5ndGhdOwotCQlpbnQgb2xkQWRhcHRlckNvdW50ID0gYWRhcHRlckNvdW50OwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IG9sZEluZGV4ID0gMDsgb2xkSW5kZXggPCBvbGRBZGFwdGVyQ291bnQ7IG9sZEluZGV4KyspIHsKLQkJCUlOb2RlQWRhcHRlciBjYW5kaWRhdGUgPSBmQWRhcHRlcnNbb2xkSW5kZXhdOwotCQkJaWYgKGEgPT0gY2FuZGlkYXRlKSB7Ci0JCQkJYWRhcHRlckNvdW50LS07Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJfQotCQkJZWxzZQotCQkJCW5ld0FkYXB0ZXJzW25ld0luZGV4KytdID0gZkFkYXB0ZXJzW29sZEluZGV4XTsKLQkJfQotCQlpZiAoZm91bmQpCi0JCQlmQWRhcHRlcnMgPSBuZXdBZGFwdGVyczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvRG9jdW1lbnRDaGFuZ2VkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0RvY3VtZW50Q2hhbmdlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDdhNGVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvRG9jdW1lbnRDaGFuZ2VkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLk1vZGVsTGlmZWN5Y2xlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotcHVibGljIGNsYXNzIERvY3VtZW50Q2hhbmdlZCBleHRlbmRzIE1vZGVsTGlmZWN5Y2xlRXZlbnQgewotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmTmV3RG9jdW1lbnQ7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZk9sZERvY3VtZW50OwotCi0JcHJvdGVjdGVkIERvY3VtZW50Q2hhbmdlZCgpIHsKLQotCQlzdXBlcihNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX0RPQ1VNRU5UX0NIQU5HRUQpOwotCi0JfQotCi0JcHJvdGVjdGVkIERvY3VtZW50Q2hhbmdlZChpbnQgYWRkaXRpb25hbFR5cGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQotCQlzdXBlcihtb2RlbCwgTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9ET0NVTUVOVF9DSEFOR0VEIHwgYWRkaXRpb25hbFR5cGUpOwotCi0JfQotCi0JcHVibGljIERvY3VtZW50Q2hhbmdlZChpbnQgYWRkaXRpb25hbFR5cGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgb2xkRG9jdW1lbnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3RG9jdW1lbnQpIHsKLQotCQl0aGlzKGFkZGl0aW9uYWxUeXBlLCBtb2RlbCk7Ci0JCWZPbGREb2N1bWVudCA9IG9sZERvY3VtZW50OwotCQlmTmV3RG9jdW1lbnQgPSBuZXdEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXROZXdEb2N1bWVudCgpIHsKLQotCQlyZXR1cm4gZk5ld0RvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldE9sZERvY3VtZW50KCkgewotCi0JCXJldHVybiBmT2xkRG9jdW1lbnQ7Ci0JfQotCi0Jdm9pZCBzZXROZXdEb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG5ld0RvY3VtZW50KSB7Ci0KLQkJZk5ld0RvY3VtZW50ID0gbmV3RG9jdW1lbnQ7Ci0JfQotCi0Jdm9pZCBzZXRPbGREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG9sZERvY3VtZW50KSB7Ci0KLQkJZk9sZERvY3VtZW50ID0gb2xkRG9jdW1lbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2Y4MzUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuTW9kZWxMaWZlY3ljbGVFdmVudDsKLQotLyoqCi0gKiBUaGlzIGlzIGFuIGVhcmx5IHZlcnNpb24gb2YgYSBjbGFzcyB0aGF0IG1heSBjaGFuZ2Ugb3ZlciB0aGUgbmV4dCBmZXcKLSAqIG1pbGVzdG9uZXMuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciB7Ci0KLQl2b2lkIHByb2Nlc3NQb3N0TW9kZWxFdmVudChNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50KTsKLQotCXZvaWQgcHJvY2Vzc1ByZU1vZGVsRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzMDhmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLS8qKgotICogUmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGEgbmV3IE1vZGVsIGZyb20gYSByZXNvdXJjZSwgb3IgYXMgYSBuZXcsIGVtcHR5Ci0gKiBpbnN0YW5jZS4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbExvYWRlciB7Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHBlcmZvcm0gYWxsIHRoZSBtb2RlbCBpbml0aWFsaXphdGlvbiByZXF1aXJlZCBiZWZvcmUKLQkgKiBpdCBjb250YWlucyBjb250ZW50LCBuYW1lbHksIGl0IHNob3VsZCBjYWxsIG5ld01vZGVsLCB0aGUKLQkgKiBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgdGhlbiBzZXRBZGFwdGVyRmFjdG9yaWVzLiAodGhpcyBpcwotCSAqIHRlbnRhdGl2ZSkKLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU1vZGVsKCk7Ci0KLQkvKioKLQkgKiBNZXRob2QgY3JlYXRlTW9kZWwuIENyZWF0ZXMgYSBuZXcgbW9kZWwgYmFzZWQgb24gb2xkIG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkTW9kZWwKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkTW9kZWwKLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdGhvc2UgZmFjdG9yaWVzIHdoaWNoIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlCi0JICogc3RydWN0dXJlZE1vZGVsIGJlZm9yZSBjb250ZW50IGlzIGFwcGxpZWQuCi0JICovCi0JTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCk7Ci0KLQl2b2lkIGxvYWQoSUZpbGUgZmlsZSwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0Jdm9pZCBsb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQl2b2lkIGxvYWQoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgU3RyaW5nIGVuY29kaW5nTmFtZSwgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCUlNb2RlbExvYWRlciBuZXdJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGFsd2F5cyByZXR1cm4gYW4gbmV3LCBlbXB0eSBTdHJ1Y3R1cmVkIE1vZGVsCi0JICogYXBwcm9wcmlhdGUgZm9yIGl0c2VsZi4KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKCk7Ci0KLQlJU3RydWN0dXJlZE1vZGVsIHJlaW5pdGlhbGl6ZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBnZXQgYSBmcmVzaCBjb3B5IG9mIHRoZSBkYXRhLCBhbmQgcmVwb3B1bGF0ZSB0aGUKLQkgKiBtb2RlbHMgLi4uIG5vcm1hbGx5IGJ5IGEgY2FsbCB0byBzZXRUZXh0IG9uIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZvcgotCSAqIFN0cnVjdHVyZWRNb2RlbHMuIFRoaXMgbWV0aG9kIGlzIG5lZWRlZCBpbiBzb21lIGNhc2VzIHdoZXJlIGNsaWVudHMgYXJlCi0JICogc2hhcmluZyBhIG1vZGVsIGFuZCB0aGVuIGNoYW5nZXMgY2FuY2VsZWQuIFNheSBmb3IgZXhhbXBsZSwgb25lIGVkaXRvcgotCSAqIGFuZCBzZXZlcmFsICJkaXNwbGF5cyIgYXJlIHNoYXJpbmcgYSBtb2RlbCwgaWYgdGhlIGVkaXRvciBpcyBjbG9zZWQKLQkgKiB3aXRob3V0IHNhdmluZyBjaGFuZ2VzLCB0aGVuIHRoZSBkaXNwbGF5cyBzdGlsbCBuZWVkIGEgbW9kZWwsIGJ1dCB0aGV5Ci0JICogc2hvdWxkIHJldmVydCB0byB0aGUgb3JpZ2luYWwgdW5zYXZlZCB2ZXJzaW9uLgotCSAqLwotCXZvaWQgcmVsb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIFN0cnVjdHVyZWQgTW9kZWwgd2l0aCB0aGUgZ2l2ZW4gU3RydWN0dXJlZERvY3VtZW50IGluc3RhbmNlIGFzCi0JICogaXRzIGRvY3VtZW50IChpbnN0ZWFkIG9mIGEgbmV3IGRvY3VtZW50IGluc3RhbmNlIGFzIHdlbGwpCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVNb2RlbChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgYmFzZUxvY2F0aW9uLCBJTW9kZWxIYW5kbGVyIGhhbmRsZXIpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb2RlbE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjNkMGZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VBbHJlYWR5RXhpc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLQotLyoqCi0gKiA8cD4KLSAqIFByb3ZpZGVzIEFQSXMgZm9yIG1hbmFnaW5nIChnZXQsIHJlbGVhc2UsIHNhdmUsIGFuZCBzYXZlIGFzKSBTU0UgU3RydWN0dXJlZAotICogTW9kZWxzLgotICogPC9wPgotICogPHA+Ci0gKiBTdHJ1Y3R1cmVkIE1vZGVscyBjcmVhdGVkIGZyb20gYW4gaW1wbGVtZW50b3Igb2YgdGhpcyBpbnRlcmZhY2UgY2FuIGJlCi0gKiBlaXRoZXIgbWFuYWdlZCBvciB1bm1hbmFnZWQuIE1hbmFnZWQgbW9kZWxzIGFyZSBzaGFyZWQgdXNpbmcgcmVmZXJlbmNlCi0gKiBjb3VudHMsIHNvIHVudGlsIHRoYXQgY291bnQgaGFzIGJlZW4gZGVjcmVtZW50ZWQgdG8gemVybywgdGhlIG1vZGVsIHdpbGwKLSAqIGNvbnRpbnVlIHRvIGV4aXN0IGluIG1lbW9yeS4gV2hlbiBtYW5hZ2VkLCBtb2RlbHMgY2FuIGJlIGxvb2tlZCB1cCB1c2luZwotICogdGhlaXIgSURzIG9yIHRoZWlyIElTdHJ1Y3R1cmVkRG9jdW1lbnRzLCB3aGljaCBjYW4gYmUgYWR2YW50YWdlb3VzIHdoZW4KLSAqIGJ1aWxkaW5nIG9uIEFQSXMgdGhhdCBhcmVuJ3Qgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIGZvciBTU0UgKHN1Y2ggYXMgdGhvc2UKLSAqIHJldm9sdmluZyBhcm91bmQgSURvY3VtZW50cykuIFVubWFuYWdlZCBtb2RlbHMgb2ZmZXIgbm8gc3VjaCBmZWF0dXJlcywgYW5kCi0gKiBhcmUgbGFyZ2VseSB1c2VkIGZvciB0YXNrcyB3aGVyZSB0aGVpciBjb250ZW50cyBhcmUgZXBoZW1lcmFsLCBzdWNoIGFzIGZvcgotICogcG9wdWxhdGluZyBhIHNvdXJjZSB2aWV3ZXIgd2l0aCBzeW50YXgtY29sb3JlZCBjb250ZW50LgotICogPC9wPgotICogPHA+Ci0gKiBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGFjY2VzcyB1c2VkIHdoZW4gcmV0cmlldmluZyBhIG1vZGVsIGZyb20gdGhlIG1vZGVsCi0gKiBtYW5hZ2VyOiBSRUFEIGFuZCBFRElULiBUaGUgY29udGVudHMgb2YgYSBtb2RlbCBjYW4gYmUgbW9kaWZpZWQgcmVnYXJkbGVzcwotICogb2Ygd2hpY2ggYWNjZXNzIHR5cGUgaXMgdXNlZCwgYnV0IGFueSBjbGllbnQgd2hvIGdldHMgYSBtb2RlbCBmb3IgRURJVCBpcwotICogZXhwbGljaXRseSBkZWNsYXJpbmcgdGhhdCB0aGV5IGFyZSBpbnRlcmVzdGVkIGluIHNhdmluZyB0aG9zZSBjaGFuZ2VkCi0gKiBjb250ZW50cy4gVGhlIEVESVQgYW5kIFJFQUQgcmVmZXJlbmNlIGNvdW50cyBhcmUgdmlzaWJsZSB0byBldmVyeW9uZSwgYXMKLSAqIGFyZSBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIGEgbWFuYWdlZCBtb2RlbCBpcyBzaGFyZWQKLSAqIGFtb25nIG11bHRpcGxlIGNsaWVudHMgYWNjZXNzaW5nIGl0IGZvciBSRUFEIG9yIEVESVQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIE1hbmFnZWQgbW9kZWxzIHdob3NlIGNvbnRlbnRzIGFyZSAiZGlydHkiIHdpdGggUkVBRCBhbmQgRURJVCBjb3VudHMgYWJvdmUKLSAqIHplcm8gd2lsbCBiZSByZXZlcnRlZCB0byB0aGUgb24tZGlzayBjb250ZW50IGlmIHRoZSBFRElUIGNvdW50IGRyb3BzIHRvCi0gKiB6ZXJvIHdoaWxlIHRoZSBSRUFEIGNvdW50IHJlbWFpbnMgYWJvdmUgemVyby4KLSAqIDwvcD4KLSAqIDxwPgotICogU2hhcmVkIG1vZGVscyBmb3Igd2hpY2ggdGhlIHJlYWQgYW5kIGVkaXQgY291bnRzIGhhdmUgYm90aCBkcm9wcGVkIHRvIHplcm8KLSAqIGFyZSBubyBsb25nZXIgdmFsaWQgZm9yIHVzZSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgaGF2ZSBiZWVuIGdhcmJhZ2UKLSAqIGNvbGxlY3RlZCBvciBub3QuIEl0IGlzIHBvc3NpYmxlLCBidXQgbm90IGd1YXJhbnRlZWQsIHRoYXQgdGhlIHVuZGVybHlpbmcKLSAqIHN0cnVjdHVyZWQgZG9jdW1lbnQgaXMgc3RpbGwgdmFsaWQgYW5kIG1heSBldmVuIGJlIHVzZWQgaW4gY29uc3RydWN0aW5nIGEKLSAqIG5ldyBzaGFyZWQgbW9kZWwuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIAotICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogQ2xpZW50cyBzaG91bGQgb2J0YWluIGFuIGluc3RhbmNlIG9mIHRoZSBJTW9kZWxNYW5hZ2VyIGludGVyZmFjZSB0aHJvdWdoCi0gKiB7QGxpbmsgU3RydWN0dXJlZE1vZGVsTWFuYWdlciNnZXRNb2RlbE1hbmFnZXIoKX0uPC9wPgotICogICAgICAgICAgICAgIDwvcD4KLSAqICAgICAgICAgICAgICA8cD4KLSAqIEBzZWUge0BsaW5rIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXJ9PC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbE1hbmFnZXIgewotCi0JLyoqCi0JICogQSBmaXhlZCBJRCB1c2VkIGZvciBtb2RlbHMgd2hpY2ggd2VyZSBjcmVhdGVkIGFzIGR1cGxpY2F0ZXMgb2YgZXhpc3RpbmcKLQkgKiBtb2RlbHMKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBEVVBMSUNBVEVEX01PREVMID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyLkRVUExJQ0FURURfTU9ERUwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIGZpeGVkIElEIHVzZWQgZm9yIHVubWFuYWdlZCBtb2RlbHMKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVTk1BTkFHRURfTU9ERUwgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbE1hbmFnZXIuVU5NQU5BR0VEX01PREVMIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ2FsY3VsYXRlIGlkIHByb3ZpZGVzIGEgY29tbW9uIHdheSB0byBkZXRlcm1pbmUgdGhlIGlkIGZyb20gdGhlIGlucHV0Ci0JICogLi4uIG5lZWRlZCB0byBnZXQgYW5kIHNhdmUgdGhlIG1vZGVsLiBJdCBpcyBhIHNpbXBsZSBjbGFzcyB1dGlsaXR5LCBidXQKLQkgKiBpcyBhbiBpbnN0YW5jZSBtZXRob2Qgc28gY2FuIGJlIGFjY2Vzc2VkIHZpYSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBjYWxjdWxhdGVJZChJRmlsZSBmaWxlKTsKLQotCS8qKgotCSAqIENvcGllcyBhIG1vZGVsIHdpdGggdGhlIG9sZCBpZCAKLQkgKiBAcGFyYW0gb2xkSWQgLSB0aGUgb2xkIG1vZGVsJ3MgSUQKLQkgKiBAcGFyYW0gbmV3SWQgLSB0aGUgbmV3IG1vZGVsJ3MgSUQKLQkgKiBAcmV0dXJuIHRoZSBuZXcgbW9kZWwKLQkgKiBAdGhyb3dzIFJlc291cmNlSW5Vc2UgaWYgdGhlIGdpdmVuIG5ldyBJRCBpcyBhbHJlYWR5IGluIHVzZSBieSBhIG1hbmFnZWQgbW9kZWwKLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGNvcHlNb2RlbEZvckVkaXQoU3RyaW5nIG9sZElkLCBTdHJpbmcgbmV3SWQpIHRocm93cyBSZXNvdXJjZUluVXNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldywgYnV0IGVtcHR5LCB1bm1hbmFnZWQgbW9kZWwgb2YgdGhlIHNhbWUga2luZCBhcyB0aGUgb25lCi0JICogZ2l2ZW4uIEZvciBhIG1hbmFnZWQgbW9kZWwgd2l0aCB0aGUgc2FtZSBjb250ZW50cywgdXNlICJjb3B5Ii4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcmV0dXJuIHRoZSBtb2RlbCwgb3IgbnVsbCBvZiBvbmUgY291bGQgbm90IGJlIGNyZWF0ZWQKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBmaWxlJ3MgY29udGVudHMgY2FuIG5vdCBiZSByZWFkIG9yIGl0cyBkZXRlY3RlZCBlbmNvZGluZyBkb2VzIG5vdCBzdXBwb3J0IGl0cyBjb250ZW50cwotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU5ld0luc3RhbmNlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kLCBzaW5jZSBhIHByb3BlciBJU3RydWN0dXJlZERvY3VtZW50IG11c3QgaGF2ZSBhIHByb3BlcgotCSAqIHBhcnNlciBhc3NpZ25lZC4gSWYgdGhlIHJlc291cmNlIGRvZXMgYWxyZWFkeSBleGlzdCwgdGhlbgotCSAqIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvciBpcyB0aGUgcmlnaHQgQVBJIHRvIHVzZS4KLQkgKiAKLQkgKiBAcGFyYW0gaUZpbGUKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCwgb3IgbnVsbCBpZiBvbmUgY291bGQgbm90IGJlIGNyZWF0ZWQKLQkgKiBAdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cwotCSAqICAgICAgICAgICAgIGlmIHRoZSBJRmlsZSBhbHJlYWR5IGV4aXN0cwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIG9yIGRlc2NyaXB0aW9uIGNhbiBub3QgYmUgcmVhZAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGZpbGUncyBjb250ZW50cyBjYW4gbm90IGJlIHJlYWQgb3IgaXRzIGRldGVjdGVkIGVuY29kaW5nIGRvZXMgbm90IHN1cHBvcnQgaXRzIGNvbnRlbnRzCi0JICogQHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMgaWYgdGhlIGdpdmUgZmlsZSBhbHJlYWR5IGV4aXN0cwotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50Rm9yKElGaWxlIGlGaWxlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kLCBzaW5jZSBhIHByb3BlciBJU3RydWN0dXJlZERvY3VtZW50IG11c3QgaGF2ZSBhIHByb3BlcgotCSAqIHBhcnNlciBhc3NpZ25lZC4gTm90ZTogY2xpZW50cyBzaG91bGQgdmVyaWZ5IElGaWxlIGV4aXN0cyBiZWZvcmUgdXNpbmcKLQkgKiB0aGlzIG1ldGhvZC4gSWYgdGhpcyBJRmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlbgotCSAqIHtAbGluayAjY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50Rm9yKElGaWxlKX0gaXMgdGhlIGNvcnJlY3QgQVBJIHRvIHVzZS4KLQkgKiAKLQkgKiBAcGFyYW0gaUZpbGUgLSB0aGUgZmlsZQotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50LCBvciBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgY3JlYXRlZAotCSAqIAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIG9yIGRlc2NyaXB0aW9uIGNhbiBub3QgYmUgcmVhZAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGZpbGUncyBjb250ZW50cyBjYW4gbm90IGJlIHJlYWQgb3IgaXRzIGRldGVjdGVkIGVuY29kaW5nIGRvZXMgbm90IHN1cHBvcnQgaXRzIGNvbnRlbnRzCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYQotCSAqIHByb3BlciBwYXJzZXIgYXNzaWduZWQuIEl0IHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBhbiBlbXB0eQotCSAqIHN0cnVjdHVyZWREb2N1bWVudCBpcyBuZWVkZWQuIE90aGVyd2lzZSwgdXNlIElGaWxlIGZvcm0uCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlSWQKLQkgKiBAcmV0dXJuIGEgc3RydWN0dXJlZCBkb2N1bWVudCB3aXRoIHRoZSBjb3JyZWN0IHBhcnNpbmcgc2V0dXAgZm9yIHRoZQotCSAqICAgICAgICAgZ2l2ZW4gY29udGVudCB0eXBlIElELCBvciBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgY3JlYXRlZCBvcgotCSAqICAgICAgICAgdGhlIGdpdmVuIGNvbnRlbnQgdHlwZSBJRCBpcyB1bmtub3duIG9yIHVuc3VwcG9ydGVkCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgSUZpbGUgZm9ybSBpbnN0ZWFkIGFzIHRoZSBjb3JyZWN0IGVuY29kaW5nIGFuZCBjb250ZW50IHJ1bGVzIG1heSBub3QgYmUgYXBwbGllZCBvdGhlcndpc2UKLQkgKiAKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgcHJvcGVybHkgY29uZmlndXJlZCBzdHJ1Y3R1cmVkIGRvY3VtZW50IGZvciB0aGUgZ2l2ZW4gY29udGVudHMgd2l0aCB0aGUgZ2l2ZW4gbmFtZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZSAtIHRoZSBmaWxlbmFtZSwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gZ3Vlc3MgdGhlIGNvbnRlbnQgdHlwZQotCSAqIEBwYXJhbSBjb250ZW50cyAtIHRoZSBjb250ZW50cyB0byBsb2FkCi0JICogQHBhcmFtIHJlc29sdmVyIC0gdGhlIFVSSVJlc29sdmVyIHRvIHVzZSBmb3IgbG9jYXRpbmcgYW55IG5lZWRlZCByZXNvdXJjZXMKLQkgKiBAcmV0dXJuIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IG9yIG51bGwgb2Ygb25lIGNvdWxkIG5vdCBiZSBjcmVhdGVkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIGNhbiBub3QgYmUgcmVhZCBvciBpdHMgY29udGVudCB0eXBlIGNhbiBub3QgYmUgZGV0ZXJtaW5lZAotCSAqLyAKLQlJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGNvbnRlbnRzLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHByb3Blcmx5IGNvbmZpZ3VyZWQgc3RydWN0dXJlZCBkb2N1bWVudCBmb3IgdGhlIGdpdmVuIGNvbnRlbnRzIHdpdGggdGhlIGdpdmVuIG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUgLSB0aGUgZmlsZW5hbWUsIHdoaWNoIG1heSBiZSB1c2VkIHRvIGd1ZXNzIHRoZSBjb250ZW50IHR5cGUKLQkgKiBAcGFyYW0gaW5wdXRTdHJlYW0gLSB0aGUgY29udGVudHMgdG8gbG9hZAotCSAqIEBwYXJhbSByZXNvbHZlciAtIHRoZSBVUklSZXNvbHZlciB0byB1c2UgZm9yIGxvY2F0aW5nIGFueSBuZWVkZWQgcmVzb3VyY2VzCi0JICogQHBhcmFtIGlhbmFFbmNvZGluZ05hbWUgLSB0aGUgSUFOQSBzcGVjaWZpZWQgZW5jb2RpbmcgdG8gdXNlIHdoZW4gcmVhZGluZyB0aGUgY29udGVudHMKLQkgKiBAcmV0dXJuIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IG9yIG51bGwgaWYgb25lIGNvdWxkIG5vdCBiZSBjcmVhdGVkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIGNhbiBub3QgYmUgcmVhZCBvciBpdHMgY29udGVudCB0eXBlIGNhbiBub3QgYmUgZGV0ZXJtaW5lZAotCSAqIEBkZXByZWNhdGVkIC0gY2xpZW50cyBzaG91bGQgY29udmVydCB0aGUgSW5wdXRTdHJlYW0gaW50byB0ZXh0IHRoZW1zZWx2ZXMKLQkgKiAgICAgICAgICAgICBhbmQgdGhlbiB1c2UgdGhlIHZlcnNpb24gb2YgdGhpcyBtZXRob2QgdGFraW5nIGEgU3RyaW5nIGZvciBpdHMKLQkgKiAgICAgICAgICAgICBjb250ZW50Ci0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIsIFN0cmluZyBpYW5hRW5jb2RpbmdOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgcHJvcGVybHkgY29uZmlndXJlZCBzdHJ1Y3R1cmVkIGRvY3VtZW50IGZvciB0aGUgZ2l2ZW4gY29udGVudHMgd2l0aCB0aGUgZ2l2ZW4gbmFtZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZSAtIHRoZSBmaWxlbmFtZSwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gZ3Vlc3MgdGhlIGNvbnRlbnQgdHlwZQotCSAqIEBwYXJhbSBjb250ZW50IC0gdGhlIGNvbnRlbnRzIHRvIGxvYWQKLQkgKiBAcGFyYW0gcmVzb2x2ZXIgLSB0aGUgVVJJUmVzb2x2ZXIgdG8gdXNlIGZvciBsb2NhdGluZyBhbnkgcmVmZXJlbmNlZCByZXNvdXJjZXMKLQkgKiBAcmV0dXJuIGEgc3RydWN0dXJlZCBkb2N1bWVudCB3aXRoIHRoZSBjb3JyZWN0IHBhcnNpbmcgc2V0dXAgZm9yIHRoZQotCSAqICAgICAgICAgZ2l2ZW4gZmlsZW5hbWUsIG9yIG51bGwgaWYgb25lIGNvdWxkIG5vdCBiZSBjcmVhdGVkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIGNhbiBub3QgYmUgcmVhZCBvciBpdHMgZGV0ZWN0ZWQgZW5jb2RpbmcgZG9lcyBub3Qgc3VwcG9ydCBpdHMgY29udGVudHMKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBjb250ZW50LCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhbiB1bm1hbmFnZWQgbW9kZWwgcG9wdWxhdGVkIHdpdGggdGhlIGdpdmVuIElGaWxlJ3MKLQkgKiBjb250ZW50cwotCSAqIAotCSAqIEBwYXJhbSBpRmlsZQotCSAqIEByZXR1cm4gYSBzdHJ1Y3R1cmVkIG1vZGVsLCBvciBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgY3JlYXRlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIG9yIGRlc2NyaXB0aW9uIGNhbiBub3QgYmUgcmVhZAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGZpbGUncyBjb250ZW50cyBjYW4gbm90IGJlIHJlYWQgb3IgaXRzIGRldGVjdGVkIGVuY29kaW5nIGRvZXMgbm90IHN1cHBvcnQgaXRzIGNvbnRlbnRzCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4gSXQgZGVwZW5kcyBvbiB0aGUgbG9hZGVyJ3MgbmV3TW9kZWwgbWV0aG9kIHRvIHJldHVybgotCSAqIGFuIGFwcHJvcHJpYXRlIFN0cnVjdXR1cmVkTW9kZWwgYXBwcm9wcmlhdGVseSBpbml0aWFsaXplZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFR5cGVJZAotCSAqIEByZXR1cm4gYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciB0aGUgZ2l2ZW4gY29udGVudCB0eXBlLCBvciBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgY3JlYXRlZCBvciB0aGUgY29udGVudCB0eXBlIGlzIHVuc3VwcG9ydGVkCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihTdHJpbmcgY29udGVudFR5cGVJZCwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpOwotCi0JLyoqCi0JICogTm90ZTogY2FsbGVycyBvZiB0aGlzIG1ldGhvZCBtdXN0IHN0aWxsIHJlbGVhc2UgdGhlIG1vZGVsIHdoZW4gZmluaXNoZWQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHJldHVybiB0aGUgc3RydWN0dXJlZCBtb2RlbCBjb250YWluaW5nIHRoZSBnaXZlIGRvY3VtZW50LCBpbmNyZW1lbnRpbmcKLQkgKiAgICAgICAgIGl0cyBlZGl0IGNvdW50LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vdCBhIG1vZGVsIGNvcnJlc3BvbmRpbmcKLQkgKiAgICAgICAgIHRvIHRoaXMgZG9jdW1lbnQuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChJRG9jdW1lbnQgZG9jdW1lbnQpOwotCi0JLyoqCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuIHRoZSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciB0aGUgZ2l2ZW4gZmlsZSwgaW5jcmVtZW50aW5nIGl0cyBlZGl0Ci0JICogICAgICAgICBjb3VudCwgb3IgbnVsbCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhpcyBmaWxlLgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoSUZpbGUgZmlsZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuIHRoZSBzdHJ1Y3R1cmVkIG1vZGVsIHdpdGggdGhlIGdpdmVuIElELCBpbmNyZW1lbnRpbmcgaXRzIGVkaXQKLQkgKiAgICAgICAgIGNvdW50LCBvciBudWxsIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGlzIElECi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIE5vdGU6IGNhbGxlcnMgb2YgdGhpcyBtZXRob2QgbXVzdCBzdGlsbCByZWxlYXNlIHRoZSBtb2RlbCB3aGVuIGZpbmlzaGVkLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEByZXR1cm4gdGhlIHN0cnVjdHVyZWQgbW9kZWwgY29udGFpbmluZyB0aGUgZ2l2ZSBkb2N1bWVudCwgaW5jcmVtZW50aW5nCi0JICogICAgICAgICBpdHMgcmVhZCBjb3VudCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBub3QgYSBtb2RlbCBjb3JyZXNwb25kaW5nCi0JICogICAgICAgICB0byB0aGlzIGRvY3VtZW50LgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoSURvY3VtZW50IGRvY3VtZW50KTsKLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybiB0aGUgc3RydWN0dXJlZCBtb2RlbCBmb3IgdGhlIGdpdmVuIGZpbGUsIGluY3JlbWVudGluZyBpdHMgcmVhZAotCSAqICAgICAgICAgY291bnQsIG9yIG51bGwgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgZm9yIHRoaXMgZmlsZS4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuIHRoZSBzdHJ1Y3R1cmVkIG1vZGVsIHdpdGggdGhlIGdpdmVuIElELCBpbmNyZW1lbnRpbmcgaXRzIGVkaXQKLQkgKiAgICAgICAgIGNvdW50LCBvciBudWxsIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGlzIElECi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gaW50ZXJuYWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RXhpc3RpbmdNb2RlbElkcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cnVjdHVyZWQgbW9kZWwgZm9yIHRoZSBnaXZlbiBmaWxlLiBJZiBvbmUgZG9lcyBub3QgYWxyZWFkeQotCSAqIGV4aXN0cywgb25lIHdpbGwgYmUgY3JlYXRlZCB3aXRoIGFuIGVkaXQgY291bnQgb2YgMS4gSWYgb25lIGFscmVhZHkKLQkgKiBleGlzdHMsIGl0cyBlZGl0IGNvdW50IHdpbGwgYmUgaW5jcmVtZW50ZWQgYmVmb3JlIGl0IGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBpRmlsZQotCSAqIEByZXR1cm4gYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciB0aGUgZ2l2ZW4gZmlsZSwgb3IgbnVsbCBpZiBvbmUgY291bGQgbm90Ci0JICogICAgICAgICBiZSBmb3VuZCBvciBjcmVhdGVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBmaWxlJ3MgY29udGVudHMgb3IgZGVzY3JpcHRpb24gY2FuIG5vdCBiZSByZWFkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIGNhbiBub3QgYmUgcmVhZCBvciBpdHMgZGV0ZWN0ZWQgZW5jb2RpbmcgZG9lcyBub3Qgc3VwcG9ydCBpdHMgY29udGVudHMKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciB0aGUgZ2l2ZW4gZmlsZS4gSWYgb25lIGRvZXMgbm90IGFscmVhZHkKLQkgKiBleGlzdHMsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBhbiBlZGl0IGNvdW50IG9mIDEuIElmIG9uZSBhbHJlYWR5Ci0JICogZXhpc3RzLCBpdHMgZWRpdCBjb3VudCB3aWxsIGJlIGluY3JlbWVudGVkIGJlZm9yZSBpdCBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gaUZpbGUKLQkgKiBAcGFyYW0gZW5jb2RpbmdSdWxlIHRoZSBydWxlIGZvciBoYW5kbGluZyBlbmNvZGluZwotCSAqIEByZXR1cm4gYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciB0aGUgZ2l2ZW4gZmlsZSwgb3IgbnVsbCBpZiBvbmUgY291bGQgbm90Ci0JICogICAgICAgICBiZSBmb3VuZCBvciBjcmVhdGVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBmaWxlJ3MgY29udGVudHMgb3IgZGVzY3JpcHRpb24gY2FuIG5vdCBiZSByZWFkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIGNhbiBub3QgYmUgcmVhZCBvciBpdHMgZGV0ZWN0ZWQgZW5jb2RpbmcgZG9lcyBub3Qgc3VwcG9ydCBpdHMgY29udGVudHMKLQkgKiBAZGVwcmVjYXRlZCAtIGVuY29kaW5nIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgZmlsZSdzCi0JICogICAgICAgICAgICAgY29udGVudHMgb3IgdXNlciBwcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBFbmNvZGluZyBhbmQgdGhlIGxpbmUgZGVsaW1pdGVyIHVzZWQgYXJlIGhhbmRsZWQKLQkgKiAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSBmaWxlJ3MgY29udGVudHMgb3IgdXNlcgotCSAqICAgICAgICAgICAgIHByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cnVjdHVyZWQgbW9kZWwgZm9yIHRoZSBnaXZlbiBkb2N1bWVudC4gSWYgb25lIGRvZXMgbm90Ci0JICogYWxyZWFkeSBleGlzdHMsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBhbiBlZGl0IGNvdW50IG9mIDEuIElmIG9uZQotCSAqIGFscmVhZHkgZXhpc3RzLCBpdHMgZWRpdCBjb3VudCB3aWxsIGJlIGluY3JlbWVudGVkIGJlZm9yZSBpdCBpcwotCSAqIHJldHVybmVkLiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBvbmx5IHRvIGludGVyYWN0IHdpdGggZG9jdW1lbnRzCi0JICogY29udGFpbmVkIHdpdGhpbiBGaWxlIEJ1ZmZlcnMuCi0JICogCi0JICogQHBhcmFtIHRleHRGaWxlQnVmZmVyRG9jdW1lbnQKLQkgKiBAcmV0dXJuIGEgc3RydWN0dXJlZCBtb2RlbCBmb3IgdGhlIGdpdmVuIGRvY3VtZW50LCBvciBudWxsIGlmIHRoZXJlIGlzCi0JICogICAgICAgICBpbnN1ZmZpY2llbnQgaW5mb3JtYXRpb24ga25vd24gYWJvdXQgdGhlIGRvY3VtZW50IGluc3RhbmNlIHRvCi0JICogICAgICAgICBkbyBzbwotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJU3RydWN0dXJlZERvY3VtZW50IHRleHRGaWxlQnVmZmVyRG9jdW1lbnQpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cnVjdHVyZWQgbW9kZWwgZm9yIHRoZSBnaXZlbiBjb250ZW50cyB1c2luZyB0aGUgZ2l2ZW4gSUQuCi0JICogSWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBhbiBlZGl0IGNvdW50Ci0JICogb2YgMS4gSWYgb25lIGFscmVhZHkgZXhpc3RzLCBpdHMgZWRpdCBjb3VudCB3aWxsIGJlIGluY3JlbWVudGVkIGJlZm9yZQotCSAqIGl0IGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgLSB0aGUgaWQgZm9yIHRoZSBtb2RlbAotCSAqIEBwYXJhbSBpblN0cmVhbQotCSAqICAgICAgICAgICAgLSB0aGUgaW5pdGlhbCBjb250ZW50cyBvZiB0aGUgbW9kZWwKLQkgKiBAcGFyYW0gcmVzb2x2ZXIKLQkgKiAgICAgICAgICAgIC0gdGhlIFVSSVJlc29sdmVyIHRvIHVzZSBmb3IgbG9jYXRpbmcgYW55IG5lZWRlZCByZXNvdXJjZXMKLQkgKiBAcmV0dXJuIGEgc3RydWN0dXJlZCBtb2RlbCBmb3IgdGhlIGdpdmVuIGNvbnRlbnQsIG9yIG51bGwgaWYgb25lIGNvdWxkCi0JICogICAgICAgICBub3QgYmUgZm91bmQgb3IgY3JlYXRlZAotCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgY29udGVudHMgY2FuIG5vdCBiZSByZWFkIG9yIGl0cyBkZXRlY3RlZCBlbmNvZGluZwotCSAqICAgICAgICAgICAgIGRvZXMgbm90IHN1cHBvcnQgaXRzIGNvbnRlbnRzCi0JICogQGRlcHJlY2F0ZWQgLSBhIFVSSSByZXNvbHZlciBzaG91bGQgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIHdoZW4KLQkgKiAgICAgICAgICAgICBuZWVkZWQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoU3RyaW5nIGlkLCBJbnB1dFN0cmVhbSBpblN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciB0aGUgZ2l2ZW4gZmlsZS4gSWYgb25lIGRvZXMgbm90IGFscmVhZHkKLQkgKiBleGlzdHMsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBhIHJlYWQgY291bnQgb2YgMS4gSWYgb25lIGFscmVhZHkKLQkgKiBleGlzdHMsIGl0cyByZWFkIGNvdW50IHdpbGwgYmUgaW5jcmVtZW50ZWQgYmVmb3JlIGl0IGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBpRmlsZQotCSAqIEByZXR1cm4gYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciB0aGUgZ2l2ZW4gZmlsZSwgb3IgbnVsbCBpZiBvbmUgY291bGQgbm90Ci0JICogICAgICAgICBiZSBmb3VuZCBvciBjcmVhdGVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBmaWxlJ3MgY29udGVudHMgb3IgZGVzY3JpcHRpb24gY2FuIG5vdCBiZSByZWFkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIGNhbiBub3QgYmUgcmVhZCBvciBpdHMgZGV0ZWN0ZWQgZW5jb2RpbmcgZG9lcyBub3Qgc3VwcG9ydCBpdHMgY29udGVudHMKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gZW5jb2RpbmcgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSBmaWxlJ3MKLQkgKiAgICAgICAgICAgICBjb250ZW50cyBvciB1c2VyIHByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIEVuY29kaW5nIGFuZCB0aGUgbGluZSBkZWxpbWl0ZXIgdXNlZCBhcmUgaGFuZGxlZAotCSAqICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIGZpbGUncyBjb250ZW50cyBvciB1c2VyCi0JICogICAgICAgICAgICAgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RydWN0dXJlZCBtb2RlbCBmb3IgdGhlIGdpdmVuIGRvY3VtZW50LiBJZiBvbmUgZG9lcyBub3QKLQkgKiBhbHJlYWR5IGV4aXN0cywgb25lIHdpbGwgYmUgY3JlYXRlZCB3aXRoIGEgcmVhZCBjb3VudCBvZiAxLiBJZiBvbmUKLQkgKiBhbHJlYWR5IGV4aXN0cywgaXRzIHJlYWQgY291bnQgd2lsbCBiZSBpbmNyZW1lbnRlZCBiZWZvcmUgaXQgaXMKLQkgKiByZXR1cm5lZC4gVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgb25seSB0byBpbnRlcmFjdCB3aXRoIGRvY3VtZW50cwotCSAqIGNvbnRhaW5lZCB3aXRoaW4gRmlsZSBCdWZmZXJzLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0RmlsZUJ1ZmZlckRvY3VtZW50Ci0JICogQHJldHVybiBhIHN0cnVjdHVyZWQgbW9kZWwgZm9yIHRoZSBnaXZlbiBkb2N1bWVudCwgb3IgbnVsbCBpZiB0aGVyZSBpcwotCSAqICAgICAgICAgaW5zdWZmaWNpZW50IGluZm9ybWF0aW9uIGtub3duIGFib3V0IHRoZSBkb2N1bWVudCBpbnN0YW5jZSB0bwotCSAqICAgICAgICAgZG8gc28KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSVN0cnVjdHVyZWREb2N1bWVudCB0ZXh0RmlsZUJ1ZmZlckRvY3VtZW50KTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciB0aGUgZ2l2ZW4gY29udGVudHMgdXNpbmcgdGhlIGdpdmVuIElELgotCSAqIElmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBvbmUgd2lsbCBiZSBjcmVhdGVkIHdpdGggYW4gcmVhZCBjb3VudAotCSAqIG9mIDEuIElmIG9uZSBhbHJlYWR5IGV4aXN0cywgaXRzIHJlYWQgY291bnQgd2lsbCBiZSBpbmNyZW1lbnRlZCBiZWZvcmUKLQkgKiBpdCBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIC0gdGhlIGlkIGZvciB0aGUgbW9kZWwKLQkgKiBAcGFyYW0gaW5TdHJlYW0KLQkgKiAgICAgICAgICAgIC0gdGhlIGluaXRpYWwgY29udGVudHMgb2YgdGhlIG1vZGVsCi0JICogQHBhcmFtIHJlc29sdmVyCi0JICogICAgICAgICAgICAtIHRoZSBVUklSZXNvbHZlciB0byB1c2UgZm9yIGxvY2F0aW5nIGFueSBuZWVkZWQgcmVzb3VyY2VzCi0JICogQHJldHVybiBhIHN0cnVjdHVyZWQgbW9kZWwgZm9yIHRoZSBnaXZlbiBjb250ZW50LCBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kIG9yIGNyZWF0ZWQKLQkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGNvbnRlbnRzIGNhbiBub3QgYmUgcmVhZCBvciBpdHMgZGV0ZWN0ZWQgZW5jb2RpbmcKLQkgKiAgICAgICAgICAgICBkb2VzIG5vdCBzdXBwb3J0IGl0cyBjb250ZW50cwotCSAqIEBkZXByZWNhdGVkIC0gYSBVUkkgcmVzb2x2ZXIgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB3aGVuCi0JICogICAgICAgICAgICAgbmVlZGVkCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5TdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBjcmVhdGUgYSBuZXcgbW9kZWwgaWYgaXQgYWxyZWFkeSBleGlzdHMgLi4uIGlmCi0JICogZm9yY2UgaXMgZmFsc2UuIFRoZSBpZGVhIGlzIHRoYXQgYSBjbGllbnQgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2Qgb25jZQotCSAqIHdpdGggZm9yY2Ugc2V0IHRvIGZhbHNlLiBJZiB0aGUgZXhjZXB0aW9uIGlzIHRocm93biwgdGhlbiBwcm9tcHQgY2xpZW50Ci0JICogaWYgdGhleSB3YW50IHRvIG92ZXJ3cml0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaUZpbGUKLQkgKiBAcGFyYW0gZm9yY2UKLQkgKiBAcmV0dXJuIHRoZSBuZXcgc3RydWN0dXJlZCBtb2RlbCwgb3IgCi0JICogQHRocm93cyBSZXNvdXJjZUluVXNlIGlmIHRoZSBnaXZlbiBuZXcgSUQgaXMgYWxyZWFkeSBpbiB1c2UgYnkgYSBtYW5hZ2VkIG1vZGVsCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBmaWxlJ3MgY29udGVudHMgb3IgZGVzY3JpcHRpb24gY2FuIG5vdCBiZSByZWFkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIGNhbiBub3QgYmUgcmVhZCBvciBpdHMgZGV0ZWN0ZWQgZW5jb2RpbmcgZG9lcyBub3Qgc3VwcG9ydCBpdHMgY29udGVudHMKLQkgKiBAdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cyBpZiB0aGUgZ2l2ZSBmaWxlIGFscmVhZHkgZXhpc3RzCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMsIFJlc291cmNlSW5Vc2UsIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBub3QgY3JlYXRlIGEgbmV3IG1vZGVsIGlmIGl0IGFscmVhZHkgZXhpc3RzIC4uLiBpZgotCSAqIGZvcmNlIGlzIGZhbHNlLiBUaGUgaWRlYSBpcyB0aGF0IGEgY2xpZW50IHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIG9uY2UKLQkgKiB3aXRoIGZvcmNlIHNldCB0byBmYWxzZS4gSWYgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZW4gcHJvbXB0IGNsaWVudAotCSAqIGlmIHRoZXkgd2FudCB0byBvdmVyd3JpdGUuCi0JICogCi0JICogQHBhcmFtIGlGaWxlCi0JICogQHBhcmFtIGZvcmNlCi0JICogQHJldHVybiB0aGUgbmV3IHN0cnVjdHVyZWQgbW9kZWwsIG9yIAotCSAqIEB0aHJvd3MgUmVzb3VyY2VJblVzZSBpZiB0aGUgZ2l2ZW4gbmV3IElEIGlzIGFscmVhZHkgaW4gdXNlIGJ5IGEgbWFuYWdlZCBtb2RlbAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIG9yIGRlc2NyaXB0aW9uIGNhbiBub3QgYmUgcmVhZAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGZpbGUncyBjb250ZW50cyBjYW4gbm90IGJlIHJlYWQgb3IgaXRzIGRldGVjdGVkIGVuY29kaW5nIGRvZXMgbm90IHN1cHBvcnQgaXRzIGNvbnRlbnRzCi0JICogQHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMgaWYgdGhlIGdpdmUgZmlsZSBhbHJlYWR5IGV4aXN0cwotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBSZXNvdXJjZUluVXNlLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29tYmluZWQgInJlYWQiIGFuZCAiZWRpdCIgcmVmZXJlbmNlIGNvdW50cwotCSAqIG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbAotCSAqIEBkZXByZWNhdGVkIC0gaW50ZXJuYWwgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGUgbW9kZWwKLQkgKiAgICAgICAgICAgICBpdHNlbGYKLQkgKi8KLQlpbnQgZ2V0UmVmZXJlbmNlQ291bnQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgImVkaXQiIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwKLQkgKiBAZGVwcmVjYXRlZCAtIGludGVybmFsIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIG1vZGVsIGl0c2VsZgotCSAqLwotCWludCBnZXRSZWZlcmVuY2VDb3VudEZvckVkaXQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgInJlYWQiIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKiBAZGVwcmVjYXRlZCAtIGludGVybmFsIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIG1vZGVsIGl0c2VsZgotCSAqLwotCWludCBnZXRSZWZlcmVuY2VDb3VudEZvclJlYWQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbAotCSAqLwotCWJvb2xlYW4gaXNTaGFyZWQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciAiZWRpdCIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwKLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkRm9yRWRpdChPYmplY3QgaWQpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyICJyZWFkIiByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbAotCSAqLwotCWJvb2xlYW4gaXNTaGFyZWRGb3JSZWFkKE9iamVjdCBpZCk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIG5vdCBncmFudWxhciBlbm91Z2gKLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIGRldGVybWluZSBpZiB0aGUgbW9kZWwgbWFuYWdlciBpcyB3aXRoaW4gYQotCSAqICJhYm91dFRvQ2hhbmdlIiBhbmQgImNoYW5nZWQiIHNlcXVlbmNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhdGVDaGFuZ2luZygpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2hhbmdlcyB0aGUgaWQgb2YgdGhlIG1vZGVsLiAKLQkgKiAKLQkgKiBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXZvaWQgbW92ZU1vZGVsKE9iamVjdCBvbGRJZCwgT2JqZWN0IG5ld0lkKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgd2hlbiB0aGUgY29udGVudCB0eXBlIG9mIGEgbW9kZWwgY2hhbmdlcy4gSXQncwotCSAqIGFzc3VtZWQgdGhlIGNvbnRlbnRUeXBlIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCwgYW5kIHRoaXMgbWV0aG9kIHVzZXMKLQkgKiB0aGUgdGV4dCBvZiB0aGUgb2xkIG9uZSwgdG8gcmVwb3B1bGF0ZSB0aGUgdGV4dCBvZiB0aGUgbmV3IG9uZS4gSW4KLQkgKiB0aGVvcnksIHRoZSBhY3R1YWwgaW5zdGFuY2UgY291bGQgY2hhbmdlLCAoZS5nLiB1c2luZyAnc2F2ZUFzJyB0byBnbwotCSAqIGZyb20geG1sIHRvIGR0ZCksIGJ1dCBpbiBwcmFjdGljZSwgdGhlIGludGVudCBvZiB0aGlzIEFQSSBpcyB0byByZXR1cm4KLQkgKiB0aGUgc2FtZSBpbnN0YW5jZSwganVzdCB1c2luZyBkaWZmZXJlbnQgaGFuZGxlcnMsIGFkYXB0ZXIgZmFjdG9yaWVzLAotCSAqIGV0Yy4KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIHJlaW5pdGlhbGl6ZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90IHVzZQotCSAqIHRoZSBjYWNoZWQgdmVyc2lvbiwgYnV0IGZvcmNlcyB0aGUgY2FjaGVkIHZlcnNpb24gdG8gYmUgcmVwbGFjZWQgd2l0aCBhCi0JICogZnJlc2gsIHVuY2hhbmdlZCB2ZXJzaW9uLiBOb3RlOiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBjaGFuZ2UgYW55Ci0JICogcmVmZXJlbmNlIGNvdW50cy4gQWxzbywgaWYgdGhlcmUgaXMgbm90IGFscmVhZHkgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUKLQkgKiBtb2RlbCwgdGhlbiB0aGlzIGNhbGwgaXMgZXNzZW50aWFsbHkgaWdub3JlZCAodGhhdCBpcywgaXQgZG9lcyBub3QgcHV0Ci0JICogYSBtb2RlbCBpbiB0aGUgY2FjaGUpIGFuZCByZXR1cm5zIG51bGwuCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIHJlbG9hZE1vZGVsKE9iamVjdCBpZCwgSW5wdXRTdHJlYW0gaW5TdHJlYW0pIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBzdHJ1Y3R1cmVkIGRvY3VtZW50IHRvIHRoZSBnaXZlbiBmaWxlLiBJZgotCSAqIHRoZSBkb2N1bWVudCBiZWxvbmdzIHRvIGEgbWFuYWdlZCBtb2RlbCwgdGhhdCBtb2RlbCB3aWxsIGJlIHNhdmVkIGFuZAotCSAqIG1hcmtlZCBhcyBub24tZGlydHkuCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudAotCSAqICAgICAgICAgICAgLSB0aGUgc3RydWN0dXJlZCBkb2N1bWVudAotCSAqIEBwYXJhbSBpRmlsZQotCSAqICAgICAgICAgICAgLSB0aGUgZmlsZSB0byBzYXZlIHRvCi0JICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBmaWxlJ3MgY29udGVudHMgb3IgZGVzY3JpcHRpb24gY2FuIG5vdCBiZSByZWFkCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSdzIGNvbnRlbnRzIGNhbiBub3QgYmUgcmVhZCBvciBpdHMgZGV0ZWN0ZWQgZW5jb2RpbmcgZG9lcyBub3Qgc3VwcG9ydCBpdHMgY29udGVudHMKLQkgKi8KLQl2b2lkIHNhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIElGaWxlIGlGaWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb2RlbFN0YXRlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsU3RhdGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTRlNDczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsU3RhdGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotCi0KLS8qKgotICogSW50ZXJmYWNlIGZvciB0aG9zZSB3YW50aW5nIHRvIGxpc3RlbiB0byBhIG1vZGVsJ3Mgc3RhdGUgY2hhbmdpbmcuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsU3RhdGVMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBBIG1vZGVsIGlzIGFib3V0IHRvIGJlIGNoYW5nZWQuIFRoaXMgdHlwaWNhbGx5IGlzIGluaXRpYXRlZCBieSBvbmUKLQkgKiBjbGllbnQgb2YgdGhlIG1vZGVsLCB0byBzaWduYWwgYSBsYXJnZSBjaGFuZ2UgYW5kL29yIGEgY2hhbmdlIHRvIHRoZQotCSAqIG1vZGVsJ3MgSUQgb3IgYmFzZSBMb2NhdGlvbi4gQSB0eXBpY2FsIHVzZSBtaWdodCBiZSBpZiBhIGNsaWVudCBtaWdodAotCSAqIHdhbnQgdG8gc3VzcGVuZCBwcm9jZXNzaW5nIHVudGlsIGFsbCBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLgotCSAqLwotCXZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpOwotCi0JLyoqCi0JICogU2lnbmFscyB0aGF0IHRoZSBjaGFuZ2VzIGZvcmV0b2xkIGJ5IG1vZGVsQWJvdXRUb0JlQ2hhbmdlZCBoYXZlIGJlZW4KLQkgKiBtYWRlLiBBIHR5cGljYWwgdXNlIG1pZ2h0IGJlIHRvIHJlZnJlc2gsIG9yIHRvIHJlc3VtZSBwcm9jZXNzaW5nIHRoYXQKLQkgKiB3YXMgc3VzcGVuZGVkIGFzIGEgcmVzdWx0IG9mIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZC4KLQkgKi8KLQl2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKTsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgYSBtb2RlbCdzIGRpcnR5IHN0YXRlIGhhcyBjaGFuZ2VkLCBhbmQgcGFzc2VzIHRoYXQgc3RhdGUKLQkgKiBpbiBpc0RpcnR5LiBBIG1vZGVsIGJlY29tZXMgZGlydHkgd2hlbiBhbnkgY2hhbmdlIGlzIG1hZGUsIGFuZCBiZWNvbWVzCi0JICogbm90LWRpcnR5IHdoZW4gdGhlIG1vZGVsIGlzIHNhdmVkLgotCSAqLwotCXZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpOwotCi0JLyoqCi0JICogQSBtb2RlbERlbGV0ZWQgbWVhbnMgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgaGFzIGJlZW4gZGVsZXRlZC4gVGhlCi0JICogbW9kZWwgaXRzZWxmIGlzIG5vdCByZW1vdmVkIGZyb20gbW9kZWwgbWFuYWdlbWVudCB1bnRpbCBhbGwgaGF2ZQotCSAqIHJlbGVhc2VkIGl0LiBOb3RlOiBiYXNlTG9jYXRpb24gaXMgbm90IChuZWNlc3NhcmlseSkgY2hhbmdlZCBpbiB0aGlzCi0JICogZXZlbnQsIGJ1dCBtYXkgbm90IGJlIGFjY3VyYXRlLgotCSAqLwotCXZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCk7Ci0KLQkvKioKLQkgKiBBIG1vZGVsIGhhcyBiZWVuIHJlbmFtZWQgb3IgY29waWVkIChhcyBpbiBzYXZlQXMuLikuIEluIHRoZSByZW5hbWVkCi0JICogY2FzZSwgdGhlIHR3byBwYXJhbWVudGVycyBhcmUgdGhlIHNhbWUgaW5zdGFuY2UsIGFuZCBvbmx5IGNvbnRhaW4gdGhlCi0JICogbmV3IGluZm8gZm9yIGlkIGFuZCBiYXNlIGxvY2F0aW9uLgotCSAqLwotCXZvaWQgbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpOwotCi0Jdm9pZCBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpOwotCi0Jdm9pZCBtb2RlbFJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpOwotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lOb2RlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODhhMjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBub2RlcyB0byBiZSBhZGFwdGVkLgotICogCi0gKiBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyB0eXBlIG9mIGFkYXB0ZXIgKElBZGFwdGFibGUpIGFuZCBiYXNlCi0gKiBhZGFwdGVyIGlzIHRoYXQgdGhlc2UgYWRhcHRlcnMgYXJlIG5vdGlmaWVkIG9mIGNoYW5nZXMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIFRoZSBpbmZyYXN0cnVjdHVyZSBjYWxscyB0aGlzIG1ldGhvZCB0byBkZXRlcm1pbmUgaWYgdGhlIGFkYXB0ZXIgaXMKLQkgKiBhcHByb3ByaWF0ZSBmb3IgJ3R5cGUnLiBUeXBpY2FsbHksIGFkYXB0ZXJzIHJldHVybiB0cnVlIGJhc2VkIG9uCi0JICogaWRlbnRpdHkgY29tcGFyaXNvbiB0byAndHlwZScsIGJ1dCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgdGhhdCBpcywgdGhlCi0JICogZGVjaXNpb24gY2FuIGJlIGJhc2VkIG9uIGNvbXBsZXggbG9naWMuCi0JICogCi0JICovCi0JYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKTsKLQotCS8qKgotCSAqIFNlbnQgdG8gYWRhcHRlciB3aGVuIG5vdGlmaWVyIGNoYW5nZXMuIEVhY2ggbm90aWZpZXIgaXMgcmVzcG9uc2libGUgZm9yCi0JICogZGVmaW5pbmcgc3BlY2lmaWMgZXZlbnRUeXBlcywgZmVhdHVyZSBjaGFuZ2VkLCBldGMuCi0JICogCi0JICogSVNTVUU6IG1heSBiZSBtb3JlIGV2b2x2YWJsZSBpZiB0aGUgYXJndW1lbnQgd2FzIG9uZSBiaWcgJ25vdGlmaWVyCi0JICogZXZlbnQnIGluc3RhbmNlLgotCSAqLwotCXZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YTI1MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0vKioKLSAqIElOb2RlTm90aWZpZXJzIGNhbiBiZSBhZGFwdGVkIGJ5IElOb2RlQWRhcHRlcnMuIFRoaXMgZmFjdG9yeSBpbnRlcmZhY2UKLSAqIHByb3ZpZGVzIGEgd2F5IHRvIHByb3ZpZGUgZmFjdG9yaWVzIHdoaWNoIGFyZSBpbnZva2VkIGJ5IHRoZSBpbmZyYXN0cnVjdHVyZQotICogdG8gbWFuYWdlIHRoaXMgcHJvY2VzcywgZnJvbSBjcmVhdGluZywgdG8gYWRhcHRpbmcsIHRvIHJlbGVhc2luZywgaWYKLSAqIHJlcXVpcmVkLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlQWRhcHRlckZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIHByaW1hcnkgcHVycG9zZSBvZiBhbiBhZGFwdGVyIGZhY3RvcnkgaXMgdG8gY3JlYXRlIGFuIGFkYXB0ZXIgYW5kCi0JICogYXNzb2NpYXRlIGl0IHdpdGggYW4gSU5vZGVOb3RpZmllci4gVGhpcyBhZGFwdCBtZXRob2QgTWV0aG9kIHRoYXQKLQkgKiByZXR1cm5zIHRoZSBhZGFwdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0LiBUaGUKLQkgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBzaG91bGQgY2FsbCBhZGRBZGFwdGVyIG9uIHRoZSBhZGFwdGVkCi0JICogb2JqZWN0IHdpdGggdGhlIGNvcnJlY3QgaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIsIGlmIGFwcHJvcHJpYXRlLgotCSAqIAotCSAqIE5vdGU6IHRoZSBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciByZXR1cm5lZCBtYXkgYmUgYSBzaW5nbGV0b24gb3Igbm90Ci0JICogLi4uIGRlcGVuZGluZyBvbiB0aGUgbmVlZHMgb2YgdGhlIElOb2RlQWRhcHRlciAuLi4gYnV0IGluIGdlbmVyYWwgaXQgaXMKLQkgKiByZWNvbW1lbmRlZCBmb3IgYW4gYWRhcHRlciB0byBiZSBzdGF0ZWxlc3MsIHNvIHRoZSBlZmZpY2llbmNpZXMgb2YgYQotCSAqIHNpbmdsZXRvbiBjYW4gYmUgZ2FpbmVkLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSBub2RlIG5vdGlmaWVyIHRvIGJlIGFkYXB0ZWQKLQkgKi8KLQlJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBvYmplY3QpOwotCi0JLyoqCi0JICogVW5saWtlIGNsb25lLCB0aGlzIG1ldGhvZCBtYXkgb3IgbWF5IG5vdCByZXR1cm4gdGhlIHNhbWUgaW5zdGFuY2UsIHN1Y2gKLQkgKiBhcyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgSUFkYXB0ZXJGYWN0b3J5IGlzIGludGVuZGVkIHRvIGJlIGEgc2luZ2xldG9uLgotCSAqIAotCSAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhpcyBhZGFwdGVyIGZhY3RvcnkuCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpOwotCi0JLyoqCi0JICogaXNGYWN0b3J5Rm9yVHlwZSBpcyBjYWxsZWQgYnkgaW5mcmFzdHJ1Y3R1cmUgdG8gZGVjaWRlIGlmIHRoaXMgYWRhcHRlcgotCSAqIGZhY3RvcnkgaXMgYXBwb3JpYXRlIHRvIHVzZSBmb3IgYW4gYWRhcHRlciByZXF1ZXN0IHRoYXQgc3BlY2lmaWVzCi0JICogJ3R5cGUnLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIC0KLQkgKiAgICAgICAgICAgIHNhbWUgb2JqZWN0IHVzZWQgdG8gaWRlbnRpZnkvcmVxdWVzdCBhZGFwdGVycy4KLQkgKiBAcmV0dXJuIHRydWUgaWYgZmFjdG9yeSBpcyBhcHByb3ByaWF0ZSBmb3IgdHlwZSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCWJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSk7Ci0KLQkvKioKLQkgKiByZWxlYXNlIGlzIGNhbGxlZCBieSBpbmZyYXN0cnVjdHVyZSB3aGVuIHRoZSBmYWN0b3J5IHJlZ2lzdHJ5IGlzCi0JICogcmVsZWFzZWQgKHdoaWNoIGlzIGRvbmUgd2hlbiBhIHN0cnVjdHVyZWQgbW9kZWwgaXMgcmVsZWFzZWQpLiBUaGlzCi0JICogaW50ZW5lZCBmb3IgdGhlIGZhY3RvcnkgdG8gYmUgYWxsb3dlZCB0byBjbGVhbiB1cCBhbnkgc3RhdGUgaW5mb3JtYXRpb24KLQkgKiBpdCBtYXkgaGF2ZS4KLQkgKiAKLQkgKiBOb3RlOiB3aGlsZSBub3QgcmVjb21tZW5kZWQsIGR1ZSB0byBwZXJmb3JtYW5jZSByZWFzb25zLCBpZiBpbmRpdmlkdWFsCi0JICogYWRhcHRlcnMgbmVlZCBzb21lIGNsZWFudXAgKG9yIG5lZWQgdG8gYmUgcmVsZWFzZWQpIGl0IGlzICh0eXBpY2FsbHkpCi0JICogdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkgdG8gdHJhY2sgdGhlbSwgYW5kIGluaXRpYXRlCi0JICogd2hhdCBldmVyIGNsZWFuIHVwIGlzIG5lZWRlZC4gSW4gb3RoZXIgd29ya3MsIGNsZWFudXAgYXQgdGhlIGFkYXRwZXIKLQkgKiBsZXZlbCBpcyBub3QgcHJvdmlkZWQgYnkgaW5mcmFzdHJ1Y3R1cmUuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lOb2RlTm90aWZpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVOb3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzZmZTc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVOb3RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogSU5vZGVOb3RpZmllcnMgYW5kIElOb2RlQWRhcHRlcnMgZm9ybSBhIGNvbGxhYm9yYXRpb24gdGhhdCBhbGxvd3MgY2xpZW50cwotICogdG8gdXNlIHRoZSB0eXBpY2FsIGFkYXB0ZXIgcGF0dGVybiBidXQgd2l0aCBub3RpZmljYXRpb24gYWRkZWQsIHRoYXQgaXMsCi0gKiBjbGllbnQncyBhZGFwdGVycyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIG5vZGVOb3RpZmllciBjaGFuZ2VzLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlTm90aWZpZXIgewotCi0JLyoqCi0JICogVGhlIGNoYW5nZSByZXByZXNlbnRzIGEgbm9uLXN0cnVjdHVyYWwgY2hhbmdlLCBzZW50IHRvIG5vZGUgbm90aWZpZXIncwotCSAqIHBhcmVudC4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IENIQU5HRSA9IDE7Ci0JLyoqCi0JICogVGhlIGNoYW5nZSByZXByZXNlbnRzIGFuIGFkZCBldmVudC4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IEFERCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgY2hhbmdlIHJlcHJlc2VudHMgYSByZW1vdmUgZXZlbnQuCi0JICovCi0Jc3RhdGljIGZpbmFsIGludCBSRU1PVkUgPSAzOwotCi0JLyoqCi0JICogVGhlIGNoYW5nZSByZXByZXNlbnRzIGEgc3RydWN0dXJhbCBjaGFuZ2UsIHNlbnQgdG8gbGVhc3QtY29tbW9uIHBhcmVudAotCSAqIG9mIG5vZGUgbm90aWZpZXJzIGludm9sdmVkIGluIHRoZSBzdHJ1Y3R1cmFsIGNoYW5nZQotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgU1RSVUNUVVJFX0NIQU5HRUQgPSA0OwotCi0JLyoqCi0JICogVGhlIGNoYW5nZSByZXByZXNlbnRzIGEgbm90aWZpY2F0aW9uIHRvIHBhcmVudCBub3RpZmllciB0aGFuIGl0cwotCSAqIGNvbnRlbnRzIGhhdmUgY2hhbmdlZC4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfQ0hBTkdFRCA9IDU7Ci0KLQotCS8qKgotCSAqIE5PVCBBUEk6IHRoZXNlIHN0cmluZ3MgYXJlIGZvciBwcmludGluZywgc3VjaCBhcyBkdXJpbmcgZGVidWdnaW5nCi0JICovCi0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVWRU5UX1RZUEVfU1RSSU5HUyA9IG5ldyBTdHJpbmdbXXsidW5kZWZpbmVkIiwgIkNIQU5HRSIsICJBREQiLCAiUkVNT1ZFIiwgIlNUUlVDVFVSRV9DSEFOR0VEIiwgIkNPTlRFTlRfQ0hBTkdFRCJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCi0KLQkvKioKLQkgKiBBZGQgYW4gYWRhcHRlciBvZiB0aGlzIG5vdGlmaWVyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogICAgICAgICAgICB0aGUgYWRhcHRlciB0byBiZSBhZGRlZAotCSAqIAotCSAqLwotCXZvaWQgYWRkQWRhcHRlcihJTm9kZUFkYXB0ZXIgYWRhcHRlcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gZXhpc2l0aW5nIGFkYXB0ZXIgb2YgdHlwZSAidHlwZSIgb3IgaWYgbm9uZSBmb3VuZCBjcmVhdGUgYQotCSAqIG5ldyBhZGFwdGVyIHVzaW5nIGEgcmVnaXN0ZXJlZCBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlJTm9kZUFkYXB0ZXIgZ2V0QWRhcHRlckZvcihPYmplY3QgdHlwZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSByZWFkLW9ubHkgQ29sbGVjdGlvbiBvZiB0aGUgQWRhcHRlcnMgdG8gdGhpcyBub3RpZmllci4KLQkgKiAKLQkgKiBAcmV0dXJuIGNvbGxlY3Rpb24gb2YgYWRhcHRlcnMuCi0JICovCi0JQ29sbGVjdGlvbiBnZXRBZGFwdGVycygpOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIGV4aXNpdGluZyBhZGFwdGVyIG9mIHR5cGUgInR5cGUiIG9yIG51bGwgaWYgbm9uZSBmb3VuZAotCSAqLwotCUlOb2RlQWRhcHRlciBnZXRFeGlzdGluZ0FkYXB0ZXIoT2JqZWN0IHR5cGUpOwotCi0JLyoqCi0JICogc2VudCB0byBhZGFwdGVyIHdoZW4gaXRzIG5vZGVOb3RpZmllciBjaGFuZ2VzLgotCSAqLwotCXZvaWQgbm90aWZ5KGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpOwotCi0JLyoqCi0JICogUmVtb3ZlIGFuIGFkYXB0ZXIgb2YgdGhpcyBub3RpZmllci4gSWYgdGhlIGFkYXB0ZXIgZG9lcyBub3QgZXhpc3QgZm9yCi0JICogdGhpcyBub2RlIG5vdGlmaWVyLCB0aGlzIHJlcXVlc3QgaXMgaWdub3JlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqICAgICAgICAgICAgdGhlIGFkYXB0ZXIgdG8gcmVtb3ZlCi0JICovCi0Jdm9pZCByZW1vdmVBZGFwdGVyKElOb2RlQWRhcHRlciBhZGFwdGVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVN0cnVjdHVyZWRNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JU3RydWN0dXJlZE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYTU1ZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JU3RydWN0dXJlZE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VBbHJlYWR5RXhpc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLQotCi0vKioKLSAqIElTdHJ1Y3R1cmVkTW9kZWxzIGFyZSBtYWlubHkgaW50ZXJlc3RpbmcgYnkgdGhlaXIgZXh0ZW5zaW9ucyBhbmQKLSAqIGltcGxlbWVudGVycy4gVGhlIG1haW4gcHVycG9zZWQgb2YgdGhpcyBhYnN0cmFjdGlvbiBpcyB0byBwcm92aWRlIGEgY29tbW9uCi0gKiBtZWFucyB0byBtYW5hZ2UgbW9kZWxzIHRoYXQgaGF2ZSBhbiBhc3NvY2lhdGVkIHN0cnVjdHVyZWQgZG9jdW1lbnQuCi0gKiAKLSAqIDxwPgotICogVE9ETzogdGhpcyBpbnRlcmZhY2UgbmVlZHMgdG9uIG9mIGNsZWFudXAhCi0gKiA8L3A+Ci0gKiAKLSAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZE1vZGVsIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0KLQotCS8qKgotCSAqIFRoaXMgQVBJIGFsbG93cyBjbGllbnRzIHRvIGRlY2xhcmUgdGhhdCB0aGV5IGFyZSBhYm91dCB0byBtYWtlIGEKLQkgKiAibGFyZ2UiIGNoYW5nZSB0byB0aGUgbW9kZWwuIFRoaXMgY2hhbmdlIG1pZ2h0IGJlIGluIHRlcm1zIG9mIGNvbnRlbnQKLQkgKiBvciBpdCBtaWdodCBiZSBpbiB0ZXJtcyBvZiB0aGUgbW9kZWwgaWQgb3IgYmFzZSBsb2NhdGlvbi4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgZW1iZWRkZWQgY2FsbHMsIG5vdGlmaWNhdGlvbiB0byBsaXN0ZW5lcnMgaXMKLQkgKiBzZW50IG9ubHkgb25jZS4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgdGhlIGNsaWVudCB3aG8gaXMgbWFraW5nIHRoZXNlIGNoYW5nZXMgaGFzIHRoZSByZXNwb25zaWJpbGl0eQotCSAqIHRvIHJlc3RvcmUgdGhlIG1vZGVsJ3Mgc3RhdGUgb25jZSBmaW5pc2hlZCB3aXRoIHRoZSBjaGFuZ2VzLiBTZWUKLQkgKiBnZXRNZW1lbnRvIGFuZCByZXN0b3JlU3RhdGUuCi0JICogCi0JICogVGhlIG1ldGhvZCBpc01vZGVsU3RhdGVDaGFuZ2luZyBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkZXRlcm1pbmUgaWYKLQkgKiB0aGUgbW9kZWwgaXMgYWxyZWFkeSBpbiBhIGNoYW5nZSBzZXF1ZW5jZS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIG1hdGNoZWQgcGFpciB0byBjaGFuZ2VkTW9kZWwsIGFuZCBtdXN0IGJlIGNhbGxlZAotCSAqIGJlZm9yZSBjaGFuZ2VkTW9kZWwuIEEgY2xpZW50IHNob3VsZCBuZXZlciBjYWxsIGNoYW5nZWRNb2RlbCB3aXRob3V0Ci0JICogY2FsbGluZyBhYm91dFRvQ2hhbmdlTW9kZWwgZmlyc3Qgbm9yIGNhbGwgYWJvdXRUb0NoYW5nZU1vZGVsIHdpdGhvdXQKLQkgKiBjYWxsaW5nIGNoYW5nZWRNb2RlbCBsYXRlciBmcm9tIHRoZSBzYW1lIFRocmVhZC4KLQkgKi8KLQl2b2lkIGFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0Jdm9pZCBhZGRNb2RlbExpZmVjeWNsZUxpc3RlbmVyKElNb2RlbExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCXZvaWQgYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKElNb2RlbFN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3Rlcik7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpOwotCi0JLyoqCi0JICogVGhpcyBBUEkgYWxsb3dzIGEgY2xpZW50IGNvbnRyb2xsZWQgd2F5IG9mIG5vdGlmeWluZyBhbGwgTW9kZWxFdmVudAotCSAqIGxpc3RlbmVycyB0aGF0IHRoZSBtb2RlbCBoYXMgYmVlbiBjaGFuZ2VkLiBUaGlzIG1ldGhvZCBpcyBhIG1hdGNoZWQKLQkgKiBwYWlyIHRvIGFib3V0VG9DaGFuZ2VNb2RlbCwgYW5kIG11c3QgYmUgY2FsbGVkIGFmdGVyIGFib3V0VG9DaGFuZ2VNb2RlbAotCSAqIC4uLiBvciBzb21lIGxpc3RlbmVycyBjb3VsZCBiZSBsZWZ0IHdhaXRpbmcgaW5kZWZpbml0ZWx5IGZvciB0aGUKLQkgKiBjaGFuZ2VkIGV2ZW50LiBTbywgaXRzIHN1Z2dlc3RlZCB0aGF0IGNoYW5nZWRNb2RlbCBhbHdheXMgYmUgaW4gYQotCSAqIGZpbmFsbHkgY2xhdXNlLiBMaWtld2lzZSwgYSBjbGllbnQgc2hvdWxkIG5ldmVyIGNhbGwgY2hhbmdlZE1vZGVsCi0JICogd2l0aG91dCBjYWxsaW5nIGFib3V0VG9DaGFuZ2VNb2RlbCBmaXJzdC4KLQkgKiAKLQkgKiBJbiB0aGUgY2FzZSBvZiBlbWJlZGRlZCBjYWxscywgdGhlIG5vdGlmaWNhdGlvbiBpcyBqdXN0IHNlbnQgb25jZS4KLQkgKiAKLQkgKi8KLQl2b2lkIGNoYW5nZWRNb2RlbCgpOwotCi0JbG9uZyBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoSVJlc291cmNlIHJlc291cmNlKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogQHNlZSBJTW9kZWxNYW5hZ2VyI2NvcHlNb2RlbEZvckVkaXQoU3RyaW5nLCBTdHJpbmcpCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjb3B5KFN0cmluZyBpZCkgdGhyb3dzIFJlc291cmNlSW5Vc2UsIFJlc291cmNlQWxyZWFkeUV4aXN0czsKLQotCS8qKgotCSAqIERpc2FibGUgdW5kbyBtYW5hZ2VtZW50LgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gdGhlIGFiaWxpdHkgdG8gZW5hYmxlIGFuZCBkaXNhYmxlIFVuZG8gbWFuYWdlbWVudCBmb3IgdGhlCi0JICogICAgICAgICAgICAgbW9kZWwgY2Fubm90IGJlIGd1YXJhbnRlZWQgYXMgaXQgaW1wbGljaXRseSByZXF1aXJlcwotCSAqICAgICAgICAgICAgIGtub3dsZWRnZSBvZiB0aGUgdW5kZXJseWluZyB1bmRvL3JlZG8gaW1wbGVtZW50YXRpb24KLQkgKi8KLQl2b2lkIGRpc2FibGVVbmRvTWFuYWdlbWVudCgpOwotCi0JLyoqCi0JICogRW5hYmxlIHVuZG8gbWFuYWdlbWVudC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtIHRoZSBhYmlsaXR5IHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBVbmRvIG1hbmFnZW1lbnQgZm9yIHRoZQotCSAqICAgICAgICAgICAgIG1vZGVsIGNhbm5vdCBiZSBndWFyYW50ZWVkIGFzIGl0IGltcGxpY2l0bHkgcmVxdWlyZXMKLQkgKiAgICAgICAgICAgICBrbm93bGVkZ2Ugb2YgdGhlIHVuZGVybHlpbmcgdW5kby9yZWRvIGltcGxlbWVudGF0aW9uCi0JICovCi0Jdm9pZCBlbmFibGVVbmRvTWFuYWdlbWVudCgpOwotCi0JLyoqCi0JICogRW5kIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKTsKLQotCS8qKgotCSAqIEVuZCByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgYSBjbGllbnQtZGVmaW5lZCB2YWx1ZSBmb3Igd2hhdCB0aGF0IGNsaWVudCAoYW5kL29yIGxvYWRlcikKLQkgKiBjb25zaWRlcnMgdGhlICJiYXNlIiBvZiB0aGUgc3RydWN0dXJlZCBtb2RlbC4gRnJlcXVlbnRseSB0aGUgbG9jYXRpb24KLQkgKiBpcyBlaXRoZXIgYSB3b3Jrc3BhY2Ugcm9vdC1yZWxhdGl2ZSBwYXRoIG9mIGEgd29ya3NwYWNlIHJlc291cmNlIG9yIGFuCi0JICogYWJzb2x1dGUgcGF0aCBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi0JICovCi0JU3RyaW5nIGdldEJhc2VMb2NhdGlvbigpOwotCi0JLyoqCi0JICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCBjb250ZW50IHR5cGUgaWRlbnRpZmllciAoU3RyaW5nKSBmb3IgdGhpcyBtb2RlbC4KLQkgKiAgICAgICAgIFRoaXMgdmFsdWUgbWF5IGJlIG1vcmUgYWNjdXJhdGUgdGhhbiB0aGUgY29udGVudCB0eXBlIGFnYWluc3QKLQkgKiAgICAgICAgIHdoaWNoIHRoZSBtb2RlbCBoYW5kbGVyIHdhcyByZWdpc3RlcmVkLgotCSAqICAgICAgICAgCi0JICogICAgICAgICBAc2VlIElNb2RlbEhhbmRsZXIjZ2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoKQotCSAqLwotCVN0cmluZyBnZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG1vZGVsJ3MgRmFjdG9yeVJlZ2lzdHJ5LiBBIG1vZGVsIGlzIG5vdCB2YWxpZCB3aXRob3V0IG9uZS4KLQkgKi8KLQlGYWN0b3J5UmVnaXN0cnkgZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0KLQkvKioKLQkgKiBUaGUgaWQgaXMgdGhlIGlkIHRoYXQgdGhlIG1vZGVsIG1hbmFnZXIgdXNlcyB0byBpZGVudGlmeSB0aGlzIG1vZGVsCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBhIHRleHQgb2Zmc2V0IHdpdGhpbiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudAotCSAqIEByZXR1cm4gYW4gSW5kZXhlZFJlZ2lvbiBjb250YWluaW5nIHRoaXMgb2Zmc2V0IG9yIG51bGwgaWYgb25lIGNvdWxkCi0JICogICAgICAgICBub3QgYmUgZm91bmQKLQkgKi8KLQlJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBtb2RlbCdzIGhhbmRsZXIKLQkgKi8KLQlJTW9kZWxIYW5kbGVyIGdldE1vZGVsSGFuZGxlcigpOwotCi0JSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbAotCSAqLwotCWludCBnZXRSZWZlcmVuY2VDb3VudCgpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBlZGl0LXJlc3BvbnNpYmxlIHJlZmVyZW5jZSBjb3VudCBvZgotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbCBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiAgICAgICAgICAgIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqLwotCWludCBnZXRSZWZlcmVuY2VDb3VudEZvckVkaXQoKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVhZGVyIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKi8KLQlpbnQgZ2V0UmVmZXJlbmNlQ291bnRGb3JSZWFkKCk7Ci0KLQlPYmplY3QgZ2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKCk7Ci0KLQkvKioKLQkgKiBHZXQgVVJJIHJlc29sdXRpb24gaGVscGVyCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSB1c2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigqKSBpbnN0ZWFkCi0JICovCi0JVVJJUmVzb2x2ZXIgZ2V0UmVzb2x2ZXIoKTsKLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBtb2RpZmljYXRpb24gZGF0ZSBvZiB1bmRlcmx5aW5nIHJlc291cmNlLCB3aGVuIHRoaXMgbW9kZWwgd2FzIG9wZW4sIG9yCi0JICogbGFzdCBzYXZlZC4gKE5vdGU6IGZvciB0aGlzIHZlcnNpb24sIHRoZSBjbGllbnQgbXVzdCBtYW5hZ2UgdGhlCi0JICogYWNjdXJhY3kgb2YgdGhpcyBkYXRhKQotCSAqLwotCWxvbmcgZ2V0U3luY2hyb25pemF0aW9uU3RhbXAoKTsKLQotCS8qKgotCSAqIEdldCB1bmRvIG1hbmFnZXIuCi0JICovCi0JSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgZ2V0VW5kb01hbmFnZXIoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNEaXJ0eSgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZGVsIGlzIHdpdGhpbiBhCi0JICogImFib3V0VG9DaGFuZ2UiIGFuZCAiY2hhbmdlZCIgc2VxdWVuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RlbFN0YXRlQ2hhbmdpbmcoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNOZXcoKTsKLQotCWJvb2xlYW4gaXNSZWluaXRpYWxpemF0aW9uTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgY29tYmluYXRpb24gb2YgaWYgdGhlIG1vZGVsIGlzIGRpcnR5IGFuZCBpZiB0aGUgbW9kZWwgaXMKLQkgKiBzaGFyZWQgZm9yIHdyaXRlIGFjY2Vzcy4gVGhlIGxhc3Qgd3JpdGVyIGFzIHRoZSByZXNwb25zaWJpbGl0eSB0byBiZQotCSAqIHN1cmUgdGhlIHVzZXIgaXMgcHJvbXB0ZWQgdG8gc2F2ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGVpdGhlciBpc1NoYXJlZEZvclJlYWQgb3IgaXNTaGFyZWRGb3JFZGl0Ci0JICogaXMgdHJ1ZS4KLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCWJvb2xlYW4gaXNTaGFyZWRGb3JFZGl0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCWJvb2xlYW4gaXNTaGFyZWRGb3JSZWFkKCk7Ci0KLQkvKioKLQkgKiBuZXdJbnN0YW5jZSBpcyBzaW1pbGFyIHRvIGNsb25lLCBleGNlcHQgdGhhdCB0aGUgbmV3SW5zdGFuY2UgY29udGFpbnMKLQkgKiBubyBjb250ZW50LiBJdHMgcHVycG9zZSBpcyBzbyBjbGllbnRzIGNhbiBnZXQgYSB0ZW1wb3JhcnksIHVubWFuYWdlZCwKLQkgKiBtb2RlbCBvZiB0aGUgc2FtZSAidHlwZSIgYXMgdGhlIG9yaWdpbmFsLiBOb3RlOiB0aGUgY2xpZW50IG1heSBzdGlsbAotCSAqIG5lZWQgdG8gZG8gc29tZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgbW9kZWwgcmV0dXJuZWQgYnkgbmV3SW5zdGFuY2UsCi0JICogZGVwZW5kaW5nIG9uIGRlc2lyZWQgdXNlLiBGb3IgZXhhbXBsZSwgdGhlIG9ubHkgZmFjdG9yaWVzIGluIHRoZQotCSAqIG5ld0luc3RhbmNlIGFyZSB0aG9zZSB0aGF0IHdvdWxkIGJlIG5vcm1hbGx5IGJlIGNyZWF0ZWQgZm9yIGEgbW9kZWwgb2YKLQkgKiB0aGUgZ2l2ZW4gY29udGVudFR5cGUuIE90aGVycyBhcmUgbm90IGNvcGllZCBhdXRvbWF0aWNhbGx5LCBhbmQgaWYKLQkgKiBkZXNpcmVkLCBzaG91bGQgYmUgYWRkZWQgYnkgY2xpZW50LgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3SW5zdGFuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBhIHJlaW5pdGlhbGl6YXRpb24gcHJvY2VkdXJlLiBGb3IgdGhpcyBtb2RlbC4gTm90ZSBmb3IgZnV0dXJlOgotCSAqIHRoZXJlIG1heSBiZSBhIGRheSB3aGVyZSB0aGUgbW9kZWwgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCBpcyBhCi0JICogZGlmZmVyZW50IGluc3RhbmNlIHRoYW4gdGhlIGluc3RhbmNlIGl0IHdhcyBjYWxsZWQgb24uIFRoaXMgd2lsbCBvY2N1cgotCSAqIHdoZW4gdGhlcmUgaXMgZnVsbCBzdXBwb3J0IGZvciAic2F2ZSBhcyIgdHlwZSBmdW5jdGlvbnMsIHdoZXJlIHRoZQotCSAqIG1vZGVsIGNvdWxkIHRoZW9yZXRpY2FsbHkgY2hhbmdlIGNvbXBsZXRlbHkuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCByZWluaXQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgbW9kZWwgdG8gZnJlZSB1cCBhbnkgcmVzb3VyY2VzIGl0IG1pZ2h0IGJlCi0JICogdXNpbmcuIEluIHBhcnRpY3VsYXIsIGl0c2VsZiwgYXMgc3RvcmVkIGluIHRoZSBJTW9kZWxNYW5hZ2VyLgotCSAqIAotCSAqLwotCXZvaWQgcmVsZWFzZUZyb21FZGl0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgbW9kZWwgdG8gZnJlZSB1cCBhbnkgcmVzb3VyY2VzIGl0IG1pZ2h0IGJlCi0JICogdXNpbmcuIEluIHBhcnRpY3VsYXIsIGl0c2VsZiwgYXMgc3RvcmVkIGluIHRoZSBJTW9kZWxNYW5hZ2VyLgotCSAqIAotCSAqLwotCXZvaWQgcmVsZWFzZUZyb21SZWFkKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJlcGxlbmlzaGVzIHRoZSBtb2RlbCB3aXRoIHRoZSByZXNvdXJjZSB3aXRob3V0IHNhdmluZwotCSAqIGFueSBwb3NzaWJsZSBjaGFuZ2VzLiBJdCBpcyB1c2VkIHdoZW4gb25lIGVkaXRvciBtYXkgYmUgY2xvc2luZywgYW5kCi0JICogc3BlY2lmaWNhbGx5IHNheXMgbm90IHRvIHNhdmUgdGhlIG1vZGVsLCBidXQgYW5vdGhlciAiZGlzcGxheSIgb2YgdGhlCi0JICogbW9kZWwgc3RpbGwgbmVlZHMgdG8gaGFuZyBvbiB0byBzb21lIG1vZGVsLCBzbyBuZWVkcyBhIGZyZXNoIGNvcHkuCi0JICogCi0JICogT25seSB2YWxpZCBmb3IgdXNlIHdpdGggbWFuYWdlZCBtb2RlbHMuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCByZWxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXZvaWQgcmVtb3ZlTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcihJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQl2b2lkIHJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcihJTW9kZWxTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEEgbWV0aG9kIHRoYXQgbW9kaWZpZXMgdGhlIG1vZGVsJ3Mgc3luY2hyb25pemF0aW9uIHN0YW1wIHRvIG1hdGNoIHRoZQotCSAqIHJlc291cmNlLiBUdXJucyBvdXQgdGhlcmUncyBzZXZlcmFsIHdheXMgb2YgZG9pbmcgaXQsIHNvIHRoaXMgZW5zdXJlcyBhCi0JICogY29tbW9uIGFsZ29yaXRobS4KLQkgKi8KLQl2b2lkIHJlc2V0U3luY2hyb25pemF0aW9uU3RhbXAoSVJlc291cmNlIHJlc291cmNlKTsKLQotCXZvaWQgcmVzb3VyY2VEZWxldGVkKCk7Ci0KLQl2b2lkIHJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCk7Ci0KLQl2b2lkIHNhdmUoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHdpbGwgc2F2ZSBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIHByaW9yaXRpZXMgc3BlY2lmaWVkIGZvciB0aGUgSUZpbGUgCi0JICovCi0Jdm9pZCBzYXZlKEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCXZvaWQgc2F2ZShJRmlsZSBpRmlsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB3aWxsIHNhdmUgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBwcmlvcml0aWVzIHNwZWNpZmllZCBmb3IgdGhlIElGaWxlIAotCSAqLwotCXZvaWQgc2F2ZShJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0Jdm9pZCBzYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNldHMgdGhlIGJhc2UgbG9jYXRpb24gb2YgdGhpcyBtb2RlbCB0byB0aGUgbmV3IHZhbHVlLCBhbHNvIHVwZGF0aW5nCi0JICogdGhlIHZhbHVlIGluIGl0cyBVUkkgcmVzb2x1dGlvbiBoZWxwZXIgaWYgb25lIGlzIHByZXNlbnQuCi0JICogCi0JICogQHBhcmFtIG5ld0Jhc2VMb2NhdGlvbgotCSAqLwotCXZvaWQgc2V0QmFzZUxvY2F0aW9uKFN0cmluZyBuZXdCYXNlTG9jYXRpb24pOwotCi0JcHVibGljIHZvaWQgc2V0RGlydHlTdGF0ZShib29sZWFuIGRpcnR5U3RhdGUpOwotCi0Jdm9pZCBzZXRGYWN0b3J5UmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KTsKLQotCS8qKgotCSAqIFRoZSBpZCBpcyB0aGUgaWQgdGhhdCB0aGUgbW9kZWwgbWFuYWdlciB1c2VzIHRvIGlkZW50aWZ5IHRoaXMgbW9kZWwKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyBpZCkgdGhyb3dzIFJlc291cmNlSW5Vc2U7Ci0KLQl2b2lkIHNldE1vZGVsSGFuZGxlcihJTW9kZWxIYW5kbGVyIG1vZGVsSGFuZGxlcik7Ci0KLQl2b2lkIHNldE1vZGVsTWFuYWdlcihJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcik7Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXdTdGF0ZShib29sZWFuIG5ld1N0YXRlKTsKLQotCS8qKgotCSAqIFNldHMgYSAiZmxhZyIgdGhhdCByZWluaXRpYWxpemF0aW9uIGlzIG5lZWRlZC4KLQkgKi8KLQl2b2lkIHNldFJlaW5pdGlhbGl6ZU5lZWRlZChib29sZWFuIGIpOwotCi0JLyoqCi0JICogSG9sZHMgYW55IGRhdGEgdGhhdCB0aGUgcmVpbml0aWFsaXphdGlvbiBwcm9jZWR1cmUgbWlnaHQgZmluZCB1c2VmdWwgaW4KLQkgKiByZWluaXRpYWxpemluZyB0aGUgbW9kZWwuIFRoaXMgaXMgaGFuZHksIHNpbmNlIHRoZSByZWluaXRpYWxpemF0aW9uIG1heQotCSAqIG5vdCB0YWtlIHBsYWNlIGF0IG9uY2UsIGFuZCBzb21lICJvbGQiIGRhdGEgbWF5IGJlIG5lZWRlZCB0byBwcm9wZXJseQotCSAqIHVuZG8gcHJldmlvdXMgc2V0dGluZ3MuIE5vdGU6IHRoZSBwYXJhbWV0ZXIgd2FzIGludGVudGlvbmFsbHkgbWFkZSB0bwotCSAqIGJlIG9mIHR5cGUgJ09iamVjdCcgc28gZGlmZmVyZW50IG1vZGVscyBjYW4gdXNlIGluIGRpZmZlcmVudCB3YXlzLgotCSAqLwotCXZvaWQgc2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKE9iamVjdCBvYmplY3QpOwotCi0JLyoqCi0JICogU2V0IHRoZSBVUkkgcmVzb2x1dGlvbiBoZWxwZXIKLQkgKi8KLQl2b2lkIHNldFJlc29sdmVyKFVSSVJlc29sdmVyIHVyaVJlc29sdmVyKTsKLQotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KTsKLQotCS8qKgotCSAqIFNldCB1bmRvIG1hbmFnZXIuCi0JICovCi0Jdm9pZCBzZXRVbmRvTWFuYWdlcihJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0luZGV4ZWRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSW5kZXhlZFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWU5NTM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSW5kZXhlZFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotCi0KLS8qKgotICogVGhpcyB0eXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgcG9zaXRpb25zIGFuZCBsZW5ndGhzIGluIHNvdXJjZS4gTm90aWNlIHRoYXQKLSAqIHdoaWxlIGdldEVuZE9mZnNldCBhbmQgZ2V0TGVuZ3RoIGFyZSByZWR1bmRhbnQsIGdpdmVuIHRoYXQKLSAqIAotICogPHByZT4KLSAqIDxjb2RlPgotICogICAgICAgICAgZ2V0RW5kT2Zmc2V0KCkgPT0gZ2V0U3RhcnRPZmZzZXQoKSArIGdldExlbmd0aCgpOyAKLSAqIDwvY29kZT4KLSAqIDwvcHJlPgotICogCi0gKiB3ZSBwcm92aWRlIChyZXF1aXJlKSBib3RoIHNpbmNlIGluIHNvbWUgY2FzZXMgaW1wbGVtZW50b3JzIG1heSBiZSBhYmxlIHRvCi0gKiBwcm92aWRlIG9uZSBvciB0aGUgb3RoZXIgbW9yZSBlZmZpY2llbnRseS4KLSAqIAotICogTm90ZTogaXQgaXMgbm90IHBhcnQgb2YgdGhlIEFQSSBjb250cmFjdCB0aGF0IGltcGxlbWVudG9ycyBvZiBJbmRleGVkUmVnaW9uIC0tCi0gKiBhcyBhIHdob2xlIGNvbGxlY3Rpb24gZm9yIGEgcGFydGljdWxhciBzb3VyY2UgLS0gbXVzdCBjb21wbGV0ZWx5IGNvdmVyIHRoZQotICogb3JpZ2luYWwgc291cmNlLiBUaGV5IGN1cnJlbnRseSBvZnRlbiBkbywgc28gdGhvdWdodCBJJ2QgbWVudGlvbiBleHBsaWNpdGx5Ci0gKiB0aGlzIG1heSBub3QgYWx3YXlzIGJlIHRydWUuCi0gKiAKLSAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJbmRleGVkUmVnaW9uIHsKLQotCS8qKgotCSAqIENhbiBiZSB1c2VkIHRvIHRlc3QgaWYgdGhlIGluZGV4ZWQgcmVnaW9ucyBjb250YWlucyB0aGUgdGVzdCBwb3NpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdGVzdFBvc2l0aW9uCi0JICogQHJldHVybiB0cnVlIGlmIHRlc3QgcG9zaXRpb24gaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHN0YXJ0IG9mZnNldAotCSAqICAgICAgICAgYW5kIGxlc3MgdGhhbiBzdGFydCBvZmZzZXQgcGx1cyBsZW5ndGguCi0JICovCi0JYm9vbGVhbiBjb250YWlucyhpbnQgdGVzdFBvc2l0aW9uKTsKLQotCS8qKgotCSAqIENhbiBiZSB1c2VkIHRvIGdldCBlbmQgb2Zmc2V0IG9mIHNvdXJjZSB0ZXh0LCByZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2YKLQkgKiBkb2N1bW50LiBJbXBsZW1lbnRlcnMgc2hvdWxkIHJldHVybiAtMSBpZiwgb3Igc29tZSByZWFzb24sIHRoZSByZWdpb24KLQkgKiBpcyBub3QgdmFsaWQuCi0JICogCi0JICogQHJldHVybiBlbmRvZmZzZXQKLQkgKi8KLQlpbnQgZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBDYW4gYmUgdXNlZCB0byBnZXQgc291cmNlIHBvc3Rpb24gb2YgYmVnaW5uaW5nIG9mIGluZGV4ZWQgcmVnaW9uLgotCSAqIEltcGxlbWVudGVycyBzaG91bGQgcmV0dXJuIC0xIGlmLCBvciBzb21lIHJlYXNvbiwgdGhlIHJlZ2lvbiBpcyBub3QKLQkgKiB2YWxpZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGludCBwb3NpdGlvbiBvZiBzdGFydCBvZiBpbmRleCByZWdpb24uCi0JICovCi0JaW50IGdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBDYW4gYmUgdXNlZCB0byBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIHRleHQuIEltcGxlbWVudGVycyBzaG91bGQKLQkgKiByZXR1cm4gLTEgaWYsIG9yIHNvbWUgcmVhc29uLCB0aGUgcmVnaW9uIGlzIG5vdCB2YWxpZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGludCBwb3NpdGlvbiBvZiBsZW5ndGggb2YgaW5kZXggcmVnaW9uLgotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1N0cnVjdHVyZWRNb2RlbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFlYmM0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1N0cnVjdHVyZWRNb2RlbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLk1vZGVsTWFuYWdlckltcGw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBDbGFzcyB0byBhbGxvdyBhY2Nlc3MgdG8gTW9kZWxNYW5hZ2VyLiBOb3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSB0aGUgb25lIHRoYXQgaXMgaW4KLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHRydWN0dXJlZE1vZGVsTWFuYWdlcgotICovCi1maW5hbCBwdWJsaWMgY2xhc3MgU3RydWN0dXJlZE1vZGVsTWFuYWdlciB7Ci0JLyoqCi0JICogRG8gbm90IGFsbG93IGluc3RhbmNlcyB0byBiZSBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZE1vZGVsTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGluc3RhbmNlIG9mIElNb2RlbE1hbmFnZXIuIFJldHVybnMgbnVsbCBpZiBtb2RlbAotCSAqIG1hbmFnZXIgY2FuIG5vdCBiZSBjcmVhdGVkIG9yIGlzIG5vdCB2YWxpZCAoc3VjaCBhcywgd2hlbiB3b3JrYmVuY2ggaXMKLQkgKiBzaHV0dGluZyBkb3duKS4KLQkgKiAKLQkgKiBAcmV0dXJuIElNb2RlbE1hbmFnZXIgLSByZXR1cm5zIHRoZSBvbmUgbW9kZWwgbWFuYWdlciBmb3Igc3RydWN0dXJlZAotCSAqICAgICAgICAgbW9kZWwKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSB0aGUgb25lIHRoYXQgaXMgaW4KLQkgKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0JCWJvb2xlYW4gaXNSZWFkeSA9IGZhbHNlOwotCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCXdoaWxlICghaXNSZWFkeSkgewotCQkJQnVuZGxlIGxvY2FsQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFNTRUNvcmVQbHVnaW4uSUQpOwotCQkJaW50IHN0YXRlID0gbG9jYWxCdW5kbGUuZ2V0U3RhdGUoKTsKLQkJCWlmIChzdGF0ZSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQkJaXNSZWFkeSA9IHRydWU7Ci0JCQkJLy8gZ2V0SW5zdGFuY2UgaXMgYSBzeW5jaHJvbml6ZWQgc3RhdGljIG1ldGhvZC4KLQkJCQltb2RlbE1hbmFnZXIgPSBNb2RlbE1hbmFnZXJJbXBsLmdldEluc3RhbmNlKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzdGF0ZSA9PSBCdW5kbGUuU1RBUlRJTkcpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlLCBqdXN0IGxvb3AgYWdhaW4KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChzdGF0ZSA9PSBCdW5kbGUuU1RPUFBJTkcgfHwgc3RhdGUgPT0gQnVuZGxlLlVOSU5TVEFMTEVEKSB7Ci0JCQkJaXNSZWFkeSA9IHRydWU7Ci0JCQkJbW9kZWxNYW5hZ2VyID0gbnVsbDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5vdCBzdXJlIGFib3V0IG90aGVyIHN0YXRlcywgJ3Jlc29sdmVkJywgJ2luc3RhbGxlZCcKLQkJCQlpc1JlYWR5ID0gdHJ1ZTsKLQkJCQltb2RlbE1hbmFnZXIgPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbE1hbmFnZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRW5jb2RlZERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lFbmNvZGVkRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2NDcxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lFbmNvZGVkRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHN0cmljdGx5IHRvIGRlZmluZSBpbXBvcnRhbnQgImRvY3VtZW50IHByb3BlcnRpZXMiIG5vdAotICogZm91bmQgaW4gSURvY3VtZW50LCBidXQgbm90IGNlbnRyYWwgdG8gIlN0cnVjdHVyZWREb2N1bWVudCIuCi0gKiAKLSAqIEl0cyBub3QgdG8gYmUgYmUgaW1wbG1lbnRlZCBieSBjbGllbnRzLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElFbmNvZGVkRG9jdW1lbnQgZXh0ZW5kcyBJRG9jdW1lbnQgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5jb2RpbmcgbWVtZW50byBmb3IgdGhpcyBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlbmNvZGluZyBtZW1lbnRvIGZvciB0aGlzIGRvY3VtZW50LgotCSAqLwotCUVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByZWZlcnJlZCBsaW5lIGRlbGltaXRlciBmb3IgdGhpcyBkb2N1bWVudC4KLQkgKi8KLQlTdHJpbmcgZ2V0UHJlZmVycmVkTGluZURlbGltaXRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZW5jb2RpbmcgbWVtZW50byBmb3IgdGhpcyBkb2N1bWVudC4KLQkgKiAKLQkgKiBJcyBub3QgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMsIG9ubHkgZG9jdW1lbnQgY3JlYXRpb24gY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYWxFbmNvZGluZ01lbWVudG8KLQkgKi8KLQl2b2lkIHNldEVuY29kaW5nTWVtZW50byhFbmNvZGluZ01lbWVudG8gbG9jYWxFbmNvZGluZ01lbWVudG8pOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcHJlZmVycmVkTGluZURlbGltaXRlci4gSXMgbm90IHRvIGJlIGNhbGxlZCBieSBjbGllbnRzLCBvbmx5Ci0JICogZG9jdW1lbnQgY3JlYXRpb24gY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvYmFibGVMaW5lRGVsaW1pdGVyCi0JICovCi0Jdm9pZCBzZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKFN0cmluZyBwcm9iYWJsZUxpbmVEZWxpbWl0ZXIpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lTdHJ1Y3R1cmVkRG9jdW1lbnRQcm9wb3NlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JU3RydWN0dXJlZERvY3VtZW50UHJvcG9zZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwZjQ3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lTdHJ1Y3R1cmVkRG9jdW1lbnRQcm9wb3NlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotCi0KLS8qKgotICogQSBJU3RydWN0dXJlZERvY3VtZW50IGlzIGEgY29sbGVjdGlvbiBvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLiBJdCdzCi0gKiBvZnRlbiBjYWxsZWQgYSAiZmxhdCBtb2RlbCIgYmVjYXVzZSBpdHMgZG9lcyBjb250YWluIHNvbWUgc3RydWN0dXJhbAotICogaW5mb3JtYXRpb24sIGJ1dCBub3QgdmVyeSBtdWNoLCB1c3VhbGx5LCBhdCBtb3N0LCBhIGZldyBsZXZlbHMgb2YKLSAqIGNvbnRhaW5tZW50LgotICogCi0gKiBDbGllbnRzIHNob3VsZCBub3QgaW1wbGVtZW50LgotICogCi0gKiBAZGVwcmVjYXRlZCAtIHdhcyBuZXZlciB1c2VkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWREb2N1bWVudFByb3Bvc2VkIGV4dGVuZHMgSURvY3VtZW50LCBJRG9jdW1lbnRFeHRlbnNpb24sIElBZGFwdGFibGUgewotCi0JLyoqCi0JICogVGhlIGRvY3VtZW50IGNoYW5naW5nIGxpc3RlbmVycyByZWNlaXZlcyB0aGUgc2FtZSBldmVudHMgYXMgdGhlCi0JICogZG9jdW1lbnQgbGlzdGVuZXJzLCBidXQgdGhlIGRpZmZlcmVuY2UgaXMgdGhlIHRpbWluZyBhbmQKLQkgKiBzeW5jaHJvbml6YXRpb24gb2YgZGF0YSBjaGFuZ2VzIGFuZCBub3RpZmljYXRpb25zLgotCSAqLwotCXZvaWQgYWRkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIHRoaXMgQVBJIGVuc3VyZXMgdGhhdCBhbnkgcG9ydGlvbiBvZiB0aGUgZG9jdW1lbnQgd2l0aGluIHN0YXJ0T2ZmIHRvCi0JICogbGVuZ3RoIGlzIG5vdCByZWFkb25seSAodGhhdCBpcywgdGhhdCBpdHMgZWRpdGFibGUpLiBOb3RlIHRoYXQgaWYgdGhlCi0JICogcmFuZ2Ugb3ZlcmxhcHMgd2l0aCBvdGhlciByZWFkb25seSByZWdpb25zLCB0aG9zZSBvdGhlciByZWFkb25seQotCSAqIHJlZ2lvbnMgd2lsbCBiZSBhZGp1c3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnRPZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICovCi0Jdm9pZCBjbGVhclJlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiByZXR1cm5zIHRydWUgaWYgYW55IHBvcnRpb24gb2Ygc3RhcnRPZmZzZXQgdG8gbGVuZ3RoIGlzIHJlYWRvbmx5Ci0JICogCi0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZ2lvbiBjb250YWluZWQgYnkgb2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KTsKLQotCS8qKgotCSAqIFJlc3R1cm5zIGEgbGlzdCBvZiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zLgotCSAqIAotCSAqIE5vdGU6IHBvc3NpYmx5IGV4cGVuc2l2ZSBjYWxsLCBub3QgdG8gYmUgdXNlZCBjYXN1YWxseS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGdldFJlZ2lvbkxpc3QoKTsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBvZiB0aGlzIGRvY3VtZW50LgotCSAqIAotCSAqIFNhbWUgYXMgJ2dldCcgaW4gc3VwZXIgY2xhc3MsIGFkZGVkIGZvciBkZXNjcmlwdGl2ZW5lc3MuCi0JICogCi0JICogQHJldHVybiB0aGUgdGV4dCBvZiB0aGlzIGRvY3VtZW50LgotCSAqLwotCVN0cmluZyBnZXRUZXh0KCk7Ci0KLQkvKioKLQkgKiBjYXVzZXMgdGhhdCBwb3J0aW9uIG9mIHRoZSBkb2N1bWVudCBmcm9tIHN0YXJ0T2Zmc2V0IHRvIGxlbmd0aCB0byBiZQotCSAqIG1hcmtlZCBhcyByZWFkb25seS4gTm90ZSB0aGF0IGlmIHRoaXMgcmFuZ2Ugb3ZlcmxhcHMgd2l0aCBzb21lIG90aGVyCi0JICogcmVnaW9uIHdpdGggaXMgcmVhZG9ubHksIHRoZSByZWdpb25zIGFyZSBlZmZlY3Rpdmx5IGNvbWJpbmVkLgotCSAqIAotCSAqIEBwYXJhbSBzdGFydE9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKi8KLQl2b2lkIG1ha2VSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogbmV3SW5zdGFuY2UgaXMgc2ltaWxhciB0byBjbG9uZSwgZXhjZXB0IGl0IGNvbnRhaW5zIG5vIGRhdGEuIE9uZQotCSAqIGltcG9ydGFudCB0aGluZyB0byBkdXBsaWNhdGUgaXMgdGhlIHBhcnNlciwgd2l0aCB0aGUgcGFyc2VyIGNvcnJlY3RseQotCSAqICJjbG9uZWQiLCBpbmNsdWRpbmcgaXRzIHRva2VuaW56ZXIsIGJsb2NrIHRhZ3MsIGV0Yy4KLQkgKiAKLQkgKiBOT1RFOiBldmVuIGFmdGVyIG9idGFpbmluZyBhICduZXdJbnN0YW5jZScgdGhlIGNsaWVudCBtYXkgaGF2ZSB0byBkbwotCSAqIHNvbWUgaW5pdGlhbGl6YXRpb24sIGZvciBleGFtcGxlLCBpdCBtYXkgbmVlZCB0byBhZGQgaXRzIG93biBtb2RlbAotCSAqIGxpc3RlbmVycy4gT3IsIGFzIGFub3RoZXIgZXhhbXBsZSwgaWYgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaGFzIGEKLQkgKiBwYXJzZXIgb2YgdHlwZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIsIHRoZW4gdGhlIGNsaWVudCBtYXkgbmVlZAotCSAqIHRvIGFkZCBpdHMgb3duIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgdG8gdGhhdCBwYXJzZXIsIGlmIGl0IGlzCi0JICogaW4gZmFjdCBuZWVkZWQuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFByb3Bvc2VkIG5ld0luc3RhbmNlKCk7Ci0KLQkvKioKLQkgKiBUaGUgZG9jdW1lbnQgY2hhbmdpbmcgbGlzdGVuZXJzIHJlY2VpdmVzIHRoZSBzYW1lIGV2ZW50cyBhcyB0aGUKLQkgKiBkb2N1bWVudCBsaXN0ZW5lcnMsIGJ1dCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgdGltaW5nIGFuZAotCSAqIHN5bmNocm9uaXphdGlvbiBvZiBkYXRhIGNoYW5nZXMgYW5kIG5vdGlmaWNhdGlvbnMuCi0JICovCi0Jdm9pZCByZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICogCi0JICogcmVwbGFjZVRleHQgcmVwbGFjZXMgdGhlIHRleHQgZnJvbSBvbGRTdGFydCB0byBvbGRFbmQgd2l0aCB0aGUgbmV3IHRleHQKLQkgKiBmb3VuZCBpbiB0aGUgcmVxdWVzdGVkQ2hhbmdlIHN0cmluZy4gSWYgb2xkU3RhcnQgYW5kIG9sZEVuZCBhcmUgZXF1YWwsCi0JICogaXQgaXMgYW4gaW5zZXJ0aW9uIHJlcXVlc3QuIElmIHJlcXVlc3RlZENoYW5nZSBpcyBudWxsIChvciBlbXB0eSkgaXQgaXMKLQkgKiBhIGRlbGV0ZSByZXF1ZXN0LiBPdGhlcndpc2UgaXQgaXMgYSByZXBsYWNlIHJlcXVlc3QuCi0JICogCi0JICogU2ltaWxhciB0byAncmVwbGFjZScgaW4gc3VwZXIgY2xhc3MuCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RlciwgaW50IG9sZFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyByZXF1ZXN0ZWRDaGFuZ2UpOwotCi0JLyoqCi0JICogTm90ZSwgc2FtZSBhcyByZXBsYWNlVGV4dCBBUEksIGJ1dCB3aWxsIGFsbG93IHJlYWRvbmx5IGFyZWFzIHRvIGJlCi0JICogcmVwbGFjZWQuIFRoaXMgbWV0aG9kIGlzIG5vdCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cywgb25seQotCSAqIGluZnJhc3RydWN0dXJlLiBGb3IgZXhhbXBsZSwgb25lIGNhc2Ugd2hlcmUgaXRzIG9rIGlzIHdpdGggdW5kbwotCSAqIG9wZXJhdGlvbnMgKHNpbmNlLCBwcmVzdW1hYmx5LCBpZiB1c2VyIGp1c3QgZGlkIHNvbWV0aGluZyB0aGF0Ci0JICogaGFwcGVuZGVkIHRvIGludm9sdmUgc29tZSBpbnNlcnRpbmcgcmVhZG9ubHkgdGV4dCwgdGhleSBzaG91bGQgbm9ybWFsbHkKLQkgKiBiZSBhbGxvd2VkIHRvIHN0aWxsIHVuZG8gdGhhdCBvcGVyYXRpb24uIFRoZXJlIG1pZ2h0IGJlIG90aGVyIGNhc2VzCi0JICogd2hlcmUgaXRzIHVzZWQgdG8gZ2l2ZSB0aGUgdXNlciBhIGNob2ljZSwgZS5nLiAieW91IGFyZSBhYm91dCB0bwotCSAqIG92ZXJ3cml0ZSByZWFkIG9ubHkgcG9ydGlvbnMsIGRvIHlvdSB3YW50IHRvIGNvbnRpbnVlIi4KLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBvdmVycmlkZVJlYWRPbmx5cmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RlciwgaW50IG9sZFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyByZXF1ZXN0ZWRDaGFuZ2UpOwotCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaW4gdGVybXMgb2YgVGV4dC4KLQkgKiAKLQkgKiBUaGUgc2V0VGV4dCBtZXRob2QgcmVwbGFjZXMgYWxsIHRleHQgaW4gdGhlIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0ZXIgLQotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCByZXF1ZXN0aW5nIHRoZSBkb2N1bWVudCBiZSBjcmVhdGVkLgotCSAqIEBwYXJhbSBhbGxUZXh0IC0KLQkgKiAgICAgICAgICAgIGFsbCB0aGUgdGV4dCBvZiB0aGUgZG9jdW1lbnQuCi0JICogQHJldHVybiBOZXdEb2N1bWVudEV2ZW50IC0gYmVzaWRlcyBjYXVzaW5nIHRoaXMgZXZlbnQgdG8gYmUgc2VudCB0bwotCSAqICAgICAgICAgZG9jdW1lbnQgbGlzdGVuZXJzLCB0aGUgZXZlbnQgaXMgcmV0dXJuZWQuCi0JICovCi0JTmV3RG9jdW1lbnRFdmVudCBzZXRUZXh0KE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBhbGxUZXh0KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuY29kaW5nIG1lbWVudG8gZm9yIHRoaXMgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgZW5jb2RpbmcgbWVtZW50byBmb3IgdGhpcyBkb2N1bWVudC4KLQkgKi8KLQlFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaW5lIGRlbGltaXRlciBkZXRlY3RlZCB3aGVuIHRoaXMgZG9jdW1lbnQgd2FzIHJlYWQgZnJvbQotCSAqIHN0b3JhZ2UuCi0JICogCi0JICogQHJldHVybiBsaW5lIGRlbGltaXRlciBkZXRlY3RlZCB3aGVuIHRoaXMgZG9jdW1lbnQgd2FzIHJlYWQgZnJvbQotCSAqICAgICAgICAgc3RvcmFnZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGV0ZWN0ZWRMaW5lRGVsaW1pdGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlbmNvZGluZyBtZW1lbnRvIGZvciB0aGlzIGRvY3VtZW50LgotCSAqIAotCSAqIElzIG5vdCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cywgb25seSBkb2N1bWVudCBjcmVhdGlvbiBjbGFzc2VzLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhbEVuY29kaW5nTWVtZW50bwotCSAqLwotCXZvaWQgc2V0RW5jb2RpbmdNZW1lbnRvKEVuY29kaW5nTWVtZW50byBsb2NhbEVuY29kaW5nTWVtZW50byk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXRlY3RlZCBsaW5lIGRlbGltaXRlciB3aGVuIHRoZSBkb2N1bWVudCB3YXMgcmVhZC4gSXMgbm90IHRvCi0JICogYmUgY2FsbGVkIGJ5IGNsaWVudHMsIG9ubHkgZG9jdW1lbnQgY3JlYXRpb24gY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvYmFibGVMaW5lRGVsaW1pdGVyCi0JICovCi0Jdm9pZCBzZXREZXRlY3RlZExpbmVEZWxpbWl0ZXIoU3RyaW5nIHByb2JhYmxlTGluZURlbGltaXRlcik7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgd2F5IGZvciBjbGllbnRzIHRvIGNvbXBhcmUgYSBzdHJpbmcgd2l0aCBhCi0JICogcmVnaW9uIG9mIHRoZSBkb2N1bW5ldCwgd2l0aG91dCBoYXZpbmcgdG8gcmV0cmlldmUgKGNyZWF0ZSkgYSBzdHJpbmcKLQkgKiBmcm9tIHRoZSBkb2N1bWVudCwgdGh1cyBtb3JlIGVmZmljaWVudCBvZiBsb3RzIG9mIGNvbXBhcmlzb25zIGJlaW5nCi0JICogZG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWdub3JlQ2FzZSAtCi0JICogICAgICAgICAgICBpZiB0cnVlIHRoZSBjaGFyYWN0ZXJzIGFyZSBjb21wYXJlZCBiYXNlZCBvbiBpZGVudGl0eS4gSWYKLQkgKiAgICAgICAgICAgIGZhbHNlLCB0aGUgc3RyaW5nIGFyZSBjb21wYXJlZCB3aXRoIGNhc2UgYWNjb3VudGVkIGZvci4KLQkgKiBAcGFyYW0gdGVzdFN0cmluZyAtCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGNvbXBhcmUuCi0JICogQHBhcmFtIGRvY3VtZW50T2Zmc2V0IC0KLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBpbiB0aGUgb2Zmc2V0IHRvIHN0YXJ0IHRoZSBjb21wYXJpc29uLgotCSAqIEBwYXJhbSBsZW5ndGggLQotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBpbiB0aGUgZG9jdW1lbnQgdG8gY29tcGFyZSAoTm90ZTogdGVjaG5pY2FsbHksCi0JICogICAgICAgICAgICBjbGllbnRzIGNvdWxkIGp1c3QgcHJvdmlkZSB0aGUgc3RyaW5nLCBhbmQgd2UgY291bGQgaW5mZXIKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggZnJvbSB0aGUgc3RyaW5nIHN1cHBsaWVkLCBidXQgdGhpcyBsZWF2ZXMgZXZlcnkKLQkgKiAgICAgICAgICAgIGNsaWVudCB0byBjb3JyZWN0bHkgbm90IGV2ZW4gYXNrIHVzIGlmIHRoZSB0aGUgc3RyaW5nIGxlbmd0aAotCSAqICAgICAgICAgICAgZG9lc24ndCBtYXRjaCB0aGUgZXhwZWN0ZWQgbGVuZ3RoLCBzbyB0aGlzIGlzIGFuIGVmZm9ydCB0bwotCSAqICAgICAgICAgICAgbWF4aW1pemUgcGVyZm9ybWFuY2Ugd2l0aCBjb3JyZWN0IGNvZGUuCi0JICogQHJldHVybiB0cnVlIGlmIG1hdGNoZXMsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlib29sZWFuIHN0cmluZ01hdGNoZXMoYm9vbGVhbiBpZ25vcmVDYXNlLCBTdHJpbmcgdGVzdFN0cmluZywgaW50IGRvY3VtZW50T2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQkKLQlQb3NpdGlvbiBjcmVhdGVQb3NpdGlvbihpbnQgb2Zmc2V0LCBTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyB0eXBlKTsKLQkKLQlQb3NpdGlvbiBjcmVhdGVQb3NpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyB0eXBlKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvQWJvdXRUb0JlQ2hhbmdlZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9BYm91dFRvQmVDaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0OTY5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9BYm91dFRvQmVDaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIHNlbmQgdG8gc3RydWN0dXJlZCBkb2N1bWVudCBsaXN0ZW5lcnMuIEl0IGlzIHBlcmZlY3RseQotICogYW5hbGFnb3VzIHRvIGl0cyBjb3JyZXNwb25kaW5nIGpmYWNlIERvY3VtZW50RXZlbnQgYW5kIGlzIHByb3ZpZGVkIHNpbXBseQotICogdG8gYWxsb3cgY2xpZW50cyB0byBkaXN0aW5ndWlzaCB0aGUgc291cmNlIG9mIHRoZSBldmVudC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBYm91dFRvQmVDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB7Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIGRvY3VtZW50IGludm9sdmVkIGluIHRoZSBjaGFuZ2UKLQkgKiBAcGFyYW0gb3JpZ2luYWxSZXF1ZXN0ZXIKLQkgKiAgICAgICAgICAgIHNvdXJjZSBvZiBvcmlnaW5hbCByZXF1ZXN0Ci0JICogQHBhcmFtIGNoYW5nZXMKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGNoYW5nZXMKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBvZmZzZXQgb2YgcmVxdWVzdAotCSAqIEBwYXJhbSBsZW5ndGhUb1JlcGxhY2UKLQkgKiAgICAgICAgICAgIGFtb3VudCwgaWYgYW55LCBvZiByZXBsYWNlZCB0ZXh0Ci0JICovCi0JcHVibGljIEFib3V0VG9CZUNoYW5nZWRFdmVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBPYmplY3Qgb3JpZ2luYWxSZXF1ZXN0ZXIsIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBvcmlnaW5hbFJlcXVlc3RlciwgY2hhbmdlcywgb2Zmc2V0LCBsZW5ndGhUb1JlcGxhY2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL0lNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDQ1NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50czsKLQotCi0KLS8qKgotICogQ2xpZW50cyBjYW4gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBhbmQgcmVnaXN0ZXIgd2l0aCB0aGUKLSAqIHN0cnVjdHVyZWREb2N1bWVudCB1c2luZyBhZGRBYm91dFRvQmVDaGFuZ2VkTGlzdG5lciB0byBiZSBub3RpZmllZCB0aGF0IHRoZQotICogc3RydWN0dXJlZERvY3VtZW50IGlzIGFib3V0IHRvIGJlIGNoYW5nZWQsIGJ1dCBoYXNuJ3QgYmVlbiBjaGFuZ2VkIGF0IHRoZQotICogdGltZSB0aGlzIGV2ZW50IGlzIGZpcmVkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciB7Ci0KLQl2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChBYm91dFRvQmVDaGFuZ2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY1MzVhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHdpbGwgYmUgcmVtb3ZlZCBzaW5jZSB3ZSBub3cgc3ViY2xhc3MgRG9jdW1lbnRFdmVudC4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQotCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCi0JcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvTmV3RG9jdW1lbnRDb250ZW50RXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL05ld0RvY3VtZW50Q29udGVudEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOGRiNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvTmV3RG9jdW1lbnRDb250ZW50RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBUaGUgTmV3RG9jdW1lbnRDb250ZW50RXZlbnQgaXMgZmlyZWQgd2hlbiBhbiBpbnN0YW5jZSBvZiBhCi0gKiBJU3RydWN0dXJlZERvY3VtZW50IHJlcGxhY2VzIGFsbCBvZiBpdHMgdGV4dC4KLSAqIAotICogSVNTVUU6IG5vdCBjdXJyZW50bHkgdXNlZCwgYnV0IHRoZXJlJ3Mgc3RpbGwgc29tZSBlZmZpY2llbmNpZXMgdG8gYmUgaGFkIHNvCi0gKiBwbGFuIHRvIGltcGxlbWVudC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdEb2N1bWVudENvbnRlbnRFdmVudCBleHRlbmRzIE5ld0RvY3VtZW50RXZlbnQgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBiZWluZyBjaGFuZ2VkCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyCi0JICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgcmVxdWVzdGVyIG9mIHRoZSBjaGFuZ2UKLQkgKi8KLQlwdWJsaWMgTmV3RG9jdW1lbnRDb250ZW50RXZlbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgT2JqZWN0IG9yaWdpbmFsUmVxdWVzdGVyKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBvcmlnaW5hbFJlcXVlc3Rlcik7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL05ld0RvY3VtZW50RXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL05ld0RvY3VtZW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU5YTczYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9OZXdEb2N1bWVudEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLS8qKgotICogVGhlIE5ld0RvY3VtZW50RXZlbnQgaXMgZmlyZWQgd2hlbiBhbiBpbnN0YW5jZSBvZiBhIElTdHJ1Y3R1cmVkRG9jdW1lbnQKLSAqIHNldHMgb3IgcmVwbGFjZXMgYWxsIG9mIGl0cyB0ZXh0LgotICogCi0gKiBJU1NVRTogbmVlZCB0byBjaGFuZ2Ugc28gdGhpcyBpcyB1c2VkIGZvciAnc2V0JyBvbmx5LgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld0RvY3VtZW50RXZlbnQgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB7Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIE5ld0RvY3VtZW50RXZlbnQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICBiZWluZyBjaGFuZ2VkCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyCi0JICogICAgICAgICAgICBzb3VyY2Ugb2YgcmVxdWVzdAotCSAqLwotCXB1YmxpYyBOZXdEb2N1bWVudEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlcikgewotCQlzdXBlcihkb2N1bWVudCwgb3JpZ2luYWxSZXF1ZXN0ZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBuZXcgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiBpbnQgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBuZXcgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXNuJ3QgbWVhbiBxdWl0ZSB0aGUgc2FtZSB0aGluZyBhcyB0aGUgSVN0cnVjdHVyZWREb2N1bWVudAotCSAqIEV2ZW50cyBpbiB0aGUgc3VwZXIgY2xhc3MuIEl0IGFsd2F5cyB3aWxsIHJldHVybiB6ZXJvLgotCSAqIAotCSAqIEByZXR1cm4gaW50IGZvciBhIG5ld0RvY3VtZW50LCB0aGUgb2Zmc2V0IG9mIGlzIGFsd2F5cyAwCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIEZvciBhIG5ldyBkb2N1bWVudCwgdGhlIHRleHQgaW52b2x2ZWQgaXMgdGhlIGNvbXBsZXRlIHRleHQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHRleHQgdGhhdCBpcyB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGUgZG9jdW1uZXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlTdHJpbmcgcmVzdWx0cyA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFRleHQoKTsKLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvTm9DaGFuZ2VFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvTm9DaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTAwNGJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL05vQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIHNlbnQgaWYsIGFmdGVyIGFuYWx5c2lzLCBpdCBpcyBmb3VuZCB0aGVyZSBpcyBubyByZWFzb24gdG8KLSAqIGNoYW5nZSB0aGUgc3RydWN0dXJlZERvY3VtZW50LiBUaGlzIG1pZ2h0IG9jY3VyLCBmb3IgZXhhbXBsZSwgaWYgc29tZW9uZQotICogcGFzdGVzIGluIHRoZSBleGFjdCBzYW1lIHRleHQgdGhhdCB0aGV5IGFyZSByZXBsYWNpbmcsIG9yIGlmIHNvbWVvbmUgdHJpZXMKLSAqIHRvIGNoYW5nZSBhIHJlYWQtb25seSByZWdpb24uCi0gKiAKLSAqIFRoaXMgbWlnaHQgYmUgaW1wb3J0YW50LCBmb3IgZXhhbXBsZSwgaWYgc29tZSBzdGF0ZSB2YXJpYWJsZXMgYXJlIHNldCBvbiBhbgotICogImFib3V0IHRoZSBjaGFuZ2UiIGV2ZW50LiB0aGVuIGlmIHRoZXJlIGlzIG5vIGNoYW5nZSAoaS5lLm5vIG90aGVyIGV2ZW50IGlzCi0gKiBmaXJlZCksIHRob3NlIHN0YXRlIHZhcmlhYmxlcyBjb3VsZCByZXNldCwgb3Igd2hhdGV2ZXIsIHVwb24gcmVjZWl2aW5nIHRoaXMKLSAqIGV2ZW50LgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5vQ2hhbmdlRXZlbnQgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB7Ci0JLyoqCi0JICogTk9fQ09OVEVOVF9DSEFOR0UgbWVhbnMgdGhhdCBhIHNvbWUgdGV4dCB3YXMgcmVxdWVzdGVkIHRvIGJlIHJlcGxhY2VkCi0JICogd2l0aCBpZGVudGljYWwgdGV4dCwgc28gbm8gY2hhbmdlIGlzIGFjdHVhbGx5IGRvbmUuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTk9fQ09OVEVOVF9DSEFOR0UgPSAyOwotCS8qKgotCSAqIE5PX0VWRU5UIGlzIHVzZWQgaW4gcmFyZSBlcnJvciBjb25kaXRpb25zLCB3aGVuLCBiYXNpY2FsbHksIGEgcmVxdWVzdAotCSAqIHRvIGNoYW5nZSB0aGUgZG9jdW1lbnQgaXMgbWFkZSBiZWZvcmUgdGhlIHByZXZpb3VzIHJlcXVlc3QgaGFzCi0JICogY29tcGxldGVkLiBUaGlzIGV2ZW50IHRvIHVzZWQgc28gYWJvdXRUb0NoYW5nZS9DaGFuZ2VkIGN5Y2xlcyBjYW4KLQkgKiBjb21wbGV0ZSBhcyByZXF1aXJlZCwgYnV0IHRoZSBkb2N1bWVudCBpcyBtb3N0IGxpa2VseSBub3QgbW9kaWZpZWQgYXMKLQkgKiBleHBlY3RlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBOT19FVkVOVCA9IDg7Ci0JLyoqCi0JICogUkVBRF9PTkxZX1NUQVRFX0NIQU5HRSBtZWFucyB0aGF0IHRoZSAicmVhZCBvbmx5IiBzdGF0ZSBvZiB0aGUgdGV4dCB3YXMKLQkgKiBjaGFuZ2VkLCBub3QgdGhlIGNvbnRlbnQgaXRzZWxmLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFQURfT05MWV9TVEFURV9DSEFOR0UgPSA0OwotCi0JLyoqCi0JICogc2V0IHRvIG9uZSBvZiB0aGUgYWJvdmUgZGV0YWlsZWQgcmVhc29ucyBmb3Igd2h5IG5vIGNoYW5nZSB3YXMgZG9uZS4KLQkgKi8KLQlwdWJsaWMgaW50IHJlYXNvbiA9IDA7Ci0KLQkvKioKLQkgKiBOb0NoYW5nZUV2ZW50IGNvbnN0cnVjdG9yLiBUaGlzIGV2ZW50IGNhbiBvY2N1ciBpZiB0aGVyZSB3YXMgYSByZXF1ZXN0Ci0JICogdG8gbW9kaWZ5IGEgZG9jdW1lbnQgb3IgaXRzIHByb3BlcnRpZXMsIGJ1dCB0aGVyZSBhcyBub3QgcmVhbGx5IGlzIG5vCi0JICogY2hhbmdlIHRvIGEgZG9jdW1lbnQncyBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gb3JpZ2luYWxTb3VyY2UKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKiBAcGFyYW0gY2hhbmdlcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBsZW5ndGhUb1JlcGxhY2UKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBOb0NoYW5nZUV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc291cmNlLCBPYmplY3Qgb3JpZ2luYWxTb3VyY2UsIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKHNvdXJjZSwgb3JpZ2luYWxTb3VyY2UsIGNoYW5nZXMsIG9mZnNldCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9SZWdpb25DaGFuZ2VkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL1JlZ2lvbkNoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWQ0MzgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL1JlZ2lvbkNoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLS8qKgotICogVGhpcyBldmVudCBpcyB1c2VkIHdoZW4gYSBkb2N1bWVudCByZWdpb24gY2hhbmdlcyBpbiBhIG5vbi1zdHJ1Y3R1cmFsIHdheS4KLSAqIE5vbi1zdHJ1Y3R1cmFsLCB0aGF0IGlzLCBhcyBmYXIgYXMgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgY29uY2VybmVkLgotICogVGhlIHdob2xlIHJlZ2lvbiwgYWxvbmcgd2l0aCB0aGUgbmV3IHRleHQgaXMgc2VudCwganVzdCBpbiBjYXNlIGEgbGlzdGVuZXIKLSAqIChlLmcuIGEgdHJlZSBtb2RlbCkgbWlnaHQgbWFrZSBpdHMgb3duIGRldGVybWluYXRpb24gb2Ygd2hhdCB0byBkbywgYW5kCi0gKiBuZWVkcyB0aGUgd2hvbGUgcmVnaW9uIHRvIGFjdCBhcHByb3ByaWF0ZWx5LgotICogCi0gKiBOb3RlOiB1c2VycyBzaG91bGQgbm90IG1ha2UgYXNzdW1wdGlvbnMgYWJvdXQgd2hldGhlciB0aGUgcmVnaW9uIGlzCi0gKiBsaXRlcmFsbHkgdGhlIHNhbWUgaW5zdGFuY2Ugb3Igbm90IC0tIGl0IGlzIGN1cnJlbnRseSBhIGRpZmZlcmVudCBpbnN0YW5jZQotICogdGhhdCBpcyBpZGVudGljYWwgdG8gdGhlIG9sZCBleGNlcHQgZm9yIHRoZSBjaGFuZ2VkIHJlZ2lvbiwgYnV0IHRoaXMKLSAqIGltcGxlbWVudGF0aW9uIG1heSBjaGFuZ2UuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVnaW9uQ2hhbmdlZEV2ZW50IGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgewotCXByaXZhdGUgSVRleHRSZWdpb24gZkNoYW5nZWRSZWdpb247Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGluc3RhbmNlIG9mIGEgUmVnaW9uQ2hhbmdlZEV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGJlaW5nIGNoYW5nZWQuCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyCi0JICogICAgICAgICAgICB0aGUgb2JqZWN0IG1ha2luZyB0aGUgcmVxdWVzdCBmb3IgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogICAgICAgICAgICB0aGUgY29udGFpbmluZyByZWdpb24KLQkgKiBAcGFyYW0gY2hhbmdlZFJlZ2lvbgotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbiB0aGF0IGhhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBjaGFuZ2VzCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gbGVuZ3RoVG9SZXBsYWNlCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIHNwZWNpZmllZCB0byBiZSByZXBsYWNlZC4KLQkgKi8KLQlwdWJsaWMgUmVnaW9uQ2hhbmdlZEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIGNoYW5nZWRSZWdpb24sIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBvcmlnaW5hbFJlcXVlc3RlciwgY2hhbmdlcywgb2Zmc2V0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQlmQ2hhbmdlZFJlZ2lvbiA9IGNoYW5nZWRSZWdpb247Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IHJlZ2lvbiBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgcmVnaW9uIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UmVnaW9uKCkgewotCQlyZXR1cm4gZkNoYW5nZWRSZWdpb247Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCByZWdpb24gY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCByZWdpb24gY2hhbmdlZAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvUmVnaW9uc1JlcGxhY2VkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL1JlZ2lvbnNSZXBsYWNlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTJlNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvUmVnaW9uc1JlcGxhY2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLS8qKgotICogVGhpcyBldmVudCBpcyB1c2VkIHdoZW4gYSBub2RlJ3MgcmVnaW9ucyBjaGFuZ2UsIGJ1dCB0aGUgZG9jdW1lbnQgcmVnaW9uCi0gKiBpdHNlbGYgZG9lc24ndC4gVGhpcyBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGUgZG9jdW1lbnQKLSAqIHJlZ2lvbiwgdGhhdCBtYXkgc3RpbGwgaGF2ZSBjaGFuZ2VkLiBBbHNvLCBpdHMgYXNzdW1lZC9yZXF1aXJlZCB0aGF0IGFsbAotICogdGhlIHJlZ2lvbnMgYXJlIHJlcGxhY2VkIChldmVuIHRob3NlIHRoYXQgbWF5IG5vdCBoYXZlIGNoYW5nZWQpLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgewotCXByaXZhdGUgSVRleHRSZWdpb25MaXN0IGZOZXdSZWdpb25zOwotCXByaXZhdGUgSVRleHRSZWdpb25MaXN0IGZPbGRSZWdpb25zOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgUmVnaW9uc1JlcGxhY2VkRXZlbnQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIGRvY3VtZW50IGJlaW5nIGNoYW5nZWQuCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyIC0KLQkgKiAgICAgICAgICAgIHJlcXVlc3RlciBvZiB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gLQotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbiBjb250YWluaW5nIHRoZSBjaGFuZ2UuCi0JICogQHBhcmFtIG9sZFJlZ2lvbnMgLQotCSAqICAgICAgICAgICAgdGhlIG9sZCBSZWdpb25zIGJlaW5nIHJlcGxhY2VkLgotCSAqIEBwYXJhbSBuZXdSZWdpb25zIC0KLQkgKiAgICAgICAgICAgIHRoZSBuZXcgcmVnaW9ucyBiZWluZyBhZGRlZC4KLQkgKiBAcGFyYW0gY2hhbmdlcyAtCi0JICogICAgICAgICAgICB0aGUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBvZmZzZXQgLQotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBsZW5ndGhUb1JlcGxhY2UgLQotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIHJlcGxhY2UuCi0JICovCi0JcHVibGljIFJlZ2lvbnNSZXBsYWNlZEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgU3RyaW5nIGNoYW5nZXMsIGludCBvZmZzZXQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJc3VwZXIoZG9jdW1lbnQsIG9yaWdpbmFsUmVxdWVzdGVyLCBjaGFuZ2VzLCBvZmZzZXQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCWZPbGRSZWdpb25zID0gb2xkUmVnaW9uczsKLQkJZk5ld1JlZ2lvbnMgPSBuZXdSZWdpb25zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5ldyB0ZXh0IHJlZ2lvbnMuCi0JICogCi0JICogQHJldHVybiB0aGUgbmV3IHRleHQgcmVnaW9ucy4KLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb25MaXN0IGdldE5ld1JlZ2lvbnMoKSB7Ci0JCXJldHVybiBmTmV3UmVnaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvbGQgdGV4dCByZWdpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9sZCB0ZXh0IHJlZ2lvbnMuCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uTGlzdCBnZXRPbGRSZWdpb25zKCkgewotCQlyZXR1cm4gZk9sZFJlZ2lvbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24uCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvU3RydWN0dXJlZERvY3VtZW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM5MzBmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBJU3RydWN0dXJlZERvY3VtZW50IGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBJU3RydWN0dXJlZERvY3VtZW50LCBhZnRlcgotICogdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgYWN0cyBvbiBhIHJlcXVlc3QuIE5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQsCi0gKiBleGNlcHQgYnkgc3ViY2xhc3NlcyBpbiBpbmZyYXN0cnVjdHVyZS4gTm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkKLSAqIGNsaWVudHMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXh0ZW5kcyBEb2N1bWVudEV2ZW50IHsKLQlwcml2YXRlIFN0cmluZyBmRGVsZXRlZFRleHQ7Ci0JcHJpdmF0ZSBPYmplY3QgZk9yaWdpbmFsUmVxdWVzdGVyOwotCi0JLyoqCi0JICogVGhlcmUgaXMgbm8gcHVibGljIG51bGwtYXJnIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFdlIGFzc3VtZSAoYW5kIHJlcXVpcmUpIHRoYXQgYW4gSVN0cnVjdHVyZWREb2N1bWVudCdzIGFyZSBhbHdheXMgdGhlCi0JICogc291cmNlIG9mIFN0cnVjdHVyZWREb2N1bWVudCBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBiZWluZyBjaGFuZ2VkCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudWxsIHNvdXJjZSIpOyAvLyROT04tTkxTLTEkCi0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT3JpZ2luYWxSZXF1ZXN0ZXIgPSBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBXZSBhc3N1bWUgKGFuZCByZXF1aXJlKSB0aGF0IGFuIElTdHJ1Y3R1cmVkRG9jdW1lbnQncyBhcmUgYWx3YXlzIHRoZQotCSAqIHNvdXJjZSBvZiBTdHJ1Y3R1cmVkRG9jdW1lbnQgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgYmVpbmcgY2hhbmdlZC4KLQkgKiBAcGFyYW0gb3JpZ2luYWxSZXF1ZXN0ZXIgLQotCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIHJlcXVlc3RlciBvZiB0aGUgY2hhbmdlLgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlcikgewotCQl0aGlzKGRvY3VtZW50KTsKLQkJZk9yaWdpbmFsUmVxdWVzdGVyID0gb3JpZ2luYWxSZXF1ZXN0ZXI7Ci0JfQotCi0JLyoqCi0JICogV2UgYXNzdW1lIChhbmQgcmVxdWlyZSkgdGhhdCBhbiBJU3RydWN0dXJlZERvY3VtZW50J3MgYXJlIGFsd2F5cyB0aGUKLQkgKiBzb3VyY2Ugb2YgU3RydWN0dXJlZERvY3VtZW50IGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQgLQotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGJlaW5nIGNoYW5nZWQuCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyIC0KLQkgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0ZXIgb2YgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gY2hhbmdlcyAtCi0JICogICAgICAgICAgICB0aGUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmV3IHRleHQKLQkgKiBAcGFyYW0gb2Zmc2V0IC0KLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gbGVuZ3RoVG9SZXBsYWNlIC0KLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGV4dCB0byByZXBsYWNlLgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlciwgU3RyaW5nIGNoYW5nZXMsIGludCBvZmZzZXQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJdGhpcyhkb2N1bWVudCk7Ci0JCWZPcmlnaW5hbFJlcXVlc3RlciA9IG9yaWdpbmFsUmVxdWVzdGVyOwotCQlmVGV4dCA9IGNoYW5nZXM7Ci0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCWZMZW5ndGggPSBsZW5ndGhUb1JlcGxhY2U7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgdGhlIHRleHQgdGhhdCBpcyBiZWluZyBkZWxldGVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgdGhhdCBpcyBiZWluZyBkZWxldGVkLCBvciBudWxsIGlmIG5vbmUgaXMgYmVpbmcKLQkgKiAgICAgICAgIGRlbGV0ZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWxldGVkVGV4dCgpIHsKLQkJcmV0dXJuIGZEZWxldGVkVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBvYmplY3QgdGhhdCBvcmlnaW5hbGx5IGNhdXNlZCB0aGUgZXZlbnQgdG8KLQkgKiBmaXJlLiBUaGlzIGlzIHR5cGljYWxseSBub3QgdGhlIG9iamVjdCB0aGF0IGNyZWF0ZWQgdGhlIGV2ZW50ICh0aGUKLQkgKiBJU3RydWN0dXJlZERvY3VtZW50KSBidXQgaW5zdGVhZCB0aGUgb2JqZWN0IHRoYXQgbWFkZSBhIHJlcXVlc3QgdG8gdGhlCi0JICogSVN0cnVjdHVyZWREb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvYmplY3QgdGhhdCBtYWRlIHRoZSByZXF1ZXN0IHRvIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSB7Ci0JCXJldHVybiBmT3JpZ2luYWxSZXF1ZXN0ZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byAnZ2V0RG9jdW1lbnQnIGV4Y2VwdCBpdCByZXR1cm5zIGFuIG9iamVjdAotCSAqIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlIChuYW1lbHksIGEgSVN0cnVjdHVyZWREb2N1bWVudCwgaW5zdGVhZCBvZgotCSAqIElEb2N1bWVudCkuCi0JICogCi0JICogQHJldHVybiBJU3RydWN0dXJlZERvY3VtbnQgLSB0aGUgZG9jdW1lbnQgYmVpbmcgY2hhbmdlZAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJLy8gYSBzYWZlIGNhc2UsIHNpbmNlIGNvbnN0cnVjdG9yIGNhbiBvbmx5IGJlIGNhbGxlZCB3aXRoIGEKLQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudAotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBOb3QgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMsIG9ubHkgcGFyc2VycyBhbmQgcmVwYXJzZXJzLiAod2lsbAotCSAqIGV2ZW50dWFsbHkgYmUgbW92ZWQgdG8gYW4gU1BJIHBhY2thZ2UpLgotCSAqIAotCSAqIEBwYXJhbSBuZXdEZWxldGVkVGV4dCAtCi0JICogICAgICAgICAgICB0aGUgdGV4dCB0aGF0IGhhcyBiZWVuIGRlbGV0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlZFRleHQoU3RyaW5nIG5ld0RlbGV0ZWRUZXh0KSB7Ci0JCWZEZWxldGVkVGV4dCA9IG5ld0RlbGV0ZWRUZXh0OwotCX0KLQotCS8qKgotCSAqIGZvciBkZWJ1Z2dpbmcgb25seQotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gbmVlZCB0byBmaXggdW5pdCB0ZXN0cyB3aGljaCBkZXBlbmQgb24gdGhpcyBleGFjdCBmb3JtYXQsCi0JICogICAgICAgICAgICAgdGhlbiBkZWxldGUgdGhpcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCS8vIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICJbc291cmNlPSIgKyBzb3VyY2UgKyAiXSI7Ci0JCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwOGI4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIHVzZWQgd2hlbiBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgZGVsZXRlZCwgb3IgcmVwbGFjZWQKLSAqIHdpdGggbW9yZSB0aGFuIG9uZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBvciB3aGVuIHNpbXBseSBtb3JlIHRoYW4gb25lCi0gKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNoYW5nZXMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZOZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZklzRW50aXJlRG9jdW1lbnRSZXBsYWNlZDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQKLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQgLQotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGJlaW5nIGNoYW5nZWQuCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyIC0KLQkgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0ZXIgb2YgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAtCi0JICogICAgICAgICAgICB0aGUgb2xkIGRvY3VtZW50IHJlZ2lvbnMgcmVtb3ZlZC4KLQkgKiBAcGFyYW0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAtCi0JICogICAgICAgICAgICB0aGUgbmV3IGRvY3VtZW50IHJlZ2lvbnMgYWRkZWQuCi0JICogQHBhcmFtIGNoYW5nZXMgLQotCSAqICAgICAgICAgICAgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IGNoYW5nZS4KLQkgKiBAcGFyYW0gb2Zmc2V0IC0KLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gbGVuZ3RoVG9SZXBsYWNlIC0KLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGV4dCByZXF1ZXN0ZWQgdG8gYmUgcmVwbGFjZWQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgU3RyaW5nIGNoYW5nZXMsIGludCBvZmZzZXQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJc3VwZXIoZG9jdW1lbnQsIG9yaWdpbmFsUmVxdWVzdGVyLCBjaGFuZ2VzLCBvZmZzZXQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCWZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uczsKLQkJZk5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBPYmplY3Qgb3JpZ2luYWxSZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlLCBib29sZWFuIGVudGlyZURvY3VtZW50UmVwbGFjZWQpIHsKLQkJdGhpcyhkb2N1bWVudCwgb3JpZ2luYWxSZXF1ZXN0ZXIsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIGNoYW5nZXMsIG9mZnNldCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJZklzRW50aXJlRG9jdW1lbnRSZXBsYWNlZCA9IGVudGlyZURvY3VtZW50UmVwbGFjZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmV3IHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXcgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBnZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQlyZXR1cm4gZk5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2xkIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvbGQgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBnZXRPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQlyZXR1cm4gZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbnRpcmVEb2N1bWVudFJlcGxhY2VkKCkgewotCQlyZXR1cm4gZklzRW50aXJlRG9jdW1lbnRSZXBsYWNlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4Y2VwdGlvbnMvUmVzb3VyY2VBbHJlYWR5RXhpc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4Y2VwdGlvbnMvUmVzb3VyY2VBbHJlYWR5RXhpc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZmYwZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9leGNlcHRpb25zL1Jlc291cmNlQWxyZWFkeUV4aXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zOwotCi0KLQotLyoqCi0gKiBJbmRpY2F0ZXMgdGhhdCBhIFJlc291cmNlIHdoaWNoIGEgbW9kZWwgb3IgZG9jdW1lbnQgd2FzIGV4cGVjdGVkIHRvIGNyZWF0ZQotICogYWxyZWFkeSBleGlzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUFscmVhZHlFeGlzdHMgZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFJlc291cmNlQWxyZWFkeUV4aXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUFscmVhZHlFeGlzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmVzb3VyY2VBbHJlYWR5RXhpc3RzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBbHJlYWR5RXhpc3RzKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXhjZXB0aW9ucy9SZXNvdXJjZUluVXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4Y2VwdGlvbnMvUmVzb3VyY2VJblVzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWNiZmFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXhjZXB0aW9ucy9SZXNvdXJjZUluVXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnM7Ci0KLQotCi0vKioKLSAqIEluZGljYXRlcyB0aGF0IGEgbW9kZWwgd2l0aCBhIHBhcnRpY3VsYXIgSUQgYWxyZWFkeSBleGlzdHMKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlSW5Vc2UgZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFJlc291cmNlQWxyZWFkeUV4aXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUluVXNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJlc291cmNlQWxyZWFkeUV4aXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFJlc291cmNlSW5Vc2UoU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JTW9kZWxNYW5hZ2VyUHJvcG9zZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSU1vZGVsTWFuYWdlclByb3Bvc2VkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZTk0MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JTW9kZWxNYW5hZ2VyUHJvcG9zZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VBbHJlYWR5RXhpc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBSZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgSVN0cnVjdHVyZWRNb2RlbHMuCi0gKiAKLSAqIFRoaXMgYWxsb3dzIGNsaWVudHMgdG8gc2hhcmUgbW9kZWxzLCBzbyB0aGV5IGRvIG5vdCBoYXZlIHRvIGJlIHJlLWNyZWF0ZWQKLSAqIG9yIHBhc3NlZCBhcm91bmQgZnJvbSBvbmUgY2xpZW50IHRvIGFub3RoZXIuIENsaWVudHMgc2hvdWxkIGludGVybmFsbHkKLSAqIGVuZm9yY2UgdGhhdCBtb2RlbHMgYXJlIGdvdHRlbiBhbmQgcmVsZWFzZWQgZnJvbSBsb2NhdGlvbnMgY2xvc2UgdG8gZWFjaAotICogb3RoZXIgdG8gcHJldmVudCBtb2RlbCBsZWFrcy4KLSAqIAotICogVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gZ2V0IGEgbW9kZWwgYmFzZWQgb24gdXNhZ2UgYW5kIHJlc3BvbnNpYmlsaXR5OiBmb3IKLSAqICdNT0RJRlknLCBqdXN0IGZvciAnU0hBUkVEJywgYW5kICdVTlNIQVJFRCcuIENvbnRyYXJ5IHRvIHRoZWlyIG5hbWVzLCBhCi0gKiBtb2RlbCBjYW4gdGVjaG5pY2FsbHkgYmUgbW9kaWZpZWQsIGFuZCBhbGwgbW9kaWZpY2F0aW9ucyBkaXJlY3RseSBhZmZlY3QKLSAqIHRoZSBjb21tb25seSBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbW9kZWwuIEl0IGlzIHBhcnQgb2YgdGhlIEFQSSBjb250cmFjdCwKLSAqIGhvd2V2ZXIsIHRoYXQgY2xpZW50cyB3aG8gZ2V0IGEgbW9kZWwgZm9yIFNIQVJFRCBkbyBub3QgbW9kaWZ5IGl0LiBUaGUKLSAqIHNpZ25pZmljYW5jZSBvZiB0aGUgJ01PRElGWScgbW9kZWwgaXMgdGhhdCB0aGUgY2xpZW50IGlzIHJlZ2lzdGVyaW5nIHRoZWlyCi0gKiBpbnRlcmVzdCBpbiBzYXZpbmcgY2hhbmdlcyB0byB0aGUgbW9kZWwuCi0gKiAKLSAqIENsaWVudHMgY2FuIHJlZmVyZW5jZSB0aGlzIGludGVyZmFjZSwgYnV0IHNob3VsZCBub3QgaW1wbGVtZW50LgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxNYW5hZ2VyUHJvcG9zZWQgewotCi0JLyoqCi0JICogQWNjZXNzVHlwZSBpcyB1c2VkIGludGVybmFsbHkgYXMgYSBKUkUgMS40IGNvbXBhdGlibGUgZW51bWVyYXRlZCB0eXBlLgotCSAqIE5vdCBpbnRlbmRlZCB0byBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCi0JICovCi0Jc3RhdGljIGNsYXNzIEFjY2Vzc1R5cGUgewotCQlwcml2YXRlIFN0cmluZyBmVHlwZTsKLQotCQkvKioKLQkJICogZGVmYXVsdCBhY2Nlc3MgY29udHJ1Y3RvciB3ZSB1c2UgdG8gY3JlYXRlIG91ciBzcGVjaWZpYyBjb25zdGFudHMuCi0JCSAqIAotCQkgKiBAcGFyYW0gdHlwZQotCQkgKi8KLQkJQWNjZXNzVHlwZShTdHJpbmcgdHlwZSkgewotCQkJc3VwZXIoKTsKLQkJCWZUeXBlID0gdHlwZTsKLQkJfQotCi0JCS8qKgotCQkgKiBGb3IgZGVidWcgcHVycG9zZXMgb25seS4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIk1vZGVsIEFjY2VzcyBUeXBlOiAiICsgZlR5cGU7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0YW50IHRvIHByb3ZpZGUgY29tcGlsZSB0aW1lIHNhZmUgcGFyYW1ldGVyLiA8Y29kZT5OT1RTSEFSRUQ8L2NvZGU+c2lnbmlmaWVzCi0JICogdGhlIGNsaWVudCBpbnRlbnRpYWxseSB3YW50cyBhIG1vZGVsIHRoYXQgaXMgbm90IHNoYXJlZCB3aXRoIG90aGVyCi0JICogY2xpZW50cy4gTk9UU0hBUkVEIG1vZGVscyBjYW4gbm90IGJlIHNhdmVkLgotCSAqLwotCWZpbmFsIEFjY2Vzc1R5cGUgTk9UU0hBUkVEID0gbmV3IEFjY2Vzc1R5cGUoIk5PVFNIQVJFRCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdGFudCB0byBwcm92aWRlIGNvbXBpbGUtdGltZSBzYWZlIHBhcmFtZXRlci4gPGNvZGU+U0hBUkVEPC9jb2RlPnNpZ25pZmllcwotCSAqIHRoZSBjbGllbnQgaXMgbm90IGludGVuZGluZyB0byBtYWtlIGNoYW5nZXMgYW5kIGRvZXMgbm90IGNhcmUgd2hldGhlcgotCSAqIHRoZSBtb2RlbCBhY2Nlc3NlZCBpcyBzYXZlZC4KLQkgKi8KLQlmaW5hbCBBY2Nlc3NUeXBlIFNIQVJFRCA9IG5ldyBBY2Nlc3NUeXBlKCJTSEFSRUQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RhbnQgdG8gcHJvdmlkZSBjb21waWxlLXRpbWUgc2FmZSBwYXJhbWV0ZXIuIDxjb2RlPk1PRElGWTwvY29kZT5zaWduaWZpZXMKLQkgKiB0aGUgY2xpZW50IGlzIGludGVuZGluZyB0byBtYWtlIGNoYW5nZXMgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBzYXZpbmcKLQkgKiBjaGFuZ2VzIChvciBub3QpIGlmIHRoZXkgYXJlIHRoZSBsYXN0IG9uZSBob2xkaW5nIE1PRElGWSBhY2Nlc3MgdG8gdGhlCi0JICogbW9kZWwgYmVmb3JlIGl0J3MgcmVsZWFzZWQuCi0JICovCi0JZmluYWwgQWNjZXNzVHlwZSBNT0RJRlkgPSBuZXcgQWNjZXNzVHlwZSgiTU9ESUZZIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGNvcHlNb2RlbCBpcyBzaW1pbGFyIHRvIGEgZGVlcCBjbG9uZS4gVGhlIHJlc3VsdGluZyBtb2RlbCBpcyBzaGFyZWQsCi0JICogYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiBSZWFkRWRpdFR5cGUuIElmIGEgbW9kZWwgYWxyZWFkeSBpcyBiZWluZwotCSAqIG1hbmFnZWQgZm9yICduZXdMb2NhdGlvbicgdGhlbiBhIFJlc291cmNlSW5Vc2UgZXhjZXB0aW9uIGlzIHRocm93biwKLQkgKiB1bmxlc3MgdGhlIFJlYWRFZGl0VHlwZSBpcyBOT1RTSEFSRUQsIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdGluZyBtb2RlbAotCSAqIGNhbiBub3QgYmUgc2F2ZWQuCi0JICogCi0JICogQHBhcmFtIG9sZExvY2F0aW9uCi0JICogQHBhcmFtIG5ld0xvY2F0aW9uCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBSZXNvdXJjZUluVXNlCi0JICogCi0JICogSVNTVUU6IGlzIHRoaXMgaW1wb3J0YW50IGVub3VnaCB0byBiZSBBUEksIG9yIGNhbiBjbGllbnRzIHNvbHZlCi0JICogdGhlbXNlbHZlcwotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgY29weU1vZGVsKElQYXRoIG9sZExvY2F0aW9uLCBJUGF0aCBuZXdMb2NhdGlvbiwgQWNjZXNzVHlwZSB0eXBlKSB0aHJvd3MgUmVzb3VyY2VJblVzZTsKLQotCS8qKgotCSAqIGNyZWF0ZU5ld0luc3RhbmNlIGlzIHNpbWlsYXIgdG8gY2xvbmUsIGV4Y2VwdCB0aGUgbmV3IGluc3RhbmNlIGhhcyBubwotCSAqIHRleHQgY29udGVudC4gTm90ZTogdGhpcyBwcm9kdWNlcyBhbiBVTlNIQVJFRCBtb2RlbCwgZm9yIHRlbXBvcmFyeSB1c2UsCi0JICogdGhhdCBoYXMgdGhlIHNhbWUgY2hhcmFjdGVyaXN0aWNzIGFzIG9yaWdpbmFsIG1vZGVsLiBJZiBhIHRydWUgc2hhcmVkCi0JICogbW9kZWwgaXMgZGVzaXJlZCwgdXNlICJjb3B5Ii4KLQkgKiAKLQkgKiBJU1NVRTogc3RpbGwgbmVlZGVkPwotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0ZXIKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU5ld0luc3RhbmNlKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kLCBzaW5jZSBhIHByb3BlciBJU3RydWN0dXJlZERvY3VtZW50IG11c3QgaGF2ZSBhIHByb3BlcgotCSAqIHBhcnNlciBhc3NpZ25lZC4gTm90ZTogaXRzIGFzc3VtZSB0aGF0IElQYXRoIGRvZXMgbm90IGFjdHVhbGx5IGV4aXN0IGFzCi0JICogYSByZXNvdXJjZSB5ZXQuIElmIGl0IGRvZXMsIFJlc291cmNlQWxyZWFkeUV4aXN0cyBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIHRoZSByZXNvdXJjZSBkb2VzIGFscmVhZHkgZXhpc3QsIHRoZW4gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yIGlzCi0JICogdGhlIHJpZ2h0IEFQSSB0byB1c2UuCi0JICogCi0JICogSVNTVUU6IGRvIHdlIHdhbnQgdG8gc3VwcG9ydCB0aGlzIHZpYSBtb2RlbCBtYW5hZ2VyLCBvciBlbHNlIHdoZXJlPwotCSAqIElTU1VFOiBkbyB3ZSBuZWVkIHR3byBvZiB0aGVzZT8gV2hhdCdzIGxlZ2FjeSB1c2UgY2FzZT8KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50Rm9yKElQYXRoIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYSBwcm9wZXIKLQkgKiBwYXJzZXIgYXNzaWduZWQuIE5vdGU6IGNsaWVudHMgc2hvdWxkIHZlcmlmeSB0aGF0IHRoZSByZXNvdXJjZQotCSAqIGlkZW50aWZpZWQgYnkgdGhlIElQYXRoIGV4aXN0cyBiZWZvcmUgdXNpbmcgdGhpcyBtZXRob2QuIElmIHRoaXMgSUZpbGUKLQkgKiBkb2VzIG5vdCBleGlzdCwgdGhlbiBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgdGhlIGNvcnJlY3QgQVBJIHRvCi0JICogdXNlLgotCSAqIAotCSAqIElTU1VFOiBkbyB3ZSB3YW50IHRvIHN1cHBvcnQgdGhpcyB2aWEgbW9kZWwgbWFuYWdlciwgb3IgZWxzZSB3aGVyZT8KLQkgKiBJU1NVRTogZG8gd2UgbmVlZCB0d28gb2YgdGhlc2U/IFdoYXQncyBsZWdhY3kgdXNlIGNhc2U/Ci0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoSVBhdGggbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBOb3RlOiBjYWxsZXJzIG9mIHRoaXMgbWV0aG9kIG11c3Qgc3RpbGwgcmVsZWFzZSB0aGUgbW9kZWwgd2hlbgotCSAqIGZpbmlzaGVkLiBSZXR1cm5zIHRoZSBtb2RlbCBmb3IgdGhpcyBkb2N1bWVudCBpZiBpdCBhbHJlYWR5IGV4aXN0cyBhbmQKLQkgKiBpcyBiZWluZyBzaGFyZWQuIFJldHVybnMgbnVsbCBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZS4gVGhlIFJlYWRFZGl0VHlwZQotCSAqIG11c3QgYmUgZWl0aGVyIE1PRElGWSBvciBTSEFSRUQuCi0JICogCi0JICogSVNTVUU6IHNob3VsZCB3ZSBhY2NlcHQgSURvY3VtZW50IG9uIHBhcmFtZXRlciBmb3IgZnV0dXJlIGV2b2x1dGlvbiwKLQkgKiBhbmQgY29uc3RyYWluIHRvIFN0cnVjdHVyZWREb2N1bWVudHMgYXQgcnVudGltZT8KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdGVyCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIEFjY2Vzc1R5cGUgdHlwZSwgSURvY3VtZW50IGRvY3VtZW50KTsKLQotCS8qKgotCSAqIENhbGxlcnMgb2YgdGhpcyBtZXRob2QgbXVzdCBzdGlsbCByZWxlYXNlIHRoZSBtb2RlbCB3aGVuIGZpbmlzaGVkLgotCSAqIFJldHVybnMgdGhlIG1vZGVsIGZvciB0aGlzIGxvY2F0aW9uIGlmIGl0IGFscmVhZHkgZXhpc3RzIGFuZCBpcyBiZWluZwotCSAqIHNoYXJlZC4gUmV0dXJucyBudWxsIGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLiBUaGUgUmVhZEVkaXRUeXBlIG11c3QgYmUKLQkgKiBlaXRoZXIgTU9ESUZZIG9yIFNIQVJFRC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdGVyCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBBY2Nlc3NUeXBlIHR5cGUsIElQYXRoIGxvY2F0aW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGVsIHRoYXQgaGFzIHRoZSBzcGVjaWZpZWQgZG9jdW1lbnQgYXMgaXRzIHN0cnVjdHVyZWQKLQkgKiBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdGVyCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIEFjY2Vzc1R5cGUgdHlwZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIElEb2N1bWVudCBkb2N1bWVudCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RlbCBiYXNlZCBvbiB0aGUgY29udGVudCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgotCSAqIAotCSAqIE5vdGU6IGlmIHRoZSBNb2RlbE1hbmFnZXIgZG9lcyBub3Qga25vdyBob3cgdG8gY3JlYXRlIGEgbW9kZWwgZm9yIAotCSAqIHN1Y2ggYSBmaWxlIGZvciBjb250ZW50LCBudWxsIGlzIHJldHVybi4KLQkgKiBJU1NVRTogc2hvdWxkIHdlIHRocm93IHNvbWUgc3BlY2lhbCwgbWVhbmluZ2Z1bCwgY2hlY2tlZCAKLQkgKiBleGNlcHRpb24gaW5zdGVhZD8KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdGVyCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBBY2Nlc3NUeXBlIHR5cGUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJUGF0aCBsb2NhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBub3QgY3JlYXRlIGEgbmV3IG1vZGVsIGlmIGl0IGFscmVhZHkgZXhpc3RzIC4uLiBpZgotCSAqIGZvcmNlIGlzIGZhbHNlLiBUaGUgaWRlYSBpcyB0aGF0IGEgY2xpZW50IHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIG9uY2UKLQkgKiB3aXRoIGZvcmNlIHNldCB0byBmYWxzZS4gSWYgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZW4gcHJvbXB0IGNsaWVudAotCSAqIGlmIHRoZXkgd2FudCB0byBvdmVyd3JpdGUuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3RlcgotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBmb3JjZQotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cwotCSAqIEB0aHJvd3MgUmVzb3VyY2VJblVzZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsKE9iamVjdCByZXF1ZXN0ZXIsIElQYXRoIGxvY2F0aW9uLCBib29sZWFuIGZvcmNlLCBBY2Nlc3NUeXBlIHR5cGUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBSZXNvdXJjZUluVXNlLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaXNTaGFyZWQoSVBhdGggbG9jYXRpb24pOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbCwgc2hhcmVkIGluIHRoZSBzcGVjaWZpZWQgd2F5LiBUaGUgUmVhZEVkaXRUeXBlIG11c3QgYmUKLQkgKiBlaXRoZXIgTU9ESUZZIG9yIFNIQVJFRC4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkKElQYXRoIGxvY2F0aW9uLCBBY2Nlc3NUeXBlIHR5cGUpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB3aGVuIHRoZSBjb250ZW50IHR5cGUgb2YgYSBtb2RlbCBjaGFuZ2VzLiBJdHMKLQkgKiBhc3N1bWVkIHRoZSBjb250ZW50VHlwZSBoYXMgYWxyZWFkeSBiZWVuIGNoYW5nZWQsIGFuZCB0aGlzIG1ldGhvZCB1c2VzCi0JICogdGhlIHRleHQgb2YgdGhlIG9sZCBvbmUsIHRvIHJlcG9wdWxhdGUgdGhlIHRleHQgb2YgdGhlIG5ldyBvbmUuCi0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIHJlaW5pdGlhbGl6ZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCBieSBjbGllbnRzIHRvIHNpZ25pZnkgdGhhdCB0aGV5IGFyZSBmaW5pc2hlZCB3aXRoIGEgbW9kZWwKLQkgKiBhbmQgd2lsbCBubyBsb25nZXIgYWNjZXNzIGl0IG9yIGFueSBvZiBpdHMgdW5kZXJseWluZyBkYXRhIChzdWNoIGFzIGl0cwotCSAqIHN0cnVjdHVyZWQgZG9jdW1lbnQpLiBUaGUgUmVhZEVkaXRUeXBlIG11c3QgbWF0Y2ggd2hhdCBldmVyIHRoZSBjbGllbnQKLQkgKiB1c2VkIGluIHRoZSBjb3JyZXNwb25kaW5nICdnZXQnIG1ldGhvZC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBmb3IgZXZlcnkgJ2dldCcuIENsaWVudHMgc2hvdWxkIHVzZSB0aGUKLQkgKiB0cnkvZmluYWxseSBwYXR0ZXJuIHRvIGVuc3VyZSB0aGUgcmVsZWFzZSBpcyBjYWxsZWQgZXZlbiBpZiB0aGVyZSBpcyBhbgotCSAqIHVuZXhwZWN0ZWQgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0ZXIKLQkgKiBAcGFyYW0gc3RydWN0dXJlZE1vZGVsCi0JICogQHBhcmFtIHR5cGUKLQkgKi8KLQl2b2lkIHJlbGVhc2VNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgQWNjZXNzVHlwZSB0eXBlKTsKLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgdW5kZXJseWluZyBkb2N1bWVudCB0byB0aGUgSVBhdGguCi0JICogCi0JICogSVNTVUU6IHdlIHdhbnQgdG8ganVzdCAiZHVtcCIgY29udGVudHMgdG8gbG9jYXRpb24sIGJ1dCBuZWVkIHRvIHNwZWMuCi0JICogYWxsIHRoZSBkaWZmZXJlbnQgY2FzZXMgb2Ygc2hhcmVkLCBldGMuCi0JICogCi0JICogP0lmIHRvIHNhbWUgbG9jYXRpb24gYXMgJ2dldCcsIHRoZW4gc2FtZSBpbnN0YW5jZSBvZiBtb2RlbCwgSWYgdG8KLQkgKiBkaWZmZXJlbnQgbG9jYXRpb24gKGVzcC4gaWYgc2hhcmVkKSB0aGVuIG5lZWQgdG8gbGVhdmUgb2xkIGluc3RhbmNlIG9mCi0JICogbW9kZWwsIGNyZWF0ZSBuZXcgbW9kZWwsIGFuZCBzYXZlIHRvIG5ldyBsb2NhdGlvbi4gPwotCSAqIAotCSAqIENhc2VzOiBJUGF0aCBpcyBudWxsLCB3cml0ZSB0byBJUGF0aCBjcmVhdGVkIHdpdGggSVBhdGggc3BlY2lmaWNlZCBhbmQKLQkgKiBlcXVhbHMgSVBhdGggY3JlYXRlZCB3aXRoLCB3cml0ZSB0byBJUGF0aCBJUGF0aCBzcGVjaWZpZWQgYW5kIG5vdAotCSAqIGVxdWFscyBJUGF0aCBjcmVhdGVkIHdpdGgsIGR1bXBzIHRvIG5ldyBJUGF0aCwgbm8gY2hhbmdlIGluIGN1cnJlbnQKLQkgKiBtb2RlbCBzdGF0ZS4KLQkgKiAKLQkgKiBJU1NVRTogdGhpbmsgdGhyb3VnaCAnbm9ybWFsaXphdGlvbicgY2FzZXMKLQkgKiAKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZE1vZGVsCi0JICogQHBhcmFtIGxvY2F0aW9uIC0gYWxyZWFkeSBub3JtYWxpemVkPwotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogSVNTVUU6IHJlc291cmNlIGFsZWFkeSBleGlzdHM/IHZldG8gb3ZlcnJpZGUKLQkgKi8KLQl2b2lkIHNhdmVNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgSVBhdGggbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBXcml0ZXMgdGhlIHVuZGVybHlpbmcgZG9jdW1lbnQgdG8gdGhlIElQYXRoIGlmIHRoZSBtb2RlbCBpcyBvbmx5IHNoYXJlZAotCSAqIGZvciBFRElUIGJ5IG9uZSBjbGllbnQuIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIHdheSBmb3IgJ2JhY2tncm91bmQKLQkgKiBqb2JzJyB0byBzYXZlIG1vZGVscywgaW4gY2FzZSB0aGUgbW9kZWwgaXMgYmVpbmcgc2hhcmVkIGJ5IGFuIGVkaXRvciwKLQkgKiBvciBvdGhlciBjbGllbnQgdGhhdCBtaWdodCBkZXNpcmUgdXNlciBpbnRlcnZlbnRpb24gdG8gc2F2ZSBhIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkTW9kZWwKLQkgKiBAcGFyYW0gbG9jYXRpb24gLSBhbHJlYWR5IG5vcm1hbGl6ZWQ/Ci0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBJU1NVRTogaXMgbG9jYWl0b24gbmVlZGVkIGluIHRoaXMgY2FzZSwgb3IganVzdCB1c2UgdGhlIG9uZSBpdCB3YXMKLQkgKiBjcmVhdGVkIHdpdGgKLQkgKi8KLQl2b2lkIHNhdmVNb2RlbElmTm90U2hhcmVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBJUGF0aCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSU1vZGVsU3RhdGVMaXN0ZW5lclByb3Bvc2VkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lNb2RlbFN0YXRlTGlzdGVuZXJQcm9wb3NlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODRmYzcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSU1vZGVsU3RhdGVMaXN0ZW5lclByb3Bvc2VkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLm1vZGVsOwotCi0KLS8qKgotICogSW50ZXJmYWNlIGZvciB0aG9zZSB3YW50aW5nIHRvIGxpc3RlbiB0byBhIG1vZGVsJ3Mgc3RhdGUgY2hhbmdpbmcuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbFN0YXRlTGlzdGVuZXJQcm9wb3NlZCB7Ci0KLQkvKioKLQkgKiBBIG1vZGVsIGlzIGFib3V0IHRvIGJlIGNoYW5nZWQuIFRoZSBldmVudCBvYmplY3QgaXRzZWxmIHNpZ25pZmllcyB3aGljaAotCSAqIG1vZGVsLCBhbmQgYW55IHBlcnRpbmVudCBpbmZvcm1hdGlvbi4KLQkgKi8KLQl2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogU2lnbmFscyB0aGF0IHRoZSBjaGFuZ2VzIGZvcmV0b2xkIGJ5IG1vZGVsQWJvdXRUb0JlQ2hhbmdlZCBoYXZlIGJlZW4KLQkgKiBtYWRlLiBBIHR5cGljYWwgdXNlIG1pZ2h0IGJlIHRvIHJlZnJlc2gsIG9yIHRvIHJlc3VtZSBwcm9jZXNzaW5nIHRoYXQKLQkgKiB3YXMgc3VzcGVuZGVkIGFzIGEgcmVzdWx0IG9mIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZC4KLQkgKi8KLQl2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lOb2RlQWRhcHRlckZhY3RvcnlNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lOb2RlQWRhcHRlckZhY3RvcnlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMmQxNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JTm9kZUFkYXB0ZXJGYWN0b3J5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLS8qKgotICogUHJvdmlkZXMgYSBtZWFucyBmb3IgY2xpZW50cyB0byByZWdpc3RlciBJQWRhcHRlckZhY3RvcmllcyBmb3IgdXNlCi0gKiBieSBpbmZyYXN0cnVjdHVyZSB3aGVuIFN0cnVjdHVyZWRNb2RlbHMgYXJlIGNyZWF0ZWQuIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlQWRhcHRlckZhY3RvcnlNYW5hZ2VyIHsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBmYWN0b3J5Ci0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICovCi0Jdm9pZCBhZGRBZGFwdGVyRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksIElDb250ZW50VHlwZSBjb250ZW50VHlwZSk7Ci0KLQl2b2lkIHJlbW92ZUFkYXB0ZXJGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKTsKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lTdHJ1Y3R1cmVkTW9kZWxFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JU3RydWN0dXJlZE1vZGVsRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiYzNiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lTdHJ1Y3R1cmVkTW9kZWxFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLm1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkTW9kZWxFdmVudCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSVN0cnVjdHVyZWRNb2RlbFByb3Bvc2VkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lTdHJ1Y3R1cmVkTW9kZWxQcm9wb3NlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDk4NGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSVN0cnVjdHVyZWRNb2RlbFByb3Bvc2VkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBJU3RydWN0dXJlZE1vZGVsJ3MgYXJlIG1haW5seSBpbnRlcmVzdGluZyBieSB0aGVpciBleHRlbnNpb25zIGFuZAotICogaW1wbGVtZW50ZXJzLiBUaGUgbWFpbiBwdXJwb3NlZCBvZiB0aGlzIGFic3RyYWN0aW9uIGl0IHRvIHByb3ZpZGUgYSBjb21tb24KLSAqIHdheSB0byBtYW5hZ2UgbW9kZWxzIHRoYXQgaGF2ZSBhbiBhc3NvY2lhdGVkIHN0cnVjdHVyZWQgZG9jdW1uZXQuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRNb2RlbFByb3Bvc2VkIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0KLQotCS8qKgotCSAqIFRoaXMgQVBJIGFsbG93cyBjbGllbnRzIHRvIGRlY2xhcmUgdGhhdCB0aGV5IGFyZSBhYm91dCB0byBtYWtlIGEKLQkgKiAibGFyZ2UiIGNoYW5nZSB0byB0aGUgbW9kZWwuIFRoaXMgY2hhbmdlIG1pZ2h0IGJlIGluIHRlcm1zIG9mIGNvbnRlbnQKLQkgKiBvciBpdCBtaWdodCBiZSBpbiB0ZXJtcyBvZiB0aGUgbW9kZWwgaWQgb3IgYmFzZSBsb2NhdGlvbi4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgZW1iZWRkZWQgY2FsbHMsIG5vdGlmaWNhdGlvbiB0byBsaXN0ZW5lcnMgaXMKLQkgKiBzZW50IG9ubHkgb25jZS4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgdGhlIGNsaWVudCB3aG8gaXMgbWFraW5nIHRoZXNlIGNoYW5nZXMgaGFzIHRoZSByZXNwb25zaWJpbGl0eQotCSAqIHRvIHJlc3RvcmUgdGhlIG1vZGVsJ3Mgc3RhdGUgb25jZSBmaW5pc2hlZCB3aXRoIHRoZSBjaGFuZ2VzLiBTZWUKLQkgKiBnZXRNZW1lbnRvIGFuZCByZXN0b3JlU3RhdGUuCi0JICogCi0JICogVGhlIG1ldGhvZCBpc01vZGVsU3RhdGVDaGFuZ2luZyBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkZXRlcm1pbmUgaWYKLQkgKiB0aGUgbW9kZWwgaXMgYWxyZWFkeSBpbiBhIGNoYW5nZSBzZXF1ZW5jZS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIG1hdGNoZWQgcGFpciB0byBjaGFuZ2VkTW9kZWwsIGFuZCBtdXN0IGJlIGNhbGxlZAotCSAqIGJlZm9yZSBjaGFuZ2VkTW9kZWwuIEEgY2xpZW50IHNob3VsZCBuZXZlciBjYWxsIGNoYW5nZWRNb2RlbCB3aXRob3V0Ci0JICogY2FsbGluZyBhYm91dFRvQ2hhbmdlTW9kZWwgZmlyc3Qgbm9yIGNhbGwgYWJvdXRUb0NoYW5nZU1vZGVsIHdpdGhvdXQKLQkgKiBjYWxsaW5nIGNoYW5nZWRNb2RlbCBsYXRlciBmcm9tIHRoZSBzYW1lIFRocmVhZC4KLQkgKi8KLQl2b2lkIGFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0Jdm9pZCBhZGRNb2RlbFN0YXRlTGlzdGVuZXIoSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgYSBjbGllbnQgY29udHJvbGxlZCB3YXkgb2Ygbm90aWZ5aW5nIGFsbCBNb2RlbEV2ZW50Ci0JICogbGlzdG5lcnMgdGhhdCB0aGUgbW9kZWwgaGFzIGJlZW4gY2hhbmdlZC4gVGhpcyBtZXRob2QgaXMgYSBtYXRjaGVkIHBhaXIKLQkgKiB0byBhYm91dFRvQ2hhbmdlTW9kZWwsIGFuZCBtdXN0IGJlIGNhbGxlZCBhZnRlciBhYm91dFRvQ2hhbmdlTW9kZWwgLi4uCi0JICogb3Igc29tZSBsaXN0ZW5lcnMgY291bGQgYmUgbGVmdCB3YWl0aW5nIGluZGVmaW5pdGVseSBmb3IgdGhlIGNoYW5nZWQKLQkgKiBldmVudC4gU28sIGl0cyBzdWdnZXN0ZWQgdGhhdCBjaGFuZ2VkTW9kZWwgYWx3YXlzIGJlIGluIGEgZmluYWxseQotCSAqIGNsYXVzZS4gTGlrZXdpc2UsIGEgY2xpZW50IHNob3VsZCBuZXZlciBjYWxsIGNoYW5nZWRNb2RlbCB3aXRob3V0Ci0JICogY2FsbGluZyBhYm91dFRvQ2hhbmdlTW9kZWwgZmlyc3QuCi0JICogCi0JICogSW4gdGhlIGNhc2Ugb2YgZW1iZWRkZWQgY2FsbHMsIHRoZSBub3RpZmljYXRpb24gaXMganVzdCBzZW50IG9uY2UuCi0JICogCi0JICovCi0Jdm9pZCBjaGFuZ2VkTW9kZWwoKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgYSBjbGllbnQtZGVmaW5lZCB2YWx1ZSBmb3Igd2hhdCB0aGF0IGNsaWVudCAoYW5kL29yIGxvYWRlcikKLQkgKiBjb25zaWRlcnMgdGhlICJiYXNlIiBvZiB0aGUgc3RydWN0dXJlZCBtb2RlbC4gRnJlcXVlbnRseSB0aGUgbG9jYXRpb24KLQkgKiBpcyBlaXRoZXIgYSB3b3Jrc3BhY2Ugcm9vdC1yZWxhdGl2ZSBwYXRoIG9mIGEgd29ya3NwYWNlIHJlc291cmNlIG9yIGFuCi0JICogYWJzb2x1dGUgcGF0aCBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi0JICovCi0JSVBhdGggZ2V0TG9jYXRpb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQgY29udGVudCB0eXBlIGlkZW50aWZpZXIgKFN0cmluZykgZm9yIHRoaXMgbW9kZWwuCi0JICovCi0JSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBtb2RlbCdzIEZhY3RvcnlSZWdpc3RyeS4gQSBtb2RlbCBpcyBub3QgdmFsaWQgd2l0aG91dCBvbmUuCi0JICovCi0JRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCByZWdpb24gYXQgb2Zmc2V0LiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8KLQkgKiBJbmRleGVkUmVnaW9uIHRoYXQgY29udGFpbnMgb2Zmc2V0LgotCSAqLwotCUluZGV4ZWRSZWdpb24gZ2V0SW5kZXhlZFJlZ2lvbihpbnQgb2Zmc2V0KTsKLQotCS8qKgotCSAqIElTU1VFOiBkbyB3ZSB3YW50IHRvIHByb3ZpZGUgdGhpcz8gSG93IHRvIGVuc3VyZSBqb2IvdGhyZWFkIHNhZmV0eQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlJbmRleGVkUmVnaW9uW10gZ2V0SW5kZXhlZFJlZ2lvbnMoKTsKLQotCS8qKgotCSAqIFJyZXR1cm5zIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IHRoYXQgdW5kZXJsaWVzIHRoaXMgbW9kZWwKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNEaXJ0eSgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZGVsIGlzIHdpdGhpbiBhCi0JICogImFib3V0VG9DaGFuZ2UiIGFuZCAiY2hhbmdlZCIgc2VxdWVuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RlbFN0YXRlQ2hhbmdpbmcoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNOZXcoKTsKLQotCWJvb2xlYW4gaXNSZWluaXRpYWxpemF0aW9uTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgY29tYmluYXRpb24gb2YgaWYgdGhlIG1vZGVsIGlzIGRpcnR5IGFuZCBpZiB0aGUgbW9kZWwgaXMKLQkgKiBzaGFyZWQgZm9yIHdyaXRlIGFjY2Vzcy4gVGhlIGxhc3Qgd3JpdGVyIGFzIHRoZSByZXNwb25zaWJpbGl0eSB0byBiZQotCSAqIHN1cmUgdGhlIHVzZXIgaXMgcHJvbXB0ZWQgdG8gc2F2ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKTsKLQotCS8qKgotCSAqIG5ld0luc3RhbmNlIGlzIHNpbWlsYXIgdG8gY2xvbmUsIGV4Y2VwdCB0aGF0IHRoZSBuZXdJbnN0YW5jZSBjb250YWlucwotCSAqIG5vIGNvbnRlbnQuIEl0cyBwdXJwb3NlIGlzIHNvIGNsaWVudHMgY2FuIGdldCBhIHRlbXBvcmFyeSwgdW5tYW5hZ2VkLAotCSAqIG1vZGVsIG9mIHRoZSBzYW1lICJ0eXBlIiBhcyB0aGUgb3JpZ2luYWwuIE5vdGU6IHRoZSBjbGllbnQgbWF5IHN0aWxsCi0JICogbmVlZCB0byBkbyBzb21lIGludGlhbGl6YXRpb24gb2YgdGhlIG1vZGVsIHJldHVybmVkIGJ5IG5ld0luc3RhbmNlLAotCSAqIGRlcGVuZGluZyBvbiBkZXNpcmVkIHVzZS4gRm9yIGV4YW1wbGUsIHRoZSBvbmx5IGZhY3RvcmllcyBpbiB0aGUKLQkgKiBuZXdJbnN0YW5jZSBhcmUgdGhvc2UgdGhhdCB3b3VsZCBiZSBub3JtYWxseSBiZSBjcmVhdGVkIGZvciBhIG1vZGVsIG9mCi0JICogdGhlIGdpdmVuIGNvbnRlbnRUeXBlLiBPdGhlcnMgYXJlIG5vdCBjb3BpZWQgYXV0b21hdGljYWxseSwgYW5kIGlmCi0JICogZGVzaXJlZCwgc2hvdWxkIGJlIGFkZGVkIGJ5IGNsaWVudC4KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsUHJvcG9zZWQgbmV3SW5zdGFuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQl2b2lkIHJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcihJTW9kZWxTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2Q0ZWY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcjsKLQotCi0vKioKLSAqIEEgSVN0cnVjdHVyZWREb2N1bWVudCBpcyBhIGNvbGxlY3Rpb24gb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy4gSXQncwotICogb2Z0ZW4gY2FsbGVkICJmbGF0IiBiZWNhdXNlIGl0cyBjb250ZW50cyBieSBkZXNpZ24gZG8gbm90IGNvbnRhaW4gbXVjaAotICogc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBiZXlvbmQgY29udGFpbm1lbnQuIENsaWVudHMgc2hvdWxkIG5vdCBpbXBsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWREb2N1bWVudCBleHRlbmRzIElFbmNvZGVkRG9jdW1lbnQsIElEb2N1bWVudEV4dGVuc2lvbiwgSUFkYXB0YWJsZSB7Ci0KLQl2b2lkIGFkZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBUaGUgU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXJzIGFuZCBNb2RlbENoYW5nZWRMaXN0ZW5lcnMgYXJlIHZlcnkKLQkgKiBzaW1pbGFyLiBUaGV5IGJvdGggcmVjZWl2ZSBpZGVudGljYWwgZXZlbnRzLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGUKLQkgKiB0aW1pbmcuIFRoZSAicHVyZSIgU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXJzIGFyZSBub3RpZmllZCBhZnRlciB0aGUKLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaGFzIGJlZW4gY2hhbmdlZCwgYnV0IGJlZm9yZSBvdGhlciwgcmVsYXRlZCBtb2RlbHMKLQkgKiBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgc3VjaCBhcyB0aGUgU3RydWN0dXJhbCBNb2RlbC4gVGhlIFN0cnVjdHVyYWwKLQkgKiBtb2RlbCBpcyBpbiBmYWN0IGl0c2VsZiBhICJwdXJlIiBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0bmVyLiBUaGUKLQkgKiBNb2RlbENoYW5nZWRMaXN0ZW5lcnMgY2FuIHJlc3QgYXNzdXJlZCB0aGF0IGFsbCBtb2RlbHMgYW5kIGRhdGEgaGF2ZQotCSAqIGJlZW4gdXBkYXRlZCBmcm9tIHRoZSBjaGFuZ2UgYnkgdGhlIHRpZW0gdGhleSBhcmUgbm90aWZpZWQuIFRoaXMgaXMKLQkgKiBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgdGhlIHRleHQgd2lkZ2V0LCBmb3IgZXhhbXBsZSwgd2hpY2ggbWF5IHJlbHkKLQkgKiBvbiBib3RoIHN0cnVjdHVyZWREb2N1bWVudCBhbmQgc3RydWN0dXJhbCBtb2RlbCBpbmZvcm1hdGlvbi4KLQkgKi8KLQl2b2lkIGFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBUaGUgU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXJzIGFuZCBNb2RlbENoYW5nZWRMaXN0ZW5lcnMgYXJlIHZlcnkKLQkgKiBzaW1pbGFyLiBUaGV5IGJvdGggcmVjZWl2ZSBpZGVudGljYWwgZXZlbnRzLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGUKLQkgKiB0aW1pbmcuIFRoZSAicHVyZSIgU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXJzIGFyZSBub3RpZmllZCBhZnRlciB0aGUKLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaGFzIGJlZW4gY2hhbmdlZCwgYnV0IGJlZm9yZSBvdGhlciwgcmVsYXRlZCBtb2RlbHMKLQkgKiBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgc3VjaCBhcyB0aGUgU3RydWN0dXJhbCBNb2RlbC4gVGhlIFN0cnVjdHVyYWwKLQkgKiBtb2RlbCBpcyBpbiBmYWN0IGl0c2VsZiBhICJwdXJlIiBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0bmVyLiBUaGUKLQkgKiBNb2RlbENoYW5nZWRMaXN0ZW5lcnMgY2FuIHJlc3QgYXNzdXJlZCB0aGF0IGFsbCBtb2RlbHMgYW5kIGRhdGEgaGF2ZQotCSAqIGJlZW4gdXBkYXRlZCBmcm9tIHRoZSBjaGFuZ2UgYnkgdGhlIHRpZW0gdGhleSBhcmUgbm90aWZpZWQuIFRoaXMgaXMKLQkgKiBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgdGhlIHRleHQgd2lkZ2V0LCBmb3IgZXhhbXBsZSwgd2hpY2ggbWF5IHJlbHkKLQkgKiBvbiBib3RoIHN0cnVjdHVyZWREb2N1bWVudCBhbmQgc3RydWN0dXJhbCBtb2RlbCBpbmZvcm1hdGlvbi4KLQkgKi8KLQl2b2lkIGFkZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogdGhpcyBBUEkgZW5zdXJlcyB0aGF0IGFueSBwb3J0aW9uIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gc3RhcnRPZmYgdG8KLQkgKiBsZW5ndGggaXMgbm90IHJlYWRvbmx5ICh0aGF0IGlzLCB0aGF0IGl0cyBlZGl0YWJsZSkuIE5vdGUgdGhhdCBpZiB0aGUKLQkgKiByYW5nZSBvdmVybGFwcyB3aXRoIG90aGVyIHJlYWRvbmx5IHJlZ2lvbnMsIHRob3NlIG90aGVyIHJlYWRvbmx5Ci0JICogcmVnaW9ucyB3aWxsIGJlIGFkanVzdGVkLgotCSAqIAotCSAqIEBwYXJhbSBzdGFydE9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKi8KLQl2b2lkIGNsZWFyUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQotCS8qKgotCSAqIHJldHVybnMgdHJ1ZSBpZiBhbnkgcG9ydGlvbiBvZiBzdGFydE9mZnNldCB0byBsZW5ndGggaXMgcmVhZG9ubHkKLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnRPZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gY29udGFpbnNSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdG8gcmVtZW1iZXIgaW5mbyBhYm91dCB0aGUgZW5jb2RpbmcgV2hlbiB0aGUgcmVzb3VyY2UKLQkgKiB3YXMgbGFzdCBsb2FkZWQgb3Igc2F2ZWQuIE5vdGU6IGl0IGlzIG5vdCBrZXB0ICJjdXJyZW50IiwgdGhhdCBpcywgY2FuCi0JICogbm90IGJlIGRlcGVuZGVkIG9uIGJsaW5kbHkgdG8gcmVmbGVjdCB3aGF0IGVuY29kaW5nIHRvIHVzZS4gRm9yIHRoYXQsCi0JICogbXVzdCBnbyB0aHJvdWdoIHRoZSBub3JtYWwgcnVsZXMgZXhwcmVzc2VkIGluIExvYWRlcnMgYW5kIER1bXBlcnMuCi0JICovCi0KLQlFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0KLQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCS8qKgotCSAqIFRoaXMgY2FuIGJlIGNvbnNpZGVyZWQgdGhlIHByZWZlcnJlZCBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKCk7Ci0KLQlpbnQgZ2V0TGluZU9mT2Zmc2V0KGludCBvZmZzZXQpOyAvLyB0aHJvd3MgU291cmNlRWRpdGluZ0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoZSBwYXJzZXIgaXMgbm93IHJlcXVpcmVkIG9uIGNvbnN0cnVjdG9yLCBzbyB0aGVyZSBhcmUgb2NjYXNpb25zIGl0Ci0JICogbmVlZHMgdG8gYmUgcmV0cmlldmVkLCBzdWNoIGFzIHRvIGJlIGluaXRpYWxpemVkIGJ5IEVtYmVkZGVkQ29udGVudFR5cGUKLQkgKi8KLQlSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpCi0JICogQHJldHVybgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGdldFJlZ2lvbkxpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb248L2NvZGU+IGF0IHRoZSBnaXZlbiBjaGFyYWN0ZXIgb2Zmc2V0LgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIHRoZSA8Y29kZT5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uPC9jb2RlPiBhdCB0aGUgZ2l2ZW4gY2hhcmFjdGVyIG9mZnNldC4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpOwotCQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+SVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjwvY29kZT5zIGluIHRoZSBzcGVjaWZpZWQgcmFuZ2UuCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcmV0dXJuIDxjb2RlPklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb248L2NvZGU+cyBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGludCBvZmZzZXQsIGludCBsZW5ndGgpOwotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIDxjb2RlPklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb248L2NvZGU+cyBpbiB0aGUgZG9jdW1lbnQuCi0JICogQHJldHVybiBhbGwgPGNvZGU+SVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjwvY29kZT5zIGluIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCQotCS8qKgotCSAqIE5vdGU6IHRoaXMgbWV0aG9kIHdhcyBtYWRlIHB1YmxpYywgYW5kIHBhcnQgb2YgdGhlIGludGVyZmFjZSwgZm9yCi0JICogZWFzaWVyIHRlc3RpbmcuIENsaWVudHMgbm9ybWFsbHkgbmV2ZXIgbWFuaXB1bGF0ZSB0aGUgcmVwYXJzZXIgZGlyZWN0bHkKLQkgKiAobm9yIHNob3VsZCB0aGV5IG5lZWQgdG8pLgotCSAqLwotCUlTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIGdldFJlUGFyc2VyKCk7Ci0KLQlTdHJpbmcgZ2V0VGV4dCgpOwotCi0JSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgZ2V0VW5kb01hbmFnZXIoKTsKLQotCS8qKgotCSAqIGNhdXNlcyB0aGF0IHBvcnRpb24gb2YgdGhlIGRvY3VtZW50IGZyb20gc3RhcnRPZmZzZXQgdG8gbGVuZ3RoIHRvIGJlCi0JICogbWFya2VkIGFzIHJlYWRvbmx5LiBOb3RlIHRoYXQgaWYgdGhpcyByYW5nZSBvdmVybGFwcyB3aXRoIHNvbWUgb3RoZXIKLQkgKiByZWdpb24gd2l0aCBpcyByZWFkb25seSwgdGhlIHJlZ2lvbnMgYXJlIGVmZmVjdGl2bHkgY29tYmluZWQuCi0JICogCi0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqLwotCXZvaWQgbWFrZVJlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiBuZXdJbnN0YW5jZSBpcyBzaW1pbGFyIHRvIGNsb25lLCBleGNlcHQgaXQgY29udGFpbnMgbm8gZGF0YS4gT25lCi0JICogaW1wb3J0YW50IHRoaW5nIHRvIGR1cGxpY2F0ZSBpcyB0aGUgcGFyc2VyLCB3aXRoIHRoZSBwYXJzZXIgY29ycmVjdGx5Ci0JICogImNsb25lZCIsIGluY2x1ZGluZyBpdHMgdG9rZW5pbnplciwgYmxvY2sgdGFncywgZXRjLgotCSAqIAotCSAqIE5PVEU6IGV2ZW4gYWZ0ZXIgb2J0YWluaW5nIGEgJ25ld0luc3RhbmNlJyB0aGUgY2xpZW50IG1heSBoYXZlIHRvIGRvCi0JICogc29tZSBpbml0aWFsaXphdGlvbiwgZm9yIGV4YW1wbGUsIGl0IG1heSBuZWVkIHRvIGFkZCBpdHMgb3duIG1vZGVsCi0JICogbGlzdGVuZXJzLiBPciwgYXMgYW5vdGhlciBleGFtcGxlLCBpZiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCBoYXMgYQotCSAqIHBhcnNlciBvZiB0eXBlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlciwgdGhlbiB0aGUgY2xpZW50IG1heSBuZWVkCi0JICogdG8gYWRkIGl0cyBvd24gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciB0byB0aGF0IHBhcnNlciwgaWYgaXQgaXMKLQkgKiBpbiBmYWN0IG5lZWRlZC4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IG5ld0luc3RhbmNlKCk7Ci0KLQl2b2lkIHJlbW92ZURvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQl2b2lkIHJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQl2b2lkIHJlbW92ZURvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICogCi0JICogcmVwbGFjZVRleHQgcmVwbGFjZXMgdGhlIHRleHQgZnJvbSBvbGRTdGFydCB0byBvbGRFbmQgd2l0aCB0aGUgbmV3IHRleHQKLQkgKiBmb3VuZCBpbiB0aGUgcmVxdWVzdGVkQ2hhbmdlIHN0cmluZy4gSWYgb2xkU3RhcnQgYW5kIG9sZEVuZCBhcmUgZXF1YWwsCi0JICogaXQgaXMgYW4gaW5zZXJ0aW9uIHJlcXVlc3QuIElmIHJlcXVlc3RlZENoYW5nZSBpcyBudWxsIChvciBlbXB0eSkgaXQgaXMKLQkgKiBhIGRlbGV0ZSByZXF1ZXN0LiBPdGhlcndpc2UgaXQgaXMgYSByZXBsYWNlIHJlcXVlc3QuCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHNvdXJjZSwgaW50IG9sZFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyByZXF1ZXN0ZWRDaGFuZ2UpOwotCi0JLyoqCi0JICogTm90ZSwgc2FtZSBhcyByZXBsYWNlVGV4dCBBUEksIGJ1dCB3aWxsIGFsbG93IHJlYWRvbmx5IGFyZWFzIHRvIGJlCi0JICogcmVwbGFjZWQuIFRoaXMgc2hvdWxkIHNlbGRvbSBiZSBjYWxsZWQgd2l0aCBhIHZhbHVlIG9mICJ0cnVlIiBmb3IKLQkgKiBpZ25vcmVSZWFkT25seVNldHRpbmcuIE9uZSBjYXNlIHdoZXJlIGl0cyBvayBpcyB3aXRoIHVuZG8gb3BlcmF0aW9ucwotCSAqIChzaW5jZSwgcHJlc3VtYWJseSwgaWYgdXNlciBqdXN0IGRpZCBzb21ldGhpbmcgdGhhdCBoYXBwZW5kZWQgdG8KLQkgKiBpbnZvbHZlIHNvbWUgaW5zZXJ0aW5nIHJlYWRvbmx5IHRleHQsIHRoZXkgc2hvdWxkIG5vcm1hbGx5IGJlIGFsbG93ZWQKLQkgKiB0byBzdGlsbCB1bmRvIHRoYXQgb3BlcmF0aW9uLiBPdGhlcndpc2UsIEkgY2FuJ3QgdGhpbmsgb2YgYSBzaW5nbGUKLQkgKiBleGFtcGxlLCB1bmxlc3MgaXRzIHRvIGdpdmUgdGhlIHVzZXIgYSBjaG9pY2UsIGUuZy4gInlvdSBhcmUgYWJvdXQgdG8KLQkgKiBvdmVyd3JpdGUgcmVhZCBvbmx5IHBvcnRpb25zLCBkbyB5b3Ugd2FudCB0byBjb250aW51ZSIuCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHNvdXJjZSwgaW50IG9sZFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyByZXF1ZXN0ZWRDaGFuZ2UsIGJvb2xlYW4gaWdub3JlUmVhZE9ubHlTZXR0aW5nKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHRvIHJlbWVtYmVyIGluZm8gYWJvdXQgdGhlIGVuY29kaW5nIFdoZW4gdGhlIHJlc291cmNlCi0JICogd2FzIGxhc3QgbG9hZGVkIG9yIHNhdmVkLiBOb3RlOiBpdCBpcyBub3Qga2VwdCAiY3VycmVudCIsIHRoYXQgaXMsIGNhbgotCSAqIG5vdCBiZSBkZXBlbmRlZCBvbiBibGluZGx5IHRvIHJlZmxlY3Qgd2hhdCBlbmNvZGluZyB0byB1c2UuIEZvciB0aGF0LAotCSAqIG11c3QgZ28gdGhyb3VnaCB0aGUgbm9ybWFsIHJ1bGVzIGV4cHJlc3NlZCBpbiBMb2FkZXJzIGFuZCBEdW1wZXJzLgotCSAqLwotCXZvaWQgc2V0RW5jb2RpbmdNZW1lbnRvKEVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8pOwotCi0JcHVibGljIHZvaWQgc2V0TGluZURlbGltaXRlcihTdHJpbmcgZGVsaW1pdGVyKTsKLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgQVBJcyB0byBtYW5pcHVsYXRlIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IGluIHRlcm1zIG9mIFRleHQuCi0JICogCi0JICogVGhlIHNldFRleHQgbWV0aG9kIHJlcGxhY2VzIGFsbCB0ZXh0IGluIHRoZSBtb2RlbC4KLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBzZXRUZXh0KE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBhbGxUZXh0KTsKLQotCXZvaWQgc2V0VW5kb01hbmFnZXIoSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW5kb01hbmFnZXIpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIwM2IyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotLyoqCi0gKiBBIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBpcyBhIGNvbGxlY3Rpb24gb2YgSVRleHRSZWdpb25zLiBJdCBpcyBhIHN0cnVjdHVyYWwKLSAqIHVuaXQsIGJ1dCBhIG1pbmltYWwgb25lLiBGb3IgZXhhbXBsZSwgaW4gbWlnaHQgY29uc2lzdCBvZiBhICJzdGFydCB0YWciIGJ1dAotICogbm90IGEgd2hvbGUgWE1MIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBleHRlbmRzIElUZXh0UmVnaW9uQ29sbGVjdGlvbiB7Ci0KLQkvKioKLQkgKiBBZGRzIGEgdGV4dCByZWdpb24gdG8gdGhlIGVuZCBvZiB0aGUgY29sbGVjdGlvbiBvZiByZWdpb25zIGNvbnRhaW5lZCBieQotCSAqIHRoaXMgcmVnaW9uLiBJdCBpcyB0aGUgcGFyc2VycyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgaXRzIGEKLQkgKiBjb3JyZWN0IHJlZ2lvbiAodGhhdCBpcywgaXRzIHN0YXJ0IG9mZnNldCBpcyBvbmUgZ3JlYXRlciB0aGFuIHByZXZpb3VzCi0JICogcmVnaW9ucyBlbmQgb2Zmc2V0KQotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBhZGRSZWdpb24oSVRleHRSZWdpb24gYVJlZ2lvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiB0aGF0IGZvbGxvd3MgdGhpcyBvbmUgb3IgbnVsbCBpZgotCSAqIGF0IGVuZCBvZiBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiB0aGF0IGZvbGxvd3MgdGhpcyBvbmUuCi0JICogCi0JICogSVNTVUU6IGZvciB0aHJlYWQgc2FmZXR5LCB0aGlzIHNob3VsZCBiZSBtb3JlIHJlc3RyaWN0aXZlLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TmV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIHJlZ2lvbnMgcGFyZW50IGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhpcyByZWdpb25zIHBhcmVudCBkb2N1bWVudC4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IGdldFBhcmVudERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiB0aGF0IHByZWNlZWRzIHRoaXMgb25lIG9yIG51bGwKLQkgKiBpZiBhdCBiZWdpbm5pbmcgb2YgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gdGhhdCBmb2xsb3dzIHRoaXMgb25lLgotCSAqIAotCSAqIElTU1VFOiBmb3IgdGhyZWFkIHNhZmV0eSwgdGhpcyBzaG91bGQgYmUgbW9yZSByZXN0cmljdGl2ZS4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFByZXZpb3VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBkb2N1bWVudCBoYXMgYmVlbiBkZWxldGVkLCBhbmQgaXMgbm8gbG9uZ2VyIHBhcnQKLQkgKiBvZiB0aGUgYWN0dWFsIHN0cnVjdHVyZWQgZG9jdW1lbnQuIFRoaXMgZmllbGQgY2FuIGJlIHVzZWQgaW4KLQkgKiBtdWx0aS10aHJlYWRlZCBvcGVyYXRpb25zLCB3aGljaCBtYXkgcmV0cmlldmUgYSBsb25nIGxpc3Qgb2YgcmVnaW9ucwotCSAqIGFuZCBiZSBpdGVyYXRpbmcgdGhyb3VnaCB0aGVtIGF0IHRoZSBzYW1lIHRpbWUgdGhlIGRvY3VtZW50IGlzCi0JICogbW9kaWZpZWQsIGFuZCByZWdpb25zIGRlbGV0ZWQuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgcmVnaW9uIGlzIG5vIGxvbmdlciBwYXJ0IG9mIGRvY3VtZW50LgotCSAqLwotCWJvb2xlYW4gaXNEZWxldGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiB3YXMgZW5kZWQgIm5hdHVyYWxseSIKLQkgKiBieSBzeW50YWN0aWMgcnVsZXMsIG9yIGlmIHNpbXBseSBhc3N1bWVkIHRvIGVuZCBzbyBhbm90aGVyIGNvdWxkIGJlCi0JICogc3RhcnRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgcmVnaW9uIGhhcyBzeW50YWN0aWMgZW5kLgotCSAqLwotCWJvb2xlYW4gaXNFbmRlZCgpOwotCi0JLyoqCi0JICogVGVzdHMgaXMgcmVnaW9uIGlzIGVxdWFsIHRvIHRoaXMgb25lLCBpZ25vcmluZyBwb3NpdGlvbiBvZmZzZXRzIG9mCi0JICogc2hpZnQuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogQHBhcmFtIHNoaWZ0Ci0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gc2FtZUFzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpOwotCi0JLyoqCi0JICogVGVzdHMgaWYgPGNvZGU+b2xkUmVnaW9uPC9jb2RlPiBpcyBzYW1lIGFzIDxjb2RlPm5ld1JlZ2lvbjwvY29kZT4sCi0JICogaWdub3JpbmcgcG9zaXRpb24gb2Zmc2V0cyBvZiA8Y29kZT5zaGlmdDwvY29kZT4uCi0JICogCi0JICogSVNTVUU6IHdoaWNoIGRvY3VtZW50IHJlZ2lvbiBhcmUgb2xkIGFuZCBuZXcgaW4/Ci0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkUmVnaW9uCi0JICogQHBhcmFtIGRvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIG5ld1JlZ2lvbgotCSAqIEBwYXJhbSBzaGlmdAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIHNhbWVBcyhJVGV4dFJlZ2lvbiBvbGRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIG5ld1JlZ2lvbiwgaW50IHNoaWZ0KTsKLQotCS8qKgotCSAqIFNldCB0byB0cnVlIGlmL3doZW4gdGhpcyByZWdpb24gaXMgcmVtb3ZlZCBmcm9tIGEgZG9jdW1lbnQsIGR1cmluZyB0aGUKLQkgKiBwcm9jZXNzIG9mIHJlLXBhcnNpbmcuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsZXRlZAotCSAqLwotCXZvaWQgc2V0RGVsZXRlZChib29sZWFuIGRlbGV0ZWQpOwotCi0JLyoqCi0JICogU2V0IHRvIHRydWUgYnkgcGFyc2VyL3JlcGFyc2VyIGlmIHJlZ2lvbiBkZWVtZWQgdG8gZW5kIHN5bnRhY3RpY2FsbHkuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gaGFzRW5kCi0JICovCi0Jdm9pZCBzZXRFbmRlZChib29sZWFuIGhhc0VuZCk7Ci0KLQkvKioKLQkgKiBTZXRzIGxlbmd0aCBvZiByZWdpb24uCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKi8KLQl2b2lkIHNldExlbmd0aChpbnQgbmV3TGVuZ3RoKTsKLQotCS8qKgotCSAqIEFzc2lnbnMgcG9pbnRlciB0byBuZXh0IHJlZ2lvbiwgb3IgbnVsbCBpZiBsYXN0IHJlZ2lvbi4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgc2V0TmV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05leHQpOwotCi0JLyoqCi0JICogQXNzaWducyBwYXJlbnQgZG9jdW1uZXQuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKi8KLQl2b2lkIHNldFBhcmVudERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpOwotCi0JLyoqCi0JICogQXNzaWducyBwb2ludGVyIHRvIHByZXZpb3VzIHJlZ2lvbiwgb3IgbnVsbCBpZiBmaXJzdCByZWdpb24uCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKi8KLQl2b2lkIHNldFByZXZpb3VzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3UHJldmlvdXMpOwotCi0JLyoqCi0JICogU2V0cyBzdGFydCBvZmZzZXQgb2YgcmVnaW9uLCByZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2YgZG9jdW1lbnQuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKi8KLQl2b2lkIHNldFN0YXJ0KGludCBuZXdTdGFydCk7Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzQ0MzFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgYSBjbGFzcyB1c2VkIHRvIHByb3ZpZGUgYSBsaXN0IG9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIHNvIHRoZQotICogaW1wbGVtZW50YXRpb24gb2YgaG93IHRoZSBsaXN0IGlzIGZvcm1lZCBjYW4gYmUgaGlkZGVuIChlbmNhcHN1bGF0ZWQgYnkKLSAqIHRoaXMgY2xhc3MpLgotICogCi0gKiBJU1NVRTogc2hvdWxkIGV4dGVuZCBJVGV4dFJlZ2lvbkxpc3QgaW5zdGVhZD8KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGVudW1lcmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gZW51bWVyYXRpb24uCi0JICovCi0JRW51bWVyYXRpb24gZWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgc2l6ZSBvZiBsaXN0LgotCSAqIAotCSAqIEByZXR1cm4gc2l6ZSBvZiBsaXN0LgotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIGF0IGluZGV4IGkuCi0JICogCi0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIGluZGV4IG9mIHJlZ2lvbiB0byByZXR1cm4KLQkgKiBAcmV0dXJuIHRoZSByZWdpb24gYXQgc3BlY2lmaWVkIG9mZnNldC4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGl0ZW0oaW50IGkpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25UeXBlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkUGFydGl0aW9uVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjMjAxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25UeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbmluZyBmb3IgU3RydWN0dXJlZERvY3VtZW50cy4KLSAqIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBkZXByZWNhdGVkIHVzZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFBhcnRpdGlvblR5cGVzIHsKLQotCVN0cmluZyBERUZBVUxUX1BBUlRJVElPTiA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVOS05PV05fUEFSVElUSU9OID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuVU5LTk9XTl9QQVJUSVRJT05fVFlQRSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZFBhcnRpdGlvbmluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTk0MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0vKioKLSAqIElkZW50aWZpZXMgdGhlIHdheSB0aGF0IERvY3VtZW50cyBhcmUgcGFydGl0aW9uZWQuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nIHsKLQkKLQkvKiogU3RyaW5nIHRvIGlkZW50aWZ5IGRlZmF1bHQgcGFydGl0aW9uaW5nKi8KLQlTdHJpbmcgREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZGVmYXVsdF9zdHJ1Y3R1cmVkX3RleHRfcGFydGl0aW9uaW5nIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1M2Y4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbjsKLQotCi0vKioKLSAqIEEgcGFydGl0aW9uZXIgaW50ZXJmYWNlIHJlcXVpcmVkIGZvciBoYW5kbGluZyB0aGUgZW1iZWRkZWQgY29udGVudCB0eXBlIAotICogcHJvcGVybHkuIAotICogCi0gKiBJU1NVRTogbmVlZCB0byBpbnZlc3RpZ2F0ZSBuZWNlc3NpdHkgb2YgdGhlc2UgbWV0aG9kcwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIGV4dGVuZHMgSURvY3VtZW50UGFydGl0aW9uZXIgewotCi0JLyoqCi0JICogVXNlZCBieSBKU1AgcGFydGl0aW9uZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHBhcnRpdGlvbmVyIG9mIHRoZQotCSAqIGVtYmVkZGVkIGNvbnRlbnQgdHlwZSBnZXRzIHRvIGNyZWF0ZSB0aGUgcGFydGl0aW9uIGluIGNhc2UgdGhlIHNwZWNpZmljCi0JICogY2xhc3NlcyBhcmUgaW1wb3J0YW50LgotCSAqIAotCSAqIElTU1VFOiBpbnZlc3RpZ2F0ZSBpZiB3ZSByZWFsbHkgbmVlZCB0aGlzLi4uCi0JICovCi0JSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBjcmVhdGVQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHBhcnRpdGlvblR5cGUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRGVmYXVsdCBwYXJ0aXRpb24gdHlwZSBmb3IgdGhpcyBwYXJ0aXRpb25lci4KLQkgKiA8cD4KLQkgKiBlZzoKLQkgKiA8YnI+PGNvZGU+b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQ8L2NvZGU+Ci0JICogPGJyPjxjb2RlPm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUPC9jb2RlPgotCSAqIDxicj48Y29kZT5vcmcuZWNsaXBzZS53c3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVDwvY29kZT4KLQkgKiA8L3A+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9ucwotCSAqIAotCSAqIEByZXR1cm4gdGhlIERlZmF1bHQgcGFydGl0aW9uIHR5cGUgZm9yIHRoaXMgcGFydGl0aW9uZXIuCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRQYXJ0aXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aWN1bGFyIHBhcnRpdGlvbiB0eXBlIGZvciB0aGUgZ2l2ZW4gcmVnaW9uL29mZnNldC4KLQkgKiA8cD4KLQkgKiBlZzoKLQkgKiA8YnI+PGNvZGU+b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQ8L2NvZGU+Ci0JICogPGJyPjxjb2RlPm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUPC9jb2RlPgotCSAqIDxicj48Y29kZT5vcmcuZWNsaXBzZS53c3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVDwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHJlZ2lvbiBvZiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudAotCSAqIEBwYXJhbSBvZmZzZXQgaW4gdGhlIElTdHJ1Y3R1cmVkRG91Y21lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJ0aWN1bGFyIHBhcnRpdGlvbiB0eXBlIGZvciB0aGUgZ2l2ZW4gcmVnaW9uL29mZnNldC4KLQkgKi8KLQlTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJVGV4dFJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5nIG9mIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIAotCSAqIGJldHdlZW4gdGhlIDIgcmVnaW9uIHBhcmFtZXRlcnMuCi0JICogVXNlZnVsIGZvciBmaW5kaW5nIHRoZSBwYXJ0aXRpb24gdHlwZSBvZiBhIDAgbGVuZ3RoIHJlZ2lvbi4KLQkgKiBlZy4KLQkgKiA8cHJlPgotCSAqIAk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+fDwvc2NyaXB0PgotCSAqIDwvcHJlPgotCSAqIEBwYXJhbSBwcmV2aW91c05vZGUKLQkgKiBAcGFyYW0gbmV4dE5vZGUKLQkgKiBAcmV0dXJuIHRoZSBwYXJ0aXRpb24gdHlwZSBvZiB0aGUgbm9kZSBiZXR3ZWVuIHByZXZpb3VzTm9kZSBhbmQgbmV4dE5vZGUKLQkgKiBAZGVwcmVjYXRlZCBtb3ZlIHRvIElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMiAtPgotCSAqICBTdHJpbmcgZ2V0Q29udGVudFR5cGUoaW50IG9mZnNldCwgYm9vbGVhbiBwcmVmZXJPcGVuUGFydGl0aW9ucyk7Ci0JICovCi0JU3RyaW5nIGdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNOb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZFRleHRSZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhY2RmYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci0KLS8qKgotICogSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgZGVzY3JpYmVzIHRoZSBjaGFyYWN0ZXJpc3RpY3MgYW5kIHJlc3BvbnNpYmlsaXRpZXMKLSAqIGZvciByZXBhcnNpbmcgYSBzdHJ1Y3R1cmVkIGRvY3VtZW50LgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFRleHRSZVBhcnNlciB7Ci0KLQkvKioKLQkgKiBCZWdpbnMgdGhlIHByb2Nlc3Mgb2YgcmVwYXJzaW5nLCBieSBwcm92aWRpbmcgdGhlIGluZm9ybWF0aW9uIG5lZWRlZAotCSAqIGZvciB0aGUgcmVwYXJzZS4gVGhlIHJlcGFyc2UgaXMgYWN0dWFsbHkgcGVyZm9ybWVkIHdoZW4gdGhlIHJlcGFyc2UKLQkgKiBtZXRob2QgaXMgY2FsbGVkLiBXaWxsIHRocm91Z2ggYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGRvY3VtZW50IGFzCi0JICogbm90IGJlIHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdGVyCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogQHBhcmFtIGxlbmd0aFRvUmVwbGFjZQotCSAqIEBwYXJhbSBjaGFuZ2VzCi0JICovCi0Jdm9pZCBpbml0aWFsaXplKE9iamVjdCByZXF1ZXN0ZXIsIGludCBzdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSwgU3RyaW5nIGNoYW5nZXMpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgdG8gZW5hYmxlIG11bHRpcGxlIHRocmVhZHMgdG8gcmVwYXJzZSBhCi0JICogZG9jdW1lbnQuIFRoaXMgaXMgbmVlZGVkIHNpbmNlIHRoZSBpbnRpYWxpemUgbWV0aG9kIHNldHMgc3RhdGUKLQkgKiB2YXJpYWJsZXMgdGhhdCBtdXN0IGJlICJpbiBzeW5jIiB3aXRoIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJzaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgcmVwYXJzZXIsIHVzZWQgd2hlbiBjbG9uaW5nIGRvY3VtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgcmVwYXJzZXIuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld0luc3RhbmNlKCk7Ci0KLQkvKioKLQkgKiBBbiBlbnRyeSBwb2ludCBmb3IgcmVwYXJzaW5nLiBJdCBuZWVkcyB0byBjYWxjdWxhdGVzIHRoZSBkaXJ0eSBzdGFydAotCSAqIGFuZCBkaXJ0eSBlbmQgaW4gdGVybXMgb2Ygc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zIGJhc2VkIG9uIHRoZQotCSAqIHN0YXJ0IHBvaW50IGFuZCBsZW5ndGggb2YgdGhlIGNoYW5nZXMsIHdoaWNoIGFyZSBwcm92aWRlZCBieSB0aGUKLQkgKiBpbml0aWFsaXplIG1ldGhvZC4gV2lsbCB0aHJvdWdoIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBkb2N1bWVudCBhcwotCSAqIG5vdCBiZSBzZXQuCi0JICogCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGFyc2UoKTsKLQotCi0KLQkvKioKLQkgKiBUaGUgcmVwYXJzZXIgaXMgaW5pdGlhbGl6ZWQgd2l0aCBpdHMgZG9jdW1lbnQsIGVpdGhlciBpbiBvciBzaG9ydGx5Ci0JICogYWZ0ZXIgaXRzIGNvbnN0cnVjdGVkIGlzIGNhbGxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMjgxYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci0KLS8qKgotICogQSBzaW1wbGUgZGVzY3JpcHRpb24gb2YgYSBiaXQgb2YgdGV4dCAodGVjaG5pY2FsbHksIGEgYml0IG9mIGEgdGV4dCBidWZmZXIpCi0gKiB0aGF0IGhhcyBhICJ0eXBlIiBhc3NvY2lhdGVkIHdpdGggaXQuIEZvciBleGFtcGxlLCBmb3IgdGhlIFhNTCB0ZXh0Ci0gKiAiJkxUO0lNRyZHVDsiLCB0aGUgJyA8JyBtaWdodCBmb3JtIGEgcmVnaW9uIG9mIHR5cGUgIm9wZW4gYnJhY2tldCIgd2hlcmUgYXMKLSAqIHRoZSB0ZXh0ICJJTUciIG1pZ2h0IGZvcm0gYSByZWdpb24gb2YgdHlwZSAidGFnIG5hbWUiLgotICogCi0gKiBOb3RlIHRoYXQgdGhlcmUgYXJlIHRocmVlIHBvc2l0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSByZWdpb24sIHRoZSBzdGFydCwKLSAqIHRoZSBlbmQsIGFuZCB0aGUgZW5kIG9mIHRoZSB0ZXh0LiBUaGUgZW5kIG9mIHRoZSByZWdpb24gc2hvdWxkIGFsd2F5cyBiZQotICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBlbmQgb2YgdGhlIHRleHQsIGJlY2F1c2UgdGhlIGVuZCBvZiB0aGUgdGV4dAotICogc2ltcGx5IGluY2x1ZGVzIGFueSB3aGl0ZSBzcGFjZSB0aGF0IG1pZ2h0IGZvbGxvdyB0aGUgbm9uLXdoaXRlc3BhY2UKLSAqIHBvcnRpb24gb2YgdGhlIHJlZ2lvbi4gVGhpcyB3aGl0ZXNwYWNlIGlzIGFzc3VtZWQgdG8gYmUgaWdub3JhYmxlIGV4Y2VwdAotICogZm9yIHJlYXNvbnMgb2YgbWFpbnRhaW5pbmcgaXQgaW4gdGhlIG9yaWdpbmFsIGRvY3VtZW50IGZvciBmb3JtYXR0aW5nLAotICogYXBwZWFyYW5jZSwgZXRjLgotICogCi0gKiBGb2xsb3dzIHRoZSBQcmltZSBEaXJlY3RpdmVzOgotICogCi0gKiBnZXRFbmQoKSA9PSBnZXRTdGFydCgpICsgZ2V0TGVuZ3RoKCkKLSAqIAotICogZ2V0VGV4dEVuZCgpID09IGdldFN0YXJ0KCkgKyBnZXRUZXh0TGVuZ3RoKCk7Ci0gKiAKLSAqIEV2ZW50IHRob3VnaCAnZW5kJyBhbmQgJ2xlbmd0aCcgYXJlIHJlZHVuZGFudCAoZ2l2ZW4gc3RhcnQpLCBib3RoIG1ldGhvZHMKLSAqIGFyZSBwcm92aWRlZCwgc2luY2Ugc29tZSBwYXJzZXJzL2ltcGxlbWVudGF0aW9ucyBmYXZvciBvbmUgb3IgdGhlIG90aGVyIGZvcgotICogZWZmaWNpZW5jeS4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRSZWdpb24gewotCi0JLyoqCi0JICogQ2hhbmdlcyBsZW5ndGggb2YgcmVnaW9uLiBNYXkgYmUgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuCi0JICogemVyby4gSXQgbWF5IG5vdCwgaG93ZXZlciwgY2F1c2UgdGhlIGxlbmd0aCBvZiB0aGUgcmVnaW9uIHRvIGJlIGxlc3MKLQkgKiB0aGFuIG9yIGVxdWFsIHRvIHplcm8sIG9yIGFuIGlsbGVnYWwgYXJndW1lbnQgYWNjZXB0aW9uIG1heSBiZSB0aHJvd24KLQkgKiBhdCBydW50aW1lLgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpOwotCi0JLyoqCi0JICogQ2hhbmdlcyBzdGFydCBvZmZzZXQgb2YgcmVnaW9uLiBNYXkgYmUgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlcgotCSAqIHRoYW4gemVyby4gSXQgbWF5IG5vdCwgaG93ZXZlciwgY2F1c2UgdGhlIG9mZnNldCBvZiB0aGUgcmVnaW9uIHRvIGJlCi0JICogbGVzcyB0aGFuIHplcm8sIG9yIGFuIGlsbGVnYWwgYXJndW1lbnQgYWNjZXB0aW9uIG1heSBiZSB0aHJvd24gYXQKLQkgKiBydW50aW1lLgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBhZGp1c3RTdGFydChpbnQgaSk7Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRleHQgbGVuZ3RoIG9mIHJlZ2lvbi4KLQkgKiAKLQkgKiBNYXkgYmUgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHplcm8uIEl0IG1heSBub3QsIGhvd2V2ZXIsCi0JICogY2F1c2UgdGhlIHRleHQgbGVuZ3RoIG9mIHRoZSByZWdpb24gdG8gYmUgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgYQotCSAqIHJlZ2lvbiwgb3IgYW4gaWxsZWdhbCBhcmd1bWVudCBhY2NlcHRpb24gbWF5IGJlIHRocm93biBhdCBydW50aW1lLgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKTsKLQotCS8qKgotCSAqIE1ha2VzIHRoaXMgcmVnaW9ucyBzdGFydCwgbGVuZ3RoLCBhbmQgdGV4dCBsZW5ndGggZXF1YWwgdG8gdGhlCi0JICogcGFyZW10ZXIncyBzdGFydCwgbGVuZ3RoLCBhbmQgdGV4dCBsZW5ndGguCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqLwotCXZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmQgb2Zmc2V0IG9mIHRoaXMgcmVnaW9uLiBXaGV0aGVyIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAqIGRvY3VtZW50LCBvciBhbm90aGVyIHJlZ2lvbiBkZXBlbmRzIG9uIHRoZSBzdWJ0eXBlLgotCSAqIAotCSAqIEZvbGxvd3MgdGhlIFByaW1lIERpcmVjdGl2ZTogZ2V0RW5kKCkgPT0gZ2V0U3RhcnQoKSArIGdldExlbmd0aCgpCi0JICogCi0JICogQHJldHVybiB0aGUgZW5kIG9mZnNldCBvZiB0aGlzIHJlZ2lvbi4KLQkgKi8KLQlpbnQgZ2V0RW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lvbi4KLQkgKiAKLQkgKiBGb2xsb3dzIHRoZSBQcmltZSBEaXJlY3RpdmU6IGdldEVuZCgpID09IGdldFN0YXJ0KCkgKyBnZXRMZW5ndGgoKQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcmVnaW9uLgotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXJ0IG9mIHRoZSByZWdpb24uIFdoZXRoZXIgaXMgcmVsYXRpdmUgdG8gdGhlIGRvY3VtZW50LAotCSAqIG9yIGFub3RoZXIgcmVnaW9uIGRlcGVuZHMgb24gdGhlIHN1YnR5cGUuCi0JICogCi0JICogRm9sbG93cyB0aGUgUHJpbWUgRGlyZWN0aXZlOiBnZXRFbmQoKSA9PSBnZXRTdGFydCgpICsgZ2V0TGVuZ3RoKCkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdGFydCBvZiB0aGUgcmVnaW9uLgotCSAqLwotCWludCBnZXRTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5kIG9mZnNldCBvZiB0aGUgdGV4dCBvZiB0aGlzIHJlZ2lvbi4KLQkgKiAKLQkgKiBJbiBzb21lIGltcGxlbWVudGF0aW9ucywgdGhlICJlbmQiIG9mIHRoZSByZWdpb24gKGFjY2Vzc2libGUgdmlhCi0JICogZ2V0RW5kKCkpIGFsc28gY29udGFpbnMgYW55IGFuZCBhbGwgd2hpdGUgc3BhY2UgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZQotCSAqIHByZXNlbnQgYWZ0ZXIgdGhlICJ0b2tlbiIgKHJlYWQ6IHJlbGV2YW50KSBwYXJ0IG9mIHRoZSByZWdpb24uIFRoaXMKLQkgKiBtZXRob2QsIGdldFRleHRFbmQoKSwgaXMgc3BlY2lmaWMgZm9yIHRoZSAidG9rZW4iIHBhcnQgb2YgdGhlIHJlZ2lvbiwKLQkgKiB3aXRob3V0IHRoZSB3aGl0ZXNwYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVuZCBvZmZzZXQgb2YgdGhlIHRleHQgb2YgdGhpcyByZWdpb24uCi0JICovCi0JaW50IGdldFRleHRFbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCBvZiB0aGlzIHJlZ2lvbi4KLQkgKiAKLQkgKiBUaGUgdGV4dCBsZW5ndGggaXMgZXF1YWwgdG8gbGVuZ3RoIGlmIHRoZXJlIGlzIG5vIHdoaXRlIHNwYWNlIGF0IHRoZQotCSAqIGVuZCBvZiBhIHJlZ2lvbi4gT3RoZXJ3aXNlIGl0IGlzIHNtYWxsZXIgdGhhbiBsZW5ndGguCi0JICogCi0JICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IG9mIHRoaXMgcmVnaW9uLgotCSAqLwotCWludCBnZXRUZXh0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgcmVnaW9uLgotCSAqIAotCSAqIEBzZWUgcmVnaW9udHlwZXMsIHN0cnVjdHVyZWRkb2N1bWVudHJlZ2lvbnR5cGVzCi0JICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIHJlZ2lvbi4KLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogQWxsb3dzIHRoZSByZWdpb24gaXRzZWxmIHRvIHBhcnRpY2lwYXRlIGluIHJlcGFyc2luZyBwcm9jZXNzLgotCSAqIAotCSAqIFRoZSByZWdpb24gaXRzZWxmIGNhbiBkZWNpZGUgaWYgaXQgY2FuIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQKLQkgKiB0byByZXR1cm4sIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgY2hhbmdlLiBJZiBpdCBjYW4gbm90LCB0aGlzIG1ldGhvZAotCSAqIG11c3QgcmV0dXJuIG51bGwsIHNvIGEgImhpZ2hlciBsZXZlbCIgcmVwYXJzaW5nIHByb2Nlc3Mgd2lsbCBiZSBnaXZlbgotCSAqIHRoZSBvcHB1cnR1bml0eSB0byBkZWNpZGUuIElmIGl0IHJldHVybnMgYW4gRXZlbnQsIHRoYXQncyBpdCwgbm90IG90aGVyCi0JICogcmVwYXJzaW5nIHByb2Nlc3Mgd2lsbCBnZXQgYW4gb3BwdXJ0dW5pdHkgdG8gcmVwYXJzZS4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqIAotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVRleHRSZWdpb25Db2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVRleHRSZWdpb25Db2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ODkwYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLS8qKgotICogSVRleHRSZWdpb25Db2xsZWN0aW9uLCBhcyBpdHMgbmFtZSBpbXBsaWVzLCBpcyBhIGNvbGxlY3Rpb24gb2YKLSAqIElUZXh0UmVnaW9ucy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRSZWdpb25Db2xsZWN0aW9uIGV4dGVuZHMgSVRleHRSZWdpb24gewotCi0JLyoqCi0JICogVXNlZCB0byBkZXRlcm1pbmUgaWYgYSByZWdpb24gY29udGFpbnMgYSBwYXJ0aWN1bGFyIG9mZnNldCwgd2hlcmUKLQkgKiBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiBhIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIHRydWUgaWYgb2Zmc2V0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byByZWdpb25zIHN0YXJ0IGFuZAotCSAqICAgICAgICAgbGVzcyB0aGFuIGl0cyBlbmQgb2Zmc2V0LgotCSAqLwotCWJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGRldGVybWluZSBpZiBhIHJlZ2lvbiBjb250YWlucyBhIHBhcnRpY3VsYXIgb2Zmc2V0LgotCSAqIAotCSAqIElTU1VFOiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IHRoaXMgaXMgcmVhbGx5IGZvciEgKHRoYXQgaXMsIGhvdyB0bwotCSAqIGRlc2NyaWJlIGl0LCBvciBpZiBzdGlsbCBuZWVkZWQpLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIHRydWUgaWYgb2Zmc2V0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byByZWdpb25zIHN0YXJ0IGFuZAotCSAqICAgICAgICAgbGVzcyB0aGFuIGl0cyBlbmQgb2Zmc2V0LgotCSAqLwotCWJvb2xlYW4gY29udGFpbnNPZmZzZXQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuZCBvZmZzZXQgb2YgdGhpcyByZWdpb24sIHJlbGF0aXZlIHRvIGJlZ2lubmluZyBvZgotCSAqIGRvY3VtZW50LgotCSAqIAotCSAqIEZvciBzb21lIHN1YnR5cGVzLCBidXQgbm90IGFsbCwgaXQgaXMgZXF1aXZpbGVudCB0byBnZXRFbmQoKS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlbmQgb2Zmc2V0IG9mIHRoaXMgcmVnaW9uLgotCSAqLwotCWludCBnZXRFbmRPZmZzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuZCBvZmZzZXQsIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50IG9mCi0JICogdGhlIGNvbnRhaW5lZCByZWdpb24uCi0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lZFJlZ2lvbgotCSAqIEByZXR1cm4gdGhlIGVuZCBvZmZzZXQgb2YgdGhlIGNvbnRhaW5lZCByZWdpb24uCi0JICovCi0JaW50IGdldEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgcmVnaW9uIG9mIHRob3NlIGNvbnRhaW5lZCBieSB0aGlzIHJlZ2lvbiBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IHJlZ2lvbi4KLQkgKi8KLQlJVGV4dFJlZ2lvbiBnZXRGaXJzdFJlZ2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbCB0ZXh0IG9mIHRoaXMgcmVnaW9uLCBpbmNsdWRpbmcgd2hpdGVzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmdWxsIHRleHQgb2YgdGhpcyByZWdpb24sIGluY2x1ZGluZyB3aGl0ZXNwYWNlLgotCSAqLwotCVN0cmluZyBnZXRGdWxsVGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbCB0ZXh0IG9mIHRoZSBjb250YWluZWQgcmVnaW9uLCBpbmNsdWRpbmcgd2hpdGVzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmdWxsIHRleHQgb2YgdGhlIGNvbnRhaW5lZCByZWdpb24sIGluY2x1ZGluZyB3aGl0ZXNwYWNlLgotCSAqLwotCVN0cmluZyBnZXRGdWxsVGV4dChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFzdCByZWdpb24gb2YgdGhvc2UgY29udGFpbmVkIGJ5IHRoaXMgcmVnaW9uIGNvbGxlY3Rpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgbGFzdCByZWdpb24uCi0JICovCi0JSVRleHRSZWdpb24gZ2V0TGFzdFJlZ2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlZ2lvbnMgY29udGFpbmVkIGJ5IHRoaXMgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByZWdpb25zIGNvbnRhaW5lZCBieSB0aGlzIHJlZ2lvbi4KLQkgKi8KLQlpbnQgZ2V0TnVtYmVyT2ZSZWdpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWdpb24gdGhhdCBjb250YWlucyBvZmZzZXQuIEluIHRoZSBjYXNlIG9mICJuZXN0ZWQiCi0JICogcmVnaW9ucywgcmV0dXJucyB0aGUgdG9wIG1vc3QgcmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHJlbGF0aXZlIHRvIGJlZ2lubmluZyBvZiBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIHRoZSByZWdpb24gdGhhdCBjb250YWlucyBvZmZzZXQuIEluIHRoZSBjYXNlIG9mICJuZXN0ZWQiCi0JICogICAgICAgICByZWdpb25zLCByZXR1cm5zIHRoZSB0b3AgbW9zdCByZWdpb24uCi0JICovCi0JSVRleHRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWdpb25zIGNvbnRhaW5lZCBieSB0aGlzIHJlZ2lvbi4KLQkgKiAKLQkgKiBOb3RlOiBubyBhc3N1bXB0aW9ucyBzaG91bGQgYmUgbWFkZSBhYm91dCB0aGUgb2JqZWN0IGlkZW50aXR5IG9mIHRoZQotCSAqIHJlZ2lvbnMgcmV0dXJuZWQuIFB1dCBhbm90aGVyIHdheSwgZHVlIHRvIG1lbW9yeSB1c2Ugb3B0aW1pemF0aW9ucywKLQkgKiBldmVuIGlmIHRoZSB1bmRlcmx5aW5nIHRleHQgaGFzIG5vdCBjaGFuZ2VkLCB0aGUgcmVnaW9ucyBtYXkgb3IgbWF5IG5vdAotCSAqIGJlIHRoZSBzYW1lIG9uZXMgcmV0dXJuZWQgZnJvbSBvbmUgY2FsbCB0byB0aGUgbmV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZWdpb25zIGNvbnRhaW5lZCBieSB0aGlzIHJlZ2lvbi4KLQkgKi8KLQlJVGV4dFJlZ2lvbkxpc3QgZ2V0UmVnaW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoaXMgcmVnaW9uLCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mCi0JICogdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGlzIHJlZ2lvbgotCSAqLwotCWludCBnZXRTdGFydE9mZnNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBjb250YWluZWQgcmVnaW9uLCByZWxhdGl2ZSB0byB0aGUKLQkgKiBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgY29udGFpbmVkIHJlZ2lvbgotCSAqLwotCWludCBnZXRTdGFydE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBvZiB0aGlzIHJlZ2lvbiwgbm90IGluY2x1ZGluZyB3aGl0ZSBzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IG9mIHRoaXMgcmVnaW9uLCBub3QgaW5jbHVkaW5nIHdoaXRlIHNwYWNlLgotCSAqLwotCVN0cmluZyBnZXRUZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBjb250YWluZWQgcmVnaW9uLCBub3QgaW5jbHVkaW5nIHdoaXRlIHNwYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgb2YgdGhlIGNvbnRhaW5lZCByZWdpb24sIG5vdCBpbmNsdWRpbmcgd2hpdGUgc3BhY2UuCi0JICovCi0JU3RyaW5nIGdldFRleHQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuZCBvZmZzZXQgb2YgdGhlIHRleHQgb2YgdGhpcyByZWdpb24sIG5vdCBpbmNsdWRpbmcgd2hpdGUKLQkgKiBzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZSB0ZXh0IG9mIHRoaXMgcmVnaW9uLCBub3QgaW5jbHVkaW5nIHdoaXRlCi0JICogICAgICAgICBzcGFjZS4KLQkgKi8KLQlpbnQgZ2V0VGV4dEVuZE9mZnNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5kIG9mZnNldCBvZiB0aGUgdGV4dCBvZiB0aGUgY29udGFpbmVkIHJlZ2lvbiwgbm90Ci0JICogaW5jbHVkaW5nIHdoaXRlIHNwYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVuZCBvZmZzZXQgb2YgdGhlIHRleHQgb2YgdGhlIGNvbnRhaW5lZCByZWdpb24sIG5vdAotCSAqICAgICAgICAgaW5jbHVkaW5nIHdoaXRlIHNwYWNlLgotCSAqLwotCWludCBnZXRUZXh0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbik7Ci0KLQkvKioKLQkgKiBBc3NpZ25zIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5lZCBpbiB0aGlzIHJlZ2lvbi4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZWRSZWdpb25zCi0JICovCi0Jdm9pZCBzZXRSZWdpb25zKElUZXh0UmVnaW9uTGlzdCBjb250YWluZWRSZWdpb25zKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NGNhODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0vKioKLSAqIElUZXh0UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5zIG90aGVyIHJlZ2lvbnMsIGxpa2UgYSBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24KLSAqIGJ1dCBpcyBpdHNlbGYgYSByZWdpb24gaW4gYW4gSVRleHRSZWdpb25Db2xsZWN0aW9uLCBzbyBpdHMgInBhcmVudCIgcmVnaW9uCi0gKiBpcyBtYWludGFpbmVkLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVGV4dFJlZ2lvbkNvbnRhaW5lciBleHRlbmRzIElUZXh0UmVnaW9uQ29sbGVjdGlvbiB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCByZWdpb24uCi0JICovCi0JSVRleHRSZWdpb25Db2xsZWN0aW9uIGdldFBhcmVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcGFyZW50IHJlZ2lvbi4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gdGhpcyByZWdpb24gaXMgY29udGFpbmVkIGluLgotCSAqLwotCXZvaWQgc2V0UGFyZW50KElUZXh0UmVnaW9uQ29sbGVjdGlvbiBwYXJlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTRkM2U4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbkxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogSVRleHRSZWdpb25MaXN0IGlzIHRvIHByb3ZpZGUgYSBsaXN0IG9mIHJlZ2lvbnMuIEl0IGNhbiBiZSB1c2VkIHNvIGNsaWVudHMKLSAqIGRvIG5vdCBuZWVkIHRvIGJlIGF3YXJlIG9mIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRSZWdpb25MaXN0IHsKLQotCS8qKgotCSAqIEFkZHMgcmVnaW9uIHRvIHRoZSBsaXN0LgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHksIHdoaWxlIGxpc3QgaXMgYmVpbmcgY3JlYXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZChJVGV4dFJlZ2lvbiByZWdpb24pOwotCi0JLyoqCi0JICogQWRkcyBuZXcgcmVnaW9ucyB0byB0aGUgbGlzdC4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LCB3aGlsZSBsaXN0IGlzIGJlaW5nIGNyZWF0ZWQuCi0JICogCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqIEBwYXJhbSBuZXdSZWdpb25zCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb250ZW50cyBvZiB0aGlzIGxpc3Qgd2VyZSBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5zZXJ0UG9zLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucyk7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFsbCByZWdpb25zIGZyb20gdGhlIGxpc3QuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seSwgd2hpbGUgbGlzdCBpcyBiZWluZyBjcmVhdGVkLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZ2lvbiBhdCA8Y29kZT5pbmRleDwvY29kZT4sIHdoZXJlIDAgaXMgZmlyc3Qgb25lIGluCi0JICogdGhlIGxpc3QuIFRocm93cyBhbiA8Y29kZT5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb248L2NvZGU+IGlmCi0JICogbGlzdCBpcyBlbXB0eSwgb3IgaWYgaW5kZXggaXMgb3V0IG9mIHJhbmdlLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0KGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiA8Y29kZT5yZWdpb248L2NvZGU+IG9yIC0xIGlmIDxjb2RlPnJlZ2lvbjwvY29kZT4KLQkgKiBpcyBub3QgaW4gdGhlIGxpc3QuCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGluZGV4T2YoSVRleHRSZWdpb24gcmVnaW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBsaXN0IGhhcyBubyByZWdpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBsaXN0IGhhcyBubyByZWdpb25zLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKTsKLQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgdGhpcyBsaXN0LgotCSAqIAotCSAqIEByZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHRoaXMgbGlzdC4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIHJlZ2lvbiBhdCBpbmRleC4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LCB3aGlsZSBsaXN0IGlzIGJlaW5nIGNyZWF0ZWQuCi0JICogCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIHJlbW92ZShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgcmVnaW9uLgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHksIHdoaWxlIGxpc3QgaXMgYmVpbmcgY3JlYXRlZC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoSVRleHRSZWdpb24gcmVnaW9uKTsKLQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbGwgcmVnaW9uTGlzdCBmcm9tIHRoaXMgbGlzdC4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LCB3aGlsZSBsaXN0IGlzIGJlaW5nIGNyZWF0ZWQuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsKElUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGxpc3QuCi0JICogCi0JICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKTsKLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgcmVnaW9ucyBpbiBhbiBhcnJheS4gTm8gYXNzdW1wdGlvbnMgc2hvdWxkIGJlCi0JICogbWFkZSBpZiB0aGUgcmVnaW9ucyBpbiB0aGUgYXJyYXkgYXJlIGNsb25lcyBhcmUgc2FtZSBpbnN0YW5jZSBvZgotCSAqIG9yaWdpbmFsIHJlZ2lvbi4KLQkgKiAKLQkgKiBJU1NVRTogZG8gd2UgbmVlZCB0byBzcGVjaWZ5IGlmIGNsb25lZCBjb3BpZXMgb3Igbm90PwotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcmVnaW9ucy4KLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb25bXSB0b0FycmF5KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9CYXNpY1N0cnVjdHVyZWREb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0Jhc2ljU3RydWN0dXJlZERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYWZkNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0Jhc2ljU3RydWN0dXJlZERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIGluaXRpYWwgSURvY3VtZW50RXh0ZW5zaW9uNCBzdXBwb3J0IC0gIzEwMjgyMgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VlIGFsc28gIzIzOTExNSkKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKEludGFsaW8pIC0gYnVnIDMwMDQzNCAtIE1ha2UgaW5uZXIgY2xhc3NlcyBzdGF0aWMgd2hlcmUgcG9zc2libGUKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKEludGFsaW8pIC0gYnVnIDMwMDQ0MyAtIHNvbWUgY29uc3RhbnRzIGFyZW4ndCBzdGF0aWMgZmluYWwKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQYXJ0aXRpb25pbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdExpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lckV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUxpbmVUcmFja2VyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuQWJvdXRUb0JlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kby5TdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLQotLyoqCi0gKiBUaGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2Ygc3RydWN0dXJlZCBkb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIEJhc2ljU3RydWN0dXJlZERvY3VtZW50IGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudCwgSURvY3VtZW50RXh0ZW5zaW9uLCBJRG9jdW1lbnRFeHRlbnNpb24zLCBJRG9jdW1lbnRFeHRlbnNpb240LCBDaGFyU2VxdWVuY2UsIElSZWdpb25Db21wYXJpYmxlIHsKLQotCS8qKgotCSAqIFRoaXMgVGhyZWFkTG9jYWwgY29uc3RydWN0IGlzIHVzZWQgc28gZWFjaCB0aHJlYWQgY2FuIG1haW50YWluIGl0cyBvbmx5Ci0JICogcG9pbnRlciB0byB0aGUgZG91YmxlIGxpbmtlZCBsaXN0IHRoYXQgbWFuYWdlcyB0aGUgZG9jdW1lbnRzIHJlZ2lvbnMuCi0JICogVGhlIG9ubHkgdGhpbmcgd2UgImdhdXJkIiBmb3IgaXMgdGhhdCBhIHByZXZpb3VzbHkgY2FjaGVkIHJlZ2lvbiBoYXMKLQkgKiBiZWVuIGRlbGV0ZWQuCi0JICogCi0JICogVGhlIG9iamVjdCB0aGF0IGlzIGtlcHQgaW4gdGhlIHRocmVhZCBsb2NhbCdzIG1hcCwgaXMganVzdCBhIHBvaW50ZXIgdG8KLQkgKiBhbiBhcnJheSBwb3NpdGlvbi4gVGhhdCdzIGJlY2F1c2UgdGhlIG9iamVjdCB0aGVyZSBuZWVkcyB0byBiZSAiZnJlZSIKLQkgKiBmcm9tIHJlZmVyZW5jZXMgdG8gb3RoZXIgb2JqZWN0cywgb3IgaXQgd2lsbCBub3QgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDdXJyZW50RG9jdW1lbnRSZWdpb25DYWNoZSB7Ci0JCS8vIEknbSBhc3N1bWluZyBmb3Igbm93IHRoZXJlIHdvdWxkIG5ldmVyIGJlIHNvIG1hbnkgdGhyZWFkcyB0aGF0Ci0JCS8vIHRoaXMgYXJyYXlMaXN0IG5lZWRzIHRvIGJlIGJvdW5kZWQsIG9yICdjbGVhbmVkIHVwJy4KLQkJLy8gdGhpcyBhc3N1bXB0aW9uIHNob3VsZCBiZSB0ZXN0ZWQgaW4gcHJhY3RpY2UgYW5kIGxvbmcgcnVubmluZwotCQkvLyBqb2JzIC0tIGZvdW5kIG5vdCB0byBiZSBhIGdvb2QgYXNzdW1wdGlvbi4gU2VlIGJlbG93LgotCQlwcml2YXRlIExpc3QgY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheSA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IEFycmF5TGlzdCgpKTsKLQkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfU0laRSA9IDUwOwotCi0KLQkJcHJpdmF0ZSBUaHJlYWRMb2NhbCB0aHJlYWRMb2NhbENhY2hlUG9zaXRpb24gPSBuZXcgVGhyZWFkTG9jYWwoKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldCgpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJCWludCBwb3MgPSBnZXRUaHJlYWRMb2NhbFBvc2l0aW9uKCk7Ci0JCQl0cnkgewotCQkJCXJlZ2lvbiA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBjYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LmdldChwb3MpOwotCQkJfQotCQkJY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCS8vIGV2ZW4gdGhvdWdoIHRoZSBjYWNoZWRSZWdpb25Qb3NpdGlvbiBpcyBzeW5jaHJvbml6ZWQsCi0JCQkJLy8gdGhhdCBqdXN0IG1lYW5zIGVhY2ggYWNjZXNzIGlzIHN5bmNyb25pemVkLCBpdHMKLQkJCQkvLyBzdGlsbCBwb3NzaWJsZSBmb3IgYW5vdGhlciB0aHJlYWQgdG8gY2F1c2UgaXQgdG8KLQkJCQkvLyBiZSBjbGVhcmVkLCBhZnRlciB0aGlzIHRocmVhZCBnZXRzIGl0IHBvc2l0aW9uLgotCQkJCS8vIFNvLCBpZiB0aGF0IGhhcHBlbnMsIGFsbCB3ZSBjYW4gZG8gaXMgcmVzZXQgdG8gYmVnaW5uaW5nLgotCQkJCS8vIFRoaXMgc2hvdWxkIGJlIGV4dHJlbWVseSByYXJlIChpbiBvdGhlciB3b3JkcywgcHJvYmFibHkKLQkJCQkvLyBub3Qgd29ydGggdXNpbmcgc3luY2hyb25pemVkIGJsb2NrcwotCQkJCS8vIHRvIGFjY2VzcyBjYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LgotCQkJCXJlaW5pdFRocmVhZExvY2FsUG9zaXRpb24oKTsKLQkJCQlyZXNldFRvSW5pdGlhbFN0YXRlKCk7Ci0JCQl9Ci0JCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQlyZWdpb24gPSByZXNldFRvSW5pdGlhbFN0YXRlKCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkvLyByZWdpb24gbm90IG51bGwKLQkJCWlmIChyZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCQlyZWdpb24gPSByZXNldFRvSW5pdGlhbFN0YXRlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVnaW9uOwotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgZ2V0VGhyZWFkTG9jYWxQb3NpdGlvbigpIHsKLQkJCU9iamVjdCB0aHJlYWRMb2NhbE9iamVjdCA9IHRocmVhZExvY2FsQ2FjaGVQb3NpdGlvbi5nZXQoKTsKLQkJCWludCBwb3MgPSAtMTsKLQkJCWlmICh0aHJlYWRMb2NhbE9iamVjdCA9PSBudWxsKSB7Ci0KLQkJCQlwb3MgPSByZWluaXRUaHJlYWRMb2NhbFBvc2l0aW9uKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwb3MgPSAoKEludGVnZXIpIHRocmVhZExvY2FsT2JqZWN0KS5pbnRWYWx1ZSgpOwotCQkJfQotCQkJcmV0dXJuIHBvczsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIGludCByZWluaXRUaHJlYWRMb2NhbFBvc2l0aW9uKCkgewotCQkJSW50ZWdlciBwb3NpdGlvbjsKLQkJCWludCBwb3M7Ci0JCQkvLyBUT0RPX2Z1dHVyZTogdGhpbmsgb2YgYSBiZXR0ZXIgc29sdXRpb24gdGhhdCBkb2Vzbid0Ci0JCQkvLyByZXF1aXJlIHRoaXMga2x1ZGdlLiBUaGlzIGlzIGVzcGVjaWFsbHkgcmVxdWlyZWQgYmVjYXVzZQotCQkJLy8gc29tZSBpbmZyYXN0dXJlLCBzdWNoIGFzIHJlY29uY2lsZXIsIGFjdHVhbGx5IG51bGwgb3V0Ci0JCQkvLyB0aGVpciB0aHJlYWQgb2JqZWN0IGFuZCByZWNyZWF0ZSBpdCwgNTAwIG1zZWNzIGxhdGVyCi0JCQkvLyAoYXBwcm94aW1hdGVseSkuCi0JCQkvLyBOb3RlOiB0aGUgbGlrZWx5IHNvbHV0aW9uIGluIGZ1dHVyZSBpcyB0byBjbGVhciBhZnRlciBldmVyeQotCQkJLy8gaGVhdnkgdXNlIG9mIGdldENhY2hlZFJlZ2lvbiwgc3VjaCBhcyBpbiBjcmVhdGluZyBub2RlCi0JCQkvLyBsaXN0cywgb3IgcmVwYXJzaW5nIG9yIHBhcnRpb25pbmcuCi0JCQlpZiAoY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheS5zaXplKCkgPiBNQVhfU0laRSkgewotCQkJCWNhY2hlZFJlZ2lvblBvc2l0aW9uQXJyYXkuY2xlYXIoKTsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJjYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5IGNsZWFyZWQgYXQgc2l6ZSAiICsgTUFYX1NJWkUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJcG9zaXRpb24gPSBuZXcgSW50ZWdlcihjYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LnNpemUoKSk7Ci0JCQl0aHJlYWRMb2NhbENhY2hlUG9zaXRpb24uc2V0KHBvc2l0aW9uKTsKLQkJCWNhY2hlZFJlZ2lvblBvc2l0aW9uQXJyYXkuYWRkKHBvc2l0aW9uLmludFZhbHVlKCksIG51bGwpOwotCQkJcG9zID0gcG9zaXRpb24uaW50VmFsdWUoKTsKLQkJCXJldHVybiBwb3M7Ci0JCX0KLQotCQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzZXRUb0luaXRpYWxTdGF0ZSgpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uOwotCQkJcmVnaW9uID0gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCXNldChyZWdpb24pOwotCQkJcmV0dXJuIHJlZ2lvbjsKLQkJfQotCi0JCXZvaWQgc2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCQl0cnkgewotCQkJCWludCBwb3MgPSBnZXRUaHJlYWRMb2NhbFBvc2l0aW9uKCk7Ci0JCQkJY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheS5zZXQocG9zLCByZWdpb24pOwotCQkJfQotCQkJY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCS8vIGV2ZW4gdGhvdWdoIHRoZSBjYWNoZWRSZWdpb25Qb3NpdGlvbiBpcyBzeW5jaHJvbml6ZWQsCi0JCQkJLy8gdGhhdCBqdXN0IG1lYW5zIGVhY2ggYWNjZXNzIGlzIHN5bmNyb25pemVkLCBpdHMKLQkJCQkvLyBzdGlsbCBwb3NzaWJsZSBmb3IgYW5vdGhlciB0aHJlYWQgdG8gY2F1c2UgaXQgdG8KLQkJCQkvLyBiZSBjbGVhcmVkLCBhZnRlciB0aGlzIHRocmVhZCBnZXRzIGl0IHBvc2l0aW9uLgotCQkJCS8vIFNvLCBpZiB0aGF0IGhhcHBlbnMsIGFsbCB3ZSBjYW4gZG8gaXMgcmVzZXQgdG8gYmVnaW5uaW5nLgotCQkJCS8vIFRoaXMgc2hvdWxkIGJlIGV4dHJlbWVseSByYXJlIChpbiBvdGhlciB3b3JkcywgcHJvYmFibHkKLQkJCQkvLyBub3Qgd29ydGggdXNpbmcgc3luY2hyb25pemVkIGJsb2NrcwotCQkJCS8vIHRvIGFjY2VzcyBjYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LgotCQkJCXJlaW5pdFRocmVhZExvY2FsUG9zaXRpb24oKTsKLQkJCQlyZXNldFRvSW5pdGlhbFN0YXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIE51bGxEb2N1bWVudEV2ZW50IGlzIHVzZWQgdG8gY29tcGxldGUgdGhlICJhYm91dFRvQ2hhbmdlIiBhbmQKLQkgKiAiY2hhbmdlZCIgY3ljbGUsIHdoZW4gaW4gZmFjdCB0aGUgb3JpZ2luYWwgY2hhbmdlIGlzIG5vIGxvbmdlciB2YWxpZC4KLQkgKiBUaGUgb25seSBrbm93biAodmFsaWQpIGNhc2Ugb2YgdGhpcyBpcyB3aGVuIGEgbW9kZWwgcmUtaW5pdGlhbGl6ZSB0YWtlcwotCSAqIHBsYWNlLCB3aGljaCBjYXVzZXMgc2V0VGV4dCB0byBiZSBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZiBzb21lIHByZXZpb3VzCi0JICogY2hhbmdlLiBbVGhpcyBhcmNoaXRlY3R1cmUgd2lsbCBiZSBpbXByb3ZlZCBpbiBmdXR1cmVdLgotCSAqLwotCXB1YmxpYyBjbGFzcyBOdWxsRG9jdW1lbnRFdmVudCBleHRlbmRzIERvY3VtZW50RXZlbnQgewotCQlwdWJsaWMgTnVsbERvY3VtZW50RXZlbnQoKSB7Ci0JCQl0aGlzKEJhc2ljU3RydWN0dXJlZERvY3VtZW50LnRoaXMsIDAsIDAsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHJpdmF0ZSBOdWxsRG9jdW1lbnRFdmVudChJRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQkJc3VwZXIoZG9jLCBvZmZzZXQsIGxlbmd0aCwgdGV4dCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUmVnaXN0ZXJlZFJlcGxhY2UgewotCQkvKiogVGhlIG93bmVyIG9mIHRoaXMgcmVwbGFjZSBvcGVyYXRpb24uICovCi0JCUlEb2N1bWVudExpc3RlbmVyIGZPd25lcjsKLQkJLyoqIFRoZSByZXBsYWNlIG9wZXJhdGlvbiAqLwotCQlJRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UgZlJlcGxhY2U7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgYnVuZGxlIG9iamVjdC4KLQkJICogCi0JCSAqIEBwYXJhbSBvd25lcgotCQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBsaXN0ZW5lciBvd25pbmcgdGhlIHJlcGxhY2Ugb3BlcmF0aW9uCi0JCSAqIEBwYXJhbSByZXBsYWNlCi0JCSAqICAgICAgICAgICAgdGhlIHJlcGxhY2Ugb3BlcmF0aW9uCi0JCSAqLwotCQlSZWdpc3RlcmVkUmVwbGFjZShJRG9jdW1lbnRMaXN0ZW5lciBvd25lciwgSURvY3VtZW50RXh0ZW5zaW9uLklSZXBsYWNlIHJlcGxhY2UpIHsKLQkJCWZPd25lciA9IG93bmVyOwotCQkJZlJlcGxhY2UgPSByZXBsYWNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogdGhlc2UgY29udHJvbCB2YXJpYWJsZSBpc24ndCBtYXJrIGFzICdmaW5hbCcgc2luY2UgdGhlcmUncyBzb21lIHVuaXQKLQkgKiB0ZXN0cyB0aGF0IG1hbmlwdWxhdGUgaXQuIEZvciBmaW5hbCBwcm9kdWN0LCBpdCBzaG91bGQgYmUuCi0JICovCi0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIFVTRV9MT0NBTF9USFJFQUQgPSB0cnVlOwotCi0JLyoqCi0JICogcHVyZWx5IGZvciBkZWJ1Z2dpbmcvcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzIEluIHByYWN0aWNlLCB3b3VsZCBhbHdheXMKLQkgKiBiZSAndHJ1ZScuIChhbmQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBieSBjYWxsZWQgYnkgY2xpZW50cykuIEl0cyBub3QKLQkgKiAnZmluYWwnIG9yIHByaXZhdGUganVzdCBzbyBpdCBjYW4gYmUgdmFyaWVkIGR1cmluZwotCSAqIGRlYnVnZ2luZy9wZXJmb3JtYW5jZSBtZWFzdXJlbWVudCBydW5zLgotCSAqIAotCSAqIEBwYXJhbSB1c2VfbG9jYWxfdGhyZWFkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFVTRV9MT0NBTF9USFJFQUQoZmluYWwgYm9vbGVhbiB1c2VfbG9jYWxfdGhyZWFkKSB7Ci0JCVVTRV9MT0NBTF9USFJFQUQgPSB1c2VfbG9jYWxfdGhyZWFkOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjYWNoZWREb2N1bWVudFJlZ2lvbjsKLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG87Ci0JcHJpdmF0ZSBib29sZWFuIGZBY2NlcHRQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZXMgPSB0cnVlOwotCXByaXZhdGUgQ3VycmVudERvY3VtZW50UmVnaW9uQ2FjaGUgZkN1cnJlbnREb2N1bWVudFJlZ2lvbkNhY2hlOwotCXByaXZhdGUgRG9jdW1lbnRFdmVudCBmRG9jdW1lbnRFdmVudDsKLQlwcml2YXRlIElEb2N1bWVudExpc3RlbmVyW10gZkRvY3VtZW50TGlzdGVuZXJzOwotCi0JLyoqCi0JICogVGhlIHJlZ2lzdGVyZWQgZG9jdW1lbnQgcGFydGl0aW9uZXJzLgotCSAqLwotCXByaXZhdGUgTWFwIGZEb2N1bWVudFBhcnRpdGlvbmVyczsKLQkvKiogVGhlIHJlZ2lzdGVyZWQgZG9jdW1lbnQgcGFydGl0aW9uaW5nIGxpc3RlbmVycyAqLwotCXByaXZhdGUgTGlzdCBmRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcnM7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0RG9jdW1lbnRSZWdpb247Ci0JcHJpdmF0ZSBSZWdpb25QYXJzZXIgZlBhcnNlcjsKLQlwcml2YXRlIEdlbmVyaWNQb3NpdGlvbk1hbmFnZXIgZlBvc2l0aW9uTWFuYWdlcjsKLQlwcml2YXRlIExpc3QgZlBvc3ROb3RpZmljYXRpb25DaGFuZ2VzOwotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXJbXSBmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyczsKLQlwcml2YXRlIGludCBmUmVlbnRyYW5jZUNvdW50ID0gMDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIGZSZVBhcnNlcjsKLQlwcml2YXRlIGludCBmU3RvcHBlZENvdW50ID0gMDsKLQotCXByaXZhdGUgSVRleHRTdG9yZSBmU3RvcmU7Ci0JcHJpdmF0ZSBPYmplY3RbXSBmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyczsKLQlwcml2YXRlIE9iamVjdFtdIGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzOwotCXByaXZhdGUgT2JqZWN0W10gZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBMaXN0IGZEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBJTGluZVRyYWNrZXIgZlRyYWNrZXI7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciBmVW5kb01hbmFnZXI7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3REb2N1bWVudFJlZ2lvbjsKLQotCXByaXZhdGUgYnl0ZVtdIGxpc3RlbmVyTG9jayA9IG5ldyBieXRlWzBdOwotCXByaXZhdGUgTnVsbERvY3VtZW50RXZlbnQgTlVMTF9ET0NVTUVOVF9FVkVOVDsKLQotCS8qKgotCSAqIFRoZW9yZXRpY2FsbHksIGEgZG9jdW1lbnQgY2FuIGNvbnRhaW4gbWl4ZWQgbGluZSBkZWxpbWl0ZXJzLCBidXQgdGhlCi0JICogdXNlcidzIHByZWZlcmVuY2UgaXMgdXN1YWxseSB0byBiZSBpbnRlcm5hbGx5IGNvbnNpc3RlbnQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZkluaXRpYWxMaW5lRGVsaW1pdGVyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX09OTFlfUkVHSU9OU19DQVRFR09SWSA9ICJfUkVBRF9PTkxZX1JFR0lPTlNfQ0FURUdPUllfIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEN1cnJlbnQgcmV3cml0ZSBzZXNzaW9uLCBvciBub25lIGlmIG5vdCBwcmVzZW50bHkgcmV3cml0aW5nLgotCSAqLwotCXByaXZhdGUgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBmQWN0aXZlUmV3cml0ZVNlc3Npb247Ci0JLyoqCi0JICogTGFzdCBtb2RpZmljYXRpb24gc3RhbXAsIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBvbiBjaGFuZ2UuCi0JICovCi0JcHJpdmF0ZSBsb25nIGZNb2RpZmljYXRpb25TdGFtcDsKLQkvKioKLQkgKiBLZWVwcyB0cmFjayBvZiBuZXh0IG1vZGlmaWNhdGlvbiBzdGFtcC4KLQkgKi8KLQlwcml2YXRlIGxvbmcgZk5leHRNb2RpZmljYXRpb25TdGFtcD0gSURvY3VtZW50RXh0ZW5zaW9uNC5VTktOT1dOX01PRElGSUNBVElPTl9TVEFNUDsKLQkvKioKLQkgKiBkZWJ1ZyB2YXJpYWJsZSBvbmx5Ci0JICogCi0JICogQHBhcmFtIHBhcnNlcgotCSAqLwotCXByaXZhdGUgbG9uZyBzdGFydFN0cmVhbVRpbWU7Ci0JLyoqCi0JICogZGVidWcgdmFyaWFibGUgb25seQotCSAqIAotCSAqIEBwYXJhbSBwYXJzZXIKLQkgKi8KLQlwcml2YXRlIGxvbmcgc3RhcnRUaW1lOwotCi0JcHVibGljIEJhc2ljU3RydWN0dXJlZERvY3VtZW50KCkgewotCQlzdXBlcigpOwotCQlmQ3VycmVudERvY3VtZW50UmVnaW9uQ2FjaGUgPSBuZXcgQ3VycmVudERvY3VtZW50UmVnaW9uQ2FjaGUoKTsKLQkJc2V0VGV4dFN0b3JlKG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUoNTAsIDMwMCkpOwotCQlzZXRMaW5lVHJhY2tlcihuZXcgRGVmYXVsdExpbmVUcmFja2VyKCkpOwotCQlOVUxMX0RPQ1VNRU5UX0VWRU5UID0gbmV3IE51bGxEb2N1bWVudEV2ZW50KCk7Ci0KLQkJaW50ZXJuYWxfYWRkUG9zaXRpb25DYXRlZ29yeShSRUFEX09OTFlfUkVHSU9OU19DQVRFR09SWSk7Ci0JCWludGVybmFsX2FkZFBvc2l0aW9uVXBkYXRlcihuZXcgRGVsZXRlRXF1YWxQb3NpdGlvblVwZGF0ZXIoUkVBRF9PTkxZX1JFR0lPTlNfQ0FURUdPUlkpKTsKLQotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIHByaW1hcnkgd2F5IHRvIGdldCBhIG5ldyBzdHJ1Y3R1cmVkRG9jdW1lbnQuIEl0cyBiZXN0IHRvCi0JICogdXNlIHRoZSBmYWN0b3J5IG1ldGhvZHMgaW4gTW9kZWxNYW5nZXIgdG8gY3JlYXRlIGEgbmV3Ci0JICogSVN0cnVjdHVyZWREb2N1bWVudCwgc2luY2UgaXQgd2lsbCBnZXQgYW5kIGluaXRpYWxpemUgdGhlIHBhcnNlcgotCSAqIGFjY29yZGluZyB0byB0aGUgZGVzaXJlZCBjb250ZW50IHR5cGUuCi0JICovCi0JcHVibGljIEJhc2ljU3RydWN0dXJlZERvY3VtZW50KFJlZ2lvblBhcnNlciBwYXJzZXIpIHsKLQkJdGhpcygpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHBhcnNlciwgIlByb2dyYW0gRXJyb3I6IElTdHJ1Y3R1cmVkRG9jdW1lbnQgY2FuIG5vdCBiZSBjcmVhdGVkIHdpdGggbnVsbCBwYXJzZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBnbyB0aHJvdWdoIHNldHRlciBpbiBjYXNlIHRoZXJlIGlzIHNpZGUgZWZmZWN0cwotCQlpbnRlcm5hbF9zZXRQYXJzZXIocGFyc2VyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2NsZWFyRG9jdW1lbnRFdmVudCgpIHsKLQkJLy8gbm8gaGFyZCBhbmQgZmFzdCByZXF1aXJlbWVudCB0byBudWxsIG91dCAuLi4ganVzdCBzZWVtcyBsaWtlCi0JCS8vIGEgZ29vZCBpZGVhLCBzaW5jZSB3ZSBhcmUgZG9uZSB3aXRoIGl0LgotCQlmRG9jdW1lbnRFdmVudCA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9maXJlRG9jdW1lbnRBYm91dFRvQ2hhbmdlKE9iamVjdFtdIGxpc3RlbmVycykgewotCQkvLyBtb3N0IERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZCBsaXN0ZW5lcnMgZG8gbm90IGFudGljaXBhdGUKLQkJLy8gRG9jdW1lbnRFdmVudCA9PSBudWxsLiBTbyBtYWtlIHN1cmUgZG9jdW1lbnRFdmVudCBpcyBub3QKLQkJLy8gbnVsbC4gKHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgeWV0IGl0IGRvZXMgc29tZXRpbWVzKQotCQlpZiAoZkRvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RXZlbnQgPSBuZXcgTnVsbERvY3VtZW50RXZlbnQoKTsKLQkJfQotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGxpc3RlbmVyczsKLQkJCS8vIE5vdGU6IHRoZSBkb2NFdmVudCBpcyBjcmVhdGVkIGluIHJlcGxhY2VUZXh0IEFQSQotCQkJLy8gZmlyZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCQkvLyBzYWZlZ3VhcmQgZnJvbSBsaXN0ZW5lcnMgdGhhdCB0aHJvdyBleGNlcHRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJLy8gdGhpcyBpcyBhIHNhZmUgY2FzdCwgc2luY2UgYWRkTGlzdG5lcnMgcmVxdWlyZXMgYQotCQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIKLQkJCQkJKChJRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkuZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKGZEb2N1bWVudEV2ZW50KTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJCX0KLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJbG9uZyBzdG9wVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuXHRcdFx0XHQgSVN0cnVjdHVyZWREb2N1bWVudDo6ZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50LiBUaW1lIHdhcyAiICsgKHN0b3BUaW1lIC0gc3RhcnRUaW1lKSArICIgbXNlY3MgdG8gZmlyZSBOZXdNb2RlbEV2ZW50IHRvIGluc3RhbmNlIG9mICIgKyBob2xkTGlzdGVuZXJzW2ldLmdldENsYXNzKCkpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlEb2N1bWVudFBhcnRpdGlvbmVyc0Fib3V0VG9DaGFuZ2UoRG9jdW1lbnRFdmVudCBkb2N1bWVudEV2ZW50KSB7Ci0JCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25lcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZSA9IGZEb2N1bWVudFBhcnRpdGlvbmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSURvY3VtZW50UGFydGl0aW9uZXIgcCA9IChJRG9jdW1lbnRQYXJ0aXRpb25lcikgZS5uZXh0KCk7Ci0JCQkJLy8gc2FmZWd1YXJkIGZyb20gbGlzdGVuZXJzIHRoYXQgdGhyb3cgZXhjZXB0aW9ucwotCQkJCXRyeSB7Ci0JCQkJCXAuZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKGRvY3VtZW50RXZlbnQpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9maXJlRG9jdW1lbnRDaGFuZ2VkKE9iamVjdFtdIGxpc3RlbmVycywgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGxpc3RlbmVyczsKLQkJCS8vIE5PVEU6IGRvY3VtZW50IGV2ZW50IGlzIGNyZWF0ZWQgaW4gcmVwbGFjZSBUZXh0IEFQSSBhbmQgc2V0VGV4dAotCQkJLy8gQVBJCi0JCQkvLyBub3cgZmlyZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQkvLyB0aGlzIGlzIGEgc2FmZSBjYXN0LCBzaW5jZSBhZGRMaXN0bmVycyByZXF1aXJlcyBhCi0JCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkvLyBOb3RlczogZkRvY3VtZW50RXZlbnQgY2FuIGJlICJzdWRkZW5seSIgbnVsbCwgaWYgb25lIG9mCi0JCQkJCS8vIHRoZQotCQkJCQkvLyBwcmV2aW91cyBjaGFuZ2VzCi0JCQkJCS8vIGNhdXNlZCBhICJzZXRUZXh0IiB0byBiZSBjYWxsZWQuIFRoZSBvbmx5IGtub3duIGNhc2Ugb2YKLQkJCQkJLy8gdGhpcwotCQkJCQkvLyBpcyBhIG1vZGVsIHJlc2V0Ci0JCQkJCS8vIGR1ZSB0byBwYWdlIGRpcmVjdGl2ZSBjaGFuZ2luZy4gRXZlbnR1YWxseSB3ZSBzaG91bGQKLQkJCQkJLy8gY2hhbmdlCi0JCQkJCS8vIGFyY2hldGVjdHVyZSB0byBoYXZlCi0JCQkJCS8vIGV2ZW50IHF1ZSBhbmQgYmUgYWJsZSB0byAiY2FuY2VsIiBwZW5kaW5nIGV2ZW50cywgYnV0Ci0JCQkJCS8vIGZvcgotCQkJCQkvLyBub3csIHdlJ2xsIGp1c3QgcGFzcyBhCi0JCQkJCS8vIE51bGxEb2N1bWVudEV2ZW50LiBCeSB0aGUgd2F5LCBpdCBpcyBpbXBvcnRhbnQgdG8gc2VuZAotCQkJCQkvLyBzb21ldGhpbmcsIHNpbmNlIGNsaWVudHMgbWlnaHQKLQkJCQkJLy8gaGF2ZSBpbmRldGVybWluYW50IHN0YXRlIGR1ZSB0byAiYWJvdXRUb0NoYW5nZSIgYmVpbmcKLQkJCQkJLy8gc2VudAotCQkJCQkvLyBlYXJsaWVyLgotCQkJCQlpZiAoZkRvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJCQkJKChJRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkuZG9jdW1lbnRDaGFuZ2VkKE5VTExfRE9DVU1FTlRfRVZFTlQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJKChJRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkuZG9jdW1lbnRDaGFuZ2VkKGZEb2N1bWVudEV2ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBJU3RydWN0dXJlZERvY3VtZW50OjpmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQuIFRpbWUgd2FzICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiBtc2VjcyB0byBmaXJlIE5ld01vZGVsRXZlbnQgdG8gaW5zdGFuY2Ugb2YgIiArIGhvbGRMaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeURvY3VtZW50UGFydGl0aW9uZXJzRG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZG9jdW1lbnRFdmVudCkgewotCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGUgPSBmRG9jdW1lbnRQYXJ0aXRpb25lcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCUlEb2N1bWVudFBhcnRpdGlvbmVyIHAgPSAoSURvY3VtZW50UGFydGl0aW9uZXIpIGUubmV4dCgpOwotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQlpZiAocCBpbnN0YW5jZW9mIElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uKSB7Ci0JCQkJCQkvLyBJUmVnaW9uIGNoYW5nZWRQYXJ0aW9uID0KLQkJCQkJCSgoSURvY3VtZW50UGFydGl0aW9uZXJFeHRlbnNpb24pIHApLmRvY3VtZW50Q2hhbmdlZDIoZG9jdW1lbnRFdmVudCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlwLmRvY3VtZW50Q2hhbmdlZChkb2N1bWVudEV2ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgX2ZpcmVFdmVudChPYmplY3RbXSBsaXN0ZW5lcnMsIE5vQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJfQotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQkvLyB0aGlzIGlzIGEgc2FmZSBjYXN0LCBzaW5jZSBhZGRMaXN0bmVycyByZXF1aXJlcyBhCi0JCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkubm9DaGFuZ2UoZXZlbnQpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBJU3RydWN0dXJlZERvY3VtZW50OjpmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQuIFRpbWUgd2FzICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiBtc2VjcyB0byBmaXJlIE5ld01vZGVsRXZlbnQgdG8gaW5zdGFuY2Ugb2YgIiArIGhvbGRMaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9maXJlRXZlbnQoT2JqZWN0W10gbGlzdGVuZXJzLCBSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJfQotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQkvLyB0aGlzIGlzIGEgc2FmZSBjYXN0LCBzaW5jZSBhZGRMaXN0bmVycyByZXF1aXJlcyBhCi0JCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkucmVnaW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCWxvbmcgc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4gVGltZSB3YXMgIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIG1zZWNzIHRvIGZpcmUgTmV3TW9kZWxFdmVudCB0byBpbnN0YW5jZSBvZiAiICsgaG9sZExpc3RlbmVyc1tpXS5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2ZpcmVFdmVudChPYmplY3RbXSBsaXN0ZW5lcnMsIFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCQkvLyBzYWZlZ3VhcmQgZnJvbSBsaXN0ZW5lcnMgdGhhdCB0aHJvdyBleGNlcHRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJLy8gdGhpcyBpcyBhIHNhZmUgY2FzdCwgc2luY2UgYWRkTGlzdG5lcnMgcmVxdWlyZXMgYQotCQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIKLQkJCQkJKChJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLnJlZ2lvbnNSZXBsYWNlZChldmVudCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCWxvbmcgc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4gVGltZSB3YXMgIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIG1zZWNzIHRvIGZpcmUgTmV3TW9kZWxFdmVudCB0byBpbnN0YW5jZSBvZiAiICsgaG9sZExpc3RlbmVyc1tpXS5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2ZpcmVFdmVudChPYmplY3RbXSBsaXN0ZW5lcnMsIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCQkvLyBzYWZlZ3VhcmQgZnJvbSBsaXN0ZW5lcnMgdGhhdCB0aHJvdyBleGNlcHRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJLy8gdGhpcyBpcyBhIHNhZmUgY2FzdCwgc2luY2UgYWRkTGlzdG5lcnMgcmVxdWlyZXMgYQotCQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIKLQkJCQkJKChJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLm5vZGVzUmVwbGFjZWQoZXZlbnQpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBJU3RydWN0dXJlZERvY3VtZW50OjpmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQuIFRpbWUgd2FzICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiBtc2VjcyB0byBmaXJlIE5ld01vZGVsRXZlbnQgdG8gaW5zdGFuY2Ugb2YgIiArIGhvbGRMaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9maXJlU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZShPYmplY3RbXSBsaXN0ZW5lcnMpIHsKLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQkvLyBOb3RlOiB0aGUgZG9jRXZlbnQgaXMgY3JlYXRlZCBpbiByZXBsYWNlVGV4dCBBUEkKLQkJCS8vIGZpcmUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl9Ci0JCQkJLy8gc2FmZWd1YXJkIGZyb20gbGlzdGVuZXJzIHRoYXQgdGhyb3cgZXhjZXB0aW9ucwotCQkJCXRyeSB7Ci0JCQkJCS8vIG5vdGljZSB0aGUgQWJvdXRUb0JlQ2hhbmdlZEV2ZW50IGlzIGNyZWF0ZWQgZnJvbSB0aGUKLQkJCQkJLy8gRG9jdW1lbnRFdmVudCwgc2luY2UgaXQgaXMgKG5lYXJseSkKLQkJCQkJLy8gdGhlIHNhbWUgaW5mb3JtYXRpb24uID9XaGF0IHRvIGRvIGFib3V0Ci0JCQkJCS8vIG9yaWdpbmFsUmVxdWVzdGVyPwotCQkJCQlpZiAoZkRvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZkRvY3VtZW50RXZlbnQgPSBuZXcgTnVsbERvY3VtZW50RXZlbnQoKTsKLQkJCQkJfQotCQkJCQlBYm91dFRvQmVDaGFuZ2VkRXZlbnQgYWJvdXRUb0JlQ2hhbmdlZEV2ZW50ID0gbmV3IEFib3V0VG9CZUNoYW5nZWRFdmVudCh0aGlzLCBudWxsLCBmRG9jdW1lbnRFdmVudC5nZXRUZXh0KCksIGZEb2N1bWVudEV2ZW50LmdldE9mZnNldCgpLCBmRG9jdW1lbnRFdmVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJCS8vIHRoaXMgaXMgYSBzYWZlIGNhc3QsIHNpbmNlIGFkZExpc3RuZXJzIHJlcXVpcmVzIGEKLQkJCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyCi0JCQkJCSgoSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5tb2RlbEFib3V0VG9CZUNoYW5nZWQoYWJvdXRUb0JlQ2hhbmdlZEV2ZW50KTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJCX0KLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJbG9uZyBzdG9wVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuXHRcdFx0XHQgSVN0cnVjdHVyZWREb2N1bWVudDo6ZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50LiBUaW1lIHdhcyAiICsgKHN0b3BUaW1lIC0gc3RhcnRUaW1lKSArICIgbXNlY3MgdG8gZmlyZSBOZXdNb2RlbEV2ZW50IHRvIGluc3RhbmNlIG9mICIgKyBob2xkTGlzdGVuZXJzW2ldLmdldENsYXNzKCkpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFjcXVpcmVMb2NrKCkgewotCQkvLyBkbyBub3RoaW5nIGhlcmUgaW4gc3VwZXIgY2xhc3MKLQl9Ci0KLQkvKioKLQkgKiBhZGRNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJLy8gbWFrZSBzdXJlIGxpc3RlbmVyIGlzIG5vdCBhbHJlYWR5IGluIGxpc3RlbmluZwotCQkJLy8gKGFuZCBpZiBpdCBpcywgcHJpbnQgYSB3YXJuaW5nIHRvIGFpZCBkZWJ1Z2dpbmcsIGlmIG5lZWRlZCkKLQkJCWlmICghVXRpbGl0aWVzLmNvbnRhaW5zKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQlpbnQgb2xkU2l6ZSA9IDA7Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJLy8gbm9ybWFsbHkgd29uJ3QgYmUgbnVsbCwgYnV0IHdlIG5lZWQgdG8gYmUgc3VyZSwgZm9yCi0JCQkJCS8vIGZpcnN0Ci0JCQkJCS8vIHRpbWUgdGhyb3VnaAotCQkJCQlvbGRTaXplID0gZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCX0KLQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgKyAxOwotCQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycywgMCwgbmV3TGlzdGVuZXJzLCAwLCBvbGRTaXplKTsKLQkJCQl9Ci0JCQkJLy8gYWRkIGxpc3RlbmVyIHRvIGxhc3QgcG9zaXRpb24KLQkJCQluZXdMaXN0ZW5lcnNbbmV3U2l6ZSAtIDFdID0gbGlzdGVuZXI7Ci0JCQkJLy8KLQkJCQkvLyBub3cgc3dpdGNoIG5ldyBmb3Igb2xkCi0JCQkJZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0bmVycyBhbmQgTW9kZWxDaGFnbmVkTGlzdGVuZXJzIGFyZSB2ZXJ5Ci0JICogc2ltaWxhci4gVGhleSBib3RoIHJlY2VpdmUgaWRlbnRpY2FsIGV2ZW50cy4gVGhlIGRpZmZlcmVuY2UgaXMgdGhlCi0JICogdGltaW5nLiBUaGUgInB1cmUiIFN0cnVjdHVyZWREb2N1bWVudExpc3RuZXJzIGFyZSBub3RpZmllZCBhZnRlciB0aGUKLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaGFzIGJlZW4gY2hhbmdlZCwgYnV0IGJlZm9yZSBvdGhlciwgcmVsYXRlZCBtb2RlbHMKLQkgKiBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgc3VjaCBhcyB0aGUgU3RydWN0dXJhbCBNb2RlbC4gVGhlIFN0cnVjdHVyYWwKLQkgKiBtb2RlbCBpcyBpbiBmYWN0IGl0c2VsZiBhICJwdXJlIiBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0bmVyLiBUaGUKLQkgKiBNb2RlbENoYW5nZWRMaXN0ZW5lcnMgY2FuIHJlc3QgYXNzdXJlZCB0aGF0IGFsbCBtb2RlbHMgYW5kIGRhdGEgaGF2ZQotCSAqIGJlZW4gdXBkYXRlZCBmcm9tIHRoZSBjaGFuZ2UgYnkgdGhlIHRpZW0gdGhleSBhcmUgbm90aWZpZWQuIFRoaXMgaXMKLQkgKiBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgdGhlIHRleHQgd2lkZ2V0LCBmb3IgZXhhbXBsZSwgd2hpY2ggbWF5IHJlbHkKLQkgKiBvbiBib3RoIHN0cnVjdHVyZWREb2N1bWVudCBhbmQgc3RydWN0dXJhbCBtb2RlbCBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJJU3RydWN0dXJlZERvY3VtZW50OjphZGRNb2RlbENoYW5nZWRMaXN0ZW5lci4gUmVxdWVzdCB0byBhZGQgYW4gaW5zdGFuY2Ugb2YgIiArIGxpc3RlbmVyLmdldENsYXNzKCkgKyAiIGFzIGEgbGlzdGVuZXIgb24gc3RydWN0dXJlZERvY3VtZW50LiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy8gbWFrZSBzdXJlIGxpc3RlbmVyIGlzIG5vdCBhbHJlYWR5IGluIGxpc3RlbmluZwotCQkJLy8gKGFuZCBpZiBpdCBpcywgcHJpbnQgYSB3YXJuaW5nIHRvIGFpZCBkZWJ1Z2dpbmcsIGlmIG5lZWRlZCkKLQkJCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJJU3RydWN0dXJlZERvY3VtZW50OjphZGRNb2RlbENoYW5nZWRMaXN0ZW5lci4gbGlzdGVuZXIgIiArIGxpc3RlbmVyICsgIiB3YXMgYWRkZWRlZCBtb3JlIHRoYW4gb25jZS4gIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSVN0cnVjdHVyZWREb2N1bWVudDo6YWRkTW9kZWxDaGFuZ2VkTGlzdGVuZXIuIEFkZGluZyBhbiBpbnN0YW5jZSBvZiAiICsgbGlzdGVuZXIuZ2V0Q2xhc3MoKSArICIgYXMgYSBsaXN0ZW5lciBvbiBzdHJ1Y3R1cmVkRG9jdW1lbnQuIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWludCBvbGRTaXplID0gMDsKLQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQkvLyBub3JtYWxseSB3b24ndCBiZSBudWxsLCBidXQgd2UgbmVlZCB0byBiZSBzdXJlLCBmb3IKLQkJCQkJLy8gZmlyc3QKLQkJCQkJLy8gdGltZSB0aHJvdWdoCi0JCQkJCW9sZFNpemUgPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycy5sZW5ndGg7Ci0JCQkJfQotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSArIDE7Ci0JCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQkJCX0KLQkJCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJCQkvLwotCQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCQkvLwotCQkJCS8vIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZCwKLQkJCQkvLyBzZW5kIHRoZSBuZXcgbW9kZWwgZXZlbnQgdG8gdGhhdCBvbmUgcGFydGljdWxhciBsaXN0ZW5lciwKLQkJCQkvLyBzbyBpdAotCQkJCS8vIGNhbiBpbml0aWFsaXplIGl0c2VsZiB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtb2RlbAotCQkJCS8vIGxpc3RlbmVyLm5ld01vZGVsKG5ldyBOZXdNb2RlbEV2ZW50KHRoaXMsIGxpc3RlbmVyKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSVN0cnVjdHVyZWREb2N1bWVudDo6YWRkU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIuIFJlcXVlc3QgdG8gYWRkIGFuIGluc3RhbmNlIG9mICIgKyBsaXN0ZW5lci5nZXRDbGFzcygpICsgIiBhcyBhIGxpc3RlbmVyIG9uIHN0cnVjdHVyZWREb2N1bWVudC4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIG1ha2Ugc3VyZSBsaXN0ZW5lciBpcyBub3QgYWxyZWFkeSBpbiBsaXN0ZW5pbmcKLQkJCS8vIChhbmQgaWYgaXQgaXMsIHByaW50IGEgd2FybmluZyB0byBhaWQgZGVidWdnaW5nLCBpZiBuZWVkZWQpCi0JCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmFkZFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLiBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHdhcyBhZGRlZGVkIG1vcmUgdGhhbiBvbmNlLiAiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJJU3RydWN0dXJlZERvY3VtZW50OjphZGRTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lci4gQWRkaW5nIGFuIGluc3RhbmNlIG9mICIgKyBsaXN0ZW5lci5nZXRDbGFzcygpICsgIiBhcyBhIGxpc3RlbmVyIG9uIHN0cnVjdHVyZWREb2N1bWVudC4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaW50IG9sZFNpemUgPSAwOwotCQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQkvLyBub3JtYWxseSB3b24ndCBiZSBudWxsLCBidXQgd2UgbmVlZCB0byBiZSBzdXJlLCBmb3IKLQkJCQkJLy8gZmlyc3QKLQkJCQkJLy8gdGltZSB0aHJvdWdoCi0JCQkJCW9sZFNpemUgPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCX0KLQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgKyAxOwotCQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQkJCX0KLQkJCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJCQkvLwotCQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJLy8KLQkJCQkvLyB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQsCi0JCQkJLy8gc2VuZCB0aGUgbmV3IG1vZGVsIGV2ZW50IHRvIHRoYXQgb25lIHBhcnRpY3VsYXIgbGlzdGVuZXIsCi0JCQkJLy8gc28gaXQKLQkJCQkvLyBjYW4gaW5pdGlhbGl6ZSBpdHNlbGYgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbW9kZWwKLQkJCQkvLyBsaXN0ZW5lci5uZXdNb2RlbChuZXcgTmV3TW9kZWxFdmVudCh0aGlzLCBsaXN0ZW5lcikpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogV2UgbWFuYWdlIG91ciBvd24gZG9jdW1lbnQgbGlzdG5lcnMsIGluc3RlYWQgb2YgZGVsZWdhdGluZyB0byBvdXIKLQkgKiBwYXJlbnREb2N1bWVudCwgc28gd2UgY2FuIGZpcmUgYXQgdmVyeSBlbmQgKGFuZCBub3Qgd2hlbiB0aGUKLQkgKiBwYXJlbnREb2N1bWVudCBjaGFuZ2VzKS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBsaXN0ZW5lciBpcyBub3QgYWxyZWFkeSBpbiBsaXN0ZW5pbmcKLQkJCS8vIChhbmQgaWYgaXQgaXMsIHByaW50IGEgd2FybmluZyB0byBhaWQgZGVidWdnaW5nLCBpZiBuZWVkZWQpCi0JCQlpZiAoIVV0aWxpdGllcy5jb250YWlucyhmRG9jdW1lbnRMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCWludCBvbGRTaXplID0gMDsKLQkJCQlpZiAoZkRvY3VtZW50TGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJLy8gbm9ybWFsbHkgd29uJ3QgYmUgbnVsbCwgYnV0IHdlIG5lZWQgdG8gYmUgc3VyZSwgZm9yCi0JCQkJCS8vIGZpcnN0Ci0JCQkJCS8vIHRpbWUgdGhyb3VnaAotCQkJCQlvbGRTaXplID0gZkRvY3VtZW50TGlzdGVuZXJzLmxlbmd0aDsKLQkJCQl9Ci0JCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCQlJRG9jdW1lbnRMaXN0ZW5lcltdIG5ld0xpc3RlbmVycyA9IG51bGw7Ci0JCQkJbmV3TGlzdGVuZXJzID0gbmV3IElEb2N1bWVudExpc3RlbmVyW25ld1NpemVdOwotCQkJCWlmIChmRG9jdW1lbnRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZEb2N1bWVudExpc3RlbmVycywgMCwgbmV3TGlzdGVuZXJzLCAwLCBvbGRTaXplKTsKLQkJCQl9Ci0JCQkJLy8gYWRkIGxpc3RlbmVyIHRvIGxhc3QgcG9zaXRpb24KLQkJCQluZXdMaXN0ZW5lcnNbbmV3U2l6ZSAtIDFdID0gbGlzdGVuZXI7Ci0JCQkJLy8gbm93IHN3aXRjaCBuZXcgZm9yIG9sZAotCQkJCWZEb2N1bWVudExpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNhZGREb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIpCi0JICogCi0JICogUmVnaXN0ZXJzIHRoZSBkb2N1bWVudCBwYXJ0aXRpb25pbmcgbGlzdGVuZXIgd2l0aCB0aGUgZG9jdW1lbnQuIEFmdGVyCi0JICogcmVnaXN0cmF0aW9uIHRoZSBJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lciBpcyBpbmZvcm1lZCBhYm91dCBlYWNoCi0JICogcGFydGl0aW9uIGNoYW5nZSBjYXVzZSBieSBhIGRvY3VtZW50IG1hbmlwdWxhdGlvbi4gSWYgYSBkb2N1bWVudAotCSAqIHBhcnRpdGlvbmluZyBsaXN0ZW5lciBpcyBhbHNvIGEgZG9jdW1lbnQgbGlzdGVuZXIsIHRoZSBmb2xsb3dpbmcKLQkgKiBub3RpZmljYXRpb24gc2VxdWVuY2UgaXMgZ3VhcmFudGVlZCBpZiBhIGRvY3VtZW50IG1hbmlwdWxhdGlvbiBjaGFuZ2VzCi0JICogdGhlIGRvY3VtZW50IHBhcnRpdGlvbmluZzogMSkKLQkgKiBsaXN0ZW5lci5kb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCk7IDIpCi0JICogbGlzdGVuZXIuZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKCk7IDMpCi0JICogbGlzdGVuZXIuZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQpOyBJZiB0aGUgbGlzdGVuZXIgaXMgYWxyZWFkeQotCSAqIHJlZ2lzdGVyZWQgbm90aGluZyBoYXBwZW5zLgotCSAqIAotCSAqIEBzZWUgSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIKLQkgKi8KLQotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIoSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJQXNzZXJ0LmlzTm90TnVsbChsaXN0ZW5lcik7Ci0JCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCQlmRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJfQotCQkJaWYgKCFmRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQotCQkJCWZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgcG9zaXRpb24gdG8gdGhlIGRvY3VtZW50J3MgZGVmYXVsdCBwb3NpdGlvbiBjYXRlZ29yeS4gVGhlCi0JICogZGVmYXVsdCBjYXRlZ29yeSBtdXN0IGJlIHNwZWNpZmllZCBieSB0aGUgaW1wbGVtZW50ZXIuIEEgcG9zaXRpb24gdGhhdAotCSAqIGhhcyBiZWVuIGFkZGVkIHRvIGEgcG9zaXRpb24gY2F0ZWdvcnkgaXMgdXBkYXRlZCBhdCBlYWNoIGNoYW5nZSBhcHBsaWVkCi0JICogdG8gdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiBwb3NpdGlvbiBpcyBub3QgYSB2YWxpZCByYW5nZSBpbiB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvbihQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkuYWRkUG9zaXRpb24ocG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2FkZFBvc2l0aW9uCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHBvc2l0aW9uIGlzIG5vdCBhIHZhbGlkIHJhbmdlIGluIHRoZSBkb2N1bWVudAotCSAqIEBleGNlcHRpb24gQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHRoZSBjYXRlZ29yeSBpcyBub3QgZGVmaW5lZCBmb3IgdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb24oU3RyaW5nIGNhdGVnb3J5LCBQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkuYWRkUG9zaXRpb24oY2F0ZWdvcnksIHBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNhZGRQb3NpdGlvbkNhdGVnb3J5Ci0JICovCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaW50ZXJuYWxfYWRkUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjYWRkUG9zaXRpb25VcGRhdGVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlcikgewotCQlpbnRlcm5hbF9hZGRQb3NpdGlvblVwZGF0ZXIodXBkYXRlcik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gZG9jdW1lbnQgbGlzdGVuZXIgYXMgb25lIHdoaWNoIGlzIG5vdGlmaWVkIGJlZm9yZSB0aG9zZQotCSAqIGRvY3VtZW50IGxpc3RlbmVycyBhZGRlZCB3aXRoIDxjb2RlPmFkZERvY3VtZW50TGlzdGVuZXI8L2NvZGU+IGFyZQotCSAqIG5vdGlmaWVkLiBJZiB0aGUgZ2l2ZW4gbGlzdGVuZXIgaXMgYWxzbyByZWdpc3RlcmVkIHVzaW5nCi0JICogPGNvZGU+YWRkRG9jdW1lbnRMaXN0ZW5lcjwvY29kZT4gaXQgd2lsbCBiZSBub3RpZmllZCB0d2ljZS4gSWYgdGhlCi0JICogbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIG5vdGhpbmcgaGFwcGVucy4KLQkgKiA8cD4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgZm9yIHB1YmxpYyB1c2UsIGl0IG1heSBvbmx5IGJlIGNhbGxlZCBieQotCSAqIGltcGxlbWVudGVycyBvZiA8Y29kZT5JRG9jdW1lbnRBZGFwdGVyPC9jb2RlPiBhbmQgb25seSBpZiB0aG9zZQotCSAqIGltcGxlbWVudGVycyBuZWVkIHRvIGltcGxlbWVudCA8Y29kZT5JRG9jdW1lbnRMaXN0ZW5lcjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50QWRhcHRlcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIGJlIGFkZGVkIGFzIHByZW5vdGlmaWVkIGRvY3VtZW50IGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGRvY3VtZW50QWRhcHRlcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCWludCBwcmV2aW91c1NpemUgPSBmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycy5sZW5ndGg7Ci0JCQkJSURvY3VtZW50TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBuZXcgSURvY3VtZW50TGlzdGVuZXJbcHJldmlvdXNTaXplICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycywgMCwgbGlzdGVuZXJzLCAwLCBwcmV2aW91c1NpemUpOwotCQkJCWxpc3RlbmVyc1twcmV2aW91c1NpemVdID0gZG9jdW1lbnRBZGFwdGVyOwotCQkJCWZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMgPSBuZXcgSURvY3VtZW50TGlzdGVuZXJbMV07Ci0JCQkJZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnNbMF0gPSBkb2N1bWVudEFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjY2hhckF0KGludCkKLQkgKi8KLQlwdWJsaWMgY2hhciBjaGFyQXQoaW50IGFyZzApIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRDaGFyKDApOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBBUEkgcmVtb3ZlcyBhbGwgcmVhZCBvbmx5IHBvc2l0aW9ucywgYXMgc2hvdWxkIGJlIGRvbmUKLQkgKiB3ZSAnc2V0VGV4dCcgaXMgY2FsbGVkLiBOb3RlOiBhbiBhbHRlcm5hdGl2ZSBhbGdvcml0aG0gbWF5IHNpbXBseQotCSAqIHJlbW92ZSB0aGUgY2F0ZWdvcnkgKGFuZCBpdCB3b3VsZCBnZXQgYWRkZWQgYmFjayBpbiBsYXRlciwgaWYvd2hlbgotCSAqIHJlYWRvbmx5IHJlZ2lvbnMgYWRkZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFyUmVhZE9ubHkoKSB7Ci0JCVBvc2l0aW9uW10gcG9zaXRpb25zID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBvc2l0aW9ucyA9IGdldFBvc2l0aW9ucyhSRUFEX09OTFlfUkVHSU9OU19DQVRFR09SWSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigicHJvZ3JhbSBlcnJvcjogc2hvdWxkIG5ldmVyIG9jY3VyIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJUG9zaXRpb24gcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07Ci0JCQkvLyBub3RlIHdlIGRvbid0IGZpcmUgdGhlICJhYm91dCB0byBjaGFuZ2UiIG9yICJjaGFuZ2VkIiBldmVudHMsCi0JCQkvLyBzaW5jZSBwcmVzdW1hYmx5LCB0ZXh0IGlzIGFsbCBnb2luZyBhd2F5IGFuZCBiZWluZyByZXBsYWNlZAotCQkJLy8gYW55d2F5LgotCQkJcG9zaXRpb24uZGVsZXRlKCk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGNsZWFyUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCS8vIFRPRE8gRFcgSSBzdGlsbCBuZWVkIHRvIGltcGxlbWVudCBzbWFydGVyIGFsZ29yaXRobSB0aGF0Ci0JCS8vIGFkdXN0IGV4aXN0aW5nIFJPIHJlZ2lvbnMsIGlmIG5lZWRlZC4gRm9yIG5vdywgSSdsbCBqdXN0Ci0JCS8vIHJlbW92ZSBhbnkgdGhhdCBvdmVybGFwLgotCQl0cnkgewotCQkJUG9zaXRpb25bXSBwb3NpdGlvbnMgPSBnZXRQb3NpdGlvbnMoUkVBRF9PTkxZX1JFR0lPTlNfQ0FURUdPUlkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlQb3NpdGlvbiBwb3NpdGlvbiA9IHBvc2l0aW9uc1tpXTsKLQkJCQlpZiAocG9zaXRpb24ub3ZlcmxhcHNXaXRoKHN0YXJ0T2Zmc2V0LCBsZW5ndGgpKSB7Ci0JCQkJCVN0cmluZyBlZmZlY3RlZFRleHQgPSB0aGlzLmdldChzdGFydE9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJLy8gZkRvY3VtZW50RXZlbnQgPSBuZXcgRG9jdW1lbnRFdmVudCh0aGlzLCBzdGFydE9mZnNldCwKLQkJCQkJLy8gbGVuZ3RoLCBlZmZlY3RlZFRleHQpOwotCQkJCQlmaXJlUmVhZE9ubHlBYm91dFRvQmVDaGFuZ2VkKCk7Ci0JCQkJCXBvc2l0aW9uLmRlbGV0ZSgpOwotCQkJCQlOb0NoYW5nZUV2ZW50IG5vQ2hhbmdlRXZlbnQgPSBuZXcgTm9DaGFuZ2VFdmVudCh0aGlzLCBudWxsLCBlZmZlY3RlZFRleHQsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgpOwotCQkJCQlub0NoYW5nZUV2ZW50LnJlYXNvbiA9IE5vQ2hhbmdlRXZlbnQuUkVBRF9PTkxZX1NUQVRFX0NIQU5HRTsKLQkJCQkJZmlyZVJlYWRPbmx5U3RydWN0dXJlZERvY3VtZW50RXZlbnQobm9DaGFuZ2VFdmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGp1c3QgbWVhbnMgbm8gcmVhZG9ubHkgcmVnaW9ucyBiZWVuIGRlZmluZWQgeWV0Ci0JCQkvLyBzbyBub3RoaW5nIHRvIGRvLgotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGluZGV4IGF0IHdoaWNoIGEgPGNvZGU+UG9zaXRpb248L2NvZGU+IHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG9mZnNldCB3b3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBnaXZlbiBjYXRlZ29yeS4gQXMgdGhlCi0JICogb3JkZXJpbmcgaW5zaWRlIGEgY2F0ZWdvcnkgb25seSBkZXBlbmRzIG9uIHRoZSBvZmZzZXQsIHRoZSBpbmRleCBtdXN0Ci0JICogYmUgY2hvb3NlbiB0byBiZSB0aGUgZmlyc3Qgb2YgYWxsIHBvc2l0aW9ucyB3aXRoIHRoZSBzYW1lIG9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIHRoZSBjYXRlZ29yeSBpbiB3aGljaCB3b3VsZCBiZSBhZGRlZAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBvZmZzZXQgdG8gYmUgY29uc2lkZXJlZAotCSAqIEByZXR1cm4gdGhlIGluZGV4IGludG8gdGhlIGNhdGVnb3J5Ci0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIG9mZnNldCBpcyBpbnZhbGlkIGluIHRoaXMgZG9jdW1lbnQKLQkgKiBAZXhjZXB0aW9uIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBjYXRlZ29yeSBpcyB1bmRlZmluZWQgaW4gdGhpcyBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBpbnQgY29tcHV0ZUluZGV4SW5DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnksIGludCBvZmZzZXQpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0UG9zaXRpb25NYW5hZ2VyKCkuY29tcHV0ZUluZGV4SW5DYXRlZ29yeShjYXRlZ29yeSwgb2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBnaXZlbiB0ZXh0LiBGb3IgYSBnaXZlbiBpbXBsZW1lbnRlcgotCSAqIG9mIHRoaXMgaW50ZXJmYWNlIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNhbWUgcmVzdWx0IGFzCi0JICogPGNvZGU+c2V0KHRleHQpOyBnZXROdW1iZXJPZkxpbmVzKCk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCB3aG9zZSBudW1iZXIgb2YgbGluZXMgc2hvdWxkIGJlIGNvbXB1dGVkCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBnaXZlbiB0ZXh0Ci0JICovCi0JcHVibGljIGludCBjb21wdXRlTnVtYmVyT2ZMaW5lcyhTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmNvbXB1dGVOdW1iZXJPZkxpbmVzKHRleHQpOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBwYXJ0aXRpb25pbmcgb2YgdGhlIGdpdmVuIGRvY3VtZW50IHJhbmdlIHVzaW5nIHRoZQotCSAqIGRvY3VtZW50J3MgcGFydGl0aW9uZXIuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IG9mZnNldCBhdCB3aGljaCB0aGUgcmFuZ2Ugc3RhcnRzCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgcmFuZ2UKLQkgKiBAcmV0dXJuIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcmFuZ2UncyBwYXJ0aXRpb25pbmcKLQkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogQHRocm93cyBCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVR5cGVkUmVnaW9uW10gY29tcHV0ZVBhcnRpdGlvbmluZyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlJVHlwZWRSZWdpb25bXSB0eXBlZFJlZ2lvbnMgPSBudWxsOwotCQl0cnkgewotCQkJdHlwZWRSZWdpb25zID0gY29tcHV0ZVBhcnRpdGlvbmluZyhJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCBvZmZzZXQsIGxlbmd0aCwgZmFsc2UpOwotCQl9Ci0JCWNhdGNoIChCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSBpbiB0aGlzIGNvbnRleHQKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCQlpZiAodHlwZWRSZWdpb25zID09IG51bGwpIHsKLQkJCXR5cGVkUmVnaW9ucyA9IG5ldyBJVHlwZWRSZWdpb25bMF07Ci0JCX0KLQkJcmV0dXJuIHR5cGVkUmVnaW9uczsKLQl9Ci0KLQotCXB1YmxpYyBJVHlwZWRSZWdpb25bXSBjb21wdXRlUGFydGl0aW9uaW5nKFN0cmluZyBwYXJ0aXRpb25pbmcsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gaW5jbHVkZVplcm9MZW5ndGhQYXJ0aXRpb25zKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbiB7Ci0JCWlmICgoMCA+IG9mZnNldCkgfHwgKDAgPiBsZW5ndGgpIHx8IChvZmZzZXQgKyBsZW5ndGggPiBnZXRMZW5ndGgoKSkpCi0JCQl0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQotCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IGdldERvY3VtZW50UGFydGl0aW9uZXIocGFydGl0aW9uaW5nKTsKLQotCQlpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpCi0JCQlyZXR1cm4gKChJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpIHBhcnRpdGlvbmVyKS5jb21wdXRlUGFydGl0aW9uaW5nKG9mZnNldCwgbGVuZ3RoLCBpbmNsdWRlWmVyb0xlbmd0aFBhcnRpdGlvbnMpOwotCQllbHNlIGlmIChwYXJ0aXRpb25lciAhPSBudWxsKQotCQkJcmV0dXJuIHBhcnRpdGlvbmVyLmNvbXB1dGVQYXJ0aXRpb25pbmcob2Zmc2V0LCBsZW5ndGgpOwotCQllbHNlIGlmIChJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLmVxdWFscyhwYXJ0aXRpb25pbmcpKQotCQkJcmV0dXJuIG5ldyBUeXBlZFJlZ2lvbltde25ldyBUeXBlZFJlZ2lvbihvZmZzZXQsIGxlbmd0aCwgREVGQVVMVF9DT05URU5UX1RZUEUpfTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2NvbnRhaW5zUG9zaXRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uKFN0cmluZyBjYXRlZ29yeSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gZ2V0UG9zaXRpb25NYW5hZ2VyKCkuY29udGFpbnNQb3NpdGlvbihjYXRlZ29yeSwgb2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2NvbnRhaW5zUG9zaXRpb25DYXRlZ29yeQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJcmV0dXJuIGdldFBvc2l0aW9uTWFuYWdlcigpLmNvbnRhaW5zUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVBvc2l0aW9uW10gcG9zaXRpb25zID0gZ2V0UG9zaXRpb25zKFJFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUG9zaXRpb24gcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07Ci0JCQkJaWYgKHBvc2l0aW9uLm92ZXJsYXBzV2l0aChzdGFydE9mZnNldCwgbGVuZ3RoKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZSkgewotCQkJLy8ganVzdCBtZWFucyBubyByZWFkb25seSByZWdpb25zIGJlZW4gZGVmaW5lZCB5ZXQKLQkJCS8vIHNvIG9idmlvdXNseSBmYWxzZQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZVBvc3ROb3RpZmljYXRpb25DaGFuZ2VzKCkgewotCQlpZiAoZlN0b3BwZWRDb3VudCA+IDApCi0JCQlyZXR1cm47Ci0JCXdoaWxlIChmUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXMgIT0gbnVsbCkgewotCQkJTGlzdCBjaGFuZ2VzID0gZlBvc3ROb3RpZmljYXRpb25DaGFuZ2VzOwotCQkJZlBvc3ROb3RpZmljYXRpb25DaGFuZ2VzID0gbnVsbDsKLQkJCUl0ZXJhdG9yIGUgPSBjaGFuZ2VzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlSZWdpc3RlcmVkUmVwbGFjZSByZXBsYWNlID0gKFJlZ2lzdGVyZWRSZXBsYWNlKSBlLm5leHQoKTsKLQkJCQlyZXBsYWNlLmZSZXBsYWNlLnBlcmZvcm0odGhpcywgcmVwbGFjZS5mT3duZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVEb2N1bWVudEFib3V0VG9DaGFuZ2VkKCkgewotCQkvLyBtb3N0IERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZCBsaXN0ZW5lcnMgZG8gbm90IGFudGljaXBhdGUKLQkJLy8gRG9jdW1lbnRFdmVudCA9PSBudWxsLiBTbyBtYWtlIHN1cmUgZG9jdW1lbnRFdmVudCBpcyBub3QKLQkJLy8gbnVsbC4gKHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgeWV0IGl0IGRvZXMgc29tZXRpbWVzKQotCQlpZiAoZkRvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RXZlbnQgPSBuZXcgTnVsbERvY3VtZW50RXZlbnQoKTsKLQkJfQotCi0JCV9maXJlU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZShmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycyk7Ci0JCS8vIE5vdGU6IHRoZSBkb2NFdmVudCBpcyBjcmVhdGVkIGluIHJlcGxhY2VUZXh0IEFQSSEgKG9yIHNldCBUZXh0KQotCQlfZmlyZURvY3VtZW50QWJvdXRUb0NoYW5nZShmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycyk7Ci0JCW5vdGlmeURvY3VtZW50UGFydGl0aW9uZXJzQWJvdXRUb0NoYW5nZShmRG9jdW1lbnRFdmVudCk7Ci0JCV9maXJlRG9jdW1lbnRBYm91dFRvQ2hhbmdlKGZEb2N1bWVudExpc3RlbmVycyk7Ci0JfQotCi0JLyoqCi0JICogRmlyZXMgdGhlIGRvY3VtZW50IHBhcnRpdGlvbmluZyBjaGFuZ2VkIG5vdGlmaWNhdGlvbiB0byBhbGwgcmVnaXN0ZXJlZAotCSAqIGRvY3VtZW50IHBhcnRpdGlvbmluZyBsaXN0ZW5lcnMuIFVzZXMgYSByb2J1c3QgaXRlcmF0b3IuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgcGFydGl0aW9uaW5nIGNoYW5nZWQgZXZlbnQKLQkgKiAKLQkgKiBAc2VlIElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVEb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQoRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycyA9PSBudWxsIHx8IGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycy5zaXplKCkgPT0gMCkKLQkJCXJldHVybjsKLQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycyk7Ci0JCUl0ZXJhdG9yIGUgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIgbCA9IChJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcikgZS5uZXh0KCk7Ci0JCQlpZiAobCBpbnN0YW5jZW9mIElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMikgewotCQkJCUlEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMiBleHRlbnNpb24yID0gKElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMikgbDsKLQkJCQlleHRlbnNpb24yLmRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsIGluc3RhbmNlb2YgSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb24pIHsKLQkJCQlJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lckV4dGVuc2lvbiBleHRlbnNpb24gPSAoSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb24pIGw7Ci0JCQkJZXh0ZW5zaW9uLmRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZCh0aGlzLCBldmVudC5nZXRDb3ZlcmFnZSgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWwuZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKHRoaXMpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlyZVJlYWRPbmx5QWJvdXRUb0JlQ2hhbmdlZCgpIHsKLQkJX2ZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzKTsKLQkJLy8gTm90ZTogdGhlIGRvY0V2ZW50IGlzIGNyZWF0ZWQgaW4gcmVwbGFjZVRleHQgQVBJISAob3Igc2V0IFRleHQpCi0JCS8vIF9maXJlRG9jdW1lbnRBYm91dFRvQ2hhbmdlKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzKTsKLQkJLy8gX2ZpcmVEb2N1bWVudEFib3V0VG9DaGFuZ2UoZkRvY3VtZW50TGlzdGVuZXJzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlyZVJlYWRPbmx5U3RydWN0dXJlZERvY3VtZW50RXZlbnQoTm9DaGFuZ2VFdmVudCBldmVudCkgewotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCBldmVudCk7Ci0JCS8vIF9maXJlRG9jdW1lbnRDaGFuZ2VkKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCS8vIF9maXJlRG9jdW1lbnRDaGFuZ2VkKGZEb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQkvLyBfY2xlYXJEb2N1bWVudEV2ZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChOb0NoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLCBldmVudCk7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudENoYW5nZWQoZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJbm90aWZ5RG9jdW1lbnRQYXJ0aXRpb25lcnNEb2N1bWVudENoYW5nZWQoZXZlbnQpOwotCQlfZmlyZURvY3VtZW50Q2hhbmdlZChmRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2NsZWFyRG9jdW1lbnRFdmVudCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQoUmVnaW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLCBldmVudCk7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudENoYW5nZWQoZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJbm90aWZ5RG9jdW1lbnRQYXJ0aXRpb25lcnNEb2N1bWVudENoYW5nZWQoZXZlbnQpOwotCQlfZmlyZURvY3VtZW50Q2hhbmdlZChmRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2NsZWFyRG9jdW1lbnRFdmVudCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJX2ZpcmVFdmVudChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVFdmVudChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZURvY3VtZW50Q2hhbmdlZChmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQlub3RpZnlEb2N1bWVudFBhcnRpdGlvbmVyc0RvY3VtZW50Q2hhbmdlZChldmVudCk7Ci0JCV9maXJlRG9jdW1lbnRDaGFuZ2VkKGZEb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQlfY2xlYXJEb2N1bWVudEV2ZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCBldmVudCk7Ci0JCV9maXJlRG9jdW1lbnRDaGFuZ2VkKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCW5vdGlmeURvY3VtZW50UGFydGl0aW9uZXJzRG9jdW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudENoYW5nZWQoZkRvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCV9jbGVhckRvY3VtZW50RXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCdzIGNvbXBsZXRlIHRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXQoKSB7Ci0JCXJldHVybiBnZXRTdG9yZSgpLmdldCgwLCBnZXRMZW5ndGgoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBsZW5ndGggY2hhcmFjdGVycyBmcm9tIHRoZSBkb2N1bWVudCdzIHRleHQgc3RhcnRpbmcgZnJvbSB0aGUKLQkgKiBzcGVjaWZpZWQgcG9zaXRpb24uCi0JICogCi0JICogQHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqIAotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiB0aGUgcmFuZ2UgaXMgbm90IHZhbGlkIGluIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWludCBteUxlbmd0aCA9IGdldExlbmd0aCgpOwotCQlpZiAoMCA+IG9mZnNldCkKLQkJCW9mZnNldCA9IDA7Ci0JCWlmICgwID4gbGVuZ3RoKQotCQkJbGVuZ3RoID0gMDsKLQkJaWYgKG9mZnNldCArIGxlbmd0aCA+IG15TGVuZ3RoKSB7Ci0JCQkvLyBmaXJzdCB0cnkgYWRqdXN0aW5nIGxlbmd0aCB0byBmaXQKLQkJCWludCBsZXNzTGVuZ3RoID0gbXlMZW5ndGggLSBvZmZzZXQ7Ci0JCQlpZiAoKGxlc3NMZW5ndGggPj0gMCkgJiYgKG9mZnNldCArIGxlc3NMZW5ndGggPT0gbXlMZW5ndGgpKSB7Ci0JCQkJbGVuZ3RoID0gbGVzc0xlbmd0aDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHNlY29uZCwgdHJ5IG9mZnNldAotCQkJCWludCBtb3JlT2Zmc2V0ID0gbXlMZW5ndGggLSBsZW5ndGg7Ci0JCQkJaWYgKChtb3JlT2Zmc2V0ID49IDApICYmIChtb3JlT2Zmc2V0ICsgbGVuZ3RoID09IG15TGVuZ3RoKSkgewotCQkJCQlvZmZzZXQgPSBtb3JlT2Zmc2V0OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gY2FuIGhhcHBlbiBpZiBteUxlbmd0aCBpcyAwLgotCQkJCQkvLyBubyBhZGp1c3RtZW50IHBvc3NpYmxlLgotCQkJCQlyZXN1bHQgPSBuZXcgU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRTdG9yZSgpLmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKFVTRV9MT0NBTF9USFJFQUQpIHsKLQkJCXJlc3VsdCA9IGZDdXJyZW50RG9jdW1lbnRSZWdpb25DYWNoZS5nZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGNhY2hlZERvY3VtZW50UmVnaW9uOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjZ2V0Q2hhcgotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiBwb3NpdGlvbiBpcyBub3QgYSB2YWxpZCByYW5nZSBpbiB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgY2hhciBnZXRDaGFyKGludCBwb3MpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWNoYXIgcmVzdWx0ID0gMHgwMDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGdldFN0b3JlKCkuZ2V0KHBvcyk7Ci0JCX0KLQkJY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEJhZExvY2F0aW9uRXhjZXB0aW9uKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGRvY3VtZW50IHBhcnRpdGlvbiBjb250YWluaW5nIHRoZSBnaXZlbgotCSAqIGNoYXJhY3RlciBwb3NpdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXREb2N1bWVudFBhcnRpdGlvbmVyKCkuZ2V0Q29udGVudFR5cGUob2Zmc2V0KTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoU3RyaW5nIHBhcnRpdGlvbmluZywgaW50IG9mZnNldCwgYm9vbGVhbiBwcmVmZXJPcGVuUGFydGl0aW9ucykgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24gewotCQlpZiAoKDAgPiBvZmZzZXQpIHx8IChvZmZzZXQgPiBnZXRMZW5ndGgoKSkpCi0JCQl0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQotCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IGdldERvY3VtZW50UGFydGl0aW9uZXIocGFydGl0aW9uaW5nKTsKLQotCQlpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpCi0JCQlyZXR1cm4gKChJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpIHBhcnRpdGlvbmVyKS5nZXRDb250ZW50VHlwZShvZmZzZXQsIHByZWZlck9wZW5QYXJ0aXRpb25zKTsKLQkJZWxzZSBpZiAocGFydGl0aW9uZXIgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJ0aXRpb25lci5nZXRDb250ZW50VHlwZShvZmZzZXQpOwotCQllbHNlIGlmIChJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLmVxdWFscyhwYXJ0aXRpb25pbmcpKQotCQkJcmV0dXJuIERFRkFVTFRfQ09OVEVOVF9UWVBFOwotCQllbHNlCi0JCQl0aHJvdyBuZXcgQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQjZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoKSB7Ci0JCQotCQlTdHJpbmcgbGluZURlbGltaXRlcj0gbnVsbDsKLQkJCi0JCXRyeSB7Ci0JCQlsaW5lRGVsaW1pdGVyPSBnZXRMaW5lRGVsaW1pdGVyKDApOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCX0KLQkKLQkJaWYgKGxpbmVEZWxpbWl0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBsaW5lRGVsaW1pdGVyOwotCi0JCWlmIChmSW5pdGlhbExpbmVEZWxpbWl0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBmSW5pdGlhbExpbmVEZWxpbWl0ZXI7Ci0KLQkJU3RyaW5nIHN5c0xpbmVEZWxpbWl0ZXI9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBkZWxpbWl0ZXJzPSBnZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCk7Ci0JCUFzc2VydC5pc1RydWUoZGVsaW1pdGVycy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGRlbGltaXRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkZWxpbWl0ZXJzW2ldLmVxdWFscyhzeXNMaW5lRGVsaW1pdGVyKSkgewotCQkJCWxpbmVEZWxpbWl0ZXI9IHN5c0xpbmVEZWxpbWl0ZXI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChsaW5lRGVsaW1pdGVyID09IG51bGwpCi0JCQlsaW5lRGVsaW1pdGVyPSBkZWxpbWl0ZXJzWzBdOwotCQotCQlyZXR1cm4gbGluZURlbGltaXRlcjsKLQkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG9jdW1lbnQncyBwYXJ0aXRpb25lci4KLQkgKiAKLQkgKiBAc2VlIElEb2N1bWVudFBhcnRpdGlvbmVyCi0JICovCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERvY3VtZW50UGFydGl0aW9uZXIoKSB7Ci0JCXJldHVybiBnZXREb2N1bWVudFBhcnRpdGlvbmVyKElEb2N1bWVudEV4dGVuc2lvbjMuREVGQVVMVF9QQVJUSVRJT05JTkcpOwotCX0KLQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERvY3VtZW50UGFydGl0aW9uZXIoU3RyaW5nIHBhcnRpdGlvbmluZykgewotCi0JCUlEb2N1bWVudFBhcnRpdGlvbmVyIGRvY3VtZW50UGFydGl0aW9uZXIgPSBudWxsOwotCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzICE9IG51bGwpIHsKLQkJCWRvY3VtZW50UGFydGl0aW9uZXIgPSAoSURvY3VtZW50UGFydGl0aW9uZXIpIGZEb2N1bWVudFBhcnRpdGlvbmVycy5nZXQocGFydGl0aW9uaW5nKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnRQYXJ0aXRpb25lcjsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHsKLQkJcmV0dXJuIGVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJLy8gc2hvdWxkIHdlIHVwZGF0ZSBjYWNoZWROb2RlPwotCQkvLyBXZSBzaG91bGQgdG8ga2VlcCBjb25zaXN0ZW50IHBoaWxvc29waHkgb2YgcmVtZW1iZXJpbmcgbGFzdAotCQkvLyByZXF1ZXN0ZWQgcG9zaXRpb24sCi0JCS8vIGZvciBlZmZpY2llbmN5LgotCQlzZXRDYWNoZWREb2N1bWVudFJlZ2lvbihmaXJzdERvY3VtZW50UmVnaW9uKTsKLQkJcmV0dXJuIGZpcnN0RG9jdW1lbnRSZWdpb247Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJLy8gc2hvdWxkIHdlIHVwZGF0ZSBjYWNoZWROb2RlPwotCQkvLyBXZSBzaG91bGQgdG8ga2VlcCBjb25zaXN0ZW50IHBoaWxvc29waHkgb2YgcmVtZW1iZXJpbmcgbGFzdAotCQkvLyByZXF1ZXN0ZWQgcG9zaXRpb24sCi0JCS8vIGZvciBlZmZpY2llbmN5LgotCQlzZXRDYWNoZWREb2N1bWVudFJlZ2lvbihsYXN0RG9jdW1lbnRSZWdpb24pOwotCQlyZXR1cm4gbGFzdERvY3VtZW50UmVnaW9uOwotCX0KLQotCS8qCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGFydGl0aW9ucwotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBnZXRMZWdhbENvbnRlbnRUeXBlcyhJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HKTsKLQkJfQotCQljYXRjaCAoQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUgaW4gdGhpcyBjb250ZXh0Ci0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TGVnYWxDb250ZW50VHlwZXMoU3RyaW5nIHBhcnRpdGlvbmluZykgdGhyb3dzIEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbiB7Ci0JCUlEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihwYXJ0aXRpb25pbmcpOwotCQlpZiAocGFydGl0aW9uZXIgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJ0aXRpb25lci5nZXRMZWdhbENvbnRlbnRUeXBlcygpOwotCQlpZiAoSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORy5lcXVhbHMocGFydGl0aW9uaW5nKSkKLQkJCXJldHVybiBuZXcgU3RyaW5nW117REVGQVVMVF9DT05URU5UX1RZUEV9OwotCQl0aHJvdyBuZXcgQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0gbGluZSBkZWxpbWl0ZXIgY29udmVyc2lvbgotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCkgewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmdldExlZ2FsTGluZURlbGltaXRlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNnZXRMZW5ndGgKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGdldFN0b3JlKCkuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50I2dldExpbmVEZWxpbWl0ZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpIHsKLQkJcmV0dXJuIGdldERlZmF1bHRMaW5lRGVsaW1pdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGluZSBkZWxpbWl0ZXIgb2YgdGhhdCBsaW5lCi0JICogCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHRoZSBsaW5lIG51bWJlciBpcyBpbnZhbGlkIGluIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcihpbnQgbGluZSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmdldExpbmVEZWxpbWl0ZXIobGluZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbGluZS4gVGhlIGxpbmUgaXMgZGVzY3JpYmVkIGJ5Ci0JICogaXRzIG9mZnNldCBhbmQgaXRzIGxlbmd0aCBleGNsdWRpbmcgdGhlIGxpbmUncyBkZWxpbWl0ZXIuCi0JICogCi0JICogQHBhcmFtIGxpbmUKLQkgKiAgICAgICAgICAgIHRoZSBsaW5lIG9mIGludGVyZXN0Ci0JICogQHJldHVybiBhIGxpbmUgZGVzY3JpcHRpb24KLQkgKiBAZXhjZXB0aW9uIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxpbmUgbnVtYmVyIGlzIGludmFsaWQgaW4gdGhpcyBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24gZ2V0TGluZUluZm9ybWF0aW9uKGludCBsaW5lKSB0aHJvd3Mgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRUcmFja2VyKCkuZ2V0TGluZUluZm9ybWF0aW9uKGxpbmUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbGluZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LiBUaGUgZGVzY3JpcHRpb24KLQkgKiBjb250YWlucyB0aGUgb2Zmc2V0IGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBsaW5lIGV4Y2x1ZGluZyB0aGUgbGluZSdzCi0JICogZGVsaW1pdGVyLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgd2hvc2UgbGluZSBzaG91bGQgYmUgZGVzY3JpYmVkCi0JICogQHJldHVybiBhIHJlZ2lvbiBkZXNjcmliaW5nIHRoZSBsaW5lCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIG9mZnNldCBpcyBpbnZhbGlkIGluIHRoaXMgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uIGdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGludCBvZmZzZXQpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChvZmZzZXQpOwotCX0KLQotCS8qCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsaW5lIGluZm9ybWF0aW9uCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVMZW5ndGgoaW50IGxpbmUpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5nZXRMaW5lTGVuZ3RoKGxpbmUpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiBsaW5lLgotCSAqIAotCSAqIEBwYXJhbSBsaW5lCi0JICogICAgICAgICAgICB0aGUgbGluZSBvZiBpbnRlcmVzdAotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50IG9mZnNldAotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgbGluZSBudW1iZXIgaXMgaW52YWxpZCBpbiB0aGlzIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGludCBnZXRMaW5lT2Zmc2V0KGludCBsaW5lKSB0aHJvd3Mgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRUcmFja2VyKCkuZ2V0TGluZU9mZnNldChsaW5lKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExpbmVPZk9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGdldFRyYWNrZXIoKS5nZXRMaW5lTnVtYmVyT2ZPZmZzZXQob2Zmc2V0KTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJaWYgKExvZ2dlci5ERUJVR19ET0NVTUVOVCkKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiRGV2LiBQcm9ncmFtIEluZm8gT25seTogSVN0cnVjdHVyZWREb2N1bWVudDo6Z2V0TGluZU9mT2Zmc2V0OiBvZmZzZXQgb3V0IG9mIHJhbmdlLCB6ZXJvIGFzc3VtZWQuIG9mZnNldCA9ICIgKyBvZmZzZXQsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJlc3VsdCA9IDA7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhpcyBkb2N1bWVudAotCSAqIAotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGlzIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGludCBnZXROdW1iZXJPZkxpbmVzKCkgewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmdldE51bWJlck9mTGluZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGluZXMgd2hpY2ggYXJlIG9jY3VwaWVkIGJ5IGEgZ2l2ZW4gdGV4dCByYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBzcGVjaWZpZWQgdGV4dCByYW5nZQotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHNwZWNpZmllZCB0ZXh0IHJhbmdlCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGxpbmVzIG9jY3VwaWVkIGJ5IHRoZSBzcGVjaWZpZWQgcmFuZ2UKLQkgKiBAZXhjZXB0aW9uIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgc3BlY2lmaWVkIHJhbmdlIGlzIGludmFsaWQgaW4gdGhpcyB0cmFja2VyCi0JICovCi0JcHVibGljIGludCBnZXROdW1iZXJPZkxpbmVzKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5nZXROdW1iZXJPZkxpbmVzKG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHB1YmxpYywgdGVtcG9yYXJpbHksIGZvciB1c2UgYnkgdGFnIGxpYiBjbGFzc2VzLgotCSAqLwotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAoZlBhcnNlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJU3RydWN0dXJlZERvY3VtZW50OjpnZXRQYXJzZXIuIFBhcnNlciBuZWVkcyB0byBiZSBzZXQgYmVmb3JlIHVzZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG9jdW1lbnQgcGFydGl0aW9uIGluIHdoaWNoIHRoZSBwb3NpdGlvbiBpcyBsb2NhdGVkLiBUaGUKLQkgKiBwYXJ0aXRpb24gaXMgc3BlY2lmaWVkIGFzIHR5cGVkIHJlZ2lvbi4KLQkgKi8KLQlwdWJsaWMgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlJVHlwZWRSZWdpb24gcGFydGl0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhcnRpdGlvbiA9IGdldFBhcnRpdGlvbihJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCBvZmZzZXQsIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCQlpZiAocGFydGl0aW9uID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBFcnJvcigpOwotCQl9Ci0JCXJldHVybiBwYXJ0aXRpb247Ci0JfQotCi0KLQlwdWJsaWMgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihTdHJpbmcgcGFydGl0aW9uaW5nLCBpbnQgb2Zmc2V0LCBib29sZWFuIHByZWZlck9wZW5QYXJ0aXRpb25zKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbiB7Ci0JCWlmICgoMCA+IG9mZnNldCkgfHwgKG9mZnNldCA+IGdldExlbmd0aCgpKSkKLQkJCXRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbigpOwotCQlJVHlwZWRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQotCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IGdldERvY3VtZW50UGFydGl0aW9uZXIocGFydGl0aW9uaW5nKTsKLQotCQlpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpIHsKLQkJCXJlc3VsdCA9ICgoSURvY3VtZW50UGFydGl0aW9uZXJFeHRlbnNpb24yKSBwYXJ0aXRpb25lcikuZ2V0UGFydGl0aW9uKG9mZnNldCwgcHJlZmVyT3BlblBhcnRpdGlvbnMpOwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvbmVyICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHBhcnRpdGlvbmVyLmdldFBhcnRpdGlvbihvZmZzZXQpOwotCQl9Ci0JCWVsc2UgaWYgKElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcuZXF1YWxzKHBhcnRpdGlvbmluZykpIHsKLQkJCXJlc3VsdCA9IG5ldyBUeXBlZFJlZ2lvbigwLCBnZXRMZW5ndGgoKSwgREVGQVVMVF9DT05URU5UX1RZUEUpOwotCQl9Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24oKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRQYXJ0aXRpb25pbmdzKCkgewotCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gcGFydGl0aW9uaW5ncyA9IG5ldyBTdHJpbmdbZkRvY3VtZW50UGFydGl0aW9uZXJzLnNpemUoKV07Ci0JCWZEb2N1bWVudFBhcnRpdGlvbmVycy5rZXlTZXQoKS50b0FycmF5KHBhcnRpdGlvbmluZ3MpOwotCQlyZXR1cm4gcGFydGl0aW9uaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBwb3NpdGlvbiBjYXRlZ29yaWVzIGFkZGVkIHRvIHRoaXMgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFBvc2l0aW9uQ2F0ZWdvcmllcygpIHsKLQkJcmV0dXJuIGdldFBvc2l0aW9uTWFuYWdlcigpLmdldFBvc2l0aW9uQ2F0ZWdvcmllcygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcG9zaXRpb25NYW5hZ2VyLgotCSAqLwotCXByaXZhdGUgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlciBnZXRQb3NpdGlvbk1hbmFnZXIoKSB7Ci0JCWlmIChmUG9zaXRpb25NYW5hZ2VyID09IG51bGwpIHsKLQkJCWZQb3NpdGlvbk1hbmFnZXIgPSBuZXcgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gZlBvc2l0aW9uTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBQb3NpdGlvbnMgb2YgdGhlIGdpdmVuIHBvc2l0aW9uIGNhdGVnb3J5LgotCSAqIAotCSAqIEBleGNlcHRpb24gQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIGNhdGVnb3J5IGlzIG5vdCBkZWZpbmVkIGZvciB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgUG9zaXRpb25bXSBnZXRQb3NpdGlvbnMoU3RyaW5nIGNhdGVnb3J5KSB0aHJvd3Mgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFBvc2l0aW9uTWFuYWdlcigpLmdldFBvc2l0aW9ucyhjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjZ2V0UG9zaXRpb25VcGRhdGVycwotCSAqLwotCXB1YmxpYyBJUG9zaXRpb25VcGRhdGVyW10gZ2V0UG9zaXRpb25VcGRhdGVycygpIHsKLQkJcmV0dXJuIGdldFBvc2l0aW9uTWFuYWdlcigpLmdldFBvc2l0aW9uVXBkYXRlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuIG51bGwsIHdoaWNoIGlzIHRoZSBjYXNlIGlmIHRoZSBvZmZzZXQgaXMganVzdAotCSAqIGJlZm9yZSBvciBqdXN0IGFmdGVyIHRoZSBleGlzdGluZyB0ZXh0LiBDb21wYXJlIHdpdGgKLQkgKiBnZXROb2RlQXRDaGFyYWN0ZXJPZmZzZXQuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc3VsdCA9IG51bGw7Ci0KLQkJLy8gRklYTUU6IG5lZWQgdG8gc3luY2ggb24gJ2NhY2hlZFJlZ2lvbicgKGJ1dCBzaW5jZSB0aGF0J3MgYQotCQkvLyBjb25zdGFudGx5IGNoYW5naW5nIG9iamVjdCwgd2UKLQkJLy8gY2FuJ3QsIHNvIG5lZWQgdG8gYWRkIGEgInJlZ2lvbl9sb2NrIiBvYmplY3QsIGFuZCB1c2UgaXQgaGVyZSwgYW5kCi0JCS8vIGluIHJlLXBhcnNlci4KLQkJLy8gT2gsIGFuZCBuZWVkIHRvIG1ha2Ugc3VyZSwgYWZ0ZXIgc3luY2gsIHRoYXQgdGhlIHJlZ2lvbiBpcyBub3QKLQkJLy8gZGVsZXRlZCwgYW5kIGlmIHNvLCBJIGd1ZXNzIGdvIGJhY2sKLQkJLy8gdG8gdGhlIGJlZ2lubmluZyEKLQotCQkvLyBjYWNoZWQgbm9kZSBjYW4gYmUgbnVsbCB3aGVuIGRvY3VtZW50IGlzIGVtcHR5Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcG90ZW50aWFsQ2FjaGVkUmVnaW9uID0gZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHBvdGVudGlhbENhY2hlZFJlZ2lvbiAhPSBudWxsKSB7Ci0KLQkJCS8vIAotCi0JCQkvLyBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHJpZ2h0IG5vZGUsIHJldHVybiB0aGF0LgotCQkJaWYgKHBvdGVudGlhbENhY2hlZFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQkJcmVzdWx0ID0gcG90ZW50aWFsQ2FjaGVkUmVnaW9uOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gZmlyc3QsIGZpbmQgb3V0IHdoYXQgZGlyZWN0aW9uIHRvIGdvLCByZWxhdGl2ZSB0bwotCQkJCS8vIGNhY2hlZE5vZGUuCi0JCQkJLy8gbmVnYXRpdmUgbWVhbnMgInRvd2FyZHMgdGhlIGZyb250IiBvZiB0aGUgZmlsZSwKLQkJCQkvLyBwb3N0aXRpdmUKLQkJCQkvLyBtZWFucwotCQkJCS8vIHRvd2FyZHMgdGhlIGVuZC4KLQkJCQlpbnQgZGlyZWN0aW9uID0gb2Zmc2V0IC0gcG90ZW50aWFsQ2FjaGVkUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJaWYgKGRpcmVjdGlvbiA8IDApIHsKLQkJCQkJLy8gc2VhcmNoIHRvd2FyZHMgYmVnaW5uaW5nCi0JCQkJCXdoaWxlICghcG90ZW50aWFsQ2FjaGVkUmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGVtcE5vZGUgPSBwb3RlbnRpYWxDYWNoZWRSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCQkJCWlmICh0ZW1wTm9kZSA9PSBudWxsKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlwb3RlbnRpYWxDYWNoZWRSZWdpb24gPSB0ZW1wTm9kZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gc2VhcmNoIHRvd2FyZHMgZW5kCi0JCQkJCS8vIFRoZXJlIGlzIGEgbGVnaXRhbWF0IGNvbmRpdGlvbiB3aGVyZSB0aGUKLQkJCQkJLy8gb2Zmc2V0IHdpbGwgbm90IGJlIGNvbnRhaW5lZCBpbiBhbnkgbm9kZSwKLQkJCQkJLy8gd2hpY2ggaXMgaWYgdGhlIG9mZnNldCBpcyBqdXN0IHBhc3QgdGhlIGxhc3QKLQkJCQkJLy8gY2hhcmFjdGVyIG9mIHRleHQuCi0JCQkJCS8vIEFuZCwgd2UgbXVzdCBnYXVyZCBhZ2FpbnN0IHNldHRpbmcgY2FjaGVkTm9kZSB0bwotCQkJCQkvLyBudWxsIQotCQkJCQl3aGlsZSAoIXBvdGVudGlhbENhY2hlZFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRlbXBOb2RlID0gcG90ZW50aWFsQ2FjaGVkUmVnaW9uLmdldE5leHQoKTsKLQkJCQkJCWlmICh0ZW1wTm9kZSA9PSBudWxsKQotCQkJCQkJCWJyZWFrOwotCQkJCQkJZWxzZQotCQkJCQkJCXBvdGVudGlhbENhY2hlZFJlZ2lvbiA9IHRlbXBOb2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmVzdWx0ID0gcG90ZW50aWFsQ2FjaGVkUmVnaW9uOwotCQl9Ci0JCS8vIGp1c3QgdG8gYmUgZG91Ymx5IHN1cmUgd2UgbmV2ZXIgYXNzaWduIG51bGwgdG8gYW4gYWxyZWFkeSB2YWxpZAotCQkvLyBjYWNoZWRSZWdpb24uCi0JCS8vIEkgYmVsaWV2ZSBhbnkgdGltZSAncmVzdWx0JyBpcyBudWxsIGF0IHRoaXMgcG9pbnQsIHRoYXQganVzdCBtZWFucwotCQkvLyB3ZSBoYXZlIGFuCi0JCS8vIGVtcHR5IGRvY3VtZW50LCBhbmQgdGhlIGNhY2hlZFJlZ2lvbiBpcyBhbHJlYWR5IG51bGwsIGJ1dCB3ZSBjaGVjawotCQkvLyBhbmQgcHJpbnQKLQkJLy8gd2FybmluZywganVzdCBzbyBkdXJpbmcgZGV2ZWxvcG1lbnQgd2UgYmUgc3VyZSB3ZSBuZXZlciBhY2NpZGVudGx5Ci0JCS8vIGJyZWFrIHRoaXMgYXNzdW1wdGlvbi4KLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24ocmVzdWx0KTsKLQkJZWxzZSBpZiAoZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9ncmFtIEVycm9yOiBubyByZWdpb24gY291bGQgYmUgZm91bmQgdG8gY2FjaGUsIGJ1dCBjYWNoZSB3YXMgbm9uIG51bGwuIEluZGljYXRlcyBjb3JydXB0ZWQgbW9kZWwgb3IgcmVnaW9uIGxpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZ2V0UmVnaW9uTGlzdCgpIHsKLQkJQ29yZU5vZGVMaXN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChnZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpCi0JCQlyZXN1bHQgPSBuZXcgQ29yZU5vZGVMaXN0KG51bGwpOwotCQllbHNlCi0JCQlyZXN1bHQgPSBuZXcgQ29yZU5vZGVMaXN0KGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCXJldHVybiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKDAsIGdldExlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBJbiB0aGUgY2FzZSBvZiAwIGxlbmd0aCwgdGhlIDxjb2RlPklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb248L2NvZGU+Ci0JICogYXQgdGhlIGNoYXJhY3RlciBvZmZzZXQgaXMgcmV0dXJlbmVkLiBJbiBvdGhlciB3b3JkcywgdGhlIHJlZ2lvbiB0byB0aGUKLQkgKiByaWdodCBvZiB0aGUgY2FyZXQgaXMgcmV0dXJuZWQuIGV4Y2VwdCBmb3IgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsCi0JICogdGhlbiB0aGUgbGFzdCByZWdpb24gaXMgcmV0dXJuZWQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIE90aGVyd2lzZSBhbGwgdGhlIHJlZ2lvbnMgImluYmV0d2VlbiIgdGhlIGluZGljYXRlZCByYW5nZSBhcmUgcmV0dXJuZWQsCi0JICogaW5jbHVkaW5nIHRoZSByZWdpb25zIHdoaWNoIG92ZXJsYXAgdGhlIHJlZ2lvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogPGJyPgotCSAqIGVnLgotCSAqIDxwPgotCSAqIDxicj4KLQkgKiBlZy4KLQkgKiAKLQkgKiA8cHJlPgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2h0bWwmZ3Q7WyZsdDtoZWFkJmd0OyZsdDsvaGVhZCZndDtdJmx0Oy9odG1sJmd0OyByZXR1cm5zICZsdDtoZWFkJmd0OywmbHQ7L2hlYWQmZ3Q7Ci0JICogPC9wcmU+Ci0JICogICAgPHByZT4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICZsdDtodFttbCZndDsmbHQ7aGVhZCZndDsmbHQ7L2hlXWFkJmd0OyZsdDsvaHRtbCZndDsgcmV0dXJucyAmbHQ7aHRtbCZndDssJmx0O2hlYWQmZ3Q7LCZsdDsvaGVhZCZndDsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiA8cHJlPgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7aHRtbCZndDtbJmx0O2hlYWQmZ3Q7Jmx0Oy9oZWFkJmd0O10mbHQ7L2h0bWwmZ3Q7IHJldHVybnMgJmx0O2hlYWQmZ3Q7LCZsdDsvaGVhZCZndDsKLQkgKiA8L3ByZT4KLQkgKiAgICA8cHJlPgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7aHRbbWwmZ3Q7Jmx0O2hlYWQmZ3Q7Jmx0Oy9oZV1hZCZndDsmbHQ7L2h0bWwmZ3Q7IHJldHVybnMgJmx0O2h0bWwmZ3Q7LCZsdDtoZWFkJmd0OywmbHQ7L2hlYWQmZ3Q7Ci0JICogPC9wcmU+Ci0JICogCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQotCQlpZiAobGVuZ3RoIDwgMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbid0IGhhdmUgbmVnYXRpdmUgbGVuZ3RoIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyB0aGlzIHdpbGwgbWFrZSB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgcmFuZ2UgcG9pbnQgaW50byB0aGUgc2VsZWN0aW9uCi0JCS8vIGVnLiA8aHRtbD5bPGhlYWQ+PC9oZWFkPl08L2h0bWw+Ci0JCS8vIHdpbGwgcmV0dXJuIDxoZWFkPiw8L2hlYWQ+IGluc3RlYWQgb2YgPGhlYWQ+LDwvaGVhZD4sPC9odG1sPgotCQlpZiAobGVuZ3RoID4gMCkKLQkJCWxlbmd0aC0tOwotCi0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBzdGFydCB0aHJlYWQgc2FmZSBibG9jawotCQl0cnkgewotCQkJYWNxdWlyZUxvY2soKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRSZWdpb24gPSBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCArIGxlbmd0aCk7Ci0JCQl3aGlsZSAoY3VycmVudFJlZ2lvbiAhPSBlbmRSZWdpb24gJiYgY3VycmVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0cy5hZGQoY3VycmVudFJlZ2lvbik7Ci0JCQkJY3VycmVudFJlZ2lvbiA9IGN1cnJlbnRSZWdpb24uZ2V0TmV4dCgpOwotCQkJfQotCQkJLy8gbmVlZCB0byBhZGQgdGhhdCBsYXN0IGVuZCByZWdpb24KLQkJCS8vIGNhbiBiZSBudWxsIGluIHRoZSBjYXNlIG9mIGFuIGVtcHR5IGRvY3VtZW50Ci0JCQlpZiAoZW5kUmVnaW9uICE9IG51bGwpCi0JCQkJcmVzdWx0cy5hZGQoZW5kUmVnaW9uKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXJlbGVhc2VMb2NrKCk7Ci0JCX0KLQkJLy8gZW5kIHRocmVhZCBzYWZlIGJsb2NrCi0KLQkJcmV0dXJuIChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10pIHJlc3VsdHMudG9BcnJheShuZXcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltyZXN1bHRzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIHdhcyBtYWRlIHB1YmxpYyBmb3IgZWFzaWVyIHRlc3RpbmcuIE5vcm1hbGx5IHNob3VsZCBuZXZlciBiZSB1c2VkIGJ5Ci0JICogY2xpZW50IGNvZGVzLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBnZXRSZVBhcnNlcigpIHsKLQkJaWYgKGZSZVBhcnNlciA9PSBudWxsKSB7Ci0JCQlmUmVQYXJzZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKTsKLQkJCWZSZVBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZSZVBhcnNlcjsKLQl9Ci0KLQlwcml2YXRlIElUZXh0U3RvcmUgZ2V0U3RvcmUoKSB7Ci0JCXJldHVybiBmU3RvcmU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlTdHJpbmcgcmVzdWx0ID0gZ2V0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG9jdW1lbnQncyBsaW5lIHRyYWNrZXIuIEFzc3VtZXMgdGhhdCB0aGUgZG9jdW1lbnQgaGFzIGJlZW4KLQkgKiBpbml0aWFsaXplZCB3aXRoIGEgbGluZSB0cmFja2VyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50J3MgbGluZSB0cmFja2VyCi0JICovCi0JcHJpdmF0ZSBJTGluZVRyYWNrZXIgZ2V0VHJhY2tlcigpIHsKLQkJcmV0dXJuIGZUcmFja2VyOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciBnZXRVbmRvTWFuYWdlcigpIHsKLQkJaWYgKGZVbmRvTWFuYWdlciA9PSBudWxsKSB7Ci0JCQlmVW5kb01hbmFnZXIgPSBuZXcgU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBmVW5kb01hbmFnZXI7Ci0JfQotCi0Jdm9pZCBpbml0aWFsaXplRmlyc3RBbmRMYXN0RG9jdW1lbnRSZWdpb24oKSB7Ci0JCS8vIGNhY2hlZCBOb2RlIG11c3QgYWxzbyBiZSBmaXJzdCwgYXQgdGhlIGluaXRpYWwgcG9pbnQuIE9ubHkKLQkJLy8gdmFsaWQKLQkJLy8gdG8gY2FsbCB0aGlzIG1ldGhvZCByaWdodCBhZnRlciB0aGUgZmlyc3QgcGFyc2UuCi0JCS8vIAotCQkvLyB3aGVuIHN0YXJ0aW5nIGFmcmVzaCwgb3VyIGNhY2hlZE5vZGUgc2hvdWxkIGJlIG91ciBmaXJzdE5vZGUsCi0JCS8vIHNvIGJlIHN1cmUgdG8gaW5pdGlhbGl6ZSB0aGUgZmlyc3ROb2RlCi0JCWZpcnN0RG9jdW1lbnRSZWdpb24gPSBnZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpOwotCQkvLyBiZSBzdXJlIHRvIHVzZSAnZ2V0TmV4dCcgZm9yIHRoaXMgaW5pdGlhbCBmaW5kaW5nIG9mIHRoZSBsYXN0Ci0JCS8vIG5vZGUsCi0JCS8vIHNpbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBub2RlLmdldExhc3ROb2RlIG1heSBzaW1wbHkgY2FsbAotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiEKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGZpcnN0RG9jdW1lbnRSZWdpb247Ci0JCWlmIChhTm9kZSA9PSBudWxsKSB7Ci0JCQkvLyBkZWZlY3QgMjU0NjA3OiB0byBoYW5kbGUgZW1wdHkgZG9jdW1lbnRzIHJpZ2h0LCBpZgotCQkJLy8gZmlyc3Rub2RlIGlzCi0JCQkvLyBudWxsLCBtYWtlIHN1cmUgbGFzdCBub2RlIGlzIG51bGwgdG9vCi0JCQlsYXN0RG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJd2hpbGUgKGFOb2RlICE9IG51bGwpIHsKLQkJCQlsYXN0RG9jdW1lbnRSZWdpb24gPSBhTm9kZTsKLQkJCQlhTm9kZSA9IGFOb2RlLmdldE5leHQoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2luc2VydFBvc2l0aW9uVXBkYXRlcgotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydFBvc2l0aW9uVXBkYXRlcihJUG9zaXRpb25VcGRhdGVyIHVwZGF0ZXIsIGludCBpbmRleCkgewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5pbnNlcnRQb3NpdGlvblVwZGF0ZXIodXBkYXRlciwgaW5kZXgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbF9hZGRQb3NpdGlvbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5hZGRQb3NpdGlvbkNhdGVnb3J5KGNhdGVnb3J5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxfYWRkUG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlcikgewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5hZGRQb3NpdGlvblVwZGF0ZXIodXBkYXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsX3NldFBhcnNlcihSZWdpb25QYXJzZXIgbmV3UGFyc2VyKSB7Ci0JCWZQYXJzZXIgPSBuZXdQYXJzZXI7Ci0JfQotCi0JU3RyaW5nIGludGVybmFsR2V0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIGludCBteUxlbmd0aCA9IGdldExlbmd0aCgpOwotCQkvLyBpZiAoKDAgPiBvZmZzZXQpIHx8ICgwID4gbGVuZ3RoKSB8fCAob2Zmc2V0ICsgbGVuZ3RoID4gbXlMZW5ndGgpKQotCQkvLyB0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQkJcmVzdWx0ID0gZ2V0U3RvcmUoKS5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXF1ZXN0ZXIKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRMZW5ndGgKLQkgKiBAcGFyYW0gY2hhbmdlcwotCSAqIEBwYXJhbSBtb2RpZmljYXRpb25TdGFtcAotCSAqIEBwYXJhbSBpZ25vcmVSZWFkT25seVNldHRpbmdzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgaW50ZXJuYWxSZXBsYWNlVGV4dChPYmplY3QgcmVxdWVzdGVyLCBpbnQgc3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCwgU3RyaW5nIGNoYW5nZXMsIGxvbmcgbW9kaWZpY2F0aW9uU3RhbXAsIGJvb2xlYW4gaWdub3JlUmVhZE9ubHlTZXR0aW5ncykgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCi0JCXN0b3BQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpOwotCQlpZiAoY2hhbmdlcyA9PSBudWxsKQotCQkJY2hhbmdlcyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIAotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOjpyZXBsYWNlVGV4dCgiICsgc3RhcnQgKyAiLCIgKyByZXBsYWNlbWVudExlbmd0aCArICIsIiArIGNoYW5nZXMgKyAiKSIpOyAvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCWlmIChEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudE9ubHkgfHwgRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RSYXdTdHJ1Y3R1cmVkRG9jdW1lbnRPbmx5KSB7Ci0JCQlzdGFydFN0cmVhbVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQl0cnkgewotCQkJLy8gTm90ZTogZXZlbnQgbXVzdCBiZSBjb21wdXRlZCBiZWZvcmUgJ2ZpcmUnIG1ldGhvZCBjYWxsZWQKLQkJCWZEb2N1bWVudEV2ZW50ID0gbmV3IERvY3VtZW50RXZlbnQodGhpcywgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoLCBjaGFuZ2VzKTsKLQkJCWZpcmVEb2N1bWVudEFib3V0VG9DaGFuZ2VkKCk7Ci0KLQkJCXRyeSB7Ci0JCQkJYWNxdWlyZUxvY2soKTsKLQotCQkJCWlmICghaWdub3JlUmVhZE9ubHlTZXR0aW5ncyAmJiAoY29udGFpbnNSZWFkT25seShzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgpKSkgewotCQkJCQlOb0NoYW5nZUV2ZW50IG5vQ2hhbmdlRXZlbnQgPSBuZXcgTm9DaGFuZ2VFdmVudCh0aGlzLCByZXF1ZXN0ZXIsIGNoYW5nZXMsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCk7Ci0JCQkJCW5vQ2hhbmdlRXZlbnQucmVhc29uID0gTm9DaGFuZ2VFdmVudC5SRUFEX09OTFlfU1RBVEVfQ0hBTkdFOwotCQkJCQlyZXN1bHQgPSBub0NoYW5nZUV2ZW50OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gdXBkYXRlTW9kZWwocmVxdWVzdGVyLCBzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgsIGNoYW5nZXMpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXJlbGVhc2VMb2NrKCk7Ci0JCQl9Ci0KLQotCQkJaWYgKERlYnVnLnBlcmZUZXN0UmF3U3RydWN0dXJlZERvY3VtZW50T25seSB8fCBEZWJ1Zy5wZXJmVGVzdCkgewotCQkJCWxvbmcgc3RvcFN0cmVhbVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuXHRcdFx0XHQgVGltZSBmb3IgSVN0cnVjdHVyZWREb2N1bWVudCByYXcgcmVwbGFjZVRleHQ6ICIgKyAoc3RvcFN0cmVhbVRpbWUgLSBzdGFydFN0cmVhbVRpbWUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJldmVudCB0eXBlIHJldHVybmVkIGJ5IHJlcGxhY2VUZXh0V2l0aE5vRGVidWdnaW5nVGhyZWFkOiAiICsgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gRlVUVVJFX1RPX0RPOiBpbXBsZW1lbnQgY2FsbGJhY2sgbWVjaGFuaXNtPyB0byBhdm9pZCBpbnN0YW5jZW9mCi0JCQkvLyBhbmQgY2FzdGluZwotCQkJLy8gZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IG11c3QgYmUgY2FsbGVkIGluIG9yZGVyIHRvIGVuZAotCQkJLy8gZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkIHN0YXRlCi0KLQotCQkJLy8gaW5jcmVtZW50IG1vZGlmaWNhdGlvbiBzdGFtcCBpZiBtb2RpZmljYXRpb25zIHdlcmUgbWFkZQotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmICEocmVzdWx0IGluc3RhbmNlb2YgTm9DaGFuZ2VFdmVudCkpIHsKLQkJCQlmTW9kaWZpY2F0aW9uU3RhbXA9IG1vZGlmaWNhdGlvblN0YW1wOwotCQkJCWZOZXh0TW9kaWZpY2F0aW9uU3RhbXA9IE1hdGgubWF4KGZNb2RpZmljYXRpb25TdGFtcCwgZk5leHRNb2RpZmljYXRpb25TdGFtcCk7Ci0JCQkJZkRvY3VtZW50RXZlbnQuZk1vZGlmaWNhdGlvblN0YW1wID0gZk1vZGlmaWNhdGlvblN0YW1wOwotCQkJfQotCQkJCQotCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJLy8gcmVzdWx0IHNob3VsZCBub3QgYmUgbnVsbCwgYnV0IGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLAotCQkJCS8vIGl0IHdpbGwgYmUKLQkJCQkvLyBzbyBzZW5kIGEgbm9DaGFuZ2VFdmVudCBhbmQgbG9nIHRoZSBwcm9ibGVtCi0JCQkJTm9DaGFuZ2VFdmVudCBub0NoYW5nZUV2ZW50ID0gbmV3IE5vQ2hhbmdlRXZlbnQodGhpcywgcmVxdWVzdGVyLCBjaGFuZ2VzLCBzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgpOwotCQkJCW5vQ2hhbmdlRXZlbnQucmVhc29uID0gTm9DaGFuZ2VFdmVudC5OT19FVkVOVDsKLQkJCQlmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQobm9DaGFuZ2VFdmVudCk7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJQcm9ncmFtIEVycm9yOiBpbnZhbGlkIHN0cnVjdHVyZWQgZG9jdW1lbnQgZXZlbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlZ2lvbkNoYW5nZWRFdmVudCkgewotCQkJCQlmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQoKFJlZ2lvbkNoYW5nZWRFdmVudCkgcmVzdWx0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBSZWdpb25zUmVwbGFjZWRFdmVudCkgewotCQkJCQkJZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KChSZWdpb25zUmVwbGFjZWRFdmVudCkgcmVzdWx0KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkgewotCQkJCQkJCS8vIHByb2JhYmx5IG1vcmUgZWZmaWNpZW50IHRvIG1hcmsgb2xkIHJlZ2lvbnMgYXMKLQkJCQkJCQkvLyAnZGVsZXRlZCcgYXQgdGhlIHRpbWUKLQkJCQkJCQkvLyB0aGF0IGFyZSBkZXRlcm1pbmVkIHRvIGJlIGRlbGV0ZWQsIGJ1dCBJJ2xsIGRvCi0JCQkJCQkJLy8gaGVyZQotCQkJCQkJCS8vIGluIHRoZW4gY2VudHJhbCBzcG90Ci0JCQkJCQkJLy8gZm9yIHByb2dyYW1taW5nIGVhc2UuCi0JCQkJCQkJdXBkYXRlRGVsZXRlZEZpZWxkcygoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIHJlc3VsdCk7Ci0JCQkJCQkJZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkgcmVzdWx0KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBOb0NoYW5nZUV2ZW50KSB7Ci0JCQkJCQkJCWZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCgoTm9DaGFuZ2VFdmVudCkgcmVzdWx0KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCS8vIGlmIGhlcmUsIHRoaXMgbWVhbnMgYSBuZXcgZXZlbnQgd2FzIGNyZWF0ZWQKLQkJCQkJCQkJLy8gYW5kIG5vdCBoYW5kbGVkIGhlcmUKLQkJCQkJCQkJLy8ganVzdCBzZW5kIGEgbm8gZXZlbnQgdW50aWwgdGhpcyBpc3N1ZSBpcwotCQkJCQkJCQkvLyByZXNvbHZlZC4KLQkJCQkJCQkJTm9DaGFuZ2VFdmVudCBub0NoYW5nZUV2ZW50ID0gbmV3IE5vQ2hhbmdlRXZlbnQodGhpcywgcmVxdWVzdGVyLCBjaGFuZ2VzLCBzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgpOwotCQkJCQkJCQlub0NoYW5nZUV2ZW50LnJlYXNvbiA9IE5vQ2hhbmdlRXZlbnQuTk9fRVZFTlQ7Ci0JCQkJCQkJCWZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChub0NoYW5nZUV2ZW50KTsKLQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlByb2dyYW0gRXJyb3I6IHVuZXhwZWN0ZWQgc3RydWN0dXJlZCBkb2N1bWVudCBldmVudDogIiArIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudE9ubHkpIHsKLQkJCQlsb25nIHN0b3BTdHJlYW1UaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IFRvdGFsIFRpbWUgZm9yIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZXZlbnQgc2lnbmFsaW5nL3Byb2Nlc3NpbmcgaW4gcmVwbGFjZVRleHQ6ICIgKyAoc3RvcFN0cmVhbVRpbWUgLSBzdGFydFN0cmVhbVRpbWUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmVzdW1lUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNsZW5ndGgoKQotCSAqLwotCXB1YmxpYyBpbnQgbGVuZ3RoKCkgewotCi0JCXJldHVybiBnZXRMZW5ndGgoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbWFrZVJlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCkgewotCQltYWtlUmVhZE9ubHkoc3RhcnRPZmZzZXQsIGxlbmd0aCwgZmFsc2UsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYWtlUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoLCBib29sZWFuIGNhbkluc2VydEJlZm9yZSwgYm9vbGVhbiBjYW5JbnNlcnRBZnRlcikgewkKLQkJLy8gZG9lc24ndCBtYWtlIHNlbnNlIHRvIGhhdmUgYSByZWFkb25seSByZWdpb24gb2YgMCBsZW5ndGgsCi0JCS8vIHNvIHdlJ2xsIGlnbm9yZSB0aG9zZSByZXF1ZXN0cwotCQlpZiAobGVuZ3RoIDw9IDApCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBhZmZlY3RlZFRleHQgPSB0aGlzLmdldChzdGFydE9mZnNldCwgbGVuZ3RoKTsKLQkJLy8gYSBkb2N1bWVudCBldmVudCBmb3IgInJlYWQgb25seSIgY2hhbmdlIC4uLiBtdXN0Ci0JCS8vIGJlIGZvbGxvd2VkIGJ5ICJubyBjaGFuZ2UiIHN0cnVjdHVyZWREb2N1bWVudCBldmVudAotCQkvLyBmRG9jdW1lbnRFdmVudCA9IG5ldyBEb2N1bWVudEV2ZW50KHRoaXMsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgsCi0JCS8vIGFmZmVjdGVkVGV4dCk7Ci0JCWZpcmVSZWFkT25seUFib3V0VG9CZUNoYW5nZWQoKTsKLQkJLy8gaWYgKGNvbnRhaW5zUmVhZE9ubHkoc3RhcnRPZmZzZXQsIGxlbmd0aCkpIHsKLQkJLy8gYWRqdXN0UmVhZE9ubHlSZWdpb25zKHN0YXJ0T2Zmc2V0LCBsZW5ndGgpOwotCQkvLyB9IGVsc2UgewotCQkvLyB3ZSBjYW4gYmxpbmRseSBhZGQgY2F0ZWdvcnksIHNpbmNlIG5vIGhhcm0gZG9uZSBpZiBhbHJlYWR5Ci0JCS8vIGV4aXN0cy4KLQkJYWRkUG9zaXRpb25DYXRlZ29yeShSRUFEX09OTFlfUkVHSU9OU19DQVRFR09SWSk7Ci0JCVBvc2l0aW9uIG5ld1Bvc2l0aW9uID0gbmV3IFJlYWRPbmx5UG9zaXRpb24oc3RhcnRPZmZzZXQsIGxlbmd0aCwgY2FuSW5zZXJ0QmVmb3JlKTsKLQkJdHJ5IHsKLQkJCWFkZFBvc2l0aW9uKFJFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZLCBuZXdQb3NpdGlvbik7Ci0JCQkvLyBGSVhNRTogbmVlZCB0byBjaGFuZ2UgQVBJIHRvIHBhc3MgaW4gcmVxdWVzdGVyLCBzbyB0aGlzIGV2ZW50Ci0JCQkvLyBjYW4gYmUKLQkJCS8vIGNyZWF0ZWQgY29ycmVjdGx5LCBpbnN0ZWFkIG9mIHVzaW5nIG51bGwuCi0JCQlOb0NoYW5nZUV2ZW50IG5vQ2hhbmdlRXZlbnQgPSBuZXcgTm9DaGFuZ2VFdmVudCh0aGlzLCBudWxsLCBhZmZlY3RlZFRleHQsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgpOwotCQkJbm9DaGFuZ2VFdmVudC5yZWFzb24gPSBOb0NoYW5nZUV2ZW50LlJFQURfT05MWV9TVEFURV9DSEFOR0U7Ci0JCQlmaXJlUmVhZE9ubHlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChub0NoYW5nZUV2ZW50KTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gZm9yIG5vdywgbG9nIGFuZCBpZ25vcmUuIFBlcmhhcHMgbGF0ZXIgd2UKLQkJCS8vIGNvdWxkIGFkanVzdCB0byBoYW5kbGUgc29tZSBjYXNlcz8KLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oKCJjb3VsZCBub3QgY3JlYXRlIHJlYWRvbmx5IHJlZ2lvbiBhdCAiICsgc3RhcnRPZmZzZXQgKyAiIHRvICIgKyBsZW5ndGgpLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkIG5ldmVyIG9jY3VyLCBzaW5jZSB3ZSBhZGQgY2F0ZWdvcnkKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBuZXdJbnN0YW5jZSgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBuZXdJbnN0YW5jZSA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkubmV3SW5zdGFuY2UoKSk7Ci0JCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIG5ld0luc3RhbmNlKS5zZXRSZVBhcnNlcihnZXRSZVBhcnNlcigpLm5ld0luc3RhbmNlKCkpOwotCQlpZiAoZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgewotCQkJbmV3SW5zdGFuY2Uuc2V0RG9jdW1lbnRQYXJ0aXRpb25lcigoKFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIpIGdldERvY3VtZW50UGFydGl0aW9uZXIoKSkubmV3SW5zdGFuY2UoKSk7Ci0JCQluZXdJbnN0YW5jZS5nZXREb2N1bWVudFBhcnRpdGlvbmVyKCkuY29ubmVjdChuZXdJbnN0YW5jZSk7Ci0JCX0KLQkJbmV3SW5zdGFuY2Uuc2V0TGluZURlbGltaXRlcihnZXRMaW5lRGVsaW1pdGVyKCkpOwotCQlpZiAoZ2V0RW5jb2RpbmdNZW1lbnRvKCkgIT0gbnVsbCkgewotCQkJbmV3SW5zdGFuY2Uuc2V0RW5jb2RpbmdNZW1lbnRvKChFbmNvZGluZ01lbWVudG8pIGdldEVuY29kaW5nTWVtZW50bygpLmNsb25lKCkpOwotCQl9Ci0JCXJldHVybiBuZXdJbnN0YW5jZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LklSZWdpb25Db21wYXJpYmxlI3JlZ2lvbk1hdGNoZXMoaW50LAotCSAqICAgICAgaW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXMoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlJVGV4dFN0b3JlIHN0b3JlID0gZ2V0U3RvcmUoKTsKLQkJaWYgKHN0b3JlIGluc3RhbmNlb2YgSVJlZ2lvbkNvbXBhcmlibGUpIHsKLQkJCXJlc3VsdCA9ICgoSVJlZ2lvbkNvbXBhcmlibGUpIHN0b3JlKS5yZWdpb25NYXRjaGVzKG9mZnNldCwgbGVuZ3RoLCBzdHJpbmdUb0NvbXBhcmUpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gZ2V0KG9mZnNldCwgbGVuZ3RoKS5lcXVhbHMoc3RyaW5nVG9Db21wYXJlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJSVRleHRTdG9yZSBzdG9yZSA9IGdldFN0b3JlKCk7Ci0JCWlmIChzdG9yZSBpbnN0YW5jZW9mIElSZWdpb25Db21wYXJpYmxlKSB7Ci0JCQlyZXN1bHQgPSAoKElSZWdpb25Db21wYXJpYmxlKSBzdG9yZSkucmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2Uob2Zmc2V0LCBsZW5ndGgsIHN0cmluZ1RvQ29tcGFyZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBnZXQob2Zmc2V0LCBsZW5ndGgpLmVxdWFsc0lnbm9yZUNhc2Uoc3RyaW5nVG9Db21wYXJlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24jcmVnaXN0ZXJQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UpCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZShJRG9jdW1lbnRMaXN0ZW5lciBvd25lciwgSURvY3VtZW50RXh0ZW5zaW9uLklSZXBsYWNlIHJlcGxhY2UpIHsKLQkJaWYgKGZBY2NlcHRQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZXMpIHsKLQkJCWlmIChmUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXMgPT0gbnVsbCkKLQkJCQlmUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJZlBvc3ROb3RpZmljYXRpb25DaGFuZ2VzLmFkZChuZXcgUmVnaXN0ZXJlZFJlcGxhY2Uob3duZXIsIHJlcGxhY2UpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VMb2NrKCkgewotCQkvLyBkbyBub3RoaW5nIGhlcmUgaW4gc3VwZXIgY2xhc3MKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJaWYgKChmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycyAhPSBudWxsKSAmJiAobGlzdGVuZXIgIT0gbnVsbCkpIHsKLQkJCQkvLyBpZiBpdHMgbm90IGluIHRoZSBsaXN0ZW5lcnMsIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCQlpbnQgb2xkU2l6ZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzLmxlbmd0aDsKLQkJCQkJaW50IG5ld1NpemUgPSBvbGRTaXplIC0gMTsKLQkJCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRTaXplOyBpKyspIHsKLQkJCQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikgeyAvLyBpZ25vcmUKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlCi0JCQkJCQkJLy8gcmVtb3ZpbmcKLQkJCQkJCQluZXdMaXN0ZW5lcnNbaW5kZXgrK10gPSBmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyc1tpXTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBub3cgdGhhdCB3ZSBoYXZlIGEgbmV3IGFycmF5LCBsZXQncyBzd2l0Y2ggaXQgZm9yIHRoZQotCQkJCQkvLyBvbGQKLQkJCQkJLy8gb25lCi0JCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJlbW92ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzICE9IG51bGwpICYmIChsaXN0ZW5lciAhPSBudWxsKSkgewotCQkJCS8vIGlmIGl0cyBub3QgaW4gdGhlIGxpc3RlbmVycywgd2UnbGwgaWdub3JlIHRoZSByZXF1ZXN0Ci0JCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJCWludCBvbGRTaXplID0gZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJCQlPYmplY3RbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W25ld1NpemVdOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7IC8vIGlnbm9yZQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gY29weSBvbGQgdG8gbmV3IGlmIGl0cyBub3QgdGhlIG9uZSB3ZSBhcmUKLQkJCQkJCQkvLyByZW1vdmluZwotCQkJCQkJCW5ld0xpc3RlbmVyc1tpbmRleCsrXSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzW2ldOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzIHN3aXRjaCBpdCBmb3IgdGhlCi0JCQkJCS8vIG9sZAotCQkJCQkvLyBvbmUKLQkJCQkJZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycyAhPSBudWxsKSAmJiAobGlzdGVuZXIgIT0gbnVsbCkpIHsKLQkJCQkvLyBpZiBpdHMgbm90IGluIHRoZSBsaXN0ZW5lcnMsIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQkJaW50IG9sZFNpemUgPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJCQlPYmplY3RbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W25ld1NpemVdOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikgeyAvLyBpZ25vcmUKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlCi0JCQkJCQkJLy8gcmVtb3ZpbmcKLQkJCQkJCQluZXdMaXN0ZW5lcnNbaW5kZXgrK10gPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnNbaV07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3Mgc3dpdGNoIGl0IGZvciB0aGUKLQkJCQkJLy8gb2xkCi0JCQkJCS8vIG9uZQotCQkJCQlmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihJRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoKGZEb2N1bWVudExpc3RlbmVycyAhPSBudWxsKSAmJiAobGlzdGVuZXIgIT0gbnVsbCkpIHsKLQkJCQkvLyBpZiBpdHMgbm90IGluIHRoZSBsaXN0ZW5lcnMsIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZkRvY3VtZW50TGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQkJaW50IG9sZFNpemUgPSBmRG9jdW1lbnRMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJCQlJRG9jdW1lbnRMaXN0ZW5lcltdIG5ld0xpc3RlbmVycyA9IG5ldyBJRG9jdW1lbnRMaXN0ZW5lcltuZXdTaXplXTsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRTaXplOyBpKyspIHsKLQkJCQkJCWlmIChmRG9jdW1lbnRMaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpIHsgLy8gaWdub3JlCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBjb3B5IG9sZCB0byBuZXcgaWYgaXRzIG5vdCB0aGUgb25lIHdlIGFyZQotCQkJCQkJCS8vIHJlbW92aW5nCi0JCQkJCQkJbmV3TGlzdGVuZXJzW2luZGV4KytdID0gZkRvY3VtZW50TGlzdGVuZXJzW2ldOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzIHN3aXRjaCBpdCBmb3IgdGhlCi0JCQkJCS8vIG9sZAotCQkJCQkvLyBvbmUKLQkJCQkJZkRvY3VtZW50TGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNyZW1vdmVEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcihJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlBc3NlcnQuaXNOb3ROdWxsKGxpc3RlbmVyKTsKLQkJCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCQlmRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIDxjb2RlPlBvc2l0aW9uPC9jb2RlPiBmcm9tIHRoZSBkb2N1bWVudCdzIGRlZmF1bHQKLQkgKiBwb3NpdGlvbiBjYXRlZ29yeS4gVGhlIGRlZmF1bHQgcG9zaXRpb24gY2F0ZWdvcnkgaXMgdG8gYmUgZGVmaW5lZCBieQotCSAqIHRoZSBpbXBsZW1lbnRlcnMuIElmIHRoZSBwb3NpdGlvbiBpcyBub3QgcGFydCBvZiB0aGUgZG9jdW1lbnQncyBkZWZhdWx0Ci0JICogY2F0ZWdvcnkgbm90aGluZyBoYXBwZW5zLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB7Ci0JCWdldFBvc2l0aW9uTWFuYWdlcigpLnJlbW92ZVBvc2l0aW9uKHBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNyZW1vdmVQb3NpdGlvbgotCSAqIEBleGNlcHRpb24gQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHRoZSBjYXRlZ29yeSBpcyBub3QgZGVmaW5lZCBmb3IgdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb24oU3RyaW5nIGNhdGVnb3J5LCBQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5yZW1vdmVQb3NpdGlvbihjYXRlZ29yeSwgcG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I3JlbW92ZVBvc2l0aW9uQ2F0ZWdvcnkKLQkgKiBAZXhjZXB0aW9uIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiB0aGUgY2F0ZWdvcnkgaXMgbm90IGRlZmluZWQgZm9yIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCWdldFBvc2l0aW9uTWFuYWdlcigpLnJlbW92ZVBvc2l0aW9uQ2F0ZWdvcnkoY2F0ZWdvcnkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I3JlbW92ZVBvc2l0aW9uVXBkYXRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uVXBkYXRlcihJUG9zaXRpb25VcGRhdGVyIHVwZGF0ZXIpIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkucmVtb3ZlUG9zaXRpb25VcGRhdGVyKHVwZGF0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGRvY3VtZW50IGxpc3RlbmVyIGZyb20gdGVoIGRvY3VtZW50J3MgbGlzdCBvZgotCSAqIHByZW5vdGlmaWVkIGRvY3VtZW50IGxpc3RlbmVycy4gSWYgdGhlIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkIHdpdGgKLQkgKiB0aGUgZG9jdW1lbnQgbm90aGluZyBoYXBwZW5zLgotCSAqIDxwPgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBmb3IgcHVibGljIHVzZSwgaXQgbWF5IG9ubHkgYmUgY2FsbGVkIGJ5Ci0JICogaW1wbGVtZW50ZXJzIG9mIDxjb2RlPklEb2N1bWVudEFkYXB0ZXI8L2NvZGU+IGFuZCBvbmx5IGlmIHRob3NlCi0JICogaW1wbGVtZW50ZXJzIG5lZWQgdG8gaW1wbGVtZW50IDxjb2RlPklEb2N1bWVudExpc3RlbmVyPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRBZGFwdGVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZAotCSAqIAotCSAqIEBzZWUgI2FkZFByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcihJRG9jdW1lbnRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciBkb2N1bWVudEFkYXB0ZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycywgZG9jdW1lbnRBZGFwdGVyKSkgewotCQkJCWludCBwcmV2aW91c1NpemUgPSBmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycy5sZW5ndGg7Ci0JCQkJaWYgKHByZXZpb3VzU2l6ZSA+IDEpIHsKLQkJCQkJSURvY3VtZW50TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBuZXcgSURvY3VtZW50TGlzdGVuZXJbcHJldmlvdXNTaXplIC0gMV07Ci0JCQkJCWludCBwcmV2aW91c0luZGV4ID0gMDsKLQkJCQkJaW50IG5ld0luZGV4ID0gMDsKLQkJCQkJd2hpbGUgKHByZXZpb3VzSW5kZXggPCBwcmV2aW91c1NpemUpIHsKLQkJCQkJCWlmIChmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyc1twcmV2aW91c0luZGV4XSAhPSBkb2N1bWVudEFkYXB0ZXIpCi0JCQkJCQkJbGlzdGVuZXJzW25ld0luZGV4KytdID0gZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnNbcHJldmlvdXNJbmRleF07Ci0JCQkJCQlwcmV2aW91c0luZGV4Kys7Ci0JCQkJCX0KLQkJCQkJZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycyA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgZm9yIElOVEVSTkFMIFVTRSBPTkxZIGFuZCBpcyBOT1QgQVBJLgotCSAqIAotCSAqIFJlYnVpbGRzIHRoZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY2hhaW4gZnJvbSB0aGUgZXhpc3RpbmcgdGV4dC4KLQkgKiBGaWxlQnVmZmVyIHN1cHBvcnQgZG9lcyBub3QgYWxsb3cgY2xpZW50cyB0byBrbm93IHRoZSBkb2N1bWVudCdzCi0JICogbG9jYXRpb24gYmVmb3JlIHRoZSB0ZXh0IGNvbnRlbnRzIGFyZSBzZXQuCi0JICogCi0JICogQHNlZSBzZXQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGFyc2UoT2JqZWN0IHJlcXVlc3RlcikgewotCQlzdG9wUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKTsKLQkJY2xlYXJSZWFkT25seSgpOwotCi0JCXRyeSB7Ci0JCQlhY3F1aXJlTG9jaygpOwotCi0JCQlDaGFyU2VxdWVuY2VSZWFkZXIgc3ViU2V0VGV4dFN0b3JlUmVhZGVyID0gbmV3IENoYXJTZXF1ZW5jZVJlYWRlcigoQ2hhclNlcXVlbmNlKSBnZXRTdG9yZSgpLCAwLCBnZXRTdG9yZSgpLmdldExlbmd0aCgpKTsKLQkJCXJlc2V0UGFyc2VyKHN1YlNldFRleHRTdG9yZVJlYWRlciwgMCk7Ci0JCQkvLwotCQkJc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oZ2V0UGFyc2VyKCkuZ2V0RG9jdW1lbnRSZWdpb25zKCkpOwotCQkJLy8gd2hlbiBzdGFydGluZyBhZnJlc2gsIG91ciBjYWNoZWROb2RlIHNob3VsZCBiZSBvdXIgZmlyc3ROb2RlLAotCQkJLy8gc28gYmUgc3VyZSB0byBpbml0aWFsaXplIHRoZSBmaXJzdE5vZGUgYW5kIGxhc3ROb2RlCi0JCQlpbml0aWFsaXplRmlyc3RBbmRMYXN0RG9jdW1lbnRSZWdpb24oKTsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLnNldFBhcmVudERvY3VtZW50KGdldENhY2hlZERvY3VtZW50UmVnaW9uKCksIHRoaXMpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJcmVsZWFzZUxvY2soKTsKLQkJfQotCi0JCXJlc3VtZVBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjcmVwbGFjZQotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiBwb3NpdGlvbiBpcyBub3QgYSB2YWxpZCByYW5nZSBpbiB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBsYWNlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0ZXh0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGU6IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OnJlcGxhY2UoaW50LCBpbnQsIFN0cmluZykgLi4uLiBpdHMgYmV0dGVyIHRvIHVzZSByZXBsYWNlVGV4dChzb3VyY2UsIHN0cmluZywgaW50LCBpbnQpIEFQSSBmb3Igc3RydWN0dXJlZERvY3VtZW50IHVwZGF0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgbGVuZ3RoLCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSB0ZXh0IHdpdGggIm5ld1RleHQiIHN0YXJ0aW5nIGF0IHBvc2l0aW9uICJzdGFydCIgZm9yIGEKLQkgKiBsZW5ndGggb2YgInJlcGxhY2VMZW5ndGgiLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBwb3MKLQkgKiAgICAgICAgICAgIHN0YXJ0IG9mZnNldCBvZiB0ZXh0IHRvIHJlcGxhY2UgTm9uZSBvZiB0aGUgb2Zmc2V0cyBpbmNsdWRlCi0JICogICAgICAgICAgICBkZWxpbWl0ZXJzIG9mIHByZWNlZWRpbmcgbGluZXMuIE9mZnNldCAwIGlzIHRoZSBmaXJzdAotCSAqICAgICAgICAgICAgY2hhcmFjdGVyIG9mIHRoZSBkb2N1bWVudC4KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICBzdGFydCBvZmZzZXQgb2YgdGV4dCB0byByZXBsYWNlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHN0YXJ0IG9mZnNldCBvZiB0ZXh0IHRvIHJlcGxhY2UKLQkgKiAgICAgICAgICAgIDxwPgotCSAqICAgICAgICAgICAgSW1wbGVtZW50b3JzIGhhdmUgdG8gbm90aWZ5IFRleHRDaGFuZ2VkIGxpc3RlbmVycyBhZnRlciB0aGUKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgaGFzIGJlZW4gdXBkYXRlZC4gVGhlIFRleHRDaGFuZ2VkRXZlbnQgc2hvdWxkIGJlIHNldAotCSAqICAgICAgICAgICAgYXMgZm9sbG93czoKLQkgKiAKLQkgKiBldmVudC50eXBlID0gU1dULlRleHRSZXBsYWNlZCBldmVudC5zdGFydCA9IHN0YXJ0IG9mIHRoZSByZXBsYWNlZCB0ZXh0Ci0JICogZXZlbnQubnVtUmVwbGFjZWRMaW5lcyA9IG51bWJlciBvZiByZXBsYWNlZCBsaW5lcyBldmVudC5udW1OZXdMaW5lcyA9Ci0JICogbnVtYmVyIG9mIG5ldyBsaW5lcyBldmVudC5yZXBsYWNlZExlbmd0aCA9IGxlbmd0aCBvZiB0aGUgcmVwbGFjZWQgdGV4dAotCSAqIGV2ZW50Lm5ld0xlbmd0aCA9IGxlbmd0aCBvZiB0aGUgbmV3IHRleHQKLQkgKiAKLQkgKiBOT1RFOiBudW1OZXdMaW5lcyBpcyB0aGUgbnVtYmVyIG9mIGluc2VydGVkIGxpbmVzIGFuZCBudW1SZXBsYWNlZExpbmVzCi0JICogaXMgdGhlIG51bWJlciBvZiBkZWxldGVkIGxpbmVzIGJhc2VkIG9uIHRoZSBjaGFuZ2UgdGhhdCBvY2N1cnMKLQkgKiB2aXN1YWxseS4gRm9yIGV4YW1wbGU6Ci0JICogCi0JICogcmVwbGFjZWRUZXh0IG5ld1RleHQgbnVtUmVwbGFjZWRMaW5lcyBudW1OZXdMaW5lcyAiIiAiXG4iIDAgMSAiXG5cbiIKLQkgKiAiYSIgMiAwICJhIiAiXG5cbiIgMCAyCi0JICovCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaW4gdGVybXMgb2YgdGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RlciwgaW50IHBvcywgaW50IGxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGxlbmd0aCA9PSAwICYmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSkKLQkJCXJldHVybiByZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHBvcywgbGVuZ3RoLCB0ZXh0LCBnZXRNb2RpZmljYXRpb25TdGFtcCgpLCB0cnVlKTsKLQkJZWxzZQotCQkJcmV0dXJuIHJlcGxhY2VUZXh0KHJlcXVlc3RlciwgcG9zLCBsZW5ndGgsIHRleHQsIGdldE5leHRNb2RpZmljYXRpb25TdGFtcCgpLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RlciwgaW50IHN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyBjaGFuZ2VzLCBib29sZWFuIGlnbm9yZVJlYWRPbmx5U2V0dGluZ3MpIHsKLQkJbG9uZyBtb2RpZmljYXRpb25TdGFtcDsKLQkJCi0JCWlmIChyZXBsYWNlbWVudExlbmd0aCA9PSAwICYmIChjaGFuZ2VzID09IG51bGwgfHwgY2hhbmdlcy5sZW5ndGgoKSA9PSAwKSkKLQkJCW1vZGlmaWNhdGlvblN0YW1wID0gZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJZWxzZQotCQkJbW9kaWZpY2F0aW9uU3RhbXAgPSBnZXROZXh0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJCi0JCXJldHVybiByZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcywgbW9kaWZpY2F0aW9uU3RhbXAsIGlnbm9yZVJlYWRPbmx5U2V0dGluZ3MpOwotCX0KLQkKLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGxhY2VUZXh0KE9iamVjdCByZXF1ZXN0ZXIsIGludCBzdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgY2hhbmdlcywgbG9uZyBtb2RpZmljYXRpb25TdGFtcCwgYm9vbGVhbiBpZ25vcmVSZWFkT25seVNldHRpbmdzKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGV2ZW50ID0gaW50ZXJuYWxSZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcywgbW9kaWZpY2F0aW9uU3RhbXAsIGlnbm9yZVJlYWRPbmx5U2V0dGluZ3MpOwotCQlyZXR1cm4gZXZlbnQ7Ci0JfQotCi0Jdm9pZCByZXNldFBhcnNlcihpbnQgc3RhcnRPZmZzZXQsIGludCBlbmRPZmZzZXQpIHsKLQotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCUlUZXh0U3RvcmUgdGV4dFN0b3JlID0gZ2V0U3RvcmUoKTsKLQkJaWYgKHRleHRTdG9yZSBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZSkgewotCQkJQ2hhclNlcXVlbmNlUmVhZGVyIHN1YlNldFRleHRTdG9yZVJlYWRlciA9IG5ldyBDaGFyU2VxdWVuY2VSZWFkZXIoKENoYXJTZXF1ZW5jZSkgdGV4dFN0b3JlLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOwotCQkJcGFyc2VyLnJlc2V0KHN1YlNldFRleHRTdG9yZVJlYWRlciwgc3RhcnRPZmZzZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIG5ld05vZGVUZXh0ID0gZ2V0KHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCk7Ci0JCQlwYXJzZXIucmVzZXQobmV3Tm9kZVRleHQsIHN0YXJ0T2Zmc2V0KTsKLQotCQl9Ci0KLQl9Ci0KLQl2b2lkIHJlc2V0UGFyc2VyKFJlYWRlciByZWFkZXIsIGludCBzdGFydE9mZnNldCkgewotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCXBhcnNlci5yZXNldChyZWFkZXIsIHN0YXJ0T2Zmc2V0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3Jlc3VtZVBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN1bWVQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpIHsKLQkJLS1mU3RvcHBlZENvdW50OwotCQlpZiAoZlN0b3BwZWRDb3VudCA9PSAwICYmIGZSZWVudHJhbmNlQ291bnQgPT0gMCkKLQkJCWV4ZWN1dGVQb3N0Tm90aWZpY2F0aW9uQ2hhbmdlcygpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGluIHN1cGVyY2xhc3MgaW4gMy4wIC0gdXNlIGEgRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIKLQkgKiAgICAgICAgICAgICBkaXJlY3RseQotCSAqIEBzZWUgSURvY3VtZW50I3NlYXJjaAotCSAqLwotCXB1YmxpYyBpbnQgc2VhcmNoKGludCBzdGFydFBvc2l0aW9uLCBTdHJpbmcgZmluZFN0cmluZywgYm9vbGVhbiBmb3J3YXJkU2VhcmNoLCBib29sZWFuIGNhc2VTZW5zaXRpdmUsIGJvb2xlYW4gd2hvbGVXb3JkKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQkvLyAoZG13KSBJIGFkZGVkIHRoaXMgd2FybmluZywgdG8ga25vdyBpZiBzdGlsbCBiZWluZyB1c2VkLiBJJ20gbm90Ci0JCS8vIHN1cmUgaXQKLQkJLy8gd29ya3MgYXMgZXhwZWN0ZWQgYW55IGxvbmdlci4KLQkJLy8gYnV0IHRoZSB3YXJuaW5nIHNob3VsZCBiZSByZW1vdmVkLCBvbmNlIGtub3cuCi0JCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJXQVJOSU5HOiB1c2luZyB1bnN1cHBvcnRlZCBkZXByZWNhdGVkIG1ldGhvZCAnc2VhcmNoJyIpOyAvLyROT04tTkxTLTEkCi0JCWludCBvZmZzZXQgPSAtMTsKLQkJSVJlZ2lvbiBtYXRjaCA9IG5ldyBGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcih0aGlzKS5maW5kKHN0YXJ0UG9zaXRpb24sIGZpbmRTdHJpbmcsIGZvcndhcmRTZWFyY2gsIGNhc2VTZW5zaXRpdmUsIHdob2xlV29yZCwgZmFsc2UpOwotCQlpZiAobWF0Y2ggIT0gbnVsbCkgewotCQkJb2Zmc2V0ID0gbWF0Y2guZ2V0T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNzZXRUZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0KFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGU6IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OnNldFRleHQoU3RyaW5nKSAuLi4uIGl0cyBiZXR0ZXIgdG8gdXNlIHNldFRleHQoc291cmNlLCBzdHJpbmcpIEFQSSBmb3Igc3RydWN0dXJlZERvY3VtZW50IHVwZGF0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNldFRleHQobnVsbCwgc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1heSBiZSBtYXJrZWQgcHVibGljLCBidXQgc2hvdWxkIGJlIHBhY2thZ2VkIHByb3RlY3RlZCwgb25jZQotCSAqIHJlZmFjdG9yaW5nIGlzIGNvbXBsZXRlIChpbiBvdGhlciB3b3Jkcywgbm90IGZvciBjbGllbnQgdXNlKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWRSZWdpb24pIHsKLQkJaWYgKFVTRV9MT0NBTF9USFJFQUQpIHsKLQkJCWZDdXJyZW50RG9jdW1lbnRSZWdpb25DYWNoZS5zZXQoc3RydWN0dXJlZFJlZ2lvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljYWNoZWREb2N1bWVudFJlZ2lvbiA9IHN0cnVjdHVyZWRSZWdpb247Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkb2N1bWVudCdzIHBhcnRpdGlvbmVyLgotCSAqIAotCSAqIEBzZWUgSURvY3VtZW50UGFydGl0aW9uZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFBhcnRpdGlvbmVyKElEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKSB7Ci0JCXNldERvY3VtZW50UGFydGl0aW9uZXIoSURvY3VtZW50RXh0ZW5zaW9uMy5ERUZBVUxUX1BBUlRJVElPTklORywgcGFydGl0aW9uZXIpOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihTdHJpbmcgcGFydGl0aW9uaW5nLCBJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lcikgewotCQlpZiAocGFydGl0aW9uZXIgPT0gbnVsbCkgewotCQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmVycyAhPSBudWxsKSB7Ci0JCQkJZkRvY3VtZW50UGFydGl0aW9uZXJzLnJlbW92ZShwYXJ0aXRpb25pbmcpOwotCQkJCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25lcnMuc2l6ZSgpID09IDApCi0JCQkJCWZEb2N1bWVudFBhcnRpdGlvbmVycyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzID09IG51bGwpCi0JCQkJZkRvY3VtZW50UGFydGl0aW9uZXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZEb2N1bWVudFBhcnRpdGlvbmVycy5wdXQocGFydGl0aW9uaW5nLCBwYXJ0aXRpb25lcik7Ci0JCX0KLQkJRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkRXZlbnQodGhpcyk7Ci0JCWV2ZW50LnNldFBhcnRpdGlvbkNoYW5nZShwYXJ0aXRpb25pbmcsIDAsIGdldExlbmd0aCgpKTsKLQkJZmlyZURvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmdNZW1lbnRvKEVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8pIHsKLQkJdGhpcy5lbmNvZGluZ01lbWVudG8gPSBlbmNvZGluZ01lbWVudG87Ci0JfQotCi0Jdm9pZCBzZXRGaXJzdERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCWZpcnN0RG9jdW1lbnRSZWdpb24gPSByZWdpb247Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNCNzZXRJbml0aWFsTGluZURlbGltaXRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxMaW5lRGVsaW1pdGVyKFN0cmluZyBsaW5lRGVsaW1pdGVyKSB7Ci0JCS8vIG1ha2Ugc3VyZSBvdXIgcHJlZmVycmVkIGRlbGltaXRlciBpcwotCQkvLyBvbmUgb2YgdGhlIGxlZ2FsIG9uZXMKLQkJaWYgKFV0aWxpdGllcy5jb250YWluc1N0cmluZyhnZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCksIGxpbmVEZWxpbWl0ZXIpKSB7Ci0JCQlmSW5pdGlhbExpbmVEZWxpbWl0ZXI9IGxpbmVEZWxpbWl0ZXI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX0RPQ1VNRU5UKQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJBdHRlbXB0IHRvIHNldCBsaW5lZGVsaW1pdGVyIHRvIG5vbi1sZWdhbCBkZWxpbWl0ZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlmSW5pdGlhbExpbmVEZWxpbWl0ZXIgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRTdHJpbmcoUGxhdGZvcm0uUElfUlVOVElNRSwgUGxhdGZvcm0uUFJFRl9MSU5FX1NFUEFSQVRPUiwgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpLCBuZXcgSVNjb3BlQ29udGV4dFtdIHsgbmV3IEluc3RhbmNlU2NvcGUoKSB9KTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQl2b2lkIHNldExhc3REb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlsYXN0RG9jdW1lbnRSZWdpb24gPSByZWdpb247Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQjc2V0TGluZURlbGltaXRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmVEZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcikgewotCQlzZXRJbml0aWFsTGluZURlbGltaXRlcihkZWxpbWl0ZXIpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRvY3VtZW50J3MgbGluZSB0cmFja2VyLiBNdXN0IGJlIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0JICogdGhlIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSB0cmFja2VyCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQncyBsaW5lIHRyYWNrZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TGluZVRyYWNrZXIoSUxpbmVUcmFja2VyIHRyYWNrZXIpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbCh0cmFja2VyKTsKLQkJZlRyYWNrZXIgPSB0cmFja2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcnNlcihSZWdpb25QYXJzZXIgbmV3UGFyc2VyKSB7Ci0JCWludGVybmFsX3NldFBhcnNlcihuZXdQYXJzZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwb3NpdGlvbk1hbmFnZXIKLQkgKiAgICAgICAgICAgIFRoZSBwb3NpdGlvbk1hbmFnZXIgdG8gc2V0LgotCSAqLwotCS8vIFRPRE86IG1ha2UgcHJpdmF0ZSBpcyBuZWVkZWQsIGVsc2UgcmVtb3ZlCi0Jdm9pZCBzZXRQb3NpdGlvbk1hbmFnZXIoR2VuZXJpY1Bvc2l0aW9uTWFuYWdlciBwb3NpdGlvbk1hbmFnZXIpIHsKLQkJZlBvc2l0aW9uTWFuYWdlciA9IHBvc2l0aW9uTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZVBhcnNlcihJU3RydWN0dXJlZFRleHRSZVBhcnNlciBuZXdSZVBhcnNlcikgewotCQlmUmVQYXJzZXIgPSBuZXdSZVBhcnNlcjsKLQkJaWYgKGZSZVBhcnNlciAhPSBudWxsKSB7Ci0JCQlmUmVQYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50KHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaW4gdGVybXMgb2YgdGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgc2V0VGV4dChPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgdGhlU3RyaW5nKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IHJlcGxhY2VUZXh0KHJlcXVlc3RlciwgMCwgZ2V0TGVuZ3RoKCksIHRoZVN0cmluZywgZ2V0TmV4dE1vZGlmaWNhdGlvblN0YW1wKCksIHRydWUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRvY3VtZW50J3MgdGV4dCBzdG9yZS4gTXVzdCBiZSBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLQkgKiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc3RvcmUKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCdzIHRleHQgc3RvcmUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0VGV4dFN0b3JlKElUZXh0U3RvcmUgc3RvcmUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChzdG9yZSk7Ci0JCWZTdG9yZSA9IHN0b3JlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVuZG9NYW5hZ2VyKElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVuZG9NYW5hZ2VyKSB7Ci0KLQkJLy8gaWYgdGhlIHVuZG8gbWFuYWdlciBoYXMgYWxyZWFkeSBiZWVuIHNldCwgdGhlbgotCQkvLyBmYWlsIGZhc3QsIHNpbmNlIGNoYW5naW5nIHRoZSB1bmRvIG1hbmFnZXIgd2lsbCBsZWFkCi0JCS8vIHRvIHVudXN1YWwgcmVzdWx0cyAob3IgYXQgbGVhc3QgbG9zcyBvZiB1bmRvIHN0YWNrKS4KLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsICYmIGZVbmRvTWFuYWdlciAhPSB1bmRvTWFuYWdlcikgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBjaGFuZ2UgdW5kbyBtYW5hZ2VyIG9uY2UgaXRzIGJlZW4gc2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCWZVbmRvTWFuYWdlciA9IHVuZG9NYW5hZ2VyOwotCQl9Ci0JfQotCi0KLQkvKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydFNlcXVlbnRpYWxSZXdyaXRlKGJvb2xlYW4gbm9ybWFsaXplZCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24jc3RvcFBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKSB7Ci0JCSsrZlN0b3BwZWRDb3VudDsKLQl9Ci0KLQotCS8qCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BTZXF1ZW50aWFsUmV3cml0ZSgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ujc3ViU2VxdWVuY2UoaW50LCBpbnQpCi0JICovCi0JcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgYXJnMCwgaW50IGFyZzEpIHsKLQkJcmV0dXJuIGdldChhcmcwLCBhcmcxKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZURlbGV0ZWRGaWVsZHMoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucyA9IGV2ZW50LmdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRSZWdpb25zLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gb2xkUmVnaW9ucy5pdGVtKGkpOwotCQkJc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLnNldERlbGV0ZWQodHJ1ZSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSByZS1wYXJzZXIuIE5vdGU6IHRoaXMgbWV0aG9kIG1heSBiZSAicHVibGljIiBidXQgc2hvdWxkIG9ubHkKLQkgKiBiZSBjYWxsZWQgYnkgcmUtcGFyc2VycyBpbiB0aGUgcmlnaHQgY2lyY3Vtc3RhbmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVEb2N1bWVudERhdGEoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlLCBTdHJpbmcgY2hhbmdlcykgewotCQlzdG9wUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKTsKLQkJZ2V0U3RvcmUoKS5yZXBsYWNlKHN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UsIGNoYW5nZXMpOwotCQl0cnkgewotCQkJZ2V0VHJhY2tlcigpLnJlcGxhY2Uoc3RhcnQsIGxlbmd0aFRvUmVwbGFjZSwgY2hhbmdlcyk7Ci0JCX0KLQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkIGJlIGltcG9zc2libGUgaGVyZSwgYnV0IHdpbGwgbG9nIGZvciBub3cKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJaWYgKGZQb3NpdGlvbk1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlBvc2l0aW9uTWFuYWdlci51cGRhdGVQb3NpdGlvbnMobmV3IERvY3VtZW50RXZlbnQodGhpcywgc3RhcnQsIGxlbmd0aFRvUmVwbGFjZSwgY2hhbmdlcykpOwotCQl9Ci0JCWZNb2RpZmljYXRpb25TdGFtcCsrOwotCQlmTmV4dE1vZGlmaWNhdGlvblN0YW1wPSBNYXRoLm1heChmTW9kaWZpY2F0aW9uU3RhbXAsIGZOZXh0TW9kaWZpY2F0aW9uU3RhbXApOwotCQlyZXN1bWVQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpOwotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlLCBTdHJpbmcgY2hhbmdlcykgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlJU3RydWN0dXJlZFRleHRSZVBhcnNlciByZVBhcnNlciA9IGdldFJlUGFyc2VyKCk7Ci0JCS8vIGluaXRpYWxpemUgdGhlIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIHdpdGggdGhlIHN0YW5kYXJkIGRhdGEKLQkJLy8gdGhhdCdzCi0JCS8vIGFsd2F5cyBuZWVkZWQKLQkJcmVQYXJzZXIuaW5pdGlhbGl6ZShyZXF1ZXN0ZXIsIHN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UsIGNoYW5nZXMpOwotCQlyZXN1bHQgPSByZVBhcnNlci5yZXBhcnNlKCk7Ci0JCS8vIGlmIHJlc3VsdCBpcyBudWxsIGF0IHRoaXMgcG9pbnQsIHRoZW4gdGhlcmUgbXVzdCBiZSBhbiBlcnJvciwgc2luY2UKLQkJLy8gZXZlbiBpZiB0aGVyZQotCQkvLyB3YXMgbm8gY2hhbmdlIChlaXRoZXIgZGlzYWxsb3cgZHVlIHRvIHJlYWRvbmx5LCBvciBhIHBlcnNvbiBwYXN0ZWQKLQkJLy8gdGhlIHNhbWUgdGhpbmcKLQkJLy8gdGhleSBoYWQgc2VsZWN0ZWQpIHRoZW4gYSAiTm9DaGFuZ2UiIGV2ZW50IHNob3VsZCBoYXZlIGJlZW4gZmlyZWQuCi0JCUFzc2VydC5pc05vdE51bGwocmVzdWx0LCAibm8gc3RydWN0dXJlZERvY3VtZW50IGV2ZW50IHdhcyBjcmVhdGVkIGluIElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OnVwZGF0ZVN0cnVjdHVyZWREb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudCNnZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0TGluZURlbGltaXRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQjc2V0UHJlZmVycmVkTGluZURlbGltaXRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIoU3RyaW5nIHByb2JhYmxlTGluZURlbGltaXRlcikgewotCQlzZXRJbml0aWFsTGluZURlbGltaXRlcihwcm9iYWJsZUxpbmVEZWxpbWl0ZXIpOwotCi0JfQotCi0KLQkvKioKLQkgKiBDbGFzcyB3aGljaCBpbXBsZW1lbnRzIHRoZSByZXdyaXRhYmxlIHNlc3Npb24gZm9yIHRoZSBTU0UuCi0JICogCi0JICovCi0Jc3RhdGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJld3JpdGVTZXNzaW9uIGV4dGVuZHMgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiB7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgc2Vzc2lvbi4KLQkJICogCi0JCSAqIEBwYXJhbSBzZXNzaW9uVHlwZQotCQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoaXMgc2Vzc2lvbgotCQkgKi8KLQkJcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudFJld3JpdGVTZXNzaW9uKERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlIHNlc3Npb25UeXBlKSB7Ci0JCQlzdXBlcihzZXNzaW9uVHlwZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNCNzdGFydFJld3JpdGVTZXNzaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUpCi0JICovCi0JcHVibGljIERvY3VtZW50UmV3cml0ZVNlc3Npb24gc3RhcnRSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZSBzZXNzaW9uVHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCS8vIGRlbGVnYXRlIHRvIHN1Yi1jbGFzcywgc28gVUkgdGhyZWFkaW5nIGlzIGhhbmRsZWQgY29ycmVjdGx5Ci0JCXJldHVybiBpbnRlcm5hbFN0YXJ0UmV3cml0ZVNlc3Npb24oc2Vzc2lvblR5cGUpOwotCX0KLQotCS8qKgotCSAqIE5PVC1BUEkuIEZpbmFsIHByb3RlY3RlZCBzbyBjbGllbnRzIG1heSBjYWxsIHRoaXMgbWV0aG9kIGlmIG5lZWRlZCwgYnV0Ci0JICogY2Fubm90IG92ZXJyaWRlLgotCSAqIAotCSAqIEBwYXJhbSBzZXNzaW9uVHlwZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCBEb2N1bWVudFJld3JpdGVTZXNzaW9uIGludGVybmFsU3RhcnRSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZSBzZXNzaW9uVHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCWlmIChnZXRBY3RpdmVSZXdyaXRlU2Vzc2lvbigpICE9IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhbHJlYWR5IGluIGEgcmV3cml0ZSBzZXNzaW9uIik7Ci0KLQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBzZXNzaW9uID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJld3JpdGVTZXNzaW9uKHNlc3Npb25UeXBlKTsKLQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50IGV2ZW50ID0gbmV3IERvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudCh0aGlzLCBzZXNzaW9uLCBEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQuU0VTU0lPTl9TVEFSVCk7Ci0JCWZpcmVEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQoZXZlbnQpOwotCi0JCUlMaW5lVHJhY2tlciB0cmFja2VyID0gZ2V0VHJhY2tlcigpOwotCQlpZiAodHJhY2tlciBpbnN0YW5jZW9mIElMaW5lVHJhY2tlckV4dGVuc2lvbikgewotCQkJSUxpbmVUcmFja2VyRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChJTGluZVRyYWNrZXJFeHRlbnNpb24pIHRyYWNrZXI7Ci0JCQlleHRlbnNpb24uc3RhcnRSZXdyaXRlU2Vzc2lvbihzZXNzaW9uKTsKLQkJfQotCi0JCXN0YXJ0UmV3cml0ZVNlc3Npb25PblBhcnRpdGlvbmVycyhzZXNzaW9uKTsKLQotCQlpZiAoRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuU0VRVUVOVElBTCA9PSBzZXNzaW9uVHlwZSkKLQkJCXN0YXJ0U2VxdWVudGlhbFJld3JpdGUoZmFsc2UpOwotCQllbHNlIGlmIChEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5TVFJJQ1RMWV9TRVFVRU5USUFMID09IHNlc3Npb25UeXBlKQotCQkJc3RhcnRTZXF1ZW50aWFsUmV3cml0ZSh0cnVlKTsKLQotCQlmQWN0aXZlUmV3cml0ZVNlc3Npb24gPSBzZXNzaW9uOwotCQlyZXR1cm4gc2Vzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgdGhlIGdpdmVuIHJld3JpdGUgc2Vzc2lvbi4KLQkgKgotCSAqIEBwYXJhbSBzZXNzaW9uIHRoZSByZXdyaXRlIHNlc3Npb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JZmluYWwgdm9pZCBzdGFydFJld3JpdGVTZXNzaW9uT25QYXJ0aXRpb25lcnMoRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBzZXNzaW9uKSB7Ci0JCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25lcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZT0gZkRvY3VtZW50UGFydGl0aW9uZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgcGFydGl0aW9uZXI9IGUubmV4dCgpOwotCQkJCWlmIChwYXJ0aXRpb25lciBpbnN0YW5jZW9mIElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMykgewotCQkJCQlJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjMgZXh0ZW5zaW9uPSAoSURvY3VtZW50UGFydGl0aW9uZXJFeHRlbnNpb24zKSBwYXJ0aXRpb25lcjsKLQkJCQkJZXh0ZW5zaW9uLnN0YXJ0UmV3cml0ZVNlc3Npb24oc2Vzc2lvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzdG9wUmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBzZXNzaW9uKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHN1Yi1jbGFzcywgc28gVUkgdGhyZWFkaW5nIGlzIGhhbmRsZWQgY29ycmVjdGx5Ci0JCWludGVybmFsU3RvcFJld3JpdGVTZXNzaW9uKHNlc3Npb24pOwotCX0KLQotCS8qKgotCSAqIE5PVC1BUEkuIEZpbmFsIHByb3RlY3RlZCBzbyBjbGllbnRzIG1heSBjYWxsIHRoaXMgbWV0aG9kIGlmIG5lZWRlZCwgYnV0Ci0JICogY2Fubm90IG92ZXJyaWRlLgotCSAqIAotCSAqIEBwYXJhbSBzZXNzaW9uCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxTdG9wUmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBzZXNzaW9uKSB7Ci0JCWlmIChmQWN0aXZlUmV3cml0ZVNlc3Npb24gPT0gc2Vzc2lvbikgewotCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUgc2Vzc2lvblR5cGUgPSBzZXNzaW9uLmdldFNlc3Npb25UeXBlKCk7Ci0JCQlpZiAoRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuU0VRVUVOVElBTCA9PSBzZXNzaW9uVHlwZSB8fCBEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5TVFJJQ1RMWV9TRVFVRU5USUFMID09IHNlc3Npb25UeXBlKQotCQkJCXN0b3BTZXF1ZW50aWFsUmV3cml0ZSgpOwotCi0JCQlzdG9wUmV3cml0ZVNlc3Npb25PblBhcnRpdGlvbmVycyhzZXNzaW9uKTsKLQotCQkJSUxpbmVUcmFja2VyIHRyYWNrZXIgPSBnZXRUcmFja2VyKCk7Ci0JCQlpZiAodHJhY2tlciBpbnN0YW5jZW9mIElMaW5lVHJhY2tlckV4dGVuc2lvbikgewotCQkJCUlMaW5lVHJhY2tlckV4dGVuc2lvbiBleHRlbnNpb24gPSAoSUxpbmVUcmFja2VyRXh0ZW5zaW9uKSB0cmFja2VyOwotCQkJCWV4dGVuc2lvbi5zdG9wUmV3cml0ZVNlc3Npb24oc2Vzc2lvbiwgZ2V0KCkpOwotCQkJfQotCi0JCQlmQWN0aXZlUmV3cml0ZVNlc3Npb24gPSBudWxsOwotCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50IGV2ZW50ID0gbmV3IERvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudCh0aGlzLCBzZXNzaW9uLCBEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQuU0VTU0lPTl9TVE9QKTsKLQkJCWZpcmVEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcHMgdGhlIGdpdmVuIHJld3JpdGUgc2Vzc2lvbi4KLQkgKgotCSAqIEBwYXJhbSBzZXNzaW9uIHRoZSByZXdyaXRlIHNlc3Npb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JZmluYWwgdm9pZCBzdG9wUmV3cml0ZVNlc3Npb25PblBhcnRpdGlvbmVycyhEb2N1bWVudFJld3JpdGVTZXNzaW9uIHNlc3Npb24pIHsKLQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmVycyAhPSBudWxsKSB7Ci0JCQlEb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWRFdmVudCBldmVudD0gbmV3IERvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZEV2ZW50KHRoaXMpOwotCQkJSXRlcmF0b3IgZT0gZkRvY3VtZW50UGFydGl0aW9uZXJzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgcGFydGl0aW9uaW5nPSAoU3RyaW5nKSBlLm5leHQoKTsKLQkJCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lcj0gKElEb2N1bWVudFBhcnRpdGlvbmVyKSBmRG9jdW1lbnRQYXJ0aXRpb25lcnMuZ2V0KHBhcnRpdGlvbmluZyk7Ci0JCQkJaWYgKHBhcnRpdGlvbmVyIGluc3RhbmNlb2YgSURvY3VtZW50UGFydGl0aW9uZXJFeHRlbnNpb24zKSB7Ci0JCQkJCUlEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMyBleHRlbnNpb249IChJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjMpIHBhcnRpdGlvbmVyOwotCQkJCQlleHRlbnNpb24uc3RvcFJld3JpdGVTZXNzaW9uKHNlc3Npb24pOwotCQkJCQlldmVudC5zZXRQYXJ0aXRpb25DaGFuZ2UocGFydGl0aW9uaW5nLCAwLCBnZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFldmVudC5pc0VtcHR5KCkpCi0JCQkJZmlyZURvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNCNnZXRBY3RpdmVSZXdyaXRlU2Vzc2lvbigpCi0JICovCi0JcHVibGljIERvY3VtZW50UmV3cml0ZVNlc3Npb24gZ2V0QWN0aXZlUmV3cml0ZVNlc3Npb24oKSB7Ci0JCXJldHVybiBmQWN0aXZlUmV3cml0ZVNlc3Npb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQjYWRkRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIoSURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCQkJQXNzZXJ0LmlzTm90TnVsbChsaXN0ZW5lcik7Ci0JCQlpZiAoZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJCWZEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCX0KLQkJCWlmICghZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQotCQkJCWZEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNCNyZW1vdmVEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcihJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCUFzc2VydC5pc05vdE51bGwobGlzdGVuZXIpOwotCQkJaWYgKGZEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXJzICE9IG51bGwpCi0JCQkJZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240I3JlcGxhY2UoaW50LCBpbnQsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHRleHQsIGxvbmcgbW9kaWZpY2F0aW9uU3RhbXApIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgbGVuZ3RoLCB0ZXh0LCBtb2RpZmljYXRpb25TdGFtcCwgdHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQjc2V0KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgdGV4dCwgbG9uZyBtb2RpZmljYXRpb25TdGFtcCkgewotCQkvLyBidWcgMTUxMDY5IC0gb3ZlcndyaXRlIHJlYWQgb25seSByZWdpb25zIHdoZW4gc2V0dGluZyBlbnRpcmUgZG9jdW1lbnQKLQkJIHJlcGxhY2VUZXh0KG51bGwsIDAsIGdldExlbmd0aCgpLCB0ZXh0LCBtb2RpZmljYXRpb25TdGFtcCwgdHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQjZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKQotCSAqLwotCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKCkgewotCQlyZXR1cm4gZk1vZGlmaWNhdGlvblN0YW1wOwotCX0KLQkKLQlwcml2YXRlIGxvbmcgZ2V0TmV4dE1vZGlmaWNhdGlvblN0YW1wKCkgewotCQlpZiAoZk5leHRNb2RpZmljYXRpb25TdGFtcCA9PSBMb25nLk1BWF9WQUxVRSB8fCBmTmV4dE1vZGlmaWNhdGlvblN0YW1wID09IElEb2N1bWVudEV4dGVuc2lvbjQuVU5LTk9XTl9NT0RJRklDQVRJT05fU1RBTVApCi0JCQlmTmV4dE1vZGlmaWNhdGlvblN0YW1wPSAwOwotCQllbHNlCi0JCQlmTmV4dE1vZGlmaWNhdGlvblN0YW1wPSBmTmV4dE1vZGlmaWNhdGlvblN0YW1wICsgMTsKLQotCQlyZXR1cm4gZk5leHRNb2RpZmljYXRpb25TdGFtcDsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlcyBhbiBldmVudCwgYXMgc3BlY2lmaWVkLCB0byB0aGUgYXNzb2NpYXRlZCBsaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBUaGUgZXZlbnQgdG8gZmlyZSwgZWl0aGVyIGEgc3RhcnQgb3Igc3RvcCBldmVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlyZURvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudChmaW5hbCBEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXJzID09IG51bGwgfHwgZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm47Ci0KLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgSURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lciBsID0gKElEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQlsLmRvY3VtZW50UmV3cml0ZVNlc3Npb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJLy8gbG9nZ2VkIGZvciB1cwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0Jhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiYTliMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChJbnRhbGlvKSAtIGJ1ZyAzMDA0MzAgLSBTdHJpbmcgY29uY2F0ZW5hdGlvbgotICogICAgIERhdmlkIENhcnZlciAoSW50YWxpbykgLSBidWcgMzAwNDI3IC0gQ29tcGFyaXNvbiBvZiBTdHJpbmcgT2JqZWN0cyA9PSBvciAhPQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLQotCi1wdWJsaWMgY2xhc3MgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9TVE9SRV9OT1RfQVNTSUdORUQgPSAidGV4dCBzdG9yZSBub3QgYXNzaWduZWQgeWV0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRFRklORUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnN0cnVjdHVyZWREb2N1bWVudC5VTkRFRklORUQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElUZXh0UmVnaW9uTGlzdCBfcmVnaW9uczsKLQkvKioKLQkgKiBoYXMgdGhpcyByZWdpb24gYmVlbiByZW1vdmVkIGZyb20gaXRzIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBNQVNLX0lTX0RFTEVURUQgPSAxOwotCS8qKgotCSAqIHdhcyB0aGlzIHJlZ2lvbiB0ZXJtaW5hdGVkIG5vcm1hbGx5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBNQVNLX0lTX0VOREVEID0gMSA8PCAxOwotCi0JcHJpdmF0ZSBieXRlIGZJc0RlbGV0ZWRPckVuZGVkID0gMDsKLQotCS8qKgotCSAqIGFsbG93IGEgcG9pbnRlciBiYWNrIHRvIHRoaXMgbm9kZXMgbW9kZWwKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZlBhcmVudERvY3VtZW50OwotCQotCXByb3RlY3RlZCBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzID0gbnVsbDsKLQlwcm90ZWN0ZWQgaW50IHN0YXJ0OwotCi0JcHVibGljIEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlzdXBlcigpOwotCQlfcmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQotCX0KLQotCS8qKgotCSAqIEV2ZW4gaW5zaWRlLXRoaXMgY2xhc3MgdXNlcyBvZiAncmVnaW9ucycgc2hvdWxkIHVzZSB0aGlzIG1ldGhvZCwgYXMKLQkgKiB0aGlzIGlzIHdoZXJlIChzb2Z0KSBtZW1vcnkgbWFuYWdlbWVudC9yZXBhcnNpbmcsIGV0Yy4sIHdpbGwgYmUKLQkgKiBjZW50cmFsaXplZC4KLQkgKi8KLQlwcml2YXRlIElUZXh0UmVnaW9uTGlzdCBfZ2V0UmVnaW9ucygpIHsKLQotCQlyZXR1cm4gX3JlZ2lvbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVnaW9uKElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJX2dldFJlZ2lvbnMoKS5hZGQoYVJlZ2lvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0KGludCBpKSB7Ci0JCXN0YXJ0ICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlzdGFydCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IGkpIHsKLQotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSA8PSBpICYmIGkgPCBnZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KGNvbnRhaW5lZFJlZ2lvbikgPD0gb2Zmc2V0ICYmIG9mZnNldCA8IGdldEVuZE9mZnNldChjb250YWluZWRSZWdpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJc3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmQgYW5kIGdldEVuZE9mZnNldCBhcmUgdGhlIHNhbWUgb25seSBmb3IKLQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gc3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIGdldEVuZCBhbmQgZ2V0RW5kT2Zmc2V0IGFyZSB0aGUgc2FtZSBvbmx5IGZvcgotCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRFbmQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KGNvbnRhaW5lZFJlZ2lvbikgKyBjb250YWluZWRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldEZpcnN0UmVnaW9uKCkgewotCQlpZiAoX2dldFJlZ2lvbnMoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBfZ2V0UmVnaW9ucygpLmdldCgwKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KCkgewotCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGdldFBhcmVudERvY3VtZW50KCkuZ2V0KHN0YXJ0LCBmTGVuZ3RoKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWludCByZWdpb25TdGFydCA9IGFSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCWludCByZWdpb25MZW5ndGggPSBhUmVnaW9uLmdldExlbmd0aCgpOwotCQkJcmVzdWx0ID0gZlBhcmVudERvY3VtZW50LmdldChzdGFydCArIHJlZ2lvblN0YXJ0LCByZWdpb25MZW5ndGgpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChTdHJpbmcgY29udGV4dCkgewotCQkvLyBETVc6IGxvb3BpbmcgaXMgZmFzdGVyIHRoYW4gZW51bWVyYXRpb24sCi0JCS8vIHNvIHN3aXRjaGVkIGFyb3VuZCAyLzEyLzAzCi0JCS8vIEVudW1lcmF0aW9uIGUgPSBnZXRSZWdpb25zKCkuZWxlbWVudHMoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBsZW5ndGggPSBnZXRSZWdpb25zKCkuc2l6ZSgpOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHJlc3VsdCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXJlZ2lvbiA9IGdldFJlZ2lvbnMoKS5nZXQoaSk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoY29udGV4dCkpCi0JCQkJc2IuYXBwZW5kKGdldEZ1bGxUZXh0KHJlZ2lvbikpOwotCQl9Ci0JCXJlc3VsdCA9IHNiLnRvU3RyaW5nKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKSB7Ci0JCWlmIChfZ2V0UmVnaW9ucygpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIF9nZXRSZWdpb25zKCkuZ2V0KF9nZXRSZWdpb25zKCkuc2l6ZSgpIC0gMSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldE5leHQoKSB7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZSZWdpb25zKCkgewotCQlyZXR1cm4gX2dldFJlZ2lvbnMoKS5zaXplKCk7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0UGFyZW50RG9jdW1lbnQoKSB7Ci0KLQkJcmV0dXJuIGZQYXJlbnREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2aW91cygpIHsKLQkJcmV0dXJuIHByZXZpb3VzOwotCX0KLQotCS8qKgotCSAqIFRoZSBwYXJhbWV0ZXIgb2Zmc2V0IHJlZmVycyB0byB0aGUgb3ZlcmFsbCBvZmZzZXQgaW4gdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCWlmIChfZ2V0UmVnaW9ucygpICE9IG51bGwpIHsKLQkJCWludCB0aGlzU3RhcnRPZmZzZXQgPSBnZXRTdGFydE9mZnNldCgpOwotCQkJaWYgKG9mZnNldCA8IHRoaXNTdGFydE9mZnNldCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWludCB0aGlzRW5kT2Zmc2V0ID0gZ2V0U3RhcnRPZmZzZXQoKSArIGdldExlbmd0aCgpOwotCQkJaWYgKG9mZnNldCA+IHRoaXNFbmRPZmZzZXQpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkvLyB0cmFuc2Zvcm0gdGhlIHJlcXVlc3RlZCBvZmZzZXQgdG8gdGhlICJzY2FsZSIgdGhhdAotCQkJLy8gcmVnaW9ucyBhcmUgc3RvcmVkIGluLCB3aGljaCBhcmUgYWxsIHJlbGF0aXZlIHRvIHRoZQotCQkJLy8gc3RhcnQgcG9pbnQuCi0JCQkvLyBpbnQgdHJhbnNmb3JtZWRPZmZzZXQgPSBvZmZzZXQgLSBnZXRTdGFydE9mZnNldCgpOwotCQkJLy8KLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZ2V0UmVnaW9ucygpOwotCQkJaW50IGxlbmd0aCA9IHJlZ2lvbnMuc2l6ZSgpOwotCQkJaW50IGxvdyA9IDA7Ci0JCQlpbnQgaGlnaCA9IGxlbmd0aDsKLQkJCWludCBtaWQgPSAwOwotCQkJLy8gQmluYXJ5IHNlYXJjaCBmb3IgdGhlIHJlZ2lvbgotCQkJd2hpbGUgKGxvdyA8IGhpZ2gpIHsKLQkJCQltaWQgPSBsb3cgKyAoKGhpZ2ggLSBsb3cpID4+IDEpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KG1pZCk7Ci0JCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVnaW9uKHMpIGluIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb246OmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0OiAiICsgcmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZXF1ZXN0ZWQgb2Zmc2V0OiAiICsgb2Zmc2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiB0cmFuc2Zvcm1lZE9mZnNldDogIiArCi0JCQkJCS8vIHRyYW5zZm9ybWVkT2Zmc2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gc3RhcnQ6ICIgKyByZWdpb24uZ2V0U3RhcnQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgcmVnaW9uIGVuZDogIiArIHJlZ2lvbi5nZXRFbmQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgcmVnaW9uIHR5cGU6ICIgKyByZWdpb24uZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gY2xhc3M6ICIgKyByZWdpb24uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCX0KLQkJCQkvLyBSZWdpb24gaXMgYmVmb3JlIHRoaXMgb25lCi0JCQkJaWYgKG9mZnNldCA8IHJlZ2lvbi5nZXRTdGFydCgpICsgdGhpc1N0YXJ0T2Zmc2V0KQotCQkJCQloaWdoID0gbWlkOwotCQkJCWVsc2UgaWYgKG9mZnNldCA+IChyZWdpb24uZ2V0RW5kKCkgKyB0aGlzU3RhcnRPZmZzZXQgLSAxKSkKLQkJCQkJbG93ID0gbWlkICsgMTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uTGlzdCBnZXRSZWdpb25zKCkgewotCQlyZXR1cm4gX2dldFJlZ2lvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTdGFydCBhbmQgZ2V0U3RhcnRPZmZzZXQgYXJlIHRoZSBzYW1lIG9ubHkgZm9yCi0JICogSVN0cnVjdXRyZWREb2N1bWVudFJlZ2lvbnMKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnQgYW5kIGdldFN0YXJ0T2Zmc2V0IGFyZSB0aGUgc2FtZSBvbmx5IGZvcgotCSAqIElTdHJ1Y3V0cmVkRG9jdW1lbnRSZWdpb25zCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJLy8gYXNzZXJ0OiBjb250YWluZWRSZWdpb24gY2FuIG5vdCBiZSBudWxsCi0JCS8vIChtaWdodCBiZSBwZXJmb3JtYW5jZSBoaXQgaWYgbGl0ZXJhbGx5IHB1dCBpbiBhc3NlcnQgY2FsbCwKLQkJLy8gYnV0IGNvbnRhaW5lZFJlZ2lvbiBjYW4gbm90IGJlIG51bGwpLiBOZWVkcyB0byBiZSBjaGVja2VkCi0JCS8vIGJ5IGNhbGxpbmcgY29kZS4KLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgKyBjb250YWluZWRSZWdpb24uZ2V0U3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGZQYXJlbnREb2N1bWVudCA9PSBudWxsKSB7Ci0JCQkJLy8gbGlrZWx5IHRvIGhhcHBlbiBkdXJpbmcgaW5zcGVjdGluZwotCQkJCXJlc3VsdCA9IFRFWFRfU1RPUkVfTk9UX0FTU0lHTkVEOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzdWx0ID0gZlBhcmVudERvY3VtZW50LmdldChzdGFydCwgZkxlbmd0aCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQkvLyBhc3NlcnQ6IGFSZWdpb24gY2FuIG5vdCBiZSBudWxsCi0JCS8vIChtaWdodCBiZSBwZXJmb3JtYW5jZSBoaXQgaWYgbGl0ZXJhbGx5IHB1dCBpbiBhc3NlcnQgY2FsbCwKLQkJLy8gYnV0IGFSZWdpb24gY2FuIG5vdCBiZSBudWxsKS4gTmVlZHMgdG8gYmUgY2hlY2tlZAotCQkvLyBieSBjYWxsaW5nIGNvZGUuCi0JCXRyeSB7Ci0JCQlyZXR1cm4gZlBhcmVudERvY3VtZW50LmdldCh0aGlzLmdldFN0YXJ0T2Zmc2V0KGFSZWdpb24pLCBhUmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBvZiB0aGUgZmlyc3QgcmVnaW9uIHdpdGggdGhlIG1hdGNoaW5nIGNvbnRleHQgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChTdHJpbmcgY29udGV4dCkgewotCQkvLyBETVc6IGxvb3BpbmcgaXMgZmFzdGVyIHRoYW4gZW51bWVyYXRpb24sCi0JCS8vIHNvIHN3aXRjaGVkIGFyb3VuZCAyLzEyLzAzCi0JCS8vIEVudW1lcmF0aW9uIGUgPSBnZXRSZWdpb25zKCkuZWxlbWVudHMoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBsZW5ndGggPSBnZXRSZWdpb25zKCkuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlyZWdpb24gPSBnZXRSZWdpb25zKCkuZ2V0KGkpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKGNvbnRleHQpKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0VGV4dChyZWdpb24pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gc3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBfZ2V0UmVnaW9ucygpLmdldChfZ2V0UmVnaW9ucygpLnNpemUoKSAtIDEpOwotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoY29udGFpbmVkUmVnaW9uKSArIGNvbnRhaW5lZFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyB0aGUgdHlwZSBvZiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIC4uLiBub3QgdG8gYmUgY29uZnVzZWQKLQkgKiB3aXRoIHR5cGUgb2YgWE1MIG5vZGUhIFRoaXMgaXMgc3ViY2xhc3NlZCwgaWYgc29tZXRoaW5nIG90aGVyIHRoYW4gdHlwZQotCSAqIG9mIGZpcnN0IHJlZ2lvbiBpcyBkZXNpcmVkLgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IFVOREVGSU5FRDsKLQkJSVRleHRSZWdpb25MaXN0IHN1YnJlZ2lvbnMgPSBnZXRSZWdpb25zKCk7Ci0JCWlmIChzdWJyZWdpb25zICE9IG51bGwgJiYgc3VicmVnaW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlJVGV4dFJlZ2lvbiBmaXJzdFJlZ2lvbiA9IHN1YnJlZ2lvbnMuZ2V0KDApOwotCQkJaWYgKGZpcnN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBmaXJzdFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jaXNEZWxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoKSB7Ci0JCXJldHVybiAoZklzRGVsZXRlZE9yRW5kZWQgJiBNQVNLX0lTX0RFTEVURUQpICE9IDAgfHwgKGZQYXJlbnREb2N1bWVudCA9PSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZGVkKCkgewotCQlyZXR1cm4gKGZJc0RlbGV0ZWRPckVuZGVkICYgTUFTS19JU19FTkRFRCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBpZiByZWdpb24gPT0gbnVsbCwgd2UgcmV0dXJuIGZhbHNlOwotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIGlmIHRoZSByZWdpb25zIGFyZSB0aGUgc2FtZSBpbnN0YW5jZSwgdGhleSBhcmUgZXF1YWwKLQkJCWlmICh0aGlzID09IHJlZ2lvbikgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBub24tdHJpdmlhbCBwYXJ0Ci0JCQkJLy8gbm90ZTogd2UgY2hhbmdlIGZvciB0eXBlIGZpcnN0LCB0aGVuIHN0YXJ0IG9mZnNldCBhbmQgZW5kCi0JCQkJLy8gb2Zmc2V0LAotCQkJCS8vIHNpbmNlIHRoYXQgd291bGQgZGVjaWRlIG1hbnkgY2FzZXMgcmlnaHQgYXdheSBhbmQgYXZvaWQgdGhlCi0JCQkJLy8gdGV4dCBjb21wYXJpc29uCi0JCQkJaWYgKGdldFR5cGUoKS5lcXVhbHMocmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJaWYgKHNhbWVPZmZzZXRzQXMocmVnaW9uLCBzaGlmdCkgJiYgc2FtZVRleHRBcyhyZWdpb24sIHNoaWZ0KSkgewotCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdEb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gaWYgYW55IHJlZ2lvbiBpcyBudWxsLCB3ZSByZXR1cm4gZmFsc2UgKGV2ZW4gaWYgYm90aCBhcmUhKQotCQlpZiAoKG9sZFJlZ2lvbiAhPSBudWxsKSAmJiAobmV3UmVnaW9uICE9IG51bGwpKSB7Ci0JCQkvLyBpZiB0aGUgcmVnaW9ucyBhcmUgdGhlIHNhbWUgaW5zdGFuY2UsIHRoZXkgYXJlIGVxdWFsCi0JCQlpZiAob2xkUmVnaW9uID09IG5ld1JlZ2lvbikgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBub24tdHJpdmlhbCBwYXJ0Ci0JCQkJLy8gbm90ZTogd2UgY2hhbmdlIGZvciB0eXBlIGZpcnN0LCB0aGVuIHN0YXJ0IG9mZnNldCBhbmQgZW5kCi0JCQkJLy8gb2Zmc2V0LAotCQkJCS8vIHNpbmNlIHRoYXQgd291bGQgZGVjaWRlIG1hbnkgY2FzZXMgcmlnaHQgYXdheSBhbmQgYXZvaWQgdGhlCi0JCQkJLy8gdGV4dCBjb21wYXJpc29uCi0JCQkJaWYgKG9sZFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKG5ld1JlZ2lvbi5nZXRUeXBlKCkpKSB7Ci0JCQkJCWlmIChzYW1lT2Zmc2V0c0FzKG9sZFJlZ2lvbiwgbmV3RG9jdW1lbnRSZWdpb24sIG5ld1JlZ2lvbiwgc2hpZnQpKSB7Ci0JCQkJCQlpZiAoc2FtZVRleHRBcyhvbGRSZWdpb24sIG5ld0RvY3VtZW50UmVnaW9uLCBuZXdSZWdpb24sIHNoaWZ0KSkgewotCQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNhbWVPZmZzZXRzQXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCkgewotCQlpZiAoZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSAtIHNoaWZ0KSB7Ci0JCQlpZiAoZ2V0RW5kT2Zmc2V0KCkgPT0gcmVnaW9uLmdldEVuZE9mZnNldCgpIC0gc2hpZnQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNhbWVPZmZzZXRzQXMoSVRleHRSZWdpb24gb2xkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXdSZWdpb24sIGludCBzaGlmdCkgewotCQlpZiAoZ2V0U3RhcnRPZmZzZXQob2xkUmVnaW9uKSA9PSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChuZXdSZWdpb24pIC0gc2hpZnQpIHsKLQkJCWlmIChnZXRFbmRPZmZzZXQob2xkUmVnaW9uKSA9PSBkb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQobmV3UmVnaW9uKSAtIHNoaWZ0KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzYW1lVGV4dEFzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmIChnZXRUZXh0KCkuZXF1YWxzKHJlZ2lvbi5nZXRUZXh0KCkpKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLyBJU1NVRTogd2Ugc2hvdWxkIG5vdCBuZWVkIHRoaXMKLQkJY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzYW1lVGV4dEFzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAoZ2V0VGV4dChvbGRSZWdpb24pLmVxdWFscyhkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KG5ld1JlZ2lvbikpKSB7Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jc2V0RGVsZXRlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlZChib29sZWFuIGlzRGVsZXRlZCkgewotCQlpZiAoaXNEZWxldGVkKQotCQkJZklzRGVsZXRlZE9yRW5kZWQgfD0gTUFTS19JU19ERUxFVEVEOwotCQllbHNlCi0JCQlmSXNEZWxldGVkT3JFbmRlZCAmPSB+TUFTS19JU19ERUxFVEVEOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdIYXNFbmQKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRlZChib29sZWFuIG5ld0hhc0VuZCkgewotCQlpZiAobmV3SGFzRW5kKQotCQkJZklzRGVsZXRlZE9yRW5kZWQgfD0gTUFTS19JU19FTkRFRDsKLQkJZWxzZQotCQkJZklzRGVsZXRlZE9yRW5kZWQgJj0gfk1BU0tfSVNfRU5ERUQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBuZXdMZW5ndGgpIHsKLQkJLy8gdGV4dExlbmd0aCA9IG5ld0xlbmd0aDsKLQkJZkxlbmd0aCA9IG5ld0xlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3TmV4dCkgewotCQluZXh0ID0gbmV3TmV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZQYXJlbnREb2N1bWVudCA9IGRvY3VtZW50OwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJldmlvdXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdQcmV2aW91cykgewotCQlwcmV2aW91cyA9IG5ld1ByZXZpb3VzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZ2lvbnMoSVRleHRSZWdpb25MaXN0IGNvbnRhaW5lZFJlZ2lvbnMpIHsKLQkJX3JlZ2lvbnMgPSBjb250YWluZWRSZWdpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KGludCBuZXdTdGFydCkgewotCQlzdGFydCA9IG5ld1N0YXJ0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCS8vIE5PVEU6IGlmIHRoZSBkb2N1bWVudCBoZWxkIGJ5IGFueSByZWdpb24gaGFzIGJlZW4gdXBkYXRlZCBhbmQgdGhlCi0JCS8vIHJlZ2lvbiBvZmZzZXRzIGhhdmUgbm90Ci0JCS8vIHlldCBiZWVuIHVwZGF0ZWQsIHRoZSBvdXRwdXQgZnJvbSB0aGlzIG1ldGhvZCBpbnZhbGlkLgotCQkvLyBBbHNvIG5vdGUsIHRoaXMgbWV0aG9kIGNhbiBub3QgYmUgY2hhbmdlZCwgd2l0aG91dCAiYnJlYWtpbmciCi0JCS8vIHVuaXQgdGVzdHMsIHNpbmNlIHNvbWUgb2YgdGhlbSBjb21wYXJlIGN1cnJlbnQgcmVzdWx0cyB0byBwcmV2aW91cwotCQkvLyByZXN1bHRzLgotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gIlsiICsgZ2V0U3RhcnQoKSArICIsICIgKyBnZXRFbmQoKSArICJdICgiICsgZ2V0VGV4dCgpICsgIikiOyAvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZURvd25TdHJlYW1SZWdpb25zKElUZXh0UmVnaW9uIGNoYW5nZWRSZWdpb24sIGludCBsZW5ndGhEaWZmZXJlbmNlKSB7Ci0JCWludCBsaXN0TGVuZ3RoID0gX2dldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCWludCBzdGFydEluZGV4ID0gMDsKLQkJLy8gZmlyc3QsIGxvb3AgdGhyb3VnaCB0byBmaW5kIGluZGV4IG9mIHdoZXJlIHRvIHN0YXJ0Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBfZ2V0UmVnaW9ucygpLmdldChpKTsKLQkJCWlmIChyZWdpb24gPT0gY2hhbmdlZFJlZ2lvbikgewotCQkJCXN0YXJ0SW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8vIG5vdywgYmVnaW5uaW5nIG9uZSBwYXN0IHRoZSBvbmUgdGhhdCB3YXMgY2hhbmdlZCwgbG9vcAotCQkvLyB0aHJvdWdoIHRvIGVuZCBvZiBsaXN0LCBhZGp1c3RpbmcgdGhlIHN0YXJ0IHBvc3Rpb25zLgotCQlzdGFydEluZGV4Kys7Ci0JCWZvciAoaW50IGogPSBzdGFydEluZGV4OyBqIDwgbGlzdExlbmd0aDsgaisrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBfZ2V0UmVnaW9ucygpLmdldChqKTsKLQkJCXJlZ2lvbi5hZGp1c3RTdGFydChsZW5ndGhEaWZmZXJlbmNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJLy8gR2V0IHRoZSByZWdpb24gcG9pbnRlZCB0byBieSB0aGUgcmVxdWVzdFN0YXJ0IHBvc3Rpb24sIGFuZCBnaXZlCi0JCS8vIHRoYXQgcmVnaW9uIGEgY2hhbmNlIHRvIGVmZmVjdAotCQkvLyB0aGUgdXBkYXRlLgotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChyZXF1ZXN0U3RhcnQpOwotCQkvLyBpZiB0aGVyZSBpcyBubyByZWdpb24sIHRoZW4gdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIG11c3QgY29tZSByaWdodAotCQkvLyBhZnRlciB0aGUKLQkJLy8gbm9kZSAoYW5kIHJpZ2h0IGFmdGVyIHRoZSBsYXN0IHJlZ2lvbikuIFRoaXMgaGFwcGVucywgZm9yIGV4YW1wbGUsCi0JCS8vIHdoZW4gc29tZW9uZQotCQkvLyB0eXBlcyBzb21ldGhpbmcgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsIG9yIG1vcmUgY29tbW9ubHksIHdoZW4KLQkJLy8gdGhleSBhcmUgcmlnaHQKLQkJLy8gYXQgdGhlIGJlZ2lubmluZyBvZiBvbmUgbm9kZSwgYW5kIHRoZSBkaXJ0eSBzdGFydCBpcyB0aGVyZWZvcmUKLQkJLy8gY2FsY3VsYXRlZCB0byBiZSB0aGUKLQkJLy8gcHJldmlvdXMgbm9kZS4KLQkJLy8gU28sIGluIHRoaXMgY2FzZSwgd2UnbGwgZ2l2ZSB0aGUgbGFzdCByZWdpb24gYSBjaGFuY2UgdG8gc2VlIGlmIGl0Ci0JCS8vIHdhbnRzIHRvCi0JCS8vIHN3YWxsb3cgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIC0tIGJ1dCBvbmx5IGZvciBpbnNlcnRzIC0tIGRlbGV0ZXMKLQkJLy8gYW5kICJyZXBsYWNlcyIKLQkJLy8gc2hvdWxkIGJlIHJlcGFyc2VkIGlmIHRoZXkgYXJlIGluIHRoZXNlIGJvcmRlciByZWdpb25zLCBhbmQgb25seSBpZgotCQkvLyB0aGUKLQkJaWYgKChyZWdpb24gPT0gbnVsbCkgJiYgKGxlbmd0aFRvUmVwbGFjZSA9PSAwKSkgewotCQkJcmVnaW9uID0gX2dldFJlZ2lvbnMoKS5nZXQoX2dldFJlZ2lvbnMoKS5zaXplKCkgLSAxKTsKLQkJCS8vIG1ha2Ugc3VyZSB0aGUgcmVnaW9uIGlzIGNvbnRpZ3VvdXMKLQkJCWlmIChnZXRFbmRPZmZzZXQocmVnaW9uKSA9PSByZXF1ZXN0U3RhcnQpIHsKLQkJCQlyZXN1bHQgPSByZWdpb24udXBkYXRlUmVnaW9uKHJlcXVlc3RlciwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJLy8KLQkJCQkvLyBJZiB0aGUgcmVxdWVzdGVkIGNoYW5nZSBzcGFucyBtb3JlIHRoYW4gb25lIHJlZ2lvbiwgdGhlbgotCQkJCS8vIHdlIGRvbid0IGdpdmUgdGhlIHJlZ2lvbiBhIGNoYW5jZSB0byB1cGRhdGUuCi0JCQkJaWYgKChjb250YWluc09mZnNldChyZWdpb24sIHJlcXVlc3RTdGFydCkpICYmIChjb250YWluc09mZnNldChyZWdpb24sIHJlcXVlc3RTdGFydCArIGxlbmd0aFRvUmVwbGFjZSkpKSB7Ci0JCQkJCXJlc3VsdCA9IHJlZ2lvbi51cGRhdGVSZWdpb24ocmVxdWVzdGVyLCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGlmIHJlc3VsdCBpcyBub3QgbnVsbCwgdGhlbiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc3RhcnQgYW5kIGVuZAotCQkvLyBwb3N0aW9ucyBvZiB0aGUgcmVnaW9ucyB0aGF0IGZvbGxvdyB0aGlzIG9uZQotCQkvLyBpZiByZXN1bHQgaXMgbnVsbCwgdGhlbiBhcHBseSB0aGUgZmxhdG5vZGUgc3BlY2lmaWMgY2hlY2tzIG9uIHdoYXQKLQkJLy8gaXQgY2FuIGNoYW5nZQotCQkvLyAoaS5lLiBtb3JlIHRoYW4gb25lIHJlZ2lvbiwgYnV0IG5vIGNoYW5nZSB0byB0aGUgbm9kZSBpdHNlbGYpCi0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJLy8gVGhhdCBpcywgYSByZWdpb24gZGVjaWRlZCBpdCBjb3VsZCBoYW5kbGUgdGhlIGNoYW5nZSBhbmQKLQkJCS8vIGNyZWF0ZWQKLQkJCS8vIGEgcmVnaW9uIGNoYW5nZWQgZXZlbnQuCi0JCQlBc3NlcnQuaXNUcnVlKHJlc3VsdCBpbnN0YW5jZW9mIFJlZ2lvbkNoYW5nZWRFdmVudCwgIlByb2dyYW0gRXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJdXBkYXRlRG93blN0cmVhbVJlZ2lvbnMoKChSZWdpb25DaGFuZ2VkRXZlbnQpIHJlc3VsdCkuZ2V0UmVnaW9uKCksIGxlbmd0aERpZmZlcmVuY2UpOwotCQkJLy8gUExVUywgd2UgbmVlZCB0byB1cGRhdGUgb3VyIG93biBub2RlIGVuZCBwb2ludCAobGVuZ3RoKQotCQkJc2V0TGVuZ3RoKGdldExlbmd0aCgpICsgbGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0NoYXJTZXF1ZW5jZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0NoYXJTZXF1ZW5jZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWIyOWI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9DaGFyU2VxdWVuY2VSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotcHVibGljIGNsYXNzIENoYXJTZXF1ZW5jZVJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0JcHJpdmF0ZSBpbnQgZkN1cnJlbnRQb3NpdGlvbjsKLQlwcml2YXRlIGludCBmTWF4aW11bVJlYWRPZmZzZXQ7Ci0KLQlwcml2YXRlIENoYXJTZXF1ZW5jZSBmT3JpZ2luYWxTb3VyY2U7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JQ2hhclNlcXVlbmNlUmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIENoYXJTZXF1ZW5jZVJlYWRlcihDaGFyU2VxdWVuY2Ugb3JpZ2luYWxTb3VyY2UsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJLy8gSVNTVUU6IHNob3VsZCB3ZSAiZmFpbCBmYXN0IiBpZiByZXF1ZXN0ZWQgbGVuZ3RoIGlzIG1vcmUgdGhhbiB0aGVyZQotCQkvLyBpcz8KLQkJZk9yaWdpbmFsU291cmNlID0gb3JpZ2luYWxTb3VyY2U7Ci0JCWludCBzdGFydE9mZnNldCA9IG9mZnNldDsKLQkJaW50IG1heFJlcXVlc3RlZE9mZnNldCA9IHN0YXJ0T2Zmc2V0ICsgbGVuZ3RoOwotCQlpbnQgbWF4UG9zc2libGVPZmZzZXQgPSAwICsgb3JpZ2luYWxTb3VyY2UubGVuZ3RoKCk7Ci0JCWZNYXhpbXVtUmVhZE9mZnNldCA9IE1hdGgubWluKG1heFJlcXVlc3RlZE9mZnNldCwgbWF4UG9zc2libGVPZmZzZXQpOwotCi0JCWZDdXJyZW50UG9zaXRpb24gPSBzdGFydE9mZnNldDsKLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsb2NrT2JqZWN0Ci0JICovCi0JQ2hhclNlcXVlbmNlUmVhZGVyKE9iamVjdCBsb2NrT2JqZWN0KSB7Ci0JCXN1cGVyKGxvY2tPYmplY3QpOwotCQkvLyBmb3IgdGhyZWFkIHNhZmV0eSwgbWF5IG5lZWQgdG8gYWRkIGJhY2sgbG9ja2luZyBtZWNoYW5pc20KLQkJLy8gaW4gb3VyIGN1c3RvbSBjb25zdHJ1Y3Rvci4gVGhpcyBjb25zdHJ1Y3RvciBsZWZ0IGhlcmUganVzdAotCQkvLyBmb3IgYSByZW1pbmRlci4KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gd2hlbiB3ZSBjbG9zZQotCQkvLyAobWF5IGJlIHRvIGV2ZW50dWFsbHkgInVubG9jayIgb3IgbnVsbCBvdXQgc29tZSB2YXJpYmxlcwotCQkvLyBqdXN0IGZvciBoeWdlbmUuCi0JCS8vIG9yLCBwZXJoYXBzIGlmIGFscmVhZHkgY2xvc2VkIG9uY2UgdGhyb3cgSU9FeGNlcHRpb24/IGZvcgotCQkvLyBjb25zaXN0ZW5jeT8KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG9yaWdpbmFsU291cmNlLgotCSAqIEBkZXByZWNhdGVkIC0gb25seSB0ZW1wb3JhcmlseSBwdWJsaWMsIHNob3VsZCBiZSAnZGVmYXVsdCcgZXZlbnR1YWxseQotCSAqICAgICAgICAgICAgIG9yIGdvIGF3YXkgYWx0b2dldGhlci4KLQkgKi8KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIGdldE9yaWdpbmFsU291cmNlKCkgewotCQlyZXR1cm4gZk9yaWdpbmFsU291cmNlOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpZiAoZkN1cnJlbnRQb3NpdGlvbiA8IGZNYXhpbXVtUmVhZE9mZnNldCkgewotCQkJcmVzdWx0ID0gZk9yaWdpbmFsU291cmNlLmNoYXJBdChmQ3VycmVudFBvc2l0aW9uKyspOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVhZCBjaGFyYWN0ZXJzIGludG8gYSBwb3J0aW9uIG9mIGFuIGFycmF5LiBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrCi0JICogdW50aWwgc29tZSBpbnB1dCBpcyBhdmFpbGFibGUsIGFuIEkvTyBlcnJvciBvY2N1cnMsIG9yIHRoZSBlbmQgb2YgdGhlCi0JICogc3RyZWFtIGlzIHJlYWNoZWQuCi0JICogCi0JICogQHBhcmFtIGNidWYKLQkgKiAgICAgICAgICAgIERlc3RpbmF0aW9uIGJ1ZmZlcgotCSAqIEBwYXJhbSBvZmYKLQkgKiAgICAgICAgICAgIE9mZnNldCBhdCB3aGljaCB0byBzdGFydCBzdG9yaW5nIGNoYXJhY3RlcnMKLQkgKiBAcGFyYW0gbGVuCi0JICogICAgICAgICAgICBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KLQkgKiAgICAgICAgIGhhcyBiZWVuIHJlYWNoZWQKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotCSAqLwotCi0JcHVibGljIGludCByZWFkKGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgY2hhcnNUb1JlYWQgPSAtMTsKLQkJLy8gaWYgYWxyZWFkeSBvdmVyIG1heCwganVzdCByZXR1cm4gLTEKLQkJLy8gcmVtZW1iZXIsIGN1cnJlbnRQb3NpdGlvbiBpcyB3aGF0IGlzIGdldHRpbmcgcmVhZHkgdG8gYmUgcmVhZAotCQkvLyAodGhhdCBpcywgaXRzIGFscmVhZHkgYmVlbiBpbmNyZW1lbnRlZCBpbiByZWFkKCkpLgotCQlpZiAoZkN1cnJlbnRQb3NpdGlvbiA8IGZNYXhpbXVtUmVhZE9mZnNldCkgewotCi0KLQkJCWludCBidWZmTWF4VG9SZWFkID0gY2J1Zi5sZW5ndGggLSBvZmY7Ci0JCQlpbnQgbWluUmVxdWVzdGVkID0gTWF0aC5taW4oYnVmZk1heFRvUmVhZCwgbGVuKTsKLQkJCWludCBsZW5ndGhSZW1haW5pbmcgPSBmTWF4aW11bVJlYWRPZmZzZXQgLSBmQ3VycmVudFBvc2l0aW9uOwotCQkJY2hhcnNUb1JlYWQgPSBNYXRoLm1pbihtaW5SZXF1ZXN0ZWQsIGxlbmd0aFJlbWFpbmluZyk7Ci0KLQotCQkJQ2hhclNlcXVlbmNlIHNlcSA9IGZPcmlnaW5hbFNvdXJjZS5zdWJTZXF1ZW5jZShmQ3VycmVudFBvc2l0aW9uLCBmQ3VycmVudFBvc2l0aW9uICsgY2hhcnNUb1JlYWQpOwotCQkJLy8gZm9yIG5vdywgaGFyZCBhc3N1bXB0aW9uIHRoYXQgb3JpZ2luYWwgaXMgYSBTdHJpbmcgc2luY2Ugc291cmNlCi0JCQkvLyBpcyBhc3N1bWVkIHRvIGJlIGRvY3VtZW50LCBvciB0ZXh0IHN0b3JlCi0JCQlTdHJpbmcgc2VxU3RyaW5nID0gKFN0cmluZykgc2VxOwotCQkJc2VxU3RyaW5nLmdldENoYXJzKDAsIHNlcVN0cmluZy5sZW5ndGgoKSwgY2J1Ziwgb2ZmKTsKLQotCi0KLQkJCWZDdXJyZW50UG9zaXRpb24gPSBmQ3VycmVudFBvc2l0aW9uICsgY2hhcnNUb1JlYWQ7Ci0KLQotCQl9Ci0JCXJldHVybiBjaGFyc1RvUmVhZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQ29yZU5vZGVMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQ29yZU5vZGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhY2Q5MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0NvcmVOb2RlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBDb3JlTm9kZUxpc3QgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCB7Ci0JaW50IGNvdW50ZWRMZW5ndGg7Ci0JaW50IGN1cnJlbnRJbmRleCA9IC0xOwotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIGZsYXROb2RlczsKLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWQ7Ci0KLQkvKioKLQkgKiBDb3JlTm9kZUxpc3QgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ29yZU5vZGVMaXN0KCkgewotCQlzdXBlcigpOwotCQkvLyBjcmVhdGUgYW4gYXJyYXksIGV2ZW4gaWYgemVybyBsZW5ndGgKLQkJZmxhdE5vZGVzID0gbmV3IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bMF07Ci0JfQotCi0JcHVibGljIENvcmVOb2RlTGlzdChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld0hlYWQpIHsKLQkJc3VwZXIoKTsKLQkJLy8gc2F2ZSBoZWFkCi0JCWhlYWQgPSBuZXdIZWFkOwotCQlpbnQgY291bnQgPSAwOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvdW50Tm9kZSA9IG5ld0hlYWQ7Ci0JCS8vIHdlIGhhdmUgdG8gZ28gdGhyb3VnaCB0aGUgbGlzdCBvbmNlLCB0byBnZXQgaXRzCi0JCS8vIGxlbmd0aCBpbiBvcmRlciB0byBjcmVhdGUgdGhlIGFycmF5Ci0JCXdoaWxlIChjb3VudE5vZGUgIT0gbnVsbCkgewotCQkJY291bnQrKzsKLQkJCWNvdW50Tm9kZSA9IGNvdW50Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJLy8gY3JlYXRlIGFuIGFycmF5LCBldmVuIGlmIHplcm8gbGVuZ3RoCi0JCWZsYXROb2RlcyA9IG5ldyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW2NvdW50XTsKLQkJLy8gc3RhcnQgY291bnROb2RlIG92ZXIgYWdhaW4sIHNvIHRvIHNwZWFrLgotCQljb3VudE5vZGUgPSBuZXdIZWFkOwotCQljb3VudCA9IDA7Ci0JCXdoaWxlIChjb3VudE5vZGUgIT0gbnVsbCkgewotCQkJZmxhdE5vZGVzW2NvdW50KytdID0gY291bnROb2RlOwotCQkJY291bnROb2RlID0gY291bnROb2RlLmdldE5leHQoKTsKLQkJfQotCQlpZiAoY291bnQgPiAwKSB7Ci0JCQljdXJyZW50SW5kZXggPSAwOwotCQkJLy8gZWxzZSBpdCBzdGF5cyBhdCAtMSBpbml0aWFsaXplZCBhdCBvYmplY3QgY3JlYXRpb24KLQkJCS8vCi0JCQkvLyBzYXZlIGxlbmd0aAotCQkJY291bnRlZExlbmd0aCA9IGNvdW50OwotCQl9Ci0JfQotCi0JcHVibGljIENvcmVOb2RlTGlzdChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZCkgewotCQlzdXBlcigpOwotCQkvLyBzYXZlIGhlYWQKLQkJaGVhZCA9IHN0YXJ0OwotCQlpbnQgY291bnQgPSAwOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvdW50Tm9kZSA9IHN0YXJ0OwotCQlpZiAoKHN0YXJ0ID09IG51bGwpIHx8IChlbmQgPT0gbnVsbCkpIHsKLQkJCS8vIGVycm9yIGNvbmRpdGlvbgotCQkJLy90aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNdXN0IHByb3ZpZGUgc3RhcnQgYW5kIGVuZAotCQkJLy8gbm9kZXMgdG8gY29uc3RydWN0IENvcmVOb2RlTGlzdCIpOwotCQl9IGVsc2UgewotCQkJY291bnQgPSAxOwotCQkJd2hpbGUgKChjb3VudE5vZGUgIT0gbnVsbCkgJiYgKGNvdW50Tm9kZSAhPSBlbmQpKSB7Ci0JCQkJY291bnQrKzsKLQkJCQljb3VudE5vZGUgPSBjb3VudE5vZGUuZ2V0TmV4dCgpOwotCQkJfQotCQl9Ci0JCS8vIGlmIHdlIGVuZGVkIGJlY2F1c2UgdGhlIGxhc3Qgb25lIHdhcyBudWxsLAotCQkvLyBiYWNrdXAgb25lLgotCQlpZiAoY291bnROb2RlID09IG51bGwpCi0JCQljb3VudC0tOwotCQlpZiAoY291bnQgPCAwKSB7Ci0JCQljb3VudCA9IDA7Ci0JCX0KLQkJZmxhdE5vZGVzID0gbmV3IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bY291bnRdOwotCQlpZiAoY291bnQgPiAwKSB7Ci0JCQlmbGF0Tm9kZXNbMF0gPSBjb3VudE5vZGUgPSBzdGFydDsKLQkJCWZvciAoaW50IGkgPSAxOyBpIDwgY291bnQ7IGkrKykgewotCQkJCWZsYXROb2Rlc1tpXSA9IGZsYXROb2Rlc1tpIC0gMV0uZ2V0TmV4dCgpOwotCQkJfQotCi0JCX0KLQkJY3VycmVudEluZGV4ID0gMDsKLQkJY291bnRlZExlbmd0aCA9IGNvdW50OwotCX0KLQotCXB1YmxpYyBFbnVtZXJhdGlvbiBlbGVtZW50cygpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKChmbGF0Tm9kZXMgIT0gbnVsbCkgJiYgKGZsYXROb2Rlcy5sZW5ndGggPiAwKSkKLQkJCXJlc3VsdCA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbihmbGF0Tm9kZXNbMF0sIGZsYXROb2Rlc1tmbGF0Tm9kZXMubGVuZ3RoIC0gMV0pOwotCQllbHNlCi0JCQlyZXN1bHQgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24obnVsbCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmbGF0Tm9kZXMubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGVzKE9iamVjdCBvKSB7Ci0JCWlmIChmbGF0Tm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGF0Tm9kZXMubGVuZ3RoOyBpKyspCi0JCQlpZiAoZmxhdE5vZGVzW2ldID09IG8pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpdGVtKGludCBpKSB7Ci0JCXJldHVybiBmbGF0Tm9kZXNbaV07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0RlbGV0ZUVxdWFsUG9zaXRpb25VcGRhdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvRGVsZXRlRXF1YWxQb3NpdGlvblVwZGF0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzNzgzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvRGVsZXRlRXF1YWxQb3NpdGlvblVwZGF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRQb3NpdGlvblVwZGF0ZXI7Ci0KLS8qKgotICogRm9sbG93cyB0aGUgYmVoYXZpb3Igb2YgRGVmYXVsdFBvc2l0aW9uVXBkYXRlciBleGNlcHQgaW4gYWRkaXRpb24gdG8KLSAqIGRlbGV0aW5nL292ZXJ3cml0aW5nIHRleHQgd2hpY2ggY29tcGxldGVseSBjb250YWlucyB0aGUgcG9zaXRpb24gZGVsZXRlcwotICogdGhlIHBvc2l0aW9uLCBkZWxldGluZyB0ZXh0IHRoYXQgZXF1YWxzIHRoZSB0ZXh0IGluIHBvc2l0aW9uIGFsc28gZGVsZXRlcwotICogdGhlIHBvc2l0aW9uLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdFBvc2l0aW9uVXBkYXRlcgotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlRXF1YWxQb3NpdGlvblVwZGF0ZXIgZXh0ZW5kcyBEZWZhdWx0UG9zaXRpb25VcGRhdGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqLwotCXB1YmxpYyBEZWxldGVFcXVhbFBvc2l0aW9uVXBkYXRlcihTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJc3VwZXIoY2F0ZWdvcnkpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudGx5IGludmVzdGlnYXRlZCBwb3NpdGlvbiBoYXMgYmVlbiBkZWxldGVkCi0JICogYnkgdGhlIHJlcGxhY2Ugb3BlcmF0aW9uIHNwZWNpZmllZCBpbiB0aGUgY3VycmVudCBldmVudC4gSWYgc28sIGl0Ci0JICogZGVsZXRlcyB0aGUgcG9zaXRpb24gYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgZG9jdW1lbnQncyBwb3NpdGlvbgotCSAqIGNhdGVnb3J5LgotCSAqIAotCSAqIE5PVEU6IHBvc2l0aW9uIGlzIGRlbGV0ZWQgaWYgY3VycmVudCBldmVudCBjb21wbGV0ZWx5IG92ZXJ3cml0ZXMKLQkgKiBwb3NpdGlvbiBPUiBpZiBjdXJyZW50IGV2ZW50IGRlbGV0ZXMgdGhlIGFyZWEgc3Vycm91bmRpbmcvaW5jbHVkaW5nIHRoZQotCSAqIHBvc2l0aW9uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwb3NpdGlvbiBoYXMgYmVlbiBkZWxldGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbm90RGVsZXRlZCgpIHsKLQkJLy8gcG9zaXRpb24gaXMgZGVsZXRlZCBpZiBjdXJyZW50IGV2ZW50IGNvbXBsZXRlbHkgb3ZlcndyaXRlcyBwb3NpdGlvbgotCQkvLyBPUiBpZgotCQkvLyBjdXJyZW50IGV2ZW50IGRlbGV0ZXMgdGhlIGFyZWEgc3Vycm91bmRpbmcvaW5jbHVkaW5nIHRoZSBwb3NpdGlvbgotCQlpZiAoKGZPZmZzZXQgPCBmUG9zaXRpb24ub2Zmc2V0ICYmIChmUG9zaXRpb24ub2Zmc2V0ICsgZlBvc2l0aW9uLmxlbmd0aCA8IGZPZmZzZXQgKyBmTGVuZ3RoKSkgfHwgKGZPZmZzZXQgPD0gZlBvc2l0aW9uLm9mZnNldCAmJiAoZlBvc2l0aW9uLm9mZnNldCArIGZQb3NpdGlvbi5sZW5ndGggPD0gZk9mZnNldCArIGZMZW5ndGgpICYmIGZSZXBsYWNlTGVuZ3RoID09IDApKSB7Ci0KLQkJCWZQb3NpdGlvbi5kZWxldGUoKTsKLQotCQkJdHJ5IHsKLQkJCQlmRG9jdW1lbnQucmVtb3ZlUG9zaXRpb24oZ2V0Q2F0ZWdvcnkoKSwgZlBvc2l0aW9uKTsKLQkJCX0gY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24geCkgewotCQkJfQotCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9HZW5lcmljUG9zaXRpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvR2VuZXJpY1Bvc2l0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTQyMmEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9HZW5lcmljUG9zaXRpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0UG9zaXRpb25VcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklQb3NpdGlvblVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogQmFzZWQgb24gdGhlIFBvc2l0aW9uIG1hbmFnZW1lbnQgbWV0aG9kcyBmcm9tCi0gKiBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkFic3RyYWN0RG9jdW1lbnQKLSAqLwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlciB7Ci0JcHJpdmF0ZSBDaGFyU2VxdWVuY2UgZkNoYXJTZXF1ZW5jZTsKLQotCi0KLQlwcml2YXRlIE1hcCBmUG9zaXRpb25zOwotCS8qKiBBbGwgcmVnaXN0ZXJlZCBkb2N1bWVudCBwb3NpdGlvbiB1cGRhdGVycyAqLwotCXByaXZhdGUgTGlzdCBmUG9zaXRpb25VcGRhdGVyczsKLQotCS8qKgotCSAqIGRvbid0IGFsbG93IGluc3RhbnRpYXRpb24gd2l0aCBvdXQgZG9jdW1lbnQgcG9pbnRlcgotCSAqIAotCSAqLwotCXByaXZhdGUgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlcihDaGFyU2VxdWVuY2UgY2hhclNlcXVlbmNlKSB7Ci0JCXRoaXMoKTsKLQkJLy8gd2Ugb25seSB1c2UgY2hhclNlcXVlbmNlIGZvciAibGVuZ3RoIiwgdG8KLQkJLy8gbWFkZSBtb3JlIGdlbmVyaWMgdGhhbiAiZG9jdW1lbnQiIGV2ZW4gInRleHQgc3RvcmUiCi0JCWZDaGFyU2VxdWVuY2UgPSBjaGFyU2VxdWVuY2U7Ci0JCWNvbXBsZXRlSW5pdGlhbGl6YXRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjYWRkUG9zaXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvbihQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWFkZFBvc2l0aW9uKElEb2N1bWVudC5ERUZBVUxUX0NBVEVHT1JZLCBwb3NpdGlvbik7Ci0JCX0KLQkJY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNhZGRQb3NpdGlvbihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbikKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUG9zaXRpb24oU3RyaW5nIGNhdGVnb3J5LCBQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQotCQlpZiAoKDAgPiBwb3NpdGlvbi5vZmZzZXQpIHx8ICgwID4gcG9zaXRpb24ubGVuZ3RoKSB8fCAocG9zaXRpb24ub2Zmc2V0ICsgcG9zaXRpb24ubGVuZ3RoID4gZ2V0RG9jdW1lbnRMZW5ndGgoKSkpCi0JCQl0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJTGlzdCBsaXN0ID0gKExpc3QpIGZQb3NpdGlvbnMuZ2V0KGNhdGVnb3J5KTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJbGlzdC5hZGQoY29tcHV0ZUluZGV4SW5Qb3NpdGlvbkxpc3QobGlzdCwgcG9zaXRpb24ub2Zmc2V0KSwgcG9zaXRpb24pOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNhZGRQb3NpdGlvbkNhdGVnb3J5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLQotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoIWNvbnRhaW5zUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSkpCi0JCQlmUG9zaXRpb25zLnB1dChjYXRlZ29yeSwgbmV3IEFycmF5TGlzdCgpKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjYWRkUG9zaXRpb25VcGRhdGVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyKSB7Ci0JCWluc2VydFBvc2l0aW9uVXBkYXRlcih1cGRhdGVyLCBmUG9zaXRpb25VcGRhdGVycy5zaXplKCkpOwotCX0KLQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZG9jdW1lbnQgbGlzdGVuZXJzLCBwb3NpdGlvbnMsIGFuZCBwb3NpdGlvbiB1cGRhdGVycy4gTXVzdAotCSAqIGJlIGNhbGxlZCBpbnNpZGUgdGhlIGNvbnN0cnVjdG9yIGFmdGVyIHRoZSBpbXBsZW1lbnRhdGlvbiBwbHVnLWlucyBoYXZlCi0JICogYmVlbiBzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcGxldGVJbml0aWFsaXphdGlvbigpIHsKLQotCQlmUG9zaXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJZlBvc2l0aW9uVXBkYXRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJYWRkUG9zaXRpb25DYXRlZ29yeShJRG9jdW1lbnQuREVGQVVMVF9DQVRFR09SWSk7Ci0JCWFkZFBvc2l0aW9uVXBkYXRlcihuZXcgRGVmYXVsdFBvc2l0aW9uVXBkYXRlcihJRG9jdW1lbnQuREVGQVVMVF9DQVRFR09SWSkpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNjb21wdXRlSW5kZXhJbkNhdGVnb3J5KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIGludCBjb21wdXRlSW5kZXhJbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSwgaW50IG9mZnNldCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQotCQlpZiAoMCA+IG9mZnNldCB8fCBvZmZzZXQgPiBnZXREb2N1bWVudExlbmd0aCgpKQotCQkJdGhyb3cgbmV3IEJhZExvY2F0aW9uRXhjZXB0aW9uKCk7Ci0KLQkJTGlzdCBjID0gKExpc3QpIGZQb3NpdGlvbnMuZ2V0KGNhdGVnb3J5KTsKLQkJaWYgKGMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJcmV0dXJuIGNvbXB1dGVJbmRleEluUG9zaXRpb25MaXN0KGMsIG9mZnNldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgaW5kZXggaW4gdGhlIGxpc3Qgb2YgcG9zaXRpb25zIGF0IHdoaWNoIGEgcG9zaXRpb24gd2l0aAotCSAqIHRoZSBnaXZlbiBvZmZzZXQgd291bGQgYmUgaW5zZXJ0ZWQuIFRoZSBwb3NpdGlvbiBpcyBzdXBwb3NlZCB0byBiZWNvbWUKLQkgKiB0aGUgZmlyc3QgaW4gdGhpcyBsaXN0IG9mIGFsbCBwb3NpdGlvbnMgd2l0aCB0aGUgc2FtZSBvZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9ucwotCSAqICAgICAgICAgICAgdGhlIGxpc3QgaW4gd2hpY2ggdGhlIGluZGV4IGlzIGNvbXB1dGVkCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBmb3Igd2hpY2ggdGhlIGluZGV4IGlzIGNvbXB1dGVkCi0JICogQHJldHVybiB0aGUgY29tcHV0ZWQgaW5kZXgKLQkgKiAKLQkgKiBAc2VlIElEb2N1bWVudCNjb21wdXRlSW5kZXhJbkNhdGVnb3J5KFN0cmluZywgaW50KQotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgaW50IGNvbXB1dGVJbmRleEluUG9zaXRpb25MaXN0KExpc3QgcG9zaXRpb25zLCBpbnQgb2Zmc2V0KSB7Ci0KLQkJaWYgKHBvc2l0aW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiAwOwotCi0JCWludCBsZWZ0ID0gMDsKLQkJaW50IHJpZ2h0ID0gcG9zaXRpb25zLnNpemUoKSAtIDE7Ci0JCWludCBtaWQgPSAwOwotCQlQb3NpdGlvbiBwID0gbnVsbDsKLQotCQl3aGlsZSAobGVmdCA8IHJpZ2h0KSB7Ci0KLQkJCW1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKLQotCQkJcCA9IChQb3NpdGlvbikgcG9zaXRpb25zLmdldChtaWQpOwotCQkJaWYgKG9mZnNldCA8IHAuZ2V0T2Zmc2V0KCkpIHsKLQkJCQlpZiAobGVmdCA9PSBtaWQpCi0JCQkJCXJpZ2h0ID0gbGVmdDsKLQkJCQllbHNlCi0JCQkJCXJpZ2h0ID0gbWlkIC0gMTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9mZnNldCA+IHAuZ2V0T2Zmc2V0KCkpIHsKLQkJCQlpZiAocmlnaHQgPT0gbWlkKQotCQkJCQlsZWZ0ID0gcmlnaHQ7Ci0JCQkJZWxzZQotCQkJCQlsZWZ0ID0gbWlkICsgMTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9mZnNldCA9PSBwLmdldE9mZnNldCgpKSB7Ci0JCQkJbGVmdCA9IHJpZ2h0ID0gbWlkOwotCQkJfQotCi0JCX0KLQotCQlpbnQgcG9zID0gbGVmdDsKLQkJcCA9IChQb3NpdGlvbikgcG9zaXRpb25zLmdldChwb3MpOwotCQlpZiAob2Zmc2V0ID4gcC5nZXRPZmZzZXQoKSkgewotCQkJLy8gYXBwZW5kIHRvIHRoZSBlbmQKLQkJCXBvcysrOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gZW50cnkgd2lsbCBiZWNhbWUgdGhlIGZpcnN0IG9mIGFsbCBlbnRyaWVzIHdpdGggdGhlIHNhbWUKLQkJCS8vIG9mZnNldAotCQkJZG8gewotCQkJCS0tcG9zOwotCQkJCWlmIChwb3MgPCAwKQotCQkJCQlicmVhazsKLQkJCQlwID0gKFBvc2l0aW9uKSBwb3NpdGlvbnMuZ2V0KHBvcyk7Ci0JCQl9Ci0JCQl3aGlsZSAob2Zmc2V0ID09IHAuZ2V0T2Zmc2V0KCkpOwotCQkJKytwb3M7Ci0JCX0KLQotCQlBc3NlcnQuaXNUcnVlKDAgPD0gcG9zICYmIHBvcyA8PSBwb3NpdGlvbnMuc2l6ZSgpKTsKLQotCQlyZXR1cm4gcG9zOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNjb250YWluc1Bvc2l0aW9uKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uKFN0cmluZyBjYXRlZ29yeSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCi0JCWlmIChjYXRlZ29yeSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUxpc3QgbGlzdCA9IChMaXN0KSBmUG9zaXRpb25zLmdldChjYXRlZ29yeSk7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpbnQgaW5kZXggPSBjb21wdXRlSW5kZXhJblBvc2l0aW9uTGlzdChsaXN0LCBvZmZzZXQpOwotCQlpZiAoaW5kZXggPCBzaXplKSB7Ci0JCQlQb3NpdGlvbiBwID0gKFBvc2l0aW9uKSBsaXN0LmdldChpbmRleCk7Ci0JCQl3aGlsZSAocCAhPSBudWxsICYmIHAub2Zmc2V0ID09IG9mZnNldCkgewotCQkJCWlmIChwLmxlbmd0aCA9PSBsZW5ndGgpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCSsraW5kZXg7Ci0JCQkJcCA9IChpbmRleCA8IHNpemUpID8gKFBvc2l0aW9uKSBsaXN0LmdldChpbmRleCkgOiBudWxsOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNjb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmIChjYXRlZ29yeSAhPSBudWxsKQotCQkJcmV0dXJuIGZQb3NpdGlvbnMuY29udGFpbnNLZXkoY2F0ZWdvcnkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQotCXB1YmxpYyBpbnQgZ2V0RG9jdW1lbnRMZW5ndGgoKSB7Ci0JCXJldHVybiBmQ2hhclNlcXVlbmNlLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHBvc2l0aW9ucyBtYW5hZ2VkIGJ5IHRoZSBkb2N1bWVudCBncm91cGVkIGJ5IGNhdGVnb3J5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50J3MgcG9zaXRpb25zCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXREb2N1bWVudE1hbmFnZWRQb3NpdGlvbnMoKSB7Ci0JCXJldHVybiBmUG9zaXRpb25zOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNnZXRQb3NpdGlvbkNhdGVnb3JpZXMoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRQb3NpdGlvbkNhdGVnb3JpZXMoKSB7Ci0JCVN0cmluZ1tdIGNhdGVnb3JpZXMgPSBuZXcgU3RyaW5nW2ZQb3NpdGlvbnMuc2l6ZSgpXTsKLQkJSXRlcmF0b3Iga2V5cyA9IGZQb3NpdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yaWVzLmxlbmd0aDsgaSsrKQotCQkJY2F0ZWdvcmllc1tpXSA9IChTdHJpbmcpIGtleXMubmV4dCgpOwotCQlyZXR1cm4gY2F0ZWdvcmllczsKLQl9Ci0KLQotCXB1YmxpYyBQb3NpdGlvbltdIGdldFBvc2l0aW9ucyhTdHJpbmcgY2F0ZWdvcnkpIHRocm93cyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJTGlzdCBjID0gKExpc3QpIGZQb3NpdGlvbnMuZ2V0KGNhdGVnb3J5KTsKLQkJaWYgKGMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJUG9zaXRpb25bXSBwb3NpdGlvbnMgPSBuZXcgUG9zaXRpb25bYy5zaXplKCldOwotCQljLnRvQXJyYXkocG9zaXRpb25zKTsKLQkJcmV0dXJuIHBvc2l0aW9uczsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjZ2V0UG9zaXRpb25VcGRhdGVycygpCi0JICovCi0JcHVibGljIElQb3NpdGlvblVwZGF0ZXJbXSBnZXRQb3NpdGlvblVwZGF0ZXJzKCkgewotCQlJUG9zaXRpb25VcGRhdGVyW10gdXBkYXRlcnMgPSBuZXcgSVBvc2l0aW9uVXBkYXRlcltmUG9zaXRpb25VcGRhdGVycy5zaXplKCldOwotCQlmUG9zaXRpb25VcGRhdGVycy50b0FycmF5KHVwZGF0ZXJzKTsKLQkJcmV0dXJuIHVwZGF0ZXJzOwotCX0KLQotCi0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjaW5zZXJ0UG9zaXRpb25VcGRhdGVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5zZXJ0UG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlciwgaW50IGluZGV4KSB7Ci0KLQkJZm9yIChpbnQgaSA9IGZQb3NpdGlvblVwZGF0ZXJzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoZlBvc2l0aW9uVXBkYXRlcnMuZ2V0KGkpID09IHVwZGF0ZXIpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGluZGV4ID09IGZQb3NpdGlvblVwZGF0ZXJzLnNpemUoKSkKLQkJCWZQb3NpdGlvblVwZGF0ZXJzLmFkZCh1cGRhdGVyKTsKLQkJZWxzZQotCQkJZlBvc2l0aW9uVXBkYXRlcnMuYWRkKGluZGV4LCB1cGRhdGVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjcmVtb3ZlUG9zaXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbihQb3NpdGlvbiBwb3NpdGlvbikgewotCQl0cnkgewotCQkJcmVtb3ZlUG9zaXRpb24oSURvY3VtZW50LkRFRkFVTFRfQ0FURUdPUlksIHBvc2l0aW9uKTsKLQkJfQotCQljYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjcmVtb3ZlUG9zaXRpb24oamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb24pCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVBvc2l0aW9uKFN0cmluZyBjYXRlZ29yeSwgUG9zaXRpb24gcG9zaXRpb24pIHRocm93cyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQotCQlpZiAocG9zaXRpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJTGlzdCBjID0gKExpc3QpIGZQb3NpdGlvbnMuZ2V0KGNhdGVnb3J5KTsKLQkJaWYgKGMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJLy8gcmVtb3ZlIGJhc2VkIG9uIGlkZW50aXR5IG5vdCBlcXVhbGl0eQotCQlpbnQgc2l6ZSA9IGMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHBvc2l0aW9uID09IGMuZ2V0KGkpKSB7Ci0JCQkJYy5yZW1vdmUoaSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I3JlbW92ZVBvc2l0aW9uQ2F0ZWdvcnkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgdGhyb3dzIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCi0JCWlmIChjYXRlZ29yeSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghY29udGFpbnNQb3NpdGlvbkNhdGVnb3J5KGNhdGVnb3J5KSkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJZlBvc2l0aW9ucy5yZW1vdmUoY2F0ZWdvcnkpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNyZW1vdmVQb3NpdGlvblVwZGF0ZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUG9zaXRpb25VcGRhdGVyKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyKSB7Ci0JCWZvciAoaW50IGkgPSBmUG9zaXRpb25VcGRhdGVycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKGZQb3NpdGlvblVwZGF0ZXJzLmdldChpKSA9PSB1cGRhdGVyKSB7Ci0JCQkJZlBvc2l0aW9uVXBkYXRlcnMucmVtb3ZlKGkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogVXBkYXRlcyBhbGwgcG9zaXRpb25zIG9mIGFsbCBjYXRlZ29yaWVzIHRvIHRoZSBjaGFuZ2UgZGVzY3JpYmVkIGJ5IHRoZQotCSAqIGRvY3VtZW50IGV2ZW50LiBBbGwgcmVnaXN0ZXJlZCBkb2N1bWVudCB1cGRhdGVycyBhcmUgY2FsbGVkIGluIHRoZQotCSAqIHNlcXVlbmNlIHRoZXkgaGF2ZSBiZWVuIGFycmFuZ2VkLiBVc2VzIGEgcm9idXN0IGl0ZXJhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGV2ZW50IGRlc2NyaWJpbmcgdGhlIGNoYW5nZSB0byB3aGljaCB0byBhZGFwdAotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9ucwotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCB1cGRhdGVQb3NpdGlvbnMoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGZQb3NpdGlvblVwZGF0ZXJzKTsKLQkJSXRlcmF0b3IgZSA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJUG9zaXRpb25VcGRhdGVyIHUgPSAoSVBvc2l0aW9uVXBkYXRlcikgZS5uZXh0KCk7Ci0JCQl1LnVwZGF0ZShldmVudCk7Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0lFeGVjdXRpb25EZWxlZ2F0YWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0lFeGVjdXRpb25EZWxlZ2F0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2VkMjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9JRXhlY3V0aW9uRGVsZWdhdGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5JRXhlY3V0aW9uRGVsZWdhdGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUV4ZWN1dGlvbkRlbGVnYXRhYmxlIHsKLQotCXZvaWQgc2V0RXhlY3V0aW9uRGVsZWdhdGUoSUV4ZWN1dGlvbkRlbGVnYXRlIGV4ZWN1dGlvbkRlbGVnYXRlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9JUmVnaW9uQ29tcGFyaWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0lSZWdpb25Db21wYXJpYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMzA0MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0lSZWdpb25Db21wYXJpYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElSZWdpb25Db21wYXJpYmxlIHsKLQlib29sZWFuIHJlZ2lvbk1hdGNoZXMoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSk7Ci0KLQlib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0pvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAyYjUwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5JRXhlY3V0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLklMb2NrYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci0KLS8qKgotICogQW4gSVN0cnVjdHVyZWREb2N1bWVudCB0aGF0IHBlcmZvcm1zIG1vc3Qgb2YgaXRzIGNvbXB1dGF0aW9uIGFuZCBldmVudAotICogbm90aWZpY2F0aW9uIHRocm91Z2ggYW4gSUV4ZWN1dGlvbkRlbGVnYXRlLgotICogCi0gKiBJZiB0aGUgZGVsZWdhdGUgaGFzIG5vdCBiZWVuIHNldCwgd2UgZXhlY3V0ZSBvbiBjdXJyZW50IHRocmVhZCwgbGlrZQotICogIm5vcm1hbCIuIFRoaXMgaXMgdGhlIGNhc2UgZm9yIG5vcm1hbCBub24tZWRpdG9yIHVzZSAod2hpY2ggc2hvdWxkIHN0aWxsLAotICogdWx0aW1hdGVseSwgYmUgcHJvdGVjdGVkIGJ5IGEgc2NoZWR1bGluZyBydWxlKS4gRm9yIGV2ZXJ5IG9wZXJhdGlvbiwgYQotICogcnVubmFibGUgaXMgY3JlYXRlZCwgZXZlbiBpZiBsYXRlciAoaW4gdGhlIGV4ZWN1dGlvbiBkZWxlZ2F0ZSBpbnN0YW5jZSkgaXQKLSAqIGlzIGRlY2lkZWQgbm90aGluZyBzcGVjaWFsIGlzIG5lZWRlZCAodGhhdCBpcywgaW4gZmFjdCBiZWluZyBjYWxsZWQgZnJvbSBhbgotICogZWRpdG9yJ3MgZGlzcGxheSB0aHJlYWQsIGluIHdoaWNoIGNhc2UgaXRzIGp1c3QgZXhlY3V0ZWQpIGluIHRoZSBVSS4KLSAqLwotcHVibGljIGNsYXNzIEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQgZXh0ZW5kcyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCBpbXBsZW1lbnRzIElFeGVjdXRpb25EZWxlZ2F0YWJsZSwgSUxvY2thYmxlIHsKLQotCXByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEpvYlNhZmVSdW5uYWJsZSBpbXBsZW1lbnRzIElTYWZlUnVubmFibGUgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJLy8gbG9nZ2VkIGluIFNhZmVSdW5uZXIKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0YWNrIGZFeGVjdXRpb25EZWxlZ2F0ZXMgPSBuZXcgU3RhY2soKTsKLQlwcml2YXRlIElMb2NrIGZMb2NrYWJsZSA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkubmV3TG9jaygpOwotCi0JcHVibGljIEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlwdWJsaWMgSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudChSZWdpb25QYXJzZXIgcGFyc2VyKSB7Ci0JCXN1cGVyKHBhcnNlcik7Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhY3F1aXJlTG9jaygpIHsKLQkJZ2V0TG9ja09iamVjdCgpLmFjcXVpcmUoKTsKLQl9Ci0KLQlwcml2YXRlIElFeGVjdXRpb25EZWxlZ2F0ZSBnZXRFeGVjdXRpb25EZWxlZ2F0ZSgpIHsKLQkJaWYgKCFmRXhlY3V0aW9uRGVsZWdhdGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiAoSUV4ZWN1dGlvbkRlbGVnYXRlKSBmRXhlY3V0aW9uRGVsZWdhdGVzLnBlZWsoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklMb2NrYWJsZSNnZXRMb2NrKCkKLQkgKi8KLQotCXB1YmxpYyBJTG9jayBnZXRMb2NrT2JqZWN0KCkgewotCQlyZXR1cm4gZkxvY2thYmxlOwotCX0KLQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVsZWFzZUxvY2soKSB7Ci0JCWdldExvY2tPYmplY3QoKS5yZWxlYXNlKCk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudC5yZXBsYWNlKGludCwgaW50LCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZShmaW5hbCBpbnQgb2Zmc2V0LCBmaW5hbCBpbnQgbGVuZ3RoLCBmaW5hbCBTdHJpbmcgdGV4dCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJSUV4ZWN1dGlvbkRlbGVnYXRlIGRlbGVnYXRlID0gZ2V0RXhlY3V0aW9uRGVsZWdhdGUoKTsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXN1cGVyLnJlcGxhY2Uob2Zmc2V0LCBsZW5ndGgsIHRleHQpOwotCQl9Ci0JCWVsc2UgewotCQkJSm9iU2FmZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IEpvYlNhZmVSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudC5zdXBlci5yZXBsYWNlKG9mZnNldCwgbGVuZ3RoLCB0ZXh0KTsKLQkJCQl9Ci0JCQl9OwotCQkJZGVsZWdhdGUuZXhlY3V0ZShydW5uYWJsZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNC5yZXBsYWNlKGludCwgaW50LCBTdHJpbmcsIGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZShmaW5hbCBpbnQgb2Zmc2V0LCBmaW5hbCBpbnQgbGVuZ3RoLCBmaW5hbCBTdHJpbmcgdGV4dCwgZmluYWwgbG9uZyBtb2RpZmljYXRpb25TdGFtcCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJSUV4ZWN1dGlvbkRlbGVnYXRlIGRlbGVnYXRlID0gZ2V0RXhlY3V0aW9uRGVsZWdhdGUoKTsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXN1cGVyLnJlcGxhY2Uob2Zmc2V0LCBsZW5ndGgsIHRleHQsIG1vZGlmaWNhdGlvblN0YW1wKTsKLQkJfQotCQllbHNlIHsKLQkJCUpvYlNhZmVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBKb2JTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCUpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQuc3VwZXIucmVwbGFjZShvZmZzZXQsIGxlbmd0aCwgdGV4dCwgbW9kaWZpY2F0aW9uU3RhbXApOwotCQkJCX0KLQkJCX07Ci0JCQlkZWxlZ2F0ZS5leGVjdXRlKHJ1bm5hYmxlKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50I3JlcGxhY2VUZXh0KGphdmEubGFuZy5PYmplY3QsIGludCwgaW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBsYWNlVGV4dChmaW5hbCBPYmplY3QgcmVxdWVzdGVyLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCByZXBsYWNlbWVudExlbmd0aCwgZmluYWwgU3RyaW5nIGNoYW5nZXMpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQgPSBudWxsOwotCQlJRXhlY3V0aW9uRGVsZWdhdGUgZGVsZWdhdGUgPSBnZXRFeGVjdXRpb25EZWxlZ2F0ZSgpOwotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJZXZlbnQgPSBzdXBlci5yZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmaW5hbCBPYmplY3RbXSByZXN1bHRTbG90ID0gbmV3IE9iamVjdFsxXTsKLQkJCUpvYlNhZmVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBKb2JTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCXJlc3VsdFNsb3RbMF0gPSBKb2JTYWZlU3RydWN0dXJlZERvY3VtZW50LnN1cGVyLnJlcGxhY2VUZXh0KHJlcXVlc3Rlciwgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoLCBjaGFuZ2VzKTsKLQkJCQl9Ci0JCQl9OwotCQkJZGVsZWdhdGUuZXhlY3V0ZShydW5uYWJsZSk7Ci0JCQlldmVudCA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgcmVzdWx0U2xvdFswXTsKLQkJfQotCQlyZXR1cm4gZXZlbnQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudCNyZXBsYWNlVGV4dChqYXZhLmxhbmcuT2JqZWN0LCBpbnQsIGludCwgamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoZmluYWwgT2JqZWN0IHJlcXVlc3RlciwgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIGZpbmFsIFN0cmluZyBjaGFuZ2VzLCBmaW5hbCBib29sZWFuIGlnbm9yZVJlYWRPbmx5U2V0dGluZ3MpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQgPSBudWxsOwotCQlJRXhlY3V0aW9uRGVsZWdhdGUgZGVsZWdhdGUgPSBnZXRFeGVjdXRpb25EZWxlZ2F0ZSgpOwotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJZXZlbnQgPSBzdXBlci5yZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcywgaWdub3JlUmVhZE9ubHlTZXR0aW5ncyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmaW5hbCBPYmplY3RbXSByZXN1bHRTbG90ID0gbmV3IE9iamVjdFsxXTsKLQkJCUpvYlNhZmVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBKb2JTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCXJlc3VsdFNsb3RbMF0gPSBKb2JTYWZlU3RydWN0dXJlZERvY3VtZW50LnN1cGVyLnJlcGxhY2VUZXh0KHJlcXVlc3Rlciwgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoLCBjaGFuZ2VzLCBpZ25vcmVSZWFkT25seVNldHRpbmdzKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQlyZXN1bHRTbG90WzBdID0gbmV3IE5vQ2hhbmdlRXZlbnQoSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudC50aGlzLCByZXF1ZXN0ZXIsIGNoYW5nZXMsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCk7Ci0JCQkJCXN1cGVyLmhhbmRsZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJCX0KLQkJCX07Ci0JCQlkZWxlZ2F0ZS5leGVjdXRlKHJ1bm5hYmxlKTsKLQkJCWV2ZW50ID0gKFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSByZXN1bHRTbG90WzBdOwotCQl9Ci0JCXJldHVybiBldmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeGVjdXRpb25EZWxlZ2F0ZShJRXhlY3V0aW9uRGVsZWdhdGUgZGVsZWdhdGUpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpCi0JCQlmRXhlY3V0aW9uRGVsZWdhdGVzLnB1c2goZGVsZWdhdGUpOwotCQllbHNlIGlmICghZkV4ZWN1dGlvbkRlbGVnYXRlcy5pc0VtcHR5KCkpCi0JCQlmRXhlY3V0aW9uRGVsZWdhdGVzLnBvcCgpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBzZXRUZXh0KGZpbmFsIE9iamVjdCByZXF1ZXN0ZXIsIGZpbmFsIFN0cmluZyB0aGVTdHJpbmcpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQgPSBudWxsOwotCQlJRXhlY3V0aW9uRGVsZWdhdGUgZXhlY3V0aW9uRGVsZWdhdGUgPSBnZXRFeGVjdXRpb25EZWxlZ2F0ZSgpOwotCQlpZiAoZXhlY3V0aW9uRGVsZWdhdGUgPT0gbnVsbCkgewotCQkJZXZlbnQgPSBzdXBlci5zZXRUZXh0KHJlcXVlc3RlciwgdGhlU3RyaW5nKTsKLQkJfQotCQllbHNlIHsKLQkJCWZpbmFsIE9iamVjdFtdIHJlc3VsdFNsb3QgPSBuZXcgT2JqZWN0WzFdOwotCQkJSm9iU2FmZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IEpvYlNhZmVSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJcmVzdWx0U2xvdFswXSA9IEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQuc3VwZXIuc2V0VGV4dChyZXF1ZXN0ZXIsIHRoZVN0cmluZyk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCXJlc3VsdFNsb3RbMF0gPSBuZXcgTm9DaGFuZ2VFdmVudChKb2JTYWZlU3RydWN0dXJlZERvY3VtZW50LnRoaXMsIHJlcXVlc3RlciwgdGhlU3RyaW5nLCAwLCAwKTsKLQkJCQkJc3VwZXIuaGFuZGxlRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJfTsKLQkJCWV4ZWN1dGlvbkRlbGVnYXRlLmV4ZWN1dGUocnVubmFibGUpOwotCQkJZXZlbnQgPSAoU3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHJlc3VsdFNsb3RbMF07Ci0JCX0KLQkJcmV0dXJuIGV2ZW50OwotCX0KLQotCXB1YmxpYyBEb2N1bWVudFJld3JpdGVTZXNzaW9uIHN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUgc2Vzc2lvblR5cGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uIHNlc3Npb24gPSBudWxsOwotCQlJRXhlY3V0aW9uRGVsZWdhdGUgZXhlY3V0aW9uRGVsZWdhdGUgPSBnZXRFeGVjdXRpb25EZWxlZ2F0ZSgpOwotCQlpZiAoZXhlY3V0aW9uRGVsZWdhdGUgPT0gbnVsbCkgewotCQkJc2Vzc2lvbiA9IGludGVybmFsU3RhcnRSZXdyaXRlU2Vzc2lvbihzZXNzaW9uVHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmaW5hbCBPYmplY3RbXSByZXN1bHRTbG90ID0gbmV3IE9iamVjdFsxXTsKLQkJCWZpbmFsIERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlIGZpbmFsU2Vzc2lvblR5cGUgPSBzZXNzaW9uVHlwZTsKLQkJCUpvYlNhZmVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBKb2JTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCXJlc3VsdFNsb3RbMF0gPSBpbnRlcm5hbFN0YXJ0UmV3cml0ZVNlc3Npb24oZmluYWxTZXNzaW9uVHlwZSk7Ci0JCQkJfQotCQkJfTsKLQkJCWV4ZWN1dGlvbkRlbGVnYXRlLmV4ZWN1dGUocnVubmFibGUpOwotCQkJaWYgKHJlc3VsdFNsb3RbMF0gaW5zdGFuY2VvZiBUaHJvd2FibGUpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigoVGhyb3dhYmxlKSByZXN1bHRTbG90WzBdKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNlc3Npb24gPSAoRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbikgcmVzdWx0U2xvdFswXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2Vzc2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wUmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBzZXNzaW9uKSB7Ci0JCUlFeGVjdXRpb25EZWxlZ2F0ZSBleGVjdXRpb25EZWxlZ2F0ZSA9IGdldEV4ZWN1dGlvbkRlbGVnYXRlKCk7Ci0JCWlmIChleGVjdXRpb25EZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQlpbnRlcm5hbFN0b3BSZXdyaXRlU2Vzc2lvbihzZXNzaW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCWZpbmFsIERvY3VtZW50UmV3cml0ZVNlc3Npb24gZmluYWxTZXNzaW9uID0gc2Vzc2lvbjsKLQkJCUpvYlNhZmVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBKb2JTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCWludGVybmFsU3RvcFJld3JpdGVTZXNzaW9uKGZpbmFsU2Vzc2lvbik7Ci0JCQkJfQotCQkJfTsKLQkJCWV4ZWN1dGlvbkRlbGVnYXRlLmV4ZWN1dGUocnVubmFibGUpOwotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9NaW5pbWFsRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9NaW5pbWFsRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzZmYyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvTWluaW1hbERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUG9zaXRpb25VcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci0KLQotLyoqCi0gKiBQdXJlbHkgYSBkdW1teSAibWFya2VyIiBpbnN0YW5jZSBmb3IgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyB3aGljaCBhcmUKLSAqIGNyZWF0ZWQgdGVtb3JhcmlseSBpbiB0aGUgY291cnNlIG9mIHJlLXBhcnNpbmcuIFByaW1hcmlseSBhIHBsYWNlIGhvbGRlciwKLSAqIGJ1dCBjYW4gYmUgbmVlZGVkIHRvIGdldCB0ZXh0IGZyb20uCi0gKi8KLXB1YmxpYyBjbGFzcyBNaW5pbWFsRG9jdW1lbnQgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50IHsKLQlwcml2YXRlIFN1YlNldFRleHRTdG9yZSBkYXRhOwotCi0JLyoqCi0JICogTWFya2VkIHByaXZhdGUgdG8gYmUgc3VyZSBuZXZlciBjcmVhdGVkIHdpdGhvdXQgZGF0YSBiZWluZyBpbml0aWFsaXplZC4KLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBNaW5pbWFsRG9jdW1lbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE1pbmltYWxEb2N1bWVudChTdWJTZXRUZXh0U3RvcmUgaW5pdGlhbENvbnRlbnRzKSB7Ci0JCXRoaXMoKTsKLQkJZGF0YSA9IGluaXRpYWxDb250ZW50czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkRG9jdW1lbnRMaXN0ZW5lcihJRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcihJRG9jdW1lbnRMaXN0ZW5lciBkb2N1bWVudEFkYXB0ZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJLy8gVE9ETzogdGhpcyBpcyBjYWxsZWQgZnJvbSBub3RpZmllciBsb29wIGluYXBwcm9wcmlhdGVseQotCQkvLwl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7Ci0JfQotCi0JcHVibGljIGludCBjb21wdXRlSW5kZXhJbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSwgaW50IG9mZnNldCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBjb21wdXRlTnVtYmVyT2ZMaW5lcyhTdHJpbmcgdGV4dCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVR5cGVkUmVnaW9uW10gY29tcHV0ZVBhcnRpdGlvbmluZyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uKFN0cmluZyBjYXRlZ29yeSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGZpcmVOZXdEb2N1bWVudChPYmplY3QgcmVxdWVzdGVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0KCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gZGF0YS5nZXQoMCwgZGF0YS5nZXRMZW5ndGgoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXQoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkYXRhLmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JCX0gY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEJhZExvY2F0aW9uRXhjZXB0aW9uKCJvZmZzZXQ6ICIgKyBvZmZzZXQgKyAiIGxlbmd0aDogIiArIGxlbmd0aCArICJcbmRvY3VtZW50IGxlbmd0aDogIiArIGRhdGEuZ2V0TGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGNoYXIgZ2V0Q2hhcihpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZGF0YS5nZXQob2Zmc2V0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQkvLyB0ZW1wIGZpeAotCQlyZXR1cm4gbnVsbDsKLQkJLy8JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldExlZ2FsTGluZURlbGltaXRlcnMoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZGF0YS5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZlcmVkTGluZURlbGltaXRlcigpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKGludCBsaW5lKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBnZXRMaW5lSW5mb3JtYXRpb24oaW50IGxpbmUpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZUxlbmd0aChpbnQgbGluZSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRMaW5lT2Zmc2V0KGludCBsaW5lKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExpbmVPZk9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZMaW5lcygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXROdW1iZXJPZkxpbmVzKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiQW4gaW5zdGFuY2Ugb2YgTWluaW1hbERvY3VtZW50IHdhcyBhc2tlZCBmb3IgaXRzIHBhcnRpdGlvbiwgc29tZXRpbWUgaW5kaWNhdGluZyBhIGRlbGV0ZWQgcmVnaW9uIHdhcyBiZWluZyBhY2Nlc3NlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IFR5cGVkUmVnaW9uKDAsMCwgInVuZGVmaW5lZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFBvc2l0aW9uQ2F0ZWdvcmllcygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFBvc2l0aW9uW10gZ2V0UG9zaXRpb25zKFN0cmluZyBjYXRlZ29yeSkgdGhyb3dzIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVBvc2l0aW9uVXBkYXRlcltdIGdldFBvc2l0aW9uVXBkYXRlcnMoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGdldFJlZ2lvbkxpc3QoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBnZXRSZVBhcnNlcigpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZGF0YS5nZXQoMCwgZGF0YS5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50I2dldFVuZG9NYW5hZ2VyKCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgZ2V0VW5kb01hbmFnZXIoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydFBvc2l0aW9uVXBkYXRlcihJUG9zaXRpb25VcGRhdGVyIHVwZGF0ZXIsIGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYWtlUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCS8vIFRPRE86IHRoaXMgaXMgY2FsbGVkIGZyb20gbm90aWZpZXIgbG9vcCBpbmFwcHJvcHJpYXRlbHkKLQkJLy8JdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IG5ld0luc3RhbmNlKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3JlZ2lzdGVyUG9zdE5vdGlmaWNhdGlvblJlcGxhY2Uob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uLklSZXBsYWNlKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyUG9zdE5vdGlmaWNhdGlvblJlcGxhY2UoSURvY3VtZW50TGlzdGVuZXIgb3duZXIsIElSZXBsYWNlIHJlcGxhY2UpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXIoSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50TGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcihJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbihQb3NpdGlvbiBwb3NpdGlvbikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uVXBkYXRlcihJUG9zaXRpb25VcGRhdGVyIHVwZGF0ZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGRvY3VtZW50QWRhcHRlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXBsYWNlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0ZXh0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8JCWRhdGEucmVwbGFjZShvZmZzZXQsIGxlbmd0aCwgdGV4dCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGxhY2VUZXh0KE9iamVjdCBzb3VyY2UsIGludCBvbGRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgcmVxdWVzdGVkQ2hhbmdlKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudCNyZXBsYWNlVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50LCBpbnQsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGxhY2VUZXh0KE9iamVjdCBzb3VyY2UsIGludCBvbGRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgcmVxdWVzdGVkQ2hhbmdlLCBib29sZWFuIGlnbm9yZVJlYWRPbmx5U2V0dGluZykgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3Jlc3VtZVBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN1bWVQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBzZWFyY2goaW50IHN0YXJ0T2Zmc2V0LCBTdHJpbmcgZmluZFN0cmluZywgYm9vbGVhbiBmb3J3YXJkU2VhcmNoLCBib29sZWFuIGNhc2VTZW5zaXRpdmUsIGJvb2xlYW4gd2hvbGVXb3JkKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIHRleHQpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vCQlkYXRhLnNldCh0ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFBhcnRpdGlvbmVyKElEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nTWVtZW50byhFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgc2V0VGV4dChPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgYWxsVGV4dCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQjc2V0VW5kb01hbmFnZXIob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnVuZG8uU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmRvTWFuYWdlcihJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3N0YXJ0U2VxdWVudGlhbFJld3JpdGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydFNlcXVlbnRpYWxSZXdyaXRlKGJvb2xlYW4gbm9ybWFsaXplKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24jc3RvcFBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24jc3RvcFNlcXVlbnRpYWxSZXdyaXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wU2VxdWVudGlhbFJld3JpdGUoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaW5lRGVsaW1pdGVyKFN0cmluZyBkZWxpbWl0ZXIpIHsKLQkJCi0JfQotCQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1JlYWRPbmx5UG9zaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9SZWFkT25seVBvc2l0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNGJjY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1JlYWRPbmx5UG9zaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotCi1jbGFzcyBSZWFkT25seVBvc2l0aW9uIGV4dGVuZHMgUG9zaXRpb24gewotCXByaXZhdGUgYm9vbGVhbiBmSW5jbHVkZVN0YXJ0T2Zmc2V0ID0gZmFsc2U7Ci0KLQlwdWJsaWMgUmVhZE9ubHlQb3NpdGlvbihpbnQgbmV3T2Zmc2V0LCBpbnQgbmV3TGVuZ3RoLCBib29sZWFuIGluY2x1ZGVTdGFydCkgewotCQlzdXBlcihuZXdPZmZzZXQsIG5ld0xlbmd0aCk7Ci0JCWZJbmNsdWRlU3RhcnRPZmZzZXQgPSBpbmNsdWRlU3RhcnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gb3ZlcmxhcHNXaXRoKGludCBuZXdPZmZzZXQsIGludCBuZXdMZW5ndGgpIHsKLQkJYm9vbGVhbiBvdmVybGFwc1dpdGggPSBzdXBlci5vdmVybGFwc1dpdGgobmV3T2Zmc2V0LCBuZXdMZW5ndGgpOwotCQlpZiAob3ZlcmxhcHNXaXRoKSB7Ci0JCQkvKgotCQkJICogQlVHMTU3NTI2IElmIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVhZCBvbmx5IHJlZ2lvbiBhbmQgbGVuZ3RoID0KLQkJCSAqIDAgbW9zdCBsaWtlbHkgYXNraW5nIHRvIGluc2VydCBhbmQgd2FudCB0byBhbGwgaW5zZXJ0aW5nIGJlZm9yZQotCQkJICogcmVhZCBvbmx5IHJlZ2lvbgotCQkJICovCi0JCQlpZiAoZkluY2x1ZGVTdGFydE9mZnNldCAmJiAobmV3TGVuZ3RoID09IDApICYmICh0aGlzLmxlbmd0aCAhPSAwKSAmJiAobmV3T2Zmc2V0ID09IHRoaXMub2Zmc2V0KSkgewotCQkJCW92ZXJsYXBzV2l0aCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBvdmVybGFwc1dpdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0NjY4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIERhdmlkIENhcnZlciAoSW50YWxpbykgLSBidWcgMzAwNDI3IC0gQ29tcGFyaXNvbiBvZiBTdHJpbmcgT2JqZWN0cyB1c2luZyA9PSBvciAhPQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVGFnUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGNlbnRyYWxpemVkIHBsYWNlIHRvIHB1dCAicmVwYXJzaW5nIiBsb2dpYy4gVGhpcyBpcwotICogdGhlIGxvZ2ljIHRoYXQgcmVwYXJzZXMgdGhlIHRleHQgaW5jcmVtZW50YWxseSwgYXMgYSB1c2VyIHR5cGVzIGluIG5ldwotICogY2hhcmFjdGVycywgb3IgRE9NIG5vZGVzIGFyZSBpbnNlcnRlZCBvciBkZWxldGVkLiBOb3RlOiBpdCBpcyBub3QgYSB0aHJlYWQKLSAqIHNhZmUgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIHsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkaXJ0eUVuZCA9IG51bGw7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlTdGFydCA9IG51bGw7Ci0JZmluYWwgcHJpdmF0ZSBTdHJpbmcgZG91YmxlUXVvdGUgPSBuZXcgU3RyaW5nKG5ldyBjaGFyW117J1wiJ30pOwotCXByb3RlY3RlZCBmaW5hbCBDb3JlTm9kZUxpc3QgRU1QVFlfTElTVCA9IG5ldyBDb3JlTm9kZUxpc3QoKTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZDaGFuZ2VzOwotCXByb3RlY3RlZCBTdHJpbmcgZkRlbGV0ZWRUZXh0OwotCXByb3RlY3RlZCBib29sZWFuIGZJc0VudGlyZURvY3VtZW50OwotCi0JcHJpdmF0ZSBGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlciBmRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZkxlbmd0aERpZmZlcmVuY2U7Ci0JcHJvdGVjdGVkIGludCBmTGVuZ3RoVG9SZXBsYWNlOwotCXByb3RlY3RlZCBPYmplY3QgZlJlcXVlc3RlcjsKLQlwcm90ZWN0ZWQgaW50IGZTdGFydDsKLQkvLyBub3RlOiB0aGlzIGlzIHRoZSBpbXBsIGNsYXNzIG9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQsIG5vdCB0aGUgaW50ZXJmYWNlCi0JLy8gRlVUVVJFX1RPX0RPOiBJIGJlbGlldmUgc29tZSBvZiB0aGVzZSBjYW4gYmUgbWFkZSBwcml2YXRlIG5vdy4/Ci0JcHJvdGVjdGVkIEJhc2ljU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQkvKioKLQkgKiB2YXJpYWJsZSB1c2VkIGluIGFudGljaWFwYXRpb24gb2YgbXVsdGl0aHJlYWRpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhcnNpbmc7Ci0JZmluYWwgcHJpdmF0ZSBTdHJpbmcgc2luZ2xlUXVvdGUgPSBuZXcgU3RyaW5nKG5ldyBjaGFyW117J1wnJ30pOwotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBfY2hlY2tCbG9ja05vZGVMaXN0KExpc3QgYmxvY2tUYWdMaXN0KSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChibG9ja1RhZ0xpc3QgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja1RhZ0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlciBibG9ja1RhZyA9IChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcikgYmxvY2tUYWdMaXN0LmdldChpKTsKLQkJCQlTdHJpbmcgdGFnTmFtZSA9IGJsb2NrVGFnLmdldFRhZ05hbWUoKTsKLQkJCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsTmFtZSgiPCIgKyB0YWdOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJYnJlYWs7Ci0JCQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbE5hbWUoIjwvIiArIHRhZ05hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbW1vbiB1dGlsaXR5IGZvciBjaGVja2luZyBmb3IgY3JpdGljYWwgd29yZCBzdWNoIGFzICIgPFNDUklQVD4iCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBfY2hlY2tGb3JDcml0aWNhbFdvcmQoU3RyaW5nIGNyaXRpY2FsVGFyZ2V0LCBib29sZWFuIGNoZWNrRW5kKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWludCBkb2N1bWVudExlbmd0aCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCWludCBwcm9wTGVuID0gZkxlbmd0aFRvUmVwbGFjZTsKLQkJaWYgKHByb3BMZW4gPiBkb2N1bWVudExlbmd0aCkKLQkJCXByb3BMZW4gPSBkb2N1bWVudExlbmd0aDsKLQkJaW50IHN0YXJ0TmVpZ2hib3Job29kID0gZlN0YXJ0IC0gY3JpdGljYWxUYXJnZXQubGVuZ3RoKCk7Ci0JCWludCBhZGp1c3RJbnNlcnQgPSAwOwotCQlpZiAoc3RhcnROZWlnaGJvcmhvb2QgPCAwKSB7Ci0JCQlhZGp1c3RJbnNlcnQgPSAwIC0gc3RhcnROZWlnaGJvcmhvb2Q7Ci0JCQlzdGFydE5laWdoYm9yaG9vZCA9IDA7Ci0JCX0KLQkJaW50IGVuZE5laWdoYm9yaG9vZCA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgKyBjcml0aWNhbFRhcmdldC5sZW5ndGgoKSAtIDE7Ci0JCWlmIChlbmROZWlnaGJvcmhvb2QgPiBkb2N1bWVudExlbmd0aCkKLQkJCWVuZE5laWdoYm9yaG9vZCA9IGRvY3VtZW50TGVuZ3RoIC0gMTsKLQkJaW50IG9sZGxlbiA9IGVuZE5laWdoYm9yaG9vZCAtIHN0YXJ0TmVpZ2hib3Job29kOyAvLyArIDE7Ci0JCWlmIChvbGRsZW4gKyBzdGFydE5laWdoYm9yaG9vZCA+IGRvY3VtZW50TGVuZ3RoKSB7Ci0JCQlvbGRsZW4gPSBkb2N1bWVudExlbmd0aCAtIHN0YXJ0TmVpZ2hib3Job29kOwotCQl9Ci0JCVN0cmluZyBvbGRUZXh0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXQoc3RhcnROZWlnaGJvcmhvb2QsIG9sZGxlbik7Ci0JCVN0cmluZyBwZWVrID0gU3RyaW5nVXRpbHMucGFzdGUob2xkVGV4dCwgZkNoYW5nZXMsIGNyaXRpY2FsVGFyZ2V0Lmxlbmd0aCgpIC0gYWRqdXN0SW5zZXJ0LCBmTGVuZ3RoVG9SZXBsYWNlKTsKLQkJYm9vbGVhbiBpc0NyaXRpY2FsU3RyaW5nID0gY2hlY2tUYWdOYW1lcyhvbGRUZXh0LCBjcml0aWNhbFRhcmdldCwgY2hlY2tFbmQpOwotCQlib29sZWFuIHRvQmVDcml0aWNhbFN0cmluZyA9IGNoZWNrVGFnTmFtZXMocGVlaywgY3JpdGljYWxUYXJnZXQsIGNoZWNrRW5kKTsKLQkJaWYgKChpc0NyaXRpY2FsU3RyaW5nICE9IHRvQmVDcml0aWNhbFN0cmluZykgfHwgLy8gT1IgaWYgYm90aCBhcmUKLQkJCQkJLy8gY3JpdGljYWwgYW5kIHRoZXJlJ3MKLQkJCQkJLy8gYSBjaGFuZ2UgaW4gdGhlIGVuZAotCQkJCQkvLyB0YWcgKCc+JykKLQkJCQkJKChpc0NyaXRpY2FsU3RyaW5nICYmIHRvQmVDcml0aWNhbFN0cmluZykgJiYgKGNoYW5nZUluSXNFbmRlZFN0YXRlKG9sZFRleHQsIHBlZWspKSkpIHsKLQkJCS8vIGlmIGl0IGludm9sdmVzIGEgY2hhbmdlIG9mIGEgY3JpdGljYWwgc3RyaW5nIChtYWtpbmcgb25lIHdoZXJlCi0JCQkvLyB0aGVyZSB3YXNuJ3QsIG9yIHJlbW92aW5nCi0JCQkvLyBvbmUgd2hlcmUgdGhlcmUgd2FzIG9uZSkgdGhlbiByZXBhcnNlIGV2ZXJ0aGluZy4KLQkJCXJlc3VsdCA9IHJlcGFyc2UoMCwgZG9jdW1lbnRMZW5ndGggLSAxKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgaW50IF9jb21wdXRlU3RhcnRPZkRpZmZlcmVuY2VzKENvcmVOb2RlTGlzdCBvbGROb2RlcywgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCWludCBzdGFydE9mRGlmZmVyZW5jZXMgPSAtMTsKLQkJaW50IG5ld05vZGVzTGVuZ3RoID0gbmV3Tm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWJvb2xlYW4gZm91bmREaWZmZXJlbmNlID0gZmFsc2U7Ci0JCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQkvLyB3ZSdsbCBjb250cm9sIG91ciBsb29wIGJhc2VkIG9uIHRoZSBvbGQgTGlzdCBsZW5ndGgKLQkJaW50IG9sZE5vZGVzTGVuZ3RoID0gb2xkTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCS8vIGJlIHN1cmUgdG8gY2hlY2sgJ2RvbmUnIGZpcnN0LCBzbyBzdGFydE9mRGlmZmVyZW5jZXMgaXNuJ3QKLQkJLy8gaWNyZW1lbnRlZCBpZiBkb25lIGlzIHRydWUKLQkJZG9uZSA6IHdoaWxlICgoIWRvbmUpICYmICgrK3N0YXJ0T2ZEaWZmZXJlbmNlcyA8IG9sZE5vZGVzTGVuZ3RoKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlID0gb2xkTm9kZXMuaXRlbShzdGFydE9mRGlmZmVyZW5jZXMpOwotCQkJLy8gdGhpcyBsZXNzVGhhbkVmZmVjdGVkUmVnaW9uIGlzIHRvIGNoZWNrIHRvIGJlIHN1cmUgdGhlIG5vZGUgaXMKLQkJCS8vIGluZmFjdCBhIGNhbmRpZGF0ZQotCQkJLy8gdG8gYmUgY29uc2lkZXJlZCBhcyAib2xkIi4gVGhpcyBjaGVjayBpcyBpbXBvcnRhbnQgZm9yIHRoZSBjYXNlCi0JCQkvLyB3aGVyZSBzb21lCi0JCQkvLyB0ZXh0IGlzIHJlcGxhY2VpbmcgdGV4dCB0aGF0Ci0JCQkvLyBhcHBlYXJzIGlkZW50aWNhbCwgYnV0IGlzIGEgZGlmZmVyZW50IGluc3RhbmNlLiBGb3IgZXhhbXBsZSwgaWYKLQkJCS8vIHRoZSB0ZXh0Ci0JCQkvLyBpcyA8UD48Qj48L0I+PC9QPiBhbmQgPEI+PC9CPiBpcyBpbnNlcnRlZCBhdCBwb3N0aW9uIDMsCi0JCQkvLyByZXN1bHRpbmcgaW4gPFA+PEI+PC9CPjxCPjwvQj48L1A+Ci0JCQkvLyB3ZSBkbyBub3Qgd2FudCB0aGUKLQkJCS8vIGZpcnN0IDxCPiB0byBiZSBjb25zaWRlcmVkIG9sZCAuLi4gaXQgaXMgdGhlIG5ldyBvbmUsIHRoZQotCQkJLy8gc2Vjb25kCi0JCQkvLyA8Qj4gaXMgdGhlIG9sZCBvbmUuCi0JCQlpZiAoX2xlc3NUaGFuRWZmZWN0ZWRSZWdpb24ob2xkTm9kZSkpIHsKLQkJCQkvLyBiZSBzdXJlIHRvIGNoZWNrIHRoYXQgd2UgaGF2ZSBuZXcgbm9kZXMgdG8gY29tcGFyZSBhZ2FpbnN0LgotCQkJCWlmIChzdGFydE9mRGlmZmVyZW5jZXMgPiBuZXdOb2Rlc0xlbmd0aCkgewotCQkJCQlmb3VuZERpZmZlcmVuY2UgPSBmYWxzZTsKLQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCWNvbnRpbnVlIGRvbmU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8KLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlID0gbmV3Tm9kZXMuaXRlbShzdGFydE9mRGlmZmVyZW5jZXMpOwotCQkJCQkvLyBub3RlOiBzaGlmdCBpcyAwIHdoaWxlIGF0IGJlZ2lubmluZyBvZiBsaXN0LCBiZWZvcmUgdGhlCi0JCQkJCS8vIGluc2VydGlvbiAob3IgZGVsZXRpb24pIHBvaW50LiBBZnRlciB0aGF0LCBpdCBpcwotCQkJCQkvLyBmU3RhcnQrZkxlbmd0aERpZmZlcmVuY2UKLQkJCQkJaWYgKCEob2xkTm9kZS5zYW1lQXMobmV3Tm9kZSwgMCkpKSB7Ci0JCQkJCQlmb3VuZERpZmZlcmVuY2UgPSB0cnVlOwotCQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCQljb250aW51ZSBkb25lOwotCQkJCQl9IGVsc2UgeyAvLyBpZiB0aGV5IGFyZSBlcXVhbCwgdGhlbiB3ZSB3aWxsIGJlIGtlZXBpbmcgdGhlCi0JCQkJCQkvLyBvbGQgb25lLCBzbwotCQkJCQkJLy8gd2UgbmVlZCB0byBiZSBzdXJlIGl0cyBwYXJlbnREb2N1bWVudCBpcyBzZXQgYmFjawotCQkJCQkJLy8gdG8KLQkJCQkJCS8vIHRoZSByaWdodCBpbnN0YW5jZQotCQkJCQkJb2xkTm9kZS5zZXRQYXJlbnREb2N1bWVudChmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gd2UgZGlkbid0IGxpdGVyYWxseSBmaW5kIGEgZGlmZmVyZW5jZSwgYnV0IHdlIGNvdW50IGl0IGFzCi0JCQkJLy8gc3VjaCBieSBpbXBsaWNhdGlvbgotCQkJCWZvdW5kRGlmZmVyZW5jZSA9IHRydWU7Ci0JCQkJZG9uZSA9IHRydWU7Ci0JCQkJY29udGludWUgZG9uZTsKLQkJCX0KLQkJfQotCQkvLyBpZiB3ZSBsaXRlcmFsbHkgZm91bmQgYSBkaWZmZXJlbmNlLCB0aGVuIGFsbCBpcyBvayBhbmQgd2UgY2FuCi0JCS8vIHJldHVybgotCQkvLyBpdC4KLQkJLy8gaWYgd2UgZGlkIG5vdCBsaXRlcmFsbHkgZmluZCBvbmUsIHRoZW4gd2UgaGF2ZSB0byBkZWNpZGUgd2h5LgotCQlpZiAoIWZvdW5kRGlmZmVyZW5jZSkgewotCQkJaWYgKG5ld05vZGVzTGVuZ3RoID09IG9sZE5vZGVzTGVuZ3RoKSB7IC8vIHRoZW4gbGlzdHMgYXJlCi0JCQkJLy8gaWRlbnRpY2FsCi0JCQkJLy8gKGFuZCBtYXkgYmUgb2YgemVybwotCQkJCS8vIGxlbmd0aCkKLQkJCQlzdGFydE9mRGlmZmVyZW5jZXMgPSAtMTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG5ld05vZGVzTGVuZ3RoID4gb2xkTm9kZXNMZW5ndGgpIHsgLy8gdGhlbiBsaXN0cyBhcmUKLQkJCQkJLy8gaWRlbnRpY2FsIGV4Y2VwdCBmb3IKLQkJCQkJLy8gbmV3Tm9kZXMgYWRkZWQKLQkJCQkJc3RhcnRPZkRpZmZlcmVuY2VzID0gb2xkTm9kZXNMZW5ndGg7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKG5ld05vZGVzTGVuZ3RoIDwgb2xkTm9kZXNMZW5ndGgpIHsgLy8gdGhlbiBsaXN0cyBhcmUKLQkJCQkJCS8vIGlkZW50aWNhbCBleGNlcHQKLQkJCQkJCS8vIGZvciBvbGQgTm9kZXMKLQkJCQkJCS8vIGRlbGV0ZWQKLQkJCQkJCXN0YXJ0T2ZEaWZmZXJlbmNlcyA9IG5ld05vZGVzTGVuZ3RoOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdGFydE9mRGlmZmVyZW5jZXM7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgX2NvbXB1dGVTdGFydE9mRGlmZmVyZW5jZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlUGFyYW0sIElUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05vZGVQYXJhbSwgSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMpIHsKLQkJaW50IHN0YXJ0T2ZEaWZmZXJlbmNlcyA9IC0xOwotCQlpbnQgbmV3UmVnaW9uc0xlbmd0aCA9IG5ld1JlZ2lvbnMuc2l6ZSgpOwotCQlib29sZWFuIGZvdW5kRGlmZmVyZW5jZSA9IGZhbHNlOwotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJLy8gd2UnbGwgY29udHJvbCBvdXIgbG9vcCBiYXNlZCBvbiB0aGUgb2xkIExpc3QgbGVuZ3RoCi0JCWludCBvbGRSZWdpb25zTGVuZ3RoID0gb2xkUmVnaW9ucy5zaXplKCk7Ci0JCS8vIGJlIHN1cmUgdG8gY2hlY2sgJ2RvbmUnIGZpcnN0LCBzbyBzdGFydE9mRGlmZmVyZW5jZXMgaXNuJ3QKLQkJLy8gaWNyZW1lbnRlZCBpZiBkb25lIGlzIHRydWUKLQkJZG9uZSA6IHdoaWxlICgoIWRvbmUpICYmICgrK3N0YXJ0T2ZEaWZmZXJlbmNlcyA8IG9sZFJlZ2lvbnNMZW5ndGgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBvbGRSZWdpb24gPSBvbGRSZWdpb25zLmdldChzdGFydE9mRGlmZmVyZW5jZXMpOwotCQkJLy8gdGhpcyBsZXNzVGhhbkVmZmVjdGVkUmVnaW9uIGlzIHRvIGNoZWNrIHRvIGJlIHN1cmUgdGhlIG5vZGUgaXMKLQkJCS8vIGluZmFjdCBhIGNhbmRpZGF0ZQotCQkJLy8gdG8gYmUgY29uc2lkZXJlZCBhcyAib2xkIi4gVGhpcyBjaGVjayBpcyBpbXBvcnRhbnQgZm9yIHRoZSBjYXNlCi0JCQkvLyB3aGVyZSBzb21lCi0JCQkvLyB0ZXh0IGlzIHJlcGxhY2VpbmcgdGV4dCB0aGF0Ci0JCQkvLyBhcHBlYXJzIGlkZW50aWNhbCwgYnV0IGlzIGEgZGlmZmVyZW50IGluc3RhbmNlLiBGb3IgZXhhbXBsZSwgaWYKLQkJCS8vIHRoZSB0ZXh0Ci0JCQkvLyBpcyA8UD48Qj48L0I+PC9QPiBhbmQgPEI+PC9CPiBpcyBpbnNlcnRlZCBhdCBwb3N0aW9uIDMsCi0JCQkvLyByZXN1bHRpbmcgaW4gPFA+PEI+PC9CPjxCPjwvQj48L1A+Ci0JCQkvLyB3ZSBkbyBub3Qgd2FudCB0aGUKLQkJCS8vIGZpcnN0IDxCPiB0byBiZSBjb25zaWRlcmVkIG9sZCAuLi4gaXQgaXMgdGhlIG5ldyBvbmUsIHRoZQotCQkJLy8gc2Vjb25kCi0JCQkvLyA8Qj4gaXMgdGhlIG9sZCBvbmUuCi0JCQlpZiAoX2xlc3NUaGFuRWZmZWN0ZWRSZWdpb24ob2xkTm9kZVBhcmFtLCBvbGRSZWdpb24pKSB7Ci0JCQkJLy8gYmUgc3VyZSB0byBjaGVjayB0aGF0IHdlIGhhdmUgbmV3IG5vZGVzIHRvIGNvbXBhcmUgYWdhaW5zdC4KLQkJCQlpZiAoc3RhcnRPZkRpZmZlcmVuY2VzID4gbmV3UmVnaW9uc0xlbmd0aCkgewotCQkJCQlmb3VuZERpZmZlcmVuY2UgPSBmYWxzZTsKLQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCWNvbnRpbnVlIGRvbmU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8KLQkJCQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gbmV3UmVnaW9ucy5nZXQoc3RhcnRPZkRpZmZlcmVuY2VzKTsKLQkJCQkJLy8gbm90ZTogc2hpZnQgaXMgMCB3aGlsZSBhdCBiZWdpbm5pbmcgb2YgbGlzdCwgYmVmb3JlIHRoZQotCQkJCQkvLyBpbnNlcnRpb24gKG9yIGRlbGV0aW9uKSBwb2ludC4gQWZ0ZXIgdGhhdCwgaXQgaXMKLQkJCQkJLy8gZlN0YXJ0K2ZMZW5ndGhEaWZmZXJlbmNlCi0JCQkJCWlmICghKG9sZE5vZGVQYXJhbS5zYW1lQXMob2xkUmVnaW9uLCBuZXdOb2RlUGFyYW0sIG5ld1JlZ2lvbiwgMCkpKSB7Ci0JCQkJCQlmb3VuZERpZmZlcmVuY2UgPSB0cnVlOwotCQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCQljb250aW51ZSBkb25lOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gaWYgdGhleSBhcmUgZXF1YWwsIHRoZW4gd2Ugd2lsbCBiZSBrZWVwaW5nIHRoZSBvbGQKLQkJCQkJCS8vIG9uZS4KLQkJCQkJCS8vIHVubGlrZSB0aGUgZmxhdG5vZGUgY2FzZSwgdGhlcmUgaXMgbm8gcmVhc29uIHRvCi0JCQkJCQkvLyB1cGRhdGUKLQkJCQkJCS8vIHRoZSB0ZXh0c3RvcmUsIHNpbmNlIGl0cyB0aGUgc2FtZSB0ZXh0IHN0b3JlIGluCi0JCQkJCQkvLyBlaXRoZXIgY2FzZQotCQkJCQkJLy8gKHNpbmNlIGl0cyB0aGUgc2FtZSBmbGF0bm9kZSkKLQkJCQkJCS8vb2xkUmVnaW9uLnNldFRleHRTdG9yZShmU3RydWN0dXJlZERvY3VtZW50LnBhcmVudERvY3VtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gd2UgZGlkbid0IGxpdGVyYWxseSBmaW5kIGEgZGlmZmVyZW5jZSwgYnV0IHdlIGNvdW50IGl0IGFzCi0JCQkJLy8gc3VjaCBieSBpbXBsaWNhdGlvbgotCQkJCWZvdW5kRGlmZmVyZW5jZSA9IHRydWU7Ci0JCQkJZG9uZSA9IHRydWU7Ci0JCQkJY29udGludWUgZG9uZTsKLQkJCX0KLQkJfQotCQkvLyBpZiB3ZSBsaXRlcmFsbHkgZm91bmQgYSBkaWZmZXJlbmNlLCB0aGVuIGFsbCBpcyBvayBhbmQgd2UgY2FuCi0JCS8vIHJldHVybgotCQkvLyBpdC4KLQkJLy8gaWYgd2UgZGlkIG5vdCBsaXRlcmFsbHkgZmluZCBvbmUsIHRoZW4gd2UgaGF2ZSB0byBkZWNpZGUgd2h5LgotCQlpZiAoIWZvdW5kRGlmZmVyZW5jZSkgewotCQkJaWYgKG5ld1JlZ2lvbnNMZW5ndGggPT0gb2xkUmVnaW9uc0xlbmd0aCkgeyAvLyB0aGVuIGxpc3RzIGFyZQotCQkJCS8vIGlkZW50aWNhbCAoYW5kIG1heQotCQkJCS8vIGJlIG9mIHplcm8gbGVuZ3RoKQotCQkJCXN0YXJ0T2ZEaWZmZXJlbmNlcyA9IC0xOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobmV3UmVnaW9uc0xlbmd0aCA+IG9sZFJlZ2lvbnNMZW5ndGgpIHsgLy8gdGhlbiBsaXN0cyBhcmUKLQkJCQkJLy8gaWRlbnRpY2FsIGV4Y2VwdAotCQkJCQkvLyBmb3IgbmV3UmVnaW9ucwotCQkJCQkvLyBhZGRlZAotCQkJCQlzdGFydE9mRGlmZmVyZW5jZXMgPSBvbGRSZWdpb25zTGVuZ3RoOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChuZXdSZWdpb25zTGVuZ3RoIDwgb2xkUmVnaW9uc0xlbmd0aCkgeyAvLyB0aGVuIGxpc3RzCi0JCQkJCQkvLyBhcmUgaWRlbnRpY2FsCi0JCQkJCQkvLyBleGNlcHQgZm9yCi0JCQkJCQkvLyBvbGQgTm9kZXMKLQkJCQkJCS8vIGRlbGV0ZWQKLQkJCQkJCXN0YXJ0T2ZEaWZmZXJlbmNlcyA9IG5ld1JlZ2lvbnNMZW5ndGg7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0YXJ0T2ZEaWZmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBQYXJ0IDEgb2YgMiBzdGVwcyB0byBkbyBhIGNvcmVfcmVwYXJzZQotCSAqIAotCSAqIFBhcnNlcyBhIHBvcnRpb24gb2YgdGhlIGN1cnJlbnQgdGV4dCBpbiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCBhbmQKLQkgKiByZXR1cm5zIHRoZSByYXcgcmVzdWx0Ci0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIF9jb3JlX3JlcGFyc2VfdGV4dChpbnQgcmVzY2FuU3RhcnQsIGludCByZXNjYW5FbmQpIHsKLQkJZlN0cnVjdHVyZWREb2N1bWVudC5yZXNldFBhcnNlcihyZXNjYW5TdGFydCwgcmVzY2FuRW5kKTsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkuZ2V0RG9jdW1lbnRSZWdpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogUGFydCAyIG9mIDIgc3RlcHMgdG8gZG8gYSBjb3JlX3JlcGFyc2UKLQkgKiAKLQkgKiBJbnRlZ3JhdGVzIGEgbGlzdCBvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIGJhc2VkIG9uIHRoZSBjdXJyZW50Ci0JICogdGV4dCBjb250ZW50cyBvZiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCBpbnRvIHRoZSBJU3RydWN0dXJlZERvY3VtZW50Ci0JICogZGF0YSBzdHJ1Y3R1cmUKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IF9jb3JlX3JlcGFyc2VfdXBkYXRlX21vZGVsKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3Tm9kZXNIZWFkLCBpbnQgcmVzY2FuU3RhcnQsIGludCByZXNjYW5FbmQsIENvcmVOb2RlTGlzdCBvbGROb2RlcywgYm9vbGVhbiBmaXJzdFRpbWUpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJQ29yZU5vZGVMaXN0IG5ld05vZGVzID0gbnVsbDsKLQkJLy8gcmVzY2FuCi0JCW5ld05vZGVzID0gbmV3IENvcmVOb2RlTGlzdChuZXdOb2Rlc0hlYWQpOwotCQkvLyBhZGp1c3Qgb3VyIG5ld05vZGUgY2hhaW4gc28gdGhlIG9mZnNldCBwb3NpdGlvbnMgbWF0Y2gKLQkJLy8gb3VyIHRleHQgc3RvcmUgKG5vdCB0aGUgc2ltcGxlIHN0cmluZyBvZiB0ZXh0IHJlcGFyc2VkKQotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5hZGp1c3RTdGFydChuZXdOb2Rlc0hlYWQsIHJlc2NhblN0YXJ0KTsKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgcGFyZW50RG9jdW1lbnQgdmFyaWFibGUgb2YgZWFjaCBpbnN0YW5jZSBpbiB0aGUgbmV3Ci0JCS8vIGNoYWluCi0JCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLnNldFBhcmVudERvY3VtZW50KG5ld05vZGVzSGVhZCwgZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vIGluaXRpYWxpemUgdGhlIHN0cnVjdHVyZWREb2N1bWVudCB2YXJpYWJsZSBvZiBlYWNoIGluc3RhbmNlIGluIHRoZQotCQkvLyBuZXcgY2hhaW4KLQkJLy9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQobmV3Tm9kZXNIZWFkLAotCQkvLyBmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJLy8KLQkJaWYgKGZpcnN0VGltZSkgewotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRDYWNoZWREb2N1bWVudFJlZ2lvbihuZXdOb2Rlc0hlYWQpOwotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5pbml0aWFsaXplRmlyc3RBbmRMYXN0RG9jdW1lbnRSZWdpb24oKTsKLQkJCS8vIG5vdGU6IHNpbmNlIHdlIGFyZSBpbnNlcnRpbmcgbm9kZXMsIGZvciB0aGUgZmlyc3QgdGltZSwgdGhlcmUKLQkJCS8vIGlzCi0JCQkvLyBubyBhZGp1c3RtZW50cwotCQkJLy8gdG8gZG93bnN0cmVhbSBzdHVmZiBuZWNlc3NhcnkuCi0JCQlyZXN1bHQgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudCwgZlJlcXVlc3Rlciwgb2xkTm9kZXMsIG5ld05vZGVzLCBmQ2hhbmdlcywgZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlLCBmSXNFbnRpcmVEb2N1bWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBub3RlOiBpbnRlZ3JhdGVzIGNoYW5nZXMgaW50byBtb2RlbCBhcyBhIHNpZGUgZWZmZWN0Ci0JCQlyZXN1bHQgPSBtaW5pbXVtRXZlbnQob2xkTm9kZXMsIG5ld05vZGVzKTsKLQkJfQotCQlyZXN1bHQuc2V0RGVsZXRlZFRleHQoZkRlbGV0ZWRUZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvcmVOb2RlTGlzdCBfZm9ybU1pbmltdW1MaXN0KENvcmVOb2RlTGlzdCBmbGF0bm9kZXMsIGludCBzdGFydE9mRGlmZmVyZW5jZXMsIGludCBlbmRPZkRpZmZlcmVuY2VzKSB7Ci0JCUNvcmVOb2RlTGlzdCBtaW5pbWFsTm9kZXMgPSBudWxsOwotCQkvLyBpZiBzdGFydE9mRGlmZmVyY2VzIGlzIHN0aWxsIGl0cyBpbml0aWFsIHZhbHVlLCB0aGVuIHdlIGhhdmUgYW4KLQkJLy8gZW1wdHkgZG9jdW1lbnQKLQkJaWYgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA9PSAtMSkgewotCQkJbWluaW1hbE5vZGVzID0gRU1QVFlfTElTVDsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIHdlIGRvIG5vdCBoYXZlIGFueSBmbGF0bm9kZSBpbiBvdXIgZmxhdG5vZGUgbGlzdCwgdGhlbgotCQkJLy8gc2ltcGx5Ci0JCQkvLyByZXR1cm4gb3VyIHN0YW5kYXJkIGVtcHR5IGxpc3QKLQkJCWlmIChmbGF0bm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCW1pbmltYWxOb2RlcyA9IEVNUFRZX0xJU1Q7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGlmIHN0YXJ0T2ZEaWZmZXJlbmNlcyBpcyBncmVhdGVyIHRoYW4gZW5kT2ZEaWZmZXJlbmNlcywKLQkJCQkvLyB0aGVuCi0JCQkJLy8gdGhhdCBtZWFucyB0aGUgY2FsY3VsYXRpb25zICJjcm9zc2VkIiBlYWNoIG90aGVyLCBhbmQKLQkJCQkvLyBoZW5jZSwKLQkJCQkvLyB0aGVyZSByZWFsbHkgaXMgbm8gZGlmZmVyZW5jZXMsIHNvLCBhZ2FpbiwgcmV0dXJuIHRoZSBlbXB0eQotCQkJCS8vIGxpc3QKLQkJCQlpZiAoc3RhcnRPZkRpZmZlcmVuY2VzID4gZW5kT2ZEaWZmZXJlbmNlcykgewotCQkJCQltaW5pbWFsTm9kZXMgPSBFTVBUWV9MSVNUOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHRoZSBsYXN0IGNoZWNrIGJlIHN1cmUgd2UgaGF2ZSBzb21lIGRpZmZlcm5jZXMKLQkJCQkJaWYgKChlbmRPZkRpZmZlcmVuY2VzID4gLTEpKSB7Ci0JCQkJCQltaW5pbWFsTm9kZXMgPSBuZXcgQ29yZU5vZGVMaXN0KGZsYXRub2Rlcy5pdGVtKHN0YXJ0T2ZEaWZmZXJlbmNlcyksIGZsYXRub2Rlcy5pdGVtKGVuZE9mRGlmZmVyZW5jZXMpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHRoZXJlIHdlcmUgbm8gZGlmZmVyZW5jZXMsIHRoZSBsaXN0IHdhc24ndAotCQkJCQkJLy8gbWluaW1pemVkLCBzbyBzaW1wbHkgcmV0dXJuIGl0LgotCQkJCQkJbWluaW1hbE5vZGVzID0gZmxhdG5vZGVzOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtaW5pbWFsTm9kZXM7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIF9ncmVhdGVyVGhhbkVmZmVjdGVkUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgbm9kZVN0YXJ0ID0gb2xkTm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgY2hhbmdlZFJlZ2lvbkVuZCA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgLSAxOwotCQlyZXN1bHQgPSBub2RlU3RhcnQgPiBjaGFuZ2VkUmVnaW9uRW5kOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBfZ3JlYXRlclRoYW5FZmZlY3RlZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUsIElUZXh0UmVnaW9uIG9sZFJlZ2lvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgcmVnaW9uU3RhcnRPZmZzZXQgPSBvbGROb2RlLmdldFN0YXJ0T2Zmc2V0KG9sZFJlZ2lvbik7Ci0JCWludCBlZmZlY3RlZFJlZ2lvbkVuZCA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgLSAxOwotCQlyZXN1bHQgPSByZWdpb25TdGFydE9mZnNldCA+IGVmZmVjdGVkUmVnaW9uRW5kOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBfbGVzc1RoYW5FZmZlY3RlZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW50IG5vZGVFbmQgPSBvbGROb2RlLmdldEVuZE9mZnNldCgpIC0gMTsKLQkJcmVzdWx0ID0gbm9kZUVuZCA8IGZTdGFydDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gX2xlc3NUaGFuRWZmZWN0ZWRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlLCBJVGV4dFJlZ2lvbiBvbGRSZWdpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW50IG5vZGVFbmQgPSBvbGROb2RlLmdldEVuZE9mZnNldChvbGRSZWdpb24pIC0gMTsKLQkJcmVzdWx0ID0gbm9kZUVuZCA8IGZTdGFydDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gX3JlZ2lvbnNTYW1lS2luZChJVGV4dFJlZ2lvbiBuZXdSZWdpb24sIElUZXh0UmVnaW9uIG9sZFJlZ2lvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBpZiBvbmUgcmVnaW9uIGlzIGEgY29udGFpbmVyIHJlZ2lvbiwgYW5kIHRoZSBvdGhlciBub3QsIGFsd2F5cwotCQkvLyByZXR1cm4gZmFsc2UKLQkJLy8gZWxzZSwganVzdCBjaGVjayB0aGVpciB0eXBlLgotCQkvLyAgICAgIERXIGRydWluZyByZWZhY3RvcmluZywgbG9va3MgbGlrZSBhICJ0eXBvIiBoZXJlLCB1c2luZyAnb2xkJyBpbgotCQkvLyBib3RoLgotCQkvLwkJaWYgKGlzQ29udGFpbmVyUmVnaW9uKG9sZFJlZ2lvbikgIT0gaXNDb250YWluZXJSZWdpb24ob2xkUmVnaW9uKSkKLQkJaWYgKGlzQ29sbGVjdGlvblJlZ2lvbihvbGRSZWdpb24pICE9IGlzQ29sbGVjdGlvblJlZ2lvbihuZXdSZWdpb24pKQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCWVsc2UgaWYgKG9sZFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKG5ld1JlZ2lvbi5nZXRUeXBlKCkpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLwlwcml2YXRlIGJvb2xlYW4gaGFzQ29sbGVjdGlvblJlZ2lvbnMoSVRleHRSZWdpb24gYVJlZ2lvbikgewotCS8vCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCS8vCQlpZiAoYVJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCS8vCQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbkNvbnRhaW50ZXIgPSAoSVRleHRSZWdpb25Db2xsZWN0aW9uKQotCS8vIGFSZWdpb247Ci0JLy8JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHJlZ2lvbkNvbnRhaW50ZXIuZ2V0UmVnaW9ucygpOwotCS8vCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JLy8JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JLy8JCQkJaWYgKGFSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkvLwkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkvLwkJCQkJYnJlYWs7Ci0JLy8JCQkJfQotCS8vCQkJfQotCS8vCQl9Ci0JLy8JCXJldHVybiByZXN1bHQ7Ci0JLy8JfQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHNwZWNpZmljYWxseSB0byBkZXRlY3QgY2hhbmdlcyBpbiAnaXNFbmRlZCcgc3RhdGUsCi0JICogYWx0aG91Z2ggaXQgc3RpbGwgZG9lcyBzbyB3aXRoIGhldXJpc3RpY3MuIElmIG51bWJlciBvZiAnPicgY2hhbmdlcywKLQkgKiBhc3N1bWUgdGhlIGlzRW5kZWQgc3RhdGUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoYW5nZUluSXNFbmRlZFN0YXRlKFN0cmluZyBvbGRUZXh0LCBTdHJpbmcgbmV3VGV4dCkgewotCQlpbnQgbk9sZCA9IFN0cmluZ1V0aWxzLm9jY3VycmVuY2VzT2Yob2xkVGV4dCwgJz4nKTsKLQkJaW50IG5OZXcgPSBTdHJpbmdVdGlscy5vY2N1cnJlbmNlc09mKG5ld1RleHQsICc+Jyk7Ci0JCXJldHVybiAhKG5PbGQgPT0gbk5ldyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQW5kQXNzaWduUGFyZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKS5zZXRQYXJlbnQob2xkTm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIHRleHRSZWdpb25Db2xsZWN0aW9uID0gKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgcmVnaW9uOwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QgPSB0ZXh0UmVnaW9uQ29sbGVjdGlvbi5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbkxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiBpbm5lclJlZ2lvbiA9IHJlZ2lvbkxpc3QuZ2V0KGkpOwotCQkJCWNoZWNrQW5kQXNzaWduUGFyZW50KG9sZE5vZGUsIGlubmVyUmVnaW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEEgY2hhbmdlIHRvIGEgQ0RBVEEgdGFnIGNhbiByZXN1bHQgaW4gYWxsIGJlaW5nIHJlcGFyc2VkLgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JDREFUQSgpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbEtleSgiPCFbQ0RBVEFbIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbEtleSgiXV0+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJZiBhIGNvbW1lbnQgc3RhcnQgb3IgZW5kIHRhZyBpcyBiZWluZyBhZGRlZCBvciBkZWxldGVkLCB3ZSdsbCByZXNjYW4KLQkgKiB0aGUgd2hvbGUgZG9jdW1lbnQuIFRoZSByZWFzb24gaXMgdGhhdCBjb250ZW50IHRoYXQgaXMgcmV2ZWFsZWQgb3IKLQkgKiBjb21tZW50ZWQgb3V0IGNhbiBlZmZlY3QgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSByZXN0IG9mIHRoZQotCSAqIGRvY3VtZW50LiBOb3RlOiBmb3Igbm93IHRoaXMgaXMgdmVyeSBYTUwgc3BlY2lmaWMsIGNhbiByZWZhY3Rvci9pbXByb3ZlCi0JICogbGF0ZXIuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ29tbWVudHMoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwhLS0iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCItLT4iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyB3ZSdsbCBhbHNvIGNoZWNrIGZvciB0aGVzZSBkZWdlbmVyYXRlIGNhc2VzCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwhLS0tPiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29tbW9uIHV0aWxpdHkgZm9yIGNoZWNraW5nIGZvciBjcml0aWNhbCB3b3JkIHN1Y2ggYXMgIiA8U0NSSVBUPiIKLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JDcml0aWNhbEtleShTdHJpbmcgY3JpdGljYWxUYXJnZXQpIHsKLQkJcmV0dXJuIF9jaGVja0ZvckNyaXRpY2FsV29yZChjcml0aWNhbFRhcmdldCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENvbW1vbiB1dGlsaXR5IGZvciBjaGVja2luZyBmb3IgY3JpdGljYWwgd29yZCBzdWNoIGFzICIgPFNDUklQVD4iCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNyaXRpY2FsTmFtZShTdHJpbmcgY3JpdGljYWxUYXJnZXQpIHsKLQkJcmV0dXJuIF9jaGVja0ZvckNyaXRpY2FsV29yZChjcml0aWNhbFRhcmdldCwgdHJ1ZSk7Ci0JfQotCi0JLy8JLyoqCi0JLy8JICogQ3VycmVudGx5IHRoaXMgbWV0aG9kIGlzIHByZXR0eSBzcGVjaWZpYyB0byA/TUwKLQkvLwkgKiBAZGVwcmVjYXRlZCAtIG5vdCByZWFsbHkgZGVwcmVjYXRlZCwgYnV0IHBsYW4gdG8gbWFrZQotCS8vCSAqIHByb3RlY3RlZCAuLi4gSSdtIG5vdCBzdXJlIHdoeSBpdHMgcHVibGljIG9yIG1pc3NwZWxsZWQ/Ci0JLy8JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ3Jvc3NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Cb3VuZHJ5Q2FzZXMoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIENhc2UgMTogU2VlIGlmIHRoZSBsYW5ndWFnZSdzIHN5bnRheCByZXF1aXJlcyB0aGF0IG11bHRpcGxlCi0JCS8vIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgYmUgcmVzY2FubmVkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblN5bnRheCgpOwotCQl9Ci0JCS8vIENhc2UgMjogImJsb2NrIHRhZ3MiIHdob3NlIGNvbnRlbnQgaXMgbGVmdCB1bnBhcnNlZAotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCU9iamVjdCBwYXJzZXIgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpOwotCQkJaWYgKHBhcnNlciBpbnN0YW5jZW9mIEJsb2NrVGFnUGFyc2VyKSB7Ci0JCQkJTGlzdCBibG9ja1RhZ3MgPSAoKEJsb2NrVGFnUGFyc2VyKSBwYXJzZXIpLmdldEJsb2NrTWFya2VycygpOwotCQkJCXJlc3VsdCA9IF9jaGVja0Jsb2NrTm9kZUxpc3QoYmxvY2tUYWdzKTsKLQkJCX0KLQkJfQotCQkvLyBGVVRVUkVfVE9fRE86IGlzIHRoZXJlIGEgYmV0dGVyIHBsYWNlIHRvIGRvIHRoaXM/Ci0JCS8vIG9yISBkbyB3ZSBhbHJlYWR5IGRvIGl0IHNvbWUgb3RoZXIgbW9yZSBjZW50cmFsIHBsYWNlPwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJlc3VsdC5zZXREZWxldGVkVGV4dChmRGVsZXRlZFRleHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQWxsb3cgYSByZXBhcnNlciB0byBjaGVjayBmb3IgZXh0cmEgc3ludGFjdGljIGNhc2VzIHRoYXQgcmVxdWlyZQotCSAqIHBhcnNpbmcgYmV5b25kIHRoZSBmbGF0Tm9kZSBib3VuZGFyeS4KLQkgKiAKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgWE1MLWNlbnRyaWMuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ3Jvc3NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25TeW50YXgoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdDsKLQkJLy8gQ2FzZSAxOiBRdW90ZSBjaGFyYWN0ZXJzIGFyZSBpbnZvbHZlZAotCQlyZXN1bHQgPSBjaGVja0ZvclF1b3RlcygpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCS8vIENhc2UgMjogVGhlIGlucHV0IGZvcm1zIG9yIHVuZG9lcyBhIGNvbW1lbnQgYmVnaW5uaW5nIG9yCi0JCQkvLyBjb21tZW50Ci0JCQkvLyBlbmQKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ29tbWVudHMoKTsKLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCS8vIENhc2UgMzogVGhlIGlucHV0IGZvcm1zIG9yIHVuZG9lcyBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KLQkJCXJlc3VsdCA9IGNoZWNrRm9yUEkoKTsKLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCS8vIENhc2UgNDogVGhlIGlucHV0IGZvcm1zIG9yIHVuZG9lcyBhIENEQVRBIHNlY3Rpb24KLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ0RBVEEoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgY2hhbmdlIHJlcXVlc3QgZXhhY3RseSBtYXRjaGVzIHRoZSB0ZXh0IGl0IHdvdWxkIGJlCi0JICogcmVwbGFjaW5nLiAoSW4gZnV0dXJlLCB0aGlzLCBvciBzaW1pbGFyIG1ldGhvZCBpcyB3aGVyZSB0byBjaGVjayBmb3IKLQkgKiAicmVhZCBvbmx5IiBhdHRlbXB0ZWQgY2hhbmdlLikKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yTm9DaGFuZ2UoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIGRvbid0IGNoZWNrIGVxdWFscyB1bmxlc3MgbGVuZ3RocyBtYXRjaAotCQkvLyBzaG91bGQgYmUgYSB0aW55IGJpdCBmYXN0ZXIsIHNpbmNlIHVzdWFsbHkgbm90Ci0JCS8vIG9mIGVxdWFsIGxlbmd0aHMgKEknbSBzdXJwcmlzZWQgU3RyaW5nJ3MgZXF1YWxzIG1ldGhvZAotCQkvLyBkb2Vzbid0IGRvIHRoaXMuKQotCQlpZiAoKGZDaGFuZ2VzICE9IG51bGwpICYmIChmRGVsZXRlZFRleHQgIT0gbnVsbCkgJiYgKGZDaGFuZ2VzLmxlbmd0aCgpID09IGZEZWxldGVkVGV4dC5sZW5ndGgoKSkgJiYgKGZDaGFuZ2VzLmVxdWFscyhmRGVsZXRlZFRleHQpKSkgewotCQkJcmVzdWx0ID0gbmV3IE5vQ2hhbmdlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudCwgZlJlcXVlc3RlciwgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkoKE5vQ2hhbmdlRXZlbnQpcmVzdWx0KS5yZWFzb24gPSBOb0NoYW5nZUV2ZW50Lk5PX0NPTlRFTlRfQ0hBTkdFOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQSBjaGFuZ2UgdG8gYSBQSSB0YWcgY2FuIHJlc3VsdCBpbiBhbGwgYmVpbmcgcmVwYXJzZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvclBJKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8PyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIj8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyAgRm9yIHNpbXBsaWNpdHksIGlmIGVpdGhlciB0ZXh0IHRvIGJlIGRlbGV0ZWQsIG9yIHRleHQgdG8gYmUgaW5zZXJ0ZWQKLQkvLyBjb250YWlucyBhdCBsZWFzdAotCS8vICBvbmUgcXVvdGUsIHdlJ2xsIHNlYXJjaCBmb3IgcHJldmlvdXMgcXVvdGUgaW4gZG9jdW1lbnQsIGlmIGFueSwgYW5kIHVzZQotCS8vIHRoYXQgZmxhdG5vZGUgYXMKLQkvLyAgYSBkaXJ0eSBzdGFydCwgYW5kIHdlJ2xsIHVzZSBlbmQgb2YgZG9jdW1lbnQgYXMgZGlydHkgZW5kLiBXZSBuZWVkIHRvCi0JLy8gYXNzdW1lIGVpdGhlciBcIiBvcgotCS8vICBcJyBpcyBhbiBleGNlcHRhYmxlIHF1b3RlLiAoTk9URTogdGhpcyBpcywgbG9vc2VseSwgYW4gWE1MIGFzc3VtcHRpb24KLQkvLyAtLQotCS8vIG90aGVyIGxhbmd1YWdlcwotCS8vICB3b3VsZCBkaWZmZXIsIGJ1dCB3ZSdsbCAiaGFyZCBjb2RlIiBmb3IgWE1MIGZvciBub3cuCi0JLy8gZnV0dXJlX1RPRE86IHRoaXMgaXMgYSByZWFsbHkgYmFkIGhldXJpc3RpYyAuLi4gd2Ugc2hvdWxkIGJlIGxvb2tpbmcKLQkvLyBmb3IKLQkvLyBvZGQgbnVtYmVyIG9mIHF1b3RlcwotCS8vIHdpdGhpbiBhIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAob3Igc29tZXRoaW5nISkgVGhpcyBjYXVzZXMgd2F5IHRvbwotCS8vIG11Y2ggcmVwYXJzaW5nIG9uCi0JLy8gc2ltcGxlIGNhc2VzLCBsaWtlIGRlbGV0aW5nIGEgdGFnIHdpdGggYSBxdW90ZWQgYXR0cmlidXRlIQotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JRdW90ZXMoKSB7Ci0JCS8vIHJvdXRpbmUgaXMgc3VwcG9ydGVkIHdpdGggbnVsbCBvciBlbXB0eSBzdHJpbmcgbWVhbmluZyB0aGUgc2FtZQotCQkvLyB0aGluZzogZGVsZXRpb24KLQkJaWYgKGZDaGFuZ2VzID09IG51bGwpCi0JCQlmQ2hhbmdlcyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnQgZGlydHlTdGFydFBvcyA9IC0xOwotCQkJU3RyaW5nIHByb3Bvc2VkRGVsZXRpb24gPSBmU3RydWN0dXJlZERvY3VtZW50LmdldChmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQkJaWYgKGZTdGFydCA8IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlpZiAoKGZDaGFuZ2VzLmluZGV4T2Yoc2luZ2xlUXVvdGUpID4gLTEpIHx8IChwcm9wb3NlZERlbGV0aW9uLmluZGV4T2Yoc2luZ2xlUXVvdGUpID4gLTEpKSB7Ci0JCQkJCUlSZWdpb24gc2luZ2xlUXVvdGVSZWdpb24gPSBnZXRGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcigpLmZpbmQoZlN0YXJ0LCBzaW5nbGVRdW90ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCQlpZiAoc2luZ2xlUXVvdGVSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJZGlydHlTdGFydFBvcyA9IHNpbmdsZVF1b3RlUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICgoZkNoYW5nZXMuaW5kZXhPZihkb3VibGVRdW90ZSkgPiAtMSkgfHwgKHByb3Bvc2VkRGVsZXRpb24uaW5kZXhPZihkb3VibGVRdW90ZSkgPiAtMSkpIHsKLQkJCQkJSVJlZ2lvbiBkb3VibGVRdW90ZVJlZ2lvbiA9IGdldEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyKCkuZmluZChmU3RhcnQsIGRvdWJsZVF1b3RlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJCWlmIChkb3VibGVRdW90ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlkaXJ0eVN0YXJ0UG9zID0gZG91YmxlUXVvdGVSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGlydHlTdGFydFBvcyA+IC0xKSB7Ci0JCQkJLy8gdGhlbiB3ZSBmb3VuZCBvbmUsIGRvIGNyZWF0ZSBuZXcgc3RydWN0dXJlZERvY3VtZW50IGV2ZW50Ci0JCQkJLy8gYmFzZWQgb24gdGhlIHByZXZpb3VzIHF1b3RlIHRvIGVuZCBvZiBkb2N1bWVudAotCQkJCS8vIGV4Y2VwdCwgd2UgbmVlZCB0byBiZSBwb3NpdGl2ZSB0aGF0IHRoZSBwcmV2aW91cyBxdW90ZSBpcwotCQkJCS8vIGluIGEgInNhZmUgc3RhcnQiIHJlZ2lvbiAoZS5nLiBpZiBpbiBKU1AgY29udGVudCwgd2UgbmVlZAotCQkJCS8vIHRvCi0JCQkJLy8gYmFja3VwIHRpbGwgd2UgaW5jbHVkZSB0aGUgd2hvbGUgSlNQIHJlZ2lvbiwgaW4gb3JkZXIgZm9yCi0JCQkJLy8gaXQKLQkJCQkvLyB0byBiZSBjb3JyZWN0bHkgcmUtcGFyc2VkLiBUaGUgYmFja2luZyB1cCBpcyBkb25lIGluIHRoZQotCQkJCS8vIHJlcGFyc2UvZmluZCBkaXJ0eSBzdGFydCBmcm9tIGhpbnQKLQkJCQkvLyBtZXRob2QuCi0JCQkJcmVzdWx0ID0gcmVwYXJzZShkaXJ0eVN0YXJ0UG9zLCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0RGVsZXRlZFRleHQoZkRlbGV0ZWRUZXh0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tIZXVyaXN0aWNzKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjaGVja0Zvck5vQ2hhbmdlKCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJvdW5kcnlDYXNlcygpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcXVpY2tDaGVjaygpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGFrZXMgaW50byBhY2NvdW50ICJ0YWcgbmFtZSIgcnVsZXMgZm9yIGNvbXBhcmlzb25zOyBjYXNlLWluc2Vuc2l0aXZlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja1RhZ05hbWVzKFN0cmluZyBjb21wYXJlVGV4dCwgU3RyaW5nIGNyaXRpY2FsVGFyZ2V0LCBib29sZWFuIGNoZWNrRW5kKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmICgoY29tcGFyZVRleHQgPT0gbnVsbCkgfHwgKGNyaXRpY2FsVGFyZ2V0ID09IG51bGwpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgcG9zT2ZDcml0aWNhbFdvcmQgPSBjb21wYXJlVGV4dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoY3JpdGljYWxUYXJnZXQudG9Mb3dlckNhc2UoKSk7Ci0JCXJlc3VsdCA9IHBvc09mQ3JpdGljYWxXb3JkID4gLTE7Ci0JCWlmIChjaGVja0VuZCAmJiByZXN1bHQpIHsKLQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRydWUgcmlnaHQgYXdheSwgd2UnbGwgb25seSByZXR1cm4gdHJ1ZQotCQkJLy8gdGhlCi0JCQkvLyBwb3RlbnRpYWxseSBtYXRjaGVkIHRhZyBpcyBpbmRlZWQgYSB0YWcsIGZvciBleGFtcGxlLCBpZgotCQkJLy8gPFNDUklQVAotCQkJLy8gYmVjb21lcyA8U0NSSVBUUyB3ZSBkb24ndCB3YW50IHRvIHNheSB0aGUgbGF0dGVyIGlzIGEgY3JpdGljYWwKLQkJCS8vIHRhZwotCQkJaW50IGxhc3RQb3MgPSBwb3NPZkNyaXRpY2FsV29yZCArIGNyaXRpY2FsVGFyZ2V0Lmxlbmd0aCgpOwotCQkJaWYgKGxhc3RQb3MgPCBjb21wYXJlVGV4dC5sZW5ndGgoKSkgewotCQkJCWNoYXIgbGFzdENoYXIgPSBjb21wYXJlVGV4dC5jaGFyQXQobGFzdFBvcyk7Ci0JCQkJLy8gRnV0dXJlOiBjaGVjayBmb3JtYWwgZGVmaW5pdGlvbiBvZiB0aGlzIGphdmEgbWV0aG9kLCB2cy4KLQkJCQkvLyBYTUwKLQkJCQkvLyBwYXJzaW5nIHJ1bGVzCi0JCQkJcmVzdWx0ID0gKCFDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGxhc3RDaGFyKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29yZSByZXBhcnNpbmcgbWV0aG9kIC4uLiBhZnRlciB0aGUgZGlydHkgc3RhcnQgYW5kIGRpcnR5IGVuZCBoYXZlCi0JICogYmVlbiBjYWxjdWxhdGVkIGVsc2V3aGVyZSwgYW5kIHRoZSB0ZXh0IHVwZGF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNvcmVfcmVwYXJzZShpbnQgcmVzY2FuU3RhcnQsIGludCByZXNjYW5FbmQsIENvcmVOb2RlTGlzdCBvbGROb2RlcywgYm9vbGVhbiBmaXJzdFRpbWUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2Rlc0hlYWQgPSBudWxsOwotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQluZXdOb2Rlc0hlYWQgPSBfY29yZV9yZXBhcnNlX3RleHQocmVzY2FuU3RhcnQsIHJlc2NhbkVuZCk7Ci0JCXJlc3VsdCA9IF9jb3JlX3JlcGFyc2VfdXBkYXRlX21vZGVsKG5ld05vZGVzSGVhZCwgcmVzY2FuU3RhcnQsIHJlc2NhbkVuZCwgb2xkTm9kZXMsIGZpcnN0VGltZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHN0YXRlIHRvICJub3QgcGFyc2luZyIKLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGVuZFJlUGFyc2UoKSB7Ci0JCWlzUGFyc2luZyA9IGZhbHNlOwotCQlkaXJ0eVN0YXJ0ID0gbnVsbDsKLQkJZGlydHlFbmQgPSBudWxsOwotCQlmQ2hhbmdlcyA9IG51bGw7Ci0JCWZEZWxldGVkVGV4dCA9IG51bGw7Ci0JCWZJc0VudGlyZURvY3VtZW50ID0gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZERpcnR5RW5kKGludCBlbmQpIHsKLQkJLy8gQ2F1dGlvbjogaGVyZSdzIG9uZSBwbGFjZSB3ZSBoYXZlIHRvIGNhc3QKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXN1bHQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGVuZCk7Ci0JCS8vIGlmIG5vdCB3ZWxsIGZvcm1lZCwgZ2V0IG9uZSBwYXN0LCBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhlcmUKLQkJaWYgKChyZXN1bHQgIT0gbnVsbCkgJiYgKCFyZXN1bHQuaXNFbmRlZCgpKSkgewotCQkJaWYgKHJlc3VsdC5nZXROZXh0KCkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHJlc3VsdC5nZXROZXh0KCk7Ci0JCQl9Ci0JCX0KLQkJLy8gYWxzbywgZ2V0IG9uZSBwYXN0IGlmIGV4YWN0bHkgZXF1YWwgdG8gdGhlIGVuZCAodGhpcyB3YXMgbmVlZGVkCi0JCS8vIGFzIGEgc2ltcGxlIGZpeCB0byB3aGVuIGEgd2hvbGUgZXhhY3QgcmVnaW9uIGlzIGRlbGV0ZWQuCi0JCS8vIHRoZXJlJ3MgcHJvYmFibHkgYSBiZXR0ZXIgd2F5LgotCQlpZiAoKHJlc3VsdCAhPSBudWxsKSAmJiAoZW5kID09IHJlc3VsdC5nZXRFbmQoKSkpIHsKLQkJCWlmIChyZXN1bHQuZ2V0TmV4dCgpICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQuZ2V0TmV4dCgpOwotCQkJfQotCQl9Ci0JCS8vIG1vdmVkIHRvIHN1YmNsYXNzIGZvciBxdWljayB0cmFuc2l0aW9uCi0JCS8vIDEyLzYvMjAwMSAtIFNpbmNlIHdlJ3ZlIGNoYW5nZWQgdGhlIHBhcnNlci9zY2FubmVyIHRvIGFsbG93IGEgbG9uZQotCQkvLyAnPCcgd2l0aG91dAotCQkvLyBhbHdheXMgaW50ZXJwcmV0dGluZyBpdCBhcyBzdGFydCBvZiBhIHRhZyBuYW1lLCB3ZSBuZWVkIHRvIGJlIGEKLQkJLy8gbGl0dGxlIGZhbmNpZXIsIGluIG9yZGVyCi0JCS8vIHRvICJza2lwIiBvdmVyIGFueSBwbGFpbiAnb2wgY29udGVudCBiZXR3ZWVuIHRoZSBsb25lICc8JyBhbmQgYW55Ci0JCS8vIHBvdGVudGlhbCBtZWF0aW5nCi0JCS8vIHJlZ2lvbnMgcGFzdCBwbGFpbiAnb2wgY29udGVudC4KLQkJLy8JCWlmIChpc0xvbmVPcGVuRm9sbG93ZWRCeUNvbnRlbnQocmVzdWx0KSAmJiAocmVzdWx0LmdldE5leHQoKSAhPQotCQkvLyBudWxsKSkgewotCQkvLwkJCXJlc3VsdCA9IHJlc3VsdC5nZXROZXh0KCk7Ci0JCS8vCQl9Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24ocmVzdWx0KTsKLQkJZGlydHlFbmQgPSByZXN1bHQ7Ci0JCXJldHVybiBkaXJ0eUVuZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaW5kRGlydHlTdGFydChpbnQgc3RhcnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXN1bHQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0KTsKLQkJLy8gaGV1cmlzdGljOiBpZiB0aGUgcG9zdGlvbiBpcyBleGFjdGx5IGVxdWFsIHRvIHRoZSBzdGFydCwgdGhlbgotCQkvLyBnbyBiYWNrIG9uZSBtb3JlLCBpZiBpdCBleGlzdHMuIFRoaXMgcHJldmVudHMgcHJvYmxlbXMgd2l0aAotCQkvLyBpbnNlcnRpb25zCi0JCS8vIG9mIHRleHQgdGhhdCBzaG91bGQgYmUgbWVyZ2VkIHdpdGggdGhlIHByZXZpb3VzIG5vZGUgaW5zdGVhZCBvZgotCQkvLyBzaW1wbHkgaHVuZwotCQkvLyBvZmYgb2YgaXQgYXMgYSBzZXBhcmF0ZSBub2RlIChleC46IFhNTCBjb250ZW50IGluc2VydGVkIHJpZ2h0Ci0JCS8vIGJlZm9yZQotCQkvLyBhbiBvcGVuCi0JCS8vIGJyYWNrZXQgc2hvdWxkIGJlY29tZSBwYXJ0IG9mIHRoZSBwcmV2aW91cyBjb250ZW50IG5vZGUpCi0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91cyA9IHJlc3VsdC5nZXRQcmV2aW91cygpOwotCQkJaWYgKChwcmV2aW91cyAhPSBudWxsKSAmJiAoKCEocHJldmlvdXMuaXNFbmRlZCgpKSkgfHwgKHN0YXJ0ID09IHJlc3VsdC5nZXRTdGFydCgpKSkpIHsKLQkJCQlyZXN1bHQgPSBwcmV2aW91czsKLQkJCX0KLQkJCS8vIElmIHdlIGFyZSBub3cgYXQgdGhlIGVuZCBvZiBhICJ0YWcgZGVwZW5kZW50IiBjb250ZW50IGFyZWEgKG9yCi0JCQkvLyBKU1AgYXJlYSkKLQkJCS8vIHRoZW4gd2UgbmVlZCB0byBiYWNrIHVwIGFsbCB0aGUgd2F5IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhhdC4KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcG90ZW50aWFsID0gcmVzdWx0OwotCQkJLy8gbW92ZWQgdG8gc3ViY2xhc3MgdG8gc3BlZWQgdHJhbnNpdGlvbgotCQkJLy8JCQl3aGlsZSAoaXNQYXJ0T2ZCbG9ja1JlZ2lvbihwb3RlbnRpYWwpKSB7Ci0JCQkvLwkJCQlwb3RlbnRpYWwgPSBwb3RlbnRpYWwuZ2V0UHJldmlvdXMoKTsKLQkJCS8vCQkJfQotCQkJaWYgKHBvdGVudGlhbCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcG90ZW50aWFsOwotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24ocmVzdWx0KTsKLQkJCX0KLQkJfQotCQlkaXJ0eVN0YXJ0ID0gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDb3JlTm9kZUxpc3QgZm9ybU9sZE5vZGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlTdGFydCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkaXJ0eUVuZCkgewotCQlDb3JlTm9kZUxpc3Qgb2xkTm9kZXMgPSBuZXcgQ29yZU5vZGVMaXN0KGRpcnR5U3RhcnQsIGRpcnR5RW5kKTsKLQkJLy8gTm93IHNhdmUgdGhlIG9sZCB0ZXh0LCB0aGF0ICJnb2VzIHdpdGgiIHRoZSBvbGQgbm9kZXMgYW5kIHJlZ2lvbnMuCi0JCS8vIE5vdGljZSB3ZSBhcmUgZ2V0dGluZyBpdCBkaXJlY3RseSBmcm9tIHRoZSB0ZXh0IHN0b3JlCi0JCVN0cmluZyBvbGRUZXh0ID0gbnVsbDsKLQkJaW50IG9sZFN0YXJ0ID0gLTE7Ci0JCWludCBvbGRFbmQgPSAtMTsKLQkJLy8gbWFrZSBzdXJlIHRoZXJlIGlzIHNvbWUgdGV4dCwgaWYgbm90LCB1c2UgZW1wdHkgc3RyaW5nCi0JCS8vIChpZiBvbmUgbm9kZSBpcyBub3QgbnVsbCwgdGhlIG90aGVyIHNob3VsZCBBTFdBWVMgYmUgbm90IG51bGwgdG9vLAotCQkvLyBzaW5jZSBpdAotCQkvLyB3b3VsZCBhdCBsZWFzdCBiZSBlcXVhbCB0byBpdC4pCi0JCWlmIChkaXJ0eVN0YXJ0ICE9IG51bGwpIHsKLQkJCW9sZFN0YXJ0ID0gZGlydHlTdGFydC5nZXRTdGFydCgpOwotCQkJb2xkRW5kID0gZGlydHlFbmQuZ2V0RW5kKCk7Ci0JCQlvbGRUZXh0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXQob2xkU3RhcnQsIG9sZEVuZCAtIG9sZFN0YXJ0KTsKLQkJfSBlbHNlIHsKLQkJCW9sZFN0YXJ0ID0gMDsKLQkJCW9sZEVuZCA9IDA7Ci0JCQlvbGRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBjcmVhdGUgYSB0ZW1wb3JhcnkgdGV4dCBzdG9yZSBmb3IgdGhpcyB0ZXh0Ci0JCVN1YlNldFRleHRTdG9yZSBzdWJUZXh0U3RvcmUgPSBuZXcgU3ViU2V0VGV4dFN0b3JlKG9sZFRleHQsIG9sZFN0YXJ0LCBvbGRFbmQsIGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOwotCQkvLyBOb3cgdXBkYXRlIHRoZSB0ZXh0IHN0b3JlIG9mIHRoZSBvbGROb2RlcwotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5zZXRQYXJlbnREb2N1bWVudChvbGROb2RlcywgbmV3IE1pbmltYWxEb2N1bWVudChzdWJUZXh0U3RvcmUpKTsKLQkJcmV0dXJuIG9sZE5vZGVzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIuCi0JICovCi0JcHVibGljIEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyIGdldEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyKCkgewotCQlpZiAoZkZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyID09IG51bGwpIHsKLQkJCWZGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlciA9IG5ldyBGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcihmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCQlyZXR1cm4gZkZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyOwotCX0KLQotCS8vIE5vdGU6IGlmIHRoZWFkIHNhZmV0eSBpcyBuZWVkZWQsIHRoaXMgYW5kIGFsbCB0aGUgb3RoZXIgcHVibGljIG1ldGhvZHMKLQkvLyBvZiB0aGlzIGNsYXNzCi0JLy8gc2hvdWxkIGJlIHN5bmNocm9uaXplZC4KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKE9iamVjdCByZXF1ZXN0ZXIsIGludCBzdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSwgU3RyaW5nIGNoYW5nZXMpIHsKLQkJaXNQYXJzaW5nID0gdHJ1ZTsKLQkJZlJlcXVlc3RlciA9IHJlcXVlc3RlcjsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZMZW5ndGhUb1JlcGxhY2UgPSBsZW5ndGhUb1JlcGxhY2U7Ci0JCWZDaGFuZ2VzID0gY2hhbmdlczsKLQkJLy8gbm90aWNlIHRoaXMgb25lIGlzIGRlcml2ZWQKLQkJZkxlbmd0aERpZmZlcmVuY2UgPSBVdGlsaXRpZXMuY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShmQ2hhbmdlcywgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCWZEZWxldGVkVGV4dCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCWludCBkb2NMZW5ndGggPSBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpOwotCQlmSXNFbnRpcmVEb2N1bWVudCA9IGxlbmd0aFRvUmVwbGFjZSA+PSBkb2NMZW5ndGggJiYgZG9jTGVuZ3RoID4gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnROb2RlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzT2xkTm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0T2xkTm9kZSwgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCS8vCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROZXcgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROZXcgPSBudWxsOwotCQkvLwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFByZXZpb3VzID0gcHJldmlvdXNPbGROb2RlOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5leHQgPSBuZXh0T2xkTm9kZTsKLQkJLy8KLQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJLy8gZ2V0IHBvaW50ZXJzCi0JCQlmaXJzdE5ldyA9IG5ld05vZGVzLml0ZW0oMCk7Ci0JCQlsYXN0TmV3ID0gbmV3Tm9kZXMuaXRlbShuZXdOb2Rlcy5nZXRMZW5ndGgoKSAtIDEpOwotCQkJLy8gc3dpdGNoIHN1cnJvdW5kaW5nIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMnIHJlZmVyZW5jZXMgdG8KLQkJCS8vIGxpc3RzCi0JCQlpZiAob2xkUHJldmlvdXMgIT0gbnVsbCkKLQkJCQlvbGRQcmV2aW91cy5zZXROZXh0KGZpcnN0TmV3KTsKLQkJCWlmIChvbGROZXh0ICE9IG51bGwpIHsKLQkJCQlvbGROZXh0LnNldFByZXZpb3VzKGxhc3ROZXcpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBTSURFIEVGRkVDVAotCQkJCS8vIGlmIG9sZE5leHQgaXMgbnVsbCwgdGhhdCBtZWFucyB3ZSBhcmUgcmVwbGFjZWluZyB0aGUKLQkJCQkvLyBsYXN0Tm9kZSBpbiB0aGUgY2hhaW4sCi0JCQkJLy8gc28gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHN0cnVjdHVyZWREb2N1bWVudHMgbGFzdE5vZGUgYXMKLQkJCQkvLyB0aGUKLQkJCQkvLyBsYXN0IG9mIHRoZSBuZXcgbm9kZXMuCi0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRMYXN0RG9jdW1lbnRSZWdpb24obmV3Tm9kZXMuaXRlbShuZXdOb2Rlcy5nZXRMZW5ndGgoKSAtIDEpKTsKLQkJCX0KLQkJCWlmIChmaXJzdE5ldyAhPSBudWxsKQotCQkJCWZpcnN0TmV3LnNldFByZXZpb3VzKG9sZFByZXZpb3VzKTsKLQkJCWlmIChsYXN0TmV3ICE9IG51bGwpCi0JCQkJbGFzdE5ldy5zZXROZXh0KG9sZE5leHQpOwotCQl9Ci0JCS8vIGVsc2Ugbm90aGluZyB0byBpbnNlcnQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkUmVnaW9uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29sbGVjdGlvblJlZ2lvbihJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXJldHVybiAoYVJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJzaW5nKCkgewotCQlyZXR1cm4gaXNQYXJzaW5nOwotCX0KLQotCS8qKgotCSAqIFRoZSBtaW5pbWl6YXRpb24gYWxnb3JpdGhtIHNpbXBseSBjaGVja3MgdGhlIG9sZCBub2RlcyB0byBzZWUgaWYgYW55IG9mCi0JICogdGhlbSAic3Vydml2ZWQiIHRoZSByZXNjYW4gYW5kIGFyZSB1bmNoYW5nZWQuIElmIHNvLCB0aGUgaW5zdGFuY2Ugb2YKLQkgKiB0aGUgb2xkIG5vZGUgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBuZXcgbm9kZS4gQmVmb3JlIHRoZSByZXF1ZXN0ZWQKLQkgKiBjaGFuZ2UsIG5lZWQgdG8gY2hlY2sgdHlwZSwgb2Zmc2V0cywgYW5kIHRleHQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzYW1lLgotCSAqIEFmdGVyIHRoZSByZXF1ZXN0ZWQgY2hhbmdlLCBuZWVkIHRvIGNoZWNrIHR5cGUgYW5kIHRleHQsIGJ1dCBhZGp1c3QgdGhlCi0JICogb2Zmc2V0cyB0byB3aGF0IGV2ZXIgdGhlIGNoYW5nZSB3YXMuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IG1pbmltdW1FdmVudChDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBldmVudCA9IG51bGw7Ci0JCUNvcmVOb2RlTGlzdCBtaW5pbWFsT2xkTm9kZXMgPSBudWxsOwotCQlDb3JlTm9kZUxpc3QgbWluaW1hbE5ld05vZGVzID0gbnVsbDsKLQkJLy8gVG8gbWluaW1pemUgbm9kZXMsIHdlJ2xsIGNvbGxlY3QgYWxsIHRob3NlCi0JCS8vIHRoYXQgYXJlIG5vdCBlcXVhbCBpbnRvIG9sZCBhbmQgbmV3IGxpc3RzCi0JCS8vIE5vdGU6IHdlIGFzc3VtZSB0aGF0IG9sZCBhbmQgbmV3IG5vZGVzCi0JCS8vIGFyZSBiYXNpY2FsbHkgY29udGlndW91cyAtLSBhbmQgd2UgZm9yY2UgaXQgdG8gYmUgc28sCi0JCS8vIGJ5IHN0YXJ0aW5nIGF0IHRoZSBiZWdpbm5pbmcgdG8KLQkJLy8gZmluZCBmaXJzdCBkaWZmZXJlbmNlLCBhbmQgdGhlbiBzdGFydGluZyBhdCB0aGUgZW5kIHRvIGZpbmQKLQkJLy8gbGFzdCBkaWZmZXJlbmNlLiBFdmVyeXRoaW5nIGluIGJldHdlZW4gd2UgYXNzdW1lIGlzIGRpZmZlcmVudC4KLQkJLy8KLQkJLy8KLQkJLy8KLQkJLy8gc3RhcnRPZkRpZmZlcmVuY2VzIGlzIHRoZSBpbmRleCBpbnRvIHRoZSBjb3JlIG5vZGUgbGlzdCB3aGVyZSB0aGUKLQkJLy8gZmlyc3QgZGlmZmVyZW5jZQotCQkvLyBvY2N1cnMuIEJ1dCBpdCBtYXkgcG9pbnQgaW50byB0aGUgb2xkIG9yIHRoZSBuZXcgbGlzdC4KLQkJaW50IHN0YXJ0T2ZEaWZmZXJlbmNlcyA9IF9jb21wdXRlU3RhcnRPZkRpZmZlcmVuY2VzKG9sZE5vZGVzLCBuZXdOb2Rlcyk7Ci0JCWludCBlbmRPZkRpZmZlcmVuY2VzT2xkID0gLTE7Ci0JCWludCBlbmRPZkRpZmZlcmVuY2VzTmV3ID0gLTE7Ci0JCS8vIGlmIG9uZSBvZiB0aGUgbGlzdHMgYXJlIHNob3J0ZXIgdGhhbiB3aGVyZSB0aGUgZGlmZmVyZW5jZXMgc3RhcnQsCi0JCS8vIHRoZW4KLQkJLy8gdGhlbiBzb21lIHBvcnRpb24gb2YgdGhlIGxpc3RzIGFyZSBpZGVudGljYWwKLQkJaWYgKChzdGFydE9mRGlmZmVyZW5jZXMgPj0gb2xkTm9kZXMuZ2V0TGVuZ3RoKCkpIHx8IChzdGFydE9mRGlmZmVyZW5jZXMgPj0gbmV3Tm9kZXMuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQlpZiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPCBuZXdOb2Rlcy5nZXRMZW5ndGgoKSkgewotCQkJCS8vIFRoZW4gdGhlcmUgYXJlIG5ldyByZWdpb25zIHRvIGFkZAotCQkJCS8vICAgICB0aGVzZSBsZW5ndGhzIHdpbGwgY2F1c2UgdGhlIHZlY3RvciBvZiBvbGQgb25lcyB0byBub3QKLQkJCQkvLyAgICAgaGF2ZSBhbnkgZWxlbWVudHMsIGFuZCB0aGUgdmVjdG9yIG9mIG5ldyByZWdpb25zIHRvIGhhdmUKLQkJCQkvLyAgICAganVzdCB0aGUgbmV3IG9uZXMgbm90IGluIGNvbW1vbiB3aXRoIHRoZSBvbGQgb25lcwotCQkJCS8vc3RhcnRPZkRpZmZlcmVuY2VzIHNob3VsZCBlcXVhbCBvbGROb2Rlcy5nZXRMZW5ndGgoKSwKLQkJCQkvLyBjYWxjdWxhdGVkIGFib3ZlIG9uIF9jb21wdXRlU3RhcnRPZkRpZmZlcmVuY2VzCi0JCQkJbWluaW1hbE9sZE5vZGVzID0gRU1QVFlfTElTVDsKLQkJCQllbmRPZkRpZmZlcmVuY2VzTmV3ID0gbmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgLSAxOwotCQkJCW1pbmltYWxOZXdOb2RlcyA9IF9mb3JtTWluaW11bUxpc3QobmV3Tm9kZXMsIHN0YXJ0T2ZEaWZmZXJlbmNlcywgZW5kT2ZEaWZmZXJlbmNlc05ldyk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChvbGROb2Rlcy5nZXRMZW5ndGgoKSA+IG5ld05vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQkJCS8vIGRlbGV0ZSBvbGQKLQkJCQkJLy8gdGhlbiB0aGVyZSBhcmUgb2xkIHJlZ2lvbnMgdG8gZGVsZXRlCi0JCQkJCS8vICAgIHRoZXNlIGxlbmd0aHMgd2lsbCBjYXVzZSB0aGUgdmVjdG9yIG9mIG9sZCByZWdpb25zIHRvCi0JCQkJCS8vICAgIGNvbnRhaW4gdGhlIG9uZXMgdG8gZGVsZXRlLCBhbmQgdGhlIHZlY3RvciBvZiBuZXcKLQkJCQkJLy8gcmVnaW9ucwotCQkJCQkvLyAgICBub3QgaGF2ZSBhbnkgZWxlbWVudHMKLQkJCQkJLy9zdGFydE9mRGlmZmVyZW5jZXMgc2hvdWxkIGVxdWFsIG5ld05vZGVzLmdldExlbmd0aCgpLAotCQkJCQkvLyBjYWxjdWxhdGVkIGFib3ZlIG9uIF9jb21wdXRlU3RhcnRPZkRpZmZlcmVuY2VzCi0JCQkJCWVuZE9mRGlmZmVyZW5jZXNPbGQgPSBvbGROb2Rlcy5nZXRMZW5ndGgoKSAtIDE7Ci0JCQkJCW1pbmltYWxPbGROb2RlcyA9IF9mb3JtTWluaW11bUxpc3Qob2xkTm9kZXMsIHN0YXJ0T2ZEaWZmZXJlbmNlcywgZW5kT2ZEaWZmZXJlbmNlc09sZCk7Ci0JCQkJCW1pbmltYWxOZXdOb2RlcyA9IEVNUFRZX0xJU1Q7Ci0JCQkJfSBlbHNlCi0JCQkJCS8vIHVubGlrZWx5IGV2ZW50Ci0JCQkJCWV2ZW50ID0gbmV3IE5vQ2hhbmdlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudCwgZlJlcXVlc3RlciwgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBXZSBmb3VuZCBhIG5vcm1hbCBzdGFydE9mRGlmZmVybmNlcywgYnV0IGhhdmUgbm90IHlldCBmb3VuZCB0aGUKLQkJCS8vIGVuZHMuCi0JCQkvLyBXZSdsbCBsb29rIGZvciB0aGUgZW5kIG9mIGRpZmZlcmVuY2VzIGJ5IGdvaW5nIGJhY2t3YXJkcyBkb3duCi0JCQkvLyB0aGUgdHdvIGxpc3RzLgotCQkJLy8gSGVyZSB3ZSBuZWVkIGEgc2VwZXJhdGUgaW5kZXggZm9yIGVhY2ggYXJyYXksIHNpbmNlIHRoZXkgbWF5IGJlCi0JCQkvLyAoYW5kCi0JCQkvLyBwcm9iYWJseSBhcmUpIG9mIGRpZmZlcmVudCBsZW5ndGhzLgotCQkJaW50IGluZGV4T2xkID0gb2xkTm9kZXMuZ2V0TGVuZ3RoKCkgLSAxOwotCQkJaW50IGluZGV4TmV3ID0gbmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgLSAxOwotCQkJLy8gVGhlIGdyZWF0ZXJUaGFuRWZmZWN0ZWRSZWdpb24gaXMgaW1wb3J0YW50IHRvIGdhdXJkIGFnYWluc3QKLQkJCS8vIGluY29ycmVjdCBjb3VudGluZwotCQkJLy8gd2hlbiBzb21ldGhpbmcgaWRlbnRpY2FsIGlzIGluc2VydGVkIHRvIHdoYXQncyBhbHJlYWR5IHRoZXJlCi0JCQkvLyAoc2VlIG1pbmltaXphdGlvbiB0ZXN0IGNhc2UgNSkKLQkJCS8vIE5vdGU6IHRoZSBpbmRleE9sZCA+IHN0YXJ0T2ZEaWZmZXJlbmNlcyBrZWVwcyBpbmRleE9sZCBmcm9tCi0JCQkvLyBnZXR0aW5nIHRvbyBzbWFsbCwKLQkJCS8vIHNvIHRoYXQgdGhlIHN1YnNlcXVlbnQgb2xkTm9kZXMuaXRlbShpbmRleE9sZCkgaXMgYWx3YXlzIHZhbGlkLgotCQkJd2hpbGUgKChpbmRleE9sZCA+PSBzdGFydE9mRGlmZmVyZW5jZXMpICYmIChfZ3JlYXRlclRoYW5FZmZlY3RlZFJlZ2lvbihvbGROb2Rlcy5pdGVtKGluZGV4T2xkKSkpKSB7Ci0JCQkJaWYgKCEob2xkTm9kZXMuaXRlbShpbmRleE9sZCkuc2FtZUFzKG5ld05vZGVzLml0ZW0oaW5kZXhOZXcpLCBmTGVuZ3RoRGlmZmVyZW5jZSkpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGlmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIHdlIHdpbGwgYmUga2VlcGluZyB0aGUgb2xkIG9uZSwKLQkJCQkJLy8gc28KLQkJCQkJLy8gd2UgbmVlZCB0byBiZSBzdXJlIGl0cyBwYXJlbnREb2N1bWVudCBpcyBzZXQgYmFjayB0bwotCQkJCQkvLyB0aGUKLQkJCQkJLy8gcmlnaHQgaW5zdGFuY2UKLQkJCQkJb2xkTm9kZXMuaXRlbShpbmRleE9sZCkuc2V0UGFyZW50RG9jdW1lbnQoZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQkJfQotCQkJCWluZGV4T2xkLS07Ci0JCQkJaW5kZXhOZXctLTsKLQkJCX0KLQkJCWVuZE9mRGlmZmVyZW5jZXNPbGQgPSBpbmRleE9sZDsKLQkJCWVuZE9mRGlmZmVyZW5jZXNOZXcgPSBpbmRleE5ldzsKLQkJCW1pbmltYWxPbGROb2RlcyA9IF9mb3JtTWluaW11bUxpc3Qob2xkTm9kZXMsIHN0YXJ0T2ZEaWZmZXJlbmNlcywgZW5kT2ZEaWZmZXJlbmNlc09sZCk7Ci0JCQltaW5pbWFsTmV3Tm9kZXMgPSBfZm9ybU1pbmltdW1MaXN0KG5ld05vZGVzLCBzdGFydE9mRGlmZmVyZW5jZXMsIGVuZE9mRGlmZmVyZW5jZXNOZXcpOwotCQl9IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCS8vCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3REb3duU3RyZWFtTm9kZSA9IG51bGw7Ci0JCWV2ZW50ID0gcmVnaW9uQ2hlY2sobWluaW1hbE9sZE5vZGVzLCBtaW5pbWFsTmV3Tm9kZXMpOwotCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJZmlyc3REb3duU3RyZWFtTm9kZSA9IG1pbmltYWxPbGROb2Rlcy5pdGVtKDApLmdldE5leHQoKTsKLQkJCWlmIChmaXJzdERvd25TdHJlYW1Ob2RlICE9IG51bGwgJiYgZkxlbmd0aERpZmZlcmVuY2UgIT0gMCkgeyAvLyBpZgotCQkJCS8vIGZpcnN0RG93blN0cmVhbQotCQkJCS8vIGlzCi0JCQkJLy8gbnVsbCwKLQkJCQkvLyB0aGVuCi0JCQkJLy8gd2UncmUKLQkJCQkvLyBhdAotCQkJCS8vIHRoZQotCQkJCS8vIGVuZAotCQkJCS8vIG9mCi0JCQkJLy8gdGhlCi0JCQkJLy8gZG9jdW1lbnQKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5hZGp1c3RTdGFydChmaXJzdERvd25TdHJlYW1Ob2RlLCBmTGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQl9IC8vCi0JCX0gZWxzZSB7Ci0JCQlldmVudCA9IG5vZGVzUmVwbGFjZWRDaGVjayhtaW5pbWFsT2xkTm9kZXMsIG1pbmltYWxOZXdOb2Rlcyk7Ci0JCQkvLyBub3cgc3BsaWNlIHRoZSBuZXcgY2hhaW4gb2Ygbm9kZXMgdG8gd2hlcmUgdGhlIG9sZCBjaGFpbiBpcyAob3IKLQkJCS8vIHdhcykKLQkJCS8vIHRoZSBmaXJzdERvd25TdHJlYW1Ob2RlICh0aGUgZmlyc3Qgb2YgdGhvc2UgYWZ0ZXIgdGhlIG5ldwotCQkJLy8gbm9kZXMpCi0JCQkvLyBpcwotCQkJLy8gcmVtZW1iZXJlZCBhcyBhIHRpbnkgb3B0aW1pemF0aW9uLgotCQkJaWYgKG1pbmltYWxPbGROb2Rlcy5nZXRMZW5ndGgoKSA9PSAwICYmIG1pbmltYWxOZXdOb2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkvLyBpZiBubyBvbGQgbm9kZXMgYXJlIGJlaW5nIGRlbGV0ZWQsIHRoZW4gdXNlIHRoZQotCQkJCS8vIHRoZSBuZXdOb2RlcyBvZmZzZXQgKG1pbnVzIG9uZSkgdG8gZmluZCB0aGUgcG9pbnQgdG8KLQkJCQkvLyB1cGRhdGUgZG93bnN0cmVhbSBub2RlcywgYW5kIGFmdGVyIHVwZGF0aW5nIGRvd25zdHJlYW0KLQkJCQkvLyBub2RlcyBwb3N0aW9ucywgaW5zZXJ0IHRoZSBuZXcgb25lcy4KLQkJCQlpbnQgaW5zZXJ0T2Zmc2V0ID0gbWluaW1hbE5ld05vZGVzLml0ZW0oMCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RPbGRVbmNoYW5nZWROb2RlID0gbnVsbDsKLQkJCQlpZiAoaW5zZXJ0T2Zmc2V0ID4gMCkgewotCQkJCQlsYXN0T2xkVW5jaGFuZ2VkTm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5zZXJ0T2Zmc2V0IC0gMSk7Ci0JCQkJCWZpcnN0RG93blN0cmVhbU5vZGUgPSBsYXN0T2xkVW5jaGFuZ2VkTm9kZS5nZXROZXh0KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gd2UncmUgaW5zZXJ0aW5nIGF0IHZlcnkgYmVnaW5uaW5nCi0JCQkJCWZpcnN0RG93blN0cmVhbU5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCS8vIFNJREUgRUZGRUNUOiBjaGFuZ2UgdGhlIGZpcnN0Tm9kZSBwb2ludGVyIGlmIHdlJ3JlCi0JCQkJCS8vIGluc2VydGluZyBhdCBiZWdpbm5pbmcKLQkJCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRGaXJzdERvY3VtZW50UmVnaW9uKG1pbmltYWxOZXdOb2Rlcy5pdGVtKDApKTsKLQkJCQl9Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3IuYWRqdXN0U3RhcnQoZmlyc3REb3duU3RyZWFtTm9kZSwgZkxlbmd0aERpZmZlcmVuY2UpOwotCQkJCWluc2VydE5vZGVzKGxhc3RPbGRVbmNoYW5nZWROb2RlLCBmaXJzdERvd25TdHJlYW1Ob2RlLCBtaW5pbWFsTmV3Tm9kZXMpOwotCQkJCS8vIHRoaXMgKG5vZGVzIHJlcGxhY2VkKSBpcyB0aGUgb25seSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8KLQkJCQkvLyB1cGRhdGUgdGhlIGNhY2hlZCBOb2RlCi0JCQkJcmVTZXRDYWNoZWROb2RlKG1pbmltYWxPbGROb2RlcywgbWluaW1hbE5ld05vZGVzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZmlyc3REb3duU3RyZWFtTm9kZSA9IHN3aXRjaE5vZGVMaXN0cyhtaW5pbWFsT2xkTm9kZXMsIG1pbmltYWxOZXdOb2Rlcyk7Ci0JCQkJLy8gbm8gbmVlZCB0byBhZGp1c3QgdGhlIGxlbmd0aCBvZiB0aGUgbmV3IG5vZGVzIHRoZW1zZWx2ZXMsCi0JCQkJLy8gdGhleQotCQkJCS8vIGFyZSBhbHJlYWR5IGNvcnJlY3QsIGJ1dCB3ZSBkbyBuZWVkIHRvCi0JCQkJLy8gYWRqdXN0IGFsbCAiZG93biBzdHJlYW0iIG5vZGVzIHdpdGggdGhlIGxlbmd0aCBvZiB0aGUKLQkJCQkvLyBpbnNlcnRpb24gb3IgZGVsZXRpb24KLQkJCQkvLyAtLS0gYWRqdXN0bWVudCBtb3ZlZCB0byBjYWxsaW5nIG1ldGhvZC4KLQkJCQlpZiAoZmlyc3REb3duU3RyZWFtTm9kZSAhPSBudWxsKSB7Ci0JCQkJCS8vICYmIGV2ZW50ICE9IG51bGwKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3IuYWRqdXN0U3RhcnQoZmlyc3REb3duU3RyZWFtTm9kZSwgZkxlbmd0aERpZmZlcmVuY2UpOwotCQkJCX0gLy8KLQkJCQkvLyB0aGlzIChub2RlcyByZXBsYWNlZCkgaXMgdGhlIG9ubHkgY2FzZSB3aGVyZSB3ZSBuZWVkIHRvCi0JCQkJLy8gdXBkYXRlIHRoZSBjYWNoZWQgTm9kZQotCQkJCXJlU2V0Q2FjaGVkTm9kZShtaW5pbWFsT2xkTm9kZXMsIG1pbmltYWxOZXdOb2Rlcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGV2ZW50OwotCX0KLQotCS8vIFRPRE86IFRoaXMgc2hvdWxkIGJlIGFic3RyYWN0LgotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBub2Rlc1JlcGxhY2VkQ2hlY2soQ29yZU5vZGVMaXN0IG9sZE5vZGVzLCBDb3JlTm9kZUxpc3QgbmV3Tm9kZXMpIHsKLQkJLy8gYWN0dWFsbHksIG5vdGhpbmcgdG8gY2hlY2sgaGVyZSwgc2luY2UgKGFuZCBhc3N1bWluZykgd2UndmUgYWxyZWFkeQotCQkvLyBtaW5pbWl6ZWQgdGhlIG51bWJlciBvZiBub2RlcywgYW5kIHJ1bGVkIG91dCBtZXJlIHJlZ2lvbiBjaGFuZ2VzCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudChmU3RydWN0dXJlZERvY3VtZW50LCBmUmVxdWVzdGVyLCBvbGROb2RlcywgbmV3Tm9kZXMsIGZDaGFuZ2VzLCBmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UsIGZJc0VudGlyZURvY3VtZW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBBIG1ldGhvZCB0byBhbGxvdyBhbnkgaGV1cmlzdGljICJxdWljayBjaGVja3MiIHRoYXQgbWlnaHQgY292ZXIgbWFueQotCSAqIG1hbnkgY2FzZXMsIGJlZm9yZSBleHBlbmRpbmcgdGhlIHRpbWUgb24gYSBmdWxsIHJlcGFyc2UuCi0JICogIAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBxdWlja0NoZWNrKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB0aGUgZGlydHkgc3RhcnQgaXMgbnVsbCwgdGhlbiB3ZSBoYXZlIGFuIGVtcHR5IGRvY3VtZW50LgotCQkvLyBpbiB3aGljaCBjYXNlIHdlJ2xsIHJldHVybiBudWxsIHNvIGV2ZXJ5dGhpbmcgY2FuIGJlCi0JCS8vIHJlcGFyc2VkICJmcm9tIHNjcmF0Y2giIC4gSWYgaXRzIG5vdCBudWxsLCB3ZSdsbCBnaXZlIHRoZSBmbGF0bm9kZQotCQkvLyBhCi0JCS8vIGNoYW5jZQotCQkvLyB0byBoYW5kbGUsIGJ1dCBvbmx5IGlmIHRoZXJlIGlzIG9uZSBmbGF0bm9kZSBpbnZvbHZlZC4KLQkJaWYgKGRpcnR5U3RhcnQgIT0gbnVsbCAmJiBkaXJ0eVN0YXJ0ID09IGRpcnR5RW5kKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRhcmdldE5vZGUgPSBkaXJ0eVN0YXJ0OwotCQkJcmVzdWx0ID0gZGlydHlTdGFydC51cGRhdGVSZWdpb24oZlJlcXVlc3RlciwgdGFyZ2V0Tm9kZSwgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQkvLyBhdCB0aGlzIHBvaW50IG9ubHksIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSB0ZXh0IHN0b3JlIGFuZAotCQkJCS8vIGFuZCBkb3duc3RyZWFtIG5vZGVzLgotCQkJCS8vIEZVVFVSRV9UT19ETzogY2FuIHRoaXMgZGVwZW5kZW5jeSBvbiBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkJCQkvLyBtZXRob2QgYmUgZWxpbWluYXRlZD8KLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnVwZGF0ZURvY3VtZW50RGF0YShmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UsIGZDaGFuZ2VzKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0RG93blN0cmVhbU5vZGUgPSB0YXJnZXROb2RlLmdldE5leHQoKTsKLQkJCQkvLyB0aGVuIGZsYXRub2RlIG11c3QgaGF2ZSBiZWVuIHRoZSBsYXN0IG9uZSwgc28gbmVlZCB0bwotCQkJCS8vIHVwZGF0ZQotCQkJCS8vIGFueSBkb3duc3RyZWFtIG9uZXMKLQkJCQlpZiAoZmlyc3REb3duU3RyZWFtTm9kZSAhPSBudWxsKSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLmFkanVzdFN0YXJ0KGZpcnN0RG93blN0cmVhbU5vZGUsIGZMZW5ndGhEaWZmZXJlbmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0RGVsZXRlZFRleHQoZkRlbGV0ZWRUZXh0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIElmIG9ubHkgb25lIG5vZGUgaXMgaW52b2x2ZWQsIHNlZXMgaG93IG1hbnkgcmVnaW9ucyBhcmUgY2hhbmdlZC4gSWYKLQkgKiBvbmx5IG9uZSwgdGhlbiBpdHMgYSAncmVnaW9uQ2hhbmdlZCcgZXZlbnQgLi4uIGlmIG1vcmUgdGhhbiBvbmUsIGl0cyBhCi0JICogJ3JlZ2lvbnNSZXBsYWNlZCcgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlZ2lvbkNoZWNrKENvcmVOb2RlTGlzdCBvbGROb2RlcywgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSVN0cnVjdHVyZWREb2N1bWVudDo6cmVnaW9uc1JlcGxhY2VkQ2hlY2siKTsgLy8kTk9OLU5MUy0xJAotCQkvLyROT04tTkxTLTEkCi0JCS8vJE5PTi1OTFMtMSQKLQkJLy8gdGhlICJyZWdpb25zUmVwbGFjZWQiIGV2ZW50IGNvdWxkIG9ubHkgYmUgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUKLQkJLy8gbm9kZWxpc3RzCi0JCS8vIGFyZSBlYWNoIG9ubHkgIjEiIGluIGxlbmd0aC4KLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IG9sZExlbmd0aCA9IG9sZE5vZGVzLmdldExlbmd0aCgpOwotCQlpbnQgbmV3TGVuZ3RoID0gbmV3Tm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWlmICgob2xkTGVuZ3RoICE9IDEpIHx8IChuZXdMZW5ndGggIT0gMSkpIHsKLQkJCXJlc3VsdCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUgPSBvbGROb2Rlcy5pdGVtKDApOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlID0gbmV3Tm9kZXMuaXRlbSgwKTsKLQkJCXJlc3VsdCA9IHJlZ2lvbkNoZWNrKG9sZE5vZGUsIG5ld05vZGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSWYgb25seSBvbmUgbm9kZSBpcyBpbnZvbHZlZCwgc2VlcyBob3cgbWFueSByZWdpb25zIGFyZSBjaGFuZ2VkLiBJZgotCSAqIG9ubHkgb25lLCB0aGVuIGl0cyBhICdyZWdpb25DaGFuZ2VkJyBldmVudCAuLi4gaWYgbW9yZSB0aGFuIG9uZSwgaXRzIGEKLQkgKiAncmVnaW9uc1JlcGxhY2VkJyBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVnaW9uQ2hlY2soSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05vZGUpIHsKLQkJLy8KLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMgPSBvbGROb2RlLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMgPSBuZXdOb2RlLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb25bXSBvbGRSZWdpb25zQXJyYXkgPSBvbGRSZWdpb25zLnRvQXJyYXkoKTsKLQkJSVRleHRSZWdpb25bXSBuZXdSZWdpb25zQXJyYXkgPSBuZXdSZWdpb25zLnRvQXJyYXkoKTsKLQkJLy8KLQkJLy8gZm9yIHRoZSAncmVnaW9uc1JlcGxhY2VkJyBldmVudCwgd2UgZG9uJ3QgY2FyZSBpZgotCQkvLyB0aGUgcmVnaW9ucyBjaGFuZ2VkIGR1ZSB0byB0eXBlLCBvciB0ZXh0LAotCQkvLyB3ZSdsbCBqdXN0IGNvbGxlY3QgYWxsIHRob3NlIHRoYXQgYXJlIG5vdCBlcXVhbAotCQkvLyBpbnRvIHRoZSBvbGQgYW5kIG5ldyByZWdpb24gbGlzdHMuCi0JCS8vIE5vdGU6IHdlLCBvZiBjb3Vyc2UsIGFzc3VtZSB0aGF0IG9sZCBhbmQgbmV3IHJlZ2lvbnMKLQkJLy8gYXJlIGJhc2ljYWxseSBjb250aWd1b3VzIC0tIGFuZCB3ZSBmb3JjZSBpdCB0byBiZSBzbywKLQkJLy8gZXZlbiBpZiBub3QgbGl0ZXJhbGx5IHNvLCBieSBzdGFydGluZyBhdCBiZWdpbm5pbmcgdG8KLQkJLy8gZmluZCBmaXJzdCBkaWZmZXJlbmNlLCBhbmQgdGhlbiBzdGFydGluZyBhdCBlbmQgdG8gZmluZAotCQkvLyBsYXN0IGRpZmZlcmVuY2UuIEV2ZXJ5dGhpbmcgaW4gYmV0d2VlbiB3ZSBhc3N1bWUgaXMgZGlmZmVyZW50LgotCQkvLwotCQkvLyBnb2luZyB1cCBpcyBlYXN5LCB3ZSBzdGFydCBhdCB6ZXJvIGluIGVhY2gsIGFuZCBjb250aW51ZQotCQkvLyB0aWxsIHJlZ2lvbnMgYXJlIG5vdCB0aGUgc2FtZS4KLQkJaW50IHN0YXJ0T2ZEaWZmZXJlbmNlcyA9IF9jb21wdXRlU3RhcnRPZkRpZmZlcmVuY2VzKG9sZE5vZGUsIG9sZFJlZ2lvbnMsIG5ld05vZGUsIG5ld1JlZ2lvbnMpOwotCQlpbnQgZW5kT2ZEaWZmZXJlbmNlc09sZCA9IC0xOwotCQlpbnQgZW5kT2ZEaWZmZXJlbmNlc05ldyA9IC0xOwotCQkvLwotCQkvLwotCQkvLyBpZiBvbmUgb2YgdGhlIGxpc3RzIGFyZSBzaG9ydGVyIHRoYW4gd2hlcmUgdGhlIGRpZmZlcmVuY2VzIHN0YXJ0LAotCQkvLyB0aGVuCi0JCS8vIHRoZW4gc29tZSBwb3J0aW9uIG9mIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsCi0JCWlmICgoc3RhcnRPZkRpZmZlcmVuY2VzID49IG9sZFJlZ2lvbnMuc2l6ZSgpKSB8fCAoc3RhcnRPZkRpZmZlcmVuY2VzID49IG5ld1JlZ2lvbnMuc2l6ZSgpKSkgewotCQkJaWYgKG9sZFJlZ2lvbnMuc2l6ZSgpIDwgbmV3UmVnaW9ucy5zaXplKCkpIHsKLQkJCQkvLyBJTlNFUlQgQ0FTRQotCQkJCS8vIHRoZW4gdGhlcmUgYXJlIG5ldyByZWdpb25zIHRvIGFkZAotCQkJCS8vICAgICB0aGVzZSBsZW5ndGhzIHdpbGwgY2F1c2UgdGhlIHZlY3RvciBvZiBvbGQgb25lcyB0byBub3QKLQkJCQkvLyAgICAgaGF2ZSBhbnkgZWxlbWVudHMsIGFuZCB0aGUgdmVjdG9yIG9mIG5ldyByZWdpb25zIHRvIGhhdmUKLQkJCQkvLyAgICAganVzdCB0aGUgbmV3IG9uZXMuCi0JCQkJc3RhcnRPZkRpZmZlcmVuY2VzID0gb2xkUmVnaW9uc0FycmF5Lmxlbmd0aDsKLQkJCQllbmRPZkRpZmZlcmVuY2VzT2xkID0gb2xkUmVnaW9uc0FycmF5Lmxlbmd0aCAtIDE7Ci0JCQkJZW5kT2ZEaWZmZXJlbmNlc05ldyA9IG5ld1JlZ2lvbnNBcnJheS5sZW5ndGggLSAxOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAob2xkUmVnaW9ucy5zaXplKCkgPiBuZXdSZWdpb25zLnNpemUoKSkgewotCQkJCQkvLyBERUxFVEUgQ0FTRQotCQkJCQkvLyB0aGVuIHRoZXJlIGFyZSBvbGQgcmVnaW9ucyB0byBkZWxldGUKLQkJCQkJLy8gICAgdGhlc2UgbGVuZ3RocyB3aWxsIGNhdXNlIHRoZSB2ZWN0b3Igb2Ygb2xkIHJlZ2lvbnMgdG8KLQkJCQkJLy8gICAgY29udGFpbiB0aGUgb25lcyB0byBkZWxldGUsIGFuZCB0aGUgdmVjdG9yIG9mIG5ldwotCQkJCQkvLyByZWdpb25zCi0JCQkJCS8vICAgIG5vdCBoYXZlIGFueSBlbGVtZW50cwotCQkJCQlzdGFydE9mRGlmZmVyZW5jZXMgPSBuZXdSZWdpb25zQXJyYXkubGVuZ3RoOwotCQkJCQllbmRPZkRpZmZlcmVuY2VzT2xkID0gb2xkUmVnaW9uc0FycmF5Lmxlbmd0aCAtIDE7Ci0JCQkJCWVuZE9mRGlmZmVyZW5jZXNOZXcgPSBuZXdSZWdpb25zQXJyYXkubGVuZ3RoIC0gMTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBlbHNlIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsIQotCQkJCQkvLyB1bmxpa2VseSBldmVudCwgcHJvYmFibHkgZXJyb3IgaW4gY3VycmVudCBkZXNpZ24sIHNpbmNlCi0JCQkJCS8vIHdlIGNoZWNrIGZvciBpZGVudGl0eSBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YKLQkJCQkJLy8gcmVwYXJzaW5nLgotCQkJCQlyZXN1bHQgPSBuZXcgTm9DaGFuZ2VFdmVudChmU3RydWN0dXJlZERvY3VtZW50LCBmUmVxdWVzdGVyLCBmQ2hhbmdlcywgZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+IC0xKSAmJiAoZW5kT2ZEaWZmZXJlbmNlc09sZCA8IDApICYmIChlbmRPZkRpZmZlcmVuY2VzTmV3IDwgMCkpIHsKLQkJCQkvLyBXZSBmb3VuZCBhIG5vcm1hbCBzdGFydE9mRGlmZmVybmNlcywgYnV0IGhhdmUgbm90IHlldCBmb3VuZAotCQkJCS8vIHRoZSBlbmRzLgotCQkJCS8vIFdlJ2xsIGxvb2sgZm9yIHRoZSBlbmQgb2YgZGlmZmVyZW5jZXMgYnkgZ29pbmcgYmFja3dhcmRzCi0JCQkJLy8gZG93biB0aGUgdHdvIGxpc3RzLgotCQkJCS8vIEhlcmUgd2UgbmVlZCBhIHNlcGVyYXRlIGluZGV4IGZvciBlYWNoIGFycmF5LCBzaW5jZSB0aGV5Ci0JCQkJLy8gbWF5Ci0JCQkJLy8gYmUgKGFuZAotCQkJCS8vIHByb2JhYmx5IGFyZSkgb2YgZGlmZmVyZW50IGxlbmd0aHMuCi0JCQkJaW50IGluZGV4T2xkID0gb2xkUmVnaW9uc0FycmF5Lmxlbmd0aCAtIDE7Ci0JCQkJaW50IGluZGV4TmV3ID0gbmV3UmVnaW9uc0FycmF5Lmxlbmd0aCAtIDE7Ci0JCQkJd2hpbGUgKChpbmRleE9sZCA+PSBzdGFydE9mRGlmZmVyZW5jZXMpICYmIChfZ3JlYXRlclRoYW5FZmZlY3RlZFJlZ2lvbihvbGROb2RlLCBvbGRSZWdpb25zQXJyYXlbaW5kZXhPbGRdKSkpIHsKLQkJCQkJaWYgKCghKG9sZE5vZGUuc2FtZUFzKG9sZFJlZ2lvbnNBcnJheVtpbmRleE9sZF0sIG5ld05vZGUsIG5ld1JlZ2lvbnNBcnJheVtpbmRleE5ld10sIGZMZW5ndGhEaWZmZXJlbmNlKSkpKSB7Ci0JCQkJCQkvL2VuZE9mRGlmZmVyZW5jZXNPbGQgPSBpbmRleE9uZTsKLQkJCQkJCS8vZW5kT2ZEaWZmZXJlbmNlc05ldyA9IGluZGV4VHdvOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaW5kZXhPbGQtLTsKLQkJCQkJaW5kZXhOZXctLTsKLQkJCQl9Ci0JCQkJZW5kT2ZEaWZmZXJlbmNlc09sZCA9IGluZGV4T2xkOwotCQkJCWVuZE9mRGlmZmVyZW5jZXNOZXcgPSBpbmRleE5ldzsKLQkJCX0KLQkJfQotCQkvLwotCQkvLyByZXN1bHQgIT0gbnVsbCBtZWFucyB0aGUgaW1wb3NzaWJsZSBjYXNlIGFib3ZlIG9jY3VycmVkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJLy8gTm93IGZvcm0gdGhlIHR3byB2ZWN0b3JzIG9mIGRpZmZlcmVudCByZWdpb25zCi0JCQlJVGV4dFJlZ2lvbkxpc3QgaG9sZE9sZFJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgaG9sZE5ld1JlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7Ci0JCQlpZiAoc3RhcnRPZkRpZmZlcmVuY2VzID4gLTEgJiYgZW5kT2ZEaWZmZXJlbmNlc09sZCA+IC0xKSB7Ci0JCQkJZm9yIChpbnQgaSA9IHN0YXJ0T2ZEaWZmZXJlbmNlczsgaSA8PSBlbmRPZkRpZmZlcmVuY2VzT2xkOyBpKyspIHsKLQkJCQkJaG9sZE9sZFJlZ2lvbnMuYWRkKG9sZFJlZ2lvbnNBcnJheVtpXSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+IC0xICYmIGVuZE9mRGlmZmVyZW5jZXNOZXcgPiAtMSkgewotCQkJCWZvciAoaW50IGkgPSBzdGFydE9mRGlmZmVyZW5jZXM7IGkgPD0gZW5kT2ZEaWZmZXJlbmNlc05ldzsgaSsrKSB7Ci0JCQkJCWhvbGROZXdSZWdpb25zLmFkZChuZXdSZWdpb25zQXJyYXlbaV0pOwotCQkJCX0KLQkJCX0KLQkJCWlmIChob2xkT2xkUmVnaW9ucy5zaXplKCkgPT0gMCAmJiBob2xkTmV3UmVnaW9ucy5zaXplKCkgPT0gMCkgewotCQkJCS8vIHRoZW4gdGhpcyBtZWFucyB0aGUgcmVnaW9ucyB3ZXJlIGlkZW50aWNhbCwgd2hpY2ggbWVhbnMKLQkJCQkvLyBzb21lb25lCi0JCQkJLy8gcGFzdGVkIGV4YWN0bHkgdGhlIHNhbWUgdGhpbmcgdGhleSBoYWQgc2VsZWN0ZWQsIG9yICEhIQotCQkJCS8vIHNvbWVvbmUgZGVsZXRlZCB0aGUgZW5kIGJyYWNrZXQgb2YgdGhlIHRhZy4gISEhPwotCQkJCXJlc3VsdCA9IG5ldyBOb0NoYW5nZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZSZXF1ZXN0ZXIsIGZDaGFuZ2VzLCBmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQkJfSBlbHNlIHsKLQkJCQkvL0lmIGJvdGggaG9sZE9sZFJlZ2lvbnMgYW5kIGhvbGROZXdSZWdpb25zIGFyZSBvZiBsZW5ndGggMSwKLQkJCQkvLyB0aGVuIGl0cwotCQkJCS8vIGEgInJlZ2lvbiBjaGFuZ2VkIiBldmVudCwgZWxzZSBhICJyZWdpb25zIHJlcGxhY2VkIiBldmVudC4KLQkJCQkvLyBzbyB3ZSB3YW50IHRoZSBuZXcgaW5zdGFuY2Ugb2YgcmVnaW9uIHRvIGJlY29tZSBwYXJ0IG9mIHRoZQotCQkJCS8vIG9sZCBpbnN0YW5jZSBvZiBvbGQgbm9kZQotCQkJCWlmICgoaG9sZE9sZFJlZ2lvbnMuc2l6ZSgpID09IDEpICYmIChob2xkTmV3UmVnaW9ucy5zaXplKCkgPT0gMSkgJiYgX3JlZ2lvbnNTYW1lS2luZCgoaG9sZE5ld1JlZ2lvbnMuZ2V0KDApKSwgKGhvbGRPbGRSZWdpb25zLmdldCgwKSkpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIG5ld09sZFJlZ2lvbiA9IHN3YXBOZXdGb3JPbGRSZWdpb24ob2xkTm9kZSwgaG9sZE9sZFJlZ2lvbnMuZ2V0KDApLCBuZXdOb2RlLCBob2xkTmV3UmVnaW9ucy5nZXQoMCkpOwotCQkJCQkvLyAtLSBuZWVkIHRvIHVwZGF0ZSBhbnkgZG93biBzdHJlYW0gcmVnaW9ucywgd2l0aGluIHRoaXMKLQkJCQkJLy8gJ29sZE5vZGUnCi0JCQkJCXVwZGF0ZURvd25TdHJlYW1SZWdpb25zKG9sZE5vZGUsIG5ld09sZFJlZ2lvbik7Ci0JCQkJCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudCwgZlJlcXVlc3Rlciwgb2xkTm9kZSwgbmV3T2xkUmVnaW9uLCBmQ2hhbmdlcywgZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXBsYWNlUmVnaW9ucyhvbGROb2RlLCBob2xkT2xkUmVnaW9ucywgbmV3Tm9kZSwgaG9sZE5ld1JlZ2lvbnMpOwotCQkJCQkvLyAtLSBuZWVkIHRvIHVwZGF0ZSBhbnkgZG93biBzdHJlYW0gcmVnaW9ucywgd2l0aGluIHRoaXMKLQkJCQkJLy8gJ29sZE5vZGUnCi0JCQkJCS8vIGRvbid0IG5lZWQgd2l0aCB0aGUgd2F5IHJlcGxhY2VSZWdpb25zIGlzIGltcGxlbWVudGVkLgotCQkJCQkvLyBJdCBoYW5kbGVzLgotCQkJCQkvL2lmKGhvbGROZXdSZWdpb25zLnNpemUoKSA+IDApCi0JCQkJCS8vdXBkYXRlRG93blN0cmVhbVJlZ2lvbnMob2xkTm9kZSwgKElUZXh0UmVnaW9uKQotCQkJCQkvLyBob2xkTmV3UmVnaW9ucy5sYXN0RWxlbWVudCgpKTsKLQkJCQkJcmVzdWx0ID0gbmV3IFJlZ2lvbnNSZXBsYWNlZEV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZSZXF1ZXN0ZXIsIG9sZE5vZGUsIGhvbGRPbGRSZWdpb25zLCBob2xkTmV3UmVnaW9ucywgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQW4gZW50cnkgcG9pbnQgZm9yIHJlcGFyc2luZy4gSXQgY2FsY3VsYXRlcyB0aGUgZGlydHkgc3RhcnQgYW5kIGRpcnR5Ci0JICogZW5kIGZsYXRub2RlcyBiYXNlZCBvbiB0aGUgc3RhcnQgcG9pbnQgYW5kIGxlbmd0aCBvZiB0aGUgY2hhbmdlcy4KLQkgKiAgCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGFyc2UoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIHdlIGRvIG5vdCBoYXZlIGEgY2FjaGVkTm9kZSwgdGhlbiB0aGUgZG9jdW1lbnQKLQkJLy8gbXVzdCBiZSBlbXB0eSwgc28gc2ltcGx5IHVzZSAnbnVsbCcgYXMgdGhlIGRpcnR5U3RhcnQgYW5kIGRpcnR5RW5kCi0JCS8vIG90aGVyd2lzZSwgZmluZCB0aGVtLgotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCWZpbmREaXJ0eVN0YXJ0KGZTdGFydCk7Ci0JCQlpbnQgZW5kID0gZlN0YXJ0ICsgZkxlbmd0aFRvUmVwbGFjZTsKLQkJCWZpbmREaXJ0eUVuZChlbmQpOwotCQl9Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50LmdldENhY2hlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2hlY2tIZXVyaXN0aWNzKCk7Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSByZXBhcnNlKGRpcnR5U3RhcnQsIGRpcnR5RW5kKTsKLQkJfQotCQllbmRSZVBhcnNlKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQW4gZW50cnkgcG9pbnQgZm9yIHJlcGFyc2luZy4gSXQgY2FsY3VsYXRlcyB0aGUgZGlydHkgc3RhcnQgYW5kIGRpcnR5Ci0JICogZW5kIGZsYXRub2RlcyBiYXNlZCBvbiBzdWdnZXN0ZWQgcG9zaXRpb25zIHRvIGJlZ2luIGFuZCBlbmQuIFRoaXMgaXMKLQkgKiBuZWVkZWQgZm9yIGNhc2VzIHdoZXJlIHBhcnNpbmcgbXVzdCBnbyBiZXlvbmQgdGhlIGltbWVkaWF0ZSBub2RlIGFuZAotCSAqIGl0cyBkaXJlY3QgbmVpZ2hib3JzLgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwYXJzZShpbnQgcmVTY2FuU3RhcnRIaW50LCBpbnQgcmVTY2FuRW5kSGludCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB3ZSBkbyBub3QgaGF2ZSBhIGNhY2hlZE5vZGUsIHRoZW4gdGhlIGRvY3VtZW50Ci0JCS8vIG11c3QgYmUgZW1wdHksIHNvIHNpbXBseSB1c2UgJ251bGwnIGFzIHRoZSBkaXJ0eVN0YXJ0IGFuZCBkaXJ0eUVuZAotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCWZpbmREaXJ0eVN0YXJ0KHJlU2NhblN0YXJ0SGludCk7Ci0JCQlmaW5kRGlydHlFbmQocmVTY2FuRW5kSGludCk7Ci0JCX0KLQkJcmVzdWx0ID0gcmVwYXJzZShkaXJ0eVN0YXJ0LCBkaXJ0eUVuZCk7Ci0JCWlzUGFyc2luZyA9IGZhbHNlOwotCQkvLyBkZWJ1ZwotCQkvL3ZlcmlmeVN0cnVjdHVyZWQocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29yZSByZXBhcnNpbmcgbWV0aG9kIC4uLiBhZnRlciB0aGUgZGlydHkgc3RhcnQgYW5kIGRpcnR5IGVuZCBoYXZlCi0JICogYmVlbiBjYWxjdWxhdGVkIGVsc2V3aGVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwYXJzZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IHJlc2NhblN0YXJ0ID0gLTE7Ci0JCWludCByZXNjYW5FbmQgPSAtMTsKLQkJYm9vbGVhbiBmaXJzdFRpbWUgPSBmYWxzZTsKLQkJLy8KLQkJLy8gInNhdmUiIHRoZSBvbGROb2RlcyAodGhhdCBtYXkgYmUgcmVwbGFjZWQpIGluIGEgbGlzdAotCQlDb3JlTm9kZUxpc3Qgb2xkTm9kZXMgPSBmb3JtT2xkTm9kZXMoZGlydHlTdGFydCwgZGlydHlFbmQpOwotCQlpZiAoZGlydHlTdGFydCA9PSBudWxsIHx8IGRpcnR5RW5kID09IG51bGwpIHsKLQkJCS8vIGRpcnR5U3RhcnQgb3IgZGlydHkgZW5kIGFyZSBudWxsLCB0aGVuIHRoYXQgbWVhbnMgd2UgZGlkbid0Ci0JCQkvLyBoYXZlCi0JCQkvLyBhCi0JCQkvLyBjYWNoZWQgbm9kZSwgd2hpY2ggbWVhbnMgd2UgaGF2ZSBhbiBlbXB0eSBkb2N1bWVudCwgc28gd2UKLQkJCS8vIGp1c3QgbmVlZCB0byByZXNjYW4gdGhlIGNoYW5nZXMKLQkJCXJlc2NhblN0YXJ0ID0gMDsKLQkJCXJlc2NhbkVuZCA9IGZDaGFuZ2VzLmxlbmd0aCgpOwotCQkJZmlyc3RUaW1lID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCS8vIHNldCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gcmVzY2FuCi0JCQlyZXNjYW5TdGFydCA9IGRpcnR5U3RhcnQuZ2V0U3RhcnQoKTsKLQkJCS8vCi0JCQkvLyBzZXQgdGhlIGVuZCBvZiB0aGUgdGV4dCB0byByZXNjYW4KLQkJCS8vIG5vdGljZSB3ZSB1c2UgdGhlIHNhbWUgcmF0aW9uYWxlIGFzIGZvciB0aGUgcmVzY2FuU3RhcnQsCi0JCQkvLyB3aXRoIHRoZSBhZGRlZCBjYXZlYXQgdGhhdCBsZW5ndGggaGFzIHRvIGJlIGFkZGVkIHRvIGl0LAotCQkJLy8gdG8gY29tcGVuc2F0ZSBmb3IgdGhlIG5ldyB0ZXh0IHdoaWNoIGhhcyBiZWVuIGFkZGVkIG9yIGRlbGV0ZWQuCi0JCQkvLyBJZiBjaGFuZ2VzIGhhcyB6ZXJvIGxlbmd0aCwgdGhlbiAibGVuZ3RoIiB3aWxsIGJlIG5lZ2F0aXZlLAotCQkJLy8gc2luY2UKLQkJCS8vIHdlIGFyZSBkZWxldGluZyB0ZXh0LiBPdGhlcndpc2UsIHVzZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi0JCQkvLyB3aGF0J3Mgc2VsZWN0ZWQgdG8gYmUgcmVwbGFjZWQgYW5kIHRoZSBsZW5ndGggb2YgdGhlIG5ldyB0ZXh0LgotCQkJcmVzY2FuRW5kID0gZGlydHlFbmQuZ2V0RW5kKCkgKyBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJfQotCQkvLyBub3cgdGhhdCB3ZSBoYXZlIHRoZSBvbGQgc3R1ZmYgInNhdmVkIiBhd2F5LCB1cGRhdGUgdGhlIGRvY3VtZW50Ci0JCS8vIHdpdGggdGhlIGNoYW5nZXMuCi0JCS8vIEZVVFVSRV9UT19ETyAtLSBkb24ndCBmaXJlICJkb2N1bWVudCBjaGFuZ2VkIiBldmVudCB0aWxsIGxhdGVyCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQudXBkYXRlRG9jdW1lbnREYXRhKGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSwgZkNoYW5nZXMpOwotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0gbm93IHRoZSByZWFsIHdvcmsKLQkJcmVzdWx0ID0gY29yZV9yZXBhcnNlKHJlc2NhblN0YXJ0LCByZXNjYW5FbmQsIG9sZE5vZGVzLCBmaXJzdFRpbWUpOwotCQkvLwotCQkvLyBldmVudCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLCBpbmNhc2UgdGhlcmUgaXMKLQkJLy8gc29tZSBvcGl0bWl6YXRpb24gdGhleSBjYW4gZG8KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUsIElUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05vZGUsIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zKSB7Ci0JCWludCBpbnNlcnRQb3MgPSAtMTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBvbGROb2RlLmdldFJlZ2lvbnMoKTsKLQkJLy8gbWFrZSBhIGZha2UgZmxhdG5vZGUgdG8gYmUgbmV3IHBhcmVudCBvZiBvbGRSZWdpb25zLCBzbyB0aGVpciB0ZXh0Ci0JCS8vIHdpbGwgYmUgcmlnaHQuCi0JCS8vSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBob2xkT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3Ci0JCS8vIEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZE5vZGUpOwotCQkvLwotCQkvLyBuZWVkIHRvIHJlc2V0IHRoZSBwYXJlbnQgb2YgdGhlIG5ldyB0by1iZS1pbnNlcnRlZCByZWdpb25zIHRvIGJlCi0JCS8vIHRoZQotCQkvLyBzYW1lIG9sZE5vZGUgdGhhdCBpcyB0aGUgb25lIGhhdmluZyBpdHMgcmVnaW9ucyBjaGFuZ2VkCi0JCS8vIERXLCA0LzE2LzIwMDMsIHJlbW92ZWQgc2luY2UgSVRleHRSZWdpb24gbm8gbG9uZ2VyIGhhcyBwYXJlbnQuCi0JCS8vIAkJSVRleHRSZWdpb25Db250YWluZXIgb2xkUGFyZW50ID0gb2xkTm9kZTsKLQkJLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3UmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkvLwkJCUFic3RyYWN0UmVnaW9uIHJlZ2lvbiA9IChBYnN0cmFjdFJlZ2lvbikgbmV3UmVnaW9ucy5lbGVtZW50QXQoaSk7Ci0JCS8vCQkJcmVnaW9uLnNldFBhcmVudChvbGRQYXJlbnQpOwotCQkvLwkJfQotCQkvLyBpZiB0aGVyZSBhcmUgbm8gb2xkIHJlZ2lvbnMsIGluc2VydCB0aGUgbmV3IHJlZ2lvbnMgYWNjb3JkaW5nIHRvCi0JCS8vIG9mZnNldAotCQlpZiAob2xkUmVnaW9ucy5zaXplKCkgPT0gMCkgewotCQkJSVRleHRSZWdpb24gZmlyc3ROZXdSZWdpb24gPSBuZXdSZWdpb25zLmdldCgwKTsKLQkJCWludCBmaXJzdE9mZnNldCA9IG5ld05vZGUuZ2V0U3RhcnRPZmZzZXQoZmlyc3ROZXdSZWdpb24pOwotCQkJLy8gaWYgYXQgYmVnaW5uaW5nLCBpbnNlcnQgdGhlcmUKLQkJCWlmIChmaXJzdE9mZnNldCA9PSAwKSB7Ci0JCQkJaW5zZXJ0UG9zID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8KLQkJCQlJVGV4dFJlZ2lvbiByZWdpb25BdE9mZnNldCA9IG9sZE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZmlyc3RPZmZzZXQpOwotCQkJCWlmIChyZWdpb25BdE9mZnNldCA9PSBudWxsKQotCQkJCQlpbnNlcnRQb3MgPSByZWdpb25zLnNpemUoKTsKLQkJCQllbHNlCi0JCQkJCWluc2VydFBvcyA9IHJlZ2lvbnMuaW5kZXhPZihyZWdpb25BdE9mZnNldCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBlbHNlLCBkZWxldGUgb2xkIG9uZXMgYmVmb3JlIGluc2VydGluZyBuZXcgb25lcyBpbiB0aGVpciBwbGFjZQotCQkJSVRleHRSZWdpb24gZmlyc3RPbGRSZWdpb24gPSBvbGRSZWdpb25zLmdldCgwKTsKLQkJCWluc2VydFBvcyA9IHJlZ2lvbnMuaW5kZXhPZihmaXJzdE9sZFJlZ2lvbik7Ci0JCQlyZWdpb25zLnJlbW92ZUFsbChvbGRSZWdpb25zKTsKLQkJfQotCQlyZWdpb25zLmFkZEFsbChpbnNlcnRQb3MsIG5ld1JlZ2lvbnMpOwotCQkvLyBub3cgcmVnaW9ucyB2ZWN0b3Igb2YgZWFjaCBub2RlIHNob3VsZCBiZSBvZiBlcXVhbCBsZW5ndGgsCi0JCS8vIHNvIGdvIHRocm91Z2ggZWFjaCwgYW5kIG1ha2Ugc3VyZSB0aGUgb2xkIHJlZ2lvbnMKLQkJLy8gb2Zmc2V0cyBtYXRjaGVzIHRoZSBuZXcgcmVnaW9ucyBvZmZzZXRzCi0JCS8vICh3ZSdsbCBqdXN0IGFzc2lnbiB0aGVtIGFsbCwgYnV0IGNvdWxkIGJlIHNsaWdodGx5IG1vcmUgZWZmaWVjaWVudCkKLQkJSVRleHRSZWdpb25MaXN0IGFsbE5ld1JlZ2lvbnMgPSBuZXdOb2RlLmdldFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiBuZXh0T2xkaXNoUmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlJVGV4dFJlZ2lvbiBuZXh0TmV3UmVnaW9uID0gYWxsTmV3UmVnaW9ucy5nZXQoaSk7Ci0JCQluZXh0T2xkaXNoUmVnaW9uLmVxdWF0ZVBvc2l0aW9ucyhuZXh0TmV3UmVnaW9uKTsKLQkJCWNoZWNrQW5kQXNzaWduUGFyZW50KG9sZE5vZGUsIG5leHRPbGRpc2hSZWdpb24pOwotCQl9Ci0JCW9sZE5vZGUuc2V0TGVuZ3RoKG5ld05vZGUuZ2V0TGVuZ3RoKCkpOwotCQlvbGROb2RlLnNldEVuZGVkKG5ld05vZGUuaXNFbmRlZCgpKTsKLQkJb2xkTm9kZS5zZXRQYXJlbnREb2N1bWVudChuZXdOb2RlLmdldFBhcmVudERvY3VtZW50KCkpOwotCQkvLyByZW1vdmVkIGNvbmNlcHQgb2YgcGFydCBvZiB0aGVzZSByZWdpb25zLCBzbyBubyBsb25nZXIgbmVlZCB0byBkby4KLQkJLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkUmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkvLwkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgb2xkUmVnaW9ucy5lbGVtZW50QXQoaSk7Ci0JCS8vCQkJcmVnaW9uLnNldFBhcmVudChob2xkT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJLy8JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVTZXRDYWNoZWROb2RlKENvcmVOb2RlTGlzdCBvbGROb2RlcywgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCS8vIHVzZSB0aGUgbGFzdCBuZXdOb2RlIGFzIHRoZSBuZXcgY2FjaGVkTm9kZSBwb3N0aW9uLCB1bmxlc3MgaXRzIG51bGwKLQkJLy8gKGUuZy4gd2hlbiBub2RlcyBhcmUgZGVsZXRlZCkgaW4gd2hpY2ggY2FzZSwgYXNzaWduCi0JCS8vIGl0IHRvIGEgInNhZmUiIG5vZGUgc28gd2UgZG9uJ3QgbG9zZSByZWZlcmVuY2UgdG8gdGhlCi0JCS8vIHN0cnVjdHVyZWREb2N1bWVudCEKLQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJLy8gdXNlIGxhc3QgbmV3IG5vZGUgYXMgdGhlIGNhY2hlCi0JCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKG5ld05vZGVzLml0ZW0obmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgLSAxKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpZiBjYWNoZWROb2RlIGlzIGFuIG9sZCBub2RlLCB0aGVuIHdlJ3JlIGluIHRyb3VibGU6Ci0JCQkvLyB3ZSBjYW4ndCBsZWF2ZSBpdCBhcyB0aGUgY2FjaGVkIG5vZGUhIGFuZCBpdHMgYWxyZWFkeQotCQkJLy8gYmVlbiBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgbW9kZWwsIHNvIHdlIGNhbid0IGRvIGdldE5leHQKLQkJCS8vIG9yIGdldFByZXZpb3VzLCBzbyB3ZSdsbCBnZXQgb25lIHRoYXQgaXMgcmlnaHQgYmVmb3JlCi0JCQkvLyAob3IgcmlnaHQgYWZ0ZXIpIHRoZSBvZmZzZXQgb2YgdGhlIG9sZCBub2RlcyB0aGF0IGFyZSBiZWluZwotCQkJLy8gZGVsZXRlZC4KLQkJCS8vIAotCQkJLy8gaWYgbmV3Tm9kZXNIZWFkIGFuZCBjYWNoZWROb2RlIGFyZSBib3RoIG51bGwsIHRoZW4KLQkJCS8vIGl0IG1lYW5zIHdlIHdlcmUgYXNrZWQgdG8gaW5zZXJ0IGFuIGVtcHR5IHN0cmluZyBpbnRvCi0JCQkvLyBhbiBlbXB0eSBkb2N1bWVudC4gU28gd2UgaGF2ZSBub3RoaW5nIHRvIGRvIGhlcmUKLQkJCS8vICh0aGF0IGlzLCB3ZSBoYXZlIG5vIG5vZGUgdG8gY2FjaGUpCi0JCQkvLyBzaW1pbGFybHkgaWYgdGhlcmUgYXJlIG5vIG5ldyBub2RlcyBhbmQgbm8gb2xkIG5vZGVzIHRoZW4KLQkJCS8vIG5vdGhpbmcgdG8gZG8gKGJ1dCB0aGF0IHNob3VsZCBuZXZlciBoYXBwZW4gLi4uIHdlIHNob3VsZG4ndAotCQkJLy8gZ2V0IHRoZXJlIGlmIHRoZXJlIGlzIG5vIGV2ZW50IHRvIGdlbmVyYXRlKS4KLQkJCWlmICgoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpICYmIChvbGROb2Rlcy5nZXRMZW5ndGgoKSA+IDApKSB7Ci0JCQkJLy8gbm90ZTogd2UgY2FuJ3Qgc2ltcGxlIHVzZSBub2RlQXRDaGFyYWN0ZXJPZmZzZXQsIHNpbmNlIGl0Ci0JCQkJLy8gZGVwZW5kcyBvbiBjYWNoZWROb2RlLgotCQkJCWlmIChvbGROb2Rlcy5pbmNsdWRlcyhmU3RydWN0dXJlZERvY3VtZW50LmdldENhY2hlZERvY3VtZW50UmVnaW9uKCkpKQotCQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCQl9Ci0JCQlpZiAoKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSAmJiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSkgewotCQkJCS8vIHRoaXMgd2lsbCBoYXBwZW4gbm93IGxlZ2l0YW1hdGVseSB3aGVuIGFsbCB0ZXh0IGlzIGRlbGV0ZWQKLQkJCQkvLyBmcm9tIGEgZG9jdW1lbnQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6IFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOjpyZVNldENhY2hlZE5vZGU6IGNvdWxkIG5vdCBmaW5kIGEgbm9kZSB0byBjYWNoZSEgKGl0cyBvayBpZiBhbGwgdGV4dCBkZWxldGVkKSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJLy8gTk9URTogdGhpcyBtZXRob2QgKGFuZCBjbGFzcykgZGVwZW5kIG9uIGJlaW5nIGFibGUgdG8KLQkJLy8gZG8gdGhlIGZvbGxvd2luZyBjYXN0IChpLmUuIHJlZmVyZW5jZXMgc29tZSBmaWVsZHMgZGlyZWN0bHkpCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIG5ld1N0cnVjdHVyZWREb2N1bWVudDsKLQkJZkZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3BsaWNlKENvcmVOb2RlTGlzdCBvbGROb2RlcywgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCS8vCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3RPbGQgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0TmV3ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0T2xkID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0TmV3ID0gbnVsbDsKLQkJLy8KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRQcmV2aW91cyA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTmV4dCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3UHJldmlvdXMgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05leHQgPSBudWxsOwotCQkvLwotCQkvLyBpZiBjYWxsZWQgd2l0aCBib3RoIGFyZ3VtZW50cyBlbXB0eSBsaXN0cywgd2UgY2FuIGRpc3JlZ2FyZC4KLQkJLy8gdGhpcyBoYXBwZW5zLCBmb3IgZXhhbXBsZSwgd2hlbiBzb21lIHRleHQgaXMgcmVwbGFjZWQgd2l0aCB0aGUKLQkJLy8gaWRlbnRpY2FsIHRleHQuCi0JCWlmICgob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgJiYgKG5ld05vZGVzLmdldExlbmd0aCgpID09IDApKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvLyBnZXQgcG9pbnRlcnMKLQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJZmlyc3ROZXcgPSBuZXdOb2Rlcy5pdGVtKDApOwotCQkJbGFzdE5ldyA9IG5ld05vZGVzLml0ZW0obmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJfQotCQkvLwotCQlpZiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlmaXJzdE9sZCA9IG9sZE5vZGVzLml0ZW0oMCk7Ci0JCQlsYXN0T2xkID0gb2xkTm9kZXMuaXRlbShvbGROb2Rlcy5nZXRMZW5ndGgoKSAtIDEpOwotCQkJaWYgKGZpcnN0T2xkICE9IG51bGwpCi0JCQkJb2xkUHJldmlvdXMgPSBmaXJzdE9sZC5nZXRQcmV2aW91cygpOwotCQkJaWYgKGxhc3RPbGQgIT0gbnVsbCkKLQkJCQlvbGROZXh0ID0gbGFzdE9sZC5nZXROZXh0KCk7Ci0JCX0KLQkJLy8gaGFuZGxlIHN3aXRjaAotCQlpZiAobmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBzd2l0Y2ggc3Vycm91bmRpbmcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucycgcmVmZXJlbmNlcyB0bwotCQkJLy8gbGlzdHMKLQkJCWlmIChvbGRQcmV2aW91cyAhPSBudWxsKQotCQkJCW9sZFByZXZpb3VzLnNldE5leHQoZmlyc3ROZXcpOwotCQkJaWYgKG5ld1ByZXZpb3VzICE9IG51bGwpCi0JCQkJbmV3UHJldmlvdXMuc2V0TmV4dChmaXJzdE9sZCk7Ci0JCQlpZiAob2xkTmV4dCAhPSBudWxsKQotCQkJCW9sZE5leHQuc2V0UHJldmlvdXMobGFzdE5ldyk7Ci0JCQlpZiAobmV3TmV4dCAhPSBudWxsKQotCQkJCW5ld05leHQuc2V0UHJldmlvdXMobGFzdE9sZCk7Ci0JCQkvLyBzd2l0Y2ggbGlzdCBwb2ludGVycyB0byBzdXJyb3VuZGluZyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JCQlpZiAoZmlyc3RPbGQgIT0gbnVsbCkKLQkJCQlmaXJzdE9sZC5zZXRQcmV2aW91cyhuZXdQcmV2aW91cyk7Ci0JCQlpZiAobGFzdE9sZCAhPSBudWxsKQotCQkJCWxhc3RPbGQuc2V0TmV4dChuZXdOZXh0KTsKLQkJCWlmIChmaXJzdE5ldyAhPSBudWxsKQotCQkJCWZpcnN0TmV3LnNldFByZXZpb3VzKG9sZFByZXZpb3VzKTsKLQkJCWlmIChsYXN0TmV3ICE9IG51bGwpCi0JCQkJbGFzdE5ldy5zZXROZXh0KG9sZE5leHQpOwotCQl9IGVsc2UgewotCQkJLy8gc2hvcnQgY2lyY3VpdCB3aGVuIHRoZXJlIGFyZSBubyBuZXcgbm9kZXMKLQkJCWlmIChvbGRQcmV2aW91cyAhPSBudWxsKQotCQkJCW9sZFByZXZpb3VzLnNldE5leHQob2xkTmV4dCk7Ci0JCQlpZiAob2xkTmV4dCAhPSBudWxsKQotCQkJCW9sZE5leHQuc2V0UHJldmlvdXMob2xkUHJldmlvdXMpOwotCQl9Ci0JCS8vCi0JCS8vIFNJREUgRUZGRUNUcwotCQkvLyBpZiB3ZSBoYXZlIG9sZE5vZGVzLCBhbmQgaWYgb2xkTmV4dCBvciBvbGRQcmV2aW91cyBpcyBudWxsLAotCQkvLyB0aGF0IG1lYW5zIHdlIGFyZSByZXBsYWNpbmcKLQkJLy8gdGhlIGxhc3ROb2RlIG9yIGZpcnN0Tm9kZSB0aGUgc3RydWN0dXJlZERvY3VtZW50cydzIGNoYWluIG9mIG5vZGVzLAotCQkvLyBzbyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc3RydWN0dXJlZERvY3VtZW50cyBsYXN0IG9yIGZpcnN0IE5vZGUKLQkJLy8gYXMgdGhlIGxhc3Qgb3IgZmlyc3Qgb2YgdGhlIG5ldyBub2Rlcy4KLQkJLy8gKGFuZCBzb21ldGltZXMgZXZlbiB0aGVzZSB3aWxsIGJlIG51bGwhIHN1Y2ggYXMgd2hlbiBkZWxldGluZyBhbGwKLQkJLy8gdGV4dCBpbiBhIGRvY3VtZW50KS4KLQkJaWYgKChvbGROZXh0ID09IG51bGwpICYmIChvbGROb2Rlcy5nZXRMZW5ndGgoKSA+IDApKSB7Ci0JCQlpZiAobmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRMYXN0RG9jdW1lbnRSZWdpb24obGFzdE5ldyk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGluIHRoaXMgY2FzZSwgdGhlIGxhc3Qgbm9kZSBpcyBiZWluZyBkZWxldGVkLCBidXQgbm90Ci0JCQkJLy8gcmVwbGFjZWQKLQkJCQkvLyB3aXRoIGFueXRoaW5nLiBJbiB0aGlzIGNhc2UsIHdlIGNhbiBqdXN0IGJhY2sgdXAgb25lCi0JCQkJLy8gZnJvbSB0aGUgZmlyc3Qgb2xkIG5vZGUKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldExhc3REb2N1bWVudFJlZ2lvbihmaXJzdE9sZC5nZXRQcmV2aW91cygpKTsKLQkJCX0KLQkJfQotCQlpZiAoKG9sZFByZXZpb3VzID09IG51bGwpICYmIChvbGROb2Rlcy5nZXRMZW5ndGgoKSA+IDApKSB7Ci0JCQlpZiAobmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRGaXJzdERvY3VtZW50UmVnaW9uKGZpcnN0TmV3KTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gaW4gdGhpcyBjYXNlIHRoZSBmaXJzdCBub2RlIGlzIGJlaW5nIGRlbGV0ZWQsIGJ1dCBub3QKLQkJCQkvLyByZXBsYWNlZAotCQkJCS8vIHdpdGggYW55dGhpbmcuIFNvLCB3ZSBqdXN0IGdvIG9uZSBmb3J3YXJkIHBhc3QgdGhlIGxhc3Qgb2xkCi0JCQkJLy8gbm9kZS4KLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldEZpcnN0RG9jdW1lbnRSZWdpb24obGFzdE9sZC5nZXROZXh0KCkpOwotCQkJfQotCQl9Ci0JCS8vIGFzIGEgdGlueSBvcHRpbWl6YXRpb24sIHdlIHJldHVybiB0aGUgZmlyc3Qgb2YgdGhlIGRvd25zdHJlYW0KLQkJLy8gbm9kZXMsCi0JCS8vIGlmIGFueQotCQlyZXR1cm4gb2xkTmV4dDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byAicmV1c2UiIHRoZSBvbGQgY29udGFpbmVyIHJlZ2lvbiwgd2hlbgotCSAqIGZvdW5kIHRvIGJlIHNhbWUgKHNvIHNhbWUgaW5zdGFuY2UgZG9lc24ndCBjaGFuZ2UpLiBUaGUgZ29hbCBpcyB0bwotCSAqICJ0cmFuc2Zvcm0iIHRoZSBvbGQgcmVnaW9uLCBzbyBpdHMgZXF1aXZlbGVudCB0byB0aGUgbmV3bHkgcGFyc2VkIG9uZS4KLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBzd2FwTmV3Rm9yT2xkUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZSwgSVRleHRSZWdpb24gb2xkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05vZGUsIElUZXh0UmVnaW9uIG5ld1JlZ2lvbikgewotCQkvLyBtYWtlcyB0aGUgb2xkIHJlZ2lvbiBpbnN0YW5jZSB0aGUgY29ycmVjdCBzaXplLgotCQlvbGRSZWdpb24uZXF1YXRlUG9zaXRpb25zKG5ld1JlZ2lvbik7Ci0JCS8vIGFkanVzdHMgb2xkIG5vZGUgaW5zdGFuY2UgYXBwcm9wcmlhdGVseQotCQlvbGROb2RlLnNldExlbmd0aChuZXdOb2RlLmdldExlbmd0aCgpKTsKLQkJb2xkTm9kZS5zZXRFbmRlZChuZXdOb2RlLmlzRW5kZWQoKSk7Ci0JCS8vIHdlIGRvIGhhdmUgdG8gc2V0IHRoZSBwYXJlbnQgZG9jdW1lbnQsIHNpbmNlIHRoZSBvbGROb2RlJ3MKLQkJLy8gd2VyZSBzZXQgdG8gYSB0ZW1wb3Jhcnkgb25lLCB0aGVuIG5ld05vZGUncyBoYXZlIHRoZQotCQkvLyByaWdodCBvbmUuCi0JCW9sZE5vZGUuc2V0UGFyZW50RG9jdW1lbnQobmV3Tm9kZS5nZXRQYXJlbnREb2N1bWVudCgpKTsKLQkJLy8gaWYgd2UncmUgdHJhbnNmb3JtaW5nIGEgY29udGFpbmVyIHJlZ2lvbiwgd2UgbmVlZCB0byBiZSBzdXJlIHRvCi0JCS8vIHRyYW5zZmVyIHRoZSBuZXcgZW1iZWRkZWQgcmVnaW9ucywgdG8gdGhlIG9sZCBwYXJlbnQKLQkJLy8gTm90ZTogaWYgb2xkUmVnaW9uIGhhc0VtYmVkZGVkUmVnaW9ucywgdGhlbiB3ZSBrbm93IHRoZQotCQkvLyBuZXdSZWdpb24gZG9lcyB0b28sIHNpbmNlIHdlIGdvdCBoZXJlIGJlY2F1c2UgdGhleSB3ZXJlIHRoZQotCQkvLyBzYW1lIHR5cGUuCi0JCWlmIChpc0NvbGxlY3Rpb25SZWdpb24ob2xkUmVnaW9uKSkgeyAvLyB8fAotCQkJLy8gaGFzQ29udGFpbmVyUmVnaW9ucyhvbGRSZWdpb24pKQotCQkJLy8gewotCQkJdHJhbnNmZXJFbWJlZGRlZFJlZ2lvbnMob2xkTm9kZSwgKElUZXh0UmVnaW9uQ29udGFpbmVyKSBvbGRSZWdpb24sIChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgbmV3UmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gb2xkUmVnaW9uOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzd2l0Y2hOb2RlTGlzdHMoQ29yZU5vZGVMaXN0IG9sZE5vZGVzLCBDb3JlTm9kZUxpc3QgbmV3Tm9kZXMpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXN1bHQgPSBzcGxpY2Uob2xkTm9kZXMsIG5ld05vZGVzKTsKLQkJLy8gZW5zdXJlIHRoYXQgdGhlIG9sZCBub2RlcyBob2xkIG5vIHJlZmVyZW5jZXMgdG8gdGhlIGV4aXN0aW5nIG1vZGVsCi0JCWlmIChvbGROb2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3RJdGVtID0gb2xkTm9kZXMuaXRlbSgwKTsKLQkJCWZpcnN0SXRlbS5zZXRQcmV2aW91cyhudWxsKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdEl0ZW0gPSBvbGROb2Rlcy5pdGVtKG9sZE5vZGVzLmdldExlbmd0aCgpIC0gMSk7Ci0JCQlsYXN0SXRlbS5zZXROZXh0KG51bGwpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gInJldXNlIiB0aGUgb2xkIGNvbnRhaW5lciByZWdpb24sIHdoZW4KLQkgKiBmb3VuZCB0byBiZSBzYW1lIChzbyBzYW1lIGluc3RhbmNlIGRvZXNuJ3QgY2hhbmdlKS4gVGhlIGdvYWwgaXMgdG8KLQkgKiAidHJhbnNmb3JtIiB0aGUgb2xkIHJlZ2lvbiwgc28gaXRzIGVxdWl2ZWxlbnQgdG8gdGhlIG5ld2x5IHBhcnNlZCBvbmUuCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCB0cmFuc2ZlckVtYmVkZGVkUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUsIElUZXh0UmVnaW9uQ29udGFpbmVyIG9sZFJlZ2lvbiwgSVRleHRSZWdpb25Db250YWluZXIgbmV3UmVnaW9uKSB7Ci0JCS8vIHRoZSBvbGRSZWdpb24gc2hvdWxkIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgcGFyZW50LCBzaW5jZQotCQkvLyB3ZSBnb3QgaGVyZSBiZWNhdXNlIGFsbCdzIGVxdWl2ZWxlbnQgZXhjZXB0IHRoZSByZWdpb24KLQkJLy8gcG9zdGlvbnMgaGF2ZSBjaGFuZ2VkLgotCQkvL29sZFJlZ2lvbi5zZXRQYXJlbnQobmV3UmVnaW9uLmdldFBhcmVudCgpKTsKLQkJLy8gYnV0IHdlIHNob3VsZCBjaGVjayBpZiB0aGVyZSdzICJuZXN0ZWQiIGVtYmVkZGVkIHJlZ2lvbnMsIGFuZCBpZgotCQkvLyBzbywgd2UgY2FuIGp1c3QgbW92ZSB0aGVtIG92ZXIuIHNldHRpbmcgdGhlaXIgcGFyZW50IGFzIHRoaXMgb2xkCi0JCS8vIHJlZ2lvbi4KLQkJSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnNUb1RyYW5zZmVyID0gbmV3UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJb2xkUmVnaW9uLnNldFJlZ2lvbnMobmV3UmVnaW9uc1RvVHJhbnNmZXIpOwotCQlJdGVyYXRvciBuZXdSZWdpb25zSW5PbGRPbmUgPSBuZXdSZWdpb25zVG9UcmFuc2Zlci5pdGVyYXRvcigpOwotCQl3aGlsZSAobmV3UmVnaW9uc0luT2xkT25lLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gbmV3T25lID0gKElUZXh0UmVnaW9uKSBuZXdSZWdpb25zSW5PbGRPbmUubmV4dCgpOwotCQkJaWYgKGlzQ29sbGVjdGlvblJlZ2lvbihuZXdPbmUpKSB7IC8vIHx8Ci0JCQkJLy8gaGFzQ29udGFpbmVyUmVnaW9ucyhuZXdPbmUpKSB7Ci0JCQkJLy8oKElUZXh0UmVnaW9uQ29udGFpbmVyKSBuZXdPbmUpLnNldFBhcmVudChvbGRSZWdpb24pOwotCQkJCW9sZFJlZ2lvbi5zZXRSZWdpb25zKG5ld1JlZ2lvbi5nZXRSZWdpb25zKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZURvd25TdHJlYW1SZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIGxhc3RLbm93blJlZ2lvbikgewotCQkvLyBzbyBhbGwgcmVnaW9ucyBhZnRlciB0aGUgbGFzdCBrbm93biByZWdpb24gKGxhc3Qga25vd24gdG8gYmUgb2spCi0JCS8vIGhhdmUgdG8gaGF2ZSB0aGVpciBzdGFydCBhbmQgZW5kIHZhbHVlcyBhZGp1c3RlZC4KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWludCBsaXN0TGVuZ3RoID0gcmVnaW9ucy5zaXplKCk7Ci0JCWludCBzdGFydEluZGV4ID0gMDsKLQkJLy8gZmlyc3QsIGxvb3AgdGhyb3VnaCB0byBmaW5kIHdoZXJlIHRvIHN0YXJ0Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyZWdpb24gPT0gbGFzdEtub3duUmVnaW9uKSB7Ci0JCQkJc3RhcnRJbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLy8gbm93LCBiZWdpbm5pbmcgb25lIHBhc3QgdGhlIGxhc3Qga25vd24gb25lLCBsb29wCi0JCS8vIHRocm91Z2ggdG8gZW5kIG9mIGxpc3QsIGFkanVzdGluZyB0aGUgc3RhcnQgYW5kIGVuZCBwb3N0aW9ucy4KLQkJc3RhcnRJbmRleCsrOwotCQlmb3IgKGludCBqID0gc3RhcnRJbmRleDsgaiA8IGxpc3RMZW5ndGg7IGorKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaik7Ci0JCQlyZWdpb24uYWRqdXN0U3RhcnQoZkxlbmd0aERpZmZlcmVuY2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5MTE5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotCi0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbiBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKLQotCXByaXZhdGUgaW50IGNvdW50OwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRIZWFkOwotCi0JLyoqCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdIZWFkKSB7Ci0JCXN1cGVyKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY291bnROb2RlID0gaGVhZCA9IG5ld0hlYWQ7Ci0JCXdoaWxlIChjb3VudE5vZGUgIT0gbnVsbCkgewotCQkJY291bnQrKzsKLQkJCWNvdW50Tm9kZSA9IGNvdW50Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKERlYnVnLkRFQlVHID4gNSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJOIE5vZGVzIGluIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uIENvbnRydWN0b3I6ICIgKyBjb3VudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY291bnROb2RlID0gaGVhZCA9IHN0YXJ0OwotCQlpZiAoKHN0YXJ0ID09IG51bGwpIHx8IChlbmQgPT0gbnVsbCkpIHsKLQkJCS8vIGVycm9yIGNvbmRpdGlvbgotCQkJY291bnQgPSAwOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8vSWYgYm90aCBub2RlcyBhcmUgbm9uLW51bGwsIHdlIGFzc3VtZSB0aGVyZSBpcyBhbHdheXMgYXQgbGVhc3Qgb25lCi0JCS8vIGl0ZW0KLQkJY291bnQgPSAxOwotCQl3aGlsZSAoY291bnROb2RlICE9IGVuZCkgewotCQkJY291bnQrKzsKLQkJCWNvdW50Tm9kZSA9IGNvdW50Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnLkRFQlVHID4gNSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJOIE5vZGVzIGluIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uIENvbnRydWN0b3I6ICIgKyBjb3VudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIGhhc01vcmVFbGVtZW50cyBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCQlyZXR1cm4gY291bnQgPiAwOwotCX0KLQotCS8qKgotCSAqIG5leHRFbGVtZW50IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IG5leHRFbGVtZW50KCkgewotCQlpZiAoY291bnQgPiAwKSB7Ci0JCQljb3VudC0tOwotCQkJb2xkSGVhZCA9IGhlYWQ7Ci0JCQloZWFkID0gaGVhZC5nZXROZXh0KCk7Ci0JCQlyZXR1cm4gb2xkSGVhZDsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjFiMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotCi0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYWRqdXN0U3RhcnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSwgaW50IGFkanVzdG1lbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGhlYWROb2RlOwotCQl3aGlsZSAoYU5vZGUgIT0gbnVsbCkgewotCQkJYU5vZGUuYWRqdXN0U3RhcnQoYWRqdXN0bWVudCk7Ci0JCQlhTm9kZSA9IGFOb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gaGVhZE5vZGU7Ci0JfQotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgY291bnRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcykgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaWYgKGZsYXROb2RlcyAhPSBudWxsKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZmxhdE5vZGVzLmdldExlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZsYXROb2Rlcy5pdGVtKGkpOwotCQkJCS8vIGRvbid0IGtub3cgd2h5LCBidXQgd2UncmUgZ2V0dGluZyBudWxsIHBvaW50ZXIgZXhjZXB0aW9ucwotCQkJCS8vIGluIHRoaXMgbWV0aG9kCi0JCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSByZXN1bHQgKyBub2RlLmdldE51bWJlck9mUmVnaW9ucygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIGdldFRleHQoQ29yZU5vZGVMaXN0IGZsYXROb2RlcykgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGZsYXROb2RlcyA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkvL0lTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYU5vZGUgPSBudWxsOwotCQkJaW50IGxlbmd0aCA9IGZsYXROb2Rlcy5nZXRMZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlidWZmLmFwcGVuZChmbGF0Tm9kZXMuaXRlbShpKS5nZXRUZXh0KCkpOwotCQkJfQotCQkJcmVzdWx0ID0gYnVmZi50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBDb3JlTm9kZUxpc3Qgc2V0UGFyZW50RG9jdW1lbnQoQ29yZU5vZGVMaXN0IG5vZGVsaXN0LCBJU3RydWN0dXJlZERvY3VtZW50IHRleHRTdG9yZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGVsaXN0LCAibm9kZWxpc3Qgd2FzIG51bGwgaW4gQ29yZU5vZGVMaXN0OjpzZXRUZXh0U3RvcmUoQ29yZU5vZGVMaXN0LCBTdHJ1Y3R1cmVkVGV4dFN0b3JlKSIpOyAvLyROT04tTkxTLTEkCi0JCWludCBsZW4gPSBub2RlbGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gbm9kZWxpc3QuaXRlbShpKTsKLQkJCS8vQXNzZXJ0LmlzTm90TnVsbChub2RlLCAid2hvJ3MgcHV0dGluZyBudWxsIGluIHRoZSBub2RlIGxpc3Q/IGluCi0JCQkvLyBDb3JlTm9kZUxpc3Q6OnNldFRleHRTdG9yZShDb3JlTm9kZUxpc3QsCi0JCQkvLyBTdHJ1Y3R1cmVkVGV4dFN0b3JlKSIpOyAvLyROT04tTkxTLTEkCi0JCQlub2RlLnNldFBhcmVudERvY3VtZW50KHRleHRTdG9yZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVsaXN0OwotCX0KLQotCS8vCXB1YmxpYyBmaW5hbCBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCS8vIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlLAotCS8vIEJhc2ljU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCS8vCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFOb2RlID0gaGVhZE5vZGU7Ci0JLy8JCXdoaWxlIChhTm9kZSAhPSBudWxsKSB7Ci0JLy8JCQlhTm9kZS5zZXRQYXJlbnREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCS8vCQkJYU5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgYU5vZGUuZ2V0TmV4dCgpOwotCS8vCQl9Ci0JLy8JCXJldHVybiBoZWFkTm9kZTsKLQkvLwl9Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNldFBhcmVudERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGhlYWROb2RlOwotCQl3aGlsZSAoYU5vZGUgIT0gbnVsbCkgewotCQkJYU5vZGUuc2V0UGFyZW50RG9jdW1lbnQoZG9jdW1lbnQpOwotCQkJYU5vZGUgPSBhTm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgVmVjdG9yIHRvVmVjdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGhlYWROb2RlOwotCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLQkJd2hpbGUgKGFOb2RlICE9IG51bGwpIHsKLQkJCXYuYWRkRWxlbWVudChhTm9kZSk7Ci0JCQlhTm9kZSA9IGFOb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gdjsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvcigpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50U2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzMxYWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5TZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFNlcXVlbnRpYWxSZXdyaXRlVGV4dFN0b3JlIGV4dGVuZHMgU2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUgaW1wbGVtZW50cyBDaGFyU2VxdWVuY2UsIElSZWdpb25Db21wYXJpYmxlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50U2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUoSVRleHRTdG9yZSBzb3VyY2UpIHsKLQkJc3VwZXIoc291cmNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjY2hhckF0KGludCkKLQkgKi8KLQlwdWJsaWMgY2hhciBjaGFyQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBnZXQoaW5kZXgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNsZW5ndGgoKQotCSAqLwotCXB1YmxpYyBpbnQgbGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGMKLQkgKiBAcGFyYW0gZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbWF0Y2hlc0lnbm9yZUNhc2UoY2hhciBjMSwgY2hhciBjMikgewotCQkvLyB3ZSBjaGVjayBib3RoIGNhc2UgY29udmVyc2lvbnMgdG8gaGFuZGxlIHRob3NlIGZldyBjYXNlcywKLQkJLy8gaW4gbGFuZ3VhZ2VzIHN1Y2ggYXMgVHVya2lzaCwgd2hpY2ggaGF2ZSBzb21lIGNoYXJhY3RlcnMKLQkJLy8gd2hpY2ggc29ydCBvZiBoYXZlIDMgY2FzZXMuCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYzEpID09IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjMikpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYzEpID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjMikpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXMoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgY29tcGFyZUxlbmd0aCA9IHN0cmluZ1RvQ29tcGFyZS5sZW5ndGgoKTsKLQkJaWYgKGNvbXBhcmVMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoOwotCQkJaWYgKGVuZE9mZnNldCA8PSBsZW5ndGgoKSkgewotCQkJCXJlc3VsdCA9IHJlZ2lvbk1hdGNoZXMob2Zmc2V0LCBzdHJpbmdUb0NvbXBhcmUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIGFsbCBsZW5ndGhzIGhhdmUgYmVlbiBjaGVja2VkIGFuZCBmYWxsIHdpdGhpbnQKLQkgKiBleGNlcHRhYmxlIGxpbWl0cwotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gc3RyaW5nVG9Db21wYXJlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZWdpb25NYXRjaGVzKGludCBvZmZzZXQsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlpbnQgc3RyaW5nT2Zmc2V0ID0gMDsKLQkJaW50IGxlbiA9IHN0cmluZ1RvQ29tcGFyZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoY2hhckF0KGkpICE9IHN0cmluZ1RvQ29tcGFyZS5jaGFyQXQoc3RyaW5nT2Zmc2V0KyspKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWludCBjb21wYXJlTGVuZ3RoID0gc3RyaW5nVG9Db21wYXJlLmxlbmd0aCgpOwotCQlpZiAoY29tcGFyZUxlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCWludCBlbmRPZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7Ci0JCQlpZiAoZW5kT2Zmc2V0IDw9IGxlbmd0aCgpKSB7Ci0JCQkJcmVzdWx0ID0gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2Uob2Zmc2V0LCBzdHJpbmdUb0NvbXBhcmUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoaW50IG9mZnNldCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWludCBzdHJpbmdPZmZzZXQgPSAwOwotCQlpbnQgbGVuID0gc3RyaW5nVG9Db21wYXJlLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICghbWF0Y2hlc0lnbm9yZUNhc2UoY2hhckF0KGkpLCBzdHJpbmdUb0NvbXBhcmUuY2hhckF0KHN0cmluZ09mZnNldCsrKSkpIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNzdWJTZXF1ZW5jZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewotCi0JCXJldHVybiBnZXQoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyNWU3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50VGV4dFN0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIFZpYWNoZXNsYXYgS2FiYW5vdmljaC9FeGFkZWwgOTc4MTcgV3JvbmcgYWxnb3JpdG0gaW4gY2xhc3MgU3RydWN0dXJlZERvY3VtZW50VGV4dFN0b3JlCi0gKiAgICAgCQkJaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk3ODE3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkdhcFRleHRTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmU7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUgaW1wbGVtZW50cyBJVGV4dFN0b3JlLCBDaGFyU2VxdWVuY2UsIElSZWdpb25Db21wYXJpYmxlIHsKLQotCXByaXZhdGUgR2FwVGV4dFN0b3JlIGZJbnRlcm5hbFN0b3JlOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUoKSB7Ci0JCXRoaXMoNTAsIDMwMCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvd1dhdGVybWFyawotCSAqIEBwYXJhbSBoaWdoV2F0ZXJtYXJrCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFRleHRTdG9yZShpbnQgbG93V2F0ZXJtYXJrLCBpbnQgaGlnaFdhdGVybWFyaykgewotCQlzdXBlcigpOwotCQlmSW50ZXJuYWxTdG9yZSA9IG5ldyBHYXBUZXh0U3RvcmUobG93V2F0ZXJtYXJrLCBoaWdoV2F0ZXJtYXJrKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjY2hhckF0KGludCkKLQkgKi8KLQlwdWJsaWMgY2hhciBjaGFyQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBmSW50ZXJuYWxTdG9yZS5nZXQoaW5kZXgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlI2dldChpbnQpCi0JICovCi0JcHVibGljIGNoYXIgZ2V0KGludCBvZmZzZXQpIHsKLQotCQlyZXR1cm4gZkludGVybmFsU3RvcmUuZ2V0KG9mZnNldCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmUjZ2V0KGludCwgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQotCQlyZXR1cm4gZkludGVybmFsU3RvcmUuZ2V0KG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZSNnZXRMZW5ndGgoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCi0JCXJldHVybiBmSW50ZXJuYWxTdG9yZS5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjbGVuZ3RoKCkKLQkgKi8KLQlwdWJsaWMgaW50IGxlbmd0aCgpIHsKLQotCQlyZXR1cm4gZkludGVybmFsU3RvcmUuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG1hdGNoZXNJZ25vcmVDYXNlKGNoYXIgYzEsIGNoYXIgYzIpIHsKLQkJLy8gd2UgY2hlY2sgYm90aCBjYXNlIGNvbnZlcnNpb25zIHRvIGhhbmRsZSB0aG9zZSBmZXcgY2FzZXMsCi0JCS8vIGluIGxhbmd1YWdlcyBzdWNoIGFzIFR1cmtpc2gsIHdoaWNoIGhhdmUgc29tZSBjaGFyYWN0ZXJzCi0JCS8vIHdoaWNoIHNvcnQgb2YgaGF2ZSAzIGNhc2VzLgotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMxKSA9PSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYzIpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMxKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYzIpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWdpb25NYXRjaGVzKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW50IGNvbXBhcmVMZW5ndGggPSBzdHJpbmdUb0NvbXBhcmUubGVuZ3RoKCk7Ci0JCWlmIChjb21wYXJlTGVuZ3RoID09IGxlbmd0aCkgewotCQkJaW50IGVuZE9mZnNldCA9IG9mZnNldCArIGxlbmd0aDsKLQkJCWlmIChlbmRPZmZzZXQgPD0gbGVuZ3RoKCkpIHsKLQkJCQlyZXN1bHQgPSByZWdpb25NYXRjaGVzKG9mZnNldCwgc3RyaW5nVG9Db21wYXJlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYXNzdW1lcyBhbGwgbGVuZ3RocyBoYXZlIGJlZW4gY2hlY2tlZCBhbmQgZmFsbCB3aXRoaW50Ci0JICogZXhjZXB0YWJsZSBsaW1pdHMKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHBhcmFtIHN0cmluZ1RvQ29tcGFyZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhpbnQgb2Zmc2V0LCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJaW50IHN0cmluZ09mZnNldCA9IDA7Ci0JCWludCBlbmQgPSBvZmZzZXQgKyBzdHJpbmdUb0NvbXBhcmUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBlbmQ7IGkrKykgewotCQkJaWYgKGNoYXJBdChpKSAhPSBzdHJpbmdUb0NvbXBhcmUuY2hhckF0KHN0cmluZ09mZnNldCsrKSkgewotCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgY29tcGFyZUxlbmd0aCA9IHN0cmluZ1RvQ29tcGFyZS5sZW5ndGgoKTsKLQkJaWYgKGNvbXBhcmVMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoOwotCQkJaWYgKGVuZE9mZnNldCA8PSBsZW5ndGgoKSkgewotCQkJCXJlc3VsdCA9IHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKG9mZnNldCwgc3RyaW5nVG9Db21wYXJlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKGludCBvZmZzZXQsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlpbnQgc3RyaW5nT2Zmc2V0ID0gMDsKLQkJaW50IGVuZCA9IG9mZnNldCArIHN0cmluZ1RvQ29tcGFyZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGVuZDsgaSsrKSB7Ci0JCQlpZiAoIW1hdGNoZXNJZ25vcmVDYXNlKGNoYXJBdChpKSwgc3RyaW5nVG9Db21wYXJlLmNoYXJBdChzdHJpbmdPZmZzZXQrKykpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZSNyZXBsYWNlKGludCwgaW50LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBsYWNlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0ZXh0KSB7Ci0JCWZJbnRlcm5hbFN0b3JlLnJlcGxhY2Uob2Zmc2V0LCBsZW5ndGgsIHRleHQpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmUjc2V0KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFN0cmluZyB0ZXh0KSB7Ci0JCWZJbnRlcm5hbFN0b3JlLnNldCh0ZXh0KTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNzdWJTZXF1ZW5jZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewotCQkvLyBjb252ZXJ0ICdlbmQnIHRvICdsZW5ndGgnCi0JCXJldHVybiBmSW50ZXJuYWxTdG9yZS5nZXQoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3ViU2V0VGV4dFN0b3JlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3ViU2V0VGV4dFN0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhY2E4YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N1YlNldFRleHRTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLS8qKgotICogVGhpcyBpcyBhIGNvbnZpZW5jZSBvciB1dGlsaXR5IGNsYXNzIHRoYXQgYWxsb3dzIHlvdSB0byBtYWtlIGEgY29weSBvZiBhCi0gKiBwYXJ0IG9mIGEgbGFyZ2VyIHRleHQgc3RvcmUsIGJ1dCBoYXZlIHRoZSBjb3B5IGJlaGF2ZSBhcyBpZiBpdCB3YXMgdGhlCi0gKiBsYXJnZXIgdGV4dCBzdG9yZS4KLSAqIAotICogSW4gb3RoZXIgd29yZHMsIGl0IHByb3ZpZGVzIGEgc3Vic2V0IG9mIGEgbGFyZ2VyIGRvY3VtZW50LCB0aGF0ICJsb29rcyBsaWtlIgotICogdGhlIG9yZ2luYWwgZG9jdW1lbnQuIFRoYXQgaXMsICJsb29rcyBsaWtlIiBpbiB0ZXJtcyBvZiBvZmZzZXRzIGFuZCBsZW5ndGhzLgotICogVmFsaWQgYWNjZXNzIGNhbiBvbmx5IGJlIG1hZGUgdG8gZGF0YSBiZXR3ZWVuIHRoZSBvcmlnbmFsIG9mZnNldHMsIGV2ZW4KLSAqIHRob3VnaCB0aG9zZSBvZmZzZXRzIGFyZSBpbiB0aGUgc2FtZSB1bml0cyBhdCB0aGUgb3JpZ2luYWwsIGFuZCBldmVuIHRob3VnaAotICogdGhlIGxlbmd0aCBhcHBlYXJzIHRvIGJlIGxvbmcuCi0gKiAKLSAqIEZvciBleGFtcGxlLCBpZiBhIHN1YnNldHRleHQgc3RvcmUgaXMgY3JlYXRlZCBmb3IgdGhlIGRlZiBwYXJ0IG9mIGFiY2RlZmdoLAotICogdGhlbiBnZXQoMyw1KSBpcyB2YWxpZCwgZ2V0TGVuZ3RoIGlzIDguIEFueSBvdGhlciBhY2Nlc3MsIHN1Y2ggYXMKLSAqIGdldENoYXIoMiksIHdvdWxkIGJlIGludmFsaWQuCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmU7Ci0KLS8qKgotICogU2ltaWxhciB0byBiYXNpY3Mgb2YgSURvY3VtZW50LCBidXQgdGhlIG9mZnNldHMgYXJlIG1hcHBlZCBmcm9tIGNvb3JkaW5hdGVzCi0gKiBvZiB1bmRlcmx5aW5nIHN0b3JhZ2UgdG8gYSAidmlydHVhbCIgZG9jdW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJTZXRUZXh0U3RvcmUgaW1wbGVtZW50cyBJVGV4dFN0b3JlIHsKLQlwcml2YXRlIGludCBwc2V1ZG9CZWdpbk9mZnNldDsgLy8gbWFwcyB0byAiemVybyIgcG9zdGlvbiBvZiBuZXcgdGV4dAotCS8vcHJpdmF0ZSBpbnQgcHNldWRvRW5kT2Zmc2V0OwotCXByaXZhdGUgaW50IHBzZXVkb0xlbmd0aDsgLy8gbGVuZ3RoIG9mIG9sZC9vcmlnaW5hbCBkb2N1bWVudAotCXByaXZhdGUgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCS8qKgotCSAqIFN1YlNldFRleHRTdG9yZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBpbml0aWFsQ29udGVudAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdWJTZXRUZXh0U3RvcmUoU3RyaW5nIGluaXRpYWxDb250ZW50LCBpbnQgYmVnaW5PZmZzZXQsIGludCBlbmRPZmZzZXQsIGludCBvcmlnaW5hbERvY3VtZW50TGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCXBzZXVkb0JlZ2luT2Zmc2V0ID0gYmVnaW5PZmZzZXQ7Ci0JCS8vcHNldWRvRW5kT2Zmc2V0ID0gZW5kT2Zmc2V0OwotCQkvLyB1c2VkIHRvIGJlIG9yaWdpbmFsRG9jdW1lbnQuZ2V0TGVuZ3RoIC4uLiBub3Qgc3VyZSBpZiB1c2VkLCBvcgotCQkvLyB3aGljaAotCQkvLyBpcyByaWdodAotCQlwc2V1ZG9MZW5ndGggPSBvcmlnaW5hbERvY3VtZW50TGVuZ3RoOwotCQlzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGluaXRpYWxDb250ZW50KTsKLQkJLy9zZXQoaW5pdGlhbENvbnRlbnQpOwotCX0KLQotCS8vIHRoaXMgaXMgb3VyICJwcml2YXRlIiBnZXQsIHdoaWNoIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBzaG91bGQKLQkvLyB1c2UgdG8gZ2V0IHVzaW5nICJyZWFsIiBjb29yZGluYXRlcyBvZiB1bmRlcmx5aW5nIHJlcHJlc2VudGF0aW9uLgotCXByaXZhdGUgU3RyaW5nIF9nZXQoaW50IGJlZ2luLCBpbnQgbGVuZ3RoKSB7Ci0JCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCWludCBzcmNFbmQgPSBiZWdpbiArIGxlbmd0aDsKLQkJc3RyaW5nQnVmZmVyLmdldENoYXJzKGJlZ2luLCBzcmNFbmQsIGNoYXJzLCAwKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoY2hhcnMpOwotCX0KLQotCXB1YmxpYyBjaGFyIGdldChpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBzdHJpbmdCdWZmZXIuY2hhckF0KG9mZnNldCAtIHBzZXVkb0JlZ2luT2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gYmVnaW4KLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBlbmQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0KGludCBiZWdpbiwgaW50IGxlbmd0aCkgewotCQkvLyByZW1hcCB0aGUgYmVnaW4gYW5kIGVuZCB0byAiYXBwZWFyIiB0byBiZSBpbiB0aGUKLQkJLy8gc2FtZSBjb29yZGluYXRlcyBvZiB0aGUgb3JpZ2luYWwgcGFyZW50RG9jdW1lbnQKLQkJcmV0dXJuIF9nZXQoYmVnaW4gLSBwc2V1ZG9CZWdpbk9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gYmVnaW4KLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBlbmQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBjaGFyIGdldENoYXIoaW50IHBvcykgewotCQkvLyByZW1hcCB0aGUgYmVnaW4gYW5kIGVuZCB0byAiYXBwZWFyIiB0byBiZSBpbiB0aGUKLQkJLy8gc2FtZSBjb29yZGluYXRlcyBvZiB0aGUgb3JpZ2luYWwgcGFyZW50RG9jdW1lbnQKLQkJcmV0dXJuIGdldChwb3MgLSBwc2V1ZG9CZWdpbk9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogV2UgcmVkZWZpbmUgZ2V0TGVuZ3RoIHNvIGl0cyBub3QgdGhlIHRydWUgbGVuZ3RoIG9mIHRoaXMgc3ViLXNldAotCSAqIGRvY3VtZW50LCBidXQgdGhlIGxlbmd0aCBvZiB0aGUgb3JpZ2luYWwuIFRoaXMgaXMgbmVlZGVkLCBhcyBhIHNpbXBsZQotCSAqIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHNlZSBpZiB0aGUgcHNldWRvIGVuZCBpcyBlcXVhbCB0aGUgbGFzdAotCSAqIHBvc2l0aW9uIG9mIHRoZSBvcmlnaW5hbCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHBzZXVkb0xlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggYXMgaWYgY29uc2lkZXJlZCBhIHRydWUsIHN0YW5kYWxvbmUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRydWVMZW5ndGgoKSB7Ci0JCXJldHVybiBzdHJpbmdCdWZmZXIubGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVwbGFjZShpbnQgYmVnaW4sIGludCBsZW5ndGgsIFN0cmluZyBjaGFuZ2VzKSB7Ci0JCS8vIHJlbWFwIHRoZSBiZWdpbiBhbmQgZW5kIHRvICJhcHBlYXIiIHRvIGJlIGluIHRoZQotCQkvLyBzYW1lIGNvb3JkaW5hdGVzIG9mIHRoZSBvcmlnaW5hbCBwYXJlbnREb2N1bWVudAotCQlpbnQgZW5kID0gYmVnaW4gKyBsZW5ndGg7Ci0JCXN0cmluZ0J1ZmZlci5yZXBsYWNlKGJlZ2luIC0gcHNldWRvQmVnaW5PZmZzZXQsIGVuZCwgY2hhbmdlcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KFN0cmluZyB0ZXh0KSB7Ci0JCXN0cmluZ0J1ZmZlci5zZXRMZW5ndGgoMCk7Ci0JCXN0cmluZ0J1ZmZlci5hcHBlbmQodGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1RleHRSZWdpb25MaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1RleHRSZWdpb25MaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjYyYjc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9UZXh0UmVnaW9uTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChJbnRhbGlvKSAtIGJ1ZyAzMDA0MzQgLSBNYWtlIGlubmVyIGNsYXNzZXMgc3RhdGljIHdoZXJlIHBvc3NpYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIFRleHRSZWdpb25MaXN0SW1wbCBpbXBsZW1lbnRzIElUZXh0UmVnaW9uTGlzdCB7Ci0KLQlzdGF0aWMgcHJpdmF0ZSBjbGFzcyBOdWxsSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0JCXB1YmxpYyBOdWxsSXRlcmF0b3IoKSB7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCByZW1vdmUgcmVnaW9ucyB2aWEgaXRlcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlZ2lvbkl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCQlwcml2YXRlIElUZXh0UmVnaW9uW10gZkl0ZXJhdG9yUmVnaW9uczsKLQkJcHJpdmF0ZSBpbnQgaW5kZXggPSAtMTsKLQkJcHJpdmF0ZSBpbnQgbWF4aW5kZXggPSAtMTsKLQotCQlwdWJsaWMgUmVnaW9uSXRlcmF0b3IoSVRleHRSZWdpb25bXSByZWdpb25zKSB7Ci0JCQlmSXRlcmF0b3JSZWdpb25zID0gcmVnaW9uczsKLQkJCW1heGluZGV4ID0gZkl0ZXJhdG9yUmVnaW9ucy5sZW5ndGggLSAxOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiBpbmRleCA8IG1heGluZGV4OwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJaWYgKCEoaW5kZXggPCBtYXhpbmRleCkpCi0JCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJCXJldHVybiBmSXRlcmF0b3JSZWdpb25zWysraW5kZXhdOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJaWYgKGluZGV4IDwgMCkgewotCQkJCS8vIG5leHQoKSBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYW4gbm90IHJlbW92ZSByZWdpb25zIHdpdGhvdXQgcHJpb3IgaW52b2NhdGlvbiBvZiBuZXh0KCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW4gbm90IHJlbW92ZSByZWdpb25zIHZpYSBpdGVyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBncm93dGhDb25zdGFudCA9IDI7Ci0KLQlwcml2YXRlIElUZXh0UmVnaW9uW10gZlJlZ2lvbnM7Ci0JcHJpdmF0ZSBpbnQgZlJlZ2lvbnNDb3VudCA9IDA7Ci0KLQlwdWJsaWMgVGV4dFJlZ2lvbkxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUZXh0UmVnaW9uTGlzdEltcGwoSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QpIHsKLQkJdGhpcygpOwotCQlmUmVnaW9ucyA9IChJVGV4dFJlZ2lvbltdKSByZWdpb25MaXN0LnRvQXJyYXkoKS5jbG9uZSgpOwotCQlmUmVnaW9uc0NvdW50ID0gZlJlZ2lvbnMubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbnN1cmVDYXBhY2l0eShmUmVnaW9uc0NvdW50ICsgMSk7Ci0JCWZSZWdpb25zW2ZSZWdpb25zQ291bnQrK10gPSByZWdpb247Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5zZXJ0UG9zLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9uTGlzdCkgewotCQkvLyBiZWdpbm5pbmcgb2YgbGlzdCBpcyAwIHRvIGluc2VydFBvcy0xCi0JCS8vIHJlbWFpbmRlciBvZiBsaXN0IGlzIGluc2VydFBvcyB0byBmUmVnaW9uc0NvdW50Ci0JCS8vIHJlc3VsdGluZyB0b3RhbCB3aWxsIGJlIGJlIGZSZWdpb25zQ291bnQgKyBuZXdSZWdpb25zLnNpemUoKQotCQlpZiAoaW5zZXJ0UG9zIDwgMCB8fCBpbnNlcnRQb3MgPiBmUmVnaW9uc0NvdW50KSB7Ci0JCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGluc2VydFBvcyk7Ci0JCX0KLQotCQlpbnQgbmV3UmVnaW9uTGlzdFNpemUgPSBuZXdSZWdpb25MaXN0LnNpemUoKTsKLQotCQllbnN1cmVDYXBhY2l0eShmUmVnaW9uc0NvdW50ICsgbmV3UmVnaW9uTGlzdFNpemUpOwotCi0JCWludCBudW1Nb3ZlZCA9IGZSZWdpb25zQ291bnQgLSBpbnNlcnRQb3M7Ci0JCWlmIChudW1Nb3ZlZCA+IDApCi0JCQlTeXN0ZW0uYXJyYXljb3B5KGZSZWdpb25zLCBpbnNlcnRQb3MsIGZSZWdpb25zLCBpbnNlcnRQb3MgKyBuZXdSZWdpb25MaXN0U2l6ZSwgbnVtTW92ZWQpOwotCi0JCWlmIChuZXdSZWdpb25MaXN0IGluc3RhbmNlb2YgVGV4dFJlZ2lvbkxpc3RJbXBsICYmICgoVGV4dFJlZ2lvbkxpc3RJbXBsKSBuZXdSZWdpb25MaXN0KS5mUmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KCgoVGV4dFJlZ2lvbkxpc3RJbXBsKSBuZXdSZWdpb25MaXN0KS5mUmVnaW9ucywgMCwgZlJlZ2lvbnMsIGluc2VydFBvcywgbmV3UmVnaW9uTGlzdFNpemUpOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdSZWdpb25MaXN0U2l6ZTsgaSsrKSB7Ci0JCQkJZlJlZ2lvbnNbaW5zZXJ0UG9zKytdID0gbmV3UmVnaW9uTGlzdC5nZXQoaSk7Ci0JCQl9Ci0JCX0KLQkJZlJlZ2lvbnNDb3VudCArPSBuZXdSZWdpb25MaXN0U2l6ZTsKLQkJcmV0dXJuIG5ld1JlZ2lvbkxpc3RTaXplICE9IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCS8vIG5vdGU6IHNpemUgb2YgYXJyYXkgaXMgbm90IHJlZHVjZWQhCi0JCWZSZWdpb25zQ291bnQgPSAwOwotCX0KLQotCXByaXZhdGUgdm9pZCBlbnN1cmVDYXBhY2l0eShpbnQgbmVlZGVkKSB7Ci0JCWlmIChmUmVnaW9ucyA9PSBudWxsKSB7Ci0JCQkvLyBmaXJzdCB0aW1lCi0JCQlmUmVnaW9ucyA9IG5ldyBJVGV4dFJlZ2lvbltuZWVkZWRdOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBvbGRMZW5ndGggPSBmUmVnaW9ucy5sZW5ndGg7Ci0JCWlmIChvbGRMZW5ndGggPCBuZWVkZWQpIHsKLQkJCUlUZXh0UmVnaW9uW10gb2xkQWRhcHRlcnMgPSBmUmVnaW9uczsKLQkJCUlUZXh0UmVnaW9uW10gbmV3QWRhcHRlcnMgPSBuZXcgSVRleHRSZWdpb25bbmVlZGVkICsgZ3Jvd3RoQ29uc3RhbnRdOwotCQkJU3lzdGVtLmFycmF5Y29weShvbGRBZGFwdGVycywgMCwgbmV3QWRhcHRlcnMsIDAsIGZSZWdpb25zQ291bnQpOwotCQkJZlJlZ2lvbnMgPSBuZXdBZGFwdGVyczsKLQkJfQotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXQoaW50IGluZGV4KSB7Ci0JCS8vIGZSZWdpb25Db3VudCBtYXkgbm90IGVxdWFsIGZSZWdpb25zLmxlbmd0aAotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGZSZWdpb25zQ291bnQpIHsKLQkJCXRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oaW5kZXgpOwotCQl9Ci0JCXJldHVybiBmUmVnaW9uc1tpbmRleF07Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJaWYgKGZSZWdpb25zICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZSZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChyZWdpb24uZXF1YWxzKGZSZWdpb25zW2ldKSkgewotCQkJCQkJcmVzdWx0ID0gaTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIGZSZWdpb25zQ291bnQgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCWlmIChzaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG5ldyBOdWxsSXRlcmF0b3IoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBuZXcgUmVnaW9uSXRlcmF0b3IodG9BcnJheSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiByZW1vdmUoaW50IGluZGV4KSB7Ci0JCS8vIG11Y2ggbW9yZSBlZmZpY2llbnQgd2F5cyB0byBpbXBsZW1lbnQgdGhpcywgYnV0Ci0JCS8vIEkgZG91YnQgaWYgY2FsbGVkIG9mdGVuCi0JCUlUZXh0UmVnaW9uIG9uZVRvUmVtb3ZlID0gZ2V0KGluZGV4KTsKLQkJcmVtb3ZlKG9uZVRvUmVtb3ZlKTsKLQkJcmV0dXJuIG9uZVRvUmVtb3ZlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZShJVGV4dFJlZ2lvbiBhKSB7Ci0JCWlmIChmUmVnaW9ucyA9PSBudWxsIHx8IGEgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IG5ld0luZGV4ID0gMDsKLQkJSVRleHRSZWdpb25bXSBuZXdSZWdpb25zID0gbmV3IElUZXh0UmVnaW9uW2ZSZWdpb25zQ291bnRdOwotCQlpbnQgb2xkUmVnaW9uQ291bnQgPSBmUmVnaW9uc0NvdW50OwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IG9sZEluZGV4ID0gMDsgb2xkSW5kZXggPCBvbGRSZWdpb25Db3VudDsgb2xkSW5kZXgrKykgewotCQkJSVRleHRSZWdpb24gY2FuZGlkYXRlID0gZlJlZ2lvbnNbb2xkSW5kZXhdOwotCQkJaWYgKGEgPT0gY2FuZGlkYXRlKSB7Ci0JCQkJZlJlZ2lvbnNDb3VudC0tOwotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0gZWxzZQotCQkJCW5ld1JlZ2lvbnNbbmV3SW5kZXgrK10gPSBmUmVnaW9uc1tvbGRJbmRleF07Ci0JCX0KLQkJaWYgKGZvdW5kKQotCQkJZlJlZ2lvbnMgPSBuZXdSZWdpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbChJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCkgewotCQkvLyBtdWNoIG1vcmUgZWZmaWNpZW50IHdheXMgdG8gaW1wbGVtZW50IHRoaXMsIGJ1dAotCQkvLyBJIGRvdWJ0IGlmIGNhbGxlZCBvZnRlbgotCQlpZiAocmVnaW9uTGlzdCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbkxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQl0aGlzLnJlbW92ZShyZWdpb25MaXN0LmdldChpKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGZSZWdpb25zQ291bnQ7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uW10gdG9BcnJheSgpIHsKLQkJLy8gcmV0dXJuICJjbG9uZSIgb2YgaW50ZXJuYWwgYXJyYXkKLQkJSVRleHRSZWdpb25bXSBuZXdBcnJheSA9IG5ldyBJVGV4dFJlZ2lvbltmUmVnaW9uc0NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weShmUmVnaW9ucywgMCwgbmV3QXJyYXksIDAsIGZSZWdpb25zQ291bnQpOwotCQlyZXR1cm4gbmV3QXJyYXk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRyaW1Ub1NpemUoKSB7Ci0JCWlmIChmUmVnaW9ucy5sZW5ndGggPiBmUmVnaW9uc0NvdW50KSB7Ci0JCQlJVGV4dFJlZ2lvbltdIG5ld1JlZ2lvbnMgPSBuZXcgSVRleHRSZWdpb25bZlJlZ2lvbnNDb3VudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGZSZWdpb25zLCAwLCBuZXdSZWdpb25zLCAwLCBmUmVnaW9uc0NvdW50KTsKLQkJCWZSZWdpb25zID0gbmV3UmVnaW9uczsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL0lTdHJ1Y3R1cmVkUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvSVN0cnVjdHVyZWRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyYjc2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvSVN0cnVjdHVyZWRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLQotLyoqCi0gKiBMaWtlIHN1cGVyIGNsYXNzIGV4Y2VwdCBhbGxvd3MgbGVuZ3RoIGFuZCBvZmZzZXQgdG8gYmUgbW9kaWZpZWQuIFRoaXMgaXMKLSAqIGNvbnZlbmllbnQgZm9yIHNvbWUgYWxnb3JpdGhtcywgYW5kIGFsbG93cyByZWdpb24gb2JqZWN0cyB0byBiZSByZXVzZWQuCi0gKiBOb3RlOiBUaGVyZSBNSUdIVCBiZSBzb21lIGNvZGUgdGhhdCBhc3N1bWVzIHJlZ2lvbnMgYXJlIGltbXV0YWJsZS4gVGhpcwotICogY2xhc3Mgd291bGQgbm90IGJlIGFwcHJvcHJpYXRlIGZvciB0aG9zZSB1c2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkUmVnaW9uIGV4dGVuZHMgSVJlZ2lvbiB7Ci0Jdm9pZCBzZXRMZW5ndGgoaW50IGxlbmd0aCk7Ci0KLQl2b2lkIHNldE9mZnNldChpbnQgb2Zmc2V0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9JU3RydWN0dXJlZFR5cGVkUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWEyMWE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9JU3RydWN0dXJlZFR5cGVkUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLQotLyoqCi0gKiBTaW1pbGFyIHRvIGV4dGVuZGVkIGludGVyZmFjZSwgZXhjZXB0IGl0IGFsbG93cyB0aGUgbGVuZ3RoLCBvZmZzZXQsIGFuZAotICogdHlwZSB0byBiZSBzZXQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gaXRlcmF0aW5nIHRocm91Z2ggYSBudW1iZXIgb2YgInNtYWxsIgotICogcmVnaW9ucywgdGhhdCBhbGwgbWFwIHRvIHRoZSB0aGUgc2FtZSBwYXJ0aW9uIHJlZ2lvbnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBleHRlbmRzIElTdHJ1Y3R1cmVkUmVnaW9uLCBJVHlwZWRSZWdpb24gewotCXZvaWQgc2V0VHlwZShTdHJpbmcgcGFydGl0aW9uVHlwZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU2ltcGxlU3RydWN0dXJlZFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1NpbXBsZVN0cnVjdHVyZWRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNhMWRlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU2ltcGxlU3RydWN0dXJlZFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotCi0KLQotLyoqCi0gKiBTaW1pbGFyIHRvIGpmYWNlIHJlZ2lvbiBleGNlcHQgd2Ugd2FudGVkIGEgc2V0dGluZyBvbiBsZW5ndGgKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVN0cnVjdHVyZWRSZWdpb24gaW1wbGVtZW50cyBJU3RydWN0dXJlZFJlZ2lvbiB7Ci0JLyoqIFRoZSByZWdpb24gbGVuZ3RoICovCi0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQotCS8qKiBUaGUgcmVnaW9uIG9mZnNldCAqLwotCXByaXZhdGUgaW50IGZPZmZzZXQ7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIHJlZ2lvbgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lvbgotCSAqLwotCXB1YmxpYyBTaW1wbGVTdHJ1Y3R1cmVkUmVnaW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBUd28gcmVnaW9ucyBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIG9mZnNldCBhbmQgbGVuZ3RoLgotCSAqIAotCSAqIEBzZWUgT2JqZWN0I2VxdWFscwotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIElSZWdpb24pIHsKLQkJCUlSZWdpb24gciA9IChJUmVnaW9uKSBvOwotCQkJcmV0dXJuIHIuZ2V0T2Zmc2V0KCkgPT0gZk9mZnNldCAmJiByLmdldExlbmd0aCgpID09IGZMZW5ndGg7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBJUmVnaW9uI2dldExlbmd0aAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJlZ2lvbiNnZXRPZmZzZXQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjaGFzaENvZGUgaGFzY29kZSBpcyBvdmVycmlkZGVuIHNpbmNlIHdlIHByb3ZpZGUgb3VyIG93bgotCSAqICAgICAgZXF1YWxzLgotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAoZk9mZnNldCA8PCAyNCkgfCAoZkxlbmd0aCA8PCAxNik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGVuZ3RoLgotCSAqIAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIFRoZSBsZW5ndGggdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpIHsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPZmZzZXQoaW50IG9mZnNldCkgewotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1NpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1NpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODIyYThhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczsKLQotCi0KLQotLyoqCi0gKiBTaW1pbGFyIGphY2UgVHlwZWRSZWdpb24sIGJ1dCBoYWQgdG8gc3ViY2xhc3Mgb3VyIHZlcnNpb24gd2hpY2ggYWxsb3dlZAotICogbGVuZ3RoIHRvIGJlIHNldC4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBleHRlbmRzIFNpbXBsZVN0cnVjdHVyZWRSZWdpb24gaW1wbGVtZW50cyBJU3RydWN0dXJlZFR5cGVkUmVnaW9uIHsKLQotCS8qKiBUaGUgcmVnaW9uJ3MgdHlwZSAqLwotCXByaXZhdGUgU3RyaW5nIGZUeXBlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHR5cGVkIHJlZ2lvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gc3BlY2lmaWNhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgcmVnaW9uJ3Mgb2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbidzIGxlbmd0aAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgcmVnaW9uJ3MgdHlwZQotCSAqLwotCXB1YmxpYyBTaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJc3VwZXIob2Zmc2V0LCBsZW5ndGgpOwotCQlmVHlwZSA9IHR5cGU7Ci0JfQotCi0JLyoqCi0JICogVHdvIHR5cGVkIHBvc2l0aW9ucyBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIG9mZnNldCwgbGVuZ3RoLCBhbmQKLQkgKiB0eXBlLgotCSAqIAotCSAqIEBzZWUgT2JqZWN0I2VxdWFscwotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIFNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbikgewotCQkJU2ltcGxlU3RydWN0dXJlZFR5cGVkUmVnaW9uIHIgPSAoU2ltcGxlU3RydWN0dXJlZFR5cGVkUmVnaW9uKSBvOwotCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhyKSAmJiAoKGZUeXBlID09IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gbnVsbCkgfHwgZlR5cGUuZXF1YWxzKHIuZ2V0VHlwZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBJVHlwZWRSZWdpb24jZ2V0VHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE9iamVjdCNoYXNoQ29kZQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCB0eXBlID0gZlR5cGUgPT0gbnVsbCA/IDAgOiBmVHlwZS5oYXNoQ29kZSgpOwotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKSB8IHR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlmVHlwZSA9IHR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcy5hcHBlbmQoZ2V0T2Zmc2V0KCkpOwotCQlzLmFwcGVuZCgiOiIpOyAvLyROT04tTkxTLTEkCi0JCXMuYXBwZW5kKGdldExlbmd0aCgpKTsKLQkJcy5hcHBlbmQoIiAtICIpOyAvLyROT04tTkxTLTEkCi0JCXMuYXBwZW5kKGdldFR5cGUoKSk7Ci0JCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRlOWIxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5JQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkZvcmVpZ25SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnM7Ci0KLQotLyoqCi0gKiBCYXNlIERvY3VtZW50IHBhcnRpdGlvbmVyIGZvciBTdHJ1Y3R1cmVkRG9jdW1lbnRzLiBCTE9DS19URVhUIElUZXh0UmVnaW9ucwotICogaGF2ZSBhIHBhcnRpdGlvbiB0eXBlIG9mIEJMT0NLIG9yIEJMT0NLOlRBR05BTUUgaWYgYSBzdXJyb3VuZGluZyB0YWduYW1lCi0gKiB3YXMgcmVjb3JkZWQuCi0gKiAKLSAqIFN1YmNsYXNzZXMgc2hvdWxkIHN5bmNocm9uaXplIGFjY2VzcyB0byA8Y29kZT5pbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZTwvY29kZT4gdXNpbmcgdGhlIGxvY2sKLSAqIDxjb2RlPlBBUlRJVElPTl9MT0NLPC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRQYXJ0aXRpb25lciwgSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgewotCi0Jc3RhdGljIGNsYXNzIENhY2hlZENvbXB1dGVkUGFydGl0aW9ucyB7Ci0JCWludCBmTGVuZ3RoOwotCQlpbnQgZk9mZnNldDsKLQkJSVR5cGVkUmVnaW9uW10gZlBhcnRpdGlvbnM7Ci0JCWJvb2xlYW4gaXNJblZhbGlkOwotCi0JCUNhY2hlZENvbXB1dGVkUGFydGl0aW9ucyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBJVHlwZWRSZWdpb25bXSBwYXJ0aXRpb25zKSB7Ci0JCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQkJZkxlbmd0aCA9IGxlbmd0aDsKLQkJCWZQYXJ0aXRpb25zID0gcGFydGl0aW9uczsKLQkJCWlzSW5WYWxpZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENhY2hlZENvbXB1dGVkUGFydGl0aW9ucyBjYWNoZWRQYXJ0aXRpb25zID0gbmV3IENhY2hlZENvbXB1dGVkUGFydGl0aW9ucygtMSwgLTEsIG51bGwpOwotCXByb3RlY3RlZCBTdHJpbmdbXSBmU3VwcG9ydGVkVHlwZXMgPSBudWxsOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZFR5cGVkUmVnaW9uIGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlID0gbmV3IFNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbigwLCAwLCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuREVGQVVMVF9QQVJUSVRJT04pOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IFBBUlRJVElPTl9MT0NLID0gbmV3IE9iamVjdCgpOwotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcnRpdGlvbmluZyBvZiB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIGNvbm5lY3RlZCBkb2N1bWVudC4KLQkgKiBUaGVyZSBtdXN0IGJlIGEgZG9jdW1lbnQgY29ubmVjdGVkIHRvIHRoaXMgcGFydGl0aW9uZXIuCi0JICogCi0JICogTm90ZTogdGhpcyBzaG91bGRuJ3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMsIHVubGVzcyB0aGV5IGNvbnRyb2wKLQkgKiB0aGUgdGhyZWFkaW5nIHRoYXQgaW5jbHVkZXMgbW9kaWZpY2F0aW9ucyB0byB0aGUgZG9jdW1lbnQuIE90aGVyd2lzZQotCSAqIHRoZSBkb2N1bWVudCBjb3VsZCBiZSBtb2RpZmllZCB3aGlsZSBwYXJ0aXRpb25zIGFyZSBiZWluZyBjb21wdXRlZC4gV2UKLQkgKiBhZHZpc2UgdGhhdCBjbGllbnRzIHVzZSB0aGUgY29tcHV0ZVBhcnRpdGlvbnMgQVBJIGRpcmVjdGx5IGZyb20gdGhlCi0JICogZG9jdW1lbnQsIHNvIHRoZXkgd29uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGF0LgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIHJhbmdlIG9mIGludGVyZXN0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2Ugb2YgaW50ZXJlc3QKLQkgKiBAcmV0dXJuIHRoZSBwYXJ0aXRpb25pbmcgb2YgdGhlIHJhbmdlCi0JICovCi0JcHVibGljIElUeXBlZFJlZ2lvbltdIGNvbXB1dGVQYXJ0aXRpb25pbmcoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkb2N1bWVudCBwYXJ0aXRpb25lciBpcyBub3QgY29ubmVjdGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJVHlwZWRSZWdpb25bXSByZXN1bHRzID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKGNhY2hlZFBhcnRpdGlvbnMpIHsKLQkJCWlmICgoIWNhY2hlZFBhcnRpdGlvbnMuaXNJblZhbGlkKSAmJiAob2Zmc2V0ID09IGNhY2hlZFBhcnRpdGlvbnMuZk9mZnNldCkgJiYgKGxlbmd0aCA9PSBjYWNoZWRQYXJ0aXRpb25zLmZMZW5ndGgpKQotCQkJCXJlc3VsdHMgPSBjYWNoZWRQYXJ0aXRpb25zLmZQYXJ0aXRpb25zOwotCQl9Ci0KLQkJaWYgKHJlc3VsdHMgPT0gbnVsbCkgewotCQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQkJcmVzdWx0cyA9IG5ldyBJVHlwZWRSZWdpb25bXXtnZXRQYXJ0aXRpb24ob2Zmc2V0KX07Ci0JCQl9IGVsc2UgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpbnQgZW5kUG9zID0gb2Zmc2V0ICsgbGVuZ3RoOwotCQkJCWlmIChlbmRQb3MgPiBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQkJCS8vIFRoaXMgY2FuIG9jY3VyIGlmIHRoZSBtb2RlbCBpbnN0YW5jZSBpcyBiZWluZwotCQkJCQkvLyBjaGFuZ2VkCi0JCQkJCS8vIGFuZCBldmVyeW9uZSdzIG5vdCB5ZXQgdXAgdG8gZGF0ZQotCQkJCQlyZXR1cm4gbmV3IElUeXBlZFJlZ2lvbltde2NyZWF0ZVBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgZ2V0VW5rbm93bigpKX07Ci0JCQkJfQotCQkJCWludCBjdXJyZW50UG9zID0gb2Zmc2V0OwotCQkJCUlTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gcHJldmlvdXNQYXJ0aXRpb24gPSBudWxsOwotCQkJCXdoaWxlIChjdXJyZW50UG9zIDwgZW5kUG9zKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gcGFydGl0aW9uID0gbnVsbDsKLQkJCQkJc3luY2hyb25pemVkIChQQVJUSVRJT05fTE9DSykgewotCQkJCQkJaW50ZXJuYWxHZXRQYXJ0aXRpb24oY3VycmVudFBvcywgZmFsc2UpOwotCQkJCQkJY3VycmVudFBvcyArPSBpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5nZXRMZW5ndGgoKTsKLQkJCQkJCQotCQkJCQkJLy8gY2hlY2sgaWYgdGhpcyBwYXJ0aXRpb24ganVzdCBjb250aW51ZXMgbGFzdCBvbmUKLQkJCQkJCS8vICh0eXBlIGlzIHRoZSBzYW1lKSwKLQkJCQkJCS8vIGlmIHNvLCBqdXN0IGV4dGVuZCBsZW5ndGggb2YgbGFzdCBvbmUsIG5vdCBuZWVkIHRvCi0JCQkJCQkvLyBjcmVhdGUgbmV3Ci0JCQkJCQkvLyBpbnN0YW5jZS4KLQkJCQkJCWlmIChwcmV2aW91c1BhcnRpdGlvbiAhPSBudWxsICYmIGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLmdldFR5cGUoKS5lcXVhbHMocHJldmlvdXNQYXJ0aXRpb24uZ2V0VHlwZSgpKSkgewotCQkJCQkJCS8vIHNhbWUgcGFydGl0aW9uIHR5cGUKLQkJCQkJCQlwcmV2aW91c1BhcnRpdGlvbi5zZXRMZW5ndGgocHJldmlvdXNQYXJ0aXRpb24uZ2V0TGVuZ3RoKCkgKyBpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5nZXRMZW5ndGgoKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBub3QgdGhlIHNhbWUsIHNvIGFkZCB0byBsaXN0Ci0JCQkJCQkJcGFydGl0aW9uID0gY3JlYXRlTmV3UGFydGl0aW9uSW5zdGFuY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocGFydGl0aW9uICE9IG51bGwpIHsKLQkJCQkJCWxpc3QuYWRkKHBhcnRpdGlvbik7Ci0JCQkJCQkvLyBhbmQgbWFrZSBjdXJyZW50LCBwcmV2aW91cwotCQkJCQkJcHJldmlvdXNQYXJ0aXRpb24gPSBwYXJ0aXRpb247Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmVzdWx0cyA9IG5ldyBJVHlwZWRSZWdpb25bbGlzdC5zaXplKCldOwotCQkJCWxpc3QudG9BcnJheShyZXN1bHRzKTsKLQkJCX0KLQkJCWlmIChyZXN1bHRzLmxlbmd0aCA+IDApIHsKLQkJCQkvLyB0cnVuY2F0ZSByZXR1cm5lZCByZXN1bHRzIHRvIHJlcXVlc3RlZCByYW5nZQotCQkJCWlmIChyZXN1bHRzWzBdLmdldE9mZnNldCgpIDwgb2Zmc2V0ICYmIHJlc3VsdHNbMF0gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFJlZ2lvbikgewotCQkJCQkoKElTdHJ1Y3R1cmVkUmVnaW9uKSByZXN1bHRzWzBdKS5zZXRPZmZzZXQob2Zmc2V0KTsKLQkJCQl9Ci0JCQkJaW50IGxhc3RFbmQgPSByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0uZ2V0T2Zmc2V0KCkgKyByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0uZ2V0TGVuZ3RoKCk7Ci0JCQkJaWYgKGxhc3RFbmQgPiBvZmZzZXQgKyBsZW5ndGggJiYgcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRSZWdpb24pIHsKLQkJCQkJKChJU3RydWN0dXJlZFJlZ2lvbikgcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdKS5zZXRMZW5ndGgob2Zmc2V0ICsgbGVuZ3RoIC0gcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdLmdldE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzeW5jaHJvbml6ZWQgKGNhY2hlZFBhcnRpdGlvbnMpIHsKLQkJCQljYWNoZWRQYXJ0aXRpb25zLmZMZW5ndGggPSBsZW5ndGg7Ci0JCQkJY2FjaGVkUGFydGl0aW9ucy5mT2Zmc2V0ID0gb2Zmc2V0OwotCQkJCWNhY2hlZFBhcnRpdGlvbnMuZlBhcnRpdGlvbnMgPSByZXN1bHRzOwotCQkJCWNhY2hlZFBhcnRpdGlvbnMuaXNJblZhbGlkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludmFsaWRhdGVQYXJ0aXRpb25DYWNoZSgpIHsKLQkJc3luY2hyb25pemVkIChjYWNoZWRQYXJ0aXRpb25zKSB7Ci0JCQljYWNoZWRQYXJ0aXRpb25zLmlzSW5WYWxpZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25uZWN0cyB0aGUgZG9jdW1lbnQgdG8gdGhlIHBhcnRpdGlvbmVyLCBpLmUuIGluZGljYXRlcyB0aGUgYmVnaW4gb2YKLQkgKiB0aGUgdXNhZ2Ugb2YgdGhlIHJlY2VpdmVyIGFzIHBhcnRpdGlvbmVyIG9mIHRoZSBnaXZlbiBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJaW52YWxpZGF0ZVBhcnRpdGlvbkNhY2hlKCk7Ci0JCQl0aGlzLmZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGlzIGNsYXNzIGFuZCBBUEkgYXJlIGZvciBTdHJ1Y3R1cmVkIERvY3VtZW50cyBvbmx5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIElUZXh0UmVnaW9uQ29udGFpbmVyIGl0c2VsZiBjb250YWlucyBhbm90aGVyCi0JICogSVRleHRSZWdpb25Db250YWluZXIKLQkgKiAKLQkgKiBAcGFyYW0gSVRleHRSZWdpb25Db250YWluZXIKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc0VtYmVkZGVkUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGFpbmVyKSB7Ci0JCWJvb2xlYW4gY29udGFpbnNFbWJlZGRlZFJlZ2lvbiA9IGZhbHNlOwotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gY29udGFpbmVyLmdldFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCWNvbnRhaW5zRW1iZWRkZWRSZWdpb24gPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250YWluc0VtYmVkZGVkUmVnaW9uOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBjcmVhdGVOZXdQYXJ0aXRpb25JbnN0YW5jZSgpIHsKLQkJc3luY2hyb25pemVkIChQQVJUSVRJT05fTE9DSykgewotCQkJcmV0dXJuIG5ldyBTaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24oaW50ZXJuYWxSZXVzZWRUZW1wSW5zdGFuY2UuZ2V0T2Zmc2V0KCksIGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLmdldExlbmd0aCgpLCBpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5nZXRUeXBlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29uY3JldGUgcGFydGl0aW9uIGZyb20gdGhlIGdpdmVuIHZhbHVlcy4gUmV0dXJucyBhIG5ldwotCSAqIGluc3RhbmNlIGZvciBlYWNoIGNhbGwuCi0JICogCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4gSVR5cGVkUmVnaW9uCi0JICogCi0JICogVE9ETzogc2hvdWxkIGJlIHByb3RlY3RlZAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZFR5cGVkUmVnaW9uIGNyZWF0ZVBhcnRpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbihvZmZzZXQsIGxlbmd0aCwgdHlwZSk7Ci0JfQotCi0JLyoqCi0JICogRGlzY29ubmVjdHMgdGhlIGRvY3VtZW50IGZyb20gdGhlIHBhcnRpdGlvbmVyLCBpLmUuIGluZGljYXRlcyB0aGUgZW5kCi0JICogb2YgdGhlIHVzYWdlIG9mIHRoZSByZWNlaXZlciBhcyBwYXJ0aXRpb25lciBvZiB0aGUgZ2l2ZW4gZG9jdW1lbnQuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyI2Rpc2Nvbm5lY3QoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNjb25uZWN0KCkgewotCQlpbnZhbGlkYXRlUGFydGl0aW9uQ2FjaGUoKTsKLQkJdGhpcy5mU3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbmZvcm1zIGFib3V0IGEgZm9ydGhjb21pbmcgZG9jdW1lbnQgY2hhbmdlLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpbnZhbGlkYXRlUGFydGl0aW9uQ2FjaGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZG9jdW1lbnQgaGFzIGJlZW4gY2hhbmdlZC4gVGhlIHBhcnRpdGlvbmVyIHVwZGF0ZXMgdGhlIHNldCBvZgotCSAqIHJlZ2lvbnMgYW5kIHJldHVybnMgd2hldGhlciB0aGUgc3RydWN0dXJlIG9mIHRoZSBkb2N1bWVudCBwYXJ0aXRpb25pbmcKLQkgKiBoYXMgYmVlbiBjaGFuZ2VkLCBpLmUuIHdoZXRoZXIgcGFydGl0aW9ucyBoYXZlIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXIjZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIHsKLQkJCS8vIHBhcnRpdGlvbnMgZG9uJ3QgYWx3YXlzIGNoYW5nZSB3aGlsZSBkb2N1bWVudCByZWdpb25zIGRvLAotCQkJLy8gYnV0IHRoYXQncyB0aGUgb25seSAicXVpY2sgY2hlY2siIHdlIGhhdmUuCi0JCQkvLyBJJ20gbm90IHN1cmUgaWYgc29tZXRoaW5nIG1vcmUgc29waGlzdGljYXRlZCB3aWxsIGJlIG5lZWRlZAotCQkJLy8gaW4gdGhlIGZ1dHVyZS4gKGRtdywgMDIvMTgvMDQpLgotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRvUGFyc2VyU3BlY2lmaWNDaGVjayhpbnQgb2Zmc2V0LCBib29sZWFuIHBhcnRpdGlvbkZvdW5kLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXh0LCBJVGV4dFJlZ2lvbiBwcmV2aW91c1N0YXJ0KSB7Ci0JCS8vIHRoaXMgKGNvbmNlcHR1YWxseSkgYWJzdHJhY3QgbWV0aG9kIGlzIG5vdCBjb25jZXJuZWQgd2l0aAotCQkvLyBzcGVjaWZpYyByZWdpb24gdHlwZXMKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgcGFydGl0aW9uIGNvbnRhaW5pbmcgdGhlIGdpdmVuCi0JICogY2hhcmFjdGVyIHBvc2l0aW9uIG9mIHRoZSBnaXZlbiBkb2N1bWVudC4gVGhlIGRvY3VtZW50IGhhcyBwcmV2aW91c2x5Ci0JICogYmVlbiBjb25uZWN0ZWQgdG8gdGhlIHBhcnRpdGlvbmVyLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lciNnZXRDb250ZW50VHlwZShpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBnZXRQYXJ0aXRpb24ob2Zmc2V0KS5nZXRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogVG8gYmUgdXNlZCBieSBkZWZhdWx0IQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKSB7Ci0KLQkJcmV0dXJuIElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXQgb2YgYWxsIHBvc3NpYmxlIGNvbnRlbnQgdHlwZXMgdGhlIHBhcnRpdGlvbmVyIHN1cHBvcnRzLgotCSAqIEkuZS4gQW55IHJlc3VsdCBkZWxpdmVyZWQgYnkgdGhpcyBwYXJ0aXRpb25lciBtYXkgbm90IGNvbnRhaW4gYSBjb250ZW50Ci0JICogdHlwZSB3aGljaCB3b3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhpcyBtZXRob2QncyByZXN1bHQuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyI2dldExlZ2FsQ29udGVudFR5cGVzKCkKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlpZiAoZlN1cHBvcnRlZFR5cGVzID09IG51bGwpIHsKLQkJCWluaXRMZWdhbENvbnRlbnRUeXBlcygpOwotCQl9Ci0JCXJldHVybiBmU3VwcG9ydGVkVHlwZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGl0aW9uIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGNoYXJhY3RlciBwb3NpdGlvbiBvZiB0aGUKLQkgKiBnaXZlbiBkb2N1bWVudC4gVGhlIGRvY3VtZW50IGhhcyBwcmV2aW91c2x5IGJlZW4gY29ubmVjdGVkIHRvIHRoZQotCSAqIHBhcnRpdGlvbmVyLgotCSAqIAotCSAqIE5vdGU6IHRoaXMgc2hvdWxkbid0IGJlIGNhbGxlZCBkaXJlY3RseSBieSBjbGllbnRzLCB1bmxlc3MgdGhleSBjb250cm9sCi0JICogdGhlIHRocmVhZGluZyB0aGF0IGluY2x1ZGVzIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvY3VtZW50LiBPdGhlcndpc2UKLQkgKiB0aGUgZG9jdW1lbnQgY291bGQgYmUgbW9kaWZpZWQgd2hpbGUgcGFydGl0aW9ucyBhcmUgYmVpbmcgY29tcHV0ZWQuIFdlCi0JICogYWR2aXNlIHRoYXQgY2xpZW50cyB1c2UgdGhlIGdldFBhcnRpdGlvbiBBUEkgZGlyZWN0bHkgZnJvbSB0aGUKLQkgKiBkb2N1bWVudCwgc28gdGhleSB3b24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoYXQuCi0JICogCi0JICogCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyI2dldFBhcnRpdGlvbihpbnQpCi0JICovCi0JcHVibGljIElUeXBlZFJlZ2lvbiBnZXRQYXJ0aXRpb24oaW50IG9mZnNldCkgewotCQlpbnRlcm5hbEdldFBhcnRpdGlvbihvZmZzZXQsIHRydWUpOwotCQlyZXR1cm4gY3JlYXRlTmV3UGFydGl0aW9uSW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnRpdGlvbkZyb21CbG9ja2VkVGV4dChJVGV4dFJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQsIFN0cmluZyByZXN1bHQpIHsKLQkJLy8gcGFyc2VyIHNlbnNpdGl2ZSBjb2RlIHdhcyBtb3ZlZCB0byBzdWJjbGFzcyBmb3IgcXVpY2sgdHJhbnNpdGlvbgotCQkvLyB0aGlzIChjb25jZXB0dWFsbHkpIGFic3RyYWN0IHZlcnNpb24gaXNuJ3QgY29uY2VybmVkIHdpdGggYmxvY2tlZAotCQkvLyB0ZXh0Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoRm9yZWlnblJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIHRhZ25hbWUgPSByZWdpb24uZ2V0U3Vycm91bmRpbmdUYWcoKTsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh0YWduYW1lICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9ICJCTE9DSzoiICsgdGFnbmFtZS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9ICJCTE9DSyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gYmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0KLQkJLy8gcmVnaW9ucyBzaG91bGQgbmV2ZXIgYmUgbnVsbCwgb3IgaG9sZCB6ZXJvIHJlZ2lvbnMsIGJ1dCBqdXN0IGluCi0JCS8vIGNhc2UuLi4KLQkJaWYgKHJlZ2lvbnMgIT0gbnVsbCAmJiByZWdpb25zLnNpemUoKSA+IDApIHsKLQkJCWlmIChyZWdpb25zLnNpemUoKSA9PSAxKSB7Ci0JCQkJLy8gaWYgb25seSBvbmUsIHRoZW4gaXRzIGEgInB1cmUiIGJsb2NrZWQgbm90ZS4KLQkJCQkvLyBpZiBtb3JlIHRoYW4gb25lLCB0aGVuIG11c3QgY29udGFpbiBzb21lIGVtYmVkZGVkIHJlZ2lvbgotCQkJCS8vIGNvbnRhaW5lcgotCQkJCUlUZXh0UmVnaW9uIGJsb2NrZWRSZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJCQkvLyBkb3VibGUgY2hlY2sgZm9yIGNvZGUgc2FmZWZ5LCB0aG91Z2ggc2hvdWxkIGFsd2F5cyBiZSB0cnVlCi0JCQkJaWYgKGJsb2NrZWRSZWdpb24gaW5zdGFuY2VvZiBGb3JlaWduUmVnaW9uKSB7Ci0JCQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKEZvcmVpZ25SZWdpb24pIGJsb2NrZWRSZWdpb24sIG9mZnNldCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBtdXN0IGhhdmUgc29tZSBlbWJlZGRlZCByZWdpb24gY29udGFpbmVyLCBzbyB3ZSdsbCBtYWtlCi0JCQkJLy8gc3VyZSB3ZSdsbCBnZXQgdGhlIGFwcHJvcHJpYXRlIG9uZQotCQkJCXJlc3VsdCA9IGdldFJlbGV2ZW50UmVnaW9uVHlwZShibG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBvZmZzZXQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldFBhcnRpdGlvblR5cGUuCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJLy8gaWYgaXQgZ2V0J3MgdG8gdGhpcyAicmF3IiBsZXZlbCwgdGhlbgotCQkvLyBtdXN0IGJlIGRlZmF1bHQuCi0JCXJldHVybiBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcnRpdGlvbiBiYXNlZCBvbiByZWdpb24gdHlwZS4gVGhpcyBiYXNpY2FsbHkgbWFwcyBmcm9tCi0JICogb25lIHJlZ2lvbi10eXBlIHNwYWNlIHRvIGFub3RoZXIsIGhpZ2hlciBsZXZlbCwgcmVnaW9uLXR5cGUgc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJVGV4dFJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IGdldERlZmF1bHRQYXJ0aXRpb25UeXBlKCk7Ci0JCS8vCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgQ29udGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkvLwkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24sIG9mZnNldCk7Ci0JCS8vCQl9IGVsc2UgewotCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24sIG9mZnNldCk7Ci0JCX0KLQotCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25Gcm9tQmxvY2tlZFRleHQocmVnaW9uLCBvZmZzZXQsIHJlc3VsdCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCS8qKgotCSAqIFNpbWlsYXIgdG8gbWV0aG9kIHdpdGggJ0lUZXh0UmVnaW9uJyBhcyBhcmd1bWVudCwgZXhjZXB0IGZvcgotCSAqIFJlZ2lvbkNvbnRhaW5lcnMsIGlmIGl0IGhhcyBlbWJlZGRlZCByZWdpb25zLCB0aGVuIHdlIG5lZWQgdG8gZHJpbGwKLQkgKiBkb3duIGFuZCByZXR1cm4gRG9jdW1lbnRQYXJ0aXRpb24gYmFzZWQgb24gImxvd2VzdCBsZXZlbCIgcmVnaW9uIHR5cGUuCi0JICogRm9yIGV4YW1wbGUsIGluIDxib2R5IGlkPSIgPCU9IG9iamVjdC5nZXRJRCgpICU+IiA+IFRoZSB0ZXh0IGJldHdlZW4KLQkgKiA8JT0gYW5kICU+IHdvdWxkIGJlIGEgImphdmEgcmVnaW9uIiBub3QgYW4gIkhUTUwgcmVnaW9uIi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb25Db250YWluZXIgcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIFRPRE8gdGhpcyBtZXRob2QgbmVlZHMgdG8gYmUgJ2NsZWFuZWQgdXAnIGFmdGVyIHJlZmFjdG9yaW5nCi0JCS8vIGl0cyBpbnN0YW5jZW9mIGxvZ2ljIHNlZW1zIG1lc3NlZCB1cCBub3cuCi0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uIGNvcmVSZWdpb24gPSByZWdpb247Ci0JCQlpZiAoY29yZVJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0UGFydGl0aW9uVHlwZSgoSVRleHRSZWdpb25Db250YWluZXIpIGNvcmVSZWdpb24sICgoSVRleHRSZWdpb25Db250YWluZXIpIGNvcmVSZWdpb24pLmdldFJlZ2lvbnMoKSwgb2Zmc2V0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gZ2V0UGFydGl0aW9uVHlwZShyZWdpb24pOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gZ2V0UGFydGl0aW9uVHlwZSgoSVRleHRSZWdpb24pIHJlZ2lvbiwgb2Zmc2V0KTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJVGV4dFJlZ2lvbkNvbnRhaW5lciBjb3JlUmVnaW9uLCBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucywgaW50IG9mZnNldCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChjb3JlUmVnaW9uLmNvbnRhaW5zT2Zmc2V0KHJlZ2lvbiwgb2Zmc2V0KSkgewotCQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHBhcnRpdGlvbiB0eXBlIGZvciB0aGUgemVyby1sZW5ndGggcGFydGl0aW9uIGJldHdlZW4gYQotCSAqIHN0YXJ0IHRhZyBhbmQgZW5kIHRhZyB3aXRoIHRoZSBnaXZlbiBuYW1lIHJlZ2lvbnMuCi0JICogCi0JICogQHBhcmFtIHByZXZpb3VzU3RhcnRUYWdOYW1lUmVnaW9uCi0JICogQHBhcmFtIG5leHRFbmRUYWdOYW1lUmVnaW9uCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNOb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSVRleHRSZWdpb24gYXQgdGhlIGdpdmVuIG9mZnNldC4gRm9yIG1vc3QgY2FzZXMsIHRoaXMgd2lsbAotCSAqIGJlIHRoZSBmbGF0Tm9kZSBpdHNlbGYuIFNob3VsZCBpdCBjb250YWluIGFuIGVtYmVkZGVkCi0JICogSVRleHRSZWdpb25Db250YWluZXIsIHdpbGwgcmV0dXJuIHRoZSBpbnRlcm5hbCByZWdpb24gYXQgdGhlIG9mZnNldAotCSAqIAotCSAqIAotCSAqIEBwYXJhbSBmbGF0Tm9kZQotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIElUZXh0UmVnaW9uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVsZXZlbnRSZWdpb25UeXBlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIGludCBvZmZzZXQpIHsKLQkJLy8JCSogTm90ZTogdGhlIG9yaWdpbmFsIGZvcm0gb2YgdGhpcyBtZXRob2QgLS0gd2hpY2ggcmV0dXJuZWQgImRlZXAiCi0JCS8vIHJlZ2lvbiwgaXNuJ3QgdGhhdAotCQkvLwkJKiB1c2VmdWwsIGFmdGVyIGRvaW5nIHBhcmVudCBlbGltaW5hdGlvbiByZWZhY3RvcmluZywKLQkJLy8JCSogc2luY2Ugb25jZSB0aGUgZGVlcCByZWdpb24gaXMgcmV0dXJuZWQsIGl0cyBoYXJkIHRvIGdldCBpdHMgdGV4dAotCQkvLyBvciBvZmZzZXQgd2l0aG91dAotCQkvLwkJKiBwcm9wZXIgcGFyZW50LgotCQlJVGV4dFJlZ2lvbiByZXN1bHRSZWdpb24gPSBudWxsOwotCQlpZiAoY29udGFpbnNFbWJlZGRlZFJlZ2lvbihmbGF0Tm9kZSkpIHsKLQkJCXJlc3VsdFJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlpZiAocmVzdWx0UmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQlyZXN1bHRSZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVzdWx0UmVnaW9uKS5nZXRSZWdpb25zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQlpZiAoZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA8PSBvZmZzZXQgJiYgb2Zmc2V0IDwgZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbikpIHsKLQkJCQkJCXJlc3VsdFJlZ2lvbiA9IHJlZ2lvbjsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmVzdWx0UmVnaW9uID0gZmxhdE5vZGU7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFJlZ2lvbi5nZXRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogVG8gYmUgdXNlZCwgaW5zdGVhZCBvZiBkZWZhdWx0LCB3aGVuIHRoZXJlIGlzIHNvbWUgdGhpbmcgc3VycHJpc2luZwotCSAqIGFib3V0IGFyZSBhdHRlbXB0IHRvIHBhcnRpdGlvbgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5rbm93bigpIHsKLQkJcmV0dXJuIElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTjsKLQl9Ci0KLQkvKioKLQkgKiB0byBiZSBhYnN0cmFjdCBldmVudHVhbGx5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlmU3VwcG9ydGVkVHlwZXMgPSBuZXcgU3RyaW5nW117SVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OLCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT059OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcnRpdGlvbiBjb250YWluaW5nIHRoZSBnaXZlbiBjaGFyYWN0ZXIgcG9zaXRpb24gb2YgdGhlCi0JICogZ2l2ZW4gZG9jdW1lbnQuIFRoZSBkb2N1bWVudCBoYXMgcHJldmlvdXNseSBiZWVuIGNvbm5lY3RlZCB0byB0aGUKLQkgKiBwYXJ0aXRpb25lci4gSWYgdGhlIGNoZWNrQmV0d2VlbiBwYXJhbWV0ZXIgaXMgdHJ1ZSwgYW4gb2Zmc2V0IGJldHdlZW4gYQotCSAqIHN0YXJ0IGFuZCBlbmQgdGFnIHdpbGwgcmV0dXJuIGEgemVyby1sZW5ndGggcmVnaW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnRlcm5hbEdldFBhcnRpdGlvbihpbnQgb2Zmc2V0LCBib29sZWFuIGNoZWNrQmV0d2VlbikgewotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkb2N1bWVudCBwYXJ0aXRpb25lciBpcyBub3QgY29ubmVjdGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWJvb2xlYW4gcGFydGl0aW9uRm91bmQgPSBmYWxzZTsKLQkJaW50IGRvY0xlbmd0aCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCS8vIGdldCBkb2N1bWVudCByZWdpb24gdHlwZSBhbmQgbWFwIHRvIHBhcnRpdGlvbiB0eXBlIDoKLQkJLy8gTm90ZTogYSBwYXJ0aW9uIGNhbiBiZSBzbWFsbGVyIHRoYW4gYSBmbGF0bm9kZSwgaWYgdGhhdCBmbGF0bm9kZQotCQkvLyBjb250YWlucyBhIHJlZ2lvbiBjb250YWluZXIuCi0JCS8vIFRoYXQncyB3aHkgd2UgbmVlZCB0byBnZXQgInJlbGV2ZW50IHJlZ2lvbiIuCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkvLyBmbGF0Tm9kZSBpcyBudWxsIGlmIGVtcHR5IGRvY3VtZW50Ci0JCS8vIHRoaXMgaXMga2luZyBvZiBhICJub3JtYWwgY2FzZSIgZm9yIGVtcHR5IGRvY3VtZW50Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJaWYgKGRvY0xlbmd0aCA9PSAwKSB7Ci0JCQkJLyoKLQkJCQkgKiBJbiBvcmRlciB0byBwcmV2ZW50IGluZmluaXRlIGVycm9yIGxvb3BzLCB0aGlzIHBhcnRpdGlvbgotCQkJCSAqIG11c3QgbmV2ZXIgaGF2ZSBhIHplcm8gbGVuZ3RoIHVubGVzcyB0aGUgZG9jdW1lbnQgaXMgYWxzbwotCQkJCSAqIHplcm8gbGVuZ3RoCi0JCQkJICovCi0JCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCAwLCBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpKTsKLQkJCQlwYXJ0aXRpb25Gb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKgotCQkJCSAqIFRoaXMgY2FzZSBpcyAidW51c3VhbCIuIFdoZW4gd291bGQgcmVnaW9uIGJlIG51bGwsIGFuZAotCQkJCSAqIGRvY3VtZW50IGxvbmdlciB0aGFuIDAuIEkgdGhpbmsgdGhpcyBtZWFucyBzb21ldGhpbmcncyAib3V0Ci0JCQkJICogb2Ygc3luYyIuIEFuZCB3ZSBtYXkgd2FudCB0byAiZmxhZyIgdGhhdCBmYWN0IGFuZCBqdXN0Ci0JCQkJICogcmV0dXJuIG9uZSBiaWcgcmVnaW9uIG9mICd1bmtub3duJywgaW5zdGVhZCBvZiBvbmUKLQkJCQkgKiBjaGFyYWN0ZXIgYXQgYSB0aW1lLgotCQkJCSAqLwotCQkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgMSwgZ2V0VW5rbm93bigpKTsKLQkJCQlwYXJ0aXRpb25Gb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCX0JCi0JCWVsc2UgaWYgKGNoZWNrQmV0d2VlbikgewotCQkJLy8gZG13OiBtaW5pbWl6ZXMgb3V0IHRvIHRoZSBmaXJzdCBpZiB0ZXN0IGFib3ZlCi0JCQkvLwkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCAmJiBkb2NMZW5ndGggPT0gMCkgewotCQkJLy8JCQkJLy8ga25vd24gc3BlY2lhbCBjYXNlIGZvciBhbiBlbXB0eSBkb2N1bWVudAotCQkJLy8JCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCAwLCBnZXREZWZhdWx0KCkpOwotCQkJLy8JCQkJcGFydGl0aW9uRm91bmQgPSB0cnVlOwotCQkJLy8JCQl9Ci0JCQkvLwkJCWVsc2UKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSA9PSBvZmZzZXQpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCQkJaWYgKHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJSVRleHRSZWdpb24gbmV4dCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2aW91c1N0YXJ0ID0gcHJldmlvdXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocHJldmlvdXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCXBhcnRpdGlvbkZvdW5kID0gZG9QYXJzZXJTcGVjaWZpY0NoZWNrKG9mZnNldCwgcGFydGl0aW9uRm91bmQsIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcHJldmlvdXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIG5leHQsIHByZXZpb3VzU3RhcnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghcGFydGl0aW9uRm91bmQgJiYgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCS8qIFdlIHdhbnQgdGhlIGFjdHVhbCBJVGV4dFJlZ2lvbiBhbmQgbm90IGEgcG9zc2libGUgSVRleHRSZWdpb25Db2xsZWN0aW9uIHRoYXQKLQkJCSAqIGNvdWxkIGJlIHJldHVybmVkIGJ5IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQKLQkJCSAqIFRoaXMgYWxsb3dzIGZvciBjb3JyZWN0IHN5bnRheCBoaWdobGlnaHRpbmcgYW5kIGNvbnRlbnQgYXNzaXN0LgotCQkJICovCi0JCQlEZWVwUmVnaW9uIHJlc3VsdFJlZ2lvbiA9IGdldERlZXBSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIG9mZnNldCk7Ci0JCQlwYXJ0aXRpb25Gb3VuZCA9IGlzRG9jdW1lbnRSZWdpb25CYXNlZFBhcnRpdGlvbihzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlc3VsdFJlZ2lvbi5yZWdpb24sIG9mZnNldCk7Ci0JCQlpZiAoIXBhcnRpdGlvbkZvdW5kKSB7Ci0JCQkJaWYgKHJlc3VsdFJlZ2lvbi5yZWdpb24gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdHlwZSA9IGdldFBhcnRpdGlvblR5cGUocmVzdWx0UmVnaW9uLnJlZ2lvbiwgb2Zmc2V0KTsKLQkJCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCByZXN1bHRSZWdpb24uZW5kIC0gb2Zmc2V0LCB0eXBlKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBjYW4gaGFwcGVuIGF0IEVPRgotCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI0ODg2Ci0JCQkJCS8vIFRoZSB1bmtub3duIHR5cGUgd2FzIGNhdXNpbmcgcHJvYmxlbXMgd2l0aCBjb250ZW50IGFzc2lzdCBpbiBKU1AgZG9jdW1lbnRzCi0JCQkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgMSwgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVlcFJlZ2lvbiB7Ci0JCWludCBlbmQ7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbjsKLQkJRGVlcFJlZ2lvbihJVGV4dFJlZ2lvbiByLCBpbnQgZSkgewotCQkJcmVnaW9uID0gcjsKLQkJCWVuZCA9IGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8cD5Vbmxpa2Uge0BsaW5rIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50KX0gdGhpcyB3aWxsIGRpZwotCSAqIGludG8gPGNvZGU+SVRleHRSZWdpb25Db2xsZWN0aW9uPC9jb2RlPiB0byBmaW5kIHRoZSByZWdpb24gY29udGFpbmluZyB0aGUgZ2l2ZW4gb2Zmc2V0PC9wPgotCSAqIAotCSAqIEBwYXJhbSByZWdpb24gdGhlIGNvbnRhaW5pbmcgcmVnaW9uIG9mIHRoZSBnaXZlbiA8Y29kZT5vZmZzZXQ8L2NvZGU+Ci0JICogQHBhcmFtIG9mZnNldCB0byB0aGUgb3ZlcmFsbCBvZmZzZXQgaW4gdGhlIGRvY3VtZW50LgotCSAqIEByZXR1cm4gdGhlIDxjb2RlPklUZXh0UmVnaW9uPC9jb2RlPiBjb250YWluaW5nIHRoZSBnaXZlbiA8Y29kZT5vZmZzZXQ8L2NvZGU+LCB3aWxsIG5ldmVyIGJlCi0JICogYSA8Y29kZT5JVGV4dFJlZ2lvbkNvbGxleHRpb248L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBEZWVwUmVnaW9uIGdldERlZXBSZWdpb25BdENoYXJhY3Rlck9mZnNldChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlJVGV4dFJlZ2lvbiB0ZXh0ID0gcmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCWludCBlbmQgPSByZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkKLQkJCWVuZCArPSB0ZXh0LmdldFN0YXJ0KCk7Ci0JCXdoaWxlICh0ZXh0IGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JCQl0ZXh0ID0gKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHRleHQpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQllbmQgKz0gdGV4dC5nZXRTdGFydCgpOwotCQl9Ci0JCWlmICh0ZXh0ICE9IG51bGwpCi0JCQllbmQgKz0gdGV4dC5nZXRMZW5ndGgoKTsKLQkJcmV0dXJuIG5ldyBEZWVwUmVnaW9uKHRleHQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgZm9yIGEgcGVyLVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvdmVycmlkZSBzZWxlY3RpbmcgdGhlCi0JICogcGFydGl0aW9uIHR5cGUgdXNpbmcgbW9yZSB0aGFuIGp1c3QgYSBzaW5nbGUgSVRleHRSZWdpb24uCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqICAgICAgICAgICAgdGhlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSBjb250YWluZWRDaGlsZFJlZ2lvbgotCSAqICAgICAgICAgICAgYW4gSVRleHRSZWdpb24gd2l0aGluIHRoZSBnaXZlbiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKiAgICAgICAgICAgIHRoYXQgd291bGQgbm9ybWFsbHkgZGV0ZXJtaW5lIHRoZSBwYXJ0aXRpb24gdHlwZSBieSBpdHNlbGYKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgb2Zmc2V0Ci0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXJ0aXRpb24gdHlwZSB3aWxsIGJlIG92ZXJyaWRkZW4sIGZhbHNlIHRvCi0JICogICAgICAgICBjb250aW51ZSBub3JtYWwgcHJvY2Vzc2luZwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRG9jdW1lbnRSZWdpb25CYXNlZFBhcnRpdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gY29udGFpbmVkQ2hpbGRSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJc3luY2hyb25pemVkIChQQVJUSVRJT05fTE9DSykgewotCQkJaW50ZXJuYWxSZXVzZWRUZW1wSW5zdGFuY2Uuc2V0T2Zmc2V0KG9mZnNldCk7Ci0JCQlpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJCWludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLnNldFR5cGUodHlwZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9Db21tYW5kQ3Vyc29yUG9zaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9Db21tYW5kQ3Vyc29yUG9zaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM5Y2Y1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vQ29tbWFuZEN1cnNvclBvc2l0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1hbmRDdXJzb3JQb3NpdGlvbiB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gYmUgc2V0IHRvIGFmdGVyIHRoaXMgY29tbWFuZCBpcyByZWRvbmUuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0UmVkb0N1cnNvclBvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGV4dCB0byBiZSBzZWxlY3RlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcmVkb25lLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldFJlZG9TZWxlY3Rpb25MZW5ndGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byBiZSBzZXQgdG8gYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHVuZG9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRVbmRvQ3Vyc29yUG9zaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyB1bmRvbmUuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0VW5kb1NlbGVjdGlvbkxlbmd0aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIGJlIHVzZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHJlZG9uZS4KLQkgKi8KLQl2b2lkIHNldFJlZG9DdXJzb3JQb3NpdGlvbihpbnQgY3Vyc29yUG9zaXRpb24pOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRleHQgdG8gYmUgc2VsZWN0ZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHJlZG9uZS4KLQkgKi8KLQl2b2lkIHNldFJlZG9TZWxlY3Rpb25MZW5ndGgoaW50IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gYmUgdXNlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgdW5kb25lLgotCSAqLwotCXZvaWQgc2V0VW5kb0N1cnNvclBvc2l0aW9uKGludCBjdXJzb3JQb3NpdGlvbik7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGV4dCB0byBiZSBzZWxlY3RlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgdW5kb25lLgotCSAqLwotCXZvaWQgc2V0VW5kb1NlbGVjdGlvbkxlbmd0aChpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9JRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL0lEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MzI4ODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL0lEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBzZWxlY3Rpb24gbWVkaWF0b3IncyBpbnB1dCBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCBzZWxlY3Rpb24gbWVkaWF0b3IncyBpbnB1dCBkb2N1bWVudAotCSAqLwotCUlEb2N1bWVudCBnZXREb2N1bWVudCgpOwotCi0JLyoqCi0JICogU2V0cyBhIG5ldyBzZWxlY3Rpb24gaW4gdGhlIGRvY3VtZW50IGFzIGEgcmVzdWx0IG9mIGFuIHVuZG8gb3BlcmF0aW9uLgotCSAqIAotCSAqIFVuZG9Eb2N1bWVudEV2ZW50IGNvbnRhaW5zIHRoZSByZXF1ZXN0ZXIgb2YgdGhlIHVuZG8gb3BlcmF0aW9uLCBhbmQgdGhlCi0JICogb2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIG5ldyBzZWxlY3Rpb24uIEltcGxlbWVudGF0aW9uIG9mCi0JICogSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgY2FuIGNoZWNrIGlmIGl0J3MgdGhlIHJlcXVlc3RlciB0aGF0IGNhdXNlZAotCSAqIHRoZSBuZXcgc2VsZWN0aW9uLCBhbmQgZGVjaWRlIGlmIHRoZSBuZXcgc2VsZWN0aW9uIHNob3VsZCBiZSBhcHBsaWVkLgotCSAqLwotCXZvaWQgdW5kb09wZXJhdGlvblNlbGVjdGlvbkNoYW5nZWQoVW5kb0RvY3VtZW50RXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL0lTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAzNTFiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCk7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbik7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIENvbm5lY3QgdGhlIG1lZGlhdG9yIHRvIHRoZSB1bmRvIG1hbmFnZXIuCi0JICovCi0Jdm9pZCBjb25uZWN0KElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIG1lZGlhdG9yKTsKLQotCS8qKgotCSAqIERpc2FibGUgdW5kbyBtYW5hZ2VtZW50LgotCSAqLwotCXZvaWQgZGlzYWJsZVVuZG9NYW5hZ2VtZW50KCk7Ci0KLQkvKioKLQkgKiBEaXNjb25uZWN0IHRoZSBtZWRpYXRvciBmcm9tIHRoZSB1bmRvIG1hbmFnZXIuCi0JICovCi0Jdm9pZCBkaXNjb25uZWN0KElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIG1lZGlhdG9yKTsKLQotCS8qKgotCSAqIEVuYWJsZSB1bmRvIG1hbmFnZW1lbnQuCi0JICovCi0Jdm9pZCBlbmFibGVVbmRvTWFuYWdlbWVudCgpOwotCi0JLyoqCi0JICogRW5kIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKTsKLQotCS8qKgotCSAqIEVuZCByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIE5vcm1hbGx5LCB0aGUgdW5kbyBtYW5hZ2VyIGNhbiBmaWd1cmUgb3V0IHRoZSBiZXN0IHRpbWVzIHdoZW4gdG8gZW5kIGEKLQkgKiBwZW5kaW5nIGNvbW1hbmQgYW5kIGJlZ2luIGEgbmV3IG9uZSAuLi4gdG8gdGhlIHN0cnVjdHVyZSBvZiBhIHN0cnVjdHVlZAotCSAqIGRvY3VtZW50LiBUaGVyZSBhcmUgdGltZXMsIGhvd2V2ZXIsIHdoZW4gY2xpZW50cyBtYXkgd2lzaCB0byBvdmVycmlkZQotCSAqIHRob3NlIGFsZ29yaXRobXMgYW5kIGVuZCBvbmUgZWFybGllciB0aGFuIG5vcm1hbC4gVGhlIG9uZSBrbm93biBjYXNlIGlzCi0JICogZm9yIG11bHRpcGFnZSBlZGl0b3JzLiBJZiBhIHVzZXIgaXMgb24gb25lIHBhZ2UsIGFuZCB0eXBlICcxMjMnIGFzCi0JICogYXR0cmlidXRlIHZhbHVlLCB0aGVuIGNsaWNrIGFyb3VuZCB0byBvdGhlciBwYXJ0cyBvZiBwYWdlLCBvciBkaWZmZXJlbnQKLQkgKiBwYWdlcywgdGhlbiByZXR1cm4gdG8gJzEyM3wnIGFuZCB0eXBlIDQ1NiwgdGhlbiAidW5kbyIgdGhleSB0eXBpY2FsbHkKLQkgKiBleHBlY3QgdGhlIHVuZG8gdG8ganVzdCB1bmRvIHdoYXQgdGhleSBqdXN0IHR5cGVkLCB0aGUgNDU2LCBub3QgdGhlCi0JICogd2hvbGUgYXR0cmlidXRlIHZhbHVlLgotCSAqIDxwPgotCSAqIElmIHRoZXJlIGlzIG5vIHBlbmRpbmcgY29tbWFuZCwgdGhlIHJlcXVlc3QgaXMgaWdub3JlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JjZUVuZE9mUGVuZGluZ0NvbW1hbmQoT2JqZWN0IHJlcXVlc3RlciwgaW50IGN1cnJlbnRQb3NpdGlvbiwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiBTb21lIGNsaWVudHMgbmVlZCB0byBkbyBjb21wbGljYXRlZCB0aGluZ3Mgd2l0aCB1bmRvIHN0YWNrLiBQbHVzLCBpbgotCSAqIHNvbWUgY2FzZXMsIGlmIGNsaWVudHMgc2V0Q29tbWFuZFN0YWNrIHRlbXBvcmFyaWx5LCB0aGV5IGhhdmUKLQkgKiByZXBvbnNpYmlsaXR5IHRvIHNldCBiYWNrIHRvIG9yaWdpbmFsIG9uZSB3aGVuIGZpbmlzaGVkLgotCSAqLwotCXB1YmxpYyBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJlZG8gY29tbWFuZCBldmVuIGlmIGl0J3Mgbm90IGNvbW1pdHRlZCB5ZXQuCi0JICovCi0JQ29tbWFuZCBnZXRSZWRvQ29tbWFuZCgpOwotCi0JLyoqCi0JICogR2V0IHRoZSB1bmRvIGNvbW1hbmQgZXZlbiBpZiBpdCdzIG5vdCBjb21taXR0ZWQgeWV0LgotCSAqLwotCUNvbW1hbmQgZ2V0VW5kb0NvbW1hbmQoKTsKLQotCS8qKgotCSAqIFJlZG8gdGhlIGxhc3QgY29tbWFuZCBpbiB0aGUgdW5kbyBtYW5hZ2VyLgotCSAqLwotCXZvaWQgcmVkbygpOwotCi0JLyoqCi0JICogUmVkbyB0aGUgbGFzdCBjb21tYW5kIGluIHRoZSB1bmRvIG1hbmFnZXIgYW5kIG5vdGlmeSB0aGUgcmVxdWVzdGVyCi0JICogYWJvdXQgdGhlIG5ldyBzZWxlY3Rpb24uCi0JICovCi0Jdm9pZCByZWRvKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3Rlcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgYXQgbGVhc3Qgb25lIHRleHQgY2hhbmdlIGNhbiBiZSByZXBlYXRlZC4gQSB0ZXh0IGNoYW5nZQotCSAqIGNhbiBiZSByZXBlYXRlZCBvbmx5IGlmIGl0IHdhcyBleGVjdXRlZCBhbmQgcm9sbGVkIGJhY2suCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhdCBsZWFzdCBvbiB0ZXh0IGNoYW5nZSBjYW4gYmUgcmVwZWF0ZWQKLQkgKi8KLQlib29sZWFuIHJlZG9hYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGNvbW1hbmQgc3RhY2suCi0JICovCi0Jdm9pZCBzZXRDb21tYW5kU3RhY2soQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayk7Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBsYXN0IGNvbW1hbmQgaW4gdGhlIHVuZG8gbWFuYWdlci4KLQkgKi8KLQl2b2lkIHVuZG8oKTsKLQotCS8qKgotCSAqIFVuZG8gdGhlIGxhc3QgY29tbWFuZCBpbiB0aGUgdW5kbyBtYW5hZ2VyIGFuZCBub3RpZnkgdGhlIHJlcXVlc3RlcgotCSAqIGFib3V0IHRoZSBuZXcgc2VsZWN0aW9uLgotCSAqLwotCXZvaWQgdW5kbyhJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciByZXF1ZXN0ZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIGF0IGxlYXN0IG9uZSB0ZXh0IGNoYW5nZSBjYW4gYmUgcm9sbGVkIGJhY2suCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhdCBsZWFzdCBvbmUgdGV4dCBjaGFuZ2UgY2FuIGJlIHJvbGxlZAotCSAqICAgICAgICAgYmFjawotCSAqLwotCWJvb2xlYW4gdW5kb2FibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA4NWY1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIFN0cnVjdHVyZWRUZXh0Q29tbWFuZCB7Ci0KLQlTdHJpbmcgZ2V0VGV4dERlbGV0ZWQoKTsKLQotCWludCBnZXRUZXh0RW5kKCk7Ci0KLQlTdHJpbmcgZ2V0VGV4dEluc2VydGVkKCk7Ci0KLQlpbnQgZ2V0VGV4dFN0YXJ0KCk7Ci0KLQl2b2lkIHNldFRleHREZWxldGVkKFN0cmluZyB0ZXh0RGVsZXRlZCk7Ci0KLQl2b2lkIHNldFRleHRFbmQoaW50IHRleHRFbmQpOwotCi0Jdm9pZCBzZXRUZXh0SW5zZXJ0ZWQoU3RyaW5nIHRleHRJbnNlcnRlZCk7Ci0KLQl2b2lkIHNldFRleHRTdGFydChpbnQgdGV4dFN0YXJ0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbW1hbmRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRDb21tYW5kSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGYyYmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbW1hbmRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cyBTdHJ1Y3R1cmVkVGV4dENvbW1hbmQgewotCi0JcHJvdGVjdGVkIElEb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOyAvLyBuZWVkZWQgZm9yIHVwZGF0aW5nIHRoZSB0ZXh0Ci0JcHJvdGVjdGVkIFN0cmluZyBmVGV4dERlbGV0ZWQgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZlRleHRFbmQgPSAtMTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZUZXh0SW5zZXJ0ZWQgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZlRleHRTdGFydCA9IC0xOwotCi0JLyoqCi0JICogV2UgaGF2ZSBuby1hcmcgY29uc3RydWN0b3Igbm9uLXB1YmxpYyB0byBmb3JjZSBkb2N1bWVudCB0byBiZSBzcGVjZmllZC4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMoKTsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7IC8vIG5lZWRlZCBmb3IgdXBkYXRpbmcgdGhlIHRleHQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCX0KLQotCS8qKgotCSAqIGdldFRleHREZWxldGVkIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRleHREZWxldGVkKCkgewotCQlyZXR1cm4gZlRleHREZWxldGVkOwotCX0KLQotCS8qKgotCSAqIHRleHRFbmQgaXMgdGhlIHNhbWUgYXMgKHRleHRTdGFydCArIHRleHRJbnNlcnRlZC5sZW5ndGgoKSkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmVGV4dEVuZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUZXh0SW5zZXJ0ZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGV4dEluc2VydGVkKCkgewotCQlyZXR1cm4gZlRleHRJbnNlcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUZXh0U3RhcnQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0U3RhcnQoKSB7Ci0JCXJldHVybiBmVGV4dFN0YXJ0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkvLyBub3RlOiBvbmUgb2YgdGhlIGZldyBwbGFjZXMgd2UgcHJvZ3JhbWF0aWNhbGx5IGlnbm9yZSByZWFkLW9ubHkKLQkJCS8vIHNldHRpbmdzCi0JCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudCkucmVwbGFjZVRleHQodGhpcywgZlRleHRTdGFydCwgZlRleHREZWxldGVkLmxlbmd0aCgpLCBmVGV4dEluc2VydGVkLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJZkRvY3VtZW50LnJlcGxhY2UoZlRleHRTdGFydCwgZlRleHREZWxldGVkLmxlbmd0aCgpLCBmVGV4dEluc2VydGVkKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBhc3N1bWVkIGltcG9zc2libGUsIGZvciBub3cKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogc2V0VGV4dERlbGV0ZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dERlbGV0ZWQoamF2YS5sYW5nLlN0cmluZyB0ZXh0RGVsZXRlZCkgewotCQlmVGV4dERlbGV0ZWQgPSB0ZXh0RGVsZXRlZDsKLQl9Ci0KLQkvKioKLQkgKiBzZXRUZXh0RW5kIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRFbmQoaW50IHRleHRFbmQpIHsKLQkJZlRleHRFbmQgPSB0ZXh0RW5kOwotCX0KLQotCS8qKgotCSAqIHNldFRleHRJbnNlcnRlZCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0SW5zZXJ0ZWQoamF2YS5sYW5nLlN0cmluZyB0ZXh0SW5zZXJ0ZWQpIHsKLQkJZlRleHRJbnNlcnRlZCA9IHRleHRJbnNlcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiBzZXRUZXh0U3RhcnQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFN0YXJ0KGludCB0ZXh0U3RhcnQpIHsKLQkJZlRleHRTdGFydCA9IHRleHRTdGFydDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoZkRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJLy8gbm90ZTogb25lIG9mIHRoZSBmZXcgcGxhY2VzIHdlIHByb2dyYW1hdGljYWxseSBpZ25vcmUgcmVhZC1vbmx5Ci0JCQkvLyBzZXR0aW5ncwotCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLnJlcGxhY2VUZXh0KHRoaXMsIGZUZXh0U3RhcnQsIGZUZXh0SW5zZXJ0ZWQubGVuZ3RoKCksIGZUZXh0RGVsZXRlZCwgdHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCWZEb2N1bWVudC5yZXBsYWNlKGZUZXh0U3RhcnQsIGZUZXh0SW5zZXJ0ZWQubGVuZ3RoKCksIGZUZXh0RGVsZXRlZCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gYXNzdW1lZCBpbXBvc3NpYmxlLCBmb3Igbm93Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmNzYzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGV4dGVuZHMgQ29tcG91bmRDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZEN1cnNvclBvc2l0aW9uIHsKLQlwcm90ZWN0ZWQgaW50IGZSZWRvQ3Vyc29yUG9zaXRpb24gPSAtMTsKLQlwcm90ZWN0ZWQgaW50IGZSZWRvU2VsZWN0aW9uTGVuZ3RoID0gMDsKLQotCXByb3RlY3RlZCBpbnQgZlVuZG9DdXJzb3JQb3NpdGlvbiA9IC0xOwotCXByb3RlY3RlZCBpbnQgZlVuZG9TZWxlY3Rpb25MZW5ndGggPSAwOwotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoaW50IHJlc3VsdEluZGV4KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKGludCByZXN1bHRJbmRleCwgamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoaW50IHJlc3VsdEluZGV4LCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsLCBqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwsIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoaW50IHJlc3VsdEluZGV4LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCwgZGVzY3JpcHRpb24sIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKFN0cmluZyBsYWJlbCwgamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIobGFiZWwsIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbiwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byBiZSBzZXQgdG8gYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHJlZG9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVkb0N1cnNvclBvc2l0aW9uKCkgewotCQlpbnQgY3Vyc29yUG9zaXRpb24gPSAtMTsKLQotCQlpZiAoZlJlZG9DdXJzb3JQb3NpdGlvbiAhPSAtMSkKLQkJCWN1cnNvclBvc2l0aW9uID0gZlJlZG9DdXJzb3JQb3NpdGlvbjsKLQkJZWxzZSBpZiAoIWNvbW1hbmRMaXN0LmlzRW1wdHkoKSkgewotCQkJaW50IGNvbW1hbmRMaXN0U2l6ZSA9IGNvbW1hbmRMaXN0LnNpemUoKTsKLQkJCUNvbW1hbmQgbGFzdENvbW1hbmQgPSAoQ29tbWFuZCkgY29tbWFuZExpc3QuZ2V0KGNvbW1hbmRMaXN0U2l6ZSAtIDEpOwotCi0JCQlpZiAobGFzdENvbW1hbmQgaW5zdGFuY2VvZiBDb21tYW5kQ3Vyc29yUG9zaXRpb24pCi0JCQkJY3Vyc29yUG9zaXRpb24gPSAoKENvbW1hbmRDdXJzb3JQb3NpdGlvbikgbGFzdENvbW1hbmQpLmdldFJlZG9DdXJzb3JQb3NpdGlvbigpOwotCQl9Ci0KLQkJcmV0dXJuIGN1cnNvclBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyByZWRvbmUuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlZG9TZWxlY3Rpb25MZW5ndGgoKSB7Ci0JCXJldHVybiBmUmVkb1NlbGVjdGlvbkxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gYmUgc2V0IHRvIGFmdGVyIHRoaXMgY29tbWFuZCBpcyB1bmRvbmUuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFVuZG9DdXJzb3JQb3NpdGlvbigpIHsKLQkJaW50IGN1cnNvclBvc2l0aW9uID0gLTE7Ci0KLQkJaWYgKGZVbmRvQ3Vyc29yUG9zaXRpb24gIT0gLTEpCi0JCQljdXJzb3JQb3NpdGlvbiA9IGZVbmRvQ3Vyc29yUG9zaXRpb247Ci0JCWVsc2UgaWYgKCFjb21tYW5kTGlzdC5pc0VtcHR5KCkpIHsKLQkJCS8vIG5ldmVyIHVzZWQKLQkJCS8vaW50IGNvbW1hbmRMaXN0U2l6ZSA9IGNvbW1hbmRMaXN0LnNpemUoKTsKLQkJCUNvbW1hbmQgZmlyc3RDb21tYW5kID0gKENvbW1hbmQpIGNvbW1hbmRMaXN0LmdldCgwKTsKLQotCQkJaWYgKGZpcnN0Q29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmRDdXJzb3JQb3NpdGlvbikKLQkJCQljdXJzb3JQb3NpdGlvbiA9ICgoQ29tbWFuZEN1cnNvclBvc2l0aW9uKSBmaXJzdENvbW1hbmQpLmdldFVuZG9DdXJzb3JQb3NpdGlvbigpOwotCQl9Ci0KLQkJcmV0dXJuIGN1cnNvclBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyB1bmRvbmUuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFVuZG9TZWxlY3Rpb25MZW5ndGgoKSB7Ci0JCXJldHVybiBmVW5kb1NlbGVjdGlvbkxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gYmUgdXNlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcmVkb25lLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZG9DdXJzb3JQb3NpdGlvbihpbnQgY3Vyc29yUG9zaXRpb24pIHsKLQkJZlJlZG9DdXJzb3JQb3NpdGlvbiA9IGN1cnNvclBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyByZWRvbmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVkb1NlbGVjdGlvbkxlbmd0aChpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCWZSZWRvU2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byBiZSB1c2VkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyB1bmRvbmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5kb0N1cnNvclBvc2l0aW9uKGludCBjdXJzb3JQb3NpdGlvbikgewotCQlmVW5kb0N1cnNvclBvc2l0aW9uID0gY3Vyc29yUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRleHQgdG8gYmUgc2VsZWN0ZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHVuZG9uZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmRvU2VsZWN0aW9uTGVuZ3RoKGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQkJZlVuZG9TZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb25MZW5ndGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYTliOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIGluaXRpYWwgSURvY3VtZW50RXh0ZW5zaW9uNCBzdXBwb3J0IC0gIzEwMjgyMgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgewotCi0JY2xhc3MgSW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lciBpbXBsZW1lbnRzIENvbW1hbmRTdGFja0xpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChFdmVudE9iamVjdCBldmVudCkgewotCQkJcmVzZXRJbnRlcm5hbENvbW1hbmRzKCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIHsKLQotCQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBEbyBub3RoaW5nLiBEbyBub3QgcHVzaCB0aGUgbmV3IG1vZGVsJ3Mgc3RydWN0dXJlZERvY3VtZW50Ci0JCQkvLyBjaGFuZ2VzCi0JCQkvLyBvbnRvIHRoZSB1bmRvIGNvbW1hbmQgc3RhY2ssIG9yIGVsc2UgdGhlIHVzZXIgbWF5IGJlIGFibGUgdG8KLQkJCS8vIHVuZG8KLQkJCS8vIGFuIGV4aXN0aW5nIGZpbGUgdG8gYW4gZW1wdHkgZmlsZS4KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCS8vIFNpbmNlICJubyBjaGFuZ2UiLCBkbyBub3RoaW5nLgotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzU3RydWN0dXJlZERvY3VtZW50RXZlbnQoU3RyaW5nIHRleHREZWxldGVkLCBTdHJpbmcgdGV4dEluc2VydGVkLCBpbnQgdGV4dFN0YXJ0LCBpbnQgdGV4dEVuZCkgewotCQkJaWYgKGZUZXh0Q29tbWFuZCAhPSBudWxsICYmIHRleHRTdGFydCA9PSBmVGV4dENvbW1hbmQuZ2V0VGV4dEVuZCgpKSB7Ci0JCQkJLy8gYXBwZW5kIHRvIHRoZSB0ZXh0IGNvbW1hbmQKLQkJCQlmVGV4dENvbW1hbmQuc2V0VGV4dERlbGV0ZWQoZlRleHRDb21tYW5kLmdldFRleHREZWxldGVkKCkuY29uY2F0KHRleHREZWxldGVkKSk7Ci0JCQkJZlRleHRDb21tYW5kLnNldFRleHRJbnNlcnRlZChmVGV4dENvbW1hbmQuZ2V0VGV4dEluc2VydGVkKCkuY29uY2F0KHRleHRJbnNlcnRlZCkpOwotCQkJCWZUZXh0Q29tbWFuZC5zZXRUZXh0RW5kKHRleHRFbmQpOwotCQkJfQotCQkJZWxzZSBpZiAoZlRleHRDb21tYW5kICE9IG51bGwgJiYgdGV4dFN0YXJ0ID09IGZUZXh0Q29tbWFuZC5nZXRUZXh0U3RhcnQoKSAtIDEgJiYgdGV4dEVuZCA8PSBmVGV4dENvbW1hbmQuZ2V0VGV4dEVuZCgpIC0gMSAmJiB0ZXh0RGVsZXRlZC5sZW5ndGgoKSA9PSAxICYmIHRleHRJbnNlcnRlZC5sZW5ndGgoKSA9PSAwICYmIGZUZXh0Q29tbWFuZC5nZXRUZXh0RGVsZXRlZCgpLmxlbmd0aCgpID4gMCkgewotCQkJCS8vIGJhY2tzcGFjZSBwcmVzc2VkCi0JCQkJLy8gZXJhc2UgYSBjaGFyYWN0ZXIgaW4gdGhlIGZpbGUKLQkJCQlmVGV4dENvbW1hbmQuc2V0VGV4dERlbGV0ZWQodGV4dERlbGV0ZWQuY29uY2F0KGZUZXh0Q29tbWFuZC5nZXRUZXh0RGVsZXRlZCgpKSk7Ci0JCQkJZlRleHRDb21tYW5kLnNldFRleHRTdGFydCh0ZXh0U3RhcnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY3JlYXRlTmV3VGV4dENvbW1hbmQodGV4dERlbGV0ZWQsIHRleHRJbnNlcnRlZCwgdGV4dFN0YXJ0LCB0ZXh0RW5kKTsKLQkJCX0KLQotCQkJLy8gc2F2ZSBjdXJzb3IgcG9zaXRpb24KLQkJCWZDdXJzb3JQb3NpdGlvbiA9IHRleHRFbmQ7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBOb3RlOiBmTGlzdGVuaW5nIHRlbGxzIHVzIGlmIHdlIHNob3VsZCBsaXN0ZW4gdG8gdGhlCi0JCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4KLQkJCS8vIGZMaXN0ZW5pbmcgaXMgc2V0IHRvIGZhbHNlIHJpZ2h0IGJlZm9yZSB0aGUgdW5kby9yZWRvIHByb2Nlc3MKLQkJCS8vIGFuZAotCQkJLy8gdGhlbiBzZXQgdG8gdHJ1ZSBhZ2FpbgotCQkJLy8gcmlnaHQgYWZ0ZXIgdGhlIHVuZG8vcmVkbyBwcm9jZXNzIHRvIGJsb2NrIG91dCBhbmQgaWdub3JlIGFsbAotCQkJLy8gU3RydWN0dXJlZERvY3VtZW50RXZlbnRzIGdlbmVyYXRlZAotCQkJLy8gYnkgdGhlIHVuZG8vcmVkbyBwcm9jZXNzLgotCi0JCQkvLyBQcm9jZXNzIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGlmIGZMaXN0ZW5pbmcgaXMgdHJ1ZS4KLQkJCS8vCi0JCQkvLyBXZSBhcmUgZXhlY3V0aW5nIGEgY29tbWFuZCBmcm9tIHRoZSBjb21tYW5kIHN0YWNrIGlmIHRoZQotCQkJLy8gcmVxdWVzdGVyCi0JCQkvLyBpcyBhIGNvbW1hbmQgKGZvciBleGFtcGxlLCB1bmRvL3JlZG8pLgotCQkJLy8gV2Ugc2hvdWxkIG5vdCBwcm9jZXNzIHRoZSBmbGF0IG1vZGVsIGV2ZW50IHdoZW4gd2UgYXJlCi0JCQkvLyBleGVjdXRpbmcgYQotCQkJLy8gY29tbWFuZCBmcm9tIHRoZSBjb21tYW5kIHN0YWNrLgotCQkJaWYgKGZVbmRvTWFuYWdlbWVudEVuYWJsZWQgJiYgIShzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpIGluc3RhbmNlb2YgQ29tbWFuZCkpIHsKLQkJCQkvLyBjaGVjayByZXF1ZXN0ZXIgaWYgbm90IHJlY29yZGluZwotCQkJCWlmICghZlJlY29yZGluZykKLQkJCQkJY2hlY2tSZXF1ZXN0ZXIoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSk7Ci0KLQkJCQkvLyBwcm9jZXNzIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudAotCQkJCVN0cmluZyB0ZXh0RGVsZXRlZCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldERlbGV0ZWRUZXh0KCk7Ci0JCQkJU3RyaW5nIHRleHRJbnNlcnRlZCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFRleHQoKTsKLQkJCQlpbnQgdGV4dFN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T2Zmc2V0KCk7Ci0JCQkJaW50IHRleHRFbmQgPSB0ZXh0U3RhcnQgKyB0ZXh0SW5zZXJ0ZWQubGVuZ3RoKCk7Ci0JCQkJcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KHRleHREZWxldGVkLCB0ZXh0SW5zZXJ0ZWQsIHRleHRTdGFydCwgdGV4dEVuZCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ0hBTkdFX1RFWFQgPSBTU0VDb3JlTWVzc2FnZXMuVGV4dF9DaGFuZ2VfVUlfOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBDb21tYW5kU3RhY2sgZkNvbW1hbmRTdGFjayA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgZkNvbXBvdW5kQ29tbWFuZCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNvbXBvdW5kQ29tbWFuZERlc2NyaXB0aW9uID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmQ29tcG91bmRDb21tYW5kTGFiZWwgPSBudWxsOwotCWludCBmQ3Vyc29yUG9zaXRpb24gPSAwOwotCS8vIHByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBmU3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyIGZJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyOwotCS8vIHByaXZhdGUgTWFwIGZUZXh0Vmlld2VyVG9MaXN0ZW5lck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci0JcHJpdmF0ZSBJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvcltdIGZNZWRpYXRvcnMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmUmVjb3JkaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgZlJlY29yZGluZ0NvdW50ID0gMDsKLQlwcml2YXRlIE9iamVjdCBmUmVxdWVzdGVyOwotCVN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwgZlRleHRDb21tYW5kID0gbnVsbDsKLQlwcml2YXRlIGludCBmVW5kb0N1cnNvclBvc2l0aW9uID0gLTE7Ci0JYm9vbGVhbiBmVW5kb01hbmFnZW1lbnRFbmFibGVkID0gdHJ1ZTsKLQlwcml2YXRlIGludCBmVW5kb1NlbGVjdGlvbkxlbmd0aCA9IDA7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcigpIHsKLQkJdGhpcyhuZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIoQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQlzZXRDb21tYW5kU3RhY2soY29tbWFuZFN0YWNrKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvcihJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBtZWRpYXRvcikgewotCQlpZiAoIVV0aWxpdGllcy5jb250YWlucyhmTWVkaWF0b3JzLCBtZWRpYXRvcikpIHsKLQkJCWludCBvbGRTaXplID0gMDsKLQotCQkJaWYgKGZNZWRpYXRvcnMgIT0gbnVsbCkgewotCQkJCS8vIG5vcm1hbGx5IHdvbid0IGJlIG51bGwsIGJ1dCB3ZSBuZWVkIHRvIGJlIHN1cmUsIGZvciBmaXJzdAotCQkJCS8vIHRpbWUgdGhyb3VnaAotCQkJCW9sZFNpemUgPSBmTWVkaWF0b3JzLmxlbmd0aDsKLQkJCX0KLQotCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCUlEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yW10gbmV3TWVkaWF0b3JzID0gbmV3IElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yW25ld1NpemVdOwotCQkJaWYgKGZNZWRpYXRvcnMgIT0gbnVsbCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoZk1lZGlhdG9ycywgMCwgbmV3TWVkaWF0b3JzLCAwLCBvbGRTaXplKTsKLQkJCX0KLQotCQkJLy8gYWRkIHRoZSBuZXcgdW5kbyBtZWRpYXRvciB0byBsYXN0IHBvc2l0aW9uCi0JCQluZXdNZWRpYXRvcnNbbmV3U2l6ZSAtIDFdID0gbWVkaWF0b3I7Ci0KLQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCWZNZWRpYXRvcnMgPSBuZXdNZWRpYXRvcnM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZW1vdmVEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yKG1lZGlhdG9yKTsKLQkJCWFkZERvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IobWVkaWF0b3IpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlcikgewotCQliZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCQliZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIG51bGwsIG51bGwpOwotCi0JCWZVbmRvQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQkJZlVuZG9TZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb25MZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIG51bGwpOwotCi0JCWZVbmRvQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQkJZlVuZG9TZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb25MZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJLy8gc2F2ZSB0aGUgcmVxdWVzdGVyCi0JCWZSZXF1ZXN0ZXIgPSByZXF1ZXN0ZXI7Ci0KLQkJLy8gdXBkYXRlIGxhYmVsIGFuZCBkZXNjIG9ubHkgb24gdGhlIGZpcnN0IGxldmVsIHdoZW4gcmVjb3JkaW5nIGlzCi0JCS8vIG5lc3RlZAotCQlpZiAoZlJlY29yZGluZ0NvdW50ID09IDApIHsKLQkJCWZDb21wb3VuZENvbW1hbmRMYWJlbCA9IGxhYmVsOwotCQkJaWYgKGZDb21wb3VuZENvbW1hbmRMYWJlbCA9PSBudWxsKQotCQkJCWZDb21wb3VuZENvbW1hbmRMYWJlbCA9IFRFWFRfQ0hBTkdFX1RFWFQ7Ci0KLQkJCWZDb21wb3VuZENvbW1hbmREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQkJaWYgKGZDb21wb3VuZENvbW1hbmREZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJCWZDb21wb3VuZENvbW1hbmREZXNjcmlwdGlvbiA9IFRFWFRfQ0hBTkdFX1RFWFQ7Ci0KLQkJCS8vIGNsZWFyIGNvbW1hbmRzCi0JCQlmVGV4dENvbW1hbmQgPSBudWxsOwotCQkJZkNvbXBvdW5kQ29tbWFuZCA9IG51bGw7Ci0JCX0KLQotCQkvLyB1cGRhdGUgY291bnRlciBhbmQgZmxhZwotCQlmUmVjb3JkaW5nQ291bnQrKzsKLQkJZlJlY29yZGluZyA9IHRydWU7Ci0KLQkJLy8gbm8gdW5kbyBjdXJzb3IgcG9zaXRpb24gYW5kIHVuZG8gc2VsZWN0aW9uIGxlbmd0aCBzcGVjaWZpZWQKLQkJLy8gcmVzZXQgdW5kbyBjdXJzb3IgcG9zaXRpb24gYW5kIHVuZG8gc2VsZWN0aW9uIGxlbmd0aAotCQlmVW5kb0N1cnNvclBvc2l0aW9uID0gLTE7Ci0JCWZVbmRvU2VsZWN0aW9uTGVuZ3RoID0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIGRlc2NyaXB0aW9uKTsKLQotCQlmVW5kb0N1cnNvclBvc2l0aW9uID0gY3Vyc29yUG9zaXRpb247Ci0JCWZVbmRvU2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uTGVuZ3RoOwotCX0KLQotCXZvaWQgY2hlY2tSZXF1ZXN0ZXIoT2JqZWN0IHJlcXVlc3RlcikgewotCQlpZiAoZlJlcXVlc3RlciAhPSBudWxsICYmICFmUmVxdWVzdGVyLmVxdWFscyhyZXF1ZXN0ZXIpKSB7Ci0JCQkvLyBGb3JjZSByZXN0YXJ0IG9mIHJlY29yZGluZyBzbyB0aGUgbGFzdCBjb21wb3VuZCBjb21tYW5kIGlzCi0JCQkvLyBjbG9zZWQuCi0JCQkvLwotCQkJLy8gSG93ZXZlciwgd2Ugc2hvdWxkIG5vdCBmb3JjZSByZXN0YXJ0IG9mIHJlY29yZGluZyB3aGVuIHRoZQotCQkJLy8gcmVxdWVzdCBjYW1lIGZyb20gU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlciBvcgotCQkJLy8gWE1MTW9kZWxJbXBsCi0JCQkvLyBiZWNhdXNlIGN1dC9wYXN0ZSByZXF1ZXN0cyBhbmQgY2hhcmFjdGVyIGluc2VydHMgdG8gdGhlCi0JCQkvLyB0ZXh0Vmlld2VyIGFyZSBmcm9tIFN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIsCi0JCQkvLyBhbmQgcmVxdWVzdHMgdG8gZGVsZXRlIGEgbm9kZSBpbiB0aGUgWE1MVGFibGVUcmVlVmlld2VyIGFyZQotCQkJLy8gZnJvbSBYTUxNb2RlbEltcGwgKHdoaWNoIGltcGxlbWVudHMgSVN0cnVjdHVyZWRNb2RlbCkuCi0KLQkJCWlmICghKHJlcXVlc3RlciBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkTW9kZWwgfHwgcmVxdWVzdGVyIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkpIHsKLQkJCQlyZXNldEludGVybmFsQ29tbWFuZHMoKTsKLQkJCX0KLQkJfQotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCBjb25uZWN0KElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIG1lZGlhdG9yKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobWVkaWF0b3IpOwotCQlpZiAoZkRvY3VtZW50ID09IG51bGwpIHsKLQkJCS8vIGFkZCB0aGlzIHVuZG8gbWFuYWdlciBhcyBzdHJ1Y3R1cmVkIGRvY3VtZW50IGxpc3RlbmVyCi0JCQlmRG9jdW1lbnQgPSBtZWRpYXRvci5nZXREb2N1bWVudCgpOwotCQkJLy8gZnV0dXJlX1RPRE86IGV2ZW50dWFsbHkgd2Ugd2FudCB0byByZWZhY3RvciBvciBhbGxvdyBlaXRoZXIKLQkJCS8vIHR5cGUgb2YgZG9jdW1lbnQsIGJ1dCBmb3Igbm93LCB3ZSdsbCBkbyBpbnN0YW5jZW9mIGNoZWNrLCBhbmQKLQkJCS8vIGZhaWwKLQkJCS8vIGlmIG5vdCByaWdodCB0eXBlCi0JCQlpZiAoZkRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudCkgZkRvY3VtZW50KS5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihnZXRJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib25seSBtZWRpdGF0b3Igd2l0aCBzdHJ1Y3R1cmVkIGRvY3VtZW50cyBjdXJyZW50bHkgaGFuZGxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBpZiB3ZSd2ZSBhbHJlYWR5IGhhZCBvdXIgZG9jdW1lbnQgc2V0LCB3ZSdsbCBqdXN0IGRvIHRoaXMgZmFpbAotCQkJLy8gZmFzdCBpbnRlZ3JpdHkgY2hlY2sKLQkJCWlmICghZkRvY3VtZW50LmVxdWFscyhtZWRpYXRvci5nZXREb2N1bWVudCgpKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb25uZWN0aW9uIHRvIHVuZG8gbWFuYWdlciBmYWlsZWQuIERvY3VtZW50IGZvciBkb2N1bWVudCBzZWxlY3Rpb24gbWVkaWF0b3IgaW5jb25pc3RlbnQgd2l0aCB1bmRvIG1hbmFnZXIuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWFkZERvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IobWVkaWF0b3IpOwotCX0KLQotCXZvaWQgY3JlYXRlTmV3VGV4dENvbW1hbmQoU3RyaW5nIHRleHREZWxldGVkLCBTdHJpbmcgdGV4dEluc2VydGVkLCBpbnQgdGV4dFN0YXJ0LCBpbnQgdGV4dEVuZCkgewotCQlTdHJ1Y3R1cmVkVGV4dENvbW1hbmRJbXBsIHRleHRDb21tYW5kID0gbmV3IFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwoZkRvY3VtZW50KTsKLQkJdGV4dENvbW1hbmQuc2V0TGFiZWwoVEVYVF9DSEFOR0VfVEVYVCk7Ci0JCXRleHRDb21tYW5kLnNldERlc2NyaXB0aW9uKFRFWFRfQ0hBTkdFX1RFWFQpOwotCQl0ZXh0Q29tbWFuZC5zZXRUZXh0U3RhcnQodGV4dFN0YXJ0KTsKLQkJdGV4dENvbW1hbmQuc2V0VGV4dEVuZCh0ZXh0RW5kKTsKLQkJdGV4dENvbW1hbmQuc2V0VGV4dERlbGV0ZWQodGV4dERlbGV0ZWQpOwotCQl0ZXh0Q29tbWFuZC5zZXRUZXh0SW5zZXJ0ZWQodGV4dEluc2VydGVkKTsKLQotCQlpZiAoZlJlY29yZGluZykgewotCQkJaWYgKGZDb21wb3VuZENvbW1hbmQgPT0gbnVsbCkgewotCQkJCVN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb21wb3VuZENvbW1hbmQgPSBuZXcgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKCk7Ci0JCQkJY29tcG91bmRDb21tYW5kLnNldFVuZG9DdXJzb3JQb3NpdGlvbihmVW5kb0N1cnNvclBvc2l0aW9uKTsKLQkJCQljb21wb3VuZENvbW1hbmQuc2V0VW5kb1NlbGVjdGlvbkxlbmd0aChmVW5kb1NlbGVjdGlvbkxlbmd0aCk7Ci0KLQkJCQljb21wb3VuZENvbW1hbmQuc2V0TGFiZWwoZkNvbXBvdW5kQ29tbWFuZExhYmVsKTsKLQkJCQljb21wb3VuZENvbW1hbmQuc2V0RGVzY3JpcHRpb24oZkNvbXBvdW5kQ29tbWFuZERlc2NyaXB0aW9uKTsKLQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKHRleHRDb21tYW5kKTsKLQotCQkJCWZDb21wb3VuZENvbW1hbmQgPSBjb21wb3VuZENvbW1hbmQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmQ29tcG91bmRDb21tYW5kLmFwcGVuZCh0ZXh0Q29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmQ29tbWFuZFN0YWNrLmV4ZWN1dGUodGV4dENvbW1hbmQpOwotCQl9Ci0KLQkJZlRleHRDb21tYW5kID0gdGV4dENvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogRGlzYWJsZSB1bmRvIG1hbmFnZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzYWJsZVVuZG9NYW5hZ2VtZW50KCkgewotCQlmVW5kb01hbmFnZW1lbnRFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBtZWRpYXRvcikgewotCQlyZW1vdmVEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yKG1lZGlhdG9yKTsKLQotCQlpZiAoZk1lZGlhdG9ycyAhPSBudWxsICYmIGZNZWRpYXRvcnMubGVuZ3RoID09IDAgJiYgZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCS8vIHJlbW92ZSB0aGlzIHVuZG8gbWFuYWdlciBhcyBzdHJ1Y3R1cmVkIGRvY3VtZW50IGxpc3RlbmVyCi0JCQkvLyBmdXR1cmVfVE9ETzogZXZlbnR1YWxseSB3ZSB3YW50IHRvIHJlZmFjdG9yIG9yIGFsbG93IGVpdGhlcgotCQkJLy8gdHlwZSBvZiBkb2N1bWVudCwgYnV0IGZvciBub3csIHdlJ2xsIGRvIGluc3RhbmNlb2YgY2hlY2ssIGFuZAotCQkJLy8gZmFpbAotCQkJLy8gaWYgbm90IHJpZ2h0IHR5cGUKLQkJCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGdldEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJvbmx5IG1lZGl0YXRvciB3aXRoIHN0cnVjdHVyZWQgZG9jdW1lbnRzIGN1cnJlbnRseSBoYW5kbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIGlmIG5vIGxvbmdlciBsaXN0ZW5pbmcgdG8gZG9jdW1lbnQsIHRoZW4gZG9udCBldmVuIHRyYWNrIGl0Ci0JCQkvLyBhbnltb3JlCi0JCQkvLyAodGhpcyBhbGxvd3MgY29ubmVjdCB0byByZWNvbm5lY3QgdG8gZG9jdW1lbnQgYWdhaW4pCi0JCQlmRG9jdW1lbnQgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZW5hYmxlVW5kb01hbmFnZW1lbnQoKSB7Ci0JCWZVbmRvTWFuYWdlbWVudEVuYWJsZWQgPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IChmVGV4dENvbW1hbmQgIT0gbnVsbCkgPyBmVGV4dENvbW1hbmQuZ2V0VGV4dEVuZCgpIDogLTE7Ci0JCWludCBzZWxlY3Rpb25MZW5ndGggPSAwOwotCi0JCWVuZFJlY29yZGluZyhyZXF1ZXN0ZXIsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQkJLy8gUmVjb3JkaW5nIGNvdWxkIGJlIHN0b3BwZWQgYnkgZm9yY2VFbmRPZlBlbmRpbmdDb21tYW5kKCkuIE1ha2Ugc3VyZQotCQkvLyB3ZSBhcmUgc3RpbGwgcmVjb3JkaW5nIGJlZm9yZSBwcm9jZWVkaW5nLCBvciBlbHNlIGZSZWNvcmRpbmdDb3VudAotCQkvLyBtYXkgbm90IGJlIGJhbGFuY2VkLgotCQlpZiAoZlJlY29yZGluZykgewotCQkJaWYgKGZDb21wb3VuZENvbW1hbmQgIT0gbnVsbCkgewotCQkJCWZDb21wb3VuZENvbW1hbmQuc2V0UmVkb0N1cnNvclBvc2l0aW9uKGN1cnNvclBvc2l0aW9uKTsKLQkJCQlmQ29tcG91bmRDb21tYW5kLnNldFJlZG9TZWxlY3Rpb25MZW5ndGgoc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCX0KLQotCQkJLy8gZW5kIHJlY29yZGluZyBpcyBhIGxvZ2ljYWwgc3RvcHBpbmcgcG9pbnQgZm9yIHRleHQgY29tbWFuZCwKLQkJCS8vIGV2ZW4gd2hlbiBmUmVjb3JkaW5nQ291bnQgPiAwIChpbiBuZXN0ZWQgYmVnaW5SZWNvcmRpbmcpCi0JCQlmVGV4dENvbW1hbmQgPSBudWxsOwotCi0JCQkvLyB1cGRhdGUgY291bnRlciBhbmQgZmxhZwotCQkJaWYgKGZSZWNvcmRpbmdDb3VudCA+IDApCi0JCQkJZlJlY29yZGluZ0NvdW50LS07Ci0JCQlpZiAoZlJlY29yZGluZ0NvdW50ID09IDApIHsKLQkJCQkKLQkJCQkvLyBGaW5hbGx5IGV4ZWN1dGUgdGhlIGNvbW1hbmRzIGFjY3VtdWxhdGVkIGluIHRoZSBjb21wb3VuZCBjb21tYW5kLgotCQkJCQotCQkJCWlmIChmQ29tcG91bmRDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJZkNvbW1hbmRTdGFjay5leGVjdXRlKGZDb21wb3VuZENvbW1hbmQpOwotCQkJCX0KLQkJCQkKLQkJCQlmUmVjb3JkaW5nID0gZmFsc2U7Ci0KLQkJCQkvLyByZXNldCBjb21wb3VuZCBjb21tYW5kIG9ubHkgd2hlbiBmUmVjb3JkaW5nQ291bnQgPT0KLQkJCQkvLyAwCi0JCQkJZkNvbXBvdW5kQ29tbWFuZCA9IG51bGw7Ci0JCQkJZkNvbXBvdW5kQ29tbWFuZExhYmVsID0gbnVsbDsKLQkJCQlmQ29tcG91bmRDb21tYW5kRGVzY3JpcHRpb24gPSBudWxsOwotCi0JCQkJLy8gQWxzbyByZXNldCBmUmVxdWVzdGVyCi0JCQkJZlJlcXVlc3RlciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byBmaW5kIG1vZGVsIGdpdmVuIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGZpbmRTdHJ1Y3R1cmVkTW9kZWwoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIjZm9yY2VFbmRPZlBlbmRpbmdDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JjZUVuZE9mUGVuZGluZ0NvbW1hbmQoT2JqZWN0IHJlcXVlc3RlciwgaW50IGN1cnJlbnRQb3NpdGlvbiwgaW50IGxlbmd0aCkgewotCQlpZiAoZlJlY29yZGluZykKLQkJCWVuZFJlY29yZGluZyhyZXF1ZXN0ZXIsIGN1cnJlbnRQb3NpdGlvbiwgbGVuZ3RoKTsKLQkJZWxzZQotCQkJcmVzZXRJbnRlcm5hbENvbW1hbmRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciNnZXRDb21tYW5kU3RhY2soKQotCSAqLwotCXB1YmxpYyBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gZkNvbW1hbmRTdGFjazsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kU3RhY2tMaXN0ZW5lciBnZXRJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyKCkgewotCQlpZiAoZkludGVybmFsQ29tbWFuZFN0YWNrTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZkludGVybmFsQ29tbWFuZFN0YWNrTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiBmSW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgZ2V0SW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcigpIHsKLQkJaWYgKGZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyID09IG51bGwpIHsKLQkJCWZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyID0gbmV3IEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIoKTsKLQkJfQotCQlyZXR1cm4gZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIENvbW1hbmQgZ2V0UmVkb0NvbW1hbmQoKSB7Ci0JCXJldHVybiBmQ29tbWFuZFN0YWNrLmdldFJlZG9Db21tYW5kKCk7Ci0JfQotCi0JcHVibGljIENvbW1hbmQgZ2V0VW5kb0NvbW1hbmQoKSB7Ci0JCXJldHVybiBmQ29tbWFuZFN0YWNrLmdldFVuZG9Db21tYW5kKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJcmVkbyhudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3RlcikgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gZmluZFN0cnVjdHVyZWRNb2RlbChmRG9jdW1lbnQpOwotCi0JCWlmIChyZWRvYWJsZSgpKSB7Ci0JCQlJRG9jdW1lbnRFeHRlbnNpb240IGRvY0V4dDQgPSBudWxsOwotCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiByZXdyaXRlU2Vzc2lvbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCUNvbW1hbmQgcmVkb0NvbW1hbmQgPSBnZXRSZWRvQ29tbWFuZCgpOwotCQkJCWlmIChyZWRvQ29tbWFuZCBpbnN0YW5jZW9mIENvbXBvdW5kQ29tbWFuZCAmJgotCQkJCQkJbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJCWRvY0V4dDQgPSAoSURvY3VtZW50RXh0ZW5zaW9uNCltb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQkJcmV3cml0ZVNlc3Npb24gPSAoZG9jRXh0NCA9PSBudWxsKSA/IG51bGwgOgotCQkJCQlkb2NFeHQ0LnN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEKTsKLQotCQkJCS8vIG1ha2Ugc3VyZSB0byByZWRvIGJlZm9yZSBzZXR0aW5nIGRvY3VtZW50IHNlbGVjdGlvbgotCQkJCWZDb21tYW5kU3RhY2sucmVkbygpOwotCi0JCQkJLy8gc2V0IGRvY3VtZW50IHNlbGVjdGlvbgotCQkJCXNldFJlZG9Eb2N1bWVudFNlbGVjdGlvbihyZXF1ZXN0ZXIsIHJlZG9Db21tYW5kKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChkb2NFeHQ0ICE9IG51bGwgJiYgcmV3cml0ZVNlc3Npb24gIT0gbnVsbCkKLQkJCQkJZG9jRXh0NC5zdG9wUmV3cml0ZVNlc3Npb24ocmV3cml0ZVNlc3Npb24pOwotCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWRvYWJsZSgpIHsKLQkJcmV0dXJuIGZDb21tYW5kU3RhY2suY2FuUmVkbygpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIG1lZGlhdG9yKSB7Ci0JCWlmIChmTWVkaWF0b3JzICE9IG51bGwgJiYgbWVkaWF0b3IgIT0gbnVsbCkgewotCQkJLy8gaWYgaXRzIG5vdCBpbiB0aGUgYXJyYXksIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmTWVkaWF0b3JzLCBtZWRpYXRvcikpIHsKLQkJCQlpbnQgb2xkU2l6ZSA9IGZNZWRpYXRvcnMubGVuZ3RoOwotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3JbXSBuZXdNZWRpYXRvcnMgPSBuZXcgSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3JbbmV3U2l6ZV07Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQlpZiAoZk1lZGlhdG9yc1tpXSA9PSBtZWRpYXRvcikgeyAvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlIHJlbW92aW5nCi0JCQkJCQluZXdNZWRpYXRvcnNbaW5kZXgrK10gPSBmTWVkaWF0b3JzW2ldOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzIHN3aXRjaCBpdCBmb3IgdGhlIG9sZAotCQkJCS8vIG9uZQotCQkJCWZNZWRpYXRvcnMgPSBuZXdNZWRpYXRvcnM7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlc2V0SW50ZXJuYWxDb21tYW5kcygpIHsKLQkJLy8gRWl0aGVyIHRoZSByZXF1ZXN0ZXIgb2YgdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQgY2hhbmdlIGV2ZW50IGlzCi0JCS8vIGNoYW5nZWQsIG9yIHRoZSBjb21tYW5kIHN0YWNrIGlzIGNoYW5nZWQuIE5lZWQgdG8gcmVzZXQgaW50ZXJuYWwKLQkJLy8gY29tbWFuZHMgc28gd2Ugd29uJ3QgY29udGludWUgdG8gYXBwZW5kIGNoYW5nZXMuCi0JCWZDb21wb3VuZENvbW1hbmQgPSBudWxsOwotCQlmVGV4dENvbW1hbmQgPSBudWxsOwotCi0JCS8vIEFsc28gcmVzZXQgZlJlcXVlc3RlcgotCQlmUmVxdWVzdGVyID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21tYW5kU3RhY2soQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQlpZiAoZkNvbW1hbmRTdGFjayAhPSBudWxsKQotCQkJZkNvbW1hbmRTdGFjay5yZW1vdmVDb21tYW5kU3RhY2tMaXN0ZW5lcihnZXRJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyKCkpOwotCi0JCWZDb21tYW5kU3RhY2sgPSBjb21tYW5kU3RhY2s7Ci0KLQkJaWYgKGZDb21tYW5kU3RhY2sgIT0gbnVsbCkKLQkJCWZDb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoZ2V0SW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVkb0RvY3VtZW50U2VsZWN0aW9uKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3RlciwgQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IC0xOwotCQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gMDsKLQotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmRDdXJzb3JQb3NpdGlvbikgewotCQkJQ29tbWFuZEN1cnNvclBvc2l0aW9uIGNvbW1hbmRDdXJzb3JQb3NpdGlvbiA9IChDb21tYW5kQ3Vyc29yUG9zaXRpb24pIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRSZWRvQ3Vyc29yUG9zaXRpb24oKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRSZWRvU2VsZWN0aW9uTGVuZ3RoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Q29tbWFuZCkgewotCQkJU3RydWN0dXJlZFRleHRDb21tYW5kIHN0cnVjdHVyZWRUZXh0Q29tbWFuZCA9IChTdHJ1Y3R1cmVkVGV4dENvbW1hbmQpIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0U3RhcnQoKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0SW5zZXJ0ZWQoKS5sZW5ndGgoKTsKLQkJfQotCi0JCWlmIChjdXJzb3JQb3NpdGlvbiA+IC0xICYmIGZNZWRpYXRvcnMgIT0gbnVsbCAmJiBmTWVkaWF0b3JzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZk1lZGlhdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGZNZWRpYXRvcnNbaV0uZ2V0RG9jdW1lbnQoKTsKLQkJCQlmTWVkaWF0b3JzW2ldLnVuZG9PcGVyYXRpb25TZWxlY3Rpb25DaGFuZ2VkKG5ldyBVbmRvRG9jdW1lbnRFdmVudChyZXF1ZXN0ZXIsIGRvY3VtZW50LCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VW5kb0RvY3VtZW50U2VsZWN0aW9uKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3RlciwgQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IC0xOwotCQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gMDsKLQotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmRDdXJzb3JQb3NpdGlvbikgewotCQkJQ29tbWFuZEN1cnNvclBvc2l0aW9uIGNvbW1hbmRDdXJzb3JQb3NpdGlvbiA9IChDb21tYW5kQ3Vyc29yUG9zaXRpb24pIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRVbmRvQ3Vyc29yUG9zaXRpb24oKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRVbmRvU2VsZWN0aW9uTGVuZ3RoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Q29tbWFuZCkgewotCQkJU3RydWN0dXJlZFRleHRDb21tYW5kIHN0cnVjdHVyZWRUZXh0Q29tbWFuZCA9IChTdHJ1Y3R1cmVkVGV4dENvbW1hbmQpIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0U3RhcnQoKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0RGVsZXRlZCgpLmxlbmd0aCgpOwotCQl9Ci0KLQkJaWYgKGN1cnNvclBvc2l0aW9uID4gLTEgJiYgZk1lZGlhdG9ycyAhPSBudWxsICYmIGZNZWRpYXRvcnMubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmTWVkaWF0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZk1lZGlhdG9yc1tpXS5nZXREb2N1bWVudCgpOwotCQkJCWZNZWRpYXRvcnNbaV0udW5kb09wZXJhdGlvblNlbGVjdGlvbkNoYW5nZWQobmV3IFVuZG9Eb2N1bWVudEV2ZW50KHJlcXVlc3RlciwgZG9jdW1lbnQsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXVuZG8obnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbyhJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciByZXF1ZXN0ZXIpIHsKLQkJLy8gRm9yY2UgYW4gZW5kUmVjb3JkaW5nIGJlZm9yZSB1bmRvLgotCQkvLwotCQkvLyBGb3IgZXhhbXBsZSwgcmVjb3JkaW5nIHdhcyB0dXJuZWQgb24gb24gdGhlIERlc2lnbiBQYWdlIG9mCi0JCS8vIFBhZ2VEZXNpZ25lci4KLQkJLy8gVGhlbiB1bmRvIGlzIGludm9rZWQgb24gdGhlIFNvdXJjZSBQYWdlLiBSZWNvcmRpbmcgc2hvdWxkIGJlCi0JCS8vIHN0b3BwZWQgYmVmb3JlIHdlIHVuZG8uCi0JCS8vIE5vdGUgdGhhdCByZWRvIHNob3VsZCBub3QgYmUgYXZhaWxhYmxlIHdoZW4gd2Ugc3dpdGNoIHRvIHRoZSBTb3VyY2UKLQkJLy8gUGFnZS4KLQkJLy8gVGhlcmVmb3JlLCB0aGlzIGZvcmNlIGVuZGluZyBvZiByZWNvcmRpbmcgaXMgbm90IG5lZWRlZCBpbiByZWRvLgotCQlpZiAoZlJlY29yZGluZykKLQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQotCQlpZiAodW5kb2FibGUoKSkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IGZpbmRTdHJ1Y3R1cmVkTW9kZWwoZkRvY3VtZW50KTsKLQkJCUlEb2N1bWVudEV4dGVuc2lvbjQgZG9jRXh0NCA9IG51bGw7Ci0JCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uIHJld3JpdGVTZXNzaW9uID0gbnVsbDsKLQotCQkJdHJ5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQlDb21tYW5kIHVuZG9Db21tYW5kID0gZ2V0VW5kb0NvbW1hbmQoKTsKLQkJCQlpZiAodW5kb0NvbW1hbmQgaW5zdGFuY2VvZiBDb21wb3VuZENvbW1hbmQgJiYKLQkJCQkJCW1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpIGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uNCkgewotCQkJCQlkb2NFeHQ0ID0gKElEb2N1bWVudEV4dGVuc2lvbjQpbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJfQotCQkJCXJld3JpdGVTZXNzaW9uID0gKGRvY0V4dDQgPT0gbnVsbCkgPyBudWxsIDoKLQkJCQkJZG9jRXh0NC5zdGFydFJld3JpdGVTZXNzaW9uKERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRCk7Ci0JCQkJCi0JCQkJLy8gbWFrZSBzdXJlIHRvIHVuZG8gYmVmb3JlIHNldHRpbmcgZG9jdW1lbnQgc2VsZWN0aW9uCi0JCQkJZkNvbW1hbmRTdGFjay51bmRvKCk7Ci0KLQkJCQkvLyBzZXQgZG9jdW1lbnQgc2VsZWN0aW9uCi0JCQkJc2V0VW5kb0RvY3VtZW50U2VsZWN0aW9uKHJlcXVlc3RlciwgdW5kb0NvbW1hbmQpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKGRvY0V4dDQgIT0gbnVsbCAmJiByZXdyaXRlU2Vzc2lvbiAhPSBudWxsKQotCQkJCQlkb2NFeHQ0LnN0b3BSZXdyaXRlU2Vzc2lvbihyZXdyaXRlU2Vzc2lvbik7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHVuZG9hYmxlKCkgewotCQlyZXR1cm4gZkNvbW1hbmRTdGFjay5jYW5VbmRvKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1VuZG9Eb2N1bWVudEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vVW5kb0RvY3VtZW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZlZTQ2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vVW5kb0RvY3VtZW50RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgVW5kb0RvY3VtZW50RXZlbnQgewotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZPZmZzZXQ7Ci0JcHJpdmF0ZSBJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBmUmVxdWVzdGVyOwotCi0JcHVibGljIFVuZG9Eb2N1bWVudEV2ZW50KElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3RlciwgSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWZSZXF1ZXN0ZXIgPSByZXF1ZXN0ZXI7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gZk9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgZ2V0UmVxdWVzdGVyKCkgewotCQlyZXR1cm4gZlJlcXVlc3RlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvQWJzdHJhY3RNZW1vcnlMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0Fic3RyYWN0TWVtb3J5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjNjBhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvQWJzdHJhY3RNZW1vcnlMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKiAgICAgDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47DQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7DQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0Ow0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZ2lzdHJhdGlvbjsNCi1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudDsNCi1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudEFkbWluOw0KLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50Q29uc3RhbnRzOw0KLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50SGFuZGxlcjsNCi0NCi0vKioNCi0gKiBUaGlzIHJlc3BvbmRzIHRvIG1lbW9yeSBldmVudHMuDQotICogDQotICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgY2hpbGQgb2YgdGhpcyBjbGFzcyB3aXRoIHRoZSBldmVudHMgeW91IGFyZSBpbnRlcmVzdGVkIGluLg0KLSAqIFRoZW4gY2FsbCBjb25uZWN0KCkgdG8gc3RhcnQgbGlzdGVuaW5nLiBUbyBzdG9wIGxpc3RlbmluZyBjYWxsIGRpc2Nvbm5lY3QoKTsNCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZW1vcnlMaXN0ZW5lciBpbXBsZW1lbnRzIEV2ZW50SGFuZGxlciB7DQotCS8qKg0KLQkgKiBUaGUgZXZlbnQgdGhhdCBpbmRpY2F0ZXMgdGhhdCBtZW1vcnkgaXMgcnVubmluZyBsb3cgYXQgdGhlIGxvd2VzdCBzZXZlcml0eS4NCi0JICogTGlzdGVuZXJzIGFyZSByZXF1ZXN0ZWQgdG8gcmVsZWFzZSBjYWNoZXMgdGhhdCBjYW4gZWFzaWx5IGJlIHJlY29tcHV0ZWQuDQotCSAqIFRoZSBKYXZhIFZNIGlzIG5vdCBzZXJpb3VzbHkgaW4gdHJvdWJsZSwgYnV0IHByb2Nlc3Mgc2l6ZSBpcyBnZXR0aW5nIGhpZ2hlciB0aGFuIA0KLQkgKiBpcyBkZWVtZWQgYWNjZXB0YWJsZS4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVl9OT1JNQUwgPSAib3JnL2VjbGlwc2UvZXF1aW5veC9ldmVudHMvTWVtb3J5RXZlbnQvTk9STUFMIjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JLyoqDQotCSAqIFRoZSBldmVudCB0aGF0IGluZGljYXRlcyB0aGF0IG1lbW9yeSBpcyBydW5uaW5nIGxvdyBhdCBtZWRpdW0gc2V2ZXJpdHkuIA0KLQkgKiBMaXN0ZW5lcnMgYXJlIHJlcXVlc3RlZCB0byByZWxlYXNlIGludGVybWVkaWF0ZSBidWlsZCByZXN1bHRzLCBjb21wbGV4IG1vZGVscywgZXRjLg0KLQkgKiBNZW1vcnkgaXMgZ2V0dGluZyBsb3cgYW5kIG1heSBjYXVzZSBvcGVyYXRpbmcgc3lzdGVtIGxldmVsIHN0cmVzcywgc3VjaCBhcyBzd2FwcGluZy4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVl9TRVJJT1VTID0gIm9yZy9lY2xpcHNlL2VxdWlub3gvZXZlbnRzL01lbW9yeUV2ZW50L1NFUklPVVMiOyAvLyROT04tTkxTLTEkDQotCQ0KLQkvKioNCi0JICogVGhlIGV2ZW50IHRoYXQgaW5kaWNhdGVzIHRoYXQgbWVtb3J5IGlzIHJ1bm5pbmcgbG93IGF0IGhpZ2hlc3Qgc2V2ZXJpdHkuDQotCSAqIExpc3RlbmVycyBhcmUgcmVxdWVzdGVkIHRvIGRvIHRoaW5ncyBsaWtlIGNsb3NlIGVkaXRvcnMgYW5kIHBlcnNwZWN0aXZlcywgY2xvc2UgZGF0YWJhc2UgY29ubmVjdGlvbnMsIGV0Yy4NCi0JICogUmVzdG9yaW5nIHRoZXNlIHJlc291cmNlcyBhbmQgY2FjaGVzIGNvbnN0aXR1dGVzIGxvdHMgb2Ygd29yaywgYnV0IG1lbW9yeSBpcyBzbyBsb3cgdGhhdA0KLQkgKiBkcmFzdGljIG1lYXN1cmVzIGFyZSByZXF1aXJlZC4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVl9DUklUSUNBTCA9ICJvcmcvZWNsaXBzZS9lcXVpbm94L2V2ZW50cy9NZW1vcnlFdmVudC9DUklUSUNBTCI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCS8qKg0KLQkgKiBBbGwgb2YgdGhlIHZhbGlkIG1lbW9yeSBzZXZlcml0aWVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNFVl9BTEwgPSB7IFNFVl9OT1JNQUwsIFNFVl9TRVJJT1VTLCBTRVZfQ1JJVElDQUwgfTsNCi0NCi0JLyoqDQotCSAqIFVzZWQgdG8gcmVnaXN0ZXIgdGhlIHtAbGluayBFdmVudEFkbWlufSBsaXN0ZW5lcg0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBDT05URVhUID0NCi0JCShTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKSAhPSBudWxsKSA/DQotCQkJCVNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEJ1bmRsZUNvbnRleHQoKSA6IG51bGw7DQotDQotCS8qKg0KLQkgKiB0aGUgc2V2ZXJpdGllcyB0aGF0IHdpbGwgYmUgcmVhY3RlZCB0bw0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBMaXN0IGZTZXZlcml0aWVzOw0KLQkNCi0JLyoqDQotCSAqIHNlcnZpY2UgdXNlZCB0byByZWdpc3RlciB0aGlzIGxpc3RlbmVyDQotCSAqLw0KLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gZlJlZ2lzdGVyU2VydmljZTsNCi0NCi0JLyoqDQotCSAqIFdpbGwgbGlzdGVuIHRvIGFsbCBtZW1vcnkgZXZlbnRzDQotCSAqLw0KLQlwdWJsaWMgQWJzdHJhY3RNZW1vcnlMaXN0ZW5lcigpIHsNCi0JCXRoaXMoQWJzdHJhY3RNZW1vcnlMaXN0ZW5lci5TRVZfQUxMKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogV2lsbCBsaXN0ZW4gdG8gbWVtb3J5IGV2ZW50cyBvZiB0aGUgZ2l2ZW4gPGNvZGU+c2V2ZXJpdHk8L2NvZGU+DQotCSAqIA0KLQkgKiBAcGFyYW0gc2V2ZXJpdHkgbGlzdGVuIGZvciBtZW1vcnkgZXZlbnRzIG9mIHRoaXMgc2V2ZXJpdHkNCi0JICovDQotCXB1YmxpYyBBYnN0cmFjdE1lbW9yeUxpc3RlbmVyKFN0cmluZyBzZXZlcml0eSkgew0KLQkJQXNzZXJ0LmlzTm90TnVsbChzZXZlcml0eSwgIlNldmVyaXR5IGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQkNCi0JCUxpc3Qgc2V2ZXJpdGllcyA9IG5ldyBBcnJheUxpc3QoMSk7DQotCQlzZXZlcml0aWVzLmFkZChzZXZlcml0eSk7DQotCQlmU2V2ZXJpdGllcyA9IHNldmVyaXRpZXM7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBXaWxsIGxpc3RlbiB0byBtZW1vcnkgZXZlbnRzIG9mIHRoZSBnaXZlbiA8Y29kZT5zZXZlcml0aWVzPC9jb2RlPg0KLQkgKiANCi0JICogQHBhcmFtIHNldmVyaXRpZXMgbGlzdGVuIGZvciBtZW1vcnkgZXZlbnRzIGZvciBhbnkgb2YgdGhlc2Ugc2V2ZXJpdGllcw0KLQkgKi8NCi0JcHVibGljIEFic3RyYWN0TWVtb3J5TGlzdGVuZXIoU3RyaW5nW10gc2V2ZXJpdGllcykgew0KLQkJQXNzZXJ0LmlzTm90TnVsbChzZXZlcml0aWVzLCAiU2V2ZXJpdGllcyBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJQXNzZXJ0LmlzTGVnYWwoc2V2ZXJpdGllcy5sZW5ndGggPiAwLCAiU2V2ZXJpdGllcyBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIHNldmVyaXR5Iik7IC8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJZlNldmVyaXRpZXMgPSBBcnJheXMuYXNMaXN0KHNldmVyaXRpZXMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBXaWxsIGxpc3RlbiB0byBtZW1vcnkgZXZlbnRzIG9mIHRoZSBnaXZlbiA8Y29kZT5zZXZlcml0aWVzPC9jb2RlPg0KLQkgKiANCi0JICogQHBhcmFtIHNldmVyaXRpZXMgbGlzdGVuIGZvciBtZW1vcnkgZXZlbnRzIGZvciBhbnkgb2YgdGhlc2Ugc2V2ZXJpdGllcw0KLQkgKi8NCi0JcHVibGljIEFic3RyYWN0TWVtb3J5TGlzdGVuZXIoTGlzdCBzZXZlcml0aWVzKSB7DQotCQlBc3NlcnQuaXNOb3ROdWxsKHNldmVyaXRpZXMsICJTZXZlcml0aWVzIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQlBc3NlcnQuaXNMZWdhbCghc2V2ZXJpdGllcy5pc0VtcHR5KCksICJTZXZlcml0aWVzIG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgc2V2ZXJpdHkiKTsgLy8kTk9OLU5MUy0xJA0KLQkJZlNldmVyaXRpZXMgPSBzZXZlcml0aWVzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDb25uZWN0IHRoaXMgbGlzdGVuZXIgdG8gdGhlIHtAbGluayBFdmVudEFkbWlufQ0KLQkgKi8NCi0JcHVibGljIGZpbmFsIHZvaWQgY29ubmVjdCgpIHsNCi0JCWlmIChDT05URVhUICE9IG51bGwpIHsNCi0JCQkvLyBOT1RFOiBUaGlzIGlzIFRFTVBPUkFSWSBDT0RFIG5lZWRlZCB0byBsb2FkIHRoZSBwbHVnaW4NCi0JCQkvLyB1bnRpbCBpdHMgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBwcm9kdWN0DQotCQkJLy8gVE9ETzogUmVtb3ZlIG1lDQotCQkJQnVuZGxlIGIgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmVxdWlub3guZXZlbnQiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWlmIChiICE9IG51bGwgJiYgYi5nZXRTdGF0ZSgpID09IEJ1bmRsZS5SRVNPTFZFRCkgew0KLQkJCQl0cnkgew0KLQkJCQkJYi5zdGFydChCdW5kbGUuU1RBUlRfVFJBTlNJRU5UKTsNCi0JCQkJfQ0KLQkJCQljYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsNCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQkJCX0NCi0JCQl9DQotCQkJLy8gZW5kIHJlbW92ZSBtZQ0KLQkJCQ0KLQkJCS8vcmVnaXN0ZXIgdGhpcyBoYW5kbGVyDQotCQkJU3RyaW5nW10gc2V2ZXJpdGllcyA9IChTdHJpbmdbXSlmU2V2ZXJpdGllcy50b0FycmF5KG5ldyBTdHJpbmdbZlNldmVyaXRpZXMuc2l6ZSgpXSk7DQotCQkJSGFzaHRhYmxlIHByb3AgPSBuZXcgSGFzaHRhYmxlKDEpOw0KLQkJCXByb3AucHV0KEV2ZW50Q29uc3RhbnRzLkVWRU5UX1RPUElDLCBzZXZlcml0aWVzKTsNCi0JCQlmUmVnaXN0ZXJTZXJ2aWNlID0gQ09OVEVYVC5yZWdpc3RlclNlcnZpY2UoRXZlbnRIYW5kbGVyLmNsYXNzLmdldE5hbWUoKSwgdGhpcywgcHJvcCk7DQotCQkJDQotCQkJLy9jYWxsIGFueSBpbXBsZW1lbnRlciBzcGVjaWZpYyBjb25uZWN0IGNvZGUNCi0JCQlkb0Nvbm5lY3QoKTsNCi0JCX0gZWxzZSB7DQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIkVycm9yIGFjY2Vzc2luZyBidW5kbGUgY29udGV4dC4gSXMgUGxhdGZvcm0gcnVubmluZz8gTm90IHRyYWNraW5nIG1lbW9yeSBldmVudHMuICIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIERpc2Nvbm5lY3QgdGhpcyBsaXN0ZW5lciB0byB0aGUge0BsaW5rIEV2ZW50QWRtaW59DQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCBkaXNjb25uZWN0KCkgew0KLQkJaWYgKGZSZWdpc3RlclNlcnZpY2UgIT0gbnVsbCkgew0KLQkJCWZSZWdpc3RlclNlcnZpY2UudW5yZWdpc3RlcigpOw0KLQkJCWZSZWdpc3RlclNlcnZpY2UgPSBudWxsOw0KLQkJfQ0KLQkJDQotCQkvL2NhbGwgYW55IGltcGxlbWVudGVyIHNwZWNpZmljIGRpc2Nvbm5lY3QgY29kZQ0KLQkJZG9EaXNjb25uZWN0KCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDxwPkZpbHRlciBvdXQgYW55IGV2ZW50cyB0aGF0IGFyZSBub3Qgb2YgdGhlIHR5cGUgdGhhdCB0aGlzIGxpc3RlbmVyIGhhbmRsZXM8L3A+DQotCSAqIA0KLQkgKiBAc2VlIG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnRIYW5kbGVyI2hhbmRsZUV2ZW50KG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQpDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgew0KLQkJaWYgKGZTZXZlcml0aWVzLmNvbnRhaW5zKGV2ZW50LmdldFRvcGljKCkpKSB7DQotCQkJaGFuZGxlTWVtb3J5RXZlbnQoZXZlbnQpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBJbXBsZW1lbnRpbmcgY2hpbGQgY2xhc3NlcyBtYXkgYXNzdW1lIHRoYXQgb25seSB7QGxpbmsgRXZlbnR9cyBvZiB0aGUgdHlwZXMNCi0JICogZ2l2ZW4gdG8gdGhlIGNvbnN0cnVjdG9yIHdpbGwgYmUgZ2l2ZW4gdG8gdGhpcyBtZXRob2QuDQotCSAqIA0KLQkgKiBAcGFyYW0gZXZlbnQgdGhlIHtAbGluayBFdmVudH0gd2l0aCBhIHRvcGljIGVxdWFsIHRvIG9uZSBvZiB0aGUgbWVtb3J5DQotCSAqIHNldmVyaXRpZXMgdGhhdCB0aGlzIGxpc3RlbmVyIGlzIGxpc3RlbmluZyBmb3INCi0JICovDQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhhbmRsZU1lbW9yeUV2ZW50KEV2ZW50IGV2ZW50KTsNCi0JDQotCS8qKg0KLQkgKiBJbXBsZW1lbnRlcnMgbWF5IG92ZXJydW4gdGhpcyBtZXRob2QgdG8gZG8gc2V0dXAgYWZ0ZXIgY29ubmVjdGlvbiBvZiB0aGlzIGxpc3RlbmVyDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBkb0Nvbm5lY3QoKSB7DQotCQkvL2RvIG5vdGhpbmcgYnkgZGVmYXVsdA0KLQl9DQotCQ0KLQkvKioNCi0JICogSW1wbGVtZW50ZXJzIG1heSBvdmVycnVuIHRoaXMgbWV0aG9kIHRvIGRvIHRlYXIgZG93biBhZnRlciBkaXNjb25uZWN0aW9uIG9mIHRoaXMgbGlzdGVuZXINCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGRvRGlzY29ubmVjdCgpIHsNCi0JCS8vZG8gbm90aGluZyBieSBkZWZhdWx0DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0Fzc2VydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0Fzc2VydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2QxZWUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9Bc3NlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotLyoqCi0gKiA8Y29kZT5Bc3NlcnQ8L2NvZGU+IGlzIHVzZWZ1bCBmb3IgZm9yIGVtYmVkZGluZyBydW50aW1lIHNhbml0eSBjaGVja3MgaW4KLSAqIGNvZGUuIFRoZSBwcmVkaWNhdGUgbWV0aG9kcyBhbGwgdGVzdCBhIGNvbmRpdGlvbiBhbmQgdGhyb3cgc29tZSB0eXBlIG9mCi0gKiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlmIHRoZSBjb25kaXRpb24gZG9lcyBub3QgaG9sZC4KLSAqIDxwPgotICogQXNzZXJ0aW9uIGZhaWx1cmUgZXhjZXB0aW9ucywgbGlrZSBtb3N0IHJ1bnRpbWUgZXhjZXB0aW9ucywgYXJlIHRocm93biB3aGVuCi0gKiBzb21ldGhpbmcgaXMgbWlzYmVoYXZpbmcuIEFzc2VydGlvbiBmYWlsdXJlcyBhcmUgaW52YXJpYWJseSB1bnNwZWNpZmllZAotICogYmVoYXZpb3I7IGNvbnNlcXVlbnRseSwgY2xpZW50cyBzaG91bGQgbmV2ZXIgcmVseSBvbiB0aGVzZSBiZWluZyB0aHJvd24KLSAqIChhbmQgY2VydGFpbmx5IHNob3VsZCBub3QgYmVpbmcgY2F0Y2hpbmcgdGhlbSBzcGVjaWZpY2FsbHkpLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXNzZXJ0IHsKLQotCS8qKgotCSAqIDxjb2RlPkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjwvY29kZT4gaXMgYSBydW50aW1lIGV4Y2VwdGlvbiB0aHJvd24KLQkgKiBieSBzb21lIG9mIHRoZSBtZXRob2RzIGluIDxjb2RlPkFzc2VydDwvY29kZT4uCi0JICogPHA+Ci0JICogVGhpcyBjbGFzcyBpcyBub3QgZGVjbGFyZWQgcHVibGljIHRvIHByZXZlbnQgc29tZSBtaXN1c2VzOyBwcm9ncmFtcwotCSAqIHRoYXQgY2F0Y2ggb3Igb3RoZXJ3aXNlIGRlcGVuZCBvbiBhc3NlcnRpb24gZmFpbHVyZXMgYXJlIHN1c2NlcHRpYmxlIHRvCi0JICogdW5leHBlY3RlZCBicmVha2FnZSB3aGVuIGFzc2VydGlvbnMgaW4gdGhlIGNvZGUgYXJlIGFkZGVkIG9yIHJlbW92ZWQuCi0JICogPC9wPgotCSAqLwotCWNsYXNzIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbi4KLQkJICovCi0JCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuCi0JCSAqLwotCQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBkZXRhaWwpIHsKLQkJCXN1cGVyKGRldGFpbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzIG5vdAotCSAqIDxjb2RlPnRydWU8L2NvZGU+LCBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IGlzCi0JICogdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBpc0xlZ2FsKGV4cHJlc3Npb24sICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMgbm90Ci0JICogPGNvZGU+dHJ1ZTwvY29kZT4sIGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaXMKLQkgKiB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQKLQkgKiBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcyBpcwotCSAqIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB0ZXN0Ci0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlzTm90TnVsbChvYmplY3QsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcyBpcwotCSAqIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLiBUaGUgZ2l2ZW4KLQkgKiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB0ZXN0Ci0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpc05vdE51bGwoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQkvL0xvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAibnVsbF9hcmd1bWVudDogIiArIG1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgQXNzZXJ0KCkubmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihtZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSWYgdGhpcyBpcyBub3QKLQkgKiB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBpc1RydWUoZXhwcmVzc2lvbiwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzIGlzIG5vdAotCSAqIHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlCi0JICogaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pIHsKLQkJCXRocm93IG5ldyBBc3NlcnQoKS5uZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQl9Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZC4gKi8KLQlwcml2YXRlIEFzc2VydCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvRGVidWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9EZWJ1Zy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGY4OTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9EZWJ1Zy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKEludGFsaW8pIC0gYnVnIDMwMDQzMCAtIFN0cmluZyBjb25jYXRlbmF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIERlYnVnIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2hlY2tGb3JNZW1vcnlMZWFrcyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGNvbGxlY3RTdGF0cyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVCVUcgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RIUkVBRExPQ0FMID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdCcmVha3BvaW50cyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z0NhcmV0TWVkaWF0b3IgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdEaXNwbGF5VHJlZVBvc2l0aW9ucyA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnTWVkaWF0b3IgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z05vdGlmaWNhdGlvbiA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z05vdGlmaWNhdGlvbkFuZEV2ZW50cyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnTm90aWZ5RGVmZXJyZWQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdSZWNvbmNpbGluZyA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnUnRmRm9ybWF0UHJvdmlkZXIgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1RhZ2xpYnMgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1Rva2VuaXplciA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnVHJlZU1vZGVsID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnVXBkYXRlVHJlZVBvc2l0aW9ucyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkaXNwbGF5SW5mbyA9IGZhbHNlOwotCi0JLyoqIGVmZmVjdHMgb3V0cHV0IG9mIExvZ2dlciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkaXNwbGF5VG9Db25zb2xlID0gdHJ1ZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGlzcGxheVdhcm5pbmdzID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaGVhZFBhcnNpbmcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4ganNEZWJ1Z0NvbnRleHRBc3Npc3QgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBqc0RlYnVnU3ludGF4Q29sb3JpbmcgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NLUyA9IGZhbHNlOwotCS8vIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwZXJmVGVzdCA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwZXJmVGVzdEFkYXB0ZXJDbGFzc0xvYWRpbmcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcGVyZlRlc3RGb3JtYXQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcGVyZlRlc3RSYXdTdHJ1Y3R1cmVkRG9jdW1lbnRPbmx5ID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5ID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50T25seSA9IGZhbHNlOwotCi0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gc3ludGF4SGlnaGxpZ2h0aW5nID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNlU3RhbmRhcmRFb2xJbldpZGdldCA9IGZhbHNlOwotCi0JLyoqCi0JICogRm9yIHRlc3RzIGFuZCBkZWJ1ZyBvbmx5Ci0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgZHVtcChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCQlkdW1wKHN0cnVjdHVyZWREb2N1bWVudCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBkdW1wKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBib29sZWFuIHZlcmJvc2UpIHsKLQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIGZsYXROb2RlID0gbnVsbDsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJEdW1wIG9mIHN0cnVjdHVyZWREb2N1bWVudDoiKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmbGF0Tm9kZXMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uTGlzdCgpOwotCQlFbnVtZXJhdGlvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gZmxhdE5vZGVzLmVsZW1lbnRzKCk7Ci0JCXdoaWxlIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlmbGF0Tm9kZSA9IChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMubmV4dEVsZW1lbnQoKTsKLQkJCWlmICghdmVyYm9zZSkgewotCQkJCVN0cmluZyBvdXRTdHJpbmcgPSBmbGF0Tm9kZS50b1N0cmluZygpOwotCQkJCW91dFN0cmluZyA9IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlscy5lc2NhcGUob3V0U3RyaW5nKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ob3V0U3RyaW5nKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZHVtcChmbGF0Tm9kZSwgdmVyYm9zZSk7Ci0JCQl9Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiPSA9ID0gPSA9ID0iKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKiBAcGFyYW0gdmVyYm9zZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBkdW1wKElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb24sIGJvb2xlYW4gdmVyYm9zZSkgewotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh2ZXJib3NlKSB7Ci0JCQlwcmludFBhcmVudChyZWdpb24pOwotCQl9Ci0JCXByaW50Q2hpbGRSZWdpb25zKHJlZ2lvbiwgMCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludENoaWxkUmVnaW9ucyhJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uLCBpbnQgZGVwdGgpIHsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyA9PT4gLy8gSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbkNvbGxlY3Rpb24gPSByZWdpb247Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVnaW9uKTsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0ID0gcmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9uTGlzdC5zaXplKCk7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIHIgPSByZWdpb25MaXN0LmdldChpKTsKLQkJCQlpZiAociBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJCQlJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmMgPSAoSVRleHRSZWdpb25Db2xsZWN0aW9uKSByOwotCQkJCQlwcmludENoaWxkUmVnaW9ucyhyYywgZGVwdGgrKyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHNwYWNlKGRlcHRoKSArIHIpOwotCQkJCQlkZXB0aC0tOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbXBsZSB1dGlsaXR5IHRvIG1ha2Ugc3VyZSBwcmludGxuJ3MgYXJlIHNvbWUgd2hhdCBpbiBvcmRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgc3luY2hyb25pemVkIHZvaWQgcHJpbnRsbihTdHJpbmcgbXNnKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICJcdCIgKyBtc2cpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFBhcmVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBbcGFyZW50IGRvY3VtZW50OiAiICsgdG9TdHJpbmdVdGlsKHJlZ2lvbi5nZXRQYXJlbnREb2N1bWVudCgpKSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRQYXJlbnQoSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbikgewotCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJcHJpbnRQYXJlbnQoKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHJlZ2lvbik7Ci0JCX0gZWxzZSBpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCXByaW50UGFyZW50KChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKTsKLQkJfSBlbHNlCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBbcGFyZW50IGRvY3VtZW50OiAiICsgIihuYSkiICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50UGFyZW50KElUZXh0UmVnaW9uQ29udGFpbmVyIHJlZ2lvbikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBbcGFyZW50IGRvY3VtZW50OiAiICsgdG9TdHJpbmdVdGlsKHJlZ2lvbi5nZXRQYXJlbnQoKSkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVwdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNwYWNlKGludCBkZXB0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gIiAgIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHJlc3VsdCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgewotCQkJc2IuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmVzdWx0ID0gc2IudG9TdHJpbmcoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0b1N0cmluZ1V0aWwoSVN0cnVjdHVyZWREb2N1bWVudCBvYmplY3QpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IG9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHNob3J0Q2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZXN1bHQgPSBzaG9ydENsYXNzTmFtZTsKLQkJLy8gTk9URTogaWYgdGhlIGRvY3VtZW50IGhlbGQgYnkgYW55IHJlZ2lvbiBoYXMgYmVlbiB1cGRhdGVkIGFuZCB0aGUKLQkJLy8gcmVnaW9uIG9mZnNldHMgaGF2ZSBub3QKLQkJLy8geWV0IGJlZW4gdXBkYXRlZCwgdGhlIG91dHB1dCBmcm9tIHRoaXMgbWV0aG9kIGludmFsaWQuCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0b1N0cmluZ1V0aWwoSVRleHRSZWdpb25Db2xsZWN0aW9uIG9iamVjdCkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gb2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgc2hvcnRDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlc3VsdCA9IHNob3J0Q2xhc3NOYW1lOwotCQkvLyBOT1RFOiBpZiB0aGUgZG9jdW1lbnQgaGVsZCBieSBhbnkgcmVnaW9uIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIHRoZQotCQkvLyByZWdpb24gb2Zmc2V0cyBoYXZlIG5vdAotCQkvLyB5ZXQgYmVlbiB1cGRhdGVkLCB0aGUgb3V0cHV0IGZyb20gdGhpcyBtZXRob2QgaW52YWxpZC4KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCS8qKgotCSAqIERlYnVnIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIERlYnVnKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9Eb2N1bWVudElucHV0U3RyZWFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvRG9jdW1lbnRJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWQwOTUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9Eb2N1bWVudElucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotcHVibGljIGNsYXNzIERvY3VtZW50SW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgaW50IGZNYXJrID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZlBvc2l0aW9uID0gMDsKLQotCXB1YmxpYyBEb2N1bWVudElucHV0U3RyZWFtKElEb2N1bWVudCBzb3VyY2UpIHsKLQkJc3VwZXIoKTsKLQkJZkRvY3VtZW50ID0gc291cmNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNhdmFpbGFibGUoKQotCSAqLwotCXB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIGZQb3NpdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5mRG9jdW1lbnQgPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNtYXJrKGludCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KSB7Ci0JCWZNYXJrID0gZlBvc2l0aW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNtYXJrU3VwcG9ydGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jcmVhZCgpCi0JICovCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmIChmUG9zaXRpb24gPCBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0JCQkJcmV0dXJuIGZEb2N1bWVudC5nZXRDaGFyKGZQb3NpdGlvbisrKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gLTE7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jcmVzZXQoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZQb3NpdGlvbiA9IGZNYXJrOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNza2lwKGxvbmcpCi0JICovCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWxvbmcgc2tpcHBlZCA9IG47Ci0JCWlmIChuIDwgZkRvY3VtZW50LmdldExlbmd0aCgpIC0gZlBvc2l0aW9uKSB7Ci0JCQlza2lwcGVkID0gbjsKLQkJCWZQb3NpdGlvbiArPSBza2lwcGVkOwotCQl9IGVsc2UgewotCQkJc2tpcHBlZCA9IGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIGZQb3NpdGlvbjsKLQkJCWZQb3NpdGlvbiA9IGZEb2N1bWVudC5nZXRMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gc2tpcHBlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvSmFyVXRpbGl0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvSmFyVXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNjIxZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0phclV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgSmFyVXRpbGl0aWVzIHsKLQotCS8qKgotCSAqIEBzZWUgaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qc3AvZXJyYXRhXzFfMV9hXzA0MjgwMC5odG1sLCBJc3N1ZXMKLQkgKiAgICAgIDggJiA5Ci0JICogCi0JICogICAgICAiVGhlcmUgYXJlIHR3byBjYXNlcy4gSW4gYm90aCBjYXNlcyB0aGUgVExEX1VSSSBpcyB0byBiZQotCSAqICAgICAgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdlYiBBcHBsaWNhdGlvbi4gSW4gdGhlCi0JICogICAgICBmaXJzdCBjYXNlIHRoZSBUTERfVVJJIHJlZmVycyB0byBhIFRMRCBmaWxlIGRpcmVjdGx5LiBJbiB0aGUKLQkgKiAgICAgIHNlY29uZCBjYXNlLCB0aGUgVExEX1VSSSByZWZlcnMgdG8gYSBKQVIgZmlsZS4gSWYgc28sIHRoYXQgSkFSCi0JICogICAgICBmaWxlIHNob3VsZCBoYXZlIGEgVExEIGF0IGxvY2F0aW9uIE1FVEEtSU5GL3RhZ2xpYi50bGQuIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUDExX1RBR0xJQiA9ICJNRVRBLUlORi90YWdsaWIudGxkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlSmFyRmlsZShaaXBGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWZpbGUuY2xvc2UoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkvLyBubyBjbGVhbnVwIGNhbiBiZSBkb25lCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBhIHN0cmVhbSB0byBhIGxvY2FsIGNvcHkgb2YgdGhlIGlucHV0IG9yIG51bGwgaWYgbm90IHBvc3NpYmxlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRDYWNoZWRJbnB1dFN0cmVhbShTdHJpbmcgamFyRmlsZW5hbWUsIFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJRmlsZSB0ZXN0RmlsZSA9IG5ldyBGaWxlKGphckZpbGVuYW1lKTsKLQkJaWYgKCF0ZXN0RmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBnZXRJbnB1dFN0cmVhbShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoamFyRmlsZW5hbWUpKSwgZW50cnlOYW1lKTsKLQotCQlJbnB1dFN0cmVhbSBjYWNoZSA9IG51bGw7Ci0JCVppcEZpbGUgamFyZmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXJmaWxlID0gbmV3IFppcEZpbGUoamFyRmlsZW5hbWUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4YykgewotCQkJY2xvc2VKYXJGaWxlKGphcmZpbGUpOwotCQl9Ci0KLQkJaWYgKGphcmZpbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlaaXBFbnRyeSB6ZW50cnkgPSBqYXJmaWxlLmdldEVudHJ5KGVudHJ5TmFtZSk7Ci0JCQkJaWYgKHplbnRyeSAhPSBudWxsKSB7Ci0JCQkJCUlucHV0U3RyZWFtIGVudHJ5SW5wdXRTdHJlYW0gPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJZW50cnlJbnB1dFN0cmVhbSA9IGphcmZpbGUuZ2V0SW5wdXRTdHJlYW0oemVudHJ5KTsKLQkJCQkJfQotCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gaW9FeGMpIHsKLQkJCQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCQkJfQotCi0JCQkJCWlmIChlbnRyeUlucHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCQkJCWludCBjOwotCQkJCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZmZlciA9IG51bGw7Ci0JCQkJCQlpZiAoemVudHJ5LmdldFNpemUoKSA+IDApIHsKLQkJCQkJCQlidWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKChpbnQpIHplbnRyeS5nZXRTaXplKCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJYnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQkJfQotCQkJCQkJLy8gYXJyYXkgZGltIHJlc3RyaWN0aW9uPwotCQkJCQkJYnl0ZSBieXRlc1tdID0gbmV3IGJ5dGVbMjA0OF07Ci0JCQkJCQl0cnkgewotCQkJCQkJCXdoaWxlICgoYyA9IGVudHJ5SW5wdXRTdHJlYW0ucmVhZChieXRlcykpID49IDApIHsKLQkJCQkJCQkJYnVmZmVyLndyaXRlKGJ5dGVzLCAwLCBjKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2FjaGUgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZmVyLnRvQnl0ZUFycmF5KCkpOwotCQkJCQkJCWNsb3NlSmFyRmlsZShqYXJmaWxlKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJCQkvLyBubyBjbGVhbnVwIGNhbiBiZSBkb25lCi0JCQkJCQl9Ci0JCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQllbnRyeUlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQljbG9zZUphckZpbGUoamFyZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhY2hlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElucHV0U3RyZWFtIGNvcHlBbmRDbG9zZVN0cmVhbShJbnB1dFN0cmVhbSBvcmlnaW5hbCkgewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlJbnB1dFN0cmVhbSBjYWNoZWRDb3B5ID0gbnVsbDsKLQotCQlpZiAob3JpZ2luYWwgIT0gbnVsbCkgewotCQkJaW50IGM7Ci0JCQkvLyBhcnJheSBkaW0gcmVzdHJpY3Rpb24/Ci0JCQlieXRlIGJ5dGVzW10gPSBuZXcgYnl0ZVsyMDQ4XTsKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKChjID0gb3JpZ2luYWwucmVhZChieXRlcykpID49IDApIHsKLQkJCQkJYnVmZmVyLndyaXRlKGJ5dGVzLCAwLCBjKTsKLQkJCQl9Ci0JCQkJY2FjaGVkQ29weSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIudG9CeXRlQXJyYXkoKSk7Ci0JCQkJY2xvc2VTdHJlYW0ob3JpZ2luYWwpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2FjaGVkQ29weTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gamFyUmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSB6aXAgZmlsZQotCSAqIEByZXR1cm4gYSBzdHJpbmcgYXJyYXkgY29udGFpbmluZyB0aGUgZW50cnkgcGF0aHMgdG8gZXZlcnkgZmlsZSBpbiB0aGlzCi0JICogICAgICAgICB6aXAgcmVzb3VyY2UsIGV4Y2x1ZGluZyBkaXJlY3RvcmllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RW50cnlOYW1lcyhJUmVzb3VyY2UgamFyUmVzb3VyY2UpIHsKLQkJaWYgKGphclJlc291cmNlID09IG51bGwgfHwgamFyUmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFIHx8ICFqYXJSZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RW50cnlOYW1lcyhqYXJSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIG5ldyBaaXBJbnB1dFN0cmVhbSgoKElGaWxlKSBqYXJSZXNvdXJjZSkuZ2V0Q29udGVudHMoKSksIHRydWUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJfQotCi0JCUlQYXRoIGxvY2F0aW9uID0gamFyUmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0RW50cnlOYW1lcyhsb2NhdGlvbi50b1N0cmluZygpKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGphckZpbGVuYW1lCi0JICogICAgICAgICAgICB0aGUgbG9jYXRpb24gb2YgdGhlIHppcCBmaWxlCi0JICogQHJldHVybiBhIHN0cmluZyBhcnJheSBjb250YWluaW5nIHRoZSBlbnRyeSBwYXRocyB0byBldmVyeSBmaWxlIGluIHRoZQotCSAqICAgICAgICAgemlwIGZpbGUgYXQgdGhpcyBsb2NhdGlvbiwgZXhjbHVkaW5nIGRpcmVjdG9yaWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFbnRyeU5hbWVzKFN0cmluZyBqYXJGaWxlbmFtZSkgewotCQlyZXR1cm4gZ2V0RW50cnlOYW1lcyhqYXJGaWxlbmFtZSwgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0RW50cnlOYW1lcyhTdHJpbmcgZmlsZW5hbWUsIFppcElucHV0U3RyZWFtIGphcklucHV0U3RyZWFtLCBib29sZWFuIGV4Y2x1ZGVEaXJlY3RvcmllcykgewotCQlMaXN0IGVudHJ5TmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlaaXBFbnRyeSB6ID0gamFySW5wdXRTdHJlYW0uZ2V0TmV4dEVudHJ5KCk7Ci0JCQl3aGlsZSAoeiAhPSBudWxsKSB7Ci0JCQkJaWYgKCEoei5pc0RpcmVjdG9yeSgpICYmIGV4Y2x1ZGVEaXJlY3RvcmllcykpCi0JCQkJCWVudHJ5TmFtZXMuYWRkKHouZ2V0TmFtZSgpKTsKLQkJCQl6ID0gamFySW5wdXRTdHJlYW0uZ2V0TmV4dEVudHJ5KCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFppcEV4Y2VwdGlvbiB6RXhjKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiSmFyVXRpbGl0aWVzIFppcEV4Y2VwdGlvbjogKHN0cmVhbSkgIiArIGZpbGVuYW1lLCB6RXhjKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvRXhjKSB7Ci0JCQkvLyBubyBjbGVhbnVwIGNhbiBiZSBkb25lCi0JCX0KLQkJZmluYWxseSB7Ci0JCQljbG9zZVN0cmVhbShqYXJJbnB1dFN0cmVhbSk7Ci0JCX0KLQkJU3RyaW5nW10gbmFtZXMgPSAoU3RyaW5nW10pIGVudHJ5TmFtZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2xvc2VTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJdHJ5IHsKLQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBqYXJGaWxlbmFtZQotCSAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIHRoZSB6aXAgZmlsZQotCSAqIEBwYXJhbSBleGNsdWRlRGlyZWN0b3JpZXMKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdG8gbm90IGluY2x1ZGUgZGlyZWN0b3JpZXMgaW4gdGhlIHJlc3VsdHMKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVudHJ5IHBhdGhzIHRvIGV2ZXJ5IGZpbGUgaW4gdGhlCi0JICogICAgICAgICB6aXAgZmlsZSBhdCB0aGlzIGxvY2F0aW9uLCBleGNsdWRpbmcgZGlyZWN0b3JpZXMgaWYgaW5kaWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFbnRyeU5hbWVzKFN0cmluZyBqYXJGaWxlbmFtZSwgYm9vbGVhbiBleGNsdWRlRGlyZWN0b3JpZXMpIHsKLQkJWmlwRmlsZSBqYXJmaWxlID0gbnVsbDsKLQkJTGlzdCBlbnRyeU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlGaWxlIGYgPSBuZXcgRmlsZShqYXJGaWxlbmFtZSk7Ci0JCWlmIChmLmV4aXN0cygpICYmIGYuY2FuUmVhZCgpKSB7Ci0JCQl0cnkgewotCQkJCWphcmZpbGUgPSBuZXcgWmlwRmlsZShmKTsKLQkJCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gamFyZmlsZS5lbnRyaWVzKCk7Ci0JCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJWmlwRW50cnkgeiA9IChaaXBFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCQlpZiAoISh6LmlzRGlyZWN0b3J5KCkgJiYgZXhjbHVkZURpcmVjdG9yaWVzKSkKLQkJCQkJCWVudHJ5TmFtZXMuYWRkKHouZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoWmlwRXhjZXB0aW9uIHpFeGMpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiSmFyVXRpbGl0aWVzIFppcEV4Y2VwdGlvbjogIiArIGphckZpbGVuYW1lICsgIiAiICsgekV4Yy5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4YykgewotCQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWNsb3NlSmFyRmlsZShqYXJmaWxlKTsKLQkJCX0KLQkJfQotCQlTdHJpbmdbXSBuYW1lcyA9IChTdHJpbmdbXSkgZW50cnlOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGphclJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgemlwIGZpbGUKLQkgKiBAcGFyYW0gZW50cnlOYW1lCi0JICogICAgICAgICAgICB0aGUgZW50cnkncyBwYXRoIGluIHRoZSB6aXAgZmlsZQotCSAqIEByZXR1cm4gYW4gSW5wdXRTdHJlYW0gdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBlbnRyeSBvciBudWxsIGlmCi0JICogICAgICAgICBub3QgcG9zc2libGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKElSZXNvdXJjZSBqYXJSZXNvdXJjZSwgU3RyaW5nIGVudHJ5TmFtZSkgewotCQlpZiAoamFyUmVzb3VyY2UgPT0gbnVsbCB8fCBqYXJSZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUgfHwgIWphclJlc291cmNlLmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJdHJ5IHsKLQkJCUlucHV0U3RyZWFtIHppcFN0cmVhbSA9ICgoSUZpbGUpIGphclJlc291cmNlKS5nZXRDb250ZW50cygpOwotCQkJcmV0dXJuIGdldElucHV0U3RyZWFtKGphclJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgbmV3IFppcElucHV0U3RyZWFtKHppcFN0cmVhbSksIGVudHJ5TmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gbm8gY2xlYW51cCBjYW4gYmUgZG9uZSwgcHJvYmFibHkgb3V0IG9mIHN5bmMKLQkJfQotCi0JCUlQYXRoIGxvY2F0aW9uID0gamFyUmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRJbnB1dFN0cmVhbShsb2NhdGlvbi50b1N0cmluZygpLCBlbnRyeU5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyBmaWxlbmFtZSwgWmlwSW5wdXRTdHJlYW0gemlwLCBTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCUlucHV0U3RyZWFtIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlaaXBFbnRyeSB6ID0gemlwLmdldE5leHRFbnRyeSgpOwotCQkJd2hpbGUgKHogIT0gbnVsbCAmJiAhei5nZXROYW1lKCkuZXF1YWxzKGVudHJ5TmFtZSkpIHsKLQkJCQl6ID0gemlwLmdldE5leHRFbnRyeSgpOwotCQkJfQotCQkJaWYgKHogIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IGNvcHlBbmRDbG9zZVN0cmVhbSh6aXApOwotCQkJfQotCQl9Ci0JCWNhdGNoIChaaXBFeGNlcHRpb24gekV4YykgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkphclV0aWxpdGllcyBaaXBFeGNlcHRpb246IChzdHJlYW0pICIgKyBmaWxlbmFtZSwgekV4Yyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4YykgewotCQkJLy8gbm8gY2xlYW51cCBjYW4gYmUgZG9uZQotCQl9Ci0JCWZpbmFsbHkgewotCQkJY2xvc2VTdHJlYW0oemlwKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBqYXJGaWxlbmFtZQotCSAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIHRoZSB6aXAgZmlsZQotCSAqIEBwYXJhbSBlbnRyeU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBlbnRyeSdzIHBhdGggaW4gdGhlIHppcCBmaWxlCi0JICogQHJldHVybiBhbiBJbnB1dFN0cmVhbSB0byB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGVudHJ5IG9yIG51bGwgaWYKLQkgKiAgICAgICAgIG5vdCBwb3NzaWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIGphckZpbGVuYW1lLCBTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCS8vIGNoZWNrIHNhbml0eQotCQlpZiAoamFyRmlsZW5hbWUgPT0gbnVsbCB8fCBqYXJGaWxlbmFtZS5sZW5ndGgoKSA8IDEgfHwgZW50cnlOYW1lID09IG51bGwgfHwgZW50cnlOYW1lLmxlbmd0aCgpIDwgMSkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIEpBUiBmaWxlcyBhcmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBsZWFkaW5nICcvJyBpbiBtZW1iZXIgbmFtZXMKLQkJU3RyaW5nIGludGVybmFsTmFtZSA9IG51bGw7Ci0JCWlmIChlbnRyeU5hbWUuc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQlpbnRlcm5hbE5hbWUgPSBlbnRyeU5hbWUuc3Vic3RyaW5nKDEpOwotCQllbHNlCi0JCQlpbnRlcm5hbE5hbWUgPSBlbnRyeU5hbWU7Ci0KLQkJcmV0dXJuIGdldENhY2hlZElucHV0U3RyZWFtKGphckZpbGVuYW1lLCBpbnRlcm5hbE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIGEgVVJMIHBvaW50aW50IHRvIGEgemlwIGZpbGUKLQkgKiBAcmV0dXJuIGEgY2FjaGVkIGNvcHkgb2YgdGhlIGNvbnRlbnRzIGF0IHRoaXMgVVJMLCBvcGVuaW5nIGl0IGFzIGEgZmlsZQotCSAqICAgICAgICAgaWYgaXQgaXMgYSBqYXI6ZmlsZTogVVJMLCBhbmQgdXNpbmcgYSBVUkxDb25uZWN0aW9uIG90aGVyd2lzZSwKLQkgKiAgICAgICAgIG9yIG51bGwgaWYgaXQgY291bGQgbm90IGJlIHJlYWQuIEFsbCBzb2NrZXRzIGFuZCBmaWxlIGhhbmRsZXMKLQkgKiAgICAgICAgIGFyZSBjbG9zZWQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFVSTCB1cmwpIHsKLQkJU3RyaW5nIHVybFN0cmluZyA9IHVybC50b1N0cmluZygpOwotCQlpZiAodXJsU3RyaW5nLmxlbmd0aCgpID4gMTIgJiYgdXJsU3RyaW5nLnN0YXJ0c1dpdGgoImphcjpmaWxlOiIpICYmIHVybFN0cmluZy5pbmRleE9mKCIhLyIpID4gOSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWludCBmaWxlSW5kZXggPSB1cmxTdHJpbmcuaW5kZXhPZigiIS8iKTsgLy8kTk9OLU5MUy0xJCAKLQkJCVN0cmluZyBqYXJGaWxlTmFtZSA9IHVybFN0cmluZy5zdWJzdHJpbmcoOSwgZmlsZUluZGV4KTsKLQkJCWlmIChmaWxlSW5kZXggPCB1cmxTdHJpbmcubGVuZ3RoKCkpIHsKLQkJCQlTdHJpbmcgamFyUGF0aCA9IHVybFN0cmluZy5zdWJzdHJpbmcoZmlsZUluZGV4ICsgMSk7Ci0JCQkJcmV0dXJuIGdldElucHV0U3RyZWFtKGphckZpbGVOYW1lLCBqYXJQYXRoKTsKLQkJCX0KLQkJfQotCi0JCUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJSmFyVVJMQ29ubmVjdGlvbiBqYXJVcmxDb25uZWN0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCW9wZW5Db25uZWN0aW9uLnNldERlZmF1bHRVc2VDYWNoZXMoZmFsc2UpOwotCQkJb3BlbkNvbm5lY3Rpb24uc2V0VXNlQ2FjaGVzKGZhbHNlKTsKLQkJCWlmIChvcGVuQ29ubmVjdGlvbiBpbnN0YW5jZW9mIEphclVSTENvbm5lY3Rpb24pIHsKLQkJCQlqYXJVcmxDb25uZWN0aW9uID0gKEphclVSTENvbm5lY3Rpb24pIG9wZW5Db25uZWN0aW9uOwotCQkJCUphckZpbGUgamFyRmlsZSA9IGphclVybENvbm5lY3Rpb24uZ2V0SmFyRmlsZSgpOwotCQkJCWlucHV0ID0gamFyRmlsZS5nZXRJbnB1dFN0cmVhbShqYXJVcmxDb25uZWN0aW9uLmdldEphckVudHJ5KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW5wdXQgPSBvcGVuQ29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOwotCQkJfQotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gY29weUFuZENsb3NlU3RyZWFtKGlucHV0KTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChqYXJVcmxDb25uZWN0aW9uICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlqYXJVcmxDb25uZWN0aW9uLmdldEphckZpbGUoKS5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQkJY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIGlnbm9yZS4gQ2FuIGhhcHBlbiBpbiBjYXNlIHRoZSBzdHJlYW0uY2xvc2UoKSBkaWQgY2xvc2UKLQkJCQkJICogdGhlIGphciBmaWxlIHNlZQotCQkJCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwNzUwCi0JCQkJCSAqLwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9QYXRoSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvUGF0aEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODM1MDg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9QYXRoSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIERhdmlkIENhcnZlciAoSW50YWxpbykgLSBidWcgMzAwNDMwIC0gU3RyaW5nIGNvbmNhdGVuYXRpb24KLSAqICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIGhlbHBlciBtZXRob2RzIHRvIG1hbmFnZSBhbmQgY29udmVydCBsaW5rcyBPcmlnaW5hbGx5IHBhcnQgb2YKLSAqIHRoZSBMaW5rc01hbmFnZXIgCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXRoSGVscGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLV0FSRF9TTEFTSCA9ICJcXCI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SV0FSRF9TTEFTSCA9ICIvIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMQVRJVkVfUEFUSF9TSUcgPSAiLi4vIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBhZGp1c3QgcmVsYXRpdmUgcGF0aCBpc3NpZGUgdGhlIGFic29sdXRlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGp1c3RQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKChpID0gcGF0aC5pbmRleE9mKFJFTEFUSVZFX1BBVEhfU0lHKSkgPiAwKSB7Ci0JCQkvLyBzcGxpdCB0aGUgc3RyaW5nIGludG8gdHdvCi0JCQlTdHJpbmcgcGFydDEgPSBwYXRoLnN1YnN0cmluZygwLCBpIC0gMSk7Ci0JCQlTdHJpbmcgcGFydDIgPSBwYXRoLnN1YnN0cmluZyhpICsgUkVMQVRJVkVfUEFUSF9TSUcubGVuZ3RoKCkgLSAxKTsKLQkJCS8vIHN0cmlwIG9uZSBwYXRoIHNlZyBmcm9tIHBhcnQxCi0JCQlpbnQgaiA9IHBhcnQxLmxhc3RJbmRleE9mKEZPUldBUkRfU0xBU0gpOwotCQkJaWYgKGogPT0gLTEpIHsKLQkJCQkvLyBjYW4ndCByZXNvbHZlLiBwYXNzZWQgcGF0aCBpcyBsaWtlCi0JCQkJLy8gRTovZWNsaXBzZXByb2plY3QvLi4vLi4vc2FtcGxlLmNzcy4KLQkJCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJcGFydDEgPSBwYXJ0MS5zdWJzdHJpbmcoMCwgaik7Ci0JCQlwYXRoID0gcGFydDEgKyBwYXJ0MjsKLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdHJhaWxpbmcgdXJsIHNsYXNoIGlmIG5lZWRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGVuZFRyYWlsaW5nVVJMU2xhc2goU3RyaW5nIGlucHV0KSB7Ci0JCS8vIGNoZWNrIHRvIHNlZSBhbHJlYWR5IGEgc2xhc2gKLQkJaWYgKCFpbnB1dC5lbmRzV2l0aChGT1JXQVJEX1NMQVNIKSkgewotCQkJaW5wdXQgKz0gRk9SV0FSRF9TTEFTSDsKLQkJfQotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0byByZWxhdGl2ZSB1cmwgYmFzZWQgb24gYmFzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1JlbGF0aXZlKFN0cmluZyBpbnB1dCwgU3RyaW5nIGJhc2UpIHsKLQkJLy8gdG9rZW5pemUgdGhlIHN0cmluZ3MKLQkJU3RyaW5nVG9rZW5pemVyIGlucHV0VG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbnB1dCwgRk9SV0FSRF9TTEFTSCk7Ci0JCVN0cmluZ1Rva2VuaXplciBiYXNlVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihiYXNlLCBGT1JXQVJEX1NMQVNIKTsKLQkJU3RyaW5nIHRva2VuMSA9ICIiLCB0b2tlbjIgPSAiIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkvLwotCQkvLyBHbyB0aHJvdWdoIHVudGlsIGVxdWxzCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAoIWlucHV0VG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSB8fCAhYmFzZVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0JCQkJYnJlYWs7Ci0JCQl0b2tlbjEgPSBiYXNlVG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJdG9rZW4yID0gaW5wdXRUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlpZiAoIXRva2VuMS5lcXVhbHModG9rZW4yKSkKLQkJCQlicmVhazsKLQkJfQotCQkvLyBub3cgZ2VuZXJhdGUgdGhlIGJhY2tzCi0JCVN0cmluZyBvdXRwdXQgPSAiIjsvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIob3V0cHV0KTsKLQkJd2hpbGUgKGJhc2VUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQliYXNlVG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJc2IuYXBwZW5kKCIuLi8iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNiLmFwcGVuZCh0b2tlbjIpOwotCQkvLyBnZW5lcmF0ZSB0aGUgcmVzdAotCQl3aGlsZSAoaW5wdXRUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlzYi5hcHBlbmQoRk9SV0FSRF9TTEFTSCk7Ci0JCQlzYi5hcHBlbmQoaW5wdXRUb2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQl9Ci0JCW91dHB1dCA9IHNiLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBvdXRwdXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250YWluaW5nIGZvbGRlciBwYXRoLiBXaWxsIGhhbmRsZSBib3RoIHVybCBhbmQgZmlsZSBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29udGFpbmluZ0ZvbGRlclBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJU3RyaW5nIHJldFZhbHVlID0gcGF0aDsKLQotCQlpbnQgdXJsU2xhc2hJbmRleCA9IHBhdGgubGFzdEluZGV4T2YoRk9SV0FSRF9TTEFTSCk7Ci0JCWludCBmaWxlUGF0aFNsYXNoSW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsKLQkJaW50IGluZGV4ID0gZmlsZVBhdGhTbGFzaEluZGV4OwotCQlpZiAodXJsU2xhc2hJbmRleCA+IGZpbGVQYXRoU2xhc2hJbmRleCkKLQkJCWluZGV4ID0gdXJsU2xhc2hJbmRleDsKLQkJaWYgKGluZGV4ID49IDApCi0JCQlyZXRWYWx1ZSA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJcmV0dXJuIHJldFZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBsZWFkaW5nIHBhdGggc2VwYXJhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlTGVhZGluZ1BhdGhTZXBhcmF0b3IoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGguc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikpCi0JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoRmlsZS5zZXBhcmF0b3IubGVuZ3RoKCkpOwotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgbGVhZGluZyBwYXRoIHNlcGFyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUxlYWRpbmdTZXBhcmF0b3IoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGguc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikpCi0JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoRmlsZS5zZXBhcmF0b3IubGVuZ3RoKCkpOwotCQllbHNlIGlmIChwYXRoLnN0YXJ0c1dpdGgoRk9SV0FSRF9TTEFTSCkgfHwgcGF0aC5zdGFydHNXaXRoKEJBQ0tXQVJEX1NMQVNIKSkKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZyhGT1JXQVJEX1NMQVNILmxlbmd0aCgpKTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogU3dpdGNoIHRvIGZpbGUgcGF0aCBzbGFzaGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3dpdGNoVG9GaWxlUGF0aFNsYXNoZXMoU3RyaW5nIHBhdGgpIHsKLQkJcGF0aCA9IHBhdGgucmVwbGFjZShGT1JXQVJEX1NMQVNILmNoYXJBdCgwKSwgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJcGF0aCA9IHBhdGgucmVwbGFjZShCQUNLV0FSRF9TTEFTSC5jaGFyQXQoMCksIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIFN3aXRjaCB0byBmaWxlIHBhdGggc2xhc2hlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN3aXRjaFRvRm9yd2FyZFNsYXNoZXMoU3RyaW5nIHBhdGgpIHsKLQkJcGF0aCA9IHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsIEZPUldBUkRfU0xBU0guY2hhckF0KDApKTsKLQkJcGF0aCA9IHBhdGgucmVwbGFjZShCQUNLV0FSRF9TTEFTSC5jaGFyQXQoMCksIEZPUldBUkRfU0xBU0guY2hhckF0KDApKTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1Byb2plY3RSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1Byb2plY3RSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTIxZjk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9Qcm9qZWN0UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFRoZSBVUklSZXNvbHZlciBpbnRlcmZhY2UgaXMgZGVwcmVjYXRlZC4gVXNlIHRoZSByZXNvbHZlciBmcm9tCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdFJlc29sdmVyIGltcGxlbWVudHMgVVJJUmVzb2x2ZXIgewotCXByaXZhdGUgU3RyaW5nIGZGaWxlQmFzZUxvY2F0aW9uID0gbnVsbDsKLQlwcml2YXRlIElQcm9qZWN0IGZQcm9qZWN0ID0gbnVsbDsKLQotCS8qKgotCSAqIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgY2xpZW50cyB1c2UKLQkgKiBwcm9qZWN0LmdldEFkYXB0ZXIoVVJJUmVzb2x2ZXIuY2xhc3MpIHRvIG9idGFpbiBhIFVSSVJlc29sdmVyIGF3YXJlIG9mCi0JICogdGhlIFByb2plY3QncyBzcGVjaWFsIHJlcXVpcmVtZW50cy4gTm90ZSB0aGF0IGEgVVJJUmVzb2x2ZXIgbWF5IG5vdCBiZQotCSAqIHJldHVybmVkIGF0IGFsbCBzbyBtYW51YWxseSBjcmVhdGluZyB0aGlzIG9iamVjdCBtYXkgc3RpbGwgYmUgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFByb2plY3RSZXNvbHZlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZQcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVCYXNlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBmRmlsZUJhc2VMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGdldEZpbGVCYXNlTG9jYXRpb24oKSk7Ci0JfQotCi0JLy8gZGVmZWN0IDI0NDgxNyBlbmQKLQkvKioKLQkgKiBSZXNvbHZlIHRoZSAocG9zc2libHkgcmVsYXRpdmUpIFVSSSBhY29yZGluZyB0byBSRkMxODA4IHVzaW5nIHRoZQotCSAqIGRlZmF1bHQgZmlsZSBiYXNlIGxvY2F0aW9uLiBSZXNvbHZlcyByZXNvdXJjZSByZWZlcmVuY2VzIGludG8gYWJzb2x1dGUKLQkgKiByZXNvdXJjZSBsb2NhdGlvbnMgd2l0aG91dCBlbnN1cmluZyB0aGF0IHRoZSByZXNvdXJjZSBhY3R1YWxseSBleGlzdHMuCi0JICogCi0JICogTm90ZTogY3VycmVudGx5IHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcyBpcyBpZ25vcmVkIGluIHRoaXMKLQkgKiBpbXBsZW1lbnRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBnZXRGaWxlQmFzZUxvY2F0aW9uKCksIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIFN0cmluZyBiYXNlUmVmZXJlbmNlKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvKgotCQkgKiBkZWZlY3QgMjQ0ODE3IHRyeSB7IFVSTCBhVVJMID0gbmV3IFVSTCh1cmkpOwotCQkgKi8KLQkJLyoqCi0JCSAqIEFuIGFjdHVhbCBVUkwgd2FzIGdpdmVuLCBidXQgb25seSB0aGUgImZpbGU6Ly8vIiBwcm90b2NvbCBpcwotCQkgKiBzdXBwb3J0ZWQuIFJlc29sdmUgdGhlIFVSSSBieSBmaW5kaW5nIHRoZSBmaWxlIHRvIHdoaWNoIGl0IHBvaW50cy4KLQkJICovCi0JCS8qCi0JCSAqIGRlZmVjdCAyNDQ4MTcgaWYgKCFhVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJwbGF0Zm9ybSIpKSB7Ci0JCSAqIC8vJE5PTi1OTFMtMSQgaWYgKGFVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSAmJgotCQkgKiAoYVVSTC5nZXRIb3N0KCkuZXF1YWxzKCJsb2NhbGhvc3QiKSB8fCBhVVJMLmdldEhvc3QoKS5sZW5ndGgoKSA9PQotCQkgKiAwKSkgeyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJCByZXR1cm4gYVVSTC5nZXRGaWxlKCk7IH0gcmV0dXJuCi0JCSAqIHVyaTsgfSB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWZ1RXhjKSB7IH0KLQkJICovCi0JCS8vIGRlZmVjdCAyNDQ4MTcgc3RhcnQKLQkJaWYgKGlzRmlsZVVSTCh1cmkpKSB7Ci0JCQl0cnkgewotCQkJCVVSTCB1cmwgPSBuZXcgVVJMKHVyaSk7Ci0JCQkJcmV0dXJuIGdldFBhdGgodXJsKTsKLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCS8vIGRlZmVjdCAyNDQ4MTcgZW5kCi0KLQkJLy8gd2hpY2ggb2YgdGhlIHNlcnZlcmFsIGFyZSB3ZSBzdXBwb3NlIHRvIHVzZSBoZXJlPwotCQkvLwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MTIyMwotCQkvLyBXb3JrYXJvdW5kIGZvciBwcm9ibGVtIGluIFVSSUhlbHBlcjsgdXJpcyBzdGFydGluZyB3aXRoICcvJyBhcmUKLQkJLy8gcmV0dXJuZWQgYXMtaXMuCi0JCVN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0JCWlmICh1cmkuc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUlQcm9qZWN0IHAgPSBnZXRQcm9qZWN0KCk7Ci0JCQlpZiAocCAhPSBudWxsICYmIHAuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlJRmlsZSBmaWxlID0gcC5nZXRGaWxlKHVyaSk7Ci0JCQkJCi0JCQkJaWYgKGZpbGUuZ2V0TG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWxvY2F0aW9uID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCWlmIChsb2NhdGlvbiA9PSBudWxsICYmIGZpbGUuZ2V0TG9jYXRpb25VUkkoKSAhPSBudWxsKSB7Ci0JCQkJCWxvY2F0aW9uID0gZmlsZS5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCWlmIChsb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCWxvY2F0aW9uID0gZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCWxvY2F0aW9uID0gVVJJSGVscGVyLm5vcm1hbGl6ZSh1cmksIGJhc2VSZWZlcmVuY2UsIGdldFJvb3RMb2NhdGlvblN0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSB0aGUgZ2V0TG9jYXRpb25CeVVSSSBhY3Rpb24gdXNpbmcgdGhlIGJhc2VSZWZlcmVuY2UgYXMgdGhlCi0JICogcG9pbnQgb2YgcmVmZXJlbmNlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgZm9yIHRoaXMgcmVzb2x2ZXIKLQkgKiAKLQkgKiBOb3RlOiBjdXJyZW50bHkgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzIGlzIGlnbm9yZWQgaW4gdGhpcwotCSAqIGltcGxlbWVudGF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBiYXNlUmVmZXJlbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBob3N0Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQYXRoKElQYXRoIHBhdGgsIFN0cmluZyBob3N0KSB7Ci0JCUlQYXRoIG5ld1BhdGggPSBwYXRoOwotCQkvLyBUaGV5IGFyZSBwb3RlbnRpYWxseSBmb3Igb25seSBXaW5kb3dzIG9wZXJhdGluZyBzeXN0ZW0uCi0JCS8vIGEuKSBpZiBwYXRoIGhhcyBhIGRldmljZSwgYW5kIGlmIGl0IGJlZ2lucyB3aXRoIElQYXRoLlNFUEFSQVRPUiwKLQkJLy8gcmVtb3ZlIGl0Ci0JCWZpbmFsIFN0cmluZyBkZXZpY2UgPSBwYXRoLmdldERldmljZSgpOwotCQlpZiAoKGRldmljZSAhPSBudWxsKSAmJiAoZGV2aWNlLmxlbmd0aCgpID4gMCkpIHsKLQkJCWlmIChkZXZpY2UuY2hhckF0KDApID09IElQYXRoLlNFUEFSQVRPUikgewotCQkJCWZpbmFsIFN0cmluZyBuZXdEZXZpY2UgPSBkZXZpY2Uuc3Vic3RyaW5nKDEpOwotCQkJCW5ld1BhdGggPSBwYXRoLnNldERldmljZShuZXdEZXZpY2UpOwotCQkJfQotCQl9Ci0JCS8vIGIuKSBpZiBpdCBoYXMgYSBob3N0bmFtZSwgaXQgaXMgVU5DIG5hbWUuLi4gQW55IGphdmEgb3IgZWNsaXBzZSBhcGkKLQkJLy8gaGVscHMgaXQgPz8KLQkJaWYgKHBhdGggIT0gbnVsbCAmJiBob3N0ICE9IG51bGwgJiYgaG9zdC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlJUGF0aCB1bmNQYXRoID0gbmV3IFBhdGgoaG9zdCk7Ci0JCQl1bmNQYXRoID0gdW5jUGF0aC5hcHBlbmQocGF0aCk7Ci0JCQluZXdQYXRoID0gdW5jUGF0aC5tYWtlVU5DKHRydWUpOwotCQl9Ci0JCXJldHVybiBuZXdQYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGF0aChVUkwgdXJsKSB7Ci0JCVN0cmluZyByZWYgPSB1cmwuZ2V0UmVmKCkgPT0gbnVsbCA/ICIiIDogIiMiICsgdXJsLmdldFJlZigpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3RyaW5nIHN0clBhdGggPSB1cmwuZ2V0RmlsZSgpICsgcmVmOwotCQlJUGF0aCBwYXRoOwotCQlpZiAoc3RyUGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlwYXRoID0gUGF0aC5ST09UOwotCQl9Ci0JCWVsc2UgewotCQkJcGF0aCA9IG5ldyBQYXRoKHN0clBhdGgpOwotCQkJU3RyaW5nIHF1ZXJ5ID0gbnVsbDsKLQkJCVN0cmluZ1Rva2VuaXplciBwYXJzZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0clBhdGgsICI/Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWludCB0b2tlbkNvdW50ID0gcGFyc2VyLmNvdW50VG9rZW5zKCk7Ci0JCQlpZiAodG9rZW5Db3VudCA9PSAyKSB7Ci0JCQkJcGF0aCA9IG5ldyBQYXRoKChTdHJpbmcpIHBhcnNlci5uZXh0RWxlbWVudCgpKTsKLQkJCQlxdWVyeSA9IChTdHJpbmcpIHBhcnNlci5uZXh0RWxlbWVudCgpOwotCQkJfQotCQkJaWYgKHF1ZXJ5ID09IG51bGwpIHsKLQkJCQlwYXJzZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdGgudG9TdHJpbmcoKSwgIiMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRva2VuQ291bnQgPSBwYXJzZXIuY291bnRUb2tlbnMoKTsKLQkJCQlpZiAodG9rZW5Db3VudCA9PSAyKSB7Ci0JCQkJCXBhdGggPSBuZXcgUGF0aCgoU3RyaW5nKSBwYXJzZXIubmV4dEVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRQYXRoKHBhdGgsIHVybC5nZXRIb3N0KCkpOwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXIgZ2V0Um9vdExvY2F0aW9uKCkgewotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSb290TG9jYXRpb25TdHJpbmcoKSB7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0JCWlmIChmUHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmUHJvamVjdC5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCWxvY2F0aW9uID0gZlByb2plY3QuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQl9Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsICYmIGZQcm9qZWN0LmdldExvY2F0aW9uVVJJKCkgIT0gbnVsbCkgewotCQkJbG9jYXRpb24gPSBmUHJvamVjdC5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJaWYgKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCWxvY2F0aW9uID0gZlByb2plY3QuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0VVJJU3RyZWFtKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gZGVmZWN0IDI0NDgxNyBzdGFydAotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwYXNzZWRTcGVjCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRmlsZVVSTChTdHJpbmcgcGFzc2VkU3BlYykgewotCQlpZiAocGFzc2VkU3BlYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZmluYWwgU3RyaW5nIHNwZWMgPSBwYXNzZWRTcGVjLnRyaW0oKTsKLQkJaWYgKHNwZWMubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZpbmFsIGludCBsaW1pdCA9IHNwZWMubGVuZ3RoKCk7Ci0JCVN0cmluZyBuZXdQcm90b2NvbCA9IG51bGw7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBsaW1pdDsgaW5kZXgrKykgewotCQkJZmluYWwgY2hhciBwID0gc3BlYy5jaGFyQXQoaW5kZXgpOwotCQkJaWYgKHAgPT0gJy8nKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChwID09ICc6JykgeyAvLyROT04tTkxTLTEkCi0JCQkJbmV3UHJvdG9jb2wgPSBzcGVjLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChuZXdQcm90b2NvbCAhPSBudWxsICYmIG5ld1Byb3RvY29sLmNvbXBhcmVUb0lnbm9yZUNhc2UoImZpbGUiKSA9PSAwKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbGVCYXNlTG9jYXRpb24oU3RyaW5nIG5ld0ZpbGVCYXNlTG9jYXRpb24pIHsKLQkJZkZpbGVCYXNlTG9jYXRpb24gPSBuZXdGaWxlQmFzZUxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgbmV3UHJvamVjdCkgewotCQlmUHJvamVjdCA9IG5ld1Byb2plY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1Jlc291cmNlVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1Jlc291cmNlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjU5ZWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9SZXNvdXJjZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIG1ha2VzIGFzc3VtcHRpb25zIG9uIGJlaGFsZiBvZiB0aGUgcmVxdWVzdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVV0aWwgewotCi0JLyoqCi0JICogT2J0YWlucyB0aGUgSUZpbGUgZm9yIGEgbW9kZWwKLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIHRoZSBtb2RlbCB0byB1c2UKLQkgKiBAcmV0dXJuIHRoZSBJRmlsZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbW9kZWwsIGlmIGl0IGNhbWUgZnJvbSBhbiBJRmlsZSwKLQkgKiAgICAgICAgIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlRm9yKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlJUGF0aCBsb2NhdGlvbiA9IG5ldyBQYXRoKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJLy8gaWYgdGhlIHBhdGggaXMgbm90IGEgcGF0aCBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIHRoZXJlIGFyZSBhdCBsZWFzdAotCQkvLyAyIHNlZ21lbnRzLCBpdCBtaWdodCBiZSBpbiB0aGUgd29ya3NwYWNlCi0JCUlGaWxlW10gZmlsZXMgPSByb290LmZpbmRGaWxlc0ZvckxvY2F0aW9uKGxvY2F0aW9uKTsKLQkJaWYgKGZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCWZpbGUgPSBmaWxlc1swXTsKLQkJfQotCQllbHNlIGlmIChsb2NhdGlvbi5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCS8vIHJlbWVtYmVyLCB0aGlzIElGaWxlIGlzbid0IGd1YXJhbnRlZWQgdG8gZXhpc3QKLQkJCWZpbGUgPSByb290LmdldEZpbGUobG9jYXRpb24pOwotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKgotCSAqIE9idGFpbiBJRmlsZXMgZnJvbSBJU3RydWN0dXJlZE1vZGVsIChpbmNsdWRlcyBsaW5rZWRSZXNvdXJjZXMpCi0JICogCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBmaWxlcyBpbiB0aGUgd29ya3NwYWNlLCBvciBhbiBlbXB0eSBhcnJheSBpZgotCSAqICAgICAgICAgbm9uZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbGVbXSBnZXRGaWxlc0ZvcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSUZpbGVbXSBmaWxlcyA9IG51bGw7Ci0JCUlQYXRoIGxvY2F0aW9uID0gbmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJLy8gaWYgdGhlIHBhdGggaXMgbm90IGEgcGF0aCBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIHRoZXJlIGFyZSBhdCBsZWFzdAotCQkvLyAyIHNlZ21lbnRzLCBpdCBtaWdodCBiZSBpbiB0aGUgd29ya3NwYWNlCi0JCWlmICghbG9jYXRpb24udG9GaWxlKCkuZXhpc3RzKCkgJiYgbG9jYXRpb24uc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkvLyByZW1lbWJlciwgdGhpcyBJRmlsZSBpc24ndCBndWFyYW50ZWVkIHRvIGV4aXN0Ci0JCQlmaWxlcyA9IG5ldyBJRmlsZVtde3Jvb3QuZ2V0RmlsZShsb2NhdGlvbil9OwotCQl9Ci0JCWVsc2UgewotCQkJZmlsZXMgPSByb290LmZpbmRGaWxlc0ZvckxvY2F0aW9uKGxvY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gZmlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1NjcmlwdExhbmd1YWdlS2V5cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1NjcmlwdExhbmd1YWdlS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDRkN2FhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9TY3JpcHRMYW5ndWFnZUtleXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotLyoqCi0gKiBDb250YWlucyBsaXN0IG9mIHNjcmlwdCBsYW5ndWFnZXMgYW5kIG1pbWUgdHlwZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBTY3JpcHRMYW5ndWFnZUtleXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQSA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBKQVZBX0xBTkdVQUdFX0tFWVMgPSBuZXcgU3RyaW5nW117ImphdmEifTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVNDUklQVCA9ICJqYXZhc2NyaXB0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTID0geyJqYXZhc2NyaXB0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS4wIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS4xIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS4yIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS4zIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS40IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS41IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS42IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqc2NyaXB0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJzYXNoc2NyaXB0In07IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSkFWQVNDUklQVF9NSU1FX1RZUEVfS0VZUyA9IHsidGV4dC9qYXZhc2NyaXB0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJ0ZXh0L2pzY3JpcHQiLCAvLyROT04tTkxTLTEkCi0JCQkJInRleHQvc2FzaHNjcmlwdCJ9OyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvU29ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxY2RmMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1NvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotLyoqCi0gKiBUaGUgU29ydE9wZXJhdGlvbiB0YWtlcyBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyBhbmQgcmV0dXJucyBhIHNvcnRlZAotICogY29sbGVjdGlvbiBvZiB0aGVzZSBvYmplY3RzLiBDb25jcmV0ZSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBwcm92aWRlIHRoZQotICogY3JpdGVyaWEgZm9yIHRoZSBzb3J0aW5nIG9mIHRoZSBvYmplY3RzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRoZSBvYmplY3RzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU29ydGVyIHsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZmYgZWxlbWVudFR3byBpcyAnZ3JlYXRlciB0aGFuJyBlbGVtZW50T25lLiBUaGlzIGlzIHRoZQotCSAqICdvcmRlcmluZycgbWV0aG9kIG9mIHRoZSBzb3J0IG9wZXJhdGlvbi4gRWFjaCBzdWJjbGFzcyBvdmVycmlkZXMgdGhpcwotCSAqIG1ldGhvZCB3aXRoIHRoZSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG9mIHRoZSAnZ3JlYXRlciB0aGFuJyBjb25jZXB0Ci0JICogZm9yIHRoZSBvYmplY3RzIGJlaW5nIHNvcnRlZC4gSWYgZWxlbWVudE9uZSBhbmQgZWxlbWVudFR3byBhcmUKLQkgKiBlcXVpdmFsZW50IGluIHRlcm1zIG9mIHRoZWlyIHNvcnRpbmcgb3JkZXIsIHRoaXMgbWV0aG9kIG11c3QgcmV0dXJuCi0JICogJ2ZhbHNlJy4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb21wYXJlKE9iamVjdCBlbGVtZW50T25lLCBPYmplY3QgZWxlbWVudFR3byk7Ci0KLQkvKioKLQkgKiBTb3J0IHRoZSBvYmplY3RzIGluIHRoZSBhcnJheSBhbmQgcmV0dXJuIHRoZSBhcnJheS4KLQkgKi8KLQlwcml2YXRlIE9iamVjdFtdIHF1aWNrU29ydChPYmplY3RbXSBhcnJheSwgaW50IGxlZnQsIGludCByaWdodCkgewotCQlpbnQgb3JpZ2luYWxMZWZ0ID0gbGVmdDsKLQkJaW50IG9yaWdpbmFsUmlnaHQgPSByaWdodDsKLQkJT2JqZWN0IG1pZCA9IGFycmF5WyhsZWZ0ICsgcmlnaHQpIC8gMl07Ci0KLQkJZG8gewotCQkJd2hpbGUgKGNvbXBhcmUoYXJyYXlbbGVmdF0sIG1pZCkpCi0JCQkJbGVmdCsrOwotCQkJd2hpbGUgKGNvbXBhcmUobWlkLCBhcnJheVtyaWdodF0pKQotCQkJCXJpZ2h0LS07Ci0JCQlpZiAobGVmdCA8PSByaWdodCkgewotCQkJCU9iamVjdCB0bXAgPSBhcnJheVtsZWZ0XTsKLQkJCQlhcnJheVtsZWZ0XSA9IGFycmF5W3JpZ2h0XTsKLQkJCQlhcnJheVtyaWdodF0gPSB0bXA7Ci0JCQkJbGVmdCsrOwotCQkJCXJpZ2h0LS07Ci0JCQl9Ci0JCX0gd2hpbGUgKGxlZnQgPD0gcmlnaHQpOwotCi0JCWlmIChvcmlnaW5hbExlZnQgPCByaWdodCkKLQkJCWFycmF5ID0gcXVpY2tTb3J0KGFycmF5LCBvcmlnaW5hbExlZnQsIHJpZ2h0KTsKLQkJaWYgKGxlZnQgPCBvcmlnaW5hbFJpZ2h0KQotCQkJYXJyYXkgPSBxdWlja1NvcnQoYXJyYXksIGxlZnQsIG9yaWdpbmFsUmlnaHQpOwotCi0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgKHF1aWNrKXNvcnRlZCBhcnJheSBmcm9tIHRoaXMgdW5zb3J0ZWQgYXJyYXkuIFRoZSBvcmlnaW5hbAotCSAqIGFycmF5IGlzIG5vdCBtb2RpZmllZC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gc29ydChPYmplY3RbXSB1blNvcnRlZENvbGxlY3Rpb24pIHsKLQkJaW50IHNpemUgPSB1blNvcnRlZENvbGxlY3Rpb24ubGVuZ3RoOwotCQlPYmplY3RbXSBzb3J0ZWRDb2xsZWN0aW9uID0gbmV3IE9iamVjdFtzaXplXTsKLQotCQkvL2NvcHkgdGhlIGFycmF5IHNvIGNhbiByZXR1cm4gYSBuZXcgc29ydGVkIGNvbGxlY3Rpb24KLQkJU3lzdGVtLmFycmF5Y29weSh1blNvcnRlZENvbGxlY3Rpb24sIDAsIHNvcnRlZENvbGxlY3Rpb24sIDAsIHNpemUpOwotCQlpZiAoc2l6ZSA+IDEpCi0JCQlxdWlja1NvcnQoc29ydGVkQ29sbGVjdGlvbiwgMCwgc2l6ZSAtIDEpOwotCi0JCXJldHVybiBzb3J0ZWRDb2xsZWN0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9UZXh0VXRpbGl0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvVGV4dFV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjNmYTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9UZXh0VXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi0vKioKLSAqIENvbGxlY3Rpb24gb2YgdGV4dCBmdW5jdGlvbnMuCi0gKiBAZGVwcmVjYXRlZCAtIHRoZSBKRmFjZSBjbGFzcyBpcyBwdWJsaWMgaW4gMy4xCi0gKi8KLS8vIFRoaXMgY2xhc3Mgd2FzIG9yaWdpbmFsbHkgY29waWVkIGZyb20gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwgYW5kIG1hZGUKLS8vIHB1YmxpYwotcHVibGljIGNsYXNzIFRleHRVdGlsaXRpZXMgewotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdGV4dCBlbmRzIHdpdGggb25lIG9mIHRoZSBnaXZlbiBzZWFyY2ggc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5kc1dpdGgoU3RyaW5nW10gc2VhcmNoU3RyaW5ncywgU3RyaW5nIHRleHQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodGV4dC5lbmRzV2l0aChzZWFyY2hTdHJpbmdzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcG9zaXRpb24gaW4gdGhlIHN0cmluZyBncmVhdGVyIHRoYW4gb2Zmc2V0IG9mIHRoZSBsb25nZXN0Ci0JICogbWF0Y2hpbmcgc2VhcmNoIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGluZGV4T2YoU3RyaW5nW10gc2VhcmNoU3RyaW5ncywgU3RyaW5nIHRleHQsIGludCBvZmZzZXQpIHsKLQotCQlpbnRbXSByZXN1bHQgPSB7LTEsIC0xfTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlYXJjaFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWludCBpbmRleCA9IHRleHQuaW5kZXhPZihzZWFyY2hTdHJpbmdzW2ldLCBvZmZzZXQpOwotCQkJaWYgKGluZGV4ID49IDApIHsKLQotCQkJCWlmIChyZXN1bHRbMF0gPT0gLTEpIHsKLQkJCQkJcmVzdWx0WzBdID0gaW5kZXg7Ci0JCQkJCXJlc3VsdFsxXSA9IGk7Ci0JCQkJfSBlbHNlIGlmIChpbmRleCA8IHJlc3VsdFswXSkgewotCQkJCQlyZXN1bHRbMF0gPSBpbmRleDsKLQkJCQkJcmVzdWx0WzFdID0gaTsKLQkJCQl9IGVsc2UgaWYgKGluZGV4ID09IHJlc3VsdFswXSAmJiBzZWFyY2hTdHJpbmdzW2ldLmxlbmd0aCgpID4gc2VhcmNoU3RyaW5nc1tyZXN1bHRbMV1dLmxlbmd0aCgpKSB7Ci0JCQkJCXJlc3VsdFswXSA9IGluZGV4OwotCQkJCQlyZXN1bHRbMV0gPSBpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvVVJJUmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9VUklSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjI1OWViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9VUklSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICogCi0gKiBTaG91bGQgdXNlIGV4dGVuc2libGUgVVJJUmVzb2x2ZXIgZnJvbSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyCi0gKiBpbnN0ZWFkLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgVVJJUmVzb2x2ZXIgewotCi0JU3RyaW5nIGdldEZpbGVCYXNlTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJlc29sdmUgdGhlIChwb3NzaWJseSByZWxhdGl2ZSkgVVJJIGFjb3JkaW5nIHRvIFJGQzE4MDggdXNpbmcgdGhlCi0JICogZGVmYXVsdCBmaWxlIGJhc2UgbG9jYXRpb24uIFJlc29sdmVzIHJlc291cmNlIHJlZmVyZW5jZXMgaW50byBhYnNvbHV0ZQotCSAqIHJlc291cmNlIGxvY2F0aW9ucyB3aXRob3V0IGVuc3VyaW5nIHRoYXQgdGhlIHJlc291cmNlIGFjdHVhbGx5IGV4aXN0cy4KLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIFJlc29sdmUgdGhlIChwb3NzaWJseSByZWxhdGl2ZSkgVVJJIGFjb3JkaW5nIHRvIFJGQzE4MDggdXNpbmcgdGhlCi0JICogZGVmYXVsdCBmaWxlIGJhc2UgbG9jYXRpb24uIFJlc29sdmVzIHJlc291cmNlIHJlZmVyZW5jZXMgaW50byBhYnNvbHV0ZQotCSAqIHJlc291cmNlIGxvY2F0aW9ucyB3aXRob3V0IGVuc3VyaW5nIHRoYXQgdGhlIHJlc291cmNlIGFjdHVhbGx5IGV4aXN0cy4KLQkgKiAKLQkgKiBJZiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MgaXMgc2V0IHRvIHRydWUsIHRoZW4gdGhpcyBtZXRob2Qgd2lsbAotCSAqIHByb3Blcmx5IHJlc29sdmUgdGhlIFVSSSBpZiBpdCBpcyBhIHZhbGlkIFVSSSB0byBhbm90aGVyIChhcHByb3ByaWF0ZSkKLQkgKiBwcm9qZWN0LgotCSAqLwotCVN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKTsKLQotCS8qKgotCSAqIFBlcmZvcm0gdGhlIGdldExvY2F0aW9uQnlVUkkgYWN0aW9uIHVzaW5nIHRoZSBiYXNlUmVmZXJlbmNlIGFzIHRoZQotCSAqIHBvaW50IG9mIHJlZmVyZW5jZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGZvciB0aGlzIHJlc29sdmVyCi0JICovCi0JU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2VSZWZlcmVuY2UpOwotCi0JLyoqCi0JICogUGVyZm9ybSB0aGUgZ2V0TG9jYXRpb25CeVVSSSBhY3Rpb24gdXNpbmcgdGhlIGJhc2VSZWZlcmVuY2UgYXMgdGhlCi0JICogcG9pbnQgb2YgcmVmZXJlbmNlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgZm9yIHRoaXMgcmVzb2x2ZXIKLQkgKiAKLQkgKiBJZiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MgaXMgc2V0IHRvIHRydWUsIHRoZW4gdGhpcyBtZXRob2Qgd2lsbAotCSAqIHByb3Blcmx5IHJlc29sdmUgdGhlIFVSSSBpZiBpdCBpcyBhIHZhbGlkIFVSSSB0byBhbm90aGVyIChhcHByb3ByaWF0ZSkKLQkgKiBwcm9qZWN0LgotCSAqLwotCVN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIFN0cmluZyBiYXNlUmVmZXJlbmNlLCBib29sZWFuIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcyk7Ci0KLQlJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0KLQlJQ29udGFpbmVyIGdldFJvb3RMb2NhdGlvbigpOwotCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gcmV0dXJuIGEgZGlyZWN0IGlucHV0c3RyZWFtIHRvIHRoZSBnaXZlbiBVUkkgd2hpY2ggbXVzdCBiZQotCSAqIHJlbGF0aXZlIHRvIHRoZSBkZWZhdWx0IHBvaW50IG9mIHJlZmVyZW5jZS4KLQkgKiAKLQkgKi8KLQlJbnB1dFN0cmVhbSBnZXRVUklTdHJlYW0oU3RyaW5nIHVyaSk7Ci0KLQl2b2lkIHNldEZpbGVCYXNlTG9jYXRpb24oU3RyaW5nIG5ld0xvY2F0aW9uKTsKLQotCXZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBuZXdQcm9qZWN0KTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1V0aWxpdGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1V0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTFjNWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9VdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5CdWZmZXJlZExpbWl0ZWRTdHJlYW07Ci0KLQotCi1wdWJsaWMgY2xhc3MgVXRpbGl0aWVzIHsKLQotCS8qKgotCSAqIGEgY29tbW9uIGNhbGN1bGF0aW9uIGluIHNvbWUgb2YgdGhlIHBhcnNpbmcgbWV0aG9kcyAoZS5nLiBpbgotCSAqIENvbnRleHRSZWdpb24gYW5kIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShTdHJpbmcgY2hhbmdlcywgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBkZXRlcm1pbmUgdGhlIGxlbmd0aCBieSB0aGUgdGV4dCBpdHNlbGYsIG9yLCBpZiB0aGVyZSBpcyBubyB0ZXh0IHRvCi0JCS8vIGluc2VydCAoaS5lLiB3ZSBhcmUgZG9pbmcgYSBkZWxldGUpIHRoZW4gY2FsY3VsYXRlIHRoZSBsZW5ndGggYXMKLQkJLy8gYSBuZWdhdGl2ZSBudW1iZXIgdG8gZGVub3RlIHRoZSBhbW91bnQgdG8gZGVsZXRlLgotCQkvLyBGb3IgYSBzdHJhaWdodCBpbnNlcnQsIHRoZSBzZWxlY3Rpb24gTGVuZ3RoIHdpbGwgYmUgemVyby4KLQkJaW50IGxlbmd0aERpZmZlcmVuY2UgPSAwOwotCQlpZiAoY2hhbmdlcyA9PSBudWxsKSB7Ci0JCQkvLyB0aGUgZGVsZXRlIGNhc2UKLQkJCWxlbmd0aERpZmZlcmVuY2UgPSAwIC0gbGVuZ3RoVG9SZXBsYWNlOwotCQl9Ci0JCWVsc2UgewotCQkJbGVuZ3RoRGlmZmVyZW5jZSA9IGNoYW5nZXMubGVuZ3RoKCkgLSBsZW5ndGhUb1JlcGxhY2U7Ci0JCX0KLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImxlbmd0aERpZmZlcmVuY2U6ICIgKyBsZW5ndGhEaWZmZXJlbmNlKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGxlbmd0aERpZmZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmZiBib3RoIHBhcmFtZXRlcnMgYXJlIG5vdCBudWxsIGFuZCB0aGUgb2JqZWN0IGlzIHdpdGhpbgotCSAqIHRoZSBhcnJheS4gQ2FyZWZ1bCwgdGhpcyB1c2VzIGlkZW50aXR5LiBOb3QgZ29vZCBmb3IgYmFzaWMgc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0W10gb2JqZWN0QXJyYXksIE9iamVjdCBvYmplY3QpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gaWYgb2JqZWN0IG9yIG9iamVjdEFycmF5IGlzIG51bGwsIHJldHVybiBmYWxzZQotCQlpZiAoKG9iamVjdEFycmF5ICE9IG51bGwpICYmIChvYmplY3QgIT0gbnVsbCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0QXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAob2JqZWN0QXJyYXlbaV0gPT0gb2JqZWN0KSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc1N0cmluZyhTdHJpbmdbXSBvYmplY3RBcnJheSwgU3RyaW5nIG9iamVjdCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBpZiBvYmplY3Qgb3Igb2JqZWN0QXJyYXkgaXMgbnVsbCwgcmV0dXJuIGZhbHNlCi0JCWlmICgob2JqZWN0QXJyYXkgIT0gbnVsbCkgJiYgKG9iamVjdCAhPSBudWxsKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RBcnJheS5sZW5ndGg7IGkrKykgewotCQkJCWlmIChvYmplY3RBcnJheVtpXS5lcXVhbHMob2JqZWN0KSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgYW4gSW5wdXRTdHJlYW0gaGFzIG1hcmsvcmVzZXQgc3VwcG9ydCwgaXMgcmVhZGxpbWl0IGlzCi0JICogc2V0LCBhbmQgdGhhdCB0aGUgc3RyZWFtIGlzICJsaW1pdGFibGUiICh0aGF0IGlzLCByZXBvcnRzICJlbmQgb2YKLQkgKiBpbnB1dCIgcmF0aGVyIHRoYW4gYWxsb3cgZ29pbmcgcGFzdCBtYXJrKS4gVGhpcyBpcyB2ZXJ5IHNwZWNpYWxpemVkCi0JICogc3RyZWFtIGludHJvZHVjZWQgdG8gb3ZlcmNvbWUKLQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjcyMTEuIFNlZSBhbHNvCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY4NTY1Ci0JICovCi0JcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRMaW1pdGVkU3RyZWFtKElucHV0U3RyZWFtIG9yaWdpbmFsKSB7Ci0JCWlmIChvcmlnaW5hbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChvcmlnaW5hbCBpbnN0YW5jZW9mIEJ1ZmZlcmVkTGltaXRlZFN0cmVhbSkKLQkJCXJldHVybiBvcmlnaW5hbDsKLQkJcmV0dXJuIG5ldyBCdWZmZXJlZExpbWl0ZWRTdHJlYW0ob3JpZ2luYWwsIENvZGVkSU8uTUFYX0JVRl9TSVpFKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFbnN1cmVzIHRoYXQgYW4gSW5wdXRTdHJlYW0gaGFzIG1hcmsvcmVzZXQgc3VwcG9ydC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSXQncyB2aXRhbCB0aGF0IGEgQnVmZmVyZWRJbnB1dFN0cmVhbSA8Yj5ub3Q8L2I+IGJlIHdyYXBwZWQgaW4gYW5vdGhlcgotCSAqIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYXMgZWFjaCBjYW4gcHJlZW1wdGl2ZWx5IGNvbnN1bWUgPGk+bjwvaT4gYnl0ZXMKLQkgKiAoZS5nLiAyMDQ4KSBmcm9tIHRoZSBwYXJlbnQgc3RyZWFtIGJlZm9yZSBhbnkgcmVxdWVzdHMgYXJlIG1hZGUuIFRoZQotCSAqIGNhc2NhZGluZyBlZmZlY3QgaXMgdGhhdCB0aGUgc2Vjb25kL2lubmVyIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gY2FuIG5ldmVyCi0JICogcmV3aW5kIGl0c2VsZiB0byB0aGUgZmlyc3QgPGk+bjwvaT4gYnl0ZXMgc2luY2UgdGhleSB3ZXJlIGFscmVhZHkKLQkgKiBjb25zdW1lZCBieSBpdHMgcGFyZW50LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oSW5wdXRTdHJlYW0gb3JpZ2luYWwpIHsKLQkJaWYgKG9yaWdpbmFsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG9yaWdpbmFsLm1hcmtTdXBwb3J0ZWQoKSkKLQkJCXJldHVybiBvcmlnaW5hbDsKLQkJSW5wdXRTdHJlYW0gYnVmZmVyZWQgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShvcmlnaW5hbCwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQlidWZmZXJlZC5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCXJldHVybiBidWZmZXJlZDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGZvciBsb2cvdHJhY2UgbWVzc2FnZXMuIElkIGlzIGFzc3VtZWQgdG8gYmUgc29tZSBmb3JtIG9mIGEKLQkgKiBmaWxlbmFtZS4gU2VlIElNb2RlbE1hbmFnZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZVNob3J0SWQoT2JqZWN0IGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJaWQgPSAiTk9JRCI7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgd2hvbGUgPSBpZC50b1N0cmluZygpOwotCQlTdHJpbmcgcGFydCA9IHdob2xlLnN1YnN0cmluZyh3aG9sZS5sYXN0SW5kZXhPZigiLyIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuICIuLi4iICsgcGFydDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogVXRpbGl0aWVzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFV0aWxpdGllcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9ySW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FcnJvckluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2YjkyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9ySW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRXJyb3JJbmZvIHsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGludCgpOwotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKTsKLQotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCk7Ci0KLQlwdWJsaWMgaW50IGdldFN0YXRlKCk7Ci0KLQlwdWJsaWMgc2hvcnQgZ2V0VGFyZ2V0VHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzYwMjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRSZXBvcnRlcihWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwb3J0ZXIpOwotCi0JLyoqCi0JICovCi0Jdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjJmNjA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbk1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25NZXNzYWdlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJR05PUkUgPSAtMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT1JNQVRJT04gPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSAyOwotCXByaXZhdGUgaW50IGxlbmd0aDsKLQotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0JcHJpdmF0ZSBpbnQgb2Zmc2V0OwotCXByaXZhdGUgaW50IHNldmVyaXR5OwotCi0JLyoqCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25NZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgb2Zmc2V0LCBpbnQgc2V2ZXJpdHkpIHsKLQkJdGhpcyhtZXNzYWdlLCBvZmZzZXQsIDAsIHNldmVyaXR5KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBzZXZlcml0eSkgewotCQlzdXBlcigpOwotCi0JCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQkJdGhpcy5zZXZlcml0eSA9IHNldmVyaXR5OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gdGhpcy5tZXNzYWdlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gdGhpcy5vZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJcmV0dXJuIHRoaXMuc2V2ZXJpdHk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uUmVwb3J0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvblJlcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYTA2YjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uUmVwb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25SZXBvcnRlciB7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlcG9ydChWYWxpZGF0aW9uTWVzc2FnZSBtZXNzYWdlKTsKLQkKLQl2b2lkIHJlcG9ydChFcnJvckluZm8gaW5mbyk7Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ZhbGlkYXRvckdyb3VwTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzRjMjcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSVZhbGlkYXRvckdyb3VwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yR3JvdXBMaXN0ZW5lciBpbXBsZW1lbnRzIElWYWxpZGF0b3JHcm91cExpc3RlbmVyIHsKLQotCU1hcCBmRGlhZ25vc3RpY01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWcgPSBmYWxzZTsKLQotCXB1YmxpYyBWYWxpZGF0b3JHcm91cExpc3RlbmVyKCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXN1cGVyLmZpbmFsaXplKCk7Ci0JCWlmIChmRGlhZ25vc3RpY01hcCAhPSBudWxsICYmICFmRGlhZ25vc3RpY01hcC5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIHBhdGhzID0gZkRpYWdub3N0aWNNYXAua2V5U2V0KCkudG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiTGVha2VkIG1vZGVsOiAiICsgcGF0aHNbaV0pOwotCQkJCXZhbGlkYXRpb25GaW5pc2hpbmcoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKChJUGF0aCkgcGF0aHNbaV0pLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRpb25GaW5pc2hpbmcoSVJlc291cmNlIHJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSkgewotCQlpZiAoX2RlYnVnKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaW5pc2hpbmc6IiArIHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSAoSVN0cnVjdHVyZWRNb2RlbCkgZkRpYWdub3N0aWNNYXAucmVtb3ZlKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0aW9uU3RhcnRpbmcoSVJlc291cmNlIHJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSkgewotCQlpZiAoX2RlYnVnKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZzogIiArIHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotCQl0cnkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiAhbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCQkJLy8gcG9zc2libGUgd2hlbiBzaHV0dGluZyBkb3duCi0JCQkJaWYgKG1vZGVsTWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKChJRmlsZSkgcmVzb3VyY2UpOwotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJZkRpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLmdldEZ1bGxQYXRoKCksIG1vZGVsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25zLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxY2ZjMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS90ZXh0L0lTdHJ1Y3R1cmVkUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbmluZyBmb3IgU3RydWN0dXJlZERvY3VtZW50cy4KLSAqIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFBhcnRpdGlvbnMgewotCi0JU3RyaW5nIERFRkFVTFRfUEFSVElUSU9OID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuU1RfREVGQVVMVCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVU5LTk9XTl9QQVJUSVRJT04gPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5VTktOT1dOX1BBUlRJVElPTl9UWVBFIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91dGlscy9TdHJpbmdVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91dGlscy9TdHJpbmdVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmRjYTdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbHMvU3RyaW5nVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChJbnRhbGlvKSAtIGJ1ZyAzMDA0MzAgLSBTdHJpbmcgY29uY2F0ZW5hdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlsczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBTdHJpbmdVdGlscyB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU1QRVJTVEFORCA9ICImIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFNUEVSU1RBTkRfRU5USVRZID0gIiYmOyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVJSSUFHRV9SRVRVUk4gPSAiXHIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FSUklBR0VfUkVUVVJOX0VOVElUWSA9ICJcXHIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSAiXHIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JMRiA9ICJcclxuIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElNSVRFUlMgPSAiIFx0XG5cclxmIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRV9RVU9URSA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgRE9VQkxFX1FVT1RFX0NIQVIgPSAnXCInOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX1FVT1RFX0VOVElUWSA9ICImcXVvdDsiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFUVVBTF9TSUdOID0gIj0iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVFVQUxfU0lHTl9FTlRJVFkgPSAiJiM2MTsiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUFURVJfVEhBTiA9ICI+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUFURVJfVEhBTl9FTlRJVFkgPSAiJmd0OyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMRVNTX1RIQU4gPSAiPCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMRVNTX1RIQU5fRU5USVRZID0gIiZsdDsiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEYgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9GRUVEID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfRkVFRF9FTlRJVFkgPSAiXFxuIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfRkVFRF9UQUcgPSAiPGRsPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1RBQiA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1RBQl9FTlRJVFkgPSAiXFx0IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfVEFCX1RBRyA9ICI8ZGQ+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9RVU9URSA9ICInIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBTSU5HTEVfUVVPVEVfQ0hBUiA9ICdcJyc7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfUVVPVEVfRU5USVRZID0gIiYjMDM5OyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRSA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQUNFX0VOVElUWSA9ICImbmJzcDsiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFwcGVuZCBhcHBlbmRTdHJpbmcgdG8gdGhlIGVuZCBvZiBhU3RyaW5nIG9ubHkgaWYgYVN0cmluZyBkb2VzIG5vdCBlbmQKLQkgKiB3aXRoIHRoZSBpbnNlcnRTdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwZW5kSWZOb3RFbmRXaXRoKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgYXBwZW5kU3RyaW5nKSB7Ci0JCWlmICgoYVN0cmluZyAhPSBudWxsKSAmJiAoYXBwZW5kU3RyaW5nICE9IG51bGwpKQotCQkJaWYgKGFTdHJpbmcuZW5kc1dpdGgoYXBwZW5kU3RyaW5nKSkKLQkJCQlyZXR1cm4gYVN0cmluZzsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gYVN0cmluZyArIGFwcGVuZFN0cmluZzsKLQkJZWxzZQotCQkJcmV0dXJuIGFTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQnJlYWtzIG91dCBzcGFjZS1zZXBhcmF0ZWQgd29yZHMgaW50byBhbiBhcnJheSBvZiB3b3Jkcy4gRm9yIGV4YW1wbGU6Ci0JICogPGNvZGU+Im5vIGNvbW1lbnQiPC9jb2RlPiBpbnRvIGFuIGFycmF5IDxjb2RlPmFbMF09Im5vIjwvY29kZT4gYW5kCi0JICogPGNvZGU+YVsxXT0gImNvbW1lbnQiPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgY29udmVydGVkCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiB3b3JkcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gYXNBcnJheShTdHJpbmcgdmFsdWUpIHsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSk7Ci0JCXdoaWxlIChzdG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJbGlzdC5hZGQoc3Rvay5uZXh0VG9rZW4oKSk7Ci0JCX0KLQkJU3RyaW5nIHJlc3VsdFtdID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEJyZWFrcyBvdXQgZGVsaW0tc2VwYXJhdGVkIHdvcmRzIGludG8gYW4gYXJyYXkgb2Ygd29yZHMuIEZvciBleGFtcGxlOgotCSAqIDxjb2RlPiJubyBjb21tZW50IjwvY29kZT4gaW50byBhbiBhcnJheSA8Y29kZT5hWzBdPSJubyI8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmFbMV09ICJjb21tZW50IjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygd29yZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGFzQXJyYXkoU3RyaW5nIHZhbHVlLCBTdHJpbmcgZGVsaW0pIHsKLQkJcmV0dXJuIGFzQXJyYXkodmFsdWUsIGRlbGltLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQnJlYWtzIG91dCBkZWxpbS1zZXBhcmF0ZWQgd29yZHMgaW50byBhbiBhcnJheSBvZiB3b3Jkcy4gRm9yIGV4YW1wbGU6Ci0JICogPGNvZGU+Im5vIGNvbW1lbnQiPC9jb2RlPiBpbnRvIGFuIGFycmF5IDxjb2RlPmFbMF09Im5vIjwvY29kZT4gYW5kCi0JICogPGNvZGU+YVsxXT0gImNvbW1lbnQiPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgY29udmVydGVkCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiB3b3JkcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gYXNBcnJheShTdHJpbmcgdmFsdWUsIFN0cmluZyBkZWxpbSwgYm9vbGVhbiByZXR1cm5Ub2tlbnMpIHsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwgZGVsaW0sIHJldHVyblRva2Vucyk7Ci0JCXdoaWxlIChzdG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJbGlzdC5hZGQoc3Rvay5uZXh0VG9rZW4oKSk7Ci0JCX0KLQkJU3RyaW5nIHJlc3VsdFtdID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEJyZWFrcyBvdXQgZGVsaW0tc2VwYXJhdGVkIHdvcmRzIGludG8gYW4gYXJyYXkgb2Ygd29yZHMuIEZvciBleGFtcGxlOgotCSAqIDxjb2RlPiJhYmMsLGRlZiI8L2NvZGU+IGludG8gYW4gYXJyYXkgPGNvZGU+YVswXT0iYWJjIjwvY29kZT4sCi0JICogPGNvZGU+YVsxXT1udWxsPC9jb2RlPiwgYW5kIDxjb2RlPmFbMl09ICJkZWYiPC9jb2RlPiB3aGVyZSAiLCIgaXMKLQkgKiB0aGUgZGVsaW0uCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygd29yZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGFzRml4ZWRBcnJheShTdHJpbmcgdmFsdWUsIFN0cmluZyBkZWxpbSkgewotCQlTdHJpbmcgYXJyYXlbXSA9IGFzQXJyYXkodmFsdWUsIGRlbGltLCB0cnVlKTsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlib29sZWFuIHN0cmluZ0ZvdW5kID0gZmFsc2U7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHRva2VuID0gYXJyYXlbaV07Ci0JCQlpZiAodG9rZW4uY29tcGFyZVRvKGRlbGltKSA9PSAwKSB7Ci0JCQkJaWYgKCFzdHJpbmdGb3VuZCkKLQkJCQkJbGlzdC5hZGQobnVsbCk7Ci0JCQkJc3RyaW5nRm91bmQgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWxpc3QuYWRkKHRva2VuKTsKLQkJCQlzdHJpbmdGb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gYWRkIG9uZSBtb3JlIG51bGwgaWYgbGFzdCB0b2tlbiBpcyB0aGUgZGVsaW0KLQkJaWYgKCFzdHJpbmdGb3VuZCkKLQkJCWxpc3QuYWRkKG51bGwpOwotCi0JCVN0cmluZyByZXN1bHRbXSA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaG9wKFN0cmluZyBzb3VyY2UpIHsKLQkJcmV0dXJuIGNob3Aoc291cmNlLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hvcChTdHJpbmcgc291cmNlLCBTdHJpbmcgZGVsaW1pdGVyKSB7Ci0JCXJldHVybiBzb3VyY2Uuc3Vic3RyaW5nKDAsIHNvdXJjZS5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nW10gYXJyYXlPZlN0cmluZ3MsIFN0cmluZyBuZWVkbGUsIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAobmVlZGxlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChhcnJheU9mU3RyaW5ncyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChjYXNlU2Vuc2l0aXZlKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5T2ZTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG5lZWRsZS5lcXVhbHMoYXJyYXlPZlN0cmluZ3NbaV0pKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlPZlN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAobmVlZGxlLmVxdWFsc0lnbm9yZUNhc2UoYXJyYXlPZlN0cmluZ3NbaV0pKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0xldHRlcnMoU3RyaW5nIGZ1bGxWYWx1ZSkgewotCi0JCWlmIChmdWxsVmFsdWUgPT0gbnVsbCB8fCBmdWxsVmFsdWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQljaGFyW10gY2hhcnMgPSBmdWxsVmFsdWUudG9DaGFyQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmdWxsVmFsdWUubGVuZ3RoKCk7IGkrKykKLQkJCWlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoY2hhcnNbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNMaW5lRGVsaW1pdGVyKFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBpbmRleE9mTGluZURlbGltaXRlcihhU3RyaW5nKSAhPSAtMTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0TGluZURlbGltaXRlcnMoU3RyaW5nIGFsbFRleHQsIFN0cmluZyBsaW5lRGVsaW1pdGVyVG9Vc2UpIHsKLQkJSURvY3VtZW50IHRlbXBEb2MgPSBuZXcgRG9jdW1lbnQoYWxsVGV4dCk7Ci0KLQkJaWYgKGxpbmVEZWxpbWl0ZXJUb1VzZSA9PSBudWxsKQotCQkJbGluZURlbGltaXRlclRvVXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIG5ld1RleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgbGluZUNvdW50ID0gdGVtcERvYy5nZXROdW1iZXJPZkxpbmVzKCk7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIobmV3VGV4dCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZUNvdW50OyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uIGxpbmVJbmZvID0gdGVtcERvYy5nZXRMaW5lSW5mb3JtYXRpb24oaSk7Ci0JCQkJaW50IGxpbmVTdGFydE9mZnNldCA9IGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJCWludCBsaW5lTGVuZ3RoID0gbGluZUluZm8uZ2V0TGVuZ3RoKCk7Ci0JCQkJaW50IGxpbmVFbmRPZmZzZXQgPSBsaW5lU3RhcnRPZmZzZXQgKyBsaW5lTGVuZ3RoOwotCQkJCXNiLmFwcGVuZChhbGxUZXh0LnN1YnN0cmluZyhsaW5lU3RhcnRPZmZzZXQsIGxpbmVFbmRPZmZzZXQpKTsKLQotCQkJCWlmICgoaSA8IGxpbmVDb3VudCAtIDEpICYmICh0ZW1wRG9jLmdldExpbmVEZWxpbWl0ZXIoaSkgIT0gbnVsbCkpIHsKLQkJCQkJc2IuYXBwZW5kKGxpbmVEZWxpbWl0ZXJUb1VzZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQluZXdUZXh0ID0gc2IudG9TdHJpbmcoKTsKLQotCQlyZXR1cm4gbmV3VGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyBhbGwgaW5zdGFuY2VzIG9mIHNwZWNpYWwgSFRNTCBjaGFyYWN0ZXJzIHdpdGggdGhlIGFwcHJvcHJpYXRlCi0JICogSFRNTCBlbnRpdHkgZXF1aXZhbGVudC4gV0FSTklORyBvbmx5IHVzZSB0aGlzIG1ldGhvZCBmb3Igc3RyaW5ncyB0aGF0Ci0JICogZG9udCBhbHJlYWR5IGhhdmUgSFRNTC1zcGVjaWZpYyBpdGVtcyBzdWNoIGFzIHRhZ3MgYW5kIGVudGl0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgU3RyaW5nIHRvIGNvbnZlcnQKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgY29udmVydGVkIHN0cmluZwotCSAqIEBzZWUgSFRNTFByaW50ZXIjY29udmVydFRvSFRNTENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSFRNTENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgQU1QRVJTVEFORCwgQU1QRVJTVEFORF9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMRVNTX1RIQU4sIExFU1NfVEhBTl9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBHUkVBVEVSX1RIQU4sIEdSRUFURVJfVEhBTl9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMSU5FX0ZFRUQsIExJTkVfRkVFRF9UQUcpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMSU5FX1RBQiwgTElORV9UQUJfVEFHKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgU0lOR0xFX1FVT1RFLCBTSU5HTEVfUVVPVEVfRU5USVRZKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgRE9VQkxFX1FVT1RFLCBET1VCTEVfUVVPVEVfRU5USVRZKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgU1BBQ0UgKyBTUEFDRSwgU1BBQ0VfRU5USVRZICsgU1BBQ0VfRU5USVRZKTsgLy8gcmVwbGFjaW5nCi0JCS8vIGV2ZXJ5Ci0JCS8vIHNwYWNlCi0JCS8vIHdvdWxkCi0JCS8vIGJlCi0JCS8vIHRvbwotCQkvLyBtdWNoCi0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGEgc3RyaW5nIGludG8gYSBmb3JtIHRoYXQgd2lsbCBub3QgY29uZmxpY3Qgd2l0aCBzYXZpbmcgaXQKLQkgKiBpbnRvIGFuIElOSSBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyBub3JtYWxTdHJpbmcpIHsKLQkJaWYgKG5vcm1hbFN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBlc2NhcGVkQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG5vcm1hbFN0cmluZywgRVFVQUxfU0lHTiArIExJTkVfRkVFRCArIENBUlJJQUdFX1JFVFVSTiArIExJTkVfVEFCLCB0cnVlKTsKLQkJU3RyaW5nIGNodW5rID0gbnVsbDsKLQkJd2hpbGUgKHRva2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJY2h1bmsgPSB0b2tlci5uZXh0VG9rZW4oKTsKLQkJCWlmIChjaHVuay5lcXVhbHMoRVFVQUxfU0lHTikpIHsKLQkJCQllc2NhcGVkQnVmZmVyLmFwcGVuZChFUVVBTF9TSUdOX0VOVElUWSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjaHVuay5lcXVhbHMoTElORV9GRUVEKSkgewotCQkJCWVzY2FwZWRCdWZmZXIuYXBwZW5kKExJTkVfRkVFRF9FTlRJVFkpOwotCQkJfQotCQkJZWxzZSBpZiAoY2h1bmsuZXF1YWxzKENBUlJJQUdFX1JFVFVSTikpIHsKLQkJCQllc2NhcGVkQnVmZmVyLmFwcGVuZChDQVJSSUFHRV9SRVRVUk5fRU5USVRZKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNodW5rLmVxdWFscyhMSU5FX1RBQikpIHsKLQkJCQllc2NhcGVkQnVmZmVyLmFwcGVuZChMSU5FX1RBQl9FTlRJVFkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZXNjYXBlZEJ1ZmZlci5hcHBlbmQoY2h1bmspOwotCQkJfQotCQl9Ci0JCXJldHVybiBlc2NhcGVkQnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZ2l2ZW4gdGV4dCB3aXRob3V0IGEgdHJhaWxpbmcgZGVsaW1pdGVyCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlyc3RMaW5lT2YoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpIDwgMSkgewotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQkJSURvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCh0ZXh0KTsKLQkJdHJ5IHsKLQkJCWludCBsaW5lTnVtYmVyID0gZG9jLmdldExpbmVPZk9mZnNldCgwKTsKLQkJCUlSZWdpb24gbGluZSA9IGRvYy5nZXRMaW5lSW5mb3JtYXRpb24obGluZU51bWJlcik7Ci0JCQlyZXR1cm4gZG9jLmdldChsaW5lLmdldE9mZnNldCgpLCBsaW5lLmdldExlbmd0aCgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2ZMYXN0TGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gaW5kZXhPZkxhc3RMaW5lRGVsaW1pdGVyKGFTdHJpbmcsIGFTdHJpbmcubGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2ZMYXN0TGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZywgaW50IG9mZnNldCkgewotCQlpbnQgaW5kZXggPSAtMTsKLQotCQlpZiAoYVN0cmluZyAhPSBudWxsICYmIGFTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpbmRleCA9IGFTdHJpbmcubGFzdEluZGV4T2YoQ1JMRiwgb2Zmc2V0KTsKLQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCWluZGV4ID0gYVN0cmluZy5sYXN0SW5kZXhPZihDUiwgb2Zmc2V0KTsKLQkJCQlpZiAoaW5kZXggPT0gLTEpCi0JCQkJCWluZGV4ID0gYVN0cmluZy5sYXN0SW5kZXhPZihMRiwgb2Zmc2V0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mTGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gaW5kZXhPZkxpbmVEZWxpbWl0ZXIoYVN0cmluZywgMCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZkxpbmVEZWxpbWl0ZXIoU3RyaW5nIGFTdHJpbmcsIGludCBvZmZzZXQpIHsKLQkJaW50IGluZGV4ID0gLTE7Ci0KLQkJaWYgKGFTdHJpbmcgIT0gbnVsbCAmJiBhU3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJaW5kZXggPSBhU3RyaW5nLmluZGV4T2YoQ1JMRiwgb2Zmc2V0KTsKLQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCWluZGV4ID0gYVN0cmluZy5pbmRleE9mKENSLCBvZmZzZXQpOwotCQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCQkJaW5kZXggPSBhU3RyaW5nLmluZGV4T2YoTEYsIG9mZnNldCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZk5vbmJsYW5rKFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBpbmRleE9mTm9uYmxhbmsoYVN0cmluZywgMCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZk5vbmJsYW5rKFN0cmluZyBhU3RyaW5nLCBpbnQgb2Zmc2V0KSB7Ci0JCWludCBpbmRleCA9IC0xOwotCi0JCWlmIChhU3RyaW5nICE9IG51bGwgJiYgYVN0cmluZy5sZW5ndGgoKSA+IDApIHsKLQkJCWZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBhU3RyaW5nLmxlbmd0aCgpOyBpKyspIHsKLQkJCQlpZiAoREVMSU1JVEVSUy5pbmRleE9mKGFTdHJpbmcuc3Vic3RyaW5nKGksIGkgKyAxKSkgPT0gLTEpIHsKLQkJCQkJaW5kZXggPSBpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IGluc2VydFN0cmluZyB0byB0aGUgYmVnaW5uaW5nIG9mIGFTdHJpbmcgb25seSBpZiBhU3RyaW5nIGRvZXMKLQkgKiBub3Qgc3RhcnQgd2l0aCB0aGUgaW5zZXJ0U3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc2VydElmTm90U3RhcnRXaXRoKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgaW5zZXJ0U3RyaW5nKSB7Ci0JCWlmICgoYVN0cmluZyAhPSBudWxsKSAmJiAoaW5zZXJ0U3RyaW5nICE9IG51bGwpKQotCQkJaWYgKGFTdHJpbmcuc3RhcnRzV2l0aChpbnNlcnRTdHJpbmcpKQotCQkJCXJldHVybiBhU3RyaW5nOwotCQkJZWxzZQotCQkJCXJldHVybiBpbnNlcnRTdHJpbmcgKyBhU3RyaW5nOwotCQllbHNlCi0JCQlyZXR1cm4gYVN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNRdW90ZWQoU3RyaW5nIHN0cmluZykgewotCQlpZiAoKHN0cmluZyA9PSBudWxsKSB8fCAoc3RyaW5nLmxlbmd0aCgpIDwgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IGxhc3RJbmRleCA9IHN0cmluZy5sZW5ndGgoKSAtIDE7Ci0JCWNoYXIgZmlyc3RDaGFyID0gc3RyaW5nLmNoYXJBdCgwKTsKLQkJY2hhciBsYXN0Q2hhciA9IHN0cmluZy5jaGFyQXQobGFzdEluZGV4KTsKLQotCQlyZXR1cm4gKCgoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URV9DSEFSKSAmJiAobGFzdENoYXIgPT0gU0lOR0xFX1FVT1RFX0NIQVIpKSB8fCAoKGZpcnN0Q2hhciA9PSBET1VCTEVfUVVPVEVfQ0hBUikgJiYgKGxhc3RDaGFyID09IERPVUJMRV9RVU9URV9DSEFSKSkpOwotCX0KLQotCS8qKgotCSAqIFVuaXQgdGVzdHMuCi0JICogCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJLy8gdGVzdFBhc3RlKCk7Ci0JCXRlc3RTdHJpcE5vbkxldHRlckRpZ2l0cygpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgbWVyZ2VkIGZvcm0gb2YgYm90aCBzdHJpbmdzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWVyZ2UoU3RyaW5nIG5ld1N0YXJ0LCBTdHJpbmcgbmV3RW5kKSB7Ci0JCVN0cmluZ1tdIHJlZ2lvbnMgPSBvdmVybGFwUmVnaW9ucyhuZXdTdGFydCwgbmV3RW5kKTsKLQkJcmV0dXJuIHJlZ2lvbnNbMF0gKyByZWdpb25zWzFdICsgcmVnaW9uc1syXTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBvY2N1cnJlbmNlc09mKFN0cmluZyBzZWFyY2hTdHJpbmcsIGNoYXIgdGFyZ2V0Q2hhcikgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaW50IGxlbiA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKHRhcmdldENoYXIgPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKSkKLQkJCQlyZXN1bHQrKzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVuZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIAotCSAqIFJldHVybnMgYSAzIFN0cmluZyBhcnJheSBjb250YWluaW5nIHVuaXF1ZSB0ZXh0IGZyb20gdGhlIHN0YXJ0LAotCSAqIGR1cGxpY2F0ZWQgdGV4dCB0aGF0IG92ZXJsYXBzIHRoZSBzdGFydCBhbmQgZW5kLCBhbmQgdGhlIHVuaXF1ZSB0ZXh0Ci0JICogZnJvbSB0aGUgZW5kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIG92ZXJsYXBSZWdpb25zKFN0cmluZyBzdGFydCwgU3RyaW5nIGVuZCkgewotCQlTdHJpbmdbXSByZXN1bHRzID0gbnVsbDsKLQkJaWYgKHN0YXJ0ICE9IG51bGwgJiYgZW5kID09IG51bGwpIHsKLQkJCXJlc3VsdHMgPSBuZXcgU3RyaW5nW117c3RhcnQsICIiLCAiIn07IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgPT0gbnVsbCAmJiBlbmQgIT0gbnVsbCkgewotCQkJcmVzdWx0cyA9IG5ldyBTdHJpbmdbXXsiIiwgIiIsIGVuZH07IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgPT0gbnVsbCAmJiBlbmQgPT0gbnVsbCkgewotCQkJcmVzdWx0cyA9IG5ldyBTdHJpbmdbXXsiIiwgIiIsICIifTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgIT0gbnVsbCAmJiBlbmQgIT0gbnVsbCkgewotCi0JCQlpbnQgc3RhcnRMZW5ndGggPSBzdGFydC5sZW5ndGgoKTsKLQkJCWludCBlbmRMZW5ndGggPSBlbmQubGVuZ3RoKCk7Ci0KLQkJCWlmIChzdGFydExlbmd0aCA9PSAwIHx8IGVuZExlbmd0aCA9PSAwKSB7Ci0JCQkJcmVzdWx0cyA9IG5ldyBTdHJpbmdbXXsiIiwgIiIsICIifTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHRzID0gbmV3IFN0cmluZ1szXTsKLQkJCQlTdHJpbmcgdGVzdFN0YXJ0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdGVzdEVuZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaW50IG1lcmdlTGVuZ3RoID0gTWF0aC5taW4oc3RhcnRMZW5ndGgsIGVuZExlbmd0aCk7Ci0JCQkJYm9vbGVhbiBmaW5pc2hlZCA9IGZhbHNlOwotCQkJCXdoaWxlIChtZXJnZUxlbmd0aCA+IDAgJiYgIWZpbmlzaGVkKSB7Ci0JCQkJCXRlc3RTdGFydCA9IHN0YXJ0LnN1YnN0cmluZyhzdGFydExlbmd0aCAtIG1lcmdlTGVuZ3RoKTsKLQkJCQkJdGVzdEVuZCA9IGVuZC5zdWJzdHJpbmcoMCwgbWVyZ2VMZW5ndGgpOwotCQkJCQkvLyBjYXNlIHNlbnNpdGl2ZQotCQkJCQlpZiAodGVzdFN0YXJ0LmVxdWFscyh0ZXN0RW5kKSkgewotCQkJCQkJZmluaXNoZWQgPSB0cnVlOwotCQkJCQkJcmVzdWx0c1swXSA9IHN0YXJ0LnN1YnN0cmluZygwLCBzdGFydExlbmd0aCAtIG1lcmdlTGVuZ3RoKTsKLQkJCQkJCXJlc3VsdHNbMV0gPSBzdGFydC5zdWJzdHJpbmcoc3RhcnRMZW5ndGggLSBtZXJnZUxlbmd0aCk7Ci0JCQkJCQlyZXN1bHRzWzJdID0gZW5kLnN1YnN0cmluZyhtZXJnZUxlbmd0aCk7Ci0JCQkJCX0KLQkJCQkJbWVyZ2VMZW5ndGgtLTsKLQkJCQl9Ci0JCQkJaWYgKCFmaW5pc2hlZCkgewotCQkJCQlyZXN1bHRzWzBdID0gc3RhcnQ7Ci0JCQkJCXJlc3VsdHNbMV0gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXN1bHRzWzJdID0gZW5kOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBQYWNrcyBhbiBhcnJheSBvZiBTdHJpbmdzIGludG8gYSBzaW5nbGUgY29tbWEgZGVsaW1pdGVkIFN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5ncwotCSAqIEByZXR1cm4KLQkgKiBAdG9kbyBHZW5lcmF0ZWQgY29tbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhY2soU3RyaW5nW10gc3RyaW5ncykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWJ1Zi5hcHBlbmQoU3RyaW5nVXRpbHMucmVwbGFjZShzdHJpbmdzW2ldLCAiLCIsICImY29tbWE7IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChpIDwgc3RyaW5ncy5sZW5ndGggLSAxKQotCQkJCWJ1Zi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIFBhc3RlcyB0aGUgbmV3IHRleHQgaW50byB0aGUgb2xkIGF0IHRoZSBzdGFydCBwb3NpdGlvbiwgcmVwbGFjaW5nIHRleHQKLQkgKiBpbXBsaWVkIGJ5IGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXN0ZShTdHJpbmcgb2xkVGV4dCwgU3RyaW5nIG5ld1RleHQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgc3RhcnRJbmRleCA9IHN0YXJ0OwotCQlpbnQgZW5kSW5kZXggPSBzdGFydCArIGxlbmd0aDsKLQkJaWYgKHN0YXJ0SW5kZXggPiBvbGRUZXh0Lmxlbmd0aCgpKSB7Ci0JCQlzdGFydEluZGV4ID0gb2xkVGV4dC5sZW5ndGgoKTsKLQkJfQotCQlzYi5hcHBlbmQob2xkVGV4dC5zdWJzdHJpbmcoMCwgc3RhcnRJbmRleCkpOwotCQkvLyBudWxsIG9yIGVtcHR5IG5ldyB0ZXh0IGFjY29tcGxpY2hlcyBhIGRlbGV0ZQotCQlpZiAobmV3VGV4dCAhPSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQobmV3VGV4dCk7Ci0JCX0KLQkJaWYgKGVuZEluZGV4IDwgb2xkVGV4dC5sZW5ndGgoKSkgewotCi0JCQlzYi5hcHBlbmQob2xkVGV4dC5zdWJzdHJpbmcoZW5kSW5kZXgpKTsKLQkJfQotCQlyZXN1bHQgPSBzYi50b1N0cmluZygpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgbWF0Y2hpbmcgbGl0ZXJhbCBwb3J0aW9ucyBvZiBhIHN0cmluZyB3aXRoIGFub3RoZXIgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgYVN0cmluZywgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkgewotCQlpZiAoYVN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBub3JtYWxTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgbGVuZ3RoID0gYVN0cmluZy5sZW5ndGgoKTsKLQkJaW50IHBvc2l0aW9uID0gMDsKLQkJaW50IHByZXZpb3VzID0gMDsKLQkJaW50IHNwYWNlciA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihub3JtYWxTdHJpbmcpOwotCQl3aGlsZSAocG9zaXRpb24gKyBzcGFjZXIgLSAxIDwgbGVuZ3RoICYmIGFTdHJpbmcuaW5kZXhPZihzb3VyY2UsIHBvc2l0aW9uKSA+IC0xKSB7Ci0JCQlwb3NpdGlvbiA9IGFTdHJpbmcuaW5kZXhPZihzb3VyY2UsIHByZXZpb3VzKTsKLQkJCXNiLmFwcGVuZChub3JtYWxTdHJpbmcpOwotCQkJc2IuYXBwZW5kKGFTdHJpbmcuc3Vic3RyaW5nKHByZXZpb3VzLCBwb3NpdGlvbikpOwotCQkJc2IuYXBwZW5kKHRhcmdldCk7Ci0JCQlwb3NpdGlvbiArPSBzcGFjZXI7Ci0JCQlwcmV2aW91cyA9IHBvc2l0aW9uOwotCQl9Ci0JCXNiLmFwcGVuZChhU3RyaW5nLnN1YnN0cmluZyhwb3NpdGlvbiwgYVN0cmluZy5sZW5ndGgoKSkpOwotCQlub3JtYWxTdHJpbmcgPSBzYi50b1N0cmluZygpOwotCi0JCXJldHVybiBub3JtYWxTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZSB0aGUgZW50aXR5IHJlZmVyZW5jZXMgZm9yIG1hcmt1cCBkZWxpbWl0ZXJzIGluIHRleHQgd2hlcmUgdGhleQotCSAqIGhhdmUgYmVlbiByZXBsYWNlZCBieSB0aGUgcHJvcGVyIFVuaWNvZGUgdmFsdWVzIHRocm91Z2ggYSBET00gdGV4dAotCSAqIHBhcnNlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXN0b3JlTWFya2VycyhTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgY29udGVudCA9IHRleHQ7Ci0JCWNvbnRlbnQgPSByZXBsYWNlKGNvbnRlbnQsIEFNUEVSU1RBTkQsIEFNUEVSU1RBTkRfRU5USVRZKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgTEVTU19USEFOLCBMRVNTX1RIQU5fRU5USVRZKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgR1JFQVRFUl9USEFOLCBHUkVBVEVSX1RIQU5fRU5USVRZKTsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBleHRyYSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgYW5kIHF1b3RlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwKFN0cmluZyBxdW90ZWRTdHJpbmcpIHsKLQkJaWYgKHF1b3RlZFN0cmluZyA9PSBudWxsIHx8IHF1b3RlZFN0cmluZy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIHF1b3RlZFN0cmluZzsKLQkJU3RyaW5nIHRyaW1tZWQgPSBxdW90ZWRTdHJpbmcudHJpbSgpOwotCQlpZiAodHJpbW1lZC5sZW5ndGgoKSA8IDIpCi0JCQlyZXR1cm4gcXVvdGVkU3RyaW5nOwotCi0JCWNoYXIgZmlyc3QgPSB0cmltbWVkLmNoYXJBdCgwKTsKLQkJY2hhciBuZXh0VG9MYXN0ID0gdHJpbW1lZC5jaGFyQXQodHJpbW1lZC5sZW5ndGgoKSAtIDIpOwotCQljaGFyIGxhc3QgPSB0cmltbWVkLmNoYXJBdCh0cmltbWVkLmxlbmd0aCgpIC0gMSk7Ci0KLQkJaWYgKChmaXJzdCA9PSAnXCInICYmIGxhc3QgPT0gJ1wiJyAmJiBuZXh0VG9MYXN0ICE9ICdcXCcpIHx8IChmaXJzdCA9PSAnXCcnICYmIGxhc3QgPT0gJ1wnJyAmJiBuZXh0VG9MYXN0ICE9ICdcXCcpKSB7Ci0JCQlyZXR1cm4gdHJpbW1lZC5zdWJzdHJpbmcoMSwgdHJpbW1lZC5sZW5ndGgoKSAtIDEpOwotCQl9Ci0JCXJldHVybiB0cmltbWVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHN0cmlwcyBhbnl0aGluZyBmcm9tIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhIHN0cmluZyB0aGF0Ci0JICogaXMgbm90IGEgbGV0dGVyIG9yIGRpZ2l0LiBJdCBpcyB1c2VkIGJ5IHNvbWUgZW5jb2RpbmcgZGV0ZWN0b3JzIHRvIGNvbWUKLQkgKiB1cCB3aXRoIHRoZSBlbmNvZGluZyBuYW1lIGZyb20gaWxsZm9ybWVkIGlucHV0IChlLmcgaW4gPD94bWwKLQkgKiBlbmNvZGluZz0iYWJjPz4gLS0gd2hlcmUgZmluYWwgcXVvdGUgaXMgbGVmdCBvZmYsIHRoZSAnPicgaXMgcmV0dXJuZWQKLQkgKiB3aXRoIHRoZSByZXN0IG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgJ2FiYycpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwTm9uTGV0dGVyRGlnaXRzKFN0cmluZyBmdWxsVmFsdWUpIHsKLQkJaWYgKGZ1bGxWYWx1ZSA9PSBudWxsIHx8IGZ1bGxWYWx1ZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZ1bGxWYWx1ZTsKLQkJaW50IGZ1bGxWYWx1ZUxlbmd0aCA9IGZ1bGxWYWx1ZS5sZW5ndGgoKTsKLQkJaW50IGZpcnN0UG9zID0gMDsKLQkJd2hpbGUgKGZpcnN0UG9zIDwgZnVsbFZhbHVlTGVuZ3RoICYmICFDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGZ1bGxWYWx1ZS5jaGFyQXQoZmlyc3RQb3MpKSkgewotCQkJZmlyc3RQb3MrKzsKLQkJfQotCQlpbnQgbGFzdFBvcyA9IGZ1bGxWYWx1ZUxlbmd0aCAtIDE7Ci0JCXdoaWxlIChsYXN0UG9zID4gZmlyc3RQb3MgJiYgIUNoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoZnVsbFZhbHVlLmNoYXJBdChsYXN0UG9zKSkpIHsKLQkJCWxhc3RQb3MtLTsKLQkJfQotCQlTdHJpbmcgcmVzdWx0ID0gZnVsbFZhbHVlOwotCQlpZiAoZmlyc3RQb3MgIT0gMCB8fCBsYXN0UG9zICE9IGZ1bGxWYWx1ZUxlbmd0aCkgewotCQkJcmVzdWx0ID0gZnVsbFZhbHVlLnN1YnN0cmluZyhmaXJzdFBvcywgbGFzdFBvcyArIDEpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogU2ltaWxhciB0byBzdHJpcCwgZXhjZXB0IHF1b3RlcyBkb24ndCBuZWVkIHRvIG1hdGNoIHN1Y2ggYXMgIlVURicgaXMKLQkgKiBzdGlsbCBzdHJpcHBlZCBvZiBib3RoIHF1b3Rlcy4gKFBsdXMsIHRoaXMgb25lIGRvZXMgbm90IGRldGVjdCBlc2NhcGVkCi0JICogcXVvdGVzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwUXVvdGVzKFN0cmluZyBxdW90ZWRWYWx1ZSkgewotCQlpZiAocXVvdGVkVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBub3JtYWxseSB3aWxsIG5ldmVyIGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBibGFua3MsCi0JCS8vIGJ1dCBpZiBpdCBkb2VzLCB3ZSdsbCBkbyBsZW5pZW50IGludGVycHJldGF0aW9uCi0JCXJldHVybiBzdHJpcFF1b3Rlc0xlYXZlSW5zaWRlU3BhY2UocXVvdGVkVmFsdWUpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBMaWtlIHN0cmlwIHF1b3RlcywgZXhjZXB0IGxlYXZlcyB0aGUgc3RhcnQgYW5kIGVuZCBzcGFjZSBpbnNpZGUgdGhlCi0JICogcXVvdGVzCi0JICogCi0JICogQHBhcmFtIHF1b3RlZFZhbHVlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwUXVvdGVzTGVhdmVJbnNpZGVTcGFjZShTdHJpbmcgcXVvdGVkVmFsdWUpIHsKLQkJaWYgKHF1b3RlZFZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gbm9tYWxseSB3aWxsIG5ldmVyIGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBibGFua3MgLi4uIGJ1dCBqdXN0IGluCi0JCS8vIGNhc2UuCi0JCVN0cmluZyByZXN1bHQgPSBxdW90ZWRWYWx1ZS50cmltKCk7Ci0JCWludCBsZW4gPSByZXN1bHQubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPiAwKSB7Ci0JCQljaGFyIGZpcnN0Q2hhciA9IHJlc3VsdC5jaGFyQXQoMCk7Ci0JCQlpZiAoKGZpcnN0Q2hhciA9PSBTSU5HTEVfUVVPVEVfQ0hBUikgfHwgKGZpcnN0Q2hhciA9PSBET1VCTEVfUVVPVEVfQ0hBUikpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKDEsIGxlbik7Ci0JCQl9Ci0JCQlsZW4gPSByZXN1bHQubGVuZ3RoKCk7Ci0JCQlpZiAobGVuID4gMCkgewotCQkJCWNoYXIgbGFzdENoYXIgPSByZXN1bHQuY2hhckF0KGxlbiAtIDEpOwotCQkJCWlmICgobGFzdENoYXIgPT0gU0lOR0xFX1FVT1RFX0NIQVIpIHx8IChsYXN0Q2hhciA9PSBET1VCTEVfUVVPVEVfQ0hBUikpIHsKLQkJCQkJcmVzdWx0ID0gcmVzdWx0LnN1YnN0cmluZygwLCBsZW4gLSAxKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFBhc3RlKCkgewotCQlTdHJpbmcgdGVzdFN0cmluZyA9ICJUaGUgcXVpY2sgYnJvd24gZm94IC4uLiI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhc3RlKHRlc3RTdHJpbmcsIG51bGwsIDQsIDUpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhc3RlKHRlc3RTdHJpbmcsIG51bGwsIDQsIDYpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhc3RlKHRlc3RTdHJpbmcsICIiLCA0LCA2KSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhc3RlKHRlc3RTdHJpbmcsICJmYXN0IiwgNCwgNikpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbihwYXN0ZSh0ZXN0U3RyaW5nLCAiZmFzdCAiLCA0LCA2KSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhc3RlKHRlc3RTdHJpbmcsICJCdXQgIiwgMCwgMCkpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbihwYXN0ZSgiIiwgImJ1cnAiLCA0LCA2KSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRlc3RTdHJpcE5vbkxldHRlckRpZ2l0cygpIHsKLQkJU3RyaW5nIHRlc3RTdHJpbmcgPSAiYWJjIjsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odGVzdFN0cmluZyArICIgLS0+IiArIHN0cmlwTm9uTGV0dGVyRGlnaXRzKHRlc3RTdHJpbmcpICsgIjwtLSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0U3RyaW5nICsgIiAtLT4iICsgc3RyaXBOb25MZXR0ZXJEaWdpdHModGVzdFN0cmluZykgKyAiPC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0U3RyaW5nID0gIlwiYWJjXCIiOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0U3RyaW5nICsgIiAtLT4iICsgc3RyaXBOb25MZXR0ZXJEaWdpdHModGVzdFN0cmluZykgKyAiPC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0U3RyaW5nID0gIlwiYWItYzE/IjsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odGVzdFN0cmluZyArICIgLS0+IiArIHN0cmlwTm9uTGV0dGVyRGlnaXRzKHRlc3RTdHJpbmcpICsgIjwtLSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVzdFN0cmluZyA9ICIrKysiOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0U3RyaW5nICsgIiAtLT4iICsgc3RyaXBOb25MZXR0ZXJEaWdpdHModGVzdFN0cmluZykgKyAiPC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0U3RyaW5nID0gImFiYz0iOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0U3RyaW5nICsgIiAtLT4iICsgc3RyaXBOb25MZXR0ZXJEaWdpdHModGVzdFN0cmluZykgKyAiPC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0U3RyaW5nID0gImFiYyAiOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0U3RyaW5nICsgIiAtLT4iICsgc3RyaXBOb25MZXR0ZXJEaWdpdHModGVzdFN0cmluZykgKyAiPC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoYm9vbGVhbiBib29sZWFuVmFsdWUpIHsKLQkJaWYgKGJvb2xlYW5WYWx1ZSkKLQkJCXJldHVybiBUUlVFOwotCQllbHNlCi0JCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlICJlc2NhcGVkIiBjaGFycyBmcm9tIGEgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlKFN0cmluZyBhU3RyaW5nKSB7Ci0JCWlmIChhU3RyaW5nID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIG5vcm1hbFN0cmluZyA9IHJlcGxhY2UoYVN0cmluZywgRVFVQUxfU0lHTl9FTlRJVFksIEVRVUFMX1NJR04pOwotCQlub3JtYWxTdHJpbmcgPSByZXBsYWNlKG5vcm1hbFN0cmluZywgTElORV9GRUVEX0VOVElUWSwgTElORV9GRUVEKTsKLQkJbm9ybWFsU3RyaW5nID0gcmVwbGFjZShub3JtYWxTdHJpbmcsIENBUlJJQUdFX1JFVFVSTl9FTlRJVFksIENBUlJJQUdFX1JFVFVSTik7Ci0JCW5vcm1hbFN0cmluZyA9IHJlcGxhY2Uobm9ybWFsU3RyaW5nLCBMSU5FX1RBQl9FTlRJVFksIExJTkVfVEFCKTsKLQkJcmV0dXJuIG5vcm1hbFN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmlxdWVFbmRPZihTdHJpbmcgbmV3U3RhcnQsIFN0cmluZyBuZXdFbmQpIHsKLQkJU3RyaW5nW10gcmVnaW9ucyA9IG92ZXJsYXBSZWdpb25zKG5ld1N0YXJ0LCBuZXdFbmQpOwotCQlyZXR1cm4gcmVnaW9uc1syXTsKLQl9Ci0KLQkvKioKLQkgKiBVbnBhY2tzIGEgY29tbWEgZGVsaW1pdGVkIFN0cmluZyBpbnRvIGFuIGFycmF5IG9mIFN0cmluZ3MKLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqIEByZXR1cm4KLQkgKiBAdG9kbyBHZW5lcmF0ZWQgY29tbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdW5wYWNrKFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKHRva2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJLy8gc2luY2Ugd2UncmUgc2VwYXJhdGluZyB0aGUgdmFsdWVzIHdpdGggJywnLCBlc2NhcGUgJywnIGluIHRoZQotCQkJLy8gdmFsdWVzCi0JCQlsaXN0LmFkZChTdHJpbmdVdGlscy5yZXBsYWNlKHRva2VyLm5leHRUb2tlbigpLCAiJmNvbW1hOyIsICIsIikudHJpbSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCX0KLQotCS8qKgotCSAqIFN0cmluZ1V0aWxzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdVdGlscygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNzcxNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtZXh0ZW5zaW9ucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1lbmNvZGluZyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy10YXNrdGFncyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNmJjNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotZWRpdG9yLmphcgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2Uud3N0LnNzZS51aV8xLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZiZWNmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2RlYnVnPXRydWUKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvdHJhY2VmaWx0ZXI9Ci0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudXRpbC5BY3Rpb25Db250cmlidXRlci5fc2hvd0RlYnVnU3RhdHVzCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2FjdGlvbmNvbnRyaWJ1dG9yL2RlYnVnc3RhdHVzZmllbGRzPXRydWUKLQotCi0jb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb24uVHJhbnNmZXJCdWlsZGVyLmRlYnVnVGltZQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS90cmFuc2ZlcmJ1aWxkZXIvdGltZT1mYWxzZQotCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkY29uZmlndXJhdGlvbmJ1aWxkZXI9ZmFsc2UKLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbi5FeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmRlYnVnVGltZQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9leHRlbmRlZGNvbmZpZ3VyYXRpb25idWlsZGVyL3RpbWU9ZmFsc2UKLQotCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkZWRpdG9yYWN0aW9uYnVpbGRlcj1mYWxzZQotCi0jb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb24uRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyLmRlYnVnUmVhZFRpbWUKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZXh0ZW5kZWRlZGl0b3JhY3Rpb25idWlsZGVyL3JlYWR0aW1lPWZhbHNlCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbi5FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIuZGVidWdDb250cmlidXRlVGltZQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9leHRlbmRlZGVkaXRvcmFjdGlvbmJ1aWxkZXIvY29udHJpYnV0ZXRpbWU9ZmFsc2UKLQotCi0jb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb24uRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyLmRlYnVnTWVudQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9leHRlbmRlZGVkaXRvcmFjdGlvbmJ1aWxkZXIvZGVidWdtZW51PWZhbHNlCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbi5FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIuZGVidWdQb3B1cAotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9leHRlbmRlZGVkaXRvcmFjdGlvbmJ1aWxkZXIvZGVidWdwb3B1cD1mYWxzZQotCi0jb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb24uRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyLmRlYnVnVG9vbGJhcgotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9leHRlbmRlZGVkaXRvcmFjdGlvbmJ1aWxkZXIvZGVidWd0b29sYmFyPWZhbHNlCi0KLQotI29yZy5lY2xpcHNlLndzdC5zc2UudWkuRmlsZU1vZGVsUHJvdmlkZXIuZGVidWdPcGVyYXRpb25zCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ZpbGVtb2RlbHByb3ZpZGVyL29wZXJhdGlvbnM9ZmFsc2UKLQotI29yZy5lY2xpcHNlLndzdC5zc2UudWkuRmlsZU1vZGVsUHJvdmlkZXIuZGVidWdMaWZlY3ljbGVsaXN0ZW5lcgotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9maWxlbW9kZWxwcm92aWRlci9saWZlY3ljbGVsaXN0ZW5lcj1mYWxzZQotCi0jb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5GaWxlTW9kZWxQcm92aWRlci5kZWJ1Z01vZGVsU3RhdGVsaXN0ZW5lcgotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9maWxlbW9kZWxwcm92aWRlci9tb2RlbHN0YXRlbGlzdGVuZXI9ZmFsc2UKLQotCi0jb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdG9yYWdlTW9kZWxQcm92aWRlci5kZWJ1Z09wZXJhdGlvbnMKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvc3RvcmFnZW1vZGVscHJvdmlkZXIvb3BlcmF0aW9ucz1mYWxzZQotCi0jb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdG9yYWdlTW9kZWxQcm92aWRlci5kZWJ1Z0VsZW1lbnRTdGF0ZWxpc3RlbmVyCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3N0b3JhZ2Vtb2RlbHByb3ZpZGVyL2VsZW1lbnRzdGF0ZWxpc3RlbmVyPWZhbHNlCi0KLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvY29udGVudE91dGxpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvcHJvcGVydHlTaGVldD1mYWxzZQotCi0jb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0uZGVidWcKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvcHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtPWZhbHNlCi0KLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvcmVjb25jaWxlcmpvYj1mYWxzZQotCi0jb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Hb3RvQW5ub3RhdGlvbkFjdGlvbi5fZGVidWcKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZ290b05leHRBbm5vdGF0aW9uPWZhbHNlCi0KLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvcHJlZmVyZW5jZXMtcHJvcGVydGllcz1mYWxzZQotCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2RlYnVnL3JlY29uY2lsZXJTcGVsbGluZz1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyU3BlbGxpbmcvc2hvd1Byb2JsZW1zPWZhbHNlCi0KLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvcmVjb25jaWxlclZhbGlkYXRvcnM9ZmFsc2UKLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuVmFsaWRhdG9yU3RyYXRlZ3kKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvcmVjb25jaWxlclZhbGlkYXRvclN1cHBvcnRlZD1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyVmFsaWRhdG9yRW5hYmxlbWVudD1mYWxzZQotCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3N0cnVjdHVyZWRQcmVzZW50YXRpb25SZWNvbmNpbGVyPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3N0cnVjdHVyZWRQcmVzZW50YXRpb25SZWNvbmNpbGVyL3RpbWU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiZDk0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc3NlLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+PC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YjBjZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLSNXZWQgQXByIDMwIDAyOjAzOjE4IEVEVCAyMDA4DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZT1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3INCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWQwZGQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGh1IE5vdiAxNiAwMDo1MToyNyBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmNlOWRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI1RodSBBdWcgMTQgMDM6NTk6NTUgRURUIDIwMDgNCi1jb21waWxlcnMuZi51bnJlc29sdmVkLWZlYXR1cmVzPTENCi1jb21waWxlcnMuZi51bnJlc29sdmVkLXBsdWdpbnM9MQ0KLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MA0KLWNvbXBpbGVycy5wLmJ1aWxkPTANCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTENCi1jb21waWxlcnMucC5kaXNjb3VyYWdlZC1jbGFzcz0xDQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MA0KLWNvbXBpbGVycy5wLmludGVybmFsPTENCi1jb21waWxlcnMucC5taXNzaW5nLXBhY2thZ2VzPTINCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MA0KLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTANCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wDQotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0xDQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTANCi1jb21waWxlcnMucC51bmtub3duLWlkZW50aWZpZXI9MQ0KLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTANCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wDQotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTANCi1jb21waWxlcnMucy5jcmVhdGUtZG9jcz1mYWxzZQ0KLWNvbXBpbGVycy5zLmRvYy1mb2xkZXI9ZG9jDQotY29tcGlsZXJzLnMub3Blbi10YWdzPTENCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTJlZjg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc3NlLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMTAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnNzZS51aSwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZWJ1Zzt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZXJpdmVkO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXQudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3I7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZW5jb2RpbmcudWk7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmZvcm1hdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVyczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oeXBlcmxpbms7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwub3Blbm9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvcGVydGllczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2g7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNwZWxsaW5nO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm87eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51aTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnZpZXcuZXZlbnRzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucXVpY2tvdXRsaW5lLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucmVjb25jaWxlLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudHlwaW5nLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzCi1JbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudXRpbDsgdmVyc2lvbj0iMy44IiwKLSBjb20uaWJtLmljdS50ZXh0OyB2ZXJzaW9uPSIzLjgiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy42LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycztidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2Uuc2VhcmNoO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjUwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMTAwLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvUkVBRE1FLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmU0NTIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1UaGUgYmFzZSBlZGl0b3Igb2YgdGhlIHNzZSBmcmFtZXdvcmsuIEl0IHByb3ZpZGVzIHRoZSBob29rcyBmb3IgY29udGVudCBhc3Npc3QsCi1icmVha3BvaW50cywgZGVidWdnaW5nLCBvcGVuLW9uLCBxdWlja2ZpeCwgc3BlbGwgY2hlY2tpbmcgYW5kIGEgY29udGVudCBvdXRsaW5lLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODBjOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IHRvYy54bWwsXAotICAgICAgICAgICAgICAgdGVzdFRvYy54bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBodG1sLwotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgc3JjLWV4dGVuc2lvbnMvLFwKLSAgICAgICAgICAgc3JjLWVuY29kaW5nLyxcCi0gICAgICAgICAgIHNyYy10YXNrdGFncy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9odG1sL21haW50b3BpYy5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2h0bWwvbWFpbnRvcGljLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NzYwNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2h0bWwvbWFpbnRvcGljLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5NYWluIFRvcGljPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+TWFpbiBUb3BpYzwvaDE+Ci1QbGVhc2UgZW50ZXIgeW91ciB0ZXh0IGhlcmUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2h0bWwvc3VidG9waWMuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9odG1sL3N1YnRvcGljLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNjFjNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2h0bWwvc3VidG9waWMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPlN1YiBUb3BpYzwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgxPlN1YiBUb3BpYzwvaDE+Ci1QbGVhc2UgZW50ZXIgeW91ciB0ZXh0IGhlcmUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2h0bWwvdG9jLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaHRtbC90b2MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI2ZjBhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaHRtbC90b2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPlRhYmxlIG9mIENvbnRlbnRzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+VGFibGUgb2YgQ29udGVudHM8L2gxPgotUGxlYXNlIGVudGVyIHlvdXIgdGV4dCBoZXJlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2N0b29sMTYvc3BlbGxjaGVjay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3NwZWxsY2hlY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzFkZTMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2N0b29sMTYvc3BlbGxjaGVjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvY29sbGFwc2VhbGwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2NvbGxhcHNlYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjMGRlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvY29sbGFwc2VhbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2RlbGV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvZGVsZXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUxOTdjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvZGVsZXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9zeW5jZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3N5bmNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOWU1NjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3N5bmNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3NwZWxsY2hlY2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9zcGVsbGNoZWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjZjU1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3NwZWxsY2hlY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9jb2xsYXBzZWFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZDgwYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9kZWxldGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2RlbGV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZTZkZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2RlbGV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvc3luY2VkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9zeW5jZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWNlZmVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9zeW5jZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zcGVsbGNoZWNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvc3BlbGxjaGVjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MWRlMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zcGVsbGNoZWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL29iajE2L29jY19tYXRjaC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9vY2NfbWF0Y2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTAzM2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL29iajE2L29jY19tYXRjaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9wcmVmZXJlbmNlcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9wcmVmZXJlbmNlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMDdmZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJlZmVyZW5jZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJvcF9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9wX3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlYzY0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9wX3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9zb3VyY2VFZGl0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL3NvdXJjZUVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWJkYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL3NvdXJjZUVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNDQxOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgRGF2aWQgQ2FydmVyIC0gYnVnIDIxMjMzMCAtIG1pZ3JhdGUgdG8gb3JnLmVjbGlwc2UudWkubWVudXMgZXh0ZW5zaW9uIHBvaW50ICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotcGx1Z2luTmFtZT1TdHJ1Y3R1cmVkIFNvdXJjZSBFZGl0b3IKLVN0YW5kYWxvbmVfU3RydWN0dXJlZF9Tb3VyY2VfRWRpdG9yLm5hbWU9U3RhbmRhbG9uZSBTdHJ1Y3R1cmVkIFNvdXJjZSBFZGl0b3IKLSMgTmFtZXMgb24gcHJlZmVyZW5jZXMgcGFnZXMKLVN0cnVjdHVyZWRfVGV4dF9FZGl0b3IubmFtZT1TdHJ1Y3R1cmVkIFRleHQgRWRpdG9ycwotVGFza19UYWdzX1ByZWZlcmVuY2VzLm5hbWU9VGFzayBUYWdzCi0KLSMKLXNvdXJjZUVkaXRvckZvbnREZWZpbml0b24ubGFiZWw9U3RydWN0dXJlZCBUZXh0IEVkaXRvciBUZXh0IEZvbnQKLXNvdXJjZUVkaXRvckZvbnREZWZpbnRpb24uZGVzY3JpcHRpb249VGhlIFN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgdGV4dCBmb250IGlzIHVzZWQgYnkgU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMuCi0KLUFkYXB0ZXJfRmFjdG9yeV9EZXNjcmlwdGlvbl9FeHRlbnNpb24ubmFtZT1BZGFwdGVyIEZhY3RvcnkgRGVzY3JpcHRpb24gRXh0ZW5zaW9uCi1FeHRlbmRlZF9FZGl0b3JfQWN0aW9uc19FeHRlbnNpb24ubmFtZT1FeHRlbmRlZCBFZGl0b3IgQWN0aW9ucyBFeHRlbnNpb24KLURyb3BfVGFyZ2V0X1RyYW5zZmVyc19FeHRlbnNpb24ubmFtZT1Ecm9wIFRhcmdldCBUcmFuc2ZlcnMgRXh0ZW5zaW9uCi1FeHRlbmRlZF9FZGl0b3JfQ29uZmlndXJhdGlvbl9FeHRlbnNpb24ubmFtZT1FeHRlbmRlZCBFZGl0b3IgQ29uZmlndXJhdGlvbiBFeHRlbnNpb24KLXF1aWNrRml4UHJvY2Vzc29yPVF1aWNrIEZpeCBQcm9jZXNzb3IgRXh0ZW5zaW9uCi1TZW1hbnRpY19IaWdobGlnaHRpbmdfRXh0ZW5zaW9uLm5hbWU9U2VtYW50aWMgSGlnaGxpZ2h0aW5nIEV4dGVuc2lvbgotQ2hhcmFjdGVyX1BhaXJpbmcubmFtZT1DaGFyYWN0ZXIgUGFpcmluZyBFeHRlbnNpb24KLUNvbXBsZXRpb25fUHJvcG9zYWwubmFtZT1Db21wbGV0aW9uIFByb3Bvc2FsCi1Db21wbGV0aW9uX1Byb3Bvc2FsX0NhdGVnb3JpZXNfQ29uZmlndXJhdGlvbi5uYW1lPUNvbXBsZXRpb24gUHJvcG9zYWwgQ2F0ZWdvcmllcyBDb25maWd1cmF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUaGVzZSBzdHJpbmdzIGFyZSB1c2VkIGluIFdvcmtiZW5jaCBLZXlzIFByZWZlcmVuY2VzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc2NvcGUuc3RydWN0dXJlZFRleHRFZGl0b3IubmFtZT1FZGl0aW5nIGluIFN0cnVjdHVyZWQgVGV4dCBFZGl0b3JzCi1zY29wZS5zdHJ1Y3R1cmVkVGV4dEVkaXRvci5kZXNjcmlwdGlvbj1FZGl0aW5nIGluIFN0cnVjdHVyZWQgVGV4dCBFZGl0b3JzCi1jb21tYW5kLnRvZ2dsZS5jb21tZW50Lm5hbWU9VG9nZ2xlIENvbW1lbnQKLWNvbW1hbmQudG9nZ2xlLmNvbW1lbnQuZGVzY3JpcHRpb249VG9nZ2xlIENvbW1lbnQKLWNvbW1hbmQuYWRkLmJsb2NrLmNvbW1lbnQubmFtZT1BZGQgQmxvY2sgQ29tbWVudAotY29tbWFuZC5hZGQuYmxvY2suY29tbWVudC5kZXNjcmlwdGlvbj1BZGQgQmxvY2sgQ29tbWVudAotY29tbWFuZC5yZW1vdmUuYmxvY2suY29tbWVudC5uYW1lPVJlbW92ZSBCbG9jayBDb21tZW50Ci1jb21tYW5kLnJlbW92ZS5ibG9jay5jb21tZW50LmRlc2NyaXB0aW9uPVJlbW92ZSBCbG9jayBDb21tZW50Ci1jb21tYW5kLmNsZWFudXAuZG9jdW1lbnQubmFtZT1DbGVhbnVwIERvY3VtZW50Li4uCi1jb21tYW5kLmNsZWFudXAuZG9jdW1lbnQuZGVzY3JpcHRpb249Q2xlYW51cCBkb2N1bWVudAotY29tbWFuZC5jbGVhbnVwLmRvY3VtZW50Lm1uZW1vbmljPUMKLWNvbW1hbmQuZm9ybWF0LmRvY3VtZW50Lm5hbWU9Rm9ybWF0Ci1jb21tYW5kLmZvcm1hdC5kb2N1bWVudC5kZXNjcmlwdGlvbj1Gb3JtYXQgc2VsZWN0aW9uCi1jb21tYW5kLmZvcm1hdC5kb2N1bWVudC5tbmVtb25pYz1GCi1jb21tYW5kLmZvcm1hdC5hY3RpdmUuZWxlbWVudHMubmFtZT1Gb3JtYXQgQWN0aXZlIEVsZW1lbnRzCi1jb21tYW5kLmZvcm1hdC5hY3RpdmUuZWxlbWVudHMuZGVzY3JpcHRpb249Rm9ybWF0IGFjdGl2ZSBlbGVtZW50cwotY29tbWFuZC5mb3JtYXQuYWN0aXZlLmVsZW1lbnRzLm1uZW1vbmljPWkKLWNvbW1hbmQub3Blbi5maWxlLmZyb20uc291cmNlLm5hbWU9T3BlbiBTZWxlY3Rpb24KLWNvbW1hbmQub3Blbi5maWxlLmZyb20uc291cmNlLmRlc2NyaXB0aW9uPU9wZW4gYW4gZWRpdG9yIG9uIHRoZSBzZWxlY3RlZCBsaW5rCi1jb21tYW5kLm9wZW4uZmlsZS5mcm9tLnNvdXJjZS5tbmVtb25pYz1PCi1jb21tYW5kLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzLm5hbWU9T2NjdXJyZW5jZXMgaW4gRmlsZQotY29tbWFuZC5zZWFyY2guZmluZC5vY2N1cnJlbmNlcy5kZXNjcmlwdGlvbj1GaW5kIG9jY3VycmVuY2VzIG9mIHRoZSBzZWxlY3Rpb24gaW4gdGhlIGZpbGUKLWNvbW1hbmQuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMubW5lbW9uaWM9TwotY29tbWFuZC5pbmZvcm1hdGlvbi5xdWlja19vdXRsaW5lLm5hbWU9UXVpY2sgT3V0bGluZQotY29tbWFuZC5pbmZvcm1hdGlvbi5xdWlja19vdXRsaW5lLmRlc2NyaXB0aW9uPVNob3cgdGhlIHF1aWNrIG91dGxpbmUgZm9yIHRoZSBlZGl0b3IgaW5wdXQKLUFjdGlvbkRlZmluaXRpb24uc2VsZWN0RW5jbG9zaW5nLm5hbWU9U2VsZWN0IEVuY2xvc2luZyBFbGVtZW50Ci1BY3Rpb25EZWZpbml0aW9uLnNlbGVjdEVuY2xvc2luZy5kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLUFjdGlvbkRlZmluaXRpb24uc2VsZWN0TmV4dC5uYW1lPVNlbGVjdCBOZXh0IEVsZW1lbnQKLUFjdGlvbkRlZmluaXRpb24uc2VsZWN0TmV4dC5kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgbmV4dCBzaWJsaW5nCi1BY3Rpb25EZWZpbml0aW9uLnNlbGVjdFByZXZpb3VzLm5hbWU9U2VsZWN0IFByZXZpb3VzIEVsZW1lbnQKLUFjdGlvbkRlZmluaXRpb24uc2VsZWN0UHJldmlvdXMuZGVzY3JpcHRpb249RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLUFjdGlvbkRlZmluaXRpb24uc2VsZWN0TGFzdC5uYW1lPVJlc3RvcmUgTGFzdCBTZWxlY3Rpb24KLUFjdGlvbkRlZmluaXRpb24uc2VsZWN0TGFzdC5kZXNjcmlwdGlvbj1SZXN0b3JlIGxhc3Qgc2VsZWN0aW9uCi1BY3Rpb25EZWZpbml0aW9uLnF1aWNrRml4Lm5hbWU9UXVpY2sgRml4Ci1BY3Rpb25EZWZpbml0aW9uLnF1aWNrRml4LmRlc2NyaXB0aW9uPVF1aWNrIEZpeAotQWN0aW9uRGVmaW5pdGlvbi5nb3RvTWF0Y2hpbmdCcmFja2V0Lm5hbWU9TWF0Y2hpbmcgQnJhY2tldAotQWN0aW9uRGVmaW5pdGlvbi5nb3RvTWF0Y2hpbmdCcmFja2V0LmRlc2NyaXB0aW9uPUdvIHRvIE1hdGNoaW5nIEJyYWNrZXQKLQotCi0jCi1BZGRCb29rbWFyay5sYWJlbD1BZGQgQm9vJmttYXJrLi4uCi1TZWxlY3RSdWxlci5sYWJlbD1TZWxlY3QgUnVsZXIKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRoZXNlIHN0cmluZ3MgYXJlIHVzZWQgaW4gZmlsZSBhbmQgY29udGFpbmVyIHJlc291cmNlIHBvcHVwIG1lbnUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Tb3VyY2U9JlNvdXJjZQotRm9ybWF0RG9jdW1lbnQ9JkZvcm1hdAotUmVmYWN0b3I9UmVmYWMmdG9yCi0jIwotQnJlYWtwb2ludF9FeHRlbnNpb25fUG9pbnQubmFtZT1CcmVha3BvaW50IEV4dGVuc2lvbiBQb2ludAotU291cmNlX1ZhbGlkYXRpb25fRXh0ZW5zaW9uX1BvaW50Lm5hbWU9UmVjb25jaWxlIFZhbGlkYXRvciBFeHRlbnNpb24gUG9pbnQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVGhlIGZvbGxvd2luZyBwcm9wZXJ0eSBrZXlzIG1heWJlIHVudXNlZC4gQ29tbWVudGVkIG91dCBvbiA0LzEyLzIwMDUuIFVuY29tbWVudCBpZiBuZWVkZWQuCi0jQmVhbl9JbmZvX1Byb3ZpZGVyX0V4dGVuc2lvbi5uYW1lPUJlYW4gSW5mbyBQcm92aWRlciBFeHRlbnNpb24KLSNTcGVsbENoZWNrX0V4dGVuc2lvbl9Qb2ludC5uYW1lPVNwZWxsQ2hlY2sgRXh0ZW5zaW9uIFBvaW50Ci0jT3Blbl9Pbl9FeHRlbnNpb25fUG9pbnQubmFtZT1PcGVuIE9uIEV4dGVuc2lvbiBQb2ludAotI1NwZWxsX0NoZWNrX2xhYmVsPVNwZWxsIENoZWNrCi0jU3BlbGxfQ2hlY2tfdG9vbHRpcD1TcGVsbCBDaGVjawotcHJlZmVyZW5jZUtleXdvcmRzLnRvZG89Y2FzZSBzZW5zaXRpdmUgdGFzayB0YWcgdG9kbyB4eHggZml4IGZpeG1lIHByb2plY3Qgc3BlY2lmaWMgcHJvamVjdHNwZWNpZmljIGNvbW1lbnRzCi1wcmVmZXJlbmNlS2V5d29yZHMuc3NlZWRpdG9yPXN0cnVjdHVyZWQgdGV4dCBlZGl0b3Igc291cmNlIHhtbCBodG1sIGpzcCBhcHBlYXJhbmNlIGhpZ2hsaWdodCBtYXRjaGluZyBicmFja2V0cyByZXBvcnQgcHJvYmxlbXMgdHlwZSB2YWxpZGF0aW9uIGluZm9ybSB1bnN1cHBvcnRlZCBjb250ZW50IGZvbGRpbmcgY29sb3IgaG92ZXJzIG1vZGlmaWVyIHNlbWFudGljCi1FeHBhbmRTZWxlY3Rpb25Ubz1FeHBhbmQgU2VsZWN0aW9uIFRvCi1TbWFydEluc2VydF9sYWJlbD1TbWEmcnQgSW5zZXJ0IE1vZGUKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbD1FbmNsb3NpbmcgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsPU5leHQgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsPVByZXZpb3VzIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWw9UmVzdG9yZSBMYXN0IFNlbGVjdGlvbgotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwPVJlc3RvcmUgbGFzdCBzZWxlY3Rpb24KLQotQ29sb3JzLmNvbnRlbnRfYXNzaXN0X3Byb3Bvc2Fsc19iYWNrZ3JvdW5kPUNvbnRlbnQgQXNzaXN0IFByb3Bvc2FscyBCYWNrZ3JvdW5kCi1Db2xvcnMuY29udGVudF9hc3Npc3RfcHJvcG9zYWxzX2ZvcmVncm91bmQ9Q29udGVudCBBc3Npc3QgUHJvcG9zYWxzIEZvcmVncm91bmQKLUNvbG9ycy5jb250ZW50X2Fzc2lzdF9wYXJhbWV0ZXJzX2JhY2tncm91bmQ9Q29udGVudCBBc3Npc3QgUGFyYW1ldGVycyBCYWNrZ3JvdW5kCi1Db2xvcnMuY29udGVudF9hc3Npc3RfcGFyYW1ldGVyc19mb3JlZ3JvdW5kPUNvbnRlbnQgQXNzaXN0IFBhcmFtZXRlcnMgRm9yZWdyb3VuZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5ZGRhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMyI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24tcG9pbnQKLQkJaWQ9ImFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24iCi0JCW5hbWU9IiVBZGFwdGVyX0ZhY3RvcnlfRGVzY3JpcHRpb25fRXh0ZW5zaW9uLm5hbWUiID48L2V4dGVuc2lvbi1wb2ludD4KLQk8ZXh0ZW5zaW9uLXBvaW50Ci0JCWlkPSJleHRlbmRlZEVkaXRvckFjdGlvbnMiCi0JCW5hbWU9IiVFeHRlbmRlZF9FZGl0b3JfQWN0aW9uc19FeHRlbnNpb24ubmFtZSIgPjwvZXh0ZW5zaW9uLXBvaW50PgotCTxleHRlbnNpb24tcG9pbnQKLQkJaWQ9ImRyb3BUYXJnZXRUcmFuc2ZlcnMiCi0JCW5hbWU9IiVEcm9wX1RhcmdldF9UcmFuc2ZlcnNfRXh0ZW5zaW9uLm5hbWUiID48L2V4dGVuc2lvbi1wb2ludD4KLQk8ZXh0ZW5zaW9uLXBvaW50Ci0JCWlkPSJlZGl0b3JDb25maWd1cmF0aW9uIgotCQluYW1lPSIlRXh0ZW5kZWRfRWRpdG9yX0NvbmZpZ3VyYXRpb25fRXh0ZW5zaW9uLm5hbWUiCi0JCXNjaGVtYT0ic2NoZW1hL2VkaXRvcmNvbmZpZ3VyYXRpb24uZXhzZCIgPjwvZXh0ZW5zaW9uLXBvaW50PgotCTxleHRlbnNpb24tcG9pbnQKLQkJaWQ9InNlbWFudGljSGlnaGxpZ2h0aW5nIgotCQluYW1lPSIlU2VtYW50aWNfSGlnaGxpZ2h0aW5nX0V4dGVuc2lvbi5uYW1lIgotCQlzY2hlbWE9InNjaGVtYS9zZW1hbnRpY0hpZ2hsaWdodGluZy5leHNkIiA+PC9leHRlbnNpb24tcG9pbnQ+Ci0JPGV4dGVuc2lvbi1wb2ludAotCQlpZD0iY2hhcmFjdGVyUGFpcmluZyIKLQkJbmFtZT0iJUNoYXJhY3Rlcl9QYWlyaW5nLm5hbWUiCi0JCXNjaGVtYT0ic2NoZW1hL2NoYXJhY3RlclBhaXJpbmcuZXhzZCIgPjwvZXh0ZW5zaW9uLXBvaW50PgotCi0KLQk8IS0tIE1ha2Ugc3VyZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzIGFyZSBzZXQgYXQgcnVudGltZSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCi0JPCEtLSByZXVzYWJsZSBleHRlbnNpb25zIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTxzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiIC8+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9InByZWZlcmVuY2VwYWdlcyIKLQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmVkaXRvciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tIGFzc29jaWF0ZSB0aGUgTmF2aWdhdGVBY3Rpb25TZXQgd2l0aCB2YXJpb3VzIHBhcnRzIG9mIHRoZSBYTUwgcGVyc3BlY3RpdmUtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zIj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5hY3Rpb25TZXQuYW5ub3RhdGlvbk5hdmlnYXRpb24iPgotCQkJPHBhcnQKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciI+Ci0JCQk8L3BhcnQ+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuTmF2aWdhdGVBY3Rpb25TZXQiPgotCQkJPHBhcnQKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciI+Ci0JCQk8L3BhcnQ+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQWN0aW9uU2V0Ij4KLSAgICAgICAgICAgIDxwYXJ0IGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIi8+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gS2V5d29yZHMgZm9yIHByZWZlcmVuY2UgYW5kIHByb3BlcnRpZXMgcGFnZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkua2V5d29yZHMiPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMudG9kbyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZG8iLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnNzZWVkaXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZWVkaXRvciIvPgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JCTwhLS0gU291cmNlIEVkaXRvciBQcmVmZXJlbmNlIHBhZ2UgdW5kZXIgV29ya2JlbmNoLT5FZGl0b3JzIC0tPgotCQk8cGFnZQotCQkJbmFtZT0iJVN0cnVjdHVyZWRfVGV4dF9FZGl0b3IubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuRWRpdG9ycyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5lZGl0b3IiPgotCQkJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3NlZWRpdG9yIi8+Ci0JCTwvcGFnZT4KLQotCQk8IS0tIFNTRSB0YXNrIHRhZ3MgcHJlZmVyZW5jZSBwYWdlIHVuZGVyIHRoYXQtLT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVUYXNrX1RhZ3NfUHJlZmVyZW5jZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmVkaXRvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlRhc2tUYWdQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnRhc2t0YWdzIj4KLQkJCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZG8iLz4KLQkJPC9wYWdlPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gY29tbW9uIHRhc2sgdGFncyBwcm9wZXJ0eSBwYWdlIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgotCQk8cGFnZQotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJvamVjdC5wcm9wZXJ0aWVzLnRhc2t0YWdzIgotCQkJbmFtZT0iJVRhc2tfVGFnc19QcmVmZXJlbmNlcy5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuVGFza1RhZ1ByZWZlcmVuY2VQYWdlIj4KLSAgICAgICAgIAk8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgICAJPGFuZD4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L2FuZD4gCi0JCQk8L2VuYWJsZWRXaGVuPgotCQkJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudG9kbyIvPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tCi0JCTxleHRlbnNpb24tcG9pbnQgaWQ9ImRyYWdTb3VyY2VUcmFuc2ZlcnMiIG5hbWU9IkRyYWcgU291cmNlIFRyYW5zZmVycyIvPgotCS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLQkJPCEtLSBFZGl0IGNvbW1hbmRzIC0tPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJUFjdGlvbkRlZmluaXRpb24uc2VsZWN0RW5jbG9zaW5nLm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJUFjdGlvbkRlZmluaXRpb24uc2VsZWN0RW5jbG9zaW5nLmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIj4KLQkJPC9jb21tYW5kPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJUFjdGlvbkRlZmluaXRpb24uc2VsZWN0TmV4dC5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVBY3Rpb25EZWZpbml0aW9uLnNlbGVjdE5leHQuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5uZXh0Ij4KLQkJPC9jb21tYW5kPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJUFjdGlvbkRlZmluaXRpb24uc2VsZWN0UHJldmlvdXMubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlQWN0aW9uRGVmaW5pdGlvbi5zZWxlY3RQcmV2aW91cy5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LnByZXZpb3VzIj4KLQkJPC9jb21tYW5kPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJUFjdGlvbkRlZmluaXRpb24uc2VsZWN0TGFzdC5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVBY3Rpb25EZWZpbml0aW9uLnNlbGVjdExhc3QuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0Ij4KLQkJPC9jb21tYW5kPgotCQk8IS0tIFNvdXJjZSBjb21tYW5kcyAtLT4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLnRvZ2dsZS5jb21tZW50Lm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQudG9nZ2xlLmNvbW1lbnQuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudG9nZ2xlLmNvbW1lbnQiPgotCQk8L2NvbW1hbmQ+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlY29tbWFuZC5hZGQuYmxvY2suY29tbWVudC5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLmFkZC5ibG9jay5jb21tZW50LmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkZC5ibG9jay5jb21tZW50Ij4KLQkJPC9jb21tYW5kPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQucmVtb3ZlLmJsb2NrLmNvbW1lbnQubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC5yZW1vdmUuYmxvY2suY29tbWVudC5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5yZW1vdmUuYmxvY2suY29tbWVudCI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLmNsZWFudXAuZG9jdW1lbnQubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC5jbGVhbnVwLmRvY3VtZW50LmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNsZWFudXAuZG9jdW1lbnQiPgotCQk8L2NvbW1hbmQ+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlY29tbWFuZC5mb3JtYXQuZG9jdW1lbnQubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC5mb3JtYXQuZG9jdW1lbnQuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0LmRvY3VtZW50Ij4KLQkJPC9jb21tYW5kPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQuZm9ybWF0LmFjdGl2ZS5lbGVtZW50cy5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLmZvcm1hdC5hY3RpdmUuZWxlbWVudHMuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0LmFjdGl2ZS5lbGVtZW50cyI+Ci0JCTwvY29tbWFuZD4KLQkJPCEtLSBOYXZpZ2F0ZSBjb21tYW5kcyAtLT4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLm9wZW4uZmlsZS5mcm9tLnNvdXJjZS5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLm9wZW4uZmlsZS5mcm9tLnNvdXJjZS5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5vcGVuLmZpbGUuZnJvbS5zb3VyY2UiPgotCQk8L2NvbW1hbmQ+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJUFjdGlvbkRlZmluaXRpb24uZ290b01hdGNoaW5nQnJhY2tldC5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVBY3Rpb25EZWZpbml0aW9uLmdvdG9NYXRjaGluZ0JyYWNrZXQuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5uYXZpZ2F0ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmdvdG8ubWF0Y2hpbmcuYnJhY2tldCI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0JCTwhLS0gRmluZCBPY2N1cnJlbmNlcyAtLT4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzLm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMiPgotCQk8L2NvbW1hbmQ+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlY29tbWFuZC5pbmZvcm1hdGlvbi5xdWlja19vdXRsaW5lLm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQuaW5mb3JtYXRpb24ucXVpY2tfb3V0bGluZS5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5Lm5hdmlnYXRlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucXVpY2tfb3V0bGluZSI+Ci0JCTwvY29tbWFuZD4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tIEtleWJpbmRpbmcgc2NvcGUgZm9yIHNvdXJjZSBlZGl0b3IgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMiPgotCQk8Y29udGV4dAotCQkJbmFtZT0iJXNjb3BlLnN0cnVjdHVyZWRUZXh0RWRpdG9yLm5hbWUiCi0JCQlwYXJlbnRJZD0ib3JnLmVjbGlwc2UudWkudGV4dEVkaXRvclNjb3BlIgotCQkJZGVzY3JpcHRpb249IiVzY29wZS5zdHJ1Y3R1cmVkVGV4dEVkaXRvci5kZXNjcmlwdGlvbiIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiPgotCQk8L2NvbnRleHQ+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSBLZXliaW5kaW5ncyBmb3Igc291cmNlIGVkaXRvciAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5iaW5kaW5ncyI+Ci0JICAgIDwhLS0gIHdpbjMyOiAgTTE9Q1RSTCwgTTI9U0hJRlQsIE0zPUFMVCAtLT4KLQkJPCEtLSBFZGl0IGNvbW1hbmRzIC0tPgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTIrTTMrQVJST1dfVVAiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LmVuY2xvc2luZyIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXk+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMitNMytBUlJPV19SSUdIVCIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXk+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMitNMytBUlJPV19SSUdIVCIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSIiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIKLQkJCXBsYXRmb3JtPSJjYXJib24iPgotCQk8L2tleT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0yK000K0FSUk9XX1JJR0hUIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5uZXh0IgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iCi0JCQlwbGF0Zm9ybT0iY2FyYm9uIj4KLQkJPC9rZXk+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMitNMytBUlJPV19MRUZUIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXk+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMitNMytBUlJPV19MRUZUIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9IiIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIgotCQkJcGxhdGZvcm09ImNhcmJvbiI+Ci0JCTwva2V5PgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTIrTTQrQVJST1dfTEVGVCIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QucHJldmlvdXMiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIKLQkJCXBsYXRmb3JtPSJjYXJib24iPgotCQk8L2tleT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0yK00zK0FSUk9XX0RPV04iCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCQk8IS0tIFNvdXJjZSBjb21tYW5kcyAtLT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0xK00yK0MiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50b2dnbGUuY29tbWVudCIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXk+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMStPIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucXVpY2tfb3V0bGluZSIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXk+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMStNMisvIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRkLmJsb2NrLmNvbW1lbnQiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTErLyIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkZC5ibG9jay5jb21tZW50IgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iCi0JCQlwbGF0Zm9ybT0iY2FyYm9uIj4KLQkJPC9rZXk+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMStNMitcIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucmVtb3ZlLmJsb2NrLmNvbW1lbnQiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTErXCIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnJlbW92ZS5ibG9jay5jb21tZW50IgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iCi0JCQlwbGF0Zm9ybT0iY2FyYm9uIj4KLQkJPC9rZXk+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMStNMitGIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0LmRvY3VtZW50IgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0xK0kiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5mb3JtYXQuYWN0aXZlLmVsZW1lbnRzIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQkJPCEtLSBOYXZpZ2F0ZSBjb21tYW5kcyAtLT4KLQkJPGtleQotCQkJc2VxdWVuY2U9IkYzIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkub3Blbi5maWxlLmZyb20uc291cmNlIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQkJPGtleQotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK00yK1AiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5nb3RvLm1hdGNoaW5nLmJyYWNrZXQiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIvPgotCQk8IS0tIEZpbmQgT2NjdXJyZW5jZXMgLS0+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMStNMitBIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gRm9udCBhbmQgY29sb3JzIGNvbnRyaWJ1dGlvbnMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudGhlbWVzIj4KLQkJPHRoZW1lRWxlbWVudENhdGVnb3J5Ci0JCQlsYWJlbD0iJVN0cnVjdHVyZWRfVGV4dF9FZGl0b3IubmFtZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIj4KLQkJPC90aGVtZUVsZW1lbnRDYXRlZ29yeT4KLQkJPGZvbnREZWZpbml0aW9uCi0JCQlsYWJlbD0iJXNvdXJjZUVkaXRvckZvbnREZWZpbml0b24ubGFiZWwiCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIgotCQkJZGVmYXVsdHNUbz0ib3JnLmVjbGlwc2UuamZhY2UudGV4dGZvbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCI+Ci0JCQk8ZGVzY3JpcHRpb24+Ci0JCQkJJXNvdXJjZUVkaXRvckZvbnREZWZpbnRpb24uZGVzY3JpcHRpb24KLQkJCTwvZGVzY3JpcHRpb24+Ci0JCTwvZm9udERlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5kcm9wVGFyZ2V0VHJhbnNmZXJzIj4KLQkJPGRyb3BUYXJnZXRDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9uLkV4dGVuZGVkVHJhbnNmZXJzIj4KLQkJCTx0cmFuc2ZlcgotCQkJCXByaW9yaXR5PSJtaWQiCi0JCQkJc2luZ2xldG9uPSJ0cnVlIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlciIKLQkJCQltZXRob2Q9ImdldEluc3RhbmNlIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlciI+Ci0JCQk8L3RyYW5zZmVyPgotCQkJPGRyb3BBY3Rpb24KLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5GaWxlRHJvcEFjdGlvbiIKLQkJCQl0cmFuc2ZlcklEPSJvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlciIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5GaWxlRHJvcEFjdGlvbiI+Ci0JCQk8L2Ryb3BBY3Rpb24+Ci0JCQk8dHJhbnNmZXIKLQkJCQlwcmlvcml0eT0ibG93IgotCQkJCXNpbmdsZXRvbj0idHJ1ZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXIiCi0JCQkJbWV0aG9kPSJnZXRJbnN0YW5jZSIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXIiPgotCQkJPC90cmFuc2Zlcj4KLQkJCTxkcm9wQWN0aW9uCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuVGV4dERyb3BBY3Rpb24iCi0JCQkJdHJhbnNmZXJJRD0ib3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXIiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuVGV4dERyb3BBY3Rpb24iPgotCQkJPC9kcm9wQWN0aW9uPgotCQk8L2Ryb3BUYXJnZXRDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLmFubm90YXRpb25UeXBlcyI+Ci0JCTx0eXBlCi0JCQlzdXBlcj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IuZXJyb3IiCi0JCQltYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnByb2JsZW0iCi0JCQluYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuZXJyb3IiCi0JCQltYXJrZXJTZXZlcml0eT0iMiI+Ci0JCTwvdHlwZT4KLQkJPHR5cGUKLQkJCXN1cGVyPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci53YXJuaW5nIgotCQkJbWFya2VyVHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5wcm9ibGVtIgotCQkJbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLndhcm5pbmciCi0JCQltYXJrZXJTZXZlcml0eT0iMSI+Ci0JCTwvdHlwZT4KLQotCQk8dHlwZQotCQkJc3VwZXI9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmluZm8iCi0JCQltYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnByb2JsZW0iCi0JCQluYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuaW5mbyIKLQkJCW1hcmtlclNldmVyaXR5PSIwIj4KLQkJPC90eXBlPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMubWFya2VyQW5ub3RhdGlvblNwZWNpZmljYXRpb24iPgotCi0JCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQkJPCEtLSBzYW1lIGFzIGVjbGlwc2UgdGV4dCB1aSAoaW5jbHVkaW5nIHByZWZlcmVuY2Uga2V5cyksIGV4Y2VwdCBmb3IgdmVydGljYWwgcnVsZXIgJiBwcmVmZXJlbmNlIHBhZ2UgLS0+Ci0JCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQkJPHNwZWNpZmljYXRpb24KLQkJCWFubm90YXRpb25UeXBlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuZXJyb3IiCi0JCQlhbm5vdGF0aW9uSW1hZ2VQcm92aWRlcj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51aS5TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25JbWFnZVByb3ZpZGVyIgotCQkJdmVydGljYWxSdWxlclByZWZlcmVuY2VWYWx1ZT0idHJ1ZSIKLQkJCXZlcnRpY2FsUnVsZXJQcmVmZXJlbmNlS2V5PSJzc2VFcnJvckluZGljYXRpb25JblZlcnRpY2FsUnVsZXIiCi0JCQlpbmNsdWRlT25QcmVmZXJlbmNlUGFnZT0iZmFsc2UiPgotCQk8L3NwZWNpZmljYXRpb24+Ci0JCTxzcGVjaWZpY2F0aW9uCi0JCQlhbm5vdGF0aW9uVHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLndhcm5pbmciCi0JCQlhbm5vdGF0aW9uSW1hZ2VQcm92aWRlcj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51aS5TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25JbWFnZVByb3ZpZGVyIgotCQkJdmVydGljYWxSdWxlclByZWZlcmVuY2VWYWx1ZT0iZmFsc2UiCi0JCQl2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZUtleT0ic3NlV2FybmluZ0luZGljYXRpb25JblZlcnRpY2FsUnVsZXIiCi0JCQlpbmNsdWRlT25QcmVmZXJlbmNlUGFnZT0iZmFsc2UiPgotCQk8L3NwZWNpZmljYXRpb24+Ci0JCTxzcGVjaWZpY2F0aW9uCi0JCQlhbm5vdGF0aW9uSW1hZ2VQcm92aWRlcj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51aS5TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25JbWFnZVByb3ZpZGVyIgotCQkJYW5ub3RhdGlvblR5cGU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVtcC5pbmZvIj4KLQkJPC9zcGVjaWZpY2F0aW9uPgotCTwvZXh0ZW5zaW9uPgotPCEtLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkJPG9iamVjdENvbnRyaWJ1dGlvbgotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hY3Rpb25zLkNvbnRhaW5lclNvdXJjZUFjdGlvbnMiPgotCQkJPG1lbnUKLQkJCQlsYWJlbD0iJVNvdXJjZSIKLQkJCQlwYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9InNvdXJjZSI+Ci0JCQkJPGdyb3VwTWFya2VyIG5hbWU9InNvdXJjZUdyb3VwIj48L2dyb3VwTWFya2VyPgotCQkJPC9tZW51PgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlRm9ybWF0RG9jdW1lbnQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZSIKLQkJCQltZW51YmFyUGF0aD0ic291cmNlL3NvdXJjZUdyb3VwIgotCQkJCWVuYWJsZXNGb3I9IisiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWN0aW9ucy5Db250YWluZXJTb3VyY2VBY3Rpb25zLkZvcm1hdCI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9vYmplY3RDb250cmlidXRpb24+Ci0JCTxvYmplY3RDb250cmlidXRpb24KLQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFjdGlvbnMuRmlsZVNvdXJjZUFjdGlvbnMiPgotCQkJPG1lbnUKLQkJCQlsYWJlbD0iJVNvdXJjZSIKLQkJCQlwYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9InNvdXJjZSI+Ci0JCQkJPGdyb3VwTWFya2VyIG5hbWU9InNvdXJjZUdyb3VwIj48L2dyb3VwTWFya2VyPgotCQkJPC9tZW51PgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlRm9ybWF0RG9jdW1lbnQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZSIKLQkJCQltZW51YmFyUGF0aD0ic291cmNlL3NvdXJjZUdyb3VwIgotCQkJCWVuYWJsZXNGb3I9IisiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWN0aW9ucy5GaWxlU291cmNlQWN0aW9ucy5Gb3JtYXQiPgotCQkJPC9hY3Rpb24+Ci0JCTwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgCTwvZXh0ZW5zaW9uPgotICAgCS0tPgotICAgPCEtLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotICAgICAgPGVkaXRvckNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvci5ydWxlci5hY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVNlbGVjdFJ1bGVyLmxhYmVsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIC0tPgotICAgCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gY29udHJpYnV0ZSBhIFNlYXJjaFJlc3VsdFZpZXdQYWdlIGZvciBPY2N1cnJlbmNlcyBpbiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbgotCQlpZD0iT2NjdXJyZW5jZXMgc2VhcmNoIHBhZ2UiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5zZWFyY2guc2VhcmNoUmVzdWx0Vmlld1BhZ2VzIj4KLQkJPHZpZXdQYWdlCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zZWFyY2guT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHRQYWdlIgotCQkJc2VhcmNoUmVzdWx0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLk9jY3VycmVuY2VzU2VhcmNoUmVzdWx0IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLk9jY3VycmVuY2VzU2VhcmNoVmlld1BhZ2UiPgotCQk8L3ZpZXdQYWdlPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBleHRlbnNpb24gcG9pbnQgZm9yIHRvZ2dsaW5nIGJyZWFrcG9pbnRzIC0tPgotCTxleHRlbnNpb24tcG9pbnQKLQkJaWQ9ImJyZWFrcG9pbnQiCi0JCW5hbWU9IiVCcmVha3BvaW50X0V4dGVuc2lvbl9Qb2ludC5uYW1lIiAKLQkJc2NoZW1hPSJzY2hlbWEvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5icmVha3BvaW50LmV4c2QiIC8+Ci0JPCEtLSBleHRlbnNpb24gcG9pbnQgZm9yIHNvdXJjZSB2YWxpZGF0aW9uIC0tPgotCTwhLS0gaW50ZXJmYWNlcyBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQgY2FuIGJlIGZvdW5kIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIC0tPgotCTxleHRlbnNpb24tcG9pbnQKLQkJaWQ9InNvdXJjZXZhbGlkYXRpb24iCi0JCW5hbWU9IiVTb3VyY2VfVmFsaWRhdGlvbl9FeHRlbnNpb25fUG9pbnQubmFtZSIKLQkJc2NoZW1hPSJzY2hlbWEvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uLmV4c2QiIC8+Ci0JPGV4dGVuc2lvbi1wb2ludCAKLQkJaWQ9InF1aWNrRml4UHJvY2Vzc29yIiAKLQkJbmFtZT0iJXF1aWNrRml4UHJvY2Vzc29yIiAKLQkJc2NoZW1hPSJzY2hlbWEvcXVpY2tGaXhQcm9jZXNzb3IuZXhzZCIvPgotIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNvbXBsZXRpb25Qcm9wb3NhbCIgbmFtZT0iJUNvbXBsZXRpb25fUHJvcG9zYWwubmFtZSIgc2NoZW1hPSJzY2hlbWEvY29tcGxldGlvblByb3Bvc2FsLmV4c2QiLz4KLSA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbiIgbmFtZT0iJUNvbXBsZXRpb25fUHJvcG9zYWxfQ2F0ZWdvcmllc19Db25maWd1cmF0aW9uLm5hbWUiIHNjaGVtYT0ic2NoZW1hL2NvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uLmV4c2QiLz4KLSAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+Ci0JCTxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51Om9yZy5lY2xpcHNlLnVpLm1haW4ubWVudT9hZnRlcj1lZGl0Ij4KLQkJCTxtZW51IGlkPSJzb3VyY2VNZW51SWQiIGxhYmVsPSIlU291cmNlIj48L21lbnU+Ci0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLQkJPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9Im1lbnU6b3JnLmVjbGlwc2UudWkubWFpbi5tZW51P2FmdGVyPXNvdXJjZU1lbnVJZCI+Ci0JCQk8bWVudSBpZD0icmVmYWN0b3JNZW51SWQiIGxhYmVsPSIlUmVmYWN0b3IiPjwvbWVudT4KLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCSAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0ibWVudTplZGl0P2FmdGVyPWFkZGl0aW9ucyI+Ci0JICAgICAgIDxtZW51IGlkPSJleHBhbmRTZWxlY3Rpb25Ub01lbnVJZCIgbGFiZWw9IiVFeHBhbmRTZWxlY3Rpb25UbyI+PC9tZW51PgotCQk8L21lbnVDb250cmlidXRpb24+Ci0JCTxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51OnNvdXJjZU1lbnVJZCI+Ci0JCQk8c2VwYXJhdG9yIG5hbWU9InNvdXJjZUJlZ2luIiB2aXNpYmxlPSJmYWxzZSI+PC9zZXBhcmF0b3I+Ci0JCQk8c2VwYXJhdG9yIG5hbWU9InNoaWZ0QmVnaW4iIHZpc2libGU9InRydWUiPjwvc2VwYXJhdG9yPgotCQkJPHNlcGFyYXRvciBuYW1lPSJzaGlmdEVuZCIgdmlzaWJsZT0idHJ1ZSI+PC9zZXBhcmF0b3I+Ci0JCQk8c2VwYXJhdG9yIG5hbWU9ImFkZGl0aW9ucyIgdmlzaWJsZT0idHJ1ZSI+PC9zZXBhcmF0b3I+Ci0JCQk8c2VwYXJhdG9yIG5hbWU9InNvdXJjZUVuZCIgdmlzaWJsZT0iZmFsc2UiPjwvc2VwYXJhdG9yPgkKLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCi0JICAgIDxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51OmdvVG8/YWZ0ZXI9YWRkaXRpb25zIj4KLQkJICAgIDxzZXBhcmF0b3IgbmFtZT0ibWF0Y2hpbmdCZWdpbiIgdmlzaWJsZT0iZmFsc2UiPjwvc2VwYXJhdG9yPgotCQkgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmdvdG8ubWF0Y2hpbmcuYnJhY2tldCIgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZ290by5tYXRjaGluZy5icmFja2V0IiBsYWJlbD0iJUFjdGlvbkRlZmluaXRpb24uZ290b01hdGNoaW5nQnJhY2tldC5uYW1lIiBzdHlsZT0icHVzaCI+Ci0JCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zc2VBY3RpdmVDb250ZXh0LmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCSAgICA8L2NvbW1hbmQ+Ci0JCQk8c2VwYXJhdG9yIG5hbWU9Im1hdGNoaW5nRW5kIiB2aXNpYmxlPSJmYWxzZSI+PC9zZXBhcmF0b3I+Ci0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLQkJPCEtLSBDb250cmlidXRlIGEgU291cmNlIG1lbnUgZm9yIGNvbnRhaW5lcnMgLS0+Ci0gICAgIDxtZW51Q29udHJpYnV0aW9uCi0gICAgICAgICAgIGxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS51aS5wb3B1cC5hbnk/YWZ0ZXI9YWRkaXRpb25zIj4KLSAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgaWQ9InNvdXJjZU1lbnVJZCIKLSAgICAgICAgICAgICAgbGFiZWw9IiVTb3VyY2UiPgotCSAgICAgICAgPGNvbW1hbmQKLQkgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5mb3JtYXQiCi0JICAgICAgICAgICAgICBpZD0ic291cmNlRm9ybWF0IgotCSAgICAgICAgICAgICAgc3R5bGU9InB1c2giPgotCSAgICAgICAgICAgPCEtLSBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBpcyBlbmFibGVkIGJlZm9yZSBtYWtpbmcgdmlzaWJsZSAtLT4KLQkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJ0cnVlIiAvPgotCSAgICAgICAgPC9jb21tYW5kPgotICAgICAgICA8L21lbnU+Ci0gICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KLQkJPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9Im1lbnU6c291cmNlTWVudUlkP2FmdGVyPWFkZGl0aW9ucyI+Ci0JCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMiIGlkPSJPY2N1cmVuY2VzRmlsZSIgc3R5bGU9InB1c2giPgotCQkJICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zc2VBY3RpdmVDb250ZXh0LmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLQkgICAgPCEtLTxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51OmVkaXQ/YWZ0ZXI9YWRkaXRpb25zIj4KLQkgICAgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5lZGl0LnRleHQudG9nZ2xlSW5zZXJ0TW9kZSIgaWQ9IlRvZ2dsZUluc2VydE1vZGUiIGxhYmVsPSIlU21hcnRJbnNlcnRfbGFiZWwiIHN0eWxlPSJ0b2dnbGUiPgotCQkJICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCSAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQkgICA8L3Zpc2libGVXaGVuPgotCSAgICAgICA8L2NvbW1hbmQ+CSAgICAgICAKLQkJPC9tZW51Q29udHJpYnV0aW9uPiAtLT4KLQkgICAgPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9Im1lbnU6ZXhwYW5kU2VsZWN0aW9uVG9NZW51SWQiPgotCSAgICAgICA8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5lbmNsb3NpbmciIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIiBsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbCIgc3R5bGU9InB1c2giPgotCQkJICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zc2VBY3RpdmVDb250ZXh0LmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JICAgICAgIDwvY29tbWFuZD4JICAgICAgIAotCSAgICAgICA8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5uZXh0IiBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiIGxhYmVsPSIlU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbCIgc3R5bGU9InB1c2giPgotCQkJICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zc2VBY3RpdmVDb250ZXh0LmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JICAgICAgIDwvY29tbWFuZD4KLQkgICAgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QucHJldmlvdXMiIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QucHJldmlvdXMiIGxhYmVsPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWwiIHN0eWxlPSJwdXNoIj4KLQkJCSAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3NlQWN0aXZlQ29udGV4dC5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCQk8L3Zpc2libGVXaGVuPgotCSAgICAgICA8L2NvbW1hbmQ+Ci0JICAgICAgIDxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubGFzdCIgbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsIiBzdHlsZT0icHVzaCI+Ci0JCQkgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkgICAgICAgPC9jb21tYW5kPgotCQk8L21lbnVDb250cmlidXRpb24+Ci0JCQotCi0JCTxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51OnNvdXJjZU1lbnVJZD9hZnRlcj1zaGlmdEJlZ2luIj4KLQkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LnNoaWZ0TGVmdCIKLQkJCSAgICAgICAgIGlkPSJTaGlmdExlZnQiCi0JCQkgICAgICAgICBzdHlsZT0icHVzaCI+Ci0JCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zc2VBY3RpdmVDb250ZXh0LmRlZmluaXRpb24iLz4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkJPC9jb21tYW5kPgotCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5lZGl0LnRleHQuc2hpZnRSaWdodCIKLSAgICAgICAgICAgICAgICAgICAgIGlkPSJTaGlmdFJpZ2h0IgotICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giPgotCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3NlQWN0aXZlQ29udGV4dC5kZWZpbml0aW9uIi8+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4KLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCi0JCTxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51OnNvdXJjZU1lbnVJZD9hZnRlcj1zaGlmdEVuZCI+Ci0JICAgICAgICA8Y29tbWFuZAotCQkgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jbGVhbnVwLmRvY3VtZW50IgotCQkgICAgICAgICAgIGlkPSJDbGVhbnVwRG9jdW1lbnQiCi0JCQkgICAgICAgbW5lbW9uaWM9IiVjb21tYW5kLmNsZWFudXAuZG9jdW1lbnQubW5lbW9uaWMiCi0JCSAgICAgICAgICAgc3R5bGU9InB1c2giPgotCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3NlQWN0aXZlQ29udGV4dC5kZWZpbml0aW9uIi8+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJICAgIDwvY29tbWFuZD4KLQkJCTxjb21tYW5kIAotCQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5mb3JtYXQuZG9jdW1lbnQiIAotCQkJCWlkPSJGb3JtYXREb2N1bWVudCIgCi0JCQkgICAgbW5lbW9uaWM9IiVjb21tYW5kLmZvcm1hdC5kb2N1bWVudC5tbmVtb25pYyIKLQkJCQlzdHlsZT0icHVzaCI+Ci0JCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zc2VBY3RpdmVDb250ZXh0LmRlZmluaXRpb24iLz4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkJPC9jb21tYW5kPgotCQkJPGNvbW1hbmQgCi0JCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmZvcm1hdC5hY3RpdmUuZWxlbWVudHMiIAotCQkJCWlkPSJGb3JtYXRFbGVtZW50cyIgCi0JCQkJbW5lbW9uaWM9IiVjb21tYW5kLmZvcm1hdC5hY3RpdmUuZWxlbWVudHMubW5lbW9uaWMiCi0JCQkJc3R5bGU9InB1c2giPgotCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3NlQWN0aXZlQ29udGV4dC5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkJPC9jb21tYW5kPgotCQk8L21lbnVDb250cmlidXRpb24+Ci0KLQkgICAgIDxtZW51Q29udHJpYnV0aW9uCi0JICAgICAgICAgICBsb2NhdGlvblVSST0icG9wdXA6c291cmNlUG9wdXBNZW51SWQ/YWZ0ZXI9c291cmNlQmVnaW4iPgotCQkJCTxjb21tYW5kCi0JCQkgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jbGVhbnVwLmRvY3VtZW50IgotCQkJICAgICAgICAgICBpZD0iQ2xlYW51cERvY3VtZW50IgotCQkJICAgICAgICAgICBzdHlsZT0icHVzaCI+Ci0JCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQkgICAgPC9jb21tYW5kPgotCQkJCTxjb21tYW5kIAotCQkJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0LmRvY3VtZW50IiAKLQkJCQkJaWQ9IkZvcm1hdERvY3VtZW50IiAKLQkJCQkJbW5lbW9uaWM9IiVjb21tYW5kLmZvcm1hdC5kb2N1bWVudC5tbmVtb25pYyIgCi0JCQkJCXN0eWxlPSJwdXNoIj4KLQkJCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zc2VBY3RpdmVDb250ZXh0LmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJCQkJPC92aXNpYmxlV2hlbj4KLQkJCQk8L2NvbW1hbmQ+Ci0JCQkJPGNvbW1hbmQgCi0JCQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5mb3JtYXQuYWN0aXZlLmVsZW1lbnRzIiAKLQkJCQkJaWQ9IkZvcm1hdEVsZW1lbnRzIiAKLQkJCQkJbW5lbW9uaWM9IiVjb21tYW5kLmZvcm1hdC5hY3RpdmUuZWxlbWVudHMubW5lbW9uaWMiIAotCQkJCQlzdHlsZT0icHVzaCI+Ci0JCQkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3NlQWN0aXZlQ29udGV4dC5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQkJPC9jb21tYW5kPgotCQkJCQotCSAgICAgPC9tZW51Q29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotCSAgICA8Y29tbWFuZAotCSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5mb3JtYXQiCi0JICAgICAgICAgIG5hbWU9IiVjb21tYW5kLmZvcm1hdC5kb2N1bWVudC5uYW1lIj4KLQkgICAgPC9jb21tYW5kPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gRW5hYmxlIHRoZSBGb3JtYXRIYW5kbGVyIGZvciBDb250YWluZXJzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KLQkJPGhhbmRsZXIgCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVycy5Gb3JtYXRIYW5kbGVyIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmZvcm1hdCI+Ci0JCQk8YWN0aXZlV2hlbj4KLQkJCQk8aXRlcmF0ZSBpZkVtcHR5PSJmYWxzZSI+Ci0JCQkJCTxhZGFwdAotCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lciI+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9pdGVyYXRlPgotCQkJPC9hY3RpdmVXaGVuPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQkJPGFkYXB0Ci0JCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyIj4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L2l0ZXJhdGU+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L2hhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+Ci0JCTxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiI+Ci0gICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0iYWN0aXZlQ29udGV4dHMiPgotCSAgICAgICAgICAgPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkgICAgICAgICAgICAgIDxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIvPgotCSAgICAgICAgICAgPC9pdGVyYXRlPgotICAgICAgICAgICAgPC93aXRoPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBEZWZpbmUgdGhlbWUgLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkudGhlbWVzIj4KLQkJPHRoZW1lCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkuaWRlLnN5c3RlbURlZmF1bHQiPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iY29udGVudF9hc3Npc3RfcHJvcG9zYWxzX2JhY2tncm91bmQiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfQkFDS0dST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJjb250ZW50X2Fzc2lzdF9wcm9wb3NhbHNfZm9yZWdyb3VuZCIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9ImNvbnRlbnRfYXNzaXN0X3BhcmFtZXRlcnNfYmFja2dyb3VuZCIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9CQUNLR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9ImNvbnRlbnRfYXNzaXN0X3BhcmFtZXRlcnNfZm9yZWdyb3VuZCIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJPC90aGVtZT4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImNvbnRlbnRfYXNzaXN0X3Byb3Bvc2Fsc19iYWNrZ3JvdW5kIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5jb250ZW50X2Fzc2lzdF9wcm9wb3NhbHNfYmFja2dyb3VuZCIKLQkJCXZhbHVlPSIyNTUsMjU1LDI1NSI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iY29udGVudF9hc3Npc3RfcHJvcG9zYWxzX2ZvcmVncm91bmQiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmNvbnRlbnRfYXNzaXN0X3Byb3Bvc2Fsc19mb3JlZ3JvdW5kIgotCQkJdmFsdWU9IjAsMCwwIj4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJjb250ZW50X2Fzc2lzdF9wYXJhbWV0ZXJzX2JhY2tncm91bmQiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmNvbnRlbnRfYXNzaXN0X3BhcmFtZXRlcnNfYmFja2dyb3VuZCIKLQkJCXZhbHVlPSIyNTUsMjU1LDI1NSI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iY29udGVudF9hc3Npc3RfcGFyYW1ldGVyc19mb3JlZ3JvdW5kIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5jb250ZW50X2Fzc2lzdF9wYXJhbWV0ZXJzX2ZvcmVncm91bmQiCi0JCQl2YWx1ZT0iMCwwLDAiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLTwvcGx1Z2luPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvcmVleHBvcnQtaW5mby50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvcmVleHBvcnQtaW5mby50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOGM3YzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3JlZXhwb3J0LWluZm8udHh0CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi13ZSByZWV4cG9ydCBlY2xpcHNlLnVpLmVkaXRvcnMgCi1zaW5jZSBvbmUgb2Ygb3VyIEFQSXMsIFN0cnVjdHVyZWRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIAotcmVxdWlyZXMgaXQuIAotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc2NoZW1hL2NoYXJhY3RlclBhaXJpbmcuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zY2hlbWEvY2hhcmFjdGVyUGFpcmluZy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmI3MzFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zY2hlbWEvY2hhcmFjdGVyUGFpcmluZy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIiBpZD0iY2hhcmFjdGVyUGFpcmluZyIgbmFtZT0iQ2hhcmFjdGVyIFBhaXJpbmciLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Imluc2VydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iaW5zZXJ0ZXIiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb250ZW50VHlwZUlkZW50aWZpZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLkFic3RyYWN0Q2hhcmFjdGVyUGFpckluc2VydGVyOiIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbnRlbnRUeXBlSWRlbnRpZmllciI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhcnRpdGlvbnMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlpbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc2NoZW1hL2NvbXBsZXRpb25Qcm9wb3NhbC5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NjaGVtYS9jb21wbGV0aW9uUHJvcG9zYWwuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhOGExZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc2NoZW1hL2NvbXBsZXRpb25Qcm9wb3NhbC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIgaWQ9ImNvbXBsZXRpb25Qcm9wb3NhbCIgbmFtZT0iU1NFIENvbXBsZXRpb24gUHJvcG9zYWwiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIHRoZSBjb250cmlidXRpb24gb2YgU1NFIGNvbXBsZXRpb24gcHJvcG9zYWwgY29tcHV0ZXJzIGFuZCBjYXRlZ29yaWVzIHRvIHBhcnRpY2lwYXRlIGluIHRoZSBjb250ZW50IGFzc2lzdCBwcm9jZXNzIG9mIFNTRSBlZGl0b3JzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiIC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9wb3NhbENhdGVnb3J5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb3Bvc2FsQ29tcHV0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvcG9zYWxDb21wdXRlckV4dGVuZGVkQWN0aXZhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9wb3NhbENhdGVnb3J5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBIHByb3Bvc2FsIGNhdGVnb3J5IGNvbnRyaWJ1dGlvbiBkZWZpbmVzIGNhdGVnb3JpZXMgb2YgcHJvcG9zYWxzIHVzZWQgdG8gZ3JvdXAgdGhlbSBpbiB0aGUgVUkuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHByb3Bvc2FsIGNhdGVnb3J5Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcHJvcG9zYWwgY2F0ZWdvcnkuICBJZiBhIG5hbWUgaXMgbm90IHByb3ZpZGVkIHRoZSBwcm9wb3NhbCBjYXRlZ29yeSBJRCB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpY29uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGljb24gb2YgdGhlIGNhdGVnb3J5LCB3aGljaCBjYW4gYmUgZGlzcGxheWVkIGluIHRoZSB1c2VyIHByZWZlcmVuY2VzCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9wb3NhbENvbXB1dGVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBIHByb3Bvc2FsIGNvbXB1dGVyIGNvbnRyaWJ1dGlvbiB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggYXQgbGVhc3Qgb25lIGNvbnRlbnQgdHlwZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29udGVudFR5cGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHByb3Bvc2FsIGNvbXB1dGVyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGh1bWFuIHJlYWRhYmxlIG5hbWUgb2YgdGhlIHByb3Bvc2FsIGNvbXB1dGVyLiAgSWYgbm9uZSBpcyBnaXZlbiB0aGUgSUQgb2YgdGhlIHByb3Bvc2FsIGNvbXB1dGVyIHdpbGwgYmUgdXNlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgaWNvbiBvZiB0aGUgY29tcHV0ZXIsIHdoaWNoIHdpbGwgYmUgdXNlZCB3aGVuIGNyZWF0aW5nIHRoZSBwcm9wb3NhbHMgc3VnZ2VzdGVkIGJ5IHRoaXMgY29tcHV0ZXIuICBUaGlzIHByZWZlcmVuY2UgY2FuIGJlIHByb2dyYW1pY2x5IG92ZXJ3cml0ZW4gYnkgdGhlIGltcGxpbWVudGF0aW9uIG9mICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXImbHQ7L2NvZGUmZ3Q7IHNwZWNpZmllZCBieSB0aGUgJmx0O3R0Jmd0O2NsYXNzJmx0Oy90dCZndDsgYXR0cmlidXRlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBjb250cmlidXRlZCBjb21wdXRlci4gVGhlCi1jbGFzcyBtdXN0IGJlIHB1YmxpYyBhbmQgaW1wbGVtZW50Ci0mbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyJmx0Oy9jb2RlJmd0OwotYW5kIG11c3QgaGF2ZSBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhY3RpdmF0ZSIgdHlwZT0iYm9vbGVhbiIgdXNlPSJkZWZhdWx0IiB2YWx1ZT0iZmFsc2UiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElmIHRoZSBhdHRyaWJ1dGUgaXMgc2V0IHRvICZsdDtjb2RlJmd0O3RydWUmbHQ7L2NvZGUmZ3Q7IGl0IHdpbGwgZm9yY2UgdGhpcyBwbHVnLWluIHRvIGJlIGxvYWRlZCBvbiBjb250ZW50IGFzc2lzdCBpbnZvY2F0aW9uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2F0ZWdvcnlJZCIgdHlwZT0ic3RyaW5nIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmRlZmF1bHRQcm9wb3NhbENhdGVnb3J5Ij4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWQgb2YgYSAmbHQ7dHQmZ3Q7cHJvcG9zYWxDYXRlZ29yeSZsdDsvdHQmZ3Q7IHRoYXQgdGhpcyBwcm9wb3NhbCBjb21wdXRlciBzaG91bGQgYmUgYSBwYXJ0IG9mCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJpZGVudGlmaWVyIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbXBsZXRpb25Qcm9wb3NhbC9wcm9wb3NhbENhdGVnb3J5L0BpZCIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb250ZW50VHlwZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSBTU0UgY29udGVudCB0eXBlLiBJZiBubyBwYXJ0aXRpb24gdHlwZXMgYXJlIHByb3ZpZGVkIHRoZW4gY29tcHV0ZXIgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggYWxsIHBhcnRpdGlvbiB0eXBlcyBpbiB0aGUgY29udGVudCB0eXBlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwYXJ0aXRpb25UeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSUQgb2YgdGhlIGNvbnRlbnQgdHlwZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iaWRlbnRpZmllciIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZS5jb250ZW50VHlwZXMvY29udGVudC10eXBlL0BpZCIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb25UeXBlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBIFNTRSBwYXJ0aXRpb24gdHlwZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBwYXJ0aXRpb24gdHlwZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJvcG9zYWxDb21wdXRlckV4dGVuZGVkQWN0aXZhdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVXNlZCB0byBleHRlbmRlZCB0aGUgYWN0aXZhdGlvbiBjb250ZXh0IG9mIGFuIGFscmVhZHkgZXhpc3RpbmcgcHJvcG9zYWwgY29tcHV0ZXIuICBVc2UgdGhpcyBpZiB0aGVyZSBpcyBhIHBsdWdpbiBBIHRoYXQgaGFzIGRlZmluZWQgYSBwcm9wb3NhbCBjb21wdHVlciB0aGF0IHNob3VsZCBiZSBhY3RpdmF0ZWQgZm9yIGEgY29udGVudCB0eXBlIGRlZmluZWQgaW4gcGx1Z2luIEIuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbnRlbnRUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSUQgb2YgdGhlICZsdDt0dCZndDtwcm9wb3NhbENvbXB1dGVyJmx0Oy90dCZndDsgd2hvcyBhY3RpdmF0aW9uIGNvbnRleHQgc2hvdWxkIGJlIGV4dGVuZGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iaWRlbnRpZmllciIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21wbGV0aW9uUHJvcG9zYWwvcHJvcG9zYWxDb21wdXRlci9AaWQiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDtUaGUgZm9sbG93aW5nIGFyZSBleGFtcGxlcyBvZiBTU0UgY29tcGxldGlvbiBwcm9wb3NhbCBjb250cmlidXRpb25zOiZsdDsvcCZndDsKLQotJmx0O2ImZ3Q7UGx1Z2luIEE6Jmx0Oy9iJmd0OyZsdDtwcmUmZ3Q7Jmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbXBsZXRpb25Qcm9wb3NhbCZxdW90OyZndDsKLSAgJmx0O3Byb3Bvc2FsQ2F0ZWdvcnkKLSAgICAgIGljb249JnF1b3Q7aWNvbnMvZnVsbC9vYmoxNi90YWctbWFjcm8uZ2lmJnF1b3Q7Ci0gICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS53c3QueG1sLnVpLnByb3Bvc2FsQ2F0ZWdvcnkueG1sVGVtcGxhdGVzJnF1b3Q7Ci0gICAgICBuYW1lPSZxdW90O1hNTCBUZW1wbGF0ZXMmcXVvdDsmZ3Q7Ci0gICZsdDsvcHJvcG9zYWxDYXRlZ29yeSZndDsKLSAgJmx0O3Byb3Bvc2FsQ29tcHV0ZXIKLSAgICAgIGFjdGl2YXRlPSZxdW90O2ZhbHNlJnF1b3Q7Ci0gICAgICBjYXRlZ29yeUlkPSZxdW90O29yZy5lY2xpcHNlLndzdC54bWwudWkucHJvcG9zYWxDYXRlZ29yeS54bWxUZW1wbGF0ZXMmcXVvdDsKLSAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxUZW1wbGF0ZXNDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciZxdW90OwotICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcm9wb3NhbENvbXB1dGVyLnhtbFRlbXBsYXRlcyZxdW90OyZndDsKLSAgICAmbHQ7Y29udGVudFR5cGUKLSAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCZxdW90OyZndDsKLSAgICAmbHQ7L2NvbnRlbnRUeXBlJmd0OwotICAmbHQ7L3Byb3Bvc2FsQ29tcHV0ZXImZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsmbHQ7L3ByZSZndDsKLSZsdDtiJmd0O1BsdWdpbiBCOiZsdDsvYiZndDsgKGV4dGVuZGluZyB0aGUgYWN0aXZhdGlvbiBjb250ZXh0IG9mIGFuIGV4aXN0aW5nIGNvbXB1dGVyKSZsdDtwcmUmZ3Q7Jmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbXBsZXRpb25Qcm9wb3NhbCZxdW90OyZndDsKLSAgJmx0O3Byb3Bvc2FsQ29tcHV0ZXJFeHRlbmRlZEFjdGl2YXRpb24KLSAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLndzdC54bWwudWkucHJvcG9zYWxDYXRlZ29yeS54bWxUZW1wbGF0ZXMmcXVvdDsmZ3Q7Ci0gICAgJmx0O2NvbnRlbnRUeXBlCi0gICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7cGFydGl0aW9uVHlwZQotICAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L3BhcnRpdGlvblR5cGUmZ3Q7Ci0gICAgJmx0Oy9jb250ZW50VHlwZSZndDsKLSAgJmx0Oy9wcm9wb3NhbENvbXB1dGVyRXh0ZW5kZWRBY3RpdmF0aW9uJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Jmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGNvbnRyaWJ1dGVkIGNsYXNzIG11c3QgaW1wbGltZW50ICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXImbHQ7L2NvZGUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NjaGVtYS9jb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbi5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NjaGVtYS9jb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGY0MGY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zY2hlbWEvY29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiIGlkPSJjb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbiIgbmFtZT0iQ29tcGxldGlvbiBQcm9wb3NhbCBDYXRlZ29yaWVzIENvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIHRoZSBjb250cmlidXRpb24gb2YgY29tcGxldGlvbiBwcm9wb3NhbCBjYXRlZ29yeSBjb25maWd1cmF0aW9uIHJlYWRlcnMuICBUaGVzZSBhcmUgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggY29tcGxldGlvbiBjYXRlZ29yaWVzIGNvbnRyaWJ1dGVkIGJ5ICZsdDt0dCZndDtvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbXBsZXRpb25Qcm9wb3NhbCZsdDsvdHQmZ3Q7IGV4dGVuc2lvbnMgYXJlIHR1cm5lZCBvbiBieSBwcmVmZXJlbmNlIChlaXRoZXIgcHJvZ3JhbWF0aWMgb3IgdXNlcikuICBJZiBhIGNvbXBsZXRpb24gcHJvcG9zYWwgY2F0ZWdvcnkgY29uZmlndXJhdGlvbiByZWFkZXIgZXhpc3RzIGZvciBhIGdpdmVuIGNvbnRlbnQgdHlwZSB0aGUgcmVhZGVyIHdpbGwgYmUgY29uc3VsdGVkIHRvIGRldGVybWluZSB3aGljaCBjb21wbGV0aW9uIGNhdGVnb3JpZXMgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBjb21wbGV0aW9uIHByb3Bvc2Fscy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIiAvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjYXRlZ29yaWVzQ29uZmlndXJhdGlvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZUlEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBJRCBvZiB0aGUgY29udGVudCB0eXBlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJpZGVudGlmaWVyIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlLmNvbnRlbnRUeXBlcy9jb250ZW50LXR5cGUvQGlkIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIHRoYXQgaW1wbGltZW50cyB0aGUgY29udHJpYnV0ZWQgY29tcGxldGlvbiBwcm9wb3NhbCBjYXRlZ29yaWVzIGNvbmZpZ3VyYXRpb24uICBUaGUgY2xhc3MgbXVzdCBiZSBwdWJsaWMgYW5kIGltcGxpbWVudCBlaXRoZXIgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5JQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25SZWFkZXImbHQ7L2NvZGUmZ3Q7IG9yICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyJmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLklDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvblJlYWRlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0O1RoZSBmb2xsb3dpbmcgYXJlIGV4YW1wbGVzIG9mIGEgU1NFIGNvbXBsZXRpb24gcHJvcG9zYWwgY29tcHV0ZXIgY29udHJpYnV0aW9uOiZsdDsvcCZndDsKLSZsdDtwcmUmZ3Q7Jmx0O2V4dGVuc2lvbgotICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UudWkuY29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24mcXVvdDsmZ3Q7Ci0gICZsdDtjYXRlZ29yaWVzQ29uZmlndXJhdGlvbgotICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24mcXVvdDsKLSAgICBjb250ZW50VHlwZUlEPSZxdW90O29yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwmcXVvdDsmZ3Q7Ci0gICZsdDsvY2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24mZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlpbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0O1RoZSBjb250cmlidXRlZCBjbGFzcyBtdXN0IGltcGxpbWVudCBlaXRoZXIgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5JQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25SZWFkZXImbHQ7L2NvZGUmZ3Q7IG9yICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyJmx0Oy9jb2RlJmd0Oy4mbHQ7L3AmZ3Q7Ci0KLSZsdDtwJmd0O0EgcmVhZGVyIGltcGxpbWVudGF0aW9uIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBwcmVmZXJlbmNlcyBjYW4gbm90IGJlIHNldCBieSB0aGUgdXNlciwgaWYgdGhlIHByZWZlcmVuY2VzIHdpbGwgYmUgbW9kaWZpZWQgYnkgdGhlIHVzZXIgdGhlbiBhIHdyaXRlciBpbXBsaW1lbnRhdGlvbiBzaG91bGQgYmUgdXNlZC4mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0O1NlZSAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLkFic3RyYWN0Q29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24mbHQ7L2NvZGUmZ3Q7IHdoaWNoIGlmIGltcGxpbWVudGVkIGJ5IGFuIGFkb3B0ZXIgcHJvdmlkZXMgYSB1c2VmdWxsIGZyYW1ld29yayBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBjb21wbGV0aW9uIHByb3Bvc2FsIGNhdGVnb3JpZXMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB0byBhIHByZWZlcmVuY2Ugc3RvcmUuJmx0Oy9wJmd0OwotCi0mbHQ7cCZndDtGb3IgYSB1c2VmdWwgdXNlciBpbnRlcmZhY2UgZm9yIG1vZGlmaW5nIGNvbXBsZXRpb24gcHJvcG9zYWwgY2F0ZWdvcmllcyBjb25maWd1cmF0aW9ucyBzZWUgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5Db2RlQXNzaXN0Q3ljbGluZ0NvbmZpZ3VyYXRpb25CbG9jayZsdDsvY29kZSZndDsgd2hpY2ggY2FuIGVhc2x5IGJlIGluY2x1ZGVkIG9uIGEgcHJlZmVyZW5jZSBwYWdlLiZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NjaGVtYS9lZGl0b3Jjb25maWd1cmF0aW9uLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc2NoZW1hL2VkaXRvcmNvbmZpZ3VyYXRpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4MzQ4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc2NoZW1hL2VkaXRvcmNvbmZpZ3VyYXRpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiIGlkPSJlZGl0b3JDb25maWd1cmF0aW9uIiBuYW1lPSJFZGl0b3IgQ29uZmlndXJhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgU1NFIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGlzIGludGVuZGVkIHRvIGJlIGFzIGZsZXhpYmxlIGFzIHBvc3NpYmxlLiAgTXVjaCBvZiBpdHMgZGVzaWduIGNlbnRlcnMgYXJvdW5kIHRoZSBub3Rpb24gb2YgZGVmaW5pbmcgYW5kIHJlZGVmaW5pbmcgaXRzIGJlaGF2aW9yIGFuZCBhcHBlYXJhbmNlIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUgb2YgaXRzIGlucHV0LiAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGNsaWVudHMgdG8gcHJvdmlkZSBhbiBlZGl0b3IgY29uZmlndXJhdGlvbiB0byB0aGUgU3RydWN0dXJlZFRleHRFZGl0b3Igd2l0aG91dCBoYXZpbmcgdG8gc3ViY2xhc3MgdGhlIGVkaXRvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRvY3VtZW50YXRpb25UZXh0SG92ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZG91YmxlQ2xpY2tTdHJhdGVneSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm92aXNpb25hbENvbmZpZ3VyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvdmlzaW9uYWxEZWZpbml0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InF1aWNrT3V0bGluZUNvbmZpZ3VyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWZpbmVzIHRoZSBzb3VyY2Ugdmlld2VyIGNvbmZpZ3VyYXRpb24sIGFmZmVjdGluZyBzeW50YXggaGlnaGxpZ2h0aW5nLCBjb250ZW50IGFzc2lzdCwgaG92ZXIgaGVscCwgYW5kIG1vcmUgaW4gdGhlIGN1cnJlbnQgZWRpdG9yLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBzdHJpbmcgZGVmaW5pbmcgd2hlbiB0byB1c2UgdGhpcyBleHRlbnNpb24sIGVpdGhlciBhbiBlZGl0b3Igb3IgY29udGVudCB0eXBlIGlkLiAgTXVsdGlwbGUgdGFyZ2V0cyBtYXkgYmUgZ2l2ZW4gYXMgYSBjb21tYSBkZWxpbWl0ZWQgdmFsdWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgTXVzdCBzdWJjbGFzcyBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb246Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVmaW5lcyBob3cgdGhlIGN1cnJlbnQgZWRpdG9yJmFwb3M7cyBpbnB1dCBtYXBzIHRvIGVsZW1lbnRzIHdpdGggaW4gYSBUcmVlIGNvbnRyb2wsIGFzIHdlbGwgYXMgc2VsZWN0aW9uIGZpbHRlcmluZywgdG9vbGJhciBhbmQgbWVudSBjb250cmlidXRpb25zLCBldGMgaW4gdGhlIE91dGxpbmUgdmlldy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgc3RyaW5nIGRlZmluaW5nIHdoZW4gdG8gdXNlIHRoaXMgZXh0ZW5zaW9uLCBlaXRoZXIgYW4gZWRpdG9yIG9yIGNvbnRlbnQgdHlwZSBpZC4gIE11bHRpcGxlIHRhcmdldHMgbWF5IGJlIGdpdmVuIGFzIGEgY29tbWEgZGVsaW1pdGVkIHZhbHVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIE11c3Qgc3ViY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uOiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVmaW5lcyBob3cgdGhlIGN1cnJlbnQgZWRpdG9yJmFwb3M7cyBpbnB1dCBtYXBzIHRvIHByb3BlcnRpZXMgaW4gYSBUYWJsZSBjb250cm9sLCBhcyB3ZWxsIGFzIHRvb2xiYXIgY29udHJpYnV0aW9ucywgZXRjIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHN0cmluZyBkZWZpbmluZyB3aGVuIHRvIHVzZSB0aGlzIGV4dGVuc2lvbiwgZWl0aGVyIGFuIGVkaXRvciBvciBjb250ZW50IHR5cGUgaWQuICBNdWx0aXBsZSB0YXJnZXRzIG1heSBiZSBnaXZlbiBhcyBhIGNvbW1hIGRlbGltaXRlZCB2YWx1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBNdXN0IHN1YmNsYXNzIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uOiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkb2N1bWVudGF0aW9uVGV4dEhvdmVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWZpbmVzIHRoZSB0ZXh0IGhvdmVyIHByb2Nlc3NvciB0byB1c2UgdG8gZGlzcGxheSBkb2N1bWVudGF0aW9uIGluZm9ybWF0aW9uIGluIGEgdGV4dCBob3Zlci4gTm90ZSwgaW4gdGhlIGV2ZW50IG1vcmUgdGhhbiBvbmUgZG9jdW1lbnRhdGlvbiB0ZXh0IGhvdmVyIGlzIGNvbnRyaWJ1dGVkIGZvciB0aGUgc2FtZSB0YXJnZXQgcGFydGl0aW9uIHR5cGUsIHRoZSBmaXJzdCBvbmUgbG9hZGVkIHdpbGwgYmUgdGhlIG9uZSB1c2VkIGFuZCBhbGwgb3RoZXIgY29udHJpYnV0aW9ucyB3aWxsIGJlIGlnbm9yZWQuCi0mbHQ7YnIgLyZndDsKLSZsdDtpJmd0O1NpbmNlIDMuMCZsdDsvaSZndDsKLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgc3RyaW5nIGRlZmluaW5nIHdoZW4gdG8gdXNlIHRoaXMgZXh0ZW5zaW9uLiAgTXVzdCBiZSBhIHBhcnRpdGlvbiB0eXBlIGlkLiAgTXVsdGlwbGUgdGFyZ2V0cyBtYXkgYmUgZ2l2ZW4gYXMgYSBjb21tYSBkZWxpbWl0ZWQgdmFsdWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgTXVzdCBpbXBsZW1lbnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRvdWJsZUNsaWNrU3RyYXRlZ3kiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGRvdWJsZWNsaWNrIHN0cmF0ZWd5IHRvIHVzZSB3aGVuIHRoZSB1c2VyIHBlcmZvcm1zIGEgbW91c2UgZG91YmxlY2xpY2suICBOb3RlLCBpbiB0aGUgZXZlbnQgbW9yZSB0aGFuIG9uZSBkb3VibGVjbGljayBzdHJhdGVneSBpcyBjb250cmlidXRlZCBmb3IgdGhlIHNhbWUgdGFyZ2V0IHBhcnRpdGlvbiB0eXBlLCB0aGUgZmlyc3Qgb25lIGxvYWRlZCB3aWxsIGJlIHRoZSBvbmUgdXNlZCBhbmQgYWxsIG90aGVyIGNvbnRyaWJ1dGlvbnMgd2lsbCBiZSBpZ25vcmVkLgotJmx0O2JyIC8mZ3Q7Ci0mbHQ7aSZndDtTaW5jZSAzLjAmbHQ7L2kmZ3Q7Ci0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHN0cmluZyBkZWZpbmluZyB3aGVuIHRvIHVzZSB0aGlzIGV4dGVuc2lvbi4gIE11c3QgYmUgYSBwYXJ0aXRpb24gdHlwZSBpZC4gIE11bHRpcGxlIHRhcmdldHMgbWF5IGJlIGdpdmVuIGFzIGEgY29tbWEgZGVsaW1pdGVkIHZhbHVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIE11c3QgaW1wbGVtZW50IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHREb3VibGVDbGlja1N0cmF0ZWd5Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3kiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJvdmlzaW9uYWxDb25maWd1cmF0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWNsYXJlcyBhIGNsYXNzIGZ1bGZpbGxpbmcgdGhlIHJlcXVpcmVtZW50cyBvZiBhIHR5cGUgdG8gYmUgdXNlZCBmb3IgdGhlIGdpdmVuIHRhcmdldChzKS4KLU5vdGU6IHRoaXMgaXMgbm90IEFQSSBhbmQgaXMgb25seSB1c2VkIGZvciBwcm92aXNpb25hbCBjb25maWd1cmF0aW9uIHR5cGVzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBzdHJpbmcgZGVmaW5pbmcgd2hlbiB0byB1c2UgdGhpcyBleHRlbnNpb24sIGVpdGhlciBhbiBlZGl0b3Igb3IgY29udGVudCB0eXBlIGlkLiAgTXVsdGlwbGUgdGFyZ2V0cyBtYXkgYmUgZ2l2ZW4gYXMgYSBjb21tYSBkZWxpbWl0ZWQgdmFsdWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiBjb25maWd1cmF0aW9uIHRvIGZpbmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoaXMgdHlwZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJvdmlzaW9uYWxEZWZpbml0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWZpbmVzIGEgdmFsdWUgZm9yIGEgdHlwZSB0byBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gdGFyZ2V0KHMpLgotTm90ZTogdGhpcyBpcyBub3QgQVBJIGFuZCBpcyBvbmx5IHVzZWQgZm9yIHByb3Zpc2lvbmFsIGNvbmZpZ3VyYXRpb24gdHlwZXMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgZGVmaW5pdGlvbiB0byBmaW5kLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGlzIGRlZmluaXRpb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgc3RyaW5nIGRlZmluaW5nIHdoZW4gdG8gdXNlIHRoaXMgZXh0ZW5zaW9uLCBlaXRoZXIgYW4gZWRpdG9yIG9yIGNvbnRlbnQgdHlwZSBpZC4gIE11bHRpcGxlIHRhcmdldHMgbWF5IGJlIGdpdmVuIGFzIGEgY29tbWEgZGVsaW1pdGVkIHZhbHVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJxdWlja091dGxpbmVDb25maWd1cmF0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWZpbmVzIHRoZSBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQgd2hlbiBkaXNwbGF5aW5nIGVkaXRvciBpbnB1dCBpbiB0aGUgVHJlZSBsYXlvdXQgZm9yIGFuIGVkaXRvciZhcG9zO3MgUXVpY2sgT3V0bGluZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgc3RyaW5nIGRlZmluaW5nIHdoZW4gdG8gdXNlIHRoaXMgZXh0ZW5zaW9uLCBlaXRoZXIgYW4gZWRpdG9yIG9yIGNvbnRlbnQgdHlwZSBpZC4gIE11bHRpcGxlIHRhcmdldHMgbWF5IGJlIGdpdmVuIGFzIGEgY29tbWEgZGVsaW1pdGVkIHZhbHVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyB0aGF0IHByb3ZpZGVzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBxdWljayBvdXRsaW5lIGNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLkFic3RyYWN0UXVpY2tPdXRsaW5lQ29uZmlndXJhdGlvbjoiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIAotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uJnF1b3Q7Jmd0OwotICAgICAgJmx0OyEtLSBhc3NvY2lhdGluZyBhIHNvdXJjZSB2aWV3ZXIgY29uZmlndXJhdGlvbiB0byBhbiBpbnB1dCZhcG9zO3MgY29udGVudCB0eXBlLS0mZ3Q7Ci0gICAgICAmbHQ7c291cmNlVmlld2VyQ29uZmlndXJhdGlvbgotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCZxdW90OwotICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7IS0tIGFzc29jaWF0aW5nIGFuIG91dGxpbmUgY29uZmlndXJhdGlvbiB0byBhbiBpbnB1dCZhcG9zO3MgY29udGVudCB0eXBlIC0tJmd0OwotICAgICAgJmx0O2NvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc3NlLnhtbC51aS52aWV3cy5jb250ZW50b3V0bGluZS5YTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24mcXVvdDsKLSAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sJnF1b3Q7LyZndDsKLSAgICAgICZsdDshLS0gYXNzb2NpYXRpbmcgYSBwcm9wZXJ0eSBzaGVldCBjb25maWd1cmF0aW9uIHRvIG11bHRpcGxlIGNvbnRlbnQgdHlwZXMgLS0mZ3Q7Ci0gICAgICAmbHQ7cHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MucHJvcGVydGllcy5YTUxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiZxdW90OwotICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UuY29udGVudHR5cGUueG1sLCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UsIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UmcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBzZWUgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24mbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5TdHJ1Y3R1cmVkUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24mbHQ7L2NvZGUmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zY2hlbWEvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5icmVha3BvaW50LmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc2NoZW1hL29yZy5lY2xpcHNlLndzdC5zc2UudWkuYnJlYWtwb2ludC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjIxYjUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zY2hlbWEvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5icmVha3BvaW50LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiIGlkPSJicmVha3BvaW50IiBuYW1lPSJCcmVha3BvaW50IFByb3ZpZGVycyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwcm92aWRlZCB0byBhbGxvdyBjbGllbnRzIHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgYWRkaW5nIHRoZWlyIG93biBicmVha3BvaW50IGxpbmUgbWFya2VycyB3aXRoIHRoZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvci4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImJyZWFrcG9pbnRDb250cmlidXRpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InByb3ZpZGVyIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBwcm92aWRlciBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iaWRlbnRpZmllciIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBbiBpbXBsZW1lbnRvciBvZiBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludC5JQnJlYWtwb2ludFByb3ZpZGVyIC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludC5JQnJlYWtwb2ludFByb3ZpZGVyIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRlbnRUeXBlcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGNvbnRlbnQgdHlwZSBJRHMgZm9yIHdoaWNoIHRoaXMgcHJvdmlkZXIgc2hvdWxkIGJlIHVzZWQuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJicmVha3BvaW50Q29udHJpYnV0aW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGNob2ljZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb3ZpZGVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9jaG9pY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBjb250cmlidXRpb24NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImlkZW50aWZpZXIiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBFeGFtcGxlIGRlbW9uc3RyYXRpbmcgaG93IEphdmEgc3RyYXR1bSBicmVha3BvaW50cyBhcmUgY29udHJpYnV0ZWQgd2hlbiBlZGl0aW5nIEpTUHMgYW5kIHRhZyBmaWxlcy4NCi0mbHQ7cHJlJmd0Ow0KLSAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UudWkuYnJlYWtwb2ludCZxdW90OyZndDsNCi0gICZsdDticmVha3BvaW50Q29udHJpYnV0aW9uIGlkPSZxdW90O29yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJvdmlkZXJzJnF1b3Q7Jmd0Ow0KLSAgICZsdDtwcm92aWRlcg0KLSAgICBjb250ZW50VHlwZXM9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSwgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ3NvdXJjZSZxdW90Ow0KLSAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmJyZWFrcG9pbnRwcm92aWRlcnMuSmF2YVN0cmF0dW1CcmVha3BvaW50UHJvdmlkZXImcXVvdDsmZ3Q7DQotICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVycy5KYXZhU3RyYXR1bUJyZWFrcG9pbnRQcm92aWRlciZxdW90Oy8mZ3Q7DQotICAmbHQ7L2JyZWFrcG9pbnRDb250cmlidXRpb24mZ3Q7DQotICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBBIGZ1bGwgaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlIGluIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVycy5KYXZhU3RyYXR1bUJyZWFrcG9pbnRQcm92aWRlcg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc2NoZW1hL29yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbi5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NjaGVtYS9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUwMmViYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc2NoZW1hL29yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbi5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIgaWQ9InNvdXJjZXZhbGlkYXRpb24iIG5hbWU9IlNvdXJjZSBWYWxpZGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHByb3ZpZGVkIHRvIGFsbG93IGNsaWVudHMgdG8gY29udHJpYnV0ZSBhIHZhbGlkYXRvciAoJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yJmx0Oy9jb2RlJmd0OykKLWZvciBhcy15b3UtdHlwZSAoc291cmNlKSB2YWxpZGF0aW9uLiZsdDticiZndDsKLQotSWYgeW91ciB2YWxpZGF0b3IgY2FuIGhhbmRsZSAmcXVvdDtwYXJ0aWFsIGRvY3VtZW50JnF1b3Q7IHZhbGlkYXRpb24sIGl0IHNob3VsZCBhbHNvIGltcGxlbWVudCBJU291cmNlVmFsaWRhdG9yLiAgVGhlIHZhbGlkYXRlIGNhbGwgb24gSVNvdXJjZVZhbGlkYXRvciBnZXRzIHBhc3NlZCBhbiBJUmVnaW9uIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXJ0IG9mIHRoZSBkb2N1bWVudCB0aGF0JmFwb3M7cyBkaXJ0eS4mbHQ7YnImZ3Q7Ci0KLVRoaXMgc2hvdWxkIGJlIG11Y2ggbW9yZSBlZmZpY2llbnQgdGhhbiB2YWxpZGF0aW5nIHRoZSBlbnRpcmUgZmlsZSBlYWNoIHRpbWUgc29tZW9uZSB0eXBlcy4mbHQ7YnImZ3Q7Ci0KLVRoZSB2YWxpZGF0b3IgaXMgZW5hYmxlZCBmb3Igc3BlY2lmaWMgY29udGVudCB0eXBlL3BhcnRpdGlvbiBjb21iaW5hdGlvbnMuJmx0O2JyJmd0OwotCi1SZXF1aXJlZCBwbHVnaW5zIGFyZTombHQ7YnImZ3Q7Ci0gICBvcmcuZWNsaXBzZS53c3Quc3NlLnVpJmx0O2JyJmd0OwotICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InZhbGlkYXRvciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InZhbGlkYXRvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbnRlbnRUeXBlSWRlbnRpZmllciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2NvcGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgRWl0aGVyICZxdW90O3RvdGFsJnF1b3Q7IG9yICZxdW90O3BhcnRpYWwmcXVvdDssIGRlcGVuZGluZyBvbiB3aGV0aGVyIGFsbCBvciBqdXN0IHNvbWUgb2YgdGhlIGRvY3VtZW50IHNob3VsZCBiZSByZXZhbGlkYXRlZCBvbiBjaGFuZ2VzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb25UeXBlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbnRlbnRUeXBlSWRlbnRpZmllciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InBhcnRpdGlvblR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRXhhbXBsZSBkZW1vbnN0cmF0aW5nIGhvdyBIVE1MVmFsaWRhdG9yIGNvbnRyaWJ1dGVzIHRvIGFzLXlvdS10eXBlIHZhbGlkYXRpb24gaW4gdGhlIHNvdXJjZSBlZGl0b3IuCi0KLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbnMuc291cmNldmFsaWRhdGlvbiZxdW90OyZndDsKLSAgICAgICZsdDt2YWxpZGF0b3IKLSAgICAgICAgICAgIHNjb3BlPSZxdW90O3RvdGFsJnF1b3Q7Ci0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5odG1sLkhUTUxWYWxpZGF0b3ImcXVvdDsKLSAgICAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmh0bWxzb3VyY2V2YWxpZGF0b3ImcXVvdDsmZ3Q7Ci0gICAgICAgICAmbHQ7Y29udGVudFR5cGVJZGVudGlmaWVyCi0gICAgICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAmbHQ7cGFydGl0aW9uVHlwZQotICAgICAgICAgICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUZBVUxUJnF1b3Q7LyZndDsKLSAgICAgICAgICZsdDsvY29udGVudFR5cGVJZGVudGlmaWVyJmd0OwotICAgICAgICAgJmx0O2NvbnRlbnRUeXBlSWRlbnRpZmllcgotICAgICAgICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSZxdW90OyZndDsKLSAgICAgICAgICAgICZsdDtwYXJ0aXRpb25UeXBlCi0gICAgICAgICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQmcXVvdDsvJmd0OwotICAgICAgICAgJmx0Oy9jb250ZW50VHlwZUlkZW50aWZpZXImZ3Q7Ci0gICAgICAmbHQ7L3ZhbGlkYXRvciZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7cCZndDsKLVVzaW5nIElTb3VyY2VWYWxpZGF0b3IKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotSWYgeW91ciB2YWxpZGF0b3IgY2FuIGhhbmRsZSAmcXVvdDtwYXJ0aWFsIGRvY3VtZW50JnF1b3Q7IHZhbGlkYXRpb24sIGl0IHNob3VsZCAgaW1wbGVtZW50IElTb3VyY2VWYWxpZGF0b3IuICAKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotVGhlIHZhbGlkYXRlIGNhbGwgb24gSVNvdXJjZVZhbGlkYXRvciBnZXRzIHBhc3NlZCBhbiBJUmVnaW9uIG9mIHRoZSBkb2N1bWVudCB3aGljaCByZXByZXNlbnRzIGp1c3QgdGhlIHBhcnQgdGhhdCZhcG9zO3MgZGlydHkuICBUaGlzIHNob3VsZCBiZSBtdWNoIG1vcmUgZWZmaWNpZW50IHRoYW4gdmFsaWRhdGluZyB0aGUgZW50aXJlIGZpbGUgZWFjaCB0aW1lIHNvbWVvbmUgdHlwZXMuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLUlTb3VyY2VWYWxpZGF0b3IgaGFzIGl0cyAmcXVvdDtjb25uZWN0KElEb2N1bWVudCBkb2MpJnF1b3Q7IG1ldGhvZCBjYWxsZWQgd2hlbiBpdCZhcG9zO3MgaG9va2VkIHVwIHRvIHRoZSBkb2N1bWVudCAod2hlbiB0aGUgZWRpdG9yIGlzIG9wZW5lZCksIGFuZCAmcXVvdDtkaXNjb25uZWN0KElEb2N1bWVudCBkb2MpJnF1b3Q7IGNhbGxlZCB3aGVuIHRoZSBlZGl0b3IgaXMgY2xvc2VkLCB3aGVyZSBhbnkgJnF1b3Q7dW5ob29raW5nJnF1b3Q7IHNob3VsZCB0YWtlIHBsYWNlLgotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEN1cnJlbnRseSB0aGVyZSBpcyBubyBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBmb3IgSVZhbGlkYXRvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NjaGVtYS9xdWlja0ZpeFByb2Nlc3Nvci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NjaGVtYS9xdWlja0ZpeFByb2Nlc3Nvci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODg3MTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zY2hlbWEvcXVpY2tGaXhQcm9jZXNzb3IuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiIGlkPSJxdWlja0ZpeFByb2Nlc3NvciIgbmFtZT0iUXVpY2sgRml4IFByb2Nlc3NvciIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBhIHF1aWNrIGFzc2lzdCBwcm9jZXNzb3IgaW4gU3RydWN0dXJlZCBUZXh0IEVkaXRvcnMgd2l0aCBhIHNwZWNpZmljICZxdW90O2tpbmQmcXVvdDsgb2YgcHJvYmxlbSAoYSBtYXJrZXIgb3IgYW5ub3RhdGlvbiBvZiBhIGNlcnRhaW4gdHlwZSBvciBoYXZpbmcgY2VydGFpbiBhdHRyaWJ1dGUgdmFsdWVzKS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icXVpY2tGaXhQcm9jZXNzb3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InF1aWNrRml4UHJvY2Vzc29yIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYXR0cmlidXRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9ibGVtVHlwZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgcHJvYmxlbSB0eXBlIGZvciB3aGljaCB0aGlzIHF1aWNrIGZpeCBwcm9jZXNzb3IgYXBwbGllcyB0by4gIFRvIHNldCB0aGUgcHJvYmxlbSB0eXBlIGZvciBhbiBhbm5vdGF0aW9uIG9yIG1hcmtlciwgY3JlYXRlIGEgJnF1b3Q7cHJvYmxlbVR5cGUmcXVvdDsgYXR0cmlidXRlIGZvciB0aGUgYW5ub3RhdGlvbi9tYXJrZXIgYW5kIHNldCBhIHZhbHVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpbXBsZW1lbnRpbmcgSVF1aWNrQXNzaXN0UHJvY2Vzc29yCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RQcm9jZXNzb3IiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHdob3NlIHZhbHVlIGlzIGJlaW5nIHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDMuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YnIgLyZndDsKLSZhbXA7bHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UudWkucXVpY2tGaXhQcm9jZXNzb3ImcXVvdDsmYW1wO2d0OyZsdDticiAvJmd0OwotJmFtcDtuYnNwOyZhbXA7bmJzcDsmYW1wO25ic3A7JmFtcDtsdDtxdWlja0ZpeFByb2Nlc3NvciZsdDticiAvJmd0OwotJmFtcDtuYnNwOyZhbXA7bmJzcDsmYW1wO25ic3A7JmFtcDtuYnNwOyZhbXA7bmJzcDsmYW1wO25ic3A7Y2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leGFtcGxlcy5xdWlja2ZpeGVzLkV4YW1wbGVRdWlja0Fzc2lzdFByb2Nlc3NvciZxdW90OyZsdDticiAvJmd0OwotJmFtcDtuYnNwOyZhbXA7bmJzcDsmYW1wO25ic3A7JmFtcDtuYnNwOyZhbXA7bmJzcDsmYW1wO25ic3A7cHJvYmxlbVR5cGU9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leGFtcGxlcy5xdWlja2ZpeGVzLnByb2JsZW0mcXVvdDsmYW1wO2d0OyZsdDticiAvJmd0OwotJmFtcDtuYnNwOyZhbXA7bmJzcDsmYW1wO25ic3A7JmFtcDtuYnNwOyZhbXA7bmJzcDsmYW1wO25ic3A7JmFtcDtsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDthbkF0dHJpYnV0ZUtleSZxdW90OyB2YWx1ZT0mcXVvdDthdHRyaWJ1dGUgdmFsdWUmcXVvdDsvJmFtcDtndDsmbHQ7YnIgLyZndDsKLSZhbXA7bmJzcDsmYW1wO25ic3A7JmFtcDtuYnNwOyZhbXA7bHQ7L3F1aWNrRml4UHJvY2Vzc29yJmFtcDtndDsmbHQ7YnIgLyZndDsKLSAmYW1wO2x0Oy9leHRlbnNpb24mYW1wO2d0OyZsdDticiAvJmd0OwotCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc2NoZW1hL3NlbWFudGljSGlnaGxpZ2h0aW5nLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc2NoZW1hL3NlbWFudGljSGlnaGxpZ2h0aW5nLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNGE4NDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NjaGVtYS9zZW1hbnRpY0hpZ2hsaWdodGluZy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIgaWQ9InNlbWFudGljSGlnaGxpZ2h0aW5nIiBuYW1lPSJTZW1hbnRpYyBIaWdobGlnaHRpbmciLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIFNlbWFudGljIEhpZ2hsaWdodGluZyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIHBsdWctaW5zIHRvIGNvbnRyaWJ1dGUgcnVsZXMgdG8gdGhlIFN0cnVjdHVyZWQgU291cmNlIEVkaXRvciZhcG9zO3Mgc2VtYW50aWMgaGlnaGxpZ2h0aW5nIGZyYW1ld29yay4gU2VtYW50aWMgaGlnaGxpZ2h0aW5nIGlzIHBlcmZvcm1lZCBhcyBhIHNlY29uZCBwYXNzIGFmdGVyIHN5bnRheCBoaWdobGlnaHRpbmcuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJoaWdobGlnaHRpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iaGlnaGxpZ2h0aW5nIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgc3RyaW5nIGRlZmluaW5nIHdoZW4gdG8gdXNlIHRoaXMgZXh0ZW5zaW9uLiAgSXQgaXMgdGhlIGNvbnRlbnQgdHlwZSBpZC4gIE11bHRpcGxlIHRhcmdldHMgbWF5IGJlIGdpdmVuIGFzIGEgY29tbWEgZGVsaW1pdGVkIHZhbHVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIE11c3QgaW1wbGVtZW50IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuSVNlbWFudGljSGlnaGxpZ2h0aW5nIHRvIHByb3ZpZGUgYmFzaWMgc2VtYW50aWMgaGlnaGxpZ2h0aW5nIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLndzdC5zc2UudWkuSVNlbWFudGljSGlnaGxpZ2h0aW5nIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3R5bGVTdHJpbmdLZXkiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHByZWZlcmVuY2Uga2V5IHRoYXQgY29udHJvbHMgdGhlIHN0eWxlIG9mIHRoZSBzZW1hbnRpYyBoaWdobGlnaHRpbmcuIFRoZSBzdHlsZSZhcG9zO3MgdmFsdWUgc2hvdWxkIGJlIGluIHRoZSBmb3JtOiBSR0IgZm9yZWdyb3VuZCAoI3JyZ2diYikgfCBSR0IgYmFja2dyb3VuZCAoI3JyZ2diYikgfCBib2xkICh0cnVlL2ZhbHNlKSB8IGl0YWxpYyAodHJ1ZS9mYWxzZSkgfCBzdHJpa2V0aHJvdWdoICh0cnVlL2ZhbHNlKSB8IHVuZGVybGluZSAodHJ1ZS9mYWxzZSkKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMy4xCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgc2VtYW50aWMgaGlnaGxpZ2h0aW5nIHRoYXQgaXMgZWZmZWN0aXZlIG9uIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwgYW5kIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UgY29udGVudCB0eXBlcy4gVGhlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuTmFtZXNwYWNlSGlnaGxpZ2h0aW5nJmx0Oy9jb2RlJmd0OyBkZXRlcm1pbmVzIHRoZSBjb25zdW1hYmxlIHJlZ2lvbnMgb2YgdGhlIGRvY3VtZW50LgotJmx0O3ByZSZndDsKLSAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VtYW50aWNIaWdobGlnaHRpbmcmcXVvdDsmZ3Q7Ci0gICZsdDtoaWdobGlnaHRpbmcKLSAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5OYW1lc3BhY2VIaWdobGlnaHRpbmcmcXVvdDsKLSAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwsIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UmcXVvdDsmZ3Q7Ci0gICZsdDsvaGlnaGxpZ2h0aW5nJmd0OwotICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgU2VlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zc2UudWkuSVNlbWFudGljSGlnaGxpZ2h0aW5nJmx0Oy9jb2RlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lbmNvZGluZy91aS9FbmNvZGluZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZW5jb2RpbmcvdWkvRW5jb2RpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGU0MTYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lbmNvZGluZy91aS9FbmNvZGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZW5jb2RpbmcudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5Db2RlZFJlc291cmNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIHRoaXMgc2hvdWxkIG5vdCBiZSBoYW5kbGVkIGJ5IHRoZSBwbGF0Zm9ybSBhbmQgbm90IFdUUAotICovCi0KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCUJ1dHRvbiBmVXNlM0J5dGVCT01XaXRoVVRGOENoZWNrQm94ID0gbnVsbDsKLQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyB8IFNXVC5MRUZUIHwgU1dULldSQVApOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0KLQkJYm9vbGVhbiBzZWxlY3Rpb24gPSBDb2RlZFJlc291cmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuVVNFXzNCWVRFX0JPTV9XSVRIX1VURjgpOwotCQlidXR0b24uc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0KLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQkvL0dyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gU1NFVUlNZXNzYWdlcy5FbmNvZGluZ1ByZWZlcmVuY2VQYWdlXzA7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIElTU1VFOiB0aGUgZm9sbG93aW5nIHRvIGxpbmVzIGxvb2sgcmVkdW5kYW50LCAKLQkJLy8gbm90IHN1cmUgd2hhdCB3YXMgdHJ5aW5nIHRvIGJlIGFjY29tcGxpc2hlZC4gCi0JCS8vIE1heSBiZSBkZWFkIGNvZGUuIAotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIGRlc2NyaXB0aW9uKTsKLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgY2hlY2tCb3hMYWJlbCA9IFNTRVVJTWVzc2FnZXMuRW5jb2RpbmdQcmVmZXJlbmNlUGFnZV8xOyAvLyROT04tTkxTLTEkCi0JCWZVc2UzQnl0ZUJPTVdpdGhVVEY4Q2hlY2tCb3ggPSBjcmVhdGVDaGVja0JveChjb21wb3NpdGUsIGNoZWNrQm94TGFiZWwpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJYm9vbGVhbiBkZWZhdWx0U2VsZWN0aW9uID0gQ29kZWRSZXNvdXJjZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5VU0VfM0JZVEVfQk9NX1dJVEhfVVRGOCk7Ci0JCWZVc2UzQnl0ZUJPTVdpdGhVVEY4Q2hlY2tCb3guc2V0U2VsZWN0aW9uKGRlZmF1bHRTZWxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJQ29kZWRSZXNvdXJjZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5VU0VfM0JZVEVfQk9NX1dJVEhfVVRGOCwgZlVzZTNCeXRlQk9NV2l0aFVURjhDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCUNvZGVkUmVzb3VyY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9Db25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYThhZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9Db25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yU2l0ZTsKLQotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Qb2ludENhbGN1bGF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0lHTiA9ICIuZGVzaWduIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRSA9ICIuc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKElFZGl0b3JQYXJ0IHBhcnQsIFN0cmluZyBjb250ZW50VHlwZSwgU3RyaW5nIHN1YkNvbnRleHQsIENsYXNzIHJvb3RDbGFzcykgewotCQlDb25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yIGNhbGN1bGF0b3IgPSBuZXcgQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvcigpOwotCQljYWxjdWxhdG9yLnNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKLQkJY2FsY3VsYXRvci5zZXRQYXJ0KHBhcnQpOwotCQljYWxjdWxhdG9yLnNldFJvb3RDbGFzcyhyb290Q2xhc3MpOwotCQljYWxjdWxhdG9yLnNldFN1YkNvbnRleHQoc3ViQ29udGV4dCk7Ci0JCXJldHVybiBjYWxjdWxhdG9yLmdldENvbmZpZ3VyYXRpb25Qb2ludHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZDb250ZW50VHlwZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElXb3JrYmVuY2hQYXJ0IGZQYXJ0ID0gbnVsbDsKLQotCXByb3RlY3RlZCBDbGFzcyBmUm9vdENsYXNzID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZTdWJDb250ZXh0ID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCkgewotCQlMaXN0IHBvaW50cyA9IG5ldyBBcnJheUxpc3QoMik7Ci0KLQkJSVdvcmtiZW5jaFBhcnRTaXRlIHNpdGUgPSBudWxsOwotCQlpZiAoZlBhcnQgIT0gbnVsbCkgewotCQkJc2l0ZSA9IGZQYXJ0LmdldFNpdGUoKTsKLQkJCVN0cmluZyBpZCA9IHNpdGUuZ2V0SWQoKTsKLQkJCWlmIChpZCAhPSBudWxsICYmIGlkLmxlbmd0aCgpID4gMCAmJiAhaWQuZXF1YWxzKGZSb290Q2xhc3MuZ2V0TmFtZSgpKSkKLQkJCQlwb2ludHMuYWRkKGlkKTsKLQkJCWlmIChzaXRlIGluc3RhbmNlb2YgTXVsdGlQYWdlRWRpdG9yU2l0ZSkgewotCQkJCVN0cmluZyBtdWx0aXBhZ2VJRCA9ICgoTXVsdGlQYWdlRWRpdG9yU2l0ZSkgc2l0ZSkuZ2V0TXVsdGlQYWdlRWRpdG9yKCkuZ2V0U2l0ZSgpLmdldElkKCk7Ci0JCQkJaWYgKCFwb2ludHMuY29udGFpbnMobXVsdGlwYWdlSUQpKQotCQkJCQlwb2ludHMuYWRkKG11bHRpcGFnZUlEKTsKLQkJCQlTdHJpbmcgc291cmNlUGFnZUlEID0gKChNdWx0aVBhZ2VFZGl0b3JTaXRlKSBzaXRlKS5nZXRNdWx0aVBhZ2VFZGl0b3IoKS5nZXRTaXRlKCkuZ2V0SWQoKSArICIuc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICghcG9pbnRzLmNvbnRhaW5zKHNvdXJjZVBhZ2VJRCkpCi0JCQkJCXBvaW50cy5hZGQoc291cmNlUGFnZUlEKTsKLQkJCX0KLQkJCWlmIChzaXRlIGluc3RhbmNlb2YgTXVsdGlQYWdlRWRpdG9yU2l0ZSkgewotCQkJCVN0cmluZyBtdWx0aXBhZ2VDbGFzc05hbWUgPSAoKE11bHRpUGFnZUVkaXRvclNpdGUpIHNpdGUpLmdldE11bHRpUGFnZUVkaXRvcigpLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCWlmICghcG9pbnRzLmNvbnRhaW5zKG11bHRpcGFnZUNsYXNzTmFtZSkpCi0JCQkJCXBvaW50cy5hZGQobXVsdGlwYWdlQ2xhc3NOYW1lKTsKLQkJCX0KLQkJCUNsYXNzIGVkaXRvckNsYXNzID0gZlBhcnQuZ2V0Q2xhc3MoKTsKLQkJCXdoaWxlIChlZGl0b3JDbGFzcyAhPSBudWxsICYmIGZSb290Q2xhc3MgIT0gbnVsbCAmJiAhZWRpdG9yQ2xhc3MuZXF1YWxzKGZSb290Q2xhc3MpKSB7Ci0JCQkJaWYgKCFwb2ludHMuY29udGFpbnMoZWRpdG9yQ2xhc3MuZ2V0TmFtZSgpKSkKLQkJCQkJcG9pbnRzLmFkZChlZGl0b3JDbGFzcy5nZXROYW1lKCkpOwotCQkJCWVkaXRvckNsYXNzID0gZWRpdG9yQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGZDb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShmQ29udGVudFR5cGUpOwotCQkJd2hpbGUgKGNvbnRlbnRUeXBlICE9IG51bGwgJiYgIWNvbnRlbnRUeXBlLmdldElkKCkuZXF1YWxzKElDb250ZW50VHlwZU1hbmFnZXIuQ1RfVEVYVCkpIHsKLQkJCQlpZiAoIXBvaW50cy5jb250YWlucyhjb250ZW50VHlwZS5nZXRJZCgpKSkKLQkJCQkJcG9pbnRzLmFkZChjb250ZW50VHlwZS5nZXRJZCgpKTsKLQkJCQljb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLmdldEJhc2VUeXBlKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZlJvb3RDbGFzcyAhPSBudWxsICYmICFwb2ludHMuY29udGFpbnMoZlJvb3RDbGFzcy5nZXROYW1lKCkpKQotCQkJcG9pbnRzLmFkZChmUm9vdENsYXNzLmdldE5hbWUoKSk7Ci0JCXJldHVybiAoU3RyaW5nW10pIHBvaW50cy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29udGVudFR5cGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIGZDb250ZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcnQuCi0JICovCi0JcHVibGljIElXb3JrYmVuY2hQYXJ0IGdldFBhcnQoKSB7Ci0JCXJldHVybiBmUGFydDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJvb3RDbGFzcy4KLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0Um9vdENsYXNzKCkgewotCQlyZXR1cm4gZlJvb3RDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN1YkNvbnRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdWJDb250ZXh0KCkgewotCQlyZXR1cm4gZlN1YkNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogICAgICAgICAgICBUaGUgY29udGVudFR5cGUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgewotCQlmQ29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFydAotCSAqICAgICAgICAgICAgVGhlIHBhcnQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlmUGFydCA9IHBhcnQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJvb3RDbGFzcwotCSAqICAgICAgICAgICAgVGhlIHJvb3RDbGFzcyB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9vdENsYXNzKENsYXNzIHJvb3RDbGFzcykgewotCQlmUm9vdENsYXNzID0gcm9vdENsYXNzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdWJDb250ZXh0Ci0JICogICAgICAgICAgICBUaGUgc3ViQ29udGV4dCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3ViQ29udGV4dChTdHJpbmcgc3ViQ29udGV4dCkgewotCQlmU3ViQ29udGV4dCA9IHN1YkNvbnRleHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL0lTZWxmVmFsaWRhdGVFZGl0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL0lTZWxmVmFsaWRhdGVFZGl0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZGFjMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9JU2VsZlZhbGlkYXRlRWRpdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9uczsKLQotCi0KLS8qKgotICogVGhpcyBpcyBhIG1hcmtlciBpbnRlcmZhY2UgdG8gY29udHJvbCBWYWxpZGF0ZUVkaXQgY2FsbCBVc3VhbGx5IGZyYW1ld29yawotICogY2FsbHMgSUV4dGVuZGVkU2ltcGxlRWRpdG9yI3ZhbGlkYXRlRWRpdCgpIGJlZm9yZSBjYWxsaW5nCi0gKiBJRXh0ZW5kZWRFZGl0b3JBY3Rpb24ncyBydW4oKSBtZXRob2QuIEhvd2V2ZXIsIGlmIHRoZSBhY3Rpb24gaW1wbGVtZW50cwotICogdGhpcyBpbnRlcmZhY2UsIGZyYW1ld29yayB3b24ndCBjYWxsIHZhbGlkYXRlRWRpdCgpIG1ldGhvZC4KLSAqIAotICogVGhlIGFjdGlvbiBzaG91bGQgY2FsbCB2YWxpZGF0ZUVkaXQoKSBhdCB0aGVpciBvd24gYXBwcm9wcmlhdGUgdGltaW5nLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZWxmVmFsaWRhdGVFZGl0QWN0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9JU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9JU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjBhOTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gcHJvdmlkZSBjb252ZW5pZW50IGZ1bmN0aW9ucyBmb3IgZWRpdG9ycyB0aGF0IG1heSBub3QgYmUKLSAqIElUZXh0RWRpdG9ycywgYnV0IG5lZWQgdG8gZXhwb3NlIHByb3BlcnRpZXMgdXN1YWxseSBmb3VuZCBpbiB0ZXh0IGVkaXRvcnMKLSAqLwotcHVibGljIGludGVyZmFjZSBJU291cmNlRWRpdGluZ1RleHRUb29scyB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCBvZmZzZXQgYXQgd2hpY2ggdGhlIENhcmV0IGlzIGxvY2F0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldENhcmV0T2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBJRG9jdW1lbnQgYmVpbmcgZWRpdGVkLiBJZiB0aGlzIGVkaXRvciBzdXBwb3J0cyBtdWx0aXBsZQotCSAqICAgICAgICAgZG9jdW1lbnRzLCB0aGUgZG9jdW1lbnQgY3VycmVudGx5IHBvc3Nlc3NpbmcgdGhlIGNhcmV0IHdpbGwgYmUKLQkgKiAgICAgICAgIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gVGhlIElFZGl0b3JQYXJ0IGluc3RhbmNlIGZvciB0aGlzIGVkaXRvciB0aGF0IGlzIGtub3duIHRvIHRoZQotCSAqICAgICAgICAgd29ya2JlbmNoLgotCSAqLwotCXB1YmxpYyBJRWRpdG9yUGFydCBnZXRFZGl0b3JQYXJ0KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNlbGVjdGlvbiB3aXRoaW4gdGhlIGVkaXRvci4gSW1wbGVtZW50b3JzIG1heQotCSAqICAgICAgICAgc3VwcG9ydCBvdGhlciB0eXBlcyBvZiBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIElUZXh0U2VsZWN0aW9uIGdldFNlbGVjdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9icmVha3BvaW50L0lCcmVha3BvaW50Q29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvSUJyZWFrcG9pbnRDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2YzlhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvSUJyZWFrcG9pbnRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludDsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCcmVha3BvaW50Q29uc3RhbnRzIHsKLQlTdHJpbmcgQVRUUl9ISURERU4gPSAiaGlkZGVuIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFNldHRlcnMgb2YgdGhpcyBhdHRyaWJ1dGUgc2hvdWxkIHVzZSAnLydmb3Igc2VnbWVudCBzZXBhcmF0b3JzIHdoZW4KLQkgKiByZXByZXNlbnRpbmcgcGF0aHMuCi0JICovCi0JU3RyaW5nIFJFU09VUkNFX1BBVEggPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb25zLmJyZWFrcG9pbnQucGF0aCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9JQnJlYWtwb2ludFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvSUJyZWFrcG9pbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTBjZGYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9JQnJlYWtwb2ludFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5JU291cmNlRWRpdGluZ1RleHRUb29sczsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gcHJvdmlkZSBicmVha3BvaW50IGNyZWF0aW9uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJyZWFrcG9pbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBBZGRzIGJyZWFrcG9pbnQgdG8gc3BlY2lmaWVkIHBvc2l0aW9uCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICBJRG9jdW1lbnQgb2JqZWN0Ci0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICBjdXJyZW50IGVkaXRvciBpbnB1dCwgbm90IG5lY2Vzc2FyaWx5IGFuIElGaWxlRWRpdG9ySW5wdXQgb3IKLQkgKiAgICAgICAgICAgIGxpbmtlZCB0byBhIHJlc291cmNlIGluIGFueSB3YXkKLQkgKiBAcGFyYW0gbGluZU51bWJlcgotCSAqICAgICAgICAgICAgY3VycmVudCBsaW5lIG51bWJlcgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGN1cnJlbnQgY2FyZXQgb2Zmc2V0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHJldHVybiBJU3RhdHVzIHRoZSBzdGF0dXMgYWZ0ZXIgYmVpbmcgYXNrZWQgdG8gYWRkIGEgYnJlYWtwb2ludC4gVGhlCi0JICogICAgICAgICBTZXZlcml0eSBvZiBFUlJPUiBzaG91bGQgb25seSBiZSB1c2VkIGlmIHRoZSBsb2NhdGlvbgotCSAqICAgICAgICAgaW5mb3JtYXRpb24gaXMgYm90aCB2YWxpZCBmb3IgYSBicmVha3BvaW50IGFuZCBvbmUgY291bGQgbm90IGJlCi0JICogICAgICAgICBhZGRlZC4gIEFueSBzZXZlcml0eSBncmVhdGVyIHRoYW4gSU5GTyB3aWxsIGJlIGxvZ2dlZCwgYW5kIGlmCi0JICogICAgICAgICBubyBicmVha3BvaW50cyB3ZXJlIGNyZWF0ZWQsIHNob3duIHRvIHRoZSB1c2VyLgotCSAqLwotCUlTdGF0dXMgYWRkQnJlYWtwb2ludChJRG9jdW1lbnQgZG9jdW1lbnQsIElFZGl0b3JJbnB1dCBpbnB1dCwgaW50IGxpbmVOdW1iZXIsIGludCBvZmZzZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyBjb3JyZXNwb25kaW5nIHJlc291cmNlIGZyb20gZWRpdG9yIGlucHV0Ci0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHJldHVybiBJUmVzb3VyY2UKLQkgKi8KLQlJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSUVkaXRvcklucHV0IGlucHV0KTsKLQotCS8qKgotCSAqIFNldCBJU291cmNlRWRpdGluZ1RleHRUb29scyBvYmplY3QKLQkgKiAKLQkgKiBAcGFyYW0gdG9vbAotCSAqICAgICAgICAgICAgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgb2JqZWN0Ci0JICovCi0Jdm9pZCBzZXRTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIHRvb2wpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9icmVha3BvaW50L0lFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9icmVha3BvaW50L0lFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTVkN2Y1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9JRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRWxlbWVudFN0YXRlTGlzdGVuZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0IGV4dGVuZHMgSVN0b3JhZ2VFZGl0b3JJbnB1dCB7Ci0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gZWxlbWVudCBzdGF0ZSBsaXN0ZW5lciB0byB0aGlzIGlucHV0LiBIYXMgbm8gZWZmZWN0IGlmCi0JICogYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4gVHlwaWNhbGx5IHVzZWQgYnkgdGhlCi0JICogSURvY3VtZW50UHJvdmlkZXIgdG8gcmVnaXN0ZXIgaXRzZWxmIGZvciBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyCi0JICovCi0Jdm9pZCBhZGRFbGVtZW50U3RhdGVMaXN0ZW5lcihJRWxlbWVudFN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gZWxlbWVudCBzdGF0ZSBsaXN0ZW5lciBmcm9tIHRoaXMgaW5wdXQuIEhhcyBubyBhZmZlY3QKLQkgKiBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIKLQkgKi8KLQl2b2lkIHJlbW92ZUVsZW1lbnRTdGF0ZUxpc3RlbmVyKElFbGVtZW50U3RhdGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvTm9kZUxvY2F0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvTm9kZUxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMzRjNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9icmVha3BvaW50L05vZGVMb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTm9kZUxvY2F0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBlbmQgb2Zmc2V0IG9mIHRoZSBlbmQgdGFnLCAtMSBvZiB0aGVyZSBpcyBubyBlbmQKLQkgKiB0YWcKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JaW50IGdldEVuZFRhZ0VuZE9mZnNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG9jdW1lbnQgc3RhcnQgb2Zmc2V0IG9mIHRoZSBlbmQgdGFnLCAtMSBvZiB0aGVyZSBpcyBubyBlbmQKLQkgKiB0YWcKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JaW50IGdldEVuZFRhZ1N0YXJ0T2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBlbmQgb2Zmc2V0IG9mIHRoZSBzdGFydCB0YWcsIC0xIG9mIHRoZXJlIGlzIG5vCi0JICogc3RhcnQgdGFnCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWludCBnZXRTdGFydFRhZ0VuZE9mZnNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG9jdW1lbnQgc3RhcnQgb2Zmc2V0IG9mIHRoZSBzdGFydCB0YWcsIC0xIG9mIHRoZXJlIGlzIG5vCi0JICogc3RhcnQgdGFnCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWludCBnZXRTdGFydFRhZ1N0YXJ0T2Zmc2V0KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvTnVsbFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9OdWxsU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTI2ZmE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9OdWxsU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgTnVsbFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgaW1wbGVtZW50cyBJU291cmNlRWRpdGluZ1RleHRUb29scyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAic291cmNlZWRpdGluZ3RleHR0b29scyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElUZXh0RWRpdG9yIGZUZXh0RWRpdG9yOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IE51bGxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKCk7Ci0JfQotCi0JcHJpdmF0ZSBOdWxsU291cmNlRWRpdGluZ1RleHRUb29scygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENhcmV0T2Zmc2V0KCkgewotCQlJU2VsZWN0aW9uIHNlbCA9IGZUZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWwgaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJcmV0dXJuICgoSVRleHRTZWxlY3Rpb24pIHNlbCkuZ2V0T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JfQotCi0JcHVibGljIElFZGl0b3JQYXJ0IGdldEVkaXRvclBhcnQoKSB7Ci0JCXJldHVybiBmVGV4dEVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgSVRleHRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlpZiAoZlRleHRFZGl0b3IgIT0gbnVsbCkKLQkJCXJldHVybiAoSVRleHRTZWxlY3Rpb24pIGZUZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCXJldHVybiBUZXh0U2VsZWN0aW9uLmVtcHR5U2VsZWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dEVkaXRvcihJVGV4dEVkaXRvciBlZGl0b3IpIHsKLQkJZlRleHRFZGl0b3IgPSBlZGl0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0V4Y2x1c2lvbnNUYWIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9FeGNsdXNpb25zVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NjhmMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0V4Y2x1c2lvbnNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3MuRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlRhc2tUYWdQcmVmZXJlbmNlS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5Tb3J0ZXI7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi1jbGFzcyBFeGNsdXNpb25zVGFiIGltcGxlbWVudHMgSVByZWZlcmVuY2VUYWIgewotCXByaXZhdGUgY2xhc3MgQXJyYXlUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgQXJyYXlUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgT2JqZWN0W10pCi0JCQkJcmV0dXJuIGZDb250ZW50VHlwZVNvcnRlci5zb3J0KChPYmplY3RbXSkgcGFyZW50RWxlbWVudCk7Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDb250ZW50VHlwZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IG8gPSBlbGVtZW50OwotCQkJCWlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCW8gPSBmQ29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKG8udG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJCWlmIChvIGluc3RhbmNlb2YgSUNvbnRlbnRUeXBlKSB7Ci0JCQkJCXJldHVybiAoKElDb250ZW50VHlwZSkgbykuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBRdWlja1NvcnRlciB0aGF0IHNvcnRzIGFuZCByZXR1cm5zIGEgSUNvbnRlbnRUeXBlLXR5cGVkIGFycmF5Ci0JICovCi0JcHJpdmF0ZSBjbGFzcyBDb250ZW50VHlwZVNvcnRlciBleHRlbmRzIFNvcnRlciB7Ci0JCXByaXZhdGUgQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuRU5HTElTSCk7Ci0KLQkJcHVibGljIGJvb2xlYW4gY29tcGFyZShPYmplY3QgZWxlbWVudE9uZSwgT2JqZWN0IGVsZW1lbnRUd28pIHsKLQkJCXJldHVybiAoY29sbGF0b3IuY29tcGFyZSgoKElDb250ZW50VHlwZSkgZWxlbWVudE9uZSkuZ2V0TmFtZSgpLCAoKElDb250ZW50VHlwZSkgZWxlbWVudFR3bykuZ2V0TmFtZSgpKSkgPCAwOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIHNvcnQoT2JqZWN0W10gdW5Tb3J0ZWRDb2xsZWN0aW9uKSB7Ci0JCQlPYmplY3RbXSB0eXBlcyA9IHN1cGVyLnNvcnQodW5Tb3J0ZWRDb2xsZWN0aW9uKTsKLQkJCUlDb250ZW50VHlwZVtdIHNvcnRlZFR5cGVzID0gbmV3IElDb250ZW50VHlwZVt0eXBlcy5sZW5ndGhdOwotCQkJaWYgKHR5cGVzLmxlbmd0aCA+IDApIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHR5cGVzLCAwLCBzb3J0ZWRUeXBlcywgMCwgc29ydGVkVHlwZXMubGVuZ3RoKTsKLQkJCX0KLQkJCXJldHVybiBzb3J0ZWRUeXBlczsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgQ29udGVudFR5cGVUcmVlUHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyBDb250ZW50VHlwZVRyZWVQcm92aWRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9Ci0KLQkJYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGxlZnQsIE9iamVjdCByaWdodCkgewotCQkJcmV0dXJuIGxlZnQgPT0gbnVsbCA/IHJpZ2h0ID09IG51bGwgOiAoKHJpZ2h0ICE9IG51bGwpICYmIGxlZnQuZXF1YWxzKHJpZ2h0KSk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLQkJCQlyZXR1cm4gKE9iamVjdFtdKSBwYXJlbnRFbGVtZW50OwotCQkJfQotCQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGVudFR5cGUpIHsKLQkJCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJCQlJQ29udGVudFR5cGVbXSBhbGxUeXBlcyA9IGZDb250ZW50VHlwZU1hbmFnZXIuZ2V0QWxsQ29udGVudFR5cGVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIWZTdXBwb3J0ZWRDb250ZW50VHlwZXMuY29udGFpbnMoYWxsVHlwZXNbaV0pICYmIGVxdWFscyhhbGxUeXBlc1tpXS5nZXRCYXNlVHlwZSgpLCBwYXJlbnRFbGVtZW50KSkgewotCQkJCQkJZWxlbWVudHMuYWRkKGFsbFR5cGVzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZkNvbnRlbnRUeXBlU29ydGVyLnNvcnQoZWxlbWVudHMudG9BcnJheSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCU9iamVjdCBwYXJlbnQgPSBudWxsOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGVudFR5cGUpIHsKLQkJCQlwYXJlbnQgPSAoKElDb250ZW50VHlwZSkgZWxlbWVudCkuZ2V0QmFzZVR5cGUoKTsKLQkJCX0KLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgUXVpY2tTb3J0ZXIgdGhhdCBzb3J0cyBhbmQgcmV0dXJucyBhIFN0cmluZy10eXBlZCBhcnJheQotCSAqLwotCXByaXZhdGUgY2xhc3MgU3RyaW5nU29ydGVyIGV4dGVuZHMgU29ydGVyIHsKLQkJQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuRU5HTElTSCk7Ci0KLQkJcHVibGljIGJvb2xlYW4gY29tcGFyZShPYmplY3QgZWxlbWVudE9uZSwgT2JqZWN0IGVsZW1lbnRUd28pIHsKLQkJCXJldHVybiAoY29sbGF0b3IuY29tcGFyZShlbGVtZW50T25lLnRvU3RyaW5nKCksIGVsZW1lbnRUd28udG9TdHJpbmcoKSkgPCAwKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBzb3J0KE9iamVjdFtdIHVuU29ydGVkQ29sbGVjdGlvbikgewotCQkJT2JqZWN0W10gc29ydGVkQ29sbGVjdGlvbiA9IHN1cGVyLnNvcnQodW5Tb3J0ZWRDb2xsZWN0aW9uKTsKLQkJCVN0cmluZ1tdIHN0cmluZ3MgPSBuZXcgU3RyaW5nW3NvcnRlZENvbGxlY3Rpb24ubGVuZ3RoXTsKLQkJCS8vIGNvcHkgdGhlIGFycmF5IHNvIGNhbiByZXR1cm4gYSBuZXcgc29ydGVkIGNvbGxlY3Rpb24KLQkJCWlmIChzdHJpbmdzLmxlbmd0aCA+IDApIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHNvcnRlZENvbGxlY3Rpb24sIDAsIHN0cmluZ3MsIDAsIHN0cmluZ3MubGVuZ3RoKTsKLQkJCX0KLQkJCXJldHVybiBzdHJpbmdzOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdQcmVmZXJlbmNlcyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvcHJlZmVyZW5jZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBDaGVja2JveFRyZWVWaWV3ZXIgZkNvbnRlbnRUeXBlTGlzdDsKLQotCXByaXZhdGUgSUNvbnRlbnRUeXBlTWFuYWdlciBmQ29udGVudFR5cGVNYW5hZ2VyID0gbnVsbDsKLQotCUNvbnRlbnRUeXBlU29ydGVyIGZDb250ZW50VHlwZVNvcnRlciA9IG5ldyBDb250ZW50VHlwZVNvcnRlcigpOwotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGVbXSBmSWdub3JlQ29udGVudFR5cGVzID0gbnVsbDsKLQotCXByaXZhdGUgSUNvbnRlbnRUeXBlW10gZk9yaWdpbmFsSWdub3JlQ29udGVudFR5cGVzID0gbnVsbDsKLQotCXByaXZhdGUgVGFza1RhZ1ByZWZlcmVuY2VQYWdlIGZPd25lciA9IG51bGw7Ci0KLQlwcml2YXRlIElTY29wZUNvbnRleHRbXSBmUHJlZmVyZW5jZXNMb29rdXBPcmRlciA9IG51bGw7Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlc1NlcnZpY2UgZlByZWZlcmVuY2VzU2VydmljZSA9IG51bGw7Ci0KLQlwcml2YXRlIExpc3QgZlN1cHBvcnRlZENvbnRlbnRUeXBlcyA9IG51bGw7Ci0KLQlwdWJsaWMgRXhjbHVzaW9uc1RhYihUYXNrVGFnUHJlZmVyZW5jZVBhZ2UgcGFyZW50LCBJUHJlZmVyZW5jZXNTZXJ2aWNlIHByZWZlcmVuY2VzU2VydmljZSwgSVNjb3BlQ29udGV4dFtdIGxvb2t1cE9yZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWZPd25lciA9IHBhcmVudDsKLQkJZlByZWZlcmVuY2VzTG9va3VwT3JkZXIgPSBsb29rdXBPcmRlcjsKLQkJZlByZWZlcmVuY2VzU2VydmljZSA9IHByZWZlcmVuY2VzU2VydmljZTsKLQkJZkNvbnRlbnRUeXBlTWFuYWdlciA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOwotCi0JCVN0cmluZ1tdIHN1cHBvcnRlZENvbnRlbnRUeXBlSURzID0gRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRTdXBwb3J0ZWRDb250ZW50VHlwZUlkcygpOwotCQlmU3VwcG9ydGVkQ29udGVudFR5cGVzID0gbmV3IEFycmF5TGlzdChzdXBwb3J0ZWRDb250ZW50VHlwZUlEcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cHBvcnRlZENvbnRlbnRUeXBlSURzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGZDb250ZW50VHlwZU1hbmFnZXIuZ2V0Q29udGVudFR5cGUoc3VwcG9ydGVkQ29udGVudFR5cGVJRHNbaV0pOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCWZTdXBwb3J0ZWRDb250ZW50VHlwZXMuYWRkKHR5cGUpOwotCQkJfQotCQl9Ci0JCVN0cmluZ1tdIGlnbm9yZUNvbnRlbnRUeXBlcyA9IFN0cmluZ1V0aWxzLnVucGFjayhmUHJlZmVyZW5jZXNTZXJ2aWNlLmdldFN0cmluZyhUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSwgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0NPTlRFTlRUWVBFU19JR05PUkVELCBTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0NPTlRFTlRUWVBFU19JR05PUkVEKSwgZlByZWZlcmVuY2VzTG9va3VwT3JkZXIpKTsKLQkJTGlzdCBjb250ZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWdub3JlQ29udGVudFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGZDb250ZW50VHlwZU1hbmFnZXIuZ2V0Q29udGVudFR5cGUoaWdub3JlQ29udGVudFR5cGVzW2ldKTsKLQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQljb250ZW50VHlwZXMuYWRkKHR5cGUpOwotCQkJfQotCQl9Ci0JCWZPcmlnaW5hbElnbm9yZUNvbnRlbnRUeXBlcyA9IGZJZ25vcmVDb250ZW50VHlwZXMgPSAoSUNvbnRlbnRUeXBlW10pIGNvbnRlbnRUeXBlcy50b0FycmF5KG5ldyBJQ29udGVudFR5cGVbY29udGVudFR5cGVzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSB0YWJGb2xkZXIpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCQlMYWJlbCBkZXNjcmlwdGlvbiA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZGVzY3JpcHRpb24uc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdFeGNsdXNpb25UYWJfMDIpOwotLy8JCWRlc2NyaXB0aW9uLnNldEJhY2tncm91bmQoY29tcG9zaXRlLmdldEJhY2tncm91bmQoKSk7Ci0KLQkJZkNvbnRlbnRUeXBlTGlzdCA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXIoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCWZDb250ZW50VHlwZUxpc3Quc2V0TGFiZWxQcm92aWRlcihuZXcgQ29udGVudFR5cGVMYWJlbFByb3ZpZGVyKCkpOwotCQlmQ29udGVudFR5cGVMaXN0LnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlUcmVlQ29udGVudFByb3ZpZGVyKCkpOwotCi0JCWZDb250ZW50VHlwZUxpc3Quc2V0SW5wdXQoZlN1cHBvcnRlZENvbnRlbnRUeXBlcy50b0FycmF5KCkpOwotCQlmQ29udGVudFR5cGVMaXN0LnNldENoZWNrZWRFbGVtZW50cyhmU3VwcG9ydGVkQ29udGVudFR5cGVzLnRvQXJyYXkoKSk7Ci0JCWZDb250ZW50VHlwZUxpc3QuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZJZ25vcmVDb250ZW50VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZDb250ZW50VHlwZUxpc3Quc2V0Q2hlY2tlZChmSWdub3JlQ29udGVudFR5cGVzW2ldLCBmYWxzZSk7Ci0JCX0KLQotCQlCdXR0b24gc2VsZWN0QWxsID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8xNyk7Ci0JCXNlbGVjdEFsbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSwgMSwgMSkpOwotCQlzZWxlY3RBbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZkNvbnRlbnRUeXBlTGlzdC5zZXRDaGVja2VkRWxlbWVudHMoZlN1cHBvcnRlZENvbnRlbnRUeXBlcy50b0FycmF5KCkpOwotCQkJfQotCQl9KTsKLQotCQlCdXR0b24gc2VsZWN0Tm9uZSA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCXNlbGVjdE5vbmUuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzE4KTsKLQkJc2VsZWN0Tm9uZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSwgMSwgMSkpOwotCQlzZWxlY3ROb25lLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZDb250ZW50VHlwZUxpc3Quc2V0Q2hlY2tlZEVsZW1lbnRzKG5ldyBPYmplY3RbMF0pOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSkpOwotCi0JCUxhYmVsIGFmZmVjdGVkVHlwZXNMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYWZmZWN0ZWRUeXBlc0xhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpKTsKLS8vCQlhZmZlY3RlZFR5cGVzTGFiZWwuc2V0QmFja2dyb3VuZChjb21wb3NpdGUuZ2V0QmFja2dyb3VuZCgpKTsKLQkJYWZmZWN0ZWRUeXBlc0xhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnRXhjbHVzaW9uVGFiXzAzKTsKLQotCQlmaW5hbCBUcmVlVmlld2VyIGNvbnRlbnRUeXBlVHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQljb250ZW50VHlwZVRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29udGVudFR5cGVMYWJlbFByb3ZpZGVyKCkpOwotCQljb250ZW50VHlwZVRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDb250ZW50VHlwZVRyZWVQcm92aWRlcigpKTsKLQkJY29udGVudFR5cGVUcmVlVmlld2VyLnNldElucHV0KG5ldyBPYmplY3RbMF0pOwotCQljb250ZW50VHlwZVRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOwotCi0JCWZDb250ZW50VHlwZUxpc3QuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQlPYmplY3RbXSBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLnRvQXJyYXkoKTsKLQkJCQkJY29udGVudFR5cGVUcmVlVmlld2VyLnNldElucHV0KG8pOwotCQkJCQljb250ZW50VHlwZVRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCQkJCWlmIChvLmxlbmd0aCA+IDApIHsKLQkJCQkJCWNvbnRlbnRUeXBlVHJlZVZpZXdlci5yZXZlYWwob1swXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIFNTRVVJTWVzc2FnZXMuVGFza1RhZ0V4Y2x1c2lvblRhYl8wMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0JCXNhdmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2FkaW5nIGRlZmF1bHRzIGluICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJRWNsaXBzZVByZWZlcmVuY2VzW10gZGVmYXVsdFByZWZlcmVuY2VzID0gbmV3IElFY2xpcHNlUHJlZmVyZW5jZXNbZlByZWZlcmVuY2VzTG9va3VwT3JkZXIubGVuZ3RoIC0gMV07Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgZGVmYXVsdFByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlkZWZhdWx0UHJlZmVyZW5jZXNbaSAtIDFdID0gZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbaV0uZ2V0Tm9kZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSk7Ci0JCX0KLQkJU3RyaW5nW10gZGVmYXVsdElnbm9yZVR5cGVzID0gU3RyaW5nVXRpbHMudW5wYWNrKGZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCwgbnVsbCwgZGVmYXVsdFByZWZlcmVuY2VzKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlMaXN0IGNvbnRlbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZhdWx0SWdub3JlVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb250ZW50VHlwZSB0eXBlID0gZkNvbnRlbnRUeXBlTWFuYWdlci5nZXRDb250ZW50VHlwZShkZWZhdWx0SWdub3JlVHlwZXNbaV0pOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCWNvbnRlbnRUeXBlcy5hZGQodHlwZSk7Ci0JCQl9Ci0JCX0KLQkJZklnbm9yZUNvbnRlbnRUeXBlcyA9IChJQ29udGVudFR5cGVbXSkgY29udGVudFR5cGVzLnRvQXJyYXkobmV3IElDb250ZW50VHlwZVtjb250ZW50VHlwZXMuc2l6ZSgpXSk7Ci0JCWZDb250ZW50VHlwZUxpc3Quc2V0Q2hlY2tlZEVsZW1lbnRzKGZDb250ZW50VHlwZU1hbmFnZXIuZ2V0QWxsQ29udGVudFR5cGVzKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZJZ25vcmVDb250ZW50VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZDb250ZW50VHlwZUxpc3Quc2V0Q2hlY2tlZChmSWdub3JlQ29udGVudFR5cGVzW2ldLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtT2soKSB7Ci0JCUxpc3QgaWdub3JlZElkcyA9IHNhdmUoKTsKLQkJU3RyaW5nW10gaWdub3JlSURzID0gKFN0cmluZ1tdKSBuZXcgU3RyaW5nU29ydGVyKCkuc29ydChpZ25vcmVkSWRzLnRvQXJyYXkoKSk7Ci0JCWZJZ25vcmVDb250ZW50VHlwZXMgPSBuZXcgSUNvbnRlbnRUeXBlW2lnbm9yZUlEcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGlnbm9yZUlEcy5sZW5ndGg7IGkrKykgewotCQkJZklnbm9yZUNvbnRlbnRUeXBlc1tpXSA9IGZDb250ZW50VHlwZU1hbmFnZXIuZ2V0Q29udGVudFR5cGUoaWdub3JlSURzW2ldKTsKLQkJfQotCi0JCWlmICghQXJyYXlzLmVxdWFscyhmT3JpZ2luYWxJZ25vcmVDb250ZW50VHlwZXMsIGZJZ25vcmVDb250ZW50VHlwZXMpKSB7Ci0JCQlmT3duZXIucmVxdWVzdFJlZGV0ZWN0aW9uKCk7Ci0JCX0KLQkJZk9yaWdpbmFsSWdub3JlQ29udGVudFR5cGVzID0gZklnbm9yZUNvbnRlbnRUeXBlczsKLQl9Ci0KLQlwcml2YXRlIExpc3Qgc2F2ZSgpIHsKLQkJTGlzdCBpZ25vcmVkSWRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGNoZWNrZWQgPSBBcnJheXMuYXNMaXN0KGZDb250ZW50VHlwZUxpc3QuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZTdXBwb3J0ZWRDb250ZW50VHlwZXMuc2l6ZSgpOyBpKyspIHsKLQkJCWlmICghY2hlY2tlZC5jb250YWlucyhmU3VwcG9ydGVkQ29udGVudFR5cGVzLmdldChpKSkpIHsKLQkJCQlpZ25vcmVkSWRzLmFkZCgoKElDb250ZW50VHlwZSkgZlN1cHBvcnRlZENvbnRlbnRUeXBlcy5nZXQoaSkpLmdldElkKCkpOwotCQkJfQotCQl9Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXNbXSBkZWZhdWx0UHJlZmVyZW5jZXMgPSBuZXcgSUVjbGlwc2VQcmVmZXJlbmNlc1tmUHJlZmVyZW5jZXNMb29rdXBPcmRlci5sZW5ndGggLSAxXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBkZWZhdWx0UHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCWRlZmF1bHRQcmVmZXJlbmNlc1tpIC0gMV0gPSBmUHJlZmVyZW5jZXNMb29rdXBPcmRlcltpXS5nZXROb2RlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFKTsKLQkJfQotCi0JCVN0cmluZyBkZWZhdWx0SWdub3JlZENvbnRlbnRUeXBlSWRzID0gU3RyaW5nVXRpbHMucGFjaygoU3RyaW5nW10pIG5ldyBTdHJpbmdTb3J0ZXIoKS5zb3J0KFN0cmluZ1V0aWxzLnVucGFjayhmUHJlZmVyZW5jZXNTZXJ2aWNlLmdldChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQsICIiLCBkZWZhdWx0UHJlZmVyZW5jZXMpKSkpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBpZ25vcmVkQ29udGVudFR5cGVJZHMgPSBTdHJpbmdVdGlscy5wYWNrKChTdHJpbmdbXSkgbmV3IFN0cmluZ1NvcnRlcigpLnNvcnQoaWdub3JlZElkcy50b0FycmF5KCkpKTsKLQkJaWYgKGlnbm9yZWRDb250ZW50VHlwZUlkcy5lcXVhbHMoZGVmYXVsdElnbm9yZWRDb250ZW50VHlwZUlkcykpIHsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVtb3ZpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCArICIgZnJvbSBzY29wZSAiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TmFtZSgpICsgIjoiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCX0KLQkJCWZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5vZGUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUpLnJlbW92ZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzZXR0aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQgKyAiIFwiIiArIGlnbm9yZWRDb250ZW50VHlwZUlkcyArICJcIiBpbiBzY29wZSAiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TmFtZSgpICsgIjoiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCX0KLQkJCWZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5vZGUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUpLnB1dChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQsIGlnbm9yZWRDb250ZW50VHlwZUlkcyk7Ci0JCX0KLQkJcmV0dXJuIGlnbm9yZWRJZHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL01haW5UYWIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9NYWluVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZGM4NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL01haW5UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoJICAgRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzLlRhc2tUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlRhc2tUYWdQcmVmZXJlbmNlS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWNsYXNzIE1haW5UYWIgaW1wbGVtZW50cyBJUHJlZmVyZW5jZVRhYiB7Ci0JcHVibGljIGNsYXNzIFRhc2tUYWdEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCQlwdWJsaWMgVGFza1RhZyB0YXNrVGFnID0gbnVsbDsKLQotCQlDb21ibyBwcmlvcml0eUNvbWJvID0gbnVsbDsKLQkJVGV4dCB0YWdUZXh0ID0gbnVsbDsKLQotCQlwdWJsaWMgVGFza1RhZ0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCQluZXdTaGVsbC5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfNSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVCdXR0b25CYXIocGFyZW50KTsKLQkJCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKHRhc2tUYWcgPT0gbnVsbCB8fCB0YXNrVGFnLmdldFRhZygpLmxlbmd0aCgpID4gMCk7Ci0JCQlyZXR1cm4gYzsKLQkJfQotCi0JCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gcGFyZW50LmdldERpc3BsYXkoKS5nZXRDbGllbnRBcmVhKCkud2lkdGggLyA1OwotCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfNik7IC8vJE5PTi1OTFMtMSQKLQkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJdGFnVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQl0YWdUZXh0LnNldFRleHQodGFza1RhZyAhPSBudWxsID8gdGFza1RhZy5nZXRUYWcoKSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGFnVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCXRhZ1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlTdHJpbmcgdGVzdFRhZyA9IHRhZ1RleHQuZ2V0VGV4dCgpOwotCQkJCQlTdHJpbmdbXSB0YWdzID0gbmV3IFN0cmluZ1tmVGFza1RhZ3MubGVuZ3RoXTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQl0YWdzW2ldID0gZlRhc2tUYWdzW2ldLmdldFRhZygpOwotCQkJCQl9Ci0JCQkJCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKHRhZ1RleHQuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCAmJiAhQXJyYXlzLmFzTGlzdCh0YWdzKS5jb250YWlucyh0ZXN0VGFnKSk7Ci0JCQkJCXRhc2tUYWcgPSBuZXcgVGFza1RhZyh0YWdUZXh0LmdldFRleHQoKSwgcHJpb3JpdHlDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfNyk7IC8vJE5PTi1OTFMtMSQKLQkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJcHJpb3JpdHlDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkgfCBTV1QuU0lOR0xFKTsKLQkJCXByaW9yaXR5Q29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1tde1NTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMCwgU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8xLCBTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzJ9KTsKLQkJCXByaW9yaXR5Q29tYm8uc2VsZWN0KHRhc2tUYWcgIT0gbnVsbCA/IHRhc2tUYWcuZ2V0UHJpb3JpdHkoKSA6IFRhc2tUYWcuUFJJT1JJVFlfTk9STUFMKTsKLQkJCXByaW9yaXR5Q29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlwcmlvcml0eUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJdGFza1RhZyA9IG5ldyBUYXNrVGFnKHRhc2tUYWcuZ2V0VGFnKCksIHByaW9yaXR5Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNva1ByZXNzZWQoKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQkJdGFza1RhZyA9IG5ldyBUYXNrVGFnKHRhZ1RleHQuZ2V0VGV4dCgpLCBwcmlvcml0eUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgVGFza1RhZ1RhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIFRhc2tUYWdUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCWlmIChjb2x1bW5JbmRleCA8IDEpCi0JCQkJcmV0dXJuICgoVGFza1RhZykgZWxlbWVudCkuZ2V0VGFnKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZUYXNrVGFncy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmVGFza1RhZ3NbaV0uZXF1YWxzKGVsZW1lbnQpKSB7Ci0JCQkJCWlmIChmVGFza1RhZ3NbaV0uZ2V0UHJpb3JpdHkoKSA9PSBJTWFya2VyLlBSSU9SSVRZX0xPVykgewotCQkJCQkJcmV0dXJuIFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMDsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGZUYXNrVGFnc1tpXS5nZXRQcmlvcml0eSgpID09IElNYXJrZXIuUFJJT1JJVFlfSElHSCkgewotCQkJCQkJcmV0dXJuIFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmV0dXJuIFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMzsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdQcmVmZXJlbmNlcyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvcHJlZmVyZW5jZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBDb250cm9sIGZDb250cm9sOwotCi0JcHJpdmF0ZSBUYXNrVGFnW10gZk9yaWdpbmFsVGFza1RhZ3M7Ci0JcHJpdmF0ZSBUYXNrVGFnUHJlZmVyZW5jZVBhZ2UgZk93bmVyID0gbnVsbDsKLQlwcml2YXRlIElTY29wZUNvbnRleHRbXSBmUHJlZmVyZW5jZXNMb29rdXBPcmRlciA9IG51bGw7Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlc1NlcnZpY2UgZlByZWZlcmVuY2VzU2VydmljZSA9IG51bGw7Ci0KLQlwcml2YXRlIFRhc2tUYWdbXSBmVGFza1RhZ3M7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHZhbHVlVGFibGUgPSBudWxsOwotCi0KLQlwdWJsaWMgTWFpblRhYihUYXNrVGFnUHJlZmVyZW5jZVBhZ2UgcGFyZW50LCBJUHJlZmVyZW5jZXNTZXJ2aWNlIHByZWZlcmVuY2VzU2VydmljZSwgSVNjb3BlQ29udGV4dFtdIGxvb2t1cE9yZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWZPd25lciA9IHBhcmVudDsKLQkJZlByZWZlcmVuY2VzTG9va3VwT3JkZXIgPSBsb29rdXBPcmRlcjsKLQkJZlByZWZlcmVuY2VzU2VydmljZSA9IHByZWZlcmVuY2VzU2VydmljZTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBhZGRUYWcoKSB7Ci0JCVRhc2tUYWdEaWFsb2cgZGxnID0gbmV3IFRhc2tUYWdEaWFsb2coZkNvbnRyb2wuZ2V0U2hlbGwoKSk7Ci0JCWludCByZXN1bHQgPSBkbGcub3BlbigpOwotCQlpZiAocmVzdWx0ID09IFdpbmRvdy5PSykgewotCQkJVGFza1RhZyBuZXdUYWcgPSBkbGcudGFza1RhZzsKLQkJCUxpc3QgbmV3VGFncyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChmVGFza1RhZ3MpKTsKLQkJCW5ld1RhZ3MuYWRkKG5ld1RhZyk7Ci0JCQlmVGFza1RhZ3MgPSAoVGFza1RhZ1tdKSBuZXdUYWdzLnRvQXJyYXkobmV3IFRhc2tUYWdbbmV3VGFncy5zaXplKCldKTsKLQkJCXZhbHVlVGFibGUuc2V0SW5wdXQoZlRhc2tUYWdzKTsKLQkJCXZhbHVlVGFibGUuZ2V0VGFibGUoKS5zZXRTZWxlY3Rpb24oZlRhc2tUYWdzLmxlbmd0aCAtIDEpOwotCQl9Ci0JfQotCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHRhYkZvbGRlcikgewotCQlsb2FkUHJlZmVyZW5jZVZhbHVlcygpOwotCQlmT3JpZ2luYWxUYXNrVGFncyA9IGZUYXNrVGFnczsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlmQ29udHJvbCA9IGNvbXBvc2l0ZTsKLQotCQlMYWJlbCBkZXNjcmlwdGlvbiA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZGVzY3JpcHRpb24uc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzMzKTsgLy8kTk9OLU5MUy0xJAotLy8JCWRlc2NyaXB0aW9uLnNldEJhY2tncm91bmQoY29tcG9zaXRlLmdldEJhY2tncm91bmQoKSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA0NDAzCi0JCVBvaW50IHNpemVIaW50ID0gZGVzY3JpcHRpb24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJZ2Qud2lkdGhIaW50ID0gc2l6ZUhpbnQueDsKLQkJZGVzY3JpcHRpb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJdmFsdWVUYWJsZSA9IG5ldyBUYWJsZVZpZXdlcihjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQl2YWx1ZVRhYmxlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJVGFibGVDb2x1bW4gdGV4dENvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih2YWx1ZVRhYmxlLmdldFRhYmxlKCksIFNXVC5OT05FLCAwKTsKLQkJdGV4dENvbHVtbi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTIpOyAvLyROT04tTkxTLTEkCi0JCVRhYmxlQ29sdW1uIHByaW9yaXR5Q29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHZhbHVlVGFibGUuZ2V0VGFibGUoKSwgU1dULk5PTkUsIDEpOwotCQlwcmlvcml0eUNvbHVtbi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTMpOyAvLyROT04tTkxTLTEkCi0JCXZhbHVlVGFibGUuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdmFsdWVUYWJsZS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUYXNrVGFnVGFibGVMYWJlbFByb3ZpZGVyKCkpOwotCQl2YWx1ZVRhYmxlLmdldFRhYmxlKCkuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl2YWx1ZVRhYmxlLmdldFRhYmxlKCkuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEsIDE0MCwgdHJ1ZSkpOwotCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxLCAxNDAsIHRydWUpKTsKLQkJdmFsdWVUYWJsZS5nZXRUYWJsZSgpLnNldExheW91dChsYXlvdXQpOwotCi0JCUNvbXBvc2l0ZSBidXR0b25zID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYnV0dG9ucy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWJ1dHRvbnMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotCi0JCWZpbmFsIEJ1dHRvbiBhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIKTsKLQkJYWRkQnV0dG9uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8xNCk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlmaW5hbCBCdXR0b24gZWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQllZGl0QnV0dG9uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8xNSk7IC8vJE5PTi1OTFMtMSQKLQkJZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJZmluYWwgQnV0dG9uIHJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQlyZW1vdmVCdXR0b24uc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzE2KTsgLy8kTk9OLU5MUy0xJAotCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCUxhYmVsIHdhcm5pbmcgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXdhcm5pbmcuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCXdhcm5pbmcuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzE5KTsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdmFsdWVUYWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5zaXplKCkgPT0gMSk7Ci0JCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoIXNlbGVjdGlvbi5pc0VtcHR5KCkpOwotCQkJfQotCQl9OwotCQl2YWx1ZVRhYmxlLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQkJYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWFkZFRhZygpOwotCQkJCXZhbHVlVGFibGUuZ2V0VGFibGUoKS5zZXRTZWxlY3Rpb24oZlRhc2tUYWdzLmxlbmd0aCAtIDEpOwotCQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKG51bGwpOwotCQkJfQotCQl9KTsKLQkJZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpbnQgaSA9IHZhbHVlVGFibGUuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCWVkaXRUYWcoaSk7Ci0JCQkJaWYgKGkgPj0gMCkgewotCQkJCQl2YWx1ZVRhYmxlLmdldFRhYmxlKCkuc2V0U2VsZWN0aW9uKGkpOwotCQkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaW50IGkgPSB2YWx1ZVRhYmxlLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlyZW1vdmVUYWdzKHZhbHVlVGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCWlmIChpID49IDAgJiYgaSA8IGZUYXNrVGFncy5sZW5ndGgpIHsKLQkJCQkJdmFsdWVUYWJsZS5nZXRUYWJsZSgpLnNldFNlbGVjdGlvbihpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQl2YWx1ZVRhYmxlLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCWludCBpID0gdmFsdWVUYWJsZS5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJZWRpdFRhZyhpKTsKLQkJCQlpZiAoaSA+PSAwKSB7Ci0JCQkJCXZhbHVlVGFibGUuZ2V0VGFibGUoKS5zZXRTZWxlY3Rpb24oaSk7Ci0JCQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJdmFsdWVUYWJsZS5zZXRJbnB1dChmVGFza1RhZ3MpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBlZGl0VGFnKGludCBpKSB7Ci0JCWlmIChpIDwgMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNlbGVjdGlvbiA9IHZhbHVlVGFibGUuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlUYXNrVGFnRGlhbG9nIGRsZyA9IG5ldyBUYXNrVGFnRGlhbG9nKGZDb250cm9sLmdldFNoZWxsKCkpOwotCQlkbGcudGFza1RhZyA9IGZUYXNrVGFnc1tzZWxlY3Rpb25dOwotCQlpbnQgcmVzdWx0ID0gZGxnLm9wZW4oKTsKLQkJaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spIHsKLQkJCWZUYXNrVGFnc1tzZWxlY3Rpb25dID0gZGxnLnRhc2tUYWc7Ci0JCQl2YWx1ZVRhYmxlLnJlZnJlc2goKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiBTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzIwOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkUHJlZmVyZW5jZVZhbHVlcygpIHsKLQkJU3RyaW5nIHRhZ3MgPSBmUHJlZmVyZW5jZXNTZXJ2aWNlLmdldFN0cmluZyhUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSwgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1RBR1MsICIiLCBmUHJlZmVyZW5jZXNMb29rdXBPcmRlcik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHByaW9yaXRpZXMgPSBmUHJlZmVyZW5jZXNTZXJ2aWNlLmdldFN0cmluZyhUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSwgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BSSU9SSVRJRVMsICIiLCBmUHJlZmVyZW5jZXNMb29rdXBPcmRlcik7IC8vJE5PTi1OTFMtMSQKLQkJbG9hZFRhZ3NBbmRQcmlvcml0aWVzRnJvbSh0YWdzLCBwcmlvcml0aWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFncwotCSAqIEBwYXJhbSBwcmlvcml0aWVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRUYWdzQW5kUHJpb3JpdGllc0Zyb20oU3RyaW5nIHRhZ1N0cmluZywgU3RyaW5nIHByaW9yaXR5U3RyaW5nKSB7Ci0JCVN0cmluZ1tdIHRhZ3MgPSBTdHJpbmdVdGlscy51bnBhY2sodGFnU3RyaW5nKTsKLQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZXIgPSBudWxsOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJdG9rZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByaW9yaXR5U3RyaW5nLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0b2tlci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCUludGVnZXIgbnVtYmVyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbnVtYmVyID0gSW50ZWdlci52YWx1ZU9mKHRva2VyLm5leHRUb2tlbigpKTsKLQkJCX0KLQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCW51bWJlciA9IG5ldyBJbnRlZ2VyKElNYXJrZXIuUFJJT1JJVFlfTk9STUFMKTsKLQkJCX0KLQkJCWxpc3QuYWRkKG51bWJlcik7Ci0JCX0KLQkJSW50ZWdlcltdIHByaW9yaXRpZXMgPSAoSW50ZWdlcltdKSBsaXN0LnRvQXJyYXkobmV3IEludGVnZXJbMF0pOwotCi0JCWZUYXNrVGFncyA9IG5ldyBUYXNrVGFnW01hdGgubWluKHRhZ3MubGVuZ3RoLCBwcmlvcml0aWVzLmxlbmd0aCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZUYXNrVGFncy5sZW5ndGg7IGkrKykgewotCQkJZlRhc2tUYWdzW2ldID0gbmV3IFRhc2tUYWcodGFnc1tpXSwgcHJpb3JpdGllc1tpXS5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLQkJc2F2ZSgpOwotCi0JCWlmICghQXJyYXlzLmVxdWFscyhmT3JpZ2luYWxUYXNrVGFncywgZlRhc2tUYWdzKSkgewotCQkJZk93bmVyLnJlcXVlc3RSZWRldGVjdGlvbigpOwotCQl9Ci0JCWZPcmlnaW5hbFRhc2tUYWdzID0gZlRhc2tUYWdzOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRpbmcgZGVmYXVsdHMgaW4gIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXNbXSBwcmVmZXJlbmNlcyA9IG5ldyBJRWNsaXBzZVByZWZlcmVuY2VzW2ZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCXByZWZlcmVuY2VzW2ldID0gZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbaV0uZ2V0Tm9kZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSk7Ci0JCX0KLQkJU3RyaW5nIHRhZ3MgPSBmUHJlZmVyZW5jZXNTZXJ2aWNlLmdldChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfVEFHUywgbnVsbCwgcHJlZmVyZW5jZXMpOwotCQlTdHJpbmcgcHJpb3JpdGllcyA9IGZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QUklPUklUSUVTLCBudWxsLCBwcmVmZXJlbmNlcyk7Ci0JCWxvYWRUYWdzQW5kUHJpb3JpdGllc0Zyb20odGFncywgcHJpb3JpdGllcyk7Ci0JCWludCBzZWxlY3Rpb24gPSB2YWx1ZVRhYmxlLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJdmFsdWVUYWJsZS5zZXRJbnB1dChmVGFza1RhZ3MpOwotCQl2YWx1ZVRhYmxlLmdldFRhYmxlKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybU9rKCkgewotCQlwZXJmb3JtQXBwbHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVRhZ3MoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQlMaXN0IHRhc2tUYWdzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGZUYXNrVGFncykpOwotCQl0YXNrVGFncy5yZW1vdmVBbGwoc3RydWN0dXJlZFNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCWZUYXNrVGFncyA9IChUYXNrVGFnW10pIHRhc2tUYWdzLnRvQXJyYXkobmV3IFRhc2tUYWdbdGFza1RhZ3Muc2l6ZSgpXSk7Ci0JCXZhbHVlVGFibGUuc2V0SW5wdXQoZlRhc2tUYWdzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZSgpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBkZWZhdWx0UHJlZmVyZW5jZXMgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSk7Ci0JCVN0cmluZyBkZWZhdWx0VGFncyA9IGRlZmF1bHRQcmVmZXJlbmNlcy5nZXQoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1RBR1MsIG51bGwpOwotCQlTdHJpbmcgZGVmYXVsdFByaW9yaXRpZXMgPSBkZWZhdWx0UHJlZmVyZW5jZXMuZ2V0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QUklPUklUSUVTLCBudWxsKTsKLQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZUYXNrVGFncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgPiAwKSB7Ci0JCQkJYnVmLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlidWYuYXBwZW5kKGZUYXNrVGFnc1tpXS5nZXRUYWcoKSk7Ci0JCX0KLQkJU3RyaW5nIGN1cnJlbnRUYWdzID0gYnVmLnRvU3RyaW5nKCk7Ci0JCWlmIChjdXJyZW50VGFncy5lcXVhbHMoZGVmYXVsdFRhZ3MpICYmICFmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXROYW1lKCkuZXF1YWxzKERlZmF1bHRTY29wZS5TQ09QRSkpIHsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVtb3ZpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19UQUdTICsgIiBmcm9tIHNjb3BlICIgKyBmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXROYW1lKCkgKyAiOiIgKyBmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJfQotCQkJZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0Tm9kZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSkucmVtb3ZlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19UQUdTKTsKLQkJfQotCQllbHNlIHsKLQkJCWZPd25lci5yZXF1ZXN0UmVkZXRlY3Rpb24oKTsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgc2V0dGluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1RBR1MgKyAiIFwiIiArIGN1cnJlbnRUYWdzICsgIlwiIGluIHNjb3BlICIgKyBmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXROYW1lKCkgKyAiOiIgKyBmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJfQotCQkJZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0Tm9kZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSkucHV0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19UQUdTLCBjdXJyZW50VGFncyk7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgYnVmMiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFza1RhZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpID4gMCkgewotCQkJCWJ1ZjIuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJ1ZjIuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGZUYXNrVGFnc1tpXS5nZXRQcmlvcml0eSgpKSk7Ci0JCX0KLQkJU3RyaW5nIHByaW9yaXRpZXMgPSBidWYyLnRvU3RyaW5nKCk7Ci0KLQkJaWYgKHByaW9yaXRpZXMuZXF1YWxzKGRlZmF1bHRQcmlvcml0aWVzKSAmJiAhZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TmFtZSgpLmVxdWFscyhEZWZhdWx0U2NvcGUuU0NPUEUpKSB7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHJlbW92aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUFJJT1JJVElFUyArICIgZnJvbSBzY29wZSAiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TmFtZSgpICsgIjoiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCX0KLQkJCWZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5vZGUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUpLnJlbW92ZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUFJJT1JJVElFUyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmT3duZXIucmVxdWVzdFJlZGV0ZWN0aW9uKCk7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNldHRpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QUklPUklUSUVTICsgIiBcIiIgKyBwcmlvcml0aWVzICsgIlwiIGluIHNjb3BlICIgKyBmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXROYW1lKCkgKyAiOiIgKyBmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJfQotCQkJZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0Tm9kZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSkucHV0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QUklPUklUSUVTLCBwcmlvcml0aWVzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9Qcm9wZXJ0eVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvUHJvcGVydHlQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWI4NWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9Qcm9wZXJ0eVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkNvbnRyb2xFbmFibGVTdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci5SZXNvdXJjZVNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3MuVGFza1RhZ1ByZWZlcmVuY2VLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi0vKioKLSAqIEJhc2VkIGxvb3NsZXkgb24gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnByZWZlcmVuY2VzLlByb3BlcnR5QW5kUHJlZmVyZW5jZVBhZ2UKLSAqLwotYWJzdHJhY3QgY2xhc3MgUHJvcGVydHlQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdQcmVmZXJlbmNlcyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL3ByZWZlcmVuY2VzLXByb3BlcnRpZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qCi0JICogRGlzYWJsZSBsaW5rIGRhdGEsIHByZXZlbnRzIHRoZSBkaXNwbGF5IG9mIGEgIndvcmtzcGFjZSIgb3IgInByb2plY3QiCi0JICogc2V0dGluZ3MgbGluayB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBkaWFsb2cgbGF1bmNoaW5nCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IERJU0FCTEVfTElOSyA9ICJESVNBQkxFX0xJTksiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1hcCBmRGF0YSA9IG51bGw7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmRW5hYmxlUHJvamVjdFNldHRpbmdzOwotCi0JcHJpdmF0ZSBMaW5rIGZQcm9qZWN0U2V0dGluZ3NMaW5rOwotCi0JcHVibGljIFByb3BlcnR5UHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgYXBwbHlEYXRhKE9iamVjdCBkYXRhKSB7Ci0JCXN1cGVyLmFwcGx5RGF0YShkYXRhKTsKLQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBNYXApIHsKLQkJCWZEYXRhID0gKE1hcCkgZGF0YTsKLQkJCXVwZGF0ZUxpbmtFbmFibGVtZW50KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29udHJvbCBjcmVhdGVDb21tb25Db250ZW50cyhDb21wb3NpdGUgY29tcG9zaXRlKTsKLQotCXB1YmxpYyBmaW5hbCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ29tcG9zaXRlIGNoZWNrTGlua0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNoZWNrTGlua0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJY2hlY2tMaW5rQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJZkVuYWJsZVByb2plY3RTZXR0aW5ncyA9IG5ldyBCdXR0b24oY2hlY2tMaW5rQ29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQkJZkVuYWJsZVByb2plY3RTZXR0aW5ncy5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuRW5hYmxlUHJvamVjdFNldHRpbmdzKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3Muc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCQlib29sZWFuIGVuYWJsZWRGb3JQcm9qZWN0ID0gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkuZ2V0Qm9vbGVhbihnZXRQcm9qZWN0U2V0dGluZ3NLZXkoKSwgZmFsc2UpOwotCQkJZkVuYWJsZVByb2plY3RTZXR0aW5ncy5zZXRTZWxlY3Rpb24oZW5hYmxlZEZvclByb2plY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGFiZWwgc3BhY2VyID0gbmV3IExhYmVsKGNoZWNrTGlua0NvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJCXNwYWNlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJfQotCi0JCWZQcm9qZWN0U2V0dGluZ3NMaW5rID0gbmV3IExpbmsoY2hlY2tMaW5rQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZQcm9qZWN0U2V0dGluZ3NMaW5rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlKSk7Ci0KLQkJLyoKLQkJICogImVsZW1lbnQiIHNob3VsZCBiZSBhIHByb2plY3QsIGlmIG51bGwsIGxpbmsgdG8gcGVyLXByb2plY3QKLQkJICogcHJvcGVydGllcwotCQkgKi8KLQkJaWYgKGdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQlmUHJvamVjdFNldHRpbmdzTGluay5zZXRUZXh0KCI8YT4iICsgU1NFVUlNZXNzYWdlcy5Db25maWd1cmVXb3Jrc3BhY2VTZXR0aW5ncyArICI8L2E+Iik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSB7Ci0JCQlmUHJvamVjdFNldHRpbmdzTGluay5zZXRUZXh0KCI8YT4iICsgU1NFVUlNZXNzYWdlcy5Db25maWd1cmVQcm9qZWN0U2V0dGluZ3MgKyAiPC9hPiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJdXBkYXRlTGlua0VuYWJsZW1lbnQoKTsKLQotCQlmUHJvamVjdFNldHRpbmdzTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGdldFByb2plY3QoKSA9PSBudWxsKSB7Ci0JCQkJCW9wZW5Qcm9qZWN0U2V0dGluZ3MoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW9wZW5Xb3Jrc3BhY2VTZXR0aW5ncygpOwotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQotCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQkJbGluZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJfQotCi0JCWZpbmFsIENvbnRyb2wgY29tbW9uID0gY3JlYXRlQ29tbW9uQ29udGVudHMoY29tcG9zaXRlKTsKLQkJY29tbW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWlmIChmRW5hYmxlUHJvamVjdFNldHRpbmdzICE9IG51bGwpIHsKLQkJCVNlbGVjdGlvbkFkYXB0ZXIgc2VsZWN0aW9uQWRhcHRlciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCUNvbnRyb2xFbmFibGVTdGF0ZSBlbmFibGVtZW50cyA9IG51bGw7Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCQlpZiAoZkVuYWJsZVByb2plY3RTZXR0aW5ncy5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJaWYgKGVuYWJsZW1lbnRzICE9IG51bGwpIHsKLQkJCQkJCQllbmFibGVtZW50cy5yZXN0b3JlKCk7Ci0JCQkJCQkJZW5hYmxlbWVudHMgPSBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZW5hYmxlbWVudHMgPSBDb250cm9sRW5hYmxlU3RhdGUuZGlzYWJsZShjb21tb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCXNlbGVjdGlvbkFkYXB0ZXIud2lkZ2V0U2VsZWN0ZWQobnVsbCk7Ci0JCQlmRW5hYmxlUHJvamVjdFNldHRpbmdzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkFkYXB0ZXIpOwotCQl9Ci0KLQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQkJfQotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTY29wZUNvbnRleHRbXSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpLCBuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCQl9Ci0JCXJldHVybiBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlEKCk7Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJaWYgKGdldEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlyZXR1cm4gKElQcm9qZWN0KSBnZXRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlPYmplY3QgYWRhcHRlciA9IGdldEVsZW1lbnQoKS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlyZXR1cm4gKElQcm9qZWN0KSBhZGFwdGVyOwotCQkJfQotCQkJYWRhcHRlciA9IGdldEVsZW1lbnQoKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJcmV0dXJuIChJUHJvamVjdCkgYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFByb2plY3RTZXR0aW5nc0tleSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0eVBhZ2VJRCgpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbGVtZW50U2V0dGluZ3NFbmFibGVkKCkgewotCQlyZXR1cm4gZkVuYWJsZVByb2plY3RTZXR0aW5ncyAhPSBudWxsICYmIGZFbmFibGVQcm9qZWN0U2V0dGluZ3MuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0Jdm9pZCBvcGVuUHJvamVjdFNldHRpbmdzKCkgewotCQlMaXN0RGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0RGlhbG9nKGdldFNoZWxsKCkpIHsKLQotCQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQkJQ29udHJvbCBhcmVhID0gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShjb250YWluZXIpOwotCQkJCWdldFRhYmxlVmlld2VyKCkuc2V0U29ydGVyKG5ldyBSZXNvdXJjZVNvcnRlcihSZXNvdXJjZVNvcnRlci5OQU1FKSk7Ci0JCQkJcmV0dXJuIGFyZWE7Ci0JCQl9Ci0JCX07Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKFNTRVVJTWVzc2FnZXMuUHJvcGVydHlQcmVmZXJlbmNlUGFnZV8wMik7Ci0JCWRpYWxvZy5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChJV29ya3NwYWNlKSBpbnB1dEVsZW1lbnQpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJfSk7Ci0JCWRpYWxvZy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCkpKTsKLQkJZGlhbG9nLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSk7Ci0JCWRpYWxvZy5zZXRUaXRsZShTU0VVSU1lc3NhZ2VzLlByb3BlcnR5UHJlZmVyZW5jZVBhZ2VfMDEpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCU9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCWlmIChyZXN1bHQubGVuZ3RoID4gMCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJCQlNYXAgZGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZGF0YS5wdXQoRElTQUJMRV9MSU5LLCBCb29sZWFuLlRSVUUpOwotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcm9wZXJ0eURpYWxvZ09uKGdldFNoZWxsKCksIHByb2plY3QsIGdldFByb3BlcnR5UGFnZUlEKCksIG5ldyBTdHJpbmdbXXtnZXRQcm9wZXJ0eVBhZ2VJRCgpfSwgZGF0YSkub3BlbigpOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBvcGVuV29ya3NwYWNlU2V0dGluZ3MoKSB7Ci0JCU1hcCBkYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJZGF0YS5wdXQoRElTQUJMRV9MSU5LLCBCb29sZWFuLlRSVUUpOwotCQlQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIGdldFByZWZlcmVuY2VQYWdlSUQoKSwgbmV3IFN0cmluZ1tde2dldFByZWZlcmVuY2VQYWdlSUQoKX0sIGRhdGEpLm9wZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJSVNjb3BlQ29udGV4dFtdIHByZWZlcmVuY2VTY29wZXMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCk7Ci0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJaWYgKGlzRWxlbWVudFNldHRpbmdzRW5hYmxlZCgpKSB7Ci0JCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgc2V0dGluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BFUl9QUk9KRUNUICsgIiAoIiArIHRydWUgKyAiKSBpbiBzY29wZSAiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROYW1lKCkgKyAiOiIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkICAKLQkJCQl9Ci0JCQkJcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnB1dEJvb2xlYW4oZ2V0UHJvamVjdFNldHRpbmdzS2V5KCksIGZFbmFibGVQcm9qZWN0U2V0dGluZ3MuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVtb3ZpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QRVJfUFJPSkVDVCArICIgZnJvbSBzY29wZSAiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROYW1lKCkgKyAiOiIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJfQotCQkJCXByZWZlcmVuY2VTY29wZXNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5yZW1vdmUoZ2V0UHJvamVjdFNldHRpbmdzS2V5KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBvazsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlTGlua0VuYWJsZW1lbnQoKSB7Ci0JCWlmIChmRGF0YSAhPSBudWxsICYmIGZQcm9qZWN0U2V0dGluZ3NMaW5rICE9IG51bGwpIHsKLQkJCWZQcm9qZWN0U2V0dGluZ3NMaW5rLnNldEVuYWJsZWQoIUJvb2xlYW4uVFJVRS5lcXVhbHMoZkRhdGEuZ2V0KERJU0FCTEVfTElOSykpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9UYXNrVGFnUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9UYXNrVGFnUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxYmUwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvVGFza1RhZ1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkNvbnRyb2xFbmFibGVTdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlRhc2tTY2FubmluZ1NjaGVkdWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3MuVGFza1RhZ1ByZWZlcmVuY2VLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlRhYkZvbGRlckxheW91dDsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFRhc2tUYWdQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByb3BlcnR5UHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdQcmVmZXJlbmNlcyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvcHJlZmVyZW5jZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8vIFJlbWVtYmVyIHRoZSBsYXN0IGRpc3BsYXllZCB0YWIgZm9yIGNvbnZlbmllbmNlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfVEFHX0xBU1RfVEFCID0gInRhc2stdGFnLWxhc3QtdGFiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBpbnQgZGV0ZWN0aW9uUmVxdWVzdGVkID0gMDsKLQotCXByaXZhdGUgQnV0dG9uIGZFbmFibGVDaGVja2JveCA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkVuYWJsZVRhc2tUYWdzID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBmT3JpZ2luYWxFbmFibGVUYXNrVGFncyA9IHRydWU7Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlc1NlcnZpY2UgZlByZWZlcmVuY2VzU2VydmljZSA9IG51bGw7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmUmVkZXRlY3RCdXR0b247Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGZUYWJFbmFibGVtZW50TGlzdGVuZXI7Ci0KLQlwcml2YXRlIFRhYkZvbGRlciBmVGFiRm9sZGVyOwotCXByaXZhdGUgSVByZWZlcmVuY2VUYWJbXSBmVGFicyA9IG51bGw7Ci0KLQlwdWJsaWMgVGFza1RhZ1ByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCQlmUHJlZmVyZW5jZXNTZXJ2aWNlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZUJ1dHRvbnMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoZ2V0RWxlbWVudCgpID09IG51bGwpIHsKLQkJCSgoR3JpZExheW91dCkgcGFyZW50LmdldExheW91dCgpKS5udW1Db2x1bW5zICs9IDI7Ci0JCQlmUmVkZXRlY3RCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQkJZlJlZGV0ZWN0QnV0dG9uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVBhZ2VfMzIpOyAvLyROT04tTkxTLTEkCi0JCQlmUmVkZXRlY3RCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCQlmUmVkZXRlY3RCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZSZWRldGVjdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUpvYiByZWRldGVjdEpvYiA9IG5ldyBKb2IoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8yNykgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJfQotCi0JCQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQkJVGFza1NjYW5uaW5nU2NoZWR1bGVyLnJlZnJlc2goKTsKLQkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQkJcmVkZXRlY3RKb2Iuc2NoZWR1bGUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCUxhYmVsIHNwYWNlciA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCXNwYWNlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUikpOwotCQl9Ci0JCXN1cGVyLmNvbnRyaWJ1dGVCdXR0b25zKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29tbW9uQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBjb21wb3NpdGVMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wb3NpdGVMYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWNvbXBvc2l0ZUxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQoY29tcG9zaXRlTGF5b3V0KTsKLQotCQlJU2NvcGVDb250ZXh0W10gcHJlZmVyZW5jZVNjb3BlcyA9IGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKTsKLQkJZk9yaWdpbmFsRW5hYmxlVGFza1RhZ3MgPSBmRW5hYmxlVGFza1RhZ3MgPSBmUHJlZmVyZW5jZXNTZXJ2aWNlLmdldEJvb2xlYW4oZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSwgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0VOQUJMRSwgZmFsc2UsIHByZWZlcmVuY2VTY29wZXMpOwotCQlmRW5hYmxlQ2hlY2tib3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkVuYWJsZUNoZWNrYm94LnNldFNlbGVjdGlvbihmRW5hYmxlVGFza1RhZ3MpOwotCQlmRW5hYmxlQ2hlY2tib3guc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzMxKTsgLy8kTk9OLU5MUy0xJAotCQlmRW5hYmxlQ2hlY2tib3guc2V0U2VsZWN0aW9uKGZFbmFibGVUYXNrVGFncyk7Ci0JCWZFbmFibGVDaGVja2JveC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORywgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRU5ELCBmYWxzZSwgZmFsc2UsIDEsIDEpKTsKLQotCQlmVGFiRm9sZGVyID0gbmV3IFRhYkZvbGRlcihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZlRhYkZvbGRlci5zZXRMYXlvdXQobmV3IFRhYkZvbGRlckxheW91dCgpKTsKLQkJZlRhYkZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpKTsKLQotCQlUYWJJdGVtIHRhc2tJdGVtID0gbmV3IFRhYkl0ZW0oZlRhYkZvbGRlciwgU1dULk5PTkUpOwotCQlNYWluVGFiIG1haW5UYWIgPSBuZXcgTWFpblRhYih0aGlzLCBmUHJlZmVyZW5jZXNTZXJ2aWNlLCBwcmVmZXJlbmNlU2NvcGVzKTsKLQkJdGFza0l0ZW0uc2V0VGV4dChtYWluVGFiLmdldFRpdGxlKCkpOwotCQlmaW5hbCBDb250cm9sIHRhc2tUYWdzQ29udHJvbCA9IG1haW5UYWIuY3JlYXRlQ29udGVudHMoZlRhYkZvbGRlcik7Ci0JCXRhc2tJdGVtLnNldENvbnRyb2wodGFza1RhZ3NDb250cm9sKTsKLQotCQlUYWJJdGVtIGV4Y2x1c2lvbkl0ZW0gPSBuZXcgVGFiSXRlbShmVGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCUV4Y2x1c2lvbnNUYWIgZXhjbHVzaW9uc1RhYiA9IG5ldyBFeGNsdXNpb25zVGFiKHRoaXMsIGZQcmVmZXJlbmNlc1NlcnZpY2UsIHByZWZlcmVuY2VTY29wZXMpOwotCQlleGNsdXNpb25JdGVtLnNldFRleHQoZXhjbHVzaW9uc1RhYi5nZXRUaXRsZSgpKTsKLQkJZmluYWwgQ29udHJvbCBleGNsdXNpb25Db250cm9sID0gZXhjbHVzaW9uc1RhYi5jcmVhdGVDb250ZW50cyhmVGFiRm9sZGVyKTsKLQkJZXhjbHVzaW9uSXRlbS5zZXRDb250cm9sKGV4Y2x1c2lvbkNvbnRyb2wpOwotCi0JCWZUYWJzID0gbmV3IElQcmVmZXJlbmNlVGFiW117bWFpblRhYiwgZXhjbHVzaW9uc1RhYn07Ci0KLQkJZlRhYkVuYWJsZW1lbnRMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQ29udHJvbEVuYWJsZVN0YXRlW10gbGFzdEVuYWJsZVN0YXRlcyA9IG51bGw7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmRW5hYmxlVGFza1RhZ3MgPSBmRW5hYmxlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGZFbmFibGVUYXNrVGFncykgewotCQkJCQlpZiAobGFzdEVuYWJsZVN0YXRlcyAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxhc3RFbmFibGVTdGF0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlpZiAobGFzdEVuYWJsZVN0YXRlc1tpXSAhPSBudWxsKSB7Ci0JCQkJCQkJCWxhc3RFbmFibGVTdGF0ZXNbaV0ucmVzdG9yZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWxhc3RFbmFibGVTdGF0ZXMgPSBudWxsOwotCQkJCQkJZlRhYkZvbGRlci5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChsYXN0RW5hYmxlU3RhdGVzID09IG51bGwpIHsKLQkJCQkJbGFzdEVuYWJsZVN0YXRlcyA9IG5ldyBDb250cm9sRW5hYmxlU3RhdGVbZlRhYnMubGVuZ3RoICsgMV07Ci0JCQkJCWxhc3RFbmFibGVTdGF0ZXNbMF0gPSBDb250cm9sRW5hYmxlU3RhdGUuZGlzYWJsZSh0YXNrVGFnc0NvbnRyb2wpOwotCQkJCQlsYXN0RW5hYmxlU3RhdGVzWzFdID0gQ29udHJvbEVuYWJsZVN0YXRlLmRpc2FibGUoZXhjbHVzaW9uQ29udHJvbCk7Ci0JCQkJCWlmIChmUmVkZXRlY3RCdXR0b24gIT0gbnVsbCkgewotCQkJCQkJbGFzdEVuYWJsZVN0YXRlc1syXSA9IENvbnRyb2xFbmFibGVTdGF0ZS5kaXNhYmxlKGZSZWRldGVjdEJ1dHRvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWZUYWJFbmFibGVtZW50TGlzdGVuZXIud2lkZ2V0U2VsZWN0ZWQobnVsbCk7Ci0JCWZFbmFibGVDaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihmVGFiRW5hYmxlbWVudExpc3RlbmVyKTsKLQotCQkvLyByZXN0b3JlIGxhc3Qgc2VsZWN0ZWQgdGFiCi0JCWludCBhY3RpdmVUYWIgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5nZXRJbnQoVEFTS19UQUdfTEFTVF9UQUIsIDApOwotCQlpZiAoYWN0aXZlVGFiID4gMCkgewotCQkJZlRhYkZvbGRlci5zZXRTZWxlY3Rpb24oYWN0aXZlVGFiKTsKLQkJfQotCi0JCVNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIElIZWxwQ29udGV4dElkcy5QUkVGV0VCWF9UQVNLVEFHU19IRUxQSUQpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSB7Ci0JCXJldHVybiBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcmVuY2VQYWdlSUQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy50YXNrdGFncyI7Ly8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0U2V0dGluZ3NLZXkoKSB7Ci0JCXJldHVybiBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUEVSX1BST0pFQ1Q7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eVBhZ2VJRCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByb2plY3QucHJvcGVydGllcy50YXNrdGFncyI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiBTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzIwOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLQkJc3VwZXIucGVyZm9ybUFwcGx5KCk7Ci0JCXNhdmUoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZUYWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmVGFic1tpXS5wZXJmb3JtQXBwbHkoKTsKLQkJfQotCi0JCXByb21wdEZvclJlZGV0ZWN0SWZOZWNlc3NhcnkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlJRWNsaXBzZVByZWZlcmVuY2VzIGRlZmF1bHRQcmVmZXJlbmNlcyA9IGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKVsxXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpOwotCQlmRW5hYmxlVGFza1RhZ3MgPSBkZWZhdWx0UHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfRU5BQkxFLCBmYWxzZSk7Ci0JCWZFbmFibGVDaGVja2JveC5zZXRTZWxlY3Rpb24oZkVuYWJsZVRhc2tUYWdzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFicy5sZW5ndGg7IGkrKykgewotCQkJZlRhYnNbaV0ucGVyZm9ybURlZmF1bHRzKCk7Ci0JCX0KLQkJZlRhYkVuYWJsZW1lbnRMaXN0ZW5lci53aWRnZXRTZWxlY3RlZChudWxsKTsKLQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRpbmcgZGVmYXVsdHMgaW4gIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIG9rID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0JCXNhdmUoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZUYWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmVGFic1tpXS5wZXJmb3JtT2soKTsKLQkJfQotCi0JCXByb21wdEZvclJlZGV0ZWN0SWZOZWNlc3NhcnkoKTsKLQotCQkvLyBzYXZlIGxhc3QgdGFiICh1c2UgRGVmYXVsdCBzY29wZSBzaW5jZSBpdCB3b24ndCBiZSBwZXJzaXN0ZWQpCi0JCW5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnB1dEludChUQVNLX1RBR19MQVNUX1RBQiwgZlRhYkZvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQotCQlJU2NvcGVDb250ZXh0W10gY29udGV4dHMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCk7Ci0JCS8vIHJlbW92ZSBwcm9qZWN0LXNwZWNpZmljIGluZm9ybWF0aW9uIGlmIGl0J3Mgbm90IGVuYWJsZWQKLQkJaWYgKGdldFByb2plY3QoKSAhPSBudWxsICYmICFpc0VsZW1lbnRTZXR0aW5nc0VuYWJsZWQoKSkgewotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZW1vdmluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BFUl9QUk9KRUNUICsgIiAoIiArIHRydWUgKyAiKSBpbiBzY29wZSAiICsgY29udGV4dHNbMF0uZ2V0TmFtZSgpICsgIjoiICsgY29udGV4dHNbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgIAotCQkJfQotCQkJY29udGV4dHNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5yZW1vdmUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BFUl9QUk9KRUNUKTsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVtb3ZpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCArICIgKCIgKyB0cnVlICsgIikgaW4gc2NvcGUgIiArIGNvbnRleHRzWzBdLmdldE5hbWUoKSArICI6IiArIGNvbnRleHRzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkICAKLQkJCX0KLQkJCWNvbnRleHRzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucmVtb3ZlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCk7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHJlbW92aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUFJJT1JJVElFUyArICIgKCIgKyB0cnVlICsgIikgaW4gc2NvcGUgIiArIGNvbnRleHRzWzBdLmdldE5hbWUoKSArICI6IiArIGNvbnRleHRzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkICAKLQkJCX0KLQkJCWNvbnRleHRzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucmVtb3ZlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QUklPUklUSUVTKTsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVtb3ZpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19UQUdTICsgIiAoIiArIHRydWUgKyAiKSBpbiBzY29wZSAiICsgY29udGV4dHNbMF0uZ2V0TmFtZSgpICsgIjoiICsgY29udGV4dHNbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgIAotCQkJfQotCQkJY29udGV4dHNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5yZW1vdmUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1RBR1MpOwotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZW1vdmluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0VOQUJMRSArICIgKCIgKyB0cnVlICsgIikgaW4gc2NvcGUgIiArIGNvbnRleHRzWzBdLmdldE5hbWUoKSArICI6IiArIGNvbnRleHRzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkICAKLQkJCX0KLQkJCWNvbnRleHRzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucmVtb3ZlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJY29udGV4dHNbaV0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5mbHVzaCgpOwotCQkJfQotCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigicHJvYmxlbSBzYXZpbmcgcHJlZmVyZW5jZSBzZXR0aW5ncyB0byBzY29wZSAiICsgY29udGV4dHNbaV0uZ2V0TmFtZSgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9rOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIHByb21wdEZvclJlZGV0ZWN0SWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChkZXRlY3Rpb25SZXF1ZXN0ZWQgPiAwKSB7Ci0JCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8yMiwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLmdldEltYWdlKCksIFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjMsIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sIG5ldyBTdHJpbmdbXXtTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzI0LCBTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzI1LCBTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzI2fSwgMik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJaW50IGJ1dHRvbiA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAoYnV0dG9uID09IDApIHsKLQkJCQlKb2IgcmVkZXRlY3RKb2IgPSBuZXcgSm9iKFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjcpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQlpZiAoZ2V0UHJvamVjdCgpID09IG51bGwpIHsKLQkJCQkJCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogcmVzY2FubmluZyBhbGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQlUYXNrU2Nhbm5pbmdTY2hlZHVsZXIucmVmcmVzaCgpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICI6IHJlc2Nhbm5pbmcgIiArIGdldFByb2plY3QoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJVGFza1NjYW5uaW5nU2NoZWR1bGVyLnJlZnJlc2goZ2V0UHJvamVjdCgpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlyZWRldGVjdEpvYi5zY2hlZHVsZSg1MDApOwotCQkJfQotCQkJZGV0ZWN0aW9uUmVxdWVzdGVkID0gMDsKLQkJfQotCX0KLQotCXZvaWQgcmVxdWVzdFJlZGV0ZWN0aW9uKCkgewotCQlkZXRlY3Rpb25SZXF1ZXN0ZWQrKzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZSgpIHsKLQkJaWYgKGZFbmFibGVUYXNrVGFncyAhPSBmT3JpZ2luYWxFbmFibGVUYXNrVGFncykgewotCQkJcmVxdWVzdFJlZGV0ZWN0aW9uKCk7Ci0JCX0KLQkJZk9yaWdpbmFsRW5hYmxlVGFza1RhZ3MgPSBmRW5hYmxlVGFza1RhZ3M7Ci0KLQkJSVNjb3BlQ29udGV4dFtdIHByZWZlcmVuY2VTY29wZXMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCk7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgZGVmYXVsdFByZWZlcmVuY2VzID0gcHJlZmVyZW5jZVNjb3Blc1sxXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpOwotCQlib29sZWFuIGRlZmF1bHRFbmFibGUgPSBkZWZhdWx0UHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfRU5BQkxFLCBmYWxzZSk7Ci0JCWlmIChmRW5hYmxlVGFza1RhZ3MgPT0gZGVmYXVsdEVuYWJsZSkgewotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZW1vdmluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0VOQUJMRSArICIgZnJvbSBzY29wZSAiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROYW1lKCkgKyAiOiIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnJlbW92ZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfRU5BQkxFKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgc2V0dGluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0VOQUJMRSArICIgXCIiICsgZkVuYWJsZVRhc2tUYWdzICsgIlwiIGluIHNjb3BlICIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5hbWUoKSArICI6IiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCX0KLQkJCXByZWZlcmVuY2VTY29wZXNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5wdXRCb29sZWFuKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUsIGZFbmFibGVUYXNrVGFncyk7Ci0JCX0KLQkJaWYgKGdldFByb2plY3QoKSAhPSBudWxsICYmIGlzRWxlbWVudFNldHRpbmdzRW5hYmxlZCgpKSB7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNldHRpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QRVJfUFJPSkVDVCArICIgKCIgKyB0cnVlICsgIikgaW4gc2NvcGUgIiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TmFtZSgpICsgIjoiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAgCi0JCQl9Ci0JCQlwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucHV0Qm9vbGVhbihUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUEVSX1BST0pFQ1QsIHRydWUpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZW1vdmluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BFUl9QUk9KRUNUICsgIiBmcm9tIHNjb3BlICIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5hbWUoKSArICI6IiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCX0KLQkJCXByZWZlcmVuY2VTY29wZXNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5yZW1vdmUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BFUl9QUk9KRUNUKTsKLQkJfQotCQl0cnkgewotCQkJZlByZWZlcmVuY2VzU2VydmljZS5nZXRSb290Tm9kZSgpLmZsdXNoKCk7Ci0JCX0KLQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgaXQsIHRoZXJlIGlzIG5vIHJlY292ZXJ5Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL0VkaXRvckV4ZWN1dGlvbkNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9FZGl0b3JFeGVjdXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MGQ5YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL0VkaXRvckV4ZWN1dGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5JRXhlY3V0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotY2xhc3MgRWRpdG9yRXhlY3V0aW9uQ29udGV4dCBpbXBsZW1lbnRzIElFeGVjdXRpb25EZWxlZ2F0ZSB7Ci0KLQkvKioKLQkgKiBSZXVzYWJsZSBydW5uYWJsZSBmb3IgdGhlIERpc3BsYXkgZXhlY3V0aW9uIHF1ZXVlIHRvIGN1dCBkb3duIG9uCi0JICogZ2FyYmFnZSBjcmVhdGlvbi4gV2lsbCBtYWtlIHVzZSBvZiB0aGUgcHJvZ3Jlc3Mgc2VydmljZSBpZiBwb3NzaWJsZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXVzYWJsZVVJUnVubmVyIGltcGxlbWVudHMgUnVubmFibGUsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0JCXByaXZhdGUgU3RydWN0dXJlZFRleHRFZGl0b3IgZWRpdG9yOwotCQlwcml2YXRlIElTYWZlUnVubmFibGUgZlJ1bm5hYmxlID0gbnVsbDsKLQotCQlSZXVzYWJsZVVJUnVubmVyKFN0cnVjdHVyZWRUZXh0RWRpdG9yIHBhcnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQllZGl0b3IgPSBwYXJ0OwotCQl9Ci0KLQkJLyoKLQkJICogRXhwZWN0ZWQgdG8gb25seSBiZSBydW4gYnkgRGlzcGxheSBxdWV1ZSBpbiB0aGUgVUkgVGhyZWFkCi0JCSAqIAotCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJSVdvcmtiZW5jaFBhcnRTaXRlIHNpdGUgPSBlZGl0b3IuZ2V0RWRpdG9yUGFydCgpLmdldFNpdGUoKTsKLQkJCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gKHNpdGUgPT0gbnVsbCkgPyBudWxsIDogc2l0ZS5nZXRXb3JrYmVuY2hXaW5kb3coKTsKLQkJCWZpbmFsIElXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlIGpvYlNlcnZpY2UgPSAoSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UpICgoc2l0ZSA9PSBudWxsKSA/IG51bGwgOiBzaXRlLmdldEFkYXB0ZXIoSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UuY2xhc3MpKTsKLQkJCS8qCi0JCQkgKiBUcnkgdG8gdXNlIHRoZSBwcm9ncmVzcyBzZXJ2aWNlIHNvIHRoZSB3b3JrYmVuY2ggY2FuIGdpdmUgbW9yZQotCQkJICogZmVlZGJhY2sgdG8gdGhlIHVzZXIgKGFsdGhvdWdoIGVkaXRvcnMgc2VlbSB0byBtYWtlIGxlc3MgdXNlIG9mCi0JCQkgKiB0aGUgc2VydmljZSB0aGFuIHZpZXdzIC0KLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjIyMSAuCi0JCQkgKi8KLQkJCWlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCAmJiBqb2JTZXJ2aWNlICE9IG51bGwpIHsKLQkJCQkvKgotCQkJCSAqIERvYyBpcyBhbWJpZ3VvdXMsIGJ1dCBpdCBtdXN0IGJlIHJ1biBmcm9tIHRoZSBVSSB0aHJlYWQgLQotCQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjUxODAKLQkJCQkgKi8KLQkJCQl0cnkgewotCQkJCQlqb2JTZXJ2aWNlLnJ1bkluVUkod29ya2JlbmNoV2luZG93LCB0aGlzLCAoSVNjaGVkdWxpbmdSdWxlKSBlZGl0b3IuZ2V0RWRpdG9yUGFydCgpLmdldEVkaXRvcklucHV0KCkuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qCi0JCQkJICogUnVuIGl0IGRpcmVjdGx5IGFuZCBkaXJlY3QgdGhlIFVJIG9mIHRoZSBlZGl0b3IuIFNlZQotCQkJCSAqIFN0cnVjdHVyZWRUZXh0RWRpdG9yJ3MgYmVnaW4vZW5kIGJhY2tncm91bmQgam9iIGZvciBvdGhlcgotCQkJCSAqIGFjdGl2aXRpZXMgdG8gYmVzdCBhY2NvbW1vZGF0ZSAoZm9yIGV4YW1wbGUsIHRoZXJlIGlzIGEKLQkJCQkgKiAidGltZWQgZGVsYXkiIGJlZm9yZSB0aGUgZWRpdG9yIGl0c2VsZiBsZWF2ZXMKLQkJCQkgKiBiYWNrZ3JvdW5kLXVwZGF0ZSBtb2RlKS4gTk9URTogdGhpcyBleGVjdXRlIG1ldGhvZCBpdHNlbGYKLQkJCQkgKiBpcyBhbHdheXMgY2FsbGVkIGZyb20gaW5zaWRlIG9mIGFuIElMb2NrIGJsb2NrLCBzbyBhbm90aGVyCi0JCQkJICogYmxvY2sgaXMgbm90IG5vdCBuZWVkZWQgaGVyZSBmb3IgYWxsIHRoZXNlIHN5Y25FeGVjJ3MuCi0JCQkJICovCi0JCQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBTU0VVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpOwotCQkJCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHdvcmtiZW5jaC5nZXREaXNwbGF5KCk7Ci0JCQkJaWYgKGRpc3BsYXkgIT0gbnVsbCAmJiAhZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZWRpdG9yLmJlZ2luQmFja2dyb3VuZE9wZXJhdGlvbigpOwotCQkJCQl0cnkgewotCQkJCQkJLyoKLQkJCQkJCSAqIEhlcmUncyB3aGVyZSB0aGUgZG9jdW1lbnQgdXBkYXRlL21vZGlmaWNhdGlvbgotCQkJCQkJICogb2NjdXJzCi0JCQkJCQkgKi8KLQkJCQkJCVNhZmVSdW5uZXIucnVuKGZSdW5uYWJsZSk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQkvKgotCQkJCQkJICogVGhpcyAnZW5kJyBpcyBqdXN0IGEgc2lnbmFsIHRvIGVkaXRvciB0aGF0IHRoaXMKLQkJCQkJCSAqIHBhcnRpY3VsYXIgdXBkYXRlIGlzIGRvbmUuIEl0cyB1cCB0byB0aGUgZWRpdG9yIHRvCi0JCQkJCQkgKiBkZWNpZGUgZXhhY3RseSB3aGVuIHRvIGxlYXZlIGl0cyAiYmFja2dyb3VuZCBtb2RlIgotCQkJCQkJICovCi0JCQkJCQllZGl0b3IuZW5kQmFja2dyb3VuZE9wZXJhdGlvbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZSdW5uYWJsZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlCi0JCSAqIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3MjcnVuKG9yZy5lY2xpcHNlCi0JCSAqIC5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQlpZiAoZlJ1bm5hYmxlICE9IG51bGwpCi0JCQkJU2FmZVJ1bm5lci5ydW4oZlJ1bm5hYmxlKTsKLQkJfQotCi0JCXZvaWQgc2V0UnVubmFibGUoSVNhZmVSdW5uYWJsZSByKSB7Ci0JCQlmUnVubmFibGUgPSByOwotCQl9Ci0JfQotCi0JU3RydWN0dXJlZFRleHRFZGl0b3IgZkVkaXRvcjsKLQlwcml2YXRlIFJldXNhYmxlVUlSdW5uZXIgZlJldXNhYmxlUnVubmVyOwotCi0JcHVibGljIEVkaXRvckV4ZWN1dGlvbkNvbnRleHQoU3RydWN0dXJlZFRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCWZFZGl0b3IgPSBlZGl0b3I7Ci0JCWZSZXVzYWJsZVJ1bm5lciA9IG5ldyBSZXVzYWJsZVVJUnVubmVyKGZFZGl0b3IpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUKLQkgKiBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuSUV4ZWN1dGlvbkRlbGVnYXRlI2V4ZWN1dGUoamF2YS5sYW5nCi0JICogLlJ1bm5hYmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgSVNhZmVSdW5uYWJsZSBydW5uYWJsZSkgewotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFNTRVVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCk7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHdvcmtiZW5jaC5nZXREaXNwbGF5KCk7Ci0JCWlmIChkaXNwbGF5LmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKLQkJCS8vICpJZiBhbHJlYWR5IGluIGRpc3BsYXkgdGhyZWFkLCB3ZSBjYW4gc2ltcGx5IHJ1biwgImFzIHVzdWFsIiovCi0JCQlTYWZlUnVubmVyLnJ1bihydW5uYWJsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyAqb3RoZXJ3aXNlIHJ1biB0aHJvdWdoIHRoZSByZXVzYWJsZSBydW5uZXIgKi8KLQkJCWZSZXVzYWJsZVJ1bm5lci5zZXRSdW5uYWJsZShydW5uYWJsZSk7Ci0JCQlkaXNwbGF5LnN5bmNFeGVjKGZSZXVzYWJsZVJ1bm5lcik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvRW5jb2RpbmdTdXBwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvRW5jb2RpbmdTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMDU0ZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL0VuY29kaW5nU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5EZWZhdWx0RW5jb2RpbmdTdXBwb3J0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUVuY29kaW5nU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TdGF0dXNUZXh0RWRpdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXI7DQotDQotLyoqDQotICogQW4gaW1wbGVtZW50YXRpb24gdGhhdCB3aWxsIHRyeSB0byB1c2UgYSA8Yj5wcm92aXNpb25hbDwvYj4gY29uZmlndXJhdGlvbg0KLSAqIGlmIElFbmNvZGluZ1N1cHBvcnQuY2xhc3MgYXMgYSBkZWxlZ2F0ZS4gQSBkZWxlZ2F0ZSwgaWYgZm91bmQsIHdpbGwgYmUNCi0gKiBhc2tlZCBmb3IgZW5jb2RpbmcgaW5mb3JtYXRpb24gYmVmb3JlIGRlZmF1bHRpbmcgdG8gdGhlIHN1cGVyY2xhc3MNCi0gKiBpbXBsZW1lbnRhdGlvbiwgYnV0IHdpbGwgYmUgdG9sZCB0byBzZXQgdGhlIGVuY29kaW5nIGFmdGVyIHRoZSBzdXBlcmNsYXNzDQotICogaGFzLiBEZWxlZ2F0ZXMgc2hvdWxkIG5vdCBkdXBsaWNhdGUgYW55IGZ1bmN0aW9uYWxpdHkgaW4gdGhlDQotICogRGVmYXVsdEVuY29kaW5nU3VwcG9ydCBpbXBsZW1lbnRhdGlvbiBhcyB0aGV5IG1heSBiZSBleGVjdXRlZCBpbiBhZGRpdGlvbg0KLSAqIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yLg0KLSAqLw0KLWNsYXNzIEVuY29kaW5nU3VwcG9ydCBleHRlbmRzIERlZmF1bHRFbmNvZGluZ1N1cHBvcnQgew0KLQlwcml2YXRlIFN0cmluZ1tdIGZDb25maWd1cmF0aW9uUG9pbnRzID0gbnVsbDsNCi0JLyoqIFRoZSBlZGl0b3IgdGhpcyBzdXBwb3J0IGlzIGFzc29jaWF0ZWQgd2l0aC4gKi8NCi0JcHJpdmF0ZSBTdGF0dXNUZXh0RWRpdG9yIGZTdGF0dXNUZXh0RWRpdG9yOw0KLQ0KLQlJRW5jb2RpbmdTdXBwb3J0IGZTdXBwb3J0RGVsZWdhdGUgPSBudWxsOw0KLQ0KLQlFbmNvZGluZ1N1cHBvcnQoU3RyaW5nW10gY29uZmlndXJhdGlvblBvaW50cykgew0KLQkJc3VwZXIoKTsNCi0JCWZDb25maWd1cmF0aW9uUG9pbnRzID0gY29uZmlndXJhdGlvblBvaW50czsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5EZWZhdWx0RW5jb2RpbmdTdXBwb3J0I2Rpc3Bvc2UoKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCi0JCXN1cGVyLmRpc3Bvc2UoKTsNCi0NCi0JCWlmIChmU3VwcG9ydERlbGVnYXRlIGluc3RhbmNlb2YgRGVmYXVsdEVuY29kaW5nU3VwcG9ydCkgew0KLQkJCSgoRGVmYXVsdEVuY29kaW5nU3VwcG9ydCkgZlN1cHBvcnREZWxlZ2F0ZSkuZGlzcG9zZSgpOw0KLQkJfQ0KLQkJZlN1cHBvcnREZWxlZ2F0ZSA9IG51bGw7DQotCQlmU3RhdHVzVGV4dEVkaXRvciA9IG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZW9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5EZWZhdWx0RW5jb2RpbmdTdXBwb3J0Iw0KLQkgKiBnZXREZWZhdWx0RW5jb2RpbmcoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RW5jb2RpbmcoKSB7DQotCQlJRW5jb2RpbmdTdXBwb3J0IGRlbGVnYXRlID0gZ2V0RW5jb2RpbmdTdXBwb3J0RGVsZWdhdGUoKTsNCi0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7DQotCQkJcmV0dXJuIGRlbGVnYXRlLmdldERlZmF1bHRFbmNvZGluZygpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRFbmNvZGluZygpOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LkRlZmF1bHRFbmNvZGluZ1N1cHBvcnQjZ2V0RW5jb2RpbmcgKCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7DQotCQlJRW5jb2RpbmdTdXBwb3J0IGRlbGVnYXRlID0gZ2V0RW5jb2RpbmdTdXBwb3J0RGVsZWdhdGUoKTsNCi0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7DQotCQkJcmV0dXJuIGRlbGVnYXRlLmdldEVuY29kaW5nKCk7DQotCQl9DQotDQotCQlyZXR1cm4gc3VwZXIuZ2V0RW5jb2RpbmcoKTsNCi0JfQ0KLQ0KLQlJRW5jb2RpbmdTdXBwb3J0IGdldEVuY29kaW5nU3VwcG9ydERlbGVnYXRlKCkgew0KLQkJaWYgKGZTdXBwb3J0RGVsZWdhdGUgPT0gbnVsbCkgew0KLQkJCUV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRlciA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKTsNCi0JCQlmb3IgKGludCBpID0gMDsgZlN1cHBvcnREZWxlZ2F0ZSA9PSBudWxsICYmIGkgPCBmQ29uZmlndXJhdGlvblBvaW50cy5sZW5ndGg7IGkrKykgew0KLQkJCQlmU3VwcG9ydERlbGVnYXRlID0gKElFbmNvZGluZ1N1cHBvcnQpIGJ1aWxkZXIuZ2V0Q29uZmlndXJhdGlvbihJRW5jb2RpbmdTdXBwb3J0LmNsYXNzLmdldE5hbWUoKSwgZkNvbmZpZ3VyYXRpb25Qb2ludHNbaV0pOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBmU3VwcG9ydERlbGVnYXRlOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUNCi0JICogb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LkRlZmF1bHRFbmNvZGluZ1N1cHBvcnQjaW5pdGlhbGl6ZShvcmcuZWNsaXBzZQ0KLQkgKiAudWkudGV4dGVkaXRvci5TdGF0dXNUZXh0RWRpdG9yKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTdGF0dXNUZXh0RWRpdG9yIHRleHRFZGl0b3IpIHsNCi0JCXN1cGVyLmluaXRpYWxpemUodGV4dEVkaXRvcik7DQotCQlmU3RhdHVzVGV4dEVkaXRvciA9IHRleHRFZGl0b3I7DQotDQotCQlJRW5jb2RpbmdTdXBwb3J0IGVuY29kaW5nU3VwcG9ydERlbGVnYXRlID0gZ2V0RW5jb2RpbmdTdXBwb3J0RGVsZWdhdGUoKTsNCi0JCWlmIChlbmNvZGluZ1N1cHBvcnREZWxlZ2F0ZSBpbnN0YW5jZW9mIERlZmF1bHRFbmNvZGluZ1N1cHBvcnQpIHsNCi0JCQkoKERlZmF1bHRFbmNvZGluZ1N1cHBvcnQpIGVuY29kaW5nU3VwcG9ydERlbGVnYXRlKS5pbml0aWFsaXplKHRleHRFZGl0b3IpOw0KLQkJfQ0KLQl9DQotDQotCXZvaWQgcmVpbml0aWFsaXplKFN0cmluZ1tdIGNvbmZpZ3VyYXRpb25Qb2ludHMpIHsNCi0JCWlmIChmU3VwcG9ydERlbGVnYXRlIGluc3RhbmNlb2YgRGVmYXVsdEVuY29kaW5nU3VwcG9ydCkgew0KLQkJCSgoRGVmYXVsdEVuY29kaW5nU3VwcG9ydCkgZlN1cHBvcnREZWxlZ2F0ZSkuZGlzcG9zZSgpOw0KLQkJfQ0KLQkJZlN1cHBvcnREZWxlZ2F0ZSA9IG51bGw7DQotDQotCQlmQ29uZmlndXJhdGlvblBvaW50cyA9IGNvbmZpZ3VyYXRpb25Qb2ludHM7DQotDQotCQlJRW5jb2RpbmdTdXBwb3J0IGVuY29kaW5nU3VwcG9ydERlbGVnYXRlID0gZ2V0RW5jb2RpbmdTdXBwb3J0RGVsZWdhdGUoKTsNCi0JCWlmIChlbmNvZGluZ1N1cHBvcnREZWxlZ2F0ZSBpbnN0YW5jZW9mIERlZmF1bHRFbmNvZGluZ1N1cHBvcnQpIHsNCi0JCQkoKERlZmF1bHRFbmNvZGluZ1N1cHBvcnQpIGVuY29kaW5nU3VwcG9ydERlbGVnYXRlKS5pbml0aWFsaXplKGZTdGF0dXNUZXh0RWRpdG9yKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5EZWZhdWx0RW5jb2RpbmdTdXBwb3J0I3NldEVuY29kaW5nDQotCSAqIChqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQ0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nLCBib29sZWFuIG92ZXJ3cml0ZSkgew0KLQkJc3VwZXIuc2V0RW5jb2RpbmcoZW5jb2RpbmcsIG92ZXJ3cml0ZSk7DQotDQotCQlJRW5jb2RpbmdTdXBwb3J0IGRlbGVnYXRlID0gZ2V0RW5jb2RpbmdTdXBwb3J0RGVsZWdhdGUoKTsNCi0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsICYmIG92ZXJ3cml0ZSkgew0KLQkJCWRlbGVnYXRlLnNldEVuY29kaW5nKGVuY29kaW5nKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvRm9sZGluZ0FjdGlvbkdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvRm9sZGluZ0FjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MjIyMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL0ZvbGRpbmdBY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aTsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRPcGVyYXRpb25UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLklQcm9qZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklGb2xkaW5nQ29tbWFuZElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlJlc291cmNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGV4dE9wZXJhdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uQWJzdHJhY3RTdHJ1Y3R1cmVkRm9sZGluZ1N0cmF0ZWd5OwotCi1jbGFzcyBGb2xkaW5nQWN0aW9uR3JvdXAgZXh0ZW5kcyBBY3Rpb25Hcm91cCB7Ci0JcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUHJlZmVyZW5jZUFjdGlvbiBleHRlbmRzIFJlc291cmNlQWN0aW9uIGltcGxlbWVudHMgSVVwZGF0ZSB7Ci0JCVByZWZlcmVuY2VBY3Rpb24oUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBTdHJpbmcgcHJlZml4LCBpbnQgc3R5bGUpIHsKLQkJCXN1cGVyKGJ1bmRsZSwgcHJlZml4LCBzdHlsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFByb2plY3Rpb25WaWV3ZXIgZlZpZXdlcjsKLQotCXByaXZhdGUgZmluYWwgUHJlZmVyZW5jZUFjdGlvbiBmVG9nZ2xlOwotCXByaXZhdGUgZmluYWwgVGV4dE9wZXJhdGlvbkFjdGlvbiBmRXhwYW5kOwotCXByaXZhdGUgZmluYWwgVGV4dE9wZXJhdGlvbkFjdGlvbiBmRXhwYW5kQWxsOwotCXByaXZhdGUgZmluYWwgSVByb2plY3Rpb25MaXN0ZW5lciBmUHJvamVjdGlvbkxpc3RlbmVyOwotCXByaXZhdGUgZmluYWwgVGV4dE9wZXJhdGlvbkFjdGlvbiBmQ29sbGFwc2U7Ci0JcHJpdmF0ZSBmaW5hbCBUZXh0T3BlcmF0aW9uQWN0aW9uIGZDb2xsYXBzZUFsbDsKLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBwcm9qZWN0aW9uIGFjdGlvbiBncm91cCBmb3IgPGNvZGU+ZWRpdG9yPC9jb2RlPi4gSWYKLQkgKiB0aGUgc3VwcGxpZWQgdmlld2VyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiA8Y29kZT5Qcm9qZWN0aW9uVmlld2VyPC9jb2RlPiwKLQkgKiB0aGUgYWN0aW9uIGdyb3VwIGlzIGRpc2FibGVkLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGVkaXRvciB0byBvcGVyYXRlIG9uCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlciBvZiB0aGUgZWRpdG9yCi0JICovCi0JcHVibGljIEZvbGRpbmdBY3Rpb25Hcm91cChmaW5hbCBJVGV4dEVkaXRvciBlZGl0b3IsIElUZXh0Vmlld2VyIHZpZXdlcikgewotCQlpZiAoISh2aWV3ZXIgaW5zdGFuY2VvZiBQcm9qZWN0aW9uVmlld2VyKSkgewotCQkJZlRvZ2dsZSA9IG51bGw7Ci0JCQlmRXhwYW5kID0gbnVsbDsKLQkJCWZFeHBhbmRBbGwgPSBudWxsOwotCQkJZkNvbGxhcHNlID0gbnVsbDsKLQkJCWZDb2xsYXBzZUFsbCA9IG51bGw7Ci0JCQlmUHJvamVjdGlvbkxpc3RlbmVyID0gbnVsbDsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZWaWV3ZXIgPSAoUHJvamVjdGlvblZpZXdlcikgdmlld2VyOwotCi0JCWZQcm9qZWN0aW9uTGlzdGVuZXIgPSBuZXcgSVByb2plY3Rpb25MaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgcHJvamVjdGlvbkVuYWJsZWQoKSB7Ci0JCQkJdXBkYXRlKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHByb2plY3Rpb25EaXNhYmxlZCgpIHsKLQkJCQl1cGRhdGUoKTsKLQkJCX0KLQkJfTsKLQotCQlmVmlld2VyLmFkZFByb2plY3Rpb25MaXN0ZW5lcihmUHJvamVjdGlvbkxpc3RlbmVyKTsKLQotCQlmVG9nZ2xlID0gbmV3IFByZWZlcmVuY2VBY3Rpb24oU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCAiUHJvamVjdGlvbl9Ub2dnbGVfIiwgSUFjdGlvbi5BU19DSEVDS19CT1gpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQkJYm9vbGVhbiBjdXJyZW50ID0gc3RvcmUuZ2V0Qm9vbGVhbihBYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nU3RyYXRlZ3kuRk9MRElOR19FTkFCTEVEKTsKLQkJCQlzdG9yZS5zZXRWYWx1ZShBYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nU3RyYXRlZ3kuRk9MRElOR19FTkFCTEVELCAhY3VycmVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJCQlJVGV4dE9wZXJhdGlvblRhcmdldCB0YXJnZXQgPSAoSVRleHRPcGVyYXRpb25UYXJnZXQpIGVkaXRvci5nZXRBZGFwdGVyKElUZXh0T3BlcmF0aW9uVGFyZ2V0LmNsYXNzKTsKLQotCQkJCWJvb2xlYW4gaXNFbmFibGVkID0gKHRhcmdldCAhPSBudWxsICYmIHRhcmdldC5jYW5Eb09wZXJhdGlvbihQcm9qZWN0aW9uVmlld2VyLlRPR0dMRSkpOwotCQkJCXNldEVuYWJsZWQoaXNFbmFibGVkKTsKLQkJCX0KLQkJfTsKLQkJCi0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWJvb2xlYW4gY2hlY2tlZCA9IHN0b3JlLmdldEJvb2xlYW4oQWJzdHJhY3RTdHJ1Y3R1cmVkRm9sZGluZ1N0cmF0ZWd5LkZPTERJTkdfRU5BQkxFRCk7Ci0JCWZUb2dnbGUuc2V0Q2hlY2tlZChjaGVja2VkKTsKLQkJZlRvZ2dsZS5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUZvbGRpbmdDb21tYW5kSWRzLkZPTERJTkdfVE9HR0xFKTsKLQkJZWRpdG9yLnNldEFjdGlvbigiRm9sZGluZ1RvZ2dsZSIsIGZUb2dnbGUpOyAvLyROT04tTkxTLTEkCi0KLQkJZkV4cGFuZCA9IG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKFNTRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgIlByb2plY3Rpb25fRXhwYW5kXyIsIGVkaXRvciwgUHJvamVjdGlvblZpZXdlci5FWFBBTkQsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWZFeHBhbmQuc2V0QWN0aW9uRGVmaW5pdGlvbklkKElGb2xkaW5nQ29tbWFuZElkcy5GT0xESU5HX0VYUEFORCk7Ci0JCWVkaXRvci5zZXRBY3Rpb24oIkZvbGRpbmdFeHBhbmQiLCBmRXhwYW5kKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZFeHBhbmRBbGwgPSBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihTU0VVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCksICJQcm9qZWN0aW9uX0V4cGFuZEFsbF8iLCBlZGl0b3IsIFByb2plY3Rpb25WaWV3ZXIuRVhQQU5EX0FMTCwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJZkV4cGFuZEFsbC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUZvbGRpbmdDb21tYW5kSWRzLkZPTERJTkdfRVhQQU5EX0FMTCk7Ci0JCWVkaXRvci5zZXRBY3Rpb24oIkZvbGRpbmdFeHBhbmRBbGwiLCBmRXhwYW5kQWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZDb2xsYXBzZSA9IG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKFNTRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgIlByb2plY3Rpb25fQ29sbGFwc2VfIiwgZWRpdG9yLCBQcm9qZWN0aW9uVmlld2VyLkNPTExBUFNFLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlmQ29sbGFwc2Uuc2V0QWN0aW9uRGVmaW5pdGlvbklkKElGb2xkaW5nQ29tbWFuZElkcy5GT0xESU5HX0NPTExBUFNFKTsKLQkJZWRpdG9yLnNldEFjdGlvbigiRm9sZGluZ0NvbGxhcHNlIiwgZkNvbGxhcHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZDb2xsYXBzZUFsbCA9IG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKFNTRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgIlByb2plY3Rpb25fQ29sbGFwc2VBbGxfIiwgZWRpdG9yLCBQcm9qZWN0aW9uVmlld2VyLkNPTExBUFNFX0FMTCwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJZkNvbGxhcHNlQWxsLnNldEFjdGlvbkRlZmluaXRpb25JZChJRm9sZGluZ0NvbW1hbmRJZHMuRk9MRElOR19DT0xMQVBTRV9BTEwpOwotCQllZGl0b3Iuc2V0QWN0aW9uKCJGb2xkaW5nQ29sbGFwc2VBbGwiLCBmQ29sbGFwc2VBbGwpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ3JvdXAgaXMgZW5hYmxlZC4KLQkgKiAKLQkgKiA8cHJlPgotCSAqICAgICAgICBJbnZhcmlhbnQ6IGlzRW5hYmxlZCgpICZsdDs9Jmd0OyBmVmlld2VyIGFuZCBhbGwgYWN0aW9ucyBhcmUgIT0gbnVsbC4KLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBncm91cCBpcyBlbmFibGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gZlZpZXdlciAhPSBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChpc0VuYWJsZWQoKSkgewotCQkJZlZpZXdlci5yZW1vdmVQcm9qZWN0aW9uTGlzdGVuZXIoZlByb2plY3Rpb25MaXN0ZW5lcik7Ci0JCQlmVmlld2VyID0gbnVsbDsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7Ci0JCWlmIChpc0VuYWJsZWQoKSkgewotCQkJZlRvZ2dsZS51cGRhdGUoKTsKLQkJCWZUb2dnbGUuc2V0Q2hlY2tlZChmVmlld2VyLmlzUHJvamVjdGlvbk1vZGUoKSk7Ci0JCQlmRXhwYW5kLnVwZGF0ZSgpOwotCQkJZkV4cGFuZEFsbC51cGRhdGUoKTsKLQkJCWZDb2xsYXBzZS51cGRhdGUoKTsKLQkJCWZDb2xsYXBzZUFsbC51cGRhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSBtZW51IHdpdGggYWxsIGZvbGRpbmcgYWN0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gbWFuYWdlcgotCSAqICAgICAgICAgICAgdGhlIG1lbnUgbWFuYWdlciBmb3IgdGhlIGZvbGRpbmcgc3VibWVudQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCWlmIChpc0VuYWJsZWQoKSkgewotCQkJdXBkYXRlKCk7Ci0JCQltYW5hZ2VyLmFkZChmVG9nZ2xlKTsKLQkJCW1hbmFnZXIuYWRkKGZFeHBhbmQpOwotCQkJbWFuYWdlci5hZGQoZkV4cGFuZEFsbCk7Ci0JCQltYW5hZ2VyLmFkZChmQ29sbGFwc2UpOwotCQkJbWFuYWdlci5hZGQoZkNvbGxhcHNlQWxsKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwI3VwZGF0ZUFjdGlvbkJhcnMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUFjdGlvbkJhcnMoKSB7Ci0JCXVwZGF0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9JQ29udGVudFNlbGVjdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvSUNvbnRlbnRTZWxlY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGFiMTkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9JQ29udGVudFNlbGVjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotCi0vKioKLSAqIEFsbG93cyBjb250cmlidXRvcnMgdG8gcmVkZWZpbmUgYSBzZWxlY3Rpb24gd2hlbiBwcm92aWRlZCB3aXRoIHRoZSBjdXJyZW50Ci0gKiBzZWxlY3Rpb24uCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudFNlbGVjdGlvblByb3ZpZGVyIHsKLQlJU2VsZWN0aW9uIGdldFNlbGVjdGlvbihUcmVlVmlld2VyIHZpZXdlciwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL0lTZW1hbnRpY0hpZ2hsaWdodGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL0lTZW1hbnRpY0hpZ2hsaWdodGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODE5M2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9JU2VtYW50aWNIaWdobGlnaHRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIHByZWZlcmVuY2VzIGFuZCBjb25zdW1hYmlsaXR5IGZvciBzZW1hbnRpYyBoaWdobGlnaHRpbmcuCi0gKiBUaGUgcHJlZmVyZW5jZSBrZXlzIHByb3ZpZGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBhcmUgc3RvcmVkIHdpdGhpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZQotICogcHJvdmlkZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uLiBXaGVuIGEgcmVnaW9uIGlzIGNvbnN1bWFibGUgYnkgdGhlIHNlbWFudGljIGhpZ2hsaWdodGluZywKLSAqIHRoZSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBhbiBhcnJheSBvZiBwb3NpdGlvbnMgdG8gc3R5bGUuCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlbWFudGljSGlnaGxpZ2h0aW5nIHsKLQkKLQkvKioKLQkgKiBUaGUgcHJlZmVyZW5jZSBrZXkgdGhhdCBjb250cm9scyB0aGUgdGV4dCdzIGJvbGQgYXR0cmlidXRlIGZvciB0aGUgc2VtYW50aWMgaGlnaGxpZ2h0aW5nCi0JICogQHJldHVybiB0aGUgYm9sZCBwcmVmZXJlbmNlIGtleQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9sZFByZWZlcmVuY2VLZXkoKTsKLQkKLQkvKioKLQkgKiBUaGUgcHJlZmVyZW5jZSBrZXkgdGhhdCBjb250cm9scyB0aGUgdGV4dCdzIHVuZGVybGluZSBhdHRyaWJ1dGUgZm9yIHRoZSBzZW1hbnRpYyBoaWdobGlnaHRpbmcKLQkgKiBAcmV0dXJuIHRoZSBib2xkIHByZWZlcmVuY2Uga2V5Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRVbmRlcmxpbmVQcmVmZXJlbmNlS2V5KCk7Ci0JCi0JLyoqCi0JICogVGhlIHByZWZlcmVuY2Uga2V5IHRoYXQgY29udHJvbHMgdGhlIHRleHQncyBzdHJpa2V0aHJvdWdoIGF0dHJpYnV0ZSBmb3IgdGhlIHNlbWFudGljIGhpZ2hsaWdodGluZwotCSAqIEByZXR1cm4gdGhlIGJvbGQgcHJlZmVyZW5jZSBrZXkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmlrZXRocm91Z2hQcmVmZXJlbmNlS2V5KCk7Ci0JCi0JLyoqCi0JICogVGhlIHByZWZlcmVuY2Uga2V5IHRoYXQgY29udHJvbHMgdGhlIHRleHQncyBpdGFsaWMgYXR0cmlidXRlIGZvciB0aGUgc2VtYW50aWMgaGlnaGxpZ2h0aW5nCi0JICogQHJldHVybiB0aGUgYm9sZCBwcmVmZXJlbmNlIGtleQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SXRhbGljUHJlZmVyZW5jZUtleSgpOwotCQotCS8qKgotCSAqIFRoZSBwcmVmZXJlbmNlIGtleSB0aGF0IGNvbnRyb2xzIHRoZSB0ZXh0J3MgY29sb3IgYXR0cmlidXRlIGZvciB0aGUgc2VtYW50aWMgaGlnaGxpZ2h0aW5nCi0JICogQHJldHVybiB0aGUgYm9sZCBwcmVmZXJlbmNlIGtleQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sb3JQcmVmZXJlbmNlS2V5KCk7Ci0JCi0JLyoqCi0JICogVGhlIHByZWZlcmVuY2Ugc3RvcmUgdGhhdCBtYWludGFpbnMgdGhlIHByZWZlcmVuY2VzIGZvciB0aGUgc2VtYW50aWMgaGlnaGxpZ2h0aW5nCi0JICogQHJldHVybiB0aGUgYm9sZCBwcmVmZXJlbmNlIGtleQotCSAqLwotCXB1YmxpYyBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQotCS8qKgotCSAqIFRoZSBwcmVmZXJlbmNlIGtleSB0aGF0IGNvbnRyb2xzIGlmIHRoZSBzZW1hbnRpYyBoaWdobGlnaHRpbmcgaXMgZW5hYmxlZAotCSAqIEByZXR1cm4gdGhlIGJvbGQgcHJlZmVyZW5jZSBrZXkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuYWJsZWRQcmVmZXJlbmNlS2V5KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBkaXNwbGF5IG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHBvc2l0aW9ucyBpZmYgdGhlIHNlbWFudGljIGhpZ2hsaWdodGluZyBjb25zdW1lcyBhbnkgcGFydCBvZiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24uCi0JICogPHA+Ci0JICogTk9URTogSW1wbGVtZW50b3JzIGFyZSBub3QgYWxsb3dlZCB0byBrZWVwIGEgcmVmZXJlbmNlIG9uIHRoZSByZWdpb24gb3Igb24gYW55IG9iamVjdAotCSAqIHJldHJpZXZlZCBmcm9tIHRoZSByZWdpb24uCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHJlZ2lvbiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHBvc2l0aW9ucyB0byBjb25zdW1lIGlmZiB0aGUgc2VtYW50aWMgaGlnaGxpZ2h0aW5nIGNvbnN1bWVzIGFueSBwYXJ0IG9mIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiwgb3RoZXJ3aXNlIG51bGwKLQkgKi8KLQlwdWJsaWMgUG9zaXRpb25bXSBjb25zdW1lcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvSVNlbWFudGljSGlnaGxpZ2h0aW5nRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvSVNlbWFudGljSGlnaGxpZ2h0aW5nRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MzM5OGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL0lTZW1hbnRpY0hpZ2hsaWdodGluZ0V4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLS8qKgotICogRXh0ZW5kcyB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5JU2VtYW50aWNIaWdobGlnaHRpbmd9IGFsbG93aW5nIGNsaWVudHMgdG8KLSAqIGRlZmluZSBjb25zdW1hYmlsaXR5IHdpdGggcmVzcGVjdCB0byBpbmRleGVkIHJlZ2lvbnMgY29udGFpbmluZyB0aGUgc3RydWN0dXJlZAotICogZG9jdW1lbnQgcmVnaW9uLgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlbWFudGljSGlnaGxpZ2h0aW5nRXh0ZW5zaW9uIHsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgcG9zaXRpb25zIGlmZiB0aGUgc2VtYW50aWMgaGlnaGxpZ2h0aW5nIGNvbnN1bWVzIGFueSBwYXJ0IG9mIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbgotCSAqCi0JICogPHA+Ci0JICogTk9URTogSW1wbGVtZW50b3JzIGFyZSBub3QgYWxsb3dlZCB0byBrZWVwIGEgcmVmZXJlbmNlIG9uIHRoZSBlaXRoZXIgcmVnaW9ucyBvciBvbiBhbnkgb2JqZWN0Ci0JICogcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lvbnMuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGRvY3VtZW50UmVnaW9uIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBpbmRleGVkUmVnaW9uIHRoZSBpbmRleGVkIHJlZ2lvbiB0aGF0IGNvbnRhaW5zIHRoZSA8Y29kZT5kb2N1bWVudFJlZ2lvbjwvY29kZT4KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHBvc2l0aW9ucyB0byBjb25zdW1lIGlmZiB0aGUgc2VtYW50aWMgaGlnaGxpZ2h0aW5nIGNvbnN1bWVzIGFueSBwYXJ0IG9mIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiwgb3RoZXJ3aXNlIG51bGwKLQkgKi8KLQlwdWJsaWMgUG9zaXRpb25bXSBjb25zdW1lcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24pOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI0ODZiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvU3RydWN0dXJlZFNvdXJjZVZpZXdlckRlY29yYXRpb25TdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uUGFpbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbkFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JT3ZlcnZpZXdSdWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU2hhcmVkVGV4dENvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQW5ub3RhdGlvblByZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Tb3VyY2VWaWV3ZXJEZWNvcmF0aW9uU3VwcG9ydDsKLQotY2xhc3MgU3RydWN0dXJlZFNvdXJjZVZpZXdlckRlY29yYXRpb25TdXBwb3J0IGV4dGVuZHMgU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQgewotCXB1YmxpYyBTdHJ1Y3R1cmVkU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIElPdmVydmlld1J1bGVyIG92ZXJ2aWV3UnVsZXIsIElBbm5vdGF0aW9uQWNjZXNzIGFubm90YXRpb25BY2Nlc3MsIElTaGFyZWRUZXh0Q29sb3JzIHNoYXJlZFRleHRDb2xvcnMpIHsKLQkJc3VwZXIoc291cmNlVmlld2VyLCBvdmVydmlld1J1bGVyLCBhbm5vdGF0aW9uQWNjZXNzLCBzaGFyZWRUZXh0Q29sb3JzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvblBhaW50ZXIgY3JlYXRlQW5ub3RhdGlvblBhaW50ZXIoKSB7Ci0JCS8qCi0JCSAqIFRoZSBuZXcgc3F1aWdnbHkgZHJhd2VyIGRlcGVuZHMgb24gdGhlIHByZXNlbnRhdGlvbiByZWNvbmNpbGVyIHRvCi0JCSAqIGRyYXcgaXRzIHNxdWlnZ2xlcy4gVW5mb3J0dW5hdGVseSwgU3RydWN0dXJlZFRleHRFZGl0b3JzIGNhbm5vdCB1c2UKLQkJICogdGhlIHByZXNlbnRhdGlvbiByZWNvbmNpbGVyIGJlY2F1c2UgaXQgY29uZmxpY3RzIHdpdGggaXRzCi0JCSAqIGhpZ2hsaWdodGVyLiBPdmVycmlkaW5nIGNyZWF0ZUFubm90YXRpb25QYWludGVyIHNvIHRoYXQgaXQgaXMKLQkJICogZm9yY2VkIHRvIHVzZSB0aGUgb2xkIHNxdWlnZ2x5IHBhaW50ZXIgaW5zdGVhZCBvZiB0aGUgbmV3IG9uZS4gU2VlCi0JCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDE5MjgKLQkJICovCi0JCUFubm90YXRpb25QYWludGVyIHBhaW50ZXIgPSBzdXBlci5jcmVhdGVBbm5vdGF0aW9uUGFpbnRlcigpOwotCQkvLyBkb250IHVzZSBuZXcgc3F1aWdnbHkgcGFpbnRlcgotCQlwYWludGVyLmFkZFRleHRTdHlsZVN0cmF0ZWd5KEFubm90YXRpb25QcmVmZXJlbmNlLlNUWUxFX1NRVUlHR0xFUywgbnVsbCk7Ci0JCS8vIHVzZSBvbGQgb25lCi0JCXBhaW50ZXIuYWRkRHJhd2luZ1N0cmF0ZWd5KEFubm90YXRpb25QcmVmZXJlbmNlLlNUWUxFX1NRVUlHR0xFUywgbmV3IEFubm90YXRpb25QYWludGVyLlNxdWlnZ2xlc1N0cmF0ZWd5KCkpOwotCQkvLyBkb250IHVzZSBuZXcgcHJvYmxlbSB1bmRlcmxpbmUgcGFpbnRlcgotCQlwYWludGVyLmFkZFRleHRTdHlsZVN0cmF0ZWd5KEFubm90YXRpb25QcmVmZXJlbmNlLlNUWUxFX1BST0JMRU1fVU5ERVJMSU5FLCBudWxsKTsKLQkJLy8gdXNlIG9sZCBvbmUKLQkJcGFpbnRlci5hZGREcmF3aW5nU3RyYXRlZ3koQW5ub3RhdGlvblByZWZlcmVuY2UuU1RZTEVfUFJPQkxFTV9VTkRFUkxJTkUsIG5ldyBBbm5vdGF0aW9uUGFpbnRlci5TcXVpZ2dsZXNTdHJhdGVneSgpKTsKLQkJcmV0dXJuIHBhaW50ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL1N0cnVjdHVyZWRUZXh0RWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvU3RydWN0dXJlZFRleHRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5ZTRkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvU3RydWN0dXJlZFRleHRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVGltZXI7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVyVGFzazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklUb2dnbGVCcmVha3BvaW50c1RhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQWJzdHJhY3RJbmZvcm1hdGlvbkNvbnRyb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0SW5mb3JtYXRpb25Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUJsb2NrVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JU2VsZWN0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0T3BlcmF0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXJFeHRlbnNpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXJFeHRlbnNpb241OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25QcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLkluZm9ybWF0aW9uUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkRlZmF1bHRDaGFyYWN0ZXJQYWlyTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JVmVydGljYWxSdWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5MaW5lQ2hhbmdlSG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25TdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklQb3N0U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmVyaWZ5S2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb250ZXh0cy5JQ29udGV4dFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LkVkaXRvcnNVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSVRleHRFZGl0b3JIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5JSGFuZGxlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTaG93SW5UYXJnZXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQ2hhaW5lZFByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkRlZmF1bHRSYW5nZUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklBYnN0cmFjdFRleHRFZGl0b3JIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVN0YXR1c0ZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JFeHRlbnNpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JFeHRlbnNpb240OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JFeHRlbnNpb241OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZXh0T3BlcmF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuSUV4ZWN1dGlvbkRlbGVnYXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5FeHRlbmRlZEVkaXRvckRyb3BUYXJnZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSUV4dGVuZGVkQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklQb3B1cE1lbnVDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlJlYWRPbmx5QXdhcmVEcm9wVGFyZ2V0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0b3JhZ2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Vbmtub3duQ29udGVudFR5cGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLlN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWcuQnJlYWtwb2ludFJ1bGVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWcuRWRpdEJyZWFrcG9pbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZWJ1Zy5NYW5hZ2VCcmVha3BvaW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWcuVG9nZ2xlQnJlYWtwb2ludEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlYnVnLlRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVyaXZlZC5IVE1MVGV4dFByZXNlbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JNb2RlbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLlNlbGVjdGlvbkNvbnZlcnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5TdHJ1Y3R1cmVkTW9kZWxEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLkJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oeXBlcmxpbmsuT3Blbkh5cGVybGlua0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkVkaXRvclByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uQWJzdHJhY3RTdHJ1Y3R1cmVkRm9sZGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvcGVydGllcy5Db25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3BlcnRpZXMuU2hvd1Byb3BlcnRpZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLkNvbmZpZ3VyYXRpb25Qb2ludENhbGN1bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50Lk51bGxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucHJlZmVyZW5jZXMuQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucXVpY2tvdXRsaW5lLlF1aWNrT3V0bGluZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5xdWlja291dGxpbmUuUXVpY2tPdXRsaW5lUG9wdXBEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuRG9jdW1lbnRSZWdpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uSGlzdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnN0eWxlLlNlbWFudGljSGlnaGxpZ2h0aW5nTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRleHQuRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRleHQuU291cmNlSW5mb1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5xdWlja291dGxpbmUuQWJzdHJhY3RRdWlja091dGxpbmVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkucmVjb25jaWxlLklTb3VyY2VSZWNvbmNpbGluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudHlwaW5nLkFic3RyYWN0Q2hhcmFjdGVyUGFpckluc2VydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBBIFRleHQgRWRpdG9yIGZvciBlZGl0aW5nIHN0cnVjdHVyZWQgbW9kZWxzIGFuZCBzdHJ1Y3R1cmVkIGRvY3VtZW50cy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZC48YnIgLz4KLSAqIE5ldyBjb250ZW50IHR5cGVzIG1heSBhc3NvY2lhdGUgc291cmNlIHZpZXdlciwgY29udGVudCBvdXRsaW5lLCBhbmQKLSAqIHByb3BlcnR5IHNoZWV0IGNvbmZpZ3VyYXRpb25zIHRvIGV4dGVuZCB0aGUgZXhpc3RpbmcgZnVuY3Rpb25hbGl0eS4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLSAqIAotICogQHNpbmNlIDEuMAotICovCi0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBleHRlbmRzIFRleHRFZGl0b3IgewotCXByaXZhdGUgY2xhc3MgR290b01hdGNoaW5nQnJhY2tldEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgYXJnMCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQlnb3RvTWF0Y2hpbmdCcmFja2V0KCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgaW1wbGVtZW50cyBJTW9kZWxTdGF0ZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCWlmIChnZXRUZXh0Vmlld2VyKCkgIT0gbnVsbCkgewotCQkJCS8vIGdldFRleHRWaWV3ZXIoKS5zZXRSZWRyYXcoZmFsc2UpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCQlpZiAoZ2V0VGV4dFZpZXdlcigpICE9IG51bGwpIHsKLQkJCQkvLyBnZXRUZXh0Vmlld2VyKCkuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCQlnZXRUZXh0Vmlld2VyKCkudW5jb25maWd1cmUoKTsKLQkJCQlzZXRTdGF0dXNMaW5lTWVzc2FnZShudWxsKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQlpZiAoZ2V0U291cmNlVmlld2VyKCkgIT0gbnVsbCkgewotCQkJCS8vIGdldFRleHRWaWV3ZXIoKS5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQkJLy8gU2luY2UgdGhlIG1vZGVsIGNhbiBiZSBjaGFuZ2VkIG9uIGEgYmFja2dyb3VuZAotCQkJCS8vIHRocmVhZCwgd2Ugd2lsbCB1cGRhdGUgbWVudXMgb24gZGlzcGxheSB0aHJlYWQsCi0JCQkJLy8gaWYgd2UgYXJlIG5vdCBhbHJlYWR5IG9uIGRpc3BsYXkgdGhyZWFkLAotCQkJCS8vIGFuZCBpZiB0aGVyZSBpcyBub3QgYW4gdXBkYXRlIGFscmVhZHkgcGVuZGluZy4KLQkJCQkvLyAod2UgY2FuIGdldCBsb3RzIG9mICdtb2RlbENoYW5nZWQnIGV2ZW50cyBpbiByYXBpZAotCQkJCS8vIHN1Y2Nlc3Npb24sIHNvIG9ubHkgbmVlZCB0byBkbyBvbmUuCi0JCQkJaWYgKCFmVXBkYXRlTWVudVRleHRQZW5kaW5nKSB7Ci0JCQkJCXJ1bk9uRGlzcGxheVRocmVhZElmTmVlZGVkZWQobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCXVwZGF0ZU1lbnVUZXh0KCk7Ci0JCQkJCQkJZlVwZGF0ZU1lbnVUZXh0UGVuZGluZyA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGVsRGlydHlTdGF0ZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgYm9vbGVhbiBpc0RpcnR5KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RlbFJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGdldFNvdXJjZVZpZXdlcigpICE9IG51bGwpIHsKLQkJCQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjZmcgPSBnZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQkJCWdldFNvdXJjZVZpZXdlcigpLmNvbmZpZ3VyZShjZmcpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xMTY2Ci0JCQkJLy8gaW52ZXN0aWdhdGUgZWFjaCBlcnJvciBjYXNlIHBvc3QgYmV0YQotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInByb2JsZW0gdHJ5aW5nIHRvIGNvbmZpZ3VyZSBhZnRlciBtb2RlbCBjaGFuZ2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy8gc28gd2UgZG9uJ3QgZnJlZXplIHdvcmtiZW5jaCAoZWcuIGR1cmluZyBwYWdlIGxhbmd1YWdlIG9yCi0JCQkJLy8gY29udGVudCB0eXBlIGNoYW5nZSkKLQkJCQkoKElUZXh0Vmlld2VyRXh0ZW5zaW9uKSBnZXRTb3VyY2VWaWV3ZXIoKSkuc2V0UmVkcmF3KHRydWUpOwotCQkJCQotCQkJCUlXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlIHNlcnZpY2UgPSAoSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UpIGdldFNpdGUoKS5nZXRTZXJ2aWNlKElXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlLmNsYXNzKTsKLQkJCQlpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0JCQkJCXNlcnZpY2Uud2Fybk9mQ29udGVudENoYW5nZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIE5vdGU6IHRoaXMgb25lIHNob3VsZCBwcm9iYWJseSBiZSB1c2VkIHRvCi0JCS8vIGNvbnRyb2wgdmlld2VyCi0JCS8vIGluc3RlYWQgb2Ygdmlld2VyIGhhdmluZyBpdHMgb3duIGxpc3RlbmVyCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG9yaWdpbmFsbW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbW92ZWRtb2RlbCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoaXMgJ1J1bm5hYmxlJyBzaG91bGQgYmUgdmVyeSBicmllZiwgYW5kIHNob3VsZCBub3QgImNhbGwgb3V0IiB0bwotCQkgKiBvdGhlciBjb2RlIGVzcGVjaWFsbHkgaWYgaXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUgb2YgdGhlIG1vZGVsLgotCQkgKiAKLQkJICogQHBhcmFtIHIKLQkJICovCi0JCXByaXZhdGUgdm9pZCBydW5PbkRpc3BsYXlUaHJlYWRJZk5lZWRlZGVkKFJ1bm5hYmxlIHIpIHsKLQkJCS8vIGlmIHRoZXJlIGlzIG5vIERpc3BsYXkgYXQgYWxsICh0aGF0IGlzLCBydW5uaW5nIGhlYWRsZXNzKSwKLQkJCS8vIG9yIGlmIHdlIGFyZSBhbHJlYWR5IHJ1bm5pbmcgb24gdGhlIGRpc3BsYXkgdGhyZWFkLCB0aGVuCi0JCQkvLyBzaW1wbHkgZXhlY3V0ZSB0aGUgcnVubmFibGUuCi0JCQlpZiAoZ2V0RGlzcGxheSgpID09IG51bGwgfHwgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgPT0gZ2V0RGlzcGxheSgpLmdldFRocmVhZCgpKSkgewotCQkJCXIucnVuKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBvdGhlcndpc2UgZm9yY2UgdGhlIHJ1bm5hYmxlIHRvIHJ1biBvbiB0aGUgZGlzcGxheSB0aHJlYWQuCi0JCQkJZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBMaXN0ZW5zIHRvIGRvdWJsZS1jbGljayBhbmQgc2VsZWN0aW9uIGZyb20gdGhlIG91dGxpbmUgcGFnZQotCSAqLwotCXByaXZhdGUgY2xhc3MgT3V0bGluZVBhZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElEb3VibGVDbGlja0xpc3RlbmVyLCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm47Ci0KLQkJCWludCBzdGFydCA9IC0xOwotCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCUlTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9IGdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGN1cnJlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQlPYmplY3QgY3VycmVudCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGN1cnJlbnRTZWxlY3Rpb24pLnRvQXJyYXkoKTsKLQkJCQkJT2JqZWN0IG5ld1NlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS50b0FycmF5KCk7Ci0JCQkJCWlmICghY3VycmVudC5lcXVhbHMobmV3U2VsZWN0aW9uKSkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCU9iamVjdCBvID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQkJc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG8pLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJbGVuZ3RoID0gKChJbmRleGVkUmVnaW9uKSBvKS5nZXRFbmRPZmZzZXQoKSAtIHN0YXJ0OwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIElUZXh0UmVnaW9uKSB7Ci0JCQkJCQkJc3RhcnQgPSAoKElUZXh0UmVnaW9uKSBvKS5nZXRTdGFydCgpOwotCQkJCQkJCWxlbmd0aCA9ICgoSVRleHRSZWdpb24pIG8pLmdldEVuZCgpIC0gc3RhcnQ7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSVJlZ2lvbikgewotCQkJCQkJCXN0YXJ0ID0gKChJVGV4dFJlZ2lvbikgbykuZ2V0U3RhcnQoKTsKLQkJCQkJCQlsZW5ndGggPSAoKElUZXh0UmVnaW9uKSBvKS5nZXRMZW5ndGgoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQlzdGFydCA9ICgoSVRleHRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRPZmZzZXQoKTsKLQkJCQlsZW5ndGggPSAoKElUZXh0U2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0TGVuZ3RoKCk7Ci0JCQl9Ci0JCQlpZiAoc3RhcnQgPiAtMSkgewotCQkJCWdldFNvdXJjZVZpZXdlcigpLnNldFJhbmdlSW5kaWNhdGlvbihzdGFydCwgbGVuZ3RoLCBmYWxzZSk7Ci0JCQkJc2VsZWN0QW5kUmV2ZWFsKHN0YXJ0LCBsZW5ndGgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCS8qCi0JCQkgKiBEbyBub3QgYWxsb3cgc2VsZWN0aW9uIGZyb20gb3RoZXIgcGFydHMgdG8gYWZmZWN0IHNlbGVjdGlvbiBpbgotCQkJICogdGhlIHRleHQgd2lkZ2V0IGlmIGl0IGhhcyBmb2N1cywgb3IgaWYgd2UncmUgc3RpbGwgZmlyaW5nIGEKLQkJCSAqIGNoYW5nZSBvZiBzZWxlY3Rpb24uIFNlbGVjdGlvbiBldmVudHMgImJvdW5jaW5nIiBvZmYgb2Ygb3RoZXIKLQkJCSAqIHBhcnRzIGFyZSBhbGwgdGhhdCB3ZSBjYW4gcmVjZWl2ZSBpZiB3ZSBoYXZlIGZvY3VzIChzaW5jZSB3ZQotCQkJICogZm9yd2FyZGVkIG91ciBzZWxlY3Rpb24gdG8gdGhlIHNlcnZpY2UganVzdCBhIG1vbWVudCBhZ28pLCBhbmQKLQkJCSAqIG9ubHkgdGhlIHVzZXIgc2hvdWxkIGFmZmVjdCBzZWxlY3Rpb24gaWYgd2UgaGF2ZSBmb2N1cy4KLQkJCSAqLwotCi0JCQkvKiBUaGUgaXNGaXJpbmdTZWxlY3Rpb24gY2hlY2sgb25seSB3b3JrcyBpZiBhIHNlbGVjdGlvbiBsaXN0ZW5lciAqLwotCQkJaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSB8fCBmU3RydWN0dXJlZFNlbGVjdGlvblByb3ZpZGVyLmlzRmlyaW5nU2VsZWN0aW9uKCkpCi0JCQkJcmV0dXJuOwotCi0JCQlpZiAoZ2V0U291cmNlVmlld2VyKCkgIT0gbnVsbCAmJiBnZXRTb3VyY2VWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCkgIT0gbnVsbCAmJiAhZ2V0U291cmNlVmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpLmlzRGlzcG9zZWQoKSAmJiAhZ2V0U291cmNlVmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpLmlzRm9jdXNDb250cm9sKCkpIHsKLQkJCQlpbnQgc3RhcnQgPSAtMTsKLQkJCQlpbnQgbGVuZ3RoID0gMDsKLQkJCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQlJU2VsZWN0aW9uIGN1cnJlbnQgPSBnZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoY3VycmVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCQlPYmplY3RbXSBjdXJyZW50U2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgY3VycmVudCkudG9BcnJheSgpOwotCQkJCQkJT2JqZWN0W10gbmV3U2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLnRvQXJyYXkoKTsKLQkJCQkJCWlmICghQXJyYXlzLmVxdWFscyhjdXJyZW50U2VsZWN0aW9uLCBuZXdTZWxlY3Rpb24pKSB7Ci0JCQkJCQkJaWYgKG5ld1NlbGVjdGlvbi5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJCS8qCi0JCQkJCQkJCSAqIE5vIG9yZGVyaW5nIGlzIGd1YXJhbnRlZWQgZm9yIG11bHRpcGxlCi0JCQkJCQkJCSAqIHNlbGVjdGlvbgotCQkJCQkJCQkgKi8KLQkJCQkJCQkJT2JqZWN0IG8gPSBuZXdTZWxlY3Rpb25bMF07Ci0JCQkJCQkJCWlmIChvIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJCQkJc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG8pLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBvKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCQkJCWlmIChuZXdTZWxlY3Rpb24ubGVuZ3RoID4gMSkgewotCQkJCQkJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbmV3U2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQkJCXN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsICgoSW5kZXhlZFJlZ2lvbikgbmV3U2VsZWN0aW9uW2ldKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJCQkJCQkJZW5kID0gTWF0aC5tYXgoZW5kLCAoKEluZGV4ZWRSZWdpb24pIG5ld1NlbGVjdGlvbltpXSkuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlsZW5ndGggPSBlbmQgLSBzdGFydDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSVRleHRSZWdpb24pIHsKLQkJCQkJCQkJCXN0YXJ0ID0gKChJVGV4dFJlZ2lvbikgbykuZ2V0U3RhcnQoKTsKLQkJCQkJCQkJCWludCBlbmQgPSAoKElUZXh0UmVnaW9uKSBvKS5nZXRFbmQoKTsKLQkJCQkJCQkJCWlmIChuZXdTZWxlY3Rpb24ubGVuZ3RoID4gMSkgewotCQkJCQkJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbmV3U2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQkJCXN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsICgoSVRleHRSZWdpb24pIG5ld1NlbGVjdGlvbltpXSkuZ2V0U3RhcnQoKSk7Ci0JCQkJCQkJCQkJCWVuZCA9IE1hdGgubWF4KGVuZCwgKChJVGV4dFJlZ2lvbikgbmV3U2VsZWN0aW9uW2ldKS5nZXRFbmQoKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWxlbmd0aCA9IGVuZCAtIHN0YXJ0OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJUmVnaW9uKSB7Ci0JCQkJCQkJCQlzdGFydCA9ICgoSVJlZ2lvbikgbykuZ2V0T2Zmc2V0KCk7Ci0JCQkJCQkJCQlpbnQgZW5kID0gc3RhcnQgKyAoKElSZWdpb24pIG8pLmdldExlbmd0aCgpOwotCQkJCQkJCQkJaWYgKG5ld1NlbGVjdGlvbi5sZW5ndGggPiAxKSB7Ci0JCQkJCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBuZXdTZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCQkJc3RhcnQgPSBNYXRoLm1pbihzdGFydCwgKChJUmVnaW9uKSBuZXdTZWxlY3Rpb25baV0pLmdldE9mZnNldCgpKTsKLQkJCQkJCQkJCQkJZW5kID0gTWF0aC5tYXgoZW5kLCAoKElSZWdpb24pIG5ld1NlbGVjdGlvbltpXSkuZ2V0T2Zmc2V0KCkgKyAoKElSZWdpb24pIG5ld1NlbGVjdGlvbltpXSkuZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlsZW5ndGggPSBlbmQgLSBzdGFydDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQkJCXN0YXJ0ID0gKChJVGV4dFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldE9mZnNldCgpOwotCQkJCX0KLQkJCQlpZiAoc3RhcnQgPiAtMSkgewotCQkJCQl1cGRhdGVSYW5nZUluZGljYXRpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlzZWxlY3RBbmRSZXZlYWwoc3RhcnQsIGxlbmd0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTaG93SW5UYXJnZXRMaXN0QWRhcHRlciBpbXBsZW1lbnRzIElTaG93SW5UYXJnZXRMaXN0IHsKLQkJLyoqCi0JCSAqIEFycmF5IG9mIElEIFN0cmluZ3MgdGhhdCBkZWZpbmUgdGhlIGRlZmF1bHQgc2hvdyBpbiB0YXJnZXRzIGZvcgotCQkgKiB0aGlzIGVkaXRvci4KLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luVGFyZ2V0TGlzdCNnZXRTaG93SW5UYXJnZXRJZHMoKQotCQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBJRCBTdHJpbmdzIHRoYXQgZGVmaW5lIHRoZSBkZWZhdWx0IHNob3cgaW4KLQkJICogICAgICAgICB0YXJnZXRzIGZvciB0aGlzIGVkaXRvci4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmdbXSBnZXRTaG93SW5UYXJnZXRJZHMoKSB7Ci0JCQlyZXR1cm4gZlNob3dJblRhcmdldElkczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgcG9zdCBzZWxlY3Rpb24gcHJvdmlkZXIgdGhhdCB3cmFwcyB0aGUgcHJvdmlkZXIgaW1wbGVtZW50ZWQgaW4KLQkgKiBBYnN0cmFjdFRleHRFZGl0b3IgdG8gcHJvdmlkZSBhIFN0cnVjdHVyZWRUZXh0U2VsZWN0aW9uIHRvIHBvc3QKLQkgKiBzZWxlY3Rpb24gbGlzdGVuZXJzLiBMaXN0ZW5zIHRvIHNlbGVjdGlvbiBjaGFuZ2VzIGZyb20gdGhlIHNvdXJjZQotCSAqIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJUG9zdFNlbGVjdGlvblByb3ZpZGVyLCBJU2VsZWN0aW9uVmFsaWRhdG9yIHsKLQkJLyoqCi0JCSAqIEEgImh5YnJpZCIgdGV4dCBhbmQgc3RydWN0dXJlZCBzZWxlY3Rpb24gY2xhc3MgY29udGFpbmluZyB0aGUgdGV4dAotCQkgKiBzZWxlY3Rpb24gYW5kIGEgbGlzdCBvZiBzZWxlY3RlZCBtb2RlbCBvYmplY3RzLiBUaGUgZGV0ZXJtaW5hdGlvbgotCQkgKiBvZiB3aGljaCBtb2RlbCBvYmplY3RzIG1hdGNoZXMgdGhlIHRleHQgc2VsZWN0aW9uIGlzIHJlc3BvbnNpYmlsaXR5Ci0JCSAqIG9mIHRoZSBTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIgd2hpY2ggY3JlYXRlZCB0aGlzIHNlbGVjdGlvbgotCQkgKiBvYmplY3QuCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFNlbGVjdGlvbiBleHRlbmRzIFRleHRTZWxlY3Rpb24gaW1wbGVtZW50cyBJU3RydWN0dXJlZFNlbGVjdGlvbiB7Ci0JCQlwcml2YXRlIE9iamVjdFtdIHNlbGVjdGVkU3RydWN0dXJlZDsKLQotCQkJU3RydWN0dXJlZFRleHRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBPYmplY3RbXSBzZWxlY3RlZE9iamVjdHMpIHsKLQkJCQlzdXBlcihkb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgpOwotCQkJCXNlbGVjdGVkU3RydWN0dXJlZCA9IHNlbGVjdGVkT2JqZWN0czsKLQkJCX0KLQotCQkJU3RydWN0dXJlZFRleHRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24sIE9iamVjdFtdIHNlbGVjdGVkT2JqZWN0cykgewotCQkJCXRoaXMoZG9jdW1lbnQsIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpLCBzZWxlY3RlZE9iamVjdHMpOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IGdldEZpcnN0RWxlbWVudCgpIHsKLQkJCQlPYmplY3RbXSBzZWxlY3RlZFN0cnVjdHVyZXMgPSBnZXRTZWxlY3RlZFN0cnVjdHVyZXMoKTsKLQkJCQlyZXR1cm4gc2VsZWN0ZWRTdHJ1Y3R1cmVzLmxlbmd0aCA+IDAgPyBzZWxlY3RlZFN0cnVjdHVyZXNbMF0gOiBudWxsOwotCQkJfQotCi0JCQlwcml2YXRlIE9iamVjdFtdIGdldFNlbGVjdGVkU3RydWN0dXJlcygpIHsKLQkJCQlyZXR1cm4gKHNlbGVjdGVkU3RydWN0dXJlZCAhPSBudWxsKSA/IHNlbGVjdGVkU3RydWN0dXJlZCA6IG5ldyBPYmplY3RbMF07Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MTMyNwotCQkJCXJldHVybiBzdXBlci5pc0VtcHR5KCkgfHwgZ2V0U2VsZWN0ZWRTdHJ1Y3R1cmVzKCkubGVuZ3RoID09IDA7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJCQlyZXR1cm4gdG9MaXN0KCkuaXRlcmF0b3IoKTsKLQkJCX0KLQotCQkJcHVibGljIGludCBzaXplKCkgewotCQkJCXJldHVybiAoc2VsZWN0ZWRTdHJ1Y3R1cmVkICE9IG51bGwpID8gc2VsZWN0ZWRTdHJ1Y3R1cmVkLmxlbmd0aCA6IDA7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQkJCXJldHVybiBnZXRTZWxlY3RlZFN0cnVjdHVyZXMoKTsKLQkJCX0KLQotCQkJcHVibGljIExpc3QgdG9MaXN0KCkgewotCQkJCXJldHVybiBBcnJheXMuYXNMaXN0KGdldFNlbGVjdGVkU3RydWN0dXJlcygpKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gZ2V0T2Zmc2V0KCkgKyAiOiIgKyBnZXRMZW5ndGgoKSArICJAIiArIGdldFNlbGVjdGVkU3RydWN0dXJlcygpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSBJU2VsZWN0aW9uUHJvdmlkZXIgZlBhcmVudFByb3ZpZGVyID0gbnVsbDsKLQkJcHJpdmF0ZSBib29sZWFuIGlzRmlyaW5nU2VsZWN0aW9uID0gZmFsc2U7Ci0JCXByaXZhdGUgTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQkJcHJpdmF0ZSBMaXN0ZW5lckxpc3QgcG9zdExpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQkJcHJpdmF0ZSBJU2VsZWN0aW9uIGZMYXN0U2VsZWN0aW9uID0gbnVsbDsKLQkJcHJpdmF0ZSBJU2VsZWN0aW9uUHJvdmlkZXIgZkxhc3RTZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0JCXByaXZhdGUgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGZMYXN0VXBkYXRlZFNlbGVjdGlvbkNoYW5nZWRFdmVudCA9IG51bGw7Ci0JCXByaXZhdGUgU3RydWN0dXJlZFRleHRFZGl0b3IgZkVkaXRvcjsKLQkJLyoKLQkJICogUmVzcG9uc2libGUgZm9yIGZpbmRpbmcgdGhlIHNlbGVjdGVkIG9iamVjdHMgd2l0aGluIGEgdGV4dAotCQkgKiBzZWxlY3Rpb24uIFNldC9yZXNldCBieSB0aGUgU3RydWN0dXJlZFRleHRFZGl0b3IgYmFzZWQgb24gYQotCQkgKiBwZXItbW9kZWwgYWRhcHRlciBvbiBpbnB1dC4KLQkJICovCi0JCVNlbGVjdGlvbkNvbnZlcnRvciBzZWxlY3Rpb25Db252ZXJ0b3IgPSBuZXcgU2VsZWN0aW9uQ29udmVydG9yKCk7Ci0JCQotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIoSVNlbGVjdGlvblByb3ZpZGVyIHBhcmVudFByb3ZpZGVyLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBzdHJ1Y3R1cmVkVGV4dEVkaXRvcikgewotCQkJZlBhcmVudFByb3ZpZGVyID0gcGFyZW50UHJvdmlkZXI7Ci0JCQlmRWRpdG9yID0gc3RydWN0dXJlZFRleHRFZGl0b3I7Ci0JCQlmUGFyZW50UHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCQkJaWYgKGZQYXJlbnRQcm92aWRlciBpbnN0YW5jZW9mIElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIHsKLQkJCQkoKElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIGZQYXJlbnRQcm92aWRlcikuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWhhbmRsZVBvc3RTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlwb3N0TGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZkVkaXRvciA9IG51bGw7Ci0JCQlsaXN0ZW5lcnMuY2xlYXIoKTsKLQkJCXBvc3RMaXN0ZW5lcnMuY2xlYXIoKTsKLQkJCXNlbGVjdGlvbkNvbnZlcnRvciA9IG51bGw7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgZmlyZVNlbGVjdGlvbkNoYW5nZWQoZmluYWwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50LCBMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0KSB7Ci0JCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlpc0ZpcmluZ1NlbGVjdGlvbiA9IHRydWU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbCA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0JCQkJU2FmZVJ1bm5lci5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbC5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQkJaXNGaXJpbmdTZWxlY3Rpb24gPSBmYWxzZTsKLQkJfQotCi0JCXByaXZhdGUgSVNlbGVjdGlvblByb3ZpZGVyIGdldFBhcmVudFByb3ZpZGVyKCkgewotCQkJcmV0dXJuIGZQYXJlbnRQcm92aWRlcjsKLQkJfQotCi0JCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJCWZMYXN0U2VsZWN0aW9uID0gbnVsbDsKLQkJCWZMYXN0U2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOwotCQkJZkxhc3RVcGRhdGVkU2VsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gbnVsbDsKLQotCQkJLyoKLQkJCSAqIFdoZW4gYSBjbGllbnQgZXhwbGljaXRseSBhc2tzIGZvciBzZWxlY3Rpb24sIHByb3ZpZGUgdGhlIGh5YnJpZAotCQkJICogcmVzdWx0LgotCQkJICovCi0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFBhcmVudFByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCQkJU3RydWN0dXJlZFRleHRFZGl0b3IgbG9jYWxFZGl0b3IgPSBnZXRTdHJ1Y3R1cmVkVGV4dEVkaXRvcigpOwotCQkJCWlmIChsb2NhbEVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCXN0cnVjdHVyZWRNb2RlbCA9IGxvY2FsRWRpdG9yLmdldEludGVybmFsTW9kZWwoKTsKLQkJCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAobG9jYWxFZGl0b3IuaXNCbG9ja1NlbGVjdGlvbk1vZGVFbmFibGVkKCkpIHsKLQkJCQkJCQkvKgotCQkJCQkJCSAqIEJsb2NrIHNlbGVjdGlvbiBoYW5kbGluZyAtIGZpbmQgdGhlIG92ZXJsYXBwaW5nCi0JCQkJCQkJICogb2JqZWN0cyBvbiBlYWNoIGxpbmUsIGtlZXBpbmcgaW4gbWluZCB0aGF0IHRoZQotCQkJCQkJCSAqIHNlbGVjdGVkIGJsb2NrIG1heSBub3Qgb3ZlcmxhcCBhY3R1YWwgbGluZXMgb3IKLQkJCQkJCQkgKiBjb2x1bW5zIG9mIHRoZSBkb2N1bWVudC4KLQkJCQkJCQkgKiBJQmxvY2tUZXh0U2VsZWN0aW9uLmdldFJlZ2lvbnMoKSBzaG91bGQgaGFuZGxlCi0JCQkJCQkJICogdGhhdCBmb3IgdXMuLi4KLQkJCQkJCQkgKi8KLQkJCQkJCQlJQmxvY2tUZXh0U2VsZWN0aW9uIGJsb2NrU2VsZWN0aW9uID0gKElCbG9ja1RleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQkJCQlJUmVnaW9uW10gcmVnaW9ucyA9IGJsb2NrU2VsZWN0aW9uLmdldFJlZ2lvbnMoKTsKLQkJCQkJCQlTZXQgYmxvY2tPYmplY3RzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJT2JqZWN0W10gb2JqZWN0cyA9IHNlbGVjdGlvbkNvbnZlcnRvci5nZXRFbGVtZW50cyhzdHJ1Y3R1cmVkTW9kZWwsIHJlZ2lvbnNbaV0uZ2V0T2Zmc2V0KCksIHJlZ2lvbnNbaV0uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG9iamVjdHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkJCWJsb2NrT2JqZWN0cy5hZGQob2JqZWN0c1tqXSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0U2VsZWN0aW9uKGdldERvY3VtZW50KCksIChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uLCBibG9ja09iamVjdHMudG9BcnJheSgpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWludCBzdGFydCA9ICgoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0T2Zmc2V0KCk7Ci0JCQkJCQkJaW50IGVuZCA9IHN0YXJ0ICsgKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRMZW5ndGgoKTsKLQkJCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFRleHRTZWxlY3Rpb24oZ2V0RG9jdW1lbnQoKSwgKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb24sIHNlbGVjdGlvbkNvbnZlcnRvci5nZXRFbGVtZW50cyhzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBlbmQpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0U2VsZWN0aW9uKGdldERvY3VtZW50KCksIChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uLCBuZXcgT2JqZWN0WzBdKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBzZWxlY3Rpb247Ci0JCX0KLQotCQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGdldFN0cnVjdHVyZWRUZXh0RWRpdG9yKCkgewotCQkJcmV0dXJuIGZFZGl0b3I7Ci0JCX0KLQotCQl2b2lkIGhhbmRsZVBvc3RTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHVwZGF0ZWRFdmVudCA9IG51bGw7Ci0JCQlpZiAoZkxhc3RTZWxlY3Rpb24gPT0gZXZlbnQuZ2V0U2VsZWN0aW9uKCkgJiYgZkxhc3RTZWxlY3Rpb25Qcm92aWRlciA9PSBldmVudC5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKSB7Ci0JCQkJdXBkYXRlZEV2ZW50ID0gZkxhc3RVcGRhdGVkU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdXBkYXRlZEV2ZW50ID0gdXBkYXRlRXZlbnQoZXZlbnQpOwotCQkJfQotCQkJLy8gb25seSB1cGRhdGUgdGhlIHJhbmdlIGluZGljYXRvciBvbiBwb3N0IHNlbGVjdGlvbgotCQkJU3RydWN0dXJlZFRleHRFZGl0b3IgbG9jYWxFZGl0b3IgPSBmRWRpdG9yOwotCi0JCQlpZiAobG9jYWxFZGl0b3IgIT0gbnVsbCkgewotCQkJCWxvY2FsRWRpdG9yLnVwZGF0ZVJhbmdlSW5kaWNhdGlvbih1cGRhdGVkRXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCWZpcmVTZWxlY3Rpb25DaGFuZ2VkKHVwZGF0ZWRFdmVudCwgcG9zdExpc3RlbmVycyk7Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIGhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgdXBkYXRlZEV2ZW50ID0gZXZlbnQ7Ci0JCQlpZiAoZkxhc3RTZWxlY3Rpb24gIT0gZXZlbnQuZ2V0U2VsZWN0aW9uKCkgfHwgZkxhc3RTZWxlY3Rpb25Qcm92aWRlciAhPSBldmVudC5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKSB7Ci0JCQkJZkxhc3RTZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlmTGFzdFNlbGVjdGlvblByb3ZpZGVyID0gZXZlbnQuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCQlmTGFzdFVwZGF0ZWRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgPSB1cGRhdGVkRXZlbnQgPSB1cGRhdGVFdmVudChldmVudCk7Ci0JCQl9Ci0JCQlmaXJlU2VsZWN0aW9uQ2hhbmdlZCh1cGRhdGVkRXZlbnQsIGxpc3RlbmVycyk7Ci0JCX0KLQotCQlJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCQlyZXR1cm4gZkVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZkVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJfQotCi0KLQkJYm9vbGVhbiBpc0ZpcmluZ1NlbGVjdGlvbigpIHsKLQkJCXJldHVybiBpc0ZpcmluZ1NlbGVjdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCS8vIElTU1VFOiBpcyBub3QgY2xlYXIgZGVmYXVsdCBiZWhhdmlvciBzaG91bGQgYmUgdHJ1ZT8KLQkJCS8vIEJ1dCBub3QgY2xlYXIgaXMgdGhpcyBkZWZhdWx0IHdvdWxkIGFwcGx5IGZvciBvdXIgZWRpdG9yLgotCQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQkJLy8gaWYgZWRpdG9yIGlzICJnb25lIiwgY2FuIG5vdCBiZSB2YWxpZAotCQkJU3RydWN0dXJlZFRleHRFZGl0b3IgZSA9IGdldFN0cnVjdHVyZWRUZXh0RWRpdG9yKCk7Ci0JCQlpZiAoZSA9PSBudWxsIHx8IGUuZkVkaXRvckRpc3Bvc2VkKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBlbHNlIGRlZmVyIHRvIHBhcmVudAotCQkJZWxzZSBpZiAoZ2V0UGFyZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIElTZWxlY3Rpb25WYWxpZGF0b3IpIHsKLQkJCQlyZXN1bHQgPSAoKElTZWxlY3Rpb25WYWxpZGF0b3IpIGdldFBhcmVudFByb3ZpZGVyKCkpLmlzVmFsaWQoc2VsZWN0aW9uKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXBvc3RMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJaWYgKGlzRmlyaW5nU2VsZWN0aW9uKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWZMYXN0U2VsZWN0aW9uID0gbnVsbDsKLQkJCWZMYXN0U2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOwotCQkJZkxhc3RVcGRhdGVkU2VsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gbnVsbDsKLQotCQkJSVNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gdXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQlnZXRQYXJlbnRQcm92aWRlcigpLnNldFNlbGVjdGlvbih0ZXh0U2VsZWN0aW9uKTsKLQkJCVN0cnVjdHVyZWRUZXh0RWRpdG9yIGxvY2FsRWRpdG9yID0gZ2V0U3RydWN0dXJlZFRleHRFZGl0b3IoKTsKLQkJCWlmIChsb2NhbEVkaXRvciAhPSBudWxsKSB7Ci0JCQkJbG9jYWxFZGl0b3IudXBkYXRlUmFuZ2VJbmRpY2F0aW9uKHRleHRTZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSBhIGNvcnJlc3BvbmRpbmcgZXZlbnQgdGhhdCBjb250YWlucyBhCi0JCSAqIFN0cnVjdHVyZWRUZXh0c2VsZWN0aW9uCi0JCSAqIAotCQkgKiBAcGFyYW0gZXZlbnQKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgdXBkYXRlRXZlbnQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uICYmICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKSB7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkJCVN0cnVjdHVyZWRUZXh0RWRpdG9yIGxvY2FsRWRpdG9yID0gZ2V0U3RydWN0dXJlZFRleHRFZGl0b3IoKTsKLQkJCQlpZiAobG9jYWxFZGl0b3IgIT0gbnVsbCkgewotCQkJCQlzdHJ1Y3R1cmVkTW9kZWwgPSBsb2NhbEVkaXRvci5nZXRJbnRlcm5hbE1vZGVsKCk7Ci0JCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJCQkJaW50IHN0YXJ0ID0gKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRPZmZzZXQoKTsKLQkJCQkJCWludCBlbmQgPSBzdGFydCArICgoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFRleHRTZWxlY3Rpb24oZ2V0RG9jdW1lbnQoKSwgKElUZXh0U2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSwgc2VsZWN0aW9uQ29udmVydG9yLmdldEVsZW1lbnRzKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGVuZCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0U2VsZWN0aW9uKGdldERvY3VtZW50KCksIChJVGV4dFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCksIG5ldyBPYmplY3RbMF0pOwotCQkJfQotCQkJU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IG5ld0V2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChldmVudC5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLCBzZWxlY3Rpb24pOwotCQkJcmV0dXJuIG5ld0V2ZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSBhIGNvcnJlc3BvbmRpbmcgU3RydWN0dXJlZFRleHRzZWxlY3Rpb24KLQkJICogCi0JCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBJU2VsZWN0aW9uIHVwZGF0ZVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJSVNlbGVjdGlvbiB1cGRhdGVkID0gc2VsZWN0aW9uOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJT2JqZWN0W10gc2VsZWN0ZWRPYmplY3RzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0FycmF5KCk7Ci0JCQkJaWYgKHNlbGVjdGVkT2JqZWN0cy5sZW5ndGggPiAwKSB7Ci0JCQkJCWludCBzdGFydCA9IC0xOwotCQkJCQlpbnQgbGVuZ3RoID0gMDsKLQotCQkJCQkvLyBubyBvcmRlcmluZyBpcyBndWFyYW50ZWVkIGZvciBtdWx0aXBsZSBzZWxlY3Rpb24KLQkJCQkJT2JqZWN0IG8gPSBzZWxlY3RlZE9iamVjdHNbMF07Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG8pLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBvKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCWlmIChzZWxlY3RlZE9iamVjdHMubGVuZ3RoID4gMSkgewotCQkJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCXN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsICgoSW5kZXhlZFJlZ2lvbikgc2VsZWN0ZWRPYmplY3RzW2ldKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJCQkJZW5kID0gTWF0aC5tYXgoZW5kLCAoKEluZGV4ZWRSZWdpb24pIHNlbGVjdGVkT2JqZWN0c1tpXSkuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJCQkJCX0KLQkJCQkJCQlsZW5ndGggPSBlbmQgLSBzdGFydDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSVRleHRSZWdpb24pIHsKLQkJCQkJCXN0YXJ0ID0gKChJVGV4dFJlZ2lvbikgbykuZ2V0U3RhcnQoKTsKLQkJCQkJCWludCBlbmQgPSAoKElUZXh0UmVnaW9uKSBvKS5nZXRFbmQoKTsKLQkJCQkJCWlmIChzZWxlY3RlZE9iamVjdHMubGVuZ3RoID4gMSkgewotCQkJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCXN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsICgoSVRleHRSZWdpb24pIHNlbGVjdGVkT2JqZWN0c1tpXSkuZ2V0U3RhcnQoKSk7Ci0JCQkJCQkJCWVuZCA9IE1hdGgubWF4KGVuZCwgKChJVGV4dFJlZ2lvbikgc2VsZWN0ZWRPYmplY3RzW2ldKS5nZXRFbmQoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWxlbmd0aCA9IGVuZCAtIHN0YXJ0OwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKHN0YXJ0ID4gLTEpIHsKLQkJCQkJCXVwZGF0ZWQgPSBuZXcgU3RydWN0dXJlZFRleHRTZWxlY3Rpb24oZ2V0RG9jdW1lbnQoKSwgc3RhcnQsIGxlbmd0aCwgc2VsZWN0ZWRPYmplY3RzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB1cGRhdGVkOwotCQl9Ci0JfQotCi0JY2xhc3MgVGltZU91dEV4cGlyZWQgZXh0ZW5kcyBUaW1lclRhc2sgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlnZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldERpc3BsYXkoKSAhPSBudWxsICYmICFnZXREaXNwbGF5KCkuaXNEaXNwb3NlZCgpKQotCQkJCQkJZW5kQnVzeVN0YXRlSW50ZXJuYWwoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDb25maWd1cmF0aW9uQW5kVGFyZ2V0IHsKLQkJcHJpdmF0ZSBTdHJpbmcgZlRhcmdldElkOwotCQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBmQ29uZmlndXJhdGlvbjsKLQotCQlwdWJsaWMgQ29uZmlndXJhdGlvbkFuZFRhcmdldChTdHJpbmcgdGFyZ2V0SWQsIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCWZUYXJnZXRJZCA9IHRhcmdldElkOwotCQkJZkNvbmZpZ3VyYXRpb24gPSBjb25maWc7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldElkKCkgewotCQkJcmV0dXJuIGZUYXJnZXRJZDsKLQkJfQotCi0JCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJCXJldHVybiBmQ29uZmlndXJhdGlvbjsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgQ2hhcmFjdGVyUGFpckxpc3RlbmVyIGltcGxlbWVudHMgVmVyaWZ5S2V5TGlzdGVuZXIgewotCQlwcml2YXRlIENoYXJhY3RlclBhaXJpbmdbXSBmSW5zZXJ0ZXJzID0gbmV3IENoYXJhY3RlclBhaXJpbmdbMF07Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgcGFpcmluZyB0byB0aGUgbGlzdCBvZiBpbnNlcnRlcnMKLQkJICogQHBhcmFtIHBhaXJpbmcKLQkJICovCi0JCXZvaWQgYWRkSW5zZXJ0ZXIoQ2hhcmFjdGVyUGFpcmluZyBwYWlyaW5nKSB7Ci0JCQlMaXN0IHBhaXJpbmdzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGZJbnNlcnRlcnMpKTsKLQkJCXBhaXJpbmdzLmFkZChwYWlyaW5nKTsKLQkJCWZJbnNlcnRlcnMgPSAoQ2hhcmFjdGVyUGFpcmluZ1tdKSBwYWlyaW5ncy50b0FycmF5KG5ldyBDaGFyYWN0ZXJQYWlyaW5nW3BhaXJpbmdzLnNpemUoKV0pOwotCQl9Ci0KLQkJdm9pZCBwcmlvcml0aXplKCkgewotCQkJQXJyYXlzLnNvcnQoZkluc2VydGVycyk7Ci0JCX0KLQotCQkvKioKLQkJICogUGVyZm9ybSBjbGVhbnVwIG9uIHRoZSBjaGFyYWN0ZXIgcGFpciBpbnNlcnRlcnMKLQkJICovCi0JCXZvaWQgZGlzcG9zZSgpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZkluc2VydGVycy5sZW5ndGg7IGkrKykgewotCQkJCWZpbmFsIEFic3RyYWN0Q2hhcmFjdGVyUGFpckluc2VydGVyIGluc2VydGVyID0gZkluc2VydGVyc1tpXS5pbnNlcnRlcjsKLQkJCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJCS8vIHJlbHkgb24gZGVmYXVsdCBsb2dnaW5nCi0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCWluc2VydGVyLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgdmVyaWZ5S2V5KGZpbmFsIFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoIWV2ZW50LmRvaXQgfHwgZ2V0SW5zZXJ0TW9kZSgpICE9IFNNQVJUX0lOU0VSVCB8fCBpc0Jsb2NrU2VsZWN0aW9uTW9kZUVuYWJsZWQoKSAmJiBpc011bHRpbGluZVNlbGVjdGlvbigpKQotCQkJCXJldHVybjsKLQkJCWZpbmFsIGJvb2xlYW5bXSBwYWlyZWQgPSB7IGZhbHNlIH07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZJbnNlcnRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmaW5hbCBDaGFyYWN0ZXJQYWlyaW5nIHBhaXJpbmcgPSBmSW5zZXJ0ZXJzW2ldOwotCQkJCS8vIHVzZSBhIFNhZmVSdW5uZXIgLS0gdGhpcyBpcyBhIGNyaXRpY2FsIGZ1bmN0aW9uICh0eXBpbmcpCi0JCQkJU2FmZVJ1bm5lci5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJZmluYWwgQWJzdHJhY3RDaGFyYWN0ZXJQYWlySW5zZXJ0ZXIgaW5zZXJ0ZXIgPSBwYWlyaW5nLmluc2VydGVyOwotCQkJCQkJaWYgKGluc2VydGVyLmhhc1BhaXIoZXZlbnQuY2hhcmFjdGVyKSkgewotCQkJCQkJCWlmIChwYWlyKGV2ZW50LCBpbnNlcnRlciwgcGFpcmluZy5wYXJ0aXRpb25zKSkKLQkJCQkJCQkJcGFpcmVkWzBdID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCQkvLyByZWx5IG9uIGRlZmF1bHQgbG9nZ2luZwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJaWYgKHBhaXJlZFswXSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHBhaXIoVmVyaWZ5RXZlbnQgZXZlbnQsIEFic3RyYWN0Q2hhcmFjdGVyUGFpckluc2VydGVyIGluc2VydGVyLCBTZXQgcGFydGl0aW9ucykgewotCQkJZmluYWwgSVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBnZXRTb3VyY2VWaWV3ZXIoKTsKLQkJCWZpbmFsIElEb2N1bWVudCBkb2N1bWVudCA9IGdldFNvdXJjZVZpZXdlcigpLmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZpbmFsIFBvaW50IHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCk7Ci0JCQkJCWZpbmFsIGludCBvZmZzZXQgPSBzZWxlY3Rpb24ueDsKLQkJCQkJZmluYWwgSVR5cGVkUmVnaW9uIHBhcnRpdGlvbiA9IGRvY3VtZW50LmdldFBhcnRpdGlvbihvZmZzZXQpOwotCQkJCQlpZiAocGFydGl0aW9ucy5jb250YWlucyhwYXJ0aXRpb24uZ2V0VHlwZSgpKSkgewotCQkJCQkJLy8gRG9uJ3QgbW9kaWZ5IGlmIHRoZSBlZGl0b3IgaW5wdXQgY2Fubm90IGJlIGNoYW5nZWQKLQkJCQkJCWlmICghdmFsaWRhdGVFZGl0b3JJbnB1dFN0YXRlKCkpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJZXZlbnQuZG9pdCA9ICFpbnNlcnRlci5wYWlyKHZpZXdlciwgZXZlbnQuY2hhcmFjdGVyKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBpc011bHRpbGluZVNlbGVjdGlvbigpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCUlUZXh0U2VsZWN0aW9uIHRzID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJcmV0dXJuIHRzLmdldFN0YXJ0TGluZSgpICE9IHRzLmdldEVuZExpbmUoKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcHJlc2VudGF0aW9uIG9mIGEgY2hhcmFjdGVyIHBhaXJpbmcgdGhhdCBpbmNsdWRlcyBpdHMgcHJpb3JpdHkgYmFzZWQgb24KLQkgKiBpdHMgY29udGVudCB0eXBlIGFuZCBob3cgY2xvc2UgaXQgaXMgdG8gdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgZmlsZQotCSAqIGluIHRoZSBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDaGFyYWN0ZXJQYWlyaW5nIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0JCWludCBwcmlvcml0eTsKLQkJQWJzdHJhY3RDaGFyYWN0ZXJQYWlySW5zZXJ0ZXIgaW5zZXJ0ZXI7Ci0JCVNldCBwYXJ0aXRpb25zOwotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgewotCQkJaWYgKG8gPT0gdGhpcykKLQkJCQlyZXR1cm4gMDsKLQkJCXJldHVybiB0aGlzLnByaW9yaXR5IC0gKChDaGFyYWN0ZXJQYWlyaW5nKSBvKS5wcmlvcml0eTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFBhcnRMaXN0ZW5lciBpbXBsZW1lbnRzIElQYXJ0TGlzdGVuZXIgewotCi0JCXByaXZhdGUgSVRleHRFZGl0b3IgZkVkaXRvcjsKLQotCQlwdWJsaWMgUGFydExpc3RlbmVyKElUZXh0RWRpdG9yIGVkaXRvcikgewotCQkJZkVkaXRvciA9IGVkaXRvcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJaWYgKHBhcnQuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcykgPT0gZkVkaXRvcikgewotCQkJCUlSZWNvbmNpbGVyIHJlY29uY2lsZXIgPSBnZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0UmVjb25jaWxlcihnZXRTb3VyY2VWaWV3ZXIoKSk7Ci0JCQkJaWYgKHJlY29uY2lsZXIgaW5zdGFuY2VvZiBEb2N1bWVudFJlZ2lvblByb2Nlc3NvcikgewotCQkJCQkoKERvY3VtZW50UmVnaW9uUHJvY2Vzc29yKSByZWNvbmNpbGVyKS5mb3JjZVJlY29uY2lsaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgY2hhcltdIEJSQUNLRVRTID0geyd7JywgJ30nLCAnKCcsICcpJywgJ1snLCAnXSd9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBCVVNZX1NUQVRFX0RFTEFZID0gMTAwMDsKLQkvKioKLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPVCA9ICIuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfQ09OVEVYVF9NRU5VX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IuRWRpdG9yQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0NPTlRFWFRfTUVOVV9TVUZGSVggPSAiLnNvdXJjZS5FZGl0b3JDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIE5vbi1OTFMgc3RyaW5ncyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfS0VZQklORElOR19TQ09QRV9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9OQU1FX0FERElUSU9OUyA9IElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVET19BQ1RJT05fREVTQyA9IFNTRVVJTWVzc2FnZXMuUmVkb19fXzBfX19VSV87IC8vJE5PTi1OTFMtMSQgPSAiUmVkbzogezB9LiIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVET19BQ1RJT05fREVTQ19ERUZBVUxUID0gU1NFVUlNZXNzYWdlcy5SZWRvX1RleHRfQ2hhbmdlX19VSV87IC8vJE5PTi1OTFMtMSQgPSAiUmVkbyBUZXh0IENoYW5nZS4iCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRE9fQUNUSU9OX1RFWFQgPSBTU0VVSU1lc3NhZ2VzLl9SZWRvX18wX19fQ3RybF9ZX1VJXzsgLy8kTk9OLU5MUy0xJCA9ICImUmVkbyB7MH0gQEN0cmwrWSIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVET19BQ1RJT05fVEVYVF9ERUZBVUxUID0gU1NFVUlNZXNzYWdlcy5fUmVkb19UZXh0X0NoYW5nZV9fQ3RybF9ZX1VJXzsgLy8kTk9OLU5MUy0xJCA9ICImUmVkbyBUZXh0IENoYW5nZSBAQ3RybCtZIgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSVUxFUl9DT05URVhUX01FTlVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvci5SdWxlckNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTEVSX0NPTlRFWFRfTUVOVV9TVUZGSVggPSAiLnNvdXJjZS5SdWxlckNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5ERVJTQ09SRSA9ICJfIjsgLy8kTk9OLU5MUy0xJAotCS8qKiBUcmFuc2xhdGFibGUgc3RyaW5ncyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRPX0FDVElPTl9ERVNDID0gU1NFVUlNZXNzYWdlcy5VbmRvX19fMF9fX1VJXzsgLy8kTk9OLU5MUy0xJCA9ICJVbmRvOiB7MH0uIgotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVORE9fQUNUSU9OX0RFU0NfREVGQVVMVCA9IFNTRVVJTWVzc2FnZXMuVW5kb19UZXh0X0NoYW5nZV9fVUlfOyAvLyROT04tTkxTLTEkID0gIlVuZG8gVGV4dCBDaGFuZ2UuIgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRPX0FDVElPTl9URVhUID0gU1NFVUlNZXNzYWdlcy5fVW5kb19fMF9fX0N0cmxfWl9VSV87IC8vJE5PTi1OTFMtMSQgPSAiJlVuZG8gezB9IEBDdHJsK1oiCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVORE9fQUNUSU9OX1RFWFRfREVGQVVMVCA9IFNTRVVJTWVzc2FnZXMuX1VuZG9fVGV4dF9DaGFuZ2VfX0N0cmxfWl9VSV87IC8vJE5PTi1OTFMtMSQgPSAiJlVuZG8gVGV4dCBDaGFuZ2UgQEN0cmwrWiIKLQkvLyBkZXZlbG9wbWVudCB0aW1lL2RlYnVnIHZhcmlhYmxlcyBvbmx5Ci0JcHJpdmF0ZSBpbnQgYWRhcHRlclJlcXVlc3RzOwotCi0JcHJpdmF0ZSBsb25nIGFkYXB0ZXJUaW1lOwotCXByaXZhdGUgYm9vbGVhbiBmQmFja2dyb3VuZEpvYkVuZGVkOwotCXByaXZhdGUgYm9vbGVhbiBmQnVzeVN0YXRlOwotCXByaXZhdGUgVGltZXIgZkJ1c3lUaW1lcjsKLQlib29sZWFuIGZEaXJ0eUJlZm9yZURvY3VtZW50RXZlbnQgPSBmYWxzZTsKLQlpbnQgdmFsaWRhdGVFZGl0Q291bnQgPSAwOwotCXByaXZhdGUgRXh0ZW5kZWRFZGl0b3JEcm9wVGFyZ2V0QWRhcHRlciBmRHJvcEFkYXB0ZXI7Ci0JcHJpdmF0ZSBEcm9wVGFyZ2V0IGZEcm9wVGFyZ2V0OwotCWJvb2xlYW4gZkVkaXRvckRpc3Bvc2VkID0gZmFsc2U7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yUGFydDsKLQlwcml2YXRlIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGZJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcjsKLQlwcml2YXRlIElDb250ZW50T3V0bGluZVBhZ2UgZk91dGxpbmVQYWdlOwotCi0JcHJpdmF0ZSBPdXRsaW5lUGFnZUxpc3RlbmVyIGZPdXRsaW5lUGFnZUxpc3RlbmVyID0gbnVsbDsKLQkvKiogVGhpcyBlZGl0b3IncyBwcm9qZWN0aW9uIHN1cHBvcnQgKi8KLQlwcml2YXRlIFByb2plY3Rpb25TdXBwb3J0IGZQcm9qZWN0aW9uU3VwcG9ydDsKLQlwcml2YXRlIElQcm9wZXJ0eVNoZWV0UGFnZSBmUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQlwcml2YXRlIElTb3VyY2VSZWNvbmNpbGluZ0xpc3RlbmVyW10gZlJlY29uY2lsaW5nTGlzdGVuZXJzID0gbmV3IElTb3VyY2VSZWNvbmNpbGluZ0xpc3RlbmVyWzBdOyAKLQlwcml2YXRlIElQYXJ0TGlzdGVuZXIgZlBhcnRMaXN0ZW5lcjsKLQotCXByaXZhdGUgU3RyaW5nIGZSZW1lbWJlclRpdGxlOwotCS8qKiBUaGUgcnVsZXIgY29udGV4dCBtZW51IHRvIGJlIGRpc3Bvc2VkLiAqLwotCXByaXZhdGUgTWVudSBmUnVsZXJDb250ZXh0TWVudTsKLQkvKiogVGhlIHJ1bGVyIGNvbnRleHQgbWVudSBtYW5hZ2VyIHRvIGJlIGRpc3Bvc2VkLiAqLwotCXByaXZhdGUgTWVudU1hbmFnZXIgZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyOwotCi0JU3RyaW5nW10gZlNob3dJblRhcmdldElkcyA9IG5ldyBTdHJpbmdbXXtJUGFnZUxheW91dC5JRF9SRVNfTkFWLCBJUGFnZUxheW91dC5JRF9QUk9KRUNUX0VYUExPUkVSLCBJUGFnZUxheW91dC5JRF9PVVRMSU5FfTsKLQotCXByaXZhdGUgSUFjdGlvbiBmU2hvd1Byb3BlcnRpZXNBY3Rpb24gPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBmU3RydWN0dXJlZE1vZGVsOwotCVN0cnVjdHVyZWRTZWxlY3Rpb25Qcm92aWRlciBmU3RydWN0dXJlZFNlbGVjdGlvblByb3ZpZGVyID0gbnVsbDsKLQkvKiogVGhlIHRleHQgY29udGV4dCBtZW51IHRvIGJlIGRpc3Bvc2VkLiAqLwotCXByaXZhdGUgTWVudSBmVGV4dENvbnRleHRNZW51OwotCS8qKiBUaGUgdGV4dCBjb250ZXh0IG1lbnUgbWFuYWdlciB0byBiZSBkaXNwb3NlZC4gKi8KLQlwcml2YXRlIE1lbnVNYW5hZ2VyIGZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyOwotCXByaXZhdGUgU3RyaW5nIGZWaWV3ZXJDb25maWd1cmF0aW9uVGFyZ2V0SWQ7Ci0JLyoqIFRoZSBzZWxlY3Rpb24gaGlzdG9yeSBvZiB0aGUgZWRpdG9yICovCi0JcHJpdmF0ZSBTZWxlY3Rpb25IaXN0b3J5IGZTZWxlY3Rpb25IaXN0b3J5OwotCS8qKiBUaGUgaW5mb3JtYXRpb24gcHJlc2VudGVyLiAqLwotCXByaXZhdGUgSW5mb3JtYXRpb25QcmVzZW50ZXIgZkluZm9ybWF0aW9uUHJlc2VudGVyOwotCXByaXZhdGUgYm9vbGVhbiBmVXBkYXRlTWVudVRleHRQZW5kaW5nOwotCS8qKiBUaGUgcXVpY2sgb3V0bGluZSBoYW5kbGVyICovCi0JcHJpdmF0ZSBRdWlja091dGxpbmVIYW5kbGVyIGZPdXRsaW5lSGFuZGxlcjsKLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRDbG9zZSA9IGZhbHNlOwotCXByaXZhdGUgbG9uZyBzdGFydFBlcmZUaW1lOwotCXByaXZhdGUgYm9vbGVhbiBmaXNSZWxlYXNlZDsKLQkvKioKLQkgKiBUaGUgYWN0aW9uIGdyb3VwIGZvciBmb2xkaW5nLgotCSAqLwotCXByaXZhdGUgRm9sZGluZ0FjdGlvbkdyb3VwIGZGb2xkaW5nR3JvdXA7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGZTdGF0dXNMaW5lTGFiZWxQcm92aWRlcjsKLQotCXByaXZhdGUgU2VtYW50aWNIaWdobGlnaHRpbmdNYW5hZ2VyIGZTZW1hbnRpY01hbmFnZXI7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGZTZWxlY3Rpb25DaGFuZ2VkRnJvbUdvdG8gPSBmYWxzZTsKLQotCXByaXZhdGUgZmluYWwgQ2hhcmFjdGVyUGFpckxpc3RlbmVyIGZQYWlySW5zZXJ0ZXIgPSBuZXcgQ2hhcmFjdGVyUGFpckxpc3RlbmVyKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IFN0cnVjdHVyZWQgVGV4dCBFZGl0b3IuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0RWRpdG9yKCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplRG9jdW1lbnRQcm92aWRlcihudWxsKTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgYWJvdXRUb1NhdmVNb2RlbCgpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IGdldEludGVybmFsTW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTb3VyY2VNZW51QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSkgewotCQlJTWVudU1hbmFnZXIgc3ViTWVudT0gbmV3IE1lbnVNYW5hZ2VyKFNTRVVJTWVzc2FnZXMuU291cmNlTWVudV9sYWJlbCwgSVN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlNPVVJDRV9DT05URVhUX01FTlVfSUQpOwotCQlzdWJNZW51LmFkZChuZXcgU2VwYXJhdG9yKElTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5TT1VSQ0VfQkVHSU4pKTsKLQkJc3ViTWVudS5hZGQobmV3IFNlcGFyYXRvcihJU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuU09VUkNFX0FERElUSU9OUykpOwotCQlzdWJNZW51LmFkZChuZXcgU2VwYXJhdG9yKElTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5TT1VSQ0VfRU5EKSk7Ci0JCW1lbnUuYXBwZW5kVG9Hcm91cChJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9FRElULCBzdWJNZW51KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZhY3Rvck1lbnVBY3Rpb25zKElNZW51TWFuYWdlciBtZW51KSB7Ci0JCUlNZW51TWFuYWdlciBzdWJNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKFNTRVVJTWVzc2FnZXMuUmVmYWN0b3JNZW51X2xhYmVsLCBJU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVGQUNUT1JfQ09OVEVYVF9NRU5VX0lEKTsKLQkJbWVudS5hcHBlbmRUb0dyb3VwKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX0VESVQsIHN1Yk1lbnUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRleHRNZW51QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSkgewotCQkvLyBPbmx5IG9mZmVyIGFjdGlvbnMgdGhhdCBhZmZlY3QgdGhlIHRleHQgaWYgdGhlIHZpZXdlciBhbGxvd3MKLQkJLy8gbW9kaWZpY2F0aW9uIGFuZCBzdXBwb3J0cyBhbnkgb2YgdGhlc2Ugb3BlcmF0aW9ucwotCi0JCS8vIFNvbWUgRGVzaWduIGVkaXRvcnMgKERURCkgcmVseSBvbiB0aGlzIHZpZXcgZm9yIHRoZWlyIG93biB1c2VzCi0JCW1lbnUuYXBwZW5kVG9Hcm91cChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkdST1VQX0FERCwgZlNob3dQcm9wZXJ0aWVzQWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRXh0ZW5kZWRDb250ZXh0TWVudUFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGMgPSBnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQkJaWYgKGMgaW5zdGFuY2VvZiBJUG9wdXBNZW51Q29udHJpYnV0b3IpIHsKLQkJCSgoSVBvcHVwTWVudUNvbnRyaWJ1dG9yKSBjKS5jb250cmlidXRlVG9Qb3B1cE1lbnUobWVudSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlFeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBFeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIoKTsKLQkJCUlFeHRlbmRlZENvbnRyaWJ1dG9yIHBtYyA9IGJ1aWxkZXIucmVhZEFjdGlvbkV4dGVuc2lvbnMoZ2V0Q29uZmlndXJhdGlvblBvaW50cygpKTsKLQkJCWlmIChwbWMgIT0gbnVsbCkgewotCQkJCXBtYy5zZXRBY3RpdmVFZGl0b3IodGhpcyk7Ci0JCQkJcG1jLmNvbnRyaWJ1dGVUb1BvcHVwTWVudShtZW51KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEV4dGVuZGVkUnVsZXJDb250ZXh0TWVudUFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJLy8gbm9uZSBhdCB0aGlzIGxldmVsCi0JfQotCi0KLQotCS8qKgotCSAqIFN0YXJ0cyBiYWNrZ3JvdW5kIG1vZGUuCi0JICogPHA+Ci0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICovCi0Jdm9pZCBiZWdpbkJhY2tncm91bmRPcGVyYXRpb24oKSB7Ci0JCWZCYWNrZ3JvdW5kSm9iRW5kZWQgPSBmYWxzZTsKLQkJLy8gaWYgYWxyZWFkeSBpbiBidXN5IHN0YXRlLCBubyBuZWVkIHRvIGRvIGFueXRoaW5nCi0JCS8vIGFuZCwgd2Ugb25seSBzdGFydCwgb3IgcmVzZXQsIHRoZSB0aW1lZCBidXN5Ci0JCS8vIHN0YXRlIHdoZW4gd2UgZ2V0IHRoZSAiZW5kQmFja2dyb3VuZE9wZXJhdGlvbiIgY2FsbC4KLQkJaWYgKCFpbkJ1c3lTdGF0ZSgpKSB7Ci0JCQliZWdpbkJ1c3lTdGF0ZUludGVybmFsKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYmVnaW5CdXN5U3RhdGVJbnRlcm5hbCgpIHsKLQotCQlmQnVzeVN0YXRlID0gdHJ1ZTsKLQkJc3RhcnRCdXN5VGltZXIoKTsKLQotCQlJU291cmNlVmlld2VyIHZpZXdlciA9IGdldFNvdXJjZVZpZXdlcigpOwotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRWaWV3ZXIpIHsKLQkJCSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcikuYmVnaW5CYWNrZ3JvdW5kVXBkYXRlKCk7Ci0KLQkJfQotCQlzaG93QnVzeSh0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3IjY2xvc2UoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZShmaW5hbCBib29sZWFuIHNhdmUpIHsKLQkJLyoKLQkJICogSW5zdGVhZCBvZiB1cyBjbG9zaW5nIGRpcmVjdGx5LCB3ZSBoYXZlIHRvIGNsb3NlIHdpdGggb3VyCi0JCSAqIGNvbnRhaW5pbmcgKG11bHRpcGFnZSkgZWRpdG9yLCBpZiBpdCBleGlzdHMuCi0JCSAqLwotCQlpZiAoZ2V0U2l0ZSgpID09IG51bGwpIHsKLQkJCS8vIGlmIHNpdGUgaGFzbid0IGJlZW4gc2V0IHlldCwgdGhlbiB3ZSdyZSBub3QKLQkJCS8vIGNvbXBsZXRlbHkgb3BlbgotCQkJLy8gc28gc2V0IGEgZmxhZyBub3QgdG8gb3BlbgotCQkJc2hvdWxkQ2xvc2UgPSB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldEVkaXRvclBhcnQoKSAhPSBudWxsKSB7Ci0JCQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpOwotCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKGdldEVkaXRvclBhcnQoKSwgc2F2ZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN1cGVyLmNsb3NlKHNhdmUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhY3RpdmF0ZUNvbnRleHRzKElDb250ZXh0U2VydmljZSBzZXJ2aWNlKSB7Ci0JCWlmKHNlcnZpY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCVN0cmluZ1tdIGRlZmluaXRpb25zID0gZ2V0RGVmaW5pdGlvbnMoZ2V0Q29uZmlndXJhdGlvblBvaW50cygpKTsKLQkJCi0JCWlmKGRlZmluaXRpb25zICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIGNvbnRleHRzID0gbnVsbDsKLQkJCWZvcihpbnQgaSA9IDA7IGkgPCBkZWZpbml0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWNvbnRleHRzID0gU3RyaW5nVXRpbHMudW5wYWNrKGRlZmluaXRpb25zW2ldKTsKLQkJCQlmb3IoaW50IGogPSAwOyBqIDwgY29udGV4dHMubGVuZ3RoOyBqKyspCi0JCQkJCXNlcnZpY2UuYWN0aXZhdGVDb250ZXh0KGNvbnRleHRzW2pdLnRyaW0oKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgU3RyaW5nW10gZ2V0RGVmaW5pdGlvbnMoU3RyaW5nW10gaWRzKSB7Ci0JCUV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRlciA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gZGVmaW5pdGlvbnMgPSBudWxsOwotCQkKLQkJLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBjb25maWd1cmF0aW9uIGlkcyB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdCBoYXMKLQkJICogYW4gYWN0aXZlY29udGV4dHMgZGVmaW5pdGlvbgotCQkgKi8KLQkJZm9yKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJZGVmaW5pdGlvbnMgPSBidWlsZGVyLmdldERlZmluaXRpb25zKCJhY3RpdmVjb250ZXh0cyIsIGlkc1tpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKGRlZmluaXRpb25zICE9IG51bGwgJiYgZGVmaW5pdGlvbnMubGVuZ3RoID4gMCkKLQkJCQlyZXR1cm4gZGVmaW5pdGlvbnM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvciNjb2xsZWN0Q29udGV4dE1lbnVQcmVmZXJlbmNlUGFnZXMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBjb2xsZWN0Q29udGV4dE1lbnVQcmVmZXJlbmNlUGFnZXMoKSB7Ci0JCUxpc3QgYWxsSWRzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQkvLyBnZXQgY29udHJpYnV0ZWQgcHJlZmVyZW5jZSBwYWdlcwotCQlFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIGNvbmZpZ3VyYXRpb25JZHMgPSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbklkcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gZGVmaW5pdGlvbnMgPSBidWlsZGVyLmdldERlZmluaXRpb25zKCJwcmVmZXJlbmNlcGFnZXMiLCBjb25maWd1cmF0aW9uSWRzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZWZpbml0aW9ucy5sZW5ndGg7IGorKykgewotCQkJCVN0cmluZyBzb21lSWRzID0gZGVmaW5pdGlvbnNbal07Ci0JCQkJaWYgKHNvbWVJZHMgIT0gbnVsbCAmJiBzb21lSWRzLmxlbmd0aCgpID4gMCkgewotCQkJCQkvLyBzdXBwb3J0cyBtdWx0aXBsZSBjb21tYS1kZWxpbWl0ZWQgcGFnZSBJRHMgaW4gb25lCi0JCQkJCS8vIGVsZW1lbnQKLQkJCQkJU3RyaW5nW10gaWRzID0gU3RyaW5nVXRpbHMudW5wYWNrKHNvbWVJZHMpOwotCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGlkcy5sZW5ndGg7IGsrKykgewotCQkJCQkJLy8gdHJpbSwganVzdCB0byBrZWVwIHRoaW5ncyBjbGVhbgotCQkJCQkJU3RyaW5nIGlkID0gaWRzW2tdLnRyaW0oKTsKLQkJCQkJCWlmICghYWxsSWRzLmNvbnRhaW5zKGlkKSkgewotCQkJCQkJCWFsbElkcy5hZGQoaWQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIHBhZ2VzIGNvbnRyaWJ1dGVkIGJ5IHN1cGVyCi0JCVN0cmluZ1tdIHN1cGVyUGFnZXMgPSBzdXBlci5jb2xsZWN0Q29udGV4dE1lbnVQcmVmZXJlbmNlUGFnZXMoKTsKLQkJZm9yIChpbnQgbSA9IDA7IG0gPCBzdXBlclBhZ2VzLmxlbmd0aDsgbSsrKSB7Ci0JCQkvLyB0cmltLCBqdXN0IHRvIGtlZXAgdGhpbmdzIGNsZWFuCi0JCQlTdHJpbmcgaWQgPSBzdXBlclBhZ2VzW21dLnRyaW0oKTsKLQkJCWlmICghYWxsSWRzLmNvbnRhaW5zKGlkKSkgewotCQkJCWFsbElkcy5hZGQoaWQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChTdHJpbmdbXSkgYWxsSWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZSBhbmQgc2V0IGRvdWJsZS1jbGljayBhY3Rpb24gZm9yIHRoZSB2ZXJ0aWNhbCBydWxlcgotCSAqLwotCXByaXZhdGUgdm9pZCBjb21wdXRlQW5kU2V0RG91YmxlQ2xpY2tBY3Rpb24oKSB7Ci0JCS8qCi0JCSAqIE1ha2UgZG91YmxlLWNsaWNraW5nIG9uIHRoZSBydWxlciB0b2dnbGUgYSBicmVha3BvaW50IGluc3RlYWQgb2YKLQkJICogdG9nZ2xpbmcgYSBib29rbWFyay4gRm9yIGxpbmVzIHdoZXJlIGEgYnJlYWtwb2ludCB3b24ndCBiZSBjcmVhdGVkLAotCQkgKiBjcmVhdGUgYSBib29rbWFyayB0aHJvdWdoIHRoZSBjb250cmlidXRlZCBSdWxlckRvdWJsZUNsaWNrIGFjdGlvbi4KLQkJICovCi0JCXNldEFjdGlvbihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5SVUxFUl9ET1VCTEVfQ0xJQ0ssIG5ldyBUb2dnbGVCcmVha3BvaW50QWN0aW9uKHRoaXMsIGdldFZlcnRpY2FsUnVsZXIoKSwgZ2V0QWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJVTEVSX0RPVUJMRV9DTElDSykpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuRXh0ZW5kZWRUZXh0RWRpdG9yI2NvbmZpZ3VyZVNvdXJjZVZpZXdlckRlY29yYXRpb25TdXBwb3J0KG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQoU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQgc3VwcG9ydCkgewotCQlzdXBwb3J0LnNldENoYXJhY3RlclBhaXJNYXRjaGVyKGNyZWF0ZUNoYXJhY3RlclBhaXJNYXRjaGVyKCkpOwotCQlzdXBwb3J0LnNldE1hdGNoaW5nQ2hhcmFjdGVyUGFpbnRlclByZWZlcmVuY2VLZXlzKEVkaXRvclByZWZlcmVuY2VOYW1lcy5NQVRDSElOR19CUkFDS0VUUywgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLk1BVENISU5HX0JSQUNLRVRTX0NPTE9SKTsKLQotCQlzdXBlci5jb25maWd1cmVTb3VyY2VWaWV3ZXJEZWNvcmF0aW9uU3VwcG9ydChzdXBwb3J0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0JCVJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQlJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJLy8gVGV4dFZpZXcgQWN0aW9uIC0gbW92aW5nIHRoZSBzZWxlY3RlZCB0ZXh0IHRvCi0JCS8vIHRoZSBjbGlwYm9hcmQKLQkJLy8gb3ZlcnJpZGUgdGhlIGN1dC9wYXN0ZS9kZWxldGUgYWN0aW9uIHRvIG1ha2UKLQkJLy8gdGhlbSBydW4gb24gcmVhZC1vbmx5Ci0JCS8vIGZpbGVzCi0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIkVkaXRvcl9DdXRfIiwgdGhpcywgSVRleHRPcGVyYXRpb25UYXJnZXQuQ1VUKTsgLy8kTk9OLU5MUy0xJAotCQlhY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzLkNVVCk7Ci0JCXNldEFjdGlvbihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5DVVQsIGFjdGlvbik7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChhY3Rpb24sIElBYnN0cmFjdFRleHRFZGl0b3JIZWxwQ29udGV4dElkcy5DVVRfQUNUSU9OKTsKLQkJLy8gVGV4dFZpZXcgQWN0aW9uIC0gaW5zZXJ0aW5nIHRoZSBjbGlwYm9hcmQKLQkJLy8gY29udGVudCBhdCB0aGUgY3VycmVudAotCQkvLyBwb3NpdGlvbgotCQkvLyBvdmVycmlkZSB0aGUgY3V0L3Bhc3RlL2RlbGV0ZSBhY3Rpb24gdG8gbWFrZQotCQkvLyB0aGVtIHJ1biBvbiByZWFkLW9ubHkKLQkJLy8gZmlsZXMKLQkJYWN0aW9uID0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24ocmVzb3VyY2VCdW5kbGUsICJFZGl0b3JfUGFzdGVfIiwgdGhpcywgSVRleHRPcGVyYXRpb25UYXJnZXQuUEFTVEUpOyAvLyROT04tTkxTLTEkCi0JCWFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuUEFTVEUpOwotCQlzZXRBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUEFTVEUsIGFjdGlvbik7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChhY3Rpb24sIElBYnN0cmFjdFRleHRFZGl0b3JIZWxwQ29udGV4dElkcy5QQVNURV9BQ1RJT04pOwotCQkvLyBUZXh0VmlldyBBY3Rpb24gLSBkZWxldGluZyB0aGUgc2VsZWN0ZWQgdGV4dCBvcgotCQkvLyBpZiBzZWxlY3Rpb24gaXMKLQkJLy8gZW1wdHkgdGhlIGNoYXJhY3RlciBhdCB0aGUgcmlnaHQgb2YgdGhlIGN1cnJlbnQKLQkJLy8gcG9zaXRpb24KLQkJLy8gb3ZlcnJpZGUgdGhlIGN1dC9wYXN0ZS9kZWxldGUgYWN0aW9uIHRvIG1ha2UKLQkJLy8gdGhlbSBydW4gb24gcmVhZC1vbmx5Ci0JCS8vIGZpbGVzCi0JCWFjdGlvbiA9IG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiRWRpdG9yX0RlbGV0ZV8iLCB0aGlzLCBJVGV4dE9wZXJhdGlvblRhcmdldC5ERUxFVEUpOyAvLyROT04tTkxTLTEkCi0JCWFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuREVMRVRFKTsKLQkJc2V0QWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkRFTEVURSwgYWN0aW9uKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKGFjdGlvbiwgSUFic3RyYWN0VGV4dEVkaXRvckhlbHBDb250ZXh0SWRzLkRFTEVURV9BQ1RJT04pOwotCQkvLyBTb3VyY2VWaWV3IEFjdGlvbiAtIHJlcXVlc3RpbmcgY29udGVudCBhc3Npc3QgdG8KLQkJLy8gc2hvdyBjb21wbGV0ZXRpb24KLQkJLy8gcHJvcG9zYWxzIGZvciB0aGUgY3VycmVudCBpbnNlcnQgcG9zaXRpb24KLQkJYWN0aW9uID0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NPTlRFTlRBU1NJU1RfUFJPUE9TQUxTICsgVU5ERVJTQ09SRSwgdGhpcywgSVNvdXJjZVZpZXdlci5DT05URU5UQVNTSVNUX1BST1BPU0FMUyk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChhY3Rpb24sIElIZWxwQ29udGV4dElkcy5DT05UTU5VX0NPTlRFTlRBU1NJU1RfSEVMUElEKTsKLQkJYWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuQ09OVEVOVF9BU1NJU1RfUFJPUE9TQUxTKTsKLQkJc2V0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NPTlRFTlRBU1NJU1RfUFJPUE9TQUxTLCBhY3Rpb24pOwotCQltYXJrQXNTdGF0ZURlcGVuZGVudEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX1BST1BPU0FMUywgdHJ1ZSk7Ci0JCS8vIFNvdXJjZVZpZXcgQWN0aW9uIC0gcmVxdWVzdGluZyBjb250ZW50IGFzc2lzdCB0bwotCQkvLyBzaG93IHRoZSBjb250ZW50Ci0JCS8vIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBpbnNlcnQgcG9zaXRpb24KLQkJYWN0aW9uID0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24oU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX0NPTlRFWFRfSU5GT1JNQVRJT04gKyBVTkRFUlNDT1JFLCB0aGlzLCBJU291cmNlVmlld2VyLkNPTlRFTlRBU1NJU1RfQ09OVEVYVF9JTkZPUk1BVElPTik7Ci0JCWFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLkNPTlRFTlRfQVNTSVNUX0NPTlRFWFRfSU5GT1JNQVRJT04pOwotCQlzZXRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQ09OVEVOVEFTU0lTVF9DT05URVhUX0lORk9STUFUSU9OLCBhY3Rpb24pOwotCQltYXJrQXNTdGF0ZURlcGVuZGVudEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX0NPTlRFWFRfSU5GT1JNQVRJT04sIHRydWUpOwotCQkvLyBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBBY3Rpb24gLSByZXF1ZXN0aW5nIGZvcm1hdAotCQkvLyBvZiB0aGUgd2hvbGUKLQkJLy8gZG9jdW1lbnQKLQkJYWN0aW9uID0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9ET0NVTUVOVCArIFVOREVSU0NPUkUsIHRoaXMsIFN0cnVjdHVyZWRUZXh0Vmlld2VyLkZPUk1BVF9ET0NVTUVOVCk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChhY3Rpb24sIElIZWxwQ29udGV4dElkcy5DT05UTU5VX0ZPUk1BVF9ET0NfSEVMUElEKTsKLQkJYWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLkZPUk1BVF9ET0NVTUVOVCk7Ci0JCXNldEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfRE9DVU1FTlQsIGFjdGlvbik7Ci0JCW1hcmtBc1N0YXRlRGVwZW5kZW50QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9ET0NVTUVOVCwgdHJ1ZSk7Ci0JCW1hcmtBc1NlbGVjdGlvbkRlcGVuZGVudEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfRE9DVU1FTlQsIHRydWUpOwotCQkvLyBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBBY3Rpb24gLSByZXF1ZXN0aW5nIGZvcm1hdAotCQkvLyBvZiB0aGUgYWN0aXZlCi0JCS8vIGVsZW1lbnRzCi0JCWFjdGlvbiA9IG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKHJlc291cmNlQnVuZGxlLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfQUNUSVZFX0VMRU1FTlRTICsgVU5ERVJTQ09SRSwgdGhpcywgU3RydWN0dXJlZFRleHRWaWV3ZXIuRk9STUFUX0FDVElWRV9FTEVNRU5UUyk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChhY3Rpb24sIElIZWxwQ29udGV4dElkcy5DT05UTU5VX0ZPUk1BVF9FTEVNRU5UU19IRUxQSUQpOwotCQlhY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuRk9STUFUX0FDVElWRV9FTEVNRU5UUyk7Ci0JCXNldEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfQUNUSVZFX0VMRU1FTlRTLCBhY3Rpb24pOwotCQltYXJrQXNTdGF0ZURlcGVuZGVudEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfQUNUSVZFX0VMRU1FTlRTLCB0cnVlKTsKLQkJbWFya0FzU2VsZWN0aW9uRGVwZW5kZW50QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9BQ1RJVkVfRUxFTUVOVFMsIHRydWUpOwotCi0JCS8vIFN0cnVjdHVyZWRUZXh0RWRpdG9yIEFjdGlvbiAtIGFkZCBicmVha3BvaW50cyAoZmFsbGluZyBiYWNrIHRvIHRoZQotCQkvLyBjdXJyZW50IGRvdWJsZS1jbGljayBpZiB0aGV5IGNhbid0IGJlIGFkZGVkKQotCQlhY3Rpb24gPSBuZXcgVG9nZ2xlQnJlYWtwb2ludEFjdGlvbih0aGlzLCBnZXRWZXJ0aWNhbFJ1bGVyKCkpOwotCQlzZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5UT0dHTEVfQlJFQUtQT0lOVFMsIGFjdGlvbik7Ci0JCS8vIFN0cnVjdHVyZWRUZXh0RWRpdG9yIEFjdGlvbiAtIG1hbmFnZSBicmVha3BvaW50cwotCQlhY3Rpb24gPSBuZXcgTWFuYWdlQnJlYWtwb2ludEFjdGlvbih0aGlzLCBnZXRWZXJ0aWNhbFJ1bGVyKCkpOwotCQlzZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5NQU5BR0VfQlJFQUtQT0lOVFMsIGFjdGlvbik7Ci0JCS8vIFN0cnVjdHVyZWRUZXh0RWRpdG9yIEFjdGlvbiAtIGVkaXQgYnJlYWtwb2ludHMKLQkJYWN0aW9uID0gbmV3IEVkaXRCcmVha3BvaW50QWN0aW9uKHRoaXMsIGdldFZlcnRpY2FsUnVsZXIoKSk7Ci0JCXNldEFjdGlvbihBY3Rpb25EZWZpbml0aW9uSWRzLkVESVRfQlJFQUtQT0lOVFMsIGFjdGlvbik7Ci0JCS8vIFN0cnVjdHVyZWRUZXh0Vmlld2VyIEFjdGlvbiAtIG9wZW4gZmlsZSBvbiBzZWxlY3Rpb24KLQkJYWN0aW9uID0gbmV3IE9wZW5IeXBlcmxpbmtBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX09QRU5fRklMRSArIFVOREVSU0NPUkUsIHRoaXMsIGdldFNvdXJjZVZpZXdlcigpKTsKLQkJYWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLk9QRU5fRklMRSk7Ci0JCXNldEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9PUEVOX0ZJTEUsIGFjdGlvbik7Ci0KLQkJY29tcHV0ZUFuZFNldERvdWJsZUNsaWNrQWN0aW9uKCk7Ci0JCQotCQlJSGFuZGxlciBoYW5kbGVyID0gbmV3IEdvdG9NYXRjaGluZ0JyYWNrZXRIYW5kbGVyKCk7Ci0JICAgIElIYW5kbGVyU2VydmljZSBoYW5kbGVyU2VydmljZSA9IChJSGFuZGxlclNlcnZpY2UpIGdldFNpdGUoKS5nZXRTZXJ2aWNlKElIYW5kbGVyU2VydmljZS5jbGFzcyk7Ci0JICAgIGlmIChoYW5kbGVyU2VydmljZSAhPSBudWxsKQotCSAgICAgIGhhbmRsZXJTZXJ2aWNlLmFjdGl2YXRlSGFuZGxlcihBY3Rpb25EZWZpbml0aW9uSWRzLkdPVE9fTUFUQ0hJTkdfQlJBQ0tFVCwgaGFuZGxlcik7Ci0JICAgIGlmIChoYW5kbGVyU2VydmljZSAhPSBudWxsKSB7Ci0JICAgIAlmT3V0bGluZUhhbmRsZXIgPSBuZXcgUXVpY2tPdXRsaW5lSGFuZGxlcigpOwotCSAgICAJaGFuZGxlclNlcnZpY2UuYWN0aXZhdGVIYW5kbGVyKEFjdGlvbkRlZmluaXRpb25JZHMuU0hPV19PVVRMSU5FLCBmT3V0bGluZUhhbmRsZXIpOwotCSAgICB9Ci0KLQkJZlNob3dQcm9wZXJ0aWVzQWN0aW9uID0gbmV3IFNob3dQcm9wZXJ0aWVzQWN0aW9uKGdldEVkaXRvclBhcnQoKSwgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7Ci0JCWZGb2xkaW5nR3JvdXAgPSBuZXcgRm9sZGluZ0FjdGlvbkdyb3VwKHRoaXMsIGdldFNvdXJjZVZpZXdlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGluZUNoYW5nZUhvdmVyIGNyZWF0ZUNoYW5nZUhvdmVyKCkgewotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ2hhbmdlSG92ZXIoKTsgLy9uZXcgU3RydWN0dXJlZExpbmVDaGFuZ2VIb3ZlcigpOwotCX0KLQotCXByb3RlY3RlZCBJQ2hhcmFjdGVyUGFpck1hdGNoZXIgY3JlYXRlQ2hhcmFjdGVyUGFpck1hdGNoZXIoKSB7Ci0JCUlDaGFyYWN0ZXJQYWlyTWF0Y2hlciBtYXRjaGVyID0gbnVsbDsKLQkJRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlciBidWlsZGVyID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBpZHMgPSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBtYXRjaGVyID09IG51bGwgJiYgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJbWF0Y2hlciA9IChJQ2hhcmFjdGVyUGFpck1hdGNoZXIpIGJ1aWxkZXIuZ2V0Q29uZmlndXJhdGlvbihEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLklELCBpZHNbaV0pOwotCQl9Ci0JCWlmIChtYXRjaGVyID09IG51bGwpIHsKLQkJCW1hdGNoZXIgPSBuZXcgRGVmYXVsdENoYXJhY3RlclBhaXJNYXRjaGVyKG5ldyBjaGFyW117JygnLCAnKScsICd7JywgJ30nLCAnWycsICddJywgJzwnLCAnPicsICciJywgJyInLCAnXCcnLCAnXCcnfSk7Ci0JCX0KLQkJcmV0dXJuIG1hdGNoZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcHJlZmVyZW5jZSBzdG9yZSB0aGF0IGNvbWJpbmVzIHRoZSBzb3VyY2UgZWRpdG9yIHByZWZlcmVuY2VzCi0JICogd2l0aCB0aGUgYmFzZSBlZGl0b3IncyBwcmVmZXJlbmNlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIElQcmVmZXJlbmNlU3RvcmUKLQkgKi8KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgY3JlYXRlQ29tYmluZWRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3NlRWRpdG9yUHJlZnMgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgYmFzZUVkaXRvclByZWZzID0gRWRpdG9yc1VJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlyZXR1cm4gbmV3IENoYWluZWRQcmVmZXJlbmNlU3RvcmUobmV3IElQcmVmZXJlbmNlU3RvcmVbXXtzc2VFZGl0b3JQcmVmcywgYmFzZUVkaXRvclByZWZzfSk7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gY3JlYXRlQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCkgewotCQlDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gY2ZnID0gbnVsbDsKLQkJRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlciBidWlsZGVyID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBpZHMgPSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBjZmcgPT0gbnVsbCAmJiBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQljZmcgPSAoQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKSBidWlsZGVyLmdldENvbmZpZ3VyYXRpb24oRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5DT05URU5UT1VUTElORUNPTkZJR1VSQVRJT04sIGlkc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGNmZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNb2RlbERlcGVuZGVudEZpZWxkcygpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJU2VsZWN0aW9uQ29udmVydG9yIGNvbnZlcnRvciA9IChTZWxlY3Rpb25Db252ZXJ0b3IpIGZTdHJ1Y3R1cmVkTW9kZWwuZ2V0QWRhcHRlcihTZWxlY3Rpb25Db252ZXJ0b3IuY2xhc3MpOwotCQkJaWYgKGNvbnZlcnRvciAhPSBudWxsKQotCQkJCWZTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIuc2VsZWN0aW9uQ29udmVydG9yID0gY29udmVydG9yOwotCQkJZWxzZQotCQkJCWZTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIuc2VsZWN0aW9uQ29udmVydG9yID0gbmV3IFNlbGVjdGlvbkNvbnZlcnRvcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIDxwPgotCSAqIFVzZSBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gaWYgYSB2aWV3ZXJjb25maWd1cmF0aW9uIGhhcyBub3QKLQkgKiBhbHJlYWR5IGJlZW4gc2V0LiBBbHNvIGluaXRpYWxpemUgU3RydWN0dXJlZFRleHRWaWV3ZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdERlY29yYXRlZFRleHRFZGl0b3IjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJSUNvbnRleHRTZXJ2aWNlIGNvbnRleHRTZXJ2aWNlID0gKElDb250ZXh0U2VydmljZSkgZ2V0U2l0ZSgpLmdldFNlcnZpY2UoSUNvbnRleHRTZXJ2aWNlLmNsYXNzKTsKLQkJaWYgKGNvbnRleHRTZXJ2aWNlICE9IG51bGwpCi0JCQljb250ZXh0U2VydmljZS5hY3RpdmF0ZUNvbnRleHQoRURJVE9SX0tFWUJJTkRJTkdfU0NPUEVfSUQpOwotCi0JCWlmIChnZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkgPT0gbnVsbCkgewotCQkJQ29uZmlndXJhdGlvbkFuZFRhcmdldCBjYXQgPSBjcmVhdGVTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQlmVmlld2VyQ29uZmlndXJhdGlvblRhcmdldElkID0gY2F0LmdldFRhcmdldElkKCk7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gbmV3Vmlld2VyQ29uZmlndXJhdGlvbiA9IGNhdC5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQlzZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKG5ld1ZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl9Ci0KLQkJc3VwZXIuY3JlYXRlUGFydENvbnRyb2wocGFyZW50KTsKLQotCQkvLyBpbnN0ZWFkIG9mIGNhbGxpbmcgc2V0SW5wdXQgdHdpY2UsIHVzZSBpbml0aWFsaXplU291cmNlVmlld2VyKCkgdG8KLQkJLy8gaGFuZGxlIHNvdXJjZSB2aWV3ZXIgaW5pdGlhbGl6YXRpb24gcHJldmlvdXNseSBoYW5kbGVkIGJ5IHNldElucHV0Ci0JCWluaXRpYWxpemVTb3VyY2VWaWV3ZXIoKTsKLQotCQkvLyB1cGRhdGUgZWRpdG9yIGNvbnRleHQgbWVudSwgdmVydGljYWwgcnVsZXIgY29udGV4dCBtZW51LCBpbmZvcG9wCi0JCWlmIChnZXRJbnRlcm5hbE1vZGVsKCkgIT0gbnVsbCkgewotCQkJdXBkYXRlRWRpdG9yQ29udHJvbHNGb3JDb250ZW50VHlwZShnZXRJbnRlcm5hbE1vZGVsKCkuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdXBkYXRlRWRpdG9yQ29udHJvbHNGb3JDb250ZW50VHlwZShudWxsKTsKLQkJfQotCi0JCS8vIHVzZWQgZm9yIFNob3cgVG9vbHRpcCBEZXNjcmlwdGlvbgotCQlJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciBpbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yID0gbmV3IElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKCkgewotCQkJcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2wgY3JlYXRlSW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHNoZWxsKSB7Ci0JCQkJYm9vbGVhbiBjdXREb3duID0gZmFsc2U7Ci0JCQkJaW50IHN0eWxlID0gY3V0RG93biA/IFNXVC5OT05FIDogKFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCQkJcmV0dXJuIG5ldyBEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKHNoZWxsLCBTV1QuUkVTSVpFIHwgU1dULlRPT0wsIHN0eWxlLCBuZXcgSFRNTFRleHRQcmVzZW50ZXIoY3V0RG93bikpOwotCQkJfQotCQl9OwotCi0JCWZJbmZvcm1hdGlvblByZXNlbnRlciA9IG5ldyBJbmZvcm1hdGlvblByZXNlbnRlcihpbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKTsKLQkJZkluZm9ybWF0aW9uUHJlc2VudGVyLnNldFNpemVDb25zdHJhaW50cyg2MCwgMTAsIHRydWUsIHRydWUpOwotCQlmSW5mb3JtYXRpb25QcmVzZW50ZXIuaW5zdGFsbChnZXRTb3VyY2VWaWV3ZXIoKSk7Ci0JCWFkZFJlY29uY2lsaW5nTGlzdGVuZXJzKGdldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKSwgZ2V0VGV4dFZpZXdlcigpKTsKLQkJZlBhcnRMaXN0ZW5lciA9IG5ldyBQYXJ0TGlzdGVuZXIodGhpcyk7Ci0JCWdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLmFkZFBhcnRMaXN0ZW5lcihmUGFydExpc3RlbmVyKTsKLQkJaW5zdGFsbFNlbWFudGljSGlnaGxpZ2h0aW5nKCk7Ci0JCWlmIChmT3V0bGluZUhhbmRsZXIgIT0gbnVsbCkgewotCQkJSUluZm9ybWF0aW9uUHJlc2VudGVyIHByZXNlbnRlciA9IGNvbmZpZ3VyZU91dGxpbmVQcmVzZW50ZXIoZ2V0U291cmNlVmlld2VyKCksIGdldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKSk7Ci0JCQlpZiAocHJlc2VudGVyICE9IG51bGwpIHsKLQkJCQlwcmVzZW50ZXIuaW5zdGFsbChnZXRTb3VyY2VWaWV3ZXIoKSk7Ci0JCQkJZk91dGxpbmVIYW5kbGVyLmNvbmZpZ3VyZShwcmVzZW50ZXIpOwotCQkJfQotCQl9Ci0JCWluc3RhbGxDaGFyYWN0ZXJQYWlyaW5nKCk7Ci0JCUlTb3VyY2VWaWV3ZXIgdmlld2VyID0gZ2V0U291cmNlVmlld2VyKCk7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbikKLQkJCSgoSVRleHRWaWV3ZXJFeHRlbnNpb24pIHZpZXdlcikuYXBwZW5kVmVyaWZ5S2V5TGlzdGVuZXIoZlBhaXJJbnNlcnRlcik7Ci0JCQotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBjcmVhdGVQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbigpIHsKLQkJUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gY2ZnID0gbnVsbDsKLQkJRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlciBidWlsZGVyID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBpZHMgPSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBjZmcgPT0gbnVsbCAmJiBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQljZmcgPSAoUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24pIGJ1aWxkZXIuZ2V0Q29uZmlndXJhdGlvbihFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLlBST1BFUlRZU0hFRVRDT05GSUdVUkFUSU9OLCBpZHNbaV0pOwotCQl9Ci0JCXJldHVybiBjZmc7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIFNob3cgSW4gVGFyZ2V0IElEcyBmcm9tIHRoZSBFeHRlbmRlZCBDb25maWd1cmF0aW9uIGV4dGVuc2lvbgotCSAqIHBvaW50LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGNyZWF0ZVNob3dJblRhcmdldElkcygpIHsKLQkJTGlzdCBhbGxJZHMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQlFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIGNvbmZpZ3VyYXRpb25JZHMgPSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbklkcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gZGVmaW5pdGlvbnMgPSBidWlsZGVyLmdldERlZmluaXRpb25zKCJzaG93aW50YXJnZXQiLCBjb25maWd1cmF0aW9uSWRzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZWZpbml0aW9ucy5sZW5ndGg7IGorKykgewotCQkJCVN0cmluZyBzb21lSWRzID0gZGVmaW5pdGlvbnNbal07Ci0JCQkJaWYgKHNvbWVJZHMgIT0gbnVsbCAmJiBzb21lSWRzLmxlbmd0aCgpID4gMCkgewotCQkJCQlTdHJpbmdbXSBpZHMgPSBTdHJpbmdVdGlscy51bnBhY2soc29tZUlkcyk7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgaWRzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkvLyB0cmltLCBqdXN0IHRvIGtlZXAgdGhpbmdzIGNsZWFuCi0JCQkJCQlTdHJpbmcgaWQgPSBpZHNba10udHJpbSgpOwotCQkJCQkJaWYgKCFhbGxJZHMuY29udGFpbnMoaWQpKSB7Ci0JCQkJCQkJYWxsSWRzLmFkZChpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWFsbElkcy5jb250YWlucyhJUGFnZUxheW91dC5JRF9SRVNfTkFWKSkgewotCQkJYWxsSWRzLmFkZChJUGFnZUxheW91dC5JRF9SRVNfTkFWKTsKLQkJfQotCQlpZiAoIWFsbElkcy5jb250YWlucyhJUGFnZUxheW91dC5JRF9QUk9KRUNUX0VYUExPUkVSKSkgewotCQkJYWxsSWRzLmFkZChJUGFnZUxheW91dC5JRF9QUk9KRUNUX0VYUExPUkVSKTsKLQkJfQotCQlpZiAoIWFsbElkcy5jb250YWlucyhJUGFnZUxheW91dC5JRF9PVVRMSU5FKSkgewotCQkJYWxsSWRzLmFkZChJUGFnZUxheW91dC5JRF9PVVRMSU5FKTsKLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSBhbGxJZHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJU291cmNlRWRpdGluZ1RleHRUb29scyBjcmVhdGVTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKCkgewotCQlJU291cmNlRWRpdGluZ1RleHRUb29scyB0b29scyA9IG51bGw7Ci0JCUV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRlciA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gaWRzID0gZ2V0Q29uZmlndXJhdGlvblBvaW50cygpOwotCQlmb3IgKGludCBpID0gMDsgdG9vbHMgPT0gbnVsbCAmJiBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0b29scyA9IChJU291cmNlRWRpdGluZ1RleHRUb29scykgYnVpbGRlci5nZXRDb25maWd1cmF0aW9uKE51bGxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLklELCBpZHNbaV0pOwotCQl9Ci0JCWlmICh0b29scyA9PSBudWxsKSB7Ci0JCQl0b29scyA9IE51bGxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmdldEluc3RhbmNlKCk7Ci0JCQkoKE51bGxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSB0b29scykuc2V0VGV4dEVkaXRvcih0aGlzKTsKLQkJfQotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJbWV0aG9kID0gdG9vbHMuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoInNldFRleHRFZGl0b3IiLCBuZXcgQ2xhc3NbXXtTdHJ1Y3R1cmVkVGV4dEVkaXRvci5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW1ldGhvZCA9IHRvb2xzLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzZXRUZXh0RWRpdG9yIiwgbmV3IENsYXNzW117SVRleHRFZGl0b3IuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW1ldGhvZCA9IHRvb2xzLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzZXRUZXh0RWRpdG9yIiwgbmV3IENsYXNzW117SUVkaXRvclBhcnQuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQlpZiAoIW1ldGhvZC5pc0FjY2Vzc2libGUoKSkgewotCQkJCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQltZXRob2QuaW52b2tlKHRvb2xzLCBuZXcgT2JqZWN0W117dGhpc30pOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiUHJvYmxlbSBjcmVhdGluZyBJU291cmNlRWRpdGluZ1RleHRUb29scyBpbXBsZW1lbnRhdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdG9vbHM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgc291cmNlIHZpZXdlciB0byBiZSB1c2VkIGJ5IHRoaXMgZWRpdG9yCi0JICovCi0JcHJvdGVjdGVkIElTb3VyY2VWaWV3ZXIgY3JlYXRlU291cmNlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElWZXJ0aWNhbFJ1bGVyIHZlcnRpY2FsUnVsZXIsIGludCBzdHlsZXMpIHsKLQkJZkFubm90YXRpb25BY2Nlc3MgPSBjcmVhdGVBbm5vdGF0aW9uQWNjZXNzKCk7Ci0JCWZPdmVydmlld1J1bGVyID0gY3JlYXRlT3ZlcnZpZXdSdWxlcihnZXRTaGFyZWRDb2xvcnMoKSk7Ci0JCVN0cnVjdHVyZWRUZXh0Vmlld2VyIHNvdXJjZVZpZXdlciA9IGNyZWF0ZVN0cnVjdGVkVGV4dFZpZXdlcihwYXJlbnQsIHZlcnRpY2FsUnVsZXIsIHN0eWxlcyk7Ci0JCWluaXRTb3VyY2VWaWV3ZXIoc291cmNlVmlld2VyKTsKLQkJcmV0dXJuIHNvdXJjZVZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25BbmRUYXJnZXQgY3JlYXRlU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJQ29uZmlndXJhdGlvbkFuZFRhcmdldCBjYXQgPSBudWxsOwotCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gY2ZnID0gbnVsbDsKLQkJRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlciBidWlsZGVyID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBpZHMgPSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBjZmcgPT0gbnVsbCAmJiBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQljZmcgPSAoU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKSBidWlsZGVyLmdldENvbmZpZ3VyYXRpb24oRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5TT1VSQ0VWSUVXRVJDT05GSUdVUkFUSU9OLCBpZHNbaV0pOwotCQkJY2F0ID0gbmV3IENvbmZpZ3VyYXRpb25BbmRUYXJnZXQoaWRzW2ldLCBjZmcpOwotCQl9Ci0JCWlmIChjZmcgPT0gbnVsbCkgewotCQkJY2ZnID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpOwotCQkJU3RyaW5nIHRhcmdldGlkID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2RlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCQljYXQgPSBuZXcgQ29uZmlndXJhdGlvbkFuZFRhcmdldCh0YXJnZXRpZCwgY2ZnKTsKLQkJfQotCQlyZXR1cm4gY2F0OwotCX0KLQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBjcmVhdGVTdHJ1Y3RlZFRleHRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSVZlcnRpY2FsUnVsZXIgdmVydGljYWxSdWxlciwgaW50IHN0eWxlcykgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgdmVydGljYWxSdWxlciwgZ2V0T3ZlcnZpZXdSdWxlcigpLCBpc092ZXJ2aWV3UnVsZXJWaXNpYmxlKCksIHN0eWxlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVW5kb1JlZG9BY3Rpb25zKCkgewotCQkvLyBvdmVycmlkZGVuIHRvIGFkZCBpY29ucyB0byBhY3Rpb25zCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTE4NzcKLQkJc3VwZXIuY3JlYXRlVW5kb1JlZG9BY3Rpb25zKCk7Ci0JCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8pOwotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9VTkRPKSk7Ci0JCX0KLQotCQlhY3Rpb24gPSBnZXRBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVETyk7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1JFRE8pKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJTG9nZ2VyLnRyYWNlKCJTb3VyY2UgRWRpdG9yIiwgIlN0cnVjdHVyZWRUZXh0RWRpdG9yOjpkaXNwb3NlIGVudHJ5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcucGVyZlRlc3RBZGFwdGVyQ2xhc3NMb2FkaW5nKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIGNhbGxzIHRvIGdldEFkYXB0ZXI6ICIgKyBhZGFwdGVyUmVxdWVzdHMpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIHRpbWUgaW4gZ2V0QWRhcHRlcjogIiArIGFkYXB0ZXJUaW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJBdmVyYWdlIHRpbWUgcGVyIGNhbGw6ICIgKyAoYWRhcHRlclRpbWUgLyBhZGFwdGVyUmVxdWVzdHMpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBnZXRTb3VyY2VWaWV3ZXIoKTsKLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uKQotCQkJKChJVGV4dFZpZXdlckV4dGVuc2lvbikgdmlld2VyKS5yZW1vdmVWZXJpZnlLZXlMaXN0ZW5lcihmUGFpckluc2VydGVyKTsKLQotCQkvLyBkaXNwb3NlIG9mIGluZm9ybWF0aW9uIHByZXNlbnRlcgotCQlpZiAoZkluZm9ybWF0aW9uUHJlc2VudGVyICE9IG51bGwpIHsKLQkJCWZJbmZvcm1hdGlvblByZXNlbnRlci5kaXNwb3NlKCk7Ci0JCQlmSW5mb3JtYXRpb25QcmVzZW50ZXIgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGZPdXRsaW5lSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlmT3V0bGluZUhhbmRsZXIuZGlzcG9zZSgpOwotCQl9Ci0JCS8vIGRpc3Bvc2Ugb2Ygc2VsZWN0aW9uIGhpc3RvcnkKLQkJaWYgKGZTZWxlY3Rpb25IaXN0b3J5ICE9IG51bGwpIHsKLQkJCWZTZWxlY3Rpb25IaXN0b3J5LmRpc3Bvc2UoKTsKLQkJCWZTZWxlY3Rpb25IaXN0b3J5ID0gbnVsbDsKLQkJfQotCi0JCWlmIChmUHJvamVjdGlvblN1cHBvcnQgIT0gbnVsbCkgewotCQkJZlByb2plY3Rpb25TdXBwb3J0LmRpc3Bvc2UoKTsKLQkJCWZQcm9qZWN0aW9uU3VwcG9ydCA9IG51bGw7Ci0JCX0KLQotCQlpZiAoZkZvbGRpbmdHcm91cCAhPSBudWxsKSB7Ci0JCQlmRm9sZGluZ0dyb3VwLmRpc3Bvc2UoKTsKLQkJCWZGb2xkaW5nR3JvdXAgPSBudWxsOwotCQl9Ci0KLQkJLy8gZGlzcG9zZSBvZiBtZW51cyB0aGF0IHdlcmUgYmVpbmcgdHJhY2tlZAotCQlpZiAoZlRleHRDb250ZXh0TWVudSAhPSBudWxsKSB7Ci0JCQlmVGV4dENvbnRleHRNZW51LmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoZlJ1bGVyQ29udGV4dE1lbnUgIT0gbnVsbCkgewotCQkJZlJ1bGVyQ29udGV4dE1lbnUuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChmVGV4dENvbnRleHRNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmVGV4dENvbnRleHRNZW51TWFuYWdlci5yZW1vdmVNZW51TGlzdGVuZXIoZ2V0Q29udGV4dE1lbnVMaXN0ZW5lcigpKTsKLQkJCWZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZUFsbCgpOwotCQkJZlRleHRDb250ZXh0TWVudU1hbmFnZXIuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChmUnVsZXJDb250ZXh0TWVudU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZU1lbnVMaXN0ZW5lcihnZXRDb250ZXh0TWVudUxpc3RlbmVyKCkpOwotCQkJZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZUFsbCgpOwotCQkJZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJfQotCi0JCS8vIGFkZGVkIHRoaXMgMi8yMC8yMDA0IGJhc2VkIG9uIHByb2JlIHJlc3VsdHMgLS0KLQkJLy8gc2VlbXMgc2hvdWxkIGJlIGhhbmRsZWQgYnkgc2V0TW9kZWwobnVsbCksIGJ1dAotCQkvLyB0aGF0J3MgYSBtb3JlIHJhZGljYWwgY2hhbmdlLgotCQkvLyBhbmQsIHRlY2huaWNhbGx5IHNwZWFraW5nLCBzaG91bGQgbm90IGJlIG5lZWRlZCwKLQkJLy8gYnV0IG1ha2VzIGEgbWVtb3J5IGxlYWsKLQkJLy8gbGVzcyBzZXZlcmUuCi0JCWlmIChmU3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCWZTdHJ1Y3R1cmVkTW9kZWwucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKGdldEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCkpOwotCQl9Ci0KLQkJLy8gQlVHMTU1MzM1IC0gaWYgdGhlcmUgd2FzIG5vIGRvY3VtZW50IHByb3ZpZGVyLCB0aGVyZSB3YXMgbm90aGluZwotCQkvLyBhZGRlZAotCQkvLyB0byBkb2N1bWVudCwgc28gbm90aGluZyB0byByZW1vdmUKLQkJaWYgKGdldERvY3VtZW50UHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJaWYgKGRvYyBpbnN0YW5jZW9mIElFeGVjdXRpb25EZWxlZ2F0YWJsZSkgewotCQkJCQkoKElFeGVjdXRpb25EZWxlZ2F0YWJsZSkgZG9jKS5zZXRFeGVjdXRpb25EZWxlZ2F0ZShudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBzb21lIHRoaW5ncyBpbiB0aGUgY29uZmlndXJhdGlvbiBuZWVkIHRvIGNsZWFuCi0JCS8vIHVwIGFmdGVyIHRoZW1zZWx2ZXMKLQkJaWYgKGZPdXRsaW5lUGFnZSAhPSBudWxsKSB7Ci0JCQlpZiAoZk91dGxpbmVQYWdlIGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlICYmIGZPdXRsaW5lUGFnZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSkgZk91dGxpbmVQYWdlKS5yZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKGZPdXRsaW5lUGFnZUxpc3RlbmVyKTsKLQkJCX0KLQkJCWlmIChmT3V0bGluZVBhZ2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJZk91dGxpbmVQYWdlLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmT3V0bGluZVBhZ2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCQlmRWRpdG9yRGlzcG9zZWQgPSB0cnVlOwotCQlkaXNwb3NlTW9kZWxEZXBlbmRlbnRGaWVsZHMoKTsKLQotCQlpZiAoZkRyb3BUYXJnZXQgIT0gbnVsbCkKLQkJCWZEcm9wVGFyZ2V0LmRpc3Bvc2UoKTsKLQotCQlpZiAoZlBhcnRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIoZlBhcnRMaXN0ZW5lcik7Ci0JCQlmUGFydExpc3RlbmVyID0gbnVsbDsKLQkJfQotCi0JCXVuaW5zdGFsbFNlbWFudGljSGlnaGxpZ2h0aW5nKCk7Ci0KLQkJaWYgKGZQYWlySW5zZXJ0ZXIgIT0gbnVsbCkKLQkJCWZQYWlySW5zZXJ0ZXIuZGlzcG9zZSgpOwotCi0KLQkJc2V0UHJlZmVyZW5jZVN0b3JlKG51bGwpOwotCi0JCS8qCi0JCSAqIFN0cmljdGx5IHNwZWFraW5nLCBidXQgZm9sbG93aW5nIG51bGwgb3V0cyBzaG91bGQgbm90IGJlIG5lZWRlZCwKLQkJICogYnV0IGluIHRoZSBldmVudCBvZiBhIG1lbW9yeSBsZWFrLCB0aGV5IG1ha2UgdGhlIG1lbW9yeSBsZWFrIGxlc3MKLQkJICogc2V2ZXJlCi0JCSAqLwotCQlmRHJvcEFkYXB0ZXIgPSBudWxsOwotCQlmRHJvcFRhcmdldCA9IG51bGw7Ci0KLQkJaWYgKGZTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJZlN0cnVjdHVyZWRTZWxlY3Rpb25Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzZXRTdGF0dXNMaW5lTWVzc2FnZShudWxsKTsKLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJTG9nZ2VyLnRyYWNlKCJTb3VyY2UgRWRpdG9yIiwgIlN0cnVjdHVyZWRUZXh0RWRpdG9yOjpkaXNwb3NlIGV4aXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvciNkaXNwb3NlRG9jdW1lbnRQcm92aWRlcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZURvY3VtZW50UHJvdmlkZXIoKSB7Ci0JCWlmIChmU3RydWN0dXJlZE1vZGVsICE9IG51bGwgJiYgIWZpc1JlbGVhc2VkICYmICEoZ2V0RG9jdW1lbnRQcm92aWRlcigpIGluc3RhbmNlb2YgSU1vZGVsUHJvdmlkZXIpKSB7Ci0JCQlmU3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJZmlzUmVsZWFzZWQgPSB0cnVlOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2VEb2N1bWVudFByb3ZpZGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgbW9kZWwgc3BlY2lmaWMgZWRpdG9yIGhlbHBlcnMgc3VjaCBhcyBzdGF0dXNMaW5lSGVscGVyLgotCSAqIEJhc2ljYWxseSBhbnkgY29kZSByZXBlYXRlZCBpbiB1cGRhdGUoKSAmIGRpc3Bvc2UoKSBzaG91bGQgYmUgcGxhY2VkCi0JICogaGVyZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzcG9zZU1vZGVsRGVwZW5kZW50RmllbGRzKCkgewotCQlpZihmU3RydWN0dXJlZFNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpCi0JCQlmU3RydWN0dXJlZFNlbGVjdGlvblByb3ZpZGVyLnNlbGVjdGlvbkNvbnZlcnRvciA9IG5ldyBTZWxlY3Rpb25Db252ZXJ0b3IoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3IjZG9SZXZlcnRUb1NhdmVkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1JldmVydFRvU2F2ZWQoKSB7Ci0JCXN1cGVyLmRvUmV2ZXJ0VG9TYXZlZCgpOwotCQlpZiAoZk91dGxpbmVQYWdlICE9IG51bGwgJiYgZk91dGxpbmVQYWdlIGluc3RhbmNlb2YgSVVwZGF0ZSkgewotCQkJKChJVXBkYXRlKSBmT3V0bGluZVBhZ2UpLnVwZGF0ZSgpOwotCQl9Ci0JCS8vIHJlc2V0IHVuZG8KLQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jKS5nZXRVbmRvTWFuYWdlcigpLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7Ci0JCX0KLQotCQkvLyB1cGRhdGUgbWVudSB0ZXh0Ci0JCXVwZGF0ZU1lbnVUZXh0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IGFib3V0VG9TYXZlTW9kZWwoKTsKLQkJCXVwZGF0ZUVuY29kaW5nTWVtZW50bygpOwotCQkJc3VwZXIuZG9TYXZlKHByb2dyZXNzTW9uaXRvcik7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzYXZlZE1vZGVsKG1vZGVsKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjZG9TZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TZXRJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUVkaXRvcklucHV0IG9sZElucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKG9sZElucHV0ICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBvbGRkb2MgPSBnZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQob2xkSW5wdXQpOwotCQkJaWYgKG9sZGRvYyAhPSBudWxsICYmIG9sZGRvYyBpbnN0YW5jZW9mIElFeGVjdXRpb25EZWxlZ2F0YWJsZSkgewotCQkJCSgoSUV4ZWN1dGlvbkRlbGVnYXRhYmxlKSBvbGRkb2MpLnNldEV4ZWN1dGlvbkRlbGVnYXRlKG51bGwpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGZTdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCAmJiAhKGdldERvY3VtZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIElNb2RlbFByb3ZpZGVyKSkgewotCQkJZlN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJfQotCi0JCS8vYXR0ZW1wdCB0byBnZXQgdGhlIG1vZGVsIGZvciB0aGUgZ2l2ZW4gaW5wdXQKLQkJc3VwZXIuZG9TZXRJbnB1dChpbnB1dCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSB0cnlUb0dldE1vZGVsKGlucHV0KTsKLQkJCi0JCS8qIGlmIGNvdWxkIG5vdCBnZXQgdGhlIG1vZGVsIHByb21wdCB1c2VyIHRvIHVwZGF0ZSBjb250ZW50IHR5cGUKLQkJICogaWYgcHJlZmVyZW5jZXMgYWxsb3csIHRoZW4gdHJ5IHRvIGdldCBtb2RlbCBhZ2FpbgotCQkgKi8KLQkJaWYobW9kZWwgPT0gbnVsbCAmJglTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihFZGl0b3JQcmVmZXJlbmNlTmFtZXMuU0hPV19VTktOT1dOX0NPTlRFTlRfVFlQRV9NU0cpKSB7Ci0JCQkvLyBkaXNwbGF5IGEgZGlhbG9nIGluZm9ybWluZyB1c2VyIG9mIHVua25vd24gY29udGVudCB0eXBlIGdpdmluZyB0aGVtIGNoYW5jZSB0byB1cGRhdGUgcHJlZmVyZW5jZXMKLQkJCVVua25vd25Db250ZW50VHlwZURpYWxvZyBkaWFsb2cgPSBuZXcgVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpLCBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksIEVkaXRvclByZWZlcmVuY2VOYW1lcy5TSE9XX1VOS05PV05fQ09OVEVOVF9UWVBFX01TRyk7Ci0JCQlkaWFsb2cub3BlbigpOwotCi0JCQkvL3RyeSB0byBnZXQgbW9kZWwgYWdhaW4gaW4gaG9wZXMgdXNlciB1cGRhdGVkIHByZWZlcmVuY2VzCi0JCQlzdXBlci5kb1NldElucHV0KGlucHV0KTsKLQkJCW1vZGVsID0gdHJ5VG9HZXRNb2RlbChpbnB1dCk7Ci0JCQkKLQkJCS8vc3RpbGwgY291bGQgbm90IGdldCB0aGUgbW9kZWwgdG8gb3BlbiB0aGlzIGVkaXRvciBzbyBsb2cKLQkJCWlmKG1vZGVsID09IG51bGwpIHsKLQkJCQlsb2dVbmV4cGVjdGVkRG9jdW1lbnRLaW5kKGlucHV0KTsKLQkJCX0KLQkJfQotCi0JCWlmIChmU3RydWN0dXJlZE1vZGVsICE9IG51bGwgfHwgbW9kZWwgIT0gbnVsbCkgewotCQkJc2V0TW9kZWwobW9kZWwpOwotCQl9Ci0KLQkJaWYgKGdldEludGVybmFsTW9kZWwoKSAhPSBudWxsKSB7Ci0JCQl1cGRhdGVFZGl0b3JDb250cm9sc0ZvckNvbnRlbnRUeXBlKGdldEludGVybmFsTW9kZWwoKS5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl1cGRhdGVFZGl0b3JDb250cm9sc0ZvckNvbnRlbnRUeXBlKG51bGwpOwotCQl9Ci0KLQkJLy8gc3RhcnQgZWRpdG9yIHdpdGggc21hcnQgaW5zZXJ0IG1vZGUKLQkJc2V0SW5zZXJ0TW9kZShTTUFSVF9JTlNFUlQpOwotCX0KLQkKLQkvKioKLQkgKiA8cD5BdHRlbXB0cyB0byBnZXQgdGhlIHtAbGluayBJU3RydWN0dXJlZE1vZGVsfSBmb3IgdGhlIGdpdmVuIHtAbGluayBJRWRpdG9ySW5wdXR9PC9wPgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dCB0aGUge0BsaW5rIElFZGl0b3JJbnB1dH0gdG8gdHJ5IGFuZCBnZXQgdGhlIHtAbGluayBJU3RydWN0dXJlZE1vZGVsfSBmb3IKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgSVN0cnVjdHVyZWRNb2RlbH0gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgSUVkaXRvcklucHV0fSBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGFzc29jaWF0ZWQge0BsaW5rIElTdHJ1Y3R1cmVkTW9kZWx9IGNvdWxkIGJlIGZvdW5kLgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCB0cnlUb0dldE1vZGVsKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCi0JCUlEb2N1bWVudCBuZXdEb2N1bWVudCA9IGdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChpbnB1dCk7Ci0JCWlmIChuZXdEb2N1bWVudCBpbnN0YW5jZW9mIElFeGVjdXRpb25EZWxlZ2F0YWJsZSkgewotCQkJKChJRXhlY3V0aW9uRGVsZWdhdGFibGUpIG5ld0RvY3VtZW50KS5zZXRFeGVjdXRpb25EZWxlZ2F0ZShuZXcgRWRpdG9yRXhlY3V0aW9uQ29udGV4dCh0aGlzKSk7Ci0JCX0KLQotCQkvLyBpZiB3ZSBoYXZlIGEgTW9kZWwgcHJvdmlkZXIsIGdldCB0aGUgbW9kZWwgZnJvbSBpdAotCQlpZiAoZ2V0RG9jdW1lbnRQcm92aWRlcigpIGluc3RhbmNlb2YgSU1vZGVsUHJvdmlkZXIpIHsKLQkJCW1vZGVsID0gKChJTW9kZWxQcm92aWRlcikgZ2V0RG9jdW1lbnRQcm92aWRlcigpKS5nZXRNb2RlbChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmICghbW9kZWwuaXNTaGFyZWQoKSkgewotCQkJCUVkaXRvck1vZGVsVXRpbC5hZGRGYWN0b3JpZXNUbyhtb2RlbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobmV3RG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkvLyBjb3JyZXNwb25kaW5nIHJlbGVhc2VGcm9tRWRpdCBvY2N1cnMgaW4gZGlzcG9zZSgpCi0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KChJU3RydWN0dXJlZERvY3VtZW50KSBuZXdEb2N1bWVudCk7Ci0JCQlFZGl0b3JNb2RlbFV0aWwuYWRkRmFjdG9yaWVzVG8obW9kZWwpOwotCQl9IAotCQkKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdXAgdGhpcyBlZGl0b3IncyBjb250ZXh0IG1lbnUgYmVmb3JlIGl0IGlzIG1hZGUgdmlzaWJsZS4KLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVkdWNlZCB0byBwcm90ZWN0ZWQgbWV0aG9kIGluIHRoZSBmdXR1cmUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtZW51Ci0JICogICAgICAgICAgICB0aGUgbWVudQotCSAqLwotCXB1YmxpYyB2b2lkIGVkaXRvckNvbnRleHRNZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJLyoKLQkJICogVG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBKYXZhIEVkaXRvciwgd2Ugd2FudCB0byByZW1vdmUgU2hpZnRSaWdodAotCQkgKiBhbmQgU2hpZnRMZWZ0IGZyb20gdGhlIGNvbnRleHQgbWVudS4KLQkJICovCi0JCXN1cGVyLmVkaXRvckNvbnRleHRNZW51QWJvdXRUb1Nob3cobWVudSk7Ci0JCW1lbnUucmVtb3ZlKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlNISUZUX0xFRlQpOwotCQltZW51LnJlbW92ZShJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5TSElGVF9SSUdIVCk7Ci0KLQkJYWRkQ29udGV4dE1lbnVBY3Rpb25zKG1lbnUpOwotCQlhZGRTb3VyY2VNZW51QWN0aW9ucyhtZW51KTsKLQkJYWRkUmVmYWN0b3JNZW51QWN0aW9ucyhtZW51KTsKLQkJYWRkRXh0ZW5kZWRDb250ZXh0TWVudUFjdGlvbnMobWVudSk7Ci0JfQotCi0JLyoqCi0JICogRW5kIGJhY2tncm91bmQgbW9kZS4KLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqIDwvcD4KLQkgKi8KLQl2b2lkIGVuZEJhY2tncm91bmRPcGVyYXRpb24oKSB7Ci0JCWZCYWNrZ3JvdW5kSm9iRW5kZWQgPSB0cnVlOwotCQkvLyBub3RlLCB3ZSBkb24ndCBpbW1lZGlhdGVseSBlbmQgb3VyICdpbnRlcm5hbCBidXN5JyBzdGF0ZSwKLQkJLy8gc2luY2Ugd2UgbWF5IGdldCBtYW55IGNhbGxzIGluIGEgc2hvcnQgcGVyaW9kIG9mCi0JCS8vIHRpbWUuIFdlIGFsd2F5cyB3YWl0IGZvciB0aGUgdGltZSBvdXQuCi0JCXJlc2V0QnVzeVN0YXRlKCk7Ci0JfQotCi0JLyoqCi0JICogTm90ZSB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGluZGlyZWN0bHkgZnJvbSBiYWNrZ3JvdW5kIGpvYiBvcGVyYXRpb24KLQkgKiAuLi4gYnV0IGV4cGVjdGVkIHRvIGJlIGdhdXJkZWQgdGhlcmUgd2l0aCBJTG9jaywgcGx1cywgY2FuIGJlIGNhbGxlZAotCSAqIGRpcmVjdGx5IGZyb20gdGltZXIgdGhyZWFkLCBzbyB0aGUgdGltZXIncyBydW4gbWV0aG9kIGd1YXJkcyB3aXRoIElMb2NrCi0JICogdG9vLgotCSAqLwotCXByaXZhdGUgdm9pZCBlbmRCdXN5U3RhdGVJbnRlcm5hbCgpIHsKLQkJaWYgKGZCYWNrZ3JvdW5kSm9iRW5kZWQpIHsKLQkJCWZCdXN5VGltZXIuY2FuY2VsKCk7Ci0JCQlzaG93QnVzeShmYWxzZSk7Ci0KLQkJCUlTb3VyY2VWaWV3ZXIgdmlld2VyID0gZ2V0U291cmNlVmlld2VyKCk7Ci0JCQlpZiAodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRWaWV3ZXIpIHsKLQkJCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIpLmVuZEJhY2tncm91bmRVcGRhdGUoKTsKLQkJCX0KLQkJCWZCdXN5U3RhdGUgPSBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHdlIHdpbGwgb25seSBiZSBpbiB0aGlzIGJyYW5jaCBmb3IgYSBiYWNrIGdyb3VuZCBqb2IgdGhhdCBpcwotCQkJLy8gdGFraW5nCi0JCQkvLyBsb25nZXIgdGhhbiBvdXIgbm9ybWFsIHRpbWUtb3V0IHBlcmlvZCAobWVhbmluZyB3ZSBnb3Qgbm90aWZpZWQKLQkJCS8vIG9mCi0JCQkvLyB0aGUgdGltZW91dCAiaW5iZXR3ZWVuIiBjYWxscyB0byAnYmVnaW4nIGFuZAotCQkJLy8gJ2VuZEJhY2tncm91bmRPcGVyYXRpb24nLgotCQkJLy8gKHdoaWNoLCByZW1lbWJlciwgY2FuIG9ubHkgaGFwcGVuIHNpbmNlIHRoZXJlIGFyZSBtYW55IGNhbGxzIHRvCi0JCQkvLyBiZWdpbi9lbmQgaW4gYSBzaG9ydCBwZXJpb2Qgb2YgdGltZSwgYW5kIHdlIG9ubHkgInJlc2V0IiBvbiB0aGUKLQkJCS8vICdlbmRzJykuCi0JCQkvLyBJbiB0aGlzIGV2ZW50LCB0aGVyZSdzIHJlYWxseSBub3RoaW5nIHRvIGRvLCB3ZSdyZSBzdGlsbCBpbgotCQkJLy8gImJ1c3kgc3RhdGUiCi0JCQkvLyBhbmQgc2hvdWxkIHN0YXJ0IGEgbmV3IHJlc2V0IGN5Y2xlIG9uY2UgZW5kQmFja2dyb3VuZGpvYiBpcwotCQkJLy8gY2FsbGVkLgotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgcmVxdWlyZWQpIHsKLQkJaWYgKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnLnBlcmZUZXN0QWRhcHRlckNsYXNzTG9hZGluZykgewotCQkJc3RhcnRQZXJmVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQkvLyB0ZXh0IGVkaXRvcgotCQlJU3RydWN0dXJlZE1vZGVsIGludGVybmFsTW9kZWwgPSBnZXRJbnRlcm5hbE1vZGVsKCk7Ci0JCWlmIChJVGV4dEVkaXRvci5jbGFzcy5lcXVhbHMocmVxdWlyZWQpIHx8IElUZXh0RWRpdG9yRXh0ZW5zaW9uNS5jbGFzcy5lcXVhbHMocmVxdWlyZWQpIHx8IElUZXh0RWRpdG9yRXh0ZW5zaW9uNC5jbGFzcy5lcXVhbHMocmVxdWlyZWQpIHx8IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5jbGFzcy5lcXVhbHMocmVxdWlyZWQpIHx8IElUZXh0RWRpdG9yRXh0ZW5zaW9uMi5jbGFzcy5lcXVhbHMocmVxdWlyZWQpIHx8IElUZXh0RWRpdG9yRXh0ZW5zaW9uLmNsYXNzLmVxdWFscyhyZXF1aXJlZCkpIHsKLQkJCXJlc3VsdCA9IHRoaXM7Ci0JCX0KLQkJZWxzZSBpZiAoSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkgewotCQkJcmV0dXJuIGdldEVkaXRvclBhcnQoKS5nZXRTaXRlKCkuZ2V0QWRhcHRlcihJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZS5jbGFzcyk7Ci0JCX0KLQkJLy8gY29udGVudCBvdXRsaW5lIHBhZ2UKLQkJZWxzZSBpZiAoSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcy5lcXVhbHMocmVxdWlyZWQpKSB7Ci0JCQlpZiAoZk91dGxpbmVQYWdlID09IG51bGwgfHwgZk91dGxpbmVQYWdlLmdldENvbnRyb2woKSA9PSBudWxsIHx8IGZPdXRsaW5lUGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGNmZyA9IGNyZWF0ZUNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbigpOwotCQkJCWlmIChjZmcgIT0gbnVsbCkgewotCQkJCQlDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2Ugb3V0bGluZVBhZ2UgPSBuZXcgQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlKCk7Ci0JCQkJCW91dGxpbmVQYWdlLnNldENvbmZpZ3VyYXRpb24oY2ZnKTsKLQkJCQkJaWYgKGludGVybmFsTW9kZWwgIT0gbnVsbCkgewotCQkJCQkJb3V0bGluZVBhZ2Uuc2V0SW5wdXRDb250ZW50VHlwZUlkZW50aWZpZXIoaW50ZXJuYWxNb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSk7Ci0JCQkJCQlvdXRsaW5lUGFnZS5zZXRJbnB1dChpbnRlcm5hbE1vZGVsKTsKLQkJCQkJfQotCi0JCQkJCWlmIChmT3V0bGluZVBhZ2VMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQkJCQlmT3V0bGluZVBhZ2VMaXN0ZW5lciA9IG5ldyBPdXRsaW5lUGFnZUxpc3RlbmVyKCk7Ci0JCQkJCX0KLQotCQkJCQlvdXRsaW5lUGFnZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZk91dGxpbmVQYWdlTGlzdGVuZXIpOwotCQkJCQlvdXRsaW5lUGFnZS5hZGREb3VibGVDbGlja0xpc3RlbmVyKGZPdXRsaW5lUGFnZUxpc3RlbmVyKTsKLQotCQkJCQlmT3V0bGluZVBhZ2UgPSBvdXRsaW5lUGFnZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXN1bHQgPSBmT3V0bGluZVBhZ2U7Ci0JCX0KLQkJLy8gcHJvcGVydHkgc2hlZXQgcGFnZSwgYnV0IG9ubHkgaWYgdGhlIGlucHV0J3MgZWRpdGFibGUKLQkJZWxzZSBpZiAoSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzLmVxdWFscyhyZXF1aXJlZCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQlpZiAoZlByb3BlcnR5U2hlZXRQYWdlID09IG51bGwgfHwgZlByb3BlcnR5U2hlZXRQYWdlLmdldENvbnRyb2woKSA9PSBudWxsIHx8IGZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gY2ZnID0gY3JlYXRlUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24oKTsKLQkJCQlpZiAoY2ZnICE9IG51bGwpIHsKLQkJCQkJQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2UgPSBuZXcgQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2UoKTsKLQkJCQkJcHJvcGVydHlTaGVldFBhZ2Uuc2V0Q29uZmlndXJhdGlvbihjZmcpOwotCQkJCQlmUHJvcGVydHlTaGVldFBhZ2UgPSBwcm9wZXJ0eVNoZWV0UGFnZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXN1bHQgPSBmUHJvcGVydHlTaGVldFBhZ2U7Ci0JCX0KLQkJZWxzZSBpZiAoSURvY3VtZW50LmNsYXNzLmVxdWFscyhyZXF1aXJlZCkpIHsKLQkJCXJlc3VsdCA9IGdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJfQotCQllbHNlIGlmIChJU291cmNlRWRpdGluZ1RleHRUb29scy5jbGFzcy5lcXVhbHMocmVxdWlyZWQpKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKCk7Ci0JCX0KLQkJZWxzZSBpZiAoSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0LmNsYXNzLmVxdWFscyhyZXF1aXJlZCkpIHsKLQkJCXJlc3VsdCA9IFRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0LmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJZWxzZSBpZiAoSVRleHRFZGl0b3JFeHRlbnNpb240LmNsYXNzLmVxdWFscyhyZXF1aXJlZCkpIHsKLQkJCXJlc3VsdCA9IHRoaXM7Ci0JCX0KLQkJZWxzZSBpZiAoSVNob3dJblRhcmdldExpc3QuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkgewotCQkJcmVzdWx0ID0gbmV3IFNob3dJblRhcmdldExpc3RBZGFwdGVyKCk7Ci0JCX0KLQkJZWxzZSBpZiAoSVZlcnRpY2FsUnVsZXIuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkgewotCQkJcmV0dXJuIGdldFZlcnRpY2FsUnVsZXIoKTsKLQkJfQotCQllbHNlIGlmIChTZWxlY3Rpb25IaXN0b3J5LmNsYXNzLmVxdWFscyhyZXF1aXJlZCkpIHsKLQkJCWlmIChmU2VsZWN0aW9uSGlzdG9yeSA9PSBudWxsKQotCQkJCWZTZWxlY3Rpb25IaXN0b3J5ID0gbmV3IFNlbGVjdGlvbkhpc3RvcnkodGhpcyk7Ci0JCQlyZXN1bHQgPSBmU2VsZWN0aW9uSGlzdG9yeTsKLQkJfQotCQllbHNlIGlmIChJUmVzb3VyY2UuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gaW5wdXQuZ2V0QWRhcHRlcihyZXF1aXJlZCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwgJiYgaW50ZXJuYWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gaW50ZXJuYWxNb2RlbC5nZXRBZGFwdGVyKHJlcXVpcmVkKTsKLQkJCX0KLQkJCS8vIG90aGVycwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IHN1cGVyLmdldEFkYXB0ZXIocmVxdWlyZWQpOwotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotLy8JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiU3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0QWRhcHRlciByZXR1cm5pbmcgbnVsbCBmb3IgIiArIHJlcXVpcmVkKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1Zy5wZXJmVGVzdEFkYXB0ZXJDbGFzc0xvYWRpbmcpIHsKLQkJCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJYWRhcHRlclJlcXVlc3RzKys7Ci0JCQlhZGFwdGVyVGltZSArPSAoc3RvcCAtIHN0YXJ0UGVyZlRpbWUpOwotCQl9Ci0JCWlmIChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1Zy5wZXJmVGVzdEFkYXB0ZXJDbGFzc0xvYWRpbmcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgY2FsbHMgdG8gZ2V0QWRhcHRlcjogIiArIGFkYXB0ZXJSZXF1ZXN0cyk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgdGltZSBpbiBnZXRBZGFwdGVyOiAiICsgYWRhcHRlclRpbWUpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkF2ZXJhZ2UgdGltZSBwZXIgY2FsbDogIiArIChhZGFwdGVyVGltZSAvIGFkYXB0ZXJSZXF1ZXN0cykpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKSB7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlkZW50aWZpZXJJRCA9IG51bGw7Ci0JCWlmIChnZXRJbnRlcm5hbE1vZGVsKCkgIT0gbnVsbCkgewotCQkJY29udGVudFR5cGVJZGVudGlmaWVySUQgPSBnZXRJbnRlcm5hbE1vZGVsKCkuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0JCX0KLQkJcmV0dXJuIENvbmZpZ3VyYXRpb25Qb2ludENhbGN1bGF0b3IuZ2V0Q29uZmlndXJhdGlvblBvaW50cyh0aGlzLCBjb250ZW50VHlwZUlkZW50aWZpZXJJRCwgQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvci5TT1VSQ0UsIFN0cnVjdHVyZWRUZXh0RWRpdG9yLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGRlZCBjaGVja3MgdG8gb3ZlcmNvbWUgYnVnIHN1Y2ggdGhhdCBpZiB3ZSBhcmUgc2h1dHRpbmcgZG93biBpbiBhbgotCSAqIGVycm9yIGNvbmRpdGlvbiwgdGhlbiB2aWV3ZXIgd2lsbCBoYXZlIGFscmVhZHkgYmVlbiBkaXNwb3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEN1cnNvclBvc2l0aW9uKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gdGhpcyBtYXkgYmUgdG9vIGV4cGVuc2l2ZSBpbiB0ZXJtcyBvZgotCQkvLyBwZXJmb3JtYW5jZSwgdG8gZG8gdGhpcyBjaGVjawotCQkvLyBldmVyeSB0aW1lLCBqdXN0IHRvIGdhdXJkIGFnYWluc3QgZXJyb3IKLQkJLy8gY29uZGl0aW9uLgotCQkvLyBwZXJoYXBzIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5PwotCQlpZiAoZ2V0U291cmNlVmlld2VyKCkgIT0gbnVsbCAmJiBnZXRTb3VyY2VWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCkgIT0gbnVsbCAmJiAhZ2V0U291cmNlVmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpLmlzRGlzcG9zZWQoKSkgewotCQkJcmVzdWx0ID0gc3VwZXIuZ2V0Q3Vyc29yUG9zaXRpb24oKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9ICIwOjAiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCURpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBlZGl0b3IgcGFydC4KLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoaXMgZWRpdG9yIHBhcnQKLQkgKi8KLQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0RWRpdG9yUGFydCgpIHsKLQkJaWYgKGZFZGl0b3JQYXJ0ID09IG51bGwpCi0JCQlyZXR1cm4gdGhpczsKLQkJcmV0dXJuIGZFZGl0b3JQYXJ0OwotCX0KLQotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0SW50ZXJuYWxNb2RlbCgpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkTW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciBnZXRJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpIHsKLQkJaWYgKGZJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKTsKLQkJfQotCQlyZXR1cm4gZkludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBlZGl0b3IncyBTdHJ1Y3R1cmVkTW9kZWwuCi0JICogPHA+Ci0JICogTm90IEFQSS4gV2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gcmV0dXJucyB0aGlzIGVkaXRvcidzIElTdHJ1Y3R1cmVkTW9kZWwKLQkgKiBAZGVwcmVjYXRlZCAtIFRoaXMgbWV0aG9kIGFsbG93ZWQgZm9yIHVuY29udHJvbGxlZCBhY2Nlc3MgdG8gdGhlIG1vZGVsCi0JICogICAgICAgICAgICAgaW5zdGFuY2UgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiBJdCBpcwotCSAqICAgICAgICAgICAgIHJlY29tbWVuZGVkIHRoYXQgdGhlIGN1cnJlbnQgZG9jdW1lbnQgcHJvdmlkZXIgYmUgYXNrZWQgZm9yCi0JICogICAgICAgICAgICAgdGhlIGN1cnJlbnQgZG9jdW1lbnQgYW5kIHRoZSBJTW9kZWxNYW5hZ2VyIHRoZW4gYXNrZWQgZm9yCi0JICogICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgbW9kZWwgd2l0aAotCSAqICAgICAgICAgICAgIGdldEV4aXN0aW5nTW9kZWxGb3IqKElEb2N1bWVudCkuIFN1cHBvcnRlZCBkb2N1bWVudAotCSAqICAgICAgICAgICAgIHByb3ZpZGVycyBlbnN1cmUgdGhhdCB0aGUgZG9jdW1lbnQgbWFwcyB0byBhIHNoYXJlZAotCSAqICAgICAgICAgICAgIHN0cnVjdHVyZWQgbW9kZWwuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCUlEb2N1bWVudFByb3ZpZGVyIGRvY3VtZW50UHJvdmlkZXIgPSBnZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCQotCQlpZiAoZG9jdW1lbnRQcm92aWRlciA9PSBudWxsKSB7Ci0JCQkvLyB0aGlzIGluZGljYXRlZCBhbiBlcnJvciBpbiBzdGFydHVwIHNlcXVlbmNlCi0JCQlMb2dnZXIudHJhY2UoZ2V0Q2xhc3MoKS5nZXROYW1lKCksICJQcm9ncmFtIEluZm8gT25seTogZG9jdW1lbnQgcHJvdmlkZXIgd2FzIG51bGwgd2hlbiBtb2RlbCByZXF1ZXN0ZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJCi0JCS8vIFJlbWVtYmVyIGlmIHdlIGVudGVyZWQgdGhpcyBtZXRob2Qgd2l0aG91dCBhIG1vZGVsIGV4aXN0aW5nCi0JCWJvb2xlYW4gaW5pdGlhbE1vZGVsTnVsbCA9IChmU3RydWN0dXJlZE1vZGVsID09IG51bGwpOwotCQkKLQkJaWYgKGZTdHJ1Y3R1cmVkTW9kZWwgPT0gbnVsbCAmJiBkb2N1bWVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCS8vIGxhemlseSBzZXQgdGhlIG1vZGVsIGluc3RhbmNlLCBhbHRob3VnaCB0aGlzIGlzIGFuIEFCTk9STUFMCi0JCQkvLyBDT0RFIFBBVEgKLQkJCWlmIChkb2N1bWVudFByb3ZpZGVyIGluc3RhbmNlb2YgSU1vZGVsUHJvdmlkZXIpIHsKLQkJCQlmU3RydWN0dXJlZE1vZGVsID0gKChJTW9kZWxQcm92aWRlcikgZG9jdW1lbnRQcm92aWRlcikuZ2V0TW9kZWwoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJZmlzUmVsZWFzZWQgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlEb2N1bWVudCBkb2MgPSBkb2N1bWVudFByb3ZpZGVyLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpOwotCQkJCWlmIChkb2MgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCS8qCi0JCQkJCSAqIENhbGxlZCBpbiB0aGlzIG1hbm5lciBiZWNhdXNlIGdldEV4aXN0aW5nTW9kZWwgY2FuIHNraXAKLQkJCQkJICogc29tZSBjYWxjdWxhdGlvbnMgYWx3YXlzIHBlcmZvcm1lZCBpbiBnZXRNb2RlbEZvckVkaXQKLQkJCQkJICovCi0JCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvYyk7Ci0JCQkJCWlmIChtb2RlbCA9PSBudWxsKSB7Ci0JCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KChJU3RydWN0dXJlZERvY3VtZW50KSBkb2MpOwotCQkJCQl9Ci0JCQkJCWZTdHJ1Y3R1cmVkTW9kZWwgPSBtb2RlbDsKLQkJCQkJZmlzUmVsZWFzZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUVkaXRvck1vZGVsVXRpbC5hZGRGYWN0b3JpZXNUbyhmU3RydWN0dXJlZE1vZGVsKTsKLQotCQkJaWYgKGluaXRpYWxNb2RlbE51bGwgJiYgZlN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJLyoKLQkJCQkgKiBETVc6IDkvMS8yMDAyIC0tIHdoeSBpcyB1cGRhdGUgY2FsbGVkIGhlcmU/IE5vIGNoYW5nZSBoYXMKLQkJCQkgKiBiZWVuIGluZGljYXRlZD8gSSdkIGxpa2UgdG8gcmVtb3ZlLCBidXQgd2lsbCBsZWF2ZSBmb3Igbm93Ci0JCQkJICogdG8gYXZvaWQgYnJlYWtpbmcgdGhpcyBoYWNrLiBTaG91bGQgbWVhc3VyZS9icmVha3BvaW50IHRvCi0JCQkJICogc2VlIGhvdyBsYXJnZSB0aGUgcHJvYmxlbSBpcy4gTWF5IGNhdXNlIHBlcmZvcm1hbmNlCi0JCQkJICogcHJvYmxlbXMuCi0JCQkJICogCi0JCQkJICogRE1XOiA5LzgvMjAwMiAtLSBub3Qgc3VyZSB3aHkgdGhpcyB3YXMgaGVyZSBpbml0aWFsbHksIGJ1dAotCQkJCSAqIHRoZSBpbnRlbnQvaGFjayBtdXN0IGhhdmUgYmVlbiB0byBjYWxsIHVwZGF0ZSBpZiB0aGlzIHdhcwotCQkJCSAqIHRoZSBmaXJzdCB0aW1lIGZTdHJ1Y3R1cmVkTW9kZWwgd2FzIHNldC4gU28sIEkgYWRkZWQgdGhlCi0JCQkJICogbG9naWMgdG8gY2hlY2sgZm9yIHRoYXQgImZpcnN0IHRpbWUiIGNhc2UuIEl0IHdvdWxkIGFwcGVhcgotCQkJCSAqIHdlIGRvbid0IHJlYWxseSBuZWVkLiBtYXkgcmVtb3ZlIGluIGZ1dHVyZSB3aGVuIGNhbiB0ZXN0Ci0JCQkJICogbW9yZS4KLQkJCQkgKi8KLQkJCQl1cGRhdGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlN0cnVjdHVyZWRNb2RlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuSVdvcmtiZW5jaFBhcnRPcmllbnRhdGlvbiNnZXRPcmllbnRhdGlvbigpCi0JICovCi0JcHVibGljIGludCBnZXRPcmllbnRhdGlvbigpIHsKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4NzE0Ci0JCXJldHVybiBTV1QuTEVGVF9UT19SSUdIVDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yI2dldFNlbGVjdGlvblByb3ZpZGVyKCkKLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvblByb3ZpZGVyIGdldFNlbGVjdGlvblByb3ZpZGVyKCkgewotCQlpZiAoZlN0cnVjdHVyZWRTZWxlY3Rpb25Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgcGFyZW50UHJvdmlkZXIgPSBzdXBlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJaWYgKHBhcmVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlmU3RydWN0dXJlZFNlbGVjdGlvblByb3ZpZGVyID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb25Qcm92aWRlcihwYXJlbnRQcm92aWRlciwgdGhpcyk7Ci0JCQkJZlN0cnVjdHVyZWRTZWxlY3Rpb25Qcm92aWRlci5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJdXBkYXRlU3RhdHVzTGluZShldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCVNlbGVjdGlvbkNvbnZlcnRvciBjb252ZXJ0b3IgPSAoU2VsZWN0aW9uQ29udmVydG9yKSBmU3RydWN0dXJlZE1vZGVsLmdldEFkYXB0ZXIoU2VsZWN0aW9uQ29udmVydG9yLmNsYXNzKTsKLQkJCQkJaWYgKGNvbnZlcnRvciAhPSBudWxsKSB7Ci0JCQkJCQlmU3RydWN0dXJlZFNlbGVjdGlvblByb3ZpZGVyLnNlbGVjdGlvbkNvbnZlcnRvciA9IGNvbnZlcnRvcjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZlN0cnVjdHVyZWRTZWxlY3Rpb25Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZlN0cnVjdHVyZWRTZWxlY3Rpb25Qcm92aWRlcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciNnZXRTdGF0dXNMaW5lTWFuYWdlcigpCi0JICogCi0JICogT3ZlcnJpZGRlbiB0byB1c2UgdGhlIHRvcC1sZXZlbCBlZGl0b3IgcGFydCdzIHN0YXR1cyBsaW5lCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBnZXRTdGF0dXNMaW5lTWFuYWdlcigpIHsKLQkJcmV0dXJuIGdldEVkaXRvclBhcnQoKS5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdG9yJ3Mgc291cmNlIHZpZXdlci4gVGhpcyBtZXRob2Qgd2FzIGNyZWF0ZWQgdG8gZXhwb3NlCi0JICogdGhlIHByb3RlY3RlZCBmaW5hbCBnZXRTb3VyY2VWaWV3ZXIoKSBtZXRob2QuCi0JICogPHA+Ci0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgZWRpdG9yJ3Mgc291cmNlIHZpZXdlcgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBnZXRUZXh0Vmlld2VyKCkgewotCQlyZXR1cm4gKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSBnZXRTb3VyY2VWaWV3ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBKdW1wcyB0byB0aGUgbWF0Y2hpbmcgYnJhY2tldC4KLQkgKi8KLQl2b2lkIGdvdG9NYXRjaGluZ0JyYWNrZXQoKSB7Ci0JCUlDaGFyYWN0ZXJQYWlyTWF0Y2hlciBtYXRjaGVyID0gY3JlYXRlQ2hhcmFjdGVyUGFpck1hdGNoZXIoKTsKLQkJaWYgKG1hdGNoZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciA9IGdldFNvdXJjZVZpZXdlcigpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzb3VyY2VWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVJlZ2lvbiBzZWxlY3Rpb24gPSBnZXRTaWduZWRTZWxlY3Rpb24oc291cmNlVmlld2VyKTsKLQotCQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gTWF0aC5hYnMoc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJaWYgKHNlbGVjdGlvbkxlbmd0aCA+IDEpIHsKLQkJCXNldFN0YXR1c0xpbmVFcnJvck1lc3NhZ2UoU1NFVUlNZXNzYWdlcy5Hb3RvTWF0Y2hpbmdCcmFja2V0X2Vycm9yX2ludmFsaWRTZWxlY3Rpb24pOwotCQkJc291cmNlVmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXREaXNwbGF5KCkuYmVlcCgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNvdXJjZUNhcmV0T2Zmc2V0ID0gc2VsZWN0aW9uLmdldE9mZnNldCgpICsgc2VsZWN0aW9uLmdldExlbmd0aCgpOwotCQlJUmVnaW9uIHJlZ2lvbiA9IG1hdGNoZXIubWF0Y2goZG9jdW1lbnQsIHNvdXJjZUNhcmV0T2Zmc2V0KTsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlzZXRTdGF0dXNMaW5lRXJyb3JNZXNzYWdlKFNTRVVJTWVzc2FnZXMuR290b01hdGNoaW5nQnJhY2tldF9lcnJvcl9ub01hdGNoaW5nQnJhY2tldCk7Ci0JCQlzb3VyY2VWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldERpc3BsYXkoKS5iZWVwKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gcmVnaW9uLmdldE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCi0JCWlmIChsZW5ndGggPCAxKQotCQkJcmV0dXJuOwotCi0JCWludCBhbmNob3IgPSBtYXRjaGVyLmdldEFuY2hvcigpOwotCi0JCS8vIGdvIHRvIGFmdGVyIHRoZSBtYXRjaCBpZiBtYXRjaGluZyB0byB0aGUgcmlnaHQKLQkJaW50IHRhcmdldE9mZnNldCA9IChJQ2hhcmFjdGVyUGFpck1hdGNoZXIuUklHSFQgPT0gYW5jaG9yKSA/IG9mZnNldCA6IG9mZnNldCArIGxlbmd0aDsKLQotCQlib29sZWFuIHZpc2libGUgPSBmYWxzZTsKLQkJaWYgKHNvdXJjZVZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHNvdXJjZVZpZXdlcjsKLQkJCXZpc2libGUgPSAoZXh0ZW5zaW9uLm1vZGVsT2Zmc2V0MldpZGdldE9mZnNldCh0YXJnZXRPZmZzZXQpID4gLTEpOwotCQl9Ci0JCWVsc2UgewotCQkJSVJlZ2lvbiB2aXNpYmxlUmVnaW9uID0gc291cmNlVmlld2VyLmdldFZpc2libGVSZWdpb24oKTsKLQkJCS8vIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQxOTUKLQkJCXZpc2libGUgPSAodGFyZ2V0T2Zmc2V0ID49IHZpc2libGVSZWdpb24uZ2V0T2Zmc2V0KCkgJiYgdGFyZ2V0T2Zmc2V0IDw9IHZpc2libGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyB2aXNpYmxlUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJfQotCi0JCWlmICghdmlzaWJsZSkgewotCQkJc2V0U3RhdHVzTGluZUVycm9yTWVzc2FnZShTU0VVSU1lc3NhZ2VzLkdvdG9NYXRjaGluZ0JyYWNrZXRfZXJyb3JfYnJhY2tldE91dHNpZGVTZWxlY3RlZEVsZW1lbnQpOwotCQkJc291cmNlVmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXREaXNwbGF5KCkuYmVlcCgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHNlbGVjdGlvbi5nZXRMZW5ndGgoKSA8IDApCi0JCQl0YXJnZXRPZmZzZXQgLT0gc2VsZWN0aW9uLmdldExlbmd0aCgpOwotCi0JCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJc291cmNlVmlld2VyLnNldFNlbGVjdGVkUmFuZ2UodGFyZ2V0T2Zmc2V0LCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJc291cmNlVmlld2VyLnJldmVhbFJhbmdlKHRhcmdldE9mZnNldCwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI2hhbmRsZUN1cnNvclBvc2l0aW9uQ2hhbmdlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ3Vyc29yUG9zaXRpb25DaGFuZ2VkKCkgewotCQlzdXBlci5oYW5kbGVDdXJzb3JQb3NpdGlvbkNoYW5nZWQoKTsKLQkJdXBkYXRlU3RhdHVzRmllbGQoU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuU1RBVFVTX0NBVEVHT1JZX09GRlNFVCk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjaGFuZGxlUHJlZmVyZW5jZVN0b3JlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJlZmVyZW5jZVN0b3JlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0KLQkJaWYgKEVkaXRvclByZWZlcmVuY2VOYW1lcy5FRElUT1JfVEVYVF9IT1ZFUl9NT0RJRklFUlMuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJdXBkYXRlSG92ZXJCZWhhdmlvcigpOwotCQl9Ci0JCQotCQkvL2VuYWJsZSBvciBkaXNhYmxlIGFzIHlvdSB0eXBlIHZhbGlkYXRpb24KLQkJZWxzZSBpZihDb21tb25FZGl0b3JQcmVmZXJlbmNlTmFtZXMuRVZBTFVBVEVfVEVNUE9SQVJZX1BST0JMRU1TLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCUlSZWNvbmNpbGVyIHJlY29uY2lsZXIgPSB0aGlzLmdldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRSZWNvbmNpbGVyKHRoaXMuZ2V0U291cmNlVmlld2VyKCkpOwotCQkJaWYgKHJlY29uY2lsZXIgaW5zdGFuY2VvZiBEb2N1bWVudFJlZ2lvblByb2Nlc3NvcikgewotCQkJCSgoRG9jdW1lbnRSZWdpb25Qcm9jZXNzb3IpIHJlY29uY2lsZXIpLnNldFZhbGlkYXRvclN0cmF0ZWd5RW5hYmxlZChpc1ZhbGlkYXRpb25FbmFibGVkKCkpOwotCQkJfQotCQl9Ci0KLQkJZWxzZSBpZiAoQWJzdHJhY3RTdHJ1Y3R1cmVkRm9sZGluZ1N0cmF0ZWd5LkZPTERJTkdfRU5BQkxFRC5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlpZiAoZ2V0U291cmNlVmlld2VyKCkgaW5zdGFuY2VvZiBQcm9qZWN0aW9uVmlld2VyKSB7Ci0JCQkJLy8gaW5zdGFsbCBwcm9qZWN0aW9uIHN1cHBvcnQgaWYgaXQgaGFzIG5vdCBldmVuIGJlZW4KLQkJCQkvLyBpbnN0YWxsZWQgeWV0Ci0JCQkJaWYgKGlzRm9sZGluZ0VuYWJsZWQoKSAmJiAoZlByb2plY3Rpb25TdXBwb3J0ID09IG51bGwpKSB7Ci0JCQkJCWluc3RhbGxQcm9qZWN0aW9uU3VwcG9ydCgpOwotCQkJCX0KLQkJCQlQcm9qZWN0aW9uVmlld2VyIHB2ID0gKFByb2plY3Rpb25WaWV3ZXIpIGdldFNvdXJjZVZpZXdlcigpOwotCQkJCWlmIChwdi5pc1Byb2plY3Rpb25Nb2RlKCkgIT0gaXNGb2xkaW5nRW5hYmxlZCgpKSB7Ci0JCQkJCWlmIChwdi5jYW5Eb09wZXJhdGlvbihQcm9qZWN0aW9uVmlld2VyLlRPR0dMRSkpIHsKLQkJCQkJCXB2LmRvT3BlcmF0aW9uKFByb2plY3Rpb25WaWV3ZXIuVE9HR0xFKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHVwZGF0ZSBjb250ZW50IGFzc2lzdCBwcmVmZXJlbmNlcwotCQllbHNlIGlmIChFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QUk9QT1NBTFNfQkFDS0dST1VORC5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciA9IGdldFNvdXJjZVZpZXdlcigpOwotCQkJaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gZ2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpOwotCQkJCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCQkJSUNvbnRlbnRBc3Npc3RhbnQgY29udGVudEFzc2lzdGFudCA9IGNvbmZpZ3VyYXRpb24uZ2V0Q29udGVudEFzc2lzdGFudChzb3VyY2VWaWV3ZXIpOwotCQkJCQlpZiAoY29udGVudEFzc2lzdGFudCBpbnN0YW5jZW9mIENvbnRlbnRBc3Npc3RhbnQpIHsKLQkJCQkJCUNvbnRlbnRBc3Npc3RhbnQgYXNzaXN0YW50ID0gKENvbnRlbnRBc3Npc3RhbnQpIGNvbnRlbnRBc3Npc3RhbnQ7Ci0JCQkJCQlSR0IgcmdiID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihnZXRQcmVmZXJlbmNlU3RvcmUoKSwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfUFJPUE9TQUxTX0JBQ0tHUk9VTkQpOwotCQkJCQkJQ29sb3IgY29sb3IgPSBFZGl0b3JVdGlsaXR5LmdldENvbG9yKHJnYik7Ci0JCQkJCQlhc3Npc3RhbnQuc2V0UHJvcG9zYWxTZWxlY3RvckJhY2tncm91bmQoY29sb3IpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gdXBkYXRlIGNvbnRlbnQgYXNzaXN0IHByZWZlcmVuY2VzCi0JCWVsc2UgaWYgKEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BST1BPU0FMU19GT1JFR1JPVU5ELmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCUlTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyID0gZ2V0U291cmNlVmlld2VyKCk7Ci0JCQlpZiAoc291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBnZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJCQlJQ29udGVudEFzc2lzdGFudCBjb250ZW50QXNzaXN0YW50ID0gY29uZmlndXJhdGlvbi5nZXRDb250ZW50QXNzaXN0YW50KHNvdXJjZVZpZXdlcik7Ci0JCQkJCWlmIChjb250ZW50QXNzaXN0YW50IGluc3RhbmNlb2YgQ29udGVudEFzc2lzdGFudCkgewotCQkJCQkJQ29udGVudEFzc2lzdGFudCBhc3Npc3RhbnQgPSAoQ29udGVudEFzc2lzdGFudCkgY29udGVudEFzc2lzdGFudDsKLQkJCQkJCVJHQiByZ2IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGdldFByZWZlcmVuY2VTdG9yZSgpLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QUk9QT1NBTFNfRk9SRUdST1VORCk7Ci0JCQkJCQlDb2xvciBjb2xvciA9IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IocmdiKTsKLQkJCQkJCWFzc2lzdGFudC5zZXRQcm9wb3NhbFNlbGVjdG9yRm9yZWdyb3VuZChjb2xvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyB1cGRhdGUgY29udGVudCBhc3Npc3QgcHJlZmVyZW5jZXMKLQkJZWxzZSBpZiAoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfUEFSQU1FVEVSU19CQUNLR1JPVU5ELmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCUlTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyID0gZ2V0U291cmNlVmlld2VyKCk7Ci0JCQlpZiAoc291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBnZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJCQlJQ29udGVudEFzc2lzdGFudCBjb250ZW50QXNzaXN0YW50ID0gY29uZmlndXJhdGlvbi5nZXRDb250ZW50QXNzaXN0YW50KHNvdXJjZVZpZXdlcik7Ci0JCQkJCWlmIChjb250ZW50QXNzaXN0YW50IGluc3RhbmNlb2YgQ29udGVudEFzc2lzdGFudCkgewotCQkJCQkJQ29udGVudEFzc2lzdGFudCBhc3Npc3RhbnQgPSAoQ29udGVudEFzc2lzdGFudCkgY29udGVudEFzc2lzdGFudDsKLQkJCQkJCVJHQiByZ2IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGdldFByZWZlcmVuY2VTdG9yZSgpLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QQVJBTUVURVJTX0JBQ0tHUk9VTkQpOwotCQkJCQkJQ29sb3IgY29sb3IgPSBFZGl0b3JVdGlsaXR5LmdldENvbG9yKHJnYik7Ci0JCQkJCQlhc3Npc3RhbnQuc2V0Q29udGV4dEluZm9ybWF0aW9uUG9wdXBCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJCQkJCWFzc2lzdGFudC5zZXRDb250ZXh0U2VsZWN0b3JCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHVwZGF0ZSBjb250ZW50IGFzc2lzdCBwcmVmZXJlbmNlcwotCQllbHNlIGlmIChFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QQVJBTUVURVJTX0ZPUkVHUk9VTkQuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIgPSBnZXRTb3VyY2VWaWV3ZXIoKTsKLQkJCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGdldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKTsKLQkJCQlpZiAoY29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCUlDb250ZW50QXNzaXN0YW50IGNvbnRlbnRBc3Npc3RhbnQgPSBjb25maWd1cmF0aW9uLmdldENvbnRlbnRBc3Npc3RhbnQoc291cmNlVmlld2VyKTsKLQkJCQkJaWYgKGNvbnRlbnRBc3Npc3RhbnQgaW5zdGFuY2VvZiBDb250ZW50QXNzaXN0YW50KSB7Ci0JCQkJCQlDb250ZW50QXNzaXN0YW50IGFzc2lzdGFudCA9IChDb250ZW50QXNzaXN0YW50KSBjb250ZW50QXNzaXN0YW50OwotCQkJCQkJUkdCIHJnYiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoZ2V0UHJlZmVyZW5jZVN0b3JlKCksIEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BBUkFNRVRFUlNfRk9SRUdST1VORCk7Ci0JCQkJCQlDb2xvciBjb2xvciA9IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IocmdiKTsKLQkJCQkJCWFzc2lzdGFudC5zZXRDb250ZXh0SW5mb3JtYXRpb25Qb3B1cEZvcmVncm91bmQoY29sb3IpOwotCQkJCQkJYXNzaXN0YW50LnNldENvbnRleHRTZWxlY3RvckZvcmVncm91bmQoY29sb3IpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIuaGFuZGxlUHJlZmVyZW5jZVN0b3JlQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGluQnVzeVN0YXRlKCkgewotCQlyZXR1cm4gZkJ1c3lTdGF0ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0I2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCS8vIGlmIHdlJ3ZlIGdvdHRlbiBhbiBlcnJvciBlbHNld2hlcmUsIGJlZm9yZQotCQkvLyB3ZSd2ZSBhY3R1YWxseSBvcGVuZWQsIHRoZW4gZG9uJ3Qgb3Blbi4KLQkJaWYgKHNob3VsZENsb3NlKSB7Ci0JCQlzZXRTaXRlKHNpdGUpOwotCQkJY2xvc2UoZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGRvY3VtZW50IHByb3ZpZGVyIGZvciB0aGlzIGVkaXRvci4KLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRQcm92aWRlcgotCSAqICAgICAgICAgICAgZG9jdW1lbnRQcm92aWRlciB0byBpbml0aWFsaXplCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURvY3VtZW50UHJvdmlkZXIoSURvY3VtZW50UHJvdmlkZXIgZG9jdW1lbnRQcm92aWRlcikgewotCQlpZiAoZG9jdW1lbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlzZXREb2N1bWVudFByb3ZpZGVyKGRvY3VtZW50UHJvdmlkZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciNpbml0aWFsaXplRHJhZ0FuZERyb3Aob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRHJhZ0FuZERyb3AoSVNvdXJjZVZpZXdlciB2aWV3ZXIpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlpZiAoc3RvcmUgIT0gbnVsbCAmJiBzdG9yZS5nZXRCb29sZWFuKFBSRUZFUkVOQ0VfVEVYVF9EUkFHX0FORF9EUk9QX0VOQUJMRUQpKQotCQkJaW5pdGlhbGl6ZURyb3Aodmlld2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRHJvcChJVGV4dFZpZXdlciB0ZXh0Vmlld2VyKSB7Ci0JCWludCBvcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkU7Ci0JCWZEcm9wVGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQodGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCksIG9wZXJhdGlvbnMpOwotCQlmRHJvcEFkYXB0ZXIgPSBuZXcgUmVhZE9ubHlBd2FyZURyb3BUYXJnZXRBZGFwdGVyKHRydWUpOwotCQlmRHJvcEFkYXB0ZXIuc2V0VGFyZ2V0RWRpdG9yKHRoaXMpOwotCQlmRHJvcEFkYXB0ZXIuc2V0VGFyZ2V0SURzKGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKSk7Ci0JCWZEcm9wQWRhcHRlci5zZXRUZXh0Vmlld2VyKHRleHRWaWV3ZXIpOwotCQlmRHJvcFRhcmdldC5zZXRUcmFuc2ZlcihmRHJvcEFkYXB0ZXIuZ2V0VHJhbnNmZXJzKCkpOwotCQlmRHJvcFRhcmdldC5hZGREcm9wTGlzdGVuZXIoZkRyb3BBZGFwdGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yI2luaXRpYWxpemVFZGl0b3IoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFZGl0b3IoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVFZGl0b3IoKTsKLQotCQlzZXRQcmVmZXJlbmNlU3RvcmUoY3JlYXRlQ29tYmluZWRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0KLQkJc2V0UmFuZ2VJbmRpY2F0b3IobmV3IERlZmF1bHRSYW5nZUluZGljYXRvcigpKTsKLQkJc2V0RWRpdG9yQ29udGV4dE1lbnVJZChFRElUT1JfQ09OVEVYVF9NRU5VX0lEKTsKLQkJaW5pdGlhbGl6ZURvY3VtZW50UHJvdmlkZXIobnVsbCk7Ci0JCS8vIHNldCB0aGUgaW5mb3BvcCBmb3Igc291cmNlIHZpZXdlcgotCQlTdHJpbmcgaGVscElkID0gZ2V0SGVscENvbnRleHRJZCgpOwotCQkvLyBubyBpbmZvcG9wIHNldCBvciB1c2luZyBkZWZhdWx0IHRleHQgZWRpdG9yIGhlbHAsIHVzZSBkZWZhdWx0Ci0JCWlmIChoZWxwSWQgPT0gbnVsbCB8fCBJVGV4dEVkaXRvckhlbHBDb250ZXh0SWRzLlRFWFRfRURJVE9SLmVxdWFscyhoZWxwSWQpKQotCQkJaGVscElkID0gSUhlbHBDb250ZXh0SWRzLlhNTF9TT1VSQ0VfVklFV19IRUxQSUQ7Ci0JCXNldEhlbHBDb250ZXh0SWQoaGVscElkKTsKLQkJLy8gZGVmZWN0IDIwMzE1OCAtIGRpc2FibGUgcnVsZXIgY29udGV4dCBtZW51IGZvcgotCQkvLyBiZXRhCi0JCS8vIHNldFJ1bGVyQ29udGV4dE1lbnVJZChSVUxFUl9DT05URVhUX01FTlVfSUQpOwotCQljb25maWd1cmVJbnNlcnRNb2RlKFNNQVJUX0lOU0VSVCwgdHJ1ZSk7Ci0KLQkJLy8gZW5hYmxlIHRoZSBiYXNlIHNvdXJjZSBlZGl0b3IgYWN0aXZpdHkgd2hlbiBlZGl0b3Igb3BlbnMKLQkJdHJ5IHsKLQkJCS8vIEZJWE1FOiAtIGNvbW1lbnRlZCBvdXQgdG8gYXZvaWQgbWlub3IgZGVwZW5kYW5jeSBkdXJpbmcKLQkJCS8vIHRyYW5zaXRpb24gdG8gb3JnLmVjbGlwc2UKLQkJCS8vIFdUUEFjdGl2aXR5QnJpZGdlLmdldEluc3RhbmNlKCkuZW5hYmxlQWN0aXZpdHkoQ09SRV9TU0VfQUNUSVZJVFlfSUQsCi0JCQkvLyB0cnVlKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIHQpIHsKLQkJCS8vIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggZW5hYmxpbmcgYWN0aXZpdHksIGp1c3QgbG9nIHRoZQotCQkJLy8gZXJyb3IgYnV0IGRvbnQKLQkJCS8vIGhhdmUgaXQgYnJlYWsgdGhlIGVkaXRvcgotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgdC5nZXRNZXNzYWdlKCksIHQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEVkaXRvciNpbml0aWFsaXplS2V5QmluZGluZ1Njb3BlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUtleUJpbmRpbmdTY29wZXMoKSB7Ci0JCXNldEtleUJpbmRpbmdTY29wZXMobmV3IFN0cmluZ1tde0VESVRPUl9LRVlCSU5ESU5HX1NDT1BFX0lEfSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGVkaXRvcidzIHNvdXJjZSB2aWV3ZXIgYW5kIG90aGVyIGl0ZW1zIHRoYXQgd2VyZSBzb3VyY2UKLQkgKiB2aWV3ZXItZGVwZW5kZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplU291cmNlVmlld2VyKCkgewotCQlJQWN0aW9uIG9wZW5IeXBlcmxpbmtBY3Rpb24gPSBnZXRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfT1BFTl9GSUxFKTsKLQkJaWYgKG9wZW5IeXBlcmxpbmtBY3Rpb24gaW5zdGFuY2VvZiBPcGVuSHlwZXJsaW5rQWN0aW9uKSB7Ci0JCQkoKE9wZW5IeXBlcmxpbmtBY3Rpb24pIG9wZW5IeXBlcmxpbmtBY3Rpb24pLnNldEh5cGVybGlua0RldGVjdG9ycyhnZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0SHlwZXJsaW5rRGV0ZWN0b3JzKGdldFNvdXJjZVZpZXdlcigpKSk7Ci0JCX0KLQotCQkvLyBkbyBub3QgZXZlbiBpbnN0YWxsIHByb2plY3Rpb24gc3VwcG9ydCB1bnRpbCBmb2xkaW5nIGlzIGFjdHVhbGx5Ci0JCS8vIGVuYWJsZWQKLQkJaWYgKGlzRm9sZGluZ0VuYWJsZWQoKSkgewotCQkJaW5zdGFsbFByb2plY3Rpb25TdXBwb3J0KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0U291cmNlVmlld2VyKFN0cnVjdHVyZWRUZXh0Vmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkvLyBlbnN1cmUgZGVjb3JhdGlvbiBzdXBwb3J0IGlzIGNvbmZpZ3VyZWQKLQkJZ2V0U291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQoc291cmNlVmlld2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsVGV4dERyYWdBbmREcm9wKElTb3VyY2VWaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RWRpdG9yI2luc3RhbGxFbmNvZGluZ1N1cHBvcnQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluc3RhbGxFbmNvZGluZ1N1cHBvcnQoKSB7Ci0JCWZFbmNvZGluZ1N1cHBvcnQgPSBuZXcgRW5jb2RpbmdTdXBwb3J0KGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKSk7Ci0JCWZFbmNvZGluZ1N1cHBvcnQuaW5pdGlhbGl6ZSh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnN0YWxsIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIGdldCBkb2N1bWVudCBmb2xkaW5nIHdvcmtpbmcgYW5kIGVuYWJsZQotCSAqIGRvY3VtZW50IGZvbGRpbmcKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFByb2plY3Rpb25TdXBwb3J0KCkgewotCQlQcm9qZWN0aW9uVmlld2VyIHByb2plY3Rpb25WaWV3ZXIgPSAoUHJvamVjdGlvblZpZXdlcikgZ2V0U291cmNlVmlld2VyKCk7Ci0KLQkJZlByb2plY3Rpb25TdXBwb3J0ID0gbmV3IFByb2plY3Rpb25TdXBwb3J0KHByb2plY3Rpb25WaWV3ZXIsIGdldEFubm90YXRpb25BY2Nlc3MoKSwgZ2V0U2hhcmVkQ29sb3JzKCkpOwotCQlmUHJvamVjdGlvblN1cHBvcnQuYWRkU3VtbWFyaXphYmxlQW5ub3RhdGlvblR5cGUoIm9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmVycm9yIik7IC8vJE5PTi1OTFMtMSQKLQkJZlByb2plY3Rpb25TdXBwb3J0LmFkZFN1bW1hcml6YWJsZUFubm90YXRpb25UeXBlKCJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci53YXJuaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJZlByb2plY3Rpb25TdXBwb3J0LnNldEhvdmVyQ29udHJvbENyZWF0b3IobmV3IElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKCkgewotCQkJcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2wgY3JlYXRlSW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudCkgewotCQkJCXJldHVybiBuZXcgRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChwYXJlbnQpOwotCQkJfQotCQl9KTsKLQkJZlByb2plY3Rpb25TdXBwb3J0Lmluc3RhbGwoKTsKLQotCQlpZiAoaXNGb2xkaW5nRW5hYmxlZCgpKQotCQkJcHJvamVjdGlvblZpZXdlci5kb09wZXJhdGlvbihQcm9qZWN0aW9uVmlld2VyLlRPR0dMRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgZG9jdW1lbnQgZm9sZGluZyBzaG91bGQgYmUgZW5hYmxlZCBhY2NvcmRpbmcgdG8gdGhlCi0JICogcHJlZmVyZW5jZSBzdG9yZSBzZXR0aW5ncy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGRvY3VtZW50IGZvbGRpbmcgc2hvdWxkIGJlIGVuYWJsZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNGb2xkaW5nRW5hYmxlZCgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkvLyBjaGVjayBib3RoIHByZWZlcmVuY2Ugc3RvcmUgYW5kIHZtIGFyZ3VtZW50Ci0JCXJldHVybiAoc3RvcmUuZ2V0Qm9vbGVhbihBYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nU3RyYXRlZ3kuRk9MRElOR19FTkFCTEVEKSk7Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZSBpZiB0aGUgdXNlciBwcmVmZXJlbmNlIGZvciBhcyB5b3UgdHlwZSB2YWxpZGF0aW9uIGlzIGVuYWJsZWQgb3Igbm90Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRhdGlvbkVuYWJsZWQoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKENvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lcy5FVkFMVUFURV9URU1QT1JBUllfUFJPQkxFTVMpOwotCX0KLQotCS8qKgotCSAqIDxwPkxvZ3MgYSB3YXJuaW5nIGFib3V0IGhvdyB0aGlzIHtAbGluayBTdHJ1Y3R1cmVkVGV4dEVkaXRvcn0ganVzdCBvcGVuZWQgYW4ge0BsaW5rIElFZGl0b3JJbnB1dH0KLQkgKiBpdCB3YXMgbm90IGRlc2lnbmVkIHRvIG9wZW4uPC9wPgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dCB0aGUge0BsaW5rIElFZGl0b3JJbnB1dH0gdGhpcyB7QGxpbmsgU3RydWN0dXJlZFRleHRFZGl0b3J9IHdhcyBub3QgZGVzaWduZWQgdG8gb3BlbgotCSAqIHRvIGxvZyB0aGUgbWVzc2FnZSBhYm91dC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9nVW5leHBlY3RlZERvY3VtZW50S2luZChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlN0cnVjdHVyZWRUZXh0RWRpdG9yIGJlaW5nIHVzZWQgd2l0aG91dCBTdHJ1Y3R1cmVkRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQluYW1lID0gaW5wdXQuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJbmFtZSA9ICJpbnB1dCB3YXMgbnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiICAgICAgICAgSW5wdXQgTmFtZTogIiArIG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBpbXBsQ2xhc3MgPSBudWxsOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoaW5wdXQpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaW1wbENsYXNzID0gZG9jdW1lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbXBsQ2xhc3MgPSAiZG9jdW1lbnQgd2FzIG51bGwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIiAgICAgICAgVW5leHBlY3RlZCBJRG9jdW1lbnRQcm92aWRlciBpbXBsZW1lbnRhdGlvbjogIiArIGdldERvY3VtZW50UHJvdmlkZXIoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIiAgICAgICAgVW5leHBlY3RlZCBJRG9jdW1lbnQgaW1wbGVtZW50YXRpb246ICIgKyBpbXBsQ2xhc3MpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI3BlcmZvcm1SZXZlcnQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1SZXZlcnQoKSB7Ci0JCVByb2plY3Rpb25WaWV3ZXIgcHJvamVjdGlvblZpZXdlciA9IChQcm9qZWN0aW9uVmlld2VyKSBnZXRTb3VyY2VWaWV3ZXIoKTsKLQkJcHJvamVjdGlvblZpZXdlci5zZXRSZWRyYXcoZmFsc2UpOwotCQl0cnkgewotCi0JCQlib29sZWFuIHByb2plY3Rpb25Nb2RlID0gcHJvamVjdGlvblZpZXdlci5pc1Byb2plY3Rpb25Nb2RlKCk7Ci0JCQlpZiAocHJvamVjdGlvbk1vZGUpIHsKLQkJCQlwcm9qZWN0aW9uVmlld2VyLmRpc2FibGVQcm9qZWN0aW9uKCk7Ci0JCQl9Ci0KLQkJCXN1cGVyLnBlcmZvcm1SZXZlcnQoKTsKLQotCQkJaWYgKHByb2plY3Rpb25Nb2RlKSB7Ci0JCQkJcHJvamVjdGlvblZpZXdlci5lbmFibGVQcm9qZWN0aW9uKCk7Ci0JCQl9Ci0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCXByb2plY3Rpb25WaWV3ZXIuc2V0UmVkcmF3KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIDxwPgotCSAqIE5vdCBBUEkuIE1heSBiZSByZWR1Y2VkIHRvIHByb3RlY3RlZCBtZXRob2QgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgcmVtZW1iZXJTZWxlY3Rpb24oKSB7Ci0JCS8qCi0JCSAqIFRoaXMgbWV0aG9kIHdhcyBtYWRlIHB1YmxpYyBmb3IgdXNlIGJ5IGVkaXRvcnMgdGhhdCB1c2UKLQkJICogU3RydWN0dXJlZFRleHRFZGl0b3IgKGxpa2Ugc29tZSBjbGllbnRzKQotCQkgKi8KLQkJc3VwZXIucmVtZW1iZXJTZWxlY3Rpb24oKTsKLQl9Ci0KLQotCS8qKgotCSAqIGJvdGggc3RhcnRzIGFuZCByZXNldHMgdGhlIGJ1c3kgc3RhdGUgdGltZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRCdXN5U3RhdGUoKSB7Ci0JCS8vIHJlc2V0IHRoZSAiYnVzeSIgdGltZW91dAotCQlpZiAoZkJ1c3lUaW1lciAhPSBudWxsKSB7Ci0JCQlmQnVzeVRpbWVyLmNhbmNlbCgpOwotCQl9Ci0JCXN0YXJ0QnVzeVRpbWVyKCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIDxwPgotCSAqIE5vdCBBUEkuIE1heSBiZSByZWR1Y2VkIHRvIHByb3RlY3RlZCBtZXRob2QgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgcmVzdG9yZVNlbGVjdGlvbigpIHsKLQkJLyoKLQkJICogVGhpcyBtZXRob2Qgd2FzIG1hZGUgcHVibGljIGZvciB1c2UgYnkgZWRpdG9ycyB0aGF0IHVzZQotCQkgKiBTdHJ1Y3R1cmVkVGV4dEVkaXRvciAobGlrZSBzb21lIGNsaWVudHMpCi0JCSAqLwotCQkvLyBjYXRjaCBvZGQgY2FzZSB3aGVyZSBzb3VyY2Ugdmlld2VyIGhhcyBubyB0ZXh0Ci0JCS8vIHdpZGdldCAoZGVmZWN0Ci0JCS8vIDIyNzY3MCkKLQkJaWYgKChnZXRTb3VyY2VWaWV3ZXIoKSAhPSBudWxsKSAmJiAoZ2V0U291cmNlVmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpICE9IG51bGwpKQotCQkJc3VwZXIucmVzdG9yZVNlbGVjdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjcnVsZXJDb250ZXh0TWVudUFib3V0VG9TaG93KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcnVsZXJDb250ZXh0TWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLnJ1bGVyQ29udGV4dE1lbnVBYm91dFRvU2hvdyhtZW51KTsKLQotCQlJTWVudU1hbmFnZXIgZm9sZGluZ01lbnUgPSBuZXcgTWVudU1hbmFnZXIoU1NFVUlNZXNzYWdlcy5Gb2xkaW5nLCAicHJvamVjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCW1lbnUuYXBwZW5kVG9Hcm91cChJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9SVUxFUlMsIGZvbGRpbmdNZW51KTsKLQotCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvbigiRm9sZGluZ1RvZ2dsZSIpOyAvLyROT04tTkxTLTEkCi0JCWZvbGRpbmdNZW51LmFkZChhY3Rpb24pOwotCQlhY3Rpb24gPSBnZXRBY3Rpb24oIkZvbGRpbmdFeHBhbmRBbGwiKTsgLy8kTk9OLU5MUy0xJAotCQlmb2xkaW5nTWVudS5hZGQoYWN0aW9uKTsKLQkJYWN0aW9uID0gZ2V0QWN0aW9uKCJGb2xkaW5nQ29sbGFwc2VBbGwiKTsgLy8kTk9OLU5MUy0xJAotCQlmb2xkaW5nTWVudS5hZGQoYWN0aW9uKTsKLQotCQlJU3RydWN0dXJlZE1vZGVsIGludGVybmFsTW9kZWwgPSBnZXRJbnRlcm5hbE1vZGVsKCk7Ci0JCWlmIChpbnRlcm5hbE1vZGVsICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gZGVidWdnaW5nQXZhaWxhYmxlID0gQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlci5nZXRJbnN0YW5jZSgpLmlzQXZhaWxhYmxlKGludGVybmFsTW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCksIEJyZWFrcG9pbnRSdWxlckFjdGlvbi5nZXRGaWxlRXh0ZW5zaW9uKGdldEVkaXRvcklucHV0KCkpKTsKLQkJCWlmIChkZWJ1Z2dpbmdBdmFpbGFibGUpIHsKLQkJCQkvLyBhcHBlbmQgYWN0aW9ucyB0byAiZGVidWciIGdyb3VwIChjcmVhdGVkIGluCi0JCQkJLy8gQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yLnJ1bGVyQ29udGV4dE1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIpCi0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKCJkZWJ1ZyIsIGdldEFjdGlvbihBY3Rpb25EZWZpbml0aW9uSWRzLlRPR0dMRV9CUkVBS1BPSU5UUykpOyAvLyROT04tTkxTLTEkCi0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKCJkZWJ1ZyIsIGdldEFjdGlvbihBY3Rpb25EZWZpbml0aW9uSWRzLk1BTkFHRV9CUkVBS1BPSU5UUykpOyAvLyROT04tTkxTLTEkCi0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKCJkZWJ1ZyIsIGdldEFjdGlvbihBY3Rpb25EZWZpbml0aW9uSWRzLkVESVRfQlJFQUtQT0lOVFMpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYWRkRXh0ZW5kZWRSdWxlckNvbnRleHRNZW51QWN0aW9ucyhtZW51KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiA8cD4KLQkgKiBPdmVycmlkZGVuIHRvIGV4cG9zZSBwYXJ0IGFjdGl2YXRpb24gaGFuZGxpbmcgZm9yIG11bHRpLXBhZ2UgZWRpdG9ycy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90IEFQSS4gTWF5IGJlIHJlZHVjZWQgdG8gcHJvdGVjdGVkIG1ldGhvZCBpbiB0aGUgZnV0dXJlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI3NhZmVseVNhbml0eUNoZWNrU3RhdGUob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNhZmVseVNhbml0eUNoZWNrU3RhdGUoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLnNhZmVseVNhbml0eUNoZWNrU3RhdGUoaW5wdXQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzYW5pdHlDaGVja1N0YXRlKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQl0cnkgewotCQkJKyt2YWxpZGF0ZUVkaXRDb3VudDsKLQkJCXN1cGVyLnNhbml0eUNoZWNrU3RhdGUoaW5wdXQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJLS12YWxpZGF0ZUVkaXRDb3VudDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlZE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHRoYXQgdGhlIGNvcnJlY3QgSURvY3VtZW50UHJvdmlkZXIgaXMgdXNlZC4gRm9yIGRpcmVjdCBtb2RlbHMsIGEKLQkgKiBzcGVjaWFsIHByb3ZpZGVyIGlzIHVzZWQuIEZvciBTdG9yYWdlRWRpdG9ySW5wdXRzLCB1c2UgYSBjdXN0b20KLQkgKiBwcm92aWRlciB0aGF0IGNyZWF0ZXMgYSB1c2FibGUgUmVzb3VyY2VBbm5vdGF0aW9uTW9kZWwuIEZvciBldmVyeXRoaW5nCi0JICogZWxzZSwgdXNlIHRoZSBiYXNlIHN1cHBvcnQuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvciNzZXREb2N1bWVudFByb3ZpZGVyKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudFByb3ZpZGVyKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZE1vZGVsKSB7Ci0JCQkvLyBsYXJnZWx5IHVudGVzdGVkCi0JCQlzZXREb2N1bWVudFByb3ZpZGVyKFN0cnVjdHVyZWRNb2RlbERvY3VtZW50UHJvdmlkZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0ICYmICEoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSkgewotCQkJc2V0RG9jdW1lbnRQcm92aWRlcihTdG9yYWdlTW9kZWxQcm92aWRlci5nZXRJbnN0YW5jZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXN1cGVyLnNldERvY3VtZW50UHJvdmlkZXIoaW5wdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IGVkaXRvciBwYXJ0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVkaXRvci4KLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdG9yUGFydAotCSAqICAgICAgICAgICAgZWRpdG9yIHBhcnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWRpdG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdG9yUGFydChJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KSB7Ci0JCWZFZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RlbCBmaWVsZCB3aXRoaW4gdGhpcyBlZGl0b3IuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSBjYW4gZXZlbnR1YWxseSBiZSBlbGltaW5hdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChnZXREb2N1bWVudFByb3ZpZGVyKCksICJkb2N1bWVudCBwcm92aWRlciBjYW4gbm90IGJlIG51bGwgd2hlbiBzZXR0aW5nIG1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZTdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJZlN0cnVjdHVyZWRNb2RlbC5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoZ2V0SW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKSk7Ci0JCX0KLQkJZlN0cnVjdHVyZWRNb2RlbCA9IG5ld01vZGVsOwotCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlmU3RydWN0dXJlZE1vZGVsLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcihnZXRJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpKTsKLQkJfQotCQkvLyB1cGRhdGUoKSBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBtb2RlbCBpcwotCQkvLyBzZXQgb3IgY2hhbmdlZAotCQl1cGRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlZGl0b3IncyBzb3VyY2Ugdmlld2VyIGNvbmZpZ3VyYXRpb24gd2hpY2ggaXQgdXNlcyB0bwotCSAqIGNvbmZpZ3VyZSBpdCdzIGludGVybmFsIHNvdXJjZSB2aWV3ZXIuIFRoaXMgbWV0aG9kIHdhcyBvdmVyd3JpdHRlbiBzbwotCSAqIHRoYXQgdmlld2VyIGNvbmZpZ3VyYXRpb24gY291bGQgYmUgc2V0IGFmdGVyIGVkaXRvciBwYXJ0IHdhcyBjcmVhdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBvbGRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gZ2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpOwotCQlzdXBlci5zZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCVN0cnVjdHVyZWRUZXh0Vmlld2VyIHN0diA9IGdldFRleHRWaWV3ZXIoKTsKLQkJaWYgKHN0diAhPSBudWxsKSB7Ci0JCQkvKgotCQkJICogVGhlcmUgc2hvdWxkIGJlIG5vIG5lZWQgdG8gdW5jb25maWd1cmUgYmVmb3JlIGNvbmZpZ3VyZSBiZWNhdXNlCi0JCQkgKiBjb25maWd1cmUgd2lsbCBhbHNvIHVuY29uZmlndXJlIGJlZm9yZSBjb25maWd1cmluZwotCQkJICovCi0JCQlyZW1vdmVSZWNvbmNpbGluZ0xpc3RlbmVycyhvbGRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uLCBzdHYpOwotCQkJc3R2LnVuY29uZmlndXJlKCk7Ci0JCQlzZXRTdGF0dXNMaW5lTWVzc2FnZShudWxsKTsKLQkJCXN0di5jb25maWd1cmUoY29uZmlnKTsKLQkJCWFkZFJlY29uY2lsaW5nTGlzdGVuZXJzKGNvbmZpZywgc3R2KTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlUmVjb25jaWxpbmdMaXN0ZW5lcnMoU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cnVjdHVyZWRUZXh0Vmlld2VyIHN0dikgewotCQlJUmVjb25jaWxlciByZWNvbmNpbGVyID0gY29uZmlnLmdldFJlY29uY2lsZXIoc3R2KTsKLQkJaWYgKHJlY29uY2lsZXIgaW5zdGFuY2VvZiBEb2N1bWVudFJlZ2lvblByb2Nlc3NvcikgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmUmVjb25jaWxpbmdMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkoKERvY3VtZW50UmVnaW9uUHJvY2Vzc29yKSByZWNvbmNpbGVyKS5yZW1vdmVSZWNvbmNpbGluZ0xpc3RlbmVyKGZSZWNvbmNpbGluZ0xpc3RlbmVyc1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUmVjb25jaWxpbmdMaXN0ZW5lcnMoU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cnVjdHVyZWRUZXh0Vmlld2VyIHN0dikgewotCQl0cnkgewotCQkJTGlzdCByZWNvbmNpbGluZ0xpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoZlJlY29uY2lsaW5nTGlzdGVuZXJzLmxlbmd0aCk7Ci0JCQlTdHJpbmdbXSBpZHMgPSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJCXJlY29uY2lsaW5nTGlzdGVuZXJzLmFkZEFsbChFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbnMoInNvdXJjZVJlY29uY2lsaW5nTGlzdGVuZXIiLCBpZHNbaV0pKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZlJlY29uY2lsaW5nTGlzdGVuZXJzID0gKElTb3VyY2VSZWNvbmNpbGluZ0xpc3RlbmVyW10pIHJlY29uY2lsaW5nTGlzdGVuZXJzLnRvQXJyYXkobmV3IElTb3VyY2VSZWNvbmNpbGluZ0xpc3RlbmVyW3JlY29uY2lsaW5nTGlzdGVuZXJzLnNpemUoKV0pOwotCQl9Ci0JCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJDb25maWd1cmF0aW9uIGhhcyBhIHJlY29uY2lsaW5nIGxpc3RlbmVyIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IElTb3VyY2VSZWNvbmNpbGluZ0xpc3RlbmVyLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJUmVjb25jaWxlciByZWNvbmNpbGVyID0gY29uZmlnLmdldFJlY29uY2lsZXIoc3R2KTsKLQkJaWYgKHJlY29uY2lsZXIgaW5zdGFuY2VvZiBEb2N1bWVudFJlZ2lvblByb2Nlc3NvcikgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmUmVjb25jaWxpbmdMaXN0ZW5lcnMubGVuZ3RoOyBpKyspCi0JCQkJKChEb2N1bWVudFJlZ2lvblByb2Nlc3NvcikgcmVjb25jaWxlcikuYWRkUmVjb25jaWxpbmdMaXN0ZW5lcihmUmVjb25jaWxpbmdMaXN0ZW5lcnNbaV0pOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjc2hvd0J1c3koYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93QnVzeShib29sZWFuIGJ1c3kpIHsKLQkJaWYgKGJ1c3kpIHsKLQkJCWZSZW1lbWJlclRpdGxlID0gZ2V0UGFydE5hbWUoKTsKLQkJCS8vIHVwZGF0ZSB0aXRsZSBhbmQvb3IgZm9udHMgYW5kL29yIGJhY2tncm91bmQKLQkJCS8vCi0JCQkvLyB0ZW1wIHNvbHV0aW9uLCBmb3IgdGVzdGluZywgdXNlcyAiYnVzeSIKLQkJCXNldFBhcnROYW1lKFNTRVVJTWVzc2FnZXMuYnVzeSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCS8vIHJlc2V0IHRvIHdoYXQgaXQgd2FzCi0JCQlzZXRQYXJ0TmFtZShmUmVtZW1iZXJUaXRsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRCdXN5VGltZXIoKSB7Ci0JCS8vIFRPRE86IHdlIG5lZWQgYSByZXNldHRhYmxlIHRpbWVyLCBzbyBub3Qgc28KLQkJLy8gbWFueSBhcmUgY3JlYXRlZAotCQlmQnVzeVRpbWVyID0gbmV3IFRpbWVyKHRydWUpOwotCQlmQnVzeVRpbWVyLnNjaGVkdWxlKG5ldyBUaW1lT3V0RXhwaXJlZCgpLCBCVVNZX1NUQVRFX0RFTEFZKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1bmluc3RhbGxUZXh0RHJhZ0FuZERyb3AoSVNvdXJjZVZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBtb2RlbCBpcyBzZXQgb3IgY2hhbmdlZCAoYXMgaW4KLQkgKiBzd2FwcGVkKQotCSAqIDxwPgotCSAqIE5vdCBBUEkuIE1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJaWYgKGZPdXRsaW5lUGFnZSAhPSBudWxsICYmIGZPdXRsaW5lUGFnZSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSkgewotCQkJQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGNmZyA9IGNyZWF0ZUNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbigpOwotCQkJKChDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UpIGZPdXRsaW5lUGFnZSkuc2V0Q29uZmlndXJhdGlvbihjZmcpOwotCQkJSVN0cnVjdHVyZWRNb2RlbCBpbnRlcm5hbE1vZGVsID0gZ2V0SW50ZXJuYWxNb2RlbCgpOwotCQkJKChDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UpIGZPdXRsaW5lUGFnZSkuc2V0SW5wdXRDb250ZW50VHlwZUlkZW50aWZpZXIoaW50ZXJuYWxNb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSk7Ci0JCQkoKENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSkgZk91dGxpbmVQYWdlKS5zZXRJbnB1dChpbnRlcm5hbE1vZGVsKTsKLQkJfQotCQlpZiAoZlByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwgJiYgZlByb3BlcnR5U2hlZXRQYWdlIGluc3RhbmNlb2YgQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2UpIHsKLQkJCVByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIGNmZyA9IGNyZWF0ZVByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uKCk7Ci0JCQkoKENvbmZpZ3VyYWJsZVByb3BlcnR5U2hlZXRQYWdlKSBmUHJvcGVydHlTaGVldFBhZ2UpLnNldENvbmZpZ3VyYXRpb24oY2ZnKTsKLQkJfQotCQlkaXNwb3NlTW9kZWxEZXBlbmRlbnRGaWVsZHMoKTsKLQotCQlmU2hvd0luVGFyZ2V0SWRzID0gY3JlYXRlU2hvd0luVGFyZ2V0SWRzKCk7Ci0KLQkJaWYgKGdldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKSBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiAmJiBmU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCi0JCVN0cmluZyBjb25maWd1cmF0aW9uSWQgPSBmVmlld2VyQ29uZmlndXJhdGlvblRhcmdldElkOwotCQl1cGRhdGVTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCk7Ci0KLQkJLyogT25seSByZWluc3RhbGwgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaWQgaGFzIGNoYW5nZWQgKi8KLQkJaWYgKGNvbmZpZ3VyYXRpb25JZCAhPSBudWxsICYmICFjb25maWd1cmF0aW9uSWQuZXF1YWxzKGZWaWV3ZXJDb25maWd1cmF0aW9uVGFyZ2V0SWQpKSB7Ci0JCQl1bmluc3RhbGxTZW1hbnRpY0hpZ2hsaWdodGluZygpOwotCQkJaW5zdGFsbFNlbWFudGljSGlnaGxpZ2h0aW5nKCk7Ci0JCX0KLQotCQlpZiAoZ2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKSB7Ci0JCQlmU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIgPSAoKFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbikgZ2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpKS5nZXRTdGF0dXNMaW5lTGFiZWxQcm92aWRlcihnZXRTb3VyY2VWaWV3ZXIoKSk7Ci0JCQl1cGRhdGVTdGF0dXNMaW5lKG51bGwpOwotCQl9Ci0KLQkJaWYgKGZFbmNvZGluZ1N1cHBvcnQgIT0gbnVsbCAmJiBmRW5jb2RpbmdTdXBwb3J0IGluc3RhbmNlb2YgRW5jb2RpbmdTdXBwb3J0KSB7Ci0JCQkoKEVuY29kaW5nU3VwcG9ydCkgZkVuY29kaW5nU3VwcG9ydCkucmVpbml0aWFsaXplKGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKSk7Ci0JCX0KLQotCQljcmVhdGVNb2RlbERlcGVuZGVudEZpZWxkcygpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgYWxsIGNvbnRlbnQgZGVwZW5kZW50IGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udGVudERlcGVuZGVudEFjdGlvbnMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRlbnREZXBlbmRlbnRBY3Rpb25zKCk7Ci0JCS8vIHN1cGVyLnVwZGF0ZUNvbnRlbnREZXBlbmRlbnRBY3Rpb25zIG9ubHkgdXBkYXRlcwotCQkvLyB0aGUgZW5hYmxlL2Rpc2FibGUKLQkJLy8gc3RhdGUgb2YgYWxsCi0JCS8vIHRoZSBjb250ZW50IGRlcGVuZGVudCBhY3Rpb25zLgotCQkvLyBTdHJ1Y3R1cmVkVGV4dEVkaXRvcidzIHVuZG8gYW5kIHJlZG8gYWN0aW9ucwotCQkvLyBoYXZlIGEgZGV0YWlsIGxhYmVsIGFuZAotCQkvLyBkZXNjcmlwdGlvbi4KLQkJLy8gVGhleSBuZWVkZWQgdG8gYmUgdXBkYXRlZC4KLQkJaWYgKCFmRWRpdG9yRGlzcG9zZWQpCi0JCQl1cGRhdGVNZW51VGV4dCgpOwotCX0KLQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZWRpdG9yIGNvbnRleHQgbWVudSBieSBjcmVhdGluZyBhIG5ldyBjb250ZXh0IG1lbnUgd2l0aCB0aGUKLQkgKiBnaXZlbiBtZW51IGlkCi0JICogCi0JICogQHBhcmFtIGNvbnRleHRNZW51SWQKLQkgKiAgICAgICAgICAgIENhbm5vdCBiZSBudWxsCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUVkaXRvckNvbnRleHRNZW51SWQoU3RyaW5nIGNvbnRleHRNZW51SWQpIHsKLQkJLy8gdXBkYXRlIGVkaXRvciBjb250ZXh0IG1lbnUgaWQgaWYgdXBkYXRpbmcgdG8gYSBuZXcgaWQgb3IgaWYgY29udGV4dAotCQkvLyBtZW51IGlzIG5vdCBhbHJlYWR5IHNldCB1cAotCQlpZiAoIWNvbnRleHRNZW51SWQuZXF1YWxzKGdldEVkaXRvckNvbnRleHRNZW51SWQoKSkgfHwgKGZUZXh0Q29udGV4dE1lbnUgPT0gbnVsbCkpIHsKLQkJCXNldEVkaXRvckNvbnRleHRNZW51SWQoY29udGV4dE1lbnVJZCk7Ci0KLQkJCWlmIChnZXRTb3VyY2VWaWV3ZXIoKSAhPSBudWxsKSB7Ci0JCQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gZ2V0U291cmNlVmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpOwotCQkJCWlmIChzdHlsZWRUZXh0ICE9IG51bGwpIHsKLQkJCQkJLy8gZGlzcG9zZSBvZiBwcmV2aW91cyBjb250ZXh0IG1lbnUKLQkJCQkJaWYgKGZUZXh0Q29udGV4dE1lbnUgIT0gbnVsbCkgewotCQkJCQkJZlRleHRDb250ZXh0TWVudS5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJCWZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZU1lbnVMaXN0ZW5lcihnZXRDb250ZXh0TWVudUxpc3RlbmVyKCkpOwotCQkJCQkJZlRleHRDb250ZXh0TWVudU1hbmFnZXIucmVtb3ZlQWxsKCk7Ci0JCQkJCQlmVGV4dENvbnRleHRNZW51TWFuYWdlci5kaXNwb3NlKCk7Ci0JCQkJCX0KLQotCQkJCQlmVGV4dENvbnRleHRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihnZXRFZGl0b3JDb250ZXh0TWVudUlkKCksIGdldEVkaXRvckNvbnRleHRNZW51SWQoKSk7Ci0JCQkJCWZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJCQkJZlRleHRDb250ZXh0TWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKGdldENvbnRleHRNZW51TGlzdGVuZXIoKSk7Ci0KLQkJCQkJZlRleHRDb250ZXh0TWVudSA9IGZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KHN0eWxlZFRleHQpOwotCQkJCQlzdHlsZWRUZXh0LnNldE1lbnUoZlRleHRDb250ZXh0TWVudSk7Ci0KLQkJCQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoZ2V0RWRpdG9yQ29udGV4dE1lbnVJZCgpLCBmVGV4dENvbnRleHRNZW51TWFuYWdlciwgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7Ci0KLQkJCQkJLy8gYWxzbyByZWdpc3RlciB0aGlzIG1lbnUgZm9yIHNvdXJjZSBwYWdlIHBhcnQgYW5kCi0JCQkJCS8vIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaWRzCi0JCQkJCVN0cmluZyBwYXJ0SWQgPSBnZXRTaXRlKCkuZ2V0SWQoKTsKLQkJCQkJaWYgKHBhcnRJZCAhPSBudWxsKSB7Ci0JCQkJCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShwYXJ0SWQgKyBFRElUT1JfQ09OVEVYVF9NRU5VX1NVRkZJWCwgZlRleHRDb250ZXh0TWVudU1hbmFnZXIsIGdldFNlbGVjdGlvblByb3ZpZGVyKCkpOwotCQkJCQl9Ci0JCQkJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KEVESVRPUl9DT05URVhUX01FTlVfSUQsIGZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyLCBnZXRTZWxlY3Rpb25Qcm92aWRlcigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIGVkaXRvciBjb250ZXh0IG1lbnUsIHZlcnRpY2FsIHJ1bGVyIG1lbnUsIGhlbHAgY29udGV4dCBpZCBmb3IKLQkgKiBuZXcgY29udGVudCB0eXBlCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUVkaXRvckNvbnRyb2xzRm9yQ29udGVudFR5cGUoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQl1cGRhdGVFZGl0b3JDb250ZXh0TWVudUlkKEVESVRPUl9DT05URVhUX01FTlVfSUQpOwotCQkJdXBkYXRlUnVsZXJDb250ZXh0TWVudUlkKFJVTEVSX0NPTlRFWFRfTUVOVV9JRCk7Ci0JCQl1cGRhdGVIZWxwQ29udGV4dElkKElUZXh0RWRpdG9ySGVscENvbnRleHRJZHMuVEVYVF9FRElUT1IpOwotCQl9Ci0JCWVsc2UgewotCQkJdXBkYXRlRWRpdG9yQ29udGV4dE1lbnVJZChjb250ZW50VHlwZSArIEVESVRPUl9DT05URVhUX01FTlVfU1VGRklYKTsKLQkJCXVwZGF0ZVJ1bGVyQ29udGV4dE1lbnVJZChjb250ZW50VHlwZSArIFJVTEVSX0NPTlRFWFRfTUVOVV9TVUZGSVgpOwotCQkJdXBkYXRlSGVscENvbnRleHRJZChjb250ZW50VHlwZSArICJfc291cmNlX0hlbHBJZCIpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCS8qIEFjdGl2YXRlIHRoZSBjb250ZXh0cyBkZWZpbmVkIGZvciB0aGlzIGVkaXRvciAqLwotCQkJYWN0aXZhdGVDb250ZXh0cygoSUNvbnRleHRTZXJ2aWNlKSBnZXRTaXRlKCkuZ2V0U2VydmljZShJQ29udGV4dFNlcnZpY2UuY2xhc3MpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlRW5jb2RpbmdNZW1lbnRvKCkgewotCQlib29sZWFuIGZhaWxlZCA9IGZhbHNlOwotCQlJU3RydWN0dXJlZE1vZGVsIGludGVybmFsTW9kZWwgPSBnZXRJbnRlcm5hbE1vZGVsKCk7Ci0JCWlmIChpbnRlcm5hbE1vZGVsICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gaW50ZXJuYWxNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUVuY29kaW5nTWVtZW50byBtZW1lbnRvID0gZG9jLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkJSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gaW50ZXJuYWxNb2RlbC5nZXRNb2RlbEhhbmRsZXIoKS5nZXRFbmNvZGluZ0RldGVjdG9yKCk7Ci0JCQlpZiAobWVtZW50byAhPSBudWxsICYmIGRldGVjdG9yICE9IG51bGwpIHsKLQkJCQlkZXRlY3Rvci5zZXQoZG9jKTsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgbmV3RW5jb2RpbmcgPSBkZXRlY3Rvci5nZXRFbmNvZGluZygpOwotCQkJCQlpZiAobmV3RW5jb2RpbmcgIT0gbnVsbCkgewotCQkJCQkJbWVtZW50by5zZXREZXRlY3RlZENoYXJzZXROYW1lKG5ld0VuY29kaW5nKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlmYWlsZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCS8qKgotCQkJICogQmUgc3VyZSB0byB1c2UgdGhlIG5ldyB2YWx1ZSBidXQgb25seSBpZiBubyBleGNlcHRpb24KLQkJCSAqIG9jY3VycmVkLiAod2UgbWF5IGZpbmQgY2FzZXMgd2UgbmVlZCB0byBkbyBtb3JlIGVycm9yIHJlY292ZXJ5Ci0JCQkgKiB0aGVyZSkgc2hvdWxkIGJlIG5lYXIgaW1wb3NzaWJsZSB0byBnZXQgSU9FeGNlcHRpb24gZnJvbQotCQkJICogcHJvY2Vzc2luZyB0aGUgX2RvY3VtZW50XwotCQkJICovCi0JCQlpZiAoIWZhaWxlZCkgewotCQkJCWRvYy5zZXRFbmNvZGluZ01lbWVudG8obWVtZW50byk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBoZWxwIGNvbnRleHQgb2YgdGhlIGVkaXRvciB3aXRoIHRoZSBnaXZlbiBoZWxwIGNvbnRleHQgaWQKLQkgKiAKLQkgKiBAcGFyYW0gaGVscENvbnRleHRJZAotCSAqICAgICAgICAgICAgQ2Fubm90IGJlIG51bGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlSGVscENvbnRleHRJZChTdHJpbmcgaGVscENvbnRleHRJZCkgewotCQlpZiAoIWhlbHBDb250ZXh0SWQuZXF1YWxzKGdldEhlbHBDb250ZXh0SWQoKSkpIHsKLQkJCXNldEhlbHBDb250ZXh0SWQoaGVscENvbnRleHRJZCk7Ci0KLQkJCWlmIChnZXRTb3VyY2VWaWV3ZXIoKSAhPSBudWxsKSB7Ci0JCQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gZ2V0U291cmNlVmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpOwotCQkJCWlmIChzdHlsZWRUZXh0ICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQkJCQloZWxwU3lzdGVtLnNldEhlbHAoc3R5bGVkVGV4dCwgZ2V0SGVscENvbnRleHRJZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFVwZGF0ZSB0aGUgaG92ZXJpbmcgYmVoYXZpb3IgZGVwZW5kaW5nIG9uIHRoZSBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlSG92ZXJCZWhhdmlvcigpIHsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gZ2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpOwotCQlTdHJpbmdbXSB0eXBlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhnZXRTb3VyY2VWaWV3ZXIoKSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCi0JCQlTdHJpbmcgdCA9IHR5cGVzW2ldOwotCi0JCQlJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciA9IGdldFNvdXJjZVZpZXdlcigpOwotCQkJaWYgKHNvdXJjZVZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uMikgewotCQkJCS8vIFJlbW92ZSBleGlzdGluZyBob3ZlcnMKLQkJCQkoKElUZXh0Vmlld2VyRXh0ZW5zaW9uMikgc291cmNlVmlld2VyKS5yZW1vdmVUZXh0SG92ZXJzKHQpOwotCi0JCQkJaW50W10gc3RhdGVNYXNrcyA9IGNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZFRleHRIb3ZlclN0YXRlTWFza3MoZ2V0U291cmNlVmlld2VyKCksIHQpOwotCi0JCQkJaWYgKHN0YXRlTWFza3MgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHN0YXRlTWFza3MubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWludCBzdGF0ZU1hc2sgPSBzdGF0ZU1hc2tzW2pdOwotCQkJCQkJSVRleHRIb3ZlciB0ZXh0SG92ZXIgPSBjb25maWd1cmF0aW9uLmdldFRleHRIb3Zlcihzb3VyY2VWaWV3ZXIsIHQsIHN0YXRlTWFzayk7Ci0JCQkJCQkoKElUZXh0Vmlld2VyRXh0ZW5zaW9uMikgc291cmNlVmlld2VyKS5zZXRUZXh0SG92ZXIodGV4dEhvdmVyLCB0LCBzdGF0ZU1hc2spOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJVGV4dEhvdmVyIHRleHRIb3ZlciA9IGNvbmZpZ3VyYXRpb24uZ2V0VGV4dEhvdmVyKHNvdXJjZVZpZXdlciwgdCk7Ci0JCQkJCSgoSVRleHRWaWV3ZXJFeHRlbnNpb24yKSBzb3VyY2VWaWV3ZXIpLnNldFRleHRIb3Zlcih0ZXh0SG92ZXIsIHQsIElUZXh0Vmlld2VyRXh0ZW5zaW9uMi5ERUZBVUxUX0hPVkVSX1NUQVRFX01BU0spOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCQlzb3VyY2VWaWV3ZXIuc2V0VGV4dEhvdmVyKGNvbmZpZ3VyYXRpb24uZ2V0VGV4dEhvdmVyKHNvdXJjZVZpZXdlciwgdCksIHQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZU1lbnVUZXh0KCkgewotCQlJVGV4dFZpZXdlciB2aWV3ZXIgPSBnZXRUZXh0Vmlld2VyKCk7Ci0JCVN0eWxlZFRleHQgd2lkZ2V0ID0gbnVsbDsKLQkJaWYgKHZpZXdlciAhPSBudWxsKQotCQkJd2lkZ2V0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQotCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCAhPSBudWxsICYmICFmU3RydWN0dXJlZE1vZGVsLmlzTW9kZWxTdGF0ZUNoYW5naW5nKCkgJiYgdmlld2VyICE9IG51bGwgJiYgd2lkZ2V0ICE9IG51bGwgJiYgIXdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCS8vIHBlcmZvcm1hbmNlOiBkb24ndCBmb3JjZSBhbiB1cGRhdGUgb2YgdGhlIGFjdGlvbiBiYXJzIHVubGVzcwotCQkJLy8gcmVxdWlyZWQgYXMgaXQgaXMgZXhwZW5zaXZlCi0JCQlTdHJpbmcgcHJldmlvdXNVbmRvVGV4dCA9IG51bGw7Ci0JCQlTdHJpbmcgcHJldmlvdXNVbmRvRGVzYyA9IG51bGw7Ci0JCQlTdHJpbmcgcHJldmlvdXNSZWRvVGV4dCA9IG51bGw7Ci0JCQlTdHJpbmcgcHJldmlvdXNSZWRvRGVzYyA9IG51bGw7Ci0JCQlib29sZWFuIHVwZGF0ZUFjdGlvbnMgPSBmYWxzZTsKLQkJCUlBY3Rpb24gdW5kb0FjdGlvbiA9IGdldEFjdGlvbihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRPKTsKLQkJCUlBY3Rpb24gcmVkb0FjdGlvbiA9IGdldEFjdGlvbihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5SRURPKTsKLQkJCWlmICh1bmRvQWN0aW9uICE9IG51bGwpIHsKLQkJCQlwcmV2aW91c1VuZG9UZXh0ID0gdW5kb0FjdGlvbi5nZXRUZXh0KCk7Ci0JCQkJcHJldmlvdXNVbmRvRGVzYyA9IHVuZG9BY3Rpb24uZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQl1cGRhdGVBY3Rpb25zID0gdXBkYXRlQWN0aW9ucyB8fCBwcmV2aW91c1VuZG9UZXh0ID09IG51bGwgfHwgcHJldmlvdXNVbmRvRGVzYyA9PSBudWxsOwotCQkJCXVuZG9BY3Rpb24uc2V0VGV4dChVTkRPX0FDVElPTl9URVhUX0RFRkFVTFQpOwotCQkJCXVuZG9BY3Rpb24uc2V0RGVzY3JpcHRpb24oVU5ET19BQ1RJT05fREVTQ19ERUZBVUxUKTsKLQkJCX0KLQkJCWlmIChyZWRvQWN0aW9uICE9IG51bGwpIHsKLQkJCQlwcmV2aW91c1JlZG9UZXh0ID0gcmVkb0FjdGlvbi5nZXRUZXh0KCk7Ci0JCQkJcHJldmlvdXNSZWRvRGVzYyA9IHJlZG9BY3Rpb24uZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQl1cGRhdGVBY3Rpb25zID0gdXBkYXRlQWN0aW9ucyB8fCBwcmV2aW91c1JlZG9UZXh0ID09IG51bGwgfHwgcHJldmlvdXNSZWRvRGVzYyA9PSBudWxsOwotCQkJCXJlZG9BY3Rpb24uc2V0VGV4dChSRURPX0FDVElPTl9URVhUX0RFRkFVTFQpOwotCQkJCXJlZG9BY3Rpb24uc2V0RGVzY3JpcHRpb24oUkVET19BQ1RJT05fREVTQ19ERUZBVUxUKTsKLQkJCX0KLQkJCWlmIChmU3RydWN0dXJlZE1vZGVsLmdldFVuZG9NYW5hZ2VyKCkgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVuZG9NYW5hZ2VyID0gZlN0cnVjdHVyZWRNb2RlbC5nZXRVbmRvTWFuYWdlcigpOwotCQkJCS8vIGdldCB1bmRvIGNvbW1hbmQKLQkJCQlDb21tYW5kIHVuZG9Db21tYW5kID0gdW5kb01hbmFnZXIuZ2V0VW5kb0NvbW1hbmQoKTsKLQkJCQkvLyBzZXQgdW5kbyBsYWJlbCBhbmQgZGVzY3JpcHRpb24KLQkJCQlpZiAodW5kb0FjdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXVuZG9BY3Rpb24uc2V0RW5hYmxlZCh1bmRvTWFuYWdlci51bmRvYWJsZSgpKTsKLQkJCQkJaWYgKHVuZG9Db21tYW5kICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBsYWJlbCA9IHVuZG9Db21tYW5kLmdldExhYmVsKCk7Ci0JCQkJCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJCQkJCVN0cmluZyBjdXN0b21UZXh0ID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoVU5ET19BQ1RJT05fVEVYVCwgbmV3IFN0cmluZ1tde2xhYmVsfSk7Ci0JCQkJCQkJdXBkYXRlQWN0aW9ucyA9IHVwZGF0ZUFjdGlvbnMgfHwgY3VzdG9tVGV4dCA9PSBudWxsIHx8IHByZXZpb3VzVW5kb1RleHQgPT0gbnVsbCB8fCAhY3VzdG9tVGV4dC5lcXVhbHMocHJldmlvdXNVbmRvVGV4dCk7Ci0JCQkJCQkJdW5kb0FjdGlvbi5zZXRUZXh0KGN1c3RvbVRleHQpOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIGRlc2MgPSB1bmRvQ29tbWFuZC5nZXREZXNjcmlwdGlvbigpOwotCQkJCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJCVN0cmluZyBjdXN0b21EZXNjID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoVU5ET19BQ1RJT05fREVTQywgbmV3IFN0cmluZ1tde2Rlc2N9KTsKLQkJCQkJCQl1cGRhdGVBY3Rpb25zID0gdXBkYXRlQWN0aW9ucyB8fCBjdXN0b21EZXNjID09IG51bGwgfHwgcHJldmlvdXNSZWRvRGVzYyA9PSBudWxsIHx8ICFjdXN0b21EZXNjLmVxdWFscyhwcmV2aW91c1VuZG9EZXNjKTsKLQkJCQkJCQl1bmRvQWN0aW9uLnNldERlc2NyaXB0aW9uKGN1c3RvbURlc2MpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIGdldCByZWRvIGNvbW1hbmQKLQkJCQlDb21tYW5kIHJlZG9Db21tYW5kID0gdW5kb01hbmFnZXIuZ2V0UmVkb0NvbW1hbmQoKTsKLQkJCQkvLyBzZXQgcmVkbyBsYWJlbCBhbmQgZGVzY3JpcHRpb24KLQkJCQlpZiAocmVkb0FjdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXJlZG9BY3Rpb24uc2V0RW5hYmxlZCh1bmRvTWFuYWdlci5yZWRvYWJsZSgpKTsKLQkJCQkJaWYgKHJlZG9Db21tYW5kICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBsYWJlbCA9IHJlZG9Db21tYW5kLmdldExhYmVsKCk7Ci0JCQkJCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJCQkJCVN0cmluZyBjdXN0b21UZXh0ID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUkVET19BQ1RJT05fVEVYVCwgbmV3IFN0cmluZ1tde2xhYmVsfSk7Ci0JCQkJCQkJdXBkYXRlQWN0aW9ucyA9IHVwZGF0ZUFjdGlvbnMgfHwgY3VzdG9tVGV4dCA9PSBudWxsIHx8IHByZXZpb3VzUmVkb1RleHQgPT0gbnVsbCB8fCAhY3VzdG9tVGV4dC5lcXVhbHMocHJldmlvdXNSZWRvVGV4dCk7Ci0JCQkJCQkJcmVkb0FjdGlvbi5zZXRUZXh0KGN1c3RvbVRleHQpOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIGRlc2MgPSByZWRvQ29tbWFuZC5nZXREZXNjcmlwdGlvbigpOwotCQkJCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJCVN0cmluZyBjdXN0b21EZXNjID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUkVET19BQ1RJT05fREVTQywgbmV3IFN0cmluZ1tde2Rlc2N9KTsKLQkJCQkJCQl1cGRhdGVBY3Rpb25zID0gdXBkYXRlQWN0aW9ucyB8fCBjdXN0b21EZXNjID09IG51bGwgfHwgcHJldmlvdXNSZWRvRGVzYyA9PSBudWxsIHx8ICFjdXN0b21EZXNjLmVxdWFscyhwcmV2aW91c1JlZG9EZXNjKTsKLQkJCQkJCQlyZWRvQWN0aW9uLnNldERlc2NyaXB0aW9uKGN1c3RvbURlc2MpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gdGVsbCB0aGUgYWN0aW9uIGJhcnMgdG8gdXBkYXRlCi0JCQlpZiAodXBkYXRlQWN0aW9ucykgewotCQkJCWlmIChnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpICE9IG51bGwpIHsKLQkJCQkJZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGdldEVkaXRvclBhcnQoKSAhPSBudWxsICYmIGdldEVkaXRvclBhcnQoKS5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpICE9IG51bGwpIHsKLQkJCQkJZ2V0RWRpdG9yUGFydCgpLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkudXBkYXRlQWN0aW9uQmFycygpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgdXBkYXRlUmFuZ2VJbmRpY2F0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gcmFuZ2VVcGRhdGVkID0gZmFsc2U7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiAhKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIG9iamVjdHMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKTsKLQkJCWlmIChvYmplY3RzLmxlbmd0aCA+IDAgJiYgb2JqZWN0c1swXSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG9iamVjdHNbMF0pLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgb2JqZWN0c1swXSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJaWYgKG9iamVjdHMubGVuZ3RoID4gMSkgewotCQkJCQlmb3IgKGludCBpID0gMTsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCXN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsICgoSW5kZXhlZFJlZ2lvbikgb2JqZWN0c1tpXSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCQllbmQgPSBNYXRoLm1heChlbmQsICgoSW5kZXhlZFJlZ2lvbikgb2JqZWN0c1tpXSkuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWdldFNvdXJjZVZpZXdlcigpLnNldFJhbmdlSW5kaWNhdGlvbihzdGFydCwgZW5kIC0gc3RhcnQsIGZhbHNlKTsKLQkJCQlyYW5nZVVwZGF0ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmICghcmFuZ2VVcGRhdGVkICYmIGdldFNvdXJjZVZpZXdlcigpICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCWdldFNvdXJjZVZpZXdlcigpLnNldFJhbmdlSW5kaWNhdGlvbigoKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldE9mZnNldCgpLCAoKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldExlbmd0aCgpLCBmYWxzZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlnZXRTb3VyY2VWaWV3ZXIoKS5yZW1vdmVSYW5nZUluZGljYXRpb24oKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZWRpdG9yIHZlcnRpY2FsIHJ1bGVyIG1lbnUgYnkgY3JlYXRpbmcgYSBuZXcgdmVydGljYWwgcnVsZXIKLQkgKiBjb250ZXh0IG1lbnUgd2l0aCB0aGUgZ2l2ZW4gbWVudSBpZAotCSAqIAotCSAqIEBwYXJhbSBydWxlck1lbnVJZAotCSAqICAgICAgICAgICAgQ2Fubm90IGJlIG51bGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlUnVsZXJDb250ZXh0TWVudUlkKFN0cmluZyBydWxlck1lbnVJZCkgewotCQkvLyB1cGRhdGUgcnVsZXIgY29udGV4dCBtZW51IGlkIGlmIHVwZGF0aW5nIHRvIGEgbmV3IGlkIG9yIGlmIGNvbnRleHQKLQkJLy8gbWVudSBpcyBub3QgYWxyZWFkeSBzZXQgdXAKLQkJaWYgKCFydWxlck1lbnVJZC5lcXVhbHMoZ2V0UnVsZXJDb250ZXh0TWVudUlkKCkpIHx8IChmUnVsZXJDb250ZXh0TWVudSA9PSBudWxsKSkgewotCQkJc2V0UnVsZXJDb250ZXh0TWVudUlkKHJ1bGVyTWVudUlkKTsKLQotCQkJaWYgKGdldFZlcnRpY2FsUnVsZXIoKSAhPSBudWxsKSB7Ci0JCQkJLy8gZGlzcG9zZSBvZiBwcmV2aW91cyBydWxlciBjb250ZXh0IG1lbnUKLQkJCQlpZiAoZlJ1bGVyQ29udGV4dE1lbnUgIT0gbnVsbCkgewotCQkJCQlmUnVsZXJDb250ZXh0TWVudS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCWlmIChmUnVsZXJDb250ZXh0TWVudU1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQlmUnVsZXJDb250ZXh0TWVudU1hbmFnZXIucmVtb3ZlTWVudUxpc3RlbmVyKGdldENvbnRleHRNZW51TGlzdGVuZXIoKSk7Ci0JCQkJCWZSdWxlckNvbnRleHRNZW51TWFuYWdlci5yZW1vdmVBbGwoKTsKLQkJCQkJZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0KLQkJCQlmUnVsZXJDb250ZXh0TWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoZ2V0UnVsZXJDb250ZXh0TWVudUlkKCksIGdldFJ1bGVyQ29udGV4dE1lbnVJZCgpKTsKLQkJCQlmUnVsZXJDb250ZXh0TWVudU1hbmFnZXIuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCQkJCWZSdWxlckNvbnRleHRNZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIoZ2V0Q29udGV4dE1lbnVMaXN0ZW5lcigpKTsKLQotCQkJCUNvbnRyb2wgcnVsZXJDb250cm9sID0gZ2V0VmVydGljYWxSdWxlcigpLmdldENvbnRyb2woKTsKLQkJCQlmUnVsZXJDb250ZXh0TWVudSA9IGZSdWxlckNvbnRleHRNZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShydWxlckNvbnRyb2wpOwotCQkJCXJ1bGVyQ29udHJvbC5zZXRNZW51KGZSdWxlckNvbnRleHRNZW51KTsKLQotCQkJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KGdldFJ1bGVyQ29udGV4dE1lbnVJZCgpLCBmUnVsZXJDb250ZXh0TWVudU1hbmFnZXIsIGdldFNlbGVjdGlvblByb3ZpZGVyKCkpOwotCi0JCQkJLy8gYWxzbyByZWdpc3RlciB0aGlzIG1lbnUgZm9yIHNvdXJjZSBwYWdlIHBhcnQgYW5kIHN0cnVjdHVyZWQKLQkJCQkvLyB0ZXh0IGVkaXRvciBpZHMKLQkJCQlTdHJpbmcgcGFydElkID0gZ2V0U2l0ZSgpLmdldElkKCk7Ci0JCQkJaWYgKHBhcnRJZCAhPSBudWxsKSB7Ci0JCQkJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KHBhcnRJZCArIFJVTEVSX0NPTlRFWFRfTUVOVV9TVUZGSVgsIGZSdWxlckNvbnRleHRNZW51TWFuYWdlciwgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7Ci0JCQkJfQotCQkJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KFJVTEVSX0NPTlRFWFRfTUVOVV9JRCwgZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyLCBnZXRTZWxlY3Rpb25Qcm92aWRlcigpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBnZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCk7Ci0JCS8vIG5vIG5lZWQgdG8gdXBkYXRlIHNvdXJjZSB2aWV3ZXIgY29uZmlndXJhdGlvbiBpZiBvbmUgZG9lcyBub3QgZXhpc3QKLQkJLy8geWV0Ci0JCWlmIChjb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBkbyBub3QgY29uZmlndXJlIHNvdXJjZSB2aWV3ZXIgY29uZmlndXJhdGlvbiB0d2ljZQotCQlib29sZWFuIGNvbmZpZ3VyZWQgPSBmYWxzZTsKLQotCQkvLyBzdHJ1Y3R1cmVkdGV4dHZpZXdlciBvbmx5IHdvcmtzIHdpdGgKLQkJLy8gc3RydWN0dXJlZHRleHR2aWV3ZXJjb25maWd1cmF0aW9uCi0JCWlmICghKGNvbmZpZ3VyYXRpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24pKSB7Ci0JCQlDb25maWd1cmF0aW9uQW5kVGFyZ2V0IGNhdCA9IGNyZWF0ZVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKTsKLQkJCWZWaWV3ZXJDb25maWd1cmF0aW9uVGFyZ2V0SWQgPSBjYXQuZ2V0VGFyZ2V0SWQoKTsKLQkJCWNvbmZpZ3VyYXRpb24gPSBjYXQuZ2V0Q29uZmlndXJhdGlvbigpOwotCQkJc2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsKLQkJCWNvbmZpZ3VyZWQgPSB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJQ29uZmlndXJhdGlvbkFuZFRhcmdldCBjYXQgPSBjcmVhdGVTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gbmV3Vmlld2VyQ29uZmlndXJhdGlvbiA9IGNhdC5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoIShjYXQuZ2V0VGFyZ2V0SWQoKS5lcXVhbHMoZlZpZXdlckNvbmZpZ3VyYXRpb25UYXJnZXRJZCkpKSB7Ci0JCQkJLy8gZDI4Mjg5NCB1c2UgbmV3Vmlld2VyQ29uZmlndXJhdGlvbgotCQkJCWZWaWV3ZXJDb25maWd1cmF0aW9uVGFyZ2V0SWQgPSBjYXQuZ2V0VGFyZ2V0SWQoKTsKLQkJCQljb25maWd1cmF0aW9uID0gbmV3Vmlld2VyQ29uZmlndXJhdGlvbjsKLQkJCQlzZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pOwotCQkJCWNvbmZpZ3VyZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJaWYgKGdldFNvdXJjZVZpZXdlcigpICE9IG51bGwpIHsKLQkJCS8vIG5vdCBzdXJlIGlmIHJlYWxseSBuZWVkIHRvIHJlY29uZmlndXJlIHdoZW4gaW5wdXQgY2hhbmdlcwotCQkJLy8gKG1heWJlIG9ubHkgbmVlZCB0byByZXNldCB2aWV3ZXJjb25maWcncyBkb2N1bWVudCkKLQkJCWlmICghY29uZmlndXJlZCkKLQkJCQlnZXRTb3VyY2VWaWV3ZXIoKS5jb25maWd1cmUoY29uZmlndXJhdGlvbik7Ci0JCQlJQWN0aW9uIG9wZW5IeXBlcmxpbmtBY3Rpb24gPSBnZXRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfT1BFTl9GSUxFKTsKLQkJCWlmIChvcGVuSHlwZXJsaW5rQWN0aW9uIGluc3RhbmNlb2YgT3Blbkh5cGVybGlua0FjdGlvbikgewotCQkJCSgoT3Blbkh5cGVybGlua0FjdGlvbikgb3Blbkh5cGVybGlua0FjdGlvbikuc2V0SHlwZXJsaW5rRGV0ZWN0b3JzKGdldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRIeXBlcmxpbmtEZXRlY3RvcnMoZ2V0U291cmNlVmlld2VyKCkpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXR1c0ZpZWxkKFN0cmluZyBjYXRlZ29yeSkgewotCQlzdXBlci51cGRhdGVTdGF0dXNGaWVsZChjYXRlZ29yeSk7Ci0KLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlNUQVRVU19DQVRFR09SWV9PRkZTRVQuZXF1YWxzKGNhdGVnb3J5KSkgewotCQkJSVN0YXR1c0ZpZWxkIGZpZWxkID0gZ2V0U3RhdHVzRmllbGQoY2F0ZWdvcnkpOwotCQkJSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIgPSBnZXRTb3VyY2VWaWV3ZXIoKTsKLQkJCWlmIChmaWVsZCAhPSBudWxsICYmIHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQkJUG9pbnQgc2VsZWN0aW9uID0gc291cmNlVmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpbnQgb2Zmc2V0MSA9IHdpZGdldE9mZnNldDJNb2RlbE9mZnNldChzb3VyY2VWaWV3ZXIsIHNlbGVjdGlvbi54KTsKLQkJCQlpbnQgb2Zmc2V0MiA9IHdpZGdldE9mZnNldDJNb2RlbE9mZnNldChzb3VyY2VWaWV3ZXIsIHNlbGVjdGlvbi55KTsKLQkJCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCQkJaWYgKG9mZnNldDEgIT0gb2Zmc2V0MikKLQkJCQkJdGV4dCA9ICJbIiArIG9mZnNldDEgKyAiLSIgKyBvZmZzZXQyICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCWVsc2UKLQkJCQkJdGV4dCA9ICJbICIgKyBvZmZzZXQxICsgIiBdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJZmllbGQuc2V0VGV4dCh0ZXh0ID09IG51bGwgPyBmRXJyb3JMYWJlbCA6IHRleHQpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGdvdG9Bbm5vdGF0aW9uKGJvb2xlYW4gZm9yd2FyZCkgewotCQlBbm5vdGF0aW9uIHJlc3VsdCA9IHN1cGVyLmdvdG9Bbm5vdGF0aW9uKGZvcndhcmQpOwotCQlpZihyZXN1bHQgIT0gbnVsbCkKLQkJCWZTZWxlY3Rpb25DaGFuZ2VkRnJvbUdvdG8gPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXZvaWQgdXBkYXRlU3RhdHVzTGluZShJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBCdWcgMjEwNDgxIC0gRG9uJ3QgdXBkYXRlIHRoZSBzdGF0dXMgbGluZSBpZiB0aGUgc2VsZWN0aW9uCi0JCS8vIHdhcyBjYXVzZWQgYnkgZ28gdG8gbmF2aWdhdGlvbgotCQlpZihmU2VsZWN0aW9uQ2hhbmdlZEZyb21Hb3RvKSB7Ci0JCQlmU2VsZWN0aW9uQ2hhbmdlZEZyb21Hb3RvID0gZmFsc2U7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyID0gZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQlpZiAoZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyICE9IG51bGwgJiYgc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKGZpcnN0RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCXRleHQgPSBmU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIuZ2V0VGV4dChmaXJzdEVsZW1lbnQpOwotCQkJCQlpbWFnZSA9IGZTdGF0dXNMaW5lTGFiZWxQcm92aWRlci5nZXRJbWFnZSgoZmlyc3RFbGVtZW50KSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKHRleHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShpbWFnZSwgdGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaWduZWQgY3VycmVudCBzZWxlY3Rpb24uCi0JICogVGhlIGxlbmd0aCB3aWxsIGJlIG5lZ2F0aXZlIGlmIHRoZSByZXN1bHRpbmcgc2VsZWN0aW9uCi0JICogaXMgcmlnaHQtdG8tbGVmdCAoUnRvTCkuCi0JICogPHA+Ci0JICogVGhlIHNlbGVjdGlvbiBvZmZzZXQgaXMgbW9kZWwgYmFzZWQuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlciB0aGUgc291cmNlIHZpZXdlcgotCSAqIEByZXR1cm4gYSByZWdpb24gZGVub3RpbmcgdGhlIGN1cnJlbnQgc2lnbmVkIHNlbGVjdGlvbiwgZm9yIGEgcmVzdWx0aW5nIFJ0b0wgc2VsZWN0aW9ucyBsZW5ndGggaXMgPCAwCi0JICovCi0JSVJlZ2lvbiBnZXRTaWduZWRTZWxlY3Rpb24oSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJU3R5bGVkVGV4dCB0ZXh0PSBzb3VyY2VWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlQb2ludCBzZWxlY3Rpb249IHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQotCQlpZiAodGV4dC5nZXRDYXJldE9mZnNldCgpID09IHNlbGVjdGlvbi54KSB7Ci0JCQlzZWxlY3Rpb24ueD0gc2VsZWN0aW9uLnggKyBzZWxlY3Rpb24ueTsKLQkJCXNlbGVjdGlvbi55PSAtc2VsZWN0aW9uLnk7Ci0JCX0KLQotCQlzZWxlY3Rpb24ueD0gd2lkZ2V0T2Zmc2V0Mk1vZGVsT2Zmc2V0KHNvdXJjZVZpZXdlciwgc2VsZWN0aW9uLngpOwotCi0JCXJldHVybiBuZXcgUmVnaW9uKHNlbGVjdGlvbi54LCBzZWxlY3Rpb24ueSk7Ci0JfQotCi0JcHJvdGVjdGVkIFNvdXJjZVZpZXdlckRlY29yYXRpb25TdXBwb3J0IGdldFNvdXJjZVZpZXdlckRlY29yYXRpb25TdXBwb3J0KElTb3VyY2VWaWV3ZXIgdmlld2VyKSB7Ci0JCS8qIFJlbW92ZWQgd29ya2Fyb3VuZCBmb3IgQnVnIFsyMDY5MTNdIHNvdXJjZSBhbm5vdGF0aW9ucyBhcmUgbm90IHBhaW50aW5nIGluIHNvdXJjZSBlZGl0b3JzLgotCQkgKiBXaXRoIHRoZSBuZXcgcHJlc2VudGF0aW9uIHJlY29uY2lsZXIsIHdlIG5vIGxvbmdlciBuZWVkIHRvIGZvcmNlIHRoZSBwYWludGluZy4gVGhpcwotCQkgKiBhY3R1YWxseSBjYXVzZWQgQnVnIFsyMTk3NzZdIFdyb25nIGFubm90YXRpb24gZGlzcGxheSBvbiBtYWNzLiBXZSBmb3JjZWQgdGhlCi0JCSAqIFNxdWlnZ2xlcyBzdHJhdGVneSwgZXZlbiB3aGVuIHRoZSBuYXRpdmUgcHJvYmxlbSB1bmRlcmxpbmUgd2FzIHNwZWNpZmllZCBmb3IgYW5ub3RhdGlvbnMgKi8KLQkJcmV0dXJuIHN1cGVyLmdldFNvdXJjZVZpZXdlckRlY29yYXRpb25TdXBwb3J0KHZpZXdlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxDaGFyYWN0ZXJQYWlyaW5nKCkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gZ2V0SW50ZXJuYWxNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTU0VVSVBsdWdpbi5JRCwgImNoYXJhY3RlclBhaXJpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkJSUNvbnRlbnRUeXBlTWFuYWdlciBtZ3IgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJCUlDb250ZW50VHlwZSB0eXBlID0gbWdyLmdldENvbnRlbnRUeXBlKG1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpKTsKLQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCS8vIENyZWF0ZSB0aGUgaW5zZXJ0ZXIKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbnRlbnRUeXBlcyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oImNvbnRlbnRUeXBlSWRlbnRpZmllciIpOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb250ZW50VHlwZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQlTdHJpbmcgaWQgPSBjb250ZW50VHlwZXNbal0uZ2V0QXR0cmlidXRlKCJpZCIpOwotCQkJCQkJCWlmIChpZCAhPSBudWxsKSB7Ci0JCQkJCQkJCUlDb250ZW50VHlwZSB0YXJnZXRUeXBlID0gbWdyLmdldENvbnRlbnRUeXBlKGlkKTsKLQkJCQkJCQkJaW50IHByaW9yaXR5ID0gY2FsY3VsYXRlUHJpb3JpdHkodHlwZSwgdGFyZ2V0VHlwZSwgMCk7Ci0JCQkJCQkJCWlmIChwcmlvcml0eSA+PSAwKSB7Ci0JCQkJCQkJCQlmaW5hbCBDaGFyYWN0ZXJQYWlyaW5nIHBhaXJpbmcgPSBuZXcgQ2hhcmFjdGVyUGFpcmluZygpOwotCQkJCQkJCQkJcGFpcmluZy5wcmlvcml0eSA9IHByaW9yaXR5OwotCQkJCQkJCQkJU3RyaW5nW10gcGFydGl0aW9ucyA9IFN0cmluZ1V0aWxzLnVucGFjayhjb250ZW50VHlwZXNbal0uZ2V0QXR0cmlidXRlKCJwYXJ0aXRpb25zIikpOwotCQkJCQkJCQkJcGFpcmluZy5wYXJ0aXRpb25zID0gbmV3IEhhc2hTZXQocGFydGl0aW9ucy5sZW5ndGgpOwotCQkJCQkJCQkJLy8gT25seSBhZGQgdGhlIGluc2VydGVyIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBwYXJ0aXRpb24gZm9yIHRoZSBjb250ZW50IHR5cGUKLQkJCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcGFydGl0aW9ucy5sZW5ndGg7IGsrKykgewotCQkJCQkJCQkJCXBhaXJpbmcucGFydGl0aW9ucy5hZGQocGFydGl0aW9uc1trXSk7Ci0JCQkJCQkJCQl9Ci0KLQkJCQkJCQkJCXBhaXJpbmcuaW5zZXJ0ZXIgPSAoQWJzdHJhY3RDaGFyYWN0ZXJQYWlySW5zZXJ0ZXIpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCQkJCQkJCWlmIChwYWlyaW5nLmluc2VydGVyICE9IG51bGwgJiYgcGFydGl0aW9ucy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJCQkJZlBhaXJJbnNlcnRlci5hZGRJbnNlcnRlcihwYWlyaW5nKTsKLQkJCQkJCQkJCQkvKiB1c2UgYSBTYWZlUnVubmVyIHNpbmNlIHRoaXMgbWV0aG9kIGlzIGFsc28gaW52b2tlZCBkdXJpbmcgUGFydCBjcmVhdGlvbiAqLwotCQkJCQkJCQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCQkJCQkJCXBhaXJpbmcuaW5zZXJ0ZXIuaW5pdGlhbGl6ZSgpOwotCQkJCQkJCQkJCQl9Ci0KLQkJCQkJCQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJCQkJCQkJCS8vIHJlbHkgb24gZGVmYXVsdCBsb2dnaW5nCi0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZQYWlySW5zZXJ0ZXIucHJpb3JpdGl6ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyB0aGUgcHJpb3JpdHkgb2YgdGhlIHRhcmdldCBjb250ZW50IHR5cGUuIFRoZSBjbG9zZXIgPGNvZGU+dGFyZ2V0VHlwZTwvY29kZT4KLQkgKiBpcyB0byA8Y29kZT50eXBlPC9jb2RlPiB0aGUgaGlnaGVyIGl0cyBwcmlvcml0eS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSB0YXJnZXRUeXBlCi0JICogQHBhcmFtIHByaW9yaXR5Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGNhbGN1bGF0ZVByaW9yaXR5KElDb250ZW50VHlwZSB0eXBlLCBJQ29udGVudFR5cGUgdGFyZ2V0VHlwZSwgaW50IHByaW9yaXR5KSB7Ci0JCWlmICh0eXBlID09IG51bGwgfHwgdGFyZ2V0VHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlpZiAodHlwZS5nZXRJZCgpLmVxdWFscyh0YXJnZXRUeXBlLmdldElkKCkpKQotCQkJcmV0dXJuIHByaW9yaXR5OwotCQlyZXR1cm4gY2FsY3VsYXRlUHJpb3JpdHkodHlwZS5nZXRCYXNlVHlwZSgpLCB0YXJnZXRUeXBlLCArK3ByaW9yaXR5KTsKLQl9Ci0KLQkvKioKLQkgKiBJbnN0YWxscyBzZW1hbnRpYyBoaWdobGlnaHRpbmcgb24gdGhlIGVkaXRvcgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnN0YWxsU2VtYW50aWNIaWdobGlnaHRpbmcoKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBnZXRJbnRlcm5hbE1vZGVsKCk7Ci0JCWlmIChmU2VtYW50aWNNYW5hZ2VyID09IG51bGwgJiYgbW9kZWwgIT0gbnVsbCkgewotCQkJZlNlbWFudGljTWFuYWdlciA9IG5ldyBTZW1hbnRpY0hpZ2hsaWdodGluZ01hbmFnZXIoKTsKLQkJCWZTZW1hbnRpY01hbmFnZXIuaW5zdGFsbChnZXRTb3VyY2VWaWV3ZXIoKSwgZ2V0UHJlZmVyZW5jZVN0b3JlKCksIGdldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKSwgbW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFVuaW5zdGFsbHMgc2VtYW50aWMgaGlnaGxpZ2h0aW5nIG9uIHRoZSBlZGl0b3IgYW5kIHBlcmZvcm1zIGNsZWFudXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgdW5pbnN0YWxsU2VtYW50aWNIaWdobGlnaHRpbmcoKSB7Ci0JCWlmIChmU2VtYW50aWNNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZW1hbnRpY01hbmFnZXIudW5pbnN0YWxsKCk7Ci0JCQlmU2VtYW50aWNNYW5hZ2VyID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgSUluZm9ybWF0aW9uUHJlc2VudGVyIGNvbmZpZ3VyZU91dGxpbmVQcmVzZW50ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUluZm9ybWF0aW9uUHJlc2VudGVyIHByZXNlbnRlciA9IG51bGw7Ci0KLQkJLy8gR2V0IHRoZSBxdWljayBvdXRsaW5lIGNvbmZpZ3VyYXRpb24KLQkJQWJzdHJhY3RRdWlja091dGxpbmVDb25maWd1cmF0aW9uIGNmZyA9IG51bGw7Ci0JCUV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRlciA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gaWRzID0gZ2V0Q29uZmlndXJhdGlvblBvaW50cygpOwotCQlmb3IgKGludCBpID0gMDsgY2ZnID09IG51bGwgJiYgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJY2ZnID0gKEFic3RyYWN0UXVpY2tPdXRsaW5lQ29uZmlndXJhdGlvbikgYnVpbGRlci5nZXRDb25maWd1cmF0aW9uKEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuUVVJQ0tPVVRMSU5FQ09ORklHVVJBVElPTiwgaWRzW2ldKTsKLQkJfQotCi0JCWlmIChjZmcgIT0gbnVsbCkgewotCQkJcHJlc2VudGVyID0gbmV3IEluZm9ybWF0aW9uUHJlc2VudGVyKGdldE91dGxpbmVQcmVzZW50ZXJDb250cm9sQ3JlYXRvcihjZmcpKTsKLQkJCXByZXNlbnRlci5zZXREb2N1bWVudFBhcnRpdGlvbmluZyhjb25maWcuZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHNvdXJjZVZpZXdlcikpOwotCQkJcHJlc2VudGVyLnNldEFuY2hvcihBYnN0cmFjdEluZm9ybWF0aW9uQ29udHJvbE1hbmFnZXIuQU5DSE9SX0dMT0JBTCk7Ci0JCQlJSW5mb3JtYXRpb25Qcm92aWRlciBwcm92aWRlciA9IG5ldyBTb3VyY2VJbmZvUHJvdmlkZXIodGhpcyk7Ci0JCQlTdHJpbmdbXSBjb250ZW50VHlwZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlwcmVzZW50ZXIuc2V0SW5mb3JtYXRpb25Qcm92aWRlcihwcm92aWRlciwgY29udGVudFR5cGVzW2ldKTsKLQkJCX0KLQkJCXByZXNlbnRlci5zZXRTaXplQ29uc3RyYWludHMoNTAsIDIwLCB0cnVlLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIHByZXNlbnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvdXRsaW5lIHByZXNlbnRlciBjb250cm9sIGNyZWF0b3IuIFRoZSBjcmVhdG9yIGlzIGEgCi0JICogZmFjdG9yeSBjcmVhdGluZyBvdXRsaW5lIHByZXNlbnRlciBjb250cm9scyBmb3IgdGhlIGdpdmVuIHNvdXJjZSB2aWV3ZXIuIAotCSAqCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlciB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYW4gaW5mb3JtYXRpb24gY29udHJvbCBjcmVhdG9yCi0JICovCi0JcHJpdmF0ZSBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciBnZXRPdXRsaW5lUHJlc2VudGVyQ29udHJvbENyZWF0b3IoZmluYWwgQWJzdHJhY3RRdWlja091dGxpbmVDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlyZXR1cm4gbmV3IElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKCkgewotCQkJcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2wgY3JlYXRlSW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudCkgewotCQkJCWludCBzaGVsbFN0eWxlID0gU1dULlJFU0laRTsKLQkJCQlyZXR1cm4gbmV3IFF1aWNrT3V0bGluZVBvcHVwRGlhbG9nKHBhcmVudCwgc2hlbGxTdHlsZSwgZ2V0SW50ZXJuYWxNb2RlbCgpLCBjb25maWcpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dEludm9jYXRpb25Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvU3RydWN0dXJlZFRleHRJbnZvY2F0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDEyNjVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dEludm9jYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5UZXh0SW52b2NhdGlvbkNvbnRleHQ7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMKLSAqIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUKLSAqIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0bwotICogc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkKLSAqIGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZQotICogQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgotICogCi0gKiBTdHJ1Y3R1cmVkIFRleHQgcXVpY2sgYXNzaXN0IGludm9jYXRpb24gY29udGV4dC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0cnVjdHVyZWRUZXh0SW52b2NhdGlvbkNvbnRleHQgZXh0ZW5kcyBUZXh0SW52b2NhdGlvbkNvbnRleHQgewotCXByaXZhdGUgTWFwIGZBdHRyaWJ1dGVzOwotCi0JLyoqCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRJbnZvY2F0aW9uQ29udGV4dChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgTWFwIGF0dHJpYnV0ZXMpIHsKLQkJc3VwZXIoc291cmNlVmlld2VyLCBvZmZzZXQsIGxlbmd0aCk7Ci0JCWZBdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYXR0cmlidXRlTmFtZQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLCBvciA8dHQ+bnVsbDwvdHQ+IHdoZW4gbm8gc3VjaAotCSAqICAgICAgICAgYXR0cmlidXRlIGlzIGRlZmluZWQgb3IgdGhhdCBhdHRyaWJ1dGUncyB2YWx1ZSBoYXMgYmVlbiBzZXQgdG8KLQkgKiAgICAgICAgIDx0dD5udWxsPC90dD4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gKGZBdHRyaWJ1dGVzICE9IG51bGwgPyBmQXR0cmlidXRlcy5nZXQoYXR0cmlidXRlTmFtZSkgOiBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvU3RydWN0dXJlZFRleHRNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvU3RydWN0dXJlZFRleHRNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZDQ4ZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL1N0cnVjdHVyZWRUZXh0TXVsdGlQYXNzQ29udGVudEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlR5cGVkUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JRm9ybWF0dGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLk11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXI7Ci0KLS8qKgotICogRXh0ZW5kcyB0aGUgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlciB0byBhbGxvdyBjbGllbnRzIHRvIGNvbnRyaWJ1dGUKLSAqIGFkZGl0aW9uYWwgc2xhdmUgZm9ybWF0dGluZyBzdHJhdGVnaWVzIHZpYSB0aGUKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50Ci0gKi8KLWNsYXNzIFN0cnVjdHVyZWRUZXh0TXVsdGlQYXNzQ29udGVudEZvcm1hdHRlciBleHRlbmRzIE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIgewotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiAidHlwZSIgYXR0cmlidXRlIGluIHRoZSBwcm92aXNpb25hbENvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTEFWRV9GT1JNQVRUSU5HX1NUUkFURUdZX0VYVEVOREVEX0lEID0gInNsYXZlZm9ybWF0dGluZ3N0cmF0ZWd5IjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIGxpc3Qgb2YgcGFydGl0aW9uIHR5cGVzIHRoYXQgYWxyZWFkeSBoYXZlIGEgZm9ybWF0dGluZyBzdHJhdGVneQotCSAqLwotCXByaXZhdGUgTGlzdCBmSW5zdGFsbGVkUGFydGl0aW9uVHlwZXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRlbnQgZm9ybWF0dGVyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJ0aXRpb25pbmcKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBwYXJ0aXRpb25pbmcgZm9yIHRoaXMgZm9ybWF0dGVyCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IGNvbnRlbnQgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIoZmluYWwgU3RyaW5nIHBhcnRpdGlvbmluZywgZmluYWwgU3RyaW5nIHR5cGUpIHsKLQkJc3VwZXIocGFydGl0aW9uaW5nLCB0eXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRNYXN0ZXIoSUZvcm1hdHRpbmdDb250ZXh0IGNvbnRleHQsIElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQkvLyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCi0JCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJc3VwZXIuZm9ybWF0TWFzdGVyKGNvbnRleHQsIGRvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCk7Ci0KLQkJaWYgKExvZ2dlci5ERUJVR19GT1JNQVQpIHsKLQkJCWxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJmb3JtYXRNb2RlbCB0aW1lOiAiICsgKGVuZFRpbWUgLSBzdGFydFRpbWUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiBPdmVyd3JpdHRlbiB0byBjaGVjayBmb3IgYWRkaXRpb25hbCBzbGF2ZSBmb3JtYXR0aW5nIHN0cmF0ZWdpZXMKLQkgKiBjb250cmlidXRlZCB2aWEgdGhlIGVkaXRvckNvbmZpZ3VyYXRpb24gZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFNsYXZlKElGb3JtYXR0aW5nQ29udGV4dCBjb250ZXh0LCBJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0eXBlKSB7Ci0JCUxpc3QgaW5zdGFsbGVkVHlwZXMgPSBnZXRJbnN0YWxsZWRQYXJ0aXRpb25UeXBlcygpOwotCQlpZiAoaW5zdGFsbGVkVHlwZXMuY29udGFpbnModHlwZSkpIHsKLQkJCS8vIHdlJ3ZlIGFscmVhZHkgc2V0IHRoZSBzbGF2ZSBmb3JtYXR0ZXIgc3RyYXRlZ3kgc28ganVzdCBwZXJmb3JtCi0JCQkvLyBhcyBub3JtYWwKLQkJCXN1cGVyLmZvcm1hdFNsYXZlKGNvbnRleHQsIGRvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgdHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlib29sZWFuIGZpbmRFeHRlbmRlZFNsYXZlRm9ybWF0dGVyID0gdHJ1ZTsKLQotCQkJLy8gbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoZXJlJ3MgYWxyZWFkeSBhIHNsYXZlIGZvcm1hdHRlciBzZXQsIHNvCi0JCQkvLyBqdXN0IGF0dGVtcHQgdG8gZm9ybWF0IGFzIG5vcm1hbAotCQkJc3VwZXIuZm9ybWF0U2xhdmUoY29udGV4dCwgZG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCB0eXBlKTsKLQotCQkJLy8gbm93LCBkZXRlcm1pbmUgaWYgc2xhdmUgZm9ybWF0dGVyIHdhcyBhbHJlYWR5IHNldCBieSBjaGVja2luZwotCQkJLy8gY29udGV4dCAoaXQgd291bGQgYmUgc2V0IGlmIHRoZXJlJ3MgYWxyZWFkeSBvbmUpCi0JCQlPYmplY3QgY29udGV4dFBhcnRpdGlvbiA9IGNvbnRleHQuZ2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfUEFSVElUSU9OKTsKLQkJCWlmIChjb250ZXh0UGFydGl0aW9uIGluc3RhbmNlb2YgVHlwZWRQb3NpdGlvbikgewotCQkJCVN0cmluZyBjb250ZXh0VHlwZSA9ICgoVHlwZWRQb3NpdGlvbikgY29udGV4dFBhcnRpdGlvbikuZ2V0VHlwZSgpOwotCQkJCWlmIChjb250ZXh0VHlwZSA9PSB0eXBlKSB7Ci0JCQkJCS8vIHRoZXJlJ3MgYWxyZWFkeSBhIHNsYXZlIGZvcm1hdHRlciBzZXQsIHNvIGp1c3QgYWRkIGl0Ci0JCQkJCS8vIHRvIHRoZSBsaXN0IG9mIGluc3RhbGxlZCBwYXJ0aXRpb24gdHlwZXMgZm9yIGZ1dHVyZQotCQkJCQkvLyByZWZlcmVuY2UKLQkJCQkJaW5zdGFsbGVkVHlwZXMuYWRkKHR5cGUpOwotCQkJCQlmaW5kRXh0ZW5kZWRTbGF2ZUZvcm1hdHRlciA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCS8vIG5vIHNsYXZlIGZvcm1hdHRlciBpcyBzZXQgeWV0LCBzbyB0cnkgdG8gZmluZCBvbmUgY29udHJpYnV0ZWQKLQkJCS8vIHZpYSB0aGUgZWRpdG9yQ29uZmlndXJhdGlvbiBleHRlbnNpb24gcG9pbnQKLQkJCWlmIChmaW5kRXh0ZW5kZWRTbGF2ZUZvcm1hdHRlcikgewotCQkJCU9iamVjdCBjb25maWd1cmF0aW9uID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb24oU0xBVkVfRk9STUFUVElOR19TVFJBVEVHWV9FWFRFTkRFRF9JRCwgdHlwZSk7Ci0JCQkJaWYgKGNvbmZpZ3VyYXRpb24gaW5zdGFuY2VvZiBJRm9ybWF0dGluZ1N0cmF0ZWd5KSB7Ci0JCQkJCS8vIGZvdW5kIGEgZm9ybWF0dGVyLCBzbyBhZGQgaXQgaW4KLQkJCQkJc2V0U2xhdmVTdHJhdGVneSgoSUZvcm1hdHRpbmdTdHJhdGVneSkgY29uZmlndXJhdGlvbiwgdHlwZSk7Ci0JCQkJCS8vIHRyeSB0byBmb3JtYXQgc2xhdmUgYWdhaW4gbm93IHRoYXQgb25lIGlzIHNldAotCQkJCQlzdXBlci5mb3JtYXRTbGF2ZShjb250ZXh0LCBkb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsIHR5cGUpOwotCQkJCX0KLQkJCQkvLyBub3RlIHRoYXQgd2UndmUgYWxyZWFkeSBjaGVja2VkIHRoaXMgcGFydGl0aW9uIHR5cGUgZm9yCi0JCQkJLy8gZnV0dXJlIHJlZmVyZW5jZQotCQkJCWluc3RhbGxlZFR5cGVzLmFkZCh0eXBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbGlzdCBvZiBwYXJ0aXRpb24gdHlwZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBldmFsdWF0ZWQgZm9yCi0JICogc2xhdmUgZm9ybWF0dGluZyBzdHJhdGVnaWVzIGZvciB0aGlzIGZvcm1hdHRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0SW5zdGFsbGVkUGFydGl0aW9uVHlwZXMoKSB7Ci0JCWlmIChmSW5zdGFsbGVkUGFydGl0aW9uVHlwZXMgPT0gbnVsbCkKLQkJCWZJbnN0YWxsZWRQYXJ0aXRpb25UeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGZJbnN0YWxsZWRQYXJ0aXRpb25UeXBlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMDgyMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHREb3VibGVDbGlja1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklDb250ZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtQcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuTXVsdGlwbGVIeXBlcmxpbmtQcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25QcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLkluZm9ybWF0aW9uUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucHJlc2VudGF0aW9uLklQcmVzZW50YXRpb25SZWNvbmNpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucXVpY2thc3Npc3QuSVF1aWNrQXNzaXN0QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucXVpY2thc3Npc3QuUXVpY2tBc3Npc3RBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Ib3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5FZGl0b3JzVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQ2hhaW5lZFByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5TdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5TdHJ1Y3R1cmVkQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb24uQ29tcG91bmRRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlcml2ZWQuSFRNTFRleHRQcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5FZGl0b3JQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLlJlY29uY2lsZXJIaWdobGlnaHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLlN0cnVjdHVyZWRQcmVzZW50YXRpb25SZWNvbmNpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlN0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5ydWxlcy5TdHJ1Y3R1cmVkRG9jdW1lbnREYW1hZ2VyUmVwYWlyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvLkFubm90YXRpb25Ib3ZlclByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm8uQmVzdE1hdGNoSG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvLlByb2JsZW1Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvLlRleHRIb3Zlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci0KLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgc291cmNlIHZpZXdlciB1c2VkIGJ5IFN0cnVjdHVyZWRUZXh0RWRpdG9yLjxiciAvPgotICogTm90ZTogV2hpbGUgSVNvdXJjZVZpZXdlciBpcyBwYXNzZWQgaW4gZm9yIGVhY2ggZ2V0IGNvbmZpZ3VyYXRpb24sIGNsaWVudHMKLSAqIHNob3VsZCBjcmVhdGUgYSBuZXcgdmlld2VyIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UgZm9yIGVhY2ggaW5zdGFuY2Ugb2YKLSAqIHNvdXJjZSB2aWV3ZXIgYXMgc29tZSBtZXRob2RzIHJldHVybiB0aGUgc2FtZSBpbnN0YW5jZSBvZiBhbiBvYmplY3QsCi0gKiByZWdhcmRsZXNzIG9mIHRoZSBzb3VyY2V2aWV3ZXIuCi0gKiA8cD4KLSAqIENsaWVudHMgc2hvdWxkIHN1YmNsYXNzIGFuZCBvdmVycmlkZSBqdXN0IHRob3NlIG1ldGhvZHMgd2hpY2ggbXVzdCBiZQotICogc3BlY2lmaWMgdG8gdGhlaXIgbmVlZHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBUZXh0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbiB7Ci0JLyoqCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uIGJlY2F1c2UgY3JlYXRpbmcgYSBzZWNvbmQgYXNzaXN0YW50IHRoYXQKLQkgKiBpcyBhZGRlZCB0byBhIHZpZXdlciBjYW4gY2F1c2Ugb2RkIGtleS1lYXRpbmcgYnkgdGhlIHdyb25nIG9uZS4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRDb250ZW50QXNzaXN0YW50IGZDb250ZW50QXNzaXN0YW50ID0gbnVsbDsKLQkKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbiBiZWNhdXNlIGl0J3MganVzdCBsaWtlIGNvbnRlbnQgYXNzaXN0YW50Ci0JICovCi0JcHJpdmF0ZSBJUXVpY2tBc3Npc3RBc3Npc3RhbnQgZlF1aWNrQXNzaXN0YW50ID0gbnVsbDsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgSVJlY29uY2lsZXIgZlJlY29uY2lsZXI7Ci0JLyoqCi0JICogRXh0ZW5kZWQgY29uZmlndXJhdGlvbiBwcm92aXNpb25hbENvbmZpZ3VyYXRpb24gdHlwZSB0byBjb250cmlidXRlCi0JICogYWRkaXRpb25hbCBhdXRvIGVkaXQgc3RyYXRlZ2llcwotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIEFVVE9FRElUU1RSQVRFR1kgPSAiYXV0b2VkaXRzdHJhdGVneSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBDT05URU5UX0FTU0lTVF9TSVpFID0gImNvbnRlbnRhc3Npc3RzaXplIjsKLQkKLQlwcml2YXRlIFJlY29uY2lsZXJIaWdobGlnaHRlciBmSGlnaGxpZ2h0ZXIgPSBudWxsOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBzdHJ1Y3R1cmVkIHRleHQgdmlld2VyIGNvbmZpZ3VyYXRpb24uCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJLy8gaW5pdGlhbGl6ZSBmUHJlZmVyZW5jZVN0b3JlIHdpdGggc2FtZSBwcmVmZXJlbmNlIHN0b3JlIHVzZWQgaW4KLQkJLy8gU3RydWN0dXJlZFRleHRFZGl0b3IKLQkJZlByZWZlcmVuY2VTdG9yZSA9IGNyZWF0ZUNvbWJpbmVkUHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcHJlZmVyZW5jZSBzdG9yZSB0aGF0IGNvbWJpbmVzIHRoZSBzb3VyY2UgZWRpdG9yIHByZWZlcmVuY2VzCi0JICogd2l0aCB0aGUgYmFzZSBlZGl0b3IncyBwcmVmZXJlbmNlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIElQcmVmZXJlbmNlU3RvcmUKLQkgKi8KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgY3JlYXRlQ29tYmluZWRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3NlRWRpdG9yUHJlZnMgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgYmFzZUVkaXRvclByZWZzID0gRWRpdG9yc1VJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlyZXR1cm4gbmV3IENoYWluZWRQcmVmZXJlbmNlU3RvcmUobmV3IElQcmVmZXJlbmNlU3RvcmVbXXtzc2VFZGl0b3JQcmVmcywgYmFzZUVkaXRvclByZWZzfSk7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogQ2xpZW50cyBjYW5ub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYmVjYXVzZSB0aGlzIG1ldGhvZCByZXR1cm5zIGEKLQkgKiBzcGVjaWFsbHkgY29uZmlndXJlZCBBbm5vdGF0aW9uIEhvdmVyIGZvciB0aGUgU3RydWN0dXJlZFRleHRWaWV3ZXIKLQkgKiAKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24jZ2V0QW5ub3RhdGlvbkhvdmVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIpCi0JICovCi0JZmluYWwgcHVibGljIElBbm5vdGF0aW9uSG92ZXIgZ2V0QW5ub3RhdGlvbkhvdmVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luY2x1ZGVkKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQkJCXJldHVybiBpc1Nob3dJblZlcnRpY2FsUnVsZXIoYW5ub3RhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogR2V0IGNvbG9yIGZvciB0aGUgcHJlZmVyZW5jZSBrZXkuIEFzc3VtZXMgZlByZWZlcmVuY2VTdG9yZSBpcyBub3QgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybiBDb2xvciBmb3IgcHJlZmVyZW5jZSBrZXkgb3IgbnVsbCBpZiBub25lIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBDb2xvciBnZXRDb2xvcihTdHJpbmcga2V5KSB7Ci0JCVJHQiByZ2IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGZQcmVmZXJlbmNlU3RvcmUsIGtleSk7Ci0JCXJldHVybiBFZGl0b3JVdGlsaXR5LmdldENvbG9yKHJnYik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiNnZXRBdXRvRWRpdFN0cmF0ZWdpZXMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlciwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUF1dG9FZGl0U3RyYXRlZ3lbXSBnZXRBdXRvRWRpdFN0cmF0ZWdpZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlMaXN0IGFsbFN0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCUlBdXRvRWRpdFN0cmF0ZWd5W10gc3VwZXJTdHJhdGVnaWVzID0gc3VwZXIuZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVyU3RyYXRlZ2llcy5sZW5ndGg7IGkrKykgewotCQkJYWxsU3RyYXRlZ2llcy5hZGQoc3VwZXJTdHJhdGVnaWVzW2ldKTsKLQkJfQotCi0JCS8vIGFkZCBhdXRvIGVkaXQgc3RyYXRlZ2llcyBjb250cmlidXRlZCBieSBjbGllbnRzCi0JCUxpc3QgZXh0ZW5kZWRBdXRvRWRpdHMgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbnMoQVVUT0VESVRTVFJBVEVHWSwgY29udGVudFR5cGUpOwotCQlpZiAoIWV4dGVuZGVkQXV0b0VkaXRzLmlzRW1wdHkoKSkgewotCQkJYWxsU3RyYXRlZ2llcy5hZGRBbGwoZXh0ZW5kZWRBdXRvRWRpdHMpOwotCQl9Ci0KLQkJcmV0dXJuIChJQXV0b0VkaXRTdHJhdGVneVtdKSBhbGxTdHJhdGVnaWVzLnRvQXJyYXkobmV3IElBdXRvRWRpdFN0cmF0ZWd5W2FsbFN0cmF0ZWdpZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29uZmlndXJlZCBwYXJ0aXRpb25pbmcgZm9yIHRoZSBnaXZlbiBzb3VyY2Ugdmlld2VyLiBUaGUKLQkgKiBwYXJ0aXRpb25pbmcgaXMgdXNlZCB3aGVuIHRoZSBxdWVyeWluZyBjb250ZW50IHR5cGVzIGZyb20gdGhlIHNvdXJjZQotCSAqIHZpZXdlcidzIGlucHV0IGRvY3VtZW50LjxiciAvPgotCSAqIE5vdGU6IENsaWVudHMgY2Fubm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGF0IHRoaXMgdGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIGNvbmZpZ3VyZWQgcGFydGl0aW9uaW5nCi0JICogQHNlZSAjZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyKQotCSAqLwotCWZpbmFsIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCS8qCi0JCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBkZWZhdWx0IHN0cnVjdHVyZWQgdGV4dCBwYXJ0aXRpb25pbmcKLQkJICovCi0JCXJldHVybiBJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HOwotCX0KLQotCXB1YmxpYyBpbnRbXSBnZXRDb25maWd1cmVkVGV4dEhvdmVyU3RhdGVNYXNrcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCS8qCi0JCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBjb25maWd1cmVkIHRleHQgaG92ZXIgc3RhdGUgbWFza3MgZm9yCi0JCSAqIFN0cnVjdHVyZWRUZXh0Vmlld2VycwotCQkgKi8KLQkJVGV4dEhvdmVyTWFuYWdlci5UZXh0SG92ZXJEZXNjcmlwdG9yW10gaG92ZXJEZXNjcyA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZXh0SG92ZXJNYW5hZ2VyKCkuZ2V0VGV4dEhvdmVycygpOwotCQlpbnQgc3RhdGVNYXNrc1tdID0gbmV3IGludFtob3ZlckRlc2NzLmxlbmd0aF07Ci0JCWludCBzdGF0ZU1hc2tzTGVuZ3RoID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob3ZlckRlc2NzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaG92ZXJEZXNjc1tpXS5pc0VuYWJsZWQoKSkgewotCQkJCWludCBqID0gMDsKLQkJCQlpbnQgc3RhdGVNYXNrID0gY29tcHV0ZVN0YXRlTWFzayhob3ZlckRlc2NzW2ldLmdldE1vZGlmaWVyU3RyaW5nKCkpOwotCQkJCXdoaWxlIChqIDwgc3RhdGVNYXNrc0xlbmd0aCkgewotCQkJCQlpZiAoc3RhdGVNYXNrc1tqXSA9PSBzdGF0ZU1hc2spCi0JCQkJCQlicmVhazsKLQkJCQkJaisrOwotCQkJCX0KLQkJCQlpZiAoaiA9PSBzdGF0ZU1hc2tzTGVuZ3RoKQotCQkJCQlzdGF0ZU1hc2tzW3N0YXRlTWFza3NMZW5ndGgrK10gPSBzdGF0ZU1hc2s7Ci0JCQl9Ci0JCX0KLQkJaWYgKHN0YXRlTWFza3NMZW5ndGggPT0gaG92ZXJEZXNjcy5sZW5ndGgpCi0JCQlyZXR1cm4gc3RhdGVNYXNrczsKLQotCQlpbnRbXSBzaG9ydGVuZWRTdGF0ZU1hc2tzID0gbmV3IGludFtzdGF0ZU1hc2tzTGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShzdGF0ZU1hc2tzLCAwLCBzaG9ydGVuZWRTdGF0ZU1hc2tzLCAwLCBzdGF0ZU1hc2tzTGVuZ3RoKTsKLQkJcmV0dXJuIHNob3J0ZW5lZFN0YXRlTWFza3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCBhc3Npc3RhbnQgcmVhZHkgdG8gYmUgdXNlZCB3aXRoIHRoZSBnaXZlbiBzb3VyY2UKLQkgKiB2aWV3ZXIuPGJyIC8+Ci0JICogTm90ZTogVGhlIHNhbWUgaW5zdGFuY2Ugb2YgSUNvbnRlbnRBc3Npc3RhbnQgaXMgcmV0dXJuZWQgcmVnYXJkbGVzcyBvZgotCSAqIHRoZSBzb3VyY2Ugdmlld2VyIHBhc3NlZCBpbi4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIHNob3VsZCBnZW5lcmFsbHkgbm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBJbnN0ZWFkLCBjbGllbnRzCi0JICogd2FudGluZyB0byBhZGQgdGhlaXIgb3duIHByb2Nlc3NvcnMgc2hvdWxkIG92ZXJyaWRlCi0JICogPGNvZGU+Z2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcnMoSVNvdXJjZVZpZXdlciwgU3RyaW5nKTwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgY29udGVudCBhc3Npc3RhbnQKLQkgKiBAc2VlICNnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhJU291cmNlVmlld2VyLCBTdHJpbmcpCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0YW50IGdldENvbnRlbnRBc3Npc3RhbnQoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJLyoKLQkJICogTm90ZTogVGhpcyBtZXRob2Qgd2FzIG1hZGUgZmluYWwgc28gdGhhdCBTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdCBpcwotCQkgKiBhbHdheXMgdXNlZCBhbmQgY29udGVudCBhc3Npc3QgZXh0ZW5zaW9uIHBvaW50IGFsd2F5cyB3b3Jrcy4KLQkJICovCi0JCWlmIChmQ29udGVudEFzc2lzdGFudCA9PSBudWxsKSB7Ci0JCQlmQ29udGVudEFzc2lzdGFudCA9IG5ldyBTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdGFudCgpOwotCi0JCQkvLyBjb250ZW50IGFzc2lzdGFudCBjb25maWd1cmF0aW9ucwotCQkJZkNvbnRlbnRBc3Npc3RhbnQuc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHNvdXJjZVZpZXdlcikpOwotCQkJZkNvbnRlbnRBc3Npc3RhbnQuZW5hYmxlQXV0b0FjdGl2YXRpb24odHJ1ZSk7Ci0JCQlmQ29udGVudEFzc2lzdGFudC5zZXRQcm9wb3NhbFBvcHVwT3JpZW50YXRpb24oSUNvbnRlbnRBc3Npc3RhbnQuUFJPUE9TQUxfT1ZFUkxBWSk7Ci0JCQlmQ29udGVudEFzc2lzdGFudC5zZXRDb250ZXh0SW5mb3JtYXRpb25Qb3B1cE9yaWVudGF0aW9uKElDb250ZW50QXNzaXN0YW50LkNPTlRFWFRfSU5GT19BQk9WRSk7Ci0JCQlmQ29udGVudEFzc2lzdGFudC5zZXRJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKGdldEluZm9ybWF0aW9uQ29udHJvbENyZWF0b3Ioc291cmNlVmlld2VyKSk7Ci0JCQlmQ29udGVudEFzc2lzdGFudC5lbmFibGVDb2xvcmVkTGFiZWxzKFBsYXRmb3JtVUkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnN0YW50cy5VU0VfQ09MT1JFRF9MQUJFTFMpKTsKLQotCQkJLy8gc2V0IGNvbnRlbnQgYXNzaXN0IHByZWZlcmVuY2VzCi0JCQlpZiAoZlByZWZlcmVuY2VTdG9yZSAhPSBudWxsKSB7Ci0JCQkJaW50IGRlbGF5ID0gZlByZWZlcmVuY2VTdG9yZS5nZXRJbnQoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfQVVUT0FDVElWQVRJT05fREVMQVkpOwotCQkJCWZDb250ZW50QXNzaXN0YW50LnNldEF1dG9BY3RpdmF0aW9uRGVsYXkoZGVsYXkpOwotCi0JCQkJQ29sb3IgY29sb3IgPSBnZXRDb2xvcihFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QUk9QT1NBTFNfQkFDS0dST1VORCk7Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnQuc2V0UHJvcG9zYWxTZWxlY3RvckJhY2tncm91bmQoY29sb3IpOwotCi0JCQkJY29sb3IgPSBnZXRDb2xvcihFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QUk9QT1NBTFNfRk9SRUdST1VORCk7Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnQuc2V0UHJvcG9zYWxTZWxlY3RvckZvcmVncm91bmQoY29sb3IpOwotCi0JCQkJY29sb3IgPSBnZXRDb2xvcihFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QQVJBTUVURVJTX0JBQ0tHUk9VTkQpOwotCQkJCWZDb250ZW50QXNzaXN0YW50LnNldENvbnRleHRJbmZvcm1hdGlvblBvcHVwQmFja2dyb3VuZChjb2xvcik7Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnQuc2V0Q29udGV4dFNlbGVjdG9yQmFja2dyb3VuZChjb2xvcik7Ci0KLQkJCQljb2xvciA9IGdldENvbG9yKEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BBUkFNRVRFUlNfRk9SRUdST1VORCk7Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnQuc2V0Q29udGV4dEluZm9ybWF0aW9uUG9wdXBGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJCQlmQ29udGVudEFzc2lzdGFudC5zZXRDb250ZXh0U2VsZWN0b3JGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJCX0KLQkJCQotCQkJLy8gYWRkIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMgZm9yIGVhY2ggcGFydGl0aW9uIHR5cGUKLQkJCVN0cmluZ1tdIHR5cGVzID0gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyB0eXBlID0gdHlwZXNbaV07Ci0KLQkJCQkvLyBhZGQgYWxsIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMgZm9yIGN1cnJlbnQgcGFydGl0b24gdHlwZQotCQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yW10gcHJvY2Vzc29ycyA9IGdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKHNvdXJjZVZpZXdlciwgdHlwZSk7Ci0JCQkJaWYgKHByb2Nlc3NvcnMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHByb2Nlc3NvcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWZDb250ZW50QXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IocHJvY2Vzc29yc1tqXSwgdHlwZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSBTU0VVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCQlpZihkaWFsb2dTZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQkJSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSBkaWFsb2dTZXR0aW5ncy5nZXRTZWN0aW9uKENPTlRFTlRfQVNTSVNUX1NJWkUpOwotCQkJCWlmKHNlY3Rpb24gPT0gbnVsbCkgewotCQkJCQlzZWN0aW9uID0gZGlhbG9nU2V0dGluZ3MuYWRkTmV3U2VjdGlvbihDT05URU5UX0FTU0lTVF9TSVpFKTsKLQkJCQl9Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnQuc2V0UmVzdG9yZUNvbXBsZXRpb25Qcm9wb3NhbFNpemUoc2VjdGlvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZDb250ZW50QXNzaXN0YW50OwotCX0KLQotCS8qKgotCSAqIDxwPlJldHVybnMgYSB7QGxpbmsgU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3J9IHdoaWNoIGNhbiBiZSBjb250cmlidXRlZCB0byB0aHJvdWdoCi0JICogdGhlIDx0dD5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbXBsZXRpb25Qcm9wb3NhbDwvdHQ+IGV4dGVuc2lvbiBwb2ludC48L3A+Ci0JICogCi0JICogPHA+SWYgYW4gZXh0ZW5kZXIgb2YgdGhpcyBjbGFzcyBvdmVycmlkZXMgdGhpcyBtZXRob2QgYW5kIGRvZXMgbm90IGluY2x1ZGUgYW4KLQkgKiBpbXBsZW1lbnRhdGlvbiBvZiBhIHtAbGluayBTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3Nvcn0gaW4gdGhlaXIgcmV0dXJuZWQKLQkgKiBwcm9jZXNzb3JzIHRoZW4gYWxsIG9mIHRoZSBjb250cmlidXRpb25zIGJ5IHRoZSBhZm9yZW1lbnRpb25lZCBleHRlbnNpb24gcG9pbnQKLQkgKiB3aWxsIGJlIGxlZnQgb3V0LjwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICogICAgICAgICAgICB0aGUgcGFydGl0aW9uIHR5cGUgZm9yIHdoaWNoIHRoZSBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3JzCi0JICogICAgICAgICAgICBhcmUgYXBwbGljYWJsZQotCSAqIEByZXR1cm4gSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JzIG9yIG51bGwgaWYgc2hvdWxkIG5vdCBiZSBzdXBwb3J0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yKAotCQkJCWZDb250ZW50QXNzaXN0YW50LCBwYXJ0aXRpb25UeXBlLCBzb3VyY2VWaWV3ZXIsIG51bGwpOwotCQlyZXR1cm4gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117cHJvY2Vzc29yfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IGZvcm1hdHRlciByZWFkeSB0byBiZSB1c2VkIHdpdGggdGhlIGdpdmVuIHNvdXJjZQotCSAqIHZpZXdlci4KLQkgKiA8cD4KLQkgKiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdGhhdCBjbGllbnRzIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIGl0IG1heQotCSAqIGJlY29tZSA8Y29kZT5maW5hbDwvY29kZT4gaW4gdGhlIGZ1dHVyZSBhbmQgcmVwbGFjZWQgYnkgYW4gZXh0ZW5zaWJsZQotCSAqIGZyYW1ld29yay4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgY29udGVudCBmb3JtYXR0ZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgZm9ybWF0dGluZyBzaG91bGQKLQkgKiAgICAgICAgIG5vdCBiZSBzdXBwb3J0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRGb3JtYXR0ZXIgZ2V0Q29udGVudEZvcm1hdHRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkvLyB0cnkgdG8gdXNlIHRoZSBTdHJ1Y3R1cmVkVGV4dE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIgc28gdGhhdCBpdAotCQkvLyBwaWNrcyB1cCBhbnkgYWRkaXRpb25hbCBmb3JtYXR0aW5nIHN0cmF0ZWdpZXMgY29udHJpYnV0ZWQgdmlhIHRoZQotCQkvLyBlZGl0b3JDb25maWd1cmF0aW9uIGV4dGVuc2lvbiBwb2ludAotCQlJQ29udGVudEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBudWxsOwotCQlpZiAoc291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHNvdXJjZVZpZXdlci5nZXREb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMykgewotCQkJCVN0cmluZyBwYXJ0aXRpb25pbmcgPSBnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoc291cmNlVmlld2VyKTsKLQkJCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9ICgoSURvY3VtZW50RXh0ZW5zaW9uMykgZG9jdW1lbnQpLmdldERvY3VtZW50UGFydGl0aW9uZXIocGFydGl0aW9uaW5nKTsKLQkJCQlpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0UGFydGl0aW9uVHlwZSA9ICgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgcGFydGl0aW9uZXIpLmdldERlZmF1bHRQYXJ0aXRpb25UeXBlKCk7Ci0JCQkJCWZvcm1hdHRlciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIocGFydGl0aW9uaW5nLCBkZWZhdWx0UGFydGl0aW9uVHlwZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb3VibGUtY2xpY2sgc3RyYXRlZ3kgcmVhZHkgdG8gYmUgdXNlZCBpbiB0aGlzIHZpZXdlciB3aGVuCi0JICogZG91YmxlIGNsaWNraW5nIG9udG8gdGV4dCBvZiB0aGUgZ2l2ZW4gY29udGVudCB0eXBlLiBOb3RlIHRoYXQgaWYKLQkgKiBjbGllbnRzIHdhbnQgdG8gY29udHJpYnV0ZSB0aGVpciBvd24gZG91YmxlY2xpY2sgc3RyYXRlZ3ksIHRoZXkgc2hvdWxkCi0JICogdXNlIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbjwvY29kZT4gZXh0ZW5zaW9uCi0JICogcG9pbnQncyA8Y29kZT5kb3VibGVDbGlja1N0cmF0ZWd5PC9jb2RlPiBlbGVtZW50IGluc3RlYWQgb2YKLQkgKiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLiBJZiBjbGllbnRzIGRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBwbGVhc2UKLQkgKiByZW1lbWJlciB0byBjYWxsIDxjb2RlPnN1cGVyLmdldERvdWJsZUNsaWNrU3RyYXRlZ3koKTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IHR5cGUgZm9yIHdoaWNoIHRoZSBzdHJhdGVneSBpcyBhcHBsaWNhYmxlCi0JICogQHJldHVybiBhIGRvdWJsZS1jbGljayBzdHJhdGVneSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBkb3VibGUKLQkgKiAgICAgICAgIGNsaWNraW5nIHNob3VsZCBub3QgYmUgc3VwcG9ydGVkCi0JICovCi0JcHVibGljIElUZXh0RG91YmxlQ2xpY2tTdHJhdGVneSBnZXREb3VibGVDbGlja1N0cmF0ZWd5KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJSVRleHREb3VibGVDbGlja1N0cmF0ZWd5IHN0cmF0ZWd5ID0gbnVsbDsKLQkJT2JqZWN0IGV4dGVuZGVkU3RyYXRlZ3kgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbihFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLkRPVUJMRUNMSUNLU1RSQVRFR1ksIGNvbnRlbnRUeXBlKTsKLQkJaWYgKGV4dGVuZGVkU3RyYXRlZ3kgaW5zdGFuY2VvZiBJVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3kpIHsKLQkJCXN0cmF0ZWd5ID0gKElUZXh0RG91YmxlQ2xpY2tTdHJhdGVneSkgZXh0ZW5kZWRTdHJhdGVneTsKLQkJfQotCQllbHNlIHsKLQkJCXN0cmF0ZWd5ID0gc3VwZXIuZ2V0RG91YmxlQ2xpY2tTdHJhdGVneShzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJfQotCQlyZXR1cm4gc3RyYXRlZ3k7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaHlwZXJsaW5rIHByZXNlbnRlciBmb3IgdGhlIGdpdmVuIHNvdXJjZSB2aWV3ZXIuPGJyIC8+Ci0JICogTm90ZTogQ2xpZW50cyBjYW5ub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGFuZCBhbHRob3VnaCBpdCdzIG5vIGxvbmdlcgotCSAqIG5lY2Vzc2FyeSwgaXQgbXVzdCByZW1haW4gZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5LgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhIGh5cGVybGluayBwcmVzZW50ZXIgc3BlY2lhbGx5IGNvbmZpZ3VyZWQgZm9yCi0JICogICAgICAgICBTdHJ1Y3R1cmVkVGV4dFZpZXdlcgotCSAqLwotCWZpbmFsIHB1YmxpYyBJSHlwZXJsaW5rUHJlc2VudGVyIGdldEh5cGVybGlua1ByZXNlbnRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlpZiAoZlByZWZlcmVuY2VTdG9yZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0SHlwZXJsaW5rUHJlc2VudGVyKHNvdXJjZVZpZXdlcik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBNdWx0aXBsZUh5cGVybGlua1ByZXNlbnRlcihmUHJlZmVyZW5jZVN0b3JlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29udHJvbCBjcmVhdG9yLiBUaGUgY3JlYXRvciBpcyBhIGZhY3RvcnkKLQkgKiBjcmVhdGluZyBpbmZvcm1hdGlvbiBjb250cm9scyBmb3IgdGhlIGdpdmVuIHNvdXJjZSB2aWV3ZXIuPGJyIC8+Ci0JICogTm90ZTogQ2xpZW50cyBjYW5ub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXQgdGhpcyB0aW1lLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgaW5mb3JtYXRpb24gY29udHJvbCBjcmVhdG9yCi0JICovCi0JZmluYWwgcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGdldEluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJLy8gdXNlZCBieSBob3ZlciBoZWxwCi0JCXJldHVybiBuZXcgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoKSB7Ci0JCQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbCBjcmVhdGVJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50KSB7Ci0JCQkJcmV0dXJuIG5ldyBEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKHBhcmVudCwgbmV3IEhUTUxUZXh0UHJlc2VudGVyKHRydWUpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBwcmVzZW50ZXIgcmVhZHkgdG8gYmUgdXNlZCB3aXRoIHRoZSBnaXZlbgotCSAqIHNvdXJjZSB2aWV3ZXIuCi0JICogPHA+Ci0JICogQ2xpZW50cyBjYW5ub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIEluc3RlYWQsIGNsaWVudHMgd2FudGluZyB0byBhZGQKLQkgKiB0aGVpciBvd24gaW5mb3JtYXRpb24gcHJvdmlkZXJzIHNob3VsZCBvdmVycmlkZQotCSAqIDxjb2RlPmdldEluZm9ybWF0aW9uUHJvdmlkZXIoSVNvdXJjZVZpZXdlciwgU3RyaW5nKTwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgY29udGVudCBhc3Npc3RhbnQKLQkgKiBAc2VlICNnZXRJbmZvcm1hdGlvblByb3ZpZGVyKElTb3VyY2VWaWV3ZXIsIFN0cmluZykKLQkgKi8KLQlmaW5hbCBwdWJsaWMgSUluZm9ybWF0aW9uUHJlc2VudGVyIGdldEluZm9ybWF0aW9uUHJlc2VudGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCUluZm9ybWF0aW9uUHJlc2VudGVyIHByZXNlbnRlciA9IG5ldyBJbmZvcm1hdGlvblByZXNlbnRlcihnZXRJbmZvcm1hdGlvblByZXNlbnRlckNvbnRyb2xDcmVhdG9yKHNvdXJjZVZpZXdlcikpOwotCi0JCS8vIGluZm9ybWF0aW9uIHByZXNlbnRlciBjb25maWd1cmF0aW9ucwotCQlwcmVzZW50ZXIuc2V0U2l6ZUNvbnN0cmFpbnRzKDYwLCAxMCwgdHJ1ZSwgdHJ1ZSk7Ci0JCXByZXNlbnRlci5zZXREb2N1bWVudFBhcnRpdGlvbmluZyhnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoc291cmNlVmlld2VyKSk7Ci0KLQkJLy8gYWRkIGluZm9ybWF0aW9uIHByb3ZpZGVycyBmb3IgZWFjaCBwYXJ0aXRpb24gdHlwZQotCQlTdHJpbmdbXSB0eXBlcyA9IGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHR5cGUgPSB0eXBlc1tpXTsKLQotCQkJSUluZm9ybWF0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRJbmZvcm1hdGlvblByb3ZpZGVyKHNvdXJjZVZpZXdlciwgdHlwZSk7Ci0JCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCXByZXNlbnRlci5zZXRJbmZvcm1hdGlvblByb3ZpZGVyKHByb3ZpZGVyLCB0eXBlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBwcmVzZW50ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZXIgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGluZm9ybWF0aW9uCi0JICogcHJlc2VudGF0aW9uIGluIHRoZSBnaXZlbiBzb3VyY2Ugdmlld2VyIGFuZCBmb3IgdGhlIGdpdmVuIHBhcnRpdGlvbgotCSAqIHR5cGUuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcGFydGl0aW9uVHlwZQotCSAqICAgICAgICAgICAgdGhlIHBhcnRpdGlvbiB0eXBlIGZvciB3aGljaCB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZXIgaXMKLQkgKiAgICAgICAgICAgIGFwcGxpY2FibGUKLQkgKiBAcmV0dXJuIElJbmZvcm1hdGlvblByb3ZpZGVyIG9yIG51bGwgaWYgc2hvdWxkIG5vdCBiZSBzdXBwb3J0ZWQKLQkgKiBAZGVwcmVjYXRlZCBpbnN0ZWFkIG9mIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBkb2N1bWVudGF0aW9uCi0JICogICAgICAgICAgICAgaW5mb3JtYXRpb24sIGFkb3B0ZXJzIHNob3VsZCB1c2UgdGhlCi0JICogICAgICAgICAgICAgPGNvZGU+ZG9jdW1lbnRhdGlvblRleHRIb3ZlcjwvY29kZT4gZWxlbWVudCBpbiB0aGUKLQkgKiAgICAgICAgICAgICA8Y29kZT5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXRvckNvbmZpZ3VyYXRpb248L2NvZGU+Ci0JICogICAgICAgICAgICAgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHJvdGVjdGVkIElJbmZvcm1hdGlvblByb3ZpZGVyIGdldEluZm9ybWF0aW9uUHJvdmlkZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUlUZXh0SG92ZXIgYmVzdE1hdGNoSG92ZXIgPSBuZXcgQmVzdE1hdGNoSG92ZXIoY3JlYXRlRG9jdW1lbnRhdGlvbkhvdmVycyhwYXJ0aXRpb25UeXBlKSk7Ci0JCXJldHVybiBuZXcgVGV4dEhvdmVySW5mb3JtYXRpb25Qcm92aWRlcihiZXN0TWF0Y2hIb3Zlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5mb3JtYXRpb24gcHJlc2VudGVyIGNvbnRyb2wgY3JlYXRvci4gVGhlIGNyZWF0b3IgaXMgYQotCSAqIGZhY3RvcnkgY3JlYXRpbmcgdGhlIHByZXNlbnRlciBjb250cm9scyBmb3IgdGhlIGdpdmVuIHNvdXJjZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGFuIGluZm9ybWF0aW9uIGNvbnRyb2wgY3JlYXRvcgotCSAqLwotCXByaXZhdGUgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgZ2V0SW5mb3JtYXRpb25QcmVzZW50ZXJDb250cm9sQ3JlYXRvcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlyZXR1cm4gbmV3IElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKCkgewotCQkJcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2wgY3JlYXRlSW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudCkgewotCQkJCWludCBzaGVsbFN0eWxlID0gU1dULlJFU0laRSB8IFNXVC5UT09MOwotCQkJCWludCBzdHlsZSA9IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTDsKLQkJCQlyZXR1cm4gbmV3IERlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2wocGFyZW50LCBzaGVsbFN0eWxlLCBzdHlsZSwgbmV3IEhUTUxUZXh0UHJlc2VudGVyKGZhbHNlKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGluZSBzdHlsZSBwcm92aWRlcnMgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHN5bnRheAotCSAqIGhpZ2hsaWdodGluZyBpbiB0aGUgZ2l2ZW4gc291cmNlIHZpZXdlci4KLQkgKiA8cD4KLQkgKiBOb3QgZnVsbHkgQVBJIHNpbmNlIHJldHVybiB0eXBlIExpbmVTdHlsZVByb3ZpZGVyIGlzIG5vdCBBUEkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJ0aXRpb24gdHlwZSBmb3Igd2hpY2ggdGhlIGxpbmVTdHlsZVByb3ZpZGVycyBhcmUKLQkgKiAgICAgICAgICAgIGFwcGxpY2FibGUKLQkgKiBAcmV0dXJuIExpbmVTdHlsZVByb3ZkZXJzIG9yIG51bGwgaWYgc2hvdWxkIG5vdCBiZSBzdXBwb3J0ZWQKLQkgKi8KLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNlZSA8Y29kZT5nZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciwgU3RyaW5nKTwvY29kZT4gZm9yCi0JICogYWx0ZXJuYXRpdmUgd2F5IHRvIHByb3ZpZGUgaGlnaGxpZ2h0aW5nIGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhbHdheXMgcmV0dXJucyBudWxsCi0JICogQHNlZSAjZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVByZXNlbnRhdGlvblJlY29uY2lsZXIgZ2V0UHJlc2VudGF0aW9uUmVjb25jaWxlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlTdHJ1Y3R1cmVkUHJlc2VudGF0aW9uUmVjb25jaWxlciByZWNvbmNpbGVyID0gbmV3IFN0cnVjdHVyZWRQcmVzZW50YXRpb25SZWNvbmNpbGVyKCk7Ci0JCXJlY29uY2lsZXIuc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHNvdXJjZVZpZXdlcikpOwotCQkKLQkJU3RyaW5nW10gY29udGVudFR5cGVzID0gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkKLQkJaWYoY29udGVudFR5cGVzICE9IG51bGwpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudERhbWFnZXJSZXBhaXJlciBkciA9IG51bGw7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZIaWdobGlnaHRlciAhPSBudWxsKSB7Ci0JCQkJCUxpbmVTdHlsZVByb3ZpZGVyIHByb3ZpZGVyID0gZkhpZ2hsaWdodGVyLmdldFByb3ZpZGVyKGNvbnRlbnRUeXBlc1tpXSk7Ci0JCQkJCWlmIChwcm92aWRlciA9PSBudWxsKQotCQkJCQkJY29udGludWU7Ci0JCQkJCQotCQkJCQlkciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnREYW1hZ2VyUmVwYWlyZXIocHJvdmlkZXIpOwotCQkJCQlkci5zZXREb2N1bWVudChzb3VyY2VWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJCXJlY29uY2lsZXIuc2V0RGFtYWdlcihkciwgY29udGVudFR5cGVzW2ldKTsKLQkJCQkJcmVjb25jaWxlci5zZXRSZXBhaXJlcihkciwgY29udGVudFR5cGVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiByZWNvbmNpbGVyOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24jZ2V0T3ZlcnZpZXdSdWxlckFubm90YXRpb25Ib3ZlcihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyKQotCSAqLwotCXB1YmxpYyBJQW5ub3RhdGlvbkhvdmVyIGdldE92ZXJ2aWV3UnVsZXJBbm5vdGF0aW9uSG92ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3Zlcih0cnVlKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luY2x1ZGVkKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQkJCXJldHVybiBpc1Nob3dJbk92ZXJ2aWV3UnVsZXIoYW5ub3RhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24jZ2V0UXVpY2tBc3Npc3RBc3Npc3RhbnQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSVF1aWNrQXNzaXN0QXNzaXN0YW50IGdldFF1aWNrQXNzaXN0QXNzaXN0YW50KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChmUXVpY2tBc3Npc3RhbnQgPT0gbnVsbCkgewotCQkJSVF1aWNrQXNzaXN0QXNzaXN0YW50IGFzc2lzdGFudCA9IG5ldyBRdWlja0Fzc2lzdEFzc2lzdGFudCgpOwotCQkJYXNzaXN0YW50LnNldFF1aWNrQXNzaXN0UHJvY2Vzc29yKG5ldyBDb21wb3VuZFF1aWNrQXNzaXN0UHJvY2Vzc29yKCkpOwotCQkJYXNzaXN0YW50LnNldEluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoZ2V0UXVpY2tBc3Npc3RBc3Npc3RhbnRJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKCkpOwotCi0JCQkvLyBXYWl0aW5nIGZvciBjb2xvciBwcmVmZXJlbmNlcywgc2VlOgotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMzczMQotCQkJLy8gc2V0IGNvbnRlbnQgYXNzaXN0IHByZWZlcmVuY2VzCi0JCQlpZiAoZlByZWZlcmVuY2VTdG9yZSAhPSBudWxsKSB7Ci0JCQkJQ29sb3IgY29sb3IgPSBnZXRDb2xvcihFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QUk9QT1NBTFNfQkFDS0dST1VORCk7Ci0JCQkJYXNzaXN0YW50LnNldFByb3Bvc2FsU2VsZWN0b3JCYWNrZ3JvdW5kKGNvbG9yKTsKLQotCQkJCWNvbG9yID0gZ2V0Q29sb3IoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfUFJPUE9TQUxTX0ZPUkVHUk9VTkQpOwotCQkJCWFzc2lzdGFudC5zZXRQcm9wb3NhbFNlbGVjdG9yRm9yZWdyb3VuZChjb2xvcik7Ci0JCQl9Ci0JCQlmUXVpY2tBc3Npc3RhbnQgPSBhc3Npc3RhbnQ7Ci0JCX0KLQkJcmV0dXJuIGZRdWlja0Fzc2lzdGFudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb250cm9sIGNyZWF0b3IgZm9yIHRoZSBxdWljayBhc3Npc3QgYXNzaXN0YW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGluZm9ybWF0aW9uIGNvbnRyb2wgY3JlYXRvcgotCSAqLwotCXByaXZhdGUgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgZ2V0UXVpY2tBc3Npc3RBc3Npc3RhbnRJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKCkgewotCQlyZXR1cm4gbmV3IElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKCkgewotCQkJcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2wgY3JlYXRlSW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudCkgewotCQkJCXJldHVybiBuZXcgRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChwYXJlbnQsIG5ldyBIVE1MVGV4dFByZXNlbnRlcih0cnVlKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVjb25jaWxlciByZWFkeSB0byBiZSB1c2VkIHdpdGggdGhlIGdpdmVuIHNvdXJjZSB2aWV3ZXIuPGJyIC8+Ci0JICogTm90ZTogVGhlIHNhbWUgaW5zdGFuY2Ugb2YgSVJlY29uY2lsZXIgaXMgcmV0dXJuZWQgcmVnYXJkbGVzcyBvZiB0aGUKLQkgKiBzb3VyY2Ugdmlld2VyIHBhc3NlZCBpbi4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIGNhbm5vdCBvdmVycmlkZSB0aGlzIG1ldGhvZC4gSW5zdGVhZCwgY2xpZW50cyB3YW50aW5nIHRvIGFkZAotCSAqIHRoZWlyIG93biByZWNvbmNpbGluZyBzdHJhdGVneSBzaG91bGQgdXNlIHRoZQotCSAqIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9ucy5zb3VyY2V2YWxpZGF0aW9uPC9jb2RlPgotCSAqIGV4dGVuc2lvbiBwb2ludC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgcmVjb25jaWxlcgotCSAqLwotCWZpbmFsIHB1YmxpYyBJUmVjb25jaWxlciBnZXRSZWNvbmNpbGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCUlSZWNvbmNpbGVyIHJlY29uY2lsZXIgPSBudWxsOwotCQkKLQkJaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQkvL09ubHkgY3JlYXRlIHJlY29uY2lsZXIgaWYgc291cmNlVmlld2VyIGlzIHByZXNlbnQKLQkJCWlmIChmUmVjb25jaWxlciA9PSBudWxsICYmIHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQkJU3RydWN0dXJlZFJlZ2lvblByb2Nlc3NvciBuZXdSZWNvbmNpbGVyID0gbmV3IFN0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3IoKTsKLQkKLQkJCQkvLyByZWNvbmNpbGVyIGNvbmZpZ3VyYXRpb25zCi0JCQkJbmV3UmVjb25jaWxlci5zZXREb2N1bWVudFBhcnRpdGlvbmluZyhnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoc291cmNlVmlld2VyKSk7Ci0JCi0JCQkJZlJlY29uY2lsZXIgPSBuZXdSZWNvbmNpbGVyOwotCQkJfQotCQkJcmVjb25jaWxlciA9IGZSZWNvbmNpbGVyOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVjb25jaWxlcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICogQHBhcmFtIHRyZWVWaWV3ZXIKLQkgKiBAcmV0dXJuIGEgbGFiZWwgcHJvdmlkZXIgcHJvdmlkaW5nIHRoZSBzdGF0dXMgbGluZSBjb250ZW50cwotCSAqLwotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRTdGF0dXNMaW5lTGFiZWxQcm92aWRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZG9jdW1lbnRhdGlvbiBob3ZlcnMgYmFzZWQgb24gaG92ZXJzIGNvbnRyaWJ1dGVkIHZpYQotCSAqIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbjwvY29kZT4gZXh0ZW5zaW9uCi0JICogcG9pbnQKLQkgKiAKLQkgKiBAcGFyYW0gcGFydGl0aW9uVHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElUZXh0SG92ZXJbXSBjcmVhdGVEb2N1bWVudGF0aW9uSG92ZXJzKFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUxpc3QgZXh0ZW5kZWRUZXh0SG92ZXIgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbnMoRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5ET0NVTUVOVEFUSU9OVEVYVEhPVkVSLCBwYXJ0aXRpb25UeXBlKTsKLQkJSVRleHRIb3ZlcltdIGhvdmVycyA9IChJVGV4dEhvdmVyW10pIGV4dGVuZGVkVGV4dEhvdmVyLnRvQXJyYXkobmV3IElUZXh0SG92ZXJbZXh0ZW5kZWRUZXh0SG92ZXIuc2l6ZSgpXSk7Ci0JCXJldHVybiBob3ZlcnM7Ci0JfQotCi0JcHVibGljIElUZXh0SG92ZXIgZ2V0VGV4dEhvdmVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUsIGludCBzdGF0ZU1hc2spIHsKLQkJSVRleHRIb3ZlciB0ZXh0SG92ZXIgPSBudWxsOwotCi0JCS8qCi0JCSAqIFJldHVybnMgYSBkZWZhdWx0IHByb2JsZW0sIGFubm90YXRpb24sIGFuZCBiZXN0IG1hdGNoIGhvdmVyCi0JCSAqIGRlcGVuZGluZyBvbiBzdGF0ZU1hc2sKLQkJICovCi0JCVRleHRIb3Zlck1hbmFnZXIuVGV4dEhvdmVyRGVzY3JpcHRvcltdIGhvdmVyRGVzY3MgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGV4dEhvdmVyTWFuYWdlcigpLmdldFRleHRIb3ZlcnMoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IGhvdmVyRGVzY3MubGVuZ3RoICYmIHRleHRIb3ZlciA9PSBudWxsKSB7Ci0JCQlpZiAoaG92ZXJEZXNjc1tpXS5pc0VuYWJsZWQoKSAmJiBjb21wdXRlU3RhdGVNYXNrKGhvdmVyRGVzY3NbaV0uZ2V0TW9kaWZpZXJTdHJpbmcoKSkgPT0gc3RhdGVNYXNrKSB7Ci0JCQkJU3RyaW5nIGhvdmVyVHlwZSA9IGhvdmVyRGVzY3NbaV0uZ2V0SWQoKTsKLQkJCQlpZiAoVGV4dEhvdmVyTWFuYWdlci5QUk9CTEVNX0hPVkVSLmVxdWFsc0lnbm9yZUNhc2UoaG92ZXJUeXBlKSkKLQkJCQkJdGV4dEhvdmVyID0gbmV3IFByb2JsZW1Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IoKTsKLQkJCQllbHNlIGlmIChUZXh0SG92ZXJNYW5hZ2VyLkFOTk9UQVRJT05fSE9WRVIuZXF1YWxzSWdub3JlQ2FzZShob3ZlclR5cGUpKQotCQkJCQl0ZXh0SG92ZXIgPSBuZXcgQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yKCk7Ci0JCQkJZWxzZSBpZiAoVGV4dEhvdmVyTWFuYWdlci5DT01CSU5BVElPTl9IT1ZFUi5lcXVhbHNJZ25vcmVDYXNlKGhvdmVyVHlwZSkpCi0JCQkJCXRleHRIb3ZlciA9IG5ldyBCZXN0TWF0Y2hIb3ZlcihjcmVhdGVEb2N1bWVudGF0aW9uSG92ZXJzKGNvbnRlbnRUeXBlKSk7Ci0JCQkJZWxzZSBpZiAoVGV4dEhvdmVyTWFuYWdlci5ET0NVTUVOVEFUSU9OX0hPVkVSLmVxdWFsc0lnbm9yZUNhc2UoaG92ZXJUeXBlKSkgewotCQkJCQlJVGV4dEhvdmVyW10gaG92ZXJzID0gY3JlYXRlRG9jdW1lbnRhdGlvbkhvdmVycyhjb250ZW50VHlwZSk7Ci0JCQkJCWlmIChob3ZlcnMubGVuZ3RoID4gMCkgewotCQkJCQkJdGV4dEhvdmVyID0gaG92ZXJzWzBdOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaSsrOwotCQl9Ci0JCXJldHVybiB0ZXh0SG92ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdW5kbyBtYW5hZ2VyIGZvciB0aGUgZ2l2ZW4gc291cmNlIHZpZXdlci48YnIgLz4KLQkgKiBOb3RlOiBDbGllbnRzIGNhbm5vdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBiZWNhdXNlIHRoaXMgbWV0aG9kIHJldHVybnMgYQotCSAqIHNwZWNpYWxseSBjb25maWd1cmVkIHVuZG8gbWFuYWdlciBmb3IgdGhlIFN0cnVjdHVyZWRUZXh0Vmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhbiB1bmRvIG1hbmFnZXIgc3BlY2lhbGx5IGNvbmZpZ3VyZWQgZm9yIFN0cnVjdHVyZWRUZXh0Vmlld2VyCi0JICovCi0JZmluYWwgcHVibGljIElVbmRvTWFuYWdlciBnZXRVbmRvTWFuYWdlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkvKgotCQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgYW4gVW5kb01hbmFnZXIgdGhhdCBpcyB1c2VkIGV4Y2x1c2l2ZWx5Ci0JCSAqIGluIFN0cnVjdHVyZWRUZXh0Vmlld2VyCi0JCSAqLwotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyVW5kb01hbmFnZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SGlnaGxpZ2h0ZXIoUmVjb25jaWxlckhpZ2hsaWdodGVyIGhpZ2hsaWdodGVyKSB7Ci0JCWZIaWdobGlnaHRlciA9IGhpZ2hsaWdodGVyOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBhc3NvY2lhdGVkIGNvbnRlbnQgYXNzaXN0bmF0Ci0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWRDb250ZW50QXNzaXN0YW50IGdldENvbnRlbnRBc3Npc3RhbnQoKSB7Ci0JCXJldHVybiB0aGlzLmZDb250ZW50QXNzaXN0YW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlclVuZG9NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJVbmRvTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTY0YmM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlclVuZG9NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLQotCi0vKioKLSAqIFVuZG8gbWFuYWdlciBleGNsdXNpdmVseSBmb3IgU3RydWN0dXJlZFRleHRWaWV3ZXJzIE9OTFkuIFRoaXMgdW5kbyBtYW5hZ2VyCi0gKiBpcyBhd2FyZSB0aGF0IHN0cnVjdHVyZWQgZG9jdW1lbnRzIGhhdmUgdGhlaXIgb3duIHVuZG8gbWFuYWdlci4gVGhpcwotICogaGFuZGxlcyBjb21tdW5pY2F0aW9uIGJldHdlZW4gSVVuZG9NYW5hZ2VyIGFuZCBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlci4KLSAqLwotY2xhc3MgU3RydWN0dXJlZFRleHRWaWV3ZXJVbmRvTWFuYWdlciBpbXBsZW1lbnRzIElVbmRvTWFuYWdlciB7Ci0JY2xhc3MgVW5kb05vdGlmaWVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoKGZVbmRvTWFuYWdlciAhPSBudWxsKSAmJiAoZXZlbnQgIT0gbnVsbCkpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCQlmVW5kb01hbmFnZXIuZm9yY2VFbmRPZlBlbmRpbmdDb21tYW5kKHRoaXMsICgoSVRleHRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRPZmZzZXQoKSwgKChJVGV4dFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldExlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXIgZlRleHRWaWV3ZXIgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgZlVuZG9NYW5hZ2VyID0gbnVsbDsKLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZlVuZG9Ob3RpZmllciA9IG5ldyBVbmRvTm90aWZpZXIoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXIjYmVnaW5Db21wb3VuZENoYW5nZSgpCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5Db21wb3VuZENoYW5nZSgpIHsKLQkJLy8gZm9yd2FyZCB0aGUgcmVxdWVzdCB0byB0aGUgbW9kZWwtYmFzZWQgdW5kbyBtYW5hZ2VyCi0JCWlmIChmVW5kb01hbmFnZXIgIT0gbnVsbCkKLQkJCWZVbmRvTWFuYWdlci5iZWdpblJlY29yZGluZyhmVGV4dFZpZXdlcik7Ci0JfQotCi0JLyoqCi0JICogQXNzb2NpYXRlcyBhIHZpZXdlciB0byB0aGlzIHVuZG8gbWFuYWdlciBhbmQgYWxzbyBhdHRlbXB0cyB0byBnZXQgdGhlCi0JICogY29ycmVjdCBkb2N1bWVudC1zcGVjaWZpYyB1bmRvIG1hbmFnZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlciAtCi0JICogICAgICAgICAgICBBc3N1bWVzIHZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdChJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gZnV0dXJlX1RPRE8gY291bGQgcHJvYmFibHkgb3B0aW1pemUgdGhpcyB0byBjaGVjayBpZiBhbHJlYWR5Ci0JCS8vIGNvbm5lY3RlZCB0byBzYW1lIHZpZXdlci91bmRvIG1hbmFnZXIsIGRvbnQgZG8gYW55dGhpbmcKLQotCQkvLyBkaXNjb25uZWN0IGZyb20gYW55IG9sZCBtYW5hZ2VyL3ZpZXdlcgotCQlkaXNjb25uZWN0KCk7Ci0KLQkJLy8gY29ubmVjdCB0byBuZXcgdmlld2VyL3VuZG8gbWFuYWdlcgotCQlmVGV4dFZpZXdlciA9IChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyOwotCQlJRG9jdW1lbnQgZG9jID0gZlRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvYzsKLQkJCXNldERvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVVuZG9NYW5hZ2VyI2Rpc2Nvbm5lY3QoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0JCS8vIGRpc2Nvbm5lY3QgdGhlIHZpZXdlciBmcm9tIHRoZSB1bmRvIG1hbmFnZXIKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmVGV4dFZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlVuZG9Ob3RpZmllcik7Ci0JCQlmVW5kb01hbmFnZXIuZGlzY29ubmVjdChmVGV4dFZpZXdlcik7Ci0JCX0KLQotCQkvLyBudWxsIG91dCB0aGUgdmlld2VyIGFuZCB1bmRvIG1hbmFnZXIKLQkJZlRleHRWaWV3ZXIgPSBudWxsOwotCQlmVW5kb01hbmFnZXIgPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXIjZW5kQ29tcG91bmRDaGFuZ2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZENvbXBvdW5kQ2hhbmdlKCkgewotCQkvLyBmb3J3YXJkIHRoZSByZXF1ZXN0IHRvIHRoZSBtb2RlbC1iYXNlZCB1bmRvIG1hbmFnZXIKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKQotCQkJZlVuZG9NYW5hZ2VyLmVuZFJlY29yZGluZyhmVGV4dFZpZXdlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklVbmRvTWFuYWdlciNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQkvLyBmb3J3YXJkIHRoZSByZXF1ZXN0IHRvIHRoZSBtb2RlbC1iYXNlZCB1bmRvIG1hbmFnZXIKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKQotCQkJZlVuZG9NYW5hZ2VyLnJlZG8oZlRleHRWaWV3ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXIjcmVkb2FibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZG9hYmxlKCkgewotCQlib29sZWFuIGNhblJlZG8gPSBmYWxzZTsKLQotCQkvLyBmb3J3YXJkIHRoZSByZXF1ZXN0IHRvIHRoZSBtb2RlbC1iYXNlZCB1bmRvIG1hbmFnZXIKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKQotCQkJY2FuUmVkbyA9IGZVbmRvTWFuYWdlci5yZWRvYWJsZSgpOwotCi0JCXJldHVybiBjYW5SZWRvOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXIjcmVzZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQkvLyBjYW5ub3QgcmVhbGx5IHJlc2V0IG1vZGVsLWJhc2VkIHVuZG8gbWFuYWdlciBiZWNhdXNlIG90aGVyIGNsaWVudHMKLQkJLy8gd2lsbCBiZSBhZmZlY3RlZAotCX0KLQotCS8qKgotCSAqIERpc2Nvbm5lY3QgZnJvbSB0aGUgb2xkIHVuZG8gbWFuYWdlciBhbmQgY29ubmVjdCB0byB0aGUgdW5kbyBtYW5hZ2VyCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgZG9jdW1lbnQgaXMgbm90IG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChmVW5kb01hbmFnZXIgIT0gbnVsbCkgewotCQkJZlRleHRWaWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZVbmRvTm90aWZpZXIpOwotCQkJZlVuZG9NYW5hZ2VyLmRpc2Nvbm5lY3QoZlRleHRWaWV3ZXIpOwotCQl9Ci0KLQkJZlVuZG9NYW5hZ2VyID0gZG9jdW1lbnQuZ2V0VW5kb01hbmFnZXIoKTsKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmVW5kb01hbmFnZXIuY29ubmVjdChmVGV4dFZpZXdlcik7Ci0JCQlmVGV4dFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlVuZG9Ob3RpZmllcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVVuZG9NYW5hZ2VyI3NldE1heGltYWxVbmRvTGV2ZWwoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heGltYWxVbmRvTGV2ZWwoaW50IHVuZG9MZXZlbCkgewotCQkvLyBjYW5ub3QgcmVhbGx5IHNldCBtYXhpbWFsIHVuZG8gbGV2ZWwgb24gbW9kZWwtYmFzZWQgdW5kbyBtYW5hZ2VyCi0JCS8vIGJlY2F1c2Ugb3RoZXIgY2xpZW50cyB3aWxsIGJlIGFmZmVjdGVkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklVbmRvTWFuYWdlciN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkvLyBmb3J3YXJkIHRoZSByZXF1ZXN0IHRvIHRoZSBtb2RlbC1iYXNlZCB1bmRvIG1hbmFnZXIKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKQotCQkJZlVuZG9NYW5hZ2VyLnVuZG8oZlRleHRWaWV3ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXIjdW5kb2FibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVuZG9hYmxlKCkgewotCQlib29sZWFuIGNhblVuZG8gPSBmYWxzZTsKLQotCQkvLyBmb3J3YXJkIHRoZSByZXF1ZXN0IHRvIHRoZSBtb2RlbC1iYXNlZCB1bmRvIG1hbmFnZXIKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKQotCQkJY2FuVW5kbyA9IGZVbmRvTWFuYWdlci51bmRvYWJsZSgpOwotCi0JCXJldHVybiBjYW5VbmRvOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9UZXh0SG92ZXJJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvVGV4dEhvdmVySW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmUyYzFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9UZXh0SG92ZXJJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbjI7Ci0KLWNsYXNzIFRleHRIb3ZlckluZm9ybWF0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJSW5mb3JtYXRpb25Qcm92aWRlciwgSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb24sIElJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uMiB7Ci0JcHJpdmF0ZSBJVGV4dEhvdmVyIGZUZXh0SG92ZXI7Ci0KLQlwdWJsaWMgVGV4dEhvdmVySW5mb3JtYXRpb25Qcm92aWRlcihJVGV4dEhvdmVyIGhvdmVyKSB7Ci0JCWZUZXh0SG92ZXIgPSBob3ZlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0SW5mb3JtYXRpb24yKHRleHRWaWV3ZXIsIHN1YmplY3QpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24yKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlckluZm8odGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCi0JcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGdldEluZm9ybWF0aW9uUHJlc2VudGVyQ29udHJvbENyZWF0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldFN1YmplY3QoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlclJlZ2lvbih0ZXh0Vmlld2VyLCBvZmZzZXQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9jb250ZW50YXNzaXN0L0NvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvY29udGVudGFzc2lzdC9Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWMyZjBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9jb250ZW50YXNzaXN0L0NvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogPHA+SGVscGZ1bCBjbGFzcyBmb3IgcGFzc2luZyBhcm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGludm9jYXRpb24gY29udGV4dAotICogb2YgYSBjb250ZW50IGFzc2lzdCByZXF1ZXN0PC9wPgotICogCi0gKiBAYmFzZSBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLkNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dAotICovCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgewotCS8qKiB0aGUgdmlld2VyIHRoYXQgd2FzIHVzZWQgdG8gaW52b2tlIGNvbnRlbnQgYXNzaXN0ICovCi0JcHJpdmF0ZSBmaW5hbCBJVGV4dFZpZXdlciBmVmlld2VyOwotCQotCS8qKiB0aGUgY2hhcmFjdGVyIG9mZnNldCB3aGVyZSBjb250ZW50IGFzc2lzdCB3YXMgaW52b2tlZCBpbiB0aGUgdmlld2VyICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgZkludm9jYXRpb25PZmZzZXQ7Ci0JCi0JLyoqIHRoZSBwYXJ0aXRpb24gdHlwZSB3aGVyZSBjb250ZW50IGFzc2lzdCB3YXMgaW52b2tlZCAqLwotCXByaXZhdGUgU3RyaW5nIGZQYXJ0aXRpb25UeXBlOwotCQotCS8qKgotCSAqIDxwPkNyZWF0ZSBhIG5ldyBjb250ZXh0PC9wPgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIge0BsaW5rIElUZXh0Vmlld2VyfSB0aGF0IHdhcyB1c2VkIHRvIGludm9rZSBjb250ZW50IGFzc2lzdAotCSAqIEBwYXJhbSBpbnZvY2F0aW9uT2Zmc2V0IGNoYXJhY3RlciBvZmZzZXQgd2hlcmUgY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQgaW4gdGhlIHZpZXdlcgotCSAqLwotCXB1YmxpYyBDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dChJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBpbnZvY2F0aW9uT2Zmc2V0KSB7Ci0JCWZWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWZJbnZvY2F0aW9uT2Zmc2V0ID0gaW52b2NhdGlvbk9mZnNldDsKLQkJZlBhcnRpdGlvblR5cGUgPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHtAbGluayBJRG9jdW1lbnR9IHRoYXQgY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQgb24KLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZlZpZXdlci5nZXREb2N1bWVudCgpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHtAbGluayBJVGV4dFZpZXdlcn0gdGhhdCB3YXMgdXNlZCB0byBpbnZva2UgY29udGVudCBhc3Npc3QKLQkgKi8KLQlwdWJsaWMgSVRleHRWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gZlZpZXdlcjsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiBjaGFyYWN0ZXIgb2Zmc2V0IHdoZXJlIGNvbnRlbnQgYXNzaXN0IHdhcyBpbnZva2VkIGluIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludm9jYXRpb25PZmZzZXQoKSB7Ci0JCXJldHVybiBmSW52b2NhdGlvbk9mZnNldDsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgcGFydGl0aW9uIHR5cGUgd2hlcmUgY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEludm9jYXRpb25QYXJ0aXRpb25UeXBlKCkgewotCQlpZihmUGFydGl0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQlmUGFydGl0aW9uVHlwZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCWZQYXJ0aXRpb25UeXBlID0gdGhpcy5nZXREb2N1bWVudCgpLmdldFBhcnRpdGlvbih0aGlzLmZJbnZvY2F0aW9uT2Zmc2V0KS5nZXRUeXBlKCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiwgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgaXQgaWYgaXQgZG9lcwotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkNvdWxkIG5vdCBnZXQgdGhlIHBhcnRpdGlvbiB0eXBlIGF0IGNvbnRlbnQgYXNzaXN0IGludm9jYXRpb24gb2Zmc2V0IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlBhcnRpdGlvblR5cGU7Ci0JfQotCQotCS8qKgotCSAqIDxwPkludm9jYXRpb24gY29udGV4dHMgYXJlIGVxdWFsIGlmIHRoZXkgZGVzY3JpYmUgdGhlIHNhbWUgY29udGV4dCBhbmQgYXJlIG9mIHRoZSBzYW1lIHR5cGUuCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjaGVja3MgZm9yIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlcyBhbmQgY2xhc3MgZXF1YWxpdHkuIFN1YmNsYXNzZXMKLQkgKiBzaG91bGQgZXh0ZW5kIHRoaXMgbWV0aG9kIGJ5IGFkZGluZyBjaGVja3MgZm9yIHRoZWlyIGNvbnRleHQgcmVsZXZhbnQgZmllbGRzIChidXQgbm90Ci0JICogbmVjZXNzYXJpbHkgY2FjaGVkIHZhbHVlcykuPC9wPgotCSAqIDxwPgotCSAqIEV4YW1wbGU6Ci0JICoKLQkgKiA8cHJlPgotCSAqIGNsYXNzIE15Q29udGV4dCBleHRlbmRzIENvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCB7Ci0JICogCXByaXZhdGUgZmluYWwgT2JqZWN0IGZTdGF0ZTsKLQkgKiAJcHJpdmF0ZSBPYmplY3QgZkNhY2hlZEluZm87Ci0JICoKLQkgKiAJLi4uCi0JICoKLQkgKiAJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkgKiAJCWlmICghc3VwZXIuZXF1YWxzKG9iaikpCi0JICogCQkJcmV0dXJuIGZhbHNlOwotCSAqIAkJTXlDb250ZXh0IG90aGVyPSAoTXlDb250ZXh0KSBvYmo7Ci0JICogCQlyZXR1cm4gZlN0YXRlLmVxdWFscyhvdGhlci5mU3RhdGUpOwotCSAqIAl9Ci0JICogfQotCSAqIDwvcHJlPgotCSAqCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIGFsc28gZXh0ZW5kIHtAbGluayBPYmplY3QjaGFzaENvZGUoKX0uCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIG9iaiB7QGluaGVyaXREb2N9Ci0JICogQHJldHVybiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJYm9vbGVhbiBlcXVhbCA9IGZhbHNlOwotCQlpZihvYmogaW5zdGFuY2VvZiBDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCkgewotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgb3RoZXIgPSAoQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQpIG9iajsKLQkJCWVxdWFsID0gKGZWaWV3ZXIgPT0gbnVsbCAmJiBvdGhlci5mVmlld2VyID09IG51bGwgfHwgZlZpZXdlciAhPSBudWxsICYmIGZWaWV3ZXIuZXF1YWxzKG90aGVyLmZWaWV3ZXIpKSAmJgotCQkJCQlmSW52b2NhdGlvbk9mZnNldCA9PSBvdGhlci5mSW52b2NhdGlvbk9mZnNldDsKLQkJfQotCQlyZXR1cm4gZXF1YWw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gMjM0NTkyMTMgPDwgNSB8IChmVmlld2VyID09IG51bGwgPyAwIDogZlZpZXdlci5oYXNoQ29kZSgpIDw8IDMpIHwgZkludm9jYXRpb25PZmZzZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2NvbnRlbnRhc3Npc3QvSUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvY29udGVudGFzc2lzdC9JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRmNjA4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvY29udGVudGFzc2lzdC9JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiA8cD5Db21wdXRlcyBjb21wbGV0aW9ucyBhbmQgY29udGV4dCBpbmZvcm1hdGlvbiBkaXNwbGF5ZWQgYnkgdGhlIFNTRSBlZGl0b3IgY29udGVudCBhc3Npc3RhbnQuCi0gKiBDb250cmlidXRpb25zIHRvIHRoZSA8dHQ+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21wbGV0aW9uUHJvcG9zYWw8L3R0PiBleHRlbnNpb24gcG9pbnQKLSAqIG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLjwvcD4KLSAqIAotICogQGJhc2Ugb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIHsKLQkvKioKLQkgKiBJbmZvcm1zIHRoZSBjb21wdXRlciB0aGF0IGEgY29udGVudCBhc3Npc3Qgc2Vzc2lvbiBoYXMgc3RhcnRlZC4gVGhpcyBjYWxsIHdpbGwgYWx3YXlzIGJlCi0JICogZm9sbG93ZWQgYnkgYSB7QGxpbmsgI3Nlc3Npb25FbmRlZCgpfSBjYWxsLCBidXQgbm90IG5lY2Vzc2FyaWx5IGJ5IGNhbGxzIHRvCi0JICoge0BsaW5rICNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCwgSVByb2dyZXNzTW9uaXRvcikgY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHN9Ci0JICogb3IKLQkgKiB7QGxpbmsgI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQsIElQcm9ncmVzc01vbml0b3IpIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb259LgotCSAqLwotCXZvaWQgc2Vzc2lvblN0YXJ0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzIHZhbGlkIGF0IHRoZSBnaXZlbiBpbnZvY2F0aW9uIGNvbnRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBvZiB0aGUgY29udGVudCBhc3Npc3QgaW52b2NhdGlvbgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciB0byByZXBvcnQgcHJvZ3Jlc3MuIFRoZSBtb25pdG9yIGlzIHByaXZhdGUgdG8gdGhpcwotCSAqICAgICAgICBpbnZvY2F0aW9uLCBpLmUuIHRoZXJlIGlzIG5vIG5lZWQgZm9yIHRoZSByZWNlaXZlciB0byBzcGF3biBhIHN1YiBtb25pdG9yLgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzIChlbGVtZW50IHR5cGU6IHtAbGluayBJQ29tcGxldGlvblByb3Bvc2FsfSkKLQkgKi8KLQlMaXN0IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKENvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbnRleHQgaW5mb3JtYXRpb24gb2JqZWN0cyB2YWxpZCBhdCB0aGUgZ2l2ZW4gaW52b2NhdGlvbiBjb250ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgb2YgdGhlIGNvbnRlbnQgYXNzaXN0IGludm9jYXRpb24KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IgdG8gcmVwb3J0IHByb2dyZXNzLiBUaGUgbW9uaXRvciBpcyBwcml2YXRlIHRvIHRoaXMKLQkgKiAgICAgICAgaW52b2NhdGlvbiwgaS5lLiB0aGVyZSBpcyBubyBuZWVkIGZvciB0aGUgcmVjZWl2ZXIgdG8gc3Bhd24gYSBzdWIgbW9uaXRvci4KLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBjb250ZXh0IGluZm9ybWF0aW9uIG9iamVjdHMgKGVsZW1lbnQgdHlwZToge0BsaW5rIElDb250ZXh0SW5mb3JtYXRpb259KQotCSAqLwotCUxpc3QgY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVhc29uIHdoeSB0aGlzIGNvbXB1dGVyIHdhcyB1bmFibGUgdG8gcHJvZHVjZSBhbnkgY29tcGxldGlvbiBwcm9wb3NhbHMgb3IKLQkgKiBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqCi0JICogQHJldHVybiBhbiBlcnJvciBtZXNzYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGVycm9yIG9jY3VycmVkCi0JICovCi0JU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpOwotCi0JLyoqCi0JICogSW5mb3JtcyB0aGUgY29tcHV0ZXIgdGhhdCBhIGNvbnRlbnQgYXNzaXN0IHNlc3Npb24gaGFzIGVuZGVkLiBUaGlzIGNhbGwgd2lsbCBhbHdheXMgYmUgYWZ0ZXIKLQkgKiBhbnkgY2FsbHMgdG8KLQkgKiB7QGxpbmtwbGFpbiAjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQsIElQcm9ncmVzc01vbml0b3IpIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzfQotCSAqIGFuZAotCSAqIHtAbGlua3BsYWluICNjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKENvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yKSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9ufS4KLQkgKi8KLQl2b2lkIHNlc3Npb25FbmRlZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2NvbnRlbnRhc3Npc3QvU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9jb250ZW50YXNzaXN0L1N0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNjI5ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2NvbnRlbnRhc3Npc3QvU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkxlZ2FjeUFjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLlRyaWdnZXJTZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLktleVNlcXVlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25MaXN0ZW5lckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0YW50RXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmtleXMuSUJpbmRpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5FeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxDb21wdXRlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zb2FsQ2F0aWdvcmllc0NvbmZpZ3VyYXRpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Lk9wdGlvbmFsTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLklDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvblJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLklDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlcjsKLQotCi0vKioKLSAqIDxwPkEgY29udGVudCBhc3Npc3QgcHJvY2Vzc29yIHRoYXQgYWdncmVnYXRlcyB0aGUgcHJvcG9zYWxzIG9mIHRoZQotICoge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJ9cyBjb250cmlidXRlZCB2aWEgdGhlCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbXBsZXRpb25Qcm9wb3NhbDwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LjwvcD4KLSAqIDxwPgotICogRXh0ZW5kZXJzIG1heSBleHRlbmQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rICNwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50KX10byByZWFjdCB0byBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzCi0gKiB0aGF0IG9jY3VyIGluIHRoZSB7QGxpbmsgSVByZWZlcmVuY2VTdG9yZX0gZ2l2ZW4gdG8gdGhlIGNvbnN0cnVjdG9yIGluIGNhc2UgdGhlIGJlaGF2aW9yCi0gKiBvZiB0aGUgcHJvY2Vzc29yIG5lZWRzIHRvIGNoYW5nZSBhY2NvcmRpbmcgdG8gdXNlciBwcmVmZXJlbmNlczwvbGk+Ci0gKiA8bGk+e0BsaW5rICNnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKX08L2xpPgotICogPGxpPntAbGluayAjZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCl9PC9saT4KLSAqIDxsaT57QGxpbmsgI2ZpbHRlckFuZFNvcnRQcm9wb3NhbHMoTGlzdCwgSVByb2dyZXNzTW9uaXRvciwgQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQpfQotICogdG8gYWRkIHNvcnRpbmcgYW5kIGZpbHRlcmluZzwvbGk+Ci0gKiA8bGk+e0BsaW5rICNmaWx0ZXJBbmRTb3J0Q29udGV4dEluZm9ybWF0aW9uKExpc3QsIElQcm9ncmVzc01vbml0b3IpfSB0byBhZGQgc29ydGluZyBhbmQgZmlsdGVyaW5nPC9saT4KLSAqIDxsaT57QGxpbmsgI2NyZWF0ZVByb2dyZXNzTW9uaXRvcigpfSB0byBjaGFuZ2UgdGhlIHdheSBwcm9ncmVzcyBpcyByZXBvcnRlZDwvbGk+Ci0gKiA8bGk+e0BsaW5rICNjcmVhdGVDb250ZXh0KElUZXh0Vmlld2VyLCBpbnQpfSB0byBwcm92aWRlIHRoZSBjb250ZXh0IG9iamVjdAotICogcGFzc2VkIHRvIHRoZSBjb21wdXRlcnM8L2xpPgotICogPGxpPntAbGluayAjZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCl9IHRvIGFkZCBjb250ZXh0IHZhbGlkYXRpb24gKG5lZWRlZCBpZiBhbnkKLSAqIGNvbnRleHRzIGFyZSBwcm92aWRlZCk8L2xpPgotICogPGxpPntAbGluayAjZ2V0RXJyb3JNZXNzYWdlKCl9IHRvIGNoYW5nZSBlcnJvciByZXBvcnRpbmc8L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQGJhc2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuamF2YS5Db250ZW50QXNzaXN0UHJvY2Vzc29yCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElDb250ZW50QXNzaXN0UHJvY2Vzc29yLCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgSVJlbGVhc2FibGUgewotCi0JLyoqIExlZ2FjeSBlZGl0b3IgY29uZmlndXJhdGlvbiBleHRlbnNpb24gcG9pbnQuICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfQVNTSVNUX1BST0NFU1NPUl9FWFRFTkRFRF9JRCA9ICJjb250ZW50YXNzaXN0cHJvY2Vzc29yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIENvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMgYWRkZWQgdGhyb3VnaCB0aGUgbm93IGxlZ2FjeSBlZGl0b3IgY29uZmlndXJhdGlvbiBleHRlbnNpb24gcG9pbnQgKi8KLQlwcml2YXRlIExpc3QgZkxlZ2FjeUV4dGVuZGVkQ29udGVudEFzc2lzdFByb2Nlc3NvcnM7Ci0JCi0JLyoqCi0JICogRGlhbG9nIHNldHRpbmdzIGtleSBmb3IgdGhlICJhbGwgY2F0ZWdvcmllcyBhcmUgZGlzYWJsZWQiIHdhcm5pbmcgZGlhbG9nLiBTZWUKLQkgKiB7QGxpbmsgT3B0aW9uYWxNZXNzYWdlRGlhbG9nfS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9XQVJOX0FCT1VUX0VNUFRZX0FTU0lTVF9DQVRFR09SWT0gIkVtcHR5RGVmYXVsdEFzc2lzdENhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVXNlZCB0byBzb3J0IGNhdGVnb3JpZXMgYnkgdGhlaXIgcGFnZSBvcmRlciBzbyB0aGV5IGFyZSBjeWNsZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbXBhcmF0b3IgUEFHRV9PUkRFUl9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnkgZDE9IChDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeSkgbzE7Ci0JCQlDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeSBkMj0gKENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5KSBvMjsKLQotCQkJcmV0dXJuIGQxLmdldFBhZ2VTb3J0UmFuayhmQ29udGVudFR5cGVJRCkgLSBkMi5nZXRQYWdlU29ydFJhbmsoZkNvbnRlbnRUeXBlSUQpOwotCQl9Ci0JfTsKLQkKLQkvKioKLQkgKiBVc2VkIHRvIHNvcnQgY2F0ZWdvcmllcyBieSB0aGVpciBkZWZhdWx0IHBhZ2Ugb3JkZXIgc28gdGhleSBhcmUKLQkgKiBvcmRlcmVkIGNvcnJlY3RseSBvbiB0aGUgZGVmYXVsdCBwYWdlCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yIERFRkFVTFRfUEFHRV9PUkRFUl9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnkgZDE9IChDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeSkgbzE7Ci0JCQlDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeSBkMj0gKENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5KSBvMjsKLQotCQkJcmV0dXJuIGQxLmdldERlZmF1bHRQYWdlU29ydFJhbmsoZkNvbnRlbnRUeXBlSUQpIC0gZDIuZ2V0RGVmYXVsdFBhZ2VTb3J0UmFuayhmQ29udGVudFR5cGVJRCk7Ci0JCX0KLQl9OwotCi0JLyoqIExpc3Qgb2Yge0BsaW5rIENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5fXMgc3VwcG9ydGVkIGJ5IHRoaXMgcHJvY2Vzc29yICovCi0JcHJpdmF0ZSBMaXN0IGZDYXRlZ29yaWVzOwotCQotCS8qKiBjb250ZW50IHR5cGUgSUQgdGhpcyBwcm9jZXNzb3IgaXMgYXNzb2NpYXRlZCB3aXRoICovCi0JU3RyaW5nIGZDb250ZW50VHlwZUlEOwotCQotCS8qKiBwYXJ0aXRpb24gdHlwZSBJRCB0aGlzIHByb2Nlc3NvciBpcyBhc3NvY2lhdGVkIHdpdGggKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmUGFydGl0aW9uVHlwZUlEOwotCQotCS8qKiBDb250ZW50IGFzc2lzdGFudCB1c2VkIGZvciBnaXZpbmcgdGhlIHVzZXIgc3RhdHVzIG1lc3NhZ2VzIGFuZCBsaXN0ZW5pbmcgdG8gY29tcGxldGlvbiByZXN1bHRzKi8KLQlwcml2YXRlIENvbnRlbnRBc3Npc3RhbnQgZkFzc2lzdGFudDsKLQotCS8qIGN5Y2xpbmcgc3R1ZmYgKi8KLQlwcml2YXRlIGludCBmUmVwZXRpdGlvbj0gLTE7Ci0JcHJpdmF0ZSBMaXN0IGZDYXRlZ29yeUl0ZXJhdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkl0ZXJhdGlvbkdlc3R1cmUgPSBudWxsOwotCXByaXZhdGUgaW50IGZOdW1iZXJPZkNvbXB1dGVkUmVzdWx0cyA9IDA7Ci0JcHJpdmF0ZSBTdHJpbmcgZkVycm9yTWVzc2FnZTsKLQkKLQkvKiogT3B0aW9uYWxseSBzcGVjaWZpZWQgcHJlZmVyZW5jZSBzdG9yZSBmb3IgbGlzdGVuaW5nIHRvIHByb3BlcnR5IGNoYW5nZSBldmVudHMgKi8KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZlByZWZlcmVuY2VTdG9yZTsKLQkKLQkvKiogVGhlIHZpZXdlciB0aGlzIHByb2Nlc3NvciBpcyBhc3NvY2lhdGVkIHdpdGggKi8KLQlwcml2YXRlIElUZXh0Vmlld2VyIGZWaWV3ZXI7Ci0KLQkvKioKLQkgKiB0aGUge0BsaW5rIElUZXh0SW5wdXRMaXN0ZW5lcn0gdXNlZCB0byBzZXQgdGhlIGNvbnRlbnQgdHlwZSB3aGVuCi0JICogYSBkb2N1bWVudCBpcyBzZXQgZm9yIHRoaXMgcHJvY2Vzc29ycyBhc3NvY2lhdGVkIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIElUZXh0SW5wdXRMaXN0ZW5lciBmVGV4dElucHV0TGlzdGVuZXI7Ci0KLQlwcml2YXRlIENvbXBsZXRpb25MaXN0ZW5lciBmQ29tcGxldGlvbkxpc3RlbmVyOwotCQotCS8qKiB0aGUgY29udGV4dCBpbmZvcm1hdGlvbiB2YWxpZGF0b3IgZm9yIHRoaXMgcHJvY2Vzc29yICovCi0JcHJpdmF0ZSBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGZDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci0JCi0JLyoqCi0JICogPHA+Q3JlYXRlIGEgbmV3IGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvciBmb3IgYSBzcGVjaWZpYyBwYXJ0aXRpb24gdHlwZS4gCi0JICogVGhlIGNvbnRlbnQgdHlwZSB3aWxsIGJlIGRldGVybWluZWQgd2hlbiBhIGRvY3VtZW50IGlzIHNldCBvbiB0aGUgdmlld2VyPC9wPgotCSAqIAotCSAqIDxwPklmIHRoZSBnaXZlbiB7QGxpbmsgSVByZWZlcmVuY2VTdG9yZX0gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gdGhpcwotCSAqIHByb2Nlc3NvciB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgYSB7QGxpbmsgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJ9IG9uIHRoZSBnaXZlbiBzdG9yZQotCSAqIHNvIHRoYXQgaW1wbGVtZW50ZXJzIG9mIHRoaXMgY2xhc3MgY2FuIGNoYW5nZSB0aGUgd2F5IHRoZSBwcm9jZXNzb3IgYWN0cyBiYXNlZCBvbgotCSAqIHVzZXIgcHJlZmVyZW5jZXM8L3A+Ci0JICogCi0JICogQHBhcmFtIGFzc2lzdGFudCB7QGxpbmsgQ29udGVudEFzc2lzdGFudH0gdG8gdXNlCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGVJRCB0aGUgcGFydGl0aW9uIHR5cGUgdGhpcyBwcm9jZXNzb3IgaXMgZm9yCi0JICogQHBhcmFtIHZpZXdlciB7QGxpbmsgSVRleHRWaWV3ZXJ9IHRoaXMgcHJvY2Vzc29yIGlzIGFjdGluZyBpbgotCSAqIEBwYXJhbSBwcmVmZXJlbmNlU3RvcmUgVGhpcyBwcm9jZXNzb3Igd2lsbCBiZSByZWdpc3RlcmVkIGFzIGEge0BsaW5rIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyfQotCSAqIG9uIHRoaXMgc3RvcmUgYW5kIHRoZSBwcm9jZXNzb3IgaXRzZWxmIHdpbGwgdGFrZSBjYXJlIG9mIHJlbW92aW5nIGl0c2VsZiBhcyBhIGxpc3RlbmVyLCBpZgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gd2lsbCBub3QgYmUgcmVnaXN0ZXJlZCBhcyBhIHtAbGluayBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcn0KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoQ29udGVudEFzc2lzdGFudCBhc3Npc3RhbnQsIFN0cmluZyBwYXJ0aXRpb25UeXBlSUQsCi0JCQlJVGV4dFZpZXdlciB2aWV3ZXIsIElQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZVN0b3JlKSB7Ci0JCQotCQlBc3NlcnQuaXNOb3ROdWxsKHBhcnRpdGlvblR5cGVJRCk7Ci0JCUFzc2VydC5pc05vdE51bGwoYXNzaXN0YW50KTsKLQkJCi0JCS8vYmUgc3VyZSB0aGUgcmVnaXN0cnkgaGFzIGJlZW4gbG9hZGVkLCBub25lIGJsb2NraW5nCi0JCUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyUmVnaXN0cnkuZ2V0RGVmYXVsdCgpLmluaXRpYWxpemUoKTsKLQkJCi0JCS8vcmVnaXN0ZXIgb24gdGhlIHByZWZlcmVuY2Ugc3RvcmUKLQkJdGhpcy5mUHJlZmVyZW5jZVN0b3JlID0gcHJlZmVyZW5jZVN0b3JlOwotCQlpZih0aGlzLmZQcmVmZXJlbmNlU3RvcmUgIT0gbnVsbCkgewotCQkJdGhpcy5mUHJlZmVyZW5jZVN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJCi0JCS8vVGhlIGNvbnRlbnQgdHlwZSBjYW4gbm90IGJlIGRldGVybWluZWQgdW50aWwgYSBkb2N1bWVudCBoYXMgYmVlbiBzZXQKLQkJdGhpcy5mQ29udGVudFR5cGVJRCA9IG51bGw7Ci0JCXRoaXMuZlZpZXdlciA9IHZpZXdlcjsKLQkJaWYodmlld2VyICE9IG51bGwpIHsKLQkJCXRoaXMuZlRleHRJbnB1dExpc3RlbmVyID0gbmV3IFRleHRJbnB1dExpc3RlbmVyKCk7Ci0JCQl2aWV3ZXIuYWRkVGV4dElucHV0TGlzdGVuZXIodGhpcy5mVGV4dElucHV0TGlzdGVuZXIpOwotCQkKLQkJCWlmKHZpZXdlci5nZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCQkvKiBpdCBpcyBoaWdobHkgdW5saWtlIHRoZSBkb2N1bWVudCBoYXMgYWxyZWFkeSBiZWVuIHNldCwgYnV0IGNoZWNrCi0JCQkJICoganVzdCBmb3Igc2FuaXR5Ci0JCQkJICovCi0JCQkJdGhpcy5mVGV4dElucHV0TGlzdGVuZXIuaW5wdXREb2N1bWVudENoYW5nZWQobnVsbCwgdmlld2VyLmdldERvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0JCQotCQkvL3NldCB0aGUgYXNzb2NpYXRlZCBwYXJ0aXRpb24gdHlwZQotCQl0aGlzLmZQYXJ0aXRpb25UeXBlSUQgPSBwYXJ0aXRpb25UeXBlSUQ7Ci0JCQotCQkvL2FkZCBjb21wbGV0aW9uIGxpc3RlbmVyCi0JCWZBc3Npc3RhbnQgPSBhc3Npc3RhbnQ7Ci0JCWZDb21wbGV0aW9uTGlzdGVuZXIgPSBuZXcgQ29tcGxldGlvbkxpc3RlbmVyKCk7Ci0JCWZBc3Npc3RhbnQuYWRkQ29tcGxldGlvbkxpc3RlbmVyKGZDb21wbGV0aW9uTGlzdGVuZXIpOwotCQkKLQkJLy9sYXp5IGxvYWQgdGhlc2UgdG8gc3BlZWQgdXAgaW5pdGlhbCBlZGl0b3Igb3BlbmluZwotCQlmTGVnYWN5RXh0ZW5kZWRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyA9IG51bGw7Ci0JCWZDYXRlZ29yaWVzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD5Db2xsZWN0IHRoZSBwcm9wb3NhbHMgdXNpbmcgdGhlIGV4dGVuc2lvbiBwb2ludHM8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwgaW50KQotCSAqLwotCXB1YmxpYyBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCWNsZWFyU3RhdGUoKTsKLQotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I9IGNyZWF0ZVByb2dyZXNzTW9uaXRvcigpOwotCQltb25pdG9yLmJlZ2luVGFzayhTU0VVSU1lc3NhZ2VzLkNvbnRlbnRBc3Npc3RfY29tcHV0aW5nX3Byb3Bvc2FscywgZ2V0UHJvcG9zYWxDYXRlZ29yaWVzKCkuc2l6ZSgpICsgMSk7Ci0KLQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQodmlld2VyLCBvZmZzZXQpOwotCi0JCW1vbml0b3Iuc3ViVGFzayhTU0VVSU1lc3NhZ2VzLkNvbnRlbnRBc3Npc3RfY29sbGVjdGluZ19wcm9wb3NhbHMpOwotCQlMaXN0IHByb3Bvc2FscyA9IGNvbGxlY3RQcm9wb3NhbHModmlld2VyLCBvZmZzZXQsIG1vbml0b3IsIGNvbnRleHQpOwotCi0JCW1vbml0b3Iuc3ViVGFzayhTU0VVSU1lc3NhZ2VzLkNvbnRlbnRBc3Npc3Rfc29ydGluZ19wcm9wb3NhbHMpOwotCQlMaXN0IGZpbHRlcmVkID0gZmlsdGVyQW5kU29ydFByb3Bvc2Fscyhwcm9wb3NhbHMsIG1vbml0b3IsIGNvbnRleHQpOwotCQlmTnVtYmVyT2ZDb21wdXRlZFJlc3VsdHM9IGZpbHRlcmVkLnNpemUoKTsKLQotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcmVzdWx0PSAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBmaWx0ZXJlZC50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2ZpbHRlcmVkLnNpemUoKV0pOwotCQltb25pdG9yLmRvbmUoKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDxwPkNvbGxlY3QgdGhlIGNvbnRleHQgaW5mb3JtYXRpb24gdXNpbmcgdGhlIGV4dGVuc2lvbiBwb2ludHM8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLCBpbnQpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQljbGVhclN0YXRlKCk7Ci0KLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yPSBjcmVhdGVQcm9ncmVzc01vbml0b3IoKTsKLQkJbW9uaXRvci5iZWdpblRhc2soU1NFVUlNZXNzYWdlcy5Db250ZW50QXNzaXN0X2NvbXB1dGluZ19jb250ZXh0cywgZ2V0UHJvcG9zYWxDYXRlZ29yaWVzKCkuc2l6ZSgpICsgMSk7Ci0KLQkJbW9uaXRvci5zdWJUYXNrKFNTRVVJTWVzc2FnZXMuQ29udGVudEFzc2lzdF9jb2xsZWN0aW5nX2NvbnRleHRzKTsKLQkJTGlzdCBwcm9wb3NhbHM9IGNvbGxlY3RDb250ZXh0SW5mb3JtYXRpb24odmlld2VyLCBvZmZzZXQsIG1vbml0b3IpOwotCi0JCW1vbml0b3Iuc3ViVGFzayhTU0VVSU1lc3NhZ2VzLkNvbnRlbnRBc3Npc3Rfc29ydGluZ19jb250ZXh0cyk7Ci0JCUxpc3QgZmlsdGVyZWQ9IGZpbHRlckFuZFNvcnRDb250ZXh0SW5mb3JtYXRpb24ocHJvcG9zYWxzLCBtb25pdG9yKTsKLQkJZk51bWJlck9mQ29tcHV0ZWRSZXN1bHRzPSBmaWx0ZXJlZC5zaXplKCk7Ci0KLQkJSUNvbnRleHRJbmZvcm1hdGlvbltdIHJlc3VsdD0gKElDb250ZXh0SW5mb3JtYXRpb25bXSkgZmlsdGVyZWQudG9BcnJheShuZXcgSUNvbnRleHRJbmZvcm1hdGlvbltmaWx0ZXJlZC5zaXplKCldKTsKLQkJbW9uaXRvci5kb25lKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPHA+RGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyB0byByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT48L3A+Ci0JICogPHA+RXh0ZW5kZXJzIG1heSBvdmVycmlkZTwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKQotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD5EZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHRvIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPjwvcD4KLQkgKiA8cD5FeHRlbmRlcnMgbWF5IG92ZXJyaWRlPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPkV4dGVuZGVycyBtYXkgb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiB0byBjaGFuZ2UgZXJyb3IgcmVwb3J0aW5nPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldEVycm9yTWVzc2FnZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCWlmIChmRXJyb3JNZXNzYWdlICE9IG51bGwpCi0JCQlyZXR1cm4gZkVycm9yTWVzc2FnZTsKLQkJaWYgKGZOdW1iZXJPZkNvbXB1dGVkUmVzdWx0cyA+IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIFNTRVVJTWVzc2FnZXMuQ29udGVudEFzc2lzdF9ub19jb21wbGV0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5TdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpIHsKLQkJaWYgKHRoaXMuZkNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQl0aGlzLmZDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgPSBuZXcgQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZkNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogPHA+RXh0ZW5kZXJzIG1heSBvdmVycmlkZSwgYnV0IHNob3VsZCBhbHdheXMgYmUgc3VyZSB0byBjYWxsIHRoZSBzdXBlciBpbXBsZW1lbnRhdGlvbjwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGUjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYodGhpcy5mUHJlZmVyZW5jZVN0b3JlICE9IG51bGwpIHsKLQkJCXRoaXMuZlByZWZlcmVuY2VTdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJdGhpcy5mUHJlZmVyZW5jZVN0b3JlID0gbnVsbDsKLQkJfQotCQkKLQkJaWYodGhpcy5mVmlld2VyICE9IG51bGwpIHsKLQkJCXRoaXMuZlZpZXdlci5yZW1vdmVUZXh0SW5wdXRMaXN0ZW5lcih0aGlzLmZUZXh0SW5wdXRMaXN0ZW5lcik7Ci0JCQl0aGlzLmZWaWV3ZXIgPSBudWxsOwotCQl9Ci0JCWlmICh0aGlzLmZBc3Npc3RhbnQgIT0gbnVsbCkgewotCQkJdGhpcy5mQXNzaXN0YW50LnJlbW92ZUNvbXBsZXRpb25MaXN0ZW5lcihmQ29tcGxldGlvbkxpc3RlbmVyKTsKLQkJCXRoaXMuZkFzc2lzdGFudCA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+SW50ZW5kZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSBleHRlbmRlcnMgd2lzaGluZyB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yCi0JICogb2YgdGhlIHByb2Nlc3NvciBiYXNlZCBvbiB1c2VyIHByZWZlcmVuY2VzIGZyb20gdGhlIHN0b3JlIG9wdGlvbmFsbHkgCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvY2Vzc29yLiAgSWYgbm8gc3RvcmUgd2FzIGdpdmVuIHRvIHRoZSBjb25zdHJ1Y3RvcgotCSAqIHdoZW4gY3JlYXRpbmcgdGhpcyBhc3Npc3RhbnQgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIG5ldmVyIGJlIGludm9rZWQuPC9wPgotCSAqIAotCSAqIDxwPlRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHJlYWN0IHRvIHRoZSBldmVudHMgaW4gYW55IHdheTwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2Uob3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQl9Ci0JCi0JLyoqCi0JICogPHA+RmlsdGVycyBhbmQgc29ydHMgdGhlIHByb3Bvc2Fscy4gVGhlIHBhc3NlZCBsaXN0IG1heSBiZSBtb2RpZmllZAotCSAqIGFuZCByZXR1cm5lZCwgb3IgYSBuZXcgbGlzdCBtYXkgYmUgY3JlYXRlZCBhbmQgcmV0dXJuZWQuPC9wPgotCSAqIAotCSAqIDxwPlRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGRvIGFueSBzb3J0aW5nIG9yIGZpbHRlcmluZy48L3A+Ci0JICogPHA+RXh0ZW5kZXJzIG1heSBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uLjwvcD4KLQkgKgotCSAqIEBwYXJhbSBwcm9wb3NhbHMgdGhlIGxpc3Qgb2YgY29sbGVjdGVkIHByb3Bvc2FscyAoZWxlbWVudCB0eXBlOgotCSAqICAgICAgICB7QGxpbmsgSUNvbXBsZXRpb25Qcm9wb3NhbH0pCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHBhcmFtIGNvbnRleHQgVE9ETwotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgZmlsdGVyZWQgYW5kIHNvcnRlZCBwcm9wb3NhbHMsIHJlYWR5IGZvcgotCSAqICAgICAgICAgZGlzcGxheSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgSUNvbXBsZXRpb25Qcm9wb3NhbH0pCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZmlsdGVyQW5kU29ydFByb3Bvc2FscyhMaXN0IHByb3Bvc2FscywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBwcm9wb3NhbHM7Ci0JfQotCQotCS8qKgotCSAqIDxwPkZpbHRlcnMgYW5kIHNvcnRzIHRoZSBjb250ZXh0IGluZm9ybWF0aW9uIG9iamVjdHMuIFRoZSBwYXNzZWQKLQkgKiBsaXN0IG1heSBiZSBtb2RpZmllZCBhbmQgcmV0dXJuZWQsIG9yIGEgbmV3IGxpc3QgbWF5IGJlIGNyZWF0ZWQKLQkgKiBhbmQgcmV0dXJuZWQuPC9wPgotCSAqIAotCSAqIDxwPlRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGRvIGFueSBzb3J0aW5nIG9yIGZpbHRlcmluZzwvcD4KLQkgKiA8cD5FeHRlbmRlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kPC9wPgotCSAqCi0JICogQHBhcmFtIGNvbnRleHRzIHRoZSBsaXN0IG9mIGNvbGxlY3RlZCBwcm9wb3NhbHMgKGVsZW1lbnQgdHlwZToKLQkgKiAgICAgICAge0BsaW5rIElDb250ZXh0SW5mb3JtYXRpb259KQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgZmlsdGVyZWQgYW5kIHNvcnRlZCBwcm9wb3NhbHMsIHJlYWR5IGZvcgotCSAqICAgICAgICAgZGlzcGxheSAoZWxlbWVudCB0eXBlOiB7QGxpbmsgSUNvbnRleHRJbmZvcm1hdGlvbn0pCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZmlsdGVyQW5kU29ydENvbnRleHRJbmZvcm1hdGlvbihMaXN0IGNvbnRleHRzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIGNvbnRleHRzOwotCX0KLQotCS8qKgotCSAqIDxwPkNyZWF0ZXMgYSBwcm9ncmVzcyBtb25pdG9yLjwvcD4KLQkgKiA8cD5UaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjcmVhdGVzIGEge0BsaW5rIE51bGxQcm9ncmVzc01vbml0b3J9LjwvcD4KLQkgKgotCSAqIDxwPkV4dGVuZGVycyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2Q8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqLwotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIGNyZWF0ZVByb2dyZXNzTW9uaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Q3JlYXRlcyB0aGUgY29udGV4dCB0aGF0IGlzIHBhc3NlZCB0byB0aGUgY29tcGxldGlvbiBwcm9wb3NhbAotCSAqIGNvbXB1dGVycy48L3A+Ci0JICogCi0JICogPHA+RXh0ZW5kZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZDwvcD4KLQkgKgotCSAqIEBwYXJhbSB2aWV3ZXIgdGhlIHZpZXdlciB0aGF0IGNvbnRlbnQgYXNzaXN0IGlzIGludm9rZWQgb24KLQkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBjb250ZW50IGFzc2lzdCBvZmZzZXQKLQkgKiBAcmV0dXJuIHRoZSBjb250ZXh0IHRvIGJlIHBhc3NlZCB0byB0aGUgY29tcHV0ZXJzCi0JICovCi0JcHJvdGVjdGVkIENvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNyZWF0ZUNvbnRleHQoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBuZXcgQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQodmlld2VyLCBvZmZzZXQpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBhc3NvY2lhdGVkIHByZWZlcmVuY2Ugc3RvcmUKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiB0aGlzLmZQcmVmZXJlbmNlU3RvcmU7Ci0JfQotCQotCS8qKgotCSAqIENsZWFycyB0aGUgc3RhdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJTdGF0ZSgpIHsKLQkJZkVycm9yTWVzc2FnZT1udWxsOwotCQlmTnVtYmVyT2ZDb21wdXRlZFJlc3VsdHM9IDA7Ci0JfQotCi0JLyoqCi0JICogPHA+Q29sbGVjdHMgdGhlIHByb3Bvc2FscyBmcm9tIHRoZSBleHRlbnNpb25zLjwvcD4KLQkgKgotCSAqIEBwYXJhbSB2aWV3ZXIgdGhlIHRleHQgdmlld2VyCi0JICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0Ci0JICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcGFyYW0gY29udGV4dCB0aGUgY29kZSBhc3Npc3QgaW52b2NhdGlvbiBjb250ZXh0Ci0JICogQHJldHVybiB0aGUgbGlzdCBvZiBwcm9wb3NhbHMKLQkgKi8KLQlwcml2YXRlIExpc3QgY29sbGVjdFByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQlMaXN0IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBjYXRlZ29yaWVzID0gZ2V0Q2F0ZWdvcmllcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2F0ZWdvcmllcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeSBjYXQgPSAoQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCUxpc3QgY29tcHV0ZWQgPSBjYXQuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoY29udGV4dCwgdGhpcy5mQ29udGVudFR5cGVJRCwgdGhpcy5mUGFydGl0aW9uVHlwZUlELCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCXByb3Bvc2Fscy5hZGRBbGwoY29tcHV0ZWQpOwotCQkJaWYgKGZFcnJvck1lc3NhZ2UgPT0gbnVsbCkgewotCQkJCWZFcnJvck1lc3NhZ2U9IGNhdC5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gaWYgZGVmYXVsdCBwYWdlCi0JCS8vIERlYWwgd2l0aCBhZGRpbmcgaW4gcHJvcG9zYWxzIGZyb20gcHJvY2Vzc29ycyBhZGRlZCB0aHJvdWdoIHRoZSBsZWdhY3kgZXh0ZW5zaW9uCi0JCWlmIChpc0ZpcnN0UGFnZSgpICYmIGdldExlZ2FjeUV4dGVuZGVkQ29udGVudEFzc2lzdFByb2Nlc3NvcnMoKSAhPSBudWxsICYmCi0JCQkJIWdldExlZ2FjeUV4dGVuZGVkQ29udGVudEFzc2lzdFByb2Nlc3NvcnMoKS5pc0VtcHR5KCkpIHsKLQkJCQotCQkJSXRlcmF0b3IgaXRlciA9IGdldExlZ2FjeUV4dGVuZGVkQ29udGVudEFzc2lzdFByb2Nlc3NvcnMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgbGVnYWN5UHJvY2Vzc29yID0gKElDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBpdGVyLm5leHQoKTsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gbGVnYWN5Q29tcHV0ZWQgPSBsZWdhY3lQcm9jZXNzb3IuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBvZmZzZXQpOwotCQkJCWlmIChsZWdhY3lDb21wdXRlZCAhPSBudWxsKSB7Ci0JCQkJCXByb3Bvc2Fscy5hZGRBbGwoQXJyYXlzLmFzTGlzdChsZWdhY3lDb21wdXRlZCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHByb3Bvc2FsczsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Q29sbGVjdHMgdGhlIGNvbnRleHQgaW5mb3JtYXRpb24gZnJvbSB0aGUgZXh0ZW5zaW9ucy48L3A+Ci0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgY29sbGVjdENvbnRleHRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlMaXN0IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dD0gY3JlYXRlQ29udGV4dCh2aWV3ZXIsIG9mZnNldCk7Ci0KLQkJTGlzdCBwcm92aWRlcnM9IGdldENhdGVnb3JpZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdD0gcHJvdmlkZXJzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5IGNhdD0gKENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5KSBpdC5uZXh0KCk7Ci0JCQlMaXN0IGNvbXB1dGVkPSBjYXQuY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihjb250ZXh0LCB0aGlzLmZDb250ZW50VHlwZUlELCB0aGlzLmZQYXJ0aXRpb25UeXBlSUQsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJcHJvcG9zYWxzLmFkZEFsbChjb21wdXRlZCk7Ci0JCQlpZiAoZkVycm9yTWVzc2FnZSA9PSBudWxsKSB7Ci0JCQkJZkVycm9yTWVzc2FnZT0gY2F0LmdldEVycm9yTWVzc2FnZSgpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBEZWFsIHdpdGggYWRkaW5nIGluIGNvbnRleHRzIGZyb20gcHJvY2Vzc29ycyBhZGRlZCB0aHJvdWdoIHRoZSBsZWdhY3kgZXh0ZW5zaW9uCi0JCWlmIChnZXRMZWdhY3lFeHRlbmRlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKCkgIT0gbnVsbCAmJgotCQkJCSFnZXRMZWdhY3lFeHRlbmRlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKCkuaXNFbXB0eSgpKSB7Ci0JCQkKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBnZXRMZWdhY3lFeHRlbmRlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGxlZ2FjeVByb2Nlc3NvciA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgaXRlci5uZXh0KCk7Ci0JCQkJSUNvbnRleHRJbmZvcm1hdGlvbltdIGxlZ2FjeUNvbXB1dGVkID0gbGVnYWN5UHJvY2Vzc29yLmNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24odmlld2VyLCBvZmZzZXQpOwotCQkJCWlmKGxlZ2FjeUNvbXB1dGVkICE9IG51bGwpIHsKLQkJCQkJcHJvcG9zYWxzLmFkZEFsbChBcnJheXMuYXNMaXN0KGxlZ2FjeUNvbXB1dGVkKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHByb3Bvc2FsczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuZXh0IHNldCBvZiBjYXRlZ29yaWVzCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldENhdGVnb3JpZXMoKSB7Ci0JCUxpc3QgY2F0ZWdvcmllczsKLQkJaWYgKGZDYXRlZ29yeUl0ZXJhdGlvbiA9PSBudWxsKSB7Ci0JCQljYXRlZ29yaWVzID0gIGdldFByb3Bvc2FsQ2F0ZWdvcmllcygpOwotCQl9IGVsc2UgewotCQkJaW50IGl0ZXJhdGlvbj0gZlJlcGV0aXRpb24gJSBmQ2F0ZWdvcnlJdGVyYXRpb24uc2l6ZSgpOwotCQkJZkFzc2lzdGFudC5zZXRTdGF0dXNNZXNzYWdlKGNyZWF0ZUl0ZXJhdGlvbk1lc3NhZ2UoKSk7Ci0JCQlmQXNzaXN0YW50LnNldEVtcHR5TWVzc2FnZShjcmVhdGVFbXB0eU1lc3NhZ2UoKSk7Ci0JCQlmUmVwZXRpdGlvbisrOwotCQotCQkJY2F0ZWdvcmllcyA9IChMaXN0KSBmQ2F0ZWdvcnlJdGVyYXRpb24uZ2V0KGl0ZXJhdGlvbik7Ci0JCX0KLQkJCi0JCXJldHVybiBjYXRlZ29yaWVzOwotCX0KLQotCS8qKgotCSAqICBUaGlzIG1heSBzaG93IHRoZSB3YXJuaW5nIGRpYWxvZyBpZiBhbGwgY2F0ZWdvcmllcyBhcmUgZGlzYWJsZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRDYXRlZ29yeUl0ZXJhdGlvbigpIHsKLQkJZkNhdGVnb3J5SXRlcmF0aW9uID0gZ2V0Q2F0ZWdvcnlJdGVyYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgTGlzdH1zIG9mIHtAbGluayBDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeX1zLCB0aGlzIGlzCi0JICogdGhlIG9yZGVyZWQgbGlzdCBvZiB0aGUgY29tcGxldGlvbiBjYXRlZ29yaWVzIHRvIGN5Y2xlIHRocm91Z2gKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0Q2F0ZWdvcnlJdGVyYXRpb24oKSB7Ci0JCUxpc3Qgc2VxdWVuY2U9IG5ldyBBcnJheUxpc3QoKTsKLQkJc2VxdWVuY2UuYWRkKGdldERlZmF1bHRDYXRlZ29yaWVzKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0PSBnZXRTb3J0ZWRPd25QYWdlQ2F0ZWdvcmllcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5IGNhdD0gKENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5KSBpdC5uZXh0KCk7Ci0JCQlzZXF1ZW5jZS5hZGQoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChjYXQpKTsKLQkJfQotCQlyZXR1cm4gc2VxdWVuY2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgc29ydGVkIGNhdGVnb3JpZXMgZm9yIHRoZSBkZWZhdWx0IHBhZ2UKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0RGVmYXVsdENhdGVnb3JpZXMoKSB7Ci0JCS8vIGRlZmF1bHQgbWl4IC0gZW5hYmxlIGFsbCBpbmNsdWRlZCBjb21wdXRlcnMKLQkJTGlzdCBpbmNsdWRlZD0gZ2V0RGVmYXVsdENhdGVnb3JpZXNVbmNoZWNrZWQoKTsKLQotCQlpZiAoaW5jbHVkZWQuc2l6ZSgpID09IDAgJiYgQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJSZWdpc3RyeS5nZXREZWZhdWx0KCkuaGFzVW5pbnN0YWxsZWRDb21wdXRlcnMoKSkgewotCQkJaWYgKGluZm9ybVVzZXJBYm91dEVtcHR5RGVmYXVsdENhdGVnb3J5KCkpIHsKLQkJCQkvLyBwcmVmZXJlbmNlcyB3ZXJlIHJlc3RvcmVkIC0gcmVjb21wdXRlIHRoZSBkZWZhdWx0IGNhdGVnb3JpZXMKLQkJCQlpbmNsdWRlZD0gZ2V0RGVmYXVsdENhdGVnb3JpZXNVbmNoZWNrZWQoKTsKLQkJCX0KLQkJCUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyUmVnaXN0cnkuZ2V0RGVmYXVsdCgpLnJlc2V0VW5pc3RhbGxlZENvbXB1dGVycygpOwotCQl9Ci0JCQotCQlDb2xsZWN0aW9ucy5zb3J0KGluY2x1ZGVkLCBERUZBVUxUX1BBR0VfT1JERVJfQ09NUEFSQVRPUik7Ci0KLQkJcmV0dXJuIGluY2x1ZGVkOwotCX0KLQotCS8qKgotCSAqIDxwPkdldHMgdGhlIGRlZmF1bHQgY2F0ZWdvcmllcyB3aXRoIG5vIGVycm9yIGNoZWNraW5nLjwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHtAbGluayBDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeX1zCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldERlZmF1bHRDYXRlZ29yaWVzVW5jaGVja2VkKCkgewotCQlMaXN0IGluY2x1ZGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0UHJvcG9zYWxDYXRlZ29yaWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCWlmIChjYXRlZ29yeS5pc0luY2x1ZGVkT25EZWZhdWx0UGFnZSh0aGlzLmZDb250ZW50VHlwZUlEKSAmJiBjYXRlZ29yeS5oYXNDb21wdXRlcnMoZkNvbnRlbnRUeXBlSUQsIGZQYXJ0aXRpb25UeXBlSUQpKQotCQkJCWluY2x1ZGVkLmFkZChjYXRlZ29yeSk7Ci0JCX0KLQkJcmV0dXJuIGluY2x1ZGVkOwotCX0KLQotCS8qKgotCSAqIDxwPkluZm9ybXMgdGhlIHVzZXIgYWJvdXQgdGhlIGZhY3QgdGhhdCB0aGVyZSBhcmUgbm8gZW5hYmxlZCBjYXRlZ29yaWVzIGluIHRoZSBkZWZhdWx0IGNvbnRlbnQKLQkgKiBhc3Npc3Qgc2V0IGFuZCBzaG93cyBhIGxpbmsgdG8gdGhlIHByZWZlcmVuY2VzLjwvcD4KLQkgKgotCSAqIEByZXR1cm4gIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkZWZhdWx0IHNob3VsZCBiZSByZXN0b3JlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpbmZvcm1Vc2VyQWJvdXRFbXB0eURlZmF1bHRDYXRlZ29yeSgpIHsKLQkJLypJZiB3YXJuIGFib3V0IGVtcHR5IGRlZmF1bHQgY2F0ZWdvcnkgYW5kIHRoZXJlIGFyZSBhc3NvY2lhdGVkIHByb3BlcnRpZXMgZm9yIHRoaXMKLQkJICogcHJvY2Vzc29ycyBjb250ZW50IHR5cGUgYW5kIHRob3NlIHByb3BlcnRpZXMgaGF2ZSBhbiBhc3NvY2lhdGVkIHByb3BlcnRpZXMgcGFnZSB0aGVuCi0JCSAqIGRpc3BsYXkgd2FybmluZyBtZXNzYWdlIHRvIHVzZXIuCi0JCSAqLwotCQlJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25SZWFkZXIgcHJvcGVydGllcyA9IENvbXBsZXRpb25Qcm9wb3NvYWxDYXRpZ29yaWVzQ29uZmlndXJhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRSZWFkYWJsZUNvbmZpZ3VyYXRpb24odGhpcy5mQ29udGVudFR5cGVJRCk7Ci0JCWlmIChPcHRpb25hbE1lc3NhZ2VEaWFsb2cuaXNEaWFsb2dFbmFibGVkKFBSRUZfV0FSTl9BQk9VVF9FTVBUWV9BU1NJU1RfQ0FURUdPUlkpICYmCi0JCQkJcHJvcGVydGllcyBpbnN0YW5jZW9mIElDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlciAgJiYKLQkJCQkoKElDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlcilwcm9wZXJ0aWVzKS5oYXNBc3NvY2lhdGVkUHJvcGVydGllc1BhZ2UoKSkgewotCQkJCi0JCQlJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25Xcml0ZXIgcHJvcGVydGllc0V4dGVuc2lvbiA9IChJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25Xcml0ZXIpcHJvcGVydGllczsKLQkJCQotCQkJZmluYWwgU2hlbGwgc2hlbGw9IFNTRVVJUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCk7Ci0JCQlTdHJpbmcgdGl0bGU9IFNTRVVJTWVzc2FnZXMuQ29udGVudEFzc2lzdF9hbGxfZGlzYWJsZWRfdGl0bGU7Ci0JCQlTdHJpbmcgbWVzc2FnZT0gU1NFVUlNZXNzYWdlcy5Db250ZW50QXNzaXN0X2FsbF9kaXNhYmxlZF9tZXNzYWdlOwotCQkJLy8gc2VlIFByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRyb2wgZm9yIHRoZSAnZGVmYXVsdHMnIGxhYmVsCi0JCQlmaW5hbCBTdHJpbmcgcmVzdG9yZUJ1dHRvbkxhYmVsPSBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoImRlZmF1bHRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZpbmFsIFN0cmluZyBsaW5rTWVzc2FnZT0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5Db250ZW50QXNzaXN0X2FsbF9kaXNhYmxlZF9wcmVmZXJlbmNlX2xpbmssIExlZ2FjeUFjdGlvblRvb2xzLnJlbW92ZU1uZW1vbmljcyhyZXN0b3JlQnV0dG9uTGFiZWwpKTsKLQkJCWZpbmFsIGludCByZXN0b3JlSWQ9IElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgMTA7Ci0JCQlmaW5hbCBpbnQgc2V0dGluZ3NJZD0gSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAxMTsKLQkJCWZpbmFsIE9wdGlvbmFsTWVzc2FnZURpYWxvZyBkaWFsb2c9IG5ldyBPcHRpb25hbE1lc3NhZ2VEaWFsb2coUFJFRl9XQVJOX0FCT1VUX0VNUFRZX0FTU0lTVF9DQVRFR09SWSwgc2hlbGwsIHRpdGxlLCBudWxsIC8qIGRlZmF1bHQgaW1hZ2UgKi8sIG1lc3NhZ2UsIE1lc3NhZ2VEaWFsb2cuV0FSTklORywgbmV3IFN0cmluZ1tdIHsgcmVzdG9yZUJ1dHRvbkxhYmVsLCBJRGlhbG9nQ29uc3RhbnRzLkNMT1NFX0xBQkVMIH0sIDEpIHsKLQkJCQkvKgotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmRpYWxvZ3MuT3B0aW9uYWxNZXNzYWdlRGlhbG9nI2NyZWF0ZUN1c3RvbUFyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCQkJCSAqLwotCQkJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUN1c3RvbUFyZWEoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJCQkvLyB3cmFwIGxpbmsgYW5kIGNoZWNrYm94IGluIG9uZSBjb21wb3NpdGUgd2l0aG91dCBzcGFjZQotCQkJCQlDb21wb3NpdGUgcGFyZW50PSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCQlHcmlkTGF5b3V0IGxheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCQkJbGF5b3V0Lm1hcmdpbkhlaWdodD0gMDsKLQkJCQkJbGF5b3V0Lm1hcmdpbldpZHRoPSAwOwotCQkJCQlsYXlvdXQudmVydGljYWxTcGFjaW5nPSAwOwotCQkJCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCQkJQ29tcG9zaXRlIGxpbmtDb21wb3NpdGU9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQkJCWxheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCQkJbGF5b3V0Lm1hcmdpbkhlaWdodD0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJCQkJbGF5b3V0Lm1hcmdpbldpZHRoPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJCQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCQkJCWxpbmtDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkgICAgICAgIAkJTGluayBsaW5rPSBuZXcgTGluayhsaW5rQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JICAgICAgICAJCWxpbmsuc2V0VGV4dChsaW5rTWVzc2FnZSk7Ci0JICAgICAgICAJCWxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JICAgICAgICAJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JICAgICAgICAJCQkJc2V0UmV0dXJuQ29kZShzZXR0aW5nc0lkKTsKLQkgICAgICAgIAkJCQljbG9zZSgpOwotCSAgICAgICAgCQkJfQotCSAgICAgICAgCQl9KTsKLQkgICAgICAgIAkJR3JpZERhdGEgZ3JpZERhdGE9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgdHJ1ZSwgZmFsc2UpOwotCSAgICAgICAgCQlncmlkRGF0YS53aWR0aEhpbnQ9IHRoaXMuZ2V0TWluaW11bU1lc3NhZ2VXaWR0aCgpOwotCQkJCQlsaW5rLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCQkJCS8vIGNyZWF0ZSBjaGVja2JveCBhbmQgImRvbid0IHNob3cgdGhpcyBtZXNzYWdlIiBwcm9tcHQKLQkJCQkJc3VwZXIuY3JlYXRlQ3VzdG9tQXJlYShwYXJlbnQpOwotCi0JCQkJCXJldHVybiBwYXJlbnQ7Ci0JICAgICAgICAJfQotCi0JCQkJLyoKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZyNjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkJCQkgKi8KLQkJCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCSAgICAgICAgQnV0dG9uW10gYnV0dG9ucz0gbmV3IEJ1dHRvblsyXTsKLQkJCQkJYnV0dG9uc1swXT0gY3JlYXRlQnV0dG9uKHBhcmVudCwgcmVzdG9yZUlkLCByZXN0b3JlQnV0dG9uTGFiZWwsIGZhbHNlKTsKLQkJCSAgICAgICAgYnV0dG9uc1sxXT0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DTE9TRV9JRCwgSURpYWxvZ0NvbnN0YW50cy5DTE9TRV9MQUJFTCwgdHJ1ZSk7Ci0JCQkgICAgICAgIHNldEJ1dHRvbnMoYnV0dG9ucyk7Ci0JCQkJfQotCSAgICAgICAgfTsKLQkgICAgICAgIGludCByZXR1cm5WYWx1ZSA9IGRpYWxvZy5vcGVuKCk7Ci0JICAgICAgICAKLQkgICAgICAgIC8vYmFzZWQgb24gdXNlciBhY3Rpb25zIGVpdGhlciByZXNldCBkZWZhdWx0cyBvciBvcGVuIHByZWZlcmVuY2UgZGlhbG9nCi0JICAgICAgICBpZiAocmVzdG9yZUlkID09IHJldHVyblZhbHVlIHx8IHNldHRpbmdzSWQgPT0gcmV0dXJuVmFsdWUpIHsKLQkgICAgICAgIAlpZiAocmVzdG9yZUlkID09IHJldHVyblZhbHVlKSB7Ci0JICAgICAgICAJCXByb3BlcnRpZXNFeHRlbnNpb24ubG9hZERlZmF1bHRzKCk7Ci0JICAgICAgICAJCXByb3BlcnRpZXNFeHRlbnNpb24uc2F2ZUNvbmZpZ3VyYXRpb24oKTsKLQkgICAgICAgIAl9Ci0JICAgICAgICAJaWYgKHNldHRpbmdzSWQgPT0gcmV0dXJuVmFsdWUpIHsKLQkJCQkJUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihzaGVsbCwKLQkJCQkJCQlwcm9wZXJ0aWVzRXh0ZW5zaW9uLmdldFByb3BlcnRpZXNQYWdlSUQoKSwgbnVsbCwgbnVsbCkub3BlbigpOwotCSAgICAgICAgCX0KLQkgICAgICAgIAkKLQkgICAgICAgIAlyZXR1cm4gdHJ1ZTsKLQkgICAgICAgIH0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhIHNvcnRlZCB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5fXMgdGhhdAotCSAqIHNob3VsZCBiZSBkaXNwbGF5ZWQgb24gdGhlaXIgb3duIGNvbnRlbnQgYXNzaXN0IHBhZ2UKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0U29ydGVkT3duUGFnZUNhdGVnb3JpZXMoKSB7Ci0JCUFycmF5TGlzdCBzb3J0ZWQ9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdD0gZ2V0UHJvcG9zYWxDYXRlZ29yaWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnkgY2F0ZWdvcnk9IChDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJaWYgKGNhdGVnb3J5LmlzRGlzcGxheWVkT25Pd25QYWdlKHRoaXMuZkNvbnRlbnRUeXBlSUQpICYmIAotCQkJCQljYXRlZ29yeS5oYXNDb21wdXRlcnMoZkNvbnRlbnRUeXBlSUQsIGZQYXJ0aXRpb25UeXBlSUQpKSB7Ci0JCQkJCi0JCQkJc29ydGVkLmFkZChjYXRlZ29yeSk7Ci0JCQl9Ci0JCX0KLQkJQ29sbGVjdGlvbnMuc29ydChzb3J0ZWQsIFBBR0VfT1JERVJfQ09NUEFSQVRPUik7Ci0JCXJldHVybiBzb3J0ZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhIHVzZXIgbWVzc2FnZSBkZXNjcmliaW5nIHRoYXQgdGhlcmUgYXJlIG5vIGNvbnRlbnQgYXNzaXN0IHN1Z2dlc3Rpb25zIGZvciB0aGUgY3VycmVudCBwYWdlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlRW1wdHlNZXNzYWdlKCkgewotCQlyZXR1cm4gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5Db250ZW50QXNzaXN0X25vX21lc3NhZ2UsIG5ldyBTdHJpbmdbXXtnZXRDYXRlZ29yeUxhYmVsKGZSZXBldGl0aW9uKX0pOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdXNlciBtZXNzYWdlIGRlc2NyaWJpbmcgd2hhdCB0aGUgbmV4dCBwYWdlIG9mIGNvbnRlbnQgYXNzaXN0IGhvbGRzCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlSXRlcmF0aW9uTWVzc2FnZSgpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuQ29udGVudEFzc2lzdF90b2dnbGVfYWZmb3JkYW5jZV91cGRhdGVfbWVzc2FnZSwKLQkJCQluZXcgU3RyaW5nW117IGdldENhdGVnb3J5TGFiZWwoZlJlcGV0aXRpb24pLCBmSXRlcmF0aW9uR2VzdHVyZSwgZ2V0Q2F0ZWdvcnlMYWJlbChmUmVwZXRpdGlvbiArIDEpIH0pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXBldGl0aW9uIHdoaWNoIGNhdGVnb3J5IHRvIGdldCB0aGUgbGFiZWwgZm9yCi0JICogQHJldHVybiB0aGUgbGFiZWwgb2YgdGhlIGNhdGVnb3J5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2F0ZWdvcnlMYWJlbChpbnQgcmVwZXRpdGlvbikgewotCQlpbnQgaXRlcmF0aW9uPSAoZkNhdGVnb3J5SXRlcmF0aW9uICE9IG51bGwgPyByZXBldGl0aW9uICUgZkNhdGVnb3J5SXRlcmF0aW9uLnNpemUoKSA6IDApOwotCQlpZiAoaXRlcmF0aW9uID09IDApCi0JCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5Db250ZW50QXNzaXN0X2RlZmF1bHRQcm9wb3NhbENhdGVnb3J5X3RpdGxlOwotCQlyZXR1cm4gKChDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeSkgKChMaXN0KSBmQ2F0ZWdvcnlJdGVyYXRpb24uZ2V0KGl0ZXJhdGlvbikpLmdldCgwKSkuZ2V0RGlzcGxheU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHtAbGluayBTdHJpbmd9IHJlcHJlc2VudGluZyB0aGUgdXNlciBjb21tYW5kIHRvIGl0ZXJhdGUgdG8gdGhlIG5leHQgcGFnZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEl0ZXJhdGlvbkdlc3R1cmUoKSB7Ci0JCVRyaWdnZXJTZXF1ZW5jZSBiaW5kaW5nPSBnZXRJdGVyYXRpb25CaW5kaW5nKCk7Ci0JCXJldHVybiBiaW5kaW5nICE9IG51bGwgPwotCQkJCU5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuQ29udGVudEFzc2lzdF9wcmVzcywgbmV3IE9iamVjdFtdIHsgYmluZGluZy5mb3JtYXQoKSB9KQotCQkJCTogU1NFVUlNZXNzYWdlcy5Db250ZW50QXNzaXN0X2NsaWNrOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4ge0BsaW5rIEtleVNlcXVlbmNlfSB1c2VkIGJ5IHVzZXIgdG8gaXRlcmF0ZSB0byB0aGUgbmV4dCBwYWdlCi0JICovCi0JcHJpdmF0ZSBLZXlTZXF1ZW5jZSBnZXRJdGVyYXRpb25CaW5kaW5nKCkgewotCSAgICBmaW5hbCBJQmluZGluZ1NlcnZpY2UgYmluZGluZ1N2Yz0gKElCaW5kaW5nU2VydmljZSkgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBZGFwdGVyKElCaW5kaW5nU2VydmljZS5jbGFzcyk7Ci0JCVRyaWdnZXJTZXF1ZW5jZSBiaW5kaW5nPSBiaW5kaW5nU3ZjLmdldEJlc3RBY3RpdmVCaW5kaW5nRm9yKElUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5DT05URU5UX0FTU0lTVF9QUk9QT1NBTFMpOwotCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIEtleVNlcXVlbmNlKQotCQkJcmV0dXJuIChLZXlTZXF1ZW5jZSkgYmluZGluZzsKLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotCQotCS8qKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZGlzcGxheWluZyBmaXJzdCBwYWdlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRmlyc3RQYWdlKCkgewotCQlyZXR1cm4gZkNhdGVnb3J5SXRlcmF0aW9uID09IG51bGwgfHwgZkNhdGVnb3J5SXRlcmF0aW9uLnNpemUoKSA9PSAxIHx8IGZSZXBldGl0aW9uICUgZkNhdGVnb3J5SXRlcmF0aW9uLnNpemUoKSA9PSAxOwotCX0KLQkKLQkvKioKLQkgKiA8cD48Yj5OT1RFOiA8L2I+VGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgb3ZlciBhY2Nlc3NpbmcgdGhlCi0JICoge0BsaW5rICNmTGVnYWN5RXh0ZW5kZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yc30gZmllbGQgZGlyZWN0bHkgc28gYXMgdG8KLQkgKiBmYWNpbGl0YXRlIHRoZSBsYXp5IGluaXRpYWxpemF0aW9uIG9mIHRoZSBmaWVsZC48L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgbGVnYWN5IGV4dGVuZGVkIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0TGVnYWN5RXh0ZW5kZWRDb250ZW50QXNzaXN0UHJvY2Vzc29ycygpIHsKLQkJaWYoZkxlZ2FjeUV4dGVuZGVkQ29udGVudEFzc2lzdFByb2Nlc3NvcnMgPT0gbnVsbCkgewotCQkJZkxlZ2FjeUV4dGVuZGVkQ29udGVudEFzc2lzdFByb2Nlc3NvcnMgPQotCQkJCUV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9ucygKLQkJCQkJCUNPTlRFTlRfQVNTSVNUX1BST0NFU1NPUl9FWFRFTkRFRF9JRCwgZlBhcnRpdGlvblR5cGVJRCk7Ci0JCX0KLQkJCi0JCXJldHVybiBmTGVnYWN5RXh0ZW5kZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yczsKLQl9Ci0JCi0JLyoqCi0JICogPHA+PGI+Tk9URTogPC9iPlRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIG92ZXIgYWNjZXNzaW5nIHRoZSB7QGxpbmsgI2ZDYXRlZ29yaWVzfQotCSAqIGZpZWxkIGRpcmVjdGx5IHNvIGFzIHRvIGZhY2lsaXRhdGUgdGhlIGxhenkgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGZpZWxkLjwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjYXRlZ29yaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGVudCB0eXBlIHRoaXMgcHJvY2Vzc29yIGlzIGFzc29jaWF0ZWQgd2l0aAotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRQcm9wb3NhbENhdGVnb3JpZXMoKSB7Ci0JCWlmKGZDYXRlZ29yaWVzID09IG51bGwpIHsKLQkJCWZDYXRlZ29yaWVzID0KLQkJCQlDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlclJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRQcm9wb3NhbENhdGVnb3JpZXMoZkNvbnRlbnRUeXBlSUQpOwotCQl9Ci0JCQotCQlyZXR1cm4gZkNhdGVnb3JpZXM7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBjb21wbGV0aW9uIGxpc3RlbmVyIGNsYXNzIGZvciB0aGlzIHByb2Nlc3Nvci4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIENvbXBsZXRpb25MaXN0ZW5lciBpbXBsZW1lbnRzIElDb21wbGV0aW9uTGlzdGVuZXIsIElDb21wbGV0aW9uTGlzdGVuZXJFeHRlbnNpb24gewotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25MaXN0ZW5lciNhc3Npc3RTZXNzaW9uU3RhcnRlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgYXNzaXN0U2Vzc2lvblN0YXJ0ZWQoQ29udGVudEFzc2lzdEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQucHJvY2Vzc29yID09IFN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yLnRoaXMgfHwKLQkJCQkJKGV2ZW50LnByb2Nlc3NvciBpbnN0YW5jZW9mIENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvciAmJgotCQkJCQkJCSgoQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yKWV2ZW50LnByb2Nlc3NvcikuY29udGFpbnNQcm9jZXNzb3IoU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IudGhpcykpKSB7Ci0JCQkJCi0JCQkJZkl0ZXJhdGlvbkdlc3R1cmU9IGdldEl0ZXJhdGlvbkdlc3R1cmUoKTsKLQkJCQlLZXlTZXF1ZW5jZSBiaW5kaW5nPSBnZXRJdGVyYXRpb25CaW5kaW5nKCk7Ci0JCi0JCQkJLy8gVGhpcyBtYXkgc2hvdyB0aGUgd2FybmluZyBkaWFsb2cgaWYgYWxsIGNhdGVnb3JpZXMgYXJlIGRpc2FibGVkCi0JCQkJcmVzZXRDYXRlZ29yeUl0ZXJhdGlvbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQ9IFN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yLnRoaXMuZ2V0UHJvcG9zYWxDYXRlZ29yaWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeSBjYXQ9IChDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCQljYXQuc2Vzc2lvblN0YXJ0ZWQoKTsKLQkJCQl9Ci0JCi0JCQkJZlJlcGV0aXRpb249IDA7Ci0JCQkJaWYgKGV2ZW50LmFzc2lzdGFudCBpbnN0YW5jZW9mIElDb250ZW50QXNzaXN0YW50RXh0ZW5zaW9uMikgewotCQkJCQlJQ29udGVudEFzc2lzdGFudEV4dGVuc2lvbjIgZXh0ZW5zaW9uPSAoSUNvbnRlbnRBc3Npc3RhbnRFeHRlbnNpb24yKSBldmVudC5hc3Npc3RhbnQ7Ci0JCi0JCQkJCWlmIChmQ2F0ZWdvcnlJdGVyYXRpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCWV4dGVuc2lvbi5zZXRSZXBlYXRlZEludm9jYXRpb25Nb2RlKGZhbHNlKTsKLQkJCQkJCWV4dGVuc2lvbi5zZXRTaG93RW1wdHlMaXN0KGZhbHNlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWV4dGVuc2lvbi5zZXRSZXBlYXRlZEludm9jYXRpb25Nb2RlKHRydWUpOwotCQkJCQkJZXh0ZW5zaW9uLnNldFN0YXR1c0xpbmVWaXNpYmxlKHRydWUpOwotCQkJCQkJZXh0ZW5zaW9uLnNldFN0YXR1c01lc3NhZ2UoY3JlYXRlSXRlcmF0aW9uTWVzc2FnZSgpKTsKLQkJCQkJCWV4dGVuc2lvbi5zZXRTaG93RW1wdHlMaXN0KHRydWUpOwotCQkJCQkJaWYgKGV4dGVuc2lvbiBpbnN0YW5jZW9mIElDb250ZW50QXNzaXN0YW50RXh0ZW5zaW9uMykgewotCQkJCQkJCUlDb250ZW50QXNzaXN0YW50RXh0ZW5zaW9uMyBleHQzPSAoSUNvbnRlbnRBc3Npc3RhbnRFeHRlbnNpb24zKSBleHRlbnNpb247Ci0JCQkJCQkJKChDb250ZW50QXNzaXN0YW50KSBleHQzKS5zZXRSZXBlYXRlZEludm9jYXRpb25UcmlnZ2VyKGJpbmRpbmcpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uTGlzdGVuZXIjYXNzaXN0U2Vzc2lvbkVuZGVkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhc3Npc3RTZXNzaW9uRW5kZWQoQ29udGVudEFzc2lzdEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQucHJvY2Vzc29yID09IFN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yLnRoaXMgfHwJKGV2ZW50LnByb2Nlc3NvciBpbnN0YW5jZW9mIENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvciAmJiAoKENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvcilldmVudC5wcm9jZXNzb3IpLmNvbnRhaW5zUHJvY2Vzc29yKFN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yLnRoaXMpKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQ9IFN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yLnRoaXMuZ2V0UHJvcG9zYWxDYXRlZ29yaWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeSBjYXQ9IChDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCQljYXQuc2Vzc2lvbkVuZGVkKCk7Ci0JCQkJfQotCQotCQkJCWZDYXRlZ29yeUl0ZXJhdGlvbj0gbnVsbDsKLQkJCQlmUmVwZXRpdGlvbj0gLTE7Ci0JCQkJZkl0ZXJhdGlvbkdlc3R1cmU9IG51bGw7Ci0JCQkJaWYgKGV2ZW50LmFzc2lzdGFudCBpbnN0YW5jZW9mIElDb250ZW50QXNzaXN0YW50RXh0ZW5zaW9uMikgewotCQkJCQlJQ29udGVudEFzc2lzdGFudEV4dGVuc2lvbjIgZXh0ZW5zaW9uPSAoSUNvbnRlbnRBc3Npc3RhbnRFeHRlbnNpb24yKSBldmVudC5hc3Npc3RhbnQ7Ci0JCQkJCWV4dGVuc2lvbi5zZXRTaG93RW1wdHlMaXN0KGZhbHNlKTsKLQkJCQkJZXh0ZW5zaW9uLnNldFJlcGVhdGVkSW52b2NhdGlvbk1vZGUoZmFsc2UpOwotCQkJCQlleHRlbnNpb24uc2V0U3RhdHVzTGluZVZpc2libGUoZmFsc2UpOwotCQkJCQlpZiAoZXh0ZW5zaW9uIGluc3RhbmNlb2YgSUNvbnRlbnRBc3Npc3RhbnRFeHRlbnNpb24zKSB7Ci0JCQkJCQlJQ29udGVudEFzc2lzdGFudEV4dGVuc2lvbjMgZXh0Mz0gKElDb250ZW50QXNzaXN0YW50RXh0ZW5zaW9uMykgZXh0ZW5zaW9uOwotCQkJCQkJKChDb250ZW50QXNzaXN0YW50KSBleHQzKS5zZXRSZXBlYXRlZEludm9jYXRpb25UcmlnZ2VyKG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCwgYm9vbGVhbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCwgYm9vbGVhbiBzbWFydFRvZ2dsZSkgewotCQkJLy9pZ25vcmUKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvbkxpc3RlbmVyRXh0ZW5zaW9uI2Fzc2lzdFNlc3Npb25SZXN0YXJ0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFzc2lzdFNlc3Npb25SZXN0YXJ0ZWQoQ29udGVudEFzc2lzdEV2ZW50IGV2ZW50KSB7Ci0JCQlmUmVwZXRpdGlvbj0gMDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRleHRJbnB1dExpc3RlbmVyIGltcGxlbWVudHMgSVRleHRJbnB1dExpc3RlbmVyIHsKLQotCQkvKioKLQkJICogPHA+U2V0IHRoZSBjb250ZW50IHR5cGUgYmFzZWQgb24gdGhlIG5ldyBkb2N1bWVudCBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbgotCQkgKiBzZXQgeWV0LjwvcD4KLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXIjaW5wdXREb2N1bWVudENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXREb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJCWlmKGZDb250ZW50VHlwZUlEID09IG51bGwpIHsKLQkJCQlpZihuZXdJbnB1dCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKChJU3RydWN0dXJlZERvY3VtZW50KW5ld0lucHV0KTsKLQkJCQkJCWlmKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCQlmQ29udGVudFR5cGVJRCA9IG1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpOwotCQkJCQkJfQotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvKioKLQkJICogPHA+SWdub3JlZDwvcD4KLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXIjaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LAotCQkJCUlEb2N1bWVudCBuZXdJbnB1dCkgewotCQkJLy9pZ25vcmUKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9BYnN0cmFjdERyb3BBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9BYnN0cmFjdERyb3BBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1NDg0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvQWJzdHJhY3REcm9wQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotCi0vKioKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RHJvcEFjdGlvbiBpbXBsZW1lbnRzIElEcm9wQWN0aW9uIHsKLQotCS8qCi0JICogUmVwbGFjZXMgdGFyZ2V0RWRpdG9yJ3MgY3VycmVudCBzZWxlY3Rpb24gYnkgInRleHQiCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5zZXJ0KFN0cmluZyB0ZXh0LCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IG51bGw7Ci0JCUlEb2N1bWVudCBkb2MgPSBudWxsOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQkJSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgdG9vbHMgPSAoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMpIHRhcmdldEVkaXRvci5nZXRBZGFwdGVyKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmNsYXNzKTsKLQkJaWYgKHRvb2xzICE9IG51bGwpIHsKLQkJCWRvYyA9IHRvb2xzLmdldERvY3VtZW50KCk7Ci0JCQlzZWxlY3Rpb24gPSB0b29scy5nZXRTZWxlY3Rpb24oKTsKLQkJfQotCi0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlpZiAodGFyZ2V0RWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIHRhcmdldEVkaXRvcjsKLQkJfQotCQlpZiAodGV4dEVkaXRvciA9PSBudWxsKSB7Ci0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSAoKElBZGFwdGFibGUpIHRhcmdldEVkaXRvcikuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCX0KLQkJaWYgKHRleHRFZGl0b3IgPT0gbnVsbCAmJiB0b29scyAhPSBudWxsICYmIHRvb2xzLmdldEVkaXRvclBhcnQoKSBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSB0b29scy5nZXRFZGl0b3JQYXJ0KCk7Ci0JCX0KLQkJaWYgKHRleHRFZGl0b3IgPT0gbnVsbCAmJiB0b29scyAhPSBudWxsICYmIHRvb2xzLmdldEVkaXRvclBhcnQoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSB0b29scy5nZXRFZGl0b3JQYXJ0KCkuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCX0KLQotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgJiYgdGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCX0KLQkJaWYgKGRvYyA9PSBudWxsICYmIHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJZG9jID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJdHJ5IHsKLQkJCQlkb2MucmVwbGFjZSh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpLCB0ZXh0KTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwgJiYgdGV4dFNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgc3AgPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlJVGV4dFNlbGVjdGlvbiBzZWwgPSBuZXcgVGV4dFNlbGVjdGlvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0Lmxlbmd0aCgpKTsKLQkJCXNwLnNldFNlbGVjdGlvbihzZWwpOwotCQkJdGV4dEVkaXRvci5zZWxlY3RBbmRSZXZlYWwoc2VsLmdldE9mZnNldCgpLCBzZWwuZ2V0TGVuZ3RoKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0ZWREYXRhKE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJ1bihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQsIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvQ2FyZXRNZWRpYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0NhcmV0TWVkaWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNmMDMxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvQ2FyZXRNZWRpYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50cy5DYXJldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudmlldy5ldmVudHMuSUNhcmV0TGlzdGVuZXI7Ci0KLS8qKgotICogSGFzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBsaXN0ZW5pbmcgZm9yIGtleSBldmVudHMsIGFuZCBtb3VzZSBldmVudHMsCi0gKiBkZWNpZGluZyBpZiB0aGUgY2FyZXQgaGFzIG1vdmVkICh3aXRob3V0IGEgdGV4dCBjaGFuZ2UpLCBhbmQgaWYgc28sIHdpbGwKLSAqIG5vdGlmeSBDYXJldExpc3RlbmVycyB0aGF0IHRoZSBjYXJldCBoYXMgbW92ZWQuIE9iamVjdHMgd2hpY2ggYXJlCi0gKiBpbnRlcmVzdGVkIGluIEFMTCBjYXJldCBwb3N0aW9uIGNoYW5nZXMgd2lsbCBhbHNvIGhhdmUgdG8gbGlzdGVuIGZvcgotICogdGV4dENoYW5nZWQgZXZlbnRzLgotICogCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBiYXNlIHNlbGVjdGlvbiBub3RpZmljYXRpb24KLSAqLwotcHVibGljIGNsYXNzIENhcmV0TWVkaWF0b3IgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQljbGFzcyBDYXJldE1lZGlhdG9yTGlzdGVuZXIgaW1wbGVtZW50cyBLZXlMaXN0ZW5lciwgTW91c2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJaW50ZXJuYWxLZXlQcmVzc2VkKGUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJaW50ZXJuYWxLZXlSZWxlYXNlZChlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQlpbnRlcm5hbE1vdXNlRG93bihlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQlpbnRlcm5hbE1vdXNlVXAoZSk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBSZWZyZXNoRGVsYXlKb2IgZXh0ZW5kcyBKb2IgewotCQlwcml2YXRlIGludCBmRGVsYXkgPSAwOwotCQlSZWZyZXNoRGVsYXlKb2IoaW50IGRlbGF5KSB7Ci0JCQlzdXBlcihTU0VVSU1lc3NhZ2VzLmNhcmV0X3VwZGF0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJCWZEZWxheSA9IGRlbGF5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldHVwIGEgZGVsYXllZCBDYXJldEV2ZW50IGZpcmluZwotCQkgKi8KLQkJdm9pZCB0b3VjaCgpIHsKLQkJCWNhbmNlbCgpOwotCQkJc2NoZWR1bGUoZkRlbGF5KTsKLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCWhhbmRsZUV2ZW50KG51bGwpOwotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0JCi0JUmVmcmVzaERlbGF5Sm9iIGZEZWxheWVyID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVMQVkgPSAzMDA7Ci0KLQkvKiogdXNlZCBqdXN0IGZvciBkZWJ1ZyBwcmludCBvdXRzICovCi0JcHJpdmF0ZSBsb25nIGVuZFRpbWU7Ci0JcHJpdmF0ZSBsb25nIHN0YXJ0VGltZTsKLQotCXByb3RlY3RlZCBJQ2FyZXRMaXN0ZW5lcltdIGZDYXJldExpc3RlbmVyczsKLQlwcm90ZWN0ZWQgQ2FyZXRNZWRpYXRvckxpc3RlbmVyIGludGVybmFsTGlzdGVuZXI7Ci0JcHJvdGVjdGVkIFN0eWxlZFRleHQgdGV4dFdpZGdldDsKLQotCS8qKgotCSAqIENhcmV0TWVkaWF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ2FyZXRNZWRpYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYXJldE1lZGlhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuIE11c3QgYWx3YXlzIHByb3ZpZGUgdGhlIHdpZGdldCBpdHMKLQkgKiBzdXBwb3NlZCB0byBsaXN0ZW4gdG8uCi0JICovCi0JcHVibGljIENhcmV0TWVkaWF0b3IoU3R5bGVkVGV4dCBzdHlsZWRUZXh0V2lkZ2V0KSB7Ci0JCXRoaXMoKTsKLQkJc2V0VGV4dFdpZGdldChzdHlsZWRUZXh0V2lkZ2V0KTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQ2FyZXRMaXN0ZW5lcihJQ2FyZXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2FyZXRNZWRpYXRvcjo6YWRkQ2FyZXRMaXN0ZW5lci4gUmVxdWVzdCB0byBhZGQgYW4gaW5zdGFuY2Ugb2YgIiArIGxpc3RlbmVyLmdldENsYXNzKCkgKyAiIGFzIGEgbGlzdGVuZXIgb24gY2FyZXRsaXN0bmVyLiIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gbWFrZSBzdXJlIGxpc3RlbmVyIGlzIG5vdCBhbHJlYWR5IGluIGxpc3RlbmluZyBhcnJheQotCQkvLyAoYW5kIGlmIGl0IGlzLCBwcmludCBhIHdhcm5pbmcgdG8gYWlkIGRlYnVnZ2luZywgaWYgbmVlZGVkKQotCi0JCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZkNhcmV0TGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhcmV0TWVkaWF0b3I6OmFkZENhcmV0TGlzdGVuZXIuIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgd2FzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLiAiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYXJldE1lZGlhdG9yOjphZGRDYXJldExpc3RlbmVyLiBBZGRpbmcgYW4gaW5zdGFuY2Ugb2YgIiArIGxpc3RlbmVyLmdldENsYXNzKCkgKyAiIGFzIGEgbGlzdGVuZXIgb24gY2FyZXQgbWVkaWF0b3IuIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBvbGRTaXplID0gMDsKLQkJCWlmIChmQ2FyZXRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCS8vIG5vcm1hbGx5IHdvbid0IGJlIG51bGwsIGJ1dCB3ZSBuZWVkIHRvIGJlIHN1cmUsIGZvciBmaXJzdAotCQkJCS8vIHRpbWUgdGhyb3VnaAotCQkJCW9sZFNpemUgPSBmQ2FyZXRMaXN0ZW5lcnMubGVuZ3RoOwotCQkJfQotCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCUlDYXJldExpc3RlbmVyW10gbmV3TGlzdGVuZXJzID0gbmV3IElDYXJldExpc3RlbmVyW25ld1NpemVdOwotCQkJaWYgKGZDYXJldExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShmQ2FyZXRMaXN0ZW5lcnMsIDAsIG5ld0xpc3RlbmVycywgMCwgb2xkU2l6ZSk7Ci0JCQl9Ci0JCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJbmV3TGlzdGVuZXJzW25ld1NpemUgLSAxXSA9IGxpc3RlbmVyOwotCQkJLy8KLQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCWZDYXJldExpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUNhcmV0RXZlbnQoQ2FyZXRFdmVudCBldmVudCkgewotCQlpZiAoZkNhcmV0TGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSB0byBiZSB0aHJlYWQgc2FmZSwKLQkJCS8vIHNpbmNlIHRoZSBhZGQgYW5kIHJlbW92ZSBsaXN0bmVyIG1ldGhvZHMKLQkJCS8vIGNhbiBjaGFuZ2UgdGhpcyBvYmplY3QncyBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5Ci0JCQkvLyBmcm9tIGFub3RoZXIgdGhyZWFkCi0JCQkvLyAoYW5kIHNpbmNlIG9iamVjdCBhc3NpZ25tZW50IGlzIGF0b21pYywgd2UgZG9uJ3QgbmVlZCB0bwotCQkJLy8gc3luY2hyb25pemUKLQkJCUlDYXJldExpc3RlbmVyW10gaG9sZExpc3RlbmVycyA9IGZDYXJldExpc3RlbmVyczsKLQkJCS8vCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlob2xkTGlzdGVuZXJzW2ldLmNhcmV0TW92ZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBudWxsOwotCi0JCWlmIChEZWJ1Zy5kZWJ1Z0NhcmV0TWVkaWF0b3IpIHsKLQkJCWVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGltZXIgZmlyZWQ6ICIgKyAoZW5kVGltZSAtIHN0YXJ0VGltZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBjaGVjayBpZiAnb2tUb1VzZScKLQkJaWYgKHRleHRXaWRnZXQgIT0gbnVsbCAmJiAhdGV4dFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWRpc3BsYXkgPSB0ZXh0V2lkZ2V0LmdldERpc3BsYXkoKTsKLQkJCWlmICgoZGlzcGxheSAhPSBudWxsKSAmJiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKHRleHRXaWRnZXQgIT0gbnVsbCAmJiAhdGV4dFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlmaXJlQ2FyZXRFdmVudChuZXcgQ2FyZXRFdmVudCh0ZXh0V2lkZ2V0LCB0ZXh0V2lkZ2V0LmdldENhcmV0T2Zmc2V0KCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxLZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJZkRlbGF5ZXIuY2FuY2VsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxLZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCXN3aXRjaCAoZS5rZXlDb2RlKSB7Ci0JCQljYXNlIFNXVC5BUlJPV19ET1dOIDoKLQkJCWNhc2UgU1dULkFSUk9XX1VQIDoKLQkJCWNhc2UgU1dULkFSUk9XX0xFRlQgOgotCQkJY2FzZSBTV1QuQVJST1dfUklHSFQgOgotCQkJY2FzZSBTV1QuSE9NRSA6Ci0JCQljYXNlIFNXVC5FTkQgOgotCQkJY2FzZSBTV1QuUEFHRV9ET1dOIDoKLQkJCWNhc2UgU1dULlBBR0VfVVAgOiB7Ci0JCQkJZkRlbGF5ZXIudG91Y2goKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJLy8gYWx3YXlzIHVwZGF0ZSBjdXJzb3IgcG9zdGlvbiwgZXZlbiBkdXJpbmcgbm9ybWFsIHR5cGluZwotCQkJCS8vICh0aGUgbG9naWMgbWF5IGxvb2sgZnVubnksIHNpbmNlIHdlIGFsd2F5cyB0byB0aGUgc2FtZQotCQkJCS8vIHRoaW5nLCBidXQgd2UgaGF2ZW4ndCBhbHdheXMgZG9uZSB0aGUgc2FtZSB0aGluZywgc28gSQotCQkJCS8vIHdhbnRlZCB0byBsZWF2ZSB0aGF0IGZhY3QgZG9jdW1lbnRlZCB2aWEgY29kZS4pCi0JCQkJZkRlbGF5ZXIudG91Y2goKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGludGVybmFsTW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQlmRGVsYXllci5jYW5jZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbE1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCS8vIE5vdGUsIGV2ZW4gZHVyaW5nIGEgc3dpcGUgc2VsZWN0LCB3aGVuIHRoZSBtb3VzZSBidXR0b24gZ29lcyB1cCwKLQkJLy8gYW5kIHRoZSB3aWRnZXQgaXMKLQkJLy8gcXVlcmllZCBmb3IgdGhlIGN1cnJlbnQgY2FyZXQgcG9zdGlvbiwgaXQgYWx3YXlzIHJldHVybnMgdGhlCi0JCS8vIGJlZ2lubmluZyBvZiB0aGUgc2VsZWN0aW9uLAotCQkvLyB3aGljaCBpcyBkZXNpcmFibGUgKGF0IGxlYXN0IGZvciB0aGUga25vd24gdXNlIG9mIHRoaXMgZmVhdHVyZSwKLQkJLy8gd2hpY2ggaXMgdG8gc2lnbmFsCi0JCS8vIHRoYXQgdGhlIHByb3BlcnR5IHNoZWV0IGNhbiB1cGRhdGUgaXRzZWxmLgotCQlmRGVsYXllci50b3VjaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWZEZWxheWVyLmNhbmNlbCgpOwotCQlpZiAodGV4dFdpZGdldCAhPSBudWxsICYmICF0ZXh0V2lkZ2V0LmlzRGlzcG9zZWQoKSkgewotCQkJdGV4dFdpZGdldC5yZW1vdmVLZXlMaXN0ZW5lcihpbnRlcm5hbExpc3RlbmVyKTsKLQkJCXRleHRXaWRnZXQucmVtb3ZlTW91c2VMaXN0ZW5lcihpbnRlcm5hbExpc3RlbmVyKTsKLQkJCXRleHRXaWRnZXQgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUNhcmV0TGlzdGVuZXIoSUNhcmV0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKChmQ2FyZXRMaXN0ZW5lcnMgIT0gbnVsbCkgJiYgKGxpc3RlbmVyICE9IG51bGwpKSB7Ci0JCQkvLyBpZiBpdHMgbm90IGluIHRoZSBsaXN0ZW5lcnMsIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmQ2FyZXRMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCWludCBvbGRTaXplID0gZkNhcmV0TGlzdGVuZXJzLmxlbmd0aDsKLQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJCUlDYXJldExpc3RlbmVyW10gbmV3TGlzdGVuZXJzID0gbmV3IElDYXJldExpc3RlbmVyW25ld1NpemVdOwotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRTaXplOyBpKyspIHsKLQkJCQkJaWYgKGZDYXJldExpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikgeyAvLyBpZ25vcmUKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlIHJlbW92aW5nCi0JCQkJCQluZXdMaXN0ZW5lcnNbaW5kZXgrK10gPSBmQ2FyZXRMaXN0ZW5lcnNbaV07Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3Mgc3dpdGNoIGl0IGZvciB0aGUgb2xkCi0JCQkJLy8gb25lCi0JCQkJZkNhcmV0TGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dFdpZGdldChTdHlsZWRUZXh0IG5ld1RleHRXaWRnZXQpIHsKLQkJaWYoZkRlbGF5ZXIgPT0gbnVsbCkgewotCQkJZkRlbGF5ZXIgPSBuZXcgUmVmcmVzaERlbGF5Sm9iKERFTEFZKTsKLQkJfQotCi0JCS8vIHVuaG9vayBmcm9tIHByZXZpb3VzLCBpZiBhbnkKLQkJaWYgKHRoaXMudGV4dFdpZGdldCAhPSBudWxsKSB7Ci0JCQlmRGVsYXllci5jYW5jZWwoKTsKLQkJCXRoaXMudGV4dFdpZGdldC5yZW1vdmVLZXlMaXN0ZW5lcihpbnRlcm5hbExpc3RlbmVyKTsKLQkJCXRoaXMudGV4dFdpZGdldC5yZW1vdmVNb3VzZUxpc3RlbmVyKGludGVybmFsTGlzdGVuZXIpOwotCQl9Ci0KLQkJdGhpcy50ZXh0V2lkZ2V0ID0gbmV3VGV4dFdpZGdldDsKLQotCQlpZiAoaW50ZXJuYWxMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlpbnRlcm5hbExpc3RlbmVyID0gbmV3IENhcmV0TWVkaWF0b3JMaXN0ZW5lcigpOwotCQl9Ci0KLQkJaWYgKHRoaXMudGV4dFdpZGdldCAhPSBudWxsKSB7Ci0JCQl0aGlzLnRleHRXaWRnZXQuYWRkS2V5TGlzdGVuZXIoaW50ZXJuYWxMaXN0ZW5lcik7Ci0JCQl0aGlzLnRleHRXaWRnZXQuYWRkTW91c2VMaXN0ZW5lcihpbnRlcm5hbExpc3RlbmVyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9FeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWM2ZmE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9FeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBTaW1wbGUgZ2VuZXJpYyBJRCB0byBjbGFzcyB0byBtYXBwaW5nLiBMb2FkcyBhIHNwZWNpZmllZCBjbGFzcyBkZWZpbmVkIGluIGEKLSAqIGNvbmZpZ3VyYXRpb24gZWxlbWVudCB3aXRoIHRoZSBtYXRjaGluZyB0eXBlIGFuZCB0YXJnZXQgSUQuIEV4YW1wbGUKLSAqIHBsdWdpbi54bWwgc2VjdGlvbjoKLSAqIAotICogJmx0O2V4dGVuc2lvbgotICogcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uJnF1b3Q7Jmd0O2NvbnRlbnRvdXRsaW5lY29uZmlndXJhdGlvbgotICogdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UuZHRkLmNvcmUuZHRkc291cmNlJnF1b3Q7Ci0gKiBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmR0ZC52aWV3cy5jb250ZW50b3V0bGluZS5EVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24mcXVvdDsvJmd0OwotICogJmx0Oy9leHRlbnNpb24mZ3Q7Ci0gKiAKLSAqIFVzZWQgaW4gY29kZSBieSBnZXRDb25maWd1cmF0aW9uKCZxdW90O2NvbnRlbnRvdXRsaW5lY29uZmlndXJhdGlvbiZxdW90OywKLSAqICZxdW90O29yZy5lY2xpcHNlLndzdC5kdGQudWkuU3RydWN0dXJlZFRleHRFZGl0b3JEVEQmcXVvdDspOwotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCS8qKgotCSAqIEV4dGVuc2lvbiB0eXBlIHRvIHBhc3MgaW50byBnZXRDb25maWd1cmF0aW9ucyB0byBnZXQgY29udGVudCBvdXRsaW5lCi0JICogY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRPVVRMSU5FQ09ORklHVVJBVElPTiA9ICJjb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogRXh0ZW5zaW9uIHR5cGUgdG8gcGFzcyBpbnRvIGdldENvbmZpZ3VyYXRpb25zIHRvIGdldCBwcm9wZXJ0eSBzaGVldAotCSAqIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWVNIRUVUQ09ORklHVVJBVElPTiA9ICJwcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBFeHRlbnNpb24gdHlwZSB0byBwYXNzIGludG8gZ2V0Q29uZmlndXJhdGlvbnMgdG8gZ2V0IHNvdXJjZSB2aWV3ZXIKLQkgKiBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFVklFV0VSQ09ORklHVVJBVElPTiA9ICJzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEV4dGVuc2lvbiB0eXBlIHRvIHBhc3MgaW50byBnZXRDb25maWd1cmF0aW9ucyB0byBnZXQgZG9jdW1lbnRhdGlvbiB0ZXh0Ci0JICogaG92ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVEFUSU9OVEVYVEhPVkVSID0gImRvY3VtZW50YXRpb25UZXh0SG92ZXIiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogRXh0ZW5zaW9uIHR5cGUgdG8gcGFzcyBpbnRvIGdldENvbmZpZ3VyYXRpb25zIHRvIGdldCBkb3VibGUgY2xpY2sKLQkgKiBzdHJhdGVneQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRUNMSUNLU1RSQVRFR1kgPSAiZG91YmxlQ2xpY2tTdHJhdGVneSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBFeHRlbnNpb24gdHlwZSB0byBwYXNzIGludG8gZ2V0Q29uZmlndXJhdGlvbnMgdG8gZ2V0IHF1aWNrIG91dGxpbmUKLQkgKiBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVJQ0tPVVRMSU5FQ09ORklHVVJBVElPTiA9ICJxdWlja091dGxpbmVDb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RBUkdFVCA9ICJ0YXJnZXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT04gPSAicHJvdmlzaW9uYWxDb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIE1hcCBjb25maWd1cmF0aW9uTWFwID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnVGltZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkY29uZmlndXJhdGlvbmJ1aWxkZXIvdGltZSIpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZJTklUSU9OID0gInByb3Zpc2lvbmFsRGVmaW5pdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVBfRVhURU5ERURDT05GSUdVUkFUSU9OID0gImVkaXRvckNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlciBpbnN0YW5jZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGV4dGVuc2lvbi4gSWYgdGhlIGV4dGVuc2lvbiBwbHVnaW4gaGFzIG5vdCBiZWVuIGxvYWRlZCBhCi0JICogYnVzeSBjdXJzb3Igd2lsbCBiZSBhY3RpdmF0ZWQgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgbG9hZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGNvbmZpZyBlbGVtZW50IGRlZmluaW5nIHRoZSBleHRlbnNpb24KLQkgKiBAcGFyYW0gY2xhc3NBdHRyaWJ1dGUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgY2FycnlpbmcgdGhlIGNsYXNzCi0JICogQHJldHVybnMgdGhlIGV4dGVuc2lvbiBvYmplY3QgaWYgc3VjY2Vzc2Z1bC4gSWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4KLQkgKiAgICAgICAgICBjcmVhdGVpbmcgZXhlY3V0YWJsZSBleHRlbnNpb24sIHRoZSBleGNlcHRpb24gaXMgbG9nZ2VkLCBhbmQKLQkgKiAgICAgICAgICBudWxsIHJldHVybmVkLgotCSAqLwotCXN0YXRpYyBPYmplY3QgY3JlYXRlRXh0ZW5zaW9uKGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBmaW5hbCBTdHJpbmcgY2xhc3NBdHRyaWJ1dGUsIGZpbmFsIFN0cmluZyB0YXJnZXRJRCkgewotCQlmaW5hbCBPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzFdOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJaWYgKGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0WzBdID0gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYXNzQXR0cmlidXRlKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGNhdGNoIGFuZCBsb2cgQU5ZIGV4Y2VwdGlvbiB3aGlsZSBjcmVhdGluZyB0aGUgZXh0ZW5zaW9uCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXJyb3IgbG9hZGluZyBjbGFzcyAiICsgY2xhc3NBdHRyaWJ1dGUgKyAiIGZvciAiICsgdGFyZ2V0SUQsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKG51bGwsIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRbMF0gPSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oY2xhc3NBdHRyaWJ1dGUpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gY2F0Y2ggYW5kIGxvZyBBTlkgZXhjZXB0aW9uIGZyb20gZXh0ZW5zaW9uIHBvaW50Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJlcnJvciBsb2FkaW5nIGNsYXNzICIgKyBjbGFzc0F0dHJpYnV0ZSArICIgZm9yICIgKyB0YXJnZXRJRCwgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFswXTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCWxvbmcgdGltZTAgPSAwOwotCi0JcHJpdmF0ZSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdCBjcmVhdGVDb25maWd1cmF0aW9ucyhMaXN0IGNvbmZpZ3VyYXRpb25zLCBTdHJpbmcgZXh0ZW5zaW9uVHlwZSwgU3RyaW5nIHRhcmdldElEKSB7Ci0JCWlmIChjb25maWd1cmF0aW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoMCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9ucy5zaXplKCk7IGkrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBjb25maWd1cmF0aW9ucy5nZXQoaSk7Ci0JCQlpZiAoKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhleHRlbnNpb25UeXBlKSB8fCAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKENPTkZJR1VSQVRJT04pICYmIGV4dGVuc2lvblR5cGUuZXF1YWxzKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFKSkpKSkgewotCQkJCVN0cmluZ1tdIHRhcmdldHMgPSBTdHJpbmdVdGlscy51bnBhY2soZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1RBUkdFVCkpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdGFyZ2V0cy5sZW5ndGg7IGorKykgewotCQkJCQlpZiAodGFyZ2V0SUQuZXF1YWxzKHRhcmdldHNbal0udHJpbSgpKSkgewotCQkJCQkJT2JqZWN0IG8gPSBjcmVhdGVFeHRlbnNpb24oZWxlbWVudCwgQVRUX0NMQVNTLCB0YXJnZXRJRCk7Ci0JCQkJCQlpZiAobyAhPSBudWxsKSB7Ci0JCQkJCQkJcmVzdWx0LmFkZChvKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZmluZENvbmZpZ3VyYXRpb25FbGVtZW50cyhMaXN0IGNvbmZpZ3VyYXRpb25zLCBTdHJpbmcgZXh0ZW5zaW9uVHlwZSwgU3RyaW5nIHRhcmdldElEKSB7Ci0JCWlmIChjb25maWd1cmF0aW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbMF07Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9ucy5zaXplKCk7IGkrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBjb25maWd1cmF0aW9ucy5nZXQoaSk7Ci0JCQlpZiAoKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhleHRlbnNpb25UeXBlKSB8fCAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKERFRklOSVRJT04pICYmIGV4dGVuc2lvblR5cGUuZXF1YWxzKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFKSkpKSkgewotCQkJCVN0cmluZ1tdIHRhcmdldHMgPSBTdHJpbmdVdGlscy51bnBhY2soZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1RBUkdFVCkpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdGFyZ2V0cy5sZW5ndGg7IGorKykgewotCQkJCQlpZiAodGFyZ2V0SUQuZXF1YWxzKHRhcmdldHNbal0udHJpbSgpKSkgewotCQkJCQkJcmVzdWx0LmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKElDb25maWd1cmF0aW9uRWxlbWVudFtdKSByZXN1bHQudG9BcnJheShuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29uZmlndXJhdGlvbiBmb3IgdGhlIGdpdmVuIGV4dGVuc2lvblR5cGUgbWF0Y2hpbmcgdGhlCi0JICogdGFyZ2V0SUQsIGlmIG9uZSBpcyBhdmFpbGFibGUuIElmIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBpcwotCSAqIGRlZmluZWQsIHRoZSBmaXJzdCBvbmUgZm91bmQgaXMgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIGV4dGVuc2lvblR5cGUKLQkgKiBAcGFyYW0gdGFyZ2V0SUQKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJhdGlvbiBvYmplY3QsIGlmIG9uZSB3YXMgZGVmaW5lZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29uZmlndXJhdGlvbihTdHJpbmcgZXh0ZW5zaW9uVHlwZSwgU3RyaW5nIHRhcmdldElEKSB7Ci0JCWlmICh0YXJnZXRJRCA9PSBudWxsIHx8IHRhcmdldElELmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCBjb25maWd1cmF0aW9ucyA9IGdldENvbmZpZ3VyYXRpb25zKGV4dGVuc2lvblR5cGUsIHRhcmdldElEKTsKLQkJaWYgKGNvbmZpZ3VyYXRpb25zLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY29uZmlndXJhdGlvbnMuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgZ2l2ZW4gZXh0ZW5zaW9uVHlwZSBtYXRjaGluZyB0aGUKLQkgKiB0YXJnZXRJRCwgaWYgYW55IGFyZSBhdmFpbGFibGUuCi0JICogCi0JICogQHBhcmFtIGV4dGVuc2lvblR5cGUKLQkgKiBAcGFyYW0gdGFyZ2V0SUQKLQkgKiBAcmV0dXJuIGEgTGlzdCBvZiBjb25maWd1cmF0aW9uIG9iamVjdHMsIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIGVtcHR5Ci0JICovCi0JcHVibGljIExpc3QgZ2V0Q29uZmlndXJhdGlvbnMoU3RyaW5nIGV4dGVuc2lvblR5cGUsIFN0cmluZyB0YXJnZXRJRCkgewotCQlpZiAodGFyZ2V0SUQgPT0gbnVsbCB8fCB0YXJnZXRJRC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoMCk7Ci0JCWlmIChjb25maWd1cmF0aW9uTWFwID09IG51bGwpIHsKLQkJCWNvbmZpZ3VyYXRpb25NYXAgPSBuZXcgSGFzaE1hcCgwKTsKLQkJCXN5bmNocm9uaXplZCAoY29uZmlndXJhdGlvbk1hcCkgewotCQkJCXJlYWRSZWdpc3RyeShQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLCBTU0VVSVBsdWdpbi5JRCwgRVBfRVhURU5ERURDT05GSUdVUkFUSU9OKTsKLQkJCQlpZiAoZGVidWdUaW1lKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjcmVhZFJlZ2lzdHJ5KCk6ICAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlMaXN0IGV4dGVuc2lvbnMgPSAoTGlzdCkgY29uZmlndXJhdGlvbk1hcC5nZXQoZXh0ZW5zaW9uVHlwZSk7Ci0JCUxpc3QgY29uZmlndXJhdGlvbnMgPSBjcmVhdGVDb25maWd1cmF0aW9ucyhleHRlbnNpb25zLCBleHRlbnNpb25UeXBlLCB0YXJnZXRJRCk7Ci0JCWlmIChkZWJ1Z1RpbWUpIHsKLQkJCWlmICghY29uZmlndXJhdGlvbnMuaXNFbXB0eSgpKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjZ2V0Q29uZmlndXJhdGlvbigiICsgZXh0ZW5zaW9uVHlwZSArICIsICIgKyB0YXJnZXRJRCArICIpOiBjb25maWd1cmF0aW9ucyBsb2FkZWQgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQllbHNlCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNnZXRDb25maWd1cmF0aW9uKCIgKyBleHRlbnNpb25UeXBlICsgIiwgIiArIHRhcmdldElEICsgIik6IHJhbiBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfQotCQlyZXR1cm4gY29uZmlndXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgZGVjbGFyZWQgZGVmaW5pdGlvbnMgZm9yIHRoZSBnaXZlbiBleHRlbnNpb25UeXBlIG1hdGNoaW5nCi0JICogdGhlIHRhcmdldElELCBpZiBhbnkgYXJlIGF2YWlsYWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uVHlwZQotCSAqIEBwYXJhbSB0YXJnZXRJRAotCSAqIEByZXR1cm4gQW4gYXJyYXkgY29udGFpbmluZyB0aGUgZGVmaW5pdGlvbnMsIGVtcHR5IGlmIG5vbmUgd2VyZQotCSAqICAgICAgICAgZGVjbGFyZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RGVmaW5pdGlvbnMoU3RyaW5nIGV4dGVuc2lvblR5cGUsIFN0cmluZyB0YXJnZXRJRCkgewotCQlpZiAodGFyZ2V0SUQgPT0gbnVsbCB8fCB0YXJnZXRJRC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCWlmIChkZWJ1Z1RpbWUpIHsKLQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJaWYgKGNvbmZpZ3VyYXRpb25NYXAgPT0gbnVsbCkgewotCQkJY29uZmlndXJhdGlvbk1hcCA9IG5ldyBIYXNoTWFwKDApOwotCQkJc3luY2hyb25pemVkIChjb25maWd1cmF0aW9uTWFwKSB7Ci0JCQkJcmVhZFJlZ2lzdHJ5KFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCksIFNTRVVJUGx1Z2luLklELCBFUF9FWFRFTkRFRENPTkZJR1VSQVRJT04pOwotCQkJCWlmIChkZWJ1Z1RpbWUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNyZWFkUmVnaXN0cnkoKTogICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUxpc3QgZGVmaW5pdGlvbnMgPSAoTGlzdCkgY29uZmlndXJhdGlvbk1hcC5nZXQoZXh0ZW5zaW9uVHlwZSk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gZmluZENvbmZpZ3VyYXRpb25FbGVtZW50cyhkZWZpbml0aW9ucywgZXh0ZW5zaW9uVHlwZSwgdGFyZ2V0SUQpOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW2VsZW1lbnRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2YWx1ZXNbaV0gPSBlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoVkFMVUUpOwotCQl9Ci0JCWlmIChkZWJ1Z1RpbWUpIHsKLQkJCWlmICh2YWx1ZXMubGVuZ3RoID4gMCkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2dldERlZmluaXRpb25zKCIgKyBleHRlbnNpb25UeXBlICsgIiwgIiArIHRhcmdldElEICsgIik6IGRlZmluaXRpb24gbG9hZGVkIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJZWxzZQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjZ2V0RGVmaW5pdGlvbnMoIiArIGV4dGVuc2lvblR5cGUgKyAiLCAiICsgdGFyZ2V0SUQgKyAiKTogcmFuIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl9Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJaWYgKG5hbWUuZXF1YWxzKENPTkZJR1VSQVRJT04pIHx8IG5hbWUuZXF1YWxzKERFRklOSVRJT04pKQotCQkJbmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFKTsKLQkJTGlzdCBjb25maWd1cmF0aW9ucyA9IChMaXN0KSBjb25maWd1cmF0aW9uTWFwLmdldChuYW1lKTsKLQkJaWYgKGNvbmZpZ3VyYXRpb25zID09IG51bGwpIHsKLQkJCWNvbmZpZ3VyYXRpb25zID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCWNvbmZpZ3VyYXRpb25NYXAucHV0KG5hbWUsIGNvbmZpZ3VyYXRpb25zKTsKLQkJfQotCQljb25maWd1cmF0aW9ucy5hZGQoZWxlbWVudCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI3NzY0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklLZXlCaW5kaW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uQWN0aW9uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5JRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSByZWdpc3RyeSBmb3IgZXh0ZW5zaW9ucyB0aGF0IHBsdWcgaW50byAnZWRpdG9yQWN0aW9ucycKLSAqIGV4dGVuc2lvbiBwb2ludC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0JcHVibGljIGNsYXNzIEV4dGVuZGVkQ29udHJpYnV0b3IgaW1wbGVtZW50cyBJRXh0ZW5kZWRDb250cmlidXRvciwgSU1lbnVMaXN0ZW5lciB7Ci0JCXByaXZhdGUgSUV4dGVuZGVkU2ltcGxlRWRpdG9yIGFjdGl2ZUV4dGVuZGVkRWRpdG9yID0gbnVsbDsKLQotCQlwcml2YXRlIExpc3QgY2FjaGU7Ci0JCXByaXZhdGUgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXByaXZhdGUgSU1lbnVNYW5hZ2VyIG1lbnVCYXIgPSBudWxsOwotCi0JCXByaXZhdGUgU2V0IG1lbnVzID0gbmV3IEhhc2hTZXQoKTsKLQotCQlwdWJsaWMgRXh0ZW5kZWRDb250cmlidXRvcihMaXN0IGNhY2hlKSB7Ci0JCQl0aGlzLmNhY2hlID0gY2FjaGU7Ci0JCX0KLQotCQlwcml2YXRlIElFeHRlbmRlZFNpbXBsZUVkaXRvciBjb21wdXRlRXh0ZW5kZWRFZGl0b3IoZmluYWwgSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCQlJRXh0ZW5kZWRTaW1wbGVFZGl0b3Igc2ltcGxlRWRpdG9yID0gbnVsbDsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IpIHsKLQkJCQlzaW1wbGVFZGl0b3IgPSAoSUV4dGVuZGVkU2ltcGxlRWRpdG9yKSBlZGl0b3I7Ci0JCQl9Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgc2ltcGxlRWRpdG9yID09IG51bGwpIHsKLQkJCQlmaW5hbCBJU291cmNlRWRpdGluZ1RleHRUb29scyB0b29scyA9IChJU291cmNlRWRpdGluZ1RleHRUb29scykgZWRpdG9yLmdldEFkYXB0ZXIoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuY2xhc3MpOwotCQkJCWlmICh0b29scyAhPSBudWxsKSB7Ci0JCQkJCXNpbXBsZUVkaXRvciA9IG5ldyBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IoKSB7Ci0JCQkJCQlwdWJsaWMgaW50IGdldENhcmV0UG9zaXRpb24oKSB7Ci0JCQkJCQkJcmV0dXJuIHRvb2xzLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCQkJCQkJcmV0dXJuIHRvb2xzLmdldERvY3VtZW50KCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyBJRWRpdG9yUGFydCBnZXRFZGl0b3JQYXJ0KCkgewotCQkJCQkJCXJldHVybiB0b29scy5nZXRFZGl0b3JQYXJ0KCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb25SYW5nZSgpIHsKLQkJCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0b29scy5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlyZXR1cm4gbmV3IFBvaW50KHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldE9mZnNldCgpICsgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCX0KLQotCQkJCQl9OwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzaW1wbGVFZGl0b3I7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCQltZW51QmFyID0gbWVudTsKLQkJCWxvbmcgdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGUuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gY2FjaGUuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IG1lbnVFbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgb2JqOwotCQkJCQlpZiAoKG1lbnVFbGVtZW50LmdldE5hbWUoKSkuZXF1YWxzKFRBR19NRU5VKSkgewotCQkJCQkJY29udHJpYnV0ZU1lbnUobWVudUVsZW1lbnQsIG1lbnUsIHRydWUpOwotCQkJCQkJaWYgKGRlYnVnTWVudSkKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NvbnRyaWJ1dGVUb01lbnUoKSBhZGRlZDogIiArIG1lbnVFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGlvbkRlc2NyaXB0b3IpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUFjdGlvbkRlc2NyaXB0b3IgYWQgPSAoQWN0aW9uRGVzY3JpcHRvcikgb2JqOwotCQkJCQkJSU1lbnVNYW5hZ2VyIG1tID0gY29udHJpYnV0ZU1lbnVBY3Rpb24oYWQsIG1lbnUsIHRydWUsIGZhbHNlKTsKLQkJCQkJCWlmIChtbSAhPSBudWxsKSB7Ci0JCQkJCQkJbWFwLnB1dChhZC5nZXRDb250cmlidXRpb25JdGVtKCksIG1tKTsKLQkJCQkJCQltbS5hZGRNZW51TGlzdGVuZXIodGhpcyk7Ci0JCQkJCQkJbWVudXMuYWRkKG1tKTsKLQkJCQkJCQlpZiAoZGVidWdNZW51KQotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NvbnRyaWJ1dGVUb01lbnUoKSBhZGRlZDogIiArIGFkLmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJjb250cmlidXRpbmcgdG8gbWVudSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGVidWdDb250cmlidXRlVGltZSkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NvbnRyaWJ1dGVUb01lbnUoKTogcmFuIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Qb3B1cE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJCWxvbmcgdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGUuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gY2FjaGUuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IG1lbnVFbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgb2JqOwotCQkJCQlpZiAoKG1lbnVFbGVtZW50LmdldE5hbWUoKSkuZXF1YWxzKFRBR19QT1BVUE1FTlUpKSB7Ci0JCQkJCQljb250cmlidXRlTWVudShtZW51RWxlbWVudCwgbWVudSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQWN0aW9uRGVzY3JpcHRvcikgewotCQkJCQl0cnkgewotCQkJCQkJQWN0aW9uRGVzY3JpcHRvciBhZCA9IChBY3Rpb25EZXNjcmlwdG9yKSBvYmo7Ci0JCQkJCQlJQWN0aW9uIGEgPSBhZC5nZXRBY3Rpb24oKTsKLQkJCQkJCWlmIChhIGluc3RhbmNlb2YgSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSB7Ci0JCQkJCQkJLy8gdW5jYXVnaHQgZXhjZXB0aW9ucyBjb3VsZCBjYXVzZSB0aGUgbWVudSB0byBub3QKLQkJCQkJCQkvLyBiZSBzaG93bgotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWlmICgoKGFkLmdldFBvcHVwTWVudVBhdGgoKSAhPSBudWxsKSB8fCAoYWQuZ2V0UG9wdXBNZW51R3JvdXAoKSAhPSBudWxsKSkgJiYgKGEgaW5zdGFuY2VvZiBJRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZykpIHsKLQkJCQkJCQkJICAgICgoSUV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcpYSkucmVhbGl6ZSgpOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJSUV4dGVuZGVkRWRpdG9yQWN0aW9uIGVlYSA9IChJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pIGE7Ci0JCQkJCQkJCWVlYS5zZXRBY3RpdmVFeHRlbmRlZEVkaXRvcihhY3RpdmVFeHRlbmRlZEVkaXRvcik7Ci0JCQkJCQkJCWVlYS51cGRhdGUoKTsKLQkJCQkJCQkJaWYgKGVlYS5pc1Zpc2libGUoKSkgewotCQkJCQkJCQkJSU1lbnVNYW5hZ2VyIHBhcmVudCA9IGNvbnRyaWJ1dGVNZW51QWN0aW9uKGFkLCBtZW51LCB0cnVlLCB0cnVlKTsKLQkJCQkJCQkJCWlmIChkZWJ1Z1BvcHVwICYmIHBhcmVudCAhPSBudWxsKQotCQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY29udHJpYnV0ZVRvUG9wdXBNZW51KCkgYWRkZWQ6ICIgKyBhZC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJCX0KLQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJSU1lbnVNYW5hZ2VyIHBhcmVudCA9IGNvbnRyaWJ1dGVNZW51QWN0aW9uKGFkLCBtZW51LCB0cnVlLCB0cnVlKTsKLQkJCQkJCQlpZiAoZGVidWdQb3B1cCAmJiBwYXJlbnQgIT0gbnVsbCkKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjb250cmlidXRlVG9Qb3B1cE1lbnUoKSBhZGRlZDogIiArIGFkLmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJjb250cmlidXRpbmcgdG8gcG9wdXAiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRlYnVnQ29udHJpYnV0ZVRpbWUpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjb250cmlidXRlVG9Qb3B1cE1lbnUoKTogcmFuIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9TdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkvLyBub3RoaW5nIGZyb20gaGVyZQotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgbWFuYWdlcikgewotCQkJbG9uZyB0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYWNoZS5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBjYWNoZS5nZXQoaSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGlvbkRlc2NyaXB0b3IpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUFjdGlvbkRlc2NyaXB0b3IgYWQgPSAoQWN0aW9uRGVzY3JpcHRvcikgb2JqOwotCQkJCQkJSUFjdGlvbiBhID0gYWQuZ2V0QWN0aW9uKCk7Ci0JCQkJCQlpZiAoYSBpbnN0YW5jZW9mIElFeHRlbmRlZEVkaXRvckFjdGlvbikgewotCQkJCQkJCWlmICgoKGFkLmdldFRvb2xiYXJQYXRoKCkgIT0gbnVsbCkgfHwgKGFkLmdldFRvb2xiYXJHcm91cCgpICE9IG51bGwpKSAmJiAoYSBpbnN0YW5jZW9mIElFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nKSkgewotCQkJCQkJCSAgICAoKElFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nKWEpLnJlYWxpemUoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJSUV4dGVuZGVkRWRpdG9yQWN0aW9uIGVlYSA9IChJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pIGE7Ci0JCQkJCQkJZWVhLnNldEFjdGl2ZUV4dGVuZGVkRWRpdG9yKGFjdGl2ZUV4dGVuZGVkRWRpdG9yKTsKLQkJCQkJCQllZWEudXBkYXRlKCk7Ci0JCQkJCQkJaWYgKGVlYS5pc1Zpc2libGUoKSkgewotCQkJCQkJCQlib29sZWFuIGNvbnRyaWJ1dGVkID0gY29udHJpYnV0ZVRvb2xiYXJBY3Rpb24oYWQsIG1hbmFnZXIsIHRydWUpOwotCQkJCQkJCQlpZiAoZGVidWdUb29sYmFyICYmIGNvbnRyaWJ1dGVkKQotCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjb250cmlidXRlVG9Ub29sQmFyKCkgYWRkZWQ6ICIgKyBhZC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJaWYgKGRlYnVnVG9vbGJhcikKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY29udHJpYnV0ZVRvVG9vbEJhcigpOiBbc2tpcHBlZF0gIiArIGFkLmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJYm9vbGVhbiBjb250cmlidXRlZCA9IGNvbnRyaWJ1dGVUb29sYmFyQWN0aW9uKGFkLCBtYW5hZ2VyLCB0cnVlKTsKLQkJCQkJCQlpZiAoZGVidWdUb29sYmFyICYmIGNvbnRyaWJ1dGVkKQotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NvbnRyaWJ1dGVUb1Rvb2xCYXIoKSBhZGRlZDogIiArIGFkLmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJjb250cmlidXRpbmcgdG8gdG9vbGJhciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGVidWdDb250cmlidXRlVGltZSkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NvbnRyaWJ1dGVUb1Rvb2xCYXIoKTogcmFuIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJSXRlcmF0b3IgaXQgPSBtZW51cy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgSU1lbnVNYW5hZ2VyKSB7Ci0JCQkJCSgoSU1lbnVNYW5hZ2VyKSBvKS5yZW1vdmVNZW51TGlzdGVuZXIodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBiYXJzLCBJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0JCQkvLyBub3RoaW5nIGZyb20gaGVyZQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCQkvLyBzbG93cyBkb3duIHRoZSBtZW51IGFuZCBpbnRlcmZlcmVzIHdpdGggaXQgZm9yIG90aGVyIGVkaXRvcnM7Ci0JCQkvLyBvcHRpbWl6ZSBvbiB2aXNpYmlsaXR5Ci0JCQlJRWRpdG9yU2l0ZSBzaXRlID0gbnVsbDsKLQkJCWJvb2xlYW4gYWN0aXZlRWRpdG9ySXNWaXNpYmxlID0gZmFsc2U7Ci0KLQkJCWlmIChhY3RpdmVFeHRlbmRlZEVkaXRvciAhPSBudWxsICYmIGFjdGl2ZUV4dGVuZGVkRWRpdG9yLmdldEVkaXRvclBhcnQoKSAhPSBudWxsKQotCQkJCXNpdGUgPSBhY3RpdmVFeHRlbmRlZEVkaXRvci5nZXRFZGl0b3JQYXJ0KCkuZ2V0RWRpdG9yU2l0ZSgpOwotCQkJaWYgKHNpdGUgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCS8vIEVjbGlwc2UgYnVnIDQ4Nzg0IC0gW01QRV0gQ2xhc3NDYXN0IGV4Y2VwdGlvbiBXb3JrYmVuY2ggcGFnZQotCQkJLy8gaXNQYXJ0VmlzaWFibGUgZm9yIE11bHRpUGFnZVNpdGUKLQkJCWlmIChzaXRlIGluc3RhbmNlb2YgTXVsdGlQYWdlRWRpdG9yU2l0ZSkgewotCQkJCU9iamVjdCBtdWx0aVBhZ2VFZGl0b3IgPSAoKE11bHRpUGFnZUVkaXRvclNpdGUpIHNpdGUpLmdldE11bHRpUGFnZUVkaXRvcigpOwotCQkJCWFjdGl2ZUVkaXRvcklzVmlzaWJsZSA9IG11bHRpUGFnZUVkaXRvci5lcXVhbHMoc2l0ZS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkpIHx8IG11bHRpUGFnZUVkaXRvci5lcXVhbHMoc2l0ZS5nZXRQYWdlKCkuZ2V0QWN0aXZlUGFydCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFjdGl2ZUVkaXRvcklzVmlzaWJsZSA9IHNpdGUuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5nZXRBY3RpdmVQYXJ0KCkuZXF1YWxzKGFjdGl2ZUV4dGVuZGVkRWRpdG9yLmdldEVkaXRvclBhcnQoKSk7Ci0JCQl9Ci0JCQkvLyBkdWUgdG8gYSBkZWxheSBjbGFzcyBsb2FkaW5nLCBkb24ndCByZXR1cm4gbm93Ci0vLwkJCWlmICghYWN0aXZlRWRpdG9ySXNWaXNpYmxlKQotLy8JCQkJcmV0dXJuOwotCi0JCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWVudS5nZXRJdGVtcygpOwotCQkJaWYgKGl0ZW1zID09IG51bGwgfHwgaXRlbXMubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7Ci0JCQkJLy8gYWRkIG1lbnUgbGlzdGVuZXIgdG8gc3VibWVudQotCQkJCWlmIChpdGVtc1tpXSBpbnN0YW5jZW9mIElNZW51TWFuYWdlcikgewotCQkJCQkoKElNZW51TWFuYWdlcikgaXRlbXNbaV0pLmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKLQkJCQkJbWVudXMuYWRkKGl0ZW1zW2ldKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCVNldCBrZXlzID0gbWFwLmtleVNldCgpOwotCQkJSXRlcmF0b3IgaXQgPSBrZXlzLml0ZXJhdG9yKCk7Ci0JCQlib29sZWFuIG5lZWRBY3Rpb25Db250cmlidXRpb25JdGVtVXBkYXRlID0gZmFsc2U7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IChJQ29udHJpYnV0aW9uSXRlbSkgaXQubmV4dCgpOwotCQkJCUlNZW51TWFuYWdlciBtbSA9IChJTWVudU1hbmFnZXIpIG1hcC5nZXQoaXRlbSk7Ci0JCQkJaWYgKG1lbnUuZ2V0SWQoKSAhPSBudWxsICYmIG1lbnUuZ2V0SWQoKS5lcXVhbHMobW0uZ2V0SWQoKSkgJiYgaXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlBY3Rpb24gYWN0aW9uID0gKChBY3Rpb25Db250cmlidXRpb25JdGVtKSBpdGVtKS5nZXRBY3Rpb24oKTsKLQotCQkJCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nKSB7Ci0JCQkJCQkgICAgSUV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcgZWVhID0gKElFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nKWFjdGlvbjsKLQkJCQkJCSAgICBpZiAoZWVhLmlzQnVuZGxlQWN0aXZlKCkgPT0gdHJ1ZSAmJiBlZWEuaXNSZWFsaXplZCgpID09IGZhbHNlKSB7Ci0JCQkJCQkgICAgICAgIGVlYS5yZWFsaXplKCk7Ci0JCQkJCQkgICAgICAgIG5lZWRBY3Rpb25Db250cmlidXRpb25JdGVtVXBkYXRlID0gdHJ1ZTsKLQkJCQkJCSAgICB9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChhY3RpdmVFZGl0b3JJc1Zpc2libGUgfHwgbmVlZEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1VcGRhdGUpIHsKLQkJCQkJCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSVVwZGF0ZSkgewotCQkJCQkJCQkoKElVcGRhdGUpIGFjdGlvbikudXBkYXRlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlpZiAoYWN0aXZlRWRpdG9ySXNWaXNpYmxlIHx8IG5lZWRBY3Rpb25Db250cmlidXRpb25JdGVtVXBkYXRlKSB7Ci0JCQkJCQkJYm9vbGVhbiB2aXNpYmxlID0gdHJ1ZTsKLQkJCQkJCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSB7Ci0JCQkJCQkJCXZpc2libGUgPSAoKElFeHRlbmRlZEVkaXRvckFjdGlvbikgYWN0aW9uKS5pc1Zpc2libGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaXRlbS5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkJCQkJfQotCi0JCQkJCQlpZiAobmVlZEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1VcGRhdGUpIHsKLQkJCQkJCSAgICAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0paXRlbSkudXBkYXRlKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInVwZGF0aW5nIGFjdGlvbnMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFjdGl2ZUVkaXRvcklzVmlzaWJsZSB8fCBuZWVkQWN0aW9uQ29udHJpYnV0aW9uSXRlbVVwZGF0ZSkgewotCQkJICAgIGlmIChuZWVkQWN0aW9uQ29udHJpYnV0aW9uSXRlbVVwZGF0ZSkgewotCQkJICAgICAgICAvLyB0aGUgYWN0aW9uIGlzIHJlYWxpemVkIHNvIHRoYXQgbmVlZCB0byB1cGRhdGUgdGhlIG1lbnUgdy8KLQkJCSAgICAgICAgLy8gZm9yY2Ugc2V0IHRvIHRydWUKLQkJCSAgICAgICAgbWVudS51cGRhdGUodHJ1ZSk7Ci0JCQkgICAgfSBlbHNlIHsKLQkJCSAgICAgICAgbWVudS51cGRhdGUoZmFsc2UpOwotCQkJICAgIH0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJCWFjdGl2ZUV4dGVuZGVkRWRpdG9yID0gY29tcHV0ZUV4dGVuZGVkRWRpdG9yKGVkaXRvcik7Ci0JCQlJS2V5QmluZGluZ1NlcnZpY2Ugc3ZjID0gKGVkaXRvciAhPSBudWxsKSA/IGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0S2V5QmluZGluZ1NlcnZpY2UoKSA6IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGNhY2hlLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aW9uRGVzY3JpcHRvcikgewotCQkJCQlBY3Rpb25EZXNjcmlwdG9yIGFkID0gKEFjdGlvbkRlc2NyaXB0b3IpIG9iajsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlBY3Rpb24gYWN0aW9uID0gYWQuZ2V0QWN0aW9uKCk7Ci0JCQkJCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSB7Ci0JCQkJCQkJKChJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pIGFjdGlvbikuc2V0QWN0aXZlRXh0ZW5kZWRFZGl0b3IoYWN0aXZlRXh0ZW5kZWRFZGl0b3IpOwotCQkJCQkJCSgoSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSBhY3Rpb24pLnVwZGF0ZSgpOwotCQkJCQkJCS8vIHVwZGF0ZSB2aXNpYmlsaXR5IHJpZ2h0IG5vdyBzbyB0aGF0IHRoZSBtZW51Ci0JCQkJCQkJLy8gd2lsbCBzaG93L2hpZGUgcHJvcGVybHkKLQkJCQkJCQlpZiAoISgoSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSBhY3Rpb24pLmlzVmlzaWJsZSgpICYmIGFkLmdldENvbnRyaWJ1dGlvbkl0ZW0oKSAhPSBudWxsKQotCQkJCQkJCQlhZC5nZXRDb250cmlidXRpb25JdGVtKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCQkJaWYgKHN2YyAhPSBudWxsICYmIGFjdGlvbi5nZXRBY3Rpb25EZWZpbml0aW9uSWQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCXN2Yy5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInNldHRpbmcgYWN0aXZlIGVkaXRvciBvbiBhY3Rpb25zIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG1lbnVCYXIgIT0gbnVsbCAmJiBlZGl0b3IgIT0gbnVsbCkgewotCQkJCS8vIENsYXNzIGNseiA9IGVkaXRvci5nZXRDbGFzcygpOwotCQkJCS8vIHdoaWxlIChjbHogIT0gbnVsbCkgewotCQkJCS8vIGlmIChjbHouZ2V0TmFtZSgpLmVxdWFscyh0YXJnZXRJRCkpIHsKLQkJCQkvLyBjb250cmlidXRlVG9NZW51KG1lbnVCYXIpOwotCQkJCS8vIGJyZWFrOwotCQkJCS8vIH0KLQkJCQkvLyBjbHogPSBjbHouZ2V0U3VwZXJjbGFzcygpOwotCQkJCS8vIH0KLQkJCQlpZiAodGFyZ2V0SURzLmNvbnRhaW5zKGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0SWQoKSkpIHsKLQkJCQkJY29udHJpYnV0ZVRvTWVudShtZW51QmFyKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1cGRhdGVUb29sYmFyQWN0aW9ucygpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGUuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gY2FjaGUuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpb25EZXNjcmlwdG9yKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlBY3Rpb25EZXNjcmlwdG9yIGFkID0gKEFjdGlvbkRlc2NyaXB0b3IpIG9iajsKLQkJCQkJCWlmIChhZC5nZXRUb29sYmFyUGF0aCgpICE9IG51bGwpIHsKLQkJCQkJCQlJQWN0aW9uIGFjdGlvbiA9IGFkLmdldEFjdGlvbigpOwotCQkJCQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBJVXBkYXRlKSB7Ci0JCQkJCQkJCSgoSVVwZGF0ZSkgYWN0aW9uKS51cGRhdGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJ1cGRhdGluZyB0b29sYmFyIGFjdGlvbnMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9MQUJFTCA9ICJsYWJlbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QQVRIID0gInBhdGgiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVEFSR0VUX0lEID0gInRhcmdldElEIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z0NvbnRyaWJ1dGVUaW1lID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZXh0ZW5kZWRlZGl0b3JhY3Rpb25idWlsZGVyL2NvbnRyaWJ1dGV0aW1lIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGJvb2xlYW4gZGVidWdNZW51ID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZXh0ZW5kZWRlZGl0b3JhY3Rpb25idWlsZGVyL2RlYnVnbWVudSIpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJDsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGJvb2xlYW4gZGVidWdQb3B1cCA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkZWRpdG9yYWN0aW9uYnVpbGRlci9kZWJ1Z3BvcHVwIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1JlYWRUaW1lID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZXh0ZW5kZWRlZGl0b3JhY3Rpb25idWlsZGVyL3JlYWR0aW1lIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnVG9vbGJhciA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkZWRpdG9yYWN0aW9uYnVpbGRlci9kZWJ1Z3Rvb2xiYXIiKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5ERURfRURJVE9SID0gImV4dGVuZGVkRWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExfRVhURU5ERURfRURJVE9SX0FDVElPTlMgPSAiZXh0ZW5kZWRFZGl0b3JBY3Rpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FDVElPTiA9ICJhY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ09OVFJJQlVUSU9OX1RZUEUgPSAiZWRpdG9yQ29udHJpYnV0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX01FTlUgPSAibWVudSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUE9QVVBNRU5VID0gInBvcHVwbWVudSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUlVMRVJNRU5VID0gInJ1bGVybWVudSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfU0VQQVJBVE9SID0gInNlcGFyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBMaXN0IHJlYWRpbmdDYWNoZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0Q29udHJpYnV0aW9uVGFnOwotCXByb3RlY3RlZCBMaXN0IHRhcmdldElEczsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBtZW51IGZyb20gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBtZW51IGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqIGFuZCBhZGRzIGl0IGludG8gdGhlIHByb3ZpZGVkIG1lbnUgbWFuYWdlci4gSWYgJ2FwcGVuZElmTWlzc2luZycgaXMKLQkgKiB0cnVlLCBhbmQgbWVudSBwYXRoIHNsb3QgaXMgbm90IGZvdW5kLCBpdCB3aWxsIGJlIGNyZWF0ZWQgYW5kIG1lbnUgd2lsbAotCSAqIGJlIGFkZGVkIGludG8gaXQuIE90aGVyd2lzZSwgYWRkIG9wZXJhdGlvbiB3aWxsIGZhaWwuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZU1lbnUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IG1lbnVFbGVtZW50LCBJTWVudU1hbmFnZXIgbW5nLCBib29sZWFuIGFwcGVuZElmTWlzc2luZykgewotCQkvLyBHZXQgY29uZmlnIGRhdGEuCi0JCVN0cmluZyBpZCA9IG1lbnVFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQlTdHJpbmcgbGFiZWwgPSBtZW51RWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0xBQkVMKTsKLQkJU3RyaW5nIHBhdGggPSBtZW51RWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BBVEgpOwotCQlpZiAobGFiZWwgPT0gbnVsbCkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbnZhbGlkIE1lbnUgRXh0ZW5zaW9uIChsYWJlbCA9PSBudWxsKTogIiArIGlkKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gQ2FsY3VsYXRlIG1lbnUgcGF0aCBhbmQgZ3JvdXAuCi0JCVN0cmluZyBncm91cCA9IG51bGw7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCWludCBsb2MgPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlpZiAobG9jICE9IC0xKSB7Ci0JCQkJZ3JvdXAgPSBwYXRoLnN1YnN0cmluZyhsb2MgKyAxKTsKLQkJCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgbG9jKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGFzc3VtZSB0aGF0IHBhdGggcmVwcmVzZW50cyBhIHNsb3QKLQkJCQkvLyBzbyBhY3R1YWwgcGF0aCBwb3J0aW9uIHNob3VsZCBiZSBudWxsCi0JCQkJZ3JvdXAgPSBwYXRoOwotCQkJCXBhdGggPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJLy8gRmluZCBwYXJlbnQgbWVudS4KLQkJSU1lbnVNYW5hZ2VyIHBhcmVudCA9IG1uZzsKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJcGFyZW50ID0gbW5nLmZpbmRNZW51VXNpbmdQYXRoKHBhdGgpOwotCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJLy8gTG9nZ2VyLmxvZygiSW52YWxpZCBNZW51IEV4dGVuc2lvbiAoUGF0aCBpcyBpbnZhbGlkKTogIiArCi0JCQkJLy8gaWQpOy8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBJTWVudU1hbmFnZXIuZmluZE1lbnVVc2luZ1BhdGgoKSByZXR1cm5zIGludmlzaWJsZSBtZW51IGl0ZW0gaWYKLQkJCS8vIHRoZSBtYW5hZ2VyIGNhbid0IGZpbmQKLQkJCS8vIHRoZSBzcGVjaWZpZWQgcGF0aCBhbmQgY3JlYXRlIG5ldyBNZW51TWFuYWdlciBmb3IgaXQuCi0JCQkvLyBJIGRvbid0IGtub3cgdGhpcyBpcyBhIHNwZWNpZmljYXRpb24gb3IgYnVnLgotCQkJLy8gQW55d2F5LCB0byBlbnN1cmUgdGhlIG1lbnUgY2FuIGJlIHZpc2libGUsIHNldFZpc2libGUodHJ1ZSkKLQkJCS8vIG5lZWRzIHRvIGJlIGNhbGxlZC4KLQkJCXBhcmVudC5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0KLQkJLy8gRmluZCByZWZlcmVuY2UgZ3JvdXAuCi0JCWlmIChncm91cCA9PSBudWxsKQotCQkJZ3JvdXAgPSBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUzsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gc2VwID0gcGFyZW50LmZpbmQoZ3JvdXApOwotCQlpZiAoc2VwID09IG51bGwpIHsKLQkJCWlmIChhcHBlbmRJZk1pc3NpbmcpCi0JCQkJcGFyZW50LmFkZChuZXcgU2VwYXJhdG9yKGdyb3VwKSk7Ci0JCQllbHNlIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkludmFsaWQgTWVudSBFeHRlbnNpb24gKEdyb3VwIGlzIGludmFsaWQpOiAiICsgaWQpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gSWYgdGhlIG1lbnUgZG9lcyBub3QgZXhpc3QgY3JlYXRlIGl0LgotCQlJTWVudU1hbmFnZXIgbmV3TWVudSA9IHBhcmVudC5maW5kTWVudVVzaW5nUGF0aChpZCk7Ci0JCWlmIChuZXdNZW51ID09IG51bGwpCi0JCQluZXdNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKGxhYmVsLCBpZCk7Ci0KLQkJLy8gQ3JlYXRlIHNlcGFyYXRvcnMuCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkcmVuID0gbWVudUVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX1NFUEFSQVRPUik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWNvbnRyaWJ1dGVTZXBhcmF0b3IobmV3TWVudSwgY2hpbGRyZW5baV0pOwotCQl9Ci0KLQkJLy8gQWRkIG5ldyBtZW51Ci0JCXRyeSB7Ci0JCQlwYXJlbnQuaW5zZXJ0QWZ0ZXIoZ3JvdXAsIG5ld01lbnUpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbnZhbGlkIE1lbnUgRXh0ZW5zaW9uIChHcm91cCBpcyBtaXNzaW5nKTogIiArIGlkKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udHJpYnV0ZXMgYWN0aW9uIGZyb20gYWN0aW9uIGRlc2NyaXB0b3IgaW50byB0aGUgcHJvdmlkZWQgbWVudQotCSAqIG1hbmFnZXIuCi0JICovCi0JcHJvdGVjdGVkIElNZW51TWFuYWdlciBjb250cmlidXRlTWVudUFjdGlvbihBY3Rpb25EZXNjcmlwdG9yIGFkLCBJTWVudU1hbmFnZXIgbWVudSwgYm9vbGVhbiBhcHBlbmRJZk1pc3NpbmcsIGJvb2xlYW4gcG9wdXBtZW51KSB7Ci0JCWlmIChhZC5nZXRDb250cmlidXRpb25JdGVtKCkgPT0gbnVsbCB8fCBhZC5nZXRBY3Rpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gR2V0IGNvbmZpZyBkYXRhLgotCQlTdHJpbmcgbXBhdGggPSBwb3B1cG1lbnUgPyBhZC5nZXRQb3B1cE1lbnVQYXRoKCkgOiBhZC5nZXRNZW51UGF0aCgpOwotCQlTdHJpbmcgbWdyb3VwID0gcG9wdXBtZW51ID8gYWQuZ2V0UG9wdXBNZW51R3JvdXAoKSA6IGFkLmdldE1lbnVHcm91cCgpOwotCQlpZiAobXBhdGggPT0gbnVsbCAmJiBtZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIEZpbmQgcGFyZW50IG1lbnUuCi0JCUlNZW51TWFuYWdlciBwYXJlbnQgPSBtZW51OwotCQlpZiAobXBhdGggIT0gbnVsbCkgewotCQkJcGFyZW50ID0gcGFyZW50LmZpbmRNZW51VXNpbmdQYXRoKG1wYXRoKTsKLQkJCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJCS8vIExvZ2dlci5sb2coIkludmFsaWQgTWVudSBFeHRlbnNpb24gKFBhdGggaXMgaW52YWxpZCk6ICIgKwotCQkJCS8vIGFkLmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkvLyBJTWVudU1hbmFnZXIuZmluZE1lbnVVc2luZ1BhdGgoKSByZXR1cm5zIGludmlzaWJsZSBtZW51IGl0ZW0gaWYKLQkJCS8vIHRoZSBtYW5hZ2VyIGNhbid0IGZpbmQKLQkJCS8vIHRoZSBzcGVjaWZpZWQgcGF0aCBhbmQgY3JlYXRlIG5ldyBNZW51TWFuYWdlciBmb3IgaXQuCi0JCQkvLyBJIGRvbid0IGtub3cgdGhpcyBpcyBhIHNwZWNpZmljYXRpb24gb3IgYnVnLgotCQkJLy8gQW55d2F5LCB0byBlbnN1cmUgdGhlIG1lbnUgY2FuIGJlIHZpc2libGUsIHNldFZpc2libGUodHJ1ZSkKLQkJCS8vIG5lZWRzIHRvIGJlIGNhbGxlZC4KLQkJCXBhcmVudC5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0KLQkJLy8gRmlyc3QgcmVtb3ZlIGV4aXN0aW5nIG1lbnUgaXRlbQotCQlJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gcGFyZW50LmZpbmQoYWQuZ2V0SWQoKSk7Ci0JCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCXBhcmVudC5yZW1vdmUoYWQuZ2V0SWQoKSk7Ci0JCX0KLQotCQkvLyBGaW5kIHJlZmVyZW5jZSBncm91cC4KLQkJaWYgKG1ncm91cCA9PSBudWxsKQotCQkJbWdyb3VwID0gSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlM7Ci0JCUlDb250cmlidXRpb25JdGVtIHNlcCA9IHBhcmVudC5maW5kKG1ncm91cCk7Ci0JCWlmIChzZXAgPT0gbnVsbCkgewotCQkJaWYgKGFwcGVuZElmTWlzc2luZykKLQkJCQlwYXJlbnQuYWRkKHNlcCA9IG5ldyBTZXBhcmF0b3IobWdyb3VwKSk7Ci0JCQllbHNlIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkludmFsaWQgTWVudSBFeHRlbnNpb24gKEdyb3VwIGlzIGludmFsaWQpOiAiICsgYWQuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8vIEFkZCBhY3Rpb24uCi0JCXRyeSB7Ci0JCQlpZiAocG9wdXBtZW51KSB7Ci0JCQkJLy8gQ29udGV4dCBtZW51IG5lZWQgYSBuZXdseSBjcmVhdGVkIGNvbnRyaWJ1dGlvbiBpdGVtCi0JCQkJaWYgKHNlcCAhPSBudWxsICYmIHNlcC5pc0dyb3VwTWFya2VyKCkpCi0JCQkJCXBhcmVudC5hcHBlbmRUb0dyb3VwKHNlcC5nZXRJZCgpLCBhZC5nZXRBY3Rpb24oKSk7Ci0JCQkJZWxzZQotCQkJCQlwYXJlbnQuaW5zZXJ0QWZ0ZXIobWdyb3VwLCBhZC5nZXRBY3Rpb24oKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBOb3JtYWwgbWVudSBuZWVkIHRvIGFkZCBleGlzdGluZyBjb250cmlidXRpb24gaXRlbSB0bwotCQkJCS8vIHJlbW92ZSBpdCBmcm9tIG1lbnUgbGlzdGVuZXIKLQkJCQlpZiAoc2VwICE9IG51bGwgJiYgc2VwLmlzR3JvdXBNYXJrZXIoKSkKLQkJCQkJcGFyZW50LmFwcGVuZFRvR3JvdXAoc2VwLmdldElkKCksIGFkLmdldENvbnRyaWJ1dGlvbkl0ZW0oKSk7Ci0JCQkJZWxzZQotCQkJCQlwYXJlbnQuaW5zZXJ0QWZ0ZXIobWdyb3VwLCBhZC5nZXRDb250cmlidXRpb25JdGVtKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbnZhbGlkIE1lbnUgRXh0ZW5zaW9uIChHcm91cCBpcyBtaXNzaW5nKTogIiArIGFkLmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0JCQlwYXJlbnQgPSBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmFtZWQgbWVudSBzZXBhcmF0b3IgZnJvbSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlCi0JICogY29uZmlndXJhdGlvbiBlbGVtZW50LiBJZiB0aGUgc2VwYXJhdG9yIGFscmVhZHkgZXhpc3RzIGRvIG5vdCBjcmVhdGUgYQotCSAqIHNlY29uZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250cmlidXRlU2VwYXJhdG9yKElNZW51TWFuYWdlciBtZW51LCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTkFNRSk7Ci0JCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpIDw9IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlDb250cmlidXRpb25JdGVtIHNlcCA9IG1lbnUuZmluZChpZCk7Ci0JCWlmIChzZXAgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihpZCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb250cmlidXRlcyBhY3Rpb24gZnJvbSB0aGUgYWN0aW9uIGRlc2NyaXB0b3IgaW50byB0aGUgcHJvdmlkZWQgdG9vbAotCSAqIGJhciBtYW5hZ2VyLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbnRyaWJ1dGVUb29sYmFyQWN0aW9uKEFjdGlvbkRlc2NyaXB0b3IgYWQsIElUb29sQmFyTWFuYWdlciB0b29sYmFyLCBib29sZWFuIGFwcGVuZElmTWlzc2luZykgewotCQlpZiAoYWQuZ2V0Q29udHJpYnV0aW9uSXRlbSgpID09IG51bGwgfHwgYWQuZ2V0QWN0aW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBHZXQgY29uZmlnIGRhdGEuCi0JCVN0cmluZyB0cGF0aCA9IGFkLmdldFRvb2xiYXJQYXRoKCk7Ci0JCVN0cmluZyB0Z3JvdXAgPSBhZC5nZXRUb29sYmFyR3JvdXAoKTsKLQkJaWYgKHRwYXRoID09IG51bGwgJiYgdGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gRmlyc3QgcmVtb3ZlIGV4aXN0aW5nIHRvb2xiYXIgaXRlbQotCQlJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gdG9vbGJhci5maW5kKGFkLmdldElkKCkpOwotCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQl0b29sYmFyLnJlbW92ZShhZC5nZXRJZCgpKTsKLQkJfQotCi0JCS8vIEZpbmQgcmVmZXJlbmNlIGdyb3VwLgotCQlpZiAodGdyb3VwID09IG51bGwpCi0JCQl0Z3JvdXAgPSBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUzsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gc2VwID0gdG9vbGJhci5maW5kKHRncm91cCk7Ci0JCWlmIChzZXAgPT0gbnVsbCkgewotCQkJaWYgKGFwcGVuZElmTWlzc2luZykKLQkJCQl0b29sYmFyLmFkZChuZXcgU2VwYXJhdG9yKHRncm91cCkpOwotCQkJZWxzZSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbnZhbGlkIFRvb2xiYXIgRXh0ZW5zaW9uIChHcm91cCBpcyBpbnZhbGlkKTogIiArIGFkLmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJLy8gQWRkIGFjdGlvbiB0byB0b29sIGJhci4KLQkJdHJ5IHsKLQkJCWlmIChzZXAgIT0gbnVsbCAmJiBzZXAuaXNHcm91cE1hcmtlcigpKQotCQkJCXRvb2xiYXIuYXBwZW5kVG9Hcm91cChzZXAuZ2V0SWQoKSwgYWQuZ2V0QWN0aW9uKCkpOwotCQkJZWxzZQotCQkJCXRvb2xiYXIuaW5zZXJ0QWZ0ZXIodGdyb3VwLCBhZC5nZXRBY3Rpb24oKSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkludmFsaWQgVG9vbGJhciBFeHRlbnNpb24gKEdyb3VwIGlzIG1pc3NpbmcpOiAiICsgYWQuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZhY3RvcnkgbWV0aG9kIHJldHVybnMgYSBuZXcgQWN0aW9uRGVzY3JpcHRvciBmb3IgdGhlCi0JICogY29uZmlndXJhdGlvbiBlbGVtZW50LiBJdCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aW9uRGVzY3JpcHRvciBjcmVhdGVBY3Rpb25EZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUFjdGlvbkRlc2NyaXB0b3IgYWQgPSBudWxsOwotCQl0cnkgewotCQkJYWQgPSBuZXcgQWN0aW9uRGVzY3JpcHRvcihlbGVtZW50KTsKLQkJCS8vIHRoZXNlIGNhc2VzIGxpa2UgImNsYXNzIG5vdCBmb3VuZCIgYXJlIGhhbmRsZWQKLQkJCS8vIGF0IGxvd2VyIGxldmVsLCBzbyBubyBhY3Rpb24gaWYgZm9ybWVkLiBJbiB0aGF0Ci0JCQkvLyBjYXNlLCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gZm9ybSBhbiBhY3Rpb24gZGVzY3JpcHRvci4KLQkJCWlmICgoYWQgIT0gbnVsbCkgJiYgKGFkLmdldEFjdGlvbigpID09IG51bGwpKSB7Ci0JCQkJYWQgPSBudWxsOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLnRyYWNlRXhjZXB0aW9uKEVYVEVOREVEX0VESVRPUiwgZSk7Ci0JCQlhZCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhcnQgSUQgYXR0cmlidXRlIHRoYXQgaXMgZXhwZWN0ZWQgaW4gdGhlCi0JICogdGFyZ2V0IGV4dGVuc2lvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhcmdldElEKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UQVJHRVRfSUQpOwotCQlyZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogIj8/PyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyBlZGl0b3IgY29udHJpYnV0b3IgaWYgc3BlY2lmaWVkIGRpcmVjdGx5IGluIHRoZSAnZWRpdG9yJwotCSAqIGV4dGVuc2lvbiBwb2ludCwgYW5kIGFsbCBleHRlcm5hbCBjb250cmlidXRpb25zIGZvciB0aGlzIGVkaXRvcidzIElECi0JICogcmVnaXN0ZXJlZCBpbiAnZWRpdG9yQWN0aW9ucycgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXB1YmxpYyBJRXh0ZW5kZWRDb250cmlidXRvciByZWFkQWN0aW9uRXh0ZW5zaW9ucyhTdHJpbmcgZWRpdG9ySWQpIHsKLQkJcmV0dXJuIHJlYWRBY3Rpb25FeHRlbnNpb25zKG5ldyBTdHJpbmdbXXtlZGl0b3JJZH0pOwotCX0KLQotCS8qKgotCSAqIFJlYWRzIGVkaXRvciBjb250cmlidXRvciBpZiBzcGVjaWZpZWQgZGlyZWN0bHkgaW4gdGhlICdlZGl0b3InCi0JICogZXh0ZW5zaW9uIHBvaW50LCBhbmQgYWxsIGV4dGVybmFsIGNvbnRyaWJ1dGlvbnMgZm9yIHRoaXMgZWRpdG9yJ3MgSUQKLQkgKiByZWdpc3RlcmVkIGluICdlZGl0b3JBY3Rpb25zJyBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHVibGljIElFeHRlbmRlZENvbnRyaWJ1dG9yIHJlYWRBY3Rpb25FeHRlbnNpb25zKFN0cmluZ1tdIGlkcykgewotCQlsb25nIHRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCUV4dGVuZGVkQ29udHJpYnV0b3IgZXh0ID0gbnVsbDsKLQkJcmVhZENvbnRyaWJ1dGlvbnMoaWRzLCBUQUdfQ09OVFJJQlVUSU9OX1RZUEUsIFBMX0VYVEVOREVEX0VESVRPUl9BQ1RJT05TKTsKLQkJaWYgKGRlYnVnUmVhZFRpbWUpIHsKLQkJCVN0cmluZyBpZGxpc3QgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGlkcy5sZW5ndGggPiAwKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWRsaXN0ICs9IGlkc1tpXTsKLQkJCQkJaWYgKGkgPCBpZHMubGVuZ3RoIC0gMSkKLQkJCQkJCWlkbGlzdCArPSAiLCI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI3JlYWRBY3Rpb25FeHRlbnNpb25zKCIgKyBpZGxpc3QgKyAiKTogcmVhZCBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIFsiICsgKHJlYWRpbmdDYWNoZSAhPSBudWxsID8gcmVhZGluZ0NhY2hlLnNpemUoKSA6IDApICsgIiBjb250cmlidXRpb25zXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCX0KLQkJaWYgKHJlYWRpbmdDYWNoZSAhPSBudWxsKSB7Ci0JCQlleHQgPSBuZXcgRXh0ZW5kZWRDb250cmlidXRvcihyZWFkaW5nQ2FjaGUpOwotCQkJcmVhZGluZ0NhY2hlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZXh0OwotCX0KLQotCS8qKgotCSAqIFJlYWRzIHRoZSBjb250cmlidXRpb25zIGZyb20gdGhlIHJlZ2lzdHJ5IGZvciB0aGUgcHJvdmlkZWQgd29ya2JlbmNoCi0JICogcGFydCBhbmQgdGhlIHByb3ZpZGVkIGV4dGVuc2lvbiBwb2ludCBJRHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZENvbnRyaWJ1dGlvbnMoU3RyaW5nW10gaWRzLCBTdHJpbmcgdGFnLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJcmVhZGluZ0NhY2hlID0gbnVsbDsKLQkJdGFyZ2V0SURzID0gQXJyYXlzLmFzTGlzdChpZHMpOwotCQl0YXJnZXRDb250cmlidXRpb25UYWcgPSB0YWc7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCXJlYWRSZWdpc3RyeShyZWdpc3RyeSwgUExVR0lOX0lELCBleHRlbnNpb25Qb2ludCk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50cyBhYnN0cmFjdCBtZXRob2QgdG8gaGFuZGxlIHRoZSBwcm92aWRlZCBYTUwgZWxlbWVudCBpbiB0aGUKLQkgKiByZWdpc3RyeS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdGFnID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCWlmICh0YWcuZXF1YWxzKHRhcmdldENvbnRyaWJ1dGlvblRhZykpIHsKLQkJCVN0cmluZyBpZCA9IGdldFRhcmdldElEKGVsZW1lbnQpOwotCQkJaWYgKGlkID09IG51bGwgfHwgIXRhcmdldElEcy5jb250YWlucyhpZCkpIHsKLQkJCQkvLyBUaGlzIGlzIG5vdCBvZiBpbnRlcmVzdCB0byB1cyAtIGRvbid0IGdvIGRlZXBlcgotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX01FTlUpKSB7Ci0JCQlpZiAocmVhZGluZ0NhY2hlID09IG51bGwpCi0JCQkJcmVhZGluZ0NhY2hlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJcmVhZGluZ0NhY2hlLmFkZChlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOyAvLyBqdXN0IGNhY2hlIHRoZSBlbGVtZW50IC0gZG9uJ3QgZ28gaW50byBpdAotCQl9Ci0JCWVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX1BPUFVQTUVOVSkpIHsKLQkJCWlmIChyZWFkaW5nQ2FjaGUgPT0gbnVsbCkKLQkJCQlyZWFkaW5nQ2FjaGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlyZWFkaW5nQ2FjaGUuYWRkKGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7IC8vIGp1c3QgY2FjaGUgdGhlIGVsZW1lbnQgLSBkb24ndCBnbyBpbnRvIGl0Ci0JCX0KLQkJZWxzZSBpZiAodGFnLmVxdWFscyhUQUdfUlVMRVJNRU5VKSkgewotCQkJaWYgKHJlYWRpbmdDYWNoZSA9PSBudWxsKQotCQkJCXJlYWRpbmdDYWNoZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXJlYWRpbmdDYWNoZS5hZGQoZWxlbWVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsgLy8ganVzdCBjYWNoZSB0aGUgZWxlbWVudCAtIGRvbid0IGdvIGludG8gaXQKLQkJfQotCQllbHNlIGlmICh0YWcuZXF1YWxzKFRBR19BQ1RJT04pKSB7Ci0JCQlpZiAocmVhZGluZ0NhY2hlID09IG51bGwpCi0JCQkJcmVhZGluZ0NhY2hlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJQWN0aW9uRGVzY3JpcHRvciBhZCA9IGNyZWF0ZUFjdGlvbkRlc2NyaXB0b3IoZWxlbWVudCk7Ci0JCQlpZiAoYWQgIT0gbnVsbCkKLQkJCQlyZWFkaW5nQ2FjaGUuYWRkKGFkKTsKLQkJCXJldHVybiB0cnVlOyAvLyBqdXN0IGNhY2hlIHRoZSBhY3Rpb24gLSBkb24ndCBnbyBpbnRvCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZWFkRWxlbWVudENoaWxkcmVuKGVsZW1lbnQpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRXh0ZW5kZWRFZGl0b3JEcm9wVGFyZ2V0QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0V4dGVuZGVkRWRpdG9yRHJvcFRhcmdldEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwYjA0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRXh0ZW5kZWRFZGl0b3JEcm9wVGFyZ2V0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRmlsZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5UcmFuc2ZlckJ1aWxkZXIuVHJhbnNmZXJQcm94eUZvckRlbGF5TG9hZGluZzsKLQotLyoqCi0gKiBFeHRlbmRlZEVkaXRvckRyb3BUYXJnZXRBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZEVkaXRvckRyb3BUYXJnZXRBZGFwdGVyIGV4dGVuZHMgRHJvcFRhcmdldEFkYXB0ZXIgewotCXByaXZhdGUgU3RyaW5nW10gZWRpdG9ySWRzOwotCXByaXZhdGUgUG9pbnQgb3JpZ2luYWxSYW5nZSA9IG51bGw7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IgPSBudWxsOwotCXByaXZhdGUgSVRleHRWaWV3ZXIgdGV4dFZpZXdlciA9IG51bGw7Ci0KLQlwcml2YXRlIFRyYW5zZmVyW10gdHJhbnNmZXJzID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiB1c2VQcm94eTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBFeHRlbmRlZEVkaXRvckRyb3BUYXJnZXRBZGFwdGVyKGJvb2xlYW4gdXNlUHJveHkpIGZvcgotCSAqICAgICAgICAgICAgIHRoZSBwZXJmb3JtYW5jZQotCSAqLwotCXB1YmxpYyBFeHRlbmRlZEVkaXRvckRyb3BUYXJnZXRBZGFwdGVyKCkgewotCQl0aGlzKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgRXh0ZW5kZWRFZGl0b3JEcm9wVGFyZ2V0QWRhcHRlcihib29sZWFuIHVzZVByb3h5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudXNlUHJveHkgPSB1c2VQcm94eTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkb0Ryb3AoVHJhbnNmZXIgdHJhbnNmZXIsIERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlUcmFuc2ZlckJ1aWxkZXIgdGIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKHVzZVByb3h5KTsKLQotCQlJRHJvcEFjdGlvbltdIGFzID0gbnVsbDsKLQkJaWYgKGVkaXRvcklkcyAhPSBudWxsICYmIGVkaXRvcklkcy5sZW5ndGggPiAwKQotCQkJYXMgPSB0Yi5nZXREcm9wQWN0aW9ucyhlZGl0b3JJZHMsIHRyYW5zZmVyKTsKLQkJZWxzZQotCQkJYXMgPSB0Yi5nZXREcm9wQWN0aW9ucyhnZXRUYXJnZXRFZGl0b3IoKS5nZXRDbGFzcygpLmdldE5hbWUoKSwgdHJhbnNmZXIpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXMubGVuZ3RoOyArK2kpIHsKLQkJCUlEcm9wQWN0aW9uIGRhID0gYXNbaV07Ci0JCQlUcmFuc2ZlciBhY3R1YWxUcmFuc2ZlcjsKLQkJCWlmICh0cmFuc2ZlciBpbnN0YW5jZW9mIFRyYW5zZmVyUHJveHlGb3JEZWxheUxvYWRpbmcpIHsKLQkJCQlhY3R1YWxUcmFuc2ZlciA9ICgoVHJhbnNmZXJQcm94eUZvckRlbGF5TG9hZGluZykgdHJhbnNmZXIpLmdldFRyYW5zZmVyQ2xhc3MoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFjdHVhbFRyYW5zZmVyID0gdHJhbnNmZXI7Ci0JCQl9Ci0JCQlpZiAoYWN0dWFsVHJhbnNmZXIgaW5zdGFuY2VvZiBGaWxlVHJhbnNmZXIpIHsKLQkJCQlpZiAoZXZlbnQuZGF0YSA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiTm8gZGF0YSBpbiBEcm9wVGFyZ2V0RXZlbnQgZnJvbSAiICsgZXZlbnQud2lkZ2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCVN0cmluZ1tdIHN0cnMgPSAoU3RyaW5nW10pIGV2ZW50LmRhdGE7Ci0JCQkJYm9vbGVhbltdIGJzID0gbmV3IGJvb2xlYW5bc3Rycy5sZW5ndGhdOwotCQkJCWludCBjID0gMDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHN0cnMubGVuZ3RoOyArK2opIHsKLQkJCQkJYnNbal0gPSBmYWxzZTsKLQkJCQkJaWYgKGRhLmlzU3VwcG9ydGVkRGF0YShzdHJzW2pdKSkgewotCQkJCQkJZXZlbnQuZGF0YSA9IG5ldyBTdHJpbmdbXXtzdHJzW2pdfTsKLQkJCQkJCWlmICghZGEucnVuKGV2ZW50LCB0YXJnZXRFZGl0b3IpKSB7Ci0JCQkJCQkJYnNbal0gPSB0cnVlOwotCQkJCQkJCWMrKzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWJzW2pdID0gdHJ1ZTsKLQkJCQkJCWMrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoYyA9PSAwKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQotCQkJCWludCBrID0gMDsKLQkJCQlTdHJpbmdbXSByZXN0cyA9IG5ldyBTdHJpbmdbY107Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzdHJzLmxlbmd0aDsgKytqKSB7Ci0JCQkJCWlmIChic1tqXSkKLQkJCQkJCXJlc3RzW2srK10gPSBzdHJzW2pdOwotCQkJCX0KLQkJCQlldmVudC5kYXRhID0gcmVzdHM7Ci0JCQl9Ci0JCQllbHNlIGlmIChkYS5pc1N1cHBvcnRlZERhdGEoZXZlbnQuZGF0YSkpIHsKLQkJCQlpZiAoZGEucnVuKGV2ZW50LCB0YXJnZXRFZGl0b3IpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCVRyYW5zZmVyRGF0YSBkYXRhID0gbnVsbDsKLQkJVHJhbnNmZXJbXSB0cyA9IGdldFRyYW5zZmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGV2ZW50LmRhdGFUeXBlcy5sZW5ndGg7IGorKykgewotCQkJCWlmICh0c1tpXS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGVzW2pdKSkgewotCQkJCQlkYXRhID0gZXZlbnQuZGF0YVR5cGVzW2pdOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQkJZXZlbnQuY3VycmVudERhdGFUeXBlID0gZGF0YTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmICh0ZXh0Vmlld2VyICE9IG51bGwpIHsKLQkJCW9yaWdpbmFsUmFuZ2UgPSB0ZXh0Vmlld2VyLmdldFNlbGVjdGVkUmFuZ2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRyYWdMZWF2ZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRleHRWaWV3ZXIgIT0gbnVsbCkgewotCQkJdGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKG9yaWdpbmFsUmFuZ2UueCwgb3JpZ2luYWxSYW5nZS55KTsKLQkJfQotCQllbHNlIHsKLQkJCW9yaWdpbmFsUmFuZ2UgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2Nyb2xsIHRoZSB2aXNpYmxlIGFyZWEgYXMgbmVlZGVkCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCWV2ZW50Lm9wZXJhdGlvbnMgJj0gfkRORC5EUk9QX01PVkU7Ci0JCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCWV2ZW50LmZlZWRiYWNrIHw9IERORC5GRUVEQkFDS19TQ1JPTEw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50Lm9wZXJhdGlvbnMgPT0gRE5ELkRST1BfTk9ORSkKLQkJCXJldHVybjsKLQotCQlUcmFuc2ZlcltdIHRzID0gZ2V0VHJhbnNmZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0c1tpXS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSkgewotCQkJCWlmIChkb0Ryb3AodHNbaV0sIGV2ZW50KSkgewotCQkJCQlJRWRpdG9yUGFydCBwYXJ0ID0gdGFyZ2V0RWRpdG9yOwotCQkJCQlpZiAodGFyZ2V0RWRpdG9yIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRFZGl0b3IpewotCQkJCQkJcGFydCA9ICgoU3RydWN0dXJlZFRleHRFZGl0b3IpIHRhcmdldEVkaXRvcikuZ2V0RWRpdG9yUGFydCgpOwotCQkJCQl9Ci0JCQkJCXRhcmdldEVkaXRvci5nZXRTaXRlKCkuZ2V0UGFnZSgpLmFjdGl2YXRlKHBhcnQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0VGFyZ2V0RWRpdG9yKCkgewotCQlyZXR1cm4gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyBJVGV4dFZpZXdlciBnZXRUZXh0Vmlld2VyKCkgewotCQlyZXR1cm4gdGV4dFZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJbXQotCSAqLwotCXB1YmxpYyBUcmFuc2ZlcltdIGdldFRyYW5zZmVycygpIHsKLQkJaWYgKHRyYW5zZmVycyA9PSBudWxsKSB7Ci0JCQlUcmFuc2ZlckJ1aWxkZXIgdGIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKHVzZVByb3h5KTsKLQkJCWlmIChlZGl0b3JJZHMgPT0gbnVsbCB8fCBlZGl0b3JJZHMubGVuZ3RoID09IDApCi0JCQkJdHJhbnNmZXJzID0gdGIuZ2V0RHJvcFRhcmdldFRyYW5zZmVycyhnZXRUYXJnZXRFZGl0b3IoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQllbHNlCi0JCQkJdHJhbnNmZXJzID0gdGIuZ2V0RHJvcFRhcmdldFRyYW5zZmVycyhlZGl0b3JJZHMpOwotCQl9Ci0JCXJldHVybiB0cmFuc2ZlcnM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RWRpdG9yKElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQl0aGlzLnRhcmdldEVkaXRvciA9IHRhcmdldEVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRJRHMoU3RyaW5nW10gaWRzKSB7Ci0JCWVkaXRvcklkcyA9IGlkczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0Vmlld2VyKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJdGhpcy50ZXh0Vmlld2VyID0gdGV4dFZpZXdlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9GaWxlRHJvcEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0ZpbGVEcm9wQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OGRlOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0ZpbGVEcm9wQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLS8qKgotICogQWN0aW9uIGZvciBmaWxlIGRyb3AKLSAqLwotcHVibGljIGNsYXNzIEZpbGVEcm9wQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3REcm9wQWN0aW9uIHsKLQlwdWJsaWMgYm9vbGVhbiBydW4oRHJvcFRhcmdldEV2ZW50IGV2ZW50LCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJU3RyaW5nW10gc3RycyA9IChTdHJpbmdbXSkgZXZlbnQuZGF0YTsKLQkJaWYgKHN0cnMgPT0gbnVsbCB8fCBzdHJzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlTdHJpbmcgc3RyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJzLmxlbmd0aDsgKytpKSB7Ci0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoc3Ryc1tpXSk7Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlGaWxlIGZpbGUgPSByb290LmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlwYXRoID0gZmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQl9Ci0KLQkJCXN0ciArPSAiXCIiICsgcGF0aC50b1N0cmluZygpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlyZXR1cm4gaW5zZXJ0KHN0ciwgdGFyZ2V0RWRpdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0Zvcm1hdFByb2Nlc3NvcnNFeHRlbnNpb25SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThmMTBhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEZvcm1hdFByb2Nlc3NvcnNFeHRlbnNpb25SZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlciBpbnN0YW5jZTsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEZvcm1hdFByb2Nlc3NvcnNFeHRlbnNpb25SZWFkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBGb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyKCk7Ci0KLQkJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlpbnN0YW5jZS5yZWFkUmVnaXN0cnkocmVnaXN0cnksICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiLCAiZm9ybWF0UHJvY2Vzc29ycyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLS8vCSBUT0RPOiBwcml2YXRlIGZpZWxkIG5ldmVyIHJlYWQgbG9jYWxseQotCVN0cmluZyBwcm9jZXNzb3JDbGFzc05hbWU7Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZ2V0Rm9ybWF0UHJvY2Vzc29yKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCWlmIChjb250ZW50VHlwZUlkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBudWxsOwotCQlpZiAobWFwLmNvbnRhaW5zS2V5KGNvbnRlbnRUeXBlSWQpKSB7Ci0JCQlmb3JtYXRQcm9jZXNzb3IgPSAoSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IpIG1hcC5nZXQoY29udGVudFR5cGVJZCk7Ci0JCX0gZWxzZSB7Ci0JCQlJQ29udGVudFR5cGVNYW5hZ2VyIG1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJCUlDb250ZW50VHlwZSBxdWVyeUNvbnRlbnRUeXBlID0gbWFuYWdlci5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlkKTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgZWxlbWVudENvbnRlbnRUeXBlSWQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlJQ29udGVudFR5cGUgZWxlbWVudENvbnRlbnRUeXBlID0gbWFuYWdlci5nZXRDb250ZW50VHlwZShlbGVtZW50Q29udGVudFR5cGVJZCk7Ci0JCQkJaWYgKHF1ZXJ5Q29udGVudFR5cGUuaXNLaW5kT2YoZWxlbWVudENvbnRlbnRUeXBlKSkgewotCQkJCQlmb3JtYXRQcm9jZXNzb3IgPSAoSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IpIG1hcC5nZXQoZWxlbWVudENvbnRlbnRUeXBlSWQpOwotCQkJCQltYXAucHV0KGNvbnRlbnRUeXBlSWQsIGZvcm1hdFByb2Nlc3Nvcik7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIWZvdW5kKQotCQkJCW1hcC5wdXQoY29udGVudFR5cGVJZCwgbnVsbCk7Ci0JCX0KLQotCQlyZXR1cm4gZm9ybWF0UHJvY2Vzc29yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKCJwcm9jZXNzb3IiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgY29udGVudFR5cGVJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjb250ZW50VHlwZUlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBwcm9jZXNzb3JDbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHBsdWdpbklEID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSUQpOwotCi0JCQl0cnkgewotCQkJCUlTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIHByb2Nlc3NvciA9IChJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcilidW5kbGUubG9hZENsYXNzKHByb2Nlc3NvckNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJCQltYXAucHV0KGNvbnRlbnRUeXBlSWQsIHByb2Nlc3Nvcik7Ci0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvR290b0Fubm90YXRpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9Hb3RvQW5ub3RhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2RlMjhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9Hb3RvQW5ub3RhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LkVkaXRvcnNVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQW5ub3RhdGlvblByZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRWRpdG9yU3RhdHVzTGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2ltcGxlTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb247Ci0KLS8qKgotICogQmFzZWQgb24gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmphdmFlZGl0b3IuR290b0Fubm90YXRpb25BY3Rpb24gYW5kCi0gKiB0aGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFFZGl0b3IncyBnb3RvRXJyb3IoKSBtZXRob2QuIFJld3JpdHRlbgotICogYmFzZWQgb24gMy4wTTcgdmVyc2lvbiB0byBvcGVyYXRlIGdlbmVyaWNhbGx5LgotICogCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkdvdG9Bbm5vdGF0aW9uQWN0aW9uCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEdvdG9Bbm5vdGF0aW9uQWN0aW9uIGV4dGVuZHMgVGV4dEVkaXRvckFjdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1ZyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2dvdG9OZXh0QW5ub3RhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBzdGF0dXMgbGluZSBvbiBzZWxlY3Rpb24gY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3RhdHVzTGluZUNsZWFyZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkJSVN0YXR1c0xpbmVNYW5hZ2VyIGZTdGF0dXNMaW5lTWFuYWdlciA9IG51bGw7Ci0KLQkJcHJvdGVjdGVkIFN0YXR1c0xpbmVDbGVhcmVyKElTdGF0dXNMaW5lTWFuYWdlciBtZ3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQlmU3RhdHVzTGluZU1hbmFnZXIgPSBtZ3I7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoU3RhdHVzTGluZUNsZWFyZXIudGhpcyk7Ci0KLQkJCWZTdGF0dXNMaW5lTWFuYWdlci5zZXRFcnJvck1lc3NhZ2UobnVsbCwgbnVsbCk7Ci0JCQlmU3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShudWxsLCBudWxsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBmRm9yd2FyZDsKLQlwcml2YXRlIFN0cmluZyBmTGFiZWw7Ci0KLQlwcml2YXRlIFN0cmluZyBmUHJlZml4OwotCi0JLyoqCi0JICogQHBhcmFtIHByZWZpeAotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgR290b0Fubm90YXRpb25BY3Rpb24oU3RyaW5nIHByZWZpeCwgYm9vbGVhbiBmb3J3YXJkKSB7Ci0JCXN1cGVyKFNTRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgcHJlZml4LCBudWxsKTsKLQkJZkZvcndhcmQgPSBmb3J3YXJkOwotCQlmUHJlZml4ID0gcHJlZml4OwotCQlmTGFiZWwgPSBTU0VVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGZQcmVmaXgpOwotCX0KLQotCS8qCi0JICogVGhpcyBpcyB0aGUgZGVmYXVsdCBsYWJlbCB1c2VkIGZvciBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdExhYmVsKCkgewotCQlyZXR1cm4gZkxhYmVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGdldERlZmF1bHRMYWJlbCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFubm90YXRpb24gY2xvc2VzdCB0byB0aGUgZ2l2ZW4gcmFuZ2UgcmVzcGVjdGluZyB0aGUgZ2l2ZW4KLQkgKiBkaXJlY3Rpb24uIElmIGFuIGFubm90YXRpb24gaXMgZm91bmQsIHRoZSBhbm5vdGF0aW9ucyBjdXJyZW50IHBvc2l0aW9uCi0JICogaXMgY29waWVkIGludG8gdGhlIHByb3ZpZGVkIGFubm90YXRpb24gcG9zaXRpb24uCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbiBvZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgcmVnaW9uIGxlbmd0aAotCSAqIEBwYXJhbSBmb3J3YXJkCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBmb3IgZm9yd2FyZHMsIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IKLQkgKiAgICAgICAgICAgIGJhY2t3YXJkCi0JICogQHBhcmFtIGFubm90YXRpb25Qb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIG9mIHRoZSBmb3VuZCBhbm5vdGF0aW9uCi0JICogQHJldHVybiB0aGUgZm91bmQgYW5ub3RhdGlvbgotCSAqLwotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldE5leHRBbm5vdGF0aW9uKGZpbmFsIGludCBvZmZzZXQsIGZpbmFsIGludCBsZW5ndGgsIGJvb2xlYW4gZm9yd2FyZCwgUG9zaXRpb24gYW5ub3RhdGlvblBvc2l0aW9uKSB7Ci0JCUFubm90YXRpb24gbmV4dEFubm90YXRpb24gPSBudWxsOwotCQlQb3NpdGlvbiBuZXh0QW5ub3RhdGlvblBvc2l0aW9uID0gbnVsbDsKLQkJQW5ub3RhdGlvbiBjb250YWluaW5nQW5ub3RhdGlvbiA9IG51bGw7Ci0JCVBvc2l0aW9uIGNvbnRhaW5pbmdBbm5vdGF0aW9uUG9zaXRpb24gPSBudWxsOwotCQlib29sZWFuIGN1cnJlbnRBbm5vdGF0aW9uID0gZmFsc2U7Ci0KLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0VGV4dEVkaXRvcigpLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChnZXRUZXh0RWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCWludCBlbmRPZkRvY3VtZW50ID0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCWludCBkaXN0YW5jZSA9IEludGVnZXIuTUFYX1ZBTFVFOwotCi0JCUlBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSBnZXRUZXh0RWRpdG9yKCkuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldEFubm90YXRpb25Nb2RlbChnZXRUZXh0RWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCS8vIGV4dGVybmFsIGZpbGVzIG1heSBub3QgaGF2ZSBhbiBhbm5vdGF0aW9uIG1vZGVsCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gbW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlBbm5vdGF0aW9uIGEgPSAoQW5ub3RhdGlvbikgZS5uZXh0KCk7Ci0JCQkJaWYgKCFpc05hdmlnYXRpb25UYXJnZXQoYSkpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJUG9zaXRpb24gcCA9IG1vZGVsLmdldFBvc2l0aW9uKGEpOwotCQkJCWlmIChwID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKGZvcndhcmQgJiYgcC5vZmZzZXQgPT0gb2Zmc2V0IHx8ICFmb3J3YXJkICYmIHAub2Zmc2V0ICsgcC5nZXRMZW5ndGgoKSA9PSBvZmZzZXQgKyBsZW5ndGgpIHsKLQkJCQkJaWYgKGNvbnRhaW5pbmdBbm5vdGF0aW9uID09IG51bGwgfHwgKGZvcndhcmQgJiYgcC5sZW5ndGggPj0gY29udGFpbmluZ0Fubm90YXRpb25Qb3NpdGlvbi5sZW5ndGggfHwgIWZvcndhcmQgJiYgcC5sZW5ndGggPj0gY29udGFpbmluZ0Fubm90YXRpb25Qb3NpdGlvbi5sZW5ndGgpKSB7Ci0JCQkJCQljb250YWluaW5nQW5ub3RhdGlvbiA9IGE7Ci0JCQkJCQljb250YWluaW5nQW5ub3RhdGlvblBvc2l0aW9uID0gcDsKLQkJCQkJCWN1cnJlbnRBbm5vdGF0aW9uID0gcC5sZW5ndGggPT0gbGVuZ3RoOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpbnQgY3VycmVudERpc3RhbmNlID0gMDsKLQotCQkJCQlpZiAoZm9yd2FyZCkgewotCQkJCQkJY3VycmVudERpc3RhbmNlID0gcC5nZXRPZmZzZXQoKSAtIG9mZnNldDsKLQkJCQkJCWlmIChjdXJyZW50RGlzdGFuY2UgPCAwKSB7Ci0JCQkJCQkJY3VycmVudERpc3RhbmNlID0gZW5kT2ZEb2N1bWVudCArIGN1cnJlbnREaXN0YW5jZTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKGN1cnJlbnREaXN0YW5jZSA8IGRpc3RhbmNlIHx8IGN1cnJlbnREaXN0YW5jZSA9PSBkaXN0YW5jZSAmJiBwLmxlbmd0aCA8IG5leHRBbm5vdGF0aW9uUG9zaXRpb24ubGVuZ3RoKSB7Ci0JCQkJCQkJZGlzdGFuY2UgPSBjdXJyZW50RGlzdGFuY2U7Ci0JCQkJCQkJbmV4dEFubm90YXRpb24gPSBhOwotCQkJCQkJCW5leHRBbm5vdGF0aW9uUG9zaXRpb24gPSBwOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJY3VycmVudERpc3RhbmNlID0gb2Zmc2V0ICsgbGVuZ3RoIC0gKHAuZ2V0T2Zmc2V0KCkgKyBwLmxlbmd0aCk7Ci0JCQkJCQlpZiAoY3VycmVudERpc3RhbmNlIDwgMCkKLQkJCQkJCQljdXJyZW50RGlzdGFuY2UgPSBlbmRPZkRvY3VtZW50ICsgY3VycmVudERpc3RhbmNlOwotCi0JCQkJCQlpZiAoY3VycmVudERpc3RhbmNlIDwgZGlzdGFuY2UgfHwgY3VycmVudERpc3RhbmNlID09IGRpc3RhbmNlICYmIHAubGVuZ3RoIDwgbmV4dEFubm90YXRpb25Qb3NpdGlvbi5sZW5ndGgpIHsKLQkJCQkJCQlkaXN0YW5jZSA9IGN1cnJlbnREaXN0YW5jZTsKLQkJCQkJCQluZXh0QW5ub3RhdGlvbiA9IGE7Ci0JCQkJCQkJbmV4dEFubm90YXRpb25Qb3NpdGlvbiA9IHA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvbnRhaW5pbmdBbm5vdGF0aW9uUG9zaXRpb24gIT0gbnVsbCAmJiAoIWN1cnJlbnRBbm5vdGF0aW9uIHx8IG5leHRBbm5vdGF0aW9uID09IG51bGwpKSB7Ci0JCQlhbm5vdGF0aW9uUG9zaXRpb24uc2V0T2Zmc2V0KGNvbnRhaW5pbmdBbm5vdGF0aW9uUG9zaXRpb24uZ2V0T2Zmc2V0KCkpOwotCQkJYW5ub3RhdGlvblBvc2l0aW9uLnNldExlbmd0aChjb250YWluaW5nQW5ub3RhdGlvblBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQkJCXJldHVybiBjb250YWluaW5nQW5ub3RhdGlvbjsKLQkJfQotCQlpZiAobmV4dEFubm90YXRpb25Qb3NpdGlvbiAhPSBudWxsKSB7Ci0JCQlhbm5vdGF0aW9uUG9zaXRpb24uc2V0T2Zmc2V0KG5leHRBbm5vdGF0aW9uUG9zaXRpb24uZ2V0T2Zmc2V0KCkpOwotCQkJYW5ub3RhdGlvblBvc2l0aW9uLnNldExlbmd0aChuZXh0QW5ub3RhdGlvblBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQkJfQotCi0JCXJldHVybiBuZXh0QW5ub3RhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXNMaW5lTWFuYWdlciBnZXRTdGF0dXNMaW5lTWFuYWdlcigpIHsKLQkJLy8gVGhlIG9yaWdpbmFsIEphdmFFZGl0b3IgTTcgaW1wbGVtZW50YXRpb24gbWFkZSB1c2Ugb2YgYW4gYWRhcHRlciwKLQkJLy8gYnV0IHRoYXQgYXBwcm9hY2gKLQkJLy8gZmFpbHMgd2l0aCBhIE11bHRpUGFnZUVkaXRvclNpdGUKLQkJCi0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAocGFnZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCWlmIChlZGl0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSBlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0JCWlmIChjb250cmlidXRvciBpbnN0YW5jZW9mIEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKSB7Ci0JCQlyZXR1cm4gKChFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcikgY29udHJpYnV0b3IpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGdldERlZmF1bHRMYWJlbCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUb29sVGlwVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJcmV0dXJuIGdldERlZmF1bHRMYWJlbCgpOwotCX0KLQotCS8qKgotCSAqIEp1bXBzIHRvIHRoZSBlcnJvciBuZXh0IGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gZGlyZWN0aW9uIGJhc2VkIG9mZgotCSAqIEphdmFFZGl0b3IjZ290b0Fubm90YXRpb24oKQotCSAqIAotCSAqIEBwYXJhbSBmb3J3YXJkCi0JICogICAgICAgICAgICBpcyB0aGUgZGlyZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgZ290b0Fubm90YXRpb24oYm9vbGVhbiBmb3J3YXJkKSB7Ci0JCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCVBvc2l0aW9uIHBvc2l0aW9uID0gbmV3IFBvc2l0aW9uKDAsIDApOwotCQlpZiAoZmFsc2UgLyogZGVsYXllZCAtIHNlZSBidWcgMTgzMTYgKi8pIHsKLQkJCWdldE5leHRBbm5vdGF0aW9uKHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpLCBmb3J3YXJkLCBwb3NpdGlvbik7Ci0JCQlnZXRUZXh0RWRpdG9yKCkuc2VsZWN0QW5kUmV2ZWFsKHBvc2l0aW9uLmdldE9mZnNldCgpLCBwb3NpdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCX0KLQkJZWxzZSAvKiBubyBkZWxheSAtIHNlZSBidWcgMTgzMTYgKi97Ci0JCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXROZXh0QW5ub3RhdGlvbihzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSwgZm9yd2FyZCwgcG9zaXRpb24pOwotCQkJSUVkaXRvclN0YXR1c0xpbmUgZWRpdG9yU3RhdHVzTGluZSA9IChJRWRpdG9yU3RhdHVzTGluZSkgZ2V0VGV4dEVkaXRvcigpLmdldEFkYXB0ZXIoSUVkaXRvclN0YXR1c0xpbmUuY2xhc3MpOwotCQkJaWYgKGVkaXRvclN0YXR1c0xpbmUgIT0gbnVsbCkgewotCQkJCWVkaXRvclN0YXR1c0xpbmUuc2V0TWVzc2FnZSh0cnVlLCBudWxsLCBudWxsKTsKLQkJCQllZGl0b3JTdGF0dXNMaW5lLnNldE1lc3NhZ2UoZmFsc2UsIG51bGwsIG51bGwpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSVN0YXR1c0xpbmVNYW5hZ2VyIG1nciA9IGdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0JCQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQkJCW1nci5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJCW1nci5zZXRNZXNzYWdlKG51bGwsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQl1cGRhdGVBbm5vdGF0aW9uVmlld3MoYW5ub3RhdGlvbik7Ci0JCQkJaWYgKF9kZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNlbGVjdCBhbmQgcmV2ZWFsICIgKyBhbm5vdGF0aW9uLmdldFR5cGUoKSArICJAIiArIHBvc2l0aW9uLmdldE9mZnNldCgpICsgIjoiICsgcG9zaXRpb24uZ2V0TGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCQlnZXRUZXh0RWRpdG9yKCkuc2VsZWN0QW5kUmV2ZWFsKHBvc2l0aW9uLmdldE9mZnNldCgpLCBwb3NpdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJaWYgKGVkaXRvclN0YXR1c0xpbmUgIT0gbnVsbCkgewotCQkJCQllZGl0b3JTdGF0dXNMaW5lLnNldE1lc3NhZ2UodHJ1ZSwgbnVsbCwgbnVsbCk7Ci0JCQkJCWVkaXRvclN0YXR1c0xpbmUuc2V0TWVzc2FnZShmYWxzZSwgYW5ub3RhdGlvbi5nZXRUZXh0KCksIG51bGwpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJSVN0YXR1c0xpbmVNYW5hZ2VyIG1nciA9IGdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0JCQkJCWlmIChtZ3IgIT0gbnVsbCkgewotCQkJCQkJbWdyLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQkJCW1nci5zZXRNZXNzYWdlKG51bGwsIGFubm90YXRpb24uZ2V0VGV4dCgpKTsKLQkJCQkJfQotCQkJCQlnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IFN0YXR1c0xpbmVDbGVhcmVyKG1ncikpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gYW5ub3RhdGlvbiBpcyBjb25maWd1cmVkIGFzIGEgdGFyZ2V0IGZvciB0aGUKLQkgKiAiR28gdG8gTmV4dC9QcmV2aW91cyBBbm5vdGF0aW9uIiBhY3Rpb25zCi0JICogCi0JICogQHBhcmFtIGFubm90YXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBhbm5vdGF0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgdGFyZ2V0LCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZQotCSAqIEBzZWUgRWNsaXBzZSAzLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05hdmlnYXRpb25UYXJnZXQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gRWRpdG9yc1VJLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCUFubm90YXRpb25QcmVmZXJlbmNlIHByZWZlcmVuY2UgPSBFZGl0b3JzVUkuZ2V0QW5ub3RhdGlvblByZWZlcmVuY2VMb29rdXAoKS5nZXRBbm5vdGF0aW9uUHJlZmVyZW5jZShhbm5vdGF0aW9uKTsKLQkJLy8gU2VlIGJ1ZyA0MTY4OQotCQkvLyBTdHJpbmcga2V5PSBmb3J3YXJkID8gcHJlZmVyZW5jZS5nZXRJc0dvVG9OZXh0TmF2aWdhdGlvblRhcmdldEtleSgpCi0JCS8vIDogcHJlZmVyZW5jZS5nZXRJc0dvVG9QcmV2aW91c05hdmlnYXRpb25UYXJnZXRLZXkoKTsKLQkJU3RyaW5nIGtleSA9IHByZWZlcmVuY2UgPT0gbnVsbCA/IG51bGwgOiBwcmVmZXJlbmNlLmdldElzR29Ub05leHROYXZpZ2F0aW9uVGFyZ2V0S2V5KCk7Ci0JCXJldHVybiAoa2V5ICE9IG51bGwgJiYgcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihrZXkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWdvdG9Bbm5vdGF0aW9uKGZGb3J3YXJkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFZGl0b3IoSVRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyLnNldEVkaXRvcihlZGl0b3IpOwotCQl1cGRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBhbm5vdGF0aW9uIHZpZXdzIHRoYXQgc2hvdyB0aGUgZ2l2ZW4gYW5ub3RhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYW5ub3RhdGlvbgotCSAqICAgICAgICAgICAgdGhlIGFubm90YXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBbm5vdGF0aW9uVmlld3MoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCUlNYXJrZXIgbWFya2VyID0gbnVsbDsKLQkJaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBTaW1wbGVNYXJrZXJBbm5vdGF0aW9uKQotCQkJbWFya2VyID0gKChTaW1wbGVNYXJrZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKS5nZXRNYXJrZXIoKTsKLQotCQlpZiAobWFya2VyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCQkJSVZpZXdQYXJ0IHZpZXcgPSBudWxsOwotCQkJCQkJaWYgKG1hcmtlci5pc1N1YnR5cGVPZihJTWFya2VyLlBST0JMRU0pKSB7Ci0JCQkJCQkJdmlldyA9IHBhZ2UuZmluZFZpZXcoSVBhZ2VMYXlvdXQuSURfUFJPQkxFTV9WSUVXKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKG1hcmtlci5pc1N1YnR5cGVPZihJTWFya2VyLlRBU0spKSB7Ci0JCQkJCQkJdmlldyA9IHBhZ2UuZmluZFZpZXcoSVBhZ2VMYXlvdXQuSURfVEFTS19MSVNUKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKG1hcmtlci5pc1N1YnR5cGVPZihJTWFya2VyLkJPT0tNQVJLKSkgewotCQkJCQkJCXZpZXcgPSBwYWdlLmZpbmRWaWV3KElQYWdlTGF5b3V0LklEX0JPT0tNQVJLUyk7Ci0JCQkJCQl9Ci0vLwkJCQkJCWVsc2UgaWYgKG1hcmtlci5pc1N1YnR5cGVPZihJQnJlYWtwb2ludC5CUkVBS1BPSU5UX01BUktFUikpIHsKLS8vCQkJCQkJCXZpZXcgPSBwYWdlLmZpbmRWaWV3KElEZWJ1Z1VJQ29uc3RhbnRzLklEX0JSRUFLUE9JTlRfVklFVyk7Ci0vLwkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYgKHZpZXcgPT0gbnVsbCkgewotCQkJCQkJCXZpZXcgPSBwYWdlLmZpbmRWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5BbGxNYXJrZXJzVmlldyIpOwotCQkJCQkJfQotCQkJCQkJLy8gSWYgdGhlIHZpZXcgaXNuJ3Qgb3BlbiBvbiB0aGlzIHBlcnNwZWN0aXZlLCBkb24ndAotCQkJCQkJLy8gaW50ZXJhY3Qgd2l0aCBpdAotCQkJCQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJCQkJCU1ldGhvZCBtZXRob2QgPSB2aWV3LmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzZXRTZWxlY3Rpb24iLCBuZXcgQ2xhc3NbXXtJU3RydWN0dXJlZFNlbGVjdGlvbi5jbGFzcywgYm9vbGVhbi5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJCQkJCW1ldGhvZC5pbnZva2UodmlldywgbmV3IE9iamVjdFtde25ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1hcmtlciksIEJvb2xlYW4uVFJVRX0pOwotCQkJCQkJCQlwYWdlLmJyaW5nVG9Ub3Aodmlldyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gaWdub3JlIGV4Y2VwdGlvbnMsIGRvbid0IHVwZGF0ZSBhbnkgb2YgdGhlIGxpc3RzLCBqdXN0IHNldAotCQkJLy8gc3RhdHVzbGluZQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24geCkgewotCQkJCS8vCi0JCQl9Ci0JCQljYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHgpIHsKLQkJCQkvLwotCQkJfQotCQkJY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geCkgewotCQkJCS8vCi0JCQl9Ci0JCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JQWN0aW9uVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUFjdGlvblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTk1YmU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JQWN0aW9uVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotcHVibGljIGludGVyZmFjZSBJQWN0aW9uVmFsaWRhdG9yIHsKLQlib29sZWFuIGlzVmFsaWRBY3Rpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRHJvcEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lEcm9wQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzUxYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lEcm9wQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURyb3BBY3Rpb24gewotCi0KLQkvKioKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgRHJvcFRhcmdldEV2ZW50LmRhdGEgd2lsbCBiZSBwYXNzZWQuCi0JICogQHJldHVybiBib29sZWFuIHRydWUgZm9yIHN1cHBvcnRlZCBkYXRhIHR5cGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZERhdGEoT2JqZWN0IGRhdGEpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuIHRydWUgZm9yIHRoZSBhY3Rpb24gaXMgYWN0dWFsbHkgcHJvY2Vzc2VkIGZhbHNlIGZvciB0aGUKLQkgKiAgICAgICAgIGFjdGlvbiBpcyBub3QgcHJvY2Vzc2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJ1bihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQsIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRXh0ZW5kZWRDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTc4YTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRXh0ZW5kZWRDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbmRlZENvbnRyaWJ1dG9yIGV4dGVuZHMgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLCBJUG9wdXBNZW51Q29udHJpYnV0b3IgewotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpOwotCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvU3RhdHVzTGluZShJU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlcik7Ci0KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciBtYW5hZ2VyKTsKLQotCXB1YmxpYyB2b2lkIHVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkRWRpdG9yQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkRWRpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZmU0N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lFeHRlbmRlZEVkaXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbmRlZEVkaXRvckFjdGlvbiBleHRlbmRzIElVcGRhdGUgewotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYWN0aW9uIGl0ZW0gaXMgdmlzaWJsZQotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpdGVtIGlzIHZpc2libGUsIGFuZAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgYWN0aXZlIGVkaXRvciBmb3IgdGhlIGFjdGlvbi4gSW1wbGVtZW50b3JzIHNob3VsZCBkaXNjb25uZWN0Ci0JICogZnJvbSB0aGUgb2xkIGVkaXRvciwgY29ubmVjdCB0byB0aGUgbmV3IGVkaXRvciwgYW5kIHVwZGF0ZSB0aGUgYWN0aW9uCi0JICogdG8gcmVmbGVjdCB0aGUgbmV3IGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0RWRpdG9yCi0JICogICAgICAgICAgICB0aGUgbmV3IGVkaXRvciB0YXJnZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFeHRlbmRlZEVkaXRvcihJRXh0ZW5kZWRTaW1wbGVFZGl0b3IgdGFyZ2V0RWRpdG9yKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRXh0ZW5kZWRNYXJrdXBFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRXh0ZW5kZWRNYXJrdXBFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2NDZkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkTWFya3VwRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogSUV4dGVuZGVkTWFya3VwRWRpdG9yCi0gKiAKLSAqIEBkZXByZWNhdGVkIHVzZSB0aGUgZWRpdG9yJ3MgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgYWRhcHRlciBhbmQgY2FzdCB0bwotICogICAgICAgICAgICAgSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgd2hlbiBhcHByb3ByaWF0ZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbmRlZE1hcmt1cEVkaXRvciAgewotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgdGhlIElET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmdldE5vZGUoaW50KSBtZXRob2QKLQkgKiAgICAgICAgICAgICB3aXRoIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmdldENhcmV0T2Zmc2V0KCkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Q2FyZXROb2RlKCk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBtZXRob2Qgb24gSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0RE9NRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gc29tZSBlZGl0b3JzIHdpbGwgcHJvdmlkZSB0aGUgbGlzdCBvZiBzZWxlY3RlZCBub2RlcyBhcwotCSAqICAgICAgICAgICAgIHBhcnQgb2YgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuZ2V0U2VsZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZWxlY3RlZE5vZGVzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkU2ltcGxlRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkU2ltcGxlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxODc4MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lFeHRlbmRlZFNpbXBsZUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQsIG9idGFpbiBhIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIGFkYXB0ZXIgZnJvbSB0aGUgZWRpdG9yIHBhcnQKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbmRlZFNpbXBsZUVkaXRvciB7Ci0KLQlwdWJsaWMgaW50IGdldENhcmV0UG9zaXRpb24oKTsKLQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotCXB1YmxpYyBJRWRpdG9yUGFydCBnZXRFZGl0b3JQYXJ0KCk7Ci0KLQlwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lNb2RlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI1ZTI4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSURvY3VtZW50UHJvdmlkZXIgewotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoT2JqZWN0IGVsZW1lbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lQb3B1cE1lbnVDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lQb3B1cE1lbnVDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjQ3MjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JUG9wdXBNZW51Q29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVBvcHVwTWVudUNvbnRyaWJ1dG9yIHsKLQotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1BvcHVwTWVudShJTWVudU1hbmFnZXIgbWVudSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSVJlbGVhc2FibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JUmVsZWFzYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGE1OTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JUmVsZWFzYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlbGVhc2FibGUgewotCS8qKgotCSAqIEdlbmVyaWMgY2F0Y2gtYWxsIGZvciByZWxlYXNpbmcgcmVzb3VyY2VzIGFuZCBvdGhlciByZWZlcmVuY2VzCi0JICovCi0Jdm9pZCByZWxlYXNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOGE5NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciB7Ci0KLQkvKioKLQkgKiBFbmFibGVzIGRpc2FibGVzIGFjdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlIHNvdXJjZSB2aWV3ZXIgKGFuZAotCSAqIHNob3VsZCBvbmx5IHdvcmsgd2hlbiB0aGUgc291cmNlIHZpZXdlciBpcyBlbmFibGVkKQotCSAqIAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICogICAgICAgICAgICB0cnVlIGlmIHNvdXJjZSB2aWV3ZXIgaXMgY3VycmVudGx5IGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRiMTMxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSVN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzIHsKLQlTdHJpbmcgU09VUkNFX0NPTlRFWFRfTUVOVV9JRCA9ICJzb3VyY2VQb3B1cE1lbnVJZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU09VUkNFX0JFR0lOID0gInNvdXJjZUJlZ2luIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTT1VSQ0VfQURESVRJT05TID0gImFkZGl0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU09VUkNFX0VORCA9ICJzb3VyY2VFbmQiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgUkVGQUNUT1JfQ09OVEVYVF9NRU5VX0lEID0gInJlZmFjdG9yUG9wdXBNZW51SWQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSVRlbXBvcmFyeUFubm90YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JVGVtcG9yYXJ5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGY2NDQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JVGVtcG9yYXJ5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVRlbXBvcmFyeUFubm90YXRpb24gewotCU9iamVjdCBnZXRLZXkoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2ZTNmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYKLSAqIGRlc2lyZWQsIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzCi0gKiBwbHVnaW4uIE90aGVyIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCV9sb2coc3RhdHVzT2JqKTsKLQotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHtAbGluayBJU3RhdHVzfSB0byB0aGUgbG9nLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXNPYmoge0BsaW5rIElTdGF0dXN9IHRvIGFkZCB0byB0aGUgbG9nCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coSVN0YXR1cyBzdGF0dXNPYmopIHsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiA8cD5BbGxvd3MgYW4gYWxyZWFkeSBjb25zdHJ1Y3RlZCBzdGF0dXMgdG8gYmUgbG9nZ2VkPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMge0BsaW5rIElTdGF0dXN9IHRvIGxvZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCV9sb2coc3RhdHVzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGM4Y2NhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRWRpdG9yc1VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLkFic3RyYWN0U3RydWN0dXJlZEZvbGRpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzLkNvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lczsKLQotCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlDb2xvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRUaGVtZU1hbmFnZXIoKS5nZXRDdXJyZW50VGhlbWUoKS5nZXRDb2xvclJlZ2lzdHJ5KCk7Ci0JCQotCQkvLyB1c2UgdGhlIGJhc2UgYW5ub3RhdGlvbiAmIHF1aWNrIGRpZmYgcHJlZmVyZW5jZSBwYWdlCi0JCUVkaXRvcnNVSS51c2VBbm5vdGF0aW9uc1ByZWZlcmVuY2VQYWdlKHN0b3JlKTsKLQkJRWRpdG9yc1VJLnVzZVF1aWNrRGlmZlByZWZlcmVuY2VQYWdlKHN0b3JlKTsKLQotCQkvLyBsZXQgYW5ub3RhdGlvbnMgc2hvdyB1cCBpbiB0aGUgdmVydGljYWwgcnVsZXIgaWYgdGhhdCdzIHdoYXQgdGhlCi0JCS8vIHByZWZlcmVuY2UgaXMKLQkJLy8JCS8vIHRoZXNlIGFubm90YXRpb24gcHJlZmVyZW5jZXMgaGF2ZSBhIGRpZmZlcmVudCBkZWZhdWx0IHZhbHVlIHRoYW4KLQkJLy8gdGhlIG9uZSB0aGUgYmFzZSBwcm92aWRlcwotCQkvLwkJc3RvcmUuc2V0RGVmYXVsdCgiZXJyb3JJbmRpY2F0aW9uSW5WZXJ0aWNhbFJ1bGVyIiwgZmFsc2UpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vCQlzdG9yZS5zZXREZWZhdWx0KCJ3YXJuaW5nSW5kaWNhdGlvbkluVmVydGljYWxSdWxlciIsIGZhbHNlKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCi0JCS8vIHRoZXNlIGFubm90YXRpb24gcHJlZmVyZW5jZXMgYXJlIG5vdCBwYXJ0IG9mIGJhc2UgdGV4dCBlZGl0b3IKLQkJLy8gcHJlZmVyZW5jZQotCQlzdG9yZS5zZXREZWZhdWx0KENvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lcy5FVkFMVUFURV9URU1QT1JBUllfUFJPQkxFTVMsIHRydWUpOwotCi0JCXNldE1hdGNoaW5nQnJhY2tldHNQcmVmZXJlbmNlcyhzdG9yZSwgcmVnaXN0cnkpOwotCi0JCS8vIGhvdmVyIGhlbHAgcHJlZmVyZW5jZXMgYXJlIG5vdCBwYXJ0IG9mIGJhc2UgdGV4dCBlZGl0b3IgcHJlZmVyZW5jZQotCQlTdHJpbmcgbW9kMk5hbWUgPSBBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKFNXVC5NT0QyKTsgLy8gU1dULkNPTU1BTkQKLQkJLy8gb24gTWFjOwotCQkvLyBTV1QuQ09OVFJPTAotCQkvLyBlbHNld2hlcmUKLQkJc3RvcmUuc2V0RGVmYXVsdChFZGl0b3JQcmVmZXJlbmNlTmFtZXMuRURJVE9SX1RFWFRfSE9WRVJfTU9ESUZJRVJTLCAiY29tYmluYXRpb25Ib3Zlcnx0cnVlfDA7cHJvYmxlbUhvdmVyfGZhbHNlfDA7ZG9jdW1lbnRhdGlvbkhvdmVyfGZhbHNlfDA7YW5ub3RhdGlvbkhvdmVyfHRydWV8IiArIG1vZDJOYW1lKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHNldCBkZWZhdWx0IHJlYWQtb25seSBmb3JlZ3JvdW5kIGNvbG9yIHNjYWxlIHZhbHVlCi0JCXN0b3JlLnNldERlZmF1bHQoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLlJFQURfT05MWV9GT1JFR1JPVU5EX1NDQUxFLCAzMCk7Ci0JCQotCQkvLyBzZXQgZGVmYXVsdCBlbmFibGUgZm9sZGluZyB2YWx1ZQotCQlzdG9yZS5zZXREZWZhdWx0KEFic3RyYWN0U3RydWN0dXJlZEZvbGRpbmdTdHJhdGVneS5GT0xESU5HX0VOQUJMRUQsIHRydWUpOwotCQkKLQkJLy8gc2V0IGRlZmF1bHQgZm9yIHNob3cgbWVzc2FnZSBkaWFsb2cgd2hlbiB1bmtub3duIGNvbnRlbnQgdHlwZSBpbiBlZGl0b3IKLQkJc3RvcmUuc2V0RGVmYXVsdChFZGl0b3JQcmVmZXJlbmNlTmFtZXMuU0hPV19VTktOT1dOX0NPTlRFTlRfVFlQRV9NU0csIHRydWUpOwotCQkKLQkJLy8gc2V0IGNvbnRlbnQgYXNzaXN0IGRlZmF1bHRzCi0JCXN0b3JlLnNldERlZmF1bHQoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfQVVUT0FDVElWQVRJT05fREVMQVksIDUwMCk7Ci0JCVByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0RGVmYXVsdChzdG9yZSwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfUFJPUE9TQUxTX0JBQ0tHUk9VTkQsIENvbG9ySGVscGVyLmZpbmRSR0IocmVnaXN0cnksIEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BST1BPU0FMU19CQUNLR1JPVU5ELCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpKSk7Ci0JCVByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0RGVmYXVsdChzdG9yZSwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfUFJPUE9TQUxTX0ZPUkVHUk9VTkQsIENvbG9ySGVscGVyLmZpbmRSR0IocmVnaXN0cnksIEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BST1BPU0FMU19GT1JFR1JPVU5ELCBuZXcgUkdCKDAsIDAsIDApKSk7Ci0JCVByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0RGVmYXVsdChzdG9yZSwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfUEFSQU1FVEVSU19CQUNLR1JPVU5ELCBDb2xvckhlbHBlci5maW5kUkdCKHJlZ2lzdHJ5LCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QQVJBTUVURVJTX0JBQ0tHUk9VTkQsIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSkpKTsKLQkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHN0b3JlLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QQVJBTUVURVJTX0ZPUkVHUk9VTkQsIENvbG9ySGVscGVyLmZpbmRSR0IocmVnaXN0cnksIEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BBUkFNRVRFUlNfRk9SRUdST1VORCwgbmV3IFJHQigwLCAwLCAwKSkpOwotCi0JCXN0b3JlLnNldERlZmF1bHQoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLlNFTUFOVElDX0hJR0hMSUdIVElORywgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE1hdGNoaW5nQnJhY2tldHNQcmVmZXJlbmNlcyhJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBDb2xvclJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCS8vIG1hdGNoaW5nIGJyYWNrZXRzIGlzIG5vdCBwYXJ0IG9mIGJhc2UgdGV4dCBlZGl0b3IgcHJlZmVyZW5jZQotCQlzdG9yZS5zZXREZWZhdWx0KEVkaXRvclByZWZlcmVuY2VOYW1lcy5NQVRDSElOR19CUkFDS0VUUywgdHJ1ZSk7Ci0JCVByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0RGVmYXVsdChzdG9yZSwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLk1BVENISU5HX0JSQUNLRVRTX0NPTE9SLCBDb2xvckhlbHBlci5maW5kUkdCKHJlZ2lzdHJ5LCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuTUFUQ0hJTkdfQlJBQ0tFVFNfQ09MT1IsIG5ldyBSR0IoMTkyLCAxOTIsIDE5MikpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1JlYWRPbmx5QXdhcmVEcm9wVGFyZ2V0QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1JlYWRPbmx5QXdhcmVEcm9wVGFyZ2V0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWE5NjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9SZWFkT25seUF3YXJlRHJvcFRhcmdldEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlBd2FyZURyb3BUYXJnZXRBZGFwdGVyIGV4dGVuZHMgRXh0ZW5kZWRFZGl0b3JEcm9wVGFyZ2V0QWRhcHRlciB7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBSZWFkT25seUF3YXJlRHJvcFRhcmdldEFkYXB0ZXIoYm9vbGVhbiB1c2VQcm94eSkgZm9yCi0JICogICAgICAgICAgICAgdGhlIHBlcmZvcm1hbmNlCi0JICovCi0JcHVibGljIFJlYWRPbmx5QXdhcmVEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgUmVhZE9ubHlBd2FyZURyb3BUYXJnZXRBZGFwdGVyKGJvb2xlYW4gdXNlUHJveHkpIHsKLQkJc3VwZXIodXNlUHJveHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IGdldFRleHRWaWV3ZXIoKS5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlQb2ludCByYW5nZSA9IGdldFRleHRWaWV3ZXIoKS5nZXRTZWxlY3RlZFJhbmdlKCk7Ci0JCQlpZiAoKChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCkuY29udGFpbnNSZWFkT25seShyYW5nZS54LCByYW5nZS55KSkgewotCQkJCWV2ZW50Lm9wZXJhdGlvbnMgPSBETkQuRFJPUF9OT05FOwotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkJZ2V0VGV4dFZpZXdlcigpLmdldFRleHRXaWRnZXQoKS5yZWRyYXcoKTsKLQkJCQlnZXRUZXh0Vmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpLnVwZGF0ZSgpOwotCQkJCWdldFRleHRWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCkuZ2V0RGlzcGxheSgpLmJlZXAoKTsKLQkJCX0KLQkJfQotCQlzdXBlci5kcm9wKGV2ZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TU0VVSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU1NFVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDUwODYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TU0VVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgU1NFIFVJCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU1NFVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGU7Ci0KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKGZSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCWZSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlmUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiBmUmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JcHJpdmF0ZSBTU0VVSU1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLQotICAgIHN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBTU0VVSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvcl9vcGVuaW5nX2ZpbGVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GaWxlX2lzX3JlYWRfb25seTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMzJjb25jYXRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aXBsZV9lcnJvcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VuZG9fVGV4dF9DaGFuZ2VfX0N0cmxfWl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5kb19UZXh0X0NoYW5nZV9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VbmRvX18wX19fQ3RybF9aX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmRvX19fMF9fX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfUmVkb19UZXh0X0NoYW5nZV9fQ3RybF9ZX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWRvX1RleHRfQ2hhbmdlX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1JlZG9fXzBfX19DdHJsX1lfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlZG9fX18wX19fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdF9Eb2N1bWVudF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0X0FjdGl2ZV9FbGVtZW50c19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dF9DdXRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRfUGFzdGVfVUlfOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cF9Eb2N1bWVudF9VSV87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ3V0X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9DdXRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ3V0X2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9DdXRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvcHlfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvcHlfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29weV9pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29weV9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfUGFzdGVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX1Bhc3RlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX1Bhc3RlX2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9QYXN0ZV9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfRGVsZXRlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9EZWxldGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfRGVsZXRlX2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9EZWxldGVfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50QXNzaXN0UHJvcG9zYWxzX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRBc3Npc3RQcm9wb3NhbHNfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50QXNzaXN0UHJvcG9zYWxzX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdERvY3VtZW50X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdERvY3VtZW50X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0RG9jdW1lbnRfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0RG9jdW1lbnRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0QWN0aXZlRWxlbWVudHNfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0QWN0aXZlRWxlbWVudHNfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRBY3RpdmVFbGVtZW50c19pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRBY3RpdmVFbGVtZW50c19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuRmlsZUZyb21Tb3VyY2VfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkZpbGVGcm9tU291cmNlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkZpbGVGcm9tU291cmNlX2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5GaWxlRnJvbVNvdXJjZV9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdE5leHRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRfU2hpZnRfUmlnaHRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRfU2hpZnRfTGVmdF9VSV87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfNGNvbmNhdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50X3R5cGVfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JlZ3JvdW5kX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYWNrZ3JvdW5kX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb2xkX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJdGFsaWNzX1VJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc3RvcmVfRGVmYXVsdF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2FtcGxlX3RleHRfX1VJXzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJyZWFrcG9pbnRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQnJlYWtwb2ludF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJyZWFrcG9pbnRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQnJlYWtwb2ludF9lcnJvcl9kaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQnJlYWtwb2ludF9lcnJvcl9kaWFsb2dfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVCcmVha3BvaW50X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUJyZWFrcG9pbnRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVCcmVha3BvaW50X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuYWJsZUJyZWFrcG9pbnRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5hYmxlQnJlYWtwb2ludF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuYWJsZUJyZWFrcG9pbnRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlzYWJsZUJyZWFrcG9pbnRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlzYWJsZUJyZWFrcG9pbnRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXNhYmxlQnJlYWtwb2ludF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW5hZ2VCcmVha3BvaW50c19hZGRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFuYWdlQnJlYWtwb2ludHNfcmVtb3ZlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbmFnZUJyZWFrcG9pbnRzX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFuYWdlQnJlYWtwb2ludHNfZXJyb3JfYWRkaW5nX3RpdGxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW5hZ2VCcmVha3BvaW50c19lcnJvcl9hZGRpbmdfbWVzc2FnZTE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdENvbG9yUGFnZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nX0xpbms7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdfRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yTW9kZWxVdGlsXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yTW9kZWxVdGlsXzE7Ci0KLQkvLyBUT0RPOiBUaGVzZSBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBpcwotCS8vIGRlbGV0ZWQKLQkvLyB3ZWIgY29udGVudCBzZXR0aW5ncwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0RlZmF1bHRfSFRNTF9ET0NUWVBFX0lEX19fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9DU1NfcHJvZmlsZV9fXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfVGFyZ2V0X0RldmljZV9fXzM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfVG9nZ2xlSW5zZXJ0TW9kZV9sYWJlbDsKLQotCS8vCi0JLy8gVGhlc2Ugc3RyaW5ncyBhcmUgdXNlZCBpbiBXb3JrYmVuY2ggbWVudSBiYXIKLQkvLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cGFuZFNlbGVjdGlvblRvTWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3VyY2VNZW51X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlZmFjdG9yTWVudV9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbmRPY2N1cnJlbmNlc0FjdGlvblByb3ZpZGVyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQWN0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2hvd1Byb3BlcnRpZXNBY3Rpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb25fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdE9wZW5Pbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdEFjdGlvbkRlbGVnYXRlX2pvYk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0QWN0aW9uRGVsZWdhdGVfZXJyb3JTdGF0dXNNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdEFjdGlvbkRlbGVnYXRlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0QWN0aW9uRGVsZWdhdGVfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRBY3Rpb25EZWxlZ2F0ZV81OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhbnNsdWNlbmN5UHJlZmVyZW5jZVRhYl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWJfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMjA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8yMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzI0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfNDA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV80MTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzQyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfNDM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV80NDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrVGFnUHJlZmVyZW5jZVRhYl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrVGFnUHJlZmVyZW5jZVRhYl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrVGFnUHJlZmVyZW5jZVRhYl83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzEyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzEzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzE0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzE1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzE2OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzE3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzE4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzE5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzIwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzIyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzIzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzI0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzI1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzI2OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzI3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzI4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzI5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzMwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzMxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlUGFnZV8zMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrVGFnUHJlZmVyZW5jZVRhYl8zMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrVGFnRXhjbHVzaW9uVGFiXzAxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdFeGNsdXNpb25UYWJfMDI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ0V4Y2x1c2lvblRhYl8wMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3BlcnR5UHJlZmVyZW5jZVBhZ2VfMDE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvcGVydHlQcmVmZXJlbmNlUGFnZV8wMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVQcmVmZXJlbmNlUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vTW9kaWZpY2F0aW9uQ29tcGxldGlvblByb3Bvc2FsXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQnJlYWtwb2ludEFjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbmFnZUJyZWFrcG9pbnRBY3Rpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW5hZ2VCcmVha3BvaW50QWN0aW9uXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdEJyZWFrcG9pbnRBY3Rpb25fMDsKLQkvLyBVc2VkIGluIFN0cnVjdHVyZWQgVGV4dCBFZGl0b3IgUHJlZmVyZW5jZSBQYWdlIC8gSG92ZXJzIFRhYgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9ob3ZlclByZWZlcmVuY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfa2V5TW9kaWZpZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX21vZGlmaWVySXNOb3RWYWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX21vZGlmaWVySXNOb3RWYWxpZEZvckhvdmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfZHVwbGljYXRlTW9kaWZpZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9uYW1lQ29sdW1uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9tb2RpZmllckNvbHVtblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfZGVsaW1pdGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfaW5zZXJ0RGVsaW1pdGVyQW5kTW9kaWZpZXJBbmREZWxpbWl0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9pbnNlcnRNb2RpZmllckFuZERlbGltaXRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2luc2VydERlbGltaXRlckFuZE1vZGlmaWVyOwotCi0JLy8gdXNlZCBkeW5hbWljYWxseQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbWJpbmF0aW9uSG92ZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tYmluYXRpb25Ib3Zlcl9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2JsZW1Ib3Zlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9ibGVtSG92ZXJfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb2N1bWVudGF0aW9uSG92ZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9jdW1lbnRhdGlvbkhvdmVyX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYW5ub3RhdGlvbkhvdmVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFubm90YXRpb25Ib3Zlcl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZXNBY3Rpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZlcmVuY2VNYW5hZ2VyXzA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNob3dWaWV3X2Vycm9yVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY19kaXJ0eV9yZWdpb25zXzA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXh0SG92ZXJNYWtlU3RpY2t5SGludDsKLQotCS8vIEVuY29kaW5nCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5jb2RpbmdQcmVmZXJlbmNlUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuY29kaW5nUHJlZmVyZW5jZVBhZ2VfMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1c3k7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FyZXRfdXBkYXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVtcHR5RmlsZVByZWZlcmVuY2VQYWdlXzA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8yMDsKLQotCS8qCi0JICogKioqKipCZWxvdyBhcmUgcG9zc2libHkgdW51c2VkIHN0cmluZ3MgdGhhdCBtYXkgYmUgcmVtb3ZlZCAqKioqKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5fZXJyb3JfaGFzX29jY3VycmVkX3doZW5fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2JsZW1zX0R1cmluZ19TYXZlX0FzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlX2NvdWxkX25vdF9iZV9jb21wbGV0ZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VtYW50aWNIaWdobGlnaHRpbmdSZWNvbmNpbGVyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFuYWdlQnJlYWtwb2ludHNfZXJyb3JfcmVtb3ZpbmdfdGl0bGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbmFnZUJyZWFrcG9pbnRzX2Vycm9yX3JlbW92aW5nX21lc3NhZ2UxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbmFnZUJyZWFrcG9pbnRzX2Vycm9yX3JldHJpZXZpbmdfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BTb3VyY2VQcmVmZXJlbmNlUGFnZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9lcnJvcl9zYXZlX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX2Vycm9yX3NhdmVfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX3dhcm5pbmdfc2F2ZV9kZWxldGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmV2aW91c19hbm5vdGF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5leHRfYW5ub3RhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFubm90YXRpb25UeXBlc19FcnJvcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5ub3RhdGlvblR5cGVzX1dhcm5pbmdzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFubm90YXRpb25UeXBlc19UYXNrczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uVHlwZXNfU2VhcmNoUmVzdWx0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uVHlwZXNfQm9va21hcmtzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFubm90YXRpb25UeXBlc19PdGhlcnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29udmVydFRvV2luZG93c19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29udmVydFRvV2luZG93c190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db252ZXJ0VG9XaW5kb3dzX2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db252ZXJ0VG9XaW5kb3dzX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvbnZlcnRUb1VOSVhfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvbnZlcnRUb1VOSVhfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29udmVydFRvVU5JWF9pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29udmVydFRvVU5JWF9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db252ZXJ0VG9NYWNfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvbnZlcnRUb01hY190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db252ZXJ0VG9NYWNfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvbnZlcnRUb01hY19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb252ZXJ0TGluZURlbGltaXRlcnNNZW51X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbmRPY2N1cnJlbmNlc19sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnZlcnRMaW5lRGVsaW1pdGVyc1RvQ1JMRkFjdGlvbkRlbGVnYXRlX2pvYk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udmVydExpbmVEZWxpbWl0ZXJzVG9DUkxGQWN0aW9uRGVsZWdhdGVfZXJyb3JTdGF0dXNNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnZlcnRMaW5lRGVsaW1pdGVyc1RvQ1JMRkFjdGlvbkRlbGVnYXRlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udmVydExpbmVEZWxpbWl0ZXJzVG9DUkxGQWN0aW9uRGVsZWdhdGVfNDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfYW5ub3RhdGlvblJvbGxvdmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfc2hvd0FmZm9yZGFuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9lbmFibGVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNGaW5kT2NjdXJyZW5jZXNBY3Rpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1NlYXJjaExhYmVsUHJvdmlkZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0aW9uUHJlZmVyZW5jZVRhYl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlTW9kZWxQcm92aWRlcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpGYWNlTm9kZUFkYXB0ZXJfMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZVByb2plY3RTZXR0aW5nczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVXb3Jrc3BhY2VTZXR0aW5nczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmFibGVQcm9qZWN0U2V0dGluZ3M7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR290b01hdGNoaW5nQnJhY2tldF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHb3RvTWF0Y2hpbmdCcmFja2V0X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdvdG9NYXRjaGluZ0JyYWNrZXRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHb3RvTWF0Y2hpbmdCcmFja2V0X2Vycm9yX2ludmFsaWRTZWxlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR290b01hdGNoaW5nQnJhY2tldF9lcnJvcl9ub01hdGNoaW5nQnJhY2tldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHb3RvTWF0Y2hpbmdCcmFja2V0X2Vycm9yX2JyYWNrZXRPdXRzaWRlU2VsZWN0ZWRFbGVtZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9hZGluZ1JlZmVyZW5jZWRHcmFtbWFyczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvbGRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3Rpb25fVG9nZ2xlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3Rpb25fVG9nZ2xlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdGlvbl9Ub2dnbGVfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdGlvbl9Ub2dnbGVfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdGlvbl9FeHBhbmRBbGxfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdGlvbl9FeHBhbmRBbGxfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0aW9uX0V4cGFuZEFsbF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0aW9uX0V4cGFuZEFsbF9pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0aW9uX0NvbGxhcHNlQWxsX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3Rpb25fQ29sbGFwc2VBbGxfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0aW9uX0NvbGxhcHNlQWxsX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3Rpb25fQ29sbGFwc2VBbGxfaW1hZ2U7Ci0KLQkvLyBUaGVzZSBzdHJpbmdzIGFyZSBhY2Nlc3NlZCB1c2luZyByZXNvdXJjZSBidW5kbGUgYW5kIGluIHByb3BlcnRpZXMKLQkvLyBmaWxlLCBuZWVkIHRvIHVzZSAnLicgaW5zdGVhZCBvZiAnXycgaW4gc29tZSBrZXlzCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZUJvb2ttYXJrc190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VCb29rbWFya3NfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZUJvb2ttYXJrc19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlQm9va21hcmtzX2FkZF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlQm9va21hcmtzX3JlbW92ZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlQm9va21hcmtzX2FkZF9kaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZUJvb2ttYXJrc19hZGRfZGlhbG9nX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZUJvb2ttYXJrc19lcnJvcl9kaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZUJvb2ttYXJrc19lcnJvcl9kaWFsb2dfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlVGFza3NfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlVGFza3NfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZVRhc2tzX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VUYXNrc19hZGRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZVRhc2tzX3JlbW92ZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlVGFza3NfYWRkX2RpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlVGFza3NfYWRkX2RpYWxvZ19tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VUYXNrc19lcnJvcl9kaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZVRhc2tzX2Vycm9yX2RpYWxvZ19tZXNzYWdlOwotCS8qCi0JICogKioqKipBYm92ZSBhcmUgcG9zc2libHkgdW51c2VkIHN0cmluZ3MgdGhhdCBtYXkgYmUgcmVtb3ZlZCoqKioqCi0JICovCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVua25vd25Db250ZW50VHlwZURpYWxvZ18wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVua25vd25Db250ZW50VHlwZURpYWxvZ18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVua25vd25Db250ZW50VHlwZURpYWxvZ18yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0eWxlZFRleHRDb2xvclBpY2tlcl8wOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRTZWFyY2hMYWJlbFByb3ZpZGVyX21hdGNoQ291bnRGb3JtYXQ7Ci0JCi0JLy9jb250ZW50IGFzc2lzdCBtZXNzYWdlcwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRBc3Npc3RfY29tcHV0aW5nX3Byb3Bvc2FsczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50QXNzaXN0X2NvbGxlY3RpbmdfcHJvcG9zYWxzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRBc3Npc3Rfc29ydGluZ19wcm9wb3NhbHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudEFzc2lzdF9jb2xsZWN0aW5nX2NvbnRleHRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRBc3Npc3RfY29tcHV0aW5nX2NvbnRleHRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRBc3Npc3Rfc29ydGluZ19jb250ZXh0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50QXNzaXN0X25vX2NvbXBsZXRpb25zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRBc3Npc3RfYWxsX2Rpc2FibGVkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRBc3Npc3RfYWxsX2Rpc2FibGVkX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudEFzc2lzdF9hbGxfZGlzYWJsZWRfcHJlZmVyZW5jZV9saW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRBc3Npc3Rfbm9fbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50QXNzaXN0X3RvZ2dsZV9hZmZvcmRhbmNlX3VwZGF0ZV9tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRBc3Npc3RfZGVmYXVsdFByb3Bvc2FsQ2F0ZWdvcnlfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudEFzc2lzdF9wcmVzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50QXNzaXN0X2NsaWNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wdGlvbmFsTWVzc2FnZURpYWxvZ19kb250U2hvd0FnYWluOwotCQotCS8vY29udGVudCBhc3Npc3QgcHJlZmVyZW5jZSBtZXNzYWdlcwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvZGVBc3Npc3RBZHZhbmNlZENvbmZpZ3VyYXRpb25CbG9ja19wYWdlX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvZGVBc3Npc3RBZHZhbmNlZENvbmZpZ3VyYXRpb25CbG9ja19ub19zaG9ydGN1dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2RlQXNzaXN0QWR2YW5jZWRDb25maWd1cmF0aW9uQmxvY2tfVXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29kZUFzc2lzdEFkdmFuY2VkQ29uZmlndXJhdGlvbkJsb2NrX0Rvd247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29kZUFzc2lzdEFkdmFuY2VkQ29uZmlndXJhdGlvbkJsb2NrX3NlcGFyYXRlX3RhYmxlX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvZGVBc3Npc3RBZHZhbmNlZENvbmZpZ3VyYXRpb25CbG9ja19kZWZhdWx0X3RhYmxlX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvZGVBc3Npc3RBZHZhbmNlZENvbmZpZ3VyYXRpb25CbG9ja19kZWZhdWx0X3RhYmxlX2NhdGVnb3J5X2NvbHVtbl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2RlQXNzaXN0QWR2YW5jZWRDb25maWd1cmF0aW9uQmxvY2tfUGFnZXNEb3duOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvZGVBc3Npc3RBZHZhbmNlZENvbmZpZ3VyYXRpb25CbG9ja19QYWdlc1VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvZGVBc3Npc3RBZHZhbmNlZENvbmZpZ3VyYXRpb25CbG9ja19zZXBhcmF0ZV90YWJsZV9jYXRlZ29yeV9jb2x1bW5fdGl0bGU7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU1NFVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TU0VVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDZjZjAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TU0VVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLkZvcm1Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm8uVGV4dEhvdmVyTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgU1NFVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgU1NFVUlQbHVnaW4gaW5zdGFuY2UgPSBudWxsOwotCQotCXByaXZhdGUgRm9ybVRvb2xraXQgZkRpYWxvZ3NGb3JtVG9vbGtpdDsKLQotCXB1YmxpYyBzdGF0aWMgU1NFVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFNTRVVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0SG92ZXJNYW5hZ2VyIGZUZXh0SG92ZXJNYW5hZ2VyOwotCi0JcHVibGljIFNTRVVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgZ2V0QWRhcHRlckZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGV4dCBob3ZlciBtYW5hZ2VyCi0JICogCi0JICogQHJldHVybiBUZXh0SG92ZXJNYW5hZ2VyCi0JICovCi0JcHVibGljIFRleHRIb3Zlck1hbmFnZXIgZ2V0VGV4dEhvdmVyTWFuYWdlcigpIHsKLQkJaWYgKGZUZXh0SG92ZXJNYW5hZ2VyID09IG51bGwpIHsKLQkJCWZUZXh0SG92ZXJNYW5hZ2VyID0gbmV3IFRleHRIb3Zlck1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRleHRIb3Zlck1hbmFnZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCQotCXB1YmxpYyBGb3JtVG9vbGtpdCBnZXREaWFsb2dzRm9ybVRvb2xraXQoKSB7Ci0JCWlmIChmRGlhbG9nc0Zvcm1Ub29sa2l0ID09IG51bGwpIHsKLQkJCUZvcm1Db2xvcnMgY29sb3JzPSBuZXcgRm9ybUNvbG9ycyhEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCQljb2xvcnMuc2V0QmFja2dyb3VuZChudWxsKTsKLQkJCWNvbG9ycy5zZXRGb3JlZ3JvdW5kKG51bGwpOwkKLQkJCWZEaWFsb2dzRm9ybVRvb2xraXQ9IG5ldyBGb3JtVG9vbGtpdChjb2xvcnMpOwotCQl9Ci0JCXJldHVybiBmRGlhbG9nc0Zvcm1Ub29sa2l0OwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8cD5BIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIGFjdGl2ZSB3b3JrYmVuY2ggc2hlbGwuPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFjdGl2ZSB3b3JrYmVuY2gge0BsaW5rIFNoZWxsfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSB7Ci0JCSBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJIGlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkgCXJldHVybiB3aW5kb3cuZ2V0U2hlbGwoKTsKLQkJIH0KLQkJIHJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TU0VVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1NTRVVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZDhmYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1NTRVVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1FcnJvcl9vcGVuaW5nX2ZpbGVfVUlfPUVycm9yIG9wZW5pbmcgZmlsZQotX1VJX0ZpbGVfaXNfcmVhZF9vbmx5PUZpbGUgezB9IGlzIHJlYWQtb25seS4KLV8zMmNvbmNhdF9FWENfPUVkaXRvciBjb3VsZCBub3QgYmUgb3BlbiBvbiB7MH0KLU11bHRpcGxlX2Vycm9ycz1NdWx0aXBsZSBhbm5vdGF0aW9ucyBmb3VuZCBhdCB0aGlzIGxpbmU6Ci1fVW5kb19UZXh0X0NoYW5nZV9fQ3RybF9aX1VJXz0mVW5kbyBUZXh0IENoYW5nZSBAQ3RybCtaCi1VbmRvX1RleHRfQ2hhbmdlX19VSV89VW5kbyBUZXh0IENoYW5nZS4KLV9VbmRvX18wX19fQ3RybF9aX1VJXz0mVW5kbyB7MH0gQEN0cmwrWgotVW5kb19fXzBfX19VSV89VW5kbzogezB9LgotX1JlZG9fVGV4dF9DaGFuZ2VfX0N0cmxfWV9VSV89JlJlZG8gVGV4dCBDaGFuZ2UgQEN0cmwrWQotUmVkb19UZXh0X0NoYW5nZV9fVUlfPVJlZG8gVGV4dCBDaGFuZ2UuCi1fUmVkb19fMF9fX0N0cmxfWV9VSV89JlJlZG8gezB9IEBDdHJsK1kKLVJlZG9fX18wX19fVUlfPVJlZG86IHswfS4KLUZvcm1hdF9Eb2N1bWVudF9VSV89Rm9ybWF0Ci1Gb3JtYXRfQWN0aXZlX0VsZW1lbnRzX1VJXz1Gb3JtYXQgQWN0aXZlIEVsZW1lbnRzCi1UZXh0X0N1dF9VSV89VGV4dCBDdXQKLVRleHRfUGFzdGVfVUlfPVRleHQgUGFzdGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUNsZWFudXBfRG9jdW1lbnRfVUlfPUNsZWFudXAgRG9jdW1lbnQKLQotRWRpdG9yX0N1dF9sYWJlbD1DdSZ0QEN0cmwrWAotRWRpdG9yX0N1dF90b29sdGlwPUN1dAotRWRpdG9yX0N1dF9pbWFnZT0KLUVkaXRvcl9DdXRfZGVzY3JpcHRpb249Q3V0Ci0KLUVkaXRvcl9Db3B5X2xhYmVsPSZDb3B5QEN0cmwrQwotRWRpdG9yX0NvcHlfdG9vbHRpcD1Db3B5Ci1FZGl0b3JfQ29weV9pbWFnZT0KLUVkaXRvcl9Db3B5X2Rlc2NyaXB0aW9uPUNvcHkKLQotRWRpdG9yX1Bhc3RlX2xhYmVsPSZQYXN0ZUBDdHJsK1YKLUVkaXRvcl9QYXN0ZV90b29sdGlwPVBhc3RlCi1FZGl0b3JfUGFzdGVfaW1hZ2U9Ci1FZGl0b3JfUGFzdGVfZGVzY3JpcHRpb249UGFzdGUKLQotRWRpdG9yX0RlbGV0ZV9sYWJlbD0mRGVsZXRlQERlbGV0ZQotRWRpdG9yX0RlbGV0ZV90b29sdGlwPURlbGV0ZQotRWRpdG9yX0RlbGV0ZV9pbWFnZT0KLUVkaXRvcl9EZWxldGVfZGVzY3JpcHRpb249RGVsZXRlCi0KLUNvbnRlbnRBc3Npc3RQcm9wb3NhbHNfbGFiZWw9Q29uJnRlbnQgQXNzaXN0Ci1Db250ZW50QXNzaXN0UHJvcG9zYWxzX3Rvb2x0aXA9Q29udGVudCBBc3Npc3QKLUNvbnRlbnRBc3Npc3RQcm9wb3NhbHNfZGVzY3JpcHRpb249Q29udGVudCBBc3Npc3QKLQotUXVpY2tGaXhfbGFiZWw9JlF1aWNrIEZpeAotUXVpY2tGaXhfdG9vbHRpcD1RdWljayBGaXgKLVF1aWNrRml4X2ltYWdlPQotUXVpY2tGaXhfZGVzY3JpcHRpb249UXVpY2sgRml4Ci0KLVRvZ2dsZUNvbW1lbnRfbGFiZWw9VG9nZyZsZSBDb21tZW50Ci1Ub2dnbGVDb21tZW50X3Rvb2x0aXA9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfaW1hZ2U9Ci1Ub2dnbGVDb21tZW50X2Rlc2NyaXB0aW9uPVRvZ2dsZSBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfbGFiZWw9QWRkICZCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfdG9vbHRpcD1BZGQgQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2ltYWdlPQotQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uPUFkZCBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw9UmVtb3ZlIEJsb2MmayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcD1SZW1vdmUgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X2ltYWdlPQotUmVtb3ZlQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uPVJlbW92ZSBCbG9jayBDb21tZW50Ci1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9QyZsZWFudXAgRG9jdW1lbnQuLi4KLUNsZWFudXBEb2N1bWVudF90b29sdGlwPUNsZWFudXAgRG9jdW1lbnQKLUNsZWFudXBEb2N1bWVudF9pbWFnZT0KLUNsZWFudXBEb2N1bWVudF9kZXNjcmlwdGlvbj1DbGVhbnVwIERvY3VtZW50Ci1Gb3JtYXREb2N1bWVudF9sYWJlbD0mRm9ybWF0Ci1Gb3JtYXREb2N1bWVudF90b29sdGlwPUZvcm1hdAotRm9ybWF0RG9jdW1lbnRfaW1hZ2U9Ci1Gb3JtYXREb2N1bWVudF9kZXNjcmlwdGlvbj1Gb3JtYXQKLUZvcm1hdEFjdGl2ZUVsZW1lbnRzX2xhYmVsPUZvcm1hdCBBY3QmaXZlIEVsZW1lbnRzCi1Gb3JtYXRBY3RpdmVFbGVtZW50c190b29sdGlwPUZvcm1hdCBBY3RpdmUgRWxlbWVudHMKLUZvcm1hdEFjdGl2ZUVsZW1lbnRzX2ltYWdlPQotRm9ybWF0QWN0aXZlRWxlbWVudHNfZGVzY3JpcHRpb249Rm9ybWF0IEFjdGl2ZSBFbGVtZW50cwotT3BlbkZpbGVGcm9tU291cmNlX2xhYmVsPU9wJmVuIFNlbGVjdGlvbgotT3BlbkZpbGVGcm9tU291cmNlX3Rvb2x0aXA9T3BlbiBhbiBlZGl0b3Igb24gdGhlIHNlbGVjdGVkIGxpbmsKLU9wZW5GaWxlRnJvbVNvdXJjZV9pbWFnZT0KLU9wZW5GaWxlRnJvbVNvdXJjZV9kZXNjcmlwdGlvbj1PcGVuIGFuIGVkaXRvciBvbiB0aGUgc2VsZWN0ZWQgbGluawotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsPSZFbmNsb3NpbmcgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfZGVzY3JpcHRpb249RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsPSZOZXh0IEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgbmV4dCBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2Rlc2NyaXB0aW9uPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsPSZQcmV2aW91cyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBwcmV2aW91cyBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgcHJldmlvdXMgc2libGluZwotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbD0mUmVzdG9yZSBMYXN0IFNlbGVjdGlvbgotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwPVJlc3RvcmUgbGFzdCBzZWxlY3Rpb24KLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfZGVzY3JpcHRpb249UmVzdG9yZSBsYXN0IHNlbGVjdGlvbgotVGV4dF9TaGlmdF9SaWdodF9VSV89VGV4dCBTaGlmdCBSaWdodAotVGV4dF9TaGlmdF9MZWZ0X1VJXz1UZXh0IFNoaWZ0IExlZnQKLQotXzRjb25jYXQ9Jyd7MH0nJyBpcyBub3QgYSB2YWxpZCBpbnB1dAotIyMgVGhlIGZvbGxvd2luZyBzdHJpbmdzIGFyZSBmb3IgIlhNTC0+WE1MIFNvdXJjZS0+WE1MIFN0eWxlIiBQcmVmZXJlbmNlcywgIldlYiBUb29scy0+U291cmNlLT5IVE1MIFN0eWxlIiBQcmVmZXJlbmNlcywgYW5kICJXZWIgVG9vbHMtPlNvdXJjZS0+SmF2YVNjcmlwdCBTdHlsZSIgUHJlZmVyZW5jZXMKLUNvbnRlbnRfdHlwZV9fVUlfPUNvJm50ZW50IHR5cGU6Ci1Gb3JlZ3JvdW5kX1VJXz0mRm9yZWdyb3VuZDoKLUJhY2tncm91bmRfVUlfPUJhY2tnciZvdW5kOgotQm9sZF9VSV89QiZvbGQKLUl0YWxpY3NfVUk9SXRhbGljcwotUmVzdG9yZV9EZWZhdWx0X1VJXz0mUmVzdG9yZSBEZWZhdWx0Ci1TYW1wbGVfdGV4dF9fVUlfPSZTYW1wbGUgdGV4dDoKLSMjCi1BZGRCcmVha3BvaW50X2xhYmVsPUFkZCAmQnJlYWtwb2ludAotQWRkQnJlYWtwb2ludF90b29sdGlwPUFkZCBCcmVha3BvaW50Ci1BZGRCcmVha3BvaW50X2Rlc2NyaXB0aW9uPUFkZCBCcmVha3BvaW50Ci1BZGRCcmVha3BvaW50X2Vycm9yX2RpYWxvZ190aXRsZT1BZGQgQnJlYWtwb2ludAotQWRkQnJlYWtwb2ludF9lcnJvcl9kaWFsb2dfbWVzc2FnZT1DYW5ub3QgYWRkIGJyZWFrcG9pbnQKLSMjCi1Ub2dnbGVCcmVha3BvaW50X2xhYmVsPVRvZ2dsZSBCcmVha3BvaW50Ci1Ub2dnbGVCcmVha3BvaW50X3Rvb2x0aXA9VG9nZ2xlIEJyZWFrcG9pbnQKLVRvZ2dsZUJyZWFrcG9pbnRfZGVzY3JpcHRpb249VG9nZ2xlIEJyZWFrcG9pbnQKLSMjCi1FbmFibGVCcmVha3BvaW50X2xhYmVsPUVuYWJsZSBCcmVha3BvaW50Ci1FbmFibGVCcmVha3BvaW50X3Rvb2x0aXA9RW5hYmxlIEJyZWFrcG9pbnQKLUVuYWJsZUJyZWFrcG9pbnRfZGVzY3JpcHRpb249RW5hYmxlIEJyZWFrcG9pbnQKLSMjCi1EaXNhYmxlQnJlYWtwb2ludF9sYWJlbD1EaXNhYmxlIEJyZWFrcG9pbnQKLURpc2FibGVCcmVha3BvaW50X3Rvb2x0aXA9RGlzYWJsZSBCcmVha3BvaW50Ci1EaXNhYmxlQnJlYWtwb2ludF9kZXNjcmlwdGlvbj1EaXNhYmxlIEJyZWFrcG9pbnQKLSMjCi1NYW5hZ2VCcmVha3BvaW50c19hZGRfbGFiZWw9QWRkICZCcmVha3BvaW50Ci1NYW5hZ2VCcmVha3BvaW50c19yZW1vdmVfbGFiZWw9UmVtb3ZlIEJyZWFrcG9pbnQKLU1hbmFnZUJyZWFrcG9pbnRzX3Rvb2x0aXA9QWRkL1JlbW92ZSBCcmVha3BvaW50Ci1NYW5hZ2VCcmVha3BvaW50c19lcnJvcl9hZGRpbmdfdGl0bGUxPUFkZCBCcmVha3BvaW50Ci1NYW5hZ2VCcmVha3BvaW50c19lcnJvcl9hZGRpbmdfbWVzc2FnZTE9Q2Fubm90IGFkZCBicmVha3BvaW50Ci0KLUFic3RyYWN0Q29sb3JQYWdlRGVzY3JpcHRpb249Q3VzdG9taXplIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nIGJ5IHNlbGVjdGluZyB0aGUgdHlwZSBvZiB0ZXh0IHdob3NlIHN0eWxlIHlvdSB3YW50IHRvIGN1c3RvbWl6ZSBmcm9tIGVpdGhlciB0aGUgY29tYm8gYm94IG9yIHRoZSBzYW1wbGUgdGV4dCBhcmVhCi0jIwotRWRpdG9yTW9kZWxVdGlsXzA9bW9kZWwgaW4gaW52YWxpZCBzdGF0ZQotRWRpdG9yTW9kZWxVdGlsXzE9VGhlcmUgd2FzIGEgcHJvYmxlbSBhZGRpbmcgYWRhcHRlciBmYWN0b3JpZXMKLQotIyB3ZWIgY29udGVudCBzZXR0aW5ncwotVUlfRGVmYXVsdF9IVE1MX0RPQ1RZUEVfSURfX18xPSZEb2N1bWVudCB0eXBlOgotVUlfQ1NTX3Byb2ZpbGVfX18yPSZDU1MgcHJvZmlsZToKLVVJX1RhcmdldF9EZXZpY2VfX18zPSZUYXJnZXQgZGV2aWNlOgotCi1FZGl0b3JfVG9nZ2xlSW5zZXJ0TW9kZV9sYWJlbD1TbWEmcnQgSW5zZXJ0IE1vZGUKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVGhlc2Ugc3RyaW5ncyBhcmUgdXNlZCBpbiBXb3JrYmVuY2ggbWVudSBiYXIKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1FeHBhbmRTZWxlY3Rpb25Ub01lbnVfbGFiZWw9RSZ4cGFuZCBTZWxlY3Rpb24gVG8KLVNvdXJjZU1lbnVfbGFiZWw9JlNvdXJjZQotUmVmYWN0b3JNZW51X2xhYmVsPVJlZmFjJnRvcgotIwotRmluZE9jY3VycmVuY2VzQWN0aW9uUHJvdmlkZXJfMD1DdXJyZW50IHNlbGVjdGlvbiBkb2VzIG5vdCByZXNvbHZlIHRvIGEgc2VhcmNoYWJsZSBlbGVtZW50Ci1SZW1vdmVBY3Rpb25fMD1SZW1vdmUgUHJvcGVydHkKLVNob3dQcm9wZXJ0aWVzQWN0aW9uXzA9UCZyb3BlcnRpZXMKLUNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbl8wPUNvbGxhcHNlIEFsbAotQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uXzE9Jkxpbmsgd2l0aCBFZGl0b3IKLUFic3RyYWN0T3Blbk9uXzA9Q3VycmVudCB0ZXh0IHNlbGVjdGlvbiBkb2VzIG5vdCByZXNvbHZlIHRvIGEgZmlsZQotRm9ybWF0QWN0aW9uRGVsZWdhdGVfam9iTmFtZT1Gb3JtYXR0aW5nLi4uCi1Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV9lcnJvclN0YXR1c01lc3NhZ2U9RXhjZXB0aW9ucyBvY2N1cnJlZCB3aGlsZSBmb3JtYXR0aW5nIGRvY3VtZW50cwotRm9ybWF0QWN0aW9uRGVsZWdhdGVfMz1Gb3JtYXR0aW5nIHswfQotRm9ybWF0QWN0aW9uRGVsZWdhdGVfND1FeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgZm9ybWF0dGluZyBkb2N1bWVudCB7MH0KLUZvcm1hdEFjdGlvbkRlbGVnYXRlXzU9TWFsZm9ybWVkSW5wdXRFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgZm9ybWF0dGluZyBkb2N1bWVudCB7MH0KLVRyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWJfMD1SZWFkLU9ubHkgdGV4dCBzdHlsZQotVHJhbnNsdWNlbmN5UHJlZmVyZW5jZVRhYl8xPVJlYWQtT25seSBjb250cmFzdCBwZXJjZW50YWdlOgotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8yPU1hdGNoaW5nIGJyYWNrZXRzIGhpZ2hsaWdodAotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV82PVRoZSBmb2xsb3dpbmcgcHJlZmVyZW5jZXMgYXBwbHkgdG8gdGhlIEhUTUwsIEpTUCwgWE1MLCBhbmQgb3RoZXIgc291cmNlIGVkaXRvcnMuCi1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzIwPUhpZ2hsaWdodCAmbWF0Y2hpbmcgYnJhY2tldHMKLVN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMjM9QXBwZWFyYW5jZSBjbyZsb3Igb3B0aW9uczoKLVN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMjQ9QyZvbG9yOgotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zMD0mUmVwb3J0IHByb2JsZW1zIGFzIHlvdSB0eXBlCi1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM3PUVtcHR5IGlucHV0Ci1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM4PWlzIG5vdCBhIHZhbGlkIGlucHV0LgotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zOT1JbmZvcm0gd2hlbiAmdW5zdXBwb3J0ZWQgY29udGVudCB0eXBlIGlzIGluIGVkaXRvcgotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV80MD1BbHNvIHNlZSB0aGUgPGE+Jyd7MH0nJzwvYT4gcHJlZmVyZW5jZXMuCi1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzQxPUNvbXBsZXRpb24gcHJvcG9zYWwgYmFja2dyb3VuZAotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV80Mj1Db21wbGV0aW9uIHByb3Bvc2FsIGZvcmVncm91bmQKLVN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfNDM9UGFyYW1ldGVyIGhpbnRzIGJhY2tncm91bmQKLVN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfNDQ9UGFyYW1ldGVyIGhpbnRzIGZvcmVncm91bmQKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzA9TG93Ci1UYXNrVGFnUHJlZmVyZW5jZVRhYl8xPU5vcm1hbAotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMj1IaWdoCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8zPU4vQQotVGFza1RhZ1ByZWZlcmVuY2VUYWJfNT1UYXNrIFRhZwotVGFza1RhZ1ByZWZlcmVuY2VUYWJfNj1UYWc6Ci1UYXNrVGFnUHJlZmVyZW5jZVRhYl83PVByaW9yaXR5OgotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTI9VGFnCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8xMz1Qcmlvcml0eQotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTQ9Jk5ldy4uLgotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTU9RWQmaXQuLi4KLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzE2PSZSZW1vdmUKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzE3PSZTZWxlY3QgQWxsCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8xOD1EZXNlbGVjdCBBJmxsCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8xOT1Ob3RlOiB0YWdzIGFyZSBjYXNlIGluc2Vuc2l0aXZlCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8yMD0mVGFzayBUYWdzCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8yMj1UYXNrIFRhZ3MgU2V0dGluZ3MgQ2hhbmdlZAotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjM9VGhlIHRhc2sgdGFncyBzZXR0aW5ncyBoYXZlIGNoYW5nZWQuICBNYWtlIHRoZXNlIGNoYW5nZXMgZWZmZWN0aXZlIG5vdz8KLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzI0PVllcwotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjU9Tm8KLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzI2PUNhbmNlbAotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjc9U2Nhbm5pbmcgZmlsZXMgZm9yIHRhc2tzCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8yOD1kZXRlY3Rpb24gYWJvcnRlZAotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjk9ZGV0ZWN0aW9uIGNvbXBsZXRlZAotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMzA9ZGV0ZWN0aW9uIGVuY291bnRlcmVkIGVycm9ycwotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMzE9JkVuYWJsZSBzZWFyY2hpbmcgZm9yIFRhc2sgVGFncwotVGFza1RhZ1ByZWZlcmVuY2VQYWdlXzMyPSZDbGVhbiBhbmQgcmVkZXRlY3QgVGFza3MKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzMzPVRhJmdzIGluIGNvbW1lbnRzIGluZGljYXRpbmcgVGFza3M6Ci1UYXNrVGFnRXhjbHVzaW9uVGFiXzAxPSZGaWx0ZXJzCi1UYXNrVGFnRXhjbHVzaW9uVGFiXzAyPVNjYSZuIHRoZSBzZWxlY3RlZCBDb250ZW50IFR5cGVzOgotVGFza1RhZ0V4Y2x1c2lvblRhYl8wMz1BZmZlY3RlZCBDb250ZW50IFQmeXBlczoKLQotUHJvcGVydHlQcmVmZXJlbmNlUGFnZV8wMT1Qcm9qZWN0IFNwZWNpZmljIENvbmZpZ3VyYXRpb24KLVByb3BlcnR5UHJlZmVyZW5jZVBhZ2VfMDI9U2VsZWN0IHRoZSBwcm9qZWN0IHRvIGNvbmZpZ3VyZToKLQotRmlsZVByZWZlcmVuY2VQYWdlXzA9RXhwYW5kIHRoZSB0cmVlIHRvIGVkaXQgcHJlZmVyZW5jZXMgZm9yIGEgc3BlY2lmaWMgY29udGVudCB0eXBlLgotTm9Nb2RpZmljYXRpb25Db21wbGV0aW9uUHJvcG9zYWxfMD1ObyBjb3JyZWN0aW9ucyBhdmFpbGFibGUKLVRvZ2dsZUJyZWFrcG9pbnRBY3Rpb25fMD1Ub2dnbGUgJkJyZWFrcG9pbnRzCi1NYW5hZ2VCcmVha3BvaW50QWN0aW9uXzA9JkVuYWJsZSBCcmVha3BvaW50cwotTWFuYWdlQnJlYWtwb2ludEFjdGlvbl8xPSZEaXNhYmxlIEJyZWFrcG9pbnRzCi1FZGl0QnJlYWtwb2ludEFjdGlvbl8wPUJyZWFrcG9pbnQgJlByb3BlcnRpZXMuLi4KLSMjIFVzZWQgaW4gU3RydWN0dXJlZCBUZXh0IEVkaXRvciBQcmVmZXJlbmNlIFBhZ2UgLyBIb3ZlcnMgVGFiCi1UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX3RpdGxlPUhvdmVycwotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9ob3ZlclByZWZlcmVuY2VzPVRleHQgJkhvdmVyIGtleSBtb2RpZmllciBwcmVmZXJlbmNlczoKLVRleHRIb3ZlclByZWZlcmVuY2VUYWJfa2V5TW9kaWZpZXI9UHJlc3NlZCBrZXkgJm1vZGlmaWVyIHdoaWxlIGhvdmVyaW5nOgotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9kZXNjcmlwdGlvbj1EZXNjcmlwdGlvbjoKLVRleHRIb3ZlclByZWZlcmVuY2VUYWJfbW9kaWZpZXJJc05vdFZhbGlkPU1vZGlmaWVyICcnezB9JycgaXMgbm90IHZhbGlkLgotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9tb2RpZmllcklzTm90VmFsaWRGb3JIb3Zlcj1Nb2RpZmllciAnJ3swfScnIGZvciAnJ3sxfScnIGhvdmVyIGlzIG5vdCB2YWxpZC4KLVRleHRIb3ZlclByZWZlcmVuY2VUYWJfZHVwbGljYXRlTW9kaWZpZXI9Jyd7MH0nJyBob3ZlciB1c2VzIHRoZSBzYW1lIG1vZGlmaWVyIGFzICcnezF9JycgaG92ZXIuCi1UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX25hbWVDb2x1bW5UaXRsZT1UZXh0IEhvdmVyIE5hbWUKLVRleHRIb3ZlclByZWZlcmVuY2VUYWJfbW9kaWZpZXJDb2x1bW5UaXRsZT1QcmVzc2VkIEtleSBNb2RpZmllciBXaGlsZSBIb3ZlcmluZwotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9kZWxpbWl0ZXI9KwotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9pbnNlcnREZWxpbWl0ZXJBbmRNb2RpZmllckFuZERlbGltaXRlcj1cICsgezB9ICsKLVRleHRIb3ZlclByZWZlcmVuY2VUYWJfaW5zZXJ0TW9kaWZpZXJBbmREZWxpbWl0ZXI9XCB7MH0gKwotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9pbnNlcnREZWxpbWl0ZXJBbmRNb2RpZmllcj1cICsgezB9Ci1jb21iaW5hdGlvbkhvdmVyX2xhYmVsPUNvbWJpbmVkIEhvdmVyCi1jb21iaW5hdGlvbkhvdmVyX2Rlc2M9VHJpZXMgdGhlIGhvdmVycyBpbiB0aGUgc2VxdWVuY2UgbGlzdGVkIGluIHRoZSB0YWJsZSBiZWxvdyB0aGlzIG9uZSBhbmQgdXNlcyB0aGUgb25lIHdoaWNoIGZpdHMgYmVzdCBmb3IgdGhlIHNlbGVjdGVkIGVsZW1lbnQgYW5kIHRoZSBjdXJyZW50IGNvbnRleHQuCi1wcm9ibGVtSG92ZXJfbGFiZWw9UHJvYmxlbSBEZXNjcmlwdGlvbgotcHJvYmxlbUhvdmVyX2Rlc2M9U2hvd3MgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWxlY3RlZCBwcm9ibGVtLgotZG9jdW1lbnRhdGlvbkhvdmVyX2xhYmVsPURvY3VtZW50YXRpb24gRGVzY3JpcHRpb24KLWRvY3VtZW50YXRpb25Ib3Zlcl9kZXNjPVNob3dzIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50LgotYW5ub3RhdGlvbkhvdmVyX2xhYmVsPUFubm90YXRpb24gRGVzY3JpcHRpb24KLWFubm90YXRpb25Ib3Zlcl9kZXNjPVNob3dzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2VsZWN0ZWQgYW5ub3RhdGlvbi4KLUVkaXRTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VzQWN0aW9uXzA9RWRpdG9yIFByZWZlcmVuY2VzCi1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzA9QXBwZWFyYW5jZQotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8xPUVuYWJsZSAmc2VtYW50aWMgaGlnaGxpZ2h0aW5nCi1QcmVmZXJlbmNlTWFuYWdlcl8wPU9yaWdpbmFsIEVycm9yOgotCi1PY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzA9ezB9IC0gezF9IG9jY3VycmVuY2VzIGluIHsyfQotT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8yPWZpbGUKLVNob3dWaWV3X2Vycm9yVGl0bGU9UHJvYmxlbXMgU2hvd2luZyBWaWV3Ci1wcm9jX2RpcnR5X3JlZ2lvbnNfMCA9IFByb2Nlc3NpbmcgRGlydHkgUmVnaW9ucwotCi10ZXh0SG92ZXJNYWtlU3RpY2t5SGludD1QcmVzcyAnJ3swfScnIGZvciBmb2N1cy4KLQotIyMgRW5jb2RpbmcKLUVuY29kaW5nUHJlZmVyZW5jZVBhZ2VfMD1FbmNvZGluZyBzZXR0aW5ncyBmb3IgV2ViIGFuZCBYTUwgZmlsZXM6Ci1FbmNvZGluZ1ByZWZlcmVuY2VQYWdlXzE9VXNlIDMgYnl0ZSBCT00gKEJ5dGUgT3JkZXIgTWFyaykgd2hlbiBzYXZpbmcgVVRGLTggZW5jb2RlZCBmaWxlcwotYnVzeT1idXN5Ci1jYXJldF91cGRhdGU9Y2FyZXQgdXBkYXRlCi1FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZV8wPVRoaXMgY2F0ZWdvcnkgSUQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgJ29yZy5lY2xpcHNlLndzdC54bWwudWkucHJlZmVyZW5jZXMueG1sJyBhbmQgJ29yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLndlYicKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzA9U2VsZWN0aW9uIEluZm9ybWF0aW9uOgotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMj1QYXJ0aXRpb25zCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8zPUlUZXh0UmVnaW9ucwotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fND1TdHJ1Y3R1cmVkIE1vZGVsIENvbnRlbnQtVHlwZTogCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV81PU1vZGVsIEhhbmRsZXI6IAotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fNj1Eb2N1bWVudCBDbGFzczogCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV83PURvY3VtZW50IFByb3ZpZGVyIENsYXNzOiAKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzg9UGFydGl0aW9uaW5nczoKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzk9U3RhcnQKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzEwPUxlbmd0aAotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTE9VHlwZQotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTI9SW5wdXQgVHlwZTogCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xMz1QYXJ0aXRpb25lcjogCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xND1TdHJ1Y3R1cmVkIFNlbGVjdGlvbgotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTU9U3RhcnQKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE2PUxlbmd0aAotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTc9VGV4dCBMZW5ndGgKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE4PUNvbnRleHQKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE5PVdvcmtiZW5jaCBTZWxlY3Rpb24KLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzIwPUluZGV4ZWQgUmVnaW9ucwotCi1TdHJ1Y3R1cmVkVGV4dEVkaXRvcl8wPVVuc3VwcG9ydGVkIGNvbnRlbnQgdHlwZSB3YXJuaW5nCi1Vbmtub3duQ29udGVudFR5cGVEaWFsb2dfMD1VbnN1cHBvcnRlZCBDb250ZW50IFR5cGUKLVVua25vd25Db250ZW50VHlwZURpYWxvZ18xPURvIG5vdCBzaG93IHRoaXMgbWVzc2FnZSBhZ2FpbgotVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nXzI9VW5zdXBwb3J0ZWQgY29udGVudCB0eXBlIGluIGVkaXRvci5cblRvIGFzc29jaWF0ZSBmaWxlIGV4dGVuc2lvbiB3aXRoIGEgc3VwcG9ydGVkIGNvbnRlbnQgdHlwZSxcbnBsZWFzZSBzZWUgPGE+Q29udGVudCBUeXBlcyBQcmVmZXJlbmNlIFBhZ2U8L2E+Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBCZWxvdyBhcmUgcG9zc2libHkgdW51c2VkIHN0cmluZ3MgdGhhdCBtYXkgYmUgcmVtb3ZlZAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVNhdmVfbGFiZWw9JlNhdmUKLUFuX2Vycm9yX2hhc19vY2N1cnJlZF93aGVuX0VSUk9SXz1BbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hlbiByZXRyaWV2aW5nIHJlc291cmNlcyBmb3IgdGhlIHNvdXJjZSBlZGl0b3IuIFRoZSBFY2xpcHNlIFdvcmtiZW5jaCBpbnN0YWxsYXRpb24gbWF5IGhhdmUgYmVlbiBjb3JydXB0ZWQuCi0jIyBzYXZlIGFzIHByb2JsZW1zIChuZXh0IHR3bykgc2hvdWxkIG1hdGNoIHdoYXQgaXMgaW4gd29ya2JlbmNoCi1Qcm9ibGVtc19EdXJpbmdfU2F2ZV9Bc19VSV89UHJvYmxlbXMgRHVyaW5nIFNhdmUgQXMuLi4KLVNhdmVfY291bGRfbm90X2JlX2NvbXBsZXRlX1VJXz1TYXZlIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQuCi1TZW1hbnRpY0hpZ2hsaWdodGluZ1JlY29uY2lsZXJfMD1TZW1hbnRpYyBIaWdobGlnaHRpbmcgSm9iCi1NYW5hZ2VCcmVha3BvaW50c19lcnJvcl9yZW1vdmluZ190aXRsZTE9UmVtb3ZlIEJyZWFrcG9pbnQKLU1hbmFnZUJyZWFrcG9pbnRzX2Vycm9yX3JlbW92aW5nX21lc3NhZ2UxPUNhbm5vdCByZW1vdmUgYnJlYWtwb2ludAotTWFuYWdlQnJlYWtwb2ludHNfZXJyb3JfcmV0cmlldmluZ19tZXNzYWdlPVJldHJpZXZpbmcgbWFya2VycyBmYWlsZWQ6Ci1KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZURlc2NyaXB0aW9uPUVtYmVkZGVkIGNvbnRlbnQgdHlwZVwncyBzb3VyY2UgcHJlZmVyZW5jZXMgd2lsbCBiZSB1c2VkLiBTZWxlY3QgdGhlIGZpbGUgdHlwZSBmb3IgY3VzdG9taXphdGlvbgotIyBUaGUgZm9sbG93aW5nIGxpbmVzIGNvcGllZCBmcm9tIG9yZ1xlY2xpcHNlXHVpXGVkaXRvcnNcdGV4dFxUZXh0RWRpdG9yTWVzc2FnZXMucHJvcGVydGllcyBpbiBvcmcuZWNsaXBzZS51aSBwbHVnaW4KLUVkaXRvcl9lcnJvcl9zYXZlX21lc3NhZ2U9U2F2ZSBjb3VsZCBub3QgYmUgY29tcGxldGVkLiB7MH0KLUVkaXRvcl9lcnJvcl9zYXZlX3RpdGxlPVByb2JsZW1zIER1cmluZyBTYXZlIEFzLi4uCi1FZGl0b3Jfd2FybmluZ19zYXZlX2RlbGV0ZT1UaGUgb3JpZ2luYWwgZmlsZSAnJ3swfScnIGhhcyBiZWVuIGRlbGV0ZWQuCi0KLSMgYWN0aW9ucwotUHJldmlvdXNfYW5ub3RhdGlvbj1QcmV2aW91cyBBbm5vdGF0aW9uCi1OZXh0X2Fubm90YXRpb249TmV4dCBBbm5vdGF0aW9uCi0jIEFubm90YXRpb24gVHlwZXMKLUFubm90YXRpb25UeXBlc19FcnJvcnM9RXJyb3JzCi1Bbm5vdGF0aW9uVHlwZXNfV2FybmluZ3M9V2FybmluZ3MKLUFubm90YXRpb25UeXBlc19UYXNrcz1UYXNrcwotQW5ub3RhdGlvblR5cGVzX1NlYXJjaFJlc3VsdHM9U2VhcmNoIFJlc3VsdHMKLUFubm90YXRpb25UeXBlc19Cb29rbWFya3M9Qm9va21hcmtzCi1Bbm5vdGF0aW9uVHlwZXNfT3RoZXJzPU90aGVycwotCi1FZGl0b3JfQ29udmVydFRvV2luZG93c19sYWJlbD0mV2luZG93cwotRWRpdG9yX0NvbnZlcnRUb1dpbmRvd3NfdG9vbHRpcD1Db252ZXJ0cyBsaW5lIGRlbGltaXRlcnMgdG8gV2luZG93cwotRWRpdG9yX0NvbnZlcnRUb1dpbmRvd3NfaW1hZ2U9Ci1FZGl0b3JfQ29udmVydFRvV2luZG93c19kZXNjcmlwdGlvbj1Db252ZXJ0cyBsaW5lIGRlbGltaXRlcnMgdG8gV2luZG93cwotCi1FZGl0b3JfQ29udmVydFRvVU5JWF9sYWJlbD0mVU5JWAotRWRpdG9yX0NvbnZlcnRUb1VOSVhfdG9vbHRpcD1Db252ZXJ0cyBsaW5lIGRlbGltaXRlcnMgdG8gVU5JWAotRWRpdG9yX0NvbnZlcnRUb1VOSVhfaW1hZ2U9Ci1FZGl0b3JfQ29udmVydFRvVU5JWF9kZXNjcmlwdGlvbj1Db252ZXJ0cyBsaW5lIGRlbGltaXRlcnMgdG8gVU5JWAotCi1FZGl0b3JfQ29udmVydFRvTWFjX2xhYmVsPSZNYWMKLUVkaXRvcl9Db252ZXJ0VG9NYWNfdG9vbHRpcD1Db252ZXJ0cyBsaW5lIGRlbGltaXRlcnMgdG8gTWFjCi1FZGl0b3JfQ29udmVydFRvTWFjX2ltYWdlPQotRWRpdG9yX0NvbnZlcnRUb01hY19kZXNjcmlwdGlvbj1Db252ZXJ0cyBsaW5lIGRlbGltaXRlcnMgdG8gTWFjCi1Db252ZXJ0TGluZURlbGltaXRlcnNNZW51X2xhYmVsPUNvJm52ZXJ0IExpbmUgRGVsaW1pdGVycyB0bwotRmluZE9jY3VycmVuY2VzX2xhYmVsPU8mY2N1cnJlbmNlcyBpbiBGaWxlCi0KLUNvbnZlcnRMaW5lRGVsaW1pdGVyc1RvQ1JMRkFjdGlvbkRlbGVnYXRlX2pvYk5hbWU9Q29udmVydGluZyBsaW5lIGRlbGltaXRlcnMKLUNvbnZlcnRMaW5lRGVsaW1pdGVyc1RvQ1JMRkFjdGlvbkRlbGVnYXRlX2Vycm9yU3RhdHVzTWVzc2FnZT1FeGNlcHRpb25zIG9jY3VycmVkIHdoaWxlIGNvbnZlcnRpbmcgbGluZSBkZWxpbWl0ZXJzCi1Db252ZXJ0TGluZURlbGltaXRlcnNUb0NSTEZBY3Rpb25EZWxlZ2F0ZV8zPUNvbnZlcnRpbmcgbGluZSBkZWxpbWl0ZXJzIGZvciB7MH0KLUNvbnZlcnRMaW5lRGVsaW1pdGVyc1RvQ1JMRkFjdGlvbkRlbGVnYXRlXzQ9RXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGNvbnZlcnRpbmcgbGluZSBkZWxpbWl0ZXJzIGZvciBkb2N1bWVudCB7MH0KLVRleHRIb3ZlclByZWZlcmVuY2VUYWJfYW5ub3RhdGlvblJvbGxvdmVyPSZFbmFibGUgYW5ub3RhdGlvbiByb2xsLW92ZXIgKG9uIG5ldyBlZGl0b3JzKQotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9zaG93QWZmb3JkYW5jZT0mU2hvdyBhZmZvcmRhbmNlIGluIGhvdmVyIG9uIGhvdyB0byBtYWtlIGl0IHN0aWNreQotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9lbmFibGVkPSZFbmFibGVkCi0KLUJhc2ljRmluZE9jY3VycmVuY2VzQWN0aW9uXzA9cmVnaW9uIG1hdGNoOgotQmFzaWNTZWFyY2hMYWJlbFByb3ZpZGVyXzA9bGluZQotTmF2aWdhdGlvblByZWZlcmVuY2VUYWJfMD1Nb2RpZmllciAnJ3swfScnIGlzIG5vdCB2YWxpZC4KLU9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMT17MH0gLSAxIE9jY3VycmVuY2UgaW4gezF9Ci1GaWxlTW9kZWxQcm92aWRlcl8wPUVycm9yIHJlbG9hZGluZyB7MH0KLUpGYWNlTm9kZUFkYXB0ZXJfMD1VcGRhdGUgT3V0bGluZQotCi1Db25maWd1cmVQcm9qZWN0U2V0dGluZ3M9Q29uZmlndXJlIFByb2plY3QgU3BlY2lmaWMgU2V0dGluZ3MuLi4KLUNvbmZpZ3VyZVdvcmtzcGFjZVNldHRpbmdzPUNvbmZpZ3VyZSBXb3Jrc3BhY2UgU2V0dGluZ3MuLi4KLUVuYWJsZVByb2plY3RTZXR0aW5ncz1FbmFibGUgcHJvamVjdCBzcGVjaWZpYyBzZXR0aW5ncwotCi1Mb2FkaW5nUmVmZXJlbmNlZEdyYW1tYXJzPUxvYWRpbmcgcmVmZXJlbmNlZCBncmFtbWFycwotCi0jIyBGb2xkaW5nCi1Gb2xkaW5nPUZvbGRpbmcKLVN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMz1FbmFibGUgJmZvbGRpbmcKLVByb2plY3Rpb25fVG9nZ2xlX2xhYmVsPSAmRW5hYmxlIEZvbGRpbmcKLVByb2plY3Rpb25fVG9nZ2xlX3Rvb2x0aXA9IFRvZ2dsZXMgRm9sZGluZwotUHJvamVjdGlvbl9Ub2dnbGVfZGVzY3JpcHRpb249IFRvZ2dsZXMgZm9sZGluZyBmb3IgdGhlIGN1cnJlbnQgZWRpdG9yCi1Qcm9qZWN0aW9uX1RvZ2dsZV9pbWFnZT0KLVByb2plY3Rpb25fRXhwYW5kQWxsX2xhYmVsPSBFeHBhbmQgJkFsbAotUHJvamVjdGlvbl9FeHBhbmRBbGxfdG9vbHRpcD0gRXhwYW5kcyBBbGwgQ29sbGFwc2VkIFJlZ2lvbnMKLVByb2plY3Rpb25fRXhwYW5kQWxsX2Rlc2NyaXB0aW9uPSBFeHBhbmRzIGFueSBjb2xsYXBzZWQgcmVnaW9ucyBpbiB0aGUgY3VycmVudCBlZGl0b3IKLVByb2plY3Rpb25fRXhwYW5kQWxsX2ltYWdlPQotUHJvamVjdGlvbl9Db2xsYXBzZUFsbF9sYWJlbD0gQ29sbGFwc2UgQSZsbAotUHJvamVjdGlvbl9Db2xsYXBzZUFsbF90b29sdGlwPSBDb2xsYXBzZXMgQWxsIEV4cGFuZGVkIFJlZ2lvbnMKLVByb2plY3Rpb25fQ29sbGFwc2VBbGxfZGVzY3JpcHRpb249IENvbGxhcHNlIGFueSBleHBhbmRlZCByZWdpb25zIGluIHRoZSBjdXJyZW50IGVkaXRvcgotUHJvamVjdGlvbl9Db2xsYXBzZUFsbF9pbWFnZT0KLQotIyMgVGhlc2UgYXJlIGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuRWRpdG9yTWVzc2FnZXMucHJvcGVydGllcwotIyMgVGhleSBhcmUgbmVlZGVkIHRlbXBvcmFyaWx5IHVudGlsIENNVkMgZGVmZWN0IDIwMzE1OCAvIEJ1Z3ppbGxhIGRlZmVjdCAyMDA1NCBpcyBmaXhlZAotRWRpdG9yX01hbmFnZUJvb2ttYXJrc190b29sdGlwPUFkZHMgYW5kIFJlbW92ZXMgQm9va21hcmtzCi1FZGl0b3JfTWFuYWdlQm9va21hcmtzX2ltYWdlPQotRWRpdG9yX01hbmFnZUJvb2ttYXJrc19kZXNjcmlwdGlvbj1BZGRzIGFuZCByZW1vdmVzIEJvb2ttYXJrcwotRWRpdG9yX01hbmFnZUJvb2ttYXJrc19hZGRfbGFiZWw9QWRkIEJvbyZrbWFyay4uLgotRWRpdG9yX01hbmFnZUJvb2ttYXJrc19yZW1vdmVfbGFiZWw9UmVtb3ZlIEJvbyZrbWFyawotRWRpdG9yX01hbmFnZUJvb2ttYXJrc19hZGRfZGlhbG9nX3RpdGxlPUFkZCBCb29rbWFyawotRWRpdG9yX01hbmFnZUJvb2ttYXJrc19hZGRfZGlhbG9nX21lc3NhZ2U9RW50ZXIgQm9va21hcmsgbmFtZQotRWRpdG9yX01hbmFnZUJvb2ttYXJrc19lcnJvcl9kaWFsb2dfdGl0bGU9TWFuYWdpbmcgQm9va21hcmtzCi1FZGl0b3JfTWFuYWdlQm9va21hcmtzX2Vycm9yX2RpYWxvZ19tZXNzYWdlPVByb2JsZW1zIG1hbmFnaW5nIGJvb2ttYXJrcwotCi1FZGl0b3JfTWFuYWdlVGFza3NfdG9vbHRpcD1BZGRzIGFuZCBSZW1vdmVzIFRhc2tzCi1FZGl0b3JfTWFuYWdlVGFza3NfaW1hZ2U9Ci1FZGl0b3JfTWFuYWdlVGFza3NfZGVzY3JpcHRpb249QWRkcyBhbmQgcmVtb3ZlcyBUYXNrcwotRWRpdG9yX01hbmFnZVRhc2tzX2FkZF9sYWJlbD1BZGQgJlRhc2suLi4KLUVkaXRvcl9NYW5hZ2VUYXNrc19yZW1vdmVfbGFiZWw9UmVtb3ZlICZUYXNrCi1FZGl0b3JfTWFuYWdlVGFza3NfYWRkX2RpYWxvZ190aXRsZT1BZGQgVGFzawotRWRpdG9yX01hbmFnZVRhc2tzX2FkZF9kaWFsb2dfbWVzc2FnZT1FbnRlciBUYXNrIGRlc2NyaXB0aW9uCi1FZGl0b3JfTWFuYWdlVGFza3NfZXJyb3JfZGlhbG9nX3RpdGxlPU1hbmFnaW5nIFRhc2tzCi1FZGl0b3JfTWFuYWdlVGFza3NfZXJyb3JfZGlhbG9nX21lc3NhZ2U9UHJvYmxlbXMgbWFuYWdpbmcgdGFza3MKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBBYm92ZSBhcmUgcG9zc2libHkgdW51c2VkIHN0cmluZ3MgdGhhdCBtYXkgYmUgcmVtb3ZlZAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotU3R5bGVkVGV4dENvbG9yUGlja2VyXzA9UGljayBhIGNvbG9yCi1TeW50YXhDb2xvcmluZ19MaW5rPURlZmF1bHQgY29sb3JzIGFuZCBmb250IGNhbiBiZSBjb25maWd1cmVkIG9uIHRoZSA8YSBocmVmPVwib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLkdlbmVyYWxUZXh0RWRpdG9yXCI+VGV4dCBFZGl0b3JzPC9hPiBhbmQgb24gdGhlIDxhIGhyZWY9XCJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuQ29sb3JzQW5kRm9udHNcIj5Db2xvcnMgYW5kIEZvbnRzPC9hPiBwcmVmZXJlbmNlIHBhZ2VzLiAgRGVjb3JhdGlvbnMgZm9yIGFubm90YXRpb25zIGNhbiBiZSBjb25maWd1cmVkIG9uIHRoZSA8YSBocmVmPVwib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5wcmVmZXJlbmNlUGFnZXMuQW5ub3RhdGlvbnNcIj5Bbm5vdGF0aW9uczwvYT4gcHJlZmVyZW5jZSBwYWdlLgotU3ludGF4Q29sb3JpbmdfRGVzY3JpcHRpb249Q3VzdG9taXplIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nIGJ5IHNlbGVjdGluZyB0aGUgdHlwZSBvZiB0ZXh0IHdob3NlIHN0eWxlIHlvdSB3YW50IHRvIGN1c3RvbWl6ZSBmcm9tIGVpdGhlciB0aGUgbGlzdCBvciB0aGUgZXhhbXBsZSB0ZXh0IGFyZWEuCi0KLUdvdG9NYXRjaGluZ0JyYWNrZXRfbGFiZWw9IE1hdGNoaW5nICZCcmFja2V0Ci1Hb3RvTWF0Y2hpbmdCcmFja2V0X3Rvb2x0aXA9R28gdG8gTWF0Y2hpbmcgQnJhY2tldAotR290b01hdGNoaW5nQnJhY2tldF9kZXNjcmlwdGlvbj1HbyB0byBNYXRjaGluZyBCcmFja2V0Ci1Hb3RvTWF0Y2hpbmdCcmFja2V0X2Vycm9yX2ludmFsaWRTZWxlY3Rpb249Tm8gYnJhY2tldCBzZWxlY3RlZAotR290b01hdGNoaW5nQnJhY2tldF9lcnJvcl9ub01hdGNoaW5nQnJhY2tldD1ObyBtYXRjaGluZyBicmFja2V0IGZvdW5kCi1Hb3RvTWF0Y2hpbmdCcmFja2V0X2Vycm9yX2JyYWNrZXRPdXRzaWRlU2VsZWN0ZWRFbGVtZW50PU1hdGNoaW5nIGJyYWNrZXQgaXMgb3V0c2lkZSB0aGUgc2VsZWN0ZWQgZWxlbWVudAotCi1UZXh0U2VhcmNoTGFiZWxQcm92aWRlcl9tYXRjaENvdW50Rm9ybWF0PSh7MH0gbWF0Y2hlcykKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMgQ29udGVudCBBc3Npc3QgU3RyaW5ncwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUNvbnRlbnRBc3Npc3RfY29tcHV0aW5nX3Byb3Bvc2Fscz1Db21wdXRpbmcgY29tcGxldGlvbiBwcm9wb3NhbHMKLUNvbnRlbnRBc3Npc3RfY29sbGVjdGluZ19wcm9wb3NhbHM9Q29sbGVjdGluZyBjb21wbGV0aW9uIHByb3Bvc2FscwotQ29udGVudEFzc2lzdF9zb3J0aW5nX3Byb3Bvc2Fscz1Tb3J0aW5nIGNvbXBsZXRpb24gcHJvcG9zYWxzCi1Db250ZW50QXNzaXN0X2NvbGxlY3RpbmdfY29udGV4dHM9Q29sbGVjdGluZyBjb250ZXh0IGluZm9ybWF0aW9uCi1Db250ZW50QXNzaXN0X2NvbXB1dGluZ19jb250ZXh0cz1Db21wdXRpbmcgY29udGV4dCBpbmZvcm1hdGlvbgotQ29udGVudEFzc2lzdF9zb3J0aW5nX2NvbnRleHRzPVNvcnRpbmcgY29udGV4dCBpbmZvcm1hdGlvbgotQ29udGVudEFzc2lzdF9ub19jb21wbGV0aW9ucz1ObyBjb21wbGV0aW9ucyBhdmFpbGFibGUuCi1Db250ZW50QXNzaXN0X2FsbF9kaXNhYmxlZF90aXRsZT1Db250ZW50IEFzc2lzdCBQcm9ibGVtCi1Db250ZW50QXNzaXN0X2FsbF9kaXNhYmxlZF9tZXNzYWdlPVNvbWUgY29udGVudCBwcm9wb3NhbCBraW5kcyBoYXZlIGJlZW4gdW5pbnN0YWxsZWQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHJldmlldyB0aGUgY29udGVudCBhc3Npc3Qgc2V0dGluZ3MuCi1Db250ZW50QXNzaXN0X2FsbF9kaXNhYmxlZF9wcmVmZXJlbmNlX2xpbms9Q2hhbmdlIHRoZSBzZXR0aW5ncyBvbiB0aGUgPGE+Q29udGVudCBBc3Npc3QgcHJlZmVyZW5jZSBwYWdlPC9hPiBvciBjbGljayAnJ3swfScnIHRvIHJlc3RvcmUgdGhlIGRlZmF1bHQgYmVoYXZpb3IuCi1Db250ZW50QXNzaXN0X25vX21lc3NhZ2U9IE5vIHswfQotQ29udGVudEFzc2lzdF90b2dnbGVfYWZmb3JkYW5jZV91cGRhdGVfbWVzc2FnZT17MX0gdG8gc2hvdyB7Mn0KLUNvbnRlbnRBc3Npc3RfZGVmYXVsdFByb3Bvc2FsQ2F0ZWdvcnlfdGl0bGU9RGVmYXVsdCBQcm9wb3NhbHMKLUNvbnRlbnRBc3Npc3RfcHJlc3M9UHJlc3MgJyd7MH0nJwotQ29udGVudEFzc2lzdF9jbGljaz1DbGljawotT3B0aW9uYWxNZXNzYWdlRGlhbG9nX2RvbnRTaG93QWdhaW49IERvIG5vdCBzaG93IHRoaXMgJm1lc3NhZ2UgYWdhaW4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIENvbnRlbnQgQXNzaXN0IFByb3BlcnRpZXMgcGFnZSBTdHJpbmdzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQ29kZUFzc2lzdEFkdmFuY2VkQ29uZmlndXJhdGlvbkJsb2NrX3BhZ2VfZGVzY3JpcHRpb249Q29uZmlndXJlIHRoZSBiZWhhdmlvciBvZiB0aGUgY29udGVudCBhc3Npc3QgKHswfSkgY29tbWFuZC4KLUNvZGVBc3Npc3RBZHZhbmNlZENvbmZpZ3VyYXRpb25CbG9ja19ub19zaG9ydGN1dD1ubyBzaG9ydGN1dAotQ29kZUFzc2lzdEFkdmFuY2VkQ29uZmlndXJhdGlvbkJsb2NrX1VwPSZVcAotQ29kZUFzc2lzdEFkdmFuY2VkQ29uZmlndXJhdGlvbkJsb2NrX0Rvd249RCZvd24KLUNvZGVBc3Npc3RBZHZhbmNlZENvbmZpZ3VyYXRpb25CbG9ja19kZWZhdWx0X3RhYmxlX2Rlc2NyaXB0aW9uPVNlbGVjdCB0aGUgcHJvcG9zYWwgJmNhdGVnb3JpZXMgY29udGFpbmVkIGluIHRoZSAnZGVmYXVsdCcgY29udGVudCBhc3Npc3QgbGlzdDoKLUNvZGVBc3Npc3RBZHZhbmNlZENvbmZpZ3VyYXRpb25CbG9ja19kZWZhdWx0X3RhYmxlX2NhdGVnb3J5X2NvbHVtbl90aXRsZT1EZWZhdWx0IFByb3Bvc2FsIENhdGVnb3JpZXMKLUNvZGVBc3Npc3RBZHZhbmNlZENvbmZpZ3VyYXRpb25CbG9ja19QYWdlc0Rvd249RG8md24KLUNvZGVBc3Npc3RBZHZhbmNlZENvbmZpZ3VyYXRpb25CbG9ja19QYWdlc1VwPVUmcAotQ29kZUFzc2lzdEFkdmFuY2VkQ29uZmlndXJhdGlvbkJsb2NrX3NlcGFyYXRlX3RhYmxlX2Rlc2NyaXB0aW9uPVNlbGVjdCB0aGUgJmVuYWJsZW1lbnQgYW5kIG9yZGVyIG9mIHByb3Bvc2FsIGNhdGVnb3JpZXMgdGhhdCBhcmUgY3ljbGVkIHRocm91Z2ggd2hlbiByZXBlYXRlZGx5IGludm9raW5nIGNvbnRlbnQgYXNzaXN0OgotQ29kZUFzc2lzdEFkdmFuY2VkQ29uZmlndXJhdGlvbkJsb2NrX3NlcGFyYXRlX3RhYmxlX2NhdGVnb3J5X2NvbHVtbl90aXRsZT1Db250ZW50IEFzc2lzdCBQYWdlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TaG93Vmlld0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1Nob3dWaWV3QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlM2FhNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1Nob3dWaWV3QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTdXJmYWNlcyBhIFZpZXcuCi0gKiAKLSAqIEBhdXRob3IgTml0aW4gRGFoeWFiaGFpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaG93Vmlld0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBTaG93Vmlld0FjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBTaG93Vmlld0FjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBpbWFnZQotCSAqLwotCXB1YmxpYyBTaG93Vmlld0FjdGlvbihTdHJpbmcgdGV4dCwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlKSB7Ci0JCXN1cGVyKHRleHQsIGltYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBTaG93Vmlld0FjdGlvbihTdHJpbmcgdGV4dCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHRleHQsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWaWV3SUQoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJc3VwZXIucnVuKCk7Ci0JCXNob3dWaWV3KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bldpdGhFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIucnVuV2l0aEV2ZW50KGV2ZW50KTsKLQkJc2hvd1ZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNob3dWaWV3KCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcGFnZS5zaG93VmlldyhnZXRWaWV3SUQoKSk7Ci0JCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHdpbmRvdy5nZXRTaGVsbCgpLCBTU0VVSU1lc3NhZ2VzLlNob3dWaWV3X2Vycm9yVGl0bGUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQllLmdldE1lc3NhZ2UoKSwgZS5nZXRTdGF0dXMoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RvcmFnZU1vZGVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdG9yYWdlTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjEzMTViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdG9yYWdlTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUVuY29kZWRTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhdGhFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5GaWxlRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUxvY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuRG9jdW1lbnRQcm92aWRlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRWxlbWVudFN0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkUmVhZGVyQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlYnVnLkJyZWFrcG9pbnRSdWxlckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JNb2RlbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludC5JRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogQSBTdG9yYWdlRG9jdW1lbnRQcm92aWRlciB0aGF0IGlzIElTdHJ1Y3R1cmVkTW9kZWwgYXdhcmUKLSAqLwotcHVibGljIGNsYXNzIFN0b3JhZ2VNb2RlbFByb3ZpZGVyIGV4dGVuZHMgU3RvcmFnZURvY3VtZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJTW9kZWxQcm92aWRlciB7Ci0KLQlwcml2YXRlIGNsYXNzIEludGVybmFsRWxlbWVudFN0YXRlTGlzdGVuZXIgaW1wbGVtZW50cyBJRWxlbWVudFN0YXRlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBlbGVtZW50Q29udGVudEFib3V0VG9CZVJlcGxhY2VkKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZGVidWdFbGVtZW50U3RhdGVsaXN0ZW5lcikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGVsZW1lbnRDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQ6ICIgKyAoKElFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy8gd2UganVzdCBmb3J3YXJkIHRoZSBldmVudAotCQkJU3RvcmFnZU1vZGVsUHJvdmlkZXIudGhpcy5maXJlRWxlbWVudENvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChlbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVsZW1lbnRDb250ZW50UmVwbGFjZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChkZWJ1Z0VsZW1lbnRTdGF0ZWxpc3RlbmVyKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZWxlbWVudENvbnRlbnRSZXBsYWNlZDogIiArICgoSUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCVN0b3JhZ2VJbmZvIGluZm8gPSAoU3RvcmFnZUluZm8pIGdldEVsZW1lbnRJbmZvKGVsZW1lbnQpOwotCQkJCi0JCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJLyoqCi0JCQkgKiBGb3JjZSBhIHJlbG9hZCBvZiB0aGUgbWFya2VycyBpbnRvIGFubm90YXRpb25zIHNpbmNlIHRoZWlyCi0JCQkgKiBwcmV2aW91cyBQb3NpdGlvbnMgaGF2ZSBiZWVuIGRlbGV0ZWQuIERpc2Nvbm5lY3RpbmcgYW5kCi0JCQkgKiByZWNvbm5lY3RpbmcgZm9yY2VzIGEgY2FsbCB0byB0aGUgcHJpdmF0ZSBjYXRjaHVwV2l0aE1hcmtlcnMKLQkJCSAqIG1ldGhvZC4KLQkJCSAqLwotCQkJaWYgKGluZm8uZk1vZGVsICE9IG51bGwpIHsKLQkJCQlpbmZvLmZNb2RlbC5kaXNjb25uZWN0KGluZm8uZkRvY3VtZW50KTsKLQkJCX0KLQotCQkJUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGlubmVyZG9jdW1lbnQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyB1cGRhdGUgZG9jdW1lbnQgZnJvbSBpbnB1dCdzIGNvbnRlbnRzCi0JCQkJQ29kZWRSZWFkZXJDcmVhdG9yIGNvZGVkUmVhZGVyQ3JlYXRvciA9IG5ldyBDb2RlZFJlYWRlckNyZWF0b3IoY2FsY3VsYXRlSUQoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLCBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbSgoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldFN0b3JhZ2UoKS5nZXRDb250ZW50cygpKSk7Ci0JCQkJcmVhZGVyID0gY29kZWRSZWFkZXJDcmVhdG9yLmdldENvZGVkUmVhZGVyKCk7Ci0KLQkJCQlpbm5lcmRvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGluZm8uZkRvY3VtZW50OwotCi0JCQkJaW50IG9yaWdpbmFsTGVuZ3RoVG9SZXBsYWNlID0gaW5uZXJkb2N1bWVudC5nZXRMZW5ndGgoKTsKLQotCQkJCVN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJaW50IGJ1ZmZlclNpemUgPSAyMDQ4OwotCQkJCWNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcltidWZmZXJTaXplXTsKLQkJCQlpbnQgblJlYWQgPSAwOwotCQkJCWJvb2xlYW4gZW9mID0gZmFsc2U7Ci0JCQkJd2hpbGUgKCFlb2YpIHsKLQkJCQkJblJlYWQgPSByZWFkZXIucmVhZChidWZmZXIsIDAsIGJ1ZmZlclNpemUpOwotCQkJCQlpZiAoblJlYWQgPT0gLTEpIHsKLQkJCQkJCWVvZiA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGJ1ZmZlciwgMCwgblJlYWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlubmVyZG9jdW1lbnQucmVwbGFjZVRleHQodGhpcywgMCwgb3JpZ2luYWxMZW5ndGhUb1JlcGxhY2UsIHN0cmluZ0J1ZmZlci50b1N0cmluZygpLCB0cnVlKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZWFkZXIuY2xvc2UoKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkJCS8vIHdvdWxkIGJlIGhpZ2hseSB1bnVzdWFsCi0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gZm9yd2FyZCB0aGUgZXZlbnQKLQkJCWlmIChpbmZvLmZDYW5CZVNhdmVkKSB7Ci0JCQkJaW5mby5mQ2FuQmVTYXZlZCA9IGZhbHNlOwotCQkJCWFkZFVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoZWxlbWVudCwgaW5mbyk7Ci0JCQl9Ci0JCQlmaXJlRWxlbWVudENvbnRlbnRSZXBsYWNlZChlbGVtZW50KTsKLQkJCWZpcmVFbGVtZW50RGlydHlTdGF0ZUNoYW5nZWQoZWxlbWVudCwgZmFsc2UpOwotCi0JCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8uZk1vZGVsICE9IG51bGwpIHsKLQkJCQlpbmZvLmZNb2RlbC5jb25uZWN0KGluZm8uZkRvY3VtZW50KTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVsZW1lbnREZWxldGVkKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZGVidWdFbGVtZW50U3RhdGVsaXN0ZW5lcikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGVsZW1lbnREZWxldGVkOiAiICsgKChJRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIHdlIGp1c3QgZm9yd2FyZCB0aGUgZXZlbnQKLQkJCVN0b3JhZ2VNb2RlbFByb3ZpZGVyLnRoaXMuZmlyZUVsZW1lbnREZWxldGVkKGVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWxlbWVudERpcnR5U3RhdGVDaGFuZ2VkKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGlzRGlydHkpIHsKLQkJCWlmIChkZWJ1Z0VsZW1lbnRTdGF0ZWxpc3RlbmVyKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZWxlbWVudERpcnR5U3RhdGVDaGFuZ2VkOiAiICsgKChJRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldE5hbWUoKSArICIgKCIgKyBpc0RpcnR5ICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCS8vIHdlIGp1c3QgZm9yd2FyZCB0aGUgZXZlbnQKLQkJCVN0b3JhZ2VNb2RlbFByb3ZpZGVyLnRoaXMuZmlyZUVsZW1lbnREaXJ0eVN0YXRlQ2hhbmdlZChlbGVtZW50LCBpc0RpcnR5KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVsZW1lbnRNb3ZlZChPYmplY3Qgb3JpZ2luYWxFbGVtZW50LCBPYmplY3QgbW92ZWRFbGVtZW50KSB7Ci0JCQlpZiAoZGVidWdFbGVtZW50U3RhdGVsaXN0ZW5lcikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGVsZW1lbnRNb3ZlZCAiICsgb3JpZ2luYWxFbGVtZW50ICsgIiAtLT4gIiArIG1vdmVkRWxlbWVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJLy8gd2UganVzdCBmb3J3YXJkIHRoZSBldmVudAotCQkJU3RvcmFnZU1vZGVsUHJvdmlkZXIudGhpcy5maXJlRWxlbWVudE1vdmVkKG9yaWdpbmFsRWxlbWVudCwgbW92ZWRFbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbGxlY3Rpb24gb2YgaW5mbyB0aGF0IGdvZXMgd2l0aCBhIG1vZGVsLgotCSAqLwotCXByaXZhdGUgY2xhc3MgTW9kZWxJbmZvIHsKLQkJcHVibGljIElFZGl0b3JJbnB1dCBmRWxlbWVudDsKLQkJcHVibGljIGJvb2xlYW4gZlNob3VsZFJlbGVhc2VPbkluZm9EaXNwb3NlOwotCQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBmU3RydWN0dXJlZE1vZGVsOwotCi0JCXB1YmxpYyBNb2RlbEluZm8oSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIElFZGl0b3JJbnB1dCBlbGVtZW50LCBib29sZWFuIHNlbGZDcmVhdGVkKSB7Ci0JCQlmRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQlmU3RydWN0dXJlZE1vZGVsID0gc3RydWN0dXJlZE1vZGVsOwotCQkJZlNob3VsZFJlbGVhc2VPbkluZm9EaXNwb3NlID0gc2VsZkNyZWF0ZWQ7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z0VsZW1lbnRTdGF0ZWxpc3RlbmVyID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvc3RvcmFnZW1vZGVscHJvdmlkZXIvZWxlbWVudHN0YXRlbGlzdGVuZXIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnT3BlcmF0aW9ucyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL3N0b3JhZ2Vtb2RlbHByb3ZpZGVyL29wZXJhdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBzdGF0aWMgU3RvcmFnZU1vZGVsUHJvdmlkZXIgZkluc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0b3JhZ2VNb2RlbFByb3ZpZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpCi0JCQlmSW5zdGFuY2UgPSBuZXcgU3RvcmFnZU1vZGVsUHJvdmlkZXIoKTsKLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIElFbGVtZW50U3RhdGVMaXN0ZW5lciBmSW50ZXJuYWxMaXN0ZW5lcjsKLQkvKiogSVN0cnVjdHVyZWRNb2RlbCBpbmZvcm1hdGlvbiBvZiBhbGwgY29ubmVjdGVkIGVsZW1lbnRzICovCi0JcHJpdmF0ZSBNYXAgZk1vZGVsSW5mb01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBib29sZWFuIGZSZXVzZU1vZGVsRG9jdW1lbnQgPSB0cnVlOwotCi0JcHJpdmF0ZSBTdG9yYWdlTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQkJZkludGVybmFsTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxFbGVtZW50U3RhdGVMaXN0ZW5lcigpOwotCX0KLQotCVN0cmluZyBjYWxjdWxhdGVCYXNlTG9jYXRpb24oSVN0b3JhZ2VFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJUGF0aEVkaXRvcklucHV0KSB7Ci0JCQlJUGF0aCBwYXRoID0gKChJUGF0aEVkaXRvcklucHV0KSBpbnB1dCkuZ2V0UGF0aCgpOwotCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCWxvY2F0aW9uID0gcGF0aC50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgSUxvY2F0aW9uUHJvdmlkZXIpIHsKLQkJCUlQYXRoIHBhdGggPSAoKElMb2NhdGlvblByb3ZpZGVyKSBpbnB1dCkuZ2V0UGF0aChpbnB1dCk7Ci0JCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJbG9jYXRpb24gPSBwYXRoLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVN0b3JhZ2Ugc3RvcmFnZSA9IGlucHV0LmdldFN0b3JhZ2UoKTsKLQkJCQlpZiAoc3RvcmFnZSAhPSBudWxsKSB7Ci0JCQkJCUlQYXRoIHN0b3JhZ2VQYXRoID0gc3RvcmFnZS5nZXRGdWxsUGF0aCgpOwotCQkJCQlTdHJpbmcgbmFtZSA9IHN0b3JhZ2UuZ2V0TmFtZSgpOwotCQkJCQlpZiAoc3RvcmFnZVBhdGggIT0gbnVsbCkgewotCQkJCQkJLyoKLQkJCQkJCSAqIElmIHRoZSBwYXRoJ3MgbGFzdCBzZWdtZW50IGFuZCB0aGUgbmFtZSBhcmUKLQkJCQkJCSAqIGRpZmZlcmVudCwgdGhlIElTdG9yYWdlIGNvbnRyYWN0IGlzIG5vdCBiZWluZwotCQkJCQkJICogaG9ub3JlZAotCQkJCQkJICogKGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT8KLQkJCQkJCSAqIGlkPTczMDk4KS4gRmF2b3IgdGhlIG5hbWUKLQkJCQkJCSAqLwotCQkJCQkJaWYgKCFzdG9yYWdlUGF0aC5sYXN0U2VnbWVudCgpLmVxdWFscyhuYW1lKSkgewotCQkJCQkJCUlQYXRoIHdvcmtpbmdQYXRoID0gc3RvcmFnZVBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQkJCQkJCQlsb2NhdGlvbiA9IHdvcmtpbmdQYXRoLmFwcGVuZChuYW1lKS50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJbG9jYXRpb24gPSBzdG9yYWdlUGF0aC5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJCQkJbG9jYXRpb24gPSBuYW1lOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKGxvY2F0aW9uID09IG51bGwpCi0JCQkJCWxvY2F0aW9uID0gaW5wdXQuZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQlTdHJpbmcgY2FsY3VsYXRlSUQoSVN0b3JhZ2VFZGl0b3JJbnB1dCBpbnB1dCkgewotCQkvKioKLQkJICogVHlwaWNhbGx5IENWUyB3aWxsIHJldHVybiBhIHBhdGggb2YgImZpbGVuYW1lLmV4dCIgYW5kIHRoZSBpbnB1dCdzCi0JCSAqIG5hbWUgd2lsbCBiZSAiZmlsZW5hbWUuZXh0IHZlcnNpb24iLiBUaGUgcGF0aCBtdXN0IGJlIHVzZWQgdG8gbG9hZAotCQkgKiB0aGUgbW9kZWwgc28gdGhhdCB0aGUgc3VmZml4IHdpbGwgYmUgYXZhaWxhYmxlIHRvIGNvbXB1dGUgdGhlCi0JCSAqIGNvbnRlbnRUeXBlIHByb3Blcmx5LiBUaGUgZWRpdG9yIGlucHV0IG5hbWUgY2FuIHRoZW4gYmUgc2V0IGFzIHRoZQotCQkgKiBiYXNlIGxvY2F0aW9uIGZvciBkaXNwbGF5IG9uIHRoZSBlZGl0b3IgdGl0bGUgYmFyLgotCQkgKiAKLQkJICovCi0JCVN0cmluZyBwYXRoID0gbnVsbDsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUxvY2F0aW9uUHJvdmlkZXIpIHsKLQkJCUlQYXRoIGlwYXRoID0gKChJTG9jYXRpb25Qcm92aWRlcikgaW5wdXQpLmdldFBhdGgoaW5wdXQpOwotCQkJaWYgKGlwYXRoICE9IG51bGwpIHsKLQkJCQlwYXRoID0gaXBhdGgudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlTdG9yYWdlIHN0b3JhZ2UgPSBpbnB1dC5nZXRTdG9yYWdlKCk7Ci0JCQkJaWYgKHN0b3JhZ2UgIT0gbnVsbCkgewotCQkJCQlJUGF0aCBzdG9yYWdlUGF0aCA9IHN0b3JhZ2UuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJU3RyaW5nIG5hbWUgPSBzdG9yYWdlLmdldE5hbWUoKTsKLQkJCQkJaWYgKHN0b3JhZ2VQYXRoICE9IG51bGwpIHsKLQkJCQkJCS8vIElmIHRoZXkgYXJlIGRpZmZlcmVudCwgdGhlIElTdG9yYWdlIGNvbnRyYWN0IGlzIG5vdAotCQkJCQkJLy8gYmVpbmcgaG9ub3JlZAotCQkJCQkJLy8gKGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzA5OCkuCi0JCQkJCQkvLyBGYXZvciB0aGUgbmFtZS4KLQkJCQkJCWlmICghc3RvcmFnZVBhdGgubGFzdFNlZ21lbnQoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJCQlJUGF0aCB3b3JraW5nUGF0aCA9IHN0b3JhZ2VQYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JCQkJCQkJcGF0aCA9IHdvcmtpbmdQYXRoLmFwcGVuZChuYW1lKS50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcGF0aCA9IHN0b3JhZ2VQYXRoLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCQkJCXBhdGggPSBuYW1lOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCQkJcGF0aCA9IGlucHV0LmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCS8qCi0JCSAqIFByZXBlbmQgdGhlIGhhc2ggdG8gdGhlIHBhdGggdmFsdWUgc28gdGhhdCB3ZSBoYXZlIGEgMToxOjEgbWF0Y2gKLQkJICogYmV0d2VlbiBlZGl0b3IgaW5wdXRzLCBlbGVtZW50IGluZm8sIGFuZCBtb2RlbHMuIFRoZSBlZGl0b3IgbWFuYWdlcgotCQkgKiBzaG91bGQgaGVscCBwcmV2ZW50IG5lZWRsZXNzbHkgZHVwbGljYXRlZCBtb2RlbHMgYXMgbG9uZyBhcyB0d28KLQkJICogZWRpdG9yIGlucHV0cyBmcm9tIHRoZSBzYW1lIHN0b3JhZ2UgaW5kaWNhdGUgdGhleSdyZSBlcXVhbHMoKS4KLQkJICovCi0JCXBhdGggPSBpbnB1dC5oYXNoQ29kZSgpICsgIiMiICsgcGF0aDsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvLyBwdWJsaWMgYm9vbGVhbiBjYW5TYXZlRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCi0JcHJvdGVjdGVkIElBbm5vdGF0aW9uTW9kZWwgY3JlYXRlQW5ub3RhdGlvbk1vZGVsKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAoZGVidWdPcGVyYXRpb25zKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogY3JlYXRlQW5ub3RhdGlvbk1vZGVsIGZvciAiICsgKChJU3RvcmFnZUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBjcmVhdGVBbm5vdGF0aW9uTW9kZWwgZm9yICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJSVN0b3JhZ2VFZGl0b3JJbnB1dCBpbnB1dCA9IChJU3RvcmFnZUVkaXRvcklucHV0KSBlbGVtZW50OwotCQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gKGdldE1vZGVsKGlucHV0KSAhPSBudWxsID8gZ2V0TW9kZWwoaW5wdXQpLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpIDogbnVsbCk7Ci0JCQlTdHJpbmcgZXh0ID0gQnJlYWtwb2ludFJ1bGVyQWN0aW9uLmdldEZpbGVFeHRlbnNpb24oKElFZGl0b3JJbnB1dCkgZWxlbWVudCk7Ci0JCQlJUmVzb3VyY2UgcmVzID0gQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlKGlucHV0LCBjb250ZW50VHlwZSwgZXh0KTsKLQkJCVN0cmluZyBpZCA9IGlucHV0LmdldE5hbWUoKTsKLQkJCWlmIChpbnB1dC5nZXRTdG9yYWdlKCkgIT0gbnVsbCAmJiBpbnB1dC5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKSAhPSBudWxsKSB7Ci0JCQkJaWQgPSBpbnB1dC5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQkJfQotCQkJLy8gd2UgY2FuIG9ubHkgY3JlYXRlIGEgcmVzb3VyY2UgbWFya2VyIGFubm90YXRpb25tb2RlbCBvZmYgb2YgYQotCQkJLy8gdmFsaWQgcmVzb3VyY2UKLQkJCWlmIChyZXMgIT0gbnVsbCkKLQkJCQltb2RlbCA9IG5ldyBTdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWwocmVzLCBpZCk7Ci0JCQllbHNlCi0JCQkJbW9kZWwgPSBuZXcgQW5ub3RhdGlvbk1vZGVsKCk7Ci0JCX0KLQkJaWYgKG1vZGVsID09IG51bGwpIHsKLQkJCW1vZGVsID0gc3VwZXIuY3JlYXRlQW5ub3RhdGlvbk1vZGVsKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURvY3VtZW50IGNyZWF0ZURvY3VtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChkZWJ1Z09wZXJhdGlvbnMpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkKLQkJCQl0cnkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBjcmVhdGVEb2N1bWVudCBmb3IgIiArICgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogY3JlYXRlRG9jdW1lbnQgZm9yICIgKyBlbGVtZW50ICsgIihleGNlcHRpb24gY2F1Z2h0KSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQllbHNlIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBjcmVhdGVEb2N1bWVudCBmb3IgIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvLyBUaGUgZm9sbG93aW5nIGlzIGxhcmdlbHkgY29waWVkIGZyb20gRmlsZU1vZGVsUHJvdmlkZXIKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFZGl0b3JJbnB1dCkgewotCQkJLy8gY3JlYXRlIGEgbmV3IElEb2N1bWVudCBmb3IgdGhlIGVsZW1lbnQ7IHNob3VsZCBhbHdheXMgcmVmbGVjdAotCQkJLy8gdGhlIGNvbnRlbnRzIG9mIHRoZSByZXNvdXJjZQotCQkJTW9kZWxJbmZvIGluZm8gPSBnZXRNb2RlbEluZm9Gb3IoKElFZGl0b3JJbnB1dCkgZWxlbWVudCk7Ci0JCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm8gY29ycmVzcG9uZGluZyBtb2RlbCBpbmZvIGZvdW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBpbmZvLmZTdHJ1Y3R1cmVkTW9kZWw7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCWlmICghZlJldXNlTW9kZWxEb2N1bWVudCAmJiBlbGVtZW50IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJCQlSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBpbm5lcmRvY3VtZW50ID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIHVwZGF0ZSBkb2N1bWVudCBmcm9tIGlucHV0J3MgY29udGVudHMKLQotCQkJCQkJQ29kZWRSZWFkZXJDcmVhdG9yIGNvZGVkUmVhZGVyQ3JlYXRvciA9IG5ldyBDb2RlZFJlYWRlckNyZWF0b3IoY2FsY3VsYXRlSUQoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLCBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbSgoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldFN0b3JhZ2UoKS5nZXRDb250ZW50cygpKSk7Ci0JCQkJCQlyZWFkZXIgPSBjb2RlZFJlYWRlckNyZWF0b3IuZ2V0Q29kZWRSZWFkZXIoKTsKLQotCQkJCQkJaW5uZXJkb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCQkJCQlpbnQgb3JpZ2luYWxMZW5ndGhUb1JlcGxhY2UgPSBpbm5lcmRvY3VtZW50LmdldExlbmd0aCgpOwotCi0JCQkJCQkvKgotCQkJCQkJICogVE9ET19mdXR1cmU6IHdlIGNvdWxkIGltcGxlbWVudCB3aXRoIHNlcXVlbnRpYWwKLQkJCQkJCSAqIHJld3JpdGUsIGlmIHdlIGRvbid0IHBpY2t1cCBhdXRvbWF0aWNhbGx5IGZyb20KLQkJCQkJCSAqIEZpbGVCdWZmZXIgc3VwcG9ydCwgc28gbm90IHNvIG11Y2ggaGFzIHRvIGJlIHB1bGxlZAotCQkJCQkJICogaW50byBtZW1vcnkgKGFzIGFuIGV4dHJhIGJpZyBzdHJpbmcpLCBidXQgd2UgbmVlZAotCQkJCQkJICogdG8gY2FycnkgdGhhdCBBUEkgdGhyb3VnaCBzbyB0aGF0IFN0cnVjdHVyZWRNb2RlbAotCQkJCQkJICogaXMgbm90IG5vdGlmaWVkIHVudGlsIGRvbmUuCi0JCQkJCQkgKi8KLQotCQkJCQkJLy8gaW5uZXJkb2N1bWVudC5zdGFydFNlcXVlbnRpYWxSZXdyaXRlKHRydWUpOwotCQkJCQkJLy8gaW5uZXJkb2N1bWVudC5yZXBsYWNlVGV4dCh0aGlzLCAwLAotCQkJCQkJLy8gaW5uZXJkb2N1bWVudC5nZXRMZW5ndGgoKSwgIiIpOwotCQkJCQkJU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCWludCBidWZmZXJTaXplID0gMjA0ODsKLQkJCQkJCWNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcltidWZmZXJTaXplXTsKLQkJCQkJCWludCBuUmVhZCA9IDA7Ci0JCQkJCQlib29sZWFuIGVvZiA9IGZhbHNlOwotCQkJCQkJd2hpbGUgKCFlb2YpIHsKLQkJCQkJCQluUmVhZCA9IHJlYWRlci5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyU2l6ZSk7Ci0JCQkJCQkJaWYgKG5SZWFkID09IC0xKSB7Ci0JCQkJCQkJCWVvZiA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGJ1ZmZlciwgMCwgblJlYWQpOwotCQkJCQkJCQkvLyBpbm5lcmRvY3VtZW50LnJlcGxhY2VUZXh0KHRoaXMsCi0JCQkJCQkJCS8vIGlubmVyZG9jdW1lbnQuZ2V0TGVuZ3RoKCksIDAsIG5ldwotCQkJCQkJCQkvLyBTdHJpbmcoYnVmZmVyLCAwLCBuUmVhZCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIGlnbm9yZSByZWFkLW9ubHkgc2V0dGluZ3MgaWYgcmV2ZXJ0aW5nIHdob2xlCi0JCQkJCQkvLyBkb2N1bWVudAotCQkJCQkJaW5uZXJkb2N1bWVudC5yZXBsYWNlVGV4dCh0aGlzLCAwLCBvcmlnaW5hbExlbmd0aFRvUmVwbGFjZSwgc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCksIHRydWUpOwotCQkJCQkJbW9kZWwuc2V0RGlydHlTdGF0ZShmYWxzZSk7Ci0KLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCQkJCQkvLyB3b3VsZCBiZSBoaWdobHkgdW51c3VhbAotCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBpZiAoaW5uZXJkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBpbm5lcmRvY3VtZW50LnN0b3BTZXF1ZW50aWFsUmV3cml0ZSgpOwotCQkJCQkJLy8gfQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCQkJZG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEFsc28gY3JlYXRlIE1vZGVsSW5mbyAtIGV4dHJhIHJlc291cmNlIHN5bmNocm9uaXphdGlvbiBjbGFzc2VzIHNob3VsZAotCSAqIGJlIHN0b3JlZCB3aXRoaW4gdGhlIE1vZGVsSW5mbwotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50SW5mbyBjcmVhdGVFbGVtZW50SW5mbyhPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgTW9kZWxJbmZvIGlmIG5lY2Vzc2FyeQotCQlpZiAoZGVidWdPcGVyYXRpb25zKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpCi0JCQkJdHJ5IHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogY3JlYXRlRWxlbWVudEluZm8gZm9yICIgKyAoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldFN0b3JhZ2UoKS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGNyZWF0ZUVsZW1lbnRJbmZvIGZvciAiICsgZWxlbWVudCArICIoZXhjZXB0aW9uIGNhdWdodCkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJZWxzZQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic3RvcmFnZU1vZGVsUHJvdmlkZXI6IGNyZWF0ZUVsZW1lbnRJbmZvIGZvciAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChnZXRNb2RlbEluZm9Gb3IoKElFZGl0b3JJbnB1dCkgZWxlbWVudCkgPT0gbnVsbCkgewotCQkJY3JlYXRlTW9kZWxJbmZvKChJRWRpdG9ySW5wdXQpIGVsZW1lbnQpOwotCQl9Ci0KLQkJRWxlbWVudEluZm8gaW5mbyA9IHN1cGVyLmNyZWF0ZUVsZW1lbnRJbmZvKGVsZW1lbnQpOwotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVNb2RlbEluZm8oSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChnZXRNb2RlbEluZm9Gb3IoaW5wdXQpID09IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gc2VsZkNyZWF0ZU1vZGVsKGlucHV0KTsKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJCWNyZWF0ZU1vZGVsSW5mbyhpbnB1dCwgc3RydWN0dXJlZE1vZGVsLCB0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRvIGJlIHVzZWQgd2hlbiBtb2RlbCBpcyBwcm92aWRlZCB0byB1cywgZW5zdXJlcyB0aGF0IHdoZW4gc2V0SW5wdXQgaXMKLQkgKiB1c2VkIG9uIHRoaXMgaW5wdXQsIHRoZSBnaXZlbiBtb2RlbCB3aWxsIGJlIHVzZWQuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlTW9kZWxJbmZvKElFZGl0b3JJbnB1dCBpbnB1dCwgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIGJvb2xlYW4gcmVsZWFzZU1vZGVsT25EaXNjb25uZWN0KSB7Ci0JCS8vIHdlIGhhdmUgdG8gbWFrZSBzdXJlIGZhY3RvcmllcyBhcmUgYWRkZWQsIHdoZXRoZXIgd2UgY3JlYXRlZCBvcgotCQkvLyBub3QuCi0JCWlmIChnZXRNb2RlbEluZm9Gb3IoaW5wdXQpICE9IG51bGwgfHwgZ2V0TW9kZWxJbmZvRm9yKHN0cnVjdHVyZWRNb2RlbCkgIT0gbnVsbCkgewotCQkJaWYgKGRlYnVnT3BlcmF0aW9ucykgewotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQotCQkJCQl0cnkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogRFVQTElDQVRFIGNyZWF0ZU1vZGVsSW5mbyBmb3IgIiArICgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFN0b3JhZ2UoKS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IERVUExJQ0FURSBjcmVhdGVNb2RlbEluZm8gZm9yICIgKyBpbnB1dCArICIoZXhjZXB0aW9uIGNhdWdodCkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic3RvcmFnZU1vZGVsUHJvdmlkZXI6IERVUExJQ0FURSBjcmVhdGVNb2RlbEluZm8gZm9yICIgKyBpbnB1dCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZGVidWdPcGVyYXRpb25zKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogY3JlYXRlTW9kZWxJbmZvIGZvciAiICsgKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogY3JlYXRlTW9kZWxJbmZvIGZvciAiICsgaW5wdXQgKyAiKGV4Y2VwdGlvbiBjYXVnaHQpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGNyZWF0ZU1vZGVsSW5mbyBmb3IgIiArIGlucHV0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQkJCSgoSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuYWRkRWxlbWVudFN0YXRlTGlzdGVuZXIoZkludGVybmFsTGlzdGVuZXIpOwotCQl9Ci0KLQkJRWRpdG9yTW9kZWxVdGlsLmFkZEZhY3Rvcmllc1RvKHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkJTW9kZWxJbmZvIG1vZGVsSW5mbyA9IG5ldyBNb2RlbEluZm8oc3RydWN0dXJlZE1vZGVsLCBpbnB1dCwgcmVsZWFzZU1vZGVsT25EaXNjb25uZWN0KTsKLQkJZk1vZGVsSW5mb01hcC5wdXQoaW5wdXQsIG1vZGVsSW5mbyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50LCBFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCWlmIChkZWJ1Z09wZXJhdGlvbnMpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJCXRyeSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGRpc3Bvc2VFbGVtZW50SW5mbyBmb3IgIiArICgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZGlzcG9zZUVsZW1lbnRJbmZvIGZvciAiICsgZWxlbWVudCArICIoZXhjZXB0aW9uIGNhdWdodCkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZGlzcG9zZUVsZW1lbnRJbmZvIGZvciAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvcklucHV0KSB7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSAoSUVkaXRvcklucHV0KSBlbGVtZW50OwotCQkJTW9kZWxJbmZvIG1vZGVsSW5mbyA9IGdldE1vZGVsSW5mb0ZvcihpbnB1dCk7Ci0JCQlkaXNwb3NlTW9kZWxJbmZvKG1vZGVsSW5mbyk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZUVsZW1lbnRJbmZvKGVsZW1lbnQsIGluZm8pOwotCX0KLQotCS8qKgotCSAqIGRpc2Nvbm5lY3QgZnJvbSB0aGlzIG1vZGVsIGluZm8KLQkgKiAKLQkgKiBAcGFyYW0gaW5mbwotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2VNb2RlbEluZm8oTW9kZWxJbmZvIGluZm8pIHsKLQkJaWYgKGRlYnVnT3BlcmF0aW9ucykgewotCQkJaWYgKGluZm8uZkVsZW1lbnQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZGlzcG9zZU1vZGVsSW5mbyBmb3IgIiArICgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgaW5mby5mRWxlbWVudCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZGlzcG9zZU1vZGVsSW5mbyBmb3IgIiArIGluZm8uZkVsZW1lbnQgKyAiKGV4Y2VwdGlvbiBjYXVnaHQpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGRpc3Bvc2VNb2RlbEluZm8gZm9yICIgKyBpbmZvLmZFbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaWYgKGluZm8uZkVsZW1lbnQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQlpZiAoaW5mby5mRWxlbWVudCBpbnN0YW5jZW9mIElFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJCSgoSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0KSBpbmZvLmZFbGVtZW50KS5yZW1vdmVFbGVtZW50U3RhdGVMaXN0ZW5lcihmSW50ZXJuYWxMaXN0ZW5lcik7Ci0JCQl9Ci0JCQlpZiAoaW5mby5mU2hvdWxkUmVsZWFzZU9uSW5mb0Rpc3Bvc2UpIHsKLQkJCQlpbmZvLmZTdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0JCX0KLQkJZk1vZGVsSW5mb01hcC5yZW1vdmUoaW5mby5mRWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RG9jdW1lbnRQcm92aWRlciNkb1Jlc2V0RG9jdW1lbnQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvUmVzZXREb2N1bWVudChPYmplY3QgZWxlbWVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZSZXVzZU1vZGVsRG9jdW1lbnQgPSBmYWxzZTsKLQkJc3VwZXIuZG9SZXNldERvY3VtZW50KGVsZW1lbnQsIG1vbml0b3IpOwotCQlmUmV1c2VNb2RlbERvY3VtZW50ID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyI2RvU2F2ZURvY3VtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlRG9jdW1lbnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgZWxlbWVudCwgSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0JCS8vIEJVRzExOTIxMSAtIHRyeSB0byB1c2UgcmVnaXN0ZXJlZCBkb2N1bWVudCBwcm92aWRlciBpZiBwb3NzaWJsZQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFZGl0b3JJbnB1dCkgewotCQkJcHJvdmlkZXIgPSBEb2N1bWVudFByb3ZpZGVyUmVnaXN0cnkuZ2V0RGVmYXVsdCgpLmdldERvY3VtZW50UHJvdmlkZXIoKElFZGl0b3JJbnB1dCkgZWxlbWVudCk7Ci0JCX0KLQkJaWYgKHByb3ZpZGVyID09IG51bGwpCi0JCQlwcm92aWRlciA9IG5ldyBGaWxlRG9jdW1lbnRQcm92aWRlcigpOwotCQlwcm92aWRlci5zYXZlRG9jdW1lbnQobW9uaXRvciwgZWxlbWVudCwgZG9jdW1lbnQsIG92ZXJ3cml0ZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5TdG9yYWdlRG9jdW1lbnRQcm92aWRlciNnZXRQZXJzaXN0ZWRFbmNvZGluZyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGVyc2lzdGVkRW5jb2RpbmcoT2JqZWN0IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGNoYXJzZXQgPSBzdXBlci5nZXRQZXJzaXN0ZWRFbmNvZGluZyhlbGVtZW50KTsKLQkJaWYgKGNoYXJzZXQgPT0gbnVsbCAmJiBlbGVtZW50IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJSVN0b3JhZ2Ugc3RvcmFnZTsKLQkJCXRyeSB7Ci0JCQkJc3RvcmFnZSA9ICgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0U3RvcmFnZSgpOwotCQkJCWlmIChzdG9yYWdlICE9IG51bGwgJiYgIShzdG9yYWdlIGluc3RhbmNlb2YgSUVuY29kZWRTdG9yYWdlKSkgewotCQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljb250ZW50cyA9IHN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJUXVhbGlmaWVkTmFtZVtdIGRldGVjdGlvbk9wdGlvbnMgPSBuZXcgUXVhbGlmaWVkTmFtZVtde0lDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVR9OwotCQkJCQkJCUlDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXREZXNjcmlwdGlvbkZvcihjb250ZW50cywgc3RvcmFnZS5nZXROYW1lKCksIGRldGVjdGlvbk9wdGlvbnMpOwotCQkJCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCWNoYXJzZXQgPSBkZXNjcmlwdGlvbi5nZXRDaGFyc2V0KCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCWlmIChjb250ZW50cyAhPSBudWxsKQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hhcnNldDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbChJRWRpdG9ySW5wdXQgZWxlbWVudCkgewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCU1vZGVsSW5mbyBpbmZvID0gZ2V0TW9kZWxJbmZvRm9yKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBpbmZvLmZTdHJ1Y3R1cmVkTW9kZWw7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuSU1vZGVsUHJvdmlkZXIjZ2V0TW9kZWwoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFZGl0b3JJbnB1dCkKLQkJCXJldHVybiBnZXRNb2RlbCgoSUVkaXRvcklucHV0KSBlbGVtZW50KTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBNb2RlbEluZm8gZ2V0TW9kZWxJbmZvRm9yKElFZGl0b3JJbnB1dCBlbGVtZW50KSB7Ci0JCU1vZGVsSW5mbyByZXN1bHQgPSAoTW9kZWxJbmZvKSBmTW9kZWxJbmZvTWFwLmdldChlbGVtZW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIE1vZGVsSW5mbyBnZXRNb2RlbEluZm9Gb3IoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJTW9kZWxJbmZvIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJTW9kZWxJbmZvW10gbW9kZWxJbmZvcyA9IChNb2RlbEluZm9bXSkgZk1vZGVsSW5mb01hcC52YWx1ZXMoKS50b0FycmF5KG5ldyBNb2RlbEluZm9bMF0pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlbEluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJTW9kZWxJbmZvIGluZm8gPSBtb2RlbEluZm9zW2ldOwotCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwuZXF1YWxzKGluZm8uZlN0cnVjdHVyZWRNb2RlbCkpIHsKLQkJCQkJcmVzdWx0ID0gaW5mbzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGxvYWRNb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkTW9kZWwKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBsb2FkTW9kZWwoSVN0b3JhZ2VFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlyZXR1cm4gbG9hZE1vZGVsKGlucHV0LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGxvYWRNb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcGFyYW0gbG9nRXhjZXB0aW9ucwotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWRNb2RlbAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGxvYWRNb2RlbChJU3RvcmFnZUVkaXRvcklucHV0IGlucHV0LCBib29sZWFuIGxvZ0V4Y2VwdGlvbnMpIHsKLQkJU3RyaW5nIGlkID0gY2FsY3VsYXRlSUQoaW5wdXQpOwotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb250ZW50cyA9IGlucHV0LmdldFN0b3JhZ2UoKS5nZXRDb250ZW50cygpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIG5vU3RvcmFnZUV4YykgewotCQkJaWYgKGxvZ0V4Y2VwdGlvbnMpCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihOTFMuYmluZChTU0VVSU1lc3NhZ2VzLl8zMmNvbmNhdF9FWENfLCBuZXcgT2JqZWN0W117aW5wdXQuZ2V0TmFtZSgpfSksIG5vU3RvcmFnZUV4Yyk7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGZpcnN0IHBhcmFtZXRlciBtdXN0IGJlIHVuaXF1ZQotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChpZCwgY29udGVudHMsIG51bGwpOwotCQkJbW9kZWwuc2V0QmFzZUxvY2F0aW9uKGNhbGN1bGF0ZUJhc2VMb2NhdGlvbihpbnB1dCkpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAobG9nRXhjZXB0aW9ucykKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuXzMyY29uY2F0X0VYQ18sIG5ldyBPYmplY3RbXXtpbnB1dH0pLCBlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm90aGluZwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgc2VsZkNyZWF0ZU1vZGVsKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlyZXR1cm4gbG9hZE1vZGVsKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyNzZmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQWJzdHJhY3REb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQ29uZmlndXJhYmxlTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0TGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEFkYXB0ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVwYWlyYWJsZURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcm9qZWN0aW9uLlByb2plY3Rpb25Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGV4dENoYW5naW5nRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5JTG9ja2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuQXNzZXJ0OwotCi0KLS8qKgotICogQWRhcHRzIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZXZlbnRzIGFuZCBtZXRob2RzIHRvIFN0eWxlZFRleHRDb250ZW50IGV2ZW50cwotICogYW5kIG1ldGhvZHMKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRBZGFwdGVyLCBJRG9jdW1lbnRBZGFwdGVyRXh0ZW5zaW9uIHsKLQotCXByaXZhdGUgY2xhc3MgRG9jdW1lbnRDbG9uZSBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnQgewotCi0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgY2xvbmUgd2l0aCB0aGUgZ2l2ZW4gY29udGVudC4KLQkJICogCi0JCSAqIEBwYXJhbSBjb250ZW50Ci0JCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQKLQkJICogQHBhcmFtIGxpbmVEZWxpbWl0ZXJzCi0JCSAqICAgICAgICAgICAgdGhlIGxpbmUgZGVsaW1pdGVycwotCQkgKi8KLQkJcHVibGljIERvY3VtZW50Q2xvbmUoU3RyaW5nIGNvbnRlbnQsIFN0cmluZ1tdIGxpbmVEZWxpbWl0ZXJzKSB7Ci0JCQlzdXBlcigpOwotCQkJc2V0VGV4dFN0b3JlKG5ldyBTdHJpbmdUZXh0U3RvcmUoY29udGVudCkpOwotCQkJQ29uZmlndXJhYmxlTGluZVRyYWNrZXIgdHJhY2tlciA9IG5ldyBDb25maWd1cmFibGVMaW5lVHJhY2tlcihsaW5lRGVsaW1pdGVycyk7Ci0JCQlzZXRMaW5lVHJhY2tlcih0cmFja2VyKTsKLQkJCWdldFRyYWNrZXIoKS5zZXQoY29udGVudCk7Ci0JCQljb21wbGV0ZUluaXRpYWxpemF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvLyBBIHByZS1ub3RpZmljYXRpb24gbGlzdGVuZXIgZm9yIHRoZSB2aWV3ZXIncyBEb2N1bWVudAotCWNsYXNzIERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0JCXByb3RlY3RlZCBib29sZWFuIGFsbFRleHRDaGFuZ2VkID0gZmFsc2U7Ci0KLQkJcHJvdGVjdGVkIERvY3VtZW50RXZlbnQgY3VycmVudEV2ZW50OwotCi0JCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpCi0JCQkJcmV0dXJuOwotCi0JCQlwZW5kaW5nRG9jdW1lbnRDaGFuZ2VkRXZlbnQgPSB0cnVlOwotCQkJYWxsVGV4dENoYW5nZWQgPSBldmVudC5nZXRPZmZzZXQoKSA8PSAwICYmIGV2ZW50LmdldExlbmd0aCgpID49IFN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5nZXREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCQkJY3VycmVudEV2ZW50ID0gZXZlbnQ7Ci0KLQkJCVN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5yZWxheVRleHRDaGFuZ2luZyhldmVudC5nZXRPZmZzZXQoKSwgZXZlbnQuZ2V0TGVuZ3RoKCksIGV2ZW50LmdldFRleHQoKSk7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKQotCQkJCXJldHVybjsKLQotCQkJaWYgKGN1cnJlbnRFdmVudCAhPSBudWxsICYmIGV2ZW50ID09IGN1cnJlbnRFdmVudCkgewotCQkJCWlmIChhbGxUZXh0Q2hhbmdlZCkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyLnRoaXMucmVsYXlUZXh0U2V0KCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB0ZW1wIHdvcmsgYXJvdW5kIGZvciBpbW1lZGlhdGUgdGhyZWFkCi0JCQkJCS8vIHByb2JsZW0uCi0JCQkJCS8vIHNob3VsZCBoYXZlIG1vcmUgZ2VuZXJhbCBzb2x1dGlvbgotCQkJCQkvLyBzb29uLiAnc3luY0V4ZWMnIGFyZSBydW1vcmVkIHRvIGJlCi0JCQkJCS8vIHByb25lIHRvIGhhbmcuCi0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5yZWxheVRleHRDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfQotCi0JCQljdXJyZW50RXZlbnQgPSBudWxsOwotCQkJcGVuZGluZ0RvY3VtZW50Q2hhbmdlZEV2ZW50ID0gZmFsc2U7Ci0JCQloYW5kbGVQZW5kaW5nRXZlbnRzKCk7Ci0JCQlsYXN0RXZlbnQgPSBudWxsOwotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJpbmdUZXh0U3RvcmUgaW1wbGVtZW50cyBJVGV4dFN0b3JlIHsKLQotCQlwcml2YXRlIFN0cmluZyBmQ29udGVudDsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBzdHJpbmcgdGV4dCBzdG9yZSB3aXRoIHRoZSBnaXZlbiBjb250ZW50LgotCQkgKiAKLQkJICogQHBhcmFtIGNvbnRlbnQKLQkJICogICAgICAgICAgICB0aGUgY29udGVudAotCQkgKi8KLQkJcHVibGljIFN0cmluZ1RleHRTdG9yZShTdHJpbmcgY29udGVudCkgewotCQkJQXNzZXJ0LmlzTm90TnVsbChjb250ZW50LCAiY29udGVudCBjYW4gbm90IGJlIG51bGwgd2hlbiBzZXR0aW5nIHRleHQgc3RvcmUiKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNvbnRlbnQgPSBjb250ZW50OwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmUjZ2V0KGludCkKLQkJICovCi0JCXB1YmxpYyBjaGFyIGdldChpbnQgb2Zmc2V0KSB7Ci0JCQlyZXR1cm4gZkNvbnRlbnQuY2hhckF0KG9mZnNldCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZSNnZXQoaW50LCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gZkNvbnRlbnQuc3Vic3RyaW5nKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlI2dldExlbmd0aCgpCi0JCSAqLwotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCXJldHVybiBmQ29udGVudC5sZW5ndGgoKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlI3JlcGxhY2UoaW50LCBpbnQsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlcGxhY2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlI3NldChqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0KFN0cmluZyB0ZXh0KSB7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENoYW5nZXMgdG8gdGhlIERvY3VtZW50L0lTdHJ1Y3R1cmVkRG9jdW1lbnQgY2FuIGV4dGVuZCBiZXlvbmQgdGhlIHRleHQKLQkgKiBjaGFuZ2UgYXJlYSBhbmQgcmVxdWlyZSBtb3JlIHJlZHJhd2luZyB0byBrZWVwIHRoZSBoaWxpZ2h0aW5nIGNvcnJlY3QuCi0JICogVGhlIGV2ZW50IG11c3QgYmUgc2F2ZWQgc28gdGhhdCB0aGUgcmVkcmF3IGlzIG9ubHkgc2VudCBhZnRlciBhCi0JICogdGV4dENoYW5nZWQgZXZlbnQgaXMgcmVjZWl2ZWQuCi0JICovCi0JY2xhc3MgU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpIHsKLQkJCQkvLyBpZgotCQkJCS8vIChTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyLnRoaXMuZlN0b3BSZWxheWluZ0NoYW5nZXMpCi0JCQkJLy8gewotCQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNraXBwZWQgcmVsYXlpbmcgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBzaG91bGQgdXNlIHRleHRTZXQgd2hlbiBhbGwgY29udGVudHMgaGF2ZQotCQkJLy8gY2hhbmdlZAotCQkJLy8gb3RoZXJ3aXNlIG5lZWQgdG8gdXNlIHRoZSBwYWlyIG9mCi0JCQkvLyB0ZXh0Q2hhbmdpbmcgYW5kCi0JCQkvLyB0ZXh0Q2hhbmdlZC4KLQkJCVN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5sYXN0RXZlbnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKGZpbmFsIE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJza2lwcGVkIHJlbGF5aW5nIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5yZWFzb24gPT0gTm9DaGFuZ2VFdmVudC5SRUFEX09OTFlfU1RBVEVfQ0hBTkdFKSB7Ci0JCQkJaWYgKHBlbmRpbmdEb2N1bWVudENoYW5nZWRFdmVudCkgewotCQkJCQlpZiAobGFzdEV2ZW50UXVldWUgPT0gbnVsbCkgewotCQkJCQkJbGFzdEV2ZW50UXVldWUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCX0KLQkJCQkJbGFzdEV2ZW50UXVldWUuYWRkKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5sYXN0RXZlbnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKSB7Ci0JCQkJLy8gaWYKLQkJCQkvLyAoU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci50aGlzLmZTdG9wUmVsYXlpbmdDaGFuZ2VzKQotCQkJCS8vIHsKLQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJub3QgcmVsYXlpbmcgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNhdmluZyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyLnRoaXMubGFzdEV2ZW50ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCQlpZiAoaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSkgewotCQkJCS8vIGlmCi0JCQkJLy8gKFN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5mU3RvcFJlbGF5aW5nQ2hhbmdlcykKLQkJCQkvLyB7Ci0JCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm90IHJlbGF5aW5nIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzYXZpbmcgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci50aGlzLmxhc3RFdmVudCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKSB7Ci0JCQkJLy8gaWYKLQkJCQkvLyAoU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci50aGlzLmZTdG9wUmVsYXlpbmdDaGFuZ2VzKQotCQkJCS8vIHsKLQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJub3QgcmVsYXlpbmcgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNhdmluZyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyLnRoaXMubGFzdEV2ZW50ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gcmVkcmF3QmFja2dyb3VuZCA9IHRydWU7Ci0KLQkvKiogVGhlIHZpc2libGUgY2hpbGQgZG9jdW1lbnQuICovCi0JcHJpdmF0ZSBQcm9qZWN0aW9uRG9jdW1lbnQgZkNoaWxkRG9jdW1lbnQ7Ci0KLQkvKiogVGhlIG1hc3RlciBkb2N1bWVudCAqLwotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQkvKiogVGhlIGRvY3VtZW50IGNsb25lIGZvciB0aGUgbm9uLWZvcndhcmRpbmcgY2FzZS4gKi8KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnRDbG9uZTsKLQotCS8vIG9ubHkgdXNlIHRoaXMgdGVtcCB3b3JrIGFyb3VuZCBpZiBvbiBHVEsKLQkvLyBpdCBjYXVzZXMgZnVubnkgImN1cnNvciBibGlua2luZyIgaWYgdXNlZCBvbiB3aW5kb3dzCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZvcmNlUmVkcmF3T25SZWdpb25DaGFuZ2VkID0gUGxhdGZvcm0uZ2V0V1MoKS5lcXVhbHMoImd0ayIpOyAvLyROT04tTkxTLTEkCi0JLyoqIFRoZSBvcmlnaW5hbCBjb250ZW50ICovCi0JcHJpdmF0ZSBTdHJpbmcgZk9yaWdpbmFsQ29udGVudDsKLQkvKiogVGhlIG9yaWdpbmFsIGxpbmUgZGVsaW1pdGVycyAqLwotCXByaXZhdGUgU3RyaW5nW10gZk9yaWdpbmFsTGluZURlbGltaXRlcnM7Ci0KLQlwcml2YXRlIGludCBmU3RvcFJlbGF5aW5nQ2hhbmdlc1JlcXVlc3RzID0gMDsKLQotCXByaXZhdGUgU3R5bGVkVGV4dCBmU3R5bGVkVGV4dFdpZGdldDsKLQotCS8qKiBUaGUgcmVnaXN0ZXJlZCB0ZXh0IGNoYW5nZWQgbGlzdGVuZXJzICovCi0JVGV4dENoYW5nZUxpc3RlbmVyW10gZlRleHRDaGFuZ2VMaXN0ZW5lcnM7Ci0JcHJvdGVjdGVkIERvY3VtZW50TGlzdGVuZXIgaW50ZXJuYWxEb2N1bWVudExpc3RlbmVyOwotCi0JLy8gVGhlIGxpc3RlbmVycyBmb3IgcmVsYXlpbmcgRG9jdW1lbnRFdmVudHMgYW5kCi0JLy8gcmVxdWVzdGluZyByZXBhaW50cwotCS8vIGFmdGVyIG1vZGlmaWNhdGlvbgotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgbGFzdEV2ZW50ID0gbnVsbDsKLQlMaXN0IGxhc3RFdmVudFF1ZXVlOwotCWJvb2xlYW4gcGVuZGluZ0RvY3VtZW50Q2hhbmdlZEV2ZW50OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0JLyoqCi0JICogVEVTVCBPTkxZIC0gVEVTVCBPTkxZIC0gVEVTVCBPTkxZIE5PVCBBUEkgdXNlIHRoaXMgY29uc3RydWN0b3Igb25seSBmb3IKLQkgKiB0ZXN0cy4gQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBhZGFwdGVyIHdoaWNoIGlzIGluaXRpYWxsbHkgbm90IGNvbm5lY3RlZAotCSAqIHRvIGFueSBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlcigpIHsKLQotCQlpbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKCk7Ci0JCWludGVybmFsRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBEb2N1bWVudExpc3RlbmVyKCk7Ci0JCS8vIGZvciB0ZXN0aW5nIG9ubHkKLQkJLy8gc2V0RG9jdW1lbnQoZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKENvbnRlbnRUeXBlSWRlbnRpZmllckZvclhNTC5Db250ZW50VHlwZUlEX1hNTCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgYWRhcHRlciB3aGljaCBpcyBpbml0aWFsbGx5IG5vdCBjb25uZWN0ZWQgdG8gYW55Ci0JICogZG9jdW1lbnQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIoU3R5bGVkVGV4dCBzdHlsZWRUZXh0V2lkZ2V0KSB7Ci0KLQkJLy8gZG8gbm90IHVzZSAndGhpcygpJyBpbiB0aGlzIGNhc2UKLQkJc3VwZXIoKTsKLQkJaW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcigpOwotCQlpbnRlcm5hbERvY3VtZW50TGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRMaXN0ZW5lcigpOwotCQlmU3R5bGVkVGV4dFdpZGdldCA9IHN0eWxlZFRleHRXaWRnZXQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9zZXREb2N1bWVudChJRG9jdW1lbnQgbmV3RG9jKSB7Ci0JCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudCkucmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoaW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCX0KLQkJZkRvY3VtZW50ID0gbmV3RG9jOwotCQlpZiAoIWlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpIHsKLQkJCWZEb2N1bWVudENsb25lID0gbnVsbDsKLQkJCWZPcmlnaW5hbENvbnRlbnQgPSBnZXREb2N1bWVudCgpICE9IG51bGwgPyBnZXREb2N1bWVudCgpLmdldCgpIDogbnVsbDsKLQkJCWZPcmlnaW5hbExpbmVEZWxpbWl0ZXJzID0gZ2V0RG9jdW1lbnQoKSAhPSBudWxsID8gZ2V0RG9jdW1lbnQoKS5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCkgOiBudWxsOwotCQl9Ci0KLQkJaWYgKERFQlVHICYmIGZEb2N1bWVudCAhPSBudWxsICYmICEoZkRvY3VtZW50IGluc3RhbmNlb2YgSUxvY2thYmxlKSkgewotCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6IG5vbiBJTG9ja2FibGUgZG9jdW1lbnQgdXNlZCBpbiBTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICAgZG9jdW1lbnQgdXBkYXRlcyBvbiBub24tZGlzcGxheSB0aHJlYWQgd2lsbCBub3QgYmUgc2FmZSBpZiBlZGl0b3Igb3BlbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGZEb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudCkgZkRvY3VtZW50KS5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihpbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0Q29udGVudCNhZGRUZXh0Q2hhbmdlTGlzdGVuZXIob3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFRleHRDaGFuZ2VMaXN0ZW5lcihUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQkvLyBtYWtlIHN1cmUgbGlzdGVuZXIgaXMgbm90IGFscmVhZHkgaW4gbGlzdGVuaW5nCi0JCS8vIChhbmQgaWYgaXQgaXMsIHByaW50IGEgd2FybmluZyB0byBhaWQgZGVidWdnaW5nLAotCQkvLyBpZiBuZWVkZWQpCi0KLQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmVGV4dENoYW5nZUxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyOjphZGRUZXh0Q2hhbmdlZExpc3RlbmVycy4gbGlzdGVuZXIgIiArIGxpc3RlbmVyICsgIiB3YXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UuICIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyOjphZGRUZXh0Q2hhbmdlZExpc3RlbmVycy4gQWRkaW5nIGFuIGluc3RhbmNlIG9mICIgKyBsaXN0ZW5lci5nZXRDbGFzcygpICsgIiBhcyBhIGxpc3RlbmVyIG9uIHRleHQgYWRhcHRlci4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBvbGRTaXplID0gMDsKLQkJCWlmIChmVGV4dENoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJLy8gbm9ybWFsbHkgd29uJ3QgYmUgbnVsbCwgYnV0IHdlIG5lZWQgdG8gYmUKLQkJCQkvLyBzdXJlLCBmb3IgZmlyc3QgdGltZSB0aHJvdWdoCi0JCQkJb2xkU2l6ZSA9IGZUZXh0Q2hhbmdlTGlzdGVuZXJzLmxlbmd0aDsKLQkJCX0KLQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSArIDE7Ci0JCQlUZXh0Q2hhbmdlTGlzdGVuZXJbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgVGV4dENoYW5nZUxpc3RlbmVyW25ld1NpemVdOwotCQkJaWYgKGZUZXh0Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZUZXh0Q2hhbmdlTGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQkJfQotCQkJLy8gYWRkIGxpc3RlbmVyIHRvIGxhc3QgcG9zaXRpb24KLQkJCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJCS8vCi0JCQkvLyBub3cgc3dpdGNoIG5ldyBmb3Igb2xkCi0JCQlmVGV4dENoYW5nZUxpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCS8vCi0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0Q29udGVudCNnZXRDaGFyQ291bnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hhckNvdW50KCkgewotCi0JCS8vIGdldERvY3VtZW50IGNhbiBzb21ldGltZXMgYmUgbnVsbCBkdXJpbmcgc3RhcnR1cAotCQkvLyBhbmQgZGlzcG9zZQotCQlpbnQgcmVzdWx0ID0gMDsKLQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KCk7Ci0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZ2V0U2FmZURvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElEb2N1bWVudCBnZXRDbG9uZWREb2N1bWVudCgpIHsKLQkJaWYgKGZEb2N1bWVudENsb25lID09IG51bGwpIHsKLQkJCVN0cmluZyBjb250ZW50ID0gZk9yaWdpbmFsQ29udGVudCA9PSBudWxsID8gIiIgOiBmT3JpZ2luYWxDb250ZW50OyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBkZWxpbXMgPSBmT3JpZ2luYWxMaW5lRGVsaW1pdGVycyA9PSBudWxsID8gRGVmYXVsdExpbmVUcmFja2VyLkRFTElNSVRFUlMgOiBmT3JpZ2luYWxMaW5lRGVsaW1pdGVyczsKLQkJCWZEb2N1bWVudENsb25lID0gbmV3IERvY3VtZW50Q2xvbmUoY29udGVudCwgZGVsaW1zKTsKLQkJfQotCQlyZXR1cm4gZkRvY3VtZW50Q2xvbmU7Ci0JfQotCi0JRGlzcGxheSBnZXREaXNwbGF5KCkgewotCi0JCS8vIE5vdGU6IHRoZSB3b3JrYmVuY2ggc2hvdWxkIGFsd2F5cyBoYXZlIGEgZGlzcGxheQotCQkvLyAodW5sZXNzIHJ1bm5pbmcgaGVhZGxlc3MpLCB3aGVyZWFzIERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCS8vIG9ubHkgcmV0dXJucyB0aGUgZGlzcGxheSBpZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyB0aHJlYWQKLQkJLy8gaGFzIG9uZS4KLQkJaWYgKFBsYXRmb3JtVUkuaXNXb3JrYmVuY2hSdW5uaW5nKCkpCi0JCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZpc2libGUgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiBJRG9jdW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCi0JCWlmIChmQ2hpbGREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZEb2N1bWVudDsKLQkJcmV0dXJuIGZDaGlsZERvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgcmVnaW9uIGluIG1hc3RlciBkb2N1bWVudCBvZiBnaXZlbiByZWdpb24gKHNob3VsZCBiZSByZWdpb24gaW4KLQkgKiBwcm9qZWN0aW9uIGRvY3VtZW50KQotCSAqIAotCSAqIEByZXR1cm4gcmVnaW9uIGlmIG5vIHByb2plY3Rpb24gZG9jdW1lbnQgZXhpc3RzLCByZWdpb24gb2YgbWFzdGVyCi0JICogICAgICAgICBkb2N1bWVudCBpZiBwb3NzaWJsZSwgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIElSZWdpb24gZ2V0UHJvamVjdGlvblRvTWFzdGVyUmVnaW9uKElSZWdpb24gcmVnaW9uKSB7Ci0JCUlSZWdpb24gb3JpZ2luYWxSZWdpb24gPSByZWdpb247Ci0JCWlmIChmQ2hpbGREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW9yaWdpbmFsUmVnaW9uID0gZkNoaWxkRG9jdW1lbnQuZ2V0UHJvamVjdGlvbk1hcHBpbmcoKS50b09yaWdpblJlZ2lvbihyZWdpb24pOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9yaWdpbmFsUmVnaW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgb2Zmc2V0IGluIHByb2plY3Rpb24gZG9jdW1lbnQgb2YgZ2l2ZW4gb2Zmc2V0IChzaG91bGQgYmUgb2Zmc2V0Ci0JICogaW4gbWFzdGVyIGRvY3VtZW50KQotCSAqIAotCSAqIEByZXR1cm4gb2Zmc2V0IGlmIG5vIHByb2plY3Rpb24gZG9jdW1lbnQgZXhpc3RzLCBvZmZzZXQgb2YgcHJvamVjdGlvbgotCSAqICAgICAgICAgZG9jdW1lbnQgaWYgcG9zc2libGUsIC0xIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgaW50IGdldE1hc3RlclRvUHJvamVjdGlvbk9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCWludCBvcmlnaW5hbE9mZnNldCA9IG9mZnNldDsKLQkJaWYgKGZDaGlsZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJb3JpZ2luYWxPZmZzZXQgPSBmQ2hpbGREb2N1bWVudC5nZXRQcm9qZWN0aW9uTWFwcGluZygpLnRvSW1hZ2VPZmZzZXQob2Zmc2V0KTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBvcmlnaW5hbE9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpbmUgYXQgdGhlIGdpdmVuIGNoYXJhY3RlciBvZmZzZXQgd2l0aG91dCBkZWxpbWl0ZXJzLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIG9mZnNldCBvZiB0aGUgbGluZSB0byByZXR1cm4uIERvZXMgbm90IGluY2x1ZGUgZGVsaW1pdGVycyBvZgotCSAqICAgICAgICAgICAgcHJlY2VlZGluZyBsaW5lcy4gT2Zmc2V0IDAgaXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUKLQkgKiAgICAgICAgICAgIGRvY3VtZW50LgotCSAqIEByZXR1cm4gdGhlIGxpbmUgdGV4dCB3aXRob3V0IGRlbGltaXRlcnMKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRMaW5lKGludCBsaW5lTnVtYmVyKSB7Ci0KLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChsaW5lTnVtYmVyID49IGdldExpbmVDb3VudCgpKSB7Ci0JCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJEZXZlbG9wbWVudCBEZWJ1ZzogSVN0cnVjdHVyZWREb2N1bWVudDpnZXRMaW5lKCkgZXJyb3IuIGxpbmVOdW1iZXIgcmVxdWVzdGVkICgiICsgbGluZU51bWJlciArICIpIHdhcyBncmVhdGVyIHRoYW4gbnVtYmVyIG9mIGxpbmVzKCIgKyBnZXRMaW5lQ291bnQoKSArICIpLiBFbXB0eVN0cmluZyByZXR1cm5lZCIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXJlc3VsdCA9IEVNUFRZX1NUUklORzsKLQkJfQotCQllbHNlIHsKLQkJCUlEb2N1bWVudCBkb2MgPSBnZXRTYWZlRG9jdW1lbnQoKTsKLQkJCWlmIChkb2MgPT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IEVNUFRZX1NUUklORzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRyeSB7Ci0JCQkJCUlSZWdpb24gciA9IGRvYy5nZXRMaW5lSW5mb3JtYXRpb24obGluZU51bWJlcik7Ci0JCQkJCWlmIChyLmdldExlbmd0aCgpID4gMCkgewotCQkJCQkJcmVzdWx0ID0gZG9jLmdldChyLmdldE9mZnNldCgpLCByLmdldExlbmd0aCgpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc3VsdCA9IEVNUFRZX1NUUklORzsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlyZXN1bHQgPSBFTVBUWV9TVFJJTkc7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVHJpZXMgdG8gcmVwYWlyIHRoZSBsaW5lIGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50Ci0JICogQHNlZSBJUmVwYWlyYWJsZURvY3VtZW50I3JlcGFpckxpbmVJbmZvcm1hdGlvbigpCi0JICogQHNlZSBFY2xpcHNlIDMuMAotCSAqLwotCXByaXZhdGUgdm9pZCByZXBhaXJMaW5lSW5mb3JtYXRpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElSZXBhaXJhYmxlRG9jdW1lbnQpIHsKLQkJCUlSZXBhaXJhYmxlRG9jdW1lbnQgcmVwYWlyYWJsZSA9IChJUmVwYWlyYWJsZURvY3VtZW50KSBkb2N1bWVudDsKLQkJCXJlcGFpcmFibGUucmVwYWlyTGluZUluZm9ybWF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpbmUgaW5kZXggYXQgdGhlIGdpdmVuIGNoYXJhY3RlciBvZmZzZXQuCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgb2Zmc2V0IG9mIHRoZSBsaW5lIHRvIHJldHVybi4gVGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUKLQkgKiAgICAgICAgICAgIGRvY3VtZW50IGlzIGF0IG9mZnNldCAwLiBBbiBvZmZzZXQgb2YgZ2V0TGVuZ3RoKCkgaXMgdmFsaWQKLQkgKiAgICAgICAgICAgIGFuZCBzaG91bGQgYW5zd2VyIHRoZSBudW1iZXIgb2YgbGluZXMuCi0JICogQHJldHVybiB0aGUgbGluZSBpbmRleC4gVGhlIGZpcnN0IGxpbmUgaXMgYXQgaW5kZXggMC4gSWYgdGhlIGNoYXJhY3RlcgotCSAqICAgICAgICAgYXQgb2Zmc2V0IGlzIGEgZGVsaW1pdGVyIGNoYXJhY3RlciwgYW5zd2VyIHRoZSBsaW5lIGluZGV4IG9mCi0JICogICAgICAgICB0aGUgbGluZSB0aGF0IGlzIGRlbGltaXRlZC4gRm9yIGV4YW1wbGUsIHRleHQgPSAiXHJcblxyXG4iLAotCSAqICAgICAgICAgZGVsaW1pdGVyID0gIlxyXG4iLCB0aGVuOiBnZXRMaW5lQXRPZmZzZXQoMCkgPT0gMAotCSAqICAgICAgICAgZ2V0TGluZUF0T2Zmc2V0KDEpID09IDAgZ2V0TGluZUF0T2Zmc2V0KDIpID09IDEKLQkgKiAgICAgICAgIGdldExpbmVBdE9mZnNldCgzKSA9PSAxIGdldExpbmVBdE9mZnNldCg0KSA9PSAyCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lQXRPZmZzZXQoaW50IG9mZnNldCkgewotCi0JCWludCByZXN1bHQgPSAwOwotCQlJRG9jdW1lbnQgZG9jID0gZ2V0U2FmZURvY3VtZW50KCk7Ci0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXN1bHQgPSBkb2MuZ2V0TGluZU9mT2Zmc2V0KG9mZnNldCk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCXJlcGFpckxpbmVJbmZvcm1hdGlvbihkb2MpOwotCQkJCXRyeSB7Ci0JCQkJCXJlc3VsdCA9IGRvYy5nZXRMaW5lT2ZPZmZzZXQob2Zmc2V0KTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgyKSB7Ci0JCQkJCS8vIHNob3VsZCBub3Qgb2NjdXIsIGJ1dCBzZWVtcyB0byBmb3IgcHJvamVjdGlvbgotCQkJCQkvLyBkb2N1bWVudHMsIHJlbGF0ZWQgdG8gcmVwYWludGluZyBvdmVydmlldyBydWxlcgotCQkJCQlyZXN1bHQgPSAwOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZUNvdW50KCkgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJSURvY3VtZW50IGRvYyA9IGdldFNhZmVEb2N1bWVudCgpOwotCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGRvYy5nZXROdW1iZXJPZkxpbmVzKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0Q29udGVudCNnZXRMaW5lRGVsaW1pdGVyCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGdldFBhcmVudERvY3VtZW50KCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlyZXN1bHQgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGdldFBhcmVudERvY3VtZW50KCkpLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJfQotCQllbHNlIHsKLQkJCUlEb2N1bWVudCBkb2MgPSBnZXRTYWZlRG9jdW1lbnQoKTsKLQkJCXJlc3VsdCA9IFRleHRVdGlsaXRpZXMuZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoZG9jKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2hhcmFjdGVyIG9mZnNldCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiBsaW5lLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBsaW5lSW5kZXgKLQkgKiAgICAgICAgICAgIGluZGV4IG9mIHRoZSBsaW5lLiBUaGUgZmlyc3QgbGluZSBpcyBhdCBpbmRleCAwLgotCSAqIEByZXR1cm4gb2Zmc2V0IG9mZnNldCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lLiBUaGUgZmlyc3QKLQkgKiAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgZG9jdW1lbnQgaXMgYXQgb2Zmc2V0IDAuIFRoZSByZXR1cm4gdmFsdWUKLQkgKiAgICAgICAgIHNob3VsZCBpbmNsdWRlIGxpbmUgZGVsaW1pdGVycy4gRm9yIGV4YW1wbGUsIHRleHQgPQotCSAqICAgICAgICAgIlxyXG50ZXN0XHJcbiIsIGRlbGltaXRlciA9ICJcclxuIiwgdGhlbjogZ2V0T2Zmc2V0QXRMaW5lKDApID09Ci0JICogICAgICAgICAwIGdldE9mZnNldEF0TGluZSgxKSA9PSAyIGdldE9mZnNldEF0TGluZSgyKSA9PSA4IE5PVEU6IFdoZW4KLQkgKiAgICAgICAgIHRoZXJlIGlzIG5vIHRleHQgKGkuZS4sIG5vIGxpbmVzKSwgZ2V0T2Zmc2V0QXRMaW5lKDApIGlzIGEKLQkgKiAgICAgICAgIHZhbGlkIGNhbGwgdGhhdCBzaG91bGQgcmV0dXJuIDAuCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXRBdExpbmUoaW50IGxpbmVJbmRleCkgewotCi0JCWludCByZXN1bHQgPSAwOwotCQlJRG9jdW1lbnQgZG9jID0gZ2V0U2FmZURvY3VtZW50KCk7Ci0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXN1bHQgPSBkb2MuZ2V0TGluZU9mZnNldChsaW5lSW5kZXgpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXN1bHQgPSAwOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyZW50IGRvY3VtZW50Ci0JICogCi0JICogQHJldHVybiB0aGUgcGFyZW50IGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZ2V0UGFyZW50RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgZG9jdW1lbnQgdG8gdXNlIGZvciByZXF1ZXN0IGZyb20gdGhlIFN0eWxlZFRleHQgd2lkZ2V0LiBJdHMKLQkgKiBlaXRoZXIgdGhlIGxpdmUgZG9jdW1uZXQgb3IgYSBjbG9uZSBvZiBpdCwgZGVwZW5kaW5nIG9uIHN0b3AvcmVzdW1lCi0JICogc3RhdGUuCi0JICovCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZ2V0U2FmZURvY3VtZW50KCkgewotCQlJRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpIHsKLQkJCXJlc3VsdCA9IGdldENsb25lZERvY3VtZW50KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBub3RlLCB0aGlzIGRvY3VtZW50IGNhbiBiZSBub3JtYWwgc3RydWN0dXJlZCB0ZXh0IGRvY3VtZW50LAotCQkJLy8gb3IgdGhlIHByb2plY3Rpb24vY2hpbGQgZG9jdW1lbnQKLQkJCXJlc3VsdCA9IGdldERvY3VtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dAotCSAqLwotCVN0eWxlZFRleHQgZ2V0U3R5bGVkVGV4dFdpZGdldCgpIHsKLQkJcmV0dXJuIGZTdHlsZWRUZXh0V2lkZ2V0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50IGF0IHRoZSBnaXZlbiByYW5nZS4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiAgICAgICAgICAgIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIHRleHQgdG8gcmV0dXJuLiBPZmZzZXQgMCBpcyB0aGUKLQkgKiAgICAgICAgICAgIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgZG9jdW1lbnQuCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCB0byByZXR1cm4KLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IGF0IHRoZSBnaXZlbiByYW5nZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dFJhbmdlKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlEb2N1bWVudCBkb2MgPSBnZXRTYWZlRG9jdW1lbnQoKTsKLQkJCXJlc3VsdCA9IGRvYy5nZXQoc3RhcnQsIGxlbmd0aCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdCA9IEVNUFRZX1NUUklORzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBvbmx5IGZvciAibm8gY2hhbmdlIiBldmVudHMsIGZvciBub3cKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQZW5kaW5nRXZlbnRzKCkgewotCi0JCWlmIChsYXN0RXZlbnRRdWV1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGFzdEV2ZW50UXVldWUuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTm9DaGFuZ2VFdmVudCBub0NoYW5nZUV2ZW50ID0gKE5vQ2hhbmdlRXZlbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXJlZHJhd05vQ2hhbmdlKG5vQ2hhbmdlRXZlbnQpOwotCQl9Ci0KLQkJbGFzdEV2ZW50UXVldWUgPSBudWxsOwotCQlsYXN0RXZlbnQgPSBudWxsOwotCX0KLQotCWJvb2xlYW4gaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSB7Ci0JCXJldHVybiBmU3RvcFJlbGF5aW5nQ2hhbmdlc1JlcXVlc3RzID4gMDsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIG1ldGhvZCBpcyBhc3N1bWVkIHRvIGJlIGNhbGxlZCBvbmx5IGZvciByZWFkIG9ubHkgcmVnaW9uIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVkcmF3Tm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKQotCQkJcmV0dXJuOwotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibWF5YmUgcmVkcmF3IHN0dWZmIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWludCBzdGFydE9mZnNldCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0TGVuZ3RoKCk7Ci0JCXJlZHJhd1JhbmdlV2l0aExlbmd0aChzdGFydE9mZnNldCwgbGVuZ3RoKTsKLQotCX0KLQotCS8qKgotCSAqIFJlcXVlc3QgYSByZWRyYXcgb2YgdGhlIHRleHQgcmFuZ2Ugb2NjdXBpZWQgYnkgdGhlIGdpdmVuCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWRyYXdOb2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpCi0JCQlyZXR1cm47Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJtYXliZSByZWRyYXcgc3R1ZmYiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIGp1c3QgdGhlIG5ldyBzdHVmZgotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCi0JCWludCBuTmV3Tm9kZXMgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpOwotCQlpZiAobk5ld05vZGVzID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oMCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKG5OZXdOb2RlcyAtIDEpOwotCQkJcmVkcmF3UmFuZ2UoZmlyc3ROb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGxhc3ROb2RlLmdldEVuZE9mZnNldCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlZHJhd3MgdGhlIGdpdmUgb2Zmc2V0cyBpbiB0ZXJtcyBvZiB0aGUgU3RydWN0dXJlZERvY3VtZW50LiBJZiBvbmx5Ci0JICogcGFydCBvZiB0aGUgbW9kZWwgaXMgdmlzaWJsZSwgZW5zdXJlcyB0aGF0IG9ubHkgdGhlIHZpc2libGUgcG9ydGlvbiBvZgotCSAqIHRoZSBnaXZlbiByYW5nZSBpcyByZWRyYXduLgotCSAqIAotCSAqIEBwYXJhbSBzdGFydE1vZGVsT2Zmc2V0Ci0JICogQHBhcmFtIGVuZE1vZGVsT2Zmc2V0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZHJhd1JhbmdlKGZpbmFsIGludCBzdGFydE1vZGVsT2Zmc2V0LCBmaW5hbCBpbnQgZW5kTW9kZWxPZmZzZXQpIHsKLQotCQlpZiAoZ2V0RG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVkcmF3IHN0dWZmOiAiICsgc3RhcnRNb2RlbE9mZnNldCArICItIiArIGVuZE1vZGVsT2Zmc2V0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKGZDaGlsZERvY3VtZW50ID09IG51bGwpIHsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZ2V0U3R5bGVkVGV4dFdpZGdldCgpLnJlZHJhd1JhbmdlKHN0YXJ0TW9kZWxPZmZzZXQsIGVuZE1vZGVsT2Zmc2V0IC0gc3RhcnRNb2RlbE9mZnNldCwgcmVkcmF3QmFja2dyb3VuZCk7Ci0JCQkJfQotCQkJfTsKLQkJCXJ1bk9uRGlzcGxheVRocmVhZElmTmVlZGVkZShydW5uYWJsZSk7Ci0KLQkJfQotCQllbHNlIHsKLQkJCWludCBoaWdoID0gZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQkJCWludCBzdGFydE9mZnNldCA9IGdldE1hc3RlclRvUHJvamVjdGlvbk9mZnNldChzdGFydE1vZGVsT2Zmc2V0KTsKLQotCQkJaW50IGVuZE9mZnNldCA9IGdldE1hc3RlclRvUHJvamVjdGlvbk9mZnNldChlbmRNb2RlbE9mZnNldCk7Ci0KLQkJCS8vIGlmIG9mZnNldHMgd2VyZSBub3QgdmlzaWJsZSwganVzdCB0cnkgdG8gcmVkcmF3IGV2ZXJ5dGhpbmcgaW4KLQkJCS8vIHRoZSBjaGlsZCBkb2N1bWVudAotCQkJLy8gLy8gbm90IHZpc2libGUKLQkJCS8vIGlmIChlbmRPZmZzZXQgPCAwIHx8IHN0YXJ0T2Zmc2V0ID4gaGlnaCkKLQkJCS8vIHJldHVybjsKLQkJCS8vIHJlc3RyaWN0IGxvd2VyIGJvdW5kCi0JCQlpZiAoc3RhcnRPZmZzZXQgPCAwKSB7Ci0JCQkJc3RhcnRPZmZzZXQgPSAwOwotCQkJfQotCQkJLy8gcmVzdHJpY3QgdXBwZXIgYm91bmQKLQkJCS8vIGlmIChlbmRPZmZzZXQgPiBoaWdoKSB7Ci0JCQkvLyBlbmRPZmZzZXQgPSBoaWdoOwotCQkJLy8gfQotCQkJaWYgKGVuZE9mZnNldCA8IDApIHsKLQkJCQllbmRPZmZzZXQgPSBoaWdoOwotCQkJfQotCi0JCQlpbnQgbGVuZ3RoID0gZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQ7Ci0JCQkvLyByZWRyYXdCYWNrZ3JvdW5kIHdpdGggZmFsc2Ugd291bGQgYmUgZmFzdGVyCi0JCQkvLyBidXQgYXNzdW1lcyBiYWNrZ3JvdW5kIChvciBmb250KSBpcyBub3QKLQkJCS8vIGNoYW5naW5nCi0JCQlmaW5hbCBpbnQgZmluYWxTdGFydE9mZnNldCA9IHN0YXJ0T2Zmc2V0OwotCQkJZmluYWwgaW50IGZpbmFsbGVuZ3RoID0gbGVuZ3RoOwotCi0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWdldFN0eWxlZFRleHRXaWRnZXQoKS5yZWRyYXdSYW5nZShmaW5hbFN0YXJ0T2Zmc2V0LCBmaW5hbGxlbmd0aCwgcmVkcmF3QmFja2dyb3VuZCk7Ci0JCQkJfQotCQkJfTsKLQkJCXJ1bk9uRGlzcGxheVRocmVhZElmTmVlZGVkZShydW5uYWJsZSk7Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlZHJhd3MgdGhlIGdpdmUgb2Zmc2V0cyBpbiB0ZXJtcyBvZiB0aGUgRmxhdCBOb2RlIG1vZGVsLiBJZiBvbmx5IHBhcnQKLQkgKiBvZiB0aGUgbW9kZWwgaXMgdmlzaWJsZSwgZW5zdXJlcyB0aGF0IG9ubHkgdGhlIHZpc2libGUgcG9ydGlvbiBvZiB0aGUKLQkgKiBnaXZlbiByYW5nZSBpcyByZWRyYXduLgotCSAqIAotCSAqIEBwYXJhbSBzdGFydE1vZGVsT2Zmc2V0Ci0JICogQHBhcmFtIGVuZE1vZGVsT2Zmc2V0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZHJhd1JhbmdlV2l0aExlbmd0aChmaW5hbCBpbnQgc3RhcnRNb2RlbE9mZnNldCwgZmluYWwgaW50IGxlbmd0aCkgewotCi0JCWlmIChnZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWRyYXcgc3R1ZmY6ICIgKyBzdGFydE1vZGVsT2Zmc2V0ICsgIi0iICsgbGVuZ3RoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKGZDaGlsZERvY3VtZW50ID09IG51bGwpIHsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZ2V0U3R5bGVkVGV4dFdpZGdldCgpLnJlZHJhd1JhbmdlKHN0YXJ0TW9kZWxPZmZzZXQsIGxlbmd0aCwgcmVkcmF3QmFja2dyb3VuZCk7Ci0JCQkJfQotCQkJfTsKLQkJCXJ1bk9uRGlzcGxheVRocmVhZElmTmVlZGVkZShydW5uYWJsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnQgaGlnaCA9IGdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0JCQkvLyBUT0RPIG5lZWQgdG8gdGFrZSBpbnRvIGFjY291bnQgc2VnbWVudGVkIHZpc2libGUgcmVnaW9ucwotCQkJaW50IHN0YXJ0T2Zmc2V0ID0gZ2V0TWFzdGVyVG9Qcm9qZWN0aW9uT2Zmc2V0KHN0YXJ0TW9kZWxPZmZzZXQpOwotCQkJLy8gbm90IHZpc2libGUKLQkJCWlmIChzdGFydE9mZnNldCA+IGhpZ2ggfHwgbGVuZ3RoIDwgMSkKLQkJCQlyZXR1cm47Ci0JCQkvLyByZXN0cmljdCBsb3dlciBib3VuZAotCQkJaWYgKHN0YXJ0T2Zmc2V0IDwgMCkgewotCQkJCXN0YXJ0T2Zmc2V0ID0gMDsKLQkJCX0KLQkJCWludCBlbmRPZmZzZXQgPSBzdGFydE9mZnNldCArIGxlbmd0aCAtIDE7Ci0JCQkvLyByZXN0cmljdCB1cHBlciBib3VuZAotCQkJaWYgKGVuZE9mZnNldCA+IGhpZ2gpIHsKLQkJCQllbmRPZmZzZXQgPSBoaWdoOwotCQkJfQotCi0JCQkvLyBub3RlOiBsZW5ndGggb2YgdGhlIGNoaWxkIGRvY3VtbmV0IHNob3VsZCBiZQotCQkJLy8gdXBkYXRlZCwKLQkJCS8vIG5lZWQgdG8gaW52ZXN0aWdhdGUgd2h5IGl0cyBub3QgYXQgdGhpcwotCQkJLy8gcG9pbnQsIGJ1dCBpcwotCQkJLy8gcHJvYmFibHkganVzdCBiZWNhdXNlIHRoZSBkb2N1bWVudCBldmVudAotCQkJLy8gaGFuZGxpbmcgaXMgbm90Ci0JCQkvLyBjb21wbGV0ZWx5IGZpbmlzaGVkLgotCQkJaW50IG5ld0xlbmd0aCA9IGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0OyAvLyBkMjgzMDA3Ci0KLQkJCS8vIHJlZHJhd0JhY2tncm91bmQgd2l0aCBmYWxzZSB3b3VsZCBiZSBmYXN0ZXIKLQkJCS8vIGJ1dCBhc3N1bWVzIGJhY2tncm91bmQgKG9yIGZvbnQpIGlzIG5vdAotCQkJLy8gY2hhbmdpbmcKLQkJCWZpbmFsIGludCBmaW5hbFN0YXJ0T2Zmc2V0ID0gc3RhcnRPZmZzZXQ7Ci0JCQlmaW5hbCBpbnQgZmluYWxOZXdMZW5ndGggPSBuZXdMZW5ndGg7Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWdldFN0eWxlZFRleHRXaWRnZXQoKS5yZWRyYXdSYW5nZShmaW5hbFN0YXJ0T2Zmc2V0LCBmaW5hbE5ld0xlbmd0aCwgcmVkcmF3QmFja2dyb3VuZCk7Ci0JCQkJfQotCQkJfTsKLQkJCXJ1bk9uRGlzcGxheVRocmVhZElmTmVlZGVkZShydW5uYWJsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXF1ZXN0IGEgcmVkcmF3IG9mIHRoZSB0ZXh0IHJhbmdlIG9jY3VwaWVkIGJ5IHRoZSBnaXZlbgotCSAqIFJlZ2lvbkNoYW5nZWRFdmVudCBmb3IgY2VydGFpbiAobm90IGFsbCkgSVRleHRSZWdpb24gY29udGV4dHMKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWRyYXdSZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIm1heWJlIHJlZHJhdyBzdHVmZiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCi0JCS8vIChuc2QpIFRPRE86IHRyeSB0byBtYWtlIHRoaXMgcmVsaWFibGUgc29tZWhvdwotCQkvLyB3aXRob3V0IGJlaW5nIGRpcmVjdGx5IGNvbnRlbnQgZGVwZW5kZW50Ci0JCS8vIGlmICgocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHx8Ci0JCS8vICh0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkJMT0NLX1RFWFQpIHx8Ci0JCS8vICh0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSkgewotCQkvLyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0KLQkJLy8gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCS8vIC8vIHJlZHJhdyBiYWNrZ3JvdW5kIG9mIGZhbHNlIGlzIGZhc3RlciwKLQkJLy8gLy8gYnV0IGFzc3VtZXMgYmFja2dyb3VuZCAob3IgZm9udCkgaXMgbm90Ci0JCS8vIGNoYW5naW5nCi0JCS8vIHJlZHJhd1JhbmdlKGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbiksCi0JCS8vIGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pKTsKLQkJLy8gfQotCQlpZiAoZm9yY2VSZWRyYXdPblJlZ2lvbkNoYW5nZWQpIHsKLQkJCS8vIHdvcmthcm91bmQgZm9yIHJlZHJhd2luZyBwcm9ibGVtcyBvbiBMaW51eC1HVEsKLQkJCWludCBzdGFydE9mZnNldCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9mZnNldCgpOwotCQkJaW50IGVuZE9mZnNldCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9mZnNldCgpICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0TGVuZ3RoKCk7Ci0JCQl0cnkgewotCQkJCUlSZWdpb24gc3RhcnRMaW5lID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZkRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KHN0YXJ0T2Zmc2V0KTsKLQkJCQlJUmVnaW9uIGVuZExpbmUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5mRG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoZW5kT2Zmc2V0KTsKLQkJCQlpZiAoc3RhcnRMaW5lICE9IG51bGwgJiYgZW5kTGluZSAhPSBudWxsKSB7Ci0JCQkJCXJlZHJhd1JhbmdlKHN0YXJ0TGluZS5nZXRPZmZzZXQoKSwgZW5kTGluZS5nZXRPZmZzZXQoKSArIGVuZExpbmUuZ2V0TGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbm90aGluZyBmb3Igbm93Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXF1ZXN0IGEgcmVkcmF3IG9mIHRoZSB0ZXh0IHJhbmdlIG9jY3VwaWVkIGJ5IHRoZSBnaXZlbgotCSAqIFJlZ2lvbnNSZXBsYWNlZEV2ZW50Ci0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVkcmF3UmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpCi0JCQlyZXR1cm47Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJtYXliZSByZWRyYXcgc3R1ZmYiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0TmV3UmVnaW9ucygpOwotCQlpbnQgblJlZ2lvbnMgPSBuZXdSZWdpb25zLnNpemUoKTsKLQkJaWYgKG5SZWdpb25zID4gMCkgewotCQkJSVRleHRSZWdpb24gZmlyc3RSZWdpb24gPSBuZXdSZWdpb25zLmdldCgwKTsKLQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSBuZXdSZWdpb25zLmdldChuUmVnaW9ucyAtIDEpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJcmVkcmF3UmFuZ2UoZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoZmlyc3RSZWdpb24pLCBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQobGFzdFJlZ2lvbikpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVkcmF3VGV4dENoYW5nZWQoKSB7Ci0KLQkJaWYgKGxhc3RFdmVudCAhPSBudWxsKSB7Ci0JCQkvLyB1cGRhdGUgZGlzcGxheSwgc2luY2Ugc29tZSBjYXNlcyBjYW4gZWZmZWN0Ci0JCQkvLyBoaWdobGlnaHRpbmcgYmV5b25kIHRoZSBjaGFuZ2VkIHRleHQgYXJlYS4KLQkJCWlmIChsYXN0RXZlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJCQlyZWRyYXdOb2Rlc1JlcGxhY2VkKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkgbGFzdEV2ZW50KTsKLQkJCWlmIChsYXN0RXZlbnQgaW5zdGFuY2VvZiBSZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJCQlyZWRyYXdSZWdpb25zUmVwbGFjZWQoKFJlZ2lvbnNSZXBsYWNlZEV2ZW50KSBsYXN0RXZlbnQpOwotCQkJaWYgKGxhc3RFdmVudCBpbnN0YW5jZW9mIFJlZ2lvbkNoYW5nZWRFdmVudCkKLQkJCQlyZWRyYXdSZWdpb25DaGFuZ2VkKChSZWdpb25DaGFuZ2VkRXZlbnQpIGxhc3RFdmVudCk7Ci0JCQkvLyBtb3ZlZCBmb2xsb3dpbmcgbGluZSB0byAnZG9jdW1lbnQgY2hhbmdlZCcgc28KLQkJCS8vIHRoZSAibGFzdCBldmVudCIgY2FuIGJlCi0JCQkvLyByZS1kcmF3biBhZnRlciBwZW5kaW5nIHJlLWRyYXdzCi0JCQkvLyBsYXN0RXZlbnQgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VuZHMgYSB0ZXh0IHJlcGxhY2UgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGF5VGV4dENoYW5nZWQoKSB7Ci0KLQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpIHsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCAmJiBnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5PVCByZWxheWluZyB0ZXh0IGNoYW5nZWQgKCIgKyBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50ICYmIGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWxheWluZyB0ZXh0IGNoYW5nZWQgKCIgKyBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZmluYWwgVGV4dENoYW5nZWRFdmVudCB0ZXh0Q2hhbmdlZEV2ZW50ID0gbmV3IFRleHRDaGFuZ2VkRXZlbnQodGhpcyk7Ci0KLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZQotCQkvLyB0aGUgYWRkIGFuZCByZW1vdmUgbGlzdGVuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlCi0JCS8vIGxpc3RlbmVyIGFycmF5IGZyb20gYW5vdGhlciB0aHJlYWQKLQotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoZlRleHRDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gZlRleHRDaGFuZ2VMaXN0ZW5lcnM7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJLy8gdGhpcyBpcyBhIHNhZmUgY2FzdCwgc2luY2UgYWRkTGlzdGVuZXJzCi0JCQkJCQkvLyByZXF1aXJlcyBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkJKChUZXh0Q2hhbmdlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLnRleHRDaGFuZ2VkKHRleHRDaGFuZ2VkRXZlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlydW5PbkRpc3BsYXlUaHJlYWRJZk5lZWRlZGUocnVubmFibGUpOwotCQlyZWRyYXdUZXh0Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFNlbmRzIGEgdGV4dCBjaGFuZ2UgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVsYXlUZXh0Q2hhbmdpbmcoaW50IHJlcXVlc3RlZFN0YXJ0LCBpbnQgcmVxdWVzdGVkTGVuZ3RoLCBTdHJpbmcgcmVxdWVzdGVkQ2hhbmdlKSB7Ci0KLQkJaWYgKGdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpIHsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCAmJiBnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5PVCByZWxheWluZyB0ZXh0IGNoYW5naW5nOiAiICsgcmVxdWVzdGVkU3RhcnQgKyAiOiIgKyBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50ICYmIGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWxheWluZyB0ZXh0IGNoYW5naW5nOiAiICsgcmVxdWVzdGVkU3RhcnQgKyAiOiIgKyBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJbGFzdEV2ZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZpbmFsIFRleHRDaGFuZ2luZ0V2ZW50IHRleHRDaGFuZ2luZ0V2ZW50ID0gbmV3IFRleHRDaGFuZ2luZ0V2ZW50KHRoaXMpOwotCi0JCQl0ZXh0Q2hhbmdpbmdFdmVudC5zdGFydCA9IHJlcXVlc3RlZFN0YXJ0OwotCQkJdGV4dENoYW5naW5nRXZlbnQucmVwbGFjZUNoYXJDb3VudCA9IHJlcXVlc3RlZExlbmd0aDsKLQkJCXRleHRDaGFuZ2luZ0V2ZW50Lm5ld0NoYXJDb3VudCA9IChyZXF1ZXN0ZWRDaGFuZ2UgPT0gbnVsbCA/IDAgOiByZXF1ZXN0ZWRDaGFuZ2UubGVuZ3RoKCkpOwotCQkJdGV4dENoYW5naW5nRXZlbnQucmVwbGFjZUxpbmVDb3VudCA9IGdldERvY3VtZW50KCkuZ2V0TnVtYmVyT2ZMaW5lcyhyZXF1ZXN0ZWRTdGFydCwgcmVxdWVzdGVkTGVuZ3RoKSAtIDE7Ci0JCQl0ZXh0Q2hhbmdpbmdFdmVudC5uZXdUZXh0ID0gcmVxdWVzdGVkQ2hhbmdlOwotCQkJdGV4dENoYW5naW5nRXZlbnQubmV3TGluZUNvdW50ID0gKHJlcXVlc3RlZENoYW5nZSA9PSBudWxsID8gMCA6IGdldERvY3VtZW50KCkuY29tcHV0ZU51bWJlck9mTGluZXMocmVxdWVzdGVkQ2hhbmdlKSk7Ci0KLQkJCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwKLQkJCS8vIHNpbmNlIHRoZSBhZGQgYW5kIHJlbW92ZSBsaXN0bmVyCi0JCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUKLQkJCS8vIGxpc3RlbmVyIGFycmF5IGZyb20gYW5vdGhlciB0aHJlYWQKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGZUZXh0Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJCVRleHRDaGFuZ2VMaXN0ZW5lcltdIGhvbGRMaXN0ZW5lcnMgPSBmVGV4dENoYW5nZUxpc3RlbmVyczsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCS8vIHRoaXMgaXMgYSBzYWZlIGNhc3QsIHNpbmNlCi0JCQkJCQkJLy8gYWRkTGlzdGVuZXJzIHJlcXVpcmVzIGEKLQkJCQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIKLQkJCQkJCQlob2xkTGlzdGVuZXJzW2ldLnRleHRDaGFuZ2luZyh0ZXh0Q2hhbmdpbmdFdmVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJcnVuT25EaXNwbGF5VGhyZWFkSWZOZWVkZWRlKHJ1bm5hYmxlKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbmRzIGEgdGV4dCBzZXQgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLiBXaWRnZXQgc2hvdWxkCi0JICogcmVkcmF3IGl0c2VsZiBhdXRvbWF0aWNhbGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGF5VGV4dFNldCgpIHsKLQotCQlpZiAoaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSkgewotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50ICYmIGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTk9UIHJlbGF5aW5nIHRleHQgc2V0ICgiICsgZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCAmJiBnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVsYXlpbmcgdGV4dCBzZXQgKCIgKyBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJbGFzdEV2ZW50ID0gbnVsbDsKLQkJZmluYWwgVGV4dENoYW5nZWRFdmVudCB0ZXh0Q2hhbmdlZEV2ZW50ID0gbmV3IFRleHRDaGFuZ2VkRXZlbnQodGhpcyk7Ci0KLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZQotCQkvLyB0aGUgYWRkIGFuZCByZW1vdmUgbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUKLQkJLy8gbGlzdGVuZXIgYXJyYXkgZnJvbSBhbm90aGVyIHRocmVhZAotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoZlRleHRDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlUZXh0Q2hhbmdlTGlzdGVuZXJbXSBob2xkTGlzdGVuZXJzID0gZlRleHRDaGFuZ2VMaXN0ZW5lcnM7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJaG9sZExpc3RlbmVyc1tpXS50ZXh0U2V0KHRleHRDaGFuZ2VkRXZlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlydW5PbkRpc3BsYXlUaHJlYWRJZk5lZWRlZGUocnVubmFibGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0Q29udGVudCNyZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIob3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcihmaW5hbCBUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQlpZiAoKGZUZXh0Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpICYmIChsaXN0ZW5lciAhPSBudWxsKSkgewotCQkJLy8gaWYgaXRzIG5vdCBpbiB0aGUgbGlzdGVuZXJzLCB3ZSdsbCBpZ25vcmUgdGhlCi0JCQkvLyByZXF1ZXN0Ci0JCQlpZiAoIVV0aWxpdGllcy5jb250YWlucyhmVGV4dENoYW5nZUxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXI6OnJlbW92ZVRleHRDaGFuZ2VkTGlzdGVuZXJzLiBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHdhcyBub3QgcHJlc2VudC4gIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlcjo6YWRkVGV4dENoYW5nZWRMaXN0ZW5lcnMuIFJlbW92aW5nIGFuIGluc3RhbmNlIG9mICIgKyBsaXN0ZW5lci5nZXRDbGFzcygpICsgIiBhcyBhIGxpc3RlbmVyIG9uIHRleHQgYWRhcHRlci4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZmluYWwgaW50IG9sZFNpemUgPSBmVGV4dENoYW5nZUxpc3RlbmVycy5sZW5ndGg7Ci0JCQkJaW50IG5ld1NpemUgPSBvbGRTaXplIC0gMTsKLQkJCQlmaW5hbCBUZXh0Q2hhbmdlTGlzdGVuZXJbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgVGV4dENoYW5nZUxpc3RlbmVyW25ld1NpemVdOwotCi0JCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQkJCWlmIChmVGV4dENoYW5nZUxpc3RlbmVyc1tpXSAhPSBsaXN0ZW5lcikgewotCQkJCQkJCQkvLyBjb3B5IG9sZCB0byBuZXcgaWYgaXRzIG5vdCB0aGUKLQkJCQkJCQkJLy8gb25lIHdlIGFyZSByZW1vdmluZwotCQkJCQkJCQluZXdMaXN0ZW5lcnNbaW5kZXgrK10gPSBmVGV4dENoYW5nZUxpc3RlbmVyc1tpXTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXJ1bk9uRGlzcGxheVRocmVhZElmTmVlZGVkZShydW5uYWJsZSk7Ci0JCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3MKLQkJCQkvLyBzd2l0Y2ggaXQgZm9yIHRoZSBvbGQgb25lCi0JCQkJZlRleHRDaGFuZ2VMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSB0ZXh0IHdpdGggIm5ld1RleHQiIHN0YXJ0aW5nIGF0IHBvc2l0aW9uICJzdGFydCIgZm9yIGEKLQkgKiBsZW5ndGggb2YgInJlcGxhY2VMZW5ndGgiLgotCSAqIDxwPgotCSAqIEltcGxlbWVudG9ycyBoYXZlIHRvIG5vdGlmeSBUZXh0Q2hhbmdlZCBsaXN0ZW5lcnMgYWZ0ZXIgdGhlIGNvbnRlbnQgaGFzCi0JICogYmVlbiB1cGRhdGVkLiBUaGUgVGV4dENoYW5nZWRFdmVudCBzaG91bGQgYmUgc2V0IGFzIGZvbGxvd3M6Ci0JICogPHVsPgotCSAqIDxsaT5ldmVudC50eXBlID0gU1dULlRleHRSZXBsYWNlZAotCSAqIDxsaT5ldmVudC5zdGFydCA9IHN0YXJ0IG9mIHRoZSByZXBsYWNlZCB0ZXh0Ci0JICogPGxpPmV2ZW50Lm51bVJlcGxhY2VkTGluZXMgPSBudW1iZXIgb2YgcmVwbGFjZWQgbGluZXMKLQkgKiA8bGk+ZXZlbnQubnVtTmV3TGluZXMgPSBudW1iZXIgb2YgbmV3IGxpbmVzCi0JICogPGxpPmV2ZW50LnJlcGxhY2VkTGVuZ3RoID0gbGVuZ3RoIG9mIHRoZSByZXBsYWNlZCB0ZXh0Ci0JICogPGxpPmV2ZW50Lm5ld0xlbmd0aCA9IGxlbmd0aCBvZiB0aGUgbmV3IHRleHQKLQkgKiA8L3VsPgotCSAqIDxiPk5PVEU6IDwvYj4gbnVtTmV3TGluZXMgaXMgdGhlIG51bWJlciBvZiBpbnNlcnRlZCBsaW5lcyBhbmQKLQkgKiBudW1SZXBsYWNlZExpbmVzIGlzIHRoZSBudW1iZXIgb2YgZGVsZXRlZCBsaW5lcyBiYXNlZCBvbiB0aGUgY2hhbmdlCi0JICogdGhhdCBvY2N1cnMgdmlzdWFsbHkuIEZvciBleGFtcGxlOgotCSAqIDx1bD4KLQkgKiA8bGk+KHJlcGxhY2VkVGV4dCwgbmV3VGV4dCkgPT0+IChudW1SZXBsYWNlZExpbmVzLCBudW1OZXdMaW5lcykKLQkgKiA8bGk+KCIiLCAiXG4iKSA9PT4gKDAsIDEpCi0JICogPGxpPigiXG5cbiIsICJhIikgPT0+ICgyLCAwKQotCSAqIDxsaT4oImEiLCAiXG5cbiIpID09PiAoMCwgMikKLQkgKiA8bGk+KCJcbiIsICIiKSA9PT4gKDEsIDApCi0JICogPC91bD4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICBzdGFydCBvZmZzZXQgb2YgdGV4dCB0byByZXBsYWNlLCBub25lIG9mIHRoZSBvZmZzZXRzIGluY2x1ZGUKLQkgKiAgICAgICAgICAgIGRlbGltaXRlcnMgb2YgcHJlY2VlZGluZyBsaW5lcywgb2Zmc2V0IDAgaXMgdGhlIGZpcnN0Ci0JICogICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIGRvY3VtZW50Ci0JICogQHBhcmFtIHJlcGxhY2VMZW5ndGgKLQkgKiAgICAgICAgICAgIHN0YXJ0IG9mZnNldCBvZiB0ZXh0IHRvIHJlcGxhY2UKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqICAgICAgICAgICAgc3RhcnQgb2Zmc2V0IG9mIHRleHQgdG8gcmVwbGFjZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VUZXh0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgcmVwbGFjZUxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQotCQlpZiAoZ2V0UGFyZW50RG9jdW1lbnQoKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCS8vIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQgaW5pdGlhdGVzIHRoZSAiY2hhbmdpbmciCi0JCQkvLyBhbmQgImNoYW5nZWQiIGV2ZW50cy4KLQkJCS8vIHRoZXkgYXJlIGJvdGggZmlyZWQgYnkgdGhlIHRpbWUgdGhpcyBtZXRob2QKLQkJCS8vIHJldHVybnMuCi0JCQlJUmVnaW9uIHJlZ2lvbiA9IGdldFByb2plY3Rpb25Ub01hc3RlclJlZ2lvbihuZXcgUmVnaW9uKHN0YXJ0LCByZXBsYWNlTGVuZ3RoKSk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGdldFBhcmVudERvY3VtZW50KCkpLnJlcGxhY2VUZXh0KHRoaXMsIHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpLCB0ZXh0KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJLy8gZGVmYXVsdCBpcyB0byBqdXN0IHRyeSBhbmQgcmVwbGFjZSB0ZXh0IHJhbmdlIGluIGN1cnJlbnQgZG9jdW1lbnQKLQkJdHJ5IHsKLQkJCWdldERvY3VtZW50KCkucmVwbGFjZShzdGFydCwgcmVwbGFjZUxlbmd0aCwgdGV4dCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50QWRhcHRlckV4dGVuc2lvbiNyZXN1bWVGb3J3YXJkaW5nRG9jdW1lbnRDaGFuZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN1bWVGb3J3YXJkaW5nRG9jdW1lbnRDaGFuZ2VzKCkgewotCi0JCS8vIGZyb20gcmUtcmVhZGluZyB0aGUgdGV4dFNldCBBUEkgaW4gU3R5bGVkVGV4dCwgd2UKLQkJLy8gbXVzdCBjYWxsCi0JCS8vIHRleHRTZXQgaWYgYWxsIHRoZSBjb250ZW50cyBjaGFuZ2VkLiBJZiBhbGwgdGhlCi0JCS8vIGNvbnRlbnRzIGRpZAotCQkvLyBub3QgY2hhbmdlLCB3ZSBuZWVkIHRvIGNhbGwgdGhlIHBhaXIgb2YgQVBJcywKLQkJLy8gdGV4dENoYW5naW5nIGFuZAotCQkvLyB0ZXh0Q2hhbmdlZC4gU28sIGlmIHdlIGV2ZXIga2VlcCBjYXJlZnVsIHRyYWNrIG9mCi0JCS8vIGNoYW5nZXMKLQkJLy8gZHVyaW5nIHN0b3AgZm9yd2FyZGluZyBhbmQgcmVzdW1lIGZvcndhcmRpbmcsIHdlCi0JCS8vIGNhbgotCQkvLyBpbnZlc3RpZ2F0ZSBjaGFuZ2UgbWFrZSB1c2Ugb2YgdGhlIHBhaXIgb2YgQVBJcy4KLQkJZlN0b3BSZWxheWluZ0NoYW5nZXNSZXF1ZXN0cy0tOwotCQlpZiAoZlN0b3BSZWxheWluZ0NoYW5nZXNSZXF1ZXN0cyA9PSAwKSB7Ci0JCQkvLyBmSXNGb3J3YXJkaW5nPSB0cnVlOwotCQkJZkRvY3VtZW50Q2xvbmUgPSBudWxsOwotCQkJZk9yaWdpbmFsQ29udGVudCA9IG51bGw7Ci0JCQlmT3JpZ2luYWxMaW5lRGVsaW1pdGVycyA9IG51bGw7Ci0JCQkvLyBmaXJlVGV4dFNldCgpOwotCQkJcmVsYXlUZXh0U2V0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzICdSdW5uYWJsZScgc2hvdWxkIGJlIHZlcnkgYnJpZWYsIGFuZCBzaG91bGQgbm90ICJjYWxsIG91dCIgdG8KLQkgKiBvdGhlciBjb2RlIHdoaWNoIGl0c2VsZiBtaWdodCBjYWxsIHN5bmNFeGVjLCBvciBkZWFkbG9jayBtaWdodCBvY2N1ci4KLQkgKiAKLQkgKiBAcGFyYW0gcgotCSAqLwotCXByaXZhdGUgdm9pZCBydW5PbkRpc3BsYXlUaHJlYWRJZk5lZWRlZGUoUnVubmFibGUgcikgewotCQkvLyBpZiB0aGVyZSBpcyBubyBEaXNwbGF5IGF0IGFsbCAodGhhdCBpcywgcnVubmluZyBoZWFkbGVzcyksCi0JCS8vIG9yIGlmIHdlIGFyZSBhbHJlYWR5IHJ1bm5pbmcgb24gdGhlIGRpc3BsYXkgdGhyZWFkLCB0aGVuCi0JCS8vIHNpbXBseSBleGVjdXRlIHRoZSBydW5uYWJsZS4KLQkJaWYgKGdldERpc3BsYXkoKSA9PSBudWxsIHx8IChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IGdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSkpIHsKLQkJCXIucnVuKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBvdGhlcndpc2UgZm9yY2UgdGhlIHJ1bm5hYmxlIHRvIHJ1biBvbiB0aGUgZGlzcGxheSB0aHJlYWQuCi0JCQkvLwotCQkJLy8gSXRzIHVuY2xlYXIgaWYgd2UgbmVlZCB0aGlzIGF0IGFsbCwgb25jZQotCQkJLy8gd2UgImZvcmNlIiBkb2N1bWVudCB1cGRhdGUgdG8gYWx3YXlzIHRha2UgcGxhY2Ugb24gZGlzcGxheQotCQkJLy8gdGhyZWFkLgotCQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jIGluc3RhbmNlb2YgSUxvY2thYmxlKSB7Ci0KLQkJCQlJTG9jayBsb2NrID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlsb2NrID0gKChJTG9ja2FibGUpIGRvYykuZ2V0TG9ja09iamVjdCgpOwotCQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQkJZ2V0RGlzcGxheSgpLnN5bmNFeGVjKHIpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKGxvY2sgIT0gbnVsbCkgewotCQkJCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBlbHNlLCBpZ25vcmUhLCBzaW5jZSByaXNrIG9mIGRlYWRsb2NrCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm9uIGxvY2thYmxlIGRvY3VtZW50IHVzZWQgZm9yIHN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld01vZGVsCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0KLQkJaWYgKGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJZ2V0RG9jdW1lbnQoKS5yZW1vdmVQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXIoaW50ZXJuYWxEb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCQlsYXN0RXZlbnQgPSBudWxsOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBQcm9qZWN0aW9uRG9jdW1lbnQpIHsKLQkJCWZDaGlsZERvY3VtZW50ID0gKFByb2plY3Rpb25Eb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCQlfc2V0RG9jdW1lbnQoZkNoaWxkRG9jdW1lbnQuZ2V0TWFzdGVyRG9jdW1lbnQoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmQ2hpbGREb2N1bWVudCA9IG51bGw7Ci0JCQlfc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQl9Ci0JCWlmIChnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCWdldERvY3VtZW50KCkuYWRkUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyKGludGVybmFsRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNzZXRUZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgc3RyaW5nKSB7Ci0KLQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpIHsKLQkJCWZEb2N1bWVudENsb25lID0gbnVsbDsKLQkJCWZPcmlnaW5hbENvbnRlbnQgPSBnZXREb2N1bWVudCgpLmdldCgpOwotCQkJZk9yaWdpbmFsTGluZURlbGltaXRlcnMgPSBnZXREb2N1bWVudCgpLmdldExlZ2FsTGluZURlbGltaXRlcnMoKTsKLQkJfQotCQllbHNlIGlmIChnZXRQYXJlbnREb2N1bWVudCgpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBnZXREb2N1bWVudCgpKS5zZXRUZXh0KHRoaXMsIHN0cmluZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZXREb2N1bWVudCgpLnNldChzdHJpbmcpOwotCQl9Ci0JCXJlbGF5VGV4dFNldCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdhcyBhZGRlZCB0byBtYWtlIHRlc3RpbmcgZWFzaWVyLiBOb3JtYWxseSwgdGhlIHdpZGdldCBpcwotCSAqIHNwZWNpZmllZCBvbiB0aGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2lkZ2V0KFN0eWxlZFRleHQgd2lkZ2V0KSB7Ci0KLQkJZlN0eWxlZFRleHRXaWRnZXQgPSB3aWRnZXQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEFkYXB0ZXJFeHRlbnNpb24jc3RvcEZvcndhcmRpbmdEb2N1bWVudENoYW5nZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BGb3J3YXJkaW5nRG9jdW1lbnRDaGFuZ2VzKCkgewotCi0JCWZTdG9wUmVsYXlpbmdDaGFuZ2VzUmVxdWVzdHMrKzsKLQkJLy8gb25seSBuZWVkIHRvIHRha2Ugc25hcHNob3Qgb24gZmlyc3QgcmVxdWVzdAotCQlpZiAoZlN0b3BSZWxheWluZ0NoYW5nZXNSZXF1ZXN0cyA9PSAxKSB7Ci0JCQlmRG9jdW1lbnRDbG9uZSA9IG51bGw7Ci0JCQlmT3JpZ2luYWxDb250ZW50ID0gZ2V0RG9jdW1lbnQoKS5nZXQoKTsKLQkJCWZPcmlnaW5hbExpbmVEZWxpbWl0ZXJzID0gZ2V0RG9jdW1lbnQoKS5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZExpbmVDaGFuZ2VIb3Zlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRMaW5lQ2hhbmdlSG92ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlkNWQyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZExpbmVDaGFuZ2VIb3Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuTGluZUNoYW5nZUhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEVzY2FwZXMgZGlmZiBob3ZlciBwcmVzZW50YXRpb24gdGV4dCAoY29udmVydHMgPCB0byAmbHQ7ID4gdG8gJmd0OyBldGMuLi4pCi0gKiBzbyB0aGF0IGh0bWwgaW4gdGhlIGRpZmYgZmlsZSAoZGlzcGxheWVkIGluIGhvdmVyKSBpc24ndCBwcmVzZW50ZWQgYXMgc3R5bGUKLSAqIChib2xkLCBpdGFsaWMsIGNvbG9ycywgZXRjLi4uKQotICogCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZExpbmVDaGFuZ2VIb3ZlciBleHRlbmRzIExpbmVDaGFuZ2VIb3ZlciB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbkhvdmVyRXh0ZW5zaW9uI2dldEhvdmVyQ29udHJvbENyZWF0b3IoKQotCSAqLwotCXB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciBnZXRIb3ZlckNvbnRyb2xDcmVhdG9yKCkgewotCQkvLyB1c2UgdGhlIGRlZmF1bHQgaW5mb3JtYXRpb24gY29udHJvbCBjcmVhdG9yIHRoYXQganVzdCBkaXNwbGF5cyB0ZXh0Ci0JCS8vIGFzIHRleHQsIG5vdCBodG1sIGNvbnRlbnQKLQkJLy8gYmVjYXVzZSB0aGVyZSBpcyBubyBzcGVjaWFsIGh0bWwgdGhhdCBzaG91bGQgYmUgcHJlc2VudGVkIHdoZW4ganVzdAotCQkvLyBzaG93aW5nIGRpZmYKLQkJLy8gaW4gdGhlIGZ1dHVyZSwgc291cmNldmlld2VyIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhpcyBwbGFpbgotCQkvLyB0ZXh0IGNvbnRyb2wgbGlrZSBqYXZhIHVzZXMKLQkJLy8gU291cmNlVmlld2VySW5mb3JtYXRpb25Db250cm9sCi0JCXJldHVybiBuZXcgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoKSB7Ci0JCQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbCBjcmVhdGVJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50KSB7Ci0JCQkJcmV0dXJuIG5ldyBEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKHBhcmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQyNjk3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvblByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuVGVtcG9yYXJ5QW5ub3RhdGlvbjsKLQotCi0vKioKLSAqIFRoaXMgaXMgb3ZlcnJpZGRlbiB0byBnZXQgYXJvdW5kIHRoZSBwcm9ibGVtIG9mIGJlaW5nIHJlZ2lzdGVyZWQgYXMgYQotICogb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uY29yZS5wcm9ibGVtbWFya2VyIHJhdGhlciB0aGFuIGEKLSAqIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2UucHJvYmxlbW1hcmtlciBjYXVzaW5nIGFsbCBwcm9ibGVtcyB0byBiZSBza2lwcGVkCi0gKiBpbiB0aGUgT3ZlcnZpZXdSdWxlcgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24gZXh0ZW5kcyBNYXJrZXJBbm5vdGF0aW9uIGltcGxlbWVudHMgSUFubm90YXRpb25QcmVzZW50YXRpb24gewotCS8vIGNvbnRyb2xzIGlmIGljb24gc2hvdWxkIGJlIHBhaW50ZWQgZ3JheQotCXByaXZhdGUgYm9vbGVhbiBmSXNHcmF5ZWQgPSBmYWxzZTsKLQlTdHJpbmcgZkFubm90YXRpb25UeXBlID0gbnVsbDsKLQotCVN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uKElNYXJrZXIgbWFya2VyKSB7Ci0JCXN1cGVyKG1hcmtlcik7Ci0JfQotCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRBbm5vdGF0aW9uVHlwZSgpIHsKLQkJaWYgKGZBbm5vdGF0aW9uVHlwZT09bnVsbCl7Ci0JCQlpbml0QW5ub3RhdGlvblR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZkFubm90YXRpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIEV2ZW50dWFsbHkgd2lsbCBoYXZlIHRvIHVzZSBJQW5ub3RhdGlvblByZXNlbnRhdGlvbiAmCi0JICogSUFubm90YXRpb25FeHRlbnNpb24KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyQW5ub3RhdGlvbiNnZXRJbWFnZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5KQotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZShEaXNwbGF5IGRpc3BsYXkpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlTdHJpbmcgYW5ub3RhdGlvblR5cGUgPSBnZXRBbm5vdGF0aW9uVHlwZSgpOwotCQlpZiAoYW5ub3RhdGlvblR5cGUgPT0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9FUlJPUikgewotCQkJaW1hZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uVHlwZSA9PSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX1dBUk5JTkcpIHsKLQkJCWltYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1dBUk5fVFNLKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uVHlwZSA9PSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX0lORk8pIHsKLQkJCWltYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0lORk9fVFNLKTsKLQkJfQotCi0JCWlmIChpbWFnZSAhPSBudWxsICYmIGlzR3JheWVkKCkpCi0JCQlzZXRJbWFnZShnZXRHcmF5SW1hZ2UoZGlzcGxheSwgaW1hZ2UpKTsKLQkJZWxzZQotCQkJc2V0SW1hZ2UoaW1hZ2UpOwotCi0JCXJldHVybiBzdXBlci5nZXRJbWFnZShkaXNwbGF5KTsKLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldEdyYXlJbWFnZShEaXNwbGF5IGRpc3BsYXksIEltYWdlIGltYWdlKSB7Ci0JCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcga2V5ID0gSW50ZWdlci50b1N0cmluZyhpbWFnZS5oYXNoQ29kZSgpKTsKLQkJCS8vIG1ha2Ugc3VyZSB3ZSBjYWNoZSB0aGUgZ3JheSBpbWFnZQotCQkJSW1hZ2UgZ3JheUltYWdlID0gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChrZXkpOwotCQkJaWYgKGdyYXlJbWFnZSA9PSBudWxsKSB7Ci0JCQkJZ3JheUltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlLCBTV1QuSU1BR0VfR1JBWSk7Ci0JCQkJSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChrZXksIGdyYXlJbWFnZSk7Ci0JCQl9Ci0JCQlpbWFnZSA9IGdyYXlJbWFnZTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNHcmF5ZWQoKSB7Ci0JCXJldHVybiBmSXNHcmF5ZWQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0R3JheWVkKGJvb2xlYW4gZ3JheWVkKSB7Ci0JCWZJc0dyYXllZCA9IGdyYXllZDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgYW5ub3RhdGlvbidzIGljb24gcmVwcmVzZW50YXRpb24gYW5kIGl0cyBkcmF3aW5nIGxheWVyCi0JICogYmFzZWQgdXBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgdW5kZXJseWluZyBtYXJrZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEFubm90YXRpb25UeXBlKCkgewotCi0JCUlNYXJrZXIgbWFya2VyID0gZ2V0TWFya2VyKCk7Ci0JCWZBbm5vdGF0aW9uVHlwZSA9IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfVU5LTk9XTjsKLQkJdHJ5IHsKLQkJCWlmIChtYXJrZXIuaXNTdWJ0eXBlT2YoSU1hcmtlci5QUk9CTEVNKSkgewotCQkJCWludCBzZXZlcml0eSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgLTEpOwotCQkJCXN3aXRjaCAoc2V2ZXJpdHkpIHsKLQkJCQkJY2FzZSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SIDoKLQkJCQkJCWZBbm5vdGF0aW9uVHlwZSA9IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfRVJST1I7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcgOgotCQkJCQkJZkFubm90YXRpb25UeXBlID0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9XQVJOSU5HOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSU1hcmtlci5TRVZFUklUWV9JTkZPIDoKLQkJCQkJCWZBbm5vdGF0aW9uVHlwZSA9IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfSU5GTzsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZDZiYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5SZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludC5JQnJlYWtwb2ludENvbnN0YW50czsKLQotCi0vKioKLSAqIFNvdXJjZSBlZGl0b3IgcmVzb3VyY2UgbWFya2VyIGFubm90YXRpb24gbW9kZWwgaW1wbGVtZW50YXRpb24KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbCBleHRlbmRzIFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsIHsKLQkvKioKLQkgKiBMb2FkaW5nIG9mIG1hcmtlcnMgd2hlbiB3b3JraW5nIHdpdGggbm9uLUlSZXNvdXJjZXMgaXMgYWNjb21wbGlzaGVkIGJ5Ci0JICogYWRkaW5nIHRoZSBtYXJrZXJzIHRvIHRoZSB3b3Jrc3BhY2Ugcm9vdCB3aXRoIGFuIGFkZGl0aW9uYWwga2V5LCB3aG9zZQotCSAqIHZhbHVlIHVzZXMgJy8nIGZvciBzZWdtZW50IHNlcGFyYXRvcnMgd2hlbiByZXByZXNlbnRpbmcgcGF0aHMsCi0JICogZGV0ZXJtaW5pbmcgd2hldGhlciB0aGV5J3JlIGFkZGVkIGludG8gdGhlIGFubm90YXRpb24gbW9kZWwuCi0JICogCi0JICogU2V0dGVycyBvZiB0aGlzIGF0dHJpYnV0ZSBzaG91bGQgdXNlICcvJ2ZvciBzZWdtZW50IHNlcGFyYXRvcnMgd2hlbgotCSAqIHJlcHJlc2VudGluZyBwYXRocy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTRUNPTkRBUllfSURfS0VZID0gSUJyZWFrcG9pbnRDb25zdGFudHMuUkVTT1VSQ0VfUEFUSDsKLQkKLQlwcm90ZWN0ZWQgSVJlc291cmNlIGZNYXJrZXJSZXNvdXJjZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZTZWNvbmRhcnlNYXJrZXJBdHRyaWJ1dGVWYWx1ZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3VwZXIocmVzb3VyY2UpOwotCQlmTWFya2VyUmVzb3VyY2UgPSByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIHNlY29uZGFyeUlEKSB7Ci0JCXN1cGVyKHJlc291cmNlKTsKLQkJZk1hcmtlclJlc291cmNlID0gcmVzb3VyY2U7Ci0JCWZTZWNvbmRhcnlNYXJrZXJBdHRyaWJ1dGVWYWx1ZSA9IHNlY29uZGFyeUlEOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbCNjcmVhdGVNYXJrZXJBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIpCi0JICovCi0JcHJvdGVjdGVkIE1hcmtlckFubm90YXRpb24gY3JlYXRlTWFya2VyQW5ub3RhdGlvbihJTWFya2VyIG1hcmtlcikgewotCQkvKgotCQkgKiBXZSBuZWVkIHRvIGRvIHNvbWUgc3BlY2lhbCBwcm9jZXNzaW5nIGlmIG1hcmtlciBpcyBhIHZhbGlkYXRpb24KLQkJICogKGFrYSBwcm9ibGVtKSBtYXJrZXIgb3IgaWYgbWFya2VyIGlzIGEgYnJlYWtwb2ludCBtYXJrZXIgc28gY3JlYXRlCi0JCSAqIGEgc3BlY2lhbCBtYXJrZXIgYW5ub3RhdGlvbiBmb3IgdGhvc2UgbWFya2Vycy4gT3RoZXJ3aXNlLCB1c2UKLQkJICogZGVmYXVsdC4KLQkJICovCi0JCWlmIChNYXJrZXJVdGlsaXRpZXMuaXNNYXJrZXJUeXBlKG1hcmtlciwgSU1hcmtlci5QUk9CTEVNKSkgewotCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkTWFya2VyQW5ub3RhdGlvbihtYXJrZXIpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVNYXJrZXJBbm5vdGF0aW9uKG1hcmtlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsI2dldE1hcmtlclBvc2l0aW9uKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIpCi0JICovCi0JcHVibGljIFBvc2l0aW9uIGdldE1hcmtlclBvc2l0aW9uKElNYXJrZXIgbWFya2VyKSB7Ci0JCVBvc2l0aW9uIHBvcyA9IHN1cGVyLmdldE1hcmtlclBvc2l0aW9uKG1hcmtlcik7Ci0KLQkJLy8gaWYgKChwb3MgPT0gbnVsbCB8fCBwb3MuZ2V0TGVuZ3RoKCkgPT0gMCkgJiYgbWFya2VyLmdldFR5cGUoKSA9PQotCQkvLyBJSW50ZXJuYWxEZWJ1Z1VJQ29uc3RhbnRzLkFOTl9JTlNUUl9QT0lOVEVSX0NVUlJFTlQpIHsKLQkJaWYgKHBvcyA9PSBudWxsIHx8IHBvcy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQkvLyBXZSBwcm9iYWJseSBzaG91bGQgY3JlYXRlIHBvc2l0aW9uIGZyb20gbWFya2VyIGlmIG1hcmtlcgotCQkJLy8gYXR0cmlidXRlcyBzcGVjaWZ5IGEgdmFsaWQgcG9zaXRpb24KLQkJCXBvcyA9IGNyZWF0ZVBvc2l0aW9uRnJvbU1hcmtlcihtYXJrZXIpOwotCQl9Ci0KLQkJcmV0dXJuIHBvczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWwjaXNBY2NlcHRhYmxlKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBY2NlcHRhYmxlKElNYXJrZXIgbWFya2VyKSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3QgYXR0ciA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoSUJyZWFrcG9pbnRDb25zdGFudHMuQVRUUl9ISURERU4pOwotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiBCb29sZWFuLlRSVUUuZXF1YWxzKGF0dHIpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCi0JCWlmIChmU2Vjb25kYXJ5TWFya2VyQXR0cmlidXRlVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBzdXBlci5pc0FjY2VwdGFibGUobWFya2VyKTsKLQkJU3RyaW5nIG1hcmtlclNlY29uZGFyeU1hcmtlckF0dHJpYnV0ZVZhbHVlID0gbWFya2VyLmdldEF0dHJpYnV0ZShTRUNPTkRBUllfSURfS0VZLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBpc1NhbWVGaWxlID0gZlNlY29uZGFyeU1hcmtlckF0dHJpYnV0ZVZhbHVlLmVxdWFsc0lnbm9yZUNhc2UobWFya2VyU2Vjb25kYXJ5TWFya2VyQXR0cmlidXRlVmFsdWUpOwotCQlyZXR1cm4gc3VwZXIuaXNBY2NlcHRhYmxlKG1hcmtlcikgJiYgaXNTYW1lRmlsZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTViMjM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5OwotCi0vKioKLSAqIAotICogQGF1dGhvciBuc2QKLSAqIAotICogVXNlZCBieSB0aGUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5hbm5vdGF0aW9uTW9kZWxDcmVhdGlvbiBleHRlbnNpb24KLSAqIHBvaW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5IGV4dGVuZHMgUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5IHsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklBbm5vdGF0aW9uTW9kZWxGYWN0b3J5I2NyZWF0ZUFubm90YXRpb25Nb2RlbChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JICovCi0JcHVibGljIElBbm5vdGF0aW9uTW9kZWwgY3JlYXRlQW5ub3RhdGlvbk1vZGVsKElQYXRoIGxvY2F0aW9uKSB7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gRmlsZUJ1ZmZlcnMuZ2V0V29ya3NwYWNlRmlsZUF0TG9jYXRpb24obG9jYXRpb24pOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQltb2RlbCA9IG5ldyBTdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWwoZmlsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQltb2RlbCA9IG5ldyBTdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWwoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgbG9jYXRpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3Zlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNGEzZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwudGV4dC5odG1sLkhUTUxQcmludGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkRlZmF1bHRBbm5vdGF0aW9uSG92ZXI7Ci0KLS8qKgotICogRGV0ZXJtaW5lcyBhbGwgbWVzc2FnZXMgZm9yIHRoZSBnaXZlbiBsaW5lIGFuZCBjb2xsZWN0cywgY29uY2F0ZW5hdGVzLCBhbmQKLSAqIGZvcm1hdHMgdGhlbSBpbiBIVE1MLiBVc2Ugb2YgdGhlIGludGVybmFsIEhUTUxQcmludGVyIHdhcyBvYnNlcnZlZCBpbgotICogb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSFRNTEFubm90YXRpb25Ib3ZlciAuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3ZlciBleHRlbmRzIERlZmF1bHRBbm5vdGF0aW9uSG92ZXIgewotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3Zlcihib29sZWFuIHNob3dMaW5lTnVtYmVyKSB7Ci0JCXN1cGVyKHNob3dMaW5lTnVtYmVyKTsKLQl9Ci0KLQkvKgotCSAqIEZvcm1hdHMgYSBtZXNzYWdlIGFzIEhUTUwgdGV4dC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdFNpbmdsZU1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSFRNTFByaW50ZXIuYWRkUGFnZVByb2xvZyhidWZmZXIpOwotCQlIVE1MUHJpbnRlci5hZGRQYXJhZ3JhcGgoYnVmZmVyLCBIVE1MUHJpbnRlci5jb252ZXJ0VG9IVE1MQ29udGVudChtZXNzYWdlKSk7Ci0JCUhUTUxQcmludGVyLmFkZFBhZ2VFcGlsb2coYnVmZmVyKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogRm9ybWF0cyBzZXZlcmFsIG1lc3NhZ2UgYXMgSFRNTCB0ZXh0LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZm9ybWF0TXVsdGlwbGVNZXNzYWdlcyhMaXN0IG1lc3NhZ2VzKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUhUTUxQcmludGVyLmFkZFBhZ2VQcm9sb2coYnVmZmVyKTsKLQkJSFRNTFByaW50ZXIuYWRkUGFyYWdyYXBoKGJ1ZmZlciwgSFRNTFByaW50ZXIuY29udmVydFRvSFRNTENvbnRlbnQoU1NFVUlNZXNzYWdlcy5NdWx0aXBsZV9lcnJvcnMpKTsKLQotCQlIVE1MUHJpbnRlci5zdGFydEJ1bGxldExpc3QoYnVmZmVyKTsKLQkJU2V0IGNvbGxlY3RlZE1lc3NhZ2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJSXRlcmF0b3IgZSA9IG1lc3NhZ2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGNvbnZlcnRlZCA9IEhUTUxQcmludGVyLmNvbnZlcnRUb0hUTUxDb250ZW50KChTdHJpbmcpIGUubmV4dCgpKTsKLQkJCWNvbGxlY3RlZE1lc3NhZ2VzLmFkZChjb252ZXJ0ZWQpOwotCQl9Ci0JCWUgPSBjb2xsZWN0ZWRNZXNzYWdlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUhUTUxQcmludGVyLmFkZEJ1bGxldChidWZmZXIsIGUubmV4dCgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCUhUTUxQcmludGVyLmVuZEJ1bGxldExpc3QoYnVmZmVyKTsKLQotCQlIVE1MUHJpbnRlci5hZGRQYWdlRXBpbG9nKGJ1ZmZlcik7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuSVJlbGVhc2FibGUjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFRleHRMaW5lQnJlYWtpbmdSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dExpbmVCcmVha2luZ1JlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmUzZGViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dExpbmVCcmVha2luZ1JlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLQotLyoKLSAqIE5vdCBhIHJlYWwgcmVhZGVyLiBDb3VsZCBjaGFuZ2UgaWYgcmVxdWVzdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dExpbmVCcmVha2luZ1JlYWRlciB7Ci0JcHJpdmF0ZSBHQyBmR0M7Ci0JcHJpdmF0ZSBpbnQgZkluZGV4OwotCXByaXZhdGUgU3RyaW5nIGZMaW5lOwotCXByaXZhdGUgaW50IGZNYXhXaWR0aDsKLQotCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgZlJlYWRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSByZWFkZXIgdGhhdCBicmVha3MgYW4gaW5wdXQgdGV4dCB0byBmaXQgaW4gYSBnaXZlbiB3aWR0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVhZGVyCi0JICogICAgICAgICAgICBSZWFkZXIgb2YgdGhlIGlucHV0IHRleHQKLQkgKiBAcGFyYW0gZ2MKLQkgKiAgICAgICAgICAgIFRoZSBncmFwaGljIGNvbnRleHQgdGhhdCBkZWZpbmVzIHRoZSBjdXJyZW50bHkgdXNlZCBmb250Ci0JICogICAgICAgICAgICBzaXplcwotCSAqIEBwYXJhbSBtYXhMaW5lV2lkdGgKLQkgKiAgICAgICAgICAgIFRoZSBtYXggd2lkdGggKHBpeGVzKSB3aGVyZSB0aGUgdGV4dCBoYXMgdG8gZml0IGluCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0TGluZUJyZWFraW5nUmVhZGVyKFJlYWRlciByZWFkZXIsIEdDIGdjLCBpbnQgbWF4TGluZVdpZHRoKSB7Ci0JCWZSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIocmVhZGVyKTsKLQkJZkdDID0gZ2M7Ci0JCWZNYXhXaWR0aCA9IG1heExpbmVXaWR0aDsKLQkJZkxpbmUgPSBudWxsOwotCQlmSW5kZXggPSAwOwotCX0KLQotCXByaXZhdGUgaW50IGZpbmROZXh0QnJlYWtJbmRleChpbnQgY3VyckluZGV4KSB7Ci0JCWludCBjdXJyV2lkdGggPSAwOwotCQlpbnQgbGluZUxlbmd0aCA9IGZMaW5lLmxlbmd0aCgpOwotCi0JCXdoaWxlIChjdXJySW5kZXggPCBsaW5lTGVuZ3RoKSB7Ci0JCQljaGFyIGNoID0gZkxpbmUuY2hhckF0KGN1cnJJbmRleCk7Ci0JCQlpbnQgbmV4dEluZGV4ID0gY3VyckluZGV4ICsgMTsKLQkJCS8vIGxlYWRpbmcgd2hpdGVzcGFjZXMgYXJlIGNvdW50ZWQgdG8gdGhlIGZvbGxvd2luZyB3b3JkCi0JCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkpIHsKLQkJCQl3aGlsZSAobmV4dEluZGV4IDwgbGluZUxlbmd0aCAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGZMaW5lLmNoYXJBdChuZXh0SW5kZXgpKSkgewotCQkJCQluZXh0SW5kZXgrKzsKLQkJCQl9Ci0JCQl9Ci0JCQl3aGlsZSAobmV4dEluZGV4IDwgbGluZUxlbmd0aCAmJiAhQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShmTGluZS5jaGFyQXQobmV4dEluZGV4KSkpIHsKLQkJCQluZXh0SW5kZXgrKzsKLQkJCX0KLQkJCVN0cmluZyB3b3JkID0gZkxpbmUuc3Vic3RyaW5nKGN1cnJJbmRleCwgbmV4dEluZGV4KTsKLQkJCWludCB3b3JkV2lkdGggPSBmR0MudGV4dEV4dGVudCh3b3JkKS54OwotCQkJaW50IG5leHRXaWR0aCA9IHdvcmRXaWR0aCArIGN1cnJXaWR0aDsKLQkJCWlmIChuZXh0V2lkdGggPiBmTWF4V2lkdGggJiYgd29yZFdpZHRoIDwgZk1heFdpZHRoKSB7Ci0JCQkJcmV0dXJuIGN1cnJJbmRleDsKLQkJCX0KLQkJCWN1cnJXaWR0aCA9IG5leHRXaWR0aDsKLQkJCWN1cnJJbmRleCA9IG5leHRJbmRleDsKLQkJfQotCQlyZXR1cm4gY3VyckluZGV4OwotCX0KLQotCXByaXZhdGUgaW50IGZpbmRXb3JkQmVnaW4oaW50IGlkeCkgewotCQl3aGlsZSAoaWR4IDwgZkxpbmUubGVuZ3RoKCkgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShmTGluZS5jaGFyQXQoaWR4KSkpIHsKLQkJCWlkeCsrOwotCQl9Ci0JCXJldHVybiBpZHg7Ci0JfQotCi0JLyoqCi0JICogUmVhZHMgdGhlIG5leHQgbGluZS4gVGhlIGxlbmd0aHMgb2YgdGhlIGxpbmUgd2lsbCBub3QgZXhjZWVkIHRoZSBnaXZlZAotCSAqIG1heGltdW0gd2lkdGguCi0JICovCi0JcHVibGljIFN0cmluZyByZWFkTGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmTGluZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgbGluZSA9IGZSZWFkZXIucmVhZExpbmUoKTsKLQkJCWlmIChsaW5lID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWludCBsaW5lTGVuID0gZkdDLnRleHRFeHRlbnQobGluZSkueDsKLQkJCWlmIChsaW5lTGVuIDwgZk1heFdpZHRoKSB7Ci0JCQkJcmV0dXJuIGxpbmU7Ci0JCQl9Ci0JCQlmTGluZSA9IGxpbmU7Ci0JCQlmSW5kZXggPSAwOwotCQl9Ci0JCWludCBicmVha0lkeCA9IGZpbmROZXh0QnJlYWtJbmRleChmSW5kZXgpOwotCQlTdHJpbmcgcmVzID0gZkxpbmUuc3Vic3RyaW5nKGZJbmRleCwgYnJlYWtJZHgpOwotCQlpZiAoYnJlYWtJZHggPCBmTGluZS5sZW5ndGgoKSkgewotCQkJZkluZGV4ID0gZmluZFdvcmRCZWdpbihicmVha0lkeCk7Ci0JCX0gZWxzZSB7Ci0JCQlmTGluZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFRleHRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dFNlbGVjdGlvbkNoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjhkYzJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dFNlbGVjdGlvbkNoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgdXNlZCBieSB0aGUgU291cmNlRWRpdG9yVHJlZVZpZXdlciB0byB0ZWxsIHRoZQotICogVmlld2VyU2VsZWN0aW9uTWFuYWdlciB0aGF0IHRoZSBzZWxlY3Rpb24gcmVhbGx5IGNhbWUgZnJvbSBhIHVzZXIgY2xpY2sgb24KLSAqIHRoZSBjb250ZW50IG91dGxpbmVyLCBpbnN0ZWFkIG9mIGJlaW5nIHNldCBwcm9ncmFtYXRpY2FsbHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFNlbGVjdGlvbkNoYW5nZWRFdmVudCBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoSVNlbGVjdGlvblByb3ZpZGVyIHNvdXJjZSwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIoc291cmNlLCBzZWxlY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dFZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRUZXh0Vmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYmJkZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRUZXh0Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0UHJlc2VudGF0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkZvcm1hdHRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JQ29udGVudEZvcm1hdHRlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JRm9ybWF0dGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucHJvamVjdGlvbi5Qcm9qZWN0aW9uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSU92ZXJ2aWV3UnVsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVZlcnRpY2FsUnVsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLklEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLlVuZG9Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkNvbXBhdGlibGVIaWdobGlnaHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkhpZ2hsaWdodGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5SZWNvbmNpbGVySGlnaGxpZ2h0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuU3RydWN0dXJlZFJlZ2lvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotLyoqCi0gKiA8cD4KLSAqIExpa2Uge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3J9LCB0aGlzIGNsYXNzIGlzIG5vdAotICogbWVhbnQgdG8gYmUgc3ViY2xhc3NlZC48YnIgLz4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyIGV4dGVuZHMgUHJvamVjdGlvblZpZXdlciBpbXBsZW1lbnRzIElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHsKLQkvKiogVGV4dCBvcGVyYXRpb24gY29kZXMgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFTRSA9IFByb2plY3Rpb25WaWV3ZXIuQ09MTEFQU0VfQUxMOyAvLyBzZWUKLQkvLyBQcm9qZWN0aW9uVmlld2VyLkNPTExBUFNFX0FMTAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTEVBTlVQX0RPQ1VNRU5UID0gQkFTRSArIDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FDVElWRV9FTEVNRU5UUyA9IEJBU0UgKyAzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9BQ1RJVkVfRUxFTUVOVFNfVEVYVCA9IFNTRVVJTWVzc2FnZXMuRm9ybWF0X0FjdGl2ZV9FbGVtZW50c19VSV87IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRE9DVU1FTlQgPSBCQVNFICsgMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX0RPQ1VNRU5UX1RFWFQgPSBTU0VVSU1lc3NhZ2VzLkZvcm1hdF9Eb2N1bWVudF9VSV87IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DVVQgPSBTU0VVSU1lc3NhZ2VzLlRleHRfQ3V0X1VJXzsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BBU1RFID0gU1NFVUlNZXNzYWdlcy5UZXh0X1Bhc3RlX1VJXzsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NISUZUX0xFRlQgPSBTU0VVSU1lc3NhZ2VzLlRleHRfU2hpZnRfTGVmdF9VSV87IC8vJE5PTi1OTFMtMSQgPSAiVGV4dCBTaGlmdCBMZWZ0IgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NISUZUX1JJR0hUID0gU1NFVUlNZXNzYWdlcy5UZXh0X1NoaWZ0X1JpZ2h0X1VJXzsgLy8kTk9OLU5MUy0xJCA9ICJUZXh0IFNoaWZ0IFJpZ2h0IgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVFJBQ0VfRVhDRVBUSU9OUyA9IHRydWU7Ci0KLQkvKgotCSAqIE1heCBsZW5ndGggb2YgY2hhcnMgdG8gZm9ybWF0IGJlZm9yZSBpdCBpcyBjb25zaWRlcmVkIGEgImJpZyBmb3JtYXQiCi0JICogVGhpcyBpcyB1c2VkIHRvIGluZGljYXRpb24gYSBzbWFsbCB1bnJlc3RyaWN0ZWQgcmV3cml0ZSBzZXNzaW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IE1BWF9TTUFMTF9GT1JNQVRfTEVOR1RIID0gMTAwMDsKLQlwcml2YXRlIGJvb2xlYW4gZkJhY2tncm91bmR1cGRhdGVJblByb2dyZXNzOwotCXByaXZhdGUgU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlciBmQ29udGVudENsZWFudXBIYW5kbGVyID0gbnVsbDsKLQkvL3ByaXZhdGUgSURvY3VtZW50QWRhcHRlciBmRG9jQWRhcHRlcjsKLQotCXByaXZhdGUgSGlnaGxpZ2h0ZXIgZkhpZ2hsaWdodGVyOwotCQotCXByaXZhdGUgUmVjb25jaWxlckhpZ2hsaWdodGVyIGZSZWNIaWdobGlnaHRlciA9IG51bGw7Ci0KLQkvLyBwcml2YXRlIFZpZXdlclNlbGVjdGlvbk1hbmFnZXIgZlZpZXdlclNlbGVjdGlvbk1hbmFnZXI7Ci0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGZDb25maWd1cmF0aW9uOwotCS8qCi0JICogVHJ1ZSBpZiBmb3JtYXR0ZXIgaGFzIGJlZW4gc2V0Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZGb3JtYXR0ZXJTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyI1NvdXJjZVZpZXdlcihDb21wb3NpdGUsCi0JICogICAgICBJVmVydGljYWxSdWxlciwgSU92ZXJ2aWV3UnVsZXIsIGJvb2xlYW4sIGludCkKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSVZlcnRpY2FsUnVsZXIgdmVydGljYWxSdWxlciwgSU92ZXJ2aWV3UnVsZXIgb3ZlcnZpZXdSdWxlciwgYm9vbGVhbiBzaG93QW5ub3RhdGlvbnNPdmVydmlldywgaW50IHN0eWxlcykgewotCQlzdXBlcihwYXJlbnQsIHZlcnRpY2FsUnVsZXIsIG92ZXJ2aWV3UnVsZXIsIHNob3dBbm5vdGF0aW9uc092ZXJ2aWV3LCBzdHlsZXMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBiZWVwKCkgewotCQlnZXRUZXh0V2lkZ2V0KCkuZ2V0RGlzcGxheSgpLmJlZXAoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpbkJhY2tncm91bmRVcGRhdGUoKSB7Ci0JCWZCYWNrZ3JvdW5kdXBkYXRlSW5Qcm9ncmVzcyA9IHRydWU7Ci0JCXNldFJlZHJhdyhmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGVzKSB7Ci0JCS8vIEZvcmNlcyBMRUZUX1RPX1JJR0hUIG9yaWVudGF0aW9uIHVubGVzcyBvdGhlcndpc2Ugc3VnZ2VzdGVkCi0JCWlmICgoc3R5bGVzICYgU1dULkxFRlRfVE9fUklHSFQpID09IDAgJiYgKHN0eWxlcyAmIFNXVC5SSUdIVF9UT19MRUZUKSA9PSAwKQotCQkJc3R5bGVzIHw9IFNXVC5MRUZUX1RPX1JJR0hUOwotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCwgc3R5bGVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRPcGVyYXRpb25UYXJnZXQjY2FuRG9PcGVyYXRpb24oaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkRvT3BlcmF0aW9uKGludCBvcGVyYXRpb24pIHsKLQkJaWYgKGZCYWNrZ3JvdW5kdXBkYXRlSW5Qcm9ncmVzcykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXN3aXRjaCAob3BlcmF0aW9uKSB7Ci0JCQljYXNlIENPTlRFTlRBU1NJU1RfUFJPUE9TQUxTIDogewotCQkJCS8vIChwYSkgaWYgcG9zaXRpb24gaXNuJ3QgUkVBRF9PTkxZIChjb250YWluc1JlYWRPbmx5KCkKLQkJCQkvLyByZXR1cm5zIGZhbHNlKSwKLQkJCQkvLyBPdGhlcndpc2UsIHlvdSBETyB3YW50IGNvbnRlbnQgYXNzaXN0IChyZXR1cm4gdHJ1ZSkKLQkJCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoKTsKLQkJCQlpZiAoZG9jICE9IG51bGwgJiYgZG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlyZXR1cm4gaXNFZGl0YWJsZSgpICYmICghKChJU3RydWN0dXJlZERvY3VtZW50KSBkb2MpLmNvbnRhaW5zUmVhZE9ubHkoZ2V0U2VsZWN0ZWRSYW5nZSgpLngsIDApKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIENMRUFOVVBfRE9DVU1FTlQgOiB7Ci0JCQkJcmV0dXJuIChmQ29udGVudENsZWFudXBIYW5kbGVyICE9IG51bGwgJiYgaXNFZGl0YWJsZSgpKTsKLQkJCX0KLQkJCWNhc2UgRk9STUFUX0RPQ1VNRU5UIDoKLQkJCWNhc2UgRk9STUFUX0FDVElWRV9FTEVNRU5UUyA6IHsKLQkJCQkvLyBpZiBmb3JtYXR0ZXIgbm90IHNldCB5ZXQsIGNvbnRlbnRmb3JtYXR0ZXIgY2FuIGJlIG51bGwKLQkJCQlyZXR1cm4gKChmQ29udGVudEZvcm1hdHRlciAhPSBudWxsIHx8ICFmRm9ybWF0dGVyU2V0KSAmJiBpc0VkaXRhYmxlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5jYW5Eb09wZXJhdGlvbihvcGVyYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFNob3VsZCBiZSBpZGVudGljYWwgdG8gc3VwZXJjbGFzcyB2ZXJzaW9uLiBQbHVzLCB3ZSBnZXQgb3VyIG93biBzcGVjaWFsCi0JICogSGlnaGxpZ2h0ZXIuIFBsdXMgd2UgdW5pbnN0YWxsIGJlZm9yZSBpbnN0YWxsaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZShTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQotCQlpZiAoZ2V0VGV4dFdpZGdldCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoY29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcodGhpcykpOwotCi0JCS8vIGFsd2F5cyB1bmluc3RhbGwgaGlnaGxpZ2h0ZXIgYW5kIG51bGwgaXQgb3V0IG9uIG5ldyBjb25maWd1cmF0aW9uCi0JCWlmIChmSGlnaGxpZ2h0ZXIgIT0gbnVsbCkgewotCQkJZkhpZ2hsaWdodGVyLnVuaW5zdGFsbCgpOwotCQkJZkhpZ2hsaWdodGVyID0gbnVsbDsKLQkJfQotCi0JCWlmKGZSZWNIaWdobGlnaHRlciAhPSBudWxsKSB7Ci0JCQlmUmVjSGlnaGxpZ2h0ZXIudW5pbnN0YWxsKCk7Ci0JCQlmUmVjSGlnaGxpZ2h0ZXIgPSBudWxsOwotCQl9Ci0JCQotCQkvLyBCdWcgMjMwMjk3IC0gVW5pbnN0YWxsIHByZXNlbnRhdGlvbiByZWNvbmNpbGVyIGluIHByZXBhcmF0aW9uIG9mIGEgbmV3IG9uZQotCQlpZihmUHJlc2VudGF0aW9uUmVjb25jaWxlciAhPSBudWxsKSB7Ci0JCQlmUHJlc2VudGF0aW9uUmVjb25jaWxlci51bmluc3RhbGwoKTsKLQkJCWZQcmVzZW50YXRpb25SZWNvbmNpbGVyID0gbnVsbDsKLQkJfQotCi0JCUlSZWNvbmNpbGVyIG5ld1JlY29uY2lsZXIgPSBjb25maWd1cmF0aW9uLmdldFJlY29uY2lsZXIodGhpcyk7Ci0KLQkJaWYgKG5ld1JlY29uY2lsZXIgIT0gZlJlY29uY2lsZXIgfHwgbmV3UmVjb25jaWxlciA9PSBudWxsIHx8IGZSZWNvbmNpbGVyID09IG51bGwpIHsKLQotCQkJaWYgKGZSZWNvbmNpbGVyICE9IG51bGwpIHsKLQkJCQlmUmVjb25jaWxlci51bmluc3RhbGwoKTsKLQkJCX0KLQotCQkJZlJlY29uY2lsZXIgPSBuZXdSZWNvbmNpbGVyOwotCi0JCQlpZiAoZlJlY29uY2lsZXIgIT0gbnVsbCkgewotCQkJCWZSZWNvbmNpbGVyLmluc3RhbGwodGhpcyk7Ci0JCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM4NTgKLQkJCQkvLyBzdGlsbCBuZWVkIHNldCBkb2N1bWVudCBvbiB0aGUgcmVjb25jaWxlciAoc3RyYXRlZ2llcykKLQkJCQlpZiAoZlJlY29uY2lsZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkUmVnaW9uUHJvY2Vzc29yKQotCQkJCQkoKFN0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3IpIGZSZWNvbmNpbGVyKS5zZXREb2N1bWVudChnZXREb2N1bWVudCgpKTsKLQkJCX0KLQkJfQotCi0JCUlDb250ZW50QXNzaXN0YW50IG5ld0Fzc2lzdGFudCA9IGNvbmZpZ3VyYXRpb24uZ2V0Q29udGVudEFzc2lzdGFudCh0aGlzKTsKLQkJaWYgKG5ld0Fzc2lzdGFudCAhPSBmQ29udGVudEFzc2lzdGFudCB8fCBuZXdBc3Npc3RhbnQgPT0gbnVsbCB8fCBmQ29udGVudEFzc2lzdGFudCA9PSBudWxsKSB7Ci0JCQlpZiAoZkNvbnRlbnRBc3Npc3RhbnQgIT0gbnVsbCkKLQkJCQlmQ29udGVudEFzc2lzdGFudC51bmluc3RhbGwoKTsKLQotCQkJZkNvbnRlbnRBc3Npc3RhbnQgPSBuZXdBc3Npc3RhbnQ7Ci0KLQkJCWlmIChmQ29udGVudEFzc2lzdGFudCAhPSBudWxsKSB7Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnQuaW5zdGFsbCh0aGlzKTsKLQkJCQlmQ29udGVudEFzc2lzdGFudEluc3RhbGxlZCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyAyNDgwMzYKLQkJCQkvLyBkaXNhYmxlIHRoZSBjb250ZW50IGFzc2lzdCBvcGVyYXRpb24gaWYgbm8gY29udGVudAotCQkJCS8vIGFzc2lzdGFudAotCQkJCWVuYWJsZU9wZXJhdGlvbihDT05URU5UQVNTSVNUX1BST1BPU0FMUywgZmFsc2UpOwotCQkJCWZDb250ZW50QXNzaXN0YW50SW5zdGFsbGVkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlJUXVpY2tBc3Npc3RBc3Npc3RhbnQgcXVpY2tBc3Npc3RhbnQgPSBjb25maWd1cmF0aW9uLmdldFF1aWNrQXNzaXN0QXNzaXN0YW50KHRoaXMpOwotCQlpZiAocXVpY2tBc3Npc3RhbnQgIT0gZlF1aWNrQXNzaXN0QXNzaXN0YW50IHx8IHF1aWNrQXNzaXN0YW50ID09IG51bGwgfHwgZlF1aWNrQXNzaXN0QXNzaXN0YW50ID09IG51bGwpIHsKLQkJCWlmIChmUXVpY2tBc3Npc3RBc3Npc3RhbnQgIT0gbnVsbCkKLQkJCQlmUXVpY2tBc3Npc3RBc3Npc3RhbnQudW5pbnN0YWxsKCk7Ci0KLQkJCWZRdWlja0Fzc2lzdEFzc2lzdGFudCA9IHF1aWNrQXNzaXN0YW50OwotCi0JCQlpZiAoZlF1aWNrQXNzaXN0QXNzaXN0YW50ICE9IG51bGwpIHsKLQkJCQlmUXVpY2tBc3Npc3RBc3Npc3RhbnQuaW5zdGFsbCh0aGlzKTsKLQkJCQlmUXVpY2tBc3Npc3RBc3Npc3RhbnRJbnN0YWxsZWQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gMjQ4MDM2Ci0JCQkJLy8gZGlzYWJsZSB0aGUgY29udGVudCBhc3Npc3Qgb3BlcmF0aW9uIGlmIG5vIGNvbnRlbnQKLQkJCQkvLyBhc3Npc3RhbnQKLQkJCQllbmFibGVPcGVyYXRpb24oUVVJQ0tfQVNTSVNULCBmYWxzZSk7Ci0JCQkJZlF1aWNrQXNzaXN0QXNzaXN0YW50SW5zdGFsbGVkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlmQ29udGVudEZvcm1hdHRlciA9IGNvbmZpZ3VyYXRpb24uZ2V0Q29udGVudEZvcm1hdHRlcih0aGlzKTsKLQotCQkvLyBkbyBub3QgdW5pbnN0YWxsIG9sZCBpbmZvcm1hdGlvbiBwcmVzZW50ZXIgaWYgaXQncyB0aGUgc2FtZQotCQlJSW5mb3JtYXRpb25QcmVzZW50ZXIgbmV3SW5mb3JtYXRpb25QcmVzZW50ZXIgPSBjb25maWd1cmF0aW9uLmdldEluZm9ybWF0aW9uUHJlc2VudGVyKHRoaXMpOwotCQlpZiAobmV3SW5mb3JtYXRpb25QcmVzZW50ZXIgPT0gbnVsbCB8fCBmSW5mb3JtYXRpb25QcmVzZW50ZXIgPT0gbnVsbCB8fCAhKG5ld0luZm9ybWF0aW9uUHJlc2VudGVyLmVxdWFscyhmSW5mb3JtYXRpb25QcmVzZW50ZXIpKSkgewotCQkJaWYgKGZJbmZvcm1hdGlvblByZXNlbnRlciAhPSBudWxsKQotCQkJCWZJbmZvcm1hdGlvblByZXNlbnRlci51bmluc3RhbGwoKTsKLQkJCWZJbmZvcm1hdGlvblByZXNlbnRlciA9IG5ld0luZm9ybWF0aW9uUHJlc2VudGVyOwotCQkJaWYgKGZJbmZvcm1hdGlvblByZXNlbnRlciAhPSBudWxsKQotCQkJCWZJbmZvcm1hdGlvblByZXNlbnRlci5pbnN0YWxsKHRoaXMpOwotCQl9Ci0KLQkJLy8gZGlzY29ubmVjdCBmcm9tIHRoZSBvbGQgdW5kbyBtYW5hZ2VyIGJlZm9yZSBzZXR0aW5nIHRoZSBuZXcgb25lCi0JCWlmIChmVW5kb01hbmFnZXIgIT0gbnVsbCkgewotCQkJZlVuZG9NYW5hZ2VyLmRpc2Nvbm5lY3QoKTsKLQkJfQotCQlzZXRVbmRvTWFuYWdlcihjb25maWd1cmF0aW9uLmdldFVuZG9NYW5hZ2VyKHRoaXMpKTsKLQotCQkvLyByZWxlYXNlIG9sZCBhbm5vdGF0aW9uIGhvdmVyIGJlZm9yZSBzZXR0aW5nIG5ldyBvbmUKLQkJaWYgKGZBbm5vdGF0aW9uSG92ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3ZlcikgewotCQkJKChTdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3ZlcikgZkFubm90YXRpb25Ib3ZlcikucmVsZWFzZSgpOwotCQl9Ci0JCXNldEFubm90YXRpb25Ib3Zlcihjb25maWd1cmF0aW9uLmdldEFubm90YXRpb25Ib3Zlcih0aGlzKSk7Ci0KLQkJLy8gcmVsZWFzZSBvbGQgYW5ub3RhdGlvbiBob3ZlciBiZWZvcmUgc2V0dGluZyBuZXcgb25lCi0JCWlmIChmT3ZlcnZpZXdSdWxlckFubm90YXRpb25Ib3ZlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyKSB7Ci0JCQkoKFN0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyKSBmT3ZlcnZpZXdSdWxlckFubm90YXRpb25Ib3ZlcikucmVsZWFzZSgpOwotCQl9Ci0JCXNldE92ZXJ2aWV3UnVsZXJBbm5vdGF0aW9uSG92ZXIoY29uZmlndXJhdGlvbi5nZXRPdmVydmlld1J1bGVyQW5ub3RhdGlvbkhvdmVyKHRoaXMpKTsKLQotCQlnZXRUZXh0V2lkZ2V0KCkuc2V0VGFicyhjb25maWd1cmF0aW9uLmdldFRhYldpZHRoKHRoaXMpKTsKLQkJc2V0SG92ZXJDb250cm9sQ3JlYXRvcihjb25maWd1cmF0aW9uLmdldEluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IodGhpcykpOwotCi0JCS8vIGlmIGh5cGVybGluayBtYW5hZ2VyIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgdW5pbnN0YWxsIGl0Ci0JCWlmIChmSHlwZXJsaW5rTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlzZXRIeXBlcmxpbmtEZXRlY3RvcnMobnVsbCwgU1dULk5PTkUpOwotCQl9Ci0JCXNldEh5cGVybGlua1ByZXNlbnRlcihjb25maWd1cmF0aW9uLmdldEh5cGVybGlua1ByZXNlbnRlcih0aGlzKSk7Ci0JCUlIeXBlcmxpbmtEZXRlY3RvcltdIGh5cGVybGlua0RldGVjdG9ycyA9IGNvbmZpZ3VyYXRpb24uZ2V0SHlwZXJsaW5rRGV0ZWN0b3JzKHRoaXMpOwotCQlpbnQgZXZlbnRTdGF0ZU1hc2sgPSBjb25maWd1cmF0aW9uLmdldEh5cGVybGlua1N0YXRlTWFzayh0aGlzKTsKLQkJc2V0SHlwZXJsaW5rRGV0ZWN0b3JzKGh5cGVybGlua0RldGVjdG9ycywgZXZlbnRTdGF0ZU1hc2spOwotCi0JCVN0cmluZ1tdIHR5cGVzID0gY29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHRoaXMpOwotCi0JCS8vIGNsZWFyIGF1dG9pbmRlbnQvYXV0b2VkaXQgc3RyYXRlZ2llcwotCQlmQXV0b0luZGVudFN0cmF0ZWdpZXMgPSBudWxsOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHQgPSB0eXBlc1tpXTsKLQkJCXNldEF1dG9FZGl0U3RyYXRlZ2llcyhjb25maWd1cmF0aW9uLmdldEF1dG9FZGl0U3RyYXRlZ2llcyh0aGlzLCB0KSwgdCk7Ci0JCQlzZXRUZXh0RG91YmxlQ2xpY2tTdHJhdGVneShjb25maWd1cmF0aW9uLmdldERvdWJsZUNsaWNrU3RyYXRlZ3kodGhpcywgdCksIHQpOwotCi0JCQlpbnRbXSBzdGF0ZU1hc2tzID0gY29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkVGV4dEhvdmVyU3RhdGVNYXNrcyh0aGlzLCB0KTsKLQkJCWlmIChzdGF0ZU1hc2tzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHN0YXRlTWFza3MubGVuZ3RoOyBqKyspIHsKLQkJCQkJaW50IHN0YXRlTWFzayA9IHN0YXRlTWFza3Nbal07Ci0JCQkJCXNldFRleHRIb3Zlcihjb25maWd1cmF0aW9uLmdldFRleHRIb3Zlcih0aGlzLCB0LCBzdGF0ZU1hc2spLCB0LCBzdGF0ZU1hc2spOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldFRleHRIb3Zlcihjb25maWd1cmF0aW9uLmdldFRleHRIb3Zlcih0aGlzLCB0KSwgdCwgSVRleHRWaWV3ZXJFeHRlbnNpb24yLkRFRkFVTFRfSE9WRVJfU1RBVEVfTUFTSyk7Ci0JCQl9Ci0KLQkJCVN0cmluZ1tdIHByZWZpeGVzID0gY29uZmlndXJhdGlvbi5nZXRJbmRlbnRQcmVmaXhlcyh0aGlzLCB0KTsKLQkJCWlmIChwcmVmaXhlcyAhPSBudWxsICYmIHByZWZpeGVzLmxlbmd0aCA+IDApCi0JCQkJc2V0SW5kZW50UHJlZml4ZXMocHJlZml4ZXMsIHQpOwotCi0JCQlwcmVmaXhlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0RGVmYXVsdFByZWZpeGVzKHRoaXMsIHQpOwotCQkJaWYgKHByZWZpeGVzICE9IG51bGwgJiYgcHJlZml4ZXMubGVuZ3RoID4gMCkKLQkJCQlzZXREZWZhdWx0UHJlZml4ZXMocHJlZml4ZXMsIHQpOwotCi0JCQkvLyBCdWcgMjMwMjk3IC0gQWRkIExpbmVTdHlsZVByb3ZpZGVycyBmcm9tIHRoZSBuZXcgY29uZmlndXJhdGlvbiBpZgotCQkJLy8gdGhlIGRvY3VtZW50IGlzIHNldAotCQkJaWYoZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJLy8gYWRkIGhpZ2hsaWdodGVyL2xpbmVzdHlsZXByb3ZpZGVyCi0JCQkJTGluZVN0eWxlUHJvdmlkZXJbXSBwcm92aWRlcnMgPSAoKFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbikuZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHRoaXMsIHQpOwotCQkJCWlmIChwcm92aWRlcnMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHByb3ZpZGVycy5sZW5ndGg7ICsraikgewotCQkJCQkJCi0JCQkJCQlpZihmUmVjSGlnaGxpZ2h0ZXIgPT0gbnVsbCkgewotCQkJCQkJCWZSZWNIaWdobGlnaHRlciA9IG5ldyBSZWNvbmNpbGVySGlnaGxpZ2h0ZXIoKTsKLQkJCQkJCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbikuc2V0SGlnaGxpZ2h0ZXIoZlJlY0hpZ2hsaWdodGVyKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChwcm92aWRlcnNbal0gaW5zdGFuY2VvZiBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyKSB7Ci0JCQkJCQkJKChBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyKSBwcm92aWRlcnNbal0pLmluaXQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGdldERvY3VtZW50KCksIGZSZWNIaWdobGlnaHRlcik7Ci0JCQkJCQkJZlJlY0hpZ2hsaWdodGVyLmFkZFByb3ZpZGVyKHQsIHByb3ZpZGVyc1tqXSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBpbml0IHdpdGggY29tcGF0aWJpbGl0eSBpbnN0YW5jZQotCQkJCQkJCWlmIChmSGlnaGxpZ2h0ZXIgPT0gbnVsbCkgewotCQkJCQkJCQlmSGlnaGxpZ2h0ZXIgPSBuZXcgQ29tcGF0aWJsZUhpZ2hsaWdodGVyKCk7Ci0JCQkJCQkJfQotCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJDb21wYXRpYmxlSGlnaGxpZ2h0ZXIgaW5zdGFsbGluZyBjb21wYXRpYmlsaXR5IGZvciAiICsgcHJvdmlkZXJzW2pdLmdldENsYXNzKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJcHJvdmlkZXJzW2pdLmluaXQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGdldERvY3VtZW50KCksIGZIaWdobGlnaHRlcik7Ci0JCQkJCQkJZkhpZ2hsaWdodGVyLmFkZFByb3ZpZGVyKHQsIHByb3ZpZGVyc1tqXSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbml0aWFsaXplIGhpZ2hsaWdodGVyIGFmdGVyIGxpbmVzdHlsZXByb3ZpZGVycyB3ZXJlIGFkZGVkCi0JCWlmIChmSGlnaGxpZ2h0ZXIgIT0gbnVsbCkgewotCQkJZkhpZ2hsaWdodGVyLnNldERvY3VtZW50UGFydGl0aW9uaW5nKGNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHRoaXMpKTsKLQkJCWZIaWdobGlnaHRlci5zZXREb2N1bWVudCgoSVN0cnVjdHVyZWREb2N1bWVudCkgZ2V0RG9jdW1lbnQoKSk7Ci0JCQlmSGlnaGxpZ2h0ZXIuaW5zdGFsbCh0aGlzKTsKLQkJfQotCQkKLQkJaWYgKGZSZWNIaWdobGlnaHRlciAhPSBudWxsKQotCQkJZlJlY0hpZ2hsaWdodGVyLmluc3RhbGwodGhpcyk7Ci0KLQkJYWN0aXZhdGVQbHVnaW5zKCk7Ci0KLQkJZkNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotCQkKLQkJLy8gVXBkYXRlIHRoZSB2aWV3ZXIncyBwcmVzZW50YXRpb24gcmVjb25jaWxlcgotCQlmUHJlc2VudGF0aW9uUmVjb25jaWxlciA9IGNvbmZpZ3VyYXRpb24uZ2V0UHJlc2VudGF0aW9uUmVjb25jaWxlcih0aGlzKTsKLQkJCi0JCWlmKGZQcmVzZW50YXRpb25SZWNvbmNpbGVyICE9IG51bGwpCi0JCQlmUHJlc2VudGF0aW9uUmVjb25jaWxlci5pbnN0YWxsKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEBwYXJhbSBzdGFydE9mZnNldAotCSAqIEBwYXJhbSBlbmRPZmZzZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zUmVhZE9ubHkoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnRPZmZzZXQsIGludCBlbmRPZmZzZXQpIHsKLQotCQlpbnQgc3RhcnQgPSBzdGFydE9mZnNldDsKLQkJaW50IGVuZCA9IGVuZE9mZnNldDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBQcm9qZWN0aW9uRG9jdW1lbnQpIHsKLQkJCQlJRG9jdW1lbnQgZG9jID0gKChQcm9qZWN0aW9uRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRNYXN0ZXJEb2N1bWVudCgpOwotCQkJCWlmIChkb2MgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCXN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBkb2M7Ci0JCQkJCWludCBhZGp1c3QgPSAoKFByb2plY3Rpb25Eb2N1bWVudCkgZG9jdW1lbnQpLmdldFByb2plY3Rpb25NYXBwaW5nKCkuZ2V0Q292ZXJhZ2UoKS5nZXRPZmZzZXQoKTsKLQkJCQkJc3RhcnQgPSBhZGp1c3QgKyBzdGFydDsKLQkJCQkJZW5kID0gYWRqdXN0ICsgZW5kOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCWludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKLQkJCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQuY29udGFpbnNSZWFkT25seShzdGFydCwgbGVuZ3RoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gcHJlc2VudCBmb3IgY29tcGF0aWJpbGl0eSBvbmx5Ci0JICovCi0JcHJvdGVjdGVkIElEb2N1bWVudEFkYXB0ZXIgY3JlYXRlRG9jdW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gc3VwZXIuY3JlYXRlRG9jdW1lbnRBZGFwdGVyKCk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRPcGVyYXRpb25UYXJnZXQjZG9PcGVyYXRpb24oaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvT3BlcmF0aW9uKGludCBvcGVyYXRpb24pIHsKLQotCQlQb2ludCBzZWxlY3Rpb24gPSBnZXRUZXh0V2lkZ2V0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IHNlbGVjdGlvbi54OwotCQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueDsKLQkJc3dpdGNoIChvcGVyYXRpb24pIHsKLQkJCWNhc2UgQ1VUIDoKLQkJCQliZWdpblJlY29yZGluZyhURVhUX0NVVCwgVEVYVF9DVVQsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJCXN1cGVyLmRvT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0JCQkJc2VsZWN0aW9uID0gZ2V0VGV4dFdpZGdldCgpLmdldFNlbGVjdGlvbigpOwotCQkJCWN1cnNvclBvc2l0aW9uID0gc2VsZWN0aW9uLng7Ci0JCQkJc2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueDsKLQkJCQllbmRSZWNvcmRpbmcoY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBBU1RFIDoKLQkJCQliZWdpblJlY29yZGluZyhURVhUX1BBU1RFLCBURVhUX1BBU1RFLCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCQlzdXBlci5kb09wZXJhdGlvbihvcGVyYXRpb24pOwotCQkJCXNlbGVjdGlvbiA9IGdldFRleHRXaWRnZXQoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQljdXJzb3JQb3NpdGlvbiA9IHNlbGVjdGlvbi54OwotCQkJCXNlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCQkJZW5kUmVjb3JkaW5nKGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT05URU5UQVNTSVNUX1BST1BPU0FMUyA6Ci0JCQkJLy8gbWF5YmUgbm90IGNvbmZpZ3VyZWQ/Ci0JCQkJaWYgKGZDb250ZW50QXNzaXN0YW50ICE9IG51bGwgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCS8vIENNVkMgMjYzMjY5Ci0JCQkJCS8vIG5lZWQgYW4gZXhwbGljaXQgY2hlY2sgaGVyZSBiZWNhdXNlIHRoZQotCQkJCQkvLyBjb250ZW50QXNzaXN0QWN0aW9uIGlzIG5vIGxvbmdlciBiZWluZyB1cGRhdGVkIG9uCi0JCQkJCS8vIGN1cnNvcgotCQkJCQkvLyBwb3NpdGlvbgotCQkJCQlpZiAoY2FuRG9PcGVyYXRpb24oQ09OVEVOVEFTU0lTVF9QUk9QT1NBTFMpKSB7Ci0JCQkJCQlTdHJpbmcgZXJyID0gZkNvbnRlbnRBc3Npc3RhbnQuc2hvd1Bvc3NpYmxlQ29tcGxldGlvbnMoKTsKLQkJCQkJCWlmIChlcnIgIT0gbnVsbCkgewotCQkJCQkJCS8vIGRvbid0IHdhbm5hIGJlZXAgaWYgdGhlcmUgaXMgbm8gZXJyb3IKLQkJCQkJCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlUZW1wb3JhcnlFcnJvck1lc3NhZ2UodGhpcywgZXJyKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQliZWVwKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBDT05URU5UQVNTSVNUX0NPTlRFWFRfSU5GT1JNQVRJT04gOgotCQkJCWlmIChmQ29udGVudEFzc2lzdGFudCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBlcnIgPSBmQ29udGVudEFzc2lzdGFudC5zaG93Q29udGV4dEluZm9ybWF0aW9uKCk7Ci0JCQkJCWlmIChlcnIgIT0gbnVsbCkgewotCQkJCQkJLy8gZG9uJ3Qgd2FubmEgYmVlcCBpZiB0aGVyZSBpcyBubyBlcnJvcgotCQkJCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5VGVtcG9yYXJ5RXJyb3JNZXNzYWdlKHRoaXMsIGVycik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNISUZUX1JJR0hUIDoKLQkJCQliZWdpblJlY29yZGluZyhURVhUX1NISUZUX1JJR0hULCBURVhUX1NISUZUX1JJR0hULCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCQl1cGRhdGVJbmRlbnRhdGlvblByZWZpeGVzKCk7Ci0JCQkJc3VwZXIuZG9PcGVyYXRpb24oU0hJRlRfUklHSFQpOwotCQkJCXNlbGVjdGlvbiA9IGdldFRleHRXaWRnZXQoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQljdXJzb3JQb3NpdGlvbiA9IHNlbGVjdGlvbi54OwotCQkJCXNlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCQkJZW5kUmVjb3JkaW5nKGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTSElGVF9MRUZUIDoKLQkJCQliZWdpblJlY29yZGluZyhURVhUX1NISUZUX0xFRlQsIFRFWFRfU0hJRlRfTEVGVCwgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQkJdXBkYXRlSW5kZW50YXRpb25QcmVmaXhlcygpOwotCQkJCXN1cGVyLmRvT3BlcmF0aW9uKFNISUZUX0xFRlQpOwotCQkJCXNlbGVjdGlvbiA9IGdldFRleHRXaWRnZXQoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQljdXJzb3JQb3NpdGlvbiA9IHNlbGVjdGlvbi54OwotCQkJCXNlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCQkJZW5kUmVjb3JkaW5nKGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBGT1JNQVRfRE9DVU1FTlQgOgotCQkJCURvY3VtZW50UmV3cml0ZVNlc3Npb24gcmV3cml0ZVNlc3Npb24gPSBudWxsOwotCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJLyoKLQkJCQkJICogVGhpcyBjb21tYW5kIHdpbGwgYWN0dWFsbHkgZm9ybWF0IHNlbGVjdGlvbiBpZiB0ZXh0IGlzCi0JCQkJCSAqIHNlbGVjdGVkLCBvdGhlcndpc2UgZm9ybWF0IGVudGlyZSBkb2N1bWVudAotCQkJCQkgKi8KLQkJCQkJLy8gYmVnaW4gcmVjb3JkaW5nCi0JCQkJCWJlZ2luUmVjb3JkaW5nKEZPUk1BVF9ET0NVTUVOVF9URVhULCBGT1JNQVRfRE9DVU1FTlRfVEVYVCwgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQkJCWJvb2xlYW4gZm9ybWF0RG9jdW1lbnQgPSBmYWxzZTsKLQkJCQkJSVJlZ2lvbiByZWdpb24gPSBudWxsOwotCQkJCQlQb2ludCBzID0gZ2V0U2VsZWN0ZWRSYW5nZSgpOwotCQkJCQlpZiAocy55ID4gMCkgewotCQkJCQkJLy8gb25seSBmb3JtYXQgY3VycmVudGx5IHNlbGVjdGVkIHRleHQKLQkJCQkJCXJlZ2lvbiA9IG5ldyBSZWdpb24ocy54LCBzLnkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gbm8gc2VsZWN0aW9uLCBzbyBmb3JtYXQgZW50aXJlIGRvY3VtZW50Ci0JCQkJCQlyZWdpb24gPSBnZXRNb2RlbENvdmVyYWdlKCk7Ci0JCQkJCQlmb3JtYXREb2N1bWVudCA9IHRydWU7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJCQlJRG9jdW1lbnRFeHRlbnNpb240IGV4dGVuc2lvbiA9IChJRG9jdW1lbnRFeHRlbnNpb240KSBkb2N1bWVudDsKLQkJCQkJCURvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlIHR5cGUgPSAoc2VsZWN0aW9uLnkgPT0gMCB8fCBzZWxlY3Rpb24ueSA+IE1BWF9TTUFMTF9GT1JNQVRfTEVOR1RIKSA/IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRCA6IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRF9TTUFMTDsKLQkJCQkJCXJld3JpdGVTZXNzaW9uID0gKGV4dGVuc2lvbi5nZXRBY3RpdmVSZXdyaXRlU2Vzc2lvbigpICE9IG51bGwpID8gbnVsbCA6IGV4dGVuc2lvbi5zdGFydFJld3JpdGVTZXNzaW9uKHR5cGUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc2V0UmVkcmF3KGZhbHNlKTsKLQkJCQkJfQotCi0JCQkJCWlmIChmQ29udGVudEZvcm1hdHRlciBpbnN0YW5jZW9mIElDb250ZW50Rm9ybWF0dGVyRXh0ZW5zaW9uKSB7Ci0JCQkJCQlJQ29udGVudEZvcm1hdHRlckV4dGVuc2lvbiBleHRlbnNpb24gPSAoSUNvbnRlbnRGb3JtYXR0ZXJFeHRlbnNpb24pIGZDb250ZW50Rm9ybWF0dGVyOwotCQkJCQkJSUZvcm1hdHRpbmdDb250ZXh0IGNvbnRleHQgPSBuZXcgRm9ybWF0dGluZ0NvbnRleHQoKTsKLQkJCQkJCWNvbnRleHQuc2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfRE9DVU1FTlQsIEJvb2xlYW4udmFsdWVPZihmb3JtYXREb2N1bWVudCkpOwotCQkJCQkJY29udGV4dC5zZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9SRUdJT04sIHJlZ2lvbik7Ci0JCQkJCQlleHRlbnNpb24uZm9ybWF0KGRvY3VtZW50LCBjb250ZXh0KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWZDb250ZW50Rm9ybWF0dGVyLmZvcm1hdChkb2N1bWVudCwgcmVnaW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChyZXdyaXRlU2Vzc2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJSURvY3VtZW50RXh0ZW5zaW9uNCBleHRlbnNpb24gPSAoSURvY3VtZW50RXh0ZW5zaW9uNCkgZG9jdW1lbnQ7Ci0JCQkJCQkJZXh0ZW5zaW9uLnN0b3BSZXdyaXRlU2Vzc2lvbihyZXdyaXRlU2Vzc2lvbik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlzZXRSZWRyYXcodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQkvLyBlbmQgcmVjb3JkaW5nCi0JCQkJCQlzZWxlY3Rpb24gPSBnZXRUZXh0V2lkZ2V0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQljdXJzb3JQb3NpdGlvbiA9IHNlbGVjdGlvbi54OwotCQkJCQkJc2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueDsKLQkJCQkJCWVuZFJlY29yZGluZyhjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRk9STUFUX0FDVElWRV9FTEVNRU5UUyA6Ci0JCQkJcmV3cml0ZVNlc3Npb24gPSBudWxsOwotCQkJCWRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQkJCQl0cnkgewotCQkJCQkvKgotCQkJCQkgKiBUaGlzIGNvbW1hbmQgd2lsbCBmb3JtYXQgdGhlIG5vZGUgYXQgY3Vyc29yIHBvc2l0aW9uCi0JCQkJCSAqIChhbmQgYWxsIGl0cyBjaGlsZHJlbikKLQkJCQkJICovCi0JCQkJCS8vIGJlZ2luIHJlY29yZGluZwotCQkJCQliZWdpblJlY29yZGluZyhGT1JNQVRfQUNUSVZFX0VMRU1FTlRTX1RFWFQsIEZPUk1BVF9BQ1RJVkVfRUxFTUVOVFNfVEVYVCwgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQkJCUlSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJCQkJUG9pbnQgcyA9IGdldFNlbGVjdGVkUmFuZ2UoKTsKLQkJCQkJaWYgKHMueSA+IC0xKSB7Ci0JCQkJCQkvLyBvbmx5IGZvcm1hdCBub2RlIGF0IGN1cnNvciBwb3NpdGlvbgotCQkJCQkJcmVnaW9uID0gbmV3IFJlZ2lvbihzLngsIHMueSk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJCQlJRG9jdW1lbnRFeHRlbnNpb240IGV4dGVuc2lvbiA9IChJRG9jdW1lbnRFeHRlbnNpb240KSBkb2N1bWVudDsKLQkJCQkJCURvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlIHR5cGUgPSAoc2VsZWN0aW9uLnkgPT0gMCB8fCBzZWxlY3Rpb24ueSA+IE1BWF9TTUFMTF9GT1JNQVRfTEVOR1RIKSA/IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRCA6IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRF9TTUFMTDsKLQkJCQkJCXJld3JpdGVTZXNzaW9uID0gKGV4dGVuc2lvbi5nZXRBY3RpdmVSZXdyaXRlU2Vzc2lvbigpICE9IG51bGwpID8gbnVsbCA6IGV4dGVuc2lvbi5zdGFydFJld3JpdGVTZXNzaW9uKHR5cGUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc2V0UmVkcmF3KGZhbHNlKTsKLQkJCQkJfQotCi0JCQkJCWlmIChmQ29udGVudEZvcm1hdHRlciBpbnN0YW5jZW9mIElDb250ZW50Rm9ybWF0dGVyRXh0ZW5zaW9uKSB7Ci0JCQkJCQlJQ29udGVudEZvcm1hdHRlckV4dGVuc2lvbiBleHRlbnNpb24gPSAoSUNvbnRlbnRGb3JtYXR0ZXJFeHRlbnNpb24pIGZDb250ZW50Rm9ybWF0dGVyOwotCQkJCQkJSUZvcm1hdHRpbmdDb250ZXh0IGNvbnRleHQgPSBuZXcgRm9ybWF0dGluZ0NvbnRleHQoKTsKLQkJCQkJCWNvbnRleHQuc2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfRE9DVU1FTlQsIEJvb2xlYW4uRkFMU0UpOwotCQkJCQkJY29udGV4dC5zZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9SRUdJT04sIHJlZ2lvbik7Ci0JCQkJCQlleHRlbnNpb24uZm9ybWF0KGdldERvY3VtZW50KCksIGNvbnRleHQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZkNvbnRlbnRGb3JtYXR0ZXIuZm9ybWF0KGdldERvY3VtZW50KCksIHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAocmV3cml0ZVNlc3Npb24gIT0gbnVsbCkgewotCQkJCQkJCUlEb2N1bWVudEV4dGVuc2lvbjQgZXh0ZW5zaW9uID0gKElEb2N1bWVudEV4dGVuc2lvbjQpIGRvY3VtZW50OwotCQkJCQkJCWV4dGVuc2lvbi5zdG9wUmV3cml0ZVNlc3Npb24ocmV3cml0ZVNlc3Npb24pOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJc2V0UmVkcmF3KHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJLy8gZW5kIHJlY29yZGluZwotCQkJCQkJc2VsZWN0aW9uID0gZ2V0VGV4dFdpZGdldCgpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJY3Vyc29yUG9zaXRpb24gPSBzZWxlY3Rpb24ueDsKLQkJCQkJCXNlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCQkJCQllbmRSZWNvcmRpbmcoY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlzdXBlci5kb09wZXJhdGlvbihvcGVyYXRpb24pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuZFJlY29yZGluZyhpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KCk7Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBkb2M7Ci0JCQlJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlciA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRVbmRvTWFuYWdlcigpOwotCi0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4NjE3Ci0JCQkvLyB1bmRvIGFmdGVyIHBhc3RlIGluIGRvY3VtZW50IHdpdGggZm9sZHMgLSB3cm9uZyBiZWhhdmlvcgotCQkJSVJlZ2lvbiB3aWRnZXRTZWxlY3Rpb24gPSBuZXcgUmVnaW9uKGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJSVJlZ2lvbiBkb2N1bWVudFNlbGVjdGlvbiA9IHdpZGdldFJhbmdlMk1vZGVsUmFuZ2Uod2lkZ2V0U2VsZWN0aW9uKTsKLQkJCWlmIChkb2N1bWVudFNlbGVjdGlvbiA9PSBudWxsKQotCQkJCWRvY3VtZW50U2VsZWN0aW9uID0gd2lkZ2V0U2VsZWN0aW9uOwotCQkJdW5kb01hbmFnZXIuZW5kUmVjb3JkaW5nKHRoaXMsIGRvY3VtZW50U2VsZWN0aW9uLmdldE9mZnNldCgpLCBkb2N1bWVudFNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBUT0RPOiBob3cgdG8gaGFuZGxlIG90aGVyIGRvY3VtZW50IHR5cGVzPwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJlZ2luUmVjb3JkaW5nKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KCk7Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBkb2M7Ci0JCQlJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlciA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRVbmRvTWFuYWdlcigpOwotCi0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4NjE3Ci0JCQkvLyB1bmRvIGFmdGVyIHBhc3RlIGluIGRvY3VtZW50IHdpdGggZm9sZHMgLSB3cm9uZyBiZWhhdmlvcgotCQkJSVJlZ2lvbiB3aWRnZXRTZWxlY3Rpb24gPSBuZXcgUmVnaW9uKGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJSVJlZ2lvbiBkb2N1bWVudFNlbGVjdGlvbiA9IHdpZGdldFJhbmdlMk1vZGVsUmFuZ2Uod2lkZ2V0U2VsZWN0aW9uKTsKLQkJCWlmIChkb2N1bWVudFNlbGVjdGlvbiA9PSBudWxsKQotCQkJCWRvY3VtZW50U2VsZWN0aW9uID0gd2lkZ2V0U2VsZWN0aW9uOwotCQkJdW5kb01hbmFnZXIuYmVnaW5SZWNvcmRpbmcodGhpcywgbGFiZWwsIGRlc2NyaXB0aW9uLCBkb2N1bWVudFNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgZG9jdW1lbnRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gVE9ETzogaG93IHRvIGhhbmRsZSBvdGhlciBkb2N1bWVudCB0eXBlcz8KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGVuZEJhY2tncm91bmRVcGRhdGUoKSB7Ci0JCWZCYWNrZ3JvdW5kdXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlOwotCQlzZXRSZWRyYXcodHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGlzcG9zZSgpIHsKLQkJTG9nZ2VyLnRyYWNlKCJTb3VyY2UgRWRpdG9yIiwgIlN0cnVjdHVyZWRUZXh0Vmlld2VyOjpoYW5kbGVEaXNwb3NlIGVudHJ5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCS8vIGJlZm9yZSB3ZSBkaXNwb3NlLCB3ZSBzZXQgYSBzcGVjaWFsICJlbXB0eSIgc2VsZWN0aW9uLCB0byBwcmV2ZW50Ci0JCS8vIHRoZSAibGVhayBvbmUgZG9jdW1lbnQiIHRoYXQKLQkJLy8gb3RoZXJ3aXNlIG9jY3VycyB3aGVuIGVkaXRvciBjbG9zZWQgKHNpbmNlIGxhc3Qgc2VsZWN0aW9uIHN0YXlzIGluCi0JCS8vIFNlbGVjdGVkUmVzb3VyY2VNYW5hZ2VyLgotCQkvLyB0aGUgb2NjdXJhbmNlIG9mIHRoZSAibGVhayIgaXNuJ3Qgc28gYmFkLCBidXQgbWFrZXMgZGVidWdnaW5nIG90aGVyCi0JCS8vIGxlYWtzIHZlcnkgaGFyZC4KLQkJc2V0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24uZW1wdHlTZWxlY3Rpb24oKSk7Ci0KLQkJaWYgKGZIaWdobGlnaHRlciAhPSBudWxsKSB7Ci0JCQlmSGlnaGxpZ2h0ZXIudW5pbnN0YWxsKCk7Ci0JCQlmSGlnaGxpZ2h0ZXIgPSBudWxsOwotCQl9Ci0JCQotCQlpZiAoZlJlY0hpZ2hsaWdodGVyICE9IG51bGwpIHsKLQkJCWZSZWNIaWdobGlnaHRlci51bmluc3RhbGwoKTsKLQkJCWZSZWNIaWdobGlnaHRlciA9IG51bGw7Ci0JCX0KLQkJc3VwZXIuaGFuZGxlRGlzcG9zZSgpOwotCi0JCUxvZ2dlci50cmFjZSgiU291cmNlIEVkaXRvciIsICJTdHJ1Y3R1cmVkVGV4dFZpZXdlcjo6aGFuZGxlRGlzcG9zZSBleGl0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qCi0JICogT3ZlcnJpZGRlbiBmb3Igc3BlY2lhbCBzdXBwb3J0IG9mIGJhY2tncm91bmQgdXBkYXRlIGFuZCByZWFkLW9ubHkKLQkgKiByZWdpb25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlVmVyaWZ5RXZlbnQoVmVyaWZ5RXZlbnQgZSkgewotCQlJUmVnaW9uIG1vZGVsUmFuZ2UgPSBldmVudDJNb2RlbFJhbmdlKGUpOwotCQlpZiAoZXhwb3NlTW9kZWxSYW5nZShtb2RlbFJhbmdlKSkgewotCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZkV2ZW50Q29uc3VtZXIgIT0gbnVsbCkgewotCQkJZkV2ZW50Q29uc3VtZXIucHJvY2Vzc0V2ZW50KGUpOwotCQkJaWYgKCFlLmRvaXQpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChmQmFja2dyb3VuZHVwZGF0ZUluUHJvZ3Jlc3MpIHsKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJYmVlcCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBmb3IgcmVhZC1vbmx5IHN1cHBvcnQKLQkJaWYgKGNvbnRhaW5zUmVhZE9ubHkoZ2V0VmlzaWJsZURvY3VtZW50KCksIGUuc3RhcnQsIGUuZW5kKSkgewotCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQliZWVwKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgewotCQkJc3VwZXIuaGFuZGxlVmVyaWZ5RXZlbnQoZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7Ci0JCQkvKgotCQkJICogTm90ZSwgd2UgY2F0Y2ggYW5kIGxvZyBhbnkgZXhjZXB0aW9uLCBzaW5jZSBhbiBvdGhlcndpc2UgY2FuCi0JCQkgKiBhY3R1YWxseSBwcmV2ZW50IHR5cGluZyEgc2VlCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExMzE4Ci0JCQkgKi8KLQotCQkJaWYgKFRSQUNFX0VYQ0VQVElPTlMpCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiU3RydWN0dXJlZFRleHRWaWV3ZXIuZXhjZXB0aW9uLnZlcmlmeVRleHQiLCB4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIGludCBtb2RlbExpbmUyV2lkZ2V0TGluZShpbnQgbW9kZWxMaW5lKSB7Ci0JCS8qKgotCQkgKiBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIGEgd29ya2Fyb3VuZCBmb3IgQnVnIDg1NzA5Ci0JCSAqLwotCQlpZiAoZkluZm9ybWF0aW9uTWFwcGluZyA9PSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlJUmVnaW9uIG1vZGVsTGluZVJlZ2lvbiA9IGdldERvY3VtZW50KCkuZ2V0TGluZUluZm9ybWF0aW9uKG1vZGVsTGluZSk7Ci0JCQkJCUlSZWdpb24gcmVnaW9uID0gZ2V0TW9kZWxDb3ZlcmFnZSgpOwotCQkJCQlpZiAobW9kZWxMaW5lUmVnaW9uICE9IG51bGwgJiYgcmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCWludCBtb2RlbEVuZCA9IG1vZGVsTGluZVJlZ2lvbi5nZXRPZmZzZXQoKSArIG1vZGVsTGluZVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQkJCWludCByZWdpb25FbmQgPSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJCQkvLyByZXR1cm5zIC0xIGlmIG1vZGVsTGluZSBpcyBpbnZhbGlkCi0JCQkJCQlpZiAoKG1vZGVsTGluZVJlZ2lvbi5nZXRPZmZzZXQoKSA8IHJlZ2lvbi5nZXRPZmZzZXQoKSkgfHwgKG1vZGVsRW5kID4gcmVnaW9uRW5kKSkKLQkJCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gcmV0dXJucyAtMSBpZiBtb2RlbExpbmUgaXMgaW52YWxpZAotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5tb2RlbExpbmUyV2lkZ2V0TGluZShtb2RlbExpbmUpOwotCX0KLQotCXB1YmxpYyBpbnQgbW9kZWxPZmZzZXQyV2lkZ2V0T2Zmc2V0KGludCBtb2RlbE9mZnNldCkgewotCQkvKioKLQkJICogbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBhIHdvcmthcm91bmQgZm9yIEJ1ZyA4NTcwOQotCQkgKi8KLQkJaWYgKGZJbmZvcm1hdGlvbk1hcHBpbmcgPT0gbnVsbCkgewotCQkJSVJlZ2lvbiByZWdpb24gPSBnZXRNb2RlbENvdmVyYWdlKCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkvLyByZXR1cm5zIC0xIGlmIG1vZGVsT2Zmc2V0IGlzIGludmFsaWQKLQkJCQlpZiAobW9kZWxPZmZzZXQgPCByZWdpb24uZ2V0T2Zmc2V0KCkgfHwgbW9kZWxPZmZzZXQgPiAocmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSkKLQkJCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5tb2RlbE9mZnNldDJXaWRnZXRPZmZzZXQobW9kZWxPZmZzZXQpOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIG1vZGVsUmFuZ2UyV2lkZ2V0UmFuZ2UoSVJlZ2lvbiBtb2RlbFJhbmdlKSB7Ci0JCS8vIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgd29ya2Fyb3VuZCBmb3IgQnVnODU3MDkKLQkJaWYgKGZJbmZvcm1hdGlvbk1hcHBpbmcgPT0gbnVsbCkgewotCQkJSVJlZ2lvbiByZWdpb24gPSBnZXRNb2RlbENvdmVyYWdlKCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwgJiYgbW9kZWxSYW5nZSAhPSBudWxsKSB7Ci0JCQkJaW50IG1vZGVsRW5kID0gbW9kZWxSYW5nZS5nZXRPZmZzZXQoKSArIG1vZGVsUmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0JCQkJaW50IHJlZ2lvbkVuZCA9IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQkvLyByZXR1cm5zIG51bGwgaWYgbW9kZWxSYW5nZSBpcyBpbnZhbGlkCi0JCQkJaWYgKChtb2RlbFJhbmdlLmdldE9mZnNldCgpIDwgcmVnaW9uLmdldE9mZnNldCgpKSB8fCAobW9kZWxFbmQgPiByZWdpb25FbmQpKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIubW9kZWxSYW5nZTJXaWRnZXRSYW5nZShtb2RlbFJhbmdlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIjc2V0RG9jdW1lbnQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIElBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsLCBpbnQgbW9kZWxSYW5nZU9mZnNldCwgaW50IG1vZGVsUmFuZ2VMZW5ndGgpIHsKLQkJLy8gcGFydGlhbCBmaXggZm9yOgotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTk3MAotCQkvLyB3aGVuIG91ciBkb2N1bWVudCBpcyBzZXQsIGVzcGVjaWFsbHkgdG8gbnVsbCBkdXJpbmcgY2xvc2UsCi0JCS8vIGltbWVkaWF0ZWx5IHVuaW5zdGFsbCB0aGUgcmVjb25jaWxlci4KLQkJLy8gdGhpcyBpcyB0byBhdm9pZCBhbiB1bm5lY2Vzc2FyeSBmaW5hbCAicmVjb25jaWxlIgotCQkvLyB0aGF0IGJsb2NrcyBkaXNwbGF5IHRocmVhZAotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJaWYgKGZSZWNvbmNpbGVyICE9IG51bGwpIHsKLQkJCQlmUmVjb25jaWxlci51bmluc3RhbGwoKTsKLQkJCX0KLQkJfQotCi0JCXN1cGVyLnNldERvY3VtZW50KGRvY3VtZW50LCBhbm5vdGF0aW9uTW9kZWwsIG1vZGVsUmFuZ2VPZmZzZXQsIG1vZGVsUmFuZ2VMZW5ndGgpOwotCi0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50OwotCi0JCQkvLyBub3RpZnkgaGlnaGxpZ2h0ZXIKLQkJCXVwZGF0ZUhpZ2hsaWdodGVyKHN0cnVjdHVyZWREb2N1bWVudCk7Ci0KLQkJCS8vIHNldCB0aGUgZm9ybWF0dGVyIGFnYWluIG5vdyB0aGF0IGRvY3VtZW50IGhhcyBiZWVuIHNldAotCQkJaWYgKCFmRm9ybWF0dGVyU2V0ICYmIGZDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCQlmQ29udGVudEZvcm1hdHRlciA9IGZDb25maWd1cmF0aW9uLmdldENvbnRlbnRGb3JtYXR0ZXIodGhpcyk7Ci0JCQkJZkZvcm1hdHRlclNldCA9IHRydWU7Ci0JCQl9Ci0KLQkJCS8vIHNldCBkb2N1bWVudCBpbiB0aGUgdmlld2VyLWJhc2VkIHVuZG8gbWFuYWdlcgotCQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJZlVuZG9NYW5hZ2VyLmRpc2Nvbm5lY3QoKTsKLQkJCQlmVW5kb01hbmFnZXIuY29ubmVjdCh0aGlzKTsKLQkJCX0KLQkJCS8vIENhcmV0RXZlbnQgaXMgbm90IHNlbnQgdG8gVmlld2VyU2VsZWN0aW9uTWFuYWdlciBhZnRlciBTYXZlIEFzLgotCQkJLy8gTmVlZCB0byBub3RpZnkgVmlld2VyU2VsZWN0aW9uTWFuYWdlciBoZXJlLgotCQkJLy8gbm90aWZ5Vmlld2VyU2VsZWN0aW9uTWFuYWdlcihnZXRTZWxlY3RlZFJhbmdlKCkueCwKLQkJCS8vIGdldFNlbGVjdGVkUmFuZ2UoKS55KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVuaW5zdGFsbHMgYW55dGhpbmcgdGhhdCB3YXMgaW5zdGFsbGVkIGJ5IGNvbmZpZ3VyZQotCSAqLwotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlKCkgewotCQlMb2dnZXIudHJhY2UoIlNvdXJjZSBFZGl0b3IiLCAiU3RydWN0dXJlZFRleHRWaWV3ZXI6OnVuY29uZmlndXJlIGVudHJ5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAoZkhpZ2hsaWdodGVyICE9IG51bGwpIHsKLQkJCWZIaWdobGlnaHRlci51bmluc3RhbGwoKTsKLQkJCWZIaWdobGlnaHRlciA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmIChmUmVjSGlnaGxpZ2h0ZXIgIT0gbnVsbCkgewotCQkJZlJlY0hpZ2hsaWdodGVyLnVuaW5zdGFsbCgpOwotCQkJZlJlY0hpZ2hsaWdodGVyID0gbnVsbDsKLQkJfQotCi0JCWlmIChmQW5ub3RhdGlvbkhvdmVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXIpIHsKLQkJCSgoU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXIpIGZBbm5vdGF0aW9uSG92ZXIpLnJlbGVhc2UoKTsKLQkJfQotCi0JCWlmIChmT3ZlcnZpZXdSdWxlckFubm90YXRpb25Ib3ZlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyKSB7Ci0JCQkoKFN0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyKSBmT3ZlcnZpZXdSdWxlckFubm90YXRpb25Ib3ZlcikucmVsZWFzZSgpOwotCQl9Ci0KLQkJc3VwZXIudW5jb25maWd1cmUoKTsKLQkJZkNvbmZpZ3VyYXRpb24gPSBudWxsOwotCQlMb2dnZXIudHJhY2UoIlNvdXJjZSBFZGl0b3IiLCAiU3RydWN0dXJlZFRleHRWaWV3ZXI6OnVuY29uZmlndXJlIGV4aXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudW5kby5JRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciN1bmRvT3BlcmF0aW9uU2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudW5kby5VbmRvRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvT3BlcmF0aW9uU2VsZWN0aW9uQ2hhbmdlZChVbmRvRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0UmVxdWVzdGVyKCkgIT0gbnVsbCAmJiBldmVudC5nZXRSZXF1ZXN0ZXIoKS5lcXVhbHModGhpcykgJiYgZXZlbnQuZ2V0RG9jdW1lbnQoKS5lcXVhbHMoZ2V0RG9jdW1lbnQoKSkpIHsKLQkJCS8vIEJVRzEwNzY4NzogVW5kby9yZWRvIGRvIG5vdCBzY3JvbGwgZWRpdG9yCi0JCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgVGV4dFNlbGVjdGlvbihldmVudC5nZXRPZmZzZXQoKSwgZXZlbnQuZ2V0TGVuZ3RoKCkpOwotCQkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlSGlnaGxpZ2h0ZXIoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlib29sZWFuIGRvY3VtZW50U2V0ID0gZmFsc2U7Ci0JCQotCQkvLyBpZiBoaWdobGlnaHRlciBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQsIGluaXRpYWxpemUgYW5kIGluc3RhbGwgaXQKLQkJaWYgKGZSZWNIaWdobGlnaHRlciA9PSBudWxsICYmIGZDb25maWd1cmF0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKSB7Ci0JCQlTdHJpbmdbXSB0eXBlcyA9IGZDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXModGhpcyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHQgPSB0eXBlc1tpXTsKLQotCQkJCS8vIGFkZCBoaWdobGlnaHRlci9saW5lc3R5bGVwcm92aWRlcgotCQkJCUxpbmVTdHlsZVByb3ZpZGVyW10gcHJvdmlkZXJzID0gKChTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24pIGZDb25maWd1cmF0aW9uKS5nZXRMaW5lU3R5bGVQcm92aWRlcnModGhpcywgdCk7Ci0JCQkJaWYgKHByb3ZpZGVycyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvdmlkZXJzLmxlbmd0aDsgKytqKSB7Ci0JCQkJCQkKLQkJCQkJCWlmKGZSZWNIaWdobGlnaHRlciA9PSBudWxsKSB7Ci0JCQkJCQkJZlJlY0hpZ2hsaWdodGVyID0gbmV3IFJlY29uY2lsZXJIaWdobGlnaHRlcigpOwotCQkJCQkJCSgoU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKSBmQ29uZmlndXJhdGlvbikuc2V0SGlnaGxpZ2h0ZXIoZlJlY0hpZ2hsaWdodGVyKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChwcm92aWRlcnNbal0gaW5zdGFuY2VvZiBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyKSB7Ci0JCQkJCQkJKChBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyKSBwcm92aWRlcnNbal0pLmluaXQoZG9jdW1lbnQsIGZSZWNIaWdobGlnaHRlcik7Ci0JCQkJCQkJZlJlY0hpZ2hsaWdodGVyLmFkZFByb3ZpZGVyKHQsIHByb3ZpZGVyc1tqXSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBpbml0IHdpdGggY29tcGF0aWJpbGl0eSBpbnN0YW5jZQotCQkJCQkJCWlmIChmSGlnaGxpZ2h0ZXIgPT0gbnVsbCkgewotCQkJCQkJCQlmSGlnaGxpZ2h0ZXIgPSBuZXcgQ29tcGF0aWJsZUhpZ2hsaWdodGVyKCk7Ci0JCQkJCQkJfQotCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJDb21wYXRpYmxlSGlnaGxpZ2h0ZXIgaW5zdGFsbGluZyBjb21wYXRpYmlsaXR5IGZvciAiICsgcHJvdmlkZXJzW2pdLmdldENsYXNzKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJcHJvdmlkZXJzW2pdLmluaXQoZG9jdW1lbnQsIGZIaWdobGlnaHRlcik7Ci0JCQkJCQkJZkhpZ2hsaWdodGVyLmFkZFByb3ZpZGVyKHQsIHByb3ZpZGVyc1tqXSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKGZSZWNIaWdobGlnaHRlciAhPSBudWxsKQotCQkJCWZSZWNIaWdobGlnaHRlci5pbnN0YWxsKHRoaXMpOwotCQkJaWYoZkhpZ2hsaWdodGVyICE9IG51bGwpIHsKLQkJCQlmSGlnaGxpZ2h0ZXIuc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoZkNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHRoaXMpKTsKLQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzMzQ3Ci0JCQkJLy8gbWFrZSBzdXJlIHRvIHNldCBkb2N1bWVudCBiZWZvcmUgaW5zdGFsbAotCQkJCWZIaWdobGlnaHRlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCQkJZkhpZ2hsaWdodGVyLmluc3RhbGwodGhpcyk7Ci0JCQkJZG9jdW1lbnRTZXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmIChmSGlnaGxpZ2h0ZXIgIT0gbnVsbCAmJiAhZG9jdW1lbnRTZXQpCi0JCQlmSGlnaGxpZ2h0ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQkKLQkJLy8gaW5zdGFsbCBjb250ZW50IHR5cGUgaW5kZXBlbmRlbnQgcGx1Z2lucwotCQlpZiAoZlByZXNlbnRhdGlvblJlY29uY2lsZXIgIT0gbnVsbCkKLQkJCWZQcmVzZW50YXRpb25SZWNvbmNpbGVyLnVuaW5zdGFsbCgpOwotCQkvLyAyMjg4NDcgLSBYU0wgQ29udGVudCBBc3Npc3QgdGVzdHMgZmFpbCB3aXRoIE51bGwgUG9pbnRlciBvbiBIaWdobGlnaHRlcgotCQlpZihmQ29uZmlndXJhdGlvbiAhPSBudWxsKQotCQkJZlByZXNlbnRhdGlvblJlY29uY2lsZXIgPSBmQ29uZmlndXJhdGlvbi5nZXRQcmVzZW50YXRpb25SZWNvbmNpbGVyKHRoaXMpOwotCQkKLQkJaWYgKGZQcmVzZW50YXRpb25SZWNvbmNpbGVyICE9IG51bGwpCi0JCQlmUHJlc2VudGF0aW9uUmVjb25jaWxlci5pbnN0YWxsKHRoaXMpOwotCi0JfQotCi0JLyoqCi0JICogTWFrZSBzdXJlIGluZGVudGF0aW9uIGlzIGNvcnJlY3QgYmVmb3JlIHVzaW5nLgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVJbmRlbnRhdGlvblByZWZpeGVzKCkgewotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBmQ29uZmlndXJhdGlvbjsKLQkJaWYgKGZDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIHR5cGVzID0gY29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHRoaXMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZ1tdIHByZWZpeGVzID0gY29uZmlndXJhdGlvbi5nZXRJbmRlbnRQcmVmaXhlcyh0aGlzLCB0eXBlc1tpXSk7Ci0JCQkJaWYgKHByZWZpeGVzICE9IG51bGwgJiYgcHJlZml4ZXMubGVuZ3RoID4gMCkKLQkJCQkJc2V0SW5kZW50UHJlZml4ZXMocHJlZml4ZXMsIHR5cGVzW2ldKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQcmVwZW5kcyB0aGUgdGV4dCBwcmVzZW50YXRpb24gbGlzdGVuZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdmlld2VyJ3MKLQkgKiBsaXN0IG9mIHRleHQgcHJlc2VudGF0aW9uIGxpc3RlbmVycy4gIElmIHRoZSBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQKLQkgKiB3aXRoIHRoZSB2aWV3ZXIgdGhpcyBjYWxsIG1vdmVzIHRoZSBsaXN0ZW5lciB0byB0aGUgYmVnaW5uaW5nIG9mCi0JICogdGhlIGxpc3QuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIHRleHQgcHJlc2VudGF0aW9uIGxpc3RlbmVyCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyB2b2lkIHByZXBlbmRUZXh0UHJlc2VudGF0aW9uTGlzdGVuZXIoSVRleHRQcmVzZW50YXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JCUFzc2VydC5pc05vdE51bGwobGlzdGVuZXIpOwotCi0JCWlmIChmVGV4dFByZXNlbnRhdGlvbkxpc3RlbmVycyA9PSBudWxsKQotCQkJZlRleHRQcmVzZW50YXRpb25MaXN0ZW5lcnM9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmVGV4dFByZXNlbnRhdGlvbkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQlmVGV4dFByZXNlbnRhdGlvbkxpc3RlbmVycy5hZGQoMCwgbGlzdGVuZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9UZXh0RHJvcEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1RleHREcm9wQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYmMzMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1RleHREcm9wQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBUZXh0RHJvcEFjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgVGV4dERyb3BBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdERyb3BBY3Rpb24gewotCXB1YmxpYyBib29sZWFuIHJ1bihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQsIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlyZXR1cm4gaW5zZXJ0KChTdHJpbmcpIGV2ZW50LmRhdGEsIHRhcmdldEVkaXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1RyYW5zZmVyQnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1RyYW5zZmVyQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDdkNjRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9UcmFuc2ZlckJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5Ecm9wQWN0aW9uUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi0vKioKLSAqIEJ1aWxkcyBkcm9wIHRhcmdldCB0cmFuc2ZlcnMsIGRyYWcgc291cmNlIHRyYW5zZmVycywgYW5kIGRyb3AgYWN0aW9ucwotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNmZXJCdWlsZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTUVUSE9EID0gIm1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUFJJT1JJVFkgPSAicHJpb3JpdHkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1NJTkdMRVRPTiA9ICJzaW5nbGV0b24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RBUkdFVF9JRCA9ICJ0YXJnZXRJRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFJBTlNGRVJfSUQgPSAidHJhbnNmZXJJRCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZGVidWdUaW1lID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvdHJhbnNmZXJidWlsZGVyL3RpbWUiKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMX0RSQUdfU09VUkNFX1RSQU5TRkVSUyA9ICJkcmFnU291cmNlVHJhbnNmZXJzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMX0RST1BfVEFSR0VUX1RSQU5TRkVSUyA9ICJkcm9wVGFyZ2V0VHJhbnNmZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBSSU9SSVRJRVMgPSB7ImhpZ2hlc3QiLCAiaGlnaCIsICJtaWQiLCAibG93IiwgImxvd2VzdCJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19EUkFHX1NPVVJDRV9DT05UUklCVVRJT04gPSAiZHJhZ1NvdXJjZUNvbnRyaWJ1dGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRFJPUF9BQ1RJT04gPSAiZHJvcEFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRFJPUF9UQVJHRVRfQ09OVFJJQlVUSU9OID0gImRyb3BUYXJnZXRDb250cmlidXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVFJBTlNGRVIgPSAidHJhbnNmZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGJvb2xlYW4gdXNlUHJveHk7Ci0KLQljbGFzcyBUcmFuc2ZlclByb3h5Rm9yRGVsYXlMb2FkaW5nIGV4dGVuZHMgVHJhbnNmZXIgewotCSAgICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCSAgICBwcml2YXRlIFN0cmluZyBjbGFzc0F0dHJpYnV0ZTsKLQkgICAgcHJpdmF0ZSBUcmFuc2ZlciBwcm94eTsKLSAgICAgICAgcHJpdmF0ZSBNZXRob2QgZ2V0VHlwZUlkc01ldGhvZCwgZ2V0VHlwZU5hbWVzTWV0aG9kLCBqYXZhVG9OYXRpdmVNZXRob2QsIG5hdGl2ZVRvSmF2YU1ldGhvZDsKLQotCSAgICBUcmFuc2ZlclByb3h5Rm9yRGVsYXlMb2FkaW5nKCkgewotCSAgICAgICAgc3VwZXIoKTsKLQkgICAgfQotCi0JICAgIFRyYW5zZmVyUHJveHlGb3JEZWxheUxvYWRpbmcoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsbSwgU3RyaW5nIGNsc0F0dHIpIHsKLQkgICAgICAgIHN1cGVyKCk7Ci0JICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbG07Ci0JICAgICAgICB0aGlzLmNsYXNzQXR0cmlidXRlID0gY2xzQXR0cjsKLQkgICAgfQotCSAgICAKLQkgICAgcHJpdmF0ZSBUcmFuc2ZlciBuZXdJbnN0YW5jZSgpIHsKLQkgICAgICAgIGlmICgoZWxlbWVudCAhPSBudWxsKSAmJiAoY2xhc3NBdHRyaWJ1dGUgIT0gbnVsbCkpIHsKLQkJICAgICAgICBPYmplY3QgbyA9IGNyZWF0ZUV4dGVuc2lvbihlbGVtZW50LCBjbGFzc0F0dHJpYnV0ZSk7Ci0JCSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUcmFuc2ZlcikgewotCQkgICAgICAgICAgICBlbGVtZW50ID0gbnVsbDsKLQkJICAgICAgICAgICAgY2xhc3NBdHRyaWJ1dGUgPSBudWxsOwotCQkgICAgICAgICAgICByZXR1cm4gKFRyYW5zZmVyKW87Ci0JCSAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgICAgcmV0dXJuIG51bGw7Ci0JICAgIH0KLQotCSAgICBwdWJsaWMgVHJhbnNmZXJEYXRhW10gZ2V0U3VwcG9ydGVkVHlwZXMoKSB7Ci0JICAgICAgICBpZiAocHJveHkgPT0gbnVsbCkgewotCSAgICAgICAgICAgIHByb3h5ID0gbmV3SW5zdGFuY2UoKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgcmV0dXJuIHByb3h5LmdldFN1cHBvcnRlZFR5cGVzKCk7Ci0JICAgICAgICB9Ci0JICAgICAgICByZXR1cm4gbmV3IFRyYW5zZmVyRGF0YVswXTsKLSAgICAgICAgfQotICAgICAgICBwcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpIHsKLQkgICAgICAgIGlmIChwcm94eSA9PSBudWxsKSB7Ci0JICAgICAgICAgICAgcHJveHkgPSBuZXdJbnN0YW5jZSgpOwotCSAgICAgICAgfQotCSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0VHlwZUlkc01ldGhvZCA9PSBudWxsKSB7Ci0gICAgCSAgICAgICAgICAgIENsYXNzIHJ1bnRpbWVDbGFzcyA9IHByb3h5LmdldENsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJ1bnRpbWVDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgIAkgICAgICAgICAgICB0cnkgewotICAgICAgICAJICAgICAgICAgICAgICAgIGdldFR5cGVJZHNNZXRob2QgPSBydW50aW1lQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImdldFR5cGVJZHMiLCBuZXcgQ2xhc3NbMF0pOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUeXBlSWRzTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIAkgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUNsYXNzID0gcnVudGltZUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgCSAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUNsYXNzID0gcnVudGltZUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgCSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoKGdldFR5cGVJZHNNZXRob2QgPT0gbnVsbCkgJiYgKGUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGdldFR5cGVJZHNNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZWQgSW50ZWdlcltdIHJldHVybiB0eXBlIHRvIGludFtdCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSByID0gKGludFtdKWdldFR5cGVJZHNNZXRob2QuaW52b2tlKHByb3h5LCBuZXcgT2JqZWN0WzBdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgociAhPSBudWxsKSAmJiAoci5sZW5ndGggPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIHJldCA9IG5ldyBpbnRbci5sZW5ndGhdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFtpXSA9IHJbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgaW50WzBdOwotICAgICAgICB9Ci0gICAgICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKSB7Ci0JICAgICAgICBpZiAocHJveHkgPT0gbnVsbCkgewotCSAgICAgICAgICAgIHByb3h5ID0gbmV3SW5zdGFuY2UoKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldFR5cGVOYW1lc01ldGhvZCA9PSBudWxsKSB7Ci0gICAgCSAgICAgICAgICAgIENsYXNzIHJ1bnRpbWVDbGFzcyA9IHByb3h5LmdldENsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJ1bnRpbWVDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgIAkgICAgICAgICAgICB0cnkgewotICAgICAgICAJICAgICAgICAgICAgICAgIGdldFR5cGVOYW1lc01ldGhvZCA9IHJ1bnRpbWVDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0VHlwZU5hbWVzIiwgbmV3IENsYXNzWzBdKTsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHlwZU5hbWVzTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIAkgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUNsYXNzID0gcnVudGltZUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgCSAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUNsYXNzID0gcnVudGltZUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgCSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoKGdldFR5cGVOYW1lc01ldGhvZCA9PSBudWxsKSAmJiAoZSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZ2V0VHlwZU5hbWVzTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nW10pZ2V0VHlwZU5hbWVzTWV0aG9kLmludm9rZShwcm94eSwgbmV3IE9iamVjdFswXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGVkVHlwZShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JICAgICAgICBpZiAocHJveHkgPT0gbnVsbCkgewotCSAgICAgICAgICAgIHByb3h5ID0gbmV3SW5zdGFuY2UoKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgcmV0dXJuIHByb3h5LmlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlckRhdGEpOwotCSAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIGphdmFUb05hdGl2ZShPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JICAgICAgICBpZiAocHJveHkgPT0gbnVsbCkgewotCSAgICAgICAgICAgIHByb3h5ID0gbmV3SW5zdGFuY2UoKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGphdmFUb05hdGl2ZU1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIHJ1bnRpbWVDbGFzcyA9IHByb3h5LmdldENsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJ1bnRpbWVDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgIAkgICAgICAgICAgICB0cnkgewotICAgICAgICAJICAgICAgICAgICAgICAgIGphdmFUb05hdGl2ZU1ldGhvZCA9IHJ1bnRpbWVDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiamF2YVRvTmF0aXZlIiwgbmV3IENsYXNzW117b2JqZWN0LmdldENsYXNzKCksIHRyYW5zZmVyRGF0YS5nZXRDbGFzcygpfSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICAJICAgICAgICAgICAgICAgIGphdmFUb05hdGl2ZU1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAJICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVDbGFzcyA9IHJ1bnRpbWVDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIAkgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVDbGFzcyA9IHJ1bnRpbWVDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIAkgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChqYXZhVG9OYXRpdmVNZXRob2QgPT0gbnVsbCkgJiYgKGUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGphdmFUb05hdGl2ZU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhVG9OYXRpdmVNZXRob2QuaW52b2tlKHByb3h5LCBuZXcgT2JqZWN0W117b2JqZWN0LCB0cmFuc2ZlckRhdGF9KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZTMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZTMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCSAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkgICAgICAgIGlmIChwcm94eSA9PSBudWxsKSB7Ci0JICAgICAgICAgICAgcHJveHkgPSBuZXdJbnN0YW5jZSgpOwotCSAgICAgICAgfQotCSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobmF0aXZlVG9KYXZhTWV0aG9kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgcnVudGltZUNsYXNzID0gcHJveHkuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVudGltZUNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlVG9KYXZhTWV0aG9kID0gcnVudGltZUNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJuYXRpdmVUb0phdmEiLCBuZXcgQ2xhc3NbXXt0cmFuc2ZlckRhdGEuZ2V0Q2xhc3MoKX0pOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVUb0phdmFNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQ2xhc3MgPSBydW50aW1lQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAJICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQ2xhc3MgPSBydW50aW1lQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAJICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobmF0aXZlVG9KYXZhTWV0aG9kID09IG51bGwpICYmIChlICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuYXRpdmVUb0phdmFNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZVRvSmF2YU1ldGhvZC5pbnZva2UocHJveHksIG5ldyBPYmplY3RbXXt0cmFuc2ZlckRhdGF9KTsKLSAgICAJICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgICAgIAkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0gICAgCSAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZTMpIHsKLSAgICAgICAgICAgICAgICAgICAJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTMpOwotICAgIAkgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCSAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3QoKTsKLSAgICAgICAgfQotICAgICAgICBUcmFuc2ZlciBnZXRUcmFuc2ZlckNsYXNzKCkgewotCSAgICAgICAgaWYgKHByb3h5ID09IG51bGwpIHsKLQkgICAgICAgICAgICBwcm94eSA9IG5ld0luc3RhbmNlKCk7Ci0JICAgICAgICB9Ci0JICAgICAgICByZXR1cm4gcHJveHk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIAlTdHJpbmcgY2xhenogPSBlbGVtZW50LmdldEF0dHJpYnV0ZShjbGFzc0F0dHJpYnV0ZSk7Ci0gICAgICAgIAlyZXR1cm4gY2xhenogIT0gbnVsbCA/IGNsYXp6IDogc3VwZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCX0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjbGFzc0F0dHJpYnV0ZQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jc3RhdGljIE9iamVjdCBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBmaW5hbCBTdHJpbmcgY2xhc3NBdHRyaWJ1dGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlPYmplY3Qgb2JqID0gbnVsbDsKLQotCQlTdHJpbmcgc2luZ2xldG9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1NJTkdMRVRPTik7Ci0JCVN0cmluZyBtZXRob2QgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTUVUSE9EKTsKLQkJaWYgKFRSVUUuZXF1YWxzSWdub3JlQ2FzZShzaW5nbGV0b24pICYmIG1ldGhvZCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQkJCUNsYXNzIGNscyA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCkubG9hZENsYXNzKG5hbWUpOwotCQkJCU1ldGhvZCBtdGQgPSBjbHMuZ2V0TWV0aG9kKG1ldGhvZCwgbmV3IENsYXNzW117fSk7Ci0KLQkJCQlvYmogPSBtdGQuaW52b2tlKG51bGwsIG51bGwpOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJb2JqID0gbnVsbDsKLQkJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJb2JqID0gbnVsbDsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCW9iaiA9IG51bGw7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlvYmogPSBudWxsOwotCQkJfQotCQl9IGVsc2UgewotCQkJb2JqID0gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYXNzQXR0cmlidXRlKTsKLQkJfQotCi0JCXJldHVybiBvYmo7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBleHRlbnNpb24uIElmIHRoZSBleHRlbnNpb24gcGx1Z2luIGhhcyBub3QgYmVlbiBsb2FkZWQgYQotCSAqIGJ1c3kgY3Vyc29yIHdpbGwgYmUgYWN0aXZhdGVkIGR1cmluZyB0aGUgZHVyYXRpb24gb2YgdGhlIGxvYWQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY2xhc3NBdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUV4dGVuc2lvbihmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgZmluYWwgU3RyaW5nIGNsYXNzQXR0cmlidXRlKSB7Ci0JCS8vIElmIHBsdWdpbiBoYXMgYmVlbiBsb2FkZWQgY3JlYXRlIGV4dGVuc2lvbi4KLQkJLy8gT3RoZXJ3aXNlLCBzaG93IGJ1c3kgY3Vyc29yIHRoZW4gY3JlYXRlIGV4dGVuc2lvbi4KLQkJZmluYWwgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsxXTsKLQkJU3RyaW5nIHBsdWdpbklkID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCWlmIChidW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGVsZW1lbnQsIGNsYXNzQXR0cmlidXRlKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24ocmVzdWx0LCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKG51bGwsIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRbMF0gPSBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGVsZW1lbnQsIGNsYXNzQXR0cmlidXRlKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24ocmVzdWx0LCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCXJldHVybiByZXN1bHRbMF07Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc3VsdAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24oT2JqZWN0W10gcmVzdWx0LCBUaHJvd2FibGUgZSkgewotCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQlyZXN1bHRbMF0gPSBudWxsOwotCi0JfQotCi0JcHJvdGVjdGVkIExpc3QgY2FjaGU7Ci0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRDb250cmlidXRpb25UYWc7Ci0KLQlwcm90ZWN0ZWQgTGlzdCB0YXJnZXRJRHM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gSURyb3BBY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSURyb3BBY3Rpb24gY3JlYXRlRHJvcEFjdGlvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlPYmplY3Qgb2JqID0gbnVsbDsKLQkJb2JqID0gY3JlYXRlRXh0ZW5zaW9uKGVsZW1lbnQsIEFUVF9DTEFTUyk7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIElEcm9wQWN0aW9uKSA/IChJRHJvcEFjdGlvbikgRHJvcEFjdGlvblByb3h5Lm5ld0luc3RhbmNlKG9iaikgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0cmFuc2ZlcklkCi0JICogQHJldHVybiBJRHJvcEFjdGlvbltdCi0JICovCi0JcHJvdGVjdGVkIElEcm9wQWN0aW9uW10gY3JlYXRlRHJvcEFjdGlvbnMoU3RyaW5nIHRyYW5zZmVySWQpIHsKLQkJaWYgKGNhY2hlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElEcm9wQWN0aW9uWzBdOwotCi0JCWZpbmFsIGludCBudW0gPSBjYWNoZS5zaXplKCk7Ci0JCWlmIChudW0gPT0gMCkKLQkJCXJldHVybiBuZXcgSURyb3BBY3Rpb25bMF07Ci0KLQkJSURyb3BBY3Rpb25bXSBhcyA9IG5ldyBJRHJvcEFjdGlvbltudW1dOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IHAgPSAwOyBwIDwgUFJJT1JJVElFUy5sZW5ndGg7IHArKykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBjYWNoZS5nZXQoaSk7Ci0JCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25FbGVtZW50KSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIG9iajsKLQkJCQlpZiAoIShUQUdfRFJPUF9BQ1RJT04uZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgfHwgISh0cmFuc2ZlcklkLmVxdWFscyhlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVFJBTlNGRVJfSUQpKSkpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKFBSSU9SSVRJRVNbcF0uZXF1YWxzKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QUklPUklUWSkpIHx8IChwID09IDIgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BSSU9SSVRZKSA9PSBudWxsKSkgewotCQkJCQlJRHJvcEFjdGlvbiBhID0gY3JlYXRlRHJvcEFjdGlvbihlbGVtZW50KTsKLQkJCQkJaWYgKGEgIT0gbnVsbCkgewotCQkJCQkJYXNbal0gPSBhOwotCQkJCQkJaisrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKG51bSA9PSBqKQotCQkJcmV0dXJuIGFzOwotCi0JCUlEcm9wQWN0aW9uW10gYXMyID0gbmV3IElEcm9wQWN0aW9uW2pdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGo7IGkrKykgewotCQkJYXMyW2ldID0gYXNbaV07Ci0JCX0KLQotCQlyZXR1cm4gYXMyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBUcmFuc2ZlcgotCSAqLwotCXByb3RlY3RlZCBUcmFuc2ZlciBjcmVhdGVUcmFuc2ZlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCSAgICBPYmplY3Qgb2JqID0gbnVsbDsKLQkgICAgaWYgKHVzZVByb3h5KSB7Ci0JICAgICAgICBvYmogPSBuZXcgVHJhbnNmZXJQcm94eUZvckRlbGF5TG9hZGluZyhlbGVtZW50LCBBVFRfQ0xBU1MpOwotCSAgICB9IGVsc2UgewotCSAgICAgICAgb2JqID0gY3JlYXRlRXh0ZW5zaW9uKGVsZW1lbnQsIEFUVF9DTEFTUyk7Ci0JICAgIH0KLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAob2JqIGluc3RhbmNlb2YgVHJhbnNmZXIpID8gKFRyYW5zZmVyKSBvYmogOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gVHJhbnNmZXJbXQotCSAqLwotCXByb3RlY3RlZCBUcmFuc2ZlcltdIGNyZWF0ZVRyYW5zZmVycygpIHsKLQkJaWYgKGNhY2hlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFRyYW5zZmVyWzBdOwotCi0JCWZpbmFsIGludCBudW0gPSBjYWNoZS5zaXplKCk7Ci0JCWlmIChudW0gPT0gMCkKLQkJCXJldHVybiBuZXcgVHJhbnNmZXJbMF07Ci0KLQkJVHJhbnNmZXJbXSB0cyA9IG5ldyBUcmFuc2ZlcltudW1dOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IHAgPSAwOyBwIDwgUFJJT1JJVElFUy5sZW5ndGg7IHArKykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBjYWNoZS5nZXQoaSk7Ci0JCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25FbGVtZW50KSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIG9iajsKLQkJCQlpZiAoIVRBR19UUkFOU0ZFUi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKQotCQkJCQljb250aW51ZTsKLQotCQkJCWlmIChQUklPUklUSUVTW3BdLmVxdWFscyhlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFJJT1JJVFkpKSB8fCAocCA9PSAyICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QUklPUklUWSkgPT0gbnVsbCkpIHsKLQkJCQkJVHJhbnNmZXIgdCA9IGNyZWF0ZVRyYW5zZmVyKGVsZW1lbnQpOwotCQkJCQlpZiAodCAhPSBudWxsKSB7Ci0JCQkJCQl0c1tqXSA9IHQ7Ci0JCQkJCQlqKys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAobnVtID09IGopCi0JCQlyZXR1cm4gdHM7Ci0KLQkJVHJhbnNmZXJbXSB0czIgPSBuZXcgVHJhbnNmZXJbal07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgajsgaSsrKSB7Ci0JCQl0czJbaV0gPSB0c1tpXTsKLQkJfQotCi0JCXJldHVybiB0czI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVkaXRvcklkCi0JICogQHJldHVybiBUcmFuc2ZlcltdCi0JICovCi0JcHVibGljIFRyYW5zZmVyW10gZ2V0RHJhZ1NvdXJjZVRyYW5zZmVycyhTdHJpbmcgZWRpdG9ySWQpIHsKLQkJcmV0dXJuIGdldERyYWdTb3VyY2VUcmFuc2ZlcnMobmV3IFN0cmluZ1tde2VkaXRvcklkfSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVkaXRvcklkcwotCSAqIEByZXR1cm4gVHJhbnNmZXJbXQotCSAqLwotCXB1YmxpYyBUcmFuc2ZlcltdIGdldERyYWdTb3VyY2VUcmFuc2ZlcnMoU3RyaW5nW10gZWRpdG9ySWRzKSB7Ci0JCWxvbmcgdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJcmVhZENvbnRyaWJ1dGlvbnMoZWRpdG9ySWRzLCBUQUdfRFJBR19TT1VSQ0VfQ09OVFJJQlVUSU9OLCBQTF9EUkFHX1NPVVJDRV9UUkFOU0ZFUlMpOwotCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IGNyZWF0ZVRyYW5zZmVycygpOwotCQlpZiAoZGVidWdUaW1lKQotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNnZXREcmFnU291cmNlVHJhbnNmZXJzKCIgKyBlZGl0b3JJZHMgKyAiKTogIiArIHRyYW5zZmVycy5sZW5ndGggKyAiIHRyYW5zZmVycyBjcmVhdGVkIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlyZXR1cm4gdHJhbnNmZXJzOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXREcm9wQWN0aW9ucyhTdHJpbmcgZWRpdG9ySWQsIFRyYW5zZmVyIHRyYW5zZmVyKSBmb3IgdGhlIHBlcmZvcm1hbmNlCi0JICogQHBhcmFtIGVkaXRvcklkCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEByZXR1cm4gSURyb3BBY3Rpb25bXQotCSAqLwotCXB1YmxpYyBJRHJvcEFjdGlvbltdIGdldERyb3BBY3Rpb25zKFN0cmluZyBlZGl0b3JJZCwgU3RyaW5nIHRyYW5zZmVyQ2xhc3NOYW1lKSB7Ci0JCXJldHVybiBnZXREcm9wQWN0aW9ucyhuZXcgU3RyaW5nW117ZWRpdG9ySWR9LCB0cmFuc2ZlckNsYXNzTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlZGl0b3JJZAotCSAqIEBwYXJhbSBjbGFzcwotCSAqIEByZXR1cm4gSURyb3BBY3Rpb25bXQotCSAqLwotCXB1YmxpYyBJRHJvcEFjdGlvbltdIGdldERyb3BBY3Rpb25zKFN0cmluZyBlZGl0b3JJZCwgVHJhbnNmZXIgdHJhbnNmZXIpIHsKLQkJcmV0dXJuIGdldERyb3BBY3Rpb25zKG5ldyBTdHJpbmdbXXtlZGl0b3JJZH0sIHRyYW5zZmVyKTsKLQl9Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldERyb3BBY3Rpb25zKFN0cmluZ1tdIGVkaXRvcklkcywgVHJhbnNmZXIgdHJhbnNmZXIpIGZvciB0aGUgcGVyZm9ybWFuY2UKLQkgKiBAcGFyYW0gZWRpdG9ySWQKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHJldHVybiBJRHJvcEFjdGlvbltdCi0JICovCi0JcHVibGljIElEcm9wQWN0aW9uW10gZ2V0RHJvcEFjdGlvbnMoU3RyaW5nW10gZWRpdG9ySWRzLCBTdHJpbmcgdHJhbnNmZXJDbGFzc05hbWUpIHsKLQkJbG9uZyB0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlyZWFkQ29udHJpYnV0aW9ucyhlZGl0b3JJZHMsIFRBR19EUk9QX1RBUkdFVF9DT05UUklCVVRJT04sIFBMX0RST1BfVEFSR0VUX1RSQU5TRkVSUyk7Ci0JCVN0cmluZyB0cmFuc2ZlcklkID0gZ2V0VHJhbnNmZXJJZE9mQ2xhc3NOYW1lKHRyYW5zZmVyQ2xhc3NOYW1lKTsKLQkJSURyb3BBY3Rpb25bXSBhY3Rpb25zID0gY3JlYXRlRHJvcEFjdGlvbnModHJhbnNmZXJJZCk7Ci0JCWlmIChkZWJ1Z1RpbWUpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2dldERyb3BBY3Rpb25zKCIgKyBlZGl0b3JJZHMgKyAiKTogIiArIGFjdGlvbnMubGVuZ3RoICsgIiBkcm9wIGFjdGlvbnMgY3JlYXRlZCBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVkaXRvcklkCi0JICogQHBhcmFtIGNsYXNzCi0JICogQHJldHVybiBJRHJvcEFjdGlvbltdCi0JICovCi0JcHVibGljIElEcm9wQWN0aW9uW10gZ2V0RHJvcEFjdGlvbnMoU3RyaW5nW10gZWRpdG9ySWRzLCBUcmFuc2ZlciB0cmFuc2ZlcikgewotCSAgICBTdHJpbmcgdHJhbnNmZXJDbGFzc05hbWU7Ci0JICAgIGlmICh0cmFuc2ZlciBpbnN0YW5jZW9mIFRyYW5zZmVyUHJveHlGb3JEZWxheUxvYWRpbmcpIHsKLQkgICAgICAgIHRyYW5zZmVyQ2xhc3NOYW1lID0gKChUcmFuc2ZlclByb3h5Rm9yRGVsYXlMb2FkaW5nKXRyYW5zZmVyKS5nZXRUcmFuc2ZlckNsYXNzKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JICAgIH0gZWxzZSB7Ci0JICAgICAgICB0cmFuc2ZlckNsYXNzTmFtZSA9IHRyYW5zZmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCSAgICB9Ci0JICAgIHJldHVybiBnZXREcm9wQWN0aW9ucyhlZGl0b3JJZHMsIHRyYW5zZmVyQ2xhc3NOYW1lKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGVkaXRvcklkCi0JICogQHJldHVybiBUcmFuc2ZlcltdCi0JICovCi0JcHVibGljIFRyYW5zZmVyW10gZ2V0RHJvcFRhcmdldFRyYW5zZmVycyhTdHJpbmcgZWRpdG9ySWQpIHsKLQkJcmV0dXJuIGdldERyb3BUYXJnZXRUcmFuc2ZlcnMobmV3IFN0cmluZ1tde2VkaXRvcklkfSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVkaXRvcklkcwotCSAqIEByZXR1cm4gVHJhbnNmZXJbXQotCSAqLwotCXB1YmxpYyBUcmFuc2ZlcltdIGdldERyb3BUYXJnZXRUcmFuc2ZlcnMoU3RyaW5nW10gZWRpdG9ySWRzKSB7Ci0JCWxvbmcgdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJcmVhZENvbnRyaWJ1dGlvbnMoZWRpdG9ySWRzLCBUQUdfRFJPUF9UQVJHRVRfQ09OVFJJQlVUSU9OLCBQTF9EUk9QX1RBUkdFVF9UUkFOU0ZFUlMpOwotCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IGNyZWF0ZVRyYW5zZmVycygpOwotCQlpZiAoZGVidWdUaW1lKSB7Ci0JCQlTdHJpbmcgaWRsaXN0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChlZGl0b3JJZHMubGVuZ3RoID4gMCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9ySWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlkbGlzdCArPSBlZGl0b3JJZHNbaV07Ci0JCQkJCWlmIChpIDwgZWRpdG9ySWRzLmxlbmd0aCAtIDEpCi0JCQkJCQlpZGxpc3QgKz0gIiwiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNnZXREcm9wVGFyZ2V0VHJhbnNmZXJzKCIgKyBpZGxpc3QgKyAiKTogIiArIHRyYW5zZmVycy5sZW5ndGggKyAiIHRyYW5zZmVycyBjcmVhdGVkIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl9Ci0JCXJldHVybiB0cmFuc2ZlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFydCBJRCBhdHRyaWJ1dGUgdGhhdCBpcyBleHBlY3RlZCBpbiB0aGUKLQkgKiB0YXJnZXQgZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhcmdldElEKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UQVJHRVRfSUQpOwotCQlyZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogIj8/PyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRUcmFuc2ZlcklkT2ZDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlTdHJpbmcgaWQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBpbnQgbnVtID0gY2FjaGUuc2l6ZSgpOwotCQlpZiAoY2xhc3NOYW1lID09IG51bGwgfHwgY2FjaGUgPT0gbnVsbCB8fCBudW0gPT0gMCkKLQkJCXJldHVybiBpZDsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gY2FjaGUuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDb25maWd1cmF0aW9uRWxlbWVudCkgewotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgb2JqOwotCQkJCWlmIChjbGFzc05hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUykpKSB7Ci0JCQkJCWlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChpZC5sZW5ndGgoKSAhPSAwID8gaWQgOiBjbGFzc05hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlYWRzIHRoZSBjb250cmlidXRpb25zIGZyb20gdGhlIHJlZ2lzdHJ5IGZvciB0aGUgcHJvdmlkZWQgd29ya2JlbmNoCi0JICogcGFydCBhbmQgdGhlIHByb3ZpZGVkIGV4dGVuc2lvbiBwb2ludCBJRC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gdGFnCi0JICogQHBhcmFtIGV4dGVuc2lvblBvaW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZENvbnRyaWJ1dGlvbnMoU3RyaW5nW10gaWRzLCBTdHJpbmcgdGFnLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJY2FjaGUgPSBudWxsOwotCQl0YXJnZXRJRHMgPSBBcnJheXMuYXNMaXN0KGlkcyk7Ci0JCXRhcmdldENvbnRyaWJ1dGlvblRhZyA9IHRhZzsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJcmVhZFJlZ2lzdHJ5KHJlZ2lzdHJ5LCBQTFVHSU5fSUQsIGV4dGVuc2lvblBvaW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdGFnID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCWlmICh0YWcuZXF1YWxzKHRhcmdldENvbnRyaWJ1dGlvblRhZykpIHsKLQkJCVN0cmluZyBpZCA9IGdldFRhcmdldElEKGVsZW1lbnQpOwotCQkJaWYgKGlkID09IG51bGwgfHwgIXRhcmdldElEcy5jb250YWlucyhpZCkpIHsKLQkJCQkvLyBUaGlzIGlzIG5vdCBvZiBpbnRlcmVzdCB0byB1cyAtIGRvbid0IGdvIGRlZXBlcgotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX1RSQU5TRkVSKSkgewotCQkJaWYgKGNhY2hlID09IG51bGwpCi0JCQkJY2FjaGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljYWNoZS5hZGQoZWxlbWVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsgLy8ganVzdCBjYWNoZSB0aGUgZWxlbWVudCAtIGRvbid0IGdvIGludG8gaXQKLQkJfSBlbHNlIGlmICh0YWcuZXF1YWxzKFRBR19EUk9QX0FDVElPTikpIHsKLQkJCWlmIChjYWNoZSA9PSBudWxsKQotCQkJCWNhY2hlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy9jYWNoZS5hZGQoY3JlYXRlQWN0aW9uRGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCQljYWNoZS5hZGQoZWxlbWVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsgLy8ganVzdCBjYWNoZSB0aGUgYWN0aW9uIC0gZG9uJ3QgZ28gaW50bwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmVhZEVsZW1lbnRDaGlsZHJlbihlbGVtZW50KTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gdXNlIFRyYW5zZmVyQnVpbGRlcihib29sZWFuIHVzZVByb3h5KSBmb3IgdGhlIHBlcmZvcm1hbmNlCi0JICovCi0JcHVibGljIFRyYW5zZmVyQnVpbGRlcigpIHsKLSAgICAgICAgdGhpcyhmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFRyYW5zZmVyQnVpbGRlcihib29sZWFuIHVzZVByb3h5KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMudXNlUHJveHkgPSB1c2VQcm94eTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZDJmODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1Vua25vd25Db250ZW50VHlwZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci0KLS8qKgotICogTWVzc2FnZSBkaWFsb2cgaW5mb3JtaW5nIHVzZXIgdGhhdCBhbiBlZGl0b3Igd2FzIG9wZW4gb24gdW5zdXBwb3J0ZWQKLSAqIGNvbnRlbnQgdHlwZQotICovCi1wdWJsaWMgY2xhc3MgVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgewotCi0JcHVibGljIFVua25vd25Db250ZW50VHlwZURpYWxvZyhTaGVsbCBwYXJlbnQsIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBrZXkpIHsKLQkJLy8gc2V0IG1lc3NhZ2UgdG8gbnVsbCBpbiBzdXBlciBzbyB0aGF0IG1lc3NhZ2UgZG9lcyBub3QgYXBwZWFyIHR3aWNlCi0JCXN1cGVyKHBhcmVudCwgU1NFVUlNZXNzYWdlcy5Vbmtub3duQ29udGVudFR5cGVEaWFsb2dfMCwgbnVsbCwgbnVsbCwgSU5GT1JNQVRJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMfSwgMCwgU1NFVUlNZXNzYWdlcy5Vbmtub3duQ29udGVudFR5cGVEaWFsb2dfMSwgZmFsc2UpOwotCQlzZXRQcmVmU3RvcmUoc3RvcmUpOwotCQlzZXRQcmVmS2V5KGtleSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0KLQkJLy8gb3ZlcndyaXR0ZW4gc28gdGhhdCB2YWx1ZSBzdG9yZWQgaXMgYm9vbGVhbiwgbm90IHN0cmluZwotCQlpZiAoYnV0dG9uSWQgIT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQgJiYgZ2V0VG9nZ2xlU3RhdGUoKSAmJiBnZXRQcmVmU3RvcmUoKSAhPSBudWxsICYmIGdldFByZWZLZXkoKSAhPSBudWxsKSB7Ci0JCQlzd2l0Y2ggKGJ1dHRvbklkKSB7Ci0JCQkJY2FzZSBJRGlhbG9nQ29uc3RhbnRzLllFU19JRCA6Ci0JCQkJY2FzZSBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQgOgotCQkJCWNhc2UgSURpYWxvZ0NvbnN0YW50cy5QUk9DRUVEX0lEIDoKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuT0tfSUQgOgotCQkJCQlnZXRQcmVmU3RvcmUoKS5zZXRWYWx1ZShnZXRQcmVmS2V5KCksIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJRGlhbG9nQ29uc3RhbnRzLk5PX0lEIDoKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuTk9fVE9fQUxMX0lEIDoKLQkJCQkJZ2V0UHJlZlN0b3JlKCkuc2V0VmFsdWUoZ2V0UHJlZktleSgpLCB0cnVlKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZU1lc3NhZ2VBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc3VwZXIuY3JlYXRlTWVzc2FnZUFyZWEoY29tcG9zaXRlKTsKLQkJTGluayBtZXNzYWdlTGluayA9IG5ldyBMaW5rKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQltZXNzYWdlTGluay5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nXzIpOwotCQltZXNzYWdlTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlsaW5rQ2xpY2tlZCgpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGlua0NsaWNrZWQoKSB7Ci0JCVN0cmluZyBwYWdlSWQgPSAib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLkNvbnRlbnRUeXBlcyI7IC8vJE5PTi1OTFMtMSQKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIHBhZ2VJZCwgbmV3IFN0cmluZ1tde3BhZ2VJZH0sIG51bGwpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0FjdGlvbkNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3Rpb25Db250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDAyOTMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0FjdGlvbkNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBEYXZpZCBDYXJ2ZXIvU1RBUiAtIFsyMTIzMzBdIGNhbid0IGNvbnRyaWJ1dGUgdG8gdGhlIFhNTCBvciBhbnkgU1NFIGJhc2VkIG1lbnUKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLS8vaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uR3JvdXBNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklDb250ZXh0TWVudUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RWRpdG9yQWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5SZXRhcmdldFRleHRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Hb3RvQW5ub3RhdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklFeHRlbmRlZENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnVpLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSB1c2VkIGluc2lkZSBtdWx0aSBwYWdlIGVkaXRvcidzCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciwgc2luY2UgY2FzY2FkZWQgaW5pdCgpIGNhbGwgZnJvbSB0aGUKLSAqIEFjdGlvbkJhckNvbnRyaWJ1dG9yIHdpbGwgY2F1c2VzIGV4Y2VwdGlvbiBhbmQgaXQgbGVhZHMgdG8gbG9zZSB3aG9sZQotICogdG9vbGJhcnMuCi0gKiAKLSAqIEluc3RlYWQsIHVzZSBTb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IgZm9yIHNvdXJjZSBwYWdlIGNvbnRyaWJ1dG9yIG9mCi0gKiBtdWx0aSBwYWdlIGVkaXRvci4KLSAqIAotICogTm90ZSB0aGF0IHRoaXMgY2xhc3MgaXMgc3RpbGwgdmFsaWQgZm9yIHNpbmdsZSBwYWdlIGVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uQ29udHJpYnV0b3IgZXh0ZW5kcyBUZXh0RWRpdG9yQWN0aW9uQ29udHJpYnV0b3IgaW1wbGVtZW50cyBJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IsIElFeHRlbmRlZENvbnRyaWJ1dG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBfc2hvd0RlYnVnU3RhdHVzID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvYWN0aW9uY29udHJpYnV0b3IvZGVidWdzdGF0dXNmaWVsZHMiKSkgfHwgUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKSB8fCBQbGF0Zm9ybS5pbkRldmVsb3BtZW50TW9kZSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVESVRPUl9JRFMgPSB7Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IifTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIElFeHRlbmRlZENvbnRyaWJ1dG9yIGV4dGVuZGVkQ29udHJpYnV0b3I7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmQWRkQmxvY2tDb21tZW50ID0gbnVsbDsKLQotCXByb3RlY3RlZCBTZXBhcmF0b3IgZkNvbW1hbmRzU2VwYXJhdG9yID0gbnVsbDsKLQotCXByaXZhdGUgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0gZkRlYnVnU3RhdHVzT2Zmc2V0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgTWVudU1hbmFnZXIgZkV4cGFuZFNlbGVjdGlvblRvTWVudSA9IG51bGw7Ci0JcHJvdGVjdGVkIEdyb3VwTWFya2VyIGZNZW51QWRkaXRpb25zR3JvdXBNYXJrZXIgPSBudWxsOwotCXByb3RlY3RlZCBHb3RvQW5ub3RhdGlvbkFjdGlvbiBmTmV4dEFubm90YXRpb24gPSBudWxsOwotCi0JcHJvdGVjdGVkIEdvdG9Bbm5vdGF0aW9uQWN0aW9uIGZQcmV2aW91c0Fubm90YXRpb24gPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlJlbW92ZUJsb2NrQ29tbWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmU2hpZnRMZWZ0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZTaGlmdFJpZ2h0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdBY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlN0cnVjdHVyZVNlbGVjdEhpc3RvcnlBY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlN0cnVjdHVyZVNlbGVjdE5leHRBY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzQWN0aW9uID0gbnVsbDsKLQotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlRvZ2dsZUNvbW1lbnQgPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlRvZ2dsZUluc2VydE1vZGVBY3Rpb247Ci0JcHJvdGVjdGVkIEdyb3VwTWFya2VyIGZUb29sYmFyQWRkaXRpb25zR3JvdXBNYXJrZXIgPSBudWxsOwotCXByb3RlY3RlZCBTZXBhcmF0b3IgZlRvb2xiYXJTZXBhcmF0b3IgPSBudWxsOwotCQotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkdvdG9NYXRjaGluZ0JyYWNrZXRBY3Rpb24gPSBudWxsOwotCi0JcHVibGljIEFjdGlvbkNvbnRyaWJ1dG9yKCkgewotCQlzdXBlcigpOwotCi0JCVJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCi0JCWZDb21tYW5kc1NlcGFyYXRvciA9IG5ldyBTZXBhcmF0b3IoKTsKLQotCQkvLyBlZGl0IGNvbW1hbmRzCi0JCWZTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdBY3Rpb24gPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9TVFJVQ1RVUkVfU0VMRUNUX0VOQ0xPU0lORyArIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVOREVSU0NPUkUpOwotCQlmU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nQWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLlNUUlVDVFVSRV9TRUxFQ1RfRU5DTE9TSU5HKTsKLQotCQlmU3RydWN0dXJlU2VsZWN0TmV4dEFjdGlvbiA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1NUUlVDVFVSRV9TRUxFQ1RfTkVYVCArIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVOREVSU0NPUkUpOwotCQlmU3RydWN0dXJlU2VsZWN0TmV4dEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5TVFJVQ1RVUkVfU0VMRUNUX05FWFQpOwotCi0JCWZTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c0FjdGlvbiA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1NUUlVDVFVSRV9TRUxFQ1RfUFJFVklPVVMgKyBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRFUlNDT1JFKTsKLQkJZlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzQWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLlNUUlVDVFVSRV9TRUxFQ1RfUFJFVklPVVMpOwotCi0JCWZTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5QWN0aW9uID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfU1RSVUNUVVJFX1NFTEVDVF9ISVNUT1JZICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ERVJTQ09SRSk7Ci0JCWZTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5QWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLlNUUlVDVFVSRV9TRUxFQ1RfSElTVE9SWSk7Ci0KLQkJZkV4cGFuZFNlbGVjdGlvblRvTWVudSA9IG5ldyBNZW51TWFuYWdlcihTU0VVSU1lc3NhZ2VzLkV4cGFuZFNlbGVjdGlvblRvTWVudV9sYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJZkV4cGFuZFNlbGVjdGlvblRvTWVudS5hZGQoZlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ0FjdGlvbik7Ci0JCWZFeHBhbmRTZWxlY3Rpb25Ub01lbnUuYWRkKGZTdHJ1Y3R1cmVTZWxlY3ROZXh0QWN0aW9uKTsKLQkJZkV4cGFuZFNlbGVjdGlvblRvTWVudS5hZGQoZlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzQWN0aW9uKTsKLQkJZkV4cGFuZFNlbGVjdGlvblRvTWVudS5hZGQoZlN0cnVjdHVyZVNlbGVjdEhpc3RvcnlBY3Rpb24pOwotCi0JCS8vIHNvdXJjZSBjb21tYW5kcwotCQlmU2hpZnRSaWdodCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlNISUZUX1JJR0hUICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ERVJTQ09SRSk7Ci0JCWZTaGlmdFJpZ2h0LnNldEFjdGlvbkRlZmluaXRpb25JZChJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuU0hJRlRfUklHSFQpOwotCi0JCWZTaGlmdExlZnQgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5TSElGVF9MRUZUICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ERVJTQ09SRSk7Ci0JCWZTaGlmdExlZnQuc2V0QWN0aW9uRGVmaW5pdGlvbklkKElUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5TSElGVF9MRUZUKTsKLQotCQlmVG9nZ2xlQ29tbWVudCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1RPR0dMRV9DT01NRU5UICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ERVJTQ09SRSk7Ci0JCWZUb2dnbGVDb21tZW50LnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLlRPR0dMRV9DT01NRU5UKTsKLQotCQlmQWRkQmxvY2tDb21tZW50ID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQUREX0JMT0NLX0NPTU1FTlQgKyBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRFUlNDT1JFKTsKLQkJZkFkZEJsb2NrQ29tbWVudC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5BRERfQkxPQ0tfQ09NTUVOVCk7Ci0KLQkJZlJlbW92ZUJsb2NrQ29tbWVudCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1JFTU9WRV9CTE9DS19DT01NRU5UICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ERVJTQ09SRSk7Ci0JCWZSZW1vdmVCbG9ja0NvbW1lbnQuc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuUkVNT1ZFX0JMT0NLX0NPTU1FTlQpOwotCi0JCS8vIGdvdG8gcHJldi9uZXh0IGVycm9yCi0JCS8vIENNVkMgMjQ5MDE3IGZvciBKYXZhRWRpdG9yIGNvbnNpc3RhbmN5Ci0JCWZQcmV2aW91c0Fubm90YXRpb24gPSBuZXcgR290b0Fubm90YXRpb25BY3Rpb24oIlByZXZpb3VzX2Fubm90YXRpb24iLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJZlByZXZpb3VzQW5ub3RhdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLnByZXZpb3VzIik7IC8vJE5PTi1OTFMtMSQKLQotCQlmTmV4dEFubm90YXRpb24gPSBuZXcgR290b0Fubm90YXRpb25BY3Rpb24oIk5leHRfYW5ub3RhdGlvbiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWZOZXh0QW5ub3RhdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLm5leHQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZHb3RvTWF0Y2hpbmdCcmFja2V0QWN0aW9uID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfR09UT19NQVRDSElOR19CUkFDS0VUICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ERVJTQ09SRSk7Ci0JCWZHb3RvTWF0Y2hpbmdCcmFja2V0QWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLkdPVE9fTUFUQ0hJTkdfQlJBQ0tFVCk7Ci0KLQkJLy8gUmVhZCBhY3Rpb24gZXh0ZW5zaW9ucy4KLQkJRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyKCk7Ci0JCWV4dGVuZGVkQ29udHJpYnV0b3IgPSBidWlsZGVyLnJlYWRBY3Rpb25FeHRlbnNpb25zKGdldEV4dGVuc2lvbklEcygpKTsKLQotCQlmTWVudUFkZGl0aW9uc0dyb3VwTWFya2VyID0gbmV3IEdyb3VwTWFya2VyKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX05BTUVfTUVOVV9BRERJVElPTlMpOwotCQlmVG9vbGJhclNlcGFyYXRvciA9IG5ldyBTZXBhcmF0b3IoKTsKLQkJZlRvb2xiYXJBZGRpdGlvbnNHcm91cE1hcmtlciA9IG5ldyBHcm91cE1hcmtlcihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9OQU1FX1RPT0xCQVJfQURESVRJT05TKTsKLQotCQlmVG9nZ2xlSW5zZXJ0TW9kZUFjdGlvbiA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICJFZGl0b3IuVG9nZ2xlSW5zZXJ0TW9kZS4iLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7IC8vJE5PTi1OTFMtMSQKLQkJZlRvZ2dsZUluc2VydE1vZGVBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5UT0dHTEVfSU5TRVJUX01PREUpOwotCi0JCWlmIChfc2hvd0RlYnVnU3RhdHVzKSB7Ci0JCQlmRGVidWdTdGF0dXNPZmZzZXQgPSBuZXcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuU1RBVFVTX0NBVEVHT1JZX09GRlNFVCwgdHJ1ZSwgMjApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCS8vIGVkaXQgY29tbWFuZHMKLS8qCQlJTWVudU1hbmFnZXIgZWRpdE1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElUKTsKLQkJaWYgKGVkaXRNZW51ICE9IG51bGwpIHsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZUb2dnbGVJbnNlcnRNb2RlQWN0aW9uKTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZFeHBhbmRTZWxlY3Rpb25Ub01lbnUpOwotCQkJZWRpdE1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQllZGl0TWVudS5hZGQoZk1lbnVBZGRpdGlvbnNHcm91cE1hcmtlcik7Ci0JCX0KLQotCQkvLyBzb3VyY2UgY29tbWFuZHMKLQkJU3RyaW5nIHNvdXJjZU1lbnVMYWJlbCA9IFNTRVVJTWVzc2FnZXMuU291cmNlTWVudV9sYWJlbDsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc291cmNlTWVudUlkID0gInNvdXJjZU1lbnVJZCI7IC8vIFRoaXMgaXMganVzdCBhIG1lbnUgaWQuIE5vIC8vJE5PTi1OTFMtMSQKLQkJLy8gbmVlZCB0byB0cmFuc2xhdGUuCi0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJSU1lbnVNYW5hZ2VyIHNvdXJjZU1lbnUgPSBuZXcgTWVudU1hbmFnZXIoc291cmNlTWVudUxhYmVsLCBzb3VyY2VNZW51SWQpOwotCQltZW51Lmluc2VydEFmdGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElULCBzb3VyY2VNZW51KTsKLQkJaWYgKHNvdXJjZU1lbnUgIT0gbnVsbCkgewotCQkJc291cmNlTWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZUb2dnbGVDb21tZW50KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZBZGRCbG9ja0NvbW1lbnQpOwotCQkJc291cmNlTWVudS5hZGQoZlJlbW92ZUJsb2NrQ29tbWVudCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmU2hpZnRSaWdodCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmU2hpZnRMZWZ0KTsKLQkJfQotCQkKLQkJSU1lbnVNYW5hZ2VyIGdvdG9NZW51ID0gbWVudS5maW5kTWVudVVzaW5nUGF0aChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkdPX1RPKTsKLQkJaWYgKGdvdG9NZW51ICE9IG51bGwpIHsKLQkJCWdvdG9NZW51LmFkZChmR290b01hdGNoaW5nQnJhY2tldEFjdGlvbik7Ci0JCX0KLSovCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9Qb3B1cE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJLy8gYWRkIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1N0YXR1c0xpbmUoSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJaWYgKF9zaG93RGVidWdTdGF0dXMpIHsKLQkJCW1hbmFnZXIuYWRkKGZEZWJ1Z1N0YXR1c09mZnNldCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7Ci0vKgkJdG9vbEJhck1hbmFnZXIuYWRkKGZUb29sYmFyU2VwYXJhdG9yKTsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKGZUb29sYmFyQWRkaXRpb25zR3JvdXBNYXJrZXIpOwotKi8JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51KTsKLQotCQlJTWVudU1hbmFnZXIgZWRpdE1lbnU9IG1lbnUuZmluZE1lbnVVc2luZ1BhdGgoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0VESVQpOwotCQlpZiAoZWRpdE1lbnUgIT0gbnVsbCkgewotCQkJZWRpdE1lbnUuYXBwZW5kVG9Hcm91cChJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfQURESVRJT05TLCBmVG9nZ2xlSW5zZXJ0TW9kZUFjdGlvbik7Ci0JCX0KLS8qCi0JCWFkZFRvTWVudShtZW51KTsKLSovCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvTWVudShtZW51KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb24uSVBvcHVwTWVudUNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb1BvcHVwTWVudShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1BvcHVwTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotLyoKLQkJYWRkVG9Qb3B1cE1lbnUobWVudSk7Ci0qLwotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb1BvcHVwTWVudShtZW51KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9TdGF0dXNMaW5lKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvU3RhdHVzTGluZShJU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlcikgewotCQlzdXBlci5jb250cmlidXRlVG9TdGF0dXNMaW5lKG1hbmFnZXIpOwotCi0JCWFkZFRvU3RhdHVzTGluZShtYW5hZ2VyKTsKLQotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUobWFuYWdlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvVG9vbEJhcih0b29sQmFyTWFuYWdlcik7Ci0KLS8qCQlhZGRUb1Rvb2xCYXIodG9vbEJhck1hbmFnZXIpOwotKi8KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkgewotCQkJZXh0ZW5kZWRDb250cmlidXRvci5jb250cmlidXRlVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBuZWVkIHRvIGNhbGwgc2V0QWN0aXZlRWRpdG9yIGJlZm9yZSBzdXBlci5kaXNwb3NlIGJlY2F1c2UgaW4gYm90aAotCQkvLyBzZXRBY3RpdmVFZGl0b3IgJiBzdXBlci5zZXRBY3RpdmVFZGl0b3IgaWYgZ2V0RWRpdG9yUGFydCA9PQotCQkvLyBhY3RpdmVFZGl0b3IsCi0JCS8vIHRoZSBtZXRob2QgaXMganVzdCByZXR1cm5lZC4gc28gdG8gZ2V0IGJvdGggbWV0aG9kcyB0byBydW4sCi0JCS8vIHNldEFjdGl2ZUVkaXRvcgotCQkvLyBuZWVkcyB0byBiZSBjYWxsZWQgc28gdGhhdCBpdCBjb3JyZWN0bHkgY2FsbHMgc3VwZXIuc2V0QWN0aXZlRWRpdG9yCi0JCXNldEFjdGl2ZUVkaXRvcihudWxsKTsKLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRFeHRlbnNpb25JRHMoKSB7Ci0JCXJldHVybiBFRElUT1JfSURTOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElUZXh0RWRpdG9yIGdldFRleHRFZGl0b3IoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCWlmICh0ZXh0RWRpdG9yID09IG51bGwgJiYgZWRpdG9yICE9IG51bGwpCi0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCXJldHVybiB0ZXh0RWRpdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2luaXQob3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnMsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGJhcnMsIElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLQkJc3VwZXIuaW5pdChiYXJzLCBwYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotCQlpZiAoZ2V0QWN0aXZlRWRpdG9yUGFydCgpID09IGFjdGl2ZUVkaXRvcikKLQkJCXJldHVybjsKLQkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0KLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IGdldFRleHRFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQotLyoJCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRBY3Rpb25CYXJzKCk7Ci0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuR09UT19ORVhUX0FOTk9UQVRJT04sIGZOZXh0QW5ub3RhdGlvbik7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLkdPVE9fUFJFVklPVVNfQU5OT1RBVElPTiwgZlByZXZpb3VzQW5ub3RhdGlvbik7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QUkVWSU9VUy5nZXRJZCgpLCBmUHJldmlvdXNBbm5vdGF0aW9uKTsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5Lk5FWFQuZ2V0SWQoKSwgZk5leHRBbm5vdGF0aW9uKTsKLQotCQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJREVBY3Rpb25GYWN0b3J5LkFERF9UQVNLLmdldElkKCksIGdldEFjdGlvbih0ZXh0RWRpdG9yLCBJREVBY3Rpb25GYWN0b3J5LkFERF9UQVNLLmdldElkKCkpKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSURFQWN0aW9uRmFjdG9yeS5CT09LTUFSSy5nZXRJZCgpLCBnZXRBY3Rpb24odGV4dEVkaXRvciwgSURFQWN0aW9uRmFjdG9yeS5CT09LTUFSSy5nZXRJZCgpKSk7Ci0JCQl9Ci0JCX0KLQotCQlmU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nQWN0aW9uLnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfU1RSVUNUVVJFX1NFTEVDVF9FTkNMT1NJTkcpKTsKLQkJZlN0cnVjdHVyZVNlbGVjdE5leHRBY3Rpb24uc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9TVFJVQ1RVUkVfU0VMRUNUX05FWFQpKTsKLQkJZlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzQWN0aW9uLnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfU1RSVUNUVVJFX1NFTEVDVF9QUkVWSU9VUykpOwotCQlmU3RydWN0dXJlU2VsZWN0SGlzdG9yeUFjdGlvbi5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1NUUlVDVFVSRV9TRUxFQ1RfSElTVE9SWSkpOwotCi0JCWZTaGlmdFJpZ2h0LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuU0hJRlRfUklHSFQpKTsKLQkJZlNoaWZ0TGVmdC5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlNISUZUX0xFRlQpKTsKLQotCQlmVG9nZ2xlQ29tbWVudC5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1RPR0dMRV9DT01NRU5UKSk7Ci0JCWZBZGRCbG9ja0NvbW1lbnQuc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9BRERfQkxPQ0tfQ09NTUVOVCkpOwotCQlmUmVtb3ZlQmxvY2tDb21tZW50LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfUkVNT1ZFX0JMT0NLX0NPTU1FTlQpKTsKLQotCQkvLyBnbyB0byBwcmV2L25leHQgZXJyb3IKLQkJLy8gQ01WQyAyNDkwMTcgZm9yIEphdmFFZGl0b3IgY29uc2lzdGFuY3kKLQkJZlByZXZpb3VzQW5ub3RhdGlvbi5zZXRFZGl0b3IodGV4dEVkaXRvcik7Ci0JCWZOZXh0QW5ub3RhdGlvbi5zZXRFZGl0b3IodGV4dEVkaXRvcik7Ci0JCWZHb3RvTWF0Y2hpbmdCcmFja2V0QWN0aW9uLnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfR09UT19NQVRDSElOR19CUkFDS0VUKSk7Ci0qLwotCQlmVG9nZ2xlSW5zZXJ0TW9kZUFjdGlvbi5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlRPR0dMRV9JTlNFUlRfTU9ERSkpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCX0KLQotCQlpZiAoX3Nob3dEZWJ1Z1N0YXR1cyAmJiB0ZXh0RWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3JFeHRlbnNpb24pIHsKLQkJCSgoSVRleHRFZGl0b3JFeHRlbnNpb24pIHRleHRFZGl0b3IpLnNldFN0YXR1c0ZpZWxkKGZEZWJ1Z1N0YXR1c09mZnNldCwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuU1RBVFVTX0NBVEVHT1JZX09GRlNFVCk7Ci0JCQlmRGVidWdTdGF0dXNPZmZzZXQuc2V0QWN0aXZlRWRpdG9yKHRleHRFZGl0b3IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLklTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciNzZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJZlRvZ2dsZUluc2VydE1vZGVBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLS8qCQlmU2hpZnRSaWdodC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmU2hpZnRMZWZ0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZOZXh0QW5ub3RhdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmUHJldmlvdXNBbm5vdGF0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0qLwotCQkvKgotCQkgKiBmQ29tbWVudC5zZXRFbmFibGVkKGVuYWJsZWQpOyBmVW5jb21tZW50LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCSAqLwotLyoJCQotCQlmVG9nZ2xlQ29tbWVudC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmQWRkQmxvY2tDb21tZW50LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZSZW1vdmVCbG9ja0NvbW1lbnQuc2V0RW5hYmxlZChlbmFibGVkKTsKLSovCQkKLQkJLy8gY29udmVydCBsaW5lIGRlbGltaXRlcnMgYXJlIG5vdCBzb3VyY2Ugdmlld2VyLXNwZWNpZmljCi0JCQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb24uSUV4dGVuZGVkQ29udHJpYnV0b3IjdXBkYXRlVG9vbGJhckFjdGlvbnMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRvb2xiYXJBY3Rpb25zKCkgewotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLnVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3Rpb25EZWZpbml0aW9uSWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3Rpb25EZWZpbml0aW9uSWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMjY5NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvQWN0aW9uRGVmaW5pdGlvbklkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBkZWZpbml0aW9ucyBpZHMgZm9yIGVkaXRvciBhY3Rpb25zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjdGlvbkRlZmluaXRpb25JZHMgewotCS8vIFRPRE86IENhbiB0aGVzZSBiZSBiZXR0ZXIgZGVmaW5lZCB3aXRoIGEgInBsdWdpbiBwcmVmaXgiIHRvIGJlIG1vcmUKLQkvLyBwb3J0YWJsZT8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfQkxPQ0tfQ09NTUVOVCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkZC5ibG9jay5jb21tZW50IjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTEVBTlVQX0RPQ1VNRU5UID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTU1FTlQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21tZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRURJVF9CUkVBS1BPSU5UUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmJyZWFrcG9pbnRzLmVkaXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGSU5EX09DQ1VSUkVOQ0VTID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1JNQVRfQUNUSVZFX0VMRU1FTlRTID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0LmFjdGl2ZS5lbGVtZW50cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPUk1BVF9ET0NVTUVOVCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmZvcm1hdC5kb2N1bWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BTkFHRV9CUkVBS1BPSU5UUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmJyZWFrcG9pbnRzLm1hbmFnZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9QRU5fRklMRSA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLm9wZW4uZmlsZS5mcm9tLnNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTU9WRV9CTE9DS19DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucmVtb3ZlLmJsb2NrLmNvbW1lbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFJVQ1RVUkVfU0VMRUNUX0VOQ0xPU0lORyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSVUNUVVJFX1NFTEVDVF9ISVNUT1JZID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSVUNUVVJFX1NFTEVDVF9ORVhUID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5uZXh0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSVUNUVVJFX1NFTEVDVF9QUkVWSU9VUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QucHJldmlvdXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUT0dHTEVfQ09NTUVOVCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZ2dsZS5jb21tZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVE9HR0xFX0JSRUFLUE9JTlRTID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuYnJlYWtwb2ludHMudG9nZ2xlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudW5jb21tZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0hPV19PVVRMSU5FID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucXVpY2tfb3V0bGluZSI7Ly8kTk9OLU5MUy0xJAotCi0JLy8gcmVnaXN0ZXJlZCBjb21tYW5kIElEcywgc28gd2UgcGljayB1cCB0aGUgZGVjbGFyZWQga2V5IGJpbmRpbmdzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR09UT19NQVRDSElOR19CUkFDS0VUPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5nb3RvLm1hdGNoaW5nLmJyYWNrZXQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3RpdmVFZGl0b3JBY3Rpb25IYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3RpdmVFZGl0b3JBY3Rpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NTg2ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvQWN0aXZlRWRpdG9yQWN0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgYWN0aW9ucyBhcmUgbm90IHByb3Blcmx5IGFjdGl2YXRlZCB3aXRoIHRoaXMgaGFuZGxlciBzbyBkbyBub3QKLSAqICAgICAgICAgICAgIHVzZQotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZlRWRpdG9yQWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElBY3Rpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgZkFjdGlvbklkOwotCXByaXZhdGUgSVdvcmtiZW5jaFNpdGUgZlNpdGU7Ci0JcHJpdmF0ZSBJQWN0aW9uIGZUYXJnZXRBY3Rpb247Ci0KLQlwdWJsaWMgQWN0aXZlRWRpdG9yQWN0aW9uSGFuZGxlcihJV29ya2JlbmNoU2l0ZSBzaXRlLCBTdHJpbmcgaWQpIHsKLQkJc3VwZXIoKTsKLQkJZkFjdGlvbklkID0gaWQ7Ci0JCWZTaXRlID0gc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRBY2NlbGVyYXRvcigpCi0JICovCi0JcHVibGljIGludCBnZXRBY2NlbGVyYXRvcigpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCXJldHVybiAoZlRhcmdldEFjdGlvbiAhPSBudWxsID8gZlRhcmdldEFjdGlvbi5nZXRBY2NlbGVyYXRvcigpIDogMCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRBY3Rpb25EZWZpbml0aW9uSWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJcmV0dXJuIChmVGFyZ2V0QWN0aW9uICE9IG51bGwgPyBmVGFyZ2V0QWN0aW9uLmdldEFjdGlvbkRlZmluaXRpb25JZCgpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCXJldHVybiAoZlRhcmdldEFjdGlvbiAhPSBudWxsID8gZlRhcmdldEFjdGlvbi5nZXREZXNjcmlwdGlvbigpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCXJldHVybiAoZlRhcmdldEFjdGlvbiAhPSBudWxsID8gZlRhcmdldEFjdGlvbi5nZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRIZWxwTGlzdGVuZXIoKQotCSAqLwotCXB1YmxpYyBIZWxwTGlzdGVuZXIgZ2V0SGVscExpc3RlbmVyKCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJcmV0dXJuIChmVGFyZ2V0QWN0aW9uICE9IG51bGwgPyBmVGFyZ2V0QWN0aW9uLmdldEhlbHBMaXN0ZW5lcigpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRIb3ZlckltYWdlRGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRIb3ZlckltYWdlRGVzY3JpcHRvcigpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCXJldHVybiAoZlRhcmdldEFjdGlvbiAhPSBudWxsID8gZlRhcmdldEFjdGlvbi5nZXRIb3ZlckltYWdlRGVzY3JpcHRvcigpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgaGFzaENvZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldEltYWdlRGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXVwZGF0ZVRhcmdldEFjdGlvbigpOwotCQlyZXR1cm4gKGZUYXJnZXRBY3Rpb24gIT0gbnVsbCA/IGZUYXJnZXRBY3Rpb24uZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldE1lbnVDcmVhdG9yKCkKLQkgKi8KLQlwdWJsaWMgSU1lbnVDcmVhdG9yIGdldE1lbnVDcmVhdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldFN0eWxlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0eWxlKCkgewotCQlyZXR1cm4gSUFjdGlvbi5BU19QVVNIX0JVVFRPTjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCXJldHVybiAoZlRhcmdldEFjdGlvbiAhPSBudWxsID8gZlRhcmdldEFjdGlvbi5nZXRUZXh0KCkgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJcmV0dXJuIChmVGFyZ2V0QWN0aW9uICE9IG51bGwgPyBmVGFyZ2V0QWN0aW9uLmdldFRvb2xUaXBUZXh0KCkgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2lzQ2hlY2tlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDaGVja2VkKCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJcmV0dXJuIChmVGFyZ2V0QWN0aW9uICE9IG51bGwgPyBmVGFyZ2V0QWN0aW9uLmlzQ2hlY2tlZCgpIDogdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNpc0VuYWJsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCXJldHVybiAoZlRhcmdldEFjdGlvbiAhPSBudWxsID8gZlRhcmdldEFjdGlvbi5pc0VuYWJsZWQoKSA6IGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2lzSGFuZGxlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIYW5kbGVkKCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJcmV0dXJuIChmVGFyZ2V0QWN0aW9uICE9IG51bGwgPyBmVGFyZ2V0QWN0aW9uLmlzSGFuZGxlZCgpIDogZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJaWYgKGZUYXJnZXRBY3Rpb24gIT0gbnVsbCkKLQkJCWZUYXJnZXRBY3Rpb24ucnVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW5XaXRoRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXVwZGF0ZVRhcmdldEFjdGlvbigpOwotCQlpZiAoZlRhcmdldEFjdGlvbiAhPSBudWxsKQotCQkJZlRhcmdldEFjdGlvbi5ydW5XaXRoRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIE5PVCBTVVBQT1JURUQKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEFjY2VsZXJhdG9yKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2NlbGVyYXRvcihpbnQga2V5Y29kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0QWN0aW9uRGVmaW5pdGlvbklkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aW9uRGVmaW5pdGlvbklkKFN0cmluZyBpZCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0Q2hlY2tlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXREZXNjcmlwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRFbmFibGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEhlbHBMaXN0ZW5lcihvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWxwTGlzdGVuZXIoSGVscExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRJZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0SW1hZ2VEZXNjcmlwdG9yKG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRNZW51Q3JlYXRvcihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lbnVDcmVhdG9yKElNZW51Q3JlYXRvciBjcmVhdG9yKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRUZXh0KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0VG9vbFRpcFRleHQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb29sVGlwVGV4dChTdHJpbmcgdGV4dCkgewotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVUYXJnZXRBY3Rpb24oKSB7Ci0JCWlmIChmU2l0ZSAhPSBudWxsICYmIGZTaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpICE9IG51bGwgJiYgZlNpdGUuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpICE9IG51bGwpIHsKLQkJCUlFZGl0b3JQYXJ0IHBhcnQgPSBmU2l0ZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQlJVGV4dEVkaXRvciBlZGl0b3IgPSBudWxsOwotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCQllZGl0b3IgPSAoSVRleHRFZGl0b3IpIHBhcnQ7Ci0JCQllbHNlCi0JCQkJZWRpdG9yID0gKElUZXh0RWRpdG9yKSAocGFydCAhPSBudWxsID8gcGFydC5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKSA6IG51bGwpOwotCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJZlRhcmdldEFjdGlvbiA9IGVkaXRvci5nZXRBY3Rpb24oZkFjdGlvbklkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZlRhcmdldEFjdGlvbiA9IG51bGw7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJZlRhcmdldEFjdGlvbiA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvQ2xlYW51cEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvQ2xlYW51cEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDRkZjJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0NsZWFudXBBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZXh0RWRpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENsZWFudXBBY3Rpb24gZXh0ZW5kcyBUZXh0RWRpdG9yQWN0aW9uIHsKLQlwcm90ZWN0ZWQgRGlhbG9nIGZDbGVhbnVwRGlhbG9nOwotCi0JcHVibGljIENsZWFudXBBY3Rpb24oUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBTdHJpbmcgcHJlZml4LCBJVGV4dEVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoYnVuZGxlLCBwcmVmaXgsIGVkaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IERpYWxvZyBnZXRDbGVhbnVwRGlhbG9nKFNoZWxsIHNoZWxsKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZ2V0Q2xlYW51cFByb2Nlc3NvcigpOwotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZ2V0VGV4dEVkaXRvcigpIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRFZGl0b3IpIHsKLQkJCWZpbmFsIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGVkaXRvciA9IChTdHJ1Y3R1cmVkVGV4dEVkaXRvcikgZ2V0VGV4dEVkaXRvcigpOwotCQkJRGlhbG9nIGNsZWFudXBEaWFsb2cgPSBnZXRDbGVhbnVwRGlhbG9nKGVkaXRvci5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQlpZiAoY2xlYW51cERpYWxvZyAhPSBudWxsKSB7Ci0JCQkJaWYgKGNsZWFudXBEaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCQkvLyBzZXR1cCBydW5uYWJsZQotCQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgY2xlYW51cFByb2Nlc3NvciA9IGdldENsZWFudXBQcm9jZXNzb3IoKTsKLQkJCQkJCQlpZiAoY2xlYW51cFByb2Nlc3NvciAhPSBudWxsKQotCQkJCQkJCQljbGVhbnVwUHJvY2Vzc29yLmNsZWFudXBNb2RlbChlZGl0b3IuZ2V0TW9kZWwoKSk7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0KLQkJCQkJLy8gVE9ETzogbWFrZSBpbmRlcGVuZGVudCBvZiAnbW9kZWwnLgotCQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gZWRpdG9yLmdldE1vZGVsKCk7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIGJlZ2luIHJlY29yZGluZwotCQkJCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgU1NFVUlNZXNzYWdlcy5DbGVhbnVwX0RvY3VtZW50X1VJXywgU1NFVUlNZXNzYWdlcy5DbGVhbnVwX0RvY3VtZW50X1VJXywgc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcKLQkJCQkJCQkvLyBtb2RlbCBjaGFuZ2UKLQkJCQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCQkJCS8vIHJ1bgotCQkJCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGVkaXRvci5nZXRUZXh0Vmlld2VyKCkuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgcnVubmFibGUpOwotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZwotCQkJCQkJCS8vIG1vZGVsCi0JCQkJCQkJLy8gY2hhbmdlCi0JCQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0KLQkJCQkJCQkvLyBlbmQgcmVjb3JkaW5nCi0JCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQltb2RlbC5lbmRSZWNvcmRpbmcodGhpcywgc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9Gb3JtYXRBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvRm9ybWF0QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQxMWI5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9Gb3JtYXRBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5Mb2NhdGlvbktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnMuTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Gb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRm9ybWF0QWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBSZXNvdXJjZUFjdGlvbkRlbGVnYXRlIHsKLQotCWNsYXNzIEZvcm1hdEpvYiBleHRlbmRzIEpvYiB7Ci0KLQkJcHVibGljIEZvcm1hdEpvYihTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIobmFtZSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLQkJCU9iamVjdFtdIGVsZW1lbnRzID0gZlNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgZWxlbWVudHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChlbGVtZW50c1tpXSBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCQlwcm9jZXNzKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSksIChJUmVzb3VyY2UpIGVsZW1lbnRzW2ldKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCX0KLQkJCW1vbml0b3IuZG9uZSgpOwotCi0JCQlpZiAoZkVycm9yU3RhdHVzLmdldENoaWxkcmVuKCkubGVuZ3RoID4gMCkgewotCQkJCXN0YXR1cyA9IGZFcnJvclN0YXR1czsKLQkJCQlmRXJyb3JTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfZXJyb3JTdGF0dXNNZXNzYWdlLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIE11bHRpU3RhdHVzIGZFcnJvclN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV9lcnJvclN0YXR1c01lc3NhZ2UsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJRmlsZSBmaWxlKSB7Ci0JCWlmKG1vbml0b3IgPT0gbnVsbCB8fCBtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQkJCi0JCXRyeSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMTAwKTsKLQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCW1vbml0b3Iud29ya2VkKDUpOwotCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gZ2V0Rm9ybWF0UHJvY2Vzc29yKGNvbnRlbnRUeXBlLmdldElkKCkpOwotCQkJCWlmIChmb3JtYXRQcm9jZXNzb3IgIT0gbnVsbCAmJiAobW9uaXRvciA9PSBudWxsIHx8ICFtb25pdG9yLmlzQ2FuY2VsZWQoKSkpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLkZvcm1hdEFjdGlvbkRlbGVnYXRlXzMsIG5ldyBTdHJpbmdbXXtmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSl9KTsJCQkJCW1vbml0b3Iuc3ViVGFzayhtZXNzYWdlKTsKLQkJCQkJZm9ybWF0UHJvY2Vzc29yLnNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsKLQkJCQkJZm9ybWF0UHJvY2Vzc29yLmZvcm1hdEZpbGUoZmlsZSk7Ci0JCQkJfQotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoOTUpOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbCBlKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfNSwgbmV3IFN0cmluZ1tde2ZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfSk7Ci0JCQlmRXJyb3JTdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLkZvcm1hdEFjdGlvbkRlbGVnYXRlXzQsIG5ldyBTdHJpbmdbXXtmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKX0pOwotCQkJZkVycm9yU3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBlKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLkZvcm1hdEFjdGlvbkRlbGVnYXRlXzQsIG5ldyBTdHJpbmdbXXtmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKX0pOwotCQkJZkVycm9yU3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBlKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0KLQkJLy8gTm90ZTogdGhlIHdvcmtiZW5jaCBzaG91bGQgYWx3YXlzIGhhdmUgYSBkaXNwbGF5Ci0JCS8vICh1bmxlc3MgcnVubmluZyBoZWFkbGVzcyksIHdoZXJlYXMgRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJLy8gb25seSByZXR1cm5zIHRoZSBkaXNwbGF5IGlmIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRocmVhZAotCQkvLyBoYXMgb25lLgotCQlpZiAoUGxhdGZvcm1VSS5pc1dvcmtiZW5jaFJ1bm5pbmcoKSkKLQkJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0KGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlmaW5hbCBJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLQkJCQotCQkJLy8gQlVHIDE3ODU5OCAtIElmIHRoZSByZXNvdXJjZSBpcyBzaGFyZWQsIGFuZCBpdCdzIHBvc3NpYmxlIHRvCi0JCQkvLyBnZXQgdGhlIHdvcmtiZW5jaCBEaXNwbGF5LCB0aGUgVUkgdGhyZWFkIGlzIGFza2VkIHRvIGV4ZWN1dGUgdGhlCi0JCQkvLyBmb3JtYXQgb2YgdGhlIGZpbGUgd2hlbiBpdCBjYW4KLQkJCXRyeSB7Ci0JCQkJSVRleHRGaWxlQnVmZmVyTWFuYWdlciBtYW5hZ2VyPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKTsKLQkJCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJCQkKLQkJCQl0cnkgewotCQkJCQlpZihtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJCW1hbmFnZXIuY29ubmVjdChmaWxlLmdldEZ1bGxQYXRoKCksIExvY2F0aW9uS2luZC5JRklMRSwgbW9uaXRvcik7Ci0JCQkJCQlidWZmZXIgPSBtYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKHJlc291cmNlLmdldEZ1bGxQYXRoKCksIExvY2F0aW9uS2luZC5JRklMRSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmKGJ1ZmZlciAhPSBudWxsICYmIGJ1ZmZlci5pc1NoYXJlZCgpKSB7Ci0JCQkJCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0JCQkJCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCWZvcm1hdChtb25pdG9yLCBmaWxlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQlmb3JtYXQobW9uaXRvciwgZmlsZSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZihtYW5hZ2VyICE9IG51bGwpCi0JCQkJCQltYW5hZ2VyLmRpc2Nvbm5lY3QoZmlsZS5nZXRGdWxsUGF0aCgpLCBMb2NhdGlvbktpbmQuSUZJTEUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV80LCBuZXcgU3RyaW5nW117ZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCl9KTsKLQkJCQlmRXJyb3JTdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmKG1vbml0b3IgIT0gbnVsbCkKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCQkKLQkJfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCUlDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIHJlc291cmNlOwotCQkJCi0JCQl0cnkgewotCQkJCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSBjb250YWluZXIubWVtYmVycygpOwotCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBtZW1iZXJzLmxlbmd0aCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChtb25pdG9yICE9IG51bGwgJiYgIW1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQkJZm9ybWF0KG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSksIG1lbWJlcnNbaV0pOwotCQkJCX0KLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV80LCBuZXcgU3RyaW5nW117cmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfSk7Ci0JCQkJZkVycm9yU3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZ2V0Rm9ybWF0UHJvY2Vzc29yKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCXJldHVybiBGb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0Rm9ybWF0UHJvY2Vzc29yKGNvbnRlbnRUeXBlSWQpOwotCX0KLQotCXByb3RlY3RlZCBKb2IgZ2V0Sm9iKCkgewotCQlyZXR1cm4gbmV3IEZvcm1hdEpvYihTU0VVSU1lc3NhZ2VzLkZvcm1hdEFjdGlvbkRlbGVnYXRlX2pvYk5hbWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudXRpbC5SZXNvdXJjZUFjdGlvbkRlbGVnYXRlI3Byb2Nlc3Mob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2VzcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMTAwKTsKLQkJZm9ybWF0KG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgOTgpLCByZXNvdXJjZSk7Ci0KLQkJdHJ5IHsKLQkJCXJlc291cmNlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMikpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV80LCBuZXcgU3RyaW5nW117cmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfSk7Ci0JCQlmRXJyb3JTdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpKTsKLQkJfQotCQltb25pdG9yLmRvbmUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuUmVzb3VyY2VBY3Rpb25EZWxlZ2F0ZSNwcm9jZXNzb3JBdmFpbGFibGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NvckF2YWlsYWJsZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKHJlc291cmNlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQl0cnkgewotCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc291cmNlOwotCi0JCQkJCUlTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IG51bGw7Ci0JCQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCQkJCWZvcm1hdFByb2Nlc3NvciA9IGdldEZvcm1hdFByb2Nlc3Nvcihjb250ZW50VHlwZS5nZXRJZCgpKTsKLQkJCQkJfQotCQkJCQlpZiAoZm9ybWF0UHJvY2Vzc29yICE9IG51bGwpCi0JCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcmVzb3VyY2U7Ci0JCQkJCUlSZXNvdXJjZVtdIG1lbWJlcnM7Ci0JCQkJCW1lbWJlcnMgPSBjb250YWluZXIubWVtYmVycygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWJvb2xlYW4gYXZhaWxhYmxlID0gcHJvY2Vzc29yQXZhaWxhYmxlKG1lbWJlcnNbaV0pOwotCi0JCQkJCQlpZiAoYXZhaWxhYmxlKSB7Ci0JCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZXNvdXJjZUFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZXNvdXJjZUFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MDc5MjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvUmVzb3VyY2VBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2U7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUFjdGlvbkRlbGVnYXRlIHsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLQotCXByaXZhdGUgSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UgZ2V0QWN0aXZlUHJvZ3Jlc3NTZXJ2aWNlKCkgewotCQlJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLQkJaWYgKFBsYXRmb3JtVUkuaXNXb3JrYmVuY2hSdW5uaW5nKCkpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCWlmIChhY3RpdmVXb3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotCQkJCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBhY3RpdmVXb3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydCA9IGFjdGl2ZVBhZ2UuZ2V0QWN0aXZlUGFydCgpOwotCQkJCQlpZiAoYWN0aXZlUGFydCAhPSBudWxsKSB7Ci0JCQkJCQlzZXJ2aWNlID0gKElXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlKSBhY3RpdmVQYXJ0LmdldFNpdGUoKS5nZXRBZGFwdGVyKElXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlLmNsYXNzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VydmljZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSm9iIGdldEpvYigpIHsKLQkJLy8gUmVzb3VyY2VBY3Rpb25EZWxlZ2F0ZSBkb2VzIG5vdCBjcmVhdGUgYmFja2dyb3VuZCBqb2IKLQkJLy8gc3ViY2xhc3MgY3JlYXRlcyB0aGUgYmFja2dyb3VuZCBqb2IgZm9yIHRoZSBhY3Rpb24KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc29yQXZhaWxhYmxlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkvLyBSZXNvdXJjZUFjdGlvbkRlbGVnYXRlIHJldHVybnMgZmFsc2UgYnkgZGVmYXVsdAotCQkvLyBzdWJjbGFzcyByZXR1cm5zIHRydWUgaWYgcHJvY2Vzc29yIGlzIGF2YWlsYWJsZTsgZmFsc2Ugb3RoZXJ3aXNlCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChmU2VsZWN0aW9uICE9IG51bGwgJiYgIWZTZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlKb2Igam9iID0gZ2V0Sm9iKCk7Ci0JCQlpZiAoam9iICE9IG51bGwpIHsKLQkJCQlJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZSBwcm9ncmVzc1NlcnZpY2UgPSBnZXRBY3RpdmVQcm9ncmVzc1NlcnZpY2UoKTsKLQkJCQlpZiAocHJvZ3Jlc3NTZXJ2aWNlICE9IG51bGwpIHsKLQkJCQkJcHJvZ3Jlc3NTZXJ2aWNlLnNjaGVkdWxlKGpvYik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlqb2Iuc2NoZWR1bGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJZlNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJYm9vbGVhbiBhdmFpbGFibGUgPSBmYWxzZTsKLQotCQkJT2JqZWN0W10gZWxlbWVudHMgPSBmU2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQkJYXZhaWxhYmxlID0gcHJvY2Vzc29yQXZhaWxhYmxlKChJUmVzb3VyY2UpIGVsZW1lbnRzW2ldKTsKLQotCQkJCQlpZiAoYXZhaWxhYmxlKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlhY3Rpb24uc2V0RW5hYmxlZChhdmFpbGFibGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9TdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg2ZDhjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9TdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9BRERfQkxPQ0tfQ09NTUVOVCA9ICJBZGRCbG9ja0NvbW1lbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9DTEVBTlVQX0RPQ1VNRU5UID0gIkNsZWFudXBEb2N1bWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX0NPTU1FTlQgPSAiQ29tbWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX0NPTlRFTlRBU1NJU1RfQ09OVEVYVF9JTkZPUk1BVElPTiA9ICJDb250ZW50QXNzaXN0Q29udGV4dEluZm9ybWF0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfQ09OVEVOVEFTU0lTVF9QUk9QT1NBTFMgPSAiQ29udGVudEFzc2lzdFByb3Bvc2FscyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX0ZJTkRfT0NDVVJSRU5DRVMgPSAiRmluZE9jY3VycmVuY2VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX0ZPUk1BVF9BQ1RJVkVfRUxFTUVOVFMgPSAiRm9ybWF0QWN0aXZlRWxlbWVudHMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9GT1JNQVRfRE9DVU1FTlQgPSAiRm9ybWF0RG9jdW1lbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9NQU5BR0VfQlJFQUtQT0lOVFMgPSAiTWFuYWdlQnJlYWtwb2ludHMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9PUEVOX0ZJTEUgPSAiT3BlbkZpbGVGcm9tU291cmNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfUkVNT1ZFX0JMT0NLX0NPTU1FTlQgPSAiUmVtb3ZlQmxvY2tDb21tZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfU1RSVUNUVVJFX1NFTEVDVF9FTkNMT1NJTkcgPSAiU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfU1RSVUNUVVJFX1NFTEVDVF9ISVNUT1JZID0gIlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9TVFJVQ1RVUkVfU0VMRUNUX05FWFQgPSAiU3RydWN0dXJlU2VsZWN0TmV4dCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX1NUUlVDVFVSRV9TRUxFQ1RfUFJFVklPVVMgPSAiU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9UT0dHTEVfQ09NTUVOVCA9ICJUb2dnbGVDb21tZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfVU5DT01NRU5UID0gIlVuY29tbWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX0dPVE9fTUFUQ0hJTkdfQlJBQ0tFVCA9ICJHb3RvTWF0Y2hpbmdCcmFja2V0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfU0hPV19PVVRMSU5FID0gIlNob3dRdWlja091dGxpbmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgVU5ERVJTQ09SRSBpbnN0ZWFkCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRE9UID0gIi4iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVTkRFUlNDT1JFID0gIl8iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBHUk9VUF9OQU1FX01FTlVfQURESVRJT05TID0gIk1lbnVBZGRpdGlvbnMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBHUk9VUF9OQU1FX1RPT0xCQVJfQURESVRJT05TID0gIlRvb2xiYXJBZGRpdGlvbnMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUQVRVU19DQVRFR09SWV9PRkZTRVQgPSAiT2Zmc2V0IjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNhYmZhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5MZWdhY3lBY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLklDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvblJlYWRlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIERlc2NyaWJlcyBhIGNhdGVnb3J5IGV4dGVuc2lvbiB0byB0aGUKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29tcGxldGlvblByb3Bvc2FsPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeSB7Ci0JLyoqIFRoZSBleHRlbnNpb24gc2NoZW1hIG5hbWUgb2YgdGhlIGljb24gYXR0cmlidXRlLiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogVGhlIGV4dGVuc2lvbiBzY2hlbWEgbmFtZSBvZiB0aGUgSUQgYXR0cmlidXRlLiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRD0gImlkIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBUaGUgZXh0ZW5zaW9uIHNjaGVtYSBuYW1lIG9mIHRoZSBuYW1lIGF0dHJpYnV0ZS4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRT0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKiogSUQgb2YgdGhpcyBjb21wbGV0aW9uIGNhdGVnb3J5ICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZklkOwotCQotCS8qKiBOYW1lIG9mIHRoaXMgY29tcGxldGlvbiBjYXRlZ29yeSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGZOYW1lOwotCQotCS8qKiBUaGUgaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhpcyBjYXRlZ29yeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBzcGVjaWZpZWQuICovCi0JcHJpdmF0ZSBmaW5hbCBJbWFnZURlc2NyaXB0b3IgZkltYWdlOwotCQotCS8qKiBUaGUgbGFzdCBlcnJvciByZXBvcnRlZCBieSB0aGlzIGNhdGVnb3J5ICovCi0JcHJpdmF0ZSBTdHJpbmcgZkxhc3RFcnJvciA9IG51bGw7Ci0KLQkvKioKLQkgKiA8cD5Db25zdHJ1Y3QgdGhlIGNhdGVnb3J5IGJ5IHBhcnNpbmcgdGhlIGdpdmVuIGVsZW1lbnQuPC9wPgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IHtAbGluayBJQ29uZmlndXJhdGlvbkVsZW1lbnR9IGNvbnRhaW5pbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBjYXRlZ29yeQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4ge0BsaW5rIElDb25maWd1cmF0aW9uRWxlbWVudH0gZG9lcyBub3QgY29udGFpbiB0aGUgY29ycmVjdAotCSAqIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLgotCSAqLwotCUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc0xlZ2FsKGVsZW1lbnQgIT0gbnVsbCk7Ci0JCQotCQkvL2dldCAmIHZlcmlmeSBJRAotCQlmSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShJRCk7Ci0JCUNvbnRlbnRBc3Npc3RVdGlscy5jaGVja0V4dGVuc2lvbkF0dHJpYnV0ZU5vdE51bGwoZklkLCBJRCwgZWxlbWVudCk7Ci0JCQotCQkvL2dldCAmIHZlcmlmeSBvcHRpb25hbCBuYW1lCi0JCVN0cmluZyBuYW1lPSBlbGVtZW50LmdldEF0dHJpYnV0ZShOQU1FKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJZk5hbWUgPSBmSWQ7Ci0JCX0gZWxzZSB7Ci0JCQlmTmFtZT0gbmFtZTsKLQkJfQotCi0JCS8vZ2V0ICYgdmVyaWZ5IG9wdGlvbmFsIGljb24KLQkJU3RyaW5nIGljb249IGVsZW1lbnQuZ2V0QXR0cmlidXRlKElDT04pOwotCQlJbWFnZURlc2NyaXB0b3IgaW1nPSBudWxsOwotCQlpZiAoaWNvbiAhPSBudWxsKSB7Ci0JCQlCdW5kbGUgYnVuZGxlPSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0QnVuZGxlKGVsZW1lbnQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJUGF0aCBwYXRoPSBuZXcgUGF0aChpY29uKTsKLQkJCQlVUkwgdXJsPSBGaWxlTG9jYXRvci5maW5kKGJ1bmRsZSwgcGF0aCwgbnVsbCk7Ci0JCQkJaW1nPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotCQkJfQotCQl9Ci0JCWZJbWFnZT0gaW1nOwotCX0KLQotCS8qKgotCSAqIDxwPkNyZWF0ZXMgYSBjYXRlZ29yeSB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBJRDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIHVuaXF1ZSBJRCBvZiB0aGUgbmV3IGNhdGVnb3J5Ci0JICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG5ldyBjYXRlZ29yeQotCSAqLwotCUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLQkJZklkPSBpZDsKLQkJZk5hbWU9IG5hbWU7Ci0JCWZJbWFnZT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD5SZXR1cm5zIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY2F0ZWdvcnk8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGZJZDsKLQl9Ci0KLQkvKioKLQkgKiA8cD5SZXR1cm5zIHRoZSBodW1hbiByZWFkYWJsZSBuYW1lIG9mIHRoZSBjYXRlZ29yeS4KLQkgKiBJdCBtYXkgY29udGFpbiBtbmVtb25pY3MuPC9wPgotCSAqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPHA+UmV0dXJucyB0aGUgaHVtYW4gcmVhZGFibGUgbmFtZSBvZiB0aGUgY2F0ZWdvcnkKLQkgKiB3aXRob3V0IG1uZW1vbmljIGhpbnQgaW4gb3JkZXIgdG8gYmUgZGlzcGxheWVkCi0JICogaW4gYSBtZXNzYWdlLjwvcD4KLQkgKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBMZWdhY3lBY3Rpb25Ub29scy5yZW1vdmVNbmVtb25pY3MoZk5hbWUpOwotCX0KLQotCS8qKgotCSAqIDxwPlJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3Igb2YgdGhlIGNhdGVnb3J5LjwvcD4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3Igb2YgdGhlIGNhdGVnb3J5Ci0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBmSW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNhdGVnb3J5IHNob3VsZCBiZSBkaXNwbGF5ZWQgb24KLQkgKiBpdHMgb3duIGNvbnRlbnQgYXNzaXN0IHBhZ2UsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3BsYXllZE9uT3duUGFnZShTdHJpbmcgY29udGVudFR5cGVJRCkgewotCQlib29sZWFuIGRpc3BsYXlPbk93blBhZ2UgPSBJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25SZWFkZXIuREVGQVVMVF9ESVNQTEFZX09OX09XTl9QQUdFOwotCQkKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uUmVhZGVyIHByb3BlcnRpZXMgPQotCQkJQ29tcGxldGlvblByb3Bvc29hbENhdGlnb3JpZXNDb25maWd1cmF0aW9uUmVnaXN0cnkuZ2V0RGVmYXVsdCgpLmdldFJlYWRhYmxlQ29uZmlndXJhdGlvbihjb250ZW50VHlwZUlEKTsKLQkJaWYocHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQlkaXNwbGF5T25Pd25QYWdlID0gcHJvcGVydGllcy5zaG91bGREaXNwbGF5T25Pd25QYWdlKHRoaXMuZklkKTsKLQkJfQotCQkKLQkJcmV0dXJuIGRpc3BsYXlPbk93blBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNhdGVnb3J5IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4KLQkgKiB0aGUgZGVmYXVsdCBjb250ZW50IGFzc2lzdCBwYWdlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbmNsdWRlZE9uRGVmYXVsdFBhZ2UoU3RyaW5nIGNvbnRlbnRUeXBlSUQpIHsKLQkJYm9vbGVhbiBpbmNsdWRlT25EZWZhdWx0UGFnZSA9IElDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvblJlYWRlci5ERUZBVUxUX0lOQ0xVREVfT05fREVGQVVMVFNfUEFHRTsKLQkJCi0JCUlDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvblJlYWRlciBwcm9wZXJ0aWVzID0KLQkJCUNvbXBsZXRpb25Qcm9wb3NvYWxDYXRpZ29yaWVzQ29uZmlndXJhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRSZWFkYWJsZUNvbmZpZ3VyYXRpb24oY29udGVudFR5cGVJRCk7Ci0JCWlmKHByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJaW5jbHVkZU9uRGVmYXVsdFBhZ2UgPSBwcm9wZXJ0aWVzLnNob3VsZERpc3BsYXlPbkRlZmF1bHRQYWdlKHRoaXMuZklkKTsKLQkJfQotCQkKLQkJcmV0dXJuIGluY2x1ZGVPbkRlZmF1bHRQYWdlOwotCX0KLQkKLQkvKioKLQkgKiA8cD5HaXZlbiBhIGNvbnRlbnQgdHlwZSBJRCBkZXRlcm1pbmVzIHRoZSByYW5rIG9mIHRoaXMKLQkgKiBjYXRlZ29yeSBmb3Igc29ydGluZyB0aGUgY29udGVudCBhc3Npc3QgcGFnZXM8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgc29ydCByYW5rIG9mIHRoaXMgY2F0ZWdvcnkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFBhZ2VTb3J0UmFuayhTdHJpbmcgY29udGVudFR5cGVJRCkgewotCQlpbnQgc29ydE9yZGVyID0gSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uUmVhZGVyLkRFRkFVTFRfU09SVF9PUkRFUjsKLQkJCi0JCUlDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvblJlYWRlciBwcm9wZXJ0aWVzID0KLQkJCUNvbXBsZXRpb25Qcm9wb3NvYWxDYXRpZ29yaWVzQ29uZmlndXJhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRSZWFkYWJsZUNvbmZpZ3VyYXRpb24oY29udGVudFR5cGVJRCk7Ci0JCWlmKHByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJc29ydE9yZGVyID0gcHJvcGVydGllcy5nZXRQYWdlU29ydE9yZGVyKHRoaXMuZklkKTsKLQkJfQotCQkKLQkJcmV0dXJuIHNvcnRPcmRlcjsKLQl9Ci0JCi0JLyoqCi0JICogPHA+R2l2ZW4gYSBjb250ZW50IHR5cGUgSUQgZGV0ZXJtaW5lcyB0aGUgcmFuayBvZiB0aGlzCi0JICogY2F0ZWdvcnkgZm9yIHNvcnRpbmcgb24gdGhlIGRlZmF1bHQgY29udGVudCBhc3Npc3QgcGFnZQotCSAqIHdpdGggb3RoZXIgY2F0ZWdvcmllczwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzb3J0IHJhbmsgb2YgdGhpcyBjYXRlZ29yeQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFBhZ2VTb3J0UmFuayhTdHJpbmcgY29udGVudFR5cGVJRCkgewotCQlpbnQgc29ydE9yZGVyID0gSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uUmVhZGVyLkRFRkFVTFRfU09SVF9PUkRFUjsKLQkJCi0JCUlDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvblJlYWRlciBwcm9wZXJ0aWVzID0KLQkJCUNvbXBsZXRpb25Qcm9wb3NvYWxDYXRpZ29yaWVzQ29uZmlndXJhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRSZWFkYWJsZUNvbmZpZ3VyYXRpb24oY29udGVudFR5cGVJRCk7Ci0JCWlmKHByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJc29ydE9yZGVyID0gcHJvcGVydGllcy5nZXREZWZhdWx0UGFnZVNvcnRPcmRlcih0aGlzLmZJZCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzb3J0T3JkZXI7Ci0JfQotCQotCS8qKgotCSAqIDxwPjxiPk5PVEU6IDwvYj4gZW5hYmxlbWVudCBpcyBub3QgdGhlIHNhbWUgYXMgd2VhdGhlciBhIGNhdGVnb3J5Ci0JICogc2hvdWxkIGJlIGRpc3BsYXllZCBvbiBpdHMgb3duIHBhZ2Ugb3IgdGhlIGRlZmF1bHQgcGFnZSwgaXQgZGVzY3JpYmVzCi0JICogaWYgdGhlIGNhdGVnb3J5IHNob3VsZCBiZSB1c2VkIGF0IGFsbC4gIEN1cnJlbnRseSBjYXRlZ29yaWVzIGFyZSBhbHdheXMKLQkgKiBlbmFibGVkLiAgVGhlcmUgbWF5YmUgY2FzZXMgaW4gdGhlIGZ1dHVyZSB3aGVyZSBhIGNhdGVnb3J5IHNob3VsZCBiZQotCSAqIGRpc2FibGVkIGVudGlyZWx5IHRob3VnaC48L3A+Ci0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNhdGVnb3J5IGlzIGVuYWJsZWQsCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2F0ZWdvcnkgY29udGFpbnMgYW55IGNvbXB1dGVycywgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wdXRlcnMoKSB7Ci0JCUxpc3QgZGVzY3JpcHRvcnM9ICBDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlclJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRQcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvcnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdD0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJEZXNjcmlwdG9yIGRlc2M9IChDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlckRlc2NyaXB0b3IpIGl0Lm5leHQoKTsKLQkJCWlmIChkZXNjLmdldENhdGVnb3J5KCkgPT0gdGhpcykgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlSUQgdGhlIGNvbnRlbnQgdHlwZSBJRAotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlSUQgdGhlIHBhcnRpdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNhdGVnb3J5IGNvbnRhaW5zIGFueSBjb21wdXRlcnMsIGluIHRoZSBnaXZlbiBwYXJ0aXRpb24gdHlwZQotCSAqIGluIHRoZSBnaXZlbiBjb250ZW50IHR5cGUsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wdXRlcnMoU3RyaW5nIGNvbnRlbnRUeXBlSUQsIFN0cmluZyBwYXJ0aXRpb25UeXBlSUQpIHsKLQkJTGlzdCBkZXNjcmlwdG9ycyA9IENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyUmVnaXN0cnkuZ2V0RGVmYXVsdCgpLmdldFByb3Bvc2FsQ29tcHV0ZXJEZXNjcmlwdG9ycyhjb250ZW50VHlwZUlELCBwYXJ0aXRpb25UeXBlSUQpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJEZXNjcmlwdG9yIGRlc2M9IChDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlckRlc2NyaXB0b3IpIGl0Lm5leHQoKTsKLQkJCWlmIChkZXNjLmdldENhdGVnb3J5KCkgPT0gdGhpcykgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlSUQgdGhlIGNvbnRlbnQgdHlwZSBJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNhdGVnb3J5IGNvbnRhaW5zIGFueSBjb21wdXRlcnMsIGluIHRoZSBnaXZlbiBwYXJ0aXRpb24gdHlwZQotCSAqIGluIHRoZSBnaXZlbiBjb250ZW50IHR5cGUsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wdXRlcnMoU3RyaW5nIGNvbnRlbnRUeXBlSUQpIHsKLQkJTGlzdCBkZXNjcmlwdG9ycyA9IENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyUmVnaXN0cnkuZ2V0RGVmYXVsdCgpLmdldFByb3Bvc2FsQ29tcHV0ZXJEZXNjcmlwdG9ycyhjb250ZW50VHlwZUlEKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvciBkZXNjPSAoQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJEZXNjcmlwdG9yKSBpdC5uZXh0KCk7Ci0JCQlpZiAoZGVzYy5nZXRDYXRlZ29yeSgpID09IHRoaXMpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPHA+U2FmZWx5IGNvbXB1dGVzIGNvbXBsZXRpb24gcHJvcG9zYWxzIG9mIGFsbCBjb21wdXRlcnMgb2YgdGhpcyBjYXRlZ29yeSB0aHJvdWdoIHRoZWlyCi0JICogZXh0ZW5zaW9uLjwvcD4KLQkgKgotCSAqIEBwYXJhbSBjb250ZXh0IHRoZSBpbnZvY2F0aW9uIGNvbnRleHQgcGFzc2VkIG9uIHRvIHRoZSBleHRlbnNpb24KLQkgKiBAcGFyYW0gY29udGVudFR5cGVJRCB0aGUgY29udGVudCB0eXBlIElEIHdoZXJlIHRoZSBpbnZvY2F0aW9uIG9jY3VycmVkCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGVJRCB0aGUgcGFydGl0aW9uIHR5cGUgd2hlcmUgdGhlIGludm9jYXRpb24gb2NjdXJyZWQKLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBwYXNzZWQgb24gdG8gdGhlIGV4dGVuc2lvbgotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY29tcHV0ZWQgY29tcGxldGlvbiBwcm9wb3NhbHMgKGVsZW1lbnQgdHlwZToKLQkgKiAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbH0pCi0JICovCi0JcHVibGljIExpc3QgY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwKLQkJCVN0cmluZyBjb250ZW50VHlwZUlELCBTdHJpbmcgcGFydGl0aW9uVHlwZUlELCBTdWJQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkKLQkJZkxhc3RFcnJvciA9IG51bGw7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdChDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlclJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRQcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvcnMoY29udGVudFR5cGVJRCwgcGFydGl0aW9uVHlwZUlEKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlckRlc2NyaXB0b3IgZGVzYyA9IChDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlckRlc2NyaXB0b3IpIGl0Lm5leHQoKTsKLQkJCWlmIChkZXNjLmdldENhdGVnb3J5KCkgPT0gdGhpcykgewotCQkJCXJlc3VsdC5hZGRBbGwoZGVzYy5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhjb250ZXh0LCBtb25pdG9yKSk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChmTGFzdEVycm9yID09IG51bGwgJiYgZGVzYy5nZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJZkxhc3RFcnJvciA9IGRlc2MuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8cD5TYWZlbHkgY29tcHV0ZXMgY29udGV4dCBpbmZvcm1hdGlvbiBvYmplY3RzIG9mIGFsbCBjb21wdXRlcnMgb2YgdGhpcyBjYXRlZ29yeSB0aHJvdWdoIHRoZWlyCi0JICogZXh0ZW5zaW9uLjwvcD4KLQkgKgotCSAqIEBwYXJhbSBjb250ZXh0IHRoZSBpbnZvY2F0aW9uIGNvbnRleHQgcGFzc2VkIG9uIHRvIHRoZSBleHRlbnNpb24KLQkgKiBAcGFyYW0gY29udGVudFR5cGVJRCB0aGUgY29udGVudCB0eXBlIElEIHdoZXJlIHRoZSBpbnZvY2F0aW9uIG9jY3VycmVkCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGVJRCB0aGUgcGFydGl0aW9uIHR5cGUgd2hlcmUgdGhlIGludm9jYXRpb24gb2NjdXJyZWQKLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBwYXNzZWQgb24gdG8gdGhlIGV4dGVuc2lvbgotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY29tcHV0ZWQgY29udGV4dCBpbmZvcm1hdGlvbiBvYmplY3RzIChlbGVtZW50IHR5cGU6Ci0JICogICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb259KQotCSAqLwotCXB1YmxpYyBMaXN0IGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwKLQkJCVN0cmluZyBjb250ZW50VHlwZUlELCBTdHJpbmcgcGFydGl0aW9uVHlwZUlELCBTdWJQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkKLQkJZkxhc3RFcnJvcj0gbnVsbDsKLQkJTGlzdCByZXN1bHQ9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBkZXNjcmlwdG9ycz0gbmV3IEFycmF5TGlzdChDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlclJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRQcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvcnMoY29udGVudFR5cGVJRCwgcGFydGl0aW9uVHlwZUlEKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXQ9IGRlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvciBkZXNjPSAoQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJEZXNjcmlwdG9yKSBpdC5uZXh0KCk7Ci0JCQlpZiAoZGVzYy5nZXRDYXRlZ29yeSgpID09IHRoaXMgJiYgKGlzSW5jbHVkZWRPbkRlZmF1bHRQYWdlKGNvbnRlbnRUeXBlSUQpIHx8IGlzRGlzcGxheWVkT25Pd25QYWdlKGNvbnRlbnRUeXBlSUQpKSkgewotCQkJCXJlc3VsdC5hZGRBbGwoZGVzYy5jb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKGNvbnRleHQsIG1vbml0b3IpKTsKLQkJCX0KLQkJCWlmIChmTGFzdEVycm9yID09IG51bGwpIHsKLQkJCQlmTGFzdEVycm9yPSBkZXNjLmdldEVycm9yTWVzc2FnZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbGFzdCBlcnJvciBtZXNzYWdlIHJlcG9ydGVkIGJ5IGEgY29tcHV0ZXIgaW4gdGhpcyBjYXRlZ29yeQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gZkxhc3RFcnJvcjsKLQl9Ci0KLQkvKioKLQkgKiA8cD5Ob3RpZmllcyB0aGUgY29tcHV0ZXJzIGluIHRoaXMgY2F0ZWdvcnkgb2YgYSBwcm9wb3NhbCBjb21wdXRhdGlvbiBzZXNzaW9uIHN0YXJ0LjwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXNzaW9uU3RhcnRlZCgpIHsKLQkJTGlzdCBkZXNjcmlwdG9ycz0gbmV3IEFycmF5TGlzdChDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlclJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRQcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvcnMoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXQ9IGRlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvciBkZXNjPSAoQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJEZXNjcmlwdG9yKSBpdC5uZXh0KCk7Ci0JCQlpZiAoZGVzYy5nZXRDYXRlZ29yeSgpID09IHRoaXMpCi0JCQkJZGVzYy5zZXNzaW9uU3RhcnRlZCgpOwotCQkJaWYgKGZMYXN0RXJyb3IgPT0gbnVsbCkKLQkJCQlmTGFzdEVycm9yPSBkZXNjLmdldEVycm9yTWVzc2FnZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+Tm90aWZpZXMgdGhlIGNvbXB1dGVycyBpbiB0aGlzIGNhdGVnb3J5IG9mIGEgcHJvcG9zYWwgY29tcHV0YXRpb24gc2Vzc2lvbiBlbmQuPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHNlc3Npb25FbmRlZCgpIHsKLQkJTGlzdCBkZXNjcmlwdG9ycz0gbmV3IEFycmF5TGlzdChDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlclJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRQcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvcnMoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXQ9IGRlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvciBkZXNjPSAoQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJEZXNjcmlwdG9yKSBpdC5uZXh0KCk7Ci0JCQlpZiAoZGVzYy5nZXRDYXRlZ29yeSgpID09IHRoaXMpCi0JCQkJZGVzYy5zZXNzaW9uRW5kZWQoKTsKLQkJCWlmIChmTGFzdEVycm9yID09IG51bGwpCi0JCQkJZkxhc3RFcnJvcj0gZGVzYy5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBmSWQgKyAiOiAiICsgZk5hbWU7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db21wbGV0aW9uUHJvcG9zYWxDb21wdXRlckRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODI1ZGM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGVyZm9ybWFuY2VTdGF0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogV3JhcHMgYW4ge0BsaW5rIElDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcn0gcHJvdmlkZWQgYnkgYW4gZXh0ZW5zaW9uIHRvIHRoZQotICogPGNvZGU+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21wbGV0aW9uUHJvcG9zYWw8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIEluc3RhbmNlcyBhcmUgaW1tdXRhYmxlLiBJbnN0YW5jZXMgY2FuIGJlIG9idGFpbmVkIGZyb20gYQotICoge0BsaW5rIENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyUmVnaXN0cnl9LgotICoKLSAqIEBzZWUgQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJSZWdpc3RyeQotICovCi1maW5hbCBjbGFzcyBDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlckRlc2NyaXB0b3IgewotCS8qKiBUaGUgZGVmYXVsdCBjYXRlZ29yeSBpZC4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DQVRFR09SWV9JRD0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZGVmYXVsdFByb3Bvc2FsQ2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIFRoZSBleHRlbnNpb24gc2NoZW1hIG5hbWUgb2YgdGhlIGNhdGVnb3J5IGlkIGF0dHJpYnV0ZS4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DQVRFR09SWV9JRD0gImNhdGVnb3J5SWQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIFRoZSBleHRlbnNpb24gc2NoZW1hIG5hbWUgZm9yIGVsZW1lbnQgSUQgYXR0cmlidXRlcyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lEPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIFRoZSBleHRlbnNpb24gc2NoZW1hIG5hbWUgZm9yIGVsZW1lbnQgbmFtZSBhdHRyaWJ1dGVzICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRT0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIFRoZSBleHRlbnNpb24gc2NoZW1hIG5hbWUgb2YgdGhlIGNsYXNzIGF0dHJpYnV0ZS4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DTEFTUz0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBUaGUgZXh0ZW5zaW9uIHNjaGVtYSBuYW1lIG9mIHRoZSBhY3RpdmF0ZSBhdHRyaWJ1dGUuICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJBQ1RJVkFURT0gImFjdGl2YXRlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBUaGUgZXh0ZW5zaW9uIHNjaGVtYSBuYW1lIG9mIHRoZSBjb250ZW50IHR5cGUgY2hpbGQgZWxlbWVudHMuICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fQ09OVEVOVF9UWVBFID0gImNvbnRlbnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBUaGUgZXh0ZW5zaW9uIHNjaGVtYSBuYW1lIG9mIHRoZSBwYXJ0aXRpb24gdHlwZSBjaGlsZCBlbGVtZW50cy4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9QQVJUSVRJT05fVFlQRT0gInBhcnRpdGlvblR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIFRoZSBuYW1lIG9mIHRoZSBwZXJmb3JtYW5jZSBldmVudCB1c2VkIHRvIHRyYWNlIGV4dGVuc2lvbnMuICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUkZPUk1BTkNFX0VWRU5UPSBTU0VVSVBsdWdpbi5JRCArICIvcGVyZi9jb250ZW50X2Fzc2lzdC9leHRlbnNpb25zIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIElmIDxjb2RlPnRydWU8L2NvZGU+LCBleGVjdXRpb24gdGltZSBvZiBleHRlbnNpb25zIGlzIG1lYXN1cmVkIGFuZCB0aGUgZGF0YSBmb3J3YXJkZWQgdG8KLQkgKiBjb3JlJ3Mge0BsaW5rIFBlcmZvcm1hbmNlU3RhdHN9IHNlcnZpY2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBNRUFTVVJFX1BFUkZPUk1BTkNFPSBQZXJmb3JtYW5jZVN0YXRzLmlzRW5hYmxlZChQRVJGT1JNQU5DRV9FVkVOVCk7Ci0JCi0JLyoqCi0JICogSW5kZXBlbmRlbnRseSBvZiB0aGUge0BsaW5rIFBlcmZvcm1hbmNlU3RhdHN9IHNlcnZpY2UsIGFueSBvcGVyYXRpb24gdGhhdCB0YWtlcyBsb25nZXIgdGhhbgotCSAqIHtAdmFsdWV9IG1pbGxpc2Vjb25kcyB3aWxsIGJlIGZsYWdnZWQgYXMgYW4gdmlvbGF0aW9uLiBUaGlzIHRpbWVvdXQgZG9lcyBub3QgYXBwbHkgdG8gdGhlCi0JICogZmlyc3QgaW52b2NhdGlvbiwgYXMgaXQgbWF5IHRha2UgbG9uZ2VyIGR1ZSB0byBwbHVnLWluIGluaXRpYWxpemF0aW9uIGV0Yy4gU2VlIGFsc28KLQkgKiB7QGxpbmsgI2ZJc1JlcG9ydGluZ0RlbGF5fS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1BWF9ERUxBWT0gNTAwMDAwOwotCi0JLyogbG9nIGNvbnN0YW50cyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QVVRFX0NPTVBMRVRJT05fUFJPUE9TQUxTPSAiY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoKSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUFVURV9DT05URVhUX0lORk9STUFUSU9OPSAiY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbigpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX1NUQVJURUQ9ICJzZXNzaW9uU3RhcnRlZCgpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0VOREVEPSAic2Vzc2lvbkVuZGVkKCkiOyAvLyROT04tTkxTLTEkCi0KLQkvKiogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbi4gKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmSWQ7Ci0JCi0JLyoqIFRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24uICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZk5hbWU7Ci0JCi0JLyoqIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBwcm92aWRlZCA8Y29kZT5JU1NFQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI8L2NvZGU+LiAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGZDbGFzczsKLQkKLQkvKiogVGhlIGFjdGl2YXRlIGF0dHJpYnV0ZSB2YWx1ZS4gKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZkFjdGl2YXRlOwotCQotCS8qKiBUaGUgY29uZmlndXJhdGlvbiBlbGVtZW50IG9mIHRoaXMgZXh0ZW5zaW9uLiAqLwotCXByaXZhdGUgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZFbGVtZW50OwotCQotCS8qKiBUaGUgY29tcHV0ZXIsIGlmIGluc3RhbnRpYXRlZCwgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLiAqLwotCXByaXZhdGUgSUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIGZDb21wdXRlcjsKLQkKLQkvKiogVGhlIFVJIGNhdGVnb3J5LiAqLwotCXByaXZhdGUgZmluYWwgQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnkgZkNhdGVnb3J5OwotCQotCS8qKiBUaGUgZmlyc3QgZXJyb3IgbWVzc2FnZSBpbiB0aGUgbW9zdCByZWNlbnQgb3BlcmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPi4gKi8KLQlwcml2YXRlIFN0cmluZyBmTGFzdEVycm9yOwotCQotCS8qKgotCSAqIFRlbGxzIHdoZXRoZXIgdG8gaW5mb3JtIHRoZSB1c2VyIHdoZW4gPGNvZGU+TUFYX0RFTEFZPC9jb2RlPiBoYXMgYmVlbiBleGNlZWRlZC4KLQkgKiBXZSBzdGFydCB0aW1pbmcgZXhlY3V0aW9uIGFmdGVyIHRoZSBmaXJzdCBzZXNzaW9uIGJlY2F1c2UgdGhlIGZpcnN0IG1heSB0YWtlCi0JICogbG9uZ2VyIGR1ZSB0byBwbHVnLWluIGFjdGl2YXRpb24gYW5kIGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmSXNSZXBvcnRpbmdEZWxheSA9IGZhbHNlOwotCQotCS8qKiBUaGUgc3RhcnQgb2YgdGhlIGxhc3Qgb3BlcmF0aW9uLiAqLwotCXByaXZhdGUgbG9uZyBmU3RhcnQ7Ci0JCi0JLyoqCi0JICogVGVsbHMgd2hldGhlciB3ZSB0cmllZCB0byBsb2FkIHRoZSBjb21wdXRlci4KLQkgKiBAc2luY2UgMy40Ci0JICovCi0JYm9vbGVhbiBmVHJpZWRMb2FkaW5nQ29tcHV0ZXIgPSBmYWxzZTsKLQotCS8qKgotCSAqIDxwPkNyZWF0ZXMgYSBuZXcgZGVzY3JpcHRvci48L3A+Ci0JICogPHA+PGI+Tk9URTogPC9iPiBUaGlzIHdpbGwgbm90IGFkZCB0aGlzIG5ldyBkZXNjcmlwdG9yIHRvIHRoZSBnaXZlbgotCSAqIHtAbGluayBDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlclJlZ2lzdHJ5fS4gVGhhdCBjYW4gbm90IGJlIGRvbmUKLQkgKiB1bnRpbCB0aGlzIGRlc2NyaXB0b3IgaXMgZG9uZSBiZWluZyBjb25zdHJ1Y3RlZC4gIFRoZXJlZm9yZSBiZSBzdXJlCi0JICogdG8gY2FsbCB7QGxpbmsgI2FkZFRvUmVnaXN0cnkoKX0gYWZ0ZXIgY3JlYXRpbmcgYSBuZXcgZGVzY3JpcHRvci48L3A+Ci0JICoKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IHRvIHJlYWQKLQkgKiBAcGFyYW0gY2F0ZWdvcmllcyB0aGUgY2F0ZWdvcmllcwotCSAqIAotCSAqIEB0aHJvd3MgSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIGlmIHRoaXMgZXh0ZW5zaW9uIGlzIG5vIGxvbmdlciB2YWxpZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgZXh0ZW5zaW9uIGNvbnRhaW5zIGludmFsaWQgdmFsdWVzCi0JICovCi0JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBMaXN0IGNhdGVnb3JpZXMpIHRocm93cyBJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlBc3NlcnQuaXNMZWdhbChlbGVtZW50ICE9IG51bGwpOwotCQlmRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQotCQkvL2dldCAmIHZlcmlmeSBJRAotCQlmSWQgPSBmRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9JRCk7Ci0JCUNvbnRlbnRBc3Npc3RVdGlscy5jaGVja0V4dGVuc2lvbkF0dHJpYnV0ZU5vdE51bGwoZklkLCBBVFRSX0lELCBmRWxlbWVudCk7Ci0KLQkJLy9nZXQgJiB2ZXJpZnkgb3B0aW9uYWwgbmFtZQotCQlTdHJpbmcgbmFtZT0gZkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCWZOYW1lPSBmSWQ7Ci0JCX0gZWxzZSB7Ci0JCQlmTmFtZT0gbmFtZTsKLQkJfQotCi0JCS8vZ2V0ICYgdmVyaWZ5IGFjdGl2YXRlIHBsdWdpbiBhdHRyaWJ1dGUKLQkJU3RyaW5nIGFjdGl2YXRlQXR0cmlidXRlPSBmRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUkFDVElWQVRFKTsKLQkJZkFjdGl2YXRlID0gQm9vbGVhbi52YWx1ZU9mKGFjdGl2YXRlQXR0cmlidXRlKS5ib29sZWFuVmFsdWUoKTsKLQotCQkvL2dldCAmIHZlcmlmeSBjbGFzcwotCQlmQ2xhc3M9IGZFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0NMQVNTKTsKLQkJQ29udGVudEFzc2lzdFV0aWxzLmNoZWNrRXh0ZW5zaW9uQXR0cmlidXRlTm90TnVsbChmQ2xhc3MsIEFUVFJfQ0xBU1MsIGZFbGVtZW50KTsKLQotCQkvL2dldCAmIHZlcmlmeSBvcHRpb25hbCBjYXRlZ29yeSBpZAotCQlTdHJpbmcgY2F0ZWdvcnlJZD0gZkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfQ0FURUdPUllfSUQpOwotCQlpZiAoY2F0ZWdvcnlJZCA9PSBudWxsKSB7Ci0JCQljYXRlZ29yeUlkPSBERUZBVUxUX0NBVEVHT1JZX0lEOwotCQl9Ci0JCQotCQkvL2ZpbmQgdGhlIGNhdGVnb3J5IHdpdGggdGhlIGRldGVybWluZWQgY2F0ZWdvcnkgaWQKLQkJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnkgY2F0ZWdvcnk9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXQ9IGNhdGVnb3JpZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnkgY2F0PSAoQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCWlmIChjYXQuZ2V0SWQoKS5lcXVhbHMoY2F0ZWdvcnlJZCkpIHsKLQkJCQljYXRlZ29yeT0gY2F0OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQkvKiBjcmVhdGUgYSBjYXRlZ29yeSBpZiBpdCBkb2VzIG5vdCBleGlzdAotCQkgKiBlbHNlIGp1c3Qgc2V0IHRoZSBjYXRlZ29yeQotCQkgKi8KLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKLQkJCWZDYXRlZ29yeSA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeShjYXRlZ29yeUlkLCBmTmFtZSk7Ci0JCQkKLQkJCS8qIHdpbGwgYWRkIHRoZSBuZXcgY2F0ZWdvcnkgdG8gdGhlIHJlZ2lzdGVycyBsaXN0IG9mIGNhdGVnb3JpZXMsCi0JCQkgKiAgYnkgdGhlIG1hZ2ljIG9mIG9iamVjdCByZWZlcmVuY2VzCi0JCQkgKi8KLQkJCWNhdGVnb3JpZXMuYWRkKGZDYXRlZ29yeSk7Ci0JCX0gZWxzZSB7Ci0JCQlmQ2F0ZWdvcnkgPSBjYXRlZ29yeTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD5BZGRzIHRoaXMgZGVzY3JpcHRvciB0byB0aGUge0BsaW5rIENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyUmVnaXN0cnl9LjwvcD4KLQkgKiA8cD48Yj5OT1RFOiA8L2I+TXVzdCBiZSBkb25lIGFmdGVyIGRlc2NyaXB0b3IgY3JlYXRpb24gb3IgdGhlIGRlc2NyaXB0b3Igd2lsbAotCSAqIG5vdCBiZSBhZGRlZCB0byB0aGUgcmVnaXN0cnkuIENhbiBub3QgYmUgZG9uZSBpbiBjb25zdHJ1Y3RvciBiZWNhdXNlCi0JICogZGVzY3JpcHRvciBtdXN0IGJlIGNvbnN0cnVjdGVkIGJlZm9yZSBpdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHJlZ2lzdHJ5PC9wPgotCSAqIAotCSAqIAotCSAqIEB0aHJvd3MgSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jdm9pZCBhZGRUb1JlZ2lzdHJ5KCkgdGhyb3dzIEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCXBhcnNlQWN0aXZhdGlvbkFuZEFkZFRvUmVnaXN0cnkodGhpcy5mRWxlbWVudCwgdGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGNhdGVnb3J5IHRoYXQgdGhlIHdyYXBwZWQge0BsaW5rIElDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcn0gaXMKLQkgKiBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnkgZ2V0Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBmQ2F0ZWdvcnk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGNvbnRyaWJ1dG9yIG9mIHRoZSBkZXNjcmliZWQge0BsaW5rIElDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcn0KLQkgKi8KLSAgICBJQ29udHJpYnV0b3IgZ2V0Q29udHJpYnV0b3IoKSAgewotICAgICAgICB0cnkgewotCSAgICAgICAgcmV0dXJuIGZFbGVtZW50LmdldENvbnRyaWJ1dG9yKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAlyZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaWQgb2YgdGhlIGRlc2NyaWJlZCB7QGxpbmsgSUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyfQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBmSWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZGVzY3JpYmVkIHtAbGluayBJQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJ9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY29tcHV0ZXIgYXMgZGVzY3JpYmVkIGluIHRoZQotCSAqIGV4dGVuc2lvbidzIHhtbC4gTm90ZSB0aGF0IHRoZSBzYWZlc3Qgd2F5IHRvIGFjY2VzcyB0aGUgY29tcHV0ZXIKLQkgKiBpcyBieSB1c2luZyB0aGUKLQkgKiB7QGxpbmtwbGFpbiAjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yKSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2Fsc30KLQkgKiBhbmQKLQkgKiB7QGxpbmtwbGFpbiAjY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQsIElQcm9ncmVzc01vbml0b3IpIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb259Ci0JICogbWV0aG9kcy4gVGhlc2UgZGVsZWdhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIGNvbnRyaWJ1dGVkCi0JICogY29tcHV0ZXIsIGJ1dCBoYW5kbGUgaW5zdGFuY2UgY3JlYXRpb24gYW5kIGFueSBleGNlcHRpb25zIHRocm93bi4KLQkgKgotCSAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNvbXBsZXRpb24gcHJvcG9zYWwgY29tcHV0ZXIgYXMKLQkgKiAgICAgICAgIGRlc2NyaWJlZCBieSB0aGlzIGRlc2NyaXB0b3IKLQkgKiAgICAgICAgIAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgY3JlYXRpb24gZmFpbHMKLQkgKiBAdGhyb3dzIEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbiBpZiB0aGUgZXh0ZW5zaW9uIGlzIG5vdAotCSAqICAgICAgICAgdmFsaWQgYW55IGxvbmdlciAoZS5nLiBkdWUgdG8gcGx1Zy1pbiB1bmxvYWRpbmcpCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciBjcmVhdGVDb21wdXRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24gewotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcikgZkVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRSX0NMQVNTKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD5TYWZlbHkgY29tcHV0ZXMgY29tcGxldGlvbiBwcm9wb3NhbHMgdGhyb3VnaCB0aGUgZGVzY3JpYmVkIGV4dGVuc2lvbi48L3A+Ci0JICoKLQkgKiBAcGFyYW0gY29udGV4dCB0aGUgaW52b2NhdGlvbiBjb250ZXh0IHBhc3NlZCBvbiB0byB0aGUgZXh0ZW5zaW9uCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgcGFzc2VkIG9uIHRvIHRoZSBleHRlbnNpb24KLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNvbXB1dGVkIGNvbXBsZXRpb24gcHJvcG9zYWxzIChlbGVtZW50IHR5cGU6Ci0JICogICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWx9KQotCSAqLwotCXB1YmxpYyBMaXN0IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKENvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlMaXN0IGNvbXBsZXRpb25Qcm9wb3NhbHMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlpZiAoaXNFbmFibGVkKCkpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJLy8gcGx1Z2luIG11c3QgYmUgYWN0aXZlIHRvIGdldCBjb21wdXRlcgotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciBjb21wdXRlciA9IGdldENvbXB1dGVyKHRydWUpOwotCQkJCWlmIChjb21wdXRlciAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlQZXJmb3JtYW5jZVN0YXRzIHN0YXRzPSBzdGFydE1ldGVyKGNvbnRleHQsIGNvbXB1dGVyKTsKLQkJCQkJCS8vYXNrIHRoZSBjb21wdXRlciBmb3IgdGhlIHByb3Bvc2FscwotCQkJCQkJTGlzdCBwcm9wb3NhbHMgPSBjb21wdXRlci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhjb250ZXh0LCBtb25pdG9yKTsKLQkJCQkJCXN0b3BNZXRlcihzdGF0cywgQ09NUFVURV9DT01QTEVUSU9OX1BST1BPU0FMUyk7Ci0JCQotCQkJCQkJaWYgKHByb3Bvc2FscyAhPSBudWxsKSB7Ci0JCQkJCQkJZkxhc3RFcnJvciA9IGNvbXB1dGVyLmdldEVycm9yTWVzc2FnZSgpOwotCQkJCQkJCWNvbXBsZXRpb25Qcm9wb3NhbHMgPSBwcm9wb3NhbHM7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXN0YXR1cyA9IGNyZWF0ZUFQSVZpb2xhdGlvblN0YXR1cyhDT01QVVRFX0NPTVBMRVRJT05fUFJPUE9TQUxTKTsKLQkJCQkJCX0KLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWZJc1JlcG9ydGluZ0RlbGF5ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbiB4KSB7Ci0JCQkJc3RhdHVzPSBjcmVhdGVFeGNlcHRpb25TdGF0dXMoeCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLQkJCQlzdGF0dXM9IGNyZWF0ZUV4Y2VwdGlvblN0YXR1cyh4KTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24geCkgewotCQkJCXN0YXR1cz0gY3JlYXRlRXhjZXB0aW9uU3RhdHVzKHgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkKLQkJCWlmKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJTG9nZ2VyLmxvZyhzdGF0dXMpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvbXBsZXRpb25Qcm9wb3NhbHM7Ci0JfQotCi0JLyoqCi0JICogPHA+U2FmZWx5IGNvbXB1dGVzIGNvbnRleHQgaW5mb3JtYXRpb24gb2JqZWN0cyB0aHJvdWdoIHRoZSBkZXNjcmliZWQgZXh0ZW5zaW9uLjwvcD4KLQkgKgotCSAqIEBwYXJhbSBjb250ZXh0IHRoZSBpbnZvY2F0aW9uIGNvbnRleHQgcGFzc2VkIG9uIHRvIHRoZSBleHRlbnNpb24KLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBwYXNzZWQgb24gdG8gdGhlIGV4dGVuc2lvbgotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY29tcHV0ZWQgY29udGV4dCBpbmZvcm1hdGlvbiBvYmplY3RzIChlbGVtZW50IHR5cGU6Ci0JICogICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb259KQotCSAqLwotCXB1YmxpYyBMaXN0IGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUxpc3QgY29udGV4dEluZm9ybWF0aW9uID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJaWYgKGlzRW5hYmxlZCgpKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIHBsdWdpbiBtdXN0IGJlIGFjdGl2ZSB0byBnZXQgY29tcHV0ZXIKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgY29tcHV0ZXIgPSBnZXRDb21wdXRlcih0cnVlKTsKLQkJCQlpZiAoY29tcHV0ZXIgIT0gbnVsbCkgewotCQkJCQlQZXJmb3JtYW5jZVN0YXRzIHN0YXRzPSBzdGFydE1ldGVyKGNvbnRleHQsIGNvbXB1dGVyKTsKLQkJCQkJTGlzdCBwcm9wb3NhbHM9IGNvbXB1dGVyLmNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oY29udGV4dCwgbW9uaXRvcik7Ci0JCQkJCXN0b3BNZXRlcihzdGF0cywgQ09NUFVURV9DT05URVhUX0lORk9STUFUSU9OKTsKLQkJCi0JCQkJCWlmIChwcm9wb3NhbHMgIT0gbnVsbCkgewotCQkJCQkJZkxhc3RFcnJvcj0gY29tcHV0ZXIuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCQkJCQljb250ZXh0SW5mb3JtYXRpb24gPSBwcm9wb3NhbHM7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdGF0dXMgPSBjcmVhdGVBUElWaW9sYXRpb25TdGF0dXMoQ09NUFVURV9DT05URVhUX0lORk9STUFUSU9OKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbiB4KSB7Ci0JCQkJc3RhdHVzPSBjcmVhdGVFeGNlcHRpb25TdGF0dXMoeCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLQkJCQlzdGF0dXM9IGNyZWF0ZUV4Y2VwdGlvblN0YXR1cyh4KTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24geCkgewotCQkJCXN0YXR1cz0gY3JlYXRlRXhjZXB0aW9uU3RhdHVzKHgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkKLQkJCWlmKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJTG9nZ2VyLmxvZyhzdGF0dXMpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gY29udGV4dEluZm9ybWF0aW9uOwotCX0KLQotCS8qKgotCSAqIDxwPk5vdGlmaWVzIHRoZSBkZXNjcmliZWQgZXh0ZW5zaW9uIG9mIGEgcHJvcG9zYWwgY29tcHV0YXRpb24gc2Vzc2lvbiBzdGFydC48L3A+Ci0JICogCi0JICogPHA+PGI+Tm90ZTogPC9iPlRoaXMgbWV0aG9kIGlzIGNhbGxlZCBldmVyeSB0aW1lIGNvZGUgYXNzaXN0IGlzIGludm9rZWQgYW5kCi0JICogaXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gZmlsdGVyZWQgYnkgY29udGVudCB0eXBlIG9yIHBhcnRpdGlvbiB0eXBlLjwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXNzaW9uU3RhcnRlZCgpIHsKLQkJaWYgKGlzRW5hYmxlZCgpKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIHBsdWdpbiBtdXN0IGJlIGFjdGl2ZSB0byBnZXQgY29tcHV0ZXIKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgY29tcHV0ZXIgPSBnZXRDb21wdXRlcih0cnVlKTsKLQkJCQlpZiAoY29tcHV0ZXIgIT0gbnVsbCkgewotCQkJCQlQZXJmb3JtYW5jZVN0YXRzIHN0YXRzID0gc3RhcnRNZXRlcihTRVNTSU9OX1NUQVJURUQsIGNvbXB1dGVyKTsKLQkJCQkJY29tcHV0ZXIuc2Vzc2lvblN0YXJ0ZWQoKTsKLQkJCQkJc3RvcE1ldGVyKHN0YXRzLCBTRVNTSU9OX0VOREVEKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24geCkgewotCQkJCXN0YXR1cz0gY3JlYXRlRXhjZXB0aW9uU3RhdHVzKHgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJc3RhdHVzPSBjcmVhdGVFeGNlcHRpb25TdGF0dXMoeCk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHgpIHsKLQkJCQlzdGF0dXM9IGNyZWF0ZUV4Y2VwdGlvblN0YXR1cyh4KTsKLQkJCX0KLQkKLQkJCWlmKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJTG9nZ2VyLmxvZyhzdGF0dXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+Tm90aWZpZXMgdGhlIGRlc2NyaWJlZCBleHRlbnNpb24gb2YgYSBwcm9wb3NhbCBjb21wdXRhdGlvbiBzZXNzaW9uIGVuZC48L3A+Ci0JICogCi0JICogPHA+PGI+Tm90ZTogPC9iPlRoaXMgbWV0aG9kIGlzIGNhbGxlZCBldmVyeSB0aW1lIGNvZGUgYXNzaXN0IGlzIGludm9rZWQgYW5kCi0JICogaXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gZmlsdGVyZWQgYnkgY29udGVudCB0eXBlIG9yIHBhcnRpdGlvbiB0eXBlLjwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXNzaW9uRW5kZWQoKSB7Ci0JCWlmIChpc0VuYWJsZWQoKSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBwbHVnaW4gbXVzdCBiZSBhY3RpdmUgdG8gZ2V0IGNvbXB1dGVyCi0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIGNvbXB1dGVyID0gZ2V0Q29tcHV0ZXIodHJ1ZSk7Ci0JCQkJaWYgKGNvbXB1dGVyICE9IG51bGwpIHsKLQkJCQkJUGVyZm9ybWFuY2VTdGF0cyBzdGF0cz0gc3RhcnRNZXRlcihTRVNTSU9OX0VOREVELCBjb21wdXRlcik7Ci0JCQkJCWNvbXB1dGVyLnNlc3Npb25FbmRlZCgpOwotCQkJCQlzdG9wTWV0ZXIoc3RhdHMsIFNFU1NJT05fRU5ERUQpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbiB4KSB7Ci0JCQkJc3RhdHVzPSBjcmVhdGVFeGNlcHRpb25TdGF0dXMoeCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLQkJCQlzdGF0dXM9IGNyZWF0ZUV4Y2VwdGlvblN0YXR1cyh4KTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24geCkgewotCQkJCXN0YXR1cz0gY3JlYXRlRXhjZXB0aW9uU3RhdHVzKHgpOwotCQkJfQotCQotCQkJaWYoc3RhdHVzICE9IG51bGwpIHsKLQkJCQlMb2dnZXIubG9nKHN0YXR1cyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZSBmcm9tIHRoZSBkZXNjcmliZWQge0BsaW5rIElDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcn0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGZMYXN0RXJyb3I7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGZJZCArICI6ICIgKyBmTmFtZTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiA8cD5QYXJzZXMgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBmb3IgaXRzIGFjdGl2YXRpb24gY29udGV4dCwKLQkgKiB0aGF0IGlzIHRvIHNheSB0aGUgY29udGVudCB0eXBlcyBhbmQgcGFydGl0b24gdHlwZXMgYW5kIHVwZGF0ZXMgdGhlIHJlZ2lzdHJ5Ci0JICogdG8gYXNzb2NpYXRlZCB0aGUgZ2l2ZW4gY29tcHV0ZXIgZGVzY3JpcHRvciB3aXRoIHRoZSBwYXJzZWQgYWN0aXZhdGlvbiBjb250ZXh0cy48L1A+Ci0JICogCi0JICogPHA+VGhpcyBpcyB1c2VmdWwgZm9yIHBhcnNpbmcgYm90aCA8dHQ+cHJvcG9zYWxDb21wdXRlcjwvdHQ+IGVsZW1lbnRzIGFuZAotCSAqIDx0dD5wcm9wb3NhbENvbXB1dGVyRXh0ZW5kZWRBY3RpdmF0aW9uPC90dD4gZWxlbWVudHMuPC9wPgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IHtAbGluayBJQ29uZmlndXJhdGlvbkVsZW1lbnR9IGNvbnRhaW5pbmcgdGhlIGFjdGl2YXRpb24gY29udGV4dAotCSAqIEBwYXJhbSBkZXNjIHtAbGluayBDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlckRlc2NyaXB0b3J9IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBwYXJzZWQgYWN0aXZhdGlvbiBjb250ZXh0Ci0JICogCi0JICogQHRocm93cyBJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcGFyc2VBY3RpdmF0aW9uQW5kQWRkVG9SZWdpc3RyeShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvciBkZXNjKSB0aHJvd3MgSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCS8qIGlmIHRoaXMgZGVzY3JpcHRvciBpcyBzcGVjaWZpYyB0byBhIGNvbnRlbnQgdHlwZS9zIGFkZCBpdCB0byB0aGUgcmVnaXN0cnkgYXMgc3VjaAotCQkgKiBlbHNlIGFkZCB0byByZWdpc3RyeSBmb3IgYWxsIGNvbnRlbnQgdHlwZXMKLQkJICovCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbnRlbnRUeXBlcyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oRUxFTV9DT05URU5UX1RZUEUpOwotCQlpZihjb250ZW50VHlwZXMubGVuZ3RoID4gMCkgewotCQkJZm9yKGludCBjb250ZW50VHlwZUluZGV4ID0gMDsgY29udGVudFR5cGVJbmRleCA8IGNvbnRlbnRUeXBlcy5sZW5ndGg7ICsrY29udGVudFR5cGVJbmRleCkgewotCQkJCVN0cmluZyBjb250ZW50VHlwZUlEID0gY29udGVudFR5cGVzW2NvbnRlbnRUeXBlSW5kZXhdLmdldEF0dHJpYnV0ZShBVFRSX0lEKTsKLQkJCQlDb250ZW50QXNzaXN0VXRpbHMuY2hlY2tFeHRlbnNpb25BdHRyaWJ1dGVOb3ROdWxsKGNvbnRlbnRUeXBlSUQsIEFUVFJfSUQsIGNvbnRlbnRUeXBlc1tjb250ZW50VHlwZUluZGV4XSk7Ci0JCQkJCi0JCQkJLyogaWYgdGhpcyBkZXNjcmlwdG9yIGlzIGZvciBzcGVjaWZpYyBwYXJ0aXRpb24gdHlwZXMgaW4gdGhlIGNvbnRlbnQgdHlwZQotCQkJCSAqIGFkZCBpdCB0byB0aGUgcmVnaXN0cnkgYXMgc3VjaAotCQkJCSAqIGVsc2UgYWRkIHRvIHRoZSByZWdpc3RyeSBmb3IgYWxsIHBhcnRpdGlvbiB0eXBlcyBpbiB0aGUgY29udGVudCB0eXBlCi0JCQkJICovCi0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcGFydGl0aW9uVHlwZXMgPSBjb250ZW50VHlwZXNbY29udGVudFR5cGVJbmRleF0uZ2V0Q2hpbGRyZW4oRUxFTV9QQVJUSVRJT05fVFlQRSk7Ci0JCQkJaWYocGFydGl0aW9uVHlwZXMubGVuZ3RoID4gMCkgewotCQkJCQlmb3IgKGludCBwYXJ0aXRpb25UeXBlSW5kZXggPSAwOyBwYXJ0aXRpb25UeXBlSW5kZXggPCBwYXJ0aXRpb25UeXBlcy5sZW5ndGg7ICsrcGFydGl0aW9uVHlwZUluZGV4KSB7Ci0JCQkJCQlTdHJpbmcgcGFydGl0aW9uVHlwZUlEID0gcGFydGl0aW9uVHlwZXNbcGFydGl0aW9uVHlwZUluZGV4XS5nZXRBdHRyaWJ1dGUoQVRUUl9JRCk7Ci0JCQkJCQlDb250ZW50QXNzaXN0VXRpbHMuY2hlY2tFeHRlbnNpb25BdHRyaWJ1dGVOb3ROdWxsKHBhcnRpdGlvblR5cGVJRCwgQVRUUl9JRCwgcGFydGl0aW9uVHlwZXNbcGFydGl0aW9uVHlwZUluZGV4XSk7Ci0JCQkJCQkKLQkJCQkJCUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyUmVnaXN0cnkuZ2V0RGVmYXVsdCgpLnB1dERlc2NyaXB0aW9uKGNvbnRlbnRUeXBlSUQsIHBhcnRpdGlvblR5cGVJRCwgZGVzYyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlclJlZ2lzdHJ5LmdldERlZmF1bHQoKS5wdXREZXNjcmlwdGlvbihjb250ZW50VHlwZUlELCBudWxsLCBkZXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiVGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudDogIiArIGVsZW1lbnQgKyAiIGRvZXMgbm90IGNvbnRhaW4gYW55IGNvbnRlbnQgdHlwZXMuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGx1Z2luIHRoYXQgY29udGFpbnMgdGhlIHtAbGluayBJQ29uZmlndXJhdGlvbkVsZW1lbnR9Ci0JICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGVzY3JpcHRvciBpcyBsb2FkZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUGx1Z2luTG9hZGVkKCkgewotCQlCdW5kbGUgYnVuZGxlPSBnZXRCdW5kbGUoKTsKLQkJcmV0dXJuIGJ1bmRsZSAhPSBudWxsICYmIGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUge0BsaW5rIEJ1bmRsZX0gdGhhdCBjb250YWlucyB0aGUge0BsaW5rIElDb25maWd1cmF0aW9uRWxlbWVudH0gYXNzb2NpYXRlZAotCSAqIHdpdGggdGhpcyBkZXNjcmlwdG9yCi0JICovCi0JcHJpdmF0ZSBCdW5kbGUgZ2V0QnVuZGxlKCkgewotCQlTdHJpbmcgbmFtZXNwYWNlPSBmRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQkJQnVuZGxlIGJ1bmRsZT0gUGxhdGZvcm0uZ2V0QnVuZGxlKG5hbWVzcGFjZSk7Ci0JCXJldHVybiBidW5kbGU7Ci0JfQotCQotCS8qKgotCSAqIDxwPlJldHVybnMgYSBjYWNoZWQgaW5zdGFuY2Ugb2YgdGhlIGNvbXB1dGVyIGFzIGRlc2NyaWJlZCBpbiB0aGUKLQkgKiBleHRlbnNpb24ncyB4bWwuIElmIHRoZSBjb21wdXRlciBpcyBub3QgeWV0IGNyZWF0ZWQgYW5kCi0JICogPGNvZGU+Y2FuQ3JlYXRlPC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIHtAbGluayAjY3JlYXRlQ29tcHV0ZXIoKX0KLQkgKiBpcyBjYWxsZWQgYW5kIHRoZSByZXN1bHQgY2FjaGVkLjwvcD4KLQkgKgotCSAqIEBwYXJhbSBjYW5DcmVhdGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByb3Bvc2FsIGNvbXB1dGVyIGNhbiBiZSBjcmVhdGVkCi0JICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY29tcGxldGlvbiBwcm9wb3NhbCBjb21wdXRlciBhcwotCSAqICAgICAgICAgZGVzY3JpYmVkIGJ5IHRoaXMgZGVzY3JpcHRvcgotCSAqICAgICAgICAgCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBjcmVhdGlvbiBmYWlscwotCSAqIEB0aHJvd3MgSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIGlmIHRoZSBleHRlbnNpb24gaXMgbm90Ci0JICogICAgICAgICB2YWxpZCBhbnkgbG9uZ2VyIChlLmcuIGR1ZSB0byBwbHVnLWluIHVubG9hZGluZykKLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBJQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgZ2V0Q29tcHV0ZXIoYm9vbGVhbiBjYW5DcmVhdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24gewotCQlpZiAoZkNvbXB1dGVyID09IG51bGwgJiYgY2FuQ3JlYXRlICYmICFmVHJpZWRMb2FkaW5nQ29tcHV0ZXIgJiYgKGZBY3RpdmF0ZSB8fCBpc1BsdWdpbkxvYWRlZCgpKSkgewotCQkJZlRyaWVkTG9hZGluZ0NvbXB1dGVyPSB0cnVlOwotCQkJZkNvbXB1dGVyPSBjcmVhdGVDb21wdXRlcigpOwotCQl9Ci0JCXJldHVybiBmQ29tcHV0ZXI7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGVuYWJsZW1lbnQgc3RhdGUgb2YgdGhlIGNhdGVnb3J5IHRoaXMgZGVzY3JpYmVyIGlzIGFzc29jaWF0ZWQgd2l0aAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBmQ2F0ZWdvcnkuaXNFbmFibGVkKCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPlN0YXJ0cyB0aGUgbWV0ZXIgZm9yIG1lYXN1cmluZyB0aGUgY29tcHV0ZXJzIHBlcmZvcm1hbmNlPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogQHBhcmFtIGNvbXB1dGVyCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgUGVyZm9ybWFuY2VTdGF0cyBzdGFydE1ldGVyKE9iamVjdCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgY29tcHV0ZXIpIHsKLQkJZmluYWwgUGVyZm9ybWFuY2VTdGF0cyBzdGF0czsKLQkJaWYgKE1FQVNVUkVfUEVSRk9STUFOQ0UpIHsKLQkJCXN0YXRzPSBQZXJmb3JtYW5jZVN0YXRzLmdldFN0YXRzKFBFUkZPUk1BTkNFX0VWRU5ULCBjb21wdXRlcik7Ci0JCQlzdGF0cy5zdGFydFJ1bihjb250ZXh0LnRvU3RyaW5nKCkpOwotCQl9IGVsc2UgewotCQkJc3RhdHM9IG51bGw7Ci0JCX0KLQotCQlpZiAoZklzUmVwb3J0aW5nRGVsYXkpIHsKLQkJCWZTdGFydD0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3RhdHM7Ci0JfQotCi0JLyoqCi0JICogPHA+U3RvcHMgdGhlIG1ldGVyIGZvciBtZWFzdXJpbmcgdGhlIGNvbXB1dGVycyBwZXJmb3JtYW5jZTwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEBwYXJhbSBjb21wdXRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcE1ldGVyKGZpbmFsIFBlcmZvcm1hbmNlU3RhdHMgc3RhdHMsIFN0cmluZyBvcGVyYXRpb24pIHsKLQkJaWYgKE1FQVNVUkVfUEVSRk9STUFOQ0UpIHsKLQkJCXN0YXRzLmVuZFJ1bigpOwotCQkJaWYgKHN0YXRzLmlzRmFpbHVyZSgpKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXM9IGNyZWF0ZVBlcmZvcm1hbmNlU3RhdHVzKG9wZXJhdGlvbik7Ci0JCQkJTG9nZ2VyLmxvZyhzdGF0dXMpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCWlmIChmSXNSZXBvcnRpbmdEZWxheSkgewotCQkJbG9uZyBjdXJyZW50PSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWlmIChjdXJyZW50IC0gZlN0YXJ0ID4gTUFYX0RFTEFZKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXM9IGNyZWF0ZVBlcmZvcm1hbmNlU3RhdHVzKG9wZXJhdGlvbik7Ci0JCQkJTG9nZ2VyLmxvZyhzdGF0dXMpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gQSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhhdCB0aGUgZGVzY3JpYmVkIHtAbGluayBJQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJ9IGZhaWxlZCBpbiBzb21lIHdheQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZUJsYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuICJUaGUgJyciICsgZ2V0TmFtZSgpICsgIicnIHByb3Bvc2FsIGNvbXB1dGVyIGZyb20gdGhlICcnIiArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKyAiJycgcGx1Zy1pbiBkaWQgbm90IGNvbXBsZXRlIG5vcm1hbGx5LiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogPHA+Q3JlYXRlIGEgc3RhdHVzIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGF0IHRoZSBleHRlbnNpb24gaGFzIGJlY29tZSBpbnZhbGlkPC9wPgotCSAqIAotCSAqIEBwYXJhbSB4IHRoZSBhc3NvY2lhdGVkIHtAbGluayBJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb259Ci0JICogQHJldHVybiB0aGUgY3JlYXRlZCB7QGxpbmsgSVN0YXR1c30KLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgY3JlYXRlRXhjZXB0aW9uU3RhdHVzKEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbiB4KSB7Ci0JCVN0cmluZyBibGFtZT0gY3JlYXRlQmxhbWVNZXNzYWdlKCk7Ci0JCVN0cmluZyByZWFzb249ICJUaGUgZXh0ZW5zaW9uIGhhcyBiZWNvbWUgaW52YWxpZC4iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuT0ssIGJsYW1lICsgIiAiICsgcmVhc29uLCB4KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIDxwPmNyZWF0ZSBhIHN0YXR1cyBtZXNzYWdlIGV4cGxhaW5pbmcgdGhhdCB0aGUgZXh0ZW5zaW9uIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQ8L3A+Ci0JICogCi0JICogQHBhcmFtIHggdGhlIGFzc29jaWF0ZWQge0BsaW5rIENvcmVFeGNlcHRpb259Ci0JICogQHJldHVybiB0aGUgY3JlYXRlZCB7QGxpbmsgSVN0YXR1c30KLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgY3JlYXRlRXhjZXB0aW9uU3RhdHVzKENvcmVFeGNlcHRpb24geCkgewotCQlTdHJpbmcgYmxhbWUgPSBjcmVhdGVCbGFtZU1lc3NhZ2UoKTsKLQkJU3RyaW5nIHJlYXNvbiA9ICJVbmFibGUgdG8gaW5zdGFudGlhdGUgdGhlIGV4dGVuc2lvbi4iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLk9LLCBibGFtZSArICIgIiArIHJlYXNvbiwgeCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiA8cD5DcmVhdGUgYSBzdGF0dXMgbWVzc2FnZSBleHBsYWluaW5nIHRoZSBleHRlbnNpb24gaGFzIHRocm93biBhIHJ1bnRpbWUgZXhjZXB0aW9uPC9wPgotCSAqIAotCSAqIEBwYXJhbSB4IHRoZSBhc3NvY2lhdGVkIHtAbGluayBSdW50aW1lRXhjZXB0aW9ufQotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQge0BsaW5rIElTdGF0dXN9Ci0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIGNyZWF0ZUV4Y2VwdGlvblN0YXR1cyhSdW50aW1lRXhjZXB0aW9uIHgpIHsKLQkJU3RyaW5nIGJsYW1lPSBjcmVhdGVCbGFtZU1lc3NhZ2UoKTsKLQkJU3RyaW5nIHJlYXNvbj0gIlRoZSBleHRlbnNpb24gaGFzIHRocm93biBhIHJ1bnRpbWUgZXhjZXB0aW9uLiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5PSywgYmxhbWUgKyAiICIgKyByZWFzb24sIHgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogPHA+Q3JlYXRlIGEgc3RhdHVzIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGUgZXh0ZW5zaW9uIGhhcyB2aW9sYXRlZCB0aGUgQVBJIG9mIHRoZSBleHRlbnNpb24gcG9pbnQ8L3A+Ci0JICogCi0JICogQHBhcmFtIG9wZXJhdGlvbiB0aGUgb3BlcmF0aW9uIHRoYXQgY3JlYXRlZCB0aGUgQVBJIHZpb2xhdGlvbgotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQge0BsaW5rIElTdGF0dXN9Ci0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIGNyZWF0ZUFQSVZpb2xhdGlvblN0YXR1cyhTdHJpbmcgb3BlcmF0aW9uKSB7Ci0JCVN0cmluZyBibGFtZSA9IGNyZWF0ZUJsYW1lTWVzc2FnZSgpOwotCQlTdHJpbmcgcmVhc29uID0gIlRoZSBleHRlbnNpb24gdmlvbGF0ZWQgdGhlIEFQSSBjb250cmFjdCBvZiB0aGUgJyciICsgb3BlcmF0aW9uICsgIicnIG9wZXJhdGlvbi4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5PSywgYmxhbWUgKyAiICIgKyByZWFzb24sIG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogPHA+Q3JlYXRlIGEgc3RhdHVzIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGF0IHRoZSBleHRlbnNpb24gdG9vayB0byBsb25nIGR1cmluZyBhbiBvcGVyYXRpb248L3A+Ci0JICogCi0JICogQHBhcmFtIG9wZXJhdGlvbiB0aGUgb3BlcmF0aW9uIHRoYXQgdG9vayB0byBsb25nCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCB7QGxpbmsgSVN0YXR1c30KLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgY3JlYXRlUGVyZm9ybWFuY2VTdGF0dXMoU3RyaW5nIG9wZXJhdGlvbikgewotCQlTdHJpbmcgYmxhbWU9IGNyZWF0ZUJsYW1lTWVzc2FnZSgpOwotCQlTdHJpbmcgcmVhc29uID0gIlRoZSBleHRlbnNpb24gdG9vayB0b28gbG9uZyB0byByZXR1cm4gZnJvbSB0aGUgJyciICsgb3BlcmF0aW9uICsgIicnIG9wZXJhdGlvbi4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5PSywgYmxhbWUgKyAiICIgKyByZWFzb24sIG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWI1YjgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLQotLyoqCi0gKiA8cD5BIHJlZ2lzdHJ5IGZvciBhbGwgZXh0ZW5zaW9ucyB0byB0aGUKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29tcGxldGlvblByb3Bvc2FsPC9jb2RlPgotICogZXh0ZW5zaW9uIHBvaW50LjwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyUmVnaXN0cnkgewotCi0JLyoqIFRoZSBleHRlbnNpb24gc2NoZW1hIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBwb2ludCAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlQgPSAiY29tcGxldGlvblByb3Bvc2FsIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBUaGUgZXh0ZW5zaW9uIHNjaGVtYSBuYW1lIG9mIHByb3Bvc2FsIGNhdGVnb3J5IGNoaWxkIGVsZW1lbnRzLiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1BST1BPU0FMX0NBVEVHT1JZID0gInByb3Bvc2FsQ2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIFRoZSBleHRlbnNpb24gc2NoZW1hIG5hbWUgb2YgcHJvcG9zYWwgY29tcHV0ZXIgY2hpbGQgZWxlbWVudHMuICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fUFJPUE9TQUxfQ09NUFVURVIgPSAicHJvcG9zYWxDb21wdXRlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogVGhlIGV4dGVuc2lvbiBzY2hlbWEgbmFtZSBvZiBwcm9wb3NhbCBjb21wdXRlciBhY3RpdmF0aW9uIGNoaWxkIGVsZW1lbnRzLiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1BST1BPU0FMX0NPTVBVVEVSX0VYVEVOREVEX0FDVElWQVRJT04gPSAicHJvcG9zYWxDb21wdXRlckV4dGVuZGVkQWN0aXZhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogVGhlIGV4dGVuc2lvbiBzY2hlbWEgbmFtZSBmb3IgZWxlbWVudCBJRCBhdHRyaWJ1dGVzICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSUQ9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogcHJlZmVyZW5jZSBrZXkgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBrbm93biBudW1iZXIgb2YgY29udGVudCBhc3Npc3QgY29tcHV0ZXJzICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTV9DT01QVVRFUlNfUFJFRl9LRVkgPSAiY29udGVudF9hc3Npc3RfbnVtYmVyX29mX2NvbXB1dGVycyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBBIGZha2UgcGFydGl0aW9uIHR5cGUgSUQgc3RhdGluZyB1c2VkIHRvIHNheSBhIHtAbGluayBDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlckRlc2NyaXB0b3J9IHNob3VsZAotCSAqIGJlIGFzc29jaWF0ZWQgd2l0aCBhbGwgcGFydGl0aW9uIHR5cGVzIGluIGEgZ2l2ZW4gY29udGVudCB0eXBlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfUEFSVElUSU9OX1RZUEVTX0lEID0gImFsbF9wYXJ0aXRpb25fdHlwZXNfZmFrZV9JRCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogU3RhdGUgd2hlcmUgaW4gdGhlIHJlZ2lzdHJ5IGhhcyBub3QgeWV0IGJlZW4gbG9hZGVkICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBOT05FID0gMDsKLQotCS8qKiBTdGF0ZSB3aGVyZSB0aGUgcmVnaXN0cnkgaXMgYmVpbmcgaW5pdGlhbGl6ZWQgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIElOSVRJQUxJWklORyA9IDE7Ci0JCi0JLyoqIFN0YXRlIHdoZXJlIGluIHRoZSByZWdpc3RyeSBpcyBjdXJyZW50bHkgYmVpbmcgbG9hZGVkICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBMT0FESU5HID0gMjsKLQkKLQkvKiogU3RhdGUgd2hlcmUgaW4gdGhlIHJlZ2lzdHJ5IGhhcyBiZWVuIGxvYWRlZCAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgTE9BREVEID0gMzsKLQotCS8qKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlLiAqLwotCXByaXZhdGUgc3RhdGljIENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyUmVnaXN0cnkgZmdTaW5nbGV0b249IG51bGw7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJSZWdpc3RyeSBnZXREZWZhdWx0KCkgewotCQlpZiAoZmdTaW5nbGV0b24gPT0gbnVsbCkgewotCQkJZmdTaW5nbGV0b249IG5ldyBDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlclJlZ2lzdHJ5KCk7Ci0JCX0KLQotCQlyZXR1cm4gZmdTaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+e0BsaW5rIE1hcH0mbHR7QGxpbmsgU3RyaW5nfSwge0BsaW5rIENvbXBsZXRpb25Qcm9wb3NhbENvbnRlbnRUeXBlQ29udGV4dH0mZ3Q8L2NvZGU+Ci0JICogPHVsPgotCSAqIDxsaT48Yj5rZXk6PC9iPiBjb250ZW50IHR5cGUgSUQ8L2xpPgotCSAqIDxsaT48Yj52YWx1ZTo8L2I+IHRoZSBjb250ZXh0IGZvciB0aGUgYXNzb2NpYXRlZCBjb250ZW50IHR5cGUgSUQ8L2xpPgotCSAqIDx1bD4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE1hcCBmQWN0aXZhdGlvbkNvbnRleHRzOwotCQotCS8qKgotCSAqIDxjb2RlPntAbGluayBNYXB9Jmx0e0BsaW5rIFN0cmluZ30sIHtAbGluayBDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlckRlc2NyaXB0b3J9Jmd0PC9jb2RlPgotCSAqIDx1bD4KLQkgKiA8bGk+PGI+a2V5OjwvYj4gZGVzY3JpcHRvciBJRDwvbGk+Ci0JICogPGxpPjxiPnZhbHVlOjwvYj4gZGVzY3JpcHRvcjwvbGk+Ci0JICogPHVsPgotCSAqLwotCXByaXZhdGUgZmluYWwgTWFwIGZEZXNjcmlwdG9ycyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKiogVGhlIHtAbGluayBDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeX1zIHRyYWNrZWQgYnkgdGhpcyByZWdpc3RyeSAqLwotCXByaXZhdGUgZmluYWwgTGlzdCBmQ2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkvKiogVW5tb2RpZmlhYmxlIHB1YmxpYyBsaXN0IG9mIHRoZSB7QGxpbmsgQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnl9cyB0cmFja2VkIGJ5IHRoaXMgcmVnaXN0cnkgKi8KLQlwcml2YXRlIGZpbmFsIExpc3QgZlB1YmxpY0NhdGVnb3JpZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGZDYXRlZ29yaWVzKTsKLQkKLQkvKioKLQkgKiA8cD5UaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcmVnaXN0cnk8L3A+Ci0JICogCi0JICogQHNlZSAjTk9ORQotCSAqIEBzZWUgI0xPQURJTkcKLQkgKiBAc2VlICNMT0FERUQKLQkgKi8KLQlwcml2YXRlIGJ5dGUgZlN0YXRlOwotCQotCS8qKgotCSAqIExvY2sgdGhhdCBpcyBoZWxkIHdoaWxlIGxvYWRpbmcsIG9wZXJhdGlvbnMgd2FpdGluZyBmb3IKLQkgKiBsb2FkIHRvIGZpbmlzaCBjYW4gbG9jayBvbiB0aGlzIGFzIHdlbGwKLQkgKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBmTG9hZGluZ0xvY2s7Ci0KLQkvKiogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY29tcHV0ZXJzIGhhdmUgYmVlbiB1bmluc3RhbGxlZCBzaW5jZSBsYXN0IGxvYWQgKi8KLQlwcml2YXRlIGJvb2xlYW4gZkhhc1VuaW5zdGFsbGVkQ29tcHV0ZXJzPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlclJlZ2lzdHJ5KCkgewotCQl0aGlzLmZBY3RpdmF0aW9uQ29udGV4dHMgPSBuZXcgSGFzaE1hcCgpOwotCQl0aGlzLmZTdGF0ZSA9IENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyUmVnaXN0cnkuTk9ORTsKLQkJdGhpcy5mTG9hZGluZ0xvY2sgPSBuZXcgT2JqZWN0KCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPkNhbGxpbmcgdGhpcyB3aGVuIHRoZSByZWdpc3RyeSBoYXMgbm90IHlldCBiZWVuIGxvYWRlZCB3aWxsIHN0YXJ0IGEKLQkgKiB7QGxpbmsgVGhyZWFkfSB0byBzdGFydCBsb2FkaW5nIHRoZSByZWdpc3RyeS4gIEFsbCBvdGhlciBvcGVyYXRpb25zIG9uCi0JICogdGhlIHJlZ2lzdHJ5IHdpbGwgYmUgYmxvY2tlZCB1bnRpbCB0aGUgbG9hZGluZyBoYXMgY29tcGxldGVkLiAgSWYKLQkgKiB0aGUgcmVnaXN0cnkgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQgb3IgaXMgbG9hZGluZyB0aGVuIHRoaXMKLQkgKiBtZXRob2QgZG9lcyBub3RoaW5nLjwvcD4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYoZlN0YXRlID09IENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyUmVnaXN0cnkuTk9ORSkgewotCQkJZlN0YXRlID0gQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJSZWdpc3RyeS5JTklUSUFMSVpJTkc7Ci0JCQluZXcgVGhyZWFkKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJSZWdpc3RyeS50aGlzLmxvYWQoKTsKLQkJCQl9Ci0JCQl9LnN0YXJ0KCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+PGI+Tk9URTogPC9iPlRoZSByZXR1cm5lZCBsaXN0IGlzIHJlYWQtb25seSBhbmQgaXMgc29ydGVkIGluIHRoZSBvcmRlciB0aGF0IHRoZQotCSAqIGV4dGVuc2lvbnMgd2VyZSByZWFkIGluLiBUaGVyZSBhcmUgbm8gZHVwbGljYXRlIGVsZW1lbnRzIGluIHRoZSByZXR1cm5lZCBsaXN0LgotCSAqIFRoZSByZXR1cm5lZCBsaXN0IG1heSBjaGFuZ2UgaWYgcGx1Zy1pbnMgYXJlIGxvYWRlZCBvciB1bmxvYWRlZCB3aGlsZSB0aGUKLQkgKiBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLjwvcD4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgcHJvcG9zYWwgY2F0ZWdvcmllcyBjb250cmlidXRlZCB0byB0aGUKLQkgKiA8Y29kZT5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbXBsZXRpb25Qcm9wb3NhbDwvY29kZT4gZXh0ZW5zaW9uIHBvaW50IChlbGVtZW50IHR5cGU6Ci0JICogICAgICAgICB7QGxpbmsgQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnl9KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3Bvc2FsQ2F0ZWdvcmllcygpIHsKLQkJaW50ZXJuYWxFbnN1cmVMb2FkZWQoKTsKLQkJcmV0dXJuIGZQdWJsaWNDYXRlZ29yaWVzOwotCX0KLQkKLQkvKioKLQkgKiA8cD48Yj5OT1RFOiA8L2I+VGhlIHJldHVybmVkIGxpc3QgaXMgcmVhZC1vbmx5IGFuZCBpcyBzb3J0ZWQgaW4gdGhlIG9yZGVyIHRoYXQgdGhlCi0JICogZXh0ZW5zaW9ucyB3ZXJlIHJlYWQgaW4uIFRoZXJlIGFyZSBubyBkdXBsaWNhdGUgZWxlbWVudHMgaW4gdGhlIHJldHVybmVkIGxpc3QuCi0JICogVGhlIHJldHVybmVkIGxpc3QgbWF5IGNoYW5nZSBpZiBwbHVnLWlucyBhcmUgbG9hZGVkIG9yIHVubG9hZGVkIHdoaWxlIHRoZQotCSAqIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50VHlwZUlEIGdldCB0aGUge0BsaW5rIENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5fXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSUQKLQkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnl9cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQgdHlwZSBJRAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3Bvc2FsQ2F0ZWdvcmllcyhTdHJpbmcgY29udGVudFR5cGVJRCkgewotCQlpbnRlcm5hbEVuc3VyZUxvYWRlZCgpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IGZDYXRlZ29yaWVzLnNpemUoKTsgKytpKSB7Ci0JCQlDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeSBjYXRlZ29yeSA9ICgoQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnkpZkNhdGVnb3JpZXMuZ2V0KGkpKTsKLQkJCWlmKGNhdGVnb3J5Lmhhc0NvbXB1dGVycyhjb250ZW50VHlwZUlEKSkgewotCQkJCXJlc3VsdC5hZGQoY2F0ZWdvcnkpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChyZXN1bHQpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWdpc3RyeSBkZXRlY3RlZCB0aGF0IGNvbXB1dGVycyBnb3QgdW5pbnN0YWxsZWQgc2luY2UgdGhlIGxhc3QgcnVuCi0JICogCQkJPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZSBvciBpZiB7QGxpbmsgI3Jlc2V0VW5pc3RhbGxlZENvbXB1dGVycygpfSBoYXMgYmVlbiBjYWxsZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNVbmluc3RhbGxlZENvbXB1dGVycygpIHsKLQkJcmV0dXJuIGZIYXNVbmluc3RhbGxlZENvbXB1dGVyczsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Q2xlYXJzIHRoZSBzZXR0aW5nIHRoYXQgdW5pbnN0YWxsZWQgY29tcHV0ZXJzIGhhdmUgYmVlbiBkZXRlY3RlZC4KLQkgKiBUaGlzIHNldHRpbmcgaXMgdXNlZCB0byBkZWNpZGUgd2VhdGhlciBhIGhlbHBmdWwgbWVzc2FnZSBzaG91bGQgYmUKLQkgKiBkaXNwbGF5ZWQgdG8gdGhlIHVzZXI8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgcmVzZXRVbmlzdGFsbGVkQ29tcHV0ZXJzKCkgewotCQlmSGFzVW5pbnN0YWxsZWRDb21wdXRlcnMgPSBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+QWRkcyB0aGUgZ2l2ZW4ge0BsaW5rIENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvcn0gdG8gdGhlIHJlZ2lzdHJ5LjwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFR5cGVJRCB0aGUgSUQgb2YgdGhlIGNvbnRlbnQgdHlwZSB0byBhc3NvY2lhdGVkIHRoZSBkZXNjcmlwdG9yIHdpdGgKLQkgKiBAcGFyYW0gcGFydGl0aW9uVHlwZUlEIHRoZSBJRCBvZiB0aGUgcGFydGl0aW9uIHR5cGUgaW4gdGhlIGNvbnRlbnQgdHlwZSB0byBhc3NvY2lhdGUKLQkgKiB0aGUgZGVzY3JpcHRvciB3aXRoLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBhc3NvY2lhdGUgd2l0aCBhbGwgcGFydGl0aW9uIHR5cGVzIGluCi0JICogdGhlIGNvbnRlbnQgdHlwZS4KLQkgKiBAcGFyYW0gZGVzY3JpcHRvciB0aGUge0BsaW5rIENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvcn0gdG8gYXNzb2NpYXRlIHdpdGgKLQkgKiB0aGUgZ2l2ZW4gY29udGVudCB0eXBlIGFuZCBwYXJ0aXRpb24gdHlwZQotCSAqLwotCXZvaWQgcHV0RGVzY3JpcHRpb24oU3RyaW5nIGNvbnRlbnRUeXBlSUQsIFN0cmluZyBwYXJ0aXRpb25UeXBlSUQsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQkKLQkJaWYocGFydGl0aW9uVHlwZUlEID09IG51bGwpIHsKLQkJCXBhcnRpdGlvblR5cGVJRCA9IEFMTF9QQVJUSVRJT05fVFlQRVNfSUQ7Ci0JCX0KLQkJCi0JCUNvbXBsZXRpb25Qcm9wb3NhbENvbnRlbnRUeXBlQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dChjb250ZW50VHlwZUlEKTsKLQkJY29udGV4dC5wdXREZXNjcmlwdG9yKHBhcnRpdGlvblR5cGVJRCwgZGVzY3JpcHRvcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlSUQgZ2V0IG9ubHkgZGVzY3JpcHRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGVudCB0eXBlCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGVJRCBnZXQgb25seSBkZXNjcmlwdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYXJ0aXRpb24gdHlwZSBhcyB3ZWxsCi0JICogYXMgZGVzY3JpYmVycyBhc3NvY2lhdGVkIHdpdGggYW55IHBhcnRpdGlvbiB0eXBlIGluIHRoZSBnaXZlbiBjb250ZW50IHR5cGUKLQkgKiBAcmV0dXJuIGFsbCBvZiB0aGUge0BsaW5rIENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvcn1zIGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiBjb250ZW50IHR5cGUgYW5kIHBhcnRpdGlvbiB0eXBlIChpbmNsdWRpbmcgYW55IGRlc2NyaWJlcnMgYXNzb2NpYXRlZCB3aXRoIGFsbAotCSAqIHBhcnRpdGlvbiB0eXBlcyBpbiB0aGUgZ2l2ZW4gY29udGVudCB0eXBlKQotCSAqLwotCUxpc3QgZ2V0UHJvcG9zYWxDb21wdXRlckRlc2NyaXB0b3JzKFN0cmluZyBjb250ZW50VHlwZUlELCBTdHJpbmcgcGFydGl0aW9uVHlwZUlEKSB7Ci0JCWludGVybmFsRW5zdXJlTG9hZGVkKCk7Ci0JCQotCQlTZXQgZGVzY3JpcHRvcnNTZXQgPSBuZXcgSGFzaFNldCgpOwotCQlMaXN0IGNvbnRleHRzID0gdGhpcy5nZXRDb250ZXh0cyhjb250ZW50VHlwZUlEKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IGNvbnRleHRzLnNpemUoKTsgKytpKSB7Ci0JCQlDb21wbGV0aW9uUHJvcG9zYWxDb250ZW50VHlwZUNvbnRleHQgY29udGVudFNwZWNpZmljQ29udGV4dCA9Ci0JCQkJKENvbXBsZXRpb25Qcm9wb3NhbENvbnRlbnRUeXBlQ29udGV4dCljb250ZXh0cy5nZXQoaSk7Ci0JCQkKLQkJCS8vYWRkIGFsbCBkZXNjcmlwdG9ycyBzcGVjaWZpYyB0byB0aGUgZ2l2ZW4gY29udGVudCB0eXBlIGFuZCB0aGUgZ2l2ZW4gcGFydGl0aW9uIHR5cGUKLQkJCWRlc2NyaXB0b3JzU2V0LmFkZEFsbChjb250ZW50U3BlY2lmaWNDb250ZXh0LmdldERlc2NyaXB0b3JzKHBhcnRpdGlvblR5cGVJRCkpOwotCQkJCi0JCQkvL2FkZCBhbGwgZGVzY3JpcHRvcnMgc3BlY2lmaWMgdG8gdGhlIGdpdmVuIGNvbnRlbnQgdHlwZSBidXQgbm90IHNwZWNpZmljIHRvIGEgcGFydGl0aW9uIHR5cGUKLQkJCWRlc2NyaXB0b3JzU2V0LmFkZEFsbChjb250ZW50U3BlY2lmaWNDb250ZXh0LmdldERlc2NyaXB0b3JzKEFMTF9QQVJUSVRJT05fVFlQRVNfSUQpKTsKLQkJfQotCQkKLQkJTGlzdCBkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoZGVzY3JpcHRvcnNTZXQpOwotCQlyZXR1cm4gZGVzY3JpcHRvcnMgIT0gbnVsbCA/IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoZGVzY3JpcHRvcnMpIDogQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlSUQgZ2V0IG9ubHkgZGVzY3JpcHRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGVudCB0eXBlCi0JICogQHJldHVybiBhbGwgb2YgdGhlIHtAbGluayBDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlckRlc2NyaXB0b3J9cyBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICogZ2l2ZW4gY29udGVudCB0eXBlCi0JICovCi0JTGlzdCBnZXRQcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvcnMoU3RyaW5nIGNvbnRlbnRUeXBlSUQpIHsKLQkJaW50ZXJuYWxFbnN1cmVMb2FkZWQoKTsKLQkJCi0JCVNldCBkZXNjcmlwdG9yc1NldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQotCQlMaXN0IGNvbnRleHRzID0gdGhpcy5nZXRDb250ZXh0cyhjb250ZW50VHlwZUlEKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IGNvbnRleHRzLnNpemUoKTsgKytpKSB7Ci0JCQlDb21wbGV0aW9uUHJvcG9zYWxDb250ZW50VHlwZUNvbnRleHQgY29udGVudFNwZWNpZmljQ29udGV4dCA9Ci0JCQkJKENvbXBsZXRpb25Qcm9wb3NhbENvbnRlbnRUeXBlQ29udGV4dCljb250ZXh0cy5nZXQoaSk7Ci0JCQkKLQkJCS8vYWRkIGFsbCBkZXNjcmlwdG9ycyBzcGVjaWZpYyB0byB0aGUgZ2l2ZW4gY29udGVudCB0eXBlCi0JCQlkZXNjcmlwdG9yc1NldC5hZGRBbGwoY29udGVudFNwZWNpZmljQ29udGV4dC5nZXREZXNjcmlwdG9ycygpKTsKLQkJfQotCQkKLQkJTGlzdCBkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoZGVzY3JpcHRvcnNTZXQpOwotCQlyZXR1cm4gZGVzY3JpcHRvcnMgIT0gbnVsbCA/IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoZGVzY3JpcHRvcnMpIDogQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFVubW9kaWZpYWJsZSBsaXN0IG9mIGFsbCBvZiB0aGUge0BsaW5rIENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvcn1zIGFzc29jaWF0ZWQgd2l0aAotCSAqIHRoaXMgcmVnaXN0cnkKLQkgKi8KLQlMaXN0IGdldFByb3Bvc2FsQ29tcHV0ZXJEZXNjcmlwdG9ycygpIHsKLQkJaW50ZXJuYWxFbnN1cmVMb2FkZWQoKTsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoIG5ldyBBcnJheUxpc3QoZkRlc2NyaXB0b3JzLnZhbHVlcygpKSk7Ci0JfQotCi0JLyoqCi0JICogPHA+VGhpcyBtZXRob2QgcGVyZm9ybXMgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgcmVnaXN0cnk8L3A+Ci0JICogPHVsPgotCSAqIDxsaT57QGxpbmsgI05PTkV9IC0gZm9yY2VzIHRoZSByZWdpc3RyeSB0byBsb2FkIG5vdyBvbiB0aGUgY3VycmVudCB0aHJlYWQ8L2xpPgotCSAqIDxsaT57QGxpbmsgI0xPQURJTkd9IC0gYmxvY2tzIHVudGlsIHRoZSByZWdpc3RyeSBoYXMgZmluaXNoZWQgbG9hZGluZyBvbgotCSAqIHdoaWNoZXZlciB0aHJlYWQgaXQgaXMgYmVpbmcgbG9hZGVkIG9uPC9saT4KLQkgKiA8bGk+e0BsaW5rICNMT0FERUR9IC0gaW1tZWRpYXRlbHkgcmV0dXJuczwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxFbnN1cmVMb2FkZWQoKSB7Ci0JCXN3aXRjaCAoZlN0YXRlKSB7Ci0JCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyUmVnaXN0cnkuTk9ORToKLQkJCWNhc2UgQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJSZWdpc3RyeS5JTklUSUFMSVpJTkc6IHsKLQkJCQlsb2FkKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyUmVnaXN0cnkuTE9BRElORzogewotCQkJCS8vYXMgc29vbiBhcyB0aGlzIGxvY2sgaXMgcmVsZWFzZWQgdGhlIGxvYWRpbmcgcHJvY2VzcyBpcyBkb25lCi0JCQkJc3luY2hyb25pemVkIChmTG9hZGluZ0xvY2spIHsKLQkJCQkJLy9zYW5pdHkgY2hlY2sKLQkJCQkJQXNzZXJ0LmlzVHJ1ZShmU3RhdGUgPT0gQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJSZWdpc3RyeS5MT0FERUQsCi0JCQkJCQkJIlRoZSBzdGF0ZSBvZiB0aGUgcmVnaXN0cnkgc2hvdWxkIGJlIGd1YXJhbnRlZWQgdG8gYmUgTE9BREVEICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJIiBvbmNlIHRoZSBsb2FkaW5nIGxvY2sgaGFzIGJlZW4gcmVsZWFzZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+TG9hZHMgdGhlIGNvbXBsZXRpb24gcHJvcG9zYWwgZXh0ZW5zaW9uIHBvaW50cyBpZiB0aGV5Ci0JICogaGF2ZSBub3QgYmVlbiBsb2FkZWQgYWxyZWFkeTwvcD4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZCgpIHsKLQkJLyogaG9sZCB0aGlzIGxvY2sgd2hpbGUgbG9hZGluZywgb3RoZXJzIHdhaXRpbmcgZm9yIGxvYWQgdG8KLQkJICogZmluaXNoIGNhbiBzeW5jaHJvbml6ZSBvbiB0aGlzIGxvY2sgdG8gYmUgZ3VhcmFudGVlZCB0aGUgbG9hZAotCQkgKiB3aWxsIGJlIGRvbmUgd2hlbiB0aGUgbG9jayBpcyByZWxlYXNlZAotCQkgKi8KLQkJc3luY2hyb25pemVkIChmTG9hZGluZ0xvY2spIHsKLQkJCWlmKGZTdGF0ZSA9PSBDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlclJlZ2lzdHJ5Lk5PTkUgfHwgZlN0YXRlID09IENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyUmVnaXN0cnkuSU5JVElBTElaSU5HKSB7Ci0JCQkJLy91cGRhdGUgdGhlIHN0YXRlCi0JCQkJZlN0YXRlID0gQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJSZWdpc3RyeS5MT0FESU5HOwotCQkJCQotCQkJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeT0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCQlMaXN0IGV4dGVuc2lvbkVsZW1lbnRzPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QocmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNTRVVJUGx1Z2luLklELCBFWFRFTlNJT05fUE9JTlQpKSk7Ci0JCQotCQkJCU1hcCBsb2FkZWREZXNjcmlwdG9ycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJTGlzdCBleHRlbmRlZENvbXB1dGVyQWN0aXZhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkJCS8vZ2V0IHRoZSBjYXRlZ29yaWVzIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBleHRlbnNpb24gZWxlbWVudHMKLQkJCQlMaXN0IGNhdGVnb3JpZXM9IGdldENhdGVnb3JpZXMoZXh0ZW5zaW9uRWxlbWVudHMpOwotCQkJCQotCQkJCS8vZGVhbCB3aXRoIHRoZSBwcm9wb3NhbCBjb21wdXRlcnMgYW5kIHNldCBhc2lkZSB0aGUgcHJvcG9zYWwgY29tcHV0ZXIgYWN0aXZhdGlvbiBleHRlbnNpb25zCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyPSBleHRlbnNpb25FbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQl0cnkgewotCQkJCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFTEVNX1BST1BPU0FMX0NPTVBVVEVSKSkgewotCQkJCQkJCS8vY3JlYXRlIHRoZSBkZXNjcmlwdG9yIGFuZCBhZGQgaXQgdG8gdGhlIHJlZ2lzdHJ5Ci0JCQkJCQkJQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJEZXNjcmlwdG9yIGRlc2MgPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJEZXNjcmlwdG9yKGVsZW1lbnQsIGNhdGVnb3JpZXMpOwotCQkJCQkJCWRlc2MuYWRkVG9SZWdpc3RyeSgpOwotCQkJCQkJCWxvYWRlZERlc2NyaXB0b3JzLnB1dChkZXNjLmdldElkKCksIGRlc2MpOwotCQkJCQkJfSBlbHNlIGlmKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFTEVNX1BST1BPU0FMX0NPTVBVVEVSX0VYVEVOREVEX0FDVElWQVRJT04pKSB7Ci0JCQkJCQkJZXh0ZW5kZWRDb21wdXRlckFjdGl2YXRpb25zLmFkZChlbGVtZW50KTsKLQkJCQkJCX0KLQkJCi0JCQkJCX0gY2F0Y2ggKEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbiB4KSB7Ci0JCQkJCQkvKgotCQkJCQkJICogRWxlbWVudCBpcyBub3QgdmFsaWQgYW55IGxvbmdlciBhcyB0aGUgY29udHJpYnV0aW5nIHBsdWctaW4gd2FzIHVubG9hZGVkIG9yIGZvcgotCQkJCQkJICogc29tZSBvdGhlciByZWFzb24uIERvIG5vdCBpbmNsdWRlIHRoZSBleHRlbnNpb24gaW4gdGhlIGxpc3QgYW5kIGxvZyBpdAotCQkJCQkJICovCi0JCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJUaGUgZXh0ZW5zaW9uICcnIiArIGVsZW1lbnQudG9TdHJpbmcoKSArICInJyBpcyBpbnZhbGlkLiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJSVN0YXR1cyBzdGF0dXM9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgeCk7Ci0JCQkJCQlMb2dnZXIubG9nKHN0YXR1cyk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24geCkgewotCQkJCQkJTG9nZ2VyLmxvZyh4LmdldFN0YXR1cygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvL2RlYWwgd2l0aCBleHRlbmRlZCBjb21wdXRlciBhY3RpdmF0aW9ucwotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBleHRlbmRlZENvbXB1dGVyQWN0aXZhdGlvbnMuc2l6ZSgpOyArK2kpIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KWV4dGVuZGVkQ29tcHV0ZXJBY3RpdmF0aW9ucy5nZXQoaSk7Ci0JCQkJCVN0cmluZyBwcm9wb3NhbENvbXB1dGVySUQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0lEKTsKLQkJCQkJQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPQotCQkJCQkJKENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvcilsb2FkZWREZXNjcmlwdG9ycy5nZXQocHJvcG9zYWxDb21wdXRlcklEKTsKLQkJCQkJaWYoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vYWRkIHRoZSBleHRyYSBhY3RpdmF0aW9uIGNvbnRleHRzIHRvIHRoZSByZWdpc3RyeQotCQkJCQkJCUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvci5wYXJzZUFjdGl2YXRpb25BbmRBZGRUb1JlZ2lzdHJ5KGVsZW1lbnQsIGRlc2NyaXB0b3IpOwotCQkJCQkJfSBjYXRjaCAoSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIHgpIHsKLQkJCQkJCQkvKgotCQkJCQkJCSAqIEVsZW1lbnQgaXMgbm90IHZhbGlkIGFueSBsb25nZXIgYXMgdGhlIGNvbnRyaWJ1dGluZyBwbHVnLWluIHdhcyB1bmxvYWRlZCBvciBmb3IKLQkJCQkJCQkgKiBzb21lIG90aGVyIHJlYXNvbi4gRG8gbm90IGluY2x1ZGUgdGhlIGV4dGVuc2lvbiBpbiB0aGUgbGlzdCBhbmQgbG9nIGl0Ci0JCQkJCQkJICovCi0JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAiVGhlIGV4dGVuc2lvbiAnJyIgKyBlbGVtZW50LnRvU3RyaW5nKCkgKyAiJycgaXMgaW52YWxpZC4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQlJU3RhdHVzIHN0YXR1cz0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCB4KTsKLQkJCQkJCQlMb2dnZXIubG9nKHN0YXR1cyk7Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLQkJCQkJCQlMb2dnZXIubG9nKHguZ2V0U3RhdHVzKCkpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvL2FjdGl2YXRpb24gZXh0ZW5zaW9uIGhhcyBpbnZhbGlkIGNvbXB1dGVyIElECi0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiQ29uZmlndXJhdGlvbiBlbGVtZW50ICIgKyBlbGVtZW50ICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkiIGludGVudGVkIHRvIGV4dGVuZCBhbiBleGlzdGluZyBjb21wbGV0aW9uIHByb3Bvc2FsIGNvbXB1dGVyIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJIiBzcGVjaWZpZWQgYW4gaW52YWxpZCBjb21wbGV0aW9uIHByb3Bvc2FsIGNvbXB1dGVyIElEICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXByb3Bvc2FsQ29tcHV0ZXJJRCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQotCQkJCWZDYXRlZ29yaWVzLmNsZWFyKCk7Ci0JCQkJZkNhdGVnb3JpZXMuYWRkQWxsKGNhdGVnb3JpZXMpOwotCQkKLQkJCQlmRGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJCQlmRGVzY3JpcHRvcnMucHV0QWxsKGxvYWRlZERlc2NyaXB0b3JzKTsKLQkJCQkKLQkJCQl1cGRhdGVVbmluc3RhbGxlZENvbXB1dGVyQ291bnQoKTsKLQkJCQkKLQkJCQkvL3VwZGF0ZSB0aGUgc3RhdGUKLQkJCQlmU3RhdGUgPSBDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlclJlZ2lzdHJ5LkxPQURFRDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPlVwZGF0ZXMgdGhlIHVuaW5zdGFsbGVkIGNvbXB1dGVyIGNvdW50PC9wPgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVVbmluc3RhbGxlZENvbXB1dGVyQ291bnQoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZVN0b3JlID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlpbnQgbGFzdE51bWJlck9mQ29tcHV0ZXJzPSBwcmVmZXJlbmNlU3RvcmUuZ2V0SW50KE5VTV9DT01QVVRFUlNfUFJFRl9LRVkpOwotCQlpbnQgY3Vyck51bWJlcj0gZkRlc2NyaXB0b3JzLnNpemUoKTsKLQkJZkhhc1VuaW5zdGFsbGVkQ29tcHV0ZXJzPSBsYXN0TnVtYmVyT2ZDb21wdXRlcnMgPiBjdXJyTnVtYmVyOwotCQlwcmVmZXJlbmNlU3RvcmUucHV0VmFsdWUoTlVNX0NPTVBVVEVSU19QUkVGX0tFWSwgSW50ZWdlci50b1N0cmluZyhjdXJyTnVtYmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Q29uZmlndXJlcyB0aGUgY2F0ZWdvcmllcyBmb3VuZCBpbiB0aGUgZ2l2ZW4ge0BsaW5rIElDb25maWd1cmF0aW9uRWxlbWVudH1zCi0JICogYW5kIHJlbW92ZXMgdGhlbSBmcm9tIHRoZSBnaXZlbiBsaXN0LjwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uRWxlbWVudHMge0BsaW5rIElDb25maWd1cmF0aW9uRWxlbWVudH1zIHRoYXQgaW5jbHVkZSBwcm9wb3NhbAotCSAqIGNhdGVnb3J5IGV4dGVuc2lvbnMKLQkgKiBAcmV0dXJuIHtAbGluayBDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeX1zIGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4KLQkgKiB7QGxpbmsgSUNvbmZpZ3VyYXRpb25FbGVtZW50fXMgdGhhdCBkZWZpbmVkIG5ldyBwcm9wb3NhbCBjYXRlZ29yaWVzLgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRDYXRlZ29yaWVzKExpc3QgZXh0ZW5zaW9uRWxlbWVudHMpIHsKLQkJTGlzdCBjYXRlZ29yaWVzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcj0gZXh0ZW5zaW9uRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudD0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRUxFTV9QUk9QT1NBTF9DQVRFR09SWSkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsgLy8gcmVtb3ZlIGZyb20gbGlzdCB0byBsZWF2ZSBvbmx5IGNvbXB1dGVycwotCi0JCQkJCUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5IGNhdGVnb3J5PSBuZXcgQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnkoZWxlbWVudCk7Ci0JCQkJCWNhdGVnb3JpZXMuYWRkKGNhdGVnb3J5KTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24geCkgewotCQkJCS8qIEVsZW1lbnQgaXMgbm90IHZhbGlkIGFueSBsb25nZXIgYXMgdGhlIGNvbnRyaWJ1dGluZyBwbHVnLWluIHdhcyB1bmxvYWRlZCBvciBmb3IKLQkJCQkgKiBzb21lIG90aGVyIHJlYXNvbi4gRG8gbm90IGluY2x1ZGUgdGhlIGV4dGVuc2lvbiBpbiB0aGUgbGlzdCBhbmQgbG9nIGl0Ci0JCQkJICovCi0JCQkJU3RyaW5nIG1lc3NhZ2UgPSAiVGhlIGV4dGVuc2lvbiAnJyIgKyBlbGVtZW50LnRvU3RyaW5nKCkgKyAiJycgaGFzIGJlY29tZSBpbnZhbGlkLiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUlTdGF0dXMgc3RhdHVzPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIHgpOwotCQkJCUxvZ2dlci5sb2coc3RhdHVzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24geCkgewotCQkJCUxvZ2dlci5sb2coeC5nZXRTdGF0dXMoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBjYXRlZ29yaWVzOwotCX0KLQkKLQkvKioKLQkgKiA8cD5HZXRzIHRoZSB7QGxpbmsgQ29tcGxldGlvblByb3Bvc2FsQ29udGVudFR5cGVDb250ZXh0fSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQgdHlwZSwKLQkgKiBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCB0aGVuIG9uZSBpcyBjcmVhdGVkPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50VHlwZUlEIGdldCB0aGUge0BsaW5rIENvbXBsZXRpb25Qcm9wb3NhbENvbnRlbnRUeXBlQ29udGV4dH0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGVudCB0eXBlCi0JICogQHJldHVybiB0aGUgZXhpc3Rpbmcgb3IgbmV3IHtAbGluayBDb21wbGV0aW9uUHJvcG9zYWxDb250ZW50VHlwZUNvbnRleHR9IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29udGVudCB0eXBlCi0JICovCi0JcHJpdmF0ZSBDb21wbGV0aW9uUHJvcG9zYWxDb250ZW50VHlwZUNvbnRleHQgZ2V0Q29udGV4dChTdHJpbmcgY29udGVudFR5cGVJRCkgewotCQlDb21wbGV0aW9uUHJvcG9zYWxDb250ZW50VHlwZUNvbnRleHQgY29udGV4dCA9IChDb21wbGV0aW9uUHJvcG9zYWxDb250ZW50VHlwZUNvbnRleHQpdGhpcy5mQWN0aXZhdGlvbkNvbnRleHRzLmdldChjb250ZW50VHlwZUlEKTsKLQkJaWYoY29udGV4dCA9PSBudWxsKSB7Ci0JCQljb250ZXh0ID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbENvbnRlbnRUeXBlQ29udGV4dChjb250ZW50VHlwZUlEKTsKLQkJCXRoaXMuZkFjdGl2YXRpb25Db250ZXh0cy5wdXQoY29udGVudFR5cGVJRCwgY29udGV4dCk7Ci0JCX0KLQkJCi0JCXJldHVybiBjb250ZXh0OwotCX0KLQkKLQkvKioKLQkgKiA8cD5HZXRzIGFsbCBvZiB0aGUge0BsaW5rIENvbXBsZXRpb25Qcm9wb3NhbENvbnRlbnRUeXBlQ29udGV4dH1zIGFzc29jaWF0ZWQgd2l0aAotCSAqIHRoZSBnaXZlbiBjb250ZW50IHR5cGUgSUQuICBBIGNvbnRleHQgaXMgY29uc2lkZXJlZCBhc3NvY2lhdGVkIGlmIGl0cyBhc3NvY2lhdGVkIGNvbnRlbnQgdHlwZSBJRAotCSAqIGlzIGVpdGhlciB0aGUgZ2l2ZW4gY29udGVudCB0eXBlIElEIG9yIGlzIGEgYmFzZSBjb250ZW50IHR5cGUgSUQgb2YgdGhlIGdpdmVuIGNvbnRlbnQgdHlwZSBJRC48L3A+Ci0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlSUQgZ2V0IHRoZSBjb250ZXh0cyBmb3IgdGhpcyBjb250ZW50IHR5cGUgSUQKLQkgKiBAcmV0dXJuIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgQ29tcGxldGlvblByb3Bvc2FsQ29udGVudFR5cGVDb250ZXh0fXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbgotCSAqIGNvbnRlbnQgdHlwZSBJRAotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRDb250ZXh0cyhTdHJpbmcgY29udGVudFR5cGVJRCkgewotCQlMaXN0IGNvbnRleHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlEKTsKLQkJCi0JCXdoaWxlKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCU9iamVjdCBjb250ZXh0ID0gdGhpcy5mQWN0aXZhdGlvbkNvbnRleHRzLmdldChjb250ZW50VHlwZS5nZXRJZCgpKTsKLQkJCWlmKGNvbnRleHQgIT0gbnVsbCkgewotCQkJCWNvbnRleHRzLmFkZChjb250ZXh0KTsKLQkJCX0KLQkJCQotCQkJY29udGVudFR5cGUgPSBjb250ZW50VHlwZS5nZXRCYXNlVHlwZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gY29udGV4dHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29tcGxldGlvblByb3Bvc2FsQ29udGVudFR5cGVDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db21wbGV0aW9uUHJvcG9zYWxDb250ZW50VHlwZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmZmRmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db21wbGV0aW9uUHJvcG9zYWxDb250ZW50VHlwZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIDxwPlRoZXJlIHNob3VsZCBiZSBvbmUgY29udGV4dCBmb3IgZWFjaCBjb250ZW50IHR5cGUuIEl0IGtlZXBzIHRyYWNrCi0gKiBvZiB0aGUgZGVzY3JpYmVycyBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHBhcnRpdGlvbiB0eXBlcyBmb3IgaXRzIHVuaXF1ZQotICogY29udGVudCB0eXBlLjwvcD4KLSAqLwotcHVibGljIGNsYXNzIENvbXBsZXRpb25Qcm9wb3NhbENvbnRlbnRUeXBlQ29udGV4dCB7Ci0KLQkvKiogdGhlIGNvbnRlbnQgdHlwZSB0aGlzIGNvbnRleHQgaXMgYXNzb2NpYXRlZCB3aXRoICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZkNvbnRlbnRUeXBlSUQ7Ci0JCi0JLyoqCi0JICogCi0JICogPGNvZGU+e0BsaW5rIE1hcH0mbHR7QGxpbmsgU3RyaW5nfSwge0BsaW5rIFNldH0mbHR7QGxpbmsgQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJEZXNjcmlwdG9yfSZndCZndDwvY29kZT4KLQkgKiA8dWw+Ci0JICogPGxpPjxiPmtleTo8L2I+IHBhcnRpdGlvbiB0eXBlIElEPC9saT4KLQkgKiA8bGk+PGI+dmFsdWU6PC9iPiB7QGxpbmsgU2V0fSBvZiBhc3NvY2lhdGVkIGNvbXB1dGVyIGRlc2NyaXB0b3JzPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXByaXZhdGUgTWFwIGZQYXJ0aXRpb25UeXBlc1RvRGVzY3JpcHRvcnM7Ci0JCi0JLyoqCi0JICogPHA+Q3JlYXRlIGEgbmV3IGNvbnRleHQgZm9yIHRoZSBnaXZlbiBjb250ZW50IHR5cGUgSUQuPC9wPgotCSAqIDxwPlRoZXJlIHNob3VsZCBvbmx5IGV2ZXIgYmUgb25lIGNvbnRleHQgZm9yIGFueSB1bmlxdWUgY29udGVudCB0eXBlPC9wPgotCSAqIEBwYXJhbSBjb250ZW50VHlwZUlEIHRoZSBjb250ZW50IHR5cGUgdGhpcyBjb250ZXh0IGlzIGZvcgotCSAqLwotCXB1YmxpYyBDb21wbGV0aW9uUHJvcG9zYWxDb250ZW50VHlwZUNvbnRleHQoU3RyaW5nIGNvbnRlbnRUeXBlSUQpIHsKLQkJdGhpcy5mQ29udGVudFR5cGVJRCA9IGNvbnRlbnRUeXBlSUQ7Ci0JCXRoaXMuZlBhcnRpdGlvblR5cGVzVG9EZXNjcmlwdG9ycyA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPkFkZHMgYSBkZXNjcmliZXIgdG8gdGhpcyBjb250ZXh0IGZvciBhIGdpdmVuIHBhcnRpdGlvbiB0eXBlLiAgVGhlcmUKLQkgKiBjYW4gYmUgbW9yZSB0aGVuIG9uZSBkZXNjcmliZXIgZm9yIG9uZSBwYXJ0aXRpb24gdHlwZS48L3A+Ci0JICogCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGVJRCB0aGUgcGFydGl0aW9uIHR5cGUgdG8gYXNzb2NpYXRlIHRoZSBnaXZlbiBkZXNjcmlwdG9yIHdpdGgKLQkgKiBAcGFyYW0gZGVzY3JpcHRvciB7QGxpbmsgQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJEZXNjcmlwdG9yfSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgZ2l2ZW4KLQkgKiBwYXJ0aXRpb24gdHlwZSBpbiB0aGlzIGNvbnRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXREZXNjcmlwdG9yKFN0cmluZyBwYXJ0aXRpb25UeXBlSUQsIENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCVNldCBkZXNjcmlwdG9ycyA9IChTZXQpdGhpcy5mUGFydGl0aW9uVHlwZXNUb0Rlc2NyaXB0b3JzLmdldChwYXJ0aXRpb25UeXBlSUQpOwotCQlpZihkZXNjcmlwdG9ycyAhPSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCX0gZWxzZSB7Ci0JCQlkZXNjcmlwdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCQl0aGlzLmZQYXJ0aXRpb25UeXBlc1RvRGVzY3JpcHRvcnMucHV0KHBhcnRpdGlvblR5cGVJRCwgZGVzY3JpcHRvcnMpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gQWxsIG9mIHRoZSB7QGxpbmsgQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJEZXNjcmlwdG9yfXMgYXNzb2NpYXRlZCB3aXRoCi0JICogYW55IHBhcnRpdGlvbiB0eXBlIGluIHRoaXMgY29udGV4dAotCSAqLwotCXB1YmxpYyBTZXQgZ2V0RGVzY3JpcHRvcnMoKSB7Ci0JCVNldCBhbGxEZXNjcmlwdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUNvbGxlY3Rpb24gZGVzY3JpcHRvclNldHMgPSB0aGlzLmZQYXJ0aXRpb25UeXBlc1RvRGVzY3JpcHRvcnMudmFsdWVzKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBkZXNjcmlwdG9yU2V0cy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJU2V0IGRlc2NyaXB0b3JTZXQgPSAoU2V0KWl0ZXIubmV4dCgpOwotCQkJYWxsRGVzY3JpcHRvcnMuYWRkQWxsKGRlc2NyaXB0b3JTZXQpOwotCQl9Ci0JCQotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KGFsbERlc2NyaXB0b3JzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGVJRCBnZXQge0BsaW5rIENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyRGVzY3JpcHRvcn1zIGZvciBvbmx5IHRoaXMgcGFydGl0aW9uIHR5cGUKLQkgKiBmb3IgdGhpcyBjb250ZXh0Ci0JICogQHJldHVybiB7QGxpbmsgQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJEZXNjcmlwdG9yfXMgYXNzb2ljYXRlZCB3aXRoIHRoZSBnaXZlbiBwYXJ0aXRpb24gdHlwZQotCSAqIGluIHRoaXMgY29udGV4dAotCSAqLwotCXB1YmxpYyBTZXQgZ2V0RGVzY3JpcHRvcnMoU3RyaW5nIHBhcnRpdGlvblR5cGVJRCkgewotCQlTZXQgZGVzY3JpcHRvcnMgPSAoU2V0KXRoaXMuZlBhcnRpdGlvblR5cGVzVG9EZXNjcmlwdG9ycy5nZXQocGFydGl0aW9uVHlwZUlEKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3JzICE9IG51bGwgPyBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoZGVzY3JpcHRvcnMpIDogQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50IHR5cGUgdGhpcyBjb250ZXh0IGlzIGZvcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGVJRCgpIHsKLQkJcmV0dXJuIGZDb250ZW50VHlwZUlEOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgb2YgdGhlIGNvbnRlbnQgdHlwZSBJRAotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZDb250ZW50VHlwZUlELmhhc2hDb2RlKCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPlR3byB7QGxpbmsgQ29tcGxldGlvblByb3Bvc2FsQ29udGVudFR5cGVDb250ZXh0fSBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHRoZQotCSAqIHNhbWUgY29udGVudCB0eXBlIElELjwvcD4KLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJYm9vbGVhbiBlcXVhbCA9IGZhbHNlOwotCQlpZihvYmogaW5zdGFuY2VvZiBDb21wbGV0aW9uUHJvcG9zYWxDb250ZW50VHlwZUNvbnRleHQpIHsKLQkJCWVxdWFsID0gdGhpcy5mQ29udGVudFR5cGVJRC5lcXVhbHMoKChDb21wbGV0aW9uUHJvcG9zYWxDb250ZW50VHlwZUNvbnRleHQpb2JqKS5mQ29udGVudFR5cGVJRCk7Ci0JCX0KLQkJCi0JCXJldHVybiBlcXVhbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIodGhpcy5mQ29udGVudFR5cGVJRCk7Ci0JCVNldCBwYXJ0aXRpb25zID0gdGhpcy5mUGFydGl0aW9uVHlwZXNUb0Rlc2NyaXB0b3JzLmtleVNldCgpOwotCQlJdGVyYXRvciBwYXJ0aXRpb25zSXRlciA9IHBhcnRpdGlvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUocGFydGl0aW9uc0l0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgcGFydGl0aW9uVHlwZSA9IChTdHJpbmcpcGFydGl0aW9uc0l0ZXIubmV4dCgpOwotCQkJYnVmZi5hcHBlbmQoIlxuXHQiICsgcGFydGl0aW9uVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJCUxpc3QgZGVzY3JpcHRvcnMgPSAoTGlzdCl0aGlzLmZQYXJ0aXRpb25UeXBlc1RvRGVzY3JpcHRvcnMuZ2V0KHBhcnRpdGlvblR5cGUpOwotCQkJZm9yKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLnNpemUoKTsgKytpKSB7Ci0JCQkJYnVmZi5hcHBlbmQoIlxuXHRcdCIgKyBkZXNjcmlwdG9ycy5nZXQoaSkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db21wbGV0aW9uUHJvcG9zb2FsQ2F0aWdvcmllc0NvbmZpZ3VyYXRpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29tcGxldGlvblByb3Bvc29hbENhdGlnb3JpZXNDb25maWd1cmF0aW9uUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0OTQ0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db21wbGV0aW9uUHJvcG9zb2FsQ2F0aWdvcmllc0NvbmZpZ3VyYXRpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLklDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvblJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLklDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlcjsKLQotLyoqCi0gKiA8cD5BIHJlZ2lzdHJ5IGZvciBhbGwgZXh0ZW5zaW9ucyB0byB0aGUKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb248L2NvZGU+Ci0gKiBleHRlbnNpb24gcG9pbnQuPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tcGxldGlvblByb3Bvc29hbENhdGlnb3JpZXNDb25maWd1cmF0aW9uUmVnaXN0cnkgewotCS8qKiBUaGUgZXh0ZW5zaW9uIHNjaGVtYSBuYW1lIG9mIHRoZSBleHRlbnNpb24gcG9pbnQgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UID0gImNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIFRoZSBleHRlbnNpb24gc2NoZW1hIG5hbWUgb2YgY2F0ZWdvcmllcyBwcm9wZXJ0aWVzIGNoaWxkIGVsZW1lbnRzICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fQ0FURUdPUklFU19QUk9QRVJUSUVTID0gImNhdGVnb3JpZXNDb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBUaGUgZXh0ZW5zaW9uIHNjaGVtYSBuYW1lIG9mIHRoZSBjb250ZW50IHR5cGUgaWQgYXR0cmlidXRlICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ09OVEVOVF9UWVBFX0lEID0gImNvbnRlbnRUeXBlSUQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIFRoZSBleHRlbnNpb24gc2NoZW1hIG5hbWUgb2YgdGhlIGNsYXNzIGF0dHJpYnV0ZSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlLiAqLwotCXByaXZhdGUgc3RhdGljIENvbXBsZXRpb25Qcm9wb3NvYWxDYXRpZ29yaWVzQ29uZmlndXJhdGlvblJlZ2lzdHJ5IGZnU2luZ2xldG9uID0gbnVsbDsKLQkKLQkvKiogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyByZWdpc3RyeSBoYXMgYmVlbiBsb2FkZWQuICovCi0JcHJpdmF0ZSBib29sZWFuIGZMb2FkZWQ7Ci0JCi0JLyoqCi0JICogPGNvZGU+e0BsaW5rIE1hcH08e0BsaW5rIFN0cmluZ30sIHtAbGluayBJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25SZWFkZXJ9PjwvY29kZT4KLQkgKiA8dWw+Ci0JICogPGxpPjxiPmtleTo8L2I+IENvbnRlbnQgVHlwZSBJRDwvbGk+Ci0JICogPGxpPjxiPnZhbHVlOjwvYj4gQ2F0ZWdvcmllcyBQcm9wZXJ0aWVzPC9saT4KLQkgKi8KLQlwcml2YXRlIE1hcCBmUHJvcGVydGllc0J5Q29udGVudFR5cGVJRDsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyByZWdpc3RyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIENvbXBsZXRpb25Qcm9wb3NvYWxDYXRpZ29yaWVzQ29uZmlndXJhdGlvblJlZ2lzdHJ5IGdldERlZmF1bHQoKSB7Ci0JCWlmIChmZ1NpbmdsZXRvbiA9PSBudWxsKSB7Ci0JCQlmZ1NpbmdsZXRvbiA9IG5ldyBDb21wbGV0aW9uUHJvcG9zb2FsQ2F0aWdvcmllc0NvbmZpZ3VyYXRpb25SZWdpc3RyeSgpOwotCQl9Ci0KLQkJcmV0dXJuIGZnU2luZ2xldG9uOwotCX0KLQkKLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBzaW5nbGV0b24gaW5zdGFuY2UKLQkgKi8KLQlwcml2YXRlIENvbXBsZXRpb25Qcm9wb3NvYWxDYXRpZ29yaWVzQ29uZmlndXJhdGlvblJlZ2lzdHJ5KCkgewotCQl0aGlzLmZMb2FkZWQgPSBmYWxzZTsKLQkJdGhpcy5mUHJvcGVydGllc0J5Q29udGVudFR5cGVJRCA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50VHlwZUlEIGdldCB0aGUge0BsaW5rIElDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvblJlYWRlcn0gYXNzb2NpYXRlZAotCSAqIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQgdHlwZQotCSAqIEByZXR1cm4gdGhlIHtAbGluayBJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25SZWFkZXJ9IGFzc29jaWF0ZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBjb250ZW50IHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG9uZSBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uUmVhZGVyIGdldFJlYWRhYmxlQ29uZmlndXJhdGlvbihTdHJpbmcgY29udGVudFR5cGVJRCkgewotCQl0aGlzLmVuc3VyZUxvYWRlZCgpOwotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvblJlYWRlcil0aGlzLmZQcm9wZXJ0aWVzQnlDb250ZW50VHlwZUlELmdldChjb250ZW50VHlwZUlEKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlSUQgZ2V0IHRoZSB7QGxpbmsgSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyfSBhc3NvY2lhdGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gY29udGVudCB0eXBlCi0JICogQHJldHVybiB0aGUge0BsaW5rIElDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlcn0gYXNzb2NpYXRlZAotCSAqIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgb25lIGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25Xcml0ZXIgZ2V0V3JpdGFibGVDb25maWd1cmF0aW9uKFN0cmluZyBjb250ZW50VHlwZUlEKSB7Ci0JCXRoaXMuZW5zdXJlTG9hZGVkKCk7Ci0JCQotCQlJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25SZWFkZXIgcmVhZGVyID0gZ2V0UmVhZGFibGVDb25maWd1cmF0aW9uKGNvbnRlbnRUeXBlSUQpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25Xcml0ZXIgd3JpdGVyID0gbnVsbDsKLQkJaWYocmVhZGVyIGluc3RhbmNlb2YgSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyKSB7Ci0JCQl3cml0ZXIgPSAoSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyKXJlYWRlcjsKLQkJfQotCQkKLQkJcmV0dXJuIHdyaXRlcjsKLQl9Ci0JCi0JLyoqCi0JICogRW5zdXJlcyB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbjwvY29kZT4KLQkgKiBleHRlbnNpb25zIGhhdmUgYmVlbiBsb2FkZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5zdXJlTG9hZGVkKCkgewotCQlpZighdGhpcy5mTG9hZGVkKSB7Ci0JCQl0aGlzLmxvYWQoKTsKLQkJCXRoaXMuZkxvYWRlZCA9IHRydWU7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTG9hZHMgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb248L2NvZGU+IGV4dGVuc2lvbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZCgpIHsKLQkJLy9nZXQgdGhlIGV4dGVuc2lvbnMKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5PSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlMaXN0IGV4dGVuc2lvbkVsZW1lbnRzPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QocmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNTRVVJUGx1Z2luLklELCBFWFRFTlNJT05fUE9JTlQpKSk7Ci0JCQotCQkvL2ZvciBlYWNoIGVsZW1lbnQgZ2V0IGl0cyBhdHRyaWJ1dGVzIGFuZCBhZGQgaXQgdG8gdGhlIG1hcCBvZiBwcm9wZXJ0aWVzCi0JCUl0ZXJhdG9yIGVsZW1lbnRzSXRlciA9IGV4dGVuc2lvbkVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGVsZW1lbnRzSXRlci5oYXNOZXh0KCkpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCllbGVtZW50c0l0ZXIubmV4dCgpOwotCQkJCi0JCQl0cnkgewotCQkJCWlmKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFTEVNX0NBVEVHT1JJRVNfUFJPUEVSVElFUykpIHsJCQkJCi0JCQkJCVN0cmluZyBjb250ZW50VHlwZUlEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9DT05URU5UX1RZUEVfSUQpOwotCQkJCQlDb250ZW50QXNzaXN0VXRpbHMuY2hlY2tFeHRlbnNpb25BdHRyaWJ1dGVOb3ROdWxsKGNvbnRlbnRUeXBlSUQsIEFUVFJfQ09OVEVOVF9UWVBFX0lELCBlbGVtZW50KTsKLQkJCQkJCi0JCQkJCVN0cmluZyBwYWdlQ2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0NMQVNTKTsKLQkJCQkJQ29udGVudEFzc2lzdFV0aWxzLmNoZWNrRXh0ZW5zaW9uQXR0cmlidXRlTm90TnVsbChwYWdlQ2xhc3MsIEFUVFJfQ0xBU1MsIGVsZW1lbnQpOwotCQkJCQkKLQkJCQkJSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uUmVhZGVyIHByb3BzID0KLQkJCQkJCShJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25SZWFkZXIpZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVFJfQ0xBU1MpOwotCQkJCQotCQkJCQlpZighdGhpcy5mUHJvcGVydGllc0J5Q29udGVudFR5cGVJRC5jb250YWluc0tleShjb250ZW50VHlwZUlEKSl7Ci0JCQkJCQl0aGlzLmZQcm9wZXJ0aWVzQnlDb250ZW50VHlwZUlELnB1dChjb250ZW50VHlwZUlELCBwcm9wcyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkV4dGVuc2lvbiAiICsgZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJIiBpcyBhdHRlbXB0aW5nIHRvIHRvIGRlZmluZSBpdHNlbGYgYXMgdGhlIHByb3Bvc2FsIGNhdGVpZ29yaWVzIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJIiBjb25maWd1cmF0aW9uIGZvciBjb250ZW50IHR5cGUgIiArIGNvbnRlbnRUeXBlSUQgKyAiIHdoZW4gYW5vdGhlciIgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJIiBleHRlbnNpb25zIGhhcyBhbHJlYWR5IGRvbmUgc28uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vZXh0ZW5zaW9uIHNwZWNpZmllZCBlbGVtZW50IHRoYXQgaXMgbm90IHZhbGlkIGZvciB0aGlzIGV4dGVuc2lvbgotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiVGhlIGVsZW1lbnQgIiArIGVsZW1lbnQgKyAiIGlzIG5vdCB2YWxpZCBmb3IgdGhlIiArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkiIGV4dGVuc2lvbiBwb2ludC4gIE9ubHkgIiArIEVMRU1fQ0FURUdPUklFU19QUk9QRVJUSUVTICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSIgZWxlbWVudHMgYXJlIHZhbGlkLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBjYXRjaCAoSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIHgpIHsKLQkJCQkvKgotCQkJCSAqIEVsZW1lbnQgaXMgbm90IHZhbGlkIGFueSBsb25nZXIgYXMgdGhlIGNvbnRyaWJ1dGluZyBwbHVnLWluIHdhcyB1bmxvYWRlZAotCQkJCSAqIG9yIGZvciBzb21lIG90aGVyIHJlYXNvbi4gCi0JCQkJICovCi0JCQkJU3RyaW5nIG1lc3NhZ2UgPSAiVGhlIGV4dGVuc2lvbiAnJyIgKyBlbGVtZW50LnRvU3RyaW5nKCkgKyAiJycgaGFzIGJlY29tZSBpbnZhbGlkLiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUlTdGF0dXMgc3RhdHVzPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIHgpOwotCQkJCUxvZ2dlci5sb2coc3RhdHVzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24geCkgewotCQkJCUxvZ2dlci5sb2coeC5nZXRTdGF0dXMoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWMwYWU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5jb250ZW50YXNzaXN0LklTdWJqZWN0Q29udHJvbENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuY29udGVudGFzc2lzdC5JU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuY29udGVudGFzc2lzdC5JU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIDxwPkEgcHJvY2Vzc29yIHRoYXQgYWdncmVnYXRlcyB0aGUgcHJvcG9zYWxzIG9mIG11bHRpcGxlIG90aGVyIHByb2Nlc3NvcnMuCi0gKiBXaGVuIHByb3Bvc2FscyBhcmUgcmVxdWVzdGVkLCB0aGUgY29udGFpbmVkIHByb2Nlc3NvcnMgYXJlIHF1ZXJpZWQgaW4gdGhlCi0gKiBvcmRlciB0aGV5IHdlcmUgYWRkZWQgdG8gdGhlIGNvbXBvdW5kIG9iamVjdC4gQ29waWVkIGZyb20KLSAqIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkNvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3Nvci4KLSAqIE1vZGlmaWNhdGlvbiB3YXMgbWFkZSB0byBhZGQgYSBkaXNwb3NlKCkgbWV0aG9kLjwvcD4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElDb250ZW50QXNzaXN0UHJvY2Vzc29yLCBJU3ViamVjdENvbnRyb2xDb250ZW50QXNzaXN0UHJvY2Vzc29yLCBJUmVsZWFzYWJsZSB7Ci0KLQkvKiogdGhlIGNvbXBvdW5kIHByb2Nlc3NvcnMgKi8KLQlwcml2YXRlIGZpbmFsIFNldCBmUHJvY2Vzc29ycyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0JCi0JLyoqIEFnZ3JlZ2F0ZWQgZXJyb3IgbWVzc2FnZSBmcm9tIHRoZSBjb21wb3VuZCBwcm9jZXNzb3JzICovCi0JcHJpdmF0ZSBTdHJpbmcgZkVycm9yTWVzc2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIHdpdGggb25lIGNoaWxkIHByb2Nlc3Nvci4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2Vzc29yCi0JICogICAgICAgICAgICB0aGUgcHJvY2Vzc29yIHRvIGFkZAotCSAqLwotCXB1YmxpYyBDb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0JCWFkZChwcm9jZXNzb3IpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBwcm9jZXNzb3IgdG8gdGhpcyBjb21wb3VuZCBwcm9jZXNzb3IuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3NvcgotCSAqICAgICAgICAgICAgdGhlIHByb2Nlc3NvciB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0JCUFzc2VydC5pc05vdE51bGwocHJvY2Vzc29yKTsKLQkJZlByb2Nlc3NvcnMuYWRkKHByb2Nlc3Nvcik7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBwcm9jZXNzb3IgY2hlY2sgdG8gc2VlIGlmIHRoaXMge0BsaW5rIElDb250ZW50QXNzaXN0UHJvY2Vzc29yfSBpcyBvbmUKLQkgKiBpbiB0aGlzIGNvbXBvdW5kIHByb2Nlc3Nvci4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY29tcG91bmQgcHJvY2Vzc29yIGNvbnRhaW5zIHRoZSBnaXZlbiBwcm9jZXNzb3IsCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUHJvY2Vzc29yKElDb250ZW50QXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvcikgewotCQlyZXR1cm4gZlByb2Nlc3NvcnMuY29udGFpbnMocHJvY2Vzc29yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgcHJvY2Vzc29yIGZyb20gdGhpcyBjb21wb3VuZCBwcm9jZXNzb3IuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3NvcgotCSAqICAgICAgICAgICAgdGhlIHByb2Nlc3NvciB0byByZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0JCWZQcm9jZXNzb3JzLnJlbW92ZShwcm9jZXNzb3IpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgYW5kIGFkZHMgYWxsIHNwZWNpZmllZCBwcm9jZXNzb3JzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzb3JzCi0JICovCi0JcHVibGljIENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvcihJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIHByb2Nlc3NvcnMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jZXNzb3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhZGQocHJvY2Vzc29yc1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlmRXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJTGlzdCByZXQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQkvLyBpc29sYXRlIGNhbGxzIHRvIGVhY2ggcHJvY2Vzc29yCi0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IHAuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0JCQkJaWYgKHByb3Bvc2FscyAhPSBudWxsICYmIHByb3Bvc2Fscy5sZW5ndGggPiAwKSB7Ci0JCQkJCXJldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChwcm9wb3NhbHMpKTsKLQkJCQkJZkVycm9yTWVzc2FnZSA9IG51bGw7IC8vIEhpZGUgcHJldmlvdXMgZXJyb3JzCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoZkVycm9yTWVzc2FnZSA9PSBudWxsICYmIHJldC5pc0VtcHR5KCkpIHsKLQkJCQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBwLmdldEVycm9yTWVzc2FnZSgpOwotCQkJCQkJaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCQkJZkVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIHJldC50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3JldC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogPHA+Ci0JICogVGhlIHJldHVybmVkIG9iamVjdHMgYXJlIHdyYXBwZXIgb2JqZWN0cyBhcm91bmQgdGhlIHJlYWwgaW5mb3JtYXRpb24KLQkgKiBjb250YWluZXJzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCWZFcnJvck1lc3NhZ2UgPSBudWxsOwotCQlMaXN0IHJldCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBmUHJvY2Vzc29ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gKElDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBpdC5uZXh0KCk7Ci0JCQlJQ29udGV4dEluZm9ybWF0aW9uW10gaW5mb3JtYXRpb25zID0gcC5jb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKHZpZXdlciwgZG9jdW1lbnRPZmZzZXQpOwotCQkJaWYgKGluZm9ybWF0aW9ucyAhPSBudWxsICYmIGluZm9ybWF0aW9ucy5sZW5ndGggPiAwKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcm1hdGlvbnMubGVuZ3RoOyBpKyspCi0JCQkJCXJldC5hZGQobmV3IFdyYXBwZWRDb250ZXh0SW5mb3JtYXRpb24oaW5mb3JtYXRpb25zW2ldLCBwKSk7Ci0JCQkJZkVycm9yTWVzc2FnZSA9IG51bGw7IC8vIEhpZGUgcHJldmlvdXMgZXJyb3JzCi0JCQl9IGVsc2UgewotCQkJCWlmIChmRXJyb3JNZXNzYWdlID09IG51bGwgJiYgcmV0LmlzRW1wdHkoKSkgewotCQkJCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gcC5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJCQkJaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCQlmRXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSUNvbnRleHRJbmZvcm1hdGlvbltdKSByZXQudG9BcnJheShuZXcgSUNvbnRleHRJbmZvcm1hdGlvbltyZXQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKQotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlTZXQgcmV0ID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZQcm9jZXNzb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSAoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGl0Lm5leHQoKTsKLQkJCWNoYXJbXSBjaGFycyA9IHAuZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCk7Ci0JCQlpZiAoY2hhcnMgIT0gbnVsbCkKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKQotCQkJCQlyZXQuYWRkKG5ldyBDaGFyYWN0ZXIoY2hhcnNbaV0pKTsKLQkJfQotCi0JCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW3JldC5zaXplKCldOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZXQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyBpKyspIHsKLQkJCUNoYXJhY3RlciBjaCA9IChDaGFyYWN0ZXIpIGl0Lm5leHQoKTsKLQkJCWNoYXJzW2ldID0gY2guY2hhclZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGNoYXJzOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJU2V0IHJldCA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBmUHJvY2Vzc29ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gKElDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBpdC5uZXh0KCk7Ci0JCQljaGFyW10gY2hhcnMgPSBwLmdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpOwotCQkJaWYgKGNoYXJzICE9IG51bGwpCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykKLQkJCQkJcmV0LmFkZChuZXcgQ2hhcmFjdGVyKGNoYXJzW2ldKSk7Ci0JCX0KLQotCQljaGFyW10gY2hhcnMgPSBuZXcgY2hhcltyZXQuc2l6ZSgpXTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmV0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgaSsrKSB7Ci0JCQlDaGFyYWN0ZXIgY2ggPSAoQ2hhcmFjdGVyKSBpdC5uZXh0KCk7Ci0JCQljaGFyc1tpXSA9IGNoLmNoYXJWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBjaGFyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIG9mIG9uZSBvZgotCSAqIGNvbnRhaW5lZCBwcm9jZXNzb3IgaWYgYW55LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9jZXNzb3IgaGFzIGFuCi0JICogZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRFcnJvck1lc3NhZ2UoKQotCSAqIEByZXR1cm4ge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gZkVycm9yTWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogPHA+Ci0JICogVGhlIHJldHVybmVkIHZhbGlkYXRvciBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSB2YWxpZGF0b3JzIHByb3ZpZGVkIGJ5Ci0JICogdGhlIGNoaWxkIHByb2Nlc3NvcnMuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQlib29sZWFuIGhhc1ZhbGlkYXRvciA9IGZhbHNlOwotCQlib29sZWFuIGhhc1ByZXNlbnRlciA9IGZhbHNlOwotCQlib29sZWFuIGhhc0V4dGVuc2lvbiA9IGZhbHNlOwotCi0JCUl0ZXJhdG9yIGl0cCA9IGZQcm9jZXNzb3JzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHAuaGFzTmV4dCgpICYmICghaGFzUHJlc2VudGVyIHx8ICFoYXNFeHRlbnNpb24pKSB7Ci0JCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gKElDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBpdHAubmV4dCgpOwotCQkJSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciB2ID0gcC5nZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKTsKLQkJCWlmICh2ICE9IG51bGwpIHsKLQkJCQloYXNWYWxpZGF0b3IgPSB0cnVlOwotCQkJCWlmICh2IGluc3RhbmNlb2YgSUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlcikgewotCQkJCQloYXNQcmVzZW50ZXIgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAodiBpbnN0YW5jZW9mIElTdWJqZWN0Q29udHJvbENvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciB8fCB2IGluc3RhbmNlb2YgSVN1YmplY3RDb250cm9sQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKSB7Ci0JCQkJCWhhc0V4dGVuc2lvbiA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQ29tcG91bmRDb250ZW50QXNzaXN0VmFsaWRhdG9yIHZhbGlkYXRvciA9IG51bGw7Ci0JCWlmIChoYXNQcmVzZW50ZXIgJiYgaGFzRXh0ZW5zaW9uKQotCQkJdmFsaWRhdG9yID0gbmV3IENvbXBvdW5kQ29udGVudEFzc2lzdFZhbGlkYXRvclByZXNlbnRlckV4KCk7Ci0JCWVsc2UgaWYgKGhhc1ByZXNlbnRlcikKLQkJCXZhbGlkYXRvciA9IG5ldyBDb21wb3VuZENvbnRlbnRBc3Npc3RWYWxpZGF0b3JQcmVzZW50ZXIoKTsKLQkJZWxzZSBpZiAoaGFzRXh0ZW5zaW9uKQotCQkJdmFsaWRhdG9yID0gbmV3IENvbXBvdW5kQ29udGVudEFzc2lzdFZhbGlkYXRvckV4KCk7Ci0JCWVsc2UgaWYgKGhhc1ZhbGlkYXRvcikKLQkJCXZhbGlkYXRvciA9IG5ldyBDb21wb3VuZENvbnRlbnRBc3Npc3RWYWxpZGF0b3IoKTsKLQotCQlpZiAodmFsaWRhdG9yICE9IG51bGwpCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSAoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGl0Lm5leHQoKTsKLQkJCQlJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIHYgPSBwLmdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpOwotCQkJCWlmICh2ICE9IG51bGwpCi0JCQkJCXZhbGlkYXRvci5hZGQodik7Ci0JCQl9Ci0KLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVN1YmplY3RDb250cm9sQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJQ29udGVudEFzc2lzdFN1YmplY3RDb250cm9sLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSUNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCBjb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlmRXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJTGlzdCByZXQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElTdWJqZWN0Q29udHJvbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIHsKLQkJCQlJU3ViamVjdENvbnRyb2xDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSAoSVN1YmplY3RDb250cm9sQ29udGVudEFzc2lzdFByb2Nlc3NvcikgbzsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcC5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wsIGRvY3VtZW50T2Zmc2V0KTsKLQkJCQlpZiAocHJvcG9zYWxzICE9IG51bGwgJiYgcHJvcG9zYWxzLmxlbmd0aCA+IDApIHsKLQkJCQkJcmV0LmFkZEFsbChBcnJheXMuYXNMaXN0KHByb3Bvc2FscykpOwotCQkJCQlmRXJyb3JNZXNzYWdlID0gbnVsbDsgLy8gSGlkZSBwcmV2aW91cyBlcnJvcnMKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoZkVycm9yTWVzc2FnZSA9PSBudWxsICYmIHJldC5pc0VtcHR5KCkpIHsKLQkJCQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBwLmdldEVycm9yTWVzc2FnZSgpOwotCQkJCQkJaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCQkJZkVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSByZXQudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtyZXQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIDxwPgotCSAqIFRoZSByZXR1cm5lZCBvYmplY3RzIGFyZSB3cmFwcGVyIG9iamVjdHMgYXJvdW5kIHRoZSByZWFsIGluZm9ybWF0aW9uCi0JICogY29udGFpbmVycy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5jb250ZW50YXNzaXN0LklTdWJqZWN0Q29udHJvbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RTdWJqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihJQ29udGVudEFzc2lzdFN1YmplY3RDb250cm9sIGNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCWZFcnJvck1lc3NhZ2UgPSBudWxsOwotCQlMaXN0IHJldCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBmUHJvY2Vzc29ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgSVN1YmplY3RDb250cm9sQ29udGVudEFzc2lzdFByb2Nlc3NvcikgewotCQkJCUlTdWJqZWN0Q29udHJvbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJU3ViamVjdENvbnRyb2xDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBvOwotCQkJCUlDb250ZXh0SW5mb3JtYXRpb25bXSBpbmZvcm1hdGlvbnMgPSBwLmNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oY29udGVudEFzc2lzdFN1YmplY3RDb250cm9sLCBkb2N1bWVudE9mZnNldCk7Ci0JCQkJaWYgKGluZm9ybWF0aW9ucyAhPSBudWxsICYmIGluZm9ybWF0aW9ucy5sZW5ndGggPiAwKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3JtYXRpb25zLmxlbmd0aDsgaSsrKQotCQkJCQkJcmV0LmFkZChuZXcgV3JhcHBlZENvbnRleHRJbmZvcm1hdGlvbihpbmZvcm1hdGlvbnNbaV0sIHApKTsKLQkJCQkJZkVycm9yTWVzc2FnZSA9IG51bGw7IC8vIEhpZGUgcHJldmlvdXMgZXJyb3JzCi0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGZFcnJvck1lc3NhZ2UgPT0gbnVsbCAmJiByZXQuaXNFbXB0eSgpKSB7Ci0JCQkJCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gcC5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJCQkJCWlmIChlcnJvck1lc3NhZ2UgIT0gbnVsbCkgewotCQkJCQkJCWZFcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJQ29udGV4dEluZm9ybWF0aW9uW10pIHJldC50b0FycmF5KG5ldyBJQ29udGV4dEluZm9ybWF0aW9uW3JldC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIG9mIGFueSBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3JzIHRoYXQgbmVlZCBkaXNwb3NpbmcKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNyZWxlYXNlKCl9Ci0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5yZWxlYXNlKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZSNyZWxlYXNlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBnbyB0aHJvdWdoIGxpc3Qgb2YgY29udGVudCBhc3Npc3QgcHJvY2Vzc29ycyBhbmQgZGlzcG9zZQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJaWYgKHAgaW5zdGFuY2VvZiBJUmVsZWFzYWJsZSkgewotCQkJCSgoSVJlbGVhc2FibGUpIHApLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCQlmUHJvY2Vzc29ycy5jbGVhcigpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBXcmFwcGVkQ29udGV4dEluZm9ybWF0aW9uIGltcGxlbWVudHMgSUNvbnRleHRJbmZvcm1hdGlvbiwgSUNvbnRleHRJbmZvcm1hdGlvbkV4dGVuc2lvbiB7Ci0JCXByaXZhdGUgSUNvbnRleHRJbmZvcm1hdGlvbiBmSW5mbzsKLQkJcHJpdmF0ZSBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBmUHJvY2Vzc29yOwotCi0JCVdyYXBwZWRDb250ZXh0SW5mb3JtYXRpb24oSUNvbnRleHRJbmZvcm1hdGlvbiBpbmZvLCBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IpIHsKLQkJCWZJbmZvID0gaW5mbzsKLQkJCWZQcm9jZXNzb3IgPSBwcm9jZXNzb3I7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIGZJbmZvLmVxdWFscyhvYmopOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbiNnZXRDb250ZXh0RGlzcGxheVN0cmluZygpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHREaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIGZJbmZvLmdldENvbnRleHREaXNwbGF5U3RyaW5nKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uI2dldEltYWdlKCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJCXJldHVybiBmSW5mby5nZXRJbWFnZSgpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbiNnZXRJbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZkluZm8uZ2V0SW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCQkgKi8KLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCXJldHVybiBmSW5mby5oYXNoQ29kZSgpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZkluZm8udG9TdHJpbmcoKTsKLQkJfQotCi0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldFByb2Nlc3NvcigpIHsKLQkJCXJldHVybiBmUHJvY2Vzc29yOwotCQl9Ci0KLQkJSUNvbnRleHRJbmZvcm1hdGlvbiBnZXRDb250ZXh0SW5mb3JtYXRpb24oKSB7Ci0JCQlyZXR1cm4gZkluZm87Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvbnRleHRJbmZvcm1hdGlvblBvc2l0aW9uKCkgewotCQkJaW50IHBvc2l0aW9uID0gLTE7Ci0JCQlpZiAoZkluZm8gaW5zdGFuY2VvZiBJQ29udGV4dEluZm9ybWF0aW9uRXh0ZW5zaW9uKQotCQkJCXBvc2l0aW9uID0gKChJQ29udGV4dEluZm9ybWF0aW9uRXh0ZW5zaW9uKWZJbmZvKS5nZXRDb250ZXh0SW5mb3JtYXRpb25Qb3NpdGlvbigpOwotCQkJcmV0dXJuIHBvc2l0aW9uOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbXBvdW5kQ29udGVudEFzc2lzdFZhbGlkYXRvciBpbXBsZW1lbnRzIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgewotCQlMaXN0IGZWYWxpZGF0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGZWYWxpZGF0b3I7Ci0KLQkJdm9pZCBhZGQoSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJCWZWYWxpZGF0b3JzLmFkZCh2YWxpZGF0b3IpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciNpbnN0YWxsKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsIGludCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGluc3RhbGwoSUNvbnRleHRJbmZvcm1hdGlvbiBpbmZvLCBJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCQkvLyBpbnN0YWxsIGVpdGhlciB0aGUgdmFsaWRhdG9yIGluIHRoZSBpbmZvLCBvciBhbGwgdmFsaWRhdG9ycwotCQkJZlZhbGlkYXRvciA9IGdldFZhbGlkYXRvcihpbmZvKTsKLQkJCUlDb250ZXh0SW5mb3JtYXRpb24gcmVhbEluZm8gPSBnZXRDb250ZXh0SW5mb3JtYXRpb24oaW5mbyk7Ci0JCQlpZiAoZlZhbGlkYXRvciAhPSBudWxsKQotCQkJCWZWYWxpZGF0b3IuaW5zdGFsbChyZWFsSW5mbywgdmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCWVsc2UgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBmVmFsaWRhdG9ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgdiA9IChJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKSBpdC5uZXh0KCk7Ci0JCQkJCXYuaW5zdGFsbChyZWFsSW5mbywgdmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGdldFZhbGlkYXRvcihJQ29udGV4dEluZm9ybWF0aW9uIGluZm8pIHsKLQkJCWlmIChpbmZvIGluc3RhbmNlb2YgV3JhcHBlZENvbnRleHRJbmZvcm1hdGlvbikgewotCQkJCVdyYXBwZWRDb250ZXh0SW5mb3JtYXRpb24gd3JhcCA9IChXcmFwcGVkQ29udGV4dEluZm9ybWF0aW9uKSBpbmZvOwotCQkJCXJldHVybiB3cmFwLmdldFByb2Nlc3NvcigpLmdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpOwotCQkJfQotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlDb250ZXh0SW5mb3JtYXRpb24gZ2V0Q29udGV4dEluZm9ybWF0aW9uKElDb250ZXh0SW5mb3JtYXRpb24gaW5mbykgewotCQkJSUNvbnRleHRJbmZvcm1hdGlvbiByZWFsSW5mbyA9IGluZm87Ci0JCQlpZiAoaW5mbyBpbnN0YW5jZW9mIFdyYXBwZWRDb250ZXh0SW5mb3JtYXRpb24pIHsKLQkJCQlXcmFwcGVkQ29udGV4dEluZm9ybWF0aW9uIHdyYXAgPSAoV3JhcHBlZENvbnRleHRJbmZvcm1hdGlvbikgaW5mbzsKLQkJCQlyZWFsSW5mbyA9IHdyYXAuZ2V0Q29udGV4dEluZm9ybWF0aW9uKCk7Ci0JCQl9Ci0KLQkJCXJldHVybiByZWFsSW5mbzsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IjaXNDb250ZXh0SW5mb3JtYXRpb25WYWxpZChpbnQpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRleHRJbmZvcm1hdGlvblZhbGlkKGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCQkvLyB1c2UgZWl0aGVyIHRoZSB2YWxpZGF0b3IgaW4gdGhlIGluZm8sIG9yIGFsbCB2YWxpZGF0b3JzCi0JCQlib29sZWFuIGlzVmFsaWQgPSBmYWxzZTsKLQkJCWlmIChmVmFsaWRhdG9yICE9IG51bGwpCi0JCQkJaXNWYWxpZCA9IGZWYWxpZGF0b3IuaXNDb250ZXh0SW5mb3JtYXRpb25WYWxpZChkb2N1bWVudFBvc2l0aW9uKTsKLQkJCWVsc2UgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBmVmFsaWRhdG9ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgdiA9IChJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKSBpdC5uZXh0KCk7Ci0JCQkJCWlzVmFsaWQgfD0gdi5pc0NvbnRleHRJbmZvcm1hdGlvblZhbGlkKGRvY3VtZW50UG9zaXRpb24pOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBpc1ZhbGlkOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb21wb3VuZENvbnRlbnRBc3Npc3RWYWxpZGF0b3JQcmVzZW50ZXIgZXh0ZW5kcyBDb21wb3VuZENvbnRlbnRBc3Npc3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyIHsKLQkJcHVibGljIGJvb2xlYW4gdXBkYXRlUHJlc2VudGF0aW9uKGludCBvZmZzZXQsIFRleHRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uKSB7Ci0JCQkvLyB1c2UgZWl0aGVyIHRoZSB2YWxpZGF0b3IgaW4gdGhlIGluZm8sIG9yIGFsbCB2YWxpZGF0b3JzCi0JCQlib29sZWFuIHByZXNlbnRhdGlvblVwZGF0ZWQgPSBmYWxzZTsKLQkJCWlmIChmVmFsaWRhdG9yIGluc3RhbmNlb2YgSUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlcikKLQkJCQlwcmVzZW50YXRpb25VcGRhdGVkID0gKChJQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyKSBmVmFsaWRhdG9yKS51cGRhdGVQcmVzZW50YXRpb24ob2Zmc2V0LCBwcmVzZW50YXRpb24pOwotCQkJZWxzZSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGZWYWxpZGF0b3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciB2ID0gKElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IpIGl0Lm5leHQoKTsKLQkJCQkJaWYgKHYgaW5zdGFuY2VvZiBJQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyKQotCQkJCQkJcHJlc2VudGF0aW9uVXBkYXRlZCB8PSAoKElDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIpIHYpLnVwZGF0ZVByZXNlbnRhdGlvbihvZmZzZXQsIHByZXNlbnRhdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHByZXNlbnRhdGlvblVwZGF0ZWQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb21wb3VuZENvbnRlbnRBc3Npc3RWYWxpZGF0b3JFeCBleHRlbmRzIENvbXBvdW5kQ29udGVudEFzc2lzdFZhbGlkYXRvciBpbXBsZW1lbnRzIElTdWJqZWN0Q29udHJvbENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciB7Ci0JCS8qCi0JCSAqIEBzZWUgSVN1YmplY3RDb250cm9sQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yI2luc3RhbGwoSUNvbnRleHRJbmZvcm1hdGlvbiwKLQkJICogICAgICBJQ29udGVudEFzc2lzdFN1YmplY3RDb250cm9sLCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnN0YWxsKElDb250ZXh0SW5mb3JtYXRpb24gaW5mbywgSUNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCBjb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCQkvLyBpbnN0YWxsIGVpdGhlciB0aGUgdmFsaWRhdG9yIGluIHRoZSBpbmZvLCBvciBhbGwgdmFsaWRhdG9ycwotCQkJZlZhbGlkYXRvciA9IGdldFZhbGlkYXRvcihpbmZvKTsKLQkJCUlDb250ZXh0SW5mb3JtYXRpb24gcmVhbEluZm8gPSBnZXRDb250ZXh0SW5mb3JtYXRpb24oaW5mbyk7Ci0JCQlpZiAoZlZhbGlkYXRvciBpbnN0YW5jZW9mIElTdWJqZWN0Q29udHJvbENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcikKLQkJCQkoKElTdWJqZWN0Q29udHJvbENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcikgZlZhbGlkYXRvcikuaW5zdGFsbChyZWFsSW5mbywgY29udGVudEFzc2lzdFN1YmplY3RDb250cm9sLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCWVsc2UgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBmVmFsaWRhdG9ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCWlmIChpdC5uZXh0KCkgaW5zdGFuY2VvZiBJU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IpCi0JCQkJCQkoKElTdWJqZWN0Q29udHJvbENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcikgaXQubmV4dCgpKS5pbnN0YWxsKHJlYWxJbmZvLCBjb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tcG91bmRDb250ZW50QXNzaXN0VmFsaWRhdG9yUHJlc2VudGVyRXggZXh0ZW5kcyBDb21wb3VuZENvbnRlbnRBc3Npc3RWYWxpZGF0b3JQcmVzZW50ZXIgaW1wbGVtZW50cyBJU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIsIElTdWJqZWN0Q29udHJvbENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciB7Ci0JCS8qCi0JCSAqIEBzZWUgSVN1YmplY3RDb250cm9sQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyI2luc3RhbGwoSUNvbnRleHRJbmZvcm1hdGlvbiwKLQkJICogICAgICBJQ29udGVudEFzc2lzdFN1YmplY3RDb250cm9sLCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnN0YWxsKElDb250ZXh0SW5mb3JtYXRpb24gaW5mbywgSUNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCBjb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCQkvLyBpbnN0YWxsIGVpdGhlciB0aGUgdmFsaWRhdG9yIGluIHRoZSBpbmZvLCBvciBhbGwgdmFsaWRhdG9ycwotCQkJZlZhbGlkYXRvciA9IGdldFZhbGlkYXRvcihpbmZvKTsKLQkJCUlDb250ZXh0SW5mb3JtYXRpb24gcmVhbEluZm8gPSBnZXRDb250ZXh0SW5mb3JtYXRpb24oaW5mbyk7Ci0KLQkJCWlmIChmVmFsaWRhdG9yIGluc3RhbmNlb2YgSVN1YmplY3RDb250cm9sQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKQotCQkJCSgoSVN1YmplY3RDb250cm9sQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKSBmVmFsaWRhdG9yKS5pbnN0YWxsKHJlYWxJbmZvLCBjb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJZWxzZSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGZWYWxpZGF0b3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJaWYgKGl0Lm5leHQoKSBpbnN0YW5jZW9mIElTdWJqZWN0Q29udHJvbENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcikKLQkJCQkJCSgoSVN1YmplY3RDb250cm9sQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKSBpdC5uZXh0KCkpLmluc3RhbGwocmVhbEluZm8sIGNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db250ZW50QXNzaXN0VXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRlbnRBc3Npc3RVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjFmYTkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRlbnRBc3Npc3RVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRBc3Npc3RVdGlscyB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjbG9zZXN0IEluZGV4ZWRSZWdpb24gZm9yIHRoZSBvZmZzZXQgYW5kIHZpZXdlciBhbGxvd2luZwotCSAqIGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHZpZXdlciBvZmZzZXRzIGFuZCBtb2RlbCBwb3NpdGlvbnMuIG5vdGU6IHRoaXMKLQkgKiBtZXRob2QgcmV0dXJucyBhbiBJbmRleGVkUmVnaW9uIGZvciByZWFkIG9ubHkKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyIHdob3NlIGRvY3VtZW50IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgcHJvcG9zYWxzCi0JICogQHBhcmFtIGRvY3VtZW50T2Zmc2V0Ci0JICogICAgICAgICAgICBhbiBvZmZzZXQgd2l0aGluIHRoZSBkb2N1bWVudCBmb3Igd2hpY2ggY29tcGxldGlvbnMgc2hvdWxkCi0JICogICAgICAgICAgICBiZSBjb21wdXRlZAotCSAqIEByZXR1cm4gYW4gSW5kZXhlZFJlZ2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5kZXhlZFJlZ2lvbiBnZXROb2RlQXQoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQotCQlpZiAodmlld2VyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJbmRleGVkUmVnaW9uIG5vZGUgPSBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1tID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCWlmIChtbSAhPSBudWxsKQotCQkJbW9kZWwgPSBtbS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZCh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCXRyeSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCWludCBsYXN0T2Zmc2V0ID0gZG9jdW1lbnRPZmZzZXQ7Ci0JCQkJbm9kZSA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnRPZmZzZXQpOwotCQkJCXdoaWxlIChub2RlID09IG51bGwgJiYgbGFzdE9mZnNldCA+PSAwKSB7Ci0JCQkJCWxhc3RPZmZzZXQtLTsKLQkJCQkJbm9kZSA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24obGFzdE9mZnNldCk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2xvc2VzdCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZvciB0aGUgb2ZmZXN0IGFuZAotCSAqIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50T2Zmc2V0Ci0JICogQHJldHVybiB0aGUgY2xvc2VzdCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZvciB0aGUgb2ZmZXN0IGFuZAotCSAqICAgICAgICAgdmlld2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IG51bGw7Ci0JCWlmICh2aWV3ZXIgPT0gbnVsbCB8fCB2aWV3ZXIuZ2V0RG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IGxhc3RPZmZzZXQgPSBkb2N1bWVudE9mZnNldDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCXNkUmVnaW9uID0gZG9jLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50T2Zmc2V0KTsKLQkJd2hpbGUgKHNkUmVnaW9uID09IG51bGwgJiYgbGFzdE9mZnNldCA+PSAwKSB7Ci0JCQlsYXN0T2Zmc2V0LS07Ci0JCQlzZFJlZ2lvbiA9IGRvYy5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChsYXN0T2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gc2RSZWdpb247Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGJ1bmRsZSB0aGF0IGRlZmluZWQgdGhlIHtAbGluayBJQ29uZmlndXJhdGlvbkVsZW1lbnR9IHRoYXQgZGVmaW5lcwotCSAqIHRoaXMgY2F0ZWdvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBCdW5kbGUgZ2V0QnVuZGxlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBuYW1lc3BhY2U9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0JCUJ1bmRsZSBidW5kbGU9IFBsYXRmb3JtLmdldEJ1bmRsZShuYW1lc3BhY2UpOwotCQlyZXR1cm4gYnVuZGxlOwotCX0KLQkKLQkvKioKLQkgKiA8cD5DaGVja3MgdGhhdCB0aGUgZ2l2ZW4gYXR0cmlidXRlIHZhbHVlIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi48L3A+Ci0JICoKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG9iamVjdCB0byBjaGVjayBpZiBub3QgbnVsbAotCSAqIEBwYXJhbSBhdHRyaWJ1dGUgdGhlIGF0dHJpYnV0ZQotCSAqIAotCSAqIEB0aHJvd3MgSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIGlmIHRoZSByZWdpc3RyeSBlbGVtZW50IGlzIG5vIGxvbmdlciB2YWxpZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiA8Y29kZT52YWx1ZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tFeHRlbnNpb25BdHRyaWJ1dGVOb3ROdWxsKE9iamVjdCB2YWx1ZSwgU3RyaW5nIGF0dHJpYnV0ZSwKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9ICJUaGUgZXh0ZW5zaW9uIFwiIiArIGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpICsgLy8kTk9OLU5MUy0xJAotCQkJCSJcIiBmcm9tIHBsdWctaW4gXCIiICsgZWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQKLQkJCQkiXCIgZGlkIG5vdCBzcGVjaWZ5IGEgdmFsdWUgZm9yIHRoZSByZXF1aXJlZCBcIiIgKyBhdHRyaWJ1dGUgKyAvLyROT04tTkxTLTEkCi0JCQkJIlwiIGF0dHJpYnV0ZSBmb3IgdGhlIGVsZW1lbnQgXCIiICsgZWxlbWVudC5nZXROYW1lKCkgKyAiXCIuIERpc2FibGluZyB0aGUgZXh0ZW5zaW9uLiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJSVN0YXR1cyBzdGF0dXM9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgbnVsbCk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB0ZXh0Vmlld2VyIGNoZWNrIHRvIHNlZSBpZiB0aGlzIHZpZXdlciBpcyBlbXB0eQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgaXMgbm8gdGV4dCBvciBpdCdzIGFsbCB3aGl0ZSBzcGFjZSwKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmlld2VyRW1wdHkoSVRleHRWaWV3ZXIgdGV4dFZpZXdlcikgewotCQlib29sZWFuIGlzRW1wdHkgPSBmYWxzZTsKLQkJU3RyaW5nIHRleHQgPSB0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRUZXh0KCk7Ci0JCWlmICgodGV4dCA9PSBudWxsKSB8fCAoKHRleHQgIT0gbnVsbCkgJiYgdGV4dC50cmltKCkuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJaXNFbXB0eSA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGlzRW1wdHk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmFmNjVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLS8qKgotICogPHA+QSB7QGxpbmsgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcn0gZm9yIHN0cnVjdHVyZWQgZG9jdW1lbnRzPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGltcGxlbWVudHMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciB7Ci0KLQkvKiogdGhlIGluc3RhbGxlZCBkb2N1bWVudCBwb3NpdGlvbiAqLwotCXByaXZhdGUgaW50IGZEb2N1bWVudFBvc2l0aW9uOwotCi0JLyoqIHRoZSBpbnN0YWxsZWQgZG9jdW1lbnQgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZkRvY3VtZW50OwotCQotCS8qKiB0aGUgaW5zdGFsbGVkIHJlZ2lvbiBzdGFydCovCi0JcHJpdmF0ZSBJbmRleGVkUmVnaW9uIGZSZWdpb247Ci0JCi0JLyoqCi0JICogPHA+RGVmYXVsdCBjb25zdHJ1Y3RvcjwvcD4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQlmRG9jdW1lbnRQb3NpdGlvbiA9IC0xOwotCQlmRG9jdW1lbnQgPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yI2luc3RhbGwob3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChJQ29udGV4dEluZm9ybWF0aW9uIGluZm8sIElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJZkRvY3VtZW50UG9zaXRpb24gPSBkb2N1bWVudFBvc2l0aW9uOwotCQlmRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCl2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciNpc0NvbnRleHRJbmZvcm1hdGlvblZhbGlkKGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRleHRJbmZvcm1hdGlvblZhbGlkKGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCS8qCi0JCSAqIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbnRleHQgaW5mbyBzaG91bGQgc3RpbGwgYmUKLQkJICogc2hvd2luZy4uLiBpZiBjdXJzb3Igc3RpbGwgd2l0aGluIHRoZSBzYW1lIHJlZ2lvbiB0aGVuIGl0J3MgdmFsaWQKLQkJICovCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJY2FsY3VsYXRlSW5zdGFsbGVkSW5kZXhlZFJlZ2lvbigpOwotCQkKLQkJaWYgKGZSZWdpb24gIT0gbnVsbCkgewotCQkJaW50IHN0YXJ0ID0gZlJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGVuZCA9IGZSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlyZXN1bHQgPSAoZG9jdW1lbnRQb3NpdGlvbiA8IGVuZCkgJiYgKGRvY3VtZW50UG9zaXRpb24gPiBzdGFydCArIDEpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4ge0BsaW5rIEluZGV4ZWRSZWdpb259IHRoYXQgdGhpcyB2YWxpZGF0b3Igd2FzIGluc3RhbGxlZCBvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVJbnN0YWxsZWRJbmRleGVkUmVnaW9uKCkgewotCQlpZiAoZlJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCWZSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGZEb2N1bWVudFBvc2l0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DdXN0b21Db21wbGV0aW9uUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWQ5YjVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uNTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIElDb21wbGV0aW9uUHJvcG9zYWwgd2hvc2UgdmFsdWVzIGNhbiBiZSByZWFkIGFmdGVyCi0gKiBjcmVhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBpbXBsZW1lbnRzIElDb21wbGV0aW9uUHJvcG9zYWwsIElDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24sIElDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yLCBJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsIHsKLQotCXByaXZhdGUgU3RyaW5nIGZBZGRpdGlvbmFsUHJvcG9zYWxJbmZvOwotCi0JcHJpdmF0ZSBJQ29udGV4dEluZm9ybWF0aW9uIGZDb250ZXh0SW5mb3JtYXRpb247Ci0KLQlwcml2YXRlIGludCBmQ3Vyc29yUG9zaXRpb24gPSAwOwotCi0JcHJpdmF0ZSBTdHJpbmcgZkRpc3BsYXlTdHJpbmc7Ci0KLQlwcml2YXRlIEltYWdlIGZJbWFnZTsKLQotCXByaXZhdGUgaW50IGZPcmlnaW5hbFJlcGxhY2VtZW50TGVuZ3RoOwotCi0JcHJpdmF0ZSBpbnQgZlJlbGV2YW5jZSA9IElSZWxldmFuY2VDb25zdGFudHMuUl9OT05FOwotCi0JcHJpdmF0ZSBpbnQgZlJlcGxhY2VtZW50TGVuZ3RoID0gMDsKLQotCXByaXZhdGUgaW50IGZSZXBsYWNlbWVudE9mZnNldCA9IDA7Ci0KLQlwcml2YXRlIFN0cmluZyBmUmVwbGFjZW1lbnRTdHJpbmcgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGZVcGRhdGVMZW5ndGhPblZhbGlkYXRlOwotCi0JcHJpdmF0ZSBjaGFyW10gZlRyaWdnZXJzOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3Igd2l0aCByZWxldmFuY2UgYW5kIHJlcGxhY2VtZW50IGxlbmd0aCB1cGRhdGUgZmxhZy4KLQkgKiAKLQkgKiBJZiB0aGUgPGNvZGU+dXBkYXRlUmVwbGFjZW1lbnRMZW5ndGhPblZhbGlkYXRlPC9jb2RlPiBmbGFnIGlzIHRydWUsCi0JICogdGhlbiB3aGVuIHRoZSB1c2VyIHR5cGVzLCB0aGUgcmVwbGFjZW1lbnQgbGVuZ3RoIHdpbGwgYmUgaW5jcmVtZW50ZWQgYnkKLQkgKiB0aGUgbnVtYmVyIG9mIG5ldyBjaGFyYWN0ZXJzIGluc2VydGVkIGZyb20gdGhlIG9yaWdpbmFsIHBvc2l0aW9uLgotCSAqIE90aGVyd2lzZSB0aGUgcmVwbGFjZW1lbnQgbGVuZ3RoIHdpbGwgbm90IGNoYW5nZSBvbiB2YWxpZGF0ZS4KLQkgKiAKLQkgKiBleC4KLQkgKiAKLQkgKiA8dGFnIHxuYW1lPSJhdHRyIj4gLSB0aGUgcmVwbGFjZW1lbnQgbGVuZ3RoIGlzIDQgPHRhZyBpfG5hbWU9ImF0dHIiPiAtCi0JICogdGhlIHJlcGxhY2VtZW50IGxlbmd0aCBpcyBub3cgNSA8dGFnIGlkfG5hbWU9ImF0dHIiPiAtIHRoZSByZXBsYWNlbWVudAotCSAqIGxlbmd0aCBpcyBub3cgNiA8dGFnIHxuYW1lPSJhdHRyIj4gLSB0aGUgcmVwbGFjZW1lbnRsZW5ndGggaXMgbm93IDQKLQkgKiBhZ2FpbiA8dGFnIHxuYW1lPSJhdHRyIj4gLSB0aGUgcmVwbGFjbWVudCBsZW5ndGggcmVtYWlucyA0Ci0JICogCi0JICovCi0JcHVibGljIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIGludCByZXBsYWNlbWVudE9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBpbnQgY3Vyc29yUG9zaXRpb24sIEltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZywgSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24sIFN0cmluZyBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCBpbnQgcmVsZXZhbmNlLCBib29sZWFuIHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZSkgewotCQlmUmVwbGFjZW1lbnRTdHJpbmcgPSByZXBsYWNlbWVudFN0cmluZzsKLQkJZlJlcGxhY2VtZW50T2Zmc2V0ID0gcmVwbGFjZW1lbnRPZmZzZXQ7Ci0JCWZSZXBsYWNlbWVudExlbmd0aCA9IHJlcGxhY2VtZW50TGVuZ3RoOwotCQlmQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQkJZkltYWdlID0gaW1hZ2U7Ci0JCWZEaXNwbGF5U3RyaW5nID0gZGlzcGxheVN0cmluZzsKLQkJZkNvbnRleHRJbmZvcm1hdGlvbiA9IGNvbnRleHRJbmZvcm1hdGlvbjsKLQkJZkFkZGl0aW9uYWxQcm9wb3NhbEluZm8gPSBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvOwotCQlmUmVsZXZhbmNlID0gcmVsZXZhbmNlOwotCQlmVXBkYXRlTGVuZ3RoT25WYWxpZGF0ZSA9IHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZTsKLQkJZk9yaWdpbmFsUmVwbGFjZW1lbnRMZW5ndGggPSBmUmVwbGFjZW1lbnRMZW5ndGg7Ci0JfQotCi0JcHVibGljIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIGludCByZXBsYWNlbWVudE9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBpbnQgY3Vyc29yUG9zaXRpb24sIEltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZywgSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24sIFN0cmluZyBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCBpbnQgcmVsZXZhbmNlKSB7Ci0JCXRoaXMocmVwbGFjZW1lbnRTdHJpbmcsIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwgY3Vyc29yUG9zaXRpb24sIGltYWdlLCBkaXNwbGF5U3RyaW5nLCBjb250ZXh0SW5mb3JtYXRpb24sIGFkZGl0aW9uYWxQcm9wb3NhbEluZm8sIHJlbGV2YW5jZSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSwgZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSwgZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgZ2V0Q3Vyc29yUG9zaXRpb24oKSwgZ2V0SW1hZ2UoKSwgZ2V0RGlzcGxheVN0cmluZygpLCBnZXRDb250ZXh0SW5mb3JtYXRpb24oKSwgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpKTsKLQkJcHJvcG9zYWwuYXBwbHkoZG9jdW1lbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24jYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBjaGFyLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50LCBjaGFyIHRyaWdnZXIsIGludCBvZmZzZXQpIHsKLQkJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbChnZXRSZXBsYWNlbWVudFN0cmluZygpLCBnZXRSZXBsYWNlbWVudE9mZnNldCgpLCBnZXRSZXBsYWNlbWVudExlbmd0aCgpLCBnZXRDdXJzb3JQb3NpdGlvbigpLCBnZXRJbWFnZSgpLCBnZXREaXNwbGF5U3RyaW5nKCksIGdldENvbnRleHRJbmZvcm1hdGlvbigpLCBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkpOwotCQkvLyB3ZSBjdXJyZW50bHkgZG9uJ3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3Igd2hpY2ggY2hhcmFjdGVyCi0JCS8vIHNlbGVjdGVkIHRoZSBwcm9wb3NhbCwgYW5kIHdoZXJlIHRoZSBjdXJzb3Igb2Zmc2V0IGlzCi0JCS8vIGJ1dCB3ZSBtaWdodCBpbiB0aGUgZnV0dXJlLi4uCi0JCXByb3Bvc2FsLmFwcGx5KGRvY3VtZW50KTsKLQkJLy8gd2Ugd2FudCB0byBDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIudXBkYXRlUHJlc2VudGF0aW9uKCkgaGVyZQotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQkvLyBDTVZDIDI1MjYzNCB0byBjb21wZW5zYXRlIGZvciAiaW52aXNpYmxlIiBpbml0aWFsIHJlZ2lvbgotCQlpbnQgY2FyZXRPZmZzZXQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHsKLQkJCUlUZXh0Vmlld2VyRXh0ZW5zaW9uNSBleHRlbnNpb24gPSAoSVRleHRWaWV3ZXJFeHRlbnNpb241KSB2aWV3ZXI7Ci0JCQljYXJldE9mZnNldCA9IGV4dGVuc2lvbi53aWRnZXRPZmZzZXQyTW9kZWxPZmZzZXQoY2FyZXRPZmZzZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJY2FyZXRPZmZzZXQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldENhcmV0T2Zmc2V0KCkgKyB2aWV3ZXIuZ2V0VmlzaWJsZVJlZ2lvbigpLmdldE9mZnNldCgpOwotCQl9Ci0KLQkJaWYgKGNhcmV0T2Zmc2V0ID09IGdldFJlcGxhY2VtZW50T2Zmc2V0KCkpIHsKLQkJCWFwcGx5KGRvY3VtZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHJlcGxhY2UgdGhlIHRleHQgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNhcmV0IFBvc2l0aW9uIGFzIHRoaXMKLQkJCS8vIGNhdXNlcyB0aGUgY3Vyc29yIHRvIG1vdmUgb24gaXRzIG93bgotCQkJdHJ5IHsKLQkJCQlpbnQgZW5kT2Zmc2V0T2ZDaGFuZ2VzID0gZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKS5sZW5ndGgoKSArIGdldFJlcGxhY2VtZW50T2Zmc2V0KCk7Ci0JCQkJLy8gSW5zZXJ0IHRoZSBwb3J0aW9uIG9mIHRoZSBuZXcgdGV4dCB0aGF0IGNvbWVzIGFmdGVyIHRoZQotCQkJCS8vIGN1cnJlbnQgY2FyZXQgcG9zaXRpb24KLQkJCQlpZiAoZW5kT2Zmc2V0T2ZDaGFuZ2VzID49IGNhcmV0T2Zmc2V0KSB7Ci0JCQkJCWludCBwb3N0Q2FyZXRSZXBsYWNlbWVudExlbmd0aCA9IGdldFJlcGxhY2VtZW50T2Zmc2V0KCkgKyBnZXRSZXBsYWNlbWVudExlbmd0aCgpIC0gY2FyZXRPZmZzZXQ7Ci0JCQkJCWludCBwcmVDYXJldFJlcGxhY2VtZW50TGVuZ3RoID0gZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKS5sZW5ndGgoKSAtIChlbmRPZmZzZXRPZkNoYW5nZXMgLSBjYXJldE9mZnNldCk7Ci0JCQkJCWlmIChwb3N0Q2FyZXRSZXBsYWNlbWVudExlbmd0aCA8IDApIHsKLQkJCQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqIHBvc3RDYXJldFJlcGxhY2VtZW50TGVuZ3RoIHdhcyBuZWdhdGl2ZTogIiArIHBvc3RDYXJldFJlcGxhY2VtZW50TGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJLy8gVGhpcyBpcyBqdXN0IGEgcXVpY2sgZml4IHdoaWxlIEkgZmlndXJlIG91dCB3aGF0Ci0JCQkJCQkvLyByZXBsYWNlbWVudCBsZW5ndGggaXMgc3VwcG9zZWQgdG8gYmUKLQkJCQkJCS8vIGluIGVhY2ggY2FzZSwgb3RoZXJ3aXNlIHdlJ2xsIGdldCBuZWdhdGl2ZQotCQkJCQkJLy8gcmVwbGFjbWVudCBsZW5ndGggc29tZXRpbWVzCi0JCQkJCQlwb3N0Q2FyZXRSZXBsYWNlbWVudExlbmd0aCA9IDA7Ci0JCQkJCX0KLQkJCQkJZG9jdW1lbnQucmVwbGFjZShjYXJldE9mZnNldCwgcG9zdENhcmV0UmVwbGFjZW1lbnRMZW5ndGgsIGdldFJlcGxhY2VtZW50U3RyaW5nKCkuc3Vic3RyaW5nKHByZUNhcmV0UmVwbGFjZW1lbnRMZW5ndGgpKTsKLQkJCQl9Ci0JCQkJLy8gSW5zZXJ0IHRoZSBwb3J0aW9uIG9mIHRoZSBuZXcgdGV4dCB0aGF0IGNvbWVzIGJlZm9yZSB0aGUKLQkJCQkvLyBjdXJyZW50IGNhcmV0IHBvc2l0aW9uCi0JCQkJLy8gRG9uZSBzZWNvbmQgc2luY2Ugb2Zmc2V0cyB3b3VsZCBjaGFuZ2UgZm9yIHRoZSBwb3N0IHRleHQKLQkJCQkvLyBvdGhlcndpc2UKLQkJCQkvLyBPdXRyaWdodCBpbnNlcnRpb25zIGFyZSBoYW5kbGVkIGhlcmUKLQkJCQlpZiAoY2FyZXRPZmZzZXQgPiBnZXRSZXBsYWNlbWVudE9mZnNldCgpKSB7Ci0JCQkJCWludCBwcmVDYXJldFRleHRMZW5ndGggPSBjYXJldE9mZnNldCAtIGdldFJlcGxhY2VtZW50T2Zmc2V0KCk7Ci0JCQkJCWRvY3VtZW50LnJlcGxhY2UoZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSwgcHJlQ2FyZXRUZXh0TGVuZ3RoLCBnZXRSZXBsYWNlbWVudFN0cmluZygpLnN1YnN0cmluZygwLCBwcmVDYXJldFRleHRMZW5ndGgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCWFwcGx5KGRvY3VtZW50KTsKLQkJCX0KLQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCQlhcHBseShkb2N1bWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCS8vIHJldHVybiBmUHJvcG9zYWwuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQlyZXR1cm4gZkFkZGl0aW9uYWxQcm9wb3NhbEluZm87Ci0JfQotCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb24gZ2V0Q29udGV4dEluZm9ybWF0aW9uKCkgewotCQkvLyByZXR1cm4gZlByb3Bvc2FsLmdldENvbnRleHRJbmZvcm1hdGlvbigpOwotCQlyZXR1cm4gZkNvbnRleHRJbmZvcm1hdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0SW5mb3JtYXRpb24oSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mbykgewotCQlmQ29udGV4dEluZm9ybWF0aW9uID0gY29udGV4dEluZm87Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbiNnZXRDb250ZXh0SW5mb3JtYXRpb25Qb3NpdGlvbigpCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZXh0SW5mb3JtYXRpb25Qb3NpdGlvbigpIHsKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMDM1NQotCQkvLyByZXR1cm4gZ2V0Q3Vyc29yUG9zaXRpb24oKTsKLQkJaWYgKGdldENvbnRleHRJbmZvcm1hdGlvbigpID09IG51bGwpCi0JCQlyZXR1cm4gZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSAtIDE7Ci0JCXJldHVybiBnZXRSZXBsYWNlbWVudE9mZnNldCgpICsgZ2V0Q3Vyc29yUG9zaXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEN1cnNvclBvc2l0aW9uKCkgewotCQlyZXR1cm4gZkN1cnNvclBvc2l0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEN1cnNvclBvc2l0aW9uKGludCBwb3MpIHsKLQkJZkN1cnNvclBvc2l0aW9uID0gcG9zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlTdHJpbmcoU3RyaW5nIG5ld0Rpc3BsYXlTdHJpbmcpIHsKLQkJZkRpc3BsYXlTdHJpbmcgPSBuZXdEaXNwbGF5U3RyaW5nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZygpIHsKLQkJLy8gcmV0dXJuIGZQcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCk7Ci0JCXJldHVybiBmRGlzcGxheVN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCS8vIHJldHVybiBmUHJvcG9zYWwuZ2V0SW1hZ2UoKTsKLQkJcmV0dXJuIGZJbWFnZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFJlbGV2YW5jZSgpIHsKLQkJcmV0dXJuIGZSZWxldmFuY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVwbGFjZW1lbnRMZW5ndGgoaW50IG5ld1JlcGxhY2VtZW50TGVuZ3RoKSB7Ci0JCWZSZXBsYWNlbWVudExlbmd0aCA9IG5ld1JlcGxhY2VtZW50TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSB7Ci0JCXJldHVybiBmUmVwbGFjZW1lbnRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRSZXBsYWNlbWVudE9mZnNldCgpIHsKLQkJcmV0dXJuIGZSZXBsYWNlbWVudE9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlcGxhY2VtZW50U3RyaW5nKCkgewotCQlyZXR1cm4gZlJlcGxhY2VtZW50U3RyaW5nOwotCX0KLQotCXB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIHJldHVybiBmUHJvcG9zYWwuZ2V0U2VsZWN0aW9uKGRvY3VtZW50KTsKLQkJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbChnZXRSZXBsYWNlbWVudFN0cmluZygpLCBnZXRSZXBsYWNlbWVudE9mZnNldCgpLCBnZXRSZXBsYWNlbWVudExlbmd0aCgpLCBnZXRDdXJzb3JQb3NpdGlvbigpLCBnZXRJbWFnZSgpLCBnZXREaXNwbGF5U3RyaW5nKCksIGdldENvbnRleHRJbmZvcm1hdGlvbigpLCBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkpOwotCQlyZXR1cm4gcHJvcG9zYWwuZ2V0U2VsZWN0aW9uKGRvY3VtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uI2dldFRyaWdnZXJDaGFyYWN0ZXJzKCkKLQkgKi8KLQotCXB1YmxpYyBjaGFyW10gZ2V0VHJpZ2dlckNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBmVHJpZ2dlcnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHJpZ2dlckNoYXJhY3RlcnMoY2hhcltdIHRyaWdnZXJzKSB7Ci0JCWZUcmlnZ2VycyA9IHRyaWdnZXJzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24jaXNWYWxpZEZvcihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkRm9yKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gdmFsaWRhdGUoZG9jdW1lbnQsIG9mZnNldCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjc2VsZWN0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0ZWQoSVRleHRWaWV3ZXIgdmlld2VyLCBib29sZWFuIHNtYXJ0VG9nZ2xlKSB7Ci0JfQotCi0JLy8gY29kZSBpcyBib3Jyb3dlZCBmcm9tIEphdmFDb21wbGV0aW9uUHJvcG9zYWwKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydHNXaXRoKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgU3RyaW5nIHdvcmQpIHsKLQotCQlpbnQgd29yZExlbmd0aCA9IHdvcmQgPT0gbnVsbCA/IDAgOiB3b3JkLmxlbmd0aCgpOwotCQlpZiAob2Zmc2V0ID4gZlJlcGxhY2VtZW50T2Zmc2V0ICsgd29yZExlbmd0aCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQl0cnkgewotCQkJaW50IGxlbmd0aCA9IG9mZnNldCAtIGZSZXBsYWNlbWVudE9mZnNldDsKLQkJCVN0cmluZyBzdGFydCA9IGRvY3VtZW50LmdldChmUmVwbGFjZW1lbnRPZmZzZXQsIGxlbmd0aCk7Ci0KLQkJCWlmKHdvcmQgIT0gbnVsbCkgewotCQkJCXJldHVybiB3b3JkLnN1YnN0cmluZygwLCBsZW5ndGgpLmVxdWFsc0lnbm9yZUNhc2Uoc3RhcnQpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjdW5zZWxlY3RlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2VsZWN0ZWQoSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JfQotCi0JLyoqCi0JICogYm9ycm93ZWQgZnJvbSBKYXZhQ29tcGxldGlvblByb3Bvc2FsCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjdmFsaWRhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBpbnQsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJaWYgKG9mZnNldCA8IGZSZXBsYWNlbWVudE9mZnNldCkKLQkJCXJldHVybiBmYWxzZTsKLQkJYm9vbGVhbiB2YWxpZGF0ZWQgPSBzdGFydHNXaXRoKGRvY3VtZW50LCBvZmZzZXQsIGZEaXNwbGF5U3RyaW5nKTsKLQotCQlpZiAoZlVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUpIHsKLQkJCS8vIGl0IHdvdWxkIGJlIGJldHRlciB0byB1c2UgIm9yaWdpbmFsQ3Vyc29yUG9zaXRpb24iIGluc3RlYWQgb2YKLQkJCS8vIGdldFJlcGxhY2VtZW50T2Zmc2V0KCksIGJ1dCB3ZSBkb24ndCBoYXZlIHRoYXQgaW5mby4KLQkJCWludCBuZXdMZW5ndGggPSBvZmZzZXQgLSBnZXRSZXBsYWNlbWVudE9mZnNldCgpOwotCQkJaW50IGRlbHRhID0gbmV3TGVuZ3RoIC0gZk9yaWdpbmFsUmVwbGFjZW1lbnRMZW5ndGg7Ci0JCQlmUmVwbGFjZW1lbnRMZW5ndGggPSBkZWx0YSArIGZPcmlnaW5hbFJlcGxhY2VtZW50TGVuZ3RoOwotCQl9Ci0JCXJldHVybiB2YWxpZGF0ZWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlcGxhY2VtZW50T2Zmc2V0Ci0JICogICAgICAgICAgICBUaGUgZlJlcGxhY2VtZW50T2Zmc2V0IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBsYWNlbWVudE9mZnNldChpbnQgcmVwbGFjZW1lbnRPZmZzZXQpIHsKLQkJZlJlcGxhY2VtZW50T2Zmc2V0ID0gcmVwbGFjZW1lbnRPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlcGxhY2VtZW50U3RyaW5nCi0JICogICAgICAgICAgICBUaGUgZlJlcGxhY2VtZW50U3RyaW5nIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBsYWNlbWVudFN0cmluZyhTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcpIHsKLQkJZlJlcGxhY2VtZW50U3RyaW5nID0gcmVwbGFjZW1lbnRTdHJpbmc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTNmN2E2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0lSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotLyoqCi0gKiBDb21wbGV0aW9uUHJvcG9zYWwgd2l0aCBhIHJlbGV2YW5jZSB2YWx1ZS4gVGhlIHJlbGV2YW5jZSB2YWx1ZSBpcyB1c2VkIHRvCi0gKiBzb3J0IHRoZSBjb21wbGV0aW9uIHByb3Bvc2Fscy4gUHJvcG9zYWxzIHdpdGggaGlnaGVyIHJlbGV2YW5jZSBzaG91bGQgYmUKLSAqIGxpc3RlZCBiZWZvcmUgcHJvcG9zYWxzIHdpdGggbG93ZXIgcmVsZXZhbmNlLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlbGV2YW5jZSBvZiB0aGUgcHJvcG9zYWwuCi0JICovCi0JaW50IGdldFJlbGV2YW5jZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSVJlbGV2YW5jZUNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSVJlbGV2YW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTVhMTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0lSZWxldmFuY2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElSZWxldmFuY2VDb25zdGFudHMgewotCWludCBSX05PTkUgPSAwOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvT3B0aW9uYWxNZXNzYWdlRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9PcHRpb25hbE1lc3NhZ2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRjZGUxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9PcHRpb25hbE1lc3NhZ2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLS8qKgotICogPHA+VGhpcyBpcyBhIDxjb2RlPk1lc3NhZ2VEaWFsb2c8L2NvZGU+IHdoaWNoIGFsbG93cyB0aGUgdXNlcgotICogdG8gY2hvb3NlIHRoYXQgdGhlIGRpYWxvZyBpc24ndCBzaG93biBhZ2FpbiB0aGUgbmV4dCB0aW1lLjwvcD4KLSAqIAotICogQGJhc2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmRpYWxvZ3MuT3B0aW9uYWxNZXNzYWdlRGlhbG9nCi0gKi8KLXB1YmxpYyBjbGFzcyBPcHRpb25hbE1lc3NhZ2VEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nIHsKLQotCS8vIFN0cmluZyBjb25zdGFudHMgZm9yIHdpZGdldHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tCT1hfVEVYVCA9IFNTRVVJTWVzc2FnZXMuT3B0aW9uYWxNZXNzYWdlRGlhbG9nX2RvbnRTaG93QWdhaW47Ci0KLQkvLyBEaWFsb2cgc3RvcmUgaWQgY29uc3RhbnRzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JFX0lEID0gIkNvbnRlbnRBc3Npc3RfT3B0aW9uYWxNZXNzYWdlRGlhbG9nLmhpZGUuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX1NIT1dOID0gSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAxOwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZklkOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGZDaGVja0JveFRleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmSGlkZURpYWxvZ0NoZWNrQm94OwotCi0KLQkvKioKLQkgKiBPcGVucyB0aGUgZGlhbG9nIGJ1dCBvbmx5IGlmIHRoZSB1c2VyIGhhc24ndCBjaG9zZW4gdG8gaGlkZSBpdC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBwcmVzc2VkIGJ1dHRvbiBvciB7QGxpbmsgU1dUI0RFRkFVTFR9IGlmIHRoZSBkaWFsb2cgZ290IGRpc21pc3NlZAotCSAqICAgICAgICAgd2l0aG91dCBwcmVzc2luZyBhIGJ1dHRvbiAoZS5nLiB2aWEgRXNjKSBvciB7e0BsaW5rICNOT1RfU0hPV059IGlmIHRoZSBkaWFsb2cgd2FzIG5vdAotCSAqICAgICAgICAgc2hvd24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBvcGVuKFN0cmluZyBpZCwgU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIEltYWdlIHRpdGxlSW1hZ2UsIFN0cmluZyBtZXNzYWdlLCBpbnQgZGlhbG9nVHlwZSwgU3RyaW5nW10gYnV0dG9uTGFiZWxzLCBpbnQgZGVmYXVsdEJ1dHRvbkluZGV4KSB7Ci0JCXJldHVybiBvcGVuKGlkLCBwYXJlbnQsIHRpdGxlLCB0aXRsZUltYWdlLCBtZXNzYWdlLCBkaWFsb2dUeXBlLCBidXR0b25MYWJlbHMsIGRlZmF1bHRCdXR0b25JbmRleCwgQ0hFQ0tCT1hfVEVYVCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIGRpYWxvZyBidXQgb25seSBpZiB0aGUgdXNlciBoYXNuJ3QgY2hvc2VuIHRvIGhpZGUgaXQuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgcHJlc3NlZCBidXR0b24gb3Ige0BsaW5rIFNXVCNERUZBVUxUfSBpZiB0aGUgZGlhbG9nIGdvdCBkaXNtaXNzZWQKLQkgKiAgICAgICAgIHdpdGhvdXQgcHJlc3NpbmcgYSBidXR0b24gKGUuZy4gdmlhIEVzYykgb3Ige3tAbGluayAjTk9UX1NIT1dOfSBpZiB0aGUgZGlhbG9nIHdhcyBub3QKLQkgKiAgICAgICAgIHNob3duCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgb3BlbihTdHJpbmcgaWQsIFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBJbWFnZSB0aXRsZUltYWdlLCBTdHJpbmcgbWVzc2FnZSwgaW50IGRpYWxvZ1R5cGUsIFN0cmluZ1tdIGJ1dHRvbkxhYmVscywgaW50IGRlZmF1bHRCdXR0b25JbmRleCwgU3RyaW5nIGNoZWNrYm94VGV4dCkgewotCQlpZiAoIWlzRGlhbG9nRW5hYmxlZChpZCkpCi0JCQlyZXR1cm4gT3B0aW9uYWxNZXNzYWdlRGlhbG9nLk5PVF9TSE9XTjsKLQotCQlNZXNzYWdlRGlhbG9nIGRpYWxvZz0gbmV3IE9wdGlvbmFsTWVzc2FnZURpYWxvZyhpZCwgcGFyZW50LCB0aXRsZSwgdGl0bGVJbWFnZSwgbWVzc2FnZSwgZGlhbG9nVHlwZSwgYnV0dG9uTGFiZWxzLCBkZWZhdWx0QnV0dG9uSW5kZXgsIGNoZWNrYm94VGV4dCk7Ci0JCXJldHVybiBkaWFsb2cub3BlbigpOwotCX0KLQotCXByb3RlY3RlZCBPcHRpb25hbE1lc3NhZ2VEaWFsb2coU3RyaW5nIGlkLCBTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgSW1hZ2UgdGl0bGVJbWFnZSwgU3RyaW5nIG1lc3NhZ2UsIGludCBkaWFsb2dUeXBlLCBTdHJpbmdbXSBidXR0b25MYWJlbHMsIGludCBkZWZhdWx0QnV0dG9uSW5kZXgpIHsKLQkJdGhpcyhpZCwgcGFyZW50LCB0aXRsZSwgdGl0bGVJbWFnZSwgbWVzc2FnZSwgZGlhbG9nVHlwZSwgYnV0dG9uTGFiZWxzLCBkZWZhdWx0QnV0dG9uSW5kZXgsIENIRUNLQk9YX1RFWFQpOwotCX0KLQotCXByb3RlY3RlZCBPcHRpb25hbE1lc3NhZ2VEaWFsb2coU3RyaW5nIGlkLCBTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgSW1hZ2UgdGl0bGVJbWFnZSwgU3RyaW5nIG1lc3NhZ2UsIGludCBkaWFsb2dUeXBlLCBTdHJpbmdbXSBidXR0b25MYWJlbHMsIGludCBkZWZhdWx0QnV0dG9uSW5kZXgsIFN0cmluZyBjaGVja0JveFRleHQpIHsKLQkJc3VwZXIocGFyZW50LCB0aXRsZSwgdGl0bGVJbWFnZSwgbWVzc2FnZSwgZGlhbG9nVHlwZSwgYnV0dG9uTGFiZWxzLCBkZWZhdWx0QnV0dG9uSW5kZXgpOwotCQlmSWQ9IGlkOwotCQlmQ2hlY2tCb3hUZXh0PSBjaGVja0JveFRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGU9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0PSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0PSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luV2lkdGg9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmc9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJZkhpZGVEaWFsb2dDaGVja0JveD0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLQkJZkhpZGVEaWFsb2dDaGVja0JveC5zZXRUZXh0KGZDaGVja0JveFRleHQpOwotCQlmSGlkZURpYWxvZ0NoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNldERpYWxvZ0VuYWJsZWQoZklkLCAhKChCdXR0b24pZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JCWFwcGx5RGlhbG9nRm9udChmSGlkZURpYWxvZ0NoZWNrQm94KTsKLQkJcmV0dXJuIGZIaWRlRGlhbG9nQ2hlY2tCb3g7Ci0JfQotCi0JLy8tLS0tLS0tLS0tLS0tLS0gQ29uZmlndXJhdGlvbiBoYW5kbGluZyAtLS0tLS0tLS0tLS0tLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIGRpYWxvZwotCSAqCi0JICogQHJldHVybiB0aGUgc2V0dGluZ3MgdG8gYmUgdXNlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJc2V0dGluZ3M9IHNldHRpbmdzLmdldFNlY3Rpb24oU1RPUkVfSUQpOwotCQlpZiAoc2V0dGluZ3MgPT0gbnVsbCkKLQkJCXNldHRpbmdzPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKS5hZGROZXdTZWN0aW9uKFNUT1JFX0lEKTsKLQkJcmV0dXJuIHNldHRpbmdzOwotCX0KLQotCS8qKgotCSAqIEFuc3dlcnMgd2hldGhlciB0aGUgb3B0aW9uYWwgZGlhbG9nIGlzIGVuYWJsZWQgYW5kIHNob3VsZCBiZSBzaG93bi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEaWFsb2dFbmFibGVkKFN0cmluZyBrZXkpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlyZXR1cm4gIXNldHRpbmdzLmdldEJvb2xlYW4oa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgdGhlIG9wdGlvbmFsIGRpYWxvZyBpcyBlbmFibGVkIGFuZCBzaG91bGQgYmUgc2hvd24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERpYWxvZ0VuYWJsZWQoU3RyaW5nIGtleSwgYm9vbGVhbiBpc0VuYWJsZWQpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlzZXR0aW5ncy5wdXQoa2V5LCAhaXNFbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgYWxsIHJlbWVtYmVyZWQgaW5mb3JtYXRpb24gYWJvdXQgaGlkZGVuIGRpYWxvZ3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJBbGxSZW1lbWJlcmVkU3RhdGVzKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3M9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlzZXR0aW5ncy5hZGROZXdTZWN0aW9uKFNUT1JFX0lEKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9TdHJ1Y3R1cmVkQ29udGVudEFzc2lzdGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvU3RydWN0dXJlZENvbnRlbnRBc3Npc3RhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEwOTQyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9TdHJ1Y3R1cmVkQ29udGVudEFzc2lzdGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci0KLS8qKgotICogPHA+Q29udGVudCBhc3Npc3RhbnQgdGhhdCB1c2VzIHtAbGluayBDb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3J9cyBzbyB0aGF0IG11bHRpcGxlCi0gKiBwcm9jZXNzb3JzIGNhbiBiZSByZWdpc3RlcmVkIGZvciBlYWNoIHBhcnRpdGlvbiB0eXBlPC9wPgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZENvbnRlbnRBc3Npc3RhbnQgZXh0ZW5kcyBDb250ZW50QXNzaXN0YW50IHsKLQkvKiogbmVlZCB0byByZXRhaW4gY29weSBvZiBhbGwgcmVsZWFzYWJsZSBwcm9jZXNzb3JzIHNvIHRoZXkgY2FuIGJlIHJlbGVhc2VkIG9uIHVuaW5zdGFsbCAqLwotCXByaXZhdGUgTGlzdCBmUmVsZWFzYWJsZVByb2Nlc3NvcnM7Ci0JCi0JLyoqIAotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgY29udGVudCBhc3Npc3QgcHJvY2Vzc29yIGhhcyBiZWVuIGFkZGVkIHRvIHRoaXMgYXNzaXN0YW50LAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZklzSW5pdGFsaXplZDsKLQkKLQkvKioKLQkgKiA8cD5Db25zdHJ1Y3QgdGhlIGFzc2lzdGFudDwvcD4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZENvbnRlbnRBc3Npc3RhbnQoKSB7Ci0JCXRoaXMuZklzSW5pdGFsaXplZCA9IGZhbHNlOwotCQl0aGlzLmZSZWxlYXNhYmxlUHJvY2Vzc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+RWFjaCBzZXQgY29udGVudCBhc3Npc3QgcHJvY2Vzc29yIGlzIHBsYWNlZCBpbnNpZGUgYQotCSAqIENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvciB3aGljaCBhbGxvd3MgbXVsdGlwbGUgcHJvY2Vzc29ycyBwZXIKLQkgKiBwYXJ0aXRpb24gdHlwZTwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2Vzc29yCi0JICogICAgICAgICAgICB0aGUgY29udGVudCBhc3Npc3QgcHJvY2Vzc29yIHRvIHJlZ2lzdGVyLCBvcgotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gdG8gcmVtb3ZlIGFuIGV4aXN0aW5nIG9uZQotCSAqIEBwYXJhbSBjb250ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgdHlwZSB1bmRlciB3aGljaCB0byByZWdpc3RlcgotCSAqICAgICAgICAgICAgCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudCNzZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKElDb250ZW50QXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJdGhpcy5mSXNJbml0YWxpemVkID0gdHJ1ZTsKLQkJCi0JCUNvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvciBjb21wb3VuZFByb2Nlc3NvciA9IGdldEV4aXN0aW5nQ29udGVudEFzc2lzdFByb2Nlc3NvcihwYXJ0aXRpb25UeXBlKTsKLQkJaWYoY29tcG91bmRQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJY29tcG91bmRQcm9jZXNzb3IgPSBuZXcgQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCQl0aGlzLmZSZWxlYXNhYmxlUHJvY2Vzc29ycy5hZGQoY29tcG91bmRQcm9jZXNzb3IpOwotCQl9Ci0JCQotCQljb21wb3VuZFByb2Nlc3Nvci5hZGQocHJvY2Vzc29yKTsKLQkJc3VwZXIuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb21wb3VuZFByb2Nlc3NvciwgcGFydGl0aW9uVHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBjb250ZW50IGFzc2lzdCBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIHNvbWUgY29udGVudAotCSAqIGFzc2lzdCBwcm9jZXNzb3JzLiBGYWxzZSBvdGhlcndpc2UuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGNvbnRlbnQgYXNzaXN0YW50IGhhcyBiZWVuIGluaXRpYWxpemVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLQkJcmV0dXJuIHRoaXMuZklzSW5pdGFsaXplZDsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0RXhpc3RpbmdDb250ZW50QXNzaXN0UHJvY2Vzc29yKFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUNvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvciBjb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBudWxsOwotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBzdXBlci5nZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKHBhcnRpdGlvblR5cGUpOwotCQlpZiAocHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCWlmIChwcm9jZXNzb3IgaW5zdGFuY2VvZiBDb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIHsKLQkJCQljb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSAoQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBwcm9jZXNzb3I7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudCN1bmluc3RhbGwoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbCgpIHsKLQkJLy8gZGlzcG9zZSBvZiBhbGwgY29udGVudCBhc3Npc3QgcHJvY2Vzc29ycwotCQlpZiAodGhpcy5mUmVsZWFzYWJsZVByb2Nlc3NvcnMgIT0gbnVsbCAmJiAhdGhpcy5mUmVsZWFzYWJsZVByb2Nlc3NvcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IoaW50IGkgPSAwOyBpIDwgdGhpcy5mUmVsZWFzYWJsZVByb2Nlc3NvcnMuc2l6ZSgpOyArK2kpIHsKLQkJCQkoKElSZWxlYXNhYmxlKXRoaXMuZlJlbGVhc2FibGVQcm9jZXNzb3JzLmdldChpKSkucmVsZWFzZSgpOwotCQkJfQotCQkJCi0JCQl0aGlzLmZSZWxlYXNhYmxlUHJvY2Vzc29ycy5jbGVhcigpOwotCQl9Ci0JCXRoaXMuZlJlbGVhc2FibGVQcm9jZXNzb3JzID0gbnVsbDsKLQkJCi0JCXN1cGVyLnVuaW5zdGFsbCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhODdkNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0NvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Hcm91cE1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5EZWxlZ2F0aW5nRHJhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5EZWxlZ2F0aW5nRHJvcEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uVmlld2VyVG9vbFRpcFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVBhZ2VTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTaG93SW5UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luVGFyZ2V0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlNob3dJbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb247Ci0KLQotcHVibGljIGNsYXNzIENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSBleHRlbmRzIENvbnRlbnRPdXRsaW5lUGFnZSBpbXBsZW1lbnRzIElBZGFwdGFibGUgewotCS8qCi0JICogTWVudSBsaXN0ZW5lciB0byBjcmVhdGUgdGhlIGFkZGl0aW9ucyBncm91cCBhbmQgYWRkIGFueSBtZW51IGl0ZW1zCi0JICogY29udHJpYnV0ZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb247IHJlcXVpcmVkIHNpbmNlIHRoZSBjb250ZXh0IG1lbnUgaXMKLQkgKiBjbGVhcmVkIGV2ZXJ5IHRpbWUgaXQgaXMgc2hvd24KLQkgKi8KLQljbGFzcyBBZGRpdGlvbkdyb3VwQWRkZXIgaW1wbGVtZW50cyBJTWVudUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA+IDAgJiYgaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV0uZ2V0SWQoKSAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5pbnNlcnRBZnRlcihpdGVtc1tpdGVtcy5sZW5ndGggLSAxXS5nZXRJZCgpLCBuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQkJfQotCi0JCQkvLyBhZGQgY29uZmlndXJhdGlvbidzIG1lbnUgaXRlbXMKLQkJCUlNZW51TGlzdGVuZXIgbGlzdGVuZXIgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0TWVudUxpc3RlbmVyKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCWxpc3RlbmVyLm1lbnVBYm91dFRvU2hvdyhtYW5hZ2VyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIGRvdWJsZS1jbGljayByZWdpc3RyYXRpb24gc28gaXQgY2FuIGJlIGRvbmUgYmVmb3JlIHRoZSBDb250cm9sCi0JICogaXMgY3JlYXRlZC4KLQkgKi8KLQljbGFzcyBEb3VibGVDbGlja1Byb3ZpZGVyIGltcGxlbWVudHMgSURvdWJsZUNsaWNrTGlzdGVuZXIgewotCQlwcml2YXRlIElEb3VibGVDbGlja0xpc3RlbmVyW10gbGlzdGVuZXJzID0gbnVsbDsKLQotCQl2b2lkIGFkZERvdWJsZUNsaWNrTGlzdGVuZXIoSURvdWJsZUNsaWNrTGlzdGVuZXIgbmV3TGlzdGVuZXIpIHsKLQkJCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJCWxpc3RlbmVycyA9IG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcltde25ld0xpc3RlbmVyfTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlEb3VibGVDbGlja0xpc3RlbmVyW10gbmV3TGlzdGVuZXJzID0gbmV3IElEb3VibGVDbGlja0xpc3RlbmVyW2xpc3RlbmVycy5sZW5ndGggKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGxpc3RlbmVycywgMCwgbmV3TGlzdGVuZXJzLCAwLCBsaXN0ZW5lcnMubGVuZ3RoKTsKLQkJCQluZXdMaXN0ZW5lcnNbbGlzdGVuZXJzLmxlbmd0aF0gPSBuZXdMaXN0ZW5lcjsKLQkJCQlsaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQlmaXJlRG91YmxlQ2xpY2tFdmVudChldmVudCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgZmlyZURvdWJsZUNsaWNrRXZlbnQoZmluYWwgRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJSURvdWJsZUNsaWNrTGlzdGVuZXJbXSBmaXJpbmdMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpcmluZ0xpc3RlbmVycy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIElEb3VibGVDbGlja0xpc3RlbmVyIGwgPSBmaXJpbmdMaXN0ZW5lcnNbaV07Ci0JCQkJU2FmZVJ1bm5lci5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbC5kb3VibGVDbGljayhldmVudCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCi0JCXZvaWQgcmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihJRG91YmxlQ2xpY2tMaXN0ZW5lciBvbGRMaXN0ZW5lcikgewotCQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJaWYgKGxpc3RlbmVycy5sZW5ndGggPT0gMSAmJiBsaXN0ZW5lcnNbMF0uZXF1YWxzKG9sZExpc3RlbmVyKSkgewotCQkJCQlsaXN0ZW5lcnMgPSBudWxsOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTGlzdCBuZXdMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QobGlzdGVuZXJzKSk7Ci0JCQkJCW5ld0xpc3RlbmVycy5yZW1vdmUob2xkTGlzdGVuZXIpOwotCQkJCQlsaXN0ZW5lcnMgPSAoSURvdWJsZUNsaWNrTGlzdGVuZXJbXSkgbmV3TGlzdGVuZXJzLnRvQXJyYXkobmV3IElEb3VibGVDbGlja0xpc3RlbmVyW2xpc3RlbmVycy5sZW5ndGggLSAxXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVucyB0byBwb3N0IHNlbGVjdGlvbiBmcm9tIHRoZSBzZWxlY3Rpb24gc2VydmljZSwgYXBwbHlpbmcgaXQgdG8KLQkgKiB0aGUgdHJlZSB2aWV3ZXIuCi0JICovCi0JY2xhc3MgUG9zdFNlbGVjdGlvblNlcnZpY2VMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCS8vIGZyb20gc2VsZWN0aW9uIHNlcnZpY2UKLQkJCWlmIChfREVCVUcpIHsKLQkJCQlfREVCVUdfVElNRSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfSAvKgotCQkJICogQnVnIDEzNjMxMCwgdW5sZXNzIHRoaXMgcGFnZSBpcyB0aGF0IHBhcnQncwotCQkJICogSUNvbnRlbnRPdXRsaW5lUGFnZSwgaWdub3JlIHRoZSBzZWxlY3Rpb24gY2hhbmdlCi0JCQkgKi8KLQkJCWlmIChwYXJ0ID09IG51bGwgfHwgcGFydC5nZXRBZGFwdGVyKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpID09IENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZS50aGlzKSB7Ci0JCQkJSVNlbGVjdGlvbiB2YWxpZENvbnRlbnRTZWxlY3Rpb24gPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0U2VsZWN0aW9uKGdldFRyZWVWaWV3ZXIoKSwgc2VsZWN0aW9uKTsKLQotCQkJCWJvb2xlYW4gaXNMaW5rZWQgPSBnZXRDb25maWd1cmF0aW9uKCkuaXNMaW5rZWRXaXRoRWRpdG9yKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCQkJaWYgKGlzTGlua2VkKSB7Ci0JCQkJCWlmICghZ2V0VHJlZVZpZXdlcigpLmdldFNlbGVjdGlvbigpLmVxdWFscyh2YWxpZENvbnRlbnRTZWxlY3Rpb24pKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWZJc1JlY2VpdmluZ1NlbGVjdGlvbiA9IHRydWU7Ci0JCQkJCQkJZ2V0VHJlZVZpZXdlcigpLnNldFNlbGVjdGlvbih2YWxpZENvbnRlbnRTZWxlY3Rpb24sIHRydWUpOwotCQkJCQkJfQotCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJZklzUmVjZWl2aW5nU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoX0RFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIoTzoiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gX0RFQlVHX1RJTUUpICsgIm1zKSAiICsgcGFydCArICIgOiAiICsgc2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEZvcndhcmRzIHBvc3Qtc2VsZWN0aW9uIGZyb20gdGhlIHRyZWUgdmlld2VyIHRvIHRoZSBsaXN0ZW5lcnMgd2hpbGUKLQkgKiBhY3RpbmcgYXMgdGhpcyBwYWdlJ3Mgc2VsZWN0aW9uIHByb3ZpZGVyLgotCSAqLwotCXByaXZhdGUgY2xhc3MgU2VsZWN0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJUG9zdFNlbGVjdGlvblByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBjbGFzcyBQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWlmICghaXNGaXJpbmdTZWxlY3Rpb24oKSAmJiAhZklzUmVjZWl2aW5nU2VsZWN0aW9uKSB7Ci0JCQkJCWZpcmVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50LCBwb3N0TGlzdGVuZXJzKTsKLQkJCQkJdXBkYXRlU3RhdHVzTGluZShnZXRTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCksIGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGNsYXNzIFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIWlzRmlyaW5nU2VsZWN0aW9uKCkgJiYgIWZJc1JlY2VpdmluZ1NlbGVjdGlvbikgewotCQkJCQlmaXJlU2VsZWN0aW9uQ2hhbmdlZChldmVudCwgbGlzdGVuZXJzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNGaXJpbmdTZWxlY3Rpb24gPSBmYWxzZTsKLQkJcHJpdmF0ZSBMaXN0ZW5lckxpc3QgbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQlwcml2YXRlIExpc3RlbmVyTGlzdCBwb3N0TGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgcG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG5ldyBQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCk7Ci0JCXByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCk7Ci0KLQkJcHVibGljIHZvaWQgYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlwb3N0TGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmaXJlU2VsZWN0aW9uQ2hhbmdlZChmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQsIExpc3RlbmVyTGlzdCBsaXN0ZW5lckxpc3QpIHsKLQkJCWlzRmlyaW5nU2VsZWN0aW9uID0gdHJ1ZTsKLQkJCU9iamVjdFtdIGxpc3RlbmVycyA9IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCQlTYWZlUnVubmVyLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQlpc0ZpcmluZ1NlbGVjdGlvbiA9IGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZ2V0UG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBwb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotCQl9Ci0KLQkJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQkJaWYgKGdldFRyZWVWaWV3ZXIoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJCXJldHVybiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCQl9Ci0KLQkJcHVibGljIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZ2V0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcmV0dXJuIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRmlyaW5nU2VsZWN0aW9uKCkgewotCQkJcmV0dXJuIGlzRmlyaW5nU2VsZWN0aW9uOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlwb3N0TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCWlmICghaXNGaXJpbmdTZWxlY3Rpb24pIHsKLQkJCQlnZXRUcmVlVmlld2VyKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFNob3dJblRhcmdldCBpbXBsZW1lbnRzIElTaG93SW5UYXJnZXQgewotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldCNzaG93KG9yZy5lY2xpcHNlLnVpLnBhcnQuU2hvd0luQ29udGV4dCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHNob3coU2hvd0luQ29udGV4dCBjb250ZXh0KSB7Ci0JCQlzZXRTZWxlY3Rpb24oY29udGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQlyZXR1cm4gZ2V0VHJlZVZpZXdlcigpLmdldFNlbGVjdGlvbigpLmVxdWFscyhjb250ZXh0LmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIE5VTExfQ09ORklHVVJBVElPTiA9IG5ldyBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCXB1YmxpYyBJQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQkJcmV0dXJuIG5ldyBJVHJlZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUTElORV9DT05URVhUX01FTlVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvci5PdXRsaW5lQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRMSU5FX0NPTlRFWFRfTUVOVV9TVUZGSVggPSAiLnNvdXJjZS5PdXRsaW5lQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9ERUJVRyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2NvbnRlbnRPdXRsaW5lIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkOwotCi0JcHJpdmF0ZSBsb25nIF9ERUJVR19USU1FID0gMDsKLQotCXByaXZhdGUgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJbXSBmQWN0aXZlRHJhZ0xpc3RlbmVyczsKLQlwcml2YXRlIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyW10gZkFjdGl2ZURyb3BMaXN0ZW5lcnM7Ci0JcHJpdmF0ZSBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gZkNvbmZpZ3VyYXRpb247Ci0KLQlwcml2YXRlIE1lbnUgZkNvbnRleHRNZW51OwotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0TWVudUlkOwotCi0JcHJpdmF0ZSBNZW51TWFuYWdlciBmQ29udGV4dE1lbnVNYW5hZ2VyOwotCXByaXZhdGUgRG91YmxlQ2xpY2tQcm92aWRlciBmRG91YmxlQ2xpY2tQcm92aWRlciA9IG51bGw7Ci0KLQlwcml2YXRlIERlbGVnYXRpbmdEcmFnQWRhcHRlciBmRHJhZ0FkYXB0ZXI7Ci0JcHJpdmF0ZSBEcmFnU291cmNlIGZEcmFnU291cmNlOwotCXByaXZhdGUgRGVsZWdhdGluZ0Ryb3BBZGFwdGVyIGZEcm9wQWRhcHRlcjsKLQlwcml2YXRlIERyb3BUYXJnZXQgZkRyb3BUYXJnZXQ7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCXByaXZhdGUgSU1lbnVMaXN0ZW5lciBmR3JvdXBBZGRlciA9IG51bGw7Ci0JcHJpdmF0ZSBPYmplY3QgZklucHV0ID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIGZJbnB1dENvbnRlbnRUeXBlSWRlbnRpZmllciA9IG51bGw7Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uTGlzdGVuZXIgZlNlbGVjdGlvbkxpc3RlbmVyID0gbnVsbDsKLQotCVNlbGVjdGlvblByb3ZpZGVyIGZTZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0KLQlib29sZWFuIGZJc1JlY2VpdmluZ1NlbGVjdGlvbjsKLQotCS8qKgotCSAqIEEgQ29udGVudE91dGxpbmVQYWdlIHRoYXQgYWJzdHJhY3QgYXMgbXVjaCBiZWhhdmlvciBhcyBwb3NzaWJsZSBhd2F5Ci0JICogZnJvbSB0aGUgQ29udHJvbHMgYW5kIHZhcmllcyBpdCBieSBjb250ZW50IHR5cGUuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJZkdyb3VwQWRkZXIgPSBuZXcgQWRkaXRpb25Hcm91cEFkZGVyKCk7Ci0JCWZTZWxlY3Rpb25Qcm92aWRlciA9IG5ldyBTZWxlY3Rpb25Qcm92aWRlcigpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBhIGxpc3Qgb2YgdGhvc2Ugbm90aWZpZWQgd2hlbiBzb21lb25lIGRvdWJsZS1jbGlja3MKLQkgKiBpbiB0aGUgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TGlzdGVuZXIgLSB0aGUgbGlzdGVuZXIgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihJRG91YmxlQ2xpY2tMaXN0ZW5lciBuZXdMaXN0ZW5lcikgewotCQlpZiAoZkRvdWJsZUNsaWNrUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkRvdWJsZUNsaWNrUHJvdmlkZXIgPSBuZXcgRG91YmxlQ2xpY2tQcm92aWRlcigpOwotCQl9Ci0JCWZEb3VibGVDbGlja1Byb3ZpZGVyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3TGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGNvbXB1dGVDb250ZXh0TWVudUlEKCkgewotCQlTdHJpbmcgaWQgPSBudWxsOwotCQlpZiAoZklucHV0Q29udGVudFR5cGVJZGVudGlmaWVyICE9IG51bGwpIHsKLQkJCWlkID0gZklucHV0Q29udGVudFR5cGVJZGVudGlmaWVyICsgT1VUTElORV9DT05URVhUX01FTlVfU1VGRklYOwotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbnRlbnRPdXRsaW5lUGFnZSNjcmVhdGVDb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJQ29sdW1uVmlld2VyVG9vbFRpcFN1cHBvcnQuZW5hYmxlRm9yKGdldFRyZWVWaWV3ZXIoKSk7Ci0KLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCWZFZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQl9Ci0KLQkJZkRyYWdBZGFwdGVyID0gbmV3IERlbGVnYXRpbmdEcmFnQWRhcHRlcigpOwotCQlmRHJhZ1NvdXJjZSA9IG5ldyBEcmFnU291cmNlKGdldENvbnRyb2woKSwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUpOwotCQlmRHJvcEFkYXB0ZXIgPSBuZXcgRGVsZWdhdGluZ0Ryb3BBZGFwdGVyKCk7Ci0JCWZEcm9wVGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQoZ2V0Q29udHJvbCgpLCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSk7Ci0KLQkJc2V0Q29uZmlndXJhdGlvbihnZXRDb25maWd1cmF0aW9uKCkpOwotCi0JCS8qCi0JCSAqIENvbnRlbnRPdXRsaW5lUGFnZSBvbmx5IGltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyIHdoaWxlIHRoZQotCQkgKiB0cmVlIHZpZXdlciBpbXBsZW1lbnRzIGJvdGggSVNlbGVjdGlvblByb3ZpZGVyIGFuZAotCQkgKiBJUG9zdFNlbGVjdGlvblByb3ZpZGVyLiBVc2UgYW4gSVNlbGVjdGlvblByb3ZpZGVyIHRoYXQgbGlzdGVucyB0bwotCQkgKiBwb3N0IHNlbGVjdGlvbiBmcm9tIHRoZSB0cmVlIHZpZXdlciBhbmQgZm9yd2FyZCBvbmx5IHBvc3Qgc2VsZWN0aW9uCi0JCSAqIHRvIHRoZSBzZWxlY3Rpb24gc2VydmljZS4KLQkJICovCi0JCWdldFRyZWVWaWV3ZXIoKS5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZTZWxlY3Rpb25Qcm92aWRlci5nZXRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOwotCQlnZXRUcmVlVmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZTZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSk7Ci0JCWlmIChmRG91YmxlQ2xpY2tQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmRG91YmxlQ2xpY2tQcm92aWRlciA9IG5ldyBEb3VibGVDbGlja1Byb3ZpZGVyKCk7Ci0JCX0KLQkJZ2V0VHJlZVZpZXdlcigpLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIoZkRvdWJsZUNsaWNrUHJvdmlkZXIpOwotCQlnZXRTaXRlKCkuc2V0U2VsZWN0aW9uUHJvdmlkZXIoZlNlbGVjdGlvblByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2VsZWN0aW9uU2VydmljZSgpLnJlbW92ZVBvc3RTZWxlY3Rpb25MaXN0ZW5lcihnZXRTZWxlY3Rpb25TZXJ2aWNlTGlzdGVuZXIoKSk7Ci0JCWlmIChmRG91YmxlQ2xpY2tQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlnZXRUcmVlVmlld2VyKCkucmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihmRG91YmxlQ2xpY2tQcm92aWRlcik7Ci0JCX0KLQotCQkvLyBkaXNwb3NlIG1lbnUgY29udHJvbHMKLQkJaWYgKGZDb250ZXh0TWVudSAhPSBudWxsKSB7Ci0JCQlmQ29udGV4dE1lbnUuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChmQ29udGV4dE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZDb250ZXh0TWVudU1hbmFnZXIucmVtb3ZlTWVudUxpc3RlbmVyKGZHcm91cEFkZGVyKTsKLQkJCWZDb250ZXh0TWVudU1hbmFnZXIucmVtb3ZlQWxsKCk7Ci0JCQlmQ29udGV4dE1lbnVNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJfQotCi0JCWZEcm9wVGFyZ2V0LmRpc3Bvc2UoKTsKLQkJZkRyYWdTb3VyY2UuZGlzcG9zZSgpOwotCi0JCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlciA9IGdldFNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJaWYgKHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UobnVsbCk7Ci0JCX0KLQkJc2V0Q29uZmlndXJhdGlvbihOVUxMX0NPTkZJR1VSQVRJT04pOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7Ci0JCU9iamVjdCBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKGtleS5lcXVhbHMoSVNob3dJblRhcmdldC5jbGFzcykpIHsKLQkJCWFkYXB0ZXIgPSBuZXcgU2hvd0luVGFyZ2V0KCk7Ci0JCX0KLQkJZmluYWwgSUVkaXRvclBhcnQgZWRpdG9yID0gZkVkaXRvcjsKLQotCQlpZiAoa2V5LmVxdWFscyhJU2hvd0luU291cmNlLmNsYXNzKSAmJiBlZGl0b3IgIT0gbnVsbCkgewotCQkJYWRhcHRlciA9IG5ldyBJU2hvd0luU291cmNlKCkgewotCQkJCXB1YmxpYyBTaG93SW5Db250ZXh0IGdldFNob3dJbkNvbnRleHQoKSB7Ci0JCQkJCXJldHVybiBuZXcgU2hvd0luQ29udGV4dChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSwgZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCWVsc2UgaWYgKGtleS5lcXVhbHMoSVNob3dJblRhcmdldExpc3QuY2xhc3MpICYmIGVkaXRvciAhPSBudWxsKSB7Ci0JCQlhZGFwdGVyID0gZWRpdG9yLmdldEFkYXB0ZXIoa2V5KTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50bHkgdXNlZCBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChmQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlmQ29uZmlndXJhdGlvbiA9IE5VTExfQ09ORklHVVJBVElPTjsKLQkJfQotCQlyZXR1cm4gZkNvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNnZXRTZWxlY3Rpb24oKQotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGZTZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQlJU2VsZWN0aW9uTGlzdGVuZXIgZ2V0U2VsZWN0aW9uU2VydmljZUxpc3RlbmVyKCkgewotCQlpZiAoZlNlbGVjdGlvbkxpc3RlbmVyID09IG51bGwpIHsKLQkJCWZTZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBQb3N0U2VsZWN0aW9uU2VydmljZUxpc3RlbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZTZWxlY3Rpb25MaXN0ZW5lcjsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUKLQkgKiBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlQm9va1ZpZXdQYWdlI2luaXQob3JnLmVjbGlwc2UudWkucGFydC5JUGFnZVNpdGUKLQkgKiApCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJUGFnZVNpdGUgcGFnZVNpdGUpIHsKLQkJc3VwZXIuaW5pdChwYWdlU2l0ZSk7Ci0JCXBhZ2VTaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNlbGVjdGlvblNlcnZpY2UoKS5hZGRQb3N0U2VsZWN0aW9uTGlzdGVuZXIoZ2V0U2VsZWN0aW9uU2VydmljZUxpc3RlbmVyKCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciB0byBhIGxpc3Qgb2YgdGhvc2Ugbm90aWZpZWQgd2hlbiBzb21lb25lCi0JICogZG91YmxlLWNsaWNrcyBpbiB0aGUgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkTGlzdGVuZXIgLSB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihJRG91YmxlQ2xpY2tMaXN0ZW5lciBvbGRMaXN0ZW5lcikgewotCQlpZiAoZkRvdWJsZUNsaWNrUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJZkRvdWJsZUNsaWNrUHJvdmlkZXIucmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihvbGRMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lUGFnZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmICghZklzUmVjZWl2aW5nU2VsZWN0aW9uKQotCQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ29uZmlndXJlcyAob3IgcmVjb25maWd1cmVzKSB0aGUgcGFnZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb24oQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJLy8gaW50ZW50aW9uYWxseSBkbyBub3QgY2hlY2sgdG8gc2VlIGlmIHRoZSBuZXcgY29uZmlndXJhdGlvbiAhPSBvbGQKLQkJLy8gY29uZmlndXJhdGlvbgotCQlpZiAoZ2V0VHJlZVZpZXdlcigpICE9IG51bGwpIHsKLQkJCS8vIHJlbW92ZSB0aGUga2V5IGxpc3RlbmVycwotCQkJaWYgKGdldENvbnRyb2woKSAhPSBudWxsICYmICFnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJS2V5TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0S2V5TGlzdGVuZXJzKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlnZXRDb250cm9sKCkucmVtb3ZlS2V5TGlzdGVuZXIobGlzdGVuZXJzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJSUNvbnRyaWJ1dGlvbk1hbmFnZXIgdG9vbGJhciA9IGdldFNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJCWlmICh0b29sYmFyICE9IG51bGwpIHsKLQkJCQlJQ29udHJpYnV0aW9uSXRlbVtdIHRvb2xiYXJJdGVtcyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRUb29sYmFyQ29udHJpYnV0aW9ucyhnZXRUcmVlVmlld2VyKCkpOwotCQkJCWlmICh0b29sYmFySXRlbXMgIT0gbnVsbCAmJiB0b29sYmFySXRlbXMubGVuZ3RoID4gMCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRvb2xiYXJJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJdG9vbGJhci5yZW1vdmUodG9vbGJhckl0ZW1zW2ldKTsKLQkJCQkJfQotCQkJCQl0b29sYmFyLnVwZGF0ZShmYWxzZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlJQ29udHJpYnV0aW9uTWFuYWdlciBtZW51YmFyID0gZ2V0U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRNZW51TWFuYWdlcigpOwotCQkJaWYgKG1lbnViYXIgIT0gbnVsbCkgewotCQkJCUlDb250cmlidXRpb25JdGVtW10gbWVudUl0ZW1zID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldE1lbnVDb250cmlidXRpb25zKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCQkJaWYgKG1lbnVJdGVtcyAhPSBudWxsICYmIG1lbnVJdGVtcy5sZW5ndGggPiAwKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVudUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQltZW51YmFyLnJlbW92ZShtZW51SXRlbXNbaV0pOwotCQkJCQl9Ci0JCQkJCW1lbnViYXIucmVtb3ZlKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKTsKLQkJCQkJbWVudWJhci51cGRhdGUoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNsZWFyIHRoZSBEbkQgbGlzdGVuZXJzIGFuZCB0cmFuc2ZlciB0eXBlcwotCQkJaWYgKGZEcmFnQWRhcHRlciAhPSBudWxsICYmICFmRHJhZ0FkYXB0ZXIuaXNFbXB0eSgpICYmIGZEcmFnU291cmNlICE9IG51bGwgJiYgIWZEcmFnU291cmNlLmlzRGlzcG9zZWQoKSAmJiBmRHJhZ1NvdXJjZS5nZXRUcmFuc2ZlcigpLmxlbmd0aCA+IDApIHsKLQkJCQlpZiAoZkFjdGl2ZURyYWdMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZBY3RpdmVEcmFnTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlmRHJhZ0FkYXB0ZXIucmVtb3ZlRHJhZ1NvdXJjZUxpc3RlbmVyKGZBY3RpdmVEcmFnTGlzdGVuZXJzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmQWN0aXZlRHJhZ0xpc3RlbmVycyA9IG51bGw7Ci0JCQkJZkRyYWdTb3VyY2UucmVtb3ZlRHJhZ0xpc3RlbmVyKGZEcmFnQWRhcHRlcik7Ci0JCQkJZkRyYWdTb3VyY2Uuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyWzBdKTsKLQkJCX0KLQkJCWlmIChmRHJvcEFkYXB0ZXIgIT0gbnVsbCAmJiAhZkRyb3BBZGFwdGVyLmlzRW1wdHkoKSAmJiBmRHJvcFRhcmdldCAhPSBudWxsICYmICFmRHJvcFRhcmdldC5pc0Rpc3Bvc2VkKCkgJiYgZkRyb3BUYXJnZXQuZ2V0VHJhbnNmZXIoKS5sZW5ndGggPiAwKSB7Ci0JCQkJaWYgKGZBY3RpdmVEcm9wTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmQWN0aXZlRHJvcExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJZkRyb3BBZGFwdGVyLnJlbW92ZURyb3BUYXJnZXRMaXN0ZW5lcihmQWN0aXZlRHJvcExpc3RlbmVyc1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZkFjdGl2ZURyb3BMaXN0ZW5lcnMgPSBudWxsOwotCQkJCWZEcm9wVGFyZ2V0LnJlbW92ZURyb3BMaXN0ZW5lcihmRHJvcEFkYXB0ZXIpOwotCQkJCWZEcm9wVGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlclswXSk7Ci0JCQl9Ci0JCQlnZXRDb25maWd1cmF0aW9uKCkuZ2V0Q29udGVudFByb3ZpZGVyKGdldFRyZWVWaWV3ZXIoKSkuaW5wdXRDaGFuZ2VkKGdldFRyZWVWaWV3ZXIoKSwgZklucHV0LCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgYW55IHRpZXMgdG8gdGhpcyB0cmVlIHZpZXdlcgotCQkJZ2V0Q29uZmlndXJhdGlvbigpLnVuY29uZmlndXJlKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCX0KLQotCQlmQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0KLQkJaWYgKGdldFRyZWVWaWV3ZXIoKSAhPSBudWxsICYmIGdldENvbnRyb2woKSAhPSBudWxsICYmICFnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkvLyAocmUpc2V0IHRoZSBwcm92aWRlcnMKLQkJCWdldFRyZWVWaWV3ZXIoKS5zZXRMYWJlbFByb3ZpZGVyKGdldENvbmZpZ3VyYXRpb24oKS5nZXRMYWJlbFByb3ZpZGVyKGdldFRyZWVWaWV3ZXIoKSkpOwotCQkJZ2V0VHJlZVZpZXdlcigpLnNldENvbnRlbnRQcm92aWRlcihnZXRDb25maWd1cmF0aW9uKCkuZ2V0Q29udGVudFByb3ZpZGVyKGdldFRyZWVWaWV3ZXIoKSkpOwotCi0JCQkvLyB2aWV3IHRvb2xiYXIKLQkJCUlDb250cmlidXRpb25NYW5hZ2VyIHRvb2xiYXIgPSBnZXRTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCQlpZiAodG9vbGJhciAhPSBudWxsKSB7Ci0JCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSB0b29sYmFySXRlbXMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0VG9vbGJhckNvbnRyaWJ1dGlvbnMoZ2V0VHJlZVZpZXdlcigpKTsKLQkJCQlpZiAodG9vbGJhckl0ZW1zICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b29sYmFySXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCXRvb2xiYXIuYWRkKHRvb2xiYXJJdGVtc1tpXSk7Ci0JCQkJCX0KLQkJCQkJdG9vbGJhci51cGRhdGUodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gdmlldyBtZW51Ci0JCQlJQ29udHJpYnV0aW9uTWFuYWdlciBtZW51ID0gZ2V0U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRNZW51TWFuYWdlcigpOwotCQkJaWYgKG1lbnUgIT0gbnVsbCkgewotCQkJCUlDb250cmlidXRpb25JdGVtW10gbWVudUl0ZW1zID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldE1lbnVDb250cmlidXRpb25zKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCQkJaWYgKG1lbnVJdGVtcyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVudUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQltZW51SXRlbXNbaV0uc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCW1lbnUuYWRkKG1lbnVJdGVtc1tpXSk7Ci0JCQkJCQltZW51SXRlbXNbaV0udXBkYXRlKCk7Ci0JCQkJCX0KLQkJCQkJbWVudS51cGRhdGUodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gYWRkIHRoZSBhbGxvd2VkIERuRCBsaXN0ZW5lcnMgYW5kIHR5cGVzCi0JCQlUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcltdIGRyYWdMaXN0ZW5lcnMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0VHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCQlpZiAoZkRyYWdBZGFwdGVyICE9IG51bGwgJiYgZHJhZ0xpc3RlbmVycy5sZW5ndGggPiAwKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkcmFnTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWZEcmFnQWRhcHRlci5hZGREcmFnU291cmNlTGlzdGVuZXIoZHJhZ0xpc3RlbmVyc1tpXSk7Ci0JCQkJfQotCQkJCWZBY3RpdmVEcmFnTGlzdGVuZXJzID0gZHJhZ0xpc3RlbmVyczsKLQkJCQlmRHJhZ1NvdXJjZS5hZGREcmFnTGlzdGVuZXIoZkRyYWdBZGFwdGVyKTsKLQkJCQlmRHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihmRHJhZ0FkYXB0ZXIuZ2V0VHJhbnNmZXJzKCkpOwotCQkJfQotCQkJVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJbXSBkcm9wTGlzdGVuZXJzID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyhnZXRUcmVlVmlld2VyKCkpOwotCQkJaWYgKGZEcm9wQWRhcHRlciAhPSBudWxsICYmIGRyb3BMaXN0ZW5lcnMubGVuZ3RoID4gMCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZHJvcExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQlmRHJvcEFkYXB0ZXIuYWRkRHJvcFRhcmdldExpc3RlbmVyKGRyb3BMaXN0ZW5lcnNbaV0pOwotCQkJCX0KLQkJCQlmQWN0aXZlRHJvcExpc3RlbmVycyA9IGRyb3BMaXN0ZW5lcnM7Ci0JCQkJZkRyb3BUYXJnZXQuYWRkRHJvcExpc3RlbmVyKGZEcm9wQWRhcHRlcik7Ci0JCQkJZkRyb3BUYXJnZXQuc2V0VHJhbnNmZXIoZkRyb3BBZGFwdGVyLmdldFRyYW5zZmVycygpKTsKLQkJCX0KLQkJCS8vIGFkZCB0aGUga2V5IGxpc3RlbmVycwotCQkJS2V5TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0S2V5TGlzdGVuZXJzKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQlnZXRDb250cm9sKCkuYWRkS2V5TGlzdGVuZXIobGlzdGVuZXJzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZklucHV0ICE9IG51bGwpIHsKLQkJCXNldElucHV0KGZJbnB1dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogICAgICAgICAgICBUaGUgSUVkaXRvclBhcnQgdGhhdCAib3ducyIgdGhpcyBwYWdlLiBVc2VkIHRvIHN1cHBvcnQgdGhlCi0JICogICAgICAgICAgICAiU2hvdyBJbi4uLiIgbWVudS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0b3JQYXJ0KElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlmRWRpdG9yID0gZWRpdG9yOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdJbnB1dAotCSAqICAgICAgICAgICAgVGhlIGlucHV0IGZvciB0aGUgcGFnZSdzIHZpZXdlci4gU2hvdWxkIG9ubHkgYmUgc2V0IGFmdGVyIGEKLQkgKiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gYXBwbGllZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgbmV3SW5wdXQpIHsKLQkJZklucHV0ID0gbmV3SW5wdXQ7Ci0JCS8qCi0JCSAqIEludGVudGlvbmFsbHkgbm90IG9wdGltaXplZCBmb3IgY2hlY2tpbmcgbmV3IGlucHV0IHZzLiBvbGQgaW5wdXQgc28KLQkJICogdGhhdCBhbnkgZXhpc3RpbmcgY29udGVudCBwcm92aWRlcnMgY2FuIGJlIHVwZGF0ZWQKLQkJICovCi0JCWlmIChnZXRDb250cm9sKCkgIT0gbnVsbCAmJiAhZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJZ2V0VHJlZVZpZXdlcigpLnNldElucHV0KGZJbnB1dCk7Ci0JCQl1cGRhdGVDb250ZXh0TWVudUlkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWQgLSB0aGUgY29udGVudCB0eXBlIGlkZW50aWZpZXIgdG8gdXNlIGZvciBmdXJ0aGVyIGV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0Q29udGVudFR5cGVJZGVudGlmaWVyKFN0cmluZyBpZCkgewotCQlmSW5wdXRDb250ZW50VHlwZUlkZW50aWZpZXIgPSBpZDsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBvdXRsaW5lIHBhZ2UncyBjb250ZXh0IG1lbnUgZm9yIHRoZSBjdXJyZW50IGlucHV0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbnRleHRNZW51SWQoKSB7Ci0JCVN0cmluZyBjb21wdXRlZENvbnRleHRNZW51SWQgPSBudWxsOwotCQkvLyB1cGRhdGUgb3V0bGluZSB2aWV3J3MgY29udGV4dCBtZW51IGNvbnRyb2wgYW5kIElECi0KLQkJaWYgKGZFZGl0b3IgPT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJZkVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQl9Ci0JCX0KLQotCQljb21wdXRlZENvbnRleHRNZW51SWQgPSBjb21wdXRlQ29udGV4dE1lbnVJRCgpOwotCi0JCWlmIChjb21wdXRlZENvbnRleHRNZW51SWQgPT0gbnVsbCkgewotCQkJY29tcHV0ZWRDb250ZXh0TWVudUlkID0gT1VUTElORV9DT05URVhUX01FTlVfSUQ7Ci0JCX0KLQotCQkvKgotCQkgKiBVcGRhdGUgb3V0bGluZSBjb250ZXh0IG1lbnUgaWQgaWYgdXBkYXRpbmcgdG8gYSBuZXcgaWQgb3IgaWYKLQkJICogY29udGV4dCBtZW51IGlzIG5vdCBhbHJlYWR5IHNldCB1cAotCQkgKi8KLQkJaWYgKCFjb21wdXRlZENvbnRleHRNZW51SWQuZXF1YWxzKGZDb250ZXh0TWVudUlkKSB8fCAoZkNvbnRleHRNZW51ID09IG51bGwpKSB7Ci0JCQlmQ29udGV4dE1lbnVJZCA9IGNvbXB1dGVkQ29udGV4dE1lbnVJZDsKLQotCQkJaWYgKGdldENvbnRyb2woKSAhPSBudWxsICYmICFnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJLy8gZGlzcG9zZSBvZiBwcmV2aW91cyBjb250ZXh0IG1lbnUKLQkJCQlpZiAoZkNvbnRleHRNZW51ICE9IG51bGwpIHsKLQkJCQkJZkNvbnRleHRNZW51LmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJaWYgKGZDb250ZXh0TWVudU1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQlmQ29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZU1lbnVMaXN0ZW5lcihmR3JvdXBBZGRlcik7Ci0JCQkJCWZDb250ZXh0TWVudU1hbmFnZXIucmVtb3ZlQWxsKCk7Ci0JCQkJCWZDb250ZXh0TWVudU1hbmFnZXIuZGlzcG9zZSgpOwotCQkJCX0KLQotCQkJCWZDb250ZXh0TWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoZkNvbnRleHRNZW51SWQsIGZDb250ZXh0TWVudUlkKTsKLQkJCQlmQ29udGV4dE1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQotCQkJCWZDb250ZXh0TWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKGZHcm91cEFkZGVyKTsKLQotCQkJCWZDb250ZXh0TWVudSA9IGZDb250ZXh0TWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUoZ2V0Q29udHJvbCgpKTsKLQkJCQlnZXRDb250cm9sKCkuc2V0TWVudShmQ29udGV4dE1lbnUpOwotCi0JCQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoZkNvbnRleHRNZW51SWQsIGZDb250ZXh0TWVudU1hbmFnZXIsIHRoaXMpOwotCi0JCQkJLyoKLQkJCQkgKiBhbHNvIHJlZ2lzdGVyIHRoaXMgbWVudSBmb3Igc291cmNlIHBhZ2UgcGFydCBhbmQgc3RydWN0dXJlZAotCQkJCSAqIHRleHQgb3V0bGluZSB2aWV3IGlkcwotCQkJCSAqLwotCQkJCWlmIChmRWRpdG9yICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHBhcnRJZCA9IGZFZGl0b3IuZ2V0U2l0ZSgpLmdldElkKCk7Ci0JCQkJCWlmIChwYXJ0SWQgIT0gbnVsbCkgewotCQkJCQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUocGFydElkICsgT1VUTElORV9DT05URVhUX01FTlVfU1VGRklYLCBmQ29udGV4dE1lbnVNYW5hZ2VyLCB0aGlzKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShPVVRMSU5FX0NPTlRFWFRfTUVOVV9JRCwgZkNvbnRleHRNZW51TWFuYWdlciwgdGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHVwZGF0ZVN0YXR1c0xpbmUoSVN0YXR1c0xpbmVNYW5hZ2VyIG1nciwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCUlMYWJlbFByb3ZpZGVyIHN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCWlmIChzdGF0dXNMaW5lTGFiZWxQcm92aWRlciAhPSBudWxsICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3QgZmlyc3RFbGVtZW50ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCXRleHQgPSBzdGF0dXNMaW5lTGFiZWxQcm92aWRlci5nZXRUZXh0KGZpcnN0RWxlbWVudCk7Ci0JCQlpbWFnZSA9IHN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyLmdldEltYWdlKGZpcnN0RWxlbWVudCk7Ci0JCX0KLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCW1nci5zZXRNZXNzYWdlKHRleHQpOwotCQl9Ci0JCWVsc2UgewotCQkJbWdyLnNldE1lc3NhZ2UoaW1hZ2UsIHRleHQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0lKRmFjZU5vZGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSUpGYWNlTm9kZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc4OTM0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSUpGYWNlTm9kZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotCi0KLS8qKgotICogQWRhcHRlciBpbnRlcmZhY2UgdG8gcHJvdmlkZSBKRmFjZS1zdHlsZSBjaGlsZHJlbiBhbmQgcHJvcGVydHkgaW5mb3JtYXRpb24uCi0gKiBUaGUgZmFjdG9yeSByZXR1cm5pbmcgdGhpcyBhZGFwdGVyIGlzIGV4cGVjdGVkIHRvIGltcGxlbWVudAotICogSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSkZhY2VOb2RlQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGlsZCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IGVsZW1lbnQuCi0gICAgICogVGhlIHJlc3VsdCBpcyBub3QgbW9kaWZpZWQgYnkgdGhlIHZpZXdlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIHRoZSBwYXJlbnQgb2JqZWN0Ci0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBjaGlsZCBlbGVtZW50cwotICAgICAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3Qgbm9kZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIHdpdGggdGhlIGVsZW1lbnRzIGJlbG9uZ2luZyB0byB0aGUgcGFzc2VkCi0JICogZWxlbWVudC4gVGhlc2UgYXJlIHRoZSB0b3AgbGV2ZWwgaXRlbXMgaW4gYSBsaXN0LCB0cmVlLCB0YWJsZSwgZXRjLi4uCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBub2RlKTsKLQotCS8qKgotCSAqIEZldGNoZXMgdGhlIGxhYmVsIGltYWdlIHNwZWNpZmljIHRvIHRoaXMgb2JqZWN0IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRMYWJlbEltYWdlKE9iamVjdCBub2RlKTsKLQotCS8qKgotCSAqIEZldGNoZXMgdGhlIGxhYmVsIHRleHQgc3BlY2lmaWMgdG8gdGhpcyBvYmplY3QgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoT2JqZWN0IG5vZGUpOwotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG5vZGUpOwotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG5vZGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0lKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0lKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjdhNTNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9JSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogcmV0dXJucyAiY29weSIgc28gbm8gb25lIGNhbiBtb2RpZnkgb3VyIGxpc3QuIEl0cyBpcyBhIHNoYWxsb3cgY29weS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRMaXN0ZW5lcnMoKTsKLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWY4ODBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci0KLS8qKgotICogQW4gSUFjdGlvbi5BU19DSEVDS19CT1ggYWN0aW9uIHRoYXQgc2V0cyBhbmQgZ2V0cyBpdHMgY2hlY2tlZCBzdGF0ZSBhbG9uZwotICogd2l0aCBhIHZhbHVlIGZyb20gYSBwcmVmZXJlbmNlIHN0b3JlLiBTaG91bGQgYmUgdXNlZCB3aXRoCi0gKiBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gdG8gbGlzdGVuIHRvIGNoYW5nZXMgaW4gdGhlCi0gKiBzdG9yZSBhbmQgdXBkYXRlIHRoZSBjaGVja2VkIHN0YXRlIGZyb20gUHJvcGVydHlDaGFuZ2VFdmVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElVcGRhdGUgewotCXByaXZhdGUgU3RyaW5nIGZQcmVmZXJlbmNlS2V5OwotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmU3RvcmU7Ci0JcHJpdmF0ZSBib29sZWFuIGZVcGRhdGVGcm9tUHJvcGVydHlDaGFuZ2UgPSB0cnVlOwotCi0JcHVibGljIFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uKFN0cmluZyB0ZXh0LCBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcgcHJlZmVyZW5jZUtleSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIodGV4dCwgSUFjdGlvbi5BU19DSEVDS19CT1gpOwotCQlmUHJlZmVyZW5jZUtleSA9IHByZWZlcmVuY2VLZXk7Ci0JCWZTdG9yZSA9IHN0b3JlOwotCQlmU3RvcmUuc2V0RGVmYXVsdChnZXRQcmVmZXJlbmNlS2V5KCksIGRlZmF1bHRWYWx1ZSk7Ci0JCXNldElkKGdldFByZWZlcmVuY2VLZXkoKSk7Ci0JCXNldENoZWNrZWQoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihnZXRQcmVmZXJlbmNlS2V5KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG9yZGVyUHJlZmVyZW5jZUtleS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZlcmVuY2VLZXkoKSB7Ci0JCXJldHVybiBmUHJlZmVyZW5jZUtleTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0b3JlLgotCSAqLwotCXB1YmxpYyBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIGZTdG9yZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVwZGF0ZUZyb21Qcm9wZXJ0eUNoYW5nZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZUZyb21Qcm9wZXJ0eUNoYW5nZSgpIHsKLQkJcmV0dXJuIGZVcGRhdGVGcm9tUHJvcGVydHlDaGFuZ2U7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgcnVuKCkgewotCQlzdXBlci5ydW4oKTsKLQkJZlN0b3JlLnNldFZhbHVlKGdldFByZWZlcmVuY2VLZXkoKSwgaXNDaGVja2VkKCkpOwotCQlpZiAoIWlzVXBkYXRlRnJvbVByb3BlcnR5Q2hhbmdlKCkpCi0JCQl1cGRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXBkYXRlRnJvbVByb3BlcnR5Q2hhbmdlCi0JICogICAgICAgICAgICBUaGUgdXBkYXRlRnJvbVByb3BlcnR5Q2hhbmdlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVGcm9tUHJvcGVydHlDaGFuZ2UoYm9vbGVhbiB1cGRhdGVGcm9tUHJvcGVydHlDaGFuZ2UpIHsKLQkJZlVwZGF0ZUZyb21Qcm9wZXJ0eUNoYW5nZSA9IHVwZGF0ZUZyb21Qcm9wZXJ0eUNoYW5nZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXNldENoZWNrZWQoZlN0b3JlLmdldEJvb2xlYW4oZ2V0UHJlZmVyZW5jZUtleSgpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZDBhZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1Byb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZTsKLQotLyoqCi0gKiBBIGxpc3RlbmVyIG9uIHRoZSBnaXZlbiBhY3Rpb24ncyBQcmVmZXJlbmNlU3RvcmUuIEl0IGNhbGxzIC51cGRhdGUoKSBvbiB0aGUKLSAqIGFjdGlvbiB3aGVuIHRoZSBnaXZlbiBrZXkgY2hhbmdlcyB2YWx1ZS4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gewotCi0JcHJpdmF0ZSBjbGFzcyBQcmVmZXJlbmNlVXBkYXRlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhmUHJvcGVydHkpKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihmUHJvcGVydHkgKyAiIHByZWZlcmVuY2UgY2hhbmdlZCwgdXBkYXRpbmcgIiArIGdldEFjdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQkoKElVcGRhdGUpIGdldEFjdGlvbigpKS51cGRhdGUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvcHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkOwotCi0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmTGlzdGVuZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIFN0cmluZyBmUHJvcGVydHkgPSBudWxsOwotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmU3RvcmU7Ci0KLQlwdWJsaWMgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtKFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uIGFjdGlvbikgewotCQlzdXBlcihhY3Rpb24pOwotCQlmUHJvcGVydHkgPSBhY3Rpb24uZ2V0UHJlZmVyZW5jZUtleSgpOwotCQlmU3RvcmUgPSBhY3Rpb24uZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWZMaXN0ZW5lciA9IG5ldyBQcmVmZXJlbmNlVXBkYXRlTGlzdGVuZXIoKTsKLQkJY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gc3RhcnRlZCBsaXN0ZW5pbmcgZm9yICIgKyBmUHJvcGVydHkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGZTdG9yZSAhPSBudWxsKSB7Ci0JCQlmU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBzdG9wcGVkIGxpc3RlbmluZyBmb3IgIiArIGZQcm9wZXJ0eSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZlN0b3JlICE9IG51bGwpIHsKLQkJCWZTdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWRpc2Nvbm5lY3QoKTsKLQkJZlByb3BlcnR5ID0gbnVsbDsKLQkJZlN0b3JlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZ2V0QWN0aW9uKCkuZ2V0SWQoKSAhPSBudWxsKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICIodGV4dD0iICsgZ2V0QWN0aW9uKCkuZ2V0VGV4dCgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29tYm9MaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29tYm9MaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOGViNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NvbWJvTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgUGVvcGxlIHNob3VsZCBtYW5hZ2UgdGhlaXIgb3duIGNvbWJvL2xpc3QKLSAqLwotcHVibGljIGNsYXNzIENvbWJvTGlzdCB7Ci0JcHJpdmF0ZSBDb21ibyBjb21ibzsKLQotCi0JcHJpdmF0ZSBMaXN0IGxpc3Q7Ci0KLQlwdWJsaWMgQ29tYm9MaXN0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQljb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIHN0eWxlKTsKLQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQotCS8qCi0JICogZm9sbG93aW5nIG1ldGhvZHMgaXMgb3JpZ2luYWwgbWV0aG9kIG9mIENvbWJvIGNsYXNzLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcga2V5KSB7Ci0JCWNoZWNrRXJyb3IoKTsKLQkJY29tYm8uYWRkKGtleSk7Ci0JCWxpc3QuYWRkKGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKFN0cmluZyBrZXksIGludCBpbmRleCkgewotCQljaGVja0Vycm9yKCk7Ci0JCWNvbWJvLmFkZChrZXksIGluZGV4KTsKLQkJbGlzdC5hZGQoaW5kZXgsIGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQljaGVja0Vycm9yKCk7Ci0JCWNvbWJvLmFkZChrZXkpOwotCQlsaXN0LmFkZCh2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWNoZWNrRXJyb3IoKTsKLQkJY29tYm8uYWRkKGtleSwgaW5kZXgpOwotCQlsaXN0LmFkZChpbmRleCwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEZvY3VzTGlzdGVuZXIoRm9jdXNMaXN0ZW5lciBsaXN0ZW5lcikgewotCQljb21iby5hZGRGb2N1c0xpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0Vycm9yKCkgewotCQlpZiAoIWlzQ29uc2lzdGVuY3koKSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIkRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIGtleXNbIiArIGNvbWJvLmdldEl0ZW1Db3VudCgpICsgIl0gYW5kIHRoZSBudW1iZXIgb2YgdmFsdWVzWyIgKyBsaXN0LnNpemUoKSArICJdIGluIENvbWJvTGlzdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludCBjb21wdXRlU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCkgewotCQlyZXR1cm4gY29tYm8uY29tcHV0ZVNpemUod0hpbnQsIGhIaW50KTsKLQl9Ci0KLQlwdWJsaWMgTWFwIGNyZWF0ZUhhc2h0YWJsZSgpIHsKLQkJY2hlY2tFcnJvcigpOwotCQlNYXAgbSA9IG5ldyBIYXNodGFibGUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKQotCQkJbS5wdXQoY29tYm8uZ2V0SXRlbShpKSwgbGlzdC5nZXQoaSkpOwotCQlyZXR1cm4gbTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZXNlbGVjdChpbnQgaSkgewotCQljb21iby5kZXNlbGVjdChpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZXNlbGVjdEFsbCgpIHsKLQkJY29tYm8uZGVzZWxlY3RBbGwoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gY29tYm8uZXF1YWxzKG9iaik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4Y2hhbmdlUG9zaXRpb24oaW50IGksIGludCBqKSB7Ci0JCVN0cmluZyB0bXBLZXkgPSBnZXRJdGVtKGkpOwotCQlPYmplY3QgdG1wVmFsdWUgPSBsaXN0LnJlbW92ZShpKTsKLQotCQljb21iby5zZXRJdGVtKGksIGdldEl0ZW0oaikpOwotCQlsaXN0LmFkZChpLCBsaXN0LnJlbW92ZShqIC0gMSkpOwotCi0JCWNvbWJvLnNldEl0ZW0oaiwgdG1wS2V5KTsKLQkJbGlzdC5hZGQoaiwgdG1wVmFsdWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4aXN0c0FzS2V5KFN0cmluZyBzdHIpIHsKLQkJaWYgKGNvbWJvLmluZGV4T2Yoc3RyKSA+PSAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHNBc1ZhbHVlKFN0cmluZyBzdHIpIHsKLQkJaWYgKGxpc3QuaW5kZXhPZihzdHIpID49IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEVuYWJsZWQoKSB7Ci0JCXJldHVybiBjb21iby5nZXRFbmFibGVkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJdGVtKGludCBpbmRleCkgewotCQlyZXR1cm4gY29tYm8uZ2V0SXRlbShpbmRleCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRJdGVtQ291bnQoKSB7Ci0JCXJldHVybiBjb21iby5nZXRJdGVtQ291bnQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWNoZWNrRXJyb3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAoIWxpc3QuZ2V0KGkpLmVxdWFscyh2YWx1ZSkpCi0JCQkJY29udGludWU7Ci0JCQlpbmRleCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoaW5kZXggIT0gLTEpCi0JCQlyZXR1cm4gY29tYm8uZ2V0SXRlbShpbmRleCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TGF5b3V0RGF0YSgpIHsKLQkJcmV0dXJuIGNvbWJvLmdldExheW91dERhdGEoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGVkVmFsdWUoKSB7Ci0JCWNoZWNrRXJyb3IoKTsKLQkJaW50IGluZGV4ID0gZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0VmFsdWUoZ2V0SXRlbShpbmRleCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0JCXJldHVybiBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGNvbWJvLmdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKFN0cmluZyBrZXkpIHsKLQkJaWYgKGtleSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBpbmRleCA9IC0xOwotCQljaGVja0Vycm9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tYm8uZ2V0SXRlbUNvdW50KCk7IGkrKykgewotCQkJaWYgKCFjb21iby5nZXRJdGVtKGkpLmVxdWFscyhrZXkpKQotCQkJCWNvbnRpbnVlOwotCQkJaW5kZXggPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGluZGV4ICE9IC0xKQotCQkJcmV0dXJuIChTdHJpbmcpIGxpc3QuZ2V0KGluZGV4KTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mKFN0cmluZyBzdHIpIHsKLQkJcmV0dXJuIGNvbWJvLmluZGV4T2Yoc3RyKTsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29uc2lzdGVuY3koKSB7Ci0KLQkJaWYgKGxpc3Quc2l6ZSgpID09IGNvbWJvLmdldEl0ZW1Db3VudCgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJY2hlY2tFcnJvcigpOwotCQljb21iby5yZW1vdmUoaW5kZXgpOwotCQlsaXN0LnJlbW92ZShpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBzdHIpIHsKLQkJY2hlY2tFcnJvcigpOwotCQljb21iby5yZW1vdmUoc3RyKTsKLQkJbGlzdC5yZW1vdmUoc3RyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3QoaW50IGluZGV4KSB7Ci0JCWNvbWJvLnNlbGVjdChpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJY29tYm8uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXRGb2N1cygpIHsKLQkJcmV0dXJuIGNvbWJvLnNldEZvY3VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXRlbShpbnQgaW5kZXgsIFN0cmluZyBzdHIpIHsKLQkJY2hlY2tFcnJvcigpOwotCQljb21iby5zZXRJdGVtKGluZGV4LCBzdHIpOwotCQlsaXN0LnJlbW92ZShpbmRleCk7Ci0JCWxpc3QuYWRkKGluZGV4LCBzdHIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEl0ZW0oU3RyaW5nW10gc3RyQXJyYXkpIHsKLQkJY2hlY2tFcnJvcigpOwotCQljb21iby5zZXRJdGVtcyhzdHJBcnJheSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyQXJyYXkubGVuZ3RoOyBpKyspCi0JCQlsaXN0LmFkZChzdHJBcnJheVtpXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dCBsbykgewotCQljb21iby5zZXRMYXlvdXQobG8pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExheW91dERhdGEoT2JqZWN0IGxheW91dERhdGEpIHsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oUG9pbnQgcG9pbnQpIHsKLQkJY29tYm8uc2V0U2VsZWN0aW9uKHBvaW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBzdHIpIHsKLQkJY29tYm8uc2V0VGV4dChzdHIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNvcnRCeUtleShpbnQgb2Zmc2V0KSB7Ci0JCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IHRoaXMuY29tYm8uZ2V0SXRlbUNvdW50KCkgLSAxKQotCQkJcmV0dXJuOwotCQljaGVja0Vycm9yKCk7Ci0JCS8vCi0JCWZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBjb21iby5nZXRJdGVtQ291bnQoKSAtIDE7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgY29tYm8uZ2V0SXRlbUNvdW50KCk7IGorKykgewotCQkJCWlmIChnZXRJdGVtKGkpLmNvbXBhcmVUbyhnZXRJdGVtKGopKSA+IDApIHsKLQkJCQkJZXhjaGFuZ2VQb3NpdGlvbihpLCBqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Db21ib0xpc3RPblByb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NvbWJvTGlzdE9uUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NmM1MTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NvbWJvTGlzdE9uUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFBlb3BsZSBzaG91bGQgbWFuYWdlIHRoZWlyIG93biBjb21iby9saXN0Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21ib0xpc3RPblByb3BlcnR5UGFnZSBleHRlbmRzIENvbWJvTGlzdCB7Ci0KLQotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRBcHBseVZhbHVlOwotCi0JcHVibGljIENvbWJvTGlzdE9uUHJvcGVydHlQYWdlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFwcGx5VmFsdWUoKSB7Ci0JCXJldHVybiBjdXJyZW50QXBwbHlWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRBcHBseVZhbHVlKFN0cmluZyBjdXJyZW50QXBwbHlWYWx1ZSkgewotCQl0aGlzLmN1cnJlbnRBcHBseVZhbHVlID0gY3VycmVudEFwcGx5VmFsdWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Mzc4NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuQ29udGVudFNldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuQ29udGVudFNldHRpbmdzQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLklDb250ZW50U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlCi0gKiAgICAgICAgICAgICBvcgotICogICAgICAgICAgICAgZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLkNTU1dlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZQotICogICAgICAgICAgICAgaW5zdGVhZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJU3RhdHVzIFNUQVRVU19FUlJPUiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuSU5GTywgIkVSUk9SIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGZvciB2YWxpZGF0ZUVkaXQoKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElTdGF0dXMgU1RBVFVTX09LID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5PSywgIk9LIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE1ldGhvZCB2YWxpZGF0ZUVkaXQuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsCi0JICogQHJldHVybiBJU3RhdHVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoSUZpbGUgZmlsZSwgU2hlbGwgY29udGV4dCkgewotCQlpZiAoZmlsZSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuIFNUQVRVU19FUlJPUjsKLQkJaWYgKCEoZmlsZS5pc1JlYWRPbmx5KCkpKQotCQkJcmV0dXJuIFNUQVRVU19PSzsKLQotCQlJUGF0aCBsb2NhdGlvbiA9IGZpbGUuZ2V0TG9jYXRpb24oKTsKLQotCQlmaW5hbCBsb25nIGJlZm9yZU1vZGlmaWVkRnJvbUphdmFJTyA9IChsb2NhdGlvbiAhPSBudWxsKSA/IGxvY2F0aW9uLnRvRmlsZSgpLmxhc3RNb2RpZmllZCgpIDogSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JCWZpbmFsIGxvbmcgYmVmb3JlTW9kaWZpZWRGcm9tSUZpbGUgPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KG5ldyBJRmlsZVtde2ZpbGV9LCBjb250ZXh0KTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIHN0YXR1czsKLQotCQlmaW5hbCBsb25nIGFmdGVyTW9kaWZpZWRGcm9tSmF2YUlPID0gKGxvY2F0aW9uICE9IG51bGwpID8gbG9jYXRpb24udG9GaWxlKCkubGFzdE1vZGlmaWVkKCkgOiBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQkJZmluYWwgbG9uZyBhZnRlck1vZGlmaWVkRnJvbUlGaWxlID0gZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCi0JCWlmIChiZWZvcmVNb2RpZmllZEZyb21KYXZhSU8gIT0gYWZ0ZXJNb2RpZmllZEZyb21KYXZhSU8gfHwgYmVmb3JlTW9kaWZpZWRGcm9tSUZpbGUgIT0gYWZ0ZXJNb2RpZmllZEZyb21JRmlsZSkgewotCQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBtYW5hZ2VyLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZpbGUpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlpZiAoIW1vZGVsLmlzRGlydHkoKSkgewotCQkJCQl0cnkgewotCQkJCQkJZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJcmV0dXJuIFNUQVRVU19FUlJPUjsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKGJlZm9yZU1vZGlmaWVkRnJvbUphdmFJTyAhPSBhZnRlck1vZGlmaWVkRnJvbUphdmFJTykgfHwgKGJlZm9yZU1vZGlmaWVkRnJvbUlGaWxlICE9IGFmdGVyTW9kaWZpZWRGcm9tSUZpbGUpKSB7Ci0JCQkvLyB0aGUgZmlsZSBpcyByZXBsYWNlZC4gTW9kaWZpY2F0aW9uIGNhbm5vdCBiZQotCQkJLy8gYXBwbGllZC4KLQkJCXJldHVybiBTVEFUVVNfRVJST1I7Ci0JCX0KLQkJcmV0dXJuIFNUQVRVU19PSzsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2VbXSBjb21ibzsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBJQ29udGVudFNldHRpbmdzIGNvbnRlbnRTZXR0aW5nczsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIENTU19MQUJFTCA9IFNTRVVJTWVzc2FnZXMuVUlfQ1NTX3Byb2ZpbGVfX18yOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBERVZJQ0VfTEFCRUwgPSBTU0VVSU1lc3NhZ2VzLlVJX1RhcmdldF9EZXZpY2VfX18zOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIERPQ1VNRU5UX0xBQkVMID0gU1NFVUlNZXNzYWdlcy5VSV9EZWZhdWx0X0hUTUxfRE9DVFlQRV9JRF9fXzE7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgaW50IG51bWJlck9mQ29tYm87Ci0JcHJvdGVjdGVkIGludCBudW1Db2xzID0gMTsKLQlwcm90ZWN0ZWQgaW50IG51bVJvd3MgPSAxOwotCXByb3RlY3RlZCBDb21wb3NpdGUgcHJvcGVydHlQYWdlOwotCi0JcHVibGljIENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYW5VcCgpIHsKLQkJLy8gQXJlIFRoZXJlIGFueSB3YXkgdG8gZ3VhcmFudGVlIHRvIGNhbGwgY2xlYW5VcCgpIHRvIHJlLWxvYWQKLQkJLy8gZG93bmxvYWRlZCAuY29udGVudHNldHRpbmdzIGZpbGUKLQkJLy8gYWZ0ZXIgQ29udGVudFNldHRpbmdzLnJlbGVhc2VDYWNoZSgpIGluIENvbnRlbnRTZXR0aW5nU2VsZkhhbmRsZXIKLQkJLy8gY2xhc3MsIHdoaWNoIGlzIGNhbGxlZCBieSByZXNvdXJjZUNoYW5nZUV2ZW50Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2UgY3JlYXRlQ29tYm9Cb3hPZihTdHJpbmcgdGl0bGUpIHsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwcm9wZXJ0eVBhZ2UsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0aXRsZSk7Ci0JCWlmICh0aXRsZSAhPSBudWxsICYmIHRpdGxlLnN0YXJ0c1dpdGgoU1NFVUlNZXNzYWdlcy5VSV9EZWZhdWx0X0hUTUxfRE9DVFlQRV9JRF9fXzEpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJfQotCQlDb21ib0xpc3RPblByb3BlcnR5UGFnZSBjb21ibyA9IG5ldyBDb21ib0xpc3RPblByb3BlcnR5UGFnZShwcm9wZXJ0eVBhZ2UsIFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkvLyBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMsIGludCBudW1Sb3dzKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQkvLyBkYXRhLmhvcml6b250YWxTcGFuPW51bUNvbHVtbnM7Ci0JCS8vIGRhdGEudmVydGljYWxTcGFuPW51bVJvd3M7Ci0KLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJY29udGVudFNldHRpbmdzID0gQ29udGVudFNldHRpbmdzQ3JlYXRvci5jcmVhdGUoKTsKLQotCQlwcm9wZXJ0eVBhZ2UgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCBudW1Db2xzLCBudW1Sb3dzKTsKLQotCQljcmVhdGVTZXR0aW5nc1BhZ2VHVUkoKTsKLQotCQlyZXR1cm4gcHJvcGVydHlQYWdlOwotCi0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVTZXR0aW5nc1BhZ2VHVUkoKTsKLQotCS8vIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFwcGx5U2VsZWN0ZWRQcm9wZXJ0eVZhbHVlKFN0cmluZyBzdHIsaW50Ci0JLy8gaW5kZXgpOwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRlbGV0ZU5vbmVQcm9wZXJ0eShpbnQgaW5kZXgpOwotCi0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSW5pdFZhbHVlQ2hhbmdlZChTdHJpbmcgYmVmb3JlLCBTdHJpbmcgYWZ0ZXIpIHsKLQkJaWYgKGJlZm9yZSA9PSBudWxsICYmIGFmdGVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChiZWZvcmUgIT0gbnVsbCAmJiBiZWZvcmUuZXF1YWxzKGFmdGVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCS8vIHNlbGVjdGVkKGFwcGxpZWQpIGl0ZW0gaXMgcmVzdG9yZWQuCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZDb21ibzsgaSsrKSB7Ci0JCQkvLyBTdHJpbmcgYXBwbGllZFZhbHVlID0gY29tYm9baV0uZ2V0QXBwbHlWYWx1ZSgpOwotCQkJLy8gc2V0U2VsZWN0aW9uSXRlbShjb21ib1tpXSxhcHBsaWVkVmFsdWUpOwotCQkJY29tYm9baV0uc2VsZWN0KDApOyAvLyBzZWxlY3Qgbm9uZS4KLQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCU1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpZiAodmFsaWRhdGVTdGF0ZSgpID09IGZhbHNlKSB7Ci0JCQljbGVhblVwKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mQ29tYm87IGkrKykgewotCQkJLy8gZ2V0IHNlbGVjdGVkIGl0ZW0gaW4gQ29tYm8gYm94LgotCQkJU3RyaW5nIHN0ciA9IGNvbWJvW2ldLmdldFNlbGVjdGVkVmFsdWUoKTsKLQkJCWlmIChzdHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCS8vIGlmIG5vIGNoYW5nZSwgc2tpcCBzZXRQcm9wZXJ0eQotCQkJaWYgKCFpc0luaXRWYWx1ZUNoYW5nZWQoY29tYm9baV0uZ2V0QXBwbHlWYWx1ZSgpLCBzdHIpKQotCQkJCWNvbnRpbnVlOwotCQkJLy8gaWYgTk9ORSBpcyBzZWxlY3RlZCwgZGVsZXRlIGF0dHIgaW5zdGFuY2UgKGFuZCB3cml0ZQotCQkJLy8gLmNvbnRlbnRzZXR0aW5ncy4pCi0JCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID09IDApCi0JCQkJZGVsZXRlTm9uZVByb3BlcnR5KGkpOwotCQkJZWxzZQotCQkJCXB1dFNlbGVjdGVkUHJvcGVydHlJbnRvKHByb3BlcnRpZXMsIHN0ciwgaSk7Ci0JCQkvLyBhcHBseVNlbGVjdGVkUHJvcGVydHlWYWx1ZShzdHIsaSk7Ci0KLQkJCS8vIHNldCBhcHBseSB2YWx1ZSBpbiBDb21ib0xpc3RPblByb3BlcnR5UGFnZS4KLQkJCWNvbWJvW2ldLnNldEFwcGx5VmFsdWUoc3RyKTsKLQkJfQotCQlpZiAocHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKSkKLQkJCWNvbnRlbnRTZXR0aW5ncy5zZXRQcm9wZXJ0aWVzKChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgcHJvcGVydGllcyk7Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpCi0JCQlwcm9wZXJ0aWVzLmNsZWFyKCk7Ci0JCXByb3BlcnRpZXMgPSBudWxsOwotCQlpZiAoIWNvbnRlbnRTZXR0aW5ncy5leGlzdHNQcm9wZXJ0aWVzKChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSkpCi0JCQljb250ZW50U2V0dGluZ3MuZGVsZXRlQWxsUHJvcGVydGllcygoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXRTZWxlY3RlZFByb3BlcnR5SW50byhNYXAgcHJvcGVydGllcywgU3RyaW5nIHN0ciwgaW50IGkpOwotCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZWxlY3Rpb25JdGVtKENvbWJvTGlzdE9uUHJvcGVydHlQYWdlIGNvbWJvLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGNvbWJvLmdldEl0ZW1Db3VudCgpIDw9IDApCi0JCQlyZXR1cm47Ci0JCWNvbWJvLnNldEFwcGx5VmFsdWUodmFsdWUpOwotCQlTdHJpbmcgaXRlbSA9IGNvbWJvLmdldEtleSh2YWx1ZSk7Ci0JCWlmIChpdGVtICE9IG51bGwpCi0JCQljb21iby5zZWxlY3QoY29tYm8uaW5kZXhPZihpdGVtKSk7Ci0JCWVsc2UKLQkJCWNvbWJvLnNlbGVjdCgwKTsKLQotCX0KLQotCS8qCi0JICogVmFsaWRhdGUgRWRpdC4gU2ltaWxhciBmdW5jdGlvbiB3aWxsIGJlIGluIEhUTUxDb21tYW5kLmphdmEKLQkgKiBDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBDU1NBY3Rpb25NYW5hZ2VyLmphdmEKLQkgKiBEZXNpZ25SZWRvQWN0aW9uLmphdmEgRGVzaWduVW5kb0FjdGlvbi5qYXZhCi0JICogSFRNTENvbnZlcnNpb25Qcm9jZXNzb3IuamF2YQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVN0YXRlKCkgewotCi0JCS8vIGdldCBJRmlsZSBvZiAuY29udGVudHNldHRpbmdzCi0JCWZpbmFsIFN0cmluZyBuYW1lID0gQ29udGVudFNldHRpbmdzLmdldENvbnRlbnRTZXR0aW5nc05hbWUoKTsKLQkJZmluYWwgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpOwotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQlJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKG5hbWUpOwotCi0JCWlmIChmaWxlICE9IG51bGwgJiYgIWZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gSXMgdGhpcyByZWFsbHkgT0s/Ci0JCS8vIElmIGZhbHNlIHNob3VsZCBiZSByZXR1cm5lZCwKLQkJLy8gVGhpcyBzdGF0ZW1hbnQgY2FuIGJlIHJlbW92ZWQsCi0JCS8vIHNpbmNlIE1vZGVsTWFuYWdlclV0aWwudmFsaWRhdGVFZGl0KCkKLQkJLy8gcmV0dXJucyBlcnJvciB0byB0aGlzIGNhc2UuCi0KLQkJU2hlbGwgc2hlbGwgPSBnZXRDb250cm9sKCkuZ2V0U2hlbGwoKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUVkaXQoZmlsZSwgc2hlbGwpOwotCQlyZXR1cm4gc3RhdHVzLmlzT0soKSA/IHRydWUgOiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0Fubm90YXRpb25RdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQW5ub3RhdGlvblF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZDE5MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQW5ub3RhdGlvblF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5UZW1wb3JhcnlBbm5vdGF0aW9uOwotCi0vKgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLnJlZ2lzdHJ5Lk1hcmtlclF1ZXJ5Ci0gKi8KLWNsYXNzIEFubm90YXRpb25RdWVyeSB7Ci0JLyoqCi0JICogVGhlIGFubm90YXRpb24gdHlwZSB0YXJnZXR0ZWQgYnkgdGhpcyBxdWVyeS4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHR5cGU7Ci0KLQkvKioKLQkgKiBBIHNvcnRlZCBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIHRhcmdldHRlZCBieSB0aGlzIHF1ZXJ5LiBUaGUgbGlzdCBpcwotCSAqIHNvcnRlZCBmcm9tIGxlYXN0IHRvIGdyZWF0ZXN0IGFjY29yZGluZyB0byA8Y29kZT5TdGluZy5jb21wYXJlPC9jb2RlPgotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gYXR0cmlidXRlczsKLQotCS8qKgotCSAqIENhY2hlZCBoYXNoIGNvZGUgdmFsdWUKLQkgKi8KLQlwcml2YXRlIGludCBoYXNoQ29kZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYW5ub3RhdGlvbiBxdWVyeSB3aXRoIHRoZSBnaXZlbiB0eXBlIGFuZCBhdHRyaWJ1dGVzLgotCSAqIDxwPgotCSAqIFRoZSB0eXBlIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4gVGhlIGF0dHJpYnV0ZXMgbWF5IGJlIGVtcHR5LCBidXQKLQkgKiBub3QgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9ibGVtVHlwZQotCSAqICAgICAgICAgICAgdGhlIHRhcmdldGVkIGFubm90YXRpb24gdHlwZQotCSAqIEBwYXJhbSBtYXJrZXJBdHRyaWJ1dGVzCi0JICogICAgICAgICAgICB0aGUgdGFyZ2V0ZWQgYW5ub3RhdGlvbiBhdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIEFubm90YXRpb25RdWVyeShTdHJpbmcgYW5ub3RhdGlvblR5cGUsIFN0cmluZ1tdIGFubm90YXRpb25BdHRyaWJ1dGVzKSB7Ci0JCWlmIChhbm5vdGF0aW9uQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQl0eXBlID0gYW5ub3RhdGlvblR5cGU7Ci0JCWF0dHJpYnV0ZXMgPSBhbm5vdGF0aW9uQXR0cmlidXRlczsKLQkJY29tcHV0ZUhhc2hDb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgYSBxdWVyeSBhZ2FpbnN0IHRoZSBnaXZlbiBhbm5vdGF0aW9uLgotCSAqIDxwPgotCSAqIFJldHVybnMgYSA8Y29kZT5Bbm5vdGF0aW9uUXVlcnlSZXN1bHQ8L2NvZGU+IGlmIHRoZSBtYXJrZXIgaXMKLQkgKiBhcHByb3ByaWF0ZSBmb3IgdGhpcyBxdWVyeSAoY29ycmVjdCB0eXBlIGFuZCBoYXMgYWxsIG9mIHRoZSBxdWVyeQotCSAqIGF0dHJpYnV0ZXMpLCBvdGhlcndpc2UgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIGFubm90YXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBhbm5vdGF0aW9uIHRvIHBlcmZvcm0gdGhlIHF1ZXJ5IGFnYWluc3QKLQkgKiBAcmV0dXJuIGEgYW5ub3RhdGlvbiBxdWVyeSByZXN1bHQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvblF1ZXJ5UmVzdWx0IHBlcmZvcm1RdWVyeShBbm5vdGF0aW9uIGFubm8pIHsKLQkJaWYgKCEoYW5ubyBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTWFwIGFubm9BdHRyaWJ1dGVzID0gKChUZW1wb3JhcnlBbm5vdGF0aW9uKSBhbm5vKS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCS8qCi0JCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDM2NjAKLQkJICogCi0JCSAqIE1heSBiZSBudWxsIGlmIHRoZSBvcmlnaW5hbCB2YWxpZGF0aW9uIElNZXNzYWdlIGNvbnRhaW5lZCBubwotCQkgKiBhdHRyaWJ1dGVzIG9yIHRoaXMgYW5ub3RhdGlvbiB3YXMgbm90IGJhc2VkIG9uIGEgdmFsaWRhdGlvbgotCQkgKiBJTWVzc2FnZQotCQkgKi8KLQkJaWYgKGFubm9BdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQkvLyBDaGVjayB0eXBlCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcm9ibGVtVHlwZSA9IChTdHJpbmcpIGFubm9BdHRyaWJ1dGVzLmdldCgicHJvYmxlbVR5cGUiKTsgLy8kTk9OLU5MUy0xJDsKLQkJCWlmICghdHlwZS5lcXVhbHMocHJvYmxlbVR5cGUpKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1thdHRyaWJ1dGVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IHZhbHVlID0gYW5ub0F0dHJpYnV0ZXMuZ2V0KGF0dHJpYnV0ZXNbaV0pOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXZhbHVlc1tpXSA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLy8gQ3JlYXRlIGFuZCByZXR1cm4gdGhlIHJlc3VsdAotCQlyZXR1cm4gbmV3IEFubm90YXRpb25RdWVyeVJlc3VsdCh2YWx1ZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gT2JqZWN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoIShvIGluc3RhbmNlb2YgQW5ub3RhdGlvblF1ZXJ5KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlBbm5vdGF0aW9uUXVlcnkgbXEgPSAoQW5ub3RhdGlvblF1ZXJ5KSBvOwotCQlpZiAoISh0eXBlID09IG51bGwgPyBtcS50eXBlID09IG51bGwgOiB0eXBlLmVxdWFscyhtcS50eXBlKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChhdHRyaWJ1dGVzLmxlbmd0aCAhPSBtcS5hdHRyaWJ1dGVzLmxlbmd0aCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIShhdHRyaWJ1dGVzW2ldLmVxdWFscyhtcS5hdHRyaWJ1dGVzW2ldKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIE9iamVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gaGFzaENvZGU7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGhhc2ggY29kZSBmb3IgdGhpcyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wdXRlSGFzaENvZGUoKSB7Ci0JCWhhc2hDb2RlID0gMTk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJaGFzaENvZGUgPSBoYXNoQ29kZSAqIDM3ICsgdHlwZS5oYXNoQ29kZSgpOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQloYXNoQ29kZSA9IGhhc2hDb2RlICogMzcgKyBhdHRyaWJ1dGVzW2ldLmhhc2hDb2RlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXJnZXR0ZWQgbWFya2VyIHR5cGUuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRhcmdldHRlZCBtYXJrZXIgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFyZ2V0dGVkIGF0dHJpYnV0ZXMuIFRoZSBhcnJheSBtYXkgYmUgZW1wdHkuCi0JICogCi0JICogQHJldHVybiB0aGUgdGFyZ2V0dGVkIGF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQW5ub3RhdGlvblF1ZXJ5UmVzdWx0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Bbm5vdGF0aW9uUXVlcnlSZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFkMTY3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Bbm5vdGF0aW9uUXVlcnlSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi0vKgotICogQ29waWVkIGZyb20gcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUucmVnaXN0ci5NYXJrZXJRdWVyeVJlc3VsdAotICovCi1jbGFzcyBBbm5vdGF0aW9uUXVlcnlSZXN1bHQgewotCS8qKgotCSAqIEFuIG9yZGVyZWQgY29sbGVjdGlvbiBvZiBhbm5vdGF0aW9uIGF0dHJpYnV0ZSB2YWx1ZXMuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSB2YWx1ZXM7Ci0KLQkvKioKLQkgKiBDYWNoZWQgaGFzaCBjb2RlIHZhbHVlCi0JICovCi0JcHJpdmF0ZSBpbnQgaGFzaENvZGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFubm90YXRpb24gcXVlcnkgcmVzdWx0IHdpdGggdGhlIGdpdmVuIHZhbHVlcy4KLQkgKiA8cD4KLQkgKiBUaGUgdmFsdWVzIG1heSBub3QgYmUgZW1wdHkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhbm5vdGF0aW9uQXR0cmlidXRlVmFsdWVzCi0JICogICAgICAgICAgICB0aGUgdGFyZ2V0IGFubm90YXRpb24ncyBhdHRyaWJ1dGUgdmFsdWVzCi0JICovCi0JcHVibGljIEFubm90YXRpb25RdWVyeVJlc3VsdChTdHJpbmdbXSBhbm5vdGF0aW9uQXR0cmlidXRlVmFsdWVzKSB7Ci0JCWlmIChhbm5vdGF0aW9uQXR0cmlidXRlVmFsdWVzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQl2YWx1ZXMgPSBhbm5vdGF0aW9uQXR0cmlidXRlVmFsdWVzOwotCQljb21wdXRlSGFzaENvZGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIE9iamVjdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIEFubm90YXRpb25RdWVyeVJlc3VsdCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChvID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJQW5ub3RhdGlvblF1ZXJ5UmVzdWx0IG1xciA9IChBbm5vdGF0aW9uUXVlcnlSZXN1bHQpIG87Ci0JCWlmICh2YWx1ZXMubGVuZ3RoICE9IG1xci52YWx1ZXMubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCEodmFsdWVzW2ldLmVxdWFscyhtcXIudmFsdWVzW2ldKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIE9iamVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gaGFzaENvZGU7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGhhc2ggY29kZSBmb3IgdGhpcyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wdXRlSGFzaENvZGUoKSB7Ci0JCWhhc2hDb2RlID0gMTk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWhhc2hDb2RlID0gaGFzaENvZGUgKiAzNyArIHZhbHVlc1tpXS5oYXNoQ29kZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29tcG91bmRRdWlja0Fzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29tcG91bmRRdWlja0Fzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTQxMGQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvbXBvdW5kUXVpY2tBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5FeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIEEgcXVpY2sgYXNzaXN0IHByb2Nlc3NvciB0aGF0IHdpbGwgYWxsb3cgZm9yIG1vcmUgdGhhbiBvbmUgcXVpY2sgYXNzaXN0Ci0gKiBwcm9jZXNzb3IuIEl0IGluY2x1ZGVzIHF1aWNrIGFzc2lzdCBwcm9jZXNzb3JzIGNvbnRyaWJ1dGVkIHZpYSB0aGUKLSAqIHF1aWNrQXNzaXN0UHJvY2Vzc29yIGV4dGVuZGVkIGNvbmZpZ3VyYXRpb24gZXh0ZW5zaW9uIHBvaW50LiBJdCBhbHNvCi0gKiBpbmNsdWRlcyBxdWljayBhc3Npc3QgcHJvY2Vzc29ycyBjb250cmlidXRlZCB2aWEgdmFsaWRhdG9ycy4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvdW5kUXVpY2tBc3Npc3RQcm9jZXNzb3IgaW1wbGVtZW50cyBJUXVpY2tBc3Npc3RQcm9jZXNzb3IgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFFVSUNLX0FTU0lTVF9QUk9DRVNTT1JfRVhURU5ERURfSUQgPSBJUXVpY2tBc3Npc3RQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpOwotCXByaXZhdGUgTWFwIGZQcm9jZXNzb3JzOwotCXByaXZhdGUgSVF1aWNrQXNzaXN0UHJvY2Vzc29yIGZRdWlja0ZpeFByb2Nlc3NvcjsKLQkvKioKLQkgKiBsaXN0IG9mIHBhcnRpdGlvbiB0eXBlcyB3aGVyZSBleHRlbmRlZCBwcm9jZXNzb3JzIGhhdmUgYmVlbiBpbnN0YWxsZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgZkluc3RhbGxlZEV4dGVuZGVkQ29udGVudFR5cGVzOwotCi0JcHJpdmF0ZSBTZXQgZ2V0UXVpY2tBc3Npc3RQcm9jZXNzb3JzKFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCWlmIChmSW5zdGFsbGVkRXh0ZW5kZWRDb250ZW50VHlwZXMgPT0gbnVsbCB8fCAhZkluc3RhbGxlZEV4dGVuZGVkQ29udGVudFR5cGVzLmNvbnRhaW5zKHBhcnRpdGlvblR5cGUpKSB7Ci0JCQkvLyBnZXQgZXh0ZW5kZWQgcXVpY2sgYXNzaXN0IHByb2Nlc3NvcnMgdGhhdCBoYXZlIG5vdCBhbHJlYWR5Ci0JCQkvLyBiZWVuIHNldAotCQkJTGlzdCBwcm9jZXNzb3JzID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb25zKFFVSUNLX0FTU0lTVF9QUk9DRVNTT1JfRVhURU5ERURfSUQsIHBhcnRpdGlvblR5cGUpOwotCQkJaWYgKHByb2Nlc3NvcnMgIT0gbnVsbCAmJiAhcHJvY2Vzc29ycy5pc0VtcHR5KCkpIHsKLQkJCQlJdGVyYXRvciBpdGVyID0gcHJvY2Vzc29ycy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlJUXVpY2tBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gKElRdWlja0Fzc2lzdFByb2Nlc3NvcikgaXRlci5uZXh0KCk7Ci0JCQkJCXNldFF1aWNrQXNzaXN0UHJvY2Vzc29yKHBhcnRpdGlvblR5cGUsIHByb2Nlc3Nvcik7Ci0JCQkJfQotCQkJfQotCQkJLy8gYWRkIHBhcnRpdGlvbiB0eXBlIHRvIGxpc3Qgb2YgZXh0ZW5kZWQgcGFydGl0aW9uIHR5cGVzCi0JCQkvLyBpbnN0YWxsZWQgKHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgYW55IGV4dGVuZGVkIGNvbnRlbnQKLQkJCS8vIGFzc2lzdCBwcm9jZXNzb3JzIHdlcmUgaW5zdGFsbGVkIGJlY2F1c2UgZG9udCB3YW50IHRvIGxvb2sgaXQKLQkJCS8vIHVwIGV2ZXJ5IHRpbWUpCi0JCQlpZiAoZkluc3RhbGxlZEV4dGVuZGVkQ29udGVudFR5cGVzID09IG51bGwpCi0JCQkJZkluc3RhbGxlZEV4dGVuZGVkQ29udGVudFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZkluc3RhbGxlZEV4dGVuZGVkQ29udGVudFR5cGVzLmFkZChwYXJ0aXRpb25UeXBlKTsKLQkJfQotCi0JCVNldCBwcm9jZXNzb3JzID0gbnVsbDsKLQkJaWYgKGZQcm9jZXNzb3JzICE9IG51bGwpCi0JCQlwcm9jZXNzb3JzID0gKFNldCkgZlByb2Nlc3NvcnMuZ2V0KHBhcnRpdGlvblR5cGUpOwotCi0JCXJldHVybiBwcm9jZXNzb3JzOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBxdWljayBhc3Npc3QgcHJvY2Vzc29ycyByZWxldmFudCB0byB0aGUgcGFydGlvbiB3aGljaCBpcwotCSAqIGNhbGN1YXRlZCBmcm9tIHRoZSBnaXZlbiBkb2N1bWVudCBhbmQgb2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSBpbnZvY2F0aW9uQ29udGV4dAotCSAqIEByZXR1cm4gU2V0IG9mIHF1aWNrIGFzc2lzdCBwcm9jZXNzb3JzIG9yIG51bGwgaWYgbm9uZSBleGlzdAotCSAqLwotCXByaXZhdGUgU2V0IGdldFF1aWNrQXNzaXN0UHJvY2Vzc29ycyhJUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCkgewotCQlTZXQgcHJvY2Vzc3NvcnMgPSBudWxsOwotCi0JCUlTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyID0gaW52b2NhdGlvbkNvbnRleHQuZ2V0U291cmNlVmlld2VyKCk7Ci0JCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gc291cmNlVmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBwYXJ0aXRpb25UeXBlOwotCQkJCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJCQlwYXJ0aXRpb25UeXBlID0gVGV4dFV0aWxpdGllcy5nZXRDb250ZW50VHlwZShkb2N1bWVudCwgSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORywgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCksIHRydWUpOwotCQkJCWVsc2UKLQkJCQkJcGFydGl0aW9uVHlwZSA9IElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRTsKLQotCQkJCXByb2Nlc3Nzb3JzID0gZ2V0UXVpY2tBc3Npc3RQcm9jZXNzb3JzKHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCB4LmdldE1lc3NhZ2UoKSwgeCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc3NvcnM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcXVpY2sgYXNzaXN0IHByb2Nlc3NvciBmb3IgdmFsaWRhdG9yIGNvbnRyaWJ1dGVkIHF1aWNrIGZpeGVzCi0JICogCi0JICogQHJldHVybiBJUXVpY2tBc3Npc3RQcm9jZXNzb3IKLQkgKi8KLQlwcml2YXRlIElRdWlja0Fzc2lzdFByb2Nlc3NvciBnZXRRdWlja0ZpeFByb2Nlc3NvcigpIHsKLQkJaWYgKGZRdWlja0ZpeFByb2Nlc3NvciA9PSBudWxsKQotCQkJZlF1aWNrRml4UHJvY2Vzc29yID0gbmV3IFNvdXJjZVZhbGlkYXRpb25RdWlja0Fzc2lzdFByb2Nlc3NvcigpOwotCi0JCXJldHVybiBmUXVpY2tGaXhQcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQXNzb2NpYXRlcyBhIHF1aWNrIGFzc2lzdCBwcm9jZXNzb3IgdG8gYSBwYXJ0aXRpb24gdHlwZSBhbmQgYWRkcyBpdCB0bwotCSAqIHRoZSBsaXN0IG9mIHByb2Nlc3NvcnMgaW4gdGhpcyBjb21wb3VuZCBwcm9jZXNzb3IuCi0JICogCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKiBAcGFyYW0gcHJvY2Vzc29yCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFF1aWNrQXNzaXN0UHJvY2Vzc29yKFN0cmluZyBwYXJ0aXRpb25UeXBlLCBJUXVpY2tBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0JCWlmIChmUHJvY2Vzc29ycyA9PSBudWxsKQotCQkJZlByb2Nlc3NvcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCVNldCBwcm9jZXNzb3JzID0gKFNldCkgZlByb2Nlc3NvcnMuZ2V0KHBhcnRpdGlvblR5cGUpOwotCi0JCWlmIChwcm9jZXNzb3IgPT0gbnVsbCAmJiBwcm9jZXNzb3JzICE9IG51bGwpIHsKLQkJCS8vIHJlbW92aW5nIHF1aWNrIGFzc2lzdCBwcm9jZXNzb3IgZm9yIHRoaXMgcGFydGl0aW9uIHR5cGUKLQkJCXByb2Nlc3NvcnMuY2xlYXIoKTsKLQkJCS8vIGNoZWNrIGlmIGl0J3MgdGhlIG9ubHkKLQkJCWZQcm9jZXNzb3JzLnJlbW92ZShwYXJ0aXRpb25UeXBlKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChwcm9jZXNzb3JzID09IG51bGwpIHsKLQkJCQlwcm9jZXNzb3JzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLQkJCX0KLQkJCXByb2Nlc3NvcnMuYWRkKHByb2Nlc3Nvcik7Ci0JCQlmUHJvY2Vzc29ycy5wdXQocGFydGl0aW9uVHlwZSwgcHJvY2Vzc29ycyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5Bc3Npc3QoSVF1aWNrQXNzaXN0SW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQpIHsKLQkJU2V0IHByb2Nlc3NvcnMgPSBnZXRRdWlja0Fzc2lzdFByb2Nlc3NvcnMoaW52b2NhdGlvbkNvbnRleHQpOwotCQlpZiAocHJvY2Vzc29ycyAhPSBudWxsKSB7Ci0JCQkvLyBpdGVyYXRlIHRocm91Z2ggbGlzdCBvZiBwcm9jZXNzb3JzIHVudGlsIG9uZSBwcm9jZXNzb3Igc2F5cwotCQkJLy8gY2FuQXNzaXN0Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvY2Vzc29ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSVF1aWNrQXNzaXN0UHJvY2Vzc29yIHAgPSAoSVF1aWNrQXNzaXN0UHJvY2Vzc29yKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHAuY2FuQXNzaXN0KGludm9jYXRpb25Db250ZXh0KSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpeChBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJLy8gb25seSBxdWljayBmaXggcHJvY2Vzc29yIGNvbnRyaWJ1dGVzIGZpeGVzIHNvIGp1c3QgY2hlY2sgaXQKLQkJSVF1aWNrQXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IGdldFF1aWNrRml4UHJvY2Vzc29yKCk7Ci0JCXJldHVybiBwcm9jZXNzb3IuY2FuRml4KGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZVF1aWNrQXNzaXN0UHJvcG9zYWxzKElRdWlja0Fzc2lzdEludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0KSB7Ci0JCUxpc3QgcHJvcG9zYWxzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBmaXJzdCBnZXQgbGlzdCBvZiBmaXhlcwotCQlJUXVpY2tBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gZ2V0UXVpY2tGaXhQcm9jZXNzb3IoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IHByb2Nlc3Nvci5jb21wdXRlUXVpY2tBc3Npc3RQcm9wb3NhbHMoaW52b2NhdGlvbkNvbnRleHQpOwotCQlpZiAocHJvcG9zYWxzICE9IG51bGwgJiYgcHJvcG9zYWxzLmxlbmd0aCA+IDApIHsKLQkJCXByb3Bvc2Fsc0xpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QocHJvcG9zYWxzKSk7Ci0JCX0KLQotCQkvLyBubyBmaXhlcywgc28gdHJ5IGFkZGluZyBhc3Npc3RzCi0JCWlmIChwcm9wb3NhbHNMaXN0LmlzRW1wdHkoKSkgewotCQkJU2V0IHByb2Nlc3NvcnMgPSBnZXRRdWlja0Fzc2lzdFByb2Nlc3NvcnMoaW52b2NhdGlvbkNvbnRleHQpOwotCQkJaWYgKHByb2Nlc3NvcnMgIT0gbnVsbCkgewotCQkJCS8vIGl0ZXJhdGUgdGhyb3VnaCBsaXN0IG9mIHByb2Nlc3NvcnMgdW50aWwgb25lIHByb2Nlc3NvciBzYXlzCi0JCQkJLy8gY2FuQXNzaXN0Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IHByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlJUXVpY2tBc3Npc3RQcm9jZXNzb3IgYXNzaXN0UHJvY2Vzc29yID0gKElRdWlja0Fzc2lzdFByb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gYXNzaXN0UHJvcG9zYWxzID0gYXNzaXN0UHJvY2Vzc29yLmNvbXB1dGVRdWlja0Fzc2lzdFByb3Bvc2FscyhpbnZvY2F0aW9uQ29udGV4dCk7Ci0JCQkJCWlmIChhc3Npc3RQcm9wb3NhbHMgIT0gbnVsbCAmJiBhc3Npc3RQcm9wb3NhbHMubGVuZ3RoID4gMCkgewotCQkJCQkJcHJvcG9zYWxzTGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChhc3Npc3RQcm9wb3NhbHMpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEphdmEgZWRpdG9yIGN1cnJlbnRseSByZXR1cm5zIGEgbm8gbW9kaWZpY2F0aW9uIGNvbXBsZXRpb24gcHJvcG9zYWwKLQkJICogYnV0IGl0IHNlZW1zIGJldHRlciB0byBqdXN0IHJldHVybiBudWxsIHNvIHVzZXIgZG9lcyBub3QgZ2V0Ci0JCSAqIGFubm95aW5nIHByb3Bvc2FsIHBvcHVwCi0JCSAqLwotCQlpZiAocHJvcG9zYWxzTGlzdC5pc0VtcHR5KCkpIHsKLQkJCS8vIHByb3Bvc2Fsc0xpc3QuYWRkKG5ldyBOb01vZGlmaWNhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbCgpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIHByb3Bvc2Fsc0xpc3QudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHNMaXN0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQkvLyBuZXZlciBoYXZlIGVycm9yIG1lc3NhZ2VzCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29udHJpYnV0ZWRQcm9jZXNzb3JEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db250cmlidXRlZFByb2Nlc3NvckRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTcyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db250cmlidXRlZFByb2Nlc3NvckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBzaW5jZSAyLjAgUkMwIFVzZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb250cmlidXRlZFByb2Nlc3NvckRlc2NyaXB0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZDb25maWd1cmF0aW9uRWxlbWVudDsKLQlwcml2YXRlIE9iamVjdCBmUHJvY2Vzc29ySW5zdGFuY2U7Ci0KLQlwdWJsaWMgQ29udHJpYnV0ZWRQcm9jZXNzb3JEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWZDb25maWd1cmF0aW9uRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWZQcm9jZXNzb3JJbnN0YW5jZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9jZXNzb3IoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmUHJvY2Vzc29ySW5zdGFuY2UgPT0gbnVsbCAmJiBmQ29uZmlndXJhdGlvbkVsZW1lbnQgIT0gbnVsbCkgewotCQkJZlByb2Nlc3Nvckluc3RhbmNlID0gZkNvbmZpZ3VyYXRpb25FbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQ0xBU1MpOwotCQl9Ci0JCXJldHVybiBmUHJvY2Vzc29ySW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA0NDkzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgYXBwcm9wcmlhdGUgY29ycmVjdGlvbiBhc3Npc3RhbnQgZm9yIGEgZ2l2ZW4gc291cmNlIHZpZXdlci4KLSAqIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgYSBwbGFjZWhvbGRlciB1bnRpbCB0aGUgYmFzZSBpbXBsZW1lbnRzIGEgY29tbW9uCi0gKiB3YXkgZm9yIHF1aWNrZml4L3F1aWNrIGFzc2lzdC4KLSAqIAotICogQGRlcHJlY2F0ZWQgc2luY2UgMi4wIFJDMCBVc2UKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucXVpY2thc3Npc3QuSVF1aWNrQXNzaXN0UHJvY2Vzc29yOwotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb3JyZWN0aW9uIGFzc2lzdGFudCBmb3IgdGhlIGdpdmVuIHNvdXJjZXZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogQHJldHVybgotCSAqLwotCWFic3RyYWN0IHB1YmxpYyBJQ29udGVudEFzc2lzdGFudCBnZXRDb3JyZWN0aW9uQXNzaXN0YW50KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0lRdWlja0Fzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vSVF1aWNrQXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjAyMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vSVF1aWNrQXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBzaW5jZSAyLjAgUkMwIFVzZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVF1aWNrQXNzaXN0UHJvY2Vzc29yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb2Nlc3NvciBjYW4gYXNzaXN0IGF0IHRoZSBnaXZlbiBvZmZzZXQuIFRoaXMgdGVzdAotCSAqIHNob3VsZCBiZSBhbiBvcHRpbWlzdGljIGd1ZXNzIGFuZCBiZSBleHRyZW1seSBjaGVhcC4KLQkgKi8KLQlib29sZWFuIGNhbkFzc2lzdChTdHJ1Y3R1cmVkVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogQ29sbGVjdHMgcHJvcG9zYWxzIGZvciBhc3Npc3RhbnQgYXQgdGhlIGdpdmVuIG9mZnNldC4KLQkgKi8KLQlJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0UHJvcG9zYWxzKFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9JUXVpY2tGaXhQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0lRdWlja0ZpeFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTNkMjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0lRdWlja0ZpeFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHNpbmNlIDIuMCBSQzAgVXNlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLSAqLwotcHVibGljIGludGVyZmFjZSBJUXVpY2tGaXhQcm9jZXNzb3IgewotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvY2Vzc29yIGNhbiBmaXggdGhlIGdpdmVuIHByb2JsZW0uIFRoaXMgdGVzdAotCSAqIHNob3VsZCBiZSBhbiBvcHRpbWlzdGljIGd1ZXNzIGFuZCBiZSBleHRyZW1seSBjaGVhcC4KLQkgKi8KLQlib29sZWFuIGNhbkZpeChBbm5vdGF0aW9uIGFubm5vdGF0aW9uKTsKLQotCS8qKgotCSAqIENvbGxlY3RzIHByb3Bvc2FscyBmb3IgZml4aW5nIHRoZSBnaXZlbiBwcm9ibGVtLgotCSAqLwotCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRQcm9wb3NhbHMoQW5ub3RhdGlvbiBhbm5ub3RhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Ob01vZGlmaWNhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vTm9Nb2RpZmljYXRpb25Db21wbGV0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFiYjFhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Ob01vZGlmaWNhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgTm9Nb2RpZmljYXRpb25Db21wbGV0aW9uUHJvcG9zYWwgaW1wbGVtZW50cyBJQ29tcGxldGlvblByb3Bvc2FsIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0Q29udGV4dEluZm9ybWF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbiBnZXRDb250ZXh0SW5mb3JtYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0RGlzcGxheVN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5Ob01vZGlmaWNhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbF8wOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1F1aWNrRml4UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1F1aWNrRml4UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlMTk2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9RdWlja0ZpeFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLXB1YmxpYyBjbGFzcyBRdWlja0ZpeFJlZ2lzdHJ5IHsKLQlwcml2YXRlIHN0YXRpYyBRdWlja0ZpeFJlZ2lzdHJ5IGluc3RhbmNlOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgUXVpY2tGaXhSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IFF1aWNrRml4UmVnaXN0cnkoKTsKLQkJCW5ldyBRdWlja0ZpeFJlZ2lzdHJ5UmVhZGVyKCkuYWRkSGVscChpbnN0YW5jZSk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFRhYmxlIG9mIHF1ZXJpZXMgZm9yIG1hcmtlciByZXNvbHV0aW9ucwotCSAqLwotCXByaXZhdGUgTWFwIHJlc29sdXRpb25RdWVyaWVzID0gbmV3IEhhc2hNYXAoKTsKLQkvKioKLQkgKiBSZXNvbHV0aW9uIGNsYXNzIGF0dHJpYnV0ZSBuYW1lIGluIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBZGRzIGEgcmVzb2x1dGlvbiBxdWVyeSB0byB0aGUgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIHF1ZXJ5Ci0JICogICAgICAgICAgICBhIG1hcmtlciBxdWVyeQotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiAgICAgICAgICAgIGEgcmVzdWx0IGZvciB0aGUgZ2l2ZW4gcXVlcnkKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBkZWZpbmluZyB0aGUgcmVzdWx0Ci0JICovCi0Jdm9pZCBhZGRSZXNvbHV0aW9uUXVlcnkoQW5ub3RhdGlvblF1ZXJ5IHF1ZXJ5LCBBbm5vdGF0aW9uUXVlcnlSZXN1bHQgcmVzdWx0LCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlhZGRRdWVyeShyZXNvbHV0aW9uUXVlcmllcywgcXVlcnksIHJlc3VsdCwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHF1ZXJ5IHRvIHRoZSBnaXZlbiB0YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSB0YWJsZSB0byB3aGljaCB0aGUgcXVlcnkgaXMgYWRkZWQKLQkgKiBAcGFyYW0gcXVlcnkKLQkgKiAgICAgICAgICAgIGEgbWFya2VyIHF1ZXJ5Ci0JICogQHBhcmFtIHJlc3VsdAotCSAqICAgICAgICAgICAgYSByZXN1bHQgZm9yIHRoZSBnaXZlbiBxdWVyeQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGRlZmluaW5nIHRoZSByZXN1bHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUXVlcnkoTWFwIHRhYmxlLCBBbm5vdGF0aW9uUXVlcnkgcXVlcnksIEFubm90YXRpb25RdWVyeVJlc3VsdCByZXN1bHQsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0KLQkJLy8gU2VlIGlmIHRoZSBxdWVyeSBpcyBhbHJlYWR5IGluIHRoZSB0YWJsZQotCQlNYXAgcmVzdWx0cyA9IChNYXApIHRhYmxlLmdldChxdWVyeSk7Ci0JCWlmIChyZXN1bHRzID09IG51bGwpIHsKLQkJCS8vIENyZWF0ZSBhIG5ldyByZXN1bHRzIHRhYmxlCi0JCQlyZXN1bHRzID0gbmV3IEhhc2hNYXAoKTsKLQotCQkJLy8gQWRkIHRoZSBxdWVyeSB0byB0aGUgdGFibGUKLQkJCXRhYmxlLnB1dChxdWVyeSwgcmVzdWx0cyk7Ci0JCX0KLQotCQlpZiAocmVzdWx0cy5jb250YWluc0tleShyZXN1bHQpKSB7Ci0JCQlDb2xsZWN0aW9uIGN1cnJlbnRFbGVtZW50cyA9IChDb2xsZWN0aW9uKSByZXN1bHRzLmdldChyZXN1bHQpOwotCQkJY3VycmVudEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCUNvbGxlY3Rpb24gZWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCi0JCQkvLyBBZGQgdGhlIG5ldyByZXN1bHQKLQkJCXJlc3VsdHMucHV0KHJlc3VsdCwgZWxlbWVudHMpOwotCQl9Ci0JfQotCi0JcHVibGljIElRdWlja0Fzc2lzdFByb2Nlc3NvcltdIGdldFF1aWNrRml4UHJvY2Vzc29ycyhBbm5vdGF0aW9uIGFubm8pIHsKLQkJLy8gQ29sbGVjdCBhbGwgbWF0Y2hlcwotCQlMaXN0IHByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc29sdXRpb25RdWVyaWVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQW5ub3RhdGlvblF1ZXJ5IHF1ZXJ5ID0gKEFubm90YXRpb25RdWVyeSkgaXRlci5uZXh0KCk7Ci0JCQlBbm5vdGF0aW9uUXVlcnlSZXN1bHQgcmVzdWx0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJLyogQW5ub3RhdGlvblF1ZXJ5IG9iamVjdHMgYXJlIGNvbnRyaWJ1dGVkIGJ5IGV4dGVuc2lvbiBwb2ludCAqLwotCQkJCXJlc3VsdCA9IHF1ZXJ5LnBlcmZvcm1RdWVyeShhbm5vKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQkvLyBTZWUgaWYgYSBtYXRjaGluZyByZXN1bHQgaXMgcmVnaXN0ZXJlZAotCQkJCU1hcCByZXN1bHRzVGFibGUgPSAoTWFwKSByZXNvbHV0aW9uUXVlcmllcy5nZXQocXVlcnkpOwotCi0JCQkJaWYgKHJlc3VsdHNUYWJsZS5jb250YWluc0tleShyZXN1bHQpKSB7Ci0KLQkJCQkJSXRlcmF0b3IgZWxlbWVudHMgPSAoKENvbGxlY3Rpb24pIHJlc3VsdHNUYWJsZS5nZXQocmVzdWx0KSkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGVsZW1lbnRzLmhhc05leHQoKSkgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBlbGVtZW50cy5uZXh0KCk7Ci0KLQkJCQkJCUlRdWlja0Fzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwcm9jZXNzb3IgPSAoSVF1aWNrQXNzaXN0UHJvY2Vzc29yKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJCWlmIChwcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJCQkJCXByb2Nlc3NvcnMuYWRkKHByb2Nlc3Nvcik7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKElRdWlja0Fzc2lzdFByb2Nlc3NvcltdKSBwcm9jZXNzb3JzLnRvQXJyYXkobmV3IElRdWlja0Fzc2lzdFByb2Nlc3Nvcltwcm9jZXNzb3JzLnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1F1aWNrRml4UmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1F1aWNrRml4UmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0MWJkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9RdWlja0ZpeFJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uUmVnaXN0cnlSZWFkZXI7Ci0KLXB1YmxpYyBjbGFzcyBRdWlja0ZpeFJlZ2lzdHJ5UmVhZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUlDS0ZJWFBST0NFU1NPUiA9ICJxdWlja0ZpeFByb2Nlc3NvciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BST0JMRU1UWVBFID0gInByb2JsZW1UeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURSA9ICJhdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9WQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQXJyYXlMaXN0IGN1cnJlbnRBdHRyaWJ1dGVOYW1lczsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGN1cnJlbnRBdHRyaWJ1dGVWYWx1ZXM7Ci0KLQlwcml2YXRlIFF1aWNrRml4UmVnaXN0cnkgcXVpY2tGaXhQcm9jZXNzb3JSZWdpc3RyeTsKLQotCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoUVVJQ0tGSVhQUk9DRVNTT1IpKSB7Ci0JCQlyZWFkUXVpY2tGaXhQcm9jZXNzb3JFbGVtZW50KGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhBVFRSSUJVVEUpKSB7Ci0JCQlyZWFkQXR0cmlidXRlRWxlbWVudChlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzZXMgYSByZXNvbHV0aW9uIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVhZFF1aWNrRml4UHJvY2Vzc29yRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkvLyByZWFkIHR5cGUKLQkJU3RyaW5nIHR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFJPQkxFTVRZUEUpOwotCi0JCS8vIHJlYWQgYXR0cmlidXRlcyBhbmQgdmFsdWVzCi0JCWN1cnJlbnRBdHRyaWJ1dGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY3VycmVudEF0dHJpYnV0ZVZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVhZEVsZW1lbnRDaGlsZHJlbihlbGVtZW50KTsKLQkJU3RyaW5nW10gYXR0cmlidXRlTmFtZXMgPSAoU3RyaW5nW10pIGN1cnJlbnRBdHRyaWJ1dGVOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbY3VycmVudEF0dHJpYnV0ZU5hbWVzLnNpemUoKV0pOwotCQlTdHJpbmdbXSBhdHRyaWJ1dGVWYWx1ZXMgPSAoU3RyaW5nW10pIGN1cnJlbnRBdHRyaWJ1dGVWYWx1ZXMudG9BcnJheShuZXcgU3RyaW5nW2N1cnJlbnRBdHRyaWJ1dGVWYWx1ZXMuc2l6ZSgpXSk7Ci0KLQkJLy8gYWRkIHF1ZXJ5IHRvIHRoZSByZWdpc3RyeQotCQlBbm5vdGF0aW9uUXVlcnkgcXVlcnkgPSBuZXcgQW5ub3RhdGlvblF1ZXJ5KHR5cGUsIGF0dHJpYnV0ZU5hbWVzKTsKLQkJQW5ub3RhdGlvblF1ZXJ5UmVzdWx0IHJlc3VsdCA9IG5ldyBBbm5vdGF0aW9uUXVlcnlSZXN1bHQoYXR0cmlidXRlVmFsdWVzKTsKLQkJcXVpY2tGaXhQcm9jZXNzb3JSZWdpc3RyeS5hZGRSZXNvbHV0aW9uUXVlcnkocXVlcnksIHJlc3VsdCwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBtYXJrZXIgaGVscCB0aGF0IGlzIGRlZmluZWQgaW4gdGhlIHBsdWdpbiByZWdpc3RyeSBhbmQgYWRkIGl0Ci0JICogdG8gdGhlIGdpdmVuIG1hcmtlciBoZWxwIHJlZ2lzdHJ5LgotCSAqIDxwPgotCSAqIFdhcm5pbmc6IFRoZSBtYXJrZXIgaGVscCByZWdpc3RyeSBtdXN0IGJlIHBhc3NlZCBpbiBiZWNhdXNlIHRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGR1cmluZyB0aGUgcHJvY2VzcyBvZiBzZXR0aW5nIHVwIHRoZSBtYXJrZXIgaGVscCByZWdpc3RyeSBhbmQKLQkgKiBhdCB0aGlzIHRpbWUgaXQgaGFzIG5vdCBiZWVuIHNhZmVseSBzZXR1cCB3aXRoIHRoZSBwbHVnaW4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEhlbHAoUXVpY2tGaXhSZWdpc3RyeSByZWdpc3RyeSkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlxdWlja0ZpeFByb2Nlc3NvclJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCXJlYWRSZWdpc3RyeShleHRlbnNpb25SZWdpc3RyeSwgU1NFVUlQbHVnaW4uSUQsIFFVSUNLRklYUFJPQ0VTU09SKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzZXMgYW4gYXR0cmlidXRlIHN1YiBlbGVtZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCByZWFkQXR0cmlidXRlRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FKTsKLQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1ZBTFVFKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7Ci0JCQljdXJyZW50QXR0cmlidXRlTmFtZXMuYWRkKG5hbWUpOwotCQkJY3VycmVudEF0dHJpYnV0ZVZhbHVlcy5hZGQodmFsdWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vU291cmNlVmFsaWRhdGlvblF1aWNrQXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Tb3VyY2VWYWxpZGF0aW9uUXVpY2tBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzM2ZkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Tb3VyY2VWYWxpZGF0aW9uUXVpY2tBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0ZpeGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5UZW1wb3JhcnlBbm5vdGF0aW9uOwotCi0vKioKLSAqIFRoaXMgcXVpY2sgYXNzaXN0IHByb2Nlc3NvciB3aWxsIHByb3ZpZGUgcXVpY2sgZml4ZXMgZm9yIHNvdXJjZSB2YWxpZGF0aW9uCi0gKiBlcnJvcnMgKFRlbXBvcmFyeSBBbm5vdGF0aW9uKQotICovCi1wdWJsaWMgY2xhc3MgU291cmNlVmFsaWRhdGlvblF1aWNrQXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSVF1aWNrQXNzaXN0UHJvY2Vzc29yIHsKLQlwdWJsaWMgYm9vbGVhbiBjYW5Bc3Npc3QoSVF1aWNrQXNzaXN0SW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpeChBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBJUXVpY2tGaXhhYmxlQW5ub3RhdGlvbikgewotCQkJaWYgKCgoSVF1aWNrRml4YWJsZUFubm90YXRpb24pIGFubm90YXRpb24pLmlzUXVpY2tGaXhhYmxlU3RhdGVTZXQoKSkgewotCQkJCXJldHVybiAoKElRdWlja0ZpeGFibGVBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKS5pc1F1aWNrRml4YWJsZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVRdWlja0Fzc2lzdFByb3Bvc2FscyhJUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBxdWlja0Fzc2lzdENvbnRleHQpIHsKLQkJSVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBxdWlja0Fzc2lzdENvbnRleHQuZ2V0U291cmNlVmlld2VyKCk7Ci0JCWludCBkb2N1bWVudE9mZnNldCA9IHF1aWNrQXNzaXN0Q29udGV4dC5nZXRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IHZpZXdlciAhPSBudWxsID8gdmlld2VyLmdldFNlbGVjdGVkUmFuZ2UoKS55IDogMDsKLQotCQlJQW5ub3RhdGlvbk1vZGVsIG1vZGVsID0gdmlld2VyLmdldEFubm90YXRpb25Nb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUxpc3QgYWxsUHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uMikgewotCQkJSXRlcmF0b3IgaXRlciA9ICgoSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbjIpIG1vZGVsKS5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoZG9jdW1lbnRPZmZzZXQsIGxlbmd0aCwgdHJ1ZSwgdHJ1ZSk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlMaXN0IHByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJQW5ub3RhdGlvbiBhbm5vID0gKEFubm90YXRpb24pIGl0ZXIubmV4dCgpOwotCQkJCWlmIChjYW5GaXgoYW5ubykpIHsKLQkJCQkJLy8gZmlyc3QgY2hlY2sgdG8gc2VlIGlmIGFubm90YXRpb24gYWxyZWFkeSBoYXMgYSBxdWljawotCQkJCQkvLyBmaXggcHJvY2Vzc29yIGF0dGFjaGVkIHRvIGl0Ci0JCQkJCWlmIChhbm5vIGluc3RhbmNlb2YgVGVtcG9yYXJ5QW5ub3RhdGlvbikgewotCQkJCQkJT2JqZWN0IG8gPSAoKFRlbXBvcmFyeUFubm90YXRpb24pIGFubm8pLmdldEFkZGl0aW9uYWxGaXhJbmZvKCk7Ci0JCQkJCQlpZiAobyBpbnN0YW5jZW9mIElRdWlja0Fzc2lzdFByb2Nlc3NvcikgewotCQkJCQkJCXByb2Nlc3NvcnMuYWRkKG8pOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gZ2V0IGFsbCByZWxldmFudCBxdWljayBmaXhlcyBmb3IgdGhpcyBhbm5vdGF0aW9uCi0JCQkJCVF1aWNrRml4UmVnaXN0cnkgcmVnaXN0cnkgPSBRdWlja0ZpeFJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCQkJCXByb2Nlc3NvcnMuYWRkQWxsKEFycmF5cy5hc0xpc3QocmVnaXN0cnkuZ2V0UXVpY2tGaXhQcm9jZXNzb3JzKGFubm8pKSk7Ci0KLQkJCQkJLy8gc2V0IHVwIGNvbnRleHQKLQkJCQkJTWFwIGF0dHJpYnV0ZXMgPSBudWxsOwotCQkJCQlpZiAoYW5ubyBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pIHsKLQkJCQkJCWF0dHJpYnV0ZXMgPSAoKFRlbXBvcmFyeUFubm90YXRpb24pIGFubm8pLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJfQotCQkJCQlQb3NpdGlvbiBwb3MgPSBtb2RlbC5nZXRQb3NpdGlvbihhbm5vKTsKLQkJCQkJU3RydWN0dXJlZFRleHRJbnZvY2F0aW9uQ29udGV4dCBzc2VDb250ZXh0ID0gbmV3IFN0cnVjdHVyZWRUZXh0SW52b2NhdGlvbkNvbnRleHQodmlld2VyLCBwb3MuZ2V0T2Zmc2V0KCksIHBvcy5nZXRMZW5ndGgoKSwgYXR0cmlidXRlcyk7Ci0KLQkJCQkJLy8gY2FsbCBlYWNoIHByb2Nlc3NvcgotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2Nlc3NvcnMuc2l6ZSgpOyArK2kpIHsKLQkJCQkJCUxpc3QgcHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJY29sbGVjdFByb3Bvc2FscygoSVF1aWNrQXNzaXN0UHJvY2Vzc29yKSBwcm9jZXNzb3JzLmdldChpKSwgYW5ubywgc3NlQ29udGV4dCwgcHJvcG9zYWxzKTsKLQotCQkJCQkJaWYgKHByb3Bvc2Fscy5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJYWxsUHJvcG9zYWxzLmFkZEFsbChwcm9wb3NhbHMpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYWxsUHJvcG9zYWxzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBhbGxQcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFthbGxQcm9wb3NhbHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RQcm9wb3NhbHMoSVF1aWNrQXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBJUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCwgTGlzdCBwcm9wb3NhbHNMaXN0KSB7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuY29tcHV0ZVF1aWNrQXNzaXN0UHJvcG9zYWxzKGludm9jYXRpb25Db250ZXh0KTsKLQkJaWYgKHByb3Bvc2FscyAhPSBudWxsICYmIHByb3Bvc2Fscy5sZW5ndGggPiAwKSB7Ci0JCQlwcm9wb3NhbHNMaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KHByb3Bvc2FscykpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9TdHJ1Y3R1cmVkQ29ycmVjdGlvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vU3RydWN0dXJlZENvcnJlY3Rpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5NDI3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9TdHJ1Y3R1cmVkQ29ycmVjdGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBzaW5jZSAyLjAgUkMwIFVzZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQ29ycmVjdGlvblByb2Nlc3NvciBpbXBsZW1lbnRzIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQlwcm90ZWN0ZWQgSUFubm90YXRpb25Nb2RlbCBmQW5ub3RhdGlvbk1vZGVsOwotCXByb3RlY3RlZCBJUXVpY2tBc3Npc3RQcm9jZXNzb3IgZlF1aWNrQXNzaXN0UHJvY2Vzc29yOwotCXByb3RlY3RlZCBJUXVpY2tGaXhQcm9jZXNzb3IgZlF1aWNrRml4UHJvY2Vzc29yOwotCi0JcHVibGljIFN0cnVjdHVyZWRDb3JyZWN0aW9uUHJvY2Vzc29yKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWZBbm5vdGF0aW9uTW9kZWwgPSBzb3VyY2VWaWV3ZXIuZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUXVpY2tBc3Npc3RQcm9wb3NhbHMoU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBBcnJheUxpc3QgcHJvcG9zYWxzLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJdHJ5IHsKLQkJCUlRdWlja0Fzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBnZXRRdWlja0Fzc2lzdFByb2Nlc3NvcigpOwotCQkJaWYgKHByb2Nlc3NvciAhPSBudWxsICYmIHByb2Nlc3Nvci5jYW5Bc3Npc3Qodmlld2VyLCBkb2N1bWVudE9mZnNldCkpIHsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcmVzID0gcHJvY2Vzc29yLmdldFByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQkJCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCByZXMubGVuZ3RoOyBrKyspIHsKLQkJCQkJCXByb3Bvc2Fscy5hZGQocmVzW2tdKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUXVpY2tGaXhQcm9wb3NhbHMoU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBBcnJheUxpc3QgcHJvcG9zYWxzLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGZBbm5vdGF0aW9uTW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEFubm90YXRpb24pIGl0ZXIubmV4dCgpOwotCQkJUG9zaXRpb24gcG9zID0gZkFubm90YXRpb25Nb2RlbC5nZXRQb3NpdGlvbihhbm5vdGF0aW9uKTsKLQkJCWlmIChwb3MgIT0gbnVsbCAmJiBkb2N1bWVudE9mZnNldCA+PSBwb3Mub2Zmc2V0ICYmIGRvY3VtZW50T2Zmc2V0IDw9IHBvcy5vZmZzZXQgKyBwb3MubGVuZ3RoKSB7Ci0JCQkJSVF1aWNrRml4UHJvY2Vzc29yIHByb2Nlc3NvciA9IGdldFF1aWNrRml4UHJvY2Vzc29yKCk7Ci0JCQkJaWYgKHByb2Nlc3NvciAhPSBudWxsICYmIHByb2Nlc3Nvci5jYW5GaXgoYW5ub3RhdGlvbikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXMgPSBwcm9jZXNzb3IuZ2V0UHJvcG9zYWxzKGFubm90YXRpb24pOwotCQkJCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCByZXMubGVuZ3RoOyBrKyspIHsKLQkJCQkJCQkJcHJvcG9zYWxzLmFkZChyZXNba10pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCUFycmF5TGlzdCBwcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB7Ci0JCQlhZGRRdWlja0ZpeFByb3Bvc2FscygoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlciwgcHJvcG9zYWxzLCBkb2N1bWVudE9mZnNldCk7Ci0KLQkJCWlmIChwcm9wb3NhbHMuaXNFbXB0eSgpKSB7Ci0JCQkJYWRkUXVpY2tBc3Npc3RQcm9wb3NhbHMoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIsIHByb3Bvc2FscywgZG9jdW1lbnRPZmZzZXQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3Bvc2Fscy5pc0VtcHR5KCkpCi0JCQlwcm9wb3NhbHMuYWRkKG5ldyBOb01vZGlmaWNhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbCgpKTsKLQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgcHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLnNpemUoKV0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbltdIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldEVycm9yTWVzc2FnZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJUXVpY2tBc3Npc3RQcm9jZXNzb3IgZ2V0UXVpY2tBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJUXVpY2tGaXhQcm9jZXNzb3IgZ2V0UXVpY2tGaXhQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9CcmVha3BvaW50UnVsZXJBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9CcmVha3BvaW50UnVsZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM4NjQ2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvQnJlYWtwb2ludFJ1bGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIFBldGUgQ2FyYXBldHlhbi9HZW51aXRlYyAtIDI0NDgzNSAtIEVuYWJsZS9EaXNhYmxlIGJyZWFrcG9pbnQgYWN0aW9uIGRvZXMgbm90IHJlZnJlc2ggaXRzIGxhYmVsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZWJ1ZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklCcmVha3BvaW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JVmVydGljYWxSdWxlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0b3JhZ2VFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5CcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50LklCcmVha3BvaW50UHJvdmlkZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJyZWFrcG9pbnRSdWxlckFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElVcGRhdGUgewotCi0JcHJvdGVjdGVkIGNsYXNzIE1vdXNlVXBkYXRlciBpbXBsZW1lbnRzIE1vdXNlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJLy8gZG8gbm90aGluZyAoaGVyZSkKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCXVwZGF0ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQl0cnkgewotCQkJCXBhdGggPSAoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCQl9Ci0JCVN0cmluZyBuYW1lID0gaW5wdXQuZ2V0TmFtZSgpOwotCQlpbnQgaW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoaW5kZXggPT0gKG5hbWUubGVuZ3RoKCkgLSAxKSkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElSZXNvdXJjZSBnZXRSZXNvdXJjZShJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotCQkJcmVzb3VyY2UgPSAoKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRGaWxlKCk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpbnB1dC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIGlucHV0LmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQotCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gbnVsbDsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQkJaWYgKHdvcmtiZW5jaCAhPSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQkJCUlQYXJ0U2VydmljZSBzZXJ2aWNlID0gd2luZG93LmdldFBhcnRTZXJ2aWNlKCk7Ci0JCQkJCWlmIChzZXJ2aWNlICE9IG51bGwpIHsKLQkJCQkJCU9iamVjdCBwYXJ0ID0gc2VydmljZS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQkJCQlpZiAocGFydCAhPSBudWxsICYmIHBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJCQkJCWVkaXRvclBhcnQgPSAoSUVkaXRvclBhcnQpIHBhcnQ7Ci0JCQkJCQkJaWYgKGVkaXRvclBhcnQgIT0gbnVsbCkgewotCQkJCQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQkJCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQkJCQkJCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yUGFydDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmICh0ZXh0RWRpdG9yID09IG51bGwpIHsKLQkJCQkJCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJCQkJCQkJCUlEb2N1bWVudCB0ZXh0RG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChpbnB1dCk7Ci0JCQkJCQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHRleHREb2N1bWVudCk7Ci0JCQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJcmVzb3VyY2UgPSBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2UoaW5wdXQsIG1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpLCBnZXRGaWxlRXh0ZW5zaW9uKGlucHV0KSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCQkJCQkJCQlJQnJlYWtwb2ludFByb3ZpZGVyW10gcHJvdmlkZXJzID0gQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldEJyZWFrcG9pbnRQcm92aWRlcnMoZWRpdG9yUGFydCwgbnVsbCwgZ2V0RmlsZUV4dGVuc2lvbihpbnB1dCkpOwotCQkJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZXJzLmxlbmd0aCAmJiByZXNvdXJjZSA9PSBudWxsOyBpKyspIHsKLQkJCQkJCQkJCQkJcmVzb3VyY2UgPSBwcm92aWRlcnNbaV0uZ2V0UmVzb3VyY2UoaW5wdXQpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHJvdGVjdGVkIE1vdXNlTGlzdGVuZXIgZk1vdXNlTGlzdGVuZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIElWZXJ0aWNhbFJ1bGVySW5mbyBmUnVsZXJJbmZvID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVRleHRFZGl0b3IgZlRleHRFZGl0b3IgPSBudWxsOwotCi0JcHJpdmF0ZSBJTWVudUxpc3RlbmVyIG1lbnVMaXN0ZW5lcjsKLQotCXB1YmxpYyBCcmVha3BvaW50UnVsZXJBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBJVmVydGljYWxSdWxlckluZm8gcnVsZXJJbmZvKSB7Ci0JCXN1cGVyKCk7Ci0JCWZUZXh0RWRpdG9yID0gZWRpdG9yOwotCQlpZiAocnVsZXJJbmZvICE9IG51bGwpIHsKLQkJCWZSdWxlckluZm8gPSBydWxlckluZm87Ci0JCQlmTW91c2VMaXN0ZW5lciA9IG5ldyBNb3VzZVVwZGF0ZXIoKTsKLQkJCXJ1bGVySW5mby5nZXRDb250cm9sKCkuYWRkTW91c2VMaXN0ZW5lcihmTW91c2VMaXN0ZW5lcik7Ci0JCX0KLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yRXh0ZW5zaW9uKSB7Ci0JCQlJVGV4dEVkaXRvckV4dGVuc2lvbiBleHRlbnNpb24gPSAoSVRleHRFZGl0b3JFeHRlbnNpb24pIGVkaXRvcjsKLQkJCW1lbnVMaXN0ZW5lciA9IG5ldyBJTWVudUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQkJCQl1cGRhdGUoKTsKLQkJCQl9Ci0JCQl9OwotCQkJZXh0ZW5zaW9uLmFkZFJ1bGVyQ29udGV4dE1lbnVMaXN0ZW5lcihtZW51TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+QWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWw8L2NvZGU+IG9mIHRoZQotCSAqIGVkaXRvcidzIGlucHV0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1hcmtlciBhbm5vdGF0aW9uIG1vZGVsCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsIGdldEFubm90YXRpb25Nb2RlbCgpIHsKLQkJSURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBmVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSBwcm92aWRlci5nZXRBbm5vdGF0aW9uTW9kZWwoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIEFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsKQotCQkJcmV0dXJuIChBYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbCkgbW9kZWw7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJQnJlYWtwb2ludFtdIGdldEJyZWFrcG9pbnRzKElNYXJrZXJbXSBtYXJrZXJzKSB7Ci0JCUlCcmVha3BvaW50TWFuYWdlciBtYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCk7Ci0JCUxpc3QgYnJlYWtwb2ludHMgPSBuZXcgQXJyYXlMaXN0KG1hcmtlcnMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQnJlYWtwb2ludCBicmVha3BvaW50ID0gbWFuYWdlci5nZXRCcmVha3BvaW50KG1hcmtlcnNbaV0pOwotCQkJaWYgKGJyZWFrcG9pbnQgIT0gbnVsbCkgewotCQkJCWJyZWFrcG9pbnRzLmFkZChicmVha3BvaW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElCcmVha3BvaW50W10pIGJyZWFrcG9pbnRzLnRvQXJyYXkobmV3IElCcmVha3BvaW50WzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5JRG9jdW1lbnQ8L2NvZGU+IG9mIHRoZSBlZGl0b3IncyBpbnB1dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCBvZiB0aGUgZWRpdG9yJ3MgaW5wdXQKLQkgKi8KLQlwcm90ZWN0ZWQgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IGZUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJcmV0dXJuIHByb3ZpZGVyLmdldERvY3VtZW50KGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIG1hcmtlcnMgd2hpY2ggaW5jbHVkZSB0aGUgcnVsZXIncyBsaW5lIG9mIGFjdGl2aXR5LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWFya2VycyB3aGljaCBpbmNsdWRlIHRoZSBydWxlcidzIGxpbmUgb2YgYWN0aXZpdHkKLQkgKi8KLQlwcm90ZWN0ZWQgSU1hcmtlcltdIGdldE1hcmtlcnMoKSB7Ci0JCUxpc3QgbWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotCQlBYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbCBhbm5vdGF0aW9uTW9kZWwgPSBnZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiBhbm5vdGF0aW9uTW9kZWwgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlJTWFya2VyW10gYWxsTWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKElCcmVha3BvaW50LkJSRUFLUE9JTlRfTUFSS0VSLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJaWYgKGFsbE1hcmtlcnMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbE1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChpbmNsdWRlc1J1bGVyTGluZShhbm5vdGF0aW9uTW9kZWwuZ2V0TWFya2VyUG9zaXRpb24oYWxsTWFya2Vyc1tpXSksIGRvY3VtZW50KSkgewotCQkJCQkJCW1hcmtlcnMuYWRkKGFsbE1hcmtlcnNbaV0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCi0JCXJldHVybiAoSU1hcmtlcltdKSBtYXJrZXJzLnRvQXJyYXkobmV3IElNYXJrZXJbMF0pOwotCX0KLQotCXByb3RlY3RlZCBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGdldFRleHRFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpOwotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShpbnB1dCk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJ1bGVySW5mby4KLQkgKi8KLQlwdWJsaWMgSVZlcnRpY2FsUnVsZXJJbmZvIGdldFJ1bGVySW5mbygpIHsKLQkJcmV0dXJuIGZSdWxlckluZm87Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0ZXh0RWRpdG9yLgotCSAqLwotCXB1YmxpYyBJVGV4dEVkaXRvciBnZXRUZXh0RWRpdG9yKCkgewotCQlyZXR1cm4gZlRleHRFZGl0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTWFya2VycygpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQkJQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSBnZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiBtb2RlbCAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCUlNYXJrZXJbXSBhbGxNYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoSUJyZWFrcG9pbnQuTElORV9CUkVBS1BPSU5UX01BUktFUiwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCWlmIChhbGxNYXJrZXJzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxNYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoaW5jbHVkZXNSdWxlckxpbmUobW9kZWwuZ2V0TWFya2VyUG9zaXRpb24oYWxsTWFya2Vyc1tpXSksIGRvY3VtZW50KSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBwb3NpdGlvbiBpbmNsdWRlcyB0aGUgcnVsZXIncyBsaW5lIG9mIGFjdGl2aXR5LgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIHRvIGJlIGNoZWNrZWQKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0aGUgcG9zaXRpb24gcmVmZXJzIHRvCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGluZSBpcyBpbmNsdWRlZCBieSB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgIHBvc2l0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZXNSdWxlckxpbmUoUG9zaXRpb24gcG9zaXRpb24sIElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAocG9zaXRpb24gIT0gbnVsbCAmJiBmUnVsZXJJbmZvICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaW50IG1hcmtlckxpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQocG9zaXRpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCWludCBsaW5lID0gZ2V0UnVsZXJJbmZvKCkuZ2V0TGluZU9mTGFzdE1vdXNlQnV0dG9uQWN0aXZpdHkoKTsKLQkJCQlpZiAobGluZSA9PSBtYXJrZXJMaW5lKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkvLyBjb21tZW50ZWQgYmVjYXVzZSBvZiAiMUdFVU9aOTogSVRQSlVJOkFMTCAtIENvbmZ1c2luZyBVSQotCQkJCS8vIGZvcgotCQkJCS8vIG11bHRpbGluZSBCb29rbWFya3MgYW5kIFRhc2tzIgotCQkJCS8vIHJldHVybiAobWFya2VyTGluZSA8PSBsaW5lICYmIGxpbmUgPD0KLQkJCQkvLyBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQocG9zaXRpb24uZ2V0T2Zmc2V0KCkgKwotCQkJCS8vIHBvc2l0aW9uLmdldExlbmd0aCgpKSk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL0RlYnVnVGV4dEVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL0RlYnVnVGV4dEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzMzNzgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9EZWJ1Z1RleHRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZWJ1ZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhdGhFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5GaWxlRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUxvY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdERvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklFbGVtZW50U3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyUnVsZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklFeHRlbmRlZENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVBvcHVwTWVudUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5CcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5Db25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50LklFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dDsKLQotCi0vKioKLSAqIEBhdXRob3Igbml0aW4KLSAqIAotICogQSB0ZXh0IGVkaXRvciBjYXBhYmxlIG9mIHVzaW5nIHRoZSBJQnJlYWtwb2ludFByb3ZpZGVyIGZyYW1ld29yay4KLSAqIAotICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGNsaWVudHMgd2hvIHdpc2ggdG8gdXNlIHRoZQotICogSUJyZWFrcG9pbnRQcm92aWRlciBmcmFtZXdvcmsgYnV0IG5vdCB0aGUgU3RydWN0dXJlZFRleHRFZGl0b3IsIGUuZy4gVkJTCi0gKiBzb3VyY2UgZWRpdG9ycy4gSXQgaXMgcHJvdmlkZWQgQVMtSVMgYW5kIG1hcmtlZCBpbnRlcm5hbCBhcyBpdCBpcwotICogdW5zdXBwb3J0ZWQgYW5kIHN1YmplY3QgdG8gY2hhbmdlIGF0IGFueSB0aW1lLgotICovCi1wdWJsaWMgY2xhc3MgRGVidWdUZXh0RWRpdG9yIGV4dGVuZHMgVGV4dEVkaXRvciB7Ci0KLQlwcml2YXRlIGNsYXNzIFNob3dJblRhcmdldExpc3RlciBpbXBsZW1lbnRzIElTaG93SW5UYXJnZXRMaXN0IHsKLQkJcHVibGljIFN0cmluZ1tdIGdldFNob3dJblRhcmdldElkcygpIHsKLQkJCXJldHVybiBmU2hvd0luVGFyZ2V0SWRzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRG9jdW1lbnRQcm92aWRlciBmb3IgSVN0b3JhZ2VFZGl0b3JJbnB1dHMgLSBzdXBwb3J0cwotCSAqIElFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dCBub3RpZmljYXRpb25zIGFuZCBhc3NpZ25pbmcgYnJlYWtwb2ludAotCSAqIG1hcmtlcnMuCi0JICovCi0JY2xhc3MgU3RvcmFnZUlucHV0RG9jdW1lbnRQcm92aWRlciBleHRlbmRzIFN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyIGltcGxlbWVudHMgSUVsZW1lbnRTdGF0ZUxpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIElBbm5vdGF0aW9uTW9kZWwgY3JlYXRlQW5ub3RhdGlvbk1vZGVsKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJQW5ub3RhdGlvbk1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCUlTdG9yYWdlRWRpdG9ySW5wdXQgc3RvcmFnZUlucHV0ID0gKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgZXh0ID0gQnJlYWtwb2ludFJ1bGVyQWN0aW9uLmdldEZpbGVFeHRlbnNpb24oc3RvcmFnZUlucHV0KTsKLQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gZ2V0RWRpdG9ySW5wdXRDb250ZW50VHlwZXMoc3RvcmFnZUlucHV0KTsKLQkJCUlSZXNvdXJjZSByZXMgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IHJlcyA9PSBudWxsICYmIGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJCXJlcyA9IEJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZShzdG9yYWdlSW5wdXQsIHR5cGVzW2ldLmdldElkKCksIGV4dCk7Ci0JCQl9Ci0JCQlTdHJpbmcgaWQgPSBzdG9yYWdlSW5wdXQuZ2V0TmFtZSgpOwotCQkJaWYgKHN0b3JhZ2VJbnB1dC5nZXRTdG9yYWdlKCkgIT0gbnVsbCkgewotCQkJCUlQYXRoIGZ1bGxQYXRoID0gc3RvcmFnZUlucHV0LmdldFN0b3JhZ2UoKS5nZXRGdWxsUGF0aCgpOwotCQkJCWlmIChmdWxsUGF0aCAhPSBudWxsKQotCQkJCQlpZCA9IGZ1bGxQYXRoLnRvU3RyaW5nKCk7Ci0JCQkJZWxzZQotCQkJCQlpZCA9IHN0b3JhZ2VJbnB1dC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlpZiAocmVzICE9IG51bGwpCi0JCQkJbW9kZWwgPSBuZXcgU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsKHJlcywgaWQpOwotCQkJZWxzZQotCQkJCW1vZGVsID0gbmV3IFN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCBpZCk7Ci0KLQkJCXJldHVybiBtb2RlbDsKLQkJfQotCi0JCXByb3RlY3RlZCBBYnN0cmFjdERvY3VtZW50UHJvdmlkZXIuRWxlbWVudEluZm8gY3JlYXRlRWxlbWVudEluZm8oT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQkJKChJRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmFkZEVsZW1lbnRTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUVsZW1lbnRJbmZvKGVsZW1lbnQpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50LCBFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJCSgoSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0KSBlbGVtZW50KS5yZW1vdmVFbGVtZW50U3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJCXN1cGVyLmRpc3Bvc2VFbGVtZW50SW5mbyhlbGVtZW50LCBpbmZvKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyI2RvU2F2ZURvY3VtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LCBib29sZWFuKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZG9TYXZlRG9jdW1lbnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgZWxlbWVudCwgSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJLy8gdW50ZXN0ZWQKLQkJCW5ldyBGaWxlRG9jdW1lbnRQcm92aWRlcigpLnNhdmVEb2N1bWVudChtb25pdG9yLCBlbGVtZW50LCBkb2N1bWVudCwgb3ZlcndyaXRlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVsZW1lbnRDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWZpcmVFbGVtZW50Q29udGVudEFib3V0VG9CZVJlcGxhY2VkKGVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWxlbWVudENvbnRlbnRSZXBsYWNlZChPYmplY3QgZWxlbWVudCkgewotCQkJZmlyZUVsZW1lbnRDb250ZW50UmVwbGFjZWQoZWxlbWVudCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlbGVtZW50RGVsZXRlZChPYmplY3QgZWxlbWVudCkgewotCQkJZmlyZUVsZW1lbnREZWxldGVkKGVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWxlbWVudERpcnR5U3RhdGVDaGFuZ2VkKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGlzRGlydHkpIHsKLQkJCWZpcmVFbGVtZW50RGlydHlTdGF0ZUNoYW5nZWQoZWxlbWVudCwgaXNEaXJ0eSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlbGVtZW50TW92ZWQoT2JqZWN0IG9yaWdpbmFsRWxlbWVudCwgT2JqZWN0IG1vdmVkRWxlbWVudCkgewotCQkJZmlyZUVsZW1lbnRNb3ZlZChvcmlnaW5hbEVsZW1lbnQsIG1vdmVkRWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQlTdHJpbmdbXSBmU2hvd0luVGFyZ2V0SWRzID0gbmV3IFN0cmluZ1tde0lQYWdlTGF5b3V0LklEX1JFU19OQVZ9OwotCXByaXZhdGUgSVNob3dJblRhcmdldExpc3QgZlNob3dJblRhcmdldExpc3RBZGFwdGVyID0gbmV3IFNob3dJblRhcmdldExpc3RlcigpOwotCi0JSURvY3VtZW50UHJvdmlkZXIgZlN0b3JhZ2VJbnB1dERvY3VtZW50UHJvdmlkZXIgPSBudWxsOwotCi0JcHVibGljIERlYnVnVGV4dEVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RWRpdG9yI2NyZWF0ZUFjdGlvbnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQotCQkvLyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBBY3Rpb24gLSB0b2dnbGUgYnJlYWtwb2ludHMKLQkJSUFjdGlvbiBhY3Rpb24gPSBuZXcgVG9nZ2xlQnJlYWtwb2ludEFjdGlvbih0aGlzLCBnZXRWZXJ0aWNhbFJ1bGVyKCkpIHsKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGUoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQkJSUxvY2F0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSAoSUxvY2F0aW9uUHJvdmlkZXIpIGdldEVkaXRvcklucHV0KCkuZ2V0QWRhcHRlcihJTG9jYXRpb25Qcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJSVBhdGggbG9jYXRpb24gPSBwcm92aWRlci5nZXRQYXRoKGdldEVkaXRvcklucHV0KCkpOwotCQkJCQlyZXR1cm4gZGV0ZWN0Q29udGVudFR5cGUobG9jYXRpb24pLmdldElkKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBJUGF0aEVkaXRvcklucHV0KSB7Ci0JCQkJCUlQYXRoIGxvY2F0aW9uID0gKChJUGF0aEVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpKS5nZXRQYXRoKCk7Ci0JCQkJCXJldHVybiBkZXRlY3RDb250ZW50VHlwZShsb2NhdGlvbikuZ2V0SWQoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIElDb250ZW50VHlwZU1hbmFnZXIuQ1RfVEVYVDsKLQkJCX0KLQkJfTsKLQkJc2V0QWN0aW9uKEFjdGlvbkRlZmluaXRpb25JZHMuVE9HR0xFX0JSRUFLUE9JTlRTLCBhY3Rpb24pOwotCQkvLyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBBY3Rpb24gLSBtYW5hZ2UgYnJlYWtwb2ludHMKLQkJYWN0aW9uID0gbmV3IE1hbmFnZUJyZWFrcG9pbnRBY3Rpb24odGhpcywgZ2V0VmVydGljYWxSdWxlcigpKTsKLQkJc2V0QWN0aW9uKEFjdGlvbkRlZmluaXRpb25JZHMuTUFOQUdFX0JSRUFLUE9JTlRTLCBhY3Rpb24pOwotCQkvLyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBBY3Rpb24gLSBlZGl0IGJyZWFrcG9pbnRzCi0JCWFjdGlvbiA9IG5ldyBFZGl0QnJlYWtwb2ludEFjdGlvbih0aGlzLCBnZXRWZXJ0aWNhbFJ1bGVyKCkpOwotCQlzZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5FRElUX0JSRUFLUE9JTlRTLCBhY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSBTaG93IEluIFRhcmdldCBJRHMgZnJvbSB0aGUgRXh0ZW5kZWQgQ29uZmlndXJhdGlvbiBleHRlbnNpb24KLQkgKiBwb2ludC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNyZWF0ZVNob3dJblRhcmdldElkcygpIHsKLQkJTGlzdCBhbGxJZHMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQlFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIGNvbmZpZ3VyYXRpb25JZHMgPSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbklkcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gZGVmaW5pdGlvbnMgPSBidWlsZGVyLmdldERlZmluaXRpb25zKCJzaG93aW50YXJnZXQiLCBjb25maWd1cmF0aW9uSWRzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZWZpbml0aW9ucy5sZW5ndGg7IGorKykgewotCQkJCVN0cmluZyBzb21lSWRzID0gZGVmaW5pdGlvbnNbal07Ci0JCQkJaWYgKHNvbWVJZHMgIT0gbnVsbCAmJiBzb21lSWRzLmxlbmd0aCgpID4gMCkgewotCQkJCQlTdHJpbmdbXSBpZHMgPSBTdHJpbmdVdGlscy51bnBhY2soc29tZUlkcyk7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgaWRzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkvLyB0cmltLCBqdXN0IHRvIGtlZXAgdGhpbmdzIGNsZWFuCi0JCQkJCQlTdHJpbmcgaWQgPSBpZHNba10udHJpbSgpOwotCQkJCQkJaWYgKCFhbGxJZHMuY29udGFpbnMoaWQpKSB7Ci0JCQkJCQkJYWxsSWRzLmFkZChpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWFsbElkcy5jb250YWlucyhJUGFnZUxheW91dC5JRF9SRVNfTkFWKSkgewotCQkJYWxsSWRzLmFkZChJUGFnZUxheW91dC5JRF9SRVNfTkFWKTsKLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSBhbGxJZHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0KLQlJQ29udGVudFR5cGUgZGV0ZWN0Q29udGVudFR5cGUoSVBhdGggbG9jYXRpb24pIHsKLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBudWxsOwotCi0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGQgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCS8vIE9wdGltaXplZCBkZXNjcmlwdGlvbiBsb29rdXAsIG1pZ2h0IG5vdCBzdWNjZWVkCi0JCQkJCWQgPSAoKElGaWxlKSByZXNvdXJjZSkuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQkJCXR5cGUgPSBkLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBTaG91bGQgbm90IGJlIHBvc3NpYmxlIGdpdmVuIHRoZSBhY2Nlc3NpYmxlIGFuZCBmaWxlCi0JCQkJCS8vIHR5cGUgY2hlY2sgYWJvdmUKLQkJCQl9Ci0JCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCQl0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKHJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJRmlsZSBmaWxlID0gRmlsZUJ1ZmZlcnMuZ2V0U3lzdGVtRmlsZUF0TG9jYXRpb24obG9jYXRpb24pOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQkJCXR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoaW5wdXQsIGxvY2F0aW9uLnRvT1NTdHJpbmcoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJdHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihmaWxlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShJQ29udGVudFR5cGVNYW5hZ2VyLkNUX1RFWFQpOwotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjZWRpdG9yQ29udGV4dE1lbnVBYm91dFRvU2hvdyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVkaXRvckNvbnRleHRNZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuZWRpdG9yQ29udGV4dE1lbnVBYm91dFRvU2hvdyhtZW51KTsKLQotCQlJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgYyA9IGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQlpZiAoYyBpbnN0YW5jZW9mIElQb3B1cE1lbnVDb250cmlidXRvcikgewotCQkJKChJUG9wdXBNZW51Q29udHJpYnV0b3IpIGMpLmNvbnRyaWJ1dGVUb1BvcHVwTWVudShtZW51KTsKLQkJfQotCQllbHNlIHsKLQkJCUV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlciBidWlsZGVyID0gbmV3IEV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlcigpOwotCQkJSUV4dGVuZGVkQ29udHJpYnV0b3IgcG1jID0gYnVpbGRlci5yZWFkQWN0aW9uRXh0ZW5zaW9ucyhnZXRDb25maWd1cmF0aW9uUG9pbnRzKCkpOwotCQkJaWYgKHBtYyAhPSBudWxsKSB7Ci0JCQkJcG1jLnNldEFjdGl2ZUVkaXRvcih0aGlzKTsKLQkJCQlwbWMuY29udHJpYnV0ZVRvUG9wdXBNZW51KG1lbnUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgcmVxdWlyZWQpIHsKLQkJLy8gTmF2aWdhdGUgYWN0aW9uIHNldCBtZW51Ci0JCWlmIChJU2hvd0luVGFyZ2V0TGlzdC5jbGFzcy5lcXVhbHMocmVxdWlyZWQpKQotCQkJcmV0dXJuIGZTaG93SW5UYXJnZXRMaXN0QWRhcHRlcjsKLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIocmVxdWlyZWQpOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKSB7Ci0JCXJldHVybiBDb25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yLmdldENvbmZpZ3VyYXRpb25Qb2ludHModGhpcywgZ2V0SW5wdXRDb250ZW50VHlwZShnZXRFZGl0b3JJbnB1dCgpKSwgQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvci5TT1VSQ0UsIERlYnVnVGV4dEVkaXRvci5jbGFzcyk7Ci0JfQotCi0JSUNvbnRlbnRUeXBlW10gZ2V0RWRpdG9ySW5wdXRDb250ZW50VHlwZXMoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUlDb250ZW50VHlwZVtdIHR5cGVzID0gbnVsbDsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQotCQlpZiAoaW5wdXQuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcykgIT0gbnVsbCkgewotCQkJcmVzb3VyY2UgPSAoSUZpbGUpIGlucHV0LmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQl9Ci0JCWVsc2UgaWYgKGlucHV0LmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpICE9IG51bGwpIHsKLQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgaW5wdXQuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQl9Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCUlDb250ZW50RGVzY3JpcHRpb24gZCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIG9wdGltaXplZCBkZXNjcmlwdGlvbiBsb29rdXAsIG1pZ2h0IG5vdCBzdWNjZWVkCi0JCQkJZCA9ICgoSUZpbGUpIHJlc291cmNlKS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQkJCXR5cGVzID0gbmV3IElDb250ZW50VHlwZVtde2QuZ2V0Q29udGVudFR5cGUoKX07Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIHNob3VsZCBub3QgYmUgcG9zc2libGUgZ2l2ZW4gdGhlIGFjY2Vzc2libGUgYW5kIGZpbGUgdHlwZQotCQkJCS8vIGNoZWNrIGFib3ZlCi0JCQl9Ci0JCX0KLQkJaWYgKHR5cGVzID09IG51bGwpIHsKLQkJCXR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihpbnB1dC5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiB0eXBlczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9ySW5wdXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5wdXRDb250ZW50VHlwZShJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKLQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBnZXRFZGl0b3JJbnB1dENvbnRlbnRUeXBlcyhlZGl0b3JJbnB1dCk7Ci0JCWlmICh0eXBlcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHlwZXNbMF0uZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVidWdnaW5nQXZhaWxhYmxlKCkgewotCQlib29sZWFuIGRlYnVnZ2luZ0F2YWlsYWJsZSA9IGZhbHNlOwotCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IGdldEVkaXRvcklucHV0Q29udGVudFR5cGVzKGdldEVkaXRvcklucHV0KCkpOwotCQlmb3IgKGludCBpID0gMDsgIWRlYnVnZ2luZ0F2YWlsYWJsZSAmJiBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWRlYnVnZ2luZ0F2YWlsYWJsZSA9IGRlYnVnZ2luZ0F2YWlsYWJsZSB8fCBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyLmdldEluc3RhbmNlKCkuaXNBdmFpbGFibGUodHlwZXNbaV0uZ2V0SWQoKSwgQnJlYWtwb2ludFJ1bGVyQWN0aW9uLmdldEZpbGVFeHRlbnNpb24oZ2V0RWRpdG9ySW5wdXQoKSkpOwotCQl9Ci0JCXJldHVybiBkZWJ1Z2dpbmdBdmFpbGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcnVsZXJDb250ZXh0TWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCWlmIChpc0RlYnVnZ2luZ0F2YWlsYWJsZSgpKSB7Ci0JCQltZW51LmFkZChnZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5UT0dHTEVfQlJFQUtQT0lOVFMpKTsKLQkJCW1lbnUuYWRkKGdldEFjdGlvbihBY3Rpb25EZWZpbml0aW9uSWRzLk1BTkFHRV9CUkVBS1BPSU5UUykpOwotCQkJbWVudS5hZGQoZ2V0QWN0aW9uKEFjdGlvbkRlZmluaXRpb25JZHMuRURJVF9CUkVBS1BPSU5UUykpOwotCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJfQotCQllbHNlIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjb3VsZCBub3QgZW5hYmxlIGRlYnVnZ2luZyBhY3Rpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzdXBlci5ydWxlckNvbnRleHRNZW51QWJvdXRUb1Nob3cobWVudSk7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHRoYXQgdGhlIGNvcnJlY3QgSURvY3VtZW50UHJvdmlkZXIgaXMgdXNlZC4gRm9yIElGaWxlIGFuZCBGaWxlcywKLQkgKiB0aGUgZGVmYXVsdCBwcm92aWRlciB3aXRoIGEgc3BlY2lmaWVkIEFubm90YXRpb25Nb2RlbEZhY3RvcnkgaXMgdXNlZC4KLQkgKiBGb3IgU3RvcmFnZUVkaXRvcklucHV0cywgdXNlIGEgY3VzdG9tIHByb3ZpZGVyIHRoYXQgY3JlYXRlcyBhIHVzYWJsZQotCSAqIFJlc291cmNlQW5ub3RhdGlvbk1vZGVsCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvciNzZXREb2N1bWVudFByb3ZpZGVyKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudFByb3ZpZGVyKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0ICYmICEoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSkgewotCQkJaWYgKGZTdG9yYWdlSW5wdXREb2N1bWVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCQlmU3RvcmFnZUlucHV0RG9jdW1lbnRQcm92aWRlciA9IG5ldyBTdG9yYWdlSW5wdXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCQl9Ci0JCQlzZXREb2N1bWVudFByb3ZpZGVyKGZTdG9yYWdlSW5wdXREb2N1bWVudFByb3ZpZGVyKTsKLQkJfQotCQllbHNlIHsKLQkJCXN1cGVyLnNldERvY3VtZW50UHJvdmlkZXIoaW5wdXQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciN1cGRhdGVDb250ZW50RGVwZW5kZW50QWN0aW9ucygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udGVudERlcGVuZGVudEFjdGlvbnMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRlbnREZXBlbmRlbnRBY3Rpb25zKCk7Ci0JCWlmIChpc0RlYnVnZ2luZ0F2YWlsYWJsZSgpKSB7Ci0JCQlzZXRBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUlVMRVJfRE9VQkxFX0NMSUNLLCBnZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5UT0dHTEVfQlJFQUtQT0lOVFMpKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIFRoZSBEZWZhdWx0IFRleHQgRWRpdG9yIHVzZXMgZWRpdG9yQ29udHJpYnV0aW9uIHRvIHBlcmZvcm0gdGhpcwotCQkJLy8gbWFwcGluZywgYnV0IHNpbmNlIGl0IHJlbGllcyBvbiB0aGUgSUVkaXRvclNpdGUgSUQsIGl0IGNhbid0IGJlCi0JCQkvLyByZWxpZWQgb24gZm9yIE11bHRpUGFnZUVkaXRvclBhcnRzLiBJbnN0ZWFkLCBmb3JjZSB0aGUgYWN0aW9uCi0JCQkvLyByZWdpc3RyYXRpb24gbWFudWFsbHkuCi0JCQlzZXRBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUlVMRVJfRE9VQkxFX0NMSUNLLCBuZXcgTWFya2VyUnVsZXJBY3Rpb24oU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCAiRWRpdG9yLk1hbmFnZUJvb2ttYXJrcy4iLCB0aGlzLCBnZXRWZXJ0aWNhbFJ1bGVyKCksIElNYXJrZXIuQk9PS01BUkssIHRydWUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWZTaG93SW5UYXJnZXRJZHMgPSBjcmVhdGVTaG93SW5UYXJnZXRJZHMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvRWRpdEJyZWFrcG9pbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9FZGl0QnJlYWtwb2ludEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWI5ODhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9FZGl0QnJlYWtwb2ludEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklWZXJ0aWNhbFJ1bGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlEaWFsb2dBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0QnJlYWtwb2ludEFjdGlvbiBleHRlbmRzIEJyZWFrcG9pbnRSdWxlckFjdGlvbiB7Ci0JcHJvdGVjdGVkIElCcmVha3BvaW50W10gYnJlYWtwb2ludHMgPSBudWxsOwotCi0JLyoqCi0JICogQHBhcmFtIGVkaXRvcgotCSAqIEBwYXJhbSBydWxlckluZm8KLQkgKi8KLQlwdWJsaWMgRWRpdEJyZWFrcG9pbnRBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBJVmVydGljYWxSdWxlciBydWxlckluZm8pIHsKLQkJc3VwZXIoZWRpdG9yLCBydWxlckluZm8pOwotCQlzZXRUZXh0KFNTRVVJTWVzc2FnZXMuRWRpdEJyZWFrcG9pbnRBY3Rpb25fMCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVByb3BlcnR5RGlhbG9nQWN0aW9uIGFjdGlvbiA9IG5ldyBQcm9wZXJ0eURpYWxvZ0FjdGlvbihnZXRUZXh0RWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpLCBuZXcgSVNlbGVjdGlvblByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0KLQkJCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYnJlYWtwb2ludHMpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9KTsKLQkJYWN0aW9uLnJ1bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJYm9vbGVhbiBlbmFibGVUaGlzQWN0aW9uID0gaGFzTWFya2VycygpOwotCQlzZXRFbmFibGVkKGVuYWJsZVRoaXNBY3Rpb24pOwotCQlicmVha3BvaW50cyA9IGdldEJyZWFrcG9pbnRzKGdldE1hcmtlcnMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL01hbmFnZUJyZWFrcG9pbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9NYW5hZ2VCcmVha3BvaW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkN2ZmMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL01hbmFnZUJyZWFrcG9pbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlYnVnOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JVmVydGljYWxSdWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLQotLyoqCi0gKiBNYW5hZ2VCcmVha3BvaW50QWN0aW9uIC0gRW5hYmxlcyBhbmQgRGlzYWJsZXMKLSAqLwotcHVibGljIGNsYXNzIE1hbmFnZUJyZWFrcG9pbnRBY3Rpb24gZXh0ZW5kcyBCcmVha3BvaW50UnVsZXJBY3Rpb24gewotCi0JcHJvdGVjdGVkIElCcmVha3BvaW50W10gYnJlYWtwb2ludHMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBkb0VuYWJsZSA9IHRydWU7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogQHBhcmFtIHJ1bGVySW5mbwotCSAqLwotCXB1YmxpYyBNYW5hZ2VCcmVha3BvaW50QWN0aW9uKElUZXh0RWRpdG9yIGVkaXRvciwgSVZlcnRpY2FsUnVsZXIgcnVsZXJJbmZvKSB7Ci0JCXN1cGVyKGVkaXRvciwgcnVsZXJJbmZvKTsKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzYWJsZUJyZWFrcG9pbnRzKElCcmVha3BvaW50W10gYnJlYWtwb2ludHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBicmVha3BvaW50cy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlicmVha3BvaW50c1tpXS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVCcmVha3BvaW50cyhJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnJlYWtwb2ludHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJYnJlYWtwb2ludHNbaV0uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChkb0VuYWJsZSkKLQkJCWVuYWJsZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzKTsKLQkJZWxzZQotCQkJZGlzYWJsZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCS8vIGRvRW5hYmxlIG1lYW5zICJlbmFibGUiIGluc3RlYWQgb2YgImRpc2FibGUiCi0JCWRvRW5hYmxlID0gdHJ1ZTsKLQkJYnJlYWtwb2ludHMgPSBnZXRCcmVha3BvaW50cyhnZXRNYXJrZXJzKCkpOwotCQlmb3IgKGludCBpID0gMDsgZG9FbmFibGUgJiYgaSA8IGJyZWFrcG9pbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQnJlYWtwb2ludCBicmVha3BvaW50ID0gYnJlYWtwb2ludHNbaV07Ci0JCQl0cnkgewotCQkJCWlmIChicmVha3BvaW50LmlzRW5hYmxlZCgpKSB7Ci0JCQkJCWRvRW5hYmxlID0gZmFsc2U7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiYnJlYWtwb2ludCBub3QgcmVzcG9uZGluZyB0byBpc0VuYWJsZWQ6ICIgKyBicmVha3BvaW50LCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXNldEVuYWJsZWQoYnJlYWtwb2ludHMgIT0gbnVsbCAmJiBicmVha3BvaW50cy5sZW5ndGggPiAwKTsKLQkJaWYgKGRvRW5hYmxlKQotCQkJc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk1hbmFnZUJyZWFrcG9pbnRBY3Rpb25fMCk7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk1hbmFnZUJyZWFrcG9pbnRBY3Rpb25fMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9Ub2dnbGVCcmVha3BvaW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvVG9nZ2xlQnJlYWtwb2ludEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjExOTMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9Ub2dnbGVCcmVha3BvaW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklCcmVha3BvaW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnVUlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JVmVydGljYWxSdWxlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb240OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQuSUJyZWFrcG9pbnRQcm92aWRlcjsKLQotLyoqCi0gKiBUb2dnbGVCcmVha3BvaW50QWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBUb2dnbGVCcmVha3BvaW50QWN0aW9uIGV4dGVuZHMgQnJlYWtwb2ludFJ1bGVyQWN0aW9uIHsKLQlJQWN0aW9uIGZGYWxsYmFja0FjdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiBAcGFyYW0gcnVsZXJJbmZvCi0JICovCi0JcHVibGljIFRvZ2dsZUJyZWFrcG9pbnRBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBJVmVydGljYWxSdWxlckluZm8gcnVsZXJJbmZvKSB7Ci0JCXN1cGVyKGVkaXRvciwgcnVsZXJJbmZvKTsKLQkJc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRvZ2dsZUJyZWFrcG9pbnRBY3Rpb25fMCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgVG9nZ2xlQnJlYWtwb2ludEFjdGlvbihJVGV4dEVkaXRvciBlZGl0b3IsIElWZXJ0aWNhbFJ1bGVySW5mbyBydWxlckluZm8sIElBY3Rpb24gZmFsbGJhY2tBY3Rpb24pIHsKLQkJdGhpcyhlZGl0b3IsIHJ1bGVySW5mbyk7Ci0JCWZGYWxsYmFja0FjdGlvbiA9IGZhbGxiYWNrQWN0aW9uOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNyZWF0ZUJyZWFrcG9pbnRzKGludCBsaW5lTnVtYmVyKSB7Ci0JCS8qCi0JCSAqIE5vdGU6IHdlJ2xsIGFsd2F5cyBhbGxvdyBwcm9jZXNzaW5nIHRvIGNvbnRpbnVlLCBldmVuIGZvciBhICJyZWFkCi0JCSAqIG9ubHkiIElTdG9yYWdlRWRpdG9ySW5wdXQsIGZvciB0aGUgQWN0aXZlU2NyaXB0IGRlYnVnZ2VyLiBCdXQgdGhpcwotCQkgKiBtZWFucyBzb21ldGltZXMgdGhlIEFjdGl2ZVNjcmlwdCBwcm92aWRlciBtaWdodCBnZXQgYW4gaW5wdXQgZnJvbQotCQkgKiBDVlMgb3Igc29tZXRoaW5nIHRoYXQgaXMgbm90IHJlbGF0ZWQgdG8gZGVidWdnaW5nLgotCQkgKi8KLQotCQlJVGV4dEVkaXRvciBlZGl0b3IgPSBnZXRUZXh0RWRpdG9yKCk7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGlucHV0KTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gZ2V0Q29udGVudFR5cGUoZG9jdW1lbnQpOwotCQlJQnJlYWtwb2ludFByb3ZpZGVyW10gcHJvdmlkZXJzID0gQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldEJyZWFrcG9pbnRQcm92aWRlcnMoZWRpdG9yLCBjb250ZW50VHlwZSwgZ2V0RmlsZUV4dGVuc2lvbihpbnB1dCkpOwotCi0JCWludCBwb3MgPSAtMTsKLQkJSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgdG9vbHMgPSAoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMpIGVkaXRvci5nZXRBZGFwdGVyKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmNsYXNzKTsKLQkJaWYgKHRvb2xzICE9IG51bGwpIHsKLQkJCXBvcyA9IHRvb2xzLmdldENhcmV0T2Zmc2V0KCk7Ci0JCX0KLQotCQlmaW5hbCBpbnQgbiA9IHByb3ZpZGVycy5sZW5ndGg7Ci0JCUxpc3QgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKERlYnVnLmRlYnVnQnJlYWtwb2ludHMpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm92aWRlcnNbaV0uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGluZyBicmVha3BvaW50IHRvIGxpbmUgIiArIGxpbmVOdW1iZXIpOyAvLyROT04tTkxTLTEkCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSBwcm92aWRlcnNbaV0uYWRkQnJlYWtwb2ludChkb2N1bWVudCwgaW5wdXQsIGxpbmVOdW1iZXIsIHBvcyk7Ci0JCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCWVycm9ycy5hZGQoc3RhdHVzKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZXJyb3JzLmFkZChlLmdldFN0YXR1cygpKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gdCkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImV4Y2VwdGlvbiB3aGlsZSBhZGRpbmcgYnJlYWtwb2ludCIsIHQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCWlmIChlcnJvcnMuc2l6ZSgpID4gMCkgewotCQkJU2hlbGwgc2hlbGwgPSBlZGl0b3IuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCQlpZiAoZXJyb3JzLnNpemUoKSA+IDEpIHsKLQkJCQlzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuT0ssIChJU3RhdHVzW10pIGVycm9ycy50b0FycmF5KG5ldyBJU3RhdHVzWzBdKSwgU1NFVUlNZXNzYWdlcy5NYW5hZ2VCcmVha3BvaW50c19lcnJvcl9hZGRpbmdfbWVzc2FnZTEsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdGF0dXMgPSAoSVN0YXR1cykgZXJyb3JzLmdldCgwKTsKLQkJCX0KLQkJCWlmICgoc3RhdHVzLmdldFNldmVyaXR5KCkgPiBJU3RhdHVzLklORk8pIHx8IChQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpICYmICFzdGF0dXMuaXNPSygpKSkgewotCQkJCVBsYXRmb3JtLmdldExvZyhTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkpLmxvZyhzdGF0dXMpOwotCQkJfQotCQkJLyoKLQkJCSAqIFNob3cgZm9yIGNvbmRpdGlvbnMgbW9yZSBzZXZlcmUgdGhhbiBJTkZPIG9yIHdoZW4gbm8KLQkJCSAqIGJyZWFrcG9pbnRzIHdlcmUgY3JlYXRlZAotCQkJICovCi0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPiBJU3RhdHVzLklORk8gJiYgZ2V0QnJlYWtwb2ludHMoZ2V0TWFya2VycygpKS5sZW5ndGggPCAxKSB7Ci0JCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBTU0VVSU1lc3NhZ2VzLk1hbmFnZUJyZWFrcG9pbnRzX2Vycm9yX2FkZGluZ190aXRsZTEsIHN0YXR1cy5nZXRNZXNzYWdlKCksIHN0YXR1cyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkvKgotCQkgKiBBbHRob3VnaCBubyBlcnJvcnMgd2VyZSByZXBvcnRlZCwgbm8gYnJlYWtwb2ludHMgZXhpc3Qgb24gdGhpcyBsaW5lCi0JCSAqIGFmdGVyIGhhdmluZyBydW4gdGhlIGV4aXN0aW5nIHByb3ZpZGVycy4gUnVuIHRoZSBmYWxsYmFjayBhY3Rpb24uCi0JCSAqLwotCQlpZiAoKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5nZXRTZXZlcml0eSgpIDwgSVN0YXR1cy5XQVJOSU5HKSAmJiBmRmFsbGJhY2tBY3Rpb24gIT0gbnVsbCAmJiAhaGFzTWFya2VycygpKSB7Ci0JCQlpZiAoZkZhbGxiYWNrQWN0aW9uIGluc3RhbmNlb2YgSVNlbGVjdGlvbkxpc3RlbmVyKSB7Ci0JCQkJKChJU2VsZWN0aW9uTGlzdGVuZXIpIGZGYWxsYmFja0FjdGlvbikuc2VsZWN0aW9uQ2hhbmdlZChudWxsLCBudWxsKTsKLQkJCX0KLQkJCWZGYWxsYmFja0FjdGlvbi5ydW4oKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJTW9kZWxNYW5hZ2VyIG1nciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCVN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7Ci0KLQkJSURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBmVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCWlmIChwcm92aWRlciBpbnN0YW5jZW9mIElEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uNCkgewotCQkJdHJ5IHsKLQkJCQlJQ29udGVudFR5cGUgdHlwZSA9ICgoSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb240KSBwcm92aWRlcikuZ2V0Q29udGVudFR5cGUoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJaWYgKHR5cGUgIT0gbnVsbCkKLQkJCQkJY29udGVudFR5cGUgPSB0eXBlLmdldElkKCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLyoKLQkJCQkgKiBBIGZhaWx1cmUgYWNjZXNzaW5nIHRoZSB1bmRlcmx5aW5nIHN0b3JlIHJlYWxseSBpc24ndAotCQkJCSAqIGludGVyZXN0aW5nLCBhbHRob3VnaCBpdCBjYW4gYmUgYSBwcm9ibGVtIGZvcgotCQkJCSAqIElTdG9yYWdlRWRpdG9ySW5wdXRzLgotCQkJCSAqLwotCQkJfQotCQl9Ci0KLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IG1nci5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJY29udGVudFR5cGUgPSBtb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRUeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUJyZWFrcG9pbnRzKGludCBsaW5lTnVtYmVyKSB7Ci0JCUlCcmVha3BvaW50TWFuYWdlciBicmVha3BvaW50TWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpOwotCQlJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzID0gZ2V0QnJlYWtwb2ludHMoZ2V0TWFya2VycygpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBicmVha3BvaW50cy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlicmVha3BvaW50c1tpXS5nZXRNYXJrZXIoKS5kZWxldGUoKTsKLQkJCQlicmVha3BvaW50TWFuYWdlci5yZW1vdmVCcmVha3BvaW50KGJyZWFrcG9pbnRzW2ldLCB0cnVlKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpbnQgbGluZU51bWJlciA9IGZSdWxlckluZm8uZ2V0TGluZU9mTGFzdE1vdXNlQnV0dG9uQWN0aXZpdHkoKSArIDE7Ci0JCWJvb2xlYW4gZG9BZGQgPSAhaGFzTWFya2VycygpOwotCQlpZiAoZG9BZGQpCi0JCQljcmVhdGVCcmVha3BvaW50cyhsaW5lTnVtYmVyKTsKLQkJZWxzZQotCQkJcmVtb3ZlQnJlYWtwb2ludHMobGluZU51bWJlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGUjdXBkYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRJbWFnZURlc2NyaXB0b3IoKQotCSAqIG92ZXJyaWRpbmcgZm9yIGxhenkgbG9hZGluZwotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQkKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlID0gc3VwZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKXsKLQkJCWltYWdlID0gRGVidWdVSVRvb2xzLmdldEltYWdlRGVzY3JpcHRvcihJRGVidWdVSUNvbnN0YW50cy5JTUdfT0JKU19CUkVBS1BPSU5UKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9Ub2dnbGVCcmVha3BvaW50c1RhcmdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL1RvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YzhjNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL1RvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklCcmVha3BvaW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLS8qKgotICogQGF1dGhvciBuc2QKLSAqLwotcHVibGljIGNsYXNzIFRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0IGltcGxlbWVudHMgSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0IHsKLQlzdGF0aWMgZmluYWwgSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0IGluc3RhbmNlID0gbmV3IFRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0KCk7Ci0KLQlwdWJsaWMgc3RhdGljIElUb2dnbGVCcmVha3BvaW50c1RhcmdldCBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklUb2dnbGVCcmVha3BvaW50c1RhcmdldCNjYW5Ub2dnbGVMaW5lQnJlYWtwb2ludHMob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVG9nZ2xlTGluZUJyZWFrcG9pbnRzKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlUZXh0RWRpdG9yIGVkaXRvciA9IChJVGV4dEVkaXRvcikgcGFydC5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgPiAtMSkgewotCQkJCWludCBsaW5lTnVtYmVyID0gLTE7Ci0JCQkJdHJ5IHsKLQkJCQkJbGluZU51bWJlciA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldCh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJaWYgKGxpbmVOdW1iZXIgPj0gMCkgewotCQkJCQlUb2dnbGVCcmVha3BvaW50QWN0aW9uIHRvZ2dsZXIgPSBuZXcgVG9nZ2xlQnJlYWtwb2ludEFjdGlvbihlZGl0b3IsIG51bGwpOwotCQkJCQl0b2dnbGVyLnVwZGF0ZSgpOwotCQkJCQlyZXR1cm4gdG9nZ2xlci5pc0VuYWJsZWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQjY2FuVG9nZ2xlTWV0aG9kQnJlYWtwb2ludHMob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVG9nZ2xlTWV0aG9kQnJlYWtwb2ludHMoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQjY2FuVG9nZ2xlV2F0Y2hwb2ludHMob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVG9nZ2xlV2F0Y2hwb2ludHMoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgSUJyZWFrcG9pbnRbXSBnZXRCcmVha3BvaW50cyhJUmVzb3VyY2UgcmVzb3VyY2UsIElEb2N1bWVudCBkb2N1bWVudCwgQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWwgbW9kZWwsIGludCBsaW5lTnVtYmVyKSB7Ci0JCUxpc3QgbWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgbW9kZWwgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlJTWFya2VyW10gYWxsTWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKElCcmVha3BvaW50LkxJTkVfQlJFQUtQT0lOVF9NQVJLRVIsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQlpZiAoYWxsTWFya2VycyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsTWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQkJUG9zaXRpb24gcCA9IG1vZGVsLmdldE1hcmtlclBvc2l0aW9uKGFsbE1hcmtlcnNbaV0pOwotCQkJCQkJaW50IG1hcmtlckxpbmUgPSAtMTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbWFya2VyTGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChwLmdldE9mZnNldCgpKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlMSkgewotCQkJCQkJfQotCQkJCQkJaWYgKG1hcmtlckxpbmUgPT0gbGluZU51bWJlcikgewotCQkJCQkJCW1hcmtlcnMuYWRkKGFsbE1hcmtlcnNbaV0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24geCkgewotCQkJfQotCQl9Ci0JCUlCcmVha3BvaW50TWFuYWdlciBtYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCk7Ci0JCUxpc3QgYnJlYWtwb2ludHMgPSBuZXcgQXJyYXlMaXN0KG1hcmtlcnMuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlJQnJlYWtwb2ludCBicmVha3BvaW50ID0gbWFuYWdlci5nZXRCcmVha3BvaW50KChJTWFya2VyKSBtYXJrZXJzLmdldChpKSk7Ci0JCQlpZiAoYnJlYWtwb2ludCAhPSBudWxsKSB7Ci0JCQkJYnJlYWtwb2ludHMuYWRkKGJyZWFrcG9pbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSUJyZWFrcG9pbnRbXSkgYnJlYWtwb2ludHMudG9BcnJheShuZXcgSUJyZWFrcG9pbnRbMF0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQjdG9nZ2xlTGluZUJyZWFrcG9pbnRzKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRvZ2dsZUxpbmVCcmVha3BvaW50cyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJVGV4dEVkaXRvciBlZGl0b3IgPSAoSVRleHRFZGl0b3IpIHBhcnQuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlpbnQgbGluZU51bWJlciA9IC0xOwotCQkJdHJ5IHsKLQkJCQlsaW5lTnVtYmVyID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCWlmIChsaW5lTnVtYmVyID49IDApIHsKLQkJCQlUb2dnbGVCcmVha3BvaW50QWN0aW9uIHRvZ2dsZXIgPSBuZXcgVG9nZ2xlQnJlYWtwb2ludEFjdGlvbihlZGl0b3IsIG51bGwpOwotCQkJCXRvZ2dsZXIudXBkYXRlKCk7Ci0JCQkJaWYgKHRvZ2dsZXIuaXNFbmFibGVkKCkpIHsKLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gdG9nZ2xlci5nZXRSZXNvdXJjZSgpOwotCQkJCQlBYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbCBtb2RlbCA9IHRvZ2dsZXIuZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JCQkJCUlCcmVha3BvaW50W10gYnJlYWtwb2ludHMgPSBnZXRCcmVha3BvaW50cyhyZXNvdXJjZSwgZG9jdW1lbnQsIG1vZGVsLCBsaW5lTnVtYmVyKTsKLQkJCQkJaWYgKGJyZWFrcG9pbnRzLmxlbmd0aCA+IDApIHsKLQkJCQkJCUlCcmVha3BvaW50TWFuYWdlciBicmVha3BvaW50TWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBicmVha3BvaW50cy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWJyZWFrcG9pbnRzW2ldLmdldE1hcmtlcigpLmRlbGV0ZSgpOwotCQkJCQkJCWJyZWFrcG9pbnRNYW5hZ2VyLnJlbW92ZUJyZWFrcG9pbnQoYnJlYWtwb2ludHNbaV0sIHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdG9nZ2xlci5jcmVhdGVCcmVha3BvaW50cyhsaW5lTnVtYmVyICsgMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0I3RvZ2dsZU1ldGhvZEJyZWFrcG9pbnRzKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRvZ2dsZU1ldGhvZEJyZWFrcG9pbnRzKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklUb2dnbGVCcmVha3BvaW50c1RhcmdldCN0b2dnbGVXYXRjaHBvaW50cyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0b2dnbGVXYXRjaHBvaW50cyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvSFRNTDJUZXh0UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9IVE1MMlRleHRSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhYzhjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9IVE1MMlRleHRSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlcml2ZWQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHVzaGJhY2tSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotCi0vKgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSFRNTDJUZXh0UmVhZGVyIE1vZGlmaWNhdGlvbnMKLSAqIHdlcmUgbWFkZSB0byBhZGQgYnIvIHRhZyBhbmQgZml4IHdhcm5pbmdzCi0gKi8KLS8qKgotICogUmVhZHMgdGhlIHRleHQgY29udGVudHMgZnJvbSBhIHJlYWRlciBvZiBIVE1MIGNvbnRlbnRzIGFuZCB0cmFuc2xhdGVzIHRoZQotICogdGFncyBvciBjdXQgdGhlbSBvdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MMlRleHRSZWFkZXIgZXh0ZW5kcyBTdWJzdGl0dXRpb25UZXh0UmVhZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkc9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIGZnRW50aXR5TG9va3VwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNldCBmZ1RhZ3M7Ci0KLQlzdGF0aWMgewotCi0JCWZnVGFncz0gbmV3IEhhc2hTZXQoKTsKLQkJZmdUYWdzLmFkZCgiYiIpOyAvLyROT04tTkxTLTEkCi0JCWZnVGFncy5hZGQoImJyIik7IC8vJE5PTi1OTFMtMSQKLQkJZmdUYWdzLmFkZCgiYnIvIik7Ly8kTk9OLU5MUy0xJAotCQlmZ1RhZ3MuYWRkKCJoNSIpOyAvLyROT04tTkxTLTEkCi0JCWZnVGFncy5hZGQoInAiKTsgLy8kTk9OLU5MUy0xJAotCQlmZ1RhZ3MuYWRkKCJkbCIpOyAvLyROT04tTkxTLTEkCi0JCWZnVGFncy5hZGQoImR0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZmdUYWdzLmFkZCgiZGQiKTsgLy8kTk9OLU5MUy0xJAotCQlmZ1RhZ3MuYWRkKCJsaSIpOyAvLyROT04tTkxTLTEkCi0JCWZnVGFncy5hZGQoInVsIik7IC8vJE5PTi1OTFMtMSQKLQkJZmdUYWdzLmFkZCgicHJlIik7IC8vJE5PTi1OTFMtMSQKLQotCQlmZ0VudGl0eUxvb2t1cD0gbmV3IEhhc2hNYXAoNyk7Ci0JCWZnRW50aXR5TG9va3VwLnB1dCgibHQiLCAiPCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmdFbnRpdHlMb29rdXAucHV0KCJndCIsICI+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZ0VudGl0eUxvb2t1cC5wdXQoIm5ic3AiLCAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmdFbnRpdHlMb29rdXAucHV0KCJhbXAiLCAiJiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmdFbnRpdHlMb29rdXAucHV0KCJjaXJjIiwgIl4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZnRW50aXR5TG9va3VwLnB1dCgidGlsZGUiLCAifiIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJZmdFbnRpdHlMb29rdXAucHV0KCJxdW90IiwgIlwiIik7CQkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJpdmF0ZSBpbnQgZkNvdW50ZXI9IDA7Ci0JcHJpdmF0ZSBUZXh0UHJlc2VudGF0aW9uIGZUZXh0UHJlc2VudGF0aW9uOwotCXByaXZhdGUgaW50IGZCb2xkPSAwOwotCXByaXZhdGUgaW50IGZTdGFydE9mZnNldD0gLTE7Ci0JcHJpdmF0ZSBib29sZWFuIGZJblBhcmFncmFwaD0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc1ByZWZvcm1hdHRlZFRleHQ9IGZhbHNlOwotCi0JLyoqCi0JICogVHJhbnNmb3JtcyB0aGUgaHRtbCB0ZXh0IGZyb20gdGhlIHJlYWRlciB0byBmb3JtYXR0ZWQgdGV4dC4KLQkgKiBAcGFyYW0gcHJlc2VudGF0aW9uIElmIG5vdCA8Y29kZT5udWxsPC9jb2RlPiwgZm9ybWF0dGluZ3Mgd2lsbCBiZSBhcHBsaWVkIHRvCi0JICogdGhlIHByZXNlbnRhdGlvbi4KLQkqLwotCXB1YmxpYyBIVE1MMlRleHRSZWFkZXIoUmVhZGVyIHJlYWRlciwgVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24pIHsKLQkJc3VwZXIobmV3IFB1c2hiYWNrUmVhZGVyKHJlYWRlcikpOwotCQlmVGV4dFByZXNlbnRhdGlvbj0gcHJlc2VudGF0aW9uOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjPSBzdXBlci5yZWFkKCk7Ci0JCWlmIChjICE9IC0xKQotCQkJKysgZkNvdW50ZXI7Ci0JCXJldHVybiBjOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0YXJ0Qm9sZCgpIHsKLQkJaWYgKGZCb2xkID09IDApCi0JCQlmU3RhcnRPZmZzZXQ9IGZDb3VudGVyOwotCQkrKyBmQm9sZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdGFydFByZWZvcm1hdHRlZFRleHQoKSB7Ci0JCWZJc1ByZWZvcm1hdHRlZFRleHQ9IHRydWU7Ci0JCXNldFNraXBXaGl0ZXNwYWNlKGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9wUHJlZm9ybWF0dGVkVGV4dCgpIHsKLQkJZklzUHJlZm9ybWF0dGVkVGV4dD0gZmFsc2U7Ci0JCXNldFNraXBXaGl0ZXNwYWNlKHRydWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3BCb2xkKCkgewotCQktLSBmQm9sZDsKLQkJaWYgKGZCb2xkID09IDApIHsKLQkJCWlmIChmVGV4dFByZXNlbnRhdGlvbiAhPSBudWxsKSB7Ci0JCQkJZlRleHRQcmVzZW50YXRpb24uYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShmU3RhcnRPZmZzZXQsIGZDb3VudGVyIC0gZlN0YXJ0T2Zmc2V0LCBudWxsLCBudWxsLCBTV1QuQk9MRCkpOwotCQkJfQotCQkJZlN0YXJ0T2Zmc2V0PSAtMTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5TdWJzdGl0dXRpb25UZXh0UmVhZGVyI2NvbXB1dGVTdWJzdGl0dXRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZVN1YnN0aXR1dGlvbihpbnQgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlpZiAoYyA9PSAnPCcpCi0JCQlyZXR1cm4gIHByb2Nlc3NIVE1MVGFnKCk7Ci0JCWVsc2UgaWYgKGMgPT0gJyYnKQotCQkJcmV0dXJuIHByb2Nlc3NFbnRpdHkoKTsKLQkJZWxzZSBpZiAoZklzUHJlZm9ybWF0dGVkVGV4dCkKLQkJCXJldHVybiBwcm9jZXNzUHJlZm9ybWF0dGVkVGV4dChjKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBodG1sMlRleHQoU3RyaW5nIGh0bWwpIHsKLQotCQlpZiAoaHRtbCA9PSBudWxsIHx8IGh0bWwubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0KLQkJU3RyaW5nIHRhZz0gaHRtbDsKLQkJaWYgKCcvJyA9PSB0YWcuY2hhckF0KDApKQotCQkJdGFnPSB0YWcuc3Vic3RyaW5nKDEpOwotCi0JCWlmICghZmdUYWdzLmNvbnRhaW5zKHRhZykpCi0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCi0KLQkJaWYgKCJwcmUiLmVxdWFscyhodG1sKSkgeyAvLyROT04tTkxTLTEkCi0JCQlzdGFydFByZWZvcm1hdHRlZFRleHQoKTsKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCX0KLQotCQlpZiAoIi9wcmUiLmVxdWFscyhodG1sKSkgeyAvLyROT04tTkxTLTEkCi0JCQlzdG9wUHJlZm9ybWF0dGVkVGV4dCgpOwotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJfQotCi0JCWlmIChmSXNQcmVmb3JtYXR0ZWRUZXh0KQotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQotCQlpZiAoImIiLmVxdWFscyhodG1sKSkgeyAvLyROT04tTkxTLTEkCi0JCQlzdGFydEJvbGQoKTsKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCX0KLQotCQlpZiAoImg1Ii5lcXVhbHMoaHRtbCkgfHwgImR0Ii5lcXVhbHMoaHRtbCkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlzdGFydEJvbGQoKTsKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCX0KLQotCQlpZiAoImRsIi5lcXVhbHMoaHRtbCkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBMSU5FX0RFTElNOwotCi0JCWlmICgiZGQiLmVxdWFscyhodG1sKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuICJcdCI7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoImxpIi5lcXVhbHMoaHRtbCkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBMSU5FX0RFTElNICsgIlx0IiArICItICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWlmICgiL2IiLmVxdWFscyhodG1sKSkgeyAvLyROT04tTkxTLTEkCi0JCQlzdG9wQm9sZCgpOwotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJfQotCi0JCWlmICgicCIuZXF1YWxzKGh0bWwpKSAgeyAvLyROT04tTkxTLTEkCi0JCQlmSW5QYXJhZ3JhcGg9IHRydWU7Ci0JCQlyZXR1cm4gTElORV9ERUxJTTsKLQkJfQotCi0JCWlmICgiYnIiLmVxdWFscyhodG1sKSB8fCAiYnIvIi5lcXVhbHMoaHRtbCkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIExJTkVfREVMSU07Ci0KLQkJaWYgKCIvcCIuZXF1YWxzKGh0bWwpKSAgeyAvLyROT04tTkxTLTEkCi0JCQlib29sZWFuIGluUGFyYWdyYXBoPSBmSW5QYXJhZ3JhcGg7Ci0JCQlmSW5QYXJhZ3JhcGg9IGZhbHNlOwotCQkJcmV0dXJuIGluUGFyYWdyYXBoID8gRU1QVFlfU1RSSU5HIDogTElORV9ERUxJTTsKLQkJfQotCi0JCWlmICgiL2g1Ii5lcXVhbHMoaHRtbCkgfHwgIi9kdCIuZXF1YWxzKGh0bWwpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJc3RvcEJvbGQoKTsKLQkJCXJldHVybiBMSU5FX0RFTElNOwotCQl9Ci0KLQkJaWYgKCIvZGQiLmVxdWFscyhodG1sKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIExJTkVfREVMSU07Ci0KLQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQl9Ci0KLQkvKgotCSAqIEEgJzwnIGhhcyBiZWVuIHJlYWQuIFByb2Nlc3MgYSBodG1sIHRhZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIHByb2Nlc3NIVE1MVGFnKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlTdHJpbmdCdWZmZXIgYnVmPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBjaDsKLQkJZG8gewotCi0JCQljaD0gbmV4dENoYXIoKTsKLQotCQkJd2hpbGUgKGNoICE9IC0xICYmIGNoICE9ICc+JykgewotCQkJCWJ1Zi5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKChjaGFyKSBjaCkpOwotCQkJCWNoPSBuZXh0Q2hhcigpOwotCQkJCWlmIChjaCA9PSAnIicpewotCQkJCQlidWYuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZSgoY2hhcikgY2gpKTsKLQkJCQkJY2g9IG5leHRDaGFyKCk7Ci0JCQkJCXdoaWxlIChjaCAhPSAtMSAmJiBjaCAhPSAnIicpewotCQkJCQkJYnVmLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoKGNoYXIpIGNoKSk7Ci0JCQkJCQljaD0gbmV4dENoYXIoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoY2ggPT0gJzwnKXsKLQkJCQkJdW5yZWFkKGNoKTsKLQkJCQkJcmV0dXJuICc8JyArIGJ1Zi50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNoID09IC0xKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlpbnQgdGFnTGVuPSBidWYubGVuZ3RoKCk7Ci0JCQkvLyBuZWVkcyBzcGVjaWFsIHRyZWF0bWVudCBmb3IgY29tbWVudHMKLQkJCWlmICgodGFnTGVuID49IDMgJiYgIiEtLSIuZXF1YWxzKGJ1Zi5zdWJzdHJpbmcoMCwgMykpKSAvLyROT04tTkxTLTEkCi0JCQkJJiYgISh0YWdMZW4gPj0gNSAmJiAiLS0iLmVxdWFscyhidWYuc3Vic3RyaW5nKHRhZ0xlbiAtIDIpKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIHVuZmluaXNoZWQgY29tbWVudAotCQkJCWJ1Zi5hcHBlbmQoY2gpOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSB3aGlsZSAodHJ1ZSk7Ci0KLQkJcmV0dXJuIGh0bWwyVGV4dChidWYudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc1ByZWZvcm1hdHRlZFRleHQoaW50IGMpIHsKLQkJaWYgIChjID09ICdccicgfHwgYyA9PSAnXG4nKQotCQkJZkNvdW50ZXIrKzsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgdW5yZWFkKGludCBjaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJKChQdXNoYmFja1JlYWRlcikgZ2V0UmVhZGVyKCkpLnVucmVhZChjaCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBlbnRpdHkyVGV4dChTdHJpbmcgc3ltYm9sKSB7Ci0JCWlmIChzeW1ib2wubGVuZ3RoKCkgPiAxICYmIHN5bWJvbC5jaGFyQXQoMCkgPT0gJyMnKSB7Ci0JCQlpbnQgY2g7Ci0JCQl0cnkgewotCQkJCWlmIChzeW1ib2wuY2hhckF0KDEpID09ICd4JykgewotCQkJCQljaD0gSW50ZWdlci5wYXJzZUludChzeW1ib2wuc3Vic3RyaW5nKDIpLCAxNik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2g9IEludGVnZXIucGFyc2VJbnQoc3ltYm9sLnN1YnN0cmluZygxKSwgMTApOwotCQkJCX0KLQkJCQlyZXR1cm4gRU1QVFlfU1RSSU5HICsgKGNoYXIpY2g7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyBwcm9ibGVtPwotCQkJfQotCQl9IGVsc2UgewotCQkJU3RyaW5nIHN0cj0gKFN0cmluZykgZmdFbnRpdHlMb29rdXAuZ2V0KHN5bWJvbCk7Ci0JCQlpZiAoc3RyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gc3RyOwotCQkJfQotCQl9Ci0JCXJldHVybiAiJiIgKyBzeW1ib2w7IC8vIG5vdCBmb3VuZCAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiBBICcmJyBoYXMgYmVlbiByZWFkLiBQcm9jZXNzIGEgZW50aXR5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc0VudGl0eSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBidWY9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGNoPSBuZXh0Q2hhcigpOwotCQl3aGlsZSAoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdCgoY2hhciljaCkgfHwgY2ggPT0gJyMnKSB7Ci0JCQlidWYuYXBwZW5kKChjaGFyKSBjaCk7Ci0JCQljaD0gbmV4dENoYXIoKTsKLQkJfQotCi0JCWlmIChjaCA9PSAnOycpCi0JCQlyZXR1cm4gZW50aXR5MlRleHQoYnVmLnRvU3RyaW5nKCkpOwotCi0JCWJ1Zi5pbnNlcnQoMCwgJyYnKTsKLQkJaWYgKGNoICE9IC0xKQotCQkJYnVmLmFwcGVuZCgoY2hhcikgY2gpOwotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvSFRNTFRleHRQcmVzZW50ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZXJpdmVkL0hUTUxUZXh0UHJlc2VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NmIyZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvSFRNTFRleHRQcmVzZW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZXJpdmVkOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRHJhd2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5IVE1MVGV4dFByZXNlbnRlcgotICogTW9kaWZpY2F0aW9ucyB3ZXJlIG1hZGUgdG8gdXNlIG93biBMb2dnZXIgdG8gbG9nIGV4Y2VwdGlvbiwgYW5kIHRoZQotICogZWxsaXBzZXMgY29uc3RhbnQKLSAqLwotcHVibGljIGNsYXNzIEhUTUxUZXh0UHJlc2VudGVyIGltcGxlbWVudHMgRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbC5JSW5mb3JtYXRpb25QcmVzZW50ZXIsIERlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2wuSUluZm9ybWF0aW9uUHJlc2VudGVyRXh0ZW5zaW9uIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxMSVBTRVMgPSAiLi4uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0RFTElNID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgaW50IGZDb3VudGVyOwotCXByaXZhdGUgYm9vbGVhbiBmRW5mb3JjZVVwcGVyTGluZUxpbWl0OwotCi0JcHVibGljIEhUTUxUZXh0UHJlc2VudGVyKGJvb2xlYW4gZW5mb3JjZVVwcGVyTGluZUxpbWl0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZFbmZvcmNlVXBwZXJMaW5lTGltaXQgPSBlbmZvcmNlVXBwZXJMaW5lTGltaXQ7Ci0JfQotCi0JcHVibGljIEhUTUxUZXh0UHJlc2VudGVyKCkgewotCQl0aGlzKHRydWUpOwotCX0KLQotCXByb3RlY3RlZCBSZWFkZXIgY3JlYXRlUmVhZGVyKFN0cmluZyBob3ZlckluZm8sIFRleHRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgSFRNTDJUZXh0UmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoaG92ZXJJbmZvKSwgcHJlc2VudGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGFwdFRleHRQcmVzZW50YXRpb24oVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24sIGludCBvZmZzZXQsIGludCBpbnNlcnRMZW5ndGgpIHsKLQotCQlpbnQgeW91cnNTdGFydCA9IG9mZnNldDsKLQkJaW50IHlvdXJzRW5kID0gb2Zmc2V0ICsgaW5zZXJ0TGVuZ3RoIC0gMTsKLQkJeW91cnNFbmQgPSBNYXRoLm1heCh5b3Vyc1N0YXJ0LCB5b3Vyc0VuZCk7Ci0KLQkJSXRlcmF0b3IgZSA9IHByZXNlbnRhdGlvbi5nZXRBbGxTdHlsZVJhbmdlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0KLQkJCVN0eWxlUmFuZ2UgcmFuZ2UgPSAoU3R5bGVSYW5nZSkgZS5uZXh0KCk7Ci0KLQkJCWludCBteVN0YXJ0ID0gcmFuZ2Uuc3RhcnQ7Ci0JCQlpbnQgbXlFbmQgPSByYW5nZS5zdGFydCArIHJhbmdlLmxlbmd0aCAtIDE7Ci0JCQlteUVuZCA9IE1hdGgubWF4KG15U3RhcnQsIG15RW5kKTsKLQotCQkJaWYgKG15RW5kIDwgeW91cnNTdGFydCkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKG15U3RhcnQgPCB5b3Vyc1N0YXJ0KQotCQkJCXJhbmdlLmxlbmd0aCArPSBpbnNlcnRMZW5ndGg7Ci0JCQllbHNlCi0JCQkJcmFuZ2Uuc3RhcnQgKz0gaW5zZXJ0TGVuZ3RoOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZChTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgc3RyaW5nLCBUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbikgewotCi0JCWludCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3RyaW5nKTsKLQotCQlpZiAocHJlc2VudGF0aW9uICE9IG51bGwpCi0JCQlhZGFwdFRleHRQcmVzZW50YXRpb24ocHJlc2VudGF0aW9uLCBmQ291bnRlciwgbGVuZ3RoKTsKLQotCQlmQ291bnRlciArPSBsZW5ndGg7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50KFN0cmluZyBsaW5lKSB7Ci0JCWludCBsZW5ndGggPSBsaW5lLmxlbmd0aCgpOwotCi0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCBsZW5ndGggJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShsaW5lLmNoYXJBdChpKSkpCi0JCQkrK2k7Ci0KLQkJcmV0dXJuIChpID09IGxlbmd0aCA/IGxpbmUgOiBsaW5lLnN1YnN0cmluZygwLCBpKSkgKyAiICI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElIb3ZlckluZm9ybWF0aW9uUHJlc2VudGVyI3VwZGF0ZVByZXNlbnRhdGlvbihEaXNwbGF5IGRpc3BsYXksCi0JICogICAgICBTdHJpbmcsIFRleHRQcmVzZW50YXRpb24sIGludCwgaW50KQotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3VwZGF0ZVByZXNlbnRhdGlvbihEcmF3YWJsZSwgU3RyaW5nLCBUZXh0UHJlc2VudGF0aW9uLCBpbnQsIGludCl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdXBkYXRlUHJlc2VudGF0aW9uKERpc3BsYXkgZGlzcGxheSwgU3RyaW5nIGhvdmVySW5mbywgVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24sIGludCBtYXhXaWR0aCwgaW50IG1heEhlaWdodCkgewotCQlyZXR1cm4gdXBkYXRlUHJlc2VudGF0aW9uKChEcmF3YWJsZSlkaXNwbGF5LCBob3ZlckluZm8sIHByZXNlbnRhdGlvbiwgbWF4V2lkdGgsIG1heEhlaWdodCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElIb3ZlckluZm9ybWF0aW9uUHJlc2VudGVyRXh0ZW5zaW9uI3VwZGF0ZVByZXNlbnRhdGlvbihEcmF3YWJsZSBkcmF3YWJsZSwgU3RyaW5nLCBUZXh0UHJlc2VudGF0aW9uLCBpbnQsIGludCkKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIFN0cmluZyB1cGRhdGVQcmVzZW50YXRpb24oRHJhd2FibGUgZHJhd2FibGUsIFN0cmluZyBob3ZlckluZm8sIFRleHRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uLCBpbnQgbWF4V2lkdGgsIGludCBtYXhIZWlnaHQpIHsKLQotCQlpZiAoaG92ZXJJbmZvID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlHQyBnYyA9IG5ldyBHQyhkcmF3YWJsZSk7Ci0JCXRyeSB7Ci0KLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpbnQgbWF4TnVtYmVyT2ZMaW5lcyA9IE1hdGgucm91bmQobWF4SGVpZ2h0IC8gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKSk7Ci0KLQkJCWZDb3VudGVyID0gMDsKLQkJCUxpbmVCcmVha2luZ1JlYWRlciByZWFkZXIgPSBuZXcgTGluZUJyZWFraW5nUmVhZGVyKGNyZWF0ZVJlYWRlcihob3ZlckluZm8sIHByZXNlbnRhdGlvbiksIGdjLCBtYXhXaWR0aCk7Ci0KLQkJCWJvb2xlYW4gbGFzdExpbmVGb3JtYXR0ZWQgPSBmYWxzZTsKLQkJCVN0cmluZyBsYXN0TGluZUluZGVudCA9IG51bGw7Ci0KLQkJCVN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQlib29sZWFuIGxpbmVGb3JtYXR0ZWQgPSByZWFkZXIuaXNGb3JtYXR0ZWRMaW5lKCk7Ci0JCQlib29sZWFuIGZpcnN0TGluZVByb2Nlc3NlZCA9IGZhbHNlOwotCi0JCQl3aGlsZSAobGluZSAhPSBudWxsKSB7Ci0KLQkJCQlpZiAoZkVuZm9yY2VVcHBlckxpbmVMaW1pdCAmJiBtYXhOdW1iZXJPZkxpbmVzIDw9IDApCi0JCQkJCWJyZWFrOwotCi0JCQkJaWYgKGZpcnN0TGluZVByb2Nlc3NlZCkgewotCQkJCQlpZiAoIWxhc3RMaW5lRm9ybWF0dGVkKQotCQkJCQkJYXBwZW5kKGJ1ZmZlciwgTElORV9ERUxJTSwgbnVsbCk7Ci0JCQkJCWVsc2UgewotCQkJCQkJYXBwZW5kKGJ1ZmZlciwgTElORV9ERUxJTSwgcHJlc2VudGF0aW9uKTsKLQkJCQkJCWlmIChsYXN0TGluZUluZGVudCAhPSBudWxsKQotCQkJCQkJCWFwcGVuZChidWZmZXIsIGxhc3RMaW5lSW5kZW50LCBwcmVzZW50YXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJYXBwZW5kKGJ1ZmZlciwgbGluZSwgbnVsbCk7Ci0JCQkJZmlyc3RMaW5lUHJvY2Vzc2VkID0gdHJ1ZTsKLQotCQkJCWxhc3RMaW5lRm9ybWF0dGVkID0gbGluZUZvcm1hdHRlZDsKLQkJCQlpZiAoIWxpbmVGb3JtYXR0ZWQpCi0JCQkJCWxhc3RMaW5lSW5kZW50ID0gbnVsbDsKLQkJCQllbHNlIGlmIChsYXN0TGluZUluZGVudCA9PSBudWxsKQotCQkJCQlsYXN0TGluZUluZGVudCA9IGdldEluZGVudChsaW5lKTsKLQotCQkJCWxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJCQlsaW5lRm9ybWF0dGVkID0gcmVhZGVyLmlzRm9ybWF0dGVkTGluZSgpOwotCi0JCQkJbWF4TnVtYmVyT2ZMaW5lcy0tOwotCQkJfQotCi0JCQlpZiAobGluZSAhPSBudWxsICYmIGJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLQkJCQlhcHBlbmQoYnVmZmVyLCBMSU5FX0RFTElNLCBsaW5lRm9ybWF0dGVkID8gcHJlc2VudGF0aW9uIDogbnVsbCk7Ci0JCQkJYXBwZW5kKGJ1ZmZlciwgRUxMSVBTRVMsIHByZXNlbnRhdGlvbik7Ci0JCQl9Ci0KLQkJCXJldHVybiB0cmltKGJ1ZmZlciwgcHJlc2VudGF0aW9uKTsKLQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQotCQl9IGZpbmFsbHkgewotCQkJZ2MuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgdHJpbShTdHJpbmdCdWZmZXIgYnVmZmVyLCBUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbikgewotCi0JCWludCBsZW5ndGggPSBidWZmZXIubGVuZ3RoKCk7Ci0KLQkJaW50IGVuZCA9IGxlbmd0aCAtIDE7Ci0JCXdoaWxlIChlbmQgPj0gMCAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGJ1ZmZlci5jaGFyQXQoZW5kKSkpCi0JCQktLWVuZDsKLQotCQlpZiAoZW5kID09IC0xKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGVuZCA8IGxlbmd0aCAtIDEpCi0JCQlidWZmZXIuZGVsZXRlKGVuZCArIDEsIGxlbmd0aCk7Ci0JCWVsc2UKLQkJCWVuZCA9IGxlbmd0aDsKLQotCQlpbnQgc3RhcnQgPSAwOwotCQl3aGlsZSAoc3RhcnQgPCBlbmQgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShidWZmZXIuY2hhckF0KHN0YXJ0KSkpCi0JCQkrK3N0YXJ0OwotCi0JCWJ1ZmZlci5kZWxldGUoMCwgc3RhcnQpOwotCQlwcmVzZW50YXRpb24uc2V0UmVzdWx0V2luZG93KG5ldyBSZWdpb24oc3RhcnQsIGJ1ZmZlci5sZW5ndGgoKSkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvTGluZUJyZWFraW5nUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9MaW5lQnJlYWtpbmdSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhNTQ0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9MaW5lQnJlYWtpbmdSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZXJpdmVkOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQnJlYWtJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLQotLyoqCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5MaW5lQnJlYWtpbmdSZWFkZXIuCi0gKiBNb2RpZmljYXRpb25zIHdlcmUgbWFkZSB0byBmaXggd2FybmluZ3MuCi0gKi8KLS8qCi0gKiBOb3QgYSByZWFsIHJlYWRlci4gQ291bGQgY2hhbmdlIGlmIHJlcXVlc3RlZAotICovCi1wdWJsaWMgY2xhc3MgTGluZUJyZWFraW5nUmVhZGVyIHsKLQlwcml2YXRlIEdDIGZHQzsKLQotCXByaXZhdGUgU3RyaW5nIGZMaW5lOwotCi0JcHJpdmF0ZSBCcmVha0l0ZXJhdG9yIGZMaW5lQnJlYWtJdGVyYXRvcjsKLQlwcml2YXRlIGludCBmTWF4V2lkdGg7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldDsKLQotCi0JcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBmUmVhZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJlYWRlciB0aGF0IGJyZWFrcyBhbiBpbnB1dCB0ZXh0IHRvIGZpdCBpbiBhIGdpdmVuIHdpZHRoLgotCSAqIAotCSAqIEBwYXJhbSByZWFkZXIKLQkgKiAgICAgICAgICAgIFJlYWRlciBvZiB0aGUgaW5wdXQgdGV4dAotCSAqIEBwYXJhbSBnYwotCSAqICAgICAgICAgICAgVGhlIGdyYXBoaWMgY29udGV4dCB0aGF0IGRlZmluZXMgdGhlIGN1cnJlbnRseSB1c2VkIGZvbnQKLQkgKiAgICAgICAgICAgIHNpemVzCi0JICogQHBhcmFtIG1heExpbmVXaWR0aAotCSAqICAgICAgICAgICAgVGhlIG1heCB3aWR0aCAocGl4ZXMpIHdoZXJlIHRoZSB0ZXh0IGhhcyB0byBmaXQgaW4KLQkgKi8KLQlwdWJsaWMgTGluZUJyZWFraW5nUmVhZGVyKFJlYWRlciByZWFkZXIsIEdDIGdjLCBpbnQgbWF4TGluZVdpZHRoKSB7Ci0JCWZSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIocmVhZGVyKTsKLQkJZkdDID0gZ2M7Ci0JCWZNYXhXaWR0aCA9IG1heExpbmVXaWR0aDsKLQkJZk9mZnNldCA9IDA7Ci0JCWZMaW5lID0gbnVsbDsKLQkJZkxpbmVCcmVha0l0ZXJhdG9yID0gQnJlYWtJdGVyYXRvci5nZXRMaW5lSW5zdGFuY2UoKTsKLQl9Ci0KLQlwcml2YXRlIGludCBmaW5kTmV4dEJyZWFrT2Zmc2V0KGludCBjdXJyT2Zmc2V0KSB7Ci0JCWludCBjdXJyV2lkdGggPSAwOwotCQlpbnQgbmV4dE9mZnNldCA9IGZMaW5lQnJlYWtJdGVyYXRvci5mb2xsb3dpbmcoY3Vyck9mZnNldCk7Ci0JCXdoaWxlIChuZXh0T2Zmc2V0ICE9IEJyZWFrSXRlcmF0b3IuRE9ORSkgewotCQkJU3RyaW5nIHdvcmQgPSBmTGluZS5zdWJzdHJpbmcoY3Vyck9mZnNldCwgbmV4dE9mZnNldCk7Ci0JCQlpbnQgd29yZFdpZHRoID0gZkdDLnRleHRFeHRlbnQod29yZCkueDsKLQkJCWludCBuZXh0V2lkdGggPSB3b3JkV2lkdGggKyBjdXJyV2lkdGg7Ci0JCQlpZiAobmV4dFdpZHRoID4gZk1heFdpZHRoKSB7Ci0JCQkJaWYgKGN1cnJXaWR0aCA+IDApIHsKLQkJCQkJcmV0dXJuIGN1cnJPZmZzZXQ7Ci0JCQkJfQotCQkJCXJldHVybiBuZXh0T2Zmc2V0OwotCQkJfQotCQkJY3VycldpZHRoID0gbmV4dFdpZHRoOwotCQkJY3Vyck9mZnNldCA9IG5leHRPZmZzZXQ7Ci0JCQluZXh0T2Zmc2V0ID0gZkxpbmVCcmVha0l0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQlyZXR1cm4gbmV4dE9mZnNldDsKLQl9Ci0KLQlwcml2YXRlIGludCBmaW5kV29yZEJlZ2luKGludCBpZHgpIHsKLQkJd2hpbGUgKGlkeCA8IGZMaW5lLmxlbmd0aCgpICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoZkxpbmUuY2hhckF0KGlkeCkpKSB7Ci0JCQlpZHgrKzsKLQkJfQotCQlyZXR1cm4gaWR4OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRm9ybWF0dGVkTGluZSgpIHsKLQkJcmV0dXJuIGZMaW5lICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVhZHMgdGhlIG5leHQgbGluZS4gVGhlIGxlbmd0aHMgb2YgdGhlIGxpbmUgd2lsbCBub3QgZXhjZWVkIHRoZSBnaXZlZAotCSAqIG1heGltdW0gd2lkdGguCi0JICovCi0JcHVibGljIFN0cmluZyByZWFkTGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmTGluZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgbGluZSA9IGZSZWFkZXIucmVhZExpbmUoKTsKLQkJCWlmIChsaW5lID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCWludCBsaW5lTGVuID0gZkdDLnRleHRFeHRlbnQobGluZSkueDsKLQkJCWlmIChsaW5lTGVuIDwgZk1heFdpZHRoKSB7Ci0JCQkJcmV0dXJuIGxpbmU7Ci0JCQl9Ci0JCQlmTGluZSA9IGxpbmU7Ci0JCQlmTGluZUJyZWFrSXRlcmF0b3Iuc2V0VGV4dChsaW5lKTsKLQkJCWZPZmZzZXQgPSAwOwotCQl9Ci0JCWludCBicmVha09mZnNldCA9IGZpbmROZXh0QnJlYWtPZmZzZXQoZk9mZnNldCk7Ci0JCVN0cmluZyByZXM7Ci0JCWlmIChicmVha09mZnNldCAhPSBCcmVha0l0ZXJhdG9yLkRPTkUpIHsKLQkJCXJlcyA9IGZMaW5lLnN1YnN0cmluZyhmT2Zmc2V0LCBicmVha09mZnNldCk7Ci0JCQlmT2Zmc2V0ID0gZmluZFdvcmRCZWdpbihicmVha09mZnNldCk7Ci0JCQlpZiAoZk9mZnNldCA9PSBmTGluZS5sZW5ndGgoKSkgewotCQkJCWZMaW5lID0gbnVsbDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlcyA9IGZMaW5lLnN1YnN0cmluZyhmT2Zmc2V0KTsKLQkJCWZMaW5lID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5NDVmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9TaW5nbGVDaGFyUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZXJpdmVkOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotLyoKLSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQuamF2YWRvYy5TaW5nbGVDaGFyUmVhZGVyLgotICogTW9kaWZpY2F0aW9uIHdhcyBtYWRlIHRvIGZpeCBzdGF0ZW1lbnQgdW5uZWNlc3NhcmlseSBuZXN0ZWQgd2l0aGluIGVsc2UKLSAqIGNsYXVzZSB3YXJuaW5nIGluIHJlYWQoLi4pLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2luZ2xlQ2hhclJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkKGNoYXJbXSxpbnQsaW50KQotCSAqLwotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNidWZbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGVuZCA9IG9mZiArIGxlbjsKLQkJZm9yIChpbnQgaSA9IG9mZjsgaSA8IGVuZDsgaSsrKSB7Ci0JCQlpbnQgY2ggPSByZWFkKCk7Ci0JCQlpZiAoY2ggPT0gLTEpIHsKLQkJCQlpZiAoaSA9PSBvZmYpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlyZXR1cm4gaSAtIG9mZjsKLQkJCX0KLQkJCWNidWZbaV0gPSAoY2hhcikgY2g7Ci0JCX0KLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkeSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb250ZW50IGFzIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgY2g7Ci0JCXdoaWxlICgoY2ggPSByZWFkKCkpICE9IC0xKSB7Ci0JCQlidWYuYXBwZW5kKChjaGFyKSBjaCk7Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZXJpdmVkL1N1YnN0aXR1dGlvblRleHRSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZXJpdmVkL1N1YnN0aXR1dGlvblRleHRSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQyYTc4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9TdWJzdGl0dXRpb25UZXh0UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVyaXZlZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLS8qCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5TdWJzdGl0dXRpb25UZXh0UmVhZGVyLgotICogTW9kaWZpY2F0aW9ucyB3ZXJlIG1hZGUgdG8gcmVhZCgpIHRvIGFsbG93IHdoaXRlc3BhY2VzIGFuZCBmaXhlZCBzdGF0ZW1lbnQKLSAqIHVubmVjZXNzYXJpbHkgbmVzdGVkIHdpdGhpbiBlbHNlIGNsYXVzZSB3YXJuaW5nIGluIG5leHRDaGFyKCkKLSAqLwotLyoqCi0gKiBSZWFkcyB0aGUgdGV4dCBjb250ZW50cyBmcm9tIGEgcmVhZGVyIGFuZCBjb21wdXRlcyBmb3IgZWFjaCBjaGFyYWN0ZXIgYQotICogcG90ZW50aWFsIHN1YnN0aXR1dGlvbi4gVGhlIHN1YnN0aXR1dGlvbiBtYXkgZWF0IG1vcmUgY2hhcmFjdGVycyB0aGFuIG9ubHkKLSAqIHRoZSBvbmUgcGFzc2VkIGludG8gdGhlIGNvbXB1dGF0aW9uIHJvdXRpbmUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdWJzdGl0dXRpb25UZXh0UmVhZGVyIGV4dGVuZHMgU2luZ2xlQ2hhclJlYWRlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0RFTElNID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgUmVhZGVyIGZSZWFkZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZldhc1doaXRlU3BhY2U7Ci0JcHJpdmF0ZSBpbnQgZkNoYXJBZnRlcldoaXRlU3BhY2U7Ci0KLQkvKioKLQkgKiBUZWxscyB3aGV0aGVyIHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMgYXJlIHNraXBwZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZTa2lwV2hpdGVTcGFjZSA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlJlYWRGcm9tQnVmZmVyOwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZCdWZmZXI7Ci0JcHJpdmF0ZSBpbnQgZkluZGV4OwotCi0KLQlwcm90ZWN0ZWQgU3Vic3RpdHV0aW9uVGV4dFJlYWRlcihSZWFkZXIgcmVhZGVyKSB7Ci0JCWZSZWFkZXIgPSByZWFkZXI7Ci0JCWZCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZJbmRleCA9IDA7Ci0JCWZSZWFkRnJvbUJ1ZmZlciA9IGZhbHNlOwotCQlmQ2hhckFmdGVyV2hpdGVTcGFjZSA9IC0xOwotCQlmV2FzV2hpdGVTcGFjZSA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50IHRvIGNvbXB1dGUgdGhlIHN1YnN0aXR1dGlvbiBmb3IgdGhlIGdpdmVuIGNoYXJhY3RlciBhbmQgaWYKLQkgKiBuZWNlc3Nhcnkgc3Vic2VxdWVudCBjaGFyYWN0ZXJzLiBVc2UgPGNvZGU+bmV4dENoYXI8L2NvZGU+IHRvIHJlYWQKLQkgKiBzdWJzZXF1ZW50IGNoYXJhY3RlcnMuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBjb21wdXRlU3Vic3RpdHV0aW9uKGludCBjKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnRlcm5hbCByZWFkZXIuCi0JICovCi0JcHJvdGVjdGVkIFJlYWRlciBnZXRSZWFkZXIoKSB7Ci0JCXJldHVybiBmUmVhZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5leHQgY2hhcmFjdGVyLgotCSAqLwotCXByb3RlY3RlZCBpbnQgbmV4dENoYXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmUmVhZEZyb21CdWZmZXIgPSAoZkJ1ZmZlci5sZW5ndGgoKSA+IDApOwotCQlpZiAoZlJlYWRGcm9tQnVmZmVyKSB7Ci0JCQljaGFyIGNoID0gZkJ1ZmZlci5jaGFyQXQoZkluZGV4KyspOwotCQkJaWYgKGZJbmRleCA+PSBmQnVmZmVyLmxlbmd0aCgpKSB7Ci0JCQkJZkJ1ZmZlci5zZXRMZW5ndGgoMCk7Ci0JCQkJZkluZGV4ID0gMDsKLQkJCX0KLQkJCXJldHVybiBjaDsKLQkJfQotCQlpbnQgY2ggPSBmQ2hhckFmdGVyV2hpdGVTcGFjZTsKLQkJaWYgKGNoID09IC0xKSB7Ci0JCQljaCA9IGZSZWFkZXIucmVhZCgpOwotCQl9Ci0JCWlmIChmU2tpcFdoaXRlU3BhY2UgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSgoY2hhcikgY2gpKSB7Ci0JCQlkbyB7Ci0JCQkJY2ggPSBmUmVhZGVyLnJlYWQoKTsKLQkJCX0gd2hpbGUgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpIGNoKSk7Ci0JCQlpZiAoY2ggIT0gLTEpIHsKLQkJCQlmQ2hhckFmdGVyV2hpdGVTcGFjZSA9IGNoOwotCQkJCXJldHVybiAnICc7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmQ2hhckFmdGVyV2hpdGVTcGFjZSA9IC0xOwotCQl9Ci0JCXJldHVybiBjaDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgYzsKLQkJZG8gewotCi0JCQljID0gbmV4dENoYXIoKTsKLQkJCXdoaWxlICghZlJlYWRGcm9tQnVmZmVyKSB7Ci0JCQkJU3RyaW5nIHMgPSBjb21wdXRlU3Vic3RpdHV0aW9uKGMpOwotCQkJCWlmIChzID09IG51bGwpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChzLmxlbmd0aCgpID4gMCkKLQkJCQkJZkJ1ZmZlci5pbnNlcnQoMCwgcyk7Ci0JCQkJYyA9IG5leHRDaGFyKCk7Ci0JCQl9Ci0KLQkJfSB3aGlsZSAoZlNraXBXaGl0ZVNwYWNlICYmIGZXYXNXaGl0ZVNwYWNlICYmICgoYyA9PSAnICcpICYmICFmUmVhZEZyb21CdWZmZXIpKTsKLQkJLyoKLQkJICogU1NFOiBGb3IgYWJvdmUgYW5kIGJlbG93IGNoZWNrLCBpZiB3aGl0ZXNwYWNlIGlzIHJlYWQgZnJvbSBidWZmZXIsCi0JCSAqIGRvIG5vdCBza2lwCi0JCSAqLwotCQlmV2FzV2hpdGVTcGFjZSA9ICgoYyA9PSAnICcgJiYgIWZSZWFkRnJvbUJ1ZmZlcikgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1xuJyk7Ci0JCXJldHVybiBjOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI3JlYWR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBmUmVhZGVyLnJlYWR5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZlJlYWRlci5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZSZWFkZXIucmVzZXQoKTsKLQkJZldhc1doaXRlU3BhY2UgPSB0cnVlOwotCQlmQ2hhckFmdGVyV2hpdGVTcGFjZSA9IC0xOwotCQlmQnVmZmVyLnNldExlbmd0aCgwKTsKLQkJZkluZGV4ID0gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRTa2lwV2hpdGVzcGFjZShib29sZWFuIHN0YXRlKSB7Ci0JCWZTa2lwV2hpdGVTcGFjZSA9IHN0YXRlOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzU2tpcHBpbmdXaGl0ZXNwYWNlKCkgewotCQlyZXR1cm4gZlNraXBXaGl0ZVNwYWNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0L3V0aWwvU2hhcmVkRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0L3V0aWwvU2hhcmVkRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E5YjBjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdC91dGlsL1NoYXJlZEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlczsKLQotCi1wdWJsaWMgY2xhc3MgU2hhcmVkRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX0NPTExBUFNFQUxMID0gRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19ETENMX0NPTExBUFNFQUxMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX0RFTEVURSA9IEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRExDTF9ERUxFVEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfU1lOQ0VEID0gRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19ETENMX1NZTkNFRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9DT0xMQVBTRUFMTCA9IEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRUxDTF9DT0xMQVBTRUFMTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9ERUxFVEUgPSBFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VMQ0xfREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX1NZTkNFRCA9IEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRUxDTF9TWU5DRUQ7Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHNwZWNpZmllZCBpbWFnZSBmcm9tIHRoZSBzb3VyY2UgZWRpdG9yIHBsdWdpbidzIGltYWdlCi0JICogcmVnaXN0cnkuIE5vdGU6IFRoZSByZXR1cm5lZCA8Y29kZT5JbWFnZTwvY29kZT4gaXMgbWFuYWdlZCBieSB0aGUKLQkgKiB3b3JrYmVuY2g7IGNsaWVudHMgbXVzdCA8Yj5ub3QgPC9iPiBkaXNwb3NlIG9mIHRoZSByZXR1cm5lZCBpbWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3ltYm9saWNOYW1lCi0JICogICAgICAgICAgICB0aGUgc3ltYm9saWMgbmFtZSBvZiB0aGUgaW1hZ2U7IHRoZXJlIGFyZSBjb25zdGFudHMgZGVjbGFyZWQKLQkgKiAgICAgICAgICAgIGluIHRoaXMgY2xhc3MgZm9yIGJ1aWxkLWluIGltYWdlcyB0aGF0IGNvbWUgd2l0aCB0aGUgc291cmNlCi0JICogICAgICAgICAgICBlZGl0b3IKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgc3ltYm9saWNOYW1lKSB7Ci0JCXJldHVybiBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKHN5bWJvbGljTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGZvciBzcGVjaWZpZWQgaW1hZ2UgZnJvbSB0aGUgc291cmNlCi0JICogZWRpdG9yIHBsdWdpbidzIGltYWdlIHJlZ2lzdHJ5LiBVbmxpa2UgPGNvZGU+SW1hZ2U8L2NvZGU+cywgaW1hZ2UKLQkgKiBkZXNjcmlwdG9ycyB0aGVtc2VsdmVzIGRvIG5vdCBuZWVkIHRvIGJlIGRpc3Bvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBzeW1ib2xpY05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHRoZSBpbWFnZTsgdGhlcmUgYXJlIGNvbnN0YW50cyBkZWNsYXJlZAotCSAqICAgICAgICAgICAgaW4gdGhpcyBpbnRlcmZhY2UgZm9yIGJ1aWxkLWluIGltYWdlcyB0aGF0IGNvbWUgd2l0aCB0aGUKLQkgKiAgICAgICAgICAgIHNvdXJjZSBlZGl0b3IKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQlyZXR1cm4gRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3Ioc3ltYm9saWNOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdG9yL0VkaXRvck1vZGVsVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9FZGl0b3JNb2RlbFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkNjIwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdG9yL0VkaXRvck1vZGVsVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuQXNzZXJ0OwotCi0KLS8qKgotICogSU5URVJOQUwgVVNBR0UgT05MWQotICogCi0gKiBBZGRzIGFkYXB0ZXIgZmFjdG9yaWVzIGludGVuZGVkIHNvbGVseSBmb3IgdXNlIHdoZW4gdGhlIG1vZGVsIGlzCi0gKiBpbnRlcmFjdGluZyB3aXRoIGEgVUkuCi0gKiAKLSAqIEBhdXRob3IgbnNkCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JNb2RlbFV0aWwgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEZhY3Rvcmllc1RvKGZpbmFsIElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCUFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgYWRhcHRlclJlZ2lzdHJ5ID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkoKTsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlSWQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0KLQkJSXRlcmF0b3IgYWRhcHRlckZhY3RvcnlQcm92aWRlcnMgPSBudWxsOwotCQlpZiAoYWRhcHRlclJlZ2lzdHJ5IGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlSZWdpc3RyeUV4dGVuc2lvbikgewotCQkJYWRhcHRlckZhY3RvcnlQcm92aWRlcnMgPSAoKEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlFeHRlbnNpb24pIGFkYXB0ZXJSZWdpc3RyeSkuZ2V0QWRhcHRlckZhY3Rvcmllcyhjb250ZW50VHlwZUlkKTsKLQkJfQotCQllbHNlIHsKLQkJCWFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJzID0gYWRhcHRlclJlZ2lzdHJ5LmdldEFkYXB0ZXJGYWN0b3JpZXMoKTsKLQkJfQotCi0JCUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZmFjdG9yeVJlZ2lzdHJ5LCBTU0VVSU1lc3NhZ2VzLkVkaXRvck1vZGVsVXRpbF8wKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBBZGQgYWxsIHRob3NlIGFwcHJvcHJpYXRlIGZvciB0aGlzIHBhcnRpY3VsYXIgdHlwZSBvZiBjb250ZW50Ci0JCXdoaWxlIChhZGFwdGVyRmFjdG9yeVByb3ZpZGVycy5oYXNOZXh0KCkpIHsKLQkJCXRyeSB7Ci0JCQkJZmluYWwgQWRhcHRlckZhY3RvcnlQcm92aWRlciBwcm92aWRlciA9IChBZGFwdGVyRmFjdG9yeVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeVByb3ZpZGVycy5uZXh0KCk7Ci0JCQkJLyoKLQkJCQkgKiBDb250ZW50VHlwZSBtaWdodCBoYXZlIGFscmVhZHkgYmVlbiBjaGVja2VkIGFib3ZlLCB0aGlzCi0JCQkJICogY2hlY2sgaXMgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgZm9yIHRob3NlIHRoYXQKLQkJCQkgKiBkb24ndCBzcGVjaWZ5IGEgY29udGVudCB0eXBlCi0JCQkJICovCi0JCQkJaWYgKHByb3ZpZGVyLmlzRm9yKHN0cnVjdHVyZWRNb2RlbC5nZXRNb2RlbEhhbmRsZXIoKSkpIHsKLQkJCQkJU2FmZVJ1bm5lci5ydW4obmV3IFNhZmVSdW5uYWJsZShTU0VVSU1lc3NhZ2VzLkVkaXRvck1vZGVsVXRpbF8xKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlwcm92aWRlci5hZGRBZGFwdGVyRmFjdG9yaWVzKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc4NjMzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdG9yL0VkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIGltYWdlcyBwcm92aWRlZCBieSB0aGlzIHBsdWctaW4uCi0gKiAKLSAqIE5PVEU6IEZvciBpbnRlcm5hbCB1c2Ugb25seS4gRm9yIGltYWdlcyB1c2VkIGV4dGVybmFsbHksIHBsZWFzZSB1c2UgdGhlCi0gKiBTaGFyZWQqKipJbWFnZUhlbHBlciBjbGFzcyBpbnN0ZWFkLgotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLy8JIHNhdmUgYSBkZXNjcmlwdG9yIGZvciBlYWNoIGltYWdlCi0JcHJpdmF0ZSBIYXNoTWFwIGZJbWFnZURlc2NSZWdpc3RyeSA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUExVR0lOSUQgPSBTU0VVSVBsdWdpbi5JRDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGFkZHMgdGhlIGltYWdlIHRvIHRoZQotCSAqIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gSW1hZ2UKLQkgKi8KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCS8vIGRvbnQgYWRkIHRoZSBtaXNzaW5nIGltYWdlIGRlc2NyaXB0b3IgaW1hZ2UgdG8gdGhlIGltYWdlCi0JCQkvLyByZWdpc3RyeQotCQkJaWYgKCFkZXNjLmVxdWFscyhJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKSkKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBpbWFnZUZpbGVQYXRoIGFuZCBhZGRzIHRoZQotCSAqIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIGFuIGltYWdlCi0JICogZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBpcyByZXR1cm5lZCBidXQgbm90IGFkZGVkIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgZGVzY3JpcHRvciBmb3IgaW1hZ2VGaWxlUGF0aCBvciBkZWZhdWx0Ci0JICogICAgICAgICAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRmlsZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfSBlbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIElmIHRoZSBpbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGF0Ci0JICogdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2UgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGFuIGltYWdlCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZQotCSAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQsCi0JICogYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQKLQkgKiBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NhdGVkIHdpdGggcmVzb3VyY2Ugb3IKLQkgKiAgICAgICAgIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIG9uZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlPYmplY3QgbyA9IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJLy9jcmVhdGUgYSBkZXNjcmlwdG9yCi0JCQlpbWFnZURlc2NyaXB0b3IgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQl9IGVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gKEltYWdlRGVzY3JpcHRvcikgbzsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSGFzaE1hcCAtIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgewotCQlpZiAoZkltYWdlRGVzY1JlZ2lzdHJ5ID09IG51bGwpCi0JCQlmSW1hZ2VEZXNjUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZkltYWdlRGVzY1JlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEltYWdlUmVnaXN0cnkgLSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwcml2YXRlIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdG9yL0VkaXRvclBsdWdpbkltYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9FZGl0b3JQbHVnaW5JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzODg0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdG9yL0VkaXRvclBsdWdpbkltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvcjsKLQotLyoqCi0gKiBCdW5kbGUgb2YgbW9zdCBpbWFnZXMgdXNlZCBieSB0aGUgU291cmNlIEVkaXRvciBwbHVnLWluLgotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yUGx1Z2luSW1hZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DVE9PTDE2X1NQRUxMQ0hFQ0sgPSAiaWNvbnMvZnVsbC9jdG9vbDE2L3NwZWxsY2hlY2suZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX0NPTExBUFNFQUxMID0gImljb25zL2Z1bGwvZGxjbDE2L2NvbGxhcHNlYWxsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9ERUxFVEUgPSAiaWNvbnMvZnVsbC9kbGNsMTYvZGVsZXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9TWU5DRUQgPSAiaWNvbnMvZnVsbC9kbGNsMTYvc3luY2VkLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0wxNl9TUEVMTENIRUNLID0gImljb25zL2Z1bGwvZHRvb2wxNi9zcGVsbGNoZWNrLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9DT0xMQVBTRUFMTCA9ICJpY29ucy9mdWxsL2VsY2wxNi9jb2xsYXBzZWFsbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfREVMRVRFID0gImljb25zL2Z1bGwvZWxjbDE2L2RlbGV0ZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfU1lOQ0VEID0gImljb25zL2Z1bGwvZWxjbDE2L3N5bmNlZC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MMTZfU1BFTExDSEVDSyA9ICJpY29ucy9mdWxsL2V0b29sMTYvc3BlbGxjaGVjay5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9PQ0NfTUFUQ0ggPSAiaWNvbnMvZnVsbC9vYmoxNi9vY2NfbWF0Y2guZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9QUkVGRVJFTkNFUyA9ICJpY29ucy9mdWxsL29iajE2L3ByZWZlcmVuY2VzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1BST1BfUFMgPSAiaWNvbnMvZnVsbC9vYmoxNi9wcm9wX3BzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2U1NDYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi0vKioKLSAqIEhlbHAgY29udGV4dCBpZHMgZm9yIHRoZSBTb3VyY2UgRWRpdG9yLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBjb250YWlucyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlCi0gKiBpbXBsZW1lbnRlZC4KLSAqIDwvcD4KLSAqICAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSGVscENvbnRleHRJZHMgewotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBTU0VVSVBsdWdpbi5JRCArICIuIjsgLy8kTk9OLU5MUy0xJAotCS8vIEFic3RyYWN0IFNvdXJjZSBFZGl0b3IgQ29udGV4dCBNZW51Ci0JLy8gQ29udGVudCBBc3Npc3QKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UTU5VX0NPTlRFTlRBU1NJU1RfSEVMUElEID0gUFJFRklYICsgInhtbG0xMDEwIjsgLy8kTk9OLU5MUy0xJAotCS8vIEZvcm1hdCBEb2N1bWVudAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRNTlVfRk9STUFUX0RPQ19IRUxQSUQgPSBQUkVGSVggKyAieG1sbTEwMzAiOyAvLyROT04tTkxTLTEkCi0JLy8gRm9ybWF0IEFjdGl2ZSBFbGVtZW50cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRNTlVfRk9STUFUX0VMRU1FTlRTX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxtMTA0MCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBDbGVhbnVwIERvY3VtZW50Ci0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVE1OVV9DTEVBTlVQX0RPQ19IRUxQSUQgPSBQUkVGSVggKwotCS8vICJ4bWxtMTA1MCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFByb3BlcnRpZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UTU5VX1BST1BFUlRJRVNfSEVMUElEID0gUFJFRklYICsgInhtbG0xMDcwIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gU3RydWN0dXJlZCBUZXh0IEVkaXRvciBQcmVmZXJlbmNlIFBhZ2UKLQkvLyBBcHBlYXJhbmNlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNURV9BUFBFQVJBTkNFX0hFTFBJRCA9IFBSRUZJWCArICJzdGVkMDAwMSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBIb3ZlcnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU1RFX0hPVkVSU19IRUxQSUQgPSBQUkVGSVggKyAic3RlZDAwMDMiOyAvLyROT04tTkxTLTEkCi0KLS8vCS8vIFJlYWQtT25seSBUZXh0IFN0eWxlCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGV0VCWF9SRUFET05MWV9IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMDEiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBXZWIgYW5kIFhNTCBQcmVmZXJlbmNlIFBhZ2UKLQkvLyBUYXNrIFRhZ3MKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGV0VCWF9UQVNLVEFHU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMDAiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBTb3VyY2UgRWRpdG9yIFZpZXcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfU09VUkNFX1ZJRVdfSEVMUElEID0gUFJFRklYICsgInhtbG0yMDAwIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9TZWxlY3Rpb25Db252ZXJ0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvU2VsZWN0aW9uQ29udmVydG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZjU2MDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9TZWxlY3Rpb25Db252ZXJ0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gZXhwZXJpbWVudGFsIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyDQotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuDQotICogSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20NCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJDQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25Db252ZXJ0b3Igew0KLQkvKioNCi0JICogQHBhcmFtIG1vZGVsDQotCSAqIEBwYXJhbSBzdGFydA0KLQkgKiBAcGFyYW0gZW5kDQotCSAqIEByZXR1cm4gdGhlIG1vc3Qgc3BlY2lmaWMgbWFwcGluZyBvZiB0aGlzIHRleHQgc2VsZWN0aW9uIHRvDQotCSAqICAgICAgICAgaW1wbGVtZW50b3JzIG9mIEluZGV4ZWRSZWdpb24NCi0JICovDQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBpbnQgc3RhcnQsIGludCBlbmQpIHsNCi0JCU9iamVjdFtdIGxvY2FsU2VsZWN0ZWRTdHJ1Y3R1cmVzID0gbnVsbDsNCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7DQotCQkJSW5kZXhlZFJlZ2lvbiByZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0KTsNCi0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsNCi0JCQkJaWYgKGVuZCA8PSByZWdpb24uZ2V0RW5kT2Zmc2V0KCkpIHsNCi0JCQkJCS8vIHNpbmdsZSBzZWxlY3Rpb24NCi0JCQkJCWxvY2FsU2VsZWN0ZWRTdHJ1Y3R1cmVzID0gbmV3IE9iamVjdFsxXTsNCi0JCQkJCWxvY2FsU2VsZWN0ZWRTdHJ1Y3R1cmVzWzBdID0gcmVnaW9uOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJLy8gbXVsdGlwbGUgc2VsZWN0aW9uDQotCQkJCQlpbnQgbWF4TGVuZ3RoID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7DQotCQkJCQlMaXN0IHN0cnVjdHVyZXMgPSBuZXcgQXJyYXlMaXN0KDIpOw0KLQkJCQkJd2hpbGUgKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRFbmRPZmZzZXQoKSA8PSBlbmQgJiYgcmVnaW9uLmdldEVuZE9mZnNldCgpIDwgbWF4TGVuZ3RoKSB7DQotCQkJCQkJc3RydWN0dXJlcy5hZGQocmVnaW9uKTsNCi0JCQkJCQlyZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHJlZ2lvbi5nZXRFbmRPZmZzZXQoKSArIDEpOw0KLQkJCQkJfQ0KLQkJCQkJbG9jYWxTZWxlY3RlZFN0cnVjdHVyZXMgPSBzdHJ1Y3R1cmVzLnRvQXJyYXkoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWlmIChsb2NhbFNlbGVjdGVkU3RydWN0dXJlcyA9PSBudWxsKSB7DQotCQkJbG9jYWxTZWxlY3RlZFN0cnVjdHVyZXMgPSBuZXcgT2JqZWN0WzBdOw0KLQkJfQ0KLQkJcmV0dXJuIGxvY2FsU2VsZWN0ZWRTdHJ1Y3R1cmVzOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvU3RydWN0dXJlZE1vZGVsRG9jdW1lbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9TdHJ1Y3R1cmVkTW9kZWxEb2N1bWVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMDY5ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9TdHJ1Y3R1cmVkTW9kZWxEb2N1bWVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlckV4dGVuc2lvbjQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRWxlbWVudFN0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIG5pdGluCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkTW9kZWxEb2N1bWVudFByb3ZpZGVyIGltcGxlbWVudHMgSURvY3VtZW50UHJvdmlkZXIsIElEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uLCBJRG9jdW1lbnRQcm92aWRlckV4dGVuc2lvbjQgewotCXByaXZhdGUgc3RhdGljIFN0cnVjdHVyZWRNb2RlbERvY3VtZW50UHJvdmlkZXIgX2luc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJ1Y3R1cmVkTW9kZWxEb2N1bWVudFByb3ZpZGVyIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gX2luc3RhbmNlOwotCX0KLQotCXsKLQkJX2luc3RhbmNlID0gbmV3IFN0cnVjdHVyZWRNb2RlbERvY3VtZW50UHJvdmlkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRNb2RlbERvY3VtZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyI2Fib3V0VG9DaGFuZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhYm91dFRvQ2hhbmdlKE9iamVjdCBlbGVtZW50KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyI2FkZEVsZW1lbnRTdGF0ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSUVsZW1lbnRTdGF0ZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVsZW1lbnRTdGF0ZUxpc3RlbmVyKElFbGVtZW50U3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNjYW5TYXZlRG9jdW1lbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TYXZlRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuICgoSVN0cnVjdHVyZWRNb2RlbCkgZWxlbWVudCkuaXNEaXJ0eSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNjaGFuZ2VkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgY2hhbmdlZChPYmplY3QgZWxlbWVudCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNjb25uZWN0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdChPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNkaXNjb25uZWN0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChPYmplY3QgZWxlbWVudCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNnZXRBbm5vdGF0aW9uTW9kZWwoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSUFubm90YXRpb25Nb2RlbCBnZXRBbm5vdGF0aW9uTW9kZWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyI2dldERvY3VtZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gKChJU3RydWN0dXJlZE1vZGVsKSBlbGVtZW50KS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjZ2V0TW9kaWZpY2F0aW9uU3RhbXAoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gKChJU3RydWN0dXJlZE1vZGVsKSBlbGVtZW50KS5nZXRTeW5jaHJvbml6YXRpb25TdGFtcCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlckV4dGVuc2lvbiNnZXRTdGF0dXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyI2dldFN5bmNocm9uaXphdGlvblN0YW1wKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0U3luY2hyb25pemF0aW9uU3RhbXAoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyI2lzRGVsZXRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uI2lzTW9kaWZpYWJsZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpYWJsZShPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb24jaXNSZWFkT25seShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlckV4dGVuc2lvbiNpc1N0YXRlVmFsaWRhdGVkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdGF0ZVZhbGlkYXRlZChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyI211c3RTYXZlRG9jdW1lbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtdXN0U2F2ZURvY3VtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAoKElTdHJ1Y3R1cmVkTW9kZWwpIGVsZW1lbnQpLmlzRGlydHkoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjcmVtb3ZlRWxlbWVudFN0YXRlTGlzdGVuZXIob3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRWxlbWVudFN0YXRlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudFN0YXRlTGlzdGVuZXIoSUVsZW1lbnRTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyI3Jlc2V0RG9jdW1lbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldERvY3VtZW50KE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyI3NhdmVEb2N1bWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVEb2N1bWVudChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE9iamVjdCBlbGVtZW50LCBJRG9jdW1lbnQgZG9jdW1lbnQsIGJvb2xlYW4gb3ZlcndyaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkoKElTdHJ1Y3R1cmVkTW9kZWwpIGVsZW1lbnQpLnNhdmUoKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb24jc2V0Q2FuU2F2ZURvY3VtZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FuU2F2ZURvY3VtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uI3N5bmNocm9uaXplKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc3luY2hyb25pemUoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb24jdXBkYXRlU3RhdGVDYWNoZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVN0YXRlQ2FjaGUoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb24jdmFsaWRhdGVTdGF0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVN0YXRlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgY29tcHV0YXRpb25Db250ZXh0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZShPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoKChJU3RydWN0dXJlZE1vZGVsKSBlbGVtZW50KS5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9BY3Rpb25EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0FjdGlvbkRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxMDhmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0FjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLQotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklBY3Rpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi0vKioKLSAqIFdoZW4gJ2FjdGlvbicgdGFnIGlzIGZvdW5kIGluIHRoZSByZWdpc3RyeSwgYW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMKLSAqIGNyZWF0ZWQuIEl0IGNyZWF0ZXMgdGhlIGFwcHJvcHJpYXRlIGFjdGlvbiBvYmplY3QgYW5kIGNhcHR1cmVzIGluZm9ybWF0aW9uCi0gKiB0aGF0IGlzIGxhdGVyIHVzZWQgdG8gYWRkIHRoaXMgYWN0aW9uIG9iamVjdCBpbnRvIG1lbnUvdG9vbCBiYXIuIFRoaXMgY2xhc3MKLSAqIGlzIHJldXNlZCBmb3IgZ2xvYmFsICh3b3JrYmVuY2gpIG1lbnUvdG9vbCBiYXIsIHBvcHVwIG1lbnUgYWN0aW9ucywgYXMgd2VsbAotICogYXMgdmlldydzIHB1bGxkb3duIGFuZCBsb2NhbCB0b29sIGJhci4KLSAqLwotcHVibGljIGNsYXNzIEFjdGlvbkRlc2NyaXB0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9BQ0NFTEVSQVRPUiA9ICJhY2NlbGVyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0RFRklOSVRJT05fSUQgPSAiZGVmaW5pdGlvbklkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfRElTQUJMRURJQ09OID0gImRpc2FibGVkSWNvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSEVMUF9DT05URVhUX0lEID0gImhlbHBDb250ZXh0SWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0hPVkVSSUNPTiA9ICJob3Zlckljb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lDT04gPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTEFCRUwgPSAibGFiZWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX01FTlVCQVJfUEFUSCA9ICJtZW51YmFyUGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUE9QVVBNRU5VX1BBVEggPSAicG9wdXBtZW51UGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfU1RBVEUgPSAic3RhdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RPT0xCQVJfUEFUSCA9ICJ0b29sYmFyUGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVE9PTFRJUCA9ICJ0b29sdGlwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBleHRlbnNpb24uIElmIHRoZSBleHRlbnNpb24gcGx1Z2luIGhhcyBub3QgYmVlbiBsb2FkZWQgYQotCSAqIGJ1c3kgY3Vyc29yIHdpbGwgYmUgYWN0aXZhdGVkIGR1cmluZyB0aGUgZHVyYXRpb24gb2YgdGhlIGxvYWQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb25maWcgZWxlbWVudCBkZWZpbmluZyB0aGUgZXh0ZW5zaW9uCi0JICogQHBhcmFtIGNsYXNzQXR0cmlidXRlCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGNhcnJ5aW5nIHRoZSBjbGFzcwotCSAqIEByZXR1cm5zIHRoZSBleHRlbnNpb24gb2JqZWN0IGlmIHN1Y2Nlc3NmdWwuIElmIGFuIGVycm9yIG9jY3VycyB3aGVuCi0JICogICAgICAgICAgY3JlYXRlaW5nIGV4ZWN1dGFibGUgZXh0ZW5zaW9uLCB0aGUgZXhjZXB0aW9uIGlzIGxvZ2dlZCwgYW5kCi0JICogICAgICAgICAgbnVsbCByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVFeHRlbnNpb24oZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIGZpbmFsIFN0cmluZyBjbGFzc0F0dHJpYnV0ZSkgewotCQlmaW5hbCBPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzFdOwotCQkvLyBJZiBwbHVnaW4gaGFzIGJlZW4gbG9hZGVkIGNyZWF0ZSBleHRlbnNpb24uCi0JCS8vIE90aGVyd2lzZSwgc2hvdyBidXN5IGN1cnNvciB0aGVuIGNyZWF0ZSBleHRlbnNpb24uCi0JCVN0cmluZyBwbHVnaW5JZCA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQlpZiAoYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLkFDVElWRSkgewotCQkJdHJ5IHsKLQkJCQlyZXN1bHRbMF0gPSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oY2xhc3NBdHRyaWJ1dGUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjYXRjaCBhbmQgbG9nIEFOWSBleGNlcHRpb24gZnJvbSBleHRlbnNpb24gcG9pbnQKLQkJCQloYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKHJlc3VsdCwgZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShudWxsLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJcmVzdWx0WzBdID0gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYXNzQXR0cmlidXRlKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGNhdGNoIGFuZCBsb2cgQU5ZIGV4Y2VwdGlvbiBmcm9tIGV4dGVuc2lvbiBwb2ludAotCQkJCQkJaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihyZXN1bHQsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFswXTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24oZmluYWwgT2JqZWN0W10gcmVzdWx0LCBUaHJvd2FibGUgZSkgewotCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQlyZXN1bHRbMF0gPSBudWxsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGlkOwotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGl0ZW07Ci0JcHJpdmF0ZSBTdHJpbmcgbWVudUdyb3VwOwotCXByaXZhdGUgU3RyaW5nIG1lbnVQYXRoOwotCXByaXZhdGUgU3RyaW5nIHBvcHVwbWVudUdyb3VwOwotCXByaXZhdGUgU3RyaW5nIHBvcHVwbWVudVBhdGg7Ci0JcHJpdmF0ZSBTdHJpbmcgdG9vbGJhckdyb3VwOwotCXByaXZhdGUgU3RyaW5nIHRvb2xiYXJQYXRoOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBkZXNjcmlwdG9yIHdpdGggdGhlIHRhcmdldFR5cGUKLQkgKi8KLQlwdWJsaWMgQWN0aW9uRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgYWN0aW9uRWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCS8vIENhbGN1bGF0ZSBtZW51IGFuZCB0b29sYmFyIHBhdGhzLgotCQlTdHJpbmcgbXBhdGggPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTUVOVUJBUl9QQVRIKTsKLQkJU3RyaW5nIG1ncm91cCA9IG51bGw7Ci0JCWlmIChtcGF0aCAhPSBudWxsKSB7Ci0JCQlpbnQgbG9jID0gbXBhdGgubGFzdEluZGV4T2YoJy8nKTsKLQkJCWlmIChsb2MgIT0gLTEpIHsKLQkJCQltZ3JvdXAgPSBtcGF0aC5zdWJzdHJpbmcobG9jICsgMSk7Ci0JCQkJbXBhdGggPSBtcGF0aC5zdWJzdHJpbmcoMCwgbG9jKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWdyb3VwID0gbXBhdGg7Ci0JCQkJbXBhdGggPSBudWxsOwotCQkJfQotCQl9Ci0JCW1lbnVQYXRoID0gbXBhdGg7Ci0JCW1lbnVHcm91cCA9IG1ncm91cDsKLQotCQlTdHJpbmcgcHBhdGggPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUE9QVVBNRU5VX1BBVEgpOwotCQlTdHJpbmcgcGdyb3VwID0gbnVsbDsKLQkJaWYgKHBwYXRoICE9IG51bGwpIHsKLQkJCWludCBsb2MgPSBwcGF0aC5sYXN0SW5kZXhPZignLycpOwotCQkJaWYgKGxvYyAhPSAtMSkgewotCQkJCXBncm91cCA9IHBwYXRoLnN1YnN0cmluZyhsb2MgKyAxKTsKLQkJCQlwcGF0aCA9IHBwYXRoLnN1YnN0cmluZygwLCBsb2MpOwotCQkJfSBlbHNlIHsKLQkJCQlwZ3JvdXAgPSBwcGF0aDsKLQkJCQlwcGF0aCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcG9wdXBtZW51UGF0aCA9IHBwYXRoOwotCQlwb3B1cG1lbnVHcm91cCA9IHBncm91cDsKLQotCQlTdHJpbmcgdHBhdGggPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVE9PTEJBUl9QQVRIKTsKLQkJU3RyaW5nIHRncm91cCA9IG51bGw7Ci0JCWlmICh0cGF0aCAhPSBudWxsKSB7Ci0JCQlpbnQgbG9jID0gdHBhdGgubGFzdEluZGV4T2YoJy8nKTsKLQkJCWlmIChsb2MgIT0gLTEpIHsKLQkJCQl0Z3JvdXAgPSB0cGF0aC5zdWJzdHJpbmcobG9jICsgMSk7Ci0JCQkJdHBhdGggPSB0cGF0aC5zdWJzdHJpbmcoMCwgbG9jKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGdyb3VwID0gdHBhdGg7Ci0JCQkJdHBhdGggPSBudWxsOwotCQkJfQotCQl9Ci0JCXRvb2xiYXJQYXRoID0gdHBhdGg7Ci0JCXRvb2xiYXJHcm91cCA9IHRncm91cDsKLQotCQkvLyBDcmVhdGUgYWN0aW9uLgotCQlJQWN0aW9uIGFjdGlvbiA9IGNyZWF0ZUFjdGlvbihhY3Rpb25FbGVtZW50KTsKLQkJaWYgKGFjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBsYWJlbCA9IGFjdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9MQUJFTCk7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJYWN0aW9uLnNldFRleHQobGFiZWwpOwotCi0JCWlkID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJaWYgKGlkID09IG51bGwpIHsKLQkJCWlkID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLQkJfQotCQlpZiAoaWQgIT0gbnVsbCkKLQkJCWFjdGlvbi5zZXRJZChpZCk7Ci0KLQkJU3RyaW5nIGRlZklkID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0RFRklOSVRJT05fSUQpOwotCQlpZiAoZGVmSWQgIT0gbnVsbCAmJiBkZWZJZC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlhY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKGRlZklkKTsKLQkJfQotCi0JCVN0cmluZyB0b29sdGlwID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1RPT0xUSVApOwotCQlpZiAodG9vbHRpcCAhPSBudWxsKQotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KHRvb2x0aXApOwotCi0JCVN0cmluZyBoZWxwQ29udGV4dElkID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0hFTFBfQ09OVEVYVF9JRCk7Ci0JCWlmIChoZWxwQ29udGV4dElkICE9IG51bGwpIHsKLQkJCVN0cmluZyBmdWxsSUQgPSBoZWxwQ29udGV4dElkOwotCQkJaWYgKGhlbHBDb250ZXh0SWQuaW5kZXhPZigiLiIpID09IC0xKSAvLyROT04tTkxTLTEkCi0JCQkJLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2UgYXV0byBxdWFsaWZ5IHRoZSBpZCBpZiBpdCBpcwotCQkJCS8vIG5vdCBxdWFsaWZpZWQpCi0JCQkJZnVsbElEID0gYWN0aW9uRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSArICIuIiArIGhlbHBDb250ZXh0SWQ7IC8vJE5PTi1OTFMtMSQKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYWN0aW9uLCBmdWxsSUQpOwotCQl9Ci0KLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0RFU0NSSVBUSU9OKTsKLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCi0JCVN0cmluZyBzdGF0ZSA9IGFjdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9TVEFURSk7Ci0JCWlmIChzdGF0ZSAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0Q2hlY2tlZChzdGF0ZS5lcXVhbHMoInRydWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN0cmluZyBpY29uID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lDT04pOwotCQlpZiAoaWNvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlVXRpbC5nZXRJbWFnZURlc2NyaXB0b3JGcm9tRXh0ZW5zaW9uKGFjdGlvbkVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCksIGljb24pKTsKLQkJfQotCi0JCVN0cmluZyBob3Zlckljb24gPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSE9WRVJJQ09OKTsKLQkJaWYgKGhvdmVySWNvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VVdGlsLmdldEltYWdlRGVzY3JpcHRvckZyb21FeHRlbnNpb24oYWN0aW9uRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKSwgaG92ZXJJY29uKSk7Ci0JCX0KLQotCQlTdHJpbmcgZGlzYWJsZWRJY29uID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0RJU0FCTEVESUNPTik7Ci0JCWlmIChkaXNhYmxlZEljb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlVXRpbC5nZXRJbWFnZURlc2NyaXB0b3JGcm9tRXh0ZW5zaW9uKGFjdGlvbkVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCksIGRpc2FibGVkSWNvbikpOwotCQl9Ci0KLQkJU3RyaW5nIGFjY2VsZXJhdG9yID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0FDQ0VMRVJBVE9SKTsKLQkJaWYgKGFjY2VsZXJhdG9yICE9IG51bGwpCi0JCQlwcm9jZXNzQWNjZWxlcmF0b3IoYWN0aW9uLCBhY2NlbGVyYXRvcik7Ci0KLQkJaXRlbSA9IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBnaXZlbiBhY2NlbGVyYXRvciB0ZXh0LCBhbmQgY29udmVydHMgaXQgdG8gYW4gYWNjZWxlcmF0b3IKLQkgKiBrZXkgY29kZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWNjZWxlcmF0b3JUZXh0Ci0JICogICAgICAgICAgICB0aGUgYWNjZWxlcmF0b3IgdGV4dAotCSAqIEByZXN1bHQgdGhlIFNXVCBrZXkgY29kZSwgb3IgMCBpZiB0aGVyZSBpcyBubyBhY2NlbGVyYXRvcgotCSAqLwotCXByaXZhdGUgaW50IGNvbnZlcnRBY2NlbGVyYXRvcihTdHJpbmcgYWNjZWxlcmF0b3JUZXh0KSB7Ci0JCWludCBhY2NlbGVyYXRvciA9IDA7Ci0JCVN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihhY2NlbGVyYXRvclRleHQsICIrIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpbnQga2V5Q29kZSA9IC0xOwotCi0JCWJvb2xlYW4gaGFzTW9yZVRva2VucyA9IHN0b2suaGFzTW9yZVRva2VucygpOwotCQl3aGlsZSAoaGFzTW9yZVRva2VucykgewotCQkJU3RyaW5nIHRva2VuID0gc3Rvay5uZXh0VG9rZW4oKTsKLQkJCWhhc01vcmVUb2tlbnMgPSBzdG9rLmhhc01vcmVUb2tlbnMoKTsKLQkJCS8vIEV2ZXJ5IHRva2VuIGV4Y2VwdCB0aGUgbGFzdCBtdXN0IGJlIG9uZSBvZiB0aGUgbW9kaWZpZXJzCi0JCQkvLyBDdHJsLCBTaGlmdCwgb3IgQWx0LgotCQkJaWYgKGhhc01vcmVUb2tlbnMpIHsKLQkJCQlpbnQgbW9kaWZpZXIgPSBBY3Rpb24uZmluZE1vZGlmaWVyKHRva2VuKTsKLQkJCQlpZiAobW9kaWZpZXIgIT0gMCkgewotCQkJCQlhY2NlbGVyYXRvciB8PSBtb2RpZmllcjsKLQkJCQl9IGVsc2UgeyAvL0xlYXZlIGlmIHRoZXJlIGFyZSBub25lCi0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJa2V5Q29kZSA9IEFjdGlvbi5maW5kS2V5Q29kZSh0b2tlbik7Ci0JCQl9Ci0JCX0KLQkJaWYgKGtleUNvZGUgIT0gLTEpIHsKLQkJCWFjY2VsZXJhdG9yIHw9IGtleUNvZGU7Ci0JCX0KLQkJcmV0dXJuIGFjY2VsZXJhdG9yOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSUFjdGlvbiBjcmVhdGVBY3Rpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFjdGlvbkVsZW1lbnQpIHsKLQkJT2JqZWN0IGFjdGlvbiA9IG5ldyBFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nKGFjdGlvbkVsZW1lbnQsIEFUVF9DTEFTUyk7Ci0JCWlmIChhY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSUFjdGlvblZhbGlkYXRvcikgewotCQkJaWYgKCEoKElBY3Rpb25WYWxpZGF0b3IpIGFjdGlvbikuaXNWYWxpZEFjdGlvbigpKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoYWN0aW9uIGluc3RhbmNlb2YgSUFjdGlvbiA/IChJQWN0aW9uKSBFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Lm5ld0luc3RhbmNlKGFjdGlvbikgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3Rpb24gb2JqZWN0IGhlbGQgaW4gdGhpcyBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBJQWN0aW9uIGdldEFjdGlvbigpIHsKLQkJcmV0dXJuIChpdGVtICE9IG51bGwgPyBpdGVtLmdldEFjdGlvbigpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUNvbnRyaWJ1dGlvbkl0ZW0gb2JqZWN0IGhlbGQgaW4gdGhpcyBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBJQ29udHJpYnV0aW9uSXRlbSBnZXRDb250cmlidXRpb25JdGVtKCkgewotCQlyZXR1cm4gaXRlbTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFjdGlvbidzIGlkIGFzIGRlZmluZWQgaW4gdGhlIHJlZ2lzdHJ5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG5hbWVkIHNsb3QgKGdyb3VwKSBpbiB0aGUgbWVudSB3aGVyZSB0aGlzIGFjdGlvbiBzaG91bGQgYmUKLQkgKiBhZGRlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lbnVHcm91cCgpIHsKLQkJcmV0dXJuIG1lbnVHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG1lbnUgcGF0aCB3aGVyZSB0aGlzIGFjdGlvbiBzaG91bGQgYmUgYWRkZWQuIElmIG51bGwsIHRoZQotCSAqIGFjdGlvbiB3aWxsIG5vdCBiZSBhZGRlZCBpbnRvIHRoZSBtZW51LgotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXRNZW51UGF0aCgpIHsKLQkJcmV0dXJuIG1lbnVQYXRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbmFtZWQgc2xvdCAoZ3JvdXApIGluIHRoZSBwb3B1cCBtZW51IHdoZXJlIHRoaXMgYWN0aW9uIHNob3VsZAotCSAqIGJlIGFkZGVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9wdXBNZW51R3JvdXAoKSB7Ci0JCXJldHVybiBwb3B1cG1lbnVHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHBvcHVwIG1lbnUgcGF0aCB3aGVyZSB0aGlzIGFjdGlvbiBzaG91bGQgYmUgYWRkZWQuIElmIG51bGwsIHRoZQotCSAqIGFjdGlvbiB3aWxsIG5vdCBiZSBhZGRlZCBpbnRvIHRoZSBwb3B1cCBtZW51LgotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXRQb3B1cE1lbnVQYXRoKCkgewotCQlyZXR1cm4gcG9wdXBtZW51UGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lZCBzbG90IChncm91cCkgaW4gdGhlIHRvb2wgYmFyIHdoZXJlIHRoaXMgYWN0aW9uIHNob3VsZAotCSAqIGJlIGFkZGVkLgotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXRUb29sYmFyR3JvdXAoKSB7Ci0JCXJldHVybiB0b29sYmFyR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBwYXRoIGluIHRoZSB0b29sIGJhciB3aGVyZSB0aGlzIGFjdGlvbiBzaG91bGQgYmUgYWRkZWQuIElmCi0JICogbnVsbCwgYWN0aW9uIHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xiYXJQYXRoKCkgewotCQlyZXR1cm4gdG9vbGJhclBhdGg7Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyB0aGUgYWNjZWxlcmF0b3IgZGVmaW5pdGlvbi4gSWYgaXQgaXMgYSBudW1iZXIgdGhlbiBwcm9jZXNzIHRoZQotCSAqIGNvZGUgZGlyZWN0bHkgLSBpZiBub3QgdGhlbiBwYXJzZSBpdCBhbmQgY3JlYXRlIHRoZSBjb2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NBY2NlbGVyYXRvcihJQWN0aW9uIGFjdGlvbiwgU3RyaW5nIGFjY2VsZXJhdG9yVGV4dCkgewotCi0JCWlmIChhY2NlbGVyYXRvclRleHQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQotCQkvL0lzIGl0IGEgbnVtZXJpYyBkZWZpbml0aW9uPwotCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoYWNjZWxlcmF0b3JUZXh0LmNoYXJBdCgwKSkpIHsKLQkJCXRyeSB7Ci0JCQkJYWN0aW9uLnNldEFjY2VsZXJhdG9yKEludGVnZXIudmFsdWVPZihhY2NlbGVyYXRvclRleHQpLmludFZhbHVlKCkpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiSW52YWxpZCBhY2NlbGVyYXRvciBkZWNsYXJhdGlvbjogIiArIGlkKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UKLQkJCWFjdGlvbi5zZXRBY2NlbGVyYXRvcihjb252ZXJ0QWNjZWxlcmF0b3IoYWNjZWxlcmF0b3JUZXh0KSk7Ci0JfQotCi0JLyoqCi0JICogRm9yIGRlYnVnZ2luZyBvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQWN0aW9uRGVzY3JpcHRvcigiICsgaWQgKyAiKSI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9CcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0JyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE2ZjliMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0JyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5JU291cmNlRWRpdGluZ1RleHRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludC5JQnJlYWtwb2ludFByb3ZpZGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBSZWFkcyBicmVha3BvaW50IGV4dGVuc2lvbiByZWdpc3RvcnkgYW5kIHJldHVybnMgYnJlYWtwb2ludCBwcm92aWRlcgotICogaW5zdGFuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ09OVEVOVF9UWVBFUyA9ICJjb250ZW50VHlwZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9FWFRFTlNJT05TID0gImV4dGVuc2lvbnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlciBpbnN0YW5jZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExfQlJFQUtQT0lOVCA9ICJicmVha3BvaW50IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19CUkVBS1BPSU5UX0NPTlRSSUJVVElPTiA9ICJicmVha3BvaW50Q29udHJpYnV0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUFJPVklERVIgPSAicHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKgotCSAqIENyZWF0ZXMgYW4gZXhlY3V0YWJsZSBleHRlbnNpb24uIEBwYXJhbSBlbGVtZW50IHRoZSBjb25maWcgZWxlbWVudAotCSAqIGRlZmluaW5nIHRoZSBleHRlbnNpb24gQHBhcmFtIGNsYXNzQXR0cmlidXRlIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKiBjYXJyeWluZyB0aGUgY2xhc3MgQHJldHVybiB0aGUgZXh0ZW5zaW9uIG9iamVjdCBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlzdGF0aWMgT2JqZWN0IGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIGZpbmFsIFN0cmluZyBjbGFzc0F0dHJpYnV0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYXNzQXR0cmlidXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGV4dGVuc2lvbi4gSWYgdGhlIGV4dGVuc2lvbiBwbHVnaW4gaGFzIG5vdCBiZWVuIGxvYWRlZCBhCi0JICogYnVzeSBjdXJzb3Igd2lsbCBiZSBhY3RpdmF0ZWQgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgbG9hZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGNvbmZpZyBlbGVtZW50IGRlZmluaW5nIHRoZSBleHRlbnNpb24KLQkgKiBAcGFyYW0gY2xhc3NBdHRyaWJ1dGUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgY2FycnlpbmcgdGhlIGNsYXNzCi0JICogQHJldHVybiB0aGUgZXh0ZW5zaW9uIG9iamVjdAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUV4dGVuc2lvbihmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgZmluYWwgU3RyaW5nIGNsYXNzQXR0cmlidXRlKSB7Ci0JCS8vIElmIHBsdWdpbiBoYXMgYmVlbiBsb2FkZWQgY3JlYXRlIGV4dGVuc2lvbi4KLQkJLy8gT3RoZXJ3aXNlLCBzaG93IGJ1c3kgY3Vyc29yIHRoZW4gY3JlYXRlIGV4dGVuc2lvbi4KLQkJZmluYWwgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsxXTsKLQkJU3RyaW5nIHBsdWdpbklkID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCWlmIChidW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQl0cnkgewotCQkJCXJlc3VsdFswXSA9IGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZWxlbWVudCwgY2xhc3NBdHRyaWJ1dGUpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihyZXN1bHQsIGUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUobnVsbCwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3VsdFswXSA9IGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZWxlbWVudCwgY2xhc3NBdHRyaWJ1dGUpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24ocmVzdWx0LCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCX0KLQkJcmV0dXJuIHJlc3VsdFswXTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyCi0JICogCi0JICogQHJldHVybiBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc3VsdAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBoYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKE9iamVjdFtdIHJlc3VsdCwgVGhyb3dhYmxlIGUpIHsKLQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJcmVzdWx0WzBdID0gbnVsbDsKLQotCX0KLQotCXByb3RlY3RlZCBMaXN0IGNhY2hlOwotCXByaXZhdGUgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldENvbnRyaWJ1dGlvblRhZzsKLQotCS8qCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwcml2YXRlIEJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBDcmVhdGVzIGEgYnJlYWtwb2ludCBwcm92aWRlciBvYmplY3QgdG8gZ2l2ZW4gZWxlbWVudCBAcGFyYW0gZWxlbWVudAotCSAqIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBvYmplY3QgQHJldHVybiBJQnJlYWtwb2ludFByb3ZpZGVyCi0JICovCi0JcHJvdGVjdGVkIElCcmVha3BvaW50UHJvdmlkZXIgY3JlYXRlQnJlYWtwb2ludFByb3ZpZGVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCU9iamVjdCBvYmogPSBjcmVhdGVFeHRlbnNpb24oZWxlbWVudCwgQVRUX0NMQVNTKTsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAob2JqIGluc3RhbmNlb2YgSUJyZWFrcG9pbnRQcm92aWRlcikgPyAoSUJyZWFrcG9pbnRQcm92aWRlcikgb2JqIDogbnVsbDsKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgYnJlYWtwb2ludCBwcm92aWRlcnMgbWF0Y2hpbmcgdGhlIGdpdmVuIGtleSB0byB0aGUKLQkgKiB2YWx1ZSBvZiB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGF0dHJpYnV0ZSAiYXR0ck5hbWUiIEByZXR1cm4KLQkgKiBJQnJlYWtwb2ludFByb3ZpZGVyW10KLQkgKi8KLQlwcm90ZWN0ZWQgSUJyZWFrcG9pbnRQcm92aWRlcltdIGNyZWF0ZUJyZWFrcG9pbnRQcm92aWRlcnMoU3RyaW5nIGF0dHJOYW1lLCBTdHJpbmcga2V5KSB7Ci0JCWlmIChjYWNoZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJQnJlYWtwb2ludFByb3ZpZGVyWzBdOwotCi0JCWZpbmFsIGludCBudW0gPSBjYWNoZS5zaXplKCk7Ci0JCWlmIChudW0gPT0gMCkKLQkJCXJldHVybiBuZXcgSUJyZWFrcG9pbnRQcm92aWRlclswXTsKLQotCQlJQnJlYWtwb2ludFByb3ZpZGVyW10gYnAgPSBuZXcgSUJyZWFrcG9pbnRQcm92aWRlcltudW1dOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBjYWNoZS5nZXQoaSk7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIG9iajsKLQkJCWlmICghVEFHX1BST1ZJREVSLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJY29udGludWU7Ci0KLQkJCWJvb2xlYW4gZG9DcmVhdGUgPSBmYWxzZTsKLQotCQkJU3RyaW5nIGF0dHJWYWx1ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0KLQkJCWlmIChhdHRyVmFsdWVzICE9IG51bGwpIHsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyVmFsdWVzLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJU3RyaW5nIHR5cGUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQkJCWlmICh0eXBlLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKGtleS50cmltKCkpKSB7Ci0JCQkJCQlkb0NyZWF0ZSA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGRvQ3JlYXRlKSB7Ci0JCQkJSUJyZWFrcG9pbnRQcm92aWRlciBiID0gY3JlYXRlQnJlYWtwb2ludFByb3ZpZGVyKGVsZW1lbnQpOwotCQkJCWlmIChiICE9IG51bGwpIHsKLQkJCQkJYnBbal0gPSBiOwotCQkJCQlqKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSUJyZWFrcG9pbnRQcm92aWRlcltdIGJwMiA9IG5ldyBJQnJlYWtwb2ludFByb3ZpZGVyW2pdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGo7IGkrKykgewotCQkJYnAyW2ldID0gYnBbaV07Ci0JCX0KLQotCQlyZXR1cm4gYnAyOwotCX0KLQotCS8qCi0JICogUmV0dXJucyBhIG1hdGNoaW5nIGFycmF5IG9mIGV4dGVuc2lvbiBwb2ludHMgbWF0Y2hpbmcgdGhpcyBrZXkuIERvZXNuJ3QKLQkgKiBjYXVzZSBpbnN0YW50aWF0aW9uIG9mIHByb3ZpZGVycy4gQHJldHVybiBJQnJlYWtwb2ludFByb3ZpZGVyW10KLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZmluZEVsZW1lbnRzKFN0cmluZyBrZXkpIHsKLQkJaW5pdENhY2hlKCk7Ci0KLQkJaWYgKGNhY2hlID09IG51bGwgfHwgY2FjaGUuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbmV3IElDb25maWd1cmF0aW9uRWxlbWVudFswXTsKLQotCQlpbnQgbnVtID0gY2FjaGUuc2l6ZSgpOwotCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGNhY2hlLmdldChpKTsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIElDb25maWd1cmF0aW9uRWxlbWVudCkpCi0JCQkJY29udGludWU7Ci0KLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgb2JqOwotCQkJaWYgKCFUQUdfUFJPVklERVIuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkKLQkJCQljb250aW51ZTsKLQotCQkJYm9vbGVhbiBhZGQgPSBmYWxzZTsKLQkJCVN0cmluZyB0eXBlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DT05URU5UX1RZUEVTKTsKLQkJCVN0cmluZyBleHRzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0VYVEVOU0lPTlMpOwotCi0JCQlpZiAodHlwZXMgPT0gbnVsbCAmJiBleHRzID09IG51bGwpIHsKLQkJCQlhZGQgPSB0cnVlOwotCQkJfQotCi0JCQlpZiAoIWFkZCAmJiB0eXBlcyAhPSBudWxsICYmIHR5cGVzLmxlbmd0aCgpID4gMCkgewotCQkJCUlDb250ZW50VHlwZSB0ZXN0VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGtleSk7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHlwZXMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlTdHJpbmcgdHlwZSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUodHlwZSk7Ci0JCQkJCWlmIChjb250ZW50VHlwZSAhPSBudWxsICYmIHRlc3RUeXBlICE9IG51bGwgJiYgdGVzdFR5cGUuaXNLaW5kT2YoY29udGVudFR5cGUpKSB7Ci0JCQkJCQlhZGQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghYWRkICYmIGV4dHMgIT0gbnVsbCkgewotCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGV4dHMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlTdHJpbmcgZXh0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJCQlpZiAoZXh0LnRyaW0oKS5lcXVhbHMoa2V5LnRyaW0oKSkpIHsKLQkJCQkJCWFkZCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGFkZCkgewotCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElDb25maWd1cmF0aW9uRWxlbWVudFtdKSBlbGVtZW50cy50b0FycmF5KG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbMF0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYnJlYWtwb2ludCBwcm92aWRlcnMgZm9yIGEgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZQotCSAqIGhhbmRsZXIKLQkgKiAKLQkgKiBAcGFyYW0gaGFuZGxlcgotCSAqICAgICAgICAgICAgYSBjb250ZW50IHR5cGUgaGFuZGxlcgotCSAqIEBwYXJhbSBleHQKLQkgKiAgICAgICAgICAgIGZpbGUgZXh0ZW5zaW9uCi0JICogQHJldHVybiBJQnJlYWtwb2ludFByb3ZpZGVyW10KLQkgKi8KLQlwdWJsaWMgSUJyZWFrcG9pbnRQcm92aWRlcltdIGdldEJyZWFrcG9pbnRQcm92aWRlcnMoSUVkaXRvclBhcnQgZWRpdG9ycGFydCwgU3RyaW5nIGNvbnRlbnRUeXBlSUQsIFN0cmluZyBleHQpIHsKLQkJaW5pdENhY2hlKCk7Ci0KLQkJLy8gR2V0IGJyZWFrcG9pbnQgcHJvdmlkZXJzIGZvciB0aGlzIGNvbnRlbnQgdHlwZSBoYW5kbGVyCi0JCUlCcmVha3BvaW50UHJvdmlkZXJbXSBwcm92aWRlcnMxID0gbmV3IElCcmVha3BvaW50UHJvdmlkZXJbMF07Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSUQpOwotCQlMaXN0IGhvbGRQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0KDIpOwotCQl3aGlsZSAoY29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJSUJyZWFrcG9pbnRQcm92aWRlcltdIHByb3ZpZGVycyA9IChJQnJlYWtwb2ludFByb3ZpZGVyW10pIG1hcC5nZXQoY29udGVudFR5cGUuZ2V0SWQoKSk7Ci0JCQlpZiAocHJvdmlkZXJzID09IG51bGwpIHsKLQkJCQlwcm92aWRlcnMgPSBjcmVhdGVCcmVha3BvaW50UHJvdmlkZXJzKEFUVF9DT05URU5UX1RZUEVTLCBjb250ZW50VHlwZS5nZXRJZCgpKTsKLQkJCQlpZiAocHJvdmlkZXJzICE9IG51bGwpIHsKLQkJCQkJbWFwLnB1dChjb250ZW50VHlwZS5nZXRJZCgpLCBwcm92aWRlcnMpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHByb3ZpZGVycyB3ZXJlIHJldHJpZXZlZCBmcm9tIGNhY2hlIG9yIG5ld2x5IGNyZWF0ZWQKLQkJCWlmKHByb3ZpZGVycyAhPSBudWxsKSB7Ci0JCQkJaG9sZFByb3ZpZGVycy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwcm92aWRlcnMpKTsKLQkJCX0KLQkJCWNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuZ2V0QmFzZVR5cGUoKTsKLQkJfQotCQlwcm92aWRlcnMxID0gKElCcmVha3BvaW50UHJvdmlkZXJbXSkgaG9sZFByb3ZpZGVycy50b0FycmF5KG5ldyBJQnJlYWtwb2ludFByb3ZpZGVyW2hvbGRQcm92aWRlcnMuc2l6ZSgpXSk7Ci0KLQkJLy8gR2V0IGJyZWFrcG9pbnQgcHJvdmlkZXJzIGZvciB0aGlzIGV4dGVuc2lvbgotCQlJQnJlYWtwb2ludFByb3ZpZGVyW10gcHJvdmlkZXJzMiA9IG5ldyBJQnJlYWtwb2ludFByb3ZpZGVyWzBdOwotCQlpZiAoZXh0ICE9IG51bGwpIHsKLQkJCXByb3ZpZGVyczIgPSAoSUJyZWFrcG9pbnRQcm92aWRlcltdKSBtYXAuZ2V0KGV4dCk7Ci0JCQlpZiAocHJvdmlkZXJzMiA9PSBudWxsKSB7Ci0JCQkJcHJvdmlkZXJzMiA9IGNyZWF0ZUJyZWFrcG9pbnRQcm92aWRlcnMoQVRUX0VYVEVOU0lPTlMsIGV4dCk7Ci0JCQkJaWYgKHByb3ZpZGVyczIgIT0gbnVsbCkgewotCQkJCQltYXAucHV0KGV4dCwgcHJvdmlkZXJzMik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY3JlYXRlIHNpbmdsZSBoYXNoIHNldCB0byByZW1vdmUgZHVwbGljYXRpb24KLQkJU2V0IHMgPSBuZXcgSGFzaFNldCgpOwotCQlzLmFkZEFsbChBcnJheXMuYXNMaXN0KHByb3ZpZGVyczEpKTsKLQkJcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwcm92aWRlcnMyKSk7Ci0KLQkJLy8gY3JlYXRlIElCcmVha3BvaW50UHJvdmlkZXJbXSB0byByZXR1cm4KLQkJSUJyZWFrcG9pbnRQcm92aWRlcltdIHByb3ZpZGVycyA9IG5ldyBJQnJlYWtwb2ludFByb3ZpZGVyW3Muc2l6ZSgpXTsKLQkJSXRlcmF0b3IgaXRyID0gcy5pdGVyYXRvcigpOwotCQlpbnQgaSA9IDA7Ci0JCUlTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIHRvb2xzID0gbnVsbDsKLQkJaWYgKGVkaXRvcnBhcnQgIT0gbnVsbCAmJiBpdHIuaGFzTmV4dCgpKQotCQkJdG9vbHMgPSAoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMpIGVkaXRvcnBhcnQuZ2V0QWRhcHRlcihJU291cmNlRWRpdGluZ1RleHRUb29scy5jbGFzcyk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlwcm92aWRlcnNbaV0gPSAoSUJyZWFrcG9pbnRQcm92aWRlcikgaXRyLm5leHQoKTsKLQkJCXByb3ZpZGVyc1tpXS5zZXRTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKHRvb2xzKTsKLQkJCWkrKzsKLQkJfQotCQlyZXR1cm4gcHJvdmlkZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29ycmVzcG9uZGluZyByZXNvdXJjZSBmcm9tIGdpdmVuIHBhcmFtZXRlcnMKLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcGFyYW0gaGFuZGxlcgotCSAqIEBwYXJhbSBleHQKLQkgKiBAcmV0dXJuIElSZXNvdXJjZQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSUVkaXRvcklucHV0IGlucHV0LCBTdHJpbmcgY29udGVudFR5cGUsIFN0cmluZyBleHQpIHsKLQkJSUJyZWFrcG9pbnRQcm92aWRlcltdIHByb3ZpZGVycyA9IGdldEJyZWFrcG9pbnRQcm92aWRlcnMobnVsbCwgY29udGVudFR5cGUsIGV4dCk7Ci0JCUlSZXNvdXJjZSByZXMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3ZpZGVycy5sZW5ndGg7IGkrKykgewotCQkJcmVzID0gcHJvdmlkZXJzW2ldLmdldFJlc291cmNlKGlucHV0KTsKLQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRDYWNoZSgpIHsKLQkJaWYgKGNhY2hlID09IG51bGwpIHsKLQkJCWNhY2hlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJcmVhZENvbnRyaWJ1dGlvbnMoVEFHX0JSRUFLUE9JTlRfQ09OVFJJQlVUSU9OLCBQTF9CUkVBS1BPSU5UKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYnJlYWtwb2ludCBwcm92aWRlcnMgZm9yIGEgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZQotCSAqIGhhbmRsZXIKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiAgICAgICAgICAgIGEgY29udGVudCB0eXBlIElEIG9yIG51bGwKLQkgKiBAcGFyYW0gZXh0Ci0JICogICAgICAgICAgICBhIGZpbGVuYW1lIGV4dGVuc2lvbiBvciBudWxsCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoU3RyaW5nIGNvbnRlbnRUeXBlLCBTdHJpbmcgZXh0KSB7Ci0JCWJvb2xlYW4gYXZhaWxhYmxlID0gZmFsc2U7Ci0JCWlmIChleHQgIT0gbnVsbCkKLQkJCWF2YWlsYWJsZSA9IGZpbmRFbGVtZW50cyhleHQpLmxlbmd0aCA+IDA7Ci0JCWlmICghYXZhaWxhYmxlICYmIGNvbnRlbnRUeXBlICE9IG51bGwpCi0JCQlhdmFpbGFibGUgPSBmaW5kRWxlbWVudHMoY29udGVudFR5cGUpLmxlbmd0aCA+IDA7Ci0JCXJldHVybiBhdmFpbGFibGU7Ci0JfQotCi0JLyoqCi0JICogUmVhZHMgdGhlIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgcmVnaXN0cnkgZm9yIHRoZSBwcm92aWRlZCB3b3JrYmVuY2gKLQkgKiBwYXJ0IGFuZCB0aGUgcHJvdmlkZWQgZXh0ZW5zaW9uIHBvaW50IElELgotCSAqIAotCSAqIEBwYXJhbSB0YWcKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkQ29udHJpYnV0aW9ucyhTdHJpbmcgdGFnLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJdGFyZ2V0Q29udHJpYnV0aW9uVGFnID0gdGFnOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlyZWFkUmVnaXN0cnkocmVnaXN0cnksIFBMVUdJTl9JRCwgZXh0ZW5zaW9uUG9pbnQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB0YWcgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJaWYgKHRhZy5lcXVhbHModGFyZ2V0Q29udHJpYnV0aW9uVGFnKSkgewotCQkJcmVhZEVsZW1lbnRDaGlsZHJlbihlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX1BST1ZJREVSKSkgewotCQkJY2FjaGUuYWRkKGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7IC8vIGp1c3QgY2FjaGUgdGhlIGVsZW1lbnQgLSBkb24ndCBnbyBpbnRvIGl0Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vRHJvcEFjdGlvblByb3h5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0Ryb3BBY3Rpb25Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDRmNDlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vRHJvcEFjdGlvblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUHJveHk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JFeHRlbnNpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSUV4dGVuZGVkU2ltcGxlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5JU2VsZlZhbGlkYXRlRWRpdEFjdGlvbjsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIERyb3BBY3Rpb25Qcm94eSBpbXBsZW1lbnRzIEludm9jYXRpb25IYW5kbGVyIHsKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShPYmplY3Qgb2JqKSB7Ci0JCU9iamVjdCBpbnN0YW5jZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJCUNsYXNzIGNsYXp6ID0gb2JqLmdldENsYXNzKCk7Ci0JCQl3aGlsZSAoY2xhenogIT0gbnVsbCkgewotCQkJCUNsYXNzW10gaW50ZXJmYWNlcyA9IGNsYXp6LmdldEludGVyZmFjZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJc2V0LmFkZChpbnRlcmZhY2VzW2ldKTsKLQkJCQl9Ci0JCQkJY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7Ci0JCQl9Ci0JCQlDbGFzc1tdIGNsYXNzZXMgPSBuZXcgQ2xhc3Nbc2V0LnNpemUoKV07Ci0JCQlJdGVyYXRvciBpdHIgPSBzZXQuaXRlcmF0b3IoKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQkJY2xhc3Nlc1tpXSA9IChDbGFzcykgaXRyLm5leHQoKTsKLQkJCQlpKys7Ci0JCQl9Ci0JCQlpbnN0YW5jZSA9IFByb3h5Lm5ld1Byb3h5SW5zdGFuY2Uob2JqLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwgY2xhc3NlcywgbmV3IERyb3BBY3Rpb25Qcm94eShvYmopKTsKLQkJfSBjYXRjaCAoRXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIHByb3h5aW5nIGEgZHJvcCBhY3Rpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJaW5zdGFuY2UgPSBvYmo7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgSUV4dGVuZGVkU2ltcGxlRWRpdG9yIGVkaXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGZSZWNvcmRlcjsKLQlwcml2YXRlIE9iamVjdCBvYmo7Ci0KLQlwcml2YXRlIERyb3BBY3Rpb25Qcm94eShPYmplY3Qgb2JqKSB7Ci0JCXRoaXMub2JqID0gb2JqOwotCX0KLQotCXByaXZhdGUgdm9pZCBiZWdpblJlY29yZGluZygpIHsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQlkb2N1bWVudCA9IGVkaXRvci5nZXREb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpCi0JCQkJZlJlY29yZGVyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0JCQkvLyBQcmVwYXJlIGZvciBVbmRvCi0JCQlpZiAoZlJlY29yZGVyICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bSA9IGZSZWNvcmRlci5nZXRVbmRvTWFuYWdlcigpOwotCQkJCWlmICh1bSAhPSBudWxsKSB7Ci0JCQkJCWlmICh0aGlzLm9iaiBpbnN0YW5jZW9mIElBY3Rpb24pCi0JCQkJCQl1bS5iZWdpblJlY29yZGluZyh0aGlzLCAoKElBY3Rpb24pIHRoaXMub2JqKS5nZXRUZXh0KCksICgoSUFjdGlvbikgdGhpcy5vYmopLmdldERlc2NyaXB0aW9uKCkpOwotCQkJCQllbHNlCi0JCQkJCQl1bS5iZWdpblJlY29yZGluZyh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5kUmVjb3JkaW5nKCkgewotCQlpZiAoZlJlY29yZGVyICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVtID0gZlJlY29yZGVyLmdldFVuZG9NYW5hZ2VyKCk7Ci0JCQlpZiAodW0gIT0gbnVsbCkKLQkJCQl1bS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQlmUmVjb3JkZXIucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQlmUmVjb3JkZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlciNpbnZva2UoT2JqZWN0LCBNZXRob2QsCi0JICogICAgICBPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3QgcHJveHksIE1ldGhvZCBtLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJT2JqZWN0IHJlc3VsdDsKLQkJU3RyaW5nIG5hbWUgPSBtLmdldE5hbWUoKTsKLQkJdHJ5IHsKLQkJCWlmIChuYW1lLmVxdWFscygiZXF1YWxzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIFdvcmthcm91bmQgZm9yIEpESydzIGJ1ZyA0NjUyODc2Ci0JCQkJLy8gImVxdWFscyIgYWx3YXlzIHJldHVybnMgZmFsc2UgZXZlbiBpZiBib3RoCi0JCQkJLy8gSW52b2NhdGlvbkhhbmRsZXIKLQkJCQkvLyBjbGFzcwotCQkJCS8vIGhvbGQgdGhlIHNhbWUgb2JqZWN0cwotCQkJCS8vIFNlZQotCQkJCS8vIGh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80NjUyODc2Lmh0bWwKLQkJCQkvLyBUaGlzIHByb2JsZW0gaXMgaW4gdGhlIElCTSBTREsgMS4zLjEKLQkJCQkvLyBidXQgSSBkb24ndCBzZWUgdGhlIGJ1ZyBpbiBTdW4ncyBKREsgMS40LjEgKGJldGEpCi0JCQkJT2JqZWN0IGFyZyA9IGFyZ3NbMF07Ci0JCQkJcmV0dXJuIChwcm94eS5nZXRDbGFzcygpID09IGFyZy5nZXRDbGFzcygpICYmIGVxdWFscyhQcm94eS5nZXRJbnZvY2F0aW9uSGFuZGxlcihhcmcpKSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFscygicnVuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhcmdzWzFdIGluc3RhbmNlb2YgSUV4dGVuZGVkU2ltcGxlRWRpdG9yKSB7Ci0JCQkJCWVkaXRvciA9IChJRXh0ZW5kZWRTaW1wbGVFZGl0b3IpIGFyZ3NbMV07Ci0JCQkJfQotCQkJCWJlZ2luUmVjb3JkaW5nKCk7Ci0JCQkJaWYgKChhcmdzWzFdIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpICYmICEob2JqIGluc3RhbmNlb2YgSVNlbGZWYWxpZGF0ZUVkaXRBY3Rpb24pICYmICFpc0VkaXRhYmxlKChJVGV4dEVkaXRvcikgYXJnc1sxXSkpIHsKLQkJCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCQkJfQotCQkJfQotCQkJcmVzdWx0ID0gbS5pbnZva2Uob2JqLCBhcmdzKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG5hbWUuZXF1YWxzKCJydW4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZW5kUmVjb3JkaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFZGl0YWJsZShJVGV4dEVkaXRvciBlZGl0b3IpIHsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yRXh0ZW5zaW9uMikKLQkJCXJldHVybiAoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMikgZWRpdG9yKS52YWxpZGF0ZUVkaXRvcklucHV0U3RhdGUoKTsKLQkJcmV0dXJuIGVkaXRvci5pc0VkaXRhYmxlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9FeHRlbmRlZEVkaXRvckFjdGlvblByb3h5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExYzdiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSUV4dGVuZGVkU2ltcGxlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5JU2VsZlZhbGlkYXRlRWRpdEFjdGlvbjsKLQotCi0vKioKLSAqIEJlZ2lucyBhbmQgZW5kcyBVbmRvTWFuYWdlciByZWNvcmRpbmcgYXJvdW5kIHJ1bigpIGFuZCBydW5XaXRoRXZlbnQoLi4uKQotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eSBpbXBsZW1lbnRzIEludm9jYXRpb25IYW5kbGVyIHsKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShPYmplY3Qgb2JqKSB7Ci0JCVNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQlDbGFzcyBjbGF6eiA9IG9iai5nZXRDbGFzcygpOwotCQl3aGlsZSAoY2xhenogIT0gbnVsbCkgewotCQkJQ2xhc3NbXSBpbnRlcmZhY2VzID0gY2xhenouZ2V0SW50ZXJmYWNlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2V0LmFkZChpbnRlcmZhY2VzW2ldKTsKLQkJCX0KLQkJCWNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOwotCQl9Ci0JCUNsYXNzW10gY2xhc3NlcyA9IG5ldyBDbGFzc1tzZXQuc2l6ZSgpXTsKLQkJSXRlcmF0b3IgaXRyID0gc2V0Lml0ZXJhdG9yKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCWNsYXNzZXNbaV0gPSAoQ2xhc3MpIGl0ci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJcmV0dXJuIFByb3h5Lm5ld1Byb3h5SW5zdGFuY2Uob2JqLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwgY2xhc3NlcywgbmV3IEV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHkob2JqKSk7Ci0JfQotCi0JcHJpdmF0ZSBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IgZWRpdG9yID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZlJlY29yZGVyOwotCXByaXZhdGUgT2JqZWN0IG9iajsKLQotCXByaXZhdGUgRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eShPYmplY3Qgb2JqKSB7Ci0JCXRoaXMub2JqID0gb2JqOwotCX0KLQotCXByaXZhdGUgdm9pZCBiZWdpblJlY29yZGluZygpIHsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQlkb2N1bWVudCA9IGVkaXRvci5nZXREb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpCi0JCQkJZlJlY29yZGVyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0JCQkvLyBQcmVwYXJlIGZvciBVbmRvCi0JCQlpZiAoZlJlY29yZGVyICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bSA9IGZSZWNvcmRlci5nZXRVbmRvTWFuYWdlcigpOwotCQkJCWlmICh1bSAhPSBudWxsKSB7Ci0JCQkJCXVtLmJlZ2luUmVjb3JkaW5nKHRoaXMsICgoSUFjdGlvbikgdGhpcy5vYmopLmdldFRleHQoKSwgKChJQWN0aW9uKSB0aGlzLm9iaikuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuZFJlY29yZGluZygpIHsKLQkJaWYgKGZSZWNvcmRlciAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bSA9IGZSZWNvcmRlci5nZXRVbmRvTWFuYWdlcigpOwotCQkJaWYgKHVtICE9IG51bGwpIHsKLQkJCQl1bS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQl9Ci0JCQlmUmVjb3JkZXIucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQlmUmVjb3JkZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlciNpbnZva2UoT2JqZWN0LCBNZXRob2QsCi0JICogICAgICBPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3QgcHJveHksIE1ldGhvZCBtLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBuYW1lID0gbS5nZXROYW1lKCk7Ci0JCXRyeSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoImVxdWFscyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBXb3JrYXJvdW5kIGZvciBKREsncyBidWcgNDY1Mjg3NgotCQkJCS8vICJlcXVhbHMiIGFsd2F5cyByZXR1cm5zIGZhbHNlIGV2ZW4gaWYgYm90aAotCQkJCS8vIEludm9jYXRpb25IYW5kbGVyCi0JCQkJLy8gY2xhc3MKLQkJCQkvLyBob2xkIHRoZSBzYW1lIG9iamVjdHMKLQkJCQkvLyBTZWUKLQkJCQkvLyBodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvYnVnUGFyYWRlL2J1Z3MvNDY1Mjg3Ni5odG1sCi0JCQkJLy8gVGhpcyBwcm9ibGVtIGlzIGluIHRoZSBJQk0gU0RLIDEuMy4xCi0JCQkJLy8gYnV0IEkgZG9uJ3Qgc2VlIHRoZSBidWcgaW4gU3VuJ3MgSkRLIDEuNC4xIChiZXRhKQotCQkJCU9iamVjdCBhcmcgPSBhcmdzWzBdOwotCQkJCXJldHVybiAocHJveHkuZ2V0Q2xhc3MoKSA9PSBhcmcuZ2V0Q2xhc3MoKSAmJiBlcXVhbHMoUHJveHkuZ2V0SW52b2NhdGlvbkhhbmRsZXIoYXJnKSkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoInJ1bldpdGhFdmVudCIpIHx8IG5hbWUuZXF1YWxzKCJydW4iKSkgeyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJYmVnaW5SZWNvcmRpbmcoKTsKLQkJCQlpZiAoKGVkaXRvciAhPSBudWxsKSAmJiAhKHRoaXMub2JqIGluc3RhbmNlb2YgSVNlbGZWYWxpZGF0ZUVkaXRBY3Rpb24pKSB7Ci0JCQkJCQotCQkJCQkvLyBUT0RPOiBjbGVhbnVwIHZhbGlkYXRlRWRpdAotCQkJCQkvLyBqdXN0IGxlYXZpbmcgdGhpcyBjaGVjayBhbmQgZm9sbG93aW5nIGNvZGUgaGVyZSBmb3IgdHJhbnNpdGlvbi4gCi0JCQkJCS8vIEkgYXNzdW1lIHdlJ2xsIHJlbW92ZSBhbGwgbmVlZCBmb3IgJ3ZhbGlkYXRlRWRpdCcKLQkJCQkJLy8gb3IgbW92ZSB0byBwbGF0Zm9ybSBlZGl0b3IncyB2YWxpZGF0ZVN0YXRlIAotCi0vLwkJCQkJSVN0YXR1cyBzdGF0dXMgPSBlZGl0b3IudmFsaWRhdGVFZGl0KGdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpKTsKLS8vCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLS8vCQkJCQkJcmV0dXJuIG51bGw7Ci0vLwkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoInNldEFjdGl2ZUV4dGVuZGVkRWRpdG9yIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhcmdzWzBdIGluc3RhbmNlb2YgSUV4dGVuZGVkU2ltcGxlRWRpdG9yKSB7Ci0JCQkJCWVkaXRvciA9IChJRXh0ZW5kZWRTaW1wbGVFZGl0b3IpIGFyZ3NbMF07Ci0JCQkJfQotCQkJfQotCQkJcmVzdWx0ID0gbS5pbnZva2UodGhpcy5vYmosIGFyZ3MpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkvL3Rocm93IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJaWYgKG5hbWUuZXF1YWxzKCJydW5XaXRoRXZlbnQiKSB8fCBuYW1lLmVxdWFscygicnVuIikpIHsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCS8vIG9ubHkgZXhwb3NlIHVzZXItZHJpdmVuIGV4Y2VwdGlvbnMgZnJvbSAicnVubmluZyIgdG8gdGhlCi0JCQkJLy8gdXNlcgotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChuYW1lLmVxdWFscygicnVuV2l0aEV2ZW50IikgfHwgbmFtZS5lcXVhbHMoInJ1biIpKSB7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQllbmRSZWNvcmRpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9FeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NzYyOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9FeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRTaW1wbGVFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcgaW1wbGVtZW50cyBJRXh0ZW5kZWRFZGl0b3JBY3Rpb24sIElFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nLCBJQWN0aW9uIHsKLSAgICBwcml2YXRlIElBY3Rpb24gcHJveHk7Ci0gICAgcHJpdmF0ZSBJQWN0aW9uIGR1bW15ID0gbmV3IEFjdGlvbigpIHsgLy8gdGhpcyBpcyBmb3IgbWFpbmx5IGl0cyBwcm9wZXJ0eSBjaGFuZ2Ugbm90aWZ5Li4uCi0gICAgfTsKLSAgICAvLyBwcm94eSdlZCBwcm9wZXJ0aWVzCi0gICAgcHJpdmF0ZSBTdHJpbmcgcF9pZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0X3BfaWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcF90ZXh0OwotICAgIHByaXZhdGUgU3RyaW5nIHBfZGVzY3JpcHRpb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNldF9wX3RleHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNldF9wX2Rlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIHBfdG9vbFRpcFRleHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNldF9wX3Rvb2xUaXBUZXh0OwotICAgIHByaXZhdGUgU3RyaW5nIHBfYWN0aW9uRGVmaW5pdGlvbklkOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRfcF9hY3Rpb25EZWZpbml0aW9uSWQ7Ci0gICAgcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgcF9pbWFnZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0X3BfaW1hZ2U7Ci0gICAgcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgcF9ob3ZlckltYWdlOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRfcF9ob3ZlckltYWdlOwotICAgIHByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIHBfZGlzYWJsZWRJbWFnZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0X3BfZGlzYWJsZWRJbWFnZTsKLSAgICBwcml2YXRlIGludCBwX2FjY2VsZXJhdG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRfcF9hY2NlbGVyYXRvcjsKLSAgICBwcml2YXRlIGludCBwX3N0eWxlID0gQVNfUFVTSF9CVVRUT047Ci0gICAgLy9wcml2YXRlIGJvb2xlYW4gc2V0X3Bfc3R5bGU7Ci0gICAgcHJpdmF0ZSBIZWxwTGlzdGVuZXIgcF9oZWxwTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNldF9wX2hlbHBMaXN0ZW5lcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gcF9lbmFibGVkID0gdHJ1ZTsgLy8gc2hvdWxkIGJlIHNhbWUgYXMgd2hhdCBpcyBkb25lIGluCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldF9wX2VuYWJsZWQ7Ci0gICAgcHJpdmF0ZSBMaXN0ZW5lckxpc3QgcF9saXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KDMpOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRfcF9saXN0ZW5lcnM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHBfY2hlY2tlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0X3BfY2hlY2tlZDsKLSAgICBwcml2YXRlIElFeHRlbmRlZFNpbXBsZUVkaXRvciBwX3RhcmdldEVkaXRvcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0X3BfdGFyZ2V0RWRpdG9yOwotCXByaXZhdGUgYm9vbGVhbiBwX2lzdmlzaWJsZSA9IHRydWU7IC8vIHNob3VsZCBiZSB0cnVlCi0JCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIFN0cmluZyBjbGFzc0F0dHJpYnV0ZTsKLQotCSAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHBfbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgICAgIHNldF9wX2xpc3RlbmVycyA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3h5LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldEFjY2VsZXJhdG9yKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEFjY2VsZXJhdG9yKCkgewotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0QWNjZWxlcmF0b3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcF9hY2NlbGVyYXRvcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldEFjdGlvbkRlZmluaXRpb25JZCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25EZWZpbml0aW9uSWQoKSB7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXRBY3Rpb25EZWZpbml0aW9uSWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcF9hY3Rpb25EZWZpbml0aW9uSWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXREZXNjcmlwdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwX2lkICsgIjogZ2V0RGVzY3JpcHRpb24iKTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX2Rlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoKQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX2Rpc2FibGVkSW1hZ2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRIZWxwTGlzdGVuZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBIZWxwTGlzdGVuZXIgZ2V0SGVscExpc3RlbmVyKCkgewotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0SGVscExpc3RlbmVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBfaGVscExpc3RlbmVyOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoKQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXRIb3ZlckltYWdlRGVzY3JpcHRvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX2hvdmVySW1hZ2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRJZCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmdldElkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBfaWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRJbWFnZURlc2NyaXB0b3IoKQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBfaW1hZ2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRNZW51Q3JlYXRvcigpCi0gICAgICovCi0gICAgcHVibGljIElNZW51Q3JlYXRvciBnZXRNZW51Q3JlYXRvcigpIHsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwX2lkICsgIjogZ2V0TWVudUNyZWF0b3IiKTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKLSAgICAgICAgcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmdldE1lbnVDcmVhdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRTdHlsZSgpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTdHlsZSgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmdldFN0eWxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBfc3R5bGU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRUZXh0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXRUZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBfdGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcF90ZXh0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldFRvb2xUaXBUZXh0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0VG9vbFRpcFRleHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcF90b29sVGlwVGV4dDsKLSAgICB9Ci0gICAgCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIGNvbnRyaWJ1dGluZyBidW5kbGUgaXMgYWN0aXZlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCdW5kbGVBY3RpdmUoKSB7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCAmJiBidW5kbGUuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNpc0NoZWNrZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tlZCgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmlzQ2hlY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX2NoZWNrZWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNpc0VuYWJsZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmlzRW5hYmxlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX2VuYWJsZWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNyZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBwX2xpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBkdW1teS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBpZiB0aGlzIGhhcyBhIGtleSBhY2NlbGVyYXRvciwgZmlyc3QgdXBkYXRlIHRoaXMgYWN0aW9uIGFuZCB0bwotICAgICAgICAgICAgLy8gc2VlIGlmIHRoaXMgYWN0aW9uIGlzIGVuYWJsZWQgb3Igbm90LgotICAgICAgICAgICAgaWYgKChwcm94eS5nZXRBY2NlbGVyYXRvcigpID4gMCkgfHwgKHByb3h5LmdldEFjdGlvbkRlZmluaXRpb25JZCgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRW5hYmxlZCgpID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJveHkucnVuKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcm94eS5ydW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuV2l0aEV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChFdmVudCBldmVudCkgewotICAgICAgICByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBzYW1lIGFzIHJ1bigpCi0gICAgICAgICAgICBpZiAoKHByb3h5LmdldEFjY2VsZXJhdG9yKCkgPiAwKSB8fCAocHJveHkuZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNFbmFibGVkKCkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBwcm94eS5ydW5XaXRoRXZlbnQoZXZlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJveHkucnVuV2l0aEV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0QWN0aW9uRGVmaW5pdGlvbklkKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aW9uRGVmaW5pdGlvbklkKFN0cmluZyBpZCkgewotICAgICAgICBwX2FjdGlvbkRlZmluaXRpb25JZCA9IGlkOwotICAgICAgICBzZXRfcF9hY3Rpb25EZWZpbml0aW9uSWQgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRBY3Rpb25EZWZpbml0aW9uSWQoaWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuc2V0QWN0aW9uRGVmaW5pdGlvbklkKGlkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0Q2hlY2tlZChib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKSB7Ci0gICAgICAgIHBfY2hlY2tlZCA9IGNoZWNrZWQ7Ci0gICAgICAgIHNldF9wX2NoZWNrZWQgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRDaGVja2VkKGNoZWNrZWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuc2V0Q2hlY2tlZChjaGVja2VkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0RGVzY3JpcHRpb24oamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgcF9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgICAgICBzZXRfcF9kZXNjcmlwdGlvbiA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3h5LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3Iob3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBuZXdJbWFnZSkgewotICAgICAgICBwX2Rpc2FibGVkSW1hZ2UgPSBuZXdJbWFnZTsKLSAgICAgICAgc2V0X3BfZGlzYWJsZWRJbWFnZSA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3h5LnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKG5ld0ltYWdlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKG5ld0ltYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0RW5hYmxlZChib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIHBfZW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgICAgIHNldF9wX2VuYWJsZWQgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0SGVscExpc3RlbmVyKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhlbHBMaXN0ZW5lcihIZWxwTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgcF9oZWxwTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICAgICAgc2V0X3BfaGVscExpc3RlbmVyID0gdHJ1ZTsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJveHkuc2V0SGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldEhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEhvdmVySW1hZ2VEZXNjcmlwdG9yKG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IgbmV3SW1hZ2UpIHsKLSAgICAgICAgcF9ob3ZlckltYWdlID0gbmV3SW1hZ2U7Ci0gICAgICAgIHNldF9wX2hvdmVySW1hZ2UgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihuZXdJbWFnZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlkdW1teS5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihuZXdJbWFnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldElkKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHBfaWQgPSBpZDsKLSAgICAgICAgc2V0X3BfaWQgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRJZChpZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlkdW1teS5zZXRJZChpZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEltYWdlRGVzY3JpcHRvcihvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBuZXdJbWFnZSkgewotICAgICAgICBwX2ltYWdlID0gbmV3SW1hZ2U7Ci0gICAgICAgIHNldF9wX2ltYWdlID0gdHJ1ZTsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJveHkuc2V0SW1hZ2VEZXNjcmlwdG9yKG5ld0ltYWdlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldEltYWdlRGVzY3JpcHRvcihuZXdJbWFnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldE1lbnVDcmVhdG9yKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVudUNyZWF0b3IoSU1lbnVDcmVhdG9yIGNyZWF0b3IpIHsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwX2lkICsgIjogc2V0TWVudUNyZWF0b3IiKTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKLSAgICAgICAgcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJveHkuc2V0TWVudUNyZWF0b3IoY3JlYXRvcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlkdW1teS5zZXRNZW51Q3JlYXRvcihjcmVhdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0VGV4dChqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcF90ZXh0ID0gdGV4dDsKLSAgICAgICAgc2V0X3BfdGV4dCA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3h5LnNldFRleHQodGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlkdW1teS5zZXRUZXh0KHRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRUb29sVGlwVGV4dChqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvb2xUaXBUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHBfdG9vbFRpcFRleHQgPSB0ZXh0OwotICAgICAgICBzZXRfcF90b29sVGlwVGV4dCA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3h5LnNldFRvb2xUaXBUZXh0KHRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuc2V0VG9vbFRpcFRleHQodGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEFjY2VsZXJhdG9yKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY2NlbGVyYXRvcihpbnQga2V5Y29kZSkgewotICAgICAgICBwX2FjY2VsZXJhdG9yID0ga2V5Y29kZTsKLSAgICAgICAgc2V0X3BfYWNjZWxlcmF0b3IgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRBY2NlbGVyYXRvcihrZXljb2RlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldEFjY2VsZXJhdG9yKGtleWNvZGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklFeHRlbmRlZEVkaXRvckFjdGlvbiNzZXRBY3RpdmVFeHRlbmRlZEVkaXRvcihjb20uaWJtLnNzZS5lZGl0b3IuZXh0ZW5zaW9uLklFeHRlbmRlZFNpbXBsZUVkaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFeHRlbmRlZEVkaXRvcihJRXh0ZW5kZWRTaW1wbGVFZGl0b3IgdGFyZ2V0RWRpdG9yKSB7Ci0JCXBfdGFyZ2V0RWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCQlzZXRfcF90YXJnZXRFZGl0b3IgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmICgocHJveHkgIT0gbnVsbCkgJiYgKHByb3h5IGluc3RhbmNlb2YgSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSkgewotICAgICAgICAgICAgKChJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pcHJveHkpLnNldEFjdGl2ZUV4dGVuZGVkRWRpdG9yKHRhcmdldEVkaXRvcik7Ci0gICAgICAgIH0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLnNzZS5lZGl0b3IuZXh0ZW5zaW9uLklFeHRlbmRlZEVkaXRvckFjdGlvbiNpc1Zpc2libGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAoKHByb3h5ICE9IG51bGwpICYmIChwcm94eSBpbnN0YW5jZW9mIElFeHRlbmRlZEVkaXRvckFjdGlvbikpIHsKLSAgICAgICAgICAgIHJldHVybiAoKElFeHRlbmRlZEVkaXRvckFjdGlvbilwcm94eSkuaXNWaXNpYmxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBfaXN2aXNpYmxlOwotCX0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jaXNIYW5kbGVkCi0gICAgICovCi0JcHVibGljIGJvb2xlYW4gaXNIYW5kbGVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gc2VlIEFjdGlvbkRlc2NyaXB0b3IjY3JlYXRlRXh0ZW5zaW9uCi0JcHJpdmF0ZSBzdGF0aWMgSUFjdGlvbiBuZXdJbnN0YW5jZShmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxtLCBmaW5hbCBTdHJpbmcgY2xhKSB7Ci0JCWZpbmFsIE9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMV07Ci0JCS8vIElmIHBsdWdpbiBoYXMgYmVlbiBsb2FkZWQgY3JlYXRlIGV4dGVuc2lvbi4KLQkJLy8gT3RoZXJ3aXNlLCBzaG93IGJ1c3kgY3Vyc29yIHRoZW4gY3JlYXRlIGV4dGVuc2lvbi4KLQkJQnVuZGxlIGJ1bmRsZT0gUGxhdGZvcm0uZ2V0QnVuZGxlKGVsbS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCAmJiBidW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQl0cnkgewotCQkJCXJlc3VsdFswXSA9IGVsbS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjYXRjaCBhbmQgbG9nIEFOWSBleGNlcHRpb24gZnJvbSBleHRlbnNpb24gcG9pbnQKLQkJCQloYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKHJlc3VsdCwgZSwgZWxtLmdldEF0dHJpYnV0ZShjbGEpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKG51bGwsIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRbMF0gPSBlbG0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihjbGEpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gY2F0Y2ggYW5kIGxvZyBBTlkgZXhjZXB0aW9uIGZyb20gZXh0ZW5zaW9uIHBvaW50Ci0JCQkJCQloYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKHJlc3VsdCwgZSwgZWxtLmdldEF0dHJpYnV0ZShjbGEpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWlmICgocmVzdWx0WzBdICE9IG51bGwpICYmIChyZXN1bHRbMF0gaW5zdGFuY2VvZiBJQWN0aW9uKSkgewotCQkJcmV0dXJuIChJQWN0aW9uKXJlc3VsdFswXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLSAgICB9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBoYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKGZpbmFsIE9iamVjdFtdIHJlc3VsdCwgVGhyb3dhYmxlIGUsIFN0cmluZyBjbGFzc25hbWUpIHsKLQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSBwcm94eSBhY3Rpb24gZm9yICIgKyBjbGFzc25hbWUsIGUpOwotCQlyZXN1bHRbMF0gPSBudWxsOwotCX0KLQotCS8qKgotICAgICAqIEluc3RhbnRpYXRlIGEgcmVhbCBjbGFzcyBoZXJlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVhbGl6ZSgpIHsKLSAgICAgICAgaWYgKChwcm94eSA9PSBudWxsKSAmJiAoZWxlbWVudCAhPSBudWxsKSAmJiAoY2xhc3NBdHRyaWJ1dGUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHByb3h5ID0gbmV3SW5zdGFuY2UoZWxlbWVudCwgY2xhc3NBdHRyaWJ1dGUpOwotCSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLQkgICAgICAgICAgICAvLyBwcm9wYWdhdGUgcHJveHknZWQgcHJvcGVydGllcwotCSAgICAgICAgICAgIGlmIChzZXRfcF9saXN0ZW5lcnMgPT0gdHJ1ZSkgewotCSAgICAgICAgICAgICAgICBpZiAocF9saXN0ZW5lcnMuc2l6ZSgpID4gMCkgewotCSAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gbCA9IHBfbGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCSAgICAgICAgICAgICAgICAgICAgaW50IGxzID0gbC5sZW5ndGg7Ci0JICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxzOyBpKyspIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwbCA9IChJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikgbFtpXTsKLQkgICAgICAgICAgICAgICAgICAgICAgICBwcm94eS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHBsKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICBkdW1teS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHBsKTsgLy8gcmVtb3ZlIGxpc3RlbmVyIGZyb20gZHltbXkgc28gdGhhdCB3ZSBkb24ndCBzZW5kIG5vdGlmaWNhdGlvbnMgdHdpY2UgYW55bW9yZQotCSAgICAgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmIChzZXRfcF9hY2NlbGVyYXRvciA9PSB0cnVlKSB7Ci0JICAgICAgICAgICAgICAgIHByb3h5LnNldEFjY2VsZXJhdG9yKHBfYWNjZWxlcmF0b3IpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBpZiAoc2V0X3BfYWN0aW9uRGVmaW5pdGlvbklkID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfYWN0aW9uRGVmaW5pdGlvbklkICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgICAgIHByb3h5LnNldEFjdGlvbkRlZmluaXRpb25JZChwX2FjdGlvbkRlZmluaXRpb25JZCk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX2NoZWNrZWQgPT0gdHJ1ZSkgewotCSAgICAgICAgICAgICAgICBwcm94eS5zZXRDaGVja2VkKHBfY2hlY2tlZCk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmIChzZXRfcF9kaXNhYmxlZEltYWdlID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfZGlzYWJsZWRJbWFnZSAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICAgICAgICBwcm94eS5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihwX2Rpc2FibGVkSW1hZ2UpOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmIChzZXRfcF9lbmFibGVkID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgcHJveHkuc2V0RW5hYmxlZChwX2VuYWJsZWQpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBpZiAoc2V0X3BfaGVscExpc3RlbmVyID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfaGVscExpc3RlbmVyICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgICAgIHByb3h5LnNldEhlbHBMaXN0ZW5lcihwX2hlbHBMaXN0ZW5lcik7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX2hvdmVySW1hZ2UgPT0gdHJ1ZSkgewotCSAgICAgICAgICAgICAgICBpZiAocF9ob3ZlckltYWdlICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgICAgIHByb3h5LnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKHBfaG92ZXJJbWFnZSk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX2lkID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfaWQgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICAgICAgcHJveHkuc2V0SWQocF9pZCk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX2ltYWdlID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfaW1hZ2UgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICAgICAgcHJveHkuc2V0SW1hZ2VEZXNjcmlwdG9yKHBfaW1hZ2UpOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmIChzZXRfcF90ZXh0ID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfdGV4dCAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICAgICAgICBwcm94eS5zZXRUZXh0KHBfdGV4dCk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX2Rlc2NyaXB0aW9uID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICAgICAgcHJveHkuc2V0RGVzY3JpcHRpb24ocF9kZXNjcmlwdGlvbik7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX3Rvb2xUaXBUZXh0ID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfdG9vbFRpcFRleHQgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICAgICAgcHJveHkuc2V0VG9vbFRpcFRleHQocF90b29sVGlwVGV4dCk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX3RhcmdldEVkaXRvciA9PSB0cnVlKSB7Ci0JICAgICAgICAgICAgICAgIGlmIChwX3RhcmdldEVkaXRvciAhPSBudWxsKSB7Ci0JCQkJICAgICAgICBpZiAocHJveHkgaW5zdGFuY2VvZiBJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pIHsKLQkJCQkgICAgICAgICAgICAoKElFeHRlbmRlZEVkaXRvckFjdGlvbilwcm94eSkuc2V0QWN0aXZlRXh0ZW5kZWRFZGl0b3IocF90YXJnZXRFZGl0b3IpOwotCQkJCSAgICAgICAgfQotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWFsaXplZCgpIHsKLSAgICAgICAgcmV0dXJuIChwcm94eSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZSN1cGRhdGUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAoKHByb3h5ICE9IG51bGwpICYmIChwcm94eSBpbnN0YW5jZW9mIElVcGRhdGUpKSB7Ci0gICAgICAgICAgICAoKElVcGRhdGUpIHByb3h5KS51cGRhdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCBhIHJlYWwgYWN0aW9uIGNsYXNzCi0gICAgICovCi0gICAgcHVibGljIElBY3Rpb24gZ2V0QWN0aW9uKCkgewotICAgICAgICByZWFsaXplKCk7Ci0gICAgICAgIHJldHVybiBwcm94eTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoZXNlIGFyZSBBY3Rpb25zJ3MgY29uc3RydWN0b3JzCi0gICAgICovCi0gICAgRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgfQotICAgIHB1YmxpYyBFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nKGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBmaW5hbCBTdHJpbmcgY2xhc3NBdHRyaWJ1dGUpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICAgICAgdGhpcy5jbGFzc0F0dHJpYnV0ZSA9IGNsYXNzQXR0cmlidXRlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vSUV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vSUV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczODU4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nIHsKLSAgICBwdWJsaWMgSUFjdGlvbiBnZXRBY3Rpb24oKTsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWxpemVkKCk7Ci0gICAgcHVibGljIHZvaWQgcmVhbGl6ZSgpOwotICAgIGJvb2xlYW4gaXNCdW5kbGVBY3RpdmUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vSW1hZ2VVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0ltYWdlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWZjNTYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vSW1hZ2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLQotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEltYWdlVXRpbCB7Ci0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIE1ldGhvZC4gUmV0dXJucyBhbiBJbWFnZURlc2NyaXB0b3Igd2hvc2UgcGF0aCwgcmVsYXRpdmUgdG8KLQkgKiB0aGUgcGx1Z2luIGNvbnRhaW5pbmcgdGhlIDxjb2RlPmV4dGVuc2lvbjwvY29kZT4gaXMKLQkgKiA8Y29kZT5zdWJkaXJlY3RvcnlBbmRGaWxlbmFtZTwvY29kZT4uIElmIHRoZXJlIGlzbid0IGFueSB2YWx1ZQotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZSB0aGVuIDxjb2RlPm51bGwKLQkgKiA8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIGNvbnZlbmllbmNlIGFuZCBvbmx5IGludGVuZGVkIGZvciB1c2UgYnkgdGhlIHdvcmtiZW5jaAotCSAqIGJlY2F1c2UgaXQgZXhwbGljaXRseSB1c2VzIHRoZSB3b3JrYmVuY2gncyByZWdpc3RyeSBmb3IKLQkgKiBjYWNoaW5nL3JldHJpZXZpbmcgaW1hZ2VzIGZyb20gb3RoZXIgZXh0ZW5zaW9ucyAtLSBvdGhlciBwbHVnaW5zIG11c3QKLQkgKiB1c2VyIHRoZWlyIG93biByZWdpc3RyeS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2QgaXMgc3ViamVjdCB0byByZW1vdmFsLgotCSAqIAotCSAqIE5vdGU6IHN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lIG11c3Qgbm90IGhhdmUgYW55IGxlYWRpbmcgIi4iIG9yIHBhdGgKLQkgKiBzZXBhcmF0b3JzIC8gb3IgXCBJU1YncyBzaG91bGQgdXNlIGljb25zL215c2FtcGxlLmdpZiBhbmQgbm90Ci0JICogLi9pY29ucy9teXNhbXBsZS5naWYKLQkgKiAKLQkgKiBOb3RlOiBUaGlzIGNvbnN1bHRzIHRoZSBwbHVnaW4gZm9yIGV4dGVuc2lvbiBhbmQgb2J0YWlucyBpdHMKLQkgKiBpbnN0YWxsYXRpb24gbG9jYXRpb24uIGFsbCByZXF1ZXN0ZWQgaW1hZ2VzIGFyZSBhc3N1bWVkIHRvIGJlIGluIGEKLQkgKiBkaXJlY3RvcnkgYmVsb3cgYW5kIHJlbGF0aXZlIHRvIHRoYXQgcGx1Z2lucyBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvckZyb21FeHRlbnNpb24oSUV4dGVuc2lvbiBleHRlbnNpb24sIFN0cmluZyBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSkgewotCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlKCk7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQlyZXR1cm4gZ2V0SW1hZ2VEZXNjcmlwdG9yRnJvbUJ1bmRsZShidW5kbGUsIHN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBNZXRob2QuIFJldHVybiBhbiBJbWFnZURlc2NyaXB0b3Igd2hvc2UgcGF0aCByZWxhdGl2ZSB0bwotCSAqIHRoZSBwbHVnaW4gZGVzY3JpYmVkIGJ5IDxjb2RlPmJ1bmRsZTwvY29kZT4gaXMKLQkgKiA8Y29kZT5zdWJkaXJlY3RvcnlBbmRGaWxlbmFtZTwvY29kZT4uIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiBubyBpbWFnZSBjb3VsZCBiZSBmb3VuZC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBjb252ZW5pZW5jZSBhbmQgb25seSBpbnRlbmRlZCBmb3IgdXNlIGJ5IHRoZSB3b3JrYmVuY2gKLQkgKiBiZWNhdXNlIGl0IGV4cGxpY2l0bHkgdXNlcyB0aGUgd29ya2JlbmNoJ3MgcmVnaXN0cnkgZm9yCi0JICogY2FjaGluZy9yZXRyaWV2aW5nIGltYWdlcyBmcm9tIG90aGVyIGV4dGVuc2lvbnMgLS0gb3RoZXIgcGx1Z2lucyBtdXN0Ci0JICogdXNlciB0aGVpciBvd24gcmVnaXN0cnkuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIGlzIHN1YmplY3QgdG8gcmVtb3ZhbC4KLQkgKiAKLQkgKiBOb3RlOiBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSBtdXN0IG5vdCBoYXZlIGFueSBsZWFkaW5nICIuIiBvciBwYXRoCi0JICogc2VwYXJhdG9ycyAvIG9yIFwgSVNWJ3Mgc2hvdWxkIHVzZSBpY29ucy9teXNhbXBsZS5naWYgYW5kIG5vdAotCSAqIC4vaWNvbnMvbXlzYW1wbGUuZ2lmCi0JICogCi0JICogTm90ZTogVGhpcyBjb25zdWx0cyB0aGUgcGx1Z2luIGZvciBleHRlbnNpb24gYW5kIG9idGFpbnMgaXRzCi0JICogaW5zdGFsbGF0aW9uIGxvY2F0aW9uLiBhbGwgcmVxdWVzdGVkIGltYWdlcyBhcmUgYXNzdW1lZCB0byBiZSBpbiBhCi0JICogZGlyZWN0b3J5IGJlbG93IGFuZCByZWxhdGl2ZSB0byB0aGF0IHBsdWdpbnMgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3JGcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSkgewotCi0JCVVSTCBwYXRoID0gYnVuZGxlLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJVVJMIGZ1bGxQYXRoU3RyaW5nID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZ1bGxQYXRoU3RyaW5nID0gbmV3IFVSTChwYXRoLCBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSk7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoZnVsbFBhdGhTdHJpbmcpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2ZThiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL1JlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLlNvcnRlcjsKLQotCi0vKioKLSAqIFRlbXBsYXRlIGltcGxlbWVudGF0aW9uIG9mIGEgcmVnaXN0cnkgcmVhZGVyIHRoYXQgY3JlYXRlcyBvYmplY3RzCi0gKiByZXByZXNlbnRpbmcgcmVnaXN0cnkgY29udGVudHMuIFR5cGljYWxseSwgYW4gZXh0ZW5zaW9uIGNvbnRhaW5zIG9uZQotICogZWxlbWVudCwgYnV0IHRoaXMgcmVhZGVyIGhhbmRsZXMgbXVsdGlwbGUgZWxlbWVudHMgcGVyIGV4dGVuc2lvbi4KLSAqIAotICogVG8gc3RhcnQgcmVhZGluZyB0aGUgZXh0ZW5zaW9ucyBmcm9tIHRoZSByZWdpc3RyeSBmb3IgYW4gZXh0ZW5zaW9uIHBvaW50LAotICogY2FsbCB0aGUgbWV0aG9kIDxjb2RlPnJlYWRSZWdpc3RyeTwvY29kZT4uCi0gKiAKLSAqIFRvIHJlYWQgY2hpbGRyZW4gb2YgYW4gSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBjYWxsIHRoZSBtZXRob2QKLSAqIDxjb2RlPnJlYWRFbGVtZW50Q2hpbGRyZW48L2NvZGU+IGZyb20geW91ciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWV0aG9kCi0gKiA8Y29kZT5yZWFkRWxlbWVudDwvY29kZT4sIGFzIGl0IHdpbGwgbm90IGJlIGRvbmUgYnkgZGVmYXVsdC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXByb3RlY3RlZCBSZWdpc3RyeVJlYWRlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBleHRyYWN0cyBkZXNjcmlwdGlvbiBhcyBhIHN1YmVsZW1lbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHJldHVybiBkZXNjcmlwdGlvbiBzdHJpbmcgaWYgZGVmaW5lZCwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vdC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWcuZ2V0Q2hpbGRyZW4oVEFHX0RFU0NSSVBUSU9OKTsKLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA+PSAxKSB7Ci0JCQlyZXR1cm4gY2hpbGRyZW5bMF0uZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBlcnJvciBpbiB0aGUgd29ya2JlbmNoIGxvZyB1c2luZyB0aGUgcHJvdmlkZWQgdGV4dCBhbmQgdGhlCi0JICogaW5mb3JtYXRpb24gaW4gdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2dFcnJvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRleHQpIHsKLQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJQbHVnaW4gIiArIGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKSArICIsIGV4dGVuc2lvbiAiICsgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJYnVmLmFwcGVuZCgiXG4iICsgdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIGEgdmVyeSBjb21tb24gcmVnaXN0cnkgZXJyb3Igd2hlbiBhIHJlcXVpcmVkIGF0dHJpYnV0ZSBpcyBtaXNzaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZ01pc3NpbmdBdHRyaWJ1dGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCWxvZ0Vycm9yKGVsZW1lbnQsICJSZXF1aXJlZCBhdHRyaWJ1dGUgJyIgKyBhdHRyaWJ1dGVOYW1lICsgIicgbm90IGRlZmluZWQiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIGEgcmVnaXN0cnkgZXJyb3Igd2hlbiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGlzIHVua25vd24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nVW5rbm93bkVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJbG9nRXJyb3IoZWxlbWVudCwgIlVua25vd24gZXh0ZW5zaW9uIHRhZyBmb3VuZDogIiArIGVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFwcGx5IGEgcmVwcm9kdWNhYmxlIG9yZGVyIHRvIHRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgcHJvdmlkZWQsIHN1Y2gKLQkgKiB0aGF0IHRoZSBvcmRlciB3aWxsIG5vdCBjaGFuZ2UgYXMgZXh0ZW5zaW9ucyBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSUV4dGVuc2lvbltdIG9yZGVyRXh0ZW5zaW9ucyhJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucykgewotCQkvLyBCeSBkZWZhdWx0LCB0aGUgb3JkZXIgaXMgYmFzZWQgb24gcGx1Z2luIGlkIHNvcnRlZAotCQkvLyBpbiBhc2NlbmRpbmcgb3JkZXIuIFRoZSBvcmRlciBmb3IgYSBwbHVnaW4gcHJvdmlkaW5nCi0JCS8vIG1vcmUgdGhhbiBvbmUgZXh0ZW5zaW9uIGZvciBhbiBleHRlbnNpb24gcG9pbnQgaXMKLQkJLy8gZGVwZW5kZW50IGluIHRoZSBvcmRlciBsaXN0ZWQgaW4gdGhlIFhNTCBmaWxlLgotCQlTb3J0ZXIgc29ydGVyID0gbmV3IFNvcnRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGNvbXBhcmUoT2JqZWN0IGV4dGVuc2lvbjEsIE9iamVjdCBleHRlbnNpb24yKSB7Ci0JCQkJU3RyaW5nIHMxID0gKChJRXh0ZW5zaW9uKSBleHRlbnNpb24xKS5nZXROYW1lc3BhY2UoKS50b1VwcGVyQ2FzZSgpOwotCQkJCVN0cmluZyBzMiA9ICgoSUV4dGVuc2lvbikgZXh0ZW5zaW9uMikuZ2V0TmFtZXNwYWNlKCkudG9VcHBlckNhc2UoKTsKLQkJCQkvL1JldHVybiB0cnVlIGlmIGVsZW1lbnRUd28gaXMgJ2dyZWF0ZXIgdGhhbicgZWxlbWVudE9uZQotCQkJCXJldHVybiBzMi5jb21wYXJlVG8oczEpID4gMDsKLQkJCX0KLQkJfTsKLQotCQlPYmplY3RbXSBzb3J0ZWQgPSBzb3J0ZXIuc29ydChleHRlbnNpb25zKTsKLQkJSUV4dGVuc2lvbltdIHNvcnRlZEV4dGVuc2lvbiA9IG5ldyBJRXh0ZW5zaW9uW3NvcnRlZC5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHNvcnRlZCwgMCwgc29ydGVkRXh0ZW5zaW9uLCAwLCBzb3J0ZWQubGVuZ3RoKTsKLQkJcmV0dXJuIHNvcnRlZEV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVhZCBlbGVtZW50J3MgYXR0cmlidXRlcy4gSWYgY2hpbGRyZW4gc2hvdWxkCi0JICogYWxzbyBiZSByZWFkLCB0aGVuIGltcGxlbWVudG9yIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nCi0JICogPGNvZGU+cmVhZEVsZW1lbnRDaGlsZHJlbjwvY29kZT4uIEltcGxlbWVudG9yIGlzIGFsc28gcmVzcG9uc2libGUKLQkgKiBmb3IgbG9nZ2luZyBtaXNzaW5nIGF0dHJpYnV0ZXMuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGVsZW1lbnQgd2FzIHJlY29nbml6ZWQsIGZhbHNlIGlmIG5vdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBSZWFkIHRoZSBlbGVtZW50J3MgY2hpbGRyZW4uIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBzdWJjbGFzcycKLQkgKiByZWFkRWxlbWVudCBtZXRob2Qgd2hlbiBpdCB3YW50cyB0byByZWFkIHRoZSBjaGlsZHJlbiBvZiB0aGUgZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudENoaWxkcmVuKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJlYWRFbGVtZW50cyhlbGVtZW50LmdldENoaWxkcmVuKCkpOwotCX0KLQotCS8qKgotCSAqIFJlYWQgZWFjaCBlbGVtZW50IG9uZSBhdCBhIHRpbWUgYnkgY2FsbGluZyB0aGUgc3ViY2xhc3MgaW1wbGVtZW50YXRpb24KLQkgKiBvZiA8Y29kZT5yZWFkRWxlbWVudDwvY29kZT4uCi0JICogCi0JICogTG9ncyBhbiBlcnJvciBpZiB0aGUgZWxlbWVudCB3YXMgbm90IHJlY29nbml6ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnRzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pKQotCQkJCWxvZ1Vua25vd25FbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlYWQgb25lIGV4dGVuc2lvbiBieSBsb29waW5nIHRocm91Z2ggaXRzIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZEV4dGVuc2lvbihJRXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQlyZWFkRWxlbWVudHMoZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgcmVhZFJlZ2lzdHJ5KElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZFJlZ2lzdHJ5KElQbHVnaW5SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQocGx1Z2luSWQsIGV4dGVuc2lvblBvaW50KTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gcG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZXh0ZW5zaW9ucyA9IG9yZGVyRXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLQkJCQlyZWFkRXh0ZW5zaW9uKGV4dGVuc2lvbnNbaV0pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFN0YXJ0IHRoZSByZWdpc3RyeSByZWFkaW5nIHByb2Nlc3MgdXNpbmcgdGhlIHN1cHBsaWVkIHBsdWdpbiBJRCBhbmQKLQkgKiBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZFJlZ2lzdHJ5KElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQocGx1Z2luSWQsIGV4dGVuc2lvblBvaW50KTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gcG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZXh0ZW5zaW9ucyA9IG9yZGVyRXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLQkJCQlyZWFkRXh0ZW5zaW9uKGV4dGVuc2lvbnNbaV0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0dGluZ1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlNWQ3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UeXBlZFBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Gb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3kgZXh0ZW5kcyBDb250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kgewotCi0JLyoqIERvY3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYnkgdGhpcyBzdHJhdGVneSAqLwotCXByaXZhdGUgZmluYWwgTGlua2VkTGlzdCBmRG9jdW1lbnRzID0gbmV3IExpbmtlZExpc3QoKTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZGb3JtYXRQcm9jZXNzb3I7Ci0JLyoqIFBhcnRpdGlvbnMgdG8gYmUgZm9ybWF0dGVkIGJ5IHRoaXMgc3RyYXRlZ3kgKi8KLQlwcml2YXRlIGZpbmFsIExpbmtlZExpc3QgZlBhcnRpdGlvbnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCXByaXZhdGUgSVJlZ2lvbiBmUmVnaW9uOwotCi0JLyoqCi0JICogQHBhcmFtIGZvcm1hdFByb2Nlc3NvcgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRm9ybWF0dGluZ1N0cmF0ZWd5KElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvcikgewotCQlzdXBlcigpOwotCi0JCWZGb3JtYXRQcm9jZXNzb3IgPSBmb3JtYXRQcm9jZXNzb3I7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdCgpIHsKLQkJc3VwZXIuZm9ybWF0KCk7Ci0KLQkJZmluYWwgSURvY3VtZW50IGRvY3VtZW50ID0gKElEb2N1bWVudCkgZkRvY3VtZW50cy5yZW1vdmVGaXJzdCgpOwotCQlmaW5hbCBUeXBlZFBvc2l0aW9uIHBhcnRpdGlvbiA9IChUeXBlZFBvc2l0aW9uKSBmUGFydGl0aW9ucy5yZW1vdmVGaXJzdCgpOwotCi0JCWlmIChkb2N1bWVudCAhPSBudWxsICYmIHBhcnRpdGlvbiAhPSBudWxsICYmIGZSZWdpb24gIT0gbnVsbCAmJiBmRm9ybWF0UHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZkZvcm1hdFByb2Nlc3Nvci5mb3JtYXREb2N1bWVudChkb2N1bWVudCwgZlJlZ2lvbi5nZXRPZmZzZXQoKSwgZlJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXR0ZXJTdGFydHMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdHRlclN0YXJ0cyhmaW5hbCBJRm9ybWF0dGluZ0NvbnRleHQgY29udGV4dCkgewotCQlzdXBlci5mb3JtYXR0ZXJTdGFydHMoY29udGV4dCk7Ci0KLQkJZlBhcnRpdGlvbnMuYWRkTGFzdChjb250ZXh0LmdldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX1BBUlRJVElPTikpOwotCQlmRG9jdW1lbnRzLmFkZExhc3QoY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9NRURJVU0pKTsKLQkJZlJlZ2lvbiA9IChJUmVnaW9uKSBjb250ZXh0LmdldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX1JFR0lPTik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXR0ZXJTdG9wcygpCi0JICovCi0JcHVibGljIHZvaWQgZm9ybWF0dGVyU3RvcHMoKSB7Ci0JCXN1cGVyLmZvcm1hdHRlclN0b3BzKCk7Ci0KLQkJZlBhcnRpdGlvbnMuY2xlYXIoKTsKLQkJZkRvY3VtZW50cy5jbGVhcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9oYW5kbGVycy9BYnN0cmFjdFN0cnVjdHVyZWRTZWxlY3RIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQWJzdHJhY3RTdHJ1Y3R1cmVkU2VsZWN0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTc5NzAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9oYW5kbGVycy9BYnN0cmFjdFN0cnVjdHVyZWRTZWxlY3RIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlNlbGVjdGlvbkhpc3Rvcnk7Ci0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBYnN0cmFjdFN0cnVjdHVyZWRTZWxlY3RIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZUVkaXRvcihldmVudCk7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCWVsc2UgewotCQkJT2JqZWN0IG8gPSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQlpZiAobyAhPSBudWxsKQotCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIG87Ci0JCX0KLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJLy8gZGV0ZXJtaW5lIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24KLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbiAmJiBkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCi0JCQkJaWYgKHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgPCBkb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJCQkvLyBnZXQgY3VycmVudCBpbmRleGVkIHJlZ2lvbgotCQkJCQlJbmRleGVkUmVnaW9uIGN1cnNvckluZGV4ZWRSZWdpb24gPSBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQotCQkJCQkvLyBkZXRlcm1pbmUgbmV3IHNlbGVjdGlvbiBiYXNlZCBvbiBjdXJyZW50IGluZGV4ZWQgcmVnaW9uCi0JCQkJCVJlZ2lvbiBuZXdTZWxlY3Rpb25SZWdpb24gPSBnZXROZXdTZWxlY3Rpb25SZWdpb24oY3Vyc29ySW5kZXhlZFJlZ2lvbiwgdGV4dFNlbGVjdGlvbik7Ci0KLQkJCQkJLy8gc2VsZWN0IG5ldyBzZWxlY3Rpb24KLQkJCQkJaWYgKG5ld1NlbGVjdGlvblJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlTZWxlY3Rpb25IaXN0b3J5IGhpc3RvcnkgPSAoU2VsZWN0aW9uSGlzdG9yeSkgZWRpdG9yLmdldEFkYXB0ZXIoU2VsZWN0aW9uSGlzdG9yeS5jbGFzcyk7Ci0JCQkJCQlpZiAoaGlzdG9yeSAhPSBudWxsKSB7Ci0JCQkJCQkJaGlzdG9yeS5yZW1lbWJlcihuZXcgUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQloaXN0b3J5Lmlnbm9yZVNlbGVjdGlvbkNoYW5nZXMoKTsKLQkJCQkJCQkJdGV4dEVkaXRvci5zZWxlY3RBbmRSZXZlYWwobmV3U2VsZWN0aW9uUmVnaW9uLmdldE9mZnNldCgpLCBuZXdTZWxlY3Rpb25SZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCX0KLQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJaGlzdG9yeS5saXN0ZW5Ub1NlbGVjdGlvbkNoYW5nZXMoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBwcm9iYWJseSBiZSByZW1vdmVkIGFuZCByZXBsYWNlZCBieSB1c2luZyBuZXcKLQkgKiBzZWxlY3Rpb24gcHJvdmlkZXIKLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW50IGxhc3RPZmZzZXQgPSBvZmZzZXQ7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24obGFzdE9mZnNldCk7Ci0JCQkJd2hpbGUgKGluZGV4ZWRSZWdpb24gPT0gbnVsbCAmJiBsYXN0T2Zmc2V0ID49IDApIHsKLQkJCQkJbGFzdE9mZnNldC0tOwotCQkJCQlpbmRleGVkUmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihsYXN0T2Zmc2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaGFuZGxlcnMvRmluZE9jY3VycmVuY2VzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2hhbmRsZXJzL0ZpbmRPY2N1cnJlbmNlc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhNWFkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaGFuZGxlcnMvRmluZE9jY3VycmVuY2VzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbmRPY2N1cnJlbmNlc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvclBhcnQ7Ci0JCWVsc2UgewotCQkJT2JqZWN0IG8gPSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCWJvb2xlYW4gb2theSA9IGZhbHNlOwotCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gZ2V0VGV4dFNlbGVjdGlvbih0ZXh0RWRpdG9yKTsKLQkJCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZmluZE9jY3VycmVuY2VQcm9jZXNzb3IgPSBnZXRQcm9jZXNzb3JGb3JDdXJyZW50U2VsZWN0aW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQkJCQlpZiAoZmluZE9jY3VycmVuY2VQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJCQlpZiAodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJCQkJSUZpbGUgZmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgdGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0JCQkJCQlva2F5ID0gZmluZE9jY3VycmVuY2VQcm9jZXNzb3IuZmluZE9jY3VycmVuY2VzKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uLCBmaWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAob2theSkgewotCQkJLy8gY2xlYXIgc3RhdHVzIG1lc3NhZ2UKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gU1NFVUlNZXNzYWdlcy5GaW5kT2NjdXJyZW5jZXNBY3Rpb25Qcm92aWRlcl8wOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodGV4dEVkaXRvciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0RWRpdG9yKSB7Ci0JCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5VGVtcG9yYXJ5RXJyb3JNZXNzYWdlKCgoU3RydWN0dXJlZFRleHRFZGl0b3IpIHRleHRFZGl0b3IpLmdldFRleHRWaWV3ZXIoKSwgZXJyb3JNZXNzYWdlKTsKLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0JCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5hZGRPbmVUaW1lQ2xlYXJMaXN0ZW5lcigpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGFwcHJvcHJpYXRlIGZpbmQgb2NjdXJyZW5jZXMgcHJvY2Vzc29yCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbm90IG51bGwKLQkgKiBAcGFyYW0gdGV4dFNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBnZXRQcm9jZXNzb3JGb3JDdXJyZW50U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQkvLyBjaGVjayBpZiB3ZSBoYXZlIGFuIGFjdGlvbiB0aGF0J3MgZW5hYmxlZCBvbiB0aGUgY3VycmVudCBwYXJ0aXRpb24KLQkJSVR5cGVkUmVnaW9uIHRyID0gZ2V0UGFydGl0aW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQkJU3RyaW5nIHBhcnRpdGlvbiA9IHRyICE9IG51bGwgPyB0ci5nZXRUeXBlKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCUl0ZXJhdG9yIGl0ID0gZ2V0UHJvY2Vzc29ycygpLml0ZXJhdG9yKCk7Ci0JCUZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBwcm9jZXNzb3IgPSBudWxsOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlwcm9jZXNzb3IgPSAoRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yKSBpdC5uZXh0KCk7Ci0JCQkvLyB3ZSBqdXN0IGNob29zZSB0aGUgZmlyc3QgYWN0aW9uIHRoYXQgY2FuIGhhbmRsZSB0aGUgcGFydGl0aW9uCi0JCQlpZiAocHJvY2Vzc29yLmVuYWJsZWRGb3JQYXJpdGl0aW9uKHBhcnRpdGlvbikpCi0JCQkJcmV0dXJuIHByb2Nlc3NvcjsKLQkJfQotCi0JCUxpc3QgZXh0ZW5kZWRGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3JzID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb25zKEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5jbGFzcy5nZXROYW1lKCksIHBhcnRpdGlvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5kZWRGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3JzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3QgbyA9IGV4dGVuZGVkRmluZE9jY3VycmVuY2VzUHJvY2Vzc29ycy5nZXQoaSk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcikgewotCQkJCS8qCi0JCQkJICogV2UganVzdCBjaG9vc2UgdGhlIGZpcnN0IHJlZ2lzdGVyZWQgcHJvY2Vzc29yIHRoYXQKLQkJCQkgKiBleHBsaWNpdGx5IHNheXMgaXQgY2FuIGhhbmRsZSB0aGUgcGFydGl0aW9uCi0JCQkJICovCi0JCQkJcHJvY2Vzc29yID0gKEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcikgbzsKLQkJCQlpZiAocHJvY2Vzc29yLmVuYWJsZWRGb3JQYXJpdGl0aW9uKHBhcnRpdGlvbikpCi0JCQkJCXJldHVybiBwcm9jZXNzb3I7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJVHlwZWRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaWYgKHRleHRTZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZWdpb24gPSBkb2N1bWVudC5nZXRQYXJ0aXRpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXJlZ2lvbiA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIElUZXh0U2VsZWN0aW9uIGdldFRleHRTZWxlY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvcikgewotCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gbnVsbDsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbiAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQl9Ci0JCXJldHVybiB0ZXh0U2VsZWN0aW9uOwotCX0KLQkKLQlhYnN0cmFjdCBwcm90ZWN0ZWQgTGlzdCBnZXRQcm9jZXNzb3JzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaGFuZGxlcnMvRm9ybWF0SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2hhbmRsZXJzL0Zvcm1hdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIxYjgxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaGFuZGxlcnMvRm9ybWF0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gLSBidWcgMjEyMzMwIC0KLSAqICAgICAgICAgICAgICAgICAgICBCYXNlZCBvZmYgRm9ybWF0QWN0aW9uRGVsZWdhdGUuamF2YQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5Mb2NhdGlvbktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkZvcm1hdFByb2Nlc3NvcnNFeHRlbnNpb25SZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBGb3JtYXRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgewotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbnVsbGluZyBvdXQganVzdCBpbiBjYXNlCi0JfQotCQotCXByaXZhdGUgSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UgZ2V0QWN0aXZlUHJvZ3Jlc3NTZXJ2aWNlKCkgewotCQlJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLQkJaWYgKFBsYXRmb3JtVUkuaXNXb3JrYmVuY2hSdW5uaW5nKCkpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCWlmIChhY3RpdmVXb3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotCQkJCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBhY3RpdmVXb3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydCA9IGFjdGl2ZVBhZ2UuZ2V0QWN0aXZlUGFydCgpOwotCQkJCQlpZiAoYWN0aXZlUGFydCAhPSBudWxsKSB7Ci0JCQkJCQlzZXJ2aWNlID0gKElXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlKSBhY3RpdmVQYXJ0LmdldFNpdGUoKS5nZXRBZGFwdGVyKElXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlLmNsYXNzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VydmljZTsKLQl9Ci0JCi0JCi0JCi0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkKLQkgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coZXZlbnQpLmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCi0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJZlNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJYm9vbGVhbiBhdmFpbGFibGUgPSBmYWxzZTsKLQotCQkJT2JqZWN0W10gZWxlbWVudHMgPSBmU2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQkJYXZhaWxhYmxlID0gcHJvY2Vzc29yQXZhaWxhYmxlKChJUmVzb3VyY2UpIGVsZW1lbnRzW2ldKTsKLQotCQkJCQlpZiAoYXZhaWxhYmxlKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAoZlNlbGVjdGlvbiAhPSBudWxsICYmICFmU2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJSm9iIGpvYiA9IGdldEpvYigpOwotCQkJaWYgKGpvYiAhPSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UgcHJvZ3Jlc3NTZXJ2aWNlID0gZ2V0QWN0aXZlUHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0JCQkJaWYgKHByb2dyZXNzU2VydmljZSAhPSBudWxsKSB7Ci0JCQkJCXByb2dyZXNzU2VydmljZS5zY2hlZHVsZShqb2IpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJam9iLnNjaGVkdWxlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQljbGFzcyBGb3JtYXRKb2IgZXh0ZW5kcyBKb2IgewotCi0JCXB1YmxpYyBGb3JtYXRKb2IoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKG5hbWUpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGZTZWxlY3Rpb24udG9BcnJheSgpOwotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIGVsZW1lbnRzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQkJcHJvY2VzcyhuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpLCAoSVJlc291cmNlKSBlbGVtZW50c1tpXSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl9Ci0JCQl9Ci0JCQltb25pdG9yLmRvbmUoKTsKLQotCQkJaWYgKGZFcnJvclN0YXR1cy5nZXRDaGlsZHJlbigpLmxlbmd0aCA+IDApIHsKLQkJCQlzdGF0dXMgPSBmRXJyb3JTdGF0dXM7Ci0JCQkJZkVycm9yU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCBTU0VVSU1lc3NhZ2VzLkZvcm1hdEFjdGlvbkRlbGVnYXRlX2Vycm9yU3RhdHVzTWVzc2FnZSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBNdWx0aVN0YXR1cyBmRXJyb3JTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfZXJyb3JTdGF0dXNNZXNzYWdlLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUZpbGUgZmlsZSkgewotCQlpZihtb25pdG9yID09IG51bGwgfHwgbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0JCQotCQl0cnkgewotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEwMCk7Ci0JCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQltb25pdG9yLndvcmtlZCg1KTsKLQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpOwotCQkJCUlTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IGdldEZvcm1hdFByb2Nlc3Nvcihjb250ZW50VHlwZS5nZXRJZCgpKTsKLQkJCQlpZiAoZm9ybWF0UHJvY2Vzc29yICE9IG51bGwgJiYgKG1vbml0b3IgPT0gbnVsbCB8fCAhbW9uaXRvci5pc0NhbmNlbGVkKCkpKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV8zLCBuZXcgU3RyaW5nW117ZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpfSk7CQkJCQltb25pdG9yLnN1YlRhc2sobWVzc2FnZSk7Ci0JCQkJCWZvcm1hdFByb2Nlc3Nvci5zZXRQcm9ncmVzc01vbml0b3IobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCA5NSkpOwotCQkJCQlmb3JtYXRQcm9jZXNzb3IuZm9ybWF0RmlsZShmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsIGUpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV81LCBuZXcgU3RyaW5nW117ZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCl9KTsKLQkJCWZFcnJvclN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgZSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfNCwgbmV3IFN0cmluZ1tde2ZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfSk7Ci0JCQlmRXJyb3JTdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfNCwgbmV3IFN0cmluZ1tde2ZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfSk7Ci0JCQlmRXJyb3JTdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdChmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJZmluYWwgSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7Ci0KLQkJCS8vIEJVRyAxNzg1OTggLSBJZiB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLCBhbmQgaXQncyBwb3NzaWJsZSB0bwotCQkJLy8gZ2V0IHRoZSB3b3JrYmVuY2ggRGlzcGxheSwgdGhlIFVJIHRocmVhZCBpcyBhc2tlZCB0byBleGVjdXRlIHRoZQotCQkJLy8gZm9ybWF0IG9mIHRoZSBmaWxlIHdoZW4gaXQgY2FuCi0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMjApOyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCUlUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgbWFuYWdlcj0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCk7Ci0JCQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJaWYobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCQltYW5hZ2VyLmNvbm5lY3QoZmlsZS5nZXRGdWxsUGF0aCgpLCBMb2NhdGlvbktpbmQuSUZJTEUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCQkJYnVmZmVyID0gbWFuYWdlci5nZXRUZXh0RmlsZUJ1ZmZlcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLCBMb2NhdGlvbktpbmQuSUZJTEUpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZihidWZmZXIgIT0gbnVsbCAmJiBidWZmZXIuaXNTaGFyZWQoKSkgewotCQkJCQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotCQkJCQkJaWYgKGRpc3BsYXkgIT0gbnVsbCkgewotCQkJCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQlmb3JtYXQobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxOCksIGZpbGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJZm9ybWF0KG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTgpLCBmaWxlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmKG1hbmFnZXIgIT0gbnVsbCkKLQkJCQkJCW1hbmFnZXIuZGlzY29ubmVjdChmaWxlLmdldEZ1bGxQYXRoKCksIExvY2F0aW9uS2luZC5JRklMRSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCQkJfQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLkZvcm1hdEFjdGlvbkRlbGVnYXRlXzQsIG5ldyBTdHJpbmdbXXtmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKX0pOwotCQkJCWZFcnJvclN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgZSkpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYobW9uaXRvciAhPSBudWxsKQotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJCQotCQkJCi0JCX0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSByZXNvdXJjZTsKLQotCQkJdHJ5IHsKLQkJCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gY29udGFpbmVyLm1lbWJlcnMoKTsKLQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgbWVtYmVycy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChtb25pdG9yICE9IG51bGwgJiYgIW1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQkJZm9ybWF0KG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSksIG1lbWJlcnNbaV0pOwotCQkJCX0KLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV80LCBuZXcgU3RyaW5nW117cmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfSk7Ci0JCQkJZkVycm9yU3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0KLQkJLy8gTm90ZTogdGhlIHdvcmtiZW5jaCBzaG91bGQgYWx3YXlzIGhhdmUgYSBkaXNwbGF5Ci0JCS8vICh1bmxlc3MgcnVubmluZyBoZWFkbGVzcyksIHdoZXJlYXMgRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJLy8gb25seSByZXR1cm5zIHRoZSBkaXNwbGF5IGlmIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRocmVhZAotCQkvLyBoYXMgb25lLgotCQlpZiAoUGxhdGZvcm1VSS5pc1dvcmtiZW5jaFJ1bm5pbmcoKSkKLQkJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGdldEZvcm1hdFByb2Nlc3NvcihTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlyZXR1cm4gRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlci5nZXRJbnN0YW5jZSgpLmdldEZvcm1hdFByb2Nlc3Nvcihjb250ZW50VHlwZUlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSm9iIGdldEpvYigpIHsKLQkJcmV0dXJuIG5ldyBGb3JtYXRKb2IoU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV9qb2JOYW1lKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnV0aWwuUmVzb3VyY2VBY3Rpb25EZWxlZ2F0ZSNwcm9jZXNzKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3MoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEwMCk7Ci0JCWZvcm1hdChuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDk4KSwgcmVzb3VyY2UpOwotCi0JCXRyeSB7Ci0JCQlyZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDIpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfNCwgbmV3IFN0cmluZ1tde3Jlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKX0pOwotCQkJZkVycm9yU3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBlKSk7Ci0JCX0KLQkJbW9uaXRvci5kb25lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLlJlc291cmNlQWN0aW9uRGVsZWdhdGUjcHJvY2Vzc29yQXZhaWxhYmxlKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzb3JBdmFpbGFibGUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewotCQkJdHJ5IHsKLQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLQotCQkJCQlJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBudWxsOwotCQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJCQlmb3JtYXRQcm9jZXNzb3IgPSBnZXRGb3JtYXRQcm9jZXNzb3IoY29udGVudFR5cGUuZ2V0SWQoKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKGZvcm1hdFByb2Nlc3NvciAhPSBudWxsKQotCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCUlDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIHJlc291cmNlOwotCQkJCQlJUmVzb3VyY2VbXSBtZW1iZXJzOwotCQkJCQltZW1iZXJzID0gY29udGFpbmVyLm1lbWJlcnMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlib29sZWFuIGF2YWlsYWJsZSA9IHByb2Nlc3NvckF2YWlsYWJsZShtZW1iZXJzW2ldKTsKLQotCQkJCQkJaWYgKGF2YWlsYWJsZSkgewotCQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3RIaXN0b3J5SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3RIaXN0b3J5SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2M1NTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uSGlzdG9yeTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RIaXN0b3J5SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlTZWxlY3Rpb25IaXN0b3J5IGhpc3RvcnkgPSAoU2VsZWN0aW9uSGlzdG9yeSkgZWRpdG9yLmdldEFkYXB0ZXIoU2VsZWN0aW9uSGlzdG9yeS5jbGFzcyk7Ci0JCWlmIChoaXN0b3J5ICE9IG51bGwpIHsKLQkJCUlSZWdpb24gb2xkID0gaGlzdG9yeS5nZXRMYXN0KCk7Ci0JCQlpZiAob2xkICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQloaXN0b3J5Lmlnbm9yZVNlbGVjdGlvbkNoYW5nZXMoKTsKLQotCQkJCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQkJCQllbHNlIHsKLQkJCQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQkJCQl9Ci0JCQkJCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpCi0JCQkJCQl0ZXh0RWRpdG9yLnNlbGVjdEFuZFJldmVhbChvbGQuZ2V0T2Zmc2V0KCksIG9sZC5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQloaXN0b3J5Lmxpc3RlblRvU2VsZWN0aW9uQ2hhbmdlcygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0hpZ2hsaWdodGVySHlwZXJsaW5rUHJlc2VudGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0hpZ2hsaWdodGVySHlwZXJsaW5rUHJlc2VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwODVmYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2h5cGVybGluay9IaWdobGlnaHRlckh5cGVybGlua1ByZXNlbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtQcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi0vKioKLSAqIFRoZSBpcyBhbG1vc3QgYW4gZXhhY3QgY29weSBvZiBEZWZhdWx0SHlwZXJsaW5rUHJlc2VudGVyLiBIb3dldmVyIHRoaXMKLSAqIGh5cGVybGluayBwcmVzZW50ZXIgd29ya3Mgd2l0aCB0aGUgU3RydWN0dXJlZFRleHRFZGl0b3IncyBIaWdobGlnaHRlcgotICogaW5zdGVhZCBvZiBUZXh0UHJlc2VudGF0aW9uLgotICogCi0gKiBUaGUgbWFpbiBkaWZmZXJlbmNlIGlzIDxjb2RlPnRleHQucmVkcmF3UmFuZ2Uob2Zmc2V0LCBsZW5ndGgsIHRydWUpOzwvY29kZT4KLSAqIGlzIGNhbGxlZCBpbnN0ZWFkIG9mIHBhc3NpbmcgZmFsc2UgZm9yIGNsZWFyQmFja2dyb3VuZC4gQWxzbyBhbGwgbWVudGlvbiBvZgotICogVGV4dFByZXNlbnRhdGlvbiB3YXMgcmVtb3ZlZCBzaW5jZSBpdCBkb2VzIG5vdCByZWFsbHkgYXBwbHkuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuRGVmYXVsdEh5cGVybGlua1ByZXNlbnRlcgotICovCi1wdWJsaWMgY2xhc3MgSGlnaGxpZ2h0ZXJIeXBlcmxpbmtQcmVzZW50ZXIgaW1wbGVtZW50cyBJSHlwZXJsaW5rUHJlc2VudGVyLCBQYWludExpc3RlbmVyLCBJVGV4dElucHV0TGlzdGVuZXIsIElEb2N1bWVudExpc3RlbmVyLCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgY29sb3IgdXNlZCBmb3IgaHlwZXJsaW5rcy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uIEEgUkdCIGNvbG9yIHZhbHVlIGVuY29kZWQgYXMgYQotCSAqIHN0cmluZyB1c2luZyBjbGFzcyA8Y29kZT5QcmVmZXJlbmNlQ29udmVydGVyPC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlN0cmluZ0NvbnZlcnRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSFlQRVJMSU5LX0NPTE9SID0gImh5cGVybGlua0NvbG9yIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKiogVGhlIHRleHQgdmlld2VyLiAqLwotCXByaXZhdGUgSVRleHRWaWV3ZXIgZlRleHRWaWV3ZXI7Ci0JLyoqIFRoZSBoYW5kIGN1cnNvci4gKi8KLQlwcml2YXRlIEN1cnNvciBmQ3Vyc29yOwotCS8qKiBUaGUgbGluayBjb2xvci4gKi8KLQlwcml2YXRlIENvbG9yIGZDb2xvcjsKLQkvKiogVGVsbHMgd2hldGhlciB0byBkaXNwb3NlIHRoZSBjb2xvciBvbiB1bmluc3RhbGwuICovCi0JcHJpdmF0ZSBib29sZWFuIGZEaXNwb3NlQ29sb3I7Ci0JLyoqIFRoZSBjdXJyZW50bHkgYWN0aXZlIHJlZ2lvbi4gKi8KLQlwcml2YXRlIElSZWdpb24gZkFjdGl2ZVJlZ2lvbjsKLQkvKiogVGhlIGN1cnJlbnRseSBhY3RpdmUgc3R5bGUgcmFuZ2UgYXMgcG9zaXRpb24uICovCi0JcHJpdmF0ZSBQb3NpdGlvbiBmUmVtZW1iZXJlZFBvc2l0aW9uOwotCS8qKiBUaGUgb3B0aW9uYWwgcHJlZmVyZW5jZSBzdG9yZSAqLwotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmUHJlZmVyZW5jZVN0b3JlOwotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGRlZmF1bHQgaHlwZXJsaW5rIHByZXNlbnRlciB3aGljaCB1c2VzCi0JICoge0BsaW5rICNIWVBFUkxJTktfQ09MT1J9dG8gcmVhZCB0aGUgY29sb3IgZnJvbSB0aGUgZ2l2ZW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlLgotCSAqIAotCSAqIEBwYXJhbSBzdG9yZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2Ugc3RvcmUKLQkgKi8KLQlwdWJsaWMgSGlnaGxpZ2h0ZXJIeXBlcmxpbmtQcmVzZW50ZXIoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlmUHJlZmVyZW5jZVN0b3JlID0gc3RvcmU7Ci0JCWZEaXNwb3NlQ29sb3IgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZGVmYXVsdCBoeXBlcmxpbmsgcHJlc2VudGVyLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvcgotCSAqICAgICAgICAgICAgdGhlIGh5cGVybGluayBjb2xvciwgdG8gYmUgZGlzcG9zZWQgYnkgdGhlIGNhbGxlcgotCSAqLwotCXB1YmxpYyBIaWdobGlnaHRlckh5cGVybGlua1ByZXNlbnRlcihDb2xvciBjb2xvcikgewotCQlmRGlzcG9zZUNvbG9yID0gZmFsc2U7Ci0JCWZDb2xvciA9IGNvbG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzaG93SHlwZXJsaW5rcyhJSHlwZXJsaW5rW10gaHlwZXJsaW5rcykgewotCQlBc3NlcnQuaXNMZWdhbChoeXBlcmxpbmtzICE9IG51bGwgJiYgaHlwZXJsaW5rcy5sZW5ndGggPT0gMSk7Ci0JCWhpZ2hsaWdodFJlZ2lvbihoeXBlcmxpbmtzWzBdLmdldEh5cGVybGlua1JlZ2lvbigpKTsKLQkJYWN0aXZhdGVDdXJzb3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoaWRlSHlwZXJsaW5rcygpIHsKLQkJcmVwYWlyUmVwcmVzZW50YXRpb24oKTsKLQkJZlJlbWVtYmVyZWRQb3NpdGlvbiA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zdGFsbChJVGV4dFZpZXdlciB0ZXh0Vmlld2VyKSB7Ci0JCUFzc2VydC5pc05vdE51bGwodGV4dFZpZXdlcik7Ci0JCWZUZXh0Vmlld2VyID0gdGV4dFZpZXdlcjsKLQkJZlRleHRWaWV3ZXIuYWRkVGV4dElucHV0TGlzdGVuZXIodGhpcyk7Ci0KLQkJU3R5bGVkVGV4dCB0ZXh0ID0gZlRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dCAhPSBudWxsICYmICF0ZXh0LmlzRGlzcG9zZWQoKSkgewotCQkJdGV4dC5hZGRQYWludExpc3RlbmVyKHRoaXMpOwotCQkJaWYgKGZQcmVmZXJlbmNlU3RvcmUgIT0gbnVsbCkKLQkJCQlmQ29sb3IgPSBjcmVhdGVDb2xvcihmUHJlZmVyZW5jZVN0b3JlLCBIWVBFUkxJTktfQ09MT1IsIHRleHQuZ2V0RGlzcGxheSgpKTsKLQkJfQotCi0JCWlmIChmUHJlZmVyZW5jZVN0b3JlICE9IG51bGwpCi0JCQlmUHJlZmVyZW5jZVN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlmVGV4dFZpZXdlci5yZW1vdmVUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQotCQlpZiAoZkNvbG9yICE9IG51bGwpIHsKLQkJCWlmIChmRGlzcG9zZUNvbG9yKQotCQkJCWZDb2xvci5kaXNwb3NlKCk7Ci0JCQlmQ29sb3IgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGZDdXJzb3IgIT0gbnVsbCkgewotCQkJZkN1cnNvci5kaXNwb3NlKCk7Ci0JCQlmQ3Vyc29yID0gbnVsbDsKLQkJfQotCi0JCVN0eWxlZFRleHQgdGV4dCA9IGZUZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHQgIT0gbnVsbCAmJiAhdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQl0ZXh0LnJlbW92ZVBhaW50TGlzdGVuZXIodGhpcyk7Ci0KLQkJZlRleHRWaWV3ZXIgPSBudWxsOwotCi0JCWlmIChmUHJlZmVyZW5jZVN0b3JlICE9IG51bGwpCi0JCQlmUHJlZmVyZW5jZVN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChmVGV4dFZpZXdlcik7Ci0JCWZDb2xvciA9IGNvbG9yOwotCX0KLQotCXByaXZhdGUgdm9pZCBoaWdobGlnaHRSZWdpb24oSVJlZ2lvbiByZWdpb24pIHsKLQotCQlpZiAocmVnaW9uLmVxdWFscyhmQWN0aXZlUmVnaW9uKSkKLQkJCXJldHVybjsKLQotCQlyZXBhaXJSZXByZXNlbnRhdGlvbigpOwotCi0JCVN0eWxlZFRleHQgdGV4dCA9IGZUZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQotCi0JCS8vIFVuZGVybGluZQotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaW50IGxlbmd0aCA9IDA7Ci0JCWlmIChmVGV4dFZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIGZUZXh0Vmlld2VyOwotCQkJSVJlZ2lvbiB3aWRnZXRSYW5nZSA9IGV4dGVuc2lvbi5tb2RlbFJhbmdlMldpZGdldFJhbmdlKHJlZ2lvbik7Ci0JCQlpZiAod2lkZ2V0UmFuZ2UgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCW9mZnNldCA9IHdpZGdldFJhbmdlLmdldE9mZnNldCgpOwotCQkJbGVuZ3RoID0gd2lkZ2V0UmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0KLQkJfQotCQllbHNlIHsKLQkJCW9mZnNldCA9IHJlZ2lvbi5nZXRPZmZzZXQoKSAtIGZUZXh0Vmlld2VyLmdldFZpc2libGVSZWdpb24oKS5nZXRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJfQotCi0JCS8vIG5lZWRzIHRvIGNsZWFuIGJhY2tncm91bmQgZHVlIHRvIFN0cnVjdHVyZWRUZXh0RWRpdG9yJ3MgaGlnaGxpZ2h0ZXIKLQkJdGV4dC5yZWRyYXdSYW5nZShvZmZzZXQsIGxlbmd0aCwgdHJ1ZSk7Ci0KLQkJLy8gSW52YWxpZGF0ZSByZWdpb24gPT0+IGFwcGx5IHRleHQgcHJlc2VudGF0aW9uCi0JCWZBY3RpdmVSZWdpb24gPSByZWdpb247Ci0KLQkJaWYgKGZUZXh0Vmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb24yKQotCQkJKChJVGV4dFZpZXdlckV4dGVuc2lvbjIpIGZUZXh0Vmlld2VyKS5pbnZhbGlkYXRlVGV4dFByZXNlbnRhdGlvbihyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCWVsc2UKLQkJCWZUZXh0Vmlld2VyLmludmFsaWRhdGVUZXh0UHJlc2VudGF0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFjdGl2YXRlQ3Vyc29yKCkgewotCQlTdHlsZWRUZXh0IHRleHQgPSBmVGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCURpc3BsYXkgZGlzcGxheSA9IHRleHQuZ2V0RGlzcGxheSgpOwotCQlpZiAoZkN1cnNvciA9PSBudWxsKQotCQkJZkN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9IQU5EKTsKLQkJdGV4dC5zZXRDdXJzb3IoZkN1cnNvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc2V0Q3Vyc29yKCkgewotCQlTdHlsZWRUZXh0IHRleHQgPSBmVGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ICE9IG51bGwgJiYgIXRleHQuaXNEaXNwb3NlZCgpKQotCQkJdGV4dC5zZXRDdXJzb3IobnVsbCk7Ci0KLQkJaWYgKGZDdXJzb3IgIT0gbnVsbCkgewotCQkJZkN1cnNvci5kaXNwb3NlKCk7Ci0JCQlmQ3Vyc29yID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZXBhaXJSZXByZXNlbnRhdGlvbigpIHsKLQotCQlpZiAoZkFjdGl2ZVJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBvZmZzZXQgPSBmQWN0aXZlUmVnaW9uLmdldE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gZkFjdGl2ZVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZkFjdGl2ZVJlZ2lvbiA9IG51bGw7Ci0KLQkJcmVzZXRDdXJzb3IoKTsKLQotCQkvLyBJbnZhbGlkYXRlID09PiByZW1vdmUgYXBwbGllZCB0ZXh0IHByZXNlbnRhdGlvbgotCQlpZiAoZlRleHRWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjIpCi0JCQkoKElUZXh0Vmlld2VyRXh0ZW5zaW9uMikgZlRleHRWaWV3ZXIpLmludmFsaWRhdGVUZXh0UHJlc2VudGF0aW9uKG9mZnNldCwgbGVuZ3RoKTsKLQkJZWxzZQotCQkJZlRleHRWaWV3ZXIuaW52YWxpZGF0ZVRleHRQcmVzZW50YXRpb24oKTsKLQotCQkvLyBSZW1vdmUgdW5kZXJsaW5lCi0JCWlmIChmVGV4dFZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIGZUZXh0Vmlld2VyOwotCQkJb2Zmc2V0ID0gZXh0ZW5zaW9uLm1vZGVsT2Zmc2V0MldpZGdldE9mZnNldChvZmZzZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJb2Zmc2V0IC09IGZUZXh0Vmlld2VyLmdldFZpc2libGVSZWdpb24oKS5nZXRPZmZzZXQoKTsKLQkJfQotCQl0cnkgewotCQkJU3R5bGVkVGV4dCB0ZXh0ID0gZlRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCi0JCQkvLyBuZWVkcyB0byBjbGVhbiBiYWNrZ3JvdW5kIGR1ZSB0byBTdHJ1Y3R1cmVkVGV4dEVkaXRvcidzCi0JCQkvLyBoaWdobGlnaHRlcgotCQkJdGV4dC5yZWRyYXdSYW5nZShvZmZzZXQsIGxlbmd0aCwgdHJ1ZSk7Ci0KLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHgpIHsKLQkJCS8vIGlnbm9yZSAtIGRvIG5vdCBsb2cKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBQYWludExpc3RlbmVyI3BhaW50Q29udHJvbChQYWludEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChmQWN0aXZlUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3R5bGVkVGV4dCB0ZXh0ID0gZlRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gMDsKLQotCQlpZiAoZlRleHRWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHsKLQotCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIGZUZXh0Vmlld2VyOwotCQkJSVJlZ2lvbiB3aWRnZXRSYW5nZSA9IGV4dGVuc2lvbi5tb2RlbFJhbmdlMldpZGdldFJhbmdlKGZBY3RpdmVSZWdpb24pOwotCQkJaWYgKHdpZGdldFJhbmdlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlvZmZzZXQgPSB3aWRnZXRSYW5nZS5nZXRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IHdpZGdldFJhbmdlLmdldExlbmd0aCgpOwotCi0JCX0KLQkJZWxzZSB7Ci0KLQkJCUlSZWdpb24gcmVnaW9uID0gZlRleHRWaWV3ZXIuZ2V0VmlzaWJsZVJlZ2lvbigpOwotCQkJaWYgKCFpbmNsdWRlcyhyZWdpb24sIGZBY3RpdmVSZWdpb24pKQotCQkJCXJldHVybjsKLQotCQkJb2Zmc2V0ID0gZkFjdGl2ZVJlZ2lvbi5nZXRPZmZzZXQoKSAtIHJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IGZBY3RpdmVSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCX0KLQotCQkvLyBzdXBwb3J0IGZvciBCSURJCi0JCVBvaW50IG1pbkxvY2F0aW9uID0gZ2V0TWluaW11bUxvY2F0aW9uKHRleHQsIG9mZnNldCwgbGVuZ3RoKTsKLQkJUG9pbnQgbWF4TG9jYXRpb24gPSBnZXRNYXhpbXVtTG9jYXRpb24odGV4dCwgb2Zmc2V0LCBsZW5ndGgpOwotCi0JCWludCB4MSA9IG1pbkxvY2F0aW9uLng7Ci0JCWludCB4MiA9IG1heExvY2F0aW9uLnggLSAxOwotCQlpbnQgeSA9IG1pbkxvY2F0aW9uLnkgKyB0ZXh0LmdldExpbmVIZWlnaHQoKSAtIDE7Ci0KLQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJaWYgKGZDb2xvciAhPSBudWxsICYmICFmQ29sb3IuaXNEaXNwb3NlZCgpKQotCQkJZ2Muc2V0Rm9yZWdyb3VuZChmQ29sb3IpOwotCQllbHNlIGlmIChmQ29sb3IgPT0gbnVsbCAmJiAhKG9mZnNldCA8IDAgJiYgb2Zmc2V0ID49IHRleHQuZ2V0Q2hhckNvdW50KCkpKSB7Ci0JCQlTdHlsZVJhbmdlIHN0eWxlID0gdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChzdHlsZSAhPSBudWxsKQotCQkJCWdjLnNldEZvcmVncm91bmQoc3R5bGUuZm9yZWdyb3VuZCk7Ci0JCX0KLQkJZ2MuZHJhd0xpbmUoeDEsIHksIHgyLCB5KTsKLQl9Ci0KLQlwcml2YXRlIFBvaW50IGdldE1pbmltdW1Mb2NhdGlvbihTdHlsZWRUZXh0IHRleHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJaW50IG1heCA9IHRleHQuZ2V0Q2hhckNvdW50KCk7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSB0ZXh0LmdldEJvdW5kcygpOwotCQlQb2ludCBtaW5Mb2NhdGlvbiA9IG5ldyBQb2ludChib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8PSBsZW5ndGg7IGkrKykgewotCQkJaW50IGsgPSBvZmZzZXQgKyBpOwotCQkJaWYgKGsgPCAwIHx8IGsgPiBtYXgpCi0JCQkJYnJlYWs7Ci0KLQkJCVBvaW50IGxvY2F0aW9uID0gdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KGspOwotCQkJaWYgKGxvY2F0aW9uLnggPCBtaW5Mb2NhdGlvbi54KQotCQkJCW1pbkxvY2F0aW9uLnggPSBsb2NhdGlvbi54OwotCQkJaWYgKGxvY2F0aW9uLnkgPCBtaW5Mb2NhdGlvbi55KQotCQkJCW1pbkxvY2F0aW9uLnkgPSBsb2NhdGlvbi55OwotCQl9Ci0KLQkJcmV0dXJuIG1pbkxvY2F0aW9uOwotCX0KLQotCXByaXZhdGUgUG9pbnQgZ2V0TWF4aW11bUxvY2F0aW9uKFN0eWxlZFRleHQgdGV4dCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlQb2ludCBtYXhMb2NhdGlvbiA9IG5ldyBQb2ludCgwLCAwKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8PSBsZW5ndGg7IGkrKykgewotCQkJaW50IGsgPSBvZmZzZXQgKyBpOwotCQkJaWYgKGsgPCAwIHx8IGsgPiB0ZXh0LmdldENoYXJDb3VudCgpKQotCQkJCWJyZWFrOwotCi0JCQlQb2ludCBsb2NhdGlvbiA9IHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldChrKTsKLQkJCWlmIChsb2NhdGlvbi54ID4gbWF4TG9jYXRpb24ueCkKLQkJCQltYXhMb2NhdGlvbi54ID0gbG9jYXRpb24ueDsKLQkJCWlmIChsb2NhdGlvbi55ID4gbWF4TG9jYXRpb24ueSkKLQkJCQltYXhMb2NhdGlvbi55ID0gbG9jYXRpb24ueTsKLQkJfQotCi0JCXJldHVybiBtYXhMb2NhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5jbHVkZXMoSVJlZ2lvbiByZWdpb24sIElSZWdpb24gcG9zaXRpb24pIHsKLQkJcmV0dXJuIHBvc2l0aW9uLmdldE9mZnNldCgpID49IHJlZ2lvbi5nZXRPZmZzZXQoKSAmJiBwb3NpdGlvbi5nZXRPZmZzZXQoKSArIHBvc2l0aW9uLmdldExlbmd0aCgpIDw9IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChmQWN0aXZlUmVnaW9uICE9IG51bGwpIHsKLQkJCWZSZW1lbWJlcmVkUG9zaXRpb24gPSBuZXcgUG9zaXRpb24oZkFjdGl2ZVJlZ2lvbi5nZXRPZmZzZXQoKSwgZkFjdGl2ZVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQl0cnkgewotCQkJCWV2ZW50LmdldERvY3VtZW50KCkuYWRkUG9zaXRpb24oZlJlbWVtYmVyZWRQb3NpdGlvbik7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCWZSZW1lbWJlcmVkUG9zaXRpb24gPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpZiAoZlJlbWVtYmVyZWRQb3NpdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAoIWZSZW1lbWJlcmVkUG9zaXRpb24uaXNEZWxldGVkKCkpIHsKLQotCQkJCWV2ZW50LmdldERvY3VtZW50KCkucmVtb3ZlUG9zaXRpb24oZlJlbWVtYmVyZWRQb3NpdGlvbik7Ci0JCQkJZkFjdGl2ZVJlZ2lvbiA9IG5ldyBSZWdpb24oZlJlbWVtYmVyZWRQb3NpdGlvbi5nZXRPZmZzZXQoKSwgZlJlbWVtYmVyZWRQb3NpdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJZlJlbWVtYmVyZWRQb3NpdGlvbiA9IG51bGw7Ci0KLQkJCQlTdHlsZWRUZXh0IHdpZGdldCA9IGZUZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJCQlpZiAod2lkZ2V0ICE9IG51bGwgJiYgIXdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJd2lkZ2V0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWhpZGVIeXBlcmxpbmtzKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZkFjdGl2ZVJlZ2lvbiA9IG51bGw7Ci0JCQkJZlJlbWVtYmVyZWRQb3NpdGlvbiA9IG51bGw7Ci0JCQkJaGlkZUh5cGVybGlua3MoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lciNpbnB1dERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCWlmIChvbGRJbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQloaWRlSHlwZXJsaW5rcygpOwotCQlvbGRJbnB1dC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lciNpbnB1dERvY3VtZW50Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCWlmIChuZXdJbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQluZXdJbnB1dC5hZGREb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb2xvciBmcm9tIHRoZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIGdpdmVuIHByZWZlcmVuY2UKLQkgKiBzdG9yZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RvcmUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIGtleQotCSAqIEBwYXJhbSBkaXNwbGF5Ci0JICogICAgICAgICAgICB0aGUgZGlzcGxheQotCSAqIEByZXR1cm4gdGhlIGNvbG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHN1Y2gKLQkgKiAgICAgICAgIGluZm9ybWF0aW9uIGF2YWlsYWJsZQotCSAqLwotCXByaXZhdGUgQ29sb3IgY3JlYXRlQ29sb3IoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIGtleSwgRGlzcGxheSBkaXNwbGF5KSB7Ci0KLQkJUkdCIHJnYiA9IG51bGw7Ci0KLQkJaWYgKHN0b3JlLmNvbnRhaW5zKGtleSkpIHsKLQotCQkJaWYgKHN0b3JlLmlzRGVmYXVsdChrZXkpKQotCQkJCXJnYiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0RGVmYXVsdENvbG9yKHN0b3JlLCBrZXkpOwotCQkJZWxzZQotCQkJCXJnYiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIGtleSk7Ci0KLQkJCWlmIChyZ2IgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IENvbG9yKGRpc3BsYXksIHJnYik7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoIUhZUEVSTElOS19DT0xPUi5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoKSkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGZEaXNwb3NlQ29sb3IgJiYgZkNvbG9yICE9IG51bGwgJiYgIWZDb2xvci5pc0Rpc3Bvc2VkKCkpCi0JCQlmQ29sb3IuZGlzcG9zZSgpOwotCQlmQ29sb3IgPSBudWxsOwotCi0JCVN0eWxlZFRleHQgdGV4dFdpZGdldCA9IGZUZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHRXaWRnZXQgIT0gbnVsbCAmJiAhdGV4dFdpZGdldC5pc0Rpc3Bvc2VkKCkpCi0JCQlmQ29sb3IgPSBjcmVhdGVDb2xvcihmUHJlZmVyZW5jZVN0b3JlLCBIWVBFUkxJTktfQ09MT1IsIHRleHRXaWRnZXQuZ2V0RGlzcGxheSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL09wZW5IeXBlcmxpbmtBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9oeXBlcmxpbmsvT3Blbkh5cGVybGlua0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWE2ZTU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9oeXBlcmxpbmsvT3Blbkh5cGVybGlua0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZXh0RWRpdG9yQWN0aW9uOwotCi0vKioKLSAqIE9wZW4gaHlwZXJsaW5rIGFjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgT3Blbkh5cGVybGlua0FjdGlvbiBleHRlbmRzIFRleHRFZGl0b3JBY3Rpb24gewotCXByaXZhdGUgSUh5cGVybGlua0RldGVjdG9yW10gZkh5cGVybGlua0RldGVjdG9yczsKLQlwcml2YXRlIElUZXh0Vmlld2VyIGZUZXh0Vmlld2VyOwotCi0JcHVibGljIE9wZW5IeXBlcmxpbmtBY3Rpb24oUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBTdHJpbmcgcHJlZml4LCBJVGV4dEVkaXRvciBlZGl0b3IsIElUZXh0Vmlld2VyIHZpZXdlcikgewotCQlzdXBlcihidW5kbGUsIHByZWZpeCwgZWRpdG9yKTsKLQkJZlRleHRWaWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rRGV0ZWN0b3JzKElIeXBlcmxpbmtEZXRlY3RvcltdIGRldGVjdG9ycykgewotCQlmSHlwZXJsaW5rRGV0ZWN0b3JzID0gZGV0ZWN0b3JzOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGZIeXBlcmxpbmtEZXRlY3RvcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCWZpbmFsIElSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJSUh5cGVybGluayBoeXBlcmxpbmsgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAoZkh5cGVybGlua0RldGVjdG9ycykgewotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZIeXBlcmxpbmtEZXRlY3RvcnMubGVuZ3RoOyBpIDwgbGVuZ3RoICYmIGh5cGVybGluayA9PSBudWxsOyBpKyspIHsKLQkJCQlmaW5hbCBJSHlwZXJsaW5rRGV0ZWN0b3IgZGV0ZWN0b3IgPSBmSHlwZXJsaW5rRGV0ZWN0b3JzW2ldOwotCQkJCWlmIChkZXRlY3RvciA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQotCQkJCS8qIFRoZSBhcnJheSBpcyBmaW5hbCwgYnV0IGl0cyBjb250ZW50cyBhcmVuJ3QgKi8KLQkJCQlmaW5hbCBJSHlwZXJsaW5rW11bXSBoeXBlcmxpbmtzID0gbmV3IElIeXBlcmxpbmtbMV1bXTsKLQotCQkJCS8qCi0JCQkJICogRGV0ZWN0IGZyb20gd2l0aGluIGEgU2FmZVJ1bm5hYmxlIHNpbmNlIHRoZSBsaXN0IG9mCi0JCQkJICogZGV0ZWN0b3JzIGlzIGV4dGVuc2libGUKLQkJCQkgKi8KLQkJCQlTYWZlUnVubmFibGUgZGV0ZWN0b3JSdW5uYWJsZSA9IG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJaHlwZXJsaW5rc1swXSA9IGRldGVjdG9yLmRldGVjdEh5cGVybGlua3MoZlRleHRWaWV3ZXIsIHJlZ2lvbiwgZmFsc2UpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlTYWZlUnVubmVyLnJ1bihkZXRlY3RvclJ1bm5hYmxlKTsKLQotCQkJCWlmIChoeXBlcmxpbmtzWzBdID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKGh5cGVybGlua3MubGVuZ3RoID4gMCkKLQkJCQkJaHlwZXJsaW5rID0gaHlwZXJsaW5rc1swXVswXTsKLQkJCX0KLQkJfQotCQlpZiAoaHlwZXJsaW5rICE9IG51bGwpIHsKLQkJCS8qKgotCQkJICogRm9yY2UgdGhlIGhpZ2hsaWdodCByYW5nZSB0byBjaGFuZ2Ugd2hlbiB0aGUgaHlwZXJsaW5rIGlzCi0JCQkgKiBvcGVuZWQgYnkgYWx0ZXJpbmcgdGhlIGhpZ2hsaWdodGVkIHJhbmdlIGJlZm9yZWhhbmQuCi0JCQkgKi8KLQkJCWdldFRleHRFZGl0b3IoKS5zZXRIaWdobGlnaHRSYW5nZShNYXRoLm1heCgwLCByZWdpb24uZ2V0T2Zmc2V0KCkgLSAxKSwgMCwgZmFsc2UpOwotCQkJaHlwZXJsaW5rLm9wZW4oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vQWJzdHJhY3RPcGVuT24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vQWJzdHJhY3RPcGVuT24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmYjJhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL0Fic3RyYWN0T3Blbk9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwub3Blbm9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS5Qcm9ncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5FZGl0b3JzVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLlBsYXRmb3JtU3RhdHVzTGluZVV0aWw7Ci0KLQotLyoqCi0gKiBUaGlzIGFjdGlvbiBjbGFzcyByZXRyaWV2ZXMgdGhlIGxpbmsvZmlsZSBzZWxlY3RlZCBieSB0aGUgY3Vyc29yIGFuZAotICogYXR0ZW1wdHMgdG8gb3BlbiB0aGUgbGluay9maWxlIGluIHRoZSBkZWZhdWx0IGVkaXRvciBvciB3ZWIgYnJvd3NlcgotICogCi0gKiBAZGVwcmVjYXRlZCBVc2UgYmFzZSBzdXBwb3J0IGZvciBoeXBlcmxpbmsgbmF2aWdhdGlvbgotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RPcGVuT24gaW1wbGVtZW50cyBJT3Blbk9uIHsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIENBTk5PVF9PUEVOID0gU1NFVUlNZXNzYWdlcy5BYnN0cmFjdE9wZW5Pbl8wOyAvLyROT04tTkxTLTEkCi0JLy8gZG9jdW1lbnQgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCBvcGVuCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlOi8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX1BST1RPQ09MID0gImh0dHA6Ly8iOy8vJE5PTi1OTFMtMSQKLQotCWFic3RyYWN0IHByb3RlY3RlZCBJUmVnaW9uIGRvR2V0T3Blbk9uUmVnaW9uKGludCBvZmZzZXQpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgZG9PcGVuT24oSVJlZ2lvbiByZWdpb24pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggb3BlbiBvbgotCSAqIAotCSAqIEByZXR1cm4gSURvY3VtZW50Ci0JICovCi0JcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHRoZSBlZGl0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmaWxlIG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUKLQkgKiBAcmV0dXJuIGVkaXRvciBpZCBvZiB0aGUgZWRpdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmlsZSBuYW1lCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RWRpdG9ySWQoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJSUVkaXRvclJlZ2lzdHJ5IGVkaXRvclJlZ2lzdHJ5ID0gd29ya2JlbmNoLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBlZGl0b3JSZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGVuYW1lKTsKLQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCXJldHVybiBkZXNjcmlwdG9yLmdldElkKCk7Ci0JCXJldHVybiBFZGl0b3JzVUkuREVGQVVMVF9URVhUX0VESVRPUl9JRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIElGaWxlIGZyb20gdGhlIGdpdmVuIHVyaSBpZiBwb3NzaWJsZSwgbnVsbCBpZiBjYW5ub3QgZmluZAotCSAqIGZpbGUgZnJvbSB1cmkuCi0JICogCi0JICogQHBhcmFtIGZpbGVTdHJpbmcKLQkgKiAgICAgICAgICAgIGZpbGUgc3lzdGVtIHBhdGgKLQkgKiBAcmV0dXJuIHJldHVybnMgSUZpbGUgaWYgZmlsZVN0cmluZyBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZQotCSAqLwotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlKFN0cmluZyBmaWxlU3RyaW5nKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gdXNlIHRoZSBiYXNlIGxvY2F0aW9uIHRvIG9idGFpbiB0aGUgaW4td29ya3NwYWNlIElGaWxlCi0JCQkJSUZpbGUgbW9kZWxGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpKSk7Ci0JCQkJaWYgKG1vZGVsRmlsZSAhPSBudWxsKSB7Ci0JCQkJCS8vIGZpbmQgdGhlIHJlZmVyZW5jZWQgZmlsZSdzIGxvY2F0aW9uIG9uIGRpc2sKLQkJCQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBtb2RlbC5nZXRSZXNvbHZlcigpOwotCQkJCQlpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGZpbGVzeXN0ZW1Mb2NhdGlvbiA9IHJlc29sdmVyLmdldExvY2F0aW9uQnlVUkkoZmlsZVN0cmluZyk7Ci0JCQkJCQlpZiAoZmlsZXN5c3RlbUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCQlJRmlsZVtdIHdvcmtzcGFjZUZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlc3lzdGVtTG9jYXRpb24pKTsKLQkJCQkJCQkvLyBmYXZvciBhIHdvcmtzcGFjZSBmaWxlIGluIHRoZSBzYW1lIHByb2plY3QKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHdvcmtzcGFjZUZpbGVzLmxlbmd0aCAmJiBmaWxlID09IG51bGw7IGkrKykgewotCQkJCQkJCQlpZiAod29ya3NwYWNlRmlsZXNbaV0uZ2V0UHJvamVjdCgpLmVxdWFscyhtb2RlbEZpbGUuZ2V0UHJvamVjdCgpKSkgewotCQkJCQkJCQkJZmlsZSA9IHdvcmtzcGFjZUZpbGVzW2ldOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCS8vIGlmIG5vbmUgd2VyZSBpbiB0aGUgc2FtZSBwcm9qZWN0LCBqdXN0IHBpY2sgb25lCi0JCQkJCQkJaWYgKGZpbGUgPT0gbnVsbCAmJiB3b3Jrc3BhY2VGaWxlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJCWZpbGUgPSB3b3Jrc3BhY2VGaWxlc1swXTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCWlmIChmaWxlID09IG51bGwgJiYgZmlsZVN0cmluZy5zdGFydHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlU3RyaW5nKSk7Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLklPcGVuT24jZ2V0T3Blbk9uUmVnaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGdldE9wZW5PblJlZ2lvbihJRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0KSB7Ci0JCUlSZWdpb24gcmVnaW9uOwotCQkvLyBzZXQgdGhlIGRvY3VtZW50IGZvciB0aGlzIGFjdGlvbgotCQlzZXREb2N1bWVudChkb2MpOwotCQlyZWdpb24gPSBkb0dldE9wZW5PblJlZ2lvbihvZmZzZXQpOwotCQkvLyByZXNldCB0aGUgZG9jdW1lbnQgYmFjayB0byBudWxsIGZvciB0aGlzIGFjdGlvbgotCQlzZXREb2N1bWVudChudWxsKTsKLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBUcnkgdG8gb3BlbiB0aGUgZXh0ZXJuYWwgZmlsZSwgZmlsZVN0cmluZyBpbiBpdHMgZGVmYXVsdCBlZGl0b3IKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVN0cmluZwotCSAqIEByZXR1cm4gSUVkaXRvclBhcnQgZWRpdG9yIG9wZW5lZCBvciBudWxsIGlmIGVkaXRvciBjb3VsZCBub3QgYmUgb3BlbmVkCi0JICovCi0JcHJvdGVjdGVkIElFZGl0b3JQYXJ0IG9wZW5FeHRlcm5hbEZpbGUoU3RyaW5nIGZpbGVTdHJpbmcpIHsKLQkJLy8gZmlsZSBkb2VzIG5vdCBleGlzdCBpbiB3b3Jrc3BhY2Ugc28gdHJ5IHRvIG9wZW4gdXNpbmcgc3lzdGVtIGVkaXRvcgotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlU3RyaW5nKTsKLQkJLy8gdHJ5IHRvIG9wZW4gZXhpc3RpbmcgZXh0ZXJuYWwgZmlsZSBpZiBpdCBleGlzdHMKLQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dChmaWxlKTsKLQkJCVN0cmluZyBlZGl0b3JJZCA9IGdldEVkaXRvcklkKGZpbGVTdHJpbmcpOwotCi0JCQl0cnkgewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlyZXR1cm4gcGFnZS5vcGVuRWRpdG9yKGlucHV0LCBlZGl0b3JJZCwgdHJ1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgcGllLmdldE1lc3NhZ2UoKSwgcGllKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB1c2VyIHRoYXQgb3BlbiBvbiBzZWxlY3Rpb24gYWN0aW9uIGNvdWxkIG5vdCBzdWNjZXNzZnVsbHkgb3BlbgotCSAqIHRoZSBzZWxlY3Rpb24gKHdyaXRlcyBtZXNzYWdlIG9uIHN0YXR1cyBiYXIgYW5kIGJlZXBzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5GaWxlRmFpbGVkKCkgewotCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoQ0FOTk9UX09QRU4pOwotCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIElGaWxlLCBpbnB1dCBpbiBpdHMgZGVmYXVsdCBlZGl0b3IsIGlmIHBvc3NpYmxlLCBhbmQgcmV0dXJucwotCSAqIHRoZSBlZGl0b3Igb3BlbmVkLiBQb3NzaWJsZSByZWFzb25zIGZvciBmYWlsdXJlOiBpbnB1dCBjYW5ub3QgYmUgZm91bmQsCi0JICogaW5wdXQgZG9lcyBub3QgZXhpc3QgaW4gd29ya2JlbmNoLCBlZGl0b3IgY2Fubm90IGJlIG9wZW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIElFZGl0b3JQYXJ0IGVkaXRvciBvcGVuZWQgb3IgbnVsbCBpZiBpbnB1dCA9PSBudWxsIG9yIGRvZXMgbm90Ci0JICogICAgICAgICBleGlzdCwgZXh0ZXJuYWwgZWRpdG9yIHdhcyBvcGVuZWQsIGVkaXRvciBjb3VsZCBub3QgYmUgb3BlbmVkCi0JICovCi0JcHJvdGVjdGVkIElFZGl0b3JQYXJ0IG9wZW5GaWxlSW5FZGl0b3IoSUZpbGUgaW5wdXQpIHsKLQkJaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCXJldHVybiBJREUub3BlbkVkaXRvcihwYWdlLCBpbnB1dCwgdHJ1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgcGllLmdldE1lc3NhZ2UoKSwgcGllKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyBvbgotCi0JLyoqCi0JICogT3BlbnMgdGhlIGFwcHJvcHJpYXRlIGVkaXRvciBmb3IgZmlsZVN0cmluZwotCSAqIAotCSAqIEBwYXJhbSBmaWxlU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkZpbGVJbkVkaXRvcihTdHJpbmcgZmlsZVN0cmluZykgewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBudWxsOwotCQlpZiAoZmlsZVN0cmluZyAhPSBudWxsKSB7Ci0JCQkvLyBvcGVuIHdlYiBicm93c2VyIGlmIHRoaXMgaXMgYSB3ZWIgYWRkcmVzcwotCQkJU3RyaW5nIHRlbXAgPSBmaWxlU3RyaW5nLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAodGVtcC5zdGFydHNXaXRoKEhUVFBfUFJPVE9DT0wpKSB7Ci0JCQkJUHJvZ3JhbS5sYXVuY2goZmlsZVN0cmluZyk7IC8vIGxhdW5jaGVzIHdlYiBicm93c2VyL2V4ZWN1dGFibGUKLQkJCQkvLyBhc3NvY2lhdGVkIHdpdGggdXJpCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gY2hvcCBvZmYgdGhlIGZpbGUgcHJvdG9jb2wKLQkJCWlmICh0ZW1wLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCkpIHsKLQkJCQlmaWxlU3RyaW5nID0gZmlsZVN0cmluZy5zdWJzdHJpbmcoRklMRV9QUk9UT0NPTC5sZW5ndGgoKSk7Ci0JCQl9Ci0KLQkJCS8vIHRyeSB0byBsb2NhdGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZSBhbmQgcmV0dXJuIGFuIElGaWxlIGlmCi0JCQkvLyBmb3VuZAotCQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoZmlsZVN0cmluZyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJLy8gZmlsZSBleGlzdHMgaW4gd29ya3NwYWNlCi0JCQkJZWRpdG9yID0gb3BlbkZpbGVJbkVkaXRvcihmaWxlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGZpbGUgZG9lcyBub3QgZXhpc3QgaW4gd29ya3NwYWNlCi0JCQkJZWRpdG9yID0gb3BlbkV4dGVybmFsRmlsZShmaWxlU3RyaW5nKTsKLQkJCX0KLQkJfQotCQkvLyBubyBlZGl0b3Igd2FzIG9wZW5lZAotCQlpZiAoZWRpdG9yID09IG51bGwpIHsKLQkJCW9wZW5GaWxlRmFpbGVkKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuSU9wZW5PbiNvcGVuT24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIHZvaWQgb3Blbk9uKElEb2N1bWVudCBkb2MsIElSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIHNldCB0aGUgZG9jdW1lbnQgZm9yIHRoaXMgYWN0aW9uCi0JCXNldERvY3VtZW50KGRvYyk7Ci0JCS8vIGlmIG5vIHJlZ2lvbiB3YXMgZ2l2ZW4gdGhpcyBhY3Rpb24gZmFpbHMKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJb3BlbkZpbGVGYWlsZWQoKTsKLQkJZWxzZQotCQkJZG9PcGVuT24ocmVnaW9uKTsKLQkJLy8gcmVzZXQgdGhlIGRvY3VtZW50IGJhY2sgdG8gbnVsbCBmb3IgdGhpcyBhY3Rpb24KLQkJc2V0RG9jdW1lbnQobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBjdXJyZW50IGRvY3VtZW50IGFzc29jaWF0ZWQgd2l0aCBvcGVuIG9uCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFkMGE4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwub3Blbm9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyOwotCi0vKioKLSAqIEVkaXRvcklucHV0IGZvciBleHRlcm5hbCBmaWxlcy4gQ29waWVkIGZyb20KLSAqIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmVkaXRvcnMudGV4dC5KYXZhRmlsZUVkaXRvcklucHV0Ci0gKiAKLSAqIEBkZXByZWNhdGVkIFVzZSBvcmcuZWNsaXBzZS51aS5pZGUuRmlsZVN0b3JlRWRpdG9ySW5wdXQgYW5kIEVGUy5nZXRMb2NhbEZpbGVTeXN0ZW0oKS5mcm9tTG9jYWxGaWxlKCkKLSAqLwotcHVibGljIGNsYXNzIEV4dGVybmFsRmlsZUVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0LCBJTG9jYXRpb25Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEZpbGUgZkZpbGU7Ci0KLQlwdWJsaWMgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQoRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZGaWxlID0gZmlsZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvIGluc3RhbmNlb2YgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUV4dGVybmFsRmlsZUVkaXRvcklucHV0IGlucHV0ID0gKEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSBvOwotCQkJcmV0dXJuIGZGaWxlLmVxdWFscyhpbnB1dC5mRmlsZSk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNleGlzdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGZGaWxlLmV4aXN0cygpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoSUxvY2F0aW9uUHJvdmlkZXIuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJcmV0dXJuIHRoaXM7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRJbWFnZURlc2NyaXB0b3IoKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZGaWxlLmdldE5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyI2dldFBhdGgoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCBpbnB1dCA9IChFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQkJCXJldHVybiBuZXcgUGF0aChpbnB1dC5mRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRQZXJzaXN0YWJsZSgpCi0JICovCi0JcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0VG9vbFRpcFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiBmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZGaWxlLmhhc2hDb2RlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9JT3Blbk9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL0lPcGVuT24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2N2MzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL0lPcGVuT24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLm9wZW5vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIE9wZW4gT24uLi4gbmF2aWdhdGlvbgotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU9wZW5PbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgZW50aXJlIHJlZ2lvbiByZWxldmFudCB0byB0aGUgY3VycmVudCBvZmZzZXQgd2hlcmUgYW4KLQkgKiBvcGVuYWJsZSBzb3VyY2UgcmVnaW9uIGlzIGZvdW5kLiBudWxsIGlmIG9mZnNldCBkb2VzIG5vdCBjb250YWluIGFuCi0JICogb3BlbmFibGUgc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgSURvY3VtZW50Ci0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHJldHVybiBJUmVnaW9uIGVudGlyZSByZWdpb24gb2Ygb3BlbmFibGUgc291cmNlCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0T3Blbk9uUmVnaW9uKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgZmlsZS9zb3VyY2UgcmVsZXZhbnQgdG8gcmVnaW9uIGlmIHBvc3NpYmxlLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIElUZXh0Vmlld2VyCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqICAgICAgICAgICAgUmVnaW9uIHRvIGV4YW1pbmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuT24oSURvY3VtZW50IGRvY3VtZW50LCBJUmVnaW9uIHJlZ2lvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5GaWxlSHlwZXJsaW5rVHJhY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuRmlsZUh5cGVybGlua1RyYWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyYTYyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5GaWxlSHlwZXJsaW5rVHJhY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLm9wZW5vbjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXJFeHRlbnNpb241OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTW92ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuRWRpdG9yVXRpbGl0eTsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFVzZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5IeXBlcmxpbmtNYW5hZ2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuRmlsZUh5cGVybGlua1RyYWNrZXIgaW1wbGVtZW50cyBLZXlMaXN0ZW5lciwgTW91c2VMaXN0ZW5lciwgTW91c2VNb3ZlTGlzdGVuZXIsIEZvY3VzTGlzdGVuZXIsIFBhaW50TGlzdGVuZXIsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLCBJRG9jdW1lbnRMaXN0ZW5lciwgSVRleHRJbnB1dExpc3RlbmVyIHsKLQotCS8qKiBUaGUgc2Vzc2lvbiBpcyBhY3RpdmUuICovCi0JcHJpdmF0ZSBib29sZWFuIGZBY3RpdmU7Ci0KLQkvKiogVGhlIGN1cnJlbnRseSBhY3RpdmUgc3R5bGUgcmFuZ2UuICovCi0JcHJpdmF0ZSBJUmVnaW9uIGZBY3RpdmVSZWdpb247Ci0JLyoqIFByZWZlcmVuY2Uga2V5IGZvciBicm93c2VyLWxpa2UgbGlua3MgdG8gYmUgZW5hYmxlZCAqLwotCXByaXZhdGUgU3RyaW5nIGZCcm93c2VyTGlrZUxpbmtzS2V5TW9kaWZpZXJLZXk7Ci0KLQkvKiogVGhlIGxpbmsgY29sb3IuICovCi0JcHJpdmF0ZSBDb2xvciBmQ29sb3I7Ci0JLyoqIFRoZSBoYW5kIGN1cnNvci4gKi8KLQlwcml2YXRlIEN1cnNvciBmQ3Vyc29yOwotCS8qKiBUaGUga2V5IG1vZGlmaWVyIG1hc2suICovCi0JcHJpdmF0ZSBpbnQgZktleU1vZGlmaWVyTWFzazsKLQkvKiogUHJlZmVyZW5jZSBrZXkgZm9yIGh5cGVybGluayB1bmRlcmxpbmUgY29sb3IgKi8KLQlwcml2YXRlIFN0cmluZyBmTGlua0NvbG9yS2V5OwotCS8qKiBUaGUgcHJlZmVyZW5jZSBzdG9yZSAqLwotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmUHJlZmVyZW5jZVN0b3JlOwotCS8qKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBzdHlsZSByYW5nZSBhcyBwb3NpdGlvbi4gKi8KLQlwcml2YXRlIFBvc2l0aW9uIGZSZW1lbWJlcmVkUG9zaXRpb247Ci0KLQkvKiogVGhlIHRleHQgdmlld2VyIHRoaXMgaHlwZXJsaW5rIHRyYWNrZXIgaXMgYXNzb2NpYXRlZCB3aXRoICovCi0JcHJpdmF0ZSBJVGV4dFZpZXdlciBmVGV4dFZpZXdlcjsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgT3BlbkZpbGVIeXBlcmxpbmtUcmFja2VyKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJZlRleHRWaWV3ZXIgPSB0ZXh0Vmlld2VyOwotCX0KLQotCXByaXZhdGUgdm9pZCBhY3RpdmF0ZUN1cnNvcihJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQkJU3R5bGVkVGV4dCB0ZXh0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJRGlzcGxheSBkaXNwbGF5ID0gdGV4dC5nZXREaXNwbGF5KCk7Ci0JCWlmIChmQ3Vyc29yID09IG51bGwpCi0JCQlmQ3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX0hBTkQpOwotCQl0ZXh0LnNldEN1cnNvcihmQ3Vyc29yKTsKLQl9Ci0KLQlwcml2YXRlIGludCBjb21wdXRlU3RhdGVNYXNrKFN0cmluZyBtb2RpZmllcnMpIHsKLQkJaWYgKG1vZGlmaWVycyA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCi0JCWlmIChtb2RpZmllcnMubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBTV1QuTk9ORTsKLQotCQlpbnQgc3RhdGVNYXNrID0gMDsKLQkJU3RyaW5nVG9rZW5pemVyIG1vZGlmaWVyVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihtb2RpZmllcnMsICIsOy46Ky0qICIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChtb2RpZmllclRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWludCBtb2RpZmllciA9IEVkaXRvclV0aWxpdHkuZmluZExvY2FsaXplZE1vZGlmaWVyKG1vZGlmaWVyVG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCWlmIChtb2RpZmllciA9PSAwIHx8IChzdGF0ZU1hc2sgJiBtb2RpZmllcikgPT0gbW9kaWZpZXIpCi0JCQkJcmV0dXJuIC0xOwotCQkJc3RhdGVNYXNrID0gc3RhdGVNYXNrIHwgbW9kaWZpZXI7Ci0JCX0KLQkJcmV0dXJuIHN0YXRlTWFzazsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29sb3IgZnJvbSB0aGUgaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBnaXZlbiBwcmVmZXJlbmNlCi0JICogc3RvcmUuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmZvcm1hdGlvbgotCSAqIGF2YWlsYWJsZS4KLQkgKi8KLQlwcml2YXRlIENvbG9yIGNyZWF0ZUNvbG9yKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBrZXksIERpc3BsYXkgZGlzcGxheSkgewotCi0JCVJHQiByZ2IgPSBudWxsOwotCi0JCWlmIChzdG9yZS5jb250YWlucyhrZXkpKSB7Ci0KLQkJCWlmIChzdG9yZS5pc0RlZmF1bHQoa2V5KSkKLQkJCQlyZ2IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldERlZmF1bHRDb2xvcihzdG9yZSwga2V5KTsKLQkJCWVsc2UKLQkJCQlyZ2IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHN0b3JlLCBrZXkpOwotCQl9Ci0KLQkJcmV0dXJuIEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IocmdiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlkZWFjdGl2YXRlKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKGJvb2xlYW4gcmVkcmF3QWxsKSB7Ci0JCWlmICghZkFjdGl2ZSkKLQkJCXJldHVybjsKLQotCQlyZXBhaXJSZXByZXNlbnRhdGlvbihyZWRyYXdBbGwpOwotCQlmQWN0aXZlID0gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpZiAoZkFjdGl2ZSAmJiBmQWN0aXZlUmVnaW9uICE9IG51bGwpIHsKLQkJCWZSZW1lbWJlcmVkUG9zaXRpb24gPSBuZXcgUG9zaXRpb24oZkFjdGl2ZVJlZ2lvbi5nZXRPZmZzZXQoKSwgZkFjdGl2ZVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQl0cnkgewotCQkJCWV2ZW50LmdldERvY3VtZW50KCkuYWRkUG9zaXRpb24oZlJlbWVtYmVyZWRQb3NpdGlvbik7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJZlJlbWVtYmVyZWRQb3NpdGlvbiA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChmUmVtZW1iZXJlZFBvc2l0aW9uICE9IG51bGwpIHsKLQkJCWlmICghZlJlbWVtYmVyZWRQb3NpdGlvbi5pc0RlbGV0ZWQoKSkgewotCi0JCQkJZXZlbnQuZ2V0RG9jdW1lbnQoKS5yZW1vdmVQb3NpdGlvbihmUmVtZW1iZXJlZFBvc2l0aW9uKTsKLQkJCQlmQWN0aXZlUmVnaW9uID0gbmV3IFJlZ2lvbihmUmVtZW1iZXJlZFBvc2l0aW9uLmdldE9mZnNldCgpLCBmUmVtZW1iZXJlZFBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQkJCQlmUmVtZW1iZXJlZFBvc2l0aW9uID0gbnVsbDsKLQotCQkJCUlUZXh0Vmlld2VyIHZpZXdlciA9IGdldFRleHRWaWV3ZXIoKTsKLQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJU3R5bGVkVGV4dCB3aWRnZXQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQkJCQlpZiAod2lkZ2V0ICE9IG51bGwgJiYgIXdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXdpZGdldC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCWRlYWN0aXZhdGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQlmQWN0aXZlUmVnaW9uID0gbnVsbDsKLQkJCQlmUmVtZW1iZXJlZFBvc2l0aW9uID0gbnVsbDsKLQkJCQlkZWFjdGl2YXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyI2ZvY3VzR2FpbmVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyI2ZvY3VzTG9zdChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZXZlbnQpIHsKLQkJZGVhY3RpdmF0ZSgpOwotCX0KLQotCXByaXZhdGUgaW50IGdldEN1cnJlbnRUZXh0T2Zmc2V0KCkgewotCQl0cnkgewotCQkJU3R5bGVkVGV4dCB0ZXh0ID0gZ2V0VGV4dFZpZXdlcigpLmdldFRleHRXaWRnZXQoKTsKLQkJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQkJcmV0dXJuIC0xOwotCi0JCQlEaXNwbGF5IGRpc3BsYXkgPSB0ZXh0LmdldERpc3BsYXkoKTsKLQkJCVBvaW50IGFic29sdXRlUG9zaXRpb24gPSBkaXNwbGF5LmdldEN1cnNvckxvY2F0aW9uKCk7Ci0JCQlQb2ludCByZWxhdGl2ZVBvc2l0aW9uID0gdGV4dC50b0NvbnRyb2woYWJzb2x1dGVQb3NpdGlvbik7Ci0KLQkJCWludCB3aWRnZXRPZmZzZXQgPSB0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24ocmVsYXRpdmVQb3NpdGlvbik7Ci0JCQlpZiAoZ2V0VGV4dFZpZXdlcigpIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb241KSB7Ci0JCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIGdldFRleHRWaWV3ZXIoKTsKLQkJCQlyZXR1cm4gZXh0ZW5zaW9uLndpZGdldE9mZnNldDJNb2RlbE9mZnNldCh3aWRnZXRPZmZzZXQpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gd2lkZ2V0T2Zmc2V0ICsgZ2V0VGV4dFZpZXdlcigpLmdldFZpc2libGVSZWdpb24oKS5nZXRPZmZzZXQoKTsKLQkJCX0KLQotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQb2ludCBnZXRNYXhpbXVtTG9jYXRpb24oU3R5bGVkVGV4dCB0ZXh0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCVBvaW50IG1heExvY2F0aW9uID0gbmV3IFBvaW50KEludGVnZXIuTUlOX1ZBTFVFLCBJbnRlZ2VyLk1JTl9WQUxVRSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gbGVuZ3RoOyBpKyspIHsKLQkJCVBvaW50IGxvY2F0aW9uID0gdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KG9mZnNldCArIGkpOwotCi0JCQlpZiAobG9jYXRpb24ueCA+IG1heExvY2F0aW9uLngpCi0JCQkJbWF4TG9jYXRpb24ueCA9IGxvY2F0aW9uLng7Ci0JCQlpZiAobG9jYXRpb24ueSA+IG1heExvY2F0aW9uLnkpCi0JCQkJbWF4TG9jYXRpb24ueSA9IGxvY2F0aW9uLnk7Ci0JCX0KLQotCQlyZXR1cm4gbWF4TG9jYXRpb247Ci0JfQotCi0JcHJpdmF0ZSBQb2ludCBnZXRNaW5pbXVtTG9jYXRpb24oU3R5bGVkVGV4dCB0ZXh0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCVBvaW50IG1pbkxvY2F0aW9uID0gbmV3IFBvaW50KEludGVnZXIuTUFYX1ZBTFVFLCBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gbGVuZ3RoOyBpKyspIHsKLQkJCVBvaW50IGxvY2F0aW9uID0gdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KG9mZnNldCArIGkpOwotCi0JCQlpZiAobG9jYXRpb24ueCA8IG1pbkxvY2F0aW9uLngpCi0JCQkJbWluTG9jYXRpb24ueCA9IGxvY2F0aW9uLng7Ci0JCQlpZiAobG9jYXRpb24ueSA8IG1pbkxvY2F0aW9uLnkpCi0JCQkJbWluTG9jYXRpb24ueSA9IGxvY2F0aW9uLnk7Ci0JCX0KLQotCQlyZXR1cm4gbWluTG9jYXRpb247Ci0JfQotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldE5ld1ByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIGZQcmVmZXJlbmNlU3RvcmU7Ci0JfQotCi0JcHJpdmF0ZSBJVGV4dFZpZXdlciBnZXRUZXh0Vmlld2VyKCkgewotCQlyZXR1cm4gZlRleHRWaWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhpZ2hsaWdodFJlZ2lvbihJVGV4dFZpZXdlciB2aWV3ZXIsIElSZWdpb24gcmVnaW9uKSB7Ci0KLQkJaWYgKHJlZ2lvbi5lcXVhbHMoZkFjdGl2ZVJlZ2lvbikpCi0JCQlyZXR1cm47Ci0KLQkJcmVwYWlyUmVwcmVzZW50YXRpb24oKTsKLQotCQlTdHlsZWRUZXh0IHRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0KLQkJLy8gVW5kZXJsaW5lCi0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gMDsKLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHZpZXdlcjsKLQkJCUlSZWdpb24gd2lkZ2V0UmFuZ2UgPSBleHRlbnNpb24ubW9kZWxSYW5nZTJXaWRnZXRSYW5nZShuZXcgUmVnaW9uKHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpKSk7Ci0JCQlpZiAod2lkZ2V0UmFuZ2UgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCW9mZnNldCA9IHdpZGdldFJhbmdlLmdldE9mZnNldCgpOwotCQkJbGVuZ3RoID0gd2lkZ2V0UmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0KLQkJfSBlbHNlIHsKLQkJCW9mZnNldCA9IHJlZ2lvbi5nZXRPZmZzZXQoKSAtIHZpZXdlci5nZXRWaXNpYmxlUmVnaW9uKCkuZ2V0T2Zmc2V0KCk7Ci0JCQlsZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCX0KLQkJLy8gbmVlZCBjbGVhckJhY2tncm91bmQgdG8gYmUgdHJ1ZSBmb3IgcGFpbnQgZXZlbnQgdG8gYmUgZmlyZWQKLQkJdGV4dC5yZWRyYXdSYW5nZShvZmZzZXQsIGxlbmd0aCwgdHJ1ZSk7Ci0KLQkJZkFjdGl2ZVJlZ2lvbiA9IHJlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5jbHVkZXMoSVJlZ2lvbiByZWdpb24sIElSZWdpb24gcG9zaXRpb24pIHsKLQkJcmV0dXJuIHBvc2l0aW9uLmdldE9mZnNldCgpID49IHJlZ2lvbi5nZXRPZmZzZXQoKSAmJiBwb3NpdGlvbi5nZXRPZmZzZXQoKSArIHBvc2l0aW9uLmdldExlbmd0aCgpIDw9IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXIjaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQlpZiAob2xkSW5wdXQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZGVhY3RpdmF0ZSgpOwotCQlvbGRJbnB1dC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lciNpbnB1dERvY3VtZW50Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCWlmIChuZXdJbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQluZXdJbnB1dC5hZGREb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluc3RhbGwoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlmUHJlZmVyZW5jZVN0b3JlID0gc3RvcmU7Ci0JCUlUZXh0Vmlld2VyIHRleHRWaWV3ZXIgPSBnZXRUZXh0Vmlld2VyKCk7Ci0JCWlmICh0ZXh0Vmlld2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3R5bGVkVGV4dCB0ZXh0ID0gdGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQkJdXBkYXRlQ29sb3IodGV4dFZpZXdlcik7Ci0KLQkJdGV4dFZpZXdlci5hZGRUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJZG9jdW1lbnQuYWRkRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQotCQl0ZXh0LmFkZEtleUxpc3RlbmVyKHRoaXMpOwotCQl0ZXh0LmFkZE1vdXNlTGlzdGVuZXIodGhpcyk7Ci0JCXRleHQuYWRkTW91c2VNb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCXRleHQuYWRkRm9jdXNMaXN0ZW5lcih0aGlzKTsKLQkJdGV4dC5hZGRQYWludExpc3RlbmVyKHRoaXMpOwotCi0JCXVwZGF0ZUtleU1vZGlmaWVyTWFzaygpOwotCi0JCWZQcmVmZXJlbmNlU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lciNrZXlQcmVzc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkgewotCi0JCWlmIChmQWN0aXZlKSB7Ci0JCQlkZWFjdGl2YXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZXZlbnQua2V5Q29kZSAhPSBmS2V5TW9kaWZpZXJNYXNrKSB7Ci0JCQlkZWFjdGl2YXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmQWN0aXZlID0gdHJ1ZTsKLQotCQkvLwkJCXJlbW92ZWQgZm9yICMyNTg3MQotCQkvLwotCQkvLwkJCUlTb3VyY2VWaWV3ZXIgdmlld2VyPSBnZXRTb3VyY2VWaWV3ZXIoKTsKLQkJLy8JCQlpZiAodmlld2VyID09IG51bGwpCi0JCS8vCQkJCXJldHVybjsKLQkJLy8JCQkKLQkJLy8JCQlJUmVnaW9uIHJlZ2lvbj0gZ2V0Q3VycmVudFRleHRSZWdpb24odmlld2VyKTsKLQkJLy8JCQlpZiAocmVnaW9uID09IG51bGwpCi0JCS8vCQkJCXJldHVybjsKLQkJLy8JCQkKLQkJLy8JCQloaWdobGlnaHRSZWdpb24odmlld2VyLCByZWdpb24pOwotCQkvLwkJCWFjdGl2YXRlQ3Vyc29yKHZpZXdlcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXIja2V5UmVsZWFzZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBldmVudCkgewotCi0JCWlmICghZkFjdGl2ZSkKLQkJCXJldHVybjsKLQotCQlkZWFjdGl2YXRlKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lciNtb3VzZURvdWJsZUNsaWNrKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXIjbW91c2VEb3duKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBldmVudCkgewotCi0JCWlmICghZkFjdGl2ZSkKLQkJCXJldHVybjsKLQotCQlpZiAoZXZlbnQuc3RhdGVNYXNrICE9IGZLZXlNb2RpZmllck1hc2spIHsKLQkJCWRlYWN0aXZhdGUoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChldmVudC5idXR0b24gIT0gMSkgewotCQkJZGVhY3RpdmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VNb3ZlTGlzdGVuZXIjbW91c2VNb3ZlKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBldmVudCkgewotCi0JCWlmIChldmVudC53aWRnZXQgaW5zdGFuY2VvZiBDb250cm9sICYmICEoKENvbnRyb2wpIGV2ZW50LndpZGdldCkuaXNGb2N1c0NvbnRyb2woKSkgewotCQkJZGVhY3RpdmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFmQWN0aXZlKSB7Ci0JCQlpZiAoZXZlbnQuc3RhdGVNYXNrICE9IGZLZXlNb2RpZmllck1hc2spCi0JCQkJcmV0dXJuOwotCQkJLy8gbW9kaWZpZXIgd2FzIGFscmVhZHkgcHJlc3NlZAotCQkJZkFjdGl2ZSA9IHRydWU7Ci0JCX0KLQotCQlJVGV4dFZpZXdlciB2aWV3ZXIgPSBnZXRUZXh0Vmlld2VyKCk7Ci0JCWlmICh2aWV3ZXIgPT0gbnVsbCkgewotCQkJZGVhY3RpdmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3R5bGVkVGV4dCB0ZXh0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkgewotCQkJZGVhY3RpdmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKChldmVudC5zdGF0ZU1hc2sgJiBTV1QuQlVUVE9OMSkgIT0gMCAmJiB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkgIT0gMCkgewotCQkJZGVhY3RpdmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlpbnQgb2Zmc2V0ID0gZ2V0Q3VycmVudFRleHRPZmZzZXQoKTsKLQkJSU9wZW5PbiBvcGVuT24gPSBPcGVuT25Qcm92aWRlci5nZXRJbnN0YW5jZSgpLmdldE9wZW5PbihnZXRUZXh0Vmlld2VyKCkuZ2V0RG9jdW1lbnQoKSwgb2Zmc2V0KTsKLQkJaWYgKG9wZW5PbiAhPSBudWxsKSB7Ci0JCQlyZWdpb24gPSBvcGVuT24uZ2V0T3Blbk9uUmVnaW9uKGdldFRleHRWaWV3ZXIoKS5nZXREb2N1bWVudCgpLCBvZmZzZXQpOwotCQl9Ci0JCWlmIChyZWdpb24gPT0gbnVsbCB8fCByZWdpb24uZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmVwYWlyUmVwcmVzZW50YXRpb24oKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWhpZ2hsaWdodFJlZ2lvbih2aWV3ZXIsIHJlZ2lvbik7Ci0JCWFjdGl2YXRlQ3Vyc29yKHZpZXdlcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lciNtb3VzZVVwKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCi0JCWlmICghZkFjdGl2ZSkKLQkJCXJldHVybjsKLQotCQlpZiAoZS5idXR0b24gIT0gMSkgewotCQkJZGVhY3RpdmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiB3YXNBY3RpdmUgPSBmQ3Vyc29yICE9IG51bGw7Ci0JCUlSZWdpb24gcHJldmlvdXNSZWdpb24gPSBmQWN0aXZlUmVnaW9uOwotCi0JCWRlYWN0aXZhdGUoKTsKLQotCQlpZiAod2FzQWN0aXZlKSB7Ci0JCQlJT3Blbk9uIG9wZW5PbiA9IE9wZW5PblByb3ZpZGVyLmdldEluc3RhbmNlKCkuZ2V0T3Blbk9uKGdldFRleHRWaWV3ZXIoKS5nZXREb2N1bWVudCgpLCBwcmV2aW91c1JlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQlpZiAob3Blbk9uICE9IG51bGwpIHsKLQkJCQlvcGVuT24ub3Blbk9uKGdldFRleHRWaWV3ZXIoKS5nZXREb2N1bWVudCgpLCBwcmV2aW91c1JlZ2lvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgUGFpbnRMaXN0ZW5lciNwYWludENvbnRyb2woUGFpbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkgewotCQlpZiAoZkFjdGl2ZVJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlUZXh0Vmlld2VyIHZpZXdlciA9IGdldFRleHRWaWV3ZXIoKTsKLQkJaWYgKHZpZXdlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0eWxlZFRleHQgdGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaW50IGxlbmd0aCA9IDA7Ci0KLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCi0JCQlJVGV4dFZpZXdlckV4dGVuc2lvbjUgZXh0ZW5zaW9uID0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgdmlld2VyOwotCQkJSVJlZ2lvbiB3aWRnZXRSYW5nZSA9IGV4dGVuc2lvbi5tb2RlbFJhbmdlMldpZGdldFJhbmdlKGZBY3RpdmVSZWdpb24pOwotCQkJaWYgKHdpZGdldFJhbmdlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlvZmZzZXQgPSB3aWRnZXRSYW5nZS5nZXRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IHdpZGdldFJhbmdlLmdldExlbmd0aCgpOwotCi0JCX0gZWxzZSB7Ci0KLQkJCUlSZWdpb24gcmVnaW9uID0gdmlld2VyLmdldFZpc2libGVSZWdpb24oKTsKLQkJCWlmICghaW5jbHVkZXMocmVnaW9uLCBmQWN0aXZlUmVnaW9uKSkKLQkJCQlyZXR1cm47Ci0KLQkJCW9mZnNldCA9IGZBY3RpdmVSZWdpb24uZ2V0T2Zmc2V0KCkgLSByZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlsZW5ndGggPSBmQWN0aXZlUmVnaW9uLmdldExlbmd0aCgpOwotCQl9Ci0KLQkJLy8gc3VwcG9ydCBmb3IgYmlkaQotCQlQb2ludCBtaW5Mb2NhdGlvbiA9IGdldE1pbmltdW1Mb2NhdGlvbih0ZXh0LCBvZmZzZXQsIGxlbmd0aCk7Ci0JCVBvaW50IG1heExvY2F0aW9uID0gZ2V0TWF4aW11bUxvY2F0aW9uKHRleHQsIG9mZnNldCwgbGVuZ3RoKTsKLQotCQlpbnQgeDEgPSBtaW5Mb2NhdGlvbi54OwotCQlpbnQgeDIgPSBtaW5Mb2NhdGlvbi54ICsgbWF4TG9jYXRpb24ueCAtIG1pbkxvY2F0aW9uLnggLSAxOwotCQlpbnQgeSA9IG1pbkxvY2F0aW9uLnkgKyB0ZXh0LmdldExpbmVIZWlnaHQoKSAtIDE7Ci0KLQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJaWYgKGZDb2xvciAhPSBudWxsICYmICFmQ29sb3IuaXNEaXNwb3NlZCgpKQotCQkJZ2Muc2V0Rm9yZWdyb3VuZChmQ29sb3IpOwotCQlnYy5kcmF3TGluZSh4MSwgeSwgeDIsIHkpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKGZMaW5rQ29sb3JLZXkpKSB7Ci0JCQlJVGV4dFZpZXdlciB2aWV3ZXIgPSBnZXRUZXh0Vmlld2VyKCk7Ci0JCQlpZiAodmlld2VyICE9IG51bGwpCi0JCQkJdXBkYXRlQ29sb3Iodmlld2VyKTsKLQkJfSBlbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhmQnJvd3Nlckxpa2VMaW5rc0tleU1vZGlmaWVyS2V5KSkgewotCQkJdXBkYXRlS2V5TW9kaWZpZXJNYXNrKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVwYWlyUmVwcmVzZW50YXRpb24oKSB7Ci0JCXJlcGFpclJlcHJlc2VudGF0aW9uKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVwYWlyUmVwcmVzZW50YXRpb24oYm9vbGVhbiByZWRyYXdBbGwpIHsKLQotCQlpZiAoZkFjdGl2ZVJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBvZmZzZXQgPSBmQWN0aXZlUmVnaW9uLmdldE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gZkFjdGl2ZVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZkFjdGl2ZVJlZ2lvbiA9IG51bGw7Ci0KLQkJSVRleHRWaWV3ZXIgdmlld2VyID0gZ2V0VGV4dFZpZXdlcigpOwotCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQotCQkJcmVzZXRDdXJzb3Iodmlld2VyKTsKLQotCQkJLy8gUmVtb3ZlIHVuZGVybGluZQotCQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCQkJCUlUZXh0Vmlld2VyRXh0ZW5zaW9uNSBleHRlbnNpb24gPSAoSVRleHRWaWV3ZXJFeHRlbnNpb241KSB2aWV3ZXI7Ci0JCQkJb2Zmc2V0ID0gZXh0ZW5zaW9uLm1vZGVsT2Zmc2V0MldpZGdldE9mZnNldChvZmZzZXQpOwotCQkJfSBlbHNlIHsKLQkJCQlvZmZzZXQgLT0gdmlld2VyLmdldFZpc2libGVSZWdpb24oKS5nZXRPZmZzZXQoKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJU3R5bGVkVGV4dCB0ZXh0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQotCQkJCS8vIG5lZWQgY2xlYXJCYWNrZ3JvdW5kIHRvIGJlIHRydWUgZm9yIHBhaW50IGV2ZW50IHRvIGJlIGZpcmVkCi0JCQkJdGV4dC5yZWRyYXdSYW5nZShvZmZzZXQsIGxlbmd0aCwgdHJ1ZSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geCkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oeCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzZXRDdXJzb3IoSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JCVN0eWxlZFRleHQgdGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ICE9IG51bGwgJiYgIXRleHQuaXNEaXNwb3NlZCgpKQotCQkJdGV4dC5zZXRDdXJzb3IobnVsbCk7Ci0KLQkJaWYgKGZDdXJzb3IgIT0gbnVsbCkgewotCQkJZkN1cnNvci5kaXNwb3NlKCk7Ci0JCQlmQ3Vyc29yID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1ByZWZlcmVuY2VLZXlzKFN0cmluZyBsaW5rQ29sb3JLZXksIFN0cmluZyBicm93c2VyTGlrZUxpbmtzS2V5TW9kaWZpZXJLZXkpIHsKLQkJZkxpbmtDb2xvcktleSA9IGxpbmtDb2xvcktleTsKLQkJZkJyb3dzZXJMaWtlTGlua3NLZXlNb2RpZmllcktleSA9IGJyb3dzZXJMaWtlTGlua3NLZXlNb2RpZmllcktleTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCWlmIChmQ3Vyc29yICE9IG51bGwpIHsKLQkJCWZDdXJzb3IuZGlzcG9zZSgpOwotCQkJZkN1cnNvciA9IG51bGw7Ci0JCX0KLQotCQlJVGV4dFZpZXdlciB0ZXh0Vmlld2VyID0gZ2V0VGV4dFZpZXdlcigpOwotCQlpZiAodGV4dFZpZXdlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRleHRWaWV3ZXIucmVtb3ZlVGV4dElucHV0TGlzdGVuZXIodGhpcyk7Ci0KLQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJCWRvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0KLQkJSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlU3RvcmUgPSBnZXROZXdQcmVmZXJlbmNlU3RvcmUoKTsKLQkJaWYgKHByZWZlcmVuY2VTdG9yZSAhPSBudWxsKQotCQkJcHJlZmVyZW5jZVN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0KLQkJU3R5bGVkVGV4dCB0ZXh0ID0gdGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQkJdGV4dC5yZW1vdmVLZXlMaXN0ZW5lcih0aGlzKTsKLQkJdGV4dC5yZW1vdmVNb3VzZUxpc3RlbmVyKHRoaXMpOwotCQl0ZXh0LnJlbW92ZU1vdXNlTW92ZUxpc3RlbmVyKHRoaXMpOwotCQl0ZXh0LnJlbW92ZUZvY3VzTGlzdGVuZXIodGhpcyk7Ci0JCXRleHQucmVtb3ZlUGFpbnRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ29sb3IoSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JCVN0eWxlZFRleHQgdGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQkJRGlzcGxheSBkaXNwbGF5ID0gdGV4dC5nZXREaXNwbGF5KCk7Ci0JCWZDb2xvciA9IGNyZWF0ZUNvbG9yKGdldE5ld1ByZWZlcmVuY2VTdG9yZSgpLCBmTGlua0NvbG9yS2V5LCBkaXNwbGF5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlS2V5TW9kaWZpZXJNYXNrKCkgewotCQlTdHJpbmcgbW9kaWZpZXJzID0gZ2V0TmV3UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKGZCcm93c2VyTGlrZUxpbmtzS2V5TW9kaWZpZXJLZXkpOwotCQlmS2V5TW9kaWZpZXJNYXNrID0gY29tcHV0ZVN0YXRlTWFzayhtb2RpZmllcnMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vT3Blbk9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5PbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTc3MDJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vT3Blbk9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5vcGVub247Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRTaW1wbGVFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotCi0KLS8qKgotICogRGV0ZXJtaW5lcyB0aGUgYXBwcm9wcmlhdGUgSU9wZW5GaWxlQWN0aW9uIHRvIGNhbGwgYmFzZWQgb24gY3VycmVudAotICogcGFydGl0aW9uLgotICogCi0gKiBAZGVwcmVjYXRlZCBVc2UgYmFzZSBzdXBwb3J0IGZvciBoeXBlcmxpbmsgbmF2aWdhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgT3Blbk9uQWN0aW9uIGV4dGVuZHMgVGV4dEVkaXRvckFjdGlvbiB7Ci0JcHVibGljIE9wZW5PbkFjdGlvbihSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIFN0cmluZyBwcmVmaXgsIElUZXh0RWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihidW5kbGUsIHByZWZpeCwgZWRpdG9yKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRUZXh0RWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSVRleHRFZGl0b3IgZWRpdG9yID0gZ2V0VGV4dEVkaXRvcigpOwotCi0JCQkJLy8gZmlndXJlIG91dCBjdXJyZW50IG9mZnNldAotCQkJCWludCBvZmZzZXQgPSAtMTsKLQkJCQlJU291cmNlRWRpdGluZ1RleHRUb29scyB0ZXh0VG9vbHMgPSAoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMpIGdldFRleHRFZGl0b3IoKS5nZXRBZGFwdGVyKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmNsYXNzKTsKLQkJCQlpZiAodGV4dFRvb2xzICE9IG51bGwpIHsKLQkJCQkJb2Zmc2V0ID0gdGV4dFRvb2xzLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGVkaXRvciBpbnN0YW5jZW9mIElFeHRlbmRlZFNpbXBsZUVkaXRvcikgewotCQkJCQlvZmZzZXQgPSAoKElFeHRlbmRlZFNpbXBsZUVkaXRvcikgZWRpdG9yKS5nZXRDYXJldFBvc2l0aW9uKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkgIT0gbnVsbCkgewotCQkJCQkJSVNlbGVjdGlvbiBzZWwgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWwgaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCQkJCW9mZnNldCA9ICgoSVRleHRTZWxlY3Rpb24pIHNlbCkuZ2V0T2Zmc2V0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJSU9wZW5PbiBvcGVuT24gPSBPcGVuT25Qcm92aWRlci5nZXRJbnN0YW5jZSgpLmdldE9wZW5Pbihkb2N1bWVudCwgb2Zmc2V0KTsKLQkJCQlpZiAob3Blbk9uICE9IG51bGwpIHsKLQkJCQkJb3Blbk9uLm9wZW5Pbihkb2N1bWVudCwgbmV3IFJlZ2lvbihvZmZzZXQsIDApKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vT3Blbk9uQnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMDI5NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwub3Blbm9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uUmVnaXN0cnlSZWFkZXI7Ci0KLQotLyoqCi0gKiBSZWFkcyBleHRlbnNpb25zIGZvciBvcGVuIG9uIGV4dGVuc2lvbiBwb2ludCwKLSAqIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9ucy5vcGVub24KLSAqIAotICogQGRlcHJlY2F0ZWQgVXNlIGJhc2Ugc3VwcG9ydCBmb3IgaHlwZXJsaW5rIG5hdmlnYXRpb24KLSAqLwotcHVibGljIGNsYXNzIE9wZW5PbkJ1aWxkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgT3Blbk9uQnVpbGRlciBmSW5zdGFuY2U7Ci0JLy8gZXh0ZW5zaW9uIHBvaW50IElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExfT1BFTk9OID0gIm9wZW5vbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT05URU5UX1RZUEVfSURFTlRJRklFUiA9ICJjb250ZW50dHlwZWlkZW50aWZpZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfT1BFTk9OID0gIm9wZW5vbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUEFSVElUSU9OX1RZUEUgPSAicGFydGl0aW9udHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIHJldHVybnMgc2luZ2xldG9uIGluc3RhbmNlIG9mIE9wZW5PbkJ1aWxkZXIKLQkgKiAKLQkgKiBAcmV0dXJuIE9wZW5PbkJ1aWxkZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBPcGVuT25CdWlsZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBPcGVuT25CdWlsZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmQ3VycmVudENvbnRlbnRUeXBlOwotCXByaXZhdGUgT3Blbk9uRGVmaW5pdGlvbiBmQ3VycmVudE9wZW5PbkRlZmluaXRpb24gPSBudWxsOwotCi0JcHJpdmF0ZSBMaXN0IGZPcGVuT25EZWZzID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0Q29udHJpYnV0aW9uVGFnOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFydCBJRCBhdHRyaWJ1dGUgdGhhdCBpcyBleHBlY3RlZCBpbiB0aGUKLQkgKiB0YXJnZXQgZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldElkKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE9wZW5PbkNsYXNzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgb3BlbiBvbiBkZWZpbml0aW9uIG9iamVjdHMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE9wZW5PbkRlZmluaXRpb25bXSBnZXRPcGVuT25EZWZpbml0aW9ucygpIHsKLQkJaW5pdENhY2hlKCk7Ci0JCXJldHVybiAoT3Blbk9uRGVmaW5pdGlvbltdKSBmT3Blbk9uRGVmcy50b0FycmF5KG5ldyBPcGVuT25EZWZpbml0aW9uW2ZPcGVuT25EZWZzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBvcGVuIG9uIGRlZmluaXRpb24gb2JqZWN0cyB2YWxpZCBmb3IKLQkgKiBjb250ZW50VHlwZS9wYXJ0aXRpb25UeXBlCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKiBAcmV0dXJuIGlmIGVpdGhlciBjb250ZW50VHlwZSBvciBwYXJ0aXRpb25UeXBlIGlzIG51bGwsIG51bGwgaXMKLQkgKiAgICAgICAgIHJldHVybmVkCi0JICovCi0JcHVibGljIE9wZW5PbkRlZmluaXRpb25bXSBnZXRPcGVuT25EZWZpbml0aW9ucyhTdHJpbmcgY29udGVudFR5cGUsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsIHx8IHBhcnRpdGlvblR5cGUgPT0gbnVsbCkgewotCQkJLy8gc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGRlZmluZSBhbiBvcGVub24gd2l0aG91dCBhIGNvbnRlbnQgdHlwZQotCQkJLy8gYnV0IGlmIGl0IHdlcmUgcG9zc2libGUgdGhlbiB3b3VsZCBuZWVkIHRvIHNlYXJjaCBhbGwgb3Blbm9uCi0JCQkvLyBkZWZpbml0aW9ucyBmb3IKLQkJCS8vIGRlZmluaXRpb25zIHdpdGggZW1wdHkgY29udGVudFR5cGUgbGlzdAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBlbnRpcmUgbGlzdCBvZiBvcGVub24gZGVmaW5pdGlvbiBvYmplY3RzCi0JCU9wZW5PbkRlZmluaXRpb25bXSBhbGxEZWZzID0gZ2V0T3Blbk9uRGVmaW5pdGlvbnMoKTsKLQkJLy8gY3VycmVudCBsaXN0IG9mIG9wZW4gb24gZGVmaW5pdGlvbnMgdmFsaWQgZm9yCi0JCS8vIGNvbnRlbnRUeXBlL3BhcnRpdGlvblR5cGUKLQkJTGlzdCBkZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBkZWZhdWx0IGRlZmluaXRpb25zIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIGVuZCBvZiBsaXN0IG9mIG9wZW4gb24KLQkJLy8gZGVmaW5pdGlvbnMKLQkJTGlzdCBsYXN0RGVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbERlZnMubGVuZ3RoOyArK2kpIHsKLQkJCS8vIGZvciBlYWNoIG9uZSBjaGVjayBpZiBpdCBjb250YWlucyBjb250ZW50VHlwZQotCQkJTGlzdCBwYXJ0aXRpb25zID0gKExpc3QpIGFsbERlZnNbaV0uZ2V0Q29udGVudFR5cGVzKCkuZ2V0KGNvbnRlbnRUeXBlKTsKLQkJCWlmIChwYXJ0aXRpb25zICE9IG51bGwpIHsKLQkJCQkvLyB0aGlzIG9wZW5vbiBkZWZpbml0aW9uIGlzIHZhbGlkIGZvciBhbGwgcGFydGl0aW9uIHR5cGVzIGZvcgotCQkJCS8vIHRoaXMgY29udGVudCB0eXBlCi0JCQkJaWYgKHBhcnRpdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIHRoaXMgd2lsbCBiZSBhZGRlZCB0byBlbmQgb2YgbGlzdCBiZWNhdXNlIHRoaXMgaXMKLQkJCQkJLy8gY29uc2lkZXJlZCBhIGRlZmF1bHQgb3Blbm9uCi0JCQkJCWxhc3REZWZzLmFkZChhbGxEZWZzW2ldKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBleGFtaW5lIHRoZSBwYXJ0aXRpb24gdHlwZXMgb2YgdGhpcyBvcGVub24KLQkJCQkJaW50IGogPSAwOyAvLyBjdXJyZW50IGluZGV4IGluIGxpc3Qgb2YgcGFydGl0aW9ucwotCQkJCQlib29sZWFuIGFkZGVkID0gZmFsc2U7IC8vIG9wZW5vbiBoYXMgYmVlbiBhZGRlZCB0byBsaXN0Ci0JCQkJCXdoaWxlIChqIDwgcGFydGl0aW9ucy5zaXplKCkgJiYgIWFkZGVkKSB7Ci0JCQkJCQkvLyB0aGlzIG9wZW5vbiBkZWZpbml0aW9uIGFwcGxpZXMgdG8gcGFydGl0aW9uVHlwZSBzbwotCQkJCQkJLy8gYWRkIHRvIGxpc3Qgb2YgdmFsaWQgb3Blbm9ucwotCQkJCQkJaWYgKHBhcnRpdGlvblR5cGUuZXF1YWxzKHBhcnRpdGlvbnMuZ2V0KGopKSkgewotCQkJCQkJCWRlZnMuYWRkKGFsbERlZnNbaV0pOwotCQkJCQkJCWFkZGVkID0gdHJ1ZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gY29udGludWUgY2hlY2tpbmcgdG8gc2VlIGlmIHRoaXMgb3Blbm9uCi0JCQkJCQkJLy8gZGVmaW5pdGlvbiBpcyB2YWxpZCBmb3IgY3VycmVudCBwYXJ0aXRpb25UeXBlCi0JCQkJCQkJKytqOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGFwcGVuZCB0aGUgZGVmYXVsdCBvcGVub24gZGVmaW5pdGlvbnMKLQkJZGVmcy5hZGRBbGwobGFzdERlZnMpOwotCi0JCS8vIHJldHVybiB0aGUgbGlzdAotCQlyZXR1cm4gKE9wZW5PbkRlZmluaXRpb25bXSkgZGVmcy50b0FycmF5KG5ldyBPcGVuT25EZWZpbml0aW9uW2RlZnMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRDYWNoZSgpIHsKLQkJaWYgKGZPcGVuT25EZWZzID09IG51bGwpIHsKLQkJCWZPcGVuT25EZWZzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJCXJlYWRDb250cmlidXRpb25zKFRBR19PUEVOT04sIFBMX09QRU5PTik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzZXMgZWxlbWVudCB3aGljaCBzaG91bGQgYmUgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQgc3BlY2lmeWluZyBhCi0JICogY29udGVudCB0eXBlIGZvciB0aGUgY3VycmVudCBvcGVuIG9uIHRhZy4gQXNzdW1lcyB0aGF0IHRoZXJlIGlzIGEgdmFsaWQKLQkgKiBjdXJyZW50IG9wZW4gb24gZGVmaW5pdGlvbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGNvbnRlbnR0eXBlaWRlbnRpZmllciBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbnRlbnRUeXBlVGFnKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIGFkZCB0byBjdXJyZW50IG9wZW5PbkRlZmluaXRpb24KLQkJU3RyaW5nIHRoZUlkID0gZ2V0SWQoZWxlbWVudCk7Ci0KLQkJaWYgKHRoZUlkICE9IG51bGwpIHsKLQkJCWZDdXJyZW50Q29udGVudFR5cGUgPSB0aGVJZDsKLQkJCWZDdXJyZW50T3Blbk9uRGVmaW5pdGlvbi5hZGRDb250ZW50VHlwZUlkKGZDdXJyZW50Q29udGVudFR5cGUpOwotCQl9IGVsc2UgewotCQkJZkN1cnJlbnRDb250ZW50VHlwZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzZXMgZWxlbWVudCB3aGljaCBzaG91bGQgYmUgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQgc3BlY2lmeWluZyBhbgotCSAqIG9wZW4gb24gb2JqZWN0LiBDcmVhdGVzIGEgbmV3IG9wZW4gb24gZGVmaW5pdGlvbiBvYmplY3QgYW5kIGFkZHMgaXQgdG8KLQkgKiB0aGUgbGlzdCBvZiBvcGVuIG9uIGRlZmluaXRpb24gb2JqZWN0cwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcGVub24gY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NPcGVuT25UYWcoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRoZUlkID0gZ2V0SWQoZWxlbWVudCk7Ci0JCVN0cmluZyB0aGVDbGFzcyA9IGdldE9wZW5PbkNsYXNzKGVsZW1lbnQpOwotCi0JCWlmICh0aGVJZCAhPSBudWxsICYmIHRoZUNsYXNzICE9IG51bGwpIHsKLQkJCS8vIHN0YXJ0IGJ1aWxkaW5nIG5ldyBPcGVuT25EZWZpbml0aW9uCi0JCQlmQ3VycmVudE9wZW5PbkRlZmluaXRpb24gPSBuZXcgT3Blbk9uRGVmaW5pdGlvbih0aGVJZCwgdGhlQ2xhc3MsIGVsZW1lbnQpOwotCQkJZk9wZW5PbkRlZnMuYWRkKGZDdXJyZW50T3Blbk9uRGVmaW5pdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlmQ3VycmVudE9wZW5PbkRlZmluaXRpb24gPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvY2Vzc2VzIGVsZW1lbnQgd2hpY2ggc2hvdWxkIGJlIGEgY29uZmlndXJhdGlvbiBlbGVtZW50IHNwZWNpZnlpbmcgYQotCSAqIHBhcnRpdGlvbiB0eXBlIGZvciB0aGUgY3VycmVudCBvcGVuIG9uL2NvbnRlbnQgdHlwZSB0YWcuIEFzc3VtZXMgdGhhdAotCSAqIHRoZXJlIGlzIGEgdmFsaWQgY3VycmVudCBvcGVuIG9uL2NvbnRlbnQgdHlwZSB0YWcuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHBhcnRpdGlvbnR5cGUgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NQYXJ0aXRpb25UeXBlVGFnKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIGFkZCB0byBjdXJyZW50IG9wZW5PbkRlZmluaXRpb24vY29udGVudFR5cGUKLQkJU3RyaW5nIHRoZUlkID0gZ2V0SWQoZWxlbWVudCk7Ci0KLQkJaWYgKHRoZUlkICE9IG51bGwpIHsKLQkJCWZDdXJyZW50T3Blbk9uRGVmaW5pdGlvbi5hZGRQYXJ0aXRpb25UeXBlKGZDdXJyZW50Q29udGVudFR5cGUsIHRoZUlkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlYWRzIHRoZSBjb250cmlidXRpb25zIGZyb20gdGhlIHJlZ2lzdHJ5IGZvciB0aGUgcHJvdmlkZWQgd29ya2JlbmNoCi0JICogcGFydCBhbmQgdGhlIHByb3ZpZGVkIGV4dGVuc2lvbiBwb2ludCBJRC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFnCi0JICogQHBhcmFtIGV4dGVuc2lvblBvaW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZENvbnRyaWJ1dGlvbnMoU3RyaW5nIHRhZywgU3RyaW5nIGV4dGVuc2lvblBvaW50KSB7Ci0JCXRhcmdldENvbnRyaWJ1dGlvblRhZyA9IHRhZzsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJcmVhZFJlZ2lzdHJ5KHJlZ2lzdHJ5LCBQTFVHSU5fSUQsIGV4dGVuc2lvblBvaW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRhZyA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCi0JCWlmICh0YWcuZXF1YWxzKHRhcmdldENvbnRyaWJ1dGlvblRhZykpIHsKLQkJCXByb2Nlc3NPcGVuT25UYWcoZWxlbWVudCk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBwcm9jZXNzaW5nIG9mIGN1cnJlbnQgb3BlbiBvbiB0YWcgcmVzdWx0ZWQgaW4gYQotCQkJLy8gY3VycmVudCBvcGVuIG9uIGRlZmluaXRpb24KLQkJCS8vIGJlZm9yZSBjb250aW51ZSByZWFkaW5nIHRoZSBjaGlsZHJlbgotCQkJaWYgKGZDdXJyZW50T3Blbk9uRGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmVhZEVsZW1lbnRDaGlsZHJlbihlbGVtZW50KTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX0NPTlRFTlRfVFlQRV9JREVOVElGSUVSKSkgewotCQkJcHJvY2Vzc0NvbnRlbnRUeXBlVGFnKGVsZW1lbnQpOwotCi0JCQkvLyBtYWtlIHN1cmUgcHJvY2Vzc2luZyBvZiBjdXJyZW50IGNvbnRlbnQgdHlwZSByZXN1bHRlZCBpbiBhCi0JCQkvLyB2YWxpZCBjb250ZW50IHR5cGUKLQkJCS8vIGJlZm9yZSByZWFkaW5nIHRoZSBjaGlsZHJlbgotCQkJaWYgKGZDdXJyZW50Q29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJCXJlYWRFbGVtZW50Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmICh0YWcuZXF1YWxzKFRBR19QQVJUSVRJT05fVFlQRSkpIHsKLQkJCXByb2Nlc3NQYXJ0aXRpb25UeXBlVGFnKGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25EZWZpbml0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5PbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE2MGQ2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5PbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5vcGVub247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBPcGVuIG9uIGRlZmluaXRpb24gb2JqZWN0Ci0gKiAKLSAqIEBkZXByZWNhdGVkIFVzZSBiYXNlIHN1cHBvcnQgZm9yIGh5cGVybGluayBuYXZpZ2F0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuT25EZWZpbml0aW9uIHsKLQlwcml2YXRlIFN0cmluZyBmQ2xhc3NOYW1lID0gbnVsbDsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZDb25maWd1cmF0aW9uRWxlbWVudCA9IG51bGw7Ci0KLQkvLyBhIGhhc2ggbWFwIG9mIGNvbnRlbnQgdHlwZSBJZHMgKFN0cmluZykgdGhhdCBwb2ludHMgdG8gbGlzdHMgb2YKLQkvLyBwYXJpdGlvbiB0eXBlcyAoTGlzdCBvZiBTdHJpbmdzKQotCS8vIGNvbnRlbnRUeXBlSWQgLT4gTGlzdChwYXJpdGlvblR5cGUsIHBhcml0aW9uVHlwZSwgcGFydGl0aW9uVHlwZSwgLi4uKQotCS8vIGNvbnRlbnRUeXBlSWQyIC0+IExpc3QocGFydGl0aW9uVHlwZSwgcGFydGl0aW9uVHlwZSwgLi4uKQotCS8vIC4uLgotCXByaXZhdGUgSGFzaE1hcCBmQ29udGVudFR5cGVzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmSWQgPSBudWxsOwotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIGNsYXNzMQotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uRWxlbWVudAotCSAqLwotCXB1YmxpYyBPcGVuT25EZWZpbml0aW9uKFN0cmluZyBpZCwgU3RyaW5nIGNsYXNzMSwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCWZJZCA9IGlkOwotCQlmQ2xhc3NOYW1lID0gY2xhc3MxOwotCQlmQ29uZmlndXJhdGlvbkVsZW1lbnQgPSBjb25maWd1cmF0aW9uRWxlbWVudDsKLQkJZkNvbnRlbnRUeXBlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ29udGVudFR5cGVJZChTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlpZiAoIWZDb250ZW50VHlwZXMuY29udGFpbnNLZXkoY29udGVudFR5cGVJZCkpCi0JCQlmQ29udGVudFR5cGVzLnB1dChjb250ZW50VHlwZUlkLCBuZXcgQXJyYXlMaXN0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhcnRpdGlvblR5cGUoU3RyaW5nIGNvbnRlbnRUeXBlSWQsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCWlmICghZkNvbnRlbnRUeXBlcy5jb250YWluc0tleShjb250ZW50VHlwZUlkKSkKLQkJCWZDb250ZW50VHlwZXMucHV0KGNvbnRlbnRUeXBlSWQsIG5ldyBBcnJheUxpc3QoKSk7Ci0KLQkJTGlzdCBwYXJ0aXRpb25MaXN0ID0gKExpc3QpIGZDb250ZW50VHlwZXMuZ2V0KGNvbnRlbnRUeXBlSWQpOwotCQlwYXJ0aXRpb25MaXN0LmFkZChwYXJ0aXRpb25UeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGV4dGVuc2lvbi4gSWYgdGhlIGV4dGVuc2lvbiBwbHVnaW4gaGFzIG5vdCBiZWVuIGxvYWRlZCBhCi0JICogYnVzeSBjdXJzb3Igd2lsbCBiZSBhY3RpdmF0ZWQgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgbG9hZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwcml2YXRlIE9iamVjdCBjcmVhdGVFeHRlbnNpb24oU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkvLyBJZiBwbHVnaW4gaGFzIGJlZW4gbG9hZGVkIGNyZWF0ZSBleHRlbnNpb24uCi0JCS8vIE90aGVyd2lzZSwgc2hvdyBidXN5IGN1cnNvciB0aGVuIGNyZWF0ZSBleHRlbnNpb24uCi0JCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKTsKLQkJZmluYWwgU3RyaW5nIG5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0KLQkJZmluYWwgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsxXTsKLQkJU3RyaW5nIHBsdWdpbklkID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCWlmIChidW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24obmFtZSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQloYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKHJlc3VsdCwgZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShudWxsLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJcmVzdWx0WzBdID0gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKG5hbWUpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihyZXN1bHQsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFswXTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIElPcGVuT24gZm9yIHRoaXMgZGVmaW5pdGlvbgotCSAqLwotCXB1YmxpYyBJT3Blbk9uIGNyZWF0ZU9wZW5PbigpIHsKLQkJSU9wZW5PbiBvcGVuT24gPSBudWxsOwotCi0JCWlmIChnZXRDbGFzc05hbWUoKSAhPSBudWxsKSB7Ci0JCQlvcGVuT24gPSAoSU9wZW5PbikgY3JlYXRlRXh0ZW5zaW9uKE9wZW5PbkJ1aWxkZXIuQVRUX0NMQVNTKTsKLQkJfQotCi0JCXJldHVybiBvcGVuT247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmQ2xhc3MuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBmQ2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZkNvbmZpZ3VyYXRpb25FbGVtZW50LgotCSAqLwotCXB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKSB7Ci0JCXJldHVybiBmQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmQ29udGVudFR5cGVzLgotCSAqLwotCXB1YmxpYyBIYXNoTWFwIGdldENvbnRlbnRUeXBlcygpIHsKLQkJcmV0dXJuIGZDb250ZW50VHlwZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmSWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGZJZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogQHBhcmFtIGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihPYmplY3RbXSByZXN1bHQsIFRocm93YWJsZSBlKSB7Ci0JCUxvZ2dlci5sb2dFeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgb3BlbiBvbjogIiArIGdldElkKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCXJlc3VsdFswXSA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjA5ZmY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vT3Blbk9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5vcGVub247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nOwotCi0KLS8qKgotICogRGV0ZXJtaW5lcyB0aGUgYXBwcm9wcmlhdGUgSU9wZW5PbiB0byBjYWxsIGJhc2VkIG9uIGN1cnJlbnQgcGFydGl0aW9uLgotICogCi0gKiBAZGVwcmVjYXRlZCBVc2UgYmFzZSBzdXBwb3J0IGZvciBoeXBlcmxpbmsgbmF2aWdhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgT3Blbk9uUHJvdmlkZXIgewotCXByaXZhdGUgc3RhdGljIE9wZW5PblByb3ZpZGVyIGZJbnN0YW5jZTsKLQotCS8qKgotCSAqIHJldHVybnMgc2luZ2xldG9uIGluc3RhbmNlIG9mIE9wZW5PblByb3ZpZGVyCi0JICogCi0JICogQHJldHVybiBPcGVuT25Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIE9wZW5PblByb3ZpZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBPcGVuT25Qcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHR5cGUgb2YgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyBkb2N1bWVudCBpcyBub3QgbnVsbAotCSAqIEByZXR1cm4gU3RyaW5nIGNvbnRlbnQgdHlwZSBvZiBnaXZlbiBkb2N1bWVudAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGUoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQotCQlJTW9kZWxNYW5hZ2VyIG1nciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtZ3IuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQl0eXBlID0gbW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIElPcGVuT24gZm9yIHRoZSBjdXJyZW50IHBhcnRpdGlvbgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSU9wZW5PbiBnZXRPcGVuT24oSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCUlPcGVuT24gb3Blbk9uID0gbnVsbDsKLQotCQkvLyBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgcGFydGl0aW9uCi0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY29udGVudFR5cGVJRCA9IGdldENvbnRlbnRUeXBlKGRvY3VtZW50KTsKLQkJCVN0cmluZyBwYXJ0aXRpb25UeXBlID0gZ2V0UGFydGl0aW9uVHlwZShkb2N1bWVudCwgb2Zmc2V0KTsKLQotCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJRCk7Ci0KLQkJCXdoaWxlIChvcGVuT24gPT0gbnVsbCAmJiBjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkJLy8gUXVlcnkgT3Blbk9uQnVpbGRlciBhbmQgZ2V0IHRoZSBsaXN0IG9mIE9wZW5PbnMgZm9yIHRoZQotCQkJCS8vIGN1cnJlbnQgcGFydGl0aW9uCi0JCQkJT3Blbk9uRGVmaW5pdGlvbltdIGRlZnMgPSBPcGVuT25CdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0T3Blbk9uRGVmaW5pdGlvbnMoY29udGVudFR5cGUuZ2V0SWQoKSwgcGFydGl0aW9uVHlwZSk7Ci0JCQkJY29udGVudFR5cGUgPSBjb250ZW50VHlwZS5nZXRCYXNlVHlwZSgpOwotCi0JCQkJLy8gSWYgbW9yZSB0aGFuIDEgb3Blbm9uIGlzIHJldHVybmVkLCBuZWVkIHRvIGZ1cnRoZXIgY2hlY2sKLQkJCQkvLyB3aGljaCBPcGVuT24gaXMgdGhlIGFwcHJvcHJpYXRlIG9uZSB0byByZXR1cm4KLQkJCQkvLyBmb3Igbm93IGp1c3QgcmV0dXJuaW5nIHRoZSBmaXJzdCBvbmUKLQkJCQlpZiAoZGVmcyAhPSBudWxsICYmIGRlZnMubGVuZ3RoID4gMCkgewotCQkJCQlvcGVuT24gPSBkZWZzWzBdLmNyZWF0ZU9wZW5PbigpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBvcGVuT247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGl0aW9uIHR5cGUgbG9jYXRlZCBhdCBvZmZzZXQgaW4gdGhlIGRvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgZG9jdW1lbnQgaXMgbm90IG51bGwKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBTdHJpbmcgcGFydGl0aW9uIHR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIFRPRE86IHByb3ZpZGUgcGFydGl0aW9uaW5nIGluZm9ybWF0aW9uIHNvIHdlJ3JlIG5vdCB1c2luZyBhIGRlZmF1bHQgbGlrZSB0aGlzCi0JCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJdHlwZSA9IFRleHRVdGlsaXRpZXMuZ2V0Q29udGVudFR5cGUoZG9jdW1lbnQsIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcsIG9mZnNldCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlMSkgewotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUlUeXBlZFJlZ2lvbiByZWdpb24gPSBkb2N1bWVudC5nZXRQYXJ0aXRpb24ob2Zmc2V0KTsKLQkJCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQl0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQl0eXBlID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0VkaXRvclByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0VkaXRvclByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2UzNDQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9FZGl0b3JQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLQotLyoqCi0gKiBQcmVmZXJlbmNlIGtleXMgZm9yIFNTRSBVSQotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yUHJlZmVyZW5jZU5hbWVzIHsKLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyBvbi10aGUtZmx5IHZhbGlkYXRpb24KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkFMVUFURV9URU1QT1JBUllfUFJPQkxFTVMgPSBnZXRFdmFsdWF0ZVRlbXBvcmFyeVByb2JsZW1zS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RXZhbHVhdGVUZW1wb3JhcnlQcm9ibGVtc0tleSgpIHsKLQkJcmV0dXJuICJldmFsdWF0ZVRlbXBvcmFyeVByb2JsZW1zIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgYnJhY2tldCBtYXRjaGluZyBoaWdobGlnaHRpbmcKLQkgKiBpcyB0dXJuZWQgb24gb3Igb2ZmLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BVENISU5HX0JSQUNLRVRTID0gZ2V0TWF0Y2hpbmdCcmFja2V0c0tleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE1hdGNoaW5nQnJhY2tldHNLZXkoKSB7Ci0JCXJldHVybiAibWF0Y2hpbmdCcmFja2V0cyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgY29sb3IgdXNlZCB0byBoaWdobGlnaHQgbWF0Y2hpbmcKLQkgKiBicmFja2V0cy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uIEEgUkdCIGNvbG9yIHZhbHVlIGVuY29kZWQgYXMgYQotCSAqIHN0cmluZyB1c2luZyBjbGFzcyA8Y29kZT5QcmVmZXJlbmNlQ29udmVydGVyPC9jb2RlPgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNQVRDSElOR19CUkFDS0VUU19DT0xPUiA9IGdldE1hdGNoaW5nQnJhY2tldHNDb2xvcktleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE1hdGNoaW5nQnJhY2tldHNDb2xvcktleSgpIHsKLQkJcmV0dXJuICJtYXRjaGluZ0JyYWNrZXRzQ29sb3IiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgZGVmaW5lcyB0aGUga2V5IGZvciB0aGUgaG92ZXIgbW9kaWZpZXJzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX1RFWFRfSE9WRVJfTU9ESUZJRVJTID0gZ2V0VGV4dEhvdmVyTW9kaWZpZXJzS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGV4dEhvdmVyTW9kaWZpZXJzS2V5KCkgewotCQlyZXR1cm4gImhvdmVyTW9kaWZpZXJzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGRlZmluZXMgcmVhZCBvbmx5IGNvbnRyYXN0IHNjYWxlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+SW50ZWdlcjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfT05MWV9GT1JFR1JPVU5EX1NDQUxFID0gZ2V0UmVhZE9ubHlGb3JlZ3JvdW5kU2NhbGVLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRSZWFkT25seUZvcmVncm91bmRTY2FsZUtleSgpIHsKLQkJcmV0dXJuICJyZWFkT25seUZvcmVncm91bmRTY2FsZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBkZWZpbmVzIHdoZXRoZXIgb3Igbm90IHRvIHNob3cgYSBtZXNzYWdlIGRpYWxvZwotCSAqIGluZm9ybWluZyB1c2VyIG9mIHVua25vd24gY29udGVudCB0eXBlIGluIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9XX1VOS05PV05fQ09OVEVOVF9UWVBFX01TRyA9ICJzaG93VW5rbm93bkNvbnRlbnRUeXBlTXNnIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBuYW1lIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgYXV0byBhY3RpdmF0aW9uIGRlbGF5IHRpbWUgaW4KLQkgKiBtaWxsaXNlY29uZHMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09ERUFTU0lTVF9BVVRPQUNUSVZBVElPTl9ERUxBWSA9ICJjb250ZW50X2Fzc2lzdF9hdXRvYWN0aXZhdGlvbl9kZWxheSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGhvbGRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHVzZWQgaW4gdGhlIGNvZGUKLQkgKiBhc3Npc3Qgc2VsZWN0aW9uIGRpYWxvZy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uIEEgUkdCIGNvbG9yIHZhbHVlIGVuY29kZWQgYXMgYQotCSAqIHN0cmluZyB1c2luZyBjbGFzcyA8Y29kZT5QcmVmZXJlbmNlQ29udmVydGVyPC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlN0cmluZ0NvbnZlcnRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09ERUFTU0lTVF9QUk9QT1NBTFNfQkFDS0dST1VORCA9ICJjb250ZW50X2Fzc2lzdF9wcm9wb3NhbHNfYmFja2dyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGhvbGRzIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIHVzZWQgaW4gdGhlIGNvZGUKLQkgKiBhc3Npc3Qgc2VsZWN0aW9uIGRpYWxvZy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uIEEgUkdCIGNvbG9yIHZhbHVlIGVuY29kZWQgYXMgYQotCSAqIHN0cmluZyB1c2luZyBjbGFzcyA8Y29kZT5QcmVmZXJlbmNlQ29udmVydGVyPC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlN0cmluZ0NvbnZlcnRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09ERUFTU0lTVF9QUk9QT1NBTFNfRk9SRUdST1VORCA9ICJjb250ZW50X2Fzc2lzdF9wcm9wb3NhbHNfZm9yZWdyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGhvbGRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHVzZWQgZm9yIHBhcmFtZXRlcgotCSAqIGhpbnRzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4gQSBSR0IgY29sb3IgdmFsdWUgZW5jb2RlZCBhcyBhCi0JICogc3RyaW5nIHVzaW5nIGNsYXNzIDxjb2RlPlByZWZlcmVuY2VDb252ZXJ0ZXI8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuU3RyaW5nQ29udmVydGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXIKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0RFQVNTSVNUX1BBUkFNRVRFUlNfQkFDS0dST1VORCA9ICJjb250ZW50X2Fzc2lzdF9wYXJhbWV0ZXJzX2JhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgZm9yZWdyb3VuZCBjb2xvciB1c2VkIGluIHRoZSBjb2RlCi0JICogYXNzaXN0IHNlbGVjdGlvbiBkaWFsb2cuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LiBBIFJHQiBjb2xvciB2YWx1ZSBlbmNvZGVkIGFzIGEKLQkgKiBzdHJpbmcgdXNpbmcgY2xhc3MgPGNvZGU+UHJlZmVyZW5jZUNvbnZlcnRlcjwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5TdHJpbmdDb252ZXJ0ZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPREVBU1NJU1RfUEFSQU1FVEVSU19GT1JFR1JPVU5EID0gImNvbnRlbnRfYXNzaXN0X3BhcmFtZXRlcnNfZm9yZWdyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyB3aGV0aGVyIHNlbWFudGljIGhpZ2hsaWdodGluZyBpcyB0dXJuZWQgb24gb3Igb2ZmCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VNQU5USUNfSElHSExJR0hUSU5HID0gInNlbWFudGljSGlnaGxpZ2h0aW5nIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL092ZXJsYXlQcmVmZXJlbmNlU3RvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9PdmVybGF5UHJlZmVyZW5jZVN0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZWIxNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL092ZXJsYXlQcmVmZXJlbmNlU3RvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBBbiBvdmVybGF5aW5nIHByZWZlcmVuY2Ugc3RvcmUuIGNvcGllZCBmcm9tIEpEVAotICovCi1wdWJsaWMgY2xhc3MgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBpbXBsZW1lbnRzIElQcmVmZXJlbmNlU3RvcmUgewotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBPdmVybGF5S2V5IHsKLQotCQlUeXBlRGVzY3JpcHRvciBmRGVzY3JpcHRvcjsKLQkJU3RyaW5nIGZLZXk7Ci0KLQkJcHVibGljIE92ZXJsYXlLZXkoVHlwZURlc2NyaXB0b3IgZGVzY3JpcHRvciwgU3RyaW5nIGtleSkgewotCQkJZkRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotCQkJZktleSA9IGtleTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgUHJvcGVydHlMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQotCQkvKgotCQkgKiBAc2VlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlPdmVybGF5S2V5IGtleSA9IGZpbmRPdmVybGF5S2V5KGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQkJaWYgKGtleSAhPSBudWxsKQotCQkJCXByb3BhZ2F0ZVByb3BlcnR5KGZQYXJlbnQsIGtleSwgZlN0b3JlKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUeXBlRGVzY3JpcHRvciB7Ci0JCXByaXZhdGUgVHlwZURlc2NyaXB0b3IoKSB7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIEJPT0xFQU4gPSBuZXcgVHlwZURlc2NyaXB0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIERPVUJMRSA9IG5ldyBUeXBlRGVzY3JpcHRvcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZURlc2NyaXB0b3IgRkxPQVQgPSBuZXcgVHlwZURlc2NyaXB0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIElOVCA9IG5ldyBUeXBlRGVzY3JpcHRvcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZURlc2NyaXB0b3IgTE9ORyA9IG5ldyBUeXBlRGVzY3JpcHRvcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZURlc2NyaXB0b3IgU1RSSU5HID0gbmV3IFR5cGVEZXNjcmlwdG9yKCk7Ci0JcHJpdmF0ZSBib29sZWFuIGZMb2FkZWQ7Ci0JcHJpdmF0ZSBPdmVybGF5S2V5W10gZk92ZXJsYXlLZXlzOwotCi0KLQlJUHJlZmVyZW5jZVN0b3JlIGZQYXJlbnQ7Ci0KLQlwcml2YXRlIFByb3BlcnR5TGlzdGVuZXIgZlByb3BlcnR5TGlzdGVuZXI7Ci0JSVByZWZlcmVuY2VTdG9yZSBmU3RvcmU7Ci0KLQotCXB1YmxpYyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlKElQcmVmZXJlbmNlU3RvcmUgcGFyZW50LCBPdmVybGF5S2V5W10gb3ZlcmxheUtleXMpIHsKLQkJZlBhcmVudCA9IHBhcmVudDsKLQkJZk92ZXJsYXlLZXlzID0gb3ZlcmxheUtleXM7Ci0JCWZTdG9yZSA9IG5ldyBQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUga2V5cyB0byBhZGQgdG8gdGhlIGxpc3Qgb2Ygb3ZlcmxheSBrZXlzLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB7QGxpbmsgI2xvYWQoKX1pcyBjYWxsZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBrZXlzCi0JICogQHBsYW5uZWRmb3IgMy4wCi0JICovCi0JcHVibGljIHZvaWQgYWRkS2V5cyhPdmVybGF5S2V5W10ga2V5cykgewotCQlBc3NlcnQuaXNUcnVlKCFmTG9hZGVkKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChrZXlzKTsKLQotCQlpbnQgb3ZlcmxheUtleXNMZW5ndGggPSBmT3ZlcmxheUtleXMubGVuZ3RoOwotCQlPdmVybGF5S2V5W10gcmVzdWx0ID0gbmV3IE92ZXJsYXlLZXlba2V5cy5sZW5ndGggKyBvdmVybGF5S2V5c0xlbmd0aF07Ci0KLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG92ZXJsYXlLZXlzTGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQlyZXN1bHRbaV0gPSBmT3ZlcmxheUtleXNbaV07Ci0KLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQlyZXN1bHRbb3ZlcmxheUtleXNMZW5ndGggKyBpXSA9IGtleXNbaV07Ci0KLQkJZk92ZXJsYXlLZXlzID0gcmVzdWx0OwotCi0JCWlmIChmTG9hZGVkKQotCQkJbG9hZCgpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjY29udGFpbnMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuY29udGFpbnMobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvdmVycyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoZmluZE92ZXJsYXlLZXkoa2V5KSAhPSBudWxsKTsKLQl9Ci0KLQlPdmVybGF5S2V5IGZpbmRPdmVybGF5S2V5KFN0cmluZyBrZXkpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmT3ZlcmxheUtleXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmT3ZlcmxheUtleXNbaV0uZktleS5lcXVhbHMoa2V5KSkKLQkJCQlyZXR1cm4gZk92ZXJsYXlLZXlzW2ldOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2ZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZywgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoU3RyaW5nIG5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWZTdG9yZS5maXJlUHJvcGVydHlDaGFuZ2VFdmVudChuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldEJvb2xlYW4oU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXRCb29sZWFuKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHRCb29sZWFuKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0Qm9vbGVhbihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHRCb29sZWFuKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHREb3VibGUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBkb3VibGUgZ2V0RGVmYXVsdERvdWJsZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHREb3VibGUobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RGVmYXVsdEZsb2F0KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0RGVmYXVsdEZsb2F0KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0RGVmYXVsdEZsb2F0KG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHRJbnQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdEludChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHRJbnQobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RGVmYXVsdExvbmcoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBsb25nIGdldERlZmF1bHRMb25nKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0RGVmYXVsdExvbmcobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RGVmYXVsdFN0cmluZyhTdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U3RyaW5nKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0RGVmYXVsdFN0cmluZyhuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXREb3VibGUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0RG91YmxlKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldEZsb2F0KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXRGbG9hdChuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXRJbnQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0SW50KG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldExvbmcoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBsb25nIGdldExvbmcoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXRMb25nKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldFN0cmluZyhTdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXRTdHJpbmcobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjaXNEZWZhdWx0KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5pc0RlZmF1bHQobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZCgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmT3ZlcmxheUtleXMubGVuZ3RoOyBpKyspCi0JCQlsb2FkUHJvcGVydHkoZlBhcmVudCwgZk92ZXJsYXlLZXlzW2ldLCBmU3RvcmUsIHRydWUpOwotCi0JCWZMb2FkZWQgPSB0cnVlOwotCi0JfQotCi0JcHVibGljIHZvaWQgbG9hZERlZmF1bHRzKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZPdmVybGF5S2V5cy5sZW5ndGg7IGkrKykKLQkJCXNldFRvRGVmYXVsdChmT3ZlcmxheUtleXNbaV0uZktleSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcm9wZXJ0eShJUHJlZmVyZW5jZVN0b3JlIG9yZ2luLCBPdmVybGF5S2V5IGtleSwgSVByZWZlcmVuY2VTdG9yZSB0YXJnZXQsIGJvb2xlYW4gZm9yY2VJbml0aWFsaXphdGlvbikgewotCQlUeXBlRGVzY3JpcHRvciBkID0ga2V5LmZEZXNjcmlwdG9yOwotCQlpZiAoQk9PTEVBTiA9PSBkKSB7Ci0KLQkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgdHJ1ZSk7Ci0JCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yZ2luLmdldEJvb2xlYW4oa2V5LmZLZXkpKTsKLQkJCXRhcmdldC5zZXREZWZhdWx0KGtleS5mS2V5LCBvcmdpbi5nZXREZWZhdWx0Qm9vbGVhbihrZXkuZktleSkpOwotCi0JCX0gZWxzZSBpZiAoRE9VQkxFID09IGQpIHsKLQotCQkJaWYgKGZvcmNlSW5pdGlhbGl6YXRpb24pCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCAxLjBEKTsKLQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JnaW4uZ2V0RG91YmxlKGtleS5mS2V5KSk7Ci0JCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdERvdWJsZShrZXkuZktleSkpOwotCi0JCX0gZWxzZSBpZiAoRkxPQVQgPT0gZCkgewotCi0JCQlpZiAoZm9yY2VJbml0aWFsaXphdGlvbikKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIDEuMEYpOwotCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmdpbi5nZXRGbG9hdChrZXkuZktleSkpOwotCQkJdGFyZ2V0LnNldERlZmF1bHQoa2V5LmZLZXksIG9yZ2luLmdldERlZmF1bHRGbG9hdChrZXkuZktleSkpOwotCi0JCX0gZWxzZSBpZiAoSU5UID09IGQpIHsKLQotCQkJaWYgKGZvcmNlSW5pdGlhbGl6YXRpb24pCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCAxKTsKLQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JnaW4uZ2V0SW50KGtleS5mS2V5KSk7Ci0JCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdEludChrZXkuZktleSkpOwotCi0JCX0gZWxzZSBpZiAoTE9ORyA9PSBkKSB7Ci0KLQkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgMUwpOwotCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmdpbi5nZXRMb25nKGtleS5mS2V5KSk7Ci0JCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdExvbmcoa2V5LmZLZXkpKTsKLQotCQl9IGVsc2UgaWYgKFNUUklORyA9PSBkKSB7Ci0KLQkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgIjEiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmdpbi5nZXRTdHJpbmcoa2V5LmZLZXkpKTsKLQkJCXRhcmdldC5zZXREZWZhdWx0KGtleS5mS2V5LCBvcmdpbi5nZXREZWZhdWx0U3RyaW5nKGtleS5mS2V5KSk7Ci0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI25lZWRzU2F2aW5nKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuZWVkc1NhdmluZygpIHsKLQkJcmV0dXJuIGZTdG9yZS5uZWVkc1NhdmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BhZ2F0ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmT3ZlcmxheUtleXMubGVuZ3RoOyBpKyspCi0JCQlwcm9wYWdhdGVQcm9wZXJ0eShmU3RvcmUsIGZPdmVybGF5S2V5c1tpXSwgZlBhcmVudCk7Ci0JfQotCi0Jdm9pZCBwcm9wYWdhdGVQcm9wZXJ0eShJUHJlZmVyZW5jZVN0b3JlIG9yZ2luLCBPdmVybGF5S2V5IGtleSwgSVByZWZlcmVuY2VTdG9yZSB0YXJnZXQpIHsKLQotCQlpZiAob3JnaW4uaXNEZWZhdWx0KGtleS5mS2V5KSkgewotCQkJaWYgKCF0YXJnZXQuaXNEZWZhdWx0KGtleS5mS2V5KSkKLQkJCQl0YXJnZXQuc2V0VG9EZWZhdWx0KGtleS5mS2V5KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVR5cGVEZXNjcmlwdG9yIGQgPSBrZXkuZkRlc2NyaXB0b3I7Ci0JCWlmIChCT09MRUFOID09IGQpIHsKLQotCQkJYm9vbGVhbiBvcmlnaW5WYWx1ZSA9IG9yZ2luLmdldEJvb2xlYW4oa2V5LmZLZXkpOwotCQkJYm9vbGVhbiB0YXJnZXRWYWx1ZSA9IHRhcmdldC5nZXRCb29sZWFuKGtleS5mS2V5KTsKLQkJCWlmICh0YXJnZXRWYWx1ZSAhPSBvcmlnaW5WYWx1ZSkKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yaWdpblZhbHVlKTsKLQotCQl9IGVsc2UgaWYgKERPVUJMRSA9PSBkKSB7Ci0KLQkJCWRvdWJsZSBvcmlnaW5WYWx1ZSA9IG9yZ2luLmdldERvdWJsZShrZXkuZktleSk7Ci0JCQlkb3VibGUgdGFyZ2V0VmFsdWUgPSB0YXJnZXQuZ2V0RG91YmxlKGtleS5mS2V5KTsKLQkJCWlmICh0YXJnZXRWYWx1ZSAhPSBvcmlnaW5WYWx1ZSkKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yaWdpblZhbHVlKTsKLQotCQl9IGVsc2UgaWYgKEZMT0FUID09IGQpIHsKLQotCQkJZmxvYXQgb3JpZ2luVmFsdWUgPSBvcmdpbi5nZXRGbG9hdChrZXkuZktleSk7Ci0JCQlmbG9hdCB0YXJnZXRWYWx1ZSA9IHRhcmdldC5nZXRGbG9hdChrZXkuZktleSk7Ci0JCQlpZiAodGFyZ2V0VmFsdWUgIT0gb3JpZ2luVmFsdWUpCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7Ci0KLQkJfSBlbHNlIGlmIChJTlQgPT0gZCkgewotCi0JCQlpbnQgb3JpZ2luVmFsdWUgPSBvcmdpbi5nZXRJbnQoa2V5LmZLZXkpOwotCQkJaW50IHRhcmdldFZhbHVlID0gdGFyZ2V0LmdldEludChrZXkuZktleSk7Ci0JCQlpZiAodGFyZ2V0VmFsdWUgIT0gb3JpZ2luVmFsdWUpCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7Ci0KLQkJfSBlbHNlIGlmIChMT05HID09IGQpIHsKLQotCQkJbG9uZyBvcmlnaW5WYWx1ZSA9IG9yZ2luLmdldExvbmcoa2V5LmZLZXkpOwotCQkJbG9uZyB0YXJnZXRWYWx1ZSA9IHRhcmdldC5nZXRMb25nKGtleS5mS2V5KTsKLQkJCWlmICh0YXJnZXRWYWx1ZSAhPSBvcmlnaW5WYWx1ZSkKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yaWdpblZhbHVlKTsKLQotCQl9IGVsc2UgaWYgKFNUUklORyA9PSBkKSB7Ci0KLQkJCVN0cmluZyBvcmlnaW5WYWx1ZSA9IG9yZ2luLmdldFN0cmluZyhrZXkuZktleSk7Ci0JCQlTdHJpbmcgdGFyZ2V0VmFsdWUgPSB0YXJnZXQuZ2V0U3RyaW5nKGtleS5mS2V5KTsKLQkJCWlmICh0YXJnZXRWYWx1ZSAhPSBudWxsICYmIG9yaWdpblZhbHVlICE9IG51bGwgJiYgIXRhcmdldFZhbHVlLmVxdWFscyhvcmlnaW5WYWx1ZSkpCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7Ci0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3B1dFZhbHVlKFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dFZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5wdXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZTdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXREZWZhdWx0KFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChTdHJpbmcsIGRvdWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXREZWZhdWx0KFN0cmluZywgZmxvYXQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXREZWZhdWx0KFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldERlZmF1bHQoU3RyaW5nLCBsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXREZWZhdWx0KFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFRvRGVmYXVsdChTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9EZWZhdWx0KFN0cmluZyBuYW1lKSB7Ci0JCWZTdG9yZS5zZXRUb0RlZmF1bHQobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKFN0cmluZywgZG91YmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoU3RyaW5nLCBmbG9hdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXRWYWx1ZShTdHJpbmcsIGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoU3RyaW5nLCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJaWYgKGZQcm9wZXJ0eUxpc3RlbmVyID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0eUxpc3RlbmVyID0gbmV3IFByb3BlcnR5TGlzdGVuZXIoKTsKLQkJCWZQYXJlbnQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJvcGVydHlMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQlpZiAoZlByb3BlcnR5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJZlBhcmVudC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcm9wZXJ0eUxpc3RlbmVyKTsKLQkJCWZQcm9wZXJ0eUxpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9UYWJGb2xkZXJMYXlvdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9UYWJGb2xkZXJMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiODkwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvVGFiRm9sZGVyTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLQotLyoqCi0gKiBDb3BpZWQgZnJvbSBKRFQKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIFRhYkZvbGRlckxheW91dCBleHRlbmRzIExheW91dCB7Ci0KLQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQgJiYgaEhpbnQgIT0gU1dULkRFRkFVTFQpCi0JCQlyZXR1cm4gbmV3IFBvaW50KHdIaW50LCBoSGludCk7Ci0KLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCWludCBjb3VudCA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJaW50IG1heFdpZHRoID0gMCwgbWF4SGVpZ2h0ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQlQb2ludCBwdCA9IGNoaWxkLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2hDYWNoZSk7Ci0JCQltYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBwdC54KTsKLQkJCW1heEhlaWdodCA9IE1hdGgubWF4KG1heEhlaWdodCwgcHQueSk7Ci0JCX0KLQotCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpCi0JCQltYXhXaWR0aCA9IHdIaW50OwotCQlpZiAoaEhpbnQgIT0gU1dULkRFRkFVTFQpCi0JCQltYXhIZWlnaHQgPSBoSGludDsKLQotCQlyZXR1cm4gbmV3IFBvaW50KG1heFdpZHRoLCBtYXhIZWlnaHQpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlSZWN0YW5nbGUgcmVjdCA9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0KLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWNoaWxkcmVuW2ldLnNldEJvdW5kcyhyZWN0KTsKLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0Q29sb3JQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RDb2xvclBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRlM2IwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RDb2xvclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb2xvclBhZ2UgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlwcm90ZWN0ZWQgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBmT3ZlcmxheVN0b3JlOwotCXByb3RlY3RlZCBTdHlsZWRUZXh0Q29sb3JQaWNrZXIgZlBpY2tlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb2xvcmluZyBncm91cCB1c2VkIGluIGNyZWF0ZUNvbnRlbnRzIFRoaXMgbWV0aG9kIGNhbiBiZQotCSAqIG92ZXJ3cml0dGVuIHRvIHNldCB0aGUgdGV4dCBvZiB0aGUgZ3JvdXAgb3IgcHJvdmlkZSBhbiBpbmZvcG9wCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVDb2xvcmluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb2xvcmluZ0NvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCQlyZXR1cm4gY29sb3JpbmdDb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjb21wb3NpdGUgY29udHJvbCBhbmQgc2V0cyB0aGUgZGVmYXVsdCBsYXlvdXQgZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvL0dyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy9HcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgc2Nyb2xsYmFycyBmb3IgdGhpcyBwcmVmZXJlbmNlIHBhZ2Ugd2hlbiBuZWVkZWQKLQkJZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJc2MxLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlDb21wb3NpdGUgcGFnZUNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvc2l0ZShzYzEsIDEpOwotCQlzYzEuc2V0Q29udGVudChwYWdlQ29tcG9uZW50KTsKLQkJc2V0U2l6ZShwYWdlQ29tcG9uZW50KTsKLQotCQlMYWJlbCBkZXNjTGFiZWwgPSBjcmVhdGVEZXNjcmlwdGlvbkxhYmVsKHBhZ2VDb21wb25lbnQsIFNTRVVJTWVzc2FnZXMuQWJzdHJhY3RDb2xvclBhZ2VEZXNjcmlwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcG9zaXRlIGNvbG9yaW5nQ29tcG9zaXRlID0gY3JlYXRlQ29sb3JpbmdDb21wb3NpdGUocGFnZUNvbXBvbmVudCk7Ci0JCWNyZWF0ZUNvbnRlbnRzRm9yUGlja2VyKGNvbG9yaW5nQ29tcG9zaXRlKTsKLQotCQlHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSkgZGVzY0xhYmVsLmdldExheW91dERhdGEoKTsKLQkJZ2Qud2lkdGhIaW50ID0gKGNvbG9yaW5nQ29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpLng7Ci0JCXNldFNpemUocGFnZUNvbXBvbmVudCk7Ci0JCXJldHVybiBwYWdlQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFN0eWxlZFRleHRDb2xvclBpY2tlciB1c2VkIGluIGNyZWF0ZUNvbnRlbnRzIFRoaXMgbWV0aG9kCi0JICogY2FuIGJlIG92ZXJ3cml0dGVuIHRvIHNldCB1cCBTdHlsZWRUZXh0Q29sb3JQaWNrZXIgZGlmZmVyZW50bHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0ZvclBpY2tlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSB0aGUgY29sb3IgcGlja2VyCi0JCWZQaWNrZXIgPSBuZXcgU3R5bGVkVGV4dENvbG9yUGlja2VyKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWZQaWNrZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlmUGlja2VyLnNldFByZWZlcmVuY2VTdG9yZShmT3ZlcmxheVN0b3JlKTsKLQkJc2V0dXBQaWNrZXIoZlBpY2tlcik7Ci0KLQkJZlBpY2tlci5zZXRUZXh0KGdldFNhbXBsZVRleHQoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGRlc2NyaXB0aW9uIGxhYmVsIGRpc3BsYXllZCBhdCB0b3Agb2YgcHJlZmVyZW5jZSBwYWdlLiBUaGlzCi0JICogbWV0aG9kL2xhYmVsIGlzIHVzZWQgaW5zdGVhZCBvZiBQcmVmZXJlbmNlUGFnZSdzIGRlc2NyaXB0aW9uIGxhYmVsCi0JICogYmVjYXVzZSB0aGUgU2Nyb2xsZWRDb21wb3NpdGUgY29udGFpbmVkIGluIHRoaXMgcGFnZSB3aWxsIG5vdCBmdWxseQotCSAqIHdvcmsgKGhvcml6b250YWwgc2Nyb2xsaW5nKSB3aXRoIFByZWZlcmVuY2VQYWdlJ3MgZGVzY3JpcHRpb24gbGFiZWwuCi0JICovCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZURlc2NyaXB0aW9uTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQgfCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQoZGVzY3JpcHRpb24pOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjb21wb3NpdGUgY29udHJvbCBhbmQgc2V0cyB0aGUgZGVmYXVsdCBsYXlvdXQgZGF0YS4KLQkgKi8KLQotCXByb3RlY3RlZCBHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvL0dyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIGxhYmVsIGluc3RhbmNlIGFuZCBzZXRzIHRoZSBkZWZhdWx0Ci0JICogbGF5b3V0IGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJvdGVjdGVkIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGNyZWF0ZU92ZXJsYXlTdG9yZUtleXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgdGV4dCBpbnN0YW5jZSBhbmQgc2V0cyB0aGUgZGVmYXVsdCBsYXlvdXQKLQkgKiBkYXRhLgotCSAqLwotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlUZXh0IHRleHRmaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkxFRlQpOwotCQl0ZXh0ZmllbGQuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJdGV4dGZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiB0ZXh0ZmllbGQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAoZlBpY2tlciAhPSBudWxsICYmICFmUGlja2VyLmlzRGlzcG9zZWQoKSkKLQkJCWZQaWNrZXIucmVsZWFzZVBpY2tlclJlc291cmNlcygpOwotCQlpZiAoZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQlmT3ZlcmxheVN0b3JlLnN0b3AoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHlsZWRUZXh0Q29sb3JQaWNrZXIgZ2V0UGlja2VyKCkgewotCQlyZXR1cm4gZlBpY2tlcjsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFNhbXBsZVRleHQoKTsKLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgcHJlZmVyZW5jZSBwYWdlIGZvciB0aGUgZ2l2ZW4gd29ya2JlbmNoLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGFzIHRoZSBwcmVmZXJlbmNlIHBhZ2UgaXMgYmVpbmcKLQkgKiBjcmVhdGVkIGFuZCBpbml0aWFsaXplZC4gQ2xpZW50cyBtdXN0IG5vdCBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gd29ya2JlbmNoCi0JICogICAgICAgICAgICB0aGUgd29ya2JlbmNoCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQlmT3ZlcmxheVN0b3JlID0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUoZ2V0UHJlZmVyZW5jZVN0b3JlKCksIGNyZWF0ZU92ZXJsYXlTdG9yZUtleXMoKSk7Ci0JCWZPdmVybGF5U3RvcmUubG9hZCgpOwotCQlmT3ZlcmxheVN0b3JlLnN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyB1c2luZyBkZWZhdWx0IHZhbHVlcyBpbiB0aGUKLQkgKiBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJZk92ZXJsYXlTdG9yZS5sb2FkRGVmYXVsdHMoKTsKLQkJZlBpY2tlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlmT3ZlcmxheVN0b3JlLnByb3BhZ2F0ZSgpOwotCQkgc2F2ZVByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7Ci0JCS8vIHNhdmUgcGx1Z2luIHByZWZlcmVuY2VzIGhlcmUKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaXplIG9mIGNvbXBvc2l0ZSB0byB0aGUgZGVmYXVsdCB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpZiAoY29tcG9zaXRlICE9IG51bGwpIHsKLQkJCS8vIE5vdGU6IFRoZSBmb250IGlzIHNldCBoZXJlIGluIGFudGljaXBhdGlvbiB0aGF0IHRoZSBjbGFzcyBpbmhlcml0aW5nCi0JCQkvLyAgICAgICB0aGlzIGJhc2UgY2xhc3MgbWF5IGFkZCB3aWRnZXRzIHRvIHRoZSBkaWFsb2cuICAgc2V0U2l6ZQotCQkJLy8gICAgICAgaXMgYXNzdW1lZCB0byBiZSBjYWxsZWQganVzdCBiZWZvcmUgd2UgZ28gbGl2ZS4KLQkJCWFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQkJUG9pbnQgbWluU2l6ZSA9IGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJY29tcG9zaXRlLnNldFNpemUobWluU2l6ZSk7Ci0JCQkvLyBzZXQgc2Nyb2xsYmFyIGNvbXBvc2l0ZSdzIG1pbiBzaXplIHNvIHBhZ2UgaXMgZXhwYW5kYWJsZSBidXQKLQkJCS8vIGhhcyBzY3JvbGxiYXJzIHdoZW4gbmVlZGVkCi0JCQlpZiAoY29tcG9zaXRlLmdldFBhcmVudCgpIGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpIHsKLQkJCQlTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSAoU2Nyb2xsZWRDb21wb3NpdGUpIGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLQkJCQlzYzEuc2V0TWluU2l6ZShtaW5TaXplKTsKLQkJCQlzYzEuc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQkJCQlzYzEuc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXR1cFBpY2tlcihTdHlsZWRUZXh0Q29sb3JQaWNrZXIgcGlja2VyKTsKLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCWJvb2xlYW4gZG9TaHJpbmsgPSBmYWxzZTsKLQkJLy8gbGltaXRlciwgZm9yIHRoZSByZWFsbHkgaHVnZSBmb250cwotCQlpZiAodmlzaWJsZSkgewotCQkJZ2V0UGlja2VyKCkucmVmcmVzaCgpOwotCQkJaW50IHggPSBNYXRoLm1pbihnZXRDb250cm9sKCkuZ2V0U2hlbGwoKS5nZXRTaXplKCkueCwgZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5nZXRDbGllbnRBcmVhKCkud2lkdGggKiA5IC8gMTApOwotCQkJaW50IHkgPSBNYXRoLm1pbihnZXRDb250cm9sKCkuZ2V0U2hlbGwoKS5nZXRTaXplKCkueSwgZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5nZXRDbGllbnRBcmVhKCkuaGVpZ2h0ICogOSAvIDEwKTsKLQkJCWJvb2xlYW4gc2hyaW5rV2lkdGggPSAoeCAhPSBnZXRDb250cm9sKCkuZ2V0U2hlbGwoKS5nZXRTaXplKCkueCk7Ci0JCQlib29sZWFuIHNocmlua0hlaWdodCA9ICh5ICE9IGdldENvbnRyb2woKS5nZXRTaGVsbCgpLmdldFNpemUoKS55KTsKLQkJCWRvU2hyaW5rID0gc2hyaW5rV2lkdGggfHwgc2hyaW5rSGVpZ2h0OwotCQkJaWYgKGRvU2hyaW5rKSB7Ci0JCQkJLy8gbW9kaWZ5IGp1c3QgdGhlIGhlaWdodAotCQkJCWlmIChzaHJpbmtIZWlnaHQgJiYgIXNocmlua1dpZHRoKQotCQkJCQlnZXRTaGVsbCgpLnNldEJvdW5kcyhnZXRTaGVsbCgpLmdldExvY2F0aW9uKCkueCwgMCwgZ2V0U2hlbGwoKS5nZXRTaXplKCkueCwgZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5nZXRDbGllbnRBcmVhKCkuaGVpZ2h0KTsKLQkJCQkvLyBtb2RpZnkganVzdCB0aGUgd2lkdGgKLQkJCQllbHNlIGlmICghc2hyaW5rSGVpZ2h0ICYmIHNocmlua1dpZHRoKQotCQkJCQlnZXRTaGVsbCgpLnNldEJvdW5kcygwLCBnZXRTaGVsbCgpLmdldExvY2F0aW9uKCkueSwgZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5nZXRDbGllbnRBcmVhKCkud2lkdGgsIGdldFNoZWxsKCkuZ2V0U2l6ZSgpLnkpOwotCQkJCS8vIGNoYW5nZSB0aGUgZW50aXJlIHNoZWxsIHNpemUgdG8gb25seSBmaWxsIHRoZSBkaXNwbGF5LCBhbmQKLQkJCQkvLyBtb3ZlIGl0IHRvIHRoZSBvcmlnaW4KLQkJCQllbHNlCi0JCQkJCWdldFNoZWxsKCkuc2V0Qm91bmRzKDAsIDAsIGdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuZ2V0Q2xpZW50QXJlYSgpLndpZHRoLCBnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmdldENsaWVudEFyZWEoKS5oZWlnaHQpOwotCQkJfQotCQl9Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmIChkb1NocmluaykgewotCQkJZ2V0Q29udHJvbCgpLmdldFNoZWxsKCkucmVkcmF3KCk7Ci0JCQlnZXRDb250cm9sKCkuZ2V0U2hlbGwoKS51cGRhdGUoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdFByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTY5YzE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLS8qKgotICogKHBhKSB3aHkgaXMgdGhpcyBjbGFzcyBhYnN0cmFjdCBpZiB0aGVyZSBhcmUgbm8gYWJzdHJhY3QgbWV0aG9kcz8KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyLCBTZWxlY3Rpb25MaXN0ZW5lciwgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IFdJRFRIX1ZBTElEQVRJT05fTE9XRVJfTElNSVQgPSAwOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgV0lEVEhfVkFMSURBVElPTl9VUFBFUl9MSU1JVCA9IDk5OTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVDaGVja0JveChDb21wb3NpdGUgZ3JvdXAsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0KLQkJLy9HcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q2hlY2tib3goQnV0dG9uIGJveCwgU3RyaW5nIGtleSkgewotCQlpZihib3ggIT0gbnVsbCAmJiBrZXkgIT0gbnVsbCkgewotCQkJYm94LnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKGtleSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVmYXVsdENoZWNrYm94KEJ1dHRvbiBib3gsIFN0cmluZyBrZXkpIHsKLQkJaWYoYm94ICE9IG51bGwgJiYga2V5ICE9IG51bGwpIHsKLQkJCWJveC5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0RGVmYXVsdEJvb2xlYW4oa2V5KSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvL0dyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZVNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZURyb3BEb3duQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tYm8gY29tYm9Cb3ggPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0KLQkJLy9HcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWNvbWJvQm94LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbWJvQm94OwotCX0KLQotCXByb3RlY3RlZCBHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvL0dyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgZ3JvdXAsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVNjcm9sbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIHNjcm9sbGJhcnMgZm9yIHRoaXMgcGFyZW50IHdoZW4gbmVlZGVkCi0JCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjMSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXNjMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZShzYzEsIDEpOwotCQlzYzEuc2V0Q29udGVudChjb21wb3NpdGUpOwotCi0JCS8vIG5vdCBjYWxsaW5nIHNldFNpemUgZm9yIGNvbXBvc2l0ZSB3aWxsIHJlc3VsdCBpbiBhIGJsYW5rIGNvbXBvc2l0ZSwKLQkJLy8gc28gY2FsbGluZyBpdCBoZXJlIGluaXRpYWxseQotCQkvLyBzZXRTaXplIGFjdHVhbGx5IG5lZWRzIHRvIGJlIGNhbGxlZCBhZnRlciBhbGwgY29udHJvbHMgYXJlIGNyZWF0ZWQsCi0JCS8vIHNvIHNjcm9sbGVkQ29tcG9zaXRlCi0JCS8vIGhhcyBjb3JyZWN0IG1pblNpemUKLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVTZXBhcmF0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtblNwYW4pIHsKLQkJLy8gQ3JlYXRlIGEgc3BhY2VyIGxpbmUKLQkJTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5TcGFuOwotCi0JCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gc2VwYXJhdG9yOwotCX0KLQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlVmFsdWVzKCkgewotCX0KLQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsb2FkUHJlZmVyZW5jZXMoKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpbml0aWFsaXplVmFsdWVzKCk7Ci0JCQkJdmFsaWRhdGVWYWx1ZXMoKTsKLQkJCQllbmFibGVWYWx1ZXMoKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkvLyBJZiB3ZSBhcmUgY2FsbGVkIHRvbyBlYXJseSwgaS5lLiBiZWZvcmUgdGhlIGNvbnRyb2xzIGFyZSBjcmVhdGVkCi0JCS8vIHRoZW4gcmV0dXJuCi0JCS8vIHRvIGF2b2lkIG51bGwgcG9pbnRlciBleGNlcHRpb25zCi0JCWlmIChlLndpZGdldCAhPSBudWxsICYmIGUud2lkZ2V0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQotCQl2YWxpZGF0ZVZhbHVlcygpOwotCQllbmFibGVWYWx1ZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc2F2ZVByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNhdmVQcmVmZXJlbmNlcygpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXN0b3JlVmFsdWVzKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnZhbGlkSW5wdXRNZXNzYWdlKFN0cmluZyB3aWR0aFRleHQpIHsKLQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuXzRjb25jYXQsIChuZXcgT2JqZWN0W117d2lkdGhUZXh0fSkpOwotCQlzZXRFcnJvck1lc3NhZ2UobXNnKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaWYgKGNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQkvLyBOb3RlOiBUaGUgZm9udCBpcyBzZXQgaGVyZSBpbiBhbnRpY2lwYXRpb24gdGhhdCB0aGUgY2xhc3MgaW5oZXJpdGluZwotCQkJLy8gICAgICAgdGhpcyBiYXNlIGNsYXNzIG1heSBhZGQgd2lkZ2V0cyB0byB0aGUgZGlhbG9nLiAgIHNldFNpemUKLQkJCS8vICAgICAgIGlzIGFzc3VtZWQgdG8gYmUgY2FsbGVkIGp1c3QgYmVmb3JlIHdlIGdvIGxpdmUuCi0JCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCVBvaW50IG1pblNpemUgPSBjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCWNvbXBvc2l0ZS5zZXRTaXplKG1pblNpemUpOwotCQkJLy8gc2V0IHNjcm9sbGJhciBjb21wb3NpdGUncyBtaW4gc2l6ZSBzbyBwYWdlIGlzIGV4cGFuZGFibGUgYnV0Ci0JCQkvLyBoYXMgc2Nyb2xsYmFycyB3aGVuIG5lZWRlZAotCQkJaWYgKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFNjcm9sbGVkQ29tcG9zaXRlKSB7Ci0JCQkJU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gKFNjcm9sbGVkQ29tcG9zaXRlKSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0JCQkJc2MxLnNldE1pblNpemUobWluU2l6ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCVNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVZhbHVlcygpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQl3aWRnZXRTZWxlY3RlZChlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCS8vIElmIHdlIGFyZSBjYWxsZWQgdG9vIGVhcmx5LCBpLmUuIGJlZm9yZSB0aGUgY29udHJvbHMgYXJlIGNyZWF0ZWQKLQkJLy8gdGhlbiByZXR1cm4KLQkJLy8gdG8gYXZvaWQgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbnMKLQkJaWYgKGUud2lkZ2V0ICE9IG51bGwgJiYgZS53aWRnZXQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCXZhbGlkYXRlVmFsdWVzKCk7Ci0JCWVuYWJsZVZhbHVlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdFByZWZlcmVuY2VUYWIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdFByZWZlcmVuY2VUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFmMThhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RQcmVmZXJlbmNlVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIEdlbmVyaWMgcHJlZmVyZW5jZSB0YWIgcGFnZSB0aGF0IGNvbnRhaW5zIGhlbHBmdWwgbWV0aG9kcwotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBYnN0cmFjdFByZWZlcmVuY2VUYWIgaW1wbGVtZW50cyBJUHJlZmVyZW5jZVRhYiB7Ci0KLQlNYXAgZkNoZWNrQm94ZXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZkNoZWNrQm94TGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZS53aWRnZXQ7Ci0JCQlmT3ZlcmxheVN0b3JlLnNldFZhbHVlKChTdHJpbmcpIGZDaGVja0JveGVzLmdldChidXR0b24pLCBidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfTsKLQlwcml2YXRlIFByZWZlcmVuY2VQYWdlIGZNYWluUHJlZmVyZW5jZVBhZ2U7Ci0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBmTnVtYmVyRmllbGRMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQludW1iZXJGaWVsZENoYW5nZWQoKFRleHQpIGUud2lkZ2V0KTsKLQkJfQotCX07Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZk51bWJlckZpZWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlPdmVybGF5UHJlZmVyZW5jZVN0b3JlIGZPdmVybGF5U3RvcmU7Ci0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBmVGV4dEZpZWxkTGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGUud2lkZ2V0OwotCQkJZk92ZXJsYXlTdG9yZS5zZXRWYWx1ZSgoU3RyaW5nKSBmVGV4dEZpZWxkcy5nZXQodGV4dCksIHRleHQuZ2V0VGV4dCgpKTsKLQkJfQotCX07Ci0JTWFwIGZUZXh0RmllbGRzID0gbmV3IEhhc2hNYXAoKTsKLQotCXByb3RlY3RlZCBCdXR0b24gYWRkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcga2V5LCBpbnQgaW5kZW50YXRpb24pIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQobGFiZWwpOwotCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IGluZGVudGF0aW9uOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWNoZWNrQm94LnNldExheW91dERhdGEoZ2QpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihmQ2hlY2tCb3hMaXN0ZW5lcik7Ci0KLQkJZkNoZWNrQm94ZXMucHV0KGNoZWNrQm94LCBrZXkpOwotCi0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHNpemUgMjogLSBmaXJzdCBlbGVtZW50IGlzIG9mIHR5cGUKLQkgKiA8Y29kZT5MYWJlbDwvY29kZT4tIHNlY29uZCBlbGVtZW50IGlzIG9mIHR5cGUgPGNvZGU+VGV4dDwvY29kZT4KLQkgKiBVc2UgPGNvZGU+Z2V0TGFiZWxDb250cm9sPC9jb2RlPiBhbmQgPGNvZGU+Z2V0VGV4dENvbnRyb2w8L2NvZGU+IHRvCi0JICogZ2V0IHRoZSAyIGNvbnRyb2xzLgotCSAqLwotCXByaXZhdGUgQ29udHJvbFtdIGFkZExhYmVsbGVkVGV4dEZpZWxkKENvbXBvc2l0ZSBjb21wb3NpdGUsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGtleSwgaW50IHRleHRMaW1pdCwgaW50IGluZGVudGF0aW9uLCBib29sZWFuIGlzTnVtYmVyKSB7Ci0JCUxhYmVsIGxhYmVsQ29udHJvbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWxDb250cm9sLnNldFRleHQobGFiZWwpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWdkLmhvcml6b250YWxJbmRlbnQgPSBpbmRlbnRhdGlvbjsKLQkJbGFiZWxDb250cm9sLnNldExheW91dERhdGEoZ2QpOwotCi0JCVRleHQgdGV4dENvbnRyb2wgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlnZC53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHModGV4dENvbnRyb2wsIHRleHRMaW1pdCArIDEpOwotCQl0ZXh0Q29udHJvbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGV4dENvbnRyb2wuc2V0VGV4dExpbWl0KHRleHRMaW1pdCk7Ci0JCWZUZXh0RmllbGRzLnB1dCh0ZXh0Q29udHJvbCwga2V5KTsKLQkJaWYgKGlzTnVtYmVyKSB7Ci0JCQlmTnVtYmVyRmllbGRzLmFkZCh0ZXh0Q29udHJvbCk7Ci0JCQl0ZXh0Q29udHJvbC5hZGRNb2RpZnlMaXN0ZW5lcihmTnVtYmVyRmllbGRMaXN0ZW5lcik7Ci0JCX0gZWxzZSB7Ci0JCQl0ZXh0Q29udHJvbC5hZGRNb2RpZnlMaXN0ZW5lcihmVGV4dEZpZWxkTGlzdGVuZXIpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBDb250cm9sW117bGFiZWxDb250cm9sLCB0ZXh0Q29udHJvbH07Ci0JfQotCi0JcHJvdGVjdGVkIFRleHQgYWRkVGV4dEZpZWxkKENvbXBvc2l0ZSBjb21wb3NpdGUsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGtleSwgaW50IHRleHRMaW1pdCwgaW50IGluZGVudGF0aW9uLCBib29sZWFuIGlzTnVtYmVyKSB7Ci0JCXJldHVybiBnZXRUZXh0Q29udHJvbChhZGRMYWJlbGxlZFRleHRGaWVsZChjb21wb3NpdGUsIGxhYmVsLCBrZXksIHRleHRMaW1pdCwgaW5kZW50YXRpb24sIGlzTnVtYmVyKSk7Ci0JfQotCi0JLyoqCi0JICogQXBwbGllcyB0aGUgc3RhdHVzIHRvIHRoZSBzdGF0dXMgbGluZSBvZiBhIGRpYWxvZyBwYWdlLgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBseVRvU3RhdHVzTGluZShJU3RhdHVzIHN0YXR1cykgewotCQlTdHJpbmcgbWVzc2FnZSA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCXN3aXRjaCAoc3RhdHVzLmdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgSVN0YXR1cy5PSyA6Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRNZXNzYWdlKG1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElTdGF0dXMuV0FSTklORyA6Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRNZXNzYWdlKG1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElTdGF0dXMuSU5GTyA6Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRNZXNzYWdlKG1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuSU5GT1JNQVRJT04pOwotCQkJCWZNYWluUHJlZmVyZW5jZVBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKG1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkgewotCQkJCQltZXNzYWdlID0gbnVsbDsKLQkJCQl9Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRNZXNzYWdlKG51bGwpOwotCQkJCWZNYWluUHJlZmVyZW5jZVBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBpeGVscyBjb3JyZXNwb25kaW5nIHRvIHRoZSB3aWR0aCBvZiB0aGUgZ2l2ZW4KLQkgKiBudW1iZXIgb2YgY2hhcmFjdGVycy4gVGhpcyBtZXRob2Qgd2FzIGNvcGllZCBmcm9tCi0JICogb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIGEKLQkgKiAgICAgICAgICAgIGNvbnRyb2wgaW4gdGhlIHBhZ2UKLQkgKiBAcGFyYW0gY2hhcnMKLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycwotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwaXhlbHMKLQkgKi8KLQlwcml2YXRlIGludCBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoQ29udHJvbCB0ZXN0Q29udHJvbCwgaW50IGNoYXJzKSB7Ci0JCS8vIENvbXB1dGUgYW5kIHN0b3JlIGEgZm9udCBtZXRyaWMKLQkJR0MgZ2MgPSBuZXcgR0ModGVzdENvbnRyb2wpOwotCQlnYy5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCUZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCi0JCS8vIHRlc3QgZm9yIGZhaWx1cmUgdG8gaW5pdGlhbGl6ZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotCQlpZiAoZm9udE1ldHJpY3MgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gRGlhbG9nLmNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhmb250TWV0cmljcywgY2hhcnMpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZk1haW5QcmVmZXJlbmNlUGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZVBhZ2UgZ2V0TWFpblByZWZlcmVuY2VQYWdlKCkgewotCQlyZXR1cm4gZk1haW5QcmVmZXJlbmNlUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZPdmVybGF5U3RvcmUuCi0JICovCi0JcHJvdGVjdGVkIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZ2V0T3ZlcmxheVN0b3JlKCkgewotCQlyZXR1cm4gZk92ZXJsYXlTdG9yZTsKLQl9Ci0KLQlwcml2YXRlIFRleHQgZ2V0VGV4dENvbnRyb2woQ29udHJvbFtdIGxhYmVsbGVkVGV4dEZpZWxkKSB7Ci0JCXJldHVybiAoVGV4dCkgbGFiZWxsZWRUZXh0RmllbGRbMV07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZpZWxkcygpIHsKLQkJSXRlcmF0b3IgZSA9IGZDaGVja0JveGVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBmQ2hlY2tCb3hlcy5nZXQoYik7Ci0JCQliLnNldFNlbGVjdGlvbihmT3ZlcmxheVN0b3JlLmdldEJvb2xlYW4oa2V5KSk7Ci0JCX0KLQotCQllID0gZlRleHRGaWVsZHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlUZXh0IHQgPSAoVGV4dCkgZS5uZXh0KCk7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZlRleHRGaWVsZHMuZ2V0KHQpOwotCQkJdC5zZXRUZXh0KGZPdmVybGF5U3RvcmUuZ2V0U3RyaW5nKGtleSkpOwotCQl9Ci0JfQotCi0Jdm9pZCBudW1iZXJGaWVsZENoYW5nZWQoVGV4dCB0ZXh0Q29udHJvbCkgewotCQlTdHJpbmcgbnVtYmVyID0gdGV4dENvbnRyb2wuZ2V0VGV4dCgpOwotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlUG9zaXRpdmVOdW1iZXIobnVtYmVyKTsKLQkJaWYgKCFzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkKLQkJCWZPdmVybGF5U3RvcmUuc2V0VmFsdWUoKFN0cmluZykgZlRleHRGaWVsZHMuZ2V0KHRleHRDb250cm9sKSwgbnVtYmVyKTsKLQkJdXBkYXRlU3RhdHVzKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1haW5QcmVmZXJlbmNlUGFnZQotCSAqICAgICAgICAgICAgVGhlIGZNYWluUHJlZmVyZW5jZVBhZ2UgdG8gc2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1haW5QcmVmZXJlbmNlUGFnZShQcmVmZXJlbmNlUGFnZSBtYWluUHJlZmVyZW5jZVBhZ2UpIHsKLQkJZk1haW5QcmVmZXJlbmNlUGFnZSA9IG1haW5QcmVmZXJlbmNlUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb3ZlcmxheVN0b3JlCi0JICogICAgICAgICAgICBUaGUgZk92ZXJsYXlTdG9yZSB0byBzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3ZlcmxheVN0b3JlKE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgb3ZlcmxheVN0b3JlKSB7Ci0JCWZPdmVybGF5U3RvcmUgPSBvdmVybGF5U3RvcmU7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHN0YXR1cyBvZiBtYWluIHByZWZlcmVuY2UgcGFnZQotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKCFzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmTnVtYmVyRmllbGRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGZOdW1iZXJGaWVsZHMuZ2V0KGkpOwotCQkJCUlTdGF0dXMgcyA9IHZhbGlkYXRlUG9zaXRpdmVOdW1iZXIodGV4dC5nZXRUZXh0KCkpOwotCQkJCXN0YXR1cyA9IHMuZ2V0U2V2ZXJpdHkoKSA+IHN0YXR1cy5nZXRTZXZlcml0eSgpID8gcyA6IHN0YXR1czsKLQkJCX0KLQkJfQotCi0JCWZNYWluUHJlZmVyZW5jZVBhZ2Uuc2V0VmFsaWQoIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKTsKLQkJYXBwbHlUb1N0YXR1c0xpbmUoc3RhdHVzKTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVQb3NpdGl2ZU51bWJlcihTdHJpbmcgbnVtYmVyKSB7Ci0JCVN0YXR1c0luZm8gc3RhdHVzID0gbmV3IFN0YXR1c0luZm8oKTsKLQkJaWYgKG51bWJlci5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzdGF0dXMuc2V0RXJyb3IoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM3KTsKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaW50IHZhbHVlID0gSW50ZWdlci5wYXJzZUludChudW1iZXIpOwotCQkJCWlmICh2YWx1ZSA8IDApCi0JCQkJCXN0YXR1cy5zZXRFcnJvcihudW1iZXIgKyBTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQlzdGF0dXMuc2V0RXJyb3IobnVtYmVyICsgU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM4KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9Db2xvckVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NvbG9yRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMWQxNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NvbG9yRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29sb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBICJidXR0b24iIG9mIGEgY2VydGFpbiBjb2xvciBkZXRlcm1pbmVkIGJ5IHRoZSBjb2xvciBwaWNrZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2xvckVkaXRvciB7Ci0JQnV0dG9uIGZCdXR0b247Ci0JQ29sb3IgZkNvbG9yOwotCVJHQiBmQ29sb3JWYWx1ZTsKLQotCXByaXZhdGUgUG9pbnQgZkV4dGVudDsKLQlJbWFnZSBmSW1hZ2U7Ci0KLQlwdWJsaWMgQ29sb3JFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCWZCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlmRXh0ZW50ID0gY29tcHV0ZUltYWdlU2l6ZShwYXJlbnQpOwotCQlmSW1hZ2UgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgZkV4dGVudC54LCBmRXh0ZW50LnkpOwotCi0JCUdDIGdjID0gbmV3IEdDKGZJbWFnZSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZkJ1dHRvbi5nZXRCYWNrZ3JvdW5kKCkpOwotCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIGZFeHRlbnQueCwgZkV4dGVudC55KTsKLQkJZ2MuZGlzcG9zZSgpOwotCi0JCWZCdXR0b24uc2V0SW1hZ2UoZkltYWdlKTsKLQotCQkvLyBidWcyNTQxIC0gYXNzb2NpYXRlIGNvbG9yIHZhbHVlIHRvIGJ1dHRvbidzIHZhbHVlIGZpZWxkCi0JCWZCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIobmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlcigpIHsKLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIjZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKSB7Ci0JCQkJCWlmIChnZXRDb2xvclZhbHVlKCkgIT0gbnVsbCkKLQkJCQkJCWUucmVzdWx0ID0gZ2V0Q29sb3JWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWUucmVzdWx0ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbG9yRGlhbG9nIGNvbG9yRGlhbG9nID0gbmV3IENvbG9yRGlhbG9nKGZCdXR0b24uZ2V0U2hlbGwoKSk7Ci0JCQkJY29sb3JEaWFsb2cuc2V0UkdCKGZDb2xvclZhbHVlKTsKLQkJCQlSR0IgbmV3Q29sb3IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKG5ld0NvbG9yICE9IG51bGwpIHsKLQkJCQkJZkNvbG9yVmFsdWUgPSBuZXdDb2xvcjsKLQkJCQkJdXBkYXRlQ29sb3JJbWFnZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJ1dHRvbi5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCWlmIChmSW1hZ2UgIT0gbnVsbCkgewotCQkJCQlmSW1hZ2UuZGlzcG9zZSgpOwotCQkJCQlmSW1hZ2UgPSBudWxsOwotCQkJCX0KLQkJCQlpZiAoZkNvbG9yICE9IG51bGwpIHsKLQkJCQkJZkNvbG9yLmRpc3Bvc2UoKTsKLQkJCQkJZkNvbG9yID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCBQb2ludCBjb21wdXRlSW1hZ2VTaXplKENvbnRyb2wgd2luZG93KSB7Ci0JCUdDIGdjID0gbmV3IEdDKHdpbmRvdyk7Ci0JCUZvbnQgZiA9IEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldChKRmFjZVJlc291cmNlcy5ERUZBVUxUX0ZPTlQpOwotCQlnYy5zZXRGb250KGYpOwotCQlpbnQgaGVpZ2h0ID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlQb2ludCBwID0gbmV3IFBvaW50KGhlaWdodCAqIDMgLSA2LCBoZWlnaHQpOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwdWJsaWMgQnV0dG9uIGdldEJ1dHRvbigpIHsKLQkJcmV0dXJuIGZCdXR0b247Ci0JfQotCi0JcHVibGljIFJHQiBnZXRDb2xvclZhbHVlKCkgewotCQlyZXR1cm4gZkNvbG9yVmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sb3JWYWx1ZShSR0IgcmdiKSB7Ci0JCWZDb2xvclZhbHVlID0gcmdiOwotCQl1cGRhdGVDb2xvckltYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29sb3JJbWFnZSgpIHsKLQotCQlEaXNwbGF5IGRpc3BsYXkgPSBmQnV0dG9uLmdldERpc3BsYXkoKTsKLQotCQlHQyBnYyA9IG5ldyBHQyhmSW1hZ2UpOwotCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JCWdjLmRyYXdSZWN0YW5nbGUoMCwgMiwgZkV4dGVudC54IC0gMSwgZkV4dGVudC55IC0gNCk7Ci0KLQkJaWYgKGZDb2xvciAhPSBudWxsKQotCQkJZkNvbG9yLmRpc3Bvc2UoKTsKLQotCQlmQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgZkNvbG9yVmFsdWUpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGZDb2xvcik7Ci0JCWdjLmZpbGxSZWN0YW5nbGUoMSwgMywgZkV4dGVudC54IC0gMiwgZkV4dGVudC55IC0gNSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQotCQlmQnV0dG9uLnNldEltYWdlKGZJbWFnZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NvbG9ySGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ29sb3JIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0ZGE3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ29sb3JIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi1wdWJsaWMgY2xhc3MgQ29sb3JIZWxwZXIgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEJBQ0tHUk9VTkQgPSAiYmFja2dyb3VuZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEJPTEQgPSAiYm9sZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPUkVHUk9VTkQgPSAiZm9yZWdyb3VuZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BTUUgPSAibmFtZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTVFlMRV9TRVBBUkFUT1IgPSAifCI7IC8vJE5PTi1OTFMtMSQgCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE5VTEwgPSAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiBhbiBSR0IgU3RyaW5nIGdpdmVuIHRoZSBpbnQgciwgZywgYiB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb2xvclN0cmluZyhpbnQgciwgaW50IGcsIGludCBiKSB7Ci0JCXJldHVybiAiIyIgKyBnZXRIZXhTdHJpbmcociwgMikgKyBnZXRIZXhTdHJpbmcoZywgMikgKyBnZXRIZXhTdHJpbmcoYiwgMik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRIZXhTdHJpbmcoaW50IHZhbHVlLCBpbnQgbWluV2lkdGgpIHsKLQkJU3RyaW5nIGhleFN0cmluZyA9IEludGVnZXIudG9IZXhTdHJpbmcodmFsdWUpOwotCQlmb3IgKGludCBpID0gaGV4U3RyaW5nLmxlbmd0aCgpOyBpIDwgbWluV2lkdGg7IGkrKykgewotCQkJaGV4U3RyaW5nID0gIjAiICsgaGV4U3RyaW5nOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gaGV4U3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyBhIHByZWZlcmVuY2Ugc3RyaW5nIHRvIGJlIHBsYWNlZCBpbiBwcmVmZXJlbmNlcyBmcm9tIHRoZQotCSAqIGdpdmVuIFN0cmluZyBhcnJheS4KLQkgKiAKLQkgKiBAcGFyYW0gc3R5bGVQcmVmcwotCSAqICAgICAgICAgICAgYXNzdW1lcyBub3QgbnVsbCBhbmQgc2hvdWxkIGJlIGluIHRoZSBmb3JtIG9mIFN0cmluZ1swXSA9Ci0JICogICAgICAgICAgICBGb3JlZ3JvdW5kIFJHQiBTdHJpbmcsIFN0cmluZ1sxXSA9IEJhY2tncm91bmQgUkdCIFN0cmluZywKLQkgKiAgICAgICAgICAgIFN0cmluZ1syXSA9IEJvbGQgdHJ1ZS9mYWxzZQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIGluIHRoZSBmb3JtIG9mIEZvcmVncm91bmQgUkdCIFN0cmluZyB8IEJhY2tncm91bmQgUkdCCi0JICogICAgICAgICBTdHJpbmcgfCBCb2xkIHRydWUvZmFsc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWNrU3R5bGVQcmVmZXJlbmNlcyhTdHJpbmdbXSBzdHlsZVByZWZzKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHlsZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0eWxlUHJlZnMubGVuZ3RoOyArK2kpIHsKLQkJCVN0cmluZyBzID0gc3R5bGVQcmVmc1tpXTsKLQkJCWlmIChpIDwgMikgewotCQkJCWlmIChzICE9IG51bGwpIHsKLQkJCQkJc3R5bGVTdHJpbmcuYXBwZW5kKHMpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3R5bGVTdHJpbmcuYXBwZW5kKE5VTEwpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0eWxlU3RyaW5nLmFwcGVuZChCb29sZWFuLnZhbHVlT2YocykpOwotCQkJfQotCi0JCQkvLyBhZGQgaW4gdGhlIHNlcGFyYXRvciAoZXhjZXB0IG9uIGxhc3QgaXRlcmF0aW9uKQotCQkJaWYgKGkgPCBzdHlsZVByZWZzLmxlbmd0aCAtIDEpIHsKLQkJCQlzdHlsZVN0cmluZy5hcHBlbmQoIiAiICsgU1RZTEVfU0VQQVJBVE9SICsgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3R5bGVTdHJpbmcudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IKLQkgKiBAcGFyYW0gYW5SR0JTdHJpbmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJHQiB0b1JHQihTdHJpbmcgYW5SR0JTdHJpbmcpIHsKLQkJUkdCIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChhblJHQlN0cmluZy5sZW5ndGgoKSA+IDYgJiYgYW5SR0JTdHJpbmcuY2hhckF0KDApID09ICcjJykgewotCQkJaW50IHIgPSAwOwotCQkJaW50IGcgPSAwOwotCQkJaW50IGIgPSAwOwotCQkJdHJ5IHsKLQkJCQlyID0gSW50ZWdlci52YWx1ZU9mKGFuUkdCU3RyaW5nLnN1YnN0cmluZygxLCAzKSwgMTYpLmludFZhbHVlKCk7Ci0JCQkJZyA9IEludGVnZXIudmFsdWVPZihhblJHQlN0cmluZy5zdWJzdHJpbmcoMywgNSksIDE2KS5pbnRWYWx1ZSgpOwotCQkJCWIgPSBJbnRlZ2VyLnZhbHVlT2YoYW5SR0JTdHJpbmcuc3Vic3RyaW5nKDUsIDcpLCAxNikuaW50VmFsdWUoKTsKLQkJCQlyZXN1bHQgPSBuZXcgUkdCKHIsIGcsIGIpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mRXhjKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQ291bGQgbm90IGxvYWQgaGlnaGxpZ2h0aW5nIHByZWZlcmVuY2UgZm9yIGNvbG9yICIgKyBhblJHQlN0cmluZywgbmZFeGMpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBhblJHQgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvUkdCU3RyaW5nKFJHQiBhblJHQikgewotCQlpZiAoYW5SR0IgPT0gbnVsbCkKLQkJCXJldHVybiAiIzAwMDAwMCI7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVkID0gSW50ZWdlci50b0hleFN0cmluZyhhblJHQi5yZWQpOwotCQl3aGlsZSAocmVkLmxlbmd0aCgpIDwgMikKLQkJCXJlZCA9ICIwIiArIHJlZDsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBncmVlbiA9IEludGVnZXIudG9IZXhTdHJpbmcoYW5SR0IuZ3JlZW4pOwotCQl3aGlsZSAoZ3JlZW4ubGVuZ3RoKCkgPCAyKQotCQkJZ3JlZW4gPSAiMCIgKyBncmVlbjsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBibHVlID0gSW50ZWdlci50b0hleFN0cmluZyhhblJHQi5ibHVlKTsKLQkJd2hpbGUgKGJsdWUubGVuZ3RoKCkgPCAyKQotCQkJYmx1ZSA9ICIwIiArIGJsdWU7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gIiMiICsgcmVkICsgZ3JlZW4gKyBibHVlOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyB0aGUgZm9yZWdyb3VuZCAoUkdCIFN0cmluZyksIGJhY2tncm91bmQgKFJHQiBTdHJpbmcpLCBib2xkCi0JICogKGJvb2xlYW4gU3RyaW5nKSBmcm9tIHRoZSBnaXZlbiBwcmVmZXJlbmNlIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlZmVyZW5jZQotCSAqICAgICAgICAgICAgc2hvdWxkIGJlIGluIHRoZSBmb3JtIG9mIEZvcmVncm91bmQgUkdCIFN0cmluZyB8IEJhY2tncm91bmQKLQkgKiAgICAgICAgICAgIFJHQiBTdHJpbmcgfCBCb2xkIHRydWUvZmFsc2UgfCBJdGFsaWMgdHJ1ZS9mYWxzZSB8IFN0cmlrZXRocm91Z2ggdHJ1ZS9mYWxzZSB8IFVuZGVybGluZSB0cnVlL2ZhbHNlCi0JICogQHJldHVybiBTdHJpbmdbXSB3aGVyZSBTdHJpbmdbMF0gPSBGb3JlZ3JvdW5kIFJHQiBTdHJpbmcsIFN0cmluZ1sxXSA9Ci0JICogICAgICAgICBCYWNrZ3JvdW5kIFJHQiBTdHJpbmcsIFN0cmluZ1syXSA9IEJvbGQgdHJ1ZS9mYWxzZSwgMyA9IEl0YWxpYwotCSAqICAgICAgICAgdHJ1ZS9mYWxzZSwgNCA9IFN0cmlrZXRocm91Z2ggdHJ1ZS9mYWxzZSwgNSA9IFVuZGVybGluZQotCSAqICAgICAgICAgdHJ1ZS9mYWxzZTsgaW5kZXhlcyAyLTQgbWF5IGJlIG51bGwgaWYgd2UgcmFuIGludG8gcHJvYmxlbXMKLQkgKiAgICAgICAgIGV4dHJhY3RpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHVucGFja1N0eWxlUHJlZmVyZW5jZXMoU3RyaW5nIHByZWZlcmVuY2UpIHsKLQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IG5ldyBTdHJpbmdbNl07Ci0JCWlmIChwcmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJlZmVyZW5jZSwgU1RZTEVfU0VQQVJBVE9SKTsKLQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgZm9yZWdyb3VuZCA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlzdHlsZVByZWZzWzBdID0gZm9yZWdyb3VuZDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0eWxlUHJlZnNbMF0gPSBOVUxMOwotCQkJfQotCQkJaWYgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBiYWNrZ3JvdW5kID0gc3QubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCXN0eWxlUHJlZnNbMV0gPSBiYWNrZ3JvdW5kOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3R5bGVQcmVmc1sxXSA9IE5VTEw7Ci0JCQl9Ci0KLQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgYm9sZCA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlzdHlsZVByZWZzWzJdID0gQm9vbGVhbi52YWx1ZU9mKGJvbGQpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdHlsZVByZWZzWzJdID0gQm9vbGVhbi5GQUxTRS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBpdGFsaWMgPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJc3R5bGVQcmVmc1szXSA9IEJvb2xlYW4udmFsdWVPZihpdGFsaWMpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdHlsZVByZWZzWzNdID0gQm9vbGVhbi5GQUxTRS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBzdHJpa2V0aHJvdWdoID0gc3QubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCXN0eWxlUHJlZnNbNF0gPSBCb29sZWFuLnZhbHVlT2Yoc3RyaWtldGhyb3VnaCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0eWxlUHJlZnNbNF0gPSBCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIHVuZGVybGluZSA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlzdHlsZVByZWZzWzVdID0gQm9vbGVhbi52YWx1ZU9mKHVuZGVybGluZSkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0eWxlUHJlZnNbNV0gPSBCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3R5bGVQcmVmczsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gbG9va3VwIHRoZSBSR0IgdmFsdWUgZm9yIDxjb2RlPmtleTwvY29kZT4gZnJvbSB0aGUgY29sb3IKLQkgKiByZWdpc3RyeS4gSWYgb25lIGlzIG5vdCBmb3VuZCwgdGhlIDxjb2RlPmRlZmF1bHRSR0I8L2NvZGU+IGlzIHVzZWQuCi0JICogQHBhcmFtIHJlZ2lzdHJ5IFRoZSBDb2xvclJlZ2lzdHJ5IHRvIHNlYXJjaCBmb3IgdGhlIFJHQiB2YWx1ZQotCSAqIEBwYXJhbSBrZXkgVGhlIGtleSB0aGF0IHRoZSBSR0IgdmFsdWUgaXMgc3RvcmVkIHVuZGVyIGluIHRoZSByZWdpc3RyeQotCSAqIEBwYXJhbSBkZWZhdWx0UkdCIFRoZSBkZWZhdWx0IFJHQiB2YWx1ZSB0byByZXR1cm4gaW4gdGhlIGFic2VuY2Ugb2Ygb25lCi0JICogZnJvbSB0aGUgY29sb3IgcmVnaXN0cnkKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBSR0IgdmFsdWUgZnJvbSB0aGUgY29sb3IgcmVnaXN0cnkgZm9yIGEgZ2l2ZW4ga2V5LCBpZiBpdCBleGlzdHMuCi0JICogT3RoZXJ3aXNlLCByZXR1cm4gdGhlIGRlZmF1bHQgUkdCIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUkdCIGZpbmRSR0IoQ29sb3JSZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIGtleSwgUkdCIGRlZmF1bHRSR0IpIHsKLQkJaWYocmVnaXN0cnkuaGFzVmFsdWVGb3Ioa2V5KSkKLQkJCXJldHVybiByZWdpc3RyeS5nZXRSR0Ioa2V5KTsKLQkJcmV0dXJuIGRlZmF1bHRSR0I7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHRzIHRvIGZpbmQgdGhlIFJHQiBzdHJpbmcgZm9yIDxjb2RlPmtleTwvY29kZT4gZnJvbSB0aGUgY29sb3IgcmVnaXN0cnkuCi0JICogSWYgb25lIGlzIG5vdCBmb3VuZCwgYW4gUkdCIHN0cmluZyBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGFyYW1ldGVycyA8Y29kZT5yLGcsYjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHJlZ2lzdHJ5IFRoZSBDb2xvclJlZ2lzdHJ5IHRvIHNlYXJjaCBmb3IgdGhlIFJHQiB2YWx1ZQotCSAqIEBwYXJhbSBrZXkgVGhlIGtleSB0aGF0IHRoZSBSR0IgdmFsdWUgaXMgc3RvcmVkIHVuZGVyIGluIHRoZSByZWdpc3RyeQotCSAqIEBwYXJhbSByIFRoZSBkZWZhdWx0IHJlZCB2YWx1ZQotCSAqIEBwYXJhbSBnIFRoZSBkZWZhdWx0IGdyZWVuIHZhbHVlCi0JICogQHBhcmFtIGIgVGhlIGRlZmF1bHQgYmx1ZSB2YWx1ZQotCSAqIAotCSAqIEByZXR1cm4gVGhlIFN0cmluZyBSR0IgdmFsdWUgZnJvbSB0aGUgY29sb3IgcmVnaXN0cnkgZm9yIGEgZ2l2ZW4ga2V5LCBpZiBpdCBleGlzdHMuCi0JICogT3RoZXJ3aXNlLCByZXR1cm4gdGhlIHN0cmluZyBSR0IgdmFsdWUgY3JlYXRlZCBmcm9tIHRoZSBkZWZhdWx0IHIsZyxiIHBhcmFtZXRlcnMuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmluZFJHQlN0cmluZyhDb2xvclJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcga2V5LCBpbnQgciwgaW50IGcsIGludCBiKSB7Ci0JCWlmKHJlZ2lzdHJ5Lmhhc1ZhbHVlRm9yKGtleSkpCi0JCQlyZXR1cm4gdG9SR0JTdHJpbmcocmVnaXN0cnkuZ2V0UkdCKGtleSkpOwotCQlyZXR1cm4gZ2V0Q29sb3JTdHJpbmcociwgZywgYik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NvbG9yTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9Db2xvck5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMGM5OTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NvbG9yTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDb2xvck5hbWVzIHsKLQlTdHJpbmcgQkFDS0dST1VORCA9ICJiYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBCT0xEID0gImJvbGQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTE9SID0gImNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIENPTE9SUyA9ICJjb2xvcnMiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZPUkVHUk9VTkQgPSAiZm9yZWdyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSVRBTElDID0gIml0YWxpYyI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBOQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTM2ZTlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQpOwotCi0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IFNTRVVJTWVzc2FnZXMuRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2VfMDsgLy8kTk9OLU5MUy0xJAotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQkvLyBzb21lIHRoZW1lcyBvbiBHVEsgaGF2ZSBkaWZmZXJlbnQgYmFja2dyb3VuZCBjb2xvcnMgZm9yIFRleHQgYW5kIExhYmVscwotCQl0ZXh0LnNldEJhY2tncm91bmQoY29tcG9zaXRlLmdldEJhY2tncm91bmQoKSk7Ci0JCXRleHQuc2V0VGV4dChkZXNjcmlwdGlvbik7Ci0KLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZVNjcm9sbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIHNjcm9sbGJhcnMgZm9yIHRoaXMgcGFyZW50IHdoZW4gbmVlZGVkCi0JCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjMSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXNjMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZShzYzEsIDEpOwotCQlzYzEuc2V0Q29udGVudChjb21wb3NpdGUpOwotCi0JCS8vIG5vdCBjYWxsaW5nIHNldFNpemUgZm9yIGNvbXBvc2l0ZSB3aWxsIHJlc3VsdCBpbiBhIGJsYW5rIGNvbXBvc2l0ZSwKLQkJLy8gc28gY2FsbGluZyBpdCBoZXJlIGluaXRpYWxseQotCQkvLyBzZXRTaXplIGFjdHVhbGx5IG5lZWRzIHRvIGJlIGNhbGxlZCBhZnRlciBhbGwgY29udHJvbHMgYXJlIGNyZWF0ZWQsCi0JCS8vIHNvIHNjcm9sbGVkQ29tcG9zaXRlCi0JCS8vIGhhcyBjb3JyZWN0IG1pblNpemUKLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2l6ZShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWlmIChjb21wb3NpdGUgIT0gbnVsbCkgewotCQkJLy8gTm90ZTogVGhlIGZvbnQgaXMgc2V0IGhlcmUgaW4gYW50aWNpcGF0aW9uIHRoYXQgdGhlIGNsYXNzIGluaGVyaXRpbmcKLQkJCS8vICAgICAgIHRoaXMgYmFzZSBjbGFzcyBtYXkgYWRkIHdpZGdldHMgdG8gdGhlIGRpYWxvZy4gICBzZXRTaXplCi0JCQkvLyAgICAgICBpcyBhc3N1bWVkIHRvIGJlIGNhbGxlZCBqdXN0IGJlZm9yZSB3ZSBnbyBsaXZlLgotCQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCQlQb2ludCBtaW5TaXplID0gY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQljb21wb3NpdGUuc2V0U2l6ZShtaW5TaXplKTsKLQkJCS8vIHNldCBzY3JvbGxiYXIgY29tcG9zaXRlJ3MgbWluIHNpemUgc28gcGFnZSBpcyBleHBhbmRhYmxlIGJ1dAotCQkJLy8gaGFzIHNjcm9sbGJhcnMgd2hlbiBuZWVkZWQKLQkJCWlmIChjb21wb3NpdGUuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBTY3JvbGxlZENvbXBvc2l0ZSkgewotCQkJCVNjcm9sbGVkQ29tcG9zaXRlIHNjMSA9IChTY3JvbGxlZENvbXBvc2l0ZSkgY29tcG9zaXRlLmdldFBhcmVudCgpOwotCQkJCXNjMS5zZXRNaW5TaXplKG1pblNpemUpOwotCQkJCXNjMS5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotCQkJCXNjMS5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9GaWxlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9GaWxlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4NjUzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvRmlsZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuVGFiRm9sZGVyTGF5b3V0OwotCi1wdWJsaWMgY2xhc3MgRmlsZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVRhYltdIGZUYWJzID0gbnVsbDsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTExfVkVSVElDQUw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBTU0VVSU1lc3NhZ2VzLkZpbGVQcmVmZXJlbmNlUGFnZV8wOyAvLyROT04tTkxTLTEkCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgZGVzY3JpcHRpb24pOwotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCVRhYkZvbGRlciBmb2xkZXIgPSBuZXcgVGFiRm9sZGVyKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlmb2xkZXIuc2V0TGF5b3V0KG5ldyBUYWJGb2xkZXJMYXlvdXQoKSk7Ci0JCWZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotLy8JCVRhYkl0ZW0gdGFza0l0ZW0gPSBuZXcgVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLS8vCQlJUHJlZmVyZW5jZVRhYiB0YXNrc1RhYiA9IG5ldyBUYXNrVGFnUHJlZmVyZW5jZVRhYigpOwotLy8JCXRhc2tJdGVtLnNldFRleHQodGFza3NUYWIuZ2V0VGl0bGUoKSk7Ci0vLwkJQ29udHJvbCB0YXNrVGFncyA9IHRhc2tzVGFiLmNyZWF0ZUNvbnRlbnRzKGZvbGRlcik7Ci0vLwkJdGFza0l0ZW0uc2V0Q29udHJvbCh0YXNrVGFncyk7Ci0KLQkJVGFiSXRlbSB0cmFuc2x1Y2VuY2VJdGVtID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCUlQcmVmZXJlbmNlVGFiIHRyYW5zbHVjZW5jZVRhYiA9IG5ldyBUcmFuc2x1Y2VuY3lQcmVmZXJlbmNlVGFiKHRoaXMpOwotCQl0cmFuc2x1Y2VuY2VJdGVtLnNldFRleHQodHJhbnNsdWNlbmNlVGFiLmdldFRpdGxlKCkpOwotCQlDb250cm9sIHRyYW5zbHVjZW5jZUNvbnRyb2wgPSB0cmFuc2x1Y2VuY2VUYWIuY3JlYXRlQ29udGVudHMoZm9sZGVyKTsKLQkJdHJhbnNsdWNlbmNlSXRlbS5zZXRDb250cm9sKHRyYW5zbHVjZW5jZUNvbnRyb2wpOwotCi0JCWZUYWJzID0gbmV3IElQcmVmZXJlbmNlVGFiW117Lyp0YXNrc1RhYiwqLyB0cmFuc2x1Y2VuY2VUYWJ9OwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggZGVza3RvcCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtQXBwbHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLQkJc3VwZXIucGVyZm9ybUFwcGx5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCWZUYWJzW2ldLnBlcmZvcm1BcHBseSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFicy5sZW5ndGg7IGkrKykgewotCQkJZlRhYnNbaV0ucGVyZm9ybURlZmF1bHRzKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIG9rID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCWZUYWJzW2ldLnBlcmZvcm1PaygpOwotCQl9Ci0JCVNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gb2s7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0lQcmVmZXJlbmNlVGFiLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSVByZWZlcmVuY2VUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjYjU2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSVByZWZlcmVuY2VUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByZWZlcmVuY2VUYWIgewotCi0JQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgdGFiRm9sZGVyKTsKLQotCVN0cmluZyBnZXRUaXRsZSgpOwotCi0Jdm9pZCBwZXJmb3JtQXBwbHkoKTsKLQotCXZvaWQgcGVyZm9ybURlZmF1bHRzKCk7Ci0KLQl2b2lkIHBlcmZvcm1PaygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1Njcm9sbGVkUGFnZUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9TY3JvbGxlZFBhZ2VDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZjljNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1Njcm9sbGVkUGFnZUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNoYXJlZFNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBTY3JvbGxlZFBhZ2VDb250ZW50IGV4dGVuZHMgU2hhcmVkU2Nyb2xsZWRDb21wb3NpdGUgewotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCBmVG9vbGtpdDsKLQkKLQlwdWJsaWMgU2Nyb2xsZWRQYWdlQ29udGVudChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMocGFyZW50LCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCX0KLQkKLQlwdWJsaWMgU2Nyb2xsZWRQYWdlQ29udGVudChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCQotCQlzZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotCQlzZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQkJCi0JCWZUb29sa2l0ID0gU1NFVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREaWFsb2dzRm9ybVRvb2xraXQoKTsKLQkJCi0JCUNvbXBvc2l0ZSBib2R5PSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJYm9keS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlzZXRDb250ZW50KGJvZHkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGFwdENoaWxkKENvbnRyb2wgY2hpbGRDb250cm9sKSB7Ci0JCWZUb29sa2l0LmFkYXB0KGNoaWxkQ29udHJvbCwgdHJ1ZSwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBDb21wb3NpdGUgZ2V0Qm9keSgpIHsKLQkJcmV0dXJuIChDb21wb3NpdGUpIGdldENvbnRlbnQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9TdGF0dXNJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvU3RhdHVzSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzgzMTMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9TdGF0dXNJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRWRpdG9yc1VJOwotCi0vKioKLSAqIEEgc2V0dGFibGUgSVN0YXR1cy4gQ2FuIGJlIGFuIGVycm9yLCB3YXJuaW5nLCBpbmZvIG9yIG9rLiBGb3IgZXJyb3IsIGluZm8KLSAqIGFuZCB3YXJuaW5nIHN0YXRlcywgYSBtZXNzYWdlIGRlc2NyaWJlcyB0aGUgcHJvYmxlbS4KLSAqIAotICogVGhpcyBjbGFzcyB3YXMgY29waWVkIGZyb20gb3RoZXIgU3RhdHVzSW5mbyBjbGFzc2VzIHRoYXQgYXJlIGxvY2F0ZWQgaW4KLSAqIGludGVybmFsIHBhY2thZ2VzCi0gKi8KLWNsYXNzIFN0YXR1c0luZm8gaW1wbGVtZW50cyBJU3RhdHVzIHsKLQkvKiogVGhlIHNldmVyaXR5IG9mIHRoaXMgc3RhdHVzLiAqLwotCXByaXZhdGUgaW50IGZTZXZlcml0eTsKLQotCS8qKiBUaGUgbWVzc2FnZSBvZiB0aGlzIHN0YXR1cy4gKi8KLQlwcml2YXRlIFN0cmluZyBmU3RhdHVzTWVzc2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzdGF0dXMgc2V0IHRvIE9LIChubyBtZXNzYWdlKS4KLQkgKi8KLQlwdWJsaWMgU3RhdHVzSW5mbygpIHsKLQkJdGhpcyhPSywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHN0YXR1cyB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSBhbmQgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2V2ZXJpdHkKLQkgKiAgICAgICAgICAgIHRoZSBzZXZlcml0eSBvZiB0aGlzIHN0YXR1czogRVJST1IsIFdBUk5JTkcsIElORk8gYW5kIE9LLgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSBvZiB0aGlzIHN0YXR1cy4gQXBwbGllcyBvbmx5IGZvciBFUlJPUiwgV0FSTklORwotCSAqICAgICAgICAgICAgYW5kIElORk8uCi0JICovCi0JcHVibGljIFN0YXR1c0luZm8oaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlmU3RhdHVzTWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCWZTZXZlcml0eSA9IHNldmVyaXR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWx3YXlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBzZWUgSVN0YXR1cyNnZXRDaGlsZHJlbigpCi0JICovCi0JcHVibGljIElTdGF0dXNbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBJU3RhdHVzWzBdOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWx3YXlzIHRoZSBlcnJvciBzZXZlcml0eS4KLQkgKiAKLQkgKiBAc2VlIElTdGF0dXMjZ2V0Q29kZSgpCi0JICovCi0JcHVibGljIGludCBnZXRDb2RlKCkgewotCQlyZXR1cm4gZlNldmVyaXR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWx3YXlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBzZWUgSVN0YXR1cyNnZXRFeGNlcHRpb24oKQotCSAqLwotCXB1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVN0YXR1cyNnZXRNZXNzYWdlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBmU3RhdHVzTWVzc2FnZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVN0YXR1cyNnZXRQbHVnaW4oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gRWRpdG9yc1VJLlBMVUdJTl9JRDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVN0YXR1cyNnZXRTZXZlcml0eSgpCi0JICovCi0JcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJcmV0dXJuIGZTZXZlcml0eTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzdGF0dXMgaW5kaWNhdGVzIGFuIGVycm9yLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzdGF0dXMgaGFzIHNldmVyaXR5Ci0JICogICAgICAgICB7QGxpbmsgSVN0YXR1cyNFUlJPUn1hbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXJyb3IoKSB7Ci0JCXJldHVybiBmU2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzdGF0dXMgaW5kaWNhdGVzIGFuIGluZm8uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHN0YXR1cyBoYXMgc2V2ZXJpdHkKLQkgKiAgICAgICAgIHtAbGluayBJU3RhdHVzI0lORk99YW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luZm8oKSB7Ci0JCXJldHVybiBmU2V2ZXJpdHkgPT0gSVN0YXR1cy5JTkZPOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWx3YXlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2VlIElTdGF0dXMjaXNNdWx0aVN0YXR1cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNdWx0aVN0YXR1cygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNpc09LKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09LKCkgewotCQlyZXR1cm4gZlNldmVyaXR5ID09IElTdGF0dXMuT0s7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc3RhdHVzIGluZGljYXRlcyBhIHdhcm5pbmcuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHN0YXR1cyBoYXMgc2V2ZXJpdHkKLQkgKiAgICAgICAgIHtAbGluayBJU3RhdHVzI1dBUk5JTkd9YW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dhcm5pbmcoKSB7Ci0JCXJldHVybiBmU2V2ZXJpdHkgPT0gSVN0YXR1cy5XQVJOSU5HOwotCX0KLQotCS8qCi0JICogQHNlZSBJU3RhdHVzI21hdGNoZXMoaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoaW50IHNldmVyaXR5TWFzaykgewotCQlyZXR1cm4gKGZTZXZlcml0eSAmIHNldmVyaXR5TWFzaykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0dXMgdG8gRVJST1IuCi0JICogCi0JICogQHBhcmFtIGVycm9yTWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2Ugd2hpY2ggY2FuIGJlIGFuIGVtcHR5IHN0cmluZywgYnV0IG5vdAotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFcnJvcihTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZXJyb3JNZXNzYWdlKTsKLQkJZlN0YXR1c01lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7Ci0JCWZTZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdHVzIHRvIElORk8uCi0JICogCi0JICogQHBhcmFtIGluZm9NZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgaW5mbyBtZXNzYWdlIHdoaWNoIGNhbiBiZSBhbiBlbXB0eSBzdHJpbmcsIGJ1dCBub3QKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW5mbyhTdHJpbmcgaW5mb01lc3NhZ2UpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpbmZvTWVzc2FnZSk7Ci0JCWZTdGF0dXNNZXNzYWdlID0gaW5mb01lc3NhZ2U7Ci0JCWZTZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0dXMgdG8gT0suCi0JICovCi0JcHVibGljIHZvaWQgc2V0T0soKSB7Ci0JCWZTdGF0dXNNZXNzYWdlID0gbnVsbDsKLQkJZlNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0dXMgdG8gV0FSTklORy4KLQkgKiAKLQkgKiBAcGFyYW0gd2FybmluZ01lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSB3YXJuaW5nIG1lc3NhZ2Ugd2hpY2ggY2FuIGJlIGFuIGVtcHR5IHN0cmluZywgYnV0IG5vdAotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXYXJuaW5nKFN0cmluZyB3YXJuaW5nTWVzc2FnZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKHdhcm5pbmdNZXNzYWdlKTsKLQkJZlN0YXR1c01lc3NhZ2UgPSB3YXJuaW5nTWVzc2FnZTsKLQkJZlNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1N0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOWVlMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1N0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZUxpbmtBcmVhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VzLklXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkVkaXRvclByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5UYWJGb2xkZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLkFic3RyYWN0U3RydWN0dXJlZEZvbGRpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzLkNvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lczsKLQotLyoqCi0gKiBHdXR0ZWQgdmVyc2lvbiBvZiBKYXZhRWRpdG9yUHJlZmVyZW5jZVBhZ2UKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JcHJpdmF0ZSBDb2xvckVkaXRvciBmQXBwZWFyYW5jZUNvbG9yRWRpdG9yOwotCXByaXZhdGUgTGlzdCBmQXBwZWFyYW5jZUNvbG9yTGlzdDsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nW11bXSBmQXBwZWFyYW5jZUNvbG9yTGlzdE1vZGVsID0gbmV3IFN0cmluZ1tdW117e1NTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8yLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuTUFUQ0hJTkdfQlJBQ0tFVFNfQ09MT1J9LCB7U1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzQxLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QUk9QT1NBTFNfQkFDS0dST1VORH0sIHtTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfNDIsIEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BST1BPU0FMU19GT1JFR1JPVU5EfSwge1NTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV80MywgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfUEFSQU1FVEVSU19CQUNLR1JPVU5EfSwge1NTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV80NCwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfUEFSQU1FVEVSU19GT1JFR1JPVU5EfX07IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIE1hcCBmQ2hlY2tCb3hlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBmQ2hlY2tCb3hMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBlLndpZGdldDsKLQkJCWZPdmVybGF5U3RvcmUuc2V0VmFsdWUoKFN0cmluZykgZkNoZWNrQm94ZXMuZ2V0KGJ1dHRvbiksIGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBNYXAgZkNvbG9yQnV0dG9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBmTnVtYmVyRmllbGRzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBmT3ZlcmxheVN0b3JlOwotCS8qKiBCdXR0b24gY29udHJvbGxpbmcgZGVmYXVsdCBzZXR0aW5nIG9mIHRoZSBzZWxlY3RlZCByZWZlcmVuY2UgcHJvdmlkZXIuICovCi0JLy8gVE9ETzogcHJpdmF0ZSBmaWVsZCBuZXZlciByZWFkIGxvY2FsbHkKLQlCdXR0b24gZlNldERlZmF1bHRCdXR0b247Ci0JcHJpdmF0ZSBJUHJlZmVyZW5jZVRhYltdIGZUYWJzID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmVGV4dEZpZWxkcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0RGVzY3JpcHRpb24oU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzYpOyAvLyROT04tTkxTLTEkCi0JCXNldFByZWZlcmVuY2VTdG9yZShTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCi0JCWZPdmVybGF5U3RvcmUgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZShnZXRQcmVmZXJlbmNlU3RvcmUoKSwgY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpKTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBhZGRDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBrZXksIGludCBpbmRlbnRhdGlvbikgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dChsYWJlbCk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gaW5kZW50YXRpb247Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJY2hlY2tCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWNoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGZDaGVja0JveExpc3RlbmVyKTsKLQotCQlmQ2hlY2tCb3hlcy5wdXQoY2hlY2tCb3gsIGtleSk7Ci0KLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCS8qKgotCSAqIEFwcGxpZXMgdGhlIHN0YXR1cyB0byB0aGUgc3RhdHVzIGxpbmUgb2YgYSBkaWFsb2cgcGFnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseVRvU3RhdHVzTGluZShEaWFsb2dQYWdlIHBhZ2UsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJc3dpdGNoIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSkgewotCQkJY2FzZSBJU3RhdHVzLk9LIDoKLQkJCQlwYWdlLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKLQkJCQlwYWdlLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVN0YXR1cy5XQVJOSU5HIDoKLQkJCQlwYWdlLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJCQlwYWdlLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVN0YXR1cy5JTkZPIDoKLQkJCQlwYWdlLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQkJcGFnZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlpZiAobWVzc2FnZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCW1lc3NhZ2UgPSBudWxsOwotCQkJCX0KLQkJCQlwYWdlLnNldE1lc3NhZ2UobnVsbCk7Ci0JCQkJcGFnZS5zZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgY3JlYXRlQXBwZWFyYW5jZVBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgYXBwZWFyYW5jZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlhcHBlYXJhbmNlQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCVN0cmluZyBsYWJlbCA9IFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8yMDsgLy8kTk9OLU5MUy0xJAotCQlhZGRDaGVja0JveChhcHBlYXJhbmNlQ29tcG9zaXRlLCBsYWJlbCwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLk1BVENISU5HX0JSQUNLRVRTLCAwKTsKLQotCQlsYWJlbCA9IFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zMDsgLy8kTk9OLU5MUy0xJAotCQlhZGRDaGVja0JveChhcHBlYXJhbmNlQ29tcG9zaXRlLCBsYWJlbCwgQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkVWQUxVQVRFX1RFTVBPUkFSWV9QUk9CTEVNUywgMCk7Ci0KLQkJUHJlZmVyZW5jZUxpbmtBcmVhIGNvbnRlbnRUeXBlQXJlYSA9IG5ldyBQcmVmZXJlbmNlTGlua0FyZWEoYXBwZWFyYW5jZUNvbXBvc2l0ZSwgU1dULk5PTkUsICJWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UiLCBTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfNDAsIChJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcikgZ2V0Q29udGFpbmVyKCksIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJY29udGVudFR5cGVBcmVhLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWxhYmVsID0gU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM5OwotCQlhZGRDaGVja0JveChhcHBlYXJhbmNlQ29tcG9zaXRlLCBsYWJlbCwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLlNIT1dfVU5LTk9XTl9DT05URU5UX1RZUEVfTVNHLCAwKTsKLQotCQlsYWJlbCA9IFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zOwotCQlhZGRDaGVja0JveChhcHBlYXJhbmNlQ29tcG9zaXRlLCBsYWJlbCwgQWJzdHJhY3RTdHJ1Y3R1cmVkRm9sZGluZ1N0cmF0ZWd5LkZPTERJTkdfRU5BQkxFRCwgMCk7Ci0JCQotCQlsYWJlbCA9IFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8xOwotCQlhZGRDaGVja0JveChhcHBlYXJhbmNlQ29tcG9zaXRlLCBsYWJlbCwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLlNFTUFOVElDX0hJR0hMSUdIVElORywgMCk7Ci0KLQkJTGFiZWwgbCA9IG5ldyBMYWJlbChhcHBlYXJhbmNlQ29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMSkgLyAyOwotCQlsLnNldExheW91dERhdGEoZ2QpOwotCi0JCWwgPSBuZXcgTGFiZWwoYXBwZWFyYW5jZUNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzIzKTsgLy8kTk9OLU5MUy0xJAotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJQ29tcG9zaXRlIGVkaXRvckNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoYXBwZWFyYW5jZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQllZGl0b3JDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWVkaXRvckNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlmQXBwZWFyYW5jZUNvbG9yTGlzdCA9IG5ldyBMaXN0KGVkaXRvckNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg3KTsKLQkJZkFwcGVhcmFuY2VDb2xvckxpc3Quc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJQ29tcG9zaXRlIHN0eWxlc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZWRpdG9yQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXN0eWxlc0NvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc3R5bGVzQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWwgPSBuZXcgTGFiZWwoc3R5bGVzQ29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCS8vIG5lZWRzIHRvIGJlIG1hZGUgZmluYWwgc28gbGFiZWwgY2FuIGJlIHNldCBpbgotCQkvLyBmb3JlZ3JvdW5kY29sb3JidXR0b24ncyBhY2MgbGlzdGVuZXIKLQkJZmluYWwgU3RyaW5nIGJ1dHRvbkxhYmVsID0gU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzI0OyAvLyROT04tTkxTLTEkIAotCQlsLnNldFRleHQoYnV0dG9uTGFiZWwpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlsLnNldExheW91dERhdGEoZ2QpOwotCi0JCWZBcHBlYXJhbmNlQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JFZGl0b3Ioc3R5bGVzQ29tcG9zaXRlKTsKLQkJQnV0dG9uIGZvcmVncm91bmRDb2xvckJ1dHRvbiA9IGZBcHBlYXJhbmNlQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWZvcmVncm91bmRDb2xvckJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlmQXBwZWFyYW5jZUNvbG9yTGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUFwcGVhcmFuY2VDb2xvckxpc3RTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0JCWZvcmVncm91bmRDb2xvckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWludCBpID0gZkFwcGVhcmFuY2VDb2xvckxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlTdHJpbmcga2V5ID0gZkFwcGVhcmFuY2VDb2xvckxpc3RNb2RlbFtpXVsxXTsKLQotCQkJCVByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0VmFsdWUoZk92ZXJsYXlTdG9yZSwga2V5LCBmQXBwZWFyYW5jZUNvbG9yRWRpdG9yLmdldENvbG9yVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGJ1ZzI1NDEgLSBhc3NvY2lhdGUgY29sb3IgbGFiZWwgdG8gYnV0dG9uJ3MgbGFiZWwgZmllbGQKLQkJZm9yZWdyb3VuZENvbG9yQnV0dG9uLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCWlmIChlLmNoaWxkSUQgPT0gQUNDLkNISUxESURfU0VMRikKLQkJCQkJZS5yZXN1bHQgPSBidXR0b25MYWJlbDsKLQkJCX0KLQkJfSk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChhcHBlYXJhbmNlQ29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuUFJFRlNURV9BUFBFQVJBTkNFX0hFTFBJRCk7Ci0JCXJldHVybiBhcHBlYXJhbmNlQ29tcG9zaXRlOwotCX0KLQotCS8qCi0JICogQHNlZSBQcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhDb21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBuZWVkIHRvIGNyZWF0ZSB0YWJzIGJlZm9yZSBsb2FkaW5nL3N0YXJ0aW5nIG92ZXJsYXlzdG9yZSBpbiBjYXNlCi0JCS8vIHRhYnMgYWxzbyBhZGQgdmFsdWVzCi0JCUlQcmVmZXJlbmNlVGFiIGhvdmVyc1RhYiA9IG5ldyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiKHRoaXMsIGZPdmVybGF5U3RvcmUpOwotCi0JCWZPdmVybGF5U3RvcmUubG9hZCgpOwotCQlmT3ZlcmxheVN0b3JlLnN0YXJ0KCk7Ci0KLQkJVGFiRm9sZGVyIGZvbGRlciA9IG5ldyBUYWJGb2xkZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWZvbGRlci5zZXRMYXlvdXQobmV3IFRhYkZvbGRlckxheW91dCgpKTsKLQkJZm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzApOyAvLyROT04tTkxTLTEkCi0JCWl0ZW0uc2V0Q29udHJvbChjcmVhdGVBcHBlYXJhbmNlUGFnZShmb2xkZXIpKTsKLQotCQlpdGVtID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChob3ZlcnNUYWIuZ2V0VGl0bGUoKSk7Ci0JCWl0ZW0uc2V0Q29udHJvbChob3ZlcnNUYWIuY3JlYXRlQ29udGVudHMoZm9sZGVyKSk7Ci0KLQkJZlRhYnMgPSBuZXcgSVByZWZlcmVuY2VUYWJbXXtob3ZlcnNUYWJ9OwotCi0JCWluaXRpYWxpemUoKTsKLQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGZvbGRlcik7Ci0JCXJldHVybiBmb2xkZXI7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscChnZXRDb250cm9sKCksCi0JCS8vIElKYXZhSGVscENvbnRleHRJZHMuSkFWQV9FRElUT1JfUFJFRkVSRU5DRV9QQUdFKTsKLQl9Ci0KLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGNyZWF0ZU92ZXJsYXlTdG9yZUtleXMoKSB7Ci0JCUFycmF5TGlzdCBvdmVybGF5S2V5cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLk1BVENISU5HX0JSQUNLRVRTX0NPTE9SKSk7Ci0JCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuQk9PTEVBTiwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLk1BVENISU5HX0JSQUNLRVRTKSk7Ci0KLQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5CT09MRUFOLCBDb21tb25FZGl0b3JQcmVmZXJlbmNlTmFtZXMuRVZBTFVBVEVfVEVNUE9SQVJZX1BST0JMRU1TKSk7Ci0JCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuQk9PTEVBTiwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLlNIT1dfVU5LTk9XTl9DT05URU5UX1RZUEVfTVNHKSk7Ci0KLQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5CT09MRUFOLCBBYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nU3RyYXRlZ3kuRk9MRElOR19FTkFCTEVEKSk7Ci0JCQotCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLkJPT0xFQU4sIEVkaXRvclByZWZlcmVuY2VOYW1lcy5TRU1BTlRJQ19ISUdITElHSFRJTkcpKTsKLQotCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfUFJPUE9TQUxTX0JBQ0tHUk9VTkQpKTsKLQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BST1BPU0FMU19GT1JFR1JPVU5EKSk7Ci0JCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QQVJBTUVURVJTX0JBQ0tHUk9VTkQpKTsKLQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BBUkFNRVRFUlNfRk9SRUdST1VORCkpOwotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCS8qCi0JICogQHNlZSBEaWFsb2dQYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmT3ZlcmxheVN0b3JlICE9IG51bGwpIHsKLQkJCWZPdmVybGF5U3RvcmUuc3RvcCgpOwotCQkJZk92ZXJsYXlTdG9yZSA9IG51bGw7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUFwcGVhcmFuY2VDb2xvckxpc3RTZWxlY3Rpb24oKSB7Ci0JCWludCBpID0gZkFwcGVhcmFuY2VDb2xvckxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJU3RyaW5nIGtleSA9IGZBcHBlYXJhbmNlQ29sb3JMaXN0TW9kZWxbaV1bMV07Ci0JCVJHQiByZ2IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGZPdmVybGF5U3RvcmUsIGtleSk7Ci0JCWZBcHBlYXJhbmNlQ29sb3JFZGl0b3Iuc2V0Q29sb3JWYWx1ZShyZ2IpOwotCX0KLQotCS8qCi0JICogQHNlZSBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdCgpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWluaXRpYWxpemVGaWVsZHMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZBcHBlYXJhbmNlQ29sb3JMaXN0TW9kZWwubGVuZ3RoOyBpKyspCi0JCQlmQXBwZWFyYW5jZUNvbG9yTGlzdC5hZGQoZkFwcGVhcmFuY2VDb2xvckxpc3RNb2RlbFtpXVswXSk7Ci0JCWZBcHBlYXJhbmNlQ29sb3JMaXN0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChmQXBwZWFyYW5jZUNvbG9yTGlzdCAhPSBudWxsICYmICFmQXBwZWFyYW5jZUNvbG9yTGlzdC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZkFwcGVhcmFuY2VDb2xvckxpc3Quc2VsZWN0KDApOwotCQkJCQloYW5kbGVBcHBlYXJhbmNlQ29sb3JMaXN0U2VsZWN0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZpZWxkcygpIHsKLQkJSXRlcmF0b3IgZSA9IGZDb2xvckJ1dHRvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlDb2xvckVkaXRvciBjID0gKENvbG9yRWRpdG9yKSBlLm5leHQoKTsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBmQ29sb3JCdXR0b25zLmdldChjKTsKLQkJCVJHQiByZ2IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGZPdmVybGF5U3RvcmUsIGtleSk7Ci0JCQljLnNldENvbG9yVmFsdWUocmdiKTsKLQkJfQotCi0JCWUgPSBmQ2hlY2tCb3hlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZkNoZWNrQm94ZXMuZ2V0KGIpOwotCQkJYi5zZXRTZWxlY3Rpb24oZk92ZXJsYXlTdG9yZS5nZXRCb29sZWFuKGtleSkpOwotCQl9Ci0KLQkJZSA9IGZUZXh0RmllbGRzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJVGV4dCB0ID0gKFRleHQpIGUubmV4dCgpOwotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGZUZXh0RmllbGRzLmdldCh0KTsKLQkJCXQuc2V0VGV4dChmT3ZlcmxheVN0b3JlLmdldFN0cmluZyhrZXkpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtQXBwbHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFicy5sZW5ndGg7IGkrKykgewotCQkJZlRhYnNbaV0ucGVyZm9ybUFwcGx5KCk7Ci0JCX0KLQkJc3VwZXIucGVyZm9ybUFwcGx5KCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlmT3ZlcmxheVN0b3JlLmxvYWREZWZhdWx0cygpOwotCi0JCWluaXRpYWxpemVGaWVsZHMoKTsKLQotCQloYW5kbGVBcHBlYXJhbmNlQ29sb3JMaXN0U2VsZWN0aW9uKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFicy5sZW5ndGg7IGkrKykgewotCQkJZlRhYnNbaV0ucGVyZm9ybURlZmF1bHRzKCk7Ci0JCX0KLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQotCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgbm8gbmVlZCBmb3IgYSB2aWV3ZXIKLQkJLy8gZlByZXZpZXdWaWV3ZXIuaW52YWxpZGF0ZVRleHRQcmVzZW50YXRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCWZUYWJzW2ldLnBlcmZvcm1PaygpOwotCQl9Ci0KLQkJZk92ZXJsYXlTdG9yZS5wcm9wYWdhdGUoKTsKLQkJU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCS8vIHRhYiB3aWR0aCBpcyBhbHNvIGEgbW9kZWwtc2lkZSBwcmVmZXJlbmNlIHNvIG5lZWQgdG8gc2V0IGl0Ci0JCS8vIFRPRE8gbmVlZCB0byBoYW5kbGUgdGFiIHdpZHRoIGZvciBmb3JtYXR0ZXIgc29tZWhvdwotCQkvLyBpbnQgdGFiV2lkdGggPQotCQkvLyBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRJbnQoQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfVEFCX1dJRFRIKTsKLQkJLy8gTW9kZWxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVEFCX1dJRFRILAotCQkvLyB0YWJXaWR0aCk7Ci0JCS8vIE1vZGVsUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQl2b2lkIHVwZGF0ZVN0YXR1cyhJU3RhdHVzIHN0YXR1cykgewotCQlpZiAoIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZOdW1iZXJGaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgZk51bWJlckZpZWxkcy5nZXQoaSk7Ci0JCQkJSVN0YXR1cyBzID0gdmFsaWRhdGVQb3NpdGl2ZU51bWJlcih0ZXh0LmdldFRleHQoKSk7Ci0JCQkJc3RhdHVzID0gcy5nZXRTZXZlcml0eSgpID4gc3RhdHVzLmdldFNldmVyaXR5KCkgPyBzIDogc3RhdHVzOwotCQkJfQotCQl9Ci0KLQkJc2V0VmFsaWQoIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKTsKLQkJYXBwbHlUb1N0YXR1c0xpbmUodGhpcywgc3RhdHVzKTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVQb3NpdGl2ZU51bWJlcihTdHJpbmcgbnVtYmVyKSB7Ci0JCVN0YXR1c0luZm8gc3RhdHVzID0gbmV3IFN0YXR1c0luZm8oKTsKLQkJaWYgKG51bWJlci5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzdGF0dXMuc2V0RXJyb3IoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM3KTsKLQkJfQotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaW50IHZhbHVlID0gSW50ZWdlci5wYXJzZUludChudW1iZXIpOwotCQkJCWlmICh2YWx1ZSA8IDApCi0JCQkJCXN0YXR1cy5zZXRFcnJvcihudW1iZXIgKyBTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzgpOwotCQkJfQotCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJc3RhdHVzLnNldEVycm9yKG51bWJlciArIFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zOCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvU3R5bGVkVGV4dENvbG9yUGlja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvU3R5bGVkVGV4dENvbG9yUGlja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWJmMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1N0eWxlZFRleHRDb2xvclBpY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkNvbG9yU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgY29uZmlndXJhYmxlIGJ5IHNldHRpbmcgMyBwcm9wZXJ0aWVzOiAxKSBhbiBhcnJheSBvZiBTdHJpbmdzCi0gKiBhcyB0aGUgc3R5bGVOYW1lczsgb25lIHVuaXF1ZSBlbnRyeSBmb3IgZXZlcnkgc3R5bGUgdHlwZSBtZWFudCB0byBiZQotICogY29uZmlndXJhYmxlIGJ5IHRoZSB1c2VyIDIpIGEgRGljdGlvbmFyeSBvZiBkZXNjcmlwdGlvbnMsIG1hcHBpbmcgdGhlCi0gKiBzdHlsZU5hbWVzIHRvIHVuaXF1ZSBkZXNjcmlwdGlvbnMgLSBtZWFudCBmb3IgdXNlIHdpdGhpbiB0aGUgc2VsZWN0aW9uCi0gKiBDb21ib0JveCBUT0RPIChwYSkgdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgd29ya2luZyBvZmYgZG9jdW1lbnQgcGFydGl0aW9ucwotICogbm93ICgyLjErKSAzKSBhIERpY3Rpb25hcnkgbWFwcGluZyBwYXJzZWQgSVRleHRSZWdpb24gY29udGV4dHMgKHN0cmluZ3MpIHRvCi0gKiB0aGUgbG9jYWxseSBkZWZpbmVkIHN0eWxlTmFtZXMKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlZFRleHRDb2xvclBpY2tlciBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIGNsYXNzIERlc2NyaXB0aW9uU29ydGVyIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLlNvcnRlciB7Ci0JCUNvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQotCQlwdWJsaWMgYm9vbGVhbiBjb21wYXJlKE9iamVjdCBlbGVtZW50T25lLCBPYmplY3QgZWxlbWVudFR3bykgewotCQkJLyoqCi0JCQkgKiBSZXR1cm5zIHRydWUgaWYgZWxlbWVudFR3byBpcyAnZ3JlYXRlciB0aGFuJyBlbGVtZW50T25lIFRoaXMgaXMKLQkJCSAqIHRoZSAnb3JkZXJpbmcnIG1ldGhvZCBvZiB0aGUgc29ydCBvcGVyYXRpb24uIEVhY2ggc3ViY2xhc3MKLQkJCSAqIG92ZXJpZGVzIHRoaXMgbWV0aG9kIHdpdGggdGhlIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0JCQkgKiAnZ3JlYXRlciB0aGFuJyBjb25jZXB0IGZvciB0aGUgb2JqZWN0cyBiZWluZyBzb3J0ZWQuCi0JCQkgKi8KLQkJCXJldHVybiAoY29sbGF0b3IuY29tcGFyZShlbGVtZW50T25lLnRvU3RyaW5nKCksIGVsZW1lbnRUd28udG9TdHJpbmcoKSkpIDwgMDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tHUk9VTkQgPSAiYmFja2dyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0xEID0gImJvbGQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1IgPSAiY29sb3IiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBuYW1lcyBmb3IgcHJlZmVyZW5jZSBlbGVtZW50cyAuLi4gbm9uLU5MUwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkQgPSAiZm9yZWdyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVEFMSUMgPSAiaXRhbGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBzaG93SXRhbGljID0gZmFsc2U7Ci0JcHJvdGVjdGVkIEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIgYmFja2dyb3VuZEFjY0xpc3RlbmVyID0gbmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlcigpIHsKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyI2dldFZhbHVlKEFjY2Vzc2libGVDb250cm9sRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBnZXRWYWx1ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCWlmIChlLmNoaWxkSUQgPT0gQUNDLkNISUxESURfU0VMRikgewotCQkJCWUucmVzdWx0ID0gZkJhY2tncm91bmQuZ2V0Q29sb3JWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBidXR0b25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgbmFtZWRTdHlsZSA9IGdldFN0eWxlTmFtZShmU3R5bGVDb21iby5nZXRJdGVtKGZTdHlsZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpKTsKLQkJCWlmIChuYW1lZFN0eWxlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGUud2lkZ2V0ID09IGZCb2xkKSB7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMl07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZCb2xkLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzJdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHNob3dJdGFsaWMgJiYgZS53aWRnZXQgPT0gZkl0YWxpYykgewotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzNdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmSXRhbGljLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzNdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IGZDbGVhclN0eWxlKSB7Ci0JCQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VG9EZWZhdWx0KG5hbWVkU3R5bGUpOwotCQkJCXJlZnJlc2goKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uTGlzdGVuZXIgY29tYm9MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpbnQgc2VsZWN0ZWRJbmRleCA9IGZTdHlsZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBzZWxlY3RlZEluZGV4ID49IDAgPyBmU3R5bGVDb21iby5nZXRJdGVtKHNlbGVjdGVkSW5kZXgpIDogbnVsbDsKLQkJCWFjdGl2YXRlKGdldFN0eWxlTmFtZShkZXNjcmlwdGlvbikpOwotCQl9Ci0JfTsKLQlwcm90ZWN0ZWQgQ29sb3JTZWxlY3RvciBmQmFja2dyb3VuZDsKLQlwcm90ZWN0ZWQgTGFiZWwgZkJhY2tncm91bmRMYWJlbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZCb2xkOwotCXByb3RlY3RlZCBCdXR0b24gZkNsZWFyU3R5bGU7Ci0JLy8gRGljdGlvbmFyeSBtYXBwaW5nIHRoZSBJVGV4dFJlZ2lvbiB0eXBlcyBhYm92ZSB0byBjb2xvciBuYW1lcywgd2hpY2gKLQkvLyBhcmUsIGluIHR1cm4sIGF0dHJpYnV0ZXMKLQlwcm90ZWN0ZWQgRGljdGlvbmFyeSBmQ29udGV4dFN0eWxlTWFwID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ29sb3IgZkRlZmF1bHRCYWNrZ3JvdW5kID0gZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpOwotCi0JcHJvdGVjdGVkIENvbG9yIGZEZWZhdWx0Rm9yZWdyb3VuZCA9IGdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKTsKLQkvLyBEaWN0aW9uYXJ5IG1hcHBpbmcgdGhlIElUZXh0UmVnaW9uIHR5cGVzIGFib3ZlIHRvIGRpc3BsYXkgc3RyaW5ncywgZm9yCi0JLy8gdXNlIGluIHRoZSBjb21ibyBib3gKLQlwcm90ZWN0ZWQgRGljdGlvbmFyeSBmRGVzY3JpcHRpb25zID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ29sb3JTZWxlY3RvciBmRm9yZWdyb3VuZDsKLQlwcm90ZWN0ZWQgTGFiZWwgZkZvcmVncm91bmRMYWJlbDsKLS8vCXByaXZhdGUgU3RyaW5nIGZHZW5lcmF0b3JLZXk7Ci0JcHJvdGVjdGVkIFN0cmluZyBmSW5wdXQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBCdXR0b24gZkl0YWxpYzsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmTm9kZXMgPSBudWxsOwotCS8vIGRlZmVjdCAyMDA3NjQgLSBBQ0M6ZGlzcGxheSB2YWx1ZXMgZm9yIGNvbG9yIGJ1dHRvbnMKLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciBmb3JlZ3JvdW5kQWNjTGlzdGVuZXIgPSBuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgewotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIjZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGdldFZhbHVlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKSB7Ci0JCQkJZS5yZXN1bHQgPSBmRm9yZWdyb3VuZC5nZXRDb2xvclZhbHVlKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCX07Ci0JLy8gQSBSZWdpb25QYXJzZXIsIHdoaWNoIHdpbGwgdHVybiB0aGUgaW5wdXQgaW50bwotCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocykgYW5kIFJlZ2lvbnMKLQlwcm90ZWN0ZWQgUmVnaW9uUGFyc2VyIGZQYXJzZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGZQcmVmZXJlbmNlU3RvcmU7Ci0JcHJvdGVjdGVkIENvbWJvIGZTdHlsZUNvbWJvID0gbnVsbDsKLQkvLyBUaGUgbGlzdCBvZiBzdXBwb3J0ZWQgSVRleHRSZWdpb24gdHlwZXMgW1N0cmluZ3NdCi0JcHJvdGVjdGVkIExpc3QgZlN0eWxlTGlzdCA9IG51bGw7Ci0KLQkvLyBjb250cm9scyBpbiBwaWNrZXIKLQlwcm90ZWN0ZWQgU3R5bGVkVGV4dCBmVGV4dCA9IG51bGw7Ci0KLQkvKioKLQkgKiBYTUxUZXh0Q29sb3JQaWNrZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHlsZWRUZXh0Q29sb3JQaWNrZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQkvL0dyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCXNldExheW91dChsYXlvdXQpOwotCQljcmVhdGVDb250cm9scyh0aGlzKTsKLQl9Ci0KLQkvLyBhY3RpdmF0ZSBjb250cm9scyBiYXNlZCBvbiB0aGUgZ2l2ZW4gbG9jYWwgY29sb3IgdHlwZQotCXByb3RlY3RlZCB2b2lkIGFjdGl2YXRlKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCWlmIChuYW1lZFN0eWxlID09IG51bGwpIHsKLQkJCWZGb3JlZ3JvdW5kLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJhY2tncm91bmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZCb2xkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJaWYgKHNob3dJdGFsaWMpCi0JCQkJZkl0YWxpYy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IAotCQllbHNlIHsJCQotCQkJZkZvcmVncm91bmQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCYWNrZ3JvdW5kLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKHRydWUpOwotCQkJZkJvbGQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWlmIChzaG93SXRhbGljKQotCQkJCWZJdGFsaWMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCYWNrZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQotCQl9Ci0JCVRleHRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlKG5hbWVkU3R5bGUpOwotCQlDb2xvciBjb2xvciA9IGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCk7Ci0JCWlmIChjb2xvciA9PSBudWxsKSB7Ci0JCQljb2xvciA9IGZEZWZhdWx0Rm9yZWdyb3VuZDsKLQkJfQotCQlmRm9yZWdyb3VuZC5zZXRDb2xvclZhbHVlKGNvbG9yLmdldFJHQigpKTsKLQotCQljb2xvciA9IGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCk7Ci0JCWlmIChjb2xvciA9PSBudWxsKSB7Ci0JCQljb2xvciA9IGZEZWZhdWx0QmFja2dyb3VuZDsKLQkJfQotCQlmQmFja2dyb3VuZC5zZXRDb2xvclZhbHVlKGNvbG9yLmdldFJHQigpKTsKLQotCQlmQm9sZC5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOwotCQlpZiAoc2hvd0l0YWxpYykKLQkJCWZJdGFsaWMuc2V0U2VsZWN0aW9uKChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFwcGx5U3R5bGVzKCkgewotCQlpZiAoZlRleHQgPT0gbnVsbCB8fCBmVGV4dC5pc0Rpc3Bvc2VkKCkgfHwgZklucHV0ID09IG51bGwgfHwgZklucHV0Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0JCS8vCQlMaXN0IHJlZ2lvbnMgPSBmUGFyc2VyLmdldFJlZ2lvbnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZk5vZGVzOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG5vZGUuZ2V0UmVnaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCS8vIGxvb2t1cCB0aGUgbG9jYWwgY29sb3JpbmcgdHlwZSBhbmQgYXBwbHkgaXQKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IChTdHJpbmcpIGdldENvbnRleHRTdHlsZU1hcCgpLmdldChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSk7Ci0JCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGUobmFtZWRTdHlsZSk7Ci0JCQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2Uobm9kZS5nZXRTdGFydE9mZnNldChjdXJyZW50UmVnaW9uKSwgY3VycmVudFJlZ2lvbi5nZXRMZW5ndGgoKSwgYXR0cmlidXRlLmdldEZvcmVncm91bmQoKSwgYXR0cmlidXRlLmdldEJhY2tncm91bmQoKSwgYXR0cmlidXRlLmdldFN0eWxlKCkpOwotCQkJCWZUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCQkJfQotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBuZXcgY2hlY2tib3ggaW5zdGFuY2UgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICogCi0JICogQHBhcmFtIGdyb3VwCi0JICogICAgICAgICAgICB0aGUgY29tcG9zaXRlIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgY2hlY2tib3gKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gc2V0IGludG8gdGhlIGNoZWNrYm94Ci0JICogQHJldHVybiB0aGUgbmV3IGNoZWNrYm94Ci0JICovCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlQ2hlY2tCb3goQ29tcG9zaXRlIGdyb3VwLCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5DRU5URVIpOwotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORDsKLQkJLy8JZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEw7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCXByaXZhdGUgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gbGFiZWxzLCBpbnQgc2VsZWN0ZWRJdGVtKSB7Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQljb21iby5zZXRJdGVtcyhsYWJlbHMpOwotCQlpZiAoc2VsZWN0ZWRJdGVtID49IDApCi0JCQljb21iby5zZWxlY3Qoc2VsZWN0ZWRJdGVtKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEw7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvbXBvc2l0ZSBjb250cm9sIGFuZCBzZXRzIHRoZSBkZWZhdWx0IGxheW91dCBkYXRhLgotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJLy9HcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSA1OwotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gZmFsc2U7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJLy9HcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVI7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHN0eWxlUm93ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMyk7Ci0JCS8vIHJvdyAxIC0gY29udGVudCB0eXBlIGxhYmVsLCBjb21ibyBib3gsIHJlc3RvcmUgZGVmYXVsdHMKLQkJY3JlYXRlTGFiZWwoc3R5bGVSb3csIFNTRVVJTWVzc2FnZXMuQ29udGVudF90eXBlX19VSV8pOyAvLyROT04tTkxTLTEkID0gIkNvbnRlbnQgdHlwZToiCi0JCS8vIENvbnRleHRzIGNvbWJvIGJveAotCQlmU3R5bGVDb21ibyA9IGNyZWF0ZUNvbWJvKHN0eWxlUm93LCBuZXcgU3RyaW5nWzBdLCAtMSk7Ci0JCWZDbGVhclN0eWxlID0gY3JlYXRlUHVzaEJ1dHRvbihzdHlsZVJvdywgU1NFVUlNZXNzYWdlcy5SZXN0b3JlX0RlZmF1bHRfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJSZXN0b3JlIERlZmF1bHQiCi0JCUNvbXBvc2l0ZSBzdHlsZVJvdzI7Ci0JCWlmIChzaG93SXRhbGljKQotCQkJc3R5bGVSb3cyID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgNyk7Ci0JCWVsc2UKLQkJCXN0eWxlUm93MiA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDYpOwotCQkvLyByb3cgMiAtIGZvcmVncm91bmQgbGFiZWwsIGJ1dHRvbiwgYmFja2dyb3VuZCBsYWJlbCwgYnV0dG9uLCBib2xkLAotCQkvLyBpdGFsaWNzPwotCQlmRm9yZWdyb3VuZExhYmVsID0gY3JlYXRlTGFiZWwoc3R5bGVSb3cyLCBTU0VVSU1lc3NhZ2VzLkZvcmVncm91bmRfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJGb3JlZ3JvdW5kIgotCQlmRm9yZWdyb3VuZCA9IG5ldyBDb2xvclNlbGVjdG9yKHN0eWxlUm93Mik7Ci0JCWZGb3JlZ3JvdW5kLmdldEJ1dHRvbigpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQlzZXRBY2Nlc3NpYmxlKGZGb3JlZ3JvdW5kLmdldEJ1dHRvbigpLCBmRm9yZWdyb3VuZExhYmVsLmdldFRleHQoKSk7Ci0JCWZGb3JlZ3JvdW5kLmdldEJ1dHRvbigpLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKGZvcmVncm91bmRBY2NMaXN0ZW5lcik7IC8vIGRlZmVjdAotCQkvLyAyMDA3NjQKLQkJLy8gLQotCQkvLyBBQ0M6ZGlzcGxheQotCQkvLyB2YWx1ZXMKLQkJLy8gZm9yCi0JCS8vIGNvbG9yCi0JCS8vIGJ1dHRvbnMKLQkJKChHcmlkRGF0YSkgZkZvcmVncm91bmQuZ2V0QnV0dG9uKCkuZ2V0TGF5b3V0RGF0YSgpKS5taW5pbXVtV2lkdGggPSAyMDsKLQkJZkJhY2tncm91bmRMYWJlbCA9IGNyZWF0ZUxhYmVsKHN0eWxlUm93MiwgU1NFVUlNZXNzYWdlcy5CYWNrZ3JvdW5kX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiQmFja2dyb3VuZCIKLQkJZkJhY2tncm91bmQgPSBuZXcgQ29sb3JTZWxlY3RvcihzdHlsZVJvdzIpOwotCQlmQmFja2dyb3VuZC5nZXRCdXR0b24oKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJc2V0QWNjZXNzaWJsZShmQmFja2dyb3VuZC5nZXRCdXR0b24oKSwgZkJhY2tncm91bmRMYWJlbC5nZXRUZXh0KCkpOwotCQlmQmFja2dyb3VuZC5nZXRCdXR0b24oKS5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcihiYWNrZ3JvdW5kQWNjTGlzdGVuZXIpOyAvLyBkZWZlY3QKLQkJLy8gMjAwNzY0Ci0JCS8vIC0KLQkJLy8gQUNDOmRpc3BsYXkKLQkJLy8gdmFsdWVzCi0JCS8vIGZvcgotCQkvLyBjb2xvcgotCQkvLyBidXR0b25zCi0JCSgoR3JpZERhdGEpIGZCYWNrZ3JvdW5kLmdldEJ1dHRvbigpLmdldExheW91dERhdGEoKSkubWluaW11bVdpZHRoID0gMjA7Ci0JCWNyZWF0ZUxhYmVsKHN0eWxlUm93MiwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWZCb2xkID0gY3JlYXRlQ2hlY2tCb3goc3R5bGVSb3cyLCBTU0VVSU1lc3NhZ2VzLkJvbGRfVUlfKTsKLQkJaWYgKHNob3dJdGFsaWMpCi0JCQlmSXRhbGljID0gY3JlYXRlQ2hlY2tCb3goc3R5bGVSb3cyLCBTU0VVSU1lc3NhZ2VzLkl0YWxpY3NfVUkpOwotCQkvLwkJLy8gRGVmYXVsdHMgY2hlY2tib3gKLQkJZkZvcmVncm91bmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWZCYWNrZ3JvdW5kLnNldEVuYWJsZWQoZmFsc2UpOwotCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWlmIChzaG93SXRhbGljKQotCQkJZkl0YWxpYy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZkZvcmVncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJQ29tcG9zaXRlIHNhbXBsZSA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCQljcmVhdGVMYWJlbChzYW1wbGUsIFNTRVVJTWVzc2FnZXMuU2FtcGxlX3RleHRfX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiJlNhbXBsZSB0ZXh0OiIKLQkJLy8gQlVHMTQxMDg5IC0gbWFrZSBzdXJlIHRleHQgaXMgbGVmdC1hbGlnbmVkCi0JCWZUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2FtcGxlLCBTV1QuTEVGVF9UT19SSUdIVCB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlmVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWZUZXh0LnNldEJhY2tncm91bmQoZkRlZmF1bHRCYWNrZ3JvdW5kKTsKLQkJZlRleHQuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRUZXh0Rm9udCgpKTsKLQkJZlRleHQuYWRkS2V5TGlzdGVuZXIoZ2V0VGV4dEtleUxpc3RlbmVyKCkpOwotCQlmVGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRUZXh0U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZE1vdXNlTGlzdGVuZXIoZ2V0VGV4dE1vdXNlTGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFRyYXZlcnNlTGlzdGVuZXIoZ2V0VHJhdmVyc2VMaXN0ZW5lcigpKTsgLy8gZGVmZWN0IDIyMDM3NyAtCi0JCS8vIFByb3ZpZGUgdGFiCi0JCS8vIHRyYXZlcnNhbCBmb3IKLQkJLy8gZlRleHQgd2lkZ2V0Ci0JCXNldEFjY2Vzc2libGUoZlRleHQsIFNTRVVJTWVzc2FnZXMuU2FtcGxlX3RleHRfX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiJlNhbXBsZSB0ZXh0OiIKLQkJZkZvcmVncm91bmQuYWRkTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhDb2xvclNlbGVjdG9yLlBST1BfQ09MT1JDSEFOR0UpKSB7Ci0JCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gZ2V0U3R5bGVOYW1lKGZTdHlsZUNvbWJvLmdldEl0ZW0oZlN0eWxlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkpOwotCQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMF07Ci0JCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSAibnVsbCI7ICAgLy8kTk9OLU5MUy0xJAotCQkJCQkJT2JqZWN0IG5ld1ZhbHVlT2JqZWN0ID0gZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWlmIChuZXdWYWx1ZU9iamVjdCBpbnN0YW5jZW9mIFJHQikgewotCQkJCQkJCW5ld1ZhbHVlID0gQ29sb3JIZWxwZXIudG9SR0JTdHJpbmcoKFJHQiluZXdWYWx1ZU9iamVjdCk7Ci0JCQkJCQl9Ci0JCi0JCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCQlzdHlsZVByZWZzWzBdID0gbmV3VmFsdWU7Ci0JCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlmQmFja2dyb3VuZC5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBnZXRTdHlsZU5hbWUoZlN0eWxlQ29tYm8uZ2V0SXRlbShmU3R5bGVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKSk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1sxXTsKLQotCQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gIm51bGwiOyAgIC8vJE5PTi1OTFMtMSQKLQkJCQkJCU9iamVjdCBuZXdWYWx1ZU9iamVjdCA9IGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlpZiAobmV3VmFsdWVPYmplY3QgaW5zdGFuY2VvZiBSR0IpIHsKLQkJCQkJCQluZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKChSR0IpbmV3VmFsdWVPYmplY3QpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCQlzdHlsZVByZWZzWzFdID0gbmV3VmFsdWU7Ci0JCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZDbGVhclN0eWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJ1dHRvbkxpc3RlbmVyKTsKLQkJZkJvbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIoYnV0dG9uTGlzdGVuZXIpOwotCQlpZiAoc2hvd0l0YWxpYykKLQkJCWZJdGFsaWMuYWRkU2VsZWN0aW9uTGlzdGVuZXIoYnV0dG9uTGlzdGVuZXIpOwotCQlmU3R5bGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihjb21ib0xpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBsYWJlbCBpbnN0YW5jZSBhbmQgc2V0cyB0aGUgZGVmYXVsdAotCSAqIGxheW91dCBkYXRhLgotCSAqLwotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJLy8JZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBuZXcgVGV4dEF0dHJpYnV0ZShnZXREZWZhdWx0Rm9yZWdyb3VuZCgpLCBnZXREZWZhdWx0QmFja2dyb3VuZCgpLCBTV1QuTk9STUFMKTsKLQotCQlpZiAobmFtZWRTdHlsZSAhPSBudWxsICYmIGdldFByZWZlcmVuY2VTdG9yZSgpICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCi0JCQkJaW50IGZvbnRNb2RpZmllciA9IFNXVC5OT1JNQUw7Ci0JCQkJYm9vbGVhbiBib2xkID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbMl0pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCWlmIChib2xkKQotCQkJCQlmb250TW9kaWZpZXIgPSBmb250TW9kaWZpZXIgfCBTV1QuQk9MRDsKLQotCQkJCWlmIChzaG93SXRhbGljKSB7Ci0JCQkJCWJvb2xlYW4gaXRhbGljID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbM10pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQlpZiAoaXRhbGljKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgU1dULklUQUxJQzsKLQkJCQl9Ci0KLQkJCQl0YSA9IG5ldyBUZXh0QXR0cmlidXRlKChmb3JlZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihmb3JlZ3JvdW5kKSA6IG51bGwsIChiYWNrZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihiYWNrZ3JvdW5kKSA6IG51bGwsIGZvbnRNb2RpZmllcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhOwotCX0KLQotCS8vIGRlZmVjdCAyMDA3NjQgLSBBQ0M6ZGlzcGxheSB2YWx1ZXMgZm9yIGNvbG9yIGJ1dHRvbnMKLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIGNvbG9yIEJ1dHRvbiBiJ3MgY3VycmVudCBSQkcgdmFsdWUKLQkgKi8KLS8vCXByaXZhdGUgU3RyaW5nIGdldENvbG9yQnV0dG9uVmFsdWUoQnV0dG9uIGIpIHsKLS8vCQlpZiAoKGIgPT0gbnVsbCkgfHwgKGIuZ2V0SW1hZ2UoKSA9PSBudWxsKSB8fCAoYi5nZXRJbWFnZSgpLmdldEltYWdlRGF0YSgpID09IG51bGwpIHx8IChiLmdldEltYWdlKCkuZ2V0SW1hZ2VEYXRhKCkuZ2V0UkdCcygpID09IG51bGwpIHx8IChiLmdldEltYWdlKCkuZ2V0SW1hZ2VEYXRhKCkuZ2V0UkdCcygpWzBdID09IG51bGwpKQotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQlTdHJpbmcgdmFsID0gYi5nZXRJbWFnZSgpLmdldEltYWdlRGF0YSgpLmdldFJHQnMoKVswXS50b1N0cmluZygpOwotLy8JCXJldHVybiB2YWw7Ci0vLwl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0UHJlZmVyZW5jZVN0b3JlIGluc3RlYWQgbGVmdCBmb3IgbGVnYWN5IGNsaWVudHMsCi0JICogICAgICAgICAgICAgZGVsZXRlIGJ5IFdUUCBNNAotCSAqLwotCXB1YmxpYyBOb2RlIGdldENvbG9yc05vZGUoKSB7Ci0JCS8vcmV0dXJuIGZDb2xvcnNOb2RlOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5EaWN0aW9uYXJ5Ci0JICovCi0JcHVibGljIERpY3Rpb25hcnkgZ2V0Q29udGV4dFN0eWxlTWFwKCkgewotCQlyZXR1cm4gZkNvbnRleHRTdHlsZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcgotCSAqLwotCXB1YmxpYyBDb2xvciBnZXREZWZhdWx0QmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIGZEZWZhdWx0QmFja2dyb3VuZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcgotCSAqLwotCXB1YmxpYyBDb2xvciBnZXREZWZhdWx0Rm9yZWdyb3VuZCgpIHsKLQkJcmV0dXJuIGZEZWZhdWx0Rm9yZWdyb3VuZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5EaWN0aW9uYXJ5Ci0JICovCi0JcHVibGljIERpY3Rpb25hcnkgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gZkRlc2NyaXB0aW9uczsKLQl9Ci0KLQlwdWJsaWMgRm9udCBnZXRGb250KCkgewotCQlyZXR1cm4gZlRleHQuZ2V0Rm9udCgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJLy8gZW5zdXJlIHRoZSBvZmZzZXQgaXMgY2xlYW4KLQkJaWYgKG9mZnNldCA+PSBmSW5wdXQubGVuZ3RoKCkpCi0JCQlyZXR1cm4gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGZJbnB1dC5sZW5ndGgoKSAtIDEpOwotCQllbHNlIGlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuIGdldE5hbWVkU3R5bGVBdE9mZnNldCgwKTsKLQkJLy8gZmluZCB0aGUgSVRleHRSZWdpb24gYXQgdGhpcyBvZmZzZXQKLQkJaWYgKGZOb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYU5vZGUgPSBmTm9kZXM7Ci0JCXdoaWxlIChhTm9kZSAhPSBudWxsICYmICFhTm9kZS5jb250YWluc09mZnNldChvZmZzZXQpKQotCQkJYU5vZGUgPSBhTm9kZS5nZXROZXh0KCk7Ci0JCWlmIChhTm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBmaW5kIHRoZSBJVGV4dFJlZ2lvbidzIENvbnRleHQgYXQgdGhpcyBvZmZzZXQKLQkJCUlUZXh0UmVnaW9uIGludGVyZXN0ID0gYU5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChpbnRlcmVzdCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKG9mZnNldCA+IGFOb2RlLmdldFRleHRFbmRPZmZzZXQoaW50ZXJlc3QpKQotCQkJCXJldHVybiBudWxsOwotCQkJU3RyaW5nIHJlZ2lvbkNvbnRleHQgPSBpbnRlcmVzdC5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uQ29udGV4dCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJLy8gZmluZCB0aGUgbmFtZWQgc3R5bGUgKGludGVybmFsL3NlbGVjdGFibGUgbmFtZSkgZm9yIHRoYXQKLQkJCS8vIGNvbnRleHQKLQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZ2V0Q29udGV4dFN0eWxlTWFwKCkuZ2V0KHJlZ2lvbkNvbnRleHQpOwotCQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBuYW1lZFN0eWxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCXJldHVybiBmUGFyc2VyOwotCX0KLQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBmUHJlZmVyZW5jZVN0b3JlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nW10KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTdHlsZUxpc3QoKSB7Ci0JCXJldHVybiBmU3R5bGVMaXN0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0eWxlTmFtZShTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHN0eWxlTmFtZSA9IG51bGw7Ci0JCWphdmEudXRpbC5FbnVtZXJhdGlvbiBrZXlzID0gZ2V0RGVzY3JpcHRpb25zKCkua2V5cygpOwotCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nIHRlc3QgPSBrZXlzLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKLQkJCWlmIChnZXREZXNjcmlwdGlvbnMoKS5nZXQodGVzdCkuZXF1YWxzKGRlc2NyaXB0aW9uKSkgewotCQkJCXN0eWxlTmFtZSA9IHRlc3Q7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0eWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBmSW5wdXQ7Ci0JfQotCi0JcHJpdmF0ZSBLZXlMaXN0ZW5lciBnZXRUZXh0S2V5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb3VzZUxpc3RlbmVyIGdldFRleHRNb3VzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZ2V0VGV4dFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0KLS8vIENvbW1lbnRlZCBvdXQgd2hlbiBtb3ZpbmcgdG8gUkMyIHRvIHJlbW92ZSAidW51c2VkIiBlcnJvci93YXJuaW5nCQkJCi0vLwkJCXB1YmxpYyB2b2lkIHdpZGdldERvdWJsZVNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLS8vCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoZS54KTsKLS8vCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLS8vCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLS8vCQkJCX0KLS8vCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0Q29sb3JBdE9mZnNldChlLngpOwotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8vIGRlZmVjdCAyMjAzNzcgLSBQcm92aWRlIHRhYiB0cmF2ZXJzYWwgZm9yIGZUZXh0IHdpZGdldAotCXByaXZhdGUgVHJhdmVyc2VMaXN0ZW5lciBnZXRUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyI2tleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpZiAoKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCkgfHwgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVMpKQotCQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gcmVmcmVzaCB0aGUgR1VJIGFmdGVyIGEgY29sb3IgY2hhbmdlCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJZlRleHQuc2V0UmVkcmF3KGZhbHNlKTsKLQkJaW50IHNlbGVjdGVkSW5kZXggPSBmU3R5bGVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBzZWxlY3RlZEluZGV4ID49IDAgPyBmU3R5bGVDb21iby5nZXRJdGVtKHNlbGVjdGVkSW5kZXgpIDogbnVsbDsKLQkJYWN0aXZhdGUoZ2V0U3R5bGVOYW1lKGRlc2NyaXB0aW9uKSk7Ci0JCS8vIHVwZGF0ZSBGb250Ci0JCWZUZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0VGV4dEZvbnQoKSk7Ci0JCS8vIHJlYXBwbHlTdHlsZXMKLQkJYXBwbHlTdHlsZXMoKTsKLQkJZlRleHQuc2V0UmVkcmF3KHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2VQaWNrZXJSZXNvdXJjZXMoKSB7Ci0vLwkJaWYgKGZGb3JlZ3JvdW5kICE9IG51bGwgJiYgIWZGb3JlZ3JvdW5kLmlzRGlzcG9zZWQoKSAmJiBmRm9yZWdyb3VuZC5nZXRJbWFnZSgpICE9IG51bGwpCi0vLwkJCWZGb3JlZ3JvdW5kLmdldEltYWdlKCkuZGlzcG9zZSgpOwotLy8JCWlmIChmQmFja2dyb3VuZCAhPSBudWxsICYmICFmQmFja2dyb3VuZC5pc0Rpc3Bvc2VkKCkgJiYgZkJhY2tncm91bmQuZ2V0SW1hZ2UoKSAhPSBudWxsKQotLy8JCQlmQmFja2dyb3VuZC5nZXRJbWFnZSgpLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0Q29sb3JBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyBuYW1lZFN0eWxlID0gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KG9mZnNldCk7Ci0JCWlmIChuYW1lZFN0eWxlID09IG51bGwpIHsKLQkJCWZTdHlsZUNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0JCQlhY3RpdmF0ZShudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAoU3RyaW5nKSBnZXREZXNjcmlwdGlvbnMoKS5nZXQobmFtZWRTdHlsZSk7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaXRlbUNvdW50ID0gZlN0eWxlQ29tYm8uZ2V0SXRlbUNvdW50KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKLQkJCWlmIChmU3R5bGVDb21iby5nZXRJdGVtKGkpLmVxdWFscyhkZXNjcmlwdGlvbikpIHsKLQkJCQlmU3R5bGVDb21iby5zZWxlY3QoaSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lmaWNhbGx5IHNldCB0aGUgcmVwb3J0aW5nIG5hbWUgb2YgYSBjb250cm9sIGZvciBhY2Nlc3NpYmlsaXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFjY2Vzc2libGUoQ29udHJvbCBjb250cm9sLCBTdHJpbmcgbmFtZSkgewotCQlpZiAoY29udHJvbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmaW5hbCBTdHJpbmcgbiA9IG5hbWU7Ci0JCWNvbnRyb2wuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKQotCQkJCQllLnJlc3VsdCA9IG47Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBzZXRQcmVmZXJlbmNlU3RvcmUgaW5zdGVhZCBsZWZ0IGZvciBsZWdhY3kgY2xpZW50cywKLQkgKiAgICAgICAgICAgICBkZWxldGUgYnkgV1RQIE00Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sb3JzTm9kZShOb2RlIG5ld0NvbG9yc05vZGUpIHsKLQkJLy9mQ29sb3JzTm9kZSA9IG5ld0NvbG9yc05vZGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0NvbnRleHRTdHlsZU1hcAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkRpY3Rpb25hcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0U3R5bGVNYXAoRGljdGlvbmFyeSBuZXdDb250ZXh0U3R5bGVNYXApIHsKLQkJZkNvbnRleHRTdHlsZU1hcCA9IG5ld0NvbnRleHRTdHlsZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3RGVmYXVsdEJhY2tncm91bmQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRCYWNrZ3JvdW5kKENvbG9yIG5ld0RlZmF1bHRCYWNrZ3JvdW5kKSB7Ci0JCWZEZWZhdWx0QmFja2dyb3VuZCA9IG5ld0RlZmF1bHRCYWNrZ3JvdW5kOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBzZXRQcmVmZXJlbmNlU3RvcmUgaW5zdGVhZCBsZWZ0IGZvciBsZWdhY3kgY2xpZW50cywKLQkgKiAgICAgICAgICAgICBkZWxldGUgYnkgV1RQIE00Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdENvbG9yc05vZGUoTm9kZSBuZXdEZWZhdWx0Q29sb3JzTm9kZSkgewotCQkvL2ZEZWZhdWx0Q29sb3JzTm9kZSA9IG5ld0RlZmF1bHRDb2xvcnNOb2RlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdEZWZhdWx0Rm9yZWdyb3VuZAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdEZvcmVncm91bmQoQ29sb3IgbmV3RGVmYXVsdEZvcmVncm91bmQpIHsKLQkJZkRlZmF1bHRGb3JlZ3JvdW5kID0gbmV3RGVmYXVsdEZvcmVncm91bmQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0Rlc2NyaXB0aW9ucwotCSAqICAgICAgICAgICAgamF2YS51dGlsLkRpY3Rpb25hcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbnMoRGljdGlvbmFyeSBuZXdEZXNjcmlwdGlvbnMpIHsKLQkJZkRlc2NyaXB0aW9ucyA9IG5ld0Rlc2NyaXB0aW9uczsKLQkJdXBkYXRlU3R5bGVMaXN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9udChGb250IGZvbnQpIHsKLQkJZlRleHQuc2V0Rm9udChmb250KTsKLQkJZlRleHQucmVkcmF3KCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgZ2VuZXJhdG9yIGtleSBzaG91bGQgbm8gbG9uZ2VyIGJlIG5lZWRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRvcktleShTdHJpbmcga2V5KSB7Ci0vLwkJZkdlbmVyYXRvcktleSA9IGtleTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3UGFyc2VyCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyc2VyKFJlZ2lvblBhcnNlciBuZXdQYXJzZXIpIHsKLQkJZlBhcnNlciA9IG5ld1BhcnNlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlU3RvcmUoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlmUHJlZmVyZW5jZVN0b3JlID0gc3RvcmU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1N0eWxlTGlzdAotCSAqICAgICAgICAgICAgU3RyaW5nW10KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHlsZUxpc3QoTGlzdCBuZXdTdHlsZUxpc3QpIHsKLQkJZlN0eWxlTGlzdCA9IG5ld1N0eWxlTGlzdDsKLQkJdXBkYXRlU3R5bGVMaXN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgcykgewotCQlmSW5wdXQgPSBzOwotCQlnZXRQYXJzZXIoKS5yZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGZJbnB1dC50b0NoYXJBcnJheSgpKSk7Ci0JCWZOb2RlcyA9IGdldFBhcnNlcigpLmdldERvY3VtZW50UmVnaW9ucygpOwotCQlpZiAoRGVidWcuZGlzcGxheUluZm8pCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxlbmd0aCBvZiBpbnB1dDogIiAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkrIHMubGVuZ3RoKCkgKyAiLCAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgZ2V0UGFyc2VyKCkuZ2V0UmVnaW9ucygpLnNpemUoKSArICIgcmVnaW9ucy4iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZlRleHQgIT0gbnVsbCkKLQkJCWZUZXh0LnNldFRleHQocyk7Ci0JCWFwcGx5U3R5bGVzKCk7Ci0JfQotCi0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQgotCSAqIEBwYXJhbSBhblJHQlN0cmluZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZWZhdWx0UkdCCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCCi0JICovCi0JLy8gVE9ETzogbmV2ZXIgdXNlZAotCSBSR0IgdG9SR0IoU3RyaW5nIGFuUkdCU3RyaW5nLCBSR0IgZGVmYXVsdFJHQikgewotCQlSR0IgcmVzdWx0ID0gQ29sb3JIZWxwZXIudG9SR0IoYW5SR0JTdHJpbmcpOwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXR1cm4gZGVmYXVsdFJHQjsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlU3R5bGVMaXN0KCkgewotCQlpZiAoZlN0eWxlTGlzdCA9PSBudWxsIHx8IGZEZXNjcmlwdGlvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nW10gZGVzY3JpcHRpb25zID0gbmV3IFN0cmluZ1tmU3R5bGVMaXN0LnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlN0eWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJaWYgKGZTdHlsZUxpc3QuZ2V0KGkpICE9IG51bGwpCi0JCQkJZGVzY3JpcHRpb25zW2ldID0gKFN0cmluZykgZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KGZTdHlsZUxpc3QuZ2V0KGkpKTsKLQkJCWVsc2UKLQkJCQlkZXNjcmlwdGlvbnNbaV0gPSAoU3RyaW5nKSBmU3R5bGVMaXN0LmdldChpKTsKLQkJfQotCQlPYmplY3RbXSBzb3J0ZWRPYmplY3RzID0gbmV3IERlc2NyaXB0aW9uU29ydGVyKCkuc29ydChkZXNjcmlwdGlvbnMpOwotCQlTdHJpbmdbXSBzb3J0ZWREZXNjcmlwdGlvbnMgPSBuZXcgU3RyaW5nW2Rlc2NyaXB0aW9ucy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJc29ydGVkRGVzY3JpcHRpb25zW2ldID0gc29ydGVkT2JqZWN0c1tpXS50b1N0cmluZygpOwotCQl9Ci0JCWZTdHlsZUNvbWJvLnNldEl0ZW1zKHNvcnRlZERlc2NyaXB0aW9ucyk7Ci0JCWZTdHlsZUNvbWJvLnNlbGVjdCgwKTsgLy9kZWZlY3QgMjE5ODU1IC0gaW5pdGlhbGx5IHNlbGVjdCBmaXJzdCBpdGVtCi0JCS8vIGluIGNvbWJvQm94Ci0JCS8vCQlmU3R5bGVDb21iby5kZXNlbGVjdEFsbCgpOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9UZXh0SG92ZXJQcmVmZXJlbmNlVGFiLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvVGV4dEhvdmVyUHJlZmVyZW5jZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDA5MDRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9UZXh0SG92ZXJQcmVmZXJlbmNlVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5FZGl0b3JQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mby5UZXh0SG92ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mby5UZXh0SG92ZXJNYW5hZ2VyLlRleHRIb3ZlckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci0KLS8qKgotICogUHJlZmVyZW5jZSB0YWIgZm9yIFN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaG92ZXIgaGVscCBwcmVmZXJlbmNlcwotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlVGFiIHsKLQotCXByaXZhdGUgY2xhc3MgSW50ZXJuYWxUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyBJbnRlcm5hbFRhYmxlTGFiZWxQcm92aWRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgMCA6IC8vIHRleHQgaG92ZXIgbGFiZWwKLQkJCQkJcmV0dXJuICgoVGV4dEhvdmVyTWFuYWdlci5UZXh0SG92ZXJEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRMYWJlbCgpOwotCi0JCQkJY2FzZSAxIDogLy8gdGV4dCBob3ZlciBzdGF0ZSBtYXNrCi0JCQkJCXJldHVybiAoKFRleHRIb3Zlck1hbmFnZXIuVGV4dEhvdmVyRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0TW9kaWZpZXJTdHJpbmcoKTsKLQotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSU1JVEVSID0gU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2RlbGltaXRlcjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgVGV4dCBmRGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBUYWJsZSBmSG92ZXJUYWJsZTsKLQlwcml2YXRlIFRhYmxlVmlld2VyIGZIb3ZlclRhYmxlVmlld2VyOwotCXByaXZhdGUgVGFibGVDb2x1bW4gZk1vZGlmaWVyQ29sdW1uOwotCS8vIGZvciB0aGlzIHByZWZlcmVuY2UgcGFnZQotCXByaXZhdGUgVGV4dCBmTW9kaWZpZXJFZGl0b3I7Ci0JcHJpdmF0ZSBUYWJsZUNvbHVtbiBmTmFtZUNvbHVtbjsKLQotCXByaXZhdGUgVGV4dEhvdmVyRGVzY3JpcHRvcltdIGZUZXh0SG92ZXJzOyAvLyBjdXJyZW50IGxpc3Qgb2YgdGV4dCBob3ZlcnMKLQotCXB1YmxpYyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiKFByZWZlcmVuY2VQYWdlIG1haW5QcmVmZXJlbmNlUGFnZSwgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG1haW5QcmVmZXJlbmNlUGFnZSk7Ci0JCUFzc2VydC5pc05vdE51bGwoc3RvcmUpOwotCQlzZXRNYWluUHJlZmVyZW5jZVBhZ2UobWFpblByZWZlcmVuY2VQYWdlKTsKLQkJc2V0T3ZlcmxheVN0b3JlKHN0b3JlKTsKLQkJZ2V0T3ZlcmxheVN0b3JlKCkuYWRkS2V5cyhjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHRhYkZvbGRlcikgewotCQlDb21wb3NpdGUgaG92ZXJDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJaG92ZXJDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWhvdmVyQ29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0JCS8vIGNvbW1lbnRlZCBvdXQgdW50aWwgdGhlc2UgcHJlZmVyZW5jZXMgYXJlIGFjdHVhbGx5IGhhbmRsZWQgaW4gc29tZQotCQkvLyB3YXkKLQkJLy8JCVN0cmluZyByb2xsT3ZlckxhYmVsPQotCQkvLyBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUZXh0SG92ZXJQcmVmZXJlbmNlVGFiLmFubm90YXRpb25Sb2xsb3ZlciIpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vCQlhZGRDaGVja0JveChob3ZlckNvbXBvc2l0ZSwgcm9sbE92ZXJMYWJlbCwKLQkJLy8gQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkVESVRPUl9BTk5PVEFUSU9OX1JPTExfT1ZFUiwgMCk7Ci0JCS8vCi0JCS8vCQkvLyBBZmZvcmRhbmNlIGNoZWNrYm94Ci0JCS8vCQlTdHJpbmcgc2hvd0FmZm9yZGFuY2VMYWJlbCA9Ci0JCS8vIFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRleHRIb3ZlclByZWZlcmVuY2VUYWIuc2hvd0FmZm9yZGFuY2UiKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLwkJYWRkQ2hlY2tCb3goaG92ZXJDb21wb3NpdGUsIHNob3dBZmZvcmRhbmNlTGFiZWwsCi0JCS8vIENvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lcy5FRElUT1JfU0hPV19URVhUX0hPVkVSX0FGRk9SREFOQ0UsIDApOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGhvdmVyQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2hvdmVyUHJlZmVyZW5jZXMpOyAvLyROT04tTkxTLTEkCi0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlmSG92ZXJUYWJsZVZpZXdlciA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KGhvdmVyQ29tcG9zaXRlLCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJLy8gSG92ZXIgdGFibGUKLQkJZkhvdmVyVGFibGUgPSBmSG92ZXJUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCQlmSG92ZXJUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlmSG92ZXJUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDQ1MDcKLQkgICAgR0MgZ2MgPSBuZXcgR0MoZkhvdmVyVGFibGUpOwotCSAgICBnYy5zZXRGb250KGZIb3ZlclRhYmxlLmdldEZvbnQoKSk7Ci0JICAgIEZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkgICAgZ2MuZGlzcG9zZSgpOwotCQlpbnQgaGVpZ2h0SGludCA9IERpYWxvZy5jb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCA3KTsKLQkJZ2QuaGVpZ2h0SGludCA9IGhlaWdodEhpbnQ7Ci0JCQotCQlmSG92ZXJUYWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEsIDE0MCwgdHJ1ZSkpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEsIDE0MCwgdHJ1ZSkpOwotCQlmSG92ZXJUYWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCi0JCWZIb3ZlclRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUhvdmVyTGlzdFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQlmTmFtZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihmSG92ZXJUYWJsZSwgU1dULk5PTkUpOwotCQlmTmFtZUNvbHVtbi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9uYW1lQ29sdW1uVGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCWZOYW1lQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotCQlmTW9kaWZpZXJDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oZkhvdmVyVGFibGUsIFNXVC5OT05FKTsKLQkJZk1vZGlmaWVyQ29sdW1uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX21vZGlmaWVyQ29sdW1uVGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCWZNb2RpZmllckNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLQkJZkhvdmVyVGFibGVWaWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJZkhvdmVyVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJZkhvdmVyVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgSW50ZXJuYWxUYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCSgoQ2hlY2tib3hUYWJsZVZpZXdlcikgZkhvdmVyVGFibGVWaWV3ZXIpLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCS8qCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lciNjaGVja1N0YXRlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlTdHJpbmcgaWQgPSAoKFRleHRIb3ZlckRlc2NyaXB0b3IpIGV2ZW50LmdldEVsZW1lbnQoKSkuZ2V0SWQoKTsKLQkJCQlpZiAoaWQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCi0JCQkJVGV4dEhvdmVyTWFuYWdlci5UZXh0SG92ZXJEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBnZXRUZXh0SG92ZXJNYW5hZ2VyKCkuZ2V0VGV4dEhvdmVycygpOwotCQkJCVRleHRIb3Zlck1hbmFnZXIuVGV4dEhvdmVyRGVzY3JpcHRvciBob3ZlckNvbmZpZyA9IG51bGw7Ci0JCQkJaW50IGkgPSAwLCBsZW5ndGggPSBmVGV4dEhvdmVycy5sZW5ndGg7Ci0JCQkJd2hpbGUgKGkgPCBsZW5ndGgpIHsKLQkJCQkJaWYgKGlkLmVxdWFscyhkZXNjcmlwdG9yc1tpXS5nZXRJZCgpKSkgewotCQkJCQkJaG92ZXJDb25maWcgPSBmVGV4dEhvdmVyc1tpXTsKLQkJCQkJCWhvdmVyQ29uZmlnLnNldEVuYWJsZWQoZXZlbnQuZ2V0Q2hlY2tlZCgpKTsKLQkJCQkJCWZNb2RpZmllckVkaXRvci5zZXRFbmFibGVkKGV2ZW50LmdldENoZWNrZWQoKSk7Ci0JCQkJCQlmSG92ZXJUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGVzY3JpcHRvcnNbaV0pKTsKLQkJCQkJfQotCQkJCQlpKys7Ci0JCQkJfQotCi0JCQkJaGFuZGxlSG92ZXJMaXN0U2VsZWN0aW9uKCk7Ci0JCQkJdXBkYXRlU3RhdHVzKGhvdmVyQ29uZmlnKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gVGV4dCBmaWVsZCBmb3IgbW9kaWZpZXIgc3RyaW5nCi0JCWxhYmVsID0gbmV3IExhYmVsKGhvdmVyQ29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2tleU1vZGlmaWVyKTsgLy8kTk9OLU5MUy0xJAotCQlmTW9kaWZpZXJFZGl0b3IgPSBuZXcgVGV4dChob3ZlckNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWZNb2RpZmllckVkaXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlmTW9kaWZpZXJFZGl0b3IuYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkgewotCQkJcHJpdmF0ZSBib29sZWFuIGlzTW9kaWZpZXJDYW5kaWRhdGU7Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlzTW9kaWZpZXJDYW5kaWRhdGUgPSBlLmtleUNvZGUgPiAwICYmIGUuY2hhcmFjdGVyID09IDAgJiYgZS5zdGF0ZU1hc2sgPT0gMDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlmIChpc01vZGlmaWVyQ2FuZGlkYXRlICYmIGUuc3RhdGVNYXNrID4gMCAmJiBlLnN0YXRlTWFzayA9PSBlLnN0YXRlTWFzayAmJiBlLmNoYXJhY3RlciA9PSAwKSB7Ly8gJiYKLQkJCQkJLy8gZS50aW1lCi0JCQkJCS8vIC10aW1lCi0JCQkJCS8vIDwKLQkJCQkJLy8gMTAwMCkKLQkJCQkJLy8gewotCQkJCQlTdHJpbmcgdGV4dCA9IGZNb2RpZmllckVkaXRvci5nZXRUZXh0KCk7Ci0JCQkJCVBvaW50IHNlbGVjdGlvbiA9IGZNb2RpZmllckVkaXRvci5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaW50IGkgPSBzZWxlY3Rpb24ueCAtIDE7Ci0JCQkJCXdoaWxlIChpID4gLTEgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0ZXh0LmNoYXJBdChpKSkpIHsKLQkJCQkJCWktLTsKLQkJCQkJfQotCQkJCQlib29sZWFuIG5lZWRzUHJlZml4RGVsaW1pdGVyID0gaSA+IC0xICYmICFTdHJpbmcudmFsdWVPZih0ZXh0LmNoYXJBdChpKSkuZXF1YWxzKERFTElNSVRFUik7Ci0KLQkJCQkJaSA9IHNlbGVjdGlvbi55OwotCQkJCQl3aGlsZSAoaSA8IHRleHQubGVuZ3RoKCkgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0ZXh0LmNoYXJBdChpKSkpIHsKLQkJCQkJCWkrKzsKLQkJCQkJfQotCQkJCQlib29sZWFuIG5lZWRzUG9zdGZpeERlbGltaXRlciA9IGkgPCB0ZXh0Lmxlbmd0aCgpICYmICFTdHJpbmcudmFsdWVPZih0ZXh0LmNoYXJBdChpKSkuZXF1YWxzKERFTElNSVRFUik7Ci0KLQkJCQkJU3RyaW5nIGluc2VydFN0cmluZzsKLQotCQkJCQlpZiAobmVlZHNQcmVmaXhEZWxpbWl0ZXIgJiYgbmVlZHNQb3N0Zml4RGVsaW1pdGVyKQotCQkJCQkJaW5zZXJ0U3RyaW5nID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2luc2VydERlbGltaXRlckFuZE1vZGlmaWVyQW5kRGVsaW1pdGVyLCBuZXcgU3RyaW5nW117QWN0aW9uLmZpbmRNb2RpZmllclN0cmluZyhlLnN0YXRlTWFzayl9KTsKLQkJCQkJZWxzZSBpZiAobmVlZHNQcmVmaXhEZWxpbWl0ZXIpCi0JCQkJCQlpbnNlcnRTdHJpbmcgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLlRleHRIb3ZlclByZWZlcmVuY2VUYWJfaW5zZXJ0RGVsaW1pdGVyQW5kTW9kaWZpZXIsIG5ldyBTdHJpbmdbXXtBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKGUuc3RhdGVNYXNrKX0pOwotCQkJCQllbHNlIGlmIChuZWVkc1Bvc3RmaXhEZWxpbWl0ZXIpCi0JCQkJCQlpbnNlcnRTdHJpbmcgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLlRleHRIb3ZlclByZWZlcmVuY2VUYWJfaW5zZXJ0TW9kaWZpZXJBbmREZWxpbWl0ZXIsIG5ldyBTdHJpbmdbXXtBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKGUuc3RhdGVNYXNrKX0pOwotCQkJCQllbHNlCi0JCQkJCQlpbnNlcnRTdHJpbmcgPSBBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKGUuc3RhdGVNYXNrKTsKLQotCQkJCQlpZiAoaW5zZXJ0U3RyaW5nICE9IG51bGwpCi0JCQkJCQlmTW9kaWZpZXJFZGl0b3IuaW5zZXJ0KGluc2VydFN0cmluZyk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmTW9kaWZpZXJFZGl0b3IuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaGFuZGxlTW9kaWZpZXJNb2RpZmllZCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBEZXNjcmlwdGlvbgotCQlMYWJlbCBkZXNjcmlwdGlvbkxhYmVsID0gbmV3IExhYmVsKGhvdmVyQ29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWRlc2NyaXB0aW9uTGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRleHRIb3ZlclByZWZlcmVuY2VUYWJfZGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGVzY3JpcHRpb25MYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkRlc2NyaXB0aW9uID0gbmV3IFRleHQoaG92ZXJDb21wb3NpdGUsIFNXVC5MRUZUIHwgU1dULldSQVAgfCBTV1QuTVVMVEkgfCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkRlc2NyaXB0aW9uLnNldExheW91dERhdGEoZ2QpOwotCi0JCWluaXRpYWxpemUoKTsKLQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGhvdmVyQ29tcG9zaXRlKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGhvdmVyQ29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuUFJFRlNURV9IT1ZFUlNfSEVMUElEKTsKLQkJcmV0dXJuIGhvdmVyQ29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10gY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpIHsKLQkJQXJyYXlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuRURJVE9SX1RFWFRfSE9WRVJfTU9ESUZJRVJTKSk7Ci0KLQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10ga2V5cyA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbb3ZlcmxheUtleXMuc2l6ZSgpXTsKLQkJb3ZlcmxheUtleXMudG9BcnJheShrZXlzKTsKLQkJcmV0dXJuIGtleXM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVUZXh0SG92ZXJTdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGV4dEhvdmVycy5sZW5ndGg7IGkrKykgewotCQkJYnVmLmFwcGVuZChmVGV4dEhvdmVyc1tpXS5nZXRJZCgpKTsKLQkJCWJ1Zi5hcHBlbmQoVGV4dEhvdmVyTWFuYWdlci5IT1ZFUl9BVFRSSUJVVEVfU0VQQVJBVE9SKTsKLQkJCWJ1Zi5hcHBlbmQoQm9vbGVhbi50b1N0cmluZyhmVGV4dEhvdmVyc1tpXS5pc0VuYWJsZWQoKSkpOwotCQkJYnVmLmFwcGVuZChUZXh0SG92ZXJNYW5hZ2VyLkhPVkVSX0FUVFJJQlVURV9TRVBBUkFUT1IpOwotCQkJU3RyaW5nIG1vZGlmaWVyID0gZlRleHRIb3ZlcnNbaV0uZ2V0TW9kaWZpZXJTdHJpbmcoKTsKLQkJCWlmIChtb2RpZmllciA9PSBudWxsIHx8IG1vZGlmaWVyLmxlbmd0aCgpID09IDApCi0JCQkJbW9kaWZpZXIgPSBUZXh0SG92ZXJNYW5hZ2VyLk5PX01PRElGSUVSOwotCQkJYnVmLmFwcGVuZChtb2RpZmllcik7Ci0JCQlidWYuYXBwZW5kKFRleHRIb3Zlck1hbmFnZXIuSE9WRVJfU0VQQVJBVE9SKTsKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0SG92ZXJNYW5hZ2VyIGdldFRleHRIb3Zlck1hbmFnZXIoKSB7Ci0JCXJldHVybiBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGV4dEhvdmVyTWFuYWdlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNnZXRUaXRsZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIFNTRVVJTWVzc2FnZXMuVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl90aXRsZTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXZvaWQgaGFuZGxlSG92ZXJMaXN0U2VsZWN0aW9uKCkgewotCQlpbnQgaSA9IGZIb3ZlclRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0KLQkJaWYgKGkgPT0gLTEpIHsKLQkJCWlmIChmSG92ZXJUYWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpID09IDApCi0JCQkJZk1vZGlmaWVyRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiBlbmFibGVkID0gZlRleHRIb3ZlcnNbaV0uaXNFbmFibGVkKCk7Ci0JCWZNb2RpZmllckVkaXRvci5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmTW9kaWZpZXJFZGl0b3Iuc2V0VGV4dChmVGV4dEhvdmVyc1tpXS5nZXRNb2RpZmllclN0cmluZygpKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZlRleHRIb3ZlcnNbaV0uZ2V0RGVzY3JpcHRpb24oKTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlkZXNjcmlwdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZEZXNjcmlwdGlvbi5zZXRUZXh0KGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlTW9kaWZpZXJNb2RpZmllZCgpIHsKLQkJaW50IGkgPSBmSG92ZXJUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaSA9PSAtMSkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgbW9kaWZpZXJzID0gZk1vZGlmaWVyRWRpdG9yLmdldFRleHQoKTsKLQkJZlRleHRIb3ZlcnNbaV0uc2V0TW9kaWZpZXJTdHJpbmcobW9kaWZpZXJzKTsKLQotCQkvLyB1cGRhdGUgdGFibGUKLQkJZkhvdmVyVGFibGVWaWV3ZXIucmVmcmVzaChmVGV4dEhvdmVyc1tpXSk7Ci0KLQkJdXBkYXRlU3RhdHVzKGZUZXh0SG92ZXJzW2ldKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJcmVzdG9yZUZyb21PdmVybGF5KCk7Ci0JCWZIb3ZlclRhYmxlVmlld2VyLnNldElucHV0KGZUZXh0SG92ZXJzKTsKLQotCQlpbml0aWFsaXplRmllbGRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVRhYiNpbml0aWFsaXplRmllbGRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRmllbGRzKCkgewotCQlzdXBlci5pbml0aWFsaXplRmllbGRzKCk7Ci0KLQkJZk1vZGlmaWVyRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkvLyBpbml0aWFsaXplIGNoZWNrYm94ZXMgaW4gaG92ZXIgdGFibGUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGV4dEhvdmVycy5sZW5ndGg7IGkrKykKLQkJCWZIb3ZlclRhYmxlLmdldEl0ZW0oaSkuc2V0Q2hlY2tlZChmVGV4dEhvdmVyc1tpXS5pc0VuYWJsZWQoKSk7Ci0JCWZIb3ZlclRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuSVByZWZlcmVuY2VUYWIjcGVyZm9ybUFwcGx5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0JCXBlcmZvcm1PaygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1PaygpIHsKLQkJU3RyaW5nIHRleHRIb3ZlclN0cmluZyA9IGdlbmVyYXRlVGV4dEhvdmVyU3RyaW5nKCk7Ci0JCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKEVkaXRvclByZWZlcmVuY2VOYW1lcy5FRElUT1JfVEVYVF9IT1ZFUl9NT0RJRklFUlMsIHRleHRIb3ZlclN0cmluZyk7Ci0JCWdldFRleHRIb3Zlck1hbmFnZXIoKS5yZXNldFRleHRIb3ZlcnMoKTsgLy8gbm90aWZ5IHRleHQgaG92ZXIgbWFuYWdlcgotCQkvLyBpdCBzaG91bGQgcmVzZXQgdG8gZ2V0Ci0JCS8vIGxhdGVzdCBwcmVmZXJlbmNlcwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyBmVGV4dEhvdmVycyB3aXRoIHRleHQgaG92ZXIgZGVzY3JpcHRpb24gZnJvbSB0aGUgb3ZlcmxheQotCSAqIHN0b3JlICh3aGljaCBpcyB0aGUgcHJlZmVyZW5jZXMpCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVGcm9tT3ZlcmxheSgpIHsKLQkJU3RyaW5nIGRlc2NyaXB0b3JzU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKEVkaXRvclByZWZlcmVuY2VOYW1lcy5FRElUT1JfVEVYVF9IT1ZFUl9NT0RJRklFUlMpOwotCQlmVGV4dEhvdmVycyA9IGdldFRleHRIb3Zlck1hbmFnZXIoKS5nZW5lcmF0ZVRleHRIb3ZlckRlc2NyaXB0b3JzKGRlc2NyaXB0b3JzU3RyaW5nKTsKLQl9Ci0KLQl2b2lkIHVwZGF0ZVN0YXR1cyhUZXh0SG92ZXJNYW5hZ2VyLlRleHRIb3ZlckRlc2NyaXB0b3IgaG92ZXJDb25maWcpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzSW5mbygpOwotCi0JCWlmIChob3ZlckNvbmZpZyAhPSBudWxsICYmIGhvdmVyQ29uZmlnLmlzRW5hYmxlZCgpICYmIEVkaXRvclV0aWxpdHkuY29tcHV0ZVN0YXRlTWFzayhob3ZlckNvbmZpZy5nZXRNb2RpZmllclN0cmluZygpKSA9PSAtMSkKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXNJbmZvKElTdGF0dXMuRVJST1IsIE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9tb2RpZmllcklzTm90VmFsaWQsIG5ldyBTdHJpbmdbXXtob3ZlckNvbmZpZy5nZXRNb2RpZmllclN0cmluZygpfSkpOwotCi0JCWludCBpID0gMDsKLQkJSGFzaE1hcCBzdGF0ZU1hc2tzID0gbmV3IEhhc2hNYXAoZlRleHRIb3ZlcnMubGVuZ3RoKTsKLQkJd2hpbGUgKHN0YXR1cy5pc09LKCkgJiYgaSA8IGZUZXh0SG92ZXJzLmxlbmd0aCkgewotCQkJaWYgKGZUZXh0SG92ZXJzW2ldLmlzRW5hYmxlZCgpKSB7Ci0JCQkJU3RyaW5nIGxhYmVsID0gZlRleHRIb3ZlcnNbaV0uZ2V0TGFiZWwoKTsKLQkJCQlJbnRlZ2VyIHN0YXRlTWFzayA9IG5ldyBJbnRlZ2VyKEVkaXRvclV0aWxpdHkuY29tcHV0ZVN0YXRlTWFzayhmVGV4dEhvdmVyc1tpXS5nZXRNb2RpZmllclN0cmluZygpKSk7Ci0JCQkJaWYgKHN0YXRlTWFzay5pbnRWYWx1ZSgpID09IC0xKQotCQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzSW5mbyhJU3RhdHVzLkVSUk9SLCBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLlRleHRIb3ZlclByZWZlcmVuY2VUYWJfbW9kaWZpZXJJc05vdFZhbGlkRm9ySG92ZXIsIG5ldyBTdHJpbmdbXXtmVGV4dEhvdmVyc1tpXS5nZXRNb2RpZmllclN0cmluZygpLCBsYWJlbH0pKTsKLQkJCQllbHNlIGlmIChzdGF0ZU1hc2tzLmNvbnRhaW5zS2V5KHN0YXRlTWFzaykpCi0JCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXNJbmZvKElTdGF0dXMuRVJST1IsIE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9kdXBsaWNhdGVNb2RpZmllciwgbmV3IFN0cmluZ1tde2xhYmVsLCAoU3RyaW5nKSBzdGF0ZU1hc2tzLmdldChzdGF0ZU1hc2spfSkpOwotCQkJCWVsc2UKLQkJCQkJc3RhdGVNYXNrcy5wdXQoc3RhdGVNYXNrLCBsYWJlbCk7Ci0JCQl9Ci0JCQlpKys7Ci0JCX0KLQotCQl1cGRhdGVTdGF0dXMoc3RhdHVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvVHJhbnNsdWNlbmN5UHJlZmVyZW5jZVRhYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1RyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA4YTk5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvVHJhbnNsdWNlbmN5UHJlZmVyZW5jZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JbnRlZ2VyRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlN0cmluZ0ZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNsdWNlbmN5UHJlZmVyZW5jZVRhYiBpbXBsZW1lbnRzIElQcmVmZXJlbmNlVGFiIHsKLQotCXByaXZhdGUgUHJlZmVyZW5jZVBhZ2UgZk1haW5QcmVmZXJlbmNlUGFnZTsKLQlwcml2YXRlIEludGVnZXJGaWVsZEVkaXRvciBmVHJhbnNsdWNlbmN5U2NhbGUgPSBudWxsOwotCXByaXZhdGUgZmluYWwgaW50IE1BWF9QRVJDRU5UQUdFID0gMTAwOwotCi0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB2YWxpZGl0eUNoYW5nZUxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoRmllbGRFZGl0b3IuSVNfVkFMSUQpKQotCQkJCXVwZGF0ZVZhbGlkU3RhdGUoKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFRyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFRyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWIoUHJlZmVyZW5jZVBhZ2UgbWFpblByZWZlcmVuY2VQYWdlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobWFpblByZWZlcmVuY2VQYWdlKTsKLQkJc2V0TWFpblByZWZlcmVuY2VQYWdlKG1haW5QcmVmZXJlbmNlUGFnZSk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuSVByZWZlcmVuY2VUYWIjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSB0YWJGb2xkZXIpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyLCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJU3RyaW5nIHRleHQgPSBTU0VVSU1lc3NhZ2VzLlRyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWJfMTsgLy8kTk9OLU5MUy0xJAotCQlmVHJhbnNsdWNlbmN5U2NhbGUgPSBuZXcgSW50ZWdlckZpZWxkRWRpdG9yKEVkaXRvclByZWZlcmVuY2VOYW1lcy5SRUFEX09OTFlfRk9SRUdST1VORF9TQ0FMRSwgdGV4dCwgY29tcG9zaXRlKTsKLQotCQlmVHJhbnNsdWNlbmN5U2NhbGUuc2V0RXJyb3JNZXNzYWdlKEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiU3RyaW5nRmllbGRFZGl0b3IuZXJyb3JNZXNzYWdlIikpOy8vJE5PTi1OTFMtMSQKLQkJZlRyYW5zbHVjZW5jeVNjYWxlLnNldFByZWZlcmVuY2VTdG9yZShnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCWZUcmFuc2x1Y2VuY3lTY2FsZS5zZXRQcmVmZXJlbmNlUGFnZShnZXRNYWluUHJlZmVyZW5jZVBhZ2UoKSk7Ci0JCWZUcmFuc2x1Y2VuY3lTY2FsZS5zZXRUZXh0TGltaXQoSW50ZWdlci50b1N0cmluZyhNQVhfUEVSQ0VOVEFHRSkubGVuZ3RoKCkpOwotCQlmVHJhbnNsdWNlbmN5U2NhbGUuc2V0VmFsaWRhdGVTdHJhdGVneShTdHJpbmdGaWVsZEVkaXRvci5WQUxJREFURV9PTl9LRVlfU1RST0tFKTsKLQkJZlRyYW5zbHVjZW5jeVNjYWxlLnNldFZhbGlkUmFuZ2UoMCwgTUFYX1BFUkNFTlRBR0UpOwotCQlmVHJhbnNsdWNlbmN5U2NhbGUubG9hZCgpOwotCQlmVHJhbnNsdWNlbmN5U2NhbGUuc2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih2YWxpZGl0eUNoYW5nZUxpc3RlbmVyKTsKLQotLy8JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuUFJFRldFQlhfUkVBRE9OTFlfSEVMUElEKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZNYWluUHJlZmVyZW5jZVBhZ2UuCi0JICovCi0JcHJpdmF0ZSBQcmVmZXJlbmNlUGFnZSBnZXRNYWluUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXJldHVybiBmTWFpblByZWZlcmVuY2VQYWdlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJlZmVyZW5jZSBzdG9yZSB1c2VkIGluIHRoaXMgdGFiCi0JICovCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuSVByZWZlcmVuY2VUYWIjZ2V0VGl0bGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiBTU0VVSU1lc3NhZ2VzLlRyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWJfMDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNwZXJmb3JtQXBwbHkoKQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLQkJZlRyYW5zbHVjZW5jeVNjYWxlLnN0b3JlKCk7Ci0JCVNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuSVByZWZlcmVuY2VUYWIjcGVyZm9ybURlZmF1bHRzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWZUcmFuc2x1Y2VuY3lTY2FsZS5sb2FkRGVmYXVsdCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1PaygpIHsKLQkJcGVyZm9ybUFwcGx5KCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1haW5QcmVmZXJlbmNlUGFnZQotCSAqICAgICAgICAgICAgVGhlIGZNYWluUHJlZmVyZW5jZVBhZ2UgdG8gc2V0LgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNYWluUHJlZmVyZW5jZVBhZ2UoUHJlZmVyZW5jZVBhZ2UgbWFpblByZWZlcmVuY2VQYWdlKSB7Ci0JCWZNYWluUHJlZmVyZW5jZVBhZ2UgPSBtYWluUHJlZmVyZW5jZVBhZ2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVZhbGlkU3RhdGUoKSB7Ci0JCWlmIChnZXRNYWluUHJlZmVyZW5jZVBhZ2UoKSAhPSBudWxsKSB7Ci0JCQlnZXRNYWluUHJlZmVyZW5jZVBhZ2UoKS5zZXRWYWxpZChmVHJhbnNsdWNlbmN5U2NhbGUuaXNWYWxpZCgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL0Fic3RyYWN0U3RydWN0dXJlZENvbW1lbnRGb2xkaW5nUG9zaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL0Fic3RyYWN0U3RydWN0dXJlZENvbW1lbnRGb2xkaW5nUG9zaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0NjY1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9BYnN0cmFjdFN0cnVjdHVyZWRDb21tZW50Rm9sZGluZ1Bvc2l0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uSVByb2plY3Rpb25Qb3NpdGlvbjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgZm9sZGluZyBwb3NpdGlvbiBmb3IgYW4gWE1MIGNvbW1lbnQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RydWN0dXJlZENvbW1lbnRGb2xkaW5nUG9zaXRpb24gZXh0ZW5kcyBQb3NpdGlvbiBpbXBsZW1lbnRzIElQcm9qZWN0aW9uUG9zaXRpb24gewotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBvZiB0aGUgZm9sZGluZyBwb3NpdGlvbgotCSAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgZm9saWRuZyBwb3NpdGlvbgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFN0cnVjdHVyZWRDb21tZW50Rm9sZGluZ1Bvc2l0aW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIob2Zmc2V0LCBsZW5ndGgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uSVByb2plY3Rpb25Qb3NpdGlvbiNjb21wdXRlQ2FwdGlvbk9mZnNldChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXB1dGVDYXB0aW9uT2Zmc2V0KElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZpbmRGaXJzdENvbnRlbnQoZG9jdW1lbnQuZ2V0KG9mZnNldCwgbGVuZ3RoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLklQcm9qZWN0aW9uUG9zaXRpb24jY29tcHV0ZVByb2plY3Rpb25SZWdpb25zKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyBJUmVnaW9uW10gY29tcHV0ZVByb2plY3Rpb25SZWdpb25zKElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJLy9nZXQgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbW1lbnQKLQkJU3RyaW5nIGNvbnRlbnQgPSBkb2N1bWVudC5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCQlpbnQgY29udGVudFN0YXJ0ID0gZmluZEZpcnN0Q29udGVudChjb250ZW50KTsKLQkJCi0JCS8vZmluZCB0aGUgc3RhcnQgbGluZSBvZiB0aGUgY29tbWVudAotCQkvL2ZpbmQgdGhlIGVuZCBsaW5lIG9mIHRoZSBjb21tZW50Ci0JCS8vZmluZCB0aGUgZmlyc3QgbGluZSBvZiB0ZXh0IGluIHRoZSBjb21tZW50Ci0JCWludCBzdGFydExpbmVOdW0gPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCUlSZWdpb24gc3RhcnRMaW5lID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKHN0YXJ0TGluZU51bSk7Ci0JCWludCBlbmRMaW5lTnVtID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGdldEVuZE9mZnNldCgpKSArMTsKLQkJSVJlZ2lvbiBlbmRMaW5lID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGVuZExpbmVOdW0pOwotCQlpbnQgY2FwdGlvbkxpbmVOdW0gPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZ2V0U3RhcnRPZmZzZXQoKSArIGNvbnRlbnRTdGFydCk7Ci0JCQotCQlpbnQgZm9sZE9mZnNldDsJCQkKLQkJaW50IGZvbGRFbmRPZmZzZXQ7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWZvbGRPZmZzZXQgPSBzdGFydExpbmUuZ2V0T2Zmc2V0KCk7Ci0JCQlpZihmb2xkT2Zmc2V0IDwgb2Zmc2V0KSB7Ci0JCQkJb2Zmc2V0ID0gZm9sZE9mZnNldDsKLQkJCX0KLQkJCi0JCQlmb2xkRW5kT2Zmc2V0ID0gZW5kTGluZS5nZXRPZmZzZXQoKTsKLQkJCi0JCQlpZigoZm9sZEVuZE9mZnNldC1vZmZzZXQpID4gbGVuZ3RoKSB7Ci0JCQkJbGVuZ3RoID0gZm9sZEVuZE9mZnNldC1vZmZzZXQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vZm9sZCBiZWZvcmUgdGhlIGZpcnN0IGxpbmUgb2YgdGV4dCBpbiB0aGUgY29tbWVudAotCQlJUmVnaW9uIHByZVJlZ2lvbiA9IG51bGw7Ci0JCUlSZWdpb24gcG9zdFJlZ2lvbiA9IG51bGw7Ci0JCWlmKHN0YXJ0TGluZU51bSA8IGNhcHRpb25MaW5lTnVtKSB7Ci0JCQlJUmVnaW9uIGNhcHRpb25MaW5lID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGNhcHRpb25MaW5lTnVtKTsKLQkJCXByZVJlZ2lvbiA9IG5ldyBSZWdpb24oZm9sZE9mZnNldCwgY2FwdGlvbkxpbmUuZ2V0T2Zmc2V0KCktZm9sZE9mZnNldCk7Ci0JCX0KLQkJCi0JCS8vZm9sZCBhZnRlciB0aGUgZmlyc3QgbGluZSBvZiB0ZXh0IGluIHRoZSBjb21tZW50Ci0JCWlmKGNhcHRpb25MaW5lTnVtIDwgZW5kTGluZU51bSkgewotCQkJaW50IHBvc3RSZWdpb25PZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGNhcHRpb25MaW5lTnVtKzEpOwotCQkJcG9zdFJlZ2lvbiA9IG5ldyBSZWdpb24ocG9zdFJlZ2lvbk9mZnNldCwgZm9sZEVuZE9mZnNldC1wb3N0UmVnaW9uT2Zmc2V0KTsKLQkJfQotCQkKLQkJSVJlZ2lvbltdIHJlZ2lvbnMgPSBudWxsOwotCQlpZihwcmVSZWdpb24gIT0gbnVsbCAmJiBwb3N0UmVnaW9uICE9IG51bGwpIHsKLQkJCXJlZ2lvbnMgPSBuZXcgSVJlZ2lvbltdIHtwcmVSZWdpb24sIHBvc3RSZWdpb259OwotCQl9IGVsc2UgaWYocHJlUmVnaW9uICE9IG51bGwpIHsKLQkJCXJlZ2lvbnMgPSBuZXcgSVJlZ2lvbltdIHtwcmVSZWdpb259OwotCQl9IGVsc2UgaWYocG9zdFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZWdpb25zID0gbmV3IElSZWdpb25bXSB7cG9zdFJlZ2lvbn07Ci0JCX0KLQkJCi0JCXJldHVybiByZWdpb25zOwotCX0KLQkKLQkvKioKLQkgKiBGaW5kcyB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBpZGVudGlmaWVyIHBhcnQgd2l0aGluIDxjb2RlPmNvbnRlbnQ8L2NvZGU+LgotCSAqIFJldHVybnMgMCBpZiBub25lIGlzIGZvdW5kLgotCSAqCi0JICogQHBhcmFtIGNvbnRlbnQgdGhlIGNvbnRlbnQgdG8gc2VhcmNoCi0JICogQHBhcmFtIHByZWZpeEVuZCB0aGUgZW5kIG9mIHRoZSBwcmVmaXgKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBpbmRleCBvZiBhIHVuaWNvZGUgaWRlbnRpZmllciBwYXJ0LCBvciB6ZXJvIGlmIG5vbmUgY2FuCi0JICogICAgICAgICBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgaW50IGZpbmRGaXJzdENvbnRlbnQoZmluYWwgQ2hhclNlcXVlbmNlIGNvbnRlbnQpIHsKLQkJaW50IGxlbmdodD0gY29udGVudC5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGxlbmdodDsgaSsrKSB7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzVW5pY29kZUlkZW50aWZpZXJQYXJ0KGNvbnRlbnQuY2hhckF0KGkpKSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBmb2xkaW5nIHBvc2l0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRTdGFydE9mZnNldCgpOwotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGVuZCBvZmZzZXQgb2YgdGhlIGZvbGRpbmcgcG9zaXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGdldEVuZE9mZnNldCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9BYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nUG9zaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL0Fic3RyYWN0U3RydWN0dXJlZEZvbGRpbmdQb3NpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGRiNDdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL0Fic3RyYWN0U3RydWN0dXJlZEZvbGRpbmdQb3NpdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uSVByb2plY3Rpb25Qb3NpdGlvbjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgc2luZ2xlIGZvbGRpbmcgcG9zaXRpb24gaW4gYW4gPGNvZGU+SVN0cnVjdHVyZWREb2N1bWVudDwvY29kZT4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RydWN0dXJlZEZvbGRpbmdQb3NpdGlvbiBleHRlbmRzIFBvc2l0aW9uIGltcGxlbWVudHMgSVByb2plY3Rpb25Qb3NpdGlvbiB7Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBvZiB0aGUgZm9sZGluZyBwb3NpdGlvbgotCSAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgZm9saWRuZyBwb3NpdGlvbgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nUG9zaXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlzdXBlcihvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5JUHJvamVjdGlvblBvc2l0aW9uI2NvbXB1dGVDYXB0aW9uT2Zmc2V0KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcHV0ZUNhcHRpb25PZmZzZXQoSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIDA7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5JUHJvamVjdGlvblBvc2l0aW9uI2NvbXB1dGVQcm9qZWN0aW9uUmVnaW9ucyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbltdIGNvbXB1dGVQcm9qZWN0aW9uUmVnaW9ucyhJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCQotCQlpbnQgc3RhcnRMaW5lTnVtID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGdldFN0YXJ0T2Zmc2V0KCkpICsgMTsKLQkJSVJlZ2lvbiBzdGFydExpbmUgPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24oc3RhcnRMaW5lTnVtKTsKLQkJaW50IGVuZExpbmVOdW0gPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZ2V0RW5kT2Zmc2V0KCkpICsgMTsKLQkJSVJlZ2lvbiBlbmRMaW5lID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGVuZExpbmVOdW0pOwotCQkKLQkJaW50IGZvbGRPZmZzZXQ7CQkJCi0JCWludCBmb2xkRW5kT2Zmc2V0OwotCQkKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlmb2xkT2Zmc2V0ID0gc3RhcnRMaW5lLmdldE9mZnNldCgpOwotCQkJaWYoZm9sZE9mZnNldCA8IG9mZnNldCkgewotCQkJCW9mZnNldCA9IGZvbGRPZmZzZXQ7Ci0JCQl9Ci0JCQotCQkJZm9sZEVuZE9mZnNldCA9IGVuZExpbmUuZ2V0T2Zmc2V0KCk7Ci0JCQotCQkJaWYoKGZvbGRFbmRPZmZzZXQtb2Zmc2V0KSA+IGxlbmd0aCkgewotCQkJCWxlbmd0aCA9IGZvbGRFbmRPZmZzZXQtb2Zmc2V0OwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbmV3IElSZWdpb25bXSB7bmV3IFJlZ2lvbihmb2xkT2Zmc2V0LCBmb2xkRW5kT2Zmc2V0LWZvbGRPZmZzZXQpfTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBmb2xkaW5nIHBvc2l0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRTdGFydE9mZnNldCgpOwotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGVuZCBvZmZzZXQgb2YgdGhlIGZvbGRpbmcgcG9zaXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGdldEVuZE9mZnNldCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb2plY3Rpb24vQWJzdHJhY3RTdHJ1Y3R1cmVkRm9sZGluZ1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9BYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4Njg0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9BYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLklQcm9qZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5BYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5TdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcDsKLQotLyoqCi0gKiA8cD5UaGlzIGNsYXNzIGhhcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgYSBzdHJ1Y3R1cmVkIGVkaXRvciBmb2xkaW5nIHN0cmF0ZWd5LgotICogRWFjaCBjb250ZW50IHR5cGUgdGhhdCB0aGUgc3RydWN0dXJlZCBlZGl0b3Igc3VwcG9ydHMgc2hvdWxkIGNyZWF0ZSBhbiBleHRlbnNpb24gcG9pbnQKLSAqIHNwZWNpZnlpbmcgYSBjaGlsZCBjbGFzcyBvZiB0aGlzIGNsYXNzIGFzIGl0cyBmb2xkaW5nIHN0cmF0ZWd5LCBpZiB0aGF0IGNvbnRlbnQgdHlwZQotICogc2hvdWxkIGhhdmUgZm9sZGluZy48L3A+Ci0gKiAKLSAqIDxwPkVYOjxiciAvPgotICogPGNvZGU+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIiZndDs8YnIgLz4KLSAqICAmbHQ7cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uPGJyIC8+Ci0gKgkJCXR5cGU9ImZvbGRpbmdzdHJhdGVneSI8YnIgLz4KLSAqCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbi5YTUxGb2xkaW5nU3RyYXRlZ3kiPGJyIC8+Ci0gKgkJCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLyZndDs8YnIgLz4KLSAqCSZsdDsvZXh0ZW5zaW9uJmd0OzwvY29kZT48L3A+Ci0gKiAKLSAqIDxwPkRpZmZlcmVudCBjb250ZW50IHR5cGVzIGNhbiB1c2UgdGhlIHNhbWUgZm9sZGluZyBzdHJhdGVneSBpZiBpdCBtYWtlcyBzZW5zZSB0byBkbyBzbywKLSAqIHN1Y2ggYXMgd2l0aCBIVE1ML1hNTC9KU1AuPC9wPgotICogCi0gKiA8cD5UaGlzIHN0cmF0ZWd5IGlzIGJhc2VkIG9uIHRoZSBSZWNvbmNpbGVyIHBhcmFkaWdtIGFuZCB0aHVzIHJ1bnMgaW4gdGhlIGJhY2tncm91bmQsCi0gKiB0aGlzIG1lYW5zIHRoYXQgZXZlbiBmb3IgdmVyeSBsYXJnZSBkb2N1bWVudHMgcmVxdWlyaW5nIHRoZSBjYWxjdWxhdGlvbiBvZiAxMDAwcyBvZgotICogZm9sZGluZyBhbm5vdGF0aW9ucyB0aGUgdXNlciB3aWxsIG5vdCBiZSBlZmZlY3RlZCBleGNlcHQgZm9yIHRoZSBhbm5vdGF0aW9ucyBtYXkgdGFrZQotICogc29tZSB0aW1lIHRvIGZpcnN0IGFwcGVhci48L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nU3RyYXRlZ3kKLQlleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSVByb2plY3Rpb25MaXN0ZW5lciB7Ci0JCi0JLyoqCi0JICogVGhlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiBwcm92aXNpb25hbENvbmZpZ3VyYXRpb24gdHlwZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImZvbGRpbmdzdHJhdGVneSI7IC8vJE5PTi1OTFMtMSQgCi0JCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgY29udHJvbHMgd2hldGhlciBmb2xkaW5nIGlzIGVuYWJsZWQgaW4gdGhlCi0JICogU3RydWN0dXJlZCBUZXh0IGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT0xESU5HX0VOQUJMRUQgPSAiZm9sZGluZ0VuYWJsZWQiOyAvLyROT04tTkxTLTEkIAotCQotCS8qKgotCSAqIFRoZSBhbm5vdGF0aW9uIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZvbGRpbmcgc3RyYXRlZ3kKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCBmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbDsKLQkKLQkvKioKLQkgKiBUaGUgc3RydWN0dXJlZCB0ZXh0IHZpZXdlciB0aGlzIGZvbGRpbmcgc3RyYXRlZ3kgaXMgYXNzb2NpYXRlZCB3aXRoCi0JICovCi0JcHJpdmF0ZSBQcm9qZWN0aW9uVmlld2VyIGZWaWV3ZXI7Ci0JCi0JLyoqCi0JICogdGhlc2UgYXJlIG5vdCB1c2VkIGJ1dCBuZWVkZWQgdG8gaW1wbGVtZW50IGFic3RyYWN0IG1ldGhvZHMKLQkgKi8KLQlwcml2YXRlIElSZWNvbmNpbGVTdGVwIGZGb2xkaW5nU3RlcDsKLQkKLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yIGZvciB0aGUgZm9sZGluZyBzdHJhdGVneSwgY2FuIG5vdCB0YWtlIGFueSBwYXJhbWV0ZXJzCi0JICogYmVjYXVzZSBzdWJjbGFzc2VzIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBjcmVhdGVkIHVzaW5nIHJlZmxlY3Rpb24KLQkgKiBiYXNlZCBvbiBwbHVnaW4gc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RTdHJ1Y3R1cmVkRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgZm9sZGluZyBzdHJhdGVneSBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHZpZXdlciBmb3IgaXQgdG8gZnVuY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIHRoZSB2aWV3ZXIgdG8gYXNzb2NpYXRlIHRoaXMgZm9sZGluZyBzdHJhdGVneSB3aXRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyLnNldFZpZXdlcih2aWV3ZXIpOwotCQkKLQkJaWYoZlZpZXdlciAhPSBudWxsKSB7Ci0JCQlmVmlld2VyLnJlbW92ZVByb2plY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlmVmlld2VyID0gdmlld2VyOwotCQlmVmlld2VyLmFkZFByb2plY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwgPSBmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlzZXREb2N1bWVudChudWxsKTsKLQkJCi0JCWlmKGZWaWV3ZXIgIT0gbnVsbCkgewotCQkJZlZpZXdlci5yZW1vdmVQcm9qZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlmVmlld2VyID0gbnVsbDsKLQkJfQotCQkKLQkJZkZvbGRpbmdTdGVwID0gbnVsbDsKLQkJCi0JCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLkFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5I3NldERvY3VtZW50KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlzdXBlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5JUHJvamVjdGlvbkxpc3RlbmVyI3Byb2plY3Rpb25EaXNhYmxlZCgpCi0JICovCi0JcHVibGljIHZvaWQgcHJvamVjdGlvbkRpc2FibGVkKCkgewotCQlmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLklQcm9qZWN0aW9uTGlzdGVuZXIjcHJvamVjdGlvbkVuYWJsZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25FbmFibGVkKCkgewotCQlpZihmVmlld2VyICE9IG51bGwpIHsKLQkJCWZQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsID0gZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+PGI+Tk9URSAxOjwvYj4gVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiByZWNvbmNpbGUgaWdub3JlcyB0aGUgZ2l2ZW4ge0BsaW5rIElSZWdpb259IGFuZCBpbnN0ZWFkIGdldHMgYWxsIG9mIHRoZQotCSAqIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9ucyBlZmZlY3RlZCBieSB0aGUgcmFuZ2Ugb2YgdGhlIGdpdmVuIHtAbGluayBEaXJ0eVJlZ2lvbn0uPC9wPgotCSAqIAotCSAqIDxwPjxiPk5PVEUgMjo8L2I+IEluIGNhc2VzIHdoZXJlIG11bHRpcGxlIHtAbGluayBJUmVnaW9ufSBtYXliZSBkaXJ0eSBpdCBpcyBtb3JlIGVmZmljaWVudCB0byBwYXNzIG9uZQotCSAqIHtAbGluayBEaXJ0eVJlZ2lvbn0gY29udGFpbiBhbGwgb2YgdGhlIHtAbGluayBJUmVnaW9ufXMgdGhlbiBvbmUge0BsaW5rIERpcnR5UmVnaW9ufSBmb3IgZWFjaCBJUmVnaW9uLgotCSAqIENhc2UgaW4gcG9pbnQsIHdoZW4gcHJvY2Vzc2luZyB0aGUgZW50aXJlIGRvY3VtZW50IGl0IGlzIDxiPnJlY29tbWVuZGVkPC9iPiB0aGF0IHRoaXMgZnVuY3Rpb24gYmUKLQkgKiBjYWxsZWQgb25seSA8Yj5vbmNlPC9iPiB3aXRoIG9uZSB7QGxpbmsgRGlydHlSZWdpb259IHRoYXQgc3BhbnMgdGhlIGVudGlyZSBkb2N1bWVudC48L3A+Ci0JICogCi0JICogQHBhcmFtIGRpcnR5UmVnaW9uIHRoZSByZWdpb24gdGhhdCBuZWVkcyBpdHMgZm9sZGluZyBhbm5vdGF0aW9ucyBwcm9jZXNzZWQKLQkgKiBAcGFyYW0gc3ViUmVnaW9uIGlnbm9yZWQKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLkFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5I3JlY29uY2lsZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGUoRGlydHlSZWdpb24gZGlydHlSZWdpb24sIElSZWdpb24gc3ViUmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZihmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJCQlpZihtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCS8vdXNlIHRoZSBzdHJ1Y3R1cmVkIGRvYyB0byBnZXQgYWxsIG9mIHRoZSByZWdpb25zIGVmZmVjdGVkIGJ5IHRoZSBnaXZlbiBkaXJ0eSByZWdpb24KLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3REb2MgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIHN0cnVjdFJlZ2lvbnMgPSBzdHJ1Y3REb2MuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhkaXJ0eVJlZ2lvbi5nZXRPZmZzZXQoKSwgZGlydHlSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQlTZXQgaW5kZXhlZFJlZ2lvbnMgPSBnZXRJbmRleGVkUmVnaW9ucyhtb2RlbCwgc3RydWN0UmVnaW9ucyk7Ci0KLQkJCQkJLy90aGVzZSBhcmUgd2hhdCBhcmUgcGFzc2VkIG9mZiB0byB0aGUgYW5ub3RhdGlvbiBtb2RlbCB0bwotCQkJCQkvL2FjdHVhbGx5IGNyZWF0ZSBhbmQgbWFpbnRhaW4gdGhlIGFubm90YXRpb25zCi0JCQkJCUxpc3QgbW9kaWZpY2F0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJTGlzdCBkZWxldGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCU1hcCBhZGRpdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQlib29sZWFuIGlzSW5zZXJ0ID0gZGlydHlSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEaXJ0eVJlZ2lvbi5JTlNFUlQpOwotCQkJCQlib29sZWFuIGlzUmVtb3ZlID0gZGlydHlSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEaXJ0eVJlZ2lvbi5SRU1PVkUpOwotCi0JCQkJCS8vZmluZCBhbmQgbWFyayBhbGwgZm9sZGluZyBhbm5vdGF0aW9ucyB3aXRoIGxlbmd0aCAwIGZvciBkZWxldGlvbiAKLQkJCQkJbWFya0ludmFsaWRBbm5vdGF0aW9uc0ZvckRlbGV0aW9uKGRpcnR5UmVnaW9uLCBkZWxldGlvbnMpOwotCQkJCQkKLQkJCQkJLy9yZWNvbmNpbGUgZWFjaCBlZmZlY3RlZCBpbmRleGVkIHJlZ2lvbgotCQkJCQlJdGVyYXRvciBpbmRleGVkUmVnaW9uc0l0ZXIgPSBpbmRleGVkUmVnaW9ucy5pdGVyYXRvcigpOwotCQkJCQl3aGlsZShpbmRleGVkUmVnaW9uc0l0ZXIuaGFzTmV4dCgpICYmIGZQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsICE9IG51bGwpIHsKLQkJCQkJCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKWluZGV4ZWRSZWdpb25zSXRlci5uZXh0KCk7Ci0JCQkJCQotCQkJCQkJLy9vbmx5IHRyeSB0byBjcmVhdGUgYW4gYW5ub3RhdGlvbiBpZiB0aGUgaW5kZXggcmVnaW9uIGlzIGEgdmFsaWQgdHlwZQotCQkJCQkJaWYoaW5kZXhlZFJlZ2lvblZhbGlkVHlwZShpbmRleGVkUmVnaW9uKSkgewotCQkJCQkJCUZvbGRpbmdBbm5vdGF0aW9uIGFubm90YXRpb24gPSBuZXcgRm9sZGluZ0Fubm90YXRpb24oaW5kZXhlZFJlZ2lvbiwgZmFsc2UpOwotCQkJCQkJCQotCQkJCQkJCS8vIGlmIElOU0VSVCBjYWxjdWxhdGUgbmV3IGFkZGl0aW9uIHBvc2l0aW9uIG9yIG1vZGlmaWNhdGlvbgotCQkJCQkJCS8vIGVsc2UgaWYgUkVNT1ZFIGFkZCBhbm5vdGF0aW9uIHRvIHRoZSBkZWxldGlvbiBsaXN0Ci0JCQkJCQkJaWYoaXNJbnNlcnQpIHsKLQkJCQkJCQkJQW5ub3RhdGlvbiBleGlzdGluZ0Fubm8gPSBnZXRFeGlzdGluZ0Fubm90YXRpb24oaW5kZXhlZFJlZ2lvbik7Ci0JCQkJCQkJCS8vaWYgcHJvamVjdGlvbiBoYXMgYmVlbiBkaXNhYmxlZCB0aGUgaXRlciBjb3VsZCBiZSBudWxsCi0JCQkJCQkJCS8vaWYgYW5ub3RhdGlvbiBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGlzIHJlZ2lvbiBjcmVhdGUgYSBuZXcgb25lCi0JCQkJCQkJCS8vZWxzZSBtb2RpZnkgYW4gb2xkIG9uZSwgd2hpY2ggY291bGQgaW5jbHVkZSBkZWxldGlvbgotCQkJCQkJCQlpZihleGlzdGluZ0Fubm8gPT0gbnVsbCkgewotCQkJCQkJCQkJUG9zaXRpb24gbmV3UG9zID0gY2FsY05ld0ZvbGRQb3NpdGlvbihpbmRleGVkUmVnaW9uKTsKLQotCQkJCQkJCQkJaWYobmV3UG9zICE9IG51bGwgJiYgbmV3UG9zLmxlbmd0aCA+IDApIHsKLQkJCQkJCQkJCQlhZGRpdGlvbnMucHV0KGFubm90YXRpb24sIG5ld1Bvcyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQl1cGRhdGVBbm5vdGF0aW9ucyhleGlzdGluZ0Fubm8sIGluZGV4ZWRSZWdpb24sIGFkZGl0aW9ucywgbW9kaWZpY2F0aW9ucywgZGVsZXRpb25zKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSBpZiAoaXNSZW1vdmUpIHsKLQkJCQkJCQkJZGVsZXRpb25zLmFkZChhbm5vdGF0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vYmUgc3VyZSBwcm9qZWN0aW9uIGhhcyBub3QgYmVlbiBkaXNhYmxlZAotCQkJCQlpZihmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkvL3NlbmQgdGhlIGNhbGN1bGF0ZWQgdXBkYXRlcyB0byB0aGUgYW5ub3RhdGlvbnMgdG8gdGhlIGFubm90YXRpb24gbW9kZWwKLQkJCQkJCWZQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsLm1vZGlmeUFubm90YXRpb25zKChBbm5vdGF0aW9uW10pZGVsZXRpb25zLnRvQXJyYXkobmV3IEFubm90YXRpb25bMV0pLCBhZGRpdGlvbnMsIChBbm5vdGF0aW9uW10pbW9kaWZpY2F0aW9ucy50b0FycmF5KG5ldyBBbm5vdGF0aW9uWzBdKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPkV2ZXJ5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBmb2xkaW5nIHN0cmF0ZWd5IGNhbGN1bGF0ZXMgdGhlIHBvc2l0aW9uIGZvciBhIGdpdmVuCi0JICogSW5kZXhlZFJlZ2lvbiBkaWZmZXJlbnRseS4gIEFsc28gdGhpcyBjYWxjdWxhdGlvbiBvZnRlbiByZWxpZXMgb24gY2FzdGluZyB0byBpbnRlcm5hbCBjbGFzc2VzCi0JICogb25seSBhdmFpbGFibGUgaW4gdGhlIGltcGxlbWVudGluZyBjbGFzc2VzIHBsdWdpbjwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXhlZFJlZ2lvbiB0aGUgSW5kZXhlZFJlZ2lvbiB0byBjYWxjdWxhdGUgYSBuZXcgYW5ub3RhdGlvbiBwb3NpdGlvbiBmb3IKLQkgKiBAcmV0dXJuIHRoZSBjYWxjdWxhdGVkIGFubm90YXRpb24gcG9zaXRpb24gb3IgTlVMTCBpZiBub25lIGNhbiBiZSBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBnaXZlbiByZWdpb24KLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgUG9zaXRpb24gY2FsY05ld0ZvbGRQb3NpdGlvbihJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24pOwotCQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHVwZGF0aW5nIGEgZGlydGllZCBJbmRleGVkUmVnaW9uLiAgVGhpcyBmdW5jdGlvbgotCSAqIGNhbiBiZSBvdmVycmlkZGVuIGlmIHNsaWdodGx5IGRpZmZlcmVudCBmdW5jdGlvbmFsaXR5IGlzIHJlcXVpcmVkIGluIGEgc3BlY2lmaWMgaW5zdGFuY2UKLQkgKiBvZiB0aGlzIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBleGlzdGluZ0Fubm90YXRpb25zSXRlciB0aGUgZXhpc3RpbmcgYW5ub3RhdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQKLQkgKiBiYXNlZCBvbiB0aGUgZ2l2ZW4gZGlydGllZCBJbmRleFJlZ2lvbgotCSAqIEBwYXJhbSBkaXJ0eVJlZ2lvbiB0aGUgSW5kZXhlZFJlZ2lvbiB0aGF0IGNhdXNlZCB0aGUgYW5ub3RhdGlvbnMgbmVlZCBmb3IgdXBkYXRpbmcKLQkgKiBAcGFyYW0gbW9kaWZpY2F0aW9ucyB0aGUgbGlzdCBvZiBhbm5vdGF0aW9ucyB0byBiZSBtb2RpZmllZAotCSAqIEBwYXJhbSBkZWxldGlvbnMgdGhlIGxpc3Qgb2YgYW5ub3RhdGlvbnMgdG8gYmUgZGVsZXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFubm90YXRpb25zKEFubm90YXRpb24gZXhpc3RpbmdBbm5vdGF0aW9uLCBJbmRleGVkUmVnaW9uIGRpcnR5UmVnaW9uLCBNYXAgYWRkaXRpb25zLCBMaXN0IG1vZGlmaWNhdGlvbnMsIExpc3QgZGVsZXRpb25zKSB7Ci0JCWlmKGV4aXN0aW5nQW5ub3RhdGlvbiBpbnN0YW5jZW9mIEZvbGRpbmdBbm5vdGF0aW9uKSB7Ci0JCQlGb2xkaW5nQW5ub3RhdGlvbiBmb2xkaW5nQW5ub3RhdGlvbiA9IChGb2xkaW5nQW5ub3RhdGlvbilleGlzdGluZ0Fubm90YXRpb247Ci0JCQlQb3NpdGlvbiBuZXdQb3MgPSBjYWxjTmV3Rm9sZFBvc2l0aW9uKGZvbGRpbmdBbm5vdGF0aW9uLmdldFJlZ2lvbigpKTsKLQotCQkJLy9pZiBhIG5ldyBwb3NpdGlvbiBjYW4gYmUgY2FsY3VsYXRlZCB0aGVuIHVwZGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGFubm90YXRpb24sCi0JCQkvL2Vsc2UgdGhlIGFubm90YXRpb24gbmVlZHMgdG8gYmUgZGVsZXRlZAotCQkJaWYobmV3UG9zICE9IG51bGwgJiYgbmV3UG9zLmxlbmd0aCA+IDAgJiYgZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwgIT0gbnVsbCkgewotCQkJCVBvc2l0aW9uIG9sZFBvcyA9IGZQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsLmdldFBvc2l0aW9uKGZvbGRpbmdBbm5vdGF0aW9uKTsKLQkJCQkvL29ubHkgdXBkYXRlIHRoZSBwb3NpdGlvbiBpZiB3ZSBoYXZlIHRvCi0JCQkJaWYoIW5ld1Bvcy5lcXVhbHMob2xkUG9zKSkgewotCQkJCQlvbGRQb3Muc2V0T2Zmc2V0KG5ld1Bvcy5vZmZzZXQpOwotCQkJCQlvbGRQb3Muc2V0TGVuZ3RoKG5ld1Bvcy5sZW5ndGgpOwotCQkJCQltb2RpZmljYXRpb25zLmFkZChmb2xkaW5nQW5ub3RhdGlvbik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlkZWxldGlvbnMuYWRkKGZvbGRpbmdBbm5vdGF0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPlNlYXJjaGVzIHRoZSBnaXZlbiB7QGxpbmsgRGlydHlSZWdpb259IGZvciBhbm5vdGF0aW9ucyB0aGF0IG5vdyBoYXZlIGEgbGVuZ3RoIG9mIDAuCi0JICogVGhpcyBpcyBjYXVzZWQgd2hlbiBzb21ldGhpbmcgdGhhdCB3YXMgYmVpbmcgZm9sZGVkIGhhcyBiZWVuIGRlbGV0ZWQuICBUaGVzZSB7QGxpbmsgRm9sZGluZ0Fubm90YXRpb259cwotCSAqIGFyZSB0aGVuIGFkZGVkIHRvIHRoZSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIEZvbGRpbmdBbm5vdGF0aW9ufXMgdG8gYmUgZGVsZXRlZDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZGlydHlSZWdpb24gZmluZCB0aGUgbm93IGludmFsaWQge0BsaW5rIEZvbGRpbmdBbm5vdGF0aW9ufXMgaW4gdGhpcyB7QGxpbmsgRGlydHlSZWdpb259Ci0JICogQHBhcmFtIGRlbGV0aW9ucyB0aGUgY3VycmVudCBsaXN0IG9mIHtAbGluayBGb2xkaW5nQW5ub3RhdGlvbn1zIG1hcmtlZCBmb3IgZGVsZXRpb24gdGhhdCB0aGUKLQkgKiBuZXdseSBmb3VuZCBpbnZhbGlkIHtAbGluayBGb2xkaW5nQW5ub3RhdGlvbn1zIHdpbGwgYmUgYWRkZWQgdG8KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtYXJrSW52YWxpZEFubm90YXRpb25zRm9yRGVsZXRpb24oRGlydHlSZWdpb24gZGlydHlSZWdpb24sIExpc3QgZGVsZXRpb25zKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBnZXRBbm5vdGF0aW9uSXRlcmF0b3IoZGlydHlSZWdpb24pOwotCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJQW5ub3RhdGlvbiBhbm5vID0gKEFubm90YXRpb24paXRlci5uZXh0KCk7Ci0JCQlpZihhbm5vIGluc3RhbmNlb2YgRm9sZGluZ0Fubm90YXRpb24pIHsKLQkJCQlQb3NpdGlvbiBwb3MgPSBmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbC5nZXRQb3NpdGlvbihhbm5vKTsKLQkJCQlpZihwb3MubGVuZ3RoID09IDApIHsKLQkJCQkJZGVsZXRpb25zLmFkZChhbm5vKTsKLQkgCQkJfQotCSAJCX0KLQkgCX0KLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIEluZGV4ZWRSZWdpb24gaXMgb25lIHRoYXQgdGhpcyBzdHJhdGVneSBwYXlzIGF0dGVudGlvbiB0bwotCSAqIHdoZW4gY2FsY3VsYXRpbmcgbmV3IGFuZCB1cGRhdGVkIGFubm90YXRpb25zCi0JICogCi0JICogQHBhcmFtIGluZGV4ZWRSZWdpb24gdGhlIEluZGV4ZWRSZWdpb24gdG8gY2hlY2sgdGhlIHR5cGUgb2YKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIEluZGV4ZWRSZWdpb24gaXMgb2YgYSB2YWxpZCB0eXBlLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBpbmRleGVkUmVnaW9uVmFsaWRUeXBlKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbik7Ci0JCi0JLyoqCi0JICogIFN0ZXBzIGFyZSBub3QgdXNlZCBpbiB0aGlzIHN0cmF0ZWd5Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5BYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneSNjb250YWluc1N0ZXAob3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVTdGVwKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zU3RlcChJUmVjb25jaWxlU3RlcCBzdGVwKSB7Ci0JCXJldHVybiBmRm9sZGluZ1N0ZXAuZXF1YWxzKHN0ZXApOwotCX0KLQotCS8qKiAKLQkgKiBTdGVwcyBhcmUgbm90IHVzZWQgaW4gdGhpcyBzdHJhdGVneQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kjY3JlYXRlUmVjb25jaWxlU3RlcHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVJlY29uY2lsZVN0ZXBzKCkgewotCQlmRm9sZGluZ1N0ZXAgPSBuZXcgU3RydWN0dXJlZFJlY29uY2lsZVN0ZXAoKSB7IH07Ci0JfQotCQotCS8qKgotCSAqIEEgRm9sZGluZ0Fubm90YXRpb24gaXMgYSBQcm9qZWN0aW9uQW5ub3RhdGlvbiBpbiBhIHN0cnVjdHVyZWQgZG9jdW1lbnQuCi0JICogSXRzIGV4dGVuZGVkIGZ1bmN0aW9uYWxpdHkgaW5jbHVkZSBzdG9yaW5nIHRoZSA8Y29kZT5JbmRleGVkUmVnaW9uPC9jb2RlPiBpdCBpcyBmb2xkaW5nCi0JICogYW5kIG92ZXJyaWRpbmcgdGhlIHBhaW50IG1ldGhvZCAoaW4gYSBoYWNreSB0eXBlIHdheSkgdG8gcHJldmVudCBvbmUgbGluZSBmb2xkaW5nCi0JICogYW5ub3RhdGlvbnMgdG8gYmUgZHJhd24uCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEZvbGRpbmdBbm5vdGF0aW9uIGV4dGVuZHMgUHJvamVjdGlvbkFubm90YXRpb24gewotCQlwcml2YXRlIGJvb2xlYW4gZklzVmlzaWJsZTsgLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCi0JCS8qKgotCQkgKiBUaGUgSW5kZXhlZFJlZ2lvbiB0aGlzIGFubm90YXRpb24gaXMgZm9sZGluZwotCQkgKi8KLQkJcHJpdmF0ZSBJbmRleGVkUmVnaW9uIGZSZWdpb247Ci0JCQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBGb2xkaW5nQW5ub3RhdGlvbiB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSW5kZXhlZFJlZ2lvbgotCQkgKiAKLQkJICogQHBhcmFtIHJlZ2lvbiB0aGUgSW5kZXhlZFJlZ2lvbiB0aGlzIGFubm90YXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoIAotCQkgKiBAcGFyYW0gaXNDb2xsYXBzZWQgdHJ1ZSBpZiB0aGlzIGFubm90YXRpb24gc2hvdWxkIGJlIGNvbGxhcHNlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0JCSAqLwotCQlwdWJsaWMgRm9sZGluZ0Fubm90YXRpb24oSW5kZXhlZFJlZ2lvbiByZWdpb24sIGJvb2xlYW4gaXNDb2xsYXBzZWQpIHsKLQkJCXN1cGVyKGlzQ29sbGFwc2VkKTsKLQkJCQotCQkJZklzVmlzaWJsZSA9IGZhbHNlOwotCQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIEluZGV4ZWRSZWdpb24gdGhpcyBhbm5vdGF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aAotCQkgKiAKLQkJICogQHJldHVybiB0aGUgSW5kZXhlZFJlZ2lvbiB0aGlzIGFubm90YXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoCi0JCSAqLwotCQlwdWJsaWMgSW5kZXhlZFJlZ2lvbiBnZXRSZWdpb24oKSB7Ci0JCQlyZXR1cm4gZlJlZ2lvbjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFJlZ2lvbihJbmRleGVkUmVnaW9uIHJlZ2lvbikgewotCQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBEb2VzIG5vdCBwYWludCBoaWRkZW4gYW5ub3RhdGlvbnMuIEFubm90YXRpb25zIGFyZSBoaWRkZW4gd2hlbiB0aGV5Ci0JCSAqIG9ubHkgc3BhbiBvbmUgbGluZS4KLQkJICogCi0JCSAqIEBzZWUgUHJvamVjdGlvbkFubm90YXRpb24jcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhcywKLQkJICogICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIENhbnZhcyBjYW52YXMsIFJlY3RhbmdsZSByZWN0YW5nbGUpIHsKLQkJCS8qIHdvcmthcm91bmQgZm9yIEJVRzg1ODc0ICovCi0JCQkvKgotCQkJICogb25seSBuZWVkIHRvIGNoZWNrIGFubm90YXRpb25zIHRoYXQgYXJlIGV4cGFuZGVkIGJlY2F1c2UgaGlkZGVuCi0JCQkgKiBhbm5vdGF0aW9ucyBzaG91bGQgbmV2ZXIgaGF2ZSBiZWVuIGdpdmVuIHRoZSBjaGFuY2UgdG8KLQkJCSAqIGNvbGxhcHNlLgotCQkJICovCi0JCQlpZiAoIWlzQ29sbGFwc2VkKCkpIHsKLQkJCQkvLyB3b3JraW5nIHdpdGggcmVjdGFuZ2xlLCBzbyBsaW5lIGhlaWdodAotCQkJCUZvbnRNZXRyaWNzIG1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQkJCWlmIChtZXRyaWNzICE9IG51bGwpIHsKLQkJCQkJLy8gZG8gbm90IGRyYXcgYW5ub3RhdGlvbnMgdGhhdCBvbmx5IHNwYW4gb25lIGxpbmUgYW5kCi0JCQkJCS8vIG1hcmsgdGhlbSBhcyBub3QgdmlzaWJsZQotCQkJCQlpZiAoKHJlY3RhbmdsZS5oZWlnaHQgLyBtZXRyaWNzLmdldEhlaWdodCgpKSA8PSAxKSB7Ci0JCQkJCQlmSXNWaXNpYmxlID0gZmFsc2U7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmSXNWaXNpYmxlID0gdHJ1ZTsKLQkJCXN1cGVyLnBhaW50KGdjLCBjYW52YXMsIHJlY3RhbmdsZSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25Bbm5vdGF0aW9uI21hcmtDb2xsYXBzZWQoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbWFya0NvbGxhcHNlZCgpIHsKLQkJCS8qIHdvcmthcm91bmQgZm9yIEJVRzg1ODc0ICovCi0JCQkvLyBkbyBub3QgbWFyayBjb2xsYXBzZWQgaWYgYW5ub3RhdGlvbiBpcyBub3QgdmlzaWJsZQotCQkJaWYgKGZJc1Zpc2libGUpCi0JCQkJc3VwZXIubWFya0NvbGxhcHNlZCgpOwotCQl9Ci0JCQotCQkvKioKLQkJICogVHdvIEZvbGRpbmdBbm5vdGF0aW9ucyBhcmUgZXF1YWwgaWYgdGhlaXIgSW5kZXhlZFJlZ2lvbnMgYXJlIGVxdWFsCi0JCSAqIAotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJYm9vbGVhbiBlcXVhbCA9IGZhbHNlOwotCQkJCi0JCQlpZihvYmogaW5zdGFuY2VvZiBGb2xkaW5nQW5ub3RhdGlvbikgewotCQkJCWVxdWFsID0gZlJlZ2lvbi5lcXVhbHMoKChGb2xkaW5nQW5ub3RhdGlvbilvYmopLmZSZWdpb24pOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gZXF1YWw7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgb2YgdGhlIEluZGV4ZWRSZWdpb24gdGhpcyBhbm5vdGF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aAotCQkgKiAKLQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkJICovCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gZlJlZ2lvbi5oYXNoQ29kZSgpOwotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgdG9TdHJpbmcgb2YgdGhlIGFJbmRleGVkUmVnaW9uIHRoaXMgYW5ub3RhdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGgKLQkJICogCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIGZSZWdpb24udG9TdHJpbmcoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiBhIHtAbGluayBEaXJ0eVJlZ2lvbn0gcmV0dXJucyBhbiB7QGxpbmsgSXRlcmF0b3J9IG9mIHRoZSBhbHJlYWR5IGV4aXN0aW5nCi0JICogYW5ub3RhdGlvbnMgaW4gdGhhdCByZWdpb24uCi0JICogCi0JICogQHBhcmFtIGRpcnR5UmVnaW9uIHRoZSB7QGxpbmsgRGlydHlSZWdpb259IHRvIGNoZWNrIGZvciBleGlzdGluZyBhbm5vdGF0aW9ucyBpbgotCSAqIAotCSAqIEByZXR1cm4gYW4ge0BsaW5rIEl0ZXJhdG9yfSBvdmVyIHRoZSBhbm5vdGF0aW9ucyBpbiB0aGUgZ2l2ZW4ge0BsaW5rIERpcnR5UmVnaW9ufS4KLQkgKiBUaGUgaXRlcmF0b3IgY291bGQgaGF2ZSBubyBhbm5vdGF0aW9ucyBpbiBpdC4gT3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvamVjdGlvbiBoYXMKLQkgKiBiZWVuIGRpc2FibGVkLgotCSAqLwotCXByaXZhdGUgSXRlcmF0b3IgZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uKSB7Ci0JCUl0ZXJhdG9yIGFubm9JdGVyID0gbnVsbDsgCi0JCS8vYmUgc3VyZSBwcm9qZWN0IGhhcyBub3QgYmVlbiBkaXNhYmxlZAotCQlpZihmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCAhPSBudWxsKSB7Ci0JCQkvL3dvcmthcm91bmQgZm9yIFBsYXRmb3JtIEJ1ZyAyOTk0MTYKLQkJCWludCBvZmZzZXQgPSBkaXJ0eVJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCWlmKG9mZnNldCA+IDApIHsKLQkJCQlvZmZzZXQtLTsKLQkJCX0KLQkJCWFubm9JdGVyID0gZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKG9mZnNldCwgZGlydHlSZWdpb24uZ2V0TGVuZ3RoKCksIGZhbHNlLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIGFubm9JdGVyOwotCX0KLQotCS8qKgotCSAqIDxwPkdldHMgdGhlIGZpcnN0IHtAbGluayBBbm5vdGF0aW9ufSBhdCB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBnaXZlbiB7QGxpbmsgSW5kZXhlZFJlZ2lvbn0uPC9wPgotCSAqIAotCSAqIEBwYXJhbSBpbmRleGVkUmVnaW9uIGdldCB0aGUgZmlyc3Qge0BsaW5rIEFubm90YXRpb259IGF0IHRoaXMge0BsaW5rIEluZGV4ZWRSZWdpb259Ci0JICogQHJldHVybiB0aGUgZmlyc3Qge0BsaW5rIEFubm90YXRpb259IGF0IHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIGdpdmVuIHtAbGluayBJbmRleGVkUmVnaW9ufQotCSAqLwotCXByaXZhdGUgQW5ub3RhdGlvbiBnZXRFeGlzdGluZ0Fubm90YXRpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbC5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCAxLCBmYWxzZSwgdHJ1ZSk7Ci0JCUFubm90YXRpb24gYW5ubyA9IG51bGw7Ci0JCWlmKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlhbm5vID0gKEFubm90YXRpb24paXRlci5uZXh0KCk7Ci0JCX0KLQotCQlyZXR1cm4gYW5ubzsKLQl9Ci0KLQkvKioKLQkgKiA8cD5HZXRzIGFsbCBvZiB0aGUge0BsaW5rIEluZGV4ZWRSZWdpb259cyBmcm9tIHRoZSBnaXZlbiB7QGxpbmsgSVN0cnVjdHVyZWRNb2RlbH0gc3BhbmQgYnkgdGhlIGdpdmVuCi0JICoge0BsaW5rIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb259cy48L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZGVsIHRoZSB7QGxpbmsgSVN0cnVjdHVyZWRNb2RlbH0gdXNlZCB0byBnZXQgdGhlIHtAbGluayBJbmRleGVkUmVnaW9ufXMKLQkgKiBAcGFyYW0gc3RydWN0UmVnaW9ucyBnZXQgdGhlIHtAbGluayBJbmRleGVkUmVnaW9ufXMgc3Bhbm5lZCBieSB0aGVzZSB7QGxpbmsgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbn1zCi0JICogQHJldHVybiB0aGUge0BsaW5rIFNldH0gb2Yge0BsaW5rIEluZGV4ZWRSZWdpb259cyBmcm9tIHRoZSBnaXZlbiB7QGxpbmsgSVN0cnVjdHVyZWRNb2RlbH0gc3BhbmVkIGJ5IHRoZQotCSAqIGdpdmVuIHtAbGluayBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9ufXMuCi0JICovCi0JcHJpdmF0ZSBTZXQgZ2V0SW5kZXhlZFJlZ2lvbnMoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIHN0cnVjdFJlZ2lvbnMpIHsKLQkJU2V0IGluZGV4ZWRSZWdpb25zID0gbmV3IEhhc2hTZXQoKTsKLQotCQkvL2ZvciBlYWNoIHRleHQgcmVnaW9uIGluIGVhY2ggc3RydWN0IGRvYyByZWdpb24gZmluZCB0aGUgaW5kZXhlZCByZWdpb24gaXQgc3BhbnMvaXMgaW4KLQkJZm9yKGludCBzdHJ1Y3RSZWdpb25JbmRleCA9IDA7IHN0cnVjdFJlZ2lvbkluZGV4IDwgc3RydWN0UmVnaW9ucy5sZW5ndGggJiYgZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwgIT0gbnVsbDsgKytzdHJ1Y3RSZWdpb25JbmRleCkgewotCQkJSVRleHRSZWdpb25MaXN0IHRleHRSZWdpb25zID0gc3RydWN0UmVnaW9uc1tzdHJ1Y3RSZWdpb25JbmRleF0uZ2V0UmVnaW9ucygpOwotCQkJZm9yKGludCB0ZXh0UmVnaW9uSW5kZXggPSAwOyB0ZXh0UmVnaW9uSW5kZXggPCB0ZXh0UmVnaW9ucy5zaXplKCkgJiYgZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwgIT0gbnVsbDsgKyt0ZXh0UmVnaW9uSW5kZXgpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gc3RydWN0UmVnaW9uc1tzdHJ1Y3RSZWdpb25JbmRleF0uZ2V0U3RhcnRPZmZzZXQodGV4dFJlZ2lvbnMuZ2V0KHRleHRSZWdpb25JbmRleCkpOwotCQkJCWluZGV4ZWRSZWdpb25zLmFkZChtb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb25zOwotCSB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9BZGFwdGVyUHJvcGVydHlTaGVldEVudHJ5TGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQWRhcHRlclByb3BlcnR5U2hlZXRFbnRyeUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThmOTE5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9BZGFwdGVyUHJvcGVydHlTaGVldEVudHJ5TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotCi1wdWJsaWMgY2xhc3MgQWRhcHRlclByb3BlcnR5U2hlZXRFbnRyeUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9wZXJ0eVNoZWV0RW50cnkpIHsKLQkJCXJldHVybiAoKElQcm9wZXJ0eVNoZWV0RW50cnkpIGVsZW1lbnQpLmdldEltYWdlKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlJUHJvcGVydHlTaGVldEVudHJ5IGVudHJ5ID0gKElQcm9wZXJ0eVNoZWV0RW50cnkpICgoSU5vZGVOb3RpZmllcikgZWxlbWVudCkuZ2V0QWRhcHRlckZvcihJUHJvcGVydHlTaGVldEVudHJ5LmNsYXNzKTsKLQkJCWlmIChlbnRyeSAhPSBudWxsKQotCQkJCXJldHVybiBlbnRyeS5nZXRJbWFnZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9wZXJ0eVNoZWV0RW50cnkpIHsKLQkJCXJldHVybiAoKElQcm9wZXJ0eVNoZWV0RW50cnkpIGVsZW1lbnQpLmdldFZhbHVlQXNTdHJpbmcoKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlQcm9wZXJ0eVNoZWV0RW50cnkgZW50cnkgPSAoSVByb3BlcnR5U2hlZXRFbnRyeSkgKChJTm9kZU5vdGlmaWVyKSBlbGVtZW50KS5nZXRBZGFwdGVyRm9yKElQcm9wZXJ0eVNoZWV0RW50cnkuY2xhc3MpOwotCQkJaWYgKGVudHJ5ICE9IG51bGwpCi0JCQkJcmV0dXJuIGVudHJ5LmdldFZhbHVlQXNTdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9Db25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgxY2IyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9Db25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVBhZ2VTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2tWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb247Ci0KLQotLyoqCi0gKiBBIGNvbmZpZ3VyYWJsZSBJUHJvcGVydHlTaGVldFBhZ2Ugc2luY2UgdGhlIHN0YW5kYXJkIFByb3BlcnR5U2hlZXRQYWdlIGRvZXMKLSAqIG5vdCBleHBvc2UgaXRzIHZpZXdlciBmaWVsZC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVNoZWV0UGFnZSB7Ci0JcHJpdmF0ZSBjbGFzcyBOdWxsUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiB7Ci0JCXB1YmxpYyBJUHJvcGVydHlTb3VyY2VQcm92aWRlciBnZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKElQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gX0RFQlVHID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvcHJvcGVydHlTaGVldCIpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJDs7Ci0KLQlwcml2YXRlIGxvbmcgX0RFQlVHX1RJTUUgPSAwOwotCi0JcHJpdmF0ZSBQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBmQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIE9iamVjdFtdIGZTZWxlY3RlZEVudHJpZXMgPSBudWxsOwotCXByaXZhdGUgSVNlbGVjdGlvbiBmSW5wdXQgPSBudWxsOwotCXByaXZhdGUgSU1lbnVNYW5hZ2VyIGZNZW51TWFuYWdlcjsKLQotCXByaXZhdGUgUmVtb3ZlQWN0aW9uIGZSZW1vdmVBY3Rpb247Ci0KLQlwcml2YXRlIElTdGF0dXNMaW5lTWFuYWdlciBmU3RhdHVzTGluZU1hbmFnZXI7Ci0KLQlwcml2YXRlIElUb29sQmFyTWFuYWdlciBmVG9vbEJhck1hbmFnZXI7Ci0KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIE5VTExfQ09ORklHVVJBVElPTiA9IG5ldyBOdWxsUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24oKTsKLQotCXB1YmxpYyBDb25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihnZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcih0aGlzKSk7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzZXRDb25maWd1cmF0aW9uKG51bGwpOwotCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2VsZWN0aW9uU2VydmljZSgpLnJlbW92ZVBvc3RTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlNlbGVjdGVkRW50cmllcyA9IG51bGw7Ci0JCWZJbnB1dCA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJaWYgKGZDb25maWd1cmF0aW9uID09IG51bGwpCi0JCQlmQ29uZmlndXJhdGlvbiA9IE5VTExfQ09ORklHVVJBVElPTjsKLQkJcmV0dXJuIGZDb25maWd1cmF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGhhbmRsZUVudHJ5U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChnZXRDb250cm9sKCkgIT0gbnVsbCAmJiAhZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSAmJiBzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJc3VwZXIuaGFuZGxlRW50cnlTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCWZTZWxlY3RlZEVudHJpZXMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZTZWxlY3RlZEVudHJpZXMgPSBudWxsOwotCQkJfQotCQkJZlJlbW92ZUFjdGlvbi5zZXRFbmFibGVkKCFzZWxlY3Rpb24uaXNFbXB0eSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVBhZ2VTaXRlIHBhZ2VTaXRlKSB7Ci0JCXN1cGVyLmluaXQocGFnZVNpdGUpOwotCQlwYWdlU2l0ZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuYWRkUG9zdFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1ha2VDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwgSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLCBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsKLQkJc3VwZXIubWFrZUNvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLCBzdGF0dXNMaW5lTWFuYWdlcik7Ci0JCWZNZW51TWFuYWdlciA9IG1lbnVNYW5hZ2VyOwotCQlmVG9vbEJhck1hbmFnZXIgPSB0b29sQmFyTWFuYWdlcjsKLQkJZlN0YXR1c0xpbmVNYW5hZ2VyID0gc3RhdHVzTGluZU1hbmFnZXI7Ci0KLQkJZlJlbW92ZUFjdGlvbiA9IG5ldyBSZW1vdmVBY3Rpb24odGhpcyk7Ci0JCXRvb2xCYXJNYW5hZ2VyLmFkZChmUmVtb3ZlQWN0aW9uKTsKLQkJbWVudU1hbmFnZXIuYWRkKGZSZW1vdmVBY3Rpb24pOwotCQlnZXRDb25maWd1cmF0aW9uKCkuYWRkQ29udHJpYnV0aW9ucyhtZW51TWFuYWdlciwgdG9vbEJhck1hbmFnZXIsIHN0YXR1c0xpbmVNYW5hZ2VyKTsKLQotCQltZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0JfQotCi0Jdm9pZCByZW1vdmUoKSB7Ci0JCWlmIChmU2VsZWN0ZWRFbnRyaWVzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGVudHJpZXMgPSBmU2VsZWN0ZWRFbnRyaWVzOwotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBmSW5wdXQ7Ci0JCQlib29sZWFuIG5lZWRzUmVmcmVzaCA9IGZhbHNlOwotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJSVByb3BlcnR5U291cmNlIHNvdXJjZSA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKHRoaXMpLmdldFByb3BlcnR5U291cmNlKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UgaW5zdGFuY2VvZiBJUHJvcGVydHlTb3VyY2VFeHRlbnNpb24pIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoZW50cmllc1tpXSBpbnN0YW5jZW9mIElQcm9wZXJ0eVNoZWV0RW50cnkpIHsKLQkJCQkJCQlJUHJvcGVydHlTaGVldEVudHJ5IGVudHJ5ID0gKElQcm9wZXJ0eVNoZWV0RW50cnkpIGVudHJpZXNbaV07Ci0JCQkJCQkJbmVlZHNSZWZyZXNoID0gdHJ1ZTsKLQkJCQkJCQkoKElQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbikgc291cmNlKS5yZW1vdmVQcm9wZXJ0eShlbnRyeS5nZXREaXNwbGF5TmFtZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChuZWVkc1JlZnJlc2gpIHsKLQkJCQlyZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEZpbHRlciB0aGUgc2VsZWN0aW9uIHRocm91Z2ggdGhlIGN1cnJlbnQgQ29uZmlndXJhdGlvbi4gTm90IGV2ZXJ5Ci0JICogc2VsZWN0aW9uIHJlY2VpdmVkIGlzIGEgU3RydWN0dXJlZCBzZWxlY3Rpb24gbm9yIGFyZSB0aGUgU3RydWN0dXJlZAotCSAqIHNlbGVjdGlvbidzIGVsZW1lbnRzIGFsbCB0byBiZSBkaXNwbGF5ZWQuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChfREVCVUcpIHsKLQkJCV9ERUJVR19USU1FID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJLy8gc2tpcCBpZiB3ZSdyZSB0aGUgc291cmNlIG9mIHRoaXMgc2VsZWN0aW9uCi0JCWlmIChwYXJ0ICE9IG51bGwgJiYgcGFydCBpbnN0YW5jZW9mIFBhZ2VCb29rVmlldykgewotCQkJaWYgKCgoUGFnZUJvb2tWaWV3KSBwYXJ0KS5nZXRDdXJyZW50UGFnZSgpID09IHRoaXMpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXRDb250cm9sKCkgIT0gbnVsbCAmJiBnZXRDb250cm9sKCkuaXNWaXNpYmxlKCkpIHsKLQkJCUlTZWxlY3Rpb24gcHJlZmVycmVkU2VsZWN0aW9uID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldElucHV0U2VsZWN0aW9uKHBhcnQsIHNlbGVjdGlvbik7Ci0JCQkvKgotCQkJICogRG8gc29tZSBtaW5vciBjYWNoaW5nIG9mIHRoZSBzZWxlY3Rpb24uCi0JCQkgKiAKLQkJCSAqIEFzIGEgUHJvcGVydHlTaGVldFBhZ2UsIHdlJ3ZlIGFsd2F5cyBub3RpZmllZCBvZiBzZWxlY3Rpb24KLQkJCSAqIGNoYW5nZXMsIGJ1dCB3ZSd2ZSBhbHNvIHN1YnNjcmliZWQgdG8gcG9zdCBzZWxlY3Rpb24KLQkJCSAqIG5vdGlmaWNhdGlvbiBzbyB3ZSBjYW4gdHJhY2sgY2FyZXQgbW92ZW1lbnRzIGluIHNvdXJjZSB2aWV3ZXJzLgotCQkJICogV2hlbiBzZWxlY3RpbmcgYSBibG9jayBvZiB0ZXh0LCB3ZSdyZSB0aHVzIG5vdGlmaWVkIG9mIHRoZSBuZXcKLQkJCSAqIHNlbGVjdGlvbiB0d2ljZS4gUmVtZW1iZXJpbmcgd2hhdCBvdXIgbGFzdCAqZWZmZWN0aXZlKgotCQkJICogc2VsZWN0aW9uIHdhcyBhbGxvd3MgdXMgdG8gY3V0IG91dCBtb3N0IG9mIHRoZQotCQkJICogZG91YmxlLW5vdGlmaWNhdGlvbiBwZW5hbHR5LgotCQkJICovCi0JCQlpZiAoIXByZWZlcnJlZFNlbGVjdGlvbi5lcXVhbHMoZklucHV0KSkgewotCQkJCWZJbnB1dCA9IHByZWZlcnJlZFNlbGVjdGlvbjsKLQkJCQlmU2VsZWN0ZWRFbnRyaWVzID0gbnVsbDsKLQkJCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHBhcnQsIHByZWZlcnJlZFNlbGVjdGlvbik7Ci0JCQl9Ci0KLQkJCWlmIChfREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIihQOnNlcnZpY2UgIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIF9ERUJVR19USU1FKSArICJtcykgIiArIHBhcnQgKyAiIDogIiArICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHByZWZlcnJlZFNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKF9ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJbc2tpcHBlZF0gKFA6IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIF9ERUJVR19USU1FKSArICJtcykgIiArIHBhcnQgKyAiIDogIiArIHNlbGVjdGlvbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotCSAqICAgICAgICAgICAgVGhlIGNvbmZpZ3VyYXRpb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb24oUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlpZiAoZkNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJZkNvbmZpZ3VyYXRpb24ucmVtb3ZlQ29udHJpYnV0aW9ucyhmTWVudU1hbmFnZXIsIGZUb29sQmFyTWFuYWdlciwgZlN0YXR1c0xpbmVNYW5hZ2VyKTsKLQkJCWZDb25maWd1cmF0aW9uLnVuY29uZmlndXJlKCk7Ci0JCX0KLQotCQlmQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0KLQkJaWYgKGZDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCXNldFByb3BlcnR5U291cmNlUHJvdmlkZXIoZkNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcih0aGlzKSk7Ci0JCQlmQ29uZmlndXJhdGlvbi5hZGRDb250cmlidXRpb25zKGZNZW51TWFuYWdlciwgZlRvb2xCYXJNYW5hZ2VyLCBmU3RhdHVzTGluZU1hbmFnZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXN1cGVyLnNldEZvY3VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ3VzdG9tUHJvcGVydHlEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9DdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0ODYxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9DdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotCi1wdWJsaWMgY2xhc3MgQ3VzdG9tUHJvcGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgUHJvcGVydHlEZXNjcmlwdG9yIHsKLQotCXByb3RlY3RlZCBDbGFzcyBjZWxsRWRpdG9yQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHByb3BlcnR5IGRlc2NyaXB0b3Igd2l0aCBhIHVuaXF1ZSBuYW1lIGFuZCBhIGRpc3BsYXkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIHRoZSBpZCBmb3IgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIGRpc3BsYXlOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSB0byBkaXNwbGF5IGZvciB0aGUgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBpZCwgU3RyaW5nIG5ld0Rpc3BsYXlOYW1lLCBDbGFzcyBlZGl0b3JDbGFzcykgewotCQlzdXBlcihpZCwgbmV3RGlzcGxheU5hbWUpOwotCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKSBpZCk7Ci0JCXNldENlbGxFZGl0b3JDbGFzcyhlZGl0b3JDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHByb3BlcnR5IGRlc2NyaXB0b3Igd2l0aCBhIHVuaXF1ZSBuYW1lIGFuZCBhIGRpc3BsYXkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gdW5pcXVlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHVuaXF1ZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSBkaXNwbGF5TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgdG8gZGlzcGxheSBmb3IgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIEN1c3RvbVByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgdW5pcXVlTmFtZSwgU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7Ci0JCXRoaXModW5pcXVlTmFtZSwgbmV3RGlzcGxheU5hbWUsIFRleHRDZWxsRWRpdG9yLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgQ2VsbEVkaXRvciBjcmVhdGVQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBnZXRQcm9wZXJ0eUVkaXRvcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRDZWxsRWRpdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiBjZWxsRWRpdG9yQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdG9yIHVzZWQgdG8gZWRpdCB0aGUgcHJvcGVydHkuCi0JICogCi0JICogQHJldHVybiBhbiBlZGl0b3IgZm9yIHRoZSBwcm9wZXJ0eQotCSAqLwotCXByb3RlY3RlZCBDZWxsRWRpdG9yIGdldFByb3BlcnR5RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGdldENlbGxFZGl0b3JDbGFzcygpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb25zdHJ1Y3RvciA9IGdldENlbGxFZGl0b3JDbGFzcygpLmdldERlY2xhcmVkQ29uc3RydWN0b3IobmV3IENsYXNzW117Q29tcG9zaXRlLmNsYXNzfSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0JCQlyZXR1cm4gbmV3IFRleHRDZWxsRWRpdG9yKHBhcmVudCk7Ci0JCX0KLQkJaWYgKGNvbnN0cnVjdG9yICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIChDZWxsRWRpdG9yKSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W117cGFyZW50fSk7Ci0JCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGllKSB7Ci0JCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IFRleHRDZWxsRWRpdG9yKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2VsbEVkaXRvckNsYXNzKENsYXNzIG5ld0NlbGxFZGl0b3JDbGFzcykgewotCQljZWxsRWRpdG9yQ2xhc3MgPSBuZXdDZWxsRWRpdG9yQ2xhc3M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvUmVtb3ZlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9SZW1vdmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAyYTEyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9SZW1vdmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByaXZhdGUgQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2UgZlBhZ2U7Ci0KLQlwdWJsaWMgUmVtb3ZlQWN0aW9uKENvbmZpZ3VyYWJsZVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJc3VwZXIoKTsKLQkJZlBhZ2UgPSBwYWdlOwotCQlzZXRUZXh0KGdldFRleHQoKSk7Ci0JCXNldFRvb2xUaXBUZXh0KGdldFRleHQoKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VMQ0xfREVMRVRFKSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRExDTF9ERUxFVEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZ2V0VGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5SZW1vdmVBY3Rpb25fMDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWZQYWdlLnJlbW92ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1Nob3dQcm9wZXJ0aWVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9TaG93UHJvcGVydGllc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGIwNTUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1Nob3dQcm9wZXJ0aWVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TaG93Vmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotCi0vKioKLSAqIFN1cmZhY2VzIHRoZSBQcm9wZXJ0aWVzIHZpZXcKLSAqLwotcHVibGljIGNsYXNzIFNob3dQcm9wZXJ0aWVzQWN0aW9uIGV4dGVuZHMgU2hvd1ZpZXdBY3Rpb24gewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBWSUVXX0lEID0gIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJU2VsZWN0aW9uUHJvdmlkZXIgZlNlbGVjdGlvblByb3ZpZGVyOwotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgZlBhcnQ7Ci0KLQlwdWJsaWMgU2hvd1Byb3BlcnRpZXNBY3Rpb24oKSB7Ci0JCXN1cGVyKFNTRVVJTWVzc2FnZXMuU2hvd1Byb3BlcnRpZXNBY3Rpb25fMCwgRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUFJPUF9QUykpOyAvLyROT04tTkxTLTEkCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgSUhlbHBDb250ZXh0SWRzLkNPTlRNTlVfUFJPUEVSVElFU19IRUxQSUQpOwotCX0KLQotCXB1YmxpYyBTaG93UHJvcGVydGllc0FjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJdGhpcygpOwotCQlmU2VsZWN0aW9uUHJvdmlkZXIgPSBwcm92aWRlcjsKLQkJZlBhcnQgPSBwYXJ0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Vmlld0lEKCkgewotCQlyZXR1cm4gVklFV19JRDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXN1cGVyLnJ1bigpOwotCi0JCWlmIChmU2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJVmlld1BhcnQgZmluZFZpZXcgPSBwYWdlLmZpbmRWaWV3KGdldFZpZXdJRCgpKTsKLQkJCQlpZiAoZmluZFZpZXcgaW5zdGFuY2VvZiBJU2VsZWN0aW9uTGlzdGVuZXIgJiYgZlBhcnQgIT0gbnVsbCkgewotCQkJCQkoKElTZWxlY3Rpb25MaXN0ZW5lcikgZmluZFZpZXcpLnNlbGVjdGlvbkNoYW5nZWQoZlBhcnQsIGZTZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmaW5kVmlldy5nZXRWaWV3U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKGZTZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3ByZWZlcmVuY2VzL0NvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3ByZWZlcmVuY2VzL0NvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWFhMzBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9wcmVmZXJlbmNlcy9Db21tb25FZGl0b3JQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkVkaXRvclByZWZlcmVuY2VOYW1lczsKLQotLyoqCi0gKiBDb21tb24gZWRpdG9yIHByZWZlcmVuY2Uga2V5cyB1c2VkIGJ5IHRoZSBTdHJ1Y3R1cmVkIFRleHQgRWRpdG9yLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBDb21tb25FZGl0b3JQcmVmZXJlbmNlTmFtZXMoKSB7Ci0JCS8vIGVtcHR5IHByaXZhdGUgY29uc3RydWN0b3Igc28gdXNlcnMgY2Fubm90IGluc3RhbnRpYXRlIGNsYXNzCi0JfQotCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgY29udHJvbHMgYXMteW91LXR5cGUgdmFsaWRhdGlvbgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWQUxVQVRFX1RFTVBPUkFSWV9QUk9CTEVNUyA9IEVkaXRvclByZWZlcmVuY2VOYW1lcy5FVkFMVUFURV9URU1QT1JBUllfUFJPQkxFTVM7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiZjBkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgewotCi0JcHVibGljIHZvaWQgYWRkQWRhcHRlckZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkvLyBUT0RPX2lzc3VlOiBJRG9jdW1lbnRUeXBlSGFuZGxlciBkb2Vzbid0IHNlZW0gY29ycmVjdCBpbiB0aGlzIEFQSS4KLQkvLyByZWV4YW1pbmUgYW5kIHNlZSBpZiBzaG91bGQgYmUgTW9kZWxIYW5kbGVyLCBvciBDb250ZW50VHlwZUlkZW50aWZlcgotCS8vIGluc3RlYWQuCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSURvY3VtZW50VHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbik7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBhZGQgdGhvc2UgZmFjdG9yaWVzIHJlbGF0ZWQgdG8gZW1iZWRkZWQgY29udGVudAotCSAqIHR5cGUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWluaXRpYWxpemVGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMDQzMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFRoaXMgaXMgYmFzaWNhbGx5IGEgImZhY3RvcnkgZm9yIGZhY3RvcmllcyIuIEl0IGlzIHRvIHVzZWQgdG8gYXNzb2NpYXRlCi0gKiAiZWRpdCB0aW1lIiBBZGFwdGVyRmFjdG9yaWVzIHdpdGggYSBTdHJ1Y3R1cmVkTW9kZWwsIGJhc2VkIG9uIHRoZQotICogSVN0cnVjdHVyZWRNb2RlbCdzIENvbnRlbnRUeXBlRGVzY3JpcHRpb24uIEluIHBsdWdpbi54bWwgZmlsZXMsIHRoZXJlCi0gKiBzaG91bGQgYmUgYW4gQWRhcHRlckZhY3RvcnlQcm92aWRlciBkZWZpbmVkIGZvciBldmVyeSBkZWZpbml0aW9uIG9mCi0gKiBDb250ZW50VHlwZURlc2NyaXB0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgewotCi0JLyoqCi0JICogUmV0dXJucyBhbiBJdGVyYXRvciBvdmVyIGEgQ29sbGVjdGlvbiBvZiBBZGFwdGVyRmFjdG9yeVByb3ZpZGVycwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0QWRhcHRlckZhY3RvcmllcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnlFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNDcyNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnlFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlFeHRlbnNpb24gewotCUl0ZXJhdG9yIGdldEFkYXB0ZXJGYWN0b3JpZXMoU3RyaW5nIGNvbnRlbnRUeXBlSUQpOwotCi0JTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzQXNMaXN0KFN0cmluZyBjb250ZW50VHlwZUlEKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZWJmNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsIGltcGxlbWVudHMgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSwgQWRhcHRlckZhY3RvcnlSZWdpc3RyeUV4dGVuc2lvbiB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGluc3RhbmNlID0gbnVsbDsKLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgcHVibGljIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbCgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvLyB0aGlzIG1hcCBleGlzdHMgc28gdGhlcmUgaXMgb25seSBvbmUgcHJvdmlkZXIKLQkvLyBpbnN0YW5jZSBub3QgZHVwbGljYXRlIHByb3ZpZGVycyBmb3IgZGlmZmVyZW50IGNvbnRlbnQgdHlwZXMKLQlwcml2YXRlIEhhc2hNYXAgYWRhcHRlclByb3ZpZGVycyA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQkvKioKLQkgKiBUaGlzIEhhc2hNYXAgY29udGFpbnM6IFtjb250ZW50VHlwZUlkIC0+IGVsZW1lbnQycHJvdmlkZXJNYXBdIHwgVgotCSAqIFtjb25maWd1cmF0aW9uRWxlbWVudCAtPiBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyXQotCSAqIAotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBoYXNoTWFwID0gbnVsbDsKLQotCS8vIHByb3ZpZGVycyB3aXRoIG5vIGNvbnRlbnQgdHlwZSBhc3NvY2lhdGVkCi0JLy8ganVzdCBhZGRlZCB0aHJvdWdoIHRoZSBhZGQoLi4uKSBtZXRob2QKLQlwcml2YXRlIEhhc2hTZXQgdW5hc3NvY2lhdGVkUHJvdmlkZXJzID0gbnVsbDsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRoaXMudW5hc3NvY2lhdGVkUHJvdmlkZXJzID0gbmV3IEhhc2hTZXQoKTsKLQkJdGhpcy5hZGFwdGVyUHJvdmlkZXJzID0gbmV3IEhhc2hNYXAoKTsKLQotCQkvLyBkb2Vzbid0IGluc3RhbnRpYXRlIGNsYXNzZXMsIGp1c3Qgc3RvcmVzIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMKLQkJQWRhcHRlckZhY3RvcnlSZWdpc3RyeVJlYWRlci5yZWFkUmVnaXN0cnkoaGFzaE1hcCk7Ci0JfQotCi0Jdm9pZCBhZGQoQWRhcHRlckZhY3RvcnlQcm92aWRlciBhZGFwdGVyRmFjdG9yeVByb3ZpZGVyKSB7Ci0JCXRoaXMudW5hc3NvY2lhdGVkUHJvdmlkZXJzLmFkZChhZGFwdGVyRmFjdG9yeVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0QWRhcHRlckZhY3RvcmllcygpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkdFVFRJTkcgQUxMIEFEQVBURVIgRkFDVE9SSUVTIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBhZGQgcHJvdmlkZXJzIHRoYXQgaGF2ZSBubyBjb250ZW50IHR5cGUgc3BlY2lmaWNhdGlvbgotCQlyZXN1bHRzLmFkZEFsbCh0aGlzLnVuYXNzb2NpYXRlZFByb3ZpZGVycyk7Ci0JCUl0ZXJhdG9yIGl0ID0gdGhpcy5oYXNoTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlkID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJY29udGVudFR5cGVJZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICsgZm9yOiAiICsgY29udGVudFR5cGVJZCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJcmVzdWx0cy5hZGRBbGwoZ2V0QWRhcHRlckZhY3Rvcmllc0FzTGlzdChjb250ZW50VHlwZUlkKSk7Ci0JCX0KLQotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiByZXN1bHRzLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldEFkYXB0ZXJGYWN0b3JpZXMoU3RyaW5nIGNvbnRlbnRUeXBlSUQpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkdFVFRJTkcgQURBUFRFUiBGQUNUT1JJRVMgZm9yOiAiICsgY29udGVudFR5cGVJRCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBhZGQgcHJvdmlkZXJzIHRoYXQgaGF2ZSBubyBjb250ZW50IHR5cGUgc3BlY2lmaWNhdGlvbgotCQlyZXN1bHRzLmFkZEFsbCh1bmFzc29jaWF0ZWRQcm92aWRlcnMpOwotCi0JCS8vIGFkZCB1bmtub3duIGNvbnRlbnQgdHlwZSBwcm92aWRlcnMgKGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eSkKLQkJcmVzdWx0cy5hZGRBbGwoZ2V0QWRhcHRlckZhY3Rvcmllc0FzTGlzdChBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5UmVhZGVyLlVOS05PV05fQ09OVEVOVF9UWVBFKSk7Ci0KLQkJLy8gYWRkIHByb3ZpZGVycyBmb3Igc3BlY2lmaWMgY29udGVudCB0eXBlCi0JCXJlc3VsdHMuYWRkQWxsKGdldEFkYXB0ZXJGYWN0b3JpZXNBc0xpc3QoUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJRCkpKTsKLQotCi0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdHMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzQXNMaXN0KElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlJQ29udGVudFR5cGUgdHlwZSA9IGNvbnRlbnRUeXBlOwotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlICh0eXBlICE9IG51bGwgJiYgIXR5cGUuZ2V0SWQoKS5lcXVhbHMoSUNvbnRlbnRUeXBlTWFuYWdlci5DVF9URVhUKSkgewotCQkJcmVzdWx0cy5hZGRBbGwoZ2V0QWRhcHRlckZhY3Rvcmllc0FzTGlzdCh0eXBlLmdldElkKCkpKTsKLQkJCXR5cGUgPSB0eXBlLmdldEJhc2VUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JLyoqCi0JICogVXNpbmcgdGhpcyBuZXcgQVBJLCBvbmx5IEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJzIGZvciBhIGNlcnRhaW4gY29udGVudAotCSAqIHR5cGUgYXJlIGluc3RhbnRpYXRlZC4gVGhpcyB3aWxsIGFsbG93IGZvciB0aGUgbWluaW11bSBudW1iZXIgb2YKLQkgKiBwbHVnaW5zIHRvIGJlIGxvYWRlZCByYXRoZXIgdGhhbiBhbGwgdGhhdCBpbXBsZW1lbnQgdGhlIGFkYXB0ZXIgZmFjdG9yeQotCSAqIGV4dGVuc2lvbiBwb2ludC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFR5cGVJRAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzQXNMaXN0KFN0cmluZyBjb250ZW50VHlwZUlEKSB7Ci0KLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIGdldCBlbGVtZW50MlByb3ZpZGVyIG1hcCBmb3Igc3BlY2lmaWVkIGNvbnRlbnQgdHlwZQotCQlPYmplY3QgbyA9IGhhc2hNYXAuZ2V0KGNvbnRlbnRUeXBlSUQpOwotCQlpZiAobyAhPSBudWxsKSB7Ci0JCQkvLyBpbnN0YW50aWF0ZSBpZiBuZWNlc3NhcnkgZnJvbQotCQkJLy8gZWxlbWVudDJhZGFwdGVyRmFjdG9yeVByb3ZpZGVyCi0JCQkvLyBtYXAKLQkJCU1hcCBlbGVtZW50MlByb3ZpZGVyID0gKE1hcCkgbzsKLQkJCUl0ZXJhdG9yIGl0ID0gZWxlbWVudDJQcm92aWRlci5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQkJU3RyaW5nIGNsYXNzbmFtZSA9IG51bGw7Ci0JCQlPYmplY3QgZXhpc3RpbmcgPSBudWxsOwotCQkJQWRhcHRlckZhY3RvcnlQcm92aWRlciBwID0gbnVsbDsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQllbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCW8gPSBlbGVtZW50MlByb3ZpZGVyLmdldChlbGVtZW50KTsKLQkJCQlpZiAobyAhPSBudWxsKSB7Ci0JCQkJCS8vIHRoaXMgcHJvdmlkZXIgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkCi0JCQkJCWlmIChERUJVRykKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWxyZWFkeSBjcmVhdGVkOiAiICsgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQlyZXN1bHRzLmFkZChvKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5lZWQgdG8gY3JlYXRlIHRoZSBwcm92aWRlcgotCQkJCQl0cnkgewotCQkJCQkJY2xhc3NuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLQotCQkJCQkJaWYgKERFQlVHKQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWJvdXQgdG8gY3JlYXRlOiAiICsgY2xhc3NuYW1lKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQkvLyBjaGVjayBpZiB3ZSBjcmVhdGVkIG9uZSBhbHJlYWR5Ci0JCQkJCQlleGlzdGluZyA9IHRoaXMuYWRhcHRlclByb3ZpZGVycy5nZXQoY2xhc3NuYW1lKTsKLQkJCQkJCWlmIChleGlzdGluZyA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gdGhpcyBpcyB0aGUgb25seSBwbGFjZQotCQkJCQkJCS8vIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJzCi0JCQkJCQkJLy8gYXJlIGNyZWF0ZWQKLQkJCQkJCQlwID0gKEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1MpOyAvLyAkTk9OLU5MUy0xJAotCQkJCQkJCXRoaXMuYWRhcHRlclByb3ZpZGVycy5wdXQoY2xhc3NuYW1lLCBwKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXAgPSAoQWRhcHRlckZhY3RvcnlQcm92aWRlcikgZXhpc3Rpbmc7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIGFkZCB0byBlbGVtZW50MlByb3ZpZGVyIGZvciB0aGlzIGNvbnRlbnRUeXBlCi0JCQkJCQllbGVtZW50MlByb3ZpZGVyLnB1dChlbGVtZW50LCBwKTsKLQkJCQkJCS8vIGFkZCB0byByZXN1bHRzIHRvIHJldHVybiBmb3IgdGhpcyBtZXRob2QKLQkJCQkJCXJlc3VsdHMuYWRkKHApOwotCi0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWYgdGhlIHByb3ZpZGVyIHRocm93cyBhbnkgZXhjZXB0aW9uLCBqdXN0IGxvZwotCQkJCQkJLy8gYW5kCi0JCQkJCQkvLyBjb250aW51ZQotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHRzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODNlNWUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MganVzdCBjb252ZXJ0cyB3aGF0J3MgaW4gdGhlIHBsdWdpbnMgcmVnaXN0cnkgaW50byBhIGZvcm0gbW9yZQotICogZWFzaWx5IHVzZWFibGUgYnkgb3RoZXJzLCB0aGUgQ29udGVudFR5cGVSZWdpc3RyeS4KLSAqLwotY2xhc3MgQWRhcHRlckZhY3RvcnlSZWdpc3RyeVJlYWRlciB7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJhZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8vCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHX0NPTlRFTlRfVFlQRSA9ICJjb250ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBR19OQU1FID0gImFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVTktOT1dOX0NPTlRFTlRfVFlQRSA9ICJ1bmtub3duIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogYWRkcyBjb25maWd1cmF0aW9uIGVsZW1lbnQgdG8gY29udGVudFR5cGVJZCBtYXAgW2NvbnRlbnRUeXBlSWQgLT4KLQkgKiBlbGVtZW50MnByb3ZpZGVyTWFwXSB8IFYgW2VsZW1lbnQgLT4gcHJvdmlkZXJdCi0JICogCi0JICogTk9URTogdGhpcyBkb2Vzbid0IGNyZWF0ZSB0aGUgcHJvdmlkZXIgeWV0LCB0aGF0IG11c3QgYmUgZG9uZSBvbiBkZW1hbmQKLQkgKiBhbmQgc3RvcmVkIGluIHRoZSBhcHByb3ByaWF0ZSBlbGVtZW50MnByb3ZpZGVyCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqIEBwYXJhbSBjb250ZW50VHlwZUlkCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEVsZW1lbnRGb3JDb250ZW50VHlwZShIYXNoTWFwIG1hcCwgU3RyaW5nIGNvbnRlbnRUeXBlSWQsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0KLQkJT2JqZWN0IG8gPSBtYXAuZ2V0KGNvbnRlbnRUeXBlSWQpOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQlIYXNoTWFwIGVsZW1lbnQycHJvdmlkZXIgPSBuZXcgSGFzaE1hcCgpOwotCQkJLy8gZG9uJ3QgY3JlYXRlIHRoZSBleGVjdXRhYmxlIGV4dGVuc2lvbiB5ZXQKLQkJCWVsZW1lbnQycHJvdmlkZXIucHV0KGVsZW1lbnQsIG51bGwpOwotCQkJbWFwLnB1dChjb250ZW50VHlwZUlkLCBlbGVtZW50MnByb3ZpZGVyKTsKLQotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkZWQgIiArIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUykgKyAiLCBidXQgZGlkbid0IGNyZWF0ZSBleGVjIGV4dGVuc2lvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBlbHNlIHsKLQkJCS8vIGFkZCBlbGVtZW50IHRvIHVua25vd24gbGlzdCAobm90IGV4ZWN1dGFibGUgZXh0IHlldC4uLikKLQkJCUhhc2hNYXAgZWxlbWVudDJwcm92aWRlciA9IChIYXNoTWFwKSBvOwotCQkJZWxlbWVudDJwcm92aWRlci5wdXQoZWxlbWVudCwgbnVsbCk7Ci0KLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFkZGVkICIgKyBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpICsgIiB0byB1bmtub3duIGxpc3QsIGJ1dCBkaWRuJ3QgY3JlYXRlIGV4ZWMgZXh0ZW5zaW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogdGhlIG1hcCBwYXNzZWQgaW46IFtjb250ZW50VHlwZUlkIC0+IGVsZW1lbnQycHJvdmlkZXJNYXBdIHwgViBbZWxlbWVudCAtPgotCSAqIHByb3ZpZGVyXQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIG1hcAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIEhhc2hNYXAgbWFwKSB7Ci0KLQkJQWRhcHRlckZhY3RvcnlQcm92aWRlciBhZGFwdGVyRmFjdG9yeVByb3ZpZGVyID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTkFNRSkpIHsKLQkJCXRyeSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkcmVuKCk7Ci0JCQkJYm9vbGVhbiBzcGVjaWZpZWRDb250ZW50VHlwZSA9IGZhbHNlOwotCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApIHsKLQkJCQkJLy8gY29udGVudCB0eXBlcyBhcmUgc3BlY2lmaWVkCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChjaGlsZHJlbltpXS5nZXROYW1lKCkuZXF1YWxzKFRBR19DT05URU5UX1RZUEUpKSB7Ci0JCQkJCQkJLy8gaXQncyBwb3NzaWJsZSB0byBoYXZlIG5vbi1jb250ZW50VHlwZSBjaGlsZHJlbnQKLQkJCQkJCQlzcGVjaWZpZWRDb250ZW50VHlwZSA9IHRydWU7Ci0JCQkJCQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gY2hpbGRyZW5baV0uZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCQkJCQkJYWRkRWxlbWVudEZvckNvbnRlbnRUeXBlKG1hcCwgY29udGVudFR5cGUsIGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghc3BlY2lmaWVkQ29udGVudFR5cGUpIHsKLQkJCQkJLy8gbm8gY29udGVudCB0eXBlIGFzc29jaWF0aW9uCi0JCQkJCWFkZEVsZW1lbnRGb3JDb250ZW50VHlwZShtYXAsIFVOS05PV05fQ09OVEVOVF9UWVBFLCBlbGVtZW50KTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlmIHRoZSBwcm92aWRlciB0aHJvd3MgYW55IGV4Y2VwdGlvbiwganVzdCBsb2cgYW5kIGNvbnRpbnVlCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBXZSBzaW1wbHkgcmVxdWlyZSBhbiAnYWRkJyBtZXRob2QsIG9mIHdoYXQgZXZlciBpdCBpcyB3ZSBhcmUgdG8gcmVhZAotCSAqIGludG8KLQkgKi8KLQlzdGF0aWMgdm9pZCByZWFkUmVnaXN0cnkoSGFzaE1hcCBtYXApIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZWFkRWxlbWVudChlbGVtZW50c1tpXSwgbWFwKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IG51bGw7Ci0KLQkvLyAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBBREFQVEVSX0NMQVNTID0gImFkYXB0ZXJDbGFzcyI7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIERPQ19UWVBFX0lEID0gImRvY1R5cGVJZCI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBNSU1FX1RZUEVfTElTVCA9ICJtaW1lVHlwZUxpc3QiOwotCS8vIC8vJE5PTi1OTFMtMSQKLQkvLwotCS8qKgotCSAqIENvbnRlbnRUeXBlUmVnaXN0cnlSZWFkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjgwMTI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyIHsKLQlwcml2YXRlIGNsYXNzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBoYXZlIHRvIGRvIGl0IHRoaXMgd2F5IHNvIG90aGVycyBjYW4gb3ZlcnJpZGUgdGhlIG1ldGhvZAotCQkJaGFuZGxlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZkRvY3VtZW50OwotCXByb3RlY3RlZCBIaWdobGlnaHRlciBmSGlnaGxpZ2h0ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZJbml0aWFsaXplZDsKLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmUHJlZmVyZW5jZUxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQotCS8vcHJpdmF0ZSBJU291cmNlVmlld2VyIGZTb3VyY2VWaWV3ZXIgPSBudWxsOwotCXByb3RlY3RlZCBSZWNvbmNpbGVySGlnaGxpZ2h0ZXIgZlJlY0hpZ2hsaWdodGVyID0gbnVsbDsKLQkKLQkvKiogQ29udGFpbnMgYWxsIHRleHQgYXR0cmlidXRlcyBwZXJ0YWluaW5nIHRvIHRoaXMgbGluZSBzdHlsZSBwcm92aWRlciAqLwotCXByaXZhdGUgSGFzaE1hcCBmVGV4dEF0dHJpYnV0ZXMgPSBudWxsOwotCi0JLy8gd2Uga2VlcCB0cmFjayBvZiBMb2dNZXNzYWdlIHRvIGF2b2lkIHdyaXRpbmcgaHVuZHJlZHMgb2YgbWVzc2FnZXMsCi0JLy8gYnV0IHN0aWxsIGdpdmUgYSBoaW50IHRoYXQgc29tZXRoaW5nIGlzIHdyb25nIHdpdGggYXR0cmlidXRlUHJvdmlkZXJzCi0JLy8gYW5kL29yIHJlZ2lvbnMuCi0JLy8gSXQncyBvbmx5IHdyaXR0ZW4gaW4gdGhlIGNhc2Ugb2YgYSBwcm9ncmFtIGVycm9yLCBidXQgdGhlcmUncyBubyB1c2UKLQkvLyBhZGRpbmcKLQkvLyBzYWx0IHRvIHRoZSB3b3VuZC4KLQkvLyBwcml2YXRlIGJvb2xlYW4gd3JvdGVPbmVMb2dNZXNzYWdlOwotCS8qKgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyKCkgewotCX0KLQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSBjb2xvcktleSBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZSBhbmQgYWRkcyB0aGUgc3R5bGUKLQkgKiBpbmZvcm1hdGlvbiB0byBsaXN0IG9mIFRleHRBdHRyaWJ1dGVzCi0JICogCi0JICogQHBhcmFtIGNvbG9yS2V5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGV4dEF0dHJpYnV0ZShTdHJpbmcgY29sb3JLZXkpIHsKLQkJaWYgKGdldENvbG9yUHJlZmVyZW5jZXMoKSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldENvbG9yUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoY29sb3JLZXkpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCQkJCWJvb2xlYW4gYm9sZCA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzJdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQlib29sZWFuIGl0YWxpYyA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzNdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1s0XSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJYm9vbGVhbiB1bmRlcmxpbmUgPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1s1XSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJaW50IHN0eWxlID0gU1dULk5PUk1BTDsKLQkJCQlpZiAoYm9sZCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChpdGFsaWMpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHJpa2V0aHJvdWdoKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmICh1bmRlcmxpbmUpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCVRleHRBdHRyaWJ1dGUgY3JlYXRlVGV4dEF0dHJpYnV0ZSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgYmFja2dyb3VuZCwgc3R5bGUpOwotCQkJCWdldFRleHRBdHRyaWJ1dGVzKCkucHV0KGNvbG9yS2V5LCBjcmVhdGVUZXh0QXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbW1vbkluaXQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgSGlnaGxpZ2h0ZXIgaGlnaGxpZ2h0ZXIpIHsKLQotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZkhpZ2hsaWdodGVyID0gaGlnaGxpZ2h0ZXI7Ci0JfQotCi0JLyoqCi0JICogdGhpcyB2ZXJzaW9uIGRvZXMgInRyaW0iIHJlZ2lvbnMgdG8gbWF0Y2ggcmVxdWVzdAotCSAqLwotCXByaXZhdGUgU3R5bGVSYW5nZSBjcmVhdGVTdHlsZVJhbmdlKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uLCBUZXh0QXR0cmlidXRlIGF0dHIsIGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCkgewotCQlpbnQgc3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQlpZiAoc3RhcnQgPCBzdGFydE9mZnNldCkKLQkJCXN0YXJ0ID0gc3RhcnRPZmZzZXQ7Ci0JCQotCQkvLyBCYXNlIHRoZSB0ZXh0IGVuZCBvZmZzZXQgb2ZmIG9mIHRoZSwgcG9zc2libHkgYWRqdXN0ZWQsIHN0YXJ0Ci0JCWludCB0ZXh0RW5kID0gc3RhcnQgKyByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQlpbnQgbWF4T2Zmc2V0ID0gc3RhcnRPZmZzZXQgKyBsZW5ndGg7Ci0JCQotCQlpbnQgZW5kID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCS8vIFVzZSB0aGUgZW5kIG9mIHRoZSB0ZXh0IGluIHRoZSByZWdpb24gdG8gYXZvaWQgYXBwbHlpbmcgYmFja2dyb3VuZCBjb2xvciB0byB0cmFpbGluZyB3aGl0ZXNwYWNlCi0JCWlmKHRleHRFbmQgPCBlbmQpCi0JCQllbmQgPSB0ZXh0RW5kOwotCQkvLyBpbnN0ZWFkIG9mIGVuZC1zdGFydD8KLQkJaWYgKGVuZCA+IG1heE9mZnNldCkKLQkJCWVuZCA9IG1heE9mZnNldDsKLQkJU3R5bGVSYW5nZSByZXN1bHQgPSBuZXcgU3R5bGVSYW5nZShzdGFydCwgZW5kIC0gc3RhcnQsIGF0dHIuZ2V0Rm9yZWdyb3VuZCgpLCBhdHRyLmdldEJhY2tncm91bmQoKSwgYXR0ci5nZXRTdHlsZSgpKTsKLQkJaWYoKGF0dHIuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSCkgIT0gMCkgewotCQkJcmVzdWx0LnN0cmlrZW91dCA9IHRydWU7Ci0JCX0KLQkJaWYoKGF0dHIuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwKSB7Ci0JCQlyZXN1bHQudW5kZXJsaW5lID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgY3JlYXRlVGV4dEF0dHJpYnV0ZShSR0IgZm9yZWdyb3VuZCwgUkdCIGJhY2tncm91bmQsIGJvb2xlYW4gYm9sZCkgewotCQlyZXR1cm4gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgYm9sZCA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgY3JlYXRlVGV4dEF0dHJpYnV0ZShSR0IgZm9yZWdyb3VuZCwgUkdCIGJhY2tncm91bmQsIGludCBzdHlsZSkgewotCQlyZXR1cm4gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgc3R5bGUpOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihJVGV4dFJlZ2lvbiByZWdpb24pOwotCQotCXByb3RlY3RlZCBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29sbGVjdGlvbiwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVGb3IocmVnaW9uKTsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRDb2xvclByZWZlcmVuY2VzKCk7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSGlnaGxpZ2h0ZXIgZ2V0SGlnaGxpZ2h0ZXIoKSB7Ci0JCXJldHVybiBmSGlnaGxpZ2h0ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGFzaHRhYmxlIGNvbnRhaW5pbmcgYWxsIHRoZSB0ZXh0IGF0dHJpYnV0ZXMgZm9yIHRoaXMgbGluZQotCSAqIHN0eWxlIHByb3ZpZGVyLiBMYXppbHkgY3JlYXRlcyBhIGhhc2h0YWJsZSBpZiBvbmUgaGFzIG5vdCBhbHJlYWR5IGJlZW4KLQkgKiBjcmVhdGVkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSGFzaE1hcCBnZXRUZXh0QXR0cmlidXRlcygpIHsKLQkJaWYgKGZUZXh0QXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlmVGV4dEF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJbG9hZENvbG9ycygpOwotCQl9Ci0JCXJldHVybiBmVGV4dEF0dHJpYnV0ZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBmb3JjZSBhIGZ1bGwgdXBkYXRlIG9mIHRoZSB0ZXh0IHZpZXdlcgotCQlpZihmUmVjSGlnaGxpZ2h0ZXIgIT0gbnVsbCkKLQkJCWZSZWNIaWdobGlnaHRlci5yZWZyZXNoRGlzcGxheSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIEhpZ2hsaWdodGVyIGhpZ2hsaWdodGVyKSB7Ci0KLQkJY29tbW9uSW5pdChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGhpZ2hsaWdodGVyKTsKLQotCQlpZiAoaXNJbml0aWFsaXplZCgpKQotCQkJcmV0dXJuOwotCi0JCXJlZ2lzdGVyUHJlZmVyZW5jZU1hbmFnZXIoKTsKLQotCQlzZXRJbml0aWFsaXplZCh0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJaW5pdChzdHJ1Y3R1cmVkRG9jdW1lbnQsIChIaWdobGlnaHRlcikgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIFJlY29uY2lsZXJIaWdobGlnaHRlciBoaWdobGlnaHRlcikJewotCQlmRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JCWZSZWNIaWdobGlnaHRlciA9IGhpZ2hsaWdodGVyOwotCQkKLQkJaWYoaXNJbml0aWFsaXplZCgpKQotCQkJcmV0dXJuOwotCQkKLQkJcmVnaXN0ZXJQcmVmZXJlbmNlTWFuYWdlcigpOwotCQkKLQkJc2V0SW5pdGlhbGl6ZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBsZWZ0IGJlY2F1c2UgaXQncyBwdWJsaWMsIGJ1dCB3ZSBhcmVuJ3QgYWRhcHRlcnMgYW55IG1vcmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSBMaW5lU3R5bGVQcm92aWRlci5jbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbml0aWFsaXplZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotCQlyZXR1cm4gZkluaXRpYWxpemVkOwotCX0KLQkKLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBsb2FkQ29sb3JzKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcmVwYXJlUmVnaW9ucyhJVHlwZWRSZWdpb24gdHlwZWRSZWdpb24sIGludCBsaW5lUmVxdWVzdFN0YXJ0LCBpbnQgbGluZVJlcXVlc3RMZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJZmluYWwgaW50IHBhcnRpdGlvblN0YXJ0T2Zmc2V0ID0gdHlwZWRSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCWZpbmFsIGludCBwYXJ0aXRpb25MZW5ndGggPSB0eXBlZFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBnZXREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHBhcnRpdGlvblN0YXJ0T2Zmc2V0KTsKLQkJYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0KLQkJaGFuZGxlZCA9IHByZXBhcmVUZXh0UmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHBhcnRpdGlvblN0YXJ0T2Zmc2V0LCBwYXJ0aXRpb25MZW5ndGgsIGhvbGRSZXN1bHRzKTsKLQotCQlyZXR1cm4gaGFuZGxlZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqIEBwYXJhbSBob2xkUmVzdWx0cwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcHJlcGFyZVRleHRSZWdpb24oSVRleHRSZWdpb25Db2xsZWN0aW9uIGJsb2NrZWRSZWdpb24sIGludCBwYXJ0aXRpb25TdGFydE9mZnNldCwgaW50IHBhcnRpdGlvbkxlbmd0aCwgQ29sbGVjdGlvbiBob2xkUmVzdWx0cykgewotCQlib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKLQkJZmluYWwgaW50IHBhcnRpdGlvbkVuZE9mZnNldCA9IHBhcnRpdGlvblN0YXJ0T2Zmc2V0ICsgcGFydGl0aW9uTGVuZ3RoIC0gMTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBibG9ja2VkUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJaW50IG5SZWdpb25zID0gcmVnaW9ucy5zaXplKCk7Ci0JCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgblJlZ2lvbnM7IGkrKykgewotCQkJcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlUZXh0QXR0cmlidXRlIGF0dHIgPSBudWxsOwotCQkJVGV4dEF0dHJpYnV0ZSBwcmV2aW91c0F0dHIgPSBudWxsOwotCQkJaWYgKGJsb2NrZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA+IHBhcnRpdGlvbkVuZE9mZnNldCkKLQkJCQlicmVhazsKLQkJCWlmIChibG9ja2VkUmVnaW9uLmdldEVuZE9mZnNldChyZWdpb24pIDw9IHBhcnRpdGlvblN0YXJ0T2Zmc2V0KQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JCQkJaGFuZGxlZCA9IHByZXBhcmVUZXh0UmVnaW9uKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHJlZ2lvbiwgcGFydGl0aW9uU3RhcnRPZmZzZXQsIHBhcnRpdGlvbkxlbmd0aCwgaG9sZFJlc3VsdHMpOwotCQkJfSBlbHNlIHsKLQotCQkJCWF0dHIgPSBnZXRBdHRyaWJ1dGVGb3IoYmxvY2tlZFJlZ2lvbiwgcmVnaW9uKTsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWhhbmRsZWQgPSB0cnVlOwotCQkJCQkvLyBpZiB0aGlzIHJlZ2lvbidzIGF0dHIgaXMgdGhlIHNhbWUgYXMgcHJldmlvdXMgb25lLCB0aGVuCi0JCQkJCS8vIGp1c3QgYWRqdXN0IHRoZSBwcmV2aW91cyBzdHlsZSByYW5nZQotCQkJCQkvLyBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlIG9mIG9uZQotCQkJCQkvLyBub3RlOiB0byB1c2UgJ2VxdWFscycgaW4gdGhpcyBjYXNlIGlzIGltcG9ydGFudCwgc2luY2UKLQkJCQkJLy8gc29tZXRpbWVzCi0JCQkJCS8vIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgYXR0cmlidXRlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGEKLQkJCQkJLy8gcmVnaW9uLCBldmVuIHRoZQotCQkJCQkvLyB0aGUgYXR0cmlidXRlIGhhcyB0aGUgc2FtZSB2YWx1ZXMuCi0JCQkJCS8vIFRPRE86IHRoaXMgbmVlZHMgdG8gYmUgaW1wcm92ZWQgdG8gaGFuZGxlIHJlYWRvbmx5Ci0JCQkJCS8vIHJlZ2lvbnMgY29ycmVjdGx5Ci0JCQkJCWlmICgoc3R5bGVSYW5nZSAhPSBudWxsKSAmJiAocHJldmlvdXNBdHRyICE9IG51bGwpICYmIChwcmV2aW91c0F0dHIuZXF1YWxzKGF0dHIpKSkgewotCQkJCQkJc3R5bGVSYW5nZS5sZW5ndGggKz0gcmVnaW9uLmdldExlbmd0aCgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3R5bGVSYW5nZSA9IGNyZWF0ZVN0eWxlUmFuZ2UoYmxvY2tlZFJlZ2lvbiwgcmVnaW9uLCBhdHRyLCBwYXJ0aXRpb25TdGFydE9mZnNldCwgcGFydGl0aW9uTGVuZ3RoKTsKLQkJCQkJCWhvbGRSZXN1bHRzLmFkZChzdHlsZVJhbmdlKTsKLQkJCQkJCS8vIHRlY2huaWNhbGx5IHNwZWFraW5nLCB3ZSBkb24ndCBuZWVkIHRvIHVwZGF0ZQotCQkJCQkJLy8gcHJldmlvdXNBdHRyCi0JCQkJCQkvLyBpbiB0aGUgb3RoZXIgY2FzZSwgYmVjYXVzZSB0aGUgb3RoZXIgY2FzZSBpcyB3aGVuCi0JCQkJCQkvLyBpdCBoYXNuJ3QgY2hhbmdlZAotCQkJCQkJcHJldmlvdXNBdHRyID0gYXR0cjsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXByZXZpb3VzQXR0ciA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBoYW5kbGVkOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwcmVwYXJlVGV4dFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGludCBwYXJ0aXRpb25TdGFydE9mZnNldCwgaW50IHBhcnRpdGlvbkxlbmd0aCwgQ29sbGVjdGlvbiBob2xkUmVzdWx0cykgewotCQlib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKLQkJZmluYWwgaW50IHBhcnRpdGlvbkVuZE9mZnNldCA9IHBhcnRpdGlvblN0YXJ0T2Zmc2V0ICsgcGFydGl0aW9uTGVuZ3RoIC0gMTsKLQkJd2hpbGUgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsICYmIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpIDw9IHBhcnRpdGlvbkVuZE9mZnNldCkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWludCBuUmVnaW9ucyA9IHJlZ2lvbnMuc2l6ZSgpOwotCQkJU3R5bGVSYW5nZSBzdHlsZVJhbmdlID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblJlZ2lvbnM7IGkrKykgewotCQkJCXJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCVRleHRBdHRyaWJ1dGUgYXR0ciA9IG51bGw7Ci0JCQkJVGV4dEF0dHJpYnV0ZSBwcmV2aW91c0F0dHIgPSBudWxsOwotCQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA+IHBhcnRpdGlvbkVuZE9mZnNldCkKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQocmVnaW9uKSA8PSBwYXJ0aXRpb25TdGFydE9mZnNldCkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JCQkJCWJvb2xlYW4gaGFuZGxlZENvbGxlY3Rpb24gPSAocHJlcGFyZVRleHRSZWdpb24oKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgcmVnaW9uLCBwYXJ0aXRpb25TdGFydE9mZnNldCwgcGFydGl0aW9uTGVuZ3RoLCBob2xkUmVzdWx0cykpOwotCQkJCQloYW5kbGVkID0gKCFoYW5kbGVkKSA/IGhhbmRsZWRDb2xsZWN0aW9uIDogaGFuZGxlZDsKLQkJCQl9IGVsc2UgewotCi0JCQkJCWF0dHIgPSBnZXRBdHRyaWJ1dGVGb3Ioc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZWdpb24pOwotCQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCQloYW5kbGVkID0gdHJ1ZTsKLQkJCQkJCS8vIGlmIHRoaXMgcmVnaW9uJ3MgYXR0ciBpcyB0aGUgc2FtZSBhcyBwcmV2aW91cyBvbmUsCi0JCQkJCQkvLyB0aGVuIGp1c3QgYWRqdXN0IHRoZSBwcmV2aW91cyBzdHlsZSByYW5nZQotCQkJCQkJLy8gaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSBvZiBvbmUKLQkJCQkJCS8vIG5vdGU6IHRvIHVzZSAnZXF1YWxzJyBpbiB0aGlzIGNhc2UgaXMgaW1wb3J0YW50LAotCQkJCQkJLy8gc2luY2Ugc29tZXRpbWVzCi0JCQkJCQkvLyBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIGF0dHJpYnV0ZXMgYXJlIGFzc29jaWF0ZWQKLQkJCQkJCS8vIHdpdGggYSByZWdpb24sIGV2ZW4gdGhlCi0JCQkJCQkvLyB0aGUgYXR0cmlidXRlIGhhcyB0aGUgc2FtZSB2YWx1ZXMuCi0JCQkJCQkvLyBUT0RPOiB0aGlzIG5lZWRzIHRvIGJlIGltcHJvdmVkIHRvIGhhbmRsZSByZWFkb25seQotCQkJCQkJLy8gcmVnaW9ucyBjb3JyZWN0bHkKLQkJCQkJCWlmICgoc3R5bGVSYW5nZSAhPSBudWxsKSAmJiAocHJldmlvdXNBdHRyICE9IG51bGwpICYmIChwcmV2aW91c0F0dHIuZXF1YWxzKGF0dHIpKSkgewotCQkJCQkJCXN0eWxlUmFuZ2UubGVuZ3RoICs9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc3R5bGVSYW5nZSA9IGNyZWF0ZVN0eWxlUmFuZ2Uoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZWdpb24sIGF0dHIsIHBhcnRpdGlvblN0YXJ0T2Zmc2V0LCBwYXJ0aXRpb25MZW5ndGgpOwotCQkJCQkJCWhvbGRSZXN1bHRzLmFkZChzdHlsZVJhbmdlKTsKLQkJCQkJCQkvLyB0ZWNobmljYWxseSBzcGVha2luZywgd2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUKLQkJCQkJCQkvLyBwcmV2aW91c0F0dHIKLQkJCQkJCQkvLyBpbiB0aGUgb3RoZXIgY2FzZSwgYmVjYXVzZSB0aGUgb3RoZXIgY2FzZSBpcwotCQkJCQkJCS8vIHdoZW4gaXQgaGFzbid0IGNoYW5nZWQKLQkJCQkJCQlwcmV2aW91c0F0dHIgPSBhdHRyOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJldmlvdXNBdHRyID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChEZWJ1Zy5zeW50YXhIaWdobGlnaHRpbmcgJiYgIWhhbmRsZWQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJub3QgaGFuZGxlZCBpbiBwcmVwYXJlUmVnaW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gaGFuZGxlZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHByZWYgPSBnZXRDb2xvclByZWZlcmVuY2VzKCk7Ci0JCWlmIChwcmVmICE9IG51bGwpIHsKLQkJCXByZWYuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXVuUmVnaXN0ZXJQcmVmZXJlbmNlTWFuYWdlcigpOwotCQlpZiAoZlRleHRBdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCWZUZXh0QXR0cmlidXRlcy5jbGVhcigpOwotCQkJZlRleHRBdHRyaWJ1dGVzID0gbnVsbDsKLQkJfQotCQlzZXRJbml0aWFsaXplZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5pdGlhbGl6ZWQuCi0JICogCi0JICogQHBhcmFtIGluaXRpYWxpemVkCi0JICogICAgICAgICAgICBUaGUgaW5pdGlhbGl6ZWQgdG8gc2V0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEluaXRpYWxpemVkKGJvb2xlYW4gaW5pdGlhbGl6ZWQpIHsKLQkJdGhpcy5mSW5pdGlhbGl6ZWQgPSBpbml0aWFsaXplZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1blJlZ2lzdGVyUHJlZmVyZW5jZU1hbmFnZXIoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgcHJlZiA9IGdldENvbG9yUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWYgIT0gbnVsbCkgewotCQkJcHJlZi5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0NvbXBhdGlibGVIaWdobGlnaHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0NvbXBhdGlibGVIaWdobGlnaHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTQzOThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9Db21wYXRpYmxlSGlnaGxpZ2h0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uTGluZVN0eWxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLS8qKgotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNDIwOQotICogCi0gKiBDcmVhdGVkIHRvIHByb3ZpZGUgY29tcGF0aWJpbGl0eSB3aXRoIHJlZnJlc2hEaXNwbGF5KCkgYW5kIGdldFRleHRWaWV3ZXIoKQotICogbWV0aG9kcyBvbiB0aGUgc3VwZXJjbGFzcyB0aGF0IG1pZ2h0IGJlIGNhbGxlZCBieSBMaW5lU3R5bGVQcm92aWRlcnMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21wYXRpYmxlSGlnaGxpZ2h0ZXIgZXh0ZW5kcyBIaWdobGlnaHRlciB7Ci0KLQlwcml2YXRlIElUZXh0Vmlld2VyIHRleHRWaWV3ZXI7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuSGlnaGxpZ2h0ZXIjYWRkUHJvdmlkZXIoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvdmlkZXIoU3RyaW5nIHBhcnRpdGlvblR5cGUsIExpbmVTdHlsZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCXN1cGVyLmFkZFByb3ZpZGVyKHBhcnRpdGlvblR5cGUsIHByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuSGlnaGxpZ2h0ZXIjZ2V0VGV4dFZpZXdlcigpCi0JICovCi0JcHVibGljIElUZXh0Vmlld2VyIGdldFRleHRWaWV3ZXIoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0Vmlld2VyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkhpZ2hsaWdodGVyI2luc3RhbGwob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKElUZXh0Vmlld2VyIG5ld1RleHRWaWV3ZXIpIHsKLQkJdGV4dFZpZXdlciA9IG5ld1RleHRWaWV3ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkhpZ2hsaWdodGVyI2xpbmVHZXRTdHlsZShpbnQsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIFN0eWxlUmFuZ2VbXSBsaW5lR2V0U3R5bGUoaW50IGV2ZW50TGluZU9mZnNldCwgaW50IGV2ZW50TGluZUxlbmd0aCkgewotCQlyZXR1cm4gbmV3IFN0eWxlUmFuZ2VbMF07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkhpZ2hsaWdodGVyI2xpbmVHZXRTdHlsZShvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpbmVHZXRTdHlsZShMaW5lU3R5bGVFdmVudCBldmVudCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5IaWdobGlnaHRlciNyZWZyZXNoRGlzcGxheSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaERpc3BsYXkoKSB7Ci0JCWlmICh0ZXh0Vmlld2VyICE9IG51bGwpCi0JCQl0ZXh0Vmlld2VyLmludmFsaWRhdGVUZXh0UHJlc2VudGF0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkhpZ2hsaWdodGVyI3JlZnJlc2hEaXNwbGF5KGludCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoRGlzcGxheShpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJcmVmcmVzaERpc3BsYXkoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuSGlnaGxpZ2h0ZXIjcmVtb3ZlUHJvdmlkZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm92aWRlcihTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5IaWdobGlnaHRlciNzZXREb2N1bWVudChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkhpZ2hsaWdodGVyI3NldERvY3VtZW50UGFydGl0aW9uaW5nKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoU3RyaW5nIHBhcnRpdGlvbmluZykgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5IaWdobGlnaHRlciN1bmluc3RhbGwoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbCgpIHsKLQkJc3VwZXIudW5pbnN0YWxsKCk7Ci0JCXRleHRWaWV3ZXIgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9IaWdobGlnaHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0hpZ2hsaWdodGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NzEwN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0hpZ2hsaWdodGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXJFeHRlbnNpb241OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkVkaXRvclByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuRWRpdG9yVXRpbGl0eTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRvIGRpcmVjdGx5IG1lZGlhdGUgYmV0d2VlbiB0aGUgU3RydWN0dXJlZCBEb2N1bWVudCBkYXRhCi0gKiBzdHJ1Y3R1cmUgYW5kIHRoZSB0ZXh0IHdpZGdldCdzIHRleHQgYW5kIGV2ZW50cy4gSXQgYXNzdW1lcyB0aGVyZSBvbmx5IHRoZQotICogbW9kZWwgaXMgaW50ZXJlc3RlZCBpbiB0ZXh0IGV2ZW50cywgYW5kIGFsbCBvdGhlciB2aWV3cyB3aWxsIHdvcmsgZnJvbSB0aGF0Ci0gKiBtb2RlbC4gQ2hhbmdlcyB0byB0aGUgdGV4dCB3aWRnZXRzIGlucHV0IGNhbiBjYXVzZSBjaGFuZ2VzIGluIHRoZSBtb2RlbCwKLSAqIHdoaWNoIGluIHR1cm4gY2F1c2UgY2hhbmdlcyB0byB0aGUgd2lkZ2V0J3MgZGlzcGxheS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSGlnaGxpZ2h0ZXIgaW1wbGVtZW50cyBJSGlnaGxpZ2h0ZXIgewotCi0JLyoqCi0JICogQSB1dGlsaXR5IGNsYXNzIHRvIGRvIHZhcmlvdXMgY29sb3IgbWFuaXB1bGF0aW9ucwotCSAqLwotCXByaXZhdGUgY2xhc3MgWVVWX1JHQkNvbnZlcnRlciB7Ci0JCS8qKgotCQkgKiBUaGlzIGNsYXNzICJob2xkcyIgdGhlIFlVViB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBSR0IgY29sb3IKLQkJICovCi0JCXByaXZhdGUgY2xhc3MgWVVWIHsKLQotCQkJY2xhc3MgTm9ybWFsaXplZFJHQiB7Ci0JCQkJZG91YmxlIGJsdWU7Ci0JCQkJZG91YmxlIGdyZWVuOwotCQkJCXByaXZhdGUgZmluYWwgZG91YmxlIG1heFJHQiA9IDI1Ni4wOwotCQkJCWRvdWJsZSByZWQ7Ci0KLQkJCQlwdWJsaWMgTm9ybWFsaXplZFJHQihSR0IgcmdiKSB7Ci0JCQkJCS8vIGZpcnN0IG5vcm1hbGl6ZSB0byBiZXR3ZWVuIDAgLSAxCi0JCQkJCXJlZCA9IHJnYi5yZWQgLyBtYXhSR0I7Ci0JCQkJCWdyZWVuID0gcmdiLmdyZWVuIC8gbWF4UkdCOwotCQkJCQlibHVlID0gcmdiLmJsdWUgLyBtYXhSR0I7Ci0KLQkJCQkJcmVkID0gZ2FtbWFOb3JtYWxpemVkKHJlZCk7Ci0JCQkJCWdyZWVuID0gZ2FtbWFOb3JtYWxpemVkKGdyZWVuKTsKLQkJCQkJYmx1ZSA9IGdhbW1hTm9ybWFsaXplZChibHVlKTsKLQotCQkJCX0KLQkJCX0KLQotCQkJcHJpdmF0ZSBOb3JtYWxpemVkUkdCIG5vcm1hbGl6ZWRSR0I7Ci0KLQkJCXByaXZhdGUgZG91YmxlIHUgPSAtMTsKLQkJCXByaXZhdGUgZG91YmxlIHYgPSAtMTsKLQkJCXByaXZhdGUgZG91YmxlIHkgPSAtMTsKLQotCQkJcHJpdmF0ZSBZVVYoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQotCQkJcHVibGljIFlVVihkb3VibGUgeSwgZG91YmxlIHUsIGRvdWJsZSB2KSB7Ci0JCQkJdGhpcygpOwotCQkJCXRoaXMueSA9IHk7Ci0JCQkJdGhpcy51ID0gdTsKLQkJCQl0aGlzLnYgPSB2OwotCQkJfQotCi0JCQlwdWJsaWMgWVVWKFJHQiByZ2IpIHsKLQkJCQl0aGlzKCk7Ci0JCQkJbm9ybWFsaXplZFJHQiA9IG5ldyBOb3JtYWxpemVkUkdCKHJnYik7Ci0JCQkJLy8gZm9yY2UgY2FsY3VsYXRpb25zCi0JCQkJZ2V0WSgpOwotCQkJCWdldFYoKTsKLQkJCQlnZXRVKCk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogbm9ybWFsaXplIHRvICJhdmVyYWdlIiBnYW1tYSAyLjIyMjIgb3IgMS8wLjQ1Ci0JCQkgKi8KLQkJCWRvdWJsZSBnYW1tYU5vcm1hbGl6ZWQoZG91YmxlIGNvbG9yQ29tcG9uZW50KSB7Ci0JCQkJaWYgKGNvbG9yQ29tcG9uZW50IDwgMC4wMTgpIHsKLQkJCQkJcmV0dXJuIGNvbG9yQ29tcG9uZW50ICogMC40NTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiAxLjA5OSAqIE1hdGgucG93KGNvbG9yQ29tcG9uZW50LCAwLjQ1KSAtIDAuMDk5OwotCQkJCX0KLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAcmV0dXJuIFJHQiBiYXNlZCBvbiBvcmlnaW5hbCBSR0IgYW5kIGN1cnJlbnQgWVVWIHZhbHVlczsKLQkJCSAqLwotCQkJcHVibGljIFJHQiBnZXRSR0IoKSB7Ci0JCQkJUkdCIHJlc3VsdCA9IG51bGw7Ci0JCQkJZG91YmxlIHIgPSBnZXRZKCkgKyAxLjE0ICogZ2V0VigpOwotCQkJCWRvdWJsZSBnID0gZ2V0WSgpIC0gMC4zOTUgKiBnZXRVKCkgLSAwLjU4ICogZ2V0VigpOwotCQkJCWRvdWJsZSBiID0gZ2V0WSgpICsgMi4wMzIgKiBnZXRVKCk7Ci0KLQkJCQlpbnQgcmVkID0gKGludCkgKGludmVyc2VHYW1tYU5vcm1hbGl6ZWQocikgKiAyNTYpOwotCQkJCWludCBncmVlbiA9IChpbnQpIChpbnZlcnNlR2FtbWFOb3JtYWxpemVkKGcpICogMjU2KTsKLQkJCQlpbnQgYmx1ZSA9IChpbnQpIChpbnZlcnNlR2FtbWFOb3JtYWxpemVkKGIpICogMjU2KTsKLQkJCQlpZiAocmVkIDwgMCkKLQkJCQkJcmVkID0gMDsKLQkJCQllbHNlIGlmIChyZWQgPiAyNTUpCi0JCQkJCXJlZCA9IDI1NTsKLQkJCQlpZiAoZ3JlZW4gPCAwKQotCQkJCQlncmVlbiA9IDA7Ci0JCQkJZWxzZSBpZiAoZ3JlZW4gPiAyNTUpCi0JCQkJCWdyZWVuID0gMjU1OwotCQkJCWlmIChibHVlIDwgMCkKLQkJCQkJYmx1ZSA9IDA7Ci0JCQkJZWxzZSBpZiAoYmx1ZSA+IDI1NSkKLQkJCQkJYmx1ZSA9IDI1NTsKLQotCQkJCXJlc3VsdCA9IG5ldyBSR0IocmVkLCBncmVlbiwgYmx1ZSk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHVibGljIGRvdWJsZSBnZXRVKCkgewotCQkJCWlmICh1ID09IC0xKSB7Ci0JCQkJCXUgPSAwLjQ5NDkgKiAobm9ybWFsaXplZFJHQi5ibHVlIC0gZ2V0WSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHU7Ci0KLQkJCX0KLQotCQkJcHVibGljIGRvdWJsZSBnZXRWKCkgewotCQkJCWlmICh2ID09IC0xKSB7Ci0JCQkJCXYgPSAwLjg3NyAqIChub3JtYWxpemVkUkdCLnJlZCAtIGdldFkoKSk7Ci0JCQkJfQotCQkJCXJldHVybiB2OwotCQkJfQotCi0JCQlwdWJsaWMgZG91YmxlIGdldFkoKSB7Ci0JCQkJaWYgKHkgPT0gLTEpIHsKLQkJCQkJeSA9IDAuMjk5ICogbm9ybWFsaXplZFJHQi5yZWQgKyAwLjU4NyAqIG5vcm1hbGl6ZWRSR0IuZ3JlZW4gKyAwLjExNCAqIG5vcm1hbGl6ZWRSR0IuYmx1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHk7Ci0JCQl9Ci0KLQkJCWRvdWJsZSBpbnZlcnNlR2FtbWFOb3JtYWxpemVkKGRvdWJsZSBjb2xvckNvbXBvbmVudCkgewotCQkJCWlmIChjb2xvckNvbXBvbmVudCA8IDAuMDE4KSB7Ci0JCQkJCXJldHVybiBjb2xvckNvbXBvbmVudCAqIC4yMjI7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gTWF0aC5wb3coKCguOTA5OSAqIGNvbG9yQ29tcG9uZW50ICsgMC4wOSkpLCAyLjIyKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCXB1YmxpYyBZVVZfUkdCQ29udmVydGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBkb3VibGUgY2FsY3VsYXRlWUNvbXBvbmVudChDb2xvciB0YXJnZXRDb2xvcikgewotCQkJcmV0dXJuIG5ldyBZVVYodGFyZ2V0Q29sb3IuZ2V0UkdCKCkpLmdldFkoKTsKLQkJfQotCi0JCXB1YmxpYyBSR0IgdHJhbnNmb3JtUkdCKFJHQiBvcmlnaW5hbFJHQiwgZG91YmxlIHNjYWxlRmFjdG9yLCBkb3VibGUgdGFyZ2V0KSB7Ci0JCQlSR0IgdHJhbnNmb3JtZWRSR0IgPSBudWxsOwotCQkJLy8gQ0NJUjYwMSB5dXYgPSBuZXcgQ0NJUjYwMShvcmlnaW5hbFJHQik7Ci0JCQlZVVYgeXV2ID0gbmV3IFlVVihvcmlnaW5hbFJHQik7Ci0JCQlkb3VibGUgeSA9IHl1di5nZXRZKCk7Ci0JCQkvLyB6ZXJvIGlzIGJsYWNrLCBvbmUgaXMgd2hpdGUKLQkJCWlmICh5IDwgdGFyZ2V0KSB7Ci0JCQkJLy8gaXMgImRhcmsiIG1ha2UgbGlnaHRlcgotCQkJCXkgPSB5ICsgKCh0YXJnZXQgLSB5KSAqIHNjYWxlRmFjdG9yKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGlzICJsaWdodCIgbWFrZSBkYXJrZXIKLQkJCQl5ID0geSAtICgoeSAtIHRhcmdldCkgKiBzY2FsZUZhY3Rvcik7Ci0JCQl9Ci0JCQkvLyB5dXYuc2V0WSh5KTsKLQkJCVlVViBuZXdZVVYgPSBuZXcgWVVWKHksIHl1di5nZXRVKCksIHl1di5nZXRWKCkpOwotCQkJLy8gQ0NJUjYwMSBuZXdZVVYgPSBuZXcgQ0NJUjYwMSh5LCB5dXYuZ2V0Q2I2MDEoKSwKLQkJCS8vIHl1di5nZXRDcjYwMSgpKTsKLQkJCXRyYW5zZm9ybWVkUkdCID0gbmV3WVVWLmdldFJHQigpOwotCQkJcmV0dXJuIHRyYW5zZm9ybWVkUkdCOwotCQl9Ci0KLQkJcHVibGljIFJHQiB0cmFuc2Zvcm1SR0JUb0dyZXkoUkdCIG9yaWdpbmFsUkdCLCBkb3VibGUgc2NhbGVGYWN0b3IsIGRvdWJsZSB0YXJnZXQpIHsKLQkJCVJHQiB0cmFuc2Zvcm1lZFJHQiA9IG51bGw7Ci0JCQkvLyB3ZSBsZWZ0IHRoZSAiZnVsbCIgQVBJIG1ldGhvZCBzaWduYXR1cmUsIGJ1dCB0aGlzCi0JCQkvLyB2ZXJzaW9uIGRvZXMgbm90IHRha2UgaW50byBhY2NvdW50IG9yaWdpbmFsUkdCLCB0aG91Z2gKLQkJCS8vIGl0IG1pZ2h0IHNvbWVkYXkuCi0JCQkvLyBmb3Igbm93LCB3ZSdsbCBzaW1wbHkgbWFrZSB0aGUgbmV3IFJHQiBncmV5LCBlaXRoZXIgYSBsaXR0bGUKLQkJCS8vIGxpZ2h0ZXIsIG9yIGEgbGl0dGxlIGRhcmtlciB0aGFuIGJhY2tncm91bmQuCi0JCQlkb3VibGUgeSA9IDA7Ci0JCQlkb3VibGUgbWlkID0gMC41OwotCQkJLy8gemVybyBpcyBibGFjaywgb25lIGlzIHdoaXRlCi0JCQlpZiAodGFyZ2V0IDwgbWlkKSB7Ci0JCQkJLy8gaXMgImRhcmsiIG1ha2UgbGlnaHRlcgotCQkJCXkgPSB0YXJnZXQgKyBzY2FsZUZhY3RvcjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGlzICJsaWdodCIgbWFrZSBkYXJrZXIKLQkJCQl5ID0gdGFyZ2V0IC0gc2NhbGVGYWN0b3I7Ci0JCQl9Ci0JCQlpbnQgYyA9IChpbnQpIE1hdGgucm91bmQoeSAqIDI1NSk7Ci0JCQkvLyBqdXN0IHRvIGdhdXJkIGFnYWluc3QgbWlzLXVzZSwgb3Igc2NhbGUncyB2YWx1ZXMgZ3JlYXRlcgotCQkJLy8gdGhhbiBtaWQgcG9pbnQgKGFuZCBwb3NzaWJseSByb3VuZGluZyBlcnJvcikKLQkJCWlmIChjID4gMjU1KQotCQkJCWMgPSAyNTU7Ci0JCQlpZiAoYyA8IDApCi0JCQkJYyA9IDA7Ci0JCQl0cmFuc2Zvcm1lZFJHQiA9IG5ldyBSR0IoYywgYywgYyk7Ci0JCQlyZXR1cm4gdHJhbnNmb3JtZWRSR0I7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIFN0eWxlUmFuZ2VbXSBFTVBUWV9TVFlMRV9SQU5HRSA9IG5ldyBTdHlsZVJhbmdlWzBdOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TVFlMRV9QUk9WSURFUl9FWFRFTkRFRF9JRCA9ICJsaW5lc3R5bGVwcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05VTUJFUl9TVFlMRVMgPSA1MDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExFRlRfU1RZTEVTX1NJWkUgPSAyMDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJJR0hUX1NUWUxFU19TSVpFID0gMjAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSURETEVfU1RZTEVTX1NJWkUgPSAxOwotCi0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmRm9yZWdyb3VuZFNjYWxlTGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChFZGl0b3JQcmVmZXJlbmNlTmFtZXMuUkVBRF9PTkxZX0ZPUkVHUk9VTkRfU0NBTEUuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpKSB7Ci0JCQkJSVByZWZlcmVuY2VTdG9yZSBlZGl0b3JTdG9yZSA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQlyZWFkT25seUZvcmVncm91bmRTY2FsZUZhY3RvciA9IGVkaXRvclN0b3JlLmdldEludChFZGl0b3JQcmVmZXJlbmNlTmFtZXMuUkVBRF9PTkxZX0ZPUkVHUk9VTkRfU0NBTEUpOwotCQkJCWRpc3Bvc2VDb2xvclRhYmxlKCk7Ci0JCQkJcmVmcmVzaERpc3BsYXkoKTsKLQkJCX0KLQkJfQotCX07Ci0JcHJpdmF0ZSBMaXN0IGZIb2xkU3R5bGVSZXN1bHRzOwotCXByaXZhdGUgU3RyaW5nIGZQYXJ0aXRpb25pbmcgPSBJRG9jdW1lbnRFeHRlbnNpb24zLkRFRkFVTFRfUEFSVElUSU9OSU5HOwotCi0JcHJpdmF0ZSBpbnQgZlNhdmVkTGVuZ3RoID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZlNhdmVkT2Zmc2V0ID0gLTE7Ci0JcHJpdmF0ZSBTdHlsZVJhbmdlW10gZlNhdmVkUmFuZ2VzID0gbnVsbDsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmU3RydWN0dXJlZERvY3VtZW50OwotCXByaXZhdGUgTWFwIGZUYWJsZU9mUHJvdmlkZXJzOwotCi0JcHJpdmF0ZSBNYXAgZkV4dGVuZGVkUHJvdmlkZXJzOwotCi0JcHJvdGVjdGVkIGZpbmFsIExpbmVTdHlsZVByb3ZpZGVyIE5PT1BfUFJPVklERVIgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JOb09wKCk7Ci0KLQlwcml2YXRlIGRvdWJsZSByZWFkT25seUJhY2tncm91bmRTY2FsZUZhY3RvciA9IDEwOwotCXByaXZhdGUgSGFzaHRhYmxlIHJlYWRPbmx5Q29sb3JUYWJsZTsKLQlkb3VibGUgcmVhZE9ubHlGb3JlZ3JvdW5kU2NhbGVGYWN0b3IgPSAzMDsKLQotCXByaXZhdGUgWVVWX1JHQkNvbnZlcnRlciByZ2JDb252ZXJ0ZXI7Ci0JcHJpdmF0ZSBJVGV4dFZpZXdlciB0ZXh0Vmlld2VyOwotCXByaXZhdGUgU3R5bGVkVGV4dCB0ZXh0V2lkZ2V0OwotCi0JcHVibGljIEhpZ2hsaWdodGVyKCkgewotCQlzdXBlcigpOwotCQkKLQkJLy8gaW4gdGhlICdsaW1pdFNpemUnIG1ldGhvZCwgd2UgbWFrZSB0aGlzIHN0cm9uZyBhc3N1bXB0aW9uLCBzbywgd2lsbCBjaGVjayBoZXJlLCAKLQkJLy8gc28gaWYgdHdlYWtlZCBpbiBmdXR1cmUsIHdlJ2xsIGdldCBhIHF1aWNrIHJlbWluZGVyLiAKLQkJaWYgKExFRlRfU1RZTEVTX1NJWkUgKyBNSURETEVfU1RZTEVTX1NJWkUgKyBSSUdIVF9TVFlMRVNfU0laRSA+IE1BWF9OVU1CRVJfU1RZTEVTKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJIaWdobGlnaGVyIGNvbnN0YW50cyBhcmUgbm90IGRlZmluZWQgY29ycmVjdGx5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVtcHR5UmFuZ2UoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLCBDb2xsZWN0aW9uIGhvbGRSZXN1bHRzKSB7Ci0JCVN0eWxlUmFuZ2UgcmVzdWx0ID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJcmVzdWx0LnN0YXJ0ID0gc3RhcnQ7Ci0JCXJlc3VsdC5sZW5ndGggPSBsZW5ndGg7Ci0JCWhvbGRSZXN1bHRzLmFkZChyZXN1bHQpOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyBhIGdpdmVuIGxpbmUgc3R5bGUgcHJvdmlkZXIgZm9yIGEgcGFydGljdWxhciBwYXJ0aXRpb24gdHlwZS4KLQkgKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgbGluZSBzdHlsZSBwcm92aWRlciByZWdpc3RlcmVkIGZvciB0aGlzIHR5cGUsIHRoZQotCSAqIG5ldyBsaW5lIHN0eWxlIHByb3ZpZGVyIGlzIHJlZ2lzdGVyZWQgaW5zdGVhZCBvZiB0aGUgb2xkIG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFydGl0aW9uVHlwZQotCSAqICAgICAgICAgICAgdGhlIHBhcnRpdGlvbiB0eXBlIHVuZGVyIHdoaWNoIHRvIHJlZ2lzdGVyCi0JICogQHBhcmFtIHRoZQotCSAqICAgICAgICAgICAgbGluZSBzdHlsZSBwcm92aWRlciB0byByZWdpc3Rlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIHJlbW92ZSBhbiBleGlzdGluZyBvbmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm92aWRlcihTdHJpbmcgcGFydGl0aW9uVHlwZSwgTGluZVN0eWxlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJZ2V0VGFibGVPZlByb3ZpZGVycygpLnB1dChwYXJ0aXRpb25UeXBlLCBwcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQWRqdXN0IHRoZSBzdHlsZSByYW5nZXMnIHN0YXJ0IGFuZCBsZW5ndGggc28gdGhhdCB0aGV5IHJlZmVyIHRvIHRoZQotCSAqIHRleHR2aWV3ZXIgd2lkZ2V0J3MgcmFuZ2UgaW5zdGVhZCBvZiB0aGUgdGV4dHZpZXdlcidzIGRvY3VtZW50IHJhbmdlLgotCSAqIAotCSAqIEBwYXJhbSByYW5nZXMKLQkgKiBAcGFyYW0gYWRqdXN0bWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkanVzdChTdHlsZVJhbmdlW10gcmFuZ2VzLCBpbnQgYWRqdXN0bWVudCkgewotCQlJVGV4dFZpZXdlciB2aWV3ZXIgPSBnZXRUZXh0Vmlld2VyKCk7Ci0KLQkJaWYgKGFkanVzdG1lbnQgIT0gMCkgewotCQkJLy8ganVzdCB1c2UgdGhlIGFkanVzdG1lbnQgdmFsdWUKLQkJCS8vIGNvbnZlcnQgZG9jdW1lbnQgcmVnaW9ucyBiYWNrIHRvIHdpZGdldCByZWdpb25zCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewotCQkJCS8vIGp1c3QgYWRqdXN0IHRoZSByYW5nZSB1c2luZyB0aGUgZ2l2ZW4gYWRqdXN0bWVudAotCQkJCXJhbmdlc1tpXS5zdGFydCArPSBhZGp1c3RtZW50OwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCQkJLy8gdXNlIElUZXh0Vmlld2VyRXh0ZW5zaW9uNQotCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHZpZXdlcjsKLQotCQkJLy8gY29udmVydCBkb2N1bWVudCByZWdpb25zIGJhY2sgdG8gd2lkZ2V0IHJlZ2lvbnMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gZ2V0IGRvY3VtZW50IHJhbmdlLCB0YWtpbmcgaW50byBhY2NvdW50IGZvbGRpbmcKLQkJCQkvLyByZWdpb25zIGluIHZpZXdlcgotCQkJCUlSZWdpb24gcmVnaW9uID0gZXh0ZW5zaW9uLm1vZGVsUmFuZ2UyV2lkZ2V0UmFuZ2UobmV3IFJlZ2lvbihyYW5nZXNbaV0uc3RhcnQsIHJhbmdlc1tpXS5sZW5ndGgpKTsKLQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkJcmFuZ2VzW2ldLnN0YXJ0ID0gcmVnaW9uLmdldE9mZnNldCgpOwotCQkJCQlyYW5nZXNbaV0ubGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQkJCX0gLy8gZWxzZSB3aGF0IGhhcHBlbnMgaWYgcmVnaW9uIGlzIG5vdCBmb3VuZD8hCi0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gUmVhZCBPbmx5IGFyZWFzIGhhdmUgdW5jaGFuZ2VkIGJhY2tncm91bmQgY29sb3JzCi0JICovCi0Jdm9pZCBhZGp1c3RCYWNrZ3JvdW5kKFN0eWxlUmFuZ2Ugc3R5bGVSYW5nZSkgewotCQlSR0Igb2xkUkdCID0gbnVsbDsKLQkJQ29sb3Igb2xkQ29sb3IgPSBzdHlsZVJhbmdlLmJhY2tncm91bmQ7Ci0JCWlmIChvbGRDb2xvciA9PSBudWxsKSB7Ci0JCQlvbGRDb2xvciA9IGdldFRleHRXaWRnZXQoKS5nZXRCYWNrZ3JvdW5kKCk7Ci0JCX0KLQkJb2xkUkdCID0gb2xkQ29sb3IuZ2V0UkdCKCk7Ci0JCUNvbG9yIG5ld0NvbG9yID0gZ2V0Q2FjaGVkQ29sb3JGb3Iob2xkUkdCKTsKLQkJaWYgKG5ld0NvbG9yID09IG51bGwpIHsKLQkJCWRvdWJsZSB0YXJnZXQgPSBnZXRSR0JDb252ZXJ0ZXIoKS5jYWxjdWxhdGVZQ29tcG9uZW50KG9sZENvbG9yKTsKLQkJCS8vIGlmIGJhY2tncm91bmQgaXMgImxpZ2h0IiBtYWtlIGl0IGRhcmtlciwgYW5kIHZpY2UgdmVyc2EKLQkJCWlmICh0YXJnZXQgPCAwLjUpCi0JCQkJdGFyZ2V0ID0gMS4wOwotCQkJZWxzZQotCQkJCXRhcmdldCA9IDAuMDsKLQkJCVJHQiBuZXdSR0IgPSBnZXRSR0JDb252ZXJ0ZXIoKS50cmFuc2Zvcm1SR0Iob2xkUkdCLCByZWFkT25seUJhY2tncm91bmRTY2FsZUZhY3RvciAvIDEwMC4wLCB0YXJnZXQpOwotCi0JCQljYWNoZUNvbG9yKG9sZFJHQiwgbmV3UkdCKTsKLQkJCW5ld0NvbG9yID0gZ2V0Q2FjaGVkQ29sb3JGb3Iob2xkUkdCKTsKLQkJfQotCQlzdHlsZVJhbmdlLmJhY2tncm91bmQgPSBuZXdDb2xvcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRqdXN0Rm9yZWdyb3VuZChTdHlsZVJhbmdlIHN0eWxlUmFuZ2UpIHsKLQkJUkdCIG9sZFJHQiA9IG51bGw7Ci0JCS8vIENvbG9yIG9sZENvbG9yID0gc3R5bGVSYW5nZS5mb3JlZ3JvdW5kOwotCQlDb2xvciBvbGRDb2xvciA9IHN0eWxlUmFuZ2UuYmFja2dyb3VuZDsKLQkJaWYgKG9sZENvbG9yID09IG51bGwpIHsKLQkJCS8vIG9sZFJHQiA9IGdldFRleHRXaWRnZXQoKS5nZXRGb3JlZ3JvdW5kKCkuZ2V0UkdCKCk7Ci0JCQlvbGRDb2xvciA9IGdldFRleHRXaWRnZXQoKS5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQlvbGRSR0IgPSBvbGRDb2xvci5nZXRSR0IoKTsKLQkJfQotCQllbHNlIHsKLQkJCW9sZFJHQiA9IG9sZENvbG9yLmdldFJHQigpOwotCQl9Ci0JCUNvbG9yIG5ld0NvbG9yID0gZ2V0Q2FjaGVkQ29sb3JGb3Iob2xkUkdCKTsKLQkJaWYgKG5ld0NvbG9yID09IG51bGwpIHsKLQkJCS8vIG1ha2UgdGV4dCAiY2xvc2VyIHRvIiBiYWNrZ3JvdW5kIGx1bWFuZW5jZQotCQkJZG91YmxlIHRhcmdldCA9IGdldFJHQkNvbnZlcnRlcigpLmNhbGN1bGF0ZVlDb21wb25lbnQob2xkQ29sb3IpOwotCQkJUkdCIG5ld1JHQiA9IGdldFJHQkNvbnZlcnRlcigpLnRyYW5zZm9ybVJHQlRvR3JleShvbGRSR0IsIHJlYWRPbmx5Rm9yZWdyb3VuZFNjYWxlRmFjdG9yIC8gMTAwLjAsIHRhcmdldCk7Ci0KLQkJCS8vIHNhdmUgY29udmVyc2lvbiwgc28gY2FsY3VsYXRpb25zIG9ubHkgbmVlZCB0byBiZSBkb25lIG9uY2UKLQkJCWNhY2hlQ29sb3Iob2xkUkdCLCBuZXdSR0IpOwotCQkJbmV3Q29sb3IgPSBnZXRDYWNoZWRDb2xvckZvcihvbGRSR0IpOwotCQl9Ci0JCXN0eWxlUmFuZ2UuZm9yZWdyb3VuZCA9IG5ld0NvbG9yOwotCX0KLQotCS8qKgotCSAqIENhY2hlIHJlYWQtb25seSBjb2xvci4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkUkdCCi0JICogQHBhcmFtIG5ld0NvbG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNhY2hlQ29sb3IoUkdCIG9sZFJHQiwgUkdCIG5ld0NvbG9yKSB7Ci0JCWlmIChyZWFkT25seUNvbG9yVGFibGUgPT0gbnVsbCkgewotCQkJcmVhZE9ubHlDb2xvclRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQl9Ci0JCXJlYWRPbmx5Q29sb3JUYWJsZS5wdXQob2xkUkdCLCBuZXdDb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc3VsdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0eWxlUmFuZ2VbXSBjb252ZXJ0UmVhZE9ubHlSZWdpb25zKFN0eWxlUmFuZ2VbXSByZXN1bHQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGdldERvY3VtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIChkbXcpIEZvciBjbGllbnQvcHJvdmlkZXIgc2ltcGxpY2l0eSAoYW5kIGNvbnNpc3RlbnQgbG9vayBhbmQgZmVlbCkKLQkJICogd2UnbGwgaGFuZGxlIHJlYWRvbmx5IHJlZ2lvbnMgaW4gb25lIHNwb3QsIGhlcmUgaW4gdGhlIEhpZ2hsaWdodGVyLgotCQkgKiBDdXJyZW50bHkgaXQgaXMgYSBmYWlyIGFzc3VtcHRpb24gdGhhdCBlYWNoIHJlYWRvbmx5IHJlZ2lvbiB3aWxsIGJlCi0JCSAqIG9uIGFuIElUZXh0UmVnaW9uIGJvdW5kYXJ5LCBzbyB3ZSBjb21iaW5lIGNvbnNlY3V0aXZlIHN0eWxlcyB3aGVuCi0JCSAqIGZvdW5kIHRvIGJlIGVxdWl2YWxlbnQuIFBsdXMsIGZvciBub3csIHdlJ2xsIGp1c3QgYWRqdXN0Ci0JCSAqIGZvcmVncm91bmQuIEV2ZW50dWFsbHkgd2lsbCB1c2UgYSAiZGltbWluZyIgYWxncm9yaXRobSB0byBhZGp1c3QKLQkJICogY29sb3IncyBzYXR1YXRpb24vYnJpZ2h0bmVzcy4KLQkJICovCi0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQuY29udGFpbnNSZWFkT25seShzdGFydCwgbGVuZ3RoKSkgewotCQkJLy8gc29tZXRoaW5nIGlzIHJlYWQtb25seSBpbiB0aGUgbGluZSwgc28gZ28gdGhyb3VnaCBlYWNoIHN0eWxlLAotCQkJLy8gYW5kIGFkanVzdAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSByZXN1bHRbaV07Ci0JCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudC5jb250YWluc1JlYWRPbmx5KHN0eWxlUmFuZ2Uuc3RhcnQsIHN0eWxlUmFuZ2UubGVuZ3RoKSkgewotCQkJCQlhZGp1c3RGb3JlZ3JvdW5kKHN0eWxlUmFuZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENsZWFyIG91dCB0aGUgcmVhZE9ubHlDb2xvclRhYmxlCi0JICovCi0Jdm9pZCBkaXNwb3NlQ29sb3JUYWJsZSgpIHsKLQkJaWYgKHJlYWRPbmx5Q29sb3JUYWJsZSAhPSBudWxsKSB7Ci0JCQlyZWFkT25seUNvbG9yVGFibGUuY2xlYXIoKTsKLQkJfQotCQlyZWFkT25seUNvbG9yVGFibGUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGp1c3QgdG8gZ2V0IGV4aXN0aW5nIHJlYWQtb25seSBjb2xvcnMuCi0JICovCi0JcHJpdmF0ZSBDb2xvciBnZXRDYWNoZWRDb2xvckZvcihSR0Igb2xkUkdCKSB7Ci0JCUNvbG9yIHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKHJlYWRPbmx5Q29sb3JUYWJsZSAhPSBudWxsKSB7Ci0JCQlSR0IgcmVhZE9ubHlSR0IgPSAoUkdCKSByZWFkT25seUNvbG9yVGFibGUuZ2V0KG9sZFJHQik7Ci0JCQlyZXN1bHQgPSBFZGl0b3JVdGlsaXR5LmdldENvbG9yKHJlYWRPbmx5UkdCKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmU3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEFkanVzdCB0aGUgZ2l2ZW4gd2lkZ2V0IG9mZnNldCBhbmQgbGVuZ3RoIHNvIHRoYXQgdGhleSBhcmUgdGhlCi0JICogdGV4dHZpZXdlciBkb2N1bWVudCdzIG9mZnNldCBhbmQgbGVuZ3RoLCB0YWtpbmcgaW50byBhY2NvdW50IHdoYXQgaXMKLQkgKiBhY3R1YWxseSB2aXNpYmxlIGluIHRoZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqIEByZXR1cm4gYSByZWdpb24gY29udGFpbmluZyB0aGUgb2Zmc2V0IGFuZCBsZW5ndGggd2l0aGluIHRoZQotCSAqICAgICAgICAgdGV4dHZpZXdlcidzIGRvY3VtZW50IG9yIG51bGwgaWYgdGhlIG9mZnNldCBpcyBub3Qgd2l0aGluIHRoZQotCSAqICAgICAgICAgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIElSZWdpb24gZ2V0RG9jdW1lbnRSYW5nZUZyb21XaWRnZXRSYW5nZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCUlSZWdpb24gc3R5bGVSZWdpb24gPSBudWxsOwotCQlJVGV4dFZpZXdlciB2aWV3ZXIgPSBnZXRUZXh0Vmlld2VyKCk7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHsKLQkJCS8vIGdldCBkb2N1bWVudCByYW5nZSwgdGFraW5nIGludG8gYWNjb3VudCBmb2xkaW5nIHJlZ2lvbnMgaW4KLQkJCS8vIHZpZXdlcgotCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHZpZXdlcjsKLQkJCXN0eWxlUmVnaW9uID0gZXh0ZW5zaW9uLndpZGdldFJhbmdlMk1vZGVsUmFuZ2UobmV3IFJlZ2lvbihvZmZzZXQsIGxlbmd0aCkpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gZ2V0IGRvY3VtZW50IHJhbmdlLCB0YWtpbmcgaW50byBhY2NvdW50IHZpZXdlciB2aXNpYmxlIHJlZ2lvbgotCQkJLy8gZ2V0IHZpc2libGUgcmVnaW9uIGluIHZpZXdlcgotCQkJSVJlZ2lvbiB2ciA9IG51bGw7Ci0JCQlpZiAodmlld2VyICE9IG51bGwpCi0JCQkJdnIgPSB2aWV3ZXIuZ2V0VmlzaWJsZVJlZ2lvbigpOwotCQkJZWxzZQotCQkJCXZyID0gbmV3IFJlZ2lvbigwLCBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpKTsKLQotCQkJLy8gaWYgb2Zmc2V0IGlzIG5vdCB3aXRoaW4gdmlzaWJsZSByZWdpb24sIHRoZW4gd2UgZG9uJ3QgcmVhbGx5Ci0JCQkvLyBjYXJlCi0JCQlpZiAob2Zmc2V0IDw9IHZyLmdldExlbmd0aCgpKSB7Ci0JCQkJLy8gQWRqdXN0IHRoZSBvZmZzZXQgdG8gYmUgd2l0aGluIHZpc2libGUgcmVnaW9uCi0JCQkJc3R5bGVSZWdpb24gPSBuZXcgUmVnaW9uKG9mZnNldCArIHZyLmdldE9mZnNldCgpLCBsZW5ndGgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdHlsZVJlZ2lvbjsKLQl9Ci0KLQotCXByaXZhdGUgTWFwIGdldEV4dGVuZGVkUHJvdmlkZXJzKCkgewotCQlpZiAoZkV4dGVuZGVkUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCWZFeHRlbmRlZFByb3ZpZGVycyA9IG5ldyBIYXNoTWFwKDMpOwotCQl9Ci0JCXJldHVybiBmRXh0ZW5kZWRQcm92aWRlcnM7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldFByb3ZpZGVyRm9yLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlZFJlZ2lvbgotCSAqIEByZXR1cm4gTGluZVN0eWxlUHJvdmlkZXIKLQkgKi8KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGdldFByb3ZpZGVyRm9yKElUeXBlZFJlZ2lvbiB0eXBlZFJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IHR5cGVkUmVnaW9uLmdldFR5cGUoKTsKLQkJTGluZVN0eWxlUHJvdmlkZXIgcmVzdWx0ID0gKExpbmVTdHlsZVByb3ZpZGVyKSBmVGFibGVPZlByb3ZpZGVycy5nZXQodHlwZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJLy8gTk9UIFlFVCBGSU5BTElaRUQgLSBETyBOT1QgQ09OU0lERVIgQVMgQVBJCi0JCQlzeW5jaHJvbml6ZWQgKGdldEV4dGVuZGVkUHJvdmlkZXJzKCkpIHsKLQkJCQlpZiAoIWdldEV4dGVuZGVkUHJvdmlkZXJzKCkuY29udGFpbnNLZXkodHlwZSkpIHsKLQkJCQkJTGluZVN0eWxlUHJvdmlkZXIgcHJvdmlkZXIgPSAoTGluZVN0eWxlUHJvdmlkZXIpIEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9uKExJTkVfU1RZTEVfUFJPVklERVJfRVhURU5ERURfSUQsIHR5cGUpOwotCQkJCQlnZXRFeHRlbmRlZFByb3ZpZGVycygpLnB1dCh0eXBlLCBwcm92aWRlcik7Ci0JCQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCQlwcm92aWRlci5pbml0KGdldERvY3VtZW50KCksIHRoaXMpOwotCQkJCQl9Ci0JCQkJCXJlc3VsdCA9IHByb3ZpZGVyOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gKExpbmVTdHlsZVByb3ZpZGVyKSBnZXRFeHRlbmRlZFByb3ZpZGVycygpLmdldCh0eXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBOT09QX1BST1ZJREVSOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBZVVZfUkdCQ29udmVydGVyIGdldFJHQkNvbnZlcnRlcigpIHsKLQkJaWYgKHJnYkNvbnZlcnRlciA9PSBudWxsKSB7Ci0JCQlyZ2JDb252ZXJ0ZXIgPSBuZXcgWVVWX1JHQkNvbnZlcnRlcigpOwotCQl9Ci0JCXJldHVybiByZ2JDb252ZXJ0ZXI7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0VGFibGVPZlByb3ZpZGVycygpIHsKLQkJaWYgKGZUYWJsZU9mUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCWZUYWJsZU9mUHJvdmlkZXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlyZXR1cm4gZlRhYmxlT2ZQcm92aWRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dFZpZXdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIElUZXh0Vmlld2VyCi0JICovCi0JcHVibGljIElUZXh0Vmlld2VyIGdldFRleHRWaWV3ZXIoKSB7Ci0JCXJldHVybiB0ZXh0Vmlld2VyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3R5bGVkVGV4dCBnZXRUZXh0V2lkZ2V0KCkgewotCQlyZXR1cm4gdGV4dFdpZGdldDsKLQl9Ci0KLQkvKioKLQkgKiBJbnN0YWxscyBoaWdobGlnaHRlciBzdXBwb3J0IG9uIHRoZSBnaXZlbiB0ZXh0IHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dFZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHRleHQgdmlld2VyIG9uIHdoaWNoIGNvbnRlbnQgYXNzaXN0IHdpbGwgd29yawotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGwoSVRleHRWaWV3ZXIgbmV3VGV4dFZpZXdlcikgewotCQl0aGlzLnRleHRWaWV3ZXIgPSBuZXdUZXh0Vmlld2VyOwotCi0JCUlQcmVmZXJlbmNlU3RvcmUgZWRpdG9yU3RvcmUgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWVkaXRvclN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZkZvcmVncm91bmRTY2FsZUxpc3RlbmVyKTsKLQkJcmVhZE9ubHlGb3JlZ3JvdW5kU2NhbGVGYWN0b3IgPSBlZGl0b3JTdG9yZS5nZXRJbnQoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLlJFQURfT05MWV9GT1JFR1JPVU5EX1NDQUxFKTsKLQotCQlpZiAodGV4dFdpZGdldCAhPSBudWxsKSB7Ci0JCQl0ZXh0V2lkZ2V0LnJlbW92ZUxpbmVTdHlsZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCXRleHRXaWRnZXQgPSBuZXdUZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHRXaWRnZXQgIT0gbnVsbCkgewotCQkJdGV4dFdpZGdldC5hZGRMaW5lU3R5bGVMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCXJlZnJlc2hEaXNwbGF5KCk7Ci0JfQotCi0JcHVibGljIFN0eWxlUmFuZ2VbXSBsaW5lR2V0U3R5bGUoaW50IGV2ZW50TGluZU9mZnNldCwgaW50IGV2ZW50TGluZUxlbmd0aCkgewotCQlTdHlsZVJhbmdlW10gZXZlbnRTdHlsZXMgPSBFTVBUWV9TVFlMRV9SQU5HRTsKLQkJdHJ5IHsKLQkJCWlmIChnZXREb2N1bWVudCgpID09IG51bGwgfHwgZXZlbnRMaW5lTGVuZ3RoID09IDApIHsKLQkJCQkvLyBnZXREb2N1bWVudCgpID09IG51bGwKLQkJCQkvLyBkdXJpbmcgaW5pdGlhbGl6YXRpb24sIHRoaXMgaXMgc29tZXRpbWVzIGNhbGxlZCBiZWZvcmUgb3VyCi0JCQkJLy8gc3RydWN0dXJlZAotCQkJCS8vIGlzIHNldCwgaW4gd2hpY2ggY2FzZSB3ZSBzZXQgc3R5bGVzIHRvIGJlIHRoZSBlbXB0eSBzdHlsZQotCQkJCS8vIHJhbmdlCi0JCQkJLy8gKGV2ZW50LnN0eWxlcyBjYW4gbm90IGJlIG51bGwpCi0KLQkJCQkvLyBldmVudExpbmVMZW5ndGggPT0gMAotCQkJCS8vIHdlIHNvbWV0aW1lcyBnZXQgb2RkIHJlcXVlc3RzIGZyb20gdGhlIHZlcnkgbGFzdCBDUkxGIGluCi0JCQkJLy8gdGhlCi0JCQkJLy8gZG9jdW1lbnQKLQkJCQkvLyBpdCBoYXMgbm8gbGVuZ3RoLCBhbmQgdGhlcmUgaXMgbm8gbm9kZSBmb3IgaXQhCi0JCQkJZXZlbnRTdHlsZXMgPSBFTVBUWV9TVFlMRV9SQU5HRTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qCi0JCQkJICogTGluZVN0eWxlUHJvdmlkZXJzIHdvcmsgdXNpbmcgYWJzb2x1dGUgZG9jdW1lbnQgb2Zmc2V0cy4gVG8KLQkJCQkgKiBzdXBwb3J0IHZpc2libGUgcmVnaW9ucywgYWRqdXN0IHRoZSByZXF1ZXN0ZWQgcmFuZ2UgdXAgdG8KLQkJCQkgKiB0aGUgZnVsbCBkb2N1bWVudCBvZmZzZXRzLgotCQkJCSAqLwotCQkJCUlSZWdpb24gc3R5bGVSZWdpb24gPSBnZXREb2N1bWVudFJhbmdlRnJvbVdpZGdldFJhbmdlKGV2ZW50TGluZU9mZnNldCwgZXZlbnRMaW5lTGVuZ3RoKTsKLQkJCQlpZiAoc3R5bGVSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpbnQgc3RhcnQgPSBzdHlsZVJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCQkJaW50IGxlbmd0aCA9IHN0eWxlUmVnaW9uLmdldExlbmd0aCgpOwotCi0JCQkJCUlUeXBlZFJlZ2lvbltdIHBhcnRpdGlvbnMgPSBUZXh0VXRpbGl0aWVzLmNvbXB1dGVQYXJ0aXRpb25pbmcoZ2V0RG9jdW1lbnQoKSwgZlBhcnRpdGlvbmluZywgc3RhcnQsIGxlbmd0aCwgZmFsc2UpOwotCQkJCQlldmVudFN0eWxlcyA9IHByZXBhcmVTdHlsZVJhbmdlc0FycmF5KHBhcnRpdGlvbnMsIHN0YXJ0LCBsZW5ndGgpOwotCi0JCQkJCS8qCi0JCQkJCSAqIElmIHRoZXJlIGlzIGEgc3VidGV4dCBvZmZzZXQsIHRoZSBzdHlsZSByYW5nZXMgbXVzdCBiZQotCQkJCQkgKiBhZGp1c3RlZCB0byB0aGUgZXhwZWN0ZWQgb2Zmc2V0cyBqdXN0IGNoZWNrIGlmCi0JCQkJCSAqIGV2ZW50TGluZU9mZnNldCBpcyBkaWZmZXJlbnQgdGhhbiBzdGFydCB0aGVuIGFkanVzdCwKLQkJCQkJICogb3RoZXJ3aXNlIHUgY2FuIGxlYXZlIGl0IGFsb25lIHVubGVzcyB0aGVyZSBpcyBzcGVjaWFsCi0JCQkJCSAqIGhhbmRsaW5nIGZvciBpdGV4dHZpZXdlcmV4dGVuc2lvbjU/Ci0JCQkJCSAqLwotCQkJCQlpZiAoc3RhcnQgIT0gZXZlbnRMaW5lT2Zmc2V0KSB7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gMDsKLQkJCQkJCS8vIGZpZ3VyZSBvdXQgdmlzaWJsZSByZWdpb24gdG8gdXNlIGZvciBhZGp1c3RtZW50Ci0JCQkJCQkvLyBvbmx5IGFkanVzdCBpZiBuZWVkIHRvCi0JCQkJCQlpZiAoIShnZXRUZXh0Vmlld2VyKCkgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpKSB7Ci0JCQkJCQkJSVJlZ2lvbiB2ciA9IGdldFRleHRWaWV3ZXIoKS5nZXRWaXNpYmxlUmVnaW9uKCk7Ci0JCQkJCQkJaWYgKHZyICE9IG51bGwpIHsKLQkJCQkJCQkJb2Zmc2V0ID0gdnIuZ2V0T2Zmc2V0KCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYWRqdXN0KGV2ZW50U3R5bGVzLCAtb2Zmc2V0KTsKLQkJCQkJfQotCi0JCQkJCWV2ZW50U3R5bGVzID0gbGltaXRTaXplKGV2ZW50U3R5bGVzKTsKLQkJCQkJCi0JCQkJCS8vIGZvciBkZWJ1Z2dpbmcgb25seQotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCWlmICghdmFsaWQoZXZlbnRTdHlsZXMsIGV2ZW50TGluZU9mZnNldCwgZXZlbnRMaW5lTGVuZ3RoKSkgewotCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJIaWdobGlnaHRlcjo6bGluZUdldFN0eWxlIGZvdW5kIGludmFsaWQgc3R5bGVzIGF0IG9mZnNldCAiICsgZXZlbnRMaW5lT2Zmc2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIEFOWSBleGNlcHRpb24gb2NjdXJzIGR1cmluZyBoaWdobGlnaHRpbmcsCi0JCQkvLyBqdXN0IHJldHVybiAibm8gaGlnaGxpZ2h0aW5nIgotCQkJZXZlbnRTdHlsZXMgPSBFTVBUWV9TVFlMRV9SQU5HRTsKLQkJCWlmIChEZWJ1Zy5zeW50YXhIaWdobGlnaHRpbmcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiBkdXJpbmcgaGlnaGxpZ2h0aW5nISIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZXZlbnRTdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdG8gY2VudHJhbGl6ZSB0aGUgbG9naWMgaW4gbGltaXRpbmcgdGhlIG92ZXJhbGwgbnVtYmVyIG9mIHN0eWxlIHJhbmdlcwotCSAqIHRoYXQgbWFrZSBpdCB0byB0aGUgc3R5bGVkIHRleHQgd2lkZ2V0LiAKLQkgKiAKLQkgKiBUb28gbWFueSBzdHlsZXMgc2VudCB0byBTdHlsZWRUZXh0IHJlc3VsdHMgaW4gYXBwYXJlbnQsIGJ1dCBub3QgcmVhbCwgCi0JICogaGFuZ3Mgb2YgRWNsaXBzZSBEaXNwbGF5IHRocmVhZC4gU2VlICAKLQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4ODA2Ci0JICogCi0JICogQHBhcmFtIGV2ZW50U3R5bGVzCi0JICogQHJldHVybgotCSAqLwotCSBwcml2YXRlIFN0eWxlUmFuZ2VbXSBsaW1pdFNpemUoU3R5bGVSYW5nZVtdIGV2ZW50U3R5bGVzKSB7Ci0JCQotCQkvLyBxdWljayByZXR1cm4gd2l0aCBzYW1lIG9iamVjdCBpZiBub3QgbW9kaWZpY2F0aW9uIG5lZWRlZAotCQlpZiAoZXZlbnRTdHlsZXMubGVuZ3RoIDwgTUFYX05VTUJFUl9TVFlMRVMpIHsKLQkJCXJldHVybiBldmVudFN0eWxlczsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHdlIGNvdWxkIGp1c3QgdGFrZSB0aGUgZWFzeSB3YXkgb3V0IGFuZCB0cnVuY2F0ZSwgYnV0IHdpbGwgCi0JCQkvLyBiZSBtdWNoIGJldHRlciBhcHBlYXJpbmcgaWYgYm90aCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgYW5kIHRoZSAKLQkJCS8vIGVuZCBvZiB0aGUgbGluZSBhcmUgZGlzcGxheWVkIHdpdGggc3R5bGVzLiBTaW5jZSB0aGVzZSBhcmUgYm90aAotCQkJLy8gdGhlIHBhcnRzIG9mIHRoZSBsaW5lIGEgdXNlciBpcyBsaWtlbHkgdG8gbG9vayBhdC4gVGhlIG1pZGRsZSBvZiB0aGUgCi0JCQkvLyBsaW5lIHdpbGwgc3RpbGwgYmUgInBsYWluIi4gUHJlc3VtYWJseSwgdGhlIHVzZXIgd291bGQgcmUtZm9ybWF0IHRoZSAKLQkJCS8vIGZpbGUgdG8gYXZvaWQgbG9uZyBsaW5lcywgc28gdW5saWtlbHkgdG8gc2VlIHRoZSBtaWRkbGUuIAotCQkJU3R5bGVSYW5nZVtdIG5ld1JhbmdlcyA9IG5ldyBTdHlsZVJhbmdlW0xFRlRfU1RZTEVTX1NJWkUgKyBSSUdIVF9TVFlMRVNfU0laRSArIE1JRERMRV9TVFlMRVNfU0laRV07IAotCQkJU3lzdGVtLmFycmF5Y29weShldmVudFN0eWxlcywgMCwgbmV3UmFuZ2VzLCAwLCBMRUZUX1NUWUxFU19TSVpFKTsKLQkJCS8vCi0JCQkvLyBkbyBlbmQsIGJlZm9yZSB3ZSBkbyBtaWRkbGUKLQkJCVN5c3RlbS5hcnJheWNvcHkoZXZlbnRTdHlsZXMsIGV2ZW50U3R5bGVzLmxlbmd0aC1SSUdIVF9TVFlMRVNfU0laRSwgbmV3UmFuZ2VzLCBMRUZUX1NUWUxFU19TSVpFICsgTUlERExFX1NUWUxFU19TSVpFLCBSSUdIVF9TVFlMRVNfU0laRSk7Ci0JCQkvLwotCQkJLy8gdGVjaG5pY2FsbHksIHdlIHNob3VsZCBjb21wdXRlIHRoZSBleGFjdCBtaWRkbGUgYXMgb25lIGJpZyBzdHlsZSByYW5nZSwgCi0JCQkvLyB3aXRoIGRlZmF1bHQgY29sb3JzIGFuZCBzdHlsZXMsIHNvIGlmIHNvbWVvbmUgZG9lcyBhY3R1YWxseSB0eXBlIG9yIHdvcmsgd2l0aCAKLQkJCS8vIGRvY3VtbmV0IGFzIGlzLCB3aWxsIHN0aWxsIGJlIGNvcnJlY3QuIAotCQkJLy8KLQkJCVN0eWxlUmFuZ2UgYWxsQmxhbmsgPSBuZXcgU3R5bGVSYW5nZSgpOwotCQkJU3R5bGVSYW5nZSBsYXN0S25vd24gPSBuZXdSYW5nZXNbTEVGVF9TVFlMRVNfU0laRSAtIDFdOwotCQkJYWxsQmxhbmsuc3RhcnQgPSBsYXN0S25vd24uc3RhcnQgKyBsYXN0S25vd24ubGVuZ3RoOwotCQkJU3R5bGVSYW5nZSBuZXh0S25vd24gPSBuZXdSYW5nZXNbTEVGVF9TVFlMRVNfU0laRSArIE1JRERMRV9TVFlMRVNfU0laRSArIDFdOwotCQkJYWxsQmxhbmsubGVuZ3RoID0gbmV4dEtub3duLnN0YXJ0IC0gYWxsQmxhbmsuc3RhcnQ7Ci0JCQluZXdSYW5nZXNbTEVGVF9TVFlMRVNfU0laRV0gPSBhbGxCbGFuazsKLQkJCXJldHVybiBuZXdSYW5nZXM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIHBhc3N0aHJvdWdoIG1ldGhvZCB0aGF0IGV4dHJhY3RzIHJlbGV2YW50IGRhdGEgZnJvbSB0aGUKLQkgKiBMaW5lU3R5bGVFdmVudCBhbmQgcGFzc2VzIGl0IGFsb25nLiBUaGlzIG1ldGhvZCB3YXMgc2VwYXJhdGVkIGZvcgotCSAqIHBlcmZvcm1hbmNlIHRlc3RpbmcgcHVycG9zZXMuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUxpc3RlbmVyI2xpbmVHZXRTdHlsZShMaW5lU3R5bGVFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaW5lR2V0U3R5bGUoTGluZVN0eWxlRXZlbnQgZXZlbnQpIHsKLQkJaW50IG9mZnNldCA9IGV2ZW50LmxpbmVPZmZzZXQ7Ci0JCWludCBsZW5ndGggPSBldmVudC5saW5lVGV4dC5sZW5ndGgoKTsKLQotCQkvKgotCQkgKiBGb3Igc29tZSByZWFzb24sIHdlIGFyZSBzb21ldGltZXMgYXNrZWQgZm9yIHRoZSBzYW1lIHN0eWxlIHJhbmdlCi0JCSAqIG92ZXIgYW5kIG92ZXIgYWdhaW4uIFRoaXMgd2FzIGZvdW5kIHRvIGhhcHBlbiBkdXJpbmcgJ3JldmVydCcgb2YgYQotCQkgKiBmaWxlIHdpdGggb25lIGxpbmUgaW4gaXQgdGhhdCBpcyA0MEsgbG9uZyEgU28sIHdoaWxlIHdlIGRvbid0IGtub3cKLQkJICogcm9vdCBjYXVzZSwgY2FjaGluZyB0aGUgc3R5bGVkIHJhbmdlcyBpbiBjYXNlIHRoZSBleGFjdCBzYW1lCi0JCSAqIHJlcXVlc3QgaXMgbWFkZSBtdWx0aXBsZSB0aW1lcyBzZWVtcyBsaWtlIGNoZWFwIGluc3VyYW5jZS4KLQkJICovCi0JCWlmIChvZmZzZXQgPT0gZlNhdmVkT2Zmc2V0ICYmIGxlbmd0aCA9PSBmU2F2ZWRMZW5ndGggJiYgZlNhdmVkUmFuZ2VzICE9IG51bGwpIHsKLQkJCWV2ZW50LnN0eWxlcyA9IGZTYXZlZFJhbmdlczsKLQkJfQotCQllbHNlIHsKLQkJCS8vIG5lZWQgdG8gYXNzaWduIHRoaXMgYXJyYXkgaGVyZSwgb3IgZWxzZSB0aGUgZmllbGQgd29uJ3QgZ2V0Ci0JCQkvLyB1cGRhdGVkCi0JCQlldmVudC5zdHlsZXMgPSBsaW5lR2V0U3R5bGUob2Zmc2V0LCBsZW5ndGgpOwotCQkJLy8gbm93IHNhdmVkICJjYWNoZWQgZGF0YSIgZm9yIHJlcGVhdGVkIHJlcXVlc3RzIHdoaWNoIGFyZSBleGFjbHR5Ci0JCQkvLyBzYW1lCi0JCQlmU2F2ZWRPZmZzZXQgPSBvZmZzZXQ7Ci0JCQlmU2F2ZWRMZW5ndGggPSBsZW5ndGg7Ci0JCQlmU2F2ZWRSYW5nZXMgPSBldmVudC5zdHlsZXM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBpdHMgdmVyeSBpbXBvcnRhbnQgdGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJuIG51bGwsIHdoaWNoIGlzIHdoeQotCSAqIHRoZSBmaW5hbCBudWxsIGNoZWNrIGlzIGluIGEgZmluYWxseSBjbGF1c2UKLQkgKi8KLQotCXByb3RlY3RlZCBTdHlsZVJhbmdlW10gcHJlcGFyZVN0eWxlUmFuZ2VzQXJyYXkoSVR5cGVkUmVnaW9uW10gcGFydGl0aW9ucywgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0KLQkJU3R5bGVSYW5nZVtdIHJlc3VsdCA9IEVNUFRZX1NUWUxFX1JBTkdFOwotCi0JCWlmIChmSG9sZFN0eWxlUmVzdWx0cyA9PSBudWxsKSB7Ci0JCQlmSG9sZFN0eWxlUmVzdWx0cyA9IG5ldyBBcnJheUxpc3QocGFydGl0aW9ucy5sZW5ndGgpOwotCQl9Ci0JCWVsc2UgewotCQkJZkhvbGRTdHlsZVJlc3VsdHMuY2xlYXIoKTsKLQkJfQotCi0JCS8vIFRPRE86IG1ha2Ugc29tZSBvZiB0aGVzZSBpbnN0YW5jZSB2YXJpYWJsZXMgdG8gcHJldmVudCBjcmVhdGlvbiBvbgotCQkvLyBzdGFjawotCQlMaW5lU3R5bGVQcm92aWRlciBjdXJyZW50TGluZVN0eWxlUHJvdmlkZXIgPSBudWxsOwotCQlib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVHlwZWRSZWdpb24gY3VycmVudFBhcnRpdGlvbiA9IHBhcnRpdGlvbnNbaV07Ci0JCQljdXJyZW50TGluZVN0eWxlUHJvdmlkZXIgPSBnZXRQcm92aWRlckZvcihjdXJyZW50UGFydGl0aW9uKTsKLQkJCWN1cnJlbnRMaW5lU3R5bGVQcm92aWRlci5pbml0KGdldERvY3VtZW50KCksIHRoaXMpOwotCQkJaGFuZGxlZCA9IGN1cnJlbnRMaW5lU3R5bGVQcm92aWRlci5wcmVwYXJlUmVnaW9ucyhjdXJyZW50UGFydGl0aW9uLCBjdXJyZW50UGFydGl0aW9uLmdldE9mZnNldCgpLCBjdXJyZW50UGFydGl0aW9uLmdldExlbmd0aCgpLCBmSG9sZFN0eWxlUmVzdWx0cyk7Ci0JCQlpZiAoRGVidWcuc3ludGF4SGlnaGxpZ2h0aW5nICYmICFoYW5kbGVkKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJEaWQgbm90IGhhbmRsZSBoaWdobGlnaHRpbmcgaW4gSGlnaGxpZ2h0ZXIgaW5uZXIgd2hpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaW50IHJlc3VsdFNpemUgPSBmSG9sZFN0eWxlUmVzdWx0cy5zaXplKCk7Ci0JCWlmIChyZXN1bHRTaXplID4gMCkgewotCQkJcmVzdWx0ID0gKFN0eWxlUmFuZ2VbXSkgZkhvbGRTdHlsZVJlc3VsdHMudG9BcnJheShuZXcgU3R5bGVSYW5nZVtmSG9sZFN0eWxlUmVzdWx0cy5zaXplKCldKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IEVNUFRZX1NUWUxFX1JBTkdFOwotCQl9Ci0JCXJlc3VsdCA9IGNvbnZlcnRSZWFkT25seVJlZ2lvbnMocmVzdWx0LCBzdGFydCwgbGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoRGlzcGxheSgpIHsKLQkJaWYgKHRleHRXaWRnZXQgIT0gbnVsbCAmJiAhdGV4dFdpZGdldC5pc0Rpc3Bvc2VkKCkpCi0JCQl0ZXh0V2lkZ2V0LnJlZHJhdygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hEaXNwbGF5KGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlpZiAodGV4dFdpZGdldCAhPSBudWxsICYmICF0ZXh0V2lkZ2V0LmlzRGlzcG9zZWQoKSkKLQkJCXRleHRXaWRnZXQucmVkcmF3UmFuZ2Uoc3RhcnQsIGxlbmd0aCwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvdmlkZXIoU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJZ2V0VGFibGVPZlByb3ZpZGVycygpLnJlbW92ZShwYXJ0aXRpb25UeXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCQlmU3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50UGFydGl0aW9uaW5nKFN0cmluZyBwYXJ0aXRpb25pbmcpIHsKLQkJaWYgKHBhcnRpdGlvbmluZyAhPSBudWxsKSB7Ci0JCQlmUGFydGl0aW9uaW5nID0gcGFydGl0aW9uaW5nOwotCQl9Ci0JCWVsc2UgewotCQkJZlBhcnRpdGlvbmluZyA9IElEb2N1bWVudEV4dGVuc2lvbjMuREVGQVVMVF9QQVJUSVRJT05JTkc7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVbmluc3RhbGxzIGhpZ2hsaWdodGVyIHN1cHBvcnQgZnJvbSB0aGUgdGV4dCB2aWV3ZXIgaXQgaGFzIHByZXZpb3VzbHkKLQkgKiBiZSBpbnN0YWxsZWQgb24uCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlpZiAodGV4dFdpZGdldCAhPSBudWxsICYmICF0ZXh0V2lkZ2V0LmlzRGlzcG9zZWQoKSkgewotCQkJdGV4dFdpZGdldC5yZW1vdmVMaW5lU3R5bGVMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQl0ZXh0V2lkZ2V0ID0gbnVsbDsKLQotCQlDb2xsZWN0aW9uIHByb3ZpZGVycyA9IGdldFRhYmxlT2ZQcm92aWRlcnMoKS52YWx1ZXMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm92aWRlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTGluZVN0eWxlUHJvdmlkZXIgbGluZVN0eWxlUHJvdmlkZXIgPSAoTGluZVN0eWxlUHJvdmlkZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWxpbmVTdHlsZVByb3ZpZGVyLnJlbGVhc2UoKTsKLQkJCS8vIHRoaXMgcmVtb3ZlIHByb2JhYmx5IGlzbid0IHN0cmljdGx5IG5lZWRlZCwgc2luY2UKLQkJCS8vIHR5cGljYWxseSBoaWdobGlnaHRlciBpbnN0YW5jZSBhcyBhIHdob2xlIHdpbGwgZ28KLQkJCS8vIGF3YXkgLi4uIGJ1dCBpbiBjYXNlIHRoYXQgZXZlciBjaGFuZ2VzLCB0aGlzIHNlZW1zIGxpa2UKLQkJCS8vIGEgYmV0dGVyIHN0eWxlLgotCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgKGdldEV4dGVuZGVkUHJvdmlkZXJzKCkpIHsKLQkJCXByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3QoZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKS52YWx1ZXMoKSk7Ci0JCQlnZXRFeHRlbmRlZFByb3ZpZGVycygpLmNsZWFyKCk7Ci0JCX0KLQkJaXRlcmF0b3IgPSBwcm92aWRlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTGluZVN0eWxlUHJvdmlkZXIgbGluZVN0eWxlUHJvdmlkZXIgPSAoTGluZVN0eWxlUHJvdmlkZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChsaW5lU3R5bGVQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJbGluZVN0eWxlUHJvdmlkZXIucmVsZWFzZSgpOwotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0KLQkJSVByZWZlcmVuY2VTdG9yZSBlZGl0b3JTdG9yZSA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJZWRpdG9yU3RvcmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmRm9yZWdyb3VuZFNjYWxlTGlzdGVuZXIpOwotCQlkaXNwb3NlQ29sb3JUYWJsZSgpOwotCi0JCS8vIGNsZWFyIG91dCBjYWNoZWQgdmFyaWFibGVzIChkMjgyODk0KQotCQlmU2F2ZWRPZmZzZXQgPSAtMTsKLQkJZlNhdmVkTGVuZ3RoID0gLTE7Ci0JCWZTYXZlZFJhbmdlcyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUHVyZWx5IGEgZGVidWdnaW5nIGFpZGUuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkKFN0eWxlUmFuZ2VbXSBldmVudFN0eWxlcywgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGluZUxlbmd0aCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZXZlbnRTdHlsZXMgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50U3R5bGVzLmxlbmd0aCA+IDApIHsKLQkJCQlTdHlsZVJhbmdlIGZpcnN0ID0gZXZlbnRTdHlsZXNbMF07Ci0JCQkJU3R5bGVSYW5nZSBsYXN0ID0gZXZlbnRTdHlsZXNbZXZlbnRTdHlsZXMubGVuZ3RoIC0gMV07Ci0JCQkJaWYgKHN0YXJ0T2Zmc2V0ID4gZmlyc3Quc3RhcnQpIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpbnQgbGluZUVuZE9mZnNldCA9IHN0YXJ0T2Zmc2V0ICsgbGluZUxlbmd0aDsKLQkJCQkJaW50IGxhc3RPZmZzZXQgPSBsYXN0LnN0YXJ0ICsgbGFzdC5sZW5ndGg7Ci0JCQkJCWlmIChsYXN0T2Zmc2V0ID4gbGluZUVuZE9mZnNldCkgewotCQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gYSB6ZXJvIGxlbmd0aCBhcnJheSBpcyBvawotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvSUhpZ2hsaWdodGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvSUhpZ2hsaWdodGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZjM3ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0lIaWdobGlnaHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5MaW5lU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0vKioKLSAqIEBhdXRob3IgZGF2aWR3Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSGlnaGxpZ2h0ZXIgZXh0ZW5kcyBMaW5lU3R5bGVMaXN0ZW5lciB7Ci0Jdm9pZCBhZGRQcm92aWRlcihTdHJpbmcgcGFydGl0aW9uVHlwZSwgTGluZVN0eWxlUHJvdmlkZXIgcHJvdmlkZXIpOwotCi0Jdm9pZCBpbnN0YWxsKElUZXh0Vmlld2VyIHZpZXdlcik7Ci0KLQl2b2lkIHJlbW92ZVByb3ZpZGVyKFN0cmluZyBwYXJ0aXRpb25UeXBlKTsKLQotCXZvaWQgc2V0RG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQotCXZvaWQgdW5pbnN0YWxsKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjgxODI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIENsaWVudHMKLSAqIHNob3VsZCBpbnN0ZWFkIHN1YmNsYXNzIEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGluZVN0eWxlUHJvdmlkZXIgewotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBwcm92aWRlciBmb3IgdGhlIGdpdmVuIEhpZ2hsaWdodGVyIGFuZCBkb2N1bWVudC4gVGhpcwotCSAqIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlIGJlZm9yZSBwcmVwYXJlUmVnaW9ucyBpcyBjYWxsZWQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHBhcmFtIGhpZ2hsaWdodGVyCi0JICovCi0Jdm9pZCBpbml0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIEhpZ2hsaWdodGVyIGhpZ2hsaWdodGVyKTsKLQotCS8qKgotCSAqIE9wdGlvbmFsbHkgYXBwZW5kcyBTdHlsZVJhbmdlcyB0byB0aGUgc3R5bGVSYW5nZXMgQ29sbGVjdGlvbiwgaW4gb3JkZXIsCi0JICogYW5kIG9ubHkgY292ZXJpbmcgdGhlIGdpdmVuIHJhbmdlIHdpdGhpbiB0aGUgZG9jdW1lbnQuIFN0eWxlUmFuZ2VzIGFkZGVkCi0JICogdG8gdGhlIGNvbGxlY3Rpb24gc2hvdWxkIG5vdCBleHBhbmQgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGN1cnJlbnRSZWdpb24KLQkgKiBJVHlwZWRSZWdpb24uCi0JICogCi0JICogQHBhcmFtIGN1cnJlbnRSZWdpb24gLQotCSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZG9jdW1lbnQgcGFydGl0aW9uCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqIEBwYXJhbSBzdHlsZVJhbmdlcwotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIExpbmVTdHlsZVByb3ZpZGVyIGhhbmRsZWQgdGhlIHJlcXVlc3Q7IGhhbmRsaW5nCi0JICogICAgICAgICBpbmNsdWRlcyBub3QgYWRkaW5nIFN0eWxlUmFuZ2VzIGlmIHRoYXQgaXMgc3RpbGwgdGhlIGNvcnJlY3QKLQkgKiAgICAgICAgIGJlaGF2aW9yCi0JICovCi0JYm9vbGVhbiBwcmVwYXJlUmVnaW9ucyhJVHlwZWRSZWdpb24gY3VycmVudFJlZ2lvbiwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLCBDb2xsZWN0aW9uIHN0eWxlUmFuZ2VzKTsKLQotCS8qKgotCSAqIEluc3RydWN0cyB0aGlzIHByb3ZpZGVyIHRvIGZyZWUgdXAgYW55ICJyZXNvdXJjZXMiIGl0IG1pZ2h0IGJlIGhvbGRpbmcKLQkgKiBvbiB0byAoc3VjaCBhcyBsaXN0ZW5pbmcgZm9yIHByZWZlcmVuY2UgY2hhbmdlcykuIEl0IGlzIG9ubHkgY2FsbGVkCi0JICogb25jZSBpbiB0aGUgbGlmZXRpbWUgb2YgdGhpcyBwcm92aWRlci4KLQkgKi8KLQl2b2lkIHJlbGVhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvck5vT3AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvck5vT3AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q2MDkyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JOb09wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBieSBkZWZhdWx0LCBpZiBubyBhdHRyaWJ1dGUgcHJvdmlkZXIgaXMgZm91bmQgZm9yIGEKLSAqIGNlcnRhaW4gcmVnaW9uIHR5cGUuIEl0cyBwcm9iYWJseSBhbiBlcnJvciBpbiBhIGZhY3Rvcnkgc29tZXdoZXJlIGlmIGFuCi0gKiBhZGFwdGVyIGlzIG5vdCBmb3VuZCwgYnV0IHRoaXMgY2xhc3MgYWxsb3dzIHRoZSBsb2dpYyB0byBwcm9jZWVkIGJhc2ljYWxseQotICogc2ltcGx5IHByb3ZpZGluZyBkZWZhdWx0IGNvbG9yZWQgc3ludGF4IGhpZ2hsaWdodGluZy4KLSAqIAotICogTm90IHRvIGJlIHN1YmNsYXNzZWQuCi0gKi8KLWZpbmFsIHB1YmxpYyBjbGFzcyBMaW5lU3R5bGVQcm92aWRlckZvck5vT3AgaW1wbGVtZW50cyBMaW5lU3R5bGVQcm92aWRlciB7Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIEhpZ2hsaWdodGVyIGhpZ2hsaWdodGVyKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIjcHJlcGFyZVJlZ2lvbnMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb24sCi0JICogICAgICBpbnQsIGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJlcGFyZVJlZ2lvbnMoSVR5cGVkUmVnaW9uIGN1cnJlbnRSZWdpb24sIGludCBzdGFydCwgaW50IGxlbmd0aCwgQ29sbGVjdGlvbiBob2xkUmVzdWx0cykgewotCQkvLyBhZGQgbm90aGluZywgYnV0IHNheSBoYW5kbGVkLgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL1JlY29uY2lsZXJIaWdobGlnaHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL1JlY29uY2lsZXJIaWdobGlnaHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTM5ZDRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9SZWNvbmNpbGVySGlnaGxpZ2h0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5FeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi1wdWJsaWMgY2xhc3MgUmVjb25jaWxlckhpZ2hsaWdodGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NUWUxFX1BST1ZJREVSX0VYVEVOREVEX0lEID0gSGlnaGxpZ2h0ZXIuTElORV9TVFlMRV9QUk9WSURFUl9FWFRFTkRFRF9JRDsKLQotCXByaXZhdGUgTWFwIGZUYWJsZU9mUHJvdmlkZXJzID0gbnVsbDsKLQotCXByaXZhdGUgTWFwIGZFeHRlbmRlZFByb3ZpZGVycyA9IG51bGw7Ci0KLQlwcml2YXRlIElUZXh0Vmlld2VyIGZUZXh0Vmlld2VyID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gX3RyYWNlID0gQm9vbGVhbi52YWx1ZU9mKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL3N0cnVjdHVyZWRQcmVzZW50YXRpb25SZWNvbmNpbGVyIikpLmJvb2xlYW5WYWx1ZSgpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRSQUNFX1BSRUZJWCA9ICJTdHJ1Y3R1cmVkUHJlc2VudGF0aW9uUmVjb25jaWxlcjogIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgbG9uZyB0aW1lMDsKLQotCS8qKgotCSAqIGluc3RhbmNlIGZvciBvbGRlciBMaW5lU3R5bGVQcm92aWRlcnMgbG9hZGVkIGJ5IGV4dGVuc2lvbiBwb2ludCwKLQkgKiBjcmVhdGVkIGlmIG5lZWRlZAotCSAqLwotCXByaXZhdGUgQ29tcGF0aWJsZUhpZ2hsaWdodGVyIGZDb21wYXRpYmxlSGlnaGxpZ2h0ZXIgPSBudWxsOwotCi0JcHVibGljIHZvaWQgcmVmcmVzaERpc3BsYXkoKSB7Ci0JCWlmIChfdHJhY2UpIHsKLQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJaWYgKGZUZXh0Vmlld2VyICE9IG51bGwpCi0JCQlmVGV4dFZpZXdlci5pbnZhbGlkYXRlVGV4dFByZXNlbnRhdGlvbigpOwotCQlpZiAoX3RyYWNlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oVFJBQ0VfUFJFRklYICsgIlJlY29uY2lsZXJIaWdobGlnaHRlciByZWZyZXNoRGlzcGxheSB0b29rICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgYSBnaXZlbiBsaW5lIHN0eWxlIHByb3ZpZGVyIGZvciBhIHBhcnRpY3VsYXIgcGFydGl0aW9uIHR5cGUuCi0JICogSWYgdGhlcmUgaXMgYWxyZWFkeSBhIGxpbmUgc3R5bGUgcHJvdmlkZXIgcmVnaXN0ZXJlZCBmb3IgdGhpcyB0eXBlLCB0aGUKLQkgKiBuZXcgbGluZSBzdHlsZSBwcm92aWRlciBpcyByZWdpc3RlcmVkIGluc3RlYWQgb2YgdGhlIG9sZCBvbmUuCi0JICogCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJ0aXRpb24gdHlwZSB1bmRlciB3aGljaCB0byByZWdpc3RlcgotCSAqIEBwYXJhbSB0aGUKLQkgKiAgICAgICAgICAgIGxpbmUgc3R5bGUgcHJvdmlkZXIgdG8gcmVnaXN0ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogICAgICAgICAgICByZW1vdmUgYW4gZXhpc3Rpbmcgb25lCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvdmlkZXIoU3RyaW5nIHBhcnRpdGlvblR5cGUsIExpbmVTdHlsZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCWdldFRhYmxlT2ZQcm92aWRlcnMoKS5wdXQocGFydGl0aW9uVHlwZSwgcHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3ZpZGVyKFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCWdldFRhYmxlT2ZQcm92aWRlcnMoKS5yZW1vdmUocGFydGl0aW9uVHlwZSk7Ci0JfQotCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyIGdldFByb3ZpZGVyKFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUxpbmVTdHlsZVByb3ZpZGVyIHJlc3VsdCA9IChMaW5lU3R5bGVQcm92aWRlcikgZ2V0VGFibGVPZlByb3ZpZGVycygpLmdldChwYXJ0aXRpb25UeXBlKTsKLQotCQkvLyBUaGUgcHJvdmlkZXIgd2FzIG5vdCB3aXRoaW4gdGhlIGRlZmF1bHQgc2V0IG9mIHByb3ZpZGVycy4gVXNlIHRoZQotCQkvLyBleHRlbmRlZCBjb25maWd1cmF0aW9uCi0JCS8vIHRvIGxvb2sgdXAgYWRkaXRpb25hbCBwcm92aWRlcnMKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkvLyBOT1QgWUVUIEZJTkFMSVpFRCAtIERPIE5PVCBDT05TSURFUiBBUyBBUEkKLQkJCXN5bmNocm9uaXplZCAoZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKSkgewotCQkJCWlmICghZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKS5jb250YWluc0tleShwYXJ0aXRpb25UeXBlKSkgewotCQkJCQlyZXN1bHQgPSAoTGluZVN0eWxlUHJvdmlkZXIpIEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9uKExJTkVfU1RZTEVfUFJPVklERVJfRVhURU5ERURfSUQsIHBhcnRpdGlvblR5cGUpOwotCQkJCQlnZXRFeHRlbmRlZFByb3ZpZGVycygpLnB1dChwYXJ0aXRpb25UeXBlLCByZXN1bHQpOwotCi0JCQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiBmVGV4dFZpZXdlciAhPSBudWxsICYmIGZUZXh0Vmlld2VyLmdldERvY3VtZW50KCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcikgewotCQkJCQkJCSgoQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcikgcmVzdWx0KS5pbml0KChJU3RydWN0dXJlZERvY3VtZW50KSBmVGV4dFZpZXdlci5nZXREb2N1bWVudCgpLCB0aGlzKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJDb21wYXRpYmxlSGlnaGxpZ2h0ZXIgaW5zdGFsbGluZyBjb21wYXRpYmlsaXR5IGZvciAiICsgcmVzdWx0LmdldENsYXNzKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKGZDb21wYXRpYmxlSGlnaGxpZ2h0ZXIgPT0gbnVsbCkgewotCQkJCQkJCQlmQ29tcGF0aWJsZUhpZ2hsaWdodGVyID0gbmV3IENvbXBhdGlibGVIaWdobGlnaHRlcigpOwotCQkJCQkJCQlmQ29tcGF0aWJsZUhpZ2hsaWdodGVyLmluc3RhbGwoZlRleHRWaWV3ZXIpOwotCQkJCQkJCX0KLQkJCQkJCQlyZXN1bHQuaW5pdCgoSVN0cnVjdHVyZWREb2N1bWVudCkgZlRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSwgZkNvbXBhdGlibGVIaWdobGlnaHRlcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IChMaW5lU3R5bGVQcm92aWRlcikgZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKS5nZXQocGFydGl0aW9uVHlwZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0VGFibGVPZlByb3ZpZGVycygpIHsKLQkJaWYgKGZUYWJsZU9mUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCWZUYWJsZU9mUHJvdmlkZXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlyZXR1cm4gZlRhYmxlT2ZQcm92aWRlcnM7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKSB7Ci0JCWlmIChmRXh0ZW5kZWRQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJZkV4dGVuZGVkUHJvdmlkZXJzID0gbmV3IEhhc2hNYXAoMyk7Ci0JCX0KLQkJcmV0dXJuIGZFeHRlbmRlZFByb3ZpZGVyczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJZlRleHRWaWV3ZXIgPSB0ZXh0Vmlld2VyOwotCQlpZiAoZkNvbXBhdGlibGVIaWdobGlnaHRlciAhPSBudWxsKSB7Ci0JCQlmQ29tcGF0aWJsZUhpZ2hsaWdodGVyLnVuaW5zdGFsbCgpOwotCQkJZkNvbXBhdGlibGVIaWdobGlnaHRlci5pbnN0YWxsKGZUZXh0Vmlld2VyKTsKLQkJfQotCQlyZWZyZXNoRGlzcGxheSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbCgpIHsKLQkJSXRlcmF0b3IgaXQgPSBnZXRUYWJsZU9mUHJvdmlkZXJzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlMaW5lU3R5bGVQcm92aWRlciBwcm92aWRlciA9IChMaW5lU3R5bGVQcm92aWRlcikgaXQubmV4dCgpOwotCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpCi0JCQkJcHJvdmlkZXIucmVsZWFzZSgpOwotCQl9Ci0KLQkJaXQgPSBnZXRFeHRlbmRlZFByb3ZpZGVycygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUxpbmVTdHlsZVByb3ZpZGVyIHByb3ZpZGVyID0gKExpbmVTdHlsZVByb3ZpZGVyKSBpdC5uZXh0KCk7Ci0JCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkKLQkJCQlwcm92aWRlci5yZWxlYXNlKCk7Ci0JCX0KLQotCQlnZXRUYWJsZU9mUHJvdmlkZXJzKCkuY2xlYXIoKTsKLQkJZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKS5jbGVhcigpOwotCQlmVGFibGVPZlByb3ZpZGVycyA9IG51bGw7Ci0JCWlmIChmQ29tcGF0aWJsZUhpZ2hsaWdodGVyICE9IG51bGwpIHsKLQkJCWZDb21wYXRpYmxlSGlnaGxpZ2h0ZXIudW5pbnN0YWxsKCk7Ci0JCX0KLQkJZlRleHRWaWV3ZXIgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9TdHJ1Y3R1cmVkUHJlc2VudGF0aW9uUmVjb25jaWxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL1N0cnVjdHVyZWRQcmVzZW50YXRpb25SZWNvbmNpbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMDFhZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL1N0cnVjdHVyZWRQcmVzZW50YXRpb25SZWNvbmNpbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0UG9zaXRpb25VcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lckV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlR5cGVkUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcmVzZW50YXRpb24uSVByZXNlbnRhdGlvbkRhbWFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcmVzZW50YXRpb24uSVByZXNlbnRhdGlvblJlY29uY2lsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcmVzZW50YXRpb24uSVByZXNlbnRhdGlvblJlY29uY2lsZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcmVzZW50YXRpb24uSVByZXNlbnRhdGlvblJlcGFpcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFByZXNlbnRhdGlvblJlY29uY2lsZXIgaW1wbGVtZW50cyBJUHJlc2VudGF0aW9uUmVjb25jaWxlciwgSVByZXNlbnRhdGlvblJlY29uY2lsZXJFeHRlbnNpb24gewotCi0JLyoqIFByZWZpeCBvZiB0aGUgbmFtZSBvZiB0aGUgcG9zaXRpb24gY2F0ZWdvcnkgZm9yIHRyYWNraW5nIGRhbWFnZSByZWdpb25zLiAqLwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVFJBQ0tFRF9QQVJUSVRJT049ICJfX3JlY29uY2lsZXJfdHJhY2tlZF9wYXJ0aXRpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBfdHJhY2UgPSBCb29sZWFuLnZhbHVlT2YoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvc3RydWN0dXJlZFByZXNlbnRhdGlvblJlY29uY2lsZXIiKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIF90cmFjZVRpbWUgPSBCb29sZWFuLnZhbHVlT2YoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvc3RydWN0dXJlZFByZXNlbnRhdGlvblJlY29uY2lsZXIvdGltZSIpKS5ib29sZWFuVmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRV9QUkVGSVggPSAiU3RydWN0dXJlZFByZXNlbnRhdGlvblJlY29uY2lsZXI6ICI7Ci0JcHJpdmF0ZSBsb25nIHRpbWUwOwotCXByaXZhdGUgbG9uZyB0aW1lMTsKLQotCS8qKgotCSAqIEludGVybmFsIGxpc3RlbmVyIGNsYXNzLgotCSAqLwotCWNsYXNzIEludGVybmFsTGlzdGVuZXIgaW1wbGVtZW50cwotCQkJSVRleHRJbnB1dExpc3RlbmVyLCBJRG9jdW1lbnRMaXN0ZW5lciwgSVRleHRMaXN0ZW5lciwgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLAotCQkJSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIsIElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uLCBJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lckV4dGVuc2lvbjIsIElEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIgewotCi0JCS8qKiBTZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYmV0d2VlbiBhIGRvY3VtZW50IGFib3V0IHRvIGJlIGNoYW5nZWQgYW5kIGEgY2hhbmdlZCBldmVudC4gKi8KLQkJcHJpdmF0ZSBib29sZWFuIGZEb2N1bWVudENoYW5naW5nPSBmYWxzZTsKLQkJCi0JCS8qKiBGbGFnIGZvciB0aGUgZG9jdW1lbnQgYmVpbmcgaW4gYSByZXdyaXRlIHNlc3Npb24gKi8KLQkJcHJpdmF0ZSBib29sZWFuIGZJblJld3JpdGVTZXNzaW9uID0gZmFsc2U7Ci0JCQotCQkvKiogRmxhZyBmb3Igc29tZSBraW5kIG9mIGNoYW5nZXMgYmVpbmcgYXBwbGllZCBkdXJpbmcgYSBkb2N1bWVudCByZXdyaXRlIHNlc3Npb24gKi8KLQkJcHJpdmF0ZSBib29sZWFuIGZIYXNJbmNvbWluZ0NoYW5nZXMgPSBmYWxzZTsKLQkJCi0JCS8qKgotCQkgKiBUaGUgY2FjaGVkIHJlZHJhdyBzdGF0ZSBvZiB0aGUgdGV4dCB2aWV3ZXIuCi0JCSAqIEBzaW5jZSAzLjAKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBmQ2FjaGVkUmVkcmF3U3RhdGU9IHRydWU7Ci0KLQkJcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJaWYoZkluUmV3cml0ZVNlc3Npb24pIHsKLQkJCQlmSGFzSW5jb21pbmdDaGFuZ2VzID0gdHJ1ZTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoX3RyYWNlKSB7Ci0JCQkJdGltZTEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRMZW5ndGgoKTsKLQkJCXJlY29yZERhbWFnZShuZXcgUmVnaW9uKDAsIGxlbmd0aCksIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldERvY3VtZW50KCkpOwotCQkJaWYgKF90cmFjZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG4iICsgVFJBQ0VfUFJFRklYICsgImNhbGN1bGF0ZWQgZGFtYWdlIGZvciBOZXdEb2N1bWVudEV2ZW50OiAobGVuZ3RoPSIgKyBsZW5ndGggKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0JCQl9Ci0JCQlpZiAoX3RyYWNlICYmIF90cmFjZVRpbWUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVFJBQ0VfUFJFRklYICsgImNhbGN1bGF0ZWQgZGFtYWdlIGZvciBOZXdEb2N1bWVudEV2ZW50IGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktdGltZTEpICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN5c3RlbS5vdXQuZmx1c2goKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCWlmKGZJblJld3JpdGVTZXNzaW9uKSB7Ci0JCQkJZkhhc0luY29taW5nQ2hhbmdlcyA9IHRydWU7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKF90cmFjZSkgewotCQkJCXRpbWUxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQucmVhc29uID09IE5vQ2hhbmdlRXZlbnQuTk9fQ09OVEVOVF9DSEFOR0UgKSB7Ci0JCQkJSVJlZ2lvbiBkYW1hZ2UgPSBuZXcgUmVnaW9uKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmZPZmZzZXQsIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmZMZW5ndGgpOwotCQkJCXJlY29yZERhbWFnZShkYW1hZ2UsIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmZEb2N1bWVudCk7Ci0JCQl9Ci0JCQlpZiAoX3RyYWNlICYmIF90cmFjZVRpbWUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuIiArIFRSQUNFX1BSRUZJWCArICJjYWxjdWxhdGVkIGRhbWFnZSBmb3IgTm9DaGFuZ2VFdmVudCBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXRpbWUxKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlpZihmSW5SZXdyaXRlU2Vzc2lvbikgewotCQkJCWZIYXNJbmNvbWluZ0NoYW5nZXMgPSB0cnVlOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChfdHJhY2UpIHsKLQkJCQl0aW1lMSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJSVJlZ2lvbiBkYW1hZ2U7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdEb2N1bWVudFJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCQlpZiAobmV3RG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpID4gMCkgewotCQkJCWludCBzdGFydE9mZnNldCA9IG5ld0RvY3VtZW50UmVnaW9ucy5pdGVtKDApLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGxlbmd0aCA9IG5ld0RvY3VtZW50UmVnaW9ucy5pdGVtKG5ld0RvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKSAtIDEpLmdldEVuZE9mZnNldCgpIC0gc3RhcnRPZmZzZXQ7Ci0JCQkJZGFtYWdlID0gbmV3IFJlZ2lvbihzdGFydE9mZnNldCwgbGVuZ3RoKTsKLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZGFtYWdlID0gbmV3IFJlZ2lvbihzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5mT2Zmc2V0LCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQlyZWNvcmREYW1hZ2UoZGFtYWdlLCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5mRG9jdW1lbnQpOwotCQkJaWYgKF90cmFjZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG4iICsgVFJBQ0VfUFJFRklYICsgImNhbGN1bGF0ZWQgZGFtYWdlIGZvciBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDogWyIgKyBkYW1hZ2UuZ2V0T2Zmc2V0KCkgKyAiOiIgKyBkYW1hZ2UuZ2V0TGVuZ3RoKCkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtNCQKLQkJCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0JCQl9Ci0JCQlpZiAoX3RyYWNlICYmIF90cmFjZVRpbWUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVFJBQ0VfUFJFRklYICsgImNhbGN1bGF0ZWQgZGFtYWdlIGZvciBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXRpbWUxKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJaWYoZkluUmV3cml0ZVNlc3Npb24pIHsKLQkJCQlmSGFzSW5jb21pbmdDaGFuZ2VzID0gdHJ1ZTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoX3RyYWNlKSB7Ci0JCQkJdGltZTEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCUlUZXh0UmVnaW9uIGNoYW5nZWRSZWdpb24gPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRSZWdpb24oKTsKLQkJCWludCBzdGFydE9mZnNldCA9IGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNoYW5nZWRSZWdpb24pOwotCQkJaW50IGxlbmd0aCA9IGNoYW5nZWRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlJUmVnaW9uIGRhbWFnZSA9IG5ldyBSZWdpb24oc3RhcnRPZmZzZXQsIGxlbmd0aCk7Ci0KLQkJCXJlY29yZERhbWFnZShkYW1hZ2UsIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmZEb2N1bWVudCk7Ci0JCQlpZiAoX3RyYWNlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcbiIgKyBUUkFDRV9QUkVGSVggKyAiY2FsY3VsYXRlZCBkYW1hZ2UgZm9yIFJlZ2lvbkNoYW5nZWRFdmVudDogWyIgKyBkYW1hZ2UuZ2V0T2Zmc2V0KCkgKyAiOiIgKyBkYW1hZ2UuZ2V0TGVuZ3RoKCkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtNCQKLQkJCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0JCQl9Ci0JCQlpZiAoX3RyYWNlICYmIF90cmFjZVRpbWUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVFJBQ0VfUFJFRklYICsgImNhbGN1bGF0ZWQgZGFtYWdlIGZvciBSZWdpb25DaGFuZ2VkRXZlbnQgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS10aW1lMSkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJU3lzdGVtLm91dC5mbHVzaCgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlpZihmSW5SZXdyaXRlU2Vzc2lvbikgewotCQkJCWZIYXNJbmNvbWluZ0NoYW5nZXMgPSB0cnVlOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChfdHJhY2UpIHsKLQkJCQl0aW1lMSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJSVJlZ2lvbiBkYW1hZ2U7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE5ld1JlZ2lvbnMoKTsKLQkJCWlmIChuZXdSZWdpb25zLnNpemUoKSA+IDApIHsKLQkJCQlJVGV4dFJlZ2lvbiBmaXJzdENoYW5nZWRSZWdpb24gPSBuZXdSZWdpb25zLmdldCgwKTsKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0Q2hhbmdlZFJlZ2lvbiA9IG5ld1JlZ2lvbnMuZ2V0KG5ld1JlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCQkJaW50IHN0YXJ0T2Zmc2V0ID0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZmlyc3RDaGFuZ2VkUmVnaW9uKTsKLQkJCQlpbnQgbGVuZ3RoID0gZG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KGxhc3RDaGFuZ2VkUmVnaW9uKSAtIHN0YXJ0T2Zmc2V0OwotCQkJCWRhbWFnZSA9IG5ldyBSZWdpb24oc3RhcnRPZmZzZXQsIGxlbmd0aCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlkYW1hZ2UgPSBuZXcgUmVnaW9uKGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGRvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJCXJlY29yZERhbWFnZShkYW1hZ2UsIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmZEb2N1bWVudCk7Ci0JCQlpZiAoX3RyYWNlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcbiIgKyBUUkFDRV9QUkVGSVggKyAiY2FsY3VsYXRlZCBkYW1hZ2UgZm9yIFJlZ2lvbnNSZXBsYWNlZEV2ZW50OiBbIiArIGRhbWFnZS5nZXRPZmZzZXQoKSArICI6IiArIGRhbWFnZS5nZXRMZW5ndGgoKSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkLy8kTk9OLU5MUy00JAotCQkJCVN5c3RlbS5vdXQuZmx1c2goKTsKLQkJCX0KLQkJCWlmIChfdHJhY2UgJiYgX3RyYWNlVGltZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihUUkFDRV9QUkVGSVggKyAiY2FsY3VsYXRlZCBkYW1hZ2UgZm9yIFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktdGltZTEpICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN5c3RlbS5vdXQuZmx1c2goKTsKLQkJCX0KLQkJfQotCQkKLQkJLyoKLQkJICogQHNlZSBJVGV4dElucHV0TGlzdGVuZXIjaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoSURvY3VtZW50LCBJRG9jdW1lbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChJRG9jdW1lbnQgb2xkRG9jdW1lbnQsIElEb2N1bWVudCBuZXdEb2N1bWVudCkgewotCQkJaWYgKG9sZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCi0JCQkJCWZWaWV3ZXIucmVtb3ZlVGV4dExpc3RlbmVyKHRoaXMpOwotCQkJCQlvbGREb2N1bWVudC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCQkJCQlvbGREb2N1bWVudC5yZW1vdmVEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKHRoaXMpOwotCQkJCQlpZiAob2xkRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIG9sZERvY3VtZW50KS5yZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJCQkJfQotCi0JCQkJCW9sZERvY3VtZW50LnJlbW92ZVBvc2l0aW9uVXBkYXRlcihmUG9zaXRpb25VcGRhdGVyKTsKLQkJCQkJb2xkRG9jdW1lbnQucmVtb3ZlUG9zaXRpb25DYXRlZ29yeShmUG9zaXRpb25DYXRlZ29yeSk7Ci0KLQkJCQl9IGNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHgpIHsKLQkJCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW5lZCBmb3IgZm9ybWVyIGlucHV0IGRvY3VtZW50czsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElUZXh0SW5wdXRMaXN0ZW5lciNpbnB1dERvY3VtZW5DaGFuZ2VkKElEb2N1bWVudCwgSURvY3VtZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXREb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG9sZERvY3VtZW50LCBJRG9jdW1lbnQgbmV3RG9jdW1lbnQpIHsKLQkJCWlmIChfdHJhY2UgfHwgX3RyYWNlVGltZSkgewotCQkJCXRpbWUxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0KLQkJCWZEb2N1bWVudENoYW5naW5nPSBmYWxzZTsKLQkJCWZDYWNoZWRSZWRyYXdTdGF0ZT0gdHJ1ZTsKLQotCQkJaWYgKG5ld0RvY3VtZW50ICE9IG51bGwpIHsKLQkJCQluZXdEb2N1bWVudC5hZGRQb3NpdGlvbkNhdGVnb3J5KGZQb3NpdGlvbkNhdGVnb3J5KTsKLQkJCQluZXdEb2N1bWVudC5hZGRQb3NpdGlvblVwZGF0ZXIoZlBvc2l0aW9uVXBkYXRlcik7Ci0KLQkJCQlpZiAobmV3RG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCW5ld0RvY3VtZW50LmFkZERvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIodGhpcyk7Ci0JCQkJCW5ld0RvY3VtZW50LmFkZERvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudCluZXdEb2N1bWVudCkuYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCQkJfQotCQkJCWZWaWV3ZXIuYWRkVGV4dExpc3RlbmVyKHRoaXMpOwotCi0JCQkJaWYgKG5ld0RvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlzZXREb2N1bWVudFRvRGFtYWdlcnMobmV3RG9jdW1lbnQpOwotCQkJCQlzZXREb2N1bWVudFRvUmVwYWlyZXJzKG5ld0RvY3VtZW50KTsKLQkJCQkJcHJvY2Vzc0RhbWFnZShuZXcgUmVnaW9uKDAsIG5ld0RvY3VtZW50LmdldExlbmd0aCgpKSwgbmV3RG9jdW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChfdHJhY2UpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVFJBQ0VfUFJFRklYICsgInByb2Nlc3NlZCBkYW1hZ2UgZm9yIGlucHV0RG9jdW1lbnRDaGFuZ2VkIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMSkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyI2RvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChJRG9jdW1lbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQlpZiAoX3RyYWNlVGltZSkgewotCQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQlpZiAoIWZEb2N1bWVudENoYW5naW5nICYmIGZDYWNoZWRSZWRyYXdTdGF0ZSkKLQkJCQlwcm9jZXNzRGFtYWdlKG5ldyBSZWdpb24oMCwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpLCBkb2N1bWVudCk7Ci0JCQllbHNlCi0JCQkJZkRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZD0gdHJ1ZTsKLQkJCWlmIChfdHJhY2UpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVFJBQ0VfUFJFRklYICsgInByb2Nlc3NlZCBkYW1hZ2UgZm9yIGRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZCBbZnVsbCBkb2N1bWVudF0iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKF90cmFjZSAmJiBfdHJhY2VUaW1lKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKFRSQUNFX1BSRUZJWCArICJwcm9jZXNzZWQgZGFtYWdlIGZvciBkb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb24jZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKElEb2N1bWVudCwgSVJlZ2lvbikKLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKElEb2N1bWVudCBkb2N1bWVudCwgSVJlZ2lvbiBjaGFuZ2VkUmVnaW9uKSB7Ci0JCQlpZiAoX3RyYWNlVGltZSkgewotCQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQlpZiAoIWZEb2N1bWVudENoYW5naW5nICYmIGZDYWNoZWRSZWRyYXdTdGF0ZSkgewotCQkJCXByb2Nlc3NEYW1hZ2UobmV3IFJlZ2lvbihjaGFuZ2VkUmVnaW9uLmdldE9mZnNldCgpLCBjaGFuZ2VkUmVnaW9uLmdldExlbmd0aCgpKSwgZG9jdW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlmRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkPSB0cnVlOwotCQkJCWZDaGFuZ2VkRG9jdW1lbnRQYXJ0aXRpb25zPSBjaGFuZ2VkUmVnaW9uOwotCQkJfQotCQkJaWYgKF90cmFjZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihUUkFDRV9QUkVGSVggKyAicHJvY2Vzc2VkIGRhbWFnZSBmb3IgZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkIFsiICsgY2hhbmdlZFJlZ2lvbi5nZXRPZmZzZXQoKSArICI6IiArIGNoYW5nZWRSZWdpb24uZ2V0TGVuZ3RoKCkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJaWYgKF90cmFjZSAmJiBfdHJhY2VUaW1lKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKFRSQUNFX1BSRUZJWCArICJwcm9jZXNzZWQgZGFtYWdlIGZvciBkb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lckV4dGVuc2lvbjIjZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkRXZlbnQpCi0JCSAqIEBzaW5jZSAzLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChEb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWRFdmVudCBldmVudCkgewotCQkJSVJlZ2lvbiBjaGFuZ2VkUmVnaW9uPSBldmVudC5nZXRDaGFuZ2VkUmVnaW9uKGdldERvY3VtZW50UGFydGl0aW9uaW5nKCkpOwotCQkJaWYgKGNoYW5nZWRSZWdpb24gIT0gbnVsbCkKLQkJCQlkb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQoZXZlbnQuZ2V0RG9jdW1lbnQoKSwgY2hhbmdlZFJlZ2lvbik7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElEb2N1bWVudExpc3RlbmVyI2RvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZSkgewotCi0JCQlmRG9jdW1lbnRDaGFuZ2luZz0gdHJ1ZTsKLQkJCWlmIChmQ2FjaGVkUmVkcmF3U3RhdGUpIHsKLQkJCQl0cnkgewotCQkJCQlpbnQgb2Zmc2V0PSBlLmdldE9mZnNldCgpICsgZS5nZXRMZW5ndGgoKTsKLQkJCQkJSVR5cGVkUmVnaW9uIHJlZ2lvbj0gZ2V0UGFydGl0aW9uKGUuZ2V0RG9jdW1lbnQoKSwgb2Zmc2V0KTsKLQkJCQkJZlJlbWVtYmVyZWRQb3NpdGlvbj0gbmV3IFR5cGVkUG9zaXRpb24ocmVnaW9uKTsKLQkJCQkJZS5nZXREb2N1bWVudCgpLmFkZFBvc2l0aW9uKGZQb3NpdGlvbkNhdGVnb3J5LCBmUmVtZW1iZXJlZFBvc2l0aW9uKTsKLQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJCS8vIGNhbiBub3QgaGFwcGVuCi0JCQkJfSBjYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB4KSB7Ci0JCQkJCS8vIHNob3VsZCBub3QgaGFwcGVuIG9uIGlucHV0IGVsZW1lbnRzCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGUpIHsKLQkJCWlmIChmQ2FjaGVkUmVkcmF3U3RhdGUpIHsKLQkJCQl0cnkgewotCQkJCQllLmdldERvY3VtZW50KCkucmVtb3ZlUG9zaXRpb24oZlBvc2l0aW9uQ2F0ZWdvcnksIGZSZW1lbWJlcmVkUG9zaXRpb24pOwotCQkJCX0gY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24geCkgewotCQkJCQkvLyBjYW4gbm90IGhhcHBlbiBvbiBpbnB1dCBkb2N1bWVudHMKLQkJCQl9Ci0JCQl9Ci0JCQlmRG9jdW1lbnRDaGFuZ2luZz0gZmFsc2U7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElUZXh0TGlzdGVuZXIjdGV4dENoYW5nZWQoVGV4dEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgdGV4dENoYW5nZWQoVGV4dEV2ZW50IGUpIHsKLQkJCWlmKGZJblJld3JpdGVTZXNzaW9uKSB7Ci0JCQkJZkhhc0luY29taW5nQ2hhbmdlcyA9IHRydWU7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZkNhY2hlZFJlZHJhd1N0YXRlPSBlLmdldFZpZXdlclJlZHJhd1N0YXRlKCk7Ci0JIAkJaWYgKCFmQ2FjaGVkUmVkcmF3U3RhdGUpIHsKLQkJCQlpZiAoX3RyYWNlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG4iICsgVFJBQ0VfUFJFRklYICsgInJldHVybmVkIGVhcmx5IGZyb20gdGV4dENoYW5nZWQoVGV4dEV2ZW50KSIpOyAvLyROT04tTkxTLTEkCSAvLyROT04tTkxTLTIkCQotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoX3RyYWNlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcbiIgKyBUUkFDRV9QUkVGSVggKyAiZW50ZXJpbmcgdGV4dENoYW5nZWQoVGV4dEV2ZW50KSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCi0JIAkJSVJlZ2lvbiBkYW1hZ2U9IG51bGw7Ci0JIAkJSURvY3VtZW50IGRvY3VtZW50PSBudWxsOwotCi0JCSAJaWYgKGUuZ2V0RG9jdW1lbnRFdmVudCgpID09IG51bGwpIHsKLQkJIAkJZG9jdW1lbnQ9IGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJIAkJaWYgKGRvY3VtZW50ICE9IG51bGwpICB7Ci0JCQkgCQlpZiAoZS5nZXRPZmZzZXQoKSA9PSAwICYmIGUuZ2V0TGVuZ3RoKCkgPT0gMCAmJiBlLmdldFRleHQoKSA9PSBudWxsKSB7Ci0JCQkJCQkvLyByZWRyYXcgc3RhdGUgY2hhbmdlLCBkYW1hZ2UgdGhlIHdob2xlIGRvY3VtZW50Ci0JCQkJCQlkYW1hZ2U9IG5ldyBSZWdpb24oMCwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOwotCQkJIAkJfSBlbHNlIHsKLQkJCQkJCUlSZWdpb24gcmVnaW9uPSB3aWRnZXRSZWdpb24yTW9kZWxSZWdpb24oZSk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVN0cmluZyB0ZXh0PSBkb2N1bWVudC5nZXQocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCURvY3VtZW50RXZlbnQgZGU9IG5ldyBEb2N1bWVudEV2ZW50KGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSwgdGV4dCk7Ci0JCQkJCQkJZGFtYWdlPSBnZXREYW1hZ2UoZGUsIGZhbHNlKTsKLQkJCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQkJCQkvKiBpZ25vcmVkIGluIHBsYXRmb3JtIFByZXNlbnRhdGlvblJlY29uY2lsZXIsIHRvbyAqLwotCQkJCQkJfQotCQkJIAkJfQotCQkgCQl9Ci0JCSAJfSBlbHNlICB7Ci0JCSAJCURvY3VtZW50RXZlbnQgZGU9IGUuZ2V0RG9jdW1lbnRFdmVudCgpOwotCQkgCQlkb2N1bWVudD0gZGUuZ2V0RG9jdW1lbnQoKTsKLQkJIAkJZGFtYWdlPSBnZXREYW1hZ2UoZGUsIHRydWUpOwotCQkgCX0KLQkJCWlmKF90cmFjZSAmJiBfdHJhY2VUaW1lKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKFRSQUNFX1BSRUZJWCArICJjYWxjdWxhdGVkIHNpbXBsZSB0ZXh0IGRhbWFnZSBhdCAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN5c3RlbS5vdXQuZmx1c2goKTsKLQkJCX0KLQkJCQotCQkJYm9vbGVhbiBkYW1hZ2VPdmVybGFwcyA9IHByb2Nlc3NSZWNvcmRlZERhbWFnZXMoZGFtYWdlLCBkb2N1bWVudCk7Ci0JCQlpZihfdHJhY2UgJiYgX3RyYWNlVGltZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihUUkFDRV9QUkVGSVggKyAicHJvY2Vzc2VkIHJlY29yZGVkIHN0cnVjdHVyZWQgdGV4dCBkYW1hZ2UgYXQgIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJaWYgKGRhbWFnZSAhPSBudWxsICYmIGRvY3VtZW50ICE9IG51bGwgJiYgIWRhbWFnZU92ZXJsYXBzKSB7Ci0JCQkJcHJvY2Vzc0RhbWFnZShkYW1hZ2UsIGRvY3VtZW50KTsKLQkJCQlpZihfdHJhY2UgJiYgX3RyYWNlVGltZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVFJBQ0VfUFJFRklYICsgInByb2Nlc3NlZCBzaW1wbGUgdGV4dCBkYW1hZ2UgYXQgIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJU3lzdGVtLm91dC5mbHVzaCgpOwotCQkJCX0KLQkJCX0KLQotCQkJZkRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZD0gZmFsc2U7Ci0JCQlmQ2hhbmdlZERvY3VtZW50UGFydGl0aW9ucz0gbnVsbDsKLQkJCWlmKF90cmFjZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihUUkFDRV9QUkVGSVggKyAiZmluaXNoZWQgdGV4dENoYW5nZWQoVGV4dEV2ZW50KSBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFRyYW5zbGF0ZXMgdGhlIGdpdmVuIHRleHQgZXZlbnQgaW50byB0aGUgY29ycmVzcG9uZGluZyByYW5nZSBvZiB0aGUgdmlld2VyJ3MgZG9jdW1lbnQuCi0JCSAqCi0JCSAqIEBwYXJhbSBlIHRoZSB0ZXh0IGV2ZW50Ci0JCSAqIEByZXR1cm4gdGhlIHdpZGdldCByZWdpb24gY29ycmVzcG9uZGluZyB0aGUgcmVnaW9uIG9mIHRoZSBnaXZlbiBldmVudAotCQkgKiBAc2luY2UgMi4xCi0JCSAqLwotCQlwcm90ZWN0ZWQgSVJlZ2lvbiB3aWRnZXRSZWdpb24yTW9kZWxSZWdpb24oVGV4dEV2ZW50IGUpIHsKLQotCQkJU3RyaW5nIHRleHQ9IGUuZ2V0VGV4dCgpOwotCQkJaW50IGxlbmd0aD0gdGV4dCA9PSBudWxsID8gMCA6IHRleHQubGVuZ3RoKCk7Ci0KLQkJCWlmIChmVmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb241KSB7Ci0JCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbj0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgZlZpZXdlcjsKLQkJCQlyZXR1cm4gZXh0ZW5zaW9uLndpZGdldFJhbmdlMk1vZGVsUmFuZ2UobmV3IFJlZ2lvbihlLmdldE9mZnNldCgpLCBsZW5ndGgpKTsKLQkJCX0KLQotCQkJSVJlZ2lvbiB2aXNpYmxlPSBmVmlld2VyLmdldFZpc2libGVSZWdpb24oKTsKLQkJCUlSZWdpb24gcmVnaW9uPSBuZXcgUmVnaW9uKGUuZ2V0T2Zmc2V0KCkgKyB2aXNpYmxlLmdldE9mZnNldCgpLCBsZW5ndGgpOwotCQkJcmV0dXJuIHJlZ2lvbjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50UmV3cml0ZVNlc3Npb25DaGFuZ2VkKERvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudCBldmVudCkgewotCQkJZkluUmV3cml0ZVNlc3Npb24gPSAoZXZlbnQgIT0gbnVsbCAmJiBldmVudC5mQ2hhbmdlVHlwZSA9PSBEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQuU0VTU0lPTl9TVEFSVCk7Ci0JCQlpZighZkluUmV3cml0ZVNlc3Npb24gJiYgZkhhc0luY29taW5nQ2hhbmdlcyAmJiBldmVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKF90cmFjZSkKLQkJCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlwcm9jZXNzRGFtYWdlKG5ldyBSZWdpb24oMCwgZXZlbnQuZkRvY3VtZW50LmdldExlbmd0aCgpKSwgZXZlbnQuZkRvY3VtZW50KTsKLQkJCQlpZihfdHJhY2UgJiYgX3RyYWNlVGltZSkKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKFRSQUNFX1BSRUZJWCArICIgcHJvY2Vzc2VkIGRhbWFnZWQgYWZ0ZXIgZW5kaW5nIGRvY3VtZW50IHJld3JpdGUgc2Vzc2lvbiBhdCAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWZIYXNJbmNvbWluZ0NoYW5nZXMgPSBmYWxzZTsKLQkJCX0KLQkJfQotCi0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlY29yZGVkRGFtYWdlIHsKLQkJSVJlZ2lvbiBkYW1hZ2U7IAotCQlJRG9jdW1lbnQgZG9jdW1lbnQ7Ci0JCVJlY29yZGVkRGFtYWdlKElSZWdpb24gZGFtYWdlLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJCXRoaXMuZGFtYWdlID0gZGFtYWdlOwotCQkJdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotCQl9Ci0JfQotCi0JLyoqIFRoZSBtYXAgb2YgcHJlc2VudGF0aW9uIGRhbWFnZXJzLiAqLwotCXByaXZhdGUgTWFwIGZEYW1hZ2VyczsKLQkvKiogVGhlIG1hcCBvZiBwcmVzZW50YXRpb24gcmVwYWlyZXJzLiAqLwotCXByaXZhdGUgTWFwIGZSZXBhaXJlcnM7Ci0JLyoqIFRoZSB0YXJnZXQgdmlld2VyLiAqLwotCXByaXZhdGUgSVRleHRWaWV3ZXIgZlZpZXdlcjsKLQkvKiogVGhlIGludGVybmFsIGxpc3RlbmVyLiAqLwotCXByaXZhdGUgSW50ZXJuYWxMaXN0ZW5lciBmSW50ZXJuYWxMaXN0ZW5lcj0gbmV3IEludGVybmFsTGlzdGVuZXIoKTsKLQkvKiogVGhlIG5hbWUgb2YgdGhlIHBvc2l0aW9uIGNhdGVnb3J5IHRvIHRyYWNrIGRhbWFnZSByZWdpb25zLiAqLwotCXByaXZhdGUgU3RyaW5nIGZQb3NpdGlvbkNhdGVnb3J5OwotCS8qKiBUaGUgcG9zaXRpb24gdXBkYXRlZCBmb3IgdGhlIGRhbWFnZSByZWdpb25zJyBwb3NpdGlvbiBjYXRlZ29yeS4gKi8KLQlwcml2YXRlIElQb3NpdGlvblVwZGF0ZXIgZlBvc2l0aW9uVXBkYXRlcjsKLQkvKiogVGhlIHBvc2l0aW9ucyByZXByZXNlbnRpbmcgdGhlIGRhbWFnZSByZWdpb25zLiAqLwotCXByaXZhdGUgVHlwZWRQb3NpdGlvbiBmUmVtZW1iZXJlZFBvc2l0aW9uOwotCS8qKiBGbGFnIGluZGljYXRpbmcgdGhlIHJlY2VpcHQgb2YgYSBwYXJ0aXRpb25pbmcgY2hhbmdlZCBub3RpZmljYXRpb24uICovCi0JcHJpdmF0ZSBib29sZWFuIGZEb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQ9IGZhbHNlOwotCS8qKiBUaGUgcmFuZ2UgY292ZXJpbmcgdGhlIGNoYW5nZWQgcGFydGl0aW9uaW5nLiAqLwotCXByaXZhdGUgSVJlZ2lvbiBmQ2hhbmdlZERvY3VtZW50UGFydGl0aW9ucz0gbnVsbDsKLQkKLQkvKioKLQkgKiBCZWNhdXNlIHN0cnVjdHVyZWQgZG9jdW1lbnQgZXZlbnRzIGZpcmUgYmVmb3JlIHRleHRDaGFuZ2VkKCksIGl0J3MKLQkgKiBwb3NzaWJsZSB0aGUgd2lkZ2V0IGlzbid0IGZ1bGx5IGF3YXJlIG9mIHRoZSBjaGFuZ2VzIHRvIGl0cyBjb250ZW50cy4KLQkgKiAiUmVjb3JkIiB0aGUgZGFtYWdlIHRvIHByb2Nlc3MgYWZ0ZXIgdGV4dENoYW5nZWQoKSBoYXMgYmVlbiBmaXJlZC4KLQkgKi8KLQlwcml2YXRlIExpc3QgZlJlY29yZGVkRGFtYWdlcyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCi0JLyoqCi0JICogVGhlIHBhcnRpdGlvbmluZyB1c2VkIGJ5IHRoaXMgcHJlc2VudGF0aW9uIHJlY29uY2lsZXIuCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZQYXJ0aXRpb25pbmc7Ci0KLQlwcml2YXRlIElEb2N1bWVudCBmTGFzdERvY3VtZW50OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcHJlc2VudGF0aW9uIHJlY29uY2lsZXIuIFRoZXJlIGFyZSBubyBkYW1hZ2VycyBvciByZXBhaXJlcnMKLQkgKiByZWdpc3RlcmVkIHdpdGggdGhpcyByZWNvbmNpbGVyIGJ5IGRlZmF1bHQuIFRoZSBkZWZhdWx0IHBhcnRpdGlvbmluZwotCSAqIDxjb2RlPklEb2N1bWVudEV4dGVuc2lvbjMuREVGQVVMVF9QQVJUSVRJT05JTkc8L2NvZGU+IGlzIHVzZWQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRQcmVzZW50YXRpb25SZWNvbmNpbGVyKCkgewotCQlzdXBlcigpOwotCQlmUGFydGl0aW9uaW5nPSBJRG9jdW1lbnRFeHRlbnNpb24zLkRFRkFVTFRfUEFSVElUSU9OSU5HOwotCQlmUG9zaXRpb25DYXRlZ29yeT0gVFJBQ0tFRF9QQVJUSVRJT04gKyBoYXNoQ29kZSgpOwotCQlmUG9zaXRpb25VcGRhdGVyPSBuZXcgRGVmYXVsdFBvc2l0aW9uVXBkYXRlcihmUG9zaXRpb25DYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZG9jdW1lbnQgcGFydGl0aW9uaW5nIGZvciB0aGlzIHByZXNlbnRhdGlvbiByZWNvbmNpbGVyLgotCSAqCi0JICogQHBhcmFtIHBhcnRpdGlvbmluZyB0aGUgZG9jdW1lbnQgcGFydGl0aW9uaW5nIGZvciB0aGlzIHByZXNlbnRhdGlvbiByZWNvbmNpbGVyLgotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFBhcnRpdGlvbmluZyhTdHJpbmcgcGFydGl0aW9uaW5nKSB7Ci0JCUFzc2VydC5pc05vdE51bGwocGFydGl0aW9uaW5nKTsKLQkJZlBhcnRpdGlvbmluZz0gcGFydGl0aW9uaW5nOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnByZXNlbnRhdGlvbi5JUHJlc2VudGF0aW9uUmVjb25jaWxlckV4dGVuc2lvbiNnZURvY3VtZW50dFBhcnRpdGlvbmluZygpCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoKSB7Ci0JCXJldHVybiBmUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gcHJlc2VudGF0aW9uIGRhbWFnZXIgZm9yIGEgcGFydGljdWxhciBjb250ZW50IHR5cGUuCi0JICogSWYgdGhlcmUgaXMgYWxyZWFkeSBhIGRhbWFnZXIgcmVnaXN0ZXJlZCBmb3IgdGhpcyB0eXBlLCB0aGUgb2xkIGRhbWFnZXIKLQkgKiBpcyByZW1vdmVkIGZpcnN0LgotCSAqCi0JICogQHBhcmFtIGRhbWFnZXIgdGhlIHByZXNlbnRhdGlvbiBkYW1hZ2VyIHRvIHJlZ2lzdGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byByZW1vdmUgYW4gZXhpc3Rpbmcgb25lCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlIHRoZSBjb250ZW50IHR5cGUgdW5kZXIgd2hpY2ggdG8gcmVnaXN0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYW1hZ2VyKElQcmVzZW50YXRpb25EYW1hZ2VyIGRhbWFnZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCi0JCUFzc2VydC5pc05vdE51bGwoY29udGVudFR5cGUpOwotCi0JCWlmIChmRGFtYWdlcnMgPT0gbnVsbCkKLQkJCWZEYW1hZ2Vycz0gbmV3IEhhc2hNYXAoKTsKLQotCQlpZiAoZGFtYWdlciA9PSBudWxsKQotCQkJZkRhbWFnZXJzLnJlbW92ZShjb250ZW50VHlwZSk7Ci0JCWVsc2UKLQkJCWZEYW1hZ2Vycy5wdXQoY29udGVudFR5cGUsIGRhbWFnZXIpOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gcHJlc2VudGF0aW9uIHJlcGFpcmVyIGZvciBhIHBhcnRpY3VsYXIgY29udGVudCB0eXBlLgotCSAqIElmIHRoZXJlIGlzIGFscmVhZHkgYSByZXBhaXJlciByZWdpc3RlcmVkIGZvciB0aGlzIHR5cGUsIHRoZSBvbGQgcmVwYWlyZXIKLQkgKiBpcyByZW1vdmVkIGZpcnN0LgotCSAqCi0JICogQHBhcmFtIHJlcGFpcmVyIHRoZSBwcmVzZW50YXRpb24gcmVwYWlyZXIgdG8gcmVnaXN0ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHJlbW92ZSBhbiBleGlzdGluZyBvbmUKLQkgKiBAcGFyYW0gY29udGVudFR5cGUgdGhlIGNvbnRlbnQgdHlwZSB1bmRlciB3aGljaCB0byByZWdpc3RlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcGFpcmVyKElQcmVzZW50YXRpb25SZXBhaXJlciByZXBhaXJlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChjb250ZW50VHlwZSk7Ci0KLQkJaWYgKGZSZXBhaXJlcnMgPT0gbnVsbCkKLQkJCWZSZXBhaXJlcnM9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJaWYgKHJlcGFpcmVyID09IG51bGwpCi0JCQlmUmVwYWlyZXJzLnJlbW92ZShjb250ZW50VHlwZSk7Ci0JCWVsc2UKLQkJCWZSZXBhaXJlcnMucHV0KGNvbnRlbnRUeXBlLCByZXBhaXJlcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVzZW50YXRpb25SZWNvbmNpbGVyI2luc3RhbGwoSVRleHRWaWV3ZXIpCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQkJaWYoX3RyYWNlKSB7Ci0JCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCUFzc2VydC5pc05vdE51bGwodmlld2VyKTsKLQotCQlmVmlld2VyPSB2aWV3ZXI7Ci0JCWZWaWV3ZXIuYWRkVGV4dElucHV0TGlzdGVuZXIoZkludGVybmFsTGlzdGVuZXIpOwotCQkKLQkJSURvY3VtZW50IGRvY3VtZW50PSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCWZJbnRlcm5hbExpc3RlbmVyLmlucHV0RG9jdW1lbnRDaGFuZ2VkKG51bGwsIGRvY3VtZW50KTsKLQkJCWlmKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLmFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZJbnRlcm5hbExpc3RlbmVyKTsKLQkJCX0KLQkJCWlmKGRvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uNCkgewotCQkJCSgoSURvY3VtZW50RXh0ZW5zaW9uNCkgZG9jdW1lbnQpLmFkZERvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcihmSW50ZXJuYWxMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJaWYoX3RyYWNlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oVFJBQ0VfUFJFRklYICsgImluc3RhbGxlZCB0byB0ZXh0IHZpZXdlciBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVzZW50YXRpb25SZWNvbmNpbGVyI3VuaW5zdGFsbCgpCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlpZihfdHJhY2UpIHsKLQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJZlZpZXdlci5yZW1vdmVUZXh0SW5wdXRMaXN0ZW5lcihmSW50ZXJuYWxMaXN0ZW5lcik7Ci0KLQkJSURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJaWYoKCBkb2N1bWVudCA9IGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKSkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5yZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmSW50ZXJuYWxMaXN0ZW5lcik7Ci0JCX0KLQkJaWYoZG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkoKElEb2N1bWVudEV4dGVuc2lvbjQpIGRvY3VtZW50KS5yZW1vdmVEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIoZkludGVybmFsTGlzdGVuZXIpOwotCQl9Ci0JCS8vIEVuc3VyZSB3ZSB1bmluc3RhbGwgYWxsIGxpc3RlbmVycwotCQlmSW50ZXJuYWxMaXN0ZW5lci5pbnB1dERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChmVmlld2VyLmdldERvY3VtZW50KCksIG51bGwpOwotCQlpZihfdHJhY2UpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihUUkFDRV9QUkVGSVggKyAidW5pbnN0YWxsZWQgZnJvbSB0ZXh0IHZpZXdlciBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVzZW50YXRpb25SZWNvbmNpbGVyI2dldERhbWFnZXIoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUHJlc2VudGF0aW9uRGFtYWdlciBnZXREYW1hZ2VyKFN0cmluZyBjb250ZW50VHlwZSkgewotCi0JCWlmIChmRGFtYWdlcnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiAoSVByZXNlbnRhdGlvbkRhbWFnZXIpIGZEYW1hZ2Vycy5nZXQoY29udGVudFR5cGUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlc2VudGF0aW9uUmVjb25jaWxlciNnZXRSZXBhaXJlcihTdHJpbmcpCi0JICovCi0JcHVibGljIElQcmVzZW50YXRpb25SZXBhaXJlciBnZXRSZXBhaXJlcihTdHJpbmcgY29udGVudFR5cGUpIHsKLQotCQlpZiAoZlJlcGFpcmVycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIChJUHJlc2VudGF0aW9uUmVwYWlyZXIpIGZSZXBhaXJlcnMuZ2V0KGNvbnRlbnRUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbmZvcm1zIGFsbCByZWdpc3RlcmVkIGRhbWFnZXJzIGFib3V0IHRoZSBkb2N1bWVudCBvbiB3aGljaCB0aGV5IHdpbGwgd29yay4KLQkgKgotCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQgb24gd2hpY2ggdG8gd29yawotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50VG9EYW1hZ2VycyhJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGZEYW1hZ2VycyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlPSBmRGFtYWdlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCUlQcmVzZW50YXRpb25EYW1hZ2VyIGRhbWFnZXI9IChJUHJlc2VudGF0aW9uRGFtYWdlcikgZS5uZXh0KCk7Ci0JCQkJZGFtYWdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbmZvcm1zIGFsbCByZWdpc3RlcmVkIHJlcGFpcmVycyBhYm91dCB0aGUgZG9jdW1lbnQgb24gd2hpY2ggdGhleSB3aWxsIHdvcmsuCi0JICoKLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IG9uIHdoaWNoIHRvIHdvcmsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudFRvUmVwYWlyZXJzKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZlJlcGFpcmVycyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlPSBmUmVwYWlyZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlJUHJlc2VudGF0aW9uUmVwYWlyZXIgcmVwYWlyZXI9IChJUHJlc2VudGF0aW9uUmVwYWlyZXIpIGUubmV4dCgpOwotCQkJCXJlcGFpcmVyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSAicmVwYWlyIGRlc2NyaXB0aW9uIiBmb3IgdGhlIGdpdmVuIGRhbWFnZSBhbmQgcmV0dXJucyB0aGlzCi0JICogZGVzY3JpcHRpb24gYXMgYSB0ZXh0IHByZXNlbnRhdGlvbi4gRm9yIHRoaXMsIGl0IHF1ZXJpZXMgdGhlIHBhcnRpdGlvbmluZwotCSAqIG9mIHRoZSBkYW1hZ2UgcmVnaW9uIGFuZCBhc2tzIHRoZSBhcHByb3ByaWF0ZSBwcmVzZW50YXRpb24gcmVwYWlyZXIgZm9yCi0JICogZWFjaCBwYXJ0aXRpb24gdG8gY29uc3RydWN0IHRoZSAicmVwYWlyIGRlc2NyaXB0aW9uIiBmb3IgdGhpcyBwYXJ0aXRpb24uCi0JICoKLQkgKiBAcGFyYW0gZGFtYWdlIHRoZSBkYW1hZ2UgdG8gYmUgcmVwYWlyZWQKLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IHdob3NlIHByZXNlbnRhdGlvbiBtdXN0IGJlIHJlcGFpcmVkCi0JICogQHJldHVybiB0aGUgcHJlc2VudGF0aW9uIHJlcGFpciBkZXNjcmlwdGlvbiBhcyB0ZXh0IHByZXNlbnRhdGlvbiBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHBhcnRpdGlvbmluZyBjb3VsZCBub3QgYmUgY29tcHV0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dFByZXNlbnRhdGlvbiBjcmVhdGVQcmVzZW50YXRpb24oSVJlZ2lvbiBkYW1hZ2UsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQl0cnkgewotCQkJaW50IHZhbGlkTGVuZ3RoID0gTWF0aC5taW4oZGFtYWdlLmdldExlbmd0aCgpLCBkb2N1bWVudC5nZXRMZW5ndGgoKSAtIGRhbWFnZS5nZXRPZmZzZXQoKSk7Ci0JCQkKLQkJCWlmIChmUmVwYWlyZXJzID09IG51bGwgfHwgZlJlcGFpcmVycy5pc0VtcHR5KCkpIHsKLQkJCQlUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbj0gbmV3IFRleHRQcmVzZW50YXRpb24oZGFtYWdlLCAxKTsKLQkJCQlwcmVzZW50YXRpb24uc2V0RGVmYXVsdFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2UoZGFtYWdlLmdldE9mZnNldCgpLCB2YWxpZExlbmd0aCwgbnVsbCwgbnVsbCkpOwotCQkJCXJldHVybiBwcmVzZW50YXRpb247Ci0JCQl9Ci0KLQkJCVRleHRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uPSBuZXcgVGV4dFByZXNlbnRhdGlvbihkYW1hZ2UsIDEwMDApOwotCi0JCQlJVHlwZWRSZWdpb25bXSBwYXJ0aXRpb25zPSBUZXh0VXRpbGl0aWVzLmNvbXB1dGVQYXJ0aXRpb25pbmcoZG9jdW1lbnQsIGdldERvY3VtZW50UGFydGl0aW9uaW5nKCksIGRhbWFnZS5nZXRPZmZzZXQoKSwgdmFsaWRMZW5ndGgsIGZhbHNlKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBwYXJ0aXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVR5cGVkUmVnaW9uIHI9IHBhcnRpdGlvbnNbaV07Ci0JCQkJSVByZXNlbnRhdGlvblJlcGFpcmVyIHJlcGFpcmVyPSBnZXRSZXBhaXJlcihyLmdldFR5cGUoKSk7Ci0JCQkJaWYgKHJlcGFpcmVyICE9IG51bGwpCi0JCQkJCXJlcGFpcmVyLmNyZWF0ZVByZXNlbnRhdGlvbihwcmVzZW50YXRpb24sIHIpOwotCQkJfQotCi0JCQlyZXR1cm4gcHJlc2VudGF0aW9uOwotCi0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCS8qIGlnbm9yZWQgaW4gcGxhdGZvcm0gUHJlc2VudGF0aW9uUmVjb25jaWxlciwgdG9vICovCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIENoZWNrcyBmb3IgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBhZmZlY3RlZCBwYXJ0aXRpb24gYWZmZWN0ZWQgYnkgYQotCSAqIGRvY3VtZW50IGV2ZW50IGFuZCBjYWxscyB0aGVpciBkYW1hZ2Vycy4gSW52YWxpZGF0ZXMgZXZlcnl0aGluZyBmcm9tIHRoZQotCSAqIHN0YXJ0IG9mIHRoZSBkYW1hZ2UgZm9yIHRoZSBmaXJzdCBwYXJ0aXRpb24gdW50aWwgdGhlIGVuZCBvZiB0aGUgZGFtYWdlCi0JICogZm9yIHRoZSBsYXN0IHBhcnRpdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBlIHRoZSBldmVudCBkZXNjcmliaW5nIHRoZSBkb2N1bWVudCBjaGFuZ2UKLQkgKiBAcGFyYW0gb3B0aW1pemUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcGFydGl0aW9uIGNoYW5nZXMgc2hvdWxkIGJlCi0JICogICAgICAgIGNvbnNpZGVyZWQgZm9yIG9wdGltaXphdGlvbgotCSAqIEByZXR1cm4gdGhlIGRhbWFnZWQgY2F1c2VkIGJ5IHRoZSBjaGFuZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgIGNvbXB1dGluZyB0aGUgcGFydGl0aW9uaW5nIGZhaWxlZAotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlJUmVnaW9uIGdldERhbWFnZShEb2N1bWVudEV2ZW50IGUsIGJvb2xlYW4gb3B0aW1pemUpIHsKLQkJaW50IGxlbmd0aD0gZS5nZXRUZXh0KCkgPT0gbnVsbCA/IDAgOiBlLmdldFRleHQoKS5sZW5ndGgoKTsKLQkJCi0JCWlmIChmRGFtYWdlcnMgPT0gbnVsbCB8fCBmRGFtYWdlcnMuaXNFbXB0eSgpKSB7Ci0JCQlsZW5ndGg9IE1hdGgubWF4KGUuZ2V0TGVuZ3RoKCksIGxlbmd0aCk7Ci0JCQlsZW5ndGg9IE1hdGgubWluKGUuZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKSAtIGUuZ2V0T2Zmc2V0KCksIGxlbmd0aCk7Ci0JCQlyZXR1cm4gbmV3IFJlZ2lvbihlLmdldE9mZnNldCgpLCBsZW5ndGgpOwotCQl9Ci0KLQkJYm9vbGVhbiBpc0RlbGV0aW9uPSBsZW5ndGggPT0gMDsKLQkJSVJlZ2lvbiBkYW1hZ2U9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnQgb2Zmc2V0PSBlLmdldE9mZnNldCgpOwotCQkJaWYgKGlzRGVsZXRpb24pCi0JCQkJb2Zmc2V0PSBNYXRoLm1heCgwLCBvZmZzZXQgLSAxKTsKLQkJCUlUeXBlZFJlZ2lvbiBwYXJ0aXRpb249IGdldFBhcnRpdGlvbihlLmdldERvY3VtZW50KCksIG9mZnNldCk7Ci0JCQlJUHJlc2VudGF0aW9uRGFtYWdlciBkYW1hZ2VyPSBnZXREYW1hZ2VyKHBhcnRpdGlvbi5nZXRUeXBlKCkpOwotCQkJaWYgKGRhbWFnZXIgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJSVJlZ2lvbiByPSBkYW1hZ2VyLmdldERhbWFnZVJlZ2lvbihwYXJ0aXRpb24sIGUsIGZEb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQpOwotCi0JCQlpZiAoIWZEb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQgJiYgb3B0aW1pemUgJiYgIWlzRGVsZXRpb24pIHsKLQkJCQlkYW1hZ2U9IHI7Ci0JCQl9IGVsc2UgewotCi0JCQkJaW50IGRhbWFnZUVuZD0gZ2V0RGFtYWdlRW5kT2Zmc2V0KGUpOwotCi0JCQkJaW50IHBhcml0aXRpb25EYW1hZ2VFbmQ9IC0xOwotCQkJCWlmIChmQ2hhbmdlZERvY3VtZW50UGFydGl0aW9ucyAhPSBudWxsKQotCQkJCQlwYXJpdGl0aW9uRGFtYWdlRW5kPSBmQ2hhbmdlZERvY3VtZW50UGFydGl0aW9ucy5nZXRPZmZzZXQoKSArIGZDaGFuZ2VkRG9jdW1lbnRQYXJ0aXRpb25zLmdldExlbmd0aCgpOwotCi0JCQkJaW50IGVuZD0gTWF0aC5tYXgoZGFtYWdlRW5kLCBwYXJpdGl0aW9uRGFtYWdlRW5kKTsKLQotCQkJCWRhbWFnZT0gZW5kID09IC0xID8gciA6IG5ldyBSZWdpb24oci5nZXRPZmZzZXQoKSwgZW5kIC0gci5nZXRPZmZzZXQoKSk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJLyogaWdub3JlZCBpbiBwbGF0Zm9ybSBQcmVzZW50YXRpb25SZWNvbmNpbGVyLCB0b28gKi8KLQkJfQotCi0JCXJldHVybiBkYW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5kIG9mZnNldCBvZiB0aGUgZGFtYWdlLiBJZiBhIHBhcnRpdGlvbiBoYXMgYmVlbiBzcGxpdCBieQotCSAqIHRoZSBnaXZlbiBkb2N1bWVudCBldmVudCBhbHNvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgb3JpZ2luYWwKLQkgKiBwYXJ0aXRpb24gbXVzdCBiZSBjb25zaWRlcmVkLiBUaGlzIGlzIGFjaGlldmVkIGJ5IHVzaW5nIHRoZSByZW1lbWJlcmVkCi0JICogcGFydGl0aW9uIHJhbmdlLgotCSAqCi0JICogQHBhcmFtIGUgdGhlIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGNoYW5nZQotCSAqIEByZXR1cm4gdGhlIGRhbWFnZSBlbmQgb2Zmc2V0IChleGNsdWRpbmcpCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbiBpZiBtZXRob2QgYWNjZXNzZXMgaW52YWxpZCBvZmZzZXQKLQkgKi8KLQlpbnQgZ2V0RGFtYWdlRW5kT2Zmc2V0KERvY3VtZW50RXZlbnQgZSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQotCQlJRG9jdW1lbnQgZD0gZS5nZXREb2N1bWVudCgpOwotCi0JCWludCBsZW5ndGg9IDA7Ci0JCWlmIChlLmdldFRleHQoKSAhPSBudWxsKSB7Ci0JCQlsZW5ndGg9IGUuZ2V0VGV4dCgpLmxlbmd0aCgpOwotCQkJaWYgKGxlbmd0aCA+IDApCi0JCQkJLS0gbGVuZ3RoOwotCQl9Ci0KLQkJSVR5cGVkUmVnaW9uIHBhcnRpdGlvbj0gZ2V0UGFydGl0aW9uKGQsIGUuZ2V0T2Zmc2V0KCkgKyBsZW5ndGgpOwotCQlpbnQgZW5kT2Zmc2V0PSBwYXJ0aXRpb24uZ2V0T2Zmc2V0KCkgKyBwYXJ0aXRpb24uZ2V0TGVuZ3RoKCk7Ci0JCWlmIChlbmRPZmZzZXQgPT0gZS5nZXRPZmZzZXQoKSkKLQkJCXJldHVybiAtMTsKLQotCQlpbnQgZW5kPSBmUmVtZW1iZXJlZFBvc2l0aW9uID09IG51bGwgPyAtMSA6IGZSZW1lbWJlcmVkUG9zaXRpb24uZ2V0T2Zmc2V0KCkgKyBmUmVtZW1iZXJlZFBvc2l0aW9uLmdldExlbmd0aCgpOwotCQlpZiAoZW5kT2Zmc2V0IDwgZW5kICYmIGVuZCA8IGQuZ2V0TGVuZ3RoKCkpCi0JCQlwYXJ0aXRpb249IGdldFBhcnRpdGlvbihkLCBlbmQpOwotCi0JCS8vaWYgdGhlcmUgaXMgbm90IGRhbWFnZXIgZm9yIHRoZSBwYXJ0aXRpb24gdGhlbiB1c2UgdGhlIGVuZE9mZnNldCBvZiB0aGUgcGFydGl0aW9uCi0JCUlQcmVzZW50YXRpb25EYW1hZ2VyIGRhbWFnZXI9IGdldERhbWFnZXIocGFydGl0aW9uLmdldFR5cGUoKSk7Ci0JCWlmIChkYW1hZ2VyICE9IG51bGwpIHsKLQkJCUlSZWdpb24gcj0gZGFtYWdlci5nZXREYW1hZ2VSZWdpb24ocGFydGl0aW9uLCBlLCBmRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKTsKLQkJCWVuZE9mZnNldCA9IHIuZ2V0T2Zmc2V0KCkgKyByLmdldExlbmd0aCgpOwotCQl9Ci0KLQkJcmV0dXJuIGVuZE9mZnNldDsKLQl9Ci0JCi0Jdm9pZCBwcm9jZXNzUmVjb3JkZWREYW1hZ2VzKCkgewotCQlwcm9jZXNzUmVjb3JkZWREYW1hZ2VzKG51bGwsIG51bGwpOwotCX0KLQkKLQlib29sZWFuIHByb2Nlc3NSZWNvcmRlZERhbWFnZXMoSVJlZ2lvbiBkYW1hZ2UsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQlSZWNvcmRlZERhbWFnZVtdIHJlY29yZGluZ3MgPSBudWxsOwotCQlib29sZWFuIHJlY29yZGluZ092ZXJsYXBzID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZCAoZlJlY29yZGVkRGFtYWdlcykgewotCQkJcmVjb3JkaW5ncyA9IChSZWNvcmRlZERhbWFnZVtdKSBmUmVjb3JkZWREYW1hZ2VzLnRvQXJyYXkobmV3IFJlY29yZGVkRGFtYWdlW2ZSZWNvcmRlZERhbWFnZXMuc2l6ZSgpXSk7Ci0JCQlmUmVjb3JkZWREYW1hZ2VzLmNsZWFyKCk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWNvcmRpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaXNPdmVybGFwcGluZ1JlZ2lvbihkYW1hZ2UsIHJlY29yZGluZ3NbaV0uZGFtYWdlKSAmJiBkb2N1bWVudCA9PSByZWNvcmRpbmdzW2ldLmRvY3VtZW50KQotCQkJCXJlY29yZGluZ092ZXJsYXBzID0gdHJ1ZTsKLQkJCXByb2Nlc3NEYW1hZ2UocmVjb3JkaW5nc1tpXS5kYW1hZ2UsIHJlY29yZGluZ3NbaV0uZG9jdW1lbnQpOwotCQl9Ci0JCXJldHVybiByZWNvcmRpbmdPdmVybGFwczsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzT3ZlcmxhcHBpbmdSZWdpb24oSVJlZ2lvbiBiYXNlLCBJUmVnaW9uIGRhbWFnZSkgewotCQlpZihiYXNlID09IG51bGwgfHwgZGFtYWdlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgYmFzZUVuZCA9IGJhc2UuZ2V0T2Zmc2V0KCkgKyBiYXNlLmdldExlbmd0aCgpOwotCQlpbnQgZGFtYWdlRW5kID0gZGFtYWdlLmdldE9mZnNldCgpICsgZGFtYWdlLmdldExlbmd0aCgpOwotCQkKLQkJcmV0dXJuIGRhbWFnZS5nZXRPZmZzZXQoKSA8PSBiYXNlLmdldE9mZnNldCgpICYmIChkYW1hZ2VFbmQgPj0gYmFzZUVuZCk7Ci0JfQotCi0JLyoqCi0JICogUHJvY2Vzc2VzIHRoZSBnaXZlbiBkYW1hZ2UuCi0JICogQHBhcmFtIGRhbWFnZSB0aGUgZGFtYWdlIHRvIGJlIHJlcGFpcmVkCi0JICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudCB3aG9zZSBwcmVzZW50YXRpb24gbXVzdCBiZSByZXBhaXJlZAotCSAqLwotCXZvaWQgcHJvY2Vzc0RhbWFnZShJUmVnaW9uIGRhbWFnZSwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChkYW1hZ2UgIT0gbnVsbCAmJiBkYW1hZ2UuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlUZXh0UHJlc2VudGF0aW9uIHAgPSBjcmVhdGVQcmVzZW50YXRpb24oZGFtYWdlLCBkb2N1bWVudCk7Ci0JCQlpZiAocCAhPSBudWxsKSB7Ci0JCQkJLyoqCi0JCQkJICogMjI5NzQ5IC0gUmVhZC1Pbmx5IGhpZ2hsaWdodGluZyBzdXBwb3J0IG1pc3NpbmcKLQkJCQkgKiAyNzI5ODEgLSBSZWFkLW9ubHkgaGlnaGxpZ2h0aW5nIG1vdmVkIHRvIHNlbWFudGljIGhpZ2hsaWdodGluZwotCQkJCSAqLwotCQkJCWFwcGx5VGV4dFJlZ2lvbkNvbGxlY3Rpb24ocCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzZXMgdGhlIGdpdmVuIGRhbWFnZS4KLQkgKiBAcGFyYW0gZGFtYWdlIHRoZSBkYW1hZ2UgdG8gYmUgcmVwYWlyZWQKLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IHdob3NlIHByZXNlbnRhdGlvbiBtdXN0IGJlIHJlcGFpcmVkCi0JICovCi0Jdm9pZCByZWNvcmREYW1hZ2UoSVJlZ2lvbiBkYW1hZ2UsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZGFtYWdlICE9IG51bGwgJiYgZGFtYWdlLmdldExlbmd0aCgpID4gMCkgewotCQkJc3luY2hyb25pemVkIChmUmVjb3JkZWREYW1hZ2VzKSB7Ci0JCQkJZlJlY29yZGVkRGFtYWdlcy5hZGQobmV3IFJlY29yZGVkRGFtYWdlKGRhbWFnZSwgZG9jdW1lbnQpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGxpZXMgdGhlIGdpdmVuIHRleHQgcHJlc2VudGF0aW9uIHRvIHRoZSB0ZXh0IHZpZXdlciB0aGUgcHJlc2VudGF0aW9uCi0JICogcmVjb25jaWxlciBpcyBpbnN0YWxsZWQgb24uCi0JICoKLQkgKiBAcGFyYW0gcHJlc2VudGF0aW9uIHRoZSB0ZXh0IHByZXNlbnRhdGlvbiB0byBiZSBhcHBsaWVkIHRvIHRoZSB0ZXh0IHZpZXdlcgotCSAqLwotCXZvaWQgYXBwbHlUZXh0UmVnaW9uQ29sbGVjdGlvbihUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbikgewotCQlmVmlld2VyLmNoYW5nZVRleHRQcmVzZW50YXRpb24ocHJlc2VudGF0aW9uLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGl0aW9uIGZvciB0aGUgZ2l2ZW4gb2Zmc2V0IGluIHRoZSBnaXZlbiBkb2N1bWVudC4KLQkgKgotCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQKLQkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQKLQkgKiBAcmV0dXJuIHRoZSBwYXJ0aXRpb24KLQkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIGlmIG9mZnNldCBpcyBpbnZhbGlkIGluIHRoZSBnaXZlbiBkb2N1bWVudAotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFRleHRVdGlsaXRpZXMuZ2V0UGFydGl0aW9uKGRvY3VtZW50LCBnZXREb2N1bWVudFBhcnRpdGlvbmluZygpLCBvZmZzZXQsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgInJlcGFpciBkZXNjcmlwdGlvbiIgZm9yIHRoZSBnaXZlbiBkYW1hZ2UgYW5kIHJldHVybnMgdGhpcwotCSAqIGRlc2NyaXB0aW9uIGFzIGEgdGV4dCBwcmVzZW50YXRpb24sIGVzc2VudGlhbGx5IG1ha2luZwotCSAqIHtAbGluayAjY3JlYXRlUHJlc2VudGF0aW9uKElSZWdpb24sIElEb2N1bWVudCl9IHB1YmxpY2x5IGNhbGxhYmxlLgotCSAqIDxwPgotCSAqIE5PVEU6IFNob3VsZCBub3QgYmUgdXNlZCBpZiB0aGlzIHJlY29uY2lsZXIgaXMgaW5zdGFsbGVkIG9uIGEgdmlld2VyLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNvbnNpZGVyZWQgRVhQRVJJTUVOVEFMIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSBpbgotCSAqIHN1YnNlcXVlbnQgdmVyc2lvbnMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBkYW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSBkYW1hZ2UgdG8gYmUgcmVwYWlyZWQKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB3aG9zZSBwcmVzZW50YXRpb24gbXVzdCBiZSByZXBhaXJlZAotCSAqIEByZXR1cm4gdGhlIHByZXNlbnRhdGlvbiByZXBhaXIgZGVzY3JpcHRpb24gYXMgdGV4dCBwcmVzZW50YXRpb24KLQkgKi8KLQlwdWJsaWMgVGV4dFByZXNlbnRhdGlvbiBjcmVhdGVSZXBhaXJEZXNjcmlwdGlvbihJUmVnaW9uIGRhbWFnZSwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChkb2N1bWVudCAhPSBmTGFzdERvY3VtZW50KSB7Ci0JCQlzZXREb2N1bWVudFRvRGFtYWdlcnMoZG9jdW1lbnQpOwotCQkJc2V0RG9jdW1lbnRUb1JlcGFpcmVycyhkb2N1bWVudCk7Ci0JCQlmTGFzdERvY3VtZW50PSBkb2N1bWVudDsKLQkJfQotCQlyZXR1cm4gY3JlYXRlUHJlc2VudGF0aW9uKGRhbWFnZSwgZG9jdW1lbnQpOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9xdWlja291dGxpbmUvUXVpY2tPdXRsaW5lSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3F1aWNrb3V0bGluZS9RdWlja091dGxpbmVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYTdlMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3F1aWNrb3V0bGluZS9RdWlja091dGxpbmVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5xdWlja291dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJlc2VudGVyOwotCi1wdWJsaWMgY2xhc3MgUXVpY2tPdXRsaW5lSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQlJSW5mb3JtYXRpb25QcmVzZW50ZXIgZlByZXNlbnRlcjsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXIjZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWlmIChmUHJlc2VudGVyICE9IG51bGwpCi0JCQlmUHJlc2VudGVyLnNob3dJbmZvcm1hdGlvbigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25maWd1cmUoSUluZm9ybWF0aW9uUHJlc2VudGVyIHByZXNlbnRlcikgewotCQlmUHJlc2VudGVyID0gcHJlc2VudGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGZQcmVzZW50ZXIgIT0gbnVsbCkgewotCQkJZlByZXNlbnRlci51bmluc3RhbGwoKTsKLQkJCWZQcmVzZW50ZXIgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3F1aWNrb3V0bGluZS9RdWlja091dGxpbmVQb3B1cERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3F1aWNrb3V0bGluZS9RdWlja091dGxpbmVQb3B1cERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTJmNjJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9xdWlja291dGxpbmUvUXVpY2tPdXRsaW5lUG9wdXBEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5xdWlja291dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUG9wdXBEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xFeHRlbnNpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VNb3ZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5JQ29udGVudFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5xdWlja291dGxpbmUuU3RyaW5nUGF0dGVybkZpbHRlci5TdHJpbmdNYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkucXVpY2tvdXRsaW5lLkFic3RyYWN0UXVpY2tPdXRsaW5lQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBQb3B1cCBkaWFsb2cgdGhhdCBjb250YWlucyB0aGUgZmlsdGVyaW5nIGlucHV0IGFuZCB0aGUgb3V0bGluZQotICogdmlldyBvZiB0aGUgZWRpdG9yJ3MgaW5wdXQuCi0gKiAKLSAqIDxwPgotICogQmFzZWQgb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkFic3RyYWN0SW5mb3JtYXRpb25Db250cm9sfQotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBRdWlja091dGxpbmVQb3B1cERpYWxvZyBleHRlbmRzIFBvcHVwRGlhbG9nIGltcGxlbWVudHMgSUluZm9ybWF0aW9uQ29udHJvbCwgSUluZm9ybWF0aW9uQ29udHJvbEV4dGVuc2lvbiwgSUluZm9ybWF0aW9uQ29udHJvbEV4dGVuc2lvbjIsIERpc3Bvc2VMaXN0ZW5lciB7Ci0KLQkvKiogU2VjdGlvbiB1c2VkIGZvciBzdG9yaW5nIHRoZSBkaWFsb2cncyBzaXplIGFuZCBwb3NpdGlvbiBzZXR0aW5ncyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfU0VDVElPTiA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnF1aWNrX291dGxpbmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKiogVGV4dCBmaWVsZCBmb3IgZW50ZXJpbmcgZmlsdGVyIHBhdHRlcm5zICovCi0JcHJpdmF0ZSBUZXh0IGZGaWx0ZXJUZXh0OwotCi0JLyoqIFRyZWUgZm9yIHByZXNlbnRpbmcgdGhlIGluZm9ybWF0aW9uIG91dGxpbmUgKi8KLQlwcml2YXRlIFRyZWVWaWV3ZXIgZlRyZWVWaWV3ZXI7Ci0KLQkvKiogVGhlIG1vZGVsIHRvIGJlIG91dGxpbmVkICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGZNb2RlbDsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXI7Ci0JcHJpdmF0ZSBJVHJlZUNvbnRlbnRQcm92aWRlciBmQ29udGVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJQ29udGVudFNlbGVjdGlvblByb3ZpZGVyIGZTZWxlY3Rpb25Qcm92aWRlcjsKLQotCXByaXZhdGUgU3RyaW5nUGF0dGVybkZpbHRlciBmRmlsdGVyOwotCQotCXB1YmxpYyBRdWlja091dGxpbmVQb3B1cERpYWxvZyhTaGVsbCBwYXJlbnQsIGludCBzaGVsbFN0eWxlLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBBYnN0cmFjdFF1aWNrT3V0bGluZUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIHNoZWxsU3R5bGUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIG51bGwsIG51bGwpOwotCQlmQ29udGVudFByb3ZpZGVyID0gY29uZmlndXJhdGlvbi5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJZkxhYmVsUHJvdmlkZXIgPSBjb25maWd1cmF0aW9uLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJZlNlbGVjdGlvblByb3ZpZGVyID0gY29uZmlndXJhdGlvbi5nZXRDb250ZW50U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJZk1vZGVsID0gbW9kZWw7Ci0JCWNyZWF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVUcmVlVmlld2VyKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJYWRkTGlzdGVuZXJzKGZUcmVlVmlld2VyLmdldFRyZWUoKSk7Ci0KLQkJaW5zdGFsbEZpbHRlcigpOwotCQlyZXR1cm4gZlRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZVRpdGxlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUZpbHRlclRleHQocGFyZW50KTsKLQotCQlyZXR1cm4gZkZpbHRlclRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJVHJlZSB0cmVlID0gbmV3IFRyZWUocGFyZW50LCBzdHlsZSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhlaWdodEhpbnQgPSB0cmVlLmdldEl0ZW1IZWlnaHQoKSAqIDEyOwotCQl0cmVlLnNldExheW91dERhdGEoZ2QpOwotCi0JCWZUcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7Ci0JCWZUcmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihmQ29udGVudFByb3ZpZGVyKTsKLQkJZlRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihmTGFiZWxQcm92aWRlcik7Ci0JCWZUcmVlVmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbCgyKTsKLQkJZlRyZWVWaWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJZlRyZWVWaWV3ZXIuc2V0SW5wdXQoZk1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWx0ZXJUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZkZpbHRlclRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5OT05FKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChmRmlsdGVyVGV4dCk7Ci0KLQkJR3JpZERhdGEgZGF0YT0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudD0gR3JpZERhdGEuQ0VOVEVSOwotCQlmRmlsdGVyVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmRmlsdGVyVGV4dC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5rZXlDb2RlID09IDB4MEQpIC8vIHJldHVybgotCQkJCQlnb3RvU2VsZWN0ZWRFbGVtZW50KCk7Ci0JCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuQVJST1dfRE9XTikKLQkJCQkJZlRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldEZvY3VzKCk7Ci0JCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuQVJST1dfVVApCi0JCQkJCWZUcmVlVmlld2VyLmdldFRyZWUoKS5zZXRGb2N1cygpOwotCQkJCWlmIChlLmNoYXJhY3RlciA9PSAweDFCKSAvLyBFU0MKLQkJCQkJZGlzcG9zZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5zdGFsbEZpbHRlcigpIHsKLQkJZkZpbHRlciA9IG5ldyBTdHJpbmdQYXR0ZXJuRmlsdGVyKCk7Ci0JCWZUcmVlVmlld2VyLmFkZEZpbHRlcihmRmlsdGVyKTsKLQkJZkZpbHRlclRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSAoKFRleHQpIGUud2lkZ2V0KS5nZXRUZXh0KCk7Ci0JCQkJaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0JCQkJaWYgKGxlbmd0aCA+IDAgJiYgdGV4dC5jaGFyQXQobGVuZ3RoIC0xICkgIT0gJyonKSB7Ci0JCQkJCXRleHQgPSB0ZXh0ICsgJyonOwotCQkJCX0KLQkJCQlzZXRNYXRjaGVyU3RyaW5nKHRleHQsIHRydWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXRjaGVyU3RyaW5nKFN0cmluZyBwYXR0ZXJuLCBib29sZWFuIHVwZGF0ZSkgewotCQlmRmlsdGVyLnVwZGF0ZVBhdHRlcm4ocGF0dGVybik7Ci0JCWlmICh1cGRhdGUpCi0JCQlzdHJpbmdNYXRjaGVyVXBkYXRlZCgpOwotCX0KLQkvKioKLQkgKiBUaGUgc3RyaW5nIG1hdGNoZXIgaGFzIGJlZW4gbW9kaWZpZWQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0JICogcmVmcmVzaGVzIHRoZSB2aWV3IGFuZCBzZWxlY3RzIHRoZSBmaXJzdCBtYXRjaGVkIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdHJpbmdNYXRjaGVyVXBkYXRlZCgpIHsKLQkJLy8gcmVmcmVzaCB2aWV3ZXIgdG8gcmUtZmlsdGVyCi0JCWZUcmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcoZmFsc2UpOwotCQlmVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCWZUcmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCQlzZWxlY3RGaXJzdE1hdGNoKCk7Ci0JCWZUcmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdEZpcnN0TWF0Y2goKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBmaW5kSXRlbShmVHJlZVZpZXdlci5nZXRUcmVlKCkuZ2V0SXRlbXMoKSwgZkZpbHRlci5nZXRTdHJpbmdNYXRjaGVyKCkpOwotCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQlmVHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0U2VsZWN0aW9uKGl0ZW0pOwotCQl9Ci0JCWVsc2UgewotCQkJZlRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBUcmVlSXRlbSBmaW5kSXRlbShUcmVlSXRlbVtdIGl0ZW1zLCBTdHJpbmdNYXRjaGVyIG1hdGNoZXIpIHsKLQkJaWYgKG1hdGNoZXIgPT0gbnVsbCkKLQkJCXJldHVybiBpdGVtcy5sZW5ndGggPiAwID8gaXRlbXNbMF0gOiBudWxsOwotCQlpbnQgbGVuZ3RoID0gaXRlbXMubGVuZ3RoOwotCQlUcmVlSXRlbSByZXN1bHQgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobWF0Y2hlci5tYXRjaChpdGVtc1tpXS5nZXRUZXh0KCkpKQotCQkJCXJldHVybiBpdGVtc1tpXTsKLQkJCWlmIChpdGVtc1tpXS5nZXRJdGVtQ291bnQoKSA+IDApIHsKLQkJCQlyZXN1bHQgPSBmaW5kSXRlbShpdGVtc1tpXS5nZXRJdGVtcygpLCBtYXRjaGVyKTsKLQkJCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQkJCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3M9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpLmdldFNlY3Rpb24oRElBTE9HX1NFQ1RJT04pOwotCQlpZiAoc2V0dGluZ3MgPT0gbnVsbCkKLQkJCXNldHRpbmdzID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCkuYWRkTmV3U2VjdGlvbihESUFMT0dfU0VDVElPTik7Ci0KLQkJcmV0dXJuIHNldHRpbmdzOwotCX0KLQotCXByaXZhdGUgdm9pZCBnb3RvU2VsZWN0ZWRFbGVtZW50KCkgewotCQlPYmplY3QgZWxlbWVudCA9IGdldFNlbGVjdGVkRWxlbWVudCgpOwotCQlkaXNwb3NlKCk7Ci0JCUlUZXh0RWRpdG9yIGVkaXRvciA9IGdldEFjdGl2ZVRleHRFZGl0b3IoKTsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKCgoSW5kZXhlZFJlZ2lvbikgZWxlbWVudCkuZ2V0U3RhcnRPZmZzZXQoKSwgKChJbmRleGVkUmVnaW9uKSBlbGVtZW50KS5nZXRFbmRPZmZzZXQoKSAtICgoSW5kZXhlZFJlZ2lvbikgZWxlbWVudCkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElUZXh0RWRpdG9yIGdldEFjdGl2ZVRleHRFZGl0b3IoKSB7Ci0JCUlXb3JrYmVuY2ggd2IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQlJVGV4dEVkaXRvciBlZGl0b3IgPSBudWxsOwotCQlpZiAod2IgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3dyA9IHdiLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHd3LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJRWRpdG9yUGFydCBwYXJ0ID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQllZGl0b3IgPSAoSVRleHRFZGl0b3IpIHBhcnQ7Ci0JCQkJZWxzZQotCQkJCQllZGl0b3IgPSBwYXJ0ICE9IG51bGwgPyAoSVRleHRFZGl0b3IpIHBhcnQuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcykgOiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0b3I7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0U2VsZWN0ZWRFbGVtZW50KCkgewotCQlpZiAoZlRyZWVWaWV3ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmVHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycyhmaW5hbCBUcmVlIHRyZWUpIHsKLQkJdHJlZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpICB7Ci0JCQkJaWYgKGUuY2hhcmFjdGVyID09IDB4MUIpIC8vIEVTQwotCQkJCQlkaXNwb3NlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9KTsKLQotCQl0cmVlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWdvdG9TZWxlY3RlZEVsZW1lbnQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLyogTW91c2UgaG92ZXIgKi8KLQkJdHJlZS5hZGRNb3VzZU1vdmVMaXN0ZW5lcihuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKQkgewotCQkJVHJlZUl0ZW0gZkxhc3RJdGVtPSBudWxsOwotCQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgewotCQkJCWlmICh0cmVlLmVxdWFscyhlLmdldFNvdXJjZSgpKSkgewotCQkJCQlPYmplY3Qgbz0gdHJlZS5nZXRJdGVtKG5ldyBQb2ludChlLngsIGUueSkpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIFRyZWVJdGVtKSB7Ci0JCQkJCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IHRyZWUuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCQkJaWYgKCFvLmVxdWFscyhmTGFzdEl0ZW0pKSB7Ci0JCQkJCQkJZkxhc3RJdGVtPSAoVHJlZUl0ZW0pbzsKLQkJCQkJCQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7IGZMYXN0SXRlbSB9KTsKLQkJCQkJCX0gZWxzZSBpZiAoZS55IC0gY2xpZW50QXJlYS55IDwgdHJlZS5nZXRJdGVtSGVpZ2h0KCkgLyA0KSB7Ci0JCQkJCQkJLy8gU2Nyb2xsIHVwCi0JCQkJCQkJUG9pbnQgcD0gdHJlZS50b0Rpc3BsYXkoZS54LCBlLnkpOwotCQkJCQkJCUl0ZW0gaXRlbT0gZlRyZWVWaWV3ZXIuc2Nyb2xsVXAocC54LCBwLnkpOwotCQkJCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgVHJlZUl0ZW0pIHsKLQkJCQkJCQkJZkxhc3RJdGVtPSAoVHJlZUl0ZW0paXRlbTsKLQkJCQkJCQkJdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10geyBmTGFzdEl0ZW0gfSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChjbGllbnRBcmVhLnkgKyBjbGllbnRBcmVhLmhlaWdodCAtIGUueSA8IHRyZWUuZ2V0SXRlbUhlaWdodCgpIC8gNCkgewotCQkJCQkJCS8vIFNjcm9sbCBkb3duCi0JCQkJCQkJUG9pbnQgcD0gdHJlZS50b0Rpc3BsYXkoZS54LCBlLnkpOwotCQkJCQkJCUl0ZW0gaXRlbT0gZlRyZWVWaWV3ZXIuc2Nyb2xsRG93bihwLngsIHAueSk7Ci0JCQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBUcmVlSXRlbSkgewotCQkJCQkJCQlmTGFzdEl0ZW09IChUcmVlSXRlbSlpdGVtOwotCQkJCQkJCQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7IGZMYXN0SXRlbSB9KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXRyZWUuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQotCQkJCWlmICh0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkgPCAxKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlpZiAoZS5idXR0b24gIT0gMSkKLQkJCQkJcmV0dXJuOwotCi0JCQkJaWYgKHRyZWUuZXF1YWxzKGUuZ2V0U291cmNlKCkpKSB7Ci0JCQkJCU9iamVjdCBvPSB0cmVlLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSk7Ci0JCQkJCVRyZWVJdGVtIHNlbGVjdGlvbj0gdHJlZS5nZXRTZWxlY3Rpb24oKVswXTsKLQkJCQkJaWYgKHNlbGVjdGlvbi5lcXVhbHMobykpCi0JCQkJCQlnb3RvU2VsZWN0ZWRFbGVtZW50KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlnZXRTaGVsbCgpLmFkZERpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRm9jdXNMaXN0ZW5lcihGb2N1c0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWdldFNoZWxsKCkuYWRkRm9jdXNMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIFBvaW50IGNvbXB1dGVTaXplSGludCgpIHsKLQkJcmV0dXJuIGdldFNoZWxsKCkuZ2V0U2l6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNsb3NlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb2N1c0NvbnRyb2woKSB7Ci0JCXJldHVybiBnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpID09IGdldFNoZWxsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlnZXRTaGVsbCgpLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRm9jdXNMaXN0ZW5lcihGb2N1c0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWdldFNoZWxsKCkucmVtb3ZlRm9jdXNMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGJhY2tncm91bmQpIHsKLQkJYXBwbHlCYWNrZ3JvdW5kQ29sb3IoYmFja2dyb3VuZCwgZ2V0Q29udGVudHMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWdldFNoZWxsKCkuZm9yY2VGb2N1cygpOwotCQlmRmlsdGVyVGV4dC5zZXRGb2N1cygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBmb3JlZ3JvdW5kKSB7Ci0JCWFwcGx5Rm9yZWdyb3VuZENvbG9yKGZvcmVncm91bmQsIGdldENvbnRlbnRzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluZm9ybWF0aW9uKFN0cmluZyBpbmZvcm1hdGlvbikgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oUG9pbnQgbG9jYXRpb24pIHsKLQkJLyoKLQkJICogSWYgdGhlIGxvY2F0aW9uIGlzIHBlcnNpc3RlZCwgaXQgZ2V0cyBtYW5hZ2VkIGJ5IFBvcHVwRGlhbG9nIC0gZmluZS4gT3RoZXJ3aXNlLCB0aGUgbG9jYXRpb24gaXMKLQkJICogY29tcHV0ZWQgaW4gV2luZG93I2dldEluaXRpYWxMb2NhdGlvbiwgd2hpY2ggd2lsbCBjZW50ZXIgaXQgaW4gdGhlIHBhcmVudCBzaGVsbCAvIG1haW4KLQkJICogbW9uaXRvciwgd2hpY2ggaXMgd3JvbmcgZm9yIHR3byByZWFzb25zOgotCQkgKiAtIHdlIHdhbnQgdG8gY2VudGVyIG92ZXIgdGhlIGVkaXRvciAvIHN1YmplY3QgY29udHJvbCwgbm90IHRoZSBwYXJlbnQgc2hlbGwKLQkJICogLSB0aGUgY2VudGVyIGlzIGNvbXB1dGVkIHZpYSB0aGUgaW5pdGFsU2l6ZSwgd2hpY2ggbWF5IGJlIGFsc28gd3Jvbmcgc2luY2UgdGhlIHNpemUgbWF5Ci0JCSAqICAgaGF2ZSBiZWVuIHVwZGF0ZWQgc2luY2UgdmlhIG1pbi9tYXggc2l6aW5nIG9mIEFic3RyYWN0SW5mb3JtYXRpb25Db250cm9sTWFuYWdlci4KLQkJICogSW4gdGhhdCBjYXNlLCBvdmVycmlkZSB0aGUgbG9jYXRpb24gd2l0aCB0aGUgb25lIGNvbXB1dGVkIGJ5IHRoZSBtYW5hZ2VyLiBOb3RlIHRoYXQKLQkJICogdGhlIGNhbGwgdG8gY29uc3RyYWluU2hlbGxTaXplIGluIFBvcHVwRGlhbG9nLm9wZW4gd2lsbCBzdGlsbCBlbnN1cmUgdGhhdCB0aGUgc2hlbGwgaXMKLQkJICogZW50aXJlbHkgdmlzaWJsZS4KLQkJICovCi0JCWlmICghZ2V0UGVyc2lzdExvY2F0aW9uKCkgfHwgZ2V0RGlhbG9nU2V0dGluZ3MoKSA9PSBudWxsKQotCQkJZ2V0U2hlbGwoKS5zZXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJZ2V0U2hlbGwoKS5zZXRTaXplKHdpZHRoLCBoZWlnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNpemVDb25zdHJhaW50cyhpbnQgbWF4V2lkdGgsIGludCBtYXhIZWlnaHQpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlpZiAodmlzaWJsZSkgewotCQkJb3BlbigpOwotCQl9IGVsc2UgewotCQkJc2F2ZURpYWxvZ0JvdW5kcyhnZXRTaGVsbCgpKTsKLQkJCWdldFNoZWxsKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb250ZW50cygpIHsKLQkJcmV0dXJuIGZUcmVlVmlld2VyICE9IG51bGwgJiYgZlRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkgewotCQlpZiAoIShpbnB1dCBpbnN0YW5jZW9mIElTZWxlY3Rpb24pKSB7Ci0JCQlmVHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oaW5wdXQpKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChmU2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZlNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbihmVHJlZVZpZXdlciwgKElTZWxlY3Rpb24pIGlucHV0KTsKLQkJCQlmVHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZUcmVlVmlld2VyLnNldFNlbGVjdGlvbigoSVNlbGVjdGlvbikgaW5wdXQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJZlRyZWVWaWV3ZXIgPSBudWxsOwotCQlmRmlsdGVyVGV4dCA9IG51bGw7Ci0JCWZNb2RlbCA9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlsbERpYWxvZ01lbnUoSU1lbnVNYW5hZ2VyIGRpYWxvZ01lbnUpIHsKLQkJLy8gQWRkIGN1c3RvbSBhY3Rpb25zCi0JCXN1cGVyLmZpbGxEaWFsb2dNZW51KGRpYWxvZ01lbnUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3F1aWNrb3V0bGluZS9TdHJpbmdQYXR0ZXJuRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcXVpY2tvdXRsaW5lL1N0cmluZ1BhdHRlcm5GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjMTlmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcXVpY2tvdXRsaW5lL1N0cmluZ1BhdHRlcm5GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5xdWlja291dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuVGV4dFByb2Nlc3NvcjsKLQotLyoqCi0gKiBEZWZhdWx0IFZpZXdlciBGaWx0ZXIgdG8gYmUgdXNlZCBieSB0aGUge0BsaW5rIFF1aWNrT3V0bGluZVBvcHVwRGlhbG9nfQotICogPHA+Ci0gKiBCYXNlZCBvbiB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuQWJzdHJhY3RJbmZvcm1hdGlvbkNvbnRyb2wuTmFtZVBhdHRlcm5GaWx0ZXJ9Ci0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmdQYXR0ZXJuRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQotCXByaXZhdGUgU3RyaW5nTWF0Y2hlciBmU3RyaW5nTWF0Y2hlcjsKLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlciNzZWxlY3Qob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQlTdHJpbmdNYXRjaGVyIG1hdGNoZXIgPSBmU3RyaW5nTWF0Y2hlcjsKLQkJaWYgKG1hdGNoZXIgPT0gbnVsbCB8fCAhKHZpZXdlciBpbnN0YW5jZW9mIFRyZWVWaWV3ZXIpKQotCQkJcmV0dXJuIHRydWU7Ci0JCVRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IChUcmVlVmlld2VyKSB2aWV3ZXI7Ci0KLQkJU3RyaW5nIG1hdGNoTmFtZSA9ICgoSUxhYmVsUHJvdmlkZXIpIHRyZWVWaWV3ZXIuZ2V0TGFiZWxQcm92aWRlcigpKS5nZXRUZXh0KGVsZW1lbnQpOwotCQltYXRjaE5hbWUgPSBUZXh0UHJvY2Vzc29yLmRlcHJvY2VzcyhtYXRjaE5hbWUpOwotCQlpZiAobWF0Y2hOYW1lICE9IG51bGwgJiYgbWF0Y2hlci5tYXRjaChtYXRjaE5hbWUpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGhhc1VuZmlsdGVyZWRDaGlsZCh0cmVlVmlld2VyLCBlbGVtZW50KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzVW5maWx0ZXJlZENoaWxkKFRyZWVWaWV3ZXIgdmlld2VyLCBPYmplY3QgZWxlbWVudCkgewotCQlPYmplY3RbXSBjaGlsZHJlbj0gICgoSVRyZWVDb250ZW50UHJvdmlkZXIpIHZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKSkuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLQkJCWlmIChzZWxlY3Qodmlld2VyLCBlbGVtZW50LCBjaGlsZHJlbltpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7Ci0JCWlmIChwYXR0ZXJuLmxlbmd0aCgpID09IDApIHsKLQkJCWZTdHJpbmdNYXRjaGVyID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCWZTdHJpbmdNYXRjaGVyID0gbmV3IFN0cmluZ01hdGNoZXIocGF0dGVybiwgcGF0dGVybi50b0xvd2VyQ2FzZSgpLmVxdWFscyhwYXR0ZXJuKSwgZmFsc2UpOwotCQl9Ci0JCQotCX0KLQotCXB1YmxpYyBTdHJpbmdNYXRjaGVyIGdldFN0cmluZ01hdGNoZXIoKSB7Ci0JCXJldHVybiBmU3RyaW5nTWF0Y2hlcjsKLQl9Ci0KLQkvKioKLQkgKiBTdHJpbmcgbWF0Y2hlciBiYXNlZCBvbiB7QGxpbmsgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubWlzYy5TdHJpbmdNYXRjaGVyfQotCSAqLwotCXN0YXRpYyBjbGFzcyBTdHJpbmdNYXRjaGVyIHsKLQkJcHJvdGVjdGVkIFN0cmluZyBmUGF0dGVybjsKLQotCSAgICBwcm90ZWN0ZWQgaW50IGZMZW5ndGg7IC8vIHBhdHRlcm4gbGVuZ3RoCi0KLQkgICAgcHJvdGVjdGVkIGJvb2xlYW4gZklnbm9yZVdpbGRDYXJkczsKLQotCSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmSWdub3JlQ2FzZTsKLQotCSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmSGFzTGVhZGluZ1N0YXI7Ci0KLQkgICAgcHJvdGVjdGVkIGJvb2xlYW4gZkhhc1RyYWlsaW5nU3RhcjsKLQotCSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZTZWdtZW50c1tdOyAvL3RoZSBnaXZlbiBwYXR0ZXJuIGlzIHNwbGl0IGludG8gKiBzZXBhcmF0ZWQgc2VnbWVudHMKLQotCSAgICAvKiBib3VuZGFyeSB2YWx1ZSBiZXlvbmQgd2hpY2ggd2UgZG9uJ3QgbmVlZCB0byBzZWFyY2ggaW4gdGhlIHRleHQgKi8KLQkgICAgcHJvdGVjdGVkIGludCBmQm91bmQgPSAwOwotCi0JICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBmU2luZ2xlV2lsZENhcmQgPSAnXHUwMDAwJzsKLQotCSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBvc2l0aW9uIHsKLQkgICAgICAgIGludCBzdGFydDsgLy9pbmNsdXNpdmUKLQotCSAgICAgICAgaW50IGVuZDsgLy9leGNsdXNpdmUKLQotCSAgICAgICAgcHVibGljIFBvc2l0aW9uKGludCBzdGFydCwgaW50IGVuZCkgewotCSAgICAgICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKLQkgICAgICAgICAgICB0aGlzLmVuZCA9IGVuZDsKLQkgICAgICAgIH0KLQotCSAgICAgICAgcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkgICAgICAgICAgICByZXR1cm4gc3RhcnQ7Ci0JICAgICAgICB9Ci0KLQkgICAgICAgIHB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCSAgICAgICAgICAgIHJldHVybiBlbmQ7Ci0JICAgICAgICB9Ci0JICAgIH0KLQotCSAgICAvKioKLQkgICAgICogU3RyaW5nTWF0Y2hlciBjb25zdHJ1Y3RvciB0YWtlcyBpbiBhIFN0cmluZyBvYmplY3QgdGhhdCBpcyBhIHNpbXBsZSAKLQkgICAgICogcGF0dGVybiB3aGljaCBtYXkgY29udGFpbiAnKicgZm9yIDAgYW5kIG1hbnkgY2hhcmFjdGVycyBhbmQKLQkgICAgICogJz8nIGZvciBleGFjdGx5IG9uZSBjaGFyYWN0ZXIuICAKLQkgICAgICoKLQkgICAgICogTGl0ZXJhbCAnKicgYW5kICc/JyBjaGFyYWN0ZXJzIG11c3QgYmUgZXNjYXBlZCBpbiB0aGUgcGF0dGVybiAKLQkgICAgICogZS5nLiwgIlwqIiBtZWFucyBsaXRlcmFsICIqIiwgZXRjLgotCSAgICAgKgotCSAgICAgKiBFc2NhcGluZyBhbnkgb3RoZXIgY2hhcmFjdGVyIChpbmNsdWRpbmcgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgaXRzZWxmKSwgCi0JICAgICAqIGp1c3QgcmVzdWx0cyBpbiB0aGF0IGNoYXJhY3RlciBpbiB0aGUgcGF0dGVybi4KLQkgICAgICogZS5nLiwgIlxhIiBtZWFucyAiYSIgYW5kICJcXCIgbWVhbnMgIlwiCi0JICAgICAqCi0JICAgICAqIElmIGludm9raW5nIHRoZSBTdHJpbmdNYXRjaGVyIHdpdGggc3RyaW5nIGxpdGVyYWxzIGluIEphdmEsIGRvbid0IGZvcmdldAotCSAgICAgKiBlc2NhcGUgY2hhcmFjdGVycyBhcmUgcmVwcmVzZW50ZWQgYnkgIlxcIi4KLQkgICAgICoKLQkgICAgICogQHBhcmFtIHBhdHRlcm4gdGhlIHBhdHRlcm4gdG8gbWF0Y2ggdGV4dCBhZ2FpbnN0Ci0JICAgICAqIEBwYXJhbSBpZ25vcmVDYXNlIGlmIHRydWUsIGNhc2UgaXMgaWdub3JlZAotCSAgICAgKiBAcGFyYW0gaWdub3JlV2lsZENhcmRzIGlmIHRydWUsIHdpbGQgY2FyZHMgYW5kIHRoZWlyIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGlnbm9yZWQKLQkgICAgICogCQkgIChldmVyeXRoaW5nIGlzIHRha2VuIGxpdGVyYWxseSkuCi0JICAgICAqLwotCSAgICBwdWJsaWMgU3RyaW5nTWF0Y2hlcihTdHJpbmcgcGF0dGVybiwgYm9vbGVhbiBpZ25vcmVDYXNlLAotCSAgICAgICAgICAgIGJvb2xlYW4gaWdub3JlV2lsZENhcmRzKSB7Ci0JICAgICAgICBpZiAocGF0dGVybiA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJfQotCSAgICAgICAgZklnbm9yZUNhc2UgPSBpZ25vcmVDYXNlOwotCSAgICAgICAgZklnbm9yZVdpbGRDYXJkcyA9IGlnbm9yZVdpbGRDYXJkczsKLQkgICAgICAgIGZQYXR0ZXJuID0gcGF0dGVybjsKLQkgICAgICAgIGZMZW5ndGggPSBwYXR0ZXJuLmxlbmd0aCgpOwotCi0JICAgICAgICBpZiAoZklnbm9yZVdpbGRDYXJkcykgewotCSAgICAgICAgICAgIHBhcnNlTm9XaWxkQ2FyZHMoKTsKLQkgICAgICAgIH0gZWxzZSB7Ci0JICAgICAgICAgICAgcGFyc2VXaWxkQ2FyZHMoKTsKLQkgICAgICAgIH0KLQkgICAgfQotCi0JICAgIC8qKgotCSAgICAgKiBGaW5kIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBwYXR0ZXJuIGJldHdlZW4gPGNvZGU+c3RhcnQ8L2NvZGUpKGluY2x1c2l2ZSkgCi0JICAgICAqIGFuZCA8Y29kZT5lbmQ8L2NvZGU+KGV4Y2x1c2l2ZSkuICAKLQkgICAgICogQHBhcmFtIHRleHQgdGhlIFN0cmluZyBvYmplY3QgdG8gc2VhcmNoIGluIAotCSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0aW5nIGluZGV4IG9mIHRoZSBzZWFyY2ggcmFuZ2UsIGluY2x1c2l2ZQotCSAgICAgKiBAcGFyYW0gZW5kIHRoZSBlbmRpbmcgaW5kZXggb2YgdGhlIHNlYXJjaCByYW5nZSwgZXhjbHVzaXZlCi0JICAgICAqIEByZXR1cm4gYW4gPGNvZGU+U3RyaW5nTWF0Y2hlci5Qb3NpdGlvbjwvY29kZT4gb2JqZWN0IHRoYXQga2VlcHMgdGhlIHN0YXJ0aW5nIAotCSAgICAgKiAoaW5jbHVzaXZlKSBhbmQgZW5kaW5nIHBvc2l0aW9ucyAoZXhjbHVzaXZlKSBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgCi0JICAgICAqIHBhdHRlcm4gaW4gdGhlIHNwZWNpZmllZCByYW5nZSBvZiB0aGUgdGV4dDsgcmV0dXJuIG51bGwgaWYgbm90IGZvdW5kIG9yIHN1YnRleHQKLQkgICAgICogaXMgZW1wdHkgKHN0YXJ0PT1lbmQpLiBBIHBhaXIgb2YgemVyb3MgaXMgcmV0dXJuZWQgaWYgcGF0dGVybiBpcyBlbXB0eSBzdHJpbmcKLQkgICAgICogTm90ZSB0aGF0IGZvciBwYXR0ZXJuIGxpa2UgIiphYmMqIiB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHN0YXJzLCBwb3NpdGlvbiBvZiAiYWJjIgotCSAgICAgKiBpcyByZXR1cm5lZC4gRm9yIGEgcGF0dGVybiBsaWtlIio/PyoiIGluIHRleHQgImFiY2RmIiwgKDEsMykgaXMgcmV0dXJuZWQKLQkgICAgICovCi0JICAgIHB1YmxpYyBTdHJpbmdNYXRjaGVyLlBvc2l0aW9uIGZpbmQoU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCkgewotCSAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQotCSAgICAgICAgaW50IHRsZW4gPSB0ZXh0Lmxlbmd0aCgpOwotCSAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewotCQkJCXN0YXJ0ID0gMDsKLQkJCX0KLQkgICAgICAgIGlmIChlbmQgPiB0bGVuKSB7Ci0JCQkJZW5kID0gdGxlbjsKLQkJCX0KLQkgICAgICAgIGlmIChlbmQgPCAwIHx8IHN0YXJ0ID49IGVuZCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCSAgICAgICAgaWYgKGZMZW5ndGggPT0gMCkgewotCQkJCXJldHVybiBuZXcgUG9zaXRpb24oc3RhcnQsIHN0YXJ0KTsKLQkJCX0KLQkgICAgICAgIGlmIChmSWdub3JlV2lsZENhcmRzKSB7Ci0JICAgICAgICAgICAgaW50IHggPSBwb3NJbih0ZXh0LCBzdGFydCwgZW5kKTsKLQkgICAgICAgICAgICBpZiAoeCA8IDApIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCSAgICAgICAgICAgIHJldHVybiBuZXcgUG9zaXRpb24oeCwgeCArIGZMZW5ndGgpOwotCSAgICAgICAgfQotCi0JICAgICAgICBpbnQgc2VnQ291bnQgPSBmU2VnbWVudHMubGVuZ3RoOwotCSAgICAgICAgaWYgKHNlZ0NvdW50ID09IDApIHsKLQkJCQlyZXR1cm4gbmV3IFBvc2l0aW9uKHN0YXJ0LCBlbmQpOwotCQkJfQotCi0JICAgICAgICBpbnQgY3VyUG9zID0gc3RhcnQ7Ci0JICAgICAgICBpbnQgbWF0Y2hTdGFydCA9IC0xOwotCSAgICAgICAgaW50IGk7Ci0JICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VnQ291bnQgJiYgY3VyUG9zIDwgZW5kOyArK2kpIHsKLQkgICAgICAgICAgICBTdHJpbmcgY3VycmVudCA9IGZTZWdtZW50c1tpXTsKLQkgICAgICAgICAgICBpbnQgbmV4dE1hdGNoID0gcmVnRXhwUG9zSW4odGV4dCwgY3VyUG9zLCBlbmQsIGN1cnJlbnQpOwotCSAgICAgICAgICAgIGlmIChuZXh0TWF0Y2ggPCAwKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkgICAgICAgICAgICBpZiAoaSA9PSAwKSB7Ci0JCQkJCW1hdGNoU3RhcnQgPSBuZXh0TWF0Y2g7Ci0JCQkJfQotCSAgICAgICAgICAgIGN1clBvcyA9IG5leHRNYXRjaCArIGN1cnJlbnQubGVuZ3RoKCk7Ci0JICAgICAgICB9Ci0JICAgICAgICBpZiAoaSA8IHNlZ0NvdW50KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JICAgICAgICByZXR1cm4gbmV3IFBvc2l0aW9uKG1hdGNoU3RhcnQsIGN1clBvcyk7Ci0JICAgIH0KLQotCSAgICAvKioKLQkgICAgICogbWF0Y2ggdGhlIGdpdmVuIDxjb2RlPnRleHQ8L2NvZGU+IHdpdGggdGhlIHBhdHRlcm4gCi0JICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBtYXRjaGVkIG90aGVyd2lzZSBmYWxzZQotCSAgICAgKiBAcGFyYW0gdGV4dCBhIFN0cmluZyBvYmplY3QgCi0JICAgICAqLwotCSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaChTdHJpbmcgdGV4dCkgewotCSAgICAJaWYodGV4dCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCSAgICAgICAgcmV0dXJuIG1hdGNoKHRleHQsIDAsIHRleHQubGVuZ3RoKCkpOwotCSAgICB9Ci0KLQkgICAgLyoqCi0JICAgICAqIEdpdmVuIHRoZSBzdGFydGluZyAoaW5jbHVzaXZlKSBhbmQgdGhlIGVuZGluZyAoZXhjbHVzaXZlKSBwb3NpdGlvbnMgaW4gdGhlICAgCi0JICAgICAqIDxjb2RlPnRleHQ8L2NvZGU+LCBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHN1YnN0cmluZyBtYXRjaGVzIHdpdGggYVBhdHRlcm4gIAotCSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBwb3J0aW9uIG9mIHRoZSB0ZXh0IG1hdGNoZXMgdGhlIHBhdHRlcm4KLQkgICAgICogQHBhcmFtIHRleHQgYSBTdHJpbmcgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHN1YnN0cmluZyB0byBtYXRjaCAKLQkgICAgICogQHBhcmFtIHN0YXJ0IG1hcmtzIHRoZSBzdGFydGluZyBwb3NpdGlvbiAoaW5jbHVzaXZlKSBvZiB0aGUgc3Vic3RyaW5nCi0JICAgICAqIEBwYXJhbSBlbmQgbWFya3MgdGhlIGVuZGluZyBpbmRleCAoZXhjbHVzaXZlKSBvZiB0aGUgc3Vic3RyaW5nIAotCSAgICAgKi8KLQkgICAgcHVibGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCkgewotCSAgICAgICAgaWYgKG51bGwgPT0gdGV4dCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQotCSAgICAgICAgaWYgKHN0YXJ0ID4gZW5kKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JICAgICAgICBpZiAoZklnbm9yZVdpbGRDYXJkcykgewotCQkJCXJldHVybiAoZW5kIC0gc3RhcnQgPT0gZkxlbmd0aCkKLQkgICAgICAgICAgICAgICAgICAgICYmIGZQYXR0ZXJuLnJlZ2lvbk1hdGNoZXMoZklnbm9yZUNhc2UsIDAsIHRleHQsIHN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTGVuZ3RoKTsKLQkJCX0KLQkgICAgICAgIGludCBzZWdDb3VudCA9IGZTZWdtZW50cy5sZW5ndGg7Ci0JICAgICAgICBpZiAoc2VnQ291bnQgPT0gMCAmJiAoZkhhc0xlYWRpbmdTdGFyIHx8IGZIYXNUcmFpbGluZ1N0YXIpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7Ci0JCQkJcmV0dXJuIGZMZW5ndGggPT0gMDsKLQkJCX0KLQkgICAgICAgIGlmIChmTGVuZ3RoID09IDApIHsKLQkJCQlyZXR1cm4gc3RhcnQgPT0gZW5kOwotCQkJfQotCi0JICAgICAgICBpbnQgdGxlbiA9IHRleHQubGVuZ3RoKCk7Ci0JICAgICAgICBpZiAoc3RhcnQgPCAwKSB7Ci0JCQkJc3RhcnQgPSAwOwotCQkJfQotCSAgICAgICAgaWYgKGVuZCA+IHRsZW4pIHsKLQkJCQllbmQgPSB0bGVuOwotCQkJfQotCi0JICAgICAgICBpbnQgdEN1clBvcyA9IHN0YXJ0OwotCSAgICAgICAgaW50IGJvdW5kID0gZW5kIC0gZkJvdW5kOwotCSAgICAgICAgaWYgKGJvdW5kIDwgMCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkgICAgICAgIGludCBpID0gMDsKLQkgICAgICAgIFN0cmluZyBjdXJyZW50ID0gZlNlZ21lbnRzW2ldOwotCSAgICAgICAgaW50IHNlZ0xlbmd0aCA9IGN1cnJlbnQubGVuZ3RoKCk7Ci0KLQkgICAgICAgIC8qIHByb2Nlc3MgZmlyc3Qgc2VnbWVudCAqLwotCSAgICAgICAgaWYgKCFmSGFzTGVhZGluZ1N0YXIpIHsKLQkgICAgICAgICAgICBpZiAoIXJlZ0V4cFJlZ2lvbk1hdGNoZXModGV4dCwgc3RhcnQsIGN1cnJlbnQsIDAsIHNlZ0xlbmd0aCkpIHsKLQkgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAgICAgICAgIH0gZWxzZSB7Ci0JICAgICAgICAgICAgICAgICsraTsKLQkgICAgICAgICAgICAgICAgdEN1clBvcyA9IHRDdXJQb3MgKyBzZWdMZW5ndGg7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgICAgaWYgKChmU2VnbWVudHMubGVuZ3RoID09IDEpICYmICghZkhhc0xlYWRpbmdTdGFyKQotCSAgICAgICAgICAgICAgICAmJiAoIWZIYXNUcmFpbGluZ1N0YXIpKSB7Ci0JICAgICAgICAgICAgLy8gb25seSBvbmUgc2VnbWVudCB0byBtYXRjaCwgbm8gd2lsZGNhcmRzIHNwZWNpZmllZAotCSAgICAgICAgICAgIHJldHVybiB0Q3VyUG9zID09IGVuZDsKLQkgICAgICAgIH0KLQkgICAgICAgIC8qIHByb2Nlc3MgbWlkZGxlIHNlZ21lbnRzICovCi0JICAgICAgICB3aGlsZSAoaSA8IHNlZ0NvdW50KSB7Ci0JICAgICAgICAgICAgY3VycmVudCA9IGZTZWdtZW50c1tpXTsKLQkgICAgICAgICAgICBpbnQgY3VycmVudE1hdGNoOwotCSAgICAgICAgICAgIGludCBrID0gY3VycmVudC5pbmRleE9mKGZTaW5nbGVXaWxkQ2FyZCk7Ci0JICAgICAgICAgICAgaWYgKGsgPCAwKSB7Ci0JICAgICAgICAgICAgICAgIGN1cnJlbnRNYXRjaCA9IHRleHRQb3NJbih0ZXh0LCB0Q3VyUG9zLCBlbmQsIGN1cnJlbnQpOwotCSAgICAgICAgICAgICAgICBpZiAoY3VycmVudE1hdGNoIDwgMCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JICAgICAgICAgICAgfSBlbHNlIHsKLQkgICAgICAgICAgICAgICAgY3VycmVudE1hdGNoID0gcmVnRXhwUG9zSW4odGV4dCwgdEN1clBvcywgZW5kLCBjdXJyZW50KTsKLQkgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRNYXRjaCA8IDApIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB0Q3VyUG9zID0gY3VycmVudE1hdGNoICsgY3VycmVudC5sZW5ndGgoKTsKLQkgICAgICAgICAgICBpKys7Ci0JICAgICAgICB9Ci0KLQkgICAgICAgIC8qIHByb2Nlc3MgZmluYWwgc2VnbWVudCAqLwotCSAgICAgICAgaWYgKCFmSGFzVHJhaWxpbmdTdGFyICYmIHRDdXJQb3MgIT0gZW5kKSB7Ci0JICAgICAgICAgICAgaW50IGNsZW4gPSBjdXJyZW50Lmxlbmd0aCgpOwotCSAgICAgICAgICAgIHJldHVybiByZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIGVuZCAtIGNsZW4sIGN1cnJlbnQsIDAsIGNsZW4pOwotCSAgICAgICAgfQotCSAgICAgICAgcmV0dXJuIGkgPT0gc2VnQ291bnQ7Ci0JICAgIH0KLQotCSAgICAvKioKLQkgICAgICogVGhpcyBtZXRob2QgcGFyc2VzIHRoZSBnaXZlbiBwYXR0ZXJuIGludG8gc2VnbWVudHMgc2VwZXJhdGVkIGJ5IHdpbGRjYXJkICcqJyBjaGFyYWN0ZXJzLgotCSAgICAgKiBTaW5jZSB3aWxkY2FyZHMgYXJlIG5vdCBiZWluZyB1c2VkIGluIHRoaXMgY2FzZSwgdGhlIHBhdHRlcm4gY29uc2lzdHMgb2YgYSBzaW5nbGUgc2VnbWVudC4KLQkgICAgICovCi0JICAgIHByaXZhdGUgdm9pZCBwYXJzZU5vV2lsZENhcmRzKCkgewotCSAgICAgICAgZlNlZ21lbnRzID0gbmV3IFN0cmluZ1sxXTsKLQkgICAgICAgIGZTZWdtZW50c1swXSA9IGZQYXR0ZXJuOwotCSAgICAgICAgZkJvdW5kID0gZkxlbmd0aDsKLQkgICAgfQotCi0JICAgIC8qKgotCSAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIHBhdHRlcm4gaW50byBzZWdtZW50cyBzZXBlcmF0ZWQgYnkgd2lsZGNhcmQgJyonIGNoYXJhY3RlcnMuCi0JICAgICAqIEBwYXJhbSBwLCBhIFN0cmluZyBvYmplY3QgdGhhdCBpcyBhIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCAnKicgYW5kL29yICc/JwotCSAgICAgKi8KLQkgICAgcHJpdmF0ZSB2b2lkIHBhcnNlV2lsZENhcmRzKCkgewotCSAgICAgICAgaWYgKGZQYXR0ZXJuLnN0YXJ0c1dpdGgoIioiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZkhhc0xlYWRpbmdTdGFyID0gdHJ1ZTsKLQkJCX0KLQkgICAgICAgIGlmIChmUGF0dGVybi5lbmRzV2l0aCgiKiIpKSB7Ly8kTk9OLU5MUy0xJAotCSAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbiBlc2NhcGVkIHdpbGRjYXJkICovCi0JICAgICAgICAgICAgaWYgKGZMZW5ndGggPiAxICYmIGZQYXR0ZXJuLmNoYXJBdChmTGVuZ3RoIC0gMikgIT0gJ1xcJykgewotCSAgICAgICAgICAgICAgICBmSGFzVHJhaWxpbmdTdGFyID0gdHJ1ZTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0KLQkgICAgICAgIFZlY3RvciB0ZW1wID0gbmV3IFZlY3RvcigpOwotCi0JICAgICAgICBpbnQgcG9zID0gMDsKLQkgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JICAgICAgICB3aGlsZSAocG9zIDwgZkxlbmd0aCkgewotCSAgICAgICAgICAgIGNoYXIgYyA9IGZQYXR0ZXJuLmNoYXJBdChwb3MrKyk7Ci0JICAgICAgICAgICAgc3dpdGNoIChjKSB7Ci0JICAgICAgICAgICAgY2FzZSAnXFwnOgotCSAgICAgICAgICAgICAgICBpZiAocG9zID49IGZMZW5ndGgpIHsKLQkgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYyk7Ci0JICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0JICAgICAgICAgICAgICAgICAgICBjaGFyIG5leHQgPSBmUGF0dGVybi5jaGFyQXQocG9zKyspOwotCSAgICAgICAgICAgICAgICAgICAgLyogaWYgaXQncyBhbiBlc2NhcGUgc2VxdWVuY2UgKi8KLQkgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09ICcqJyB8fCBuZXh0ID09ICc/JyB8fCBuZXh0ID09ICdcXCcpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKG5leHQpOwotCSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgYW4gZXNjYXBlIHNlcXVlbmNlLCBqdXN0IGluc2VydCBsaXRlcmFsbHkgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGMpOwotCSAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQobmV4dCk7Ci0JICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAgICAgYnJlYWs7Ci0JICAgICAgICAgICAgY2FzZSAnKic6Ci0JICAgICAgICAgICAgICAgIGlmIChidWYubGVuZ3RoKCkgPiAwKSB7Ci0JICAgICAgICAgICAgICAgICAgICAvKiBuZXcgc2VnbWVudCAqLwotCSAgICAgICAgICAgICAgICAgICAgdGVtcC5hZGRFbGVtZW50KGJ1Zi50b1N0cmluZygpKTsKLQkgICAgICAgICAgICAgICAgICAgIGZCb3VuZCArPSBidWYubGVuZ3RoKCk7Ci0JICAgICAgICAgICAgICAgICAgICBidWYuc2V0TGVuZ3RoKDApOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgIGJyZWFrOwotCSAgICAgICAgICAgIGNhc2UgJz8nOgotCSAgICAgICAgICAgICAgICAvKiBhcHBlbmQgc3BlY2lhbCBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIHNpbmdsZSBtYXRjaCB3aWxkY2FyZCAqLwotCSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGZTaW5nbGVXaWxkQ2FyZCk7Ci0JICAgICAgICAgICAgICAgIGJyZWFrOwotCSAgICAgICAgICAgIGRlZmF1bHQ6Ci0JICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYyk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotCi0JICAgICAgICAvKiBhZGQgbGFzdCBidWZmZXIgdG8gc2VnbWVudCBsaXN0ICovCi0JICAgICAgICBpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotCSAgICAgICAgICAgIHRlbXAuYWRkRWxlbWVudChidWYudG9TdHJpbmcoKSk7Ci0JICAgICAgICAgICAgZkJvdW5kICs9IGJ1Zi5sZW5ndGgoKTsKLQkgICAgICAgIH0KLQotCSAgICAgICAgZlNlZ21lbnRzID0gbmV3IFN0cmluZ1t0ZW1wLnNpemUoKV07Ci0JICAgICAgICB0ZW1wLmNvcHlJbnRvKGZTZWdtZW50cyk7Ci0JICAgIH0KLQotCSAgICAvKiogCi0JICAgICAqIEBwYXJhbSB0ZXh0IGEgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIG5vIHdpbGRjYXJkCi0JICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHRleHQgZm9yIHNlYXJjaCwgaW5jbHVzaXZlCi0JICAgICAqIEBwYXJhbSBlbmQgdGhlIHN0b3BwaW5nIHBvaW50IG9mIHNlYXJjaCwgZXhjbHVzaXZlCi0JICAgICAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IG9mIHRoZSBwYXR0ZXJuICwgb3IgLTEgaWYgbm90IGZvdW5kIAotCSAgICAgKi8KLQkgICAgcHJvdGVjdGVkIGludCBwb3NJbihTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ly9ubyB3aWxkIGNhcmQgaW4gcGF0dGVybgotCSAgICAgICAgaW50IG1heCA9IGVuZCAtIGZMZW5ndGg7Ci0KLQkgICAgICAgIGlmICghZklnbm9yZUNhc2UpIHsKLQkgICAgICAgICAgICBpbnQgaSA9IHRleHQuaW5kZXhPZihmUGF0dGVybiwgc3RhcnQpOwotCSAgICAgICAgICAgIGlmIChpID09IC0xIHx8IGkgPiBtYXgpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkgICAgICAgICAgICByZXR1cm4gaTsKLQkgICAgICAgIH0KLQotCSAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IG1heDsgKytpKSB7Ci0JICAgICAgICAgICAgaWYgKHRleHQucmVnaW9uTWF0Y2hlcyh0cnVlLCBpLCBmUGF0dGVybiwgMCwgZkxlbmd0aCkpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCSAgICAgICAgfQotCi0JICAgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQotCSAgICAvKiogCi0JICAgICAqIEBwYXJhbSB0ZXh0IGEgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1heSBvbmx5IGNvbnRhaW4gJz8nKHMpCi0JICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHRleHQgZm9yIHNlYXJjaCwgaW5jbHVzaXZlCi0JICAgICAqIEBwYXJhbSBlbmQgdGhlIHN0b3BwaW5nIHBvaW50IG9mIHNlYXJjaCwgZXhjbHVzaXZlCi0JICAgICAqIEBwYXJhbSBwIGEgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1heSBjb250YWlucyAnPycKLQkgICAgICogQHJldHVybiB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHRleHQgb2YgdGhlIHBhdHRlcm4gLCBvciAtMSBpZiBub3QgZm91bmQgCi0JICAgICAqLwotCSAgICBwcm90ZWN0ZWQgaW50IHJlZ0V4cFBvc0luKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIFN0cmluZyBwKSB7Ci0JICAgICAgICBpbnQgcGxlbiA9IHAubGVuZ3RoKCk7Ci0KLQkgICAgICAgIGludCBtYXggPSBlbmQgLSBwbGVuOwotCSAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IG1heDsgKytpKSB7Ci0JICAgICAgICAgICAgaWYgKHJlZ0V4cFJlZ2lvbk1hdGNoZXModGV4dCwgaSwgcCwgMCwgcGxlbikpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCSAgICAgICAgfQotCSAgICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0KLQkgICAgLyoqCi0JICAgICAqIAotCSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLQkgICAgICogQHBhcmFtIHRleHQgYSBTdHJpbmcgdG8gbWF0Y2gKLQkgICAgICogQHBhcmFtIHN0YXJ0IGludCB0aGF0IGluZGljYXRlcyB0aGUgc3RhcnRpbmcgaW5kZXggb2YgbWF0Y2gsIGluY2x1c2l2ZQotCSAgICAgKiBAcGFyYW0gZW5kPC9jb2RlPiBpbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIGVuZGluZyBpbmRleCBvZiBtYXRjaCwgZXhjbHVzaXZlCi0JICAgICAqIEBwYXJhbSBwIFN0cmluZywgIFN0cmluZywgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF5IGNvbnRhaW4gJz8nCi0JICAgICAqIEBwYXJhbSBpZ25vcmVDYXNlIGJvb2xlYW4gaW5kaWNhdGluZyB3ZXRoZXIgY29kZT5wPC9jb2RlPiBpcyBjYXNlIHNlbnNpdGl2ZQotCSAgICAgKi8KLQkgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVnRXhwUmVnaW9uTWF0Y2hlcyhTdHJpbmcgdGV4dCwgaW50IHRTdGFydCwgU3RyaW5nIHAsCi0JICAgICAgICAgICAgaW50IHBTdGFydCwgaW50IHBsZW4pIHsKLQkgICAgICAgIHdoaWxlIChwbGVuLS0gPiAwKSB7Ci0JICAgICAgICAgICAgY2hhciB0Y2hhciA9IHRleHQuY2hhckF0KHRTdGFydCsrKTsKLQkgICAgICAgICAgICBjaGFyIHBjaGFyID0gcC5jaGFyQXQocFN0YXJ0KyspOwotCi0JICAgICAgICAgICAgLyogcHJvY2VzcyB3aWxkIGNhcmRzICovCi0JICAgICAgICAgICAgaWYgKCFmSWdub3JlV2lsZENhcmRzKSB7Ci0JICAgICAgICAgICAgICAgIC8qIHNraXAgc2luZ2xlIHdpbGQgY2FyZHMgKi8KLQkgICAgICAgICAgICAgICAgaWYgKHBjaGFyID09IGZTaW5nbGVXaWxkQ2FyZCkgewotCSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHBjaGFyID09IHRjaGFyKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkgICAgICAgICAgICBpZiAoZklnbm9yZUNhc2UpIHsKLQkgICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci50b1VwcGVyQ2FzZSh0Y2hhcikgPT0gQ2hhcmFjdGVyCi0JICAgICAgICAgICAgICAgICAgICAgICAgLnRvVXBwZXJDYXNlKHBjaGFyKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkgICAgICAgICAgICAgICAgLy8gY29tcGFyaW5nIGFmdGVyIGNvbnZlcnRpbmcgdG8gdXBwZXIgY2FzZSBkb2Vzbid0IGhhbmRsZSBhbGwgY2FzZXM7Ci0JICAgICAgICAgICAgICAgIC8vIGFsc28gY29tcGFyZSBhZnRlciBjb252ZXJ0aW5nIHRvIGxvd2VyIGNhc2UKLQkgICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh0Y2hhcikgPT0gQ2hhcmFjdGVyCi0JICAgICAgICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKHBjaGFyKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAgICAgfQotCSAgICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQotCSAgICAvKiogCi0JICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBzdHJpbmcgdG8gbWF0Y2gKLQkgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBmb3Igc2VhcmNoLCBpbmNsdXNpdmUKLQkgICAgICogQHBhcmFtIGVuZCB0aGUgc3RvcHBpbmcgcG9pbnQgb2Ygc2VhcmNoLCBleGNsdXNpdmUKLQkgICAgICogQHBhcmFtIHAgYSBwYXR0ZXJuIHN0cmluZyB0aGF0IGhhcyBubyB3aWxkY2FyZAotCSAgICAgKiBAcmV0dXJuIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBvZiB0aGUgcGF0dGVybiAsIG9yIC0xIGlmIG5vdCBmb3VuZCAKLQkgICAgICovCi0JICAgIHByb3RlY3RlZCBpbnQgdGV4dFBvc0luKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIFN0cmluZyBwKSB7Ci0KLQkgICAgICAgIGludCBwbGVuID0gcC5sZW5ndGgoKTsKLQkgICAgICAgIGludCBtYXggPSBlbmQgLSBwbGVuOwotCi0JICAgICAgICBpZiAoIWZJZ25vcmVDYXNlKSB7Ci0JICAgICAgICAgICAgaW50IGkgPSB0ZXh0LmluZGV4T2YocCwgc3RhcnQpOwotCSAgICAgICAgICAgIGlmIChpID09IC0xIHx8IGkgPiBtYXgpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkgICAgICAgICAgICByZXR1cm4gaTsKLQkgICAgICAgIH0KLQotCSAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IG1heDsgKytpKSB7Ci0JICAgICAgICAgICAgaWYgKHRleHQucmVnaW9uTWF0Y2hlcyh0cnVlLCBpLCBwLCAwLCBwbGVuKSkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JICAgICAgICB9Ci0KLQkgICAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjYzUxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0Fic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3lFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JVGVtcG9yYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uOwotCi0KLS8qKgotICogQSBiYXNlIFJlY29uY2lsaW5nU3RyYXRlZ3kuIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQKLSAqIGNyZWF0ZVJlY29uY2lsZVN0ZXBzKCkuIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBrbm93IGFib3V0Ci0gKiBJU3RydWN0dXJlZERvY3VtZW50LCBvbmx5IElEb2N1bWVudC4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSVJlY29uY2lsaW5nU3RyYXRlZ3ksIElSZWNvbmNpbGluZ1N0cmF0ZWd5RXh0ZW5zaW9uLCBJUmVsZWFzYWJsZSB7Ci0KLQkvKiogZGVidWcgZmxhZyAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyam9iIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIHRoZXNlIGxpbWl0cyBhcmUgc2FmZXR5cyBmb3IgInJ1bmF3YXkiIHZhbGlkYXRpb24gY2FzZXMKLQkvLyBzaG91bGQgYmUgdXNlZCB0byBzYWZlZ3VhcmQgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGxvb3BzIG9yIHBvdGVudGlhbGx5Ci0JLy8gbG9uZyBhbm5vdGF0aW9ucwotCS8vIChzaW5jZSB0aGUgcGFpbnRlciBzZWVtcyB0byBhZmZlY3QgcGVyZm9ybWFuY2Ugd2hlbiBwYWludGluZyBsb25nCi0JLy8gYW5ub3RhdGlvbnMpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5OT1RBVElPTl9MRU5HVEhfTElNSVQgPSAyNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX0VSUk9SX0xJTUlUID0gMjU7Ci0KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQlwcml2YXRlIElTb3VyY2VWaWV3ZXIgZlNvdXJjZVZpZXdlciA9IG51bGw7Ci0KLQkvLyBsaXN0IG9mICJ2YWxpZGF0b3IiIGFubm90YXRpb25zCi0JLy8gZm9yIGdyYXkvdW4tZ3JheSBjYXBhYmlsaXR5Ci0JcHJpdmF0ZSBIYXNoU2V0IGZNYXJrZXJBbm5vdGF0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHN0cmF0ZWd5LiBUaGUgc291cmNlIHZpZXdlciBtdXN0IGJlIHNldCBtYW51YWxseQotCSAqIGFmdGVyIGNyZWF0aW9uIGJlZm9yZSBhIHJlY29uY2lsZXIgdXNpbmcgdGhpcyBjb25zdHJ1Y3RvciB3aWxsIHdvcmsuCi0JICovCi0JcHVibGljIEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5KCkgewotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzdHJhdGVneS4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICovCi0JcHVibGljIEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWZTb3VyY2VWaWV3ZXIgPSBzb3VyY2VWaWV3ZXI7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHdoZXJlIHdlIGFkZCByZXN1bHRzIHRvIHRoZSBhbm5vdGF0aW9uTW9kZWwsIGRvaW5nIGFueSBzcGVjaWFsCi0JICogImV4dHJhIiBwcm9jZXNzaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlc3VsdFRvQW5ub3RhdGlvbk1vZGVsKElSZWNvbmNpbGVSZXN1bHQgcmVzdWx0KSB7Ci0JCWlmICghKHJlc3VsdCBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pKQotCQkJcmV0dXJuOwotCQkvLyBjYW4gYmUgbnVsbCB3aGVuIGNsb3NpbmcgdGhlIGVkaXRvcgotCQlpZiAoZ2V0QW5ub3RhdGlvbk1vZGVsKCkgIT0gbnVsbCkgewotCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiB0ZW1wQW5ub3RhdGlvbiA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSByZXN1bHQ7Ci0KLQkJCVN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uIHNtYSA9IGdldENvcnJlc3BvbmRpbmdNYXJrZXJBbm5vdGF0aW9uKHRlbXBBbm5vdGF0aW9uKTsKLQkJCWlmIChzbWEgIT0gbnVsbCkgewotCQkJCS8vIHVuLWdyYXkgb3V0IHRoZSBtYXJrZXIgYW5ub3RhdGlvbgotCQkJCXNtYS5zZXRHcmF5ZWQoZmFsc2UpOwotCQkJfQotCi0JCQlnZXRBbm5vdGF0aW9uTW9kZWwoKS5hZGRBbm5vdGF0aW9uKHRlbXBBbm5vdGF0aW9uLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuIGlmIHRoaXMgc3RyYXRlZ3kgaXMgcmVzcG9uaXNibGUgZm9yIGFkZGluZyB0aGlzIHR5cGUgb2Yga2V5Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuSGFuZGxlUGFydGl0aW9uKFN0cmluZyBwYXJ0aXRpb24pIHsKLQkJLy8gU3RyaW5nW10gaGF5c3RhY2sgPSBnZXRQYXJ0aXRpb25UeXBlcygpOwotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IGhheXN0YWNrLmxlbmd0aDsgaSsrKSB7Ci0JCS8vIGlmIChoYXlzdGFja1tpXS5lcXVhbHMocGFydGl0aW9uKSkKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gLyoqCi0JLy8gKiBAcGFyYW0gc3RlcAotCS8vICogQHJldHVybgotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNTdGVwKElSZWNvbmNpbGVTdGVwIHN0ZXApIHsKLQkvLyBpZiAoZkZpcnN0U3RlcCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwKQotCS8vIHJldHVybiAoKFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwKSBmRmlyc3RTdGVwKS5pc1NpYmxpbmdTdGVwKHN0ZXApOwotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHdoZXJlIHlvdSBzaG91bGQgY3JlYXRlIHRoZSBzdGVwcyBmb3IgdGhpcyBzdHJhdGVneQotCSAqLwotCWFic3RyYWN0IHB1YmxpYyB2b2lkIGNyZWF0ZVJlY29uY2lsZVN0ZXBzKCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgQUxMIHRlbXBvcmFyeSBhbm5vdGF0aW9ucyB0aGF0IHRoaXMgc3RyYXRlZ3kgY2FuIGhhbmRsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgVGVtcG9yYXJ5QW5ub3RhdGlvbltdIGdldEFsbEFubm90YXRpb25zVG9SZW1vdmUoKSB7Ci0JCUxpc3QgcmVtb3ZhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JCWlmIChhbm5vdGF0aW9uTW9kZWwgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaSA9IGFubm90YXRpb25Nb2RlbC5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpLm5leHQoKTsKLQkJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJVGVtcG9yYXJ5QW5ub3RhdGlvbikpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJSVRlbXBvcmFyeUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChJVGVtcG9yYXJ5QW5ub3RhdGlvbikgb2JqOwotCQkJCVJlY29uY2lsZUFubm90YXRpb25LZXkga2V5ID0gKFJlY29uY2lsZUFubm90YXRpb25LZXkpIGFubm90YXRpb24uZ2V0S2V5KCk7Ci0JCQkJLy8gdGhlbiBpZiB0aGlzIHN0cmF0ZWd5IGtub3dzIGhvdyB0byBhZGQvcmVtb3ZlIHRoaXMKLQkJCQkvLyBwYXJ0aXRpb24gdHlwZQotCQkJCWlmIChjYW5IYW5kbGVQYXJ0aXRpb24oa2V5LmdldFBhcnRpdGlvblR5cGUoKSkgLyoKLQkJCQkJCQkJCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJCQkJCQkJCSAqIGNvbnRhaW5zU3RlcChrZXkuZ2V0U3RlcCgpKQotCQkJCQkJCQkJCQkJCQkJCSAqLykKLQkJCQkJcmVtb3ZhbHMuYWRkKGFubm90YXRpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiAoVGVtcG9yYXJ5QW5ub3RhdGlvbltdKSByZW1vdmFscy50b0FycmF5KG5ldyBUZW1wb3JhcnlBbm5vdGF0aW9uW3JlbW92YWxzLnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBJQW5ub3RhdGlvbk1vZGVsIGdldEFubm90YXRpb25Nb2RlbCgpIHsKLQkJSUFubm90YXRpb25Nb2RlbCBtb2RlbCA9IG51bGw7Ci0JCWlmIChmU291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCW1vZGVsID0gZlNvdXJjZVZpZXdlci5nZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbXBvcmFyeUFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9uc1RvUmVtb3ZlKERpcnR5UmVnaW9uIGRyLCBMaXN0IHN0ZXBzUnVuKSB7Ci0KLQkJTGlzdCByZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JCS8vIGNhbiBiZSBudWxsIHdoZW4gY2xvc2luZyB0aGUgZWRpdG9yCi0JCWlmIChnZXRBbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKSB7Ci0KLQkJCS8vIGNsZWFyIHZhbGlkYXRvciBhbm5vdGF0aW9ucwotCQkJZ2V0TWFya2VyQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCi0JCQlJdGVyYXRvciBpID0gYW5ub3RhdGlvbk1vZGVsLmdldEFubm90YXRpb25JdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0KLQkJCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0KLQkJCQkvLyBjaGVjayBpZiBpdCdzIGEgdmFsaWRhdG9yIG1hcmtlciBhbm5vdGF0aW9uCi0JCQkJLy8gaWYgaXQgaXMgc2F2ZSBpdCBmb3IgY29tcGFyaXNpb24gbGF0ZXIgKHRvICJncmF5IiBpY29ucykKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24pIHsKLQkJCQkJU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24gc21hID0gKFN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uKSBvYmo7Ci0KLQkJCQkJaWYgKHNtYS5nZXRBbm5vdGF0aW9uVHlwZSgpID09IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfRVJST1IgfHwgc21hLmdldEFubm90YXRpb25UeXBlKCkgPT0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9XQVJOSU5HKQotCQkJCQkJZk1hcmtlckFubm90YXRpb25zLmFkZChzbWEpOwotCQkJCX0KLQotCQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pKQotCQkJCQljb250aW51ZTsKLQotCQkJCVRlbXBvcmFyeUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSBvYmo7Ci0JCQkJUmVjb25jaWxlQW5ub3RhdGlvbktleSBrZXkgPSAoUmVjb25jaWxlQW5ub3RhdGlvbktleSkgYW5ub3RhdGlvbi5nZXRLZXkoKTsKLQotCQkJCS8vIHRoZW4gaWYgdGhpcyBzdHJhdGVneSBrbm93cyBob3cgdG8gYWRkL3JlbW92ZSB0aGlzCi0JCQkJLy8gcGFydGl0aW9uIHR5cGUKLQkJCQlpZiAoY2FuSGFuZGxlUGFydGl0aW9uKGtleS5nZXRQYXJ0aXRpb25UeXBlKCkpICYmIHN0ZXBzUnVuLmNvbnRhaW5zKGtleS5nZXRTdGVwKCkpKSB7Ci0JCQkJCWlmIChrZXkuZ2V0U2NvcGUoKSA9PSBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlBBUlRJQUwgJiYgYW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLm92ZXJsYXBzV2l0aChkci5nZXRPZmZzZXQoKSwgZHIuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQkJCQlyZW1vdmUuYWRkKGFubm90YXRpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGtleS5nZXRTY29wZSgpID09IFJlY29uY2lsZUFubm90YXRpb25LZXkuVE9UQUwpIHsKLQkJCQkJCXJlbW92ZS5hZGQoYW5ub3RhdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChUZW1wb3JhcnlBbm5vdGF0aW9uW10pIHJlbW92ZS50b0FycmF5KG5ldyBUZW1wb3JhcnlBbm5vdGF0aW9uW3JlbW92ZS5zaXplKCldKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGNvbnRhaW5zU3RlcChJUmVjb25jaWxlU3RlcCBzdGVwKTsKLQotCS8qKgotCSAqIEdldHMgcGFydGl0aW9uIHR5cGVzIGZyb20gYWxsIHN0ZXBzIGluIHRoaXMgc3RyYXRlZ3kuCi0JICogCi0JICogQHJldHVybiBwYXJpdGlvbiB0eXBlcyBmcm9tIGFsbCBzdGVwcwotCSAqLwotCS8vIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJ0aXRpb25UeXBlcygpIHsKLQkvLyBpZiAoZkZpcnN0U3RlcCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwKQotCS8vIHJldHVybiAoKFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwKSBmRmlyc3RTdGVwKS5nZXRQYXJ0aXRpb25UeXBlcygpOwotCS8vIHJldHVybiBuZXcgU3RyaW5nWzBdOwotCS8vIH0KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQljcmVhdGVSZWNvbmNpbGVTdGVwcygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5RXh0ZW5zaW9uI2luaXRpYWxSZWNvbmNpbGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxSZWNvbmNpbGUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQkJaWYgKERFQlVHICYmIChmUHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgZlByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiBTVFJBVEVHWSBDQU5DRUxFRCAqKjoiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGZQcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBmUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHRoZSByZXN1bHRzIGZyb20gdGhlIHJlY29uY2lsZSBzdGVwcyBpbiB0aGlzIHN0cmF0ZWd5LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3MoZmluYWwgSVJlY29uY2lsZVJlc3VsdFtdIHJlc3VsdHMpIHsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJbdHJhY2UgcmVjb25jaWxlcl0gPiBTVEFSVElORyBQUk9DRVNTIE1FVEhPRCB3aXRoICgiICsgcmVzdWx0cy5sZW5ndGggKyAiKSByZXN1bHRzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWlmIChyZXN1bHRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aCAmJiBpIDwgRUxFTUVOVF9FUlJPUl9MSU1JVCAmJiAhaXNDYW5jZWxlZCgpOyBpKyspIHsKLQotCQkJaWYgKGlzQ2FuY2VsZWQoKSkgewotCQkJCWlmIChERUJVRykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJbdHJhY2UgcmVjb25jaWxlcl0gPioqIFBST0NFU1MgKGFkZGluZykgV0FTIENBTkNFTExFRCAqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJYWRkUmVzdWx0VG9Bbm5vdGF0aW9uTW9kZWwocmVzdWx0c1tpXSk7Ci0JCX0KLQotCQlpZiAoREVCVUcpIHsKLQkJCVN0cmluZ0J1ZmZlciB0cmFjZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVzdWx0cy5sZW5ndGg7IGorKykKLQkJCQl0cmFjZVN0cmluZy5hcHBlbmQoIlxuICgrKSA6IiArIHJlc3VsdHNbal0gKyAiOlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJbdHJhY2UgcmVjb25jaWxlcl0gPiBQUk9DRVNTSU5HICgiICsgcmVzdWx0cy5sZW5ndGggKyAiKSByZXN1bHRzIGluIEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5ICIgKyB0cmFjZVN0cmluZyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3kjcmVjb25jaWxlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGUoRGlydHlSZWdpb24gZGlydHlSZWdpb24sIElSZWdpb24gc3ViUmVnaW9uKSB7Ci0JCS8vIG5vdCB1c2VkCi0JCS8vIHdlIG9ubHkgaGF2ZSB2YWxpZGF0b3Igc3RyYXRlZ3kgbm93Ci0KLQkJLy8gLy8gZXh0ZXJuYWwgZmlsZXMgbWF5IGJlIG51bGwKLQkJLy8gaWYgKGlzQ2FuY2VsZWQoKSB8fCBmRmlyc3RTdGVwID09IG51bGwpCi0JCS8vIHJldHVybjsKLQkJLy8KLQkJLy8gVGVtcG9yYXJ5QW5ub3RhdGlvbltdIGFubm90YXRpb25zVG9SZW1vdmUgPSBuZXcKLQkJLy8gVGVtcG9yYXJ5QW5ub3RhdGlvblswXTsKLQkJLy8gSVJlY29uY2lsZVJlc3VsdFtdIGFubm90YXRpb25zVG9BZGQgPSBuZXcgSVJlY29uY2lsZVJlc3VsdFswXTsKLQkJLy8gU3RydWN0dXJlZFJlY29uY2lsZVN0ZXAgc3RydWN0dXJlZFN0ZXAgPSAoU3RydWN0dXJlZFJlY29uY2lsZVN0ZXApCi0JCS8vIGZGaXJzdFN0ZXA7Ci0JCS8vICAgICAgICAKLQkJLy8gYW5ub3RhdGlvbnNUb1JlbW92ZSA9IGdldEFubm90YXRpb25zVG9SZW1vdmUoZGlydHlSZWdpb24pOwotCQkvLyBhbm5vdGF0aW9uc1RvQWRkID0gc3RydWN0dXJlZFN0ZXAucmVjb25jaWxlKGRpcnR5UmVnaW9uLAotCQkvLyBzdWJSZWdpb24pOwotCQkvLyAgICAgICAgCi0JCS8vIHNtYXJ0UHJvY2Vzcyhhbm5vdGF0aW9uc1RvUmVtb3ZlLCBhbm5vdGF0aW9uc1RvQWRkKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFydGl0aW9uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3kjcmVjb25jaWxlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGUoSVJlZ2lvbiBwYXJ0aXRpb24pIHsKLQkJLy8gbm90IHVzZWQsIHdlIHVzZToKLQkJLy8gcmVjb25jaWxlKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uLCBJUmVnaW9uIHN1YlJlZ2lvbikKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyByZWxlYXNlKCkgb24gYWxsIHRoZSBzdGVwcyBpbiB0aGlzIHN0cmF0ZWd5LiBDdXJyZW50bHkgZG9uZSBpbgotCSAqIFN0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3IuU291cmNlV2lkZ2V0RGlzcG9zZUxpc3RlbmVyI3dpZGdldERpc3Bvc2VkKC4uLikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyByZWxlYXNlIHN0ZXBzIChlYWNoIHN0ZXAgY2FsbHMgcmVsZWFzZSBvbiB0aGUgbmV4dCkKLQkJLy8gaWYgKGZGaXJzdFN0ZXAgIT0gbnVsbCAmJiBmRmlyc3RTdGVwIGluc3RhbmNlb2YgSVJlbGVhc2FibGUpCi0JCS8vICgoSVJlbGVhc2FibGUpIGZGaXJzdFN0ZXApLnJlbGVhc2UoKTsKLQkJLy8gd2UgZG9uJ3QgdG8gbnVsbCBvdXQgdGhlIHN0ZXBzLCBpbiBjYXNlCi0JCS8vIGl0J3MgcmVjb25maWd1cmVkIGxhdGVyCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUFubm90YXRpb25zKFRlbXBvcmFyeUFubm90YXRpb25bXSBhbm5vdGF0aW9uc1RvUmVtb3ZlKSB7Ci0KLQkJSUFubm90YXRpb25Nb2RlbCBhbm5vdGF0aW9uTW9kZWwgPSBnZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQkJLy8gY2FuIGJlIG51bGwgd2hlbiBjbG9zaW5nIHRoZSBlZGl0b3IKLQkJaWYgKGFubm90YXRpb25Nb2RlbCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zVG9SZW1vdmUubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCWlmIChERUJVRykKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiW3RyYWNlIHJlY29uY2lsZXJdID4qKiBSRU1PVkFMIFdBUyBDQU5DRUxMRUQgKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uIHNtYSA9IGdldENvcnJlc3BvbmRpbmdNYXJrZXJBbm5vdGF0aW9uKGFubm90YXRpb25zVG9SZW1vdmVbaV0pOwotCQkJCWlmIChzbWEgIT0gbnVsbCkgewotCQkJCQkvLyBncmF5IG91dCB0aGUgbWFya2VyIGFubm90YXRpb24KLQkJCQkJc21hLnNldEdyYXllZCh0cnVlKTsKLQkJCQl9Ci0JCQkJLy8gcmVtb3ZlIHRoZSB0ZW1wIG9uZQotCQkJCWFubm90YXRpb25Nb2RlbC5yZW1vdmVBbm5vdGF0aW9uKGFubm90YXRpb25zVG9SZW1vdmVbaV0pOwotCi0JCQl9Ci0JCX0KLQotCQlpZiAoREVCVUcpIHsKLQkJCVN0cmluZ0J1ZmZlciB0cmFjZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnNUb1JlbW92ZS5sZW5ndGg7IGkrKykKLQkJCQl0cmFjZVN0cmluZy5hcHBlbmQoIlxuICgtKSA6IiArIGFubm90YXRpb25zVG9SZW1vdmVbaV0gKyAiOlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJbdHJhY2UgcmVjb25jaWxlcl0gPiBSRU1PVkVEICgiICsgYW5ub3RhdGlvbnNUb1JlbW92ZS5sZW5ndGggKyAiKSBhbm5vdGF0aW9ucyBpbiBBYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneSA6IiArIHRyYWNlU3RyaW5nKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uIGdldENvcnJlc3BvbmRpbmdNYXJrZXJBbm5vdGF0aW9uKFRlbXBvcmFyeUFubm90YXRpb24gdGVtcEFubm90YXRpb24pIHsKLQotCQlJdGVyYXRvciBpdCA9IGdldE1hcmtlckFubm90YXRpb25zKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24gbWFya2VyQW5ub3RhdGlvbiA9IChTdHJ1Y3R1cmVkTWFya2VyQW5ub3RhdGlvbikgaXQubmV4dCgpOwotCQkJU3RyaW5nIG1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQltZXNzYWdlID0gKFN0cmluZykgbWFya2VyQW5ub3RhdGlvbi5nZXRNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQkvLyBpdCB3b3VsZCBiZSBuaWNlIHRvIGNoZWNrIGxpbmUgbnVtYmVyIGhlcmUuLi4KLQkJCWlmIChtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5lcXVhbHModGVtcEFubm90YXRpb24uZ2V0VGV4dCgpKSkKLQkJCQlyZXR1cm4gbWFya2VyQW5ub3RhdGlvbjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWxsQW5ub3RhdGlvbnMoKSB7Ci0JCXJlbW92ZUFubm90YXRpb25zKGdldEFsbEFubm90YXRpb25zVG9SZW1vdmUoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHVzZXIgbmVlZHMgdG8gbWFudWFsbHkgc2V0IHRoZSB2aWV3ZXIgaWYgdGhlIGRlZmF1bHQKLQkgKiBjb25zdHJ1Y3RvciB3YXMgdXNlZC4gCi0JICoKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyKFNvdXJjZVZpZXdlciB2aWV3ZXIpIHsKLQkJZlNvdXJjZVZpZXdlciA9IHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGRvY3VtZW50IGZvciB0aGlzIHN0cmF0ZWd5LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5I3NldERvY3VtZW50KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgewotCi0JCS8vIHJlbW92ZSBhbGwgb2xkIGFubm90YXRpb25zIHNpbmNlIGl0J3MgYSBuZXcgZG9jdW1lbnQKLQkJcmVtb3ZlQWxsQW5ub3RhdGlvbnMoKTsKLQotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJlbGVhc2UoKTsKLQotCQkvLyBpZiAoZ2V0Rmlyc3RTdGVwKCkgIT0gbnVsbCkKLQkJLy8gZ2V0Rmlyc3RTdGVwKCkuc2V0SW5wdXRNb2RlbChuZXcgRG9jdW1lbnRBZGFwdGVyKGRvY3VtZW50KSk7Ci0KLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5RXh0ZW5zaW9uI3NldFByb2dyZXNzTW9uaXRvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGZQcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCQkvLyBpZiAoZkZpcnN0U3RlcCAhPSBudWxsKQotCQkvLyBmRmlyc3RTdGVwLnNldFByb2dyZXNzTW9uaXRvcihmUHJvZ3Jlc3NNb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgYW5ub3RhdGlvbiBpcyBhbHJlYWR5IHRoZXJlLCBpZiBpdCBpcywgbm8gbmVlZCB0byByZW1vdmUKLQkgKiBvciBhZGQgYWdhaW4uIFRoaXMgd2lsbCBhdm9pZCBhIGxvdCBvZiAiZmxpY2tlcmluZyIgYmVoYXZpb3IuCi0JICogCi0JICogQHBhcmFtIGFubm90YXRpb25zVG9SZW1vdmUKLQkgKiBAcGFyYW0gYW5ub3RhdGlvbnNUb0FkZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNtYXJ0UHJvY2VzcyhUZW1wb3JhcnlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnNUb1JlbW92ZSwgSVJlY29uY2lsZVJlc3VsdFtdIGFubm90YXRpb25zVG9BZGQpIHsKLS8vCQlDb21wYXJhdG9yIGNvbXAgPSBnZXRUZW1wb3JhcnlBbm5vdGF0aW9uQ29tcGFyYXRvcigpOwotLy8JCUxpc3Qgc29ydGVkUmVtb3ZhbHMgPSBBcnJheXMuYXNMaXN0KGFubm90YXRpb25zVG9SZW1vdmUpOwotLy8JCUNvbGxlY3Rpb25zLnNvcnQoc29ydGVkUmVtb3ZhbHMsIGNvbXApOwotLy8KLS8vCQlMaXN0IHNvcnRlZEFkZGl0aW9ucyA9IEFycmF5cy5hc0xpc3QoYW5ub3RhdGlvbnNUb0FkZCk7Ci0vLwkJQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRBZGRpdGlvbnMsIGNvbXApOwotLy8KLS8vCQlMaXN0IGZpbHRlcmVkUmVtb3ZhbHMgPSBuZXcgQXJyYXlMaXN0KHNvcnRlZFJlbW92YWxzKTsKLS8vCQlMaXN0IGZpbHRlcmVkQWRkaXRpb25zID0gbmV3IEFycmF5TGlzdChzb3J0ZWRBZGRpdGlvbnMpOwotLy8KLS8vCQlib29sZWFuIGlnbm9yZSA9IGZhbHNlOwotLy8JCWludCBsYXN0Rm91bmRBZGRlZCA9IDA7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3J0ZWRSZW1vdmFscy5zaXplKCk7IGkrKykgewotLy8JCQlUZW1wb3JhcnlBbm5vdGF0aW9uIHJlbW92YWwgPSAoVGVtcG9yYXJ5QW5ub3RhdGlvbikgc29ydGVkUmVtb3ZhbHMuZ2V0KGkpOwotLy8JCQlmb3IgKGludCBqID0gbGFzdEZvdW5kQWRkZWQ7IGogPCBzb3J0ZWRBZGRpdGlvbnMuc2l6ZSgpOyBqKyspIHsKLS8vCQkJCVRlbXBvcmFyeUFubm90YXRpb24gYWRkaXRpb24gPSAoVGVtcG9yYXJ5QW5ub3RhdGlvbikgc29ydGVkQWRkaXRpb25zLmdldChqKTsKLS8vCQkJCS8vIHF1aWNrIHBvc2l0aW9uIGNoZWNrIGhlcmUKLS8vCQkJCWlmIChyZW1vdmFsLmdldFBvc2l0aW9uKCkuZXF1YWxzKGFkZGl0aW9uLmdldFBvc2l0aW9uKCkpKSB7Ci0vLwkJCQkJbGFzdEZvdW5kQWRkZWQgPSBqOwotLy8JCQkJCS8vIHJlbW92ZSBwZXJmb3JtcyBUZW1wb3JhcnlBbm5vdGF0aW9uLmVxdWFscygpCi0vLwkJCQkJLy8gd2hpY2ggY2hlY2tzIHRleHQgYXMgd2VsbAotLy8JCQkJCWZpbHRlcmVkQWRkaXRpb25zLnJlbW92ZShhZGRpdGlvbik7Ci0vLwkJCQkJaWdub3JlID0gdHJ1ZTsKLS8vCQkJCQlpZiAoREVCVUcpCi0vLwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIH4gc21hcnQgcHJvY2VzcyBpZ25vcmluZzogIiArIHJlbW92YWwuZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQlicmVhazsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQlpZiAoaWdub3JlKSB7Ci0vLwkJCQlmaWx0ZXJlZFJlbW92YWxzLnJlbW92ZShyZW1vdmFsKTsKLS8vCQkJfQotLy8JCQlpZ25vcmUgPSBmYWxzZTsKLS8vCQl9Ci0JCWlmIChnZXRBbm5vdGF0aW9uTW9kZWwoKSBpbnN0YW5jZW9mIElBbm5vdGF0aW9uTW9kZWxFeHRlbnNpb24pIHsKLS8vCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbltdIGZpbHRlcmVkUmVtb3ZhbEFycmF5ID0gKFRlbXBvcmFyeUFubm90YXRpb25bXSkgZmlsdGVyZWRSZW1vdmFscy50b0FycmF5KG5ldyBUZW1wb3JhcnlBbm5vdGF0aW9uW2ZpbHRlcmVkUmVtb3ZhbHMuc2l6ZSgpXSk7Ci0vLwkJCS8vIGFwcGx5ICJncmV5Ii1uZXNzCi0vLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVyZWRSZW1vdmFsQXJyYXkubGVuZ3RoOyBpKyspIHsKLS8vCQkJCWlmIChpc0NhbmNlbGVkKCkpIHsKLS8vCQkJCQlpZiAoREVCVUcpCi0vLwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiW3RyYWNlIHJlY29uY2lsZXJdID4qKiByZXBsYWNpbmcgV0FTIENBTkNFTExFRCAqKiIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJcmV0dXJuOwotLy8JCQkJfQotLy8JCQkJU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24gc21hID0gZ2V0Q29ycmVzcG9uZGluZ01hcmtlckFubm90YXRpb24oZmlsdGVyZWRSZW1vdmFsQXJyYXlbaV0pOwotLy8JCQkJaWYgKHNtYSAhPSBudWxsKSB7Ci0vLwkJCQkJLy8gZ3JheSBvdXQgdGhlIG1hcmtlciBhbm5vdGF0aW9uCi0vLwkJCQkJc21hLnNldEdyYXllZCh0cnVlKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQlNYXAgYW5ub3RhdGlvbnNUb0FkZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVyZWRBZGRpdGlvbnMuc2l6ZSgpOyBpKyspIHsKLS8vCQkJCVRlbXBvcmFyeUFubm90YXRpb24gdGVtcG9yYXJ5QW5ub3RhdGlvbiA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSBmaWx0ZXJlZEFkZGl0aW9ucy5nZXQoaSk7Ci0vLwkJCQlhbm5vdGF0aW9uc1RvQWRkTWFwLnB1dCh0ZW1wb3JhcnlBbm5vdGF0aW9uLCB0ZW1wb3JhcnlBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkpOwotLy8JCQl9Ci0vLwkJCWlmIChpc0NhbmNlbGVkKCkpIHsKLS8vCQkJCWlmIChERUJVRykKLS8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlt0cmFjZSByZWNvbmNpbGVyXSA+KiogUFJPQ0VTUyAocmVwbGFjaW5nKSBXQVMgQ0FOQ0VMTEVEICoqIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCXJldHVybjsKLS8vCQkJfQotLy8JCQkvKgotLy8JCQkgKiBVc2luZyB0aGUgZXh0ZW5zaW9uIG1lYW5zIHdlIGNhbid0IGVuZm9yY2UgdGhlCi0vLwkJCSAqIEVMRU1FTlRfRVJST1JfTElNSVQgbGltaXQuCi0vLwkJCSAqLwotLy8JCQkoKElBbm5vdGF0aW9uTW9kZWxFeHRlbnNpb24pIGdldEFubm90YXRpb25Nb2RlbCgpKS5yZXBsYWNlQW5ub3RhdGlvbnMoZmlsdGVyZWRSZW1vdmFsQXJyYXksIGFubm90YXRpb25zVG9BZGRNYXApOwotCi0JCQlNYXAgYW5ub3RhdGlvbnNUb0FkZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zVG9BZGQubGVuZ3RoOyBpKyspIHsKLQkJCQlUZW1wb3JhcnlBbm5vdGF0aW9uIHRlbXBvcmFyeUFubm90YXRpb24gPSAoVGVtcG9yYXJ5QW5ub3RhdGlvbikgYW5ub3RhdGlvbnNUb0FkZFtpXTsKLQkJCQlhbm5vdGF0aW9uc1RvQWRkTWFwLnB1dCh0ZW1wb3JhcnlBbm5vdGF0aW9uLCB0ZW1wb3JhcnlBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkpOwotCQkJfQotCQkJaWYgKGlzQ2FuY2VsZWQoKSkgewotCQkJCWlmIChERUJVRykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJbdHJhY2UgcmVjb25jaWxlcl0gPioqIFBST0NFU1MgKHJlcGxhY2luZykgV0FTIENBTkNFTExFRCAqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJKChJQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uKSBnZXRBbm5vdGF0aW9uTW9kZWwoKSkucmVwbGFjZUFubm90YXRpb25zKGFubm90YXRpb25zVG9SZW1vdmUsIGFubm90YXRpb25zVG9BZGRNYXApOwotCQl9Ci0JCWVsc2UgewotLy8JCQlyZW1vdmVBbm5vdGF0aW9ucygoVGVtcG9yYXJ5QW5ub3RhdGlvbltdKSBmaWx0ZXJlZFJlbW92YWxzLnRvQXJyYXkobmV3IFRlbXBvcmFyeUFubm90YXRpb25bZmlsdGVyZWRSZW1vdmFscy5zaXplKCldKSk7Ci0vLwkJCXByb2Nlc3MoKElSZWNvbmNpbGVSZXN1bHRbXSkgZmlsdGVyZWRBZGRpdGlvbnMudG9BcnJheShuZXcgSVJlY29uY2lsZVJlc3VsdFtmaWx0ZXJlZEFkZGl0aW9ucy5zaXplKCldKSk7Ci0JCQlyZW1vdmVBbm5vdGF0aW9ucyhhbm5vdGF0aW9uc1RvUmVtb3ZlKTsKLQkJCXByb2Nlc3MoYW5ub3RhdGlvbnNUb0FkZCk7Ci0JCX0KLQl9Ci0KLS8vCXByaXZhdGUgQ29tcGFyYXRvciBnZXRUZW1wb3JhcnlBbm5vdGF0aW9uQ29tcGFyYXRvcigpIHsKLS8vCQlpZiAoZkNvbXBhcmF0b3IgPT0gbnVsbCkgewotLy8JCQlmQ29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotLy8JCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgewotLy8JCQkJCVRlbXBvcmFyeUFubm90YXRpb24gdGExID0gKFRlbXBvcmFyeUFubm90YXRpb24pIGFyZzA7Ci0vLwkJCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiB0YTIgPSAoVGVtcG9yYXJ5QW5ub3RhdGlvbikgYXJnMTsKLS8vCQkJCQlpbnQgcmVzdWx0ID0gdGExLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCkgLSB0YTIuZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKTsKLS8vCQkJCQlpZihyZXN1bHQgIT0gMCkKLS8vCQkJCQkJcmV0dXJuIHJlc3VsdDsKLS8vCQkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKHRhMS5nZXRUZXh0KCksIHRhMi5nZXRUZXh0KCkpOwotLy8JCQkJfQotLy8JCQl9OwotLy8JCX0KLS8vCQlyZXR1cm4gZkNvbXBhcmF0b3I7Ci0vLwl9Ci0KLQlwdWJsaWMgSGFzaFNldCBnZXRNYXJrZXJBbm5vdGF0aW9ucygpIHsKLQkJaWYgKGZNYXJrZXJBbm5vdGF0aW9ucyA9PSBudWxsKQotCQkJZk1hcmtlckFubm90YXRpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJcmV0dXJuIGZNYXJrZXJBbm5vdGF0aW9uczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0RpcnR5UmVnaW9uUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0RpcnR5UmVnaW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDlmZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9EaXJ0eVJlZ2lvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLQotLyoqCi0gKiBUaGlzIEpvYiBob2xkcyBhIHF1ZXVlIG9mIHVwZGF0ZXMgZnJvbSB0aGUgZWRpdG9yIChEaXJ0eVJlZ2lvbnMpIHRvCi0gKiBwcm9jZXNzLiBXaGVuIGEgbmV3IHJlcXVlc3QgY29tZXMgaW4sIHRoZSBjdXJyZW50IHJ1biBpcyBjYW5jZWxlZCwgdGhlIG5ldwotICogcmVxdWVzdCBpcyBhZGRlZCB0byB0aGUgcXVldWUsIHRoZW4gdGhlIGpvYiBpcyByZS1zY2hlZHVsZWQuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBEaXJ0eVJlZ2lvblByb2Nlc3NvciBleHRlbmRzIEpvYiBpbXBsZW1lbnRzIElSZWNvbmNpbGVyLCBJUmVjb25jaWxlckV4dGVuc2lvbiwgSUNvbmZpZ3VyYWJsZVJlY29uY2lsZXIgewotCWNsYXNzIERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQkvKgotCQkJICogaWYgaW4gcmV3cml0ZSBzZXNzaW9uIGFuZCBhbHJlYWR5IGdvaW5nIHRvIHJlcHJvY2VzcyBlbnRpcmUKLQkJCSAqIGRvY3VtZW50IGFmdGVyIHJld3JpdGUgc2Vzc2lvbiwgZG8gbm90aGluZwotCQkJICovCi0JCQlpZiAoaXNJblJld3JpdGVTZXNzaW9uKCkgJiYgZlJlcHJvY2Vzc0FmdGVyUmV3cml0ZSkKLQkJCQlyZXR1cm47Ci0JCQkvLyBzYXZlIHBhcnRpdGlvbiB0eXBlICh0byBzZWUgaWYgaXQgY2hhbmdlcyBpbiBkb2N1bWVudENoYW5nZWQoKSkKLQkJCWZMYXN0UGFydGl0aW9ucyA9IGdldFBhcnRpdGlvblJlZ2lvbnMoZXZlbnQuZ2V0T2Zmc2V0KCksIGV2ZW50LmdldExlbmd0aCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQkvKgotCQkJICogaWYgaW4gcmV3cml0ZSBzZXNzaW9uIGFuZCBhbHJlYWR5IGdvaW5nIHRvIHJlcHJvY2VzcyBlbnRpcmUKLQkJCSAqIGRvY3VtZW50IGFmdGVyIHJld3JpdGUgc2Vzc2lvbiwgZG8gbm90aGluZwotCQkJICovCi0JCQlpZiAoaXNJblJld3JpdGVTZXNzaW9uKCkgJiYgZlJlcHJvY2Vzc0FmdGVyUmV3cml0ZSkKLQkJCQlyZXR1cm47Ci0KLQkJCWlmIChwYXJ0aXRpb25zQ2hhbmdlZChldmVudCkpIHsKLQkJCQkvLyBwYV9UT0RPCi0JCQkJLy8gdGhpcyBpcyBhIHNpbXBsZSB3YXkgdG8gZW5zdXJlIG9sZAotCQkJCS8vIGFubm90YXRpb25zIGFyZSByZW1vdmVkIHdoZW4gcGFydGl0aW9uIGNoYW5nZXMKLQotCQkJCS8vIGl0IG1pZ2h0IGJlIGEgcGVyZm9ybWFuY2UgaGl0IHRob3VnaAotCQkJCXNldEVudGlyZURvY3VtZW50RGlydHkoZ2V0RG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKgotCQkJCSAqIE5vdGUgdGhhdCBjcmVhdGluZyBEaXJ0eVJlZ2lvbnMgKm5vdyogbWVhbnMgdGhhdCB0aGUgd3JvbmcKLQkJCQkgKiB0ZXh0IG1heSBiZSBpbmNsdWRlZAotCQkJCSAqLwotCQkJCURpcnR5UmVnaW9uIGRyID0gbnVsbDsKLQkJCQlpZiAoZXZlbnQuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCQkvKgotCQkJCQkgKiBJdCdzIGFuIGluc2VydC0tIHdlIHVzZSB0ZXh0IGxlbmd0aCB0aG91Z2ggc28gdGhhdCB0aGUKLQkJCQkJICogbmV3IHJlZ2lvbiBnZXRzIHZhbGlkYXRlZC4uLgotCQkJCQkgKi8KLQkJCQkJZHIgPSBjcmVhdGVEaXJ0eVJlZ2lvbihldmVudC5nZXRPZmZzZXQoKSwgMCwgRGlydHlSZWdpb24uSU5TRVJUKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmICgiIi5lcXVhbHMoZXZlbnQuZ2V0VGV4dCgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBpdCdzIGEgZGVsZXRlCi0JCQkJCQlkciA9IGNyZWF0ZURpcnR5UmVnaW9uKGV2ZW50LmdldE9mZnNldCgpLCBldmVudC5nZXRMZW5ndGgoKSwgRGlydHlSZWdpb24uUkVNT1ZFKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGl0J3MgYSByZXBsYWNlCi0JCQkJCQlkciA9IGNyZWF0ZURpcnR5UmVnaW9uKGV2ZW50LmdldE9mZnNldCgpLCBldmVudC5nZXRMZW5ndGgoKSwgRGlydHlSZWdpb24uSU5TRVJUKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoaXNJblJld3JpdGVTZXNzaW9uKCkpIHsKLQkJCQkJLyoKLQkJCQkJICogd2hpbGUgaW4gcmV3cml0ZSBzZXNzaW9uLCBmb3VuZCBhIGRpcnR5IHJlZ2lvbiwgc28gZmxhZwotCQkJCQkgKiB0aGF0IGVudGlyZSBkb2N1bWVudCBuZWVkcyB0byBiZSByZXByb2Nlc2VkIGFmdGVyCi0JCQkJCSAqIHJld3JpdGUgc2Vzc2lvbgotCQkJCQkgKi8KLQkJCQkJaWYgKCFmUmVwcm9jZXNzQWZ0ZXJSZXdyaXRlICYmIChkciAhPSBudWxsKSkgewotCQkJCQkJZlJlcHJvY2Vzc0FmdGVyUmV3cml0ZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXByb2Nlc3NEaXJ0eVJlZ2lvbihkcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIENoZWNrcyBwcmV2aW91cyBwYXJ0aXRpb25zIGZyb20gdGhlIHNwYW4gb2YgdGhlIGV2ZW50IHcvIHRoZSBuZXcKLQkJICogcGFydGl0aW9ucyBmcm9tIHRoZSBzcGFuIG9mIHRoZSBldmVudC4gSWYgcGFydGl0aW9ucyBjaGFuZ2VkLAotCQkgKiByZXR1cm4gdHJ1ZSwgZWxzZSByZXR1cm4gZmFsc2UKLQkJICogCi0JCSAqIEBwYXJhbSBldmVudAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gcGFydGl0aW9uc0NoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCQlpbnQgbGVuZ3RoID0gZXZlbnQuZ2V0TGVuZ3RoKCk7Ci0KLQkJCWlmIChldmVudC5nZXRMZW5ndGgoKSA9PSAwICYmIGV2ZW50LmdldFRleHQoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkvLyBpdCdzIGFuIGluc2VydCwgd2Ugd2FudCBwYXJ0aXRpb25zIG9mIHRoZSBuZXcgdGV4dAotCQkJCWxlbmd0aCA9IGV2ZW50LmdldFRleHQoKS5sZW5ndGgoKTsKLQkJCX0KLQotCQkJSVR5cGVkUmVnaW9uW10gbmV3UGFydGl0aW9ucyA9IGdldFBhcnRpdGlvblJlZ2lvbnMoZXZlbnQuZ2V0T2Zmc2V0KCksIGxlbmd0aCk7Ci0JCQlpZiAoZkxhc3RQYXJ0aXRpb25zICE9IG51bGwpIHsKLQkJCQlpZiAoZkxhc3RQYXJ0aXRpb25zLmxlbmd0aCAhPSBuZXdQYXJ0aXRpb25zLmxlbmd0aCkgewotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZkxhc3RQYXJ0aXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoIWZMYXN0UGFydGl0aW9uc1tpXS5nZXRUeXBlKCkuZXF1YWxzKG5ld1BhcnRpdGlvbnNbaV0uZ2V0VHlwZSgpKSkgewotCQkJCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNoYW5nZWQ7Ci0JCX0KLQotCi0JfQotCi0JLyoqCi0JICogUmVjb25jaWxlcyB0aGUgZW50aXJlIGRvY3VtZW50IHdoZW4gdGhlIGRvY3VtZW50IGluIHRoZSB2aWV3ZXIgaXMKLQkgKiBjaGFuZ2VkLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgZG9jdW1lbnQgaXMgaW5pdGlhbGx5IG9wZW5lZCwgYXMgd2VsbCBhcwotCSAqIGFmdGVyIGEgc2F2ZS1hcy4KLQkgKiAKLQkgKiBBbHNvIHNlZSBwcm9jZXNzUG9zdE1vZGVsRXZlbnQoLi4uKSBmb3Igc2ltaWxhciBiZWhhdmlvciB3aGVuIGRvY3VtZW50Ci0JICogZm9yIHRoZSBtb2RlbCBpcyBjaGFuZ2VkLgotCSAqLwotCWNsYXNzIFRleHRJbnB1dExpc3RlbmVyIGltcGxlbWVudHMgSVRleHRJbnB1dExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCQloYW5kbGVJbnB1dERvY3VtZW50Q2hhbmdlZChvbGRJbnB1dCwgbmV3SW5wdXQpOwotCQl9Ci0JfQotCi0JY2xhc3MgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lciB7Ci0JCWxvbmcgdGltZTAgPSAwOwotCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50UmV3cml0ZVNlc3Npb25DaGFuZ2VkKERvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudCBldmVudCkgewotCQkJYm9vbGVhbiBvbGRWYWx1ZSA9IGZJblJld3JpdGVTZXNzaW9uOwotCQkJZkluUmV3cml0ZVNlc3Npb24gPSBldmVudCAhPSBudWxsICYmIGV2ZW50LmdldENoYW5nZVR5cGUoKS5lcXVhbHMoRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50LlNFU1NJT05fU1RBUlQpOwotCi0JCQlpZiAoZXZlbnQuZ2V0Q2hhbmdlVHlwZSgpLmVxdWFscyhEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQuU0VTU0lPTl9TVEFSVCkpIHsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl9Ci0JCQkJLy8gYnVnIDIzNTQ0NiAtIHNvdXJjZSB2YWxpZGF0aW9uIGFubm90YXRpb25zIGxvc3QgYWZ0ZXIgcmV3cml0ZSBzZXNzaW9uCi0JCQkJaWYgKCFnZXREaXJ0eVJlZ2lvblF1ZXVlKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCWZsdXNoRGlydHlSZWdpb25RdWV1ZSgpOwotCQkJCQlmUmVwcm9jZXNzQWZ0ZXJSZXdyaXRlID0gdHJ1ZTsJCi0JCQkJfSBlbHNlIHsKLQkJCQkJZlJlcHJvY2Vzc0FmdGVyUmV3cml0ZSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGV2ZW50LmdldENoYW5nZVR5cGUoKS5lcXVhbHMoRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50LlNFU1NJT05fU1RPUCkpIHsKLQkJCQlpZiAoZkluUmV3cml0ZVNlc3Npb24gXiBvbGRWYWx1ZSAmJiBmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJSZXdyaXRlIHNlc3Npb24gbGFzdGVkICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsKLQkJCQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGZSZXByb2Nlc3NBZnRlclJld3JpdGUpIHsKLQkJCQkJCURpcnR5UmVnaW9uIGVudGlyZURvY3VtZW50ID0gY3JlYXRlRGlydHlSZWdpb24oMCwgZkRvY3VtZW50LmdldExlbmd0aCgpLCBEaXJ0eVJlZ2lvbi5JTlNFUlQpOwotCQkJCQkJcHJvY2Vzc0RpcnR5UmVnaW9uKGVudGlyZURvY3VtZW50KTsKLQkJCQkJfQotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJGdWxsIGRvY3VtZW50IHJlcHJvY2VzcyB0b29rICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsKLQkJCQkJfQotCQkJCQlmUmVwcm9jZXNzQWZ0ZXJSZXdyaXRlID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqIGRlYnVnIGZsYWcgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVUERBVEVfREVMQVkgPSA1MDA7Ci0KLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyam9iIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgbG9uZyBmRGVsYXk7Ci0KLQotCS8qKiBsb2NhbCBxdWV1ZSBvZiBkaXJ0eSByZWdpb25zIChjcmVhdGVkIGhlcmUpIHRvIGJlIHJlY29uY2lsZWQgKi8KLQlwcml2YXRlIExpc3QgZkRpcnR5UmVnaW9uUXVldWUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3QoKSk7Ci0KLQkvKiogZG9jdW1lbnQgdGhhdCB0aGlzIHJlY29uY2lsZXIgd29ya3Mgb24gKi8KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCi0JcHJpdmF0ZSBJRG9jdW1lbnRMaXN0ZW5lciBmRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBEb2N1bWVudExpc3RlbmVyKCk7Ci0JcHJpdmF0ZSBJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyIGZEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyKCk7Ci0KLQkvKioKLQkgKiBzZXQgdHJ1ZSBhZnRlciBmaXJzdCBpbnN0YWxsIHRvIHByZXZlbnQgZHVwbGljYXRlIHdvcmsgZG9uZSBpbiB0aGUKLQkgKiBpbnN0YWxsIG1ldGhvZCAoc2luY2UgaW5zdGFsbCBnZXRzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcykKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZklzSW5zdGFsbGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBzbyB3ZSBjYW4gdGVsbCBpZiBhIHBhcnRpdGlvbiBjaGFuZ2VkIGFmdGVyIHRoZSBsYXN0IGVkaXQKLQkgKi8KLQlJVHlwZWRSZWdpb25bXSBmTGFzdFBhcnRpdGlvbnM7Ci0KLQlMaXN0IGZOb25JbmNyZW1lbnRhbFN0cmF0ZWdpZXNBbHJlYWR5UHJvY2Vzc2VkID0gbmV3IEFycmF5TGlzdCgxKTsKLQotCS8qKgotCSAqIFRoZSBwYXJ0aXRpb25pbmcgdGhpcyByZWNvbmNpbGVyIHVzZXMuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZlBhcnRpdGlvbmluZzsKLQotCU1hcCBmUmVjb25jaWxpbmdTdHJhdGVnaWVzID0gbnVsbDsKLQotCS8qKiBmb3IgaW5pdGlhbCByZWNvbmNpbGUgd2hlbiBkb2N1bWVudCBpcyBvcGVuZWQgKi8KLQlwcml2YXRlIFRleHRJbnB1dExpc3RlbmVyIGZUZXh0SW5wdXRMaXN0ZW5lciA9IG51bGw7Ci0JLyoqIHRoZSB0ZXh0IHZpZXdlciAqLwotCXByaXZhdGUgSVRleHRWaWV3ZXIgZlZpZXdlcjsKLQlib29sZWFuIGZJblJld3JpdGVTZXNzaW9uID0gZmFsc2U7Ci0JLyoqCi0JICogdHJ1ZSBpZiBlbnRpcmUgZG9jdW1lbnQgbmVlZHMgdG8gYmUgcmVwcm9jZXNzZWQgYWZ0ZXIgcmV3cml0ZSBzZXNzaW9uCi0JICovCi0JYm9vbGVhbiBmUmVwcm9jZXNzQWZ0ZXJSZXdyaXRlID0gZmFsc2U7Ci0KLQkvKiogVGhlIGpvYiBzaG91bGQgYmUgcmVzZXQgYmVjYXVzZSBvZiBkb2N1bWVudCBjaGFuZ2VzICovCi0JcHJpdmF0ZSBib29sZWFuIGZSZXNldCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNDYW5jZWxlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSGFzUmVjb25jaWxlZCA9IGZhbHNlOwotCXByaXZhdGUgT2JqZWN0IExPQ0sgPSBuZXcgT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IFN0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3IKLQkgKi8KLQlwdWJsaWMgRGlydHlSZWdpb25Qcm9jZXNzb3IoKSB7Ci0JCS8vIGluaXQgam9iIHN0dWZmCi0JCXN1cGVyKFNTRVVJTWVzc2FnZXMucHJvY19kaXJ0eV9yZWdpb25zXzApOyAvLyROT04tTkxTLTEkCi0JCXNldFByaW9yaXR5KEpvYi5MT05HKTsKLQkJc2V0U3lzdGVtKHRydWUpOwotCi0JCS8vIGluaXQgcmVjb25jaWxlciBzdHVmZgotCQlzZXREZWxheShVUERBVEVfREVMQVkpOwotCQlmUmVjb25jaWxpbmdTdHJhdGVnaWVzID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiByZXNvdXJjZSB0byB0aGUgc2V0IG9mIHJlc291cmNlcyB0aGF0IG5lZWQgcmVmcmVzaGluZy4KLQkgKiBTeW5jaHJvbml6ZWQgaW4gb3JkZXIgdG8gcHJvdGVjdCB0aGUgY29sbGVjdGlvbiBkdXJpbmcgYWRkLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkUmVxdWVzdChEaXJ0eVJlZ2lvbiBuZXdEaXJ0eVJlZ2lvbikgewotCQkvLyBOT1RFOiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYSBsb3Qgc28gbWFrZSBzdXJlIGl0J3MgZmFzdAotCQlMaXN0IGRpcnR5UmVnaW9uUXVldWUgPSBnZXREaXJ0eVJlZ2lvblF1ZXVlKCk7Ci0JCXN5bmNocm9uaXplZCAoZGlydHlSZWdpb25RdWV1ZSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGRpcnR5UmVnaW9uUXVldWUuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCS8vIGdvIHRocm91Z2ggbGlzdCBvZiBleGlzdGluZyBkaXJ0eSByZWdpb25zIGFuZCBjaGVjayBpZiBhbnkKLQkJCQkvLyBkaXJ0eSByZWdpb25zIG5lZWQgdG8gYmUgZGlzY2FyZGVkCi0JCQkJRGlydHlSZWdpb24gY3VycmVudEV4aXN0aW5nID0gKERpcnR5UmVnaW9uKSBpdC5uZXh0KCk7Ci0JCQkJRGlydHlSZWdpb24gb3V0ZXIgPSBnZXRPdXRlclJlZ2lvbihjdXJyZW50RXhpc3RpbmcsIG5ld0RpcnR5UmVnaW9uKTsKLQkJCQkvLyBpZiB3ZSBhbHJlYWR5IGhhdmUgYSByZXF1ZXN0IHdoaWNoIGNvbnRhaW5zIHRoZSBuZXcgcmVxdWVzdCwKLQkJCQkvLyBkaXNjYXJkIHRoZSBuZXcgcmVxdWVzdAotCQkJCWlmIChvdXRlciA9PSBjdXJyZW50RXhpc3RpbmcpCi0JCQkJCXJldHVybjsKLQkJCQkvLyBpZiBuZXcgcmVxdWVzdCBjb250YWlucyBhbnkgZXhpc3RpbmcgcmVxdWVzdHMsCi0JCQkJLy8gcmVtb3ZlIHRob3NlCi0JCQkJaWYgKG91dGVyID09IG5ld0RpcnR5UmVnaW9uKQotCQkJCQlpdC5yZW1vdmUoKTsKLQkJCX0KLQkJCWRpcnR5UmVnaW9uUXVldWUuYWRkKG5ld0RpcnR5UmVnaW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHN1YmNsYXNzZXMgdGhhdCBwcm9jZXNzaW5nIG9mIG11bHRpcGxlIGRpcnR5IHJlZ2lvbnMgaGFzIGJlZ3VuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmVnaW5Qcm9jZXNzaW5nKCkgewotCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGlydHlSZWdpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElUeXBlZFJlZ2lvbltdIGNvbXB1dGVQYXJ0aXRpb25pbmcoRGlydHlSZWdpb24gZGlydHlSZWdpb24pIHsKLQkJaW50IGRyT2Zmc2V0ID0gZGlydHlSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCWludCBkckxlbmd0aCA9IGRpcnR5UmVnaW9uLmdldExlbmd0aCgpOwotCi0JCXJldHVybiBjb21wdXRlUGFydGl0aW9uaW5nKGRyT2Zmc2V0LCBkckxlbmd0aCk7Ci0JfQotCi0JcHJvdGVjdGVkIElUeXBlZFJlZ2lvbltdIGNvbXB1dGVQYXJ0aXRpb25pbmcoaW50IGRyT2Zmc2V0LCBpbnQgZHJMZW5ndGgpIHsKLQkJSVR5cGVkUmVnaW9uW10gdHIgPSBuZXcgSVR5cGVkUmVnaW9uWzBdOwotCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvYyAhPSBudWxsKXsKLQkJCWludCBkb2NMZW5ndGggPSBkb2MuZ2V0TGVuZ3RoKCk7Ci0JCi0JCQlpZiAoZHJPZmZzZXQgPiBkb2NMZW5ndGgpIHsKLQkJCQlkck9mZnNldCA9IGRvY0xlbmd0aDsKLQkJCQlkckxlbmd0aCA9IDA7Ci0JCQl9Ci0JCQllbHNlIGlmIChkck9mZnNldCArIGRyTGVuZ3RoID4gZG9jTGVuZ3RoKSB7Ci0JCQkJZHJMZW5ndGggPSBkb2NMZW5ndGggLSBkck9mZnNldDsKLQkJCX0KLQkKLQkJCXRyeSB7Ci0JCQkJLy8gZGlydHkgcmVnaW9uIG1heSBzcGFuIG11bHRpcGxlIHBhcnRpdGlvbnMKLQkJCQl0ciA9IFRleHRVdGlsaXRpZXMuY29tcHV0ZVBhcnRpdGlvbmluZyhkb2MsIGdldERvY3VtZW50UGFydGl0aW9uaW5nKCksIGRyT2Zmc2V0LCBkckxlbmd0aCwgdHJ1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBpbmZvID0gImRyOiBbIiArIGRyT2Zmc2V0ICsgIjoiICsgZHJMZW5ndGggKyAiXSBkb2M6IFsiICsgZG9jTGVuZ3RoICsgIl0gIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaW5mbywgZSk7Ci0JCQkJdHIgPSBuZXcgSVR5cGVkUmVnaW9uWzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cjsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGRldGVybWluZSBpZiBvbmUgZGlydHkgcmVnaW9uIGNvbnRhaW5zIHRoZSBvdGhlciBhbmQgaWYgc28sCi0JICogd2hpY2ggaXMgdGhlIG9uZSB0aGF0IGNvbnRhaW5zIGl0LgotCSAqIAotCSAqIEBwYXJhbSByb290Ci0JICogQHBhcmFtIHBvc3NpYmxlCi0JICogQHJldHVybiB0aGUgb3V0ZXIgZGlydHkgcmVnaW9uIGlmIGl0IGNvbnRhaW5zIHRoZSBvdGhlciBkaXJ0eSByZWdpb24sCi0JICogICAgICAgICBudWxsIG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBEaXJ0eVJlZ2lvbiBnZXRPdXRlclJlZ2lvbihEaXJ0eVJlZ2lvbiByb290LCBEaXJ0eVJlZ2lvbiBwb3NzaWJsZSkgewotCQlEaXJ0eVJlZ2lvbiBvdXRlciA9IG51bGw7Ci0JCWlmIChpc0NvbnRhaW5lZChyb290LCBwb3NzaWJsZSkpCi0JCQlvdXRlciA9IHJvb3Q7Ci0JCWVsc2UgaWYgKGlzQ29udGFpbmVkKHBvc3NpYmxlLCByb290KSkKLQkJCW91dGVyID0gcG9zc2libGU7Ci0JCXJldHVybiBvdXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGRldGVybWluZSBvZiBhICJwb3NzaWJsZSIgZGlydHkgcmVnaW9uIGNhbiBiZSBkaXNjYXJkZWQgaW4KLQkgKiBmYXZvciBvZiB1c2luZyBqdXN0IHRoZSAicm9vdCIgZGlydHkgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gaWYgdGhlIHJvb3QgZGlydHkgcmVnaW9uIGNvbnRhaW5zIHBvc3NpYmxlLCByZXR1cm4gdHJ1ZSwKLQkgKiAgICAgICAgIG90aGVyd2lzZSByZXR1cm4gZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDb250YWluZWQoRGlydHlSZWdpb24gcm9vdCwgRGlydHlSZWdpb24gcG9zc2libGUpIHsKLQkJaW50IHJvb3RTdGFydCA9IHJvb3QuZ2V0T2Zmc2V0KCk7Ci0JCWludCByb290RW5kID0gcm9vdFN0YXJ0ICsgcm9vdC5nZXRMZW5ndGgoKTsKLQkJaW50IHBvc3NTdGFydCA9IHBvc3NpYmxlLmdldE9mZnNldCgpOwotCQlpbnQgcG9zc0VuZCA9IHBvc3NTdGFydCArIHBvc3NpYmxlLmdldExlbmd0aCgpOwotCQlpZiAocm9vdFN0YXJ0IDw9IHBvc3NTdGFydCAmJiByb290RW5kID49IHBvc3NFbmQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBEaXJ0eVJlZ2lvbiBjcmVhdGVEaXJ0eVJlZ2lvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQlEaXJ0eVJlZ2lvbiBkdXJ0eSA9IG51bGw7Ci0JCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCi0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJLy8gc2FmZXR5IGZvciBCTEUKLQkJCWludCBkb2NMZW4gPSBkb2MuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAob2Zmc2V0ID4gZG9jTGVuKSB7Ci0JCQkJb2Zmc2V0ID0gZG9jTGVuOwotCQkJCWxlbmd0aCA9IDA7Ci0JCQl9Ci0JCQllbHNlIGlmIChvZmZzZXQgKyBsZW5ndGggPj0gZG9jTGVuKQotCQkJCWxlbmd0aCA9IGRvY0xlbiAtIG9mZnNldDsKLQkJCXRyeSB7Ci0JCQkJZHVydHkgPSBuZXcgRGlydHlSZWdpb24ob2Zmc2V0LCBsZW5ndGgsIHR5cGUsIGRvYy5nZXQob2Zmc2V0LCBsZW5ndGgpKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIGluZm8gPSAiZHI6IFsiICsgb2Zmc2V0ICsgIjoiICsgbGVuZ3RoICsgIl0gZG9jOiBbIiArIGRvY0xlbiArICJdICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGluZm8sIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkdXJ0eTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlydHlSZWdpb24gY3JlYXRlRGlydHlSZWdpb24oSVR5cGVkUmVnaW9uIHRyLCBTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gY3JlYXRlRGlydHlSZWdpb24odHIuZ2V0T2Zmc2V0KCksIHRyLmdldExlbmd0aCgpLCB0eXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmbHVzaERpcnR5UmVnaW9uUXVldWUoKSB7Ci0JCWZEaXJ0eVJlZ2lvblF1ZXVlLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgc3ViY2xhc3NlcyB0aGF0IHByb2Nlc3Npbmcgb2YgbXVsdGlwbGUgZGlydHkgcmVnaW9ucyBoYXMKLQkgKiBlbmRlZCwgZm9yIG5vdwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZFByb2Nlc3NpbmcoKSB7Ci0JCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAotCX0KLQotCS8qKgotCSAqIERlbGF5IGJldHdlZW4gcHJvY2Vzc2luZyBvZiBEaXJ0eVJlZ2lvbnMuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWxvbmcgZ2V0RGVsYXkoKSB7Ci0JCXJldHVybiBmRGVsYXk7Ci0JfQotCi0JTGlzdCBnZXREaXJ0eVJlZ2lvblF1ZXVlKCkgewotCQlyZXR1cm4gZkRpcnR5UmVnaW9uUXVldWU7Ci0JfQotCi0JLyoqCi0JICogVGhlIElEb2N1bWVudCBvbiB3aGljaCB0aGlzIHJlY29uY2lsZXIgb3BlcmF0ZXMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50UGFydGl0aW9uaW5nKCkgewotCQlpZiAoZlBhcnRpdGlvbmluZyA9PSBudWxsKQotCQkJcmV0dXJuIElEb2N1bWVudEV4dGVuc2lvbjMuREVGQVVMVF9QQVJUSVRJT05JTkc7Ci0JCXJldHVybiBmUGFydGl0aW9uaW5nOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRQYXJ0aXRpb25zKGludCBkck9mZnNldCwgaW50IGRyTGVuZ3RoKSB7Ci0KLQkJSVR5cGVkUmVnaW9uW10gcmVnaW9ucyA9IG5ldyBJVHlwZWRSZWdpb25bMF07Ci0JCWludCBkb2NMZW5ndGggPSBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCi0JCWlmIChkck9mZnNldCA+IGRvY0xlbmd0aCkgewotCQkJZHJPZmZzZXQgPSBkb2NMZW5ndGg7Ci0JCQlkckxlbmd0aCA9IDA7Ci0JCX0KLQkJZWxzZSBpZiAoZHJPZmZzZXQgKyBkckxlbmd0aCA+IGRvY0xlbmd0aCkgewotCQkJZHJMZW5ndGggPSBkb2NMZW5ndGggLSBkck9mZnNldDsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZWdpb25zID0gVGV4dFV0aWxpdGllcy5jb21wdXRlUGFydGl0aW9uaW5nKGdldERvY3VtZW50KCksIGdldERvY3VtZW50UGFydGl0aW9uaW5nKCksIGRyT2Zmc2V0LCBkckxlbmd0aCwgdHJ1ZSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQlyZWdpb25zID0gbmV3IElUeXBlZFJlZ2lvblswXTsKLQkJfQotCQlTdHJpbmdbXSBwYXJ0aXRpb25zID0gbmV3IFN0cmluZ1tyZWdpb25zLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykKLQkJCXBhcnRpdGlvbnNbaV0gPSByZWdpb25zW2ldLmdldFR5cGUoKTsKLQkJcmV0dXJuIHBhcnRpdGlvbnM7Ci0JfQotCi0JSVR5cGVkUmVnaW9uW10gZ2V0UGFydGl0aW9uUmVnaW9ucyhpbnQgZHJPZmZzZXQsIGludCBkckxlbmd0aCkgewotCQlJVHlwZWRSZWdpb25bXSByZWdpb25zID0gbmV3IElUeXBlZFJlZ2lvblswXTsKLQkJaW50IGRvY0xlbmd0aCA9IGdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0KLQkJaWYgKGRyT2Zmc2V0ID4gZG9jTGVuZ3RoKSB7Ci0JCQlkck9mZnNldCA9IGRvY0xlbmd0aDsKLQkJCWRyTGVuZ3RoID0gMDsKLQkJfQotCQllbHNlIGlmIChkck9mZnNldCArIGRyTGVuZ3RoID4gZG9jTGVuZ3RoKSB7Ci0JCQlkckxlbmd0aCA9IGRvY0xlbmd0aCAtIGRyT2Zmc2V0OwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJlZ2lvbnMgPSBUZXh0VXRpbGl0aWVzLmNvbXB1dGVQYXJ0aXRpb25pbmcoZ2V0RG9jdW1lbnQoKSwgZ2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoKSwgZHJPZmZzZXQsIGRyTGVuZ3RoLCB0cnVlKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXJlZ2lvbnMgPSBuZXcgSVR5cGVkUmVnaW9uWzBdOwotCQl9Ci0JCXJldHVybiByZWdpb25zOwotCX0KLQkJCi0JCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlY29uY2lsaW5nIHN0cmF0ZWd5IHJlZ2lzdGVyZWQgd2l0aCB0aGUgcmVjb25jaWxlciBmb3IgdGhlCi0JICogc3BlY2lmaWVkIHBhcnRpdGlvbiB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICogICAgICAgICAgICB0aGUgcGFydGl0aW9uIHR5cGUgZm9yIHdoaWNoIHRvIGRldGVybWluZSB0aGUgcmVjb25jaWxpbmcKLQkgKiAgICAgICAgICAgIHN0cmF0ZWd5Ci0JICogCi0JICogQHJldHVybiB0aGUgcmVjb25jaWxpbmcgc3RyYXRlZ3kgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIHBhcnRpdGlvbgotCSAqICAgICAgICAgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3VjaCBzdHJhdGVneQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVyI2dldFJlY29uY2lsaW5nU3RyYXRlZ3koamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVJlY29uY2lsaW5nU3RyYXRlZ3kgZ2V0UmVjb25jaWxpbmdTdHJhdGVneShTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSVJlY29uY2lsaW5nU3RyYXRlZ3kpIGZSZWNvbmNpbGluZ1N0cmF0ZWdpZXMuZ2V0KHBhcnRpdGlvblR5cGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFsc28gc3luY2hyb25pemVkIGJlY2F1c2UgaXQgYWNjZXNzZXMgdGhlIGZSZXF1ZXN0cyBxdWV1ZQotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGN1cnJlbnRseSByZXF1ZXN0ZWQgTm9kZXMgdG8gcmVmcmVzaAotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIERpcnR5UmVnaW9uW10gZ2V0UmVxdWVzdHMoKSB7Ci0JCURpcnR5UmVnaW9uW10gdG9SZWZyZXNoID0gKERpcnR5UmVnaW9uW10pIGZEaXJ0eVJlZ2lvblF1ZXVlLnRvQXJyYXkobmV3IERpcnR5UmVnaW9uW2ZEaXJ0eVJlZ2lvblF1ZXVlLnNpemUoKV0pOwotCQlmbHVzaERpcnR5UmVnaW9uUXVldWUoKTsKLQkJcmV0dXJuIHRvUmVmcmVzaDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IHZpZXdlciB0aGlzIHJlY29uY2lsZXIgaXMgaW5zdGFsbGVkIG9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgdmlld2VyIHRoaXMgcmVjb25jaWxlciBpcyBpbnN0YWxsZWQgb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVRleHRWaWV3ZXIgZ2V0VGV4dFZpZXdlcigpIHsKLQkJcmV0dXJuIGZWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG9sZElucHV0Ci0JICogQHBhcmFtIG5ld0lucHV0Ci0JICovCi0Jdm9pZCBoYW5kbGVJbnB1dERvY3VtZW50Q2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQkvLyBkb24ndCBib3RoZXIgaWYgcmVjb25jaWxlciBub3QgaW5zdGFsbGVkCi0JCWlmIChpc0luc3RhbGxlZCgpKSB7Ci0JCQlzZXREb2N1bWVudChuZXdJbnB1dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlciNpbnN0YWxsKElUZXh0Vmlld2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGwoSVRleHRWaWV3ZXIgdGV4dFZpZXdlcikgewotCQkvLyB3ZSBtaWdodCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSB2aWV3ZS5yLAotCQkvLyBtYXliZSBhZnRlciBiZWluZyB1bmluc3RhbGxlZCBhcyB3ZWxsLCBzbyB0cmFjayBzZXBhcmF0ZWx5Ci0JCWlmICghaXNJbnN0YWxsZWQoKSkgewotCQkJZlZpZXdlciA9IHRleHRWaWV3ZXI7Ci0JCQlmVGV4dElucHV0TGlzdGVuZXIgPSBuZXcgVGV4dElucHV0TGlzdGVuZXIoKTsKLQkJCXRleHRWaWV3ZXIuYWRkVGV4dElucHV0TGlzdGVuZXIoZlRleHRJbnB1dExpc3RlbmVyKTsKLQkJCXNldEluc3RhbGxlZCh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSB2aWV3ZXIgaGFzIGJlZW4gc2V0IG9uIHRoaXMgUmVjb25jaWxlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZpZXdlciBoYXMgYmVlbiBzZXQgb24gdGhpcyBSZWNvbmNpbGVyLCBmYWxzZQotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5zdGFsbGVkKCkgewotCQlyZXR1cm4gZklzSW5zdGFsbGVkOwotCX0KLQotCWJvb2xlYW4gaXNJblJld3JpdGVTZXNzaW9uKCkgewotCQlyZXR1cm4gZkluUmV3cml0ZVNlc3Npb247Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IGZvciBzcGVjaWZpYyBoYW5kbGluZyBvZiBkaXJ0eSByZWdpb25zLiBUaGUKLQkgKiBtZXRob2QgaXMgaW52b2tlZCBmb3IgZWFjaCBkaXJ0eSByZWdpb24gaW4gdGhlIEpvYidzIHF1ZXVlLgotCSAqIAotCSAqIEBwYXJhbSBkaXJ0eVJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3MoRGlydHlSZWdpb24gZGlydHlSZWdpb24pIHsKLQkJaWYgKCFpc0luc3RhbGxlZCgpIHx8IGlzSW5SZXdyaXRlU2Vzc2lvbigpIHx8IGRpcnR5UmVnaW9uID09IG51bGwgfHwgZ2V0RG9jdW1lbnQoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyoKLQkJICogQnJlYWsgdGhlIGRpcnR5IHJlZ2lvbiBpbnRvIGEgc2VxdWVuY2Ugb2YgcGFydGl0aW9ucyBhbmQgZmluZCB0aGUKLQkJICogY29ycmVzcG9uZGluZyBzdHJhdGVneSB0byByZWNvbmNpbGUgdGhvc2UgcGFydGl0aW9ucy4gSWYgYSBzdHJhdGVneQotCQkgKiBpbXBsZW1lbnRzIElOb25JbmNyZW1lbnRhbFJlY29uY2lsaW5nU3RyYXRlZ3ksIG9ubHkgY2FsbCBpdCBvbmNlCi0JCSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIG51bWJlciBhbmQgdHlwZXMgb2YgcGFydGl0aW9ucy4KLQkJICovCi0JCUlUeXBlZFJlZ2lvbltdIHBhcnRpdGlvbnMgPSBjb21wdXRlUGFydGl0aW9uaW5nKGRpcnR5UmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUmVjb25jaWxpbmdTdHJhdGVneSBzdHJhdGVneSA9IGdldFJlY29uY2lsaW5nU3RyYXRlZ3kocGFydGl0aW9uc1tpXS5nZXRUeXBlKCkpOwotCQkJaWYgKHN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCQlzdHJhdGVneS5yZWNvbmNpbGUocGFydGl0aW9uc1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnZva2UgZGlydHkgcmVnaW9uIHByb2Nlc3NpbmcuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwcm9jZXNzRGlydHlSZWdpb24oRGlydHlSZWdpb24gZHIpIHsKLQkJaWYgKGRyID09IG51bGwgfHwgIWlzSW5zdGFsbGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJYWRkUmVxdWVzdChkcik7Ci0JCXN5bmNocm9uaXplZCAoTE9DSykgewotCQkJZlJlc2V0ID0gdHJ1ZTsKLQkJfQotCi0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJhZGRlZCByZXF1ZXN0IGZvcjogWyIgKyBkci5nZXRUZXh0KCkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicXVldWUgc2l6ZSBpcyBub3c6ICIgKyBnZXREaXJ0eVJlZ2lvblF1ZXVlKCkuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmICghUGxhdGZvcm1VSS5pc1dvcmtiZW5jaFJ1bm5pbmcoKSkKLQkJCXJldHVybiBzdGF0dXM7Ci0KLQkJaWYgKCFmSGFzUmVjb25jaWxlZCkgewotCQkJaW5pdGlhbFJlY29uY2lsZSgpOwotCQkJZkhhc1JlY29uY2lsZWQgPSB0cnVlOwotCQl9Ci0KLQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRQcmlvcml0eShUaHJlYWQuTUlOX1BSSU9SSVRZKTsKLQkJYm9vbGVhbiBwcm9jZXNzZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZCAoTE9DSykgewotCQkJCWlmIChmUmVzZXQpIHsKLQkJCQkJZlJlc2V0ID0gZmFsc2U7Ci0JCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZJc0NhbmNlbGVkKQotCQkJCXJldHVybiBzdGF0dXM7Ci0KLQkJCURpcnR5UmVnaW9uW10gdG9SZWZyZXNoID0gZ2V0UmVxdWVzdHMoKTsKLQkJCWlmICh0b1JlZnJlc2gubGVuZ3RoID4gMCkgewotCQkJCXByb2Nlc3NlZCA9IHRydWU7Ci0JCQkJYmVnaW5Qcm9jZXNzaW5nKCk7Ci0JCQl9Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9SZWZyZXNoLmxlbmd0aCAmJiBmRG9jdW1lbnQgIT0gbnVsbDsgaSsrKSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQlwcm9jZXNzKHRvUmVmcmVzaFtpXSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAzNjc2Ci0JCQkvLyBzdG9wIGVycm9ycyBmcm9tIHBvcHBpbmcgdXAgYSBkaWFsb2cKLQkJCS8vIGZyb20gdGhlIGpvYiBtYW5hZ2VyCi0KLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDYwNTIKLQkJCS8vIGRvbid0IGxvZyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgotCQkJaWYgKCEoZSBpbnN0YW5jZW9mIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKSkKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJwcm9ibGVtIHdpdGggcmVjb25jaWxpbmciLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHByb2Nlc3NlZCkKLQkJCQllbmRQcm9jZXNzaW5nKCk7Ci0JCQlpZiAoIWZJc0NhbmNlbGVkKQotCQkJCXNjaGVkdWxlKGdldERlbGF5KCkpOwotCi0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlbGF5KGxvbmcgZGVsYXkpIHsKLQkJZkRlbGF5ID0gZGVsYXk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoSURvY3VtZW50IGRvYykgewotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCS8vIHVuaG9vayBvbGQgZG9jdW1lbnQgbGlzdGVuZXIKLQkJCWZEb2N1bWVudC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGZEb2N1bWVudExpc3RlbmVyKTsKLQkJCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJKChJRG9jdW1lbnRFeHRlbnNpb240KSBmRG9jdW1lbnQpLnJlbW92ZURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcihmRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCi0JCWZEb2N1bWVudCA9IGRvYzsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJKChJRG9jdW1lbnRFeHRlbnNpb240KSBmRG9jdW1lbnQpLmFkZERvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcihmRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyKTsKLQkJCX0KLQkJCS8vIGhvb2sgdXAgbmV3IGRvY3VtZW50IGxpc3RlbmVyCi0JCQlmRG9jdW1lbnQuYWRkRG9jdW1lbnRMaXN0ZW5lcihmRG9jdW1lbnRMaXN0ZW5lcik7Ci0KLQkJCXNldEVudGlyZURvY3VtZW50RGlydHkoZG9jKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGluaXRpYWwgcmVjb25jaWxpbmcgb2YgdGhlIGRvY3VtZW50LiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsUmVjb25jaWxlKCkgewotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRvY3VtZW50IHBhcnRpdGlvbmluZyBmb3IgdGhpcyByZWNvbmNpbGVyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJ0aXRpb25pbmcKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBwYXJ0aXRpb25pbmcgZm9yIHRoaXMgcmVjb25jaWxlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50UGFydGl0aW9uaW5nKFN0cmluZyBwYXJ0aXRpb25pbmcpIHsKLQkJZlBhcnRpdGlvbmluZyA9IHBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiBGb3JjZXMgcmVjb25jaWxpbmcgb2YgdGhlIGVudGlyZSBkb2N1bWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JjZVJlY29uY2lsaW5nKCkgewotCQlpZiAoIWZIYXNSZWNvbmNpbGVkKQotCQkJcmV0dXJuOwotCi0JCXNldEVudGlyZURvY3VtZW50RGlydHkoZ2V0RG9jdW1lbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogQmFzaWNhbGx5IG1lYW5zIHByb2Nlc3MgdGhlIGVudGlyZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbnRpcmVEb2N1bWVudERpcnR5KElEb2N1bWVudCBkb2N1bWVudCkgewotCi0JCS8vIG1ha2UgdGhlIGVudGlyZSBkb2N1bWVudCBkaXJ0eQotCQkvLyB0aGlzIGFsc28gaGFwcGVucyBvbiBhICJzYXZlIGFzIgotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBpc0luc3RhbGxlZCgpKSB7Ci0KLQkJCS8vIHNpbmNlIHdlJ3JlIG1hcmtpbmcgdGhlIGVudGlyZSBkb2MgZGlydHkKLQkJCWZsdXNoRGlydHlSZWdpb25RdWV1ZSgpOwotCi0JCQkvKioKLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTkwNTMKLQkJCSAqIAotCQkJICogUHJvY2VzcyB0aGUgc3RyYXRlZ2llcyBmb3IgdGhlIGxhc3Qga25vd24tZ29vZCBwYXJ0aXRpb25zIHRvCi0JCQkgKiBlbnN1cmUgYWxsIHByb2JsZW0gYW5ub3RhdGlvbnMgYXJlIGNsZWFyZWQgaWYgbmVlZGVkLgotCQkJICovCi0JCQlpZiAoZkxhc3RQYXJ0aXRpb25zICE9IG51bGwgJiYgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZkxhc3RQYXJ0aXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlSZWNvbmNpbGluZ1N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0UmVjb25jaWxpbmdTdHJhdGVneShmTGFzdFBhcnRpdGlvbnNbaV0uZ2V0VHlwZSgpKTsKLQkJCQkJaWYgKHN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCQkJCXN0cmF0ZWd5LnJlY29uY2lsZShmTGFzdFBhcnRpdGlvbnNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJRGlydHlSZWdpb24gZW50aXJlRG9jdW1lbnQgPSBjcmVhdGVEaXJ0eVJlZ2lvbigwLCBkb2N1bWVudC5nZXRMZW5ndGgoKSwgRGlydHlSZWdpb24uSU5TRVJUKTsKLQkJCQlwcm9jZXNzRGlydHlSZWdpb24oZW50aXJlRG9jdW1lbnQpOwotCQkJfQotCQkJc2NoZWR1bGUoZ2V0RGVsYXkoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNJbnN0YWxsZWQKLQkgKiAgICAgICAgICAgIFRoZSBpc0luc3RhbGxlZCB0byBzZXQuCi0JICovCi0Jdm9pZCBzZXRJbnN0YWxsZWQoYm9vbGVhbiBpc0luc3RhbGxlZCkgewotCQlmSXNJbnN0YWxsZWQgPSBpc0luc3RhbGxlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWNvbmNpbGluZ1N0cmF0ZWd5KFN0cmluZyBwYXJ0aXRpb25UeXBlLCBJUmVjb25jaWxpbmdTdHJhdGVneSBzdHJhdGVneSkgewotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlpZiAoc3RyYXRlZ3kgPT0gbnVsbCkgewotCQkJZlJlY29uY2lsaW5nU3RyYXRlZ2llcy5yZW1vdmUocGFydGl0aW9uVHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmUmVjb25jaWxpbmdTdHJhdGVnaWVzLnB1dChwYXJ0aXRpb25UeXBlLCBzdHJhdGVneSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlciN1bmluc3RhbGwoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbCgpIHsKLQkJaWYgKGlzSW5zdGFsbGVkKCkpIHsKLQkJCS8vIHJlbW92ZXMgd2lkZ2V0IGxpc3RlbmVyCi0JCQlnZXRUZXh0Vmlld2VyKCkucmVtb3ZlVGV4dElucHV0TGlzdGVuZXIoZlRleHRJbnB1dExpc3RlbmVyKTsKLQkJCXNldEluc3RhbGxlZChmYWxzZSk7Ci0JCQljYW5jZWwoKTsKLQkJCWZJc0NhbmNlbGVkID0gdHJ1ZTsKLQkJfQotCQlmRGlydHlSZWdpb25RdWV1ZS5jbGVhcigpOwotCQlzZXREb2N1bWVudChudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0RvY3VtZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9Eb2N1bWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI1NTc0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0RvY3VtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGFibGVNb2RlbDsKLQotLyoqCi0gKiBBZGFwdHMgYW4gPGNvZGU+SURvY3VtZW50PC9jb2RlPiB0byBhIDxjb2RlPklSZWNvbmNpbGFibGVNb2RlbDwvY29kZT4uCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50QWRhcHRlciBpbXBsZW1lbnRzIElSZWNvbmNpbGFibGVNb2RlbCB7Ci0KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGV4dCBtb2RlbCBhZGFwdGVyIGZvciB0aGUgZ2l2ZW4gZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICovCi0JcHVibGljIERvY3VtZW50QWRhcHRlcihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIG1vZGVsJ3MgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgbW9kZWwncyBpbnB1dCBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9Eb2N1bWVudFJlZ2lvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9Eb2N1bWVudFJlZ2lvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzJiYzI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvRG9jdW1lbnRSZWdpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAoSW50YWxpbykgLSBidWcgMzA3MzIzIC0gcmVtb3ZlIGV4dHJhbmVvdXMgY2FsbCB0byBzcGVsbCBjaGVjayBzdHJhdGVneQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkRpcnR5UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLkFic3RyYWN0U3RydWN0dXJlZEZvbGRpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzLkNvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuVmFsaWRhdG9yQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLlZhbGlkYXRvclN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc3BlbGxpbmcuU3BlbGxjaGVja1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkucmVjb25jaWxlLklTb3VyY2VSZWNvbmNpbGluZ0xpc3RlbmVyOwotCi0vKioKLSAqIEFkZHMgdG8gRGlydHlSZWdpb25Qcm9jZXNzb3IgSm9iOiAtIElEb2N1bWVudExpc3RlbmVyIC0gVmFsaWRhdG9yU3RyYXRlZ3kgLQotICogVGV4dCB2aWV3ZXIoZGlzcG9zZSwgaW5wdXQgY2hhbmdlZCkgbGlzdGVuZXJzLiAtIGRlZmF1bHQsIHNwZWxsaW5nLCBhbmQKLSAqIHZhbGlkYXRvciBzdHJhdGVnaWVzIC0gRGlydHlSZWdpb24gcHJvY2Vzc2luZyBsb2dpYy4KLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50UmVnaW9uUHJvY2Vzc29yIGV4dGVuZHMgRGlydHlSZWdpb25Qcm9jZXNzb3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVkFMSURBVE9SUyA9IEJvb2xlYW4uVFJVRS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvcmVjb25jaWxlclZhbGlkYXRvcnMiKSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgc3RyYXRlZ3kgdG8gdXNlIHRoZSBkZWZpbmVkIGRlZmF1bHQgU3BlbGxpbmcgc2VydmljZS4KLQkgKi8KLQlwcml2YXRlIElSZWNvbmNpbGluZ1N0cmF0ZWd5IGZTcGVsbGNoZWNrU3RyYXRlZ3k7Ci0KLQkvKioKLQkgKiBUaGUgc3RyYXRlZ3kgdGhhdCBydW5zIHZhbGlkYXRvcnMgY29udHJpYnV0ZWQgdmlhCi0JICogPGNvZGU+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb25zLnNvdXJjZXZhbGlkYXRpb248L2NvZGU+Ci0JICogZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHJpdmF0ZSBWYWxpZGF0b3JTdHJhdGVneSBmVmFsaWRhdG9yU3RyYXRlZ3k7Ci0KLQlwcml2YXRlIElTb3VyY2VSZWNvbmNpbGluZ0xpc3RlbmVyW10gZlJlY29uY2lsZUxpc3RlbmVycyA9IG5ldyBJU291cmNlUmVjb25jaWxpbmdMaXN0ZW5lclswXTsKLQotCXByaXZhdGUgSVJlY29uY2lsaW5nU3RyYXRlZ3kgZlNlbWFudGljSGlnaGxpZ2h0aW5nU3RyYXRlZ3k7Ci0JCi0JLyoqCi0JICogVGhlIGZvbGRpbmcgc3RyYXRlZ3kgZm9yIHRoaXMgcHJvY2Vzc29yCi0JICovCi0JcHJpdmF0ZSBBYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nU3RyYXRlZ3kgZkZvbGRpbmdTdHJhdGVneTsKLQkKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBTU0VfVUlfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIHRydWUgaWYgYXMgeW91IHR5cGUgdmFsaWRhdGlvbiBpcyBlbmFibGVkLAotCSAqIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmVmFsaWRhdGlvbkVuYWJsZWQ7Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWNvbmNpbGluZ0xpc3RlbmVyKElTb3VyY2VSZWNvbmNpbGluZ0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCVNldCBsaXN0ZW5lcnMgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KGZSZWNvbmNpbGVMaXN0ZW5lcnMpKTsKLQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCWZSZWNvbmNpbGVMaXN0ZW5lcnMgPSAoSVNvdXJjZVJlY29uY2lsaW5nTGlzdGVuZXJbXSkgbGlzdGVuZXJzLnRvQXJyYXkobmV3IElTb3VyY2VSZWNvbmNpbGluZ0xpc3RlbmVyW2xpc3RlbmVycy5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBiZWdpblByb2Nlc3NpbmcoKSB7Ci0JCXN1cGVyLmJlZ2luUHJvY2Vzc2luZygpOwotCQlWYWxpZGF0b3JTdHJhdGVneSB2YWxpZGF0b3JTdHJhdGVneSA9IGdldFZhbGlkYXRvclN0cmF0ZWd5KCk7Ci0JCWlmICh2YWxpZGF0b3JTdHJhdGVneSAhPSBudWxsKSB7Ci0JCQl2YWxpZGF0b3JTdHJhdGVneS5iZWdpblByb2Nlc3NpbmcoKTsKLQkJfQotCQlpZiAoKGdldFRleHRWaWV3ZXIoKSBpbnN0YW5jZW9mIElTb3VyY2VWaWV3ZXIpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZSZWNvbmNpbGVMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmUmVjb25jaWxlTGlzdGVuZXJzW2ldLmFib3V0VG9CZVJlY29uY2lsZWQoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZFByb2Nlc3NpbmcoKSB7Ci0JCXN1cGVyLmVuZFByb2Nlc3NpbmcoKTsKLQkJVmFsaWRhdG9yU3RyYXRlZ3kgdmFsaWRhdG9yU3RyYXRlZ3kgPSBnZXRWYWxpZGF0b3JTdHJhdGVneSgpOwotCQlpZiAodmFsaWRhdG9yU3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJdmFsaWRhdG9yU3RyYXRlZ3kuZW5kUHJvY2Vzc2luZygpOwotCQl9Ci0JCS8qIHNpbmdsZSBzcGVsbC1jaGVjayBmb3IgZXZlcnl0aGluZyB0byBlbnN1cmUgdGhhdCBTcGVsbGluZ1Byb2JsZW0gb2Zmc2V0cyBhcmUgY29ycmVjdCAqLwotCQlJUmVjb25jaWxpbmdTdHJhdGVneSBzcGVsbGluZ1N0cmF0ZWd5ID0gZ2V0U3BlbGxjaGVja1N0cmF0ZWd5KCk7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7Ci0JCWlmIChzcGVsbGluZ1N0cmF0ZWd5ICE9IG51bGwgJiYgZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJIHNwZWxsaW5nU3RyYXRlZ3kucmVjb25jaWxlKG5ldyBSZWdpb24oMCwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpKTsKLQkJfQotCQkKLQkJSVJlY29uY2lsaW5nU3RyYXRlZ3kgc2VtYW50aWNIaWdobGlnaHRpbmdTdHJhdGVneSA9IGdldFNlbWFudGljSGlnaGxpZ2h0aW5nU3RyYXRlZ3koKTsKLQkJaWYgKHNlbWFudGljSGlnaGxpZ2h0aW5nU3RyYXRlZ3kgIT0gbnVsbCAmJiBkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpZ2hsaWdodGluZ1N0cmF0ZWd5LnJlY29uY2lsZShuZXcgUmVnaW9uKDAsIGRvY3VtZW50LmdldExlbmd0aCgpKSk7Ci0JCX0KLQotCQlpZiAoKGdldFRleHRWaWV3ZXIoKSBpbnN0YW5jZW9mIElTb3VyY2VWaWV3ZXIpKSB7Ci0JCQlJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciA9IChJU291cmNlVmlld2VyKSBnZXRUZXh0Vmlld2VyKCk7Ci0JCQlJQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCA9IHNvdXJjZVZpZXdlci5nZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlJlY29uY2lsZUxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWZSZWNvbmNpbGVMaXN0ZW5lcnNbaV0ucmVjb25jaWxlZChkb2N1bWVudCwgYW5ub3RhdGlvbk1vZGVsLCBmYWxzZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JjZVJlY29uY2lsaW5nKCkgewotCQlzdXBlci5mb3JjZVJlY29uY2lsaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZShJRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBjb250ZW50VHlwZUlkID0gbnVsbDsKLQotCQlJQ29udGVudFR5cGUgY3QgPSBudWxsOwotCQl0cnkgewotCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0RGVzY3JpcHRpb25Gb3IobmV3IFN0cmluZ1JlYWRlcihkb2MuZ2V0KCkpLCBudWxsLCBJQ29udGVudERlc2NyaXB0aW9uLkFMTCk7Ci0JCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJY3QgPSBkZXNjLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJaWYgKGN0ICE9IG51bGwpCi0JCQkJCWNvbnRlbnRUeXBlSWQgPSBjdC5nZXRJZCgpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBqdXN0IGJhaWwKLQkJfQotCQlyZXR1cm4gY29udGVudFR5cGVJZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVJlY29uY2lsaW5nU3RyYXRlZ3kgZ2V0U3BlbGxjaGVja1N0cmF0ZWd5KCkgewotCQlpZiAoZlNwZWxsY2hlY2tTdHJhdGVneSA9PSBudWxsICYmIGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNvbnRlbnRUeXBlSWQgPSBnZXRDb250ZW50VHlwZShnZXREb2N1bWVudCgpKTsKLQkJCWlmIChjb250ZW50VHlwZUlkID09IG51bGwpIHsKLQkJCQljb250ZW50VHlwZUlkID0gSUNvbnRlbnRUeXBlTWFuYWdlci5DVF9URVhUOwotCQkJfQotCQkJaWYgKGdldFRleHRWaWV3ZXIoKSBpbnN0YW5jZW9mIElTb3VyY2VWaWV3ZXIpIHsKLQkJCQlJU291cmNlVmlld2VyIHZpZXdlciA9IChJU291cmNlVmlld2VyKSBnZXRUZXh0Vmlld2VyKCk7Ci0JCQkJZlNwZWxsY2hlY2tTdHJhdGVneSA9IG5ldyBTcGVsbGNoZWNrU3RyYXRlZ3kodmlld2VyLCBjb250ZW50VHlwZUlkKTsKLQkJCQlmU3BlbGxjaGVja1N0cmF0ZWd5LnNldERvY3VtZW50KGdldERvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmU3BlbGxjaGVja1N0cmF0ZWd5OwotCX0KLQkKLQkvKioKLQkgKiA8cD5HZXQgdGhlIGZvbGRpbmcgc3RyYXRlZ3kgZm9yIHRoaXMgcHJvY2Vzc29yLiBSZXRyaWV2ZWQgZnJvbSB0aGUgCi0JICogZXh0ZW5kZWQgY29uZmlndXJhdGlvbiBidWlsZGVyLiAgVGhlIHByb2Nlc3NvciBjaG9zZW4gaXMgc2V0IGJ5IHRoZSBwbHVnaW4uPC9wPgotCSAqIAotCSAqIDxwPkVYOjxiciAvPgotCSAqIDxjb2RlPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiImZ3Q7PGJyIC8+Ci0JICogICZsdDtwcm92aXNpb25hbENvbmZpZ3VyYXRpb248YnIgLz4KLQkgKgkJCXR5cGU9ImZvbGRpbmdzdHJhdGVneSI8YnIgLz4KLQkgKgkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb24uWE1MRm9sZGluZ1N0cmF0ZWd5IjxiciAvPgotCSAqCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvJmd0OzxiciAvPgotCSAqCSZsdDsvZXh0ZW5zaW9uJmd0OzwvY29kZT48L3A+Ci0JICogCi0JICogPHA+VGhlIHR5cGUgbXVzdCBiZSBlcXVhbCB0byA8Y29kZT5BYnN0cmFjdEZvbGRpbmdTdHJhdGVneS5JRDwvY29kZT4gKEFLQTogZm9sZGluZ3N0cmF0ZWd5KQotCSAqIGFuZCB0aGUgY2xhc3MgbXVzdCBleHRlbmQgPGNvZGU+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLkFic3RyYWN0Rm9sZGluZ1N0cmF0ZWd5PC9jb2RlPgotCSAqIGFuZCB0aGUgdGFyZ2V0IG11c3QgYmUgYSBzdHJ1Y3R1cmVkIGVkaXRvciBjb250ZW50IHR5cGUgSUQ8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgcmVxdWVzdGVkIGZvbGRpbmcgc3RyYXRlZ3kgb3IgbnVsbCBpZiBub25lIGNhbiBiZSBmb3VuZAotCSAqLwotCXByb3RlY3RlZCBJUmVjb25jaWxpbmdTdHJhdGVneSBnZXRGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCWlmKGZGb2xkaW5nU3RyYXRlZ3kgPT0gbnVsbCAmJiBnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCVN0cmluZyBjb250ZW50VHlwZUlkID0gZ2V0Q29udGVudFR5cGUoZ2V0RG9jdW1lbnQoKSk7Ci0JCQlpZiAoY29udGVudFR5cGVJZCA9PSBudWxsKSB7Ci0JCQkJY29udGVudFR5cGVJZCA9IElDb250ZW50VHlwZU1hbmFnZXIuQ1RfVEVYVDsKLQkJCX0KLQkJCQotCQkJSVRleHRWaWV3ZXIgdmlld2VyID0gZ2V0VGV4dFZpZXdlcigpOwotCQkJaWYodmlld2VyIGluc3RhbmNlb2YgUHJvamVjdGlvblZpZXdlcikgewotCQkJCUV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRlciA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCQkKLQkJCQlJQ29udGVudFR5cGUgdHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpOwotCQkJCXdoaWxlKGZGb2xkaW5nU3RyYXRlZ3kgPT0gbnVsbCAmJiB0eXBlICE9IG51bGwpIHsKLQkJCQkJZkZvbGRpbmdTdHJhdGVneSA9KEFic3RyYWN0U3RydWN0dXJlZEZvbGRpbmdTdHJhdGVneSkgYnVpbGRlci5nZXRDb25maWd1cmF0aW9uKAotCQkJCQkJCUFic3RyYWN0U3RydWN0dXJlZEZvbGRpbmdTdHJhdGVneS5JRCwgdHlwZS5nZXRJZCgpKTsKLQkJCQkKLQkJCQkJdHlwZSA9IHR5cGUuZ2V0QmFzZVR5cGUoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYoZkZvbGRpbmdTdHJhdGVneSAhPSBudWxsKSB7Ci0JCQkJCWZGb2xkaW5nU3RyYXRlZ3kuc2V0Vmlld2VyKChQcm9qZWN0aW9uVmlld2VyKXZpZXdlcik7Ci0JCQkJCWZGb2xkaW5nU3RyYXRlZ3kuc2V0RG9jdW1lbnQoZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZkZvbGRpbmdTdHJhdGVneTsKLQl9Ci0JCi0JLyoqCi0JICogRW5hYmxlIG9yIGRpc2FibGUgYXMgeW91IHR5cGUgdmFsaWRhdGlvbi4gVHlwaWNhbGx5IHNldCBieSBhIHVzZXIgcHJlZmVyZW5jZQotCSAqIAotCSAqIEBwYXJhbSBlbmFibGUgdHJ1ZSB0byBlbmFibGUgYXMgeW91IHR5cGUgdmFsaWRhdGlvbiwgZmFsc2UgdG8gZGlzYWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvclN0cmF0ZWd5RW5hYmxlZChib29sZWFuIGVuYWJsZSkgewotCQlmVmFsaWRhdGlvbkVuYWJsZWQgPSBlbmFibGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBWYWxpZGF0b3JTdHJhdGVneS4KLQkgKi8KLQlwcm90ZWN0ZWQgVmFsaWRhdG9yU3RyYXRlZ3kgZ2V0VmFsaWRhdG9yU3RyYXRlZ3koKSB7Ci0JCVZhbGlkYXRvclN0cmF0ZWd5IHZhbGlkYXRvclN0cmF0ZWd5ID0gbnVsbDsKLQkJaWYgKGZWYWxpZGF0b3JTdHJhdGVneSA9PSBudWxsICYmIGZWYWxpZGF0aW9uRW5hYmxlZCkgewotCQkJaWYgKGdldFRleHRWaWV3ZXIoKSBpbnN0YW5jZW9mIElTb3VyY2VWaWV3ZXIpIHsKLQkJCQlJU291cmNlVmlld2VyIHZpZXdlciA9IChJU291cmNlVmlld2VyKSBnZXRUZXh0Vmlld2VyKCk7Ci0JCQkJU3RyaW5nIGNvbnRlbnRUeXBlSWQgPSBudWxsOwotCi0JCQkJSURvY3VtZW50IGRvYyA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQkJCWNvbnRlbnRUeXBlSWQgPSBnZXRDb250ZW50VHlwZShkb2MpOwotCi0JCQkJaWYgKGNvbnRlbnRUeXBlSWQgIT0gbnVsbCkgewotCQkJCQl2YWxpZGF0b3JTdHJhdGVneSA9IG5ldyBWYWxpZGF0b3JTdHJhdGVneSh2aWV3ZXIsIGNvbnRlbnRUeXBlSWQpOwotCQkJCQlWYWxpZGF0b3JCdWlsZGVyIHZCdWlsZGVyID0gbmV3IFZhbGlkYXRvckJ1aWxkZXIoKTsKLQkJCQkJVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzID0gdkJ1aWxkZXIuZ2V0VmFsaWRhdG9yTWV0YURhdGEoU1NFX1VJX0lEKTsKLQkJCQkJTGlzdCBlbmFibGVkVmFsaWRhdG9ycyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQkJCS8qIGlmIGFueSAibXVzdCIgaGFuZGxlIHRoaXMgY29udGVudCB0eXBlLCBqdXN0IGFkZCB0aGVtICovCi0JCQkJCWJvb2xlYW4gZm91bmRTcGVjaWZpY0NvbnRlbnRUeXBlVmFsaWRhdG9ycyA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZtZHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmICh2bWRzW2ldLm11c3RIYW5kbGVDb250ZW50VHlwZShjb250ZW50VHlwZUlkKSkgewotCQkJCQkJCWlmIChERUJVR19WQUxJREFUT1JTKQotCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBjb250ZW50VHlwZUlkICsgIiB1c2luZyBzcGVjaWZpYyB2YWxpZGF0b3IgIiArIHZtZHNbaV0uZ2V0VmFsaWRhdG9ySWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlmb3VuZFNwZWNpZmljQ29udGVudFR5cGVWYWxpZGF0b3JzID0gdHJ1ZTsKLQkJCQkJCQllbmFibGVkVmFsaWRhdG9ycy5hZGQodm1kc1tpXSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFmb3VuZFNwZWNpZmljQ29udGVudFR5cGVWYWxpZGF0b3JzKSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZtZHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlpZiAodm1kc1tpXS5jYW5IYW5kbGVDb250ZW50VHlwZShjb250ZW50VHlwZUlkKSkgewotCQkJCQkJCQlpZiAoREVCVUdfVkFMSURBVE9SUykKLQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGNvbnRlbnRUeXBlSWQgKyAiIHVzaW5nIGluaGVyaXRlZCg/KSB2YWxpZGF0b3IgIiArIHZtZHNbaV0uZ2V0VmFsaWRhdG9ySWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJZW5hYmxlZFZhbGlkYXRvcnMuYWRkKHZtZHNbaV0pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVuYWJsZWRWYWxpZGF0b3JzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQl2YWxpZGF0b3JTdHJhdGVneS5hZGRWYWxpZGF0b3JNZXRhRGF0YSgoVmFsaWRhdG9yTWV0YURhdGEpIGVuYWJsZWRWYWxpZGF0b3JzLmdldChpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmVmFsaWRhdG9yU3RyYXRlZ3kgPSB2YWxpZGF0b3JTdHJhdGVneTsKLQkJfSBlbHNlIGlmKGZWYWxpZGF0b3JTdHJhdGVneSAhPSBudWxsICYmIGZWYWxpZGF0aW9uRW5hYmxlZCkgewotCQkJdmFsaWRhdG9yU3RyYXRlZ3kgPSBmVmFsaWRhdG9yU3RyYXRlZ3k7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkYXRvclN0cmF0ZWd5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZW1hbnRpY0hpZ2hsaWdodGluZ1N0cmF0ZWd5KElSZWNvbmNpbGluZ1N0cmF0ZWd5IHNlbWFudGljSGlnaGxpZ2h0aW5nU3RyYXRlZ3kpIHsKLQkJZlNlbWFudGljSGlnaGxpZ2h0aW5nU3RyYXRlZ3kgPSBzZW1hbnRpY0hpZ2hsaWdodGluZ1N0cmF0ZWd5OwotCQlmU2VtYW50aWNIaWdobGlnaHRpbmdTdHJhdGVneS5zZXREb2N1bWVudChnZXREb2N1bWVudCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElSZWNvbmNpbGluZ1N0cmF0ZWd5IGdldFNlbWFudGljSGlnaGxpZ2h0aW5nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBmU2VtYW50aWNIaWdobGlnaHRpbmdTdHJhdGVneTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGRpcnR5UmVnaW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2VzcyhEaXJ0eVJlZ2lvbiBkaXJ0eVJlZ2lvbikgewotCQlpZiAoIWlzSW5zdGFsbGVkKCkgfHwgaXNJblJld3JpdGVTZXNzaW9uKCkgfHwgZGlydHlSZWdpb24gPT0gbnVsbCB8fCBnZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJc3VwZXIucHJvY2VzcyhkaXJ0eVJlZ2lvbik7Ci0JCQotCQlJVHlwZWRSZWdpb25bXSBwYXJ0aXRpb25zID0gY29tcHV0ZVBhcnRpdGlvbmluZyhkaXJ0eVJlZ2lvbik7Ci0JCQotCQkvLyBjYWxsIHRoZSB2YWxpZGF0b3Igc3RyYXRlZ3kgb25jZSBmb3IgZWFjaCBlZmZlY3RlZCBwYXJ0aXRpb24KLQkJRGlydHlSZWdpb24gZGlydHkgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWRpcnR5ID0gY3JlYXRlRGlydHlSZWdpb24ocGFydGl0aW9uc1tpXSwgRGlydHlSZWdpb24uSU5TRVJUKTsKLQotCQkJLy8gW3NvdXJjZV12YWxpZGF0b3IgKGV4dGVuc2lvbikgZm9yIHRoaXMgcGFydGl0aW9uCi0JCQlpZiAoZ2V0VmFsaWRhdG9yU3RyYXRlZ3koKSAhPSBudWxsKSB7Ci0JCQkJZ2V0VmFsaWRhdG9yU3RyYXRlZ3koKS5yZWNvbmNpbGUocGFydGl0aW9uc1tpXSwgZGlydHkpOwotCQkJfQotCQl9Ci0JCQotCQkvKiBpZiB0aGVyZSBpcyBhIGZvbGRpbmcgc3RyYXRlZ3kgdGhlbiByZWNvbmNpbGUgaXQgZm9yIHRoZQotCQkgKiBlbnRpcmUgZGlydHkgcmVnaW9uLgotCQkgKiBOT1RFOiB0aGUgZm9sZGluZyBzdHJhdGVneSBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBzdWIgcmVnaW9ucy4KLQkJICovCi0JCWlmKGdldEZvbGRpbmdTdHJhdGVneSgpICE9IG51bGwpIHsKLQkJCWdldEZvbGRpbmdTdHJhdGVneSgpLnJlY29uY2lsZShkaXJ0eVJlZ2lvbiwgbnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVjb25jaWxpbmdMaXN0ZW5lcihJU291cmNlUmVjb25jaWxpbmdMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlTZXQgbGlzdGVuZXJzID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChmUmVjb25jaWxlTGlzdGVuZXJzKSk7Ci0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQlmUmVjb25jaWxlTGlzdGVuZXJzID0gKElTb3VyY2VSZWNvbmNpbGluZ0xpc3RlbmVyW10pIGxpc3RlbmVycy50b0FycmF5KG5ldyBJU291cmNlUmVjb25jaWxpbmdMaXN0ZW5lcltsaXN0ZW5lcnMuc2l6ZSgpXSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyLnNldERvY3VtZW50KGRvYyk7Ci0JCQotCQlJUmVjb25jaWxpbmdTdHJhdGVneSB2YWxpZGF0b3JTdHJhdGVneSA9IGdldFZhbGlkYXRvclN0cmF0ZWd5KCk7Ci0JCWlmICh2YWxpZGF0b3JTdHJhdGVneSAhPSBudWxsKSB7Ci0JCQl2YWxpZGF0b3JTdHJhdGVneS5zZXREb2N1bWVudChkb2MpOwotCQl9Ci0JCWlmIChmU2VtYW50aWNIaWdobGlnaHRpbmdTdHJhdGVneSAhPSBudWxsKSB7Ci0JCQlmU2VtYW50aWNIaWdobGlnaHRpbmdTdHJhdGVneS5zZXREb2N1bWVudChkb2MpOwotCQl9Ci0JCQotCQlmU3BlbGxjaGVja1N0cmF0ZWd5ID0gbnVsbDsKLQkJaWYoZkZvbGRpbmdTdHJhdGVneSAhPSBudWxsKSB7Ci0JCQlmRm9sZGluZ1N0cmF0ZWd5LnVuaW5zdGFsbCgpOwotCQl9Ci0JCWZGb2xkaW5nU3RyYXRlZ3kgPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVudGlyZURvY3VtZW50RGlydHkoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXN1cGVyLnNldEVudGlyZURvY3VtZW50RGlydHkoZG9jdW1lbnQpOwotCi0JCS8vIG1ha2UgdGhlIGVudGlyZSBkb2N1bWVudCBkaXJ0eQotCQkvLyB0aGlzIGFsc28gaGFwcGVucyBvbiBhICJzYXZlIGFzIgotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBpc0luc3RhbGxlZCgpICYmIGZMYXN0UGFydGl0aW9ucyAhPSBudWxsICYmIGRvY3VtZW50LmdldExlbmd0aCgpID09IDApIHsKLQkJCS8qKgotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5OTA1MwotCQkJICogCi0JCQkgKiBQcm9jZXNzIHRoZSBzdHJhdGVnaWVzIGZvciB0aGUgbGFzdCBrbm93bi1nb29kIHBhcnRpdGlvbnMuCi0JCQkgKi8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZkxhc3RQYXJ0aXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVmFsaWRhdG9yU3RyYXRlZ3kgdmFsaWRhdG9yU3RyYXRlZ3kgPSBnZXRWYWxpZGF0b3JTdHJhdGVneSgpOwotCQkJCWlmICh2YWxpZGF0b3JTdHJhdGVneSAhPSBudWxsKSB7Ci0JCQkJCXZhbGlkYXRvclN0cmF0ZWd5LnJlY29uY2lsZShmTGFzdFBhcnRpdGlvbnNbaV0sIGNyZWF0ZURpcnR5UmVnaW9uKGZMYXN0UGFydGl0aW9uc1tpXSwgRGlydHlSZWdpb24uUkVNT1ZFKSk7Ci0JCQkJfQotCQkJfQotCQkJSVJlY29uY2lsaW5nU3RyYXRlZ3kgc3BlbGxpbmdTdHJhdGVneSA9IGdldFNwZWxsY2hlY2tTdHJhdGVneSgpOwotCQkJaWYgKHNwZWxsaW5nU3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJCXNwZWxsaW5nU3RyYXRlZ3kucmVjb25jaWxlKG5ldyBSZWdpb24oMCwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpKTsKLQkJCX0KLQkJCQotCQkJLy9pZiB0aGVyZSBpcyBhIGZvbGRpbmcgc3RyYXRlZ3kgdGhlbiByZWNvbmNpbGUgaXQKLQkJCWlmKGdldEZvbGRpbmdTdHJhdGVneSgpICE9IG51bGwpIHsKLQkJCQlnZXRGb2xkaW5nU3RyYXRlZ3koKS5yZWNvbmNpbGUobmV3IFJlZ2lvbigwLCBkb2N1bWVudC5nZXRMZW5ndGgoKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5EaXJ0eVJlZ2lvblByb2Nlc3NvciNpbnN0YWxsKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIpCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChJVGV4dFZpZXdlciB0ZXh0Vmlld2VyKSB7Ci0JCXN1cGVyLmluc3RhbGwodGV4dFZpZXdlcik7Ci0KLQkJLy9kZXRlcm1pbmUgaWYgdmFsaWRhdGlvbiBpcyBlbmFibGVkCi0JCXRoaXMuZlZhbGlkYXRpb25FbmFibGVkID0gU1NFVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCUNvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lcy5FVkFMVUFURV9URU1QT1JBUllfUFJPQkxFTVMpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLkRpcnR5UmVnaW9uUHJvY2Vzc29yI3VuaW5zdGFsbCgpCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCi0JCQljYW5jZWwoKTsKLQotCQkJSVJlY29uY2lsaW5nU3RyYXRlZ3kgdmFsaWRhdG9yU3RyYXRlZ3kgPSBnZXRWYWxpZGF0b3JTdHJhdGVneSgpOwotCi0JCQlpZiAodmFsaWRhdG9yU3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJCWlmICh2YWxpZGF0b3JTdHJhdGVneSBpbnN0YW5jZW9mIElSZWxlYXNhYmxlKQotCQkJCQkoKElSZWxlYXNhYmxlKSB2YWxpZGF0b3JTdHJhdGVneSkucmVsZWFzZSgpOwotCQkJfQotCQkJCi0JCQlpZiAoZlNwZWxsY2hlY2tTdHJhdGVneSAhPSBudWxsKSB7Ci0JCQkJZlNwZWxsY2hlY2tTdHJhdGVneS5zZXREb2N1bWVudChudWxsKTsKLQkJCQlmU3BlbGxjaGVja1N0cmF0ZWd5ID0gbnVsbDsKLQkJCX0KLQotCQkJZlJlY29uY2lsZUxpc3RlbmVycyA9IG5ldyBJU291cmNlUmVjb25jaWxpbmdMaXN0ZW5lclswXTsKLQkJfQotCQlzdXBlci51bmluc3RhbGwoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0lDb25maWd1cmFibGVSZWNvbmNpbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0lDb25maWd1cmFibGVSZWNvbmNpbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOGIyOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9JQ29uZmlndXJhYmxlUmVjb25jaWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneTsKLQotLyoqCi0gKiBBIHJlY29uY2lsZXIgdGhhdCBhbGxvd3MgSVJlY29uY2lsaW5nU3RyYXRlZ2llcyB0byBiZSBhc3NpZ25lZCB0byBwYXJ0aXRpb24KLSAqIHR5cGVzLiBUaGUgcmVjb25jaWxlciB3aWxsIGNhbGwgdGhlIHJlZ2lzdGVyZWQgSVJlY29uY2lsaW5nU3RyYXRlZ3kgd2hlbgotICogZGlydHkgcmVnaW9ucyB3aGljaCBjb250YWluIHBhcnRpdGlvbnMgb2YgYSBzcGVjaWZpYyB0eXBlIG5lZWQgdG8gYmUKLSAqIHJlY29uY2lsZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJhYmxlUmVjb25jaWxlciB7Ci0JLyoqCi0JICogU2V0cyB0aGUgcmVjb25jaWxpbmcgc3RyYXRlZ3kgZm9yIHRoZSByZWNvbmNpbGVyIHRvIHVzZSBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGNvbnRlbnQgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFydGl0aW9uVHlwZQotCSAqICAgICAgICAgICAgdGhlIHBhcnRpdGlvbiB0eXBlCi0JICogQHBhcmFtIHN0cmF0ZWd5Ci0JICogICAgICAgICAgICB0aGUgcmVjb25jaWxpbmcgc3RyYXRlZ3kKLQkgKi8KLQl2b2lkIHNldFJlY29uY2lsaW5nU3RyYXRlZ3koU3RyaW5nIHBhcnRpdGlvblR5cGUsIElSZWNvbmNpbGluZ1N0cmF0ZWd5IHN0cmF0ZWd5KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvSVJlY29uY2lsZUFubm90YXRpb25LZXkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvSVJlY29uY2lsZUFubm90YXRpb25LZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiMDJiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0lSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVN0ZXA7Ci0KLS8qKgotICogRGVmaW5lcyBhbiBhbm5vdGF0aW9uIGtleSB0aGF0IHRoZQotICogPGNvZGU+QWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3k8L2NvZGU+IGtub3dzIGhvdyB0bwotICogcmVtb3ZlIGFwcHJvcHJpYXRlbHkuCi0gKiAKLSAqIEBkZXByZWNhdGVkIG5vdCBBUEksIHRoaXMgd2lsbCBwcm9iYWJseSBqdXN0IGJlY29tZSBhbiBhYnN0cmFjdCBjbGFzcwotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IHsKLQlzdGF0aWMgZmluYWwgaW50IFBBUlRJQUwgPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgVE9UQUwgPSAwOwotCi0JU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoKTsKLQotCS8vaW50IGdldFNjb3BlKCk7Ci0KLQlJUmVjb25jaWxlU3RlcCBnZXRTdGVwKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0lTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9JU3RydWN0dXJlZFJlY29uY2lsZVN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUxYmM5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0lTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVN0ZXA7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqIEBkZXByZWNhdGVkIHN0aWxsIHdvcmtpbmcgb3V0IEFQSSAob3IgaWYgYW55dGhpbmcgaGVyZSBzaG91bGQgYmUgQVBJKQotICogCi0gKiBJbnRlcmZhY2UgZm9yIGEgc3RlcCBpbiBTdHJ1Y3R1cmVkUmVnaW9uUHJvY2Vzc29yIGZyYW1ld29yay4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFJlY29uY2lsZVN0ZXAgZXh0ZW5kcyBJUmVjb25jaWxlU3RlcCB7Ci0JLyoqCi0JICogUGFydGl0aW9ucyBmb3Igd2hpY2ggdGhpcyBzdGVwIGNhbiBhZGQvcmVtb3ZlIGFubm90aW9ucwotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHBhcnRpdGlvbnMgZm9yIHdoaWNoIHRoaXMgc3RlcCBjYW4gYWRkL3JlbW92ZQotCSAqICAgICAgICAgYW5ub3Rpb25zCi0JICovCi0JU3RyaW5nW10gZ2V0UGFydGl0aW9uVHlwZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNjb3BlIGZvciB3aGljaCB0aGlzIHN0ZXAgYWRkcyBhbm5vdGF0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzY29wZSBmb3Igd2hpY2ggdGhpcyBzdGVwIGFkZHMgYW5ub3RhdGlvbnMKLQkgKi8KLQkvL2ludCBnZXRTY29wZSgpOwotCi0JLyoqCi0JICogVGVsbHMgeW91IGlmIHRoZSBzdGVwIGlzIGVxdWFsIHRvIHRoaXMgc3RlcCBvciBhbnkgb2YgdGhlIHNpYmxpbmcKLQkgKiBzdGVwcy4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBpc1NpYmxpbmdTdGVwKElSZWNvbmNpbGVTdGVwIHN0ZXApOwotCi0JLyoqCi0JICogQWRkcyBhd2FyZW5lc3MgdGhhdCB0aGUgUmVjb25jaWxlciBpcyByZWNvbmNpbGluZyB0aGUgZW50aXJlIGRvY3VtZW50Ci0JICogdGhpcyBjYWxsLgotCSAqIAotCSAqIEBwYXJhbSBkaXJ0eVJlZ2lvbgotCSAqIEBwYXJhbSBzdWJSZWdpb24KLQkgKiBAcGFyYW0gcmVmcmVzaEFsbAotCSAqIEByZXR1cm4KLQkgKi8KLQlJUmVjb25jaWxlUmVzdWx0W10gcmVjb25jaWxlKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uLCBJUmVnaW9uIHN1YlJlZ2lvbiwgYm9vbGVhbiByZWZyZXNoQWxsKTsKLQotCS8qKgotCSAqIFVzZWQgdG8gcmVzZXQgdGhlIHN0YXRlIG9mIHRoZSBTdHJhdGVneS4gRm9yIGV4YW1wbGU6IGFueSBmbGFncyB0aGF0Ci0JICogbmVlZCB0byBiZSByZXNldCBhZnRlciBhIGxvbmcgcnVubmluZyBvcGVyYXRpb24gbGlrZSBwcm9jZXNzQWxsKCkuCi0JICovCi0Jdm9pZCByZXNldCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9JU3RydWN0dXJlZFJlY29uY2lsaW5nU3RyYXRlZ3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvSVN0cnVjdHVyZWRSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMDJmODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9JU3RydWN0dXJlZFJlY29uY2lsaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5OwotCi0KLS8qKgotICogSW50ZXJmYWNlIGZvciBzdHJ1Y3R1cmVkIHJlY29uY2lsaW5nIHN0cmF0ZWdpZXMuCi0gKiAKLSAqIEBkZXByZWNhdGVkIGRvZXNuJ3QgbmVlZCB0byBiZSBBUEkgYW5kIG1pZ2h0IGdvIGF3YXkKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFJlY29uY2lsaW5nU3RyYXRlZ3kgZXh0ZW5kcyBJUmVjb25jaWxpbmdTdHJhdGVneSB7Ci0JLyoqCi0JICogQWRkcyBhd2FyZW5lc3MgdGhhdCB0aGUgcmVjb25jaWxlciBpcyBwcm9jZXNzaW5nIHRoZSBlbnRpcmUgZG9jdW1lbnQKLQkgKiB2aWEgcmVmcmVzaEFsbCBmbGFnLgotCSAqIAotCSAqIEBwYXJhbSBkaXJ0eVJlZ2lvbgotCSAqIEBwYXJhbSBzdWJSZWdpb24KLQkgKiBAcGFyYW0gcmVmcmVzaEFsbAotCSAqLwotCXB1YmxpYyB2b2lkIHJlY29uY2lsZShEaXJ0eVJlZ2lvbiBkaXJ0eVJlZ2lvbiwgSVJlZ2lvbiBzdWJSZWdpb24sIGJvb2xlYW4gcmVmcmVzaEFsbCk7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJlc2V0IHRoZSBzdGF0ZSBvZiB0aGUgU3RyYXRlZ3kuIEZvciBleGFtcGxlOiBhbnkgZmxhZ3MgdGhhdAotCSAqIG5lZWQgdG8gYmUgcmVzZXQgYWZ0ZXIgYSBsb25nIHJ1bm5pbmcgb3BlcmF0aW9uIGxpa2UgcHJvY2Vzc0FsbCgpLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL1JlY29uY2lsZUFubm90YXRpb25LZXkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvUmVjb25jaWxlQW5ub3RhdGlvbktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTI4NGEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvUmVjb25jaWxlQW5ub3RhdGlvbktleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVTdGVwOwotCi0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SVJlY29uY2lsZUFubm90YXRpb25LZXk8L2NvZGU+IG5vdGU6IGNsaWVudHMKLSAqIHNob3VsZCB1c2UgdGhlIG1ldGhvZCBTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCNjcmVhdGVLZXkoU3RyaW5nCi0gKiBwYXJ0aXRpb25UeXBlLCBpbnQgc2NvcGUpCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IHsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJUSUFMID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1RBTCA9IDA7Ci0gICAgCi0JcHJpdmF0ZSBTdHJpbmcgZlBhcnRpdGlvblR5cGUgPSBudWxsOwotCi0JcHJpdmF0ZSBJUmVjb25jaWxlU3RlcCBmUmVjb25jaWxlU3RlcCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZlNjb3BlOwotCi0JcHVibGljIFJlY29uY2lsZUFubm90YXRpb25LZXkoSVJlY29uY2lsZVN0ZXAgc3RlcCwgU3RyaW5nIHBhcnRpdGlvblR5cGUsIGludCBzY29wZSkgewotCQlmUmVjb25jaWxlU3RlcCA9IHN0ZXA7Ci0JCWZQYXJ0aXRpb25UeXBlID0gcGFydGl0aW9uVHlwZTsKLQkJZlNjb3BlID0gc2NvcGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKCkgewotCQlyZXR1cm4gZlBhcnRpdGlvblR5cGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRTY29wZSgpIHsKLQkJcmV0dXJuIGZTY29wZTsKLQl9Ci0KLQlwdWJsaWMgSVJlY29uY2lsZVN0ZXAgZ2V0U3RlcCgpIHsKLQkJcmV0dXJuIGZSZWNvbmNpbGVTdGVwOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkgKyAiXHJcbmlkOiAiICsgZlBhcnRpdGlvblR5cGU7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL1N0cnVjdHVyZWRSZWNvbmNpbGVTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL1N0cnVjdHVyZWRSZWNvbmNpbGVTdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOGIwYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9TdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkFic3RyYWN0UmVjb25jaWxlU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGFibGVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotLyoqCi0gKiBSZWNvbmNpbGVTdGVwIHRoYXQga25vd3MgYWJvdXQgdGhlIGFubm90YXRpb24gdGhhdCBpdCBhZGRzIHRvIHRoZQotICogQW5ub3RhdGlvbk1vZGVsLiBJdCBrbm93cyBob3cgdG8gY3JlYXRlIGFuIGFubm90YXRpb24ga2V5IChmb3Igc21hcnQKLSAqIHJlbW92YWwgbGF0ZXIpIEl0IGtub3dzIHRoZSBwYXJ0aXRpb24gdHlwZXMgb24gd2hpY2ggaXQgY2FuIG9wZXJhdGUuIEl0Ci0gKiBrbm93cyB0aGUgc2NvcGUgb24gd2hpY2ggaXQgb3BlcmF0ZXMgKGZvciBzaG9ydCBjaXJjdWl0aW5nKSBJdCBrbm93cyBpZiB0aGUKLSAqIFJlY29uY2lsZXIgaXMgcmVjb25jaWxpbmcgdGhlIGVudGlyZSBkb2N1bWVudC4KLSAqIAotICogQ2xpZW50cyBtdXN0IHN1YmNsYXNzIHRoaXMgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCBleHRlbmRzIEFic3RyYWN0UmVjb25jaWxlU3RlcCBpbXBsZW1lbnRzIElSZWxlYXNhYmxlIHsKLQotCS8qKiBkZWJ1ZyBmbGFnICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2RlYnVnL3JlY29uY2lsZXJqb2IiKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIElSZWNvbmNpbGVSZXN1bHRbXSBFTVBUWV9SRUNPTkNJTEVfUkVTVUxUX1NFVCA9IG5ldyBJUmVjb25jaWxlUmVzdWx0WzBdOwotCQotCS8qKgotCSAqIEl0J3MgcG9zc2libGUgZm9yIGEgcGFydGlhbCBzdGVwIHRvIGdldCBjYWxsZWQgb24gdGhlIHNhbWUgYXJlYSB0d2ljZQotCSAqIChhcyB3LyBhIGZ1bGwgZG9jdW1lbnQgcmVjb25jaWxlKSB0aGlzIGxpc3Qga2VlcHMgdHJhY2sgb2YgYXJlYSBhbHJlYWR5Ci0JICogY292ZXJlZC4gU2hvdWxkIGJlIHJlc2V0KCkgYWZ0ZXIgdGhlICJiYXRjaCIgb2YgcmVjb25jaWxpbmcgaXMKLQkgKiBmaW5pc2hlZC4KLQkgKi8KLQlwcml2YXRlIEhhc2hTZXQgZlBhcnRpdGlvblR5cGVzID0gbnVsbDsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCgpIHsKLQkJc3VwZXIoKTsKLQkJZlBhcnRpdGlvblR5cGVzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQlwdWJsaWMgUmVjb25jaWxlQW5ub3RhdGlvbktleSBjcmVhdGVLZXkoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiwgaW50IHNjb3BlKSB7Ci0KLQkJSVR5cGVkUmVnaW9uIHRyID0gZ2V0UGFydGl0aW9uKHNkUmVnaW9uKTsKLQkJU3RyaW5nIHBhcnRpdGlvblR5cGUgPSAodHIgIT0gbnVsbCkgPyB0ci5nZXRUeXBlKCkgOiBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT047Ci0JCXJldHVybiBjcmVhdGVLZXkocGFydGl0aW9uVHlwZSwgc2NvcGUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZFJlZ2lvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCUlUeXBlZFJlZ2lvbiB0ciA9IG51bGw7Ci0JCWlmICghc2RSZWdpb24uaXNEZWxldGVkKCkpCi0JCQl0ciA9IGdldFBhcnRpdGlvbihzZFJlZ2lvbi5nZXRQYXJlbnREb2N1bWVudCgpLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJcmV0dXJuIHRyOwotCX0KLQotCXByaXZhdGUgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihJRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0KSB7Ci0JCUlUeXBlZFJlZ2lvbiB0ciA9IG51bGw7Ci0JCS8vIG5vdCBzdXJlIHdoeSBkb2N1bWVudCB3b3VsZCBldmVyIGJlIG51bGwsIGJ1dCBwdXQgaW4gdGhpcyAKLQkJLy8gZ3VhcmQgZm9yIAotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODYwNjkKLQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXRyID0gVGV4dFV0aWxpdGllcy5nZXRQYXJ0aXRpb24oZG9jLCBJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCBvZmZzZXQsIGZhbHNlKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInByb2JsZW0gZ2V0dGluZyBwYXJ0aXRpb24gYXQ6ICIgKyBvZmZzZXQsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRyOwotCX0KLQotCS8qKgotCSAqIENsaWVudHMgc2hvdWxkIHVzZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYW5ub3RhdGlvbiBrZXlzIGFzIGl0Ci0JICogcmVnaXN0ZXJzIHRoZSBrZXkgZm9yIHJlbW92YWwgbGF0ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKiBAcGFyYW0gc2NvcGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFJlY29uY2lsZUFubm90YXRpb25LZXkgY3JlYXRlS2V5KFN0cmluZyBwYXJ0aXRpb25UeXBlLCBpbnQgc2NvcGUpIHsKLQkJZlBhcnRpdGlvblR5cGVzLmFkZChwYXJ0aXRpb25UeXBlKTsKLQkJcmV0dXJuIG5ldyBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KHRoaXMsIHBhcnRpdGlvblR5cGUsIHNjb3BlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJSVJlY29uY2lsYWJsZU1vZGVsIHJNb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChyTW9kZWwgaW5zdGFuY2VvZiBEb2N1bWVudEFkYXB0ZXIpIHsKLQkJCWRvYyA9ICgoRG9jdW1lbnRBZGFwdGVyKSByTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLQlwdWJsaWMgSVJlY29uY2lsYWJsZU1vZGVsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gZ2V0SW5wdXRNb2RlbCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0KSB7Ci0JCUlUeXBlZFJlZ2lvbiB0ciA9IGdldFBhcnRpdGlvbihkb2MsIG9mZnNldCk7Ci0JCXJldHVybiAodHIgIT0gbnVsbCkgPyB0ci5nZXRUeXBlKCkgOiBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT047Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFBhcnRpdGlvblR5cGVzKCkgewotCQkvLyB1c2luZyBoYXNoIHNldCB0byBhdXRvbWF0aWNhbGx5IGdldCByaWQgb2YgZHVwZXMKLQkJSGFzaFNldCB0ZW1wUmVzdWx0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCS8vIGFkZCB0aGVzZSBwYXJ0aXRpb24gdHlwZXMKLQkJdGVtcFJlc3VsdHMuYWRkQWxsKGZQYXJ0aXRpb25UeXBlcyk7Ci0JCXJldHVybiAoU3RyaW5nW10pIHRlbXBSZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1t0ZW1wUmVzdWx0cy5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc0RvYyA9IG51bGw7Ci0JCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCQlpZiAoZG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkKLQkJCXNEb2MgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZ2V0RG9jdW1lbnQoKTsKLQkJcmV0dXJuIHNEb2M7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBkdXBsaWNhdGVzLgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRzMQotCSAqIEBwYXJhbSByZXN1bHRzMgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSVJlY29uY2lsZVJlc3VsdFtdIG1lcmdlKElSZWNvbmNpbGVSZXN1bHRbXSByZXN1bHRzMSwgSVJlY29uY2lsZVJlc3VsdFtdIHJlc3VsdHMyKSB7Ci0JCWlmIChyZXN1bHRzMSA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdHMyOwotCQlpZiAocmVzdWx0czIgPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHRzMTsKLQotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdHMuYWRkQWxsKEFycmF5cy5hc0xpc3QocmVzdWx0czEpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRzMi5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0cy5hZGQocmVzdWx0czJbaV0pOwotCQl9Ci0JCXJldHVybiAoSVJlY29uY2lsZVJlc3VsdFtdKSByZXN1bHRzLnRvQXJyYXkobmV3IElSZWNvbmNpbGVSZXN1bHRbcmVzdWx0cy5zaXplKCldKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5BYnN0cmFjdFJlY29uY2lsZVN0ZXAjcmVjb25jaWxlTW9kZWwob3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkRpcnR5UmVnaW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXByb3RlY3RlZCBJUmVjb25jaWxlUmVzdWx0W10gcmVjb25jaWxlTW9kZWwoRGlydHlSZWdpb24gZGlydHlSZWdpb24sIElSZWdpb24gc3ViUmVnaW9uKSB7Ci0JCXJldHVybiBFTVBUWV9SRUNPTkNJTEVfUkVTVUxUX1NFVDsKLQl9Ci0KLQkvKioKLQkgKiBSZWxlYXNlIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBzdGVwIGhlcmUgYXMgbmVlZGVkLiBCZSBzdXJlIHRvIGNhbGwKLQkgKiBzdXBlci5yZWxlYXNlKCkgd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgdG8gcHJvcGFnYXRlIHRoZQotCSAqIHJlbGVhc2UgdGhyb3VnaCBhbGwgc3RlcHMuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9TdHJ1Y3R1cmVkUmVnaW9uUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL1N0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2MWY2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL1N0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkRpcnR5UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5Nb2RlbExpZmVjeWNsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0vKioKLSAqIEFuIElTdHJ1Y3R1cmVkTW9kZWwgYXdhcmUgUmVnaW9uIFByb2Nlc3Nvci4gQWRkcyBNb2RlbExpZmVjeWNsZSBsaXN0ZW5lci4KLSAqIE1vZGVsTGlmZWN5Y2xlIGxpc3RlbmVyIG5vdGlmaWVzIHVzIHRoYXQgc29tZSByZWluaXRpYWxpemF0aW9uIG5lZWRzIHRvCi0gKiB0YWtlIHBsYWNlLgotICogCi0gKiBNb2RlbCBhd2FyZSAicHJvY2VzcygpIiBJbXBsZW1lbnRzIGEgSW5kZXhlZFJlZ2lvbi1iYXNlZCAiY29udGFpbnMoKSIKLSAqIG1ldGhvZCB1c2luZyBJU3RydWN0dXJlZE1vZGVsLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkUmVnaW9uUHJvY2Vzc29yIGV4dGVuZHMgRG9jdW1lbnRSZWdpb25Qcm9jZXNzb3IgewotCi0JY2xhc3MgTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciBpbXBsZW1lbnRzIElNb2RlbExpZmVjeWNsZUxpc3RlbmVyIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBjaGFuZ2luZyA9IG51bGw7Ci0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciNwcm9jZXNzUG9zdE1vZGVsRXZlbnQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLk1vZGVsTGlmZWN5Y2xlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm9jZXNzUG9zdE1vZGVsRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCkgewotCi0JCQkvLyBpZiB1bmRlcmx5aW5nIFN0cnVjdHVyZWREb2N1bWVudCBjaGFuZ2VkLCBuZWVkIHRvIHJlY29ubmVjdCBpdAotCQkJLy8gaGVyZS4uLgotCQkJLy8gZXguIGZpbGUgaXMgbW9kaWZpZWQgb3V0c2lkZSB0aGUgd29ya2JlbmNoCi0JCQlpZiAoZXZlbnQuZ2V0VHlwZSgpID09IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfRE9DVU1FTlRfQ0hBTkdFRCkgewotCQkJCWlmIChjaGFuZ2luZyAhPSBudWxsICYmIGV2ZW50LmdldE1vZGVsKCkgPT0gY2hhbmdpbmcpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzRG9jID0gZXZlbnQuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFJlZ2lvblByb2Nlc3NvcjogRE9DVU1FTlQgTU9ERUwgQ0hBTkdFRCBUTzogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzRG9jLmdldCgpKTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzZXREb2N1bWVudChzRG9jKTsKLQkJCQl9Ci0JCQkJY2hhbmdpbmcgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExpZmVjeWNsZUxpc3RlbmVyI3Byb2Nlc3NQcmVNb2RlbEV2ZW50KG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5Nb2RlbExpZmVjeWNsZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJvY2Vzc1ByZU1vZGVsRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCkgewotCQkJaWYoZkN1cnJlbnREb2MgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsID0gZ2V0U3RydWN0dXJlZE1vZGVsRm9yUmVhZChmQ3VycmVudERvYyk7Ci0JCQkJCWlmIChldmVudC5nZXRUeXBlKCkgPT0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9ET0NVTUVOVF9DSEFOR0VEICYmIGV2ZW50LmdldE1vZGVsKCkgPT0gbW9kZWwpIHsKLQkJCQkJCWNoYW5naW5nID0gZXZlbnQuZ2V0TW9kZWwoKTsKLQkJCQkJCWZsdXNoRGlydHlSZWdpb25RdWV1ZSgpOwotCQkJCQkJLy8gbm90ZTogb2xkIGFubm90YXRpb25zIGFyZSByZW1vdmVkIHZpYSB0aGUgc3RyYXRlZ2llcyBvbgotCQkJCQkJLy8gQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kjc2V0RG9jdW1lbnQoLi4uKQotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbGlmZSBjeWNsZSBsaXN0ZW5lciB1c2VkIHRvIGxpc3RlbiB0byB0aGUgY3VycmVudCBkb2N1bWVudHMgbW9kZWwgZXZlbiB0aG91Z2gKLQkgKiB0aGlzIGNsYXNzIGRvZXMgbm90IGhvbGQgb250byBhIHJlZmVyZW5jZSB0byB0aGUgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciBmTGlmZUN5Y2xlTGlzdGVuZXIgPSBuZXcgTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcigpOwotCS8qKiBVc2VkIHRvIGdldCB0aGUgY3VycmVudCBtb2RlbCBvbiBkZW1hbmQgc28gYSBtb2RlbCBkb2VzIG5vdCBuZWVkIHRvIGJlIGhlbGQgYnkgcGVybWFuZW50bHkgKi8KLQlwcml2YXRlIElEb2N1bWVudCBmQ3VycmVudERvYyA9IG51bGw7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLkRpcnR5UmVnaW9uUHJvY2Vzc29yI2dldE91dGVyUmVnaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbikKLQkgKi8KLQlwcm90ZWN0ZWQgRGlydHlSZWdpb24gZ2V0T3V0ZXJSZWdpb24oRGlydHlSZWdpb24gcm9vdCwgRGlydHlSZWdpb24gcG9zc2libGUpIHsKLQkJLy8gZmlyc3QgdHJ5IHNpbXBsZSByZWdpb24gY2hlY2sgaWYgb25lIHJlZ2lvbiBjb250YWlucyB0aGUgb3RoZXIKLQkJRGlydHlSZWdpb24gb3V0ZXIgPSBzdXBlci5nZXRPdXRlclJlZ2lvbihyb290LCBwb3NzaWJsZSk7Ci0JCWlmIChvdXRlciA9PSBudWxsICYmIGZDdXJyZW50RG9jICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gZ2V0U3RydWN0dXJlZE1vZGVsRm9yUmVhZChmQ3VycmVudERvYyk7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCS8vIG5vdyBjb21wYXJlIG5vZGVzCi0JCQkJCUluZGV4ZWRSZWdpb24gcm9vdFJlZ2lvbiA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHJvb3QuZ2V0T2Zmc2V0KCkpOwotCQkJCQlJbmRleGVkUmVnaW9uIHBvc3NSZWdpb24gPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihwb3NzaWJsZS5nZXRPZmZzZXQoKSk7Ci0JCQkJCWlmIChyb290UmVnaW9uICE9IG51bGwgJiYgcG9zc1JlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgcm9vdFN0YXJ0ID0gcm9vdFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJaW50IHBvc3NTdGFydCA9IHBvc3NSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCS8vIGZpcnN0IGp1c3QgY2hlY2sgaWYgcm9vdHJlZ2lvbiBzdGFydHMgYmVmb3JlCi0JCQkJCQkvLyBwb3NzcmVnaW9uCi0JCQkJCQlpZiAocm9vdFN0YXJ0IDw9IHBvc3NTdGFydCkgewotCQkJCQkJCS8vIGNoZWNrIGlmIHBvc3NyZWdpb24gaXMgaW5zaWRlIHJvb3RyZWdpb24KLQkJCQkJCQlvdXRlciA9IF9nZXRPdXRlclJlZ2lvbihyb290LCBwb3NzaWJsZSwgc01vZGVsLCByb290U3RhcnQsIHBvc3NTdGFydCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBvdGhlcndpc2UgaWYgcm9vdHJlZ2lvbiBpcyBpbnNpZGUgcG9zc3JlZ2lvbgotCQkJCQkJCW91dGVyID0gX2dldE91dGVyUmVnaW9uKHBvc3NpYmxlLCByb290LCBzTW9kZWwsIHBvc3NTdGFydCwgcm9vdFN0YXJ0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gb3V0ZXI7Ci0JfQotCi0JLyoqCi0JICogQXNzdW1lcyB0aGF0IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCByZWdpb24xJ3Mgbm9kZSBzdGFydCBvZmZzZXQgPj0KLQkgKiByZWdpb24yJ3Mgbm9kZSBzdGFydCBvZmZzZXQuIERldGVybWluZXMgaWYgcmVnaW9uMSBjb250YWlucyByZWdpb24yIG9yCi0JICogdmljZSB2ZXJzYS4gUmV0dXJucyByZWdpb24xIGlmOgotCSAqIDx1bD4KLQkgKiA8bGk+cmVnaW9uMSdzIG5vZGUgcmVnaW9uID09IHJlZ2lvbjIncyBub2RlIHJlZ2lvbjwvbGk+Ci0JICogPGxpPnJlZ2lvbjEncyBub2RlIHJlZ2lvbiBjb250YWlucyByZWdpb24yJ3Mgbm9kZSByZWdpb248L2xpPgotCSAqIDwvdWw+Ci0JICogUmV0dXJucyByZWdpb24yIGlmOgotCSAqIDx1bD4KLQkgKiA8bGk+cmVnaW9uMSdzIG5vZGUgcmVnaW9uIGFuZCByZWdpb24yJ3Mgbm9kZSByZWdpb24gc3RhcnRzIGF0IHNhbWUKLQkgKiBvZmZzZXQgYnV0IHJlZ2lvbjIncyBub2RlIHJlZ2lvbiBpcyBsb25nZXI8L2xpPgotCSAqIDwvdWw+Ci0JICogUmV0dXJucyBudWxsIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9uMQotCSAqIEBwYXJhbSByZWdpb24yCi0JICogQHBhcmFtIHNNb2RlbAotCSAqIEBwYXJhbSByZWdpb24xTm9kZVN0YXJ0Ci0JICogQHBhcmFtIHJlZ2lvbjJOb2RlU3RhcnQKLQkgKiBAcmV0dXJuIG91dGVyIGRpcnR5IHJlZ2lvbiBvciBudWxsIGlmIG5vbmUgZXhpc3RzLgotCSAqLwotCXByaXZhdGUgRGlydHlSZWdpb24gX2dldE91dGVyUmVnaW9uKERpcnR5UmVnaW9uIHJlZ2lvbjEsIERpcnR5UmVnaW9uIHJlZ2lvbjIsIElTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsLCBpbnQgcmVnaW9uMU5vZGVTdGFydCwgaW50IHJlZ2lvbjJOb2RlU3RhcnQpIHsKLQkJRGlydHlSZWdpb24gb3V0ZXIgPSBudWxsOwotCQlpbnQgcmVnaW9uMU5vZGVFbmQgPSAtMTsKLQkJaW50IHJlZ2lvbjJOb2RlRW5kID0gLTE7Ci0JCS8vIHRoZW4gY2hlY2sgaWYgcmVnaW9uMSdzIGVuZCBhcHBlYXJzIGFmdGVyCi0JCS8vIHJlZ2lvbjIncyBlbmQKLQkJSW5kZXhlZFJlZ2lvbiByZWdpb24xRW5kTm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHJlZ2lvbjEuZ2V0T2Zmc2V0KCkgKyByZWdpb24xLmdldExlbmd0aCgpKTsKLQkJaWYgKHJlZ2lvbjFFbmROb2RlID09IG51bGwpIHsKLQkJCS8vIGlmIG5vIGVuZCwganVzdCBhc3N1bWUgcmVnaW9uIHNwYW5zIGFsbCB0aGUKLQkJCS8vIHdheSB0byB0aGUgZW5kIHNvIGl0IGluY2x1ZGVzIG90aGVyIHJlZ2lvbgotCQkJb3V0ZXIgPSByZWdpb24xOwotCQl9Ci0JCWVsc2UgewotCQkJcmVnaW9uMU5vZGVFbmQgPSByZWdpb24xRW5kTm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCUluZGV4ZWRSZWdpb24gcmVnaW9uMkVuZE5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihyZWdpb24yLmdldE9mZnNldCgpICsgcmVnaW9uMi5nZXRMZW5ndGgoKSk7Ci0JCQlyZWdpb24yTm9kZUVuZCA9IHJlZ2lvbjJFbmROb2RlICE9IG51bGwgPyByZWdpb24yRW5kTm9kZS5nZXRFbmRPZmZzZXQoKSA6IGdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAocmVnaW9uMU5vZGVFbmQgPj0gcmVnaW9uMk5vZGVFbmQpIHsKLQkJCQkvLyByb290IGNvbnRhaW5zIG9yIGlzIGVxdWFsIHRvIHBvc3NpYmxlCi0JCQkJb3V0ZXIgPSByZWdpb24xOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uMU5vZGVTdGFydCA9PSByZWdpb24yTm9kZVN0YXJ0ICYmIHJlZ2lvbjJOb2RlRW5kID49IHJlZ2lvbjFOb2RlRW5kKSB7Ci0JCQkJLy8gcG9zc2libGUgY29udGFpbnMgcm9vdCBiZWNhdXNlIHRoZXkKLQkJCQkvLyBib3RoIHN0YXJ0IGF0IHNhbWUgcGxhY2UgYnV0IHBvc3NpYmxlCi0JCQkJLy8gaXMgbG9uZ2VyCi0JCQkJb3V0ZXIgPSByZWdpb24yOwotCQkJfQotCQl9Ci0JCWlmIChERUJVRykgewotCQkJaWYgKG91dGVyICE9IG51bGwpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJjaGVja2luZyBpZiBbIiArIHJlZ2lvbjFOb2RlU3RhcnQgKyAiOiIgKyByZWdpb24xTm9kZUVuZCArICJdIGNvbnRhaW5zIFsiICsgcmVnaW9uMk5vZGVTdGFydCArICI6IiArIHJlZ2lvbjJOb2RlRW5kICsgIl0gLi4uICIgKyBvdXRlci50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQllbHNlCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJjaGVja2luZyBpZiBbIiArIHJlZ2lvbjFOb2RlU3RhcnQgKyAiOiIgKyByZWdpb24xTm9kZUVuZCArICJdIGNvbnRhaW5zIFsiICsgcmVnaW9uMk5vZGVTdGFydCArICI6IiArIHJlZ2lvbjJOb2RlRW5kICsgIl0gLi4uIE5PIENPTlRBSU4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCX0KLQkJcmV0dXJuIG91dGVyOwotCX0KLQotCS8qKgotCSAqIFdlIGFscmVhZHkga25vdyBjb250ZW50IHR5cGUgZnJvbSB3aGVuIHdlIGNyZWF0ZWQgdGhlIG1vZGVsLCBzbyBqdXN0Ci0JICogdXNlIHRoYXQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZShJRG9jdW1lbnQgZG9jKSB7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlkID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gZ2V0U3RydWN0dXJlZE1vZGVsRm9yUmVhZChkb2MpOwotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJY29udGVudFR5cGVJZCA9IHNNb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRUeXBlSWQ7Ci0JfQotCi0KLQkvKioKLQkgKiBSZW1lbWJlciB0byByZWxlYXNlIG1vZGVsIGFmdGVyIHVzZSEhCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRTdHJ1Y3R1cmVkTW9kZWxGb3JSZWFkKElEb2N1bWVudCBkb2MpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQlpZiAoZG9jICE9IG51bGwgJiYgZG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkKLQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKChJU3RydWN0dXJlZERvY3VtZW50KSBkb2MpOwotCQlyZXR1cm4gc01vZGVsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3MoRGlydHlSZWdpb24gZGlydHlSZWdpb24pIHsKLQkJaWYgKCFpc0luc3RhbGxlZCgpIHx8IGlzSW5SZXdyaXRlU2Vzc2lvbigpIHx8IGRpcnR5UmVnaW9uID09IG51bGwgfHwgZ2V0RG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIHVuaG9vayBvbGQgbGlmZWN5Y2xlIGxpc3RlbmVyCi0JCWlmKGZDdXJyZW50RG9jICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gZ2V0U3RydWN0dXJlZE1vZGVsRm9yUmVhZChmQ3VycmVudERvYyk7Ci0JCQkJCi0JCQkJLy8gdXNlIHN0cnVjdHVyZWQgbW9kZWwgdG8gZGV0ZXJtaW5lIGFyZWEgdG8gcHJvY2VzcwotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlpbnQgc3RhcnQgPSBkaXJ0eVJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCQkJaW50IGVuZCA9IHN0YXJ0ICsgZGlydHlSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJCUluZGV4ZWRSZWdpb24gaXJTdGFydCA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0KTsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBpckVuZCA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKGVuZCk7Ci0KLQkJCQkJaWYgKGlyU3RhcnQgIT0gbnVsbCkgewotCQkJCQkJc3RhcnQgPSBNYXRoLm1pbihzdGFydCwgaXJTdGFydC5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJfQotCQkJCQlpZiAoaXJFbmQgIT0gbnVsbCkgewotCQkJCQkJZW5kID0gTWF0aC5tYXgoZW5kLCBpckVuZC5nZXRFbmRPZmZzZXQoKSk7Ci0JCQkJCX0KLQkJCQkJc3VwZXIucHJvY2VzcyhjcmVhdGVEaXJ0eVJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQsIERpcnR5UmVnaW9uLklOU0VSVCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXN1cGVyLnByb2Nlc3MoZGlydHlSZWdpb24pOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnByb2Nlc3MoZGlydHlSZWdpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVpbml0aWFsaXplcyBsaXN0ZW5lcnMgYW5kIHNldHMgbmV3IGRvY3VtZW50IG9uYWxsIHN0cmF0ZWdpZXMuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuQWJzdHJhY3RSZWNvbmNpbGVyI3JlY29uY2lsZXJEb2N1bWVudENoYW5nZWQoSURvY3VtZW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlY29uY2lsZXJEb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG5ld0RvY3VtZW50KSB7Ci0JCXNldERvY3VtZW50KG5ld0RvY3VtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgbmV3RG9jdW1lbnQpIHsKLQkJLy8gdW5ob29rIG9sZCBsaWZlY3ljbGUgbGlzdGVuZXIKLQkJaWYoZkN1cnJlbnREb2MgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW9sZE1vZGVsID0gZ2V0U3RydWN0dXJlZE1vZGVsRm9yUmVhZChmQ3VycmVudERvYyk7Ci0JCQkJaWYob2xkTW9kZWwgIT0gbnVsbCkgewotCQkJCQlvbGRNb2RlbC5yZW1vdmVNb2RlbExpZmVjeWNsZUxpc3RlbmVyKGZMaWZlQ3ljbGVMaXN0ZW5lcik7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZihvbGRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCW9sZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy9zZXQgdGhlIG5ldyBkb2N1bWVudAotCQlzdXBlci5zZXREb2N1bWVudChuZXdEb2N1bWVudCk7Ci0JCWZDdXJyZW50RG9jID0gbmV3RG9jdW1lbnQ7Ci0JCQotCQkvLyBhZGQgbmV3IGxpZmVjeWNsZSBsaXN0ZW5lcgotCQlpZiAobmV3RG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW5ld01vZGVsID0gZ2V0U3RydWN0dXJlZE1vZGVsRm9yUmVhZChuZXdEb2N1bWVudCk7Ci0JCQkJaWYobmV3TW9kZWwgIT0gbnVsbCkgewotCQkJCQluZXdNb2RlbC5hZGRNb2RlbExpZmVjeWNsZUxpc3RlbmVyKGZMaWZlQ3ljbGVMaXN0ZW5lcik7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZihuZXdNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCW5ld01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvU3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL1N0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTk1ZDIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvU3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotLyoqCi0gKiBVc2VzIElTdHJ1Y3R1cmVkTW9kZWwgbm9kZXMgdG8gY2hlY2sgIm92ZXJsYXBzKCkiIHdoZW4gZ2V0dGluZyBhbm5vdGF0aW9ucyB0byByZW1vdmUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneSB7Ci0JCi0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCXN1cGVyKHNvdXJjZVZpZXdlcik7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoaXMgcG9zaXRpb24gb3ZlcmxhcHMgYW55IG9mIHRoZSBTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVnaW9ucycKLQkgKiBjb3JyZXN0cG9uZGluZyBJbmRleGVkUmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSBwb3MKLQkgKiBAcGFyYW0gZHIKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBvc2l0aW9uIG92ZXJsYXBzIGFueSBvZiB0aGUgcmVnaW9ucywgb3RoZXJ3aXNlCi0JICogICAgICAgICBmYWxzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvdmVybGFwcyhQb3NpdGlvbiBwb3MsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSBzZFJlZ2lvbnMpIHsKLQkJaW50IHN0YXJ0ID0gLTE7Ci0JCWludCBlbmQgPSAtMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZFJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJICAgIGlmKCFzZFJlZ2lvbnNbaV0uaXNEZWxldGVkKCkpIHsKLSAgICAJCQlJbmRleGVkUmVnaW9uIGNvcnJlc3BvbmRpbmcgPSBnZXRDb3JyZXNwb25kaW5nTm9kZShzZFJlZ2lvbnNbaV0pOwotICAgICAgICAgICAgICAgIGlmKGNvcnJlc3BvbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAJCQlpZiAoc3RhcnQgPT0gLTEgfHwgc3RhcnQgPiBjb3JyZXNwb25kaW5nLmdldFN0YXJ0T2Zmc2V0KCkpCi0gICAgICAgIAkJCQlzdGFydCA9IGNvcnJlc3BvbmRpbmcuZ2V0U3RhcnRPZmZzZXQoKTsKLSAgICAgICAgCQkJaWYgKGVuZCA9PSAtMSB8fCBlbmQgPCBjb3JyZXNwb25kaW5nLmdldEVuZE9mZnNldCgpKQotICAgICAgICAJCQkJZW5kID0gY29ycmVzcG9uZGluZy5nZXRFbmRPZmZzZXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0JCX0KLQkJcmV0dXJuIHBvcy5vdmVybGFwc1dpdGgoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUgZm9yIHRoZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uCi0JICogCi0JICogQHBhcmFtIHNkUmVnaW9uCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBub2RlIGZvciBzZFJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldENvcnJlc3BvbmRpbmdOb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotICAgICAgICBJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHNNb2RlbCAhPSBudWxsKSAKLSAgICAgICAgICAgICAgICBpbmRleGVkUmVnaW9uID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24oc2RSZWdpb24uZ2V0U3RhcnQoKSk7ICAgIAotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNNb2RlbCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvVGVtcG9yYXJ5QW5ub3RhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9UZW1wb3JhcnlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmN2VhOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9UZW1wb3JhcnlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tGaXhhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uQWNjZXNzRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uUHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkltYWdlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRWRpdG9yc1VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQW5ub3RhdGlvblByZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Bbm5vdGF0aW9uUHJlZmVyZW5jZUxvb2t1cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklUZW1wb3JhcnlBbm5vdGF0aW9uOwotCi0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgSVRlbXBvcmFyeUFubm90YXRpb24gQAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIFRlbXBvcmFyeUFubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9uIGltcGxlbWVudHMgSVRlbXBvcmFyeUFubm90YXRpb24sIElSZWNvbmNpbGVSZXN1bHQsIElBbm5vdGF0aW9uUHJlc2VudGF0aW9uLCBJUXVpY2tGaXhhYmxlQW5ub3RhdGlvbiB7Ci0JLy8gcmVtZW1iZXIgdG8gY2hhbmdlIHRoZXNlIGlmIGl0IGNoYW5nZXMgaW4gdGhlIGV4dGVuc2lvbiBwb2ludAotCS8vIG1heSBuZWVkIGEgZGlmZmVyZW50IGhvbWUgZm9yIHRoZW0gaW4gdGhlIGZ1dHVyZSwgYnV0IHRoZXkncmUgaGVyZSBmb3IKLQkvLyBub3cKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVF9FUlJPUiA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuZXJyb3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQU5OT1RfSU5GTyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuaW5mbyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHBhX1RPRE8gd2hhdCBzaG91bGQgdGhlIElEIGJlIGZvciB0aGlzPwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9UX1VOS05PV04gPSBBbm5vdGF0aW9uLlRZUEVfVU5LTk9XTjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVF9XQVJOSU5HID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVtcC53YXJuaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gY29waWVkIGZyb20gQ29tcGlsYXRpb25Vbml0RG9jdW1lbnRQcm92aWRlci5Qcm9ibGVtQW5ub3RhdGlvbgotICAgIC8vWFhYOiBUbyBiZSBmdWxseSBjb3JyZWN0IHRoZXNlIGNvbnN0YW50cyBzaG91bGQgYmUgbm9uLXN0YXRpYwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElORk9fTEFZRVI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19MQVlFUjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFUlJPUl9MQVlFUjsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIEFubm90YXRpb25QcmVmZXJlbmNlTG9va3VwIGxvb2t1cD0gRWRpdG9yc1VJLmdldEFubm90YXRpb25QcmVmZXJlbmNlTG9va3VwKCk7Ci0gICAgICAgIElORk9fTEFZRVI9IGNvbXB1dGVMYXllcigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLmluZm8iLCBsb29rdXApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFdBUk5JTkdfTEFZRVI9IGNvbXB1dGVMYXllcigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLndhcm5pbmciLCBsb29rdXApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEVSUk9SX0xBWUVSPSBjb21wdXRlTGF5ZXIoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVtcC5lcnJvciIsIGxvb2t1cCk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvbXB1dGVMYXllcihTdHJpbmcgYW5ub3RhdGlvblR5cGUsIEFubm90YXRpb25QcmVmZXJlbmNlTG9va3VwIGxvb2t1cCkgewotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb249IG5ldyBBbm5vdGF0aW9uKGFubm90YXRpb25UeXBlLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIEFubm90YXRpb25QcmVmZXJlbmNlIHByZWZlcmVuY2U9IGxvb2t1cC5nZXRBbm5vdGF0aW9uUHJlZmVyZW5jZShhbm5vdGF0aW9uKTsKLSAgICAgICAgaWYgKHByZWZlcmVuY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwcmVmZXJlbmNlLmdldFByZXNlbnRhdGlvbkxheWVyKCkgKyAxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gSUFubm90YXRpb25BY2Nlc3NFeHRlbnNpb24uREVGQVVMVF9MQVlFUiArIDE7Ci0gICAgfQotICAgIAotICAgIAotCXByaXZhdGUgT2JqZWN0IGZBZGRpdGlvbmFsRml4SW5mbyA9IG51bGw7Ci0KLQlwcml2YXRlIE9iamVjdCBmS2V5ID0gbnVsbDsKLQlwcml2YXRlIFBvc2l0aW9uIGZQb3NpdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZkF0dHJpYnV0ZXMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmSXNRdWlja0ZpeGFibGUgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzUXVpY2tGaXhhYmxlU3RhdGVTZXQgPSBmYWxzZTsKLQotCXByaXZhdGUgaW50IGZQcm9ibGVtSUQ7Ci0KLSAgICBwcml2YXRlIGludCBmTGF5ZXIgPSBERUZBVUxUX0xBWUVSOwotICAgIAotICAgIHByaXZhdGUgSW1hZ2UgZkltYWdlID0gbnVsbDsKLQotCXB1YmxpYyBUZW1wb3JhcnlBbm5vdGF0aW9uKFBvc2l0aW9uIHAsIFN0cmluZyB0eXBlLCBTdHJpbmcgbWVzc2FnZSwgUmVjb25jaWxlQW5ub3RhdGlvbktleSBrZXkpIHsKLQkJc3VwZXIoKTsKLQkJZlBvc2l0aW9uID0gcDsKLQkJc2V0VHlwZSh0eXBlKTsKLQkJZktleSA9IGtleTsKLQkJc2V0VGV4dChtZXNzYWdlKTsKLSAgICAgICAgaW5pdExheWVyKCk7Ci0gICAgICAgIGluaXRJbWFnZSgpOwotCX0KLQotCXB1YmxpYyBUZW1wb3JhcnlBbm5vdGF0aW9uKFBvc2l0aW9uIHAsIFN0cmluZyB0eXBlLCBTdHJpbmcgbWVzc2FnZSwgUmVjb25jaWxlQW5ub3RhdGlvbktleSBrZXksIGludCBwcm9ibGVtSWQpIHsKLQkJc3VwZXIoKTsKLQkJZlBvc2l0aW9uID0gcDsKLQkJZktleSA9IGtleTsKLQkJc2V0VHlwZSh0eXBlKTsKLQkJc2V0VGV4dChtZXNzYWdlKTsKLQkJZlByb2JsZW1JRCA9IHByb2JsZW1JZDsKLSAgICAgICAgaW5pdExheWVyKCk7Ci0gICAgICAgIGluaXRJbWFnZSgpOwotCX0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0TGF5ZXIoKSB7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgdHlwZSA9IGdldFR5cGUoKTsKLSAgICAgICAgaWYodHlwZS5lcXVhbHMoQU5OT1RfRVJST1IpKSB7Ci0gICAgICAgICAgICBmTGF5ZXIgPSBFUlJPUl9MQVlFUjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKHR5cGUuZXF1YWxzKEFOTk9UX1dBUk5JTkcpKSB7Ci0gICAgICAgICAgICBmTGF5ZXIgPSBXQVJOSU5HX0xBWUVSOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYodHlwZS5lcXVhbHMoQU5OT1RfSU5GTykpIHsKLSAgICAgICAgICAgIGZMYXllciA9IElORk9fTEFZRVI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRJbWFnZSgpIHsKLSAgICAgICAgLy8gbGF0ZXIgd2UgY2FuIGFkZCBzdXBwb3J0IGZvciBxdWljayBmaXggaW1hZ2VzLgotICAgICAgICBTdHJpbmcgdHlwZSA9IGdldFR5cGUoKTsKLSAgICAgICAgaWYodHlwZS5lcXVhbHMoQU5OT1RfRVJST1IpKSB7Ci0gICAgICAgICAgICBmSW1hZ2UgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYodHlwZS5lcXVhbHMoQU5OT1RfV0FSTklORykpIHsKLSAgICAgICAgICAgIGZJbWFnZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZih0eXBlLmVxdWFscyhBTk5PVF9JTkZPKSkgewotICAgICAgICAgICAgZkltYWdlID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkvLyB0aGlzIGNoZWNrIGRvZXNuJ3QgdGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gdGhhdCBhbm5vdGF0aW9uCi0JCS8vIHBvc2l0aW9ucyB0aGF0IGNoYW5nZSBmcm9tIGEgdGV4dCBlZGl0IGJlZm9yZSBpdAotCQkvLyB3ZSBzaG91bGQgYmUgY2hlY2tpbmcgaWYgdGhlIGFubm90YXRpb24gaXMgc3RpbGwgb24gdGhlIHNhbWUgbGluZSwKLQkJLy8gYW5kIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgbGluZSBpcyB0aGUgc2FtZQotCQlpZiAob2JqIGluc3RhbmNlb2YgVGVtcG9yYXJ5QW5ub3RhdGlvbikgewotCi0JCQlUZW1wb3JhcnlBbm5vdGF0aW9uIHRhID0gKFRlbXBvcmFyeUFubm90YXRpb24pIG9iajsKLQotICAgICAgICAgICAgYm9vbGVhbiBzYW1lUG9zaXRpb24gPSB0YS5nZXRQb3NpdGlvbigpLmVxdWFscyh0aGlzLmdldFBvc2l0aW9uKCkpOwotICAgICAgICAgICAgYm9vbGVhbiBzYW1lVGV4dCA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZih0YS5nZXRUZXh0KCkgIT0gbnVsbCAmJiB0aGlzLmdldFRleHQoKSAhPSBudWxsICYmIHRhLmdldFRleHQoKS5lcXVhbHModGhpcy5nZXRUZXh0KCkpKQotICAgICAgICAgICAgICAgIHNhbWVUZXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYodGEuZ2V0VGV4dCggKT09IG51bGwgJiYgdGhpcy5nZXRUZXh0KCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzYW1lVGV4dCA9IHRydWU7Ci0gICAgICAgICAgICAKLQkJCXJldHVybiAgc2FtZVRleHQgJiYgc2FtZVBvc2l0aW9uOwotCQl9Ci0JCXJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRpdGlvbmFsIGluZm8gcmVxdWlyZWQgdG8gZml4IHRoaXMgcHJvYmxlbS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIE9iamVjdCB0aGF0IGNvbnRhaW5zIGFkZGl0aW9uYWwgaW5mbyBvbiBob3cgdG8gZml4IHRoaXMKLQkgKiAgICAgICAgIHByb2JsZW0sIG9yIG51bGwgaWYgdGhlcmUgaXMgbm9uZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRkaXRpb25hbEZpeEluZm8oKSB7Ci0JCXJldHVybiBmQWRkaXRpb25hbEZpeEluZm87Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLklUZW1wb3JhcnlBbm5vdGF0aW9uI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQlyZXR1cm4gZktleTsKLQl9Ci0KLQlwdWJsaWMgUG9zaXRpb24gZ2V0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBmUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm9ibGVtSUQuCi0JICovCi0JcHVibGljIGludCBnZXRQcm9ibGVtSUQoKSB7Ci0JCXJldHVybiBmUHJvYmxlbUlEOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbiNpc1BlcnNpc3RlbnQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdGVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB1c2VmdWwgdG8gZml4aW5nIHRoaXMgcHJvYmxlbS4KLQkgKiAKLQkgKiBAcGFyYW0gYW4KLQkgKiAgICAgICAgICAgIE9iamVjdCB0aGF0IGNvbnRhaW5zIGFkZGl0aW9uYWwgaW5mbyBvbiBob3cgdG8gZml4IHRoaXMKLQkgKiAgICAgICAgICAgIHByb2JsZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsRml4SW5mbyhPYmplY3QgaW5mbykgewotCQlmQWRkaXRpb25hbEZpeEluZm8gPSBpbmZvOwotCQlzZXRRdWlja0ZpeGFibGUodHJ1ZSk7Ci0JfQotCi0gICAgcHVibGljIGludCBnZXRMYXllcigpIHsKLSAgICAgICAgcmV0dXJuIGZMYXllcjsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBAc2VlIEFubm90YXRpb24jcGFpbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYWludChHQyBnYywgQ2FudmFzIGNhbnZhcywgUmVjdGFuZ2xlIHIpIHsKLSAgICAgICAgLy9pbml0aWFsaXplSW1hZ2VzKCk7Ci0gICAgICAgIGlmIChmSW1hZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIEltYWdlVXRpbGl0aWVzLmRyYXdJbWFnZShmSW1hZ2UsIGdjLCBjYW52YXMsIHIsIFNXVC5DRU5URVIsIFNXVC5UT1ApOwotICAgIH0KLSAgICAKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIiIgKyBmUG9zaXRpb24uZ2V0T2Zmc2V0KCkgKyAnOicgKyBmUG9zaXRpb24uZ2V0TGVuZ3RoKCkgKyAiOiAiICsgZ2V0VGV4dCgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JcHVibGljIE1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZkF0dHJpYnV0ZXM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoTWFwIGF0dHJpYnV0ZXMpIHsKLQkJZkF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1F1aWNrRml4YWJsZSgpIHsKLQkJcmV0dXJuIGZJc1F1aWNrRml4YWJsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UXVpY2tGaXhhYmxlKGJvb2xlYW4gc3RhdGUpIHsKLQkJZklzUXVpY2tGaXhhYmxlID0gc3RhdGU7Ci0JCWZJc1F1aWNrRml4YWJsZVN0YXRlU2V0ID0gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNRdWlja0ZpeGFibGVTdGF0ZVNldCgpIHsKLQkJcmV0dXJuIGZJc1F1aWNrRml4YWJsZVN0YXRlU2V0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL0Fubm90YXRpb25JbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9Bbm5vdGF0aW9uSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDk0MjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL0Fubm90YXRpb25JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogSG9sZHMgaW5mbyB0byBjcmVhdGUgYSBUZW1wb3JhcnlBbm5vdGF0aW9uLgotICoKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25JbmZvIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19QUk9CTEVNX0lEID0gLTE7Ci0JcHJpdmF0ZQlJTWVzc2FnZSBmTWVzc2FnZSA9IG51bGw7Ci0JcHJpdmF0ZSBPYmplY3QgZkFkZGl0aW9uYWxGaXhJbmZvID0gbnVsbDsKLQlwcml2YXRlIGludCBmUHJvYmxlbUlkID0gTk9fUFJPQkxFTV9JRDsKLQkKLQlwdWJsaWMgQW5ub3RhdGlvbkluZm8oSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlmTWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCQotCX0KLQlwdWJsaWMgQW5ub3RhdGlvbkluZm8oSU1lc3NhZ2UgbWVzc2FnZSwgaW50IHByb2JsZW1JZCwgT2JqZWN0IGFkZGl0aW9uYWxGaXhJbmZvKSB7Ci0JCXRoaXMobWVzc2FnZSk7Ci0JCWZQcm9ibGVtSWQgPSBwcm9ibGVtSWQ7Ci0JCWZBZGRpdGlvbmFsRml4SW5mbyA9IGFkZGl0aW9uYWxGaXhJbmZvOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgSU1lc3NhZ2UgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIGZNZXNzYWdlOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldEFkZGl0aW9uYWxGaXhJbmZvKCkgewotCQlyZXR1cm4gZkFkZGl0aW9uYWxGaXhJbmZvOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgaW50IGdldFByb2JsZW1JZCgpIHsKLQkJcmV0dXJuIGZQcm9ibGVtSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvSVNvdXJjZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvSVNvdXJjZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTA5OTc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL0lTb3VyY2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotCi0vKioKLSAqIEludGVyZmFjZSB0byBhbGxvdyBmb3IgInBhcnRpYWwgZG9jdW1lbnQiIGFzIHlvdSB0eXBlIHZhbGlkYXRpb24uCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTb3VyY2VWYWxpZGF0b3IgewotCQotCS8qKgotCSAqIEFzIHlvdSB0eXBlIHZhbGlkYXRpb24gaXMgZ2V0dGluZyAiaG9va2VkIHVwIiB0byB0aGlzIElEb2N1bWVudC4KLQkgKiBUaGlzIGlzIHRoZSBpbnN0YW5jZSBvZiBJRG9jdW1lbnQgdGhhdCB0aGUgdmFsaWRhdG9yIHNob3VsZAotCSAqIG9wZXJhdGUgb24gZm9yIGVhY2ggdmFsaWRhdGUgY2FsbC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKi8KLQl2b2lkIGNvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KTsKLQkKLQkvKioKLQkgKiBUaGUgc2FtZSBJRG9jdW1lbnQgcGFzc2VkIGluIGZyb20gdGhlIGNvbm5lY3QoKSBtZXRob2QuCi0JICogVGhpcyBpbmRpY2F0ZXMgdGhhdCBhcyB5b3UgdHlwZSB2YWxpZGF0aW9uIGlzICJzaHV0dGluZyBkb3duIgotCSAqIGZvciB0aGlzIElEb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKi8KLQl2b2lkIGRpc2Nvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KTsKLQkKLQkvKioKLQkgKiBMaWtlIElWYWxpZGF0b3IjdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKQotCSAqIGV4Y2VwdCBwYXNzZXMgdGhlIGRpcnR5IHJlZ2lvbiwgc28gZG9jdW1lbnQgdmFsaWRhdGlvbiBjYW4gYmUgYmV0dGVyCi0JICogb3B0aW1pemVkLgotCSAqIAotCSAqIEBwYXJhbSBkaXJ0eVJlZ2lvbgotCSAqIEBwYXJhbSBoZWxwZXIKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKi8KLQl2b2lkIHZhbGlkYXRlKElSZWdpb24gZGlydHlSZWdpb24sIElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9JbmNyZW1lbnRhbEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvSW5jcmVtZW50YWxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYxNTE2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9JbmNyZW1lbnRhbEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLQotCi0KLXB1YmxpYyBjbGFzcyBJbmNyZW1lbnRhbEhlbHBlciBpbXBsZW1lbnRzIElWYWxpZGF0aW9uQ29udGV4dCB7Ci0JcHJpdmF0ZSBJUHJvamVjdCBmUHJvamVjdDsKLQotCXByaXZhdGUgU3RyaW5nIGZVUkkgPSBudWxsOwotCQotCXB1YmxpYyBJbmNyZW1lbnRhbEhlbHBlcihJRG9jdW1lbnQgc291cmNlRG9jdW1lbnQsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIoKTsKLQkJZlByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydGFibGVOYW1lKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBmUHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGxvYWRNb2RlbChTdHJpbmcgc3ltYm9saWNOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUsIE9iamVjdFtdIHBhcm1zKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVSSShTdHJpbmcgdXJpKSB7Ci0JCWZVUkkgPSB1cmk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRVUklzKCkgewotCQlpZihmVVJJICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde2ZVUkl9OwotCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9JbmNyZW1lbnRhbFJlcG9ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9JbmNyZW1lbnRhbFJlcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYzhlMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvSW5jcmVtZW50YWxSZXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0KLS8qKgotICogUmlnaHQgbm93IHdlJ2xsIG9ubHkgdXNlIG9uZSByZXBvcnRlciBwZXIgdmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgSW5jcmVtZW50YWxSZXBvcnRlciBpbXBsZW1lbnRzIElSZXBvcnRlciB7Ci0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3I7Ci0JcHJpdmF0ZSBIYXNoTWFwIG1lc3NhZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBJbmNyZW1lbnRhbFJlcG9ydGVyKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCWZQcm9ncmVzc01vbml0b3IgPSBwcm9ncmVzc01vbml0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShJVmFsaWRhdG9yIHZhbGlkYXRvciwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UpOwotCQlhZGRBbm5vdGF0aW9uSW5mbyh2YWxpZGF0b3IsIGluZm8pOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZEFubm90YXRpb25JbmZvKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBBbm5vdGF0aW9uSW5mbyBpbmZvKSB7Ci0JCU9iamVjdCBleGlzdGluZ1ZhbHVlID0gbWVzc2FnZXMuZ2V0KHZhbGlkYXRvcik7Ci0JCWlmIChleGlzdGluZ1ZhbHVlICE9IG51bGwpIHsKLQkJCSgoSGFzaFNldCkgZXhpc3RpbmdWYWx1ZSkuYWRkKGluZm8pOwotCQl9Ci0JCWVsc2UgewotCQkJSGFzaFNldCBuZXdWYWx1ZSA9IG5ldyBIYXNoU2V0KDEpOwotCQkJbmV3VmFsdWUuYWRkKGluZm8pOwotCQkJbWVzc2FnZXMucHV0KHZhbGlkYXRvciwgbmV3VmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcGxheVN1YnRhc2soSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaWYgKChtZXNzYWdlID09IG51bGwpIHx8IChtZXNzYWdlLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZlByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7Ci0JCQlmUHJvZ3Jlc3NNb25pdG9yLnN1YlRhc2sobWVzc2FnZS5nZXRUZXh0KHZhbGlkYXRvci5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gbWVzc2FnZXMgaXMgYSBsaXN0IG9mOgotCQkvLyB2YWxpZGF0b3JzID0+IEhhc2hTZXQoQW5ub3RhdGlvbkluZm8xLCBBbm5vdGF0aW9uSW5mbzIsIC4uLikKLQkJLy8gKG9uZSBIYXNoU2V0IHBlciB2YWxpZGF0b3IuLi4pCi0JCU9iamVjdFtdIGxpc3RzID0gbWVzc2FnZXMudmFsdWVzKCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJdGVyYXRvciBpdCA9ICgoSGFzaFNldClsaXN0c1tpXSkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gKEFubm90YXRpb25JbmZvKSBpdC5uZXh0KCk7Ci0JCQkJcmVzdWx0LmFkZChpbmZvLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb25JbmZvW10gZ2V0QW5ub3RhdGlvbkluZm8oKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlPYmplY3RbXSBpbmZvcyA9IG1lc3NhZ2VzLnZhbHVlcygpLnRvQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0LmFkZEFsbCgoSGFzaFNldClpbmZvc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIChBbm5vdGF0aW9uSW5mb1tdKXJlc3VsdC50b0FycmF5KG5ldyBBbm5vdGF0aW9uSW5mb1tyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7Ci0JCWlmIChmUHJvZ3Jlc3NNb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBmUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlPYmplY3QgbyA9IG1lc3NhZ2VzLmdldCh2YWxpZGF0b3IpOwotCQlpZihvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIEhhc2hTZXQpIHsKLQkJCSgoSGFzaFNldClvKS5jbGVhcigpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBvYmplY3QpIHsKLQkJcmVtb3ZlQWxsTWVzc2FnZXModmFsaWRhdG9yKTsKLQl9Ci0KLQkvLyBncm91cCBuYW1lcyBhcmUgdW5zdXBwb3J0ZWQKLQlwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlU3Vic2V0KElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3Qgb2JqLCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0JCXJlbW92ZUFsbE1lc3NhZ2VzKHZhbGlkYXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvUmVjb25jaWxlU3RlcEZvclZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvUmVjb25jaWxlU3RlcEZvclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGI0MWNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1JlY29uY2lsZVN0ZXBGb3JWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucXVpY2thc3Npc3QuSVF1aWNrQXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsYWJsZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLkRvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5JUmVjb25jaWxlQW5ub3RhdGlvbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5SZWNvbmNpbGVBbm5vdGF0aW9uS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlRlbXBvcmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLQotLyoqCi0gKiBBIHJlY29uY2lsZSBzdGVwIGZvciBhbiBJVmFsaWRhdG9yIGZvciByZWNvbmNpbGUuIFVzZWQgdGhlIHJlY29uY2lsZQotICogZnJhbWV3b3JrIHRvIGNyZWF0ZSBUZW1wb3JhcnlBbm5vdGF0aW9ucyBmcm9tIHRoZSB2YWxpZGF0b3IgbWVzc2FnZXMuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZWNvbmNpbGVTdGVwRm9yVmFsaWRhdG9yIGV4dGVuZHMgU3RydWN0dXJlZFJlY29uY2lsZVN0ZXAgewotCi0JLyoqIGRlYnVnIGZsYWcgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvcmVjb25jaWxlcmpvYiIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIGZpbmFsIElSZWNvbmNpbGVSZXN1bHRbXSBFTVBUWV9SRUNPTkNJTEVfUkVTVUxUX1NFVCA9IG5ldyBJUmVjb25jaWxlUmVzdWx0WzBdOwotCXByaXZhdGUgSW5jcmVtZW50YWxIZWxwZXIgZkhlbHBlciA9IG51bGw7Ci0JcHJpdmF0ZSBJbmNyZW1lbnRhbFJlcG9ydGVyIGZSZXBvcnRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBEZWNsYXJlZCBzY29wZSBvZiB0aGlzIHZhbGlkYXRvciwgZWl0aGVyIFJlY29uY2lsZUFubm90YXRpb25LZXkuVE9UQUwKLQkgKiBvciBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlBBUlRJQUwKLQkgKi8KLQlwcml2YXRlIGludCBmU2NvcGUgPSAtMTsKLQlwcml2YXRlIElWYWxpZGF0b3IgZlZhbGlkYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUVVJQ0tBU1NJU1RQUk9DRVNTT1IgPSBJUXVpY2tBc3Npc3RQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpOwotCi0KLQlwdWJsaWMgUmVjb25jaWxlU3RlcEZvclZhbGlkYXRvcihJVmFsaWRhdG9yIHYsIGludCBzY29wZSkgewotCQlzdXBlcigpOwotCi0JCWlmICh2ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ2YWxpZGF0b3IgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZWYWxpZGF0b3IgPSB2OwotCQlmU2NvcGUgPSBzY29wZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIG1hcCBvZiBJVmFsaWRhdG9yRm9yUmVjb25jaWxlIHRvIExpc3QgdG8gYW5ub3RhdGlvbnMgYmFzZWQKLQkgKiBvbiB0aG9zZSBtZXNzYWdlcwotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlcwotCSAqIEByZXR1cm4KLQkgKi8KLQkvLyBwcm90ZWN0ZWQgSVJlY29uY2lsZVJlc3VsdFtdIGNyZWF0ZUFubm90YXRpb25zKExpc3QgbWVzc2FnZUxpc3QpIHsKLQkvLyBMaXN0IGFubm90YXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkvLyBJTWVzc2FnZSB2YWxpZGF0aW9uTWVzc2FnZSA9IChJTWVzc2FnZSkgbWVzc2FnZUxpc3QuZ2V0KGkpOwotCS8vCi0JLy8gaW50IG9mZnNldCA9IHZhbGlkYXRpb25NZXNzYWdlLmdldE9mZnNldCgpOwotCS8vCi0JLy8gaWYgKG9mZnNldCA8IDApCi0JLy8gY29udGludWU7Ci0JLy8KLQkvLyBTdHJpbmcgbWVzc2FnZVRleHQgPSBudWxsOwotCS8vIHRyeSB7Ci0JLy8gbWVzc2FnZVRleHQgPQotCS8vIHZhbGlkYXRpb25NZXNzYWdlLmdldFRleHQodmFsaWRhdGlvbk1lc3NhZ2UuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLQkvLyB9Ci0JLy8gY2F0Y2ggKEV4Y2VwdGlvbiB0KSB7Ci0JLy8gTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIHJlcG9ydGluZyBtZXNzYWdlIGZyb20gdmFsaWRhdG9yIiwgdCk7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCS8vIGNvbnRpbnVlOwotCS8vIH0KLQkvLwkJCQotCS8vIFN0cmluZyB0eXBlID0gZ2V0U2V2ZXJpdHkodmFsaWRhdGlvbk1lc3NhZ2UpOwotCS8vIC8vIHRoaXMgcG9zaXRpb24gc2VlbXMgbGlrZSBpdCB3b3VsZCBiZSBwb3NzaWJseSBiZSB0aGUgd3JvbmcKLQkvLyAvLyBsZW5ndGgKLQkvLyBpbnQgbGVuZ3RoID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0TGVuZ3RoKCk7Ci0JLy8gaWYgKGxlbmd0aCA+PSAwKSB7Ci0JLy8gUG9zaXRpb24gcCA9IG5ldyBQb3NpdGlvbihvZmZzZXQsIGxlbmd0aCk7Ci0JLy8gUmVjb25jaWxlQW5ub3RhdGlvbktleSBrZXkgPSBjcmVhdGVLZXkoZ2V0UGFydGl0aW9uVHlwZShnZXREb2N1bWVudCgpLAotCS8vIG9mZnNldCksIGdldFNjb3BlKCkpOwotCS8vIGFubm90YXRpb25zLmFkZChuZXcgVGVtcG9yYXJ5QW5ub3RhdGlvbihwLCB0eXBlLCBtZXNzYWdlVGV4dCwga2V5KSk7Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vIHJldHVybiAoSVJlY29uY2lsZVJlc3VsdFtdKSBhbm5vdGF0aW9ucy50b0FycmF5KG5ldwotCS8vIElSZWNvbmNpbGVSZXN1bHRbYW5ub3RhdGlvbnMuc2l6ZSgpXSk7Ci0JLy8gfQotCS8qKgotCSAqIENvbnZlcnRzIGEgbWFwIG9mIElWYWxpZGF0b3JGb3JSZWNvbmNpbGUgdG8gTGlzdCB0byBhbm5vdGF0aW9ucyBiYXNlZAotCSAqIG9uIHRob3NlIG1lc3NhZ2VzCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2VzCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJUmVjb25jaWxlUmVzdWx0W10gY3JlYXRlQW5ub3RhdGlvbnMoQW5ub3RhdGlvbkluZm9bXSBpbmZvcykgewotCi0KLQkJTGlzdCBhbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcy5sZW5ndGg7IGkrKykgewotCi0JCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gaW5mb3NbaV07Ci0KLQkJCUlNZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlID0gaW5mby5nZXRNZXNzYWdlKCk7Ci0JCQlpbnQgb2Zmc2V0ID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0T2Zmc2V0KCk7Ci0JCQlpZiAob2Zmc2V0IDwgMCkKLQkJCQljb250aW51ZTsKLQotCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbWVzc2FnZVRleHQgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRUZXh0KHZhbGlkYXRpb25NZXNzYWdlLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIHQpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gcmVwb3J0aW5nIG1lc3NhZ2UgZnJvbSB2YWxpZGF0b3IiLCB0KTsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIHR5cGUgPSBnZXRTZXZlcml0eSh2YWxpZGF0aW9uTWVzc2FnZSk7Ci0JCQkvLyB0aGlzIHBvc2l0aW9uIHNlZW1zIGxpa2UgaXQgd291bGQgYmUgcG9zc2libHkgYmUgdGhlIHdyb25nCi0JCQkvLyBsZW5ndGgKLQkJCWludCBsZW5ndGggPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRMZW5ndGgoKTsKLQkJCWlmIChsZW5ndGggPj0gMCkgewotCi0JCQkJUG9zaXRpb24gcCA9IG5ldyBQb3NpdGlvbihvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJUmVjb25jaWxlQW5ub3RhdGlvbktleSBrZXkgPSBjcmVhdGVLZXkoZ2V0UGFydGl0aW9uVHlwZShnZXREb2N1bWVudCgpLCBvZmZzZXQpLCBnZXRTY29wZSgpKTsKLQotCQkJCS8vIGNyZWF0ZSBhbiBhbm5vdGF0aW9uIHcvIHByb2JsZW0gSUQgYW5kIGZpeCBpbmZvCi0JCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbmV3IFRlbXBvcmFyeUFubm90YXRpb24ocCwgdHlwZSwgbWVzc2FnZVRleHQsIGtleSk7Ci0JCQkJT2JqZWN0IGV4dHJhSW5mbyA9IGluZm8uZ2V0QWRkaXRpb25hbEZpeEluZm8oKTsKLQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcwOTg4Ci0JCQkJLy8gYWRkIHF1aWNrIGZpeCBpbmZvcm1hdGlvbgotCQkJCWlmIChleHRyYUluZm8gPT0gbnVsbCkgewotCQkJCQlleHRyYUluZm8gPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRBdHRyaWJ1dGUoUVVJQ0tBU1NJU1RQUk9DRVNTT1IpOwotCQkJCX0KLQkJCQlhbm5vdGF0aW9uLnNldEFkZGl0aW9uYWxGaXhJbmZvKGV4dHJhSW5mbyk7Ci0JCQkJYW5ub3RhdGlvbi5zZXRBdHRyaWJ1dGVzKHZhbGlkYXRpb25NZXNzYWdlLmdldEF0dHJpYnV0ZXMoKSk7Ci0JCQkJYW5ub3RhdGlvbnMuYWRkKGFubm90YXRpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSVJlY29uY2lsZVJlc3VsdFtdKSBhbm5vdGF0aW9ucy50b0FycmF5KG5ldyBJUmVjb25jaWxlUmVzdWx0W2Fubm90YXRpb25zLnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFNldmVyaXR5KElNZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlKSB7Ci0JCVN0cmluZyB0eXBlID0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9JTkZPOwotCQlzd2l0Y2ggKHZhbGlkYXRpb25NZXNzYWdlLmdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSA6Ci0JCQkJdHlwZSA9IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfRVJST1I7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSA6Ci0JCQkJdHlwZSA9IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgSU1lc3NhZ2UuTE9XX1NFVkVSSVRZIDoKLQkJCQl0eXBlID0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJTWVzc2FnZS5FUlJPUl9BTkRfV0FSTklORyA6Ci0JCQkJdHlwZSA9IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfV0FSTklORzsKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCS8vIFRoZSBiYXNlTG9jYXRpb24gbWF5IGJlIGEgcGF0aCBvbiBkaXNrIG9yIHJlbGF0aXZlIHRvIHRoZQotCQkJCS8vIHdvcmtzcGFjZSByb290LiBEb24ndCB0cmFuc2xhdGUgb24tZGlzayBwYXRocyB0bwotCQkJCS8vIGluLXdvcmtzcGFjZSByZXNvdXJjZXMuCi0JCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOwotCQkJCWlmIChiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEgJiYgIWJhc2VQYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJCWZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoYmFzZVBhdGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHJpdmF0ZSBJbmNyZW1lbnRhbEhlbHBlciBnZXRIZWxwZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoZkhlbHBlciA9PSBudWxsKQotCQkJZkhlbHBlciA9IG5ldyBJbmNyZW1lbnRhbEhlbHBlcihnZXREb2N1bWVudCgpLCBwcm9qZWN0KTsKLQkJcmV0dXJuIGZIZWxwZXI7Ci0JfQotCi0JcHJpdmF0ZSBJbmNyZW1lbnRhbFJlcG9ydGVyIGdldFJlcG9ydGVyKCkgewotCQlpZiAoZlJlcG9ydGVyID09IG51bGwpCi0JCQlmUmVwb3J0ZXIgPSBuZXcgSW5jcmVtZW50YWxSZXBvcnRlcihnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXJldHVybiBmUmVwb3J0ZXI7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyB2YWxpZGF0b3IgaXMgcGFydGlhbCBvciB0b3RhbAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNjb3BlKCkgewotCQlyZXR1cm4gZlNjb3BlOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxSZWNvbmNpbGUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgSVJlY29uY2lsZVJlc3VsdFtdIHJlY29uY2lsZU1vZGVsKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uLCBJUmVnaW9uIHN1YlJlZ2lvbikgewotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlt0cmFjZSByZWNvbmNpbGVyXSA+IHJlY29uY2lsaW5nIG1vZGVsIGluIFZBTElEQVRPUiBzdGVwIHcvIGRpcnR5IHJlZ2lvbjogWyIgKyBkaXJ0eVJlZ2lvbi5nZXRUZXh0KCkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlJUmVjb25jaWxlUmVzdWx0W10gcmVzdWx0cyA9IEVNUFRZX1JFQ09OQ0lMRV9SRVNVTFRfU0VUOwotCQlpZiAoZGlydHlSZWdpb24gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ3NzE0Ci0JCQkJaWYgKGZWYWxpZGF0b3IgaW5zdGFuY2VvZiBJU291cmNlVmFsaWRhdG9yICYmIGdldFNjb3BlKCkgPT0gUmVjb25jaWxlQW5ub3RhdGlvbktleS5QQVJUSUFMKSB7Ci0JCQkJCXJlc3VsdHMgPSB2YWxpZGF0ZShkaXJ0eVJlZ2lvbiwgc3ViUmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdHMgPSB2YWxpZGF0ZSgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFWEVQVElPTiBJTiBSRUNPTkNJTEUgU1RFUCBGT1IgVkFMSURBVE9SIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlt0cmFjZSByZWNvbmNpbGVyXSA+IFZBTElEQVRPUiBzdGVwIGRvbmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBkZWJ1Z1N0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoIlZhbGlkYXRvclN0ZXA6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChmVmFsaWRhdG9yICE9IG51bGwpCi0JCQlkZWJ1Z1N0cmluZy5hcHBlbmQoZlZhbGlkYXRvci50b1N0cmluZygpKTsKLQkJcmV0dXJuIGRlYnVnU3RyaW5nLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElSZWNvbmNpbGVSZXN1bHRbXSB2YWxpZGF0ZSgpIHsKLQkJSVJlY29uY2lsZVJlc3VsdFtdIHJlc3VsdHMgPSBFTVBUWV9SRUNPTkNJTEVfUkVTVUxUX1NFVDsKLQotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZSgpOwotCi0JCXRyeSB7Ci0JCQlJbmNyZW1lbnRhbEhlbHBlciBoZWxwZXIgPSBnZXRIZWxwZXIoZmlsZSAhPSBudWxsID8gZmlsZS5nZXRQcm9qZWN0KCkgOiBudWxsKTsKLQkJCUluY3JlbWVudGFsUmVwb3J0ZXIgcmVwb3J0ZXIgPSBnZXRSZXBvcnRlcigpOwotCi0JCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLQkJCQloZWxwZXIuc2V0VVJJKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCX0KLQotCQkJZlZhbGlkYXRvci52YWxpZGF0ZShoZWxwZXIsIHJlcG9ydGVyKTsKLQotCQkJLy8gcmVzdWx0cyA9IGNyZWF0ZUFubm90YXRpb25zKHJlcG9ydGVyLmdldE1lc3NhZ2VzKCkpOwotCQkJcmVzdWx0cyA9IGNyZWF0ZUFubm90YXRpb25zKHJlcG9ydGVyLmdldEFubm90YXRpb25JbmZvKCkpOwotCQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXMoZlZhbGlkYXRvcik7Ci0KLQkJCWZWYWxpZGF0b3IuY2xlYW51cChyZXBvcnRlcik7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElucHV0TW9kZWwoSVJlY29uY2lsYWJsZU1vZGVsIGlucHV0TW9kZWwpIHsKLQkJaWYgKGlucHV0TW9kZWwgaW5zdGFuY2VvZiBEb2N1bWVudEFkYXB0ZXIpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9ICgoRG9jdW1lbnRBZGFwdGVyKSBpbnB1dE1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoZlZhbGlkYXRvciBpbnN0YW5jZW9mIElTb3VyY2VWYWxpZGF0b3IpIHsKLQkJCQkJLy8gbm90aWZ5IHRoYXQgZG9jdW1lbnQgY29ubmVjdGluZwotCQkJCQkoKElTb3VyY2VWYWxpZGF0b3IpIGZWYWxpZGF0b3IpLmNvbm5lY3QoZG9jdW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5zZXRJbnB1dE1vZGVsKGlucHV0TW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChmVmFsaWRhdG9yIGluc3RhbmNlb2YgSVNvdXJjZVZhbGlkYXRvcikgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJLy8gbm90aWZ5IHRoYXQgZG9jdW1lbnQgZGlzY29ubmVjdGluZwotCQkJCSgoSVNvdXJjZVZhbGlkYXRvcikgZlZhbGlkYXRvcikuZGlzY29ubmVjdChkb2N1bWVudCk7Ci0JCQl9Ci0JCQlmVmFsaWRhdG9yLmNsZWFudXAoZ2V0UmVwb3J0ZXIoKSk7Ci0JCX0KLQkJc3VwZXIucmVsZWFzZSgpOwotCX0KLQotCXByb3RlY3RlZCBJUmVjb25jaWxlUmVzdWx0W10gdmFsaWRhdGUoRGlydHlSZWdpb24gZGlydHlSZWdpb24sIElSZWdpb24gc3ViUmVnaW9uKSB7Ci0JCUlSZWNvbmNpbGVSZXN1bHRbXSByZXN1bHRzID0gRU1QVFlfUkVDT05DSUxFX1JFU1VMVF9TRVQ7Ci0KLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoKTsKLQotCQl0cnkgewotCQkJSW5jcmVtZW50YWxIZWxwZXIgaGVscGVyID0gZ2V0SGVscGVyKGZpbGUgIT0gbnVsbCA/IGZpbGUuZ2V0UHJvamVjdCgpIDogbnVsbCk7Ci0JCQkvKgotCQkJICogU2V0dGluZyB0aGUgVVJJIGlzbid0IG5lY2Vzc2FyeSBmb3IgYWxsIHNvdXJjZSB2YWxpZGF0b3JzLCB3ZQotCQkJICogY2FuIHN0aWxsIGNvbnRpbnVlIHdpdGhvdXQgaXQKLQkJCSAqLwotCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0JCQkJaGVscGVyLnNldFVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0KLQkJCWlmIChmVmFsaWRhdG9yIGluc3RhbmNlb2YgSVNvdXJjZVZhbGlkYXRvcikgewotCQkJCUluY3JlbWVudGFsUmVwb3J0ZXIgcmVwb3J0ZXIgPSBnZXRSZXBvcnRlcigpOwotCQkJCWlmIChnZXRTY29wZSgpID09IElSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlBBUlRJQUwpCi0JCQkJCSgoSVNvdXJjZVZhbGlkYXRvcikgZlZhbGlkYXRvcikudmFsaWRhdGUoZGlydHlSZWdpb24sIGhlbHBlciwgcmVwb3J0ZXIpOwotCQkJCWVsc2UKLQkJCQkJKChJU291cmNlVmFsaWRhdG9yKSBmVmFsaWRhdG9yKS52YWxpZGF0ZShuZXcgUmVnaW9uKDAsIGdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpLCBoZWxwZXIsIHJlcG9ydGVyKTsKLQkJCQkvLyBjYWxsIElWYWxpZGF0b3IuY2xlYW51cCgpIGR1cmluZyByZWxlYXNlKCkKLQkJCQkvLyByZXN1bHRzID0gY3JlYXRlQW5ub3RhdGlvbnMocmVwb3J0ZXIuZ2V0TWVzc2FnZXMoKSk7Ci0JCQkJcmVzdWx0cyA9IGNyZWF0ZUFubm90YXRpb25zKHJlcG9ydGVyLmdldEFubm90YXRpb25JbmZvKCkpOwotCQkJCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKGZWYWxpZGF0b3IpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9WYWxpZGF0b3JCdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9WYWxpZGF0b3JCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZjZjY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvVmFsaWRhdG9yQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5SZWdpc3RyeVJlYWRlcjsKLQotCi0vKioKLSAqIEJhc2VkIG9mZiBvZiBUcmFuc2ZlckJ1aWxkZXIuIFJlYWRzIHRoZSBleHRlbnNpb24gcG9pbnQgZm9yCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbnMuc291cmNldmFsaWRhdGlvbjwvY29kZT4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvckJ1aWxkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0gICAgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfU0NPUEUgPSAic2NvcGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbGlkYXRvck1ldGFEYXRhW10gRU1UUFlfVk1EX0FSUkFZID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhWzBdOwotCi0JLy8gZXh0ZW5zaW9uIHBvaW50IElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExfU09VUkNFX1ZBTElEQVRJT04gPSAic291cmNldmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT05URU5UX1RZUEVfSURFTlRJRklFUiA9ICJjb250ZW50VHlwZUlkZW50aWZpZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BBUlRJVElPTl9UWVBFID0gInBhcnRpdGlvblR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVkFMSURBVE9SID0gInZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFX0ZJTFRFUiA9ICJyZWNvbmNpbGVfdmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZDdXJyZW50Q1RJRDsKLQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhIGZDdXJyZW50Vk1EID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZlZtZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRDb250cmlidXRpb25UYWc7Ci0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRJRDsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFVOS05PV04gPSAiPz8/IjsgLy8kTk9OLU5MUy0xJAotICAgIAotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhcnQgSUQgYXR0cmlidXRlIHRoYXQgaXMgZXhwZWN0ZWQgaW4gdGhlCi0JICogdGFyZ2V0IGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJRChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQlyZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogVU5LTk9XTjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3MoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLQkJcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6IFVOS05PV047IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9ySWQKLQkgKiBAcmV0dXJuIFRyYW5zZmVyW10KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRWYWxpZGF0b3JNZXRhRGF0YShTdHJpbmcgZWRpdG9ySWQpIHsKLQkJcmVhZENvbnRyaWJ1dGlvbnMoZWRpdG9ySWQsIFRBR19WQUxJREFUT1IsIFBMX1NPVVJDRV9WQUxJREFUSU9OKTsKLQkJcmV0dXJuIChWYWxpZGF0b3JNZXRhRGF0YVtdKSBmVm1kcy50b0FycmF5KG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtmVm1kcy5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRvclNjb3BlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9TQ09QRSk7Ci0JCXJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiBVTktOT1dOOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmVhZHMgdGhlIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgcmVnaXN0cnkgZm9yIHRoZSBwcm92aWRlZCB3b3JrYmVuY2gKLQkgKiBwYXJ0IGFuZCB0aGUgcHJvdmlkZWQgZXh0ZW5zaW9uIHBvaW50IElELgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSB0YWcKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkQ29udHJpYnV0aW9ucyhTdHJpbmcgaWQsIFN0cmluZyB0YWcsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQl0YXJnZXRJRCA9IGlkOwotCQl0YXJnZXRDb250cmlidXRpb25UYWcgPSB0YWc7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCXJlYWRSZWdpc3RyeShyZWdpc3RyeSwgUExVR0lOX0lELCBleHRlbnNpb25Qb2ludCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRhZyA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQkvL2llLiB0YXJnZXRDb250cmlidXRpb25UYWcgPT0gdmFsaWRhdG9yCi0JCWlmICh0YWcuZXF1YWxzKHRhcmdldENvbnRyaWJ1dGlvblRhZykpIHsKLQkJCVN0cmluZyB2SWQgPSBnZXRJRChlbGVtZW50KTsKLQkJCVN0cmluZyB2Q2xhc3MgPSBnZXRWYWxpZGF0b3JDbGFzcyhlbGVtZW50KTsKLQkJCVN0cmluZyB2U2NvcGUgPSBnZXRWYWxpZGF0b3JTY29wZShlbGVtZW50KTsKLQotCQkJaWYgKHZJZCA9PSBudWxsKSB7Ci0JCQkJLy8gVGhpcyBpcyBub3Qgb2YgaW50ZXJlc3QgdG8gdXMgLSBkb24ndCBnbyBkZWVwZXIKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCS8vIHN0YXJ0IGJ1aWxkaW5nIGEgVk1ECi0JCQlmQ3VycmVudFZNRCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YShlbGVtZW50LCB2SWQsIHZDbGFzcywgdlNjb3BlKTsKLQkJCWZWbWRzLmFkZChmQ3VycmVudFZNRCk7Ci0KLQkJCWlmIChMb2dnZXIuaXNUcmFjaW5nKFZhbGlkYXRvckJ1aWxkZXIuVFJBQ0VfRklMVEVSKSkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFkZGVkIHJlY29uY2lsZSB2YWxpZGF0b3I6ICIgKyB2SWQgKyAiOiIgKyB2Q2xhc3MgKyAiOiIgKyB2U2NvcGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9IGVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX0NPTlRFTlRfVFlQRV9JREVOVElGSUVSKSkgewotCQkJLy8gYWRkIHRvIGN1cnJlbnQgVk1ECi0JCQlmQ3VycmVudENUSUQgPSBnZXRJRChlbGVtZW50KTsKLQkJCWZDdXJyZW50Vk1ELmFkZENvbnRlbnRUeXBlSWQoZkN1cnJlbnRDVElEKTsKLQkJfSBlbHNlIGlmICh0YWcuZXF1YWxzKFRBR19QQVJUSVRJT05fVFlQRSkpIHsKLQkJCS8vIGFkZCB0byBjdXJyZW50IFZNRAotCQkJU3RyaW5nIHBhcnRpdGlvblR5cGUgPSBnZXRJRChlbGVtZW50KTsKLQkJCWZDdXJyZW50Vk1ELmFkZFBhcml0aW9uVHlwZShmQ3VycmVudENUSUQsIHBhcnRpdGlvblR5cGUpOwotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJlYWRFbGVtZW50Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvVmFsaWRhdG9yTWV0YURhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1ZhbGlkYXRvck1ldGFEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNDEyYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvVmFsaWRhdG9yTWV0YURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5SZWNvbmNpbGVBbm5vdGF0aW9uS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogT2JqZWN0IHRoYXQgaG9sZHMgaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gdGhlIGNyZWF0aW9uIG9mIGEgdmFsaWRhdG9yIGZvcgotICogdGhlIHJlY29uY2lsaW5nIGZyYW1ld29yay4KLSAqIAotICogQGF1dGhvciBwYXZlcnksbml0aW5kCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JNZXRhRGF0YSB7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNsYXNzID0gbnVsbDsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBmQ29uZmlndXJhdGlvbkVsZW1lbnQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZJZCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZlNjb3BlOwotCi0JLy8gYSBoYXNoIG1hcCBvZiBleHBsaWNpdGx5IGRlY2xhcmVkIGNvbnRlbnQgdHlwZSBJZHMgKFN0cmluZykgdGhhdCBwb2ludHMgdG8gbGlzdHMgb2YKLQkvLyBwYXJ0aXRpb24gdHlwZXMgKExpc3Qgb2YgU3RyaW5ncykKLQkvLyBjb250ZW50VHlwZUlkIC0+IExpc3QocGFyaXRpb25UeXBlLCBwYXJpdGlvblR5cGUsIHBhcnRpdGlvblR5cGUsIC4uLikKLQkvLyBjb250ZW50VHlwZUlkMiAtPiBMaXN0KHBhcnRpdGlvblR5cGUsIHBhcnRpdGlvblR5cGUsIC4uLikKLQkvLyAuLi4KLQlwcml2YXRlIEhhc2hNYXAgZk1hdHJpeCA9IG51bGw7Ci0KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyB2SWQsIFN0cmluZyB2Q2xhc3MsIFN0cmluZyB2U2NvcGUpIHsKLQkJZklkID0gdklkOwotCQlmQ2xhc3MgPSB2Q2xhc3M7Ci0JCWZDb25maWd1cmF0aW9uRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWZTY29wZSA9IHZTY29wZTsKLQkJZk1hdHJpeCA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogVE9ETzogVGhpcyBleGFjdCBtZXRob2QgaXMgYWxzbyBpbiBWYWxpZGF0b3JTdHJhdGVneS4gU2hvdWxkIGJlIGluIGEgY29tbW9uIHBsYWNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZW50VHlwZUlkCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gY2FsY3VsYXRlUGFyZW50Q29udGVudFR5cGVJZHMoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQotICAgICAgICBTZXQgcGFyZW50VHlwZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAKLSAgICAgICAgSUNvbnRlbnRUeXBlTWFuYWdlciBjdE1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsgICAgCi0gICAgICAgIElDb250ZW50VHlwZSBjdCA9IGN0TWFuYWdlci5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlkKTsKLSAgICAgICAgU3RyaW5nIGlkID0gY29udGVudFR5cGVJZDsKLQotICAgICAgICB3aGlsZShjdCAhPSBudWxsICYmIGlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcGFyZW50VHlwZXMuYWRkKGlkKTsKLSAgICAgICAgICAgIGN0ID0gY3RNYW5hZ2VyLmdldENvbnRlbnRUeXBlKGlkKTsKLSAgICAgICAgICAgIGlmKGN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJQ29udGVudFR5cGUgYmFzZVR5cGUgPSBjdC5nZXRCYXNlVHlwZSgpOwotICAgICAgICAgICAgICAgIGlkID0gKGJhc2VUeXBlICE9IG51bGwpID8gYmFzZVR5cGUuZ2V0SWQoKSA6IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSlwYXJlbnRUeXBlcy50b0FycmF5KG5ldyBTdHJpbmdbcGFyZW50VHlwZXMuc2l6ZSgpXSk7Ci0gICAgfQotICAgIAotCXB1YmxpYyB2b2lkIGFkZENvbnRlbnRUeXBlSWQoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJaWYgKCFmTWF0cml4LmNvbnRhaW5zS2V5KGNvbnRlbnRUeXBlSWQpKQotCQkJZk1hdHJpeC5wdXQoY29udGVudFR5cGVJZCwgbmV3IEFycmF5TGlzdCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYXJpdGlvblR5cGUoU3RyaW5nIGNvbnRlbnRUeXBlSWQsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCWlmICghZk1hdHJpeC5jb250YWluc0tleShjb250ZW50VHlwZUlkKSkKLQkJCWZNYXRyaXgucHV0KGNvbnRlbnRUeXBlSWQsIG5ldyBBcnJheUxpc3QoKSk7Ci0KLQkJTGlzdCBwYXJ0aXRpb25MaXN0ID0gKExpc3QpIGZNYXRyaXguZ2V0KGNvbnRlbnRUeXBlSWQpOwotCQlwYXJ0aXRpb25MaXN0LmFkZChwYXJ0aXRpb25UeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyB2YWxpZGF0b3IgZXhwbGljaXRseSBkZWNsYXJlZCB0aGF0IGl0IGNvdWxkIGhhbmRsZQotCSAqICAgICAgICAgdGhpcyBjb250ZW50IHR5cGUgb3IgYW55IG9mIGl0cyBwYXJlbnQgY29udGVudCB0eXBlcwotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkhhbmRsZUNvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgewotICAgICAgICAvLyBuZWVkIHRvIGl0ZXJhdGUgaGllcmFyY2h5Ci0gICAgICAgIFN0cmluZ1tdIGNvbnRlbnRIaWVyYXJjaHkgPSBjYWxjdWxhdGVQYXJlbnRDb250ZW50VHlwZUlkcyhjb250ZW50VHlwZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudEhpZXJhcmNoeS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYoZk1hdHJpeC5jb250YWluc0tleShjb250ZW50SGllcmFyY2h5W2ldKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgdmFsaWRhdG9yIGV4cGxpY2l0bHkgZGVjbGFyZWQgdGhhdCBpdCBjb3VsZCBoYW5kbGUKLQkgKiAgICAgICAgIHRoaXMgY29udGVudCB0eXBlCi0JICovCi0JcHVibGljIGJvb2xlYW4gbXVzdEhhbmRsZUNvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgewotICAgICAgICByZXR1cm4gZk1hdHJpeC5jb250YWluc0tleShjb250ZW50VHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlSWRzCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyB2YWxpZGF0b3IgZGVjbGFyZWQgdGhhdCBpdCBjb3VsZCBoYW5kbGUgdGhpcwotCSAqICAgICAgICAgY29udGVudCB0eXBlLCBvciBvbmUgb2YgaXRzIHBhcmVudCBjb250ZW50IHR5cGVzLCBhbmQgcGFydGl0aW9uCi0JICogICAgICAgICB0eXBlCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlUGFydGl0aW9uVHlwZShTdHJpbmcgY29udGVudFR5cGVJZHNbXSwgU3RyaW5nIHBhcml0aW9uVHlwZSkgewotICAgICAgICBmb3IoaW50IGk9MDsgaTxjb250ZW50VHlwZUlkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAJTGlzdCBwYXJ0aXRpb25zID0gKExpc3QpIGZNYXRyaXguZ2V0KGNvbnRlbnRUeXBlSWRzW2ldKTsKLSAgICAJCWlmIChwYXJ0aXRpb25zICE9IG51bGwpIHsKLSAgICAJCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcnRpdGlvbnMuc2l6ZSgpOyBqKyspIHsKLSAgICAJCQkJaWYgKHBhcml0aW9uVHlwZS5lcXVhbHMocGFydGl0aW9ucy5nZXQoaikpKQotICAgIAkJCQkJcmV0dXJuIHRydWU7Ci0gICAgCQkJfQotICAgIAkJfQotICAgICAgICB9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjbGFzc0F0dHJpYnV0ZQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JT2JqZWN0IGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIGZpbmFsIFN0cmluZyBjbGFzc0F0dHJpYnV0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlPYmplY3Qgb2JqID0gbnVsbDsKLQkJb2JqID0gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYXNzQXR0cmlidXRlKTsKLQkJcmV0dXJuIG9iajsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGV4dGVuc2lvbi4gSWYgdGhlIGV4dGVuc2lvbiBwbHVnaW4gaGFzIG5vdCBiZWVuIGxvYWRlZCBhCi0JICogYnVzeSBjdXJzb3Igd2lsbCBiZSBhY3RpdmF0ZWQgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgbG9hZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjbGFzc0F0dHJpYnV0ZQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVFeHRlbnNpb24oKSB7Ci0JCS8vIElmIHBsdWdpbiBoYXMgYmVlbiBsb2FkZWQgY3JlYXRlIGV4dGVuc2lvbi4KLQkJLy8gT3RoZXJ3aXNlLCBzaG93IGJ1c3kgY3Vyc29yIHRoZW4gY3JlYXRlIGV4dGVuc2lvbi4KLQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBnZXRDb25maWd1cmF0aW9uRWxlbWVudCgpOwotCQlmaW5hbCBPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzFdOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJaWYgKGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZWxlbWVudCwgImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24ocmVzdWx0LCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKG51bGwsIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRbMF0gPSBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGVsZW1lbnQsICJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQloYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKHJlc3VsdCwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0WzBdOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYSB2YWxpZGF0b3IgaW5zdGFuY2UgYmFzZWQgb24gdGhpcyBWYWxpZGF0b3JNZXRhRGF0YSBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcigpIHsKLQkJT2JqZWN0IG9iaiA9IG51bGw7Ci0JCW9iaiA9IGNyZWF0ZUV4dGVuc2lvbigpOwotCQlpZiAob2JqID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAob2JqIGluc3RhbmNlb2YgSVZhbGlkYXRvcikgPyAoSVZhbGlkYXRvcikgb2JqIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkgewotCQlyZXR1cm4gZkNvbmZpZ3VyYXRpb25FbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiBmQ2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JJZCgpIHsKLQkJcmV0dXJuIGZJZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogQHBhcmFtIGUKLQkgKi8KLQl2b2lkIGhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24oT2JqZWN0W10gcmVzdWx0LCBUaHJvd2FibGUgZSkgewotCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQlyZXN1bHRbMF0gPSBudWxsOwotCX0KLQkvKioKLQkgKiBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlRPVEFMIG9yICBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlBBUlRJQUwKLQkgKiBAcmV0dXJuCi0JICovCi0gICAgcHVibGljIGludCBnZXRWYWxpZGF0b3JTY29wZSgpIHsKLSAgICAgICAgcmV0dXJuIGZTY29wZS5lcXVhbHNJZ25vcmVDYXNlKCJ0b3RhbCIpID8gUmVjb25jaWxlQW5ub3RhdGlvbktleS5UT1RBTCA6IFJlY29uY2lsZUFubm90YXRpb25LZXkuUEFSVElBTDsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBkZWJ1Z1N0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoIlZhbGlkYXRvck1ldGFEYXRhOiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChmSWQgIT0gbnVsbCkKLQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiIFtpZDoiICsgZklkICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJldHVybiBkZWJ1Z1N0cmluZy50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9WYWxpZGF0b3JTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGYyMGE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5Eb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuUmVjb25jaWxlQW5ub3RhdGlvbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5TdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuVGVtcG9yYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLQotLyoqCi0gKiBTcGVjaWFsIHZhbGlkYXRvciBzdHJhdGVneS4gUnVucyB2YWxpZGF0b3Igc3RlcHMgY29udHJpYnV0ZWQgdmlhIHRoZQotICogPGNvZGU+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb25zLnNvdXJjZXZhbGlkYXRpb248L2NvZGU+IGV4dGVuc2lvbgotICogcG9pbnQKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvclN0cmF0ZWd5IGV4dGVuZHMgU3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVkFMSURBVElPTl9DQVBBQkxFX0JVVF9ESVNBQkxFRCA9IEJvb2xlYW4udmFsdWVPZihQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyVmFsaWRhdG9yRW5hYmxlbWVudCIpKS5ib29sZWFuVmFsdWUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1ZBTElEQVRJT05fVU5TVVBQT1JURUQgPSBCb29sZWFuLnZhbHVlT2YoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvcmVjb25jaWxlclZhbGlkYXRvclN1cHBvcnRlZCIpKS5ib29sZWFuVmFsdWUoKTsKLQotCXByaXZhdGUgU3RyaW5nW10gZkNvbnRlbnRUeXBlSWRzID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZk1ldGFEYXRhID0gbnVsbDsKLQkvKiogdmFsaWRhdG9yIGlkIChhcyBkZWNsYXJlZCBpbiBleHQgcG9pbnQpIC0+IFJlY29uY2lsZVN0ZXBGb3JWYWxpZGF0b3IgKiAqLwotCXByaXZhdGUgSGFzaE1hcCBmVmlkVG9WU3RlcE1hcCA9IG51bGw7Ci0KLQkvKgotCSAqIExpc3Qgb2YgVmFsaWRhdG9yTWV0YURhdGFzIG9mIHRvdGFsIHNjb3BlIHZhbGlkYXRvcnMgdGhhdCBoYXZlIGJlZW4gcnVuCi0JICogc2luY2UgYmVnaW5Qcm9jZXNzaW5nKCkgd2FzIGNhbGxlZC4KLQkgKi8KLQlwcml2YXRlIExpc3QgZlRvdGFsU2NvcGVWYWxpZGF0b3JzQWxyZWFkeVJ1biA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkvKgotCSAqIFdoZXRoZXIgdGhlIFZhbGlkYXRpb24gRnJhbWV3b3JrIGhhcyBpbmRpY2F0ZWQgdGhhdCB2YWxpZGF0aW9uIGlzCi0JICogc3VzcGVuZGVkIGZvciB0aGUgY3VycmVudCByZXNvdXJjZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmVmFsaWRhdG9yc1N1c3BlbmRlZCA9IGZhbHNlOwotCi0JcHVibGljIFZhbGlkYXRvclN0cmF0ZWd5KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJc3VwZXIoc291cmNlVmlld2VyKTsKLQkJZk1ldGFEYXRhID0gbmV3IEFycmF5TGlzdCgpOwotCQlmQ29udGVudFR5cGVJZHMgPSBjYWxjdWxhdGVQYXJlbnRDb250ZW50VHlwZUlkcyhjb250ZW50VHlwZSk7Ci0JCWZWaWRUb1ZTdGVwTWFwID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRWYWxpZGF0b3JNZXRhRGF0YShWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJZk1ldGFEYXRhLmFkZCh2bWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUHJvY2Vzc2luZygpIHsKLQkJZlRvdGFsU2NvcGVWYWxpZGF0b3JzQWxyZWFkeVJ1bi5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb250ZW50IHR5cGUgcGFzc2VkIGluIHNob3VsZCBiZSB0aGUgbW9zdCBzcGVjaWZpYyBvbmUuIFRPRE86IFRoaXMKLQkgKiBleGFjdCBtZXRob2QgaXMgYWxzbyBpbiBWYWxpZGF0b3JNZXRhRGF0YS4gU2hvdWxkIGJlIGluIGEgY29tbW9uIHBsYWNlLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50VHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGNhbGN1bGF0ZVBhcmVudENvbnRlbnRUeXBlSWRzKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0KLQkJU2V0IHBhcmVudFR5cGVzID0gbmV3IEhhc2hTZXQoKTsKLQotCQlJQ29udGVudFR5cGVNYW5hZ2VyIGN0TWFuYWdlciA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOwotCQlJQ29udGVudFR5cGUgY3QgPSBjdE1hbmFnZXIuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJZCk7Ci0JCVN0cmluZyBpZCA9IGNvbnRlbnRUeXBlSWQ7Ci0KLQkJd2hpbGUgKGN0ICE9IG51bGwgJiYgaWQgIT0gbnVsbCkgewotCi0JCQlwYXJlbnRUeXBlcy5hZGQoaWQpOwotCQkJY3QgPSBjdE1hbmFnZXIuZ2V0Q29udGVudFR5cGUoaWQpOwotCQkJaWYgKGN0ICE9IG51bGwpIHsKLQkJCQlJQ29udGVudFR5cGUgYmFzZVR5cGUgPSBjdC5nZXRCYXNlVHlwZSgpOwotCQkJCWlkID0gKGJhc2VUeXBlICE9IG51bGwpID8gYmFzZVR5cGUuZ2V0SWQoKSA6IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgcGFyZW50VHlwZXMudG9BcnJheShuZXcgU3RyaW5nW3BhcmVudFR5cGVzLnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhbkhhbmRsZVBhcnRpdGlvbihTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZNZXRhRGF0YS5zaXplKCk7IGkrKykgewotCQkJdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBmTWV0YURhdGEuZ2V0KGkpOwotCQkJaWYgKHZtZC5jYW5IYW5kbGVQYXJ0aXRpb25UeXBlKGdldENvbnRlbnRUeXBlSWRzKCksIHBhcnRpdGlvblR5cGUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc1N0ZXAoSVJlY29uY2lsZVN0ZXAgc3RlcCkgewotCQlyZXR1cm4gZlZpZFRvVlN0ZXBNYXAuY29udGFpbnNWYWx1ZShzdGVwKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVjb25jaWxlLkFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5I2NyZWF0ZVJlY29uY2lsZVN0ZXBzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVSZWNvbmNpbGVTdGVwcygpIHsKLQkJLy8gZG8gbm90aGluZywgc3RlcHMgYXJlIGNyZWF0ZWQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRQcm9jZXNzaW5nKCkgewotCQlmVG90YWxTY29wZVZhbGlkYXRvcnNBbHJlYWR5UnVuLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogQWxsIGNvbnRlbnQgdHlwZXMgb24gd2hpY2ggdGhpcyBWYWxpZGF0b3JTdHJhdGVneSBjYW4gcnVuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb250ZW50VHlwZUlkcygpIHsKLQkJcmV0dXJuIGZDb250ZW50VHlwZUlkczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdHIKLQkgKiAgICAgICAgICAgIFBhcnRpdGlvbiBvZiB0aGUgcmVnaW9uIHRvIHJlY29uY2lsZS4KLQkgKiBAcGFyYW0gZHIKLQkgKiAgICAgICAgICAgIERpcnR5IHJlZ2lvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZWQgcmVnaW9uCi0JICovCi0JcHVibGljIHZvaWQgcmVjb25jaWxlKElUeXBlZFJlZ2lvbiB0ciwgRGlydHlSZWdpb24gZHIpIHsKLQkJLyoKLQkJICogQWJvcnQgaWYgbm8gd29ya3NwYWNlIGZpbGUgaXMga25vd24gKG5ldyB2YWxpZGF0aW9uIGZyYW1ld29yayBkb2VzCi0JCSAqIG5vdCBzdXBwb3J0IHRoYXQgc2NlbmFyaW8pIG9yIG5vIHZhbGlkYXRvcnMgaGF2ZSBiZWVuIHNwZWNpZmllZAotCQkgKi8KLQkJaWYgKGlzQ2FuY2VsZWQoKSB8fCBmTWV0YURhdGEuaXNFbXB0eSgpIHx8IGZWYWxpZGF0b3JzU3VzcGVuZGVkKQotCQkJcmV0dXJuOwotCi0JCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCQkvLyBmb3IgZXh0ZXJuYWwgZmlsZXMsIHRoaXMgY2FuIGJlIG51bGwKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBwYXJ0aXRpb25UeXBlID0gdHIuZ2V0VHlwZSgpOwotCi0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IG51bGw7Ci0JCUxpc3QgYW5ub3RhdGlvbnNUb0FkZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBzdGVwc1Jhbk9uVGhpc0RpcnR5UmVnaW9uID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCi0JCS8qCi0JCSAqIEtlZXAgdHJhY2sgb2YgdGhlIGRpc2FibGVkIHZhbGlkYXRvcnMgYnkgc291cmNlIGlkIGZvciB0aGUgVjIKLQkJICogdmFsaWRhdG9ycy4KLQkJICovCi0JCVNldCBkaXNhYmxlZFZhbHNCeVNvdXJjZUlkID0gbmV3IEhhc2hTZXQoMjApOwotCQkKLQkJLyoKLQkJICogS2VlcCB0cmFjayBvZiB0aGUgZGlzYWJsZWQgdmFsaWRhdG9ycyBieSBjbGFzcyBpZCBmb3IgdGhlIHYxCi0JCSAqIHZhbGlkYXRvcnMuCi0JCSAqLwotCQlTZXQgZGlzYWJsZWRWYWxzQnlDbGFzcyA9IG5ldyBIYXNoU2V0KDIwKTsKLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJaWYoIWZpbGUuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJcmV0dXJuOwotCi0JCQlDb2xsZWN0aW9uIGRpc2FibGVkVmFsaWRhdG9ycyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8qCi0JCQkJICogVGFrZSBleHRyYSBjYXJlIHdoZW4gY2FsbGluZyB0aGlzIGV4dGVybmFsIGNvZGUsIGFzIGl0Ci0JCQkJICogY2FuIGluZGlyZWN0bHkgY2F1c2UgYnVuZGxlcyB0byBzdGFydAotCQkJCSAqLwotCQkJCWRpc2FibGVkVmFsaWRhdG9ycyA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmdldERpc2FibGVkVmFsaWRhdG9yc0ZvcihmaWxlKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCWlmIChkaXNhYmxlZFZhbGlkYXRvcnMgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBkaXNhYmxlZFZhbGlkYXRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlWYWxpZGF0b3IgdiA9IChWYWxpZGF0b3IpIGl0Lm5leHQoKTsKLQkJCQkJVmFsaWRhdG9yLlYxIHYxID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCXYxID0gdi5hc1YxVmFsaWRhdG9yKCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJCWlmICh2MSAhPSBudWxsKQotCQkJCQkJZGlzYWJsZWRWYWxzQnlDbGFzcy5hZGQodjEuZ2V0SWQoKSk7Ci0JCQkJCS8vIG5vdCBhIFYxIHZhbGlkYXRvcgotCQkJCQllbHNlIGlmICh2LmdldFNvdXJjZUlkKCkgIT0gbnVsbCkgewotCQkJCQkJLy9jb3VsZCBiZSBtb3JlIHRoZW4gb25lIHNvdXJjZWlkIHBlciBiYXRjaCB2YWxpZGF0b3IKLQkJCQkJCVN0cmluZ1tdIHNvdXJjZUlEcyA9IFN0cmluZ1V0aWxzLnVucGFjayh2LmdldFNvdXJjZUlkKCkpOwotCQkJCQkJZGlzYWJsZWRWYWxzQnlTb3VyY2VJZC5hZGRBbGwoQXJyYXlzLmFzTGlzdChzb3VyY2VJRHMpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkJCQotCQkvKgotCQkgKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSByZWxldmFudCB2YWxpZGF0b3IgbWV0YSBkYXRhIHRvIGZpbmQKLQkJICogc3VwcG9ydGluZyB2YWxpZGF0b3JzIGZvciB0aGlzIHBhcnRpdGlvbiB0eXBlLiBEb24ndCBjaGVjawotCQkgKiB0aGlzLmNhbkhhbmRsZVBhcnRpdGlvbigpIGJlZm9yZS1oYW5kIHNpbmNlIGl0IGp1c3QgbG9vcHMgdGhyb3VnaAotCQkgKiBhbmQgY2FsbHMgdm1kLmNhbkhhbmRsZVBhcnRpdGlvblR5cGUoKS4uLndoaWNoIHdlJ3JlIGFscmVhZHkgZG9pbmcKLQkJICogaGVyZSBhbnl3YXkgdG8gZmluZCB0aGUgcmlnaHQgdm1kLgotCQkgKi8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmTWV0YURhdGEuc2l6ZSgpICYmICFpc0NhbmNlbGVkKCk7IGkrKykgewotCQkJdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBmTWV0YURhdGEuZ2V0KGkpOwotCQkJaWYgKHZtZC5jYW5IYW5kbGVQYXJ0aXRpb25UeXBlKGdldENvbnRlbnRUeXBlSWRzKCksIHBhcnRpdGlvblR5cGUpKSB7Ci0JCQkJLyoKLQkJCQkgKiBDaGVjayBpZiB2YWxpZGF0b3IgaXMgZW5hYmxlZCBhY2NvcmRpbmcgdG8gdmFsaWRhdGlvbgotCQkJCSAqIHByZWZlcmVuY2VzIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGNyZWF0ZS91c2UgaXQKLQkJCQkgKi8KLQkJCQlpZiAoIWRpc2FibGVkVmFsc0J5U291cmNlSWQuY29udGFpbnModm1kLmdldFZhbGlkYXRvcklkKCkpICYmICFkaXNhYmxlZFZhbHNCeUNsYXNzLmNvbnRhaW5zKHZtZC5nZXRWYWxpZGF0b3JDbGFzcygpKSkgewotCQkJCQlpZiAoREVCVUdfVkFMSURBVElPTl9VTlNVUFBPUlRFRCkgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlNvdXJjZSB2YWxpZGF0b3IgIit2bWQuZ2V0VmFsaWRhdG9ySWQoKSsiIGhhbmRsaW5nIChjb250ZW50IHR5cGVzOlsiICsgU3RyaW5nVXRpbHMucGFjayhnZXRDb250ZW50VHlwZUlkcygpKSArICJdIHBhcnRpdGlvbiB0eXBlOiIgKyBwYXJ0aXRpb25UeXBlKTsKLQkJCQkJfQotCQkJCQlpbnQgdmFsaWRhdG9yU2NvcGUgPSB2bWQuZ2V0VmFsaWRhdG9yU2NvcGUoKTsKLQkJCQkJUmVjb25jaWxlU3RlcEZvclZhbGlkYXRvciB2YWxpZGF0b3JTdGVwID0gbnVsbDsKLQkJCQkJLy8gZ2V0IHN0ZXAgZm9yIHBhcnRpdGlvbiB0eXBlCi0JCQkJCU9iamVjdCBvID0gZlZpZFRvVlN0ZXBNYXAuZ2V0KHZtZC5nZXRWYWxpZGF0b3JJZCgpKTsKLQkJCQkJaWYgKG8gIT0gbnVsbCkgewotCQkJCQkJdmFsaWRhdG9yU3RlcCA9IChSZWNvbmNpbGVTdGVwRm9yVmFsaWRhdG9yKSBvOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gaWYgZG9lc24ndCBleGlzdCwgY3JlYXRlIG9uZQotCQkJCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSB2bWQuY3JlYXRlVmFsaWRhdG9yKCk7Ci0KLQkJCQkJCXZhbGlkYXRvclN0ZXAgPSBuZXcgUmVjb25jaWxlU3RlcEZvclZhbGlkYXRvcih2YWxpZGF0b3IsIHZhbGlkYXRvclNjb3BlKTsKLQkJCQkJCXZhbGlkYXRvclN0ZXAuc2V0SW5wdXRNb2RlbChuZXcgRG9jdW1lbnRBZGFwdGVyKGRvYykpOwotCi0JCQkJCQlmVmlkVG9WU3RlcE1hcC5wdXQodm1kLmdldFZhbGlkYXRvcklkKCksIHZhbGlkYXRvclN0ZXApOwotCQkJCQl9Ci0KLQkJCQkJaWYgKCFmVG90YWxTY29wZVZhbGlkYXRvcnNBbHJlYWR5UnVuLmNvbnRhaW5zKHZtZCkpIHsKLQkJCQkJCWFubm90YXRpb25zVG9BZGQuYWRkQWxsKEFycmF5cy5hc0xpc3QodmFsaWRhdG9yU3RlcC5yZWNvbmNpbGUoZHIsIGRyKSkpOwotCQkJCQkJc3RlcHNSYW5PblRoaXNEaXJ0eVJlZ2lvbi5hZGQodmFsaWRhdG9yU3RlcCk7Ci0KLQkJCQkJCWlmICh2YWxpZGF0b3JTY29wZSA9PSBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlRPVEFMKSB7Ci0JCQkJCQkJLy8gbWFyayB0aGlzIHZhbGlkYXRvciBhcyAicnVuIgotCQkJCQkJCWZUb3RhbFNjb3BlVmFsaWRhdG9yc0FscmVhZHlSdW4uYWRkKHZtZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoREVCVUdfVkFMSURBVElPTl9DQVBBQkxFX0JVVF9ESVNBQkxFRCkgewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJTb3VyY2UgdmFsaWRhdG9yIGFibGUgKGlkOiIgKyB2bWQuZ2V0VmFsaWRhdG9ySWQoKSArICIgY2xhc3M6IiArIHZtZC5nZXRWYWxpZGF0b3JDbGFzcygpICsgIiBidXQgc2tpcHBlZCBiZWNhdXNlIGl0IHdhcyByZXBvcnRlZCBhcyBkaXNhYmxlZCI7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKERFQlVHX1ZBTElEQVRJT05fVU5TVVBQT1JURUQpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiU291cmNlIHZhbGlkYXRvciAiK3ZtZC5nZXRWYWxpZGF0b3JJZCgpKyIgY2FuIG5vdCBoYW5kbGUgKGNvbnRlbnQgdHlwZXM6WyIgKyBTdHJpbmdVdGlscy5wYWNrKGdldENvbnRlbnRUeXBlSWRzKCkpICsgIl0gcGFydGl0aW9uIHR5cGU6IiArIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQl9Ci0KLQkJVGVtcG9yYXJ5QW5ub3RhdGlvbltdIGFubm90YXRpb25zVG9SZW1vdmUgPSBnZXRBbm5vdGF0aW9uc1RvUmVtb3ZlKGRyLCBzdGVwc1Jhbk9uVGhpc0RpcnR5UmVnaW9uKTsKLQkJaWYgKGFubm90YXRpb25zVG9SZW1vdmUubGVuZ3RoICsgYW5ub3RhdGlvbnNUb0FkZC5zaXplKCkgPiAwKQotCQkJc21hcnRQcm9jZXNzKGFubm90YXRpb25zVG9SZW1vdmUsIChJUmVjb25jaWxlUmVzdWx0W10pIGFubm90YXRpb25zVG9BZGQudG9BcnJheShuZXcgSVJlY29uY2lsZVJlc3VsdFthbm5vdGF0aW9uc1RvQWRkLnNpemUoKV0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlzdXBlci5yZWxlYXNlKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gZlZpZFRvVlN0ZXBNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJSVJlY29uY2lsZVN0ZXAgc3RlcCA9IG51bGw7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXN0ZXAgPSAoSVJlY29uY2lsZVN0ZXApIGl0Lm5leHQoKTsKLQkJCWlmIChzdGVwIGluc3RhbmNlb2YgSVJlbGVhc2FibGUpCi0JCQkJKChJUmVsZWFzYWJsZSkgc3RlcCkucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5BYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneSNzZXREb2N1bWVudChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQotCQlzdXBlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0KLQkJdHJ5IHsKLQkJCWZWYWxpZGF0b3JzU3VzcGVuZGVkID0gZmFsc2U7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCUlGaWxlIGZpbGUgPSBnZXRGaWxlKCk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQkvLyBWYWxpZGF0aW9uIGlzIHN1c3BlbmRlZCBmb3IgdGhpcyByZXNvdXJjZSwgZG8gbm90aGluZwotCQkJCQlmVmFsaWRhdG9yc1N1c3BlbmRlZCA9ICFmaWxlLmlzQWNjZXNzaWJsZSgpIHx8IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmlzU3VzcGVuZGVkKGZpbGUuZ2V0UHJvamVjdCgpKSB8fCBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5nZXRQcm9qZWN0U2V0dGluZ3MoZmlsZS5nZXRQcm9qZWN0KCkpLmdldFN1c3BlbmQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmVmFsaWRhdG9yc1N1c3BlbmRlZCA9IHRydWU7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCQotCQkvLyB2YWxpZGF0b3Igc3RlcHMgYXJlIGluICJmVklkVG9WU3RlcE1hcCIgKGFzIG9wcG9zZWQgdG8gZkZpcnN0U3RlcCA+Ci0JCS8vIG5leHQgc3RlcCBldGMuLi4pCi0JCUl0ZXJhdG9yIGl0ID0gZlZpZFRvVlN0ZXBNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJSVJlY29uY2lsZVN0ZXAgc3RlcCA9IG51bGw7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXN0ZXAgPSAoSVJlY29uY2lsZVN0ZXApIGl0Lm5leHQoKTsKLQkJCXN0ZXAuc2V0SW5wdXRNb2RlbChuZXcgRG9jdW1lbnRBZGFwdGVyKGRvY3VtZW50KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIElGaWxlIGZyb20gY3VycmVudCBkb2N1bWVudAotCSAqIAotCSAqIEByZXR1cm4gSUZpbGUgdGhlIElGaWxlLCBudWxsIGlmIG5vIHN1Y2ggZmlsZSBleGlzdHMKLQkgKi8KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCS8vIFRoZSBiYXNlTG9jYXRpb24gbWF5IGJlIGEgcGF0aCBvbiBkaXNrIG9yIHJlbGF0aXZlIHRvIHRoZQotCQkJCS8vIHdvcmtzcGFjZSByb290LiBEb24ndCB0cmFuc2xhdGUgb24tZGlzayBwYXRocyB0bwotCQkJCS8vIGluLXdvcmtzcGFjZSByZXNvdXJjZXMuCi0JCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOwotCQkJCWlmIChiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShiYXNlUGF0aCk7Ci0JCQkJCS8qCi0JCQkJCSAqIElmIHRoZSBJRmlsZSBkb2Vzbid0ICBleGlzdCwgbWFrZSBzdXJlIGl0J3Mgbm90Ci0JCQkJCSAqIHJldHVybmVkCi0JCQkJCSAqLwotCQkJCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQkJCQlmaWxlID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9ydWxlcy9QcmVzZW50YXRpb25Db2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9ydWxlcy9QcmVzZW50YXRpb25Db2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM2ZDUxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcnVsZXMvUHJlc2VudGF0aW9uQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJ1bGVzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFByZXNlbnRhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBQYXNzZWQgdG8gTGluZVN0eWxlUHJvdmlkZXJzIGFzIHRoZSBDb2xsZWN0aW9uIGZvciB3aGljaCBTdHlsZVJhbmdlcyBhcmUgdG8NCi0gKiBiZSBhZGRlZC4gVGhpcyBjbGFzcyBwcm92aWRlcyBhZGRpdGlvbmFsIHNhbml0eSBjaGVja3Mgb24gdGhlIGluY29taW5nDQotICogU3R5bGVSYW5nZXMgc28gdGhhdCB3ZSBkbyBub3QgcmVseSB1cG9uIFNXVCB0byByZXBvcnQgRXJyb3JzIHdpdGggbm8gcmVjb3JkDQotICogb2YgdGhlIFN0eWxlUmFuZ2Ugb3IgY29udHJpYnV0aW5nIExpbmVTdHlsZVByb3ZpZGVyLCBhcyB3ZWxsIGFzIGEgc2xpZ2h0DQotICogcGVyZm9ybWFuY2UgaW5jcmVhc2UgYnkgbm90IGFsbG9jYXRpbmcgYSByZWR1bmRhbnQgY29sbGVjdGlvbiBmb3IgdGhlDQotICogU3R5bGVSYW5nZXMuDQotICogDQotICogVGhpcyBjbGFzcyBpbnRlbnRpb25hbGx5IHZpb2xhdGVzIHRoZSBjb250cmFjdCBmb3IgamF2YS51dGlsLkNvbGxlY3Rpb24uDQotICovDQotDQotY2xhc3MgUHJlc2VudGF0aW9uQ29sbGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uIHsNCi0JcHJpdmF0ZSBmaW5hbCBUZXh0UHJlc2VudGF0aW9uIGZQcmVzZW50YXRpb247DQotCXByaXZhdGUgaW50IGxhc3RPZmZzZXQ7DQotDQotCS8qKg0KLQkgKiBAcGFyYW0gcHJlc2VudGF0aW9uDQotCSAqICAgICAgICAgICAgLSB0aGUgUHJlc2VudGF0aW9uIGJlaW5nIGFkZGVkIHRvDQotCSAqIEBwYXJhbSBhcHBseU9uQWRkDQotCSAqLw0KLQlQcmVzZW50YXRpb25Db2xsZWN0b3IoVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24pIHsNCi0JCXN1cGVyKCk7DQotCQlBc3NlcnQuaXNOb3ROdWxsKHByZXNlbnRhdGlvbik7DQotCQlmUHJlc2VudGF0aW9uID0gcHJlc2VudGF0aW9uOw0KLQkJbGFzdE9mZnNldCA9IDA7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNhZGQoamF2YS5sYW5nLk9iamVjdCkNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgbykgew0KLQkJU3R5bGVSYW5nZSByYW5nZSA9IChTdHlsZVJhbmdlKSBvOw0KLQkJaWYgKGxhc3RPZmZzZXQgPiByYW5nZS5zdGFydCkgew0KLQkJCUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT3ZlcmxhcHBpbmcgc3RhcnQgaW4gU3R5bGVSYW5nZSAiICsgcmFuZ2Uuc3RhcnQgKyAiOiIgKyByYW5nZS5sZW5ndGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOw0KLQkJCXRocm93IGU7DQotCQl9DQotCQlsYXN0T2Zmc2V0ID0gcmFuZ2Uuc3RhcnQgKyByYW5nZS5sZW5ndGg7DQotCQlmUHJlc2VudGF0aW9uLmFkZFN0eWxlUmFuZ2UocmFuZ2UpOw0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uI2l0ZXJhdG9yKCkNCi0JICovDQotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsNCi0JCXJldHVybiBmUHJlc2VudGF0aW9uLmdldE5vbkRlZmF1bHRTdHlsZVJhbmdlSXRlcmF0b3IoKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlIGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24jc2l6ZSgpDQotCSAqLw0KLQlwdWJsaWMgaW50IHNpemUoKSB7DQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcnVsZXMvU3RydWN0dXJlZERvY3VtZW50RGFtYWdlclJlcGFpcmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcnVsZXMvU3RydWN0dXJlZERvY3VtZW50RGFtYWdlclJlcGFpcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OTczZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3J1bGVzL1N0cnVjdHVyZWREb2N1bWVudERhbWFnZXJSZXBhaXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucnVsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLkRlZmF1bHREYW1hZ2VyUmVwYWlyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5SdWxlQmFzZWRTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSBwcmVzZW50YXRpb24gZGFtYWdlciBhbmQgcHJlc2VudGF0aW9uIHJlcGFpcmVyLgotICogSXQgdXNlcyBhIExpbmVTdHlsZVByb3ZpZGVyIHRvIHJldHJpZXZlIHRoZSBzdHlsZSByYW5nZXMgYXNzb2NpYXRlZCB3aXRoCi0gKiB0aGUgY2FsY3VsYXRlZCBkYW1hZ2VkIHJlZ2lvbi4KLSAqIAotICogQHNlZSBMaW5lU3R5bGVQcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50RGFtYWdlclJlcGFpcmVyIGV4dGVuZHMgRGVmYXVsdERhbWFnZXJSZXBhaXJlciB7Ci0JCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmUHJvdmlkZXIgPSBudWxsOwotCQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnREYW1hZ2VyUmVwYWlyZXIoTGluZVN0eWxlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJc3VwZXIobmV3IFJ1bGVCYXNlZFNjYW5uZXIoKSk7Ci0JCUFzc2VydC5pc05vdE51bGwocHJvdmlkZXIpOwotCQlmUHJvdmlkZXIgPSBwcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVQcmVzZW50YXRpb24oVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24sIElUeXBlZFJlZ2lvbiByZWdpb24pIHsKLQkJUHJlc2VudGF0aW9uQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBQcmVzZW50YXRpb25Db2xsZWN0b3IocHJlc2VudGF0aW9uKTsKLQkJZlByb3ZpZGVyLnByZXBhcmVSZWdpb25zKHJlZ2lvbiwgcmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCksIGNvbGxlY3Rvcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb3ZpZGVyKExpbmVTdHlsZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCWZQcm92aWRlciA9IHByb3ZpZGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlpZiAoZlByb3ZpZGVyIGluc3RhbmNlb2YgQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcikKLQkJCSgoQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcikgZlByb3ZpZGVyKS5zZXREb2N1bWVudCggKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0Jhc2ljU2VhcmNoTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9CYXNpY1NlYXJjaExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIwZjM4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0Jhc2ljU2VhcmNoTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0eWxlZFN0cmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlbGVnYXRpbmdTdHlsZWRDZWxsTGFiZWxQcm92aWRlci5JU3R5bGVkTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0eWxlZFN0cmluZy5TdHlsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlczsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuTWVzc2FnZUZvcm1hdDsKLQotLyoqCi0gKiA8cD5UaGUgbGFiZWwgcHJvdmlkZXIgZGVzaWduZWQgZm9yIHVzZSB3aXRoIDxjb2RlPkJhc2ljU2VhcmNoTWF0Y2hFbGVtZW50PC9jb2RlPjxwPgotICogCi0gKiA8cD5EaXNwbGF5cyBpbiB0aGUgZm9ybWF0IG9mOjxici8+Ci0gKiBsaW5lTnVtOiBNZXNzYWdlICgjIG1hdGNoZXMpPC9icj4KLSAqIDE6IDxhPjwvYT4gKDIgbWF0Y2hlcyk8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY1NlYXJjaExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVN0eWxlZExhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIElEIG9mIG1hdGNoIGhpZ2hsaWdodGluZyBiYWNrZ3JvdW5kIGNvbG9yCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BVENIX0JHX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLk1BVENIX0JHIjsKLQkKLQkvL3JlZ2lzdGVyIHRoZSBtYXRjaCBoaWdobGlnaHRpbmcgYmFja2dyb3VuZCBjb2xvciBvbmNlCi0Jc3RhdGljIHsKLQkJSkZhY2VSZXNvdXJjZXMuZ2V0Q29sb3JSZWdpc3RyeSgpLnB1dChNQVRDSF9CR19JRCwgbmV3IFJHQigyMDYsIDIwNCwgMjQ3KSk7Ci0JfQotCQotCS8qKgotCSAqIE1hdGNoIGhpZ2hsaWdodGluZyBiYWNrZ3JvdW5kIGNvbG9yIHN0eWxlcgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0eWxlciBISUdITElHSFRfV1JJVEVfU1RZTEU9IFN0eWxlZFN0cmluZy5jcmVhdGVDb2xvclJlZ2lzdHJ5U3R5bGVyKG51bGwsIE1BVENIX0JHX0lEKTsKLQkKLQkKLQkvKioKLQkgKiBOZWVkIHRoZSBwYWdlIGlmIHdhbnQgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgbWF0Y2hlcywgYnV0IHRoaXMgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBBYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSBmUGFnZTsKLQotCS8qKgotCSAqIDxwPkNvbnN0cnVjdCB0aGUgcHJvdmlkZXIgd2l0aG91dCBhIDxjb2RlPkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlPC9jb2RlPjxwPgotCSAqIDxwPjxiPk5PVEU6PC9iPklmIHRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0aGVuIHRoZSBwcm92aWRlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGRldGVybWluZQotCSAqIHRoZSBudW1iZXIgb2YgbWF0Y2hlcyB0aGF0IGFyZSBhbGwgb24gdGhlIHNhbWUgbGluZSBmb3IgYSBnaXZlbiBlbGVtZW50PC9wPgotCSAqLwotCXB1YmxpYyBCYXNpY1NlYXJjaExhYmVsUHJvdmlkZXIoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPkNvbnN0cnVjdCB0aGUgcHJvdmlkZXIgd2l0aCBhIDxjb2RlPkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlPC9jb2RlPiBzbyB0aGF0IHRoZQotCSAqIG51bWJlciBvZiBtYXRjaGVzIHRoYXQgYXJlIGFsbCBvbiB0aGUgc2FtZSBsaW5lIGZvciBhIGdpdmVuIGVsZW1lbnQgY2FuIGJlIGRldGVybWluZWQuPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYWdlIFdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBtYXRjaGVzIHRoYXQgYXJlIGFsbCBvbiB0aGUgc2FtZSBsaW5lCi0JICovCi0JcHVibGljIEJhc2ljU2VhcmNoTGFiZWxQcm92aWRlcihBYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSBwYWdlKSB7Ci0JCWZQYWdlPSBwYWdlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9PQ0NfTUFUQ0gpOwotCX0KLQkKLQkvKioKLQkgKiA8cD48Yj5Ob3RlOjwvYj4gQmVjYXVzZSB0aGlzIGNsYXNzIGltcGxlbWVudHMgPGNvZGU+SVN0eWxlZExhYmVsUHJvdmlkZXI8L2NvZGU+IHRoZSA8Y29kZT5nZXRTdHlsZWRUZXh0PC9jb2RlPgotCSAqIGZ1bmN0aW9uIHNob3VsZCBiZSBiZWluZyBjYWxsZWQgYW5kIG5vdCB0aGlzIG9uZSwgYnV0IGJldHRlciBzYXZlIHRoZW4gc29ycnk8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guQmFzaWNTZWFyY2hMYWJlbFByb3ZpZGVyI2dldFN0eWxlZFRleHQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0U3R5bGVkVGV4dChlbGVtZW50KS5nZXRTdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+R2l2ZW4gYSA8Y29kZT5NYXRjaDwvY29kZT4gb2JqZWN0IGNvbnRhaW5pbmcgYSA8Y29kZT5CYXNpY1NlYXJjaE1hdGNoRWxlbWVudDwvY29kZT4gZWxlbWVudAotCSAqIHJldHVybnMgYSA8Y29kZT5TdHlsZWRTdHJpbmc8L2NvZGU+IGluIHRoZSBmb3JtIG9mOjwvcD4KLQkgKiAKLQkgKiA8cD5saW5lTnVtOiBNZXNzYWdlICgjIG1hdGNoZXMpPC9icj4KLQkgKiAxOiA8YT48L2E+ICgyIG1hdGNoZXMpPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWxlZ2F0aW5nU3R5bGVkQ2VsbExhYmVsUHJvdmlkZXIuSVN0eWxlZExhYmVsUHJvdmlkZXIjZ2V0U3R5bGVkVGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHlsZWRTdHJpbmcgZ2V0U3R5bGVkVGV4dChPYmplY3Qgb2JqKSB7Ci0JCVN0eWxlZFN0cmluZyBzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFN0cmluZygpOwotCQlCYXNpY1NlYXJjaE1hdGNoRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1hdGNoKSB7Ci0JCQlNYXRjaCBtYXRjaCA9IChNYXRjaCkgb2JqOwotCi0JCQlpZihtYXRjaC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBCYXNpY1NlYXJjaE1hdGNoRWxlbWVudCkgewotCQkJCWVsZW1lbnQgPSAoQmFzaWNTZWFyY2hNYXRjaEVsZW1lbnQpIG1hdGNoLmdldEVsZW1lbnQoKTsKLQkJCX0KLQkJfSBlbHNlIGlmKG9iaiBpbnN0YW5jZW9mIEJhc2ljU2VhcmNoTWF0Y2hFbGVtZW50KSB7Ci0JCQllbGVtZW50ID0gKEJhc2ljU2VhcmNoTWF0Y2hFbGVtZW50KW9iajsKLQkJfQotCQkKLQkJLy9nZXQgdGhlIG1hdGNoIGNvdW50IGlmIHBvc3NpYmxlCi0JCWludCBtYXRjaENvdW50ID0gMDsKLQkJTWF0Y2hbXSBtYXRjaGVzID0gbmV3IE1hdGNoWzBdOwotCQlpZihmUGFnZSAhPSBudWxsKSB7Ci0JCQltYXRjaGVzID0gZlBhZ2UuZ2V0SW5wdXQoKS5nZXRNYXRjaGVzKG9iaik7Ci0JCQltYXRjaENvdW50ID0gbWF0Y2hlcy5sZW5ndGg7Ci0JCX0KLQkJCi0JCS8vaWYgZXZlcnl0aGluZyB3YXMgb2YgdGhlIHJpZ2h0IHR5cGUgY3JlYXRlIG91ciBmb3JtYXRlZCBtZXNzYWdlLAotCQkvL2Vsc2UgdXNlIHRoZSB0b1N0cmluZyBvZiB0aGUgZ2l2ZW4gb2JqZWN0IGZvciB0aGUgbWVzc2FnZQotCQlpZihlbGVtZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gZWxlbWVudC5nZXRMaW5lKCkudHJpbSgpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgdHJpbWVkQW1vdW50ID0gZWxlbWVudC5nZXRMaW5lKCkuaW5kZXhPZihtZXNzYWdlKTsKLQkJCVN0cmluZyBsaW5lTnVtID0gZWxlbWVudC5nZXRMaW5lTnVtKCkgKyAxICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlzdHlsZWRUZXh0LmFwcGVuZChsaW5lTnVtLCBTdHlsZWRTdHJpbmcuUVVBTElGSUVSX1NUWUxFUik7Ci0JCQlzdHlsZWRUZXh0LmFwcGVuZChtZXNzYWdlKTsKLQkJCQotCQkJLy9nZXQgdGhlIG1hdGNoIGNvdW50IGlmIHBvc3NpYmxlCi0JCQlmb3IoaW50IGkgPSAwOyBpIDwgbWF0Y2hDb3VudDsgKytpKSB7Ci0JCQkJaW50IG9mZnNldCA9IG1hdGNoZXNbaV0uZ2V0T2Zmc2V0KCkgLSBlbGVtZW50LmdlTGluZU9mZnNldCgpICsgbGluZU51bS5sZW5ndGgoKSAtIHRyaW1lZEFtb3VudDsKLQkJCQlzdHlsZWRUZXh0LnNldFN0eWxlKG9mZnNldCwgbWF0Y2hlc1tpXS5nZXRMZW5ndGgoKSwgSElHSExJR0hUX1dSSVRFX1NUWUxFKTsKLQkJCX0KLQkJCQotCQl9IGVsc2UgewotCQkJc3R5bGVkVGV4dC5hcHBlbmQob2JqLnRvU3RyaW5nKCkpOwotCQl9Ci0JCQotCQkvL2FwcGVuZCB0aGUgbWF0Y2ggY291bnQgaWYgaXRzIHdvcnRoIGFwcGVuZGluZwotCQlpZiAobWF0Y2hDb3VudCA+IDEpIHsKLQkJCVN0cmluZyBtYXRjaGVzTXNnID0gIiAiICsgTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJU1NFVUlNZXNzYWdlcy5UZXh0U2VhcmNoTGFiZWxQcm92aWRlcl9tYXRjaENvdW50Rm9ybWF0LAotCQkJCW5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKG1hdGNoQ291bnQpIH0pOwotCQkJc3R5bGVkVGV4dC5hcHBlbmQobWF0Y2hlc01zZywgU3R5bGVkU3RyaW5nLkNPVU5URVJfU1RZTEVSKTsKLQkJfQotCQotCQlyZXR1cm4gc3R5bGVkVGV4dDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0Jhc2ljU2VhcmNoTWF0Y2hFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0Jhc2ljU2VhcmNoTWF0Y2hFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNWMwNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9CYXNpY1NlYXJjaE1hdGNoRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi0vKioKLSAqIFRoaXMgaXMgdXNlZCBhcyB0aGUgZWxlbWVudCBmb3IgYSA8Y29kZT5NYXRjaDwvY29kZT4gb2JqZWN0IGJ5Ci0gKiA8Y29kZT5CYXNpY1NlYXJjaFF1ZXJ5PC9jb2RlPi4gIEl0IGNvbnRhaW5zIGFsbCB0aGUgbmVlZGVkIGluZm9ybWF0aW9uCi0gKiBmb3IgdXNlIGJ5IHRoZSBxdWVyeSwgcmVzdWx0IHByb3ZpZGVycywgYW5kIGxhYmVsIHByb3ZpZGVycy4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkJhc2ljU2VhcmNoUXVlcnkKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljU2VhcmNoTWF0Y2hFbGVtZW50IHsKLQkvKioKLQkgKiBUaGUgZmlsZSB0aGlzIGVsZW1lbnQgaXMgYSBtYXRjaCBvbgotCSAqLwotCXByaXZhdGUgSUZpbGUgZkZpbGU7Ci0JCi0JLyoqCi0JICogVGhlIGxpbmUgbnVtYmVyIHRoaXMgZWxlbWVudCBpcyBhIG1hdGNoIG9uCi0JICovCi0JcHJpdmF0ZSBpbnQgZkxpbmVOdW1iZXI7Ci0JCi0JLyoqCi0JICogVGhlIG9mZnNldCBvZiB0aGUgbGluZSBpbiB0aGUgZmlsZQotCSAqLwotCXByaXZhdGUgaW50IGZMaW5lT2Zmc2V0OwotCQotCS8qKgotCSAqIFRoZSBsaW5lIHRoaXMgbWF0Y2ggaXMgb24KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmTGluZTsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRoaXMgZWxlbWVudCBpcyBhIG1hdGNoIG9uCi0JICogQHBhcmFtIGxpbmVOdW1iZXIgVGhlIGxpbmUgbnVtYmVyIHRoaXMgZWxlbWVudCBpcyBhIG1hdGNoIG9uCi0JICogQHBhcmFtIGxpbmVPZmZzZXQgVGhlIG9mZnNldCBvZiB0aGUgbGluZSBpbiB0aGUgZmlsZQotCSAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgQmFzaWNTZWFyY2hNYXRjaEVsZW1lbnQoSUZpbGUgZmlsZSwgaW50IGxpbmVOdW1iZXIsIGludCBsaW5lT2Zmc2V0LCBTdHJpbmcgbWVzc2FnZSkgewotCQl0aGlzLmZGaWxlID0gZmlsZTsKLQkJdGhpcy5mTGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0JCXRoaXMuZkxpbmVPZmZzZXQgPSBsaW5lT2Zmc2V0OwotCQl0aGlzLmZMaW5lID0gbWVzc2FnZTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiBUaGUgZmlsZSB0aGlzIGVsZW1lbnQgaXMgYSBtYXRjaCBvbgotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gdGhpcy5mRmlsZTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiBUaGUgbGluZSBudW1iZXIgdGhpcyBlbGVtZW50IGlzIGEgbWF0Y2ggb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVOdW0oKSB7Ci0JCXJldHVybiB0aGlzLmZMaW5lTnVtYmVyOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIGxpbmUgdGhlIG1hdGNoIGlzIG9uIGluIHRoZSBmaWxlCi0JICovCi0JcHVibGljIGludCBnZUxpbmVPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLmZMaW5lT2Zmc2V0OwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBsaW5lIHRoaXMgbWF0Y2ggaXMgb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmUoKSB7Ci0JCXJldHVybiB0aGlzLmZMaW5lOwotCX0KLQkKLQkvKioKLQkgKiA8cD5Ud28gPGNvZGU+QmFzaWNTZWFyY2hNYXRjaEVsZW1lbnQ8L2NvZGU+IGFyZSBlcXVhbCBpZiB0aGV5IGFyZQotCSAqIGJvdGggb24gdGhlIHNhbWUgbGluZS4gVGhpcyBoZWxwcyB3aXRoIGRldGVybWluaW5nIGhvdyBtYW55IG1hdGNoZXMKLQkgKiBhcmUgYWxsIG9uIHRoZSBzYW1lIGxpbmUgd2hpY2ggaXMgYXV0b21hdGljYWxseSB0YWtlbiBjYXJlIG9mIGJ5Ci0JICogaW50ZXJuYWwgRWNsaXBzZSBzZWFyY2ggQVBJcyBzbyBsb25nIGFzIHRoaXMgZXF1YWwgbWV0aG9kIGlzIHN0cnVjdHVyZWQKLQkgKiB0aHVzbHkuPC9wPgotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlib29sZWFuIGVxdWFsID0gZmFsc2U7Ci0JCQotCQlpZihvYmogaW5zdGFuY2VvZiBCYXNpY1NlYXJjaE1hdGNoRWxlbWVudCkgewotCQkJZXF1YWwgPSBnZXRMaW5lTnVtKCkgPT0gKChCYXNpY1NlYXJjaE1hdGNoRWxlbWVudClvYmopLmdldExpbmVOdW0oKTsKLQkJfQotCQkKLQkJcmV0dXJuIGVxdWFsOwotCX0KLQkKLQkvKioKLQkgKiBMaWtlIHRoZSA8Y29kZT4jZXF1YWxzPC9jb2RlPiBtZXRob2QgdGhpcyBmdW5jdGlvbiBpcyBuZWVkZWQgc28KLQkgKiB0aGF0IHRoZSBpbnRlcm5hbCBFY2xpcHNlIHNlYXJjaCBBUElzIGNhbiBrZWVwIHRyYWNrIG9mIG1hdGNoZXMKLQkgKiB0aGF0IGFyZSBvbiB0aGUgc2FtZSBsaW5lLgotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGdldExpbmVOdW0oKSArIGdldExpbmUoKS5oYXNoQ29kZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvQmFzaWNTZWFyY2hRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9CYXNpY1NlYXJjaFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NDgyM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9CYXNpY1NlYXJjaFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotCi0vKioKLSAqIERlZmluZXMgYSBiYXNpYyBzZWFyY2ggcXVlcnkuICBUaGlzIHF1ZXJ5IGRvZXMgbm90IGRvIGFueXRoaW5nLCBpdCBuZWVkcyB0byBiZSBleHRlbmRlZAotICogYW5kIHRoZSA8Y29kZT57QGxpbmsgI2RvUXVlcnkoKX08L2NvZGU+IG1ldGhvZCBuZWVkcyB0byBiZSBvdmVycmlkZGVuIHRvIG1ha2UgdGhlIHF1ZXJ5Ci0gKiBhY3R1YWxseSBiZSBmdW5jdGlvbmFsLgotICoKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljU2VhcmNoUXVlcnkgaW1wbGVtZW50cyBJU2VhcmNoUXVlcnkgewotCS8qKgotCSAqIHRoZSBmaWxlIHdlJ3JlIHNlYXJjaGluZwotCSAqLwotCXByaXZhdGUgSUZpbGUgZkZpbGUgPSBudWxsOwotCQotCS8qKgotCSAqIFRoZSByZXN1bHQgb2YgdGhpcyBxdWVyeQotCSAqLwotCXByaXZhdGUgQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IGZSZXN1bHQgPSBudWxsOwotCi0JLyoqCi0JICogPHA+Q29uc3RydWN0IGEgbmV3IGJhc2ljIHF1ZXJ5LjwvcD4KLQkgKiAKLQkgKiA8cD48Yj5JTVBPUlRBTlQ6IDwvYj5JdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IGFmdGVyCi0JICogY3JlYXRpbmcgdGhlIHF1ZXJ5IGFuZCA8Yj5iZWZvcmU8L2I+IHJ1bm5pbmcgdGhlIHF1ZXJ5Ci0JICogdGhhdCB5b3UgY2FsbCB7QGxpbmsgI3NldFJlc3VsdChBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQpfS4KLQkgKiBUaGlzIGlzIG5vdCBhIHBhcmFtZXRlciBiZWNhdXNlIHR5cGljYWxseSBhIHNlYXJjaCByZXN1bHQgbmVlZHMKLQkgKiBhIHJlZmVyZW5jZSB0byBpdHMgcXVlcnkgYW5kIHRodXMgdGhlIHF1ZXJ5IG5lZWRzIHRvIGJlIGNvbnN0cnVjdGVkCi0JICogYmVmb3JlIGl0cyByZXN1bHQgb2JqZWN0IGNhbiBiZSBzZXQuPC9wPgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIHRoaXMgcXVlcnkgd2lsbCB0YWtlIHBsYWNlIG9uCi0JICovCi0JcHVibGljIEJhc2ljU2VhcmNoUXVlcnkoSUZpbGUgZmlsZSkgewotCQl0aGlzLmZGaWxlID0gZmlsZTsKLQl9Ci0JCi0JLyoqCi0JICogUnVucyB0aGUgcXVlcnkKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIGRvUXVlcnkoKTsKLQl9Ci0JCi0JLyoqCi0JICogcHVibGljIHRvIGF2b2lkIHN5bnRoZXRpYyBtZXRob2QgYWNjZXNzIGZyb20gaW5uZXIgY2xhc3MKLQkgKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZkZpbGU7Ci0JfQotCi0JLyoqCi0JICogVGhlcmUgaXMgbm8gZGVmYXVsdCBsYWJlbCBmb3IgYSBiYXNpYyBxdWVyeSwKLQkgKiB0aGlzIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IGltcGxlbWVudGluZyBjbGFzc2VzCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiA8cD5UaGlzIHdpbGwgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYge0BsaW5rICNzZXRSZXN1bHQoQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0KX0KLQkgKiBoYXMgbm90IGJlZW4gY2FsbGVkIHlldC48L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldFNlYXJjaFJlc3VsdCgpCi0JICovCi0JcHVibGljIElTZWFyY2hSZXN1bHQgZ2V0U2VhcmNoUmVzdWx0KCkgewotCQlyZXR1cm4gZlJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbWF0Y2ggdG8gdGhlIHJlc3VsdHMgb2YgdGhpcyBxdWVyeS4KLQkgKiAKLQkgKiA8cD48Yj5JTVBPUlRBTlQ6IDwvYj5JdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IGFmdGVyCi0JICogY3JlYXRpbmcgdGhlIHF1ZXJ5IGFuZCA8Yj5iZWZvcmU8L2I+IHJ1bm5pbmcgdGhlIHF1ZXJ5Ci0JICogdGhhdCB5b3UgY2FsbCB7QGxpbmsgI3NldFJlc3VsdChBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQpfS4KLQkgKiBUaGlzIGlzIG5vdCBhIHBhcmFtZXRlciBiZWNhdXNlIHR5cGljYWxseSBhIHNlYXJjaCByZXN1bHQgbmVlZHMKLQkgKiBhIHJlZmVyZW5jZSB0byBpdHMgcXVlcnkgYW5kIHRodXMgdGhlIHF1ZXJ5IG5lZWRzIHRvIGJlIGNvbnN0cnVjdGVkCi0JICogYmVmb3JlIGl0cyByZXN1bHQgb2JqZWN0IGNhbiBiZSBzZXQuPC9wPgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQgdGhlIG1hdGNoIGlzIGJlaW5nIGFkZGVkIHRvbwotCSAqIEBwYXJhbSBtYXRjaFN0YXJ0IHRoZSBzdGFydCBjaGFyYWN0ZXIgb2YgdGhlIG1hdGNoCi0JICogQHBhcmFtIG1hdGNoRW5kIHRoZSBlbmQgY2hhcmFjdGVyIG9mIHRoZSBtYXRjaAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1hdGNoKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG1hdGNoU3RhcnQsIGludCBtYXRjaEVuZCkgewotCi0JCXRyeSB7Ci0JCQlpbnQgbGluZU51bWJlciA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChtYXRjaFN0YXJ0KTsKLQkJCWludCBsaW5lU3RhcnQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmVOdW1iZXIpOwotCQkJaW50IGxpbmVMZW5ndGggPSBkb2N1bWVudC5nZXRMaW5lTGVuZ3RoKGxpbmVOdW1iZXIpOwotCi0JCQlTdHJpbmcgZWxlbWVudE1lc3NhZ2UgPSBkb2N1bWVudC5nZXQoKS5zdWJzdHJpbmcobGluZVN0YXJ0LCBsaW5lU3RhcnQgKyBsaW5lTGVuZ3RoKTsKLQkJCQotCQkJLy9hZGQgdGhlIG1hdGNoIHRvIHRoZSByZXN1bHQKLQkJCQlCYXNpY1NlYXJjaE1hdGNoRWxlbWVudCBlbGVtZW50ID0gbmV3IEJhc2ljU2VhcmNoTWF0Y2hFbGVtZW50KGZGaWxlLCBsaW5lTnVtYmVyLCBsaW5lU3RhcnQsIGVsZW1lbnRNZXNzYWdlKTsKLQkJCQlmUmVzdWx0LmFkZE1hdGNoKG5ldyBNYXRjaChlbGVtZW50LCBNYXRjaC5VTklUX0NIQVJBQ1RFUiwgbWF0Y2hTdGFydCwgbWF0Y2hFbmQgLSBtYXRjaFN0YXJ0KSk7Ci0JCQkKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPjxpPk5vdGU6IDwvaT4gYXMgb2YgeWV0IG5vIHRlc3RpbmcgaGFzIGdvbmUgaW50byB3aGV0aGVyIHRoaXMgcXVlcnkKLQkgKiBjYW4gYmUgcmUtcnVuIG9yIG5vdCBvciB3aGF0IHRoYXQgZXZlbiBlbnRhaWxzLjxwPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNjYW5SZXJ1bigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUmVydW4oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD5UaGlzIHF1ZXJ5IGNhbiBiZSBydW4gaW4gdGhlIGJhY2tncm91bmQ8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2NhblJ1bkluQmFja2dyb3VuZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuSW5CYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+VGhlIGFjdHVhbCB3b3JrIG9mIHRoZSBxdWVyeSwgY2FsbGVkIGJ5IHtAbGluayAjcnVuKElQcm9ncmVzc01vbml0b3IpfTwvcD4KLQkgKiA8cD48aT5Ob3RlOiA8L2k+VGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgaW1wbGVtZW50ZXJzIHNvIHRoYXQgdGhlaXIgcXVlcnkKLQkgKiB3aWxsIGFjdHVhbGx5IGRvIHNvbWV0aGluZzwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIHF1ZXJ5IHdoZW4gaXQgaGFzIGZpbmlzaGVkCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9RdWVyeSgpIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHRoaXMgcXVlcnkgZm91bmQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldE1hdGNoQ291bnQoKSB7Ci0JCXJldHVybiBmUmVzdWx0LmdldE1hdGNoQ291bnQoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+dXNlZCBpbiBzZWFyY2ggcmVzdWx0IGRpc3BsYXkgbGFiZWxzLCBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSBpbXBsZW1lbnRlcnM8L3A+Ci0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VhcmNoVGV4dCgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIDxwPlRoaXMgPGI+bmVlZHM8L2I+IHRvIGJlIGNhbGxlZCBhZnRlciBjb25zdHJ1Y3RpbmcKLQkgKiB0aGUgcXVlcnkgYnV0IGJlZm9yZSBydW5uaW5nIGl0LCBzZWUgbm90ZSBvbiB7QGxpbmsgI0Jhc2ljU2VhcmNoUXVlcnkoSUZpbGUpfTwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgdGhpcyBxdWVyeSB3aWxsIHVzZSB0byBzdG9yZSBpdHMgcmVzdWx0cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJlc3VsdChBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgcmVzdWx0KSB7Ci0JCXRoaXMuZlJlc3VsdCA9IHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0ZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0ZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYzc0ZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9GaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5FeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotLyoqCi0gKiBQZXJmb3JtcyB0aGUgYXBwcm9wcmlhdGUgRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGFjdGlvbiBjYWxsIGJhc2VkIG9uCi0gKiBzZWxlY3Rpb24uIENsaWVudHMgY2FuIGFkZCBwcm9jZXNzb3JzIGZvciBkaWZmZXJlbnQgcGFydGl0aW9ucyB2aWEKLSAqIDxjb2RlPmdldFByb2Nlc3NvcnM8L2NvZGU+Ci0gKiAKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCQlmRWRpdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5GaW5kT2NjdXJyZW5jZXNfbGFiZWwpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJYm9vbGVhbiBva2F5ID0gZmFsc2U7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGZFZGl0b3I7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gZ2V0VGV4dFNlbGVjdGlvbih0ZXh0RWRpdG9yKTsKLQkJCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZmluZE9jY3VycmVuY2VQcm9jZXNzb3IgPSBnZXRQcm9jZXNzb3JGb3JDdXJyZW50U2VsZWN0aW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQkJCQlpZiAoZmluZE9jY3VycmVuY2VQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJCQlpZiAodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJCQkJSUZpbGUgZmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgdGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0JCQkJCQlva2F5ID0gZmluZE9jY3VycmVuY2VQcm9jZXNzb3IuZmluZE9jY3VycmVuY2VzKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uLCBmaWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAob2theSkgewotCQkJLy8gY2xlYXIgc3RhdHVzIG1lc3NhZ2UKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gU1NFVUlNZXNzYWdlcy5GaW5kT2NjdXJyZW5jZXNBY3Rpb25Qcm92aWRlcl8wOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZkVkaXRvciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0RWRpdG9yKSB7Ci0JCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5VGVtcG9yYXJ5RXJyb3JNZXNzYWdlKCgoU3RydWN0dXJlZFRleHRFZGl0b3IpIGZFZGl0b3IpLmdldFRleHRWaWV3ZXIoKSwgZXJyb3JNZXNzYWdlKTsKLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0JCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5hZGRPbmVUaW1lQ2xlYXJMaXN0ZW5lcigpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gY2xlYXIgc3RhdHVzIG1lc3NhZ2UKLQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5jbGVhclN0YXR1c0xpbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGFwcHJvcHJpYXRlIGZpbmQgb2NjdXJyZW5jZXMgcHJvY2Vzc29yCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbm90IG51bGwKLQkgKiBAcGFyYW0gdGV4dFNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBnZXRQcm9jZXNzb3JGb3JDdXJyZW50U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQkvLyBjaGVjayBpZiB3ZSBoYXZlIGFuIGFjdGlvbiB0aGF0J3MgZW5hYmxlZCBvbiB0aGUgY3VycmVudCBwYXJ0aXRpb24KLQkJSVR5cGVkUmVnaW9uIHRyID0gZ2V0UGFydGl0aW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQkJU3RyaW5nIHBhcnRpdGlvbiA9IHRyICE9IG51bGwgPyB0ci5nZXRUeXBlKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCUl0ZXJhdG9yIGl0ID0gZ2V0UHJvY2Vzc29ycygpLml0ZXJhdG9yKCk7Ci0JCUZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBwcm9jZXNzb3IgPSBudWxsOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlwcm9jZXNzb3IgPSAoRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yKSBpdC5uZXh0KCk7Ci0JCQkvLyB3ZSBqdXN0IGNob29zZSB0aGUgZmlyc3QgYWN0aW9uIHRoYXQgY2FuIGhhbmRsZSB0aGUgcGFydGl0aW9uCi0JCQlpZiAocHJvY2Vzc29yLmVuYWJsZWRGb3JQYXJpdGl0aW9uKHBhcnRpdGlvbikpCi0JCQkJcmV0dXJuIHByb2Nlc3NvcjsKLQkJfQotCQlMaXN0IGV4dGVuZGVkRmluZE9jY3VycmVuY2VzUHJvY2Vzc29ycyA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9ucyhGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpLCBwYXJ0aXRpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZGVkRmluZE9jY3VycmVuY2VzUHJvY2Vzc29ycy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG8gPSBleHRlbmRlZEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcnMuZ2V0KGkpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IpIHsKLQkJCQkvKgotCQkJCSAqIFdlIGp1c3QgY2hvb3NlIHRoZSBmaXJzdCByZWdpc3RlcmVkIHByb2Nlc3NvciB0aGF0Ci0JCQkJICogZXhwbGljaXRseSBzYXlzIGl0IGNhbiBoYW5kbGUgdGhlIHBhcnRpdGlvbgotCQkJCSAqLwotCQkJCXByb2Nlc3NvciA9IChGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IpIG87Ci0JCQkJaWYgKHByb2Nlc3Nvci5lbmFibGVkRm9yUGFyaXRpdGlvbihwYXJ0aXRpb24pKQotCQkJCQlyZXR1cm4gcHJvY2Vzc29yOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSVR5cGVkUmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCWlmICh0ZXh0U2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmVnaW9uID0gZG9jdW1lbnQuZ2V0UGFydGl0aW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZWdpb24gPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi0JcHJpdmF0ZSBJVGV4dFNlbGVjdGlvbiBnZXRUZXh0U2VsZWN0aW9uKElUZXh0RWRpdG9yIHRleHRFZGl0b3IpIHsKLQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IG51bGw7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24gJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJfQotCQlyZXR1cm4gdGV4dFNlbGVjdGlvbjsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgTGlzdCBnZXRQcm9jZXNzb3JzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0ZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9GaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlMDkxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0ZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0vKioKLSAqIDxwPgotICogRmluZHMgb2NjdXJyZW5jZXMgb2YgYSBzcGVjaWZpZWQgcmVnaW9uIHR5cGUgdy8gcmVnaW9uIHRleHQgaW4gYW4KLSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnQuIENsaWVudHMgbXVzdCBpbXBsZW1lbnQgZ2V0UGFydGl0aW9uVHlwZXMoKSBhbmQKLSAqIGdldFJlZ2lvblR5cGVzKCkgdG8gaW5kaWNhdGUgd2hpY2ggcGFydGl0aW9uIHR5cGVzIGFuZCByZWdpb24gdHlwZXMgaXQgY2FuCi0gKiBvcGVyYXRlIG9uLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIENsaWVudHMgc2hvdWxkIG92ZXJyaWRlIDxjb2RlPmdldFNlYXJjaFF1ZXJ5KCk8L2NvZGU+IGluIG9yZGVyIHRvIHByb3ZpZGUKLSAqIHRoZWlyIG93biB0eXBlIG9mICJzZWFyY2giIChlZy4gc2VhcmNoaW5nIGZvciBYTUwgc3RhcnQgdGFncywgc2VhcmNoaW5nIGZvcgotICogSmF2YSBlbGVtZW50cywgZXRjLi4uKQotICogPC9wPgotICogCi0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgewotCXB1YmxpYyBib29sZWFuIGZpbmRPY2N1cnJlbmNlcyhJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24sIElGaWxlIGZpbGUpIHsKLQkJYm9vbGVhbiBmaW5kT2NjdXJyZW5jZXMgPSBmYWxzZTsKLQotCQkvLyBkZXRlcm1pbmUgaWYgYWN0aW9uIHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdAotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudDsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQodGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQlpZiAoc2RSZWdpb24gIT0gbnVsbCkgewotCQkJCUlUZXh0UmVnaW9uIHIgPSBzZFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQkJCQlpZiAociAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB0eXBlID0gci5nZXRUeXBlKCk7Ci0JCQkJCWlmIChlbmFibGVkRm9yUmVnaW9uVHlwZSh0eXBlKSkgewotCQkJCQkJU3RyaW5nIG1hdGNoVGV4dCA9IHNkUmVnaW9uLmdldFRleHQocik7Ci0KLQkJCQkJCS8vIGZpcnN0IG9mIGFsbCBhY3RpdmF0ZSB0aGUgdmlldwotCQkJCQkJTmV3U2VhcmNoVUkuYWN0aXZhdGVTZWFyY2hSZXN1bHRWaWV3KCk7Ci0KLQkJCQkJCWlmIChtYXRjaFRleHQgIT0gbnVsbCAmJiB0eXBlICE9IG51bGwpIHsKLQkJCQkJCQlJU2VhcmNoUXVlcnkgc2VhcmNoUXVlcnkgPSBnZXRTZWFyY2hRdWVyeShmaWxlLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIG1hdGNoVGV4dCwgdHlwZSwgdGV4dFNlbGVjdGlvbik7Ci0JCQkJCQkJaWYgKHNlYXJjaFF1ZXJ5ICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKHNlYXJjaFF1ZXJ5LmNhblJ1bkluQmFja2dyb3VuZCgpKQotCQkJCQkJCQkJTmV3U2VhcmNoVUkucnVuUXVlcnlJbkJhY2tncm91bmQoc2VhcmNoUXVlcnkpOwotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQlOZXdTZWFyY2hVSS5ydW5RdWVyeUluRm9yZWdyb3VuZChudWxsLCBzZWFyY2hRdWVyeSk7Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmRPY2N1cnJlbmNlcyA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbmRPY2N1cnJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVnaW9uVHlwZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gY2FuIG9wZXJhdGUgb24gdGhpcyByZWdpb24KLQkgKiAgICAgICAgIHR5cGUgKElUZXh0UmVnaW9uKSwgb3RoZXJ3aXNlIGZhbHNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZWRGb3JSZWdpb25UeXBlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0KLQkJU3RyaW5nW10gYWNjZXB0ID0gZ2V0UmVnaW9uVHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY2NlcHQubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChyZWdpb25UeXBlLmVxdWFscyhhY2NlcHRbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDbGllbnRzIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIGVuYWJsZSBmaW5kIG9jY3VycmVuY2VzIG9uIGNlcnRhaW4KLQkgKiBwYXJ0aXRpb24ocykuCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZ1tdIGdldFBhcnRpdGlvblR5cGVzKCk7Ci0KLQkvKioKLQkgKiBDbGllbnRzIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIGVuYWJsZSBmaW5kIG9jY3VycmVuY2VzIG9uIGRpZmZlcmVudAotCSAqIHJlZ2lvbiB0eXBlKHMpLgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmdbXSBnZXRSZWdpb25UeXBlcygpOwotCi0JLyoqCi0JICogQ2xpZW50cyBzaG91bGQgb3ZlcnJpZGUgdG8gcHJvdmlkZSB0aGVpciBvd24gc2VhcmNoIGZvciB0aGUgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSVNlYXJjaFF1ZXJ5IGdldFNlYXJjaFF1ZXJ5KElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyByZWdpb25UZXh0LCBTdHJpbmcgcmVnaW9uVHlwZSwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IE9jY3VycmVuY2VzU2VhcmNoUXVlcnkoZmlsZSwgZG9jdW1lbnQsIHJlZ2lvblRleHQsIHJlZ2lvblR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBjYW4gb3BlcmF0ZSBvbiB0aGlzIHR5cGUgb2YKLQkgKiAgICAgICAgIHBhcnRpdGlvbiwgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlbmFibGVkRm9yUGFyaXRpdGlvbihTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlTdHJpbmdbXSBhY2NlcHQgPSBnZXRQYXJ0aXRpb25UeXBlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjY2VwdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBhcnRpdGlvblR5cGUuZXF1YWxzKGFjY2VwdFtpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvT2NjdXJyZW5jZXNDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvT2NjdXJyZW5jZXNDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0YzliNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBPY2N1cnJlbmNlc0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHJpdmF0ZSBPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdCBmUmVzdWx0ID0gbnVsbDsKLQlwcml2YXRlIFRhYmxlVmlld2VyIGZUYWJsZVZpZXdlciA9IG51bGw7Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHRoaXMuZlRhYmxlVmlld2VyICE9IG51bGwpCi0JCQl0aGlzLmZUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGVsZW1lbnRzQ2hhbmdlZChPYmplY3RbXSB1cGRhdGVkRWxlbWVudHMpIHsKLQotCQkvL1RPRE86IGNvcGllZCBmcm9tIEphdmFTZWFyY2hUYWJsZUNvbnRlbnRQcm92aWRlcgotCQlpbnQgYWRkQ291bnQgPSAwOwotCQlpbnQgcmVtb3ZlQ291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVwZGF0ZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRoaXMuZlJlc3VsdC5nZXRNYXRjaENvdW50KHVwZGF0ZWRFbGVtZW50c1tpXSkgPiAwKSB7Ci0JCQkJaWYgKHRoaXMuZlRhYmxlVmlld2VyLnRlc3RGaW5kSXRlbSh1cGRhdGVkRWxlbWVudHNbaV0pICE9IG51bGwpCi0JCQkJCXRoaXMuZlRhYmxlVmlld2VyLnJlZnJlc2godXBkYXRlZEVsZW1lbnRzW2ldKTsKLQkJCQllbHNlCi0JCQkJCXRoaXMuZlRhYmxlVmlld2VyLmFkZCh1cGRhdGVkRWxlbWVudHNbaV0pOwotCQkJCWFkZENvdW50Kys7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuZlRhYmxlVmlld2VyLnJlbW92ZSh1cGRhdGVkRWxlbWVudHNbaV0pOwotCQkJCXJlbW92ZUNvdW50Kys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0KLQkJdGhpcy5mUmVzdWx0ID0gKE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0KSBpbnB1dEVsZW1lbnQ7Ci0JCXJldHVybiB0aGlzLmZSZXN1bHQuZ2V0RWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCi0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVZpZXdlcikKLQkJCXRoaXMuZlRhYmxlVmlld2VyID0gKFRhYmxlVmlld2VyKSB2aWV3ZXI7Ci0JCXRoaXMuZlJlc3VsdCA9IChPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdCkgbmV3SW5wdXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQotCQlpZiAodGhpcy5mVGFibGVWaWV3ZXIgIT0gbnVsbCkKLQkJCXRoaXMuZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoUXVlcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvT2NjdXJyZW5jZXNTZWFyY2hRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzdiYWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvT2NjdXJyZW5jZXNTZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi0vKioKLSAqIEJhc2ljIElTZWFyY2hRdWVyeSB0aGF0IGZpbmRzIG1hdGNoZXMgb2YgcmVnaW9uIHR5cGUgYW5kIHJlZ2lvbiB0ZXh0LgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgT2NjdXJyZW5jZXNTZWFyY2hRdWVyeSBleHRlbmRzIEJhc2ljU2VhcmNoUXVlcnkgewotCi0JLyoqCi0JICogV2UgbmVlZCBhIHJ1bm5hYmxlIHNvIHRoYXQgdGhlIHNlYXJjaCBtYXJrZXJzIHNob3cgdXAgaW4gdGhlIGxpdmUKLQkgKiBkb2N1bWVudC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIEZpbmRSZWdpb25zIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlIHsKLQotCQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZkZpbmRSZWdpb25zRG9jdW1lbnQgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBmTWF0Y2hOYW1lID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgZk1hdGNoUmVnaW9uVHlwZSA9IG51bGw7Ci0KLQkJcHVibGljIEZpbmRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBtYXRjaFRleHQsIFN0cmluZyBtYXRjaFJlZ2lvblR5cGUpIHsKLQotCQkJdGhpcy5mRmluZFJlZ2lvbnNEb2N1bWVudCA9IGRvY3VtZW50OwotCQkJdGhpcy5mTWF0Y2hOYW1lID0gbWF0Y2hUZXh0OwotCQkJdGhpcy5mTWF0Y2hSZWdpb25UeXBlID0gbWF0Y2hSZWdpb25UeXBlOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGZpbmRPY2N1cnJlbmNlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQkJaWYgKCFpc0NhbmNlbGVkKG1vbml0b3IpKSB7Ci0KLQkJCQlpbnQgbWF0Y2hTdGFydCA9IC0xOwotCQkJCWludCBtYXRjaEVuZCA9IC0xOwotCQkJCVN0cmluZyBmaW5kUmVnaW9uVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG51bGw7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50ID0gdGhpcy5mRmluZFJlZ2lvbnNEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCQkJLy8gdGhpcyBpcyB0aGUgbWFpbiBsb29wIHRoYXQgaXRlcmF0ZXMgdGhlIGRvY3VtZW50Ci0JCQkJd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCAmJiAhaXNDYW5jZWxlZChtb25pdG9yKSkgewotCQkJCQlyZWdpb25zID0gY3VycmVudC5nZXRSZWdpb25zKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCkgJiYgIWlzQ2FuY2VsZWQobW9uaXRvcik7IGkrKykgewotCi0JCQkJCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0KLQkJCQkJCS8vIG1heWJlIHRoaXMgaXMgdGhlIGVxdWFscyBjaGVjayB3aGVyZSBzb21lIHZhbGlkCi0JCQkJCQkvLyBtYXRjaGVzIGFyZSBmYWlsaW5nIChsaWtlIHNlYXJjaGluZyBvbiBlbmQgdGFnKQotCQkJCQkJaWYgKHIuZ2V0VHlwZSgpLmVxdWFscyh0aGlzLmZNYXRjaFJlZ2lvblR5cGUpICYmIGN1cnJlbnQuZ2V0VGV4dChyKS5lcXVhbHModGhpcy5mTWF0Y2hOYW1lKSkgewotCi0JCQkJCQkJZmluZFJlZ2lvblRleHQgPSBjdXJyZW50LmdldFRleHQocik7Ci0KLQkJCQkJCQkvLyByZWdpb24gZm91bmQKLQkJCQkJCQltYXRjaFN0YXJ0ID0gY3VycmVudC5nZXRTdGFydE9mZnNldChyKTsKLQkJCQkJCQltYXRjaEVuZCA9IG1hdGNoU3RhcnQgKyBmaW5kUmVnaW9uVGV4dC50cmltKCkubGVuZ3RoKCk7Ci0KLQkJCQkJCQlhZGRNYXRjaCh0aGlzLmZGaW5kUmVnaW9uc0RvY3VtZW50LCBtYXRjaFN0YXJ0LCBtYXRjaEVuZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY3VycmVudCA9IGN1cnJlbnQuZ2V0TmV4dCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBpc0NhbmNlbGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJcmV0dXJuIG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkJdHJ5IHsKLQkJCQlmaW5kT2NjdXJyZW5jZXMobW9uaXRvcik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ly8gZW5kIGlubmVyIGNsYXNzIEZpbmRSZWdpb25zCi0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZSZWdpb25UZXh0ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmUmVnaW9uVHlwZSA9IG51bGw7Ci0KLQlwdWJsaWMgT2NjdXJyZW5jZXNTZWFyY2hRdWVyeShJRmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcmVnaW9uVGV4dCwgU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJc3VwZXIoZmlsZSk7Ci0JCXN1cGVyLnNldFJlc3VsdChuZXcgT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQodGhpcykpOwotCQl0aGlzLmZEb2N1bWVudCA9IGRvY3VtZW50OwotCQl0aGlzLmZSZWdpb25UZXh0ID0gcmVnaW9uVGV4dDsKLQkJdGhpcy5mUmVnaW9uVHlwZSA9IHJlZ2lvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPHA+PGk+Tm90ZTogPC9pPlNvbWUgaW52ZXN0aWdhdGlvbiBuZWVkcyB0byBiZSBwdXQgaW50byBob3cgdG8gZG8gdGhpcyBzYWZlbHk8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5CYXNpY1NlYXJjaFF1ZXJ5I2NhblJ1bkluQmFja2dyb3VuZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuSW5CYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIDxwPlRoZSBsYWJlbCBmb3JtYXQgaXM6PGJyLz4KLQkgKiBzZWFyY2hUZXh0IC0gIyBvY2N1cnJlbmNlcyBpbiBmaWxlPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guQmFzaWNTZWFyY2hRdWVyeSNnZXRMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJU3RyaW5nIGxhYmVsID0gU1NFVUlNZXNzYWdlcy5PY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzA7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nW10gYXJncyA9IHtnZXRTZWFyY2hUZXh0KCksICIiICsgc3VwZXIuZ2V0TWF0Y2hDb3VudCgpLCBnZXRGaWxlbmFtZSgpfTsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGxhYmVsLCBhcmdzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHF1ZXJ5IGxvb2tzIGZvciBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNlbGVjdGVkIHN0cmluZwotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guQmFzaWNTZWFyY2hRdWVyeSNkb1F1ZXJ5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1F1ZXJ5KCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCUZpbmRSZWdpb25zIGZpbmRSZWdpb25zID0gbmV3IEZpbmRSZWdpb25zKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZSZWdpb25UZXh0LCB0aGlzLmZSZWdpb25UeXBlKTsKLQkJdHJ5IHsKLQkJCS8vIEJVRzE1ODg0NiAtIGRlYWRsb2NrIGlmIGxvY2sgdXAgZW50aXJlIHdvcmtzcGFjZSwgc28gb25seSBsb2NrCi0JCQkvLyB1cCB0aGUgZmlsZSB3ZSBhcmUgc2VhcmNoaW5nIG9uCi0JCQlJU2NoZWR1bGluZ1J1bGUgbWFya2VyUnVsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLm1hcmtlclJ1bGUoZ2V0RmlsZSgpKTsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4oZmluZFJlZ2lvbnMsIG1hcmtlclJ1bGUsIElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLCBudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLk9LLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VhcmNoVGV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuZlJlZ2lvblRleHQ7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEZpbGVuYW1lKCkgewotCQlTdHJpbmcgZmlsZW5hbWUgPSBTU0VVSU1lc3NhZ2VzLk9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMjsgLy8kTk9OLU5MUy0xJCAiZmlsZSIKLQkJaWYgKGdldEZpbGUoKSAhPSBudWxsKQotCQkJZmlsZW5hbWUgPSBnZXRGaWxlKCkuZ2V0TmFtZSgpLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBmaWxlbmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoUmVzdWx0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwODI3NzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9PY2N1cnJlbmNlc1NlYXJjaFJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUVkaXRvck1hdGNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5JRmlsZU1hdGNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQgZXh0ZW5kcyBBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgaW1wbGVtZW50cyBJRWRpdG9yTWF0Y2hBZGFwdGVyLCBJRmlsZU1hdGNoQWRhcHRlciB7Ci0KLQlwcml2YXRlIElTZWFyY2hRdWVyeSBmUXVlcnkgPSBudWxsOwotCXByaXZhdGUgZmluYWwgTWF0Y2hbXSBOT19NQVRDSEVTID0gbmV3IE1hdGNoWzBdOwotCi0JcHVibGljIE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0KElTZWFyY2hRdWVyeSBxdWVyeSkgewotCQl0aGlzLmZRdWVyeSA9IHF1ZXJ5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUVkaXRvck1hdGNoQWRhcHRlciNjb21wdXRlQ29udGFpbmVkTWF0Y2hlcyhvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCkKLQkgKi8KLQlwdWJsaWMgTWF0Y2hbXSBjb21wdXRlQ29udGFpbmVkTWF0Y2hlcyhBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgcmVzdWx0LCBJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQotCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQ7Ci0JCQlyZXR1cm4gY29tcHV0ZUNvbnRhaW5lZE1hdGNoZXMocmVzdWx0LCBmaWxlRWRpdG9ySW5wdXQuZ2V0RmlsZSgpKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5OT19NQVRDSEVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUZpbGVNYXRjaEFkYXB0ZXIjY29tcHV0ZUNvbnRhaW5lZE1hdGNoZXMob3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUpCi0JICovCi0JcHVibGljIE1hdGNoW10gY29tcHV0ZUNvbnRhaW5lZE1hdGNoZXMoQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdCwgSUZpbGUgZmlsZSkgewotCQlNYXRjaFtdIG1hdGNoZXMgPSB0aGlzLmdldE1hdGNoZXMoKTsKLQkJTWF0Y2hbXSBjb250YWluZWRNYXRjaGVzID0gbmV3IE1hdGNoWzBdOwotCQkKLQkJLyogb25seSBjb250YWlucyBtYXRjaGVzIGlmIHRoZSBmaWxlIGZvciBvbmUgb2YgdGhlIG1hdGNoZXMgaXMgdGhlCi0JCSAqIHNhbWUgYXMgdGhlIGdpdmVuIGZpbGUuCi0JCSAqIE5vdGU6IGFsbCBtYXRjaGVzIGluIGEgcmVzdWx0IGFyZSByZWxhdGVkIHRvIHRoZSBzYW1lIGZpbGUKLQkJICovCi0JCWlmKG1hdGNoZXMubGVuZ3RoID4gMCAmJgotCQkJbWF0Y2hlc1swXS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBCYXNpY1NlYXJjaE1hdGNoRWxlbWVudCAmJgotCQkJKChCYXNpY1NlYXJjaE1hdGNoRWxlbWVudCltYXRjaGVzWzBdLmdldEVsZW1lbnQoKSkuZ2V0RmlsZSgpLmVxdWFscyhmaWxlKSkgewotCQkJCi0JCQljb250YWluZWRNYXRjaGVzID0gbWF0Y2hlczsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVkTWF0Y2hlczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCNnZXRFZGl0b3JNYXRjaEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBJRWRpdG9yTWF0Y2hBZGFwdGVyIGdldEVkaXRvck1hdGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5JRmlsZU1hdGNoQWRhcHRlciNnZXRGaWxlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElGaWxlIGdldEZpbGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJLy8gcmV0dXJuIHRoZSBmaWxlIGZvciB0aGUgbWF0Y2gKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJnZXQgZmlsZSBmb3I6IitlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTWFya2VyKSB7Ci0JCQlJUmVzb3VyY2UgciA9ICgoSU1hcmtlcikgZWxlbWVudCkuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChyIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlmaWxlID0gKElGaWxlKSByOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXB1YmxpYyBJRmlsZU1hdGNoQWRhcHRlciBnZXRGaWxlTWF0Y2hBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX09DQ19NQVRDSCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBsYWJlbCBzaG93cyB1cCBpbiB0aGUgc2VhcmNoIGhpc3RvcnkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gZ2V0UXVlcnkoKS5nZXRMYWJlbCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG1hdGNoZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVzdWx0Ci0JICovCi0JcHVibGljIE1hdGNoW10gZ2V0TWF0Y2hlcygpIHsKLQkJcmV0dXJuIGNvbGxlY3RNYXRjaGVzKGdldEVsZW1lbnRzKCkpOwotCX0KLQotCXB1YmxpYyBJU2VhcmNoUXVlcnkgZ2V0UXVlcnkoKSB7Ci0JCXJldHVybiB0aGlzLmZRdWVyeTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2x0aXAoKSB7Ci0JCXJldHVybiBnZXRMYWJlbCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUVkaXRvck1hdGNoQWRhcHRlciNpc1Nob3duSW5FZGl0b3Iob3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2gsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3duSW5FZGl0b3IoTWF0Y2ggbWF0Y2gsIElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+VGFrZW4gZnJvbSB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnNlYXJjaC5PY2N1cnJlbmNlc1NlYXJjaFJlc3VsdCNjb2xsZWN0TWF0Y2hlc308L3A+Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzIGdldCB0aGUgbWF0Y2hlcyBmb3IgdGhlc2UgZWxlbWVudHMKLQkgKiBAcmV0dXJuIHRoZSBtYXRjaGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlc3VsdAotCSAqLwotCXByaXZhdGUgTWF0Y2hbXSBjb2xsZWN0TWF0Y2hlcyhPYmplY3RbXSBlbGVtZW50cykgewotCQlNYXRjaFtdIG1hdGNoZXM9IG5ldyBNYXRjaFtnZXRNYXRjaENvdW50KCldOwotCQlpbnQgd3JpdGVJbmRleD0gMDsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlNYXRjaFtdIHBlckVsZW1lbnQ9IGdldE1hdGNoZXMoZWxlbWVudHNbaV0pOwotCQkJZm9yIChpbnQgaj0gMDsgaiA8IHBlckVsZW1lbnQubGVuZ3RoOyBqKyspIHsKLQkJCQltYXRjaGVzW3dyaXRlSW5kZXgrK109IHBlckVsZW1lbnRbal07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1hdGNoZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9PY2N1cnJlbmNlc1NlYXJjaFZpZXdQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoVmlld1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU2MTk4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoVmlld1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVsZWdhdGluZ1N0eWxlZENlbGxMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLS8qKgotICogQmFzZSBwYWdlIGZvciBPY2N1cnJlbmNlcyBpbiBmaWxlIHNlYXJjaCByZXN1bHRzLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgT2NjdXJyZW5jZXNTZWFyY2hWaWV3UGFnZSBleHRlbmRzIEFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlIHsKLQotCXByaXZhdGUgT2NjdXJyZW5jZXNDb250ZW50UHJvdmlkZXIgZkNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0KLQlwdWJsaWMgT2NjdXJyZW5jZXNTZWFyY2hWaWV3UGFnZSgpIHsKLQkJc3VwZXIoQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UuRkxBR19MQVlPVVRfRkxBVCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNjbGVhcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXIoKSB7Ci0JCWlmICh0aGlzLmZDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRoaXMuZkNvbnRlbnRQcm92aWRlci5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UjY29uZmlndXJlVGFibGVWaWV3ZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVUYWJsZVZpZXdlcihUYWJsZVZpZXdlciB2aWV3ZXIpIHsKLQotCQkvL3NvcnQgcmVzdWx0cyBieSBsaW5lIG51bWJlciwgbG93IHRvIGhpZ2gKLQkJdmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHYsIE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMikgewotCQkJCUJhc2ljU2VhcmNoTWF0Y2hFbGVtZW50IGVsZW0xPSAoQmFzaWNTZWFyY2hNYXRjaEVsZW1lbnQpIG9iajE7Ci0JCQkJQmFzaWNTZWFyY2hNYXRjaEVsZW1lbnQgZWxlbTI9IChCYXNpY1NlYXJjaE1hdGNoRWxlbWVudCkgb2JqMjsKLQkJCQlyZXR1cm4gZWxlbTEuZ2V0TGluZU51bSgpIC0gZWxlbTIuZ2V0TGluZU51bSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vYWxsb3cgZm9yIGZvcm1hdGVkIGxhYmVscwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRGVsZWdhdGluZ1N0eWxlZENlbGxMYWJlbFByb3ZpZGVyKG5ldyBCYXNpY1NlYXJjaExhYmVsUHJvdmlkZXIodGhpcykpKTsKLQkJdGhpcy5mQ29udGVudFByb3ZpZGVyID0gbmV3IE9jY3VycmVuY2VzQ29udGVudFByb3ZpZGVyKCk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIodGhpcy5mQ29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI2NvbmZpZ3VyZVRyZWVWaWV3ZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVRyZWVWaWV3ZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gbm90IHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNlbGVtZW50c0NoYW5nZWQoamF2YS5sYW5nLk9iamVjdFtdKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVsZW1lbnRzQ2hhbmdlZChPYmplY3RbXSBvYmplY3RzKSB7Ci0JCWlmICh0aGlzLmZDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJdGhpcy5mQ29udGVudFByb3ZpZGVyLmVsZW1lbnRzQ2hhbmdlZChvYmplY3RzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcmNlUmVmcmVzaCgpIHsKLQkJdGhpcy5mQ29udGVudFByb3ZpZGVyLnJlZnJlc2goKTsKLQl9Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hQYWdlIGdldEFjdGl2ZVBhZ2UoKSB7Ci0KLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2Ujc2hvd01hdGNoKG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoLAotCSAqICAgICAgaW50LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd01hdGNoKE1hdGNoIG1hdGNoLCBpbnQgY3VycmVudE9mZnNldCwgaW50IGN1cnJlbnRMZW5ndGgsIGJvb2xlYW4gYWN0aXZhdGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUJhc2ljU2VhcmNoTWF0Y2hFbGVtZW50IGVsZW1lbnQgPSAoQmFzaWNTZWFyY2hNYXRjaEVsZW1lbnQpIG1hdGNoLmdldEVsZW1lbnQoKTsKLQkJCi0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBnZXRBY3RpdmVQYWdlKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQkJLy8gb3BlbiBlZGl0b3IgaWYgbmVlZGVkCi0JCQkJSURFLm9wZW5FZGl0b3IoZ2V0QWN0aXZlUGFnZSgpLCBlbGVtZW50LmdldEZpbGUoKSk7Ci0JCQkJLy9zZXQgdGhlIHNlbGVjdGlvbiBpbiB0aGUgb3BlbiBlZGl0b3IKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBhY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCWlmIChhY3RpdmF0ZSkKLQkJCQkJZWRpdG9yLmdldFNpdGUoKS5nZXRQYWdlKCkuYWN0aXZhdGUoZWRpdG9yKTsKLQkJCQllZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKAotCQkJCQluZXcgVGV4dFNlbGVjdGlvbihjdXJyZW50T2Zmc2V0LCBjdXJyZW50TGVuZ3RoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIHBvc3NpYmxlIGV4Y2VwdGlvbiB0cnlpbmcgdG8gb3BlbiBlZGl0b3IKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbkhpc3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU2VsZWN0aW9uSGlzdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWE4ODU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU2VsZWN0aW9uSGlzdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uSGlzdG9yeSB7Ci0JcHJpdmF0ZSBJVGV4dEVkaXRvciBmRWRpdG9yOwotCXByaXZhdGUgTGlzdCBmSGlzdG9yeTsKLQlwcml2YXRlIExpc3QgZkhpc3RvcnlBY3Rpb25zOwotCXByaXZhdGUgaW50IGZTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckNvdW50ZXI7Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGZTZWxlY3Rpb25MaXN0ZW5lcjsKLQotCXB1YmxpYyBTZWxlY3Rpb25IaXN0b3J5KElUZXh0RWRpdG9yIGVkaXRvcikgewotCQlBc3NlcnQuaXNOb3ROdWxsKGVkaXRvcik7Ci0JCWZFZGl0b3IgPSBlZGl0b3I7Ci0JCWZIaXN0b3J5ID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJZlNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWlmIChmU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJDb3VudGVyID09IDApCi0JCQkJCWZsdXNoKCk7Ci0JCQl9Ci0JCX07Ci0JCWZFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmRWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWZFZGl0b3IgPSBudWxsOwotCQlpZiAoZkhpc3RvcnkgIT0gbnVsbCAmJiAhZkhpc3RvcnkuaXNFbXB0eSgpKSB7Ci0JCQlmSGlzdG9yeS5jbGVhcigpOwotCQl9Ci0JCWlmIChmSGlzdG9yeUFjdGlvbnMgIT0gbnVsbCAmJiAhZkhpc3RvcnlBY3Rpb25zLmlzRW1wdHkoKSkgewotCQkJZkhpc3RvcnlBY3Rpb25zLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBmbHVzaCgpIHsKLQkJaWYgKGZIaXN0b3J5LmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJZkhpc3RvcnkuY2xlYXIoKTsKLQkJdXBkYXRlSGlzdG9yeUFjdGlvbigpOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldExhc3QoKSB7Ci0JCWlmIChpc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IHNpemUgPSBmSGlzdG9yeS5zaXplKCk7Ci0JCUlSZWdpb24gcmVzdWx0ID0gKElSZWdpb24pIGZIaXN0b3J5LnJlbW92ZShzaXplIC0gMSk7Ci0JCXVwZGF0ZUhpc3RvcnlBY3Rpb24oKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpZ25vcmVTZWxlY3Rpb25DaGFuZ2VzKCkgewotCQlmU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJDb3VudGVyKys7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIGZIaXN0b3J5LmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0ZW5Ub1NlbGVjdGlvbkNoYW5nZXMoKSB7Ci0JCWZTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckNvdW50ZXItLTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1lbWJlcihJUmVnaW9uIHJlZ2lvbikgewotCQlmSGlzdG9yeS5hZGQocmVnaW9uKTsKLQkJdXBkYXRlSGlzdG9yeUFjdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhpc3RvcnlBY3Rpb24oSUFjdGlvbiBhY3Rpb24pIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChhY3Rpb24pOwotCQkKLQkJaWYgKGZIaXN0b3J5QWN0aW9ucyA9PSBudWxsKQotCQkJZkhpc3RvcnlBY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoIWZIaXN0b3J5QWN0aW9ucy5jb250YWlucyhhY3Rpb24pKQotCQkJZkhpc3RvcnlBY3Rpb25zLmFkZChhY3Rpb24pOwotCQkKLQkJLy8gdXBkYXRlIGFjdGlvbgotCQlpZiAoZkhpc3RvcnkgIT0gbnVsbCAmJiAhZkhpc3RvcnkuaXNFbXB0eSgpKQotCQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWVsc2UKLQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlSGlzdG9yeUFjdGlvbigpIHsKLQkJaWYgKGZIaXN0b3J5QWN0aW9ucyAhPSBudWxsICYmICFmSGlzdG9yeUFjdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQlib29sZWFuIGVuYWJsZWQgPSBmYWxzZTsKLQkJCWlmIChmSGlzdG9yeSAhPSBudWxsICYmICFmSGlzdG9yeS5pc0VtcHR5KCkpCi0JCQkJZW5hYmxlZCA9IHRydWU7Ci0KLQkJCUl0ZXJhdG9yIGl0ZXIgPSBmSGlzdG9yeUFjdGlvbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCSgoSUFjdGlvbilpdGVyLm5leHQoKSkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlU2VsZWN0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZVNlbGVjdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzI3ZDM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlU2VsZWN0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCB1c2UgU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlIGluc3RlYWQKLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RydWN0dXJlU2VsZWN0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRFZGl0b3IgZkVkaXRvciA9IG51bGw7Ci0JcHJvdGVjdGVkIFNlbGVjdGlvbkhpc3RvcnkgZkhpc3Rvcnk7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgZk1vZGVsID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRWaWV3ZXIgZlZpZXdlciA9IG51bGw7Ci0KLQlwdWJsaWMgU3RydWN0dXJlU2VsZWN0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yIGVkaXRvcikgewotCQlzdXBlcigpOwotCi0JCUFzc2VydC5pc05vdE51bGwoZWRpdG9yKTsKLQkJZkVkaXRvciA9IGVkaXRvcjsKLQkJZkhpc3RvcnkgPSAoU2VsZWN0aW9uSGlzdG9yeSkgZWRpdG9yLmdldEFkYXB0ZXIoU2VsZWN0aW9uSGlzdG9yeS5jbGFzcyk7Ci0JCWZWaWV3ZXIgPSBlZGl0b3IuZ2V0VGV4dFZpZXdlcigpOwotCQlmTW9kZWwgPSBlZGl0b3IuZ2V0TW9kZWwoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmVmlld2VyKTsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKCk7Ci0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRJbmRleGVkUmVnaW9uKGludCBvZmZzZXQpIHsKLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbnQgbGFzdE9mZnNldCA9IG9mZnNldDsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZkVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZkVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpbmRleGVkUmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihsYXN0T2Zmc2V0KTsKLQkJCQl3aGlsZSAoaW5kZXhlZFJlZ2lvbiA9PSBudWxsICYmIGxhc3RPZmZzZXQgPj0gMCkgewotCQkJCQlsYXN0T2Zmc2V0LS07Ci0JCQkJCWluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGxhc3RPZmZzZXQpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oTm9kZSBub2RlLCBSZWdpb24gcmVnaW9uKTsKLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJUmVnaW9uIGN1cnJlbnRSZWdpb24gPSBuZXcgUmVnaW9uKGZWaWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpLngsIGZWaWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpLnkpOwotCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRMZW5ndGgoKSA9PSBmVmlld2VyLmdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpCi0JCQlyZXR1cm47Ci0KLQkJSW5kZXhlZFJlZ2lvbiBjdXJzb3JJbmRleGVkUmVnaW9uID0gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbigpOwotCQlpZiAoY3Vyc29ySW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgY3Vyc29yTm9kZSA9IChOb2RlKSBjdXJzb3JJbmRleGVkUmVnaW9uOwotCi0JCQkvLyB1c2UgcGFyZW50IG5vZGUgZm9yIGVtcHR5IHRleHQgbm9kZQotCQkJaWYgKGN1cnNvck5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBjdXJzb3JOb2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJY3Vyc29yTm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJaWYgKGN1cnNvck5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKQotCQkJCQljdXJzb3JJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIGN1cnNvck5vZGU7Ci0JCQl9Ci0KLQkJCVJlZ2lvbiBjdXJzb3JOb2RlUmVnaW9uID0gbmV3IFJlZ2lvbihjdXJzb3JJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnNvckluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBjdXJzb3JJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCi0JCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJCWlmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IGN1cnJlbnRSZWdpb24uZ2V0T2Zmc2V0KCkgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBjdXJyZW50UmVnaW9uLmdldE9mZnNldCgpICsgY3VycmVudFJlZ2lvbi5nZXRMZW5ndGgoKSAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PSBjdXJyZW50UmVnaW9uLmdldE9mZnNldCgpICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IGN1cnJlbnRSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJyZW50UmVnaW9uLmdldExlbmd0aCgpKQotCQkJCW5ld1JlZ2lvbiA9IGdldE5ld1NlbGVjdGlvblJlZ2lvbihjdXJzb3JOb2RlLCBjdXJyZW50UmVnaW9uKTsKLQkJCWVsc2UKLQkJCQluZXdSZWdpb24gPSBjdXJzb3JOb2RlUmVnaW9uOwotCi0JCQlpZiAobmV3UmVnaW9uICE9IG51bGwpIHsKLQkJCQlmSGlzdG9yeS5yZW1lbWJlcihjdXJyZW50UmVnaW9uKTsKLQkJCQl0cnkgewotCQkJCQlmSGlzdG9yeS5pZ25vcmVTZWxlY3Rpb25DaGFuZ2VzKCk7Ci0JCQkJCWZFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKG5ld1JlZ2lvbi5nZXRPZmZzZXQoKSwgbmV3UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWZIaXN0b3J5Lmxpc3RlblRvU2VsZWN0aW9uQ2hhbmdlcygpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlU2VsZWN0SGlzdG9yeUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMzdjNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5QWN0aW9uIGV4dGVuZHMgU3RydWN0dXJlU2VsZWN0QWN0aW9uIGltcGxlbWVudHMgSVVwZGF0ZSB7Ci0JcHVibGljIFN0cnVjdHVyZVNlbGVjdEhpc3RvcnlBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvcik7Ci0JCXNldFRleHQoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUb29sVGlwVGV4dChTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2Rlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCXVwZGF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKE5vZGUgbm9kZSwgUmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUlSZWdpb24gb2xkID0gZkhpc3RvcnkuZ2V0TGFzdCgpOwotCQlpZiAob2xkICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZkhpc3RvcnkuaWdub3JlU2VsZWN0aW9uQ2hhbmdlcygpOwotCQkJCWZFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKG9sZC5nZXRPZmZzZXQoKSwgb2xkLmdldExlbmd0aCgpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZkhpc3RvcnkubGlzdGVuVG9TZWxlY3Rpb25DaGFuZ2VzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXNldEVuYWJsZWQoIWZIaXN0b3J5LmlzRW1wdHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZGY0YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElBY3Rpb25EZWxlZ2F0ZTIsIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSUVkaXRvclBhcnQgZkVkaXRvcjsKLQlwcml2YXRlIFNlbGVjdGlvbkhpc3RvcnkgZkhpc3Rvcnk7Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmRWRpdG9yID0gbnVsbDsKLQkJZkhpc3RvcnkgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsKLQkJcnVuKGFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGZFZGl0b3I7Ci0KLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCS8vIGRldGVybWluZSBjdXJyZW50IHRleHQgc2VsZWN0aW9uCi0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24gJiYgZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQotCQkJCWlmICh0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpIDwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCQkJLy8gZ2V0IGN1cnJlbnQgaW5kZXhlZCByZWdpb24KLQkJCQkJSW5kZXhlZFJlZ2lvbiBjdXJzb3JJbmRleGVkUmVnaW9uID0gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0KLQkJCQkJLy8gZGV0ZXJtaW5lIG5ldyBzZWxlY3Rpb24gYmFzZWQgb24gY3VycmVudCBpbmRleGVkIHJlZ2lvbgotCQkJCQlSZWdpb24gbmV3U2VsZWN0aW9uUmVnaW9uID0gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKGN1cnNvckluZGV4ZWRSZWdpb24sIHRleHRTZWxlY3Rpb24pOwotCi0JCQkJCS8vIHNlbGVjdCBuZXcgc2VsZWN0aW9uCi0JCQkJCWlmIChuZXdTZWxlY3Rpb25SZWdpb24gIT0gbnVsbCkgewotCQkJCQkJZkhpc3RvcnkucmVtZW1iZXIobmV3IFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKSk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWZIaXN0b3J5Lmlnbm9yZVNlbGVjdGlvbkNoYW5nZXMoKTsKLQkJCQkJCQl0ZXh0RWRpdG9yLnNlbGVjdEFuZFJldmVhbChuZXdTZWxlY3Rpb25SZWdpb24uZ2V0T2Zmc2V0KCksIG5ld1NlbGVjdGlvblJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQlmSGlzdG9yeS5saXN0ZW5Ub1NlbGVjdGlvbkNoYW5nZXMoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCQlpZiAoZkVkaXRvciAhPSBudWxsKQotCQkJZkhpc3RvcnkgPSAoU2VsZWN0aW9uSGlzdG9yeSkgZkVkaXRvci5nZXRBZGFwdGVyKFNlbGVjdGlvbkhpc3RvcnkuY2xhc3MpOwotCQllbHNlCi0JCQlmSGlzdG9yeSA9IG51bGw7Ci0JfQotCQotCWFic3RyYWN0IHByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKTsKLQkKLQlhYnN0cmFjdCBwcm90ZWN0ZWQgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbihJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24sIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pOwotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcHJvYmFibHkgYmUgcmVtb3ZlZCBhbmQgcmVwbGFjZWQgYnkgdXNpbmcgbmV3IHNlbGVjdGlvbiBwcm92aWRlcgotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0SW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbnQgbGFzdE9mZnNldCA9IG9mZnNldDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpbmRleGVkUmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihsYXN0T2Zmc2V0KTsKLQkJCQl3aGlsZSAoaW5kZXhlZFJlZ2lvbiA9PSBudWxsICYmIGxhc3RPZmZzZXQgPj0gMCkgewotCQkJCQlsYXN0T2Zmc2V0LS07Ci0JCQkJCWluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGxhc3RPZmZzZXQpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RIaXN0b3J5QWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2RjNWM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLQotLyoqCi0gKiBTZWxlY3Rpb24gaGlzdG9yeSBhY3Rpb24gZGVsZWdhdGUuIEtlZXBzIHRyYWNrIG9mIHNlbGVjdGlvbiB3aXRoaW4gZWRpdG9yLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSwgSUFjdGlvbkRlbGVnYXRlMiwgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCXByaXZhdGUgU2VsZWN0aW9uSGlzdG9yeSBmSGlzdG9yeTsKLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZFZGl0b3IgPSBudWxsOwotCQlmSGlzdG9yeSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJSVJlZ2lvbiBvbGQgPSBmSGlzdG9yeS5nZXRMYXN0KCk7Ci0JCWlmIChvbGQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmSGlzdG9yeS5pZ25vcmVTZWxlY3Rpb25DaGFuZ2VzKCk7Ci0JCQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCQkJKChJVGV4dEVkaXRvcikgZkVkaXRvcikuc2VsZWN0QW5kUmV2ZWFsKG9sZC5nZXRPZmZzZXQoKSwgb2xkLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWZIaXN0b3J5Lmxpc3RlblRvU2VsZWN0aW9uQ2hhbmdlcygpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJZkVkaXRvciA9IHRhcmdldEVkaXRvcjsKLQkJaWYgKGZFZGl0b3IgIT0gbnVsbCkKLQkJCWZIaXN0b3J5ID0gKFNlbGVjdGlvbkhpc3RvcnkpIGZFZGl0b3IuZ2V0QWRhcHRlcihTZWxlY3Rpb25IaXN0b3J5LmNsYXNzKTsKLQkJZWxzZQotCQkJZkhpc3RvcnkgPSBudWxsOwotCQlpZiAoZkhpc3RvcnkgIT0gbnVsbCkgewotCQkJZkhpc3Rvcnkuc2V0SGlzdG9yeUFjdGlvbihhY3Rpb24pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NwZWxsaW5nL0lTcGVsbGNoZWNrRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zcGVsbGluZy9JU3BlbGxjaGVja0RlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNTVjOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NwZWxsaW5nL0lTcGVsbGNoZWNrRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zcGVsbGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0vKioKLSAqIDxwPkRlZmluZXMgYW4gaW50ZXJmYWNlIGZvciBkZWNpZGluZyBpZiBhbiBvZmZzZXQgaW4gYW4gPGNvZGU+SVN0cnVjdHVyZWRNb2RlbDwvY29kZT4KLSAqIHNob3VsZCBiZSBzcGVsbCBjaGVja2VkLiBDcmVhdGVkIHNvIHRoYXQgY29udGVudCB0eXBlIHNwZWNpZmljIGRlY2lzaW9ucwotICogY291bGQgYmUgbWFkZSBhcyB0byB3aGV0aGVyIGEgcmVnaW9uIHNob3VsZCBiZSBzcGVsbC1jaGVja2VkIG9yIG5vdC4KLSAqIFRoaXMgaXMgZG9uZSB1c2luZyB0aGUgPGNvZGU+SUFkYXB0ZXJGYWN0b3J5PC9jb2RlPiBmcmFtZXdvcmsuPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTcGVsbGNoZWNrRGVsZWdhdGUgewotCi0JLyoqCi0JICogRGVjaWRlIGlmIHRoZSA8Y29kZT5vZmZzZXQ8L2NvZGU+IGluIDxjb2RlPm1vZGVsPC9jb2RlPiBzaG91bGQgYmUgc3BlbGwgY2hlY2tlZCBvciBub3QuCi0JICogCi0JICogQHBhcmFtIG9mZnNldCBkZWNpZGUgaWYgdGhpcyBvZmZzZXQgaW4gdGhlIGdpdmVuIDxjb2RlPm1vZGVsPC9jb2RlPiBzaG91bGQgYmUgc3BlbGwtY2hlY2tlZCAKLQkgKiBAcGFyYW0gbW9kZWwgdXNlZCB0byBkZWNpZGUgaWYgdGhlIGdpdmVuIDxjb2RlPm9mZnNldDwvY29kZT4gc2hvdWxkIGJlIHNwZWxsLWNoZWNrZWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiA8Y29kZT5vZmZzZXQ8L2NvZGU+IGluIHRoZSBnaXZlbiA8Y29kZT5tb2RlbDwvY29kZT4KLQkgKiBzaG91bGQgYmUgc3BlbGwgY2hlY2tlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRTcGVsbGNoZWNrKGludCBvZmZzZXQsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NwZWxsaW5nL1NwZWxsY2hlY2tTdHJhdGVneS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NwZWxsaW5nL1NwZWxsY2hlY2tTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTVjOWMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zcGVsbGluZy9TcGVsbGNoZWNrU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc3BlbGxpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWxFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRWRpdG9yc1VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3Iuc3BlbGxpbmcuSVNwZWxsaW5nUHJvYmxlbUNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnNwZWxsaW5nLlNwZWxsaW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnNwZWxsaW5nLlNwZWxsaW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnNwZWxsaW5nLlNwZWxsaW5nUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnNwZWxsaW5nLlNwZWxsaW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkZvcmVpZ25SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5FeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlJlY29uY2lsZUFubm90YXRpb25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuU3RydWN0dXJlZFJlY29uY2lsZVN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuU3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlRlbXBvcmFyeUFubm90YXRpb247Ci0KLS8qKgotICogQSByZWNvbmNpbGluZyBzdHJhdGVneSB0aGF0IHF1ZXJpZXMgdGhlIFNwZWxsaW5nU2VydmljZSB1c2luZyBpdHMgZGVmYXVsdAotICogZW5naW5lLiBSZXN1bHRzIGFyZSBzaG93IGFzIHRlbXBvcmFyeSBhbm5vdGF0aW9ucy4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgU3BlbGxjaGVja1N0cmF0ZWd5IGV4dGVuZHMgU3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5IHsKLQotCWNsYXNzIFNwZWxsQ2hlY2tQcmVmZXJlbmNlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBpc0ludGVyZXN0aW5nUHJvcGVydHkoT2JqZWN0IHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gU3BlbGxpbmdTZXJ2aWNlLlBSRUZFUkVOQ0VfU1BFTExJTkdfRU5BQkxFRC5lcXVhbHMocHJvcGVydHkpIHx8IFNwZWxsaW5nU2VydmljZS5QUkVGRVJFTkNFX1NQRUxMSU5HX0VOR0lORS5lcXVhbHMocHJvcGVydHkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJaWYgKGlzSW50ZXJlc3RpbmdQcm9wZXJ0eShldmVudC5nZXRQcm9wZXJ0eSgpKSkgewotCQkJCWlmIChldmVudC5nZXRPbGRWYWx1ZSgpID09IG51bGwgfHwgZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsIHx8ICFldmVudC5nZXROZXdWYWx1ZSgpLmVxdWFscyhldmVudC5nZXRPbGRWYWx1ZSgpKSkgewotCQkJCQlyZWNvbmNpbGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFNwZWxsaW5nUHJvYmxlbUNvbGxlY3RvciBpbXBsZW1lbnRzIElTcGVsbGluZ1Byb2JsZW1Db2xsZWN0b3IgewotCQlMaXN0IGFubm90YXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXB1YmxpYyB2b2lkIGFjY2VwdChTcGVsbGluZ1Byb2JsZW0gcHJvYmxlbSkgewotCQkJaWYgKGlzSW50ZXJlc3RpbmdQcm9ibGVtKHByb2JsZW0pKSB7Ci0JCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbmV3IFRlbXBvcmFyeUFubm90YXRpb24obmV3IFBvc2l0aW9uKHByb2JsZW0uZ2V0T2Zmc2V0KCksIHByb2JsZW0uZ2V0TGVuZ3RoKCkpLCBTcGVsbGluZ0Fubm90YXRpb24uVFlQRSwgcHJvYmxlbS5nZXRNZXNzYWdlKCksIGZSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KTsKLQotCQkJCVNwZWxsaW5nUXVpY2tBc3Npc3RQcm9jZXNzb3IgcXVpY2tBc3Npc3RQcm9jZXNzb3IgPSBuZXcgU3BlbGxpbmdRdWlja0Fzc2lzdFByb2Nlc3NvcigpOwotCQkJCXF1aWNrQXNzaXN0UHJvY2Vzc29yLnNldFNwZWxsaW5nUHJvYmxlbShwcm9ibGVtKTsKLQkJCQlhbm5vdGF0aW9uLnNldEFkZGl0aW9uYWxGaXhJbmZvKHF1aWNrQXNzaXN0UHJvY2Vzc29yKTsKLQkJCQlhbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbik7Ci0JCQkJaWYgKF9ERUJVR19TUEVMTElOR19QUk9CTEVNUykgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBwcm9ibGVtLmdldE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYmVnaW5Db2xsZWN0aW5nKCkgewotCQl9Ci0KLQkJdm9pZCBjbGVhcigpIHsKLQkJCWFubm90YXRpb25zLmNsZWFyKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlbmRDb2xsZWN0aW5nKCkgewotCQl9Ci0KLQkJQW5ub3RhdGlvbltdIGdldEFubm90YXRpb25zKCkgewotCQkJcmV0dXJuIChBbm5vdGF0aW9uW10pIGFubm90YXRpb25zLnRvQXJyYXkobmV3IEFubm90YXRpb25bYW5ub3RhdGlvbnMuc2l6ZSgpXSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9ERUJVR19TUEVMTElORyA9IEJvb2xlYW4udmFsdWVPZihQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyU3BlbGxpbmciKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9ERUJVR19TUEVMTElOR19QUk9CTEVNUyA9IEJvb2xlYW4udmFsdWVPZihQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyU3BlbGxpbmcvc2hvd1Byb2JsZW1zIikpLmJvb2xlYW5WYWx1ZSgpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5ERURfQlVJTERFUl9UWVBFX0NPTlRFWFRTID0gInNwZWxsaW5ncmVnaW9ucyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRFTlRfVFlQRSA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuc3BlbGxpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBmQ29udGVudFR5cGVJZCA9IG51bGw7Ci0KLQlwcml2YXRlIFNwZWxsaW5nUHJvYmxlbUNvbGxlY3RvciBmUHJvYmxlbUNvbGxlY3RvciA9IG5ldyBTcGVsbGluZ1Byb2JsZW1Db2xsZWN0b3IoKTsKLQkKLQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0KLQkvKgotCSAqIEtleWluZyBvdXIgVGVtcG9yYXJ5IEFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBwYXJ0aXRpb24gZG9lc24ndCBoZWxwCi0JICogdGhpcyBzdHJhdGVneSB0byBvbmx5IHJlbW92ZSBpdHMgb3duIFRlbXBvcmFyeUFubm90YXRpb25zIHNpbmNlIGl0J3MKLQkgKiBwb3NzaWJseSBydW4gb24gYWxsIHBhcnRpdGlvbnMuIEluc3RlYWQsIHNldCB0aGUga2V5IHRvIHVzZSBhbgotCSAqIGFyYml0cmFyeSBwYXJ0aXRpb24gdHlwZSB0aGF0IHdlIGNhbiBjaGVjayBmb3IgdXNpbmcgb3VyIG93bgotCSAqIGltcGxlbWVudGF0aW9uIG9mIGdldEFubm90YXRpb25zVG9SZW1vdmUoRGlydHlSZWdpb24pLgotCSAqLwotCVJlY29uY2lsZUFubm90YXRpb25LZXkgZlJlY29uY2lsZUFubm90YXRpb25LZXk7Ci0KLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZTcGVsbENoZWNrUHJlZmVyZW5jZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBTcGVsbGluZ0NvbnRleHQgZlNwZWxsaW5nQ29udGV4dDsKLQotCXByaXZhdGUgU3RyaW5nW10gZlN1cHBvcnRlZFRleHRSZWdpb25Db250ZXh0czsKLQlwcml2YXRlIElSZWNvbmNpbGVTdGVwIGZTcGVsbGluZ1N0ZXAgPSBuZXcgU3RydWN0dXJlZFJlY29uY2lsZVN0ZXAoKSB7Ci0JfTsKLQotCXB1YmxpYyBTcGVsbGNoZWNrU3RyYXRlZ3koSVNvdXJjZVZpZXdlciB2aWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCXN1cGVyKHZpZXdlcik7Ci0JCWZDb250ZW50VHlwZUlkID0gY29udGVudFR5cGVJZDsKLQotCQlmU3BlbGxpbmdDb250ZXh0ID0gbmV3IFNwZWxsaW5nQ29udGV4dCgpOwotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShmQ29udGVudFR5cGVJZCk7Ci0JCWZTcGVsbGluZ0NvbnRleHQuc2V0Q29udGVudFR5cGUoY29udGVudFR5cGUpOwotCQlmUmVjb25jaWxlQW5ub3RhdGlvbktleSA9IG5ldyBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KGZTcGVsbGluZ1N0ZXAsIEtFWV9DT05URU5UX1RZUEUsIFJlY29uY2lsZUFubm90YXRpb25LZXkuUEFSVElBTCk7Ci0KLQkJLyoqCi0JCSAqIEluaGVyaXQgc3BlbGxpbmcgcmVnaW9uIHJ1bGVzCi0JCSAqLwotCQlMaXN0IGNvbnRleHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJQ29udGVudFR5cGUgdGVzdFR5cGUgPSBjb250ZW50VHlwZTsKLQkJd2hpbGUgKHRlc3RUeXBlICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIHRleHRSZWdpb25Db250ZXh0cyA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5nZXREZWZpbml0aW9ucyhFWFRFTkRFRF9CVUlMREVSX1RZUEVfQ09OVEVYVFMsIHRlc3RUeXBlLmdldElkKCkpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0ZXh0UmVnaW9uQ29udGV4dHMubGVuZ3RoOyBqKyspIHsKLQkJCQljb250ZXh0cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChTdHJpbmdVdGlscy51bnBhY2sodGV4dFJlZ2lvbkNvbnRleHRzW2pdKSkpOwotCQkJfQotCQkJdGVzdFR5cGUgPSB0ZXN0VHlwZS5nZXRCYXNlVHlwZSgpOwotCQl9Ci0JCWZTdXBwb3J0ZWRUZXh0UmVnaW9uQ29udGV4dHMgPSAoU3RyaW5nW10pIGNvbnRleHRzLnRvQXJyYXkobmV3IFN0cmluZ1tjb250ZXh0cy5zaXplKCldKTsKLQotCQlmU3BlbGxDaGVja1ByZWZlcmVuY2VMaXN0ZW5lciA9IG5ldyBTcGVsbENoZWNrUHJlZmVyZW5jZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNTdGVwKElSZWNvbmNpbGVTdGVwIHN0ZXApIHsKLQkJcmV0dXJuIGZTcGVsbGluZ1N0ZXAuZXF1YWxzKHN0ZXApOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVJlY29uY2lsZVN0ZXBzKCkgewotCi0JfQotCi0JcHJpdmF0ZSBUZW1wb3JhcnlBbm5vdGF0aW9uW10gZ2V0U3BlbGxpbmdBbm5vdGF0aW9uc1RvUmVtb3ZlKElSZWdpb24gcmVnaW9uKSB7Ci0JCUxpc3QgdG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JCS8vIGNhbiBiZSBudWxsIHdoZW4gY2xvc2luZyB0aGUgZWRpdG9yCi0JCWlmIChhbm5vdGF0aW9uTW9kZWwgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaSA9IG51bGw7Ci0JCQlib29sZWFuIGFubm90YXRpb25PdmVybGFwcyA9IGZhbHNlOwotCQkJaWYgKGFubm90YXRpb25Nb2RlbCBpbnN0YW5jZW9mIElBbm5vdGF0aW9uTW9kZWxFeHRlbnNpb24yKSB7Ci0JCQkJaSA9ICgoSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbjIpIGFubm90YXRpb25Nb2RlbCkuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpLCB0cnVlLCB0cnVlKTsKLQkJCQlhbm5vdGF0aW9uT3ZlcmxhcHMgPSB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaSA9IGFubm90YXRpb25Nb2RlbC5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoKTsKLQkJCX0KLQotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pKQotCQkJCQljb250aW51ZTsKLQotCQkJCVRlbXBvcmFyeUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSBvYmo7Ci0JCQkJUmVjb25jaWxlQW5ub3RhdGlvbktleSBrZXkgPSAoUmVjb25jaWxlQW5ub3RhdGlvbktleSkgYW5ub3RhdGlvbi5nZXRLZXkoKTsKLQotCQkJCS8vIHRoZW4gaWYgdGhpcyBzdHJhdGVneSBrbm93cyBob3cgdG8gYWRkL3JlbW92ZSB0aGlzCi0JCQkJLy8gcGFydGl0aW9uIHR5cGUKLQkJCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVxdWFscyhmUmVjb25jaWxlQW5ub3RhdGlvbktleSkpIHsKLQkJCQkJaWYgKGtleS5nZXRTY29wZSgpID09IFJlY29uY2lsZUFubm90YXRpb25LZXkuUEFSVElBTCAmJiAoYW5ub3RhdGlvbk92ZXJsYXBzIHx8IGFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5vdmVybGFwc1dpdGgocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCkpKSkgewotCQkJCQkJdG9SZW1vdmUuYWRkKGFubm90YXRpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGtleS5nZXRTY29wZSgpID09IFJlY29uY2lsZUFubm90YXRpb25LZXkuVE9UQUwpIHsKLQkJCQkJCXRvUmVtb3ZlLmFkZChhbm5vdGF0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiAoVGVtcG9yYXJ5QW5ub3RhdGlvbltdKSB0b1JlbW92ZS50b0FycmF5KG5ldyBUZW1wb3JhcnlBbm5vdGF0aW9uW3RvUmVtb3ZlLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIEp1ZGdlIHdoZXRoZXIgYSBzcGVsbGluZyBwcm9ibGVtIGlzICJpbnRlcmVzdGluZyIuIEFjY2VwdCBhbnkgcmVnaW9ucwotCSAqIHRoYXQgYXJlIGV4cGxpY2l0bHkgYWxsb3dlZCwgYW5kIHNpbmNlIHZhbGlkIHByb3NlIGFyZWFzIGFyZSByYXJlbHkgaW4KLQkgKiBhIGNvbXBsaWNhdGVkIGRvY3VtZW50IHJlZ2lvbiwgYWNjZXB0IGFueSBkb2N1bWVudCByZWdpb24gd2l0aCBtb3JlCi0JICogdGhhbiBvbmUgdGV4dCByZWdpb24gYW5kIHJlamVjdCBhbnkgZG9jdW1lbnQgcmVnaW9ucyBjb250YWluaW5nIGZvcmVpZ24KLQkgKiB0ZXh0IHJlZ2lvbnMuCi0JICogCi0JICogQHBhcmFtIHByb2JsZW0KLQkgKiAgICAgICAgICAgIGEgU3BlbGxpbmdQcm9ibGVtCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0b3Igc2hvdWxkIGFjY2VwdCB0aGUgZ2l2ZW4gU3BlbGxpbmdQcm9ibGVtCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnRlcmVzdGluZ1Byb2JsZW0oU3BlbGxpbmdQcm9ibGVtIHByb2JsZW0pIHsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJLyoKLQkJCSAqIElmIHRoZSBlcnJvciBpcyBpbiBhIHJlYWQtb25seSBzZWN0aW9uLCBpZ25vcmUgaXQuIFRoZSB1c2VyCi0JCQkgKiB3b24ndCBiZSBhYmxlIHRvIGNvcnJlY3QgaXQuCi0JCQkgKi8KLQkJCWlmICgoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5jb250YWluc1JlYWRPbmx5KHByb2JsZW0uZ2V0T2Zmc2V0KCksIHByb2JsZW0uZ2V0TGVuZ3RoKCkpKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHByb2JsZW0uZ2V0T2Zmc2V0KCkpOwotCQkJaWYgKGRvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocHJvYmxlbS5nZXRPZmZzZXQoKSk7Ci0JCQkJLy9pZiB0aGUgcmVnaW9uIGlzIG5vdCBudWxsLCBhbmQgaXMgYSBzdXBwb3J0ZWQgY29udGV4dCBhbmQgaXMgbm90IGEgY29sbGVjdGlvbiBvZiByZWdpb25zLAotCQkJCS8vCWFuZCBpdCBzaG91bGQgYmUgc3BlbGwtY2hlY2tlZCwgdGhlbiBzcGVsbCBjaGVjayBpdC4KLQkJCQlpZiAodGV4dFJlZ2lvbiAhPSBudWxsICYmIGlzU3VwcG9ydGVkQ29udGV4dCh0ZXh0UmVnaW9uLmdldFR5cGUoKSkgJiYgISh0ZXh0UmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSAmJiBzaG91bGRTcGVsbGNoZWNrKHByb2JsZW0uZ2V0T2Zmc2V0KCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlpZiAoZG9jdW1lbnRSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKSBpbnN0YW5jZW9mIEZvcmVpZ25SZWdpb24pCi0JCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCVsxOTI1NzJdIFNpbXBsZSByZWdpb25zIHdlcmUgYmVpbmcgc3BlbGxjaGVja2VkIGp1c3QgZm9yIHRoZSBzYWtlIG9mIHRoZW0gYmVpbmcgc2ltcGxlCi0vLwkJCQlpZiAoZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA9PSAxKQotLy8JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1N1cHBvcnRlZENvbnRleHQoU3RyaW5nIHR5cGUpIHsKLQkJYm9vbGVhbiBpc1N1cHBvcnRlZCA9IGZhbHNlOwotCQlpZiAoZlN1cHBvcnRlZFRleHRSZWdpb25Db250ZXh0cy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZTdXBwb3J0ZWRUZXh0UmVnaW9uQ29udGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodHlwZS5lcXVhbHMoZlN1cHBvcnRlZFRleHRSZWdpb25Db250ZXh0c1tpXSkpIHsKLQkJCQkJaXNTdXBwb3J0ZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpc1N1cHBvcnRlZCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGlzU3VwcG9ydGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlY29uY2lsZSgpIHsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JCQlpZiAoYW5ub3RhdGlvbk1vZGVsICE9IG51bGwpIHsKLQkJCQlJUmVnaW9uIGRvY3VtZW50UmVnaW9uID0gbmV3IFJlZ2lvbigwLCBkb2N1bWVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJc3BlbGxDaGVjayhkb2N1bWVudFJlZ2lvbiwgZG9jdW1lbnRSZWdpb24sIGFubm90YXRpb25Nb2RlbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneSNyZWNvbmNpbGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkRpcnR5UmVnaW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlY29uY2lsZShEaXJ0eVJlZ2lvbiBkaXJ0eVJlZ2lvbiwgSVJlZ2lvbiBzdWJSZWdpb24pIHsKLQkJaWYgKGlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQotCQlJQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCA9IGdldEFubm90YXRpb25Nb2RlbCgpOwotCi0JCUlEb2N1bWVudCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlsb25nIHRpbWUwID0gMDsKLQkJCWlmIChfREVCVUdfU1BFTExJTkcpIHsKLQkJCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJLyoqCi0JCQkgKiBBcHBhcmVudGx5IHRoZSBkZWZhdWx0IHNwZWxsaW5nIGVuZ2luZSBoYXMgbm90aWNlYWJsZSBvdmVyaGVhZAotCQkJICogd2hlbiBjYWxsZWQgbXVsdGlwbGUgdGltZXMgaW4gcmFwaWQgc3VjY2Vzc2lvbi4gSXQncyBmYXN0ZXIgdG8KLQkJCSAqIGNoZWNrIHRoZSBlbnRpcmUgZGlydHkgcmVnaW9uIGF0IG9uY2Ugc2luY2Ugd2Uga25vdyB0aGF0IHdlJ3JlCi0JCQkgKiBub3QgZGlmZmVyZW50aWF0aW5nIGJ5IHBhcnRpdGlvbi4KLQkJCSAqIAotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MjUzMAotCQkJICovCi0JCQlpZiAoX0RFQlVHX1NQRUxMSU5HKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlNwZWxsIENoZWNraW5nIFsiICsgZGlydHlSZWdpb24uZ2V0T2Zmc2V0KCkgKyAiOiIgKyBkaXJ0eVJlZ2lvbi5nZXRMZW5ndGgoKSArICJdIDogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSk7Ci0JCQl9Ci0JCQlpZiAoYW5ub3RhdGlvbk1vZGVsICE9IG51bGwpIHsKLQkJCQlzcGVsbENoZWNrKGRpcnR5UmVnaW9uLCBkaXJ0eVJlZ2lvbiwgYW5ub3RhdGlvbk1vZGVsKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzcGVsbENoZWNrKElSZWdpb24gZGlydHlSZWdpb24sIElSZWdpb24gcmVnaW9uVG9CZUNoZWNrZWQsIElBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsKSB7Ci0JCWlmIChhbm5vdGF0aW9uTW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlUZW1wb3JhcnlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnNUb1JlbW92ZTsKLQkJQW5ub3RhdGlvbltdIGFubm90YXRpb25zVG9BZGQ7Ci0JCWFubm90YXRpb25zVG9SZW1vdmUgPSBnZXRTcGVsbGluZ0Fubm90YXRpb25zVG9SZW1vdmUocmVnaW9uVG9CZUNoZWNrZWQpOwotCi0JCWlmIChfREVCVUdfU1BFTExJTkdfUFJPQkxFTVMpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJTcGVsbCBjaGVja2luZyBbIiArIHJlZ2lvblRvQmVDaGVja2VkLmdldE9mZnNldCgpICsgIi0iICsgKHJlZ2lvblRvQmVDaGVja2VkLmdldE9mZnNldCgpICsgcmVnaW9uVG9CZUNoZWNrZWQuZ2V0TGVuZ3RoKCkpICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlpZiAoZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUVkaXRvcnNVSS5nZXRTcGVsbGluZ1NlcnZpY2UoKS5jaGVjayhnZXREb2N1bWVudCgpLCBuZXcgSVJlZ2lvbltde3JlZ2lvblRvQmVDaGVja2VkfSwgZlNwZWxsaW5nQ29udGV4dCwgZlByb2JsZW1Db2xsZWN0b3IsIG51bGwpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy8gY29ycmVzcG9uZGluZyAiZ2V0IiBpcyBpbiAjc2hvdWxkU3BlbGxDaGVjayhpbnQpIAotCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJCXN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFubm90YXRpb25zVG9BZGQgPSBmUHJvYmxlbUNvbGxlY3Rvci5nZXRBbm5vdGF0aW9ucygpOwotCQlmUHJvYmxlbUNvbGxlY3Rvci5jbGVhcigpOwotCi0KLQkJaWYgKGFubm90YXRpb25Nb2RlbCBpbnN0YW5jZW9mIElBbm5vdGF0aW9uTW9kZWxFeHRlbnNpb24pIHsKLQkJCUlBbm5vdGF0aW9uTW9kZWxFeHRlbnNpb24gbW9kZWxFeHRlbnNpb24gPSAoSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbikgYW5ub3RhdGlvbk1vZGVsOwotCQkJTWFwIGFubm90YXRpb25zVG9BZGRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9uc1RvQWRkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYW5ub3RhdGlvbnNUb0FkZE1hcC5wdXQoYW5ub3RhdGlvbnNUb0FkZFtpXSwgKChUZW1wb3JhcnlBbm5vdGF0aW9uKSBhbm5vdGF0aW9uc1RvQWRkW2ldKS5nZXRQb3NpdGlvbigpKTsKLQkJCX0KLQkJCW1vZGVsRXh0ZW5zaW9uLnJlcGxhY2VBbm5vdGF0aW9ucyhhbm5vdGF0aW9uc1RvUmVtb3ZlLCBhbm5vdGF0aW9uc1RvQWRkTWFwKTsKLQkJfQotCi0JCWVsc2UgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhbm5vdGF0aW9uc1RvQWRkLmxlbmd0aDsgaisrKSB7Ci0JCQkJYW5ub3RhdGlvbk1vZGVsLmFkZEFubm90YXRpb24oYW5ub3RhdGlvbnNUb0FkZFtqXSwgKChUZW1wb3JhcnlBbm5vdGF0aW9uKSBhbm5vdGF0aW9uc1RvQWRkW2pdKS5nZXRQb3NpdGlvbigpKTsKLQkJCX0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgYW5ub3RhdGlvbnNUb1JlbW92ZS5sZW5ndGg7IGorKykgewotCQkJCWFubm90YXRpb25Nb2RlbC5yZW1vdmVBbm5vdGF0aW9uKGFubm90YXRpb25zVG9SZW1vdmVbal0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcnRpdGlvbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5I3JlY29uY2lsZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGUoSVJlZ2lvbiBwYXJ0aXRpb24pIHsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JCQlpZiAoYW5ub3RhdGlvbk1vZGVsICE9IG51bGwpIHsKLQkJCQlzcGVsbENoZWNrKHBhcnRpdGlvbiwgcGFydGl0aW9uLCBhbm5vdGF0aW9uTW9kZWwpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCUVkaXRvcnNVSS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZTcGVsbENoZWNrUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJfQotCi0JCXN1cGVyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQotCQlpZiAoZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlFZGl0b3JzVUkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmU3BlbGxDaGVja1ByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRGVjaWRlcyBpZiB0aGUgZ2l2ZW4gb2Zmc2V0IHNob3VsZCBiZSBzcGVsbC1jaGVja2VkIHVzaW5nIGFuIDxjb2RlPklBZGFwdGVyRmFjdG9yeTwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0IERlY2lkZSBpZiB0aGlzIG9mZnNldCBzaG91bGQgYmUgc3BlbGwtY2hlY2tlZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIDxjb2RlPm9mZnNldDwvY29kZT4gc2hvdWxkIGJlIHNwZWxsLWNoZWNrZWQsCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkU3BlbGxjaGVjayhpbnQgb2Zmc2V0KSB7Ci0JCWJvb2xlYW4gZGVjaXNpb24gPSB0cnVlOwotCQkKLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCA9PSBudWxsKQotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCS8qCi0JCQkgKiB1c2UgYW4gYW4gYWRhcHRlciBmYWN0b3J5IHRvIGdldCBhIHNwZWxsLWNoZWNrIGRlY2lzaW9uIG1ha2VyLAotCQkJICogYW5kIGFzayBpdCBpZiB0aGUgb2Zmc2V0IHNob3VsZCBiZSBzcGVsbC1jaGVja2VkLiBJdCBpcyBkb25lCi0JCQkgKiB0aGlzIHdheSBzbyBjb250ZW50IHR5cGUgc3BlY2lmaWMgZGVjaXNpb25zIGNhbiBiZSBtYWRlIHdpdGhvdXQKLQkJCSAqIHRoaXMgcGx1Z2luIGJlaW5nIGF3YXJlIG9mIGFueSBjb250ZW50IHR5cGUgc3BlY2lmaWNzLgotCQkJICovCi0JCQlJU3BlbGxjaGVja0RlbGVnYXRlIGRlbGVnYXRlID0gKElTcGVsbGNoZWNrRGVsZWdhdGUpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcihzdHJ1Y3R1cmVkTW9kZWwsIElTcGVsbGNoZWNrRGVsZWdhdGUuY2xhc3MpOwotCQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCQlkZWNpc2lvbiA9IGRlbGVnYXRlLnNob3VsZFNwZWxsY2hlY2sob2Zmc2V0LCBzdHJ1Y3R1cmVkTW9kZWwpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZGVjaXNpb247Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zcGVsbGluZy9TcGVsbGluZ1F1aWNrQXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc3BlbGxpbmcvU3BlbGxpbmdRdWlja0Fzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGU0ZGRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zcGVsbGluZy9TcGVsbGluZ1F1aWNrQXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc3BlbGxpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucXVpY2thc3Npc3QuSVF1aWNrQXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5zcGVsbGluZy5TcGVsbGluZ1Byb2JsZW07Ci0KLS8qKgotICogU3BlbGxpbmcgY29ycmVjdGlvbiBwcm9jZXNzb3IgdXNlZCB0byBzaG93IHF1aWNrIGZpeGVzIGZvciBzcGVsbGluZwotICogcHJvYmxlbXMuCi0gKiAKLSAqIEBzaW5jZSAyLjAKLSAqLwotY2xhc3MgU3BlbGxpbmdRdWlja0Fzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElRdWlja0Fzc2lzdFByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBTcGVsbGluZ1Byb2JsZW0gZlNwZWxsaW5nUHJvYmxlbSA9IG51bGw7Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5Bc3Npc3QoSVF1aWNrQXNzaXN0SW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpeChBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJcmV0dXJuICFhbm5vdGF0aW9uLmlzTWFya2VkRGVsZXRlZCgpOwotCX0KLQotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZVF1aWNrQXNzaXN0UHJvcG9zYWxzKElRdWlja0Fzc2lzdEludm9jYXRpb25Db250ZXh0IHF1aWNrQXNzaXN0Q29udGV4dCkgewotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gbnVsbDsKLQotCQlpZiAoZlNwZWxsaW5nUHJvYmxlbSAhPSBudWxsKSB7Ci0JCQlwcm9wb3NhbHMgPSBmU3BlbGxpbmdQcm9ibGVtLmdldFByb3Bvc2FscyhxdWlja0Fzc2lzdENvbnRleHQpOwotCQl9Ci0JCXJldHVybiBwcm9wb3NhbHM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXZvaWQgc2V0U3BlbGxpbmdQcm9ibGVtKFNwZWxsaW5nUHJvYmxlbSBzcGVsbGluZ1Byb2JsZW0pIHsKLQkJZlNwZWxsaW5nUHJvYmxlbSA9IHNwZWxsaW5nUHJvYmxlbTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc3R5bGUvU2VtYW50aWNIaWdobGlnaHRpbmdNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc3R5bGUvU2VtYW50aWNIaWdobGlnaHRpbmdNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MTQwZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3N0eWxlL1NlbWFudGljSGlnaGxpZ2h0aW5nTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zdHlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLklTZW1hbnRpY0hpZ2hsaWdodGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5TdHJ1Y3R1cmVkUHJlc2VudGF0aW9uUmVjb25jaWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5Eb2N1bWVudFJlZ2lvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuRWRpdG9yVXRpbGl0eTsKLQotLyoqCi0gKiBTZW1hbnRpYyBoaWdobGlnaHRpbmcgbWFuYWdlci4gUmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nIHRoZSBzZW1hbnRpYyBoaWdobGlnaHRpbmdzCi0gKiBhbmQgdGhlIGFzc29jaWF0ZWQgc3R5bGVzLiBTZW1hbnRpYyBoaWdobGlnaHRpbmcgcHJlZmVyZW5jZSBjaGFuZ2VzIGFyZSBoYW5kbGVkCi0gKiB0aHJvdWdoIGxpc3RlbmVycyBpbiB0aGlzIGNsYXNzLiBCYXNlZCBvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuamF2YWVkaXRvci5TZW1hbnRpY0hpZ2hsaWdodGluZ01hbmFnZXIKLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgU2VtYW50aWNIaWdobGlnaHRpbmdNYW5hZ2VyIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCQotCS8qKgotCSAqIEhpZ2hsaWdodGluZ1N0eWxlLgotCSAqLwotCXN0YXRpYyBjbGFzcyBIaWdobGlnaHRpbmdTdHlsZSB7Ci0KLQkJLyoqIFRleHQgYXR0cmlidXRlICovCi0JCXByaXZhdGUgVGV4dEF0dHJpYnV0ZSBmVGV4dEF0dHJpYnV0ZTsKLQkJLyoqIEVuYWJsZWQgc3RhdGUgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGZJc0VuYWJsZWQ7Ci0KLQkJLyoqCi0JCSAqIEluaXRpYWxpemUgd2l0aCB0aGUgZ2l2ZW4gdGV4dCBhdHRyaWJ1dGUuCi0JCSAqIEBwYXJhbSB0ZXh0QXR0cmlidXRlIFRoZSB0ZXh0IGF0dHJpYnV0ZQotCQkgKiBAcGFyYW0gaXNFbmFibGVkIHRoZSBlbmFibGVkIHN0YXRlCi0JCSAqLwotCQlwdWJsaWMgSGlnaGxpZ2h0aW5nU3R5bGUoVGV4dEF0dHJpYnV0ZSB0ZXh0QXR0cmlidXRlLCBib29sZWFuIGlzRW5hYmxlZCkgewotCQkJc2V0VGV4dEF0dHJpYnV0ZSh0ZXh0QXR0cmlidXRlKTsKLQkJCXNldEVuYWJsZWQoaXNFbmFibGVkKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRleHQgYXR0cmlidXRlLgotCQkgKi8KLQkJcHVibGljIFRleHRBdHRyaWJ1dGUgZ2V0VGV4dEF0dHJpYnV0ZSgpIHsKLQkJCXJldHVybiBmVGV4dEF0dHJpYnV0ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gdGV4dEF0dHJpYnV0ZSBUaGUgYmFja2dyb3VuZCB0byBzZXQuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRUZXh0QXR0cmlidXRlKFRleHRBdHRyaWJ1dGUgdGV4dEF0dHJpYnV0ZSkgewotCQkJZlRleHRBdHRyaWJ1dGUgPSB0ZXh0QXR0cmlidXRlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdGhlIGVuYWJsZWQgc3RhdGUKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCXJldHVybiBmSXNFbmFibGVkOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBpc0VuYWJsZWQgdGhlIG5ldyBlbmFibGVkIHN0YXRlCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gaXNFbmFibGVkKSB7Ci0JCQlmSXNFbmFibGVkID0gaXNFbmFibGVkOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEhpZ2hsaWdodGVkIFBvc2l0aW9ucy4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgSGlnaGxpZ2h0ZWRQb3NpdGlvbiBleHRlbmRzIFBvc2l0aW9uIHsKLQotCQkvKiogSGlnaGxpZ2h0aW5nIG9mIHRoZSBwb3NpdGlvbiAqLwotCQlwcml2YXRlIEhpZ2hsaWdodGluZ1N0eWxlIGZTdHlsZTsKLQotCQlwcml2YXRlIGJvb2xlYW4gZlJlYWRPbmx5OwotCi0JCS8qKiBMb2NrIG9iamVjdCAqLwotCQlwcml2YXRlIE9iamVjdCBmTG9jazsKLQotCQkvKioKLQkJICogSW5pdGlhbGl6ZSB0aGUgc3R5bGVkIHBvc2l0aW9ucyB3aXRoIHRoZSBnaXZlbiBvZmZzZXQsIGxlbmd0aCBhbmQgZm9yZWdyb3VuZCBjb2xvci4KLQkJICoKLQkJICogQHBhcmFtIG9mZnNldCBUaGUgcG9zaXRpb24gb2Zmc2V0Ci0JCSAqIEBwYXJhbSBsZW5ndGggVGhlIHBvc2l0aW9uIGxlbmd0aAotCQkgKiBAcGFyYW0gaGlnaGxpZ2h0aW5nIFRoZSBwb3NpdGlvbidzIGhpZ2hsaWdodGluZwotCQkgKiBAcGFyYW0gbG9jayBUaGUgbG9jayBvYmplY3QKLQkJICovCi0JCXB1YmxpYyBIaWdobGlnaHRlZFBvc2l0aW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgsIEhpZ2hsaWdodGluZ1N0eWxlIGhpZ2hsaWdodGluZywgT2JqZWN0IGxvY2ssIGJvb2xlYW4gaXNSZWFkT25seSkgewotCQkJc3VwZXIob2Zmc2V0LCBsZW5ndGgpOwotCQkJZlN0eWxlID0gaGlnaGxpZ2h0aW5nOwotCQkJZkxvY2sgPSBsb2NrOwotCQkJZlJlYWRPbmx5ID0gaXNSZWFkT25seTsKLQkJfQotCi0JCXB1YmxpYyBIaWdobGlnaHRlZFBvc2l0aW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgsIEhpZ2hsaWdodGluZ1N0eWxlIGhpZ2hsaWdodGluZywgT2JqZWN0IGxvY2spIHsKLQkJCXRoaXMob2Zmc2V0LCBsZW5ndGgsIGhpZ2hsaWdodGluZywgbG9jaywgZmFsc2UpOwotCQl9Ci0KLQkJcHVibGljIEhpZ2hsaWdodGVkUG9zaXRpb24oUG9zaXRpb24gcG9zaXRpb24sIEhpZ2hsaWdodGluZ1N0eWxlIGhpZ2hsaWdodGluZywgT2JqZWN0IGxvY2spIHsKLQkJCXRoaXMocG9zaXRpb24ub2Zmc2V0LCBwb3NpdGlvbi5sZW5ndGgsIGhpZ2hsaWdodGluZywgbG9jaywgZmFsc2UpOwotCQl9Ci0KLQkJcHVibGljIEhpZ2hsaWdodGVkUG9zaXRpb24oUG9zaXRpb24gcG9zaXRpb24sIEhpZ2hsaWdodGluZ1N0eWxlIGhpZ2hsaWdodGluZywgT2JqZWN0IGxvY2ssIGJvb2xlYW4gaXNSZWFkT25seSkgewotCQkJdGhpcyhwb3NpdGlvbi5vZmZzZXQsIHBvc2l0aW9uLmxlbmd0aCwgaGlnaGxpZ2h0aW5nLCBsb2NrLCBpc1JlYWRPbmx5KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgYSBjb3JyZXNwb25kaW5nIHN0eWxlIHJhbmdlLgotCQkgKi8KLQkJcHVibGljIFN0eWxlUmFuZ2UgY3JlYXRlU3R5bGVSYW5nZSgpIHsKLQkJCWludCBsZW49IDA7Ci0JCQlpZiAoZlN0eWxlLmlzRW5hYmxlZCgpKQotCQkJCWxlbj0gZ2V0TGVuZ3RoKCk7Ci0KLQkJCVRleHRBdHRyaWJ1dGUgdGV4dEF0dHJpYnV0ZSA9IGZTdHlsZS5nZXRUZXh0QXR0cmlidXRlKCk7Ci0JCQlpbnQgc3R5bGUgPSB0ZXh0QXR0cmlidXRlLmdldFN0eWxlKCk7Ci0JCQlpbnQgZm9udFN0eWxlID0gc3R5bGUgJiAoU1dULklUQUxJQyB8IFNXVC5CT0xEIHwgU1dULk5PUk1BTCk7Ci0JCQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSBuZXcgU3R5bGVSYW5nZShnZXRPZmZzZXQoKSwgbGVuLCB0ZXh0QXR0cmlidXRlLmdldEZvcmVncm91bmQoKSwgdGV4dEF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCksIGZvbnRTdHlsZSk7Ci0JCQlzdHlsZVJhbmdlLnN0cmlrZW91dCA9IChzdHlsZSAmIFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSCkgIT0gMDsKLQkJCXN0eWxlUmFuZ2UudW5kZXJsaW5lID0gKHN0eWxlICYgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkUpICE9IDA7Ci0KLQkJCXJldHVybiBzdHlsZVJhbmdlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFVzZXMgcmVmZXJlbmNlIGVxdWFsaXR5IGZvciB0aGUgaGlnaGxpZ2h0aW5nLgotCQkgKgotCQkgKiBAcGFyYW0gb2ZmIFRoZSBvZmZzZXQKLQkJICogQHBhcmFtIGxlbiBUaGUgbGVuZ3RoCi0JCSAqIEBwYXJhbSBoaWdobGlnaHRpbmcgVGhlIGhpZ2hsaWdodGluZwotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUgZ2l2ZW4gb2Zmc2V0LCBsZW5ndGggYW5kIGhpZ2hsaWdodGluZyBhcmUgZXF1YWwgdG8gdGhlIGludGVybmFsIG9uZXMuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0VxdWFsKGludCBvZmYsIGludCBsZW4sIEhpZ2hsaWdodGluZ1N0eWxlIGhpZ2hsaWdodGluZykgewotCQkJc3luY2hyb25pemVkIChmTG9jaykgewotCQkJCXJldHVybiAhaXNEZWxldGVkKCkgJiYgZ2V0T2Zmc2V0KCkgPT0gb2ZmICYmIGdldExlbmd0aCgpID09IGxlbiAmJiBmU3R5bGUgPT0gaGlnaGxpZ2h0aW5nOwotCQkJfQotCQl9Ci0JCQotCQkvKioKLQkJICogVXNlcyByZWZlcmVuY2UgZXF1YWxpdHkgZm9yIHRoZSBoaWdobGlnaHRpbmcuCi0JCSAqCi0JCSAqIEBwYXJhbSBwb3MgVGhlIHBvc2l0aW9uCi0JCSAqIEBwYXJhbSBoaWdobGlnaHRpbmcgVGhlIGhpZ2hsaWdodGluZwotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUgZ2l2ZW4gb2Zmc2V0LCBsZW5ndGggYW5kIGhpZ2hsaWdodGluZyBhcmUgZXF1YWwgdG8gdGhlIGludGVybmFsIG9uZXMuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0VxdWFsKFBvc2l0aW9uIHBvcywgSGlnaGxpZ2h0aW5nU3R5bGUgaGlnaGxpZ2h0aW5nKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGZMb2NrKSB7Ci0JCQkJcmV0dXJuICFpc0RlbGV0ZWQoKSAmJiBnZXRPZmZzZXQoKSA9PSBwb3MuZ2V0T2Zmc2V0KCkgJiYgZ2V0TGVuZ3RoKCkgPT0gcG9zLmdldExlbmd0aCgpICYmIGZTdHlsZSA9PSBoaWdobGlnaHRpbmc7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogSXMgdGhpcyBwb3NpdGlvbiBjb250YWluZWQgaW4gdGhlIGdpdmVuIHJhbmdlIChpbmNsdXNpdmUpPyBTeW5jaHJvbml6ZXMgb24gcG9zaXRpb24gdXBkYXRlci4KLQkJICoKLQkJICogQHBhcmFtIG9mZiBUaGUgcmFuZ2Ugb2Zmc2V0Ci0JCSAqIEBwYXJhbSBsZW4gVGhlIHJhbmdlIGxlbmd0aAotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGlzIHBvc2l0aW9uIGlzIG5vdCBkZWxldGUgYW5kIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gcmFuZ2UuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lZChpbnQgb2ZmLCBpbnQgbGVuKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGZMb2NrKSB7Ci0JCQkJcmV0dXJuICFpc0RlbGV0ZWQoKSAmJiBvZmYgPD0gZ2V0T2Zmc2V0KCkgJiYgb2ZmICsgbGVuID49IGdldE9mZnNldCgpICsgZ2V0TGVuZ3RoKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1cGRhdGUoaW50IG9mZiwgaW50IGxlbikgewotCQkJc3luY2hyb25pemVkIChmTG9jaykgewotCQkJCXN1cGVyLnNldE9mZnNldChvZmYpOwotCQkJCXN1cGVyLnNldExlbmd0aChsZW4pOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uI3NldExlbmd0aChpbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGxlbmd0aCkgewotCQkJc3luY2hyb25pemVkIChmTG9jaykgewotCQkJCXN1cGVyLnNldExlbmd0aChsZW5ndGgpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uI3NldE9mZnNldChpbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRPZmZzZXQoaW50IG9mZnNldCkgewotCQkJc3luY2hyb25pemVkIChmTG9jaykgewotCQkJCXN1cGVyLnNldE9mZnNldChvZmZzZXQpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uI2RlbGV0ZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkZWxldGUoKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGZMb2NrKSB7Ci0JCQkJc3VwZXIuZGVsZXRlKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb24jdW5kZWxldGUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgdW5kZWxldGUoKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGZMb2NrKSB7Ci0JCQkJc3VwZXIudW5kZWxldGUoKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGhpZ2hsaWdodGluZy4KLQkJICovCi0JCXB1YmxpYyBIaWdobGlnaHRpbmdTdHlsZSBnZXRIaWdobGlnaHRpbmcoKSB7Ci0JCQlyZXR1cm4gZlN0eWxlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJCXJldHVybiBmUmVhZE9ubHk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBIaWdobGlnaHRlZCByYW5nZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBIaWdobGlnaHRlZFJhbmdlIGV4dGVuZHMgUmVnaW9uIHsKLQkJLyoqIFRoZSBoaWdobGlnaHRpbmcga2V5IGFzIHJldHVybmVkIGJ5IHtAbGluayBJU2VtYW50aWNIaWdobGlnaHRpbmcjZ2V0UHJlZmVyZW5jZUtleSgpfS4gKi8KLQkJcHJpdmF0ZSBTdHJpbmcgZktleTsKLQotCQkvKioKLQkJICogSW5pdGlhbGl6ZSB3aXRoIHRoZSBnaXZlbiBvZmZzZXQsIGxlbmd0aCBhbmQgaGlnaGxpZ2h0aW5nIGtleS4KLQkJICoKLQkJICogQHBhcmFtIG9mZnNldAotCQkgKiBAcGFyYW0gbGVuZ3RoCi0JCSAqIEBwYXJhbSBrZXkgdGhlIGhpZ2hsaWdodGluZyBrZXkgYXMgcmV0dXJuZWQgYnkge0BsaW5rIElTZW1hbnRpY0hpZ2hsaWdodGluZyNnZXRQcmVmZXJlbmNlS2V5KCl9Ci0JCSAqLwotCQlwdWJsaWMgSGlnaGxpZ2h0ZWRSYW5nZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcga2V5KSB7Ci0JCQlzdXBlcihvZmZzZXQsIGxlbmd0aCk7Ci0JCQlmS2V5ID0ga2V5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdGhlIGhpZ2hsaWdodGluZyBrZXkgYXMgcmV0dXJuZWQgYnkge0BsaW5rIElTZW1hbnRpY0hpZ2hsaWdodGluZyNnZXRQcmVmZXJlbmNlS2V5KCl9Ci0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJCXJldHVybiBmS2V5OwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbiNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvKSAmJiBvIGluc3RhbmNlb2YgSGlnaGxpZ2h0ZWRSYW5nZSAmJiBmS2V5LmVxdWFscygoKEhpZ2hsaWdodGVkUmFuZ2UpbykuZ2V0S2V5KCkpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbiNoYXNoQ29kZSgpCi0JCSAqLwotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCkgfCBmS2V5Lmhhc2hDb2RlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTUFOVElDX0hJR0hMSUdIVElOR19FWFRFTlNJT05fUE9JTlQgPSAic2VtYW50aWNIaWdobGlnaHRpbmciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9BVFRSID0gInRhcmdldCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQVRUUiA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfS0VZX0FUVFIgPSAic3R5bGVTdHJpbmdLZXkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElTb3VyY2VWaWV3ZXIgZlNvdXJjZVZpZXdlcjsKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZlByZWZlcmVuY2VTdG9yZTsKLQlwcml2YXRlIFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gZkNvbmZpZ3VyYXRpb247Ci0JcHJpdmF0ZSBTdHJ1Y3R1cmVkUHJlc2VudGF0aW9uUmVjb25jaWxlciBmUHJlc2VudGF0aW9uUmVjb25jaWxlcjsKLQlwcml2YXRlIFN0cmluZyBmQ29udGVudFR5cGVJZDsKLQkKLQlwcml2YXRlIFNlbWFudGljSGlnaGxpZ2h0aW5nUHJlc2VudGVyIGZQcmVzZW50ZXI7Ci0JcHJpdmF0ZSBTZW1hbnRpY0hpZ2hsaWdodGluZ1JlY29uY2lsZXIgZlJlY29uY2lsZXI7Ci0JCi0JLyoqIFRoZSBzZW1hbnRpYyBoaWdobGlnaHRpbmdzIGZvciB0aGUgY29udGVudCB0eXBlICovCi0JcHJpdmF0ZSBJU2VtYW50aWNIaWdobGlnaHRpbmdbXSBmSGlnaGxpZ2h0aW5nczsKLQkvKiogVGhlIHNlbWFudGljIGhpZ2hsaWdodGluZyBzdHlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZW1hbnRpYyBoaWdobGlnaHRpbmdzICovCi0JcHJpdmF0ZSBIaWdobGlnaHRpbmdTdHlsZVtdIGZIaWdobGlnaHRpbmdTdHlsZXM7Ci0JLyoqIFRoZSBzZW1hbnRpYyBoaWdobGlnaHRpbmcgc3R5bGUgc3RyaW5nIHByZWZlcmVuY2Uga2V5cy4gbnVsbCBvZiB0aGUgaGlnaGxpZ2h0aW5nIGRvZXNuJ3Qgc3VwcG9ydCBpdCAqLwotCXByaXZhdGUgU3RyaW5nW10gZkhpZ2hsaWdodGluZ1N0eWxlU3RyaW5nS2V5czsKLQkKLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZIaWdobGlnaHRpbmdDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlSGlnaGxpZ2h0aW5nUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQl9Ci0JfTsKLQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWhhbmRsZVByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5zdGFsbChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlU3RvcmUsIFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJZlNvdXJjZVZpZXdlciA9IHNvdXJjZVZpZXdlcjsKLQkJZlByZWZlcmVuY2VTdG9yZSA9IHByZWZlcmVuY2VTdG9yZTsKLQkJZkNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotCQlmQ29udGVudFR5cGVJZCA9IGNvbnRlbnRUeXBlSWQ7Ci0JCQotCQlmUHJlZmVyZW5jZVN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWZQcmVzZW50YXRpb25SZWNvbmNpbGVyID0gKFN0cnVjdHVyZWRQcmVzZW50YXRpb25SZWNvbmNpbGVyKSBmQ29uZmlndXJhdGlvbi5nZXRQcmVzZW50YXRpb25SZWNvbmNpbGVyKGZTb3VyY2VWaWV3ZXIpOwotCQkKLQkJaWYgKGlzRW5hYmxlZCgpKSB7Ci0JCQllbmFibGUoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBMb2FkIHRoZSBzZW1hbnRpYyBoaWdobGlnaHRpbmdzIGRlZmluZWQgZm9yIHRoaXMgY29udGVudCB0eXBlLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkU2VtYW50aWNIaWdobGlnaHRpbmdzKCkgewotCQlMaXN0IHNlbWFudGljcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCQotCQlJU2VtYW50aWNIaWdobGlnaHRpbmcgaGlnaGxpZ2h0aW5nID0gbnVsbDsKLQkJU3RyaW5nIHN0eWxlS2V5ID0gbnVsbDsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTU0VVSVBsdWdpbi5JRCwgU0VNQU5USUNfSElHSExJR0hUSU5HX0VYVEVOU0lPTl9QT0lOVCk7Ci0JCQotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShmQ29udGVudFR5cGVJZCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmdbXSB0YXJnZXRzID0gU3RyaW5nVXRpbHMudW5wYWNrKGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShUQVJHRVRfQVRUUikpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0YXJnZXRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUNvbnRlbnRUeXBlIHRhcmdldENvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUodGFyZ2V0c1tqXSk7Ci0JCQkJLyogQXBwbHkgc2VtYW50aWMgaGlnaGxpZ2h0aW5nIHRvIGtpbmRzIG9mIHRhcmdldENvbnRlbnRUeXBlICovCi0JCQkJaWYgKGNvbnRlbnRUeXBlLmlzS2luZE9mKHRhcmdldENvbnRlbnRUeXBlKSkgewotCQkJCQl0cnkgewotCQkJCQkJaGlnaGxpZ2h0aW5nID0gKElTZW1hbnRpY0hpZ2hsaWdodGluZykgZWxlbWVudHNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihDTEFTU19BVFRSKTsKLQkJCQkJCXN0eWxlS2V5ID0gZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFNUWUxFX0tFWV9BVFRSKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJCWlmIChoaWdobGlnaHRpbmcgIT0gbnVsbCkKLQkJCQkJCXNlbWFudGljcy5hZGQobmV3IFNlbWFudGljQ29udGVudCh0YXJnZXRDb250ZW50VHlwZSwgaGlnaGxpZ2h0aW5nLCBzdHlsZUtleSkpOwotCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvKiBTb3J0IHRoZSBzZW1hbnRpY3MsIHNvIHRoYXQgc3R5bGVzIHdpbGwgYmUgYXBwbGllZCBmcm9tIGdlbmVyYWwgdG8gc3BlY2lmaWMgKi8KLQkJQ29sbGVjdGlvbnMuc29ydChzZW1hbnRpY3MpOwotCQlmSGlnaGxpZ2h0aW5ncyA9IG5ldyBJU2VtYW50aWNIaWdobGlnaHRpbmdbc2VtYW50aWNzLnNpemUoKV07Ci0JCWZIaWdobGlnaHRpbmdTdHlsZXMgPSBuZXcgSGlnaGxpZ2h0aW5nU3R5bGVbc2VtYW50aWNzLnNpemUoKV07Ci0JCWZIaWdobGlnaHRpbmdTdHlsZVN0cmluZ0tleXMgPSBuZXcgU3RyaW5nW3NlbWFudGljcy5zaXplKCldOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VtYW50aWNzLnNpemUoKTsgaSsrKSB7Ci0JCQlmSGlnaGxpZ2h0aW5nc1tpXSA9ICgoU2VtYW50aWNDb250ZW50KSBzZW1hbnRpY3MuZ2V0KGkpKS5nZXRIaWdobGlnaHRpbmcoKTsKLQkJCXN0eWxlS2V5ID0gKChTZW1hbnRpY0NvbnRlbnQpIHNlbWFudGljcy5nZXQoaSkpLmdldFN0eWxlS2V5KCk7Ci0JCQlmSGlnaGxpZ2h0aW5nU3R5bGVzW2ldID0gY3JlYXRlSGlnaGxpZ2h0aW5nU3R5bGUoKChTZW1hbnRpY0NvbnRlbnQpIHNlbWFudGljcy5nZXQoaSkpLmdldEhpZ2hsaWdodGluZygpLCBzdHlsZUtleSk7Ci0JCQlmSGlnaGxpZ2h0aW5nU3R5bGVTdHJpbmdLZXlzW2ldID0gc3R5bGVLZXk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBjbGFzcyBpcyB1c2VkIGZvciByZWxhdGluZyBhIHNlbWFudGljIGhpZ2hsaWdodGluZyB0byBhIGNvbnRlbnQgdHlwZS4KLQkgKiBUaGUgY29udGVudCB0eXBlIGlzIHVzZWQgaW4gdGhlIHNvcnRpbmcgYWxnb3JpdGhtLiBDb250ZW50IHR5cGVzIHRoYXQgYXJlIG1vcmUgc3BlY2lmaWMKLQkgKiB0byB0aGUgZmlsZSdzIGNvbnRlbnQgdHlwZSB3aWxsIGNhdXNlIHN0eWxlcyB0byBiZSBhcHBsaWVkIGZyb20gZ2VuZXJhbCB0byBzcGVjaWZpYwotCSAqLwotCXByaXZhdGUgY2xhc3MgU2VtYW50aWNDb250ZW50IGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0JCXB1YmxpYyBJQ29udGVudFR5cGUgdHlwZTsKLQkJcHVibGljIElTZW1hbnRpY0hpZ2hsaWdodGluZyBoaWdobGlnaHRpbmc7Ci0JCXB1YmxpYyBTdHJpbmcgc3R5bGVLZXk7Ci0KLQkJcHVibGljIFNlbWFudGljQ29udGVudChJQ29udGVudFR5cGUgdHlwZSwgSVNlbWFudGljSGlnaGxpZ2h0aW5nIGhpZ2hsaWdodGluZywgU3RyaW5nIHN0eWxlS2V5KSB7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJdGhpcy5oaWdobGlnaHRpbmcgPSBoaWdobGlnaHRpbmc7Ci0JCQl0aGlzLnN0eWxlS2V5ID0gc3R5bGVLZXk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgYXJnMCkgewotCQkJU2VtYW50aWNDb250ZW50IG90aGVyID0gKFNlbWFudGljQ29udGVudCkgYXJnMDsKLQkJCS8qIEVxdWFsIHdlaWdodGluZyBmb3IgdGhlIHNhbWUgdHlwZXMgKi8KLQkJCWlmICh0aGlzLnR5cGUuZXF1YWxzKG90aGVyLnR5cGUpKQotCQkJCXJldHVybiAwOwotCQkJLyogU3VidHlwZXMgaGF2ZSBtb3JlIHdlaWdodCB0aGFuIGJhc2UgdHlwZXMgKi8KLQkJCWlmICh0aGlzLnR5cGUuaXNLaW5kT2Yob3RoZXIudHlwZSkpCi0JCQkJcmV0dXJuIDE7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJU2VtYW50aWNIaWdobGlnaHRpbmcgZ2V0SGlnaGxpZ2h0aW5nKCkgewotCQkJcmV0dXJuIGhpZ2hsaWdodGluZzsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3R5bGVLZXkoKSB7Ci0JCQlyZXR1cm4gc3R5bGVLZXk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIGhpZ2hsaWdodGluZyBzdHlsZSBiYXNlZCBvbiB0aGUgcHJlZmVyZW5jZXMgZGVmaW5lZCBpbiB0aGUgc2VtYW50aWMgaGlnaGxpZ2h0aW5nCi0JICogQHBhcmFtIGhpZ2hsaWdodGluZyB0aGUgc2VtYW50aWMgaGlnaGxpZ2h0aW5nCi0JICogQHJldHVybiBhIGhpZ2hsaWdodGluZyBzdHlsZSBiYXNlZCBvbiB0aGUgcHJlZmVyZW5jZXMgb2YgdGhlIHNlbWFudGljIGhpZ2hsaWdodGluZwotCSAqLwotCXByaXZhdGUgSGlnaGxpZ2h0aW5nU3R5bGUgY3JlYXRlSGlnaGxpZ2h0aW5nU3R5bGUoSVNlbWFudGljSGlnaGxpZ2h0aW5nIGhpZ2hsaWdodGluZywgU3RyaW5nIHN0eWxlS2V5KSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBoaWdobGlnaHRpbmcuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCUhpZ2hsaWdodGluZ1N0eWxlIGhpZ2hsaWdodGluZ1N0eWxlID0gbnVsbDsKLQkJaWYgKHN0b3JlICE9IG51bGwpIHsKLQkJCVRleHRBdHRyaWJ1dGUgYXR0cmlidXRlID0gbnVsbDsKLQkJCS8vIEEgc3R5bGUgc3RyaW5nIGlzIHVzZWQgaW5zdGVhZCBvZiBzZXBhcmF0ZSBhdHRyaWJ1dGUga2V5cwotCQkJaWYgKHN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCQlhdHRyaWJ1dGUgPSBjcmVhdGVUZXh0QXR0cmlidXRlKHN0b3JlLmdldFN0cmluZyhzdHlsZUtleSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IHN0eWxlID0gZ2V0Qm9vbGVhbihzdG9yZSwgaGlnaGxpZ2h0aW5nLmdldEJvbGRQcmVmZXJlbmNlS2V5KCkpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQkJCQotCQkJCWlmIChnZXRCb29sZWFuKHN0b3JlLCBoaWdobGlnaHRpbmcuZ2V0SXRhbGljUHJlZmVyZW5jZUtleSgpKSkKLQkJCQkJc3R5bGUgfD0gU1dULklUQUxJQzsKLQkJCQlpZiAoZ2V0Qm9vbGVhbihzdG9yZSwgaGlnaGxpZ2h0aW5nLmdldFN0cmlrZXRocm91Z2hQcmVmZXJlbmNlS2V5KCkpKQotCQkJCQlzdHlsZSB8PSBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJaWYgKGdldEJvb2xlYW4oc3RvcmUsIGhpZ2hsaWdodGluZy5nZXRVbmRlcmxpbmVQcmVmZXJlbmNlS2V5KCkpKQotCQkJCQlzdHlsZSB8PSBUZXh0QXR0cmlidXRlLlVOREVSTElORTsKLQotCQkJCVN0cmluZyByZ2JTdHJpbmcgPSBnZXRTdHJpbmcoc3RvcmUsIGhpZ2hsaWdodGluZy5nZXRDb2xvclByZWZlcmVuY2VLZXkoKSk7Ci0JCQkJQ29sb3IgY29sb3IgPSBudWxsOwotCQkJCQotCQkJCWlmIChyZ2JTdHJpbmcgIT0gbnVsbCkKLQkJCQkJY29sb3IgPSBFZGl0b3JVdGlsaXR5LmdldENvbG9yKENvbG9ySGVscGVyLnRvUkdCKHJnYlN0cmluZykpOwotCQkJCWF0dHJpYnV0ZSA9IG5ldyBUZXh0QXR0cmlidXRlKGNvbG9yLCBudWxsLCBzdHlsZSk7Ci0JCQl9Ci0KLQkJCXN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZkhpZ2hsaWdodGluZ0NoYW5nZUxpc3RlbmVyKTsKLQkJCWJvb2xlYW4gaXNFbmFibGVkID0gZ2V0Qm9vbGVhbihzdG9yZSwgaGlnaGxpZ2h0aW5nLmdldEVuYWJsZWRQcmVmZXJlbmNlS2V5KCkpOwotCQkJaGlnaGxpZ2h0aW5nU3R5bGUgPSBuZXcgSGlnaGxpZ2h0aW5nU3R5bGUoYXR0cmlidXRlLCBpc0VuYWJsZWQpOwotCQl9Ci0JCXJldHVybiBoaWdobGlnaHRpbmdTdHlsZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGV4dCBhdHRyaWJ1dGUgZnJvbSB0aGUgc3R5bGUgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIHN0eWxlVmFsdWUgc3R5bGUgc3RyaW5nIGluIHRoZSBmb3JtOiA8Y29kZT5SR0IgZm9yZWdyb3VuZCAoI3JyZ2diYikgfCBSR0IgYmFja2dyb3VuZCAoI3JyZ2diYikgfCBib2xkICh0cnVlL2ZhbHNlKSB8IGl0YWxpYyAodHJ1ZS9mYWxzZSkgfCBzdHJpa2V0aHJvdWdoICh0cnVlL2ZhbHNlKSB8IHVuZGVybGluZSAodHJ1ZS9mYWxzZSk8L2NvZGU+Ci0JICogQHJldHVybiB0ZXh0IGF0dHJpYnV0ZSBjcmVhdGVkIGZyb20gdGhlIDxjb2RlPnN0eWxlVmFsdWU8L2NvZGU+IG9yIG51bGwgaWYgdGhlIDxjb2RlPnN0eWxlVmFsdWU8L2NvZGU+IGlzIGludmFsaWQKLQkgKi8KLQlwcml2YXRlIFRleHRBdHRyaWJ1dGUgY3JlYXRlVGV4dEF0dHJpYnV0ZShTdHJpbmcgc3R5bGVWYWx1ZSkgewotCQlTdHJpbmdbXSB2YWx1ZXMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlVmFsdWUpOwotCQlpZiAodmFsdWVzLmxlbmd0aCA8IDYpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlSR0IgZm9yZWdyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHZhbHVlc1swXSk7Ci0JCVJHQiBiYWNrZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0IodmFsdWVzWzFdKTsKLQkJYm9vbGVhbiBib2xkID0gQm9vbGVhbi52YWx1ZU9mKHZhbHVlc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCWJvb2xlYW4gaXRhbGljID0gQm9vbGVhbi52YWx1ZU9mKHZhbHVlc1szXSkuYm9vbGVhblZhbHVlKCk7Ci0JCWJvb2xlYW4gc3RyaWtldGhyb3VnaCA9IEJvb2xlYW4udmFsdWVPZih2YWx1ZXNbNF0pLmJvb2xlYW5WYWx1ZSgpOwotCQlib29sZWFuIHVuZGVybGluZSA9IEJvb2xlYW4udmFsdWVPZih2YWx1ZXNbNV0pLmJvb2xlYW5WYWx1ZSgpOwotCi0JCWludCBzdHlsZSA9IFNXVC5OT1JNQUw7Ci0JCWlmIChib2xkKQotCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5CT0xEOwotCQlpZiAoaXRhbGljKQotCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCWlmIChzdHJpa2V0aHJvdWdoKQotCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSDsKLQkJaWYgKHVuZGVybGluZSkKLQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlVOREVSTElORTsKLQotCQlyZXR1cm4gY3JlYXRlVGV4dEF0dHJpYnV0ZShmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kLCBzdHlsZSk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGNyZWF0ZVRleHRBdHRyaWJ1dGUoUkdCIGZvcmVncm91bmQsIFJHQiBiYWNrZ3JvdW5kLCBpbnQgc3R5bGUpIHsKLQkJcmV0dXJuIG5ldyBUZXh0QXR0cmlidXRlKChmb3JlZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihmb3JlZ3JvdW5kKSA6IG51bGwsIChiYWNrZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihiYWNrZ3JvdW5kKSA6IG51bGwsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBMb29rcyB1cCBhIGJvb2xlYW4gcHJlZmVyZW5jZSBieSA8Y29kZT5rZXk8L2NvZGU+IGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiBAcGFyYW0gc3RvcmUgdGhlIHByZWZlcmVuY2Ugc3RvcmUgdG8gbG9va3VwIHRoZSBwcmVmZXJlbmNlIGZyb20KLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdGhlIHByZWZlcmVuY2UgaXMgc3RvcmVkIHVuZGVyCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZSBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGlmZiBrZXkgaXMgbm90IG51bGwKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZ2V0Qm9vbGVhbihJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoa2V5ID09IG51bGwpID8gZmFsc2UgOiBzdG9yZS5nZXRCb29sZWFuKGtleSk7Ci0JfQotCQotCS8qKgotCSAqIExvb2tzIHVwIGEgU3RyaW5nIHByZWZlcmVuY2UgYnkgPGNvZGU+a2V5PC9jb2RlPiBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0JICogQHBhcmFtIHN0b3JlIHRoZSBwcmVmZXJlbmNlIHN0b3JlIHRvIGxvb2t1cCB0aGUgcHJlZmVyZW5jZSBmcm9tCi0JICogQHBhcmFtIGtleSB0aGUga2V5IHRoZSBwcmVmZXJlbmNlIGlzIHN0b3JlZCB1bmRlcgotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZSBpZmYga2V5IGlzIG5vdCBudWxsCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIChrZXkgPT0gbnVsbCkgPyBudWxsIDogc3RvcmUuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlIHNlbWFudGljIGhpZ2hsaWdodGluZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5hYmxlKCkgewotCQkKLQkJbG9hZFNlbWFudGljSGlnaGxpZ2h0aW5ncygpOwotCQkKLQkJZlByZXNlbnRlciA9IG5ldyBTZW1hbnRpY0hpZ2hsaWdodGluZ1ByZXNlbnRlcigpOwotCQlmUHJlc2VudGVyLmluc3RhbGwoZlNvdXJjZVZpZXdlciwgZlByZXNlbnRhdGlvblJlY29uY2lsZXIpOwotLy8JCWlmIChmRWRpdG9yICE9IG51bGwpIHsKLQkJCWZSZWNvbmNpbGVyID0gbmV3IFNlbWFudGljSGlnaGxpZ2h0aW5nUmVjb25jaWxlcigpOwotCQkJZlJlY29uY2lsZXIuaW5zdGFsbChmU291cmNlVmlld2VyLCBmUHJlc2VudGVyLCBmSGlnaGxpZ2h0aW5ncywgZkhpZ2hsaWdodGluZ1N0eWxlcyk7Ci0JCQlJUmVjb25jaWxlciByZWNvbmNpbGVyID0gZkNvbmZpZ3VyYXRpb24uZ2V0UmVjb25jaWxlcihmU291cmNlVmlld2VyKTsKLQkJCWlmIChyZWNvbmNpbGVyIGluc3RhbmNlb2YgRG9jdW1lbnRSZWdpb25Qcm9jZXNzb3IpCi0JCQkJKChEb2N1bWVudFJlZ2lvblByb2Nlc3NvcikgcmVjb25jaWxlcikuc2V0U2VtYW50aWNIaWdobGlnaHRpbmdTdHJhdGVneShmUmVjb25jaWxlcik7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJZlByZXNlbnRlci51cGRhdGVQcmVzZW50YXRpb24obnVsbCwgY3JlYXRlSGFyZGNvZGVkUG9zaXRpb25zKCksIG5ldyBIaWdobGlnaHRlZFBvc2l0aW9uWzBdKTsKLS8vCQl9Ci0JfQotCQotCS8qKgotCSAqIERpc2FibGUgc2VtYW50aWMgaGlnaGxpZ2h0aW5nCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpc2FibGUoKSB7Ci0JCWlmIChmUmVjb25jaWxlciAhPSBudWxsKSB7Ci0JCQlmUmVjb25jaWxlci51bmluc3RhbGwoKTsKLQkJCWZSZWNvbmNpbGVyID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKGZQcmVzZW50ZXIgIT0gbnVsbCkgewotCQkJZlByZXNlbnRlci51bmluc3RhbGwoKTsKLQkJCWZQcmVzZW50ZXIgPSBudWxsOwotCQl9Ci0JCQotCQlpZiAoZkhpZ2hsaWdodGluZ3MgIT0gbnVsbCkKLQkJCWRpc3Bvc2VIaWdobGlnaHRpbmdzKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkaXNwb3NlSGlnaGxpZ2h0aW5ncygpIHsKLQkJLyogUmVtb3ZlIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgYmVmb3JlIGNsZWFyaW5nIHRoZSBsaXN0cyAqLwotCQlpZiAoZkhpZ2hsaWdodGluZ3MgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmSGlnaGxpZ2h0aW5ncy5sZW5ndGg7IGkrKykgewotCQkJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBmSGlnaGxpZ2h0aW5nc1tpXS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQlpZiAoc3RvcmUgIT0gbnVsbCkKLQkJCQkJc3RvcmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmSGlnaGxpZ2h0aW5nQ2hhbmdlTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCQotCQlmSGlnaGxpZ2h0aW5ncyA9IG51bGw7Ci0JCWZIaWdobGlnaHRpbmdTdHlsZXMgPSBudWxsOwotCQlmSGlnaGxpZ2h0aW5nU3R5bGVTdHJpbmdLZXlzID0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlcyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGZvciBpbmRpdmlkdWFsIHNlbWFudGljIGhpZ2hsaWdodGluZ3MuCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUhpZ2hsaWdodGluZ1Byb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHByb3BlcnR5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJaWYgKHByb3BlcnR5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlib29sZWFuIHJlZnJlc2hSZXF1aXJlZCA9IGZhbHNlOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmSGlnaGxpZ2h0aW5ncy5sZW5ndGg7IGkrKykgewotCQkJSVNlbWFudGljSGlnaGxpZ2h0aW5nIGhpZ2hsaWdodGluZyA9IGZIaWdobGlnaHRpbmdzW2ldOwotCi0JCQlpZiAoZkhpZ2hsaWdodGluZ1N0eWxlU3RyaW5nS2V5c1tpXSAhPSBudWxsKSB7Ci0JCQkJaWYgKHByb3BlcnR5LmVxdWFscyhmSGlnaGxpZ2h0aW5nU3R5bGVTdHJpbmdLZXlzW2ldKSkgewotCQkJCQlhZGFwdFRvU3R5bGVDaGFuZ2UoZkhpZ2hsaWdodGluZ1N0eWxlc1tpXSwgZXZlbnQpOwotCQkJCQlmUHJlc2VudGVyLmhpZ2hsaWdodGluZ1N0eWxlQ2hhbmdlZChmSGlnaGxpZ2h0aW5nU3R5bGVzW2ldKTsKLQkJCQkJcmVmcmVzaFJlcXVpcmVkID0gdHJ1ZTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocHJvcGVydHkuZXF1YWxzKGhpZ2hsaWdodGluZy5nZXRCb2xkUHJlZmVyZW5jZUtleSgpKSkgewotCQkJCWFkYXB0VG9UZXh0U3R5bGVDaGFuZ2UoZkhpZ2hsaWdodGluZ1N0eWxlc1tpXSwgZXZlbnQsIFNXVC5CT0xEKTsKLQkJCQlmUHJlc2VudGVyLmhpZ2hsaWdodGluZ1N0eWxlQ2hhbmdlZChmSGlnaGxpZ2h0aW5nU3R5bGVzW2ldKTsKLQkJCQlyZWZyZXNoUmVxdWlyZWQgPSB0cnVlOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZiAocHJvcGVydHkuZXF1YWxzKGhpZ2hsaWdodGluZy5nZXRDb2xvclByZWZlcmVuY2VLZXkoKSkpIHsKLQkJCQlhZGFwdFRvVGV4dEZvcmVncm91bmRDaGFuZ2UoZkhpZ2hsaWdodGluZ1N0eWxlc1tpXSwgZXZlbnQpOwotCQkJCWZQcmVzZW50ZXIuaGlnaGxpZ2h0aW5nU3R5bGVDaGFuZ2VkKGZIaWdobGlnaHRpbmdTdHlsZXNbaV0pOwotCQkJCXJlZnJlc2hSZXF1aXJlZCA9IHRydWU7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCWlmIChwcm9wZXJ0eS5lcXVhbHMoaGlnaGxpZ2h0aW5nLmdldEVuYWJsZWRQcmVmZXJlbmNlS2V5KCkpKSB7Ci0JCQkJYWRhcHRUb0VuYWJsZW1lbnRDaGFuZ2UoZkhpZ2hsaWdodGluZ1N0eWxlc1tpXSwgZXZlbnQpOwotCQkJCWZQcmVzZW50ZXIuaGlnaGxpZ2h0aW5nU3R5bGVDaGFuZ2VkKGZIaWdobGlnaHRpbmdTdHlsZXNbaV0pOwotCQkJCXJlZnJlc2hSZXF1aXJlZCA9IHRydWU7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCWlmIChwcm9wZXJ0eS5lcXVhbHMoaGlnaGxpZ2h0aW5nLmdldEl0YWxpY1ByZWZlcmVuY2VLZXkoKSkpIHsKLQkJCQlhZGFwdFRvVGV4dFN0eWxlQ2hhbmdlKGZIaWdobGlnaHRpbmdTdHlsZXNbaV0sIGV2ZW50LCBTV1QuSVRBTElDKTsKLQkJCQlmUHJlc2VudGVyLmhpZ2hsaWdodGluZ1N0eWxlQ2hhbmdlZChmSGlnaGxpZ2h0aW5nU3R5bGVzW2ldKTsKLQkJCQlyZWZyZXNoUmVxdWlyZWQgPSB0cnVlOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZiAocHJvcGVydHkuZXF1YWxzKGhpZ2hsaWdodGluZy5nZXRTdHJpa2V0aHJvdWdoUHJlZmVyZW5jZUtleSgpKSkgewotCQkJCWFkYXB0VG9UZXh0U3R5bGVDaGFuZ2UoZkhpZ2hsaWdodGluZ1N0eWxlc1tpXSwgZXZlbnQsIFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSCk7Ci0JCQkJZlByZXNlbnRlci5oaWdobGlnaHRpbmdTdHlsZUNoYW5nZWQoZkhpZ2hsaWdodGluZ1N0eWxlc1tpXSk7Ci0JCQkJcmVmcmVzaFJlcXVpcmVkID0gdHJ1ZTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJaWYgKHByb3BlcnR5LmVxdWFscyhoaWdobGlnaHRpbmcuZ2V0VW5kZXJsaW5lUHJlZmVyZW5jZUtleSgpKSkgewotCQkJCWFkYXB0VG9UZXh0U3R5bGVDaGFuZ2UoZkhpZ2hsaWdodGluZ1N0eWxlc1tpXSwgZXZlbnQsIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKTsKLQkJCQlmUHJlc2VudGVyLmhpZ2hsaWdodGluZ1N0eWxlQ2hhbmdlZChmSGlnaGxpZ2h0aW5nU3R5bGVzW2ldKTsKLQkJCQlyZWZyZXNoUmVxdWlyZWQgPSB0cnVlOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCQotCQlpZiAocmVmcmVzaFJlcXVpcmVkICYmIGZSZWNvbmNpbGVyICE9IG51bGwpCi0JCQlmUmVjb25jaWxlci5yZWZyZXNoKCk7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZXMgcHJvcGVydHkgY2hhbmdlcyBmb3IgZW5hYmxpbmcgYW5kIGRpc2FibGluZyBzZW1hbnRpYyBoaWdobGlnaHRpbmcgZm9yCi0JICogU3RydWN0dXJlZCBTb3VyY2UgRWRpdG9ycwotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCWlmIChwcm9wZXJ0eSA9PSBudWxsIHx8ICFwcm9wZXJ0eS5lcXVhbHMoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLlNFTUFOVElDX0hJR0hMSUdIVElORykpCi0JCQlyZXR1cm47Ci0JCQotCQlPYmplY3QgbmV3VmFsdWUgPSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQlpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0JCQlpZiAoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpCi0JCQkJZW5hYmxlKCk7Ci0JCQllbHNlCi0JCQkJZGlzYWJsZSgpOwotCQl9Ci0JCQotCQlpZiAoZlJlY29uY2lsZXIgIT0gbnVsbCkKLQkJCWZSZWNvbmNpbGVyLnJlZnJlc2goKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkYXB0VG9FbmFibGVtZW50Q2hhbmdlKEhpZ2hsaWdodGluZ1N0eWxlIGhpZ2hsaWdodGluZywgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlPYmplY3QgdmFsdWUgPSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQlib29sZWFuIGV2ZW50VmFsdWU7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pCi0JCQlldmVudFZhbHVlID0gKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0JCWVsc2UgaWYgKElQcmVmZXJlbmNlU3RvcmUuVFJVRS5lcXVhbHModmFsdWUpKQotCQkJZXZlbnRWYWx1ZSA9IHRydWU7Ci0JCWVsc2UKLQkJCWV2ZW50VmFsdWUgPSBmYWxzZTsKLQkJaGlnaGxpZ2h0aW5nLnNldEVuYWJsZWQoZXZlbnRWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkYXB0VG9UZXh0Rm9yZWdyb3VuZENoYW5nZShIaWdobGlnaHRpbmdTdHlsZSBoaWdobGlnaHRpbmcsIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJUkdCIHJnYiA9IG51bGw7Ci0KLQkJT2JqZWN0IHZhbHVlID0gZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgUkdCKQotCQkJcmdiPSAoUkdCKSB2YWx1ZTsKLQkJZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQlyZ2I9IENvbG9ySGVscGVyLnRvUkdCKCAoU3RyaW5nKSB2YWx1ZSk7Ci0KLQkJaWYgKHJnYiAhPSBudWxsKSB7Ci0JCQlDb2xvciBjb2xvcj0gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihyZ2IpOwotCQkJVGV4dEF0dHJpYnV0ZSBvbGRBdHRyPSBoaWdobGlnaHRpbmcuZ2V0VGV4dEF0dHJpYnV0ZSgpOwotCQkJaGlnaGxpZ2h0aW5nLnNldFRleHRBdHRyaWJ1dGUobmV3IFRleHRBdHRyaWJ1dGUoY29sb3IsIG9sZEF0dHIuZ2V0QmFja2dyb3VuZCgpLCBvbGRBdHRyLmdldFN0eWxlKCkpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRhcHRUb1RleHRTdHlsZUNoYW5nZShIaWdobGlnaHRpbmdTdHlsZSBoaWdobGlnaHRpbmcsIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQsIGludCBzdHlsZUF0dHJpYnV0ZSkgewotCQlib29sZWFuIGV2ZW50VmFsdWUgPSBmYWxzZTsKLQkJT2JqZWN0IHZhbHVlID0gZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikKLQkJCWV2ZW50VmFsdWUgPSAoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQkJZWxzZSBpZiAoSVByZWZlcmVuY2VTdG9yZS5UUlVFLmVxdWFscyh2YWx1ZSkpCi0JCQlldmVudFZhbHVlID0gdHJ1ZTsKLQotCQlUZXh0QXR0cmlidXRlIG9sZEF0dHIgPSBoaWdobGlnaHRpbmcuZ2V0VGV4dEF0dHJpYnV0ZSgpOwotCQlib29sZWFuIGFjdGl2ZVZhbHVlID0gKG9sZEF0dHIuZ2V0U3R5bGUoKSAmIHN0eWxlQXR0cmlidXRlKSA9PSBzdHlsZUF0dHJpYnV0ZTsKLQotCQlpZiAoYWN0aXZlVmFsdWUgIT0gZXZlbnRWYWx1ZSkKLQkJCWhpZ2hsaWdodGluZy5zZXRUZXh0QXR0cmlidXRlKG5ldyBUZXh0QXR0cmlidXRlKG9sZEF0dHIuZ2V0Rm9yZWdyb3VuZCgpLCBvbGRBdHRyLmdldEJhY2tncm91bmQoKSwgZXZlbnRWYWx1ZSA/IG9sZEF0dHIuZ2V0U3R5bGUoKSB8IHN0eWxlQXR0cmlidXRlIDogb2xkQXR0ci5nZXRTdHlsZSgpICYgfnN0eWxlQXR0cmlidXRlKSk7Ci0JfQotCi0JLyoqCi0JICogQWRhcHRzIHRvIGEgc3R5bGUgc3RyaW5nIGNoYW5nZQotCSAqIAotCSAqIEBwYXJhbSBoaWdobGlnaHRpbmcgdGhlIGhpZ2hsaWdodGluZyBzdHlsZSB0byB1cGRhdGUKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBjaGFuZ2UKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRhcHRUb1N0eWxlQ2hhbmdlKEhpZ2hsaWdodGluZ1N0eWxlIGhpZ2hsaWdodGluZywgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlPYmplY3QgdmFsdWUgPSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCVRleHRBdHRyaWJ1dGUgYXR0ciA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoKFN0cmluZykgdmFsdWUpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCQloaWdobGlnaHRpbmcuc2V0VGV4dEF0dHJpYnV0ZShhdHRyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHNlbWFudGljIGhpZ2hsaWdodGluZyBpcyBlbmFibGVkIGluIHRoZSBwcmVmZXJlbmNlcwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiAoZlByZWZlcmVuY2VTdG9yZSAhPSBudWxsKSA/IGZQcmVmZXJlbmNlU3RvcmUuZ2V0Qm9vbGVhbihFZGl0b3JQcmVmZXJlbmNlTmFtZXMuU0VNQU5USUNfSElHSExJR0hUSU5HKSA6IGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCWRpc2FibGUoKTsKLQkJCi0JCWlmIChmUHJlZmVyZW5jZVN0b3JlICE9IG51bGwpIHsKLQkJCWZQcmVmZXJlbmNlU3RvcmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCWZQcmVmZXJlbmNlU3RvcmUgPSBudWxsOwotCQl9Ci0JCQotCQlmU291cmNlVmlld2VyID0gbnVsbDsKLQkJZkNvbmZpZ3VyYXRpb24gPSBudWxsOwotCQlmUHJlc2VudGF0aW9uUmVjb25jaWxlciA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc3R5bGUvU2VtYW50aWNIaWdobGlnaHRpbmdQcmVzZW50ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zdHlsZS9TZW1hbnRpY0hpZ2hsaWdodGluZ1ByZXNlbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDk3M2QzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zdHlsZS9TZW1hbnRpY0hpZ2hsaWdodGluZ1ByZXNlbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JU3luY2hyb25pemFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFByZXNlbnRhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXJFeHRlbnNpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXJFeHRlbnNpb240OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuU3RydWN0dXJlZFByZXNlbnRhdGlvblJlY29uY2lsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zdHlsZS5TZW1hbnRpY0hpZ2hsaWdodGluZ01hbmFnZXIuSGlnaGxpZ2h0ZWRQb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnN0eWxlLlNlbWFudGljSGlnaGxpZ2h0aW5nTWFuYWdlci5IaWdobGlnaHRpbmdTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuRWRpdG9yVXRpbGl0eTsKLQotLyoqCi0gKiBTZW1hbnRpYyBoaWdobGlnaHRpbmcgcHJlc2VudGVyIC0gVUkgdGhyZWFkIGltcGxlbWVudGF0aW9uLiAgQmFzZWQgb24gCi0gKiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuamF2YWVkaXRvci5TZW1hbnRpY0hpZ2hsaWdodGluZ1ByZXNlbnRlcgotICoKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFNlbWFudGljSGlnaGxpZ2h0aW5nUHJlc2VudGVyIGltcGxlbWVudHMgSVRleHRQcmVzZW50YXRpb25MaXN0ZW5lciwgSVRleHRJbnB1dExpc3RlbmVyLCBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBTZW1hbnRpYyBoaWdobGlnaHRpbmcgcG9zaXRpb24gdXBkYXRlci4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIEhpZ2hsaWdodGluZ1Bvc2l0aW9uVXBkYXRlciBpbXBsZW1lbnRzIElQb3NpdGlvblVwZGF0ZXIgewotCi0JCS8qKiBUaGUgcG9zaXRpb24gY2F0ZWdvcnkuICovCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nIGZDYXRlZ29yeTsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyB1cGRhdGVyIGZvciB0aGUgZ2l2ZW4gPGNvZGU+Y2F0ZWdvcnk8L2NvZGU+LgotCQkgKgotCQkgKiBAcGFyYW0gY2F0ZWdvcnkgdGhlIG5ldyBjYXRlZ29yeS4KLQkJICovCi0JCXB1YmxpYyBIaWdobGlnaHRpbmdQb3NpdGlvblVwZGF0ZXIoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCQlmQ2F0ZWdvcnk9IGNhdGVnb3J5OwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklQb3NpdGlvblVwZGF0ZXIjdXBkYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZShEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0KLQkJCWludCBldmVudE9mZnNldD0gZXZlbnQuZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgZXZlbnRPbGRMZW5ndGg9IGV2ZW50LmdldExlbmd0aCgpOwotCQkJaW50IGV2ZW50RW5kPSBldmVudE9mZnNldCArIGV2ZW50T2xkTGVuZ3RoOwotCi0JCQl0cnkgewotCQkJCVBvc2l0aW9uW10gcG9zaXRpb25zPSBldmVudC5nZXREb2N1bWVudCgpLmdldFBvc2l0aW9ucyhmQ2F0ZWdvcnkpOwotCi0JCQkJZm9yIChpbnQgaT0gMDsgaSAhPSBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQotCQkJCQlIaWdobGlnaHRlZFBvc2l0aW9uIHBvc2l0aW9uPSAoSGlnaGxpZ2h0ZWRQb3NpdGlvbikgcG9zaXRpb25zW2ldOwotCi0JCQkJCS8vIEFsc28gdXBkYXRlIGRlbGV0ZWQgcG9zaXRpb25zIGJlY2F1c2UgdGhleSBnZXQgZGVsZXRlZCBieSB0aGUgYmFja2dyb3VuZCB0aHJlYWQgYW5kIHJlbW92ZWQvaW52YWxpZGF0ZWQgb25seSBpbiB0aGUgVUkgcnVubmFibGUKLS8vCQkJCQlpZiAocG9zaXRpb24uaXNEZWxldGVkKCkpCi0vLwkJCQkJCWNvbnRpbnVlOwotCi0JCQkJCWludCBvZmZzZXQ9IHBvc2l0aW9uLmdldE9mZnNldCgpOwotCQkJCQlpbnQgbGVuZ3RoPSBwb3NpdGlvbi5nZXRMZW5ndGgoKTsKLQkJCQkJaW50IGVuZD0gb2Zmc2V0ICsgbGVuZ3RoOwotCi0JCQkJCWlmIChvZmZzZXQgPiBldmVudEVuZCkKLQkJCQkJCXVwZGF0ZVdpdGhQcmVjZWRpbmdFdmVudChwb3NpdGlvbiwgZXZlbnQpOwotCQkJCQllbHNlIGlmIChlbmQgPCBldmVudE9mZnNldCkgewotCQkJCQkJLy8gZG8gbm90aGluZwotCQkJCQkJLy8gdXBkYXRlV2l0aFN1Y2NlZWRpbmdFdmVudChwb3NpdGlvbiwgZXZlbnQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKG9mZnNldCA8PSBldmVudE9mZnNldCAmJiBlbmQgPj0gZXZlbnRFbmQpCi0JCQkJCQl1cGRhdGVXaXRoSW5jbHVkZWRFdmVudChwb3NpdGlvbiwgZXZlbnQpOwotCQkJCQllbHNlIGlmIChvZmZzZXQgPD0gZXZlbnRPZmZzZXQpCi0JCQkJCQl1cGRhdGVXaXRoT3ZlckVuZEV2ZW50KHBvc2l0aW9uLCBldmVudCk7Ci0JCQkJCWVsc2UgaWYgKGVuZCA+PSBldmVudEVuZCkKLQkJCQkJCXVwZGF0ZVdpdGhPdmVyU3RhcnRFdmVudChwb3NpdGlvbiwgZXZlbnQpOwotCQkJCQllbHNlCi0JCQkJCQl1cGRhdGVXaXRoSW5jbHVkaW5nRXZlbnQocG9zaXRpb24sIGV2ZW50KTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUgYW5kIHJldHVybgotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFVwZGF0ZSB0aGUgZ2l2ZW4gcG9zaXRpb24gd2l0aCB0aGUgZ2l2ZW4gZXZlbnQuIFRoZSBldmVudCBwcmVjZWRlcyB0aGUgcG9zaXRpb24uCi0JCSAqCi0JCSAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24KLQkJICogQHBhcmFtIGV2ZW50IFRoZSBldmVudAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZVdpdGhQcmVjZWRpbmdFdmVudChIaWdobGlnaHRlZFBvc2l0aW9uIHBvc2l0aW9uLCBEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlTdHJpbmcgbmV3VGV4dD0gZXZlbnQuZ2V0VGV4dCgpOwotCQkJaW50IGV2ZW50TmV3TGVuZ3RoPSBuZXdUZXh0ICE9IG51bGwgPyBuZXdUZXh0Lmxlbmd0aCgpIDogMDsKLQkJCWludCBkZWx0YUxlbmd0aD0gZXZlbnROZXdMZW5ndGggLSBldmVudC5nZXRMZW5ndGgoKTsKLQotCQkJcG9zaXRpb24uc2V0T2Zmc2V0KHBvc2l0aW9uLmdldE9mZnNldCgpICsgZGVsdGFMZW5ndGgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFVwZGF0ZSB0aGUgZ2l2ZW4gcG9zaXRpb24gd2l0aCB0aGUgZ2l2ZW4gZXZlbnQuIFRoZSBldmVudCBzdWNjZWVkcyB0aGUgcG9zaXRpb24uCi0JCSAqCi0JCSAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24KLQkJICogQHBhcmFtIGV2ZW50IFRoZSBldmVudAotCQkgKi8KLS8vCQlwcml2YXRlIHZvaWQgdXBkYXRlV2l0aFN1Y2NlZWRpbmdFdmVudChIaWdobGlnaHRlZFBvc2l0aW9uIHBvc2l0aW9uLCBEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0vLwkJfQotCi0JCS8qKgotCQkgKiBVcGRhdGUgdGhlIGdpdmVuIHBvc2l0aW9uIHdpdGggdGhlIGdpdmVuIGV2ZW50LiBUaGUgZXZlbnQgaXMgaW5jbHVkZWQgYnkgdGhlIHBvc2l0aW9uLgotCQkgKgotCQkgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uCi0JCSAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQKLQkJICovCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVXaXRoSW5jbHVkZWRFdmVudChIaWdobGlnaHRlZFBvc2l0aW9uIHBvc2l0aW9uLCBEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlpbnQgZXZlbnRPZmZzZXQ9IGV2ZW50LmdldE9mZnNldCgpOwotCQkJU3RyaW5nIG5ld1RleHQ9IGV2ZW50LmdldFRleHQoKTsKLQkJCWlmIChuZXdUZXh0ID09IG51bGwpCi0JCQkJbmV3VGV4dD0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBldmVudE5ld0xlbmd0aD0gbmV3VGV4dC5sZW5ndGgoKTsKLQotCQkJaW50IGRlbHRhTGVuZ3RoPSBldmVudE5ld0xlbmd0aCAtIGV2ZW50LmdldExlbmd0aCgpOwotCi0JCQlpbnQgb2Zmc2V0PSBwb3NpdGlvbi5nZXRPZmZzZXQoKTsKLQkJCWludCBsZW5ndGg9IHBvc2l0aW9uLmdldExlbmd0aCgpOwotCQkJaW50IGVuZD0gb2Zmc2V0ICsgbGVuZ3RoOwotCi0JCQlpbnQgaW5jbHVkZWRMZW5ndGg9IDA7Ci0JCQl3aGlsZSAoaW5jbHVkZWRMZW5ndGggPCBldmVudE5ld0xlbmd0aCAmJiAhQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShuZXdUZXh0LmNoYXJBdChpbmNsdWRlZExlbmd0aCkpKQotCQkJCWluY2x1ZGVkTGVuZ3RoKys7Ci0JCQlpZiAoaW5jbHVkZWRMZW5ndGggPT0gZXZlbnROZXdMZW5ndGgpCi0JCQkJcG9zaXRpb24uc2V0TGVuZ3RoKGxlbmd0aCArIGRlbHRhTGVuZ3RoKTsKLQkJCWVsc2UgewotCQkJCWludCBuZXdMZWZ0TGVuZ3RoPSBldmVudE9mZnNldCAtIG9mZnNldCArIGluY2x1ZGVkTGVuZ3RoOwotCi0JCQkJaW50IGV4Y2x1ZGVkTGVuZ3RoPSBldmVudE5ld0xlbmd0aDsKLQkJCQl3aGlsZSAoZXhjbHVkZWRMZW5ndGggPiAwICYmICFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG5ld1RleHQuY2hhckF0KGV4Y2x1ZGVkTGVuZ3RoIC0gMSkpKQotCQkJCQlleGNsdWRlZExlbmd0aC0tOwotCQkJCWludCBuZXdSaWdodE9mZnNldD0gZXZlbnRPZmZzZXQgKyBleGNsdWRlZExlbmd0aDsKLQkJCQlpbnQgbmV3UmlnaHRMZW5ndGg9IGVuZCArIGRlbHRhTGVuZ3RoIC0gbmV3UmlnaHRPZmZzZXQ7Ci0KLQkJCQlpZiAobmV3UmlnaHRMZW5ndGggPT0gMCkgewotCQkJCQlwb3NpdGlvbi5zZXRMZW5ndGgobmV3TGVmdExlbmd0aCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKG5ld0xlZnRMZW5ndGggPT0gMCkgewotCQkJCQkJcG9zaXRpb24udXBkYXRlKG5ld1JpZ2h0T2Zmc2V0LCBuZXdSaWdodExlbmd0aCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwb3NpdGlvbi5zZXRMZW5ndGgobmV3TGVmdExlbmd0aCk7Ci0JCQkJCQlhZGRQb3NpdGlvbkZyb21VSShwb3NpdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogVXBkYXRlIHRoZSBnaXZlbiBwb3NpdGlvbiB3aXRoIHRoZSBnaXZlbiBldmVudC4gVGhlIGV2ZW50IG92ZXJsYXBzIHdpdGggdGhlIGVuZCBvZiB0aGUgcG9zaXRpb24uCi0JCSAqCi0JCSAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24KLQkJICogQHBhcmFtIGV2ZW50IFRoZSBldmVudAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZVdpdGhPdmVyRW5kRXZlbnQoSGlnaGxpZ2h0ZWRQb3NpdGlvbiBwb3NpdGlvbiwgRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJU3RyaW5nIG5ld1RleHQ9IGV2ZW50LmdldFRleHQoKTsKLQkJCWlmIChuZXdUZXh0ID09IG51bGwpCi0JCQkJbmV3VGV4dD0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBldmVudE5ld0xlbmd0aD0gbmV3VGV4dC5sZW5ndGgoKTsKLQotCQkJaW50IGluY2x1ZGVkTGVuZ3RoPSAwOwotCQkJd2hpbGUgKGluY2x1ZGVkTGVuZ3RoIDwgZXZlbnROZXdMZW5ndGggJiYgIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UobmV3VGV4dC5jaGFyQXQoaW5jbHVkZWRMZW5ndGgpKSkKLQkJCQlpbmNsdWRlZExlbmd0aCsrOwotCQkJcG9zaXRpb24uc2V0TGVuZ3RoKGV2ZW50LmdldE9mZnNldCgpIC0gcG9zaXRpb24uZ2V0T2Zmc2V0KCkgKyBpbmNsdWRlZExlbmd0aCk7Ci0JCX0KLQotCQkvKioKLQkJICogVXBkYXRlIHRoZSBnaXZlbiBwb3NpdGlvbiB3aXRoIHRoZSBnaXZlbiBldmVudC4gVGhlIGV2ZW50IG92ZXJsYXBzIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBwb3NpdGlvbi4KLQkJICoKLQkJICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbgotCQkgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50Ci0JCSAqLwotCQlwcml2YXRlIHZvaWQgdXBkYXRlV2l0aE92ZXJTdGFydEV2ZW50KEhpZ2hsaWdodGVkUG9zaXRpb24gcG9zaXRpb24sIERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCWludCBldmVudE9mZnNldD0gZXZlbnQuZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgZXZlbnRFbmQ9IGV2ZW50T2Zmc2V0ICsgZXZlbnQuZ2V0TGVuZ3RoKCk7Ci0KLQkJCVN0cmluZyBuZXdUZXh0PSBldmVudC5nZXRUZXh0KCk7Ci0JCQlpZiAobmV3VGV4dCA9PSBudWxsKQotCQkJCW5ld1RleHQ9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgZXZlbnROZXdMZW5ndGg9IG5ld1RleHQubGVuZ3RoKCk7Ci0KLQkJCWludCBleGNsdWRlZExlbmd0aD0gZXZlbnROZXdMZW5ndGg7Ci0JCQl3aGlsZSAoZXhjbHVkZWRMZW5ndGggPiAwICYmICFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG5ld1RleHQuY2hhckF0KGV4Y2x1ZGVkTGVuZ3RoIC0gMSkpKQotCQkJCWV4Y2x1ZGVkTGVuZ3RoLS07Ci0JCQlpbnQgZGVsZXRlZD0gZXZlbnRFbmQgLSBwb3NpdGlvbi5nZXRPZmZzZXQoKTsKLQkJCWludCBpbnNlcnRlZD0gZXZlbnROZXdMZW5ndGggLSBleGNsdWRlZExlbmd0aDsKLQkJCXBvc2l0aW9uLnVwZGF0ZShldmVudE9mZnNldCArIGV4Y2x1ZGVkTGVuZ3RoLCBwb3NpdGlvbi5nZXRMZW5ndGgoKSAtIGRlbGV0ZWQgKyBpbnNlcnRlZCk7Ci0JCX0KLQotCQkvKioKLQkJICogVXBkYXRlIHRoZSBnaXZlbiBwb3NpdGlvbiB3aXRoIHRoZSBnaXZlbiBldmVudC4gVGhlIGV2ZW50IGluY2x1ZGVzIHRoZSBwb3NpdGlvbi4KLQkJICoKLQkJICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbgotCQkgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50Ci0JCSAqLwotCQlwcml2YXRlIHZvaWQgdXBkYXRlV2l0aEluY2x1ZGluZ0V2ZW50KEhpZ2hsaWdodGVkUG9zaXRpb24gcG9zaXRpb24sIERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCXBvc2l0aW9uLmRlbGV0ZSgpOwotCQkJcG9zaXRpb24udXBkYXRlKGV2ZW50LmdldE9mZnNldCgpLCAwKTsKLQkJfQotCX0KLQotCS8qKiBQb3NpdGlvbiB1cGRhdGVyICovCi0JcHJpdmF0ZSBJUG9zaXRpb25VcGRhdGVyIGZQb3NpdGlvblVwZGF0ZXI9IG5ldyBIaWdobGlnaHRpbmdQb3NpdGlvblVwZGF0ZXIoZ2V0UG9zaXRpb25DYXRlZ29yeSgpKTsKLQotCS8qKiBUaGUgc291cmNlIHZpZXdlciB0aGlzIHNlbWFudGljIGhpZ2hsaWdodGluZyByZWNvbmNpbGVyIGlzIGluc3RhbGxlZCBvbiAqLwotCXByaXZhdGUgSVNvdXJjZVZpZXdlciBmU291cmNlVmlld2VyOwotCS8qKiBUaGUgYmFja2dyb3VuZCBwcmVzZW50YXRpb24gcmVjb25jaWxlciAqLwotCXByaXZhdGUgU3RydWN0dXJlZFByZXNlbnRhdGlvblJlY29uY2lsZXIgZlByZXNlbnRhdGlvblJlY29uY2lsZXI7Ci0KLQkvKiogVUkncyBjdXJyZW50IGhpZ2hsaWdodGVkIHBvc2l0aW9ucyAtIGNhbiBjb250YWluIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnRzICovCi0JcHJpdmF0ZSBMaXN0IGZQb3NpdGlvbnM9IG5ldyBBcnJheUxpc3QoKTsKLQkvKiogVUkgcG9zaXRpb24gbG9jayAqLwotCXByaXZhdGUgT2JqZWN0IGZQb3NpdGlvbkxvY2s9IG5ldyBPYmplY3QoKTsKLQotCS8qKiA8Y29kZT50cnVlPC9jb2RlPiBpZmYgdGhlIGN1cnJlbnQgcmVjb25jaWxlIGlzIGNhbmNlbGVkLiAqLwotCXByaXZhdGUgYm9vbGVhbiBmSXNDYW5jZWxlZD0gZmFsc2U7Ci0KLQkvKiogUmVhZC1vbmx5IGNvbG9yIHN1cHBvcnQgKi8KLQlwcml2YXRlIFlVVl9SR0JDb252ZXJ0ZXIgcmdiQ29udmVydGVyOwotCXByaXZhdGUgTWFwIHJlYWRPbmx5Q29sb3JUYWJsZTsKLQlkb3VibGUgcmVhZE9ubHlGb3JlZ3JvdW5kU2NhbGVGYWN0b3IgPSAzMDsKLQkKLQlwdWJsaWMgU2VtYW50aWNIaWdobGlnaHRpbmdQcmVzZW50ZXIoKSB7Ci0JCS8vIG5vIGxpc3RlbmVyIGZvciBub3cgc2luY2UgdGhlcmUncyBubyBVSSB0byBjaGFuZ2UgdGhlIHZhbHVlCi0JCUlQcmVmZXJlbmNlU3RvcmUgZWRpdG9yU3RvcmUgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXJlYWRPbmx5Rm9yZWdyb3VuZFNjYWxlRmFjdG9yID0gZWRpdG9yU3RvcmUuZ2V0SW50KEVkaXRvclByZWZlcmVuY2VOYW1lcy5SRUFEX09OTFlfRk9SRUdST1VORF9TQ0FMRSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBoaWdobGlnaHRlZCBwb3NpdGlvbiB3aXRoIHRoZSBnaXZlbiBvZmZzZXQsIGxlbmd0aCBhbmQgaGlnaGxpZ2h0aW5nLgotCSAqIDxwPgotCSAqIE5PVEU6IEFsc28gY2FsbGVkIGZyb20gYmFja2dyb3VuZCB0aHJlYWQuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aCBUaGUgbGVuZ3RoCi0JICogQHBhcmFtIGhpZ2hsaWdodGluZyBUaGUgaGlnaGxpZ2h0aW5nCi0JICogQHJldHVybiBUaGUgbmV3IGhpZ2hsaWdodGVkIHBvc2l0aW9uCi0JICovCi0JcHVibGljIEhpZ2hsaWdodGVkUG9zaXRpb24gY3JlYXRlSGlnaGxpZ2h0ZWRQb3NpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBIaWdobGlnaHRpbmdTdHlsZSBoaWdobGlnaHRpbmcpIHsKLQkJLy8gVE9ETzogcmV1c2UgZGVsZXRlZCBwb3NpdGlvbnMKLQkJcmV0dXJuIG5ldyBIaWdobGlnaHRlZFBvc2l0aW9uKG9mZnNldCwgbGVuZ3RoLCBoaWdobGlnaHRpbmcsIGZQb3NpdGlvblVwZGF0ZXIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGhpZ2hsaWdodGVkIHBvc2l0aW9uIGZyb20gdGhlIGdpdmVuIHBvc2l0aW9uIGFuZCBoaWdobGlnaHRpbmcuCi0JICogPHA+Ci0JICogTk9URTogQWxzbyBjYWxsZWQgZnJvbSBiYWNrZ3JvdW5kIHRocmVhZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uCi0JICogQHBhcmFtIGhpZ2hsaWdodGluZyBUaGUgaGlnaGxpZ2h0aW5nCi0JICogQHJldHVybiBUaGUgbmV3IGhpZ2hsaWdodGVkIHBvc2l0aW9uCi0JICovCi0JcHVibGljIEhpZ2hsaWdodGVkUG9zaXRpb24gY3JlYXRlSGlnaGxpZ2h0ZWRQb3NpdGlvbihQb3NpdGlvbiBwb3NpdGlvbiwgSGlnaGxpZ2h0aW5nU3R5bGUgaGlnaGxpZ2h0aW5nKSB7Ci0JCS8vIFRPRE86IHJldXNlIGRlbGV0ZWQgcG9zaXRpb25zCi0JCXJldHVybiBuZXcgSGlnaGxpZ2h0ZWRQb3NpdGlvbihwb3NpdGlvbiwgaGlnaGxpZ2h0aW5nLCBmUG9zaXRpb25VcGRhdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGhpZ2hsaWdodGVkIHBvc2l0aW9uIGZyb20gdGhlIGdpdmVuIHBvc2l0aW9uIGFuZCBoaWdobGlnaHRpbmcuCi0JICogPHA+Ci0JICogTk9URTogQWxzbyBjYWxsZWQgZnJvbSBiYWNrZ3JvdW5kIHRocmVhZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uCi0JICogQHBhcmFtIGhpZ2hsaWdodGluZyBUaGUgaGlnaGxpZ2h0aW5nCi0JICogQHBhcmFtIGlzUmVhZE9ubHkgSXMgdGhpcyBhIHJlYWQtb25seSBwb3NpdGlvbgotCSAqIEByZXR1cm4gVGhlIG5ldyBoaWdobGlnaHRlZCBwb3NpdGlvbgotCSAqLwotCXB1YmxpYyBIaWdobGlnaHRlZFBvc2l0aW9uIGNyZWF0ZUhpZ2hsaWdodGVkUG9zaXRpb24oUG9zaXRpb24gcG9zaXRpb24sIEhpZ2hsaWdodGluZ1N0eWxlIGhpZ2hsaWdodGluZywgYm9vbGVhbiBpc1JlYWRPbmx5KSB7Ci0JCS8vIFRPRE86IHJldXNlIGRlbGV0ZWQgcG9zaXRpb25zCi0JCXJldHVybiBuZXcgSGlnaGxpZ2h0ZWRQb3NpdGlvbihwb3NpdGlvbiwgaGlnaGxpZ2h0aW5nLCBmUG9zaXRpb25VcGRhdGVyLCBpc1JlYWRPbmx5KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGFsbCBjdXJyZW50IHBvc2l0aW9ucyB0byB0aGUgZ2l2ZW4gbGlzdC4KLQkgKiA8cD4KLQkgKiBOT1RFOiBDYWxsZWQgZnJvbSBiYWNrZ3JvdW5kIHRocmVhZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbGlzdCBUaGUgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFsbFBvc2l0aW9ucyhMaXN0IGxpc3QpIHsKLQkJc3luY2hyb25pemVkIChmUG9zaXRpb25Mb2NrKSB7Ci0JCQlsaXN0LmFkZEFsbChmUG9zaXRpb25zKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHRleHQgcHJlc2VudGF0aW9uIGluIHRoZSBiYWNrZ3JvdW5kLgotCSAqIDxwPgotCSAqIE5PVEU6IENhbGxlZCBmcm9tIGJhY2tncm91bmQgdGhyZWFkLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhZGRlZFBvc2l0aW9ucyB0aGUgYWRkZWQgcG9zaXRpb25zCi0JICogQHBhcmFtIHJlbW92ZWRQb3NpdGlvbnMgdGhlIHJlbW92ZWQgcG9zaXRpb25zCi0JICogQHJldHVybiB0aGUgdGV4dCBwcmVzZW50YXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4sIGlmIHJlY29uY2lsaWF0aW9uIHNob3VsZCBiZSBjYW5jZWxlZAotCSAqLwotCXB1YmxpYyBUZXh0UHJlc2VudGF0aW9uIGNyZWF0ZVByZXNlbnRhdGlvbihMaXN0IGFkZGVkUG9zaXRpb25zLCBMaXN0IHJlbW92ZWRQb3NpdGlvbnMpIHsKLQkJSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXI9IGZTb3VyY2VWaWV3ZXI7Ci0JCVN0cnVjdHVyZWRQcmVzZW50YXRpb25SZWNvbmNpbGVyIHByZXNlbnRhdGlvblJlY29uY2lsZXI9IGZQcmVzZW50YXRpb25SZWNvbmNpbGVyOwotCQlpZiAoc291cmNlVmlld2VyID09IG51bGwgfHwgcHJlc2VudGF0aW9uUmVjb25jaWxlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKGlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlEb2N1bWVudCBkb2N1bWVudD0gc291cmNlVmlld2VyLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IG1pblN0YXJ0PSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJaW50IG1heEVuZD0gSW50ZWdlci5NSU5fVkFMVUU7Ci0JCWZvciAoaW50IGk9IDAsIG49IHJlbW92ZWRQb3NpdGlvbnMuc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0JCQlQb3NpdGlvbiBwb3NpdGlvbj0gKFBvc2l0aW9uKSByZW1vdmVkUG9zaXRpb25zLmdldChpKTsKLQkJCWludCBvZmZzZXQ9IHBvc2l0aW9uLmdldE9mZnNldCgpOwotCQkJbWluU3RhcnQ9IE1hdGgubWluKG1pblN0YXJ0LCBvZmZzZXQpOwotCQkJbWF4RW5kPSBNYXRoLm1heChtYXhFbmQsIG9mZnNldCArIHBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQkJfQotCQlmb3IgKGludCBpPSAwLCBuPSBhZGRlZFBvc2l0aW9ucy5zaXplKCk7IGkgPCBuOyBpKyspIHsKLQkJCVBvc2l0aW9uIHBvc2l0aW9uPSAoUG9zaXRpb24pIGFkZGVkUG9zaXRpb25zLmdldChpKTsKLQkJCWludCBvZmZzZXQ9IHBvc2l0aW9uLmdldE9mZnNldCgpOwotCQkJbWluU3RhcnQ9IE1hdGgubWluKG1pblN0YXJ0LCBvZmZzZXQpOwotCQkJbWF4RW5kPSBNYXRoLm1heChtYXhFbmQsIG9mZnNldCArIHBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQkJfQotCi0JCWlmIChtaW5TdGFydCA8IG1heEVuZCkKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHByZXNlbnRhdGlvblJlY29uY2lsZXIuY3JlYXRlUmVwYWlyRGVzY3JpcHRpb24obmV3IFJlZ2lvbihtaW5TdGFydCwgbWF4RW5kIC0gbWluU3RhcnQpLCBkb2N1bWVudCk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBBc3N1bWUgY29uY3VycmVudCBtb2RpZmljYXRpb24gZnJvbSBVSSB0aHJlYWQKLQkJCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBydW5uYWJsZSBmb3IgdXBkYXRpbmcgdGhlIHByZXNlbnRhdGlvbi4KLQkgKiA8cD4KLQkgKiBOT1RFOiBDYWxsZWQgZnJvbSBiYWNrZ3JvdW5kIHRocmVhZC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIHRleHRQcmVzZW50YXRpb24gdGhlIHRleHQgcHJlc2VudGF0aW9uCi0JICogQHBhcmFtIGFkZGVkUG9zaXRpb25zIHRoZSBhZGRlZCBwb3NpdGlvbnMKLQkgKiBAcGFyYW0gcmVtb3ZlZFBvc2l0aW9ucyB0aGUgcmVtb3ZlZCBwb3NpdGlvbnMKLQkgKiBAcmV0dXJuIHRoZSBydW5uYWJsZSBvciA8Y29kZT5udWxsPC9jb2RlPiwgaWYgcmVjb25jaWxpYXRpb24gc2hvdWxkIGJlIGNhbmNlbGVkCi0JICovCi0JcHVibGljIFJ1bm5hYmxlIGNyZWF0ZVVwZGF0ZVJ1bm5hYmxlKGZpbmFsIFRleHRQcmVzZW50YXRpb24gdGV4dFByZXNlbnRhdGlvbiwgTGlzdCBhZGRlZFBvc2l0aW9ucywgTGlzdCByZW1vdmVkUG9zaXRpb25zKSB7Ci0JCWlmIChmU291cmNlVmlld2VyID09IG51bGwgfHwgdGV4dFByZXNlbnRhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gVE9ETzogZG8gY2x1c3RlcmluZyBvZiBwb3NpdGlvbnMgYW5kIHBvc3QgbXVsdGlwbGUgZmFzdCBydW5uYWJsZXMKLQkJZmluYWwgSGlnaGxpZ2h0ZWRQb3NpdGlvbltdIGFkZGVkPSBuZXcgU2VtYW50aWNIaWdobGlnaHRpbmdNYW5hZ2VyLkhpZ2hsaWdodGVkUG9zaXRpb25bYWRkZWRQb3NpdGlvbnMuc2l6ZSgpXTsKLQkJYWRkZWRQb3NpdGlvbnMudG9BcnJheShhZGRlZCk7Ci0JCWZpbmFsIFNlbWFudGljSGlnaGxpZ2h0aW5nTWFuYWdlci5IaWdobGlnaHRlZFBvc2l0aW9uW10gcmVtb3ZlZD0gbmV3IFNlbWFudGljSGlnaGxpZ2h0aW5nTWFuYWdlci5IaWdobGlnaHRlZFBvc2l0aW9uW3JlbW92ZWRQb3NpdGlvbnMuc2l6ZSgpXTsKLQkJcmVtb3ZlZFBvc2l0aW9ucy50b0FycmF5KHJlbW92ZWQpOwotCi0JCWlmIChpc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlSdW5uYWJsZSBydW5uYWJsZT0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXVwZGF0ZVByZXNlbnRhdGlvbih0ZXh0UHJlc2VudGF0aW9uLCBhZGRlZCwgcmVtb3ZlZCk7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBydW5uYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnZhbGlkYXRlIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIHBvc2l0aW9ucyBiYXNlZCBvbiB0aGUgZ2l2ZW4gYWRkZWQgcG9zaXRpb25zIGFuZCB0aGUgZXhpc3RpbmcgZGVsZXRlZCBwb3NpdGlvbnMuCi0JICogQWxzbyB1bnJlZ2lzdGVycyB0aGUgZGVsZXRlZCBwb3NpdGlvbnMgZnJvbSB0aGUgZG9jdW1lbnQgYW5kIHBhdGNoZXMgdGhlIHBvc2l0aW9ucyBvZiB0aGlzIHByZXNlbnRlci4KLQkgKiA8cD4KLQkgKiBOT1RFOiBJbmRpcmVjdGx5IGNhbGxlZCBmcm9tIGJhY2tncm91bmQgdGhyZWFkIGJ5IFVJIHJ1bm5hYmxlLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gdGV4dFByZXNlbnRhdGlvbiB0aGUgdGV4dCBwcmVzZW50YXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4sIGlmIHRoZSBwcmVzZW50YXRpb24gc2hvdWxkIGNvbXB1dGVkIGluIHRoZSBVSSB0aHJlYWQKLQkgKiBAcGFyYW0gYWRkZWRQb3NpdGlvbnMgdGhlIGFkZGVkIHBvc2l0aW9ucwotCSAqIEBwYXJhbSByZW1vdmVkUG9zaXRpb25zIHRoZSByZW1vdmVkIHBvc2l0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVByZXNlbnRhdGlvbihUZXh0UHJlc2VudGF0aW9uIHRleHRQcmVzZW50YXRpb24sIEhpZ2hsaWdodGVkUG9zaXRpb25bXSBhZGRlZFBvc2l0aW9ucywgSGlnaGxpZ2h0ZWRQb3NpdGlvbltdIHJlbW92ZWRQb3NpdGlvbnMpIHsKLQkJaWYgKGZTb3VyY2VWaWV3ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotLy8JCWNoZWNrT3JkZXJpbmcoImFkZGVkIHBvc2l0aW9uczogIiwgQXJyYXlzLmFzTGlzdChhZGRlZFBvc2l0aW9ucykpOyAvLyROT04tTkxTLTEkCi0vLwkJY2hlY2tPcmRlcmluZygicmVtb3ZlZCBwb3NpdGlvbnM6ICIsIEFycmF5cy5hc0xpc3QocmVtb3ZlZFBvc2l0aW9ucykpOyAvLyROT04tTkxTLTEkCi0vLwkJY2hlY2tPcmRlcmluZygib2xkIHBvc2l0aW9uczogIiwgZlBvc2l0aW9ucyk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBUT0RPOiBkb3VibGUtY2hlY2sgY29uc2lzdGVuY3kgd2l0aCBkb2N1bWVudC5nZXRQb3NpdGlvbnMoLi4uKQotCQkvLyBUT0RPOiByZXVzZSByZW1vdmVkIHBvc2l0aW9ucwotCQlpZiAoaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCi0JCUlEb2N1bWVudCBkb2N1bWVudD0gZlNvdXJjZVZpZXdlci5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgcG9zaXRpb25DYXRlZ29yeT0gZ2V0UG9zaXRpb25DYXRlZ29yeSgpOwotCi0JCUxpc3QgcmVtb3ZlZFBvc2l0aW9uc0xpc3Q9IEFycmF5cy5hc0xpc3QocmVtb3ZlZFBvc2l0aW9ucyk7Ci0KLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZCAoZlBvc2l0aW9uTG9jaykgewotCQkJCUxpc3Qgb2xkUG9zaXRpb25zPSBmUG9zaXRpb25zOwotCQkJCWludCBuZXdTaXplPSBNYXRoLm1heChmUG9zaXRpb25zLnNpemUoKSArIGFkZGVkUG9zaXRpb25zLmxlbmd0aCAtIHJlbW92ZWRQb3NpdGlvbnMubGVuZ3RoLCAxMCk7Ci0KLQkJCQkvKgotCQkJCSAqIFRoZSBmb2xsb3dpbmcgbG9vcCBpcyBhIGtpbmQgb2YgbWVyZ2Ugc29ydDogaXQgbWVyZ2VzIHR3byBMaXN0PFBvc2l0aW9uPiwgZWFjaAotCQkJCSAqIHNvcnRlZCBieSBwb3NpdGlvbi5vZmZzZXQsIGludG8gb25lIG5ldyBsaXN0LiBUaGUgZmlyc3Qgb2YgdGhlIHR3byBpcyB0aGUKLQkJCQkgKiBwcmV2aW91cyBsaXN0IG9mIHBvc2l0aW9ucyAob2xkUG9zaXRpb25zKSwgZnJvbSB3aGljaCBhbnkgZGVsZXRlZCBwb3NpdGlvbnMgZ2V0Ci0JCQkJICogcmVtb3ZlZCBvbiB0aGUgZmx5LiBUaGUgc2Vjb25kIG9mIHR3byBpcyB0aGUgbGlzdCBvZiBhZGRlZCBwb3NpdGlvbnMuIFRoZSByZXN1bHQKLQkJCQkgKiBpcyBzdG9yZWQgaW4gbmV3UG9zaXRpb25zLgotCQkJCSAqLwotCQkJCUxpc3QgbmV3UG9zaXRpb25zPSBuZXcgQXJyYXlMaXN0KG5ld1NpemUpOwotCQkJCVBvc2l0aW9uIHBvc2l0aW9uPSBudWxsOwotCQkJCVBvc2l0aW9uIGFkZGVkUG9zaXRpb249IG51bGw7Ci0JCQkJZm9yIChpbnQgaT0gMCwgaj0gMCwgbj0gb2xkUG9zaXRpb25zLnNpemUoKSwgbT0gYWRkZWRQb3NpdGlvbnMubGVuZ3RoOyBpIDwgbiB8fCBwb3NpdGlvbiAhPSBudWxsIHx8IGogPCBtIHx8IGFkZGVkUG9zaXRpb24gIT0gbnVsbDspIHsKLQkJCQkJLy8gbG9vcCB2YXJpYW50OiBpICsgaiA8IG9sZChpICsgaikKLQotCQkJCQkvLyBhKSBmaW5kIHRoZSBuZXh0IG5vbi1kZWxldGVkIFBvc2l0aW9uIGZyb20gdGhlIG9sZCBsaXN0Ci0JCQkJCXdoaWxlIChwb3NpdGlvbiA9PSBudWxsICYmIGkgPCBuKSB7Ci0JCQkJCQlwb3NpdGlvbj0gKFBvc2l0aW9uKSBvbGRQb3NpdGlvbnMuZ2V0KGkrKyk7Ci0JCQkJCQlpZiAocG9zaXRpb24uaXNEZWxldGVkKCkgfHwgY29udGFpbihyZW1vdmVkUG9zaXRpb25zTGlzdCwgcG9zaXRpb24pKSB7Ci0JCQkJCQkJZG9jdW1lbnQucmVtb3ZlUG9zaXRpb24ocG9zaXRpb25DYXRlZ29yeSwgcG9zaXRpb24pOwotCQkJCQkJCXBvc2l0aW9uPSBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gYikgZmluZCB0aGUgbmV4dCBQb3NpdGlvbiBmcm9tIHRoZSBhZGRlZCBsaXN0Ci0JCQkJCWlmIChhZGRlZFBvc2l0aW9uID09IG51bGwgJiYgaiA8IG0pIHsKLQkJCQkJCWFkZGVkUG9zaXRpb249IGFkZGVkUG9zaXRpb25zW2orK107Ci0JCQkJCQlkb2N1bWVudC5hZGRQb3NpdGlvbihwb3NpdGlvbkNhdGVnb3J5LCBhZGRlZFBvc2l0aW9uKTsKLQkJCQkJfQotCi0JCQkJCS8vIGMpIG1lcmdlOiBhZGQgdGhlIG5leHQgb2YgcG9zaXRpb24vYWRkZWRQb3NpdGlvbiB3aXRoIHRoZSBsb3dlciBvZmZzZXQKLQkJCQkJaWYgKHBvc2l0aW9uICE9IG51bGwpIHsKLQkJCQkJCWlmIChhZGRlZFBvc2l0aW9uICE9IG51bGwpCi0JCQkJCQkJaWYgKHBvc2l0aW9uLmdldE9mZnNldCgpIDw9IGFkZGVkUG9zaXRpb24uZ2V0T2Zmc2V0KCkpIHsKLQkJCQkJCQkJbmV3UG9zaXRpb25zLmFkZChwb3NpdGlvbik7Ci0JCQkJCQkJCXBvc2l0aW9uPSBudWxsOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCW5ld1Bvc2l0aW9ucy5hZGQoYWRkZWRQb3NpdGlvbik7Ci0JCQkJCQkJCWFkZGVkUG9zaXRpb249IG51bGw7Ci0JCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJbmV3UG9zaXRpb25zLmFkZChwb3NpdGlvbik7Ci0JCQkJCQkJcG9zaXRpb249IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoYWRkZWRQb3NpdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQluZXdQb3NpdGlvbnMuYWRkKGFkZGVkUG9zaXRpb24pOwotCQkJCQkJYWRkZWRQb3NpdGlvbj0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQlmUG9zaXRpb25zPSBuZXdQb3NpdGlvbnM7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChmUG9zaXRpb25zLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCQkJCi0JCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLQkJCQkJCVBvc2l0aW9uIHAxID0gKFBvc2l0aW9uKSBhcmcwOwotCQkJCQkJUG9zaXRpb24gcDIgPSAoUG9zaXRpb24pIGFyZzE7Ci0JCQkJCQlyZXR1cm4gcDEub2Zmc2V0IC0gcDIub2Zmc2V0OwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZSkgewotCQkJLy8gU2hvdWxkIG5vdCBoYXBwZW4KLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNob3VsZCBub3QgaGFwcGVuCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0vLwkJY2hlY2tPcmRlcmluZygibmV3IHBvc2l0aW9uczogIiwgZlBvc2l0aW9ucyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAodGV4dFByZXNlbnRhdGlvbiAhPSBudWxsKQotCQkJZlNvdXJjZVZpZXdlci5jaGFuZ2VUZXh0UHJlc2VudGF0aW9uKHRleHRQcmVzZW50YXRpb24sIGZhbHNlKTsKLQkJZWxzZQotCQkJZlNvdXJjZVZpZXdlci5pbnZhbGlkYXRlVGV4dFByZXNlbnRhdGlvbigpOwotCX0KLQotLy8JcHJpdmF0ZSB2b2lkIGNoZWNrT3JkZXJpbmcoU3RyaW5nIHMsIExpc3QgcG9zaXRpb25zKSB7Ci0vLwkJUG9zaXRpb24gcHJldmlvdXM9IG51bGw7Ci0vLwkJZm9yIChpbnQgaT0gMCwgbj0gcG9zaXRpb25zLnNpemUoKTsgaSA8IG47IGkrKykgewotLy8JCQlQb3NpdGlvbiBjdXJyZW50PSAoUG9zaXRpb24pIHBvc2l0aW9ucy5nZXQoaSk7Ci0vLwkJCWlmIChwcmV2aW91cyAhPSBudWxsICYmIHByZXZpb3VzLmdldE9mZnNldCgpICsgcHJldmlvdXMuZ2V0TGVuZ3RoKCkgPiBjdXJyZW50LmdldE9mZnNldCgpKQotLy8JCQkJcmV0dXJuOwotLy8JCX0KLS8vCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHRoZSBwb3NpdGlvbnMgY29udGFpbiB0aGUgcG9zaXRpb24uCi0JICogQHBhcmFtIHBvc2l0aW9ucyB0aGUgcG9zaXRpb25zLCBtdXN0IGJlIG9yZGVyZWQgYnkgb2Zmc2V0IGJ1dCBtYXkgb3ZlcmxhcAotCSAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgcG9zaXRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUgcG9zaXRpb25zIGNvbnRhaW4gdGhlIHBvc2l0aW9uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW4oTGlzdCBwb3NpdGlvbnMsIFBvc2l0aW9uIHBvc2l0aW9uKSB7Ci0JCXJldHVybiBpbmRleE9mKHBvc2l0aW9ucywgcG9zaXRpb24pICE9IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaW5kZXggb2YgdGhlIHBvc2l0aW9uIGluIHRoZSBwb3NpdGlvbnMsIDxjb2RlPi0xPC9jb2RlPiBpZiBub3QgZm91bmQuCi0JICogQHBhcmFtIHBvc2l0aW9ucyB0aGUgcG9zaXRpb25zLCBtdXN0IGJlIG9yZGVyZWQgYnkgb2Zmc2V0IGJ1dCBtYXkgb3ZlcmxhcAotCSAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgcG9zaXRpb24KLQkgKiBAcmV0dXJuIHRoZSBpbmRleAotCSAqLwotCXByaXZhdGUgaW50IGluZGV4T2YoTGlzdCBwb3NpdGlvbnMsIFBvc2l0aW9uIHBvc2l0aW9uKSB7Ci0JCWludCBpbmRleD0gY29tcHV0ZUluZGV4QXRPZmZzZXQocG9zaXRpb25zLCBwb3NpdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCWludCBzaXplPSBwb3NpdGlvbnMuc2l6ZSgpOwotCQl3aGlsZSAoaW5kZXggPCBzaXplKSB7Ci0JCQlpZiAocG9zaXRpb25zLmdldChpbmRleCkgPT0gcG9zaXRpb24pCi0JCQkJcmV0dXJuIGluZGV4OwotCQkJaW5kZXgrKzsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBnaXZlbiBwb3NpdGlvbiBpbiA8Y29kZT5mUG9zaXRpb25zPC9jb2RlPiwgcy50LiB0aGUgb2Zmc2V0cyByZW1haW4gaW4gbGluZWFyIG9yZGVyLgotCSAqCi0JICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiBmb3IgaW5zZXJ0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydFBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB7Ci0JCWludCBpPSBjb21wdXRlSW5kZXhBZnRlck9mZnNldChmUG9zaXRpb25zLCBwb3NpdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCWZQb3NpdGlvbnMuYWRkKGksIHBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgcG9zaXRpb24gd2l0aCBhbiBvZmZzZXQgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBvZmZzZXQuCi0JICoKLQkgKiBAcGFyYW0gcG9zaXRpb25zIHRoZSBwb3NpdGlvbnMsIG11c3QgYmUgb3JkZXJlZCBieSBvZmZzZXQgYW5kIG11c3Qgbm90IG92ZXJsYXAKLQkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQKLQkgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBwb3NpdGlvbiB3aXRoIGFuIG9mZnNldCBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIG9mZnNldAotCSAqLwotCXByaXZhdGUgaW50IGNvbXB1dGVJbmRleEFmdGVyT2Zmc2V0KExpc3QgcG9zaXRpb25zLCBpbnQgb2Zmc2V0KSB7Ci0JCWludCBpPSAtMTsKLQkJaW50IGo9IHBvc2l0aW9ucy5zaXplKCk7Ci0JCXdoaWxlIChqIC0gaSA+IDEpIHsKLQkJCWludCBrPSAoaSArIGopID4+IDE7Ci0JCQlQb3NpdGlvbiBwb3NpdGlvbj0gKFBvc2l0aW9uKSBwb3NpdGlvbnMuZ2V0KGspOwotCQkJaWYgKHBvc2l0aW9uLmdldE9mZnNldCgpID4gb2Zmc2V0KQotCQkJCWo9IGs7Ci0JCQllbHNlCi0JCQkJaT0gazsKLQkJfQotCQlyZXR1cm4gajsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgcG9zaXRpb24gd2l0aCBhbiBvZmZzZXQgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBvZmZzZXQuCi0JICoKLQkgKiBAcGFyYW0gcG9zaXRpb25zIHRoZSBwb3NpdGlvbnMsIG11c3QgYmUgb3JkZXJlZCBieSBvZmZzZXQgYW5kIG11c3Qgbm90IG92ZXJsYXAKLQkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQKLQkgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBwb3NpdGlvbiB3aXRoIGFuIG9mZnNldCBlcXVhbCBvciBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIG9mZnNldAotCSAqLwotCXByaXZhdGUgaW50IGNvbXB1dGVJbmRleEF0T2Zmc2V0KExpc3QgcG9zaXRpb25zLCBpbnQgb2Zmc2V0KSB7Ci0JCWludCBpPSAtMTsKLQkJaW50IGo9IHBvc2l0aW9ucy5zaXplKCk7Ci0JCXdoaWxlIChqIC0gaSA+IDEpIHsKLQkJCWludCBrPSAoaSArIGopID4+IDE7Ci0JCQlQb3NpdGlvbiBwb3NpdGlvbj0gKFBvc2l0aW9uKSBwb3NpdGlvbnMuZ2V0KGspOwotCQkJaWYgKHBvc2l0aW9uLmdldE9mZnNldCgpID49IG9mZnNldCkKLQkJCQlqPSBrOwotCQkJZWxzZQotCQkJCWk9IGs7Ci0JCX0KLQkJcmV0dXJuIGo7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRQcmVzZW50YXRpb25MaXN0ZW5lciNhcHBseVRleHRQcmVzZW50YXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5VGV4dFByZXNlbnRhdGlvbihUZXh0UHJlc2VudGF0aW9uIHRleHRQcmVzZW50YXRpb24pIHsKLQkJSVJlZ2lvbiByZWdpb249IHRleHRQcmVzZW50YXRpb24uZ2V0RXh0ZW50KCk7Ci0JCWludCBtaW5TdGFydD0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCWludCBtYXhFbmQ9IEludGVnZXIuTUlOX1ZBTFVFOwotCQlpbnQgaT0gY29tcHV0ZUluZGV4QXRPZmZzZXQoZlBvc2l0aW9ucywgcmVnaW9uLmdldE9mZnNldCgpKSwgbj0gY29tcHV0ZUluZGV4QXRPZmZzZXQoZlBvc2l0aW9ucywgcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKTsKLQkJaWYgKG4gLSBpID4gMikgewotCQkJTGlzdCByYW5nZXM9IG5ldyBBcnJheUxpc3QobiAtIGkpOwotCQkJZm9yICg7IGkgPCBuOyBpKyspIHsKLQkJCQlIaWdobGlnaHRlZFBvc2l0aW9uIHBvc2l0aW9uPSAoSGlnaGxpZ2h0ZWRQb3NpdGlvbikgZlBvc2l0aW9ucy5nZXQoaSk7Ci0JCQkJaWYgKCFwb3NpdGlvbi5pc0RlbGV0ZWQoKSkgewotCQkJCQlpZiAoIXBvc2l0aW9uLmlzUmVhZE9ubHkoKSkKLQkJCQkJCXJhbmdlcy5hZGQocG9zaXRpb24uY3JlYXRlU3R5bGVSYW5nZSgpKTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlpbnQgb2Zmc2V0PSBwb3NpdGlvbi5nZXRPZmZzZXQoKTsKLQkJCQkJCW1pblN0YXJ0PSBNYXRoLm1pbihtaW5TdGFydCwgb2Zmc2V0KTsKLQkJCQkJCW1heEVuZD0gTWF0aC5tYXgobWF4RW5kLCBvZmZzZXQgKyBwb3NpdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQkJCQotCQkJCX0KLQkJCX0KLQkJCVN0eWxlUmFuZ2VbXSBhcnJheT0gbmV3IFN0eWxlUmFuZ2VbcmFuZ2VzLnNpemUoKV07Ci0JCQlhcnJheT0gKFN0eWxlUmFuZ2VbXSkgcmFuZ2VzLnRvQXJyYXkoYXJyYXkpOwotCQkJdGV4dFByZXNlbnRhdGlvbi5yZXBsYWNlU3R5bGVSYW5nZXMoYXJyYXkpOwotCQl9IGVsc2UgewotCQkJZm9yICg7IGkgPCBuOyBpKyspIHsKLQkJCQlIaWdobGlnaHRlZFBvc2l0aW9uIHBvc2l0aW9uPSAoSGlnaGxpZ2h0ZWRQb3NpdGlvbikgZlBvc2l0aW9ucy5nZXQoaSk7Ci0JCQkJaWYgKCFwb3NpdGlvbi5pc0RlbGV0ZWQoKSkgewotCQkJCQlpZiAoIXBvc2l0aW9uLmlzUmVhZE9ubHkoKSkKLQkJCQkJCXRleHRQcmVzZW50YXRpb24ucmVwbGFjZVN0eWxlUmFuZ2UocG9zaXRpb24uY3JlYXRlU3R5bGVSYW5nZSgpKTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlpbnQgb2Zmc2V0PSBwb3NpdGlvbi5nZXRPZmZzZXQoKTsKLQkJCQkJCW1pblN0YXJ0PSBNYXRoLm1pbihtaW5TdGFydCwgb2Zmc2V0KTsKLQkJCQkJCW1heEVuZD0gTWF0aC5tYXgobWF4RW5kLCBvZmZzZXQgKyBwb3NpdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG1pblN0YXJ0IDwgbWF4RW5kKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZTb3VyY2VWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudC5jb250YWluc1JlYWRPbmx5KG1pblN0YXJ0LCBtYXhFbmQpKSB7Ci0JCQkJSXRlcmF0b3Igbm9uRGVmYXVsdFN0eWxlUmFuZ2VJdGVyYXRvciA9IHRleHRQcmVzZW50YXRpb24uZ2V0Tm9uRGVmYXVsdFN0eWxlUmFuZ2VJdGVyYXRvcigpOwotCQkJCXdoaWxlIChub25EZWZhdWx0U3R5bGVSYW5nZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSAoU3R5bGVSYW5nZSkgbm9uRGVmYXVsdFN0eWxlUmFuZ2VJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChkb2N1bWVudC5jb250YWluc1JlYWRPbmx5KHN0eWxlUmFuZ2Uuc3RhcnQsIHN0eWxlUmFuZ2UubGVuZ3RoKSkgewotCQkJCQkJYWRqdXN0Rm9yZWdyb3VuZChzdHlsZVJhbmdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lciNpbnB1dERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCXJlbGVhc2VEb2N1bWVudChvbGRJbnB1dCk7Ci0JCXJlc2V0U3RhdGUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXIjaW5wdXREb2N1bWVudENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCW1hbmFnZURvY3VtZW50KG5ld0lucHV0KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCXNldENhbmNlbGVkKHRydWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyI2RvY3VtZW50Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHRoZSBjdXJyZW50IHJlY29uY2lsZSBpcyBjYW5jZWxlZC4KLQkgKiA8cD4KLQkgKiBOT1RFOiBBbHNvIGNhbGxlZCBmcm9tIGJhY2tncm91bmQgdGhyZWFkLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQ9IGZTb3VyY2VWaWV3ZXIgIT0gbnVsbCA/IGZTb3VyY2VWaWV3ZXIuZ2V0RG9jdW1lbnQoKSA6IG51bGw7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZJc0NhbmNlbGVkOwotCi0JCXN5bmNocm9uaXplZCAoZ2V0TG9ja09iamVjdChkb2N1bWVudCkpIHsKLQkJCXJldHVybiBmSXNDYW5jZWxlZDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB3aGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCByZWNvbmNpbGUgaXMgY2FuY2VsZWQuCi0JICoKLQkgKiBAcGFyYW0gaXNDYW5jZWxlZCA8Y29kZT50cnVlPC9jb2RlPiBpZmYgdGhlIGN1cnJlbnQgcmVjb25jaWxlIGlzIGNhbmNlbGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FuY2VsZWQoYm9vbGVhbiBpc0NhbmNlbGVkKSB7Ci0JCUlEb2N1bWVudCBkb2N1bWVudD0gZlNvdXJjZVZpZXdlciAhPSBudWxsID8gZlNvdXJjZVZpZXdlci5nZXREb2N1bWVudCgpIDogbnVsbDsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCWZJc0NhbmNlbGVkPSBpc0NhbmNlbGVkOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3luY2hyb25pemVkIChnZXRMb2NrT2JqZWN0KGRvY3VtZW50KSkgewotCQkJZklzQ2FuY2VsZWQ9IGlzQ2FuY2VsZWQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50Ci0JICogQHJldHVybiB0aGUgZG9jdW1lbnQncyBsb2NrIG9iamVjdAotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldExvY2tPYmplY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElTeW5jaHJvbml6YWJsZSkgewotCQkJT2JqZWN0IGxvY2s9ICgoSVN5bmNocm9uaXphYmxlKWRvY3VtZW50KS5nZXRMb2NrT2JqZWN0KCk7Ci0JCQlpZiAobG9jayAhPSBudWxsKQotCQkJCXJldHVybiBsb2NrOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBJbnN0YWxsIHRoaXMgcHJlc2VudGVyIG9uIHRoZSBnaXZlbiBzb3VyY2Ugdmlld2VyIGFuZCBiYWNrZ3JvdW5kIHByZXNlbnRhdGlvbgotCSAqIHJlY29uY2lsZXIuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyIHRoZSBzb3VyY2Ugdmlld2VyCi0JICogQHBhcmFtIGJhY2tncm91bmRQcmVzZW50YXRpb25SZWNvbmNpbGVyIHRoZSBiYWNrZ3JvdW5kIHByZXNlbnRhdGlvbiByZWNvbmNpbGVyLAotCSAqIAljYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluIHRoYXQgY2FzZSB7QGxpbmsgU2VtYW50aWNIaWdobGlnaHRpbmdQcmVzZW50ZXIjY3JlYXRlUHJlc2VudGF0aW9uKExpc3QsIExpc3QpfQotCSAqIAlzaG91bGQgbm90IGJlIGNhbGxlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGwoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cnVjdHVyZWRQcmVzZW50YXRpb25SZWNvbmNpbGVyIGJhY2tncm91bmRQcmVzZW50YXRpb25SZWNvbmNpbGVyKSB7Ci0JCWZTb3VyY2VWaWV3ZXI9IHNvdXJjZVZpZXdlcjsKLQkJZlByZXNlbnRhdGlvblJlY29uY2lsZXI9IGJhY2tncm91bmRQcmVzZW50YXRpb25SZWNvbmNpbGVyOwotCi0JCWlmIChmU291cmNlVmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRWaWV3ZXIpCi0JCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSBmU291cmNlVmlld2VyKS5wcmVwZW5kVGV4dFByZXNlbnRhdGlvbkxpc3RlbmVyKHRoaXMpOwotCQllbHNlIGlmKGZTb3VyY2VWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjQpCi0JCQkoKElUZXh0Vmlld2VyRXh0ZW5zaW9uNClmU291cmNlVmlld2VyKS5hZGRUZXh0UHJlc2VudGF0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJZlNvdXJjZVZpZXdlci5hZGRUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQkJbWFuYWdlRG9jdW1lbnQoZlNvdXJjZVZpZXdlci5nZXREb2N1bWVudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmluc3RhbGwgdGhpcyBwcmVzZW50ZXIuCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlzZXRDYW5jZWxlZCh0cnVlKTsKLQotCQlpZiAoZlNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQlpZiAoZlNvdXJjZVZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNCkKLQkJCQkoKElUZXh0Vmlld2VyRXh0ZW5zaW9uNCkgZlNvdXJjZVZpZXdlcikuYWRkVGV4dFByZXNlbnRhdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJcmVsZWFzZURvY3VtZW50KGZTb3VyY2VWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlpbnZhbGlkYXRlVGV4dFByZXNlbnRhdGlvbigpOwotCQkJcmVzZXRTdGF0ZSgpOwotCi0JCQlmU291cmNlVmlld2VyLnJlbW92ZVRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCQkJZlNvdXJjZVZpZXdlcj0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEludmFsaWRhdGUgdGV4dCBwcmVzZW50YXRpb24gb2YgcG9zaXRpb25zIHdpdGggdGhlIGdpdmVuIGhpZ2hsaWdodGluZy4KLQkgKgotCSAqIEBwYXJhbSBoaWdobGlnaHRpbmcgVGhlIGhpZ2hsaWdodGluZwotCSAqLwotCXB1YmxpYyB2b2lkIGhpZ2hsaWdodGluZ1N0eWxlQ2hhbmdlZChIaWdobGlnaHRpbmdTdHlsZSBoaWdobGlnaHRpbmcpIHsKLQkJZm9yIChpbnQgaT0gMCwgbj0gZlBvc2l0aW9ucy5zaXplKCk7IGkgPCBuOyBpKyspIHsKLQkJCUhpZ2hsaWdodGVkUG9zaXRpb24gcG9zaXRpb249IChIaWdobGlnaHRlZFBvc2l0aW9uKSBmUG9zaXRpb25zLmdldChpKTsKLQkJCWlmIChwb3NpdGlvbi5nZXRIaWdobGlnaHRpbmcoKSA9PSBoaWdobGlnaHRpbmcgJiYgZlNvdXJjZVZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uMikKLQkJCQkoKElUZXh0Vmlld2VyRXh0ZW5zaW9uMikgZlNvdXJjZVZpZXdlcikuaW52YWxpZGF0ZVRleHRQcmVzZW50YXRpb24ocG9zaXRpb24uZ2V0T2Zmc2V0KCksIHBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQkJCWVsc2UKLQkJCQlmU291cmNlVmlld2VyLmludmFsaWRhdGVUZXh0UHJlc2VudGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnZhbGlkYXRlIHRleHQgcHJlc2VudGF0aW9uIG9mIGFsbCBwb3NpdGlvbnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGludmFsaWRhdGVUZXh0UHJlc2VudGF0aW9uKCkgewotCQlpZiAoZlNvdXJjZVZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uMikgewotCQkJZm9yIChpbnQgaSA9IDAsIG4gPSBmUG9zaXRpb25zLnNpemUoKTsgaSA8IG47IGkrKykgewotCQkJCVBvc2l0aW9uIHBvc2l0aW9uID0gKFBvc2l0aW9uKSBmUG9zaXRpb25zLmdldChpKTsKLQkJCQkoKElUZXh0Vmlld2VyRXh0ZW5zaW9uMikgZlNvdXJjZVZpZXdlcikuaW52YWxpZGF0ZVRleHRQcmVzZW50YXRpb24ocG9zaXRpb24uZ2V0T2Zmc2V0KCksIHBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWZTb3VyY2VWaWV3ZXIuaW52YWxpZGF0ZVRleHRQcmVzZW50YXRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBhIHBvc2l0aW9uIHdpdGggdGhlIGdpdmVuIHJhbmdlIGFuZCBoaWdobGlnaHRpbmcgdW5jb25kaXRpb25hbGx5LCBvbmx5IGZyb20gVUkgdGhyZWFkLgotCSAqIFRoZSBwb3NpdGlvbiB3aWxsIGFsc28gYmUgcmVnaXN0ZXJlZCBvbiB0aGUgZG9jdW1lbnQuIFRoZSB0ZXh0IHByZXNlbnRhdGlvbiBpcyBub3QgaW52YWxpZGF0ZWQuCi0JICoKLQkgKiBAcGFyYW0gdWlQb3NpdGlvbiB0aGUgaGlnaGxpZ2h0ZWQgcG9zaXRpb24gdG8gYWRkIGZyb20gdGhlIFVJCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFBvc2l0aW9uRnJvbVVJKEhpZ2hsaWdodGVkUG9zaXRpb24gdWlQb3NpdGlvbikgewotCQlQb3NpdGlvbiBwb3NpdGlvbj0gY3JlYXRlSGlnaGxpZ2h0ZWRQb3NpdGlvbih1aVBvc2l0aW9uLCB1aVBvc2l0aW9uLmdldEhpZ2hsaWdodGluZygpLCB1aVBvc2l0aW9uLmlzUmVhZE9ubHkoKSk7Ci0JCXN5bmNocm9uaXplZCAoZlBvc2l0aW9uTG9jaykgewotCQkJaW5zZXJ0UG9zaXRpb24ocG9zaXRpb24pOwotCQl9Ci0KLQkJSURvY3VtZW50IGRvY3VtZW50PSBmU291cmNlVmlld2VyLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgcG9zaXRpb25DYXRlZ29yeT0gZ2V0UG9zaXRpb25DYXRlZ29yeSgpOwotCQl0cnkgewotCQkJZG9jdW1lbnQuYWRkUG9zaXRpb24ocG9zaXRpb25DYXRlZ29yeSwgcG9zaXRpb24pOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTaG91bGQgbm90IGhhcHBlbgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTaG91bGQgbm90IGhhcHBlbgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc2V0IHRvIGluaXRpYWwgc3RhdGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0U3RhdGUoKSB7Ci0JCXN5bmNocm9uaXplZCAoZlBvc2l0aW9uTG9jaykgewotCQkJZlBvc2l0aW9ucy5jbGVhcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RhcnQgbWFuYWdpbmcgdGhlIGdpdmVuIGRvY3VtZW50LgotCSAqCi0JICogQHBhcmFtIGRvY3VtZW50IFRoZSBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBtYW5hZ2VEb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCWRvY3VtZW50LmFkZFBvc2l0aW9uQ2F0ZWdvcnkoZ2V0UG9zaXRpb25DYXRlZ29yeSgpKTsKLQkJCWRvY3VtZW50LmFkZFBvc2l0aW9uVXBkYXRlcihmUG9zaXRpb25VcGRhdGVyKTsKLQkJCWRvY3VtZW50LmFkZERvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIG1hbmFnaW5nIHRoZSBnaXZlbiBkb2N1bWVudC4KLQkgKgotCSAqIEBwYXJhbSBkb2N1bWVudCBUaGUgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVsZWFzZURvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJZG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQkJCWRvY3VtZW50LnJlbW92ZVBvc2l0aW9uVXBkYXRlcihmUG9zaXRpb25VcGRhdGVyKTsKLQkJCXRyeSB7Ci0JCQkJZG9jdW1lbnQucmVtb3ZlUG9zaXRpb25DYXRlZ29yeShnZXRQb3NpdGlvbkNhdGVnb3J5KCkpOwotCQkJfSBjYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gU2hvdWxkIG5vdCBoYXBwZW4KLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBUaGUgc2VtYW50aWMgcmVjb25jaWxlciBwb3NpdGlvbidzIGNhdGVnb3J5LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFBvc2l0aW9uQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiB0b1N0cmluZygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRqdXN0Rm9yZWdyb3VuZChTdHlsZVJhbmdlIHN0eWxlUmFuZ2UpIHsKLQkJUkdCIG9sZFJHQiA9IG51bGw7Ci0JCS8vIENvbG9yIG9sZENvbG9yID0gc3R5bGVSYW5nZS5mb3JlZ3JvdW5kOwotCQlDb2xvciBvbGRDb2xvciA9IHN0eWxlUmFuZ2UuYmFja2dyb3VuZDsKLQkJaWYgKG9sZENvbG9yID09IG51bGwpIHsKLQkJCS8vIG9sZFJHQiA9IGdldFRleHRXaWRnZXQoKS5nZXRGb3JlZ3JvdW5kKCkuZ2V0UkdCKCk7Ci0JCQlvbGRDb2xvciA9IGZTb3VyY2VWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldEJhY2tncm91bmQoKTsKLQkJCW9sZFJHQiA9IG9sZENvbG9yLmdldFJHQigpOwotCQl9Ci0JCWVsc2UgewotCQkJb2xkUkdCID0gb2xkQ29sb3IuZ2V0UkdCKCk7Ci0JCX0KLQkJQ29sb3IgbmV3Q29sb3IgPSBnZXRDYWNoZWRDb2xvckZvcihvbGRSR0IpOwotCQlpZiAobmV3Q29sb3IgPT0gbnVsbCkgewotCQkJLy8gbWFrZSB0ZXh0ICJjbG9zZXIgdG8iIGJhY2tncm91bmQgbHVtYW5lbmNlCi0JCQlkb3VibGUgdGFyZ2V0ID0gZ2V0UkdCQ29udmVydGVyKCkuY2FsY3VsYXRlWUNvbXBvbmVudChvbGRDb2xvcik7Ci0JCQlSR0IgbmV3UkdCID0gZ2V0UkdCQ29udmVydGVyKCkudHJhbnNmb3JtUkdCVG9HcmV5KG9sZFJHQiwgcmVhZE9ubHlGb3JlZ3JvdW5kU2NhbGVGYWN0b3IgLyAxMDAuMCwgdGFyZ2V0KTsKLQotCQkJLy8gc2F2ZSBjb252ZXJzaW9uLCBzbyBjYWxjdWxhdGlvbnMgb25seSBuZWVkIHRvIGJlIGRvbmUgb25jZQotCQkJY2FjaGVDb2xvcihvbGRSR0IsIG5ld1JHQik7Ci0JCQluZXdDb2xvciA9IGdldENhY2hlZENvbG9yRm9yKG9sZFJHQik7Ci0JCX0KLQkJc3R5bGVSYW5nZS5mb3JlZ3JvdW5kID0gbmV3Q29sb3I7Ci0JfQotCi0JcHJpdmF0ZSBZVVZfUkdCQ29udmVydGVyIGdldFJHQkNvbnZlcnRlcigpIHsKLQkJaWYgKHJnYkNvbnZlcnRlciA9PSBudWxsKSB7Ci0JCQlyZ2JDb252ZXJ0ZXIgPSBuZXcgWVVWX1JHQkNvbnZlcnRlcigpOwotCQl9Ci0JCXJldHVybiByZ2JDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogQ2FjaGUgcmVhZC1vbmx5IGNvbG9yLgotCSAqIAotCSAqIEBwYXJhbSBvbGRSR0IKLQkgKiBAcGFyYW0gbmV3Q29sb3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FjaGVDb2xvcihSR0Igb2xkUkdCLCBSR0IgbmV3Q29sb3IpIHsKLQkJaWYgKHJlYWRPbmx5Q29sb3JUYWJsZSA9PSBudWxsKSB7Ci0JCQlyZWFkT25seUNvbG9yVGFibGUgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJlYWRPbmx5Q29sb3JUYWJsZS5wdXQob2xkUkdCLCBuZXdDb2xvcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMganVzdCB0byBnZXQgZXhpc3RpbmcgcmVhZC1vbmx5IGNvbG9ycy4KLQkgKi8KLQlwcml2YXRlIENvbG9yIGdldENhY2hlZENvbG9yRm9yKFJHQiBvbGRSR0IpIHsKLQkJQ29sb3IgcmVzdWx0ID0gbnVsbDsKLQkKLQkJaWYgKHJlYWRPbmx5Q29sb3JUYWJsZSAhPSBudWxsKSB7Ci0JCQlSR0IgcmVhZE9ubHlSR0IgPSAoUkdCKSByZWFkT25seUNvbG9yVGFibGUuZ2V0KG9sZFJHQik7Ci0JCQlyZXN1bHQgPSBFZGl0b3JVdGlsaXR5LmdldENvbG9yKHJlYWRPbmx5UkdCKTsKLQkJfQotCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBBIHV0aWxpdHkgY2xhc3MgdG8gZG8gdmFyaW91cyBjb2xvciBtYW5pcHVsYXRpb25zCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBZVVZfUkdCQ29udmVydGVyIHsKLQkJLyoqCi0JCSAqIFRoaXMgY2xhc3MgImhvbGRzIiB0aGUgWVVWIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIFJHQiBjb2xvcgotCQkgKi8KLQkJcHJpdmF0ZSBjbGFzcyBZVVYgewotCi0JCQljbGFzcyBOb3JtYWxpemVkUkdCIHsKLQkJCQlkb3VibGUgYmx1ZTsKLQkJCQlkb3VibGUgZ3JlZW47Ci0JCQkJcHJpdmF0ZSBmaW5hbCBkb3VibGUgbWF4UkdCID0gMjU2LjA7Ci0JCQkJZG91YmxlIHJlZDsKLQotCQkJCXB1YmxpYyBOb3JtYWxpemVkUkdCKFJHQiByZ2IpIHsKLQkJCQkJLy8gZmlyc3Qgbm9ybWFsaXplIHRvIGJldHdlZW4gMCAtIDEKLQkJCQkJcmVkID0gcmdiLnJlZCAvIG1heFJHQjsKLQkJCQkJZ3JlZW4gPSByZ2IuZ3JlZW4gLyBtYXhSR0I7Ci0JCQkJCWJsdWUgPSByZ2IuYmx1ZSAvIG1heFJHQjsKLQotCQkJCQlyZWQgPSBnYW1tYU5vcm1hbGl6ZWQocmVkKTsKLQkJCQkJZ3JlZW4gPSBnYW1tYU5vcm1hbGl6ZWQoZ3JlZW4pOwotCQkJCQlibHVlID0gZ2FtbWFOb3JtYWxpemVkKGJsdWUpOwotCi0JCQkJfQotCQkJfQotCi0JCQlwcml2YXRlIE5vcm1hbGl6ZWRSR0Igbm9ybWFsaXplZFJHQjsKLQotCQkJcHJpdmF0ZSBkb3VibGUgdSA9IC0xOwotCQkJcHJpdmF0ZSBkb3VibGUgdiA9IC0xOwotCQkJcHJpdmF0ZSBkb3VibGUgeSA9IC0xOwotCi0JCQlwcml2YXRlIFlVVigpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCi0JCQlwdWJsaWMgWVVWKFJHQiByZ2IpIHsKLQkJCQl0aGlzKCk7Ci0JCQkJbm9ybWFsaXplZFJHQiA9IG5ldyBOb3JtYWxpemVkUkdCKHJnYik7Ci0JCQkJLy8gZm9yY2UgY2FsY3VsYXRpb25zCi0JCQkJZ2V0WSgpOwotCQkJCWdldFYoKTsKLQkJCQlnZXRVKCk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogbm9ybWFsaXplIHRvICJhdmVyYWdlIiBnYW1tYSAyLjIyMjIgb3IgMS8wLjQ1Ci0JCQkgKi8KLQkJCWRvdWJsZSBnYW1tYU5vcm1hbGl6ZWQoZG91YmxlIGNvbG9yQ29tcG9uZW50KSB7Ci0JCQkJaWYgKGNvbG9yQ29tcG9uZW50IDwgMC4wMTgpIHsKLQkJCQkJcmV0dXJuIGNvbG9yQ29tcG9uZW50ICogMC40NTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiAxLjA5OSAqIE1hdGgucG93KGNvbG9yQ29tcG9uZW50LCAwLjQ1KSAtIDAuMDk5OwotCQkJCX0KLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAcmV0dXJuIFJHQiBiYXNlZCBvbiBvcmlnaW5hbCBSR0IgYW5kIGN1cnJlbnQgWVVWIHZhbHVlczsKLQkJCSAqLwotCi0JCQlwdWJsaWMgZG91YmxlIGdldFUoKSB7Ci0JCQkJaWYgKHUgPT0gLTEpIHsKLQkJCQkJdSA9IDAuNDk0OSAqIChub3JtYWxpemVkUkdCLmJsdWUgLSBnZXRZKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gdTsKLQotCQkJfQotCi0JCQlwdWJsaWMgZG91YmxlIGdldFYoKSB7Ci0JCQkJaWYgKHYgPT0gLTEpIHsKLQkJCQkJdiA9IDAuODc3ICogKG5vcm1hbGl6ZWRSR0IucmVkIC0gZ2V0WSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHY7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBkb3VibGUgZ2V0WSgpIHsKLQkJCQlpZiAoeSA9PSAtMSkgewotCQkJCQl5ID0gMC4yOTkgKiBub3JtYWxpemVkUkdCLnJlZCArIDAuNTg3ICogbm9ybWFsaXplZFJHQi5ncmVlbiArIDAuMTE0ICogbm9ybWFsaXplZFJHQi5ibHVlOwotCQkJCX0KLQkJCQlyZXR1cm4geTsKLQkJCX0KLQotCQl9Ci0KLQkJcHVibGljIFlVVl9SR0JDb252ZXJ0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGRvdWJsZSBjYWxjdWxhdGVZQ29tcG9uZW50KENvbG9yIHRhcmdldENvbG9yKSB7Ci0JCQlyZXR1cm4gbmV3IFlVVih0YXJnZXRDb2xvci5nZXRSR0IoKSkuZ2V0WSgpOwotCQl9Ci0KLQkJcHVibGljIFJHQiB0cmFuc2Zvcm1SR0JUb0dyZXkoUkdCIG9yaWdpbmFsUkdCLCBkb3VibGUgc2NhbGVGYWN0b3IsIGRvdWJsZSB0YXJnZXQpIHsKLQkJCVJHQiB0cmFuc2Zvcm1lZFJHQiA9IG51bGw7Ci0JCQkvLyB3ZSBsZWZ0IHRoZSAiZnVsbCIgQVBJIG1ldGhvZCBzaWduYXR1cmUsIGJ1dCB0aGlzCi0JCQkvLyB2ZXJzaW9uIGRvZXMgbm90IHRha2UgaW50byBhY2NvdW50IG9yaWdpbmFsUkdCLCB0aG91Z2gKLQkJCS8vIGl0IG1pZ2h0IHNvbWVkYXkuCi0JCQkvLyBmb3Igbm93LCB3ZSdsbCBzaW1wbHkgbWFrZSB0aGUgbmV3IFJHQiBncmV5LCBlaXRoZXIgYSBsaXR0bGUKLQkJCS8vIGxpZ2h0ZXIsIG9yIGEgbGl0dGxlIGRhcmtlciB0aGFuIGJhY2tncm91bmQuCi0JCQlkb3VibGUgeSA9IDA7Ci0JCQlkb3VibGUgbWlkID0gMC41OwotCQkJLy8gemVybyBpcyBibGFjaywgb25lIGlzIHdoaXRlCi0JCQlpZiAodGFyZ2V0IDwgbWlkKSB7Ci0JCQkJLy8gaXMgImRhcmsiIG1ha2UgbGlnaHRlcgotCQkJCXkgPSB0YXJnZXQgKyBzY2FsZUZhY3RvcjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGlzICJsaWdodCIgbWFrZSBkYXJrZXIKLQkJCQl5ID0gdGFyZ2V0IC0gc2NhbGVGYWN0b3I7Ci0JCQl9Ci0JCQlpbnQgYyA9IChpbnQpIE1hdGgucm91bmQoeSAqIDI1NSk7Ci0JCQkvLyBqdXN0IHRvIGdhdXJkIGFnYWluc3QgbWlzLXVzZSwgb3Igc2NhbGUncyB2YWx1ZXMgZ3JlYXRlcgotCQkJLy8gdGhhbiBtaWQgcG9pbnQgKGFuZCBwb3NzaWJseSByb3VuZGluZyBlcnJvcikKLQkJCWlmIChjID4gMjU1KQotCQkJCWMgPSAyNTU7Ci0JCQlpZiAoYyA8IDApCi0JCQkJYyA9IDA7Ci0JCQl0cmFuc2Zvcm1lZFJHQiA9IG5ldyBSR0IoYywgYywgYyk7Ci0JCQlyZXR1cm4gdHJhbnNmb3JtZWRSR0I7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc3R5bGUvU2VtYW50aWNIaWdobGlnaHRpbmdSZWNvbmNpbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc3R5bGUvU2VtYW50aWNIaWdobGlnaHRpbmdSZWNvbmNpbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNDkxNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3N0eWxlL1NlbWFudGljSGlnaGxpZ2h0aW5nUmVjb25jaWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zdHlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLk1vZGVsTWFuYWdlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuSVNlbWFudGljSGlnaGxpZ2h0aW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuSVNlbWFudGljSGlnaGxpZ2h0aW5nRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc3R5bGUuU2VtYW50aWNIaWdobGlnaHRpbmdNYW5hZ2VyLkhpZ2hsaWdodGVkUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zdHlsZS5TZW1hbnRpY0hpZ2hsaWdodGluZ01hbmFnZXIuSGlnaGxpZ2h0aW5nU3R5bGU7Ci0KLS8qKgotICogU2VtYW50aWMgaGlnaGxpZ2h0aW5nIHJlY29uY2lsZXIgZm9yIFN0cnVjdHVyZWQgU291cmNlIEVkaXRvcnMuIEJhc2VkIG9uIAotICogb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmphdmFlZGl0b3IuU2VtYW50aWNIaWdobGlnaHRpbmdSZWNvbmNpbGVyCi0gKgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgU2VtYW50aWNIaWdobGlnaHRpbmdSZWNvbmNpbGVyIGltcGxlbWVudHMgSVJlY29uY2lsaW5nU3RyYXRlZ3ksIElSZWNvbmNpbGluZ1N0cmF0ZWd5RXh0ZW5zaW9uIHsKLQotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQotCXByaXZhdGUgSVRleHRWaWV3ZXIgZlZpZXdlcjsKLQlwcml2YXRlIFNlbWFudGljSGlnaGxpZ2h0aW5nUHJlc2VudGVyIGZQcmVzZW50ZXI7Ci0JcHJpdmF0ZSBJU2VtYW50aWNIaWdobGlnaHRpbmdbXSBmU2VtYW50aWNIaWdobGlnaHRpbmdzOwotCXByaXZhdGUgSGlnaGxpZ2h0aW5nU3R5bGVbXSBmSGlnaGxpZ2h0aW5nczsKLQotCXByaXZhdGUgTGlzdCBmQWRkZWRQb3NpdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBMaXN0IGZSZW1vdmVkUG9zaXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCS8qKiBOdW1iZXIgb2YgcmVtb3ZlZCBwb3NpdGlvbnMgKi8KLQlwcml2YXRlIGludCBmTk9mUmVtb3ZlZFBvc2l0aW9uczsKLQkKLQkvKiogQmFja2dyb3VuZCBqb2IgKi8KLQlwcml2YXRlIEpvYiBmSm9iOwotCS8qKiBCYWNrZ3JvdW5kIGpvYiBsb2NrICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgZkpvYkxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0JCi0JLyoqIFJlY29uY2lsZSBvcGVyYXRpb24gbG9jay4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBmUmVjb25jaWxlTG9jayA9IG5ldyBPYmplY3QoKTsKLQlwcml2YXRlIGJvb2xlYW4gZklzUmVjb25jaWxpbmcgPSBmYWxzZTsKLQkvKiogVGhlIHNlbWFudGljIGhpZ2hsaWdodGluZyBwcmVzZW50ZXIgLSBjYWNoZSBmb3IgYmFja2dyb3VuZCB0aHJlYWQsIG9ubHkgdmFsaWQgZHVyaW5nIHtAbGluayAjcmVjb25jaWxlKElSZWdpb24pfSAqLwotCXByaXZhdGUgU2VtYW50aWNIaWdobGlnaHRpbmdQcmVzZW50ZXIgZkpvYlByZXNlbnRlcjsKLQkvKiogU2VtYW50aWMgaGlnaGxpZ2h0aW5ncyAtIGNhY2hlIGZvciBiYWNrZ3JvdW5kIHRocmVhZCwgb25seSB2YWxpZCBkdXJpbmcge0BsaW5rICNyZWNvbmNpbGUoSVJlZ2lvbil9ICovCi0JcHJpdmF0ZSBJU2VtYW50aWNIaWdobGlnaHRpbmdbXSBmSm9iU2VtYW50aWNIaWdobGlnaHRpbmdzOwotCS8qKiBIaWdobGlnaHRpbmdTdHlsZSAtIGNhY2hlIGZvciBiYWNrZ3JvdW5kIHRocmVhZCwgb25seSB2YWxpZCBkdXJpbmcge0BsaW5rICNyZWNvbmNpbGUoSVJlZ2lvbil9ICovCi0JcHJpdmF0ZSBIaWdobGlnaHRpbmdTdHlsZVtdIGZKb2JIaWdobGlnaHRpbmdzOwotCi0JcHJpdmF0ZSBib29sZWFuIGZJc0luc3RhbGxlZDsKLQotCXB1YmxpYyB2b2lkIGluc3RhbGwoSVRleHRWaWV3ZXIgc291cmNlVmlld2VyLCBTZW1hbnRpY0hpZ2hsaWdodGluZ1ByZXNlbnRlciBwcmVzZW50ZXIsIElTZW1hbnRpY0hpZ2hsaWdodGluZ1tdIHNlbWFudGljSGlnaGxpZ2h0aW5ncywgSGlnaGxpZ2h0aW5nU3R5bGVbXSBoaWdobGlnaHRpbmdzKSB7Ci0JCWZWaWV3ZXIgPSBzb3VyY2VWaWV3ZXI7Ci0JCWZQcmVzZW50ZXIgPSBwcmVzZW50ZXI7Ci0JCWZTZW1hbnRpY0hpZ2hsaWdodGluZ3MgPSBzZW1hbnRpY0hpZ2hsaWdodGluZ3M7Ci0JCWZIaWdobGlnaHRpbmdzID0gaGlnaGxpZ2h0aW5nczsKLQkJZklzSW5zdGFsbGVkID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCWZJc0luc3RhbGxlZCA9IGZhbHNlOwotCQlmVmlld2VyID0gbnVsbDsKLQkJZlByZXNlbnRlciA9IG51bGw7Ci0JCWZTZW1hbnRpY0hpZ2hsaWdodGluZ3MgPSBudWxsOwotCQlmSGlnaGxpZ2h0aW5ncyA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVjb25jaWxlKElSZWdpb24gcGFydGl0aW9uKSB7Ci0JCS8vIGVuc3VyZSBhdCBtb3N0IG9uZSB0aHJlYWQgY2FuIGJlIHJlY29uY2lsaW5nIGF0IGFueSB0aW1lCi0JCXN5bmNocm9uaXplZCAoZlJlY29uY2lsZUxvY2spIHsKLQkJCWlmIChmSXNSZWNvbmNpbGluZykKLQkJCQlyZXR1cm47Ci0JCQllbHNlCi0JCQkJZklzUmVjb25jaWxpbmc9IHRydWU7Ci0JCX0KLQkJZkpvYlByZXNlbnRlciA9IGZQcmVzZW50ZXI7Ci0JCWZKb2JTZW1hbnRpY0hpZ2hsaWdodGluZ3MgPSBmU2VtYW50aWNIaWdobGlnaHRpbmdzOwotCQlmSm9iSGlnaGxpZ2h0aW5ncyA9IGZIaWdobGlnaHRpbmdzOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChmSm9iUHJlc2VudGVyID09IG51bGwgfHwgZkpvYlNlbWFudGljSGlnaGxpZ2h0aW5ncyA9PSBudWxsIHx8IGZKb2JIaWdobGlnaHRpbmdzID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlmSm9iUHJlc2VudGVyLnNldENhbmNlbGVkKGZhbHNlKTsKLQkJCi0JCQlzdGFydFJlY29uY2lsaW5nUG9zaXRpb25zKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudDsKLQkJCW1vZGVsID0gTW9kZWxNYW5hZ2VySW1wbC5nZXRJbnN0YW5jZSgpLmdldE1vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gcmVnaW9ucyA9IGRvY3VtZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMocGFydGl0aW9uLmdldE9mZnNldCgpLCBwYXJ0aXRpb24uZ2V0TGVuZ3RoKCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aCAmJiBmSXNJbnN0YWxsZWQ7IGkrKykgewotCQkJCWlmIChkb2N1bWVudC5jb250YWluc1JlYWRPbmx5KHJlZ2lvbnNbaV0uZ2V0U3RhcnRPZmZzZXQoKSwgcmVnaW9uc1tpXS5nZXRMZW5ndGgoKSkpCi0JCQkJCWFkZFBvc2l0aW9uKG5ldyBQb3NpdGlvbihyZWdpb25zW2ldLmdldFN0YXJ0T2Zmc2V0KCksIHJlZ2lvbnNbaV0uZ2V0TGVuZ3RoKCkpLCBudWxsLCB0cnVlKTsKLQkJCQllbHNlIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmSm9iU2VtYW50aWNIaWdobGlnaHRpbmdzLmxlbmd0aCAmJiBmSXNJbnN0YWxsZWQ7IGorKykgewotCQkJCQkJaWYgKGZKb2JIaWdobGlnaHRpbmdzW2pdLmlzRW5hYmxlZCgpKSB7Ci0JCQkJCQkJUG9zaXRpb25bXSBjb25zdW1lcyA9IG51bGw7Ci0JCQkJCQkJaWYgKGZKb2JTZW1hbnRpY0hpZ2hsaWdodGluZ3Nbal0gaW5zdGFuY2VvZiBJU2VtYW50aWNIaWdobGlnaHRpbmdFeHRlbnNpb24gJiYgbW9kZWwgIT0gbnVsbCkgewotCQkJCQkJCQljb25zdW1lcyA9ICgoSVNlbWFudGljSGlnaGxpZ2h0aW5nRXh0ZW5zaW9uKSBmSm9iU2VtYW50aWNIaWdobGlnaHRpbmdzW2pdKS5jb25zdW1lcyhyZWdpb25zW2ldLCBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHJlZ2lvbnNbaV0uZ2V0U3RhcnRPZmZzZXQoKSkpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJY29uc3VtZXMgPSBmSm9iU2VtYW50aWNIaWdobGlnaHRpbmdzW2pdLmNvbnN1bWVzKHJlZ2lvbnNbaV0pOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoY29uc3VtZXMgIT0gbnVsbCkgewotCQkJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGNvbnN1bWVzLmxlbmd0aDsgaysrKQotCQkJCQkJCQkJYWRkUG9zaXRpb24oY29uc3VtZXNba10sIGZKb2JIaWdobGlnaHRpbmdzW2pdKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChmSXNJbnN0YWxsZWQpIHsKLQkJCQlMaXN0IG9sZFBvc2l0aW9ucyA9IGZSZW1vdmVkUG9zaXRpb25zOwotCQkJCUxpc3QgbmV3UG9zaXRpb25zID0gbmV3IEFycmF5TGlzdChmTk9mUmVtb3ZlZFBvc2l0aW9ucyk7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIG4gPSBvbGRQb3NpdGlvbnMuc2l6ZSgpOyBpIDwgbiAmJiBmSXNJbnN0YWxsZWQ7IGkrKykgewotCQkJCQlPYmplY3QgY3VycmVudCA9IG9sZFBvc2l0aW9ucy5nZXQoaSk7Ci0JCQkJCWlmIChjdXJyZW50ICE9IG51bGwpCi0JCQkJCQluZXdQb3NpdGlvbnMuYWRkKGN1cnJlbnQpOwotCQkJCX0KLQkJCQlmUmVtb3ZlZFBvc2l0aW9ucyA9IG5ld1Bvc2l0aW9uczsKLQkJCQkKLQkJCQlUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbiA9IG51bGw7Ci0JCQkJaWYgKCFmSm9iUHJlc2VudGVyLmlzQ2FuY2VsZWQoKSkKLQkJCQkJcHJlc2VudGF0aW9uID0gZkpvYlByZXNlbnRlci5jcmVhdGVQcmVzZW50YXRpb24oZkFkZGVkUG9zaXRpb25zLCBmUmVtb3ZlZFBvc2l0aW9ucyk7Ci0JCQkJaWYgKCFmSm9iUHJlc2VudGVyLmlzQ2FuY2VsZWQoKSkKLQkJCQkJdXBkYXRlUHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbiwgZkFkZGVkUG9zaXRpb25zLCBmUmVtb3ZlZFBvc2l0aW9ucyk7Ci0JCQl9Ci0JCQlzdG9wUmVjb25jaWxpbmdQb3NpdGlvbnMoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWZKb2JQcmVzZW50ZXI9IG51bGw7Ci0JCQlmSm9iU2VtYW50aWNIaWdobGlnaHRpbmdzPSBudWxsOwotCQkJZkpvYkhpZ2hsaWdodGluZ3M9IG51bGw7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCXN5bmNocm9uaXplZCAoZlJlY29uY2lsZUxvY2spIHsKLQkJCQlmSXNSZWNvbmNpbGluZz0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUG9zaXRpb24oUG9zaXRpb24gcG9zaXRpb24sIEhpZ2hsaWdodGluZ1N0eWxlIGhpZ2hsaWdodGluZykgewotCQlhZGRQb3NpdGlvbihwb3NpdGlvbiwgaGlnaGxpZ2h0aW5nLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uLCBIaWdobGlnaHRpbmdTdHlsZSBoaWdobGlnaHRpbmcsIGJvb2xlYW4gaXNSZWFkT25seSkgewotCQlib29sZWFuIGlzRXhpc3RpbmcgPSBmYWxzZTsKLQkJLy8gVE9ETzogdXNlIGJpbmFyeSBzZWFyY2gKLQkJZm9yIChpbnQgaSA9IDAsIG4gPSBmUmVtb3ZlZFBvc2l0aW9ucy5zaXplKCk7IGkgPCBuOyBpKyspIHsKLQkJCUhpZ2hsaWdodGVkUG9zaXRpb24gaGlnaGxpZ2h0ZWRQb3NpdGlvbiA9IChIaWdobGlnaHRlZFBvc2l0aW9uKSBmUmVtb3ZlZFBvc2l0aW9ucy5nZXQoaSk7Ci0JCQlpZiAoaGlnaGxpZ2h0ZWRQb3NpdGlvbiA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGhpZ2hsaWdodGVkUG9zaXRpb24uaXNFcXVhbChwb3NpdGlvbiwgaGlnaGxpZ2h0aW5nKSkgewotCQkJCWlzRXhpc3RpbmcgPSB0cnVlOwotCQkJCWZSZW1vdmVkUG9zaXRpb25zLnNldChpLCBudWxsKTsKLQkJCQlmTk9mUmVtb3ZlZFBvc2l0aW9ucy0tOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghaXNFeGlzdGluZykgewotCQkJZkFkZGVkUG9zaXRpb25zLmFkZChmSm9iUHJlc2VudGVyLmNyZWF0ZUhpZ2hsaWdodGVkUG9zaXRpb24ocG9zaXRpb24sIGhpZ2hsaWdodGluZywgaXNSZWFkT25seSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBwcmVzZW50YXRpb24uCi0JICogCi0JICogQHBhcmFtIHRleHRQcmVzZW50YXRpb24KLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHByZXNlbnRhdGlvbgotCSAqIEBwYXJhbSBhZGRlZFBvc2l0aW9ucwotCSAqICAgICAgICAgICAgdGhlIGFkZGVkIHBvc2l0aW9ucwotCSAqIEBwYXJhbSByZW1vdmVkUG9zaXRpb25zCi0JICogICAgICAgICAgICB0aGUgcmVtb3ZlZCBwb3NpdGlvbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlUHJlc2VudGF0aW9uKFRleHRQcmVzZW50YXRpb24gdGV4dFByZXNlbnRhdGlvbiwgTGlzdCBhZGRlZFBvc2l0aW9ucywgTGlzdCByZW1vdmVkUG9zaXRpb25zKSB7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gZkpvYlByZXNlbnRlci5jcmVhdGVVcGRhdGVSdW5uYWJsZSh0ZXh0UHJlc2VudGF0aW9uLCBhZGRlZFBvc2l0aW9ucywgcmVtb3ZlZFBvc2l0aW9ucyk7Ci0JCWlmIChydW5uYWJsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChmVmlld2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQ29udHJvbCB2aWV3ZXJDb250cm9sID0gZlZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh2aWV3ZXJDb250cm9sID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJRGlzcGxheSBkaXNwbGF5ID0gdmlld2VyQ29udHJvbC5nZXREaXNwbGF5KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwgfHwgZGlzcGxheS5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQkJZGlzcGxheS5hc3luY0V4ZWMocnVubmFibGUpOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0IHJlY29uY2lsaW5nIHBvc2l0aW9ucy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RhcnRSZWNvbmNpbGluZ1Bvc2l0aW9ucygpIHsKLQkJZkpvYlByZXNlbnRlci5hZGRBbGxQb3NpdGlvbnMoZlJlbW92ZWRQb3NpdGlvbnMpOwotCQlmTk9mUmVtb3ZlZFBvc2l0aW9ucyA9IGZSZW1vdmVkUG9zaXRpb25zLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIHJlY29uY2lsaW5nIHBvc2l0aW9ucy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcFJlY29uY2lsaW5nUG9zaXRpb25zKCkgewotCQlmUmVtb3ZlZFBvc2l0aW9ucy5jbGVhcigpOwotCQlmTk9mUmVtb3ZlZFBvc2l0aW9ucyA9IDA7Ci0JCWZBZGRlZFBvc2l0aW9ucy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlY29uY2lsZShEaXJ0eVJlZ2lvbiBkaXJ0eVJlZ2lvbiwgSVJlZ2lvbiBzdWJSZWdpb24pIHsKLQkJcmVjb25jaWxlKGRpcnR5UmVnaW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0vLwkJcmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxSZWNvbmNpbGUoKSB7Ci0JCS8vIERvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JfQotCQotCS8qKgotCSAqIFNjaGVkdWxlIGEgYmFja2dyb3VuZCBqb2IgZm9yIHJlY29uY2lsaW5nIHRoZSBTZW1hbnRpYyBIaWdobGlnaHRpbmcgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNjaGVkdWxlSm9iKCkgewotCQlzeW5jaHJvbml6ZWQgKGZKb2JMb2NrKSB7Ci0JCQlmaW5hbCBKb2Igb2xkSm9iPSBmSm9iOwotCQkJaWYgKGZKb2IgIT0gbnVsbCkgewotCQkJCWZKb2IuY2FuY2VsKCk7Ci0JCQkJZkpvYj0gbnVsbDsKLQkJCX0KLQotCQkJZkpvYj0gbmV3IEpvYigiU2VtYW50aWMgSGlnaGxpZ2h0aW5nIEpvYiIpIHsKLQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCWlmIChvbGRKb2IgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlvbGRKb2Iuam9pbigpOwotCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQotCQkJCQlyZWNvbmNpbGUobmV3IFJlZ2lvbigwLCBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJc3luY2hyb25pemVkIChmSm9iTG9jaykgewotCQkJCQkJLy8gYWxsb3cgdGhlIGpvYiB0byBiZSBnYydlZAotCQkJCQkJaWYgKGZKb2IgPT0gdGhpcykKLQkJCQkJCQlmSm9iPSBudWxsOwotCQkJCQl9Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkJCX07Ci0JCQlmSm9iLnNldFN5c3RlbSh0cnVlKTsKLQkJCWZKb2Iuc2V0UHJpb3JpdHkoSm9iLkRFQ09SQVRFKTsKLQkJCWZKb2Iuc2NoZWR1bGUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkKLQkJCXNjaGVkdWxlSm9iKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vQWJzdHJhY3RIb3ZlclByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vQWJzdHJhY3RIb3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjMzMDYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL0Fic3RyYWN0SG92ZXJQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0SW5mb3JtYXRpb25Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRWRpdG9yc1VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVyaXZlZC5IVE1MVGV4dFByZXNlbnRlcjsKLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3IgcHJvdmlkaW5nIGhvdmVyIGluZm9ybWF0aW9uIGZvciBTb3VyY2UgZWRpdG9yLiBJbmNsdWRlcwotICogYSBob3ZlciBjb250cm9sIGNyZWF0b3Igd2hpY2ggaGFzIHRoZSAiUHJlc3MgRjIgZm9yIGZvY3VzIiBtZXNzYWdlIGJ1aWx0Ci0gKiBpbi4KLSAqIAotICogQHNpbmNlIFdUUCAxLjUKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0SG92ZXJQcm9jZXNzb3IgaW1wbGVtZW50cyBJVGV4dEhvdmVyLCBJVGV4dEhvdmVyRXh0ZW5zaW9uIHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlckV4dGVuc2lvbiNnZXRIb3ZlckNvbnRyb2xDcmVhdG9yKCkKLQkgKi8KLQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgZ2V0SG92ZXJDb250cm9sQ3JlYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpIHsKLQkJCXB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sIGNyZWF0ZUluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQpIHsKLQkJCQlyZXR1cm4gbmV3IERlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2wocGFyZW50LCBTV1QuTk9ORSwgbmV3IEhUTUxUZXh0UHJlc2VudGVyKHRydWUpLCBFZGl0b3JzVUkuZ2V0VG9vbHRpcEFmZm9yZGFuY2VTdHJpbmcoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwODJjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRWRpdG9yc1VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQW5ub3RhdGlvblByZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5DaGFpbmVkUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklUZW1wb3JhcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi0vKioKLSAqIEhvdmVyIGhlbHAgdGhhdCBkaXNwbGF5cyBhbm5vdGF0aW9ucyBzaG93biBpbiB0ZXh0IG9mIGVkaXRvci4gQ3VycmVudGx5LAotICogdGhpcyB0ZXh0IGhvdmVyIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBBYnN0cmFjdFRleHRIb3ZlclByb2Nlc3Nvci4KLSAqIAotICogQGF1dGhvciBhbXl3dQotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RIb3ZlclByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExJU1RfQkVHSU4gPSAiPHVsPiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTElTVF9FTEVNRU5UID0gIjxsaT4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkFHUkFQSF9FTkQgPSAiPC9wPiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSQUdSQVBIX1NUQVJUID0gIjxwPiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmUHJlZmVyZW5jZVN0b3JlID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0cyBhIG1zZyB0byBhIHByb3BlciBodG1sIG1lc3NhZ2UKLQkgKiAKLQkgKiBAcGFyYW0gbXNnIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbXNnIGlzIG5laXRoZXIgbnVsbCBub3IgZW1wdHkgc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZvcm1hdE1lc3NhZ2UoU3RyaW5nIG1zZykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKFBBUkFHUkFQSF9TVEFSVCk7Ci0JCWJ1Zi5hcHBlbmQoU3RyaW5nVXRpbHMuY29udmVydFRvSFRNTENvbnRlbnQobXNnKSk7Ci0JCWJ1Zi5hcHBlbmQoUEFSQUdSQVBIX0VORCk7Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIG11bHRpcGxlIG1lc3NhZ2VzIGludG8gcHJvcGVyIGh0bWwgbWVzc2FnZQotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmb3JtYXRNZXNzYWdlcyhMaXN0IG1lc3NhZ2VzKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoUEFSQUdSQVBIX1NUQVJUKTsKLQkJYnVmZmVyLmFwcGVuZChTU0VVSU1lc3NhZ2VzLk11bHRpcGxlX2Vycm9ycyk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChMSVNUX0JFR0lOKTsKLQotCQlJdGVyYXRvciBlID0gbWVzc2FnZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKExJU1RfRUxFTUVOVCk7Ci0JCQlidWZmZXIuYXBwZW5kKFN0cmluZ1V0aWxzLmNvbnZlcnRUb0hUTUxDb250ZW50KChTdHJpbmcpIGUubmV4dCgpKSk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZChQQVJBR1JBUEhfRU5EKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFubm90YXRpb24gcHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIGFubm90YXRpb24uIChjb3BpZWQKLQkgKiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuaG92ZXIuQW5ub3RhdGlvbkhvdmVyKQotCSAqIAotCSAqIEBwYXJhbSBhbm5vdGF0aW9uCi0JICogICAgICAgICAgICB0aGUgYW5ub3RhdGlvbgotCSAqIEByZXR1cm4gdGhlIGFubm90YXRpb24gcHJlZmVyZW5jZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHJpdmF0ZSBBbm5vdGF0aW9uUHJlZmVyZW5jZSBnZXRBbm5vdGF0aW9uUHJlZmVyZW5jZShBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQotCQlpZiAoYW5ub3RhdGlvbi5pc01hcmtlZERlbGV0ZWQoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gRWRpdG9yc1VJLmdldEFubm90YXRpb25QcmVmZXJlbmNlTG9va3VwKCkuZ2V0QW5ub3RhdGlvblByZWZlcmVuY2UoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIb3ZlckluZm8oSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIGhvdmVyUmVnaW9uKSB7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSAoKFNvdXJjZVZpZXdlcikgdmlld2VyKS5nZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCUxpc3QgbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJdGVyYXRvciBlID0gbW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlBbm5vdGF0aW9uIGEgPSAoQW5ub3RhdGlvbikgZS5uZXh0KCk7Ci0JCQkJaWYgKCFpc0Fubm90YXRpb25WYWxpZChhKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlQb3NpdGlvbiBwID0gbW9kZWwuZ2V0UG9zaXRpb24oYSk7Ci0JCQkJLy8gY2hlY2sgaWYgdGhpcyBpcyBhbiBhbm5vdGF0aW9uIGluIHRoZSByZWdpb24gd2UgYXJlCi0JCQkJLy8gY29uY2VybmVkIHdpdGgKLQkJCQlpZiAocC5vdmVybGFwc1dpdGgoaG92ZXJSZWdpb24uZ2V0T2Zmc2V0KCksIGhvdmVyUmVnaW9uLmdldExlbmd0aCgpKSkgewotCQkJCQlTdHJpbmcgbXNnID0gYS5nZXRUZXh0KCk7Ci0JCQkJCWlmICgobXNnICE9IG51bGwpICYmIG1zZy50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkvLyBpdCBpcyBwb3NzaWJsZSBmb3IgdGVtcG9yYXJ5IGFubm90YXRpb25zIHRvCi0JCQkJCQkvLyBkdXBsaWNhdGUgb3RoZXIgYW5ub3RhdGlvbnMgc28gbWFrZSBzdXJlIG5vdCB0byBhZGQKLQkJCQkJCS8vIGR1cHMKLQkJCQkJCWlmIChhIGluc3RhbmNlb2YgSVRlbXBvcmFyeUFubm90YXRpb24pIHsKLQkJCQkJCQlib29sZWFuIGR1cGxpY2F0ZWQgPSBmYWxzZTsKLQkJCQkJCQlpbnQgaiA9IDA7Ci0JCQkJCQkJd2hpbGUgKGogPCBtZXNzYWdlcy5zaXplKCkgJiYgIWR1cGxpY2F0ZWQpIHsKLQkJCQkJCQkJZHVwbGljYXRlZCA9IG1lc3NhZ2VzLmdldChqKS5lcXVhbHMobXNnKTsKLQkJCQkJCQkJKytqOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIWR1cGxpY2F0ZWQpIHsKLQkJCQkJCQkJbWVzc2FnZXMuYWRkKG1zZyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJbWVzc2FnZXMuYWRkKG1zZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobWVzc2FnZXMuc2l6ZSgpID4gMSkgewotCQkJCXJldHVybiBmb3JtYXRNZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChtZXNzYWdlcy5zaXplKCkgPiAwKSB7Ci0JCQkJcmV0dXJuIGZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuZ2V0KDApLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVyUmVnaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlJQW5ub3RhdGlvbk1vZGVsIG1vZGVsID0gKChTb3VyY2VWaWV3ZXIpIHRleHRWaWV3ZXIpLmdldEFubm90YXRpb25Nb2RlbCgpOwotCQlSZWdpb24gaG92ZXJSZWdpb24gPSBudWxsOwotCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gbW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlBbm5vdGF0aW9uIGEgPSAoQW5ub3RhdGlvbikgZS5uZXh0KCk7Ci0JCQkJaWYgKCFpc0Fubm90YXRpb25WYWxpZChhKSkKLQkJCQkJY29udGludWU7Ci0JCQkJUG9zaXRpb24gcCA9IG1vZGVsLmdldFBvc2l0aW9uKGEpOwotCQkJCWlmIChwICE9IG51bGwgJiYgcC5pbmNsdWRlcyhvZmZzZXQpKSB7Ci0JCQkJCS8vIGZpbmQgdGhlIHNtYWxsZXN0IHJlZ2lvbiBjb250YWluaW5nIG9mZnNldAotCQkJCQlpZiAoKGhvdmVyUmVnaW9uID09IG51bGwpIHx8IChob3ZlclJlZ2lvbi5nZXRMZW5ndGgoKSA+IHAuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQkJCQlob3ZlclJlZ2lvbiA9IG5ldyBSZWdpb24ocC5nZXRPZmZzZXQoKSwgcC5nZXRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhvdmVyUmVnaW9uOwotCX0KLQotCS8qKgotCSAqIFJldHJlaXZlcyB0aGUgcHJlZmVyZW5jZSBzdG9yZSBJZiBubyBwcmVmZXJlbmNlIHN0b3JlIGlzIGN1cnJlbnRseQotCSAqIHN0b3JlZCwgcmV0cmVpdmUgdGhlIGFwcHJvcHJpYXRlIHByZWZlcmVuY2Ugc3RvcmUKLQkgKi8KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlpZiAoZlByZWZlcmVuY2VTdG9yZSA9PSBudWxsKSB7Ci0JCQlJUHJlZmVyZW5jZVN0b3JlIHNzZUVkaXRvclByZWZzID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJSVByZWZlcmVuY2VTdG9yZSBiYXNlRWRpdG9yUHJlZnMgPSBFZGl0b3JzVUkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQlmUHJlZmVyZW5jZVN0b3JlID0gbmV3IENoYWluZWRQcmVmZXJlbmNlU3RvcmUobmV3IElQcmVmZXJlbmNlU3RvcmVbXXtzc2VFZGl0b3JQcmVmcywgYmFzZUVkaXRvclByZWZzfSk7Ci0JCX0KLQkJcmV0dXJuIGZQcmVmZXJlbmNlU3RvcmU7Ci0JfQotCi0JYm9vbGVhbiBpc0Fubm90YXRpb25WYWxpZChBbm5vdGF0aW9uIGEpIHsKLQkJQW5ub3RhdGlvblByZWZlcmVuY2UgcHJlZmVyZW5jZSA9IGdldEFubm90YXRpb25QcmVmZXJlbmNlKGEpOwotCQlpZiAocHJlZmVyZW5jZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgdGV4dFByZWZlcmVuY2VLZXkgPSBwcmVmZXJlbmNlLmdldFRleHRQcmVmZXJlbmNlS2V5KCk7Ci0JCVN0cmluZyBoaWdobGlnaHRQcmVmZXJlbmNlS2V5ID0gcHJlZmVyZW5jZS5nZXRIaWdobGlnaHRQcmVmZXJlbmNlS2V5KCk7Ci0JCWlmICh0ZXh0UHJlZmVyZW5jZUtleSA9PSBudWxsIHx8ICEoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbih0ZXh0UHJlZmVyZW5jZUtleSkpIHx8IGhpZ2hsaWdodFByZWZlcmVuY2VLZXkgPT0gbnVsbCB8fCBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKGhpZ2hsaWdodFByZWZlcmVuY2VLZXkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9CZXN0TWF0Y2hIb3Zlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vQmVzdE1hdGNoSG92ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMwMTU5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9CZXN0TWF0Y2hIb3Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgYmVzdCBob3ZlciBoZWxwIGRvY3VtZW50YXRpb24gKGJ5IHVzaW5nIG90aGVyIGhvdmVyIGhlbHAKLSAqIHByb2Nlc3NvcnMpIFByaW9yaXR5IG9mIGhvdmVyIGhlbHAgcHJvY2Vzc29ycyBpczogUHJvYmxlbUhvdmVyUHJvY2Vzc29yLAotICogVGFnSW5mb1Byb2Nlc3NvciwgQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yCi0gKi8KLXB1YmxpYyBjbGFzcyBCZXN0TWF0Y2hIb3ZlciBpbXBsZW1lbnRzIElUZXh0SG92ZXIsIElUZXh0SG92ZXJFeHRlbnNpb24gewotCXByaXZhdGUgSVRleHRIb3ZlciBmQmVzdE1hdGNoSG92ZXI7IC8vIGN1cnJlbnQgYmVzdCBtYXRjaCB0ZXh0IGhvdmVyCi0JcHJpdmF0ZSBJVGV4dEhvdmVyW10gZlRhZ0luZm9Ib3ZlcnM7IC8vIGRvY3VtZW50YXRpb24vaW5mb3JtYXRpb24gaG92ZXIKLQlwcml2YXRlIExpc3QgZlRleHRIb3ZlcnM7IC8vIGxpc3Qgb2YgdGV4dCBob3ZlcnMgdG8gY29uc2lkZXIgaW4gYmVzdAotCS8vIG1hdGNoCi0KLQlwdWJsaWMgQmVzdE1hdGNoSG92ZXIoSVRleHRIb3ZlciBpbmZvVGFnSG92ZXIpIHsKLQkJdGhpcyhuZXcgSVRleHRIb3Zlcltde2luZm9UYWdIb3Zlcn0pOwotCX0KLQotCXB1YmxpYyBCZXN0TWF0Y2hIb3ZlcihJVGV4dEhvdmVyW10gaW5mb1RhZ0hvdmVycykgewotCQlmVGFnSW5mb0hvdmVycyA9IGluZm9UYWdIb3ZlcnM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbGlzdCBvZiB0ZXh0IGhvdmVycyBhcHBsaWNhYmxlIHRvIHRoaXMgYmVzdCBtYXRjaCBob3ZlcgotCSAqIHByb2Nlc3NvcgotCSAqIAotCSAqIEByZXR1cm4gTGlzdCBvZiBJVGV4dEhvdmVyIC0gaW4gYWJzdHJhY3QgY2xhc3MgdGhpcyBpcyBlbXB0eSBsaXN0Ci0JICovCi0JcHJpdmF0ZSBMaXN0IGNyZWF0ZVRleHRIb3ZlcnNMaXN0KCkgewotCQlMaXN0IGhvdmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gaWYgY3VycmVudGx5IGRlYnVnZ2luZywgdGhlbiBhZGQgdGhlIGRlYnVnIGhvdmVyIHRvIHRoZSBsaXN0IG9mCi0JCS8vIGJlc3QgbWF0Y2gKLQkJaWYgKExvZ2dlci5pc1RyYWNpbmcoRGVidWdJbmZvSG92ZXJQcm9jZXNzb3IuVFJBQ0VGSUxURVIpKSB7Ci0JCQlob3Zlckxpc3QuYWRkKG5ldyBEZWJ1Z0luZm9Ib3ZlclByb2Nlc3NvcigpKTsKLQkJfQotCi0JCWhvdmVyTGlzdC5hZGQobmV3IFByb2JsZW1Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IoKSk7Ci0JCQotCQlpZiAoZlRhZ0luZm9Ib3ZlcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFnSW5mb0hvdmVycy5sZW5ndGg7IGkrKykgewotCQkJCWhvdmVyTGlzdC5hZGQoZlRhZ0luZm9Ib3ZlcnNbaV0pOwotCQkJfQotCQl9Ci0JCWhvdmVyTGlzdC5hZGQobmV3IEFubm90YXRpb25Ib3ZlclByb2Nlc3NvcigpKTsKLQkJcmV0dXJuIGhvdmVyTGlzdDsKLQl9Ci0KLQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgZ2V0SG92ZXJDb250cm9sQ3JlYXRvcigpIHsKLQkJSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgY3JlYXRvciA9IG51bGw7Ci0KLQkJaWYgKGZCZXN0TWF0Y2hIb3ZlciBpbnN0YW5jZW9mIElUZXh0SG92ZXJFeHRlbnNpb24pIHsKLQkJCWNyZWF0b3IgPSAoKElUZXh0SG92ZXJFeHRlbnNpb24pIGZCZXN0TWF0Y2hIb3ZlcikuZ2V0SG92ZXJDb250cm9sQ3JlYXRvcigpOwotCQl9Ci0JCXJldHVybiBjcmVhdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVySW5mbyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG92ZXJJbmZvKElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiBob3ZlclJlZ2lvbikgewotCQlTdHJpbmcgZGlzcGxheVRleHQgPSBudWxsOwotCi0JCS8vIGFscmVhZHkgaGF2ZSBhIGJlc3QgbWF0Y2ggaG92ZXIgcGlja2VkIG91dCBmcm9tIGdldEhvdmVyUmVnaW9uIGNhbGwKLQkJaWYgKGZCZXN0TWF0Y2hIb3ZlciAhPSBudWxsKSB7Ci0JCQlkaXNwbGF5VGV4dCA9IGZCZXN0TWF0Y2hIb3Zlci5nZXRIb3ZlckluZm8odmlld2VyLCBob3ZlclJlZ2lvbik7Ci0JCX0KLQkJLy8gZWl0aGVyIGhhZCBubyBiZXN0IG1hdGNoIGhvdmVyIG9yIGJlc3QgbWF0Y2ggaG92ZXIgcmV0dXJuZWQgbnVsbAotCQlpZiAoZGlzcGxheVRleHQgPT0gbnVsbCkgewotCQkJLy8gZ28gdGhyb3VnaCBsaXN0IG9mIHRleHQgaG92ZXJzIGFuZCByZXR1cm4gZmlyc3QgZGlzcGxheSBzdHJpbmcKLQkJCUl0ZXJhdG9yIGkgPSBnZXRUZXh0SG92ZXJzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlICgoaS5oYXNOZXh0KCkpICYmIChkaXNwbGF5VGV4dCA9PSBudWxsKSkgewotCQkJCUlUZXh0SG92ZXIgaG92ZXIgPSAoSVRleHRIb3ZlcikgaS5uZXh0KCk7Ci0JCQkJZGlzcGxheVRleHQgPSBob3Zlci5nZXRIb3ZlckluZm8odmlld2VyLCBob3ZlclJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXlUZXh0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVyUmVnaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCUlSZWdpb24gaG92ZXJSZWdpb24gPSBudWxsOwotCi0JCS8vIGdvIHRocm91Z2ggbGlzdCBvZiB0ZXh0IGhvdmVycyBhbmQgcmV0dXJuIGZpcnN0IGhvdmVyIHJlZ2lvbgotCQlJVGV4dEhvdmVyIGhvdmVyID0gbnVsbDsKLQkJSXRlcmF0b3IgaSA9IGdldFRleHRIb3ZlcnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoKGkuaGFzTmV4dCgpKSAmJiAoaG92ZXJSZWdpb24gPT0gbnVsbCkpIHsKLQkJCWhvdmVyID0gKElUZXh0SG92ZXIpIGkubmV4dCgpOwotCQkJaG92ZXJSZWdpb24gPSBob3Zlci5nZXRIb3ZlclJlZ2lvbih2aWV3ZXIsIG9mZnNldCk7Ci0JCX0KLQotCQkvLyBzdG9yZSB0aGUgdGV4dCBob3ZlciBwcm9jZXNzb3IgdGhhdCBmb3VuZCByZWdpb24KLQkJaWYgKGhvdmVyUmVnaW9uICE9IG51bGwpCi0JCQlmQmVzdE1hdGNoSG92ZXIgPSBob3ZlcjsKLQkJZWxzZQotCQkJZkJlc3RNYXRjaEhvdmVyID0gbnVsbDsKLQotCQlyZXR1cm4gaG92ZXJSZWdpb247Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFRleHRIb3ZlcnMoKSB7Ci0JCWlmIChmVGV4dEhvdmVycyA9PSBudWxsKSB7Ci0JCQlmVGV4dEhvdmVycyA9IGNyZWF0ZVRleHRIb3ZlcnNMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGZUZXh0SG92ZXJzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL0RlYnVnSW5mb0hvdmVyUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9EZWJ1Z0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTlkYjA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL0RlYnVnSW5mb0hvdmVyUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLQotLyoqCi0gKiBQcm92aWRlcyBkZWJ1ZyBob3ZlciBoZWxwCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWJ1Z0luZm9Ib3ZlclByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0SG92ZXJQcm9jZXNzb3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSID0gImRlYnVnaW5mb2hvdmVyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGZQcmVmZXJlbmNlU3RvcmUgPSBudWxsOwotCi0JcHVibGljIERlYnVnSW5mb0hvdmVyUHJvY2Vzc29yKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVySW5mbyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG92ZXJJbmZvKElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiBob3ZlclJlZ2lvbikgewotCQlTdHJpbmcgZGlzcGxheVRleHQgPSBudWxsOwotCQlpZiAoKGhvdmVyUmVnaW9uID09IG51bGwpIHx8ICh2aWV3ZXIgPT0gbnVsbCkgfHwgKHZpZXdlci5nZXREb2N1bWVudCgpID09IG51bGwpKSB7Ci0JCQlkaXNwbGF5VGV4dCA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnQgb2Zmc2V0ID0gaG92ZXJSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0KLQkJCUlUeXBlZFJlZ2lvbiByZWdpb247Ci0JCQl0cnkgewotCQkJCXJlZ2lvbiA9IHZpZXdlci5nZXREb2N1bWVudCgpLmdldFBhcnRpdGlvbihvZmZzZXQpOwotCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQlkaXNwbGF5VGV4dCA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkaXNwbGF5VGV4dCA9ICJOdWxsIFJlZ2lvbiB3YXMgcmV0dXJuZWQ/ISI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWRpc3BsYXlUZXh0ID0gIkJhZExvY2F0aW9uRXhjZXB0aW9uIE9jY3VycmVkIT8iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gZGlzcGxheVRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVnaW9uIHRvIGhvdmVyIHRoZSB0ZXh0IG92ZXIgYmFzZWQgb24gdGhlIG9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dFZpZXdlcgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAKLQkgKiBAcmV0dXJuIElSZWdpb24gcmVnaW9uIHRvIGhvdmVyIG92ZXIgaWYgb2Zmc2V0IGlzIG5vdCBvdmVyIGludmFsaWQKLQkgKiAgICAgICAgIHdoaXRlc3BhY2UuIG90aGVyd2lzZSwgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVyUmVnaW9uKElUZXh0Vmlld2VyLCBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlJVHlwZWRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaWYgKCh0ZXh0Vmlld2VyID09IG51bGwpIHx8ICh0ZXh0Vmlld2VyLmdldERvY3VtZW50KCkgPT0gbnVsbCkpIHsKLQkJCXJlZ2lvbiA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJCXRyeSB7Ci0JCQkJcmVnaW9uID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpLmdldFBhcnRpdGlvbihvZmZzZXQpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZWdpb24gPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vUHJvYmxlbUFubm90YXRpb25Ib3ZlclByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vUHJvYmxlbUFubm90YXRpb25Ib3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjAxMjMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL1Byb2JsZW1Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuRGVmYXVsdE1hcmtlckFubm90YXRpb25BY2Nlc3M7Ci0KLS8qKgotICogSG92ZXIgaGVscCB0aGF0IGRpc3BsYXlzIHByb2JsZW0gYW5ub3RhdGlvbnMgd2hlbiBzaG93biBpbiB0ZXh0IG9mIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBhbXl3dQotICovCi1wdWJsaWMgY2xhc3MgUHJvYmxlbUFubm90YXRpb25Ib3ZlclByb2Nlc3NvciBleHRlbmRzIEFubm90YXRpb25Ib3ZlclByb2Nlc3NvciB7Ci0KLQkvLyB0aGVzZSBzdHJpbmdzIGFyZSBkZXJpdmVkIGZyb20gdGhlIGFubm90YXRpb25UeXBlcyBleHRlbnNpb24gaW4KLQkvLyBvcmcuZWNsaXBzZS51aS5lZGl0b3JzIHBsdWdpbgotCS8vIGlmIHRob3NlIHN0cmluZ3MgY2hhbmdlLCB0aGVuIHRoZXNlIHN0cmluZ3MgbmVlZCB0byBjaGFuZ2UgYXMgd2VsbAotCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTg1ODQKLQlmaW5hbCBwcml2YXRlIFN0cmluZyBBTk5PVEFUSU9OX0VSUk9SID0gIm9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmVycm9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHByaXZhdGUgU3RyaW5nIEFOTk9UQVRJT05fV0FSTklORyA9ICJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci53YXJuaW5nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgRGVmYXVsdE1hcmtlckFubm90YXRpb25BY2Nlc3MgZkFubm90YXRpb25BY2Nlc3MgPSBuZXcgRGVmYXVsdE1hcmtlckFubm90YXRpb25BY2Nlc3MoKTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgUHJvYmxlbUFubm90YXRpb25Ib3ZlclByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS50YWdpbmZvLkFubm90YXRpb25Ib3ZlclByb2Nlc3NvciNpc0Fubm90YXRpb25WYWxpZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQW5ub3RhdGlvblZhbGlkKEFubm90YXRpb24gYSkgewotCQlTdHJpbmcgdHlwZSA9IGEuZ2V0VHlwZSgpOwotCQlpZiAoZkFubm90YXRpb25BY2Nlc3MuaXNTdWJ0eXBlKHR5cGUsIEFOTk9UQVRJT05fRVJST1IpIHx8IGZBbm5vdGF0aW9uQWNjZXNzLmlzU3VidHlwZSh0eXBlLCBBTk5PVEFUSU9OX1dBUk5JTkcpKQotCQkJcmV0dXJuIHN1cGVyLmlzQW5ub3RhdGlvblZhbGlkKGEpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vVGV4dEhvdmVyTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vVGV4dEhvdmVyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjhiMWEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL1RleHRIb3Zlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogTWFuYWdlcyB0ZXh0IGhvdmVycyBmb3IgU3RydWN0dXJlZCBUZXh0IGVkaXRvcnMKLSAqLwotcHVibGljIGNsYXNzIFRleHRIb3Zlck1hbmFnZXIgewotCS8qKgotCSAqIENvbnRhaW5zIGRlc2NyaXB0aW9uIG9mIGEgdGV4dCBob3ZlcgotCSAqLwotCXB1YmxpYyBjbGFzcyBUZXh0SG92ZXJEZXNjcmlwdG9yIHsKLQkJcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uOwotCQlwcml2YXRlIGJvb2xlYW4gZkVuYWJsZWQ7Ci0JCXByaXZhdGUgU3RyaW5nIGZJZDsKLQkJcHJpdmF0ZSBTdHJpbmcgZkxhYmVsOwotCQlwcml2YXRlIFN0cmluZyBmTW9kaWZpZXJTdHJpbmc7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBpZAotCQkgKiBAcGFyYW0gbGFiZWwKLQkJICogQHBhcmFtIGRlc2MKLQkJICovCi0JCXB1YmxpYyBUZXh0SG92ZXJEZXNjcmlwdG9yKFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzYykgewotCQkJZklkID0gaWQ7Ci0JCQlmTGFiZWwgPSBsYWJlbDsKLQkJCWZEZXNjcmlwdGlvbiA9IGRlc2M7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGlkCi0JCSAqIEBwYXJhbSBsYWJlbAotCQkgKiBAcGFyYW0gZGVzYwotCQkgKiBAcGFyYW0gZW5hYmxlZAotCQkgKiBAcGFyYW0gbW9kaWZpZXJTdHJpbmcKLQkJICovCi0JCXB1YmxpYyBUZXh0SG92ZXJEZXNjcmlwdG9yKFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzYywgYm9vbGVhbiBlbmFibGVkLCBTdHJpbmcgbW9kaWZpZXJTdHJpbmcpIHsKLQkJCWZJZCA9IGlkOwotCQkJZkxhYmVsID0gbGFiZWw7Ci0JCQlmRGVzY3JpcHRpb24gPSBkZXNjOwotCQkJZkVuYWJsZWQgPSBlbmFibGVkOwotCQkJZk1vZGlmaWVyU3RyaW5nID0gbW9kaWZpZXJTdHJpbmc7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBmRGVzY3JpcHRpb24uCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIGZEZXNjcmlwdGlvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZJZC4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQlyZXR1cm4gZklkOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZkxhYmVsCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuIGZMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZNb2RpZmllclN0cmluZy4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TW9kaWZpZXJTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZk1vZGlmaWVyU3RyaW5nOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZkVuYWJsZWQuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQlyZXR1cm4gZkVuYWJsZWQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGVuYWJsZWQKLQkJICogICAgICAgICAgICBUaGUgZkVuYWJsZWQgdG8gc2V0LgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJCWZFbmFibGVkID0gZW5hYmxlZDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gbW9kaWZpZXJTdHJpbmcKLQkJICogICAgICAgICAgICBUaGUgZk1vZGlmaWVyU3RyaW5nIHRvIHNldC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVyU3RyaW5nKFN0cmluZyBtb2RpZmllclN0cmluZykgewotCQkJZk1vZGlmaWVyU3RyaW5nID0gbW9kaWZpZXJTdHJpbmc7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX0hPVkVSID0gImFubm90YXRpb25Ib3ZlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGxpc3Qgb2YgZGlmZmVyZW50IHR5cGVzIG9mIFNvdXJjZSBlZGl0b3IgaG92ZXJzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NQklOQVRJT05fSE9WRVIgPSAiY29tYmluYXRpb25Ib3ZlciI7IC8vJE5PTi1OTFMtMSQKLQkvLyBob3ZlciBkZXNjcmlwdGlvbnMgYXJlIGluIC5wcm9wZXJ0aWVzIGZpbGUgd2l0aCB0aGUga2V5IGluIHRoZSBmb3JtIG9mCi0JLy8gIltpZF1fZGVzYyIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fS0VZID0gIl9kZXNjIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UQVRJT05fSE9WRVIgPSAiZG9jdW1lbnRhdGlvbkhvdmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPVkVSX0FUVFJJQlVURV9TRVBBUkFUT1IgPSAifCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT1ZFUl9TRVBBUkFUT1IgPSAiOyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGhvdmVyIGxhYmVscyBhcmUgaW4gLnByb3BlcnRpZXMgZmlsZSB3aXRoIHRoZSBrZXkgaW4gdGhlIGZvcm0gb2YKLQkvLyAiW2lkXV9sYWJlbCIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfS0VZID0gIl9sYWJlbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX01PRElGSUVSID0gIjAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9IT1ZFUiA9ICJwcm9ibGVtSG92ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBURVhUX0hPVkVSX0lEUyA9IG5ldyBTdHJpbmdbXXtDT01CSU5BVElPTl9IT1ZFUiwgUFJPQkxFTV9IT1ZFUiwgRE9DVU1FTlRBVElPTl9IT1ZFUiwgQU5OT1RBVElPTl9IT1ZFUn07Ci0JLyoqCi0JICogQ3VycmVudCBsaXN0IG9mIFN0cnVjdHVyZWQgVGV4dCBlZGl0b3IgdGV4dCBob3ZlcnMKLQkgKi8KLQlwcml2YXRlIFRleHRIb3ZlckRlc2NyaXB0b3JbXSBmVGV4dEhvdmVyczsKLQotCXB1YmxpYyBUZXh0SG92ZXJNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGJlc3QgbWF0Y2ggaG92ZXIgd2l0aCB0aGUgZ2l2ZSB0ZXh0IGhvdmVyIGFzIHRoZSBkb2N1bWVudGF0aW9uCi0JICogaG92ZXIKLQkgKiAKLQkgKiBAcGFyYW0gaW5mb0hvdmVyCi0JICogQHJldHVybiBJVGV4dEhvdmVyCi0JICogQGRlcHJlY2F0ZWQgYXMgb2YgV1RQIDMuMCBNMwotCSAqLwotCXB1YmxpYyBJVGV4dEhvdmVyIGNyZWF0ZUJlc3RNYXRjaEhvdmVyKElUZXh0SG92ZXIgaW5mb0hvdmVyKSB7Ci0JCXJldHVybiBuZXcgQmVzdE1hdGNoSG92ZXIoaW5mb0hvdmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBhIGxpc3Qgb2YgdGV4dCBob3ZlciBkZXNjcmlwdG9ycyBmcm9tIHRoZSBnaXZlbiBkZWxpbWl0ZWQKLQkgKiBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dEhvdmVyU3RyaW5ncwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgVGV4dEhvdmVyRGVzY3JpcHRvcltdIGdlbmVyYXRlVGV4dEhvdmVyRGVzY3JpcHRvcnMoU3RyaW5nIHRleHRIb3ZlclN0cmluZ3MpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZXh0SG92ZXJTdHJpbmdzLCBIT1ZFUl9TRVBBUkFUT1IpOwotCi0JCS8vIHJlYWQgZnJvbSBwcmVmZXJlbmNlIGFuZCBsb2FkIGlkLWRlc2NyaXB0b3IgbWFwcGluZyB0byBhIGhhc2ggdGFibGUKLQkJSGFzaE1hcCBpZFRvTW9kaWZpZXIgPSBuZXcgSGFzaE1hcChzdC5jb3VudFRva2VucygpKTsKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRleHRIb3ZlclN0cmluZyA9IHN0Lm5leHRUb2tlbigpOwotCQkJU3RyaW5nVG9rZW5pemVyIHN0MiA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGV4dEhvdmVyU3RyaW5nLCBIT1ZFUl9BVFRSSUJVVEVfU0VQQVJBVE9SKTsKLQkJCWlmIChzdDIuY291bnRUb2tlbnMoKSA9PSAzKSB7Ci0JCQkJU3RyaW5nIGlkID0gc3QyLm5leHRUb2tlbigpOwotCQkJCWJvb2xlYW4gZW5hYmxlZCA9IEJvb2xlYW4udmFsdWVPZihzdDIubmV4dFRva2VuKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCVN0cmluZyBtb2RpZmllclN0cmluZyA9IHN0Mi5uZXh0VG9rZW4oKTsKLQkJCQlpZiAobW9kaWZpZXJTdHJpbmcuZXF1YWxzKE5PX01PRElGSUVSKSkKLQkJCQkJbW9kaWZpZXJTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkJU3RyaW5nIGxhYmVsID0gbnVsbDsKLQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWxhYmVsID0gU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLmdldFN0cmluZyhpZCArIExBQkVMX0tFWSk7Ci0JCQkJCWRlc2NyaXB0aW9uID0gU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLmdldFN0cmluZyhpZCArIERFU0NSSVBUSU9OX0tFWSk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJfQotCQkJCVRleHRIb3ZlckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBUZXh0SG92ZXJEZXNjcmlwdG9yKGlkLCBsYWJlbCwgZGVzY3JpcHRpb24sIGVuYWJsZWQsIG1vZGlmaWVyU3RyaW5nKTsKLQkJCQkvLyBzaG91bGQgY2hlY2sgdG8gc2VlIGlmIGlkcyBhcHBlYXIgbW9yZSB0aGFuIG9uY2UKLQkJCQlpZFRvTW9kaWZpZXIucHV0KGlkLCBkZXNjcmlwdG9yKTsKLQkJCX0KLQkJfQotCi0JCS8vIGdvIHRocm91Z2ggYWxsIGRlZmluZWQgdGV4dCBob3ZlcnMgYW5kIG1hdGNoIHdpdGggdGhlaXIgcHJlZmVyZW5jZQotCQlUZXh0SG92ZXJEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgVGV4dEhvdmVyRGVzY3JpcHRvcltURVhUX0hPVkVSX0lEUy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IFRFWFRfSE9WRVJfSURTLmxlbmd0aDsgaSsrKSB7Ci0JCQlUZXh0SG92ZXJEZXNjcmlwdG9yIGRlc2MgPSAoVGV4dEhvdmVyRGVzY3JpcHRvcikgaWRUb01vZGlmaWVyLmdldChURVhUX0hPVkVSX0lEU1tpXSk7Ci0JCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJZGVzY3JpcHRvcnNbaV0gPSBkZXNjOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIGxhYmVsID0gbnVsbDsKLQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWxhYmVsID0gU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLmdldFN0cmluZyhURVhUX0hPVkVSX0lEU1tpXSArIExBQkVMX0tFWSk7Ci0JCQkJCWRlc2NyaXB0aW9uID0gU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLmdldFN0cmluZyhURVhUX0hPVkVSX0lEU1tpXSArIERFU0NSSVBUSU9OX0tFWSk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJfQotCQkJCWRlc2NyaXB0b3JzW2ldID0gbmV3IFRleHRIb3ZlckRlc2NyaXB0b3IoVEVYVF9IT1ZFUl9JRFNbaV0sIGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCX0KLQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IGhvdmVycyBmb3IgU3RydWN0dXJlZCBUZXh0IGVkaXRvci4gSWYgZlRleHRIb3ZlciBoYXMKLQkgKiBub3QgYmVlbiBpbml0aWFsaWVkLCBpdCB3aWxsIGJlIGluaXRpYWxpemVkLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZlRleHRIb3ZlcnMuCi0JICovCi0JcHVibGljIFRleHRIb3ZlckRlc2NyaXB0b3JbXSBnZXRUZXh0SG92ZXJzKCkgewotCQlpZiAoZlRleHRIb3ZlcnMgPT0gbnVsbCkgewotCQkJU3RyaW5nIHRleHRIb3ZlclN0cmluZ3MgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkVESVRPUl9URVhUX0hPVkVSX01PRElGSUVSUyk7Ci0JCQlmVGV4dEhvdmVycyA9IGdlbmVyYXRlVGV4dEhvdmVyRGVzY3JpcHRvcnModGV4dEhvdmVyU3RyaW5ncyk7Ci0JCX0KLQkJcmV0dXJuIGZUZXh0SG92ZXJzOwotCX0KLQotCS8qKgotCSAqIFNldHMgZlRleHRIb3ZlcnMgdG8gbnVsbCBzbyB0aGF0IG5leHQgdGltZSBnZXRUZXh0SG92ZXJzIGlzIGNhbGxlZCwKLQkgKiBmVGV4dEhvdmVycyB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBsYXRlc3QgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRUZXh0SG92ZXJzKCkgewotCQlmVGV4dEhvdmVycyA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RleHQvRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RleHQvRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjdmYTQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90ZXh0L0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiBNYXRjaGVzIHRoZSBzdGFydCBhbmQgZW5kaW5nIGNoYXJhY3RlcnMgb2YgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgd2l0aAotICogdGhlIGdpdmVuIGFsbG93ZWQgdHlwZXMuIE5vdGUgdGhhdCBFY2xpcHNlIFIzTTggb25seSBwYWludHMgc2luZ2xlCi0gKiBjaGFyYWN0ZXItd2lkZSBtYXRjaGVzIGFuZCB0aGlzIGlzbid0IHRydWUgcGFpciBtYXRjaGluZyBiZWhhdmlvci4gU2VlIFJGRQotICogIzU2ODM2IGF0IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NjgzNi4KLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgaW1wbGVtZW50cyBJQ2hhcmFjdGVyUGFpck1hdGNoZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiY2hhcmFjdGVycGFpcm1hdGNoZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgaW50IGZBbmNob3I7Ci0KLQlwcm90ZWN0ZWQgSUNoYXJhY3RlclBhaXJNYXRjaGVyIGZOZXh0TWF0Y2hlcjsKLQotCXByb3RlY3RlZCBMaXN0IGZSZWdpb25UeXBlczsKLQotCXB1YmxpYyBEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyKFN0cmluZ1tdIHZhbGlkQ29udGV4dHMsIElDaGFyYWN0ZXJQYWlyTWF0Y2hlciBuZXh0TWF0Y2hlcikgewotCQlmUmVnaW9uVHlwZXMgPSBBcnJheXMuYXNMaXN0KHZhbGlkQ29udGV4dHMpOwotCQlmTmV4dE1hdGNoZXIgPSBuZXh0TWF0Y2hlcjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2NsZWFyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKGZOZXh0TWF0Y2hlciAhPSBudWxsKQotCQkJZk5leHRNYXRjaGVyLmNsZWFyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGZOZXh0TWF0Y2hlciAhPSBudWxsKQotCQkJZk5leHRNYXRjaGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNnZXRBbmNob3IoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QW5jaG9yKCkgewotCQlpZiAoZkFuY2hvciA8IDAgJiYgZk5leHRNYXRjaGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZk5leHRNYXRjaGVyLmdldEFuY2hvcigpOwotCQlyZXR1cm4gZkFuY2hvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNtYXRjaChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBtYXRjaChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID49IGRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVJlZ2lvbiBtYXRjaCA9IG51bGw7Ci0JCWlmICghZlJlZ2lvblR5cGVzLmlzRW1wdHkoKSAmJiBkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jUmVnaW9uID0gKChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChkb2NSZWdpb24gIT0gbnVsbCkgewotCQkJCS8vIGxvb2sgYXQgdGhlIHByZXZpb3VzIGRvY3VtZW50IHJlZ2lvbiBmaXJzdCBzaW5jZSBpdHMgZW5kID09Ci0JCQkJLy8gdGhpcyBvbmUncyBzdGFydAotCQkJCWlmIChkb2NSZWdpb24uZ2V0UHJldmlvdXMoKSAhPSBudWxsICYmIGRvY1JlZ2lvbi5nZXRQcmV2aW91cygpLmdldEVuZE9mZnNldCgpID09IG9mZnNldCAmJiBmUmVnaW9uVHlwZXMuY29udGFpbnMoZG9jUmVnaW9uLmdldFByZXZpb3VzKCkuZ2V0VHlwZSgpKSkgewotCQkJCQlmQW5jaG9yID0gSUNoYXJhY3RlclBhaXJNYXRjaGVyLlJJR0hUOwotCQkJCQltYXRjaCA9IG5ldyBSZWdpb24oZG9jUmVnaW9uLmdldFByZXZpb3VzKCkuZ2V0U3RhcnRPZmZzZXQoKSwgMSk7Ci0JCQkJfQotCQkJCS8vIGNoZWNrIGZvciBvZmZzZXQgaW4gdGhlIGxhc3QgdGV4dCByZWdpb24gZm9yIGEgbWF0Y2ggdG8KLQkJCQkvLyBkb2N1bWVudCByZWdpb24gc3RhcnQgb2Zmc2V0Ci0JCQkJZWxzZSBpZiAoZlJlZ2lvblR5cGVzLmNvbnRhaW5zKGRvY1JlZ2lvbi5nZXRUeXBlKCkpICYmIGRvY1JlZ2lvbi5nZXRTdGFydE9mZnNldChkb2NSZWdpb24uZ2V0TGFzdFJlZ2lvbigpKSA8PSBvZmZzZXQgJiYgb2Zmc2V0IDw9IGRvY1JlZ2lvbi5nZXRFbmRPZmZzZXQoZG9jUmVnaW9uLmdldExhc3RSZWdpb24oKSkpIHsKLQkJCQkJZkFuY2hvciA9IElDaGFyYWN0ZXJQYWlyTWF0Y2hlci5SSUdIVDsKLQkJCQkJbWF0Y2ggPSBuZXcgUmVnaW9uKGRvY1JlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCAxKTsKLQkJCQl9Ci0JCQkJLy8gY2hlY2sgZm9yIG9mZnNldCBpbiB0aGUgZmlyc3QgdGV4dCByZWdpb24gZm9yIGEgbWF0Y2ggdG8KLQkJCQkvLyBkb2N1bWVudCByZWdpb24gZW5kIG9mZnNldAotCQkJCWVsc2UgaWYgKGZSZWdpb25UeXBlcy5jb250YWlucyhkb2NSZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJCQlpZiAoZG9jUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGRvY1JlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpKSA8PSBvZmZzZXQgJiYgb2Zmc2V0IDw9IGRvY1JlZ2lvbi5nZXRFbmRPZmZzZXQoZG9jUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkpKSB7Ci0JCQkJCQlmQW5jaG9yID0gSUNoYXJhY3RlclBhaXJNYXRjaGVyLkxFRlQ7Ci0JCQkJCQltYXRjaCA9IG5ldyBSZWdpb24oZG9jUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gMSwgMSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAobWF0Y2ggPT0gbnVsbCkgewotCQkJCQkvKiBOb3cgY2hlY2sgdGhlIHRleHQgcmVnaW9uICovCi0JCQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRUZXh0UmVnaW9uID0gZG9jUmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJCWlmIChjdXJyZW50VGV4dFJlZ2lvbiAhPSBudWxsICYmIGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSA+IDEpIHsKLQkJCQkJCWludCBvZmZzZXRBdE5lYXJFZGdlID0gb2Zmc2V0OwotCQkJCQkJaWYgKG9mZnNldCA9PSBkb2NSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChjdXJyZW50VGV4dFJlZ2lvbikpIHsKLQkJCQkJCQlvZmZzZXRBdE5lYXJFZGdlID0gb2Zmc2V0LTE7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChvZmZzZXQgPT0gZG9jUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGN1cnJlbnRUZXh0UmVnaW9uKSsxKSB7Ci0JCQkJCQkJb2Zmc2V0QXROZWFyRWRnZSA9IG9mZnNldC0xOwotCQkJCQkJfQotCi0JCQkJCQlpZiAob2Zmc2V0QXROZWFyRWRnZSA9PSBkb2NSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY3VycmVudFRleHRSZWdpb24pKSB7Ci0JCQkJCQkJaW50IGVuZCA9IGRvY1JlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpZiAoZG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXRBdE5lYXJFZGdlKSA9PSBkb2N1bWVudC5nZXRDaGFyKGVuZCAtIDEpKSB7Ci0JCQkJCQkJCQlmQW5jaG9yID0gSUNoYXJhY3RlclBhaXJNYXRjaGVyLkxFRlQ7Ci0JCQkJCQkJCQltYXRjaCA9IG5ldyBSZWdpb24oZW5kIC0gMSwgMSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJLy8gbm90aGluZywgbm90IGltcG9ydGFudCBlbm91Z2gKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChvZmZzZXRBdE5lYXJFZGdlID09IGRvY1JlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGN1cnJlbnRUZXh0UmVnaW9uKS0xKSB7Ci0JCQkJCQkJaW50IHN0YXJ0ID0gZG9jUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpZiAoZG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXRBdE5lYXJFZGdlKSA9PSBkb2N1bWVudC5nZXRDaGFyKHN0YXJ0KSkgewotCQkJCQkJCQkJZkFuY2hvciA9IElDaGFyYWN0ZXJQYWlyTWF0Y2hlci5SSUdIVDsKLQkJCQkJCQkJCW1hdGNoID0gbmV3IFJlZ2lvbihzdGFydCwgMSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJLy8gbm90aGluZywgbm90IGltcG9ydGFudCBlbm91Z2gKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG1hdGNoID09IG51bGwgJiYgZk5leHRNYXRjaGVyICE9IG51bGwpIHsKLQkJCWZBbmNob3IgPSAtMTsKLQkJCW1hdGNoID0gZk5leHRNYXRjaGVyLm1hdGNoKGRvY3VtZW50LCBvZmZzZXQpOwotCQl9Ci0JCXJldHVybiBtYXRjaDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGV4dC9Tb3VyY2VJbmZvUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90ZXh0L1NvdXJjZUluZm9Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjdhNGY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90ZXh0L1NvdXJjZUluZm9Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLQotcHVibGljIGNsYXNzIFNvdXJjZUluZm9Qcm92aWRlciBpbXBsZW1lbnRzIElJbmZvcm1hdGlvblByb3ZpZGVyLCBJSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbiAgewotCi0JcHJpdmF0ZSBJVGV4dEVkaXRvciBmRWRpdG9yOwotCi0JcHVibGljIFNvdXJjZUluZm9Qcm92aWRlcihJVGV4dEVkaXRvciBlZGl0b3IpIHsKLQkJZkVkaXRvciA9IGVkaXRvcjsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHN1YmplY3QpIHsKLQkJcmV0dXJuIGdldEluZm9ybWF0aW9uMih0ZXh0Vmlld2VyLCBzdWJqZWN0KS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldFN1YmplY3QoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlpZiAodGV4dFZpZXdlciAhPSBudWxsICYmIGZFZGl0b3IgIT0gbnVsbCkgewotCQkJSVJlZ2lvbiByZWdpb249IFdvcmRGaW5kZXIuZmluZFdvcmQodGV4dFZpZXdlci5nZXREb2N1bWVudCgpLCBvZmZzZXQpOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKQotCQkJCXJldHVybiByZWdpb247Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG5ldyBSZWdpb24ob2Zmc2V0LCAwKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEluZm9ybWF0aW9uMihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHN1YmplY3QpIHsKLQkJaWYgKGZFZGl0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCU9iamVjdCBzZWxlY3Rpb24gPSBmRWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLQkJCXNlbGVjdGlvbiA9IG5ldyBPYmplY3QoKTsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90ZXh0L1dvcmRGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90ZXh0L1dvcmRGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU3MDhjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGV4dC9Xb3JkRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgV29yZEZpbmRlciB7Ci0KLQkvKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhV29yZEZpbmRlciAqLwotCXB1YmxpYyBzdGF0aWMgSVJlZ2lvbiBmaW5kV29yZChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQotCQlpbnQgc3RhcnQ9IC0yOwotCQlpbnQgZW5kPSAtMTsKLQotCQl0cnkgewotCQkJaW50IHBvcz0gb2Zmc2V0OwotCQkJY2hhciBjOwotCi0JCQl3aGlsZSAocG9zID49IDApIHsKLQkJCQljPSBkb2N1bWVudC5nZXRDaGFyKHBvcyk7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykpCi0JCQkJCWJyZWFrOwotCQkJCS0tcG9zOwotCQkJfQotCQkJc3RhcnQ9IHBvczsKLQotCQkJcG9zPSBvZmZzZXQ7Ci0JCQlpbnQgbGVuZ3RoPSBkb2N1bWVudC5nZXRMZW5ndGgoKTsKLQotCQkJd2hpbGUgKHBvcyA8IGxlbmd0aCkgewotCQkJCWM9IGRvY3VtZW50LmdldENoYXIocG9zKTsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSkKLQkJCQkJYnJlYWs7Ci0JCQkJKytwb3M7Ci0JCQl9Ci0JCQllbmQ9IHBvczsKLQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCX0KLQotCQlpZiAoc3RhcnQgPj0gLTEgJiYgZW5kID4gLTEpIHsKLQkJCWlmIChzdGFydCA9PSBvZmZzZXQgJiYgZW5kID09IG9mZnNldCkKLQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihvZmZzZXQsIDApOwotCQkJZWxzZSBpZiAoc3RhcnQgPT0gb2Zmc2V0KQotCQkJCXJldHVybiBuZXcgUmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG5ldyBSZWdpb24oc3RhcnQgKyAxLCBlbmQgLSBzdGFydCAtIDEpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3VpL09mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdWkvT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI1MDRkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdWkvT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2FzaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2ltcGxlTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5UZXh0UHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5SZWNvbmNpbGVBbm5vdGF0aW9uS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlRlbXBvcmFyeUFubm90YXRpb247Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0Lk51bWJlckZvcm1hdDsKLQotLyoqCi0gKiBAYXV0aG9yIG5zZCBBIFN0YXR1cyBMaW5lIGNvbnRyaWJ1dGlvbiBpbnRlbmRlZCB0byBkaXNwbGF5IHRoZSBzZWxlY3RlZAotICogICAgICAgICBvZmZzZXRzIGluIGFuIGVkaXRvci4gRG91YmxlLWNsaWNraW5nIHNob3dzIGluZm9ybWF0aW9uIGFib3V0Ci0gKiAgICAgICAgIHBhcnRpdGlvbnMsIGRvY3VtZW50IHJlZ2lvbnMsIGFubm90YXRpb25zLCBhbmQgc2VsZWN0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0gZXh0ZW5kcyBTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbSB7Ci0KLQljbGFzcyBBbm5vdGF0aW9uUHJvcGVydHlTb3VyY2UgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2UgewotCQlBbm5vdGF0aW9uIGZBbm5vdGF0aW9uID0gbnVsbDsKLQkJSVByb3BlcnR5RGVzY3JpcHRvcltdIGZEZXNjcmlwdG9ycyA9IG51bGw7Ci0JCVN0cmluZ1tdIFRFTVBPUkFSWV9BTk5PVEFUSU9OX0tFWVMgPSBuZXcgU3RyaW5nW117IlBhcnRpdGlvbiBUeXBlIiwgIlN0ZXAiLCAiU2NvcGUiLCAiT2Zmc2V0IiwgIkxlbmd0aCIsICJEZXNjcmlwdGlvbiJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCi0JCXB1YmxpYyBBbm5vdGF0aW9uUHJvcGVydHlTb3VyY2UoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCQlzdXBlcigpOwotCQkJZkFubm90YXRpb24gPSBhbm5vdGF0aW9uOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCQlpZiAoZkRlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoZkFubm90YXRpb24gaW5zdGFuY2VvZiBTaW1wbGVNYXJrZXJBbm5vdGF0aW9uKSB7Ci0JCQkJCQlNYXAgYXR0cnMgPSAoKFNpbXBsZU1hcmtlckFubm90YXRpb24pIGZBbm5vdGF0aW9uKS5nZXRNYXJrZXIoKS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQlPYmplY3RbXSBrZXlzID0gYXR0cnMua2V5U2V0KCkudG9BcnJheSgpOwotCi0JCQkJCQlmRGVzY3JpcHRvcnMgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltrZXlzLmxlbmd0aF07Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlUZXh0UHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcihrZXlzW2ldLnRvU3RyaW5nKCksIGtleXNbaV0udG9TdHJpbmcoKSk7Ci0JCQkJCQkJZkRlc2NyaXB0b3JzW2ldID0gZGVzY3JpcHRvcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChmQW5ub3RhdGlvbiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pIHsKLQkJCQkJCU9iamVjdCBrZXkgPSAoKFRlbXBvcmFyeUFubm90YXRpb24pIGZBbm5vdGF0aW9uKS5nZXRLZXkoKTsKLQkJCQkJCWlmIChrZXkgIT0gbnVsbCAmJiBrZXkgaW5zdGFuY2VvZiBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KSB7Ci0JCQkJCQkJU3RyaW5nW10ga2V5cyA9IFRFTVBPUkFSWV9BTk5PVEFUSU9OX0tFWVM7Ci0JCQkJCQkJZkRlc2NyaXB0b3JzID0gbmV3IElQcm9wZXJ0eURlc2NyaXB0b3Jba2V5cy5sZW5ndGhdOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlUZXh0UHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcihrZXlzW2ldLnRvU3RyaW5nKCksIGtleXNbaV0udG9TdHJpbmcoKSk7Ci0JCQkJCQkJCWZEZXNjcmlwdG9yc1tpXSA9IGRlc2NyaXB0b3I7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZkRlc2NyaXB0b3JzID09IG51bGwpCi0JCQkJZkRlc2NyaXB0b3JzID0gbmV3IElQcm9wZXJ0eURlc2NyaXB0b3JbMF07Ci0JCQlyZXR1cm4gZkRlc2NyaXB0b3JzOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkgewotCQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJCWlmIChmQW5ub3RhdGlvbiBpbnN0YW5jZW9mIFNpbXBsZU1hcmtlckFubm90YXRpb24pIHsKLQkJCQlPYmplY3QgbzsKLQkJCQl0cnkgewotCQkJCQlvID0gKChTaW1wbGVNYXJrZXJBbm5vdGF0aW9uKSBmQW5ub3RhdGlvbikuZ2V0TWFya2VyKCkuZ2V0QXR0cmlidXRlcygpLmdldChpZCk7Ci0JCQkJCWlmIChvICE9IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gby50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChmQW5ub3RhdGlvbiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pIHsKLQkJCQlpZiAoVEVNUE9SQVJZX0FOTk9UQVRJT05fS0VZU1swXS5lcXVhbHMoaWQpKSB7Ci0JCQkJCU9iamVjdCBrZXkgPSAoKFRlbXBvcmFyeUFubm90YXRpb24pIGZBbm5vdGF0aW9uKS5nZXRLZXkoKTsKLQkJCQkJaWYgKGtleSAhPSBudWxsICYmIGtleSBpbnN0YW5jZW9mIFJlY29uY2lsZUFubm90YXRpb25LZXkpIHsKLQkJCQkJCXZhbHVlID0gKChSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KSBrZXkpLmdldFBhcnRpdGlvblR5cGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChURU1QT1JBUllfQU5OT1RBVElPTl9LRVlTWzFdLmVxdWFscyhpZCkpIHsKLQkJCQkJT2JqZWN0IGtleSA9ICgoVGVtcG9yYXJ5QW5ub3RhdGlvbikgZkFubm90YXRpb24pLmdldEtleSgpOwotCQkJCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5IGluc3RhbmNlb2YgUmVjb25jaWxlQW5ub3RhdGlvbktleSkgewotCQkJCQkJSVJlY29uY2lsZVN0ZXAgc3RlcCA9ICgoUmVjb25jaWxlQW5ub3RhdGlvbktleSkga2V5KS5nZXRTdGVwKCk7Ci0JCQkJCQlpZiAoc3RlcCAhPSBudWxsKSB7Ci0JCQkJCQkJdmFsdWUgPSBzdGVwLnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoVEVNUE9SQVJZX0FOTk9UQVRJT05fS0VZU1syXS5lcXVhbHMoaWQpKSB7Ci0JCQkJCU9iamVjdCBrZXkgPSAoKFRlbXBvcmFyeUFubm90YXRpb24pIGZBbm5vdGF0aW9uKS5nZXRLZXkoKTsKLQkJCQkJaWYgKGtleSAhPSBudWxsICYmIGtleSBpbnN0YW5jZW9mIFJlY29uY2lsZUFubm90YXRpb25LZXkpIHsKLQkJCQkJCWludCBzY29wZSA9ICgoUmVjb25jaWxlQW5ub3RhdGlvbktleSkga2V5KS5nZXRTY29wZSgpOwotCQkJCQkJaWYgKHNjb3BlID09IFJlY29uY2lsZUFubm90YXRpb25LZXkuUEFSVElBTCkgewotCQkJCQkJCXZhbHVlID0gIlBBUlRJQUwiOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlpZiAoc2NvcGUgPT0gUmVjb25jaWxlQW5ub3RhdGlvbktleS5UT1RBTCkgewotCQkJCQkJCXZhbHVlID0gIlRPVEFMIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKFRFTVBPUkFSWV9BTk5PVEFUSU9OX0tFWVNbM10uZXF1YWxzKGlkKSkgewotCQkJCQlJQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCA9IGZUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXRBbm5vdGF0aW9uTW9kZWwoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCVBvc2l0aW9uIHAgPSBhbm5vdGF0aW9uTW9kZWwuZ2V0UG9zaXRpb24oZkFubm90YXRpb24pOwotCQkJCQlpZiAocCAhPSBudWxsKSB7Ci0JCQkJCQl2YWx1ZSA9IFN0cmluZy52YWx1ZU9mKHAuZ2V0T2Zmc2V0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKFRFTVBPUkFSWV9BTk5PVEFUSU9OX0tFWVNbNF0uZXF1YWxzKGlkKSkgewotCQkJCQlJQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCA9IGZUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXRBbm5vdGF0aW9uTW9kZWwoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCVBvc2l0aW9uIHAgPSBhbm5vdGF0aW9uTW9kZWwuZ2V0UG9zaXRpb24oZkFubm90YXRpb24pOwotCQkJCQlpZiAocCAhPSBudWxsKSB7Ci0JCQkJCQl2YWx1ZSA9IFN0cmluZy52YWx1ZU9mKHAuZ2V0TGVuZ3RoKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKFRFTVBPUkFSWV9BTk5PVEFUSU9OX0tFWVNbNV0uZXF1YWxzKGlkKSkgewotCQkJCQl2YWx1ZSA9ICgoVGVtcG9yYXJ5QW5ub3RhdGlvbikgZkFubm90YXRpb24pLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgaWQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZBbm5vdGF0aW9uIGluc3RhbmNlb2YgU2ltcGxlTWFya2VyQW5ub3RhdGlvbikgewotCQkJCQkoKFNpbXBsZU1hcmtlckFubm90YXRpb24pIGZBbm5vdGF0aW9uKS5nZXRNYXJrZXIoKS5nZXRBdHRyaWJ1dGVzKCkucmVtb3ZlKGlkKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZkFubm90YXRpb24gaW5zdGFuY2VvZiBUZW1wb3JhcnlBbm5vdGF0aW9uKSB7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCwgT2JqZWN0IHZhbHVlKSB7Ci0JCQl0cnkgewotCQkJCWlmIChmQW5ub3RhdGlvbiBpbnN0YW5jZW9mIFNpbXBsZU1hcmtlckFubm90YXRpb24pIHsKLQkJCQkJKChNYXJrZXJBbm5vdGF0aW9uKSBmQW5ub3RhdGlvbikuZ2V0TWFya2VyKCkuc2V0QXR0cmlidXRlKGlkLnRvU3RyaW5nKCksIHZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZkFubm90YXRpb24gaW5zdGFuY2VvZiBUZW1wb3JhcnlBbm5vdGF0aW9uKSB7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBJbmZvcm1hdGlvbkRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQkJSURvY3VtZW50IGZEb2N1bWVudCA9IGZUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQotCQlwdWJsaWMgSW5mb3JtYXRpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGlvblRhYkNvbnRlbnRzKENvbXBvc2l0ZSBhbm5vdGF0aW9uc1RhYkNvbXBvc2l0ZSkgewotCQkJYW5ub3RhdGlvbnNUYWJDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJYW5ub3RhdGlvbnNUYWJDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJCWZpbmFsIENvbXBvc2l0ZSBhbm5vdGF0aW9uc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoYW5ub3RhdGlvbnNUYWJDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWFubm90YXRpb25zQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCi0JCQlmaW5hbCBUYWJsZVZpZXdlciBhbm5vdGF0aW9uc1RhYmxlID0gbmV3IFRhYmxlVmlld2VyKGFubm90YXRpb25zQ29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCQlhbm5vdGF0aW9uc1RhYmxlLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IobmV3IENvbXBhcmF0b3IoKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJCUFubm90YXRpb24gYW5ub3RhdGlvbjEgPSAoQW5ub3RhdGlvbikgbzE7Ci0JCQkJCUFubm90YXRpb24gYW5ub3RhdGlvbjIgPSAoQW5ub3RhdGlvbikgbzI7Ci0JCQkJCVN0cmluZyBsaW5lMSA9IGdldExpbmVOdW1iZXIoYW5ub3RhdGlvbjEpOwotCQkJCQlTdHJpbmcgbGluZTIgPSBnZXRMaW5lTnVtYmVyKGFubm90YXRpb24yKTsKLQkJCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQobGluZTEpIC0gSW50ZWdlci5wYXJzZUludChsaW5lMik7Ci0JCQkJfQotCQkJfSkpOwotCQkJYW5ub3RhdGlvbnNUYWJsZS5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQkJYW5ub3RhdGlvbnNUYWJsZS5nZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCQlhbm5vdGF0aW9uc1RhYmxlLmdldFRhYmxlKCkuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQkJU3RyaW5nW10gY29sdW1ucyA9IG5ldyBTdHJpbmdbXXsiTGluZSIsICJPd25lciIsICJUeXBlIiwgIkNsYXNzIiwgIk1lc3NhZ2UifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQlhbm5vdGF0aW9uc1RhYmxlLnNldExhYmVsUHJvdmlkZXIobmV3IElUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEFubm90YXRpb24pIGVsZW1lbnQ7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCQkJY2FzZSAwIDoKLQkJCQkJCQl0ZXh0ID0gZ2V0TGluZU51bWJlcihhbm5vdGF0aW9uKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMSA6Ci0JCQkJCQkJdGV4dCA9IGdldE93bmVyKGFubm90YXRpb24pOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAyIDoKLQkJCQkJCQl0ZXh0ID0gZ2V0VHlwZShhbm5vdGF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAzIDoKLQkJCQkJCQl0ZXh0ID0gYW5ub3RhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgNCA6Ci0JCQkJCQkJdGV4dCA9IGFubm90YXRpb24uZ2V0VGV4dCgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmICh0ZXh0ID09IG51bGwpCi0JCQkJCQl0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIHRleHQ7Ci0JCQkJfQotCi0KLQkJCQlwcml2YXRlIFN0cmluZyBnZXRPd25lcihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJCQkJU3RyaW5nIG93bmVyID0gbnVsbDsKLQkJCQkJaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBNYXJrZXJBbm5vdGF0aW9uKSB7Ci0JCQkJCQlvd25lciA9ICgoTWFya2VyQW5ub3RhdGlvbikgYW5ub3RhdGlvbikuZ2V0TWFya2VyKCkuZ2V0QXR0cmlidXRlKCJvd25lciIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQJCQkJCi0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pIHsKLQkJCQkJCU9iamVjdCBrZXkgPSAoKFRlbXBvcmFyeUFubm90YXRpb24pIGFubm90YXRpb24pLmdldEtleSgpOwotCQkJCQkJaWYgKGtleSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKGtleSBpbnN0YW5jZW9mIFJlY29uY2lsZUFubm90YXRpb25LZXkpIHsKLQkJCQkJCQkJa2V5ID0ga2V5LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoa2V5ICE9IG51bGwpCi0JCQkJCQkJCW93bmVyID0ga2V5LnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG93bmVyOwotCQkJCX0KLQotCQkJCXByaXZhdGUgU3RyaW5nIGdldFR5cGUoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCQkJCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJCQkJaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBNYXJrZXJBbm5vdGF0aW9uKSB7Ci0JCQkJCQl0eXBlID0gIk06IitNYXJrZXJVdGlsaXRpZXMuZ2V0TWFya2VyVHlwZSgoKE1hcmtlckFubm90YXRpb24pIGFubm90YXRpb24pLmdldE1hcmtlcigpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdHlwZSA9ICJBOiIrYW5ub3RhdGlvbi5nZXRUeXBlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAodHlwZSA9PSBudWxsKQotCQkJCQkJdHlwZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiB0eXBlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJVGFibGVMYXlvdXQgdGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQkJQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbY29sdW1ucy5sZW5ndGhdOwotCQkJaW50IGNvbHVtbldpZHRoc1tdID0gbmV3IGludFtde0Rpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEJvdW5kcygpLndpZHRoIC8gMTQsIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEJvdW5kcygpLndpZHRoIC8gNywgRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkud2lkdGggLyA3LCBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRCb3VuZHMoKS53aWR0aCAvIDE0LCBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRCb3VuZHMoKS53aWR0aCAvIDd9OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdGxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEpKTsKLQkJCQlUYWJsZUNvbHVtbiB0YyA9IG5ldyBUYWJsZUNvbHVtbihhbm5vdGF0aW9uc1RhYmxlLmdldFRhYmxlKCksIFNXVC5OT05FKTsKLQkJCQl0Yy5zZXRUZXh0KGNvbHVtbnNbaV0pOwotCQkJCXRjLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCQl0Yy5zZXRXaWR0aChjb2x1bW5XaWR0aHNbaV0pOwotCQkJfQotCQkJYW5ub3RhdGlvbnNUYWJsZS5zZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0JCQlhbm5vdGF0aW9uc1RhYmxlLnNldENvbHVtblByb3BlcnRpZXMoY29sdW1ucyk7Ci0JCQlMaXN0IG1hdGNoaW5nQW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQkJaWYgKGZUZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCQlJQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCA9IGZUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXRBbm5vdGF0aW9uTW9kZWwoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJaWYgKGFubm90YXRpb25Nb2RlbCAhPSBudWxsKSB7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gYW5ub3RhdGlvbk1vZGVsLmdldEFubm90YXRpb25JdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlBbm5vdGF0aW9uIGVsZW1lbnQgPSAoQW5ub3RhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKHRydWUpIHsKLQkJCQkJCQltYXRjaGluZ0Fubm90YXRpb25zLmFkZChlbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWFubm90YXRpb25zVGFibGUuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0JCQlhbm5vdGF0aW9uc1RhYmxlLnNldElucHV0KG1hdGNoaW5nQW5ub3RhdGlvbnMpOwotCi0JCQlmaW5hbCBTYXNoIHNhc2ggPSBuZXcgU2FzaChhbm5vdGF0aW9uc0NvbXBvc2l0ZSwgU1dULkhPUklaT05UQUwpOwotCi0JCQlmaW5hbCBQcm9wZXJ0eVNoZWV0UGFnZSBwcm9wZXJ0eVNoZWV0ID0gbmV3IFByb3BlcnR5U2hlZXRQYWdlKCk7Ci0JCQlwcm9wZXJ0eVNoZWV0LmNyZWF0ZUNvbnRyb2woYW5ub3RhdGlvbnNDb21wb3NpdGUpOwotCQkJcHJvcGVydHlTaGVldC5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKG5ldyBJUHJvcGVydHlTb3VyY2VQcm92aWRlcigpIHsKLQkJCQlwdWJsaWMgSVByb3BlcnR5U291cmNlIGdldFByb3BlcnR5U291cmNlKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFubm90YXRpb24pIHsKLQkJCQkJCUlQcm9wZXJ0eVNvdXJjZSBhbm5vdGF0aW9uUHJvcGVydHlTb3VyY2UgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5U291cmNlKCgoQW5ub3RhdGlvbikgb2JqZWN0KSk7Ci0JCQkJCQlyZXR1cm4gYW5ub3RhdGlvblByb3BlcnR5U291cmNlOwotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0pOwotCi0JCQlhbm5vdGF0aW9uc1RhYmxlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlwcm9wZXJ0eVNoZWV0LnNlbGVjdGlvbkNoYW5nZWQobnVsbCwgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX0pOwotCi0JCQlmaW5hbCBGb3JtTGF5b3V0IGZvcm0gPSBuZXcgRm9ybUxheW91dCgpOwotCQkJYW5ub3RhdGlvbnNDb21wb3NpdGUuc2V0TGF5b3V0KGZvcm0pOwotCi0JCQlGb3JtRGF0YSB0YWJsZURhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJCXRhYmxlRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCQl0YWJsZURhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KHNhc2gsIDIpOwotCQkJdGFibGVEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCQl0YWJsZURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJCWFubm90YXRpb25zVGFibGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEodGFibGVEYXRhKTsKLQotCQkJRm9ybURhdGEgcHJvcGVydGllc0RhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJCXByb3BlcnRpZXNEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChzYXNoLCAyKTsKLQkJCXByb3BlcnRpZXNEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCQlwcm9wZXJ0aWVzRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQkJcHJvcGVydGllc0RhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCQlwcm9wZXJ0eVNoZWV0LmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKHByb3BlcnRpZXNEYXRhKTsKLQotCQkJZmluYWwgRm9ybURhdGEgc2FzaERhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJCXNhc2hEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCg2MCwgMCk7Ci0JCQlzYXNoRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQkJc2FzaERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJCXNhc2guc2V0TGF5b3V0RGF0YShzYXNoRGF0YSk7Ci0JCQlzYXNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCXNhc2hEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCBlLnkpOwotCQkJCQlhbm5vdGF0aW9uc0NvbXBvc2l0ZS5sYXlvdXQoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWFubm90YXRpb25zQ29tcG9zaXRlLnBhY2sodHJ1ZSk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCQkgKi8KLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGZUZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gbnVsbDsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCQlzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0KLQkJCXBhcmVudC5nZXRTaGVsbCgpLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8wICsgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArICItIiArICh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJCVRleHQgZG9jdW1lbnRUeXBlTGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZG9jdW1lbnRUeXBlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlkb2N1bWVudFR5cGVMYWJlbC5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fNiArIGZEb2N1bWVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJVGV4dCBkb2N1bWVudFByb3ZpZGVyTGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZG9jdW1lbnRQcm92aWRlckxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJZG9jdW1lbnRQcm92aWRlckxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV83ICsgZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlUZXh0IGVkaXRvcklucHV0TGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZWRpdG9ySW5wdXRMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCWVkaXRvcklucHV0TGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzEyICsgZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJZmluYWwgVGV4dCBib21MYWJlbCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlib21MYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCWJvbUxhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJYm9tTGFiZWwuc2V0VGV4dCgiQnl0ZSBPcmRlciBNYXJrOiAiKTsKLQotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJVGV4dCBtb2RlbElkTGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQkJbW9kZWxJZExhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJCW1vZGVsSWRMYWJlbC5zZXRUZXh0KCJJRDogIiArIG1vZGVsLmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQlUZXh0IG1vZGVsQmFzZUxvY2F0aW9uTGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQkJbW9kZWxCYXNlTG9jYXRpb25MYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCQltb2RlbEJhc2VMb2NhdGlvbkxhYmVsLnNldFRleHQoIkJhc2UgTG9jYXRpb246ICIgKyBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCVRleHQgbW9kZWxDb250ZW50VHlwZUxhYmVsID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCW1vZGVsQ29udGVudFR5cGVMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCQltb2RlbENvbnRlbnRUeXBlTGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzQgKyBtb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCVRleHQgbW9kZWxIYW5kbGVyQ29udGVudFR5cGVMYWJlbCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQkJbW9kZWxIYW5kbGVyQ29udGVudFR5cGVMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCQltb2RlbEhhbmRsZXJDb250ZW50VHlwZUxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV81ICsgbW9kZWwuZ2V0TW9kZWxIYW5kbGVyKCkuZ2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoKSArICIgKCIgKyBtb2RlbC5nZXRNb2RlbEhhbmRsZXIoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJCQlmaW5hbCBUZXh0IGNvdW50cyA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQkJY291bnRzLnNldExheW91dERhdGEoZ2QpOwotCQkJCWNvdW50cy5zZXRUZXh0KCJDb3VudGluZy4uLiIpOwotCQkJCWNvdW50cy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlmaW5hbCBJU3RydWN0dXJlZE1vZGVsIGZpbmFsTW9kZWwgPSBtb2RlbDsKLQkJCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJCQlKb2IgY291bnRlciA9IG5ldyBKb2IoIkNvdW50aW5nIHJlZ2lvbnMiKSB7Ci0JCQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gZmluYWxNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCQkJCQlpbnQgbGVuZ3RoID0gZmluYWxNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQkJCQkJCWludCByZWdpb25Db3VudCA9IDA7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlyZWdpb25Db3VudCArPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zW2ldLmdldE51bWJlck9mUmVnaW9ucygpOwotCQkJCQkJfQotCQkJCQkJTnVtYmVyRm9ybWF0IGZvcm1hdHRlciA9IE51bWJlckZvcm1hdC5nZXRJbnRlZ2VySW5zdGFuY2UoKTsKLQkJCQkJCWZpbmFsIFN0cmluZyByZWdpb25jb3VudCA9ICJDb3VudDogIiArIGZvcm1hdHRlci5mb3JtYXQoc3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5sZW5ndGgpICsgIiBkb2N1bWVudCByZWdpb25zIGNvbnRhaW5pbmcgIiArIGZvcm1hdHRlci5mb3JtYXQocmVnaW9uQ291bnQpICsgIiB0ZXh0IHJlZ2lvbnMgcmVwcmVzZW50aW5nICIgKyBmb3JtYXR0ZXIuZm9ybWF0KGxlbmd0aCkgKyAiIGNoYXJhY3RlcnMiOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCWlmICghY291bnRzLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQkJY291bnRzLnNldFRleHQocmVnaW9uY291bnQpOwotCQkJCQkJCQkJY291bnRzLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKCFib21MYWJlbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQkJCWJvbUxhYmVsLnNldFRleHQoIkJ5dGUgT3JkZXIgTWFyazogIiArIGdldEJPTVRleHQoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlib21MYWJlbC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJfQotCQkJCX07Ci0JCQkJY291bnRlci5zY2hlZHVsZSgxMDAwKTsKLQotCQkJCUxhYmVsIGJsYW5rUm93ID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQlibGFua1Jvdy5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCX0KLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0KLQkJCVRhYkZvbGRlciB0YWJmb2xkZXIgPSBuZXcgVGFiRm9sZGVyKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJdGFiZm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCQlUYWJJdGVtIHBhcnRpdGlvblRhYiA9IG5ldyBUYWJJdGVtKHRhYmZvbGRlciwgU1dULkJPUkRFUik7Ci0JCQlwYXJ0aXRpb25UYWIuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzIpOyAvLyROT04tTkxTLTEkCi0JCQlTYXNoRm9ybSBwYXJ0aXRpb25zID0gbmV3IFNhc2hGb3JtKHRhYmZvbGRlciwgU1dULk5PTkUpOwotCQkJcGFydGl0aW9ucy5zZXRPcmllbnRhdGlvbihTV1QuVkVSVElDQUwpOwotCQkJcGFydGl0aW9uVGFiLnNldENvbnRyb2wocGFydGl0aW9ucyk7Ci0JCQljcmVhdGVQYXJ0aXRpb25UYWJDb250ZW50cyhwYXJ0aXRpb25zKTsKLQkJCXBhcnRpdGlvbnMuc2V0V2VpZ2h0cyhuZXcgaW50W117MiwgMX0pOwotCi0JCQlUYWJJdGVtIGFubm90YXRpb25zVGFiID0gbmV3IFRhYkl0ZW0odGFiZm9sZGVyLCBTV1QuQk9SREVSKTsKLQkJCWFubm90YXRpb25zVGFiLnNldFRleHQoIkFubm90YXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJCUNvbXBvc2l0ZSBhbm5vdGF0aW9ucyA9IG5ldyBDb21wb3NpdGUodGFiZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCQlhbm5vdGF0aW9uc1RhYi5zZXRDb250cm9sKGFubm90YXRpb25zKTsKLQkJCWNyZWF0ZUFubm90YXRpb25UYWJDb250ZW50cyhhbm5vdGF0aW9ucyk7Ci0KLQkJCS8vIG9ubHkgY3JlYXRlIHRoZSBJVGV4dFJlZ2lvbnMgdGFiIGZvciBJU3RydWN0dXJlZERvY3VtZW50cwotCQkJaWYgKGZEb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlUYWJJdGVtIHJlZ2lvblRhYiA9IG5ldyBUYWJJdGVtKHRhYmZvbGRlciwgU1dULkJPUkRFUik7Ci0JCQkJcmVnaW9uVGFiLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8zKTsgLy8kTk9OLU5MUy0xJAotCQkJCVNhc2hGb3JtIHJlZ2lvbnMgPSBuZXcgU2FzaEZvcm0odGFiZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCQkJcmVnaW9ucy5zZXRPcmllbnRhdGlvbihTV1QuSE9SSVpPTlRBTCk7Ci0JCQkJcmVnaW9uVGFiLnNldENvbnRyb2wocmVnaW9ucyk7Ci0JCQkJY3JlYXRlUmVnaW9uVGFiQ29udGVudHMocmVnaW9ucyk7Ci0JCQkJcmVnaW9ucy5zZXRXZWlnaHRzKG5ldyBpbnRbXXszLCAyfSk7Ci0JCQl9Ci0KLQkJCWlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCQlUYWJJdGVtIGVkaXRvclNlbGVjdGlvblRhYiA9IG5ldyBUYWJJdGVtKHRhYmZvbGRlciwgU1dULkJPUkRFUik7Ci0JCQkJZWRpdG9yU2VsZWN0aW9uVGFiLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xNCk7Ci0JCQkJQ29tcG9zaXRlIGVkaXRvclNlbGVjdGlvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCQkJZWRpdG9yU2VsZWN0aW9uVGFiLnNldENvbnRyb2woZWRpdG9yU2VsZWN0aW9uQ29tcG9zaXRlKTsKLQkJCQlmaWxsU2VsZWN0aW9uVGFiQ29udGVudHMoZWRpdG9yU2VsZWN0aW9uQ29tcG9zaXRlLCBzdHJ1Y3R1cmVkU2VsZWN0aW9uLnRvTGlzdCgpLCAiQ2xhc3M6ICIgKyBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJVGFiSXRlbSBvdmVybGFwcGluZ0luZGV4ZWRSZWdpb25zVGFiID0gbmV3IFRhYkl0ZW0odGFiZm9sZGVyLCBTV1QuQk9SREVSKTsKLQkJCQlvdmVybGFwcGluZ0luZGV4ZWRSZWdpb25zVGFiLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8yMCk7Ci0JCQkJQ29tcG9zaXRlIG92ZXJsYXBwaW5nSW5kZXhlZFJlZ2lvbnNUYWJDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRhYmZvbGRlciwgU1dULk5PTkUpOwotCQkJCW92ZXJsYXBwaW5nSW5kZXhlZFJlZ2lvbnNUYWIuc2V0Q29udHJvbChvdmVybGFwcGluZ0luZGV4ZWRSZWdpb25zVGFiQ29tcG9zaXRlKTsKLQkJCQlmaWxsU2VsZWN0aW9uVGFiQ29udGVudHMob3ZlcmxhcHBpbmdJbmRleGVkUmVnaW9uc1RhYkNvbXBvc2l0ZSwgZ2V0SW5kZXhlZFJlZ2lvbnModGV4dFNlbGVjdGlvbiksICJBbGwgSW5kZXhlZFJlZ2lvbnMgb3ZlcmxhcHBpbmcgdGV4dCBzZWxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCi0JCQlJRWRpdG9yU2l0ZSBzaXRlID0gZlRleHRFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpOwotCQkJaWYgKHNpdGUgIT0gbnVsbCkgewotCQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gc2l0ZS5nZXRXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCQkJSVNlbGVjdGlvblNlcnZpY2Ugc2VydmljZSA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCk7Ci0JCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uRnJvbVNlcnZpY2UgPSBzZXJ2aWNlLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VydmljZSAhPSBudWxsICYmICFzZWxlY3Rpb25Gcm9tU2VydmljZS5lcXVhbHMoc3RydWN0dXJlZFNlbGVjdGlvbikgJiYgc2VsZWN0aW9uRnJvbVNlcnZpY2UgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQkJVGFiSXRlbSBzZWxlY3Rpb25TZXJ2aWNlVGFiID0gbmV3IFRhYkl0ZW0odGFiZm9sZGVyLCBTV1QuQk9SREVSKTsKLQkJCQkJCXNlbGVjdGlvblNlcnZpY2VUYWIuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE5KTsKLQkJCQkJCUNvbXBvc2l0ZSBzZWxlY3Rpb25TZXJ2aWNlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0YWJmb2xkZXIsIFNXVC5OT05FKTsKLQkJCQkJCXNlbGVjdGlvblNlcnZpY2VUYWIuc2V0Q29udHJvbChzZWxlY3Rpb25TZXJ2aWNlQ29tcG9zaXRlKTsKLQkJCQkJCWZpbGxTZWxlY3Rpb25UYWJDb250ZW50cyhzZWxlY3Rpb25TZXJ2aWNlQ29tcG9zaXRlLCAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb25Gcm9tU2VydmljZSkudG9MaXN0KCksICJDbGFzczogIiArIHNlbGVjdGlvbkZyb21TZXJ2aWNlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBlZGl0b3JJbnB1dAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBnZXRCT01UZXh0KElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgewotCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgZWRpdG9ySW5wdXQuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7Ci0JCQlTdHJpbmcgZGV0ZWN0ZWRCT00gPSAibm9uZSI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlJbnB1dFN0cmVhbSBzID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlzID0gZmlsZS5nZXRDb250ZW50cyh0cnVlKTsKLQkJCQkJaWYgKHMgIT0gbnVsbCkgewotCQkJCQkJaW50IGIxID0gcy5yZWFkKCkgJiAweEZGOwotCQkJCQkJaW50IGIyID0gcy5yZWFkKCkgJiAweEZGOwotCQkJCQkJaWYgKGIxID09IDB4RkUgJiYgYjIgPT0gMHhGRikgewotCQkJCQkJCWRldGVjdGVkQk9NID0gIkZFIEZGIChVVEYtMTZCRSkiOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChiMSA9PSAweEZGICYmIGIyID09IDB4RkUpIHsKLQkJCQkJCQlkZXRlY3RlZEJPTSA9ICJGRiBGRSAoVVRGLTE2TEUpIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJaW50IGIzID0gcy5yZWFkKCkgJiAweEZGOwotCQkJCQkJCWlmIChiMSA9PSAweEVGICYmIGIyID09IDB4QkIgJiYgYjMgPT0gMHhCRikgewotCQkJCQkJCQlkZXRlY3RlZEJPTSA9ICJFRiBCQiBCRiAoVVRGLTgpIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZGV0ZWN0ZWRCT00gPSBlLmdldE1lc3NhZ2UoKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChzICE9IG51bGwpCi0JCQkJCQl0cnkgewotCQkJCQkJCXMuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZGV0ZWN0ZWRCT00gPSAiTi9BIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIGRldGVjdGVkQk9NOwotCQl9Ci0KLQkJcHJpdmF0ZSBMaXN0IGdldEluZGV4ZWRSZWdpb25zKElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJCVNldCBvdmVybGFwcGluZ0luZGV4ZWRSZWdpb25zID0gbmV3IEhhc2hTZXQoMik7Ci0JCQlpbnQgc3RhcnQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotCQkJaW50IGVuZCA9IHN0YXJ0ICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykgewotCQkJCQlJbmRleGVkUmVnaW9uIHIgPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGkpOwotCQkJCQlpZiAociAhPSBudWxsKSB7Ci0JCQkJCQlvdmVybGFwcGluZ0luZGV4ZWRSZWdpb25zLmFkZChyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQotCQkJcmV0dXJuIEFycmF5cy5hc0xpc3Qob3ZlcmxhcHBpbmdJbmRleGVkUmVnaW9ucy50b0FycmF5KCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBzYXNoCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlUGFydGl0aW9uVGFiQ29udGVudHMoU2FzaEZvcm0gc2FzaCkgewotCQkJQ29tcG9zaXRlIHBhcnRpb25pbmdDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNhc2gsIFNXVC5OT05FKTsKLQkJCXBhcnRpb25pbmdDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCQlwYXJ0aW9uaW5nQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCi0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJ0aW9uaW5nQ29tcG9zaXRlLCBTV1QuU0lOR0xFKTsKLQkJCWxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV84KTsgLy8kTk9OLU5MUy0xJAotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJCWZpbmFsIENvbWJvIHBhcnRpdGlvbmluZ0NvbWJvID0gbmV3IENvbWJvKHBhcnRpb25pbmdDb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQkJcGFydGl0aW9uaW5nQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCi0JCQlmaW5hbCBMYWJlbCBwYXJ0aXRpb25lckluc3RhbmNlTGFiZWwgPSBuZXcgTGFiZWwocGFydGlvbmluZ0NvbXBvc2l0ZSwgU1dULlNJTkdMRSk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCXBhcnRpdGlvbmVySW5zdGFuY2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJZmluYWwgVGFibGVWaWV3ZXIgZlBhcnRpdGlvblRhYmxlID0gbmV3IFRhYmxlVmlld2VyKHBhcnRpb25pbmdDb21wb3NpdGUsIFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZlBhcnRpdGlvblRhYmxlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCWZQYXJ0aXRpb25UYWJsZS5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQkJZlBhcnRpdGlvblRhYmxlLmdldFRhYmxlKCkuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJCWZQYXJ0aXRpb25UYWJsZS5nZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJCVN0cmluZ1tdIGNvbHVtbnMgPSBuZXcgU3RyaW5nW117U1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV85LCBTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzEwLCBTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzExfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCWZQYXJ0aXRpb25UYWJsZS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBJVGFibGVMYWJlbFByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCX0KLQotCQkJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCUlUeXBlZFJlZ2lvbiBwYXJ0aXRpb24gPSAoSVR5cGVkUmVnaW9uKSBlbGVtZW50OwotCQkJCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQkJCWNhc2UgMCA6Ci0JCQkJCQkJdGV4dCA9IEludGVnZXIudG9TdHJpbmcocGFydGl0aW9uLmdldE9mZnNldCgpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMSA6Ci0JCQkJCQkJdGV4dCA9IEludGVnZXIudG9TdHJpbmcocGFydGl0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJdGV4dCA9IHBhcnRpdGlvbi5nZXRUeXBlKCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCQkJCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gdGV4dDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCX0KLQkJCX0pOwotCQkJVGFibGVMYXlvdXQgdGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQkJQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbY29sdW1ucy5sZW5ndGhdOwotCQkJaW50IGNvbHVtbldpZHRoc1tdID0gbmV3IGludFtde0Rpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEJvdW5kcygpLndpZHRoIC8gMTQsIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEJvdW5kcygpLndpZHRoIC8gMTQsIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEJvdW5kcygpLndpZHRoIC8gNX07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCQl0bGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMSkpOwotCQkJCVRhYmxlQ29sdW1uIHRjID0gbmV3IFRhYmxlQ29sdW1uKGZQYXJ0aXRpb25UYWJsZS5nZXRUYWJsZSgpLCBTV1QuTk9ORSk7Ci0JCQkJdGMuc2V0VGV4dChjb2x1bW5zW2ldKTsKLQkJCQl0Yy5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCQkJdGMuc2V0V2lkdGgoY29sdW1uV2lkdGhzW2ldKTsKLQkJCX0KLQkJCWZQYXJ0aXRpb25UYWJsZS5zZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0JCQlmUGFydGl0aW9uVGFibGUuc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5zKTsKLQkJCWZpbmFsIFN0cmluZ1tdIHBhcnRpdGlvbmluZ3MgPSAoZkRvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMykgPyAoKElEb2N1bWVudEV4dGVuc2lvbjMpIGZEb2N1bWVudCkuZ2V0UGFydGl0aW9uaW5ncygpIDogbmV3IFN0cmluZ1tde0lEb2N1bWVudEV4dGVuc2lvbjMuREVGQVVMVF9QQVJUSVRJT05JTkd9OwotCQkJcGFydGl0aW9uaW5nQ29tYm8uc2V0SXRlbXMocGFydGl0aW9uaW5ncyk7Ci0JCQlwYXJ0aXRpb25pbmdDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUlTZWxlY3Rpb24gc2VsID0gZlRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIHBhcnRpdGlvbmVyVGV4dCA9IGZEb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjMgPyAoKElEb2N1bWVudEV4dGVuc2lvbjMpIGZEb2N1bWVudCkuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihwYXJ0aXRpb25pbmdDb21iby5nZXRJdGVtKHBhcnRpdGlvbmluZ0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpKS50b1N0cmluZygpIDogKCIiICsgZkRvY3VtZW50LmdldERvY3VtZW50UGFydGl0aW9uZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXBhcnRpdGlvbmVySW5zdGFuY2VMYWJlbC5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTMgKyBwYXJ0aXRpb25lclRleHQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlmUGFydGl0aW9uVGFibGUuc2V0SW5wdXQoVGV4dFV0aWxpdGllcy5jb21wdXRlUGFydGl0aW9uaW5nKGZEb2N1bWVudCwgcGFydGl0aW9uaW5nQ29tYm8uZ2V0SXRlbShwYXJ0aXRpb25pbmdDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKSwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSwgdHJ1ZSkpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlMSkgewotCQkJCQkJZlBhcnRpdGlvblRhYmxlLnNldElucHV0KG5ldyBJVHlwZWRSZWdpb25bMF0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQl0cnkgewotCQkJCWlmIChwYXJ0aXRpb25pbmdzLmxlbmd0aCA+IDApIHsKLQkJCQkJU3RyaW5nIHNlbGVjdGVkUGFydGl0aW9uaW5nID0gcGFydGl0aW9uaW5nQ29tYm8uZ2V0SXRlbSgwKTsKLQkJCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhwYXJ0aXRpb25pbmdzLCBJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HKSkgewotCQkJCQkJc2VsZWN0ZWRQYXJ0aXRpb25pbmcgPSBJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aXRpb25pbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaWYgKHBhcnRpdGlvbmluZ3NbaV0uZXF1YWxzKElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcpKSB7Ci0JCQkJCQkJCXBhcnRpdGlvbmluZ0NvbWJvLnNlbGVjdChpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlwYXJ0aXRpb25pbmdDb21iby5zZWxlY3QoMCk7Ci0JCQkJCX0KLQkJCQkJSVNlbGVjdGlvbiBzZWwgPSBmVGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWw7Ci0JCQkJCUlUeXBlZFJlZ2lvbltdIHBhcnRpdGlvbnMgPSBUZXh0VXRpbGl0aWVzLmNvbXB1dGVQYXJ0aXRpb25pbmcoZkRvY3VtZW50LCBzZWxlY3RlZFBhcnRpdGlvbmluZywgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSwgdHJ1ZSk7Ci0JCQkJCWZQYXJ0aXRpb25UYWJsZS5zZXRJbnB1dChwYXJ0aXRpb25zKTsKLQkJCQkJU3RyaW5nIHBhcnRpdGlvbmVyVGV4dCA9IGZEb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjMgPyAoKElEb2N1bWVudEV4dGVuc2lvbjMpIGZEb2N1bWVudCkuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihwYXJ0aXRpb25pbmdDb21iby5nZXRJdGVtKHBhcnRpdGlvbmluZ0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpKS50b1N0cmluZygpIDogKCIiICsgZkRvY3VtZW50LmdldERvY3VtZW50UGFydGl0aW9uZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcGFydGl0aW9uZXJJbnN0YW5jZUxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xMyArIHBhcnRpdGlvbmVyVGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUlTZWxlY3Rpb24gc2VsID0gZlRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsOwotCQkJCQlmUGFydGl0aW9uVGFibGUuc2V0SW5wdXQoZkRvY3VtZW50LmNvbXB1dGVQYXJ0aXRpb25pbmcodGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSkpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlMSkgewotCQkJCWZQYXJ0aXRpb25UYWJsZS5zZXRJbnB1dChuZXcgSVR5cGVkUmVnaW9uWzBdKTsKLQkJCX0KLQkJCXBhcnRpdGlvbmluZ0NvbWJvLnNldEZvY3VzKCk7Ci0KLQotCQkJZmluYWwgU3R5bGVkVGV4dCB0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2FzaCwgU1dULk1VTFRJIHwgU1dULlJFQURfT05MWSk7Ci0JCQlmUGFydGl0aW9uVGFibGUuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCQlJUmVnaW9uIHBhcnRpdGlvbiA9IChJUmVnaW9uKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBmVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCQlTdHJpbmcgc291cmNlOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzb3VyY2UgPSBkb2N1bWVudC5nZXQocGFydGl0aW9uLmdldE9mZnNldCgpLCBwYXJ0aXRpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCXRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQl0ZXh0LnNldFRleHQoc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJdGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZVJlZ2lvblRhYkNvbnRlbnRzKFNhc2hGb3JtIHNhc2hGb3JtKSB7Ci0JCQlJU2VsZWN0aW9uIHNlbCA9IGZUZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlmaW5hbCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWw7Ci0JCQlmaW5hbCBMaXN0IGRvY3VtZW50UmVnaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZkRvY3VtZW50OwotCQkJCWludCBwb3MgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotCQkJCWludCBlbmQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY1JlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3MpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGVuZCk7Ci0JCQkJaWYgKHBvcyA8IGVuZCkgewotCQkJCQl3aGlsZSAoZG9jUmVnaW9uICE9IGVuZFJlZ2lvbikgewotCQkJCQkJZG9jdW1lbnRSZWdpb25zLmFkZChkb2NSZWdpb24pOwotCQkJCQkJZG9jUmVnaW9uID0gZG9jUmVnaW9uLmdldE5leHQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlkb2N1bWVudFJlZ2lvbnMuYWRkKGRvY1JlZ2lvbik7Ci0JCQl9Ci0KLQkJCWZpbmFsIFRyZWVWaWV3ZXIgdHJlZSA9IG5ldyBUcmVlVmlld2VyKHNhc2hGb3JtLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkJZmluYWwgU3RyaW5nIFNUQVJUID0gU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xNTsgLy8kTk9OLU5MUy0xJAotCQkJZmluYWwgU3RyaW5nIExFTkdUSCA9IFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTY7IC8vJE5PTi1OTFMtMSQKLQkJCWZpbmFsIFN0cmluZyBURVhUTEVOR1RIID0gU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xNzsgLy8kTk9OLU5MUy0xJAotCQkJZmluYWwgU3RyaW5nIENPTlRFWFQgPSBTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE4OyAvLyROT04tTkxTLTEkCi0JCQl0cmVlLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQkJCWNoaWxkcmVuLmFkZEFsbChkb2N1bWVudFJlZ2lvbnMpOwotCQkJCQl9Ci0JCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHBhcmVudEVsZW1lbnQpLmdldFJlZ2lvbnMoKS50b0FycmF5KCkpOwotCQkJCQl9Ci0JCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVRleHRSZWdpb24pIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChuZXcgS2V5VmFsdWVQYWlyKENPTlRFWFQsICgoSVRleHRSZWdpb24pIHBhcmVudEVsZW1lbnQpLmdldFR5cGUoKSkpOwotCQkJCQkJY2hpbGRyZW4uYWRkKG5ldyBLZXlWYWx1ZVBhaXIoU1RBUlQsIEludGVnZXIudG9TdHJpbmcoKChJVGV4dFJlZ2lvbikgcGFyZW50RWxlbWVudCkuZ2V0U3RhcnQoKSkpKTsKLQkJCQkJCWNoaWxkcmVuLmFkZChuZXcgS2V5VmFsdWVQYWlyKFRFWFRMRU5HVEgsIEludGVnZXIudG9TdHJpbmcoKChJVGV4dFJlZ2lvbikgcGFyZW50RWxlbWVudCkuZ2V0VGV4dExlbmd0aCgpKSkpOwotCQkJCQkJY2hpbGRyZW4uYWRkKG5ldyBLZXlWYWx1ZVBhaXIoTEVOR1RILCBJbnRlZ2VyLnRvU3RyaW5nKCgoSVRleHRSZWdpb24pIHBhcmVudEVsZW1lbnQpLmdldExlbmd0aCgpKSkpOwotCQkJCQl9Ci0JCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVRleHRSZWdpb25MaXN0KSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoQXJyYXlzLmFzTGlzdCgoKElUZXh0UmVnaW9uTGlzdCkgcGFyZW50RWxlbWVudCkudG9BcnJheSgpKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGRBbGwoKENvbGxlY3Rpb24pIHBhcmVudEVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLQkJCQkJCWNoaWxkcmVuLmFkZEFsbChBcnJheXMuYXNMaXN0KChPYmplY3RbXSkgcGFyZW50RWxlbWVudCkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIGRvY3VtZW50UmVnaW9ucy50b0FycmF5KCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCQkJcmV0dXJuICgoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZWxlbWVudCkuZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkJcmV0dXJuICgoSVRleHRSZWdpb25Db250YWluZXIpIGVsZW1lbnQpLmdldFBhcmVudCgpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBmRG9jdW1lbnQ7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuICEoZWxlbWVudCBpbnN0YW5jZW9mIEtleVZhbHVlUGFpcik7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJfQotCQkJfSk7Ci0JCQl0cmVlLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgS2V5VmFsdWVQYWlyKQotCQkJCQkJcmV0dXJuICgoS2V5VmFsdWVQYWlyKSBlbGVtZW50KS5mS2V5LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSArICI6ICIgKyAoKEtleVZhbHVlUGFpcikgZWxlbWVudCkuZlZhbHVlOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBlbGVtZW50OwotCQkJCQkJaW50IHBhY2thZ2VOYW1lTGVuZ3RoID0gZG9jdW1lbnRSZWdpb24uZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQkJCQkJaWYgKHBhY2thZ2VOYW1lTGVuZ3RoID4gMCkKLQkJCQkJCQlwYWNrYWdlTmFtZUxlbmd0aCsrOwotCQkJCQkJU3RyaW5nIG5hbWUgPSBkb2N1bWVudFJlZ2lvbi5nZXRDbGFzcygpLmdldE5hbWUoKS5zdWJzdHJpbmcocGFja2FnZU5hbWVMZW5ndGgpOwotCQkJCQkJU3RyaW5nIHRleHQgPSAiWyIgKyBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgIi0iICsgZG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgKyAiXSAiICsgbmFtZSArICJAIiArIGVsZW1lbnQuaGFzaENvZGUoKSArICIgIiArIGRvY3VtZW50UmVnaW9uLmdldFR5cGUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQkJCQlyZXR1cm4gdGV4dDsKLQkJCQkJfQotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElUZXh0UmVnaW9uKSB7Ci0JCQkJCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gKElUZXh0UmVnaW9uKSBlbGVtZW50OwotCQkJCQkJaW50IHBhY2thZ2VOYW1lTGVuZ3RoID0gdGV4dFJlZ2lvbi5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkubGVuZ3RoKCk7Ci0JCQkJCQlpZiAocGFja2FnZU5hbWVMZW5ndGggPiAwKQotCQkJCQkJCXBhY2thZ2VOYW1lTGVuZ3RoKys7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IHRleHRSZWdpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkuc3Vic3RyaW5nKHBhY2thZ2VOYW1lTGVuZ3RoKTsKLQkJCQkJCVN0cmluZyB0ZXh0ID0gIlsiICsgdGV4dFJlZ2lvbi5nZXRTdGFydCgpICsgIi0iICsgdGV4dFJlZ2lvbi5nZXRFbmQoKSArICJdICIgKyBuYW1lICsgIkAiICsgZWxlbWVudC5oYXNoQ29kZSgpICsgIiAiICsgdGV4dFJlZ2lvbi5nZXRUeXBlKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJCQkJcmV0dXJuIHRleHQ7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQl0cmVlLnNldElucHV0KGZEb2N1bWVudCk7Ci0KLQotCQkJZmluYWwgVGV4dCBkaXNwbGF5VGV4dCA9IG5ldyBUZXh0KHNhc2hGb3JtLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JCQlkaXNwbGF5VGV4dC5zZXRCYWNrZ3JvdW5kKHNhc2hGb3JtLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCQl0cmVlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCQlpZiAobyBpbnN0YW5jZW9mIEtleVZhbHVlUGFpcikKLQkJCQkJCQlkaXNwbGF5VGV4dC5zZXRUZXh0KCgoS2V5VmFsdWVQYWlyKSBvKS5mVmFsdWUudG9TdHJpbmcoKSk7Ci0JCQkJCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0ID0gKElUZXh0U2VsZWN0aW9uKSBvOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWRpc3BsYXlUZXh0LnNldFRleHQoZkRvY3VtZW50LmdldCh0ZXh0LmdldE9mZnNldCgpLCB0ZXh0LmdldExlbmd0aCgpKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCWRpc3BsYXlUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJCQkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb24gPSAoSVRleHRSZWdpb25Db2xsZWN0aW9uKSBvOwotCQkJCQkJCWRpc3BsYXlUZXh0LnNldFRleHQocmVnaW9uLmdldEZ1bGxUZXh0KCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCWRpc3BsYXlUZXh0LnNldFRleHQoIiIgKyBvKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQlyZXR1cm4gc2FzaEZvcm07Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgZmlsbFNlbGVjdGlvblRhYkNvbnRlbnRzKENvbXBvc2l0ZSBhcmVhLCBMaXN0IHNlbGVjdGlvbiwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQlhcmVhLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWFyZWEuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJCUxhYmVsIHR5cGVOYW1lID0gbmV3IExhYmVsKGFyZWEsIFNXVC5XUkFQKTsKLQkJCXR5cGVOYW1lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXR5cGVOYW1lLnNldFRleHQoZGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCi0KLQkJCShuZXcgTGFiZWwoYXJlYSwgU1dULk5PTkUpKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSkpOwotCQkJU2FzaEZvcm0gc3RydWN0dXJlZFNhc2hGb3JtID0gbmV3IFNhc2hGb3JtKGFyZWEsIFNXVC5OT05FKTsKLQkJCXN0cnVjdHVyZWRTYXNoRm9ybS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJCXN0cnVjdHVyZWRTYXNoRm9ybS5zZXRPcmllbnRhdGlvbihTV1QuVkVSVElDQUwpOwotCi0JCQlmaW5hbCBUYWJsZVZpZXdlciBzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUgPSBuZXcgVGFibGVWaWV3ZXIoc3RydWN0dXJlZFNhc2hGb3JtLCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0KLQkJCXN0cnVjdHVyZWRTZWxlY3Rpb25UYWJsZS5nZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCQlzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCQlzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQkJcHVibGljIGludCBjYXRlZ29yeShPYmplY3QgZWxlbWVudCkgewotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pCi0JCQkJCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBlbGVtZW50KS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQlyZXR1cm4gc3VwZXIuY2F0ZWdvcnkoZWxlbWVudCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXN0cnVjdHVyZWRTZWxlY3Rpb25UYWJsZS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBJVGFibGVMYWJlbFByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCX0KLQotCQkJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXJGb3IgPSAoKElOb2RlTm90aWZpZXIpIGVsZW1lbnQpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJCQkJaWYgKGNvbHVtbkluZGV4ID09IDIgJiYgYWRhcHRlckZvciAhPSBudWxsICYmIGFkYXB0ZXJGb3IgaW5zdGFuY2VvZiBJSkZhY2VOb2RlQWRhcHRlcikgewotCQkJCQkJCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSUpGYWNlTm9kZUFkYXB0ZXIpIGFkYXB0ZXJGb3I7Ci0JCQkJCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0TGFiZWxJbWFnZSgoZWxlbWVudCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCQkJCWNhc2UgMCA6IHsKLQkJCQkJCQkJdGV4dCA9IFN0cmluZy52YWx1ZU9mKCgoTGlzdCkgc3RydWN0dXJlZFNlbGVjdGlvblRhYmxlLmdldElucHV0KCkpLmluZGV4T2YoZWxlbWVudCkpOwotCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAxIDogewotCQkJCQkJCQl0ZXh0ID0gZWxlbWVudC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMiA6IHsKLQkJCQkJCQkJdGV4dCA9IFN0cmluZ1V0aWxzLmZpcnN0TGluZU9mKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRleHQ7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJVGFibGVMYXlvdXQgdGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQkJdGxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDcsIHRydWUpKTsKLQkJCXRsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyOCwgdHJ1ZSkpOwotCQkJdGxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCB0cnVlKSk7Ci0JCQlzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuZ2V0VGFibGUoKS5zZXRMYXlvdXQodGxheW91dCk7Ci0KLQkJCVRhYmxlQ29sdW1uIHRjID0gbmV3IFRhYmxlQ29sdW1uKHN0cnVjdHVyZWRTZWxlY3Rpb25UYWJsZS5nZXRUYWJsZSgpLCBTV1QuTk9ORSk7Ci0JCQl0Yy5zZXRUZXh0KCJJdGVtIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRjLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCXRjLnNldFdpZHRoKDQwKTsKLQotCQkJdGMgPSBuZXcgVGFibGVDb2x1bW4oc3RydWN0dXJlZFNlbGVjdGlvblRhYmxlLmdldFRhYmxlKCksIFNXVC5OT05FKTsKLQkJCXRjLnNldFRleHQoIkNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRjLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCXRjLnNldFdpZHRoKDQwKTsKLQotCQkJdGMgPSBuZXcgVGFibGVDb2x1bW4oc3RydWN0dXJlZFNlbGVjdGlvblRhYmxlLmdldFRhYmxlKCksIFNXVC5OT05FKTsKLQkJCXRjLnNldFRleHQoIlZhbHVlIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRjLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCXRjLnNldFdpZHRoKDQwKTsKLQotCQkJc3RydWN0dXJlZFNlbGVjdGlvblRhYmxlLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCQlmaW5hbCBMaXN0IGlucHV0ID0gc2VsZWN0aW9uOwotCQkJc3RydWN0dXJlZFNlbGVjdGlvblRhYmxlLnNldElucHV0KGlucHV0KTsKLQotCQkJZmluYWwgVHJlZVZpZXdlciBpbmZvVHJlZSA9IG5ldyBUcmVlVmlld2VyKHN0cnVjdHVyZWRTYXNoRm9ybSwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCQlpbmZvVHJlZS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRyZWVWaWV3ZXIgJiYgaW5mb1RyZWUuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyRm9yID0gKChJTm9kZU5vdGlmaWVyKSBpbmZvVHJlZS5nZXRJbnB1dCgpKS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCWlmIChhZGFwdGVyRm9yICE9IG51bGwgJiYgYWRhcHRlckZvciBpbnN0YW5jZW9mIElKRmFjZU5vZGVBZGFwdGVyKSB7Ci0JCQkJCQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IChJSkZhY2VOb2RlQWRhcHRlcikgYWRhcHRlckZvcjsKLQkJCQkJCQlyZXR1cm4gYWRhcHRlci5nZXRMYWJlbEltYWdlKChpbmZvVHJlZS5nZXRJbnB1dCgpKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENsYXNzKSB7Ci0JCQkJCQlyZXR1cm4gIkNsYXNzOiAiICsgKChDbGFzcykgZWxlbWVudCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQkJCQlyZXR1cm4gIlJlZ2lzdGVyZWQgQWRhcHRlcnM6IjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJlZ2lvbikgewotCQkJCQkJcmV0dXJuICJJbmRleGVkIFJlZ2lvbiBvZmZzZXQgc3BhbjogWyIgKyAoKElSZWdpb24pIGVsZW1lbnQpLmdldE9mZnNldCgpICsgIi0iICsgKChJUmVnaW9uKSBlbGVtZW50KS5nZXRMZW5ndGgoKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJfQotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRyZWVWaWV3ZXIgJiYgaW5mb1RyZWUuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSUpGYWNlTm9kZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgaW5mb1RyZWUuZ2V0SW5wdXQoKSkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0TGFiZWxUZXh0KChpbmZvVHJlZS5nZXRJbnB1dCgpKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlpbmZvVHJlZS5zZXRDb250ZW50UHJvdmlkZXIobmV3IElUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvbikKLQkJCQkJCXJldHVybiAoKENvbGxlY3Rpb24pIHBhcmVudEVsZW1lbnQpLnRvQXJyYXkoKTsKLQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoNCk7Ci0JCQkJCWlmIChpbnB1dEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIgJiYgKChJTm9kZU5vdGlmaWVyKSBpbnB1dEVsZW1lbnQpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpICE9IG51bGwpIHsKLQkJCQkJCQllbGVtZW50cy5hZGQoaW5mb1RyZWUpOwotCQkJCQkJfQotCQkJCQkJZWxlbWVudHMuYWRkKGlucHV0RWxlbWVudC5nZXRDbGFzcygpKTsKLQkJCQkJCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQkJZWxlbWVudHMuYWRkKG5ldyBSZWdpb24oKChJbmRleGVkUmVnaW9uKSBpbnB1dEVsZW1lbnQpLmdldFN0YXJ0T2Zmc2V0KCksICgoSW5kZXhlZFJlZ2lvbikgaW5wdXRFbGVtZW50KS5nZXRFbmRPZmZzZXQoKSkpOwotCQkJCQkJfQotCQkJCQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJCQllbGVtZW50cy5hZGQoKChJTm9kZU5vdGlmaWVyKSBpbnB1dEVsZW1lbnQpLmdldEFkYXB0ZXJzKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBlbGVtZW50cy50b0FycmF5KCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJCX0KLQkJCX0pOwotCi0JCQlzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWludCBzZWxlY3Rpb25JbmRleCA9IHN0cnVjdHVyZWRTZWxlY3Rpb25UYWJsZS5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJCWlmIChzZWxlY3Rpb25JbmRleCAhPSAtMSkgewotCQkJCQkJaW5mb1RyZWUuc2V0SW5wdXQoc3RydWN0dXJlZFNlbGVjdGlvblRhYmxlLmdldEVsZW1lbnRBdChzZWxlY3Rpb25JbmRleCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaW5mb1RyZWUuc2V0SW5wdXQoZXZlbnQuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCX0KLQkJCQkJaW5mb1RyZWUuZXhwYW5kVG9MZXZlbCgyKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJc3RydWN0dXJlZFNhc2hGb3JtLnNldFdlaWdodHMobmV3IGludFtdezMsIDJ9KTsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nIGdldExpbmVOdW1iZXIoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCQlpbnQgbGluZSA9IC0xOwotCQkJaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBNYXJrZXJBbm5vdGF0aW9uKSB7Ci0JCQkJbGluZSA9IE1hcmtlclV0aWxpdGllcy5nZXRMaW5lTnVtYmVyKCgoTWFya2VyQW5ub3RhdGlvbikgYW5ub3RhdGlvbikuZ2V0TWFya2VyKCkpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldEFubm90YXRpb25Nb2RlbChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQlQb3NpdGlvbiBwID0gYW5ub3RhdGlvbk1vZGVsLmdldFBvc2l0aW9uKGFubm90YXRpb24pOwotCQkJCWlmIChwICE9IG51bGwgJiYgIXAuaXNEZWxldGVkKCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIGRvbid0IGZvcmdldCB0aGUgKzEKLQkJCQkJCWxpbmUgPSBmRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHAuZ2V0T2Zmc2V0KCkpICsgMTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJcmV0dXJuIGUuZ2V0TWVzc2FnZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIEludGVnZXIudG9TdHJpbmcobGluZSk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgS2V5VmFsdWVQYWlyIHsKLQkJT2JqZWN0IGZLZXk7Ci0JCVN0cmluZyBmVmFsdWU7Ci0KLQkJcHVibGljIEtleVZhbHVlUGFpcihPYmplY3Qga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJCWZLZXkgPSBrZXk7Ci0JCQlmVmFsdWUgPSB2YWx1ZTsKLQkJfQotCX0KLQotCWNsYXNzIFNob3dFZGl0b3JJbmZvcm1hdGlvbkFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JCXB1YmxpYyBTaG93RWRpdG9ySW5mb3JtYXRpb25BY3Rpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJLyoqCi0JCQkgKiBUT0RPOiBQcm92aWRlIGEgbW9yZSB1c2VmdWwgY29udHJvbCwgbWF5YmUgYSB0YWJsZSB3aGVyZSB0aGUKLQkJCSAqIHNlbGVjdGlvbiBzaG93cyB5b3UgdGhlIHBhcnRpdGlvbidzIHRleHQgaW4gYSBTdHlsZWRUZXh0IHBhbmUKLQkJCSAqIGJlbmVhdGggaXQuCi0JCQkgKi8KLQkJCXN1cGVyLnJ1bigpOwotCQkJbmV3IEluZm9ybWF0aW9uRGlhbG9nKCgoQ29udHJvbCkgZlRleHRFZGl0b3IuZ2V0QWRhcHRlcihDb250cm9sLmNsYXNzKSkuZ2V0U2hlbGwoKSkub3BlbigpOwotCQl9Ci0JfQotCi0JSUFjdGlvbiBmU2hvd0VkaXRvckluZm9ybWF0aW9uQWN0aW9uID0gbmV3IFNob3dFZGl0b3JJbmZvcm1hdGlvbkFjdGlvbigpOwotCi0JSVRleHRFZGl0b3IgZlRleHRFZGl0b3IgPSBudWxsOwotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICovCi0JcHVibGljIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtKFN0cmluZyBpZCkgewotCQlzdXBlcihpZCk7Ci0JCXNldFRvb2xUaXBUZXh0KCJEb3VibGUtY2xpY2sgZm9yIG1vcmUgaW5mb3JtYXRpb24iKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gdmlzaWJsZQotCSAqIEBwYXJhbSB3aWR0aEluQ2hhcnMKLQkgKi8KLQlwdWJsaWMgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0oU3RyaW5nIGlkLCBib29sZWFuIHZpc2libGUsIGludCB3aWR0aEluQ2hhcnMpIHsKLQkJc3VwZXIoaWQsIHZpc2libGUsIHdpZHRoSW5DaGFycyk7Ci0JCXNldFRvb2xUaXBUZXh0KCJEb3VibGUtY2xpY2sgZm9yIG1vcmUgaW5mb3JtYXRpb24iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSVRleHRFZGl0b3IgdGV4dEVkaXRvcikgewotCQlmVGV4dEVkaXRvciA9IHRleHRFZGl0b3I7Ci0JCXNldEFjdGlvbkhhbmRsZXIoZlNob3dFZGl0b3JJbmZvcm1hdGlvbkFjdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3VpL1N0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkltYWdlUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91aS9TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25JbWFnZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNDkyM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3VpL1N0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkltYWdlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSUFubm90YXRpb25JbWFnZVByb3ZpZGVyOwotCi0vKioKLSAqIEltYWdlIHByb3ZpZGVyIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGFubm90YXRpb25zLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSW1hZ2VQcm92aWRlciBpbXBsZW1lbnRzIElBbm5vdGF0aW9uSW1hZ2VQcm92aWRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSUFubm90YXRpb25JbWFnZVByb3ZpZGVyI2dldEltYWdlRGVzY3JpcHRvcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpbWFnZURlc2NyaXRwb3JJZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklBbm5vdGF0aW9uSW1hZ2VQcm92aWRlciNnZXRJbWFnZURlc2NyaXB0b3JJZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1hZ2VEZXNjcmlwdG9ySWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JQW5ub3RhdGlvbkltYWdlUHJvdmlkZXIjZ2V0TWFuYWdlZEltYWdlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb24pCi0JICovCi0JcHVibGljIEltYWdlIGdldE1hbmFnZWRJbWFnZShBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJLy8gZnV0dXJlIHJldHVybiBkaWZmZXJlbnQgdHlwZXMgb2YgbWFuYWdlZCBpbWFnZXMgYXMgSkRUIGRvZXMKLQkJLy8gZWcuIG92ZXJsYXkgaWNvbiBpbWFnZXMsICJncmF5ZWQiIGltYWdlcywgcXVpY2sgZml4YWJsZSwgZXRjLi4uCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvQXNzZXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9Bc3NlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0ZWFlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9Bc3NlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsOwotCi0KLS8qKgotICogPGNvZGU+QXNzZXJ0PC9jb2RlPiBpcyB1c2VmdWwgZm9yIGZvciBlbWJlZGRpbmcgcnVudGltZSBzYW5pdHkgY2hlY2tzIGluCi0gKiBjb2RlLiBUaGUgcHJlZGljYXRlIG1ldGhvZHMgYWxsIHRlc3QgYSBjb25kaXRpb24gYW5kIHRocm93IHNvbWUgdHlwZSBvZgotICogdW5jaGVja2VkIGV4Y2VwdGlvbiBpZiB0aGUgY29uZGl0aW9uIGRvZXMgbm90IGhvbGQuCi0gKiA8cD4KLSAqIEFzc2VydGlvbiBmYWlsdXJlIGV4Y2VwdGlvbnMsIGxpa2UgbW9zdCBydW50aW1lIGV4Y2VwdGlvbnMsIGFyZSB0aHJvd24gd2hlbgotICogc29tZXRoaW5nIGlzIG1pc2JlaGF2aW5nLiBBc3NlcnRpb24gZmFpbHVyZXMgYXJlIGludmFyaWFibHkgdW5zcGVjaWZpZWQKLSAqIGJlaGF2aW9yOyBjb25zZXF1ZW50bHksIGNsaWVudHMgc2hvdWxkIG5ldmVyIHJlbHkgb24gdGhlc2UgYmVpbmcgdGhyb3duCi0gKiAoYW5kIGNlcnRhaW5seSBzaG91bGQgbm90IGJlaW5nIGNhdGNoaW5nIHRoZW0gc3BlY2lmaWNhbGx5KS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFzc2VydCB7Ci0KLQkvKioKLQkgKiA8Y29kZT5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb248L2NvZGU+IGlzIGEgcnVudGltZSBleGNlcHRpb24gdGhyb3duCi0JICogYnkgc29tZSBvZiB0aGUgbWV0aG9kcyBpbiA8Y29kZT5Bc3NlcnQ8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoaXMgY2xhc3MgaXMgbm90IGRlY2xhcmVkIHB1YmxpYyB0byBwcmV2ZW50IHNvbWUgbWlzdXNlczsgcHJvZ3JhbXMKLQkgKiB0aGF0IGNhdGNoIG9yIG90aGVyd2lzZSBkZXBlbmQgb24gYXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBzdXNjZXB0aWJsZSB0bwotCSAqIHVuZXhwZWN0ZWQgYnJlYWthZ2Ugd2hlbiBhc3NlcnRpb25zIGluIHRoZSBjb2RlIGFyZSBhZGRlZCBvciByZW1vdmVkLgotCSAqIDwvcD4KLQkgKi8KLQljbGFzcyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkvKioKLQkJICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24uCi0JCSAqLwotCQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgotCQkgKi8KLQkJcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsKSB7Ci0JCQlzdXBlcihkZXRhaWwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IGFuIGFyZ3VtZW50IGlzIGxlZ2FsLiBJZiB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyBub3QKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiwgYW4gPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpcwotCSAqIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZAotCSAqIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZQotCSAqICAgICAgICAgY2hlY2sgZmFpbHMpCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgbGVnYWxpdHkgdGVzdCBmYWlsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhbChib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICghZXhwcmVzc2lvbikKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obWVzc2FnZSk7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcyBpcwotCSAqIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLiBUaGUgZ2l2ZW4KLQkgKiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB0ZXN0Ci0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpc05vdE51bGwoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQXNzZXJ0KCkubmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihtZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSWYgdGhpcyBpcyBub3QKLQkgKiB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLiBUaGUgZ2l2ZW4gbWVzc2FnZQotCSAqIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlCi0JICogICAgICAgICBjaGVjayBmYWlscykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKCFleHByZXNzaW9uKSB7Ci0JCQl0aHJvdyBuZXcgQXNzZXJ0KCkubmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihtZXNzYWdlKTsKLQkJfQotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQuICovCi0JcHJpdmF0ZSBBc3NlcnQoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvRWRpdG9yVXRpbGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvRWRpdG9yVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTI2MzQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL0VkaXRvclV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsOwotCi0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLQotLyoqCi0gKiBIZWxwZnVsIG1ldGhvZHMgdG8gYmUgdXNlZCB3aXRoIHRoZSBTb3VyY2UgRWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JVdGlsaXR5IHsKLQotCS8qKgotCSAqIEFwcGVuZHMgdG8gbW9kaWZpZXIgc3RyaW5nIG9mIHRoZSBnaXZlbiBTV1QgbW9kaWZpZXIgYml0IHRvIHRoZSBnaXZlbgotCSAqIG1vZGlmaWVyU3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBtb2RpZmllclN0cmluZwotCSAqICAgICAgICAgICAgdGhlIG1vZGlmaWVyIHN0cmluZwotCSAqIEBwYXJhbSBtb2RpZmllcgotCSAqICAgICAgICAgICAgYW4gaW50IHdpdGggU1dUIG1vZGlmaWVyIGJpdAotCSAqIEByZXR1cm4gdGhlIGNvbmNhdGVuYXRlZCBtb2RpZmllciBzdHJpbmcKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYXBwZW5kTW9kaWZpZXJTdHJpbmcoU3RyaW5nIG1vZGlmaWVyU3RyaW5nLCBpbnQgbW9kaWZpZXIpIHsKLQkJaWYgKG1vZGlmaWVyU3RyaW5nID09IG51bGwpCi0JCQltb2RpZmllclN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBuZXdNb2RpZmllclN0cmluZyA9IEFjdGlvbi5maW5kTW9kaWZpZXJTdHJpbmcobW9kaWZpZXIpOwotCQlpZiAobW9kaWZpZXJTdHJpbmcubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBuZXdNb2RpZmllclN0cmluZzsKLQkJcmV0dXJuIG1vZGlmaWVyU3RyaW5nICsgIiArICIgKyBuZXdNb2RpZmllclN0cmluZzsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBzdGF0ZSBtYXNrIGZvciB0aGUgZ2l2ZW4gbW9kaWZpZXIgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBtb2RpZmllcnMKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgd2l0aCB0aGUgbW9kaWZpZXJzLCBzZXBhcmF0ZWQgYnkgJysnLCAnLScsICc7JywKLQkgKiAgICAgICAgICAgICcsJyBvciAnLicKLQkgKiBAcmV0dXJuIHRoZSBzdGF0ZSBtYXNrIG9yIC0xIGlmIHRoZSBpbnB1dCBpcyBpbnZhbGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVN0YXRlTWFzayhTdHJpbmcgbW9kaWZpZXJzKSB7Ci0JCWlmIChtb2RpZmllcnMgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlpZiAobW9kaWZpZXJzLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gU1dULk5PTkU7Ci0KLQkJaW50IHN0YXRlTWFzayA9IDA7Ci0JCVN0cmluZ1Rva2VuaXplciBtb2RpZmllclRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobW9kaWZpZXJzLCAiLDsuOistKiAiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAobW9kaWZpZXJUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlpbnQgbW9kaWZpZXIgPSBFZGl0b3JVdGlsaXR5LmZpbmRMb2NhbGl6ZWRNb2RpZmllcihtb2RpZmllclRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQlpZiAobW9kaWZpZXIgPT0gMCB8fCAoc3RhdGVNYXNrICYgbW9kaWZpZXIpID09IG1vZGlmaWVyKQotCQkJCXJldHVybiAtMTsKLQkJCXN0YXRlTWFzayA9IHN0YXRlTWFzayB8IG1vZGlmaWVyOwotCQl9Ci0JCXJldHVybiBzdGF0ZU1hc2s7Ci0JfQotCi0JLyoqCi0JICogTWFwcyB0aGUgbG9jYWxpemVkIG1vZGlmaWVyIG5hbWUgdG8gYSBjb2RlIGluIHRoZSBzYW1lIG1hbm5lciBhcwotCSAqICNmaW5kTW9kaWZpZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgU1dUIG1vZGlmaWVyIGJpdCwgb3IgPGNvZGU+MDwvY29kZT4gaWYgbm8gbWF0Y2ggd2FzIGZvdW5kCi0JICogQHNlZSBmaW5kTW9kaWZpZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBmaW5kTG9jYWxpemVkTW9kaWZpZXIoU3RyaW5nIHRva2VuKSB7Ci0JCWlmICh0b2tlbiA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWYgKHRva2VuLmVxdWFsc0lnbm9yZUNhc2UoQWN0aW9uLmZpbmRNb2RpZmllclN0cmluZyhTV1QuQ1RSTCkpKQotCQkJcmV0dXJuIFNXVC5DVFJMOwotCQlpZiAodG9rZW4uZXF1YWxzSWdub3JlQ2FzZShBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKFNXVC5TSElGVCkpKQotCQkJcmV0dXJuIFNXVC5TSElGVDsKLQkJaWYgKHRva2VuLmVxdWFsc0lnbm9yZUNhc2UoQWN0aW9uLmZpbmRNb2RpZmllclN0cmluZyhTV1QuQUxUKSkpCi0JCQlyZXR1cm4gU1dULkFMVDsKLQkJaWYgKHRva2VuLmVxdWFsc0lnbm9yZUNhc2UoQWN0aW9uLmZpbmRNb2RpZmllclN0cmluZyhTV1QuQ09NTUFORCkpKQotCQkJcmV0dXJuIFNXVC5DT01NQU5EOwotCi0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIFRlbXBvcmFyeSBtZXRob2QgdG8gaGVscCBtaWdyYXRlIGZyb20gdXNpbmcgU3RydWN0dXJlZFRleHRDb2xvcnMgdG8KLQkgKiB1c2luZyBiYXNlIENvbG9yUmVnaXN0cnkuIEluc3RlYWQgb2YgdXNpbmcgc3ltYm9saWMgbmFtZXMgaW4gdGhlIGNvbG9yCi0JICogcmVnaXN0cnksIHdlIGFyZSBjdXJyZW50bHkgbWFwcGluZyB0aGUgcmdiLnRvU3RyaW5nIHZhbHVlIHRvCi0JICogY29ycmVzcG9uZGluZyBjb2xvci4KLQkgKiAKLQkgKiBAcGFyYW0gcmdiCi0JICogQHJldHVybiBDb2xvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sb3IgZ2V0Q29sb3IoUkdCIHJnYikgewotCQlpZiAocmdiID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBnZXQgdGhlIGNvbG9yIGZyb20gdGhlIHBsYXRmb3JtIGNvbG9yIHJlZ2lzdHJ5Ci0JCUNvbG9yIGNvbG9yID0gSkZhY2VSZXNvdXJjZXMuZ2V0Q29sb3JSZWdpc3RyeSgpLmdldChyZ2IudG9TdHJpbmcoKSk7Ci0KLQkJLy8gaWYgdGhlIHBsYXRmb3JtIGNvbG9yIHJlZ2lzdHJ5IGRvZXMgbm90IGhhdmUgdGhpcyBjb2xvciB5ZXQsIGFkZCB0bwotCQkvLyB0aGUgcmVnaXN0cnkKLQkJaWYgKGNvbG9yID09IG51bGwpIHsKLQkJCUpGYWNlUmVzb3VyY2VzLmdldENvbG9yUmVnaXN0cnkoKS5wdXQocmdiLnRvU3RyaW5nKCksIHJnYik7Ci0JCQljb2xvciA9IEpGYWNlUmVzb3VyY2VzLmdldENvbG9yUmVnaXN0cnkoKS5nZXQocmdiLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBjb2xvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RpZmllciBzdHJpbmcgZm9yIHRoZSBnaXZlbiBTV1QgbW9kaWZpZXIgbW9kaWZpZXIgYml0cy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdGVNYXNrCi0JICogICAgICAgICAgICB0aGUgU1dUIG1vZGlmaWVyIGJpdHMKLQkgKiBAcmV0dXJuIHRoZSBtb2RpZmllciBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2RpZmllclN0cmluZyhpbnQgc3RhdGVNYXNrKSB7Ci0JCVN0cmluZyBtb2RpZmllclN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmICgoc3RhdGVNYXNrICYgU1dULkNUUkwpID09IFNXVC5DVFJMKQotCQkJbW9kaWZpZXJTdHJpbmcgPSBhcHBlbmRNb2RpZmllclN0cmluZyhtb2RpZmllclN0cmluZywgU1dULkNUUkwpOwotCQlpZiAoKHN0YXRlTWFzayAmIFNXVC5BTFQpID09IFNXVC5BTFQpCi0JCQltb2RpZmllclN0cmluZyA9IGFwcGVuZE1vZGlmaWVyU3RyaW5nKG1vZGlmaWVyU3RyaW5nLCBTV1QuQUxUKTsKLQkJaWYgKChzdGF0ZU1hc2sgJiBTV1QuU0hJRlQpID09IFNXVC5TSElGVCkKLQkJCW1vZGlmaWVyU3RyaW5nID0gYXBwZW5kTW9kaWZpZXJTdHJpbmcobW9kaWZpZXJTdHJpbmcsIFNXVC5TSElGVCk7Ci0JCWlmICgoc3RhdGVNYXNrICYgU1dULkNPTU1BTkQpID09IFNXVC5DT01NQU5EKQotCQkJbW9kaWZpZXJTdHJpbmcgPSBhcHBlbmRNb2RpZmllclN0cmluZyhtb2RpZmllclN0cmluZywgU1dULkNPTU1BTkQpOwotCi0JCXJldHVybiBtb2RpZmllclN0cmluZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9QaXhlbENvbnZlcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvUGl4ZWxDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyZTI4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9QaXhlbENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LlBpeGVsQ29udmVydGVyfQotICovCi1wdWJsaWMgY2xhc3MgUGl4ZWxDb252ZXJ0ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuUGl4ZWxDb252ZXJ0ZXIgewotCi0JcHVibGljIFBpeGVsQ29udmVydGVyKENvbnRyb2wgY29udHJvbCkgewotCQlzdXBlcihjb250cm9sKTsKLQl9Ci0KLQlwdWJsaWMgUGl4ZWxDb252ZXJ0ZXIoRm9udCBmb250KSB7Ci0JCXN1cGVyKGZvbnQpOwotCX0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9QbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9QbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MTAxN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmVyaWZ5S2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotCi0vKioKLSAqIFV0aWxpdHkgdG8gZGlzcGxheSAoYW5kL29yIGNsZWFyKSBtZXNzYWdlcyBvbiB0aGUgc3RhdHVzIGxpbmUuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENsZWFyTWVzc2FnZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJZGlzcGxheU1lc3NhZ2UobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDbGVhclN0YXR1c0xpbmUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXByaXZhdGUgSVN0YXR1c0xpbmVNYW5hZ2VyIGZNYW5hZ2VyOwotCQlwcml2YXRlIGJvb2xlYW4gZklzRXJyb3I7Ci0KLQkJQ2xlYXJTdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlciwgYm9vbGVhbiBpc0Vycm9yKSB7Ci0JCQlmTWFuYWdlciA9IHN0YXR1c0xpbmVNYW5hZ2VyOwotCQkJZklzRXJyb3IgPSBpc0Vycm9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKGZJc0Vycm9yKSB7Ci0JCQkJZk1hbmFnZXIuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZk1hbmFnZXIuc2V0TWVzc2FnZShudWxsKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gY2xlYXIgbWVzc2FnZSBvbiBmb2N1cyBsb3NzLCBjaGFuZ2Ugb2Ygc2VsZWN0aW9uLCBrZXkgdHlwZSwKLQkgKiBldGMuLi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBPbmVUaW1lTGlzdGVuZXIgZXh0ZW5kcyBGb2N1c0FkYXB0ZXIgaW1wbGVtZW50cyBWZXJpZnlLZXlMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIsIE1vdXNlTGlzdGVuZXIgewotCQlwcml2YXRlIFJ1bm5hYmxlIGZSdW5uZXIgPSBudWxsOwotCQlwcml2YXRlIFN0eWxlZFRleHQgZlN0eWxlZFRleHQ7Ci0KLQkJT25lVGltZUxpc3RlbmVyKFN0eWxlZFRleHQgdGFyZ2V0LCBSdW5uYWJsZSByKSB7Ci0JCQlmU3R5bGVkVGV4dCA9IHRhcmdldDsKLQkJCWZSdW5uZXIgPSByOwotCQkJZlN0eWxlZFRleHQuYWRkVmVyaWZ5S2V5TGlzdGVuZXIodGhpcyk7Ci0JCQlmU3R5bGVkVGV4dC5hZGRGb2N1c0xpc3RlbmVyKHRoaXMpOwotCQkJZlN0eWxlZFRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlmU3R5bGVkVGV4dC5hZGRNb3VzZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJdW5ob29rQW5kUnVuKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJdW5ob29rQW5kUnVuKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQl1bmhvb2tBbmRSdW4oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQkvLwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHVuaG9va0FuZFJ1bigpIHsKLQkJCWZTdHlsZWRUZXh0LnJlbW92ZVZlcmlmeUtleUxpc3RlbmVyKHRoaXMpOwotCQkJZlN0eWxlZFRleHQucmVtb3ZlRm9jdXNMaXN0ZW5lcih0aGlzKTsKLQkJCWZTdHlsZWRUZXh0LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJZlN0eWxlZFRleHQucmVtb3ZlTW91c2VMaXN0ZW5lcih0aGlzKTsKLQkJCWZTdHlsZWRUZXh0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMoZlJ1bm5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB2ZXJpZnlLZXkoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCXVuaG9va0FuZFJ1bigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXVuaG9va0FuZFJ1bigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJdW5ob29rQW5kUnVuKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdGF0dXMgbGluZSBlcnJvciBtZXNzYWdlIHdpbGwgYmUgY2xlYXJlZCB3LyBrZXkgdHlwZSBvciBzZWxlY3Rpb24gY2hhbmdlCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkT25lVGltZUNsZWFyTGlzdGVuZXIoKSB7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotCQlib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIGVkaXRvci5nZXRBZGFwdGVyKENvbnRyb2wuY2xhc3MpOwotCQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJbmV3IE9uZVRpbWVMaXN0ZW5lcigoU3R5bGVkVGV4dCkgY29udHJvbCwgbmV3IENsZWFyTWVzc2FnZSgpKTsKLQkJCQlhZGRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFhZGRlZCkgewotCQkJLy8gY2xlYXIgdGhlIGVycm9yIG1lc3NhZ2UgaW1tZWRpYXRlbHkKLQkJCWRpc3BsYXlNZXNzYWdlKG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBzdGF0dXMgbGluZSBpbW1lZGlhdGVseQotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyU3RhdHVzTGluZSgpIHsKLQkJZGlzcGxheU1lc3NhZ2UobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheSBhIG1lc3NhZ2Ugb24gdGhlIHN0YXR1cyBsaW5lICh3aXRoIGEgYmVlcCkKLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcGxheUVycm9yTWVzc2FnZShTdHJpbmcgbXNnKSB7Ci0JCWRpc3BsYXlNZXNzYWdlKG1zZyk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmJlZXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5IGEgbWVzc2FnZSBvbiB0aGUgc3RhdHVzIGxpbmUgKG5vIGJlZXApCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAcGFyYW0gbXNnCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRpc3BsYXlNZXNzYWdlKFN0cmluZyBtc2cpIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5zZXRFcnJvck1lc3NhZ2UobXNnKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSUVkaXRvclBhcnQgZ2V0QWN0aXZlRWRpdG9yKCkgewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBudWxsOwotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgPT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJCWlmICh3aW5kb3dzLmxlbmd0aCA+IDApIHsKLQkJCQl3aW5kb3cgPSB3aW5kb3dzWzBdOwotCQkJfQotCQl9Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKQotCQkJCWVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGVkaXRvcjsKLQl9Ci0KLQlwcml2YXRlIFBsYXRmb3JtU3RhdHVzTGluZVV0aWwoKSB7Ci0JCS8vIGZvcmNlIHVzZSBvZiBzaW5nbGV0b24KLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2Ugb24gdGhlIHN0YXR1cyBsaW5lCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGlzcGxheVRlbXBvcmFyeUVycm9yTWVzc2FnZShJVGV4dFZpZXdlciB2aWV3ZXIsIFN0cmluZyBtc2cpIHsKLQkJcmV0dXJuIF9kaXNwbGF5VGVtcG9yYXJ5TWVzc2FnZSh2aWV3ZXIsIG1zZywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheSBhIG1lc3NhZ2Ugb24gdGhlIHN0YXR1cyBsaW5lCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGlzcGxheVRlbXBvcmFyeU1lc3NhZ2UoSVRleHRWaWV3ZXIgdmlld2VyLCBTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiBfZGlzcGxheVRlbXBvcmFyeU1lc3NhZ2Uodmlld2VyLCBtc2csIGZhbHNlKTsKLQl9Ci0KLQlzdGF0aWMgYm9vbGVhbiBfZGlzcGxheVRlbXBvcmFyeU1lc3NhZ2UoSVRleHRWaWV3ZXIgdmlld2VyLCBTdHJpbmcgbXNnLCBib29sZWFuIGlzRXJyb3IpIHsKLQkJYm9vbGVhbiBtZXNzYWdlU2hvd24gPSBmYWxzZTsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCAmJiB0ZXh0RWRpdG9yIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRFZGl0b3IpIHsKLQkJCQlpZiAoKChTdHJ1Y3R1cmVkVGV4dEVkaXRvcikgdGV4dEVkaXRvcikuZ2V0VGV4dFZpZXdlcigpID09IHZpZXdlcikgewotCQkJCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIgPSBlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQkJCQlpZiAoaXNFcnJvcikKLQkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldEVycm9yTWVzc2FnZShtc2cpOwotCQkJCQllbHNlCi0JCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKG1zZyk7Ci0JCQkJCW5ldyBPbmVUaW1lTGlzdGVuZXIodmlld2VyLmdldFRleHRXaWRnZXQoKSwgbmV3IENsZWFyU3RhdHVzTGluZShzdGF0dXNMaW5lTWFuYWdlciwgaXNFcnJvcikpOwotCQkJCQltZXNzYWdlU2hvd24gPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKCFtZXNzYWdlU2hvd24pIHsKLQkJCWRpc3BsYXlFcnJvck1lc3NhZ2UobXNnKTsKLQkJCWFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCk7Ci0JCX0KLQotCQlyZXR1cm4gbWVzc2FnZVNob3duOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL1JlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9SZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmM4OTViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL1JlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLS8qKgotICogVGVtcGxhdGUgaW1wbGVtZW50YXRpb24gb2YgYSByZWdpc3RyeSByZWFkZXIgdGhhdCBjcmVhdGVzIG9iamVjdHMKLSAqIHJlcHJlc2VudGluZyByZWdpc3RyeSBjb250ZW50cy4gVHlwaWNhbGx5LCBhbiBleHRlbnNpb24gY29udGFpbnMgb25lCi0gKiBlbGVtZW50LCBidXQgdGhpcyByZWFkZXIgaGFuZGxlcyBtdWx0aXBsZSBlbGVtZW50cyBwZXIgZXh0ZW5zaW9uLgotICogCi0gKiBUbyBzdGFydCByZWFkaW5nIHRoZSBleHRlbnNpb25zIGZyb20gdGhlIHJlZ2lzdHJ5IGZvciBhbiBleHRlbnNpb24gcG9pbnQsCi0gKiBjYWxsIHRoZSBtZXRob2QgPGNvZGU+cmVhZFJlZ2lzdHJ5PC9jb2RlPi4KLSAqIAotICogVG8gcmVhZCBjaGlsZHJlbiBvZiBhbiBJQ29uZmlndXJhdGlvbkVsZW1lbnQsIGNhbGwgdGhlIG1ldGhvZAotICogPGNvZGU+cmVhZEVsZW1lbnRDaGlsZHJlbjwvY29kZT4gZnJvbSB5b3VyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXRob2QKLSAqIDxjb2RlPnJlYWRFbGVtZW50PC9jb2RlPiwgYXMgaXQgd2lsbCBub3QgYmUgZG9uZSBieSBkZWZhdWx0LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVnaXN0cnlSZWFkZXIgewotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIFJlZ2lzdHJ5UmVhZGVyKCkgewotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGV4dHJhY3RzIGRlc2NyaXB0aW9uIGFzIGEgc3ViZWxlbWVudCBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGRlc2NyaXB0aW9uIHN0cmluZyBpZiBkZWZpbmVkLCBvciBlbXB0eSBzdHJpbmcgaWYgbm90LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZykgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbihUQUdfREVTQ1JJUFRJT04pOwotCQlpZiAoY2hpbGRyZW4ubGVuZ3RoID49IDEpIHsKLQkJCXJldHVybiBjaGlsZHJlblswXS5nZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGVycm9yIGluIHRoZSB3b3JrYmVuY2ggbG9nIHVzaW5nIHRoZSBwcm92aWRlZCB0ZXh0IGFuZCB0aGUKLQkgKiBpbmZvcm1hdGlvbiBpbiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZ0Vycm9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGV4dCkgewotCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoIlBsdWdpbiAiICsgZXh0ZW5zaW9uLmdldE5hbWVzcGFjZSgpICsgIiwgZXh0ZW5zaW9uICIgKyBleHRlbnNpb24uZ2V0RXh0ZW5zaW9uUG9pbnRVbmlxdWVJZGVudGlmaWVyKCkpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlidWYuYXBwZW5kKCJcbiIgKyB0ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgYnVmLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgYSB2ZXJ5IGNvbW1vbiByZWdpc3RyeSBlcnJvciB3aGVuIGEgcmVxdWlyZWQgYXR0cmlidXRlIGlzIG1pc3NpbmcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nTWlzc2luZ0F0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJbG9nRXJyb3IoZWxlbWVudCwgIlJlcXVpcmVkIGF0dHJpYnV0ZSAnIiArIGF0dHJpYnV0ZU5hbWUgKyAiJyBub3QgZGVmaW5lZCIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIExvZ3MgYSByZWdpc3RyeSBlcnJvciB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgaXMgdW5rbm93bi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2dVbmtub3duRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlsb2dFcnJvcihlbGVtZW50LCAiVW5rbm93biBleHRlbnNpb24gdGFnIGZvdW5kOiAiICsgZWxlbWVudC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXBwbHkgYSByZXByb2R1Y2FibGUgb3JkZXIgdG8gdGhlIGxpc3Qgb2YgZXh0ZW5zaW9ucyBwcm92aWRlZCwgc3VjaAotCSAqIHRoYXQgdGhlIG9yZGVyIHdpbGwgbm90IGNoYW5nZSBhcyBleHRlbnNpb25zIGFyZSBhZGRlZCBvciByZW1vdmVkLgotCSAqLwotCXByb3RlY3RlZCBJRXh0ZW5zaW9uW10gb3JkZXJFeHRlbnNpb25zKElFeHRlbnNpb25bXSBleHRlbnNpb25zKSB7Ci0JCS8vIEJ5IGRlZmF1bHQsIHRoZSBvcmRlciBpcyBiYXNlZCBvbiBwbHVnaW4gaWQgc29ydGVkCi0JCS8vIGluIGFzY2VuZGluZyBvcmRlci4gVGhlIG9yZGVyIGZvciBhIHBsdWdpbiBwcm92aWRpbmcKLQkJLy8gbW9yZSB0aGFuIG9uZSBleHRlbnNpb24gZm9yIGFuIGV4dGVuc2lvbiBwb2ludCBpcwotCQkvLyBkZXBlbmRlbnQgaW4gdGhlIG9yZGVyIGxpc3RlZCBpbiB0aGUgWE1MIGZpbGUuCi0JCVNvcnRlciBzb3J0ZXIgPSBuZXcgU29ydGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gY29tcGFyZShPYmplY3QgZXh0ZW5zaW9uMSwgT2JqZWN0IGV4dGVuc2lvbjIpIHsKLQkJCQlTdHJpbmcgczEgPSAoKElFeHRlbnNpb24pIGV4dGVuc2lvbjEpLmdldE5hbWVzcGFjZSgpLnRvVXBwZXJDYXNlKCk7Ci0JCQkJU3RyaW5nIHMyID0gKChJRXh0ZW5zaW9uKSBleHRlbnNpb24yKS5nZXROYW1lc3BhY2UoKS50b1VwcGVyQ2FzZSgpOwotCQkJCS8vUmV0dXJuIHRydWUgaWYgZWxlbWVudFR3byBpcyAnZ3JlYXRlciB0aGFuJyBlbGVtZW50T25lCi0JCQkJcmV0dXJuIHMyLmNvbXBhcmVUbyhzMSkgPiAwOwotCQkJfQotCQl9OwotCi0JCU9iamVjdFtdIHNvcnRlZCA9IHNvcnRlci5zb3J0KGV4dGVuc2lvbnMpOwotCQlJRXh0ZW5zaW9uW10gc29ydGVkRXh0ZW5zaW9uID0gbmV3IElFeHRlbnNpb25bc29ydGVkLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoc29ydGVkLCAwLCBzb3J0ZWRFeHRlbnNpb24sIDAsIHNvcnRlZC5sZW5ndGgpOwotCQlyZXR1cm4gc29ydGVkRXh0ZW5zaW9uOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZWFkIGVsZW1lbnQncyBhdHRyaWJ1dGVzLiBJZiBjaGlsZHJlbiBzaG91bGQKLQkgKiBhbHNvIGJlIHJlYWQsIHRoZW4gaW1wbGVtZW50b3IgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcKLQkgKiA8Y29kZT5yZWFkRWxlbWVudENoaWxkcmVuPC9jb2RlPi4gSW1wbGVtZW50b3IgaXMgYWxzbyByZXNwb25zaWJsZQotCSAqIGZvciBsb2dnaW5nIG1pc3NpbmcgYXR0cmlidXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgZWxlbWVudCB3YXMgcmVjb2duaXplZCwgZmFsc2UgaWYgbm90LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIFJlYWQgdGhlIGVsZW1lbnQncyBjaGlsZHJlbi4gVGhpcyBpcyBjYWxsZWQgYnkgdGhlIHN1YmNsYXNzJwotCSAqIHJlYWRFbGVtZW50IG1ldGhvZCB3aGVuIGl0IHdhbnRzIHRvIHJlYWQgdGhlIGNoaWxkcmVuIG9mIHRoZSBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50Q2hpbGRyZW4oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJcmVhZEVsZW1lbnRzKGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKSk7Ci0JfQotCi0JLyoqCi0JICogUmVhZCBlYWNoIGVsZW1lbnQgb25lIGF0IGEgdGltZSBieSBjYWxsaW5nIHRoZSBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvbgotCSAqIG9mIDxjb2RlPnJlYWRFbGVtZW50PC9jb2RlPi4KLQkgKiAKLQkgKiBMb2dzIGFuIGVycm9yIGlmIHRoZSBlbGVtZW50IHdhcyBub3QgcmVjb2duaXplZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudHMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFyZWFkRWxlbWVudChlbGVtZW50c1tpXSkpCi0JCQkJbG9nVW5rbm93bkVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVhZCBvbmUgZXh0ZW5zaW9uIGJ5IGxvb3BpbmcgdGhyb3VnaCBpdHMgY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRXh0ZW5zaW9uKElFeHRlbnNpb24gZXh0ZW5zaW9uKSB7Ci0JCXJlYWRFbGVtZW50cyhleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSByZWFkUmVnaXN0cnkoSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBleHRlbnNpb25Qb2ludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkUmVnaXN0cnkoSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBwb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlleHRlbnNpb25zID0gb3JkZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKQotCQkJCXJlYWRFeHRlbnNpb24oZXh0ZW5zaW9uc1tpXSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU3RhcnQgdGhlIHJlZ2lzdHJ5IHJlYWRpbmcgcHJvY2VzcyB1c2luZyB0aGUgc3VwcGxpZWQgcGx1Z2luIElEIGFuZAotCSAqIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkUmVnaXN0cnkoSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBwb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlleHRlbnNpb25zID0gb3JkZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKQotCQkJCXJlYWRFeHRlbnNpb24oZXh0ZW5zaW9uc1tpXSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9TV1RVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9TV1RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ODQ5NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvU1dUVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5QaXhlbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotCi0KLS8qKgotICogPHA+VXRpbGl0eSBjbGFzcyB0byBzaW1wbGlmeSBhY2Nlc3MgdG8gc29tZSBTV1QgcmVzb3VyY2VzLjwvcD4KLSAqIAotICogQGJhc2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnV0aWwuU1dUVXRpbAotICovCi1wdWJsaWMgY2xhc3MgU1dUVXRpbCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgd2lkdGggaGludCBmb3IgYSBidXR0b24gY29udHJvbC4KLQkgKiBAcGFyYW0gYnV0dG9uIHRoZSBidXR0b24KLQkgKiBAcmV0dXJuIHRoZSB3aWR0aCBoaW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0QnV0dG9uV2lkdGhIaW50KEJ1dHRvbiBidXR0b24pIHsKLQkJYnV0dG9uLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKLQkJUGl4ZWxDb252ZXJ0ZXIgY29udmVydGVyPSBuZXcgUGl4ZWxDb252ZXJ0ZXIoYnV0dG9uKTsKLQkJaW50IHdpZHRoSGludD0gY29udmVydGVyLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuQlVUVE9OX1dJRFRIKTsKLQkJcmV0dXJuIE1hdGgubWF4KHdpZHRoSGludCwgYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSkueCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3aWR0aCBhbmQgaGVpZ2h0IGhpbnQgZm9yIHRoZSBidXR0b24gY29udHJvbC4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBpcyBhIE5PUCBpZiB0aGUgYnV0dG9uJ3MgbGF5b3V0IGRhdGEgaXMgbm90Ci0JICogYW4gaW5zdGFuY2Ugb2YgPGNvZGU+R3JpZERhdGE8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJ1dHRvbgl0aGUgYnV0dG9uIGZvciB3aGljaCB0byBzZXQgdGhlIGRpbWVuc2lvbiBoaW50Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoQnV0dG9uIGJ1dHRvbikgewotCQlBc3NlcnQuaXNOb3ROdWxsKGJ1dHRvbik7Ci0JCU9iamVjdCBnZD0gYnV0dG9uLmdldExheW91dERhdGEoKTsKLQkJaWYgKGdkIGluc3RhbmNlb2YgR3JpZERhdGEpIHsKLQkJCSgoR3JpZERhdGEpZ2QpLndpZHRoSGludD0gZ2V0QnV0dG9uV2lkdGhIaW50KGJ1dHRvbik7Ci0JCQkoKEdyaWREYXRhKWdkKS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL1NvcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhODk1ZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvU29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsOwotCi0KLQotLyoqCi0gKiBUaGUgU29ydE9wZXJhdGlvbiB0YWtlcyBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyBhbmQgcmV0dXJucyBhIHNvcnRlZAotICogY29sbGVjdGlvbiBvZiB0aGVzZSBvYmplY3RzLiBDb25jcmV0ZSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBwcm92aWRlIHRoZQotICogY3JpdGVyaWEgZm9yIHRoZSBzb3J0aW5nIG9mIHRoZSBvYmplY3RzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRoZSBvYmplY3RzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU29ydGVyIHsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBlbGVtZW50VHdvIGlzICdncmVhdGVyIHRoYW4nIGVsZW1lbnRPbmUgVGhpcyBpcyB0aGUKLQkgKiAnb3JkZXJpbmcnIG1ldGhvZCBvZiB0aGUgc29ydCBvcGVyYXRpb24uIEVhY2ggc3ViY2xhc3Mgb3ZlcmlkZXMgdGhpcwotCSAqIG1ldGhvZCB3aXRoIHRoZSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG9mIHRoZSAnZ3JlYXRlciB0aGFuJyBjb25jZXB0Ci0JICogZm9yIHRoZSBvYmplY3RzIGJlaW5nIHNvcnRlZC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb21wYXJlKE9iamVjdCBlbGVtZW50T25lLCBPYmplY3QgZWxlbWVudFR3byk7Ci0KLQkvKioKLQkgKiBTb3J0IHRoZSBvYmplY3RzIGluIHNvcnRlZCBjb2xsZWN0aW9uIGFuZCByZXR1cm4gdGhhdCBjb2xsZWN0aW9uLgotCSAqLwotCXByaXZhdGUgT2JqZWN0W10gcXVpY2tTb3J0KE9iamVjdFtdIHNvcnRlZENvbGxlY3Rpb24sIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKLQkJaW50IG9yaWdpbmFsTGVmdCA9IGxlZnQ7Ci0JCWludCBvcmlnaW5hbFJpZ2h0ID0gcmlnaHQ7Ci0JCU9iamVjdCBtaWQgPSBzb3J0ZWRDb2xsZWN0aW9uWyhsZWZ0ICsgcmlnaHQpIC8gMl07Ci0KLQkJZG8gewotCQkJd2hpbGUgKGNvbXBhcmUoc29ydGVkQ29sbGVjdGlvbltsZWZ0XSwgbWlkKSkKLQkJCQlsZWZ0Kys7Ci0JCQl3aGlsZSAoY29tcGFyZShtaWQsIHNvcnRlZENvbGxlY3Rpb25bcmlnaHRdKSkKLQkJCQlyaWdodC0tOwotCQkJaWYgKGxlZnQgPD0gcmlnaHQpIHsKLQkJCQlPYmplY3QgdG1wID0gc29ydGVkQ29sbGVjdGlvbltsZWZ0XTsKLQkJCQlzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdID0gc29ydGVkQ29sbGVjdGlvbltyaWdodF07Ci0JCQkJc29ydGVkQ29sbGVjdGlvbltyaWdodF0gPSB0bXA7Ci0JCQkJbGVmdCsrOwotCQkJCXJpZ2h0LS07Ci0JCQl9Ci0JCX0gd2hpbGUgKGxlZnQgPD0gcmlnaHQpOwotCi0JCWlmIChvcmlnaW5hbExlZnQgPCByaWdodCkKLQkJCXNvcnRlZENvbGxlY3Rpb24gPSBxdWlja1NvcnQoc29ydGVkQ29sbGVjdGlvbiwgb3JpZ2luYWxMZWZ0LCByaWdodCk7Ci0JCWlmIChsZWZ0IDwgb3JpZ2luYWxSaWdodCkKLQkJCXNvcnRlZENvbGxlY3Rpb24gPSBxdWlja1NvcnQoc29ydGVkQ29sbGVjdGlvbiwgbGVmdCwgb3JpZ2luYWxSaWdodCk7Ci0KLQkJcmV0dXJuIHNvcnRlZENvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IHNvcnRlZCBjb2xsZWN0aW9uIGZyb20gdGhpcyB1bnNvcnRlZCBjb2xsZWN0aW9uLiBTb3J0Ci0JICogdXNpbmcgcXVpY2sgc29ydC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gc29ydChPYmplY3RbXSB1blNvcnRlZENvbGxlY3Rpb24pIHsKLQkJaW50IHNpemUgPSB1blNvcnRlZENvbGxlY3Rpb24ubGVuZ3RoOwotCQlPYmplY3RbXSBzb3J0ZWRDb2xsZWN0aW9uID0gbmV3IE9iamVjdFtzaXplXTsKLQotCQkvL2NvcHkgdGhlIGFycmF5IHNvIGNhbiByZXR1cm4gYSBuZXcgc29ydGVkIGNvbGxlY3Rpb24KLQkJU3lzdGVtLmFycmF5Y29weSh1blNvcnRlZENvbGxlY3Rpb24sIDAsIHNvcnRlZENvbGxlY3Rpb24sIDAsIHNpemUpOwotCQlpZiAoc2l6ZSA+IDEpCi0JCQlxdWlja1NvcnQoc29ydGVkQ29sbGVjdGlvbiwgMCwgc2l6ZSAtIDEpOwotCi0JCXJldHVybiBzb3J0ZWRDb2xsZWN0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9DYXJldEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvQ2FyZXRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTA3ODM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9DYXJldEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50czsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBiYXNlIHNlbGVjdGlvbiBub3RpZmljYXRpb24KLSAqIAotICogU2ltcGx5IGhvbGRzIGRhdGEgdG8gYmUgcGFzc2VkIHRvIENhcmV0RXZlbnRMaXN0ZW5lcnMKLSAqLwotcHVibGljIGNsYXNzIENhcmV0RXZlbnQgZXh0ZW5kcyBqYXZhLnV0aWwuRXZlbnRPYmplY3QgewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkvLyBpbml0aWFsaXplIHRvIGltcG9zc2libGUgbG9jYXRpb24KLQlpbnQgZlBvc2l0aW9uID0gLTE7Ci0KLQkvKioKLQkgKiBkb2VzbnQndCBtYWtlIHNlbnNlIHRvIGhhdmUgYSBDYXJldEV2ZW50IHdpdGhvdXQgdGhlIENhcmV0IHBvc3Rpb24sIHNvCi0JICogdXNlIG90aGVyIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIENhcmV0RXZlbnQoT2JqZWN0IHNvdXJjZSkgewotCQlzdXBlcihzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ2FyZXRFdmVudChPYmplY3Qgc291cmNlLCBpbnQgcG9zaXRpb24pIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJc2V0UG9zaXRpb24ocG9zaXRpb24pOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBmUG9zaXRpb247Ci0JfQotCi0Jdm9pZCBzZXRQb3NpdGlvbihpbnQgbmV3UG9zaXRpb24pIHsKLQkJZlBvc2l0aW9uID0gbmV3UG9zaXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL0lDYXJldExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvSUNhcmV0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk1ZTcyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvSUNhcmV0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnZpZXcuZXZlbnRzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gdXNlIGJhc2Ugc2VsZWN0aW9uIG5vdGlmaWNhdGlvbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYXJldExpc3RlbmVyIGV4dGVuZHMgamF2YS51dGlsLkV2ZW50TGlzdGVuZXIgewotCXB1YmxpYyB2b2lkIGNhcmV0TW92ZWQoQ2FyZXRFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvSU5vZGVTZWxlY3Rpb25MaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL0lOb2RlU2VsZWN0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRmZDlhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvSU5vZGVTZWxlY3Rpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudmlldy5ldmVudHM7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBiYXNlIHNlbGVjdGlvbiBub3RpZmljYXRpb24KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlU2VsZWN0aW9uTGlzdGVuZXIgewotCXZvaWQgbm9kZVNlbGVjdGlvbkNoYW5nZWQoTm9kZVNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvSVRleHRTZWxlY3Rpb25MaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL0lUZXh0U2VsZWN0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0MWJmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvSVRleHRTZWxlY3Rpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudmlldy5ldmVudHM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgLSB1c2UgYmFzZSBzZWxlY3Rpb24gbm90aWZpY2F0aW9uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRTZWxlY3Rpb25MaXN0ZW5lciB7Ci0Jdm9pZCB0ZXh0U2VsZWN0aW9uQ2hhbmdlZChUZXh0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9Ob2RlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvTm9kZVNlbGVjdGlvbkNoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzlkNzUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9Ob2RlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gdXNlIGJhc2Ugc2VsZWN0aW9uIG5vdGlmaWNhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgTm9kZVNlbGVjdGlvbkNoYW5nZWRFdmVudCBleHRlbmRzIGphdmEudXRpbC5FdmVudE9iamVjdCB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCWludCBmQ2FyZXRQb3NpdGlvbjsKLQotCUxpc3QgZlNlbGVjdGVkTm9kZXM7Ci0KLQlwdWJsaWMgTm9kZVNlbGVjdGlvbkNoYW5nZWRFdmVudChPYmplY3Qgc291cmNlLCBMaXN0IHNlbGVjdGVkTm9kZXMsIGludCBjYXJldFBvc2l0aW9uKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCWZTZWxlY3RlZE5vZGVzID0gc2VsZWN0ZWROb2RlczsKLQkJZkNhcmV0UG9zaXRpb24gPSBjYXJldFBvc2l0aW9uOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q2FyZXRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZDYXJldFBvc2l0aW9uOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFNlbGVjdGVkTm9kZXMoKSB7Ci0JCXJldHVybiBmU2VsZWN0ZWROb2RlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvVGV4dFNlbGVjdGlvbkNoYW5nZWRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL1RleHRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4MDdlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvVGV4dFNlbGVjdGlvbkNoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudmlldy5ldmVudHM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgLSB1c2UgYmFzZSBzZWxlY3Rpb24gbm90aWZpY2F0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV4dGVuZHMgamF2YS51dGlsLkV2ZW50T2JqZWN0IHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JaW50IGZUZXh0U2VsZWN0aW9uRW5kOwotCi0JaW50IGZUZXh0U2VsZWN0aW9uU3RhcnQ7Ci0KLQlwdWJsaWMgVGV4dFNlbGVjdGlvbkNoYW5nZWRFdmVudChPYmplY3Qgc291cmNlLCBpbnQgdGV4dFNlbGVjdGlvblN0YXJ0LCBpbnQgdGV4dFNlbGVjdGlvbkVuZCkgewotCQlzdXBlcihzb3VyY2UpOwotCQlmVGV4dFNlbGVjdGlvblN0YXJ0ID0gdGV4dFNlbGVjdGlvblN0YXJ0OwotCQlmVGV4dFNlbGVjdGlvbkVuZCA9IHRleHRTZWxlY3Rpb25FbmQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0U2VsZWN0aW9uRW5kKCkgewotCQlyZXR1cm4gZlRleHRTZWxlY3Rpb25FbmQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0U2VsZWN0aW9uU3RhcnQoKSB7Ci0JCXJldHVybiBmVGV4dFNlbGVjdGlvblN0YXJ0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9wcmVmZXJlbmNlcy9BYnN0cmFjdENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvcHJlZmVyZW5jZXMvQWJzdHJhY3RDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmMxNzFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9wcmVmZXJlbmNlcy9BYnN0cmFjdENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnk7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiA8cD5JbXBsZW1lbnRzIGEgY29tcGxldGlvbiBwcm9wb3NhbCBjYXRlZ29yaWVzIGNvbmZpZ3VyYXRpb24KLSAqIHJlYWRlciBhbmQgd3JpdGVyIHVzaW5nIGFuIHtAbGluayBJUHJlZmVyZW5jZVN0b3JlfTwvcD4KLSAqIAotICogPHA+VGhpcyBjbGFzcyBpcyBtZWFudCB0byBiZSBzdWJjbGFzc2VzIGJ5IGltcGxlbWVudGVycyBvZiB0aGUKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb248L2NvZGU+Ci0gKiBleHRlbnNpb24gcG9pbnQgYXMgYSBjb252aW5jZSByYXRoZXIgdGhlbiBpbXBsZW1lbnRpbmcKLSAqIHtAbGluayBJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25SZWFkZXJ9IGFuZAotICoge0BsaW5rIElDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlcn0gZnJvbSBzY3JhdGNoLjwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24KLQkJaW1wbGVtZW50cyBJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25SZWFkZXIsCi0JCUlDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlciB7Ci0KLQkvKiogU2VwYXJhdG9yIHVzZWQgYmV0d2VlbiBwcmVmZXJlbmNlcyBzdG9yZWQgaW4gdGhlIHNhbWUga2V5ICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQ0FURUdPUllfU0VQRVJBVE9SID0gIlwwIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIDxwPntAbGluayBDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeX0gSURzIHNvcnRlZCBieSB0aGUgb3JkZXIgdGhleSBzaG91bGQKLQkgKiBiZSBsaXN0ZWQgb24gdGhlIGRlZmF1bHQgcGFnZSBpZiB0aGV5IGFyZSBiZWluZyBkaXNwbGF5ZWQgdGhlcmU8L3A+Ci0JICogCi0JICogPGNvZGU+e0BsaW5rIExpc3R9PHtAbGluayBTdHJpbmd9PjwvY29kZT4KLQkgKiA8dWw+PGxpPjxiPnZhbHVlczo8L2I+IHtAbGluayBDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeX0gSURzPC9saT48L3VsPgotCSAqLwotCXByaXZhdGUgTGlzdCBmRGVmYXVsdFBhZ2VTb3J0T3JkZXI7Ci0JCi0JLyoqCi0JICogPHA+e0BsaW5rIENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5fSBJRHMgc29ydGVkIGJ5IHRoZSBvcmRlciB0aGV5IHNob3VsZAotCSAqIGJlIGN5Y2xlZCB0aHJvdWdoPC9wPgotCSAqIAotCSAqIDxjb2RlPntAbGluayBMaXN0fTx7QGxpbmsgU3RyaW5nfT48L2NvZGU+Ci0JICogPHVsPjxsaT48Yj52YWx1ZXM6PC9iPiB7QGxpbmsgQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnl9IElEczwvbGk+PC91bD4KLQkgKi8KLQlwcml2YXRlIExpc3QgZk93blBhZ2VTb3J0T3JkZXI7Ci0JCi0JLyoqCi0JICogPHA+e0BsaW5rIENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5fSBJRHMgdGhhdCBzaG91bGQgbm90IGJlIGRpc3BsYXllZCBvbgotCSAqIHRoZWlyIG93biBwYWdlPC9wPgotCSAqIAotCSAqIDxjb2RlPntAbGluayBTZXR9PHtAbGluayBTdHJpbmd9PjwvY29kZT4KLQkgKiA8dWw+PGxpPjxiPnZhbHVlczo8L2I+IHtAbGluayBDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeX0gSURzPC9saT48L3VsPgotCSAqLwotCXByaXZhdGUgU2V0IGZTaG91bGROb3REaXNwbGF5T25Pd25QYWdlOwotCQotCS8qKgotCSAqIDxwPntAbGluayBDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeX0gSURzIHRoYXQgc2hvdWxkIG5vdCBiZSBkaXNwbGF5ZWQgb24KLQkgKiBvbiB0aGUgZGVmYXVsdCBwYWdlPC9wPgotCSAqIAotCSAqIDxjb2RlPntAbGluayBTZXR9PHtAbGluayBTdHJpbmd9PjwvY29kZT4KLQkgKiA8dWw+PGxpPjxiPnZhbHVlczo8L2I+IHtAbGluayBDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeX0gSURzPC9saT48L3VsPgotCSAqLwotCXByaXZhdGUgU2V0IGZTaG91bGROb3REaXNwbGF5T25EZWZhdWx0UGFnZTsKLQkKLQkvKioKLQkgKiA8cD5DcmVhdGUgYSBuZXcgY29uZmlndXJhdGlvbiBieSBsb2FkaW5nIGZyb20gdGhlIGFzc29jaWF0ZWQge0BsaW5rIElQcmVmZXJlbmNlU3RvcmV9PC9wPgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uKCkgewotCQl0aGlzLmZPd25QYWdlU29ydE9yZGVyID0gbmV3IEFycmF5TGlzdCgpOwotCQl0aGlzLmZEZWZhdWx0UGFnZVNvcnRPcmRlciA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGhpcy5mU2hvdWxkTm90RGlzcGxheU9uT3duUGFnZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCXRoaXMuZlNob3VsZE5vdERpc3BsYXlPbkRlZmF1bHRQYWdlID0gbmV3IEhhc2hTZXQoKTsKLQkJCi0JCXRoaXMubG9hZFVzZXJDb25maWd1cmF0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4ge0BsaW5rIElQcmVmZXJlbmNlU3RvcmV9IHRvIHJlYWQgYW5kIHdyaXRlIHRoZSBjb25maWd1cmF0aW9uIHRvIGFuZCBmcm9tCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBQcmVmZXJlbmNlIGtleSB0byB1c2UgaW4gdGhlIHtAbGluayBJUHJlZmVyZW5jZVN0b3JlfSBmb3IgdGhlIGNhdGVnb3J5IHNvcnQgb3JkZXIKLQkgKiB3aGVuIGN5Y2xpbmcgdGhyb3VnaCB0aGUgcGFnZXMKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBhZ2VTb3J0T3JkZXJQcmVmS2V5KCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBQcmVmZXJlbmNlIGtleSB0byB1c2UgaW4gdGhlIHtAbGluayBJUHJlZmVyZW5jZVN0b3JlfSBmb3IgdGhlIGNhdGVnb3J5IHNvcnQgb3JkZXIKLQkgKiBvbiB0aGUgZGVmYXVsdCBwYWdlCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0UGFnZVNvcnRPcmRlclByZWZLZXkoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFByZWZlcmVuY2Uga2V5IHRvIHVzZSBpbiB0aGUge0BsaW5rIElQcmVmZXJlbmNlU3RvcmV9IGZvciB3aGljaAotCSAqIGNhdGVnb3JpZXMgbm90IHRvIGRpc3BsYXkgb24gdGhlaXIgb3duIHBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFNob3VsZE5vdERpc3BsYXlPbk93blBhZ2VQcmVmS2V5KCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBQcmVmZXJlbmNlIGtleSB0byB1c2UgaW4gdGhlIHtAbGluayBJUHJlZmVyZW5jZVN0b3JlfSBmb3Igd2hpY2gKLQkgKiBjYXRlZ29yaWVzIG5vdCB0byBkaXNwbGF5IG9uIHRoZSBkZWZhdWx0IHBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFNob3VsZE5vdERpc3BsYXlPbkRlZmF1bHRQYWdlUHJlZktleSgpOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLklDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvblJlYWRlciNnZXRQYWdlU29ydE9yZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGludCBnZXRQYWdlU29ydE9yZGVyKFN0cmluZyBjYXRlZ29yeUlEKSB7Ci0JCWludCBzb3J0T3JkZXIgPSB0aGlzLmZPd25QYWdlU29ydE9yZGVyLmluZGV4T2YoY2F0ZWdvcnlJRCk7Ci0JCWlmKHNvcnRPcmRlciA9PSAtMSkgewotCQkJc29ydE9yZGVyID0gREVGQVVMVF9TT1JUX09SREVSOwotCQl9Ci0JCQotCQlyZXR1cm4gc29ydE9yZGVyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uUmVhZGVyI2dldERlZmF1bHRQYWdlU29ydE9yZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGludCBnZXREZWZhdWx0UGFnZVNvcnRPcmRlcihTdHJpbmcgY2F0ZWdvcnlJRCkgewotCQlpbnQgc29ydE9yZGVyID0gdGhpcy5mRGVmYXVsdFBhZ2VTb3J0T3JkZXIuaW5kZXhPZihjYXRlZ29yeUlEKTsKLQkJaWYoc29ydE9yZGVyID09IC0xKSB7Ci0JCQlzb3J0T3JkZXIgPSBERUZBVUxUX1NPUlRfT1JERVI7Ci0JCX0KLQkJCi0JCXJldHVybiBzb3J0T3JkZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLklDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvblJlYWRlciNzaG91bGREaXNwbGF5T25EZWZhdWx0UGFnZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZERpc3BsYXlPbkRlZmF1bHRQYWdlKFN0cmluZyBjYXRlZ29yeUlEKSB7Ci0JCXJldHVybiAhZlNob3VsZE5vdERpc3BsYXlPbkRlZmF1bHRQYWdlLmNvbnRhaW5zKGNhdGVnb3J5SUQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5JQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25SZWFkZXIjc2hvdWxkRGlzcGxheU9uT3duUGFnZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZERpc3BsYXlPbk93blBhZ2UoU3RyaW5nIGNhdGVnb3J5SUQpIHsKLQkJcmV0dXJuICF0aGlzLmZTaG91bGROb3REaXNwbGF5T25Pd25QYWdlLmNvbnRhaW5zKGNhdGVnb3J5SUQpOwotCX0KLQotCS8qKgotCSAqIDxwPiBMb2FkcyBkZWZhdWx0cyBmcm9tIHRoZSBhc3NvY2lhdGVkIHtAbGluayBJUHJlZmVyZW5jZVN0b3JlfTwvcD4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyI2xvYWREZWZhdWx0cygpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZERlZmF1bHRzKCkgewotCQl0aGlzLmxvYWREZWZhdWx0UGFnZVByZWZlcmVuY2UodHJ1ZSk7Ci0JCXRoaXMubG9hZFBhZ2VTb3J0T3JkZXIodHJ1ZSk7Ci0JCXRoaXMubG9hZERlZmF1bHRQYWdlU29ydE9yZGVyKHRydWUpOwotCQl0aGlzLmxvYWRTaG91bGROb3REaXNwbGF5T25Pd25QYWdlKHRydWUpOwotCX0KLQotCS8qKgotCSAqIDxwPlNhdmVzIHRvIHRoZSBhc3NvY2lhdGVkIHtAbGluayBJUHJlZmVyZW5jZVN0b3JlfTwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyI3NhdmVDb25maWd1cmF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYXZlQ29uZmlndXJhdGlvbigpIHsKLQkJdGhpcy5zYXZlU2hvdWxkRGlzcGxheU9uRGVmYXVsdFBhZ2VDb25maWd1cmF0aW9uKCk7Ci0JCXRoaXMuc2F2ZVNob3VsZERpc3BsYXlPbk93blBhZ2VDb25maWd1cmF0aW9uKCk7Ci0JCXRoaXMuc2F2ZURlZmF1bHRQYWdlU29ydE9yZGVyQ29uZmlndXJhdGlvbigpOwotCQl0aGlzLnNhdmVQYWdlU29ydE9yZGVyQ29uZmlndXJhdGlvbigpOwotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLklDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlciNzZXRTaG91bGREaXNwbGF5T25EZWZhdWx0UGFnZShqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNob3VsZERpc3BsYXlPbkRlZmF1bHRQYWdlKFN0cmluZyBjYXRlZ29yeUlELAotCQkJYm9vbGVhbiBzaG91bGREaXNwbGF5KSB7Ci0JCQotCQlpZihzaG91bGREaXNwbGF5KSB7Ci0JCQl0aGlzLmZTaG91bGROb3REaXNwbGF5T25EZWZhdWx0UGFnZS5yZW1vdmUoY2F0ZWdvcnlJRCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmZTaG91bGROb3REaXNwbGF5T25EZWZhdWx0UGFnZS5hZGQoY2F0ZWdvcnlJRCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyI3NldFNob3VsZERpc3BsYXlPbk93blBhZ2UoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG91bGREaXNwbGF5T25Pd25QYWdlKFN0cmluZyBjYXRlZ29yeUlELCBib29sZWFuIHNob3VsZERpc3BsYXkpIHsKLQkJCi0JCWlmKHNob3VsZERpc3BsYXkpIHsKLQkJCXRoaXMuZlNob3VsZE5vdERpc3BsYXlPbk93blBhZ2UucmVtb3ZlKGNhdGVnb3J5SUQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5mU2hvdWxkTm90RGlzcGxheU9uT3duUGFnZS5hZGQoY2F0ZWdvcnlJRCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLklDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlciNzZXRQYWdlT3JkZXIoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFnZU9yZGVyKExpc3Qgb3JkZXIpIHsKLQkJdGhpcy5mT3duUGFnZVNvcnRPcmRlciA9IG9yZGVyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyI3NldERlZmF1bHRQYWdlT3JkZXIoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFBhZ2VPcmRlcihMaXN0IG9yZGVyKSB7Ci0JCXRoaXMuZkRlZmF1bHRQYWdlU29ydE9yZGVyID0gb3JkZXI7Ci0JfQotCi0JLyoqCi0JICogPHA+TG9hZHMgdGhlIHVzZXIgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBhc3NvY2lhdGVkIHtAbGluayBJUHJlZmVyZW5jZVN0b3JlfTwvcD4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFVzZXJDb25maWd1cmF0aW9uKCkgewotCQl0aGlzLmxvYWREZWZhdWx0UGFnZVByZWZlcmVuY2UoZmFsc2UpOwotCQl0aGlzLmxvYWRQYWdlU29ydE9yZGVyKGZhbHNlKTsKLQkJdGhpcy5sb2FkRGVmYXVsdFBhZ2VTb3J0T3JkZXIoZmFsc2UpOwotCQl0aGlzLmxvYWRTaG91bGROb3REaXNwbGF5T25Pd25QYWdlKGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+TG9hZHMgdGhlIHVzZXIgcHJlZmVyZW5jZXMgZm9yIHdoaWNoIGNhdGVnb3JpZXMgdG8KLQkgKiBkaXNwbGF5IG9uIHRoZSBkZWZhdWx0IGNvbnRlbnQgYXNzaXN0IHBhZ2U8L3A+Ci0JICogCi0JICogQHBhcmFtIHVzZURlZmF1bHRzIGlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gdXNlIHRoZSB7QGxpbmsgSVByZWZlcmVuY2VTdG9yZX0gZGVmYXVsdHMsCi0JICogb3RoZXJ3aXNlIHVzZSB0aGUgdXNlciBzcGVjaWZpZWQgcHJlZmVyZW5jZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERlZmF1bHRQYWdlUHJlZmVyZW5jZShib29sZWFuIHVzZURlZmF1bHRzKSB7Ci0JCS8vY2xlYXIgdGhlIGN1cnJlbnQgZGlzcGxheSBvbiBkZWZhdWx0IHBhZ2UgY29uZmlndXJhdGlvbgotCQl0aGlzLmZTaG91bGROb3REaXNwbGF5T25EZWZhdWx0UGFnZS5jbGVhcigpOwotCQkKLQkJLy9wYXJzZSBlaXRoZXIgdGhlIGRlZmF1bHQgb3IgdXNlciBjb25maWd1cmF0aW9uIHByZWZlcmVuY2UKLQkJU3RyaW5nIGRpc3BsYXlPbkRlZmF1bHRQYWdlOwotCQlpZih1c2VEZWZhdWx0cykgewotCQkJZGlzcGxheU9uRGVmYXVsdFBhZ2UgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0U3RyaW5nKGdldFNob3VsZE5vdERpc3BsYXlPbkRlZmF1bHRQYWdlUHJlZktleSgpKTsKLQkJfSBlbHNlIHsKLQkJCWRpc3BsYXlPbkRlZmF1bHRQYWdlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKGdldFNob3VsZE5vdERpc3BsYXlPbkRlZmF1bHRQYWdlUHJlZktleSgpKTsKLQkJfQotCQlTdHJpbmdUb2tlbml6ZXIgZGVmYXVsdFBhZ2VUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRpc3BsYXlPbkRlZmF1bHRQYWdlLCBQUkVGRVJFTkNFX0NBVEVHT1JZX1NFUEVSQVRPUik7Ci0JCXdoaWxlIChkZWZhdWx0UGFnZVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWZTaG91bGROb3REaXNwbGF5T25EZWZhdWx0UGFnZS5hZGQoZGVmYXVsdFBhZ2VUb2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPkxvYWRzIHRoZSB1c2VyIHByZWZlcmVuY2VzIGZvciB0aGUgc29ydCBvcmRlciBvZiB0aGUgY29udGVudCBhc3Npc3QgcGFnZXM8L3A+Ci0JICogCi0JICogQHBhcmFtIHVzZURlZmF1bHRzIGlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gdXNlIHRoZSB7QGxpbmsgSVByZWZlcmVuY2VTdG9yZX0gZGVmYXVsdHMsCi0JICogb3RoZXJ3aXNlIHVzZSB0aGUgdXNlciBzcGVjaWZpZWQgcHJlZmVyZW5jZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFBhZ2VTb3J0T3JkZXIoYm9vbGVhbiB1c2VEZWZhdWx0cyl7Ci0JCS8vY2xlYXIgdGhlIGN1cnJlbnQgc29ydCBvcmRlcgotCQl0aGlzLmZPd25QYWdlU29ydE9yZGVyLmNsZWFyKCk7Ci0JCQotCQkvL3BhcnNlIGVpdGhlciB0aGUgZGVmYXVsdCBvciB1c2VyIGNvbmZpZ3VyYXRpb24gcHJlZmVyZW5jZQotCQlTdHJpbmcgc29ydE9yZGVyOwotCQlpZih1c2VEZWZhdWx0cykgewotCQkJc29ydE9yZGVyID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0RGVmYXVsdFN0cmluZyhnZXRQYWdlU29ydE9yZGVyUHJlZktleSgpKTsKLQkJfSBlbHNlIHsKLQkJCXNvcnRPcmRlciA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhnZXRQYWdlU29ydE9yZGVyUHJlZktleSgpKTsKLQkJfQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzb3J0T3JkZXIsIFBSRUZFUkVOQ0VfQ0FURUdPUllfU0VQRVJBVE9SKTsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBjYXRlZ29yeUlEID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJdGhpcy5mT3duUGFnZVNvcnRPcmRlci5hZGQoY2F0ZWdvcnlJRCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+TG9hZHMgdGhlIHVzZXIgcHJlZmVyZW5jZXMgZm9yIHRoZSBzb3J0IG9yZGVyIG9mIHRoZSBjb250ZW50IGFzc2lzdCBwYWdlczwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdXNlRGVmYXVsdHMgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiB1c2UgdGhlIHtAbGluayBJUHJlZmVyZW5jZVN0b3JlfSBkZWZhdWx0cywKLQkgKiBvdGhlcndpc2UgdXNlIHRoZSB1c2VyIHNwZWNpZmllZCBwcmVmZXJlbmNlcwotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkRGVmYXVsdFBhZ2VTb3J0T3JkZXIoYm9vbGVhbiB1c2VEZWZhdWx0cyl7Ci0JCS8vY2xlYXIgdGhlIGN1cnJlbnQgc29ydCBvcmRlcgotCQl0aGlzLmZEZWZhdWx0UGFnZVNvcnRPcmRlci5jbGVhcigpOwotCQkKLQkJLy9wYXJzZSBlaXRoZXIgdGhlIGRlZmF1bHQgb3IgdXNlciBjb25maWd1cmF0aW9uIHByZWZlcmVuY2UKLQkJU3RyaW5nIHNvcnRPcmRlcjsKLQkJaWYodXNlRGVmYXVsdHMpIHsKLQkJCXNvcnRPcmRlciA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRTdHJpbmcoZ2V0RGVmYXVsdFBhZ2VTb3J0T3JkZXJQcmVmS2V5KCkpOwotCQl9IGVsc2UgewotCQkJc29ydE9yZGVyID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKGdldERlZmF1bHRQYWdlU29ydE9yZGVyUHJlZktleSgpKTsKLQkJfQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzb3J0T3JkZXIsIFBSRUZFUkVOQ0VfQ0FURUdPUllfU0VQRVJBVE9SKTsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBjYXRlZ29yeUlEID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJdGhpcy5mRGVmYXVsdFBhZ2VTb3J0T3JkZXIuYWRkKGNhdGVnb3J5SUQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPkxvYWRzIHRoZSB1c2VyIHByZWZlcmVuY2VzIGZvciB3aGljaCBjYXRlZ29yaWVzIHNob3VsZCBub3QgYmUgZGlzcGxheWVkIG9uIHRoZWlyIG93bgotCSAqIGNvbnRlbnQgYXNzaXN0IHBhZ2U8L3A+Ci0JICogCi0JICogQHBhcmFtIHVzZURlZmF1bHRzIGlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gdXNlIHRoZSB7QGxpbmsgSVByZWZlcmVuY2VTdG9yZX0gZGVmYXVsdHMsCi0JICogb3RoZXJ3aXNlIHVzZSB0aGUgdXNlciBzcGVjaWZpZWQgcHJlZmVyZW5jZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFNob3VsZE5vdERpc3BsYXlPbk93blBhZ2UoYm9vbGVhbiB1c2VEZWZhdWx0cyl7Ci0JCS8vY2xlYXIgdGhlIGN1cnJlbnQgc29ydCBvcmRlcgotCQl0aGlzLmZTaG91bGROb3REaXNwbGF5T25Pd25QYWdlLmNsZWFyKCk7Ci0JCQotCQkvL3BhcnNlIGVpdGhlciB0aGUgZGVmYXVsdCBvciB1c2VyIGNvbmZpZ3VyYXRpb24gcHJlZmVyZW5jZQotCQlTdHJpbmcgcHJlZmVyZW5jZTsKLQkJaWYodXNlRGVmYXVsdHMpIHsKLQkJCXByZWZlcmVuY2UgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0U3RyaW5nKGdldFNob3VsZE5vdERpc3BsYXlPbk93blBhZ2VQcmVmS2V5KCkpOwotCQl9IGVsc2UgewotCQkJcHJlZmVyZW5jZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhnZXRTaG91bGROb3REaXNwbGF5T25Pd25QYWdlUHJlZktleSgpKTsKLQkJfQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcmVmZXJlbmNlLCBQUkVGRVJFTkNFX0NBVEVHT1JZX1NFUEVSQVRPUik7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgY2F0ZWdvcnlJRCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCXRoaXMuZlNob3VsZE5vdERpc3BsYXlPbk93blBhZ2UuYWRkKGNhdGVnb3J5SUQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPlNhdmVzIHRoZSB1c2VyIHByZWZlcmVuY2VzIGZvciB3aGljaCBjYXRlZ29yaWVzIHRvCi0JICogZGlzcGxheSBvbiB0aGUgZGVmYXVsdCBjb250ZW50IGFzc2lzdCBwYWdlPC9wPgotCSAqLwotCXByaXZhdGUgdm9pZCBzYXZlU2hvdWxkRGlzcGxheU9uRGVmYXVsdFBhZ2VDb25maWd1cmF0aW9uKCkgewotCQkvL2NyZWF0ZSB0aGUgcHJlZmVyZW5jZSBzdHJpbmcKLQkJU3RyaW5nQnVmZmVyIGRlZmF1bHRQYWdlQnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSXRlcmF0b3IgZGVmYXVsdFBhZ2VJdGVyID0gdGhpcy5mU2hvdWxkTm90RGlzcGxheU9uRGVmYXVsdFBhZ2UuaXRlcmF0b3IoKTsKLQkJd2hpbGUoZGVmYXVsdFBhZ2VJdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGNhdGVnb3J5SUQgPSAoU3RyaW5nKWRlZmF1bHRQYWdlSXRlci5uZXh0KCk7Ci0JCQlkZWZhdWx0UGFnZUJ1ZmYuYXBwZW5kKGNhdGVnb3J5SUQgKyBQUkVGRVJFTkNFX0NBVEVHT1JZX1NFUEVSQVRPUik7Ci0JCX0KLQkJCi0JCS8vc2F2ZSB0aGUgcHJlZmVyZW5jZQotCQl0aGlzLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKHRoaXMuZ2V0U2hvdWxkTm90RGlzcGxheU9uRGVmYXVsdFBhZ2VQcmVmS2V5KCksIGRlZmF1bHRQYWdlQnVmZi50b1N0cmluZygpKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+U2F2ZXMgdGhlIHVzZXIgcHJlZmVyZW5jZXMgZm9yIHRoZSBzb3J0IG9yZGVyIG9mIHRoZSBjb250ZW50IGFzc2lzdCBwYWdlczwvcD4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2F2ZVBhZ2VTb3J0T3JkZXJDb25maWd1cmF0aW9uKCkgewotCQkvL2NyZWF0ZSB0aGUgcHJlZmVyZW5jZSBzdHJpbmcKLQkJU3RyaW5nQnVmZmVyIG9yZGVyQnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IHRoaXMuZk93blBhZ2VTb3J0T3JkZXIuc2l6ZSgpOyArK2kpIHsKLQkJCWlmKHRoaXMuZk93blBhZ2VTb3J0T3JkZXIuZ2V0KGkpICE9IG51bGwpIHsKLQkJCQlvcmRlckJ1ZmYuYXBwZW5kKHRoaXMuZk93blBhZ2VTb3J0T3JkZXIuZ2V0KGkpICsgUFJFRkVSRU5DRV9DQVRFR09SWV9TRVBFUkFUT1IpOwotCQkJfQotCQl9Ci0JCQotCQkvL3NhdmUgdGhlIHByZWZlcmVuY2UKLQkJdGhpcy5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSh0aGlzLmdldFBhZ2VTb3J0T3JkZXJQcmVmS2V5KCksIG9yZGVyQnVmZi50b1N0cmluZygpKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+U2F2ZXMgdGhlIHVzZXIgcHJlZmVyZW5jZXMgZm9yIHRoZSBzb3J0IG9yZGVyIG9mIHRoZSBjYXRlZ29yaWVzIG9uIHRoZSBkZWZhdWx0IHBhZ2U8L3A+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNhdmVEZWZhdWx0UGFnZVNvcnRPcmRlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vY3JlYXRlIHRoZSBwcmVmZXJlbmNlIHN0cmluZwotCQlTdHJpbmdCdWZmZXIgb3JkZXJCdWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgdGhpcy5mRGVmYXVsdFBhZ2VTb3J0T3JkZXIuc2l6ZSgpOyArK2kpIHsKLQkJCWlmKHRoaXMuZkRlZmF1bHRQYWdlU29ydE9yZGVyLmdldChpKSAhPSBudWxsKSB7Ci0JCQkJb3JkZXJCdWZmLmFwcGVuZCh0aGlzLmZEZWZhdWx0UGFnZVNvcnRPcmRlci5nZXQoaSkgKyBQUkVGRVJFTkNFX0NBVEVHT1JZX1NFUEVSQVRPUik7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vc2F2ZSB0aGUgcHJlZmVyZW5jZQotCQl0aGlzLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKHRoaXMuZ2V0RGVmYXVsdFBhZ2VTb3J0T3JkZXJQcmVmS2V5KCksIG9yZGVyQnVmZi50b1N0cmluZygpKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+U2F2ZXMgdGhlIHVzZXIgcHJlZmVyZW5jZXMgZm9yIHdoaWNoIGNhdGVnb3JpZXMgc2hvdWxkIG5vdCBiZSBkaXNwbGF5ZWQgb24gdGhlaXIgb3duCi0JICogY29udGVudCBhc3Npc3QgcGFnZTwvcD4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2F2ZVNob3VsZERpc3BsYXlPbk93blBhZ2VDb25maWd1cmF0aW9uKCkgewotCQkvL2NyZWF0ZSB0aGUgcHJlZmVyZW5jZSBzdHJpbmcKLQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmZTaG91bGROb3REaXNwbGF5T25Pd25QYWdlLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgY2F0ZWdvcnlJRCA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0JCQlidWZmLmFwcGVuZChjYXRlZ29yeUlEICsgUFJFRkVSRU5DRV9DQVRFR09SWV9TRVBFUkFUT1IpOwotCQl9Ci0JCQotCQkvL3NhdmUgdGhlIHByZWZlcmVuY2UKLQkJdGhpcy5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSh0aGlzLmdldFNob3VsZE5vdERpc3BsYXlPbk93blBhZ2VQcmVmS2V5KCksIGJ1ZmYudG9TdHJpbmcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ByZWZlcmVuY2VzL0NvZGVBc3Npc3RDeWNsaW5nQ29uZmlndXJhdGlvbkJsb2NrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvcHJlZmVyZW5jZXMvQ29kZUFzc2lzdEN5Y2xpbmdDb25maWd1cmF0aW9uQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFjZmVhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvcHJlZmVyZW5jZXMvQ29kZUFzc2lzdEN5Y2xpbmdDb25maWd1cmF0aW9uQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQ29tbWFuZE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJpemVkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5Ob3REZWZpbmVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29udGV4dHMuQ29udGV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5CaW5kaW5nTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5TY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuVHJpZ2dlclNlcXVlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5QaXhlbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLklDb21tYW5kU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5rZXlzLklCaW5kaW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxDb21wdXRlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotCi0KLS8qKgotICogPHA+QSBoZWxwZnVsIHByZWZlcmVuY2UgY29uZmlndXJhdGlvbiBibG9jayBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsb3dpbmcgYSB1c2VyIHRvCi0gKiBzZXQgdGhlaXIgcHJlZmVyZW5jZXMgZm9yIHdoaWNoIGNvbnRlbnQgYXNzaXN0IGNhdGVnb3JpZXMgdG8gc2hvdyBvbiB0aGUgZGVmYXVsdAotICogY29udGVudCBhc3Npc3QgcGFnZSBhcyB3ZWxsIGFzIG9uIHRoZWlyIG93biBzZXBhcmF0ZSBwYWdlIGFuZCBwYWdlIG9yZGVyaW5nIGZvcgotICogYSBzcGVjaWZpYyBjb250ZW50IHR5cGU8L3A+Ci0gKiAKLSAqIEBiYXNlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5Db2RlQXNzaXN0QWR2YW5jZWRDb25maWd1cmF0aW9uQmxvY2sKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvZGVBc3Npc3RDeWNsaW5nQ29uZmlndXJhdGlvbkJsb2NrICB7Ci0KLQkvKioKLQkgKiA8cD5Vc2VkIHRvIGNvbXBhcmUgY2F0ZWdvcmllcyBiYXNlZCBvbiB0aGVpciBhc3NpZ25lZCBwYWdlIHJhbms8L3A+Ci0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yIGZDYXRlZ29yeVBhZ2VDb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCXByaXZhdGUgaW50IGdldFJhbmsoT2JqZWN0IG8pIHsKLQkJCXJldHVybiAoKE1vZGVsRWxlbWVudCkgbykuZ2V0T3duUGFnZVJhbmsoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJaW50IHJlc3VsdCA9IGdldFJhbmsobzEpIC0gZ2V0UmFuayhvMik7Ci0JCQlpZihyZXN1bHQgPT0gMCkgewotCQkJCXJlc3VsdCA9ICgoTW9kZWxFbGVtZW50KSBvMSkuZ2V0SWQoKS5jb21wYXJlVG8oKChNb2RlbEVsZW1lbnQpIG8yKS5nZXRJZCgpKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9OwotCQotCS8qKgotCSAqIDxwPlVzZWQgdG8gY29tcGFyZSBjYXRlZ29yaWVzIGJhc2VkIG9uIHRoZWlyIGFzc2lnbmVkIGRlZmF1bHQgcGFnZSByYW5rPC9wPgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29tcGFyYXRvciBmQ2F0ZWdvcnlEZWZhdWx0UGFnZUNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQkJcHJpdmF0ZSBpbnQgZ2V0UmFuayhPYmplY3QgbykgewotCQkJcmV0dXJuICgoTW9kZWxFbGVtZW50KSBvKS5nZXREZWZhdWx0UGFnZVJhbmsoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJaW50IHJlc3VsdCA9IGdldFJhbmsobzEpIC0gZ2V0UmFuayhvMik7Ci0JCQlpZihyZXN1bHQgPT0gMCkgewotCQkJCXJlc3VsdCA9ICgoTW9kZWxFbGVtZW50KSBvMSkuZ2V0SWQoKS5jb21wYXJlVG8oKChNb2RlbEVsZW1lbnQpIG8yKS5nZXRJZCgpKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9OwotCi0JLyoqIHRoZSBwcmVmZXJlbmNlIG1vZGVsIGZvciB0aGlzIGJsb2NrICovCi0JcHJpdmF0ZSBmaW5hbCBQcmVmZXJlbmNlTW9kZWwgZk1vZGVsOwotCQotCS8qKgotCSAqIDxjb2RlPntAbGluayBNYXB9PHtAbGluayBJbWFnZURlc2NyaXB0b3J9LCB7QGxpbmsgSW1hZ2V9PjwvY29kZT4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE1hcCBmSW1hZ2VzPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqIHRhYmxlIHZpZXdlciB0byBjb25maWd1cmUgd2hpY2ggY2F0ZWdvcmllcyBhcmUgZGlzcGxheWVkIG9uIHRoZSBkZWZhdWx0IHBhZ2UgKi8KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgZkRlZmF1bHRQYWdlVmlld2VyOwotCQotCS8qKgotCSAqIHRhYmxlIHZpZXdlciB0byBjb25maWd1cmUgd2hpY2ggY2F0ZWdvcmllcyBhcmUgZGlzcGxheWVkCi0JICogb24gdGhlaXIgb3duIHBhZ2UsIGFzIHdlbGwgYXMgdGhlaXIgb3JkZXJpbmcKLQkgKi8KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgZk93blBhZ2VWaWV3ZXI7Ci0JCi0JLyoqIGNhdGVnb3JpZXMgcGFnZXMgc29ydCBvcmRlciB1cCBidXR0b24gKi8KLQlwcml2YXRlIEJ1dHRvbiBmUGFnZU9yZGVyVXBCdXR0b247Ci0JCi0JLyoqIGNhdGVnb3JpZXMgcGFnZXMgc29ydCBvcmRlciBkb3duIGJ1dHRvbiAqLwotCXByaXZhdGUgQnV0dG9uIGZQYWdlT3JkZXJEb3duQnV0dG9uOwotCQotCS8qKiBjYXRlZ29yaWVzIGRlZmF1bHQgcGFnZSBzb3J0IG9yZGVyIHVwIGJ1dHRvbiAqLwotCXByaXZhdGUgQnV0dG9uIGZEZWZhdWx0UGFnZU9yZGVyVXBCdXR0b247Ci0JCi0JLyoqIGNhdGVnb3JpZXMgZGVmYXVsdCBwYWdlICBzb3J0IG9yZGVyIGRvd24gYnV0dG9uICovCi0JcHJpdmF0ZSBCdXR0b24gZkRlZmF1bHRQYWdlT3JkZXJEb3duQnV0dG9uOwotCQotCS8qKiBUaGUgY29udGVudCB0eXBlIElEIHRoaXMgY29uZmlndXJhdGlvbiBibG9jayBpcyBmb3IgKi8KLQlwcml2YXRlIFN0cmluZyBmQ29udGVudFR5cGVJRDsKLQkKLQkvKiogVGhlIHdyaXRhYmxlIGNhdGVnb3JpZXMgY29uZmlndXJhdGlvbiAqLwotCXByaXZhdGUgSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyIGZDb25maWd1cmF0aW9uV3JpdGVyOwotCi0JLyoqCi0JICogPHA+Q3JlYXRlcyBhIG5ldyBjb250ZW50IGFzc2lzdCBwcmVmZXJlbmNlIGJsb2NrIGZvciB0aGUgZ2l2ZW4gY29udGVudCB0eXBlCi0JICogdXNpbmcgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gd3JpdGVyPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50VHlwZUlEIGNvbnRlbnQgdHlwZSB0aGlzIGNvbnRlbnQgYXNzaXN0IHByZWZlcmVuY2UgYmxvY2sgaXMgZm9yCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb25Xcml0ZXIge0BsaW5rIElDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlcn0gdXNlZAotCSAqIHRvIHJlYWQgYW5kIHdyaXRlIHRoZSB1c2VyIHByZWZlcmVuY2VzIAotCSAqLwotCXB1YmxpYyBDb2RlQXNzaXN0Q3ljbGluZ0NvbmZpZ3VyYXRpb25CbG9jayhTdHJpbmcgY29udGVudFR5cGVJRCwgSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyIGNvbmZpZ3VyYXRpb25Xcml0ZXIpIHsKLQkJdGhpcy5mQ29udGVudFR5cGVJRCA9IGNvbnRlbnRUeXBlSUQ7Ci0JCXRoaXMuZkNvbmZpZ3VyYXRpb25Xcml0ZXIgPSBjb25maWd1cmF0aW9uV3JpdGVyOwotCQkKLQkJTGlzdCBjYXRlZ29yaWVzID0gQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJSZWdpc3RyeS5nZXREZWZhdWx0KCkuZ2V0UHJvcG9zYWxDYXRlZ29yaWVzKHRoaXMuZkNvbnRlbnRUeXBlSUQpOwotCQl0aGlzLmZNb2RlbCA9IG5ldyBQcmVmZXJlbmNlTW9kZWwoY2F0ZWdvcmllcyk7Ci0JfQotCQotCS8qKgotCSAqIDxwPlNhdmVzIHRoZSB1c2VyIGNvbmZpZ3VyYXRpb248L3A+Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdG9yZSB3YXMgc3VjY2Vzc2Z1bCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN0b3JlVmFsdWVzKCkgewotCQlyZXR1cm4gdGhpcy5mQ29uZmlndXJhdGlvbldyaXRlci5zYXZlQ29uZmlndXJhdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiA8cD5Mb2FkcyB0aGUgcHJlZmVyZW5jZSBkZWZhdWx0czwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXRoaXMuZkNvbmZpZ3VyYXRpb25Xcml0ZXIubG9hZERlZmF1bHRzKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVZhbHVlcygpOwotCQl0aGlzLmZNb2RlbC5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+RGlzcG9zZXMgb2YgdGhpcyBwcmVmZXJlbmNlIGJsb2NrPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQ9IGZJbWFnZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSW1hZ2UgaW1hZ2U9IChJbWFnZSkgaXQubmV4dCgpOwotCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+Q3JlYXRlcyB0aGUgY29udGVudHMgb2YgdGhpcyBjb25maWd1cmF0aW9uIGJsb2NrIHVzaW5nIGEge0BsaW5rIEdyb3VwfSBpZgotCSAqIHRoZSBnaXZlbiA8Y29kZT5ncm91cFRpdGxlPC9jb2RlPiBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4gZWxzZSBjcmVhdGVzIGl0Ci0JICogYXMgYSBjb21wb3NpdGUgYW5kIGluIGVpdGhlciBjYXNlIGFkZHMgaXRzZWxmIHRvIHRoZSBnaXZlbiBwYXJlbnQ8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhcmVudCB7QGxpbmsgQ29tcG9zaXRlfSBwYXJlbnQgdG8gYWRkIHRoaXMgY29uZmlndXJhdGlvbiBibG9jayB0bwotCSAqIEBwYXJhbSBncm91cFRpdGxlIFRpdGxlIHRvIHVzZSBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gYmxvY2sgZ3JvdXAsIGlmCi0JICogPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBhIHtAbGluayBDb21wb3NpdGV9IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIGEKLQkgKiB7QGxpbmsgR3JvdXB9Ci0JICogCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBjb25maWd1cmF0aW9uIGJsb2NrIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgcGFyZW50Ci0JICovCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGdyb3VwVGl0bGUpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lcjsKLQkJaWYoZ3JvdXBUaXRsZSAhPSBudWxsKSB7Ci0JCQljb250YWluZXIgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQkoKEdyb3VwKWNvbnRhaW5lcikuc2V0VGV4dChncm91cFRpdGxlKTsKLQkJfSBlbHNlIHsKLQkJCWNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCX0KLQkJaW50IGNvbHVtbnM9IDI7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0PSBuZXcgR3JpZExheW91dChjb2x1bW5zLCBmYWxzZSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQljcmVhdGVEZWZhdWx0UGFnZUxhYmVsKGNvbnRhaW5lciwgY29sdW1ucyk7Ci0JCWNyZWF0ZURlZmF1bHRQYWdlU2VjdGlvbihjb250YWluZXIpOwotCi0JCWNyZWF0ZUZpbGxlcihjb250YWluZXIsIGNvbHVtbnMpOwotCi0JCWNyZWF0ZU93blBhZ2VMYWJlbChjb250YWluZXIsIGNvbHVtbnMpOwotICAgICAgICBjcmVhdGVPd25QYWdlU2VjdGlvbihjb250YWluZXIpOwotCi0gICAgICAgIGNyZWF0ZUZpbGxlcihjb250YWluZXIsIGNvbHVtbnMpOwotCi0JCWlmIChmTW9kZWwucGFnZUVsZW1lbnRzLnNpemUoKSA+IDApIHsKLQkJCWZEZWZhdWx0UGFnZVZpZXdlci5nZXRUYWJsZSgpLnNlbGVjdCgwKTsKLQkJCWZPd25QYWdlVmlld2VyLmdldFRhYmxlKCkuc2VsZWN0KDApOwotCQkJaGFuZGxlT3duUGFnZVRhYmxlU2VsZWN0aW9uKCk7Ci0JCQloYW5kbGVEZWZhdWx0UGFnZVRhYmxlU2VsZWN0aW9uKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCQotCS8qKgotCSAqIDxwPkluaXRpYWxpemUgdGhlIHZhbHVlcyBvZiB0aGUgY29uZmlndXJhdGlvbiBibG9jazwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQl1cGRhdGVDaGVja2VkU3RhdGUoKTsKLQkJZkRlZmF1bHRQYWdlVmlld2VyLnJlZnJlc2goKTsKLQkJZk93blBhZ2VWaWV3ZXIucmVmcmVzaCgpOwotCQloYW5kbGVPd25QYWdlVGFibGVTZWxlY3Rpb24oKTsKLQkJaGFuZGxlRGVmYXVsdFBhZ2VUYWJsZVNlbGVjdGlvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdFBhZ2VTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJY3JlYXRlRGVmYXVsdFBhZ2VWaWV3ZXIoY29tcG9zaXRlKTsKLQkJY3JlYXRlRGVmYXVsdFBhZ2VCdXR0b25MaXN0KGNvbXBvc2l0ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRQYWdlTGFiZWwoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGhfc3BhbikgewotCSAgICBmaW5hbCBJQ29tbWFuZFNlcnZpY2UgY29tbWFuZFN2Yz0gKElDb21tYW5kU2VydmljZSkgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBZGFwdGVyKElDb21tYW5kU2VydmljZS5jbGFzcyk7Ci0JCWZpbmFsIENvbW1hbmQgY29tbWFuZD0gY29tbWFuZFN2Yy5nZXRDb21tYW5kKElUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5DT05URU5UX0FTU0lTVF9QUk9QT1NBTFMpOwotCQlQYXJhbWV0ZXJpemVkQ29tbWFuZCBwQ21kPSBuZXcgUGFyYW1ldGVyaXplZENvbW1hbmQoY29tbWFuZCwgbnVsbCk7Ci0JCVN0cmluZyBrZXk9IGdldEtleWJvYXJkU2hvcnRjdXQocENtZCk7Ci0JCWlmIChrZXkgPT0gbnVsbCkgewotCQkJa2V5PSBTU0VVSU1lc3NhZ2VzLkNvZGVBc3Npc3RBZHZhbmNlZENvbmZpZ3VyYXRpb25CbG9ja19ub19zaG9ydGN1dDsKLQkJfQotCi0JCVBpeGVsQ29udmVydGVyIHBpeGVsQ29udmVydGVyPSBuZXcgUGl4ZWxDb252ZXJ0ZXIoY29tcG9zaXRlKTsKLQkJaW50IHdpZHRoPSBwaXhlbENvbnZlcnRlci5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNDApOwotCi0JCUxhYmVsIGxhYmVsPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSB8IFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChTU0VVSU1lc3NhZ2VzLkNvZGVBc3Npc3RBZHZhbmNlZENvbmZpZ3VyYXRpb25CbG9ja19wYWdlX2Rlc2NyaXB0aW9uLCBuZXcgT2JqZWN0W10geyBrZXkgfSkpOwotCQlHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlLCBoX3NwYW4sIDEpOwotCQlnZC53aWR0aEhpbnQ9IHdpZHRoOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQljcmVhdGVGaWxsZXIoY29tcG9zaXRlLCBoX3NwYW4pOwotCi0JCWxhYmVsPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSB8IFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLkNvZGVBc3Npc3RBZHZhbmNlZENvbmZpZ3VyYXRpb25CbG9ja19kZWZhdWx0X3RhYmxlX2Rlc2NyaXB0aW9uKTsKLQkJZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSwgaF9zcGFuLCAxKTsKLQkJZ2Qud2lkdGhIaW50PSB3aWR0aDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRQYWdlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJZkRlZmF1bHRQYWdlVmlld2VyPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJVGFibGUgdGFibGU9IGZEZWZhdWx0UGFnZVZpZXdlci5nZXRUYWJsZSgpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5CRUdJTk5JTkcsIGZhbHNlLCBmYWxzZSwgMSwgMSkpOwotCi0JCVRhYmxlQ29sdW1uIG5hbWVDb2x1bW49IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQluYW1lQ29sdW1uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5Db2RlQXNzaXN0QWR2YW5jZWRDb25maWd1cmF0aW9uQmxvY2tfZGVmYXVsdF90YWJsZV9jYXRlZ29yeV9jb2x1bW5fdGl0bGUpOwotCQluYW1lQ29sdW1uLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0KLQkJZkRlZmF1bHRQYWdlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlib29sZWFuIGNoZWNrZWQ9IGV2ZW50LmdldENoZWNrZWQoKTsKLQkJCQlNb2RlbEVsZW1lbnQgZWxlbWVudD0gKE1vZGVsRWxlbWVudCkgZXZlbnQuZ2V0RWxlbWVudCgpOwotCQkJCWVsZW1lbnQuc2V0U2hvdWxkRGlzcGxheU9uRGVmYXVsdFBhZ2UoY2hlY2tlZCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZEZWZhdWx0UGFnZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCi0JCURlZmF1bHRQYWdlVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI9IG5ldyBEZWZhdWx0UGFnZVRhYmxlTGFiZWxQcm92aWRlcigpOwotCQlmRGVmYXVsdFBhZ2VWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJZkRlZmF1bHRQYWdlVmlld2VyLnNldElucHV0KGZNb2RlbC5kZWZhdWx0UGFnZUVsZW1lbnRzKTsKLQkJZkRlZmF1bHRQYWdlVmlld2VyLnNldENvbXBhcmF0b3IobmV3IE1vZGVsVmlld2VyQ29tcGFyYXRvcihmQ2F0ZWdvcnlEZWZhdWx0UGFnZUNvbXBhcmF0b3IpKTsKLQotCQlmaW5hbCBpbnQgSUNPTl9BTkRfQ0hFQ0tCT1hfV0lUSD0gNTA7Ci0JCWZpbmFsIGludCBIRUFERVJfTUFSR0lOPSAyMDsKLQkJaW50IG1pbk5hbWVXaWR0aD0gY29tcHV0ZVdpZHRoKHRhYmxlLCBuYW1lQ29sdW1uLmdldFRleHQoKSkgKyBIRUFERVJfTUFSR0lOOwotCQlmb3IgKGludCBpPSAwOyBpIDwgZk1vZGVsLmRlZmF1bHRQYWdlRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCW1pbk5hbWVXaWR0aD0gTWF0aC5tYXgobWluTmFtZVdpZHRoLCBjb21wdXRlV2lkdGgodGFibGUsIGxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dChmTW9kZWwuZGVmYXVsdFBhZ2VFbGVtZW50cy5nZXQoaSksIDApKSArIElDT05fQU5EX0NIRUNLQk9YX1dJVEgpOwotCQl9Ci0KLQkJbmFtZUNvbHVtbi5zZXRXaWR0aChtaW5OYW1lV2lkdGgpOwotCQkKLQkJdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlRGVmYXVsdFBhZ2VUYWJsZVNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Q3JlYXRlIHRoZSBVcCBhbmQgRG93biBidXR0b25zIGZvciB0aGUgZGVmYXVsdCBwYWdlIHZpZXdlcjwvcD4KLQkgKiBAcGFyYW0gcGFyZW50IHtAbGluayBDb21wb3NpdGV9IHRvIGFkZCB0aGUgYnV0dG9uIGxpc3QgdG8gCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRQYWdlQnV0dG9uTGlzdChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGU9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQkVHSU5OSU5HLCBmYWxzZSwgZmFsc2UpKTsKLQotCQlHcmlkTGF5b3V0IGxheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0PSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJZkRlZmF1bHRQYWdlT3JkZXJVcEJ1dHRvbj0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIIHwgU1dULkNFTlRFUik7Ci0JCWZEZWZhdWx0UGFnZU9yZGVyVXBCdXR0b24uc2V0VGV4dChTU0VVSU1lc3NhZ2VzLkNvZGVBc3Npc3RBZHZhbmNlZENvbmZpZ3VyYXRpb25CbG9ja19VcCk7Ci0JCWZEZWZhdWx0UGFnZU9yZGVyVXBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgIAlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIAkJaW50IGluZGV4ID0gZkRlZmF1bHRQYWdlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgCQlpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgCQkJZk1vZGVsLm1vdmVEZWZhdWx0UGFnZUNhdGVnb3J5VXAoaW5kZXgpOwotICAgICAgICAJCQlmRGVmYXVsdFBhZ2VWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICAJCQloYW5kbGVEZWZhdWx0UGFnZVRhYmxlU2VsZWN0aW9uKCk7Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotICAgICAgICB9KTsKLQkJZkRlZmF1bHRQYWdlT3JkZXJVcEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLSAgICAgICAgCi0gICAgICAgIFNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChmRGVmYXVsdFBhZ2VPcmRlclVwQnV0dG9uKTsKLQotICAgICAgICBmRGVmYXVsdFBhZ2VPcmRlckRvd25CdXR0b249IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCB8IFNXVC5DRU5URVIpOwotICAgICAgICBmRGVmYXVsdFBhZ2VPcmRlckRvd25CdXR0b24uc2V0VGV4dChTU0VVSU1lc3NhZ2VzLkNvZGVBc3Npc3RBZHZhbmNlZENvbmZpZ3VyYXRpb25CbG9ja19Eb3duKTsKLSAgICAgICAgZkRlZmF1bHRQYWdlT3JkZXJEb3duQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAJCWludCBpbmRleD0gZkRlZmF1bHRQYWdlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgCQlpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgCQkJZk1vZGVsLm1vdmVEZWZhdWx0UGFnZUNhdGVnb3J5RG93bihpbmRleCk7Ci0gICAgICAgIAkJCWZEZWZhdWx0UGFnZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgIAkJCWhhbmRsZURlZmF1bHRQYWdlVGFibGVTZWxlY3Rpb24oKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIH0pOwotICAgICAgICBmRGVmYXVsdFBhZ2VPcmRlckRvd25CdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0gICAgICAgIFNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChmRGVmYXVsdFBhZ2VPcmRlckRvd25CdXR0b24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVGaWxsZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGhfc3BhbikgewotCSAgICBMYWJlbCBmaWxsZXI9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZmlsbGVyLnNldFZpc2libGUoZmFsc2UpOwotCQlmaWxsZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UsIGhfc3BhbiwgMSkpOwotICAgIH0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVPd25QYWdlTGFiZWwoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGhfc3BhbikgewotCQlQaXhlbENvbnZlcnRlciBwaXhlbENvbnZlcnRlcj0gbmV3IFBpeGVsQ29udmVydGVyKGNvbXBvc2l0ZSk7Ci0JCWludCB3aWR0aD0gcGl4ZWxDb252ZXJ0ZXIuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDQwKTsKLQotCQlMYWJlbCBsYWJlbD0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUgfCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5Db2RlQXNzaXN0QWR2YW5jZWRDb25maWd1cmF0aW9uQmxvY2tfc2VwYXJhdGVfdGFibGVfZGVzY3JpcHRpb24pOwotCQlHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIGZhbHNlLCBmYWxzZSwgaF9zcGFuLCAxKTsKLQkJZ2Qud2lkdGhIaW50PSB3aWR0aDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU93blBhZ2VTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJY3JlYXRlT3duUGFnZVZpZXdlcihjb21wb3NpdGUpOwotCQljcmVhdGVPd25QYWdlQnV0dG9uTGlzdChjb21wb3NpdGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVPd25QYWdlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJZk93blBhZ2VWaWV3ZXI9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlUYWJsZSB0YWJsZT0gZk93blBhZ2VWaWV3ZXIuZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSwgMSwgMSkpOwotCi0JCVRhYmxlQ29sdW1uIG5hbWVDb2x1bW49IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQluYW1lQ29sdW1uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5Db2RlQXNzaXN0QWR2YW5jZWRDb25maWd1cmF0aW9uQmxvY2tfc2VwYXJhdGVfdGFibGVfY2F0ZWdvcnlfY29sdW1uX3RpdGxlKTsKLQkJbmFtZUNvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotCi0JCWZPd25QYWdlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyPSBuZXcgT3duUGFnZVRhYmxlTGFiZWxQcm92aWRlcigpOwotCQlmT3duUGFnZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQlmT3duUGFnZVZpZXdlci5zZXRJbnB1dChmTW9kZWwucGFnZUVsZW1lbnRzKTsKLQkJZk93blBhZ2VWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgTW9kZWxWaWV3ZXJDb21wYXJhdG9yKGZDYXRlZ29yeVBhZ2VDb21wYXJhdG9yKSk7Ci0KLQkJZmluYWwgaW50IElDT05fQU5EX0NIRUNLQk9YX1dJVEg9IDUwOwotCQlmaW5hbCBpbnQgSEVBREVSX01BUkdJTj0gMjA7Ci0JCWludCBtaW5OYW1lV2lkdGg9IGNvbXB1dGVXaWR0aCh0YWJsZSwgbmFtZUNvbHVtbi5nZXRUZXh0KCkpICsgSEVBREVSX01BUkdJTjsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGZNb2RlbC5wYWdlRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCW1pbk5hbWVXaWR0aD0gTWF0aC5tYXgobWluTmFtZVdpZHRoLCBjb21wdXRlV2lkdGgodGFibGUsIGxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dChmTW9kZWwucGFnZUVsZW1lbnRzLmdldChpKSwgMCkpICsgSUNPTl9BTkRfQ0hFQ0tCT1hfV0lUSCk7Ci0JCX0KLQotCQluYW1lQ29sdW1uLnNldFdpZHRoKG1pbk5hbWVXaWR0aCk7Ci0KLQkJZk93blBhZ2VWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWJvb2xlYW4gY2hlY2tlZD0gZXZlbnQuZ2V0Q2hlY2tlZCgpOwotCQkJCU1vZGVsRWxlbWVudCBlbGVtZW50PSAoTW9kZWxFbGVtZW50KSBldmVudC5nZXRFbGVtZW50KCk7Ci0JCQkJZWxlbWVudC5zZXRTaG91bGREaXNwbGF5T25Pd25QYWdlKGNoZWNrZWQpOwotCQkJfQotCQl9KTsKLQotCQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVPd25QYWdlVGFibGVTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiA8cD5DcmVhdGUgdGhlIFVwIGFuZCBEb3duIGJ1dHRvbnMgZm9yIHRoZSBvd24gcGFnZSB2aWV3ZXI8L3A+Ci0JICogQHBhcmFtIHBhcmVudCB7QGxpbmsgQ29tcG9zaXRlfSB0byBhZGQgdGhlIGJ1dHRvbiBsaXN0IHRvIAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVPd25QYWdlQnV0dG9uTGlzdChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGU9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQkVHSU5OSU5HLCBmYWxzZSwgZmFsc2UpKTsKLQotCQlHcmlkTGF5b3V0IGxheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0PSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJZlBhZ2VPcmRlclVwQnV0dG9uPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0ggfCBTV1QuQ0VOVEVSKTsKLSAgICAgICAgZlBhZ2VPcmRlclVwQnV0dG9uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5Db2RlQXNzaXN0QWR2YW5jZWRDb25maWd1cmF0aW9uQmxvY2tfUGFnZXNVcCk7Ci0gICAgICAgIGZQYWdlT3JkZXJVcEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgCQlpbnQgaW5kZXggPSBmT3duUGFnZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIAkJaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgIAkJCWZNb2RlbC5tb3ZlUGFnZVVwKGluZGV4KTsKLSAgICAgICAgCQkJZk93blBhZ2VWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICAJCQloYW5kbGVPd25QYWdlVGFibGVTZWxlY3Rpb24oKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIH0pOwotICAgICAgICBmUGFnZU9yZGVyVXBCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0gICAgICAgIAotICAgICAgICBTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoZlBhZ2VPcmRlclVwQnV0dG9uKTsKLQotICAgICAgICBmUGFnZU9yZGVyRG93bkJ1dHRvbj0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIIHwgU1dULkNFTlRFUik7Ci0gICAgICAgIGZQYWdlT3JkZXJEb3duQnV0dG9uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5Db2RlQXNzaXN0QWR2YW5jZWRDb25maWd1cmF0aW9uQmxvY2tfUGFnZXNEb3duKTsKLSAgICAgICAgZlBhZ2VPcmRlckRvd25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgIAlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIAkJaW50IGluZGV4PSBmT3duUGFnZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIAkJaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgIAkJCWZNb2RlbC5tb3ZlUGFnZURvd24oaW5kZXgpOwotICAgICAgICAJCQlmT3duUGFnZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgIAkJCWhhbmRsZU93blBhZ2VUYWJsZVNlbGVjdGlvbigpOwotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgfSk7Ci0gICAgICAgIGZQYWdlT3JkZXJEb3duQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotICAgICAgICBTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoZlBhZ2VPcmRlckRvd25CdXR0b24pOwotCX0KLQotCS8qKgotCSAqIDxwPlVwZGF0ZSB0aGUgZW5hYmxlbWVudCBvZiB0aGUgVXAgYW5kIERvd24gYnV0dG9ucyBmb3IgdGhlIG93biBwYWdlIHRhYmxlIHZpZXdlcjwvcD4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlT3duUGFnZVRhYmxlU2VsZWN0aW9uKCkgewotCQlNb2RlbEVsZW1lbnQgaXRlbT0gKE1vZGVsRWxlbWVudCkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZk93blBhZ2VWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXg9IGZPd25QYWdlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCWZQYWdlT3JkZXJVcEJ1dHRvbi5zZXRFbmFibGVkKGluZGV4ID4gMCk7Ci0JCQlmUGFnZU9yZGVyRG93bkJ1dHRvbi5zZXRFbmFibGVkKGluZGV4IDwgZk1vZGVsLnBhZ2VFbGVtZW50cy5zaXplKCkgLSAxKTsKLQkJfSBlbHNlIHsKLQkJCWZQYWdlT3JkZXJVcEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZQYWdlT3JkZXJEb3duQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIDxwPlVwZGF0ZSB0aGUgZW5hYmxlbWVudCBvZiB0aGUgVXAgYW5kIERvd24gYnV0dG9ucyBmb3IgdGhlIGRlZmF1bHQgcGFnZSB0YWJsZSB2aWV3ZXI8L3A+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURlZmF1bHRQYWdlVGFibGVTZWxlY3Rpb24oKSB7Ci0JCU1vZGVsRWxlbWVudCBpdGVtPSAoTW9kZWxFbGVtZW50KSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmRGVmYXVsdFBhZ2VWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBmRGVmYXVsdFBhZ2VWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJZkRlZmF1bHRQYWdlT3JkZXJVcEJ1dHRvbi5zZXRFbmFibGVkKGluZGV4ID4gMCk7Ci0JCQlmRGVmYXVsdFBhZ2VPcmRlckRvd25CdXR0b24uc2V0RW5hYmxlZChpbmRleCA8IGZNb2RlbC5kZWZhdWx0UGFnZUVsZW1lbnRzLnNpemUoKSAtIDEpOwotCQl9IGVsc2UgewotCQkJZkRlZmF1bHRQYWdlT3JkZXJVcEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZEZWZhdWx0UGFnZU9yZGVyRG93bkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVDaGVja2VkU3RhdGUoKSB7Ci0JCS8qIGRvZXMgbm90IG1hdHRlciB3aGljaCBzZXQgb2YgZWxlbWVudHMgd2UgdXNlIGhlcmUKLQkJICogYmVjYXVzZSBvcmRlciBkb2VzIG5vdCBtYXR0ZXIgaW4gdGhpcyBjYXNlCi0JCSAqLwotCQlmaW5hbCBpbnQgc2l6ZT0gZk1vZGVsLnBhZ2VFbGVtZW50cy5zaXplKCk7Ci0JCUxpc3QgZGVmYXVsdENoZWNrZWQ9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCUxpc3Qgc2VwYXJhdGVDaGVja2VkPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCi0JCWZvciAoSXRlcmF0b3IgaXQ9IGZNb2RlbC5wYWdlRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTW9kZWxFbGVtZW50IGVsZW1lbnQ9IChNb2RlbEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCWlmIChlbGVtZW50LnNob3VsZERpc3BsYXlPbkRlZmF1bHRQYWdlKCkpCi0JCQkJZGVmYXVsdENoZWNrZWQuYWRkKGVsZW1lbnQpOwotCQkJaWYgKGVsZW1lbnQuc2hvdWxkRGlzcGxheU9uT3duUGFnZSgpKQotCQkJCXNlcGFyYXRlQ2hlY2tlZC5hZGQoZWxlbWVudCk7Ci0JCX0KLQotCQlmRGVmYXVsdFBhZ2VWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKGRlZmF1bHRDaGVja2VkLnRvQXJyYXkobmV3IE9iamVjdFtkZWZhdWx0Q2hlY2tlZC5zaXplKCldKSk7Ci0JCWZPd25QYWdlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhzZXBhcmF0ZUNoZWNrZWQudG9BcnJheShuZXcgT2JqZWN0W3NlcGFyYXRlQ2hlY2tlZC5zaXplKCldKSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVdpZHRoKENvbnRyb2wgY29udHJvbCwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlHQyBnYz0gbmV3IEdDKGNvbnRyb2wpOwotCQl0cnkgewotCQkJZ2Muc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQkJcmV0dXJuIGdjLnN0cmluZ0V4dGVudChuYW1lKS54ICsgMTA7Ci0JCX0gZmluYWxseSB7Ci0JCQlnYy5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBCaW5kaW5nTWFuYWdlciBmZ0xvY2FsQmluZGluZ01hbmFnZXI7Ci0Jc3RhdGljIHsKLQkJZmdMb2NhbEJpbmRpbmdNYW5hZ2VyPSBuZXcgQmluZGluZ01hbmFnZXIobmV3IENvbnRleHRNYW5hZ2VyKCksIG5ldyBDb21tYW5kTWFuYWdlcigpKTsKLQkJZmluYWwgSUJpbmRpbmdTZXJ2aWNlIGJpbmRpbmdTZXJ2aWNlPSAoSUJpbmRpbmdTZXJ2aWNlKVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2VydmljZShJQmluZGluZ1NlcnZpY2UuY2xhc3MpOwotCQlmaW5hbCBTY2hlbWVbXSBkZWZpbmVkU2NoZW1lcz0gYmluZGluZ1NlcnZpY2UuZ2V0RGVmaW5lZFNjaGVtZXMoKTsKLQkJaWYgKGRlZmluZWRTY2hlbWVzICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZpbmVkU2NoZW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlmaW5hbCBTY2hlbWUgc2NoZW1lPSBkZWZpbmVkU2NoZW1lc1tpXTsKLQkJCQkJZmluYWwgU2NoZW1lIGNvcHk9IGZnTG9jYWxCaW5kaW5nTWFuYWdlci5nZXRTY2hlbWUoc2NoZW1lLmdldElkKCkpOwotCQkJCQljb3B5LmRlZmluZShzY2hlbWUuZ2V0TmFtZSgpLCBzY2hlbWUuZ2V0RGVzY3JpcHRpb24oKSwgc2NoZW1lLmdldFBhcmVudElkKCkpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKGZpbmFsIE5vdERlZmluZWRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJZmdMb2NhbEJpbmRpbmdNYW5hZ2VyLnNldExvY2FsZShiaW5kaW5nU2VydmljZS5nZXRMb2NhbGUoKSk7Ci0JCWZnTG9jYWxCaW5kaW5nTWFuYWdlci5zZXRQbGF0Zm9ybShiaW5kaW5nU2VydmljZS5nZXRQbGF0Zm9ybSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0S2V5Ym9hcmRTaG9ydGN1dChQYXJhbWV0ZXJpemVkQ29tbWFuZCBjb21tYW5kKSB7Ci0JCUlCaW5kaW5nU2VydmljZSBiaW5kaW5nU2VydmljZT0gKElCaW5kaW5nU2VydmljZSkgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBZGFwdGVyKElCaW5kaW5nU2VydmljZS5jbGFzcyk7Ci0JCWZnTG9jYWxCaW5kaW5nTWFuYWdlci5zZXRCaW5kaW5ncyhiaW5kaW5nU2VydmljZS5nZXRCaW5kaW5ncygpKTsKLQkJdHJ5IHsKLQkJCVNjaGVtZSBhY3RpdmVTY2hlbWU9IGJpbmRpbmdTZXJ2aWNlLmdldEFjdGl2ZVNjaGVtZSgpOwotCQkJaWYgKGFjdGl2ZVNjaGVtZSAhPSBudWxsKQotCQkJCWZnTG9jYWxCaW5kaW5nTWFuYWdlci5zZXRBY3RpdmVTY2hlbWUoYWN0aXZlU2NoZW1lKTsKLQkJfSBjYXRjaCAoTm90RGVmaW5lZEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQkJVHJpZ2dlclNlcXVlbmNlW10gYmluZGluZ3M9IGZnTG9jYWxCaW5kaW5nTWFuYWdlci5nZXRBY3RpdmVCaW5kaW5nc0Rpc3JlZ2FyZGluZ0NvbnRleHRGb3IoY29tbWFuZCk7Ci0JCWlmIChiaW5kaW5ncy5sZW5ndGggPiAwKQotCQkJcmV0dXJuIGJpbmRpbmdzWzBdLmZvcm1hdCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD5HZXRzIGFuZCBpbWFnZSBiYXNlZCBvbiBhbiBpbWFnZSBkZXNjcmlwdG9yLCBhbmQgc3RvcmVzIHRoZSBpbWFnZSBzbyBpdAotCSAqIGRvZXMgbm90IGhhdmUgdG8gYmUgY3JlYXRlZCBtb3JlIHRoZW4gb25jZTwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gaW1nRGVzYyB7QGxpbmsgSW1hZ2VEZXNjcmlwdG9yfSB0byBnZXQgdGhlIHtAbGluayBJbWFnZX0gZm9yCi0JICogQHJldHVybiB7QGxpbmsgSW1hZ2V9IGNyZWF0ZWQgZnJvbSB0aGUge0BsaW5rIEltYWdlRGVzY3JpcHRvcn0sIG9yIHN0b3JlZAotCSAqIHtAbGluayBJbWFnZX0gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgSW1hZ2VEZXNjcmlwdG9yfSBpZiBhbgotCSAqIHtAbGluayBJbWFnZX0gaGFkIGFscmVhZHkgYmVlbiBjcmVhdGVkIGZvciB0aGUgZ2l2ZW4ge0BsaW5rIEltYWdlRGVzY3JpcHRvcn0KLQkgKi8KLQlwcml2YXRlIEltYWdlIGdldEltYWdlKEltYWdlRGVzY3JpcHRvciBpbWdEZXNjKSB7Ci0JCWlmIChpbWdEZXNjID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJbWFnZSBpbWc9IChJbWFnZSkgZkltYWdlcy5nZXQoaW1nRGVzYyk7Ci0JCWlmIChpbWcgPT0gbnVsbCkgewotCQkJaW1nPSBpbWdEZXNjLmNyZWF0ZUltYWdlKGZhbHNlKTsKLQkJCWZJbWFnZXMucHV0KGltZ0Rlc2MsIGltZyk7Ci0JCX0KLQkJcmV0dXJuIGltZzsKLQl9Ci0KLQkvKioKLQkgKiA8cD5MYWJlbCBwcm92aWRlciBmb3IgdGhlIHRhYmxlIGZvciBjb25maWd1cmluZyB3aGljaCBjYXRlZ29yaWVzIHNob3VsZCBiZSBkaXNwbGF5ZWQgb24gdGhlCi0JICogZGVmYXVsdCBhc3Npc3QgcGFnZTwvcD4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIERlZmF1bHRQYWdlVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSAwKQotCQkJCXJldHVybiAoKE1vZGVsRWxlbWVudCkgZWxlbWVudCkuZ2V0SW1hZ2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkgICAgICAgICAgICBjYXNlIDA6Ci0JICAgICAgICAgICAgCXJldHVybiAoKE1vZGVsRWxlbWVudCkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCSAgICAgICAgICAgIGRlZmF1bHQ6Ci0JICAgICAgICAgICAgCUFzc2VydC5pc1RydWUoZmFsc2UpOwotCSAgICAgICAgICAgIAlyZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJICAgIHJldHVybiBnZXRDb2x1bW5UZXh0KGVsZW1lbnQsIDApOyAvLyBuZWVkZWQgdG8gbWFrZSB0aGUgc29ydGVyIHdvcmsKLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPkxhYmVsIHByb3ZpZGVyIGZvciB0aGUgdGFibGUgZm9yIGNvbmZpZ3VyaW5nIHdoaWNoIGNhdGVnb3JpZXMgc2hvdWxkIGJlIGRpc3BsYXllZCBvbiB0aGVpcgotCSAqIG93biBjb250ZW50IGFzc2lzdCBwYWdlPC9wPgotCSAqLwotCXByaXZhdGUgZmluYWwgY2xhc3MgT3duUGFnZVRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkKLQkJCQlyZXR1cm4gKChNb2RlbEVsZW1lbnQpIGVsZW1lbnQpLmdldEltYWdlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlyZXR1cm4gKChNb2RlbEVsZW1lbnQpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD5QcmVmZXJlbmNlTW9kZWwgdXNlZCB0byByZWFkIGFuZCB3cml0ZSB0aGUgdXNlciBwcmVmZXJlbmNlcwotCSAqIHVzaW5nIHRoZSB7QGxpbmsgSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyfTwvcD4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIFByZWZlcmVuY2VNb2RlbCB7Ci0JCS8qKiBwcml2YXRlIG1vZGlmaWFibGUgcGFnZSBlbGVtZW50IGxpc3QgKi8KLQkJcHJpdmF0ZSBmaW5hbCBMaXN0IGZQYWdlRWxlbWVudHM7Ci0JCQotCQkvKiogcHVibGljIHVubW9kaWZpYWJsZSBwYWdlIGVsZW1lbnQgbGlzdCAqLwotCQlmaW5hbCBMaXN0IHBhZ2VFbGVtZW50czsKLQkJCi0JCS8qKiBwcml2YXRlIG1vZGlmaWFibGUgZGVmYXVsdCBwYWdlIGVsZW1lbnQgbGlzdCAqLwotCQlwcml2YXRlIGZpbmFsIExpc3QgZkRlZmF1bHRQYWdlRWxlbWVudHM7Ci0JCQotCQkvKiogcHVibGljIHVubW9kaWZpYWJsZSBkZWZhdWx0IHBhZ2UgZWxlbWVudCBsaXN0ICovCi0JCWZpbmFsIExpc3QgZGVmYXVsdFBhZ2VFbGVtZW50czsKLQotCQkvKioKLQkJICogPHA+Q3JlYXRlIHRoZSBwcmVmZXJlbmNlIG1vZGVsIGZvciB0aGUgZ2l2ZW4gY2F0ZWdvcmllczwvcD4KLQkJICogCi0JCSAqIEBwYXJhbSBjYXRlZ29yaWVzIDxjb2RlPntAbGluayBMaXN0fTx7QGxpbmsgQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnl9PjwvY29kZT4KLQkJICovCi0JCXB1YmxpYyBQcmVmZXJlbmNlTW9kZWwoTGlzdCBjYXRlZ29yaWVzKSB7Ci0JCQkvL25lZWQgc2VwYXJhdGUgbGlzdHMgYmVjYXVzZSB0aGV5IHdpbGwgYmUgb3JkZXJlZCBkaWZmZXJlbnRseQotCQkJdGhpcy5mUGFnZUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJdGhpcy5mRGVmYXVsdFBhZ2VFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQ9IGNhdGVnb3JpZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5IGNhdGVnb3J5PSAoQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCQlpZiAoY2F0ZWdvcnkuaGFzQ29tcHV0ZXJzKCkpIHsKLQkJCQkJTW9kZWxFbGVtZW50IGVsZW0gPSBuZXcgTW9kZWxFbGVtZW50KGNhdGVnb3J5KTsKLQkJCQkJZlBhZ2VFbGVtZW50cy5hZGQoZWxlbSk7Ci0JCQkJCWZEZWZhdWx0UGFnZUVsZW1lbnRzLmFkZChlbGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvL3NvcnQgdGhlIGxpc3RzCi0JCQl0aGlzLnBlcmZvcm1EZWZhdWx0cygpOwotCQkJCi0JCQlwYWdlRWxlbWVudHMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGZQYWdlRWxlbWVudHMpOwotCQkJZGVmYXVsdFBhZ2VFbGVtZW50cyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoZkRlZmF1bHRQYWdlRWxlbWVudHMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIDxwPk1vdmUgdGhlIG1vZGVsIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBpbmRleAotCQkgKiB1cCBpbiB0aGUgY29udGVudCBhc3Npc3QgcGFnZSBvcmRlcjwvcD4KLQkJICogCi0JCSAqIEBwYXJhbSBlbGVtZW50SW5kZXggdGhlIGluZGV4IG9mIHRoZSBtb2RlbCBlbGVtZW50IHRvIG1vdmUgdXAKLQkJICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG1vdmVQYWdlVXAoaW50IGVsZW1lbnRJbmRleCkgewotICAgICAgICAJT2JqZWN0IHJlbW92ZWQgPSBmUGFnZUVsZW1lbnRzLnJlbW92ZShlbGVtZW50SW5kZXgpOwotICAgICAgICAJZlBhZ2VFbGVtZW50cy5hZGQoZWxlbWVudEluZGV4LTEsIHJlbW92ZWQpOwotICAgICAgICAJCi0gICAgICAgIAlmQ29uZmlndXJhdGlvbldyaXRlci5zZXRQYWdlT3JkZXIoZ2V0UGFnZU9yZGVyZWRDYXRlZ29yeUlEcygpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0JCSAqIDxwPk1vdmUgdGhlIG1vZGVsIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBpbmRleAotCQkgKiBkb3duIGluIHRoZSBjb250ZW50IGFzc2lzdCBwYWdlIG9yZGVyPC9wPgotCQkgKiAKLQkJICogQHBhcmFtIGVsZW1lbnRJbmRleCB0aGUgaW5kZXggb2YgdGhlIG1vZGVsIGVsZW1lbnQgdG8gbW92ZSB1cAotCQkgKi8KLSAgICAgICAgcHVibGljIHZvaWQgbW92ZVBhZ2VEb3duKGludCBlbGVtZW50SW5kZXgpIHsKLSAgICAgICAgCU9iamVjdCByZW1vdmVkID0gZlBhZ2VFbGVtZW50cy5yZW1vdmUoZWxlbWVudEluZGV4KTsKLSAgICAgICAgCWZQYWdlRWxlbWVudHMuYWRkKGVsZW1lbnRJbmRleCsxLCByZW1vdmVkKTsKLSAgICAgICAgCQotICAgICAgICAJZkNvbmZpZ3VyYXRpb25Xcml0ZXIuc2V0UGFnZU9yZGVyKGdldFBhZ2VPcmRlcmVkQ2F0ZWdvcnlJRHMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotCQkgKiA8cD5Nb3ZlIHRoZSBtb2RlbCBlbGVtZW50IHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gaW5kZXgKLQkJICogdXAgaW4gdGhlIGNvbnRlbnQgYXNzaXN0IHBhZ2Ugb3JkZXI8L3A+Ci0JCSAqIAotCQkgKiBAcGFyYW0gZWxlbWVudEluZGV4IHRoZSBpbmRleCBvZiB0aGUgbW9kZWwgZWxlbWVudCB0byBtb3ZlIHVwCi0JCSAqLwotICAgICAgICBwdWJsaWMgdm9pZCBtb3ZlRGVmYXVsdFBhZ2VDYXRlZ29yeVVwKGludCBlbGVtZW50SW5kZXgpIHsKLSAgICAgICAgCU9iamVjdCByZW1vdmVkID0gZkRlZmF1bHRQYWdlRWxlbWVudHMucmVtb3ZlKGVsZW1lbnRJbmRleCk7Ci0gICAgICAgIAlmRGVmYXVsdFBhZ2VFbGVtZW50cy5hZGQoZWxlbWVudEluZGV4LTEsIHJlbW92ZWQpOwotICAgICAgICAJCi0gICAgICAgIAlmQ29uZmlndXJhdGlvbldyaXRlci5zZXREZWZhdWx0UGFnZU9yZGVyKGdldERlZmF1bHRQYWdlT3JkZXJlZENhdGVnb3J5SURzKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLQkJICogPHA+TW92ZSB0aGUgbW9kZWwgZWxlbWVudCBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIGluZGV4Ci0JCSAqIGRvd24gaW4gdGhlIGNvbnRlbnQgYXNzaXN0IHBhZ2Ugb3JkZXI8L3A+Ci0JCSAqIAotCQkgKiBAcGFyYW0gZWxlbWVudEluZGV4IHRoZSBpbmRleCBvZiB0aGUgbW9kZWwgZWxlbWVudCB0byBtb3ZlIHVwCi0JCSAqLwotICAgICAgICBwdWJsaWMgdm9pZCBtb3ZlRGVmYXVsdFBhZ2VDYXRlZ29yeURvd24oaW50IGVsZW1lbnRJbmRleCkgewotICAgICAgICAJT2JqZWN0IHJlbW92ZWQgPSBmRGVmYXVsdFBhZ2VFbGVtZW50cy5yZW1vdmUoZWxlbWVudEluZGV4KTsKLSAgICAgICAgCWZEZWZhdWx0UGFnZUVsZW1lbnRzLmFkZChlbGVtZW50SW5kZXgrMSwgcmVtb3ZlZCk7Ci0gICAgICAgIAkKLSAgICAgICAgCWZDb25maWd1cmF0aW9uV3JpdGVyLnNldERlZmF1bHRQYWdlT3JkZXIoZ2V0RGVmYXVsdFBhZ2VPcmRlcmVkQ2F0ZWdvcnlJRHMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIDxjb2RlPntAbGluayBMaXN0fTx7QGxpbmsgU3RyaW5nfT48L2NvZGU+IC0KLSAgICAgICAgICogTGlzdCBvZiBjYXRlZ29yeSBJRHMgYnkgcGFnZSBvcmRlcgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBMaXN0IGdldFBhZ2VPcmRlcmVkQ2F0ZWdvcnlJRHMoKSB7Ci0gICAgICAgIAlMaXN0IG9yZGVyZWQgPSBuZXcgQXJyYXlMaXN0KHBhZ2VFbGVtZW50cy5zaXplKCkpOwotICAgICAgICAJZm9yKGludCBpID0gMDsgaSA8IHBhZ2VFbGVtZW50cy5zaXplKCk7ICsraSkgewotICAgICAgICAJCW9yZGVyZWQuYWRkKCgoTW9kZWxFbGVtZW50KXBhZ2VFbGVtZW50cy5nZXQoaSkpLmdldElkKCkpOwotICAgICAgICAJfQotICAgICAgICAJCi0gICAgICAgIAlyZXR1cm4gb3JkZXJlZDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gPGNvZGU+e0BsaW5rIExpc3R9PHtAbGluayBTdHJpbmd9PjwvY29kZT4gLQotICAgICAgICAgKiBMaXN0IG9mIGNhdGVnb3J5IElEcyBieSBkZWZhdWx0IHBhZ2Ugb3JkZXIKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgTGlzdCBnZXREZWZhdWx0UGFnZU9yZGVyZWRDYXRlZ29yeUlEcygpIHsKLSAgICAgICAgCUxpc3Qgb3JkZXJlZCA9IG5ldyBBcnJheUxpc3QoZGVmYXVsdFBhZ2VFbGVtZW50cy5zaXplKCkpOwotICAgICAgICAJZm9yKGludCBpID0gMDsgaSA8IGRlZmF1bHRQYWdlRWxlbWVudHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgCQlvcmRlcmVkLmFkZCgoKE1vZGVsRWxlbWVudClkZWZhdWx0UGFnZUVsZW1lbnRzLmdldChpKSkuZ2V0SWQoKSk7Ci0gICAgICAgIAl9Ci0gICAgICAgIAkKLSAgICAgICAgCXJldHVybiBvcmRlcmVkOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogPHA+bmVlZCB0byByZS1zb3J0IHRoZSBsaXN0cyBhZnRlciBwZXJmb3JtaW5nIGRlZmF1bHRzPC9wPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotICAgICAgICAJQ29sbGVjdGlvbnMuc29ydChmUGFnZUVsZW1lbnRzLCBmQ2F0ZWdvcnlQYWdlQ29tcGFyYXRvcik7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KGZEZWZhdWx0UGFnZUVsZW1lbnRzLCBmQ2F0ZWdvcnlEZWZhdWx0UGFnZUNvbXBhcmF0b3IpOwotICAgICAgICB9Ci0JfQotCQotCS8qKgotCSAqIDxwPldyYXBzIGEge0BsaW5rIENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5fSBmb3IgdXNlIGluIHRoZSB7QGxpbmsgUHJlZmVyZW5jZU1vZGVsfTwvcD4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIE1vZGVsRWxlbWVudCB7Ci0JCS8qKiBUaGUgd3JhcHBlZCBjYXRlZ29yeSAqLwotCQlwcml2YXRlIGZpbmFsIENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5IGZDYXRlZ29yeTsKLQotCQkvKioKLQkJICogPHA+Q3JlYXRlIGEgbmV3IG1vZGVsIGVsZW1lbnQgd3JhcHBpbmcgdGhlIGdpdmVuIGNhdGVnb3J5PC9wPgotCQkgKiAKLQkJICogQHBhcmFtIGNhdGVnb3J5IHtAbGluayBDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeX0gdG8gYmUgd3JhcHBlZCBieSB0aGlzIG1vZGVsIGVsZW1lbnQKLQkJICogZm9yIHVzZSBpbiB0aGUge0BsaW5rIFByZWZlcmVuY2VNb2RlbH0KLQkJICovCi0JCU1vZGVsRWxlbWVudChDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeSBjYXRlZ29yeSkgewotCQkJZkNhdGVnb3J5PSBjYXRlZ29yeTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEByZXR1cm4ge0BsaW5rIEltYWdlfSBhc3NvY2lhdGVkIHdpdGggdGhlIHdyYXBwZWQgY2F0ZWdvcnkKLQkJICovCi0JCUltYWdlIGdldEltYWdlKCkgewotCQkJcmV0dXJuIENvZGVBc3Npc3RDeWNsaW5nQ29uZmlndXJhdGlvbkJsb2NrLnRoaXMuZ2V0SW1hZ2UoZkNhdGVnb3J5LmdldEltYWdlRGVzY3JpcHRvcigpKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEByZXR1cm4gbmFtZSBvZiB0aGUgd3JhcHBlZCBjYXRlZ29yeQotCQkgKi8KLQkJU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gZkNhdGVnb3J5LmdldERpc3BsYXlOYW1lKCk7Ci0JCX0KLQkJCi0JCVN0cmluZyBnZXRJZCgpIHsKLQkJCXJldHVybiBmQ2F0ZWdvcnkuZ2V0SWQoKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHdyYXBwZWQgY2F0ZWdvcnkgc2hvdWxkIGJlIGRpc3BsYXllZCBvbiB0aGUKLQkJICogZGVmYXVsdCBjb250ZW50IGFzc2lzdCBwYWdlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JCSAqLwotCQlib29sZWFuIHNob3VsZERpc3BsYXlPbkRlZmF1bHRQYWdlKCkgewotCQkJcmV0dXJuIGZDb25maWd1cmF0aW9uV3JpdGVyLnNob3VsZERpc3BsYXlPbkRlZmF1bHRQYWdlKHRoaXMuZ2V0SWQoKSk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gaW5jbHVkZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHdyYXBwZWQgY2F0ZWdvcnkgc2hvdWxkIGJlIGRpc3BsYXllZCBvbiB0aGUKLQkJICogZGVmYXVsdCBjb250ZW50IGFzc2lzdCBwYWdlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JCSAqLwotCQl2b2lkIHNldFNob3VsZERpc3BsYXlPbkRlZmF1bHRQYWdlKGJvb2xlYW4gaW5jbHVkZWQpIHsKLQkJCWZDb25maWd1cmF0aW9uV3JpdGVyLnNldFNob3VsZERpc3BsYXlPbkRlZmF1bHRQYWdlKHRoaXMuZ2V0SWQoKSwgaW5jbHVkZWQpOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgd3JhcHBlZCBjYXRlZ29yeSBzaG91bGQgYmUgZGlzcGxheWVkIG9uIHRoZQotCQkgKiBpdHMgb3duIGNvbnRlbnQgYXNzaXN0IHBhZ2UsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkJICovCi0JCWJvb2xlYW4gc2hvdWxkRGlzcGxheU9uT3duUGFnZSgpIHsKLQkJCXJldHVybiBmQ29uZmlndXJhdGlvbldyaXRlci5zaG91bGREaXNwbGF5T25Pd25QYWdlKHRoaXMuZ2V0SWQoKSk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gc2hvdWxkRGlzcGxheSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgd3JhcHBlZCBjYXRlZ29yeSBzaG91bGQgYmUgZGlzcGxheWVkIG9uIHRoZQotCQkgKiBpdHMgb3duIGNvbnRlbnQgYXNzaXN0IHBhZ2UsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkJICovCi0JCXZvaWQgc2V0U2hvdWxkRGlzcGxheU9uT3duUGFnZShib29sZWFuIHNob3VsZERpc3BsYXkpIHsKLQkJCWZDb25maWd1cmF0aW9uV3JpdGVyLnNldFNob3VsZERpc3BsYXlPbk93blBhZ2UodGhpcy5nZXRJZCgpLCBzaG91bGREaXNwbGF5KTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEByZXR1cm4gdGhlIHdyYXBwZWQgY2F0ZWdvcmllcyBjb250ZW50IGFzc2lzdCBwYWdlIHNvcnQgcmFuayBjb21wYXJlZCB0byB0aGUKLQkJICogb3RoZXIgY2F0ZWdvcmllcwotCQkgKi8KLQkJaW50IGdldE93blBhZ2VSYW5rKCkgewotCQkJcmV0dXJuIGZDb25maWd1cmF0aW9uV3JpdGVyLmdldFBhZ2VTb3J0T3JkZXIodGhpcy5nZXRJZCgpKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEByZXR1cm4gdGhlIHdyYXBwZWQgY2F0ZWdvcmllcyBjb250ZW50IGFzc2lzdCBwYWdlIHNvcnQgcmFuayBjb21wYXJlZCB0byB0aGUKLQkJICogb3RoZXIgY2F0ZWdvcmllcwotCQkgKi8KLQkJaW50IGdldERlZmF1bHRQYWdlUmFuaygpIHsKLQkJCXJldHVybiBmQ29uZmlndXJhdGlvbldyaXRlci5nZXREZWZhdWx0UGFnZVNvcnRPcmRlcih0aGlzLmdldElkKCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgTW9kZWxWaWV3ZXJDb21wYXJhdG9yIGV4dGVuZHMgVmlld2VyQ29tcGFyYXRvciB7Ci0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBNb2RlbFZpZXdlckNvbXBhcmF0b3IoQ29tcGFyYXRvciBjb21wYXJhdG9yKSB7Ci0JCQlzdXBlcihjb21wYXJhdG9yKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yI2NvbXBhcmUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCXJldHVybiB0aGlzLmdldENvbXBhcmF0b3IoKS5jb21wYXJlKGUxLCBlMik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvcHJlZmVyZW5jZXMvSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvcHJlZmVyZW5jZXMvSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0Yzk1ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ByZWZlcmVuY2VzL0lDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvblJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIDxwPkltcGxlbWVudGVycyBvZiB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbjwvY29kZT4KLSAqIGV4dGVuc2lvbiB3aWxsIG5lZWQgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UgZm9yIHRoZWlyIGV4dGVuc2lvbjwvcD4KLSAqIAotICogPHA+PGI+Tk9URTogPC9iPkltcGxlbWVudGVycyBtdXN0IGhhdmUgYSAwIGFyZ3VtZW50IGNvbnN0cnVjdG9yIHNvIGNsYXNzIGNhbiBiZSBpbnN0YW50aWF0ZWQgYnkKLSAqIGV4dGVuc2lvbi48L3A+Ci0gKiAKLSAqIEBzZWUgSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uUmVhZGVyIHsKLQkvKiogCi0JICogVGhlIGRlZmF1bHQgaXMgdG8gZGlzcGxheSBhIGNhdGVnb3J5IG9uIGl0cyBvd24gcGFnZQotCSAqIGlmIG5vdCBvdGhlcndpc2UgZGVmaW5lZCBieSBhIHByb3BlcnR5LgotCSAqLwotCWJvb2xlYW4gREVGQVVMVF9ESVNQTEFZX09OX09XTl9QQUdFID0gdHJ1ZTsKLQkKLQkvKiogVGhlIGRlZmF1bHQgaXMgdG8gZGlzcGxheSBhIGNhdGVnb3J5IG9uIHRoZSBkZWZhdWx0IGNvbnRlbnQgYXNzaXN0IHBhZ2UuICovCi0JYm9vbGVhbiBERUZBVUxUX0lOQ0xVREVfT05fREVGQVVMVFNfUEFHRSA9IHRydWU7Ci0JCi0JLyoqIHRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgaWYgbm9uZSBpcyBkZWZpbmVkIGJ5IGEgcHJvcGVydGllcyBleHRlbnNpb24gKi8KLQlpbnQgREVGQVVMVF9TT1JUX09SREVSID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCi0JLyoqCi0JICogPHA+RGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gY2F0ZWdvcnkgc2hvdWxkIGJlIGRpc3BsYXllZCBvbiBpdHMgb3duIGNvbnRlbnQKLQkgKiBhc3Npc3QgcGFnZTwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnlJRCBkZXRlcm1pbmUgaWYgdGhpcyBjYXRlZ29yeSBzaG91bGQgYmUgZGlzcGxheWVkIG9uIGl0cyBvd24KLQkgKiBjb250ZW50IGFzc2lzdCBwYWdlCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gY2F0ZWdvcnkgc2hvdWxkIGJlIGRpc3BsYXllZCBvbiBpdHMKLQkgKiBvd24gY29udGVudCBhc3Npc3QgcGFnZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gc2hvdWxkRGlzcGxheU9uT3duUGFnZShTdHJpbmcgY2F0ZWdvcnlJRCk7Ci0JCi0JLyoqCi0JICogPHA+RGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gY2F0ZWdvcnkgc2hvdWxkIGJlIGRpc3BsYXllZCBvbiB0aGUgZGVmYXVsdAotCSAqIGNvbnRlbnQgYXNzaXN0IHBhZ2U8L3A+Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5SUQgZGV0ZXJtaW5lIGlmIHRoaXMgY2F0ZWdvcnkgc2hvdWxkIGJlIGRpc3BsYXllZCBvbiB0aGUKLQkgKiBkZWZhdWx0IGNvbnRlbnQgYXNzaXN0IHBhZ2UKLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBjYXRlZ29yeSBzaG91bGQgYmUgZGlzcGxheWVkIG9uIHRoZQotCSAqIGRlZmF1bHQgY29udGVudCBhc3Npc3QgcGFnZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gc2hvdWxkRGlzcGxheU9uRGVmYXVsdFBhZ2UoU3RyaW5nIGNhdGVnb3J5SUQpOwotCQotCS8qKgotCSAqIDxwPkRldGVybWluZXMgdGhlIHNvcnQgb3JkZXIgcmFua2luZyBvZiB0aGUgZ2l2ZW4gY2F0ZWdvcnkgd2hlbiBjb21wYXJlZAotCSAqIHRvIHRoZSBvdGhlciBjYXRlZ29yaWVzLCB0aGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBvcmRlciBpbiB3aGljaAotCSAqIHRoZSBzZXBhcmF0ZSBjb250ZW50IGFzc2lzdCBwYWdlcyBzaG91bGQgYmUgZGlzcGxheWVkPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeUlEIGRldGVybWluZSB0aGUgc29ydCBvcmRlciByYW5raW5nIG9mIHRoaXMgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzb3J0IG9yZGVyIHJhbmtpbmcgb2YgdGhlIGdpdmVuIGNhdGVnb3J5IHdoZW4gY29tcGFyZWQKLQkgKiB0byB0aGUgb3RoZXIgY2F0ZWdvcmllcwotCSAqLwotCWludCBnZXRQYWdlU29ydE9yZGVyKFN0cmluZyBjYXRlZ29yeUlEKTsKLQkKLQkvKioKLQkgKiA8cD5EZXRlcm1pbmVzIHRoZSBzb3J0IG9yZGVyIHJhbmtpbmcgb2YgdGhlIGdpdmVuIGNhdGVnb3J5IHdoZW4gY29tcGFyZWQKLQkgKiB0byB0aGUgb3RoZXIgY2F0ZWdvcmllcywgdGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgb3JkZXIgaW4gd2hpY2gKLQkgKiBjYXRlZ29yaWVzIHNob3VsZCBiZSBsaXN0ZWQgb24gdGhlIGRlZmF1bHQgcGFnZTwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnlJRCBkZXRlcm1pbmUgdGhlIHNvcnQgb3JkZXIgcmFua2luZyBvZiB0aGlzIGNhdGVnb3J5Ci0JICogCi0JICogQHJldHVybiB0aGUgc29ydCBvcmRlciByYW5raW5nIG9mIHRoZSBnaXZlbiBjYXRlZ29yeSB3aGVuIGNvbXBhcmVkCi0JICogdG8gdGhlIG90aGVyIGNhdGVnb3JpZXMKLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdFBhZ2VTb3J0T3JkZXIoU3RyaW5nIGNhdGVnb3J5SUQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ByZWZlcmVuY2VzL0lDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ByZWZlcmVuY2VzL0lDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDYyODE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9wcmVmZXJlbmNlcy9JQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25Xcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeTsKLQotLyoqCi0gKiA8cD5JbXBsZW1lbnRlcnMgb2YgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb248L2NvZGU+Ci0gKiBleHRlbnNpb24gY2FuIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBpZiB0aGVpciBjb25maWd1cmF0aW9uIHNob3VsZCBiZSB1c2VyIGVkaWJsZSBhbmQgdGh1cwotICogbmVlZHMgd3JpdGluZyBjYXBhYmlsaXRpZXM8L3A+Ci0gKiAKLSAqIDxwPjxiPk5PVEU6IDwvYj5JbXBsZW1lbnRlcnMgbXVzdCBoYXZlIGEgMCBhcmd1bWVudCBjb25zdHJ1Y3RvciBzbyBjbGFzcyBjYW4gYmUgaW5zdGFudGlhdGVkIGJ5Ci0gKiBleHRlbnNpb24uPC9wPgotICogCi0gKiBAc2VlIElDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvblJlYWRlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbldyaXRlciBleHRlbmRzCi0JCUlDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvblJlYWRlciB7Ci0JCi0JLyoqCi0JICogPHA+SWYgYSB3cml0ZXIgaGFzIGEga25vd24gYXNzb2NpYXRlZCBwcm9wZXJ0aWVzIHBhZ2UgdGhlbiB0aGF0IHByb3BlcnRpZXMKLQkgKiBwYWdlIElEIGNhbiBiZSB1c2VkIHNvIHRoYXQgZXJyb3IgbWVzc2FnZXMgZHVyaW5nIHRoZSBjb250ZW50IGFzc2lzdCBwcm9jZXNzCi0JICogY2FuIGxpbmsgdG8gdGhhdCBwcmVmZXJlbmNlIHBhZ2UgdG8gYWxsb3cgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSBzZXR0aW5nczwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgd3JpdGVyIGhhcyBhIGtub3duIGFzc29jaWF0ZWQgcHJvcGVydGllcwotCSAqIHByZWZlcmVuY2UgcGFnZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gaGFzQXNzb2NpYXRlZFByb3BlcnRpZXNQYWdlKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBJZiB7QGxpbmsgI2hhc0Fzc29jaWF0ZWRQcm9wZXJ0aWVzUGFnZSgpfSByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4KLQkgKiB0aGlzIG1ldGhvZCBtdXN0IHJldHVybiBhIHZhbGlkIHByb3BlcnRpZXMgcGFnZSBJRCB3aGVyZSB0aGUgdXNlciBjYW4gZWRpdCB0aGUKLQkgKiBjb250ZW50IGFzc2lzdCBjb25maWd1cmF0aW9uLCBlbHNlIGl0IGNhbiByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlTdHJpbmcgZ2V0UHJvcGVydGllc1BhZ2VJRCgpOwotCQotCS8qKgotCSAqIDxwPlNldHMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIGNhdGVnb3J5IHNob3VsZCBiZSBkaXNwbGF5ZWQgb24gaXRzIG93biBjb250ZW50Ci0JICogYXNzaXN0IHBhZ2UuPHA+Ci0JICogCi0JICogPHA+PGI+Tk9URTogPC9iPlRoaXMgcHJlZmVyZW5jZSBzaG91bGQgPGI+Tk9UPC9iPiBiZSBzYXZlZCBwZXJtYW5lbnRseSBoZXJlLCB0aGF0IGFjdGlvbgotCSAqIHNob3VsZCB3YWl0IHVudGlsIHtAbGluayAjc2F2ZUNvbmZpZ3VyYXRpb24oKX0gaXMgY2FsbGVkPC9wPgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeUlEIHRoZSBjYXRlZ29yeSB0aGF0IHNob3VsZCBlaXRoZXIgYmUgZGlzcGxheWVkIG9uIGl0cyBvd24gY29udGVudAotCSAqIGFzc2lzdCBwYWdlIG9yIG5vdAotCSAqIEBwYXJhbSBzaG91bGREaXNwbGF5IDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBjYXRlZ29yeSBzaG91bGQgYmUgZGlzcGxheWVkCi0JICogb24gaXRzIG93biBjb250ZW50IGFzc2lzdCBwYWdlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0Jdm9pZCBzZXRTaG91bGREaXNwbGF5T25EZWZhdWx0UGFnZShTdHJpbmcgY2F0ZWdvcnlJRCwgYm9vbGVhbiBzaG91bGREaXNwbGF5KTsKLQkKLQkvKioKLQkgKiA8cD5TZXRzIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBjYXRlZ29yeSBzaG91bGQgYmUgZGlzcGxheWVkIG9uIHRoZSBkZWZhdWx0IGNvbnRlbnQKLQkgKiBhc3Npc3QgcGFnZS48cD4KLQkgKiAKLQkgKiA8cD48Yj5OT1RFOiA8L2I+VGhpcyBwcmVmZXJlbmNlIHNob3VsZCA8Yj5OT1Q8L2I+IGJlIHNhdmVkIHBlcm1hbmVudGx5IGhlcmUsIHRoYXQgYWN0aW9uCi0JICogc2hvdWxkIHdhaXQgdW50aWwge0BsaW5rICNzYXZlQ29uZmlndXJhdGlvbigpfSBpcyBjYWxsZWQ8L3A+Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5SUQgdGhlIGNhdGVnb3J5IHRoYXQgc2hvdWxkIGVpdGhlciBiZSBkaXNwbGF5ZWQgb24gdGhlIGRlZmF1bHQgY29udGVudAotCSAqIGFzc2lzdCBwYWdlIG9yIG5vdAotCSAqIEBwYXJhbSBzaG91bGREaXNwbGF5IDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBjYXRlZ29yeSBzaG91bGQgYmUgZGlzcGxheWVkCi0JICogb24gdGhlIGRlZmF1bHQgY29udGVudCBhc3Npc3QgcGFnZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXZvaWQgc2V0U2hvdWxkRGlzcGxheU9uT3duUGFnZShTdHJpbmcgY2F0ZWdvcnlJRCwgYm9vbGVhbiBzaG91bGREaXNwbGF5KTsKLQkKLQkvKioKLQkgKiA8cD5TZXRzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgY2F0ZWdvcmllcyBzaG91bGQgYmUgY3ljbGVkIHdoZW4gaW52b2tpbmcgY29udGVudAotCSAqIGFzc2lzdCBtdWx0aXBsZSB0aW1lcy4gIEV2ZW50IGNhdGVnb3JpZXMgdGhhdCBhcmUgbm90IGFjdGl2YXRlZCB0byBkaXNwbGF5IG9uIHRoZWlyCi0JICogb3duIGNvbnRlbnQgYXNzaXN0IHBhZ2UgY2FuIGJlIGxpc3RlZCBoZXJlIHNvIHRoYXQgd2hlbiBhY3RpdmF0ZWQgdG8gZGlzcGxheSBvbiB0aGVpcgotCSAqIG93biBwYWdlIHRoZXkgaGF2ZSBhIHJhbmsuICBUaGUgZW50aXJlIG9yZGVyIG5lZWRzIHRvIGJlIHJlLXNldCBlYWNoIHRpbWUgb25lIGNhdGVnb3J5Ci0JICogbW92ZXMgYmVjYXVzZSB0aGUgd3JpdGVyIGhhcyBubyB3YXkgb2Yga25vd2luZyBob3cgdG8gbW92ZSBqdXN0IG9uZSBjYXRlZ29yeSBpbiB0aGUgb3JkZXI8L3A+Ci0JICogCi0JICogPHA+PGI+Tk9URTogPC9iPlRoaXMgcHJlZmVyZW5jZSBzaG91bGQgPGI+Tk9UPC9iPiBiZSBzYXZlZCBwZXJtYW5lbnRseSBoZXJlLCB0aGF0IGFjdGlvbgotCSAqIHNob3VsZCB3YWl0IHVudGlsIHtAbGluayAjc2F2ZUNvbmZpZ3VyYXRpb24oKX0gaXMgY2FsbGVkPC9wPgotCSAqIAotCSAqIEBwYXJhbSBvcmRlciA8Y29kZT57QGxpbmsgTGlzdH08e0BsaW5rIFN0cmluZ30+PC9jb2RlPgotCSAqIDx1bD48bGk+PGI+dmFsdWVzOjwvYj4ge0BsaW5rIENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3J5fSBJRHM8L2xpPjwvdWw+Ci0JICovCi0Jdm9pZCBzZXRQYWdlT3JkZXIoTGlzdCBvcmRlcik7Ci0JCi0JLyoqCi0JICogPHA+U2V0cyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGNhdGVnb3JpZXMgc2hvdWxkIGJlIGxpc3RlZCBvbiB0aGUgZGVmYXVsdCBwYWdlLgotCSAqIEV2ZW50IGNhdGVnb3JpZXMgdGhhdCBhcmUgbm90IGFjdGl2YXRlZCB0byBkaXNwbGF5IG9uIHRoZSBkZWZhdWx0IGNvbnRlbnQgYXNzaXN0Ci0JICogcGFnZSBjYW4gYmUgbGlzdGVkIGhlcmUgc28gdGhhdCB3aGVuIGFjdGl2YXRlZCB0byBkaXNwbGF5IG9uIHRoZSBkZWZhdWx0IHBhZ2UKLQkgKiB0aGV5IGhhdmUgYSByYW5rLiAgVGhlIGVudGlyZSBvcmRlciBuZWVkcyB0byBiZSByZS1zZXQgZWFjaCB0aW1lIG9uZSBjYXRlZ29yeQotCSAqIG1vdmVzIGJlY2F1c2UgdGhlIHdyaXRlciBoYXMgbm8gd2F5IG9mIGtub3dpbmcgaG93IHRvIG1vdmUganVzdCBvbmUgY2F0ZWdvcnkgaW4gdGhlIG9yZGVyPC9wPgotCSAqIAotCSAqIDxwPjxiPk5PVEU6IDwvYj5UaGlzIHByZWZlcmVuY2Ugc2hvdWxkIDxiPk5PVDwvYj4gYmUgc2F2ZWQgcGVybWFuZW50bHkgaGVyZSwgdGhhdCBhY3Rpb24KLQkgKiBzaG91bGQgd2FpdCB1bnRpbCB7QGxpbmsgI3NhdmVDb25maWd1cmF0aW9uKCl9IGlzIGNhbGxlZDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gb3JkZXIgPGNvZGU+e0BsaW5rIExpc3R9PHtAbGluayBTdHJpbmd9PjwvY29kZT4KLQkgKiA8dWw+PGxpPjxiPnZhbHVlczo8L2I+IHtAbGluayBDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yeX0gSURzPC9saT48L3VsPgotCSAqLwotCXZvaWQgc2V0RGVmYXVsdFBhZ2VPcmRlcihMaXN0IG9yZGVyKTsKLQkKLQkvKioKLQkgKiA8cD5TaG91bGQgbG9hZCB0aGUgZGVmYXVsdCBzZXR0aW5ncyBmcm9tIHdoZXJldmVyIHRoZXkgYXJlIGJlaW5nIHN0b3JlZDwvcD4KLQkgKi8KLQl2b2lkIGxvYWREZWZhdWx0cygpOwotCQotCS8qKgotCSAqIDxwPlNob3VsZCBzYXZlIHRoZSBjb25maWd1cmF0aW9uIHBlcm1hbmVudGx5LiAgVHlwaWNhbGx5IGNhbGxlZCBhZnRlciB0aGUgdXNlcgotCSAqIGNoYW5nZXMgc29tZSBwcmVmZXJlbmNlcyB1c2luZyBhIHByZWZlcmVuY2UgcGFnZSBhbmQgdGhlbiBhcHBsaWVzIHRoZW0sIGJ1dCBpZiB0aGV5IGRvCi0JICogbm90IGFwcGx5IHRoZSBjaGFuZ2VzIHRoZW4gdGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZC4gIFRoaXMgaXMgdGhlIHJlYXNvbiB3aHkgdGhlCi0JICogdmFyaW91cyA8Y29kZT5zZXQqPC9jb2RlPiBtZXRob2RzIHNob3VsZCBub3QgcGVybWFuZW50bHkgc2F2ZSB0aGUgY29uZmlndXJhdGlvbjwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzYXZlIHdhcyBzdWNjZXNzZnVsLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JYm9vbGVhbiBzYXZlQ29uZmlndXJhdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3F1aWNrb3V0bGluZS9BYnN0cmFjdFF1aWNrT3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9xdWlja291dGxpbmUvQWJzdHJhY3RRdWlja091dGxpbmVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZmYyZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3F1aWNrb3V0bGluZS9BYnN0cmFjdFF1aWNrT3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnF1aWNrb3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLklDb250ZW50U2VsZWN0aW9uUHJvdmlkZXI7Ci0KLS8qKgotICogQmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gZm9yIGEgcXVpY2sgb3V0bGluZS4KLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFF1aWNrT3V0bGluZUNvbmZpZ3VyYXRpb24gewotCi0JLyoqCi0JICogUHJvdmlkZXMgdGhlIGxhYmVsIHByb3ZpZGVyIHRvIGJlIHVzZWQgYnkgdGhlIHF1aWNrIG91dGxpbmUKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIDxjb2RlPklMYWJlbFByb3ZpZGVyPC9jb2RlPiB0byBiZSB1c2VkIGJ5IHRoZSBxdWljayBvdXRsaW5lCi0JICovCi0JcHVibGljIGFic3RyYWN0IElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFByb3ZpZGVzIHRoZSBjb250ZW50IHByb3ZpZGVyIHRvIGJlIHVzZWQgYnkgdGhlIHF1aWNrIG91dGxpbmUKLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+SVRyZWVDb250ZW50UHJvdmlkZXI8L2NvZGU+IHRvIGJlIHVzZWQgd2hlbiBwcm92aWRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIHF1aWNrIG91dGxpbmUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBQcm92aWRlcyB0aGUgY29udGVudCBzZWxlY3Rpb24gcHJvdmlkZXIgdG8gYmUgdXNlZCBieSB0aGUgcXVpY2sgb3V0bGluZS4gVGhpcyBhbGxvd3MKLQkgKiBmb3IgYWRqdXN0aW5nIHRoZSBzZWxlY3Rpb24gdG8gYmUgZGlzcGxheWVkIGluIHRoZSBvdXRsaW5lIGJhc2VkIG9uIHRoZSBlZGl0b3IncyBzZWxlY3Rpb24KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIDxjb2RlPklDb250ZW50U2VsZWN0aW9uUHJvdmlkZXI8L2NvZGU+IHVzZWQgYnkgdGhlIHF1aWNrIG91dGxpbmUuIEJ5IGRlZmF1bHQsIHJldHVybnMKLQkgKiBudWxsIGluZGljYXRpbmcgdGhhdCB0aGUgc2VsZWN0aW9uIGluIHRoZSBlZGl0b3IgdHJhbnNsYXRlcyB0byB0aGUgc2VsZWN0aW9uIGluIHRoZSBvdXRsaW5lLgotCSAqLwotCXB1YmxpYyBJQ29udGVudFNlbGVjdGlvblByb3ZpZGVyIGdldENvbnRlbnRTZWxlY3Rpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3JlY29uY2lsZS9JU291cmNlUmVjb25jaWxpbmdMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3JlY29uY2lsZS9JU291cmNlUmVjb25jaWxpbmdMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTA5Mzg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9yZWNvbmNpbGUvSVNvdXJjZVJlY29uY2lsaW5nTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnJlY29uY2lsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWw7Ci0KLS8qKgotICogQSBjb3Vyc2UgbGlzdGVuZXIgZm9yIHNvdXJjZSB2aWV3ZXIgInJlY29uY2lsaW5nIiBvZiBhIGRvY3VtZW50Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU291cmNlUmVjb25jaWxpbmdMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBDYWxsZWQgYmVmb3JlIHJlY29uY2lsaW5nIGlzIHN0YXJ0ZWQuCi0JICovCi0Jdm9pZCBhYm91dFRvQmVSZWNvbmNpbGVkKCk7Ci0KLQkvKioKLQkgKiBDYWxsZWQgYWZ0ZXIgcmVjb25jaWxpbmcgaGFzIGJlZW4gZmluaXNoZWQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBkb2N1bWVudCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiByZWNvbmNpbGlhdGlvbiBoYXMKLQkgKiAgICAgICAgICAgIGJlZW4gY2FuY2VsbGVkCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICB0aGUgYW5ub3RhdGlvbiBtb2RlbCB0aGF0IHdhcyBjaGFuZ2VkIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICBpZiByZWNvbmNpbGlhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQKLQkgKiBAcGFyYW0gZm9yY2VkCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZmYgdGhpcyByZWNvbmNpbGlhdGlvbiB3YXMgZm9yY2VkCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IKLQkgKi8KLQl2b2lkIHJlY29uY2lsZWQoSURvY3VtZW50IGRvY3VtZW50LCBJQW5ub3RhdGlvbk1vZGVsIG1vZGVsLCBib29sZWFuIGZvcmNlZCwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3R5cGluZy9BYnN0cmFjdENoYXJhY3RlclBhaXJJbnNlcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3R5cGluZy9BYnN0cmFjdENoYXJhY3RlclBhaXJJbnNlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTM5NjViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS90eXBpbmcvQWJzdHJhY3RDaGFyYWN0ZXJQYWlySW5zZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS50eXBpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5JTGlua2VkTW9kZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5MaW5rZWRNb2RlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZFBvc2l0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVVSS5FeGl0RmxhZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVVSS5JRXhpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RDaGFyYWN0ZXJQYWlySW5zZXJ0ZXIgewotCi0JY2xhc3MgRXhpdFBvbGljeSBpbXBsZW1lbnRzIElFeGl0UG9saWN5IHsKLQotCQlwcml2YXRlIGNoYXIgZkV4aXQ7Ci0JCXByaXZhdGUgY2hhciBmRXNjYXBlOwotCQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0KLQkJcHVibGljIEV4aXRQb2xpY3koY2hhciBleGl0LCBjaGFyIGVzY2FwZSwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQlmRXhpdCA9IGV4aXQ7Ci0JCQlmRXNjYXBlID0gZXNjYXBlOwotCQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCX0KLQotCQlwdWJsaWMgRXhpdEZsYWdzIGRvRXhpdChMaW5rZWRNb2RlTW9kZWwgbW9kZWwsIFZlcmlmeUV2ZW50IGV2ZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCQlpZighaXNNYXNrZWQob2Zmc2V0KSkgewotCQkJCWlmIChldmVudC5jaGFyYWN0ZXIgPT0gZkV4aXQpCi0JCQkJCXJldHVybiBuZXcgRXhpdEZsYWdzKElMaW5rZWRNb2RlTGlzdGVuZXIuVVBEQVRFX0NBUkVULCBmYWxzZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBpc01hc2tlZChpbnQgb2Zmc2V0KSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmRXNjYXBlID09IGZEb2N1bWVudC5nZXRDaGFyKG9mZnNldCAtIDEpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFpciB0aGUgY2hhcmFjdGVyIDxjb2RlPmM8L2NvZGU+IGluIHRoZSBzb3VyY2Ugdmlld2VyIDxjb2RlPnZpZXdlcjwvY29kZT4uCi0JICogUG9zaXRpb25zIGFyZSBsaW5rZWQgYmVmb3JlIGFuZCBhZnRlciB0aGUgaW5zZXJ0ZWQgY2hhcmFjdGVyLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYWRkIHRoZSBsaW5rZWQgbW9kZSB0bwotCSAqIEBwYXJhbSBjIHRoZSBjaGFyYWN0ZXIgdG8gcGFpciB3aXRoCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgd2FzIHN1Y2Nlc3NmdWxseSBwYWlyZWQ7IGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBhaXIoZmluYWwgSVNvdXJjZVZpZXdlciB2aWV3ZXIsIGZpbmFsIGNoYXIgYykgewotCQlpZiAoIXNob3VsZFBhaXIodmlld2VyLCBjKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmaW5hbCBjaGFyIG1jID0gZ2V0UGFpcihjKTsKLQkJZmluYWwgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbMl07Ci0JCWNoYXJzWzBdID0gYzsKLQkJY2hhcnNbMV0gPSBtYzsKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQotCQlmaW5hbCBQb2ludCBzZWxlY3Rpb249IHZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCk7Ci0JCWZpbmFsIGludCBvZmZzZXQ9IHNlbGVjdGlvbi54OwotCQlmaW5hbCBpbnQgbGVuZ3RoPSBzZWxlY3Rpb24ueTsKLQotCQlib29sZWFuIHBhaXJlZCA9IGZhbHNlOwotCQl0cnkgewotCQkJZG9jdW1lbnQucmVwbGFjZShvZmZzZXQsIGxlbmd0aCwgbmV3IFN0cmluZyhjaGFycykpOwotCQkJTGlua2VkTW9kZU1vZGVsIG1vZGVsID0gbmV3IExpbmtlZE1vZGVNb2RlbCgpOwotCQkJTGlua2VkUG9zaXRpb25Hcm91cCBncm91cCA9IG5ldyBMaW5rZWRQb3NpdGlvbkdyb3VwKCk7Ci0JCQlncm91cC5hZGRQb3NpdGlvbihuZXcgTGlua2VkUG9zaXRpb24oZG9jdW1lbnQsIG9mZnNldCArIDEsIDAsIExpbmtlZFBvc2l0aW9uR3JvdXAuTk9fU1RPUCkpOwotCQkJbW9kZWwuYWRkR3JvdXAoZ3JvdXApOwotCQkJbW9kZWwuZm9yY2VJbnN0YWxsKCk7Ci0KLQkJCUxpbmtlZE1vZGVVSSB1aSA9IG5ldyBMaW5rZWRNb2RlVUkobW9kZWwsIHZpZXdlcik7Ci0JCQl1aS5zZXRDeWNsaW5nTW9kZShMaW5rZWRNb2RlVUkuQ1lDTEVfTkVWRVIpOwotCQkJdWkuc2V0RXhpdFBvc2l0aW9uKHZpZXdlciwgb2Zmc2V0ICsgMiwgMCwgSW50ZWdlci5NQVhfVkFMVUUpOwotCQkJdWkuc2V0RXhpdFBvbGljeShnZXRFeGl0UG9saWN5KG1jLCBnZXRFc2NhcGVDaGFyKGMpLCBkb2N1bWVudCkpOwotCQkJdWkuc2V0U2ltcGxlTW9kZSh0cnVlKTsKLQkJCXVpLmVudGVyKCk7Ci0KLQkJCXBhaXJlZCA9IHRydWU7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIHBhaXJlZDsKLQl9Ci0KLQkvKioKLQkgKiBIb29rIHRvIGV2YWx1YXRlIGlmIHRoZSBjaGFyYWN0ZXIgc2hvdWxkIGJlIHBhaXJlZC4gQ2xpZW50cyBtYXkgb3ZlcnJpZGUKLQkgKiB0byBldmFsdWF0ZSB0aGUgY2FzZS4KLQkgKiBAcGFyYW0gdmlld2VyIHRoZSBzb3VyY2Ugdmlld2VyIHdoZXJlIHRoZSBjaGFyYWN0ZXIgd291bGQgYmUgcGFpcmVkCi0JICogQHBhcmFtIGMgdGhlIGNoYXJhY3RlciB0byBwYWlyCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgc2hvdWxkIGhhdmUgaXRzIHBhaXIgY2hhcmFjdGVyIGluc2VydGVkOyBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRQYWlyKElTb3VyY2VWaWV3ZXIgdmlld2VyLCBjaGFyIGMpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2FuIHRoZSBjaGFyYWN0ZXIgYmUgcGFpcmVkIGJ5IHRoZSBpbnNlcnRlcgotCSAqIEBwYXJhbSBjIHRoZSBjaGFyYWN0ZXIgb2YgaW50ZXJlc3QKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNoYXJhY3RlciBjYW4gYmUgcGFpcmVkIGJ5IHRoZSBpbnNlcnRlcjsgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JYWJzdHJhY3QgcHVibGljIGJvb2xlYW4gaGFzUGFpcihjaGFyIGMpOwotCi0JLyoqCi0JICogR2V0IHRoZSBwYWlyZWQgY2hhcmFjdGVyIGZvciA8Y29kZT5jPC9jb2RlPgotCSAqIEBwYXJhbSBjIHRoZSBjaGFyYWN0ZXIgdG8gZmluZCB0aGUgcGFpciBvZgotCSAqIEByZXR1cm4gdGhlIHBhaXIgY2hhcmFjdGVyCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIGNoYXIgZ2V0UGFpcihjaGFyIGMpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZXNjYXBlIGNoYXJhY3RlciBmb3IgPGNvZGU+YzwvY29kZT4gaW4gY2FzZSA8Y29kZT5jPC9jb2RlPiBpcyB0byBiZSB1c2VkCi0JICogd2l0aGluIHRoZSBwYWlyZWQgY2hhcmFjdGVycwotCSAqIEBwYXJhbSBjIHRoZSBjaGFyYWN0ZXIgdG8gZmluZCB0aGUgZXNjYXBlIGNoYXJhY3RlciBvZgotCSAqIEByZXR1cm4gdGhlIGVzY2FwZSBjaGFyYWN0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2hhciBnZXRFc2NhcGVDaGFyKGNoYXIgYykgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIElFeGl0UG9saWN5IGdldEV4aXRQb2xpY3koY2hhciBleGl0LCBjaGFyIGVzY2FwZSwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXJldHVybiBuZXcgRXhpdFBvbGljeShleGl0LCBlc2NhcGUsIGRvY3VtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvdmlld3MvY29udGVudG91dGxpbmUvQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvdmlld3MvY29udGVudG91dGxpbmUvQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Y2JmNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0NvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlczsKLQotLyoqCi0gKiBCYXNpYyBDb25maWd1cmF0aW9uIGNsYXNzIGZvciBPdXRsaW5lIFBhZ2VzCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiB7Ci0JLyoqCi0JICogQWRkIGEgY29sbGFwc2UgYWN0aW9uIHRvIGhlbHAgd2l0aCBuYXZpZ2F0aW9uLgotCSAqLwotCXByaXZhdGUgY2xhc3MgQ29sbGFwc2VUcmVlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQkJcHJpdmF0ZSBUcmVlVmlld2VyIGZUcmVlVmlld2VyID0gbnVsbDsKLQotCQlwdWJsaWMgQ29sbGFwc2VUcmVlQWN0aW9uKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCQlzdXBlcihTU0VVSU1lc3NhZ2VzLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbl8wLCBBU19QVVNIX0JVVFRPTik7IC8vJE5PTi1OTFMtMSQKLQkJCXNldEltYWdlRGVzY3JpcHRvcihDT0xMQVBTRV9FKTsKLQkJCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKENPTExBUFNFX0QpOwotCQkJc2V0VG9vbFRpcFRleHQoZ2V0VGV4dCgpKTsKLQkJCWZUcmVlVmlld2VyID0gdmlld2VyOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJc3VwZXIucnVuKCk7Ci0JCQlmVHJlZVZpZXdlci5jb2xsYXBzZUFsbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVG9nZ2xlcyB3aGV0aGVyIGluY29taW5nIHNlbGVjdGlvbiBub3RpZmljYXRpb24gYWZmZWN0cyB1cwotCSAqLwotCXByaXZhdGUgY2xhc3MgVG9nZ2xlTGlua0FjdGlvbiBleHRlbmRzIFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uIHsKLQkJcHVibGljIFRvZ2dsZUxpbmtBY3Rpb24oSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIHByZWZlcmVuY2UpIHsKLQkJCXN1cGVyKFNTRVVJTWVzc2FnZXMuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uXzEsIHN0b3JlLCBwcmVmZXJlbmNlLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJc2V0VG9vbFRpcFRleHQoZ2V0VGV4dCgpKTsKLQkJCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFNZTkNFRF9EKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihTWU5DRURfRSk7Ci0JCQl1cGRhdGUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJCXN1cGVyLnVwZGF0ZSgpOwotCQkJc2V0TGlua1dpdGhFZGl0b3IoaXNDaGVja2VkKCkpOwotCQl9Ci0JfQotCi0JSW1hZ2VEZXNjcmlwdG9yIENPTExBUFNFX0QgPSBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RMQ0xfQ09MTEFQU0VBTEwpOwotCUltYWdlRGVzY3JpcHRvciBDT0xMQVBTRV9FID0gRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FTENMX0NPTExBUFNFQUxMKTsKLQotCXByaXZhdGUgYm9vbGVhbiBmSXNMaW5rV2l0aEVkaXRvciA9IGZhbHNlOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBmTGFiZWxQcm92aWRlcjsKLQlwcml2YXRlIElDb250cmlidXRpb25JdGVtW10gZk1lbnVDb250cmlidXRpb25zID0gbnVsbDsKLQlwcml2YXRlIElDb250cmlidXRpb25JdGVtW10gZlRvb2xiYXJDb250cmlidXRpb25zID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBPVVRMSU5FX0xJTktfUFJFRiA9ICJvdXRsaW5lLWxpbmstZWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCUltYWdlRGVzY3JpcHRvciBTWU5DRURfRCA9IEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRExDTF9TWU5DRUQpOwotCUltYWdlRGVzY3JpcHRvciBTWU5DRURfRSA9IEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRUxDTF9TWU5DRUQpOwotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbnRyaWJ1dGlvbnMgZm9yIHRoZSB2aWV3J3MgbG9jYWwgbWVudS4gU3ViY2xhc3NlcyBzaG91bGQKLQkgKiBtZXJnZSB0aGVpciBjb250cmlidXRpb25zIHdpdGggdGhlc2UuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gbWVudSBjb250cmlidXRpb25zCi0JICovCi0JcHJvdGVjdGVkIElDb250cmlidXRpb25JdGVtW10gY3JlYXRlTWVudUNvbnRyaWJ1dGlvbnMoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gdG9nZ2xlTGlua0l0ZW0gPSBuZXcgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtKG5ldyBUb2dnbGVMaW5rQWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpLCBPVVRMSU5FX0xJTktfUFJFRikpOwotCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbmV3IElDb250cmlidXRpb25JdGVtW117dG9nZ2xlTGlua0l0ZW19OwotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdG9vbGJhciBjb250cmlidXRpb25zLiBTdWJjbGFzc2VzIHNob3VsZCBtZXJnZSB0aGVpcgotCSAqIGNvbnRyaWJ1dGlvbnMgd2l0aCB0aGVzZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0b29sYmFyIGNvbnRyaWJ1dGlvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBjcmVhdGVUb29sYmFyQ29udHJpYnV0aW9ucyhUcmVlVmlld2VyIHZpZXdlcikgewotCQlJQ29udHJpYnV0aW9uSXRlbSBjb2xsYXBzZUFsbEl0ZW0gPSBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShuZXcgQ29sbGFwc2VUcmVlQWN0aW9uKHZpZXdlcikpOwotCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbmV3IElDb250cmlidXRpb25JdGVtW117Y29sbGFwc2VBbGxJdGVtfTsKLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIENvbnRlbnRQcm92aWRlciB0byB1c2Ugd2l0aCB0aGUgZ2l2ZW4gdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSBJQ29udGVudFByb3ZpZGVyIHRvIHVzZSB3aXRoIHRoaXMgdmlld2VyCi0JICovCi0JcHVibGljIGFic3RyYWN0IElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKFRyZWVWaWV3ZXIgdmlld2VyKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgS2V5TGlzdGVuZXJzIHRvIGF0dGFjaCB0byB0aGUgZ2l2ZW4gdmlld2VyJ3MKLQkgKiBjb250cm9sIG9yIG51bGwuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgS2V5TGlzdGVuZXJzIHRvIGF0dGFjaCB0byB0aGUgVHJlZVZpZXdlcidzIENvbnRyb2wsCi0JICogICAgICAgICBvciBudWxsLiBUaGUgbGlzdGVuZXJzIHNob3VsZCBhZGhlcmUgdG8gdGhlIEtleUV2ZW50LmRvaXQgZmllbGQKLQkgKiAgICAgICAgIHRvIGVuc3VyZSBwcm9wZXIgYmVoYXZpb3JzLiBPcmRlcmluZyBvZiB0aGUgZXZlbnQgbm90aWZpY2F0aW9ucwotCSAqICAgICAgICAgaXMgZGVwZW5kZW50IG9uIHRoZSBDb250cm9sIGluIHRoZSBUcmVlVmlld2VyLgotCSAqLwotCXB1YmxpYyBLZXlMaXN0ZW5lcltdIGdldEtleUxpc3RlbmVycyhUcmVlVmlld2VyIHZpZXdlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBMYWJlbFByb3ZpZGVyIGZvciB0aGUgaXRlbXMgd2l0aGluIHRoZSBnaXZlbiB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIElMYWJlbFByb3ZpZGVyIGZvciBpdGVtcyB3aXRoaW4gdGhlIHZpZXdlcgotCSAqLwotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmTGFiZWxQcm92aWRlciA9PSBudWxsKQotCQkJZkxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpOwotCQlyZXR1cm4gZkxhYmVsUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVudSBjb250cmlidXRpb24gaXRlbXMgZm9yIHRoZSBsb2NhbCBtZW51IGluIHRoZSBvdXRsaW5lLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIElDb250cmlidXRpb25JdGVtW10gZm9yIHRoZSBsb2NhbCBtZW51Ci0JICovCi0JcHVibGljIGZpbmFsIElDb250cmlidXRpb25JdGVtW10gZ2V0TWVudUNvbnRyaWJ1dGlvbnMoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZNZW51Q29udHJpYnV0aW9ucyA9PSBudWxsKSB7Ci0JCQlmTWVudUNvbnRyaWJ1dGlvbnMgPSBjcmVhdGVNZW51Q29udHJpYnV0aW9ucyh2aWV3ZXIpOwotCQl9Ci0JCXJldHVybiBmTWVudUNvbnRyaWJ1dGlvbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVudSBsaXN0ZW5lciB0byBub3RpZnkgd2hlbiB0aGUgZ2l2ZW4gdmlld2VyJ3MgY29udGV4dAotCSAqIG1lbnUgaXMgYWJvdXQgdG8gYmUgc2hvd24gb3IgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgSU1lbnVMaXN0ZW5lciB0byBub3RpZnkgd2hlbiB0aGUgdmlld2VyJ3MgY29udGV4dCBtZW51IGlzCi0JICogICAgICAgICBhYm91dCB0byBiZSBzaG93biwgb3IgbnVsbAotCSAqLwotCXB1YmxpYyBJTWVudUxpc3RlbmVyIGdldE1lbnVMaXN0ZW5lcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBQcmVmZXJlbmNlU3RvcmUgdG8gdXNlIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSBzdG9yZSBpbiB3aGljaCB0byByZW1lbWJlciBwcmVmZXJlbmNlcyAoc3VjaCBhcwotCSAqICAgICAgICAgdGhlIGxpbmstd2l0aC1lZGl0b3IgdG9nZ2xlIHN0YXRlKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFNTRVVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgKGZpbHRlcmVkKSBzZWxlY3Rpb24gZnJvbSB0aGUgZ2l2ZW4gc2VsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIG1vZGVsIHNlbGVjdGlvbgotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSAoZmlsdGVyZWQpIHNlbGVjdGlvbiBmcm9tIHRoaXMgZXZlbnQuIFVzZXMgaW5jbHVkZSBtYXBwaW5nCi0JICogICAgICAgICBtb2RlbCBzZWxlY3Rpb24gb250byBlbGVtZW50cyBwcm92aWRlZCBieSB0aGUgY29udGVudCBwcm92aWRlci4KLQkgKiAgICAgICAgIFNob3VsZCBvbmx5IHJldHVybiBlbGVtZW50cyB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIFRyZWUKLQkgKiAgICAgICAgIENvbnRyb2wuCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKFRyZWVWaWV3ZXIgdmlld2VyLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKiBAcGFyYW0gdHJlZVZpZXdlcgotCSAqIEByZXR1cm4gYSBsYWJlbCBwcm92aWRlciBwcm92aWRpbmcgdGhlIHN0YXR1cyBsaW5lIGNvbnRlbnRzCi0JICovCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbnRyaWJ1dGlvbiBpdGVtcyBmb3IgdGhlIGxvY2FsIHRvb2xiYXIgaW4gdGhlIG91dGxpbmUuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gSUNvbnRyaWJ1dGlvbkl0ZW1bXSBmb3IgdGhlIGxvY2FsIHRvb2xiYXIKLQkgKi8KLQlwdWJsaWMgZmluYWwgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBnZXRUb29sYmFyQ29udHJpYnV0aW9ucyhUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZlRvb2xiYXJDb250cmlidXRpb25zID09IG51bGwpIHsKLQkJCWZUb29sYmFyQ29udHJpYnV0aW9ucyA9IGNyZWF0ZVRvb2xiYXJDb250cmlidXRpb25zKHZpZXdlcik7Ci0JCX0KLQkJcmV0dXJuIGZUb29sYmFyQ29udHJpYnV0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBBZG9wdGVkIHNpbmNlIHlvdSBjYW4ndCBlYXNpbHkgcmVtb3ZlRHJhZ1N1cHBvcnQgZnJvbQotCSAqIFN0cnVjdHVyZWRWaWV3ZXJzLgotCSAqIAotCSAqIEBwYXJhbSB0cmVlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMKLQkgKi8KLQlwdWJsaWMgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJbXSBnZXRUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMoVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJbMF07Ci0JfQotCi0JLyoqCi0JICogQWRvcHRlZCBzaW5jZSB5b3UgY2FuJ3QgZWFzaWx5IHJlbW92ZURyb3BTdXBwb3J0IGZyb20KLQkgKiBTdHJ1Y3R1cmVkVmlld2Vycy4KLQkgKiAKLQkgKiBAcGFyYW0gdHJlZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzCi0JICovCi0JcHVibGljIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyW10gZ2V0VHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyWzBdOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBub2RlIHNlbGVjdGlvbiBjaGFuZ2VzIGFmZmVjdCBzZWxlY3Rpb24gaW4gdGhlCi0JICogVHJlZVZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdHJlZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBvdXRsaW5lIGlzIGN1cnJlbnRseSBsaW5rZWQgdG8gc2VsZWN0aW9uIGluIGVkaXRvciwKLQkgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGlua2VkV2l0aEVkaXRvcihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJcmV0dXJuIGZJc0xpbmtXaXRoRWRpdG9yOwotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciBvciBub3Qgb3V0bGluZSB2aWV3IHNob3VsZCBiZSBsaW5rZWQgd2l0aCBzZWxlY3Rpb24gaW4KLQkgKiBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIGlzTGlua1dpdGhFZGl0b3IKLQkgKiAgICAgICAgICAgIFRoZSBpc0xpbmtXaXRoRWRpdG9yIHRvIHNldC4KLQkgKi8KLQl2b2lkIHNldExpbmtXaXRoRWRpdG9yKGJvb2xlYW4gaXNMaW5rV2l0aEVkaXRvcikgewotCQlmSXNMaW5rV2l0aEVkaXRvciA9IGlzTGlua1dpdGhFZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhbCBob29rIGZvciByZXNvdXJjZSByZWxlYXNpbmcgYW5kIGxpc3RlbmVyIHJlbW92YWwgd2hlbgotCSAqIGNvbmZpZ3VyYXRpb25zIGNoYW5nZSBvciB0aGUgdmlld2VyIGlzIGRpc3Bvc2VkIG9mLiBUaGlzIGltcGxlbWVudGF0aW9uCi0JICogc3RvcHMgb2YgYW55IHJlbWFpbmluZyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gZnJvbQotCSAqIHByZWZlcmVuY2UgbGlzdGVuaW5nLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmNvbmZpZ3VyZShUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZlRvb2xiYXJDb250cmlidXRpb25zICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlRvb2xiYXJDb250cmlidXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZUb29sYmFyQ29udHJpYnV0aW9uc1tpXSBpbnN0YW5jZW9mIFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgewotCQkJCQkoKFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgZlRvb2xiYXJDb250cmlidXRpb25zW2ldKS5kaXNjb25uZWN0KCk7Ci0JCQkJfQotCQkJfQotCQkJZlRvb2xiYXJDb250cmlidXRpb25zID0gbnVsbDsKLQkJfQotCQlpZiAoZk1lbnVDb250cmlidXRpb25zICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZk1lbnVDb250cmlidXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZNZW51Q29udHJpYnV0aW9uc1tpXSBpbnN0YW5jZW9mIFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgewotCQkJCQkoKFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgZk1lbnVDb250cmlidXRpb25zW2ldKS5kaXNjb25uZWN0KCk7Ci0JCQkJfQotCQkJfQotCQkJZk1lbnVDb250cmlidXRpb25zID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvSVByb3BlcnR5U291cmNlRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NGVlZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvSVByb3BlcnR5U291cmNlRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllczsKLQotLyoqCi0gKiBEZWNsYXJlcyB0aGF0IHRoaXMgSVByb3BlcnR5U291cmNlIG1pZ2h0IHN1cHBvcnQgb3V0cmlnaHQgcmVtb3ZhbCBvZiBhCi0gKiBwcm9wZXJ0eQotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3BlcnR5U291cmNlRXh0ZW5zaW9uIHsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgbWF0Y2hpbmcgdGhlIGdpdmVuIG5hbWUgY2FuIGJlIHJlbW92ZWQsCi0JICogZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHByb3BlcnR5IG1hdGNoaW5nIHRoaXMgbmFtZSBjYW4gYmUgcmVtb3ZlZAotCSAqLwotCWJvb2xlYW4gaXNQcm9wZXJ0eVJlbW92YWJsZShPYmplY3QgbmFtZSk7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBkaXNwbGF5ZWQgbmFtZS4gSWYgbm8gc3VjaCBwcm9wZXJ0eQotCSAqIGV4aXN0cywgbm90aGluZyBpcyBkb25lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgZGlzcGxheWVkIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICovCi0Jdm9pZCByZW1vdmVQcm9wZXJ0eShPYmplY3QgbmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvdmlld3MvcHJvcGVydGllcy9Qcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5ZTM4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvdmlld3MvcHJvcGVydGllcy9Qcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci0KLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGNsYXNzIGZvciBQcm9wZXJ0eSBTaGVldCBQYWdlcy4gTm90IGZpbmFsaXplZC4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gewotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBjb250cmlidXRpb24gbWVudSBpdGVtcyB0byB0aGUgZ2l2ZW4gbWVudU1hbmFnZXIsIHRvb2xiYXJNYW5hZ2VyLAotCSAqIHN0YXR1c0xpbmVNYW5hZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBtZW51TWFuYWdlcgotCSAqICAgICAgICAgICAgdGhlIGxvY2FsIG1lbnUgbWFuYWdlciBvZiB0aGUgcHJvcGVydHkgc2hlZXQKLQkgKiBAcGFyYW0gdG9vbEJhck1hbmFnZXIKLQkgKiAgICAgICAgICAgIHRoZSBsb2NhbCB0b29sYmFyIG1hbmFnZXIgb2YgdGhlIHByb3BlcnR5IHNoZWV0Ci0JICogQHBhcmFtIHN0YXR1c0xpbmVNYW5hZ2VyCi0JICogICAgICAgICAgICB0aGUgc3RhdHVzIGxpbmUgbWFuYWdlciBvZiB0aGUgcHJvcGVydHkgc2hlZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwgSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLCBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEFsbG93cyBmb3IgZmlsdGVyYXRpb24gb2Ygc2VsZWN0aW9uIGJlZm9yZSBiZWluZyBzZW50IHRvIHRoZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGluZ1BhcnQKLQkgKiAgICAgICAgICAgIG1heSBiZSBudWxsCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqICAgICAgICAgICAgbW9kZWwgc2VsZWN0aW9uCi0JICogQHJldHVybiB0aGUgKGZpbHRlcmVkKSBzZWxlY3Rpb24gdG8gYmUgc2VudCB0byB0aGUgdmlld2VyCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0SW5wdXRTZWxlY3Rpb24oSVdvcmtiZW5jaFBhcnQgc2VsZWN0aW5nUGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVNlbGVjdGlvbiBwcmVmZXJyZWRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJLy8gZG9uJ3Qgc3VwcG9ydCBtb3JlIHRoYW4gb25lIHNlbGVjdGVkIG5vZGUKLQkJCWlmICgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnNpemUoKSA+IDEpCi0JCQkJcHJlZmVycmVkU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQkJfQotCQlyZXR1cm4gcHJlZmVycmVkU2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvcnJlY3QgSVByb3BlcnR5U291cmNlUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIHBhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBwYWdlIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgZm9yIHRoZSBnaXZlbiBwYWdlCi0JICovCi0JcHVibGljIGFic3RyYWN0IElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGdldFByb3BlcnR5U291cmNlUHJvdmlkZXIoSVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBjb250cmlidXRpb24gbWVudSBpdGVtcyBmcm9tIHRoZSBnaXZlbiBtZW51TWFuYWdlciwKLQkgKiB0b29sYmFyTWFuYWdlciwgc3RhdHVzTGluZU1hbmFnZXIuCi0JICogCi0JICogQHBhcmFtIG1lbnVNYW5hZ2VyCi0JICogICAgICAgICAgICB0aGUgbG9jYWwgbWVudSBtYW5hZ2VyIG9mIHRoZSBwcm9wZXJ0eSBzaGVldAotCSAqIEBwYXJhbSB0b29sQmFyTWFuYWdlcgotCSAqICAgICAgICAgICAgdGhlIGxvY2FsIHRvb2xiYXIgbWFuYWdlciBvZiB0aGUgcHJvcGVydHkgc2hlZXQKLQkgKiBAcGFyYW0gc3RhdHVzTGluZU1hbmFnZXIKLQkgKiAgICAgICAgICAgIHRoZSBzdGF0dXMgbGluZSBtYW5hZ2VyIG9mIHRoZSBwcm9wZXJ0eSBzaGVldAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnRyaWJ1dGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogR2VuZXJhbCBob29rIGZvciByZXNvdXJjZSByZWxlYXNpbmcgYW5kIGxpc3RlbmVyIHJlbW92YWwgd2hlbgotCSAqIGNvbmZpZ3VyYXRpb25zIGNoYW5nZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmNvbmZpZ3VyZSgpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvdGVzdFRvYy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvdGVzdFRvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNDJiOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3Rlc3RUb2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYwotCWxhYmVsPSJUZXN0IFRPQyIKLQl0b3BpYz0iaHRtbC90b2MuaHRtbCI+Ci0JPGxpbmsgdG9jPSJ0b2MueG1sIiAvPgotPC90b2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3RvYy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvdG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjMGJiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJTYW1wbGUgVGFibGUgb2YgQ29udGVudHMiPgotCTx0b3BpYwotCQlsYWJlbD0iTWFpbiBUb3BpYyIKLQkJaHJlZj0iaHRtbC9tYWludG9waWMuaHRtbCI+Ci0JCTx0b3BpYwotCQkJbGFiZWw9IlN1YiBUb3BpYyIKLQkJCWhyZWY9Imh0bWwvc3VidG9waWMuaHRtbCIgLz4KLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iTWFpbiBUb3BpYyAyIiAvPgotPC90b2M+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDQ3NjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0KLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ODdkODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFkMGU5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBNYXkgMTQgMjI6NDQ6NDUgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzkyNWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNXZWQgSnVuIDE1IDE0OjE0OjQ2IEVEVCAyMDA1Ci1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0xCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NmYwOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMyYTdjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSwgMjAwODwvcD4KLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcwotcGx1Zy1pbiAoIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzCi1wcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYwotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEKLQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlCi1Gb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkKLSgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIKLXVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZQotdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdAotdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kCi1jb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZAotc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgotPHA+VGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkCi1wYXJ0aWVzIGFzIHNldCBvdXQgYmVsb3cuIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5Ci1mcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBmb2xsb3dpbmcgaXMgcHJvdmlkZWQgZm9yIGluZm9ybWF0aW9uYWwKLXB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgdG8gdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIGZvcgotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KLQotPGg0Pk9wZW4gTW9iaWxlIEFsbGlhbmNlIERURHM8L2g0PgotCi08cD5UaGUgcGx1Zy1pbiBpcyBhY2NvbXBhbmllZCBieSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb25zCi0oJnF1b3Q7V0FQIERURHMmcXVvdDspIGRlZmluZWQgYnkgdGhlIFdpcmVsZXNzIEFwcGxpY2F0aW9uIFByb3RvY29sCi0oV0FQKSBGb3J1bS4gVGhlIFdBUCBGb3J1bSBoYXMgbm93IGJlZW4gY29uc29saWRhdGVkIGludG8gdGhlIE9wZW4KLU1vYmlsZSBBbGxpYW5jZSAoT01BKS4gVGhlIFdBUCBEVERzIGFyZSB0aGUgZm9sbG93aW5nIGZpbGVzIGxvY2F0ZWQgaW4KLXRoZSBwbHVnLWluOjwvcD4KLTx1bD4KLQk8bGk+PHN0cm9uZz53bWwxMS5kdGQ8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQvd21sXzEuMS54bWwiIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQvd21sXzEuMS54bWw8L2E+PC9saT4KLQk8bGk+PHN0cm9uZz53bWwxMy5kdGQ8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQvd21sMTMuZHRkIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3dtbDEzLmR0ZDwvYT48L2xpPgotCTxsaT48c3Ryb25nPnhodG1sLW1vYmlsZTEwLWZsYXQuZHRkPC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3hodG1sLW1vYmlsZTEwLmR0ZCIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC94aHRtbC1tb2JpbGUxMC5kdGQ8L2E+PC9saT4KLTwvdWw+Ci0KLTxwPllvdXIgdXNlIG9mIHRoZSBXQVAgRFREcyBpcyBnb3Zlcm5lZCBieSB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLW9mIHRoZSBFUEwuPC9wPgotCi08cD5Nb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBXQVAgYW5kIHRoZSBPTUEgaXMgYXZhaWxhYmxlIGF0IDxhCi0JaHJlZj0iaHR0cDovL3d3dy5vcGVubW9iaWxlYWxsaWFuY2Uub3JnL3RlY2gvYWZmaWxpYXRlcy93YXAvd2FwaW5kZXguaHRtbCI+aHR0cDovL3d3dy5vcGVubW9iaWxlYWxsaWFuY2Uub3JnL3RlY2gvYWZmaWxpYXRlcy93YXAvd2FwaW5kZXguaHRtbDwvYT4uPC9wPgotCi08aDQ+VzNDIERURHM8L2g0PgotCi08cD5UaGUgcGx1Zy1pbiBpcyBhY2NvbXBhbmllZCBieSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb25zICgmcXVvdDsKLVczQyBEVERzJnF1b3Q7KSBkZWZpbmVkIGJ5IHRoZSB0aGUgVzNDIEV4dGVuc2libGUgSHlwZXJUZXh0IE1hcmt1cAotTGFuZ3VhZ2UgKFhIVE1MKSAxLjEuIFhIVE1MIGlzIGRlc2NyaWJlZCBhdCA8YQotCWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvIj5odHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDExLzwvYT4uPC9wPgotVGhlIFczQyBEVERzIGFyZSB0aGUgZm9sbG93aW5nIGZpbGVzIGxvY2F0ZWQgaW4gdGhlIHBsdWctaW46Ci08cD4KLTx1bD4KLQk8bGk+PHN0cm9uZz54aHRtbDExLWZsYXQuZHRkPC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDExL0RURC94aHRtbDExLmR0ZDwvYT48L2xpPgotCTxsaT48c3Ryb25nPnhodG1sMS1mcmFtZXNldC5kdGQ8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1mcmFtZXNldC5kdGQiCi0JCXRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1mcmFtZXNldC5kdGQ8L2E+PC9saT4KLQk8bGk+PHN0cm9uZz54aHRtbDEtc3RyaWN0PC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCIKLQkJdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQ8L2E+PC9saT4KLQk8bGk+PHN0cm9uZz54aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiCi0JCXRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkPC9hPjwvbGk+Ci0JPGxpPjxzdHJvbmc+eGh0bWwtYmFzaWMxMC1mLmR0ZDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLWJhc2ljL3hodG1sLWJhc2ljMTAuZHRkIgotCQl0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtYmFzaWMveGh0bWwtYmFzaWMxMC5kdGQ8L2E+PC9saT4KLQk8bGk+PHN0cm9uZz54aHRtbC1sYXQxLmVudDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwtbGF0MS5lbnQiIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLWxhdDEuZW50PC9hPjwvbGk+Ci0JPGxpPjxzdHJvbmc+eGh0bWwtc3BlY2lhbC5lbnQ8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLXNwZWNpYWwuZW50IgotCQl0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1zcGVjaWFsLmVudDwvYT48L2xpPgotCTxsaT48c3Ryb25nPnhodG1sLXN5bWJvbC5lbnQ8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLXN5bWJvbC5lbnQiCi0JCXRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLXN5bWJvbC5lbnQ8L2E+PC9saT4KLTwvdWw+Ci0KLTxwPkFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDUuMTAgb2YgdGhlIEZBUSBsb2NhdGVkIGF0IDxhCi0JaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9JUFItRkFRLTIwMDAwNjIwLmh0bWwjRFREIgotCXRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL0lQUi1GQVEtMjAwMDA2MjAuaHRtbCNEVEQ8L2E+LAoteW91ciB1c2Ugb2YgdGhlIFczQyBEVERzIGlzIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLVczQyBTb2Z0d2FyZSBMaWNlbnNlIGEgY29weSBvZiB3aGljaCBpcyBpbmNsdWRlZCBpbiB0aGUgZmlsZSA8YQotCWhyZWY9ImFib3V0X2ZpbGVzL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMC5odG0iPmFib3V0X2ZpbGVzL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMC5odG08L2E+Ci1hbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEKLQlocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMCIKLQl0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjA8L2E+LjwvcD4KLTxoND5XU0RMIFNjaGVtYXM8L2g0PgotCi08cD5UaGUgcGx1Zy1pbiBpcyBhY2NvbXBhbmllZCBieSBmaXZlIHNjaGVtYSBmaWxlcy4gWW91ciB1c2Ugb2YgdGhlCi1mb2xsb3dpbmcgZmlsZXMgbG9jYXRlZCBpbiB0aGUgeHNkIGRpcmVjdG9yeSBvZiB0aGUgcGx1Zy1pbjo8L3A+Ci0KLTx1bD4KLQk8bGk+PHN0cm9uZz5odHRwLnhzZDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvPC9hPjwvbGk+Ci0JPGxpPjxzdHJvbmc+c29hcC54c2Q8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLzwvYT48L2xpPgotCTxsaT48c3Ryb25nPndzZGwueHNkPC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLzwvYT48L2xpPgotCTxsaT48c3Ryb25nPndzZGwtbWluZS54c2Q8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLzwvYT48L2xpPgotPC91bD4KLQotPHA+aXMgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAmcXVvdDtMaWNlbnNlIGZvcgotV1NETCBTY2hlbWEgRmlsZXMmcXVvdDsgYSBjb3B5IHdoaWNoIGlzIGxvY2F0ZWQgaW4gPGEKLQlocmVmPSJhYm91dF9maWxlcy93c2RsLXNjaGVtYS1maWxlcy1saWNlbnNlLnR4dCI+YWJvdXRfZmlsZXMvd3NkbC1zY2hlbWEtZmlsZXMtbGljZW5zZS50eHQ8L2E+LjwvcD4KLQotPHA+VGhlIGZvbGxvd2luZyBmaWxlIGxvY2F0ZWQgaW4gdGhlIHhzZCBkaXJlY3Rvcnkgb2YgdGhlIHBsdWctaW46Ci08cD4KLTx1bD4KLQk8bGk+PHN0cm9uZz5zb2FwLWVuYy54c2Q8L3N0cm9uZz4KLTwvdWw+Ci0KLTxwPmlzIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgVzNDIFNvZnR3YXJlCi1MaWNlbnNlIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDUuMTAgb2YgdGhlIEZBUSBsb2NhdGVkIGF0IDxhCi0JaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9JUFItRkFRLTIwMDAwNjIwLmh0bWwjRFREIgotCXRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL0lQUi1GQVEtMjAwMDA2MjAuaHRtbCNEVEQ8L2E+LgotQSBjb3B5IG9mIHRoZSBXM0MgU29mdHdhcmUgTGljZW5zZSBpcyBsb2NhdGVkIGluIDxhCi0JaHJlZj0iYWJvdXRfZmlsZXMvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwLmh0bSI+YWJvdXRfZmlsZXMvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwLmh0bTwvYT4KLWFuZCBpcyBhbHNvIGF2YWlsCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAuaHRtIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDJhYzdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD4KLQotCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkhUTUwgVGlkeSwgc2VlIHd3dy53My5vcmciPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjBfZmlsZXMvYmFzZS5jc3MiPjx0aXRsZT5XM0MgSVBSIFNPRlRXQVJFIE5PVElDRTwvdGl0bGU+PC9oZWFkPjxib2R5IGJnY29sb3I9IiNmZmZmZmYiIHRleHQ9IiMwMDAwMDAiPgotPGgxPlczQzxzdXA+rjwvc3VwPiBTT0ZUV0FSRSBOT1RJQ0UgQU5EIExJQ0VOU0U8L2gxPgotCi08aDM+Q29weXJpZ2h0IKkgMTk5NC0yMDAyIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLyI+V29ybGQKLVdpZGUgV2ViIENvbnNvcnRpdW08L2E+LCAoPGEgaHJlZj0iaHR0cDovL3d3dy5sY3MubWl0LmVkdS8iPk1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mCi1UZWNobm9sb2d5PC9hPiwgPGEgaHJlZj0iaHR0cDovL3d3dy5pbnJpYS5mci8iPkluc3RpdHV0IE5hdGlvbmFsIGRlCi1SZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlPC9hPiwgPGEgaHJlZj0iaHR0cDovL3d3dy5rZWlvLmFjLmpwLyI+S2VpbyBVbml2ZXJzaXR5PC9hPikuIEFsbCBSaWdodHMKLVJlc2VydmVkLiBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzwvaDM+Ci0KLTxwPlRoaXMgVzNDIHdvcmsgKGluY2x1ZGluZyBzb2Z0d2FyZSwgZG9jdW1lbnRzLCBvciBvdGhlciByZWxhdGVkCi1pdGVtcykgaXMgYmVpbmcgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIHVuZGVyIHRoZQotZm9sbG93aW5nIGxpY2Vuc2UuIEJ5IG9idGFpbmluZywgdXNpbmcgYW5kL29yIGNvcHlpbmcgdGhpcyB3b3JrLAoteW91ICh0aGUgbGljZW5zZWUpIGFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwgYW5kIHdpbGwKLWNvbXBseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnM6PC9wPgotCi08cD5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCi1hbmQgaXRzIGRvY3VtZW50YXRpb24sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sJm5ic3A7IGZvciBhbnkKLXB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIG9yIHJveWFsdHkgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQKLXlvdSBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgb24gQUxMIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kCi1kb2N1bWVudGF0aW9uIG9yIHBvcnRpb25zIHRoZXJlb2YsIGluY2x1ZGluZyBtb2RpZmljYXRpb25zLCB0aGF0Ci15b3UgbWFrZTo8L3A+Ci0KLTxvbD4KLTxsaT5UaGUgZnVsbCB0ZXh0IG9mIHRoaXMgTk9USUNFIGluIGEgbG9jYXRpb24gdmlld2FibGUgdG8gdXNlcnMgb2YKLXRoZSByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgd29yay48L2xpPgotCi08bGk+QW55IHByZS1leGlzdGluZyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgZGlzY2xhaW1lcnMsIG5vdGljZXMsIG9yCi10ZXJtcyBhbmQgY29uZGl0aW9ucy4gSWYgbm9uZSBleGlzdCwgYSBzaG9ydCBub3RpY2Ugb2YgdGhlCi1mb2xsb3dpbmcgZm9ybSAoaHlwZXJ0ZXh0IGlzIHByZWZlcnJlZCwgdGV4dCBpcyBwZXJtaXR0ZWQpIHNob3VsZAotYmUgdXNlZCB3aXRoaW4gdGhlIGJvZHkgb2YgYW55IHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSBjb2RlOgotIkNvcHlyaWdodCCpIFskZGF0ZS1vZi1zb2Z0d2FyZV0gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvIj5Xb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtPC9hPiwgKDxhIGhyZWY9Imh0dHA6Ly93d3cubGNzLm1pdC5lZHUvIj5NYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZgotVGVjaG5vbG9neTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5yaWEuZnIvIj5JbnN0aXR1dCBOYXRpb25hbCBkZQotUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cua2Vpby5hYy5qcC8iPktlaW8gVW5pdmVyc2l0eTwvYT4pLiBBbGwgUmlnaHRzCi1SZXNlcnZlZC4gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8iPC9saT4KLQotPGxpPk5vdGljZSBvZiBhbnkgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHRvIHRoZSBXM0MgZmlsZXMsCi1pbmNsdWRpbmcgdGhlIGRhdGUgY2hhbmdlcyB3ZXJlIG1hZGUuIChXZSByZWNvbW1lbmQgeW91IHByb3ZpZGUKLVVSSXMgdG8gdGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggdGhlIGNvZGUgaXMgZGVyaXZlZC4pPC9saT4KLTwvb2w+Ci0KLTxwPlRISVMgU09GVFdBUkUgQU5EIERPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTLCIgQU5ECi1DT1BZUklHSFQgSE9MREVSUyBNQUtFIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPLCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBUSEFUIFRIRQotVVNFIE9GIFRIRSBTT0ZUV0FSRSBPUiBET0NVTUVOVEFUSU9OIFdJTEwgTk9UIElORlJJTkdFIEFOWSBUSElSRAotUEFSVFkgUEFURU5UUywgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMuPC9wPgotCi08cD5DT1BZUklHSFQgSE9MREVSUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotU1BFQ0lBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgQU5ZIFVTRSBPRiBUSEUKLVNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04uPC9wPgotCi08cD5UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiBjb3B5cmlnaHQgaG9sZGVycyBtYXkgTk9UIGJlIHVzZWQgaW4KLWFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0Ci1zcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBUaXRsZSB0byBjb3B5cmlnaHQgaW4gdGhpcwotc29mdHdhcmUgYW5kIGFueSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluCi13aXRoIGNvcHlyaWdodCBob2xkZXJzLjwvcD4KLQotPHA+X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fPC9wPgotCi08cD5UaGlzIGZvcm11bGF0aW9uIG9mIFczQydzIG5vdGljZSBhbmQgbGljZW5zZSBiZWNhbWUgYWN0aXZlIG9uCi1BdWd1c3QgMTQgMTk5OCBzbyBhcyB0byBpbXByb3ZlIGNvbXBhdGliaWxpdHkgd2l0aCBHUEwuIFRoaXMKLXZlcnNpb24gZW5zdXJlcyB0aGF0IFczQyBzb2Z0d2FyZSBsaWNlbnNpbmcgdGVybXMgYXJlIG5vIG1vcmUKLXJlc3RyaWN0aXZlIHRoYW4gR1BMIGFuZCBjb25zZXF1ZW50bHkgVzNDIHNvZnR3YXJlIG1heSBiZQotZGlzdHJpYnV0ZWQgaW4gR1BMIHBhY2thZ2VzLiBTZWUgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNTE5Lmh0bWwiPm9sZGVyIGZvcm11bGF0aW9uPC9hPiBmb3IKLXRoZSBwb2xpY3kgcHJpb3IgdG8gdGhpcyBkYXRlLiBQbGVhc2Ugc2VlIG91ciA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL0lQUi1GQVEuaHRtbCI+Q29weXJpZ2h0IEZBUTwvYT4gZm9yIGNvbW1vbiBxdWVzdGlvbnMgYWJvdXQKLXVzaW5nIG1hdGVyaWFscyBmcm9tIG91ciBzaXRlLCBpbmNsdWRpbmcgc3BlY2lmaWMgdGVybXMgYW5kCi1jb25kaXRpb25zIGZvciBwYWNrYWdlcyBsaWtlIGxpYnd3dywgQW1heWEsIGFuZCBKaWdzYXcuIE90aGVyCi1xdWVzdGlvbnMgYWJvdXQgdGhpcyBub3RpY2UgY2FuIGJlIGRpcmVjdGVkIHRvIDxhIGhyZWY9Im1haWx0bzpzaXRlLXBvbGljeUB3My5vcmciPnNpdGUtcG9saWN5QHczLm9yZzwvYT4uPGJyPgotJm5ic3A7PC9wPgotCi08cD4mbmJzcDs8L3A+Ci0KLTxhZGRyZXNzPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0hlbHAvV2VibWFzdGVyLmh0bWwiPndlYm1hc3RlcjwvYT48YnI+Ci0gKGxhc3QgdXBkYXRlZCAkRGF0ZTogMjAwNy8wNS8xNSAwMjo0MjoyNCAkKTwvYWRkcmVzcz4KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMF9maWxlcy9iYXNlLmNzcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwX2ZpbGVzL2Jhc2UuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTU3YWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwX2ZpbGVzL2Jhc2UuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyogQ29weXJpZ2h0IDE5OTctMjAwMyBXM0MgKE1JVCwgRVJDSU0sIEtlaW8pLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgVGhlIGZvbGxvd2luZyBzb2Z0d2FyZSBsaWNlbnNpbmcgcnVsZXMgYXBwbHk6Ci0gICBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZSAqLwotCi0vKiAkSWQ6IGJhc2UuY3NzLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjQgZGF2aWRfd2lsbGlhbXMgRXhwICQgKi8KLQotLyogdGhpcyBzdHlsZSBzaGVldCBkZWZpbmVzIHRoZSBiYXNpYyBzdHlsZSBmb3IgYWxsIFczQyBwYWdlcyAqLwotLyogeW91IGNhbiBwb2ludCB0byB0aGlzIGJ5IGFkZGluZzoKLQotICAgICA8TElOSyByZWw9IlN0eWxlc2hlZXQiIGhyZWY9Ii9TdHlsZVNoZWV0cy9iYXNlIj4KLQotCi0gICBpbiB0aGUgSEVBRCBvZiB5b3VyIEhUTUwgZG9jdW1lbnQgKi8KLQotYm9keSB7Ci0gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwotICBjb2xvcjogYmxhY2s7Ci0gIGJhY2tncm91bmQ6IHdoaXRlOwotfQotCi1hOmxpbmssIGE6YWN0aXZlIHsKLSAgY29sb3I6ICMwMGU7Ci0gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwotfQotCi1hOnZpc2l0ZWQgewotICBjb2xvcjogIzUyOTsKLSAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Ci19Ci0KLWRpdi5pbnRybyB7Ci0gIG1hcmdpbi1sZWZ0OiA1JTsKLSAgbWFyZ2luLXJpZ2h0OiA1JTsKLSAgZm9udC1zdHlsZTogaXRhbGljCi19Ci0KLXByZSB7Ci0gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UKLX0KLQotYTpsaW5rIGltZywgYTp2aXNpdGVkIGltZyB7Ci0gICBib3JkZXItc3R5bGU6IG5vbmUKLX0KLQotYSBpbWcgeyBjb2xvcjogd2hpdGU7IH0gICAgICAgIC8qIGhpZGUgdGhlIGJvcmRlciBpbiBOZXRzY2FwZSA0ICovCi1AbWVkaWEgYWxsIHsgICAgICAgICAgICAgICAgICAgLyogaGlkZSBmcm9tIE5ldHNjYXBlIDQgKi8KLSAgYSBpbWcgeyBjb2xvcjogaW5oZXJpdDsgfSAgICAvKiB1bmRvIHRoZSBydWxlIGFib3ZlICovCi19Ci0KLXVsLnRvYywgb2wudG9jIHsKLSAgbGlzdC1zdHlsZTogZGlzYzsKLSAgbGlzdC1zdHlsZTogbm9uZTsKLX0KLQotZGl2Lmlzc3VlIHsKLSAgcGFkZGluZzogMC41ZW07Ci0gIGJvcmRlcjogbm9uZTsKLSAgbWFyZ2luLXJpZ2h0OiA1JTsKLX0KLQotLmhpZGVtZSB7IGRpc3BsYXk6IG5vbmUgfQotCi1AbWVkaWEgcHJpbnQgewotCi0gIHRhYmxlIHsKLSAgICBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQKLSAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy93c2RsLXNjaGVtYS1maWxlcy1saWNlbnNlLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvd3NkbC1zY2hlbWEtZmlsZXMtbGljZW5zZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NWY4MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy93c2RsLXNjaGVtYS1maWxlcy1saWNlbnNlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLUNvcHlyaWdodCAyMDAxIC0gMjAwNSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgTWljcm9zb2Z0IENvcnBvcmF0aW9uCi1BbGwgUmlnaHRzIFJlc2VydmVkCi0KLUxpY2Vuc2UgZm9yIFdTREwgU2NoZW1hIEZpbGVzCi0KLVRoZSBBdXRob3JzIGdyYW50IHBlcm1pc3Npb24gdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgV1NETCBTY2hlbWEgCi1GaWxlcyBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgZmVlIG9yIHJveWFsdHkgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBhbmQgCi1saWNlbnNlIGFyZSBkaXN0cmlidXRlZCB3aXRoIHRoZW0uICBUaGUgb3JpZ2luYWxzIG9mIHRoZXNlIGZpbGVzIGNhbiAKLWJlIGxvY2F0ZWQgYXQ6Ci0KLSAgICBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvCi0gICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLwotICAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvCi0gICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLwotICAgIAotCi1USEVTRSBTQ0hFTUEgRklMRVMgQVJFIFBST1ZJREVEICJBUyBJUywiIEFORCBUSEUgQVVUSE9SUyBNQUtFIE5PIFJFUFJFU0VOVEFUSU9OUyAKLU9SIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgUkVHQVJESU5HIFRIRVNFIEZJTEVTLCBJTkNMVURJTkcsIEJVVCBOT1QgCi1MSU1JVEVEIFRPLCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIAotTk9OLUlORlJJTkdFTUVOVCBPUiBUSVRMRS4gIFRIRSBBVVRIT1JTIFdJTEwgTk9UIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgCi1JTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgT1IgCi1SRUxBVElORyBUTyBBTlkgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEVTRSBGSUxFUy4KLQotVGhlIG5hbWUgYW5kIHRyYWRlbWFya3Mgb2YgdGhlIEF1dGhvcnMgbWF5IE5PVCBiZSB1c2VkIGluIGFueSBtYW5uZXIsIAotaW5jbHVkaW5nIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIHRoZXNlIGZpbGVzIG9yIGFueSBwcm9ncmFtIAotb3Igc2VydmljZSB0aGF0IHVzZXMgdGhlc2UgZmlsZXMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRpdGxlIHRvIGNvcHlyaWdodCAKLWluIHRoZXNlIGZpbGVzIHdpbGwgYXQgYWxsIHRpbWVzIHJlbWFpbiB3aXRoIHRoZSBBdXRob3JzLgotCi1ObyBvdGhlciByaWdodHMgYXJlIGdyYW50ZWQgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2NDUwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGR0ZHMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0X2ZpbGVzLyxcCi0gICAgICAgICAgICAgICB4c2QvCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0geHNkLyxcCi0gICAgICAgICAgICAgICBkdGRzLyxcCi0gICAgICAgICAgICAgICBhYm91dF9maWxlcy8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotZ2VuZXJhdGVTb3VyY2VCdW5kbGU9ZmFsc2UKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL0hUTUxsYXQxLmVudCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy9IVE1MbGF0MS5lbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NDQ0ODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL0hUTUxsYXQxLmVudAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODYKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoCi0gICAgIGNvbmZvcm1pbmcgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbgotICAgICBJU08gODg3OSwgcHJvdmlkZWQgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLS0tPgotPCEtLSBDaGFyYWN0ZXIgZW50aXR5IHNldC4gVHlwaWNhbCBpbnZvY2F0aW9uOgotICAgICA8IUVOVElUWSAlIEhUTUxsYXQxIFBVQkxJQwotICAgICAgICItLy9XM0MvL0VOVElUSUVTIExhdGluIDEvL0VOLy9IVE1MIj4KLSAgICAgJUhUTUxsYXQxOwotLS0+Ci0KLTwhRU5USVRZIG5ic3AgICBDREFUQSAiJiMxNjA7IiAtLSBuby1icmVhayBzcGFjZSA9IG5vbi1icmVha2luZyBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQTAgSVNPbnVtIC0tPgotPCFFTlRJVFkgaWV4Y2wgIENEQVRBICImIzE2MTsiIC0tIGludmVydGVkIGV4Y2xhbWF0aW9uIG1hcmssIFUrMDBBMSBJU09udW0gLS0+Ci08IUVOVElUWSBjZW50ICAgQ0RBVEEgIiYjMTYyOyIgLS0gY2VudCBzaWduLCBVKzAwQTIgSVNPbnVtIC0tPgotPCFFTlRJVFkgcG91bmQgIENEQVRBICImIzE2MzsiIC0tIHBvdW5kIHNpZ24sIFUrMDBBMyBJU09udW0gLS0+Ci08IUVOVElUWSBjdXJyZW4gQ0RBVEEgIiYjMTY0OyIgLS0gY3VycmVuY3kgc2lnbiwgVSswMEE0IElTT251bSAtLT4KLTwhRU5USVRZIHllbiAgICBDREFUQSAiJiMxNjU7IiAtLSB5ZW4gc2lnbiA9IHl1YW4gc2lnbiwgVSswMEE1IElTT251bSAtLT4KLTwhRU5USVRZIGJydmJhciBDREFUQSAiJiMxNjY7IiAtLSBicm9rZW4gYmFyID0gYnJva2VuIHZlcnRpY2FsIGJhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQTYgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2VjdCAgIENEQVRBICImIzE2NzsiIC0tIHNlY3Rpb24gc2lnbiwgVSswMEE3IElTT251bSAtLT4KLTwhRU5USVRZIHVtbCAgICBDREFUQSAiJiMxNjg7IiAtLSBkaWFlcmVzaXMgPSBzcGFjaW5nIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQTggSVNPZGlhIC0tPgotPCFFTlRJVFkgY29weSAgIENEQVRBICImIzE2OTsiIC0tIGNvcHlyaWdodCBzaWduLCBVKzAwQTkgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3JkZiAgIENEQVRBICImIzE3MDsiIC0tIGZlbWluaW5lIG9yZGluYWwgaW5kaWNhdG9yLCBVKzAwQUEgSVNPbnVtIC0tPgotPCFFTlRJVFkgbGFxdW8gIENEQVRBICImIzE3MTsiIC0tIGxlZnQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsZWZ0IHBvaW50aW5nIGd1aWxsZW1ldCwgVSswMEFCIElTT251bSAtLT4KLTwhRU5USVRZIG5vdCAgICBDREFUQSAiJiMxNzI7IiAtLSBub3Qgc2lnbiwgVSswMEFDIElTT251bSAtLT4KLTwhRU5USVRZIHNoeSAgICBDREFUQSAiJiMxNzM7IiAtLSBzb2Z0IGh5cGhlbiA9IGRpc2NyZXRpb25hcnkgaHlwaGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBRCBJU09udW0gLS0+Ci08IUVOVElUWSByZWcgICAgQ0RBVEEgIiYjMTc0OyIgLS0gcmVnaXN0ZXJlZCBzaWduID0gcmVnaXN0ZXJlZCB0cmFkZSBtYXJrIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEFFIElTT251bSAtLT4KLTwhRU5USVRZIG1hY3IgICBDREFUQSAiJiMxNzU7IiAtLSBtYWNyb24gPSBzcGFjaW5nIG1hY3JvbiA9IG92ZXJsaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBUEwgb3ZlcmJhciwgVSswMEFGIElTT2RpYSAtLT4KLTwhRU5USVRZIGRlZyAgICBDREFUQSAiJiMxNzY7IiAtLSBkZWdyZWUgc2lnbiwgVSswMEIwIElTT251bSAtLT4KLTwhRU5USVRZIHBsdXNtbiBDREFUQSAiJiMxNzc7IiAtLSBwbHVzLW1pbnVzIHNpZ24gPSBwbHVzLW9yLW1pbnVzIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEIxIElTT251bSAtLT4KLTwhRU5USVRZIHN1cDIgICBDREFUQSAiJiMxNzg7IiAtLSBzdXBlcnNjcmlwdCB0d28gPSBzdXBlcnNjcmlwdCBkaWdpdCB0d28KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNxdWFyZWQsIFUrMDBCMiBJU09udW0gLS0+Ci08IUVOVElUWSBzdXAzICAgQ0RBVEEgIiYjMTc5OyIgLS0gc3VwZXJzY3JpcHQgdGhyZWUgPSBzdXBlcnNjcmlwdCBkaWdpdCB0aHJlZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY3ViZWQsIFUrMDBCMyBJU09udW0gLS0+Ci08IUVOVElUWSBhY3V0ZSAgQ0RBVEEgIiYjMTgwOyIgLS0gYWN1dGUgYWNjZW50ID0gc3BhY2luZyBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjQgSVNPZGlhIC0tPgotPCFFTlRJVFkgbWljcm8gIENEQVRBICImIzE4MTsiIC0tIG1pY3JvIHNpZ24sIFUrMDBCNSBJU09udW0gLS0+Ci08IUVOVElUWSBwYXJhICAgQ0RBVEEgIiYjMTgyOyIgLS0gcGlsY3JvdyBzaWduID0gcGFyYWdyYXBoIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEI2IElTT251bSAtLT4KLTwhRU5USVRZIG1pZGRvdCBDREFUQSAiJiMxODM7IiAtLSBtaWRkbGUgZG90ID0gR2VvcmdpYW4gY29tbWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEdyZWVrIG1pZGRsZSBkb3QsIFUrMDBCNyBJU09udW0gLS0+Ci08IUVOVElUWSBjZWRpbCAgQ0RBVEEgIiYjMTg0OyIgLS0gY2VkaWxsYSA9IHNwYWNpbmcgY2VkaWxsYSwgVSswMEI4IElTT2RpYSAtLT4KLTwhRU5USVRZIHN1cDEgICBDREFUQSAiJiMxODU7IiAtLSBzdXBlcnNjcmlwdCBvbmUgPSBzdXBlcnNjcmlwdCBkaWdpdCBvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEI5IElTT251bSAtLT4KLTwhRU5USVRZIG9yZG0gICBDREFUQSAiJiMxODY7IiAtLSBtYXNjdWxpbmUgb3JkaW5hbCBpbmRpY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEJBIElTT251bSAtLT4KLTwhRU5USVRZIHJhcXVvICBDREFUQSAiJiMxODc7IiAtLSByaWdodC1wb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHJpZ2h0IHBvaW50aW5nIGd1aWxsZW1ldCwgVSswMEJCIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMxNCBDREFUQSAiJiMxODg7IiAtLSB2dWxnYXIgZnJhY3Rpb24gb25lIHF1YXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZyYWN0aW9uIG9uZSBxdWFydGVyLCBVKzAwQkMgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzEyIENEQVRBICImIzE4OTsiIC0tIHZ1bGdhciBmcmFjdGlvbiBvbmUgaGFsZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZnJhY3Rpb24gb25lIGhhbGYsIFUrMDBCRCBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMzQgQ0RBVEEgIiYjMTkwOyIgLS0gdnVsZ2FyIGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmcmFjdGlvbiB0aHJlZSBxdWFydGVycywgVSswMEJFIElTT251bSAtLT4KLTwhRU5USVRZIGlxdWVzdCBDREFUQSAiJiMxOTE7IiAtLSBpbnZlcnRlZCBxdWVzdGlvbiBtYXJrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0dXJuZWQgcXVlc3Rpb24gbWFyaywgVSswMEJGIElTT251bSAtLT4KLTwhRU5USVRZIEFncmF2ZSBDREFUQSAiJiMxOTI7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggZ3JhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBYWN1dGUgQ0RBVEEgIiYjMTkzOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgQWNpcmMgIENEQVRBICImIzE5NDsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXRpbGRlIENEQVRBICImIzE5NTsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEF1bWwgICBDREFUQSAiJiMxOTY7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXJpbmcgIENEQVRBICImIzE5NzsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCByaW5nIGFib3ZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBBRWxpZyAgQ0RBVEEgIiYjMTk4OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQUUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGlnYXR1cmUgQUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBDY2VkaWwgQ0RBVEEgIiYjMTk5OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQyB3aXRoIGNlZGlsbGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM3IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFZ3JhdmUgQ0RBVEEgIiYjMjAwOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWFjdXRlIENEQVRBICImIzIwMTsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVjaXJjICBDREFUQSAiJiMyMDI7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0EgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEV1bWwgICBDREFUQSAiJiMyMDM7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWdyYXZlIENEQVRBICImIzIwNDsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0MgSVNPbGF0MSAtLT4KLTwhRU5USVRZIElhY3V0ZSBDREFUQSAiJiMyMDU7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENEIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJY2lyYyAgQ0RBVEEgIiYjMjA2OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJdW1sICAgQ0RBVEEgIiYjMjA3OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0YgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVUSCAgICBDREFUQSAiJiMyMDg7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFVEgsIFUrMDBEMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgTnRpbGRlIENEQVRBICImIzIwOTsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE4gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9ncmF2ZSBDREFUQSAiJiMyMTA7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPYWN1dGUgQ0RBVEEgIiYjMjExOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2NpcmMgIENEQVRBICImIzIxMjsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBENCBJU09sYXQxIC0tPgotPCFFTlRJVFkgT3RpbGRlIENEQVRBICImIzIxMzsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE91bWwgICBDREFUQSAiJiMyMTQ7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBENiBJU09sYXQxIC0tPgotPCFFTlRJVFkgdGltZXMgIENEQVRBICImIzIxNTsiIC0tIG11bHRpcGxpY2F0aW9uIHNpZ24sIFUrMDBENyBJU09udW0gLS0+Ci08IUVOVElUWSBPc2xhc2ggQ0RBVEEgIiYjMjE2OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIHN0cm9rZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyBzbGFzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDggSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVncmF2ZSBDREFUQSAiJiMyMTc7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBVYWN1dGUgQ0RBVEEgIiYjMjE4OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWNpcmMgIENEQVRBICImIzIxOTsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgVXVtbCAgIENEQVRBICImIzIyMDsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBZYWN1dGUgQ0RBVEEgIiYjMjIxOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgWSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBERCBJU09sYXQxIC0tPgotPCFFTlRJVFkgVEhPUk4gIENEQVRBICImIzIyMjsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFRIT1JOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBERSBJU09sYXQxIC0tPgotPCFFTlRJVFkgc3psaWcgIENEQVRBICImIzIyMzsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBzaGFycCBzID0gZXNzLXplZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFncmF2ZSBDREFUQSAiJiMyMjQ7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGdyYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFhY3V0ZSBDREFUQSAiJiMyMjU7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWNpcmMgIENEQVRBICImIzIyNjsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGF0aWxkZSBDREFUQSAiJiMyMjc7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXVtbCAgIENEQVRBICImIzIyODsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXJpbmcgIENEQVRBICImIzIyOTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggcmluZyBhYm92ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGV0dGVyIGEgcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFlbGlnICBDREFUQSAiJiMyMzA7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxpZ2F0dXJlIGFlLCBVKzAwRTYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGNjZWRpbCBDREFUQSAiJiMyMzE7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYyB3aXRoIGNlZGlsbGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU3IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlZ3JhdmUgQ0RBVEEgIiYjMjMyOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTggSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVhY3V0ZSBDREFUQSAiJiMyMzM7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWNpcmMgIENEQVRBICImIzIzNDsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGV1bWwgICBDREFUQSAiJiMyMzU7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGlncmF2ZSBDREFUQSAiJiMyMzY7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWFjdXRlIENEQVRBICImIzIzNzsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVEIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpY2lyYyAgQ0RBVEEgIiYjMjM4OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgaXVtbCAgIENEQVRBICImIzIzOTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFRiBJU09sYXQxIC0tPgotPCFFTlRJVFkgZXRoICAgIENEQVRBICImIzI0MDsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBldGgsIFUrMDBGMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgbnRpbGRlIENEQVRBICImIzI0MTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBuIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEYxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvZ3JhdmUgQ0RBVEEgIiYjMjQyOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9hY3V0ZSBDREFUQSAiJiMyNDM7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2NpcmMgIENEQVRBICImIzI0NDsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG90aWxkZSBDREFUQSAiJiMyNDU7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgb3VtbCAgIENEQVRBICImIzI0NjsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgZGl2aWRlIENEQVRBICImIzI0NzsiIC0tIGRpdmlzaW9uIHNpZ24sIFUrMDBGNyBJU09udW0gLS0+Ci08IUVOVElUWSBvc2xhc2ggQ0RBVEEgIiYjMjQ4OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBzdHJva2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyBzbGFzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjggSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVncmF2ZSBDREFUQSAiJiMyNDk7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWFjdXRlIENEQVRBICImIzI1MDsiIC0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZBIElTT2xhdDEgLS0+Ci08IUVOVElUWSB1Y2lyYyAgQ0RBVEEgIiYjMjUxOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgdXVtbCAgIENEQVRBICImIzI1MjsiIC0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgeWFjdXRlIENEQVRBICImIzI1MzsiIC0tIGxhdGluIHNtYWxsIGxldHRlciB5IHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZEIElTT2xhdDEgLS0+Ci08IUVOVElUWSB0aG9ybiAgQ0RBVEEgIiYjMjU0OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHRob3JuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgeXVtbCAgIENEQVRBICImIzI1NTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciB5IHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGRiBJU09sYXQxIC0tPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy9IVE1Mc3BlY2lhbC5lbnQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvSFRNTHNwZWNpYWwuZW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2U1YzZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy9IVE1Mc3BlY2lhbC5lbnQKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08IS0tIFNwZWNpYWwgY2hhcmFjdGVycyBmb3IgSFRNTCAtLT4KLQotPCEtLSBDaGFyYWN0ZXIgZW50aXR5IHNldC4gVHlwaWNhbCBpbnZvY2F0aW9uOgotICAgICA8IUVOVElUWSAlIEhUTUxzcGVjaWFsIFBVQkxJQwotICAgICAgICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwvL0VOLy9IVE1MIj4KLSAgICAgJUhUTUxzcGVjaWFsOyAtLT4KLQotPCEtLSBQb3J0aW9ucyAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2OgotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGgKLSAgICAgY29uZm9ybWluZyBTR01MIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluCi0gICAgIElTTyA4ODc5LCBwcm92aWRlZCB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzLgotLS0+Ci0KLTwhLS0gUmVsZXZhbnQgSVNPIGVudGl0eSBzZXQgaXMgZ2l2ZW4gdW5sZXNzIG5hbWVzIGFyZSBuZXdseSBpbnRyb2R1Y2VkLgotICAgICBOZXcgbmFtZXMgKGkuZS4sIG5vdCBpbiBJU08gODg3OSBsaXN0KSBkbyBub3QgY2xhc2ggd2l0aCBhbnkKLSAgICAgZXhpc3RpbmcgSVNPIDg4NzkgZW50aXR5IG5hbWVzLiBJU08gMTA2NDYgY2hhcmFjdGVyIG51bWJlcnMKLSAgICAgYXJlIGdpdmVuIGZvciBlYWNoIGNoYXJhY3RlciwgaW4gaGV4LiBDREFUQSB2YWx1ZXMgYXJlIGRlY2ltYWwKLSAgICAgY29udmVyc2lvbnMgb2YgdGhlIElTTyAxMDY0NiB2YWx1ZXMgYW5kIHJlZmVyIHRvIHRoZSBkb2N1bWVudAotICAgICBjaGFyYWN0ZXIgc2V0LiBOYW1lcyBhcmUgSVNPIDEwNjQ2IG5hbWVzLiAKLQotLS0+Ci0KLTwhLS0gQzAgQ29udHJvbHMgYW5kIEJhc2ljIExhdGluIC0tPgotPCFFTlRJVFkgcXVvdCAgICBDREFUQSAiJiMzNDsiICAgLS0gcXVvdGF0aW9uIG1hcmsgPSBBUEwgcXVvdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwMjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgYW1wICAgICBDREFUQSAiJiMzODsiICAgLS0gYW1wZXJzYW5kLCBVKzAwMjYgSVNPbnVtIC0tPgotPCFFTlRJVFkgbHQgICAgICBDREFUQSAiJiM2MDsiICAgLS0gbGVzcy10aGFuIHNpZ24sIFUrMDAzQyBJU09udW0gLS0+Ci08IUVOVElUWSBndCAgICAgIENEQVRBICImIzYyOyIgICAtLSBncmVhdGVyLXRoYW4gc2lnbiwgVSswMDNFIElTT251bSAtLT4KLQotPCEtLSBMYXRpbiBFeHRlbmRlZC1BIC0tPgotPCFFTlRJVFkgT0VsaWcgICBDREFUQSAiJiMzMzg7IiAgLS0gbGF0aW4gY2FwaXRhbCBsaWdhdHVyZSBPRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE1MiBJU09sYXQyIC0tPgotPCFFTlRJVFkgb2VsaWcgICBDREFUQSAiJiMzMzk7IiAgLS0gbGF0aW4gc21hbGwgbGlnYXR1cmUgb2UsIFUrMDE1MyBJU09sYXQyIC0tPgotPCEtLSBsaWdhdHVyZSBpcyBhIG1pc25vbWVyLCB0aGlzIGlzIGEgc2VwYXJhdGUgY2hhcmFjdGVyIGluIHNvbWUgbGFuZ3VhZ2VzIC0tPgotPCFFTlRJVFkgU2Nhcm9uICBDREFUQSAiJiMzNTI7IiAgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgUyB3aXRoIGNhcm9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTYwIElTT2xhdDIgLS0+Ci08IUVOVElUWSBzY2Fyb24gIENEQVRBICImIzM1MzsiICAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgcyB3aXRoIGNhcm9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTYxIElTT2xhdDIgLS0+Ci08IUVOVElUWSBZdW1sICAgIENEQVRBICImIzM3NjsiICAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBZIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTc4IElTT2xhdDIgLS0+Ci0KLTwhLS0gU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzIC0tPgotPCFFTlRJVFkgY2lyYyAgICBDREFUQSAiJiM3MTA7IiAgLS0gbW9kaWZpZXIgbGV0dGVyIGNpcmN1bWZsZXggYWNjZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMkM2IElTT3B1YiAtLT4KLTwhRU5USVRZIHRpbGRlICAgQ0RBVEEgIiYjNzMyOyIgIC0tIHNtYWxsIHRpbGRlLCBVKzAyREMgSVNPZGlhIC0tPgotCi08IS0tIEdlbmVyYWwgUHVuY3R1YXRpb24gLS0+Ci08IUVOVElUWSBlbnNwICAgIENEQVRBICImIzgxOTQ7IiAtLSBlbiBzcGFjZSwgVSsyMDAyIElTT3B1YiAtLT4KLTwhRU5USVRZIGVtc3AgICAgQ0RBVEEgIiYjODE5NTsiIC0tIGVtIHNwYWNlLCBVKzIwMDMgSVNPcHViIC0tPgotPCFFTlRJVFkgdGhpbnNwICBDREFUQSAiJiM4MjAxOyIgLS0gdGhpbiBzcGFjZSwgVSsyMDA5IElTT3B1YiAtLT4KLTwhRU5USVRZIHp3bmogICAgQ0RBVEEgIiYjODIwNDsiIC0tIHplcm8gd2lkdGggbm9uLWpvaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAwQyBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSB6d2ogICAgIENEQVRBICImIzgyMDU7IiAtLSB6ZXJvIHdpZHRoIGpvaW5lciwgVSsyMDBEIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIGxybSAgICAgQ0RBVEEgIiYjODIwNjsiIC0tIGxlZnQtdG8tcmlnaHQgbWFyaywgVSsyMDBFIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIHJsbSAgICAgQ0RBVEEgIiYjODIwNzsiIC0tIHJpZ2h0LXRvLWxlZnQgbWFyaywgVSsyMDBGIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIG5kYXNoICAgQ0RBVEEgIiYjODIxMTsiIC0tIGVuIGRhc2gsIFUrMjAxMyBJU09wdWIgLS0+Ci08IUVOVElUWSBtZGFzaCAgIENEQVRBICImIzgyMTI7IiAtLSBlbSBkYXNoLCBVKzIwMTQgSVNPcHViIC0tPgotPCFFTlRJVFkgbHNxdW8gICBDREFUQSAiJiM4MjE2OyIgLS0gbGVmdCBzaW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMTggSVNPbnVtIC0tPgotPCFFTlRJVFkgcnNxdW8gICBDREFUQSAiJiM4MjE3OyIgLS0gcmlnaHQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDE5IElTT251bSAtLT4KLTwhRU5USVRZIHNicXVvICAgQ0RBVEEgIiYjODIxODsiIC0tIHNpbmdsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFBIE5FVyAtLT4KLTwhRU5USVRZIGxkcXVvICAgQ0RBVEEgIiYjODIyMDsiIC0tIGxlZnQgZG91YmxlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDFDIElTT251bSAtLT4KLTwhRU5USVRZIHJkcXVvICAgQ0RBVEEgIiYjODIyMTsiIC0tIHJpZ2h0IGRvdWJsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxRCBJU09udW0gLS0+Ci08IUVOVElUWSBiZHF1byAgIENEQVRBICImIzgyMjI7IiAtLSBkb3VibGUgbG93LTkgcXVvdGF0aW9uIG1hcmssIFUrMjAxRSBORVcgLS0+Ci08IUVOVElUWSBkYWdnZXIgIENEQVRBICImIzgyMjQ7IiAtLSBkYWdnZXIsIFUrMjAyMCBJU09wdWIgLS0+Ci08IUVOVElUWSBEYWdnZXIgIENEQVRBICImIzgyMjU7IiAtLSBkb3VibGUgZGFnZ2VyLCBVKzIwMjEgSVNPcHViIC0tPgotPCFFTlRJVFkgcGVybWlsICBDREFUQSAiJiM4MjQwOyIgLS0gcGVyIG1pbGxlIHNpZ24sIFUrMjAzMCBJU090ZWNoIC0tPgotPCFFTlRJVFkgbHNhcXVvICBDREFUQSAiJiM4MjQ5OyIgLS0gc2luZ2xlIGxlZnQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMzkgSVNPIHByb3Bvc2VkIC0tPgotPCEtLSBsc2FxdW8gaXMgcHJvcG9zZWQgYnV0IG5vdCB5ZXQgSVNPIHN0YW5kYXJkaXplZCAtLT4KLTwhRU5USVRZIHJzYXF1byAgQ0RBVEEgIiYjODI1MDsiIC0tIHNpbmdsZSByaWdodC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzQSBJU08gcHJvcG9zZWQgLS0+Ci08IS0tIHJzYXF1byBpcyBwcm9wb3NlZCBidXQgbm90IHlldCBJU08gc3RhbmRhcmRpemVkIC0tPgotPCFFTlRJVFkgZXVybyAgIENEQVRBICImIzgzNjQ7IiAgLS0gZXVybyBzaWduLCBVKzIwQUMgTkVXIC0tPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy9IVE1Mc3ltYm9sLmVudCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy9IVE1Mc3ltYm9sLmVudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI0YmZlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvSFRNTHN5bWJvbC5lbnQKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotPCEtLSBNYXRoZW1hdGljYWwsIEdyZWVrIGFuZCBTeW1ib2xpYyBjaGFyYWN0ZXJzIGZvciBIVE1MIC0tPgotCi08IS0tIENoYXJhY3RlciBlbnRpdHkgc2V0LiBUeXBpY2FsIGludm9jYXRpb246Ci0gICAgIDwhRU5USVRZICUgSFRNTHN5bWJvbCBQVUJMSUMKLSAgICAgICAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzLy9FTi8vSFRNTCI+Ci0gICAgICVIVE1Mc3ltYm9sOyAtLT4KLQotPCEtLSBQb3J0aW9ucyAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2OgotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGgKLSAgICAgY29uZm9ybWluZyBTR01MIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluCi0gICAgIElTTyA4ODc5LCBwcm92aWRlZCB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzLgotLS0+Ci0KLTwhLS0gUmVsZXZhbnQgSVNPIGVudGl0eSBzZXQgaXMgZ2l2ZW4gdW5sZXNzIG5hbWVzIGFyZSBuZXdseSBpbnRyb2R1Y2VkLgotICAgICBOZXcgbmFtZXMgKGkuZS4sIG5vdCBpbiBJU08gODg3OSBsaXN0KSBkbyBub3QgY2xhc2ggd2l0aCBhbnkKLSAgICAgZXhpc3RpbmcgSVNPIDg4NzkgZW50aXR5IG5hbWVzLiBJU08gMTA2NDYgY2hhcmFjdGVyIG51bWJlcnMKLSAgICAgYXJlIGdpdmVuIGZvciBlYWNoIGNoYXJhY3RlciwgaW4gaGV4LiBDREFUQSB2YWx1ZXMgYXJlIGRlY2ltYWwKLSAgICAgY29udmVyc2lvbnMgb2YgdGhlIElTTyAxMDY0NiB2YWx1ZXMgYW5kIHJlZmVyIHRvIHRoZSBkb2N1bWVudAotICAgICBjaGFyYWN0ZXIgc2V0LiBOYW1lcyBhcmUgSVNPIDEwNjQ2IG5hbWVzLiAKLQotLS0+Ci0KLTwhLS0gTGF0aW4gRXh0ZW5kZWQtQiAtLT4KLTwhRU5USVRZIGZub2YgICAgIENEQVRBICImIzQwMjsiIC0tIGxhdGluIHNtYWxsIGYgd2l0aCBob29rID0gZnVuY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmxvcmluLCBVKzAxOTIgSVNPdGVjaCAtLT4KLQotPCEtLSBHcmVlayAtLT4KLTwhRU5USVRZIEFscGhhICAgIENEQVRBICImIzkxMzsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGFscGhhLCBVKzAzOTEgLS0+Ci08IUVOVElUWSBCZXRhICAgICBDREFUQSAiJiM5MTQ7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBiZXRhLCBVKzAzOTIgLS0+Ci08IUVOVElUWSBHYW1tYSAgICBDREFUQSAiJiM5MTU7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBnYW1tYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5MyBJU09ncmszIC0tPgotPCFFTlRJVFkgRGVsdGEgICAgQ0RBVEEgIiYjOTE2OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOTQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIEVwc2lsb24gIENEQVRBICImIzkxNzsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGVwc2lsb24sIFUrMDM5NSAtLT4KLTwhRU5USVRZIFpldGEgICAgIENEQVRBICImIzkxODsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHpldGEsIFUrMDM5NiAtLT4KLTwhRU5USVRZIEV0YSAgICAgIENEQVRBICImIzkxOTsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGV0YSwgVSswMzk3IC0tPgotPCFFTlRJVFkgVGhldGEgICAgQ0RBVEEgIiYjOTIwOyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGhldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOTggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIElvdGEgICAgIENEQVRBICImIzkyMTsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGlvdGEsIFUrMDM5OSAtLT4KLTwhRU5USVRZIEthcHBhICAgIENEQVRBICImIzkyMjsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGthcHBhLCBVKzAzOUEgLS0+Ci08IUVOVElUWSBMYW1iZGEgICBDREFUQSAiJiM5MjM7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBsYW1iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOUIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE11ICAgICAgIENEQVRBICImIzkyNDsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG11LCBVKzAzOUMgLS0+Ci08IUVOVElUWSBOdSAgICAgICBDREFUQSAiJiM5MjU7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBudSwgVSswMzlEIC0tPgotPCFFTlRJVFkgWGkgICAgICAgQ0RBVEEgIiYjOTI2OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgeGksIFUrMDM5RSBJU09ncmszIC0tPgotPCFFTlRJVFkgT21pY3JvbiAgQ0RBVEEgIiYjOTI3OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgb21pY3JvbiwgVSswMzlGIC0tPgotPCFFTlRJVFkgUGkgICAgICAgQ0RBVEEgIiYjOTI4OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGksIFUrMDNBMCBJU09ncmszIC0tPgotPCFFTlRJVFkgUmhvICAgICAgQ0RBVEEgIiYjOTI5OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcmhvLCBVKzAzQTEgLS0+Ci08IS0tIHRoZXJlIGlzIG5vIFNpZ21hZiwgYW5kIG5vIFUrMDNBMiBjaGFyYWN0ZXIgZWl0aGVyIC0tPgotPCFFTlRJVFkgU2lnbWEgICAgQ0RBVEEgIiYjOTMxOyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgc2lnbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFRhdSAgICAgIENEQVRBICImIzkzMjsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHRhdSwgVSswM0E0IC0tPgotPCFFTlRJVFkgVXBzaWxvbiAgQ0RBVEEgIiYjOTMzOyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBNSBJU09ncmszIC0tPgotPCFFTlRJVFkgUGhpICAgICAgQ0RBVEEgIiYjOTM0OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGhpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E2IElTT2dyazMgLS0+Ci08IUVOVElUWSBDaGkgICAgICBDREFUQSAiJiM5MzU7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBjaGksIFUrMDNBNyAtLT4KLTwhRU5USVRZIFBzaSAgICAgIENEQVRBICImIzkzNjsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBzaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBOCBJU09ncmszIC0tPgotPCFFTlRJVFkgT21lZ2EgICAgQ0RBVEEgIiYjOTM3OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgb21lZ2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTkgSVNPZ3JrMyAtLT4KLQotPCFFTlRJVFkgYWxwaGEgICAgQ0RBVEEgIiYjOTQ1OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGFscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0IxIElTT2dyazMgLS0+Ci08IUVOVElUWSBiZXRhICAgICBDREFUQSAiJiM5NDY7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgYmV0YSwgVSswM0IyIElTT2dyazMgLS0+Ci08IUVOVElUWSBnYW1tYSAgICBDREFUQSAiJiM5NDc7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgZ2FtbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGRlbHRhICAgIENEQVRBICImIzk0ODsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBkZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCNCBJU09ncmszIC0tPgotPCFFTlRJVFkgZXBzaWxvbiAgQ0RBVEEgIiYjOTQ5OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGVwc2lsb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHpldGEgICAgIENEQVRBICImIzk1MDsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciB6ZXRhLCBVKzAzQjYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGV0YSAgICAgIENEQVRBICImIzk1MTsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBldGEsIFUrMDNCNyBJU09ncmszIC0tPgotPCFFTlRJVFkgdGhldGEgICAgQ0RBVEEgIiYjOTUyOyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRoZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0I4IElTT2dyazMgLS0+Ci08IUVOVElUWSBpb3RhICAgICBDREFUQSAiJiM5NTM7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgaW90YSwgVSswM0I5IElTT2dyazMgLS0+Ci08IUVOVElUWSBrYXBwYSAgICBDREFUQSAiJiM5NTQ7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIga2FwcGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQkEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGxhbWJkYSAgIENEQVRBICImIzk1NTsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBsYW1iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQkIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG11ICAgICAgIENEQVRBICImIzk1NjsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBtdSwgVSswM0JDIElTT2dyazMgLS0+Ci08IUVOVElUWSBudSAgICAgICBDREFUQSAiJiM5NTc7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgbnUsIFUrMDNCRCBJU09ncmszIC0tPgotPCFFTlRJVFkgeGkgICAgICAgQ0RBVEEgIiYjOTU4OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHhpLCBVKzAzQkUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG9taWNyb24gIENEQVRBICImIzk1OTsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBvbWljcm9uLCBVKzAzQkYgTkVXIC0tPgotPCFFTlRJVFkgcGkgICAgICAgQ0RBVEEgIiYjOTYwOyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBpLCBVKzAzQzAgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHJobyAgICAgIENEQVRBICImIzk2MTsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciByaG8sIFUrMDNDMSBJU09ncmszIC0tPgotPCFFTlRJVFkgc2lnbWFmICAgQ0RBVEEgIiYjOTYyOyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGZpbmFsIHNpZ21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0MyIElTT2dyazMgLS0+Ci08IUVOVElUWSBzaWdtYSAgICBDREFUQSAiJiM5NjM7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgc2lnbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHRhdSAgICAgIENEQVRBICImIzk2NDsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciB0YXUsIFUrMDNDNCBJU09ncmszIC0tPgotPCFFTlRJVFkgdXBzaWxvbiAgQ0RBVEEgIiYjOTY1OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHVwc2lsb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHBoaSAgICAgIENEQVRBICImIzk2NjsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBwaGksIFUrMDNDNiBJU09ncmszIC0tPgotPCFFTlRJVFkgY2hpICAgICAgQ0RBVEEgIiYjOTY3OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGNoaSwgVSswM0M3IElTT2dyazMgLS0+Ci08IUVOVElUWSBwc2kgICAgICBDREFUQSAiJiM5Njg7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgcHNpLCBVKzAzQzggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG9tZWdhICAgIENEQVRBICImIzk2OTsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBvbWVnYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDOSBJU09ncmszIC0tPgotPCFFTlRJVFkgdGhldGFzeW0gQ0RBVEEgIiYjOTc3OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRoZXRhIHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNEMSBORVcgLS0+Ci08IUVOVElUWSB1cHNpaCAgICBDREFUQSAiJiM5Nzg7IiAtLSBncmVlayB1cHNpbG9uIHdpdGggaG9vayBzeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzRDIgTkVXIC0tPgotPCFFTlRJVFkgcGl2ICAgICAgQ0RBVEEgIiYjOTgyOyIgLS0gZ3JlZWsgcGkgc3ltYm9sLCBVKzAzRDYgSVNPZ3JrMyAtLT4KLQotPCEtLSBHZW5lcmFsIFB1bmN0dWF0aW9uIC0tPgotPCFFTlRJVFkgYnVsbCAgICAgQ0RBVEEgIiYjODIyNjsiIC0tIGJ1bGxldCA9IGJsYWNrIHNtYWxsIGNpcmNsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMjIgSVNPcHViICAtLT4KLTwhLS0gYnVsbGV0IGlzIE5PVCB0aGUgc2FtZSBhcyBidWxsZXQgb3BlcmF0b3IsIFUrMjIxOSAtLT4KLTwhRU5USVRZIGhlbGxpcCAgIENEQVRBICImIzgyMzA7IiAtLSBob3Jpem9udGFsIGVsbGlwc2lzID0gdGhyZWUgZG90IGxlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMjYgSVNPcHViICAtLT4KLTwhRU5USVRZIHByaW1lICAgIENEQVRBICImIzgyNDI7IiAtLSBwcmltZSA9IG1pbnV0ZXMgPSBmZWV0LCBVKzIwMzIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIFByaW1lICAgIENEQVRBICImIzgyNDM7IiAtLSBkb3VibGUgcHJpbWUgPSBzZWNvbmRzID0gaW5jaGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzMyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb2xpbmUgICAgQ0RBVEEgIiYjODI1NDsiIC0tIG92ZXJsaW5lID0gc3BhY2luZyBvdmVyc2NvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDNFIE5FVyAtLT4KLTwhRU5USVRZIGZyYXNsICAgIENEQVRBICImIzgyNjA7IiAtLSBmcmFjdGlvbiBzbGFzaCwgVSsyMDQ0IE5FVyAtLT4KLQotPCEtLSBMZXR0ZXJsaWtlIFN5bWJvbHMgLS0+Ci08IUVOVElUWSB3ZWllcnAgICBDREFUQSAiJiM4NDcyOyIgLS0gc2NyaXB0IGNhcGl0YWwgUCA9IHBvd2VyIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gV2VpZXJzdHJhc3MgcCwgVSsyMTE4IElTT2Ftc28gLS0+Ci08IUVOVElUWSBpbWFnZSAgICBDREFUQSAiJiM4NDY1OyIgLS0gYmxhY2tsZXR0ZXIgY2FwaXRhbCBJID0gaW1hZ2luYXJ5IHBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMTExIElTT2Ftc28gLS0+Ci08IUVOVElUWSByZWFsICAgICBDREFUQSAiJiM4NDc2OyIgLS0gYmxhY2tsZXR0ZXIgY2FwaXRhbCBSID0gcmVhbCBwYXJ0IHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxMUMgSVNPYW1zbyAtLT4KLTwhRU5USVRZIHRyYWRlICAgIENEQVRBICImIzg0ODI7IiAtLSB0cmFkZSBtYXJrIHNpZ24sIFUrMjEyMiBJU09udW0gLS0+Ci08IUVOVElUWSBhbGVmc3ltICBDREFUQSAiJiM4NTAxOyIgLS0gYWxlZiBzeW1ib2wgPSBmaXJzdCB0cmFuc2Zpbml0ZSBjYXJkaW5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxMzUgTkVXIC0tPgotPCEtLSBhbGVmIHN5bWJvbCBpcyBOT1QgdGhlIHNhbWUgYXMgaGVicmV3IGxldHRlciBhbGVmLAotICAgICBVKzA1RDAgYWx0aG91Z2ggdGhlIHNhbWUgZ2x5cGggY291bGQgYmUgdXNlZCB0byBkZXBpY3QgYm90aCBjaGFyYWN0ZXJzIC0tPgotCi08IS0tIEFycm93cyAtLT4KLTwhRU5USVRZIGxhcnIgICAgIENEQVRBICImIzg1OTI7IiAtLSBsZWZ0d2FyZHMgYXJyb3csIFUrMjE5MCBJU09udW0gLS0+Ci08IUVOVElUWSB1YXJyICAgICBDREFUQSAiJiM4NTkzOyIgLS0gdXB3YXJkcyBhcnJvdywgVSsyMTkxIElTT251bS0tPgotPCFFTlRJVFkgcmFyciAgICAgQ0RBVEEgIiYjODU5NDsiIC0tIHJpZ2h0d2FyZHMgYXJyb3csIFUrMjE5MiBJU09udW0gLS0+Ci08IUVOVElUWSBkYXJyICAgICBDREFUQSAiJiM4NTk1OyIgLS0gZG93bndhcmRzIGFycm93LCBVKzIxOTMgSVNPbnVtIC0tPgotPCFFTlRJVFkgaGFyciAgICAgQ0RBVEEgIiYjODU5NjsiIC0tIGxlZnQgcmlnaHQgYXJyb3csIFUrMjE5NCBJU09hbXNhIC0tPgotPCFFTlRJVFkgY3JhcnIgICAgQ0RBVEEgIiYjODYyOTsiIC0tIGRvd253YXJkcyBhcnJvdyB3aXRoIGNvcm5lciBsZWZ0d2FyZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGNhcnJpYWdlIHJldHVybiwgVSsyMUI1IE5FVyAtLT4KLTwhRU5USVRZIGxBcnIgICAgIENEQVRBICImIzg2NTY7IiAtLSBsZWZ0d2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDAgSVNPdGVjaCAtLT4KLTwhLS0gSVNPIDEwNjQ2IGRvZXMgbm90IHNheSB0aGF0IGxBcnIgaXMgdGhlIHNhbWUgYXMgdGhlICdpcyBpbXBsaWVkIGJ5JyBhcnJvdwotICAgIGJ1dCBhbHNvIGRvZXMgbm90IGhhdmUgYW55IG90aGVyIGNoYXJhY3RlciBmb3IgdGhhdCBmdW5jdGlvbi4gU28gPyBsQXJyIGNhbgotICAgIGJlIHVzZWQgZm9yICdpcyBpbXBsaWVkIGJ5JyBhcyBJU090ZWNoIHN1Z2dlc3RzIC0tPgotPCFFTlRJVFkgdUFyciAgICAgQ0RBVEEgIiYjODY1NzsiIC0tIHVwd2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDEgSVNPYW1zYSAtLT4KLTwhRU5USVRZIHJBcnIgICAgIENEQVRBICImIzg2NTg7IiAtLSByaWdodHdhcmRzIGRvdWJsZSBhcnJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxRDIgSVNPdGVjaCAtLT4KLTwhLS0gSVNPIDEwNjQ2IGRvZXMgbm90IHNheSB0aGlzIGlzIHRoZSAnaW1wbGllcycgY2hhcmFjdGVyIGJ1dCBkb2VzIG5vdCBoYXZlIAotICAgICBhbm90aGVyIGNoYXJhY3RlciB3aXRoIHRoaXMgZnVuY3Rpb24gc28gPwotICAgICByQXJyIGNhbiBiZSB1c2VkIGZvciAnaW1wbGllcycgYXMgSVNPdGVjaCBzdWdnZXN0cyAtLT4KLTwhRU5USVRZIGRBcnIgICAgIENEQVRBICImIzg2NTk7IiAtLSBkb3dud2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDMgSVNPYW1zYSAtLT4KLTwhRU5USVRZIGhBcnIgICAgIENEQVRBICImIzg2NjA7IiAtLSBsZWZ0IHJpZ2h0IGRvdWJsZSBhcnJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxRDQgSVNPYW1zYSAtLT4KLQotPCEtLSBNYXRoZW1hdGljYWwgT3BlcmF0b3JzIC0tPgotPCFFTlRJVFkgZm9yYWxsICAgQ0RBVEEgIiYjODcwNDsiIC0tIGZvciBhbGwsIFUrMjIwMCBJU090ZWNoIC0tPgotPCFFTlRJVFkgcGFydCAgICAgQ0RBVEEgIiYjODcwNjsiIC0tIHBhcnRpYWwgZGlmZmVyZW50aWFsLCBVKzIyMDIgSVNPdGVjaCAgLS0+Ci08IUVOVElUWSBleGlzdCAgICBDREFUQSAiJiM4NzA3OyIgLS0gdGhlcmUgZXhpc3RzLCBVKzIyMDMgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGVtcHR5ICAgIENEQVRBICImIzg3MDk7IiAtLSBlbXB0eSBzZXQgPSBudWxsIHNldCA9IGRpYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIwNSBJU09hbXNvIC0tPgotPCFFTlRJVFkgbmFibGEgICAgQ0RBVEEgIiYjODcxMTsiIC0tIG5hYmxhID0gYmFja3dhcmQgZGlmZmVyZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMDcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGlzaW4gICAgIENEQVRBICImIzg3MTI7IiAtLSBlbGVtZW50IG9mLCBVKzIyMDggSVNPdGVjaCAtLT4KLTwhRU5USVRZIG5vdGluICAgIENEQVRBICImIzg3MTM7IiAtLSBub3QgYW4gZWxlbWVudCBvZiwgVSsyMjA5IElTT3RlY2ggLS0+Ci08IUVOVElUWSBuaSAgICAgICBDREFUQSAiJiM4NzE1OyIgLS0gY29udGFpbnMgYXMgbWVtYmVyLCBVKzIyMEIgSVNPdGVjaCAtLT4KLTwhLS0gc2hvdWxkIHRoZXJlIGJlIGEgbW9yZSBtZW1vcmFibGUgbmFtZSB0aGFuICduaSc/IC0tPgotPCFFTlRJVFkgcHJvZCAgICAgQ0RBVEEgIiYjODcxOTsiIC0tIG4tYXJ5IHByb2R1Y3QgPSBwcm9kdWN0IHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjBGIElTT2Ftc2IgLS0+Ci08IS0tIHByb2QgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAzQTAgJ2dyZWVrIGNhcGl0YWwgbGV0dGVyIHBpJyB0aG91Z2gKLSAgICAgdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCBmb3IgYm90aCAtLT4KLTwhRU5USVRZIHN1bSAgICAgIENEQVRBICImIzg3MjE7IiAtLSBuLWFyeSBzdW1hdGlvbiwgVSsyMjExIElTT2Ftc2IgLS0+Ci08IS0tIHN1bSBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDNBMyAnZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgc2lnbWEnCi0gICAgIHRob3VnaCB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIGZvciBib3RoIC0tPgotPCFFTlRJVFkgbWludXMgICAgQ0RBVEEgIiYjODcyMjsiIC0tIG1pbnVzIHNpZ24sIFUrMjIxMiBJU090ZWNoIC0tPgotPCFFTlRJVFkgbG93YXN0ICAgQ0RBVEEgIiYjODcyNzsiIC0tIGFzdGVyaXNrIG9wZXJhdG9yLCBVKzIyMTcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHJhZGljICAgIENEQVRBICImIzg3MzA7IiAtLSBzcXVhcmUgcm9vdCA9IHJhZGljYWwgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMUEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHByb3AgICAgIENEQVRBICImIzg3MzM7IiAtLSBwcm9wb3J0aW9uYWwgdG8sIFUrMjIxRCBJU090ZWNoIC0tPgotPCFFTlRJVFkgaW5maW4gICAgQ0RBVEEgIiYjODczNDsiIC0tIGluZmluaXR5LCBVKzIyMUUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGFuZyAgICAgIENEQVRBICImIzg3MzY7IiAtLSBhbmdsZSwgVSsyMjIwIElTT2Ftc28gLS0+Ci08IUVOVElUWSBhbmQgICAgICBDREFUQSAiJiM4NzQzOyIgLS0gbG9naWNhbCBhbmQgPSB3ZWRnZSwgVSsyMjI3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBvciAgICAgICBDREFUQSAiJiM4NzQ0OyIgLS0gbG9naWNhbCBvciA9IHZlZSwgVSsyMjI4IElTT3RlY2ggLS0+Ci08IUVOVElUWSBjYXAgICAgICBDREFUQSAiJiM4NzQ1OyIgLS0gaW50ZXJzZWN0aW9uID0gY2FwLCBVKzIyMjkgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGN1cCAgICAgIENEQVRBICImIzg3NDY7IiAtLSB1bmlvbiA9IGN1cCwgVSsyMjJBIElTT3RlY2ggLS0+Ci08IUVOVElUWSBpbnQgICAgICBDREFUQSAiJiM4NzQ3OyIgLS0gaW50ZWdyYWwsIFUrMjIyQiBJU090ZWNoIC0tPgotPCFFTlRJVFkgdGhlcmU0ICAgQ0RBVEEgIiYjODc1NjsiIC0tIHRoZXJlZm9yZSwgVSsyMjM0IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzaW0gICAgICBDREFUQSAiJiM4NzY0OyIgLS0gdGlsZGUgb3BlcmF0b3IgPSB2YXJpZXMgd2l0aCA9IHNpbWlsYXIgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjNDIElTT3RlY2ggLS0+Ci08IS0tIHRpbGRlIG9wZXJhdG9yIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgdGhlIHRpbGRlLCBVKzAwN0UsCi0gICAgIGFsdGhvdWdoIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgdG8gcmVwcmVzZW50IGJvdGggIC0tPgotPCFFTlRJVFkgY29uZyAgICAgQ0RBVEEgIiYjODc3MzsiIC0tIGFwcHJveGltYXRlbHkgZXF1YWwgdG8sIFUrMjI0NSBJU090ZWNoIC0tPgotPCFFTlRJVFkgYXN5bXAgICAgQ0RBVEEgIiYjODc3NjsiIC0tIGFsbW9zdCBlcXVhbCB0byA9IGFzeW1wdG90aWMgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjQ4IElTT2Ftc3IgLS0+Ci08IUVOVElUWSBuZSAgICAgICBDREFUQSAiJiM4ODAwOyIgLS0gbm90IGVxdWFsIHRvLCBVKzIyNjAgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGVxdWl2ICAgIENEQVRBICImIzg4MDE7IiAtLSBpZGVudGljYWwgdG8sIFUrMjI2MSBJU090ZWNoIC0tPgotPCFFTlRJVFkgbGUgICAgICAgQ0RBVEEgIiYjODgwNDsiIC0tIGxlc3MtdGhhbiBvciBlcXVhbCB0bywgVSsyMjY0IElTT3RlY2ggLS0+Ci08IUVOVElUWSBnZSAgICAgICBDREFUQSAiJiM4ODA1OyIgLS0gZ3JlYXRlci10aGFuIG9yIGVxdWFsIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI2NSBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3ViICAgICAgQ0RBVEEgIiYjODgzNDsiIC0tIHN1YnNldCBvZiwgVSsyMjgyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdXAgICAgICBDREFUQSAiJiM4ODM1OyIgLS0gc3VwZXJzZXQgb2YsIFUrMjI4MyBJU090ZWNoIC0tPgotPCEtLSBub3RlIHRoYXQgbnN1cCwgJ25vdCBhIHN1cGVyc2V0IG9mLCBVKzIyODMnIGlzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBTeW1ib2wgCi0gICAgIGZvbnQgZW5jb2RpbmcgYW5kIGlzIG5vdCBpbmNsdWRlZC4gU2hvdWxkIGl0IGJlLCBmb3Igc3ltbWV0cnk/Ci0gICAgIEl0IGlzIGluIElTT2Ftc24gIC0tPiAKLTwhRU5USVRZIG5zdWIgICAgIENEQVRBICImIzg4MzY7IiAtLSBub3QgYSBzdWJzZXQgb2YsIFUrMjI4NCBJU09hbXNuIC0tPgotPCFFTlRJVFkgc3ViZSAgICAgQ0RBVEEgIiYjODgzODsiIC0tIHN1YnNldCBvZiBvciBlcXVhbCB0bywgVSsyMjg2IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdXBlICAgICBDREFUQSAiJiM4ODM5OyIgLS0gc3VwZXJzZXQgb2Ygb3IgZXF1YWwgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjg3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBvcGx1cyAgICBDREFUQSAiJiM4ODUzOyIgLS0gY2lyY2xlZCBwbHVzID0gZGlyZWN0IHN1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyOTUgSVNPYW1zYiAtLT4KLTwhRU5USVRZIG90aW1lcyAgIENEQVRBICImIzg4NTU7IiAtLSBjaXJjbGVkIHRpbWVzID0gdmVjdG9yIHByb2R1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjk3IElTT2Ftc2IgLS0+Ci08IUVOVElUWSBwZXJwICAgICBDREFUQSAiJiM4ODY5OyIgLS0gdXAgdGFjayA9IG9ydGhvZ29uYWwgdG8gPSBwZXJwZW5kaWN1bGFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjJBNSBJU090ZWNoIC0tPgotPCFFTlRJVFkgc2RvdCAgICAgQ0RBVEEgIiYjODkwMTsiIC0tIGRvdCBvcGVyYXRvciwgVSsyMkM1IElTT2Ftc2IgLS0+Ci08IS0tIGRvdCBvcGVyYXRvciBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDBCNyBtaWRkbGUgZG90IC0tPgotCi08IS0tIE1pc2NlbGxhbmVvdXMgVGVjaG5pY2FsIC0tPgotPCFFTlRJVFkgbGNlaWwgICAgQ0RBVEEgIiYjODk2ODsiIC0tIGxlZnQgY2VpbGluZyA9IGFwbCB1cHN0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMwOCBJU09hbXNjICAtLT4KLTwhRU5USVRZIHJjZWlsICAgIENEQVRBICImIzg5Njk7IiAtLSByaWdodCBjZWlsaW5nLCBVKzIzMDkgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSBsZmxvb3IgICBDREFUQSAiJiM4OTcwOyIgLS0gbGVmdCBmbG9vciA9IGFwbCBkb3duc3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzBBIElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgcmZsb29yICAgQ0RBVEEgIiYjODk3MTsiIC0tIHJpZ2h0IGZsb29yLCBVKzIzMEIgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSBsYW5nICAgICBDREFUQSAiJiM5MDAxOyIgLS0gbGVmdC1wb2ludGluZyBhbmdsZSBicmFja2V0ID0gYnJhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMyOSBJU090ZWNoIC0tPgotPCEtLSBsYW5nIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMDNDICdsZXNzIHRoYW4nIAotICAgICBvciBVKzIwMzkgJ3NpbmdsZSBsZWZ0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrJyAtLT4KLTwhRU5USVRZIHJhbmcgICAgIENEQVRBICImIzkwMDI7IiAtLSByaWdodC1wb2ludGluZyBhbmdsZSBicmFja2V0ID0ga2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMyQSBJU090ZWNoIC0tPgotPCEtLSByYW5nIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMDNFICdncmVhdGVyIHRoYW4nIAotICAgICBvciBVKzIwM0EgJ3NpbmdsZSByaWdodC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaycgLS0+Ci0KLTwhLS0gR2VvbWV0cmljIFNoYXBlcyAtLT4KLTwhRU5USVRZIGxveiAgICAgIENEQVRBICImIzk2NzQ7IiAtLSBsb3plbmdlLCBVKzI1Q0EgSVNPcHViIC0tPgotCi08IS0tIE1pc2NlbGxhbmVvdXMgU3ltYm9scyAtLT4KLTwhRU5USVRZIHNwYWRlcyAgIENEQVRBICImIzk4MjQ7IiAtLSBibGFjayBzcGFkZSBzdWl0LCBVKzI2NjAgSVNPcHViIC0tPgotPCEtLSBibGFjayBoZXJlIHNlZW1zIHRvIG1lYW4gZmlsbGVkIGFzIG9wcG9zZWQgdG8gaG9sbG93IC0tPgotPCFFTlRJVFkgY2x1YnMgICAgQ0RBVEEgIiYjOTgyNzsiIC0tIGJsYWNrIGNsdWIgc3VpdCA9IHNoYW1yb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjY2MyBJU09wdWIgLS0+Ci08IUVOVElUWSBoZWFydHMgICBDREFUQSAiJiM5ODI5OyIgLS0gYmxhY2sgaGVhcnQgc3VpdCA9IHZhbGVudGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzI2NjUgSVNPcHViIC0tPgotPCFFTlRJVFkgZGlhbXMgICAgQ0RBVEEgIiYjOTgzMDsiIC0tIGJsYWNrIGRpYW1vbmQgc3VpdCwgVSsyNjY2IElTT3B1YiAtLT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvZnJhbWVzZXQuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL2ZyYW1lc2V0LmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ0OWRkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvZnJhbWVzZXQuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCEtLQotICAgIFRoaXMgaXMgdGhlIEhUTUwgNC4wMSBGcmFtZXNldCBEVEQsIHdoaWNoIHNob3VsZCBiZQotICAgIHVzZWQgZm9yIGRvY3VtZW50cyB3aXRoIGZyYW1lcy4gVGhpcyBEVEQgaXMgaWRlbnRpY2FsCi0gICAgdG8gdGhlIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwgRFREIGV4Y2VwdCBmb3IgdGhlCi0gICAgY29udGVudCBtb2RlbCBvZiB0aGUgIkhUTUwiIGVsZW1lbnQ6IGluIGZyYW1lc2V0IAotICAgIGRvY3VtZW50cywgdGhlICJGUkFNRVNFVCIgZWxlbWVudCByZXBsYWNlcyB0aGUgIkJPRFkiIAotICAgIGVsZW1lbnQuCi0KLSAgICAgICAgICBEcmFmdDogJERhdGU6IDIwMDgvMDcvMjIgMDc6Mzc6MDEgJAotCi0gICAgICAgICAgQXV0aG9yczoKLSAgICAgICAgICAgICAgRGF2ZSBSYWdnZXR0IDxkc3JAdzMub3JnPgotICAgICAgICAgICAgICBBcm5hdWQgTGUgSG9ycyA8bGVob3JzQHczLm9yZz4KLSAgICAgICAgICAgICAgSWFuIEphY29icyA8aWpAdzMub3JnPgotCi0gICAgRnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBIVE1MIDQuMDEgaXMgYXZhaWxhYmxlIGF0OgotCi0gICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC4KLS0tPgotPCFFTlRJVFkgJSBIVE1MLlZlcnNpb24gIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iCi0gIC0tIFR5cGljYWwgdXNhZ2U6Ci0KLSAgICA8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvZnJhbWVzZXQuZHRkIj4KLSAgICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAuLi4KLSAgICA8L2hlYWQ+Ci0gICAgPGZyYW1lc2V0PgotICAgIC4uLgotICAgIDwvZnJhbWVzZXQ+Ci0gICAgPC9odG1sPgotLS0+Ci0KLTwhRU5USVRZICUgSFRNTC5GcmFtZXNldCAiSU5DTFVERSI+Ci08IUVOVElUWSAlIEhUTUw0LmR0ZCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLSVIVE1MNC5kdGQ7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL2xvb3NlLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy9sb29zZS5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWZiNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL2xvb3NlLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDEwOTMgKzAsMCBAQAotPCEtLQotICAgIFRoaXMgaXMgdGhlIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwgRFRELCB3aGljaCBpbmNsdWRlcwotICAgIHByZXNlbnRhdGlvbiBhdHRyaWJ1dGVzIGFuZCBlbGVtZW50cyB0aGF0IFczQyBleHBlY3RzIHRvIHBoYXNlIG91dAotICAgIGFzIHN1cHBvcnQgZm9yIHN0eWxlIHNoZWV0cyBtYXR1cmVzLiBBdXRob3JzIHNob3VsZCB1c2UgdGhlIFN0cmljdAotICAgIERURCB3aGVuIHBvc3NpYmxlLCBidXQgbWF5IHVzZSB0aGUgVHJhbnNpdGlvbmFsIERURCB3aGVuIHN1cHBvcnQKLSAgICBmb3IgcHJlc2VudGF0aW9uIGF0dHJpYnV0ZSBhbmQgZWxlbWVudHMgaXMgcmVxdWlyZWQuCi0KLSAgICBIVE1MIDQgaW5jbHVkZXMgbWVjaGFuaXNtcyBmb3Igc3R5bGUgc2hlZXRzLCBzY3JpcHRpbmcsCi0gICAgZW1iZWRkaW5nIG9iamVjdHMsIGltcHJvdmVkIHN1cHBvcnQgZm9yIHJpZ2h0IHRvIGxlZnQgYW5kIG1peGVkCi0gICAgZGlyZWN0aW9uIHRleHQsIGFuZCBlbmhhbmNlbWVudHMgdG8gZm9ybXMgZm9yIGltcHJvdmVkCi0gICAgYWNjZXNzaWJpbGl0eSBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzLgotCi0gICAgICAgICAgRHJhZnQ6ICREYXRlOiAyMDA4LzA3LzIyIDA3OjM3OjAxICQKLQotICAgICAgICAgIEF1dGhvcnM6Ci0gICAgICAgICAgICAgIERhdmUgUmFnZ2V0dCA8ZHNyQHczLm9yZz4KLSAgICAgICAgICAgICAgQXJuYXVkIExlIEhvcnMgPGxlaG9yc0B3My5vcmc+Ci0gICAgICAgICAgICAgIElhbiBKYWNvYnMgPGlqQHczLm9yZz4KLQotICAgIEZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgSFRNTCA0LjAxIGlzIGF2YWlsYWJsZSBhdDoKLQotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0Ci0KLQotICAgIFRoZSBIVE1MIDQuMDEgc3BlY2lmaWNhdGlvbiBpbmNsdWRlcyBhZGRpdGlvbmFsCi0gICAgc3ludGFjdGljIGNvbnN0cmFpbnRzIHRoYXQgY2Fubm90IGJlIGV4cHJlc3NlZCB3aXRoaW4KLSAgICB0aGUgRFREcy4KLQotLS0+Ci08IUVOVElUWSAlIEhUTUwuVmVyc2lvbiAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0gIC0tIFR5cGljYWwgdXNhZ2U6Ci0KLSAgICA8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci0gICAgPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgLi4uCi0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgIC4uLgotICAgIDwvYm9keT4KLSAgICA8L2h0bWw+Ci0KLSAgICBUaGUgVVJJIHVzZWQgYXMgYSBzeXN0ZW0gaWRlbnRpZmllciB3aXRoIHRoZSBwdWJsaWMgaWRlbnRpZmllciBhbGxvd3MKLSAgICB0aGUgdXNlciBhZ2VudCB0byBkb3dubG9hZCB0aGUgRFREIGFuZCBlbnRpdHkgc2V0cyBhcyBuZWVkZWQuCi0KLSAgICBUaGUgRlBJIGZvciB0aGUgU3RyaWN0IEhUTUwgNC4wMSBEVEQgaXM6Ci0KLSAgICAgICAgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iCi0KLSAgICBUaGlzIHZlcnNpb24gb2YgdGhlIHN0cmljdCBEVEQgaXM6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9zdHJpY3QuZHRkCi0KLSAgICBBdXRob3JzIHNob3VsZCB1c2UgdGhlIFN0cmljdCBEVEQgdW5sZXNzIHRoZXkgbmVlZCB0aGUKLSAgICBwcmVzZW50YXRpb24gY29udHJvbCBmb3IgdXNlciBhZ2VudHMgdGhhdCBkb24ndCAoYWRlcXVhdGVseSkKLSAgICBzdXBwb3J0IHN0eWxlIHNoZWV0cy4KLQotICAgIElmIHlvdSBhcmUgd3JpdGluZyBhIGRvY3VtZW50IHRoYXQgaW5jbHVkZXMgZnJhbWVzLCB1c2UgCi0gICAgdGhlIGZvbGxvd2luZyBGUEk6Ci0KLSAgICAgICAgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iCi0KLSAgICBUaGlzIHZlcnNpb24gb2YgdGhlIGZyYW1lc2V0IERURCBpczoKLQotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2ZyYW1lc2V0LmR0ZAotCi0gICAgVXNlIHRoZSBmb2xsb3dpbmcgKHJlbGF0aXZlKSBVUklzIHRvIHJlZmVyIHRvIAotICAgIHRoZSBEVERzIGFuZCBlbnRpdHkgZGVmaW5pdGlvbnMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uOgotCi0gICAgInN0cmljdC5kdGQiCi0gICAgImxvb3NlLmR0ZCIKLSAgICAiZnJhbWVzZXQuZHRkIgotICAgICJIVE1MbGF0MS5lbnQiCi0gICAgIkhUTUxzeW1ib2wuZW50IgotICAgICJIVE1Mc3BlY2lhbC5lbnQiCi0KLS0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEltcG9ydGVkIE5hbWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBGZWF0dXJlIFN3aXRjaCBmb3IgZnJhbWVzZXQgZG9jdW1lbnRzIC0tPgotPCFFTlRJVFkgJSBIVE1MLkZyYW1lc2V0ICJJR05PUkUiPgotCi08IUVOVElUWSAlIENvbnRlbnRUeXBlICJDREFUQSIKLSAgICAtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGVzICJDREFUQSIKLSAgICAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIENoYXJzZXQgIkNEQVRBIgotICAgIC0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldHMgIkNEQVRBIgotICAgIC0tIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIExhbmd1YWdlQ29kZSAiTkFNRSIKLSAgICAtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMTc2Nl0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDaGFyYWN0ZXIgIkNEQVRBIgotICAgIC0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTGlua1R5cGVzICJDREFUQSIKLSAgICAtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsaW5rIHR5cGVzCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTWVkaWFEZXNjICJDREFUQSIKLSAgICAtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBVUkkgIkNEQVRBIgotICAgIC0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLAotICAgICAgIHNlZSBbVVJJXQotICAgIC0tPgotCi08IUVOVElUWSAlIERhdGV0aW1lICJDREFUQSIgLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotCi0KLTwhRU5USVRZICUgU2NyaXB0ICJDREFUQSIgLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci0KLTwhRU5USVRZICUgU3R5bGVTaGVldCAiQ0RBVEEiIC0tIHN0eWxlIHNoZWV0IGRhdGEgLS0+Ci0KLTwhRU5USVRZICUgRnJhbWVUYXJnZXQgIkNEQVRBIiAtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLT4KLQotCi08IUVOVElUWSAlIFRleHQgIkNEQVRBIj4KLQotCi08IS0tIFBhcmFtZXRlciBFbnRpdGllcyAtLT4KLQotPCFFTlRJVFkgJSBoZWFkLm1pc2MgIlNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUIiAtLSByZXBlYXRhYmxlIGhlYWQgZWxlbWVudHMgLS0+Ci0KLTwhRU5USVRZICUgaGVhZGluZyAiSDF8SDJ8SDN8SDR8SDV8SDYiPgotCi08IUVOVElUWSAlIGxpc3QgIlVMIHwgT0wgfCAgRElSIHwgTUVOVSI+Ci0KLTwhRU5USVRZICUgcHJlZm9ybWF0dGVkICJQUkUiPgotCi08IUVOVElUWSAlIENvbG9yICJDREFUQSIgLS0gYSBjb2xvciB1c2luZyBzUkdCOiAjUlJHR0JCIGFzIEhleCB2YWx1ZXMgLS0+Ci0KLTwhLS0gVGhlcmUgYXJlIGFsc28gMTYgd2lkZWx5IGtub3duIGNvbG9yIG5hbWVzIHdpdGggdGhlaXIgc1JHQiB2YWx1ZXM6Ci0KLSAgICBCbGFjayAgPSAjMDAwMDAwICAgIEdyZWVuICA9ICMwMDgwMDAKLSAgICBTaWx2ZXIgPSAjQzBDMEMwICAgIExpbWUgICA9ICMwMEZGMDAKLSAgICBHcmF5ICAgPSAjODA4MDgwICAgIE9saXZlICA9ICM4MDgwMDAKLSAgICBXaGl0ZSAgPSAjRkZGRkZGICAgIFllbGxvdyA9ICNGRkZGMDAKLSAgICBNYXJvb24gPSAjODAwMDAwICAgIE5hdnkgICA9ICMwMDAwODAKLSAgICBSZWQgICAgPSAjRkYwMDAwICAgIEJsdWUgICA9ICMwMDAwRkYKLSAgICBQdXJwbGUgPSAjODAwMDgwICAgIFRlYWwgICA9ICMwMDgwODAKLSAgICBGdWNoc2lhPSAjRkYwMEZGICAgIEFxdWEgICA9ICMwMEZGRkYKLSAtLT4KLQotPCFFTlRJVFkgJSBib2R5Y29sb3JzICIKLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIGRvY3VtZW50IGJhY2tncm91bmQgY29sb3IgLS0KLSAgdGV4dCAgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIGRvY3VtZW50IHRleHQgY29sb3IgLS0KLSAgbGluayAgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIGNvbG9yIG9mIGxpbmtzIC0tCi0gIHZsaW5rICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBjb2xvciBvZiB2aXNpdGVkIGxpbmtzIC0tCi0gIGFsaW5rICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBjb2xvciBvZiBzZWxlY3RlZCBsaW5rcyAtLQotICAiPgotCi08IS0tPT09PT09PT09PT09PT09PSBDaGFyYWN0ZXIgbW5lbW9uaWMgZW50aXRpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIEhUTUxsYXQxIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4xLy9FTi8vSFRNTCIKLSAgICJIVE1MbGF0MS5lbnQiPgotJUhUTUxsYXQxOwotCi08IUVOVElUWSAlIEhUTUxzeW1ib2wgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzLy9FTi8vSFRNTCIKLSAgICJIVE1Mc3ltYm9sLmVudCI+Ci0lSFRNTHN5bWJvbDsKLQotPCFFTlRJVFkgJSBIVE1Mc3BlY2lhbCBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwvL0VOLy9IVE1MIgotICAgIkhUTUxzcGVjaWFsLmVudCI+Ci0lSFRNTHNwZWNpYWw7Ci08IS0tPT09PT09PT09PT09PT09PT09PSBHZW5lcmljIEF0dHJpYnV0ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGNvcmVhdHRycwotICJpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQtd2lkZSB1bmlxdWUgaWQgLS0KLSAgY2xhc3MgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzZXMgLS0KLSAgc3R5bGUgICAgICAgJVN0eWxlU2hlZXQ7ICAgI0lNUExJRUQgIC0tIGFzc29jaWF0ZWQgc3R5bGUgaW5mbyAtLQotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgdGl0bGUgLS0iCi0gID4KLQotPCFFTlRJVFkgJSBpMThuCi0gImxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEICAtLSBsYW5ndWFnZSBjb2RlIC0tCi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNJTVBMSUVEICAtLSBkaXJlY3Rpb24gZm9yIHdlYWsvbmV1dHJhbCB0ZXh0IC0tIgotICA+Ci0KLTwhRU5USVRZICUgZXZlbnRzCi0gIm9uY2xpY2sgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgYnV0dG9uIHdhcyBjbGlja2VkIC0tCi0gIG9uZGJsY2xpY2sgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgYnV0dG9uIHdhcyBkb3VibGUgY2xpY2tlZC0tCi0gIG9ubW91c2Vkb3duICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgYnV0dG9uIHdhcyBwcmVzc2VkIGRvd24gLS0KLSAgb25tb3VzZXVwICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIHJlbGVhc2VkIC0tCi0gIG9ubW91c2VvdmVyICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgd2FzIG1vdmVkIG9udG8gLS0KLSAgb25tb3VzZW1vdmUgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgd2l0aGluIC0tCi0gIG9ubW91c2VvdXQgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgd2FzIG1vdmVkIGF3YXkgLS0KLSAgb25rZXlwcmVzcyAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEga2V5IHdhcyBwcmVzc2VkIGFuZCByZWxlYXNlZCAtLQotICBvbmtleWRvd24gICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBrZXkgd2FzIHByZXNzZWQgZG93biAtLQotICBvbmtleXVwICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBrZXkgd2FzIHJlbGVhc2VkIC0tIgotICA+Ci0KLTwhLS0gUmVzZXJ2ZWQgRmVhdHVyZSBTd2l0Y2ggLS0+Ci08IUVOVElUWSAlIEhUTUwuUmVzZXJ2ZWQgIklHTk9SRSI+Ci0KLTwhLS0gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLT4KLTwhWyAlSFRNTC5SZXNlcnZlZDsgWwotPCFFTlRJVFkgJSByZXNlcnZlZAotICJkYXRhc3JjICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gYSBzaW5nbGUgb3IgdGFidWxhciBEYXRhIFNvdXJjZSAtLQotICBkYXRhZmxkICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gdGhlIHByb3BlcnR5IG9yIGNvbHVtbiBuYW1lIC0tCi0gIGRhdGFmb3JtYXRhcyAocGxhaW50ZXh0fGh0bWwpIHBsYWludGV4dCAtLSB0ZXh0IG9yIGh0bWwgLS0iCi0gID4KLV1dPgotCi08IUVOVElUWSAlIHJlc2VydmVkICIiPgotCi08IUVOVElUWSAlIGF0dHJzICIlY29yZWF0dHJzOyAlaTE4bjsgJWV2ZW50czsiPgotCi08IUVOVElUWSAlIGFsaWduICJhbGlnbiAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeSkgICNJTVBMSUVEIgotICAgICAgICAgICAgICAgICAgIC0tIGRlZmF1bHQgaXMgbGVmdCBmb3IgbHRyIHBhcmFncmFwaHMsIHJpZ2h0IGZvciBydGwgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBUZXh0IE1hcmt1cCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGZvbnRzdHlsZQotICJUVCB8IEkgfCBCIHwgVSB8IFMgfCBTVFJJS0UgfCBCSUcgfCBTTUFMTCI+Ci0KLTwhRU5USVRZICUgcGhyYXNlICJFTSB8IFNUUk9ORyB8IERGTiB8IENPREUgfAotICAgICAgICAgICAgICAgICAgIFNBTVAgfCBLQkQgfCBWQVIgfCBDSVRFIHwgQUJCUiB8IEFDUk9OWU0iID4KLQotPCFFTlRJVFkgJSBzcGVjaWFsCi0gICAiQSB8IElNRyB8IEFQUExFVCB8IE9CSkVDVCB8IEZPTlQgfCBCQVNFRk9OVCB8IEJSIHwgU0NSSVBUIHwKLSAgICBNQVAgfCBRIHwgU1VCIHwgU1VQIHwgU1BBTiB8IEJETyB8IElGUkFNRSI+Ci0KLTwhRU5USVRZICUgZm9ybWN0cmwgIklOUFVUIHwgU0VMRUNUIHwgVEVYVEFSRUEgfCBMQUJFTCB8IEJVVFRPTiI+Ci0KLTwhLS0gJWlubGluZTsgY292ZXJzIGlubGluZSBvciAidGV4dC1sZXZlbCIgZWxlbWVudHMgLS0+Ci08IUVOVElUWSAlIGlubGluZSAiI1BDREFUQSB8ICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlc3BlY2lhbDsgfCAlZm9ybWN0cmw7Ij4KLQotPCFFTEVNRU5UICglZm9udHN0eWxlO3wlcGhyYXNlOykgLSAtICglaW5saW5lOykqPgotPCFBVFRMSVNUICglZm9udHN0eWxlO3wlcGhyYXNlOykKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCFFTEVNRU5UIChTVUJ8U1VQKSAtIC0gKCVpbmxpbmU7KSogICAgLS0gc3Vic2NyaXB0LCBzdXBlcnNjcmlwdCAtLT4KLTwhQVRUTElTVCAoU1VCfFNVUCkKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCFFTEVNRU5UIFNQQU4gLSAtICglaW5saW5lOykqICAgICAgICAgLS0gZ2VuZXJpYyBsYW5ndWFnZS9zdHlsZSBjb250YWluZXIgLS0+Ci08IUFUVExJU1QgU1BBTgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJXJlc2VydmVkOwkJCSAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBCRE8gLSAtICglaW5saW5lOykqICAgICAgICAgIC0tIEkxOE4gQmlEaSBvdmVyLXJpZGUgLS0+Ci08IUFUVExJU1QgQkRPCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICBsYW5nICAgICAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCAgLS0gbGFuZ3VhZ2UgY29kZSAtLQotICBkaXIgICAgICAgICAobHRyfHJ0bCkgICAgICAjUkVRVUlSRUQgLS0gZGlyZWN0aW9uYWxpdHkgLS0KLSAgPgotCi08IUVMRU1FTlQgQkFTRUZPTlQgLSBPIEVNUFRZICAgICAgICAgICAtLSBiYXNlIGZvbnQgc2l6ZSAtLT4KLTwhQVRUTElTVCBCQVNFRk9OVAotICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQtd2lkZSB1bmlxdWUgaWQgLS0KLSAgc2l6ZSAgICAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVEIC0tIGJhc2UgZm9udCBzaXplIGZvciBGT05UIGVsZW1lbnRzIC0tCi0gIGNvbG9yICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSB0ZXh0IGNvbG9yIC0tCi0gIGZhY2UgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBmb250IG5hbWVzIC0tCi0gID4KLQotPCFFTEVNRU5UIEZPTlQgLSAtICglaW5saW5lOykqICAgICAgICAgLS0gbG9jYWwgY2hhbmdlIHRvIGZvbnQgLS0+Ci08IUFUVExJU1QgRk9OVAotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgJWkxOG47CQkgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIgLS0KLSAgc2l6ZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIFsrfC1dbm4gZS5nLiBzaXplPSIrMSIsIHNpemU9IjQiIC0tCi0gIGNvbG9yICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSB0ZXh0IGNvbG9yIC0tCi0gIGZhY2UgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBmb250IG5hbWVzIC0tCi0gID4KLQotPCFFTEVNRU5UIEJSIC0gTyBFTVBUWSAgICAgICAgICAgICAgICAgLS0gZm9yY2VkIGxpbmUgYnJlYWsgLS0+Ci08IUFUVExJU1QgQlIKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIGNsZWFyICAgICAgIChsZWZ0fGFsbHxyaWdodHxub25lKSBub25lIC0tIGNvbnRyb2wgb2YgdGV4dCBmbG93IC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBIVE1MIGNvbnRlbnQgbW9kZWxzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICAgIEhUTUwgaGFzIHR3byBiYXNpYyBjb250ZW50IG1vZGVsczoKLQotICAgICAgICAlaW5saW5lOyAgICAgY2hhcmFjdGVyIGxldmVsIGVsZW1lbnRzIGFuZCB0ZXh0IHN0cmluZ3MKLSAgICAgICAgJWJsb2NrOyAgICAgIGJsb2NrLWxpa2UgZWxlbWVudHMgZS5nLiBwYXJhZ3JhcGhzIGFuZCBsaXN0cwotLS0+Ci0KLTwhRU5USVRZICUgYmxvY2sKLSAgICAgIlAgfCAlaGVhZGluZzsgfCAlbGlzdDsgfCAlcHJlZm9ybWF0dGVkOyB8IERMIHwgRElWIHwgQ0VOVEVSIHwKLSAgICAgIE5PU0NSSVBUIHwgTk9GUkFNRVMgfCBCTE9DS1FVT1RFIHwgRk9STSB8IElTSU5ERVggfCBIUiB8Ci0gICAgICBUQUJMRSB8IEZJRUxEU0VUIHwgQUREUkVTUyI+Ci0KLTwhRU5USVRZICUgZmxvdyAiJWJsb2NrOyB8ICVpbmxpbmU7Ij4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgQm9keSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEJPRFkgTyBPICglZmxvdzspKiArKElOU3xERUwpIC0tIGRvY3VtZW50IGJvZHkgLS0+Ci08IUFUVExJU1QgQk9EWQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgb25sb2FkICAgICAgICAgICVTY3JpcHQ7ICAgI0lNUExJRUQgIC0tIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBsb2FkZWQgLS0KLSAgb251bmxvYWQgICAgICAgICVTY3JpcHQ7ICAgI0lNUExJRUQgIC0tIHRoZSBkb2N1bWVudCBoYXMgYmVlbiByZW1vdmVkIC0tCi0gIGJhY2tncm91bmQgICAgICAlVVJJOyAgICAgICNJTVBMSUVEICAtLSB0ZXh0dXJlIHRpbGUgZm9yIGRvY3VtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kIC0tCi0gICVib2R5Y29sb3JzOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBiZ2NvbG9yLCB0ZXh0LCBsaW5rLCB2bGluaywgYWxpbmsgLS0KLSAgPgotCi08IUVMRU1FTlQgQUREUkVTUyAtIC0gKCglaW5saW5lOyl8UCkqICAtLSBpbmZvcm1hdGlvbiBvbiBhdXRob3IgLS0+Ci08IUFUVExJU1QgQUREUkVTUwotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgRElWIC0gLSAoJWZsb3c7KSogICAgICAgICAgICAtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBESVYKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gICVhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBhbGlnbiwgdGV4dCBhbGlnbm1lbnQgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIENFTlRFUiAtIC0gKCVmbG93OykqICAgICAgICAgLS0gc2hvcnRoYW5kIGZvciBESVYgYWxpZ249Y2VudGVyIC0tPgotPCFBVFRMSVNUIENFTlRFUgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBBbmNob3IgRWxlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIFNoYXBlICIocmVjdHxjaXJjbGV8cG9seXxkZWZhdWx0KSI+Ci08IUVOVElUWSAlIENvb3JkcyAiQ0RBVEEiIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGxlbmd0aHMgLS0+Ci0KLTwhRUxFTUVOVCBBIC0gLSAoJWlubGluZTspKiAtKEEpICAgICAgIC0tIGFuY2hvciAtLT4KLTwhQVRUTElTVCBBCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRCAgLS0gY2hhciBlbmNvZGluZyBvZiBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGFkdmlzb3J5IGNvbnRlbnQgdHlwZSAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gbmFtZWQgbGluayBlbmQgLS0KLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgbGlua2VkIHJlc291cmNlIC0tCi0gIGhyZWZsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEICAtLSBsYW5ndWFnZSBjb2RlIC0tCi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVEICAtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLQotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRCAgLS0gZm9yd2FyZCBsaW5rIHR5cGVzIC0tCi0gIHJldiAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSByZXZlcnNlIGxpbmsgdHlwZXMgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBzaGFwZSAgICAgICAlU2hhcGU7ICAgICAgICByZWN0ICAgICAgLS0gZm9yIHVzZSB3aXRoIGNsaWVudC1zaWRlIGltYWdlIG1hcHMgLS0KLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQgIC0tIGZvciB1c2Ugd2l0aCBjbGllbnQtc2lkZSBpbWFnZSBtYXBzIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gQ2xpZW50LXNpZGUgaW1hZ2UgbWFwcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gVGhlc2UgY2FuIGJlIHBsYWNlZCBpbiB0aGUgc2FtZSBkb2N1bWVudCBvciBncm91cGVkIGluIGEKLSAgICAgc2VwYXJhdGUgZG9jdW1lbnQgYWx0aG91Z2ggdGhpcyBpc24ndCB5ZXQgd2lkZWx5IHN1cHBvcnRlZCAtLT4KLQotPCFFTEVNRU5UIE1BUCAtIC0gKCglYmxvY2s7KSB8IEFSRUEpKyAtLSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgLS0+Ci08IUFUVExJU1QgTUFQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gZm9yIHJlZmVyZW5jZSBieSB1c2VtYXAgLS0KLSAgPgotCi08IUVMRU1FTlQgQVJFQSAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgYXJlYSAtLT4KLTwhQVRUTElTVCBBUkVBCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzaGFwZSAgICAgICAlU2hhcGU7ICAgICAgICByZWN0ICAgICAgLS0gY29udHJvbHMgaW50ZXJwcmV0YXRpb24gb2YgY29vcmRzIC0tCi0gIGNvb3JkcyAgICAgICVDb29yZHM7ICAgICAgICNJTVBMSUVEICAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBsZW5ndGhzIC0tCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIGxpbmtlZCByZXNvdXJjZSAtLQotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRCAgLS0gcmVuZGVyIGluIHRoaXMgZnJhbWUgLS0KLSAgbm9ocmVmICAgICAgKG5vaHJlZikgICAgICAgI0lNUExJRUQgIC0tIHRoaXMgcmVnaW9uIGhhcyBubyBhY3Rpb24gLS0KLSAgYWx0ICAgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVEIC0tIHNob3J0IGRlc2NyaXB0aW9uIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBUaGUgTElOSyBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICBSZWxhdGlvbnNoaXAgdmFsdWVzIGNhbiBiZSB1c2VkIGluIHByaW5jaXBsZToKLQotICAgYSkgZm9yIGRvY3VtZW50IHNwZWNpZmljIHRvb2xiYXJzL21lbnVzIHdoZW4gdXNlZAotICAgICAgd2l0aCB0aGUgTElOSyBlbGVtZW50IGluIGRvY3VtZW50IGhlYWQgZS5nLgotICAgICAgICBzdGFydCwgY29udGVudHMsIHByZXZpb3VzLCBuZXh0LCBpbmRleCwgZW5kLCBoZWxwCi0gICBiKSB0byBsaW5rIHRvIGEgc2VwYXJhdGUgc3R5bGUgc2hlZXQgKHJlbD1zdHlsZXNoZWV0KQotICAgYykgdG8gbWFrZSBhIGxpbmsgdG8gYSBzY3JpcHQgKHJlbD1zY3JpcHQpCi0gICBkKSBieSBzdHlsZXNoZWV0cyB0byBjb250cm9sIGhvdyBjb2xsZWN0aW9ucyBvZgotICAgICAgaHRtbCBub2RlcyBhcmUgcmVuZGVyZWQgaW50byBwcmludGVkIGRvY3VtZW50cwotICAgZSkgdG8gbWFrZSBhIGxpbmsgdG8gYSBwcmludGFibGUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBlLmcuIGEgcG9zdHNjcmlwdCBvciBwZGYgdmVyc2lvbiAocmVsPWFsdGVybmF0ZSBtZWRpYT1wcmludCkKLS0tPgotCi08IUVMRU1FTlQgTElOSyAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBhIG1lZGlhLWluZGVwZW5kZW50IGxpbmsgLS0+Ci08IUFUVExJU1QgTElOSwotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQgIC0tIGNoYXIgZW5jb2Rpbmcgb2YgbGlua2VkIHJlc291cmNlIC0tCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIGxpbmtlZCByZXNvdXJjZSAtLQotICBocmVmbGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCAgLS0gbGFuZ3VhZ2UgY29kZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgY29udGVudCB0eXBlIC0tCi0gIHJlbCAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSBmb3J3YXJkIGxpbmsgdHlwZXMgLS0KLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIHJldmVyc2UgbGluayB0eXBlcyAtLQotICBtZWRpYSAgICAgICAlTWVkaWFEZXNjOyAgICAjSU1QTElFRCAgLS0gZm9yIHJlbmRlcmluZyBvbiB0aGVzZSBtZWRpYSAtLQotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRCAgLS0gcmVuZGVyIGluIHRoaXMgZnJhbWUgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbWFnZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGluIHN0cmljdCBEVEQgZm9yIGNlbGxwYWRkaW5nL2NlbGxzcGFjaW5nIC0tPgotPCFFTlRJVFkgJSBMZW5ndGggIkNEQVRBIiAtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IUVOVElUWSAlIE11bHRpTGVuZ3RoICJDREFUQSIgLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotCi08IVsgJUhUTUwuRnJhbWVzZXQ7IFsKLTwhRU5USVRZICUgTXVsdGlMZW5ndGhzICJDREFUQSIgLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgTXVsdGlMZW5ndGggLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSBQaXhlbHMgIkNEQVRBIiAtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgotCi08IUVOVElUWSAlIElBbGlnbiAiKHRvcHxtaWRkbGV8Ym90dG9tfGxlZnR8cmlnaHQpIiAtLSBjZW50ZXI/IC0tPgotCi08IS0tIFRvIGF2b2lkIHByb2JsZW1zIHdpdGggdGV4dC1vbmx5IFVBcyBhcyB3ZWxsIGFzIAotICAgdG8gbWFrZSBpbWFnZSBjb250ZW50IHVuZGVyc3RhbmRhYmxlIGFuZCBuYXZpZ2FibGUgCi0gICB0byB1c2VycyBvZiBub24tdmlzdWFsIFVBcywgeW91IG5lZWQgdG8gcHJvdmlkZQotICAgYSBkZXNjcmlwdGlvbiB3aXRoIEFMVCwgYW5kIGF2b2lkIHNlcnZlci1zaWRlIGltYWdlIG1hcHMgLS0+Ci08IUVMRU1FTlQgSU1HIC0gTyBFTVBUWSAgICAgICAgICAgICAgICAtLSBFbWJlZGRlZCBpbWFnZSAtLT4KLTwhQVRUTElTVCBJTUcKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRCAtLSBVUkkgb2YgaW1hZ2UgdG8gZW1iZWQgLS0KLSAgYWx0ICAgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVEIC0tIHNob3J0IGRlc2NyaXB0aW9uIC0tCi0gIGxvbmdkZXNjICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBsaW5rIHRvIGxvbmcgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb21wbGVtZW50cyBhbHQpIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lIG9mIGltYWdlIGZvciBzY3JpcHRpbmcgLS0KLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG92ZXJyaWRlIGhlaWdodCAtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb3ZlcnJpZGUgd2lkdGggLS0KLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHVzZSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgLS0KLSAgaXNtYXAgICAgICAgKGlzbWFwKSAgICAgICAgI0lNUExJRUQgIC0tIHVzZSBzZXJ2ZXItc2lkZSBpbWFnZSBtYXAgLS0KLSAgYWxpZ24gICAgICAgJUlBbGlnbjsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIG9yIGhvcml6b250YWwgYWxpZ25tZW50IC0tCi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBsaW5rIGJvcmRlciB3aWR0aCAtLQotICBoc3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gaG9yaXpvbnRhbCBndXR0ZXIgLS0KLSAgdnNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIGd1dHRlciAtLQotICA+Ci0KLTwhLS0gVVNFTUFQIHBvaW50cyB0byBhIE1BUCBlbGVtZW50IHdoaWNoIG1heSBiZSBpbiB0aGlzIGRvY3VtZW50Ci0gIG9yIGFuIGV4dGVybmFsIGRvY3VtZW50LCBhbHRob3VnaCB0aGUgbGF0dGVyIGlzIG5vdCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT0gT0JKRUNUID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tCi0gIE9CSkVDVCBpcyB1c2VkIHRvIGVtYmVkIG9iamVjdHMgYXMgcGFydCBvZiBIVE1MIHBhZ2VzIAotICBQQVJBTSBlbGVtZW50cyBzaG91bGQgcHJlY2VkZSBvdGhlciBjb250ZW50LiBTR01MIG1peGVkIGNvbnRlbnQKLSAgbW9kZWwgdGVjaG5pY2FsaXR5IHByZWNsdWRlcyBzcGVjaWZ5aW5nIHRoaXMgZm9ybWFsbHkgLi4uCi0tLT4KLQotPCFFTEVNRU5UIE9CSkVDVCAtIC0gKFBBUkFNIHwgJWZsb3c7KSoKLSAtLSBnZW5lcmljIGVtYmVkZGVkIG9iamVjdCAtLT4KLTwhQVRUTElTVCBPQkpFQ1QKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGRlY2xhcmUgICAgIChkZWNsYXJlKSAgICAgICNJTVBMSUVEICAtLSBkZWNsYXJlIGJ1dCBkb24ndCBpbnN0YW50aWF0ZSBmbGFnIC0tCi0gIGNsYXNzaWQgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBpZGVudGlmaWVzIGFuIGltcGxlbWVudGF0aW9uIC0tCi0gIGNvZGViYXNlICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBiYXNlIFVSSSBmb3IgY2xhc3NpZCwgZGF0YSwgYXJjaGl2ZS0tCi0gIGRhdGEgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSByZWZlcmVuY2UgdG8gb2JqZWN0J3MgZGF0YSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gY29udGVudCB0eXBlIGZvciBkYXRhIC0tCi0gIGNvZGV0eXBlICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBjb250ZW50IHR5cGUgZm9yIGNvZGUgLS0KLSAgYXJjaGl2ZSAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIFVSSXMgLS0KLSAgc3RhbmRieSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIG1lc3NhZ2UgdG8gc2hvdyB3aGlsZSBsb2FkaW5nIC0tCi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSBoZWlnaHQgLS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG92ZXJyaWRlIHdpZHRoIC0tCi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSB1c2UgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzdWJtaXQgYXMgcGFydCBvZiBmb3JtIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFsaWduICAgICAgICVJQWxpZ247ICAgICAgICNJTVBMSUVEICAtLSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIGFsaWdubWVudCAtLQotICBib3JkZXIgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gbGluayBib3JkZXIgd2lkdGggLS0KLSAgaHNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIGhvcml6b250YWwgZ3V0dGVyIC0tCi0gIHZzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSB2ZXJ0aWNhbCBndXR0ZXIgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIFBBUkFNIC0gTyBFTVBUWSAgICAgICAgICAgICAgLS0gbmFtZWQgcHJvcGVydHkgdmFsdWUgLS0+Ci08IUFUVExJU1QgUEFSQU0KLSAgaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQgIC0tIGRvY3VtZW50LXdpZGUgdW5pcXVlIGlkIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRCAtLSBwcm9wZXJ0eSBuYW1lIC0tCi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBwcm9wZXJ0eSB2YWx1ZSAtLQotICB2YWx1ZXR5cGUgICAoREFUQXxSRUZ8T0JKRUNUKSBEQVRBICAgLS0gSG93IHRvIGludGVycHJldCB2YWx1ZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gY29udGVudCB0eXBlIGZvciB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB2YWx1ZXR5cGU9cmVmIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSmF2YSBBUFBMRVQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLQotICBPbmUgb2YgY29kZSBvciBvYmplY3QgYXR0cmlidXRlcyBtdXN0IGJlIHByZXNlbnQuCi0gIFBsYWNlIFBBUkFNIGVsZW1lbnRzIGJlZm9yZSBvdGhlciBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgQVBQTEVUIC0gLSAoUEFSQU0gfCAlZmxvdzspKiAtLSBKYXZhIGFwcGxldCAtLT4KLTwhQVRUTElTVCBBUFBMRVQKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIGNvZGViYXNlICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBvcHRpb25hbCBiYXNlIFVSSSBmb3IgYXBwbGV0IC0tCi0gIGFyY2hpdmUgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBjb21tYS1zZXBhcmF0ZWQgYXJjaGl2ZSBsaXN0IC0tCi0gIGNvZGUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBhcHBsZXQgY2xhc3MgZmlsZSAtLQotICBvYmplY3QgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc2VyaWFsaXplZCBhcHBsZXQgZmlsZSAtLQotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gc2hvcnQgZGVzY3JpcHRpb24gLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGFsbG93cyBhcHBsZXRzIHRvIGZpbmQgZWFjaCBvdGhlciAtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjUkVRVUlSRUQgLS0gaW5pdGlhbCB3aWR0aCAtLQotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjUkVRVUlSRUQgLS0gaW5pdGlhbCBoZWlnaHQgLS0KLSAgYWxpZ24gICAgICAgJUlBbGlnbjsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIG9yIGhvcml6b250YWwgYWxpZ25tZW50IC0tCi0gIGhzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBob3Jpem9udGFsIGd1dHRlciAtLQotICB2c3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgZ3V0dGVyIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBSdWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEhSIC0gTyBFTVBUWSAtLSBob3Jpem9udGFsIHJ1bGUgLS0+Ci08IUFUVExJU1QgSFIKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFsaWduICAgICAgIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQKLSAgbm9zaGFkZSAgICAgKG5vc2hhZGUpICAgICAgI0lNUExJRUQKLSAgc2l6ZSAgICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBQYXJhZ3JhcGhzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgUCAtIE8gKCVpbmxpbmU7KSogICAgICAgICAgICAtLSBwYXJhZ3JhcGggLS0+Ci08IUFUVExJU1QgUAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFsaWduLCB0ZXh0IGFsaWdubWVudCAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEhlYWRpbmdzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgVGhlcmUgYXJlIHNpeCBsZXZlbHMgb2YgaGVhZGluZ3MgZnJvbSBIMSAodGhlIG1vc3QgaW1wb3J0YW50KQotICB0byBINiAodGhlIGxlYXN0IGltcG9ydGFudCkuCi0tLT4KLQotPCFFTEVNRU5UICglaGVhZGluZzspICAtIC0gKCVpbmxpbmU7KSogLS0gaGVhZGluZyAtLT4KLTwhQVRUTElTVCAoJWhlYWRpbmc7KQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFsaWduLCB0ZXh0IGFsaWdubWVudCAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFByZWZvcm1hdHRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gZXhjbHVkZXMgbWFya3VwIGZvciBpbWFnZXMgYW5kIGNoYW5nZXMgaW4gZm9udCBzaXplIC0tPgotPCFFTlRJVFkgJSBwcmUuZXhjbHVzaW9uICJJTUd8T0JKRUNUfEFQUExFVHxCSUd8U01BTEx8U1VCfFNVUHxGT05UfEJBU0VGT05UIj4KLQotPCFFTEVNRU5UIFBSRSAtIC0gKCVpbmxpbmU7KSogLSglcHJlLmV4Y2x1c2lvbjspIC0tIHByZWZvcm1hdHRlZCB0ZXh0IC0tPgotPCFBVFRMSVNUIFBSRQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgd2lkdGggICAgICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09IElubGluZSBRdW90ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgUSAtIC0gKCVpbmxpbmU7KSogICAgICAgICAgICAtLSBzaG9ydCBpbmxpbmUgcXVvdGF0aW9uIC0tPgotPCFBVFRMSVNUIFEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIHNvdXJjZSBkb2N1bWVudCBvciBtc2cgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBCbG9jay1saWtlIFF1b3RlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgQkxPQ0tRVU9URSAtIC0gKCVmbG93OykqICAgICAtLSBsb25nIHF1b3RhdGlvbiAtLT4KLTwhQVRUTElTVCBCTE9DS1FVT1RFCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBzb3VyY2UgZG9jdW1lbnQgb3IgbXNnIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSW5zZXJ0ZWQvRGVsZXRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotCi08IS0tIElOUy9ERUwgYXJlIGhhbmRsZWQgYnkgaW5jbHVzaW9uIG9uIEJPRFkgLS0+Ci08IUVMRU1FTlQgKElOU3xERUwpIC0gLSAoJWZsb3c7KSogICAgICAtLSBpbnNlcnRlZCB0ZXh0LCBkZWxldGVkIHRleHQgLS0+Ci08IUFUVExJU1QgKElOU3xERUwpCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gaW5mbyBvbiByZWFzb24gZm9yIGNoYW5nZSAtLQotICBkYXRldGltZSAgICAlRGF0ZXRpbWU7ICAgICAjSU1QTElFRCAgLS0gZGF0ZSBhbmQgdGltZSBvZiBjaGFuZ2UgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBMaXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGRlZmluaXRpb24gbGlzdHMgLSBEVCBmb3IgdGVybSwgREQgZm9yIGl0cyBkZWZpbml0aW9uIC0tPgotCi08IUVMRU1FTlQgREwgLSAtIChEVHxERCkrICAgICAgICAgICAgICAtLSBkZWZpbml0aW9uIGxpc3QgLS0+Ci08IUFUVExJU1QgREwKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVEICAtLSByZWR1Y2VkIGludGVyaXRlbSBzcGFjaW5nIC0tCi0gID4KLQotPCFFTEVNRU5UIERUIC0gTyAoJWlubGluZTspKiAgICAgICAgICAgLS0gZGVmaW5pdGlvbiB0ZXJtIC0tPgotPCFFTEVNRU5UIEREIC0gTyAoJWZsb3c7KSogICAgICAgICAgICAgLS0gZGVmaW5pdGlvbiBkZXNjcmlwdGlvbiAtLT4KLTwhQVRUTElTVCAoRFR8REQpCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS0gT3JkZXJlZCBsaXN0cyAoT0wpIE51bWJlcmluZyBzdHlsZQotCi0gICAgMSAgIGFyYWJsaWMgbnVtYmVycyAgICAgMSwgMiwgMywgLi4uCi0gICAgYSAgIGxvd2VyIGFscGhhICAgICAgICAgYSwgYiwgYywgLi4uCi0gICAgQSAgIHVwcGVyIGFscGhhICAgICAgICAgQSwgQiwgQywgLi4uCi0gICAgaSAgIGxvd2VyIHJvbWFuICAgICAgICAgaSwgaWksIGlpaSwgLi4uCi0gICAgSSAgIHVwcGVyIHJvbWFuICAgICAgICAgSSwgSUksIElJSSwgLi4uCi0KLSAgICBUaGUgc3R5bGUgaXMgYXBwbGllZCB0byB0aGUgc2VxdWVuY2UgbnVtYmVyIHdoaWNoIGJ5IGRlZmF1bHQKLSAgICBpcyByZXNldCB0byAxIGZvciB0aGUgZmlyc3QgbGlzdCBpdGVtIGluIGFuIG9yZGVyZWQgbGlzdC4KLQotICAgIFRoaXMgY2FuJ3QgYmUgZXhwcmVzc2VkIGRpcmVjdGx5IGluIFNHTUwgZHVlIHRvIGNhc2UgZm9sZGluZy4KLS0tPgotCi08IUVOVElUWSAlIE9MU3R5bGUgIkNEQVRBIiAgICAgIC0tIGNvbnN0cmFpbmVkIHRvOiAiKDF8YXxBfGl8SSkiIC0tPgotCi08IUVMRU1FTlQgT0wgLSAtIChMSSkrICAgICAgICAgICAgICAgICAtLSBvcmRlcmVkIGxpc3QgLS0+Ci08IUFUVExJU1QgT0wKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHR5cGUgICAgICAgICVPTFN0eWxlOyAgICAgICNJTVBMSUVEICAtLSBudW1iZXJpbmcgc3R5bGUgLS0KLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAgI0lNUExJRUQgIC0tIHJlZHVjZWQgaW50ZXJpdGVtIHNwYWNpbmcgLS0KLSAgc3RhcnQgICAgICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciAtLQotICA+Ci0KLTwhLS0gVW5vcmRlcmVkIExpc3RzIChVTCkgYnVsbGV0IHN0eWxlcyAtLT4KLTwhRU5USVRZICUgVUxTdHlsZSAiKGRpc2N8c3F1YXJlfGNpcmNsZSkiPgotCi08IUVMRU1FTlQgVUwgLSAtIChMSSkrICAgICAgICAgICAgICAgICAtLSB1bm9yZGVyZWQgbGlzdCAtLT4KLTwhQVRUTElTVCBVTAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJVVMU3R5bGU7ICAgICAgI0lNUExJRUQgIC0tIGJ1bGxldCBzdHlsZSAtLQotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICAjSU1QTElFRCAgLS0gcmVkdWNlZCBpbnRlcml0ZW0gc3BhY2luZyAtLQotICA+Ci0KLTwhRUxFTUVOVCAoRElSfE1FTlUpIC0gLSAoTEkpKyAtKCVibG9jazspIC0tIGRpcmVjdG9yeSBsaXN0LCBtZW51IGxpc3QgLS0+Ci08IUFUVExJU1QgRElSCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICAjSU1QTElFRCAtLSByZWR1Y2VkIGludGVyaXRlbSBzcGFjaW5nIC0tCi0gID4KLTwhQVRUTElTVCBNRU5VCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICAjSU1QTElFRCAtLSByZWR1Y2VkIGludGVyaXRlbSBzcGFjaW5nIC0tCi0gID4KLQotPCFFTlRJVFkgJSBMSVN0eWxlICJDREFUQSIgLS0gY29uc3RyYWluZWQgdG86ICIoJVVMU3R5bGU7fCVPTFN0eWxlOykiIC0tPgotCi08IUVMRU1FTlQgTEkgLSBPICglZmxvdzspKiAgICAgICAgICAgICAtLSBsaXN0IGl0ZW0gLS0+Ci08IUFUVExJU1QgTEkKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHR5cGUgICAgICAgICVMSVN0eWxlOyAgICAgICNJTVBMSUVEICAtLSBsaXN0IGl0ZW0gc3R5bGUgLS0KLSAgdmFsdWUgICAgICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHJlc2V0IHNlcXVlbmNlIG51bWJlciAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IEZvcm1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IUVMRU1FTlQgRk9STSAtIC0gKCVmbG93OykqIC0oRk9STSkgICAtLSBpbnRlcmFjdGl2ZSBmb3JtIC0tPgotPCFBVFRMSVNUIEZPUk0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFjdGlvbiAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRCAtLSBzZXJ2ZXItc2lkZSBmb3JtIGhhbmRsZXIgLS0KLSAgbWV0aG9kICAgICAgKEdFVHxQT1NUKSAgICAgR0VUICAgICAgIC0tIEhUVFAgbWV0aG9kIHVzZWQgdG8gc3VibWl0IHRoZSBmb3JtLS0KLSAgZW5jdHlwZSAgICAgJUNvbnRlbnRUeXBlOyAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKLSAgYWNjZXB0ICAgICAgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQgIC0tIGxpc3Qgb2YgTUlNRSB0eXBlcyBmb3IgZmlsZSB1cGxvYWQgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWUgb2YgZm9ybSBmb3Igc2NyaXB0aW5nIC0tCi0gIG9uc3VibWl0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZm9ybSB3YXMgc3VibWl0dGVkIC0tCi0gIG9ucmVzZXQgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZm9ybSB3YXMgcmVzZXQgLS0KLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQgIC0tIHJlbmRlciBpbiB0aGlzIGZyYW1lIC0tCi0gIGFjY2VwdC1jaGFyc2V0ICVDaGFyc2V0czsgICNJTVBMSUVEICAtLSBsaXN0IG9mIHN1cHBvcnRlZCBjaGFyc2V0cyAtLQotICA+Ci0KLTwhLS0gRWFjaCBsYWJlbCBtdXN0IG5vdCBjb250YWluIG1vcmUgdGhhbiBPTkUgZmllbGQgLS0+Ci08IUVMRU1FTlQgTEFCRUwgLSAtICglaW5saW5lOykqIC0oTEFCRUwpIC0tIGZvcm0gZmllbGQgbGFiZWwgdGV4dCAtLT4KLTwhQVRUTElTVCBMQUJFTAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgZm9yICAgICAgICAgSURSRUYgICAgICAgICAgI0lNUExJRUQgIC0tIG1hdGNoZXMgZmllbGQgSUQgdmFsdWUgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgPgotCi08IUVOVElUWSAlIElucHV0VHlwZQotICAiKFRFWFQgfCBQQVNTV09SRCB8IENIRUNLQk9YIHwKLSAgICBSQURJTyB8IFNVQk1JVCB8IFJFU0VUIHwKLSAgICBGSUxFIHwgSElEREVOIHwgSU1BR0UgfCBCVVRUT04pIgotICAgPgotCi08IS0tIGF0dHJpYnV0ZSBuYW1lIHJlcXVpcmVkIGZvciBhbGwgYnV0IHN1Ym1pdCBhbmQgcmVzZXQgLS0+Ci08IUVMRU1FTlQgSU5QVVQgLSBPIEVNUFRZICAgICAgICAgICAgICAtLSBmb3JtIGNvbnRyb2wgLS0+Ci08IUFUVExJU1QgSU5QVVQKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHR5cGUgICAgICAgICVJbnB1dFR5cGU7ICAgIFRFWFQgICAgICAtLSB3aGF0IGtpbmQgb2Ygd2lkZ2V0IGlzIG5lZWRlZCAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc3VibWl0IGFzIHBhcnQgb2YgZm9ybSAtLQotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gU3BlY2lmeSBmb3IgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2tib3hlcyAtLQotICBjaGVja2VkICAgICAoY2hlY2tlZCkgICAgICAjSU1QTElFRCAgLS0gZm9yIHJhZGlvIGJ1dHRvbnMgYW5kIGNoZWNrIGJveGVzIC0tCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgcmVhZG9ubHkgICAgKHJlYWRvbmx5KSAgICAgI0lNUExJRUQgIC0tIGZvciB0ZXh0IGFuZCBwYXNzd2QgLS0KLSAgc2l6ZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNwZWNpZmljIHRvIGVhY2ggdHlwZSBvZiBmaWVsZCAtLQotICBtYXhsZW5ndGggICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gbWF4IGNoYXJzIGZvciB0ZXh0IGZpZWxkcyAtLQotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gZm9yIGZpZWxkcyB3aXRoIGltYWdlcyAtLQotICBhbHQgICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc2hvcnQgZGVzY3JpcHRpb24gLS0KLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHVzZSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgLS0KLSAgaXNtYXAgICAgICAgKGlzbWFwKSAgICAgICAgI0lNUExJRUQgIC0tIHVzZSBzZXJ2ZXItc2lkZSBpbWFnZSBtYXAgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgb25zZWxlY3QgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHNvbWUgdGV4dCB3YXMgc2VsZWN0ZWQgLS0KLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IHZhbHVlIHdhcyBjaGFuZ2VkIC0tCi0gIGFjY2VwdCAgICAgICVDb250ZW50VHlwZXM7ICNJTVBMSUVEICAtLSBsaXN0IG9mIE1JTUUgdHlwZXMgZm9yIGZpbGUgdXBsb2FkIC0tCi0gIGFsaWduICAgICAgICVJQWxpZ247ICAgICAgICNJTVBMSUVEICAtLSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIGFsaWdubWVudCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgU0VMRUNUIC0gLSAoT1BUR1JPVVB8T1BUSU9OKSsgLS0gb3B0aW9uIHNlbGVjdG9yIC0tPgotPCFBVFRMSVNUIFNFTEVDVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGZpZWxkIG5hbWUgLS0KLSAgc2l6ZSAgICAgICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHJvd3MgdmlzaWJsZSAtLQotICBtdWx0aXBsZSAgICAobXVsdGlwbGUpICAgICAjSU1QTElFRCAgLS0gZGVmYXVsdCBpcyBzaW5nbGUgc2VsZWN0aW9uIC0tCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCB2YWx1ZSB3YXMgY2hhbmdlZCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgT1BUR1JPVVAgLSAtIChPUFRJT04pKyAtLSBvcHRpb24gZ3JvdXAgLS0+Ci08IUFUVExJU1QgT1BUR1JPVVAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVEIC0tIGZvciB1c2UgaW4gaGllcmFyY2hpY2FsIG1lbnVzIC0tCi0gID4KLQotPCFFTEVNRU5UIE9QVElPTiAtIE8gKCNQQ0RBVEEpICAgICAgICAgLS0gc2VsZWN0YWJsZSBjaG9pY2UgLS0+Ci08IUFUVExJU1QgT1BUSU9OCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzZWxlY3RlZCAgICAoc2VsZWN0ZWQpICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIGxhYmVsICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBmb3IgdXNlIGluIGhpZXJhcmNoaWNhbCBtZW51cyAtLQotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gZGVmYXVsdHMgdG8gZWxlbWVudCBjb250ZW50IC0tCi0gID4KLQotPCFFTEVNRU5UIFRFWFRBUkVBIC0gLSAoI1BDREFUQSkgICAgICAgLS0gbXVsdGktbGluZSB0ZXh0IGZpZWxkIC0tPgotPCFBVFRMSVNUIFRFWFRBUkVBCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICByb3dzICAgICAgICBOVU1CRVIgICAgICAgICAjUkVRVUlSRUQKLSAgY29scyAgICAgICAgTlVNQkVSICAgICAgICAgI1JFUVVJUkVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgcmVhZG9ubHkgICAgKHJlYWRvbmx5KSAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgb25zZWxlY3QgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHNvbWUgdGV4dCB3YXMgc2VsZWN0ZWQgLS0KLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IHZhbHVlIHdhcyBjaGFuZ2VkIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhLS0KLSAgI1BDREFUQSBpcyB0byBzb2x2ZSB0aGUgbWl4ZWQgY29udGVudCBwcm9ibGVtLAotICBwZXIgc3BlY2lmaWNhdGlvbiBvbmx5IHdoaXRlc3BhY2UgaXMgYWxsb3dlZCB0aGVyZSEKLSAtLT4KLTwhRUxFTUVOVCBGSUVMRFNFVCAtIC0gKCNQQ0RBVEEsTEVHRU5ELCglZmxvdzspKikgLS0gZm9ybSBjb250cm9sIGdyb3VwIC0tPgotPCFBVFRMSVNUIEZJRUxEU0VUCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBMRUdFTkQgLSAtICglaW5saW5lOykqICAgICAgIC0tIGZpZWxkc2V0IGxlZ2VuZCAtLT4KLTwhRU5USVRZICUgTEFsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhQVRUTElTVCBMRUdFTkQKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgYWxpZ24gICAgICAgJUxBbGlnbjsgICAgICAgI0lNUExJRUQgIC0tIHJlbGF0aXZlIHRvIGZpZWxkc2V0IC0tCi0gID4KLQotPCFFTEVNRU5UIEJVVFRPTiAtIC0KLSAgICAgKCVmbG93OykqIC0oQXwlZm9ybWN0cmw7fEZPUk18SVNJTkRFWHxGSUVMRFNFVHxJRlJBTUUpCi0gICAgIC0tIHB1c2ggYnV0dG9uIC0tPgotPCFBVFRMSVNUIEJVVFRPTgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNlbnQgdG8gc2VydmVyIHdoZW4gc3VibWl0dGVkIC0tCi0gIHR5cGUgICAgICAgIChidXR0b258c3VibWl0fHJlc2V0KSBzdWJtaXQgLS0gZm9yIHVzZSBhcyBmb3JtIGJ1dHRvbiAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PSBUYWJsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gSUVURiBIVE1MIHRhYmxlIHN0YW5kYXJkLCBzZWUgW1JGQzE5NDJdIC0tPgotCi08IS0tCi0gVGhlIEJPUkRFUiBhdHRyaWJ1dGUgc2V0cyB0aGUgdGhpY2tuZXNzIG9mIHRoZSBmcmFtZSBhcm91bmQgdGhlCi0gdGFibGUuIFRoZSBkZWZhdWx0IHVuaXRzIGFyZSBzY3JlZW4gcGl4ZWxzLgotCi0gVGhlIEZSQU1FIGF0dHJpYnV0ZSBzcGVjaWZpZXMgd2hpY2ggcGFydHMgb2YgdGhlIGZyYW1lIGFyb3VuZAotIHRoZSB0YWJsZSBzaG91bGQgYmUgcmVuZGVyZWQuIFRoZSB2YWx1ZXMgYXJlIG5vdCB0aGUgc2FtZSBhcwotIENBTFMgdG8gYXZvaWQgYSBuYW1lIGNsYXNoIHdpdGggdGhlIFZBTElHTiBhdHRyaWJ1dGUuCi0KLSBUaGUgdmFsdWUgImJvcmRlciIgaXMgaW5jbHVkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGgKLSA8VEFCTEUgQk9SREVSPiB3aGljaCB5aWVsZHMgZnJhbWU9Ym9yZGVyIGFuZCBib3JkZXI9aW1wbGllZAotIEZvciA8VEFCTEUgQk9SREVSPTE+IHlvdSBnZXQgYm9yZGVyPTEgYW5kIGZyYW1lPWltcGxpZWQuIEluIHRoaXMKLSBjYXNlLCBpdCBpcyBhcHByb3ByaWF0ZSB0byB0cmVhdCB0aGlzIGFzIGZyYW1lPWJvcmRlciBmb3IgYmFja3dhcmRzCi0gY29tcGF0aWJpbGl0eSB3aXRoIGRlcGxveWVkIGJyb3dzZXJzLgotLS0+Ci08IUVOVElUWSAlIFRGcmFtZSAiKHZvaWR8YWJvdmV8YmVsb3d8aHNpZGVzfGxoc3xyaHN8dnNpZGVzfGJveHxib3JkZXIpIj4KLQotPCEtLQotIFRoZSBSVUxFUyBhdHRyaWJ1dGUgZGVmaW5lcyB3aGljaCBydWxlcyB0byBkcmF3IGJldHdlZW4gY2VsbHM6Ci0KLSBJZiBSVUxFUyBpcyBhYnNlbnQgdGhlbiBhc3N1bWU6Ci0gICAgICJub25lIiBpZiBCT1JERVIgaXMgYWJzZW50IG9yIEJPUkRFUj0wIG90aGVyd2lzZSAiYWxsIgotLS0+Ci0KLTwhRU5USVRZICUgVFJ1bGVzICIobm9uZSB8IGdyb3VwcyB8IHJvd3MgfCBjb2xzIHwgYWxsKSI+Ci0gIAotPCEtLSBob3Jpem9udGFsIHBsYWNlbWVudCBvZiB0YWJsZSByZWxhdGl2ZSB0byBkb2N1bWVudCAtLT4KLTwhRU5USVRZICUgVEFsaWduICIobGVmdHxjZW50ZXJ8cmlnaHQpIj4KLQotPCEtLSBob3Jpem9udGFsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzIC0tPgotPCFFTlRJVFkgJSBjZWxsaGFsaWduCi0gICJhbGlnbiAgICAgIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5fGNoYXIpICNJTVBMSUVECi0gICBjaGFyICAgICAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhbGlnbm1lbnQgY2hhciwgZS5nLiBjaGFyPSc6JyAtLQotICAgY2hhcm9mZiAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb2Zmc2V0IGZvciBhbGlnbm1lbnQgY2hhciAtLSIKLSAgPgotCi08IS0tIHZlcnRpY2FsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzIC0tPgotPCFFTlRJVFkgJSBjZWxsdmFsaWduCi0gICJ2YWxpZ24gICAgICh0b3B8bWlkZGxlfGJvdHRvbXxiYXNlbGluZSkgI0lNUExJRUQiCi0gID4KLQotPCFFTEVNRU5UIFRBQkxFIC0gLQotICAgICAoQ0FQVElPTj8sIChDT0wqfENPTEdST1VQKiksIFRIRUFEPywgVEZPT1Q/LCBUQk9EWSspPgotPCFFTEVNRU5UIENBUFRJT04gIC0gLSAoJWlubGluZTspKiAgICAgLS0gdGFibGUgY2FwdGlvbiAtLT4KLTwhRUxFTUVOVCBUSEVBRCAgICAtIE8gKFRSKSsgICAgICAgICAgIC0tIHRhYmxlIGhlYWRlciAtLT4KLTwhRUxFTUVOVCBURk9PVCAgICAtIE8gKFRSKSsgICAgICAgICAgIC0tIHRhYmxlIGZvb3RlciAtLT4KLTwhRUxFTUVOVCBUQk9EWSAgICBPIE8gKFRSKSsgICAgICAgICAgIC0tIHRhYmxlIGJvZHkgLS0+Ci08IUVMRU1FTlQgQ09MR1JPVVAgLSBPIChDT0wpKiAgICAgICAgICAtLSB0YWJsZSBjb2x1bW4gZ3JvdXAgLS0+Ci08IUVMRU1FTlQgQ09MICAgICAgLSBPIEVNUFRZICAgICAgICAgICAtLSB0YWJsZSBjb2x1bW4gLS0+Ci08IUVMRU1FTlQgVFIgICAgICAgLSBPIChUSHxURCkrICAgICAgICAtLSB0YWJsZSByb3cgLS0+Ci08IUVMRU1FTlQgKFRIfFREKSAgLSBPICglZmxvdzspKiAgICAgICAtLSB0YWJsZSBoZWFkZXIgY2VsbCwgdGFibGUgZGF0YSBjZWxsLS0+Ci0KLTwhQVRUTElTVCBUQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIC0tIHRhYmxlIGVsZW1lbnQgLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHN1bW1hcnkgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBwdXJwb3NlL3N0cnVjdHVyZSBmb3Igc3BlZWNoIG91dHB1dC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSB0YWJsZSB3aWR0aCAtLQotICBib3JkZXIgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gY29udHJvbHMgZnJhbWUgd2lkdGggYXJvdW5kIHRhYmxlIC0tCi0gIGZyYW1lICAgICAgICVURnJhbWU7ICAgICAgICNJTVBMSUVEICAtLSB3aGljaCBwYXJ0cyBvZiBmcmFtZSB0byByZW5kZXIgLS0KLSAgcnVsZXMgICAgICAgJVRSdWxlczsgICAgICAgI0lNUExJRUQgIC0tIHJ1bGluZ3MgYmV0d2VlbiByb3dzIGFuZCBjb2xzIC0tCi0gIGNlbGxzcGFjaW5nICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBzcGFjaW5nIGJldHdlZW4gY2VsbHMgLS0KLSAgY2VsbHBhZGRpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHNwYWNpbmcgd2l0aGluIGNlbGxzIC0tCi0gIGFsaWduICAgICAgICVUQWxpZ247ICAgICAgICNJTVBMSUVEICAtLSB0YWJsZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB3aW5kb3cgLS0KLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIGJhY2tncm91bmQgY29sb3IgZm9yIGNlbGxzIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICBkYXRhcGFnZXNpemUgQ0RBVEEgICAgICAgICAjSU1QTElFRCAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVOVElUWSAlIENBbGlnbiAiKHRvcHxib3R0b218bGVmdHxyaWdodCkiPgotCi08IUFUVExJU1QgQ0FQVElPTgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWxpZ24gICAgICAgJUNBbGlnbjsgICAgICAgI0lNUExJRUQgIC0tIHJlbGF0aXZlIHRvIHRhYmxlIC0tCi0gID4KLQotPCEtLQotQ09MR1JPVVAgZ3JvdXBzIGEgc2V0IG9mIENPTCBlbGVtZW50cy4gSXQgYWxsb3dzIHlvdSB0byBncm91cAotc2V2ZXJhbCBzZW1hbnRpY2FsbHkgcmVsYXRlZCBjb2x1bW5zIHRvZ2V0aGVyLgotLS0+Ci08IUFUVExJU1QgQ09MR1JPVVAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNwYW4gICAgICAgIE5VTUJFUiAgICAgICAgIDEgICAgICAgICAtLSBkZWZhdWx0IG51bWJlciBvZiBjb2x1bW5zIGluIGdyb3VwIC0tCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVEICAtLSBkZWZhdWx0IHdpZHRoIGZvciBlbmNsb3NlZCBDT0xzIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotPCEtLQotIENPTCBlbGVtZW50cyBkZWZpbmUgdGhlIGFsaWdubWVudCBwcm9wZXJ0aWVzIGZvciBjZWxscyBpbgotIG9uZSBvciBtb3JlIGNvbHVtbnMuCi0KLSBUaGUgV0lEVEggYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbnMsIGUuZy4KLQotICAgICB3aWR0aD02NCAgICAgICAgd2lkdGggaW4gc2NyZWVuIHBpeGVscwotICAgICB3aWR0aD0wLjUqICAgICAgcmVsYXRpdmUgd2lkdGggb2YgMC41Ci0KLSBUaGUgU1BBTiBhdHRyaWJ1dGUgY2F1c2VzIHRoZSBhdHRyaWJ1dGVzIG9mIG9uZQotIENPTCBlbGVtZW50IHRvIGFwcGx5IHRvIG1vcmUgdGhhbiBvbmUgY29sdW1uLgotLS0+Ci08IUFUVExJU1QgQ09MICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBjb2x1bW4gZ3JvdXBzIGFuZCBwcm9wZXJ0aWVzIC0tCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzcGFuICAgICAgICBOVU1CRVIgICAgICAgICAxICAgICAgICAgLS0gQ09MIGF0dHJpYnV0ZXMgYWZmZWN0IE4gY29sdW1ucyAtLQotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRCAgLS0gY29sdW1uIHdpZHRoIHNwZWNpZmljYXRpb24gLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi08IS0tCi0gICAgVXNlIFRIRUFEIHRvIGR1cGxpY2F0ZSBoZWFkZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGhlYWRlcnMgd2hlbgotICAgIFRCT0RZIHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgVEZPT1QgdG8gZHVwbGljYXRlIGZvb3RlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgZm9vdGVycyB3aGVuCi0gICAgVEJPRFkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSBtdWx0aXBsZSBUQk9EWSBzZWN0aW9ucyB3aGVuIHJ1bGVzIGFyZSBuZWVkZWQKLSAgICBiZXR3ZWVuIGdyb3VwcyBvZiB0YWJsZSByb3dzLgotLS0+Ci08IUFUVExJU1QgKFRIRUFEfFRCT0RZfFRGT09UKSAgICAgICAgICAtLSB0YWJsZSBzZWN0aW9uIC0tCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICA+Ci0KLTwhQVRUTElTVCBUUiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHRhYmxlIHJvdyAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIGJhY2tncm91bmQgY29sb3IgZm9yIHJvdyAtLQotICA+Ci0KLQotPCEtLSBTY29wZSBpcyBzaW1wbGVyIHRoYW4gaGVhZGVycyBhdHRyaWJ1dGUgZm9yIGNvbW1vbiB0YWJsZXMgLS0+Ci08IUVOVElUWSAlIFNjb3BlICIocm93fGNvbHxyb3dncm91cHxjb2xncm91cCkiPgotCi08IS0tIFRIIGlzIGZvciBoZWFkZXJzLCBURCBmb3IgZGF0YSwgYnV0IGZvciBjZWxscyBhY3RpbmcgYXMgYm90aCB1c2UgVEQgLS0+Ci08IUFUVExJU1QgKFRIfFREKSAgICAgICAgICAgICAgICAgICAgICAtLSBoZWFkZXIgb3IgZGF0YSBjZWxsIC0tCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBhYmJyICAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gYWJicmV2aWF0aW9uIGZvciBoZWFkZXIgY2VsbCAtLQotICBheGlzICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVsYXRlZCBoZWFkZXJzLS0KLSAgaGVhZGVycyAgICAgSURSRUZTICAgICAgICAgI0lNUExJRUQgIC0tIGxpc3Qgb2YgaWQncyBmb3IgaGVhZGVyIGNlbGxzIC0tCi0gIHNjb3BlICAgICAgICVTY29wZTsgICAgICAgICNJTVBMSUVEICAtLSBzY29wZSBjb3ZlcmVkIGJ5IGhlYWRlciBjZWxscyAtLQotICByb3dzcGFuICAgICBOVU1CRVIgICAgICAgICAxICAgICAgICAgLS0gbnVtYmVyIG9mIHJvd3Mgc3Bhbm5lZCBieSBjZWxsIC0tCi0gIGNvbHNwYW4gICAgIE5VTUJFUiAgICAgICAgIDEgICAgICAgICAtLSBudW1iZXIgb2YgY29scyBzcGFubmVkIGJ5IGNlbGwgLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgbm93cmFwICAgICAgKG5vd3JhcCkgICAgICAgI0lNUExJRUQgIC0tIHN1cHByZXNzIHdvcmQgd3JhcCAtLQotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gY2VsbCBiYWNrZ3JvdW5kIGNvbG9yIC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSB3aWR0aCBmb3IgY2VsbCAtLQotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gaGVpZ2h0IGZvciBjZWxsIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBEb2N1bWVudCBGcmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICBUaGUgY29udGVudCBtb2RlbCBmb3IgSFRNTCBkb2N1bWVudHMgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBIRUFEIGlzCi0gIGZvbGxvd2VkIGJ5IGEgRlJBTUVTRVQgb3IgQk9EWSBlbGVtZW50LiBUaGUgd2lkZXNwcmVhZCBvbWlzc2lvbiBvZgotICB0aGUgQk9EWSBzdGFydCB0YWcgbWFrZXMgaXQgaW1wcmFjdGljYWwgdG8gZGVmaW5lIHRoZSBjb250ZW50IG1vZGVsCi0gIHdpdGhvdXQgdGhlIHVzZSBvZiBhIG1hcmtlZCBzZWN0aW9uLgotLS0+Ci0KLTwhWyAlSFRNTC5GcmFtZXNldDsgWwotPCFFTEVNRU5UIEZSQU1FU0VUIC0gLSAoKEZSQU1FU0VUfEZSQU1FKSsgJiBOT0ZSQU1FUz8pIC0tIHdpbmRvdyBzdWJkaXZpc2lvbi0tPgotPCFBVFRMSVNUIEZSQU1FU0VUCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICByb3dzICAgICAgICAlTXVsdGlMZW5ndGhzOyAjSU1QTElFRCAgLS0gbGlzdCBvZiBsZW5ndGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogMTAwJSAoMSByb3cpIC0tCi0gIGNvbHMgICAgICAgICVNdWx0aUxlbmd0aHM7ICNJTVBMSUVEICAtLSBsaXN0IG9mIGxlbmd0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAxMDAlICgxIGNvbCkgLS0KLSAgb25sb2FkICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGFsbCB0aGUgZnJhbWVzIGhhdmUgYmVlbiBsb2FkZWQgIC0tIAotICBvbnVubG9hZCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYWxsIHRoZSBmcmFtZXMgaGF2ZSBiZWVuIHJlbW92ZWQgLS0gCi0gID4KLV1dPgotCi08IVsgJUhUTUwuRnJhbWVzZXQ7IFsKLTwhLS0gcmVzZXJ2ZWQgZnJhbWUgbmFtZXMgc3RhcnQgd2l0aCAiXyIgb3RoZXJ3aXNlIHN0YXJ0cyB3aXRoIGxldHRlciAtLT4KLTwhRUxFTUVOVCBGUkFNRSAtIE8gRU1QVFkgICAgICAgICAgICAgIC0tIHN1YndpbmRvdyAtLT4KLTwhQVRUTElTVCBGUkFNRQotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGxpbmsgdG8gbG9uZyBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBsZW1lbnRzIHRpdGxlKSAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gbmFtZSBvZiBmcmFtZSBmb3IgdGFyZ2V0dGluZyAtLQotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gc291cmNlIG9mIGZyYW1lIGNvbnRlbnQgLS0KLSAgZnJhbWVib3JkZXIgKDF8MCkgICAgICAgICAgMSAgICAgICAgIC0tIHJlcXVlc3QgZnJhbWUgYm9yZGVycz8gLS0KLSAgbWFyZ2lud2lkdGggJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIG1hcmdpbiB3aWR0aHMgaW4gcGl4ZWxzIC0tCi0gIG1hcmdpbmhlaWdodCAlUGl4ZWxzOyAgICAgICNJTVBMSUVEICAtLSBtYXJnaW4gaGVpZ2h0IGluIHBpeGVscyAtLQotICBub3Jlc2l6ZSAgICAobm9yZXNpemUpICAgICAjSU1QTElFRCAgLS0gYWxsb3cgdXNlcnMgdG8gcmVzaXplIGZyYW1lcz8gLS0KLSAgc2Nyb2xsaW5nICAgKHllc3xub3xhdXRvKSAgYXV0byAgICAgIC0tIHNjcm9sbGJhciBvciBub25lIC0tCi0gID4KLV1dPgotCi08IUVMRU1FTlQgSUZSQU1FIC0gLSAoJWZsb3c7KSogICAgICAgICAtLSBpbmxpbmUgc3Vid2luZG93IC0tPgotPCFBVFRMSVNUIElGUkFNRQotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGxpbmsgdG8gbG9uZyBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBsZW1lbnRzIHRpdGxlKSAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gbmFtZSBvZiBmcmFtZSBmb3IgdGFyZ2V0dGluZyAtLQotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gc291cmNlIG9mIGZyYW1lIGNvbnRlbnQgLS0KLSAgZnJhbWVib3JkZXIgKDF8MCkgICAgICAgICAgMSAgICAgICAgIC0tIHJlcXVlc3QgZnJhbWUgYm9yZGVycz8gLS0KLSAgbWFyZ2lud2lkdGggJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIG1hcmdpbiB3aWR0aHMgaW4gcGl4ZWxzIC0tCi0gIG1hcmdpbmhlaWdodCAlUGl4ZWxzOyAgICAgICNJTVBMSUVEICAtLSBtYXJnaW4gaGVpZ2h0IGluIHBpeGVscyAtLQotICBzY3JvbGxpbmcgICAoeWVzfG5vfGF1dG8pICBhdXRvICAgICAgLS0gc2Nyb2xsYmFyIG9yIG5vbmUgLS0KLSAgYWxpZ24gICAgICAgJUlBbGlnbjsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIG9yIGhvcml6b250YWwgYWxpZ25tZW50IC0tCi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBmcmFtZSBoZWlnaHQgLS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIGZyYW1lIHdpZHRoIC0tCi0gID4KLQotPCFbICVIVE1MLkZyYW1lc2V0OyBbCi08IUVOVElUWSAlIG5vZnJhbWVzLmNvbnRlbnQgIihCT0RZKSAtKE5PRlJBTUVTKSI+Ci1dXT4KLQotPCFFTlRJVFkgJSBub2ZyYW1lcy5jb250ZW50ICIoJWZsb3c7KSoiPgotCi08IUVMRU1FTlQgTk9GUkFNRVMgLSAtICVub2ZyYW1lcy5jb250ZW50OwotIC0tIGFsdGVybmF0ZSBjb250ZW50IGNvbnRhaW5lciBmb3Igbm9uIGZyYW1lLWJhc2VkIHJlbmRlcmluZyAtLT4KLTwhQVRUTElTVCBOT0ZSQU1FUwotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBIZWFkID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSAlaGVhZC5taXNjOyBkZWZpbmVkIGVhcmxpZXIgb24gYXMgIlNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUIiAtLT4KLTwhRU5USVRZICUgaGVhZC5jb250ZW50ICJUSVRMRSAmIElTSU5ERVg/ICYgQkFTRT8iPgotCi08IUVMRU1FTlQgSEVBRCBPIE8gKCVoZWFkLmNvbnRlbnQ7KSArKCVoZWFkLm1pc2M7KSAtLSBkb2N1bWVudCBoZWFkIC0tPgotPCFBVFRMSVNUIEhFQUQKLSAgJWkxOG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciAtLQotICBwcm9maWxlICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gbmFtZWQgZGljdGlvbmFyeSBvZiBtZXRhIGluZm8gLS0KLSAgPgotCi08IS0tIFRoZSBUSVRMRSBlbGVtZW50IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGZsb3cgb2YgdGV4dC4KLSAgICAgICBJdCBzaG91bGQgYmUgZGlzcGxheWVkLCBmb3IgZXhhbXBsZSBhcyB0aGUgcGFnZSBoZWFkZXIgb3IKLSAgICAgICB3aW5kb3cgdGl0bGUuIEV4YWN0bHkgb25lIHRpdGxlIGlzIHJlcXVpcmVkIHBlciBkb2N1bWVudC4KLSAgICAtLT4KLTwhRUxFTUVOVCBUSVRMRSAtIC0gKCNQQ0RBVEEpIC0oJWhlYWQubWlzYzspIC0tIGRvY3VtZW50IHRpdGxlIC0tPgotPCFBVFRMSVNUIFRJVExFICVpMThuPgotCi08IUVMRU1FTlQgSVNJTkRFWCAtIE8gRU1QVFkgICAgICAgICAgICAtLSBzaW5nbGUgbGluZSBwcm9tcHQgLS0+Ci08IUFUVExJU1QgSVNJTkRFWAotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgJWkxOG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciAtLQotICBwcm9tcHQgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gcHJvbXB0IG1lc3NhZ2UgLS0+Ci0KLTwhRUxFTUVOVCBCQVNFIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGRvY3VtZW50IGJhc2UgVVJJIC0tPgotPCFBVFRMSVNUIEJBU0UKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSB0aGF0IGFjdHMgYXMgYmFzZSBVUkkgLS0KLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQgIC0tIHJlbmRlciBpbiB0aGlzIGZyYW1lIC0tCi0gID4KLQotPCFFTEVNRU5UIE1FVEEgLSBPIEVNUFRZICAgICAgICAgICAgICAgLS0gZ2VuZXJpYyBtZXRhaW5mb3JtYXRpb24gLS0+Ci08IUFUVExJU1QgTUVUQQotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyLCBmb3IgdXNlIHdpdGggY29udGVudCAtLQotICBodHRwLWVxdWl2ICBOQU1FICAgICAgICAgICAjSU1QTElFRCAgLS0gSFRUUCByZXNwb25zZSBoZWFkZXIgbmFtZSAgLS0KLSAgbmFtZSAgICAgICAgTkFNRSAgICAgICAgICAgI0lNUExJRUQgIC0tIG1ldGFpbmZvcm1hdGlvbiBuYW1lIC0tCi0gIGNvbnRlbnQgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRCAtLSBhc3NvY2lhdGVkIGluZm9ybWF0aW9uIC0tCi0gIHNjaGVtZSAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzZWxlY3QgZm9ybSBvZiBjb250ZW50IC0tCi0gID4KLQotPCFFTEVNRU5UIFNUWUxFIC0gLSAlU3R5bGVTaGVldCAgICAgICAgLS0gc3R5bGUgaW5mbyAtLT4KLTwhQVRUTElTVCBTVFlMRQotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyLCBmb3IgdXNlIHdpdGggdGl0bGUgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI1JFUVVJUkVEIC0tIGNvbnRlbnQgdHlwZSBvZiBzdHlsZSBsYW5ndWFnZSAtLQotICBtZWRpYSAgICAgICAlTWVkaWFEZXNjOyAgICAjSU1QTElFRCAgLS0gZGVzaWduZWQgZm9yIHVzZSB3aXRoIHRoZXNlIG1lZGlhIC0tCi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBhZHZpc29yeSB0aXRsZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBTQ1JJUFQgLSAtICVTY3JpcHQ7ICAgICAgICAgIC0tIHNjcmlwdCBzdGF0ZW1lbnRzIC0tPgotPCFBVFRMSVNUIFNDUklQVAotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRCAgLS0gY2hhciBlbmNvZGluZyBvZiBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI1JFUVVJUkVEIC0tIGNvbnRlbnQgdHlwZSBvZiBzY3JpcHQgbGFuZ3VhZ2UgLS0KLSAgbGFuZ3VhZ2UgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHByZWRlZmluZWQgc2NyaXB0IGxhbmd1YWdlIG5hbWUgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgYW4gZXh0ZXJuYWwgc2NyaXB0IC0tCi0gIGRlZmVyICAgICAgIChkZWZlcikgICAgICAgICNJTVBMSUVEICAtLSBVQSBtYXkgZGVmZXIgZXhlY3V0aW9uIG9mIHNjcmlwdCAtLQotICBldmVudCAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgZm9yICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIE5PU0NSSVBUIC0gLSAoJWZsb3c7KSoKLSAgLS0gYWx0ZXJuYXRlIGNvbnRlbnQgY29udGFpbmVyIGZvciBub24gc2NyaXB0LWJhc2VkIHJlbmRlcmluZyAtLT4KLTwhQVRUTElTVCBOT1NDUklQVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBTdHJ1Y3R1cmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCFFTlRJVFkgJSB2ZXJzaW9uICJ2ZXJzaW9uIENEQVRBICNGSVhFRCAnJUhUTUwuVmVyc2lvbjsnIj4KLQotPCFbICVIVE1MLkZyYW1lc2V0OyBbCi08IUVOVElUWSAlIGh0bWwuY29udGVudCAiSEVBRCwgRlJBTUVTRVQiPgotXV0+Ci0KLTwhRU5USVRZICUgaHRtbC5jb250ZW50ICJIRUFELCBCT0RZIj4KLQotPCFFTEVNRU5UIEhUTUwgTyBPICglaHRtbC5jb250ZW50OykgICAgLS0gZG9jdW1lbnQgcm9vdCBlbGVtZW50IC0tPgotPCFBVFRMSVNUIEhUTUwKLSAgJWkxOG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciAtLQotICAldmVyc2lvbjsKLSAgPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3N0cmljdC5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvc3RyaWN0LmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAzMmNiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvc3RyaWN0LmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDg3MCArMCwwIEBACi08IS0tCi0gICAgVGhpcyBpcyBIVE1MIDQuMDEgU3RyaWN0IERURCwgd2hpY2ggZXhjbHVkZXMgdGhlIHByZXNlbnRhdGlvbiAKLSAgICBhdHRyaWJ1dGVzIGFuZCBlbGVtZW50cyB0aGF0IFczQyBleHBlY3RzIHRvIHBoYXNlIG91dCBhcyAKLSAgICBzdXBwb3J0IGZvciBzdHlsZSBzaGVldHMgbWF0dXJlcy4gQXV0aG9ycyBzaG91bGQgdXNlIHRoZSBTdHJpY3QKLSAgICBEVEQgd2hlbiBwb3NzaWJsZSwgYnV0IG1heSB1c2UgdGhlIFRyYW5zaXRpb25hbCBEVEQgd2hlbiBzdXBwb3J0Ci0gICAgZm9yIHByZXNlbnRhdGlvbiBhdHRyaWJ1dGUgYW5kIGVsZW1lbnRzIGlzIHJlcXVpcmVkLgotICAgIAotICAgIEhUTUwgNCBpbmNsdWRlcyBtZWNoYW5pc21zIGZvciBzdHlsZSBzaGVldHMsIHNjcmlwdGluZywKLSAgICBlbWJlZGRpbmcgb2JqZWN0cywgaW1wcm92ZWQgc3VwcG9ydCBmb3IgcmlnaHQgdG8gbGVmdCBhbmQgbWl4ZWQKLSAgICBkaXJlY3Rpb24gdGV4dCwgYW5kIGVuaGFuY2VtZW50cyB0byBmb3JtcyBmb3IgaW1wcm92ZWQKLSAgICBhY2Nlc3NpYmlsaXR5IGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMuCi0KLSAgICAgICAgICBEcmFmdDogJERhdGU6IDIwMDgvMDcvMjIgMDc6Mzc6MDEgJAotCi0gICAgICAgICAgQXV0aG9yczoKLSAgICAgICAgICAgICAgRGF2ZSBSYWdnZXR0IDxkc3JAdzMub3JnPgotICAgICAgICAgICAgICBBcm5hdWQgTGUgSG9ycyA8bGVob3JzQHczLm9yZz4KLSAgICAgICAgICAgICAgSWFuIEphY29icyA8aWpAdzMub3JnPgotCi0gICAgRnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBIVE1MIDQuMDEgaXMgYXZhaWxhYmxlIGF0OgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQKLQotCi0gICAgVGhlIEhUTUwgNC4wMSBzcGVjaWZpY2F0aW9uIGluY2x1ZGVzIGFkZGl0aW9uYWwKLSAgICBzeW50YWN0aWMgY29uc3RyYWludHMgdGhhdCBjYW5ub3QgYmUgZXhwcmVzc2VkIHdpdGhpbgotICAgIHRoZSBEVERzLgotCi0tLT4KLTwhLS0KLSAgICBUeXBpY2FsIHVzYWdlOgotCi0gICAgPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPgotICAgIDxodG1sPgotICAgIDxoZWFkPgotICAgIC4uLgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAuLi4KLSAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotCi0gICAgVGhlIFVSSSB1c2VkIGFzIGEgc3lzdGVtIGlkZW50aWZpZXIgd2l0aCB0aGUgcHVibGljIGlkZW50aWZpZXIgYWxsb3dzCi0gICAgdGhlIHVzZXIgYWdlbnQgdG8gZG93bmxvYWQgdGhlIERURCBhbmQgZW50aXR5IHNldHMgYXMgbmVlZGVkLgotCi0gICAgVGhlIEZQSSBmb3IgdGhlIFRyYW5zaXRpb25hbCBIVE1MIDQuMDEgRFREIGlzOgotCi0gICAgICAgICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLQotICAgIFRoaXMgdmVyc2lvbiBvZiB0aGUgdHJhbnNpdGlvbmFsIERURCBpczoKLQotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZAotCi0gICAgSWYgeW91IGFyZSB3cml0aW5nIGEgZG9jdW1lbnQgdGhhdCBpbmNsdWRlcyBmcmFtZXMsIHVzZSAKLSAgICB0aGUgZm9sbG93aW5nIEZQSToKLQotICAgICAgICAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIEZyYW1lc2V0Ly9FTiIKLQotICAgIFRoaXMgdmVyc2lvbiBvZiB0aGUgZnJhbWVzZXQgRFREIGlzOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvZnJhbWVzZXQuZHRkCi0KLSAgICBVc2UgdGhlIGZvbGxvd2luZyAocmVsYXRpdmUpIFVSSXMgdG8gcmVmZXIgdG8gCi0gICAgdGhlIERURHMgYW5kIGVudGl0eSBkZWZpbml0aW9ucyBvZiB0aGlzIHNwZWNpZmljYXRpb246Ci0KLSAgICAic3RyaWN0LmR0ZCIKLSAgICAibG9vc2UuZHRkIgotICAgICJmcmFtZXNldC5kdGQiCi0gICAgIkhUTUxsYXQxLmVudCIKLSAgICAiSFRNTHN5bWJvbC5lbnQiCi0gICAgIkhUTUxzcGVjaWFsLmVudCIKLQotLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gSW1wb3J0ZWQgTmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIEZlYXR1cmUgU3dpdGNoIGZvciBmcmFtZXNldCBkb2N1bWVudHMgLS0+Ci08IUVOVElUWSAlIEhUTUwuRnJhbWVzZXQgIklHTk9SRSI+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGUgIkNEQVRBIgotICAgIC0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDb250ZW50VHlwZXMgIkNEQVRBIgotICAgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIHR5cGVzLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldCAiQ0RBVEEiCi0gICAgLS0gYSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFzIHBlciBbUkZDMjA0NV0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDaGFyc2V0cyAiQ0RBVEEiCi0gICAgLS0gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTGFuZ3VhZ2VDb2RlICJOQU1FIgotICAgIC0tIGEgbGFuZ3VhZ2UgY29kZSwgYXMgcGVyIFtSRkMxNzY2XQotICAgIC0tPgotCi08IUVOVElUWSAlIENoYXJhY3RlciAiQ0RBVEEiCi0gICAgLS0gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gW0lTTzEwNjQ2XSAKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBMaW5rVHlwZXMgIkNEQVRBIgotICAgIC0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBNZWRpYURlc2MgIkNEQVRBIgotICAgIC0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycwotICAgIC0tPgotCi08IUVOVElUWSAlIFVSSSAiQ0RBVEEiCi0gICAgLS0gYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIsCi0gICAgICAgc2VlIFtVUkldCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgRGF0ZXRpbWUgIkNEQVRBIiAtLSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uLiBJU08gZGF0ZSBmb3JtYXQgLS0+Ci0KLQotPCFFTlRJVFkgJSBTY3JpcHQgIkNEQVRBIiAtLSBzY3JpcHQgZXhwcmVzc2lvbiAtLT4KLQotPCFFTlRJVFkgJSBTdHlsZVNoZWV0ICJDREFUQSIgLS0gc3R5bGUgc2hlZXQgZGF0YSAtLT4KLQotCi0KLTwhRU5USVRZICUgVGV4dCAiQ0RBVEEiPgotCi0KLTwhLS0gUGFyYW1ldGVyIEVudGl0aWVzIC0tPgotCi08IUVOVElUWSAlIGhlYWQubWlzYyAiU0NSSVBUfFNUWUxFfE1FVEF8TElOS3xPQkpFQ1QiIC0tIHJlcGVhdGFibGUgaGVhZCBlbGVtZW50cyAtLT4KLQotPCFFTlRJVFkgJSBoZWFkaW5nICJIMXxIMnxIM3xINHxINXxINiI+Ci0KLTwhRU5USVRZICUgbGlzdCAiVUwgfCBPTCI+Ci0KLTwhRU5USVRZICUgcHJlZm9ybWF0dGVkICJQUkUiPgotCi0KLTwhLS09PT09PT09PT09PT09PT09IENoYXJhY3RlciBtbmVtb25pYyBlbnRpdGllcyA9PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgSFRNTGxhdDEgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbjEvL0VOLy9IVE1MIgotICAgIkhUTUxsYXQxLmVudCI+Ci0lSFRNTGxhdDE7Ci0KLTwhRU5USVRZICUgSFRNTHN5bWJvbCBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMvL0VOLy9IVE1MIgotICAgIkhUTUxzeW1ib2wuZW50Ij4KLSVIVE1Mc3ltYm9sOwotCi08IUVOVElUWSAlIEhUTUxzcGVjaWFsIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbC8vRU4vL0hUTUwiCi0gICAiSFRNTHNwZWNpYWwuZW50Ij4KLSVIVE1Mc3BlY2lhbDsKLTwhLS09PT09PT09PT09PT09PT09PT09IEdlbmVyaWMgQXR0cmlidXRlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgY29yZWF0dHJzCi0gImlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVEICAtLSBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZCAtLQotICBjbGFzcyAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3NlcyAtLQotICBzdHlsZSAgICAgICAlU3R5bGVTaGVldDsgICAjSU1QTElFRCAgLS0gYXNzb2NpYXRlZCBzdHlsZSBpbmZvIC0tCi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBhZHZpc29yeSB0aXRsZSAtLSIKLSAgPgotCi08IUVOVElUWSAlIGkxOG4KLSAibGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI0lNUExJRUQgIC0tIGRpcmVjdGlvbiBmb3Igd2Vhay9uZXV0cmFsIHRleHQgLS0iCi0gID4KLQotPCFFTlRJVFkgJSBldmVudHMKLSAib25jbGljayAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIGNsaWNrZWQgLS0KLSAgb25kYmxjbGljayAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIGRvdWJsZSBjbGlja2VkLS0KLSAgb25tb3VzZWRvd24gJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIHByZXNzZWQgZG93biAtLQotICBvbm1vdXNldXAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIGJ1dHRvbiB3YXMgcmVsZWFzZWQgLS0KLSAgb25tb3VzZW92ZXIgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgb250byAtLQotICBvbm1vdXNlbW92ZSAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIHdhcyBtb3ZlZCB3aXRoaW4gLS0KLSAgb25tb3VzZW91dCAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgYXdheSAtLQotICBvbmtleXByZXNzICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBrZXkgd2FzIHByZXNzZWQgYW5kIHJlbGVhc2VkIC0tCi0gIG9ua2V5ZG93biAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIGtleSB3YXMgcHJlc3NlZCBkb3duIC0tCi0gIG9ua2V5dXAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIGtleSB3YXMgcmVsZWFzZWQgLS0iCi0gID4KLQotPCEtLSBSZXNlcnZlZCBGZWF0dXJlIFN3aXRjaCAtLT4KLTwhRU5USVRZICUgSFRNTC5SZXNlcnZlZCAiSUdOT1JFIj4KLQotPCEtLSBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tPgotPCFbICVIVE1MLlJlc2VydmVkOyBbCi08IUVOVElUWSAlIHJlc2VydmVkCi0gImRhdGFzcmMgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBhIHNpbmdsZSBvciB0YWJ1bGFyIERhdGEgU291cmNlIC0tCi0gIGRhdGFmbGQgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSB0aGUgcHJvcGVydHkgb3IgY29sdW1uIG5hbWUgLS0KLSAgZGF0YWZvcm1hdGFzIChwbGFpbnRleHR8aHRtbCkgcGxhaW50ZXh0IC0tIHRleHQgb3IgaHRtbCAtLSIKLSAgPgotXV0+Ci0KLTwhRU5USVRZICUgcmVzZXJ2ZWQgIiI+Ci0KLTwhRU5USVRZICUgYXR0cnMgIiVjb3JlYXR0cnM7ICVpMThuOyAlZXZlbnRzOyI+Ci0KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gVGV4dCBNYXJrdXAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBmb250c3R5bGUKLSAiVFQgfCBJIHwgQiB8IEJJRyB8IFNNQUxMIj4KLQotPCFFTlRJVFkgJSBwaHJhc2UgIkVNIHwgU1RST05HIHwgREZOIHwgQ09ERSB8Ci0gICAgICAgICAgICAgICAgICAgU0FNUCB8IEtCRCB8IFZBUiB8IENJVEUgfCBBQkJSIHwgQUNST05ZTSIgPgotCi08IUVOVElUWSAlIHNwZWNpYWwKLSAgICJBIHwgSU1HIHwgT0JKRUNUIHwgQlIgfCBTQ1JJUFQgfCBNQVAgfCBRIHwgU1VCIHwgU1VQIHwgU1BBTiB8IEJETyI+Ci0KLTwhRU5USVRZICUgZm9ybWN0cmwgIklOUFVUIHwgU0VMRUNUIHwgVEVYVEFSRUEgfCBMQUJFTCB8IEJVVFRPTiI+Ci0KLTwhLS0gJWlubGluZTsgY292ZXJzIGlubGluZSBvciAidGV4dC1sZXZlbCIgZWxlbWVudHMgLS0+Ci08IUVOVElUWSAlIGlubGluZSAiI1BDREFUQSB8ICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlc3BlY2lhbDsgfCAlZm9ybWN0cmw7Ij4KLQotPCFFTEVNRU5UICglZm9udHN0eWxlO3wlcGhyYXNlOykgLSAtICglaW5saW5lOykqPgotPCFBVFRMSVNUICglZm9udHN0eWxlO3wlcGhyYXNlOykKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCFFTEVNRU5UIChTVUJ8U1VQKSAtIC0gKCVpbmxpbmU7KSogICAgLS0gc3Vic2NyaXB0LCBzdXBlcnNjcmlwdCAtLT4KLTwhQVRUTElTVCAoU1VCfFNVUCkKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCFFTEVNRU5UIFNQQU4gLSAtICglaW5saW5lOykqICAgICAgICAgLS0gZ2VuZXJpYyBsYW5ndWFnZS9zdHlsZSBjb250YWluZXIgLS0+Ci08IUFUVExJU1QgU1BBTgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJXJlc2VydmVkOwkJCSAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBCRE8gLSAtICglaW5saW5lOykqICAgICAgICAgIC0tIEkxOE4gQmlEaSBvdmVyLXJpZGUgLS0+Ci08IUFUVExJU1QgQkRPCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICBsYW5nICAgICAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCAgLS0gbGFuZ3VhZ2UgY29kZSAtLQotICBkaXIgICAgICAgICAobHRyfHJ0bCkgICAgICAjUkVRVUlSRUQgLS0gZGlyZWN0aW9uYWxpdHkgLS0KLSAgPgotCi0KLTwhRUxFTUVOVCBCUiAtIE8gRU1QVFkgICAgICAgICAgICAgICAgIC0tIGZvcmNlZCBsaW5lIGJyZWFrIC0tPgotPCFBVFRMSVNUIEJSCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gSFRNTCBjb250ZW50IG1vZGVscyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgICBIVE1MIGhhcyB0d28gYmFzaWMgY29udGVudCBtb2RlbHM6Ci0KLSAgICAgICAgJWlubGluZTsgICAgIGNoYXJhY3RlciBsZXZlbCBlbGVtZW50cyBhbmQgdGV4dCBzdHJpbmdzCi0gICAgICAgICVibG9jazsgICAgICBibG9jay1saWtlIGVsZW1lbnRzIGUuZy4gcGFyYWdyYXBocyBhbmQgbGlzdHMKLS0tPgotCi08IUVOVElUWSAlIGJsb2NrCi0gICAgICJQIHwgJWhlYWRpbmc7IHwgJWxpc3Q7IHwgJXByZWZvcm1hdHRlZDsgfCBETCB8IERJViB8IE5PU0NSSVBUIHwKLSAgICAgIEJMT0NLUVVPVEUgfCBGT1JNIHwgSFIgfCBUQUJMRSB8IEZJRUxEU0VUIHwgQUREUkVTUyI+Ci0KLTwhRU5USVRZICUgZmxvdyAiJWJsb2NrOyB8ICVpbmxpbmU7Ij4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgQm9keSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEJPRFkgTyBPICglYmxvY2s7fFNDUklQVCkrICsoSU5TfERFTCkgLS0gZG9jdW1lbnQgYm9keSAtLT4KLTwhQVRUTElTVCBCT0RZCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBvbmxvYWQgICAgICAgICAgJVNjcmlwdDsgICAjSU1QTElFRCAgLS0gdGhlIGRvY3VtZW50IGhhcyBiZWVuIGxvYWRlZCAtLQotICBvbnVubG9hZCAgICAgICAgJVNjcmlwdDsgICAjSU1QTElFRCAgLS0gdGhlIGRvY3VtZW50IGhhcyBiZWVuIHJlbW92ZWQgLS0KLSAgPgotCi08IUVMRU1FTlQgQUREUkVTUyAtIC0gKCVpbmxpbmU7KSogLS0gaW5mb3JtYXRpb24gb24gYXV0aG9yIC0tPgotPCFBVFRMSVNUIEFERFJFU1MKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCFFTEVNRU5UIERJViAtIC0gKCVmbG93OykqICAgICAgICAgICAgLS0gZ2VuZXJpYyBsYW5ndWFnZS9zdHlsZSBjb250YWluZXIgLS0+Ci08IUFUVExJU1QgRElWCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIEFuY2hvciBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgU2hhcGUgIihyZWN0fGNpcmNsZXxwb2x5fGRlZmF1bHQpIj4KLTwhRU5USVRZICUgQ29vcmRzICJDREFUQSIgLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbGVuZ3RocyAtLT4KLQotPCFFTEVNRU5UIEEgLSAtICglaW5saW5lOykqIC0oQSkgICAgICAgLS0gYW5jaG9yIC0tPgotPCFBVFRMSVNUIEEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgY29udGVudCB0eXBlIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lZCBsaW5rIGVuZCAtLQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgcmVsICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIGZvcndhcmQgbGluayB0eXBlcyAtLQotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRCAgLS0gcmV2ZXJzZSBsaW5rIHR5cGVzIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgc2hhcGUgICAgICAgJVNoYXBlOyAgICAgICAgcmVjdCAgICAgIC0tIGZvciB1c2Ugd2l0aCBjbGllbnQtc2lkZSBpbWFnZSBtYXBzIC0tCi0gIGNvb3JkcyAgICAgICVDb29yZHM7ICAgICAgICNJTVBMSUVEICAtLSBmb3IgdXNlIHdpdGggY2xpZW50LXNpZGUgaW1hZ2UgbWFwcyAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IENsaWVudC1zaWRlIGltYWdlIG1hcHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFRoZXNlIGNhbiBiZSBwbGFjZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgb3IgZ3JvdXBlZCBpbiBhCi0gICAgIHNlcGFyYXRlIGRvY3VtZW50IGFsdGhvdWdoIHRoaXMgaXNuJ3QgeWV0IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhRUxFTUVOVCBNQVAgLSAtICgoJWJsb2NrOykgfCBBUkVBKSsgLS0gY2xpZW50LXNpZGUgaW1hZ2UgbWFwIC0tPgotPCFBVFRMSVNUIE1BUAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVEIC0tIGZvciByZWZlcmVuY2UgYnkgdXNlbWFwIC0tCi0gID4KLQotPCFFTEVNRU5UIEFSRUEgLSBPIEVNUFRZICAgICAgICAgICAgICAgLS0gY2xpZW50LXNpZGUgaW1hZ2UgbWFwIGFyZWEgLS0+Ci08IUFUVExJU1QgQVJFQQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc2hhcGUgICAgICAgJVNoYXBlOyAgICAgICAgcmVjdCAgICAgIC0tIGNvbnRyb2xzIGludGVycHJldGF0aW9uIG9mIGNvb3JkcyAtLQotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRCAgLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbGVuZ3RocyAtLQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgbm9ocmVmICAgICAgKG5vaHJlZikgICAgICAgI0lNUExJRUQgIC0tIHRoaXMgcmVnaW9uIGhhcyBubyBhY3Rpb24gLS0KLSAgYWx0ICAgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVEIC0tIHNob3J0IGRlc2NyaXB0aW9uIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBUaGUgTElOSyBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICBSZWxhdGlvbnNoaXAgdmFsdWVzIGNhbiBiZSB1c2VkIGluIHByaW5jaXBsZToKLQotICAgYSkgZm9yIGRvY3VtZW50IHNwZWNpZmljIHRvb2xiYXJzL21lbnVzIHdoZW4gdXNlZAotICAgICAgd2l0aCB0aGUgTElOSyBlbGVtZW50IGluIGRvY3VtZW50IGhlYWQgZS5nLgotICAgICAgICBzdGFydCwgY29udGVudHMsIHByZXZpb3VzLCBuZXh0LCBpbmRleCwgZW5kLCBoZWxwCi0gICBiKSB0byBsaW5rIHRvIGEgc2VwYXJhdGUgc3R5bGUgc2hlZXQgKHJlbD1zdHlsZXNoZWV0KQotICAgYykgdG8gbWFrZSBhIGxpbmsgdG8gYSBzY3JpcHQgKHJlbD1zY3JpcHQpCi0gICBkKSBieSBzdHlsZXNoZWV0cyB0byBjb250cm9sIGhvdyBjb2xsZWN0aW9ucyBvZgotICAgICAgaHRtbCBub2RlcyBhcmUgcmVuZGVyZWQgaW50byBwcmludGVkIGRvY3VtZW50cwotICAgZSkgdG8gbWFrZSBhIGxpbmsgdG8gYSBwcmludGFibGUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBlLmcuIGEgcG9zdHNjcmlwdCBvciBwZGYgdmVyc2lvbiAocmVsPWFsdGVybmF0ZSBtZWRpYT1wcmludCkKLS0tPgotCi08IUVMRU1FTlQgTElOSyAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBhIG1lZGlhLWluZGVwZW5kZW50IGxpbmsgLS0+Ci08IUFUVExJU1QgTElOSwotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQgIC0tIGNoYXIgZW5jb2Rpbmcgb2YgbGlua2VkIHJlc291cmNlIC0tCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIGxpbmtlZCByZXNvdXJjZSAtLQotICBocmVmbGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCAgLS0gbGFuZ3VhZ2UgY29kZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgY29udGVudCB0eXBlIC0tCi0gIHJlbCAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSBmb3J3YXJkIGxpbmsgdHlwZXMgLS0KLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIHJldmVyc2UgbGluayB0eXBlcyAtLQotICBtZWRpYSAgICAgICAlTWVkaWFEZXNjOyAgICAjSU1QTElFRCAgLS0gZm9yIHJlbmRlcmluZyBvbiB0aGVzZSBtZWRpYSAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEltYWdlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gTGVuZ3RoIGRlZmluZWQgaW4gc3RyaWN0IERURCBmb3IgY2VsbHBhZGRpbmcvY2VsbHNwYWNpbmcgLS0+Ci08IUVOVElUWSAlIExlbmd0aCAiQ0RBVEEiIC0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLTwhRU5USVRZICUgTXVsdGlMZW5ndGggIkNEQVRBIiAtLSBwaXhlbCwgcGVyY2VudGFnZSwgb3IgcmVsYXRpdmUgLS0+Ci0KLTwhWyAlSFRNTC5GcmFtZXNldDsgWwotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aHMgIkNEQVRBIiAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBNdWx0aUxlbmd0aCAtLT4KLV1dPgotCi08IUVOVElUWSAlIFBpeGVscyAiQ0RBVEEiIC0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci0KLQotPCEtLSBUbyBhdm9pZCBwcm9ibGVtcyB3aXRoIHRleHQtb25seSBVQXMgYXMgd2VsbCBhcyAKLSAgIHRvIG1ha2UgaW1hZ2UgY29udGVudCB1bmRlcnN0YW5kYWJsZSBhbmQgbmF2aWdhYmxlIAotICAgdG8gdXNlcnMgb2Ygbm9uLXZpc3VhbCBVQXMsIHlvdSBuZWVkIHRvIHByb3ZpZGUKLSAgIGEgZGVzY3JpcHRpb24gd2l0aCBBTFQsIGFuZCBhdm9pZCBzZXJ2ZXItc2lkZSBpbWFnZSBtYXBzIC0tPgotPCFFTEVNRU5UIElNRyAtIE8gRU1QVFkgICAgICAgICAgICAgICAgLS0gRW1iZWRkZWQgaW1hZ2UgLS0+Ci08IUFUVExJU1QgSU1HCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjUkVRVUlSRUQgLS0gVVJJIG9mIGltYWdlIHRvIGVtYmVkIC0tCi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRCAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICBsb25nZGVzYyAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gbGluayB0byBsb25nIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcGxlbWVudHMgYWx0KSAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gbmFtZSBvZiBpbWFnZSBmb3Igc2NyaXB0aW5nIC0tCi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSBoZWlnaHQgLS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG92ZXJyaWRlIHdpZHRoIC0tCi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSB1c2UgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIC0tCi0gIGlzbWFwICAgICAgIChpc21hcCkgICAgICAgICNJTVBMSUVEICAtLSB1c2Ugc2VydmVyLXNpZGUgaW1hZ2UgbWFwIC0tCi0gID4KLQotPCEtLSBVU0VNQVAgcG9pbnRzIHRvIGEgTUFQIGVsZW1lbnQgd2hpY2ggbWF5IGJlIGluIHRoaXMgZG9jdW1lbnQKLSAgb3IgYW4gZXh0ZXJuYWwgZG9jdW1lbnQsIGFsdGhvdWdoIHRoZSBsYXR0ZXIgaXMgbm90IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PSBPQkpFQ1QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0KLSAgT0JKRUNUIGlzIHVzZWQgdG8gZW1iZWQgb2JqZWN0cyBhcyBwYXJ0IG9mIEhUTUwgcGFnZXMgCi0gIFBBUkFNIGVsZW1lbnRzIHNob3VsZCBwcmVjZWRlIG90aGVyIGNvbnRlbnQuIFNHTUwgbWl4ZWQgY29udGVudAotICBtb2RlbCB0ZWNobmljYWxpdHkgcHJlY2x1ZGVzIHNwZWNpZnlpbmcgdGhpcyBmb3JtYWxseSAuLi4KLS0tPgotCi08IUVMRU1FTlQgT0JKRUNUIC0gLSAoUEFSQU0gfCAlZmxvdzspKgotIC0tIGdlbmVyaWMgZW1iZWRkZWQgb2JqZWN0IC0tPgotPCFBVFRMSVNUIE9CSkVDVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgZGVjbGFyZSAgICAgKGRlY2xhcmUpICAgICAgI0lNUExJRUQgIC0tIGRlY2xhcmUgYnV0IGRvbid0IGluc3RhbnRpYXRlIGZsYWcgLS0KLSAgY2xhc3NpZCAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGlkZW50aWZpZXMgYW4gaW1wbGVtZW50YXRpb24gLS0KLSAgY29kZWJhc2UgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGJhc2UgVVJJIGZvciBjbGFzc2lkLCBkYXRhLCBhcmNoaXZlLS0KLSAgZGF0YSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHJlZmVyZW5jZSB0byBvYmplY3QncyBkYXRhIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBjb250ZW50IHR5cGUgZm9yIGRhdGEgLS0KLSAgY29kZXR5cGUgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGNvbnRlbnQgdHlwZSBmb3IgY29kZSAtLQotICBhcmNoaXZlICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcyAtLQotICBzdGFuZGJ5ICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gbWVzc2FnZSB0byBzaG93IHdoaWxlIGxvYWRpbmcgLS0KLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG92ZXJyaWRlIGhlaWdodCAtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb3ZlcnJpZGUgd2lkdGggLS0KLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHVzZSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHN1Ym1pdCBhcyBwYXJ0IG9mIGZvcm0gLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIFBBUkFNIC0gTyBFTVBUWSAgICAgICAgICAgICAgLS0gbmFtZWQgcHJvcGVydHkgdmFsdWUgLS0+Ci08IUFUVExJU1QgUEFSQU0KLSAgaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQgIC0tIGRvY3VtZW50LXdpZGUgdW5pcXVlIGlkIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRCAtLSBwcm9wZXJ0eSBuYW1lIC0tCi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBwcm9wZXJ0eSB2YWx1ZSAtLQotICB2YWx1ZXR5cGUgICAoREFUQXxSRUZ8T0JKRUNUKSBEQVRBICAgLS0gSG93IHRvIGludGVycHJldCB2YWx1ZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gY29udGVudCB0eXBlIGZvciB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB2YWx1ZXR5cGU9cmVmIC0tCi0gID4KLQotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIb3Jpem9udGFsIFJ1bGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgSFIgLSBPIEVNUFRZIC0tIGhvcml6b250YWwgcnVsZSAtLT4KLTwhQVRUTElTVCBIUgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBQYXJhZ3JhcGhzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgUCAtIE8gKCVpbmxpbmU7KSogICAgICAgICAgICAtLSBwYXJhZ3JhcGggLS0+Ci08IUFUVExJU1QgUAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIZWFkaW5ncyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFRoZXJlIGFyZSBzaXggbGV2ZWxzIG9mIGhlYWRpbmdzIGZyb20gSDEgKHRoZSBtb3N0IGltcG9ydGFudCkKLSAgdG8gSDYgKHRoZSBsZWFzdCBpbXBvcnRhbnQpLgotLS0+Ci0KLTwhRUxFTUVOVCAoJWhlYWRpbmc7KSAgLSAtICglaW5saW5lOykqIC0tIGhlYWRpbmcgLS0+Ci08IUFUVExJU1QgKCVoZWFkaW5nOykKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUHJlZm9ybWF0dGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBleGNsdWRlcyBtYXJrdXAgZm9yIGltYWdlcyBhbmQgY2hhbmdlcyBpbiBmb250IHNpemUgLS0+Ci08IUVOVElUWSAlIHByZS5leGNsdXNpb24gIklNR3xPQkpFQ1R8QklHfFNNQUxMfFNVQnxTVVAiPgotCi08IUVMRU1FTlQgUFJFIC0gLSAoJWlubGluZTspKiAtKCVwcmUuZXhjbHVzaW9uOykgLS0gcHJlZm9ybWF0dGVkIHRleHQgLS0+Ci08IUFUVExJU1QgUFJFCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT0gSW5saW5lIFF1b3RlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBRIC0gLSAoJWlubGluZTspKiAgICAgICAgICAgIC0tIHNob3J0IGlubGluZSBxdW90YXRpb24gLS0+Ci08IUFUVExJU1QgUQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3Igc291cmNlIGRvY3VtZW50IG9yIG1zZyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEJsb2NrLWxpa2UgUXVvdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBCTE9DS1FVT1RFIC0gLSAoJWJsb2NrO3xTQ1JJUFQpKyAtLSBsb25nIHF1b3RhdGlvbiAtLT4KLTwhQVRUTElTVCBCTE9DS1FVT1RFCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBzb3VyY2UgZG9jdW1lbnQgb3IgbXNnIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSW5zZXJ0ZWQvRGVsZXRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotCi08IS0tIElOUy9ERUwgYXJlIGhhbmRsZWQgYnkgaW5jbHVzaW9uIG9uIEJPRFkgLS0+Ci08IUVMRU1FTlQgKElOU3xERUwpIC0gLSAoJWZsb3c7KSogICAgICAtLSBpbnNlcnRlZCB0ZXh0LCBkZWxldGVkIHRleHQgLS0+Ci08IUFUVExJU1QgKElOU3xERUwpCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gaW5mbyBvbiByZWFzb24gZm9yIGNoYW5nZSAtLQotICBkYXRldGltZSAgICAlRGF0ZXRpbWU7ICAgICAjSU1QTElFRCAgLS0gZGF0ZSBhbmQgdGltZSBvZiBjaGFuZ2UgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBMaXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGRlZmluaXRpb24gbGlzdHMgLSBEVCBmb3IgdGVybSwgREQgZm9yIGl0cyBkZWZpbml0aW9uIC0tPgotCi08IUVMRU1FTlQgREwgLSAtIChEVHxERCkrICAgICAgICAgICAgICAtLSBkZWZpbml0aW9uIGxpc3QgLS0+Ci08IUFUVExJU1QgREwKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCFFTEVNRU5UIERUIC0gTyAoJWlubGluZTspKiAgICAgICAgICAgLS0gZGVmaW5pdGlvbiB0ZXJtIC0tPgotPCFFTEVNRU5UIEREIC0gTyAoJWZsb3c7KSogICAgICAgICAgICAgLS0gZGVmaW5pdGlvbiBkZXNjcmlwdGlvbiAtLT4KLTwhQVRUTElTVCAoRFR8REQpCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLQotPCFFTEVNRU5UIE9MIC0gLSAoTEkpKyAgICAgICAgICAgICAgICAgLS0gb3JkZXJlZCBsaXN0IC0tPgotPCFBVFRMSVNUIE9MCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS0gVW5vcmRlcmVkIExpc3RzIChVTCkgYnVsbGV0IHN0eWxlcyAtLT4KLTwhRUxFTUVOVCBVTCAtIC0gKExJKSsgICAgICAgICAgICAgICAgIC0tIHVub3JkZXJlZCBsaXN0IC0tPgotPCFBVFRMSVNUIFVMCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLQotCi08IUVMRU1FTlQgTEkgLSBPICglZmxvdzspKiAgICAgICAgICAgICAtLSBsaXN0IGl0ZW0gLS0+Ci08IUFUVExJU1QgTEkKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRm9ybXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhRUxFTUVOVCBGT1JNIC0gLSAoJWJsb2NrO3xTQ1JJUFQpKyAtKEZPUk0pIC0tIGludGVyYWN0aXZlIGZvcm0gLS0+Ci08IUFUVExJU1QgRk9STQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWN0aW9uICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVEIC0tIHNlcnZlci1zaWRlIGZvcm0gaGFuZGxlciAtLQotICBtZXRob2QgICAgICAoR0VUfFBPU1QpICAgICBHRVQgICAgICAgLS0gSFRUUCBtZXRob2QgdXNlZCB0byBzdWJtaXQgdGhlIGZvcm0tLQotICBlbmN0eXBlICAgICAlQ29udGVudFR5cGU7ICAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRCAgLS0gbGlzdCBvZiBNSU1FIHR5cGVzIGZvciBmaWxlIHVwbG9hZCAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gbmFtZSBvZiBmb3JtIGZvciBzY3JpcHRpbmcgLS0KLSAgb25zdWJtaXQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBmb3JtIHdhcyBzdWJtaXR0ZWQgLS0KLSAgb25yZXNldCAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBmb3JtIHdhcyByZXNldCAtLQotICBhY2NlcHQtY2hhcnNldCAlQ2hhcnNldHM7ICAjSU1QTElFRCAgLS0gbGlzdCBvZiBzdXBwb3J0ZWQgY2hhcnNldHMgLS0KLSAgPgotCi08IS0tIEVhY2ggbGFiZWwgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gT05FIGZpZWxkIC0tPgotPCFFTEVNRU5UIExBQkVMIC0gLSAoJWlubGluZTspKiAtKExBQkVMKSAtLSBmb3JtIGZpZWxkIGxhYmVsIHRleHQgLS0+Ci08IUFUVExJU1QgTEFCRUwKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGZvciAgICAgICAgIElEUkVGICAgICAgICAgICNJTVBMSUVEICAtLSBtYXRjaGVzIGZpZWxkIElEIHZhbHVlIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gID4KLQotPCFFTlRJVFkgJSBJbnB1dFR5cGUKLSAgIihURVhUIHwgUEFTU1dPUkQgfCBDSEVDS0JPWCB8Ci0gICAgUkFESU8gfCBTVUJNSVQgfCBSRVNFVCB8Ci0gICAgRklMRSB8IEhJRERFTiB8IElNQUdFIHwgQlVUVE9OKSIKLSAgID4KLQotPCEtLSBhdHRyaWJ1dGUgbmFtZSByZXF1aXJlZCBmb3IgYWxsIGJ1dCBzdWJtaXQgYW5kIHJlc2V0IC0tPgotPCFFTEVNRU5UIElOUFVUIC0gTyBFTVBUWSAgICAgICAgICAgICAgLS0gZm9ybSBjb250cm9sIC0tPgotPCFBVFRMSVNUIElOUFVUCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICB0eXBlICAgICAgICAlSW5wdXRUeXBlOyAgICBURVhUICAgICAgLS0gd2hhdCBraW5kIG9mIHdpZGdldCBpcyBuZWVkZWQgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHN1Ym1pdCBhcyBwYXJ0IG9mIGZvcm0gLS0KLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIFNwZWNpZnkgZm9yIHJhZGlvIGJ1dHRvbnMgYW5kIGNoZWNrYm94ZXMgLS0KLSAgY2hlY2tlZCAgICAgKGNoZWNrZWQpICAgICAgI0lNUExJRUQgIC0tIGZvciByYWRpbyBidXR0b25zIGFuZCBjaGVjayBib3hlcyAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVEICAtLSBmb3IgdGV4dCBhbmQgcGFzc3dkIC0tCi0gIHNpemUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzcGVjaWZpYyB0byBlYWNoIHR5cGUgb2YgZmllbGQgLS0KLSAgbWF4bGVuZ3RoICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIG1heCBjaGFycyBmb3IgdGV4dCBmaWVsZHMgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGZvciBmaWVsZHMgd2l0aCBpbWFnZXMgLS0KLSAgYWx0ICAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNob3J0IGRlc2NyaXB0aW9uIC0tCi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSB1c2UgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIC0tCi0gIGlzbWFwICAgICAgIChpc21hcCkgICAgICAgICNJTVBMSUVEICAtLSB1c2Ugc2VydmVyLXNpZGUgaW1hZ2UgbWFwIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBzb21lIHRleHQgd2FzIHNlbGVjdGVkIC0tCi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCB2YWx1ZSB3YXMgY2hhbmdlZCAtLQotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRCAgLS0gbGlzdCBvZiBNSU1FIHR5cGVzIGZvciBmaWxlIHVwbG9hZCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgU0VMRUNUIC0gLSAoT1BUR1JPVVB8T1BUSU9OKSsgLS0gb3B0aW9uIHNlbGVjdG9yIC0tPgotPCFBVFRMSVNUIFNFTEVDVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGZpZWxkIG5hbWUgLS0KLSAgc2l6ZSAgICAgICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHJvd3MgdmlzaWJsZSAtLQotICBtdWx0aXBsZSAgICAobXVsdGlwbGUpICAgICAjSU1QTElFRCAgLS0gZGVmYXVsdCBpcyBzaW5nbGUgc2VsZWN0aW9uIC0tCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCB2YWx1ZSB3YXMgY2hhbmdlZCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgT1BUR1JPVVAgLSAtIChPUFRJT04pKyAtLSBvcHRpb24gZ3JvdXAgLS0+Ci08IUFUVExJU1QgT1BUR1JPVVAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVEIC0tIGZvciB1c2UgaW4gaGllcmFyY2hpY2FsIG1lbnVzIC0tCi0gID4KLQotPCFFTEVNRU5UIE9QVElPTiAtIE8gKCNQQ0RBVEEpICAgICAgICAgLS0gc2VsZWN0YWJsZSBjaG9pY2UgLS0+Ci08IUFUVExJU1QgT1BUSU9OCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzZWxlY3RlZCAgICAoc2VsZWN0ZWQpICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIGxhYmVsICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBmb3IgdXNlIGluIGhpZXJhcmNoaWNhbCBtZW51cyAtLQotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gZGVmYXVsdHMgdG8gZWxlbWVudCBjb250ZW50IC0tCi0gID4KLQotPCFFTEVNRU5UIFRFWFRBUkVBIC0gLSAoI1BDREFUQSkgICAgICAgLS0gbXVsdGktbGluZSB0ZXh0IGZpZWxkIC0tPgotPCFBVFRMSVNUIFRFWFRBUkVBCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICByb3dzICAgICAgICBOVU1CRVIgICAgICAgICAjUkVRVUlSRUQKLSAgY29scyAgICAgICAgTlVNQkVSICAgICAgICAgI1JFUVVJUkVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgcmVhZG9ubHkgICAgKHJlYWRvbmx5KSAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgb25zZWxlY3QgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHNvbWUgdGV4dCB3YXMgc2VsZWN0ZWQgLS0KLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IHZhbHVlIHdhcyBjaGFuZ2VkIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhLS0KLSAgI1BDREFUQSBpcyB0byBzb2x2ZSB0aGUgbWl4ZWQgY29udGVudCBwcm9ibGVtLAotICBwZXIgc3BlY2lmaWNhdGlvbiBvbmx5IHdoaXRlc3BhY2UgaXMgYWxsb3dlZCB0aGVyZSEKLSAtLT4KLTwhRUxFTUVOVCBGSUVMRFNFVCAtIC0gKCNQQ0RBVEEsTEVHRU5ELCglZmxvdzspKikgLS0gZm9ybSBjb250cm9sIGdyb3VwIC0tPgotPCFBVFRMSVNUIEZJRUxEU0VUCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBMRUdFTkQgLSAtICglaW5saW5lOykqICAgICAgIC0tIGZpZWxkc2V0IGxlZ2VuZCAtLT4KLQotPCFBVFRMSVNUIExFR0VORAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICA+Ci0KLTwhRUxFTUVOVCBCVVRUT04gLSAtCi0gICAgICglZmxvdzspKiAtKEF8JWZvcm1jdHJsO3xGT1JNfEZJRUxEU0VUKQotICAgICAtLSBwdXNoIGJ1dHRvbiAtLT4KLTwhQVRUTElTVCBCVVRUT04KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzZW50IHRvIHNlcnZlciB3aGVuIHN1Ym1pdHRlZCAtLQotICB0eXBlICAgICAgICAoYnV0dG9ufHN1Ym1pdHxyZXNldCkgc3VibWl0IC0tIGZvciB1c2UgYXMgZm9ybSBidXR0b24gLS0KLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT0gVGFibGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIElFVEYgSFRNTCB0YWJsZSBzdGFuZGFyZCwgc2VlIFtSRkMxOTQyXSAtLT4KLQotPCEtLQotIFRoZSBCT1JERVIgYXR0cmlidXRlIHNldHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgZnJhbWUgYXJvdW5kIHRoZQotIHRhYmxlLiBUaGUgZGVmYXVsdCB1bml0cyBhcmUgc2NyZWVuIHBpeGVscy4KLQotIFRoZSBGUkFNRSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHdoaWNoIHBhcnRzIG9mIHRoZSBmcmFtZSBhcm91bmQKLSB0aGUgdGFibGUgc2hvdWxkIGJlIHJlbmRlcmVkLiBUaGUgdmFsdWVzIGFyZSBub3QgdGhlIHNhbWUgYXMKLSBDQUxTIHRvIGF2b2lkIGEgbmFtZSBjbGFzaCB3aXRoIHRoZSBWQUxJR04gYXR0cmlidXRlLgotCi0gVGhlIHZhbHVlICJib3JkZXIiIGlzIGluY2x1ZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoCi0gPFRBQkxFIEJPUkRFUj4gd2hpY2ggeWllbGRzIGZyYW1lPWJvcmRlciBhbmQgYm9yZGVyPWltcGxpZWQKLSBGb3IgPFRBQkxFIEJPUkRFUj0xPiB5b3UgZ2V0IGJvcmRlcj0xIGFuZCBmcmFtZT1pbXBsaWVkLiBJbiB0aGlzCi0gY2FzZSwgaXQgaXMgYXBwcm9wcmlhdGUgdG8gdHJlYXQgdGhpcyBhcyBmcmFtZT1ib3JkZXIgZm9yIGJhY2t3YXJkcwotIGNvbXBhdGliaWxpdHkgd2l0aCBkZXBsb3llZCBicm93c2Vycy4KLS0tPgotPCFFTlRJVFkgJSBURnJhbWUgIih2b2lkfGFib3ZlfGJlbG93fGhzaWRlc3xsaHN8cmhzfHZzaWRlc3xib3h8Ym9yZGVyKSI+Ci0KLTwhLS0KLSBUaGUgUlVMRVMgYXR0cmlidXRlIGRlZmluZXMgd2hpY2ggcnVsZXMgdG8gZHJhdyBiZXR3ZWVuIGNlbGxzOgotCi0gSWYgUlVMRVMgaXMgYWJzZW50IHRoZW4gYXNzdW1lOgotICAgICAibm9uZSIgaWYgQk9SREVSIGlzIGFic2VudCBvciBCT1JERVI9MCBvdGhlcndpc2UgImFsbCIKLS0tPgotCi08IUVOVElUWSAlIFRSdWxlcyAiKG5vbmUgfCBncm91cHMgfCByb3dzIHwgY29scyB8IGFsbCkiPgotICAKLTwhLS0gaG9yaXpvbnRhbCBwbGFjZW1lbnQgb2YgdGFibGUgcmVsYXRpdmUgdG8gZG9jdW1lbnQgLS0+Ci08IUVOVElUWSAlIFRBbGlnbiAiKGxlZnR8Y2VudGVyfHJpZ2h0KSI+Ci0KLTwhLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cyAtLT4KLTwhRU5USVRZICUgY2VsbGhhbGlnbgotICAiYWxpZ24gICAgICAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeXxjaGFyKSAjSU1QTElFRAotICAgY2hhciAgICAgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWxpZ25tZW50IGNoYXIsIGUuZy4gY2hhcj0nOicgLS0KLSAgIGNoYXJvZmYgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG9mZnNldCBmb3IgYWxpZ25tZW50IGNoYXIgLS0iCi0gID4KLQotPCEtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cyAtLT4KLTwhRU5USVRZICUgY2VsbHZhbGlnbgotICAidmFsaWduICAgICAodG9wfG1pZGRsZXxib3R0b218YmFzZWxpbmUpICNJTVBMSUVEIgotICA+Ci0KLTwhRUxFTUVOVCBUQUJMRSAtIC0KLSAgICAgKENBUFRJT04/LCAoQ09MKnxDT0xHUk9VUCopLCBUSEVBRD8sIFRGT09UPywgVEJPRFkrKT4KLTwhRUxFTUVOVCBDQVBUSU9OICAtIC0gKCVpbmxpbmU7KSogICAgIC0tIHRhYmxlIGNhcHRpb24gLS0+Ci08IUVMRU1FTlQgVEhFQUQgICAgLSBPIChUUikrICAgICAgICAgICAtLSB0YWJsZSBoZWFkZXIgLS0+Ci08IUVMRU1FTlQgVEZPT1QgICAgLSBPIChUUikrICAgICAgICAgICAtLSB0YWJsZSBmb290ZXIgLS0+Ci08IUVMRU1FTlQgVEJPRFkgICAgTyBPIChUUikrICAgICAgICAgICAtLSB0YWJsZSBib2R5IC0tPgotPCFFTEVNRU5UIENPTEdST1VQIC0gTyAoQ09MKSogICAgICAgICAgLS0gdGFibGUgY29sdW1uIGdyb3VwIC0tPgotPCFFTEVNRU5UIENPTCAgICAgIC0gTyBFTVBUWSAgICAgICAgICAgLS0gdGFibGUgY29sdW1uIC0tPgotPCFFTEVNRU5UIFRSICAgICAgIC0gTyAoVEh8VEQpKyAgICAgICAgLS0gdGFibGUgcm93IC0tPgotPCFFTEVNRU5UIChUSHxURCkgIC0gTyAoJWZsb3c7KSogICAgICAgLS0gdGFibGUgaGVhZGVyIGNlbGwsIHRhYmxlIGRhdGEgY2VsbC0tPgotCi08IUFUVExJU1QgVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAtLSB0YWJsZSBlbGVtZW50IC0tCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzdW1tYXJ5ICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gcHVycG9zZS9zdHJ1Y3R1cmUgZm9yIHNwZWVjaCBvdXRwdXQtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gdGFibGUgd2lkdGggLS0KLSAgYm9yZGVyICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIGNvbnRyb2xzIGZyYW1lIHdpZHRoIGFyb3VuZCB0YWJsZSAtLQotICBmcmFtZSAgICAgICAlVEZyYW1lOyAgICAgICAjSU1QTElFRCAgLS0gd2hpY2ggcGFydHMgb2YgZnJhbWUgdG8gcmVuZGVyIC0tCi0gIHJ1bGVzICAgICAgICVUUnVsZXM7ICAgICAgICNJTVBMSUVEICAtLSBydWxpbmdzIGJldHdlZW4gcm93cyBhbmQgY29scyAtLQotICBjZWxsc3BhY2luZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gc3BhY2luZyBiZXR3ZWVuIGNlbGxzIC0tCi0gIGNlbGxwYWRkaW5nICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBzcGFjaW5nIHdpdGhpbiBjZWxscyAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgZGF0YXBhZ2VzaXplIENEQVRBICAgICAgICAgI0lNUExJRUQgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotCi08IUFUVExJU1QgQ0FQVElPTgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tCi1DT0xHUk9VUCBncm91cHMgYSBzZXQgb2YgQ09MIGVsZW1lbnRzLiBJdCBhbGxvd3MgeW91IHRvIGdyb3VwCi1zZXZlcmFsIHNlbWFudGljYWxseSByZWxhdGVkIGNvbHVtbnMgdG9nZXRoZXIuCi0tLT4KLTwhQVRUTElTVCBDT0xHUk9VUAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3BhbiAgICAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIGRlZmF1bHQgbnVtYmVyIG9mIGNvbHVtbnMgaW4gZ3JvdXAgLS0KLSAgd2lkdGggICAgICAgJU11bHRpTGVuZ3RoOyAgI0lNUExJRUQgIC0tIGRlZmF1bHQgd2lkdGggZm9yIGVuY2xvc2VkIENPTHMgLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi08IS0tCi0gQ09MIGVsZW1lbnRzIGRlZmluZSB0aGUgYWxpZ25tZW50IHByb3BlcnRpZXMgZm9yIGNlbGxzIGluCi0gb25lIG9yIG1vcmUgY29sdW1ucy4KLQotIFRoZSBXSURUSCBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1ucywgZS5nLgotCi0gICAgIHdpZHRoPTY0ICAgICAgICB3aWR0aCBpbiBzY3JlZW4gcGl4ZWxzCi0gICAgIHdpZHRoPTAuNSogICAgICByZWxhdGl2ZSB3aWR0aCBvZiAwLjUKLQotIFRoZSBTUEFOIGF0dHJpYnV0ZSBjYXVzZXMgdGhlIGF0dHJpYnV0ZXMgb2Ygb25lCi0gQ09MIGVsZW1lbnQgdG8gYXBwbHkgdG8gbW9yZSB0aGFuIG9uZSBjb2x1bW4uCi0tLT4KLTwhQVRUTElTVCBDT0wgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGNvbHVtbiBncm91cHMgYW5kIHByb3BlcnRpZXMgLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNwYW4gICAgICAgIE5VTUJFUiAgICAgICAgIDEgICAgICAgICAtLSBDT0wgYXR0cmlidXRlcyBhZmZlY3QgTiBjb2x1bW5zIC0tCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVEICAtLSBjb2x1bW4gd2lkdGggc3BlY2lmaWNhdGlvbiAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICA+Ci0KLTwhLS0KLSAgICBVc2UgVEhFQUQgdG8gZHVwbGljYXRlIGhlYWRlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgaGVhZGVycyB3aGVuCi0gICAgVEJPRFkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSBURk9PVCB0byBkdXBsaWNhdGUgZm9vdGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBmb290ZXJzIHdoZW4KLSAgICBUQk9EWSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotCi0gICAgVXNlIG11bHRpcGxlIFRCT0RZIHNlY3Rpb25zIHdoZW4gcnVsZXMgYXJlIG5lZWRlZAotICAgIGJldHdlZW4gZ3JvdXBzIG9mIHRhYmxlIHJvd3MuCi0tLT4KLTwhQVRUTElTVCAoVEhFQUR8VEJPRFl8VEZPT1QpICAgICAgICAgIC0tIHRhYmxlIHNlY3Rpb24gLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotPCFBVFRMSVNUIFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdGFibGUgcm93IC0tCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICA+Ci0KLQotPCEtLSBTY29wZSBpcyBzaW1wbGVyIHRoYW4gaGVhZGVycyBhdHRyaWJ1dGUgZm9yIGNvbW1vbiB0YWJsZXMgLS0+Ci08IUVOVElUWSAlIFNjb3BlICIocm93fGNvbHxyb3dncm91cHxjb2xncm91cCkiPgotCi08IS0tIFRIIGlzIGZvciBoZWFkZXJzLCBURCBmb3IgZGF0YSwgYnV0IGZvciBjZWxscyBhY3RpbmcgYXMgYm90aCB1c2UgVEQgLS0+Ci08IUFUVExJU1QgKFRIfFREKSAgICAgICAgICAgICAgICAgICAgICAtLSBoZWFkZXIgb3IgZGF0YSBjZWxsIC0tCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBhYmJyICAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gYWJicmV2aWF0aW9uIGZvciBoZWFkZXIgY2VsbCAtLQotICBheGlzICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVsYXRlZCBoZWFkZXJzLS0KLSAgaGVhZGVycyAgICAgSURSRUZTICAgICAgICAgI0lNUExJRUQgIC0tIGxpc3Qgb2YgaWQncyBmb3IgaGVhZGVyIGNlbGxzIC0tCi0gIHNjb3BlICAgICAgICVTY29wZTsgICAgICAgICNJTVBMSUVEICAtLSBzY29wZSBjb3ZlcmVkIGJ5IGhlYWRlciBjZWxscyAtLQotICByb3dzcGFuICAgICBOVU1CRVIgICAgICAgICAxICAgICAgICAgLS0gbnVtYmVyIG9mIHJvd3Mgc3Bhbm5lZCBieSBjZWxsIC0tCi0gIGNvbHNwYW4gICAgIE5VTUJFUiAgICAgICAgIDEgICAgICAgICAtLSBudW1iZXIgb2YgY29scyBzcGFubmVkIGJ5IGNlbGwgLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi0KLTwhLS09PT09PT09PT09PT09PT09IERvY3VtZW50IEhlYWQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tICVoZWFkLm1pc2M7IGRlZmluZWQgZWFybGllciBvbiBhcyAiU0NSSVBUfFNUWUxFfE1FVEF8TElOS3xPQkpFQ1QiIC0tPgotPCFFTlRJVFkgJSBoZWFkLmNvbnRlbnQgIlRJVExFICYgQkFTRT8iPgotCi08IUVMRU1FTlQgSEVBRCBPIE8gKCVoZWFkLmNvbnRlbnQ7KSArKCVoZWFkLm1pc2M7KSAtLSBkb2N1bWVudCBoZWFkIC0tPgotPCFBVFRMSVNUIEhFQUQKLSAgJWkxOG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciAtLQotICBwcm9maWxlICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gbmFtZWQgZGljdGlvbmFyeSBvZiBtZXRhIGluZm8gLS0KLSAgPgotCi08IS0tIFRoZSBUSVRMRSBlbGVtZW50IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGZsb3cgb2YgdGV4dC4KLSAgICAgICBJdCBzaG91bGQgYmUgZGlzcGxheWVkLCBmb3IgZXhhbXBsZSBhcyB0aGUgcGFnZSBoZWFkZXIgb3IKLSAgICAgICB3aW5kb3cgdGl0bGUuIEV4YWN0bHkgb25lIHRpdGxlIGlzIHJlcXVpcmVkIHBlciBkb2N1bWVudC4KLSAgICAtLT4KLTwhRUxFTUVOVCBUSVRMRSAtIC0gKCNQQ0RBVEEpIC0oJWhlYWQubWlzYzspIC0tIGRvY3VtZW50IHRpdGxlIC0tPgotPCFBVFRMSVNUIFRJVExFICVpMThuPgotCi0KLTwhRUxFTUVOVCBCQVNFIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGRvY3VtZW50IGJhc2UgVVJJIC0tPgotPCFBVFRMSVNUIEJBU0UKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVEIC0tIFVSSSB0aGF0IGFjdHMgYXMgYmFzZSBVUkkgLS0KLSAgPgotCi08IUVMRU1FTlQgTUVUQSAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBnZW5lcmljIG1ldGFpbmZvcm1hdGlvbiAtLT4KLTwhQVRUTElTVCBNRVRBCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIsIGZvciB1c2Ugd2l0aCBjb250ZW50IC0tCi0gIGh0dHAtZXF1aXYgIE5BTUUgICAgICAgICAgICNJTVBMSUVEICAtLSBIVFRQIHJlc3BvbnNlIGhlYWRlciBuYW1lICAtLQotICBuYW1lICAgICAgICBOQU1FICAgICAgICAgICAjSU1QTElFRCAgLS0gbWV0YWluZm9ybWF0aW9uIG5hbWUgLS0KLSAgY29udGVudCAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVEIC0tIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gLS0KLSAgc2NoZW1lICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNlbGVjdCBmb3JtIG9mIGNvbnRlbnQgLS0KLSAgPgotCi08IUVMRU1FTlQgU1RZTEUgLSAtICVTdHlsZVNoZWV0ICAgICAgICAtLSBzdHlsZSBpbmZvIC0tPgotPCFBVFRMSVNUIFNUWUxFCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIsIGZvciB1c2Ugd2l0aCB0aXRsZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQgLS0gY29udGVudCB0eXBlIG9mIHN0eWxlIGxhbmd1YWdlIC0tCi0gIG1lZGlhICAgICAgICVNZWRpYURlc2M7ICAgICNJTVBMSUVEICAtLSBkZXNpZ25lZCBmb3IgdXNlIHdpdGggdGhlc2UgbWVkaWEgLS0KLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIGFkdmlzb3J5IHRpdGxlIC0tCi0gID4KLQotPCFFTEVNRU5UIFNDUklQVCAtIC0gJVNjcmlwdDsgICAgICAgICAgLS0gc2NyaXB0IHN0YXRlbWVudHMgLS0+Ci08IUFUVExJU1QgU0NSSVBUCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQgLS0gY29udGVudCB0eXBlIG9mIHNjcmlwdCBsYW5ndWFnZSAtLQotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBhbiBleHRlcm5hbCBzY3JpcHQgLS0KLSAgZGVmZXIgICAgICAgKGRlZmVyKSAgICAgICAgI0lNUExJRUQgIC0tIFVBIG1heSBkZWZlciBleGVjdXRpb24gb2Ygc2NyaXB0IC0tCi0gIGV2ZW50ICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICBmb3IgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgTk9TQ1JJUFQgLSAtICglYmxvY2s7KSsKLSAgLS0gYWx0ZXJuYXRlIGNvbnRlbnQgY29udGFpbmVyIGZvciBub24gc2NyaXB0LWJhc2VkIHJlbmRlcmluZyAtLT4KLTwhQVRUTElTVCBOT1NDUklQVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBTdHJ1Y3R1cmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgIkhFQUQsIEJPRFkiPgotCi08IUVMRU1FTlQgSFRNTCBPIE8gKCVodG1sLmNvbnRlbnQ7KSAgICAtLSBkb2N1bWVudCByb290IGVsZW1lbnQgLS0+Ci08IUFUVExJU1QgSFRNTAotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyIC0tCi0gID4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy93bWwxMS5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvd21sMTEuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmIxMmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy93bWwxMS5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotPCEtLQotV2lyZWxlc3MgTWFya3VwIExhbmd1YWdlIChXTUwpIERvY3VtZW50IFR5cGUgRGVmaW5pdGlvbi4KLQotQ29weXJpZ2h0IFdpcmVsZXNzIEFwcGxpY2F0aW9uIFByb3RvY29sIEZvcnVtIEx0ZC4sIDE5OTgsMTk5OS4KLSAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCi0KLVdNTCBpcyBhbiBYTUwgbGFuZ3VhZ2UuICBUeXBpY2FsIHVzYWdlOgotICAgPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0gICA8IURPQ1RZUEUgd21sIFBVQkxJQyAiLS8vV0FQRk9SVU0vL0RURCBXTUwgMS4xLy9FTiIKLSAgICAgICAgICAiaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3dtbF8xLjEueG1sIj4KLSAgIDx3bWw+Ci0gICAuLi4KLSAgIDwvd21sPgotCi1UZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBXaXJlbGVzcyAKLUFwcGxpY2F0aW9uIFByb3RvY29sIEZvcnVtIEx0ZC4gd2ViIHNpdGUgYXQKLWh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL2RvY3MvY29weXJpZ2h0Lmh0bS4KLS0tPgotCi08IUVOVElUWSAlIGxlbmd0aCAgIkNEQVRBIj4gICAgPCEtLSBbMC05XSsgZm9yIHBpeGVscyBvciBbMC05XSsiJSIgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLTwhRU5USVRZICUgdmRhdGEgICAiQ0RBVEEiPiAgICA8IS0tIGF0dHJpYnV0ZSB2YWx1ZSBwb3NzaWJseSBjb250YWluaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSByZWZlcmVuY2VzIC0tPgotPCFFTlRJVFkgJSBIUkVGICAgICIldmRhdGE7Ij4gIDwhLS0gVVJJLCBVUkwgb3IgVVJOIGRlc2lnbmF0aW5nIGEgaHlwZXJ0ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLiBNYXkgY29udGFpbiB2YXJpYWJsZSByZWZlcmVuY2VzIC0tPgotPCFFTlRJVFkgJSBib29sZWFuICAgICAgIih0cnVlfGZhbHNlKSI+Ci08IUVOVElUWSAlIG51bWJlciAgIk5NVE9LRU4iPiAgPCEtLSBhIG51bWJlciwgd2l0aCBmb3JtYXQgWzAtOV0rIC0tPgotPCFFTlRJVFkgJSBjb3JlYXR0cnMgICJpZCAgICBJRCAgICAgI0lNUExJRUQgCi0gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIENEQVRBICAjSU1QTElFRCI+Ci0KLQotCi08IUVOVElUWSAlIGVtcGggICAgImVtIHwgc3Ryb25nIHwgYiB8IGkgfCB1IHwgYmlnIHwgc21hbGwiPgotPCFFTlRJVFkgJSBsYXlvdXQgICJiciI+Ci0KLTwhRU5USVRZICUgdGV4dCAgICAgIiNQQ0RBVEEgfCAlZW1waDsiPgotCi08IS0tIGZsb3cgY292ZXJzICJjYXJkLWxldmVsIiBlbGVtZW50cywgc3VjaCBhcyB0ZXh0IGFuZCBpbWFnZXMgLS0+Ci08IUVOVElUWSAlIGZsb3cgICAgICIldGV4dDsgfCAlbGF5b3V0OyB8IGltZyB8IGFuY2hvciB8IGEgfCB0YWJsZSI+Ci0KLTwhLS0gVGFzayB0eXBlcyAtLT4KLTwhRU5USVRZICUgdGFzayAgICJnbyB8IHByZXYgfCBub29wIHwgcmVmcmVzaCI+Ci0KLTwhLS0gTmF2aWdhdGlvbiBhbmQgZXZlbnQgZWxlbWVudHMgLS0+Ci08IUVOVElUWSAlIG5hdmVsbXRzICJkbyB8IG9uZXZlbnQiPgotCi08IS0tPT09PT09PT09PT09PT09PSBEZWNrcyBhbmQgQ2FyZHMgPT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgd21sICggaGVhZD8sIHRlbXBsYXRlPywgY2FyZCsgKT4KLTwhQVRUTElTVCB3bWwKLSAgeG1sOmxhbmcgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCEtLSBjYXJkIGludHJpbnNpYyBldmVudHMgLS0+Ci08IUVOVElUWSAlIGNhcmRldgotICJvbmVudGVyZm9yd2FyZCAgJUhSRUY7ICAgICAgICAgICNJTVBMSUVECi0gIG9uZW50ZXJiYWNrd2FyZCAlSFJFRjsgICAgICAgICAgI0lNUExJRUQKLSAgb250aW1lciAgICAgICAgICVIUkVGOyAgICAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIGNhcmQgZmllbGQgdHlwZXMgLS0+Ci08IUVOVElUWSAlIGZpZWxkcyAgIiVmbG93OyB8IGlucHV0IHwgc2VsZWN0IHwgZmllbGRzZXQiPgotCi08IUVMRU1FTlQgY2FyZCAob25ldmVudCosIHRpbWVyPywgKGRvIHwgcCkqKT4KLTwhQVRUTElTVCBjYXJkCi0gIHRpdGxlICAgICAgICAgICAldmRhdGE7ICAgICAgICNJTVBMSUVECi0gIG5ld2NvbnRleHQgICAgICAlYm9vbGVhbjsgICAgICJmYWxzZSIKLSAgb3JkZXJlZCAgICAgICAgICVib29sZWFuOyAgICAgInRydWUiCi0gIHhtbDpsYW5nICAgICAgICBOTVRPS0VOICAgICAgICNJTVBMSUVECi0gICVjYXJkZXY7Ci0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRXZlbnQgQmluZGluZ3MgPT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgZG8gKCV0YXNrOyk+Ci08IUFUVExJU1QgZG8KLSAgdHlwZSAgICAgICAgIENEQVRBICAgICAgICNSRVFVSVJFRAotICBsYWJlbCAgICAgICAgJXZkYXRhOyAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgIE5NVE9LRU4gICAgICNJTVBMSUVECi0gIG9wdGlvbmFsICAgICAlYm9vbGVhbjsgICAiZmFsc2UiCi0gIHhtbDpsYW5nICAgICBOTVRPS0VOICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBvbmV2ZW50ICgldGFzazspPgotPCFBVFRMSVNUIG9uZXZlbnQKLSAgdHlwZSAgICAgICAgIENEQVRBICAgICAgICNSRVFVSVJFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IERlY2stbGV2ZWwgZGVjbGFyYXRpb25zID09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGhlYWQgKCBhY2Nlc3MgfCBtZXRhICkrPgotPCFBVFRMSVNUIGhlYWQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgdGVtcGxhdGUgKCVuYXZlbG10czspKj4KLTwhQVRUTElTVCB0ZW1wbGF0ZQotICAlY2FyZGV2OwotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBhY2Nlc3MgRU1QVFk+Ci08IUFUVExJU1QgYWNjZXNzCi0gIGRvbWFpbiAgICAgICBDREFUQSAgICAgICAjSU1QTElFRAotICBwYXRoICAgICAgICAgQ0RBVEEgICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgbWV0YSBFTVBUWT4KLTwhQVRUTElTVCBtZXRhCi0gIGh0dHAtZXF1aXYgICAgIENEQVRBICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgICAgQ0RBVEEgICAgICAjSU1QTElFRAotICBmb3J1YSAgICAgICAgICAlYm9vbGVhbjsgICNJTVBMSUVECi0gIGNvbnRlbnQgICAgICAgIENEQVRBICAgICAgI1JFUVVJUkVECi0gIHNjaGVtZSAgICAgICAgIENEQVRBICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBUYXNrcyA9PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBnbyAocG9zdGZpZWxkIHwgc2V0dmFyKSo+Ci08IUFUVExJU1QgZ28KLSAgaHJlZiAgICAgICAgICAgICVIUkVGOyAgICAgICAgICAgI1JFUVVJUkVECi0gIHNlbmRyZWZlcmVyICAgICAlYm9vbGVhbjsgICAgICAgImZhbHNlIgotICBtZXRob2QgICAgICAgICAgKHBvc3R8Z2V0KSAgICAgICJnZXQiCi0gIGFjY2VwdC1jaGFyc2V0ICBDREFUQSAgICAgICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgcHJldiAoc2V0dmFyKSo+Ci08IUFUVExJU1QgcHJldgotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCByZWZyZXNoIChzZXR2YXIpKj4KLTwhQVRUTElTVCByZWZyZXNoCi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIG5vb3AgRU1QVFk+Ci08IUFUVExJU1Qgbm9vcAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IHBvc3RmaWVsZCA9PT09PT09PT09PT09PT09LS0+Ci0gCi08IUVMRU1FTlQgcG9zdGZpZWxkIEVNUFRZPgotPCFBVFRMSVNUIHBvc3RmaWVsZAotICBuYW1lICAgICAgICAgJXZkYXRhOyAgICAgICAgICAgI1JFUVVJUkVECi0gIHZhbHVlICAgICAgICAldmRhdGE7ICAgICAgICAgICAjUkVRVUlSRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSB2YXJpYWJsZXMgPT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgc2V0dmFyIEVNUFRZPgotPCFBVFRMSVNUIHNldHZhcgotICBuYW1lICAgICAgICAgJXZkYXRhOyAgICAgICAgICAgI1JFUVVJUkVECi0gIHZhbHVlICAgICAgICAldmRhdGE7ICAgICAgICAgICAjUkVRVUlSRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBDYXJkIEZpZWxkcyA9PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBzZWxlY3QgKG9wdGdyb3VwfG9wdGlvbikrPgotPCFBVFRMSVNUIHNlbGVjdAotICB0aXRsZSAgICAgICAgJXZkYXRhOyAgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgIE5NVE9LRU4gICAgICAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgICAldmRhdGE7ICAgICAgICAgICAjSU1QTElFRAotICBpbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgICAgI0lNUExJRUQKLSAgaXZhbHVlICAgICAgICV2ZGF0YTsgICAgICAgICAgICNJTVBMSUVECi0gIG11bHRpcGxlICAgICAlYm9vbGVhbjsgICAgICAgICAiZmFsc2UiCi0gIHRhYmluZGV4ICAgICAlbnVtYmVyOyAgICAgICAgICAjSU1QTElFRAotICB4bWw6bGFuZyAgICAgTk1UT0tFTiAgICAgICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgb3B0Z3JvdXAgKG9wdGdyb3VwfG9wdGlvbikrID4KLTwhQVRUTElTVCBvcHRncm91cAotICB0aXRsZSAgICAgICV2ZGF0YTsgICAgI0lNUExJRUQKLSAgeG1sOmxhbmcgICBOTVRPS0VOICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIG9wdGlvbiAoI1BDREFUQSB8IG9uZXZlbnQpKj4KLTwhQVRUTElTVCBvcHRpb24KLSAgdmFsdWUgICAgICAldmRhdGE7ICAgICNJTVBMSUVECi0gIHRpdGxlICAgICAgJXZkYXRhOyAgICAjSU1QTElFRAotICBvbnBpY2sgICAgICVIUkVGOyAgICAgI0lNUExJRUQKLSAgeG1sOmxhbmcgICBOTVRPS0VOICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGlucHV0IEVNUFRZPgotPCFBVFRMSVNUIGlucHV0Ci0gIG5hbWUgICAgICAgTk1UT0tFTiAgICAgICAgICAgI1JFUVVJUkVECi0gIHR5cGUgICAgICAgKHRleHR8cGFzc3dvcmQpICAgInRleHQiCi0gIHZhbHVlICAgICAgJXZkYXRhOyAgICAgICAgICAgI0lNUExJRUQKLSAgZm9ybWF0ICAgICBDREFUQSAgICAgICAgICAgICAjSU1QTElFRAotICBlbXB0eW9rICAgICVib29sZWFuOyAgICAgICAgICJmYWxzZSIKLSAgc2l6ZSAgICAgICAlbnVtYmVyOyAgICAgICAgICAjSU1QTElFRAotICBtYXhsZW5ndGggICVudW1iZXI7ICAgICAgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgJW51bWJlcjsgICAgICAgICAgI0lNUExJRUQKLSAgdGl0bGUgICAgICAldmRhdGE7ICAgICAgICAgICAjSU1QTElFRAotICB4bWw6bGFuZyAgIE5NVE9LRU4gICAgICAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGZpZWxkc2V0ICglZmllbGRzOyB8IGRvKSogPgotPCFBVFRMSVNUIGZpZWxkc2V0Ci0gIHRpdGxlICAgICAgICAgICAldmRhdGE7ICAgICAgI0lNUExJRUQKLSAgeG1sOmxhbmcgICAgICAgIE5NVE9LRU4gICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCB0aW1lciBFTVBUWT4KLTwhQVRUTElTVCB0aW1lcgotICBuYW1lICAgICAgIE5NVE9LRU4gICAgICAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgJXZkYXRhOyAgICAgICAgICAgI1JFUVVJUkVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gSW1hZ2VzID09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBJQWxpZ24gIih0b3B8bWlkZGxlfGJvdHRvbSkiID4KLQotPCFFTEVNRU5UIGltZyBFTVBUWT4KLTwhQVRUTElTVCBpbWcKLSAgYWx0ICAgICAgICAldmRhdGE7ICAgICAgI1JFUVVJUkVECi0gIHNyYyAgICAgICAgJUhSRUY7ICAgICAgICNSRVFVSVJFRAotICBsb2NhbHNyYyAgICV2ZGF0YTsgICAgICAjSU1QTElFRAotICB2c3BhY2UgICAgICVsZW5ndGg7ICAgICAiMCIKLSAgaHNwYWNlICAgICAlbGVuZ3RoOyAgICAgIjAiCi0gIGFsaWduICAgICAgJUlBbGlnbjsgICAgICJib3R0b20iCi0gIGhlaWdodCAgICAgJWxlbmd0aDsgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgJWxlbmd0aDsgICAgICNJTVBMSUVECi0gIHhtbDpsYW5nICAgTk1UT0tFTiAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gQW5jaG9yID09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGFuY2hvciAoICNQQ0RBVEEgfCBiciB8IGltZyB8IGdvIHwgcHJldiB8IHJlZnJlc2ggKSo+Ci08IUFUVExJU1QgYW5jaG9yCi0gIHRpdGxlICAgICAgICAldmRhdGE7ICAgICAgI0lNUExJRUQKLSAgeG1sOmxhbmcgICAgIE5NVE9LRU4gICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBhICggI1BDREFUQSB8IGJyIHwgaW1nICkqPgotPCFBVFRMSVNUIGEKLSAgaHJlZiAgICAgICAgICVIUkVGOyAgICAgICAjUkVRVUlSRUQKLSAgdGl0bGUgICAgICAgICV2ZGF0YTsgICAgICAjSU1QTElFRAotICB4bWw6bGFuZyAgICAgTk1UT0tFTiAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gVGFibGVzID09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIHRhYmxlICh0cikrPgotPCFBVFRMSVNUIHRhYmxlCi0gIHRpdGxlICAgICAgICV2ZGF0YTsgICAgI0lNUExJRUQKLSAgYWxpZ24gICAgICAgQ0RBVEEgICAgICAjSU1QTElFRAotICBjb2x1bW5zICAgICAlbnVtYmVyOyAgICNSRVFVSVJFRAotICB4bWw6bGFuZyAgICBOTVRPS0VOICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIHRyICh0ZCkrPgotPCFBVFRMSVNUIHRyCi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIHRkICggJXRleHQ7IHwgJWxheW91dDsgfCBpbWcgfCBhbmNob3IgfCBhICkqPgotPCFBVFRMSVNUIHRkCi0gIHhtbDpsYW5nICAgICAgICBOTVRPS0VOICAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gVGV4dCBsYXlvdXQgYW5kIGxpbmUgYnJlYWtzID09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGVtICAgICAoJWZsb3c7KSo+Ci08IUFUVExJU1QgZW0KLSAgeG1sOmxhbmcgICAgICAgIE5NVE9LRU4gICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgc3Ryb25nICglZmxvdzspKj4KLTwhQVRUTElTVCBzdHJvbmcKLSAgeG1sOmxhbmcgICAgICAgIE5NVE9LRU4gICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgYiAgICAgICglZmxvdzspKj4KLTwhQVRUTElTVCBiCi0gIHhtbDpsYW5nICAgICAgICBOTVRPS0VOICAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGkgICAgICAoJWZsb3c7KSo+Ci08IUFUVExJU1QgaQotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCB1ICAgICAgKCVmbG93OykqPgotPCFBVFRMSVNUIHUKLSAgeG1sOmxhbmcgICAgICAgIE5NVE9LRU4gICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgYmlnICAgICglZmxvdzspKj4KLTwhQVRUTElTVCBiaWcKLSAgeG1sOmxhbmcgICAgICAgIE5NVE9LRU4gICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgc21hbGwgICglZmxvdzspKj4KLTwhQVRUTElTVCBzbWFsbAotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRU5USVRZICUgVEFsaWduICIobGVmdHxyaWdodHxjZW50ZXIpIj4KLTwhRU5USVRZICUgV3JhcE1vZGUgIih3cmFwfG5vd3JhcCkiID4KLTwhRUxFTUVOVCBwICglZmllbGRzOyB8IGRvKSo+Ci08IUFUVExJU1QgcAotICBhbGlnbiAgICAgICAlVEFsaWduOyAgICAgImxlZnQiCi0gIG1vZGUgICAgICAgICVXcmFwTW9kZTsgICAjSU1QTElFRAotICB4bWw6bGFuZyAgICBOTVRPS0VOICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgYnIgRU1QVFk+Ci08IUFUVExJU1QgYnIKLSAgeG1sOmxhbmcgICAgICAgIE5NVE9LRU4gICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVOVElUWSBxdW90ICAiJiMzNDsiPiAgICAgPCEtLSBxdW90YXRpb24gbWFyayAtLT4KLTwhRU5USVRZIGFtcCAgICImIzM4OyMzODsiPiA8IS0tIGFtcGVyc2FuZCAtLT4KLTwhRU5USVRZIGFwb3MgICImIzM5OyI+ICAgICA8IS0tIGFwb3N0cm9waGUgLS0+Ci08IUVOVElUWSBsdCAgICAiJiMzODsjNjA7Ij4gPCEtLSBsZXNzIHRoYW4gLS0+Ci08IUVOVElUWSBndCAgICAiJiM2MjsiPiAgICAgPCEtLSBncmVhdGVyIHRoYW4gLS0+Ci08IUVOVElUWSBuYnNwICAiJiMxNjA7Ij4gICAgPCEtLSBub24tYnJlYWtpbmcgc3BhY2UgLS0+Ci08IUVOVElUWSBzaHkgICAiJiMxNzM7Ij4gICAgPCEtLSBzb2Z0IGh5cGhlbiAoZGlzY3JldGlvbmFyeSBoeXBoZW4pIC0tPgotCi08IS0tCi1Db3B5cmlnaHQgV2lyZWxlc3MgQXBwbGljYXRpb24gUHJvdG9jb2wgRm9ydW0gTHRkLiwgMTk5OCwxOTk5LgotICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKLS0tPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3dtbDEzLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy93bWwxMy5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDg1YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3dtbDEzLmR0ZAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1iYXNpYzEwLWYuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLWJhc2ljMTAtZi5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViM2QyNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLWJhc2ljMTAtZi5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwzMDg2ICswLDAgQEAKLTwhLS0gWEhUTUwgQmFzaWMgMS4wIERURCAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1iYXNpYzEwLmR0ZCAtLT4KLQotPCEtLSBYSFRNTCBCYXNpYyAxLjAgRFRECi0KLSAgICAgVGhpcyBpcyBYSFRNTCBCYXNpYywgYSBwcm9wZXIgc3Vic2V0IG9mIFhIVE1MLgotCi0gICAgIFRoZSBFeHRlbnNpYmxlIEh5cGVyVGV4dCBNYXJrdXAgTGFuZ3VhZ2UgKFhIVE1MKQotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0KLSAgICAgICAgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlCi0gICAgICAgICBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLgotICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotICAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoZSBYSFRNTCBCYXNpYyBEVEQKLSAgICAgYW5kIGl0cyBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzCi0gICAgIGhlcmVieSBncmFudGVkIGluIHBlcnBldHVpdHksIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UKLSAgICAgYW5kIHRoaXMgcGFyYWdyYXBoIGFwcGVhciBpbiBhbGwgY29waWVzLiAgVGhlIGNvcHlyaWdodCBob2xkZXJzIG1ha2UKLSAgICAgbm8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoZSBEVEQgZm9yIGFueSBwdXJwb3NlLgotCi0gICAgIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzZWQgb3IgaW1wbGllZCB3YXJyYW50eS4KLQotICAgICAgICBFZGl0b3JzOiAgICBNdXJyYXkgTS4gQWx0aGVpbSA8bWFpbHRvOmFsdGhlaW1AZW5nLnN1bi5jb20+Ci0gICAgICAgICAgICAgICAgICAgIFBldGVyIFN0YXJrICAgICAgIDxtYWlsdG86UGV0ZXIuU3RhcmtAZWNzLmVyaWNzc29uLnNlPgotICAgICAgICBSZXZpc2lvbjogICAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotLS0+Ci08IS0tIFRoaXMgaXMgdGhlIGRyaXZlciBmaWxlIGZvciB2ZXJzaW9uIDEuMCBvZiB0aGUgWEhUTUwgQmFzaWMgRFRELgotCi0gICAgIFRoaXMgRFREIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgIFBVQkxJQzogIi0vL1czQy8vRFREIFhIVE1MIEJhc2ljIDEuMC8vRU4iCi0gICAgIFNZU1RFTTogImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLWJhc2ljL3hodG1sLWJhc2ljMTAuZHRkIgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnZlcnNpb24gICItLy9XM0MvL0RURCBYSFRNTCBCYXNpYyAxLjAvL0VOIiA+Ci0KLTwhLS0gVXNlIHRoaXMgVVJJIHRvIGlkZW50aWZ5IHRoZSBkZWZhdWx0IG5hbWVzcGFjZToKLQotICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0KLSAgICAgU2VlIHRoZSBRdWFsaWZpZWQgTmFtZXMgbW9kdWxlIGZvciBpbmZvcm1hdGlvbgotICAgICBvbiB0aGUgdXNlIG9mIG5hbWVzcGFjZSBwcmVmaXhlcyBpbiB0aGUgRFRELgotLS0+Ci08IUVOVElUWSAlIE5TLnByZWZpeGVkICJJR05PUkUiID4KLTwhRU5USVRZICUgWEhUTUwucHJlZml4ICAiIiA+Ci0KLTwhLS0gUmVzZXJ2ZWQgZm9yIHVzZSB3aXRoIHRoZSBYTGluayBuYW1lc3BhY2U6Ci0tLT4KLTwhRU5USVRZICUgWExJTksueG1sbnMgIiIgPgotPCFFTlRJVFkgJSBYTElOSy54bWxucy5hdHRyaWIgIiIgPgotCi08IS0tIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHVzaW5nIFhIVE1MIEJhc2ljIDEuMCBkaXJlY3RseSwgdXNlCi0gICAgIHRoZSBGUEkgaW4gdGhlIERPQ1RZUEUgZGVjbGFyYXRpb24sIHdpdGggdGhlIHhtbG5zIGF0dHJpYnV0ZQotICAgICBvbiB0aGUgZG9jdW1lbnQgZWxlbWVudCB0byBpZGVudGlmeSB0aGUgZGVmYXVsdCBuYW1lc3BhY2U6Ci0KLSAgICAgICAgIDw/eG1sIHZlcnNpb249IjEuMCI/PgotICAgICAgICAgPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCBCYXNpYyAxLjAvL0VOIgotICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1iYXNpYy94aHRtbC1iYXNpYzEwLmR0ZCIgPgotICAgICAgICAgPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICAgICAgICB4bWw6bGFuZz0iZW4iID4KLSAgICAgICAgIC4uLgotICAgICAgICAgPC9odG1sPgotLS0+Ci0KLTwhLS0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2Ugd2l0aCBkb2N1bWVudCBwcm9maWxlcyAtLT4KLTwhRU5USVRZICUgWEhUTUwucHJvZmlsZSAgIiIgPgotCi08IS0tIEJpZGlyZWN0aW9uYWwgVGV4dCBmZWF0dXJlcwotICAgICBUaGlzIGZlYXR1cmUtdGVzdCBlbnRpdHkgaXMgdXNlZCB0byBkZWNsYXJlIGVsZW1lbnRzCi0gICAgIGFuZCBhdHRyaWJ1dGVzIHVzZWQgZm9yIGJpZGlyZWN0aW9uYWwgdGV4dCBzdXBwb3J0LgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLmJpZGkgICJJR05PUkUiID4KLQotPD9kb2MgdHlwZT0iZG9jdHlwZSIgcm9sZT0idGl0bGUiIHsgWEhUTUwgQmFzaWMgMS4wIH0gPz4KLQotPCEtLSA6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6IC0tPgotCi08IUVOVElUWSAlIHhodG1sLWV2ZW50cy5tb2R1bGUgICAiSUdOT1JFIiA+Ci08IUVOVElUWSAlIHhodG1sLWJkby5tb2R1bGUgICAgICAiJVhIVE1MLmJpZGk7IiA+Ci0KLTwhRU5USVRZICUgeGh0bWwtbW9kZWwubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBCYXNpYyAxLjAgRG9jdW1lbnQgTW9kZWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1iYXNpYzEwLW1vZGVsLTEubW9kIiA+Ci0KLTwhRU5USVRZICUgeGh0bWwtZnJhbWV3b3JrLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgTW9kdWxhciBGcmFtZXdvcmsgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1mcmFtZXdvcmstMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgTW9kdWxhciBGcmFtZXdvcmsgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtZnJhbWV3b3JrLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIE1vZHVsYXIgRnJhbWV3b3JrIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtZnJhbWV3b3JrLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIE1vZHVsYXIgRnJhbWV3b3JrCi0KLSAgICAgVGhpcyByZXF1aXJlZCBtb2R1bGUgaW5zdGFudGlhdGVzIHRoZSBtb2R1bGVzIG5lZWRlZAotICAgICB0byBzdXBwb3J0IHRoZSBYSFRNTCBtb2R1bGFyaXphdGlvbiBtb2RlbCwgaW5jbHVkaW5nOgotCi0gICAgICAgICsgIG5vdGF0aW9ucwotICAgICAgICArICBkYXRhdHlwZXMKLSAgICAgICAgKyAgbmFtZXNwYWNlLXF1YWxpZmllZCBuYW1lcwotICAgICAgICArICBjb21tb24gYXR0cmlidXRlcwotICAgICAgICArICBkb2N1bWVudCBtb2RlbAotICAgICAgICArICBjaGFyYWN0ZXIgZW50aXRpZXMKLQotICAgICBUaGUgSW50cmluc2ljIEV2ZW50cyBtb2R1bGUgaXMgaWdub3JlZCBieSBkZWZhdWx0IGJ1dAotICAgICBvY2N1cnMgaW4gdGhpcyBtb2R1bGUgYmVjYXVzZSBpdCBtdXN0IGJlIGluc3RhbnRpYXRlZAotICAgICBwcmlvciB0byBBdHRyaWJ1dGVzIGJ1dCBhZnRlciBEYXRhdHlwZXMuCi0tLT4KLQotPCFFTlRJVFkgJSB4aHRtbC1hcmNoLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWFyY2gubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYXJjaC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2UgQXJjaGl0ZWN0dXJlIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYXJjaC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCYXNlIEFyY2hpdGVjdHVyZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1hcmNoLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2UgQXJjaGl0ZWN0dXJlIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtYXJjaC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBUaGlzIG9wdGlvbmFsIG1vZHVsZSBpbmNsdWRlcyBkZWNsYXJhdGlvbnMgdGhhdCBlbmFibGUgWEhUTUwgdG8gYmUgdXNlZAotICAgICBhcyBhIGJhc2UgYXJjaGl0ZWN0dXJlIGFjY29yZGluZyB0byB0aGUgJ0FyY2hpdGVjdHVyYWwgRm9ybXMgRGVmaW5pdGlvbgotICAgICBSZXF1aXJlbWVudHMnIChBbm5leCBBLjMsIElTTy9JRUMgMTA3NDQsIDJuZCBlZGl0aW9uKS4gRm9yIG1vcmUgaW5mb3JtYXRpb24KLSAgICAgb24gdXNlIG9mIGFyY2hpdGVjdHVyYWwgZm9ybXMsIHNlZSB0aGUgSHlUaW1lIHdlYiBzaXRlIGF0OgotCi0gICAgICAgICBodHRwOi8vd3d3Lmh5dGltZS5vcmcvCi0tLT4KLQotPD9JUzEwNzQ0IEFyY0Jhc2UgeGh0bWwgPz4KLQotPCFOT1RBVElPTiB4aHRtbCBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gQUZEUiBBUkNCQVNFIFhIVE1MIDEuMS8vRU4iID4KLQotPCEtLSBFbnRpdHkgZGVjbGFyYXRpb24gZm9yIGFzc29jaWF0ZWQgQXJjaGl0ZWN0dXJhbCBEVEQKLS0tPgotPCFFTlRJVFkgeGh0bWwtYXJjaC5kdGQKLSAgICAgIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgQXJjaGl0ZWN0dXJlIDEuMS8vRU4iCi0gICAgICAgICAgICAgInhodG1sMTEtYXJjaC5kdGQiID4KLQotPD9JUzEwNzQ0OmFyY2ggeGh0bWwKLSAgICBwdWJsaWMtaWQgICAgICAgPSAgIi0vL1czQy8vTk9UQVRJT04gQUZEUiBBUkNCQVNFIFhIVE1MIDEuMS8vRU4iCi0gICAgZHRkLXB1YmxpYy1pZCAgID0gICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIgotICAgIGR0ZC1zeXN0ZW0taWQgICA9ICAieGh0bWwxMS5kdGQiCi0gICAgZG9jLWVsZW0tZm9ybSAgID0gICJodG1sIgotICAgIGZvcm0tYXR0ICAgICAgICA9ICAiaHRtbCIKLSAgICByZW5hbWVyLWF0dCAgICAgPSAgImh0bmFtZXMiCi0gICAgc3VwcHJlc3Nvci1hdHQgID0gICJodHN1cHAiCi0gICAgZGF0YS1pZ25vcmUtYXR0ID0gICJodGlnbiIKLSAgICBhdXRvICAgICAgICAgICAgPSAgIkFyY0F1dG8iCi0gICAgb3B0aW9ucyAgICAgICAgID0gICJIdE1vZFJlcSBIdE1vZE9wdCIKLSAgICBIdE1vZFJlcSAgICAgICAgPSAgIkZyYW1ld29yayBUZXh0IEh5cGVydGV4dCBMaXN0cyBTdHJ1Y3R1cmUiCi0gICAgSHRNb2RPcHQgICAgICAgID0gICJTdGFuZGFyZCIKLT8+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWFyY2gtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ub3RhdGlvbnMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtbm90YXRpb25zLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLW5vdGF0aW9ucy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OUyBYSFRNTCBOb3RhdGlvbnMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1ub3RhdGlvbnMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgTm90YXRpb25zIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbm90YXRpb25zLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT05TIFhIVE1MIE5vdGF0aW9ucyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLW5vdGF0aW9ucy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBOb3RhdGlvbnMKLQotICAgICBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgbm90YXRpb25zLCBtYW55IG9mIHRoZXNlIGltcG9ydGVkIGZyb20gCi0gICAgIG90aGVyIHNwZWNpZmljYXRpb25zIGFuZCBzdGFuZGFyZHMuIFdoZW4gYW4gZXhpc3RpbmcgRlBJIGlzCi0gICAgIGtub3duLCBpdCBpcyBpbmNvcnBvcmF0ZWQgaGVyZS4KLS0tPgotCi08IS0tIFhNTCBOb3RhdGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gU0dNTCBhbmQgWE1MIE5vdGF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFczQyBYTUwgMS4wIFJlY29tbWVuZGF0aW9uIC0tPgotPCFOT1RBVElPTiB3M2MteG1sIAotICAgICBQVUJMSUMgIklTTyA4ODc5Ly9OT1RBVElPTiBFeHRlbnNpYmxlIE1hcmt1cCBMYW5ndWFnZSAoWE1MKSAxLjAvL0VOIiA+Ci0KLTwhLS0gWE1MIDEuMCBDREFUQSAtLT4KLTwhTk9UQVRJT04gY2RhdGEgCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYTUwgMS4wOiBDREFUQS8vRU4iID4KLQotPCEtLSBTR01MIEZvcm1hbCBQdWJsaWMgSWRlbnRpZmllcnMgLS0+Ci08IU5PVEFUSU9OIGZwaQotICAgICBQVUJMSUMgIklTTyA4ODc5OjE5ODYvL05PVEFUSU9OIEZvcm1hbCBQdWJsaWMgSWRlbnRpZmllci8vRU4iID4KLQotPCEtLSBYSFRNTCBOb3RhdGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTGVuZ3RoIGRlZmluZWQgZm9yIGNlbGxwYWRkaW5nL2NlbGxzcGFjaW5nIC0tPgotCi08IS0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLTwhTk9UQVRJT04gbGVuZ3RoIAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTGVuZ3RoLy9FTiIgPgotCi08IS0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMgLS0+Ci08IU5PVEFUSU9OIGxpbmtUeXBlcyAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IExpbmtUeXBlcy8vRU4iID4KLQotPCEtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMgLS0+Ci08IU5PVEFUSU9OIG1lZGlhRGVzYyAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IE1lZGlhRGVzYy8vRU4iID4KLQotPCEtLSBwaXhlbCwgcGVyY2VudGFnZSwgb3IgcmVsYXRpdmUgLS0+Ci08IU5PVEFUSU9OIG11bHRpTGVuZ3RoIAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTXVsdGlMZW5ndGgvL0VOIiA+Ci0KLTwhLS0gb25lIG9yIG1vcmUgZGlnaXRzIChOVU1CRVIpIC0tPgotPCFOT1RBVElPTiBudW1iZXIgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBOdW1iZXIvL0VOIiA+Ci0KLTwhLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KLTwhTk9UQVRJT04gcGl4ZWxzIAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogUGl4ZWxzLy9FTiIgPgotCi08IS0tIHNjcmlwdCBleHByZXNzaW9uIC0tPgotPCFOT1RBVElPTiBzY3JpcHQgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBTY3JpcHQvL0VOIiA+Ci0KLTwhLS0gdGV4dHVhbCBjb250ZW50IC0tPgotPCFOT1RBVElPTiB0ZXh0IAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogVGV4dC8vRU4iID4KLQotPCEtLSBJbXBvcnRlZCBOb3RhdGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gW0lTTzEwNjQ2XSAtLT4KLTwhTk9UQVRJT04gY2hhcmFjdGVyIAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ2hhcmFjdGVyLy9FTiIgPgotCi08IS0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFOT1RBVElPTiBjaGFyc2V0IAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ2hhcnNldC8vRU4iID4KLQotPCEtLSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNoYXJhY3RlciBlbmNvZGluZ3MsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IU5PVEFUSU9OIGNoYXJzZXRzIAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ2hhcnNldHMvL0VOIiA+Ci0KLTwhLS0gbWVkaWEgdHlwZSwgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhTk9UQVRJT04gY29udGVudFR5cGUgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDb250ZW50VHlwZS8vRU4iID4KLQotPCEtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhTk9UQVRJT04gY29udGVudFR5cGVzIAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ29udGVudFR5cGVzLy9FTiIgPgotCi08IS0tIGRhdGUgYW5kIHRpbWUgaW5mb3JtYXRpb24uIElTTyBkYXRlIGZvcm1hdCAtLT4KLTwhTk9UQVRJT04gZGF0ZXRpbWUgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBEYXRldGltZS8vRU4iID4KLQotPCEtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMTc2Nl0gLS0+Ci08IU5PVEFUSU9OIGxhbmd1YWdlQ29kZSAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IExhbmd1YWdlQ29kZS8vRU4iID4KLQotPCEtLSBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciwgc2VlIFtVUkldIC0tPgotPCFOT1RBVElPTiB1cmkgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBVUkkvL0VOIiA+Ci0KLTwhLS0gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzLCBzZWUgW1VSSV0gLS0+Ci08IU5PVEFUSU9OIHVyaXMgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBVUklzLy9FTiIgPgotCi08IS0tIGVuZCBvZiB4aHRtbC1ub3RhdGlvbnMtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1kYXRhdHlwZXMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtZGF0YXR5cGVzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWRhdGF0eXBlcy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIERhdGF0eXBlcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWRhdGF0eXBlcy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBEYXRhdHlwZXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1kYXRhdHlwZXMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgRGF0YXR5cGVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtZGF0YXR5cGVzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIERhdGF0eXBlcwotCi0gICAgIGRlZmluZXMgY29udGFpbmVycyBmb3IgdGhlIGZvbGxvd2luZyBkYXRhdHlwZXMsIG1hbnkgb2YKLSAgICAgdGhlc2UgaW1wb3J0ZWQgZnJvbSBvdGhlciBzcGVjaWZpY2F0aW9ucyBhbmQgc3RhbmRhcmRzLgotLS0+Ci0KLTwhLS0gTGVuZ3RoIGRlZmluZWQgZm9yIGNlbGxwYWRkaW5nL2NlbGxzcGFjaW5nIC0tPgotCi08IS0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLTwhRU5USVRZICUgTGVuZ3RoLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMgLS0+Ci08IUVOVElUWSAlIExpbmtUeXBlcy5kYXRhdHlwZSAiTk1UT0tFTlMiID4KLQotPCEtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMgLS0+Ci08IUVOVElUWSAlIE1lZGlhRGVzYy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBwaXhlbCwgcGVyY2VudGFnZSwgb3IgcmVsYXRpdmUgLS0+Ci08IUVOVElUWSAlIE11bHRpTGVuZ3RoLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIG9uZSBvciBtb3JlIGRpZ2l0cyAoTlVNQkVSKSAtLT4KLTwhRU5USVRZICUgTnVtYmVyLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci08IUVOVElUWSAlIFBpeGVscy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBzY3JpcHQgZXhwcmVzc2lvbiAtLT4KLTwhRU5USVRZICUgU2NyaXB0LmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIHRleHR1YWwgY29udGVudCAtLT4KLTwhRU5USVRZICUgVGV4dC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBJbXBvcnRlZCBEYXRhdHlwZXMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gW0lTTzEwNjQ2XSAtLT4KLTwhRU5USVRZICUgQ2hhcmFjdGVyLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFFTlRJVFkgJSBDaGFyc2V0LmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhRU5USVRZICUgQ2hhcnNldHMuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gbWVkaWEgdHlwZSwgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhRU5USVRZICUgQ29udGVudFR5cGUuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgdHlwZXMsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IUVOVElUWSAlIENvbnRlbnRUeXBlcy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uLiBJU08gZGF0ZSBmb3JtYXQgLS0+Ci08IUVOVElUWSAlIERhdGV0aW1lLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGZvcm1hbCBwdWJsaWMgaWRlbnRpZmllciwgYXMgcGVyIFtJU084ODc5XSAtLT4KLTwhRU5USVRZICUgRlBJLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGEgbGFuZ3VhZ2UgY29kZSwgYXMgcGVyIFtSRkMxNzY2XSAtLT4KLTwhRU5USVRZICUgTGFuZ3VhZ2VDb2RlLmRhdGF0eXBlICJOTVRPS0VOIiA+Ci0KLTwhLS0gYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIsIHNlZSBbVVJJXSAtLT4KLTwhRU5USVRZICUgVVJJLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycywgc2VlIFtVUkldIC0tPgotPCFFTlRJVFkgJSBVUklzLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGVuZCBvZiB4aHRtbC1kYXRhdHlwZXMtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBwbGFjZWhvbGRlciBmb3IgWExpbmsgc3VwcG9ydCBtb2R1bGUgLS0+Ci08IUVOVElUWSAlIHhodG1sLXhsaW5rLm1vZCAiIiA+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1xbmFtZS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1xbmFtZS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1xbmFtZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIFF1YWxpZmllZCBOYW1lcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLXFuYW1lLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBRbmFtZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtcW5hbWUtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgUXVhbGlmaWVkIE5hbWVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtcW5hbWUtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gWEhUTUwgUW5hbWUgKFF1YWxpZmllZCBOYW1lKSBNb2R1bGUKLQotICAgICBUaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdHdvIHBhcnRzLCBsYWJlbGVkIFNlY3Rpb24gJ0EnIGFuZCAnQic6Ci0KLSAgICAgICBTZWN0aW9uIEEgZGVjbGFyZXMgcGFyYW1ldGVyIGVudGl0aWVzIHRvIHN1cHBvcnQgbmFtZXNwYWNlLQotICAgICAgIHF1YWxpZmllZCBuYW1lcywgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucywgYW5kIG5hbWUgcHJlZml4aW5nIAotICAgICAgIGZvciBYSFRNTCBhbmQgZXh0ZW5zaW9ucy4KLSAgICAKLSAgICAgICBTZWN0aW9uIEIgZGVjbGFyZXMgcGFyYW1ldGVyIGVudGl0aWVzIHVzZWQgdG8gcHJvdmlkZQotICAgICAgIG5hbWVzcGFjZS1xdWFsaWZpZWQgbmFtZXMgZm9yIGFsbCBYSFRNTCBlbGVtZW50IHR5cGVzOgotCi0gICAgICAgICAlYXBwbGV0LnFuYW1lOyAgIHRoZSB4bWxucy1xdWFsaWZpZWQgbmFtZSBmb3IgPGFwcGxldD4KLSAgICAgICAgICViYXNlLnFuYW1lOyAgICAgdGhlIHhtbG5zLXF1YWxpZmllZCBuYW1lIGZvciA8YmFzZT4KLSAgICAgICAgIC4uLgotCi0gICAgIFhIVE1MIGV4dGVuc2lvbnMgd291bGQgY3JlYXRlIGEgbW9kdWxlIHNpbWlsYXIgdG8gdGhpcyBvbmUuIAotICAgICBJbmNsdWRlZCBpbiB0aGUgWEhUTUwgZGlzdHJpYnV0aW9uIGlzIGEgdGVtcGxhdGUgbW9kdWxlIAotICAgICAoJ3RlbXBsYXRlLXFuYW1lLTEubW9kJykgc3VpdGFibGUgZm9yIHRoaXMgcHVycG9zZS4KLS0tPgotCi08IS0tIFNlY3Rpb24gQTogWEhUTUwgWE1MIE5hbWVzcGFjZSBGcmFtZXdvcmsgOjo6Ojo6Ojo6Ojo6Ojo6Ojo6OjogLS0+Ci0KLTwhLS0gMS4gRGVjbGFyZSBhICVYSFRNTC5wcmVmaXhlZDsgY29uZGl0aW9uYWwgc2VjdGlvbiBrZXl3b3JkLCB1c2VkCi0gICAgICAgIHRvIGFjdGl2YXRlIG5hbWVzcGFjZSBwcmVmaXhpbmcuIFRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCAKLSAgICAgICAgaW5oZXJpdCAnJU5TLnByZWZpeGVkOycgZnJvbSB0aGUgRFREIGRyaXZlciwgc28gdGhhdCB1bmxlc3MgCi0gICAgICAgIG92ZXJyaWRkZW4sIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb2xsb3dzIHRoZSBvdmVyYWxsIERURCAKLSAgICAgICAgcHJlZml4aW5nIHNjaGVtZS4KLS0tPgotPCFFTlRJVFkgJSBOUy5wcmVmaXhlZCAiSUdOT1JFIiA+Ci08IUVOVElUWSAlIFhIVE1MLnByZWZpeGVkICIlTlMucHJlZml4ZWQ7IiA+Ci0KLTwhLS0gMi4gRGVjbGFyZSBhIHBhcmFtZXRlciBlbnRpdHkgKGVnLiwgJVhIVE1MLnhtbG5zOykgY29udGFpbmluZyAKLSAgICAgICAgdGhlIFVSSSByZWZlcmVuY2UgdXNlZCB0byBpZGVudGlmeSB0aGUgWEhUTUwgbmFtZXNwYWNlOgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnhtbG5zICAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgPgotCi08IS0tIDMuIERlY2xhcmUgcGFyYW1ldGVyIGVudGl0aWVzIChlZy4sICVYSFRNTC5wcmVmaXg7KSBjb250YWluaW5nCi0gICAgICAgIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBwcmVmaXggc3RyaW5nKHMpIHRvIHVzZSB3aGVuIHByZWZpeGluZyAKLSAgICAgICAgaXMgZW5hYmxlZC4gVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBpbiB0aGUgRFREIGRyaXZlciBvciB0aGUKLSAgICAgICAgaW50ZXJuYWwgc3Vic2V0IG9mIGFuIGRvY3VtZW50IGluc3RhbmNlLiBJZiBubyBkZWZhdWx0IHByZWZpeAotICAgICAgICBpcyBkZXNpcmVkLCB0aGlzIG1heSBiZSBkZWNsYXJlZCBhcyBhbiBlbXB0eSBzdHJpbmcuCi0KLSAgICAgTk9URTogQXMgc3BlY2lmaWVkIGluIFtYTUxOQU1FU10sIHRoZSBuYW1lc3BhY2UgcHJlZml4IHNlcnZlcyAKLSAgICAgYXMgYSBwcm94eSBmb3IgdGhlIFVSSSByZWZlcmVuY2UsIGFuZCBpcyBub3QgaW4gaXRzZWxmIHNpZ25pZmljYW50LgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnByZWZpeCAgIiIgPgotCi08IS0tIDQuIERlY2xhcmUgcGFyYW1ldGVyIGVudGl0aWVzIChlZy4sICVYSFRNTC5wZng7KSBjb250YWluaW5nIHRoZSAKLSAgICAgICAgY29sb25pemVkIHByZWZpeChlcykgKGVnLiwgJyVYSFRNTC5wcmVmaXg7OicpIHVzZWQgd2hlbiAKLSAgICAgICAgcHJlZml4aW5nIGlzIGFjdGl2ZSwgYW4gZW1wdHkgc3RyaW5nIHdoZW4gaXQgaXMgbm90LgotLS0+Ci08IVslWEhUTUwucHJlZml4ZWQ7WwotPCFFTlRJVFkgJSBYSFRNTC5wZnggICIlWEhUTUwucHJlZml4OzoiID4KLV1dPgotPCFFTlRJVFkgJSBYSFRNTC5wZnggICIiID4KLQotPCEtLSBkZWNsYXJlIHF1YWxpZmllZCBuYW1lIGV4dGVuc2lvbnMgaGVyZSAuLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXFuYW1lLWV4dHJhLm1vZCAiIiA+Ci0KLQotPCEtLSA1LiBUaGUgcGFyYW1ldGVyIGVudGl0eSAlWEhUTUwueG1sbnMuZXh0cmEuYXR0cmliOyBtYXkgYmUKLSAgICAgICAgcmVkZWNsYXJlZCB0byBjb250YWluIGFueSBub24tWEhUTUwgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIAotICAgICAgICBhdHRyaWJ1dGVzIGZvciBuYW1lc3BhY2VzIGVtYmVkZGVkIGluIFhIVE1MLiBUaGUgZGVmYXVsdCAKLSAgICAgICAgaXMgYW4gZW1wdHkgc3RyaW5nLiAgWExpbmsgc2hvdWxkIGJlIGluY2x1ZGVkIGhlcmUgaWYgdXNlZCAKLSAgICAgICAgaW4gdGhlIERURC4KLS0tPgotPCFFTlRJVFkgJSBYSFRNTC54bWxucy5leHRyYS5hdHRyaWIgIiIgPgotCi08IS0tIFRoZSByZW1haW5kZXIgb2YgU2VjdGlvbiBBIGlzIG9ubHkgZm9sbG93ZWQgaW4gWEhUTUwsIG5vdCBleHRlbnNpb25zLiAtLT4KLQotPCEtLSBEZWNsYXJlIGEgcGFyYW1ldGVyIGVudGl0eSAlTlMuZGVjbC5hdHRyaWI7IGNvbnRhaW5pbmcKLSAgICAgYWxsIFhNTCBOYW1lc3BhY2UgZGVjbGFyYXRpb25zIHVzZWQgaW4gdGhlIERURCwgcGx1cyB0aGUKLSAgICAgeG1sbnMgZGVjbGFyYXRpb24gZm9yIFhIVE1MLCBpdHMgZm9ybSBkZXBlbmRlbnQgb24gd2hldGhlciAKLSAgICAgcHJlZml4aW5nIGlzIGFjdGl2ZS4gCi0tLT4KLTwhWyVYSFRNTC5wcmVmaXhlZDtbCi08IUVOVElUWSAlIE5TLmRlY2wuYXR0cmliCi0gICAgICJ4bWxuczolWEhUTUwucHJlZml4OyAgJVVSSS5kYXRhdHlwZTsgICAjRklYRUQgJyVYSFRNTC54bWxuczsnCi0gICAgICAlWEhUTUwueG1sbnMuZXh0cmEuYXR0cmliOyIKLT4KLV1dPgotPCFFTlRJVFkgJSBOUy5kZWNsLmF0dHJpYgotICAgICAiJVhIVE1MLnhtbG5zLmV4dHJhLmF0dHJpYjsiCi0+Ci0KLTwhLS0gVGhpcyBpcyBhIHBsYWNlaG9sZGVyIGZvciBmdXR1cmUgWExpbmsgc3VwcG9ydC4KLS0tPgotPCFFTlRJVFkgJSBYTElOSy54bWxucy5hdHRyaWIgIiIgPgotCi08IS0tIERlY2xhcmUgYSBwYXJhbWV0ZXIgZW50aXR5ICVOUy5kZWNsLmF0dHJpYjsgY29udGFpbmluZyBhbGwgCi0gICAgIFhNTCBuYW1lc3BhY2UgZGVjbGFyYXRpb24gYXR0cmlidXRlcyB1c2VkIGJ5IFhIVE1MLCBpbmNsdWRpbmcKLSAgICAgYSBkZWZhdWx0IHhtbG5zIGF0dHJpYnV0ZSB3aGVuIHByZWZpeGluZyBpcyBpbmFjdGl2ZS4KLS0tPgotPCFbJVhIVE1MLnByZWZpeGVkO1sKLTwhRU5USVRZICUgWEhUTUwueG1sbnMuYXR0cmliCi0gICAgICIlTlMuZGVjbC5hdHRyaWI7Ci0gICAgICAlWExJTksueG1sbnMuYXR0cmliOyIKLT4KLV1dPgotPCFFTlRJVFkgJSBYSFRNTC54bWxucy5hdHRyaWIKLSAgICAgInhtbG5zICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0ZJWEVEICclWEhUTUwueG1sbnM7JwotICAgICAgJVhMSU5LLnhtbG5zLmF0dHJpYjsiCi0+Ci0KLTwhLS0gcGxhY2Vob2xkZXIgZm9yIHF1YWxpZmllZCBuYW1lIHJlZGVjbGFyYXRpb25zIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1xbmFtZS5yZWRlY2wgIiIgPgotCi0KLTwhLS0gU2VjdGlvbiBCOiBYSFRNTCBRdWFsaWZpZWQgTmFtZXMgOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjogLS0+Ci0KLTwhLS0gNi4gVGhpcyBzZWN0aW9uIGRlY2xhcmVzIHBhcmFtZXRlciBlbnRpdGllcyB1c2VkIHRvIHByb3ZpZGUKLSAgICAgICAgbmFtZXNwYWNlLXF1YWxpZmllZCBuYW1lcyBmb3IgYWxsIFhIVE1MIGVsZW1lbnQgdHlwZXMuCi0tLT4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1hcHBsZXQtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGFwcGxldC5xbmFtZSAgIiVYSFRNTC5wZng7YXBwbGV0IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmFzZS0xLm1vZCAtLT4KLTwhRU5USVRZICUgYmFzZS5xbmFtZSAgICAiJVhIVE1MLnBmeDtiYXNlIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmRvLTEubW9kIC0tPgotPCFFTlRJVFkgJSBiZG8ucW5hbWUgICAgICIlWEhUTUwucGZ4O2JkbyIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJsa3BocmFzLTEubW9kIC0tPgotPCFFTlRJVFkgJSBhZGRyZXNzLnFuYW1lICIlWEhUTUwucGZ4O2FkZHJlc3MiID4KLTwhRU5USVRZICUgYmxvY2txdW90ZS5xbmFtZSAgIiVYSFRNTC5wZng7YmxvY2txdW90ZSIgPgotPCFFTlRJVFkgJSBwcmUucW5hbWUgICAgICIlWEhUTUwucGZ4O3ByZSIgPgotPCFFTlRJVFkgJSBoMS5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2gxIiA+Ci08IUVOVElUWSAlIGgyLnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDIiID4KLTwhRU5USVRZICUgaDMucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoMyIgPgotPCFFTlRJVFkgJSBoNC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2g0IiA+Ci08IUVOVElUWSAlIGg1LnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDUiID4KLTwhRU5USVRZICUgaDYucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoNiIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJsa3ByZXMtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGhyLnFuYW1lICAgICAgIiVYSFRNTC5wZng7aHIiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGRpdi5xbmFtZSAgICAgIiVYSFRNTC5wZng7ZGl2IiA+Ci08IUVOVElUWSAlIHAucW5hbWUgICAgICAgIiVYSFRNTC5wZng7cCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWVkaXQtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGlucy5xbmFtZSAgICAgIiVYSFRNTC5wZng7aW5zIiA+Ci08IUVOVElUWSAlIGRlbC5xbmFtZSAgICAgIiVYSFRNTC5wZng7ZGVsIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtZm9ybS0xLm1vZCAtLT4KLTwhRU5USVRZICUgZm9ybS5xbmFtZSAgICAiJVhIVE1MLnBmeDtmb3JtIiA+Ci08IUVOVElUWSAlIGxhYmVsLnFuYW1lICAgIiVYSFRNTC5wZng7bGFiZWwiID4KLTwhRU5USVRZICUgaW5wdXQucW5hbWUgICAiJVhIVE1MLnBmeDtpbnB1dCIgPgotPCFFTlRJVFkgJSBzZWxlY3QucW5hbWUgICIlWEhUTUwucGZ4O3NlbGVjdCIgPgotPCFFTlRJVFkgJSBvcHRncm91cC5xbmFtZSAgIiVYSFRNTC5wZng7b3B0Z3JvdXAiID4KLTwhRU5USVRZICUgb3B0aW9uLnFuYW1lICAiJVhIVE1MLnBmeDtvcHRpb24iID4KLTwhRU5USVRZICUgdGV4dGFyZWEucW5hbWUgICIlWEhUTUwucGZ4O3RleHRhcmVhIiA+Ci08IUVOVElUWSAlIGZpZWxkc2V0LnFuYW1lICAiJVhIVE1MLnBmeDtmaWVsZHNldCIgPgotPCFFTlRJVFkgJSBsZWdlbmQucW5hbWUgICIlWEhUTUwucGZ4O2xlZ2VuZCIgPgotPCFFTlRJVFkgJSBidXR0b24ucW5hbWUgICIlWEhUTUwucGZ4O2J1dHRvbiIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWh5cGVydGV4dC0xLm1vZCAtLT4KLTwhRU5USVRZICUgYS5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDthIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW1hZ2UtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGltZy5xbmFtZSAgICAgIiVYSFRNTC5wZng7aW1nIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW5scGhyYXMtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGFiYnIucW5hbWUgICAgIiVYSFRNTC5wZng7YWJiciIgPgotPCFFTlRJVFkgJSBhY3JvbnltLnFuYW1lICIlWEhUTUwucGZ4O2Fjcm9ueW0iID4KLTwhRU5USVRZICUgY2l0ZS5xbmFtZSAgICAiJVhIVE1MLnBmeDtjaXRlIiA+Ci08IUVOVElUWSAlIGNvZGUucW5hbWUgICAgIiVYSFRNTC5wZng7Y29kZSIgPgotPCFFTlRJVFkgJSBkZm4ucW5hbWUgICAgICIlWEhUTUwucGZ4O2RmbiIgPgotPCFFTlRJVFkgJSBlbS5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2VtIiA+Ci08IUVOVElUWSAlIGtiZC5xbmFtZSAgICAgIiVYSFRNTC5wZng7a2JkIiA+Ci08IUVOVElUWSAlIHEucW5hbWUgICAgICAgIiVYSFRNTC5wZng7cSIgPgotPCFFTlRJVFkgJSBzYW1wLnFuYW1lICAgICIlWEhUTUwucGZ4O3NhbXAiID4KLTwhRU5USVRZICUgc3Ryb25nLnFuYW1lICAiJVhIVE1MLnBmeDtzdHJvbmciID4KLTwhRU5USVRZICUgdmFyLnFuYW1lICAgICAiJVhIVE1MLnBmeDt2YXIiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbmxwcmVzLTEubW9kIC0tPgotPCFFTlRJVFkgJSBiLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O2IiID4KLTwhRU5USVRZICUgYmlnLnFuYW1lICAgICAiJVhIVE1MLnBmeDtiaWciID4KLTwhRU5USVRZICUgaS5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDtpIiA+Ci08IUVOVElUWSAlIHNtYWxsLnFuYW1lICAgIiVYSFRNTC5wZng7c21hbGwiID4KLTwhRU5USVRZICUgc3ViLnFuYW1lICAgICAiJVhIVE1MLnBmeDtzdWIiID4KLTwhRU5USVRZICUgc3VwLnFuYW1lICAgICAiJVhIVE1MLnBmeDtzdXAiID4KLTwhRU5USVRZICUgdHQucW5hbWUgICAgICAiJVhIVE1MLnBmeDt0dCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWlubHN0cnVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgYnIucW5hbWUgICAgICAiJVhIVE1MLnBmeDticiIgPgotPCFFTlRJVFkgJSBzcGFuLnFuYW1lICAgICIlWEhUTUwucGZ4O3NwYW4iID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pc21hcC0xLm1vZCAoYWxzbyBjc2lzbWFwLCBzc2lzbWFwKSAtLT4KLTwhRU5USVRZICUgbWFwLnFuYW1lICAgICAiJVhIVE1MLnBmeDttYXAiID4KLTwhRU5USVRZICUgYXJlYS5xbmFtZSAgICAiJVhIVE1MLnBmeDthcmVhIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtbGluay0xLm1vZCAtLT4KLTwhRU5USVRZICUgbGluay5xbmFtZSAgICAiJVhIVE1MLnBmeDtsaW5rIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtbGlzdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgZGwucW5hbWUgICAgICAiJVhIVE1MLnBmeDtkbCIgPgotPCFFTlRJVFkgJSBkdC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2R0IiA+Ci08IUVOVElUWSAlIGRkLnFuYW1lICAgICAgIiVYSFRNTC5wZng7ZGQiID4KLTwhRU5USVRZICUgb2wucW5hbWUgICAgICAiJVhIVE1MLnBmeDtvbCIgPgotPCFFTlRJVFkgJSB1bC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3VsIiA+Ci08IUVOVElUWSAlIGxpLnFuYW1lICAgICAgIiVYSFRNTC5wZng7bGkiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1tZXRhLTEubW9kIC0tPgotPCFFTlRJVFkgJSBtZXRhLnFuYW1lICAgICIlWEhUTUwucGZ4O21ldGEiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1wYXJhbS0xLm1vZCAtLT4KLTwhRU5USVRZICUgcGFyYW0ucW5hbWUgICAiJVhIVE1MLnBmeDtwYXJhbSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLW9iamVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgb2JqZWN0LnFuYW1lICAiJVhIVE1MLnBmeDtvYmplY3QiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1zY3JpcHQtMS5tb2QgLS0+Ci08IUVOVElUWSAlIHNjcmlwdC5xbmFtZSAgIiVYSFRNTC5wZng7c2NyaXB0IiA+Ci08IUVOVElUWSAlIG5vc2NyaXB0LnFuYW1lICAiJVhIVE1MLnBmeDtub3NjcmlwdCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXN0cnVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgaHRtbC5xbmFtZSAgICAiJVhIVE1MLnBmeDtodG1sIiA+Ci08IUVOVElUWSAlIGhlYWQucW5hbWUgICAgIiVYSFRNTC5wZng7aGVhZCIgPgotPCFFTlRJVFkgJSB0aXRsZS5xbmFtZSAgICIlWEhUTUwucGZ4O3RpdGxlIiA+Ci08IUVOVElUWSAlIGJvZHkucW5hbWUgICAgIiVYSFRNTC5wZng7Ym9keSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXN0eWxlLTEubW9kIC0tPgotPCFFTlRJVFkgJSBzdHlsZS5xbmFtZSAgICIlWEhUTUwucGZ4O3N0eWxlIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtdGFibGUtMS5tb2QgLS0+Ci08IUVOVElUWSAlIHRhYmxlLnFuYW1lICAgIiVYSFRNTC5wZng7dGFibGUiID4KLTwhRU5USVRZICUgY2FwdGlvbi5xbmFtZSAiJVhIVE1MLnBmeDtjYXB0aW9uIiA+Ci08IUVOVElUWSAlIHRoZWFkLnFuYW1lICAgIiVYSFRNTC5wZng7dGhlYWQiID4KLTwhRU5USVRZICUgdGZvb3QucW5hbWUgICAiJVhIVE1MLnBmeDt0Zm9vdCIgPgotPCFFTlRJVFkgJSB0Ym9keS5xbmFtZSAgICIlWEhUTUwucGZ4O3Rib2R5IiA+Ci08IUVOVElUWSAlIGNvbGdyb3VwLnFuYW1lICAiJVhIVE1MLnBmeDtjb2xncm91cCIgPgotPCFFTlRJVFkgJSBjb2wucW5hbWUgICAgICIlWEhUTUwucGZ4O2NvbCIgPgotPCFFTlRJVFkgJSB0ci5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3RyIiA+Ci08IUVOVElUWSAlIHRoLnFuYW1lICAgICAgIiVYSFRNTC5wZng7dGgiID4KLTwhRU5USVRZICUgdGQucW5hbWUgICAgICAiJVhIVE1MLnBmeDt0ZCIgPgotCi0KLTwhLS0gUHJvdmlzaW9uYWwgWEhUTUwgMi4wIFF1YWxpZmllZCBOYW1lcyAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbWFnZS0yLm1vZCAtLT4KLTwhRU5USVRZICUgYWx0LnFuYW1lICAgICAiJVhIVE1MLnBmeDthbHQiID4KLQotPCEtLSBlbmQgb2YgeGh0bWwtcW5hbWUtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ldmVudHMubW9kdWxlICJJR05PUkUiID4KLTwhWyV4aHRtbC1ldmVudHMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtZXZlbnRzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgSW50cmluc2ljIEV2ZW50cyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWV2ZW50cy0xLm1vZCIgPgotJXhodG1sLWV2ZW50cy5tb2Q7XV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtYXR0cmlicy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1hdHRyaWJzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWF0dHJpYnMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBDb21tb24gQXR0cmlidXRlcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWF0dHJpYnMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQ29tbW9uIEF0dHJpYnV0ZXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYXR0cmlicy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBDb21tb24gQXR0cmlidXRlcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWF0dHJpYnMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQ29tbW9uIEF0dHJpYnV0ZXMKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyBtYW55IG9mIHRoZSBjb21tb24gYXR0cmlidXRlcyBmb3IgdGhlIFhIVE1MIERURC4KLSAgICAgJU5TLmRlY2wuYXR0cmliOyBpcyBkZWNsYXJlZCBpbiB0aGUgWEhUTUwgUW5hbWUgbW9kdWxlLgotLS0+Ci0KLTwhRU5USVRZICUgaWQuYXR0cmliCi0gICAgICJpZCAgICAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IUVOVElUWSAlIGNsYXNzLmF0dHJpYgotICAgICAiY2xhc3MgICAgICAgIE5NVE9LRU5TICAgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCFFTlRJVFkgJSB0aXRsZS5hdHRyaWIKLSAgICAgInRpdGxlICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhRU5USVRZICUgQ29yZS5leHRyYS5hdHRyaWIgIiIgPgotCi08IUVOVElUWSAlIENvcmUuYXR0cmliCi0gICAgICIlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJWlkLmF0dHJpYjsKLSAgICAgICVjbGFzcy5hdHRyaWI7Ci0gICAgICAldGl0bGUuYXR0cmliOwotICAgICAgJUNvcmUuZXh0cmEuYXR0cmliOyIKLT4KLQotPCFFTlRJVFkgJSBsYW5nLmF0dHJpYgotICAgICAieG1sOmxhbmcgICAgICVMYW5ndWFnZUNvZGUuZGF0YXR5cGU7ICAjSU1QTElFRCIKLT4KLQotPCFbJVhIVE1MLmJpZGk7WwotPCFFTlRJVFkgJSBkaXIuYXR0cmliCi0gICAgICJkaXIgICAgICAgICAgKCBsdHIgfCBydGwgKSAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IUVOVElUWSAlIEkxOG4uYXR0cmliCi0gICAgICIlZGlyLmF0dHJpYjsKLSAgICAgICVsYW5nLmF0dHJpYjsiCi0+Ci0KLV1dPgotPCFFTlRJVFkgJSBJMThuLmF0dHJpYgotICAgICAiJWxhbmcuYXR0cmliOyIKLT4KLQotPCFFTlRJVFkgJSBDb21tb24uZXh0cmEuYXR0cmliICIiID4KLQotPCEtLSBpbnRyaW5zaWMgZXZlbnQgYXR0cmlidXRlcyBkZWNsYXJlZCBwcmV2aW91c2x5Ci0tLT4KLTwhRU5USVRZICUgRXZlbnRzLmF0dHJpYiAiIiA+Ci0KLTwhRU5USVRZICUgQ29tbW9uLmF0dHJpYgotICAgICAiJUNvcmUuYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotICAgICAgJUV2ZW50cy5hdHRyaWI7Ci0gICAgICAlQ29tbW9uLmV4dHJhLmF0dHJpYjsiCi0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWF0dHJpYnMtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBwbGFjZWhvbGRlciBmb3IgY29udGVudCBtb2RlbCByZWRlY2xhcmF0aW9ucyAtLT4KLTwhRU5USVRZICUgeGh0bWwtbW9kZWwucmVkZWNsICIiID4KLQotCi08IUVOVElUWSAlIHhodG1sLW1vZGVsLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLW1vZGVsLm1vZHVsZTtbCi08IS0tIGluc3RhbnRpYXRlIHRoZSBEb2N1bWVudCBNb2RlbCBtb2R1bGUgZGVjbGFyZWQgaW4gdGhlIERURCBkcml2ZXIKLS0tPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQmFzaWMgMS4wIERvY3VtZW50IE1vZGVsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1iYXNpYzEwLW1vZGVsLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCBCYXNpYywgYSBwcm9wZXIgc3Vic2V0IG9mIFhIVE1MLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgQmFzaWMgMS4wIERvY3VtZW50IE1vZGVsIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1iYXNpYy94aHRtbC1iYXNpYzEwLW1vZGVsLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFhIVE1MIEJhc2ljIERvY3VtZW50IE1vZGVsCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVzY3JpYmVzIHRoZSBncm91cGluZ3Mgb2YgZWxlbWVudHMgdGhhdCBtYWtlIHVwCi0gICAgIGNvbW1vbiBjb250ZW50IG1vZGVscyBmb3IgWEhUTUwgZWxlbWVudHMuCi0tLT4KLQotPCEtLSBPcHRpb25hbCBFbGVtZW50cyBpbiBoZWFkICAuLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBIZWFkT3B0cy5taXgKLSAgICAgIiggJW1ldGEucW5hbWU7IHwgJWxpbmsucW5hbWU7IHwgJW9iamVjdC5xbmFtZTsgKSoiID4KLQotPCEtLSBNaXNjZWxsYW5lb3VzIEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBNaXNjLmNsYXNzICIiID4KLQotPCEtLSBJbmxpbmUgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBJbmxTdHJ1Y3QuY2xhc3MgIiVici5xbmFtZTsgfCAlc3Bhbi5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBJbmxQaHJhcy5jbGFzcwotICAgICAifCAlZW0ucW5hbWU7IHwgJXN0cm9uZy5xbmFtZTsgfCAlZGZuLnFuYW1lOyB8ICVjb2RlLnFuYW1lOwotICAgICAgfCAlc2FtcC5xbmFtZTsgfCAla2JkLnFuYW1lOyB8ICV2YXIucW5hbWU7IHwgJWNpdGUucW5hbWU7Ci0gICAgICB8ICVhYmJyLnFuYW1lOyB8ICVhY3JvbnltLnFuYW1lOyB8ICVxLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubFByZXMuY2xhc3MgIiIgPgotCi08IUVOVElUWSAlIEkxOG4uY2xhc3MgIiIgPgotCi08IUVOVElUWSAlIEFuY2hvci5jbGFzcyAifCAlYS5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBJbmxTcGVjaWFsLmNsYXNzICJ8ICVpbWcucW5hbWU7IHwgJW9iamVjdC5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBJbmxGb3JtLmNsYXNzCi0gICAgICJ8ICVpbnB1dC5xbmFtZTsgfCAlc2VsZWN0LnFuYW1lOyB8ICV0ZXh0YXJlYS5xbmFtZTsKLSAgICAgIHwgJWxhYmVsLnFuYW1lOyIKLT4KLQotPCFFTlRJVFkgJSBJbmxpbmUuZXh0cmEgIiIgPgotCi08IUVOVElUWSAlIElubGluZS5jbGFzcwotICAgICAiJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgICVBbmNob3IuY2xhc3M7Ci0gICAgICAlSW5sU3BlY2lhbC5jbGFzczsKLSAgICAgICVJbmxGb3JtLmNsYXNzOwotICAgICAgJUlubGluZS5leHRyYTsiCi0+Ci0KLTwhRU5USVRZICUgSW5sTm9BbmNob3IuY2xhc3MKLSAgICAgIiVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICAlSW5sU3BlY2lhbC5jbGFzczsKLSAgICAgICVJbmxGb3JtLmNsYXNzOwotICAgICAgJUlubGluZS5leHRyYTsiCi0+Ci0KLTwhRU5USVRZICUgSW5sTm9BbmNob3IubWl4Ci0gICAgICIlSW5sTm9BbmNob3IuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhRU5USVRZICUgSW5saW5lLm1peAotICAgICAiJUlubGluZS5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCEtLSBCbG9jayBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBIZWFkaW5nLmNsYXNzCi0gICAgICIlaDEucW5hbWU7IHwgJWgyLnFuYW1lOyB8ICVoMy5xbmFtZTsKLSAgICAgIHwgJWg0LnFuYW1lOyB8ICVoNS5xbmFtZTsgfCAlaDYucW5hbWU7IgotPgotPCFFTlRJVFkgJSBMaXN0LmNsYXNzICAiJXVsLnFuYW1lOyB8ICVvbC5xbmFtZTsgfCAlZGwucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgVGFibGUuY2xhc3MgInwgJXRhYmxlLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEZvcm0uY2xhc3MgICJ8ICVmb3JtLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEJsa1N0cnVjdC5jbGFzcyAiJXAucW5hbWU7IHwgJWRpdi5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBCbGtQaHJhcy5jbGFzcwotICAgICAifCAlcHJlLnFuYW1lOyB8ICVibG9ja3F1b3RlLnFuYW1lOyB8ICVhZGRyZXNzLnFuYW1lOyIKLT4KLQotPCFFTlRJVFkgJSBCbGtQcmVzLmNsYXNzICIiID4KLQotPCFFTlRJVFkgJSBCbGtTcGVjaWFsLmNsYXNzCi0gICAgICIlVGFibGUuY2xhc3M7Ci0gICAgICAlRm9ybS5jbGFzczsiCi0+Ci0KLTwhRU5USVRZICUgQmxvY2suZXh0cmEgIiIgPgotCi08IUVOVElUWSAlIEJsb2NrLmNsYXNzCi0gICAgICIlQmxrU3RydWN0LmNsYXNzOwotICAgICAgJUJsa1BocmFzLmNsYXNzOwotICAgICAgJUJsa1NwZWNpYWwuY2xhc3M7Ci0gICAgICAlQmxvY2suZXh0cmE7IgotPgotCi08IUVOVElUWSAlIEJsb2NrLm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxvY2suY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gQWxsIENvbnRlbnQgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gZGVjbGFyZXMgYWxsIGNvbnRlbnQgZXhjZXB0IHRhYmxlcwotLS0+Ci08IUVOVElUWSAlIEZsb3dOb1RhYmxlLm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxrU3RydWN0LmNsYXNzOwotICAgICAgJUJsa1BocmFzLmNsYXNzOwotICAgICAgJUZvcm0uY2xhc3M7Ci0gICAgICAlQmxvY2suZXh0cmE7Ci0gICAgICB8ICVJbmxpbmUuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhRU5USVRZICUgRmxvdy5taXgKLSAgICAgIiVIZWFkaW5nLmNsYXNzOwotICAgICAgfCAlTGlzdC5jbGFzczsKLSAgICAgIHwgJUJsb2NrLmNsYXNzOwotICAgICAgfCAlSW5saW5lLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IS0tIGVuZCBvZiB4aHRtbC1iYXNpYzEwLW1vZGVsLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtY2hhcmVudC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1jaGFyZW50Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWNoYXJlbnQubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBDaGFyYWN0ZXIgRW50aXRpZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1jaGFyZW50LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIENoYXJhY3RlciBFbnRpdGllcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1jaGFyZW50LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIENoYXJhY3RlciBFbnRpdGllcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWNoYXJlbnQtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQ2hhcmFjdGVyIEVudGl0aWVzIGZvciBYSFRNTAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBzZXQgb2YgY2hhcmFjdGVyIGVudGl0aWVzIGZvciBYSFRNTCwKLSAgICAgaW5jbHVkaW5nIHRoZSBMYXRpbiAxLCBTeW1ib2wgYW5kIFNwZWNpYWwgY2hhcmFjdGVyIGNvbGxlY3Rpb25zLgotLS0+Ci0KLTwhRU5USVRZICUgeGh0bWwtbGF0MQotICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbiAxIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICAgICJ4aHRtbC1sYXQxLmVudCIgPgotPCFFTlRJVFkgJSB4aHRtbC1zeW1ib2wKLSAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scyBmb3IgWEhUTUwvL0VOIgotICAgICAgICAgICAieGh0bWwtc3ltYm9sLmVudCIgPgotPCFFTlRJVFkgJSB4aHRtbC1zcGVjaWFsCi0gICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgICAgInhodG1sLXNwZWNpYWwuZW50IiA+Ci0KLTwhLS0gUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NgotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGgKLSAgICAgY29uZm9ybWluZyBTR01MIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluCi0gICAgIElTTyA4ODc5LCBwcm92aWRlZCB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzLgotLS0+Ci08IS0tIENoYXJhY3RlciBlbnRpdHkgc2V0LiBUeXBpY2FsIGludm9jYXRpb246Ci0gICAgPCFFTlRJVFkgJSBIVE1MbGF0MSBQVUJMSUMKLSAgICAgICAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbiAxIGZvciBYSFRNTC8vRU4iCi0gICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwtbGF0MS5lbnQiPgotICAgICVIVE1MbGF0MTsKLS0tPgotCi08IUVOVElUWSBuYnNwICAgIiYjMTYwOyI+IDwhLS0gbm8tYnJlYWsgc3BhY2UgPSBub24tYnJlYWtpbmcgc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEEwIElTT251bSAtLT4KLTwhRU5USVRZIGlleGNsICAiJiMxNjE7Ij4gPCEtLSBpbnZlcnRlZCBleGNsYW1hdGlvbiBtYXJrLCBVKzAwQTEgSVNPbnVtIC0tPgotPCFFTlRJVFkgY2VudCAgICImIzE2MjsiPiA8IS0tIGNlbnQgc2lnbiwgVSswMEEyIElTT251bSAtLT4KLTwhRU5USVRZIHBvdW5kICAiJiMxNjM7Ij4gPCEtLSBwb3VuZCBzaWduLCBVKzAwQTMgSVNPbnVtIC0tPgotPCFFTlRJVFkgY3VycmVuICImIzE2NDsiPiA8IS0tIGN1cnJlbmN5IHNpZ24sIFUrMDBBNCBJU09udW0gLS0+Ci08IUVOVElUWSB5ZW4gICAgIiYjMTY1OyI+IDwhLS0geWVuIHNpZ24gPSB5dWFuIHNpZ24sIFUrMDBBNSBJU09udW0gLS0+Ci08IUVOVElUWSBicnZiYXIgIiYjMTY2OyI+IDwhLS0gYnJva2VuIGJhciA9IGJyb2tlbiB2ZXJ0aWNhbCBiYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEE2IElTT251bSAtLT4KLTwhRU5USVRZIHNlY3QgICAiJiMxNjc7Ij4gPCEtLSBzZWN0aW9uIHNpZ24sIFUrMDBBNyBJU09udW0gLS0+Ci08IUVOVElUWSB1bWwgICAgIiYjMTY4OyI+IDwhLS0gZGlhZXJlc2lzID0gc3BhY2luZyBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEE4IElTT2RpYSAtLT4KLTwhRU5USVRZIGNvcHkgICAiJiMxNjk7Ij4gPCEtLSBjb3B5cmlnaHQgc2lnbiwgVSswMEE5IElTT251bSAtLT4KLTwhRU5USVRZIG9yZGYgICAiJiMxNzA7Ij4gPCEtLSBmZW1pbmluZSBvcmRpbmFsIGluZGljYXRvciwgVSswMEFBIElTT251bSAtLT4KLTwhRU5USVRZIGxhcXVvICAiJiMxNzE7Ij4gPCEtLSBsZWZ0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFyawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGVmdCBwb2ludGluZyBndWlsbGVtZXQsIFUrMDBBQiBJU09udW0gLS0+Ci08IUVOVElUWSBub3QgICAgIiYjMTcyOyI+IDwhLS0gbm90IHNpZ24gPSBkaXNjcmV0aW9uYXJ5IGh5cGhlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQUMgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2h5ICAgICImIzE3MzsiPiA8IS0tIHNvZnQgaHlwaGVuID0gZGlzY3JldGlvbmFyeSBoeXBoZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEFEIElTT251bSAtLT4KLTwhRU5USVRZIHJlZyAgICAiJiMxNzQ7Ij4gPCEtLSByZWdpc3RlcmVkIHNpZ24gPSByZWdpc3RlcmVkIHRyYWRlIG1hcmsgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQUUgSVNPbnVtIC0tPgotPCFFTlRJVFkgbWFjciAgICImIzE3NTsiPiA8IS0tIG1hY3JvbiA9IHNwYWNpbmcgbWFjcm9uID0gb3ZlcmxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFQTCBvdmVyYmFyLCBVKzAwQUYgSVNPZGlhIC0tPgotPCFFTlRJVFkgZGVnICAgICImIzE3NjsiPiA8IS0tIGRlZ3JlZSBzaWduLCBVKzAwQjAgSVNPbnVtIC0tPgotPCFFTlRJVFkgcGx1c21uICImIzE3NzsiPiA8IS0tIHBsdXMtbWludXMgc2lnbiA9IHBsdXMtb3ItbWludXMgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjEgSVNPbnVtIC0tPgotPCFFTlRJVFkgc3VwMiAgICImIzE3ODsiPiA8IS0tIHN1cGVyc2NyaXB0IHR3byA9IHN1cGVyc2NyaXB0IGRpZ2l0IHR3bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3F1YXJlZCwgVSswMEIyIElTT251bSAtLT4KLTwhRU5USVRZIHN1cDMgICAiJiMxNzk7Ij4gPCEtLSBzdXBlcnNjcmlwdCB0aHJlZSA9IHN1cGVyc2NyaXB0IGRpZ2l0IHRocmVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjdWJlZCwgVSswMEIzIElTT251bSAtLT4KLTwhRU5USVRZIGFjdXRlICAiJiMxODA7Ij4gPCEtLSBhY3V0ZSBhY2NlbnQgPSBzcGFjaW5nIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCNCBJU09kaWEgLS0+Ci08IUVOVElUWSBtaWNybyAgIiYjMTgxOyI+IDwhLS0gbWljcm8gc2lnbiwgVSswMEI1IElTT251bSAtLT4KLTwhRU5USVRZIHBhcmEgICAiJiMxODI7Ij4gPCEtLSBwaWxjcm93IHNpZ24gPSBwYXJhZ3JhcGggc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjYgSVNPbnVtIC0tPgotPCFFTlRJVFkgbWlkZG90ICImIzE4MzsiPiA8IS0tIG1pZGRsZSBkb3QgPSBHZW9yZ2lhbiBjb21tYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gR3JlZWsgbWlkZGxlIGRvdCwgVSswMEI3IElTT251bSAtLT4KLTwhRU5USVRZIGNlZGlsICAiJiMxODQ7Ij4gPCEtLSBjZWRpbGxhID0gc3BhY2luZyBjZWRpbGxhLCBVKzAwQjggSVNPZGlhIC0tPgotPCFFTlRJVFkgc3VwMSAgICImIzE4NTsiPiA8IS0tIHN1cGVyc2NyaXB0IG9uZSA9IHN1cGVyc2NyaXB0IGRpZ2l0IG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjkgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3JkbSAgICImIzE4NjsiPiA8IS0tIG1hc2N1bGluZSBvcmRpbmFsIGluZGljYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQkEgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmFxdW8gICImIzE4NzsiPiA8IS0tIHJpZ2h0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFyawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcmlnaHQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQkIgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzE0ICImIzE4ODsiPiA8IS0tIHZ1bGdhciBmcmFjdGlvbiBvbmUgcXVhcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZnJhY3Rpb24gb25lIHF1YXJ0ZXIsIFUrMDBCQyBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMTIgIiYjMTg5OyI+IDwhLS0gdnVsZ2FyIGZyYWN0aW9uIG9uZSBoYWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmcmFjdGlvbiBvbmUgaGFsZiwgVSswMEJEIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMzNCAiJiMxOTA7Ij4gPCEtLSB2dWxnYXIgZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzLCBVKzAwQkUgSVNPbnVtIC0tPgotPCFFTlRJVFkgaXF1ZXN0ICImIzE5MTsiPiA8IS0tIGludmVydGVkIHF1ZXN0aW9uIG1hcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHR1cm5lZCBxdWVzdGlvbiBtYXJrLCBVKzAwQkYgSVNPbnVtIC0tPgotPCFFTlRJVFkgQWdyYXZlICImIzE5MjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBncmF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFhY3V0ZSAiJiMxOTM7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBY2lyYyAgIiYjMTk0OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBdGlsZGUgIiYjMTk1OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXVtbCAgICImIzE5NjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBBcmluZyAgIiYjMTk3OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIHJpbmcgYWJvdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFFbGlnICAiJiMxOTg7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsaWdhdHVyZSBBRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIENjZWRpbCAiJiMxOTk7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBDIHdpdGggY2VkaWxsYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzcgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVncmF2ZSAiJiMyMDA7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFYWN1dGUgIiYjMjAxOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWNpcmMgICImIzIwMjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgRXVtbCAgICImIzIwMzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJZ3JhdmUgIiYjMjA0OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWFjdXRlICImIzIwNTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0QgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEljaXJjICAiJiMyMDY7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0UgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEl1bWwgICAiJiMyMDc7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDRiBJU09sYXQxIC0tPgotPCFFTlRJVFkgRVRIICAgICImIzIwODsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEVUSCwgVSswMEQwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBOdGlsZGUgIiYjMjA5OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTiB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2dyYXZlICImIzIxMDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9hY3V0ZSAiJiMyMTE7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPY2lyYyAgIiYjMjEyOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBPdGlsZGUgIiYjMjEzOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBENSBJU09sYXQxIC0tPgotPCFFTlRJVFkgT3VtbCAgICImIzIxNDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ2IElTT2xhdDEgLS0+Ci08IUVOVElUWSB0aW1lcyAgIiYjMjE1OyI+IDwhLS0gbXVsdGlwbGljYXRpb24gc2lnbiwgVSswMEQ3IElTT251bSAtLT4KLTwhRU5USVRZIE9zbGFzaCAiJiMyMTY7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggc3Ryb2tlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHNsYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWdyYXZlICImIzIxNzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVhY3V0ZSAiJiMyMTg7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBVY2lyYyAgIiYjMjE5OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBVdW1sICAgIiYjMjIwOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFlhY3V0ZSAiJiMyMjE7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBZIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEREIElTT2xhdDEgLS0+Ci08IUVOVElUWSBUSE9STiAgIiYjMjIyOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVEhPUk4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBzemxpZyAgIiYjMjIzOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHNoYXJwIHMgPSBlc3MtemVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBERiBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWdyYXZlICImIzIyNDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggZ3JhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxldHRlciBhIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWFjdXRlICImIzIyNTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhY2lyYyAgIiYjMjI2OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXRpbGRlICImIzIyNzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhdW1sICAgIiYjMjI4OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBhcmluZyAgIiYjMjI5OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCByaW5nIGFib3ZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSByaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWVsaWcgICImIzIzMDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGlnYXR1cmUgYWUsIFUrMDBFNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgY2NlZGlsICImIzIzMTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBjIHdpdGggY2VkaWxsYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTcgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVncmF2ZSAiJiMyMzI7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWFjdXRlICImIzIzMzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlY2lyYyAgIiYjMjM0OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgZXVtbCAgICImIzIzNTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWdyYXZlICImIzIzNjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpYWN1dGUgIiYjMjM3OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGljaXJjICAiJiMyMzg7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpdW1sICAgIiYjMjM5OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBldGggICAgIiYjMjQwOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGV0aCwgVSswMEYwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBudGlsZGUgIiYjMjQxOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG4gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9ncmF2ZSAiJiMyNDI7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2FjdXRlICImIzI0MzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEYzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvY2lyYyAgIiYjMjQ0OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgb3RpbGRlICImIzI0NTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBvdW1sICAgIiYjMjQ2OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBkaXZpZGUgIiYjMjQ3OyI+IDwhLS0gZGl2aXNpb24gc2lnbiwgVSswMEY3IElTT251bSAtLT4KLTwhRU5USVRZIG9zbGFzaCAiJiMyNDg7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIHN0cm9rZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxldHRlciBvIHNsYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWdyYXZlICImIzI0OTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY5IElTT2xhdDEgLS0+Ci08IUVOVElUWSB1YWN1dGUgIiYjMjUwOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVjaXJjICAiJiMyNTE7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZCIElTT2xhdDEgLS0+Ci08IUVOVElUWSB1dW1sICAgIiYjMjUyOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZDIElTT2xhdDEgLS0+Ci08IUVOVElUWSB5YWN1dGUgIiYjMjUzOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHRob3JuICAiJiMyNTQ7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdGhvcm4gd2l0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHl1bWwgICAiJiMyNTU7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgeSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkYgSVNPbGF0MSAtLT4KLQotPCEtLSBNYXRoZW1hdGljYWwsIEdyZWVrIGFuZCBTeW1ib2xpYyBjaGFyYWN0ZXJzIGZvciBIVE1MIC0tPgotCi08IS0tIENoYXJhY3RlciBlbnRpdHkgc2V0LiBUeXBpY2FsIGludm9jYXRpb246Ci0gICAgIDwhRU5USVRZICUgSFRNTHN5bWJvbCBQVUJMSUMKLSAgICAgICAgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scyBmb3IgWEhUTUwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1zeW1ib2wuZW50Ij4KLSAgICAgJUhUTUxzeW1ib2w7Ci0tLT4KLQotPCEtLSBQb3J0aW9ucyAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2OgotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGgKLSAgICAgY29uZm9ybWluZyBTR01MIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluCi0gICAgIElTTyA4ODc5LCBwcm92aWRlZCB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzLgotLS0+Ci0KLTwhLS0gUmVsZXZhbnQgSVNPIGVudGl0eSBzZXQgaXMgZ2l2ZW4gdW5sZXNzIG5hbWVzIGFyZSBuZXdseSBpbnRyb2R1Y2VkLgotICAgICBOZXcgbmFtZXMgKGkuZS4sIG5vdCBpbiBJU08gODg3OSBsaXN0KSBkbyBub3QgY2xhc2ggd2l0aCBhbnkKLSAgICAgZXhpc3RpbmcgSVNPIDg4NzkgZW50aXR5IG5hbWVzLiBJU08gMTA2NDYgY2hhcmFjdGVyIG51bWJlcnMKLSAgICAgYXJlIGdpdmVuIGZvciBlYWNoIGNoYXJhY3RlciwgaW4gaGV4LiB2YWx1ZXMgYXJlIGRlY2ltYWwKLSAgICAgY29udmVyc2lvbnMgb2YgdGhlIElTTyAxMDY0NiB2YWx1ZXMgYW5kIHJlZmVyIHRvIHRoZSBkb2N1bWVudAotICAgICBjaGFyYWN0ZXIgc2V0LiBOYW1lcyBhcmUgVW5pY29kZSBuYW1lcy4gCi0tLT4KLQotPCEtLSBMYXRpbiBFeHRlbmRlZC1CIC0tPgotPCFFTlRJVFkgZm5vZiAgICAgIiYjNDAyOyI+IDwhLS0gbGF0aW4gc21hbGwgZiB3aXRoIGhvb2sgPSBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmbG9yaW4sIFUrMDE5MiBJU090ZWNoIC0tPgotCi08IS0tIEdyZWVrIC0tPgotPCFFTlRJVFkgQWxwaGEgICAgIiYjOTEzOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgYWxwaGEsIFUrMDM5MSAtLT4KLTwhRU5USVRZIEJldGEgICAgICImIzkxNDsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGJldGEsIFUrMDM5MiAtLT4KLTwhRU5USVRZIEdhbW1hICAgICImIzkxNTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGdhbW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzkzIElTT2dyazMgLS0+Ci08IUVOVElUWSBEZWx0YSAgICAiJiM5MTY7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBkZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5NCBJU09ncmszIC0tPgotPCFFTlRJVFkgRXBzaWxvbiAgIiYjOTE3OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZXBzaWxvbiwgVSswMzk1IC0tPgotPCFFTlRJVFkgWmV0YSAgICAgIiYjOTE4OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgemV0YSwgVSswMzk2IC0tPgotPCFFTlRJVFkgRXRhICAgICAgIiYjOTE5OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZXRhLCBVKzAzOTcgLS0+Ci08IUVOVElUWSBUaGV0YSAgICAiJiM5MjA7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB0aGV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5OCBJU09ncmszIC0tPgotPCFFTlRJVFkgSW90YSAgICAgIiYjOTIxOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgaW90YSwgVSswMzk5IC0tPgotPCFFTlRJVFkgS2FwcGEgICAgIiYjOTIyOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIga2FwcGEsIFUrMDM5QSAtLT4KLTwhRU5USVRZIExhbWJkYSAgICImIzkyMzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGxhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5QiBJU09ncmszIC0tPgotPCFFTlRJVFkgTXUgICAgICAgIiYjOTI0OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbXUsIFUrMDM5QyAtLT4KLTwhRU5USVRZIE51ICAgICAgICImIzkyNTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG51LCBVKzAzOUQgLS0+Ci08IUVOVElUWSBYaSAgICAgICAiJiM5MjY7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB4aSwgVSswMzlFIElTT2dyazMgLS0+Ci08IUVOVElUWSBPbWljcm9uICAiJiM5Mjc7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBvbWljcm9uLCBVKzAzOUYgLS0+Ci08IUVOVElUWSBQaSAgICAgICAiJiM5Mjg7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBwaSwgVSswM0EwIElTT2dyazMgLS0+Ci08IUVOVElUWSBSaG8gICAgICAiJiM5Mjk7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciByaG8sIFUrMDNBMSAtLT4KLTwhLS0gdGhlcmUgaXMgbm8gU2lnbWFmLCBhbmQgbm8gVSswM0EyIGNoYXJhY3RlciBlaXRoZXIgLS0+Ci08IUVOVElUWSBTaWdtYSAgICAiJiM5MzE7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBMyBJU09ncmszIC0tPgotPCFFTlRJVFkgVGF1ICAgICAgIiYjOTMyOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGF1LCBVKzAzQTQgLS0+Ci08IUVOVElUWSBVcHNpbG9uICAiJiM5MzM7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB1cHNpbG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E1IElTT2dyazMgLS0+Ci08IUVOVElUWSBQaGkgICAgICAiJiM5MzQ7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBwaGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIENoaSAgICAgICImIzkzNTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGNoaSwgVSswM0E3IC0tPgotPCFFTlRJVFkgUHNpICAgICAgIiYjOTM2OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcHNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E4IElTT2dyazMgLS0+Ci08IUVOVElUWSBPbWVnYSAgICAiJiM5Mzc7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBvbWVnYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBOSBJU09ncmszIC0tPgotCi08IUVOVElUWSBhbHBoYSAgICAiJiM5NDU7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGJldGEgICAgICImIzk0NjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBiZXRhLCBVKzAzQjIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGdhbW1hICAgICImIzk0NzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBnYW1tYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCMyBJU09ncmszIC0tPgotPCFFTlRJVFkgZGVsdGEgICAgIiYjOTQ4OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0I0IElTT2dyazMgLS0+Ci08IUVOVElUWSBlcHNpbG9uICAiJiM5NDk7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCNSBJU09ncmszIC0tPgotPCFFTlRJVFkgemV0YSAgICAgIiYjOTUwOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHpldGEsIFUrMDNCNiBJU09ncmszIC0tPgotPCFFTlRJVFkgZXRhICAgICAgIiYjOTUxOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGV0YSwgVSswM0I3IElTT2dyazMgLS0+Ci08IUVOVElUWSB0aGV0YSAgICAiJiM5NTI7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGlvdGEgICAgICImIzk1MzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBpb3RhLCBVKzAzQjkgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGthcHBhICAgICImIzk1NDsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBrYXBwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCQSBJU09ncmszIC0tPgotPCFFTlRJVFkgbGFtYmRhICAgIiYjOTU1OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGxhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCQiBJU09ncmszIC0tPgotPCFFTlRJVFkgbXUgICAgICAgIiYjOTU2OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG11LCBVKzAzQkMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG51ICAgICAgICImIzk1NzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBudSwgVSswM0JEIElTT2dyazMgLS0+Ci08IUVOVElUWSB4aSAgICAgICAiJiM5NTg7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgeGksIFUrMDNCRSBJU09ncmszIC0tPgotPCFFTlRJVFkgb21pY3JvbiAgIiYjOTU5OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG9taWNyb24sIFUrMDNCRiBORVcgLS0+Ci08IUVOVElUWSBwaSAgICAgICAiJiM5NjA7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcGksIFUrMDNDMCBJU09ncmszIC0tPgotPCFFTlRJVFkgcmhvICAgICAgIiYjOTYxOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHJobywgVSswM0MxIElTT2dyazMgLS0+Ci08IUVOVElUWSBzaWdtYWYgICAiJiM5NjI7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZmluYWwgc2lnbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHNpZ21hICAgICImIzk2MzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDMyBJU09ncmszIC0tPgotPCFFTlRJVFkgdGF1ICAgICAgIiYjOTY0OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRhdSwgVSswM0M0IElTT2dyazMgLS0+Ci08IUVOVElUWSB1cHNpbG9uICAiJiM5NjU7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDNSBJU09ncmszIC0tPgotPCFFTlRJVFkgcGhpICAgICAgIiYjOTY2OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBoaSwgVSswM0M2IElTT2dyazMgLS0+Ci08IUVOVElUWSBjaGkgICAgICAiJiM5Njc7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgY2hpLCBVKzAzQzcgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHBzaSAgICAgICImIzk2ODsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBwc2ksIFUrMDNDOCBJU09ncmszIC0tPgotPCFFTlRJVFkgb21lZ2EgICAgIiYjOTY5OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG9tZWdhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0M5IElTT2dyazMgLS0+Ci08IUVOVElUWSB0aGV0YXN5bSAiJiM5Nzc7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0QxIE5FVyAtLT4KLTwhRU5USVRZIHVwc2loICAgICImIzk3ODsiPiA8IS0tIGdyZWVrIHVwc2lsb24gd2l0aCBob29rIHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNEMiBORVcgLS0+Ci08IUVOVElUWSBwaXYgICAgICAiJiM5ODI7Ij4gPCEtLSBncmVlayBwaSBzeW1ib2wsIFUrMDNENiBJU09ncmszIC0tPgotCi08IS0tIEdlbmVyYWwgUHVuY3R1YXRpb24gLS0+Ci08IUVOVElUWSBidWxsICAgICAiJiM4MjI2OyI+IDwhLS0gYnVsbGV0ID0gYmxhY2sgc21hbGwgY2lyY2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAyMiBJU09wdWIgIC0tPgotPCEtLSBidWxsZXQgaXMgTk9UIHRoZSBzYW1lIGFzIGJ1bGxldCBvcGVyYXRvciwgVSsyMjE5IC0tPgotPCFFTlRJVFkgaGVsbGlwICAgIiYjODIzMDsiPiA8IS0tIGhvcml6b250YWwgZWxsaXBzaXMgPSB0aHJlZSBkb3QgbGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAyNiBJU09wdWIgIC0tPgotPCFFTlRJVFkgcHJpbWUgICAgIiYjODI0MjsiPiA8IS0tIHByaW1lID0gbWludXRlcyA9IGZlZXQsIFUrMjAzMiBJU090ZWNoIC0tPgotPCFFTlRJVFkgUHJpbWUgICAgIiYjODI0MzsiPiA8IS0tIGRvdWJsZSBwcmltZSA9IHNlY29uZHMgPSBpbmNoZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDMzIElTT3RlY2ggLS0+Ci08IUVOVElUWSBvbGluZSAgICAiJiM4MjU0OyI+IDwhLS0gb3ZlcmxpbmUgPSBzcGFjaW5nIG92ZXJzY29yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwM0UgTkVXIC0tPgotPCFFTlRJVFkgZnJhc2wgICAgIiYjODI2MDsiPiA8IS0tIGZyYWN0aW9uIHNsYXNoLCBVKzIwNDQgTkVXIC0tPgotCi08IS0tIExldHRlcmxpa2UgU3ltYm9scyAtLT4KLTwhRU5USVRZIHdlaWVycCAgICImIzg0NzI7Ij4gPCEtLSBzY3JpcHQgY2FwaXRhbCBQID0gcG93ZXIgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBXZWllcnN0cmFzcyBwLCBVKzIxMTggSVNPYW1zbyAtLT4KLTwhRU5USVRZIGltYWdlICAgICImIzg0NjU7Ij4gPCEtLSBibGFja2xldHRlciBjYXBpdGFsIEkgPSBpbWFnaW5hcnkgcGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxMTEgSVNPYW1zbyAtLT4KLTwhRU5USVRZIHJlYWwgICAgICImIzg0NzY7Ij4gPCEtLSBibGFja2xldHRlciBjYXBpdGFsIFIgPSByZWFsIHBhcnQgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjExQyBJU09hbXNvIC0tPgotPCFFTlRJVFkgdHJhZGUgICAgIiYjODQ4MjsiPiA8IS0tIHRyYWRlIG1hcmsgc2lnbiwgVSsyMTIyIElTT251bSAtLT4KLTwhRU5USVRZIGFsZWZzeW0gICImIzg1MDE7Ij4gPCEtLSBhbGVmIHN5bWJvbCA9IGZpcnN0IHRyYW5zZmluaXRlIGNhcmRpbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjEzNSBORVcgLS0+Ci08IS0tIGFsZWYgc3ltYm9sIGlzIE5PVCB0aGUgc2FtZSBhcyBoZWJyZXcgbGV0dGVyIGFsZWYsCi0gICAgIFUrMDVEMCBhbHRob3VnaCB0aGUgc2FtZSBnbHlwaCBjb3VsZCBiZSB1c2VkIHRvIGRlcGljdCBib3RoIGNoYXJhY3RlcnMgLS0+Ci0KLTwhLS0gQXJyb3dzIC0tPgotPCFFTlRJVFkgbGFyciAgICAgIiYjODU5MjsiPiA8IS0tIGxlZnR3YXJkcyBhcnJvdywgVSsyMTkwIElTT251bSAtLT4KLTwhRU5USVRZIHVhcnIgICAgICImIzg1OTM7Ij4gPCEtLSB1cHdhcmRzIGFycm93LCBVKzIxOTEgSVNPbnVtLS0+Ci08IUVOVElUWSByYXJyICAgICAiJiM4NTk0OyI+IDwhLS0gcmlnaHR3YXJkcyBhcnJvdywgVSsyMTkyIElTT251bSAtLT4KLTwhRU5USVRZIGRhcnIgICAgICImIzg1OTU7Ij4gPCEtLSBkb3dud2FyZHMgYXJyb3csIFUrMjE5MyBJU09udW0gLS0+Ci08IUVOVElUWSBoYXJyICAgICAiJiM4NTk2OyI+IDwhLS0gbGVmdCByaWdodCBhcnJvdywgVSsyMTk0IElTT2Ftc2EgLS0+Ci08IUVOVElUWSBjcmFyciAgICAiJiM4NjI5OyI+IDwhLS0gZG93bndhcmRzIGFycm93IHdpdGggY29ybmVyIGxlZnR3YXJkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY2FycmlhZ2UgcmV0dXJuLCBVKzIxQjUgTkVXIC0tPgotPCFFTlRJVFkgbEFyciAgICAgIiYjODY1NjsiPiA8IS0tIGxlZnR3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMCBJU090ZWNoIC0tPgotPCEtLSBVbmljb2RlIGRvZXMgbm90IHNheSB0aGF0IGxBcnIgaXMgdGhlIHNhbWUgYXMgdGhlICdpcyBpbXBsaWVkIGJ5JyBhcnJvdwotICAgIGJ1dCBhbHNvIGRvZXMgbm90IGhhdmUgYW55IG90aGVyIGNoYXJhY3RlciBmb3IgdGhhdCBmdW5jdGlvbi4gU28gPyBsQXJyIGNhbgotICAgIGJlIHVzZWQgZm9yICdpcyBpbXBsaWVkIGJ5JyBhcyBJU090ZWNoIHN1Z2dlc3RzIC0tPgotPCFFTlRJVFkgdUFyciAgICAgIiYjODY1NzsiPiA8IS0tIHVwd2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDEgSVNPYW1zYSAtLT4KLTwhRU5USVRZIHJBcnIgICAgICImIzg2NTg7Ij4gPCEtLSByaWdodHdhcmRzIGRvdWJsZSBhcnJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxRDIgSVNPdGVjaCAtLT4KLTwhLS0gVW5pY29kZSBkb2VzIG5vdCBzYXkgdGhpcyBpcyB0aGUgJ2ltcGxpZXMnIGNoYXJhY3RlciBidXQgZG9lcyBub3QgaGF2ZSAKLSAgICAgYW5vdGhlciBjaGFyYWN0ZXIgd2l0aCB0aGlzIGZ1bmN0aW9uIHNvID8KLSAgICAgckFyciBjYW4gYmUgdXNlZCBmb3IgJ2ltcGxpZXMnIGFzIElTT3RlY2ggc3VnZ2VzdHMgLS0+Ci08IUVOVElUWSBkQXJyICAgICAiJiM4NjU5OyI+IDwhLS0gZG93bndhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQzIElTT2Ftc2EgLS0+Ci08IUVOVElUWSBoQXJyICAgICAiJiM4NjYwOyI+IDwhLS0gbGVmdCByaWdodCBkb3VibGUgYXJyb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMUQ0IElTT2Ftc2EgLS0+Ci0KLTwhLS0gTWF0aGVtYXRpY2FsIE9wZXJhdG9ycyAtLT4KLTwhRU5USVRZIGZvcmFsbCAgICImIzg3MDQ7Ij4gPCEtLSBmb3IgYWxsLCBVKzIyMDAgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHBhcnQgICAgICImIzg3MDY7Ij4gPCEtLSBwYXJ0aWFsIGRpZmZlcmVudGlhbCwgVSsyMjAyIElTT3RlY2ggIC0tPgotPCFFTlRJVFkgZXhpc3QgICAgIiYjODcwNzsiPiA8IS0tIHRoZXJlIGV4aXN0cywgVSsyMjAzIElTT3RlY2ggLS0+Ci08IUVOVElUWSBlbXB0eSAgICAiJiM4NzA5OyI+IDwhLS0gZW1wdHkgc2V0ID0gbnVsbCBzZXQgPSBkaWFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMDUgSVNPYW1zbyAtLT4KLTwhRU5USVRZIG5hYmxhICAgICImIzg3MTE7Ij4gPCEtLSBuYWJsYSA9IGJhY2t3YXJkIGRpZmZlcmVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjA3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBpc2luICAgICAiJiM4NzEyOyI+IDwhLS0gZWxlbWVudCBvZiwgVSsyMjA4IElTT3RlY2ggLS0+Ci08IUVOVElUWSBub3RpbiAgICAiJiM4NzEzOyI+IDwhLS0gbm90IGFuIGVsZW1lbnQgb2YsIFUrMjIwOSBJU090ZWNoIC0tPgotPCFFTlRJVFkgbmkgICAgICAgIiYjODcxNTsiPiA8IS0tIGNvbnRhaW5zIGFzIG1lbWJlciwgVSsyMjBCIElTT3RlY2ggLS0+Ci08IS0tIHNob3VsZCB0aGVyZSBiZSBhIG1vcmUgbWVtb3JhYmxlIG5hbWUgdGhhbiAnbmknPyAtLT4KLTwhRU5USVRZIHByb2QgICAgICImIzg3MTk7Ij4gPCEtLSBuLWFyeSBwcm9kdWN0ID0gcHJvZHVjdCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIwRiBJU09hbXNiIC0tPgotPCEtLSBwcm9kIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswM0EwICdncmVlayBjYXBpdGFsIGxldHRlciBwaScgdGhvdWdoCi0gICAgIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgZm9yIGJvdGggLS0+Ci08IUVOVElUWSBzdW0gICAgICAiJiM4NzIxOyI+IDwhLS0gbi1hcnkgc3VtYXRpb24sIFUrMjIxMSBJU09hbXNiIC0tPgotPCEtLSBzdW0gaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAzQTMgJ2dyZWVrIGNhcGl0YWwgbGV0dGVyIHNpZ21hJwotICAgICB0aG91Z2ggdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCBmb3IgYm90aCAtLT4KLTwhRU5USVRZIG1pbnVzICAgICImIzg3MjI7Ij4gPCEtLSBtaW51cyBzaWduLCBVKzIyMTIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGxvd2FzdCAgICImIzg3Mjc7Ij4gPCEtLSBhc3RlcmlzayBvcGVyYXRvciwgVSsyMjE3IElTT3RlY2ggLS0+Ci08IUVOVElUWSByYWRpYyAgICAiJiM4NzMwOyI+IDwhLS0gc3F1YXJlIHJvb3QgPSByYWRpY2FsIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjFBIElTT3RlY2ggLS0+Ci08IUVOVElUWSBwcm9wICAgICAiJiM4NzMzOyI+IDwhLS0gcHJvcG9ydGlvbmFsIHRvLCBVKzIyMUQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGluZmluICAgICImIzg3MzQ7Ij4gPCEtLSBpbmZpbml0eSwgVSsyMjFFIElTT3RlY2ggLS0+Ci08IUVOVElUWSBhbmcgICAgICAiJiM4NzM2OyI+IDwhLS0gYW5nbGUsIFUrMjIyMCBJU09hbXNvIC0tPgotPCFFTlRJVFkgYW5kICAgICAgIiYjODc0MzsiPiA8IS0tIGxvZ2ljYWwgYW5kID0gd2VkZ2UsIFUrMjIyNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb3IgICAgICAgIiYjODc0NDsiPiA8IS0tIGxvZ2ljYWwgb3IgPSB2ZWUsIFUrMjIyOCBJU090ZWNoIC0tPgotPCFFTlRJVFkgY2FwICAgICAgIiYjODc0NTsiPiA8IS0tIGludGVyc2VjdGlvbiA9IGNhcCwgVSsyMjI5IElTT3RlY2ggLS0+Ci08IUVOVElUWSBjdXAgICAgICAiJiM4NzQ2OyI+IDwhLS0gdW5pb24gPSBjdXAsIFUrMjIyQSBJU090ZWNoIC0tPgotPCFFTlRJVFkgaW50ICAgICAgIiYjODc0NzsiPiA8IS0tIGludGVncmFsLCBVKzIyMkIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHRoZXJlNCAgICImIzg3NTY7Ij4gPCEtLSB0aGVyZWZvcmUsIFUrMjIzNCBJU090ZWNoIC0tPgotPCFFTlRJVFkgc2ltICAgICAgIiYjODc2NDsiPiA8IS0tIHRpbGRlIG9wZXJhdG9yID0gdmFyaWVzIHdpdGggPSBzaW1pbGFyIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIzQyBJU090ZWNoIC0tPgotPCEtLSB0aWxkZSBvcGVyYXRvciBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIHRoZSB0aWxkZSwgVSswMDdFLAotICAgICBhbHRob3VnaCB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIHRvIHJlcHJlc2VudCBib3RoICAtLT4KLTwhRU5USVRZIGNvbmcgICAgICImIzg3NzM7Ij4gPCEtLSBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvLCBVKzIyNDUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGFzeW1wICAgICImIzg3NzY7Ij4gPCEtLSBhbG1vc3QgZXF1YWwgdG8gPSBhc3ltcHRvdGljIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI0OCBJU09hbXNyIC0tPgotPCFFTlRJVFkgbmUgICAgICAgIiYjODgwMDsiPiA8IS0tIG5vdCBlcXVhbCB0bywgVSsyMjYwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBlcXVpdiAgICAiJiM4ODAxOyI+IDwhLS0gaWRlbnRpY2FsIHRvLCBVKzIyNjEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGxlICAgICAgICImIzg4MDQ7Ij4gPCEtLSBsZXNzLXRoYW4gb3IgZXF1YWwgdG8sIFUrMjI2NCBJU090ZWNoIC0tPgotPCFFTlRJVFkgZ2UgICAgICAgIiYjODgwNTsiPiA8IS0tIGdyZWF0ZXItdGhhbiBvciBlcXVhbCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyNjUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1YiAgICAgICImIzg4MzQ7Ij4gPCEtLSBzdWJzZXQgb2YsIFUrMjI4MiBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3VwICAgICAgIiYjODgzNTsiPiA8IS0tIHN1cGVyc2V0IG9mLCBVKzIyODMgSVNPdGVjaCAtLT4KLTwhLS0gbm90ZSB0aGF0IG5zdXAsICdub3QgYSBzdXBlcnNldCBvZiwgVSsyMjgzJyBpcyBub3QgY292ZXJlZCBieSB0aGUgU3ltYm9sIAotICAgICBmb250IGVuY29kaW5nIGFuZCBpcyBub3QgaW5jbHVkZWQuIFNob3VsZCBpdCBiZSwgZm9yIHN5bW1ldHJ5PwotICAgICBJdCBpcyBpbiBJU09hbXNuICAtLT4gCi08IUVOVElUWSBuc3ViICAgICAiJiM4ODM2OyI+IDwhLS0gbm90IGEgc3Vic2V0IG9mLCBVKzIyODQgSVNPYW1zbiAtLT4KLTwhRU5USVRZIHN1YmUgICAgICImIzg4Mzg7Ij4gPCEtLSBzdWJzZXQgb2Ygb3IgZXF1YWwgdG8sIFUrMjI4NiBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3VwZSAgICAgIiYjODgzOTsiPiA8IS0tIHN1cGVyc2V0IG9mIG9yIGVxdWFsIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI4NyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb3BsdXMgICAgIiYjODg1MzsiPiA8IS0tIGNpcmNsZWQgcGx1cyA9IGRpcmVjdCBzdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjk1IElTT2Ftc2IgLS0+Ci08IUVOVElUWSBvdGltZXMgICAiJiM4ODU1OyI+IDwhLS0gY2lyY2xlZCB0aW1lcyA9IHZlY3RvciBwcm9kdWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI5NyBJU09hbXNiIC0tPgotPCFFTlRJVFkgcGVycCAgICAgIiYjODg2OTsiPiA8IS0tIHVwIHRhY2sgPSBvcnRob2dvbmFsIHRvID0gcGVycGVuZGljdWxhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyQTUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHNkb3QgICAgICImIzg5MDE7Ij4gPCEtLSBkb3Qgb3BlcmF0b3IsIFUrMjJDNSBJU09hbXNiIC0tPgotPCEtLSBkb3Qgb3BlcmF0b3IgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwQjcgbWlkZGxlIGRvdCAtLT4KLQotPCEtLSBNaXNjZWxsYW5lb3VzIFRlY2huaWNhbCAtLT4KLTwhRU5USVRZIGxjZWlsICAgICImIzg5Njg7Ij4gPCEtLSBsZWZ0IGNlaWxpbmcgPSBhcGwgdXBzdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMDggSVNPYW1zYyAgLS0+Ci08IUVOVElUWSByY2VpbCAgICAiJiM4OTY5OyI+IDwhLS0gcmlnaHQgY2VpbGluZywgVSsyMzA5IElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgbGZsb29yICAgIiYjODk3MDsiPiA8IS0tIGxlZnQgZmxvb3IgPSBhcGwgZG93bnN0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMwQSBJU09hbXNjICAtLT4KLTwhRU5USVRZIHJmbG9vciAgICImIzg5NzE7Ij4gPCEtLSByaWdodCBmbG9vciwgVSsyMzBCIElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgbGFuZyAgICAgIiYjOTAwMTsiPiA8IS0tIGxlZnQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCA9IGJyYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMjkgSVNPdGVjaCAtLT4KLTwhLS0gbGFuZyBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDAzQyAnbGVzcyB0aGFuJyAKLSAgICAgb3IgVSsyMDM5ICdzaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaycgLS0+Ci08IUVOVElUWSByYW5nICAgICAiJiM5MDAyOyI+IDwhLS0gcmlnaHQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCA9IGtldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMkEgSVNPdGVjaCAtLT4KLTwhLS0gcmFuZyBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDAzRSAnZ3JlYXRlciB0aGFuJyAKLSAgICAgb3IgVSsyMDNBICdzaW5nbGUgcmlnaHQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmsnIC0tPgotCi08IS0tIEdlb21ldHJpYyBTaGFwZXMgLS0+Ci08IUVOVElUWSBsb3ogICAgICAiJiM5Njc0OyI+IDwhLS0gbG96ZW5nZSwgVSsyNUNBIElTT3B1YiAtLT4KLQotPCEtLSBNaXNjZWxsYW5lb3VzIFN5bWJvbHMgLS0+Ci08IUVOVElUWSBzcGFkZXMgICAiJiM5ODI0OyI+IDwhLS0gYmxhY2sgc3BhZGUgc3VpdCwgVSsyNjYwIElTT3B1YiAtLT4KLTwhLS0gYmxhY2sgaGVyZSBzZWVtcyB0byBtZWFuIGZpbGxlZCBhcyBvcHBvc2VkIHRvIGhvbGxvdyAtLT4KLTwhRU5USVRZIGNsdWJzICAgICImIzk4Mjc7Ij4gPCEtLSBibGFjayBjbHViIHN1aXQgPSBzaGFtcm9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzI2NjMgSVNPcHViIC0tPgotPCFFTlRJVFkgaGVhcnRzICAgIiYjOTgyOTsiPiA8IS0tIGJsYWNrIGhlYXJ0IHN1aXQgPSB2YWxlbnRpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyNjY1IElTT3B1YiAtLT4KLTwhRU5USVRZIGRpYW1zICAgICImIzk4MzA7Ij4gPCEtLSBibGFjayBkaWFtb25kIHN1aXQsIFUrMjY2NiBJU09wdWIgLS0+Ci0KLTwhLS0gU3BlY2lhbCBjaGFyYWN0ZXJzIGZvciBIVE1MIC0tPgotCi08IS0tIENoYXJhY3RlciBlbnRpdHkgc2V0LiBUeXBpY2FsIGludm9jYXRpb246Ci0gICAgIDwhRU5USVRZICUgSFRNTHNwZWNpYWwgUFVCTElDCi0gICAgICAgICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwtc3BlY2lhbC5lbnQiPgotICAgICAlSFRNTHNwZWNpYWw7Ci0tLT4KLQotPCEtLSBQb3J0aW9ucyAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2OgotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGgKLSAgICAgY29uZm9ybWluZyBTR01MIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluCi0gICAgIElTTyA4ODc5LCBwcm92aWRlZCB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzLgotLS0+Ci0KLTwhLS0gUmVsZXZhbnQgSVNPIGVudGl0eSBzZXQgaXMgZ2l2ZW4gdW5sZXNzIG5hbWVzIGFyZSBuZXdseSBpbnRyb2R1Y2VkLgotICAgICBOZXcgbmFtZXMgKGkuZS4sIG5vdCBpbiBJU08gODg3OSBsaXN0KSBkbyBub3QgY2xhc2ggd2l0aCBhbnkKLSAgICAgZXhpc3RpbmcgSVNPIDg4NzkgZW50aXR5IG5hbWVzLiBJU08gMTA2NDYgY2hhcmFjdGVyIG51bWJlcnMKLSAgICAgYXJlIGdpdmVuIGZvciBlYWNoIGNoYXJhY3RlciwgaW4gaGV4LiB2YWx1ZXMgYXJlIGRlY2ltYWwKLSAgICAgY29udmVyc2lvbnMgb2YgdGhlIElTTyAxMDY0NiB2YWx1ZXMgYW5kIHJlZmVyIHRvIHRoZSBkb2N1bWVudAotICAgICBjaGFyYWN0ZXIgc2V0LiBOYW1lcyBhcmUgVW5pY29kZSBuYW1lcy4gCi0tLT4KLQotPCEtLSBDMCBDb250cm9scyBhbmQgQmFzaWMgTGF0aW4gLS0+Ci08IUVOVElUWSBxdW90ICAgICImIzM0OyI+IDwhLS0gIHF1b3RhdGlvbiBtYXJrID0gQVBMIHF1b3RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMDIyIElTT251bSAtLT4KLTwhRU5USVRZIGFtcCAgICAgIiYjMzg7IzM4OyI+IDwhLS0gIGFtcGVyc2FuZCwgVSswMDI2IElTT251bSAtLT4KLTwhRU5USVRZIGx0ICAgICAgIiYjMzg7IzYwOyI+IDwhLS0gIGxlc3MtdGhhbiBzaWduLCBVKzAwM0MgSVNPbnVtIC0tPgotPCFFTlRJVFkgZ3QgICAgICAiJiM2MjsiPiA8IS0tICBncmVhdGVyLXRoYW4gc2lnbiwgVSswMDNFIElTT251bSAtLT4KLTwhRU5USVRZIGFwb3MJICImIzM5OyI+IDwhLS0gIGFwb3N0cm9waGUgbWFyaywgVSswMDI3IElTT251bSAtLT4KLQotPCEtLSBMYXRpbiBFeHRlbmRlZC1BIC0tPgotPCFFTlRJVFkgT0VsaWcgICAiJiMzMzg7Ij4gPCEtLSAgbGF0aW4gY2FwaXRhbCBsaWdhdHVyZSBPRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE1MiBJU09sYXQyIC0tPgotPCFFTlRJVFkgb2VsaWcgICAiJiMzMzk7Ij4gPCEtLSAgbGF0aW4gc21hbGwgbGlnYXR1cmUgb2UsIFUrMDE1MyBJU09sYXQyIC0tPgotPCEtLSBsaWdhdHVyZSBpcyBhIG1pc25vbWVyLCB0aGlzIGlzIGEgc2VwYXJhdGUgY2hhcmFjdGVyIGluIHNvbWUgbGFuZ3VhZ2VzIC0tPgotPCFFTlRJVFkgU2Nhcm9uICAiJiMzNTI7Ij4gPCEtLSAgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgUyB3aXRoIGNhcm9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTYwIElTT2xhdDIgLS0+Ci08IUVOVElUWSBzY2Fyb24gICImIzM1MzsiPiA8IS0tICBsYXRpbiBzbWFsbCBsZXR0ZXIgcyB3aXRoIGNhcm9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTYxIElTT2xhdDIgLS0+Ci08IUVOVElUWSBZdW1sICAgICImIzM3NjsiPiA8IS0tICBsYXRpbiBjYXBpdGFsIGxldHRlciBZIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTc4IElTT2xhdDIgLS0+Ci0KLTwhLS0gU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzIC0tPgotPCFFTlRJVFkgY2lyYyAgICAiJiM3MTA7Ij4gPCEtLSAgbW9kaWZpZXIgbGV0dGVyIGNpcmN1bWZsZXggYWNjZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMkM2IElTT3B1YiAtLT4KLTwhRU5USVRZIHRpbGRlICAgIiYjNzMyOyI+IDwhLS0gIHNtYWxsIHRpbGRlLCBVKzAyREMgSVNPZGlhIC0tPgotCi08IS0tIEdlbmVyYWwgUHVuY3R1YXRpb24gLS0+Ci08IUVOVElUWSBlbnNwICAgICImIzgxOTQ7Ij4gPCEtLSBlbiBzcGFjZSwgVSsyMDAyIElTT3B1YiAtLT4KLTwhRU5USVRZIGVtc3AgICAgIiYjODE5NTsiPiA8IS0tIGVtIHNwYWNlLCBVKzIwMDMgSVNPcHViIC0tPgotPCFFTlRJVFkgdGhpbnNwICAiJiM4MjAxOyI+IDwhLS0gdGhpbiBzcGFjZSwgVSsyMDA5IElTT3B1YiAtLT4KLTwhRU5USVRZIHp3bmogICAgIiYjODIwNDsiPiA8IS0tIHplcm8gd2lkdGggbm9uLWpvaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAwQyBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSB6d2ogICAgICImIzgyMDU7Ij4gPCEtLSB6ZXJvIHdpZHRoIGpvaW5lciwgVSsyMDBEIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIGxybSAgICAgIiYjODIwNjsiPiA8IS0tIGxlZnQtdG8tcmlnaHQgbWFyaywgVSsyMDBFIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIHJsbSAgICAgIiYjODIwNzsiPiA8IS0tIHJpZ2h0LXRvLWxlZnQgbWFyaywgVSsyMDBGIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIG5kYXNoICAgIiYjODIxMTsiPiA8IS0tIGVuIGRhc2gsIFUrMjAxMyBJU09wdWIgLS0+Ci08IUVOVElUWSBtZGFzaCAgICImIzgyMTI7Ij4gPCEtLSBlbSBkYXNoLCBVKzIwMTQgSVNPcHViIC0tPgotPCFFTlRJVFkgbHNxdW8gICAiJiM4MjE2OyI+IDwhLS0gbGVmdCBzaW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMTggSVNPbnVtIC0tPgotPCFFTlRJVFkgcnNxdW8gICAiJiM4MjE3OyI+IDwhLS0gcmlnaHQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDE5IElTT251bSAtLT4KLTwhRU5USVRZIHNicXVvICAgIiYjODIxODsiPiA8IS0tIHNpbmdsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFBIE5FVyAtLT4KLTwhRU5USVRZIGxkcXVvICAgIiYjODIyMDsiPiA8IS0tIGxlZnQgZG91YmxlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDFDIElTT251bSAtLT4KLTwhRU5USVRZIHJkcXVvICAgIiYjODIyMTsiPiA8IS0tIHJpZ2h0IGRvdWJsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxRCBJU09udW0gLS0+Ci08IUVOVElUWSBiZHF1byAgICImIzgyMjI7Ij4gPCEtLSBkb3VibGUgbG93LTkgcXVvdGF0aW9uIG1hcmssIFUrMjAxRSBORVcgLS0+Ci08IUVOVElUWSBkYWdnZXIgICImIzgyMjQ7Ij4gPCEtLSBkYWdnZXIsIFUrMjAyMCBJU09wdWIgLS0+Ci08IUVOVElUWSBEYWdnZXIgICImIzgyMjU7Ij4gPCEtLSBkb3VibGUgZGFnZ2VyLCBVKzIwMjEgSVNPcHViIC0tPgotPCFFTlRJVFkgcGVybWlsICAiJiM4MjQwOyI+IDwhLS0gcGVyIG1pbGxlIHNpZ24sIFUrMjAzMCBJU090ZWNoIC0tPgotPCFFTlRJVFkgbHNhcXVvICAiJiM4MjQ5OyI+IDwhLS0gc2luZ2xlIGxlZnQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMzkgSVNPIHByb3Bvc2VkIC0tPgotPCEtLSBsc2FxdW8gaXMgcHJvcG9zZWQgYnV0IG5vdCB5ZXQgSVNPIHN0YW5kYXJkaXplZCAtLT4KLTwhRU5USVRZIHJzYXF1byAgIiYjODI1MDsiPiA8IS0tIHNpbmdsZSByaWdodC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzQSBJU08gcHJvcG9zZWQgLS0+Ci08IS0tIHJzYXF1byBpcyBwcm9wb3NlZCBidXQgbm90IHlldCBJU08gc3RhbmRhcmRpemVkIC0tPgotPCFFTlRJVFkgZXVybyAgICImIzgzNjQ7Ij4gPCEtLSAgZXVybyBzaWduLCBVKzIwQUMgTkVXIC0tPgotCi0KLTwhLS0gZW5kIG9mIHhodG1sLWNoYXJlbnQtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtZnJhbWV3b3JrLTEubW9kIC0tPgotCi0KLTwhRU5USVRZICUgcHJlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQQotICAgICAgfCAlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUFuY2hvci5jbGFzczsKLSAgICAgICVJbmxpbmUuZXh0cmE7ICkqIgotPgotCi08IUVOVElUWSAlIHhodG1sLXRleHQubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBUZXh0IDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtdGV4dC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBUZXh0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC10ZXh0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFRleHQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC10ZXh0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFRleHR1YWwgQ29udGVudAotCi0gICAgIFRoZSBUZXh0IG1vZHVsZSBpbmNsdWRlcyBkZWNsYXJhdGlvbnMgZm9yIGFsbCBjb3JlIAotICAgICB0ZXh0IGNvbnRhaW5lciBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcy4KLS0tPgotCi08IUVOVElUWSAlIHhodG1sLWlubHN0cnVjdC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1pbmxzdHJ1Y3QubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtaW5sc3RydWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFN0cnVjdHVyYWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1pbmxzdHJ1Y3QtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW5saW5lIFN0cnVjdHVyYWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaW5sc3RydWN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBTdHJ1Y3R1cmFsIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtaW5sc3RydWN0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIElubGluZSBTdHJ1Y3R1cmFsCi0KLSAgICAgICAgYnIsIHNwYW4KLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgCi0gICAgIHVzZWQgdG8gc3VwcG9ydCBpbmxpbmUtbGV2ZWwgc3RydWN0dXJhbCBtYXJrdXAuCi0tLT4KLQotPCEtLSBicjogZm9yY2VkIGxpbmUgYnJlYWsgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgYnIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVici5lbGVtZW50O1sKLQotPCFFTlRJVFkgJSBici5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgYnIucW5hbWUgICJiciIgPgotPCFFTEVNRU5UICVici5xbmFtZTsgICVici5jb250ZW50OyA+Ci0KLTwhLS0gZW5kIG9mIGJyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYnIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVici5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYnIucW5hbWU7Ci0gICAgICAlQ29yZS5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBici5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHNwYW46IGdlbmVyaWMgaW5saW5lIGNvbnRhaW5lciAuLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBzcGFuLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc3Bhbi5lbGVtZW50O1sKLTwhRU5USVRZICUgc3Bhbi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHNwYW4ucW5hbWUgICJzcGFuIiA+Ci08IUVMRU1FTlQgJXNwYW4ucW5hbWU7ICAlc3Bhbi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzcGFuLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3Bhbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXNwYW4uYXR0bGlzdDtbCi08IUFUVExJU1QgJXNwYW4ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHNwYW4uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtaW5sc3RydWN0LTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtaW5scGhyYXMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtaW5scGhyYXMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtaW5scGhyYXMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgUGhyYXNhbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWlubHBocmFzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIElubGluZSBQaHJhc2FsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWlubHBocmFzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBQaHJhc2FsIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtaW5scGhyYXMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW5saW5lIFBocmFzYWwKLQotICAgICAgICBhYmJyLCBhY3JvbnltLCBjaXRlLCBjb2RlLCBkZm4sIGVtLCBrYmQsIHEsIHNhbXAsIHN0cm9uZywgdmFyCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIHVzZWQgdG8KLSAgICAgc3VwcG9ydCBpbmxpbmUtbGV2ZWwgcGhyYXNhbCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSBhYmJyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYWJici5lbGVtZW50O1sKLTwhRU5USVRZICUgYWJici5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGFiYnIucW5hbWUgICJhYmJyIiA+Ci08IUVMRU1FTlQgJWFiYnIucW5hbWU7ICAlYWJici5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBhYmJyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYWJici5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWFiYnIuYXR0bGlzdDtbCi08IUFUVExJU1QgJWFiYnIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGFiYnIuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhY3JvbnltLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYWNyb255bS5lbGVtZW50O1sKLTwhRU5USVRZICUgYWNyb255bS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGFjcm9ueW0ucW5hbWUgICJhY3JvbnltIiA+Ci08IUVMRU1FTlQgJWFjcm9ueW0ucW5hbWU7ICAlYWNyb255bS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBhY3JvbnltLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYWNyb255bS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWFjcm9ueW0uYXR0bGlzdDtbCi08IUFUVExJU1QgJWFjcm9ueW0ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGFjcm9ueW0uYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjaXRlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslY2l0ZS5lbGVtZW50O1sKLTwhRU5USVRZICUgY2l0ZS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGNpdGUucW5hbWUgICJjaXRlIiA+Ci08IUVMRU1FTlQgJWNpdGUucW5hbWU7ICAlY2l0ZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBjaXRlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgY2l0ZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWNpdGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJWNpdGUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGNpdGUuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjb2RlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslY29kZS5lbGVtZW50O1sKLTwhRU5USVRZICUgY29kZS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGNvZGUucW5hbWUgICJjb2RlIiA+Ci08IUVMRU1FTlQgJWNvZGUucW5hbWU7ICAlY29kZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBjb2RlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgY29kZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWNvZGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJWNvZGUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGNvZGUuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkZm4uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkZm4uZWxlbWVudDtbCi08IUVOVElUWSAlIGRmbi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGRmbi5xbmFtZSAgImRmbiIgPgotPCFFTEVNRU5UICVkZm4ucW5hbWU7ICAlZGZuLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGRmbi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGRmbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRmbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZGZuLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkZm4uYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBlbS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWVtLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBlbS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGVtLnFuYW1lICAiZW0iID4KLTwhRUxFTUVOVCAlZW0ucW5hbWU7ICAlZW0uY29udGVudDsgPgotPCEtLSBlbmQgb2YgZW0uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBlbS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWVtLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVlbS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZW0uYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBrYmQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVrYmQuZWxlbWVudDtbCi08IUVOVElUWSAlIGtiZC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGtiZC5xbmFtZSAgImtiZCIgPgotPCFFTEVNRU5UICVrYmQucW5hbWU7ICAla2JkLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGtiZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGtiZC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWtiZC5hdHRsaXN0O1sKLTwhQVRUTElTVCAla2JkLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBrYmQuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBxLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcS5lbGVtZW50O1sKLTwhRU5USVRZICUgcS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHEucW5hbWUgICJxIiA+Ci08IUVMRU1FTlQgJXEucW5hbWU7ICAlcS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBxLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgcS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXEuYXR0bGlzdDtbCi08IUFUVExJU1QgJXEucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGNpdGUgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHEuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzYW1wLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc2FtcC5lbGVtZW50O1sKLTwhRU5USVRZICUgc2FtcC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHNhbXAucW5hbWUgICJzYW1wIiA+Ci08IUVMRU1FTlQgJXNhbXAucW5hbWU7ICAlc2FtcC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzYW1wLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc2FtcC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXNhbXAuYXR0bGlzdDtbCi08IUFUVExJU1QgJXNhbXAucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHNhbXAuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzdHJvbmcuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzdHJvbmcuZWxlbWVudDtbCi08IUVOVElUWSAlIHN0cm9uZy5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHN0cm9uZy5xbmFtZSAgInN0cm9uZyIgPgotPCFFTEVNRU5UICVzdHJvbmcucW5hbWU7ICAlc3Ryb25nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHN0cm9uZy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHN0cm9uZy5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXN0cm9uZy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc3Ryb25nLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzdHJvbmcuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSB2YXIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV2YXIuZWxlbWVudDtbCi08IUVOVElUWSAlIHZhci5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHZhci5xbmFtZSAgInZhciIgPgotPCFFTEVNRU5UICV2YXIucW5hbWU7ICAldmFyLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHZhci5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHZhci5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXZhci5hdHRsaXN0O1sKLTwhQVRUTElTVCAldmFyLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB2YXIuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtaW5scGhyYXMtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ibGtzdHJ1Y3QubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtYmxrc3RydWN0Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWJsa3N0cnVjdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFN0cnVjdHVyYWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQmxvY2sgU3RydWN0dXJhbCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmxrc3RydWN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFN0cnVjdHVyYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1ibGtzdHJ1Y3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmxvY2sgU3RydWN0dXJhbAotCi0gICAgICAgIGRpdiwgcAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgYmxvY2stbGV2ZWwgc3RydWN0dXJhbCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSBkaXYuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkaXYuZWxlbWVudDtbCi08IUVOVElUWSAlIGRpdi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBkaXYucW5hbWUgICJkaXYiID4KLTwhRUxFTUVOVCAlZGl2LnFuYW1lOyAgJWRpdi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkaXYuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkaXYuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVkaXYuYXR0bGlzdDtbCi08IS0tIGVuZCBvZiBkaXYuYXR0bGlzdCAtLT5dXT4KLTwhQVRUTElTVCAlZGl2LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci0KLTwhRU5USVRZICUgcC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXAuZWxlbWVudDtbCi08IUVOVElUWSAlIHAuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIiA+Ci08IUVOVElUWSAlIHAucW5hbWUgICJwIiA+Ci08IUVMRU1FTlQgJXAucW5hbWU7ICAlcC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBwLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgcC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXAuYXR0bGlzdDtbCi08IUFUVExJU1QgJXAucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHAuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmxrc3RydWN0LTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtYmxrcGhyYXMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtYmxrcGhyYXMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYmxrcGhyYXMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBQaHJhc2FsIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYmxrcGhyYXMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQmxvY2sgUGhyYXNhbCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmxrcGhyYXMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgUGhyYXNhbCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWJsa3BocmFzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJsb2NrIFBocmFzYWwKLQotICAgICAgICBhZGRyZXNzLCBibG9ja3F1b3RlLCBwcmUsIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IGJsb2NrLWxldmVsIHBocmFzYWwgbWFya3VwLgotLS0+Ci0KLTwhRU5USVRZICUgYWRkcmVzcy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWFkZHJlc3MuZWxlbWVudDtbCi08IUVOVElUWSAlIGFkZHJlc3MuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIiA+Ci08IUVOVElUWSAlIGFkZHJlc3MucW5hbWUgICJhZGRyZXNzIiA+Ci08IUVMRU1FTlQgJWFkZHJlc3MucW5hbWU7ICAlYWRkcmVzcy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBhZGRyZXNzLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYWRkcmVzcy5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWFkZHJlc3MuYXR0bGlzdDtbCi08IUFUVExJU1QgJWFkZHJlc3MucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGFkZHJlc3MuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBibG9ja3F1b3RlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYmxvY2txdW90ZS5lbGVtZW50O1sKLTwhRU5USVRZICUgYmxvY2txdW90ZS5jb250ZW50Ci0gICAgICIoICVCbG9jay5taXg7ICkrIgotPgotPCFFTlRJVFkgJSBibG9ja3F1b3RlLnFuYW1lICAiYmxvY2txdW90ZSIgPgotPCFFTEVNRU5UICVibG9ja3F1b3RlLnFuYW1lOyAgJWJsb2NrcXVvdGUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYmxvY2txdW90ZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJsb2NrcXVvdGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVibG9ja3F1b3RlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVibG9ja3F1b3RlLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBjaXRlICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBibG9ja3F1b3RlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgcHJlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcHJlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBwcmUuY29udGVudAotICAgICAiKCAjUENEQVRBIAotICAgICAgfCAlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgfCAldHQucW5hbWU7IHwgJWkucW5hbWU7IHwgJWIucW5hbWU7Ci0gICAgICAlSTE4bi5jbGFzczsKLSAgICAgICVBbmNob3IuY2xhc3M7Ci0gICAgICB8ICVzY3JpcHQucW5hbWU7IHwgJW1hcC5xbmFtZTsKLSAgICAgICVJbmxpbmUuZXh0cmE7ICkqIgotPgotPCFFTlRJVFkgJSBwcmUucW5hbWUgICJwcmUiID4KLTwhRUxFTUVOVCAlcHJlLnFuYW1lOyAgJXByZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBwcmUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwcmUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVwcmUuYXR0bGlzdDtbCi08IUFUVExJU1QgJXByZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgeG1sOnNwYWNlICAgICggcHJlc2VydmUgKSAgICAgICAgICAgICAjRklYRUQgJ3ByZXNlcnZlJwotPgotPCEtLSBlbmQgb2YgcHJlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLiAgSGVhZGluZyBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBIZWFkaW5nLmNvbnRlbnQgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiID4KLQotPCFFTlRJVFkgJSBoMS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWgxLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoMS5xbmFtZSAgImgxIiA+Ci08IUVMRU1FTlQgJWgxLnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWgxLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoMS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDEuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWgyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoMi5xbmFtZSAgImgyIiA+Ci08IUVMRU1FTlQgJWgyLnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWgyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoMi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDIuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWgzLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoMy5xbmFtZSAgImgzIiA+Ci08IUVMRU1FTlQgJWgzLnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDMuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMy5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWgzLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoMy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDMuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWg0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoNC5xbmFtZSAgImg0IiA+Ci08IUVMRU1FTlQgJWg0LnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWg0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoNC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDQuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWg1LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoNS5xbmFtZSAgImg1IiA+Ci08IUVMRU1FTlQgJWg1LnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWg1LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoNS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDUuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWg2LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoNi5xbmFtZSAgImg2IiA+Ci08IUVMRU1FTlQgJWg2LnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDYuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWg2LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoNi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDYuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmxrcGhyYXMtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtdGV4dC0xLm1vZCAtLT4KLQotCi08IUVOVElUWSAlIHhodG1sLWh5cGVydGV4dC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEh5cGVydGV4dCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWh5cGVydGV4dC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBIeXBlcnRleHQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1oeXBlcnRleHQtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSHlwZXJ0ZXh0IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtaHlwZXJ0ZXh0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEh5cGVydGV4dAotCi0gICAgICAgIGEKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgYW5jaG9yICgnYScpIGVsZW1lbnQgdHlwZSwgd2hpY2gKLSAgICAgZGVmaW5lcyB0aGUgc291cmNlIG9mIGEgaHlwZXJ0ZXh0IGxpbmsuIFRoZSBkZXN0aW5hdGlvbgotICAgICAob3IgbGluayAndGFyZ2V0JykgaXMgaWRlbnRpZmllZCB2aWEgaXRzICdpZCcgYXR0cmlidXRlIAotICAgICByYXRoZXIgdGhhbiB0aGUgJ25hbWUnIGF0dHJpYnV0ZSBhcyB3YXMgdXNlZCBpbiBIVE1MLgotLS0+Ci0KLTwhLS0gLi4uLi4uLi4uLi4uICBBbmNob3IgRWxlbWVudCAgLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxOb0FuY2hvci5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBhLnFuYW1lICAiYSIgPgotPCFFTEVNRU5UICVhLnFuYW1lOyAgJWEuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVhLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVhLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBocmVmICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjaGFyc2V0ICAgICAgJUNoYXJzZXQuZGF0YXR5cGU7ICAgICAgICNJTVBMSUVECi0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICBocmVmbGFuZyAgICAgJUxhbmd1YWdlQ29kZS5kYXRhdHlwZTsgICNJTVBMSUVECi0gICAgICByZWwgICAgICAgICAgJUxpbmtUeXBlcy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICByZXYgICAgICAgICAgJUxpbmtUeXBlcy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICB0YWJpbmRleCAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBhLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWh5cGVydGV4dC0xLm1vZCAtLT4KLQotCi08IUVOVElUWSAlIHhodG1sLWxpc3QubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBMaXN0cyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWxpc3QtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgTGlzdHMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbGlzdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBMaXN0cyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWxpc3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTGlzdHMKLQotICAgICAgICBkbCwgZHQsIGRkLCBvbCwgdWwsIGxpCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGxpc3Qtb3JpZW50ZWQgZWxlbWVudCB0eXBlcwotICAgICBhbmQgdGhlaXIgYXR0cmlidXRlcy4KLS0tPgotCi08IUVOVElUWSAlIGRsLnFuYW1lICAiZGwiID4KLTwhRU5USVRZICUgZHQucW5hbWUgICJkdCIgPgotPCFFTlRJVFkgJSBkZC5xbmFtZSAgImRkIiA+Ci08IUVOVElUWSAlIG9sLnFuYW1lICAib2wiID4KLTwhRU5USVRZICUgdWwucW5hbWUgICJ1bCIgPgotPCFFTlRJVFkgJSBsaS5xbmFtZSAgImxpIiA+Ci0KLTwhLS0gZGw6IERlZmluaXRpb24gTGlzdCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGRsLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZGwuZWxlbWVudDtbCi08IUVOVElUWSAlIGRsLmNvbnRlbnQgICIoICVkdC5xbmFtZTsgfCAlZGQucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJWRsLnFuYW1lOyAgJWRsLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGRsLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGwuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVkbC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZGwucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGRsLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZHQ6IERlZmluaXRpb24gVGVybSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGR0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZHQuZWxlbWVudDtbCi08IUVOVElUWSAlIGR0LmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlZHQucW5hbWU7ICAlZHQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgZHQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkdC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWR0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkdC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZHQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBkZDogRGVmaW5pdGlvbiBEZXNjcmlwdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgZGQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkZC5lbGVtZW50O1sKLTwhRU5USVRZICUgZGQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlZGQucW5hbWU7ICAlZGQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkZC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRkLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkZC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZGQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBvbDogT3JkZXJlZCBMaXN0IChudW1iZXJlZCBzdHlsZXMpIC4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgb2wuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVvbC5lbGVtZW50O1sKLTwhRU5USVRZICUgb2wuY29udGVudCAgIiggJWxpLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICVvbC5xbmFtZTsgICVvbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBvbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIG9sLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslb2wuYXR0bGlzdDtbCi08IUFUVExJU1QgJW9sLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBvbC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHVsOiBVbm9yZGVyZWQgTGlzdCAoYnVsbGV0IHN0eWxlcykgLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB1bC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXVsLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB1bC5jb250ZW50ICAiKCAlbGkucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJXVsLnFuYW1lOyAgJXVsLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHVsLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdWwuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV1bC5hdHRsaXN0O1sKLTwhQVRUTElTVCAldWwucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHVsLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gbGk6IExpc3QgSXRlbSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGxpLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslbGkuZWxlbWVudDtbCi08IUVOVElUWSAlIGxpLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJWxpLnFuYW1lOyAgJWxpLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGxpLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbGkuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVsaS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbGkucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGxpLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWxpc3QtMS5tb2QgLS0+Ci0KLQotPCEtLSA6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiAtLT4KLQotPCEtLSBJbWFnZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1pbWFnZS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1pbWFnZS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1pbWFnZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEltYWdlcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWltYWdlLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEltYWdlcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWltYWdlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSb3Zpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEltYWdlcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWltYWdlLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEltYWdlcwotCi0gICAgICAgIGltZwotCi0gICAgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIG1hcmt1cCB0byBzdXBwb3J0IGJhc2ljIGltYWdlIGVtYmVkZGluZy4KLS0tPgotCi08IS0tIFRvIGF2b2lkIHByb2JsZW1zIHdpdGggdGV4dC1vbmx5IFVBcyBhcyB3ZWxsIGFzIHRvIG1ha2UKLSAgICAgaW1hZ2UgY29udGVudCB1bmRlcnN0YW5kYWJsZSBhbmQgbmF2aWdhYmxlIHRvIHVzZXJzIG9mCi0gICAgIG5vbi12aXN1YWwgVUFzLCB5b3UgbmVlZCB0byBwcm92aWRlIGEgZGVzY3JpcHRpb24gd2l0aAotICAgICB0aGUgJ2FsdCcgYXR0cmlidXRlLCBhbmQgYXZvaWQgc2VydmVyLXNpZGUgaW1hZ2UgbWFwcy4KLS0tPgotCi08IUVOVElUWSAlIGltZy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWltZy5lbGVtZW50O1sKLTwhRU5USVRZICUgaW1nLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBpbWcucW5hbWUgICJpbWciID4KLTwhRUxFTUVOVCAlaW1nLnFuYW1lOyAgJWltZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBpbWcuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBpbWcuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVpbWcuYXR0bGlzdDtbCi08IUFUVExJU1QgJWltZy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgc3JjICAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIGFsdCAgICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI1JFUVVJUkVECi0gICAgICBsb25nZGVzYyAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBoZWlnaHQgICAgICAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICB3aWR0aCAgICAgICAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBpbWcuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtaW1hZ2UtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBUYWJsZXMgTW9kdWxlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC10YWJsZS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC10YWJsZS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC10YWJsZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2ljIFRhYmxlcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWJhc2ljLXRhYmxlLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCYXNpYyBUYWJsZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmFzaWMtdGFibGUtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MIEJhc2ljLCBhIHByb3BlciBzdWJzZXQgb2YgWEhUTUwuCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNpYyBUYWJsZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1iYXNpYy10YWJsZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCYXNpYyBUYWJsZXMKLQotICAgICAgICB0YWJsZSwgY2FwdGlvbiwgdHIsIHRoLCB0ZAotCi0gICAgIFRoaXMgdGFibGUgbW9kdWxlIGRlY2xhcmVzIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGRlZmluaW5nCi0gICAgIGEgdGFibGUgbW9kZWwgYmFzZWQgZnVuZGFtZW50YWxseSBvbiBmZWF0dXJlcyBmb3VuZCBpbiB0aGUKLSAgICAgd2lkZWx5LWRlcGxveWVkIEhUTUwgMy4yIHRhYmxlIG1vZGVsLiAgV2hpbGUgdGhpcyBtb2R1bGUKLSAgICAgbWltaWNzIHRoZSBjb250ZW50IG1vZGVsIGFuZCB0YWJsZSBhdHRyaWJ1dGVzIG9mIEhUTUwgMy4yCi0gICAgIHRhYmxlcywgdGhlIGVsZW1lbnQgdHlwZXMgZGVjbGFyZWQgaGVyZWluIGFsc28gaW5jbHVkZXMgYWxsCi0gICAgIEhUTUwgNCBjb21tb24gYW5kIG1vc3Qgb2YgdGhlIEhUTUwgNCB0YWJsZSBhdHRyaWJ1dGVzLgotLS0+Ci0KLTwhLS0gZGVjbGFyZSBxdWFsaWZpZWQgZWxlbWVudCB0eXBlIG5hbWVzOgotLS0+Ci08IUVOVElUWSAlIHRhYmxlLnFuYW1lICAidGFibGUiID4KLTwhRU5USVRZICUgY2FwdGlvbi5xbmFtZSAgImNhcHRpb24iID4KLTwhRU5USVRZICUgdHIucW5hbWUgICJ0ciIgPgotPCFFTlRJVFkgJSB0aC5xbmFtZSAgInRoIiA+Ci08IUVOVElUWSAlIHRkLnFuYW1lICAidGQiID4KLQotPCEtLSBob3Jpem9udGFsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzCi0tLT4KLTwhRU5USVRZICUgQ2VsbEhBbGlnbi5hdHRyaWIKLSAgICAgImFsaWduICAgICAgICAoIGxlZnQKLSAgICAgICAgICAgICAgICAgICB8IGNlbnRlcgotICAgICAgICAgICAgICAgICAgIHwgcmlnaHQgKSAgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCEtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cwotLS0+Ci08IUVOVElUWSAlIENlbGxWQWxpZ24uYXR0cmliCi0gICAgICJ2YWxpZ24gICAgICAgKCB0b3AKLSAgICAgICAgICAgICAgICAgICB8IG1pZGRsZQotICAgICAgICAgICAgICAgICAgIHwgYm90dG9tICkgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCEtLSBzY29wZSBpcyBzaW1wbGVyIHRoYW4gYXhlcyBhdHRyaWJ1dGUgZm9yIGNvbW1vbiB0YWJsZXMKLS0tPgotPCFFTlRJVFkgJSBzY29wZS5hdHRyaWIKLSAgICAgInNjb3BlICAgICAgICAoIHJvdyB8IGNvbCAgKSAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhLS0gdGFibGU6IFRhYmxlIEVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHRhYmxlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGFibGUuZWxlbWVudDtbCi08IUVOVElUWSAlIHRhYmxlLmNvbnRlbnQKLSAgICAgIiggJWNhcHRpb24ucW5hbWU7PywgJXRyLnFuYW1lOysgKSIKLT4KLTwhRUxFTUVOVCAldGFibGUucW5hbWU7ICAldGFibGUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGFibGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0YWJsZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRhYmxlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0YWJsZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgc3VtbWFyeSAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgdGFibGUuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBjYXB0aW9uOiBUYWJsZSBDYXB0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgY2FwdGlvbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWNhcHRpb24uZWxlbWVudDtbCi08IUVOVElUWSAlIGNhcHRpb24uY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTEVNRU5UICVjYXB0aW9uLnFuYW1lOyAgJWNhcHRpb24uY29udGVudDsgPgotPCEtLSBlbmQgb2YgY2FwdGlvbi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGNhcHRpb24uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVjYXB0aW9uLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVjYXB0aW9uLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBjYXB0aW9uLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdHI6IFRhYmxlIFJvdyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHRyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldHIuZWxlbWVudDtbCi08IUVOVElUWSAlIHRyLmNvbnRlbnQgICIoICV0aC5xbmFtZTsgfCAldGQucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJXRyLnFuYW1lOyAgJXRyLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdHIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0ci5hdHRsaXN0O1sKLTwhQVRUTElTVCAldHIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdGg6IFRhYmxlIEhlYWRlciBDZWxsIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIHRoIGlzIGZvciBoZWFkZXIgY2VsbHMsIHRkIGZvciBkYXRhLAotICAgICBidXQgZm9yIGNlbGxzIGFjdGluZyBhcyBib3RoIHVzZSB0ZAotLS0+Ci0KLTwhRU5USVRZICUgdGguZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0aC5lbGVtZW50O1sKLTwhRU5USVRZICUgdGguY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3dOb1RhYmxlLm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJXRoLnFuYW1lOyAgJXRoLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRoLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGguYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0aC5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGgucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGFiYnIgICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGF4aXMgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhlYWRlcnMgICAgICBJRFJFRlMgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICVzY29wZS5hdHRyaWI7Ci0gICAgICByb3dzcGFuICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICcxJwotICAgICAgY29sc3BhbiAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRoLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdGQ6IFRhYmxlIERhdGEgQ2VsbCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHRkLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGQuZWxlbWVudDtbCi08IUVOVElUWSAlIHRkLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Tm9UYWJsZS5taXg7ICkqIgotPgotPCFFTEVNRU5UICV0ZC5xbmFtZTsgICV0ZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0ZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGQuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRkLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBhYmJyICAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICBheGlzICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBoZWFkZXJzICAgICAgSURSRUZTICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICAlc2NvcGUuYXR0cmliOwotICAgICAgcm93c3BhbiAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgIGNvbHNwYW4gICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0ZC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1iYXNpYy10YWJsZS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIEZvcm1zIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWZvcm0ubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtZm9ybS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1mb3JtLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzaWMgRm9ybXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1iYXNpYy1mb3JtLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFNpbXBsaWZpZWQgRm9ybXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJhc2ljLWZvcm0tMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MIEJhc2ljLCBhIHByb3BlciBzdWJzZXQgb2YgWEhUTUwuCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNpYyBGb3JtcyAxLjAvL0VOIiAgCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtYmFzaWMtZm9ybS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCYXNpYyBGb3JtcwotCi0gICAgIFRoaXMgZm9ybXMgbW9kdWxlIGlzIGJhc2VkIG9uIHRoZSBIVE1MIDMuMiBmb3JtcyBtb2RlbCwgd2l0aAotICAgICB0aGUgV0FJLXJlcXVlc3RlZCBhZGRpdGlvbiBvZiB0aGUgbGFiZWwgZWxlbWVudC4gV2hpbGUgdGhpcyAKLSAgICAgbW9kdWxlIGVzc2VudGlhbGx5IG1pbWljcyB0aGUgY29udGVudCBtb2RlbCBhbmQgYXR0cmlidXRlcyBvZiAKLSAgICAgSFRNTCAzLjIgZm9ybXMsIHRoZSBlbGVtZW50IHR5cGVzIGRlY2xhcmVkIGhlcmVpbiBhbHNvIGluY2x1ZGUKLSAgICAgYWxsIEhUTUwgNCBjb21tb24gYXR0cmlidXRlcy4KLQotICAgICAgICBmb3JtLCBsYWJlbCwgaW5wdXQsIHNlbGVjdCwgb3B0aW9uLCB0ZXh0YXJlYQotLS0+Ci0KLTwhLS0gZGVjbGFyZSBxdWFsaWZpZWQgZWxlbWVudCB0eXBlIG5hbWVzOgotLS0+Ci08IUVOVElUWSAlIGZvcm0ucW5hbWUgICJmb3JtIiA+Ci08IUVOVElUWSAlIGxhYmVsLnFuYW1lICAibGFiZWwiID4KLTwhRU5USVRZICUgaW5wdXQucW5hbWUgICJpbnB1dCIgPgotPCFFTlRJVFkgJSBzZWxlY3QucW5hbWUgICJzZWxlY3QiID4KLTwhRU5USVRZICUgb3B0aW9uLnFuYW1lICAib3B0aW9uIiA+Ci08IUVOVElUWSAlIHRleHRhcmVhLnFuYW1lICAidGV4dGFyZWEiID4KLQotPCEtLSAlQmxrTm9Gb3JtLm1peDsgaW5jbHVkZXMgYWxsIG5vbi1mb3JtIGJsb2NrIGVsZW1lbnRzLAotICAgICBwbHVzICVNaXNjLmNsYXNzOwotLS0+Ci08IUVOVElUWSAlIEJsa05vRm9ybS5taXgKLSAgICAgIiVIZWFkaW5nLmNsYXNzOwotICAgICAgfCAlTGlzdC5jbGFzczsKLSAgICAgIHwgJUJsa1N0cnVjdC5jbGFzczsKLSAgICAgICVCbGtQaHJhcy5jbGFzczsKLSAgICAgICVCbGtQcmVzLmNsYXNzOwotICAgICAgfCAldGFibGUucW5hbWU7IAotICAgICAgJUJsb2NrLmV4dHJhOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IS0tIGZvcm06IEZvcm0gRWxlbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBmb3JtLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZm9ybS5lbGVtZW50O1sKLTwhRU5USVRZICUgZm9ybS5jb250ZW50Ci0gICAgICIoICVCbGtOb0Zvcm0ubWl4OyApKyIKLT4KLTwhRUxFTUVOVCAlZm9ybS5xbmFtZTsgICVmb3JtLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGZvcm0uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBmb3JtLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZm9ybS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZm9ybS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgYWN0aW9uICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIG1ldGhvZCAgICAgICAoIGdldCB8IHBvc3QgKSAgICAgICAgICAgJ2dldCcKLSAgICAgIGVuY3R5cGUgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcKLT4KLTwhLS0gZW5kIG9mIGZvcm0uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBsYWJlbDogRm9ybSBGaWVsZCBMYWJlbCBUZXh0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgbGFiZWwuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVsYWJlbC5lbGVtZW50O1sKLTwhLS0gRWFjaCBsYWJlbCBtdXN0IG5vdCBjb250YWluIG1vcmUgdGhhbiBPTkUgZmllbGQKLS0tPgotPCFFTlRJVFkgJSBsYWJlbC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgCi0gICAgICB8ICVpbnB1dC5xbmFtZTsgfCAlc2VsZWN0LnFuYW1lOyB8ICV0ZXh0YXJlYS5xbmFtZTsKLSAgICAgIHwgJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgICVJMThuLmNsYXNzOwotICAgICAgJUlubFByZXMuY2xhc3M7Ci0gICAgICAlSW5sU3BlY2lhbC5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyApKiIKLT4KLTwhRUxFTUVOVCAlbGFiZWwucW5hbWU7ICAlbGFiZWwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgbGFiZWwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBsYWJlbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWxhYmVsLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVsYWJlbC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgZm9yICAgICAgICAgIElEUkVGICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgbGFiZWwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBpbnB1dDogRm9ybSBDb250cm9sIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgaW5wdXQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVpbnB1dC5lbGVtZW50O1sKLTwhRU5USVRZICUgaW5wdXQuY29udGVudCAgIkVNUFRZIiA+Ci08IUVMRU1FTlQgJWlucHV0LnFuYW1lOyAgJWlucHV0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGlucHV0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhLS0gQmFzaWMgRm9ybXMgcmVtb3ZlcyAnaW1hZ2UnIGFuZCAnZmlsZScgaW5wdXQgdHlwZXMuCi0tLT4KLTwhRU5USVRZICUgaW5wdXQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVpbnB1dC5hdHRsaXN0O1sKLTwhRU5USVRZICUgSW5wdXRUeXBlLmNsYXNzCi0gICAgICIoIHRleHQgfCBwYXNzd29yZCB8IGNoZWNrYm94IHwgcmFkaW8gCi0gICAgICB8IHN1Ym1pdCB8IHJlc2V0IHwgaGlkZGVuICkiCi0+Ci08IS0tIGF0dHJpYnV0ZSBuYW1lIHJlcXVpcmVkIGZvciBhbGwgYnV0IHN1Ym1pdCAmIHJlc2V0Ci0tLT4KLTwhQVRUTElTVCAlaW5wdXQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHR5cGUgICAgICAgICAlSW5wdXRUeXBlLmNsYXNzOyAgICAgICAgJ3RleHQnCi0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB2YWx1ZSAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjaGVja2VkICAgICAgKCBjaGVja2VkICkgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBzaXplICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBtYXhsZW5ndGggICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBzcmMgICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBpbnB1dC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHNlbGVjdDogT3B0aW9uIFNlbGVjdG9yIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBzZWxlY3QuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzZWxlY3QuZWxlbWVudDtbCi08IUVOVElUWSAlIHNlbGVjdC5jb250ZW50ICAiKCAlb3B0aW9uLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICVzZWxlY3QucW5hbWU7ICAlc2VsZWN0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHNlbGVjdC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHNlbGVjdC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXNlbGVjdC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc2VsZWN0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBzaXplICAgICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBtdWx0aXBsZSAgICAgKCBtdWx0aXBsZSApICAgICAgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBzZWxlY3QuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBvcHRpb246IFNlbGVjdGFibGUgQ2hvaWNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgb3B0aW9uLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslb3B0aW9uLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBvcHRpb24uY29udGVudCAgIiggI1BDREFUQSApIiA+Ci08IUVMRU1FTlQgJW9wdGlvbi5xbmFtZTsgICVvcHRpb24uY29udGVudDsgPgotPCEtLSBlbmQgb2Ygb3B0aW9uLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgb3B0aW9uLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslb3B0aW9uLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVvcHRpb24ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHNlbGVjdGVkICAgICAoIHNlbGVjdGVkICkgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHZhbHVlICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIG9wdGlvbi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRleHRhcmVhOiBNdWx0aS1MaW5lIFRleHQgRmllbGQgLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB0ZXh0YXJlYS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRleHRhcmVhLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0ZXh0YXJlYS5jb250ZW50ICAiKCAjUENEQVRBICkiID4KLTwhRUxFTUVOVCAldGV4dGFyZWEucW5hbWU7ICAldGV4dGFyZWEuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGV4dGFyZWEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0ZXh0YXJlYS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRleHRhcmVhLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0ZXh0YXJlYS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgcm93cyAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjUkVRVUlSRUQKLSAgICAgIGNvbHMgICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI1JFUVVJUkVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiB0ZXh0YXJlYS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1iYXNpYy1mb3JtLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gTGluayBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtbGluay5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1saW5rLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWxpbmsubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBMaW5rIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1saW5rLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIExpbmsgRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWxpbmstMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTGluayBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtbGluay0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBMaW5rIGVsZW1lbnQKLQotICAgICAgICBsaW5rCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGxpbmsgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywKLSAgICAgd2hpY2ggY291bGQgKGluIHByaW5jaXBsZSkgYmUgdXNlZCB0byBkZWZpbmUgZG9jdW1lbnQtbGV2ZWwgbGlua3MKLSAgICAgdG8gZXh0ZXJuYWwgcmVzb3VyY2VzIHN1Y2ggYXM6Ci0KLSAgICAgYSkgZm9yIGRvY3VtZW50IHNwZWNpZmljIHRvb2xiYXJzL21lbnVzLCBlLmcuIHN0YXJ0LCBjb250ZW50cywKLSAgICAgICAgcHJldmlvdXMsIG5leHQsIGluZGV4LCBlbmQsIGhlbHAKLSAgICAgYikgdG8gbGluayB0byBhIHNlcGFyYXRlIHN0eWxlIHNoZWV0IChyZWw9InN0eWxlc2hlZXQiKQotICAgICBjKSB0byBtYWtlIGEgbGluayB0byBhIHNjcmlwdCAocmVsPSJzY3JpcHQiKQotICAgICBkKSBieSBzdHlsZXNoZWV0cyB0byBjb250cm9sIGhvdyBjb2xsZWN0aW9ucyBvZiBodG1sIG5vZGVzIGFyZQotICAgICAgICByZW5kZXJlZCBpbnRvIHByaW50ZWQgZG9jdW1lbnRzCi0gICAgIGUpIHRvIG1ha2UgYSBsaW5rIHRvIGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotICAgICAgICBlLmcuIGEgcG9zdHNjcmlwdCBvciBwZGYgdmVyc2lvbiAocmVsPSJhbHRlcm5hdGUiIG1lZGlhPSJwcmludCIpCi0tLT4KLQotPCEtLSBsaW5rOiBNZWRpYS1JbmRlcGVuZGVudCBMaW5rIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgbGluay5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWxpbmsuZWxlbWVudDtbCi08IUVOVElUWSAlIGxpbmsuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIGxpbmsucW5hbWUgICJsaW5rIiA+Ci08IUVMRU1FTlQgJWxpbmsucW5hbWU7ICAlbGluay5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBsaW5rLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbGluay5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWxpbmsuYXR0bGlzdDtbCi08IUFUVExJU1QgJWxpbmsucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGNoYXJzZXQgICAgICAlQ2hhcnNldC5kYXRhdHlwZTsgICAgICAgI0lNUExJRUQKLSAgICAgIGhyZWYgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhyZWZsYW5nICAgICAlTGFuZ3VhZ2VDb2RlLmRhdGF0eXBlOyAgI0lNUExJRUQKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgIHJlbCAgICAgICAgICAlTGlua1R5cGVzLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIHJldiAgICAgICAgICAlTGlua1R5cGVzLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIG1lZGlhICAgICAgICAlTWVkaWFEZXNjLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGxpbmsuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbGluay0xLm1vZCAtLT4KLV1dPgotCi08IS0tIERvY3VtZW50IE1ldGFpbmZvcm1hdGlvbiBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLW1ldGEubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtbWV0YS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1tZXRhLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTWV0YWluZm9ybWF0aW9uIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtbWV0YS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBEb2N1bWVudCBNZXRhaW5mb3JtYXRpb24gTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1tZXRhLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIE1ldGFpbmZvcm1hdGlvbiAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLW1ldGEtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTWV0YSBJbmZvcm1hdGlvbgotCi0gICAgICAgIG1ldGEKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgbWV0YSBlbGVtZW50IHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGVzLAotICAgICB1c2VkIHRvIHByb3ZpZGUgZGVjbGFyYXRpdmUgZG9jdW1lbnQgbWV0YWluZm9ybWF0aW9uLgotLS0+Ci0KLTwhLS0gbWV0YTogR2VuZXJpYyBNZXRhaW5mb3JtYXRpb24gLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIG1ldGEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVtZXRhLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBtZXRhLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBtZXRhLnFuYW1lICAibWV0YSIgPgotPCFFTEVNRU5UICVtZXRhLnFuYW1lOyAgJW1ldGEuY29udGVudDsgPgotPCEtLSBlbmQgb2YgbWV0YS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIG1ldGEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVtZXRhLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVtZXRhLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLSAgICAgIGh0dHAtZXF1aXYgICBOTVRPS0VOICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIG5hbWUgICAgICAgICBOTVRPS0VOICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNvbnRlbnQgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICBzY2hlbWUgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBtZXRhLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLW1ldGEtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBCYXNlIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1iYXNlLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWJhc2UubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYmFzZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2UgRWxlbWVudCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWJhc2UtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQmFzZSBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmFzZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNlIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1iYXNlLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJhc2UgZWxlbWVudAotCi0gICAgICAgIGJhc2UKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgYmFzZSBlbGVtZW50IHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGVzLAotICAgICB1c2VkIHRvIGRlZmluZSBhIGJhc2UgVVJJIGFnYWluc3Qgd2hpY2ggcmVsYXRpdmUgVVJJcyBpbiB0aGUKLSAgICAgZG9jdW1lbnQgd2lsbCBiZSByZXNvbHZlZC4KLQotICAgICBOb3RlIHRoYXQgdGhpcyBtb2R1bGUgYWxzbyByZWRlY2xhcmVzIHRoZSBjb250ZW50IG1vZGVsIGZvcgotICAgICB0aGUgaGVhZCBlbGVtZW50IHRvIGluY2x1ZGUgdGhlIGJhc2UgZWxlbWVudC4KLS0tPgotCi08IS0tIGJhc2U6IERvY3VtZW50IEJhc2UgVVJJIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBiYXNlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYmFzZS5lbGVtZW50O1sKLTwhRU5USVRZICUgYmFzZS5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgYmFzZS5xbmFtZSAgImJhc2UiID4KLTwhRUxFTUVOVCAlYmFzZS5xbmFtZTsgICViYXNlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJhc2UuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBiYXNlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYmFzZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYmFzZS5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICBocmVmICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNSRVFVSVJFRAotPgotPCEtLSBlbmQgb2YgYmFzZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGhlYWQuY29udGVudAotICAgICIoICVIZWFkT3B0cy5taXg7LAotICAgICAoICggJXRpdGxlLnFuYW1lOywgJUhlYWRPcHRzLm1peDssICggJWJhc2UucW5hbWU7LCAlSGVhZE9wdHMubWl4OyApPyApCi0gICAgIHwgKCAlYmFzZS5xbmFtZTssICVIZWFkT3B0cy5taXg7LCAoICV0aXRsZS5xbmFtZTssICVIZWFkT3B0cy5taXg7ICkpKSkiCi0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJhc2UtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBQYXJhbSBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1wYXJhbS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1wYXJhbS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1wYXJhbS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFBhcmFtIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1wYXJhbS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBQYXJhbSBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtcGFyYW0tMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgUGFyYW0gRWxlbWVudCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLXBhcmFtLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFBhcmFtZXRlcnMgZm9yIEphdmEgQXBwbGV0cyBhbmQgRW1iZWRkZWQgT2JqZWN0cwotCi0gICAgICAgIHBhcmFtCi0KLSAgICAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgZGVjbGFyYXRpb25zIGZvciB0aGUgcGFyYW0gZWxlbWVudCwgCi0gICAgIHVzZWQgdG8gcHJvdmlkZSBuYW1lZCBwcm9wZXJ0eSB2YWx1ZXMgZm9yIHRoZSBhcHBsZXQKLSAgICAgYW5kIG9iamVjdCBlbGVtZW50cy4gCi0tLT4KLQotPCEtLSBwYXJhbTogTmFtZWQgUHJvcGVydHkgVmFsdWUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgcGFyYW0uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVwYXJhbS5lbGVtZW50O1sKLTwhRU5USVRZICUgcGFyYW0uY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIHBhcmFtLnFuYW1lICAicGFyYW0iID4KLTwhRUxFTUVOVCAlcGFyYW0ucW5hbWU7ICAlcGFyYW0uY29udGVudDsgPgotPCEtLSBlbmQgb2YgcGFyYW0uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwYXJhbS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXBhcmFtLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVwYXJhbS5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7IAotICAgICAgJWlkLmF0dHJpYjsKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICB2YWx1ZSAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB2YWx1ZXR5cGUgICAgKCBkYXRhIHwgcmVmIHwgb2JqZWN0ICkgICdkYXRhJwotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgcGFyYW0uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtcGFyYW0tMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBFbWJlZGRlZCBPYmplY3QgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1vYmplY3QubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtb2JqZWN0Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLW9iamVjdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEVtYmVkZGVkIE9iamVjdCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLW9iamVjdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBFbWJlZGRlZCBPYmplY3QgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1vYmplY3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRW1iZWRkZWQgT2JqZWN0IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtb2JqZWN0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEVtYmVkZGVkIE9iamVjdHMKLQotICAgICAgICBvYmplY3QKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgb2JqZWN0IGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsCi0gICAgIHVzZWQgdG8gZW1iZWQgZXh0ZXJuYWwgb2JqZWN0cyBhcyBwYXJ0IG9mIFhIVE1MIHBhZ2VzLiBJbiB0aGUKLSAgICAgZG9jdW1lbnQsIHBsYWNlIHBhcmFtIGVsZW1lbnRzIHByaW9yIHRvIHRoZSBvYmplY3QgZWxlbWVudHMgCi0gICAgIHRoYXQgcmVxdWlyZSB0aGVpciBjb250ZW50LgotCi0gICAgIE5vdGUgdGhhdCB1c2Ugb2YgdGhpcyBtb2R1bGUgcmVxdWlyZXMgaW5zdGFudGlhdGlvbiBvZiB0aGUgCi0gICAgIFBhcmFtIEVsZW1lbnQgTW9kdWxlIHByaW9yIHRvIHRoaXMgbW9kdWxlLgotLS0+Ci0KLTwhLS0gb2JqZWN0OiBHZW5lcmljIEVtYmVkZGVkIE9iamVjdCAuLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIG9iamVjdC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW9iamVjdC5lbGVtZW50O1sKLTwhRU5USVRZICUgb2JqZWN0LmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgfCAlcGFyYW0ucW5hbWU7ICkqIgotPgotPCFFTlRJVFkgJSBvYmplY3QucW5hbWUgICJvYmplY3QiID4KLTwhRUxFTUVOVCAlb2JqZWN0LnFuYW1lOyAgJW9iamVjdC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBvYmplY3QuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBvYmplY3QuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVvYmplY3QuYXR0bGlzdDtbCi08IUFUVExJU1QgJW9iamVjdC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgZGVjbGFyZSAgICAgICggZGVjbGFyZSApICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgY2xhc3NpZCAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgY29kZWJhc2UgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgZGF0YSAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjSU1QTElFRAotICAgICAgY29kZXR5cGUgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjSU1QTElFRAotICAgICAgYXJjaGl2ZSAgICAgICVVUklzLmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotICAgICAgc3RhbmRieSAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotICAgICAgaGVpZ2h0ICAgICAgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgd2lkdGggICAgICAgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdGFiaW5kZXggICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2Ygb2JqZWN0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLW9iamVjdC0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLXN0cnVjdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIERvY3VtZW50IFN0cnVjdHVyZSAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLXN0cnVjdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBTdHJ1Y3R1cmUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1zdHJ1Y3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRG9jdW1lbnQgU3RydWN0dXJlIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtc3RydWN0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIERvY3VtZW50IFN0cnVjdHVyZQotCi0gICAgICAgIHRpdGxlLCBoZWFkLCBib2R5LCBodG1sCi0KLSAgICAgVGhlIFN0cnVjdHVyZSBNb2R1bGUgZGVmaW5lcyB0aGUgbWFqb3Igc3RydWN0dXJhbCBlbGVtZW50cyBhbmQgCi0gICAgIHRoZWlyIGF0dHJpYnV0ZXMuCi0KLSAgICAgTm90ZSB0aGF0IHRoZSBjb250ZW50IG1vZGVsIG9mIHRoZSBoZWFkIGVsZW1lbnQgdHlwZSBpcyByZWRlY2xhcmVkIAotICAgICB3aGVuIHRoZSBCYXNlIE1vZHVsZSBpcyBpbmNsdWRlZCBpbiB0aGUgRFRELgotCi0gICAgIFRoZSBwYXJhbWV0ZXIgZW50aXR5IGNvbnRhaW5pbmcgdGhlIFhNTCBuYW1lc3BhY2UgVVJJIHZhbHVlIHVzZWQgCi0gICAgIGZvciBYSFRNTCBpcyAnJVhIVE1MLnhtbG5zOycsIGRlZmluZWQgaW4gdGhlIFF1YWxpZmllZCBOYW1lcyBtb2R1bGUuCi0tLT4KLQotPCEtLSB0aXRsZTogRG9jdW1lbnQgVGl0bGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVGhlIHRpdGxlIGVsZW1lbnQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgZmxvdyBvZiB0ZXh0LgotICAgICBJdCBzaG91bGQgYmUgZGlzcGxheWVkLCBmb3IgZXhhbXBsZSBhcyB0aGUgcGFnZSBoZWFkZXIgb3IKLSAgICAgd2luZG93IHRpdGxlLiBFeGFjdGx5IG9uZSB0aXRsZSBpcyByZXF1aXJlZCBwZXIgZG9jdW1lbnQuCi0tLT4KLQotPCFFTlRJVFkgJSB0aXRsZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRpdGxlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0aXRsZS5jb250ZW50ICAiKCAjUENEQVRBICkiID4KLTwhRU5USVRZICUgdGl0bGUucW5hbWUgICJ0aXRsZSIgPgotPCFFTEVNRU5UICV0aXRsZS5xbmFtZTsgICV0aXRsZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0aXRsZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRpdGxlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGl0bGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRpdGxlLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsgCi0gICAgICAlSTE4bi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0aXRsZS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGhlYWQ6IERvY3VtZW50IEhlYWQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBoZWFkLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaGVhZC5lbGVtZW50O1sKLTwhRU5USVRZICUgaGVhZC5jb250ZW50Ci0gICAgIiggJUhlYWRPcHRzLm1peDssICV0aXRsZS5xbmFtZTssICVIZWFkT3B0cy5taXg7ICkiCi0+Ci08IUVOVElUWSAlIGhlYWQucW5hbWUgICJoZWFkIiA+Ci08IUVMRU1FTlQgJWhlYWQucW5hbWU7ICAlaGVhZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoZWFkLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaGVhZC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWhlYWQuYXR0bGlzdDtbCi08IS0tIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIHdpdGggZG9jdW1lbnQgcHJvZmlsZXMKLS0tPgotPCFFTlRJVFkgJSBwcm9maWxlLmF0dHJpYgotICAgICAicHJvZmlsZSAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAnJVhIVE1MLnByb2ZpbGU7JyIKLT4KLQotPCFBVFRMSVNUICVoZWFkLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsgCi0gICAgICAlSTE4bi5hdHRyaWI7Ci0gICAgICAlcHJvZmlsZS5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoZWFkLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gYm9keTogRG9jdW1lbnQgQm9keSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGJvZHkuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVib2R5LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBib2R5LmNvbnRlbnQKLSAgICAgIiggJUJsb2NrLm1peDsgKSsiCi0+Ci08IUVOVElUWSAlIGJvZHkucW5hbWUgICJib2R5IiA+Ci08IUVMRU1FTlQgJWJvZHkucW5hbWU7ICAlYm9keS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBib2R5LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYm9keS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJvZHkuYXR0bGlzdDtbCi08IUFUVExJU1QgJWJvZHkucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGJvZHkuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBodG1sOiBYSFRNTCBEb2N1bWVudCBFbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgaHRtbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWh0bWwuZWxlbWVudDtbCi08IUVOVElUWSAlIGh0bWwuY29udGVudCAgIiggJWhlYWQucW5hbWU7LCAlYm9keS5xbmFtZTsgKSIgPgotPCFFTlRJVFkgJSBodG1sLnFuYW1lICAiaHRtbCIgPgotPCFFTEVNRU5UICVodG1sLnFuYW1lOyAgJWh0bWwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaHRtbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGh0bWwuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVodG1sLmF0dGxpc3Q7WwotPCEtLSB2ZXJzaW9uIGF0dHJpYnV0ZSB2YWx1ZSBkZWZpbmVkIGluIGRyaXZlcgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnZlcnNpb24uYXR0cmliCi0gICAgICJ2ZXJzaW9uICAgICAgJUZQSS5kYXRhdHlwZTsgICAgICAgICAgICNGSVhFRCAnJVhIVE1MLnZlcnNpb247JyIKLT4KLQotPCEtLSBzZWUgdGhlIFF1YWxpZmllZCBOYW1lcyBtb2R1bGUgZm9yIGluZm9ybWF0aW9uIAotICAgICBvbiBob3cgdG8gZXh0ZW5kIFhIVE1MIHVzaW5nIFhNTCBuYW1lc3BhY2VzIAotLS0+Ci08IUFUVExJU1QgJWh0bWwucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOyAKLSAgICAgICVYSFRNTC52ZXJzaW9uLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGh0bWwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtc3RydWN0LTEubW9kIC0tPgotCi0KLTwhLS0gZW5kIG9mIFhIVE1MIEJhc2ljIDEuMCBEVEQgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtbGF0MS5lbnQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtbGF0MS5lbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMTk4ZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLWxhdDEuZW50CisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLTwhLS0gUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NgotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGgKLSAgICAgY29uZm9ybWluZyBTR01MIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluCi0gICAgIElTTyA4ODc5LCBwcm92aWRlZCB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzLgotLS0+Ci08IS0tIENoYXJhY3RlciBlbnRpdHkgc2V0LiBUeXBpY2FsIGludm9jYXRpb246Ci0gICAgPCFFTlRJVFkgJSBIVE1MbGF0MSBQVUJMSUMKLSAgICAgICAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbiAxIGZvciBYSFRNTC8vRU4iCi0gICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwtbGF0MS5lbnQiPgotICAgICVIVE1MbGF0MTsKLS0tPgotCi08IUVOVElUWSBuYnNwICAgIiYjMTYwOyI+IDwhLS0gbm8tYnJlYWsgc3BhY2UgPSBub24tYnJlYWtpbmcgc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEEwIElTT251bSAtLT4KLTwhRU5USVRZIGlleGNsICAiJiMxNjE7Ij4gPCEtLSBpbnZlcnRlZCBleGNsYW1hdGlvbiBtYXJrLCBVKzAwQTEgSVNPbnVtIC0tPgotPCFFTlRJVFkgY2VudCAgICImIzE2MjsiPiA8IS0tIGNlbnQgc2lnbiwgVSswMEEyIElTT251bSAtLT4KLTwhRU5USVRZIHBvdW5kICAiJiMxNjM7Ij4gPCEtLSBwb3VuZCBzaWduLCBVKzAwQTMgSVNPbnVtIC0tPgotPCFFTlRJVFkgY3VycmVuICImIzE2NDsiPiA8IS0tIGN1cnJlbmN5IHNpZ24sIFUrMDBBNCBJU09udW0gLS0+Ci08IUVOVElUWSB5ZW4gICAgIiYjMTY1OyI+IDwhLS0geWVuIHNpZ24gPSB5dWFuIHNpZ24sIFUrMDBBNSBJU09udW0gLS0+Ci08IUVOVElUWSBicnZiYXIgIiYjMTY2OyI+IDwhLS0gYnJva2VuIGJhciA9IGJyb2tlbiB2ZXJ0aWNhbCBiYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEE2IElTT251bSAtLT4KLTwhRU5USVRZIHNlY3QgICAiJiMxNjc7Ij4gPCEtLSBzZWN0aW9uIHNpZ24sIFUrMDBBNyBJU09udW0gLS0+Ci08IUVOVElUWSB1bWwgICAgIiYjMTY4OyI+IDwhLS0gZGlhZXJlc2lzID0gc3BhY2luZyBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEE4IElTT2RpYSAtLT4KLTwhRU5USVRZIGNvcHkgICAiJiMxNjk7Ij4gPCEtLSBjb3B5cmlnaHQgc2lnbiwgVSswMEE5IElTT251bSAtLT4KLTwhRU5USVRZIG9yZGYgICAiJiMxNzA7Ij4gPCEtLSBmZW1pbmluZSBvcmRpbmFsIGluZGljYXRvciwgVSswMEFBIElTT251bSAtLT4KLTwhRU5USVRZIGxhcXVvICAiJiMxNzE7Ij4gPCEtLSBsZWZ0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFyawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGVmdCBwb2ludGluZyBndWlsbGVtZXQsIFUrMDBBQiBJU09udW0gLS0+Ci08IUVOVElUWSBub3QgICAgIiYjMTcyOyI+IDwhLS0gbm90IHNpZ24gPSBhbmdsZWQgZGFzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQUMgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2h5ICAgICImIzE3MzsiPiA8IS0tIHNvZnQgaHlwaGVuID0gZGlzY3JldGlvbmFyeSBoeXBoZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEFEIElTT251bSAtLT4KLTwhRU5USVRZIHJlZyAgICAiJiMxNzQ7Ij4gPCEtLSByZWdpc3RlcmVkIHNpZ24gPSByZWdpc3RlcmVkIHRyYWRlIG1hcmsgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQUUgSVNPbnVtIC0tPgotPCFFTlRJVFkgbWFjciAgICImIzE3NTsiPiA8IS0tIG1hY3JvbiA9IHNwYWNpbmcgbWFjcm9uID0gb3ZlcmxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFQTCBvdmVyYmFyLCBVKzAwQUYgSVNPZGlhIC0tPgotPCFFTlRJVFkgZGVnICAgICImIzE3NjsiPiA8IS0tIGRlZ3JlZSBzaWduLCBVKzAwQjAgSVNPbnVtIC0tPgotPCFFTlRJVFkgcGx1c21uICImIzE3NzsiPiA8IS0tIHBsdXMtbWludXMgc2lnbiA9IHBsdXMtb3ItbWludXMgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjEgSVNPbnVtIC0tPgotPCFFTlRJVFkgc3VwMiAgICImIzE3ODsiPiA8IS0tIHN1cGVyc2NyaXB0IHR3byA9IHN1cGVyc2NyaXB0IGRpZ2l0IHR3bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3F1YXJlZCwgVSswMEIyIElTT251bSAtLT4KLTwhRU5USVRZIHN1cDMgICAiJiMxNzk7Ij4gPCEtLSBzdXBlcnNjcmlwdCB0aHJlZSA9IHN1cGVyc2NyaXB0IGRpZ2l0IHRocmVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjdWJlZCwgVSswMEIzIElTT251bSAtLT4KLTwhRU5USVRZIGFjdXRlICAiJiMxODA7Ij4gPCEtLSBhY3V0ZSBhY2NlbnQgPSBzcGFjaW5nIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCNCBJU09kaWEgLS0+Ci08IUVOVElUWSBtaWNybyAgIiYjMTgxOyI+IDwhLS0gbWljcm8gc2lnbiwgVSswMEI1IElTT251bSAtLT4KLTwhRU5USVRZIHBhcmEgICAiJiMxODI7Ij4gPCEtLSBwaWxjcm93IHNpZ24gPSBwYXJhZ3JhcGggc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjYgSVNPbnVtIC0tPgotPCFFTlRJVFkgbWlkZG90ICImIzE4MzsiPiA8IS0tIG1pZGRsZSBkb3QgPSBHZW9yZ2lhbiBjb21tYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gR3JlZWsgbWlkZGxlIGRvdCwgVSswMEI3IElTT251bSAtLT4KLTwhRU5USVRZIGNlZGlsICAiJiMxODQ7Ij4gPCEtLSBjZWRpbGxhID0gc3BhY2luZyBjZWRpbGxhLCBVKzAwQjggSVNPZGlhIC0tPgotPCFFTlRJVFkgc3VwMSAgICImIzE4NTsiPiA8IS0tIHN1cGVyc2NyaXB0IG9uZSA9IHN1cGVyc2NyaXB0IGRpZ2l0IG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjkgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3JkbSAgICImIzE4NjsiPiA8IS0tIG1hc2N1bGluZSBvcmRpbmFsIGluZGljYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQkEgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmFxdW8gICImIzE4NzsiPiA8IS0tIHJpZ2h0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFyawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcmlnaHQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQkIgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzE0ICImIzE4ODsiPiA8IS0tIHZ1bGdhciBmcmFjdGlvbiBvbmUgcXVhcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZnJhY3Rpb24gb25lIHF1YXJ0ZXIsIFUrMDBCQyBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMTIgIiYjMTg5OyI+IDwhLS0gdnVsZ2FyIGZyYWN0aW9uIG9uZSBoYWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmcmFjdGlvbiBvbmUgaGFsZiwgVSswMEJEIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMzNCAiJiMxOTA7Ij4gPCEtLSB2dWxnYXIgZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzLCBVKzAwQkUgSVNPbnVtIC0tPgotPCFFTlRJVFkgaXF1ZXN0ICImIzE5MTsiPiA8IS0tIGludmVydGVkIHF1ZXN0aW9uIG1hcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHR1cm5lZCBxdWVzdGlvbiBtYXJrLCBVKzAwQkYgSVNPbnVtIC0tPgotPCFFTlRJVFkgQWdyYXZlICImIzE5MjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBncmF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFhY3V0ZSAiJiMxOTM7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBY2lyYyAgIiYjMTk0OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBdGlsZGUgIiYjMTk1OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXVtbCAgICImIzE5NjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBBcmluZyAgIiYjMTk3OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIHJpbmcgYWJvdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFFbGlnICAiJiMxOTg7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsaWdhdHVyZSBBRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIENjZWRpbCAiJiMxOTk7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBDIHdpdGggY2VkaWxsYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzcgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVncmF2ZSAiJiMyMDA7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFYWN1dGUgIiYjMjAxOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWNpcmMgICImIzIwMjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgRXVtbCAgICImIzIwMzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJZ3JhdmUgIiYjMjA0OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWFjdXRlICImIzIwNTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0QgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEljaXJjICAiJiMyMDY7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0UgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEl1bWwgICAiJiMyMDc7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDRiBJU09sYXQxIC0tPgotPCFFTlRJVFkgRVRIICAgICImIzIwODsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEVUSCwgVSswMEQwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBOdGlsZGUgIiYjMjA5OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTiB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2dyYXZlICImIzIxMDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9hY3V0ZSAiJiMyMTE7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPY2lyYyAgIiYjMjEyOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBPdGlsZGUgIiYjMjEzOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBENSBJU09sYXQxIC0tPgotPCFFTlRJVFkgT3VtbCAgICImIzIxNDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ2IElTT2xhdDEgLS0+Ci08IUVOVElUWSB0aW1lcyAgIiYjMjE1OyI+IDwhLS0gbXVsdGlwbGljYXRpb24gc2lnbiwgVSswMEQ3IElTT251bSAtLT4KLTwhRU5USVRZIE9zbGFzaCAiJiMyMTY7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggc3Ryb2tlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHNsYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWdyYXZlICImIzIxNzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVhY3V0ZSAiJiMyMTg7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBVY2lyYyAgIiYjMjE5OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBVdW1sICAgIiYjMjIwOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFlhY3V0ZSAiJiMyMjE7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBZIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEREIElTT2xhdDEgLS0+Ci08IUVOVElUWSBUSE9STiAgIiYjMjIyOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVEhPUk4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBzemxpZyAgIiYjMjIzOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHNoYXJwIHMgPSBlc3MtemVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBERiBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWdyYXZlICImIzIyNDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggZ3JhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxldHRlciBhIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWFjdXRlICImIzIyNTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhY2lyYyAgIiYjMjI2OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXRpbGRlICImIzIyNzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhdW1sICAgIiYjMjI4OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBhcmluZyAgIiYjMjI5OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCByaW5nIGFib3ZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSByaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWVsaWcgICImIzIzMDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGlnYXR1cmUgYWUsIFUrMDBFNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgY2NlZGlsICImIzIzMTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBjIHdpdGggY2VkaWxsYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTcgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVncmF2ZSAiJiMyMzI7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWFjdXRlICImIzIzMzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlY2lyYyAgIiYjMjM0OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgZXVtbCAgICImIzIzNTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWdyYXZlICImIzIzNjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpYWN1dGUgIiYjMjM3OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGljaXJjICAiJiMyMzg7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpdW1sICAgIiYjMjM5OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBldGggICAgIiYjMjQwOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGV0aCwgVSswMEYwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBudGlsZGUgIiYjMjQxOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG4gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9ncmF2ZSAiJiMyNDI7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2FjdXRlICImIzI0MzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEYzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvY2lyYyAgIiYjMjQ0OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgb3RpbGRlICImIzI0NTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBvdW1sICAgIiYjMjQ2OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBkaXZpZGUgIiYjMjQ3OyI+IDwhLS0gZGl2aXNpb24gc2lnbiwgVSswMEY3IElTT251bSAtLT4KLTwhRU5USVRZIG9zbGFzaCAiJiMyNDg7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIHN0cm9rZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxldHRlciBvIHNsYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWdyYXZlICImIzI0OTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY5IElTT2xhdDEgLS0+Ci08IUVOVElUWSB1YWN1dGUgIiYjMjUwOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVjaXJjICAiJiMyNTE7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZCIElTT2xhdDEgLS0+Ci08IUVOVElUWSB1dW1sICAgIiYjMjUyOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZDIElTT2xhdDEgLS0+Ci08IUVOVElUWSB5YWN1dGUgIiYjMjUzOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHRob3JuICAiJiMyNTQ7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdGhvcm4gd2l0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHl1bWwgICAiJiMyNTU7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgeSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkYgSVNPbGF0MSAtLT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxMTUwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwzMjE2ICswLDAgQEAKLTwhLS0gWEhUTUwgTW9iaWxlIDEuMCBEVEQgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbW9iaWxlMTAuZHRkIC0tPgotPCEtLSAKLSAgICAgVGhpcyBpcyBYSFRNTCBNb2JpbGUgcHJvZmlsZSwgYSBwcm9wZXIgc3Vic2V0IG9mIFhIVE1MLgotICAgICAKLSAgICAgCUBXaXJlbGVzcyBBcHBsaWNhdGlvbiBQcm90b2NvbCBGb3J1bSwgTHRkLiAyMDAxLgotCi0JVGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlIGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgV2lyZWxlc3MgQXBwbGljYXRpb24gUHJvdG9jb2wgRm9ydW0gTHRkLiAKLQlXZWIgc2l0ZSAoaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvd2hhdC9jb3B5cmlnaHQuaHRtKS4KLSAgICAKLS0tPgotPCEtLSBUaGlzIGlzIHRoZSBkcml2ZXIgZmlsZSBmb3IgdmVyc2lvbiAxLjAgb2YgdGhlIFhIVE1MIE1vYmlsZSBEVEQuCi0KLSAgICAgVGhpcyBEVEQgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgUFVCTElDOiAiLS8vV0FQRk9SVU0vL0RURCBYSFRNTCBNb2JpbGUgMS4wLy9FTiIKLSAgICAgU1lTVEVNOiAiaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3hodG1sLW1vYmlsZTEwLmR0ZCIKLS0tPgotPCFFTlRJVFkgJSBYSFRNTC52ZXJzaW9uICAiLS8vV0FQRk9SVU0vL0RURCBYSFRNTCBNb2JpbGUgMS4wLy9FTiIgPgotCi08IS0tIFVzZSB0aGlzIFVSSSB0byBpZGVudGlmeSB0aGUgZGVmYXVsdCBuYW1lc3BhY2U6Ci0KLSAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCi0gICAgIFNlZSB0aGUgUXVhbGlmaWVkIE5hbWVzIG1vZHVsZSBmb3IgaW5mb3JtYXRpb24KLSAgICAgb24gdGhlIHVzZSBvZiBuYW1lc3BhY2UgcHJlZml4ZXMgaW4gdGhlIERURC4KLS0tPgotPCFFTlRJVFkgJSBOUy5wcmVmaXhlZCAiSUdOT1JFIiA+Ci08IUVOVElUWSAlIFhIVE1MLnByZWZpeCAgIiIgPgotCi08IS0tIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHVzaW5nIFhIVE1MIE1vYmlsZSAxLjAgZGlyZWN0bHksIHVzZQotICAgICB0aGUgRlBJIGluIHRoZSBET0NUWVBFIGRlY2xhcmF0aW9uLCB3aXRoIHRoZSB4bWxucyBhdHRyaWJ1dGUKLSAgICAgb24gdGhlIGRvY3VtZW50IGVsZW1lbnQgdG8gaWRlbnRpZnkgdGhlIGRlZmF1bHQgbmFtZXNwYWNlOgotCi0gICAgICAgICA8P3htbCB2ZXJzaW9uPSIxLjAiPz4KLSAgICAgICAgIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vV0FQRk9SVU0vL0RURCBYSFRNTCBNb2JpbGUgMS4wLy9FTiIKLSAgICAgICAgICAgICAiaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3hodG1sLW1vYmlsZTEwLmR0ZCIgPgotICAgICAgICAgPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICAgICAgICB4bWw6bGFuZz0iZW4iID4KLSAgICAgICAgIC4uLgotICAgICAgICAgPC9odG1sPgotLS0+Ci0KLTwhLS0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2Ugd2l0aCBkb2N1bWVudCBwcm9maWxlcyAtLT4KLTwhRU5USVRZICUgWEhUTUwucHJvZmlsZSAgIiIgPgotCi08IS0tIElubGluZSBTdHlsZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWlubHN0eWxlLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFN0eWxlIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWlubHN0eWxlLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIElubGluZSBTdHlsZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWlubHN0eWxlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIElubGluZSBTdHlsZSAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWlubHN0eWxlLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIElubGluZSBTdHlsZQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSAnc3R5bGUnIGF0dHJpYnV0ZSwgdXNlZCB0byBzdXBwb3J0IGlubGluZQotICAgICBzdHlsZSBtYXJrdXAuIFRoaXMgbW9kdWxlIG11c3QgYmUgaW5zdGFudGlhdGVkIHByaW9yIHRvIHRoZSBYSFRNTAotICAgICBDb21tb24gQXR0cmlidXRlcyBtb2R1bGUgaW4gb3JkZXIgdG8gYmUgaW5jbHVkZWQgaW4gJUNvcmUuYXR0cmliOy4KLS0tPgotCi08IUVOVElUWSAlIHN0eWxlLmF0dHJpYgotICAgICAic3R5bGUgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotCi08IUVOVElUWSAlIENvcmUuZXh0cmEuYXR0cmliCi0gICAgICIlc3R5bGUuYXR0cmliOyIKLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtaW5sc3R5bGUtMS5tb2QgLS0+Ci0KLQotPCEtLSBEb2N1bWVudCBNb2RlbCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1tb2RlbC5tb2QKLSAgICAgUFVCTElDICItLy9XQVBGT1JVTS8vRU5USVRJRVMgWEhUTUwgTW9iaWxlIDEuMCBEb2N1bWVudCBNb2RlbCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC94aHRtbC1tb2JpbGUxMC1tb2RlbC0xLm1vZCIgPgotCi08IS0tIFhIVE1MIEZyYW1ld29yayAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSBYSFRNTC5iaWRpICAiSUdOT1JFIiA+Ci08IUVOVElUWSAlIHhodG1sLWZyYW1ld29yay5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIE1vZHVsYXIgRnJhbWV3b3JrIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWZyYW1ld29yay0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBNb2R1bGFyIEZyYW1ld29yayBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1mcmFtZXdvcmstMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIE1vZHVsYXIgRnJhbWV3b3JrIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtZnJhbWV3b3JrLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIE1vZHVsYXIgRnJhbWV3b3JrCi0KLSAgICAgVGhpcyByZXF1aXJlZCBtb2R1bGUgaW5zdGFudGlhdGVzIHRoZSBtb2R1bGVzIG5lZWRlZAotICAgICB0byBzdXBwb3J0IHRoZSBYSFRNTCBtb2R1bGFyaXphdGlvbiBtb2RlbCwgaW5jbHVkaW5nOgotCi0gICAgICAgICsgIG5vdGF0aW9ucwotICAgICAgICArICBkYXRhdHlwZXMKLSAgICAgICAgKyAgbmFtZXNwYWNlLXF1YWxpZmllZCBuYW1lcwotICAgICAgICArICBjb21tb24gYXR0cmlidXRlcwotICAgICAgICArICBkb2N1bWVudCBtb2RlbAotICAgICAgICArICBjaGFyYWN0ZXIgZW50aXRpZXMKLQotICAgICBUaGUgSW50cmluc2ljIEV2ZW50cyBtb2R1bGUgaXMgaWdub3JlZCBieSBkZWZhdWx0IGJ1dAotICAgICBvY2N1cnMgaW4gdGhpcyBtb2R1bGUgYmVjYXVzZSBpdCBtdXN0IGJlIGluc3RhbnRpYXRlZAotICAgICBwcmlvciB0byBBdHRyaWJ1dGVzIGJ1dCBhZnRlciBEYXRhdHlwZXMuCi0tLT4KLQotPCFFTlRJVFkgJSB4aHRtbC1hcmNoLm1vZHVsZSAiSUdOT1JFIiA+Ci08IVsleGh0bWwtYXJjaC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1hcmNoLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzZSBBcmNoaXRlY3R1cmUgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1hcmNoLTEubW9kIiA+Ci0leGh0bWwtYXJjaC5tb2Q7XV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtbm90YXRpb25zLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLW5vdGF0aW9ucy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1ub3RhdGlvbnMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTlMgWEhUTUwgTm90YXRpb25zIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtbm90YXRpb25zLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIE5vdGF0aW9ucyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLW5vdGF0aW9ucy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJAotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTlMgWEhUTUwgTm90YXRpb25zIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbm90YXRpb25zLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIE5vdGF0aW9ucwotCi0gICAgIGRlZmluZXMgdGhlIGZvbGxvd2luZyBub3RhdGlvbnMsIG1hbnkgb2YgdGhlc2UgaW1wb3J0ZWQgZnJvbQotICAgICBvdGhlciBzcGVjaWZpY2F0aW9ucyBhbmQgc3RhbmRhcmRzLiBXaGVuIGFuIGV4aXN0aW5nIEZQSSBpcwotICAgICBrbm93biwgaXQgaXMgaW5jb3Jwb3JhdGVkIGhlcmUuCi0tLT4KLQotPCEtLSBYTUwgTm90YXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFNHTUwgYW5kIFhNTCBOb3RhdGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBXM0MgWE1MIDEuMCBSZWNvbW1lbmRhdGlvbiAtLT4KLTwhTk9UQVRJT04gdzNjLXhtbAotICAgICBQVUJMSUMgIklTTyA4ODc5Ly9OT1RBVElPTiBFeHRlbnNpYmxlIE1hcmt1cCBMYW5ndWFnZSAoWE1MKSAxLjAvL0VOIiA+Ci0KLTwhLS0gWE1MIDEuMCBDREFUQSAtLT4KLTwhTk9UQVRJT04gY2RhdGEKLSAgICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhNTCAxLjA6IENEQVRBLy9FTiIgPgotCi08IS0tIFNHTUwgRm9ybWFsIFB1YmxpYyBJZGVudGlmaWVycyAtLT4KLTwhTk9UQVRJT04gZnBpCi0gICAgIFBVQkxJQyAiSVNPIDg4Nzk6MTk4Ni8vTk9UQVRJT04gRm9ybWFsIFB1YmxpYyBJZGVudGlmaWVyLy9FTiIgPgotCi08IS0tIFhIVE1MIE5vdGF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBMZW5ndGggZGVmaW5lZCBmb3IgY2VsbHBhZGRpbmcvY2VsbHNwYWNpbmcgLS0+Ci0KLTwhLS0gbm4gZm9yIHBpeGVscyBvciBubiUgZm9yIHBlcmNlbnRhZ2UgbGVuZ3RoIC0tPgotPCFOT1RBVElPTiBsZW5ndGgKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IExlbmd0aC8vRU4iID4KLQotPCEtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsaW5rIHR5cGVzIC0tPgotPCFOT1RBVElPTiBsaW5rVHlwZXMKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IExpbmtUeXBlcy8vRU4iID4KLQotPCEtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMgLS0+Ci08IU5PVEFUSU9OIG1lZGlhRGVzYwotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTWVkaWFEZXNjLy9FTiIgPgotCi08IS0tIHBpeGVsLCBwZXJjZW50YWdlLCBvciByZWxhdGl2ZSAtLT4KLTwhTk9UQVRJT04gbXVsdGlMZW5ndGgKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IE11bHRpTGVuZ3RoLy9FTiIgPgotCi08IS0tIG9uZSBvciBtb3JlIGRpZ2l0cyAoTlVNQkVSKSAtLT4KLTwhTk9UQVRJT04gbnVtYmVyCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBOdW1iZXIvL0VOIiA+Ci0KLTwhLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KLTwhTk9UQVRJT04gcGl4ZWxzCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBQaXhlbHMvL0VOIiA+Ci0KLTwhLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci08IU5PVEFUSU9OIHNjcmlwdAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogU2NyaXB0Ly9FTiIgPgotCi08IS0tIHRleHR1YWwgY29udGVudCAtLT4KLTwhTk9UQVRJT04gdGV4dAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogVGV4dC8vRU4iID4KLQotPCEtLSBJbXBvcnRlZCBOb3RhdGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gW0lTTzEwNjQ2XSAtLT4KLTwhTk9UQVRJT04gY2hhcmFjdGVyCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDaGFyYWN0ZXIvL0VOIiA+Ci0KLTwhLS0gYSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IU5PVEFUSU9OIGNoYXJzZXQKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IENoYXJzZXQvL0VOIiA+Ci0KLTwhLS0gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFOT1RBVElPTiBjaGFyc2V0cwotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ2hhcnNldHMvL0VOIiA+Ci0KLTwhLS0gbWVkaWEgdHlwZSwgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhTk9UQVRJT04gY29udGVudFR5cGUKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IENvbnRlbnRUeXBlLy9FTiIgPgotCi08IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIHR5cGVzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFOT1RBVElPTiBjb250ZW50VHlwZXMKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IENvbnRlbnRUeXBlcy8vRU4iID4KLQotPCEtLSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uLiBJU08gZGF0ZSBmb3JtYXQgLS0+Ci08IU5PVEFUSU9OIGRhdGV0aW1lCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBEYXRldGltZS8vRU4iID4KLQotPCEtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMzA2Nl0gLS0+Ci08IU5PVEFUSU9OIGxhbmd1YWdlQ29kZQotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTGFuZ3VhZ2VDb2RlLy9FTiIgPgotCi08IS0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLCBzZWUgW1VSSV0gLS0+Ci08IU5PVEFUSU9OIHVyaQotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogVVJJLy9FTiIgPgotCi08IS0tIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycywgc2VlIFtVUkldIC0tPgotPCFOT1RBVElPTiB1cmlzCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBVUklzLy9FTiIgPgotCi08IS0tIGVuZCBvZiB4aHRtbC1ub3RhdGlvbnMtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1kYXRhdHlwZXMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtZGF0YXR5cGVzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWRhdGF0eXBlcy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIERhdGF0eXBlcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWRhdGF0eXBlcy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBEYXRhdHlwZXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1kYXRhdHlwZXMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIERhdGF0eXBlcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWRhdGF0eXBlcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBEYXRhdHlwZXMKLQotICAgICBkZWZpbmVzIGNvbnRhaW5lcnMgZm9yIHRoZSBmb2xsb3dpbmcgZGF0YXR5cGVzLCBtYW55IG9mCi0gICAgIHRoZXNlIGltcG9ydGVkIGZyb20gb3RoZXIgc3BlY2lmaWNhdGlvbnMgYW5kIHN0YW5kYXJkcy4KLS0tPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGZvciBjZWxscGFkZGluZy9jZWxsc3BhY2luZyAtLT4KLQotPCEtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IUVOVElUWSAlIExlbmd0aC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsaW5rIHR5cGVzIC0tPgotPCFFTlRJVFkgJSBMaW5rVHlwZXMuZGF0YXR5cGUgIk5NVE9LRU5TIiA+Ci0KLTwhLS0gc2luZ2xlIG9yIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIGRlc2NyaXB0b3JzIC0tPgotPCFFTlRJVFkgJSBNZWRpYURlc2MuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBvbmUgb3IgbW9yZSBkaWdpdHMgKE5VTUJFUikgLS0+Ci08IUVOVElUWSAlIE51bWJlci5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgotPCFFTlRJVFkgJSBQaXhlbHMuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci08IUVOVElUWSAlIFNjcmlwdC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSB0ZXh0dWFsIGNvbnRlbnQgLS0+Ci08IUVOVElUWSAlIFRleHQuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gSW1wb3J0ZWQgRGF0YXR5cGVzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gLS0+Ci08IUVOVElUWSAlIENoYXJhY3Rlci5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBhIGNoYXJhY3RlciBlbmNvZGluZywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhRU5USVRZICUgQ2hhcnNldC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNoYXJhY3RlciBlbmNvZGluZ3MsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IUVOVElUWSAlIENoYXJzZXRzLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIENvbG9yIHNwZWNpZmljYXRpb24gdXNpbmcgY29sb3IgbmFtZSBvciBzUkdCICgjUlJHR0JCKSB2YWx1ZXMgLS0+Ci08IUVOVElUWSAlIENvbG9yLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IUVOVElUWSAlIENvbnRlbnRUeXBlLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIHR5cGVzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFFTlRJVFkgJSBDb250ZW50VHlwZXMuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotPCFFTlRJVFkgJSBEYXRldGltZS5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBmb3JtYWwgcHVibGljIGlkZW50aWZpZXIsIGFzIHBlciBbSVNPODg3OV0gLS0+Ci08IUVOVElUWSAlIEZQSS5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMzA2Nl0gLS0+Ci08IUVOVElUWSAlIExhbmd1YWdlQ29kZS5kYXRhdHlwZSAiTk1UT0tFTiIgPgotCi08IS0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLCBzZWUgW1VSSV0gLS0+Ci08IUVOVElUWSAlIFVSSS5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMsIHNlZSBbVVJJXSAtLT4KLTwhRU5USVRZICUgVVJJcy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBlbmQgb2YgeGh0bWwtZGF0YXR5cGVzLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gcGxhY2Vob2xkZXIgZm9yIFhMaW5rIHN1cHBvcnQgbW9kdWxlIC0tPgotPCFFTlRJVFkgJSB4aHRtbC14bGluay5tb2QgIiIgPgotCi0KLTwhRU5USVRZICUgeGh0bWwtcW5hbWUubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtcW5hbWUubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtcW5hbWUubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBRdWFsaWZpZWQgTmFtZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1xbmFtZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgUW5hbWUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXFuYW1lLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBRdWFsaWZpZWQgTmFtZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1xbmFtZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0jMjAwMC0xMC0yMjogYWRkZWQgcW5hbWUgZGVjbGFyYXRpb25zIGZvciBydWJ5IGVsZW1lbnRzCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFhIVE1MIFFuYW1lIChRdWFsaWZpZWQgTmFtZSkgTW9kdWxlCi0KLSAgICAgVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHR3byBwYXJ0cywgbGFiZWxlZCBTZWN0aW9uICdBJyBhbmQgJ0InOgotCi0gICAgICAgU2VjdGlvbiBBIGRlY2xhcmVzIHBhcmFtZXRlciBlbnRpdGllcyB0byBzdXBwb3J0IG5hbWVzcGFjZS0KLSAgICAgICBxdWFsaWZpZWQgbmFtZXMsIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMsIGFuZCBuYW1lIHByZWZpeGluZwotICAgICAgIGZvciBYSFRNTCBhbmQgZXh0ZW5zaW9ucy4KLQotICAgICAgIFNlY3Rpb24gQiBkZWNsYXJlcyBwYXJhbWV0ZXIgZW50aXRpZXMgdXNlZCB0byBwcm92aWRlCi0gICAgICAgbmFtZXNwYWNlLXF1YWxpZmllZCBuYW1lcyBmb3IgYWxsIFhIVE1MIGVsZW1lbnQgdHlwZXM6Ci0KLSAgICAgICAgICVhcHBsZXQucW5hbWU7ICAgdGhlIHhtbG5zLXF1YWxpZmllZCBuYW1lIGZvciA8YXBwbGV0PgotICAgICAgICAgJWJhc2UucW5hbWU7ICAgICB0aGUgeG1sbnMtcXVhbGlmaWVkIG5hbWUgZm9yIDxiYXNlPgotICAgICAgICAgLi4uCi0KLSAgICAgWEhUTUwgZXh0ZW5zaW9ucyB3b3VsZCBjcmVhdGUgYSBtb2R1bGUgc2ltaWxhciB0byB0aGlzIG9uZS4KLSAgICAgSW5jbHVkZWQgaW4gdGhlIFhIVE1MIGRpc3RyaWJ1dGlvbiBpcyBhIHRlbXBsYXRlIG1vZHVsZQotICAgICAoJ3RlbXBsYXRlLXFuYW1lLTEubW9kJykgc3VpdGFibGUgZm9yIHRoaXMgcHVycG9zZS4KLS0tPgotCi08IS0tIFNlY3Rpb24gQTogWEhUTUwgWE1MIE5hbWVzcGFjZSBGcmFtZXdvcmsgOjo6Ojo6Ojo6Ojo6Ojo6Ojo6OjogLS0+Ci0KLTwhLS0gMS4gRGVjbGFyZSBhICVYSFRNTC5wcmVmaXhlZDsgY29uZGl0aW9uYWwgc2VjdGlvbiBrZXl3b3JkLCB1c2VkCi0gICAgICAgIHRvIGFjdGl2YXRlIG5hbWVzcGFjZSBwcmVmaXhpbmcuIFRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZAotICAgICAgICBpbmhlcml0ICclTlMucHJlZml4ZWQ7JyBmcm9tIHRoZSBEVEQgZHJpdmVyLCBzbyB0aGF0IHVubGVzcwotICAgICAgICBvdmVycmlkZGVuLCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgZm9sbG93cyB0aGUgb3ZlcmFsbCBEVEQKLSAgICAgICAgcHJlZml4aW5nIHNjaGVtZS4KLS0tPgotPCFFTlRJVFkgJSBOUy5wcmVmaXhlZCAiSUdOT1JFIiA+Ci08IUVOVElUWSAlIFhIVE1MLnByZWZpeGVkICIlTlMucHJlZml4ZWQ7IiA+Ci0KLTwhLS0gMi4gRGVjbGFyZSBhIHBhcmFtZXRlciBlbnRpdHkgKGVnLiwgJVhIVE1MLnhtbG5zOykgY29udGFpbmluZwotICAgICAgICB0aGUgVVJJIHJlZmVyZW5jZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBYSFRNTCBuYW1lc3BhY2U6Ci0tLT4KLTwhRU5USVRZICUgWEhUTUwueG1sbnMgICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiA+Ci0KLTwhLS0gMy4gRGVjbGFyZSBwYXJhbWV0ZXIgZW50aXRpZXMgKGVnLiwgJVhIVE1MLnByZWZpeDspIGNvbnRhaW5pbmcKLSAgICAgICAgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHByZWZpeCBzdHJpbmcocykgdG8gdXNlIHdoZW4gcHJlZml4aW5nCi0gICAgICAgIGlzIGVuYWJsZWQuIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gaW4gdGhlIERURCBkcml2ZXIgb3IgdGhlCi0gICAgICAgIGludGVybmFsIHN1YnNldCBvZiBhbiBkb2N1bWVudCBpbnN0YW5jZS4gSWYgbm8gZGVmYXVsdCBwcmVmaXgKLSAgICAgICAgaXMgZGVzaXJlZCwgdGhpcyBtYXkgYmUgZGVjbGFyZWQgYXMgYW4gZW1wdHkgc3RyaW5nLgotCi0gICAgIE5PVEU6IEFzIHNwZWNpZmllZCBpbiBbWE1MTkFNRVNdLCB0aGUgbmFtZXNwYWNlIHByZWZpeCBzZXJ2ZXMKLSAgICAgYXMgYSBwcm94eSBmb3IgdGhlIFVSSSByZWZlcmVuY2UsIGFuZCBpcyBub3QgaW4gaXRzZWxmIHNpZ25pZmljYW50LgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnByZWZpeCAgIiIgPgotCi08IS0tIDQuIERlY2xhcmUgcGFyYW1ldGVyIGVudGl0aWVzIChlZy4sICVYSFRNTC5wZng7KSBjb250YWluaW5nIHRoZQotICAgICAgICBjb2xvbml6ZWQgcHJlZml4KGVzKSAoZWcuLCAnJVhIVE1MLnByZWZpeDs6JykgdXNlZCB3aGVuCi0gICAgICAgIHByZWZpeGluZyBpcyBhY3RpdmUsIGFuIGVtcHR5IHN0cmluZyB3aGVuIGl0IGlzIG5vdC4KLS0tPgotPCFbJVhIVE1MLnByZWZpeGVkO1sKLTwhRU5USVRZICUgWEhUTUwucGZ4ICAiJVhIVE1MLnByZWZpeDs6IiA+Ci1dXT4KLTwhRU5USVRZICUgWEhUTUwucGZ4ICAiIiA+Ci0KLTwhLS0gZGVjbGFyZSBxdWFsaWZpZWQgbmFtZSBleHRlbnNpb25zIGhlcmUgLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1xbmFtZS1leHRyYS5tb2QgIiIgPgotCi0KLTwhLS0gNS4gVGhlIHBhcmFtZXRlciBlbnRpdHkgJVhIVE1MLnhtbG5zLmV4dHJhLmF0dHJpYjsgbWF5IGJlCi0gICAgICAgIHJlZGVjbGFyZWQgdG8gY29udGFpbiBhbnkgbm9uLVhIVE1MIG5hbWVzcGFjZSBkZWNsYXJhdGlvbgotICAgICAgICBhdHRyaWJ1dGVzIGZvciBuYW1lc3BhY2VzIGVtYmVkZGVkIGluIFhIVE1MLiBUaGUgZGVmYXVsdAotICAgICAgICBpcyBhbiBlbXB0eSBzdHJpbmcuICBYTGluayBzaG91bGQgYmUgaW5jbHVkZWQgaGVyZSBpZiB1c2VkCi0gICAgICAgIGluIHRoZSBEVEQuCi0tLT4KLTwhRU5USVRZICUgWEhUTUwueG1sbnMuZXh0cmEuYXR0cmliICIiID4KLQotPCEtLSBUaGUgcmVtYWluZGVyIG9mIFNlY3Rpb24gQSBpcyBvbmx5IGZvbGxvd2VkIGluIFhIVE1MLCBub3QgZXh0ZW5zaW9ucy4gLS0+Ci0KLTwhLS0gRGVjbGFyZSBhIHBhcmFtZXRlciBlbnRpdHkgJU5TLmRlY2wuYXR0cmliOyBjb250YWluaW5nCi0gICAgIGFsbCBYTUwgTmFtZXNwYWNlIGRlY2xhcmF0aW9ucyB1c2VkIGluIHRoZSBEVEQsIHBsdXMgdGhlCi0gICAgIHhtbG5zIGRlY2xhcmF0aW9uIGZvciBYSFRNTCwgaXRzIGZvcm0gZGVwZW5kZW50IG9uIHdoZXRoZXIKLSAgICAgcHJlZml4aW5nIGlzIGFjdGl2ZS4KLS0tPgotPCFbJVhIVE1MLnByZWZpeGVkO1sKLTwhRU5USVRZICUgTlMuZGVjbC5hdHRyaWIKLSAgICAgInhtbG5zOiVYSFRNTC5wcmVmaXg7ICAlVVJJLmRhdGF0eXBlOyAgICNGSVhFRCAnJVhIVE1MLnhtbG5zOycKLSAgICAgICVYSFRNTC54bWxucy5leHRyYS5hdHRyaWI7IgotPgotXV0+Ci08IUVOVElUWSAlIE5TLmRlY2wuYXR0cmliCi0gICAgICIlWEhUTUwueG1sbnMuZXh0cmEuYXR0cmliOyIKLT4KLQotPCEtLSBUaGlzIGlzIGEgcGxhY2Vob2xkZXIgZm9yIGZ1dHVyZSBYTGluayBzdXBwb3J0LgotLS0+Ci08IUVOVElUWSAlIFhMSU5LLnhtbG5zLmF0dHJpYiAiIiA+Ci0KLTwhLS0gRGVjbGFyZSBhIHBhcmFtZXRlciBlbnRpdHkgJU5TLmRlY2wuYXR0cmliOyBjb250YWluaW5nIGFsbAotICAgICBYTUwgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGF0dHJpYnV0ZXMgdXNlZCBieSBYSFRNTCwgaW5jbHVkaW5nCi0gICAgIGEgZGVmYXVsdCB4bWxucyBhdHRyaWJ1dGUgd2hlbiBwcmVmaXhpbmcgaXMgaW5hY3RpdmUuCi0tLT4KLTwhWyVYSFRNTC5wcmVmaXhlZDtbCi08IUVOVElUWSAlIFhIVE1MLnhtbG5zLmF0dHJpYgotICAgICAiJU5TLmRlY2wuYXR0cmliOwotICAgICAgJVhMSU5LLnhtbG5zLmF0dHJpYjsiCi0+Ci1dXT4KLTwhRU5USVRZICUgWEhUTUwueG1sbnMuYXR0cmliCi0gICAgICJ4bWxucyAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNGSVhFRCAnJVhIVE1MLnhtbG5zOycKLSAgICAgICVYTElOSy54bWxucy5hdHRyaWI7IgotPgotCi08IS0tIHBsYWNlaG9sZGVyIGZvciBxdWFsaWZpZWQgbmFtZSByZWRlY2xhcmF0aW9ucyAtLT4KLTwhRU5USVRZICUgeGh0bWwtcW5hbWUucmVkZWNsICIiID4KLQotCi08IS0tIFNlY3Rpb24gQjogWEhUTUwgUXVhbGlmaWVkIE5hbWVzIDo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6IC0tPgotCi08IS0tIDYuIFRoaXMgc2VjdGlvbiBkZWNsYXJlcyBwYXJhbWV0ZXIgZW50aXRpZXMgdXNlZCB0byBwcm92aWRlCi0gICAgICAgIG5hbWVzcGFjZS1xdWFsaWZpZWQgbmFtZXMgZm9yIGFsbCBYSFRNTCBlbGVtZW50IHR5cGVzLgotLS0+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYXBwbGV0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBhcHBsZXQucW5hbWUgICIlWEhUTUwucGZ4O2FwcGxldCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJhc2UtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGJhc2UucW5hbWUgICAgIiVYSFRNTC5wZng7YmFzZSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJkby0xLm1vZCAtLT4KLTwhRU5USVRZICUgYmRvLnFuYW1lICAgICAiJVhIVE1MLnBmeDtiZG8iID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1ibGtwaHJhcy0xLm1vZCAtLT4KLTwhRU5USVRZICUgYWRkcmVzcy5xbmFtZSAiJVhIVE1MLnBmeDthZGRyZXNzIiA+Ci08IUVOVElUWSAlIGJsb2NrcXVvdGUucW5hbWUgICIlWEhUTUwucGZ4O2Jsb2NrcXVvdGUiID4KLTwhRU5USVRZICUgcHJlLnFuYW1lICAgICAiJVhIVE1MLnBmeDtwcmUiID4KLTwhRU5USVRZICUgaDEucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoMSIgPgotPCFFTlRJVFkgJSBoMi5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2gyIiA+Ci08IUVOVElUWSAlIGgzLnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDMiID4KLTwhRU5USVRZICUgaDQucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoNCIgPgotPCFFTlRJVFkgJSBoNS5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2g1IiA+Ci08IUVOVElUWSAlIGg2LnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDYiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1ibGtwcmVzLTEubW9kIC0tPgotPCFFTlRJVFkgJSBoci5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2hyIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmxrc3RydWN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBkaXYucW5hbWUgICAgICIlWEhUTUwucGZ4O2RpdiIgPgotPCFFTlRJVFkgJSBwLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O3AiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1lZGl0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBpbnMucW5hbWUgICAgICIlWEhUTUwucGZ4O2lucyIgPgotPCFFTlRJVFkgJSBkZWwucW5hbWUgICAgICIlWEhUTUwucGZ4O2RlbCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWZvcm0tMS5tb2QgLS0+Ci08IUVOVElUWSAlIGZvcm0ucW5hbWUgICAgIiVYSFRNTC5wZng7Zm9ybSIgPgotPCFFTlRJVFkgJSBsYWJlbC5xbmFtZSAgICIlWEhUTUwucGZ4O2xhYmVsIiA+Ci08IUVOVElUWSAlIGlucHV0LnFuYW1lICAgIiVYSFRNTC5wZng7aW5wdXQiID4KLTwhRU5USVRZICUgc2VsZWN0LnFuYW1lICAiJVhIVE1MLnBmeDtzZWxlY3QiID4KLTwhRU5USVRZICUgb3B0Z3JvdXAucW5hbWUgICIlWEhUTUwucGZ4O29wdGdyb3VwIiA+Ci08IUVOVElUWSAlIG9wdGlvbi5xbmFtZSAgIiVYSFRNTC5wZng7b3B0aW9uIiA+Ci08IUVOVElUWSAlIHRleHRhcmVhLnFuYW1lICAiJVhIVE1MLnBmeDt0ZXh0YXJlYSIgPgotPCFFTlRJVFkgJSBmaWVsZHNldC5xbmFtZSAgIiVYSFRNTC5wZng7ZmllbGRzZXQiID4KLTwhRU5USVRZICUgbGVnZW5kLnFuYW1lICAiJVhIVE1MLnBmeDtsZWdlbmQiID4KLTwhRU5USVRZICUgYnV0dG9uLnFuYW1lICAiJVhIVE1MLnBmeDtidXR0b24iID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1oeXBlcnRleHQtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGEucW5hbWUgICAgICAgIiVYSFRNTC5wZng7YSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWltYWdlLTEubW9kIC0tPgotPCFFTlRJVFkgJSBpbWcucW5hbWUgICAgICIlWEhUTUwucGZ4O2ltZyIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWlubHBocmFzLTEubW9kIC0tPgotPCFFTlRJVFkgJSBhYmJyLnFuYW1lICAgICIlWEhUTUwucGZ4O2FiYnIiID4KLTwhRU5USVRZICUgYWNyb255bS5xbmFtZSAiJVhIVE1MLnBmeDthY3JvbnltIiA+Ci08IUVOVElUWSAlIGNpdGUucW5hbWUgICAgIiVYSFRNTC5wZng7Y2l0ZSIgPgotPCFFTlRJVFkgJSBjb2RlLnFuYW1lICAgICIlWEhUTUwucGZ4O2NvZGUiID4KLTwhRU5USVRZICUgZGZuLnFuYW1lICAgICAiJVhIVE1MLnBmeDtkZm4iID4KLTwhRU5USVRZICUgZW0ucW5hbWUgICAgICAiJVhIVE1MLnBmeDtlbSIgPgotPCFFTlRJVFkgJSBrYmQucW5hbWUgICAgICIlWEhUTUwucGZ4O2tiZCIgPgotPCFFTlRJVFkgJSBxLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O3EiID4KLTwhRU5USVRZICUgc2FtcC5xbmFtZSAgICAiJVhIVE1MLnBmeDtzYW1wIiA+Ci08IUVOVElUWSAlIHN0cm9uZy5xbmFtZSAgIiVYSFRNTC5wZng7c3Ryb25nIiA+Ci08IUVOVElUWSAlIHZhci5xbmFtZSAgICAgIiVYSFRNTC5wZng7dmFyIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW5scHJlcy0xLm1vZCAtLT4KLTwhRU5USVRZICUgYi5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDtiIiA+Ci08IUVOVElUWSAlIGJpZy5xbmFtZSAgICAgIiVYSFRNTC5wZng7YmlnIiA+Ci08IUVOVElUWSAlIGkucW5hbWUgICAgICAgIiVYSFRNTC5wZng7aSIgPgotPCFFTlRJVFkgJSBzbWFsbC5xbmFtZSAgICIlWEhUTUwucGZ4O3NtYWxsIiA+Ci08IUVOVElUWSAlIHN1Yi5xbmFtZSAgICAgIiVYSFRNTC5wZng7c3ViIiA+Ci08IUVOVElUWSAlIHN1cC5xbmFtZSAgICAgIiVYSFRNTC5wZng7c3VwIiA+Ci08IUVOVElUWSAlIHR0LnFuYW1lICAgICAgIiVYSFRNTC5wZng7dHQiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbmxzdHJ1Y3QtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGJyLnFuYW1lICAgICAgIiVYSFRNTC5wZng7YnIiID4KLTwhRU5USVRZICUgc3Bhbi5xbmFtZSAgICAiJVhIVE1MLnBmeDtzcGFuIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaXNtYXAtMS5tb2QgKGFsc28gY3Npc21hcCwgc3Npc21hcCkgLS0+Ci08IUVOVElUWSAlIG1hcC5xbmFtZSAgICAgIiVYSFRNTC5wZng7bWFwIiA+Ci08IUVOVElUWSAlIGFyZWEucW5hbWUgICAgIiVYSFRNTC5wZng7YXJlYSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWxpbmstMS5tb2QgLS0+Ci08IUVOVElUWSAlIGxpbmsucW5hbWUgICAgIiVYSFRNTC5wZng7bGluayIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWxpc3QtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGRsLnFuYW1lICAgICAgIiVYSFRNTC5wZng7ZGwiID4KLTwhRU5USVRZICUgZHQucW5hbWUgICAgICAiJVhIVE1MLnBmeDtkdCIgPgotPCFFTlRJVFkgJSBkZC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2RkIiA+Ci08IUVOVElUWSAlIG9sLnFuYW1lICAgICAgIiVYSFRNTC5wZng7b2wiID4KLTwhRU5USVRZICUgdWwucW5hbWUgICAgICAiJVhIVE1MLnBmeDt1bCIgPgotPCFFTlRJVFkgJSBsaS5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2xpIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtbWV0YS0xLm1vZCAtLT4KLTwhRU5USVRZICUgbWV0YS5xbmFtZSAgICAiJVhIVE1MLnBmeDttZXRhIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtcGFyYW0tMS5tb2QgLS0+Ci08IUVOVElUWSAlIHBhcmFtLnFuYW1lICAgIiVYSFRNTC5wZng7cGFyYW0iID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1vYmplY3QtMS5tb2QgLS0+Ci08IUVOVElUWSAlIG9iamVjdC5xbmFtZSAgIiVYSFRNTC5wZng7b2JqZWN0IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtc2NyaXB0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBzY3JpcHQucW5hbWUgICIlWEhUTUwucGZ4O3NjcmlwdCIgPgotPCFFTlRJVFkgJSBub3NjcmlwdC5xbmFtZSAgIiVYSFRNTC5wZng7bm9zY3JpcHQiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1zdHJ1Y3QtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGh0bWwucW5hbWUgICAgIiVYSFRNTC5wZng7aHRtbCIgPgotPCFFTlRJVFkgJSBoZWFkLnFuYW1lICAgICIlWEhUTUwucGZ4O2hlYWQiID4KLTwhRU5USVRZICUgdGl0bGUucW5hbWUgICAiJVhIVE1MLnBmeDt0aXRsZSIgPgotPCFFTlRJVFkgJSBib2R5LnFuYW1lICAgICIlWEhUTUwucGZ4O2JvZHkiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1zdHlsZS0xLm1vZCAtLT4KLTwhRU5USVRZICUgc3R5bGUucW5hbWUgICAiJVhIVE1MLnBmeDtzdHlsZSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXRhYmxlLTEubW9kIC0tPgotPCFFTlRJVFkgJSB0YWJsZS5xbmFtZSAgICIlWEhUTUwucGZ4O3RhYmxlIiA+Ci08IUVOVElUWSAlIGNhcHRpb24ucW5hbWUgIiVYSFRNTC5wZng7Y2FwdGlvbiIgPgotPCFFTlRJVFkgJSB0aGVhZC5xbmFtZSAgICIlWEhUTUwucGZ4O3RoZWFkIiA+Ci08IUVOVElUWSAlIHRmb290LnFuYW1lICAgIiVYSFRNTC5wZng7dGZvb3QiID4KLTwhRU5USVRZICUgdGJvZHkucW5hbWUgICAiJVhIVE1MLnBmeDt0Ym9keSIgPgotPCFFTlRJVFkgJSBjb2xncm91cC5xbmFtZSAgIiVYSFRNTC5wZng7Y29sZ3JvdXAiID4KLTwhRU5USVRZICUgY29sLnFuYW1lICAgICAiJVhIVE1MLnBmeDtjb2wiID4KLTwhRU5USVRZICUgdHIucW5hbWUgICAgICAiJVhIVE1MLnBmeDt0ciIgPgotPCFFTlRJVFkgJSB0aC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3RoIiA+Ci08IUVOVElUWSAlIHRkLnFuYW1lICAgICAgIiVYSFRNTC5wZng7dGQiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1ydWJ5LTEubW9kIC0tPgotCi08IUVOVElUWSAlIHJ1YnkucW5hbWUgICAgIiVYSFRNTC5wZng7cnVieSIgPgotPCFFTlRJVFkgJSByYmMucW5hbWUgICAgICIlWEhUTUwucGZ4O3JiYyIgPgotPCFFTlRJVFkgJSBydGMucW5hbWUgICAgICIlWEhUTUwucGZ4O3J0YyIgPgotPCFFTlRJVFkgJSByYi5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3JiIiA+Ci08IUVOVElUWSAlIHJ0LnFuYW1lICAgICAgIiVYSFRNTC5wZng7cnQiID4KLTwhRU5USVRZICUgcnAucW5hbWUgICAgICAiJVhIVE1MLnBmeDtycCIgPgotCi08IS0tIFByb3Zpc2lvbmFsIFhIVE1MIDIuMCBRdWFsaWZpZWQgTmFtZXMgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW1hZ2UtMi5tb2QgLS0+Ci08IUVOVElUWSAlIGFsdC5xbmFtZSAgICAgIiVYSFRNTC5wZng7YWx0IiA+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXFuYW1lLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtZXZlbnRzLm1vZHVsZSAiSUdOT1JFIiA+Ci08IVsleGh0bWwtZXZlbnRzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWV2ZW50cy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIEludHJpbnNpYyBFdmVudHMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1ldmVudHMtMS5tb2QiID4KLSV4aHRtbC1ldmVudHMubW9kO11dPgotCi08IUVOVElUWSAlIHhodG1sLWF0dHJpYnMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtYXR0cmlicy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1hdHRyaWJzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgQ29tbW9uIEF0dHJpYnV0ZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1hdHRyaWJzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIENvbW1vbiBBdHRyaWJ1dGVzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWF0dHJpYnMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIENvbW1vbiBBdHRyaWJ1dGVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYXR0cmlicy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBDb21tb24gQXR0cmlidXRlcwotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIG1hbnkgb2YgdGhlIGNvbW1vbiBhdHRyaWJ1dGVzIGZvciB0aGUgWEhUTUwgRFRELgotICAgICAlTlMuZGVjbC5hdHRyaWI7IGlzIGRlY2xhcmVkIGluIHRoZSBYSFRNTCBRbmFtZSBtb2R1bGUuCi0tLT4KLQotPCFFTlRJVFkgJSBpZC5hdHRyaWIKLSAgICAgImlkICAgICAgICAgICBJRCAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhRU5USVRZICUgY2xhc3MuYXR0cmliCi0gICAgICJjbGFzcyAgICAgICAgTk1UT0tFTlMgICAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IUVOVElUWSAlIHRpdGxlLmF0dHJpYgotICAgICAidGl0bGUgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCFFTlRJVFkgJSBDb3JlLmV4dHJhLmF0dHJpYiAiIiA+Ci0KLTwhRU5USVRZICUgQ29yZS5hdHRyaWIKLSAgICAgIiVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAlaWQuYXR0cmliOwotICAgICAgJWNsYXNzLmF0dHJpYjsKLSAgICAgICV0aXRsZS5hdHRyaWI7Ci0gICAgICAlQ29yZS5leHRyYS5hdHRyaWI7IgotPgotCi08IUVOVElUWSAlIGxhbmcuYXR0cmliCi0gICAgICJ4bWw6bGFuZyAgICAgJUxhbmd1YWdlQ29kZS5kYXRhdHlwZTsgICNJTVBMSUVEIgotPgotCi08IVslWEhUTUwuYmlkaTtbCi08IUVOVElUWSAlIGRpci5hdHRyaWIKLSAgICAgImRpciAgICAgICAgICAoIGx0ciB8IHJ0bCApICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhRU5USVRZICUgSTE4bi5hdHRyaWIKLSAgICAgIiVkaXIuYXR0cmliOwotICAgICAgJWxhbmcuYXR0cmliOyIKLT4KLQotXV0+Ci08IUVOVElUWSAlIEkxOG4uYXR0cmliCi0gICAgICIlbGFuZy5hdHRyaWI7IgotPgotCi08IUVOVElUWSAlIENvbW1vbi5leHRyYS5hdHRyaWIgIiIgPgotCi08IS0tIGludHJpbnNpYyBldmVudCBhdHRyaWJ1dGVzIGRlY2xhcmVkIHByZXZpb3VzbHkKLS0tPgotPCFFTlRJVFkgJSBFdmVudHMuYXR0cmliICIiID4KLQotPCFFTlRJVFkgJSBDb21tb24uYXR0cmliCi0gICAgICIlQ29yZS5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0gICAgICAlRXZlbnRzLmF0dHJpYjsKLSAgICAgICVDb21tb24uZXh0cmEuYXR0cmliOyIKLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYXR0cmlicy0xLm1vZCAtLT4KLV1dPgotCi08IS0tIHBsYWNlaG9sZGVyIGZvciBjb250ZW50IG1vZGVsIHJlZGVjbGFyYXRpb25zIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1tb2RlbC5yZWRlY2wgIiIgPgotCi0KLTwhRU5USVRZICUgeGh0bWwtbW9kZWwubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtbW9kZWwubW9kdWxlO1sKLTwhLS0gaW5zdGFudGlhdGUgdGhlIERvY3VtZW50IE1vZGVsIG1vZHVsZSBkZWNsYXJlZCBpbiB0aGUgRFREIGRyaXZlcgotLS0+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBNb2JpbGUgMS4wIERvY3VtZW50IE1vZGVsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1tb2JpbGUxMC1tb2RlbC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwgTW9iaWxlLCBhIHByb3BlciBzdWJzZXQgb2YgWEhUTUwuCi0gICAgIAlAV2lyZWxlc3MgQXBwbGljYXRpb24gUHJvdG9jb2wgRm9ydW0sIEx0ZC4gMjAwMS4KLQotCVRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIFdpcmVsZXNzIEFwcGxpY2F0aW9uIFByb3RvY29sIEZvcnVtIEx0ZC4gCi0JV2ViIHNpdGUgKGh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL3doYXQvY29weXJpZ2h0Lmh0bSkuCi0gICAgCi0tLT4KLTwhLS0gWEhUTUwgTW9iaWxlIERvY3VtZW50IE1vZGVsCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVzY3JpYmVzIHRoZSBncm91cGluZ3Mgb2YgZWxlbWVudHMgdGhhdCBtYWtlIHVwCi0gICAgIGNvbW1vbiBjb250ZW50IG1vZGVscyBmb3IgWEhUTUwgZWxlbWVudHMuCi0tLT4KLQotPCEtLSBPcHRpb25hbCBFbGVtZW50cyBpbiBoZWFkICAuLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBIZWFkT3B0cy5taXgKLSAgICAgIiggJW1ldGEucW5hbWU7IHwgJWxpbmsucW5hbWU7IHwgJW9iamVjdC5xbmFtZTsgfCAlc3R5bGUucW5hbWU7ICkqIiA+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgTWlzYy5jbGFzcyAiIiA+Ci0KLTwhLS0gSW5saW5lIEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgSW5sU3RydWN0LmNsYXNzICIlYnIucW5hbWU7IHwgJXNwYW4ucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgSW5sUGhyYXMuY2xhc3MKLSAgICAgInwgJWVtLnFuYW1lOyB8ICVzdHJvbmcucW5hbWU7IHwgJWRmbi5xbmFtZTsgfCAlY29kZS5xbmFtZTsKLSAgICAgIHwgJXNhbXAucW5hbWU7IHwgJWtiZC5xbmFtZTsgfCAldmFyLnFuYW1lOyB8ICVjaXRlLnFuYW1lOwotICAgICAgfCAlYWJici5xbmFtZTsgfCAlYWNyb255bS5xbmFtZTsgfCAlcS5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBJbmxQcmVzLmNsYXNzCi0gICAgICJ8ICVpLnFuYW1lOyB8ICViLnFuYW1lOyB8ICViaWcucW5hbWU7IHwgJXNtYWxsLnFuYW1lOyAiID4KLQotCi08IUVOVElUWSAlIEkxOG4uY2xhc3MgIiIgPgotCi08IUVOVElUWSAlIEFuY2hvci5jbGFzcyAifCAlYS5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBJbmxTcGVjaWFsLmNsYXNzICJ8ICVpbWcucW5hbWU7IHwgJW9iamVjdC5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBJbmxGb3JtLmNsYXNzCi0gICAgICJ8ICVpbnB1dC5xbmFtZTsgfCAlc2VsZWN0LnFuYW1lOyB8ICV0ZXh0YXJlYS5xbmFtZTsKLSAgICAgIHwgJWxhYmVsLnFuYW1lOyIKLT4KLQotPCFFTlRJVFkgJSBJbmxpbmUuZXh0cmEgIiIgPgotCi08IUVOVElUWSAlIElubGluZS5jbGFzcwotICAgICAiJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgICVBbmNob3IuY2xhc3M7Ci0gICAgICAlSW5sU3BlY2lhbC5jbGFzczsKLSAgICAgICVJbmxGb3JtLmNsYXNzOwotICAgICAgJUlubGluZS5leHRyYTsiCi0+Ci0KLTwhRU5USVRZICUgSW5sTm9BbmNob3IuY2xhc3MKLSAgICAgIiVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICAlSW5sU3BlY2lhbC5jbGFzczsKLSAgICAgICVJbmxGb3JtLmNsYXNzOwotICAgICAgJUlubGluZS5leHRyYTsiCi0+Ci0KLTwhRU5USVRZICUgSW5sTm9BbmNob3IubWl4Ci0gICAgICIlSW5sTm9BbmNob3IuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhRU5USVRZICUgSW5saW5lLm1peAotICAgICAiJUlubGluZS5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCEtLSBCbG9jayBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBIZWFkaW5nLmNsYXNzCi0gICAgICIlaDEucW5hbWU7IHwgJWgyLnFuYW1lOyB8ICVoMy5xbmFtZTsKLSAgICAgIHwgJWg0LnFuYW1lOyB8ICVoNS5xbmFtZTsgfCAlaDYucW5hbWU7IgotPgotPCFFTlRJVFkgJSBMaXN0LmNsYXNzICAiJXVsLnFuYW1lOyB8ICVvbC5xbmFtZTsgfCAlZGwucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgVGFibGUuY2xhc3MgInwgJXRhYmxlLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEZvcm0uY2xhc3MgICJ8ICVmb3JtLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEZpZWxkc2V0LmNsYXNzICAifCAlZmllbGRzZXQucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgQmxrU3RydWN0LmNsYXNzICIlcC5xbmFtZTsgfCAlZGl2LnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEJsa1BocmFzLmNsYXNzCi0gICAgICJ8ICVwcmUucW5hbWU7IHwgJWJsb2NrcXVvdGUucW5hbWU7IHwgJWFkZHJlc3MucW5hbWU7IgotPgotCi08IUVOVElUWSAlIEJsa1ByZXMuY2xhc3MgInwgJWhyLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEJsa1NwZWNpYWwuY2xhc3MKLSAgICAgIiVUYWJsZS5jbGFzczsKLSAgICAgICVGb3JtLmNsYXNzOwotICAgICAgJUZpZWxkc2V0LmNsYXNzOyIKLT4KLQotPCFFTlRJVFkgJSBCbG9jay5leHRyYSAiIiA+Ci0KLTwhRU5USVRZICUgQmxvY2suY2xhc3MKLSAgICAgIiVCbGtTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlQmxrUGhyYXMuY2xhc3M7Ci0gICAgICAlQmxrUHJlcy5jbGFzczsKLSAgICAgICVCbGtTcGVjaWFsLmNsYXNzOwotICAgICAgJUJsb2NrLmV4dHJhOyIKLT4KLQotPCFFTlRJVFkgJSBCbGtOb0Zvcm0ubWl4Ci0gICAgICIlSGVhZGluZy5jbGFzczsKLSAgICAgIHwgJUxpc3QuY2xhc3M7Ci0gICAgICB8ICVCbGtTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlQmxrUGhyYXMuY2xhc3M7Ci0gICAgICAlQmxrUHJlcy5jbGFzczsKLSAgICAgICVUYWJsZS5jbGFzczsKLSAgICAgICVCbG9jay5leHRyYTsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCFFTlRJVFkgJSBCbG9jay5taXgKLSAgICAgIiVIZWFkaW5nLmNsYXNzOwotICAgICAgfCAlTGlzdC5jbGFzczsKLSAgICAgIHwgJUJsb2NrLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IS0tIEFsbCBDb250ZW50IEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIGRlY2xhcmVzIGFsbCBjb250ZW50IGV4Y2VwdCB0YWJsZXMKLS0tPgotPCFFTlRJVFkgJSBGbG93Tm9UYWJsZS5taXgKLSAgICAgIiVIZWFkaW5nLmNsYXNzOwotICAgICAgfCAlTGlzdC5jbGFzczsKLSAgICAgIHwgJUJsa1N0cnVjdC5jbGFzczsKLSAgICAgICVCbGtQaHJhcy5jbGFzczsKLSAgICAgICVGb3JtLmNsYXNzOwotICAgICAgJUJsb2NrLmV4dHJhOwotICAgICAgfCAlSW5saW5lLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi0KLTwhRU5USVRZICUgRmxvdy5taXgKLSAgICAgIiVIZWFkaW5nLmNsYXNzOwotICAgICAgfCAlTGlzdC5jbGFzczsKLSAgICAgIHwgJUJsb2NrLmNsYXNzOwotICAgICAgfCAlSW5saW5lLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IS0tIGVuZCBvZiB4aHRtbC1tb2JpbGUxMC1tb2RlbC0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWNoYXJlbnQubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtY2hhcmVudC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1jaGFyZW50Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgQ2hhcmFjdGVyIEVudGl0aWVzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtY2hhcmVudC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBDaGFyYWN0ZXIgRW50aXRpZXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtY2hhcmVudC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgQ2hhcmFjdGVyIEVudGl0aWVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtY2hhcmVudC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBDaGFyYWN0ZXIgRW50aXRpZXMgZm9yIFhIVE1MCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIHNldCBvZiBjaGFyYWN0ZXIgZW50aXRpZXMgZm9yIFhIVE1MLAotICAgICBpbmNsdWRpbmcgdGhlIExhdGluIDEsIFN5bWJvbCBhbmQgU3BlY2lhbCBjaGFyYWN0ZXIgY29sbGVjdGlvbnMuCi0tLT4KLQotPCFFTlRJVFkgJSB4aHRtbC1sYXQxCi0gICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIExhdGluIDEgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgICAgInhodG1sLWxhdDEuZW50IiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhNTC1jb21wYXRpYmxlIElTTyBMYXRpbiAxIENoYXJhY3RlciBFbnRpdHkgU2V0IGZvciBYSFRNTCAuLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWxhdDEuZW50Ci0KLSAgICAgVHlwaWNhbCBpbnZvY2F0aW9uOgotCi0gICAgICAgPCFFTlRJVFkgJSB4aHRtbC1sYXQxCi0gICAgICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbiAxIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICAgICAgICAgICAieGh0bWwtbGF0MS5lbnQiID4KLSAgICAgICAleGh0bWwtbGF0MTsKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4gMSBmb3IgWEhUTUwvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWxhdDEuZW50IgotCi0gICAgIFJldmlzaW9uOiAgJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aCBjb25mb3JtaW5nCi0gICAgIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4gSVNPIDg4NzksIHByb3ZpZGVkCi0gICAgIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLQotPCFFTlRJVFkgbmJzcCAgICImIzE2MDsiID48IS0tIG5vLWJyZWFrIHNwYWNlID0gbm9uLWJyZWFraW5nIHNwYWNlLCBVKzAwQTAgSVNPbnVtIC0tPgotPCFFTlRJVFkgaWV4Y2wgICImIzE2MTsiID48IS0tIGludmVydGVkIGV4Y2xhbWF0aW9uIG1hcmssIFUrMDBBMSBJU09udW0gLS0+Ci08IUVOVElUWSBjZW50ICAgIiYjMTYyOyIgPjwhLS0gY2VudCBzaWduLCBVKzAwQTIgSVNPbnVtIC0tPgotPCFFTlRJVFkgcG91bmQgICImIzE2MzsiID48IS0tIHBvdW5kIHNpZ24sIFUrMDBBMyBJU09udW0gLS0+Ci08IUVOVElUWSBjdXJyZW4gIiYjMTY0OyIgPjwhLS0gY3VycmVuY3kgc2lnbiwgVSswMEE0IElTT251bSAtLT4KLTwhRU5USVRZIHllbiAgICAiJiMxNjU7IiA+PCEtLSB5ZW4gc2lnbiA9IHl1YW4gc2lnbiwgVSswMEE1IElTT251bSAtLT4KLTwhRU5USVRZIGJydmJhciAiJiMxNjY7IiA+PCEtLSBicm9rZW4gYmFyID0gYnJva2VuIHZlcnRpY2FsIGJhciwgVSswMEE2IElTT251bSAtLT4KLTwhRU5USVRZIHNlY3QgICAiJiMxNjc7IiA+PCEtLSBzZWN0aW9uIHNpZ24sIFUrMDBBNyBJU09udW0gLS0+Ci08IUVOVElUWSB1bWwgICAgIiYjMTY4OyIgPjwhLS0gZGlhZXJlc2lzID0gc3BhY2luZyBkaWFlcmVzaXMsIFUrMDBBOCBJU09kaWEgLS0+Ci08IUVOVElUWSBjb3B5ICAgIiYjMTY5OyIgPjwhLS0gY29weXJpZ2h0IHNpZ24sIFUrMDBBOSBJU09udW0gLS0+Ci08IUVOVElUWSBvcmRmICAgIiYjMTcwOyIgPjwhLS0gZmVtaW5pbmUgb3JkaW5hbCBpbmRpY2F0b3IsIFUrMDBBQSBJU09udW0gLS0+Ci08IUVOVElUWSBsYXF1byAgIiYjMTcxOyIgPjwhLS0gbGVmdC1wb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsgPSBsZWZ0IHBvaW50aW5nIGd1aWxsZW1ldCwgVSswMEFCIElTT251bSAtLT4KLTwhRU5USVRZIG5vdCAgICAiJiMxNzI7IiA+PCEtLSBub3Qgc2lnbiwgVSswMEFDIElTT251bSAtLT4KLTwhRU5USVRZIHNoeSAgICAiJiMxNzM7IiA+PCEtLSBzb2Z0IGh5cGhlbiA9IGRpc2NyZXRpb25hcnkgaHlwaGVuLCBVKzAwQUQgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmVnICAgICImIzE3NDsiID48IS0tIHJlZ2lzdGVyZWQgc2lnbiA9IHJlZ2lzdGVyZWQgdHJhZGUgbWFyayBzaWduLCBVKzAwQUUgSVNPbnVtIC0tPgotPCFFTlRJVFkgbWFjciAgICImIzE3NTsiID48IS0tIG1hY3JvbiA9IHNwYWNpbmcgbWFjcm9uID0gb3ZlcmxpbmUgPSBBUEwgb3ZlcmJhciwgVSswMEFGIElTT2RpYSAtLT4KLTwhRU5USVRZIGRlZyAgICAiJiMxNzY7IiA+PCEtLSBkZWdyZWUgc2lnbiwgVSswMEIwIElTT251bSAtLT4KLTwhRU5USVRZIHBsdXNtbiAiJiMxNzc7IiA+PCEtLSBwbHVzLW1pbnVzIHNpZ24gPSBwbHVzLW9yLW1pbnVzIHNpZ24sIFUrMDBCMSBJU09udW0gLS0+Ci08IUVOVElUWSBzdXAyICAgIiYjMTc4OyIgPjwhLS0gc3VwZXJzY3JpcHQgdHdvID0gc3VwZXJzY3JpcHQgZGlnaXQgdHdvID0gc3F1YXJlZCwgVSswMEIyIElTT251bSAtLT4KLTwhRU5USVRZIHN1cDMgICAiJiMxNzk7IiA+PCEtLSBzdXBlcnNjcmlwdCB0aHJlZSA9IHN1cGVyc2NyaXB0IGRpZ2l0IHRocmVlID0gY3ViZWQsIFUrMDBCMyBJU09udW0gLS0+Ci08IUVOVElUWSBhY3V0ZSAgIiYjMTgwOyIgPjwhLS0gYWN1dGUgYWNjZW50ID0gc3BhY2luZyBhY3V0ZSwgVSswMEI0IElTT2RpYSAtLT4KLTwhRU5USVRZIG1pY3JvICAiJiMxODE7IiA+PCEtLSBtaWNybyBzaWduLCBVKzAwQjUgSVNPbnVtIC0tPgotPCFFTlRJVFkgcGFyYSAgICImIzE4MjsiID48IS0tIHBpbGNyb3cgc2lnbiA9IHBhcmFncmFwaCBzaWduLCBVKzAwQjYgSVNPbnVtIC0tPgotPCFFTlRJVFkgbWlkZG90ICImIzE4MzsiID48IS0tIG1pZGRsZSBkb3QgPSBHZW9yZ2lhbiBjb21tYSA9IEdyZWVrIG1pZGRsZSBkb3QsIFUrMDBCNyBJU09udW0gLS0+Ci08IUVOVElUWSBjZWRpbCAgIiYjMTg0OyIgPjwhLS0gY2VkaWxsYSA9IHNwYWNpbmcgY2VkaWxsYSwgVSswMEI4IElTT2RpYSAtLT4KLTwhRU5USVRZIHN1cDEgICAiJiMxODU7IiA+PCEtLSBzdXBlcnNjcmlwdCBvbmUgPSBzdXBlcnNjcmlwdCBkaWdpdCBvbmUsIFUrMDBCOSBJU09udW0gLS0+Ci08IUVOVElUWSBvcmRtICAgIiYjMTg2OyIgPjwhLS0gbWFzY3VsaW5lIG9yZGluYWwgaW5kaWNhdG9yLCBVKzAwQkEgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmFxdW8gICImIzE4NzsiID48IS0tIHJpZ2h0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFyayA9IHJpZ2h0IHBvaW50aW5nIGd1aWxsZW1ldCwgVSswMEJCIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMxNCAiJiMxODg7IiA+PCEtLSB2dWxnYXIgZnJhY3Rpb24gb25lIHF1YXJ0ZXIgPSBmcmFjdGlvbiBvbmUgcXVhcnRlciwgVSswMEJDIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMxMiAiJiMxODk7IiA+PCEtLSB2dWxnYXIgZnJhY3Rpb24gb25lIGhhbGYgPSBmcmFjdGlvbiBvbmUgaGFsZiwgVSswMEJEIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMzNCAiJiMxOTA7IiA+PCEtLSB2dWxnYXIgZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMgPSBmcmFjdGlvbiB0aHJlZSBxdWFydGVycywgVSswMEJFIElTT251bSAtLT4KLTwhRU5USVRZIGlxdWVzdCAiJiMxOTE7IiA+PCEtLSBpbnZlcnRlZCBxdWVzdGlvbiBtYXJrID0gdHVybmVkIHF1ZXN0aW9uIG1hcmssIFUrMDBCRiBJU09udW0gLS0+Ci08IUVOVElUWSBBZ3JhdmUgIiYjMTkyOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBBIHdpdGggZ3JhdmUgPSBsYXRpbiBjYXBpdGFsIEEgZ3JhdmUsIFUrMDBDMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgQWFjdXRlICImIzE5MzsiID48IS0tIGxhdGluIGNhcGl0YWwgQSB3aXRoIGFjdXRlLCBVKzAwQzEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFjaXJjICAiJiMxOTQ7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEEgd2l0aCBjaXJjdW1mbGV4LCBVKzAwQzIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEF0aWxkZSAiJiMxOTU7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEEgd2l0aCB0aWxkZSwgVSswMEMzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBdW1sICAgIiYjMTk2OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBBIHdpdGggZGlhZXJlc2lzLCBVKzAwQzQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFyaW5nICAiJiMxOTc7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEEgd2l0aCByaW5nIGFib3ZlID0gbGF0aW4gY2FwaXRhbCBBIHJpbmcsIFUrMDBDNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgQUVsaWcgICImIzE5ODsiID48IS0tIGxhdGluIGNhcGl0YWwgQUUgPSBsYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIEFFLCBVKzAwQzYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIENjZWRpbCAiJiMxOTk7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEMgd2l0aCBjZWRpbGxhLCBVKzAwQzcgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVncmF2ZSAiJiMyMDA7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEUgd2l0aCBncmF2ZSwgVSswMEM4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFYWN1dGUgIiYjMjAxOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBFIHdpdGggYWN1dGUsIFUrMDBDOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWNpcmMgICImIzIwMjsiID48IS0tIGxhdGluIGNhcGl0YWwgRSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBDQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgRXVtbCAgICImIzIwMzsiID48IS0tIGxhdGluIGNhcGl0YWwgRSB3aXRoIGRpYWVyZXNpcywgVSswMENCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJZ3JhdmUgIiYjMjA0OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBJIHdpdGggZ3JhdmUsIFUrMDBDQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWFjdXRlICImIzIwNTsiID48IS0tIGxhdGluIGNhcGl0YWwgSSB3aXRoIGFjdXRlLCBVKzAwQ0QgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEljaXJjICAiJiMyMDY7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEkgd2l0aCBjaXJjdW1mbGV4LCBVKzAwQ0UgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEl1bWwgICAiJiMyMDc7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEkgd2l0aCBkaWFlcmVzaXMsIFUrMDBDRiBJU09sYXQxIC0tPgotPCFFTlRJVFkgRVRIICAgICImIzIwODsiID48IS0tIGxhdGluIGNhcGl0YWwgRVRILCBVKzAwRDAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE50aWxkZSAiJiMyMDk7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIE4gd2l0aCB0aWxkZSwgVSswMEQxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPZ3JhdmUgIiYjMjEwOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBPIHdpdGggZ3JhdmUsIFUrMDBEMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2FjdXRlICImIzIxMTsiID48IS0tIGxhdGluIGNhcGl0YWwgTyB3aXRoIGFjdXRlLCBVKzAwRDMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9jaXJjICAiJiMyMTI7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIE8gd2l0aCBjaXJjdW1mbGV4LCBVKzAwRDQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE90aWxkZSAiJiMyMTM7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIE8gd2l0aCB0aWxkZSwgVSswMEQ1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBPdW1sICAgIiYjMjE0OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBPIHdpdGggZGlhZXJlc2lzLCBVKzAwRDYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHRpbWVzICAiJiMyMTU7IiA+PCEtLSBtdWx0aXBsaWNhdGlvbiBzaWduLCBVKzAwRDcgSVNPbnVtIC0tPgotPCFFTlRJVFkgT3NsYXNoICImIzIxNjsiID48IS0tIGxhdGluIGNhcGl0YWwgTyB3aXRoIHN0cm9rZSA9IGxhdGluIGNhcGl0YWwgTyBzbGFzaCwgVSswMEQ4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBVZ3JhdmUgIiYjMjE3OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBVIHdpdGggZ3JhdmUsIFUrMDBEOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWFjdXRlICImIzIxODsiID48IS0tIGxhdGluIGNhcGl0YWwgVSB3aXRoIGFjdXRlLCBVKzAwREEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVjaXJjICAiJiMyMTk7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIFUgd2l0aCBjaXJjdW1mbGV4LCBVKzAwREIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFV1bWwgICAiJiMyMjA7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIFUgd2l0aCBkaWFlcmVzaXMsIFUrMDBEQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgWWFjdXRlICImIzIyMTsiID48IS0tIGxhdGluIGNhcGl0YWwgWSB3aXRoIGFjdXRlLCBVKzAwREQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFRIT1JOICAiJiMyMjI7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIFRIT1JOLCBVKzAwREUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHN6bGlnICAiJiMyMjM7IiA+PCEtLSBsYXRpbiBzbWFsbCBzaGFycCBzID0gZXNzLXplZCwgVSswMERGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhZ3JhdmUgIiYjMjI0OyIgPjwhLS0gbGF0aW4gc21hbGwgYSB3aXRoIGdyYXZlID0gbGF0aW4gc21hbGwgYSBncmF2ZSwgVSswMEUwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhYWN1dGUgIiYjMjI1OyIgPjwhLS0gbGF0aW4gc21hbGwgYSB3aXRoIGFjdXRlLCBVKzAwRTEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFjaXJjICAiJiMyMjY7IiA+PCEtLSBsYXRpbiBzbWFsbCBhIHdpdGggY2lyY3VtZmxleCwgVSswMEUyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhdGlsZGUgIiYjMjI3OyIgPjwhLS0gbGF0aW4gc21hbGwgYSB3aXRoIHRpbGRlLCBVKzAwRTMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGF1bWwgICAiJiMyMjg7IiA+PCEtLSBsYXRpbiBzbWFsbCBhIHdpdGggZGlhZXJlc2lzLCBVKzAwRTQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFyaW5nICAiJiMyMjk7IiA+PCEtLSBsYXRpbiBzbWFsbCBhIHdpdGggcmluZyBhYm92ZSA9IGxhdGluIHNtYWxsIGEgcmluZywgVSswMEU1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBhZWxpZyAgIiYjMjMwOyIgPjwhLS0gbGF0aW4gc21hbGwgYWUgPSBsYXRpbiBzbWFsbCBsaWdhdHVyZSBhZSwgVSswMEU2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBjY2VkaWwgIiYjMjMxOyIgPjwhLS0gbGF0aW4gc21hbGwgYyB3aXRoIGNlZGlsbGEsIFUrMDBFNyBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWdyYXZlICImIzIzMjsiID48IS0tIGxhdGluIHNtYWxsIGUgd2l0aCBncmF2ZSwgVSswMEU4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlYWN1dGUgIiYjMjMzOyIgPjwhLS0gbGF0aW4gc21hbGwgZSB3aXRoIGFjdXRlLCBVKzAwRTkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVjaXJjICAiJiMyMzQ7IiA+PCEtLSBsYXRpbiBzbWFsbCBlIHdpdGggY2lyY3VtZmxleCwgVSswMEVBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBldW1sICAgIiYjMjM1OyIgPjwhLS0gbGF0aW4gc21hbGwgZSB3aXRoIGRpYWVyZXNpcywgVSswMEVCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpZ3JhdmUgIiYjMjM2OyIgPjwhLS0gbGF0aW4gc21hbGwgaSB3aXRoIGdyYXZlLCBVKzAwRUMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGlhY3V0ZSAiJiMyMzc7IiA+PCEtLSBsYXRpbiBzbWFsbCBpIHdpdGggYWN1dGUsIFUrMDBFRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWNpcmMgICImIzIzODsiID48IS0tIGxhdGluIHNtYWxsIGkgd2l0aCBjaXJjdW1mbGV4LCBVKzAwRUUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGl1bWwgICAiJiMyMzk7IiA+PCEtLSBsYXRpbiBzbWFsbCBpIHdpdGggZGlhZXJlc2lzLCBVKzAwRUYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGV0aCAgICAiJiMyNDA7IiA+PCEtLSBsYXRpbiBzbWFsbCBldGgsIFUrMDBGMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgbnRpbGRlICImIzI0MTsiID48IS0tIGxhdGluIHNtYWxsIG4gd2l0aCB0aWxkZSwgVSswMEYxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvZ3JhdmUgIiYjMjQyOyIgPjwhLS0gbGF0aW4gc21hbGwgbyB3aXRoIGdyYXZlLCBVKzAwRjIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9hY3V0ZSAiJiMyNDM7IiA+PCEtLSBsYXRpbiBzbWFsbCBvIHdpdGggYWN1dGUsIFUrMDBGMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2NpcmMgICImIzI0NDsiID48IS0tIGxhdGluIHNtYWxsIG8gd2l0aCBjaXJjdW1mbGV4LCBVKzAwRjQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG90aWxkZSAiJiMyNDU7IiA+PCEtLSBsYXRpbiBzbWFsbCBvIHdpdGggdGlsZGUsIFUrMDBGNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgb3VtbCAgICImIzI0NjsiID48IS0tIGxhdGluIHNtYWxsIG8gd2l0aCBkaWFlcmVzaXMsIFUrMDBGNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgZGl2aWRlICImIzI0NzsiID48IS0tIGRpdmlzaW9uIHNpZ24sIFUrMDBGNyBJU09udW0gLS0+Ci08IUVOVElUWSBvc2xhc2ggIiYjMjQ4OyIgPjwhLS0gbGF0aW4gc21hbGwgbyB3aXRoIHN0cm9rZSwgPSBsYXRpbiBzbWFsbCBvIHNsYXNoLCBVKzAwRjggSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVncmF2ZSAiJiMyNDk7IiA+PCEtLSBsYXRpbiBzbWFsbCB1IHdpdGggZ3JhdmUsIFUrMDBGOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWFjdXRlICImIzI1MDsiID48IS0tIGxhdGluIHNtYWxsIHUgd2l0aCBhY3V0ZSwgVSswMEZBIElTT2xhdDEgLS0+Ci08IUVOVElUWSB1Y2lyYyAgIiYjMjUxOyIgPjwhLS0gbGF0aW4gc21hbGwgdSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBGQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgdXVtbCAgICImIzI1MjsiID48IS0tIGxhdGluIHNtYWxsIHUgd2l0aCBkaWFlcmVzaXMsIFUrMDBGQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgeWFjdXRlICImIzI1MzsiID48IS0tIGxhdGluIHNtYWxsIHkgd2l0aCBhY3V0ZSwgVSswMEZEIElTT2xhdDEgLS0+Ci08IUVOVElUWSB0aG9ybiAgIiYjMjU0OyIgPjwhLS0gbGF0aW4gc21hbGwgdGhvcm4gd2l0aCwgVSswMEZFIElTT2xhdDEgLS0+Ci08IUVOVElUWSB5dW1sICAgIiYjMjU1OyIgPjwhLS0gbGF0aW4gc21hbGwgeSB3aXRoIGRpYWVyZXNpcywgVSswMEZGIElTT2xhdDEgLS0+Ci08IS0tIGVuZCBvZiB4aHRtbC1sYXQxLmVudCAtLT4KLQotCi08IUVOVElUWSAlIHhodG1sLXN5bWJvbAotICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICAgICJ4aHRtbC1zeW1ib2wuZW50IiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIElTTyBNYXRoLCBHcmVlayBhbmQgU3ltYm9saWMgQ2hhcmFjdGVyIEVudGl0eSBTZXQgZm9yIFhIVE1MIC4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXN5bWJvbC5lbnQKLQotICAgICBUeXBpY2FsIGludm9jYXRpb246Ci0KLSAgICAgICA8IUVOVElUWSAlIHhodG1sLXN5bWJvbAotICAgICAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scyBmb3IgWEhUTUwvL0VOIgotICAgICAgICAgICAgICAgICAgInhodG1sLXN5bWJvbC5lbnQiID4KLSAgICAgICAleGh0bWwtc3ltYm9sOwotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzIGZvciBYSFRNTC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc3ltYm9sLmVudCIKLQotICAgICBSZXZpc2lvbjogICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBQb3J0aW9ucyAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2OgotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGggY29uZm9ybWluZwotICAgICBTR01MIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluIElTTyA4ODc5LCBwcm92aWRlZAotICAgICB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzLgotLS0+Ci0KLTwhLS0gUmVsZXZhbnQgSVNPIGVudGl0eSBzZXQgaXMgZ2l2ZW4gdW5sZXNzIG5hbWVzIGFyZSBuZXdseSBpbnRyb2R1Y2VkLgotICAgICBOZXcgbmFtZXMgKGkuZS4sIG5vdCBpbiBJU08gODg3OSBbU0dNTF0gbGlzdCkgZG8gbm90IGNsYXNoIHdpdGgKLSAgICAgYW55IGV4aXN0aW5nIElTTyA4ODc5IGVudGl0eSBuYW1lcy4gSVNPIDEwNjQ2IFtJU08xMDY0Nl0gY2hhcmFjdGVyCi0gICAgIG51bWJlcnMgYXJlIGdpdmVuIGZvciBlYWNoIGNoYXJhY3RlciwgaW4gaGV4LiBFbnRpdHkgdmFsdWVzIGFyZQotICAgICBkZWNpbWFsIGNvbnZlcnNpb25zIG9mIHRoZSBJU08gMTA2NDYgdmFsdWVzIGFuZCByZWZlciB0byB0aGUKLSAgICAgZG9jdW1lbnQgY2hhcmFjdGVyIHNldC4gTmFtZXMgYXJlIFVuaWNvZGUgW1VOSUNPREVdIG5hbWVzLgotLS0+Ci0KLTwhLS0gTGF0aW4gRXh0ZW5kZWQtQiAtLT4KLTwhRU5USVRZIGZub2YgICAgICImIzQwMjsiID48IS0tIGxhdGluIHNtYWxsIGYgd2l0aCBob29rID0gZnVuY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmxvcmluLCBVKzAxOTIgSVNPdGVjaCAtLT4KLQotPCEtLSBHcmVlayAtLT4KLTwhRU5USVRZIEFscGhhICAgICImIzkxMzsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGFscGhhLCBVKzAzOTEgLS0+Ci08IUVOVElUWSBCZXRhICAgICAiJiM5MTQ7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBiZXRhLCBVKzAzOTIgLS0+Ci08IUVOVElUWSBHYW1tYSAgICAiJiM5MTU7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBnYW1tYSwgVSswMzkzIElTT2dyazMgLS0+Ci08IUVOVElUWSBEZWx0YSAgICAiJiM5MTY7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBkZWx0YSwgVSswMzk0IElTT2dyazMgLS0+Ci08IUVOVElUWSBFcHNpbG9uICAiJiM5MTc7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBlcHNpbG9uLCBVKzAzOTUgLS0+Ci08IUVOVElUWSBaZXRhICAgICAiJiM5MTg7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB6ZXRhLCBVKzAzOTYgLS0+Ci08IUVOVElUWSBFdGEgICAgICAiJiM5MTk7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBldGEsIFUrMDM5NyAtLT4KLTwhRU5USVRZIFRoZXRhICAgICImIzkyMDsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHRoZXRhLCBVKzAzOTggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIElvdGEgICAgICImIzkyMTsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGlvdGEsIFUrMDM5OSAtLT4KLTwhRU5USVRZIEthcHBhICAgICImIzkyMjsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGthcHBhLCBVKzAzOUEgLS0+Ci08IUVOVElUWSBMYW1iZGEgICAiJiM5MjM7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBsYW1iZGEsIFUrMDM5QiBJU09ncmszIC0tPgotPCFFTlRJVFkgTXUgICAgICAgIiYjOTI0OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbXUsIFUrMDM5QyAtLT4KLTwhRU5USVRZIE51ICAgICAgICImIzkyNTsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG51LCBVKzAzOUQgLS0+Ci08IUVOVElUWSBYaSAgICAgICAiJiM5MjY7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB4aSwgVSswMzlFIElTT2dyazMgLS0+Ci08IUVOVElUWSBPbWljcm9uICAiJiM5Mjc7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBvbWljcm9uLCBVKzAzOUYgLS0+Ci08IUVOVElUWSBQaSAgICAgICAiJiM5Mjg7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBwaSwgVSswM0EwIElTT2dyazMgLS0+Ci08IUVOVElUWSBSaG8gICAgICAiJiM5Mjk7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciByaG8sIFUrMDNBMSAtLT4KLTwhLS0gdGhlcmUgaXMgbm8gU2lnbWFmLCBhbmQgbm8gVSswM0EyIGNoYXJhY3RlciBlaXRoZXIgLS0+Ci08IUVOVElUWSBTaWdtYSAgICAiJiM5MzE7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYSwgVSswM0EzIElTT2dyazMgLS0+Ci08IUVOVElUWSBUYXUgICAgICAiJiM5MzI7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB0YXUsIFUrMDNBNCAtLT4KLTwhRU5USVRZIFVwc2lsb24gICImIzkzMzsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHVwc2lsb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFBoaSAgICAgICImIzkzNDsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBoaSwgVSswM0E2IElTT2dyazMgLS0+Ci08IUVOVElUWSBDaGkgICAgICAiJiM5MzU7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBjaGksIFUrMDNBNyAtLT4KLTwhRU5USVRZIFBzaSAgICAgICImIzkzNjsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBzaSwgVSswM0E4IElTT2dyazMgLS0+Ci08IUVOVElUWSBPbWVnYSAgICAiJiM5Mzc7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBvbWVnYSwgVSswM0E5IElTT2dyazMgLS0+Ci08IUVOVElUWSBhbHBoYSAgICAiJiM5NDU7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgYWxwaGEsIFUrMDNCMSBJU09ncmszIC0tPgotPCFFTlRJVFkgYmV0YSAgICAgIiYjOTQ2OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGJldGEsIFUrMDNCMiBJU09ncmszIC0tPgotPCFFTlRJVFkgZ2FtbWEgICAgIiYjOTQ3OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGdhbW1hLCBVKzAzQjMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGRlbHRhICAgICImIzk0ODsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBkZWx0YSwgVSswM0I0IElTT2dyazMgLS0+Ci08IUVOVElUWSBlcHNpbG9uICAiJiM5NDk7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZXBzaWxvbiwgVSswM0I1IElTT2dyazMgLS0+Ci08IUVOVElUWSB6ZXRhICAgICAiJiM5NTA7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgemV0YSwgVSswM0I2IElTT2dyazMgLS0+Ci08IUVOVElUWSBldGEgICAgICAiJiM5NTE7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZXRhLCBVKzAzQjcgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHRoZXRhICAgICImIzk1MjsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciB0aGV0YSwgVSswM0I4IElTT2dyazMgLS0+Ci08IUVOVElUWSBpb3RhICAgICAiJiM5NTM7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgaW90YSwgVSswM0I5IElTT2dyazMgLS0+Ci08IUVOVElUWSBrYXBwYSAgICAiJiM5NTQ7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIga2FwcGEsIFUrMDNCQSBJU09ncmszIC0tPgotPCFFTlRJVFkgbGFtYmRhICAgIiYjOTU1OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGxhbWJkYSwgVSswM0JCIElTT2dyazMgLS0+Ci08IUVOVElUWSBtdSAgICAgICAiJiM5NTY7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgbXUsIFUrMDNCQyBJU09ncmszIC0tPgotPCFFTlRJVFkgbnUgICAgICAgIiYjOTU3OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG51LCBVKzAzQkQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHhpICAgICAgICImIzk1ODsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciB4aSwgVSswM0JFIElTT2dyazMgLS0+Ci08IUVOVElUWSBvbWljcm9uICAiJiM5NTk7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgb21pY3JvbiwgVSswM0JGIE5FVyAtLT4KLTwhRU5USVRZIHBpICAgICAgICImIzk2MDsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBwaSwgVSswM0MwIElTT2dyazMgLS0+Ci08IUVOVElUWSByaG8gICAgICAiJiM5NjE7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcmhvLCBVKzAzQzEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHNpZ21hZiAgICImIzk2MjsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBmaW5hbCBzaWdtYSwgVSswM0MyIElTT2dyazMgLS0+Ci08IUVOVElUWSBzaWdtYSAgICAiJiM5NjM7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgc2lnbWEsIFUrMDNDMyBJU09ncmszIC0tPgotPCFFTlRJVFkgdGF1ICAgICAgIiYjOTY0OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRhdSwgVSswM0M0IElTT2dyazMgLS0+Ci08IUVOVElUWSB1cHNpbG9uICAiJiM5NjU7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdXBzaWxvbiwgVSswM0M1IElTT2dyazMgLS0+Ci08IUVOVElUWSBwaGkgICAgICAiJiM5NjY7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcGhpLCBVKzAzQzYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGNoaSAgICAgICImIzk2NzsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBjaGksIFUrMDNDNyBJU09ncmszIC0tPgotPCFFTlRJVFkgcHNpICAgICAgIiYjOTY4OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBzaSwgVSswM0M4IElTT2dyazMgLS0+Ci08IUVOVElUWSBvbWVnYSAgICAiJiM5Njk7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgb21lZ2EsIFUrMDNDOSBJU09ncmszIC0tPgotPCFFTlRJVFkgdGhldGFzeW0gIiYjOTc3OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRoZXRhIHN5bWJvbCwgVSswM0QxIE5FVyAtLT4KLTwhRU5USVRZIHVwc2loICAgICImIzk3ODsiID48IS0tIGdyZWVrIHVwc2lsb24gd2l0aCBob29rIHN5bWJvbCwgVSswM0QyIE5FVyAtLT4KLTwhRU5USVRZIHBpdiAgICAgICImIzk4MjsiID48IS0tIGdyZWVrIHBpIHN5bWJvbCwgVSswM0Q2IElTT2dyazMgLS0+Ci0KLTwhLS0gR2VuZXJhbCBQdW5jdHVhdGlvbiAtLT4KLTwhRU5USVRZIGJ1bGwgICAgICImIzgyMjY7IiA+PCEtLSBidWxsZXQgPSBibGFjayBzbWFsbCBjaXJjbGUsIFUrMjAyMiBJU09wdWIgIC0tPgotPCEtLSBidWxsZXQgaXMgTk9UIHRoZSBzYW1lIGFzIGJ1bGxldCBvcGVyYXRvciwgVSsyMjE5IC0tPgotPCFFTlRJVFkgaGVsbGlwICAgIiYjODIzMDsiID48IS0tIGhvcml6b250YWwgZWxsaXBzaXMgPSB0aHJlZSBkb3QgbGVhZGVyLCBVKzIwMjYgSVNPcHViICAtLT4KLTwhRU5USVRZIHByaW1lICAgICImIzgyNDI7IiA+PCEtLSBwcmltZSA9IG1pbnV0ZXMgPSBmZWV0LCBVKzIwMzIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIFByaW1lICAgICImIzgyNDM7IiA+PCEtLSBkb3VibGUgcHJpbWUgPSBzZWNvbmRzID0gaW5jaGVzLCBVKzIwMzMgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9saW5lICAgICImIzgyNTQ7IiA+PCEtLSBvdmVybGluZSA9IHNwYWNpbmcgb3ZlcnNjb3JlLCBVKzIwM0UgTkVXIC0tPgotPCFFTlRJVFkgZnJhc2wgICAgIiYjODI2MDsiID48IS0tIGZyYWN0aW9uIHNsYXNoLCBVKzIwNDQgTkVXIC0tPgotCi08IS0tIExldHRlcmxpa2UgU3ltYm9scyAtLT4KLTwhRU5USVRZIHdlaWVycCAgICImIzg0NzI7IiA+PCEtLSBzY3JpcHQgY2FwaXRhbCBQID0gcG93ZXIgc2V0ID0gV2VpZXJzdHJhc3MgcCwgVSsyMTE4IElTT2Ftc28gLS0+Ci08IUVOVElUWSBpbWFnZSAgICAiJiM4NDY1OyIgPjwhLS0gYmxhY2tsZXR0ZXIgY2FwaXRhbCBJID0gaW1hZ2luYXJ5IHBhcnQsIFUrMjExMSBJU09hbXNvIC0tPgotPCFFTlRJVFkgcmVhbCAgICAgIiYjODQ3NjsiID48IS0tIGJsYWNrbGV0dGVyIGNhcGl0YWwgUiA9IHJlYWwgcGFydCBzeW1ib2wsIFUrMjExQyBJU09hbXNvIC0tPgotPCFFTlRJVFkgdHJhZGUgICAgIiYjODQ4MjsiID48IS0tIHRyYWRlIG1hcmsgc2lnbiwgVSsyMTIyIElTT251bSAtLT4KLTwhRU5USVRZIGFsZWZzeW0gICImIzg1MDE7IiA+PCEtLSBhbGVmIHN5bWJvbCA9IGZpcnN0IHRyYW5zZmluaXRlIGNhcmRpbmFsLCBVKzIxMzUgTkVXIC0tPgotPCEtLSBhbGVmIHN5bWJvbCBpcyBOT1QgdGhlIHNhbWUgYXMgaGVicmV3IGxldHRlciBhbGVmLCBVKzA1RDAgYWx0aG91Z2gKLSAgICAgdGhlIHNhbWUgZ2x5cGggY291bGQgYmUgdXNlZCB0byBkZXBpY3QgYm90aCBjaGFyYWN0ZXJzIC0tPgotCi08IS0tIEFycm93cyAtLT4KLTwhRU5USVRZIGxhcnIgICAgICImIzg1OTI7IiA+PCEtLSBsZWZ0d2FyZHMgYXJyb3csIFUrMjE5MCBJU09udW0gLS0+Ci08IUVOVElUWSB1YXJyICAgICAiJiM4NTkzOyIgPjwhLS0gdXB3YXJkcyBhcnJvdywgVSsyMTkxIElTT251bS0tPgotPCFFTlRJVFkgcmFyciAgICAgIiYjODU5NDsiID48IS0tIHJpZ2h0d2FyZHMgYXJyb3csIFUrMjE5MiBJU09udW0gLS0+Ci08IUVOVElUWSBkYXJyICAgICAiJiM4NTk1OyIgPjwhLS0gZG93bndhcmRzIGFycm93LCBVKzIxOTMgSVNPbnVtIC0tPgotPCFFTlRJVFkgaGFyciAgICAgIiYjODU5NjsiID48IS0tIGxlZnQgcmlnaHQgYXJyb3csIFUrMjE5NCBJU09hbXNhIC0tPgotPCFFTlRJVFkgY3JhcnIgICAgIiYjODYyOTsiID48IS0tIGRvd253YXJkcyBhcnJvdyB3aXRoIGNvcm5lciBsZWZ0d2FyZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGNhcnJpYWdlIHJldHVybiwgVSsyMUI1IE5FVyAtLT4KLTwhRU5USVRZIGxBcnIgICAgICImIzg2NTY7IiA+PCEtLSBsZWZ0d2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDAgSVNPdGVjaCAtLT4KLTwhLS0gVW5pY29kZSBkb2VzIG5vdCBzYXkgdGhhdCBsQXJyIGlzIHRoZSBzYW1lIGFzIHRoZSAnaXMgaW1wbGllZCBieScgYXJyb3cKLSAgICBidXQgYWxzbyBkb2VzIG5vdCBoYXZlIGFueSBvdGhlciBjaGFyYWN0ZXIgZm9yIHRoYXQgZnVuY3Rpb24uIFNvID8gbEFyciBjYW4KLSAgICBiZSB1c2VkIGZvciAnaXMgaW1wbGllZCBieScgYXMgSVNPdGVjaCBzdWdnZXN0cyAtLT4KLTwhRU5USVRZIHVBcnIgICAgICImIzg2NTc7IiA+PCEtLSB1cHdhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQxIElTT2Ftc2EgLS0+Ci08IUVOVElUWSByQXJyICAgICAiJiM4NjU4OyIgPjwhLS0gcmlnaHR3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMiBJU090ZWNoIC0tPgotPCEtLSBVbmljb2RlIGRvZXMgbm90IHNheSB0aGlzIGlzIHRoZSAnaW1wbGllcycgY2hhcmFjdGVyIGJ1dCBkb2VzIG5vdCBoYXZlCi0gICAgIGFub3RoZXIgY2hhcmFjdGVyIHdpdGggdGhpcyBmdW5jdGlvbiBzbyA/Ci0gICAgIHJBcnIgY2FuIGJlIHVzZWQgZm9yICdpbXBsaWVzJyBhcyBJU090ZWNoIHN1Z2dlc3RzIC0tPgotPCFFTlRJVFkgZEFyciAgICAgIiYjODY1OTsiID48IS0tIGRvd253YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMyBJU09hbXNhIC0tPgotPCFFTlRJVFkgaEFyciAgICAgIiYjODY2MDsiID48IS0tIGxlZnQgcmlnaHQgZG91YmxlIGFycm93LCBVKzIxRDQgSVNPYW1zYSAtLT4KLQotPCEtLSBNYXRoZW1hdGljYWwgT3BlcmF0b3JzIC0tPgotPCFFTlRJVFkgZm9yYWxsICAgIiYjODcwNDsiID48IS0tIGZvciBhbGwsIFUrMjIwMCBJU090ZWNoIC0tPgotPCFFTlRJVFkgcGFydCAgICAgIiYjODcwNjsiID48IS0tIHBhcnRpYWwgZGlmZmVyZW50aWFsLCBVKzIyMDIgSVNPdGVjaCAgLS0+Ci08IUVOVElUWSBleGlzdCAgICAiJiM4NzA3OyIgPjwhLS0gdGhlcmUgZXhpc3RzLCBVKzIyMDMgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGVtcHR5ICAgICImIzg3MDk7IiA+PCEtLSBlbXB0eSBzZXQgPSBudWxsIHNldCA9IGRpYW1ldGVyLCBVKzIyMDUgSVNPYW1zbyAtLT4KLTwhRU5USVRZIG5hYmxhICAgICImIzg3MTE7IiA+PCEtLSBuYWJsYSA9IGJhY2t3YXJkIGRpZmZlcmVuY2UsIFUrMjIwNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgaXNpbiAgICAgIiYjODcxMjsiID48IS0tIGVsZW1lbnQgb2YsIFUrMjIwOCBJU090ZWNoIC0tPgotPCFFTlRJVFkgbm90aW4gICAgIiYjODcxMzsiID48IS0tIG5vdCBhbiBlbGVtZW50IG9mLCBVKzIyMDkgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG5pICAgICAgICImIzg3MTU7IiA+PCEtLSBjb250YWlucyBhcyBtZW1iZXIsIFUrMjIwQiBJU090ZWNoIC0tPgotPCEtLSBzaG91bGQgdGhlcmUgYmUgYSBtb3JlIG1lbW9yYWJsZSBuYW1lIHRoYW4gJ25pJz8gLS0+Ci08IUVOVElUWSBwcm9kICAgICAiJiM4NzE5OyIgPjwhLS0gbi1hcnkgcHJvZHVjdCA9IHByb2R1Y3Qgc2lnbiwgVSsyMjBGIElTT2Ftc2IgLS0+Ci08IS0tIHByb2QgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAzQTAgJ2dyZWVrIGNhcGl0YWwgbGV0dGVyIHBpJyB0aG91Z2gKLSAgICAgdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCBmb3IgYm90aCAtLT4KLTwhRU5USVRZIHN1bSAgICAgICImIzg3MjE7IiA+PCEtLSBuLWFyeSBzdW1hdGlvbiwgVSsyMjExIElTT2Ftc2IgLS0+Ci08IS0tIHN1bSBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDNBMyAnZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgc2lnbWEnCi0gICAgIHRob3VnaCB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIGZvciBib3RoIC0tPgotPCFFTlRJVFkgbWludXMgICAgIiYjODcyMjsiID48IS0tIG1pbnVzIHNpZ24sIFUrMjIxMiBJU090ZWNoIC0tPgotPCFFTlRJVFkgbG93YXN0ICAgIiYjODcyNzsiID48IS0tIGFzdGVyaXNrIG9wZXJhdG9yLCBVKzIyMTcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHJhZGljICAgICImIzg3MzA7IiA+PCEtLSBzcXVhcmUgcm9vdCA9IHJhZGljYWwgc2lnbiwgVSsyMjFBIElTT3RlY2ggLS0+Ci08IUVOVElUWSBwcm9wICAgICAiJiM4NzMzOyIgPjwhLS0gcHJvcG9ydGlvbmFsIHRvLCBVKzIyMUQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGluZmluICAgICImIzg3MzQ7IiA+PCEtLSBpbmZpbml0eSwgVSsyMjFFIElTT3RlY2ggLS0+Ci08IUVOVElUWSBhbmcgICAgICAiJiM4NzM2OyIgPjwhLS0gYW5nbGUsIFUrMjIyMCBJU09hbXNvIC0tPgotPCFFTlRJVFkgYW5kICAgICAgIiYjODc0MzsiID48IS0tIGxvZ2ljYWwgYW5kID0gd2VkZ2UsIFUrMjIyNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb3IgICAgICAgIiYjODc0NDsiID48IS0tIGxvZ2ljYWwgb3IgPSB2ZWUsIFUrMjIyOCBJU090ZWNoIC0tPgotPCFFTlRJVFkgY2FwICAgICAgIiYjODc0NTsiID48IS0tIGludGVyc2VjdGlvbiA9IGNhcCwgVSsyMjI5IElTT3RlY2ggLS0+Ci08IUVOVElUWSBjdXAgICAgICAiJiM4NzQ2OyIgPjwhLS0gdW5pb24gPSBjdXAsIFUrMjIyQSBJU090ZWNoIC0tPgotPCFFTlRJVFkgaW50ICAgICAgIiYjODc0NzsiID48IS0tIGludGVncmFsLCBVKzIyMkIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHRoZXJlNCAgICImIzg3NTY7IiA+PCEtLSB0aGVyZWZvcmUsIFUrMjIzNCBJU090ZWNoIC0tPgotPCFFTlRJVFkgc2ltICAgICAgIiYjODc2NDsiID48IS0tIHRpbGRlIG9wZXJhdG9yID0gdmFyaWVzIHdpdGggPSBzaW1pbGFyIHRvLCBVKzIyM0MgSVNPdGVjaCAtLT4KLTwhLS0gdGlsZGUgb3BlcmF0b3IgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyB0aGUgdGlsZGUsIFUrMDA3RSwKLSAgICAgYWx0aG91Z2ggdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCB0byByZXByZXNlbnQgYm90aCAgLS0+Ci08IUVOVElUWSBjb25nICAgICAiJiM4NzczOyIgPjwhLS0gYXBwcm94aW1hdGVseSBlcXVhbCB0bywgVSsyMjQ1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBhc3ltcCAgICAiJiM4Nzc2OyIgPjwhLS0gYWxtb3N0IGVxdWFsIHRvID0gYXN5bXB0b3RpYyB0bywgVSsyMjQ4IElTT2Ftc3IgLS0+Ci08IUVOVElUWSBuZSAgICAgICAiJiM4ODAwOyIgPjwhLS0gbm90IGVxdWFsIHRvLCBVKzIyNjAgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGVxdWl2ICAgICImIzg4MDE7IiA+PCEtLSBpZGVudGljYWwgdG8sIFUrMjI2MSBJU090ZWNoIC0tPgotPCFFTlRJVFkgbGUgICAgICAgIiYjODgwNDsiID48IS0tIGxlc3MtdGhhbiBvciBlcXVhbCB0bywgVSsyMjY0IElTT3RlY2ggLS0+Ci08IUVOVElUWSBnZSAgICAgICAiJiM4ODA1OyIgPjwhLS0gZ3JlYXRlci10aGFuIG9yIGVxdWFsIHRvLCBVKzIyNjUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1YiAgICAgICImIzg4MzQ7IiA+PCEtLSBzdWJzZXQgb2YsIFUrMjI4MiBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3VwICAgICAgIiYjODgzNTsiID48IS0tIHN1cGVyc2V0IG9mLCBVKzIyODMgSVNPdGVjaCAtLT4KLTwhLS0gbm90ZSB0aGF0IG5zdXAsICdub3QgYSBzdXBlcnNldCBvZiwgVSsyMjgzJyBpcyBub3QgY292ZXJlZCBieSB0aGUgU3ltYm9sCi0gICAgIGZvbnQgZW5jb2RpbmcgYW5kIGlzIG5vdCBpbmNsdWRlZC4gU2hvdWxkIGl0IGJlLCBmb3Igc3ltbWV0cnk/Ci0gICAgIEl0IGlzIGluIElTT2Ftc24gIC0tPgotPCFFTlRJVFkgbnN1YiAgICAgIiYjODgzNjsiID48IS0tIG5vdCBhIHN1YnNldCBvZiwgVSsyMjg0IElTT2Ftc24gLS0+Ci08IUVOVElUWSBzdWJlICAgICAiJiM4ODM4OyIgPjwhLS0gc3Vic2V0IG9mIG9yIGVxdWFsIHRvLCBVKzIyODYgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1cGUgICAgICImIzg4Mzk7IiA+PCEtLSBzdXBlcnNldCBvZiBvciBlcXVhbCB0bywgVSsyMjg3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBvcGx1cyAgICAiJiM4ODUzOyIgPjwhLS0gY2lyY2xlZCBwbHVzID0gZGlyZWN0IHN1bSwgVSsyMjk1IElTT2Ftc2IgLS0+Ci08IUVOVElUWSBvdGltZXMgICAiJiM4ODU1OyIgPjwhLS0gY2lyY2xlZCB0aW1lcyA9IHZlY3RvciBwcm9kdWN0LCBVKzIyOTcgSVNPYW1zYiAtLT4KLTwhRU5USVRZIHBlcnAgICAgICImIzg4Njk7IiA+PCEtLSB1cCB0YWNrID0gb3J0aG9nb25hbCB0byA9IHBlcnBlbmRpY3VsYXIsIFUrMjJBNSBJU090ZWNoIC0tPgotPCFFTlRJVFkgc2RvdCAgICAgIiYjODkwMTsiID48IS0tIGRvdCBvcGVyYXRvciwgVSsyMkM1IElTT2Ftc2IgLS0+Ci08IS0tIGRvdCBvcGVyYXRvciBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDBCNyBtaWRkbGUgZG90IC0tPgotCi08IS0tIE1pc2NlbGxhbmVvdXMgVGVjaG5pY2FsIC0tPgotPCFFTlRJVFkgbGNlaWwgICAgIiYjODk2ODsiID48IS0tIGxlZnQgY2VpbGluZyA9IGFwbCB1cHN0aWxlLCBVKzIzMDggSVNPYW1zYyAgLS0+Ci08IUVOVElUWSByY2VpbCAgICAiJiM4OTY5OyIgPjwhLS0gcmlnaHQgY2VpbGluZywgVSsyMzA5IElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgbGZsb29yICAgIiYjODk3MDsiID48IS0tIGxlZnQgZmxvb3IgPSBhcGwgZG93bnN0aWxlLCBVKzIzMEEgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSByZmxvb3IgICAiJiM4OTcxOyIgPjwhLS0gcmlnaHQgZmxvb3IsIFUrMjMwQiBJU09hbXNjICAtLT4KLTwhRU5USVRZIGxhbmcgICAgICImIzkwMDE7IiA+PCEtLSBsZWZ0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQgPSBicmEsIFUrMjMyOSBJU090ZWNoIC0tPgotPCEtLSBsYW5nIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMDNDICdsZXNzIHRoYW4nCi0gICAgIG9yIFUrMjAzOSAnc2luZ2xlIGxlZnQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmsnIC0tPgotPCFFTlRJVFkgcmFuZyAgICAgIiYjOTAwMjsiID48IS0tIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQgPSBrZXQsIFUrMjMyQSBJU090ZWNoIC0tPgotPCEtLSByYW5nIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMDNFICdncmVhdGVyIHRoYW4nCi0gICAgIG9yIFUrMjAzQSAnc2luZ2xlIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrJyAtLT4KLQotPCEtLSBHZW9tZXRyaWMgU2hhcGVzIC0tPgotPCFFTlRJVFkgbG96ICAgICAgIiYjOTY3NDsiID48IS0tIGxvemVuZ2UsIFUrMjVDQSBJU09wdWIgLS0+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBTeW1ib2xzIC0tPgotPCFFTlRJVFkgc3BhZGVzICAgIiYjOTgyNDsiID48IS0tIGJsYWNrIHNwYWRlIHN1aXQsIFUrMjY2MCBJU09wdWIgLS0+Ci08IS0tIGJsYWNrIGhlcmUgc2VlbXMgdG8gbWVhbiBmaWxsZWQgYXMgb3Bwb3NlZCB0byBob2xsb3cgLS0+Ci08IUVOVElUWSBjbHVicyAgICAiJiM5ODI3OyIgPjwhLS0gYmxhY2sgY2x1YiBzdWl0ID0gc2hhbXJvY2ssIFUrMjY2MyBJU09wdWIgLS0+Ci08IUVOVElUWSBoZWFydHMgICAiJiM5ODI5OyIgPjwhLS0gYmxhY2sgaGVhcnQgc3VpdCA9IHZhbGVudGluZSwgVSsyNjY1IElTT3B1YiAtLT4KLTwhRU5USVRZIGRpYW1zICAgICImIzk4MzA7IiA+PCEtLSBibGFjayBkaWFtb25kIHN1aXQsIFUrMjY2NiBJU09wdWIgLS0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXN5bWJvbC5lbnQgLS0+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1zcGVjaWFsCi0gICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgICAgInhodG1sLXNwZWNpYWwuZW50IiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhNTC1jb21wYXRpYmxlIElTTyBTcGVjaWFsIENoYXJhY3RlciBFbnRpdHkgU2V0IGZvciBYSFRNTCAuLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXNwZWNpYWwuZW50Ci0KLSAgICAgVHlwaWNhbCBpbnZvY2F0aW9uOgotCi0gICAgICAgPCFFTlRJVFkgJSB4aHRtbC1zcGVjaWFsCi0gICAgICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBTcGVjaWFsIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICAgICAgICAgICAieGh0bWwtc3BlY2lhbC5lbnQiID4KLSAgICAgICAleGh0bWwtc3BlY2lhbDsKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbCBmb3IgWEhUTUwvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXNwZWNpYWwuZW50IgotCi0gICAgIFJldmlzaW9uOiAgJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aCBjb25mb3JtaW5nCi0gICAgIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4gSVNPIDg4NzksIHByb3ZpZGVkCi0gICAgIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0KLSAgICAgUmV2aXNpb25zOgotMjAwMC0xMC0yODogYWRkZWQgJmFwb3M7IGFuZCBhbHRlcmVkIFhNTCBQcmVkZWZpbmVkIEVudGl0aWVzIGZvciBjb21wYXRpYmlsaXR5Ci0tLT4KLQotPCEtLSBSZWxldmFudCBJU08gZW50aXR5IHNldCBpcyBnaXZlbiB1bmxlc3MgbmFtZXMgYXJlIG5ld2x5IGludHJvZHVjZWQuCi0gICAgIE5ldyBuYW1lcyAoaS5lLiwgbm90IGluIElTTyA4ODc5IFtTR01MXSBsaXN0KSBkbyBub3QgY2xhc2ggd2l0aAotICAgICBhbnkgZXhpc3RpbmcgSVNPIDg4NzkgZW50aXR5IG5hbWVzLiBJU08gMTA2NDYgW0lTTzEwNjQ2XSBjaGFyYWN0ZXIKLSAgICAgbnVtYmVycyBhcmUgZ2l2ZW4gZm9yIGVhY2ggY2hhcmFjdGVyLCBpbiBoZXguIEVudGl0eSB2YWx1ZXMgYXJlCi0gICAgIGRlY2ltYWwgY29udmVyc2lvbnMgb2YgdGhlIElTTyAxMDY0NiB2YWx1ZXMgYW5kIHJlZmVyIHRvIHRoZQotICAgICBkb2N1bWVudCBjaGFyYWN0ZXIgc2V0LiBOYW1lcyBhcmUgVW5pY29kZSBbVU5JQ09ERV0gbmFtZXMuCi0tLT4KLQotPCEtLSBDMCBDb250cm9scyBhbmQgQmFzaWMgTGF0aW4gLS0+Ci08IUVOVElUWSBsdCAgICAgICImIzM4OyYjNjA7IiA+PCEtLSBsZXNzLXRoYW4gc2lnbiwgVSswMDNDIElTT251bSAtLT4KLTwhRU5USVRZIGd0ICAgICAgIiYjNjI7IiA+PCEtLSBncmVhdGVyLXRoYW4gc2lnbiwgVSswMDNFIElTT251bSAtLT4KLTwhRU5USVRZIGFtcCAgICAgIiYjMzg7JiMzODsiID48IS0tIGFtcGVyc2FuZCwgVSswMDI2IElTT251bSAtLT4KLTwhRU5USVRZIGFwb3MgICAgIiYjMzk7IiA+PCEtLSBhcG9zdHJvcGhlLCBVKzAwMjcgSVNPbnVtIC0tPgotPCFFTlRJVFkgcXVvdCAgICAiJiMzNDsiID48IS0tIHF1b3RhdGlvbiBtYXJrID0gQVBMIHF1b3RlLCBVKzAwMjIgSVNPbnVtIC0tPgotCi08IS0tIExhdGluIEV4dGVuZGVkLUEgLS0+Ci08IUVOVElUWSBPRWxpZyAgICImIzMzODsiID48IS0tIGxhdGluIGNhcGl0YWwgbGlnYXR1cmUgT0UsIFUrMDE1MiBJU09sYXQyIC0tPgotPCFFTlRJVFkgb2VsaWcgICAiJiMzMzk7IiA+PCEtLSBsYXRpbiBzbWFsbCBsaWdhdHVyZSBvZSwgVSswMTUzIElTT2xhdDIgLS0+Ci0KLTwhLS0gbGlnYXR1cmUgaXMgYSBtaXNub21lciwgdGhpcyBpcyBhIHNlcGFyYXRlIGNoYXJhY3RlciBpbiBzb21lIGxhbmd1YWdlcyAtLT4KLTwhRU5USVRZIFNjYXJvbiAgIiYjMzUyOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgUyB3aXRoIGNhcm9uLCBVKzAxNjAgSVNPbGF0MiAtLT4KLTwhRU5USVRZIHNjYXJvbiAgIiYjMzUzOyIgPjwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHMgd2l0aCBjYXJvbiwgVSswMTYxIElTT2xhdDIgLS0+Ci08IUVOVElUWSBZdW1sICAgICImIzM3NjsiID48IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFkgd2l0aCBkaWFlcmVzaXMsIFUrMDE3OCBJU09sYXQyIC0tPgotCi08IS0tIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycyAtLT4KLTwhRU5USVRZIGNpcmMgICAgIiYjNzEwOyIgPjwhLS0gbW9kaWZpZXIgbGV0dGVyIGNpcmN1bWZsZXggYWNjZW50LCBVKzAyQzYgSVNPcHViIC0tPgotPCFFTlRJVFkgdGlsZGUgICAiJiM3MzI7IiA+PCEtLSBzbWFsbCB0aWxkZSwgVSswMkRDIElTT2RpYSAtLT4KLQotPCEtLSBHZW5lcmFsIFB1bmN0dWF0aW9uIC0tPgotPCFFTlRJVFkgZW5zcCAgICAiJiM4MTk0OyIgPjwhLS0gZW4gc3BhY2UsIFUrMjAwMiBJU09wdWIgLS0+Ci08IUVOVElUWSBlbXNwICAgICImIzgxOTU7IiA+PCEtLSBlbSBzcGFjZSwgVSsyMDAzIElTT3B1YiAtLT4KLTwhRU5USVRZIHRoaW5zcCAgIiYjODIwMTsiID48IS0tIHRoaW4gc3BhY2UsIFUrMjAwOSBJU09wdWIgLS0+Ci08IUVOVElUWSB6d25qICAgICImIzgyMDQ7IiA+PCEtLSB6ZXJvIHdpZHRoIG5vbi1qb2luZXIsIFUrMjAwQyBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSB6d2ogICAgICImIzgyMDU7IiA+PCEtLSB6ZXJvIHdpZHRoIGpvaW5lciwgVSsyMDBEIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIGxybSAgICAgIiYjODIwNjsiID48IS0tIGxlZnQtdG8tcmlnaHQgbWFyaywgVSsyMDBFIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIHJsbSAgICAgIiYjODIwNzsiID48IS0tIHJpZ2h0LXRvLWxlZnQgbWFyaywgVSsyMDBGIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIG5kYXNoICAgIiYjODIxMTsiID48IS0tIGVuIGRhc2gsIFUrMjAxMyBJU09wdWIgLS0+Ci08IUVOVElUWSBtZGFzaCAgICImIzgyMTI7IiA+PCEtLSBlbSBkYXNoLCBVKzIwMTQgSVNPcHViIC0tPgotPCFFTlRJVFkgbHNxdW8gICAiJiM4MjE2OyIgPjwhLS0gbGVmdCBzaW5nbGUgcXVvdGF0aW9uIG1hcmssIFUrMjAxOCBJU09udW0gLS0+Ci08IUVOVElUWSByc3F1byAgICImIzgyMTc7IiA+PCEtLSByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmssIFUrMjAxOSBJU09udW0gLS0+Ci08IUVOVElUWSBzYnF1byAgICImIzgyMTg7IiA+PCEtLSBzaW5nbGUgbG93LTkgcXVvdGF0aW9uIG1hcmssIFUrMjAxQSBORVcgLS0+Ci08IUVOVElUWSBsZHF1byAgICImIzgyMjA7IiA+PCEtLSBsZWZ0IGRvdWJsZSBxdW90YXRpb24gbWFyaywgVSsyMDFDIElTT251bSAtLT4KLTwhRU5USVRZIHJkcXVvICAgIiYjODIyMTsiID48IS0tIHJpZ2h0IGRvdWJsZSBxdW90YXRpb24gbWFyaywgVSsyMDFEIElTT251bSAtLT4KLTwhRU5USVRZIGJkcXVvICAgIiYjODIyMjsiID48IS0tIGRvdWJsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFFIE5FVyAtLT4KLTwhRU5USVRZIGRhZ2dlciAgIiYjODIyNDsiID48IS0tIGRhZ2dlciwgVSsyMDIwIElTT3B1YiAtLT4KLTwhRU5USVRZIERhZ2dlciAgIiYjODIyNTsiID48IS0tIGRvdWJsZSBkYWdnZXIsIFUrMjAyMSBJU09wdWIgLS0+Ci08IUVOVElUWSBwZXJtaWwgICImIzgyNDA7IiA+PCEtLSBwZXIgbWlsbGUgc2lnbiwgVSsyMDMwIElTT3RlY2ggLS0+Ci0KLTwhLS0gbHNhcXVvIGlzIHByb3Bvc2VkIGJ1dCBub3QgeWV0IElTTyBzdGFuZGFyZGl6ZWQgLS0+Ci08IUVOVElUWSBsc2FxdW8gICImIzgyNDk7IiA+PCEtLSBzaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywgVSsyMDM5IElTTyBwcm9wb3NlZCAtLT4KLTwhLS0gcnNhcXVvIGlzIHByb3Bvc2VkIGJ1dCBub3QgeWV0IElTTyBzdGFuZGFyZGl6ZWQgLS0+Ci08IUVOVElUWSByc2FxdW8gICImIzgyNTA7IiA+PCEtLSBzaW5nbGUgcmlnaHQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmssIFUrMjAzQSBJU08gcHJvcG9zZWQgLS0+Ci08IUVOVElUWSBldXJvICAgICImIzgzNjQ7IiA+PCEtLSBldXJvIHNpZ24sIFUrMjBBQyBORVcgLS0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXNwZWNpYWwuZW50IC0tPgotCi0KLTwhLS0gZW5kIG9mIHhodG1sLWNoYXJlbnQtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtZnJhbWV3b3JrLTEubW9kIC0tPgotCi0KLTwhLS0gWEhUTUwgQ29yZSBNb2R1bGVzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHByZS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEKLSAgICAgIHwgJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgICVBbmNob3IuY2xhc3M7Ci0gICAgICAlSW5saW5lLmV4dHJhOyApKiIKLT4KLQotPCFFTlRJVFkgJSB4aHRtbC10ZXh0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgVGV4dCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC10ZXh0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFRleHQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXRleHQtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFRleHQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC10ZXh0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFRleHR1YWwgQ29udGVudAotCi0gICAgIFRoZSBUZXh0IG1vZHVsZSBpbmNsdWRlcyBkZWNsYXJhdGlvbnMgZm9yIGFsbCBjb3JlCi0gICAgIHRleHQgY29udGFpbmVyIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzLgotLS0+Ci0KLTwhRU5USVRZICUgeGh0bWwtaW5sc3RydWN0Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWlubHN0cnVjdC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1pbmxzdHJ1Y3QubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgU3RydWN0dXJhbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWlubHN0cnVjdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbmxpbmUgU3RydWN0dXJhbCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1pbmxzdHJ1Y3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBTdHJ1Y3R1cmFsIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW5sc3RydWN0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIElubGluZSBTdHJ1Y3R1cmFsCi0KLSAgICAgICAgYnIsIHNwYW4KLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMKLSAgICAgdXNlZCB0byBzdXBwb3J0IGlubGluZS1sZXZlbCBzdHJ1Y3R1cmFsIG1hcmt1cC4KLS0tPgotCi08IS0tIGJyOiBmb3JjZWQgbGluZSBicmVhayAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBici5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJyLmVsZW1lbnQ7WwotCi08IUVOVElUWSAlIGJyLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBici5xbmFtZSAgImJyIiA+Ci08IUVMRU1FTlQgJWJyLnFuYW1lOyAgJWJyLmNvbnRlbnQ7ID4KLQotPCEtLSBlbmQgb2YgYnIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBici5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVici5xbmFtZTsKLSAgICAgICVDb3JlLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGJyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gc3BhbjogZ2VuZXJpYyBpbmxpbmUgY29udGFpbmVyIC4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHNwYW4uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzcGFuLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzcGFuLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc3Bhbi5xbmFtZSAgInNwYW4iID4KLTwhRUxFTUVOVCAlc3Bhbi5xbmFtZTsgICVzcGFuLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHNwYW4uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzcGFuLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3Bhbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc3Bhbi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc3Bhbi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbmxzdHJ1Y3QtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1pbmxwaHJhcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1pbmxwaHJhcy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1pbmxwaHJhcy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBQaHJhc2FsIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtaW5scGhyYXMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW5saW5lIFBocmFzYWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaW5scGhyYXMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBQaHJhc2FsIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW5scGhyYXMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW5saW5lIFBocmFzYWwKLQotICAgICAgICBhYmJyLCBhY3JvbnltLCBjaXRlLCBjb2RlLCBkZm4sIGVtLCBrYmQsIHEsIHNhbXAsIHN0cm9uZywgdmFyCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIHVzZWQgdG8KLSAgICAgc3VwcG9ydCBpbmxpbmUtbGV2ZWwgcGhyYXNhbCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSBhYmJyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYWJici5lbGVtZW50O1sKLTwhRU5USVRZICUgYWJici5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGFiYnIucW5hbWUgICJhYmJyIiA+Ci08IUVMRU1FTlQgJWFiYnIucW5hbWU7ICAlYWJici5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBhYmJyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYWJici5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWFiYnIuYXR0bGlzdDtbCi08IUFUVExJU1QgJWFiYnIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGFiYnIuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhY3JvbnltLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYWNyb255bS5lbGVtZW50O1sKLTwhRU5USVRZICUgYWNyb255bS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGFjcm9ueW0ucW5hbWUgICJhY3JvbnltIiA+Ci08IUVMRU1FTlQgJWFjcm9ueW0ucW5hbWU7ICAlYWNyb255bS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBhY3JvbnltLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYWNyb255bS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWFjcm9ueW0uYXR0bGlzdDtbCi08IUFUVExJU1QgJWFjcm9ueW0ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGFjcm9ueW0uYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjaXRlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslY2l0ZS5lbGVtZW50O1sKLTwhRU5USVRZICUgY2l0ZS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGNpdGUucW5hbWUgICJjaXRlIiA+Ci08IUVMRU1FTlQgJWNpdGUucW5hbWU7ICAlY2l0ZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBjaXRlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgY2l0ZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWNpdGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJWNpdGUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGNpdGUuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjb2RlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslY29kZS5lbGVtZW50O1sKLTwhRU5USVRZICUgY29kZS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGNvZGUucW5hbWUgICJjb2RlIiA+Ci08IUVMRU1FTlQgJWNvZGUucW5hbWU7ICAlY29kZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBjb2RlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgY29kZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWNvZGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJWNvZGUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGNvZGUuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkZm4uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkZm4uZWxlbWVudDtbCi08IUVOVElUWSAlIGRmbi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGRmbi5xbmFtZSAgImRmbiIgPgotPCFFTEVNRU5UICVkZm4ucW5hbWU7ICAlZGZuLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGRmbi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGRmbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRmbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZGZuLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkZm4uYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBlbS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWVtLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBlbS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGVtLnFuYW1lICAiZW0iID4KLTwhRUxFTUVOVCAlZW0ucW5hbWU7ICAlZW0uY29udGVudDsgPgotPCEtLSBlbmQgb2YgZW0uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBlbS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWVtLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVlbS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZW0uYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBrYmQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVrYmQuZWxlbWVudDtbCi08IUVOVElUWSAlIGtiZC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGtiZC5xbmFtZSAgImtiZCIgPgotPCFFTEVNRU5UICVrYmQucW5hbWU7ICAla2JkLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGtiZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGtiZC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWtiZC5hdHRsaXN0O1sKLTwhQVRUTElTVCAla2JkLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBrYmQuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBxLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcS5lbGVtZW50O1sKLTwhRU5USVRZICUgcS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHEucW5hbWUgICJxIiA+Ci08IUVMRU1FTlQgJXEucW5hbWU7ICAlcS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBxLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgcS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXEuYXR0bGlzdDtbCi08IUFUVExJU1QgJXEucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGNpdGUgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHEuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzYW1wLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc2FtcC5lbGVtZW50O1sKLTwhRU5USVRZICUgc2FtcC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHNhbXAucW5hbWUgICJzYW1wIiA+Ci08IUVMRU1FTlQgJXNhbXAucW5hbWU7ICAlc2FtcC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzYW1wLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc2FtcC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXNhbXAuYXR0bGlzdDtbCi08IUFUVExJU1QgJXNhbXAucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHNhbXAuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzdHJvbmcuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzdHJvbmcuZWxlbWVudDtbCi08IUVOVElUWSAlIHN0cm9uZy5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHN0cm9uZy5xbmFtZSAgInN0cm9uZyIgPgotPCFFTEVNRU5UICVzdHJvbmcucW5hbWU7ICAlc3Ryb25nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHN0cm9uZy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHN0cm9uZy5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXN0cm9uZy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc3Ryb25nLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzdHJvbmcuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSB2YXIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV2YXIuZWxlbWVudDtbCi08IUVOVElUWSAlIHZhci5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHZhci5xbmFtZSAgInZhciIgPgotPCFFTEVNRU5UICV2YXIucW5hbWU7ICAldmFyLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHZhci5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHZhci5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXZhci5hdHRsaXN0O1sKLTwhQVRUTElTVCAldmFyLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB2YXIuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtaW5scGhyYXMtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ibGtzdHJ1Y3QubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtYmxrc3RydWN0Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWJsa3N0cnVjdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFN0cnVjdHVyYWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQmxvY2sgU3RydWN0dXJhbCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmxrc3RydWN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBTdHJ1Y3R1cmFsIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmxrc3RydWN0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJsb2NrIFN0cnVjdHVyYWwKLQotICAgICAgICBkaXYsIHAKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IGJsb2NrLWxldmVsIHN0cnVjdHVyYWwgbWFya3VwLgotLS0+Ci0KLTwhRU5USVRZICUgZGl2LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZGl2LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBkaXYuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyApKiIKLT4KLTwhRU5USVRZICUgZGl2LnFuYW1lICAiZGl2IiA+Ci08IUVMRU1FTlQgJWRpdi5xbmFtZTsgICVkaXYuY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGl2LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGl2LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZGl2LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkaXYucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGRpdi5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHAuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVwLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBwLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIgPgotPCFFTlRJVFkgJSBwLnFuYW1lICAicCIgPgotPCFFTEVNRU5UICVwLnFuYW1lOyAgJXAuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHAuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVwLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVwLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBwLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJsa3N0cnVjdC0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWJsa3BocmFzLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWJsa3BocmFzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWJsa3BocmFzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgUGhyYXNhbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWJsa3BocmFzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJsb2NrIFBocmFzYWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJsa3BocmFzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBQaHJhc2FsIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmxrcGhyYXMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmxvY2sgUGhyYXNhbAotCi0gICAgICAgIGFkZHJlc3MsIGJsb2NrcXVvdGUsIHByZSwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNgotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgYmxvY2stbGV2ZWwgcGhyYXNhbCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSBhZGRyZXNzLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYWRkcmVzcy5lbGVtZW50O1sKLTwhRU5USVRZICUgYWRkcmVzcy5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiID4KLTwhRU5USVRZICUgYWRkcmVzcy5xbmFtZSAgImFkZHJlc3MiID4KLTwhRUxFTUVOVCAlYWRkcmVzcy5xbmFtZTsgICVhZGRyZXNzLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGFkZHJlc3MuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhZGRyZXNzLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYWRkcmVzcy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYWRkcmVzcy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYWRkcmVzcy5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGJsb2NrcXVvdGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVibG9ja3F1b3RlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBibG9ja3F1b3RlLmNvbnRlbnQKLSAgICAgIiggJUJsb2NrLm1peDsgKSsiCi0+Ci08IUVOVElUWSAlIGJsb2NrcXVvdGUucW5hbWUgICJibG9ja3F1b3RlIiA+Ci08IUVMRU1FTlQgJWJsb2NrcXVvdGUucW5hbWU7ICAlYmxvY2txdW90ZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBibG9ja3F1b3RlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYmxvY2txdW90ZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJsb2NrcXVvdGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJWJsb2NrcXVvdGUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGNpdGUgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGJsb2NrcXVvdGUuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwcmUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVwcmUuZWxlbWVudDtbCi08IUVOVElUWSAlIHByZS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEKLSAgICAgIHwgJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgIHwgJXR0LnFuYW1lOyB8ICVpLnFuYW1lOyB8ICViLnFuYW1lOwotICAgICAgJUkxOG4uY2xhc3M7Ci0gICAgICAlQW5jaG9yLmNsYXNzOwotICAgICAgfCAlc2NyaXB0LnFuYW1lOyB8ICVtYXAucW5hbWU7Ci0gICAgICAlSW5saW5lLmV4dHJhOyApKiIKLT4KLTwhRU5USVRZICUgcHJlLnFuYW1lICAicHJlIiA+Ci08IUVMRU1FTlQgJXByZS5xbmFtZTsgICVwcmUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcHJlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgcHJlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcHJlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVwcmUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHhtbDpzcGFjZSAgICAoIHByZXNlcnZlICkgICAgICAgICAgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLT4KLTwhLS0gZW5kIG9mIHByZS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4gIEhlYWRpbmcgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgSGVhZGluZy5jb250ZW50ICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIiA+Ci0KLTwhRU5USVRZICUgaDEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoMS5lbGVtZW50O1sKLTwhRU5USVRZICUgaDEucW5hbWUgICJoMSIgPgotPCFFTEVNRU5UICVoMS5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGgxLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoMS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDEucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGgxLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoMi5lbGVtZW50O1sKLTwhRU5USVRZICUgaDIucW5hbWUgICJoMiIgPgotPCFFTEVNRU5UICVoMi5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGgyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoMi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGgyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDMuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoMy5lbGVtZW50O1sKLTwhRU5USVRZICUgaDMucW5hbWUgICJoMyIgPgotPCFFTEVNRU5UICVoMy5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGgzLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDMuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoMy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDMucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGgzLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoNC5lbGVtZW50O1sKLTwhRU5USVRZICUgaDQucW5hbWUgICJoNCIgPgotPCFFTEVNRU5UICVoNC5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGg0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoNC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGg0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoNS5lbGVtZW50O1sKLTwhRU5USVRZICUgaDUucW5hbWUgICJoNSIgPgotPCFFTEVNRU5UICVoNS5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGg1LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoNS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGg1LmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDYuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoNi5lbGVtZW50O1sKLTwhRU5USVRZICUgaDYucW5hbWUgICJoNiIgPgotPCFFTEVNRU5UICVoNi5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGg2LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDYuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoNi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDYucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGg2LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJsa3BocmFzLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXRleHQtMS5tb2QgLS0+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1oeXBlcnRleHQubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBIeXBlcnRleHQgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaHlwZXJ0ZXh0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEh5cGVydGV4dCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWh5cGVydGV4dC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSHlwZXJ0ZXh0IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaHlwZXJ0ZXh0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEh5cGVydGV4dAotCi0gICAgICAgIGEKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgYW5jaG9yICgnYScpIGVsZW1lbnQgdHlwZSwgd2hpY2gKLSAgICAgZGVmaW5lcyB0aGUgc291cmNlIG9mIGEgaHlwZXJ0ZXh0IGxpbmsuIFRoZSBkZXN0aW5hdGlvbgotICAgICAob3IgbGluayAndGFyZ2V0JykgaXMgaWRlbnRpZmllZCB2aWEgaXRzICdpZCcgYXR0cmlidXRlCi0gICAgIHJhdGhlciB0aGFuIHRoZSAnbmFtZScgYXR0cmlidXRlIGFzIHdhcyB1c2VkIGluIEhUTUwuCi0tLT4KLQotPCEtLSAuLi4uLi4uLi4uLi4gIEFuY2hvciBFbGVtZW50ICAuLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgYS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWEuZWxlbWVudDtbCi08IUVOVElUWSAlIGEuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubE5vQW5jaG9yLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGEucW5hbWUgICJhIiA+Ci08IUVMRU1FTlQgJWEucW5hbWU7ICAlYS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBhLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWEuYXR0bGlzdDtbCi08IUFUVExJU1QgJWEucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGhyZWYgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNoYXJzZXQgICAgICAlQ2hhcnNldC5kYXRhdHlwZTsgICAgICAgI0lNUExJRUQKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgIGhyZWZsYW5nICAgICAlTGFuZ3VhZ2VDb2RlLmRhdGF0eXBlOyAgI0lNUExJRUQKLSAgICAgIHJlbCAgICAgICAgICAlTGlua1R5cGVzLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIHJldiAgICAgICAgICAlTGlua1R5cGVzLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGEuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtaHlwZXJ0ZXh0LTEubW9kIC0tPgotCi0KLTwhRU5USVRZICUgeGh0bWwtbGlzdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIExpc3RzIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWxpc3QtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgTGlzdHMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbGlzdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTGlzdHMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1saXN0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIExpc3RzCi0KLSAgICAgICAgZGwsIGR0LCBkZCwgb2wsIHVsLCBsaQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBsaXN0LW9yaWVudGVkIGVsZW1lbnQgdHlwZXMKLSAgICAgYW5kIHRoZWlyIGF0dHJpYnV0ZXMuCi0tLT4KLQotPCFFTlRJVFkgJSBkbC5xbmFtZSAgImRsIiA+Ci08IUVOVElUWSAlIGR0LnFuYW1lICAiZHQiID4KLTwhRU5USVRZICUgZGQucW5hbWUgICJkZCIgPgotPCFFTlRJVFkgJSBvbC5xbmFtZSAgIm9sIiA+Ci08IUVOVElUWSAlIHVsLnFuYW1lICAidWwiID4KLTwhRU5USVRZICUgbGkucW5hbWUgICJsaSIgPgotCi08IS0tIGRsOiBEZWZpbml0aW9uIExpc3QgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBkbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRsLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBkbC5jb250ZW50ICAiKCAlZHQucW5hbWU7IHwgJWRkLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICVkbC5xbmFtZTsgICVkbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGRsLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZGwuYXR0bGlzdDtbCi08IUFUVExJU1QgJWRsLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkbC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGR0OiBEZWZpbml0aW9uIFRlcm0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBkdC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWR0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBkdC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJWR0LnFuYW1lOyAgJWR0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGR0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZHQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVkdC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZHQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGR0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZGQ6IERlZmluaXRpb24gRGVzY3JpcHRpb24gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGRkLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZGQuZWxlbWVudDtbCi08IUVOVElUWSAlIGRkLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJWRkLnFuYW1lOyAgJWRkLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGRkLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVkZC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZGQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGRkLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gb2w6IE9yZGVyZWQgTGlzdCAobnVtYmVyZWQgc3R5bGVzKSAuLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIG9sLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslb2wuZWxlbWVudDtbCi08IUVOVElUWSAlIG9sLmNvbnRlbnQgICIoICVsaS5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAlb2wucW5hbWU7ICAlb2wuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygb2wuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBvbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJW9sLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVvbC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygb2wuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB1bDogVW5vcmRlcmVkIExpc3QgKGJ1bGxldCBzdHlsZXMpIC4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdWwuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV1bC5lbGVtZW50O1sKLTwhRU5USVRZICUgdWwuY29udGVudCAgIiggJWxpLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICV1bC5xbmFtZTsgICV1bC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB1bC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHVsLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldWwuYXR0bGlzdDtbCi08IUFUVExJU1QgJXVsLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB1bC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGxpOiBMaXN0IEl0ZW0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBsaS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWxpLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBsaS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTEVNRU5UICVsaS5xbmFtZTsgICVsaS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBsaS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGxpLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbGkuYXR0bGlzdDtbCi08IUFUVExJU1QgJWxpLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBsaS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1saXN0LTEubW9kIC0tPgotCi08IS0tIEV4dGVuZCBsaXN0cyB3aXRoIHZhbHVlIGFuZCBzdGFydCBhdHRyaWJ1dGVzIC0tPiAKLTwhQVRUTElTVCAlbGkucW5hbWU7Ci0gICAgICB2YWx1ZSAgICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICAjSU1QTElFRAotPgotPCFBVFRMSVNUICVvbC5xbmFtZTsKLSAgICAgIHN0YXJ0ICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSA6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiAtLT4KLQotPCEtLSBJbWFnZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1pbWFnZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEltYWdlcyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbWFnZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbWFnZXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1pbWFnZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUm92aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW1hZ2VzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW1hZ2UtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW1hZ2VzCi0KLSAgICAgICAgaW1nCi0KLSAgICAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgbWFya3VwIHRvIHN1cHBvcnQgYmFzaWMgaW1hZ2UgZW1iZWRkaW5nLgotLS0+Ci0KLTwhLS0gVG8gYXZvaWQgcHJvYmxlbXMgd2l0aCB0ZXh0LW9ubHkgVUFzIGFzIHdlbGwgYXMgdG8gbWFrZQotICAgICBpbWFnZSBjb250ZW50IHVuZGVyc3RhbmRhYmxlIGFuZCBuYXZpZ2FibGUgdG8gdXNlcnMgb2YKLSAgICAgbm9uLXZpc3VhbCBVQXMsIHlvdSBuZWVkIHRvIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiB3aXRoCi0gICAgIHRoZSAnYWx0JyBhdHRyaWJ1dGUsIGFuZCBhdm9pZCBzZXJ2ZXItc2lkZSBpbWFnZSBtYXBzLgotLS0+Ci0KLTwhRU5USVRZICUgaW1nLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaW1nLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBpbWcuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIGltZy5xbmFtZSAgImltZyIgPgotPCFFTEVNRU5UICVpbWcucW5hbWU7ICAlaW1nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGltZy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGltZy5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWltZy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaW1nLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBzcmMgICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgYWx0ICAgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIGxvbmdkZXNjICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhlaWdodCAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIHdpZHRoICAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGltZy5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbWFnZS0xLm1vZCAtLT4KLQotCi08IS0tIFRhYmxlcyBNb2R1bGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXRhYmxlLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzaWMgVGFibGVzIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJhc2ljLXRhYmxlLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCYXNpYyBUYWJsZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmFzaWMtdGFibGUtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MIEJhc2ljLCBhIHByb3BlciBzdWJzZXQgb2YgWEhUTUwuCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzaWMgVGFibGVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmFzaWMtdGFibGUtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmFzaWMgVGFibGVzCi0KLSAgICAgICAgdGFibGUsIGNhcHRpb24sIHRyLCB0aCwgdGQKLQotICAgICBUaGlzIHRhYmxlIG1vZHVsZSBkZWNsYXJlcyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBkZWZpbmluZwotICAgICBhIHRhYmxlIG1vZGVsIGJhc2VkIGZ1bmRhbWVudGFsbHkgb24gZmVhdHVyZXMgZm91bmQgaW4gdGhlCi0gICAgIHdpZGVseS1kZXBsb3llZCBIVE1MIDMuMiB0YWJsZSBtb2RlbC4gIFdoaWxlIHRoaXMgbW9kdWxlCi0gICAgIG1pbWljcyB0aGUgY29udGVudCBtb2RlbCBhbmQgdGFibGUgYXR0cmlidXRlcyBvZiBIVE1MIDMuMgotICAgICB0YWJsZXMsIHRoZSBlbGVtZW50IHR5cGVzIGRlY2xhcmVkIGhlcmVpbiBhbHNvIGluY2x1ZGVzIGFsbAotICAgICBIVE1MIDQgY29tbW9uIGFuZCBtb3N0IG9mIHRoZSBIVE1MIDQgdGFibGUgYXR0cmlidXRlcy4KLS0tPgotCi08IS0tIGRlY2xhcmUgcXVhbGlmaWVkIGVsZW1lbnQgdHlwZSBuYW1lczoKLS0tPgotPCFFTlRJVFkgJSB0YWJsZS5xbmFtZSAgInRhYmxlIiA+Ci08IUVOVElUWSAlIGNhcHRpb24ucW5hbWUgICJjYXB0aW9uIiA+Ci08IUVOVElUWSAlIHRyLnFuYW1lICAidHIiID4KLTwhRU5USVRZICUgdGgucW5hbWUgICJ0aCIgPgotPCFFTlRJVFkgJSB0ZC5xbmFtZSAgInRkIiA+Ci0KLTwhLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cwotLS0+Ci08IUVOVElUWSAlIENlbGxIQWxpZ24uYXR0cmliCi0gICAgICJhbGlnbiAgICAgICAgKCBsZWZ0Ci0gICAgICAgICAgICAgICAgICAgfCBjZW50ZXIKLSAgICAgICAgICAgICAgICAgICB8IHJpZ2h0ICkgICAgICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhLS0gdmVydGljYWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMKLS0tPgotPCFFTlRJVFkgJSBDZWxsVkFsaWduLmF0dHJpYgotICAgICAidmFsaWduICAgICAgICggdG9wCi0gICAgICAgICAgICAgICAgICAgfCBtaWRkbGUKLSAgICAgICAgICAgICAgICAgICB8IGJvdHRvbSApICAgICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhLS0gc2NvcGUgaXMgc2ltcGxlciB0aGFuIGF4ZXMgYXR0cmlidXRlIGZvciBjb21tb24gdGFibGVzCi0tLT4KLTwhRU5USVRZICUgc2NvcGUuYXR0cmliCi0gICAgICJzY29wZSAgICAgICAgKCByb3cgfCBjb2wgICkgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IS0tIHRhYmxlOiBUYWJsZSBFbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB0YWJsZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRhYmxlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0YWJsZS5jb250ZW50Ci0gICAgICIoICVjYXB0aW9uLnFuYW1lOz8sICV0ci5xbmFtZTsrICkiCi0+Ci08IUVMRU1FTlQgJXRhYmxlLnFuYW1lOyAgJXRhYmxlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRhYmxlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGFibGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0YWJsZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGFibGUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHN1bW1hcnkgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHRhYmxlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gY2FwdGlvbjogVGFibGUgQ2FwdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGNhcHRpb24uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjYXB0aW9uLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjYXB0aW9uLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlY2FwdGlvbi5xbmFtZTsgICVjYXB0aW9uLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGNhcHRpb24uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjYXB0aW9uLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY2FwdGlvbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlY2FwdGlvbi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgY2FwdGlvbi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRyOiBUYWJsZSBSb3cgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB0ci5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0ci5jb250ZW50ICAiKCAldGgucW5hbWU7IHwgJXRkLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICV0ci5xbmFtZTsgICV0ci5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0ci5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldHIuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRyLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0ci5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRoOiBUYWJsZSBIZWFkZXIgQ2VsbCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSB0aCBpcyBmb3IgaGVhZGVyIGNlbGxzLCB0ZCBmb3IgZGF0YSwKLSAgICAgYnV0IGZvciBjZWxscyBhY3RpbmcgYXMgYm90aCB1c2UgdGQKLS0tPgotCi08IUVOVElUWSAlIHRoLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGguZWxlbWVudDtbCi08IUVOVElUWSAlIHRoLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Tm9UYWJsZS5taXg7ICkqIgotPgotPCFFTEVNRU5UICV0aC5xbmFtZTsgICV0aC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0aC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRoLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGguYXR0bGlzdDtbCi08IUFUVExJU1QgJXRoLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBhYmJyICAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICBheGlzICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBoZWFkZXJzICAgICAgSURSRUZTICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICAlc2NvcGUuYXR0cmliOwotICAgICAgcm93c3BhbiAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgIGNvbHNwYW4gICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0aC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRkOiBUYWJsZSBEYXRhIENlbGwgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB0ZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRkLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0ZC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvd05vVGFibGUubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAldGQucW5hbWU7ICAldGQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0ZC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRkLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0ZC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgYWJiciAgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotICAgICAgYXhpcyAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgaGVhZGVycyAgICAgIElEUkVGUyAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgJXNjb3BlLmF0dHJpYjsKLSAgICAgIHJvd3NwYW4gICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICBjb2xzcGFuICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICcxJwotICAgICAgJUNlbGxIQWxpZ24uYXR0cmliOwotICAgICAgJUNlbGxWQWxpZ24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdGQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmFzaWMtdGFibGUtMS5tb2QgLS0+Ci0KLQotPCEtLSBGb3JtcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIAotCVhIVE1MIGJhc2ljIGZvcm1zIG1vZHVsZSBleHRlbmRlZCB3aXRoIG9wdGdyb3VwIGFuZCBmaWVsZHNldAotLS0+Ci08IUVMRU1FTlQgJW9wdGdyb3VwLnFuYW1lOyAoJW9wdGlvbi5xbmFtZTspKz4KLTwhQVRUTElTVCAlb3B0Z3JvdXAucW5hbWU7Ci0JJUNvbW1vbi5hdHRyaWI7IAotCWxhYmVsICVUZXh0LmRhdGF0eXBlOyAjUkVRVUlSRUQKLT4KLTwhRU5USVRZICUgc2VsZWN0LmNvbnRlbnQgIiggJW9wdGdyb3VwLnFuYW1lOyB8ICVvcHRpb24ucW5hbWU7ICkrIj4KLTwhRUxFTUVOVCAlZmllbGRzZXQucW5hbWU7ICgjUENEQVRBIHwgJUZsb3cubWl4OykqPgotPCFBVFRMSVNUICVmaWVsZHNldC5xbmFtZTsKLQklQ29tbW9uLmF0dHJpYjsgCi0+Ci08IUVOVElUWSAlIGZvcm0uY29udGVudCAiKCAlQmxrTm9Gb3JtLm1peDsgfCAlZmllbGRzZXQucW5hbWU7ICkrIj4KLTwhRU5USVRZICUgeGh0bWwtZm9ybS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2ljIEZvcm1zIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJhc2ljLWZvcm0tMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgU2ltcGxpZmllZCBGb3JtcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmFzaWMtZm9ybS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwgQmFzaWMsIGEgcHJvcGVyIHN1YnNldCBvZiBYSFRNTC4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNpYyBGb3JtcyAxLjAvL0VOIiAgCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmFzaWMtZm9ybS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCYXNpYyBGb3JtcwotCi0gICAgIFRoaXMgZm9ybXMgbW9kdWxlIGlzIGJhc2VkIG9uIHRoZSBIVE1MIDMuMiBmb3JtcyBtb2RlbCwgd2l0aAotICAgICB0aGUgV0FJLXJlcXVlc3RlZCBhZGRpdGlvbiBvZiB0aGUgbGFiZWwgZWxlbWVudC4gV2hpbGUgdGhpcyAKLSAgICAgbW9kdWxlIGVzc2VudGlhbGx5IG1pbWljcyB0aGUgY29udGVudCBtb2RlbCBhbmQgYXR0cmlidXRlcyBvZiAKLSAgICAgSFRNTCAzLjIgZm9ybXMsIHRoZSBlbGVtZW50IHR5cGVzIGRlY2xhcmVkIGhlcmVpbiBhbHNvIGluY2x1ZGUKLSAgICAgYWxsIEhUTUwgNCBjb21tb24gYXR0cmlidXRlcy4KLQotICAgICAgICBmb3JtLCBsYWJlbCwgaW5wdXQsIHNlbGVjdCwgb3B0aW9uLCB0ZXh0YXJlYQotLS0+Ci0KLTwhLS0gZGVjbGFyZSBxdWFsaWZpZWQgZWxlbWVudCB0eXBlIG5hbWVzOgotLS0+Ci08IUVOVElUWSAlIGZvcm0ucW5hbWUgICJmb3JtIiA+Ci08IUVOVElUWSAlIGxhYmVsLnFuYW1lICAibGFiZWwiID4KLTwhRU5USVRZICUgaW5wdXQucW5hbWUgICJpbnB1dCIgPgotPCFFTlRJVFkgJSBzZWxlY3QucW5hbWUgICJzZWxlY3QiID4KLTwhRU5USVRZICUgb3B0aW9uLnFuYW1lICAib3B0aW9uIiA+Ci08IUVOVElUWSAlIHRleHRhcmVhLnFuYW1lICAidGV4dGFyZWEiID4KLQotPCEtLSAlQmxrTm9Gb3JtLm1peDsgaW5jbHVkZXMgYWxsIG5vbi1mb3JtIGJsb2NrIGVsZW1lbnRzLAotICAgICBwbHVzICVNaXNjLmNsYXNzOwotLS0+Ci08IUVOVElUWSAlIEJsa05vRm9ybS5taXgKLSAgICAgIiVIZWFkaW5nLmNsYXNzOwotICAgICAgfCAlTGlzdC5jbGFzczsKLSAgICAgIHwgJUJsa1N0cnVjdC5jbGFzczsKLSAgICAgICVCbGtQaHJhcy5jbGFzczsKLSAgICAgICVCbGtQcmVzLmNsYXNzOwotICAgICAgfCAldGFibGUucW5hbWU7IAotICAgICAgJUJsb2NrLmV4dHJhOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IS0tIGZvcm06IEZvcm0gRWxlbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBmb3JtLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZm9ybS5lbGVtZW50O1sKLTwhRU5USVRZICUgZm9ybS5jb250ZW50Ci0gICAgICIoICVCbGtOb0Zvcm0ubWl4OyApKyIKLT4KLTwhRUxFTUVOVCAlZm9ybS5xbmFtZTsgICVmb3JtLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGZvcm0uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBmb3JtLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZm9ybS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZm9ybS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgYWN0aW9uICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIG1ldGhvZCAgICAgICAoIGdldCB8IHBvc3QgKSAgICAgICAgICAgJ2dldCcKLSAgICAgIGVuY3R5cGUgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcKLT4KLTwhLS0gZW5kIG9mIGZvcm0uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBsYWJlbDogRm9ybSBGaWVsZCBMYWJlbCBUZXh0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgbGFiZWwuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVsYWJlbC5lbGVtZW50O1sKLTwhLS0gRWFjaCBsYWJlbCBtdXN0IG5vdCBjb250YWluIG1vcmUgdGhhbiBPTkUgZmllbGQKLS0tPgotPCFFTlRJVFkgJSBsYWJlbC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgCi0gICAgICB8ICVpbnB1dC5xbmFtZTsgfCAlc2VsZWN0LnFuYW1lOyB8ICV0ZXh0YXJlYS5xbmFtZTsKLSAgICAgIHwgJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgICVJMThuLmNsYXNzOwotICAgICAgJUlubFByZXMuY2xhc3M7Ci0gICAgICAlSW5sU3BlY2lhbC5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyApKiIKLT4KLTwhRUxFTUVOVCAlbGFiZWwucW5hbWU7ICAlbGFiZWwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgbGFiZWwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBsYWJlbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWxhYmVsLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVsYWJlbC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgZm9yICAgICAgICAgIElEUkVGICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgbGFiZWwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBpbnB1dDogRm9ybSBDb250cm9sIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgaW5wdXQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVpbnB1dC5lbGVtZW50O1sKLTwhRU5USVRZICUgaW5wdXQuY29udGVudCAgIkVNUFRZIiA+Ci08IUVMRU1FTlQgJWlucHV0LnFuYW1lOyAgJWlucHV0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGlucHV0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhLS0gQmFzaWMgRm9ybXMgcmVtb3ZlcyAnaW1hZ2UnIGFuZCAnZmlsZScgaW5wdXQgdHlwZXMuCi0tLT4KLTwhRU5USVRZICUgaW5wdXQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVpbnB1dC5hdHRsaXN0O1sKLTwhRU5USVRZICUgSW5wdXRUeXBlLmNsYXNzCi0gICAgICIoIHRleHQgfCBwYXNzd29yZCB8IGNoZWNrYm94IHwgcmFkaW8gCi0gICAgICB8IHN1Ym1pdCB8IHJlc2V0IHwgaGlkZGVuICkiCi0+Ci08IS0tIGF0dHJpYnV0ZSBuYW1lIHJlcXVpcmVkIGZvciBhbGwgYnV0IHN1Ym1pdCAmIHJlc2V0Ci0tLT4KLTwhQVRUTElTVCAlaW5wdXQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHR5cGUgICAgICAgICAlSW5wdXRUeXBlLmNsYXNzOyAgICAgICAgJ3RleHQnCi0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB2YWx1ZSAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjaGVja2VkICAgICAgKCBjaGVja2VkICkgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBzaXplICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBtYXhsZW5ndGggICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBzcmMgICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICB0YWJpbmRleCAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBpbnB1dC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHNlbGVjdDogT3B0aW9uIFNlbGVjdG9yIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBzZWxlY3QuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzZWxlY3QuZWxlbWVudDtbCi08IUVOVElUWSAlIHNlbGVjdC5jb250ZW50ICAiKCAlb3B0aW9uLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICVzZWxlY3QucW5hbWU7ICAlc2VsZWN0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHNlbGVjdC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHNlbGVjdC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXNlbGVjdC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc2VsZWN0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBzaXplICAgICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBtdWx0aXBsZSAgICAgKCBtdWx0aXBsZSApICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB0YWJpbmRleCAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBzZWxlY3QuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBvcHRpb246IFNlbGVjdGFibGUgQ2hvaWNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgb3B0aW9uLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslb3B0aW9uLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBvcHRpb24uY29udGVudCAgIiggI1BDREFUQSApIiA+Ci08IUVMRU1FTlQgJW9wdGlvbi5xbmFtZTsgICVvcHRpb24uY29udGVudDsgPgotPCEtLSBlbmQgb2Ygb3B0aW9uLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgb3B0aW9uLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslb3B0aW9uLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVvcHRpb24ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHNlbGVjdGVkICAgICAoIHNlbGVjdGVkICkgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHZhbHVlICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIG9wdGlvbi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRleHRhcmVhOiBNdWx0aS1MaW5lIFRleHQgRmllbGQgLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB0ZXh0YXJlYS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRleHRhcmVhLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0ZXh0YXJlYS5jb250ZW50ICAiKCAjUENEQVRBICkiID4KLTwhRUxFTUVOVCAldGV4dGFyZWEucW5hbWU7ICAldGV4dGFyZWEuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGV4dGFyZWEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0ZXh0YXJlYS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRleHRhcmVhLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0ZXh0YXJlYS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgcm93cyAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjUkVRVUlSRUQKLSAgICAgIGNvbHMgICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI1JFUVVJUkVECi0gICAgICB0YWJpbmRleCAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiB0ZXh0YXJlYS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1iYXNpYy1mb3JtLTEubW9kIC0tPgotCi0KLTwhLS0gTGluayBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtbGluay5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIExpbmsgRWxlbWVudCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1saW5rLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIExpbmsgRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWxpbmstMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIExpbmsgRWxlbWVudCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWxpbmstMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTGluayBlbGVtZW50Ci0KLSAgICAgICAgbGluawotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBsaW5rIGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsCi0gICAgIHdoaWNoIGNvdWxkIChpbiBwcmluY2lwbGUpIGJlIHVzZWQgdG8gZGVmaW5lIGRvY3VtZW50LWxldmVsIGxpbmtzCi0gICAgIHRvIGV4dGVybmFsIHJlc291cmNlcyBzdWNoIGFzOgotCi0gICAgIGEpIGZvciBkb2N1bWVudCBzcGVjaWZpYyB0b29sYmFycy9tZW51cywgZS5nLiBzdGFydCwgY29udGVudHMsCi0gICAgICAgIHByZXZpb3VzLCBuZXh0LCBpbmRleCwgZW5kLCBoZWxwCi0gICAgIGIpIHRvIGxpbmsgdG8gYSBzZXBhcmF0ZSBzdHlsZSBzaGVldCAocmVsPSJzdHlsZXNoZWV0IikKLSAgICAgYykgdG8gbWFrZSBhIGxpbmsgdG8gYSBzY3JpcHQgKHJlbD0ic2NyaXB0IikKLSAgICAgZCkgYnkgc3R5bGUgc2hlZXRzIHRvIGNvbnRyb2wgaG93IGNvbGxlY3Rpb25zIG9mIGh0bWwgbm9kZXMgYXJlCi0gICAgICAgIHJlbmRlcmVkIGludG8gcHJpbnRlZCBkb2N1bWVudHMKLSAgICAgZSkgdG8gbWFrZSBhIGxpbmsgdG8gYSBwcmludGFibGUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICAgIGUuZy4gYSBwb3N0c2NyaXB0IG9yIHBkZiB2ZXJzaW9uIChyZWw9ImFsdGVybmF0ZSIgbWVkaWE9InByaW50IikKLS0tPgotCi08IS0tIGxpbms6IE1lZGlhLUluZGVwZW5kZW50IExpbmsgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBsaW5rLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslbGluay5lbGVtZW50O1sKLTwhRU5USVRZICUgbGluay5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgbGluay5xbmFtZSAgImxpbmsiID4KLTwhRUxFTUVOVCAlbGluay5xbmFtZTsgICVsaW5rLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGxpbmsuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBsaW5rLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbGluay5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbGluay5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgY2hhcnNldCAgICAgICVDaGFyc2V0LmRhdGF0eXBlOyAgICAgICAjSU1QTElFRAotICAgICAgaHJlZiAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgaHJlZmxhbmcgICAgICVMYW5ndWFnZUNvZGUuZGF0YXR5cGU7ICAjSU1QTElFRAotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjSU1QTElFRAotICAgICAgcmVsICAgICAgICAgICVMaW5rVHlwZXMuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgcmV2ICAgICAgICAgICVMaW5rVHlwZXMuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgbWVkaWEgICAgICAgICVNZWRpYURlc2MuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgbGluay5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1saW5rLTEubW9kIC0tPgotCi0KLTwhLS0gRG9jdW1lbnQgTWV0YWluZm9ybWF0aW9uIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtbWV0YS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIE1ldGFpbmZvcm1hdGlvbiAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1tZXRhLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIERvY3VtZW50IE1ldGFpbmZvcm1hdGlvbiBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLW1ldGEtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIE1ldGFpbmZvcm1hdGlvbiAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLW1ldGEtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTWV0YSBJbmZvcm1hdGlvbgotCi0gICAgICAgIG1ldGEKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgbWV0YSBlbGVtZW50IHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGVzLAotICAgICB1c2VkIHRvIHByb3ZpZGUgZGVjbGFyYXRpdmUgZG9jdW1lbnQgbWV0YWluZm9ybWF0aW9uLgotLS0+Ci0KLTwhLS0gbWV0YTogR2VuZXJpYyBNZXRhaW5mb3JtYXRpb24gLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIG1ldGEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVtZXRhLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBtZXRhLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBtZXRhLnFuYW1lICAibWV0YSIgPgotPCFFTEVNRU5UICVtZXRhLnFuYW1lOyAgJW1ldGEuY29udGVudDsgPgotPCEtLSBlbmQgb2YgbWV0YS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIG1ldGEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVtZXRhLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVtZXRhLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLSAgICAgIGh0dHAtZXF1aXYgICBOTVRPS0VOICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIG5hbWUgICAgICAgICBOTVRPS0VOICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNvbnRlbnQgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICBzY2hlbWUgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBtZXRhLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLW1ldGEtMS5tb2QgLS0+Ci0KLQotPCEtLSBCYXNlIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1iYXNlLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzZSBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJhc2UtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQmFzZSBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmFzZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzZSBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmFzZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCYXNlIGVsZW1lbnQKLQotICAgICAgICBiYXNlCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGJhc2UgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywKLSAgICAgdXNlZCB0byBkZWZpbmUgYSBiYXNlIFVSSSBhZ2FpbnN0IHdoaWNoIHJlbGF0aXZlIFVSSXMgaW4gdGhlCi0gICAgIGRvY3VtZW50IHdpbGwgYmUgcmVzb2x2ZWQuCi0KLSAgICAgTm90ZSB0aGF0IHRoaXMgbW9kdWxlIGFsc28gcmVkZWNsYXJlcyB0aGUgY29udGVudCBtb2RlbCBmb3IKLSAgICAgdGhlIGhlYWQgZWxlbWVudCB0byBpbmNsdWRlIHRoZSBiYXNlIGVsZW1lbnQuCi0tLT4KLQotPCEtLSBiYXNlOiBEb2N1bWVudCBCYXNlIFVSSSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgYmFzZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJhc2UuZWxlbWVudDtbCi08IUVOVElUWSAlIGJhc2UuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIGJhc2UucW5hbWUgICJiYXNlIiA+Ci08IUVMRU1FTlQgJWJhc2UucW5hbWU7ICAlYmFzZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBiYXNlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYmFzZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJhc2UuYXR0bGlzdDtbCi08IUFUVExJU1QgJWJhc2UucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgaHJlZiAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjUkVRVUlSRUQKLT4KLTwhLS0gZW5kIG9mIGJhc2UuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoZWFkLmNvbnRlbnQKLSAgICAiKCAlSGVhZE9wdHMubWl4OywKLSAgICAgKCAoICV0aXRsZS5xbmFtZTssICVIZWFkT3B0cy5taXg7LCAoICViYXNlLnFuYW1lOywgJUhlYWRPcHRzLm1peDsgKT8gKQotICAgICB8ICggJWJhc2UucW5hbWU7LCAlSGVhZE9wdHMubWl4OywgKCAldGl0bGUucW5hbWU7LCAlSGVhZE9wdHMubWl4OyApKSkpIgotPgotCi08IS0tIGVuZCBvZiB4aHRtbC1iYXNlLTEubW9kIC0tPgotCi0KLTwhLS0gU3R5bGVzaGVldHMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtc3R5bGUubW9kIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBTdHlsZSBTaGVldHMgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc3R5bGUtMS5tb2QiPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBEb2N1bWVudCBTdHlsZSBTaGVldCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1zdHlsZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIFN0eWxlIFNoZWV0cyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXN0eWxlLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFN0eWxlIFNoZWV0cwotCi0gICAgICAgIHN0eWxlCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIHN0eWxlIGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsCi0gICAgIHVzZWQgdG8gZW1iZWQgc3R5bGUgc2hlZXQgaW5mb3JtYXRpb24gaW4gdGhlIGRvY3VtZW50IGhlYWQgZWxlbWVudC4KLS0tPgotCi08IS0tIHN0eWxlOiBTdHlsZSBTaGVldCBJbmZvcm1hdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBzdHlsZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXN0eWxlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzdHlsZS5jb250ZW50ICAiKCAjUENEQVRBICkiID4KLTwhRU5USVRZICUgc3R5bGUucW5hbWUgICJzdHlsZSIgPgotPCFFTEVNRU5UICVzdHlsZS5xbmFtZTsgICVzdHlsZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzdHlsZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHN0eWxlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3R5bGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJXN0eWxlLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICV0aXRsZS5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNSRVFVSVJFRAotICAgICAgbWVkaWEgICAgICAgICVNZWRpYURlc2MuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgeG1sOnNwYWNlICAgICggcHJlc2VydmUgKSAgICAgICAgICAgICAjRklYRUQgJ3ByZXNlcnZlJwotPgotPCEtLSBlbmQgb2Ygc3R5bGUuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtc3R5bGUtMS5tb2QgLS0+Ci0KLQotPCEtLSBQYXJhbSBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1wYXJhbS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFBhcmFtIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtcGFyYW0tMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgUGFyYW0gRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXBhcmFtLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBQYXJhbSBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtcGFyYW0tMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gUGFyYW1ldGVycyBmb3IgSmF2YSBBcHBsZXRzIGFuZCBFbWJlZGRlZCBPYmplY3RzCi0KLSAgICAgICAgcGFyYW0KLQotICAgICBUaGlzIG1vZHVsZSBwcm92aWRlcyBkZWNsYXJhdGlvbnMgZm9yIHRoZSBwYXJhbSBlbGVtZW50LAotICAgICB1c2VkIHRvIHByb3ZpZGUgbmFtZWQgcHJvcGVydHkgdmFsdWVzIGZvciB0aGUgYXBwbGV0Ci0gICAgIGFuZCBvYmplY3QgZWxlbWVudHMuCi0tLT4KLQotPCEtLSBwYXJhbTogTmFtZWQgUHJvcGVydHkgVmFsdWUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgcGFyYW0uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVwYXJhbS5lbGVtZW50O1sKLTwhRU5USVRZICUgcGFyYW0uY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIHBhcmFtLnFuYW1lICAicGFyYW0iID4KLTwhRUxFTUVOVCAlcGFyYW0ucW5hbWU7ICAlcGFyYW0uY29udGVudDsgPgotPCEtLSBlbmQgb2YgcGFyYW0uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwYXJhbS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXBhcmFtLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVwYXJhbS5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAlaWQuYXR0cmliOwotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIHZhbHVlICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHZhbHVldHlwZSAgICAoIGRhdGEgfCByZWYgfCBvYmplY3QgKSAgJ2RhdGEnCi0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBwYXJhbS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1wYXJhbS0xLm1vZCAtLT4KLQotCi08IS0tIEVtYmVkZGVkIE9iamVjdCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLW9iamVjdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEVtYmVkZGVkIE9iamVjdCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1vYmplY3QtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgRW1iZWRkZWQgT2JqZWN0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtb2JqZWN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBFbWJlZGRlZCBPYmplY3QgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1vYmplY3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gRW1iZWRkZWQgT2JqZWN0cwotCi0gICAgICAgIG9iamVjdAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBvYmplY3QgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywgdXNlZAotICAgICB0byBlbWJlZCBleHRlcm5hbCBvYmplY3RzIGFzIHBhcnQgb2YgWEhUTUwgcGFnZXMuIEluIHRoZSBkb2N1bWVudCwKLSAgICAgcGxhY2UgcGFyYW0gZWxlbWVudHMgcHJpb3IgdG8gb3RoZXIgY29udGVudCB3aXRoaW4gdGhlIG9iamVjdCBlbGVtZW50LgotCi0gICAgIE5vdGUgdGhhdCB1c2Ugb2YgdGhpcyBtb2R1bGUgcmVxdWlyZXMgaW5zdGFudGlhdGlvbiBvZiB0aGUgUGFyYW0KLSAgICAgRWxlbWVudCBNb2R1bGUuCi0tLT4KLQotPCEtLSBvYmplY3Q6IEdlbmVyaWMgRW1iZWRkZWQgT2JqZWN0IC4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgb2JqZWN0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslb2JqZWN0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBvYmplY3QuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyB8ICVwYXJhbS5xbmFtZTsgKSoiCi0+Ci08IUVOVElUWSAlIG9iamVjdC5xbmFtZSAgIm9iamVjdCIgPgotPCFFTEVNRU5UICVvYmplY3QucW5hbWU7ICAlb2JqZWN0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG9iamVjdC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIG9iamVjdC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJW9iamVjdC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlb2JqZWN0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBkZWNsYXJlICAgICAgKCBkZWNsYXJlICkgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjbGFzc2lkICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjb2RlYmFzZSAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBkYXRhICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICBjb2RldHlwZSAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICBhcmNoaXZlICAgICAgJVVSSXMuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICBzdGFuZGJ5ICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICBoZWlnaHQgICAgICAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICB3aWR0aCAgICAgICAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB0YWJpbmRleCAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBvYmplY3QuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtb2JqZWN0LTEubW9kIC0tPgotCi0KLTwhLS0gRG9jdW1lbnQgU3RydWN0dXJlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtc3RydWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRG9jdW1lbnQgU3RydWN0dXJlIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXN0cnVjdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBTdHJ1Y3R1cmUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1zdHJ1Y3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIERvY3VtZW50IFN0cnVjdHVyZSAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXN0cnVjdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBEb2N1bWVudCBTdHJ1Y3R1cmUKLQotICAgICAgICB0aXRsZSwgaGVhZCwgYm9keSwgaHRtbAotCi0gICAgIFRoZSBTdHJ1Y3R1cmUgTW9kdWxlIGRlZmluZXMgdGhlIG1ham9yIHN0cnVjdHVyYWwgZWxlbWVudHMgYW5kCi0gICAgIHRoZWlyIGF0dHJpYnV0ZXMuCi0KLSAgICAgTm90ZSB0aGF0IHRoZSBjb250ZW50IG1vZGVsIG9mIHRoZSBoZWFkIGVsZW1lbnQgdHlwZSBpcyByZWRlY2xhcmVkCi0gICAgIHdoZW4gdGhlIEJhc2UgTW9kdWxlIGlzIGluY2x1ZGVkIGluIHRoZSBEVEQuCi0KLSAgICAgVGhlIHBhcmFtZXRlciBlbnRpdHkgY29udGFpbmluZyB0aGUgWE1MIG5hbWVzcGFjZSBVUkkgdmFsdWUgdXNlZAotICAgICBmb3IgWEhUTUwgaXMgJyVYSFRNTC54bWxuczsnLCBkZWZpbmVkIGluIHRoZSBRdWFsaWZpZWQgTmFtZXMgbW9kdWxlLgotLS0+Ci0KLTwhLS0gdGl0bGU6IERvY3VtZW50IFRpdGxlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFRoZSB0aXRsZSBlbGVtZW50IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGZsb3cgb2YgdGV4dC4KLSAgICAgSXQgc2hvdWxkIGJlIGRpc3BsYXllZCwgZm9yIGV4YW1wbGUgYXMgdGhlIHBhZ2UgaGVhZGVyIG9yCi0gICAgIHdpbmRvdyB0aXRsZS4gRXhhY3RseSBvbmUgdGl0bGUgaXMgcmVxdWlyZWQgcGVyIGRvY3VtZW50LgotLS0+Ci0KLTwhRU5USVRZICUgdGl0bGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0aXRsZS5lbGVtZW50O1sKLTwhRU5USVRZICUgdGl0bGUuY29udGVudCAgIiggI1BDREFUQSApIiA+Ci08IUVOVElUWSAlIHRpdGxlLnFuYW1lICAidGl0bGUiID4KLTwhRUxFTUVOVCAldGl0bGUucW5hbWU7ICAldGl0bGUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGl0bGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0aXRsZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRpdGxlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0aXRsZS5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0aXRsZS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGhlYWQ6IERvY3VtZW50IEhlYWQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBoZWFkLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaGVhZC5lbGVtZW50O1sKLTwhRU5USVRZICUgaGVhZC5jb250ZW50Ci0gICAgIiggJUhlYWRPcHRzLm1peDssICV0aXRsZS5xbmFtZTssICVIZWFkT3B0cy5taXg7ICkiCi0+Ci08IUVOVElUWSAlIGhlYWQucW5hbWUgICJoZWFkIiA+Ci08IUVMRU1FTlQgJWhlYWQucW5hbWU7ICAlaGVhZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoZWFkLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaGVhZC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWhlYWQuYXR0bGlzdDtbCi08IS0tIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIHdpdGggZG9jdW1lbnQgcHJvZmlsZXMKLS0tPgotPCFFTlRJVFkgJSBwcm9maWxlLmF0dHJpYgotICAgICAicHJvZmlsZSAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAnJVhIVE1MLnByb2ZpbGU7JyIKLT4KLQotPCFBVFRMSVNUICVoZWFkLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLSAgICAgICVwcm9maWxlLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGhlYWQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBib2R5OiBEb2N1bWVudCBCb2R5IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgYm9keS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJvZHkuZWxlbWVudDtbCi08IUVOVElUWSAlIGJvZHkuY29udGVudAotICAgICAiKCAlQmxvY2subWl4OyApKyIKLT4KLTwhRU5USVRZICUgYm9keS5xbmFtZSAgImJvZHkiID4KLTwhRUxFTUVOVCAlYm9keS5xbmFtZTsgICVib2R5LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJvZHkuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBib2R5LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYm9keS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYm9keS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYm9keS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGh0bWw6IFhIVE1MIERvY3VtZW50IEVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBodG1sLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaHRtbC5lbGVtZW50O1sKLTwhRU5USVRZICUgaHRtbC5jb250ZW50ICAiKCAlaGVhZC5xbmFtZTssICVib2R5LnFuYW1lOyApIiA+Ci08IUVOVElUWSAlIGh0bWwucW5hbWUgICJodG1sIiA+Ci08IUVMRU1FTlQgJWh0bWwucW5hbWU7ICAlaHRtbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBodG1sLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaHRtbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWh0bWwuYXR0bGlzdDtbCi08IS0tIHZlcnNpb24gYXR0cmlidXRlIHZhbHVlIGRlZmluZWQgaW4gZHJpdmVyCi0tLT4KLTwhRU5USVRZICUgWEhUTUwudmVyc2lvbi5hdHRyaWIKLSAgICAgInZlcnNpb24gICAgICAlRlBJLmRhdGF0eXBlOyAgICAgICAgICAgI0ZJWEVEICclWEhUTUwudmVyc2lvbjsnIgotPgotCi08IS0tIHNlZSB0aGUgUXVhbGlmaWVkIE5hbWVzIG1vZHVsZSBmb3IgaW5mb3JtYXRpb24KLSAgICAgb24gaG93IHRvIGV4dGVuZCBYSFRNTCB1c2luZyBYTUwgbmFtZXNwYWNlcwotLS0+Ci08IUFUVExJU1QgJWh0bWwucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJVhIVE1MLnZlcnNpb24uYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaHRtbC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1zdHJ1Y3QtMS5tb2QgLS0+Ci0KLQotPCEtLSBCbG9jayBQcmVzZW50YXRpb24gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtYmxrcHJlcy5tb2QgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFByZXNlbnRhdGlvbiAxLjAvL0VOIgotIAkJImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1ibGtwcmVzLTEubW9kIj4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQmxvY2sgUHJlc2VudGF0aW9uIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmxrcHJlcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgUHJlc2VudGF0aW9uIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmxrcHJlcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCbG9jayBQcmVzZW50YXRpb25hbCBFbGVtZW50cwotCi0gICAgICAgIGhyCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIHVzZWQgdG8KLSAgICAgc3VwcG9ydCBibG9jay1sZXZlbCBwcmVzZW50YXRpb25hbCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSBoci5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWhyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoci5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgaHIucW5hbWUgICJociIgPgotPCFFTEVNRU5UICVoci5xbmFtZTsgICVoci5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoci5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGhyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaHIuYXR0bGlzdDtbCi08IUFUVExJU1QgJWhyLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoci5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1ibGtwcmVzLTEubW9kIC0tPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAKLQlJbmxpbmUgUHJlc2VudGF0aW9uOiBiLCBiaWcsIGksIHNtYWxsCQkKLS0tPgotPCFFTlRJVFkgJSBzdWIuZWxlbWVudCAiSUdOT1JFIj4KLTwhRU5USVRZICUgc3ViLmF0dGxpc3QgIklHTk9SRSI+Ci08IUVOVElUWSAlIHN1cC5lbGVtZW50ICJJR05PUkUiPgotPCFFTlRJVFkgJSBzdXAuYXR0bGlzdCAiSUdOT1JFIj4KLTwhRU5USVRZICUgdHQuZWxlbWVudCAiSUdOT1JFIj4KLTwhRU5USVRZICUgdHQuYXR0bGlzdCAiSUdOT1JFIj4KLTwhRU5USVRZICUgeGh0bWwtaW5scHJlcy5tb2QgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBQcmVzZW50YXRpb24gMS4wLy9FTiIKLQkJImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbmxwcmVzLTEubW9kIj4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW5saW5lIFByZXNlbnRhdGlvbiBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaW5scHJlcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFByZXNlbnRhdGlvbiAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWlubHByZXMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW5saW5lIFByZXNlbnRhdGlvbmFsIEVsZW1lbnRzCi0KLSAgICAgICAgYiwgYmlnLCBpLCBzbWFsbCwgc3ViLCBzdXAsIHR0Ci0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIHVzZWQgdG8KLSAgICAgc3VwcG9ydCBpbmxpbmUtbGV2ZWwgcHJlc2VudGF0aW9uYWwgbWFya3VwLgotLS0+Ci0KLTwhRU5USVRZICUgYi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWIuZWxlbWVudDtbCi08IUVOVElUWSAlIGIuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBiLnFuYW1lICAiYiIgPgotPCFFTEVNRU5UICViLnFuYW1lOyAgJWIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyViLmF0dGxpc3Q7WwotPCFBVFRMSVNUICViLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBiLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgYmlnLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYmlnLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBiaWcuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBiaWcucW5hbWUgICJiaWciID4KLTwhRUxFTUVOVCAlYmlnLnFuYW1lOyAgJWJpZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBiaWcuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBiaWcuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyViaWcuYXR0bGlzdDtbCi08IUFUVExJU1QgJWJpZy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYmlnLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWkuZWxlbWVudDtbCi08IUVOVElUWSAlIGkuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBpLnFuYW1lICAiaSIgPgotPCFFTEVNRU5UICVpLnFuYW1lOyAgJWkuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGkuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVpLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVpLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBpLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgc21hbGwuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzbWFsbC5lbGVtZW50O1sKLTwhRU5USVRZICUgc21hbGwuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBzbWFsbC5xbmFtZSAgInNtYWxsIiA+Ci08IUVMRU1FTlQgJXNtYWxsLnFuYW1lOyAgJXNtYWxsLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHNtYWxsLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc21hbGwuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzbWFsbC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc21hbGwucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHNtYWxsLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3ViLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc3ViLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzdWIuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBzdWIucW5hbWUgICJzdWIiID4KLTwhRUxFTUVOVCAlc3ViLnFuYW1lOyAgJXN1Yi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzdWIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzdWIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzdWIuYXR0bGlzdDtbCi08IUFUVExJU1QgJXN1Yi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc3ViLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3VwLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc3VwLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzdXAuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBzdXAucW5hbWUgICJzdXAiID4KLTwhRUxFTUVOVCAlc3VwLnFuYW1lOyAgJXN1cC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzdXAuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzdXAuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzdXAuYXR0bGlzdDtbCi08IUFUVExJU1QgJXN1cC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc3VwLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgdHQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0dC5lbGVtZW50O1sKLTwhRU5USVRZICUgdHQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSB0dC5xbmFtZSAgInR0IiA+Ci08IUVMRU1FTlQgJXR0LnFuYW1lOyAgJXR0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHR0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdHQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0dC5hdHRsaXN0O1sKLTwhQVRUTElTVCAldHQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHR0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWlubHByZXMtMS5tb2QgLS0+Ci0KLQotPCEtLSBlbmQgb2YgWEhUTUwgTW9iaWxlIDEuMCBEVEQgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLXNwZWNpYWwuZW50IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLXNwZWNpYWwuZW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjcwOWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1zcGVjaWFsLmVudAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhLS0gU3BlY2lhbCBjaGFyYWN0ZXJzIGZvciBIVE1MIC0tPgotCi08IS0tIENoYXJhY3RlciBlbnRpdHkgc2V0LiBUeXBpY2FsIGludm9jYXRpb246Ci0gICAgIDwhRU5USVRZICUgSFRNTHNwZWNpYWwgUFVCTElDCi0gICAgICAgICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwtc3BlY2lhbC5lbnQiPgotICAgICAlSFRNTHNwZWNpYWw7Ci0tLT4KLQotPCEtLSBQb3J0aW9ucyAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2OgotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGgKLSAgICAgY29uZm9ybWluZyBTR01MIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluCi0gICAgIElTTyA4ODc5LCBwcm92aWRlZCB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzLgotLS0+Ci0KLTwhLS0gUmVsZXZhbnQgSVNPIGVudGl0eSBzZXQgaXMgZ2l2ZW4gdW5sZXNzIG5hbWVzIGFyZSBuZXdseSBpbnRyb2R1Y2VkLgotICAgICBOZXcgbmFtZXMgKGkuZS4sIG5vdCBpbiBJU08gODg3OSBsaXN0KSBkbyBub3QgY2xhc2ggd2l0aCBhbnkKLSAgICAgZXhpc3RpbmcgSVNPIDg4NzkgZW50aXR5IG5hbWVzLiBJU08gMTA2NDYgY2hhcmFjdGVyIG51bWJlcnMKLSAgICAgYXJlIGdpdmVuIGZvciBlYWNoIGNoYXJhY3RlciwgaW4gaGV4LiB2YWx1ZXMgYXJlIGRlY2ltYWwKLSAgICAgY29udmVyc2lvbnMgb2YgdGhlIElTTyAxMDY0NiB2YWx1ZXMgYW5kIHJlZmVyIHRvIHRoZSBkb2N1bWVudAotICAgICBjaGFyYWN0ZXIgc2V0LiBOYW1lcyBhcmUgVW5pY29kZSBuYW1lcy4gCi0tLT4KLQotPCEtLSBDMCBDb250cm9scyBhbmQgQmFzaWMgTGF0aW4gLS0+Ci08IUVOVElUWSBxdW90ICAgICImIzM0OyI+IDwhLS0gIHF1b3RhdGlvbiBtYXJrID0gQVBMIHF1b3RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMDIyIElTT251bSAtLT4KLTwhRU5USVRZIGFtcCAgICAgIiYjMzg7IzM4OyI+IDwhLS0gIGFtcGVyc2FuZCwgVSswMDI2IElTT251bSAtLT4KLTwhRU5USVRZIGx0ICAgICAgIiYjMzg7IzYwOyI+IDwhLS0gIGxlc3MtdGhhbiBzaWduLCBVKzAwM0MgSVNPbnVtIC0tPgotPCFFTlRJVFkgZ3QgICAgICAiJiM2MjsiPiA8IS0tICBncmVhdGVyLXRoYW4gc2lnbiwgVSswMDNFIElTT251bSAtLT4KLTwhRU5USVRZIGFwb3MJICImIzM5OyI+IDwhLS0gIGFwb3N0cm9waGUgbWFyaywgVSswMDI3IElTT251bSAtLT4KLQotPCEtLSBMYXRpbiBFeHRlbmRlZC1BIC0tPgotPCFFTlRJVFkgT0VsaWcgICAiJiMzMzg7Ij4gPCEtLSAgbGF0aW4gY2FwaXRhbCBsaWdhdHVyZSBPRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE1MiBJU09sYXQyIC0tPgotPCFFTlRJVFkgb2VsaWcgICAiJiMzMzk7Ij4gPCEtLSAgbGF0aW4gc21hbGwgbGlnYXR1cmUgb2UsIFUrMDE1MyBJU09sYXQyIC0tPgotPCEtLSBsaWdhdHVyZSBpcyBhIG1pc25vbWVyLCB0aGlzIGlzIGEgc2VwYXJhdGUgY2hhcmFjdGVyIGluIHNvbWUgbGFuZ3VhZ2VzIC0tPgotPCFFTlRJVFkgU2Nhcm9uICAiJiMzNTI7Ij4gPCEtLSAgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgUyB3aXRoIGNhcm9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTYwIElTT2xhdDIgLS0+Ci08IUVOVElUWSBzY2Fyb24gICImIzM1MzsiPiA8IS0tICBsYXRpbiBzbWFsbCBsZXR0ZXIgcyB3aXRoIGNhcm9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTYxIElTT2xhdDIgLS0+Ci08IUVOVElUWSBZdW1sICAgICImIzM3NjsiPiA8IS0tICBsYXRpbiBjYXBpdGFsIGxldHRlciBZIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTc4IElTT2xhdDIgLS0+Ci0KLTwhLS0gU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzIC0tPgotPCFFTlRJVFkgY2lyYyAgICAiJiM3MTA7Ij4gPCEtLSAgbW9kaWZpZXIgbGV0dGVyIGNpcmN1bWZsZXggYWNjZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMkM2IElTT3B1YiAtLT4KLTwhRU5USVRZIHRpbGRlICAgIiYjNzMyOyI+IDwhLS0gIHNtYWxsIHRpbGRlLCBVKzAyREMgSVNPZGlhIC0tPgotCi08IS0tIEdlbmVyYWwgUHVuY3R1YXRpb24gLS0+Ci08IUVOVElUWSBlbnNwICAgICImIzgxOTQ7Ij4gPCEtLSBlbiBzcGFjZSwgVSsyMDAyIElTT3B1YiAtLT4KLTwhRU5USVRZIGVtc3AgICAgIiYjODE5NTsiPiA8IS0tIGVtIHNwYWNlLCBVKzIwMDMgSVNPcHViIC0tPgotPCFFTlRJVFkgdGhpbnNwICAiJiM4MjAxOyI+IDwhLS0gdGhpbiBzcGFjZSwgVSsyMDA5IElTT3B1YiAtLT4KLTwhRU5USVRZIHp3bmogICAgIiYjODIwNDsiPiA8IS0tIHplcm8gd2lkdGggbm9uLWpvaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAwQyBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSB6d2ogICAgICImIzgyMDU7Ij4gPCEtLSB6ZXJvIHdpZHRoIGpvaW5lciwgVSsyMDBEIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIGxybSAgICAgIiYjODIwNjsiPiA8IS0tIGxlZnQtdG8tcmlnaHQgbWFyaywgVSsyMDBFIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIHJsbSAgICAgIiYjODIwNzsiPiA8IS0tIHJpZ2h0LXRvLWxlZnQgbWFyaywgVSsyMDBGIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIG5kYXNoICAgIiYjODIxMTsiPiA8IS0tIGVuIGRhc2gsIFUrMjAxMyBJU09wdWIgLS0+Ci08IUVOVElUWSBtZGFzaCAgICImIzgyMTI7Ij4gPCEtLSBlbSBkYXNoLCBVKzIwMTQgSVNPcHViIC0tPgotPCFFTlRJVFkgbHNxdW8gICAiJiM4MjE2OyI+IDwhLS0gbGVmdCBzaW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMTggSVNPbnVtIC0tPgotPCFFTlRJVFkgcnNxdW8gICAiJiM4MjE3OyI+IDwhLS0gcmlnaHQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDE5IElTT251bSAtLT4KLTwhRU5USVRZIHNicXVvICAgIiYjODIxODsiPiA8IS0tIHNpbmdsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFBIE5FVyAtLT4KLTwhRU5USVRZIGxkcXVvICAgIiYjODIyMDsiPiA8IS0tIGxlZnQgZG91YmxlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDFDIElTT251bSAtLT4KLTwhRU5USVRZIHJkcXVvICAgIiYjODIyMTsiPiA8IS0tIHJpZ2h0IGRvdWJsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxRCBJU09udW0gLS0+Ci08IUVOVElUWSBiZHF1byAgICImIzgyMjI7Ij4gPCEtLSBkb3VibGUgbG93LTkgcXVvdGF0aW9uIG1hcmssIFUrMjAxRSBORVcgLS0+Ci08IUVOVElUWSBkYWdnZXIgICImIzgyMjQ7Ij4gPCEtLSBkYWdnZXIsIFUrMjAyMCBJU09wdWIgLS0+Ci08IUVOVElUWSBEYWdnZXIgICImIzgyMjU7Ij4gPCEtLSBkb3VibGUgZGFnZ2VyLCBVKzIwMjEgSVNPcHViIC0tPgotPCFFTlRJVFkgcGVybWlsICAiJiM4MjQwOyI+IDwhLS0gcGVyIG1pbGxlIHNpZ24sIFUrMjAzMCBJU090ZWNoIC0tPgotPCFFTlRJVFkgbHNhcXVvICAiJiM4MjQ5OyI+IDwhLS0gc2luZ2xlIGxlZnQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMzkgSVNPIHByb3Bvc2VkIC0tPgotPCEtLSBsc2FxdW8gaXMgcHJvcG9zZWQgYnV0IG5vdCB5ZXQgSVNPIHN0YW5kYXJkaXplZCAtLT4KLTwhRU5USVRZIHJzYXF1byAgIiYjODI1MDsiPiA8IS0tIHNpbmdsZSByaWdodC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzQSBJU08gcHJvcG9zZWQgLS0+Ci08IS0tIHJzYXF1byBpcyBwcm9wb3NlZCBidXQgbm90IHlldCBJU08gc3RhbmRhcmRpemVkIC0tPgotPCFFTlRJVFkgZXVybyAgICImIzgzNjQ7Ij4gPCEtLSAgZXVybyBzaWduLCBVKzIwQUMgTkVXIC0tPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLXN5bWJvbC5lbnQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtc3ltYm9sLmVudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmODc2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtc3ltYm9sLmVudAorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi08IS0tIE1hdGhlbWF0aWNhbCwgR3JlZWsgYW5kIFN5bWJvbGljIGNoYXJhY3RlcnMgZm9yIEhUTUwgLS0+Ci0KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICAgPCFFTlRJVFkgJSBIVE1Mc3ltYm9sIFBVQkxJQwotICAgICAgICAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLXN5bWJvbC5lbnQiPgotICAgICAlSFRNTHN5bWJvbDsKLS0tPgotCi08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLQotPCEtLSBSZWxldmFudCBJU08gZW50aXR5IHNldCBpcyBnaXZlbiB1bmxlc3MgbmFtZXMgYXJlIG5ld2x5IGludHJvZHVjZWQuCi0gICAgIE5ldyBuYW1lcyAoaS5lLiwgbm90IGluIElTTyA4ODc5IGxpc3QpIGRvIG5vdCBjbGFzaCB3aXRoIGFueQotICAgICBleGlzdGluZyBJU08gODg3OSBlbnRpdHkgbmFtZXMuIElTTyAxMDY0NiBjaGFyYWN0ZXIgbnVtYmVycwotICAgICBhcmUgZ2l2ZW4gZm9yIGVhY2ggY2hhcmFjdGVyLCBpbiBoZXguIHZhbHVlcyBhcmUgZGVjaW1hbAotICAgICBjb252ZXJzaW9ucyBvZiB0aGUgSVNPIDEwNjQ2IHZhbHVlcyBhbmQgcmVmZXIgdG8gdGhlIGRvY3VtZW50Ci0gICAgIGNoYXJhY3RlciBzZXQuIE5hbWVzIGFyZSBVbmljb2RlIG5hbWVzLiAKLS0tPgotCi08IS0tIExhdGluIEV4dGVuZGVkLUIgLS0+Ci08IUVOVElUWSBmbm9mICAgICAiJiM0MDI7Ij4gPCEtLSBsYXRpbiBzbWFsbCBmIHdpdGggaG9vayA9IGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZsb3JpbiwgVSswMTkyIElTT3RlY2ggLS0+Ci0KLTwhLS0gR3JlZWsgLS0+Ci08IUVOVElUWSBBbHBoYSAgICAiJiM5MTM7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBhbHBoYSwgVSswMzkxIC0tPgotPCFFTlRJVFkgQmV0YSAgICAgIiYjOTE0OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgYmV0YSwgVSswMzkyIC0tPgotPCFFTlRJVFkgR2FtbWEgICAgIiYjOTE1OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZ2FtbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOTMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIERlbHRhICAgICImIzkxNjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzk0IElTT2dyazMgLS0+Ci08IUVOVElUWSBFcHNpbG9uICAiJiM5MTc7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBlcHNpbG9uLCBVKzAzOTUgLS0+Ci08IUVOVElUWSBaZXRhICAgICAiJiM5MTg7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB6ZXRhLCBVKzAzOTYgLS0+Ci08IUVOVElUWSBFdGEgICAgICAiJiM5MTk7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBldGEsIFUrMDM5NyAtLT4KLTwhRU5USVRZIFRoZXRhICAgICImIzkyMDsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHRoZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzk4IElTT2dyazMgLS0+Ci08IUVOVElUWSBJb3RhICAgICAiJiM5MjE7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBpb3RhLCBVKzAzOTkgLS0+Ci08IUVOVElUWSBLYXBwYSAgICAiJiM5MjI7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBrYXBwYSwgVSswMzlBIC0tPgotPCFFTlRJVFkgTGFtYmRhICAgIiYjOTIzOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbGFtYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzlCIElTT2dyazMgLS0+Ci08IUVOVElUWSBNdSAgICAgICAiJiM5MjQ7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBtdSwgVSswMzlDIC0tPgotPCFFTlRJVFkgTnUgICAgICAgIiYjOTI1OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbnUsIFUrMDM5RCAtLT4KLTwhRU5USVRZIFhpICAgICAgICImIzkyNjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHhpLCBVKzAzOUUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE9taWNyb24gICImIzkyNzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG9taWNyb24sIFUrMDM5RiAtLT4KLTwhRU5USVRZIFBpICAgICAgICImIzkyODsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBpLCBVKzAzQTAgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFJobyAgICAgICImIzkyOTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHJobywgVSswM0ExIC0tPgotPCEtLSB0aGVyZSBpcyBubyBTaWdtYWYsIGFuZCBubyBVKzAzQTIgY2hhcmFjdGVyIGVpdGhlciAtLT4KLTwhRU5USVRZIFNpZ21hICAgICImIzkzMTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHNpZ21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0EzIElTT2dyazMgLS0+Ci08IUVOVElUWSBUYXUgICAgICAiJiM5MzI7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB0YXUsIFUrMDNBNCAtLT4KLTwhRU5USVRZIFVwc2lsb24gICImIzkzMzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHVwc2lsb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFBoaSAgICAgICImIzkzNDsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBoaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBNiBJU09ncmszIC0tPgotPCFFTlRJVFkgQ2hpICAgICAgIiYjOTM1OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgY2hpLCBVKzAzQTcgLS0+Ci08IUVOVElUWSBQc2kgICAgICAiJiM5MzY7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBwc2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE9tZWdhICAgICImIzkzNzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG9tZWdhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E5IElTT2dyazMgLS0+Ci0KLTwhRU5USVRZIGFscGhhICAgICImIzk0NTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBhbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCMSBJU09ncmszIC0tPgotPCFFTlRJVFkgYmV0YSAgICAgIiYjOTQ2OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGJldGEsIFUrMDNCMiBJU09ncmszIC0tPgotPCFFTlRJVFkgZ2FtbWEgICAgIiYjOTQ3OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGdhbW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0IzIElTT2dyazMgLS0+Ci08IUVOVElUWSBkZWx0YSAgICAiJiM5NDg7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGVwc2lsb24gICImIzk0OTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBlcHNpbG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0I1IElTT2dyazMgLS0+Ci08IUVOVElUWSB6ZXRhICAgICAiJiM5NTA7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgemV0YSwgVSswM0I2IElTT2dyazMgLS0+Ci08IUVOVElUWSBldGEgICAgICAiJiM5NTE7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZXRhLCBVKzAzQjcgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHRoZXRhICAgICImIzk1MjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB0aGV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCOCBJU09ncmszIC0tPgotPCFFTlRJVFkgaW90YSAgICAgIiYjOTUzOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGlvdGEsIFUrMDNCOSBJU09ncmszIC0tPgotPCFFTlRJVFkga2FwcGEgICAgIiYjOTU0OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGthcHBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0JBIElTT2dyazMgLS0+Ci08IUVOVElUWSBsYW1iZGEgICAiJiM5NTU7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgbGFtYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0JCIElTT2dyazMgLS0+Ci08IUVOVElUWSBtdSAgICAgICAiJiM5NTY7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgbXUsIFUrMDNCQyBJU09ncmszIC0tPgotPCFFTlRJVFkgbnUgICAgICAgIiYjOTU3OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG51LCBVKzAzQkQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHhpICAgICAgICImIzk1ODsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB4aSwgVSswM0JFIElTT2dyazMgLS0+Ci08IUVOVElUWSBvbWljcm9uICAiJiM5NTk7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgb21pY3JvbiwgVSswM0JGIE5FVyAtLT4KLTwhRU5USVRZIHBpICAgICAgICImIzk2MDsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBwaSwgVSswM0MwIElTT2dyazMgLS0+Ci08IUVOVElUWSByaG8gICAgICAiJiM5NjE7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcmhvLCBVKzAzQzEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHNpZ21hZiAgICImIzk2MjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBmaW5hbCBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDMiBJU09ncmszIC0tPgotPCFFTlRJVFkgc2lnbWEgICAgIiYjOTYzOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHNpZ21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0MzIElTT2dyazMgLS0+Ci08IUVOVElUWSB0YXUgICAgICAiJiM5NjQ7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGF1LCBVKzAzQzQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHVwc2lsb24gICImIzk2NTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB1cHNpbG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0M1IElTT2dyazMgLS0+Ci08IUVOVElUWSBwaGkgICAgICAiJiM5NjY7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcGhpLCBVKzAzQzYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGNoaSAgICAgICImIzk2NzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBjaGksIFUrMDNDNyBJU09ncmszIC0tPgotPCFFTlRJVFkgcHNpICAgICAgIiYjOTY4OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBzaSwgVSswM0M4IElTT2dyazMgLS0+Ci08IUVOVElUWSBvbWVnYSAgICAiJiM5Njk7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgb21lZ2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzkgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHRoZXRhc3ltICImIzk3NzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB0aGV0YSBzeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzRDEgTkVXIC0tPgotPCFFTlRJVFkgdXBzaWggICAgIiYjOTc4OyI+IDwhLS0gZ3JlZWsgdXBzaWxvbiB3aXRoIGhvb2sgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0QyIE5FVyAtLT4KLTwhRU5USVRZIHBpdiAgICAgICImIzk4MjsiPiA8IS0tIGdyZWVrIHBpIHN5bWJvbCwgVSswM0Q2IElTT2dyazMgLS0+Ci0KLTwhLS0gR2VuZXJhbCBQdW5jdHVhdGlvbiAtLT4KLTwhRU5USVRZIGJ1bGwgICAgICImIzgyMjY7Ij4gPCEtLSBidWxsZXQgPSBibGFjayBzbWFsbCBjaXJjbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDIyIElTT3B1YiAgLS0+Ci08IS0tIGJ1bGxldCBpcyBOT1QgdGhlIHNhbWUgYXMgYnVsbGV0IG9wZXJhdG9yLCBVKzIyMTkgLS0+Ci08IUVOVElUWSBoZWxsaXAgICAiJiM4MjMwOyI+IDwhLS0gaG9yaXpvbnRhbCBlbGxpcHNpcyA9IHRocmVlIGRvdCBsZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDI2IElTT3B1YiAgLS0+Ci08IUVOVElUWSBwcmltZSAgICAiJiM4MjQyOyI+IDwhLS0gcHJpbWUgPSBtaW51dGVzID0gZmVldCwgVSsyMDMyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBQcmltZSAgICAiJiM4MjQzOyI+IDwhLS0gZG91YmxlIHByaW1lID0gc2Vjb25kcyA9IGluY2hlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMzMgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9saW5lICAgICImIzgyNTQ7Ij4gPCEtLSBvdmVybGluZSA9IHNwYWNpbmcgb3ZlcnNjb3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzRSBORVcgLS0+Ci08IUVOVElUWSBmcmFzbCAgICAiJiM4MjYwOyI+IDwhLS0gZnJhY3Rpb24gc2xhc2gsIFUrMjA0NCBORVcgLS0+Ci0KLTwhLS0gTGV0dGVybGlrZSBTeW1ib2xzIC0tPgotPCFFTlRJVFkgd2VpZXJwICAgIiYjODQ3MjsiPiA8IS0tIHNjcmlwdCBjYXBpdGFsIFAgPSBwb3dlciBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFdlaWVyc3RyYXNzIHAsIFUrMjExOCBJU09hbXNvIC0tPgotPCFFTlRJVFkgaW1hZ2UgICAgIiYjODQ2NTsiPiA8IS0tIGJsYWNrbGV0dGVyIGNhcGl0YWwgSSA9IGltYWdpbmFyeSBwYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjExMSBJU09hbXNvIC0tPgotPCFFTlRJVFkgcmVhbCAgICAgIiYjODQ3NjsiPiA8IS0tIGJsYWNrbGV0dGVyIGNhcGl0YWwgUiA9IHJlYWwgcGFydCBzeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMTFDIElTT2Ftc28gLS0+Ci08IUVOVElUWSB0cmFkZSAgICAiJiM4NDgyOyI+IDwhLS0gdHJhZGUgbWFyayBzaWduLCBVKzIxMjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgYWxlZnN5bSAgIiYjODUwMTsiPiA8IS0tIGFsZWYgc3ltYm9sID0gZmlyc3QgdHJhbnNmaW5pdGUgY2FyZGluYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMTM1IE5FVyAtLT4KLTwhLS0gYWxlZiBzeW1ib2wgaXMgTk9UIHRoZSBzYW1lIGFzIGhlYnJldyBsZXR0ZXIgYWxlZiwKLSAgICAgVSswNUQwIGFsdGhvdWdoIHRoZSBzYW1lIGdseXBoIGNvdWxkIGJlIHVzZWQgdG8gZGVwaWN0IGJvdGggY2hhcmFjdGVycyAtLT4KLQotPCEtLSBBcnJvd3MgLS0+Ci08IUVOVElUWSBsYXJyICAgICAiJiM4NTkyOyI+IDwhLS0gbGVmdHdhcmRzIGFycm93LCBVKzIxOTAgSVNPbnVtIC0tPgotPCFFTlRJVFkgdWFyciAgICAgIiYjODU5MzsiPiA8IS0tIHVwd2FyZHMgYXJyb3csIFUrMjE5MSBJU09udW0tLT4KLTwhRU5USVRZIHJhcnIgICAgICImIzg1OTQ7Ij4gPCEtLSByaWdodHdhcmRzIGFycm93LCBVKzIxOTIgSVNPbnVtIC0tPgotPCFFTlRJVFkgZGFyciAgICAgIiYjODU5NTsiPiA8IS0tIGRvd253YXJkcyBhcnJvdywgVSsyMTkzIElTT251bSAtLT4KLTwhRU5USVRZIGhhcnIgICAgICImIzg1OTY7Ij4gPCEtLSBsZWZ0IHJpZ2h0IGFycm93LCBVKzIxOTQgSVNPYW1zYSAtLT4KLTwhRU5USVRZIGNyYXJyICAgICImIzg2Mjk7Ij4gPCEtLSBkb3dud2FyZHMgYXJyb3cgd2l0aCBjb3JuZXIgbGVmdHdhcmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjYXJyaWFnZSByZXR1cm4sIFUrMjFCNSBORVcgLS0+Ci08IUVOVElUWSBsQXJyICAgICAiJiM4NjU2OyI+IDwhLS0gbGVmdHdhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQwIElTT3RlY2ggLS0+Ci08IS0tIFVuaWNvZGUgZG9lcyBub3Qgc2F5IHRoYXQgbEFyciBpcyB0aGUgc2FtZSBhcyB0aGUgJ2lzIGltcGxpZWQgYnknIGFycm93Ci0gICAgYnV0IGFsc28gZG9lcyBub3QgaGF2ZSBhbnkgb3RoZXIgY2hhcmFjdGVyIGZvciB0aGF0IGZ1bmN0aW9uLiBTbyA/IGxBcnIgY2FuCi0gICAgYmUgdXNlZCBmb3IgJ2lzIGltcGxpZWQgYnknIGFzIElTT3RlY2ggc3VnZ2VzdHMgLS0+Ci08IUVOVElUWSB1QXJyICAgICAiJiM4NjU3OyI+IDwhLS0gdXB3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMSBJU09hbXNhIC0tPgotPCFFTlRJVFkgckFyciAgICAgIiYjODY1ODsiPiA8IS0tIHJpZ2h0d2FyZHMgZG91YmxlIGFycm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjFEMiBJU090ZWNoIC0tPgotPCEtLSBVbmljb2RlIGRvZXMgbm90IHNheSB0aGlzIGlzIHRoZSAnaW1wbGllcycgY2hhcmFjdGVyIGJ1dCBkb2VzIG5vdCBoYXZlIAotICAgICBhbm90aGVyIGNoYXJhY3RlciB3aXRoIHRoaXMgZnVuY3Rpb24gc28gPwotICAgICByQXJyIGNhbiBiZSB1c2VkIGZvciAnaW1wbGllcycgYXMgSVNPdGVjaCBzdWdnZXN0cyAtLT4KLTwhRU5USVRZIGRBcnIgICAgICImIzg2NTk7Ij4gPCEtLSBkb3dud2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDMgSVNPYW1zYSAtLT4KLTwhRU5USVRZIGhBcnIgICAgICImIzg2NjA7Ij4gPCEtLSBsZWZ0IHJpZ2h0IGRvdWJsZSBhcnJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxRDQgSVNPYW1zYSAtLT4KLQotPCEtLSBNYXRoZW1hdGljYWwgT3BlcmF0b3JzIC0tPgotPCFFTlRJVFkgZm9yYWxsICAgIiYjODcwNDsiPiA8IS0tIGZvciBhbGwsIFUrMjIwMCBJU090ZWNoIC0tPgotPCFFTlRJVFkgcGFydCAgICAgIiYjODcwNjsiPiA8IS0tIHBhcnRpYWwgZGlmZmVyZW50aWFsLCBVKzIyMDIgSVNPdGVjaCAgLS0+Ci08IUVOVElUWSBleGlzdCAgICAiJiM4NzA3OyI+IDwhLS0gdGhlcmUgZXhpc3RzLCBVKzIyMDMgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGVtcHR5ICAgICImIzg3MDk7Ij4gPCEtLSBlbXB0eSBzZXQgPSBudWxsIHNldCA9IGRpYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIwNSBJU09hbXNvIC0tPgotPCFFTlRJVFkgbmFibGEgICAgIiYjODcxMTsiPiA8IS0tIG5hYmxhID0gYmFja3dhcmQgZGlmZmVyZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMDcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGlzaW4gICAgICImIzg3MTI7Ij4gPCEtLSBlbGVtZW50IG9mLCBVKzIyMDggSVNPdGVjaCAtLT4KLTwhRU5USVRZIG5vdGluICAgICImIzg3MTM7Ij4gPCEtLSBub3QgYW4gZWxlbWVudCBvZiwgVSsyMjA5IElTT3RlY2ggLS0+Ci08IUVOVElUWSBuaSAgICAgICAiJiM4NzE1OyI+IDwhLS0gY29udGFpbnMgYXMgbWVtYmVyLCBVKzIyMEIgSVNPdGVjaCAtLT4KLTwhLS0gc2hvdWxkIHRoZXJlIGJlIGEgbW9yZSBtZW1vcmFibGUgbmFtZSB0aGFuICduaSc/IC0tPgotPCFFTlRJVFkgcHJvZCAgICAgIiYjODcxOTsiPiA8IS0tIG4tYXJ5IHByb2R1Y3QgPSBwcm9kdWN0IHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjBGIElTT2Ftc2IgLS0+Ci08IS0tIHByb2QgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAzQTAgJ2dyZWVrIGNhcGl0YWwgbGV0dGVyIHBpJyB0aG91Z2gKLSAgICAgdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCBmb3IgYm90aCAtLT4KLTwhRU5USVRZIHN1bSAgICAgICImIzg3MjE7Ij4gPCEtLSBuLWFyeSBzdW1hdGlvbiwgVSsyMjExIElTT2Ftc2IgLS0+Ci08IS0tIHN1bSBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDNBMyAnZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgc2lnbWEnCi0gICAgIHRob3VnaCB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIGZvciBib3RoIC0tPgotPCFFTlRJVFkgbWludXMgICAgIiYjODcyMjsiPiA8IS0tIG1pbnVzIHNpZ24sIFUrMjIxMiBJU090ZWNoIC0tPgotPCFFTlRJVFkgbG93YXN0ICAgIiYjODcyNzsiPiA8IS0tIGFzdGVyaXNrIG9wZXJhdG9yLCBVKzIyMTcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHJhZGljICAgICImIzg3MzA7Ij4gPCEtLSBzcXVhcmUgcm9vdCA9IHJhZGljYWwgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMUEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHByb3AgICAgICImIzg3MzM7Ij4gPCEtLSBwcm9wb3J0aW9uYWwgdG8sIFUrMjIxRCBJU090ZWNoIC0tPgotPCFFTlRJVFkgaW5maW4gICAgIiYjODczNDsiPiA8IS0tIGluZmluaXR5LCBVKzIyMUUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGFuZyAgICAgICImIzg3MzY7Ij4gPCEtLSBhbmdsZSwgVSsyMjIwIElTT2Ftc28gLS0+Ci08IUVOVElUWSBhbmQgICAgICAiJiM4NzQzOyI+IDwhLS0gbG9naWNhbCBhbmQgPSB3ZWRnZSwgVSsyMjI3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBvciAgICAgICAiJiM4NzQ0OyI+IDwhLS0gbG9naWNhbCBvciA9IHZlZSwgVSsyMjI4IElTT3RlY2ggLS0+Ci08IUVOVElUWSBjYXAgICAgICAiJiM4NzQ1OyI+IDwhLS0gaW50ZXJzZWN0aW9uID0gY2FwLCBVKzIyMjkgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGN1cCAgICAgICImIzg3NDY7Ij4gPCEtLSB1bmlvbiA9IGN1cCwgVSsyMjJBIElTT3RlY2ggLS0+Ci08IUVOVElUWSBpbnQgICAgICAiJiM4NzQ3OyI+IDwhLS0gaW50ZWdyYWwsIFUrMjIyQiBJU090ZWNoIC0tPgotPCFFTlRJVFkgdGhlcmU0ICAgIiYjODc1NjsiPiA8IS0tIHRoZXJlZm9yZSwgVSsyMjM0IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzaW0gICAgICAiJiM4NzY0OyI+IDwhLS0gdGlsZGUgb3BlcmF0b3IgPSB2YXJpZXMgd2l0aCA9IHNpbWlsYXIgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjNDIElTT3RlY2ggLS0+Ci08IS0tIHRpbGRlIG9wZXJhdG9yIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgdGhlIHRpbGRlLCBVKzAwN0UsCi0gICAgIGFsdGhvdWdoIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgdG8gcmVwcmVzZW50IGJvdGggIC0tPgotPCFFTlRJVFkgY29uZyAgICAgIiYjODc3MzsiPiA8IS0tIGFwcHJveGltYXRlbHkgZXF1YWwgdG8sIFUrMjI0NSBJU090ZWNoIC0tPgotPCFFTlRJVFkgYXN5bXAgICAgIiYjODc3NjsiPiA8IS0tIGFsbW9zdCBlcXVhbCB0byA9IGFzeW1wdG90aWMgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjQ4IElTT2Ftc3IgLS0+Ci08IUVOVElUWSBuZSAgICAgICAiJiM4ODAwOyI+IDwhLS0gbm90IGVxdWFsIHRvLCBVKzIyNjAgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGVxdWl2ICAgICImIzg4MDE7Ij4gPCEtLSBpZGVudGljYWwgdG8sIFUrMjI2MSBJU090ZWNoIC0tPgotPCFFTlRJVFkgbGUgICAgICAgIiYjODgwNDsiPiA8IS0tIGxlc3MtdGhhbiBvciBlcXVhbCB0bywgVSsyMjY0IElTT3RlY2ggLS0+Ci08IUVOVElUWSBnZSAgICAgICAiJiM4ODA1OyI+IDwhLS0gZ3JlYXRlci10aGFuIG9yIGVxdWFsIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI2NSBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3ViICAgICAgIiYjODgzNDsiPiA8IS0tIHN1YnNldCBvZiwgVSsyMjgyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdXAgICAgICAiJiM4ODM1OyI+IDwhLS0gc3VwZXJzZXQgb2YsIFUrMjI4MyBJU090ZWNoIC0tPgotPCEtLSBub3RlIHRoYXQgbnN1cCwgJ25vdCBhIHN1cGVyc2V0IG9mLCBVKzIyODMnIGlzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBTeW1ib2wgCi0gICAgIGZvbnQgZW5jb2RpbmcgYW5kIGlzIG5vdCBpbmNsdWRlZC4gU2hvdWxkIGl0IGJlLCBmb3Igc3ltbWV0cnk/Ci0gICAgIEl0IGlzIGluIElTT2Ftc24gIC0tPiAKLTwhRU5USVRZIG5zdWIgICAgICImIzg4MzY7Ij4gPCEtLSBub3QgYSBzdWJzZXQgb2YsIFUrMjI4NCBJU09hbXNuIC0tPgotPCFFTlRJVFkgc3ViZSAgICAgIiYjODgzODsiPiA8IS0tIHN1YnNldCBvZiBvciBlcXVhbCB0bywgVSsyMjg2IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdXBlICAgICAiJiM4ODM5OyI+IDwhLS0gc3VwZXJzZXQgb2Ygb3IgZXF1YWwgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjg3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBvcGx1cyAgICAiJiM4ODUzOyI+IDwhLS0gY2lyY2xlZCBwbHVzID0gZGlyZWN0IHN1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyOTUgSVNPYW1zYiAtLT4KLTwhRU5USVRZIG90aW1lcyAgICImIzg4NTU7Ij4gPCEtLSBjaXJjbGVkIHRpbWVzID0gdmVjdG9yIHByb2R1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjk3IElTT2Ftc2IgLS0+Ci08IUVOVElUWSBwZXJwICAgICAiJiM4ODY5OyI+IDwhLS0gdXAgdGFjayA9IG9ydGhvZ29uYWwgdG8gPSBwZXJwZW5kaWN1bGFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjJBNSBJU090ZWNoIC0tPgotPCFFTlRJVFkgc2RvdCAgICAgIiYjODkwMTsiPiA8IS0tIGRvdCBvcGVyYXRvciwgVSsyMkM1IElTT2Ftc2IgLS0+Ci08IS0tIGRvdCBvcGVyYXRvciBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDBCNyBtaWRkbGUgZG90IC0tPgotCi08IS0tIE1pc2NlbGxhbmVvdXMgVGVjaG5pY2FsIC0tPgotPCFFTlRJVFkgbGNlaWwgICAgIiYjODk2ODsiPiA8IS0tIGxlZnQgY2VpbGluZyA9IGFwbCB1cHN0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMwOCBJU09hbXNjICAtLT4KLTwhRU5USVRZIHJjZWlsICAgICImIzg5Njk7Ij4gPCEtLSByaWdodCBjZWlsaW5nLCBVKzIzMDkgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSBsZmxvb3IgICAiJiM4OTcwOyI+IDwhLS0gbGVmdCBmbG9vciA9IGFwbCBkb3duc3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzBBIElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgcmZsb29yICAgIiYjODk3MTsiPiA8IS0tIHJpZ2h0IGZsb29yLCBVKzIzMEIgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSBsYW5nICAgICAiJiM5MDAxOyI+IDwhLS0gbGVmdC1wb2ludGluZyBhbmdsZSBicmFja2V0ID0gYnJhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMyOSBJU090ZWNoIC0tPgotPCEtLSBsYW5nIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMDNDICdsZXNzIHRoYW4nIAotICAgICBvciBVKzIwMzkgJ3NpbmdsZSBsZWZ0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrJyAtLT4KLTwhRU5USVRZIHJhbmcgICAgICImIzkwMDI7Ij4gPCEtLSByaWdodC1wb2ludGluZyBhbmdsZSBicmFja2V0ID0ga2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMyQSBJU090ZWNoIC0tPgotPCEtLSByYW5nIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMDNFICdncmVhdGVyIHRoYW4nIAotICAgICBvciBVKzIwM0EgJ3NpbmdsZSByaWdodC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaycgLS0+Ci0KLTwhLS0gR2VvbWV0cmljIFNoYXBlcyAtLT4KLTwhRU5USVRZIGxveiAgICAgICImIzk2NzQ7Ij4gPCEtLSBsb3plbmdlLCBVKzI1Q0EgSVNPcHViIC0tPgotCi08IS0tIE1pc2NlbGxhbmVvdXMgU3ltYm9scyAtLT4KLTwhRU5USVRZIHNwYWRlcyAgICImIzk4MjQ7Ij4gPCEtLSBibGFjayBzcGFkZSBzdWl0LCBVKzI2NjAgSVNPcHViIC0tPgotPCEtLSBibGFjayBoZXJlIHNlZW1zIHRvIG1lYW4gZmlsbGVkIGFzIG9wcG9zZWQgdG8gaG9sbG93IC0tPgotPCFFTlRJVFkgY2x1YnMgICAgIiYjOTgyNzsiPiA8IS0tIGJsYWNrIGNsdWIgc3VpdCA9IHNoYW1yb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjY2MyBJU09wdWIgLS0+Ci08IUVOVElUWSBoZWFydHMgICAiJiM5ODI5OyI+IDwhLS0gYmxhY2sgaGVhcnQgc3VpdCA9IHZhbGVudGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzI2NjUgSVNPcHViIC0tPgotPCFFTlRJVFkgZGlhbXMgICAgIiYjOTgzMDsiPiA8IS0tIGJsYWNrIGRpYW1vbmQgc3VpdCwgVSsyNjY2IElTT3B1YiAtLT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbDEtZnJhbWVzZXQuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sMS1mcmFtZXNldC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkM2Y3OTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sMS1mcmFtZXNldC5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjI1ICswLDAgQEAKLTwhLS0KLSAgIEV4dGVuc2libGUgSFRNTCB2ZXJzaW9uIDEuMCBGcmFtZXNldCBEVEQKLQotICAgVGhpcyBpcyB0aGUgc2FtZSBhcyBIVE1MIDQuMCBGcmFtZXNldCBleGNlcHQgZm9yCi0gICBjaGFuZ2VzIGR1ZSB0byB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBYTUwgYW5kIFNHTUwuCi0KLSAgIE5hbWVzcGFjZSA9IGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwKLQotICAgRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24sIHNlZTogaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxCi0KLSAgIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksCi0gICBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLQotICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBGcmFtZXNldC8vRU4iCi0gICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLWZyYW1lc2V0LmR0ZCIKLQotICAgJFJldmlzaW9uOiAxLjEgJAotICAgJERhdGU6IDIwMDcvMDUvMTUgMDI6NDI6MjIgJAotCi0tLT4KLQotPCEtLT09PT09PT09PT09PT09PT0gQ2hhcmFjdGVyIG1uZW1vbmljIGVudGl0aWVzID09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBIVE1MbGF0MSBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIExhdGluIDEgZm9yIFhIVE1MLy9FTiIKLSAgICJ4aHRtbC1sYXQxLmVudCI+Ci0lSFRNTGxhdDE7Ci0KLTwhRU5USVRZICUgSFRNTHN5bWJvbCBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMgZm9yIFhIVE1MLy9FTiIKLSAgICJ4aHRtbC1zeW1ib2wuZW50Ij4KLSVIVE1Mc3ltYm9sOwotCi08IUVOVElUWSAlIEhUTUxzcGVjaWFsIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbCBmb3IgWEhUTUwvL0VOIgotICAgInhodG1sLXNwZWNpYWwuZW50Ij4KLSVIVE1Mc3BlY2lhbDsKLQotPCEtLT09PT09PT09PT09PT09PT09PSBJbXBvcnRlZCBOYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBDb250ZW50VHlwZSAiQ0RBVEEiPgotICAgIDwhLS0gbWVkaWEgdHlwZSwgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLQotPCFFTlRJVFkgJSBDb250ZW50VHlwZXMgIkNEQVRBIj4KLSAgICA8IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIHR5cGVzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotCi08IUVOVElUWSAlIENoYXJzZXQgIkNEQVRBIj4KLSAgICA8IS0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotCi08IUVOVElUWSAlIENoYXJzZXRzICJDREFUQSI+Ci0gICAgPCEtLSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNoYXJhY3RlciBlbmNvZGluZ3MsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci0KLTwhRU5USVRZICUgTGFuZ3VhZ2VDb2RlICJOTVRPS0VOIj4KLSAgICA8IS0tIGEgbGFuZ3VhZ2UgY29kZSwgYXMgcGVyIFtSRkMxNzY2XSAtLT4KLQotPCFFTlRJVFkgJSBDaGFyYWN0ZXIgIkNEQVRBIj4KLSAgICA8IS0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gLS0+Ci0KLTwhRU5USVRZICUgTnVtYmVyICJDREFUQSI+Ci0gICAgPCEtLSBvbmUgb3IgbW9yZSBkaWdpdHMgLS0+Ci0KLTwhRU5USVRZICUgTGlua1R5cGVzICJDREFUQSI+Ci0gICAgPCEtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsaW5rIHR5cGVzIC0tPgotCi08IUVOVElUWSAlIE1lZGlhRGVzYyAiQ0RBVEEiPgotICAgIDwhLS0gc2luZ2xlIG9yIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIGRlc2NyaXB0b3JzIC0tPgotCi08IUVOVElUWSAlIFVSSSAiQ0RBVEEiPgotICAgIDwhLS0gYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIsIHNlZSBbUkZDMjM5Nl0gLS0+Ci0KLTwhRU5USVRZICUgVXJpTGlzdCAiQ0RBVEEiPgotICAgIDwhLS0gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzIC0tPgotCi08IUVOVElUWSAlIERhdGV0aW1lICJDREFUQSI+Ci0gICAgPCEtLSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uLiBJU08gZGF0ZSBmb3JtYXQgLS0+Ci0KLTwhRU5USVRZICUgU2NyaXB0ICJDREFUQSI+Ci0gICAgPCEtLSBzY3JpcHQgZXhwcmVzc2lvbiAtLT4KLQotPCFFTlRJVFkgJSBTdHlsZVNoZWV0ICJDREFUQSI+Ci0gICAgPCEtLSBzdHlsZSBzaGVldCBkYXRhIC0tPgotCi08IUVOVElUWSAlIFRleHQgIkNEQVRBIj4KLSAgICA8IS0tIHVzZWQgZm9yIHRpdGxlcyBldGMuIC0tPgotCi08IUVOVElUWSAlIEZyYW1lVGFyZ2V0ICJOTVRPS0VOIj4KLSAgICA8IS0tIHJlbmRlciBpbiB0aGlzIGZyYW1lIC0tPgotCi08IUVOVElUWSAlIExlbmd0aCAiQ0RBVEEiPgotICAgIDwhLS0gbm4gZm9yIHBpeGVscyBvciBubiUgZm9yIHBlcmNlbnRhZ2UgbGVuZ3RoIC0tPgotCi08IUVOVElUWSAlIE11bHRpTGVuZ3RoICJDREFUQSI+Ci0gICAgPCEtLSBwaXhlbCwgcGVyY2VudGFnZSwgb3IgcmVsYXRpdmUgLS0+Ci0KLTwhRU5USVRZICUgTXVsdGlMZW5ndGhzICJDREFUQSI+Ci0gICAgPCEtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBNdWx0aUxlbmd0aCAtLT4KLQotPCFFTlRJVFkgJSBQaXhlbHMgIkNEQVRBIj4KLSAgICA8IS0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci0KLTwhLS0gdGhlc2UgYXJlIHVzZWQgZm9yIGltYWdlIG1hcHMgLS0+Ci0KLTwhRU5USVRZICUgU2hhcGUgIihyZWN0fGNpcmNsZXxwb2x5fGRlZmF1bHQpIj4KLQotPCFFTlRJVFkgJSBDb29yZHMgIkNEQVRBIj4KLSAgICA8IS0tIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGxlbmd0aHMgLS0+Ci0KLTwhLS0gdXNlZCBmb3Igb2JqZWN0LCBhcHBsZXQsIGltZywgaW5wdXQgYW5kIGlmcmFtZSAtLT4KLTwhRU5USVRZICUgSW1nQWxpZ24gIih0b3B8bWlkZGxlfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhLS0gYSBjb2xvciB1c2luZyBzUkdCOiAjUlJHR0JCIGFzIEhleCB2YWx1ZXMgLS0+Ci08IUVOVElUWSAlIENvbG9yICJDREFUQSI+Ci0KLTwhLS0gVGhlcmUgYXJlIGFsc28gMTYgd2lkZWx5IGtub3duIGNvbG9yIG5hbWVzIHdpdGggdGhlaXIgc1JHQiB2YWx1ZXM6Ci0KLSAgICBCbGFjayAgPSAjMDAwMDAwICAgIEdyZWVuICA9ICMwMDgwMDAKLSAgICBTaWx2ZXIgPSAjQzBDMEMwICAgIExpbWUgICA9ICMwMEZGMDAKLSAgICBHcmF5ICAgPSAjODA4MDgwICAgIE9saXZlICA9ICM4MDgwMDAKLSAgICBXaGl0ZSAgPSAjRkZGRkZGICAgIFllbGxvdyA9ICNGRkZGMDAKLSAgICBNYXJvb24gPSAjODAwMDAwICAgIE5hdnkgICA9ICMwMDAwODAKLSAgICBSZWQgICAgPSAjRkYwMDAwICAgIEJsdWUgICA9ICMwMDAwRkYKLSAgICBQdXJwbGUgPSAjODAwMDgwICAgIFRlYWwgICA9ICMwMDgwODAKLSAgICBGdWNoc2lhPSAjRkYwMEZGICAgIEFxdWEgICA9ICMwMEZGRkYKLS0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBHZW5lcmljIEF0dHJpYnV0ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGNvcmUgYXR0cmlidXRlcyBjb21tb24gdG8gbW9zdCBlbGVtZW50cwotICBpZCAgICAgICBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZAotICBjbGFzcyAgICBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjbGFzc2VzCi0gIHN0eWxlICAgIGFzc29jaWF0ZWQgc3R5bGUgaW5mbwotICB0aXRsZSAgICBhZHZpc29yeSB0aXRsZS9hbXBsaWZpY2F0aW9uCi0tLT4KLTwhRU5USVRZICUgY29yZWF0dHJzCi0gImlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVECi0gIGNsYXNzICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHN0eWxlICAgICAgICVTdHlsZVNoZWV0OyAgICNJTVBMSUVECi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhLS0gaW50ZXJuYXRpb25hbGl6YXRpb24gYXR0cmlidXRlcwotICBsYW5nICAgICAgICBsYW5ndWFnZSBjb2RlIChiYWNrd2FyZHMgY29tcGF0aWJsZSkKLSAgeG1sOmxhbmcgICAgbGFuZ3VhZ2UgY29kZSAoYXMgcGVyIFhNTCAxLjAgc3BlYykKLSAgZGlyICAgICAgICAgZGlyZWN0aW9uIGZvciB3ZWFrL25ldXRyYWwgdGV4dAotLS0+Ci08IUVOVElUWSAlIGkxOG4KLSAibGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgeG1sOmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI0lNUExJRUQiCi0gID4KLQotPCEtLSBhdHRyaWJ1dGVzIGZvciBjb21tb24gVUkgZXZlbnRzCi0gIG9uY2xpY2sgICAgIGEgcG9pbnRlciBidXR0b24gd2FzIGNsaWNrZWQKLSAgb25kYmxjbGljayAgYSBwb2ludGVyIGJ1dHRvbiB3YXMgZG91YmxlIGNsaWNrZWQKLSAgb25tb3VzZWRvd24gYSBwb2ludGVyIGJ1dHRvbiB3YXMgcHJlc3NlZCBkb3duCi0gIG9ubW91c2V1cCAgIGEgcG9pbnRlciBidXR0b24gd2FzIHJlbGVhc2VkCi0gIG9ubW91c2Vtb3ZlIGEgcG9pbnRlciB3YXMgbW92ZWQgb250byB0aGUgZWxlbWVudAotICBvbm1vdXNlb3V0ICBhIHBvaW50ZXIgd2FzIG1vdmVkIGF3YXkgZnJvbSB0aGUgZWxlbWVudAotICBvbmtleXByZXNzICBhIGtleSB3YXMgcHJlc3NlZCBhbmQgcmVsZWFzZWQKLSAgb25rZXlkb3duICAgYSBrZXkgd2FzIHByZXNzZWQgZG93bgotICBvbmtleXVwICAgICBhIGtleSB3YXMgcmVsZWFzZWQKLS0tPgotPCFFTlRJVFkgJSBldmVudHMKLSAib25jbGljayAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25kYmxjbGljayAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZWRvd24gJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZXVwICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZW92ZXIgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZW1vdmUgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZW91dCAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25rZXlwcmVzcyAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25rZXlkb3duICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25rZXl1cCAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQiCi0gID4KLQotPCEtLSBhdHRyaWJ1dGVzIGZvciBlbGVtZW50cyB0aGF0IGNhbiBnZXQgdGhlIGZvY3VzCi0gIGFjY2Vzc2tleSAgIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlcgotICB0YWJpbmRleCAgICBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyCi0gIG9uZm9jdXMgICAgIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMKLSAgb25ibHVyICAgICAgdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMKLS0tPgotPCFFTlRJVFkgJSBmb2N1cwotICJhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IUVOVElUWSAlIGF0dHJzICIlY29yZWF0dHJzOyAlaTE4bjsgJWV2ZW50czsiPgotCi08IS0tIHRleHQgYWxpZ25tZW50IGZvciBwLCBkaXYsIGgxLWg2LiBUaGUgZGVmYXVsdCBpcwotICAgICBhbGlnbj0ibGVmdCIgZm9yIGx0ciBoZWFkaW5ncywgInJpZ2h0IiBmb3IgcnRsIC0tPgotCi08IUVOVElUWSAlIFRleHRBbGlnbiAiYWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0KSAjSU1QTElFRCI+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFRleHQgRWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgc3BlY2lhbAotICAgImJyIHwgc3BhbiB8IGJkbyB8b2JqZWN0IHwgYXBwbGV0IHwgaW1nIHwgbWFwIHwgaWZyYW1lIj4KLQotPCFFTlRJVFkgJSBmb250c3R5bGUgInR0IHwgaSB8IGIgfCBiaWcgfCBzbWFsbCB8IHUKLSAgICAgICAgICAgICAgICAgICAgICB8IHMgfCBzdHJpa2UgfGZvbnQgfCBiYXNlZm9udCI+Ci0KLTwhRU5USVRZICUgcGhyYXNlICJlbSB8IHN0cm9uZyB8IGRmbiB8IGNvZGUgfCBxIHwgc3ViIHwgc3VwIHwKLSAgICAgICAgICAgICAgICAgICBzYW1wIHwga2JkIHwgdmFyIHwgY2l0ZSB8IGFiYnIgfCBhY3JvbnltIj4KLQotPCFFTlRJVFkgJSBpbmxpbmUuZm9ybXMgImlucHV0IHwgc2VsZWN0IHwgdGV4dGFyZWEgfCBsYWJlbCB8IGJ1dHRvbiI+Ci0KLTwhLS0gdGhlc2UgY2FuIG9jY3VyIGF0IGJsb2NrIG9yIGlubGluZSBsZXZlbCAtLT4KLTwhRU5USVRZICUgbWlzYyAiaW5zIHwgZGVsIHwgc2NyaXB0IHwgbm9zY3JpcHQiPgotCi08IUVOVElUWSAlIGlubGluZSAiYSB8ICVzcGVjaWFsOyB8ICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlaW5saW5lLmZvcm1zOyI+Ci0KLTwhLS0gJUlubGluZTsgY292ZXJzIGlubGluZSBvciAidGV4dC1sZXZlbCIgZWxlbWVudHMgLS0+Ci08IUVOVElUWSAlIElubGluZSAiKCNQQ0RBVEEgfCAlaW5saW5lOyB8ICVtaXNjOykqIj4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBCbG9jayBsZXZlbCBlbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBoZWFkaW5nICJoMXxoMnxoM3xoNHxoNXxoNiI+Ci08IUVOVElUWSAlIGxpc3RzICJ1bCB8IG9sIHwgZGwgfCBtZW51IHwgZGlyIj4KLTwhRU5USVRZICUgYmxvY2t0ZXh0ICJwcmUgfCBociB8IGJsb2NrcXVvdGUgfCBhZGRyZXNzIHwgY2VudGVyIj4KLQotPCFFTlRJVFkgJSBibG9jawotICAgICJwIHwgJWhlYWRpbmc7IHwgZGl2IHwgJWxpc3RzOyB8ICVibG9ja3RleHQ7IHwgaXNpbmRleCB8IGZpZWxkc2V0IHwgdGFibGUiPgotCi08IUVOVElUWSAlIEJsb2NrICIoJWJsb2NrOyB8IGZvcm0gfCAlbWlzYzspKiI+Ci0KLTwhLS0gJUZsb3c7IG1peGVzIEJsb2NrIGFuZCBJbmxpbmUgYW5kIGlzIHVzZWQgZm9yIGxpc3QgaXRlbXMgZXRjLiAtLT4KLTwhRU5USVRZICUgRmxvdyAiKCNQQ0RBVEEgfCAlYmxvY2s7IHwgZm9ybSB8ICVpbmxpbmU7IHwgJW1pc2M7KSoiPgotCi08IS0tPT09PT09PT09PT09PT09PT09IENvbnRlbnQgbW9kZWxzIGZvciBleGNsdXNpb25zID09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGEgZWxlbWVudHMgdXNlICVJbmxpbmU7IGV4Y2x1ZGluZyBhIC0tPgotCi08IUVOVElUWSAlIGEuY29udGVudAotICAgIigjUENEQVRBIHwgJXNwZWNpYWw7IHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVpbmxpbmUuZm9ybXM7IHwgJW1pc2M7KSoiPgotCi08IS0tIHByZSB1c2VzICVJbmxpbmUgZXhjbHVkaW5nIGltZywgb2JqZWN0LCBhcHBsZXQsIGJpZywgc21hbGwsCi0gICAgIHN1Yiwgc3VwLCBmb250LCBvciBiYXNlZm9udCAtLT4KLQotPCFFTlRJVFkgJSBwcmUuY29udGVudAotICAgIigjUENEQVRBIHwgYSB8IGJyIHwgc3BhbiB8IGJkbyB8IG1hcCB8IHR0IHwgaSB8IGIgfCB1IHwgcyB8Ci0gICAgICAlcGhyYXNlOyB8ICVpbmxpbmUuZm9ybXM7KSoiPgotCi08IS0tIGZvcm0gdXNlcyAlRmxvdzsgZXhjbHVkaW5nIGZvcm0gLS0+Ci0KLTwhRU5USVRZICUgZm9ybS5jb250ZW50ICIoI1BDREFUQSB8ICVibG9jazsgfCAlaW5saW5lOyB8ICVtaXNjOykqIj4KLQotPCEtLSBidXR0b24gdXNlcyAlRmxvdzsgYnV0IGV4Y2x1ZGVzIGEsIGZvcm0sIGZvcm0gY29udHJvbHMsIGlmcmFtZSAtLT4KLQotPCFFTlRJVFkgJSBidXR0b24uY29udGVudAotICAgIigjUENEQVRBIHwgcCB8ICVoZWFkaW5nOyB8IGRpdiB8ICVsaXN0czsgfCAlYmxvY2t0ZXh0OyB8Ci0gICAgICB0YWJsZSB8IGJyIHwgc3BhbiB8IGJkbyB8IG9iamVjdCB8IGFwcGxldCB8IGltZyB8IG1hcCB8Ci0gICAgICAlZm9udHN0eWxlOyB8ICVwaHJhc2U7IHwgJW1pc2M7KSoiPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBTdHJ1Y3R1cmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIHRoZSBuYW1lc3BhY2UgVVJJIGRlc2lnbmF0ZXMgdGhlIGRvY3VtZW50IHByb2ZpbGUgLS0+Ci0KLTwhRUxFTUVOVCBodG1sIChoZWFkLCBmcmFtZXNldCk+Ci08IUFUVExJU1QgaHRtbAotICAlaTE4bjsKLSAgeG1sbnMgICAgICAgJVVSSTsgICAgICAgICAgI0ZJWEVEICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IERvY3VtZW50IEhlYWQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgaGVhZC5taXNjICIoc2NyaXB0fHN0eWxlfG1ldGF8bGlua3xvYmplY3R8aXNpbmRleCkqIj4KLQotPCEtLSBjb250ZW50IG1vZGVsIGlzICVoZWFkLm1pc2M7IGNvbWJpbmVkIHdpdGggYSBzaW5nbGUKLSAgICAgdGl0bGUgYW5kIGFuIG9wdGlvbmFsIGJhc2UgZWxlbWVudCBpbiBhbnkgb3JkZXIgLS0+Ci0KLTwhRUxFTUVOVCBoZWFkICglaGVhZC5taXNjOywKLSAgICAgKCh0aXRsZSwgJWhlYWQubWlzYzssIChiYXNlLCAlaGVhZC5taXNjOyk/KSB8Ci0gICAgICAoYmFzZSwgJWhlYWQubWlzYzssICh0aXRsZSwgJWhlYWQubWlzYzspKSkpPgotCi08IUFUVExJU1QgaGVhZAotICAlaTE4bjsKLSAgcHJvZmlsZSAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIFRoZSB0aXRsZSBlbGVtZW50IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGZsb3cgb2YgdGV4dC4KLSAgICAgICBJdCBzaG91bGQgYmUgZGlzcGxheWVkLCBmb3IgZXhhbXBsZSBhcyB0aGUgcGFnZSBoZWFkZXIgb3IKLSAgICAgICB3aW5kb3cgdGl0bGUuIEV4YWN0bHkgb25lIHRpdGxlIGlzIHJlcXVpcmVkIHBlciBkb2N1bWVudC4KLSAgICAtLT4KLTwhRUxFTUVOVCB0aXRsZSAoI1BDREFUQSk+Ci08IUFUVExJU1QgdGl0bGUgJWkxOG47PgotCi08IS0tIGRvY3VtZW50IGJhc2UgVVJJIC0tPgotCi08IUVMRU1FTlQgYmFzZSBFTVBUWT4KLTwhQVRUTElTVCBiYXNlCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVECi0gID4KLQotPCEtLSBnZW5lcmljIG1ldGFpbmZvcm1hdGlvbiAtLT4KLTwhRUxFTUVOVCBtZXRhIEVNUFRZPgotPCFBVFRMSVNUIG1ldGEKLSAgJWkxOG47Ci0gIGh0dHAtZXF1aXYgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGNvbnRlbnQgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRAotICBzY2hlbWUgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSAgUmVsYXRpb25zaGlwIHZhbHVlcyBjYW4gYmUgdXNlZCBpbiBwcmluY2lwbGU6Ci0KLSAgIGEpIGZvciBkb2N1bWVudCBzcGVjaWZpYyB0b29sYmFycy9tZW51cyB3aGVuIHVzZWQKLSAgICAgIHdpdGggdGhlIGxpbmsgZWxlbWVudCBpbiBkb2N1bWVudCBoZWFkIGUuZy4KLSAgICAgICAgc3RhcnQsIGNvbnRlbnRzLCBwcmV2aW91cywgbmV4dCwgaW5kZXgsIGVuZCwgaGVscAotICAgYikgdG8gbGluayB0byBhIHNlcGFyYXRlIHN0eWxlIHNoZWV0IChyZWw9InN0eWxlc2hlZXQiKQotICAgYykgdG8gbWFrZSBhIGxpbmsgdG8gYSBzY3JpcHQgKHJlbD0ic2NyaXB0IikKLSAgIGQpIGJ5IHN0eWxlc2hlZXRzIHRvIGNvbnRyb2wgaG93IGNvbGxlY3Rpb25zIG9mCi0gICAgICBodG1sIG5vZGVzIGFyZSByZW5kZXJlZCBpbnRvIHByaW50ZWQgZG9jdW1lbnRzCi0gICBlKSB0byBtYWtlIGEgbGluayB0byBhIHByaW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIGUuZy4gYSBQb3N0U2NyaXB0IG9yIFBERiB2ZXJzaW9uIChyZWw9ImFsdGVybmF0ZSIgbWVkaWE9InByaW50IikKLS0tPgotCi08IUVMRU1FTlQgbGluayBFTVBUWT4KLTwhQVRUTElTVCBsaW5rCi0gICVhdHRyczsKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgcmVsICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQKLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQKLSAgPgotCi08IS0tIHN0eWxlIGluZm8sIHdoaWNoIG1heSBpbmNsdWRlIENEQVRBIHNlY3Rpb25zIC0tPgotPCFFTEVNRU5UIHN0eWxlICgjUENEQVRBKT4KLTwhQVRUTElTVCBzdHlsZQotICAlaTE4bjsKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI1JFUVVJUkVECi0gIG1lZGlhICAgICAgICVNZWRpYURlc2M7ICAgICNJTVBMSUVECi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIHhtbDpzcGFjZSAgIChwcmVzZXJ2ZSkgICAgICNGSVhFRCAncHJlc2VydmUnCi0gID4KLQotPCEtLSBzY3JpcHQgc3RhdGVtZW50cywgd2hpY2ggbWF5IGluY2x1ZGUgQ0RBVEEgc2VjdGlvbnMgLS0+Ci08IUVMRU1FTlQgc2NyaXB0ICgjUENEQVRBKT4KLTwhQVRUTElTVCBzY3JpcHQKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI1JFUVVJUkVECi0gIGxhbmd1YWdlICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGRlZmVyICAgICAgIChkZWZlcikgICAgICAgICNJTVBMSUVECi0gIHhtbDpzcGFjZSAgIChwcmVzZXJ2ZSkgICAgICNGSVhFRCAncHJlc2VydmUnCi0gID4KLQotPCEtLSBhbHRlcm5hdGUgY29udGVudCBjb250YWluZXIgZm9yIG5vbiBzY3JpcHQtYmFzZWQgcmVuZGVyaW5nIC0tPgotCi08IUVMRU1FTlQgbm9zY3JpcHQgJUZsb3c7PgotPCFBVFRMSVNUIG5vc2NyaXB0Ci0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT0gRnJhbWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIG9ubHkgb25lIG5vZnJhbWVzIGVsZW1lbnQgcGVybWl0dGVkIHBlciBkb2N1bWVudCAtLT4KLQotPCFFTEVNRU5UIGZyYW1lc2V0IChmcmFtZXNldHxmcmFtZXxub2ZyYW1lcykqPgotPCFBVFRMSVNUIGZyYW1lc2V0Ci0gICVjb3JlYXR0cnM7Ci0gIHJvd3MgICAgICAgICVNdWx0aUxlbmd0aHM7ICNJTVBMSUVECi0gIGNvbHMgICAgICAgICVNdWx0aUxlbmd0aHM7ICNJTVBMSUVECi0gIG9ubG9hZCAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9udW5sb2FkICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSByZXNlcnZlZCBmcmFtZSBuYW1lcyBzdGFydCB3aXRoICJfIiBvdGhlcndpc2Ugc3RhcnRzIHdpdGggbGV0dGVyIC0tPgotCi08IS0tIHRpbGVkIHdpbmRvdyB3aXRoaW4gZnJhbWVzZXQgLS0+Ci0KLTwhRUxFTUVOVCBmcmFtZSBFTVBUWT4KLTwhQVRUTElTVCBmcmFtZQotICAlY29yZWF0dHJzOwotICBsb25nZGVzYyAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBmcmFtZWJvcmRlciAoMXwwKSAgICAgICAgICAiMSIKLSAgbWFyZ2lud2lkdGggJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgbWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICAgICAgI0lNUExJRUQKLSAgbm9yZXNpemUgICAgKG5vcmVzaXplKSAgICAgI0lNUExJRUQKLSAgc2Nyb2xsaW5nICAgKHllc3xub3xhdXRvKSAgImF1dG8iCi0gID4KLQotPCEtLSBpbmxpbmUgc3Vid2luZG93IC0tPgotCi08IUVMRU1FTlQgaWZyYW1lICVGbG93Oz4KLTwhQVRUTElTVCBpZnJhbWUKLSAgJWNvcmVhdHRyczsKLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZnJhbWVib3JkZXIgKDF8MCkgICAgICAgICAgIjEiCi0gIG1hcmdpbndpZHRoICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIG1hcmdpbmhlaWdodCAlUGl4ZWxzOyAgICAgICNJTVBMSUVECi0gIHNjcm9sbGluZyAgICh5ZXN8bm98YXV0bykgICJhdXRvIgotICBhbGlnbiAgICAgICAlSW1nQWxpZ247ICAgICAjSU1QTElFRAotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gYWx0ZXJuYXRlIGNvbnRlbnQgY29udGFpbmVyIGZvciBub24gZnJhbWUtYmFzZWQgcmVuZGVyaW5nIC0tPgotCi08IUVMRU1FTlQgbm9mcmFtZXMgKGJvZHkpPgotPCFBVFRMSVNUIG5vZnJhbWVzCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBEb2N1bWVudCBCb2R5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgYm9keSAlRmxvdzs+Ci08IUFUVExJU1QgYm9keQotICAlYXR0cnM7Ci0gIG9ubG9hZCAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9udW5sb2FkICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIGJhY2tncm91bmQgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gIHRleHQgICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gIGxpbmsgICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gIHZsaW5rICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gIGFsaW5rICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIGRpdiAlRmxvdzs+ICA8IS0tIGdlbmVyaWMgbGFuZ3VhZ2Uvc3R5bGUgY29udGFpbmVyIC0tPgotPCFBVFRMSVNUIGRpdgotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUGFyYWdyYXBocyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIHAgJUlubGluZTs+Ci08IUFUVExJU1QgcAotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSGVhZGluZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICBUaGVyZSBhcmUgc2l4IGxldmVscyBvZiBoZWFkaW5ncyBmcm9tIGgxICh0aGUgbW9zdCBpbXBvcnRhbnQpCi0gIHRvIGg2ICh0aGUgbGVhc3QgaW1wb3J0YW50KS4KLS0tPgotCi08IUVMRU1FTlQgaDEgICVJbmxpbmU7PgotPCFBVFRMSVNUIGgxCi0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IUVMRU1FTlQgaDIgJUlubGluZTs+Ci08IUFUVExJU1QgaDIKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhRUxFTUVOVCBoMyAlSW5saW5lOz4KLTwhQVRUTElTVCBoMwotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCFFTEVNRU5UIGg0ICVJbmxpbmU7PgotPCFBVFRMSVNUIGg0Ci0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IUVMRU1FTlQgaDUgJUlubGluZTs+Ci08IUFUVExJU1QgaDUKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhRUxFTUVOVCBoNiAlSW5saW5lOz4KLTwhQVRUTElTVCBoNgotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gTGlzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBVbm9yZGVyZWQgbGlzdCBidWxsZXQgc3R5bGVzIC0tPgotCi08IUVOVElUWSAlIFVMU3R5bGUgIihkaXNjfHNxdWFyZXxjaXJjbGUpIj4KLQotPCEtLSBVbm9yZGVyZWQgbGlzdCAtLT4KLQotPCFFTEVNRU5UIHVsIChsaSkrPgotPCFBVFRMSVNUIHVsCi0gICVhdHRyczsKLSAgdHlwZSAgICAgICAgJVVMU3R5bGU7ICAgICAjSU1QTElFRAotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBPcmRlcmVkIGxpc3QgbnVtYmVyaW5nIHN0eWxlCi0KLSAgICAxICAgYXJhYmljIG51bWJlcnMgICAgICAxLCAyLCAzLCAuLi4KLSAgICBhICAgbG93ZXIgYWxwaGEgICAgICAgICBhLCBiLCBjLCAuLi4KLSAgICBBICAgdXBwZXIgYWxwaGEgICAgICAgICBBLCBCLCBDLCAuLi4KLSAgICBpICAgbG93ZXIgcm9tYW4gICAgICAgICBpLCBpaSwgaWlpLCAuLi4KLSAgICBJICAgdXBwZXIgcm9tYW4gICAgICAgICBJLCBJSSwgSUlJLCAuLi4KLQotICAgIFRoZSBzdHlsZSBpcyBhcHBsaWVkIHRvIHRoZSBzZXF1ZW5jZSBudW1iZXIgd2hpY2ggYnkgZGVmYXVsdAotICAgIGlzIHJlc2V0IHRvIDEgZm9yIHRoZSBmaXJzdCBsaXN0IGl0ZW0gaW4gYW4gb3JkZXJlZCBsaXN0LgotLS0+Ci08IUVOVElUWSAlIE9MU3R5bGUgIkNEQVRBIj4KLQotPCEtLSBPcmRlcmVkIChudW1iZXJlZCkgbGlzdCAtLT4KLQotPCFFTEVNRU5UIG9sIChsaSkrPgotPCFBVFRMSVNUIG9sCi0gICVhdHRyczsKLSAgdHlwZSAgICAgICAgJU9MU3R5bGU7ICAgICAgI0lNUExJRUQKLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAgI0lNUExJRUQKLSAgc3RhcnQgICAgICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIHNpbmdsZSBjb2x1bW4gbGlzdCAoREVQUkVDQVRFRCkgLS0+IAotPCFFTEVNRU5UIG1lbnUgKGxpKSs+Ci08IUFUVExJU1QgbWVudQotICAlYXR0cnM7Ci0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIG11bHRpcGxlIGNvbHVtbiBsaXN0IChERVBSRUNBVEVEKSAtLT4gCi08IUVMRU1FTlQgZGlyIChsaSkrPgotPCFBVFRMSVNUIGRpcgotICAlYXR0cnM7Ci0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIExJU3R5bGUgaXMgY29uc3RyYWluZWQgdG86ICIoJVVMU3R5bGU7fCVPTFN0eWxlOykiIC0tPgotPCFFTlRJVFkgJSBMSVN0eWxlICJDREFUQSI+Ci0KLTwhLS0gbGlzdCBpdGVtIC0tPgotCi08IUVMRU1FTlQgbGkgJUZsb3c7PgotPCFBVFRMSVNUIGxpCi0gICVhdHRyczsKLSAgdHlwZSAgICAgICAgJUxJU3R5bGU7ICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIGRlZmluaXRpb24gbGlzdHMgLSBkdCBmb3IgdGVybSwgZGQgZm9yIGl0cyBkZWZpbml0aW9uIC0tPgotCi08IUVMRU1FTlQgZGwgKGR0fGRkKSs+Ci08IUFUVExJU1QgZGwKLSAgJWF0dHJzOwotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBkdCAlSW5saW5lOz4KLTwhQVRUTElTVCBkdAotICAlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGRkICVGbG93Oz4KLTwhQVRUTElTVCBkZAotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gQWRkcmVzcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBpbmZvcm1hdGlvbiBvbiBhdXRob3IgLS0+Ci0KLTwhRUxFTUVOVCBhZGRyZXNzICVJbmxpbmU7PgotPCFBVFRMSVNUIGFkZHJlc3MKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEhvcml6b250YWwgUnVsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBociBFTVBUWT4KLTwhQVRUTElTVCBocgotICAlYXR0cnM7Ci0gIGFsaWduICAgICAgIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQKLSAgbm9zaGFkZSAgICAgKG5vc2hhZGUpICAgICAgI0lNUExJRUQKLSAgc2l6ZSAgICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBQcmVmb3JtYXR0ZWQgVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGNvbnRlbnQgaXMgJUlubGluZTsgZXhjbHVkaW5nIAotICAgICAgICAiaW1nfG9iamVjdHxhcHBsZXR8YmlnfHNtYWxsfHN1YnxzdXB8Zm9udHxiYXNlZm9udCIgLS0+Ci0KLTwhRUxFTUVOVCBwcmUgJXByZS5jb250ZW50Oz4KLTwhQVRUTElTVCBwcmUKLSAgJWF0dHJzOwotICB3aWR0aCAgICAgICAlTnVtYmVyOyAgICAgICNJTVBMSUVECi0gIHhtbDpzcGFjZSAgIChwcmVzZXJ2ZSkgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBCbG9jay1saWtlIFF1b3RlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgYmxvY2txdW90ZSAlRmxvdzs+Ci08IUFUVExJU1QgYmxvY2txdW90ZQotICAlYXR0cnM7Ci0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gVGV4dCBhbGlnbm1lbnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBjZW50ZXIgY29udGVudCAtLT4KLTwhRUxFTUVOVCBjZW50ZXIgJUZsb3c7PgotPCFBVFRMSVNUIGNlbnRlcgotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSW5zZXJ0ZWQvRGVsZXRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotCi08IS0tCi0gIGlucy9kZWwgYXJlIGFsbG93ZWQgaW4gYmxvY2sgYW5kIGlubGluZSBjb250ZW50LCBidXQgaXRzCi0gIGluYXBwcm9wcmlhdGUgdG8gaW5jbHVkZSBibG9jayBjb250ZW50IHdpdGhpbiBhbiBpbnMgZWxlbWVudAotICBvY2N1cnJpbmcgaW4gaW5saW5lIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBpbnMgJUZsb3c7PgotPCFBVFRMSVNUIGlucwotICAlYXR0cnM7Ci0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGRhdGV0aW1lICAgICVEYXRldGltZTsgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIGRlbCAlRmxvdzs+Ci08IUFUVExJU1QgZGVsCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBBbmNob3IgRWxlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGNvbnRlbnQgaXMgJUlubGluZTsgZXhjZXB0IHRoYXQgYW5jaG9ycyBzaG91bGRuJ3QgYmUgbmVzdGVkIC0tPgotCi08IUVMRU1FTlQgYSAlYS5jb250ZW50Oz4KLTwhQVRUTElTVCBhCi0gICVhdHRyczsKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgcmVsICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgc2hhcGUgICAgICAgJVNoYXBlOyAgICAgICAgInJlY3QiCi0gIGNvb3JkcyAgICAgICVDb29yZHM7ICAgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PSBJbmxpbmUgRWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIHNwYW4gJUlubGluZTs+IDwhLS0gZ2VuZXJpYyBsYW5ndWFnZS9zdHlsZSBjb250YWluZXIgLS0+Ci08IUFUVExJU1Qgc3BhbgotICAlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGJkbyAlSW5saW5lOz4gIDwhLS0gSTE4TiBCaURpIG92ZXItcmlkZSAtLT4KLTwhQVRUTElTVCBiZG8KLSAgJWNvcmVhdHRyczsKLSAgJWV2ZW50czsKLSAgbGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgeG1sOmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI1JFUVVJUkVECi0gID4KLQotPCFFTEVNRU5UIGJyIEVNUFRZPiAgIDwhLS0gZm9yY2VkIGxpbmUgYnJlYWsgLS0+Ci08IUFUVExJU1QgYnIKLSAgJWNvcmVhdHRyczsKLSAgY2xlYXIgICAgICAgKGxlZnR8YWxsfHJpZ2h0fG5vbmUpICJub25lIgotICA+Ci0KLTwhRUxFTUVOVCBlbSAlSW5saW5lOz4gICA8IS0tIGVtcGhhc2lzIC0tPgotPCFBVFRMSVNUIGVtICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzdHJvbmcgJUlubGluZTs+ICAgPCEtLSBzdHJvbmcgZW1waGFzaXMgLS0+Ci08IUFUVExJU1Qgc3Ryb25nICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBkZm4gJUlubGluZTs+ICAgPCEtLSBkZWZpbml0aW9uYWwgLS0+Ci08IUFUVExJU1QgZGZuICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBjb2RlICVJbmxpbmU7PiAgIDwhLS0gcHJvZ3JhbSBjb2RlIC0tPgotPCFBVFRMSVNUIGNvZGUgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHNhbXAgJUlubGluZTs+ICAgPCEtLSBzYW1wbGUgLS0+Ci08IUFUVExJU1Qgc2FtcCAlYXR0cnM7PgotCi08IUVMRU1FTlQga2JkICVJbmxpbmU7PiAgPCEtLSBzb21ldGhpbmcgdXNlciB3b3VsZCB0eXBlIC0tPgotPCFBVFRMSVNUIGtiZCAlYXR0cnM7PgotCi08IUVMRU1FTlQgdmFyICVJbmxpbmU7PiAgIDwhLS0gdmFyaWFibGUgLS0+Ci08IUFUVExJU1QgdmFyICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBjaXRlICVJbmxpbmU7PiAgIDwhLS0gY2l0YXRpb24gLS0+Ci08IUFUVExJU1QgY2l0ZSAlYXR0cnM7PgotCi08IUVMRU1FTlQgYWJiciAlSW5saW5lOz4gICA8IS0tIGFiYnJldmlhdGlvbiAtLT4KLTwhQVRUTElTVCBhYmJyICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBhY3JvbnltICVJbmxpbmU7PiAgIDwhLS0gYWNyb255bSAtLT4KLTwhQVRUTElTVCBhY3JvbnltICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBxICVJbmxpbmU7PiAgIDwhLS0gaW5saW5lZCBxdW90ZSAtLT4KLTwhQVRUTElTVCBxCi0gICAlYXR0cnM7Ci0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gICA+Ci0KLTwhRUxFTUVOVCBzdWIgJUlubGluZTs+IDwhLS0gc3Vic2NyaXB0IC0tPgotPCFBVFRMSVNUIHN1YiAlYXR0cnM7PgotCi08IUVMRU1FTlQgc3VwICVJbmxpbmU7PiA8IS0tIHN1cGVyc2NyaXB0IC0tPgotPCFBVFRMSVNUIHN1cCAlYXR0cnM7PgotCi08IUVMRU1FTlQgdHQgJUlubGluZTs+ICAgPCEtLSBmaXhlZCBwaXRjaCBmb250IC0tPgotPCFBVFRMSVNUIHR0ICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBpICVJbmxpbmU7PiAgIDwhLS0gaXRhbGljIGZvbnQgLS0+Ci08IUFUVExJU1QgaSAlYXR0cnM7PgotCi08IUVMRU1FTlQgYiAlSW5saW5lOz4gICA8IS0tIGJvbGQgZm9udCAtLT4KLTwhQVRUTElTVCBiICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBiaWcgJUlubGluZTs+ICAgPCEtLSBiaWdnZXIgZm9udCAtLT4KLTwhQVRUTElTVCBiaWcgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHNtYWxsICVJbmxpbmU7PiAgIDwhLS0gc21hbGxlciBmb250IC0tPgotPCFBVFRMSVNUIHNtYWxsICVhdHRyczs+Ci0KLTwhRUxFTUVOVCB1ICVJbmxpbmU7PiAgIDwhLS0gdW5kZXJsaW5lIC0tPgotPCFBVFRMSVNUIHUgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHMgJUlubGluZTs+ICAgPCEtLSBzdHJpa2UtdGhyb3VnaCAtLT4KLTwhQVRUTElTVCBzICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzdHJpa2UgJUlubGluZTs+ICAgPCEtLSBzdHJpa2UtdGhyb3VnaCAtLT4KLTwhQVRUTElTVCBzdHJpa2UgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGJhc2Vmb250IEVNUFRZPiAgPCEtLSBiYXNlIGZvbnQgc2l6ZSAtLT4KLTwhQVRUTElTVCBiYXNlZm9udAotICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRAotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQKLSAgY29sb3IgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgZmFjZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgZm9udCAlSW5saW5lOz4gPCEtLSBsb2NhbCBjaGFuZ2UgdG8gZm9udCAtLT4KLTwhQVRUTElTVCBmb250Ci0gICVjb3JlYXR0cnM7Ci0gICVpMThuOwotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBjb2xvciAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICBmYWNlICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PSBPYmplY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0KLSAgb2JqZWN0IGlzIHVzZWQgdG8gZW1iZWQgb2JqZWN0cyBhcyBwYXJ0IG9mIEhUTUwgcGFnZXMuCi0gIHBhcmFtIGVsZW1lbnRzIHNob3VsZCBwcmVjZWRlIG90aGVyIGNvbnRlbnQuIFBhcmFtZXRlcnMKLSAgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGFzIGF0dHJpYnV0ZS92YWx1ZSBwYWlycyBvbiB0aGUKLSAgb2JqZWN0IGVsZW1lbnQgaXRzZWxmIHdoZW4gYnJldml0eSBpcyBkZXNpcmVkLgotLS0+Ci0KLTwhRUxFTUVOVCBvYmplY3QgKCNQQ0RBVEEgfCBwYXJhbSB8ICVibG9jazsgfCBmb3JtIHwlaW5saW5lOyB8ICVtaXNjOykqPgotPCFBVFRMSVNUIG9iamVjdAotICAlYXR0cnM7Ci0gIGRlY2xhcmUgICAgIChkZWNsYXJlKSAgICAgICNJTVBMSUVECi0gIGNsYXNzaWQgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGNvZGViYXNlICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGRhdGEgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gIGNvZGV0eXBlICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gIGFyY2hpdmUgICAgICVVcmlMaXN0OyAgICAgICNJTVBMSUVECi0gIHN0YW5kYnkgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFsaWduICAgICAgICVJbWdBbGlnbjsgICAgICNJTVBMSUVECi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIGhzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIHZzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotICBwYXJhbSBpcyB1c2VkIHRvIHN1cHBseSBhIG5hbWVkIHByb3BlcnR5IHZhbHVlLgotICBJbiBYTUwgaXQgd291bGQgc2VlbSBuYXR1cmFsIHRvIGZvbGxvdyBSREYgYW5kIHN1cHBvcnQgYW4KLSAgYWJicmV2aWF0ZWQgc3ludGF4IHdoZXJlIHRoZSBwYXJhbSBlbGVtZW50cyBhcmUgcmVwbGFjZWQKLSAgYnkgYXR0cmlidXRlIHZhbHVlIHBhaXJzIG9uIHRoZSBvYmplY3Qgc3RhcnQgdGFnLgotLS0+Ci08IUVMRU1FTlQgcGFyYW0gRU1QVFk+Ci08IUFUVExJU1QgcGFyYW0KLSAgaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVECi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHZhbHVldHlwZSAgIChkYXRhfHJlZnxvYmplY3QpICJkYXRhIgotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEphdmEgYXBwbGV0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0KLSAgT25lIG9mIGNvZGUgb3Igb2JqZWN0IGF0dHJpYnV0ZXMgbXVzdCBiZSBwcmVzZW50LgotICBQbGFjZSBwYXJhbSBlbGVtZW50cyBiZWZvcmUgb3RoZXIgY29udGVudC4KLS0tPgotPCFFTEVNRU5UIGFwcGxldCAoI1BDREFUQSB8IHBhcmFtIHwgJWJsb2NrOyB8IGZvcm0gfCAlaW5saW5lOyB8ICVtaXNjOykqPgotPCFBVFRMSVNUIGFwcGxldAotICAlY29yZWF0dHJzOwotICBjb2RlYmFzZSAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBhcmNoaXZlICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBjb2RlICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBvYmplY3QgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjUkVRVUlSRUQKLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI1JFUVVJUkVECi0gIGFsaWduICAgICAgICVJbWdBbGlnbjsgICAgICNJTVBMSUVECi0gIGhzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIHZzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSW1hZ2VzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICAgVG8gYXZvaWQgYWNjZXNzaWJpbGl0eSBwcm9ibGVtcyBmb3IgcGVvcGxlIHdobyBhcmVuJ3QKLSAgIGFibGUgdG8gc2VlIHRoZSBpbWFnZSwgeW91IHNob3VsZCBwcm92aWRlIGEgdGV4dAotICAgZGVzY3JpcHRpb24gdXNpbmcgdGhlIGFsdCBhbmQgbG9uZ2Rlc2MgYXR0cmlidXRlcy4KLSAgIEluIGFkZGl0aW9uLCBhdm9pZCB0aGUgdXNlIG9mIHNlcnZlci1zaWRlIGltYWdlIG1hcHMuCi0tLT4KLQotPCFFTEVNRU5UIGltZyBFTVBUWT4KLTwhQVRUTElTVCBpbWcKLSAgJWF0dHJzOwotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjUkVRVUlSRUQKLSAgYWx0ICAgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIGxvbmdkZXNjICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGlzbWFwICAgICAgIChpc21hcCkgICAgICAgICNJTVBMSUVECi0gIGFsaWduICAgICAgICVJbWdBbGlnbjsgICAgICNJTVBMSUVECi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIGhzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIHZzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSB1c2VtYXAgcG9pbnRzIHRvIGEgbWFwIGVsZW1lbnQgd2hpY2ggbWF5IGJlIGluIHRoaXMgZG9jdW1lbnQKLSAgb3IgYW4gZXh0ZXJuYWwgZG9jdW1lbnQsIGFsdGhvdWdoIHRoZSBsYXR0ZXIgaXMgbm90IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gQ2xpZW50LXNpZGUgaW1hZ2UgbWFwcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gVGhlc2UgY2FuIGJlIHBsYWNlZCBpbiB0aGUgc2FtZSBkb2N1bWVudCBvciBncm91cGVkIGluIGEKLSAgICAgc2VwYXJhdGUgZG9jdW1lbnQgYWx0aG91Z2ggdGhpcyBpc24ndCB5ZXQgd2lkZWx5IHN1cHBvcnRlZCAtLT4KLQotPCFFTEVNRU5UIG1hcCAoKCVibG9jazsgfCBmb3JtIHwgJW1pc2M7KSsgfCBhcmVhKyk+Ci08IUFUVExJU1QgbWFwCi0gICVpMThuOwotICAlZXZlbnRzOwotICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjUkVRVUlSRUQKLSAgY2xhc3MgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgc3R5bGUgICAgICAgJVN0eWxlU2hlZXQ7ICAgI0lNUExJRUQKLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgYXJlYSBFTVBUWT4KLTwhQVRUTElTVCBhcmVhCi0gICVhdHRyczsKLSAgc2hhcGUgICAgICAgJVNoYXBlOyAgICAgICAgInJlY3QiCi0gIGNvb3JkcyAgICAgICVDb29yZHM7ICAgICAgICNJTVBMSUVECi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIG5vaHJlZiAgICAgIChub2hyZWYpICAgICAgICNJTVBMSUVECi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IEZvcm1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBmb3JtICVmb3JtLmNvbnRlbnQ7PiAgIDwhLS0gZm9ybXMgc2hvdWxkbid0IGJlIG5lc3RlZCAtLT4KLQotPCFBVFRMSVNUIGZvcm0KLSAgJWF0dHJzOwotICBhY3Rpb24gICAgICAlVVJJOyAgICAgICAgICAjUkVRVUlSRUQKLSAgbWV0aG9kICAgICAgKGdldHxwb3N0KSAgICAgImdldCIKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgZW5jdHlwZSAgICAgJUNvbnRlbnRUeXBlOyAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKLSAgb25zdWJtaXQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25yZXNldCAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgYWNjZXB0ICAgICAgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQKLSAgYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOyAgI0lNUExJRUQKLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gIEVhY2ggbGFiZWwgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gT05FIGZpZWxkCi0gIExhYmVsIGVsZW1lbnRzIHNob3VsZG4ndCBiZSBuZXN0ZWQuCi0tLT4KLTwhRUxFTUVOVCBsYWJlbCAlSW5saW5lOz4KLTwhQVRUTElTVCBsYWJlbAotICAlYXR0cnM7Ci0gIGZvciAgICAgICAgIElEUkVGICAgICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTlRJVFkgJSBJbnB1dFR5cGUKLSAgIih0ZXh0IHwgcGFzc3dvcmQgfCBjaGVja2JveCB8Ci0gICAgcmFkaW8gfCBzdWJtaXQgfCByZXNldCB8Ci0gICAgZmlsZSB8IGhpZGRlbiB8IGltYWdlIHwgYnV0dG9uKSIKLSAgID4KLQotPCEtLSB0aGUgbmFtZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgZm9yIGFsbCBidXQgc3VibWl0ICYgcmVzZXQgLS0+Ci0KLTwhRUxFTUVOVCBpbnB1dCBFTVBUWT4gICAgIDwhLS0gZm9ybSBjb250cm9sIC0tPgotPCFBVFRMSVNUIGlucHV0Ci0gICVhdHRyczsKLSAgdHlwZSAgICAgICAgJUlucHV0VHlwZTsgICAgInRleHQiCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGNoZWNrZWQgICAgIChjaGVja2VkKSAgICAgICNJTVBMSUVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVECi0gIHNpemUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIG1heGxlbmd0aCAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGFsdCAgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIGFjY2VwdCAgICAgICVDb250ZW50VHlwZXM7ICNJTVBMSUVECi0gIGFsaWduICAgICAgICVJbWdBbGlnbjsgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIHNlbGVjdCAob3B0Z3JvdXB8b3B0aW9uKSs+ICA8IS0tIG9wdGlvbiBzZWxlY3RvciAtLT4KLTwhQVRUTElTVCBzZWxlY3QKLSAgJWF0dHJzOwotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzaXplICAgICAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBtdWx0aXBsZSAgICAobXVsdGlwbGUpICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBvcHRncm91cCAob3B0aW9uKSs+ICAgPCEtLSBvcHRpb24gZ3JvdXAgLS0+Ci08IUFUVExJU1Qgb3B0Z3JvdXAKLSAgJWF0dHJzOwotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICBsYWJlbCAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQKLSAgPgotCi08IUVMRU1FTlQgb3B0aW9uICgjUENEQVRBKT4gICAgIDwhLS0gc2VsZWN0YWJsZSBjaG9pY2UgLS0+Ci08IUFUVExJU1Qgb3B0aW9uCi0gICVhdHRyczsKLSAgc2VsZWN0ZWQgICAgKHNlbGVjdGVkKSAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgdGV4dGFyZWEgKCNQQ0RBVEEpPiAgICAgPCEtLSBtdWx0aS1saW5lIHRleHQgZmllbGQgLS0+Ci08IUFUVExJU1QgdGV4dGFyZWEKLSAgJWF0dHJzOwotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICByb3dzICAgICAgICAlTnVtYmVyOyAgICAgICAjUkVRVUlSRUQKLSAgY29scyAgICAgICAgJU51bWJlcjsgICAgICAgI1JFUVVJUkVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotICBUaGUgZmllbGRzZXQgZWxlbWVudCBpcyB1c2VkIHRvIGdyb3VwIGZvcm0gZmllbGRzLgotICBPbmx5IG9uZSBsZWdlbmQgZWxlbWVudCBzaG91bGQgb2NjdXIgaW4gdGhlIGNvbnRlbnQKLSAgYW5kIGlmIHByZXNlbnQgc2hvdWxkIG9ubHkgYmUgcHJlY2VkZWQgYnkgd2hpdGVzcGFjZS4KLS0tPgotPCFFTEVNRU5UIGZpZWxkc2V0ICgjUENEQVRBIHwgbGVnZW5kIHwgJWJsb2NrOyB8IGZvcm0gfCAlaW5saW5lOyB8ICVtaXNjOykqPgotPCFBVFRMSVNUIGZpZWxkc2V0Ci0gICVhdHRyczsKLSAgPgotCi08IUVOVElUWSAlIExBbGlnbiAiKHRvcHxib3R0b218bGVmdHxyaWdodCkiPgotCi08IUVMRU1FTlQgbGVnZW5kICVJbmxpbmU7PiAgICAgPCEtLSBmaWVsZHNldCBsYWJlbCAtLT4KLTwhQVRUTElTVCBsZWdlbmQKLSAgJWF0dHJzOwotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBhbGlnbiAgICAgICAlTEFsaWduOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSBDb250ZW50IGlzICVGbG93OyBleGNsdWRpbmcgYSwgZm9ybSwgZm9ybSBjb250cm9scywgaWZyYW1lCi0tLT4gCi08IUVMRU1FTlQgYnV0dG9uICVidXR0b24uY29udGVudDs+ICA8IS0tIHB1c2ggYnV0dG9uIC0tPgotPCFBVFRMSVNUIGJ1dHRvbgotICAlYXR0cnM7Ci0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHR5cGUgICAgICAgIChidXR0b258c3VibWl0fHJlc2V0KSAic3VibWl0IgotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gc2luZ2xlLWxpbmUgdGV4dCBpbnB1dCBjb250cm9sIChERVBSRUNBVEVEKSAtLT4KLTwhRUxFTUVOVCBpc2luZGV4IEVNUFRZPgotPCFBVFRMSVNUIGlzaW5kZXgKLSAgJWNvcmVhdHRyczsKLSAgJWkxOG47Ci0gIHByb21wdCAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PT09IFRhYmxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBEZXJpdmVkIGZyb20gSUVURiBIVE1MIHRhYmxlIHN0YW5kYXJkLCBzZWUgW1JGQzE5NDJdIC0tPgotCi08IS0tCi0gVGhlIGJvcmRlciBhdHRyaWJ1dGUgc2V0cyB0aGUgdGhpY2tuZXNzIG9mIHRoZSBmcmFtZSBhcm91bmQgdGhlCi0gdGFibGUuIFRoZSBkZWZhdWx0IHVuaXRzIGFyZSBzY3JlZW4gcGl4ZWxzLgotCi0gVGhlIGZyYW1lIGF0dHJpYnV0ZSBzcGVjaWZpZXMgd2hpY2ggcGFydHMgb2YgdGhlIGZyYW1lIGFyb3VuZAotIHRoZSB0YWJsZSBzaG91bGQgYmUgcmVuZGVyZWQuIFRoZSB2YWx1ZXMgYXJlIG5vdCB0aGUgc2FtZSBhcwotIENBTFMgdG8gYXZvaWQgYSBuYW1lIGNsYXNoIHdpdGggdGhlIHZhbGlnbiBhdHRyaWJ1dGUuCi0tLT4KLTwhRU5USVRZICUgVEZyYW1lICIodm9pZHxhYm92ZXxiZWxvd3xoc2lkZXN8bGhzfHJoc3x2c2lkZXN8Ym94fGJvcmRlcikiPgotCi08IS0tCi0gVGhlIHJ1bGVzIGF0dHJpYnV0ZSBkZWZpbmVzIHdoaWNoIHJ1bGVzIHRvIGRyYXcgYmV0d2VlbiBjZWxsczoKLQotIElmIHJ1bGVzIGlzIGFic2VudCB0aGVuIGFzc3VtZToKLSAgICAgIm5vbmUiIGlmIGJvcmRlciBpcyBhYnNlbnQgb3IgYm9yZGVyPSIwIiBvdGhlcndpc2UgImFsbCIKLS0tPgotCi08IUVOVElUWSAlIFRSdWxlcyAiKG5vbmUgfCBncm91cHMgfCByb3dzIHwgY29scyB8IGFsbCkiPgotICAKLTwhLS0gaG9yaXpvbnRhbCBwbGFjZW1lbnQgb2YgdGFibGUgcmVsYXRpdmUgdG8gZG9jdW1lbnQgLS0+Ci08IUVOVElUWSAlIFRBbGlnbiAiKGxlZnR8Y2VudGVyfHJpZ2h0KSI+Ci0KLTwhLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cwotCi0gIGNoYXIgICAgICAgIGFsaWdubWVudCBjaGFyLCBlLmcuIGNoYXI9IjoiCi0gIGNoYXJvZmYgICAgIG9mZnNldCBmb3IgYWxpZ25tZW50IGNoYXIKLS0tPgotPCFFTlRJVFkgJSBjZWxsaGFsaWduCi0gICJhbGlnbiAgICAgIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5fGNoYXIpICNJTVBMSUVECi0gICBjaGFyICAgICAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gICBjaGFyb2ZmICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhLS0gdmVydGljYWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGx2YWxpZ24KLSAgInZhbGlnbiAgICAgKHRvcHxtaWRkbGV8Ym90dG9tfGJhc2VsaW5lKSAjSU1QTElFRCIKLSAgPgotCi08IUVMRU1FTlQgdGFibGUKLSAgICAgKGNhcHRpb24/LCAoY29sKnxjb2xncm91cCopLCB0aGVhZD8sIHRmb290PywgKHRib2R5K3x0cispKT4KLTwhRUxFTUVOVCBjYXB0aW9uICAlSW5saW5lOz4KLTwhRUxFTUVOVCB0aGVhZCAgICAodHIpKz4KLTwhRUxFTUVOVCB0Zm9vdCAgICAodHIpKz4KLTwhRUxFTUVOVCB0Ym9keSAgICAodHIpKz4KLTwhRUxFTUVOVCBjb2xncm91cCAoY29sKSo+Ci08IUVMRU1FTlQgY29sICAgICAgRU1QVFk+Ci08IUVMRU1FTlQgdHIgICAgICAgKHRofHRkKSs+Ci08IUVMRU1FTlQgdGggICAgICAgJUZsb3c7PgotPCFFTEVNRU5UIHRkICAgICAgICVGbG93Oz4KLQotPCFBVFRMSVNUIHRhYmxlCi0gICVhdHRyczsKLSAgc3VtbWFyeSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgYm9yZGVyICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgZnJhbWUgICAgICAgJVRGcmFtZTsgICAgICAgI0lNUExJRUQKLSAgcnVsZXMgICAgICAgJVRSdWxlczsgICAgICAgI0lNUExJRUQKLSAgY2VsbHNwYWNpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgY2VsbHBhZGRpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgYWxpZ24gICAgICAgJVRBbGlnbjsgICAgICAgI0lNUExJRUQKLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVOVElUWSAlIENBbGlnbiAiKHRvcHxib3R0b218bGVmdHxyaWdodCkiPgotCi08IUFUVExJU1QgY2FwdGlvbgotICAlYXR0cnM7Ci0gIGFsaWduICAgICAgICVDQWxpZ247ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotY29sZ3JvdXAgZ3JvdXBzIGEgc2V0IG9mIGNvbCBlbGVtZW50cy4gSXQgYWxsb3dzIHlvdSB0byBncm91cAotc2V2ZXJhbCBzZW1hbnRpY2FsbHkgcmVsYXRlZCBjb2x1bW5zIHRvZ2V0aGVyLgotLS0+Ci08IUFUVExJU1QgY29sZ3JvdXAKLSAgJWF0dHJzOwotICBzcGFuICAgICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgd2lkdGggICAgICAgJU11bHRpTGVuZ3RoOyAgI0lNUExJRUQKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhLS0KLSBjb2wgZWxlbWVudHMgZGVmaW5lIHRoZSBhbGlnbm1lbnQgcHJvcGVydGllcyBmb3IgY2VsbHMgaW4KLSBvbmUgb3IgbW9yZSBjb2x1bW5zLgotCi0gVGhlIHdpZHRoIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW5zLCBlLmcuCi0KLSAgICAgd2lkdGg9NjQgICAgICAgIHdpZHRoIGluIHNjcmVlbiBwaXhlbHMKLSAgICAgd2lkdGg9MC41KiAgICAgIHJlbGF0aXZlIHdpZHRoIG9mIDAuNQotCi0gVGhlIHNwYW4gYXR0cmlidXRlIGNhdXNlcyB0aGUgYXR0cmlidXRlcyBvZiBvbmUKLSBjb2wgZWxlbWVudCB0byBhcHBseSB0byBtb3JlIHRoYW4gb25lIGNvbHVtbi4KLS0tPgotPCFBVFRMSVNUIGNvbAotICAlYXR0cnM7Ci0gIHNwYW4gICAgICAgICVOdW1iZXI7ICAgICAgICIxIgotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRAotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCEtLQotICAgIFVzZSB0aGVhZCB0byBkdXBsaWNhdGUgaGVhZGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBoZWFkZXJzIHdoZW4KLSAgICB0Ym9keSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotCi0gICAgVXNlIHRmb290IHRvIGR1cGxpY2F0ZSBmb290ZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGZvb3RlcnMgd2hlbgotICAgIHRib2R5IHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgbXVsdGlwbGUgdGJvZHkgc2VjdGlvbnMgd2hlbiBydWxlcyBhcmUgbmVlZGVkCi0gICAgYmV0d2VlbiBncm91cHMgb2YgdGFibGUgcm93cy4KLS0tPgotPCFBVFRMSVNUIHRoZWFkCi0gICVhdHRyczsKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhQVRUTElTVCB0Zm9vdAotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IUFUVExJU1QgdGJvZHkKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCFBVFRMSVNUIHRyCi0gICVhdHRyczsKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gU2NvcGUgaXMgc2ltcGxlciB0aGFuIGhlYWRlcnMgYXR0cmlidXRlIGZvciBjb21tb24gdGFibGVzIC0tPgotPCFFTlRJVFkgJSBTY29wZSAiKHJvd3xjb2x8cm93Z3JvdXB8Y29sZ3JvdXApIj4KLQotPCEtLSB0aCBpcyBmb3IgaGVhZGVycywgdGQgZm9yIGRhdGEgYW5kIGZvciBjZWxscyBhY3RpbmcgYXMgYm90aCAtLT4KLQotPCFBVFRMSVNUIHRoCi0gICVhdHRyczsKLSAgYWJiciAgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgYXhpcyAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgaGVhZGVycyAgICAgSURSRUZTICAgICAgICAgI0lNUExJRUQKLSAgc2NvcGUgICAgICAgJVNjb3BlOyAgICAgICAgI0lNUExJRUQKLSAgcm93c3BhbiAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIGNvbHNwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gIG5vd3JhcCAgICAgIChub3dyYXApICAgICAgICNJTVBMSUVECi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIGhlaWdodCAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCFBVFRMSVNUIHRkCi0gICVhdHRyczsKLSAgYWJiciAgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgYXhpcyAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgaGVhZGVycyAgICAgSURSRUZTICAgICAgICAgI0lNUExJRUQKLSAgc2NvcGUgICAgICAgJVNjb3BlOyAgICAgICAgI0lNUExJRUQKLSAgcm93c3BhbiAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIGNvbHNwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gIG5vd3JhcCAgICAgIChub3dyYXApICAgICAgICNJTVBMSUVECi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIGhlaWdodCAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gID4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sMS1zdHJpY3QuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sMS1zdHJpY3QuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGIxMWEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbDEtc3RyaWN0LmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDk4OCArMCwwIEBACi08IS0tCi0gICBFeHRlbnNpYmxlIEhUTUwgdmVyc2lvbiAxLjAgU3RyaWN0IERURAotCi0gICBUaGlzIGlzIHRoZSBzYW1lIGFzIEhUTUwgNC4wIFN0cmljdCBleGNlcHQgZm9yCi0gICBjaGFuZ2VzIGR1ZSB0byB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBYTUwgYW5kIFNHTUwuCi0KLSAgIE5hbWVzcGFjZSA9IGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwKLQotICAgRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24sIHNlZTogaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxCi0KLSAgIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksCi0gICBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLQotICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIgotCi0gICAkUmV2aXNpb246IDEuMSAkCi0gICAkRGF0ZTogMjAwNy8wNS8xNSAwMjo0MjoyMiAkCi0KLS0tPgotCi08IS0tPT09PT09PT09PT09PT09PSBDaGFyYWN0ZXIgbW5lbW9uaWMgZW50aXRpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIEhUTUxsYXQxIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4gMSBmb3IgWEhUTUwvL0VOIgotICAgInhodG1sLWxhdDEuZW50Ij4KLSVIVE1MbGF0MTsKLQotPCFFTlRJVFkgJSBIVE1Mc3ltYm9sIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scyBmb3IgWEhUTUwvL0VOIgotICAgInhodG1sLXN5bWJvbC5lbnQiPgotJUhUTUxzeW1ib2w7Ci0KLTwhRU5USVRZICUgSFRNTHNwZWNpYWwgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBTcGVjaWFsIGZvciBYSFRNTC8vRU4iCi0gICAieGh0bWwtc3BlY2lhbC5lbnQiPgotJUhUTUxzcGVjaWFsOwotCi08IS0tPT09PT09PT09PT09PT09PT09IEltcG9ydGVkIE5hbWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIENvbnRlbnRUeXBlICJDREFUQSI+Ci0gICAgPCEtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotCi08IUVOVElUWSAlIENvbnRlbnRUeXBlcyAiQ0RBVEEiPgotICAgIDwhLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgdHlwZXMsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldCAiQ0RBVEEiPgotICAgIDwhLS0gYSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldHMgIkNEQVRBIj4KLSAgICA8IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLQotPCFFTlRJVFkgJSBMYW5ndWFnZUNvZGUgIk5NVE9LRU4iPgotICAgIDwhLS0gYSBsYW5ndWFnZSBjb2RlLCBhcyBwZXIgW1JGQzE3NjZdIC0tPgotCi08IUVOVElUWSAlIENoYXJhY3RlciAiQ0RBVEEiPgotICAgIDwhLS0gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gW0lTTzEwNjQ2XSAtLT4KLQotPCFFTlRJVFkgJSBOdW1iZXIgIkNEQVRBIj4KLSAgICA8IS0tIG9uZSBvciBtb3JlIGRpZ2l0cyAtLT4KLQotPCFFTlRJVFkgJSBMaW5rVHlwZXMgIkNEQVRBIj4KLSAgICA8IS0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMgLS0+Ci0KLTwhRU5USVRZICUgTWVkaWFEZXNjICJDREFUQSI+Ci0gICAgPCEtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMgLS0+Ci0KLTwhRU5USVRZICUgVVJJICJDREFUQSI+Ci0gICAgPCEtLSBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciwgc2VlIFtSRkMyMzk2XSAtLT4KLQotPCFFTlRJVFkgJSBVcmlMaXN0ICJDREFUQSI+Ci0gICAgPCEtLSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMgLS0+Ci0KLTwhRU5USVRZICUgRGF0ZXRpbWUgIkNEQVRBIj4KLSAgICA8IS0tIGRhdGUgYW5kIHRpbWUgaW5mb3JtYXRpb24uIElTTyBkYXRlIGZvcm1hdCAtLT4KLQotPCFFTlRJVFkgJSBTY3JpcHQgIkNEQVRBIj4KLSAgICA8IS0tIHNjcmlwdCBleHByZXNzaW9uIC0tPgotCi08IUVOVElUWSAlIFN0eWxlU2hlZXQgIkNEQVRBIj4KLSAgICA8IS0tIHN0eWxlIHNoZWV0IGRhdGEgLS0+Ci0KLTwhRU5USVRZICUgVGV4dCAiQ0RBVEEiPgotICAgIDwhLS0gdXNlZCBmb3IgdGl0bGVzIGV0Yy4gLS0+Ci0KLTwhRU5USVRZICUgRnJhbWVUYXJnZXQgIk5NVE9LRU4iPgotICAgIDwhLS0gcmVuZGVyIGluIHRoaXMgZnJhbWUgLS0+Ci0KLTwhRU5USVRZICUgTGVuZ3RoICJDREFUQSI+Ci0gICAgPCEtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci0KLTwhRU5USVRZICUgTXVsdGlMZW5ndGggIkNEQVRBIj4KLSAgICA8IS0tIHBpeGVsLCBwZXJjZW50YWdlLCBvciByZWxhdGl2ZSAtLT4KLQotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aHMgIkNEQVRBIj4KLSAgICA8IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIE11bHRpTGVuZ3RoIC0tPgotCi08IUVOVElUWSAlIFBpeGVscyAiQ0RBVEEiPgotICAgIDwhLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KLQotPCEtLSB0aGVzZSBhcmUgdXNlZCBmb3IgaW1hZ2UgbWFwcyAtLT4KLQotPCFFTlRJVFkgJSBTaGFwZSAiKHJlY3R8Y2lyY2xlfHBvbHl8ZGVmYXVsdCkiPgotCi08IUVOVElUWSAlIENvb3JkcyAiQ0RBVEEiPgotICAgIDwhLS0gY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbGVuZ3RocyAtLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gR2VuZXJpYyBBdHRyaWJ1dGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBjb3JlIGF0dHJpYnV0ZXMgY29tbW9uIHRvIG1vc3QgZWxlbWVudHMKLSAgaWQgICAgICAgZG9jdW1lbnQtd2lkZSB1bmlxdWUgaWQKLSAgY2xhc3MgICAgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3NlcwotICBzdHlsZSAgICBhc3NvY2lhdGVkIHN0eWxlIGluZm8KLSAgdGl0bGUgICAgYWR2aXNvcnkgdGl0bGUvYW1wbGlmaWNhdGlvbgotLS0+Ci08IUVOVElUWSAlIGNvcmVhdHRycwotICJpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRAotICBjbGFzcyAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzdHlsZSAgICAgICAlU3R5bGVTaGVldDsgICAjSU1QTElFRAotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIGludGVybmF0aW9uYWxpemF0aW9uIGF0dHJpYnV0ZXMKLSAgbGFuZyAgICAgICAgbGFuZ3VhZ2UgY29kZSAoYmFja3dhcmRzIGNvbXBhdGlibGUpCi0gIHhtbDpsYW5nICAgIGxhbmd1YWdlIGNvZGUgKGFzIHBlciBYTUwgMS4wIHNwZWMpCi0gIGRpciAgICAgICAgIGRpcmVjdGlvbiBmb3Igd2Vhay9uZXV0cmFsIHRleHQKLS0tPgotPCFFTlRJVFkgJSBpMThuCi0gImxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIHhtbDpsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhLS0gYXR0cmlidXRlcyBmb3IgY29tbW9uIFVJIGV2ZW50cwotICBvbmNsaWNrICAgICBhIHBvaW50ZXIgYnV0dG9uIHdhcyBjbGlja2VkCi0gIG9uZGJsY2xpY2sgIGEgcG9pbnRlciBidXR0b24gd2FzIGRvdWJsZSBjbGlja2VkCi0gIG9ubW91c2Vkb3duIGEgcG9pbnRlciBidXR0b24gd2FzIHByZXNzZWQgZG93bgotICBvbm1vdXNldXAgICBhIHBvaW50ZXIgYnV0dG9uIHdhcyByZWxlYXNlZAotICBvbm1vdXNlbW92ZSBhIHBvaW50ZXIgd2FzIG1vdmVkIG9udG8gdGhlIGVsZW1lbnQKLSAgb25tb3VzZW91dCAgYSBwb2ludGVyIHdhcyBtb3ZlZCBhd2F5IGZyb20gdGhlIGVsZW1lbnQKLSAgb25rZXlwcmVzcyAgYSBrZXkgd2FzIHByZXNzZWQgYW5kIHJlbGVhc2VkCi0gIG9ua2V5ZG93biAgIGEga2V5IHdhcyBwcmVzc2VkIGRvd24KLSAgb25rZXl1cCAgICAgYSBrZXkgd2FzIHJlbGVhc2VkCi0tLT4KLTwhRU5USVRZICUgZXZlbnRzCi0gIm9uY2xpY2sgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uZGJsY2xpY2sgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2Vkb3duICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2V1cCAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2VvdmVyICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2Vtb3ZlICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2VvdXQgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ua2V5cHJlc3MgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ua2V5ZG93biAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ua2V5dXAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhLS0gYXR0cmlidXRlcyBmb3IgZWxlbWVudHMgdGhhdCBjYW4gZ2V0IHRoZSBmb2N1cwotICBhY2Nlc3NrZXkgICBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIKLSAgdGFiaW5kZXggICAgcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlcgotICBvbmZvY3VzICAgICB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzCi0gIG9uYmx1ciAgICAgIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzCi0tLT4KLTwhRU5USVRZICUgZm9jdXMKLSAiYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQiCi0gID4KLQotPCFFTlRJVFkgJSBhdHRycyAiJWNvcmVhdHRyczsgJWkxOG47ICVldmVudHM7Ij4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gVGV4dCBFbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBzcGVjaWFsCi0gICAiYnIgfCBzcGFuIHwgYmRvIHwgb2JqZWN0IHwgaW1nIHwgbWFwIj4KLQotPCFFTlRJVFkgJSBmb250c3R5bGUgInR0IHwgaSB8IGIgfCBiaWcgfCBzbWFsbCI+Ci0KLTwhRU5USVRZICUgcGhyYXNlICJlbSB8IHN0cm9uZyB8IGRmbiB8IGNvZGUgfCBxIHwgc3ViIHwgc3VwIHwKLSAgICAgICAgICAgICAgICAgICBzYW1wIHwga2JkIHwgdmFyIHwgY2l0ZSB8IGFiYnIgfCBhY3JvbnltIj4KLQotPCFFTlRJVFkgJSBpbmxpbmUuZm9ybXMgImlucHV0IHwgc2VsZWN0IHwgdGV4dGFyZWEgfCBsYWJlbCB8IGJ1dHRvbiI+Ci0KLTwhLS0gdGhlc2UgY2FuIG9jY3VyIGF0IGJsb2NrIG9yIGlubGluZSBsZXZlbCAtLT4KLTwhRU5USVRZICUgbWlzYyAiaW5zIHwgZGVsIHwgc2NyaXB0IHwgbm9zY3JpcHQiPgotCi08IUVOVElUWSAlIGlubGluZSAiYSB8ICVzcGVjaWFsOyB8ICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlaW5saW5lLmZvcm1zOyI+Ci0KLTwhLS0gJUlubGluZTsgY292ZXJzIGlubGluZSBvciAidGV4dC1sZXZlbCIgZWxlbWVudHMgLS0+Ci08IUVOVElUWSAlIElubGluZSAiKCNQQ0RBVEEgfCAlaW5saW5lOyB8ICVtaXNjOykqIj4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBCbG9jayBsZXZlbCBlbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBoZWFkaW5nICJoMXxoMnxoM3xoNHxoNXxoNiI+Ci08IUVOVElUWSAlIGxpc3RzICJ1bCB8IG9sIHwgZGwiPgotPCFFTlRJVFkgJSBibG9ja3RleHQgInByZSB8IGhyIHwgYmxvY2txdW90ZSB8IGFkZHJlc3MiPgotCi08IUVOVElUWSAlIGJsb2NrCi0gICAgICJwIHwgJWhlYWRpbmc7IHwgZGl2IHwgJWxpc3RzOyB8ICVibG9ja3RleHQ7IHwgZmllbGRzZXQgfCB0YWJsZSI+Ci0KLTwhRU5USVRZICUgQmxvY2sgIiglYmxvY2s7IHwgZm9ybSB8ICVtaXNjOykqIj4KLQotPCEtLSAlRmxvdzsgbWl4ZXMgQmxvY2sgYW5kIElubGluZSBhbmQgaXMgdXNlZCBmb3IgbGlzdCBpdGVtcyBldGMuIC0tPgotPCFFTlRJVFkgJSBGbG93ICIoI1BDREFUQSB8ICVibG9jazsgfCBmb3JtIHwgJWlubGluZTsgfCAlbWlzYzspKiI+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gQ29udGVudCBtb2RlbHMgZm9yIGV4Y2x1c2lvbnMgPT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gYSBlbGVtZW50cyB1c2UgJUlubGluZTsgZXhjbHVkaW5nIGEgLS0+Ci0KLTwhRU5USVRZICUgYS5jb250ZW50Ci0gICAiKCNQQ0RBVEEgfCAlc3BlY2lhbDsgfCAlZm9udHN0eWxlOyB8ICVwaHJhc2U7IHwgJWlubGluZS5mb3JtczsgfCAlbWlzYzspKiI+Ci0KLTwhLS0gcHJlIHVzZXMgJUlubGluZSBleGNsdWRpbmcgaW1nLCBvYmplY3QsIGJpZywgc21hbGwsIHN1cCBvciBzdXAgLS0+Ci0KLTwhRU5USVRZICUgcHJlLmNvbnRlbnQKLSAgICIoI1BDREFUQSB8IGEgfCBiciB8IHNwYW4gfCBiZG8gfCBtYXAgfCB0dCB8IGkgfCBiIHwKLSAgICAgICVwaHJhc2U7IHwgJWlubGluZS5mb3JtczspKiI+Ci0KLTwhLS0gZm9ybSB1c2VzICVCbG9jazsgZXhjbHVkaW5nIGZvcm0gLS0+Ci0KLTwhRU5USVRZICUgZm9ybS5jb250ZW50ICIoJWJsb2NrOyB8ICVtaXNjOykqIj4KLQotPCEtLSBidXR0b24gdXNlcyAlRmxvdzsgYnV0IGV4Y2x1ZGVzIGEsIGZvcm0gYW5kIGZvcm0gY29udHJvbHMgLS0+Ci0KLTwhRU5USVRZICUgYnV0dG9uLmNvbnRlbnQKLSAgICIoI1BDREFUQSB8IHAgfCAlaGVhZGluZzsgfCBkaXYgfCAlbGlzdHM7IHwgJWJsb2NrdGV4dDsgfAotICAgIHRhYmxlIHwgJXNwZWNpYWw7IHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVtaXNjOykqIj4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgU3RydWN0dXJlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSB0aGUgbmFtZXNwYWNlIFVSSSBkZXNpZ25hdGVzIHRoZSBkb2N1bWVudCBwcm9maWxlIC0tPgotCi08IUVMRU1FTlQgaHRtbCAoaGVhZCwgYm9keSk+Ci08IUFUVExJU1QgaHRtbAotICAlaTE4bjsKLSAgeG1sbnMgICAgICAgJVVSSTsgICAgICAgICAgI0ZJWEVEICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IERvY3VtZW50IEhlYWQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgaGVhZC5taXNjICIoc2NyaXB0fHN0eWxlfG1ldGF8bGlua3xvYmplY3QpKiI+Ci0KLTwhLS0gY29udGVudCBtb2RlbCBpcyAlaGVhZC5taXNjOyBjb21iaW5lZCB3aXRoIGEgc2luZ2xlCi0gICAgIHRpdGxlIGFuZCBhbiBvcHRpb25hbCBiYXNlIGVsZW1lbnQgaW4gYW55IG9yZGVyIC0tPgotCi08IUVMRU1FTlQgaGVhZCAoJWhlYWQubWlzYzssCi0gICAgICgodGl0bGUsICVoZWFkLm1pc2M7LCAoYmFzZSwgJWhlYWQubWlzYzspPykgfAotICAgICAgKGJhc2UsICVoZWFkLm1pc2M7LCAodGl0bGUsICVoZWFkLm1pc2M7KSkpKT4KLQotPCFBVFRMSVNUIGhlYWQKLSAgJWkxOG47Ci0gIHByb2ZpbGUgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBUaGUgdGl0bGUgZWxlbWVudCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBmbG93IG9mIHRleHQuCi0gICAgICAgSXQgc2hvdWxkIGJlIGRpc3BsYXllZCwgZm9yIGV4YW1wbGUgYXMgdGhlIHBhZ2UgaGVhZGVyIG9yCi0gICAgICAgd2luZG93IHRpdGxlLiBFeGFjdGx5IG9uZSB0aXRsZSBpcyByZXF1aXJlZCBwZXIgZG9jdW1lbnQuCi0gICAgLS0+Ci08IUVMRU1FTlQgdGl0bGUgKCNQQ0RBVEEpPgotPCFBVFRMSVNUIHRpdGxlICVpMThuOz4KLQotPCEtLSBkb2N1bWVudCBiYXNlIFVSSSAtLT4KLQotPCFFTEVNRU5UIGJhc2UgRU1QVFk+Ci08IUFUVExJU1QgYmFzZQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gZ2VuZXJpYyBtZXRhaW5mb3JtYXRpb24gLS0+Ci08IUVMRU1FTlQgbWV0YSBFTVBUWT4KLTwhQVRUTElTVCBtZXRhCi0gICVpMThuOwotICBodHRwLWVxdWl2ICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBjb250ZW50ICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQKLSAgc2NoZW1lICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gIFJlbGF0aW9uc2hpcCB2YWx1ZXMgY2FuIGJlIHVzZWQgaW4gcHJpbmNpcGxlOgotCi0gICBhKSBmb3IgZG9jdW1lbnQgc3BlY2lmaWMgdG9vbGJhcnMvbWVudXMgd2hlbiB1c2VkCi0gICAgICB3aXRoIHRoZSBsaW5rIGVsZW1lbnQgaW4gZG9jdW1lbnQgaGVhZCBlLmcuCi0gICAgICAgIHN0YXJ0LCBjb250ZW50cywgcHJldmlvdXMsIG5leHQsIGluZGV4LCBlbmQsIGhlbHAKLSAgIGIpIHRvIGxpbmsgdG8gYSBzZXBhcmF0ZSBzdHlsZSBzaGVldCAocmVsPSJzdHlsZXNoZWV0IikKLSAgIGMpIHRvIG1ha2UgYSBsaW5rIHRvIGEgc2NyaXB0IChyZWw9InNjcmlwdCIpCi0gICBkKSBieSBzdHlsZXNoZWV0cyB0byBjb250cm9sIGhvdyBjb2xsZWN0aW9ucyBvZgotICAgICAgaHRtbCBub2RlcyBhcmUgcmVuZGVyZWQgaW50byBwcmludGVkIGRvY3VtZW50cwotICAgZSkgdG8gbWFrZSBhIGxpbmsgdG8gYSBwcmludGFibGUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBlLmcuIGEgUG9zdFNjcmlwdCBvciBQREYgdmVyc2lvbiAocmVsPSJhbHRlcm5hdGUiIG1lZGlhPSJwcmludCIpCi0tLT4KLQotPCFFTEVNRU5UIGxpbmsgRU1QVFk+Ci08IUFUVExJU1QgbGluawotICAlYXR0cnM7Ci0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVECi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGhyZWZsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gIHJlbCAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVECi0gIHJldiAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVECi0gIG1lZGlhICAgICAgICVNZWRpYURlc2M7ICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBzdHlsZSBpbmZvLCB3aGljaCBtYXkgaW5jbHVkZSBDREFUQSBzZWN0aW9ucyAtLT4KLTwhRUxFTUVOVCBzdHlsZSAoI1BDREFUQSk+Ci08IUFUVExJU1Qgc3R5bGUKLSAgJWkxOG47Ci0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNSRVFVSVJFRAotICBtZWRpYSAgICAgICAlTWVkaWFEZXNjOyAgICAjSU1QTElFRAotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICB4bWw6c3BhY2UgICAocHJlc2VydmUpICAgICAjRklYRUQgJ3ByZXNlcnZlJwotICA+Ci0KLTwhLS0gc2NyaXB0IHN0YXRlbWVudHMsIHdoaWNoIG1heSBpbmNsdWRlIENEQVRBIHNlY3Rpb25zIC0tPgotPCFFTEVNRU5UIHNjcmlwdCAoI1BDREFUQSk+Ci08IUFUVExJU1Qgc2NyaXB0Ci0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVECi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNSRVFVSVJFRAotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBkZWZlciAgICAgICAoZGVmZXIpICAgICAgICAjSU1QTElFRAotICB4bWw6c3BhY2UgICAocHJlc2VydmUpICAgICAjRklYRUQgJ3ByZXNlcnZlJwotICA+Ci0KLTwhLS0gYWx0ZXJuYXRlIGNvbnRlbnQgY29udGFpbmVyIGZvciBub24gc2NyaXB0LWJhc2VkIHJlbmRlcmluZyAtLT4KLQotPCFFTEVNRU5UIG5vc2NyaXB0ICVCbG9jazs+Ci08IUFUVExJU1Qgbm9zY3JpcHQKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IERvY3VtZW50IEJvZHkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBib2R5ICVCbG9jazs+Ci08IUFUVExJU1QgYm9keQotICAlYXR0cnM7Ci0gIG9ubG9hZCAgICAgICAgICAlU2NyaXB0OyAgICNJTVBMSUVECi0gIG9udW5sb2FkICAgICAgICAlU2NyaXB0OyAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIGRpdiAlRmxvdzs+ICA8IS0tIGdlbmVyaWMgbGFuZ3VhZ2Uvc3R5bGUgY29udGFpbmVyIC0tPgotPCFBVFRMSVNUIGRpdgotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUGFyYWdyYXBocyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIHAgJUlubGluZTs+Ci08IUFUVExJU1QgcAotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSGVhZGluZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICBUaGVyZSBhcmUgc2l4IGxldmVscyBvZiBoZWFkaW5ncyBmcm9tIGgxICh0aGUgbW9zdCBpbXBvcnRhbnQpCi0gIHRvIGg2ICh0aGUgbGVhc3QgaW1wb3J0YW50KS4KLS0tPgotCi08IUVMRU1FTlQgaDEgICVJbmxpbmU7PgotPCFBVFRMSVNUIGgxCi0gICAlYXR0cnM7Ci0gICA+Ci0KLTwhRUxFTUVOVCBoMiAlSW5saW5lOz4KLTwhQVRUTElTVCBoMgotICAgJWF0dHJzOwotICAgPgotCi08IUVMRU1FTlQgaDMgJUlubGluZTs+Ci08IUFUVExJU1QgaDMKLSAgICVhdHRyczsKLSAgID4KLQotPCFFTEVNRU5UIGg0ICVJbmxpbmU7PgotPCFBVFRMSVNUIGg0Ci0gICAlYXR0cnM7Ci0gICA+Ci0KLTwhRUxFTUVOVCBoNSAlSW5saW5lOz4KLTwhQVRUTElTVCBoNQotICAgJWF0dHJzOwotICAgPgotCi08IUVMRU1FTlQgaDYgJUlubGluZTs+Ci08IUFUVExJU1QgaDYKLSAgICVhdHRyczsKLSAgID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gTGlzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBVbm9yZGVyZWQgbGlzdCAtLT4KLQotPCFFTEVNRU5UIHVsIChsaSkrPgotPCFBVFRMSVNUIHVsCi0gICVhdHRyczsKLSAgPgotCi08IS0tIE9yZGVyZWQgKG51bWJlcmVkKSBsaXN0IC0tPgotCi08IUVMRU1FTlQgb2wgKGxpKSs+Ci08IUFUVExJU1Qgb2wKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS0gbGlzdCBpdGVtIC0tPgotCi08IUVMRU1FTlQgbGkgJUZsb3c7PgotPCFBVFRMSVNUIGxpCi0gICVhdHRyczsKLSAgPgotCi08IS0tIGRlZmluaXRpb24gbGlzdHMgLSBkdCBmb3IgdGVybSwgZGQgZm9yIGl0cyBkZWZpbml0aW9uIC0tPgotCi08IUVMRU1FTlQgZGwgKGR0fGRkKSs+Ci08IUFUVExJU1QgZGwKLSAgJWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBkdCAlSW5saW5lOz4KLTwhQVRUTElTVCBkdAotICAlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGRkICVGbG93Oz4KLTwhQVRUTElTVCBkZAotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gQWRkcmVzcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBpbmZvcm1hdGlvbiBvbiBhdXRob3IgLS0+Ci0KLTwhRUxFTUVOVCBhZGRyZXNzICVJbmxpbmU7PgotPCFBVFRMSVNUIGFkZHJlc3MKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEhvcml6b250YWwgUnVsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBociBFTVBUWT4KLTwhQVRUTElTVCBocgotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUHJlZm9ybWF0dGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBjb250ZW50IGlzICVJbmxpbmU7IGV4Y2x1ZGluZyAiaW1nfG9iamVjdHxiaWd8c21hbGx8c3VifHN1cCIgLS0+Ci0KLTwhRUxFTUVOVCBwcmUgJXByZS5jb250ZW50Oz4KLTwhQVRUTElTVCBwcmUKLSAgJWF0dHJzOwotICB4bWw6c3BhY2UgKHByZXNlcnZlKSAjRklYRUQgJ3ByZXNlcnZlJwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEJsb2NrLWxpa2UgUXVvdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBibG9ja3F1b3RlICVCbG9jazs+Ci08IUFUVExJU1QgYmxvY2txdW90ZQotICAlYXR0cnM7Ci0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSW5zZXJ0ZWQvRGVsZXRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICBpbnMvZGVsIGFyZSBhbGxvd2VkIGluIGJsb2NrIGFuZCBpbmxpbmUgY29udGVudCwgYnV0IGl0cwotICBpbmFwcHJvcHJpYXRlIHRvIGluY2x1ZGUgYmxvY2sgY29udGVudCB3aXRoaW4gYW4gaW5zIGVsZW1lbnQKLSAgb2NjdXJyaW5nIGluIGlubGluZSBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgaW5zICVGbG93Oz4KLTwhQVRUTElTVCBpbnMKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBkYXRldGltZSAgICAlRGF0ZXRpbWU7ICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBkZWwgJUZsb3c7PgotPCFBVFRMSVNUIGRlbAotICAlYXR0cnM7Ci0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGRhdGV0aW1lICAgICVEYXRldGltZTsgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBUaGUgQW5jaG9yIEVsZW1lbnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBjb250ZW50IGlzICVJbmxpbmU7IGV4Y2VwdCB0aGF0IGFuY2hvcnMgc2hvdWxkbid0IGJlIG5lc3RlZCAtLT4KLQotPCFFTEVNRU5UIGEgJWEuY29udGVudDs+Ci08IUFUVExJU1QgYQotICAlYXR0cnM7Ci0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVECi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGhyZWZsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIHJlbCAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVECi0gIHJldiAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgICJyZWN0IgotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT0gSW5saW5lIEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBzcGFuICVJbmxpbmU7PiA8IS0tIGdlbmVyaWMgbGFuZ3VhZ2Uvc3R5bGUgY29udGFpbmVyIC0tPgotPCFBVFRMSVNUIHNwYW4KLSAgJWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBiZG8gJUlubGluZTs+ICA8IS0tIEkxOE4gQmlEaSBvdmVyLXJpZGUgLS0+Ci08IUFUVExJU1QgYmRvCi0gICVjb3JlYXR0cnM7Ci0gICVldmVudHM7Ci0gIGxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIHhtbDpsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNSRVFVSVJFRAotICA+Ci0KLTwhRUxFTUVOVCBiciBFTVBUWT4gICA8IS0tIGZvcmNlZCBsaW5lIGJyZWFrIC0tPgotPCFBVFRMSVNUIGJyCi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGVtICVJbmxpbmU7PiAgIDwhLS0gZW1waGFzaXMgLS0+Ci08IUFUVExJU1QgZW0gJWF0dHJzOz4KLQotPCFFTEVNRU5UIHN0cm9uZyAlSW5saW5lOz4gICA8IS0tIHN0cm9uZyBlbXBoYXNpcyAtLT4KLTwhQVRUTElTVCBzdHJvbmcgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGRmbiAlSW5saW5lOz4gICA8IS0tIGRlZmluaXRpb25hbCAtLT4KLTwhQVRUTElTVCBkZm4gJWF0dHJzOz4KLQotPCFFTEVNRU5UIGNvZGUgJUlubGluZTs+ICAgPCEtLSBwcm9ncmFtIGNvZGUgLS0+Ci08IUFUVExJU1QgY29kZSAlYXR0cnM7PgotCi08IUVMRU1FTlQgc2FtcCAlSW5saW5lOz4gICA8IS0tIHNhbXBsZSAtLT4KLTwhQVRUTElTVCBzYW1wICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBrYmQgJUlubGluZTs+ICA8IS0tIHNvbWV0aGluZyB1c2VyIHdvdWxkIHR5cGUgLS0+Ci08IUFUVExJU1Qga2JkICVhdHRyczs+Ci0KLTwhRUxFTUVOVCB2YXIgJUlubGluZTs+ICAgPCEtLSB2YXJpYWJsZSAtLT4KLTwhQVRUTElTVCB2YXIgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGNpdGUgJUlubGluZTs+ICAgPCEtLSBjaXRhdGlvbiAtLT4KLTwhQVRUTElTVCBjaXRlICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBhYmJyICVJbmxpbmU7PiAgIDwhLS0gYWJicmV2aWF0aW9uIC0tPgotPCFBVFRMSVNUIGFiYnIgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGFjcm9ueW0gJUlubGluZTs+ICAgPCEtLSBhY3JvbnltIC0tPgotPCFBVFRMSVNUIGFjcm9ueW0gJWF0dHJzOz4KLQotPCFFTEVNRU5UIHEgJUlubGluZTs+ICAgPCEtLSBpbmxpbmVkIHF1b3RlIC0tPgotPCFBVFRMSVNUIHEKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBzdWIgJUlubGluZTs+IDwhLS0gc3Vic2NyaXB0IC0tPgotPCFBVFRMSVNUIHN1YiAlYXR0cnM7PgotCi08IUVMRU1FTlQgc3VwICVJbmxpbmU7PiA8IS0tIHN1cGVyc2NyaXB0IC0tPgotPCFBVFRMSVNUIHN1cCAlYXR0cnM7PgotCi08IUVMRU1FTlQgdHQgJUlubGluZTs+ICAgPCEtLSBmaXhlZCBwaXRjaCBmb250IC0tPgotPCFBVFRMSVNUIHR0ICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBpICVJbmxpbmU7PiAgIDwhLS0gaXRhbGljIGZvbnQgLS0+Ci08IUFUVExJU1QgaSAlYXR0cnM7PgotCi08IUVMRU1FTlQgYiAlSW5saW5lOz4gICA8IS0tIGJvbGQgZm9udCAtLT4KLTwhQVRUTElTVCBiICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBiaWcgJUlubGluZTs+ICAgPCEtLSBiaWdnZXIgZm9udCAtLT4KLTwhQVRUTElTVCBiaWcgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHNtYWxsICVJbmxpbmU7PiAgIDwhLS0gc21hbGxlciBmb250IC0tPgotPCFBVFRMSVNUIHNtYWxsICVhdHRyczs+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PSBPYmplY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0KLSAgb2JqZWN0IGlzIHVzZWQgdG8gZW1iZWQgb2JqZWN0cyBhcyBwYXJ0IG9mIEhUTUwgcGFnZXMuCi0gIHBhcmFtIGVsZW1lbnRzIHNob3VsZCBwcmVjZWRlIG90aGVyIGNvbnRlbnQuIFBhcmFtZXRlcnMKLSAgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGFzIGF0dHJpYnV0ZS92YWx1ZSBwYWlycyBvbiB0aGUKLSAgb2JqZWN0IGVsZW1lbnQgaXRzZWxmIHdoZW4gYnJldml0eSBpcyBkZXNpcmVkLgotLS0+Ci0KLTwhRUxFTUVOVCBvYmplY3QgKCNQQ0RBVEEgfCBwYXJhbSB8ICVibG9jazsgfCBmb3JtIHwgJWlubGluZTsgfCAlbWlzYzspKj4KLTwhQVRUTElTVCBvYmplY3QKLSAgJWF0dHJzOwotICBkZWNsYXJlICAgICAoZGVjbGFyZSkgICAgICAjSU1QTElFRAotICBjbGFzc2lkICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBjb2RlYmFzZSAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBkYXRhICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICBjb2RldHlwZSAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICBhcmNoaXZlICAgICAlVXJpTGlzdDsgICAgICAjSU1QTElFRAotICBzdGFuZGJ5ICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSAgcGFyYW0gaXMgdXNlZCB0byBzdXBwbHkgYSBuYW1lZCBwcm9wZXJ0eSB2YWx1ZS4KLSAgSW4gWE1MIGl0IHdvdWxkIHNlZW0gbmF0dXJhbCB0byBmb2xsb3cgUkRGIGFuZCBzdXBwb3J0IGFuCi0gIGFiYnJldmlhdGVkIHN5bnRheCB3aGVyZSB0aGUgcGFyYW0gZWxlbWVudHMgYXJlIHJlcGxhY2VkCi0gIGJ5IGF0dHJpYnV0ZSB2YWx1ZSBwYWlycyBvbiB0aGUgb2JqZWN0IHN0YXJ0IHRhZy4KLS0tPgotPCFFTEVNRU5UIHBhcmFtIEVNUFRZPgotPCFBVFRMSVNUIHBhcmFtCi0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHZhbHVldHlwZSAgIChkYXRhfHJlZnxvYmplY3QpICJkYXRhIgotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEltYWdlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgIFRvIGF2b2lkIGFjY2Vzc2liaWxpdHkgcHJvYmxlbXMgZm9yIHBlb3BsZSB3aG8gYXJlbid0Ci0gICBhYmxlIHRvIHNlZSB0aGUgaW1hZ2UsIHlvdSBzaG91bGQgcHJvdmlkZSBhIHRleHQKLSAgIGRlc2NyaXB0aW9uIHVzaW5nIHRoZSBhbHQgYW5kIGxvbmdkZXNjIGF0dHJpYnV0ZXMuCi0gICBJbiBhZGRpdGlvbiwgYXZvaWQgdGhlIHVzZSBvZiBzZXJ2ZXItc2lkZSBpbWFnZSBtYXBzLgotICAgTm90ZSB0aGF0IGluIHRoaXMgRFREIHRoZXJlIGlzIG5vIG5hbWUgYXR0cmlidXRlLiBUaGF0Ci0gICBpcyBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgdHJhbnNpdGlvbmFsIGFuZCBmcmFtZXNldCBEVEQuCi0tLT4KLQotPCFFTEVNRU5UIGltZyBFTVBUWT4KLTwhQVRUTElTVCBpbWcKLSAgJWF0dHJzOwotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjUkVRVUlSRUQKLSAgYWx0ICAgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVECi0gIGxvbmdkZXNjICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGlzbWFwICAgICAgIChpc21hcCkgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSB1c2VtYXAgcG9pbnRzIHRvIGEgbWFwIGVsZW1lbnQgd2hpY2ggbWF5IGJlIGluIHRoaXMgZG9jdW1lbnQKLSAgb3IgYW4gZXh0ZXJuYWwgZG9jdW1lbnQsIGFsdGhvdWdoIHRoZSBsYXR0ZXIgaXMgbm90IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gQ2xpZW50LXNpZGUgaW1hZ2UgbWFwcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gVGhlc2UgY2FuIGJlIHBsYWNlZCBpbiB0aGUgc2FtZSBkb2N1bWVudCBvciBncm91cGVkIGluIGEKLSAgICAgc2VwYXJhdGUgZG9jdW1lbnQgYWx0aG91Z2ggdGhpcyBpc24ndCB5ZXQgd2lkZWx5IHN1cHBvcnRlZCAtLT4KLQotPCFFTEVNRU5UIG1hcCAoKCVibG9jazsgfCBmb3JtIHwgJW1pc2M7KSsgfCBhcmVhKyk+Ci08IUFUVExJU1QgbWFwCi0gICVpMThuOwotICAlZXZlbnRzOwotICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjUkVRVUlSRUQKLSAgY2xhc3MgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgc3R5bGUgICAgICAgJVN0eWxlU2hlZXQ7ICAgI0lNUExJRUQKLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgYXJlYSBFTVBUWT4KLTwhQVRUTElTVCBhcmVhCi0gICVhdHRyczsKLSAgc2hhcGUgICAgICAgJVNoYXBlOyAgICAgICAgInJlY3QiCi0gIGNvb3JkcyAgICAgICVDb29yZHM7ICAgICAgICNJTVBMSUVECi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIG5vaHJlZiAgICAgIChub2hyZWYpICAgICAgICNJTVBMSUVECi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IEZvcm1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IUVMRU1FTlQgZm9ybSAlZm9ybS5jb250ZW50Oz4gICA8IS0tIGZvcm1zIHNob3VsZG4ndCBiZSBuZXN0ZWQgLS0+Ci0KLTwhQVRUTElTVCBmb3JtCi0gICVhdHRyczsKLSAgYWN0aW9uICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVECi0gIG1ldGhvZCAgICAgIChnZXR8cG9zdCkgICAgICJnZXQiCi0gIGVuY3R5cGUgICAgICVDb250ZW50VHlwZTsgICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCi0gIG9uc3VibWl0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ucmVzZXQgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIGFjY2VwdCAgICAgICVDb250ZW50VHlwZXM7ICNJTVBMSUVECi0gIGFjY2VwdC1jaGFyc2V0ICVDaGFyc2V0czsgICNJTVBMSUVECi0gID4KLQotPCEtLQotICBFYWNoIGxhYmVsIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIE9ORSBmaWVsZAotICBMYWJlbCBlbGVtZW50cyBzaG91bGRuJ3QgYmUgbmVzdGVkLgotLS0+Ci08IUVMRU1FTlQgbGFiZWwgJUlubGluZTs+Ci08IUFUVExJU1QgbGFiZWwKLSAgJWF0dHJzOwotICBmb3IgICAgICAgICBJRFJFRiAgICAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRU5USVRZICUgSW5wdXRUeXBlCi0gICIodGV4dCB8IHBhc3N3b3JkIHwgY2hlY2tib3ggfAotICAgIHJhZGlvIHwgc3VibWl0IHwgcmVzZXQgfAotICAgIGZpbGUgfCBoaWRkZW4gfCBpbWFnZSB8IGJ1dHRvbikiCi0gICA+Ci0KLTwhLS0gdGhlIG5hbWUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIGZvciBhbGwgYnV0IHN1Ym1pdCAmIHJlc2V0IC0tPgotCi08IUVMRU1FTlQgaW5wdXQgRU1QVFk+ICAgICA8IS0tIGZvcm0gY29udHJvbCAtLT4KLTwhQVRUTElTVCBpbnB1dAotICAlYXR0cnM7Ci0gIHR5cGUgICAgICAgICVJbnB1dFR5cGU7ICAgICJ0ZXh0IgotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBjaGVja2VkICAgICAoY2hlY2tlZCkgICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRAotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBtYXhsZW5ndGggICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBhbHQgICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBzZWxlY3QgKG9wdGdyb3VwfG9wdGlvbikrPiAgPCEtLSBvcHRpb24gc2VsZWN0b3IgLS0+Ci08IUFUVExJU1Qgc2VsZWN0Ci0gICVhdHRyczsKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgc2l6ZSAgICAgICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgbXVsdGlwbGUgICAgKG11bHRpcGxlKSAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgb3B0Z3JvdXAgKG9wdGlvbikrPiAgIDwhLS0gb3B0aW9uIGdyb3VwIC0tPgotPCFBVFRMSVNUIG9wdGdyb3VwCi0gICVhdHRyczsKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVECi0gID4KLQotPCFFTEVNRU5UIG9wdGlvbiAoI1BDREFUQSk+ICAgICA8IS0tIHNlbGVjdGFibGUgY2hvaWNlIC0tPgotPCFBVFRMSVNUIG9wdGlvbgotICAlYXR0cnM7Ci0gIHNlbGVjdGVkICAgIChzZWxlY3RlZCkgICAgICNJTVBMSUVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIGxhYmVsICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIHRleHRhcmVhICgjUENEQVRBKT4gICAgIDwhLS0gbXVsdGktbGluZSB0ZXh0IGZpZWxkIC0tPgotPCFBVFRMSVNUIHRleHRhcmVhCi0gICVhdHRyczsKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgcm93cyAgICAgICAgJU51bWJlcjsgICAgICAgI1JFUVVJUkVECi0gIGNvbHMgICAgICAgICVOdW1iZXI7ICAgICAgICNSRVFVSVJFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSAgVGhlIGZpZWxkc2V0IGVsZW1lbnQgaXMgdXNlZCB0byBncm91cCBmb3JtIGZpZWxkcy4KLSAgT25seSBvbmUgbGVnZW5kIGVsZW1lbnQgc2hvdWxkIG9jY3VyIGluIHRoZSBjb250ZW50Ci0gIGFuZCBpZiBwcmVzZW50IHNob3VsZCBvbmx5IGJlIHByZWNlZGVkIGJ5IHdoaXRlc3BhY2UuCi0tLT4KLTwhRUxFTUVOVCBmaWVsZHNldCAoI1BDREFUQSB8IGxlZ2VuZCB8ICVibG9jazsgfCBmb3JtIHwgJWlubGluZTsgfCAlbWlzYzspKj4KLTwhQVRUTElTVCBmaWVsZHNldAotICAlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGxlZ2VuZCAlSW5saW5lOz4gICAgIDwhLS0gZmllbGRzZXQgbGFiZWwgLS0+Ci08IUFUVExJU1QgbGVnZW5kCi0gICVhdHRyczsKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gQ29udGVudCBpcyAlRmxvdzsgZXhjbHVkaW5nIGEsIGZvcm0gYW5kIGZvcm0gY29udHJvbHMKLS0tPiAKLTwhRUxFTUVOVCBidXR0b24gJWJ1dHRvbi5jb250ZW50Oz4gIDwhLS0gcHVzaCBidXR0b24gLS0+Ci08IUFUVExJU1QgYnV0dG9uCi0gICVhdHRyczsKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgKGJ1dHRvbnxzdWJtaXR8cmVzZXQpICJzdWJtaXQiCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PT09IFRhYmxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBEZXJpdmVkIGZyb20gSUVURiBIVE1MIHRhYmxlIHN0YW5kYXJkLCBzZWUgW1JGQzE5NDJdIC0tPgotCi08IS0tCi0gVGhlIGJvcmRlciBhdHRyaWJ1dGUgc2V0cyB0aGUgdGhpY2tuZXNzIG9mIHRoZSBmcmFtZSBhcm91bmQgdGhlCi0gdGFibGUuIFRoZSBkZWZhdWx0IHVuaXRzIGFyZSBzY3JlZW4gcGl4ZWxzLgotCi0gVGhlIGZyYW1lIGF0dHJpYnV0ZSBzcGVjaWZpZXMgd2hpY2ggcGFydHMgb2YgdGhlIGZyYW1lIGFyb3VuZAotIHRoZSB0YWJsZSBzaG91bGQgYmUgcmVuZGVyZWQuIFRoZSB2YWx1ZXMgYXJlIG5vdCB0aGUgc2FtZSBhcwotIENBTFMgdG8gYXZvaWQgYSBuYW1lIGNsYXNoIHdpdGggdGhlIHZhbGlnbiBhdHRyaWJ1dGUuCi0tLT4KLTwhRU5USVRZICUgVEZyYW1lICIodm9pZHxhYm92ZXxiZWxvd3xoc2lkZXN8bGhzfHJoc3x2c2lkZXN8Ym94fGJvcmRlcikiPgotCi08IS0tCi0gVGhlIHJ1bGVzIGF0dHJpYnV0ZSBkZWZpbmVzIHdoaWNoIHJ1bGVzIHRvIGRyYXcgYmV0d2VlbiBjZWxsczoKLQotIElmIHJ1bGVzIGlzIGFic2VudCB0aGVuIGFzc3VtZToKLSAgICAgIm5vbmUiIGlmIGJvcmRlciBpcyBhYnNlbnQgb3IgYm9yZGVyPSIwIiBvdGhlcndpc2UgImFsbCIKLS0tPgotCi08IUVOVElUWSAlIFRSdWxlcyAiKG5vbmUgfCBncm91cHMgfCByb3dzIHwgY29scyB8IGFsbCkiPgotICAKLTwhLS0gaG9yaXpvbnRhbCBwbGFjZW1lbnQgb2YgdGFibGUgcmVsYXRpdmUgdG8gZG9jdW1lbnQgLS0+Ci08IUVOVElUWSAlIFRBbGlnbiAiKGxlZnR8Y2VudGVyfHJpZ2h0KSI+Ci0KLTwhLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cwotCi0gIGNoYXIgICAgICAgIGFsaWdubWVudCBjaGFyLCBlLmcuIGNoYXI9JzonCi0gIGNoYXJvZmYgICAgIG9mZnNldCBmb3IgYWxpZ25tZW50IGNoYXIKLS0tPgotPCFFTlRJVFkgJSBjZWxsaGFsaWduCi0gICJhbGlnbiAgICAgIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5fGNoYXIpICNJTVBMSUVECi0gICBjaGFyICAgICAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gICBjaGFyb2ZmICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhLS0gdmVydGljYWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGx2YWxpZ24KLSAgInZhbGlnbiAgICAgKHRvcHxtaWRkbGV8Ym90dG9tfGJhc2VsaW5lKSAjSU1QTElFRCIKLSAgPgotCi08IUVMRU1FTlQgdGFibGUKLSAgICAgKGNhcHRpb24/LCAoY29sKnxjb2xncm91cCopLCB0aGVhZD8sIHRmb290PywgKHRib2R5K3x0cispKT4KLTwhRUxFTUVOVCBjYXB0aW9uICAlSW5saW5lOz4KLTwhRUxFTUVOVCB0aGVhZCAgICAodHIpKz4KLTwhRUxFTUVOVCB0Zm9vdCAgICAodHIpKz4KLTwhRUxFTUVOVCB0Ym9keSAgICAodHIpKz4KLTwhRUxFTUVOVCBjb2xncm91cCAoY29sKSo+Ci08IUVMRU1FTlQgY29sICAgICAgRU1QVFk+Ci08IUVMRU1FTlQgdHIgICAgICAgKHRofHRkKSs+Ci08IUVMRU1FTlQgdGggICAgICAgJUZsb3c7PgotPCFFTEVNRU5UIHRkICAgICAgICVGbG93Oz4KLQotPCFBVFRMSVNUIHRhYmxlCi0gICVhdHRyczsKLSAgc3VtbWFyeSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgYm9yZGVyICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgZnJhbWUgICAgICAgJVRGcmFtZTsgICAgICAgI0lNUExJRUQKLSAgcnVsZXMgICAgICAgJVRSdWxlczsgICAgICAgI0lNUExJRUQKLSAgY2VsbHNwYWNpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgY2VsbHBhZGRpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVOVElUWSAlIENBbGlnbiAiKHRvcHxib3R0b218bGVmdHxyaWdodCkiPgotCi08IUFUVExJU1QgY2FwdGlvbgotICAlYXR0cnM7Ci0gID4KLQotPCEtLQotY29sZ3JvdXAgZ3JvdXBzIGEgc2V0IG9mIGNvbCBlbGVtZW50cy4gSXQgYWxsb3dzIHlvdSB0byBncm91cAotc2V2ZXJhbCBzZW1hbnRpY2FsbHkgcmVsYXRlZCBjb2x1bW5zIHRvZ2V0aGVyLgotLS0+Ci08IUFUVExJU1QgY29sZ3JvdXAKLSAgJWF0dHJzOwotICBzcGFuICAgICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgd2lkdGggICAgICAgJU11bHRpTGVuZ3RoOyAgI0lNUExJRUQKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhLS0KLSBjb2wgZWxlbWVudHMgZGVmaW5lIHRoZSBhbGlnbm1lbnQgcHJvcGVydGllcyBmb3IgY2VsbHMgaW4KLSBvbmUgb3IgbW9yZSBjb2x1bW5zLgotCi0gVGhlIHdpZHRoIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW5zLCBlLmcuCi0KLSAgICAgd2lkdGg9NjQgICAgICAgIHdpZHRoIGluIHNjcmVlbiBwaXhlbHMKLSAgICAgd2lkdGg9MC41KiAgICAgIHJlbGF0aXZlIHdpZHRoIG9mIDAuNQotCi0gVGhlIHNwYW4gYXR0cmlidXRlIGNhdXNlcyB0aGUgYXR0cmlidXRlcyBvZiBvbmUKLSBjb2wgZWxlbWVudCB0byBhcHBseSB0byBtb3JlIHRoYW4gb25lIGNvbHVtbi4KLS0tPgotPCFBVFRMSVNUIGNvbAotICAlYXR0cnM7Ci0gIHNwYW4gICAgICAgICVOdW1iZXI7ICAgICAgICIxIgotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRAotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCEtLQotICAgIFVzZSB0aGVhZCB0byBkdXBsaWNhdGUgaGVhZGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBoZWFkZXJzIHdoZW4KLSAgICB0Ym9keSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotCi0gICAgVXNlIHRmb290IHRvIGR1cGxpY2F0ZSBmb290ZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGZvb3RlcnMgd2hlbgotICAgIHRib2R5IHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgbXVsdGlwbGUgdGJvZHkgc2VjdGlvbnMgd2hlbiBydWxlcyBhcmUgbmVlZGVkCi0gICAgYmV0d2VlbiBncm91cHMgb2YgdGFibGUgcm93cy4KLS0tPgotPCFBVFRMSVNUIHRoZWFkCi0gICVhdHRyczsKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhQVRUTElTVCB0Zm9vdAotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IUFUVExJU1QgdGJvZHkKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCFBVFRMSVNUIHRyCi0gICVhdHRyczsKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLQotPCEtLSBTY29wZSBpcyBzaW1wbGVyIHRoYW4gaGVhZGVycyBhdHRyaWJ1dGUgZm9yIGNvbW1vbiB0YWJsZXMgLS0+Ci08IUVOVElUWSAlIFNjb3BlICIocm93fGNvbHxyb3dncm91cHxjb2xncm91cCkiPgotCi08IS0tIHRoIGlzIGZvciBoZWFkZXJzLCB0ZCBmb3IgZGF0YSBhbmQgZm9yIGNlbGxzIGFjdGluZyBhcyBib3RoIC0tPgotCi08IUFUVExJU1QgdGgKLSAgJWF0dHJzOwotICBhYmJyICAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBheGlzICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBoZWFkZXJzICAgICBJRFJFRlMgICAgICAgICAjSU1QTElFRAotICBzY29wZSAgICAgICAlU2NvcGU7ICAgICAgICAjSU1QTElFRAotICByb3dzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgY29sc3BhbiAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IUFUVExJU1QgdGQKLSAgJWF0dHJzOwotICBhYmJyICAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBheGlzICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBoZWFkZXJzICAgICBJRFJFRlMgICAgICAgICAjSU1QTElFRAotICBzY29wZSAgICAgICAlU2NvcGU7ICAgICAgICAjSU1QTElFRAotICByb3dzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgY29sc3BhbiAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYzllZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTE5NiArMCwwIEBACi08IS0tCi0gICBFeHRlbnNpYmxlIEhUTUwgdmVyc2lvbiAxLjAgVHJhbnNpdGlvbmFsIERURAotCi0gICBUaGlzIGlzIHRoZSBzYW1lIGFzIEhUTUwgNC4wIFRyYW5zaXRpb25hbCBleGNlcHQgZm9yCi0gICBjaGFuZ2VzIGR1ZSB0byB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBYTUwgYW5kIFNHTUwuCi0KLSAgIE5hbWVzcGFjZSA9IGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwKLQotICAgRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24sIHNlZTogaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxCi0KLSAgIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksCi0gICBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLQotICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIgotCi0gICAkUmV2aXNpb246IDEuMSAkCi0gICAkRGF0ZTogMjAwNy8wNS8xNSAwMjo0MjoyMiAkCi0KLS0tPgotCi08IS0tPT09PT09PT09PT09PT09PSBDaGFyYWN0ZXIgbW5lbW9uaWMgZW50aXRpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIEhUTUxsYXQxIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4gMSBmb3IgWEhUTUwvL0VOIgotICAgInhodG1sLWxhdDEuZW50Ij4KLSVIVE1MbGF0MTsKLQotPCFFTlRJVFkgJSBIVE1Mc3ltYm9sIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scyBmb3IgWEhUTUwvL0VOIgotICAgInhodG1sLXN5bWJvbC5lbnQiPgotJUhUTUxzeW1ib2w7Ci0KLTwhRU5USVRZICUgSFRNTHNwZWNpYWwgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBTcGVjaWFsIGZvciBYSFRNTC8vRU4iCi0gICAieGh0bWwtc3BlY2lhbC5lbnQiPgotJUhUTUxzcGVjaWFsOwotCi08IS0tPT09PT09PT09PT09PT09PT09IEltcG9ydGVkIE5hbWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIENvbnRlbnRUeXBlICJDREFUQSI+Ci0gICAgPCEtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotCi08IUVOVElUWSAlIENvbnRlbnRUeXBlcyAiQ0RBVEEiPgotICAgIDwhLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgdHlwZXMsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldCAiQ0RBVEEiPgotICAgIDwhLS0gYSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldHMgIkNEQVRBIj4KLSAgICA8IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLQotPCFFTlRJVFkgJSBMYW5ndWFnZUNvZGUgIk5NVE9LRU4iPgotICAgIDwhLS0gYSBsYW5ndWFnZSBjb2RlLCBhcyBwZXIgW1JGQzE3NjZdIC0tPgotCi08IUVOVElUWSAlIENoYXJhY3RlciAiQ0RBVEEiPgotICAgIDwhLS0gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gW0lTTzEwNjQ2XSAtLT4KLQotPCFFTlRJVFkgJSBOdW1iZXIgIkNEQVRBIj4KLSAgICA8IS0tIG9uZSBvciBtb3JlIGRpZ2l0cyAtLT4KLQotPCFFTlRJVFkgJSBMaW5rVHlwZXMgIkNEQVRBIj4KLSAgICA8IS0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMgLS0+Ci0KLTwhRU5USVRZICUgTWVkaWFEZXNjICJDREFUQSI+Ci0gICAgPCEtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMgLS0+Ci0KLTwhRU5USVRZICUgVVJJICJDREFUQSI+Ci0gICAgPCEtLSBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciwgc2VlIFtSRkMyMzk2XSAtLT4KLQotPCFFTlRJVFkgJSBVcmlMaXN0ICJDREFUQSI+Ci0gICAgPCEtLSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMgLS0+Ci0KLTwhRU5USVRZICUgRGF0ZXRpbWUgIkNEQVRBIj4KLSAgICA8IS0tIGRhdGUgYW5kIHRpbWUgaW5mb3JtYXRpb24uIElTTyBkYXRlIGZvcm1hdCAtLT4KLQotPCFFTlRJVFkgJSBTY3JpcHQgIkNEQVRBIj4KLSAgICA8IS0tIHNjcmlwdCBleHByZXNzaW9uIC0tPgotCi08IUVOVElUWSAlIFN0eWxlU2hlZXQgIkNEQVRBIj4KLSAgICA8IS0tIHN0eWxlIHNoZWV0IGRhdGEgLS0+Ci0KLTwhRU5USVRZICUgVGV4dCAiQ0RBVEEiPgotICAgIDwhLS0gdXNlZCBmb3IgdGl0bGVzIGV0Yy4gLS0+Ci0KLTwhRU5USVRZICUgRnJhbWVUYXJnZXQgIk5NVE9LRU4iPgotICAgIDwhLS0gcmVuZGVyIGluIHRoaXMgZnJhbWUgLS0+Ci0KLTwhRU5USVRZICUgTGVuZ3RoICJDREFUQSI+Ci0gICAgPCEtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci0KLTwhRU5USVRZICUgTXVsdGlMZW5ndGggIkNEQVRBIj4KLSAgICA8IS0tIHBpeGVsLCBwZXJjZW50YWdlLCBvciByZWxhdGl2ZSAtLT4KLQotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aHMgIkNEQVRBIj4KLSAgICA8IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIE11bHRpTGVuZ3RoIC0tPgotCi08IUVOVElUWSAlIFBpeGVscyAiQ0RBVEEiPgotICAgIDwhLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KLQotPCEtLSB0aGVzZSBhcmUgdXNlZCBmb3IgaW1hZ2UgbWFwcyAtLT4KLQotPCFFTlRJVFkgJSBTaGFwZSAiKHJlY3R8Y2lyY2xlfHBvbHl8ZGVmYXVsdCkiPgotCi08IUVOVElUWSAlIENvb3JkcyAiQ0RBVEEiPgotICAgIDwhLS0gY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbGVuZ3RocyAtLT4KLQotPCEtLSB1c2VkIGZvciBvYmplY3QsIGFwcGxldCwgaW1nLCBpbnB1dCBhbmQgaWZyYW1lIC0tPgotPCFFTlRJVFkgJSBJbWdBbGlnbiAiKHRvcHxtaWRkbGV8Ym90dG9tfGxlZnR8cmlnaHQpIj4KLQotPCEtLSBhIGNvbG9yIHVzaW5nIHNSR0I6ICNSUkdHQkIgYXMgSGV4IHZhbHVlcyAtLT4KLTwhRU5USVRZICUgQ29sb3IgIkNEQVRBIj4KLQotPCEtLSBUaGVyZSBhcmUgYWxzbyAxNiB3aWRlbHkga25vd24gY29sb3IgbmFtZXMgd2l0aCB0aGVpciBzUkdCIHZhbHVlczoKLQotICAgIEJsYWNrICA9ICMwMDAwMDAgICAgR3JlZW4gID0gIzAwODAwMAotICAgIFNpbHZlciA9ICNDMEMwQzAgICAgTGltZSAgID0gIzAwRkYwMAotICAgIEdyYXkgICA9ICM4MDgwODAgICAgT2xpdmUgID0gIzgwODAwMAotICAgIFdoaXRlICA9ICNGRkZGRkYgICAgWWVsbG93ID0gI0ZGRkYwMAotICAgIE1hcm9vbiA9ICM4MDAwMDAgICAgTmF2eSAgID0gIzAwMDA4MAotICAgIFJlZCAgICA9ICNGRjAwMDAgICAgQmx1ZSAgID0gIzAwMDBGRgotICAgIFB1cnBsZSA9ICM4MDAwODAgICAgVGVhbCAgID0gIzAwODA4MAotICAgIEZ1Y2hzaWE9ICNGRjAwRkYgICAgQXF1YSAgID0gIzAwRkZGRgotLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEdlbmVyaWMgQXR0cmlidXRlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gY29yZSBhdHRyaWJ1dGVzIGNvbW1vbiB0byBtb3N0IGVsZW1lbnRzCi0gIGlkICAgICAgIGRvY3VtZW50LXdpZGUgdW5pcXVlIGlkCi0gIGNsYXNzICAgIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzZXMKLSAgc3R5bGUgICAgYXNzb2NpYXRlZCBzdHlsZSBpbmZvCi0gIHRpdGxlICAgIGFkdmlzb3J5IHRpdGxlL2FtcGxpZmljYXRpb24KLS0tPgotPCFFTlRJVFkgJSBjb3JlYXR0cnMKLSAiaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKLSAgY2xhc3MgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgc3R5bGUgICAgICAgJVN0eWxlU2hlZXQ7ICAgI0lNUExJRUQKLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQiCi0gID4KLQotPCEtLSBpbnRlcm5hdGlvbmFsaXphdGlvbiBhdHRyaWJ1dGVzCi0gIGxhbmcgICAgICAgIGxhbmd1YWdlIGNvZGUgKGJhY2t3YXJkcyBjb21wYXRpYmxlKQotICB4bWw6bGFuZyAgICBsYW5ndWFnZSBjb2RlIChhcyBwZXIgWE1MIDEuMCBzcGVjKQotICBkaXIgICAgICAgICBkaXJlY3Rpb24gZm9yIHdlYWsvbmV1dHJhbCB0ZXh0Ci0tLT4KLTwhRU5USVRZICUgaTE4bgotICJsYW5nICAgICAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICB4bWw6bGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICBkaXIgICAgICAgICAobHRyfHJ0bCkgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIGF0dHJpYnV0ZXMgZm9yIGNvbW1vbiBVSSBldmVudHMKLSAgb25jbGljayAgICAgYSBwb2ludGVyIGJ1dHRvbiB3YXMgY2xpY2tlZAotICBvbmRibGNsaWNrICBhIHBvaW50ZXIgYnV0dG9uIHdhcyBkb3VibGUgY2xpY2tlZAotICBvbm1vdXNlZG93biBhIHBvaW50ZXIgYnV0dG9uIHdhcyBwcmVzc2VkIGRvd24KLSAgb25tb3VzZXVwICAgYSBwb2ludGVyIGJ1dHRvbiB3YXMgcmVsZWFzZWQKLSAgb25tb3VzZW1vdmUgYSBwb2ludGVyIHdhcyBtb3ZlZCBvbnRvIHRoZSBlbGVtZW50Ci0gIG9ubW91c2VvdXQgIGEgcG9pbnRlciB3YXMgbW92ZWQgYXdheSBmcm9tIHRoZSBlbGVtZW50Ci0gIG9ua2V5cHJlc3MgIGEga2V5IHdhcyBwcmVzc2VkIGFuZCByZWxlYXNlZAotICBvbmtleWRvd24gICBhIGtleSB3YXMgcHJlc3NlZCBkb3duCi0gIG9ua2V5dXAgICAgIGEga2V5IHdhcyByZWxlYXNlZAotLS0+Ci08IUVOVElUWSAlIGV2ZW50cwotICJvbmNsaWNrICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmRibGNsaWNrICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlZG93biAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNldXAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlb3ZlciAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlbW92ZSAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlb3V0ICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmtleXByZXNzICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmtleWRvd24gICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmtleXVwICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIGF0dHJpYnV0ZXMgZm9yIGVsZW1lbnRzIHRoYXQgY2FuIGdldCB0aGUgZm9jdXMKLSAgYWNjZXNza2V5ICAgYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyCi0gIHRhYmluZGV4ICAgIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIKLSAgb25mb2N1cyAgICAgdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cwotICBvbmJsdXIgICAgICB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cwotLS0+Ci08IUVOVElUWSAlIGZvY3VzCi0gImFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhRU5USVRZICUgYXR0cnMgIiVjb3JlYXR0cnM7ICVpMThuOyAlZXZlbnRzOyI+Ci0KLTwhLS0gdGV4dCBhbGlnbm1lbnQgZm9yIHAsIGRpdiwgaDEtaDYuIFRoZSBkZWZhdWx0IGlzCi0gICAgIGFsaWduPSJsZWZ0IiBmb3IgbHRyIGhlYWRpbmdzLCAicmlnaHQiIGZvciBydGwgLS0+Ci0KLTwhRU5USVRZICUgVGV4dEFsaWduICJhbGlnbiAobGVmdHxjZW50ZXJ8cmlnaHQpICNJTVBMSUVEIj4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gVGV4dCBFbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBzcGVjaWFsCi0gICAiYnIgfCBzcGFuIHwgYmRvIHwgb2JqZWN0IHwgYXBwbGV0IHwgaW1nIHwgbWFwIHwgaWZyYW1lIj4KLQotPCFFTlRJVFkgJSBmb250c3R5bGUgInR0IHwgaSB8IGIgfCBiaWcgfCBzbWFsbCB8IHUKLSAgICAgICAgICAgICAgICAgICAgICB8IHMgfCBzdHJpa2UgfGZvbnQgfCBiYXNlZm9udCI+Ci0KLTwhRU5USVRZICUgcGhyYXNlICJlbSB8IHN0cm9uZyB8IGRmbiB8IGNvZGUgfCBxIHwgc3ViIHwgc3VwIHwKLSAgICAgICAgICAgICAgICAgICBzYW1wIHwga2JkIHwgdmFyIHwgY2l0ZSB8IGFiYnIgfCBhY3JvbnltIj4KLQotPCFFTlRJVFkgJSBpbmxpbmUuZm9ybXMgImlucHV0IHwgc2VsZWN0IHwgdGV4dGFyZWEgfCBsYWJlbCB8IGJ1dHRvbiI+Ci0KLTwhLS0gdGhlc2UgY2FuIG9jY3VyIGF0IGJsb2NrIG9yIGlubGluZSBsZXZlbCAtLT4KLTwhRU5USVRZICUgbWlzYyAiaW5zIHwgZGVsIHwgc2NyaXB0IHwgbm9zY3JpcHQiPgotCi08IUVOVElUWSAlIGlubGluZSAiYSB8ICVzcGVjaWFsOyB8ICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlaW5saW5lLmZvcm1zOyI+Ci0KLTwhLS0gJUlubGluZTsgY292ZXJzIGlubGluZSBvciAidGV4dC1sZXZlbCIgZWxlbWVudHMgLS0+Ci08IUVOVElUWSAlIElubGluZSAiKCNQQ0RBVEEgfCAlaW5saW5lOyB8ICVtaXNjOykqIj4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBCbG9jayBsZXZlbCBlbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBoZWFkaW5nICJoMXxoMnxoM3xoNHxoNXxoNiI+Ci08IUVOVElUWSAlIGxpc3RzICJ1bCB8IG9sIHwgZGwgfCBtZW51IHwgZGlyIj4KLTwhRU5USVRZICUgYmxvY2t0ZXh0ICJwcmUgfCBociB8IGJsb2NrcXVvdGUgfCBhZGRyZXNzIHwgY2VudGVyIHwgbm9mcmFtZXMiPgotCi08IUVOVElUWSAlIGJsb2NrCi0gICAgInAgfCAlaGVhZGluZzsgfCBkaXYgfCAlbGlzdHM7IHwgJWJsb2NrdGV4dDsgfCBpc2luZGV4IHxmaWVsZHNldCB8IHRhYmxlIj4KLQotPCFFTlRJVFkgJSBCbG9jayAiKCVibG9jazsgfCBmb3JtIHwgJW1pc2M7KSoiPgotCi08IS0tICVGbG93OyBtaXhlcyBCbG9jayBhbmQgSW5saW5lIGFuZCBpcyB1c2VkIGZvciBsaXN0IGl0ZW1zIGV0Yy4gLS0+Ci08IUVOVElUWSAlIEZsb3cgIigjUENEQVRBIHwgJWJsb2NrOyB8IGZvcm0gfCAlaW5saW5lOyB8ICVtaXNjOykqIj4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBDb250ZW50IG1vZGVscyBmb3IgZXhjbHVzaW9ucyA9PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBhIGVsZW1lbnRzIHVzZSAlSW5saW5lOyBleGNsdWRpbmcgYSAtLT4KLQotPCFFTlRJVFkgJSBhLmNvbnRlbnQKLSAgICIoI1BDREFUQSB8ICVzcGVjaWFsOyB8ICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlaW5saW5lLmZvcm1zOyB8ICVtaXNjOykqIj4KLQotPCEtLSBwcmUgdXNlcyAlSW5saW5lIGV4Y2x1ZGluZyBpbWcsIG9iamVjdCwgYXBwbGV0LCBiaWcsIHNtYWxsLAotICAgICBzdWIsIHN1cCwgZm9udCwgb3IgYmFzZWZvbnQgLS0+Ci0KLTwhRU5USVRZICUgcHJlLmNvbnRlbnQKLSAgICIoI1BDREFUQSB8IGEgfCBiciB8IHNwYW4gfCBiZG8gfCBtYXAgfCB0dCB8IGkgfCBiIHwgdSB8IHMgfAotICAgICAgJXBocmFzZTsgfCAlaW5saW5lLmZvcm1zOykqIj4KLQotPCEtLSBmb3JtIHVzZXMgJUZsb3c7IGV4Y2x1ZGluZyBmb3JtIC0tPgotCi08IUVOVElUWSAlIGZvcm0uY29udGVudCAiKCNQQ0RBVEEgfCAlYmxvY2s7IHwgJWlubGluZTsgfCAlbWlzYzspKiI+Ci0KLTwhLS0gYnV0dG9uIHVzZXMgJUZsb3c7IGJ1dCBleGNsdWRlcyBhLCBmb3JtLCBmb3JtIGNvbnRyb2xzLCBpZnJhbWUgLS0+Ci0KLTwhRU5USVRZICUgYnV0dG9uLmNvbnRlbnQKLSAgICIoI1BDREFUQSB8IHAgfCAlaGVhZGluZzsgfCBkaXYgfCAlbGlzdHM7IHwgJWJsb2NrdGV4dDsgfAotICAgICAgdGFibGUgfCBiciB8IHNwYW4gfCBiZG8gfCBvYmplY3QgfCBhcHBsZXQgfCBpbWcgfCBtYXAgfAotICAgICAgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVtaXNjOykqIj4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgU3RydWN0dXJlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSB0aGUgbmFtZXNwYWNlIFVSSSBkZXNpZ25hdGVzIHRoZSBkb2N1bWVudCBwcm9maWxlIC0tPgotCi08IUVMRU1FTlQgaHRtbCAoaGVhZCwgYm9keSk+Ci08IUFUVExJU1QgaHRtbAotICAlaTE4bjsKLSAgeG1sbnMgICAgICAgJVVSSTsgICAgICAgICAgI0ZJWEVEICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IERvY3VtZW50IEhlYWQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgaGVhZC5taXNjICIoc2NyaXB0fHN0eWxlfG1ldGF8bGlua3xvYmplY3R8aXNpbmRleCkqIj4KLQotPCEtLSBjb250ZW50IG1vZGVsIGlzICVoZWFkLm1pc2M7IGNvbWJpbmVkIHdpdGggYSBzaW5nbGUKLSAgICAgdGl0bGUgYW5kIGFuIG9wdGlvbmFsIGJhc2UgZWxlbWVudCBpbiBhbnkgb3JkZXIgLS0+Ci0KLTwhRUxFTUVOVCBoZWFkICglaGVhZC5taXNjOywKLSAgICAgKCh0aXRsZSwgJWhlYWQubWlzYzssIChiYXNlLCAlaGVhZC5taXNjOyk/KSB8Ci0gICAgICAoYmFzZSwgJWhlYWQubWlzYzssICh0aXRsZSwgJWhlYWQubWlzYzspKSkpPgotCi08IUFUVExJU1QgaGVhZAotICAlaTE4bjsKLSAgcHJvZmlsZSAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIFRoZSB0aXRsZSBlbGVtZW50IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGZsb3cgb2YgdGV4dC4KLSAgICAgICBJdCBzaG91bGQgYmUgZGlzcGxheWVkLCBmb3IgZXhhbXBsZSBhcyB0aGUgcGFnZSBoZWFkZXIgb3IKLSAgICAgICB3aW5kb3cgdGl0bGUuIEV4YWN0bHkgb25lIHRpdGxlIGlzIHJlcXVpcmVkIHBlciBkb2N1bWVudC4KLSAgICAtLT4KLTwhRUxFTUVOVCB0aXRsZSAoI1BDREFUQSk+Ci08IUFUVExJU1QgdGl0bGUgJWkxOG47PgotCi08IS0tIGRvY3VtZW50IGJhc2UgVVJJIC0tPgotCi08IUVMRU1FTlQgYmFzZSBFTVBUWT4KLTwhQVRUTElTVCBiYXNlCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVECi0gID4KLQotPCEtLSBnZW5lcmljIG1ldGFpbmZvcm1hdGlvbiAtLT4KLTwhRUxFTUVOVCBtZXRhIEVNUFRZPgotPCFBVFRMSVNUIG1ldGEKLSAgJWkxOG47Ci0gIGh0dHAtZXF1aXYgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGNvbnRlbnQgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRAotICBzY2hlbWUgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSAgUmVsYXRpb25zaGlwIHZhbHVlcyBjYW4gYmUgdXNlZCBpbiBwcmluY2lwbGU6Ci0KLSAgIGEpIGZvciBkb2N1bWVudCBzcGVjaWZpYyB0b29sYmFycy9tZW51cyB3aGVuIHVzZWQKLSAgICAgIHdpdGggdGhlIGxpbmsgZWxlbWVudCBpbiBkb2N1bWVudCBoZWFkIGUuZy4KLSAgICAgICAgc3RhcnQsIGNvbnRlbnRzLCBwcmV2aW91cywgbmV4dCwgaW5kZXgsIGVuZCwgaGVscAotICAgYikgdG8gbGluayB0byBhIHNlcGFyYXRlIHN0eWxlIHNoZWV0IChyZWw9InN0eWxlc2hlZXQiKQotICAgYykgdG8gbWFrZSBhIGxpbmsgdG8gYSBzY3JpcHQgKHJlbD0ic2NyaXB0IikKLSAgIGQpIGJ5IHN0eWxlc2hlZXRzIHRvIGNvbnRyb2wgaG93IGNvbGxlY3Rpb25zIG9mCi0gICAgICBodG1sIG5vZGVzIGFyZSByZW5kZXJlZCBpbnRvIHByaW50ZWQgZG9jdW1lbnRzCi0gICBlKSB0byBtYWtlIGEgbGluayB0byBhIHByaW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIGUuZy4gYSBQb3N0U2NyaXB0IG9yIFBERiB2ZXJzaW9uIChyZWw9ImFsdGVybmF0ZSIgbWVkaWE9InByaW50IikKLS0tPgotCi08IUVMRU1FTlQgbGluayBFTVBUWT4KLTwhQVRUTElTVCBsaW5rCi0gICVhdHRyczsKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgcmVsICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQKLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQKLSAgPgotCi08IS0tIHN0eWxlIGluZm8sIHdoaWNoIG1heSBpbmNsdWRlIENEQVRBIHNlY3Rpb25zIC0tPgotPCFFTEVNRU5UIHN0eWxlICgjUENEQVRBKT4KLTwhQVRUTElTVCBzdHlsZQotICAlaTE4bjsKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI1JFUVVJUkVECi0gIG1lZGlhICAgICAgICVNZWRpYURlc2M7ICAgICNJTVBMSUVECi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIHhtbDpzcGFjZSAgIChwcmVzZXJ2ZSkgICAgICNGSVhFRCAncHJlc2VydmUnCi0gID4KLQotPCEtLSBzY3JpcHQgc3RhdGVtZW50cywgd2hpY2ggbWF5IGluY2x1ZGUgQ0RBVEEgc2VjdGlvbnMgLS0+Ci08IUVMRU1FTlQgc2NyaXB0ICgjUENEQVRBKT4KLTwhQVRUTElTVCBzY3JpcHQKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI1JFUVVJUkVECi0gIGxhbmd1YWdlICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGRlZmVyICAgICAgIChkZWZlcikgICAgICAgICNJTVBMSUVECi0gIHhtbDpzcGFjZSAgIChwcmVzZXJ2ZSkgICAgICNGSVhFRCAncHJlc2VydmUnCi0gID4KLQotPCEtLSBhbHRlcm5hdGUgY29udGVudCBjb250YWluZXIgZm9yIG5vbiBzY3JpcHQtYmFzZWQgcmVuZGVyaW5nIC0tPgotCi08IUVMRU1FTlQgbm9zY3JpcHQgJUZsb3c7PgotPCFBVFRMSVNUIG5vc2NyaXB0Ci0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT0gRnJhbWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGlubGluZSBzdWJ3aW5kb3cgLS0+Ci0KLTwhRUxFTUVOVCBpZnJhbWUgJUZsb3c7PgotPCFBVFRMSVNUIGlmcmFtZQotICAlY29yZWF0dHJzOwotICBsb25nZGVzYyAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBmcmFtZWJvcmRlciAoMXwwKSAgICAgICAgICAiMSIKLSAgbWFyZ2lud2lkdGggJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgbWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICAgICAgI0lNUExJRUQKLSAgc2Nyb2xsaW5nICAgKHllc3xub3xhdXRvKSAgImF1dG8iCi0gIGFsaWduICAgICAgICVJbWdBbGlnbjsgICAgICNJTVBMSUVECi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBhbHRlcm5hdGUgY29udGVudCBjb250YWluZXIgZm9yIG5vbiBmcmFtZS1iYXNlZCByZW5kZXJpbmcgLS0+Ci0KLTwhRUxFTUVOVCBub2ZyYW1lcyAlRmxvdzs+Ci08IUFUVExJU1Qgbm9mcmFtZXMKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IERvY3VtZW50IEJvZHkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBib2R5ICVGbG93Oz4KLTwhQVRUTElTVCBib2R5Ci0gICVhdHRyczsKLSAgb25sb2FkICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb251bmxvYWQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgYmFja2dyb3VuZCAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgdGV4dCAgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgbGluayAgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgdmxpbmsgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgYWxpbmsgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgZGl2ICVGbG93Oz4gIDwhLS0gZ2VuZXJpYyBsYW5ndWFnZS9zdHlsZSBjb250YWluZXIgLS0+Ci08IUFUVExJU1QgZGl2Ci0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBQYXJhZ3JhcGhzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgcCAlSW5saW5lOz4KLTwhQVRUTElTVCBwCi0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIZWFkaW5ncyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFRoZXJlIGFyZSBzaXggbGV2ZWxzIG9mIGhlYWRpbmdzIGZyb20gaDEgKHRoZSBtb3N0IGltcG9ydGFudCkKLSAgdG8gaDYgKHRoZSBsZWFzdCBpbXBvcnRhbnQpLgotLS0+Ci0KLTwhRUxFTUVOVCBoMSAgJUlubGluZTs+Ci08IUFUVExJU1QgaDEKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhRUxFTUVOVCBoMiAlSW5saW5lOz4KLTwhQVRUTElTVCBoMgotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCFFTEVNRU5UIGgzICVJbmxpbmU7PgotPCFBVFRMSVNUIGgzCi0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IUVMRU1FTlQgaDQgJUlubGluZTs+Ci08IUFUVExJU1QgaDQKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhRUxFTUVOVCBoNSAlSW5saW5lOz4KLTwhQVRUTElTVCBoNQotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCFFTEVNRU5UIGg2ICVJbmxpbmU7PgotPCFBVFRMSVNUIGg2Ci0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBMaXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFVub3JkZXJlZCBsaXN0IGJ1bGxldCBzdHlsZXMgLS0+Ci0KLTwhRU5USVRZICUgVUxTdHlsZSAiKGRpc2N8c3F1YXJlfGNpcmNsZSkiPgotCi08IS0tIFVub3JkZXJlZCBsaXN0IC0tPgotCi08IUVMRU1FTlQgdWwgKGxpKSs+Ci08IUFUVExJU1QgdWwKLSAgJWF0dHJzOwotICB0eXBlICAgICAgICAlVUxTdHlsZTsgICAgICNJTVBMSUVECi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIE9yZGVyZWQgbGlzdCBudW1iZXJpbmcgc3R5bGUKLQotICAgIDEgICBhcmFiaWMgbnVtYmVycyAgICAgIDEsIDIsIDMsIC4uLgotICAgIGEgICBsb3dlciBhbHBoYSAgICAgICAgIGEsIGIsIGMsIC4uLgotICAgIEEgICB1cHBlciBhbHBoYSAgICAgICAgIEEsIEIsIEMsIC4uLgotICAgIGkgICBsb3dlciByb21hbiAgICAgICAgIGksIGlpLCBpaWksIC4uLgotICAgIEkgICB1cHBlciByb21hbiAgICAgICAgIEksIElJLCBJSUksIC4uLgotCi0gICAgVGhlIHN0eWxlIGlzIGFwcGxpZWQgdG8gdGhlIHNlcXVlbmNlIG51bWJlciB3aGljaCBieSBkZWZhdWx0Ci0gICAgaXMgcmVzZXQgdG8gMSBmb3IgdGhlIGZpcnN0IGxpc3QgaXRlbSBpbiBhbiBvcmRlcmVkIGxpc3QuCi0tLT4KLTwhRU5USVRZICUgT0xTdHlsZSAiQ0RBVEEiPgotCi08IS0tIE9yZGVyZWQgKG51bWJlcmVkKSBsaXN0IC0tPgotCi08IUVMRU1FTlQgb2wgKGxpKSs+Ci08IUFUVExJU1Qgb2wKLSAgJWF0dHJzOwotICB0eXBlICAgICAgICAlT0xTdHlsZTsgICAgICAjSU1QTElFRAotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICAjSU1QTElFRAotICBzdGFydCAgICAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gc2luZ2xlIGNvbHVtbiBsaXN0IChERVBSRUNBVEVEKSAtLT4gCi08IUVMRU1FTlQgbWVudSAobGkpKz4KLTwhQVRUTElTVCBtZW51Ci0gICVhdHRyczsKLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gbXVsdGlwbGUgY29sdW1uIGxpc3QgKERFUFJFQ0FURUQpIC0tPiAKLTwhRUxFTUVOVCBkaXIgKGxpKSs+Ci08IUFUVExJU1QgZGlyCi0gICVhdHRyczsKLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gTElTdHlsZSBpcyBjb25zdHJhaW5lZCB0bzogIiglVUxTdHlsZTt8JU9MU3R5bGU7KSIgLS0+Ci08IUVOVElUWSAlIExJU3R5bGUgIkNEQVRBIj4KLQotPCEtLSBsaXN0IGl0ZW0gLS0+Ci0KLTwhRUxFTUVOVCBsaSAlRmxvdzs+Ci08IUFUVExJU1QgbGkKLSAgJWF0dHJzOwotICB0eXBlICAgICAgICAlTElTdHlsZTsgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gZGVmaW5pdGlvbiBsaXN0cyAtIGR0IGZvciB0ZXJtLCBkZCBmb3IgaXRzIGRlZmluaXRpb24gLS0+Ci0KLTwhRUxFTUVOVCBkbCAoZHR8ZGQpKz4KLTwhQVRUTElTVCBkbAotICAlYXR0cnM7Ci0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIGR0ICVJbmxpbmU7PgotPCFBVFRMSVNUIGR0Ci0gICVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgZGQgJUZsb3c7PgotPCFBVFRMSVNUIGRkCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBBZGRyZXNzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGluZm9ybWF0aW9uIG9uIGF1dGhvciAtLT4KLQotPCFFTEVNRU5UIGFkZHJlc3MgJUlubGluZTs+Ci08IUFUVExJU1QgYWRkcmVzcwotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBSdWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGhyIEVNUFRZPgotPCFBVFRMSVNUIGhyCi0gICVhdHRyczsKLSAgYWxpZ24gICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0KSAjSU1QTElFRAotICBub3NoYWRlICAgICAobm9zaGFkZSkgICAgICAjSU1QTElFRAotICBzaXplICAgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFByZWZvcm1hdHRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gY29udGVudCBpcyAlSW5saW5lOyBleGNsdWRpbmcgCi0gICAgICAgICJpbWd8b2JqZWN0fGFwcGxldHxiaWd8c21hbGx8c3VifHN1cHxmb250fGJhc2Vmb250IiAtLT4KLQotPCFFTEVNRU5UIHByZSAlcHJlLmNvbnRlbnQ7PgotPCFBVFRMSVNUIHByZQotICAlYXR0cnM7Ci0gIHdpZHRoICAgICAgICVOdW1iZXI7ICAgICAgI0lNUExJRUQKLSAgeG1sOnNwYWNlICAgKHByZXNlcnZlKSAgICAjRklYRUQgJ3ByZXNlcnZlJwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEJsb2NrLWxpa2UgUXVvdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBibG9ja3F1b3RlICVGbG93Oz4KLTwhQVRUTElTVCBibG9ja3F1b3RlCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBUZXh0IGFsaWdubWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGNlbnRlciBjb250ZW50IC0tPgotPCFFTEVNRU5UIGNlbnRlciAlRmxvdzs+Ci08IUFUVExJU1QgY2VudGVyCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbnNlcnRlZC9EZWxldGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIGlucy9kZWwgYXJlIGFsbG93ZWQgaW4gYmxvY2sgYW5kIGlubGluZSBjb250ZW50LCBidXQgaXRzCi0gIGluYXBwcm9wcmlhdGUgdG8gaW5jbHVkZSBibG9jayBjb250ZW50IHdpdGhpbiBhbiBpbnMgZWxlbWVudAotICBvY2N1cnJpbmcgaW4gaW5saW5lIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBpbnMgJUZsb3c7PgotPCFBVFRMSVNUIGlucwotICAlYXR0cnM7Ci0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGRhdGV0aW1lICAgICVEYXRldGltZTsgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIGRlbCAlRmxvdzs+Ci08IUFUVExJU1QgZGVsCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBBbmNob3IgRWxlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGNvbnRlbnQgaXMgJUlubGluZTsgZXhjZXB0IHRoYXQgYW5jaG9ycyBzaG91bGRuJ3QgYmUgbmVzdGVkIC0tPgotCi08IUVMRU1FTlQgYSAlYS5jb250ZW50Oz4KLTwhQVRUTElTVCBhCi0gICVhdHRyczsKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgcmVsICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgc2hhcGUgICAgICAgJVNoYXBlOyAgICAgICAgInJlY3QiCi0gIGNvb3JkcyAgICAgICVDb29yZHM7ICAgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PSBJbmxpbmUgRWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIHNwYW4gJUlubGluZTs+IDwhLS0gZ2VuZXJpYyBsYW5ndWFnZS9zdHlsZSBjb250YWluZXIgLS0+Ci08IUFUVExJU1Qgc3BhbgotICAlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGJkbyAlSW5saW5lOz4gIDwhLS0gSTE4TiBCaURpIG92ZXItcmlkZSAtLT4KLTwhQVRUTElTVCBiZG8KLSAgJWNvcmVhdHRyczsKLSAgJWV2ZW50czsKLSAgbGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgeG1sOmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI1JFUVVJUkVECi0gID4KLQotPCFFTEVNRU5UIGJyIEVNUFRZPiAgIDwhLS0gZm9yY2VkIGxpbmUgYnJlYWsgLS0+Ci08IUFUVExJU1QgYnIKLSAgJWNvcmVhdHRyczsKLSAgY2xlYXIgICAgICAgKGxlZnR8YWxsfHJpZ2h0fG5vbmUpICJub25lIgotICA+Ci0KLTwhRUxFTUVOVCBlbSAlSW5saW5lOz4gICA8IS0tIGVtcGhhc2lzIC0tPgotPCFBVFRMSVNUIGVtICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzdHJvbmcgJUlubGluZTs+ICAgPCEtLSBzdHJvbmcgZW1waGFzaXMgLS0+Ci08IUFUVExJU1Qgc3Ryb25nICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBkZm4gJUlubGluZTs+ICAgPCEtLSBkZWZpbml0aW9uYWwgLS0+Ci08IUFUVExJU1QgZGZuICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBjb2RlICVJbmxpbmU7PiAgIDwhLS0gcHJvZ3JhbSBjb2RlIC0tPgotPCFBVFRMSVNUIGNvZGUgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHNhbXAgJUlubGluZTs+ICAgPCEtLSBzYW1wbGUgLS0+Ci08IUFUVExJU1Qgc2FtcCAlYXR0cnM7PgotCi08IUVMRU1FTlQga2JkICVJbmxpbmU7PiAgPCEtLSBzb21ldGhpbmcgdXNlciB3b3VsZCB0eXBlIC0tPgotPCFBVFRMSVNUIGtiZCAlYXR0cnM7PgotCi08IUVMRU1FTlQgdmFyICVJbmxpbmU7PiAgIDwhLS0gdmFyaWFibGUgLS0+Ci08IUFUVExJU1QgdmFyICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBjaXRlICVJbmxpbmU7PiAgIDwhLS0gY2l0YXRpb24gLS0+Ci08IUFUVExJU1QgY2l0ZSAlYXR0cnM7PgotCi08IUVMRU1FTlQgYWJiciAlSW5saW5lOz4gICA8IS0tIGFiYnJldmlhdGlvbiAtLT4KLTwhQVRUTElTVCBhYmJyICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBhY3JvbnltICVJbmxpbmU7PiAgIDwhLS0gYWNyb255bSAtLT4KLTwhQVRUTElTVCBhY3JvbnltICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBxICVJbmxpbmU7PiAgIDwhLS0gaW5saW5lZCBxdW90ZSAtLT4KLTwhQVRUTElTVCBxCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgc3ViICVJbmxpbmU7PiA8IS0tIHN1YnNjcmlwdCAtLT4KLTwhQVRUTElTVCBzdWIgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHN1cCAlSW5saW5lOz4gPCEtLSBzdXBlcnNjcmlwdCAtLT4KLTwhQVRUTElTVCBzdXAgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHR0ICVJbmxpbmU7PiAgIDwhLS0gZml4ZWQgcGl0Y2ggZm9udCAtLT4KLTwhQVRUTElTVCB0dCAlYXR0cnM7PgotCi08IUVMRU1FTlQgaSAlSW5saW5lOz4gICA8IS0tIGl0YWxpYyBmb250IC0tPgotPCFBVFRMSVNUIGkgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGIgJUlubGluZTs+ICAgPCEtLSBib2xkIGZvbnQgLS0+Ci08IUFUVExJU1QgYiAlYXR0cnM7PgotCi08IUVMRU1FTlQgYmlnICVJbmxpbmU7PiAgIDwhLS0gYmlnZ2VyIGZvbnQgLS0+Ci08IUFUVExJU1QgYmlnICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzbWFsbCAlSW5saW5lOz4gICA8IS0tIHNtYWxsZXIgZm9udCAtLT4KLTwhQVRUTElTVCBzbWFsbCAlYXR0cnM7PgotCi08IUVMRU1FTlQgdSAlSW5saW5lOz4gICA8IS0tIHVuZGVybGluZSAtLT4KLTwhQVRUTElTVCB1ICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzICVJbmxpbmU7PiAgIDwhLS0gc3RyaWtlLXRocm91Z2ggLS0+Ci08IUFUVExJU1QgcyAlYXR0cnM7PgotCi08IUVMRU1FTlQgc3RyaWtlICVJbmxpbmU7PiAgIDwhLS0gc3RyaWtlLXRocm91Z2ggLS0+Ci08IUFUVExJU1Qgc3RyaWtlICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBiYXNlZm9udCBFTVBUWT4gIDwhLS0gYmFzZSBmb250IHNpemUgLS0+Ci08IUFUVExJU1QgYmFzZWZvbnQKLSAgaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKLSAgc2l6ZSAgICAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVECi0gIGNvbG9yICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gIGZhY2UgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIGZvbnQgJUlubGluZTs+IDwhLS0gbG9jYWwgY2hhbmdlIHRvIGZvbnQgLS0+Ci08IUFUVExJU1QgZm9udAotICAlY29yZWF0dHJzOwotICAlaTE4bjsKLSAgc2l6ZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgY29sb3IgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgZmFjZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT0gT2JqZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tCi0gIG9iamVjdCBpcyB1c2VkIHRvIGVtYmVkIG9iamVjdHMgYXMgcGFydCBvZiBIVE1MIHBhZ2VzLgotICBwYXJhbSBlbGVtZW50cyBzaG91bGQgcHJlY2VkZSBvdGhlciBjb250ZW50LiBQYXJhbWV0ZXJzCi0gIGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBhcyBhdHRyaWJ1dGUvdmFsdWUgcGFpcnMgb24gdGhlCi0gIG9iamVjdCBlbGVtZW50IGl0c2VsZiB3aGVuIGJyZXZpdHkgaXMgZGVzaXJlZC4KLS0tPgotCi08IUVMRU1FTlQgb2JqZWN0ICgjUENEQVRBIHwgcGFyYW0gfCAlYmxvY2s7IHwgZm9ybSB8ICVpbmxpbmU7IHwgJW1pc2M7KSo+Ci08IUFUVExJU1Qgb2JqZWN0Ci0gICVhdHRyczsKLSAgZGVjbGFyZSAgICAgKGRlY2xhcmUpICAgICAgI0lNUExJRUQKLSAgY2xhc3NpZCAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgY29kZWJhc2UgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0YSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgY29kZXR5cGUgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgYXJjaGl2ZSAgICAgJVVyaUxpc3Q7ICAgICAgI0lNUExJRUQKLSAgc3RhbmRieSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWxpZ24gICAgICAgJUltZ0FsaWduOyAgICAgI0lNUExJRUQKLSAgYm9yZGVyICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgaHNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgdnNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gIHBhcmFtIGlzIHVzZWQgdG8gc3VwcGx5IGEgbmFtZWQgcHJvcGVydHkgdmFsdWUuCi0gIEluIFhNTCBpdCB3b3VsZCBzZWVtIG5hdHVyYWwgdG8gZm9sbG93IFJERiBhbmQgc3VwcG9ydCBhbgotICBhYmJyZXZpYXRlZCBzeW50YXggd2hlcmUgdGhlIHBhcmFtIGVsZW1lbnRzIGFyZSByZXBsYWNlZAotICBieSBhdHRyaWJ1dGUgdmFsdWUgcGFpcnMgb24gdGhlIG9iamVjdCBzdGFydCB0YWcuCi0tLT4KLTwhRUxFTUVOVCBwYXJhbSBFTVBUWT4KLTwhQVRUTElTVCBwYXJhbQotICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWV0eXBlICAgKGRhdGF8cmVmfG9iamVjdCkgImRhdGEiCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSmF2YSBhcHBsZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLQotICBPbmUgb2YgY29kZSBvciBvYmplY3QgYXR0cmlidXRlcyBtdXN0IGJlIHByZXNlbnQuCi0gIFBsYWNlIHBhcmFtIGVsZW1lbnRzIGJlZm9yZSBvdGhlciBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgYXBwbGV0ICgjUENEQVRBIHwgcGFyYW0gfCAlYmxvY2s7IHwgZm9ybSB8ICVpbmxpbmU7IHwgJW1pc2M7KSo+Ci08IUFUVExJU1QgYXBwbGV0Ci0gICVjb3JlYXR0cnM7Ci0gIGNvZGViYXNlICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGFyY2hpdmUgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGNvZGUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIG9iamVjdCAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNSRVFVSVJFRAotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjUkVRVUlSRUQKLSAgYWxpZ24gICAgICAgJUltZ0FsaWduOyAgICAgI0lNUExJRUQKLSAgaHNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgdnNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbWFnZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gICBUbyBhdm9pZCBhY2Nlc3NpYmlsaXR5IHByb2JsZW1zIGZvciBwZW9wbGUgd2hvIGFyZW4ndAotICAgYWJsZSB0byBzZWUgdGhlIGltYWdlLCB5b3Ugc2hvdWxkIHByb3ZpZGUgYSB0ZXh0Ci0gICBkZXNjcmlwdGlvbiB1c2luZyB0aGUgYWx0IGFuZCBsb25nZGVzYyBhdHRyaWJ1dGVzLgotICAgSW4gYWRkaXRpb24sIGF2b2lkIHRoZSB1c2Ugb2Ygc2VydmVyLXNpZGUgaW1hZ2UgbWFwcy4KLS0tPgotCi08IUVMRU1FTlQgaW1nIEVNUFRZPgotPCFBVFRMSVNUIGltZwotICAlYXR0cnM7Ci0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRAotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaXNtYXAgICAgICAgKGlzbWFwKSAgICAgICAgI0lNUExJRUQKLSAgYWxpZ24gICAgICAgJUltZ0FsaWduOyAgICAgI0lNUExJRUQKLSAgYm9yZGVyICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgaHNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgdnNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIHVzZW1hcCBwb2ludHMgdG8gYSBtYXAgZWxlbWVudCB3aGljaCBtYXkgYmUgaW4gdGhpcyBkb2N1bWVudAotICBvciBhbiBleHRlcm5hbCBkb2N1bWVudCwgYWx0aG91Z2ggdGhlIGxhdHRlciBpcyBub3Qgd2lkZWx5IHN1cHBvcnRlZCAtLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBDbGllbnQtc2lkZSBpbWFnZSBtYXBzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBUaGVzZSBjYW4gYmUgcGxhY2VkIGluIHRoZSBzYW1lIGRvY3VtZW50IG9yIGdyb3VwZWQgaW4gYQotICAgICBzZXBhcmF0ZSBkb2N1bWVudCBhbHRob3VnaCB0aGlzIGlzbid0IHlldCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IUVMRU1FTlQgbWFwICgoJWJsb2NrOyB8IGZvcm0gfCAlbWlzYzspKyB8IGFyZWErKT4KLTwhQVRUTElTVCBtYXAKLSAgJWkxOG47Ci0gICVldmVudHM7Ci0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNSRVFVSVJFRAotICBjbGFzcyAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzdHlsZSAgICAgICAlU3R5bGVTaGVldDsgICAjSU1QTElFRAotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBhcmVhIEVNUFRZPgotPCFBVFRMSVNUIGFyZWEKLSAgJWF0dHJzOwotICBzaGFwZSAgICAgICAlU2hhcGU7ICAgICAgICAicmVjdCIKLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgbm9ocmVmICAgICAgKG5vaHJlZikgICAgICAgI0lNUExJRUQKLSAgYWx0ICAgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRm9ybXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGZvcm0gJWZvcm0uY29udGVudDs+ICAgPCEtLSBmb3JtcyBzaG91bGRuJ3QgYmUgbmVzdGVkIC0tPgotCi08IUFUVExJU1QgZm9ybQotICAlYXR0cnM7Ci0gIGFjdGlvbiAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRAotICBtZXRob2QgICAgICAoZ2V0fHBvc3QpICAgICAiZ2V0IgotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICBlbmN0eXBlICAgICAlQ29udGVudFR5cGU7ICAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICBvbnN1Ym1pdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnJlc2V0ICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRAotICBhY2NlcHQtY2hhcnNldCAlQ2hhcnNldHM7ICAjSU1QTElFRAotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSAgRWFjaCBsYWJlbCBtdXN0IG5vdCBjb250YWluIG1vcmUgdGhhbiBPTkUgZmllbGQKLSAgTGFiZWwgZWxlbWVudHMgc2hvdWxkbid0IGJlIG5lc3RlZC4KLS0tPgotPCFFTEVNRU5UIGxhYmVsICVJbmxpbmU7PgotPCFBVFRMSVNUIGxhYmVsCi0gICVhdHRyczsKLSAgZm9yICAgICAgICAgSURSRUYgICAgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVOVElUWSAlIElucHV0VHlwZQotICAiKHRleHQgfCBwYXNzd29yZCB8IGNoZWNrYm94IHwKLSAgICByYWRpbyB8IHN1Ym1pdCB8IHJlc2V0IHwKLSAgICBmaWxlIHwgaGlkZGVuIHwgaW1hZ2UgfCBidXR0b24pIgotICAgPgotCi08IS0tIHRoZSBuYW1lIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBmb3IgYWxsIGJ1dCBzdWJtaXQgJiByZXNldCAtLT4KLQotPCFFTEVNRU5UIGlucHV0IEVNUFRZPiAgICAgPCEtLSBmb3JtIGNvbnRyb2wgLS0+Ci08IUFUVExJU1QgaW5wdXQKLSAgJWF0dHJzOwotICB0eXBlICAgICAgICAlSW5wdXRUeXBlOyAgICAidGV4dCIKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgY2hlY2tlZCAgICAgKGNoZWNrZWQpICAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgcmVhZG9ubHkgICAgKHJlYWRvbmx5KSAgICAgI0lNUExJRUQKLSAgc2l6ZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgbWF4bGVuZ3RoICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgYWx0ICAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25zZWxlY3QgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgYWNjZXB0ICAgICAgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQKLSAgYWxpZ24gICAgICAgJUltZ0FsaWduOyAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgc2VsZWN0IChvcHRncm91cHxvcHRpb24pKz4gIDwhLS0gb3B0aW9uIHNlbGVjdG9yIC0tPgotPCFBVFRMSVNUIHNlbGVjdAotICAlYXR0cnM7Ci0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHNpemUgICAgICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIG11bHRpcGxlICAgIChtdWx0aXBsZSkgICAgICNJTVBMSUVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIG9wdGdyb3VwIChvcHRpb24pKz4gICA8IS0tIG9wdGlvbiBncm91cCAtLT4KLTwhQVRUTElTVCBvcHRncm91cAotICAlYXR0cnM7Ci0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIGxhYmVsICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRAotICA+Ci0KLTwhRUxFTUVOVCBvcHRpb24gKCNQQ0RBVEEpPiAgICAgPCEtLSBzZWxlY3RhYmxlIGNob2ljZSAtLT4KLTwhQVRUTElTVCBvcHRpb24KLSAgJWF0dHJzOwotICBzZWxlY3RlZCAgICAoc2VsZWN0ZWQpICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICBsYWJlbCAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCB0ZXh0YXJlYSAoI1BDREFUQSk+ICAgICA8IS0tIG11bHRpLWxpbmUgdGV4dCBmaWVsZCAtLT4KLTwhQVRUTElTVCB0ZXh0YXJlYQotICAlYXR0cnM7Ci0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHJvd3MgICAgICAgICVOdW1iZXI7ICAgICAgICNSRVFVSVJFRAotICBjb2xzICAgICAgICAlTnVtYmVyOyAgICAgICAjUkVRVUlSRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgcmVhZG9ubHkgICAgKHJlYWRvbmx5KSAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25zZWxlY3QgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gIFRoZSBmaWVsZHNldCBlbGVtZW50IGlzIHVzZWQgdG8gZ3JvdXAgZm9ybSBmaWVsZHMuCi0gIE9ubHkgb25lIGxlZ2VuZCBlbGVtZW50IHNob3VsZCBvY2N1ciBpbiB0aGUgY29udGVudAotICBhbmQgaWYgcHJlc2VudCBzaG91bGQgb25seSBiZSBwcmVjZWRlZCBieSB3aGl0ZXNwYWNlLgotLS0+Ci08IUVMRU1FTlQgZmllbGRzZXQgKCNQQ0RBVEEgfCBsZWdlbmQgfCAlYmxvY2s7IHwgZm9ybSB8ICVpbmxpbmU7IHwgJW1pc2M7KSo+Ci08IUFUVExJU1QgZmllbGRzZXQKLSAgJWF0dHJzOwotICA+Ci0KLTwhRU5USVRZICUgTEFsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhRUxFTUVOVCBsZWdlbmQgJUlubGluZTs+ICAgICA8IS0tIGZpZWxkc2V0IGxhYmVsIC0tPgotPCFBVFRMSVNUIGxlZ2VuZAotICAlYXR0cnM7Ci0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIGFsaWduICAgICAgICVMQWxpZ247ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotIENvbnRlbnQgaXMgJUZsb3c7IGV4Y2x1ZGluZyBhLCBmb3JtLCBmb3JtIGNvbnRyb2xzLCBpZnJhbWUKLS0tPiAKLTwhRUxFTUVOVCBidXR0b24gJWJ1dHRvbi5jb250ZW50Oz4gIDwhLS0gcHVzaCBidXR0b24gLS0+Ci08IUFUVExJU1QgYnV0dG9uCi0gICVhdHRyczsKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgKGJ1dHRvbnxzdWJtaXR8cmVzZXQpICJzdWJtaXQiCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBzaW5nbGUtbGluZSB0ZXh0IGlucHV0IGNvbnRyb2wgKERFUFJFQ0FURUQpIC0tPgotPCFFTEVNRU5UIGlzaW5kZXggRU1QVFk+Ci08IUFUVExJU1QgaXNpbmRleAotICAlY29yZWF0dHJzOwotICAlaTE4bjsKLSAgcHJvbXB0ICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT0gVGFibGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIERlcml2ZWQgZnJvbSBJRVRGIEhUTUwgdGFibGUgc3RhbmRhcmQsIHNlZSBbUkZDMTk0Ml0gLS0+Ci0KLTwhLS0KLSBUaGUgYm9yZGVyIGF0dHJpYnV0ZSBzZXRzIHRoZSB0aGlja25lc3Mgb2YgdGhlIGZyYW1lIGFyb3VuZCB0aGUKLSB0YWJsZS4gVGhlIGRlZmF1bHQgdW5pdHMgYXJlIHNjcmVlbiBwaXhlbHMuCi0KLSBUaGUgZnJhbWUgYXR0cmlidXRlIHNwZWNpZmllcyB3aGljaCBwYXJ0cyBvZiB0aGUgZnJhbWUgYXJvdW5kCi0gdGhlIHRhYmxlIHNob3VsZCBiZSByZW5kZXJlZC4gVGhlIHZhbHVlcyBhcmUgbm90IHRoZSBzYW1lIGFzCi0gQ0FMUyB0byBhdm9pZCBhIG5hbWUgY2xhc2ggd2l0aCB0aGUgdmFsaWduIGF0dHJpYnV0ZS4KLS0tPgotPCFFTlRJVFkgJSBURnJhbWUgIih2b2lkfGFib3ZlfGJlbG93fGhzaWRlc3xsaHN8cmhzfHZzaWRlc3xib3h8Ym9yZGVyKSI+Ci0KLTwhLS0KLSBUaGUgcnVsZXMgYXR0cmlidXRlIGRlZmluZXMgd2hpY2ggcnVsZXMgdG8gZHJhdyBiZXR3ZWVuIGNlbGxzOgotCi0gSWYgcnVsZXMgaXMgYWJzZW50IHRoZW4gYXNzdW1lOgotICAgICAibm9uZSIgaWYgYm9yZGVyIGlzIGFic2VudCBvciBib3JkZXI9IjAiIG90aGVyd2lzZSAiYWxsIgotLS0+Ci0KLTwhRU5USVRZICUgVFJ1bGVzICIobm9uZSB8IGdyb3VwcyB8IHJvd3MgfCBjb2xzIHwgYWxsKSI+Ci0gIAotPCEtLSBob3Jpem9udGFsIHBsYWNlbWVudCBvZiB0YWJsZSByZWxhdGl2ZSB0byBkb2N1bWVudCAtLT4KLTwhRU5USVRZICUgVEFsaWduICIobGVmdHxjZW50ZXJ8cmlnaHQpIj4KLQotPCEtLSBob3Jpem9udGFsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzCi0KLSAgY2hhciAgICAgICAgYWxpZ25tZW50IGNoYXIsIGUuZy4gY2hhcj0nOicKLSAgY2hhcm9mZiAgICAgb2Zmc2V0IGZvciBhbGlnbm1lbnQgY2hhcgotLS0+Ci08IUVOVElUWSAlIGNlbGxoYWxpZ24KLSAgImFsaWduICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQKLSAgIGNoYXIgICAgICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgIGNoYXJvZmYgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQiCi0gID4KLQotPCEtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cyAtLT4KLTwhRU5USVRZICUgY2VsbHZhbGlnbgotICAidmFsaWduICAgICAodG9wfG1pZGRsZXxib3R0b218YmFzZWxpbmUpICNJTVBMSUVEIgotICA+Ci0KLTwhRUxFTUVOVCB0YWJsZQotICAgICAoY2FwdGlvbj8sIChjb2wqfGNvbGdyb3VwKiksIHRoZWFkPywgdGZvb3Q/LCAodGJvZHkrfHRyKykpPgotPCFFTEVNRU5UIGNhcHRpb24gICVJbmxpbmU7PgotPCFFTEVNRU5UIHRoZWFkICAgICh0cikrPgotPCFFTEVNRU5UIHRmb290ICAgICh0cikrPgotPCFFTEVNRU5UIHRib2R5ICAgICh0cikrPgotPCFFTEVNRU5UIGNvbGdyb3VwIChjb2wpKj4KLTwhRUxFTUVOVCBjb2wgICAgICBFTVBUWT4KLTwhRUxFTUVOVCB0ciAgICAgICAodGh8dGQpKz4KLTwhRUxFTUVOVCB0aCAgICAgICAlRmxvdzs+Ci08IUVMRU1FTlQgdGQgICAgICAgJUZsb3c7PgotCi08IUFUVExJU1QgdGFibGUKLSAgJWF0dHJzOwotICBzdW1tYXJ5ICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICBib3JkZXIgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBmcmFtZSAgICAgICAlVEZyYW1lOyAgICAgICAjSU1QTElFRAotICBydWxlcyAgICAgICAlVFJ1bGVzOyAgICAgICAjSU1QTElFRAotICBjZWxsc3BhY2luZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICBjZWxscGFkZGluZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICBhbGlnbiAgICAgICAlVEFsaWduOyAgICAgICAjSU1QTElFRAotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRU5USVRZICUgQ0FsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhQVRUTElTVCBjYXB0aW9uCi0gICVhdHRyczsKLSAgYWxpZ24gICAgICAgJUNBbGlnbjsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tCi1jb2xncm91cCBncm91cHMgYSBzZXQgb2YgY29sIGVsZW1lbnRzLiBJdCBhbGxvd3MgeW91IHRvIGdyb3VwCi1zZXZlcmFsIHNlbWFudGljYWxseSByZWxhdGVkIGNvbHVtbnMgdG9nZXRoZXIuCi0tLT4KLTwhQVRUTElTVCBjb2xncm91cAotICAlYXR0cnM7Ci0gIHNwYW4gICAgICAgICVOdW1iZXI7ICAgICAgICIxIgotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRAotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCEtLQotIGNvbCBlbGVtZW50cyBkZWZpbmUgdGhlIGFsaWdubWVudCBwcm9wZXJ0aWVzIGZvciBjZWxscyBpbgotIG9uZSBvciBtb3JlIGNvbHVtbnMuCi0KLSBUaGUgd2lkdGggYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbnMsIGUuZy4KLQotICAgICB3aWR0aD02NCAgICAgICAgd2lkdGggaW4gc2NyZWVuIHBpeGVscwotICAgICB3aWR0aD0wLjUqICAgICAgcmVsYXRpdmUgd2lkdGggb2YgMC41Ci0KLSBUaGUgc3BhbiBhdHRyaWJ1dGUgY2F1c2VzIHRoZSBhdHRyaWJ1dGVzIG9mIG9uZQotIGNvbCBlbGVtZW50IHRvIGFwcGx5IHRvIG1vcmUgdGhhbiBvbmUgY29sdW1uLgotLS0+Ci08IUFUVExJU1QgY29sCi0gICVhdHRyczsKLSAgc3BhbiAgICAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVECi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IS0tCi0gICAgVXNlIHRoZWFkIHRvIGR1cGxpY2F0ZSBoZWFkZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGhlYWRlcnMgd2hlbgotICAgIHRib2R5IHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgdGZvb3QgdG8gZHVwbGljYXRlIGZvb3RlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgZm9vdGVycyB3aGVuCi0gICAgdGJvZHkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSBtdWx0aXBsZSB0Ym9keSBzZWN0aW9ucyB3aGVuIHJ1bGVzIGFyZSBuZWVkZWQKLSAgICBiZXR3ZWVuIGdyb3VwcyBvZiB0YWJsZSByb3dzLgotLS0+Ci08IUFUVExJU1QgdGhlYWQKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCFBVFRMSVNUIHRmb290Ci0gICVhdHRyczsKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhQVRUTElTVCB0Ym9keQotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IUFUVExJU1QgdHIKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBTY29wZSBpcyBzaW1wbGVyIHRoYW4gaGVhZGVycyBhdHRyaWJ1dGUgZm9yIGNvbW1vbiB0YWJsZXMgLS0+Ci08IUVOVElUWSAlIFNjb3BlICIocm93fGNvbHxyb3dncm91cHxjb2xncm91cCkiPgotCi08IS0tIHRoIGlzIGZvciBoZWFkZXJzLCB0ZCBmb3IgZGF0YSBhbmQgZm9yIGNlbGxzIGFjdGluZyBhcyBib3RoIC0tPgotCi08IUFUVExJU1QgdGgKLSAgJWF0dHJzOwotICBhYmJyICAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBheGlzICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBoZWFkZXJzICAgICBJRFJFRlMgICAgICAgICAjSU1QTElFRAotICBzY29wZSAgICAgICAlU2NvcGU7ICAgICAgICAjSU1QTElFRAotICByb3dzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgY29sc3BhbiAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgbm93cmFwICAgICAgKG5vd3JhcCkgICAgICAgI0lNUExJRUQKLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUFUVExJU1QgdGQKLSAgJWF0dHJzOwotICBhYmJyICAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBheGlzICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBoZWFkZXJzICAgICBJRFJFRlMgICAgICAgICAjSU1QTElFRAotICBzY29wZSAgICAgICAlU2NvcGU7ICAgICAgICAjSU1QTElFRAotICByb3dzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgY29sc3BhbiAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgbm93cmFwICAgICAgKG5vd3JhcCkgICAgICAgI0lNUExJRUQKLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwxMS1mbGF0LmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbDExLWZsYXQuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2E4NTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbDExLWZsYXQuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsNDUxMyArMCwwIEBACi08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCAxLjEgRFREICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwxMS5kdGQKLS0tPgotCi08IS0tIFhIVE1MIDEuMSBEVEQKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotCi0gICAgIFRoZSBFeHRlbnNpYmxlIEh5cGVyVGV4dCBNYXJrdXAgTGFuZ3VhZ2UgKFhIVE1MKQotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0KLSAgICAgICAgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlCi0gICAgICAgICBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLgotICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotICAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoZSBYSFRNTCBEVEQgYW5kIGl0cyAKLSAgICAgYWNjb21wYW55aW5nIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgCi0gICAgIGdyYW50ZWQgaW4gcGVycGV0dWl0eSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgCi0gICAgIHRoaXMgcGFyYWdyYXBoIGFwcGVhciBpbiBhbGwgY29waWVzLiAgVGhlIGNvcHlyaWdodCBob2xkZXJzIG1ha2Ugbm8gCi0gICAgIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGUgRFREIGZvciBhbnkgcHVycG9zZS4KLQotICAgICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzc2VkIG9yIGltcGxpZWQgd2FycmFudHkuCi0KLSAgICAgICAgQXV0aG9yOiAgICAgTXVycmF5IE0uIEFsdGhlaW0gPGFsdGhlaW1AZW5nLnN1bi5jb20+Ci0gICAgICAgIFJldmlzaW9uOiAgICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkCi0KLS0tPgotPCEtLSBUaGlzIGlzIHRoZSBkcml2ZXIgZmlsZSBmb3IgdmVyc2lvbiAxLjEgb2YgdGhlIFhIVE1MIERURC4KLQotICAgICBQbGVhc2UgdXNlIHRoaXMgZm9ybWFsIHB1YmxpYyBpZGVudGlmaWVyIHRvIGlkZW50aWZ5IGl0OgotCi0gICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiIKLS0tPgotPCFFTlRJVFkgJSBYSFRNTC52ZXJzaW9uICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiIgPgotCi08IS0tIFVzZSB0aGlzIFVSSSB0byBpZGVudGlmeSB0aGUgZGVmYXVsdCBuYW1lc3BhY2U6Ci0KLSAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCi0gICAgIFNlZSB0aGUgUXVhbGlmaWVkIE5hbWVzIG1vZHVsZSBmb3IgaW5mb3JtYXRpb24KLSAgICAgb24gdGhlIHVzZSBvZiBuYW1lc3BhY2UgcHJlZml4ZXMgaW4gdGhlIERURC4KLS0tPgotPCFFTlRJVFkgJSBOUy5wcmVmaXhlZCAiSUdOT1JFIiA+Ci08IUVOVElUWSAlIFhIVE1MLnByZWZpeCAiIiA+Ci0KLTwhLS0gUmVzZXJ2ZWQgZm9yIHVzZSB3aXRoIHRoZSBYTGluayBuYW1lc3BhY2U6Ci0tLT4KLTwhRU5USVRZICUgWExJTksueG1sbnMgIiIgPgotPCFFTlRJVFkgJSBYTElOSy54bWxucy5hdHRyaWIgIiIgPgotCi08IS0tIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHVzaW5nIFhIVE1MIDEuMSBkaXJlY3RseSwgdXNlIHRoZSBGUEkKLSAgICAgaW4gdGhlIERPQ1RZUEUgZGVjbGFyYXRpb24sIHdpdGggdGhlIHhtbG5zIGF0dHJpYnV0ZSBvbiB0aGUKLSAgICAgZG9jdW1lbnQgZWxlbWVudCB0byBpZGVudGlmeSB0aGUgZGVmYXVsdCBuYW1lc3BhY2U6Ci0KLSAgICAgICA8P3htbCB2ZXJzaW9uPSIxLjAiPz4KLSAgICAgICA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iICJ4aHRtbDExLmR0ZCI+Ci0gICAgICAgPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICAgICAgeG1sOmxhbmc9ImVuIj4KLSAgICAgICAuLi4KLSAgICAgICA8L2h0bWw+Ci0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLS0tPgotCi08IS0tIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIHdpdGggZG9jdW1lbnQgcHJvZmlsZXMgLS0+Ci08IUVOVElUWSAlIFhIVE1MLnByb2ZpbGUgICIiID4KLQotPCEtLSBCaWRpcmVjdGlvbmFsIFRleHQgZmVhdHVyZXMKLSAgICAgVGhpcyBmZWF0dXJlLXRlc3QgZW50aXR5IGlzIHVzZWQgdG8gZGVjbGFyZSBlbGVtZW50cwotICAgICBhbmQgYXR0cmlidXRlcyB1c2VkIGZvciBiaWRpcmVjdGlvbmFsIHRleHQgc3VwcG9ydC4KLS0tPgotPCFFTlRJVFkgJSBYSFRNTC5iaWRpICAiSU5DTFVERSIgPgotCi08P2RvYyB0eXBlPSJkb2N0eXBlIiByb2xlPSJ0aXRsZSIgeyBYSFRNTCAxLjEgfSA/PgotCi08IS0tIDo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6IC0tPgotCi08IS0tIFByZS1GcmFtZXdvcmsgUmVkZWNsYXJhdGlvbiBwbGFjZWhvbGRlciAgLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIHRoaXMgc2VydmVzIGFzIGEgbG9jYXRpb24gdG8gaW5zZXJ0IG1hcmt1cCBkZWNsYXJhdGlvbnMKLSAgICAgaW50byB0aGUgRFREIHByaW9yIHRvIHRoZSBmcmFtZXdvcmsgZGVjbGFyYXRpb25zLgotLS0+Ci08IUVOVElUWSAlIHhodG1sLXByZWZ3LXJlZGVjbC5tb2R1bGUgIklHTk9SRSIgPgotPCFbJXhodG1sLXByZWZ3LXJlZGVjbC5tb2R1bGU7WwotJXhodG1sLXByZWZ3LXJlZGVjbC5tb2Q7Ci08IS0tIGVuZCBvZiB4aHRtbC1wcmVmdy1yZWRlY2wubW9kdWxlIC0tPl1dPgotCi08IUVOVElUWSAlIHhodG1sLWV2ZW50cy5tb2R1bGUgIklOQ0xVREUiID4KLQotPCEtLSBJbmxpbmUgU3R5bGUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1pbmxzdHlsZS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1pbmxzdHlsZS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1pbmxzdHlsZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBTdHlsZSAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbmxzdHlsZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbmxpbmUgU3R5bGUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1pbmxzdHlsZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIElubGluZSBTdHlsZSAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWlubHN0eWxlLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIElubGluZSBTdHlsZQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSAnc3R5bGUnIGF0dHJpYnV0ZSwgdXNlZCB0byBzdXBwb3J0IGlubGluZQotICAgICBzdHlsZSBtYXJrdXAuIFRoaXMgbW9kdWxlIG11c3QgYmUgaW5zdGFudGlhdGVkIHByaW9yIHRvIHRoZSBYSFRNTAotICAgICBDb21tb24gQXR0cmlidXRlcyBtb2R1bGUgaW4gb3JkZXIgdG8gYmUgaW5jbHVkZWQgaW4gJUNvcmUuYXR0cmliOy4KLS0tPgotCi08IUVOVElUWSAlIHN0eWxlLmF0dHJpYgotICAgICAic3R5bGUgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotCi08IUVOVElUWSAlIENvcmUuZXh0cmEuYXR0cmliCi0gICAgICIlc3R5bGUuYXR0cmliOyIKLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtaW5sc3R5bGUtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBkZWNsYXJlIERvY3VtZW50IE1vZGVsIG1vZHVsZSBpbnN0YW50aWF0ZWQgaW4gZnJhbWV3b3JrCi0tLT4KLTwhRU5USVRZICUgeGh0bWwtbW9kZWwubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCAxLjEgRG9jdW1lbnQgTW9kZWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbDExLW1vZGVsLTEubW9kIiA+Ci0KLTwhLS0gTW9kdWxhciBGcmFtZXdvcmsgTW9kdWxlIChyZXF1aXJlZCkgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtZnJhbWV3b3JrLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWZyYW1ld29yay5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1mcmFtZXdvcmsubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBNb2R1bGFyIEZyYW1ld29yayAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1mcmFtZXdvcmstMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgTW9kdWxhciBGcmFtZXdvcmsgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtZnJhbWV3b3JrLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIE1vZHVsYXIgRnJhbWV3b3JrIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtZnJhbWV3b3JrLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIE1vZHVsYXIgRnJhbWV3b3JrCi0KLSAgICAgVGhpcyByZXF1aXJlZCBtb2R1bGUgaW5zdGFudGlhdGVzIHRoZSBtb2R1bGVzIG5lZWRlZAotICAgICB0byBzdXBwb3J0IHRoZSBYSFRNTCBtb2R1bGFyaXphdGlvbiBtb2RlbCwgaW5jbHVkaW5nOgotCi0gICAgICAgICsgIG5vdGF0aW9ucwotICAgICAgICArICBkYXRhdHlwZXMKLSAgICAgICAgKyAgbmFtZXNwYWNlLXF1YWxpZmllZCBuYW1lcwotICAgICAgICArICBjb21tb24gYXR0cmlidXRlcwotICAgICAgICArICBkb2N1bWVudCBtb2RlbAotICAgICAgICArICBjaGFyYWN0ZXIgZW50aXRpZXMKLQotICAgICBUaGUgSW50cmluc2ljIEV2ZW50cyBtb2R1bGUgaXMgaWdub3JlZCBieSBkZWZhdWx0IGJ1dAotICAgICBvY2N1cnMgaW4gdGhpcyBtb2R1bGUgYmVjYXVzZSBpdCBtdXN0IGJlIGluc3RhbnRpYXRlZAotICAgICBwcmlvciB0byBBdHRyaWJ1dGVzIGJ1dCBhZnRlciBEYXRhdHlwZXMuCi0tLT4KLQotPCFFTlRJVFkgJSB4aHRtbC1hcmNoLm1vZHVsZSAiSUdOT1JFIiA+Ci08IVsleGh0bWwtYXJjaC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1hcmNoLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzZSBBcmNoaXRlY3R1cmUgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1hcmNoLTEubW9kIiA+Ci0leGh0bWwtYXJjaC5tb2Q7XV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtbm90YXRpb25zLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLW5vdGF0aW9ucy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1ub3RhdGlvbnMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTlMgWEhUTUwgTm90YXRpb25zIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtbm90YXRpb25zLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIE5vdGF0aW9ucyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLW5vdGF0aW9ucy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OUyBYSFRNTCBOb3RhdGlvbnMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1ub3RhdGlvbnMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTm90YXRpb25zCi0KLSAgICAgZGVmaW5lcyB0aGUgZm9sbG93aW5nIG5vdGF0aW9ucywgbWFueSBvZiB0aGVzZSBpbXBvcnRlZCBmcm9tCi0gICAgIG90aGVyIHNwZWNpZmljYXRpb25zIGFuZCBzdGFuZGFyZHMuIFdoZW4gYW4gZXhpc3RpbmcgRlBJIGlzCi0gICAgIGtub3duLCBpdCBpcyBpbmNvcnBvcmF0ZWQgaGVyZS4KLS0tPgotCi08IS0tIFhNTCBOb3RhdGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gU0dNTCBhbmQgWE1MIE5vdGF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFczQyBYTUwgMS4wIFJlY29tbWVuZGF0aW9uIC0tPgotPCFOT1RBVElPTiB3M2MteG1sCi0gICAgIFBVQkxJQyAiSVNPIDg4NzkvL05PVEFUSU9OIEV4dGVuc2libGUgTWFya3VwIExhbmd1YWdlIChYTUwpIDEuMC8vRU4iID4KLQotPCEtLSBYTUwgMS4wIENEQVRBIC0tPgotPCFOT1RBVElPTiBjZGF0YQotICAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWE1MIDEuMDogQ0RBVEEvL0VOIiA+Ci0KLTwhLS0gU0dNTCBGb3JtYWwgUHVibGljIElkZW50aWZpZXJzIC0tPgotPCFOT1RBVElPTiBmcGkKLSAgICAgUFVCTElDICJJU08gODg3OToxOTg2Ly9OT1RBVElPTiBGb3JtYWwgUHVibGljIElkZW50aWZpZXIvL0VOIiA+Ci0KLTwhLS0gWEhUTUwgTm90YXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGZvciBjZWxscGFkZGluZy9jZWxsc3BhY2luZyAtLT4KLQotPCEtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IU5PVEFUSU9OIGxlbmd0aAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTGVuZ3RoLy9FTiIgPgotCi08IS0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMgLS0+Ci08IU5PVEFUSU9OIGxpbmtUeXBlcwotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTGlua1R5cGVzLy9FTiIgPgotCi08IS0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycyAtLT4KLTwhTk9UQVRJT04gbWVkaWFEZXNjCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBNZWRpYURlc2MvL0VOIiA+Ci0KLTwhLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotPCFOT1RBVElPTiBtdWx0aUxlbmd0aAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTXVsdGlMZW5ndGgvL0VOIiA+Ci0KLTwhLS0gb25lIG9yIG1vcmUgZGlnaXRzIChOVU1CRVIpIC0tPgotPCFOT1RBVElPTiBudW1iZXIKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IE51bWJlci8vRU4iID4KLQotPCEtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgotPCFOT1RBVElPTiBwaXhlbHMKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFBpeGVscy8vRU4iID4KLQotPCEtLSBzY3JpcHQgZXhwcmVzc2lvbiAtLT4KLTwhTk9UQVRJT04gc2NyaXB0Ci0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBTY3JpcHQvL0VOIiA+Ci0KLTwhLS0gdGV4dHVhbCBjb250ZW50IC0tPgotPCFOT1RBVElPTiB0ZXh0Ci0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBUZXh0Ly9FTiIgPgotCi08IS0tIEltcG9ydGVkIE5vdGF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBbSVNPMTA2NDZdIC0tPgotPCFOT1RBVElPTiBjaGFyYWN0ZXIKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IENoYXJhY3Rlci8vRU4iID4KLQotPCEtLSBhIGNoYXJhY3RlciBlbmNvZGluZywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhTk9UQVRJT04gY2hhcnNldAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ2hhcnNldC8vRU4iID4KLQotPCEtLSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNoYXJhY3RlciBlbmNvZGluZ3MsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IU5PVEFUSU9OIGNoYXJzZXRzCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDaGFyc2V0cy8vRU4iID4KLQotPCEtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFOT1RBVElPTiBjb250ZW50VHlwZQotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ29udGVudFR5cGUvL0VOIiA+Ci0KLTwhLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgdHlwZXMsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IU5PVEFUSU9OIGNvbnRlbnRUeXBlcwotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ29udGVudFR5cGVzLy9FTiIgPgotCi08IS0tIGRhdGUgYW5kIHRpbWUgaW5mb3JtYXRpb24uIElTTyBkYXRlIGZvcm1hdCAtLT4KLTwhTk9UQVRJT04gZGF0ZXRpbWUKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IERhdGV0aW1lLy9FTiIgPgotCi08IS0tIGEgbGFuZ3VhZ2UgY29kZSwgYXMgcGVyIFtSRkMzMDY2XSAtLT4KLTwhTk9UQVRJT04gbGFuZ3VhZ2VDb2RlCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBMYW5ndWFnZUNvZGUvL0VOIiA+Ci0KLTwhLS0gYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIsIHNlZSBbVVJJXSAtLT4KLTwhTk9UQVRJT04gdXJpCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBVUkkvL0VOIiA+Ci0KLTwhLS0gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzLCBzZWUgW1VSSV0gLS0+Ci08IU5PVEFUSU9OIHVyaXMKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFVSSXMvL0VOIiA+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLW5vdGF0aW9ucy0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWRhdGF0eXBlcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1kYXRhdHlwZXMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtZGF0YXR5cGVzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgRGF0YXR5cGVzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtZGF0YXR5cGVzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIERhdGF0eXBlcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWRhdGF0eXBlcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBEYXRhdHlwZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1kYXRhdHlwZXMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gRGF0YXR5cGVzCi0KLSAgICAgZGVmaW5lcyBjb250YWluZXJzIGZvciB0aGUgZm9sbG93aW5nIGRhdGF0eXBlcywgbWFueSBvZgotICAgICB0aGVzZSBpbXBvcnRlZCBmcm9tIG90aGVyIHNwZWNpZmljYXRpb25zIGFuZCBzdGFuZGFyZHMuCi0tLT4KLQotPCEtLSBMZW5ndGggZGVmaW5lZCBmb3IgY2VsbHBhZGRpbmcvY2VsbHNwYWNpbmcgLS0+Ci0KLTwhLS0gbm4gZm9yIHBpeGVscyBvciBubiUgZm9yIHBlcmNlbnRhZ2UgbGVuZ3RoIC0tPgotPCFFTlRJVFkgJSBMZW5ndGguZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbGluayB0eXBlcyAtLT4KLTwhRU5USVRZICUgTGlua1R5cGVzLmRhdGF0eXBlICJOTVRPS0VOUyIgPgotCi08IS0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycyAtLT4KLTwhRU5USVRZICUgTWVkaWFEZXNjLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIHBpeGVsLCBwZXJjZW50YWdlLCBvciByZWxhdGl2ZSAtLT4KLTwhRU5USVRZICUgTXVsdGlMZW5ndGguZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gb25lIG9yIG1vcmUgZGlnaXRzIChOVU1CRVIpIC0tPgotPCFFTlRJVFkgJSBOdW1iZXIuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KLTwhRU5USVRZICUgUGl4ZWxzLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIHNjcmlwdCBleHByZXNzaW9uIC0tPgotPCFFTlRJVFkgJSBTY3JpcHQuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gdGV4dHVhbCBjb250ZW50IC0tPgotPCFFTlRJVFkgJSBUZXh0LmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIEltcG9ydGVkIERhdGF0eXBlcyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBbSVNPMTA2NDZdIC0tPgotPCFFTlRJVFkgJSBDaGFyYWN0ZXIuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gYSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IUVOVElUWSAlIENoYXJzZXQuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFFTlRJVFkgJSBDaGFyc2V0cy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFFTlRJVFkgJSBDb250ZW50VHlwZS5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhRU5USVRZICUgQ29udGVudFR5cGVzLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGRhdGUgYW5kIHRpbWUgaW5mb3JtYXRpb24uIElTTyBkYXRlIGZvcm1hdCAtLT4KLTwhRU5USVRZICUgRGF0ZXRpbWUuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gZm9ybWFsIHB1YmxpYyBpZGVudGlmaWVyLCBhcyBwZXIgW0lTTzg4NzldIC0tPgotPCFFTlRJVFkgJSBGUEkuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gYSBsYW5ndWFnZSBjb2RlLCBhcyBwZXIgW1JGQzMwNjZdIC0tPgotPCFFTlRJVFkgJSBMYW5ndWFnZUNvZGUuZGF0YXR5cGUgIk5NVE9LRU4iID4KLQotPCEtLSBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciwgc2VlIFtVUkldIC0tPgotPCFFTlRJVFkgJSBVUkkuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzLCBzZWUgW1VSSV0gLS0+Ci08IUVOVElUWSAlIFVSSXMuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWRhdGF0eXBlcy0xLm1vZCAtLT4KLV1dPgotCi08IS0tIHBsYWNlaG9sZGVyIGZvciBYTGluayBzdXBwb3J0IG1vZHVsZSAtLT4KLTwhRU5USVRZICUgeGh0bWwteGxpbmsubW9kICIiID4KLQotCi08IUVOVElUWSAlIHhodG1sLXFuYW1lLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXFuYW1lLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXFuYW1lLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgUXVhbGlmaWVkIE5hbWVzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtcW5hbWUtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFFuYW1lIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1xbmFtZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBRdWFsaWZpZWQgTmFtZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1xbmFtZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0jMjAwMC0xMC0yMjogYWRkZWQgcW5hbWUgZGVjbGFyYXRpb25zIGZvciBydWJ5IGVsZW1lbnRzCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFhIVE1MIFFuYW1lIChRdWFsaWZpZWQgTmFtZSkgTW9kdWxlCi0KLSAgICAgVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHR3byBwYXJ0cywgbGFiZWxlZCBTZWN0aW9uICdBJyBhbmQgJ0InOgotCi0gICAgICAgU2VjdGlvbiBBIGRlY2xhcmVzIHBhcmFtZXRlciBlbnRpdGllcyB0byBzdXBwb3J0IG5hbWVzcGFjZS0KLSAgICAgICBxdWFsaWZpZWQgbmFtZXMsIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMsIGFuZCBuYW1lIHByZWZpeGluZwotICAgICAgIGZvciBYSFRNTCBhbmQgZXh0ZW5zaW9ucy4KLQotICAgICAgIFNlY3Rpb24gQiBkZWNsYXJlcyBwYXJhbWV0ZXIgZW50aXRpZXMgdXNlZCB0byBwcm92aWRlCi0gICAgICAgbmFtZXNwYWNlLXF1YWxpZmllZCBuYW1lcyBmb3IgYWxsIFhIVE1MIGVsZW1lbnQgdHlwZXM6Ci0KLSAgICAgICAgICVhcHBsZXQucW5hbWU7ICAgdGhlIHhtbG5zLXF1YWxpZmllZCBuYW1lIGZvciA8YXBwbGV0PgotICAgICAgICAgJWJhc2UucW5hbWU7ICAgICB0aGUgeG1sbnMtcXVhbGlmaWVkIG5hbWUgZm9yIDxiYXNlPgotICAgICAgICAgLi4uCi0KLSAgICAgWEhUTUwgZXh0ZW5zaW9ucyB3b3VsZCBjcmVhdGUgYSBtb2R1bGUgc2ltaWxhciB0byB0aGlzIG9uZS4KLSAgICAgSW5jbHVkZWQgaW4gdGhlIFhIVE1MIGRpc3RyaWJ1dGlvbiBpcyBhIHRlbXBsYXRlIG1vZHVsZQotICAgICAoJ3RlbXBsYXRlLXFuYW1lLTEubW9kJykgc3VpdGFibGUgZm9yIHRoaXMgcHVycG9zZS4KLS0tPgotCi08IS0tIFNlY3Rpb24gQTogWEhUTUwgWE1MIE5hbWVzcGFjZSBGcmFtZXdvcmsgOjo6Ojo6Ojo6Ojo6Ojo6Ojo6OjogLS0+Ci0KLTwhLS0gMS4gRGVjbGFyZSBhICVYSFRNTC5wcmVmaXhlZDsgY29uZGl0aW9uYWwgc2VjdGlvbiBrZXl3b3JkLCB1c2VkCi0gICAgICAgIHRvIGFjdGl2YXRlIG5hbWVzcGFjZSBwcmVmaXhpbmcuIFRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZAotICAgICAgICBpbmhlcml0ICclTlMucHJlZml4ZWQ7JyBmcm9tIHRoZSBEVEQgZHJpdmVyLCBzbyB0aGF0IHVubGVzcwotICAgICAgICBvdmVycmlkZGVuLCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgZm9sbG93cyB0aGUgb3ZlcmFsbCBEVEQKLSAgICAgICAgcHJlZml4aW5nIHNjaGVtZS4KLS0tPgotPCFFTlRJVFkgJSBOUy5wcmVmaXhlZCAiSUdOT1JFIiA+Ci08IUVOVElUWSAlIFhIVE1MLnByZWZpeGVkICIlTlMucHJlZml4ZWQ7IiA+Ci0KLTwhLS0gMi4gRGVjbGFyZSBhIHBhcmFtZXRlciBlbnRpdHkgKGVnLiwgJVhIVE1MLnhtbG5zOykgY29udGFpbmluZwotICAgICAgICB0aGUgVVJJIHJlZmVyZW5jZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBYSFRNTCBuYW1lc3BhY2U6Ci0tLT4KLTwhRU5USVRZICUgWEhUTUwueG1sbnMgICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiA+Ci0KLTwhLS0gMy4gRGVjbGFyZSBwYXJhbWV0ZXIgZW50aXRpZXMgKGVnLiwgJVhIVE1MLnByZWZpeDspIGNvbnRhaW5pbmcKLSAgICAgICAgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHByZWZpeCBzdHJpbmcocykgdG8gdXNlIHdoZW4gcHJlZml4aW5nCi0gICAgICAgIGlzIGVuYWJsZWQuIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gaW4gdGhlIERURCBkcml2ZXIgb3IgdGhlCi0gICAgICAgIGludGVybmFsIHN1YnNldCBvZiBhbiBkb2N1bWVudCBpbnN0YW5jZS4gSWYgbm8gZGVmYXVsdCBwcmVmaXgKLSAgICAgICAgaXMgZGVzaXJlZCwgdGhpcyBtYXkgYmUgZGVjbGFyZWQgYXMgYW4gZW1wdHkgc3RyaW5nLgotCi0gICAgIE5PVEU6IEFzIHNwZWNpZmllZCBpbiBbWE1MTkFNRVNdLCB0aGUgbmFtZXNwYWNlIHByZWZpeCBzZXJ2ZXMKLSAgICAgYXMgYSBwcm94eSBmb3IgdGhlIFVSSSByZWZlcmVuY2UsIGFuZCBpcyBub3QgaW4gaXRzZWxmIHNpZ25pZmljYW50LgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnByZWZpeCAgIiIgPgotCi08IS0tIDQuIERlY2xhcmUgcGFyYW1ldGVyIGVudGl0aWVzIChlZy4sICVYSFRNTC5wZng7KSBjb250YWluaW5nIHRoZQotICAgICAgICBjb2xvbml6ZWQgcHJlZml4KGVzKSAoZWcuLCAnJVhIVE1MLnByZWZpeDs6JykgdXNlZCB3aGVuCi0gICAgICAgIHByZWZpeGluZyBpcyBhY3RpdmUsIGFuIGVtcHR5IHN0cmluZyB3aGVuIGl0IGlzIG5vdC4KLS0tPgotPCFbJVhIVE1MLnByZWZpeGVkO1sKLTwhRU5USVRZICUgWEhUTUwucGZ4ICAiJVhIVE1MLnByZWZpeDs6IiA+Ci1dXT4KLTwhRU5USVRZICUgWEhUTUwucGZ4ICAiIiA+Ci0KLTwhLS0gZGVjbGFyZSBxdWFsaWZpZWQgbmFtZSBleHRlbnNpb25zIGhlcmUgLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1xbmFtZS1leHRyYS5tb2QgIiIgPgotCi0KLTwhLS0gNS4gVGhlIHBhcmFtZXRlciBlbnRpdHkgJVhIVE1MLnhtbG5zLmV4dHJhLmF0dHJpYjsgbWF5IGJlCi0gICAgICAgIHJlZGVjbGFyZWQgdG8gY29udGFpbiBhbnkgbm9uLVhIVE1MIG5hbWVzcGFjZSBkZWNsYXJhdGlvbgotICAgICAgICBhdHRyaWJ1dGVzIGZvciBuYW1lc3BhY2VzIGVtYmVkZGVkIGluIFhIVE1MLiBUaGUgZGVmYXVsdAotICAgICAgICBpcyBhbiBlbXB0eSBzdHJpbmcuICBYTGluayBzaG91bGQgYmUgaW5jbHVkZWQgaGVyZSBpZiB1c2VkCi0gICAgICAgIGluIHRoZSBEVEQuCi0tLT4KLTwhRU5USVRZICUgWEhUTUwueG1sbnMuZXh0cmEuYXR0cmliICIiID4KLQotPCEtLSBUaGUgcmVtYWluZGVyIG9mIFNlY3Rpb24gQSBpcyBvbmx5IGZvbGxvd2VkIGluIFhIVE1MLCBub3QgZXh0ZW5zaW9ucy4gLS0+Ci0KLTwhLS0gRGVjbGFyZSBhIHBhcmFtZXRlciBlbnRpdHkgJU5TLmRlY2wuYXR0cmliOyBjb250YWluaW5nCi0gICAgIGFsbCBYTUwgTmFtZXNwYWNlIGRlY2xhcmF0aW9ucyB1c2VkIGluIHRoZSBEVEQsIHBsdXMgdGhlCi0gICAgIHhtbG5zIGRlY2xhcmF0aW9uIGZvciBYSFRNTCwgaXRzIGZvcm0gZGVwZW5kZW50IG9uIHdoZXRoZXIKLSAgICAgcHJlZml4aW5nIGlzIGFjdGl2ZS4KLS0tPgotPCFbJVhIVE1MLnByZWZpeGVkO1sKLTwhRU5USVRZICUgTlMuZGVjbC5hdHRyaWIKLSAgICAgInhtbG5zOiVYSFRNTC5wcmVmaXg7ICAlVVJJLmRhdGF0eXBlOyAgICNGSVhFRCAnJVhIVE1MLnhtbG5zOycKLSAgICAgICVYSFRNTC54bWxucy5leHRyYS5hdHRyaWI7IgotPgotXV0+Ci08IUVOVElUWSAlIE5TLmRlY2wuYXR0cmliCi0gICAgICIlWEhUTUwueG1sbnMuZXh0cmEuYXR0cmliOyIKLT4KLQotPCEtLSBUaGlzIGlzIGEgcGxhY2Vob2xkZXIgZm9yIGZ1dHVyZSBYTGluayBzdXBwb3J0LgotLS0+Ci08IUVOVElUWSAlIFhMSU5LLnhtbG5zLmF0dHJpYiAiIiA+Ci0KLTwhLS0gRGVjbGFyZSBhIHBhcmFtZXRlciBlbnRpdHkgJU5TLmRlY2wuYXR0cmliOyBjb250YWluaW5nIGFsbAotICAgICBYTUwgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGF0dHJpYnV0ZXMgdXNlZCBieSBYSFRNTCwgaW5jbHVkaW5nCi0gICAgIGEgZGVmYXVsdCB4bWxucyBhdHRyaWJ1dGUgd2hlbiBwcmVmaXhpbmcgaXMgaW5hY3RpdmUuCi0tLT4KLTwhWyVYSFRNTC5wcmVmaXhlZDtbCi08IUVOVElUWSAlIFhIVE1MLnhtbG5zLmF0dHJpYgotICAgICAiJU5TLmRlY2wuYXR0cmliOwotICAgICAgJVhMSU5LLnhtbG5zLmF0dHJpYjsiCi0+Ci1dXT4KLTwhRU5USVRZICUgWEhUTUwueG1sbnMuYXR0cmliCi0gICAgICJ4bWxucyAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNGSVhFRCAnJVhIVE1MLnhtbG5zOycKLSAgICAgICVYTElOSy54bWxucy5hdHRyaWI7IgotPgotCi08IS0tIHBsYWNlaG9sZGVyIGZvciBxdWFsaWZpZWQgbmFtZSByZWRlY2xhcmF0aW9ucyAtLT4KLTwhRU5USVRZICUgeGh0bWwtcW5hbWUucmVkZWNsICIiID4KLQotCi08IS0tIFNlY3Rpb24gQjogWEhUTUwgUXVhbGlmaWVkIE5hbWVzIDo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6IC0tPgotCi08IS0tIDYuIFRoaXMgc2VjdGlvbiBkZWNsYXJlcyBwYXJhbWV0ZXIgZW50aXRpZXMgdXNlZCB0byBwcm92aWRlCi0gICAgICAgIG5hbWVzcGFjZS1xdWFsaWZpZWQgbmFtZXMgZm9yIGFsbCBYSFRNTCBlbGVtZW50IHR5cGVzLgotLS0+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYXBwbGV0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBhcHBsZXQucW5hbWUgICIlWEhUTUwucGZ4O2FwcGxldCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJhc2UtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGJhc2UucW5hbWUgICAgIiVYSFRNTC5wZng7YmFzZSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJkby0xLm1vZCAtLT4KLTwhRU5USVRZICUgYmRvLnFuYW1lICAgICAiJVhIVE1MLnBmeDtiZG8iID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1ibGtwaHJhcy0xLm1vZCAtLT4KLTwhRU5USVRZICUgYWRkcmVzcy5xbmFtZSAiJVhIVE1MLnBmeDthZGRyZXNzIiA+Ci08IUVOVElUWSAlIGJsb2NrcXVvdGUucW5hbWUgICIlWEhUTUwucGZ4O2Jsb2NrcXVvdGUiID4KLTwhRU5USVRZICUgcHJlLnFuYW1lICAgICAiJVhIVE1MLnBmeDtwcmUiID4KLTwhRU5USVRZICUgaDEucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoMSIgPgotPCFFTlRJVFkgJSBoMi5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2gyIiA+Ci08IUVOVElUWSAlIGgzLnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDMiID4KLTwhRU5USVRZICUgaDQucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoNCIgPgotPCFFTlRJVFkgJSBoNS5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2g1IiA+Ci08IUVOVElUWSAlIGg2LnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDYiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1ibGtwcmVzLTEubW9kIC0tPgotPCFFTlRJVFkgJSBoci5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2hyIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmxrc3RydWN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBkaXYucW5hbWUgICAgICIlWEhUTUwucGZ4O2RpdiIgPgotPCFFTlRJVFkgJSBwLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O3AiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1lZGl0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBpbnMucW5hbWUgICAgICIlWEhUTUwucGZ4O2lucyIgPgotPCFFTlRJVFkgJSBkZWwucW5hbWUgICAgICIlWEhUTUwucGZ4O2RlbCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWZvcm0tMS5tb2QgLS0+Ci08IUVOVElUWSAlIGZvcm0ucW5hbWUgICAgIiVYSFRNTC5wZng7Zm9ybSIgPgotPCFFTlRJVFkgJSBsYWJlbC5xbmFtZSAgICIlWEhUTUwucGZ4O2xhYmVsIiA+Ci08IUVOVElUWSAlIGlucHV0LnFuYW1lICAgIiVYSFRNTC5wZng7aW5wdXQiID4KLTwhRU5USVRZICUgc2VsZWN0LnFuYW1lICAiJVhIVE1MLnBmeDtzZWxlY3QiID4KLTwhRU5USVRZICUgb3B0Z3JvdXAucW5hbWUgICIlWEhUTUwucGZ4O29wdGdyb3VwIiA+Ci08IUVOVElUWSAlIG9wdGlvbi5xbmFtZSAgIiVYSFRNTC5wZng7b3B0aW9uIiA+Ci08IUVOVElUWSAlIHRleHRhcmVhLnFuYW1lICAiJVhIVE1MLnBmeDt0ZXh0YXJlYSIgPgotPCFFTlRJVFkgJSBmaWVsZHNldC5xbmFtZSAgIiVYSFRNTC5wZng7ZmllbGRzZXQiID4KLTwhRU5USVRZICUgbGVnZW5kLnFuYW1lICAiJVhIVE1MLnBmeDtsZWdlbmQiID4KLTwhRU5USVRZICUgYnV0dG9uLnFuYW1lICAiJVhIVE1MLnBmeDtidXR0b24iID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1oeXBlcnRleHQtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGEucW5hbWUgICAgICAgIiVYSFRNTC5wZng7YSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWltYWdlLTEubW9kIC0tPgotPCFFTlRJVFkgJSBpbWcucW5hbWUgICAgICIlWEhUTUwucGZ4O2ltZyIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWlubHBocmFzLTEubW9kIC0tPgotPCFFTlRJVFkgJSBhYmJyLnFuYW1lICAgICIlWEhUTUwucGZ4O2FiYnIiID4KLTwhRU5USVRZICUgYWNyb255bS5xbmFtZSAiJVhIVE1MLnBmeDthY3JvbnltIiA+Ci08IUVOVElUWSAlIGNpdGUucW5hbWUgICAgIiVYSFRNTC5wZng7Y2l0ZSIgPgotPCFFTlRJVFkgJSBjb2RlLnFuYW1lICAgICIlWEhUTUwucGZ4O2NvZGUiID4KLTwhRU5USVRZICUgZGZuLnFuYW1lICAgICAiJVhIVE1MLnBmeDtkZm4iID4KLTwhRU5USVRZICUgZW0ucW5hbWUgICAgICAiJVhIVE1MLnBmeDtlbSIgPgotPCFFTlRJVFkgJSBrYmQucW5hbWUgICAgICIlWEhUTUwucGZ4O2tiZCIgPgotPCFFTlRJVFkgJSBxLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O3EiID4KLTwhRU5USVRZICUgc2FtcC5xbmFtZSAgICAiJVhIVE1MLnBmeDtzYW1wIiA+Ci08IUVOVElUWSAlIHN0cm9uZy5xbmFtZSAgIiVYSFRNTC5wZng7c3Ryb25nIiA+Ci08IUVOVElUWSAlIHZhci5xbmFtZSAgICAgIiVYSFRNTC5wZng7dmFyIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW5scHJlcy0xLm1vZCAtLT4KLTwhRU5USVRZICUgYi5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDtiIiA+Ci08IUVOVElUWSAlIGJpZy5xbmFtZSAgICAgIiVYSFRNTC5wZng7YmlnIiA+Ci08IUVOVElUWSAlIGkucW5hbWUgICAgICAgIiVYSFRNTC5wZng7aSIgPgotPCFFTlRJVFkgJSBzbWFsbC5xbmFtZSAgICIlWEhUTUwucGZ4O3NtYWxsIiA+Ci08IUVOVElUWSAlIHN1Yi5xbmFtZSAgICAgIiVYSFRNTC5wZng7c3ViIiA+Ci08IUVOVElUWSAlIHN1cC5xbmFtZSAgICAgIiVYSFRNTC5wZng7c3VwIiA+Ci08IUVOVElUWSAlIHR0LnFuYW1lICAgICAgIiVYSFRNTC5wZng7dHQiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbmxzdHJ1Y3QtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGJyLnFuYW1lICAgICAgIiVYSFRNTC5wZng7YnIiID4KLTwhRU5USVRZICUgc3Bhbi5xbmFtZSAgICAiJVhIVE1MLnBmeDtzcGFuIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaXNtYXAtMS5tb2QgKGFsc28gY3Npc21hcCwgc3Npc21hcCkgLS0+Ci08IUVOVElUWSAlIG1hcC5xbmFtZSAgICAgIiVYSFRNTC5wZng7bWFwIiA+Ci08IUVOVElUWSAlIGFyZWEucW5hbWUgICAgIiVYSFRNTC5wZng7YXJlYSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWxpbmstMS5tb2QgLS0+Ci08IUVOVElUWSAlIGxpbmsucW5hbWUgICAgIiVYSFRNTC5wZng7bGluayIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWxpc3QtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGRsLnFuYW1lICAgICAgIiVYSFRNTC5wZng7ZGwiID4KLTwhRU5USVRZICUgZHQucW5hbWUgICAgICAiJVhIVE1MLnBmeDtkdCIgPgotPCFFTlRJVFkgJSBkZC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2RkIiA+Ci08IUVOVElUWSAlIG9sLnFuYW1lICAgICAgIiVYSFRNTC5wZng7b2wiID4KLTwhRU5USVRZICUgdWwucW5hbWUgICAgICAiJVhIVE1MLnBmeDt1bCIgPgotPCFFTlRJVFkgJSBsaS5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2xpIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtbWV0YS0xLm1vZCAtLT4KLTwhRU5USVRZICUgbWV0YS5xbmFtZSAgICAiJVhIVE1MLnBmeDttZXRhIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtcGFyYW0tMS5tb2QgLS0+Ci08IUVOVElUWSAlIHBhcmFtLnFuYW1lICAgIiVYSFRNTC5wZng7cGFyYW0iID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1vYmplY3QtMS5tb2QgLS0+Ci08IUVOVElUWSAlIG9iamVjdC5xbmFtZSAgIiVYSFRNTC5wZng7b2JqZWN0IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtc2NyaXB0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBzY3JpcHQucW5hbWUgICIlWEhUTUwucGZ4O3NjcmlwdCIgPgotPCFFTlRJVFkgJSBub3NjcmlwdC5xbmFtZSAgIiVYSFRNTC5wZng7bm9zY3JpcHQiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1zdHJ1Y3QtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGh0bWwucW5hbWUgICAgIiVYSFRNTC5wZng7aHRtbCIgPgotPCFFTlRJVFkgJSBoZWFkLnFuYW1lICAgICIlWEhUTUwucGZ4O2hlYWQiID4KLTwhRU5USVRZICUgdGl0bGUucW5hbWUgICAiJVhIVE1MLnBmeDt0aXRsZSIgPgotPCFFTlRJVFkgJSBib2R5LnFuYW1lICAgICIlWEhUTUwucGZ4O2JvZHkiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1zdHlsZS0xLm1vZCAtLT4KLTwhRU5USVRZICUgc3R5bGUucW5hbWUgICAiJVhIVE1MLnBmeDtzdHlsZSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXRhYmxlLTEubW9kIC0tPgotPCFFTlRJVFkgJSB0YWJsZS5xbmFtZSAgICIlWEhUTUwucGZ4O3RhYmxlIiA+Ci08IUVOVElUWSAlIGNhcHRpb24ucW5hbWUgIiVYSFRNTC5wZng7Y2FwdGlvbiIgPgotPCFFTlRJVFkgJSB0aGVhZC5xbmFtZSAgICIlWEhUTUwucGZ4O3RoZWFkIiA+Ci08IUVOVElUWSAlIHRmb290LnFuYW1lICAgIiVYSFRNTC5wZng7dGZvb3QiID4KLTwhRU5USVRZICUgdGJvZHkucW5hbWUgICAiJVhIVE1MLnBmeDt0Ym9keSIgPgotPCFFTlRJVFkgJSBjb2xncm91cC5xbmFtZSAgIiVYSFRNTC5wZng7Y29sZ3JvdXAiID4KLTwhRU5USVRZICUgY29sLnFuYW1lICAgICAiJVhIVE1MLnBmeDtjb2wiID4KLTwhRU5USVRZICUgdHIucW5hbWUgICAgICAiJVhIVE1MLnBmeDt0ciIgPgotPCFFTlRJVFkgJSB0aC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3RoIiA+Ci08IUVOVElUWSAlIHRkLnFuYW1lICAgICAgIiVYSFRNTC5wZng7dGQiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1ydWJ5LTEubW9kIC0tPgotCi08IUVOVElUWSAlIHJ1YnkucW5hbWUgICAgIiVYSFRNTC5wZng7cnVieSIgPgotPCFFTlRJVFkgJSByYmMucW5hbWUgICAgICIlWEhUTUwucGZ4O3JiYyIgPgotPCFFTlRJVFkgJSBydGMucW5hbWUgICAgICIlWEhUTUwucGZ4O3J0YyIgPgotPCFFTlRJVFkgJSByYi5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3JiIiA+Ci08IUVOVElUWSAlIHJ0LnFuYW1lICAgICAgIiVYSFRNTC5wZng7cnQiID4KLTwhRU5USVRZICUgcnAucW5hbWUgICAgICAiJVhIVE1MLnBmeDtycCIgPgotCi08IS0tIFByb3Zpc2lvbmFsIFhIVE1MIDIuMCBRdWFsaWZpZWQgTmFtZXMgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW1hZ2UtMi5tb2QgLS0+Ci08IUVOVElUWSAlIGFsdC5xbmFtZSAgICAgIiVYSFRNTC5wZng7YWx0IiA+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXFuYW1lLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtZXZlbnRzLm1vZHVsZSAiSUdOT1JFIiA+Ci08IVsleGh0bWwtZXZlbnRzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWV2ZW50cy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIEludHJpbnNpYyBFdmVudHMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1ldmVudHMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW50cmluc2ljIEV2ZW50cyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtZXZlbnRzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIEludHJpbnNpYyBFdmVudHMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1ldmVudHMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW50cmluc2ljIEV2ZW50IEF0dHJpYnV0ZXMKLQotICAgICBUaGVzZSBhcmUgdGhlIGV2ZW50IGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiBIVE1MIDQuMCwKLSAgICAgU2VjdGlvbiAxOC4yLjMgIkludHJpbnNpYyBFdmVudHMiLiBUaGlzIG1vZHVsZSBtdXN0IGJlCi0gICAgIGluc3RhbnRpYXRlZCBwcmlvciB0byB0aGUgQXR0cmlidXRlcyBNb2R1bGUgYnV0IGFmdGVyCi0gICAgIHRoZSBEYXRhdHlwZSBNb2R1bGUgaW4gdGhlIE1vZHVsYXIgRnJhbWV3b3JrIG1vZHVsZS4KLQotICAgICJOb3RlOiBBdXRob3JzIG9mIEhUTUwgZG9jdW1lbnRzIGFyZSBhZHZpc2VkIHRoYXQgY2hhbmdlcwotICAgICBhcmUgbGlrZWx5IHRvIG9jY3VyIGluIHRoZSByZWFsbSBvZiBpbnRyaW5zaWMgZXZlbnRzCi0gICAgIChlLmcuLCBob3cgc2NyaXB0cyBhcmUgYm91bmQgdG8gZXZlbnRzKS4gUmVzZWFyY2ggaW4KLSAgICAgdGhpcyByZWFsbSBpcyBjYXJyaWVkIG9uIGJ5IG1lbWJlcnMgb2YgdGhlIFczQyBEb2N1bWVudAotICAgICBPYmplY3QgTW9kZWwgV29ya2luZyBHcm91cCAoc2VlIHRoZSBXM0MgV2ViIHNpdGUgYXQKLSAgICAgaHR0cDovL3d3dy53My5vcmcvIGZvciBtb3JlIGluZm9ybWF0aW9uKS4iCi0tLT4KLTwhLS0gTk9URTogQmVjYXVzZSB0aGUgQVRUTElTVCBkZWNsYXJhdGlvbnMgaW4gdGhpcyBtb2R1bGUgb2NjdXIKLSAgICAgYmVmb3JlIHRoZWlyIHJlc3BlY3RpdmUgRUxFTUVOVCBkZWNsYXJhdGlvbnMgaW4gb3RoZXIKLSAgICAgbW9kdWxlcywgdGhlcmUgbWF5IGJlIGEgZGVwZW5kZW5jeSBvbiB0aGlzIG1vZHVsZSB0aGF0Ci0gICAgIHNob3VsZCBiZSBjb25zaWRlcmVkIGlmIGFueSBvZiB0aGUgcGFyYW1ldGVyIGVudGl0aWVzIHVzZWQKLSAgICAgZm9yIGVsZW1lbnQgdHlwZSBuYW1lcyAoZWcuLCAlYS5xbmFtZTspIGFyZSByZWRlY2xhcmVkLgotLS0+Ci0KLTwhRU5USVRZICUgRXZlbnRzLmF0dHJpYgotICAgICAib25jbGljayAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25kYmxjbGljayAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25tb3VzZWRvd24gICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25tb3VzZXVwICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25tb3VzZW92ZXIgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25tb3VzZW1vdmUgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25tb3VzZW91dCAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25rZXlwcmVzcyAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25rZXlkb3duICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25rZXl1cCAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRCIKLT4KLQotPCEtLSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgb24gYW5jaG9yIGVsZW1lbnQKLS0tPgotPCFBVFRMSVNUICVhLnFuYW1lOwotICAgICBvbmZvY3VzICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICAjSU1QTElFRAotICAgICBvbmJsdXIgICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICAjSU1QTElFRAotPgotCi08IS0tIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBvbiBmb3JtIGVsZW1lbnQKLS0tPgotPCFBVFRMSVNUICVmb3JtLnFuYW1lOwotICAgICAgb25zdWJtaXQgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25yZXNldCAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotCi08IS0tIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBvbiBsYWJlbCBlbGVtZW50Ci0tLT4KLTwhQVRUTElTVCAlbGFiZWwucW5hbWU7Ci0gICAgICBvbmZvY3VzICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbmJsdXIgICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhLS0gYWRkaXRpb25hbCBhdHRyaWJ1dGVzIG9uIGlucHV0IGVsZW1lbnQKLS0tPgotPCFBVFRMSVNUICVpbnB1dC5xbmFtZTsKLSAgICAgIG9uZm9jdXMgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9uYmx1ciAgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9uc2VsZWN0ICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9uY2hhbmdlICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgb24gc2VsZWN0IGVsZW1lbnQKLS0tPgotPCFBVFRMSVNUICVzZWxlY3QucW5hbWU7Ci0gICAgICBvbmZvY3VzICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbmJsdXIgICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbmNoYW5nZSAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhLS0gYWRkaXRpb25hbCBhdHRyaWJ1dGVzIG9uIHRleHRhcmVhIGVsZW1lbnQKLS0tPgotPCFBVFRMSVNUICV0ZXh0YXJlYS5xbmFtZTsKLSAgICAgIG9uZm9jdXMgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9uYmx1ciAgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9uc2VsZWN0ICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9uY2hhbmdlICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgb24gYnV0dG9uIGVsZW1lbnQKLS0tPgotPCFBVFRMSVNUICVidXR0b24ucW5hbWU7Ci0gICAgICBvbmZvY3VzICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbmJsdXIgICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhLS0gYWRkaXRpb25hbCBhdHRyaWJ1dGVzIG9uIGJvZHkgZWxlbWVudAotLS0+Ci08IUFUVExJU1QgJWJvZHkucW5hbWU7Ci0gICAgICBvbmxvYWQgICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbnVubG9hZCAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhLS0gYWRkaXRpb25hbCBhdHRyaWJ1dGVzIG9uIGFyZWEgZWxlbWVudAotLS0+Ci08IUFUVExJU1QgJWFyZWEucW5hbWU7Ci0gICAgICBvbmZvY3VzICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbmJsdXIgICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWV2ZW50cy0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWF0dHJpYnMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtYXR0cmlicy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1hdHRyaWJzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgQ29tbW9uIEF0dHJpYnV0ZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1hdHRyaWJzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIENvbW1vbiBBdHRyaWJ1dGVzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWF0dHJpYnMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgQ29tbW9uIEF0dHJpYnV0ZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1hdHRyaWJzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIENvbW1vbiBBdHRyaWJ1dGVzCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgbWFueSBvZiB0aGUgY29tbW9uIGF0dHJpYnV0ZXMgZm9yIHRoZSBYSFRNTCBEVEQuCi0gICAgICVOUy5kZWNsLmF0dHJpYjsgaXMgZGVjbGFyZWQgaW4gdGhlIFhIVE1MIFFuYW1lIG1vZHVsZS4KLS0tPgotCi08IUVOVElUWSAlIGlkLmF0dHJpYgotICAgICAiaWQgICAgICAgICAgIElEICAgICAgICAgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCFFTlRJVFkgJSBjbGFzcy5hdHRyaWIKLSAgICAgImNsYXNzICAgICAgICBOTVRPS0VOUyAgICAgICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhRU5USVRZICUgdGl0bGUuYXR0cmliCi0gICAgICJ0aXRsZSAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IUVOVElUWSAlIENvcmUuZXh0cmEuYXR0cmliICIiID4KLQotPCFFTlRJVFkgJSBDb3JlLmF0dHJpYgotICAgICAiJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICVpZC5hdHRyaWI7Ci0gICAgICAlY2xhc3MuYXR0cmliOwotICAgICAgJXRpdGxlLmF0dHJpYjsKLSAgICAgICVDb3JlLmV4dHJhLmF0dHJpYjsiCi0+Ci0KLTwhRU5USVRZICUgbGFuZy5hdHRyaWIKLSAgICAgInhtbDpsYW5nICAgICAlTGFuZ3VhZ2VDb2RlLmRhdGF0eXBlOyAgI0lNUExJRUQiCi0+Ci0KLTwhWyVYSFRNTC5iaWRpO1sKLTwhRU5USVRZICUgZGlyLmF0dHJpYgotICAgICAiZGlyICAgICAgICAgICggbHRyIHwgcnRsICkgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCFFTlRJVFkgJSBJMThuLmF0dHJpYgotICAgICAiJWRpci5hdHRyaWI7Ci0gICAgICAlbGFuZy5hdHRyaWI7IgotPgotCi1dXT4KLTwhRU5USVRZICUgSTE4bi5hdHRyaWIKLSAgICAgIiVsYW5nLmF0dHJpYjsiCi0+Ci0KLTwhRU5USVRZICUgQ29tbW9uLmV4dHJhLmF0dHJpYiAiIiA+Ci0KLTwhLS0gaW50cmluc2ljIGV2ZW50IGF0dHJpYnV0ZXMgZGVjbGFyZWQgcHJldmlvdXNseQotLS0+Ci08IUVOVElUWSAlIEV2ZW50cy5hdHRyaWIgIiIgPgotCi08IUVOVElUWSAlIENvbW1vbi5hdHRyaWIKLSAgICAgIiVDb3JlLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLSAgICAgICVFdmVudHMuYXR0cmliOwotICAgICAgJUNvbW1vbi5leHRyYS5hdHRyaWI7IgotPgotCi08IS0tIGVuZCBvZiB4aHRtbC1hdHRyaWJzLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gcGxhY2Vob2xkZXIgZm9yIGNvbnRlbnQgbW9kZWwgcmVkZWNsYXJhdGlvbnMgLS0+Ci08IUVOVElUWSAlIHhodG1sLW1vZGVsLnJlZGVjbCAiIiA+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1tb2RlbC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1tb2RlbC5tb2R1bGU7WwotPCEtLSBpbnN0YW50aWF0ZSB0aGUgRG9jdW1lbnQgTW9kZWwgbW9kdWxlIGRlY2xhcmVkIGluIHRoZSBEVEQgZHJpdmVyCi0tLT4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIDEuMSBEb2N1bWVudCBNb2RlbCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbDExLW1vZGVsLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCAxLjEsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCAxLjEgRG9jdW1lbnQgTW9kZWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEtbW9kZWwtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gWEhUTUwgMS4xIERvY3VtZW50IE1vZGVsCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVzY3JpYmVzIHRoZSBncm91cGluZ3Mgb2YgZWxlbWVudHMgdGhhdCBtYWtlIHVwCi0gICAgIGNvbW1vbiBjb250ZW50IG1vZGVscyBmb3IgWEhUTUwgZWxlbWVudHMuCi0KLSAgICAgWEhUTUwgaGFzIHRocmVlIGJhc2ljIGNvbnRlbnQgbW9kZWxzOgotCi0gICAgICAgICAlSW5saW5lLm1peDsgIGNoYXJhY3Rlci1sZXZlbCBlbGVtZW50cwotICAgICAgICAgJUJsb2NrLm1peDsgICBibG9jay1saWtlIGVsZW1lbnRzLCBlZy4sIHBhcmFncmFwaHMgYW5kIGxpc3RzCi0gICAgICAgICAlRmxvdy5taXg7ICAgIGFueSBibG9jayBvciBpbmxpbmUgZWxlbWVudHMKLQotICAgICBBbnkgcGFyYW1ldGVyIGVudGl0aWVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlIG1heSBiZSB1c2VkCi0gICAgIHRvIGNyZWF0ZSBlbGVtZW50IGNvbnRlbnQgbW9kZWxzLCBidXQgdGhlIGFib3ZlIHRocmVlIGFyZQotICAgICBjb25zaWRlcmVkICdnbG9iYWwnIChpbnNvZmFyIGFzIHRoYXQgdGVybSBhcHBsaWVzIGhlcmUpLgotCi0gICAgIFRoZSByZXNlcnZlZCB3b3JkICcjUENEQVRBJyAoaW5kaWNhdGluZyBhIHRleHQgc3RyaW5nKSBpcyBub3cKLSAgICAgaW5jbHVkZWQgZXhwbGljaXRseSB3aXRoIGVhY2ggZWxlbWVudCBkZWNsYXJhdGlvbiB0aGF0IGlzCi0gICAgIGRlY2xhcmVkIGFzIG1peGVkIGNvbnRlbnQsIGFzIFhNTCByZXF1aXJlcyB0aGF0IHRoaXMgdG9rZW4KLSAgICAgb2NjdXIgZmlyc3QgaW4gYSBjb250ZW50IG1vZGVsIHNwZWNpZmljYXRpb24uCi0tLT4KLTwhLS0gRXh0ZW5kaW5nIHRoZSBNb2RlbAotCi0gICAgIFdoaWxlIGluIHNvbWUgY2FzZXMgdGhpcyBtb2R1bGUgbWF5IG5lZWQgdG8gYmUgcmV3cml0dGVuIHRvCi0gICAgIGFjY29tbW9kYXRlIGNoYW5nZXMgdG8gdGhlIGRvY3VtZW50IG1vZGVsLCBtaW5vciBleHRlbnNpb25zCi0gICAgIG1heSBiZSBhY2NvbXBsaXNoZWQgYnkgcmVkZWNsYXJpbmcgYW55IG9mIHRoZSB0aHJlZSAqLmV4dHJhOwotICAgICBwYXJhbWV0ZXIgZW50aXRpZXMgdG8gY29udGFpbiBleHRlbnNpb24gZWxlbWVudCB0eXBlcyBhcyBmb2xsb3dzOgotCi0gICAgICAgICAlTWlzYy5leHRyYTsgICAgd2hvc2UgcGFyZW50IG1heSBiZSBhbnkgYmxvY2sgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmUgZWxlbWVudC4KLQotICAgICAgICAgJUlubGluZS5leHRyYTsgIHdob3NlIHBhcmVudCBtYXkgYmUgYW55IGlubGluZSBlbGVtZW50LgotCi0gICAgICAgICAlQmxvY2suZXh0cmE7ICAgd2hvc2UgcGFyZW50IG1heSBiZSBhbnkgYmxvY2sgZWxlbWVudC4KLQotICAgICBJZiB1c2VkLCB0aGVzZSBwYXJhbWV0ZXIgZW50aXRpZXMgbXVzdCBiZSBhbiBPUi1zZXBhcmF0ZWQKLSAgICAgbGlzdCBiZWdpbm5pbmcgd2l0aCBhbiBPUiBzZXBhcmF0b3IgKCJ8IiksIGVnLiwgInwgYSB8IGIgfCBjIgotCi0gICAgIEFsbCBibG9jayBhbmQgaW5saW5lICouY2xhc3MgcGFyYW1ldGVyIGVudGl0aWVzIG5vdCBwYXJ0Ci0gICAgIG9mIHRoZSAqc3RydWN0LmNsYXNzIGNsYXNzZXMgYmVnaW4gd2l0aCAifCAiIHRvIGFsbG93IGZvcgotICAgICBleGNsdXNpb24gZnJvbSBtaXhlcy4KLS0tPgotCi08IS0tIC4uLi4uLi4uLi4uLi4uICBPcHRpb25hbCBFbGVtZW50cyBpbiBoZWFkICAuLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgSGVhZE9wdHMubWl4Ci0gICAgICIoICVzY3JpcHQucW5hbWU7IHwgJXN0eWxlLnFuYW1lOyB8ICVtZXRhLnFuYW1lOwotICAgICAgfCAlbGluay5xbmFtZTsgfCAlb2JqZWN0LnFuYW1lOyApKiIKLT4KLQotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLiAgTWlzY2VsbGFuZW91cyBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIGlucyBhbmQgZGVsIGFyZSB1c2VkIHRvIGRlbm90ZSBlZGl0aW5nIGNoYW5nZXMKLS0tPgotPCFFTlRJVFkgJSBFZGl0LmNsYXNzICJ8ICVpbnMucW5hbWU7IHwgJWRlbC5xbmFtZTsiID4KLQotPCEtLSBzY3JpcHQgYW5kIG5vc2NyaXB0IGFyZSB1c2VkIHRvIGNvbnRhaW4gc2NyaXB0cwotICAgICBhbmQgYWx0ZXJuYXRpdmUgY29udGVudAotLS0+Ci08IUVOVElUWSAlIFNjcmlwdC5jbGFzcyAifCAlc2NyaXB0LnFuYW1lOyB8ICVub3NjcmlwdC5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBNaXNjLmV4dHJhICIiID4KLQotPCEtLSBUaGVzZSBlbGVtZW50cyBhcmUgbmVpdGhlciBibG9jayBub3IgaW5saW5lLCBhbmQgY2FuCi0gICAgIGVzc2VudGlhbGx5IGJlIHVzZWQgYW55d2hlcmUgaW4gdGhlIGRvY3VtZW50IGJvZHkuCi0tLT4KLTwhRU5USVRZICUgTWlzYy5jbGFzcwotICAgICAiJUVkaXQuY2xhc3M7Ci0gICAgICAlU2NyaXB0LmNsYXNzOwotICAgICAgJU1pc2MuZXh0cmE7IgotPgotCi08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uICBJbmxpbmUgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgSW5sU3RydWN0LmNsYXNzICIlYnIucW5hbWU7IHwgJXNwYW4ucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgSW5sUGhyYXMuY2xhc3MKLSAgICAgInwgJWVtLnFuYW1lOyB8ICVzdHJvbmcucW5hbWU7IHwgJWRmbi5xbmFtZTsgfCAlY29kZS5xbmFtZTsKLSAgICAgIHwgJXNhbXAucW5hbWU7IHwgJWtiZC5xbmFtZTsgfCAldmFyLnFuYW1lOyB8ICVjaXRlLnFuYW1lOwotICAgICAgfCAlYWJici5xbmFtZTsgfCAlYWNyb255bS5xbmFtZTsgfCAlcS5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBJbmxQcmVzLmNsYXNzCi0gICAgICJ8ICV0dC5xbmFtZTsgfCAlaS5xbmFtZTsgfCAlYi5xbmFtZTsgfCAlYmlnLnFuYW1lOwotICAgICAgfCAlc21hbGwucW5hbWU7IHwgJXN1Yi5xbmFtZTsgfCAlc3VwLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEkxOG4uY2xhc3MgInwgJWJkby5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBBbmNob3IuY2xhc3MgInwgJWEucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgSW5sU3BlY2lhbC5jbGFzcwotICAgICAifCAlaW1nLnFuYW1lOyB8ICVtYXAucW5hbWU7Ci0gICAgICB8ICVvYmplY3QucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgSW5sRm9ybS5jbGFzcwotICAgICAifCAlaW5wdXQucW5hbWU7IHwgJXNlbGVjdC5xbmFtZTsgfCAldGV4dGFyZWEucW5hbWU7Ci0gICAgICB8ICVsYWJlbC5xbmFtZTsgfCAlYnV0dG9uLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubGluZS5leHRyYSAiIiA+Ci0KLTwhRU5USVRZICUgUnVieS5jbGFzcyAifCAlcnVieS5xbmFtZTsiID4KLQotPCEtLSAlSW5saW5lLmNsYXNzOyBpbmNsdWRlcyBhbGwgaW5saW5lIGVsZW1lbnRzLAotICAgICB1c2VkIGFzIGEgY29tcG9uZW50IGluIG1peGVzCi0tLT4KLTwhRU5USVRZICUgSW5saW5lLmNsYXNzCi0gICAgICIlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUlubFByZXMuY2xhc3M7Ci0gICAgICAlSTE4bi5jbGFzczsKLSAgICAgICVBbmNob3IuY2xhc3M7Ci0gICAgICAlSW5sU3BlY2lhbC5jbGFzczsKLSAgICAgICVJbmxGb3JtLmNsYXNzOwotICAgICAgJVJ1YnkuY2xhc3M7Ci0gICAgICAlSW5saW5lLmV4dHJhOyIKLT4KLQotPCEtLSAlSW5sTm9SdWJ5LmNsYXNzOyBpbmNsdWRlcyBhbGwgaW5saW5lIGVsZW1lbnRzCi0gICAgIGV4Y2VwdCBydWJ5LCB1c2VkIGFzIGEgY29tcG9uZW50IGluIG1peGVzCi0tLT4KLTwhRU5USVRZICUgSW5sTm9SdWJ5LmNsYXNzCi0gICAgICIlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUlubFByZXMuY2xhc3M7Ci0gICAgICAlSTE4bi5jbGFzczsKLSAgICAgICVBbmNob3IuY2xhc3M7Ci0gICAgICAlSW5sU3BlY2lhbC5jbGFzczsKLSAgICAgICVJbmxGb3JtLmNsYXNzOwotICAgICAgJUlubGluZS5leHRyYTsiCi0+Ci0KLTwhLS0gJU5vUnVieS5jb250ZW50OyBpbmNsdWRlcyBhbGwgaW5saW5lcyBleGNlcHQgcnVieQotLS0+Ci08IUVOVElUWSAlIE5vUnVieS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEKLSAgICAgIHwgJUlubE5vUnVieS5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyApKiIKLT4KLQotPCEtLSAlSW5sTm9BbmNob3IuY2xhc3M7IGluY2x1ZGVzIGFsbCBub24tYW5jaG9yIGlubGluZXMsCi0gICAgIHVzZWQgYXMgYSBjb21wb25lbnQgaW4gbWl4ZXMKLS0tPgotPCFFTlRJVFkgJSBJbmxOb0FuY2hvci5jbGFzcwotICAgICAiJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgICVJbmxQcmVzLmNsYXNzOwotICAgICAgJUkxOG4uY2xhc3M7Ci0gICAgICAlSW5sU3BlY2lhbC5jbGFzczsKLSAgICAgICVJbmxGb3JtLmNsYXNzOwotICAgICAgJVJ1YnkuY2xhc3M7Ci0gICAgICAlSW5saW5lLmV4dHJhOyIKLT4KLQotPCEtLSAlSW5sTm9BbmNob3IubWl4OyBpbmNsdWRlcyBhbGwgbm9uLWFuY2hvciBpbmxpbmVzCi0tLT4KLTwhRU5USVRZICUgSW5sTm9BbmNob3IubWl4Ci0gICAgICIlSW5sTm9BbmNob3IuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gJUlubGluZS5taXg7IGluY2x1ZGVzIGFsbCBpbmxpbmUgZWxlbWVudHMsIGluY2x1ZGluZyAlTWlzYy5jbGFzczsKLS0tPgotPCFFTlRJVFkgJSBJbmxpbmUubWl4Ci0gICAgICIlSW5saW5lLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLiAgQmxvY2sgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW4gdGhlIEhUTUwgNC4wIERURCwgaGVhZGluZyBhbmQgbGlzdCBlbGVtZW50cyB3ZXJlIGluY2x1ZGVkCi0gICAgIGluIHRoZSAlYmxvY2s7IHBhcmFtZXRlciBlbnRpdHkuIFRoZSAlSGVhZGluZy5jbGFzczsgYW5kCi0gICAgICVMaXN0LmNsYXNzOyBwYXJhbWV0ZXIgZW50aXRpZXMgbXVzdCBub3cgYmUgaW5jbHVkZWQgZXhwbGljaXRseQotICAgICBvbiBlbGVtZW50IGRlY2xhcmF0aW9ucyB3aGVyZSBkZXNpcmVkLgotLS0+Ci0KLTwhRU5USVRZICUgSGVhZGluZy5jbGFzcwotICAgICAiJWgxLnFuYW1lOyB8ICVoMi5xbmFtZTsgfCAlaDMucW5hbWU7Ci0gICAgICB8ICVoNC5xbmFtZTsgfCAlaDUucW5hbWU7IHwgJWg2LnFuYW1lOyIgPgotCi08IUVOVElUWSAlIExpc3QuY2xhc3MgIiV1bC5xbmFtZTsgfCAlb2wucW5hbWU7IHwgJWRsLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIFRhYmxlLmNsYXNzICJ8ICV0YWJsZS5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBGb3JtLmNsYXNzICAifCAlZm9ybS5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBGaWVsZHNldC5jbGFzcyAgInwgJWZpZWxkc2V0LnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEJsa1N0cnVjdC5jbGFzcyAiJXAucW5hbWU7IHwgJWRpdi5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBCbGtQaHJhcy5jbGFzcwotICAgICAifCAlcHJlLnFuYW1lOyB8ICVibG9ja3F1b3RlLnFuYW1lOyB8ICVhZGRyZXNzLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEJsa1ByZXMuY2xhc3MgInwgJWhyLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEJsa1NwZWNpYWwuY2xhc3MKLSAgICAgIiVUYWJsZS5jbGFzczsKLSAgICAgICVGb3JtLmNsYXNzOwotICAgICAgJUZpZWxkc2V0LmNsYXNzOyIKLT4KLQotPCFFTlRJVFkgJSBCbG9jay5leHRyYSAiIiA+Ci0KLTwhLS0gJUJsb2NrLmNsYXNzOyBpbmNsdWRlcyBhbGwgYmxvY2sgZWxlbWVudHMsCi0gICAgIHVzZWQgYXMgYW4gY29tcG9uZW50IGluIG1peGVzCi0tLT4KLTwhRU5USVRZICUgQmxvY2suY2xhc3MKLSAgICAgIiVCbGtTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlQmxrUGhyYXMuY2xhc3M7Ci0gICAgICAlQmxrUHJlcy5jbGFzczsKLSAgICAgICVCbGtTcGVjaWFsLmNsYXNzOwotICAgICAgJUJsb2NrLmV4dHJhOyIKLT4KLQotPCEtLSAlQmxvY2subWl4OyBpbmNsdWRlcyBhbGwgYmxvY2sgZWxlbWVudHMgcGx1cyAlTWlzYy5jbGFzczsKLS0tPgotPCFFTlRJVFkgJSBCbG9jay5taXgKLSAgICAgIiVIZWFkaW5nLmNsYXNzOwotICAgICAgfCAlTGlzdC5jbGFzczsKLSAgICAgIHwgJUJsb2NrLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IS0tIC4uLi4uLi4uLi4uLi4uLi4gIEFsbCBDb250ZW50IEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gJUZsb3cubWl4OyBpbmNsdWRlcyBhbGwgdGV4dCBjb250ZW50LCBibG9jayBhbmQgaW5saW5lCi0tLT4KLTwhRU5USVRZICUgRmxvdy5taXgKLSAgICAgIiVIZWFkaW5nLmNsYXNzOwotICAgICAgfCAlTGlzdC5jbGFzczsKLSAgICAgIHwgJUJsb2NrLmNsYXNzOwotICAgICAgfCAlSW5saW5lLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IS0tIGVuZCBvZiB4aHRtbDExLW1vZGVsLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtY2hhcmVudC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1jaGFyZW50Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWNoYXJlbnQubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBDaGFyYWN0ZXIgRW50aXRpZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1jaGFyZW50LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIENoYXJhY3RlciBFbnRpdGllcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1jaGFyZW50LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIENoYXJhY3RlciBFbnRpdGllcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWNoYXJlbnQtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQ2hhcmFjdGVyIEVudGl0aWVzIGZvciBYSFRNTAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBzZXQgb2YgY2hhcmFjdGVyIGVudGl0aWVzIGZvciBYSFRNTCwKLSAgICAgaW5jbHVkaW5nIHRoZSBMYXRpbiAxLCBTeW1ib2wgYW5kIFNwZWNpYWwgY2hhcmFjdGVyIGNvbGxlY3Rpb25zLgotLS0+Ci0KLTwhRU5USVRZICUgeGh0bWwtbGF0MQotICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbiAxIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICAgICJ4aHRtbC1sYXQxLmVudCIgPgotPCEtLSBQb3J0aW9ucyAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICA8IUVOVElUWSAlIEhUTUxsYXQxIFBVQkxJQwotICAgICAgICItLy9XM0MvL0VOVElUSUVTIExhdGluIDEgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1sYXQxLmVudCI+Ci0gICAgJUhUTUxsYXQxOwotLS0+Ci0KLTwhRU5USVRZIG5ic3AgICAiJiMxNjA7Ij4gPCEtLSBuby1icmVhayBzcGFjZSA9IG5vbi1icmVha2luZyBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQTAgSVNPbnVtIC0tPgotPCFFTlRJVFkgaWV4Y2wgICImIzE2MTsiPiA8IS0tIGludmVydGVkIGV4Y2xhbWF0aW9uIG1hcmssIFUrMDBBMSBJU09udW0gLS0+Ci08IUVOVElUWSBjZW50ICAgIiYjMTYyOyI+IDwhLS0gY2VudCBzaWduLCBVKzAwQTIgSVNPbnVtIC0tPgotPCFFTlRJVFkgcG91bmQgICImIzE2MzsiPiA8IS0tIHBvdW5kIHNpZ24sIFUrMDBBMyBJU09udW0gLS0+Ci08IUVOVElUWSBjdXJyZW4gIiYjMTY0OyI+IDwhLS0gY3VycmVuY3kgc2lnbiwgVSswMEE0IElTT251bSAtLT4KLTwhRU5USVRZIHllbiAgICAiJiMxNjU7Ij4gPCEtLSB5ZW4gc2lnbiA9IHl1YW4gc2lnbiwgVSswMEE1IElTT251bSAtLT4KLTwhRU5USVRZIGJydmJhciAiJiMxNjY7Ij4gPCEtLSBicm9rZW4gYmFyID0gYnJva2VuIHZlcnRpY2FsIGJhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQTYgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2VjdCAgICImIzE2NzsiPiA8IS0tIHNlY3Rpb24gc2lnbiwgVSswMEE3IElTT251bSAtLT4KLTwhRU5USVRZIHVtbCAgICAiJiMxNjg7Ij4gPCEtLSBkaWFlcmVzaXMgPSBzcGFjaW5nIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQTggSVNPZGlhIC0tPgotPCFFTlRJVFkgY29weSAgICImIzE2OTsiPiA8IS0tIGNvcHlyaWdodCBzaWduLCBVKzAwQTkgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3JkZiAgICImIzE3MDsiPiA8IS0tIGZlbWluaW5lIG9yZGluYWwgaW5kaWNhdG9yLCBVKzAwQUEgSVNPbnVtIC0tPgotPCFFTlRJVFkgbGFxdW8gICImIzE3MTsiPiA8IS0tIGxlZnQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsZWZ0IHBvaW50aW5nIGd1aWxsZW1ldCwgVSswMEFCIElTT251bSAtLT4KLTwhRU5USVRZIG5vdCAgICAiJiMxNzI7Ij4gPCEtLSBub3Qgc2lnbiA9IGRpc2NyZXRpb25hcnkgaHlwaGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBQyBJU09udW0gLS0+Ci08IUVOVElUWSBzaHkgICAgIiYjMTczOyI+IDwhLS0gc29mdCBoeXBoZW4gPSBkaXNjcmV0aW9uYXJ5IGh5cGhlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQUQgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmVnICAgICImIzE3NDsiPiA8IS0tIHJlZ2lzdGVyZWQgc2lnbiA9IHJlZ2lzdGVyZWQgdHJhZGUgbWFyayBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBRSBJU09udW0gLS0+Ci08IUVOVElUWSBtYWNyICAgIiYjMTc1OyI+IDwhLS0gbWFjcm9uID0gc3BhY2luZyBtYWNyb24gPSBvdmVybGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQVBMIG92ZXJiYXIsIFUrMDBBRiBJU09kaWEgLS0+Ci08IUVOVElUWSBkZWcgICAgIiYjMTc2OyI+IDwhLS0gZGVncmVlIHNpZ24sIFUrMDBCMCBJU09udW0gLS0+Ci08IUVOVElUWSBwbHVzbW4gIiYjMTc3OyI+IDwhLS0gcGx1cy1taW51cyBzaWduID0gcGx1cy1vci1taW51cyBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCMSBJU09udW0gLS0+Ci08IUVOVElUWSBzdXAyICAgIiYjMTc4OyI+IDwhLS0gc3VwZXJzY3JpcHQgdHdvID0gc3VwZXJzY3JpcHQgZGlnaXQgdHdvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzcXVhcmVkLCBVKzAwQjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgc3VwMyAgICImIzE3OTsiPiA8IS0tIHN1cGVyc2NyaXB0IHRocmVlID0gc3VwZXJzY3JpcHQgZGlnaXQgdGhyZWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGN1YmVkLCBVKzAwQjMgSVNPbnVtIC0tPgotPCFFTlRJVFkgYWN1dGUgICImIzE4MDsiPiA8IS0tIGFjdXRlIGFjY2VudCA9IHNwYWNpbmcgYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEI0IElTT2RpYSAtLT4KLTwhRU5USVRZIG1pY3JvICAiJiMxODE7Ij4gPCEtLSBtaWNybyBzaWduLCBVKzAwQjUgSVNPbnVtIC0tPgotPCFFTlRJVFkgcGFyYSAgICImIzE4MjsiPiA8IS0tIHBpbGNyb3cgc2lnbiA9IHBhcmFncmFwaCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCNiBJU09udW0gLS0+Ci08IUVOVElUWSBtaWRkb3QgIiYjMTgzOyI+IDwhLS0gbWlkZGxlIGRvdCA9IEdlb3JnaWFuIGNvbW1hCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBHcmVlayBtaWRkbGUgZG90LCBVKzAwQjcgSVNPbnVtIC0tPgotPCFFTlRJVFkgY2VkaWwgICImIzE4NDsiPiA8IS0tIGNlZGlsbGEgPSBzcGFjaW5nIGNlZGlsbGEsIFUrMDBCOCBJU09kaWEgLS0+Ci08IUVOVElUWSBzdXAxICAgIiYjMTg1OyI+IDwhLS0gc3VwZXJzY3JpcHQgb25lID0gc3VwZXJzY3JpcHQgZGlnaXQgb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCOSBJU09udW0gLS0+Ci08IUVOVElUWSBvcmRtICAgIiYjMTg2OyI+IDwhLS0gbWFzY3VsaW5lIG9yZGluYWwgaW5kaWNhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCQSBJU09udW0gLS0+Ci08IUVOVElUWSByYXF1byAgIiYjMTg3OyI+IDwhLS0gcmlnaHQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSByaWdodCBwb2ludGluZyBndWlsbGVtZXQsIFUrMDBCQiBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMTQgIiYjMTg4OyI+IDwhLS0gdnVsZ2FyIGZyYWN0aW9uIG9uZSBxdWFydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmcmFjdGlvbiBvbmUgcXVhcnRlciwgVSswMEJDIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMxMiAiJiMxODk7Ij4gPCEtLSB2dWxnYXIgZnJhY3Rpb24gb25lIGhhbGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZyYWN0aW9uIG9uZSBoYWxmLCBVKzAwQkQgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzM0ICImIzE5MDsiPiA8IS0tIHZ1bGdhciBmcmFjdGlvbiB0aHJlZSBxdWFydGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMsIFUrMDBCRSBJU09udW0gLS0+Ci08IUVOVElUWSBpcXVlc3QgIiYjMTkxOyI+IDwhLS0gaW52ZXJ0ZWQgcXVlc3Rpb24gbWFyawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHVybmVkIHF1ZXN0aW9uIG1hcmssIFUrMDBCRiBJU09udW0gLS0+Ci08IUVOVElUWSBBZ3JhdmUgIiYjMTkyOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGdyYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgQWFjdXRlICImIzE5MzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFjaXJjICAiJiMxOTQ7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEF0aWxkZSAiJiMxOTU7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBdW1sICAgIiYjMTk2OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFyaW5nICAiJiMxOTc7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggcmluZyBhYm92ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSByaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgQUVsaWcgICImIzE5ODsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEFFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIEFFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgQ2NlZGlsICImIzE5OTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEMgd2l0aCBjZWRpbGxhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNyBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWdyYXZlICImIzIwMDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzggSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVhY3V0ZSAiJiMyMDE7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFY2lyYyAgIiYjMjAyOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBFdW1sICAgIiYjMjAzOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0IgSVNPbGF0MSAtLT4KLTwhRU5USVRZIElncmF2ZSAiJiMyMDQ7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJYWN1dGUgIiYjMjA1OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWNpcmMgICImIzIwNjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgSXVtbCAgICImIzIwNzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBFVEggICAgIiYjMjA4OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRVRILCBVKzAwRDAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE50aWxkZSAiJiMyMDk7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBOIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPZ3JhdmUgIiYjMjEwOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2FjdXRlICImIzIxMTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9jaXJjICAiJiMyMTI7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE90aWxkZSAiJiMyMTM7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBPdW1sICAgIiYjMjE0OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHRpbWVzICAiJiMyMTU7Ij4gPCEtLSBtdWx0aXBsaWNhdGlvbiBzaWduLCBVKzAwRDcgSVNPbnVtIC0tPgotPCFFTlRJVFkgT3NsYXNoICImIzIxNjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBzdHJva2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gc2xhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBVZ3JhdmUgIiYjMjE3OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWFjdXRlICImIzIxODsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVjaXJjICAiJiMyMTk7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFV1bWwgICAiJiMyMjA7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgWWFjdXRlICImIzIyMTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFRIT1JOICAiJiMyMjI7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBUSE9STiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHN6bGlnICAiJiMyMjM7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgc2hhcnAgcyA9IGVzcy16ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhZ3JhdmUgIiYjMjI0OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBncmF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGV0dGVyIGEgZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhYWN1dGUgIiYjMjI1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFjaXJjICAiJiMyMjY7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhdGlsZGUgIiYjMjI3OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGF1bWwgICAiJiMyMjg7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFyaW5nICAiJiMyMjk7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIHJpbmcgYWJvdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxldHRlciBhIHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBhZWxpZyAgIiYjMjMwOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGFlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsaWdhdHVyZSBhZSwgVSswMEU2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBjY2VkaWwgIiYjMjMxOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGMgd2l0aCBjZWRpbGxhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFNyBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWdyYXZlICImIzIzMjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlYWN1dGUgIiYjMjMzOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVjaXJjICAiJiMyMzQ7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBldW1sICAgIiYjMjM1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpZ3JhdmUgIiYjMjM2OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGlhY3V0ZSAiJiMyMzc7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWNpcmMgICImIzIzODsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGl1bWwgICAiJiMyMzk7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGV0aCAgICAiJiMyNDA7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZXRoLCBVKzAwRjAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG50aWxkZSAiJiMyNDE7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbiB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2dyYXZlICImIzI0MjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEYyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvYWN1dGUgIiYjMjQzOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9jaXJjICAiJiMyNDQ7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBvdGlsZGUgIiYjMjQ1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG91bWwgICAiJiMyNDY7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGRpdmlkZSAiJiMyNDc7Ij4gPCEtLSBkaXZpc2lvbiBzaWduLCBVKzAwRjcgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3NsYXNoICImIzI0ODsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggc3Ryb2tlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGV0dGVyIG8gc2xhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY4IElTT2xhdDEgLS0+Ci08IUVOVElUWSB1Z3JhdmUgIiYjMjQ5OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVhY3V0ZSAiJiMyNTA7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWNpcmMgICImIzI1MTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHV1bWwgICAiJiMyNTI7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHlhY3V0ZSAiJiMyNTM7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgeSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgdGhvcm4gICImIzI1NDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB0aG9ybiB3aXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgeXVtbCAgICImIzI1NTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB5IHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGRiBJU09sYXQxIC0tPgotCi0KLTwhRU5USVRZICUgeGh0bWwtc3ltYm9sCi0gICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgICAgInhodG1sLXN5bWJvbC5lbnQiID4KLTwhLS0gTWF0aGVtYXRpY2FsLCBHcmVlayBhbmQgU3ltYm9saWMgY2hhcmFjdGVycyBmb3IgSFRNTCAtLT4KLQotPCEtLSBDaGFyYWN0ZXIgZW50aXR5IHNldC4gVHlwaWNhbCBpbnZvY2F0aW9uOgotICAgICA8IUVOVElUWSAlIEhUTUxzeW1ib2wgUFVCTElDCi0gICAgICAgICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwtc3ltYm9sLmVudCI+Ci0gICAgICVIVE1Mc3ltYm9sOwotLS0+Ci0KLTwhLS0gUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NjoKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoCi0gICAgIGNvbmZvcm1pbmcgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbgotICAgICBJU08gODg3OSwgcHJvdmlkZWQgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLS0tPgotCi08IS0tIFJlbGV2YW50IElTTyBlbnRpdHkgc2V0IGlzIGdpdmVuIHVubGVzcyBuYW1lcyBhcmUgbmV3bHkgaW50cm9kdWNlZC4KLSAgICAgTmV3IG5hbWVzIChpLmUuLCBub3QgaW4gSVNPIDg4NzkgbGlzdCkgZG8gbm90IGNsYXNoIHdpdGggYW55Ci0gICAgIGV4aXN0aW5nIElTTyA4ODc5IGVudGl0eSBuYW1lcy4gSVNPIDEwNjQ2IGNoYXJhY3RlciBudW1iZXJzCi0gICAgIGFyZSBnaXZlbiBmb3IgZWFjaCBjaGFyYWN0ZXIsIGluIGhleC4gdmFsdWVzIGFyZSBkZWNpbWFsCi0gICAgIGNvbnZlcnNpb25zIG9mIHRoZSBJU08gMTA2NDYgdmFsdWVzIGFuZCByZWZlciB0byB0aGUgZG9jdW1lbnQKLSAgICAgY2hhcmFjdGVyIHNldC4gTmFtZXMgYXJlIFVuaWNvZGUgbmFtZXMuIAotLS0+Ci0KLTwhLS0gTGF0aW4gRXh0ZW5kZWQtQiAtLT4KLTwhRU5USVRZIGZub2YgICAgICImIzQwMjsiPiA8IS0tIGxhdGluIHNtYWxsIGYgd2l0aCBob29rID0gZnVuY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmxvcmluLCBVKzAxOTIgSVNPdGVjaCAtLT4KLQotPCEtLSBHcmVlayAtLT4KLTwhRU5USVRZIEFscGhhICAgICImIzkxMzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGFscGhhLCBVKzAzOTEgLS0+Ci08IUVOVElUWSBCZXRhICAgICAiJiM5MTQ7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBiZXRhLCBVKzAzOTIgLS0+Ci08IUVOVElUWSBHYW1tYSAgICAiJiM5MTU7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBnYW1tYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5MyBJU09ncmszIC0tPgotPCFFTlRJVFkgRGVsdGEgICAgIiYjOTE2OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOTQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIEVwc2lsb24gICImIzkxNzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGVwc2lsb24sIFUrMDM5NSAtLT4KLTwhRU5USVRZIFpldGEgICAgICImIzkxODsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHpldGEsIFUrMDM5NiAtLT4KLTwhRU5USVRZIEV0YSAgICAgICImIzkxOTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGV0YSwgVSswMzk3IC0tPgotPCFFTlRJVFkgVGhldGEgICAgIiYjOTIwOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGhldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOTggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIElvdGEgICAgICImIzkyMTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGlvdGEsIFUrMDM5OSAtLT4KLTwhRU5USVRZIEthcHBhICAgICImIzkyMjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGthcHBhLCBVKzAzOUEgLS0+Ci08IUVOVElUWSBMYW1iZGEgICAiJiM5MjM7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBsYW1iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOUIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE11ICAgICAgICImIzkyNDsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG11LCBVKzAzOUMgLS0+Ci08IUVOVElUWSBOdSAgICAgICAiJiM5MjU7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBudSwgVSswMzlEIC0tPgotPCFFTlRJVFkgWGkgICAgICAgIiYjOTI2OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgeGksIFUrMDM5RSBJU09ncmszIC0tPgotPCFFTlRJVFkgT21pY3JvbiAgIiYjOTI3OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgb21pY3JvbiwgVSswMzlGIC0tPgotPCFFTlRJVFkgUGkgICAgICAgIiYjOTI4OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGksIFUrMDNBMCBJU09ncmszIC0tPgotPCFFTlRJVFkgUmhvICAgICAgIiYjOTI5OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcmhvLCBVKzAzQTEgLS0+Ci08IS0tIHRoZXJlIGlzIG5vIFNpZ21hZiwgYW5kIG5vIFUrMDNBMiBjaGFyYWN0ZXIgZWl0aGVyIC0tPgotPCFFTlRJVFkgU2lnbWEgICAgIiYjOTMxOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgc2lnbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFRhdSAgICAgICImIzkzMjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHRhdSwgVSswM0E0IC0tPgotPCFFTlRJVFkgVXBzaWxvbiAgIiYjOTMzOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBNSBJU09ncmszIC0tPgotPCFFTlRJVFkgUGhpICAgICAgIiYjOTM0OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGhpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E2IElTT2dyazMgLS0+Ci08IUVOVElUWSBDaGkgICAgICAiJiM5MzU7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBjaGksIFUrMDNBNyAtLT4KLTwhRU5USVRZIFBzaSAgICAgICImIzkzNjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBzaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBOCBJU09ncmszIC0tPgotPCFFTlRJVFkgT21lZ2EgICAgIiYjOTM3OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgb21lZ2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTkgSVNPZ3JrMyAtLT4KLQotPCFFTlRJVFkgYWxwaGEgICAgIiYjOTQ1OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGFscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0IxIElTT2dyazMgLS0+Ci08IUVOVElUWSBiZXRhICAgICAiJiM5NDY7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgYmV0YSwgVSswM0IyIElTT2dyazMgLS0+Ci08IUVOVElUWSBnYW1tYSAgICAiJiM5NDc7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZ2FtbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGRlbHRhICAgICImIzk0ODsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBkZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCNCBJU09ncmszIC0tPgotPCFFTlRJVFkgZXBzaWxvbiAgIiYjOTQ5OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGVwc2lsb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHpldGEgICAgICImIzk1MDsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB6ZXRhLCBVKzAzQjYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGV0YSAgICAgICImIzk1MTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBldGEsIFUrMDNCNyBJU09ncmszIC0tPgotPCFFTlRJVFkgdGhldGEgICAgIiYjOTUyOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRoZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0I4IElTT2dyazMgLS0+Ci08IUVOVElUWSBpb3RhICAgICAiJiM5NTM7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgaW90YSwgVSswM0I5IElTT2dyazMgLS0+Ci08IUVOVElUWSBrYXBwYSAgICAiJiM5NTQ7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIga2FwcGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQkEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGxhbWJkYSAgICImIzk1NTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBsYW1iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQkIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG11ICAgICAgICImIzk1NjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBtdSwgVSswM0JDIElTT2dyazMgLS0+Ci08IUVOVElUWSBudSAgICAgICAiJiM5NTc7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgbnUsIFUrMDNCRCBJU09ncmszIC0tPgotPCFFTlRJVFkgeGkgICAgICAgIiYjOTU4OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHhpLCBVKzAzQkUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG9taWNyb24gICImIzk1OTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBvbWljcm9uLCBVKzAzQkYgTkVXIC0tPgotPCFFTlRJVFkgcGkgICAgICAgIiYjOTYwOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBpLCBVKzAzQzAgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHJobyAgICAgICImIzk2MTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciByaG8sIFUrMDNDMSBJU09ncmszIC0tPgotPCFFTlRJVFkgc2lnbWFmICAgIiYjOTYyOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGZpbmFsIHNpZ21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0MyIElTT2dyazMgLS0+Ci08IUVOVElUWSBzaWdtYSAgICAiJiM5NjM7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgc2lnbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHRhdSAgICAgICImIzk2NDsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB0YXUsIFUrMDNDNCBJU09ncmszIC0tPgotPCFFTlRJVFkgdXBzaWxvbiAgIiYjOTY1OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHVwc2lsb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHBoaSAgICAgICImIzk2NjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBwaGksIFUrMDNDNiBJU09ncmszIC0tPgotPCFFTlRJVFkgY2hpICAgICAgIiYjOTY3OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGNoaSwgVSswM0M3IElTT2dyazMgLS0+Ci08IUVOVElUWSBwc2kgICAgICAiJiM5Njg7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcHNpLCBVKzAzQzggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG9tZWdhICAgICImIzk2OTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBvbWVnYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDOSBJU09ncmszIC0tPgotPCFFTlRJVFkgdGhldGFzeW0gIiYjOTc3OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRoZXRhIHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNEMSBORVcgLS0+Ci08IUVOVElUWSB1cHNpaCAgICAiJiM5Nzg7Ij4gPCEtLSBncmVlayB1cHNpbG9uIHdpdGggaG9vayBzeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzRDIgTkVXIC0tPgotPCFFTlRJVFkgcGl2ICAgICAgIiYjOTgyOyI+IDwhLS0gZ3JlZWsgcGkgc3ltYm9sLCBVKzAzRDYgSVNPZ3JrMyAtLT4KLQotPCEtLSBHZW5lcmFsIFB1bmN0dWF0aW9uIC0tPgotPCFFTlRJVFkgYnVsbCAgICAgIiYjODIyNjsiPiA8IS0tIGJ1bGxldCA9IGJsYWNrIHNtYWxsIGNpcmNsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMjIgSVNPcHViICAtLT4KLTwhLS0gYnVsbGV0IGlzIE5PVCB0aGUgc2FtZSBhcyBidWxsZXQgb3BlcmF0b3IsIFUrMjIxOSAtLT4KLTwhRU5USVRZIGhlbGxpcCAgICImIzgyMzA7Ij4gPCEtLSBob3Jpem9udGFsIGVsbGlwc2lzID0gdGhyZWUgZG90IGxlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMjYgSVNPcHViICAtLT4KLTwhRU5USVRZIHByaW1lICAgICImIzgyNDI7Ij4gPCEtLSBwcmltZSA9IG1pbnV0ZXMgPSBmZWV0LCBVKzIwMzIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIFByaW1lICAgICImIzgyNDM7Ij4gPCEtLSBkb3VibGUgcHJpbWUgPSBzZWNvbmRzID0gaW5jaGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzMyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb2xpbmUgICAgIiYjODI1NDsiPiA8IS0tIG92ZXJsaW5lID0gc3BhY2luZyBvdmVyc2NvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDNFIE5FVyAtLT4KLTwhRU5USVRZIGZyYXNsICAgICImIzgyNjA7Ij4gPCEtLSBmcmFjdGlvbiBzbGFzaCwgVSsyMDQ0IE5FVyAtLT4KLQotPCEtLSBMZXR0ZXJsaWtlIFN5bWJvbHMgLS0+Ci08IUVOVElUWSB3ZWllcnAgICAiJiM4NDcyOyI+IDwhLS0gc2NyaXB0IGNhcGl0YWwgUCA9IHBvd2VyIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gV2VpZXJzdHJhc3MgcCwgVSsyMTE4IElTT2Ftc28gLS0+Ci08IUVOVElUWSBpbWFnZSAgICAiJiM4NDY1OyI+IDwhLS0gYmxhY2tsZXR0ZXIgY2FwaXRhbCBJID0gaW1hZ2luYXJ5IHBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMTExIElTT2Ftc28gLS0+Ci08IUVOVElUWSByZWFsICAgICAiJiM4NDc2OyI+IDwhLS0gYmxhY2tsZXR0ZXIgY2FwaXRhbCBSID0gcmVhbCBwYXJ0IHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxMUMgSVNPYW1zbyAtLT4KLTwhRU5USVRZIHRyYWRlICAgICImIzg0ODI7Ij4gPCEtLSB0cmFkZSBtYXJrIHNpZ24sIFUrMjEyMiBJU09udW0gLS0+Ci08IUVOVElUWSBhbGVmc3ltICAiJiM4NTAxOyI+IDwhLS0gYWxlZiBzeW1ib2wgPSBmaXJzdCB0cmFuc2Zpbml0ZSBjYXJkaW5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxMzUgTkVXIC0tPgotPCEtLSBhbGVmIHN5bWJvbCBpcyBOT1QgdGhlIHNhbWUgYXMgaGVicmV3IGxldHRlciBhbGVmLAotICAgICBVKzA1RDAgYWx0aG91Z2ggdGhlIHNhbWUgZ2x5cGggY291bGQgYmUgdXNlZCB0byBkZXBpY3QgYm90aCBjaGFyYWN0ZXJzIC0tPgotCi08IS0tIEFycm93cyAtLT4KLTwhRU5USVRZIGxhcnIgICAgICImIzg1OTI7Ij4gPCEtLSBsZWZ0d2FyZHMgYXJyb3csIFUrMjE5MCBJU09udW0gLS0+Ci08IUVOVElUWSB1YXJyICAgICAiJiM4NTkzOyI+IDwhLS0gdXB3YXJkcyBhcnJvdywgVSsyMTkxIElTT251bS0tPgotPCFFTlRJVFkgcmFyciAgICAgIiYjODU5NDsiPiA8IS0tIHJpZ2h0d2FyZHMgYXJyb3csIFUrMjE5MiBJU09udW0gLS0+Ci08IUVOVElUWSBkYXJyICAgICAiJiM4NTk1OyI+IDwhLS0gZG93bndhcmRzIGFycm93LCBVKzIxOTMgSVNPbnVtIC0tPgotPCFFTlRJVFkgaGFyciAgICAgIiYjODU5NjsiPiA8IS0tIGxlZnQgcmlnaHQgYXJyb3csIFUrMjE5NCBJU09hbXNhIC0tPgotPCFFTlRJVFkgY3JhcnIgICAgIiYjODYyOTsiPiA8IS0tIGRvd253YXJkcyBhcnJvdyB3aXRoIGNvcm5lciBsZWZ0d2FyZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGNhcnJpYWdlIHJldHVybiwgVSsyMUI1IE5FVyAtLT4KLTwhRU5USVRZIGxBcnIgICAgICImIzg2NTY7Ij4gPCEtLSBsZWZ0d2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDAgSVNPdGVjaCAtLT4KLTwhLS0gVW5pY29kZSBkb2VzIG5vdCBzYXkgdGhhdCBsQXJyIGlzIHRoZSBzYW1lIGFzIHRoZSAnaXMgaW1wbGllZCBieScgYXJyb3cKLSAgICBidXQgYWxzbyBkb2VzIG5vdCBoYXZlIGFueSBvdGhlciBjaGFyYWN0ZXIgZm9yIHRoYXQgZnVuY3Rpb24uIFNvID8gbEFyciBjYW4KLSAgICBiZSB1c2VkIGZvciAnaXMgaW1wbGllZCBieScgYXMgSVNPdGVjaCBzdWdnZXN0cyAtLT4KLTwhRU5USVRZIHVBcnIgICAgICImIzg2NTc7Ij4gPCEtLSB1cHdhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQxIElTT2Ftc2EgLS0+Ci08IUVOVElUWSByQXJyICAgICAiJiM4NjU4OyI+IDwhLS0gcmlnaHR3YXJkcyBkb3VibGUgYXJyb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMUQyIElTT3RlY2ggLS0+Ci08IS0tIFVuaWNvZGUgZG9lcyBub3Qgc2F5IHRoaXMgaXMgdGhlICdpbXBsaWVzJyBjaGFyYWN0ZXIgYnV0IGRvZXMgbm90IGhhdmUgCi0gICAgIGFub3RoZXIgY2hhcmFjdGVyIHdpdGggdGhpcyBmdW5jdGlvbiBzbyA/Ci0gICAgIHJBcnIgY2FuIGJlIHVzZWQgZm9yICdpbXBsaWVzJyBhcyBJU090ZWNoIHN1Z2dlc3RzIC0tPgotPCFFTlRJVFkgZEFyciAgICAgIiYjODY1OTsiPiA8IS0tIGRvd253YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMyBJU09hbXNhIC0tPgotPCFFTlRJVFkgaEFyciAgICAgIiYjODY2MDsiPiA8IS0tIGxlZnQgcmlnaHQgZG91YmxlIGFycm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjFENCBJU09hbXNhIC0tPgotCi08IS0tIE1hdGhlbWF0aWNhbCBPcGVyYXRvcnMgLS0+Ci08IUVOVElUWSBmb3JhbGwgICAiJiM4NzA0OyI+IDwhLS0gZm9yIGFsbCwgVSsyMjAwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBwYXJ0ICAgICAiJiM4NzA2OyI+IDwhLS0gcGFydGlhbCBkaWZmZXJlbnRpYWwsIFUrMjIwMiBJU090ZWNoICAtLT4KLTwhRU5USVRZIGV4aXN0ICAgICImIzg3MDc7Ij4gPCEtLSB0aGVyZSBleGlzdHMsIFUrMjIwMyBJU090ZWNoIC0tPgotPCFFTlRJVFkgZW1wdHkgICAgIiYjODcwOTsiPiA8IS0tIGVtcHR5IHNldCA9IG51bGwgc2V0ID0gZGlhbWV0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjA1IElTT2Ftc28gLS0+Ci08IUVOVElUWSBuYWJsYSAgICAiJiM4NzExOyI+IDwhLS0gbmFibGEgPSBiYWNrd2FyZCBkaWZmZXJlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIwNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgaXNpbiAgICAgIiYjODcxMjsiPiA8IS0tIGVsZW1lbnQgb2YsIFUrMjIwOCBJU090ZWNoIC0tPgotPCFFTlRJVFkgbm90aW4gICAgIiYjODcxMzsiPiA8IS0tIG5vdCBhbiBlbGVtZW50IG9mLCBVKzIyMDkgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG5pICAgICAgICImIzg3MTU7Ij4gPCEtLSBjb250YWlucyBhcyBtZW1iZXIsIFUrMjIwQiBJU090ZWNoIC0tPgotPCEtLSBzaG91bGQgdGhlcmUgYmUgYSBtb3JlIG1lbW9yYWJsZSBuYW1lIHRoYW4gJ25pJz8gLS0+Ci08IUVOVElUWSBwcm9kICAgICAiJiM4NzE5OyI+IDwhLS0gbi1hcnkgcHJvZHVjdCA9IHByb2R1Y3Qgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMEYgSVNPYW1zYiAtLT4KLTwhLS0gcHJvZCBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDNBMCAnZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGknIHRob3VnaAotICAgICB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIGZvciBib3RoIC0tPgotPCFFTlRJVFkgc3VtICAgICAgIiYjODcyMTsiPiA8IS0tIG4tYXJ5IHN1bWF0aW9uLCBVKzIyMTEgSVNPYW1zYiAtLT4KLTwhLS0gc3VtIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswM0EzICdncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYScKLSAgICAgdGhvdWdoIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgZm9yIGJvdGggLS0+Ci08IUVOVElUWSBtaW51cyAgICAiJiM4NzIyOyI+IDwhLS0gbWludXMgc2lnbiwgVSsyMjEyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsb3dhc3QgICAiJiM4NzI3OyI+IDwhLS0gYXN0ZXJpc2sgb3BlcmF0b3IsIFUrMjIxNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgcmFkaWMgICAgIiYjODczMDsiPiA8IS0tIHNxdWFyZSByb290ID0gcmFkaWNhbCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIxQSBJU090ZWNoIC0tPgotPCFFTlRJVFkgcHJvcCAgICAgIiYjODczMzsiPiA8IS0tIHByb3BvcnRpb25hbCB0bywgVSsyMjFEIElTT3RlY2ggLS0+Ci08IUVOVElUWSBpbmZpbiAgICAiJiM4NzM0OyI+IDwhLS0gaW5maW5pdHksIFUrMjIxRSBJU090ZWNoIC0tPgotPCFFTlRJVFkgYW5nICAgICAgIiYjODczNjsiPiA8IS0tIGFuZ2xlLCBVKzIyMjAgSVNPYW1zbyAtLT4KLTwhRU5USVRZIGFuZCAgICAgICImIzg3NDM7Ij4gPCEtLSBsb2dpY2FsIGFuZCA9IHdlZGdlLCBVKzIyMjcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9yICAgICAgICImIzg3NDQ7Ij4gPCEtLSBsb2dpY2FsIG9yID0gdmVlLCBVKzIyMjggSVNPdGVjaCAtLT4KLTwhRU5USVRZIGNhcCAgICAgICImIzg3NDU7Ij4gPCEtLSBpbnRlcnNlY3Rpb24gPSBjYXAsIFUrMjIyOSBJU090ZWNoIC0tPgotPCFFTlRJVFkgY3VwICAgICAgIiYjODc0NjsiPiA8IS0tIHVuaW9uID0gY3VwLCBVKzIyMkEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGludCAgICAgICImIzg3NDc7Ij4gPCEtLSBpbnRlZ3JhbCwgVSsyMjJCIElTT3RlY2ggLS0+Ci08IUVOVElUWSB0aGVyZTQgICAiJiM4NzU2OyI+IDwhLS0gdGhlcmVmb3JlLCBVKzIyMzQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHNpbSAgICAgICImIzg3NjQ7Ij4gPCEtLSB0aWxkZSBvcGVyYXRvciA9IHZhcmllcyB3aXRoID0gc2ltaWxhciB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyM0MgSVNPdGVjaCAtLT4KLTwhLS0gdGlsZGUgb3BlcmF0b3IgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyB0aGUgdGlsZGUsIFUrMDA3RSwKLSAgICAgYWx0aG91Z2ggdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCB0byByZXByZXNlbnQgYm90aCAgLS0+Ci08IUVOVElUWSBjb25nICAgICAiJiM4NzczOyI+IDwhLS0gYXBwcm94aW1hdGVseSBlcXVhbCB0bywgVSsyMjQ1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBhc3ltcCAgICAiJiM4Nzc2OyI+IDwhLS0gYWxtb3N0IGVxdWFsIHRvID0gYXN5bXB0b3RpYyB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyNDggSVNPYW1zciAtLT4KLTwhRU5USVRZIG5lICAgICAgICImIzg4MDA7Ij4gPCEtLSBub3QgZXF1YWwgdG8sIFUrMjI2MCBJU090ZWNoIC0tPgotPCFFTlRJVFkgZXF1aXYgICAgIiYjODgwMTsiPiA8IS0tIGlkZW50aWNhbCB0bywgVSsyMjYxIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsZSAgICAgICAiJiM4ODA0OyI+IDwhLS0gbGVzcy10aGFuIG9yIGVxdWFsIHRvLCBVKzIyNjQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGdlICAgICAgICImIzg4MDU7Ij4gPCEtLSBncmVhdGVyLXRoYW4gb3IgZXF1YWwgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjY1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdWIgICAgICAiJiM4ODM0OyI+IDwhLS0gc3Vic2V0IG9mLCBVKzIyODIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1cCAgICAgICImIzg4MzU7Ij4gPCEtLSBzdXBlcnNldCBvZiwgVSsyMjgzIElTT3RlY2ggLS0+Ci08IS0tIG5vdGUgdGhhdCBuc3VwLCAnbm90IGEgc3VwZXJzZXQgb2YsIFUrMjI4MycgaXMgbm90IGNvdmVyZWQgYnkgdGhlIFN5bWJvbCAKLSAgICAgZm9udCBlbmNvZGluZyBhbmQgaXMgbm90IGluY2x1ZGVkLiBTaG91bGQgaXQgYmUsIGZvciBzeW1tZXRyeT8KLSAgICAgSXQgaXMgaW4gSVNPYW1zbiAgLS0+IAotPCFFTlRJVFkgbnN1YiAgICAgIiYjODgzNjsiPiA8IS0tIG5vdCBhIHN1YnNldCBvZiwgVSsyMjg0IElTT2Ftc24gLS0+Ci08IUVOVElUWSBzdWJlICAgICAiJiM4ODM4OyI+IDwhLS0gc3Vic2V0IG9mIG9yIGVxdWFsIHRvLCBVKzIyODYgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1cGUgICAgICImIzg4Mzk7Ij4gPCEtLSBzdXBlcnNldCBvZiBvciBlcXVhbCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyODcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9wbHVzICAgICImIzg4NTM7Ij4gPCEtLSBjaXJjbGVkIHBsdXMgPSBkaXJlY3Qgc3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI5NSBJU09hbXNiIC0tPgotPCFFTlRJVFkgb3RpbWVzICAgIiYjODg1NTsiPiA8IS0tIGNpcmNsZWQgdGltZXMgPSB2ZWN0b3IgcHJvZHVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyOTcgSVNPYW1zYiAtLT4KLTwhRU5USVRZIHBlcnAgICAgICImIzg4Njk7Ij4gPCEtLSB1cCB0YWNrID0gb3J0aG9nb25hbCB0byA9IHBlcnBlbmRpY3VsYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMkE1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzZG90ICAgICAiJiM4OTAxOyI+IDwhLS0gZG90IG9wZXJhdG9yLCBVKzIyQzUgSVNPYW1zYiAtLT4KLTwhLS0gZG90IG9wZXJhdG9yIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMEI3IG1pZGRsZSBkb3QgLS0+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBUZWNobmljYWwgLS0+Ci08IUVOVElUWSBsY2VpbCAgICAiJiM4OTY4OyI+IDwhLS0gbGVmdCBjZWlsaW5nID0gYXBsIHVwc3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzA4IElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgcmNlaWwgICAgIiYjODk2OTsiPiA8IS0tIHJpZ2h0IGNlaWxpbmcsIFUrMjMwOSBJU09hbXNjICAtLT4KLTwhRU5USVRZIGxmbG9vciAgICImIzg5NzA7Ij4gPCEtLSBsZWZ0IGZsb29yID0gYXBsIGRvd25zdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMEEgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSByZmxvb3IgICAiJiM4OTcxOyI+IDwhLS0gcmlnaHQgZmxvb3IsIFUrMjMwQiBJU09hbXNjICAtLT4KLTwhRU5USVRZIGxhbmcgICAgICImIzkwMDE7Ij4gPCEtLSBsZWZ0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQgPSBicmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzI5IElTT3RlY2ggLS0+Ci08IS0tIGxhbmcgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwM0MgJ2xlc3MgdGhhbicgCi0gICAgIG9yIFUrMjAzOSAnc2luZ2xlIGxlZnQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmsnIC0tPgotPCFFTlRJVFkgcmFuZyAgICAgIiYjOTAwMjsiPiA8IS0tIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQgPSBrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzJBIElTT3RlY2ggLS0+Ci08IS0tIHJhbmcgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwM0UgJ2dyZWF0ZXIgdGhhbicgCi0gICAgIG9yIFUrMjAzQSAnc2luZ2xlIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrJyAtLT4KLQotPCEtLSBHZW9tZXRyaWMgU2hhcGVzIC0tPgotPCFFTlRJVFkgbG96ICAgICAgIiYjOTY3NDsiPiA8IS0tIGxvemVuZ2UsIFUrMjVDQSBJU09wdWIgLS0+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBTeW1ib2xzIC0tPgotPCFFTlRJVFkgc3BhZGVzICAgIiYjOTgyNDsiPiA8IS0tIGJsYWNrIHNwYWRlIHN1aXQsIFUrMjY2MCBJU09wdWIgLS0+Ci08IS0tIGJsYWNrIGhlcmUgc2VlbXMgdG8gbWVhbiBmaWxsZWQgYXMgb3Bwb3NlZCB0byBob2xsb3cgLS0+Ci08IUVOVElUWSBjbHVicyAgICAiJiM5ODI3OyI+IDwhLS0gYmxhY2sgY2x1YiBzdWl0ID0gc2hhbXJvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyNjYzIElTT3B1YiAtLT4KLTwhRU5USVRZIGhlYXJ0cyAgICImIzk4Mjk7Ij4gPCEtLSBibGFjayBoZWFydCBzdWl0ID0gdmFsZW50aW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjY2NSBJU09wdWIgLS0+Ci08IUVOVElUWSBkaWFtcyAgICAiJiM5ODMwOyI+IDwhLS0gYmxhY2sgZGlhbW9uZCBzdWl0LCBVKzI2NjYgSVNPcHViIC0tPgotCi0KLTwhRU5USVRZICUgeGh0bWwtc3BlY2lhbAotICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBTcGVjaWFsIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICAgICJ4aHRtbC1zcGVjaWFsLmVudCIgPgotPCEtLSBTcGVjaWFsIGNoYXJhY3RlcnMgZm9yIEhUTUwgLS0+Ci0KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICAgPCFFTlRJVFkgJSBIVE1Mc3BlY2lhbCBQVUJMSUMKLSAgICAgICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbCBmb3IgWEhUTUwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1zcGVjaWFsLmVudCI+Ci0gICAgICVIVE1Mc3BlY2lhbDsKLS0tPgotCi08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLQotPCEtLSBSZWxldmFudCBJU08gZW50aXR5IHNldCBpcyBnaXZlbiB1bmxlc3MgbmFtZXMgYXJlIG5ld2x5IGludHJvZHVjZWQuCi0gICAgIE5ldyBuYW1lcyAoaS5lLiwgbm90IGluIElTTyA4ODc5IGxpc3QpIGRvIG5vdCBjbGFzaCB3aXRoIGFueQotICAgICBleGlzdGluZyBJU08gODg3OSBlbnRpdHkgbmFtZXMuIElTTyAxMDY0NiBjaGFyYWN0ZXIgbnVtYmVycwotICAgICBhcmUgZ2l2ZW4gZm9yIGVhY2ggY2hhcmFjdGVyLCBpbiBoZXguIHZhbHVlcyBhcmUgZGVjaW1hbAotICAgICBjb252ZXJzaW9ucyBvZiB0aGUgSVNPIDEwNjQ2IHZhbHVlcyBhbmQgcmVmZXIgdG8gdGhlIGRvY3VtZW50Ci0gICAgIGNoYXJhY3RlciBzZXQuIE5hbWVzIGFyZSBVbmljb2RlIG5hbWVzLiAKLS0tPgotCi08IS0tIEMwIENvbnRyb2xzIGFuZCBCYXNpYyBMYXRpbiAtLT4KLTwhRU5USVRZIHF1b3QgICAgIiYjMzQ7Ij4gPCEtLSAgcXVvdGF0aW9uIG1hcmsgPSBBUEwgcXVvdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwMjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgYW1wICAgICAiJiMzODsjMzg7Ij4gPCEtLSAgYW1wZXJzYW5kLCBVKzAwMjYgSVNPbnVtIC0tPgotPCFFTlRJVFkgbHQgICAgICAiJiMzODsjNjA7Ij4gPCEtLSAgbGVzcy10aGFuIHNpZ24sIFUrMDAzQyBJU09udW0gLS0+Ci08IUVOVElUWSBndCAgICAgICImIzYyOyI+IDwhLS0gIGdyZWF0ZXItdGhhbiBzaWduLCBVKzAwM0UgSVNPbnVtIC0tPgotPCFFTlRJVFkgYXBvcwkgIiYjMzk7Ij4gPCEtLSAgYXBvc3Ryb3BoZSBtYXJrLCBVKzAwMjcgSVNPbnVtIC0tPgotCi08IS0tIExhdGluIEV4dGVuZGVkLUEgLS0+Ci08IUVOVElUWSBPRWxpZyAgICImIzMzODsiPiA8IS0tICBsYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIE9FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTUyIElTT2xhdDIgLS0+Ci08IUVOVElUWSBvZWxpZyAgICImIzMzOTsiPiA8IS0tICBsYXRpbiBzbWFsbCBsaWdhdHVyZSBvZSwgVSswMTUzIElTT2xhdDIgLS0+Ci08IS0tIGxpZ2F0dXJlIGlzIGEgbWlzbm9tZXIsIHRoaXMgaXMgYSBzZXBhcmF0ZSBjaGFyYWN0ZXIgaW4gc29tZSBsYW5ndWFnZXMgLS0+Ci08IUVOVElUWSBTY2Fyb24gICImIzM1MjsiPiA8IS0tICBsYXRpbiBjYXBpdGFsIGxldHRlciBTIHdpdGggY2Fyb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNjAgSVNPbGF0MiAtLT4KLTwhRU5USVRZIHNjYXJvbiAgIiYjMzUzOyI+IDwhLS0gIGxhdGluIHNtYWxsIGxldHRlciBzIHdpdGggY2Fyb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNjEgSVNPbGF0MiAtLT4KLTwhRU5USVRZIFl1bWwgICAgIiYjMzc2OyI+IDwhLS0gIGxhdGluIGNhcGl0YWwgbGV0dGVyIFkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNzggSVNPbGF0MiAtLT4KLQotPCEtLSBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMgLS0+Ci08IUVOVElUWSBjaXJjICAgICImIzcxMDsiPiA8IS0tICBtb2RpZmllciBsZXR0ZXIgY2lyY3VtZmxleCBhY2NlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAyQzYgSVNPcHViIC0tPgotPCFFTlRJVFkgdGlsZGUgICAiJiM3MzI7Ij4gPCEtLSAgc21hbGwgdGlsZGUsIFUrMDJEQyBJU09kaWEgLS0+Ci0KLTwhLS0gR2VuZXJhbCBQdW5jdHVhdGlvbiAtLT4KLTwhRU5USVRZIGVuc3AgICAgIiYjODE5NDsiPiA8IS0tIGVuIHNwYWNlLCBVKzIwMDIgSVNPcHViIC0tPgotPCFFTlRJVFkgZW1zcCAgICAiJiM4MTk1OyI+IDwhLS0gZW0gc3BhY2UsIFUrMjAwMyBJU09wdWIgLS0+Ci08IUVOVElUWSB0aGluc3AgICImIzgyMDE7Ij4gPCEtLSB0aGluIHNwYWNlLCBVKzIwMDkgSVNPcHViIC0tPgotPCFFTlRJVFkgenduaiAgICAiJiM4MjA0OyI+IDwhLS0gemVybyB3aWR0aCBub24tam9pbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDBDIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIHp3aiAgICAgIiYjODIwNTsiPiA8IS0tIHplcm8gd2lkdGggam9pbmVyLCBVKzIwMEQgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbHJtICAgICAiJiM4MjA2OyI+IDwhLS0gbGVmdC10by1yaWdodCBtYXJrLCBVKzIwMEUgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgcmxtICAgICAiJiM4MjA3OyI+IDwhLS0gcmlnaHQtdG8tbGVmdCBtYXJrLCBVKzIwMEYgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbmRhc2ggICAiJiM4MjExOyI+IDwhLS0gZW4gZGFzaCwgVSsyMDEzIElTT3B1YiAtLT4KLTwhRU5USVRZIG1kYXNoICAgIiYjODIxMjsiPiA8IS0tIGVtIGRhc2gsIFUrMjAxNCBJU09wdWIgLS0+Ci08IUVOVElUWSBsc3F1byAgICImIzgyMTY7Ij4gPCEtLSBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxOCBJU09udW0gLS0+Ci08IUVOVElUWSByc3F1byAgICImIzgyMTc7Ij4gPCEtLSByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMTkgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2JxdW8gICAiJiM4MjE4OyI+IDwhLS0gc2luZ2xlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUEgTkVXIC0tPgotPCFFTlRJVFkgbGRxdW8gICAiJiM4MjIwOyI+IDwhLS0gbGVmdCBkb3VibGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMUMgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmRxdW8gICAiJiM4MjIxOyI+IDwhLS0gcmlnaHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDFEIElTT251bSAtLT4KLTwhRU5USVRZIGJkcXVvICAgIiYjODIyMjsiPiA8IS0tIGRvdWJsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFFIE5FVyAtLT4KLTwhRU5USVRZIGRhZ2dlciAgIiYjODIyNDsiPiA8IS0tIGRhZ2dlciwgVSsyMDIwIElTT3B1YiAtLT4KLTwhRU5USVRZIERhZ2dlciAgIiYjODIyNTsiPiA8IS0tIGRvdWJsZSBkYWdnZXIsIFUrMjAyMSBJU09wdWIgLS0+Ci08IUVOVElUWSBwZXJtaWwgICImIzgyNDA7Ij4gPCEtLSBwZXIgbWlsbGUgc2lnbiwgVSsyMDMwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsc2FxdW8gICImIzgyNDk7Ij4gPCEtLSBzaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzOSBJU08gcHJvcG9zZWQgLS0+Ci08IS0tIGxzYXF1byBpcyBwcm9wb3NlZCBidXQgbm90IHlldCBJU08gc3RhbmRhcmRpemVkIC0tPgotPCFFTlRJVFkgcnNhcXVvICAiJiM4MjUwOyI+IDwhLS0gc2luZ2xlIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDNBIElTTyBwcm9wb3NlZCAtLT4KLTwhLS0gcnNhcXVvIGlzIHByb3Bvc2VkIGJ1dCBub3QgeWV0IElTTyBzdGFuZGFyZGl6ZWQgLS0+Ci08IUVOVElUWSBldXJvICAgIiYjODM2NDsiPiA8IS0tICBldXJvIHNpZ24sIFUrMjBBQyBORVcgLS0+Ci0KLQotPCEtLSBlbmQgb2YgeGh0bWwtY2hhcmVudC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1mcmFtZXdvcmstMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBQb3N0LUZyYW1ld29yayBSZWRlY2xhcmF0aW9uIHBsYWNlaG9sZGVyICAuLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSB0aGlzIHNlcnZlcyBhcyBhIGxvY2F0aW9uIHRvIGluc2VydCBtYXJrdXAgZGVjbGFyYXRpb25zCi0gICAgIGludG8gdGhlIERURCBmb2xsb3dpbmcgdGhlIGZyYW1ld29yayBkZWNsYXJhdGlvbnMuCi0tLT4KLTwhRU5USVRZICUgeGh0bWwtcG9zdGZ3LXJlZGVjbC5tb2R1bGUgIklHTk9SRSIgPgotPCFbJXhodG1sLXBvc3Rmdy1yZWRlY2wubW9kdWxlO1sKLSV4aHRtbC1wb3N0ZnctcmVkZWNsLm1vZDsKLTwhLS0gZW5kIG9mIHhodG1sLXBvc3Rmdy1yZWRlY2wubW9kdWxlIC0tPl1dPgotCi08IS0tIFRleHQgTW9kdWxlIChSZXF1aXJlZCkgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXRleHQubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtdGV4dC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC10ZXh0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgVGV4dCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC10ZXh0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFRleHQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXRleHQtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgVGV4dCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXRleHQtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVGV4dHVhbCBDb250ZW50Ci0KLSAgICAgVGhlIFRleHQgbW9kdWxlIGluY2x1ZGVzIGRlY2xhcmF0aW9ucyBmb3IgYWxsIGNvcmUKLSAgICAgdGV4dCBjb250YWluZXIgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMuCi0tLT4KLQotPCFFTlRJVFkgJSB4aHRtbC1pbmxzdHJ1Y3QubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtaW5sc3RydWN0Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWlubHN0cnVjdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBTdHJ1Y3R1cmFsIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtaW5sc3RydWN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIElubGluZSBTdHJ1Y3R1cmFsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWlubHN0cnVjdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgU3RydWN0dXJhbCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWlubHN0cnVjdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbmxpbmUgU3RydWN0dXJhbAotCi0gICAgICAgIGJyLCBzcGFuCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzCi0gICAgIHVzZWQgdG8gc3VwcG9ydCBpbmxpbmUtbGV2ZWwgc3RydWN0dXJhbCBtYXJrdXAuCi0tLT4KLQotPCEtLSBicjogZm9yY2VkIGxpbmUgYnJlYWsgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgYnIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVici5lbGVtZW50O1sKLQotPCFFTlRJVFkgJSBici5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgYnIucW5hbWUgICJiciIgPgotPCFFTEVNRU5UICVici5xbmFtZTsgICVici5jb250ZW50OyA+Ci0KLTwhLS0gZW5kIG9mIGJyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYnIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVici5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYnIucW5hbWU7Ci0gICAgICAlQ29yZS5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBici5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHNwYW46IGdlbmVyaWMgaW5saW5lIGNvbnRhaW5lciAuLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBzcGFuLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc3Bhbi5lbGVtZW50O1sKLTwhRU5USVRZICUgc3Bhbi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHNwYW4ucW5hbWUgICJzcGFuIiA+Ci08IUVMRU1FTlQgJXNwYW4ucW5hbWU7ICAlc3Bhbi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzcGFuLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3Bhbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXNwYW4uYXR0bGlzdDtbCi08IUFUVExJU1QgJXNwYW4ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHNwYW4uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtaW5sc3RydWN0LTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtaW5scGhyYXMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtaW5scGhyYXMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtaW5scGhyYXMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgUGhyYXNhbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWlubHBocmFzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIElubGluZSBQaHJhc2FsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWlubHBocmFzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBQaHJhc2FsIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW5scGhyYXMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW5saW5lIFBocmFzYWwKLQotICAgICAgICBhYmJyLCBhY3JvbnltLCBjaXRlLCBjb2RlLCBkZm4sIGVtLCBrYmQsIHEsIHNhbXAsIHN0cm9uZywgdmFyCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIHVzZWQgdG8KLSAgICAgc3VwcG9ydCBpbmxpbmUtbGV2ZWwgcGhyYXNhbCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSBhYmJyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYWJici5lbGVtZW50O1sKLTwhRU5USVRZICUgYWJici5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGFiYnIucW5hbWUgICJhYmJyIiA+Ci08IUVMRU1FTlQgJWFiYnIucW5hbWU7ICAlYWJici5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBhYmJyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYWJici5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWFiYnIuYXR0bGlzdDtbCi08IUFUVExJU1QgJWFiYnIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGFiYnIuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhY3JvbnltLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYWNyb255bS5lbGVtZW50O1sKLTwhRU5USVRZICUgYWNyb255bS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGFjcm9ueW0ucW5hbWUgICJhY3JvbnltIiA+Ci08IUVMRU1FTlQgJWFjcm9ueW0ucW5hbWU7ICAlYWNyb255bS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBhY3JvbnltLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYWNyb255bS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWFjcm9ueW0uYXR0bGlzdDtbCi08IUFUVExJU1QgJWFjcm9ueW0ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGFjcm9ueW0uYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjaXRlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslY2l0ZS5lbGVtZW50O1sKLTwhRU5USVRZICUgY2l0ZS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGNpdGUucW5hbWUgICJjaXRlIiA+Ci08IUVMRU1FTlQgJWNpdGUucW5hbWU7ICAlY2l0ZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBjaXRlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgY2l0ZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWNpdGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJWNpdGUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGNpdGUuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjb2RlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslY29kZS5lbGVtZW50O1sKLTwhRU5USVRZICUgY29kZS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGNvZGUucW5hbWUgICJjb2RlIiA+Ci08IUVMRU1FTlQgJWNvZGUucW5hbWU7ICAlY29kZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBjb2RlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgY29kZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWNvZGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJWNvZGUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGNvZGUuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkZm4uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkZm4uZWxlbWVudDtbCi08IUVOVElUWSAlIGRmbi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGRmbi5xbmFtZSAgImRmbiIgPgotPCFFTEVNRU5UICVkZm4ucW5hbWU7ICAlZGZuLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGRmbi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGRmbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRmbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZGZuLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkZm4uYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBlbS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWVtLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBlbS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGVtLnFuYW1lICAiZW0iID4KLTwhRUxFTUVOVCAlZW0ucW5hbWU7ICAlZW0uY29udGVudDsgPgotPCEtLSBlbmQgb2YgZW0uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBlbS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWVtLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVlbS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZW0uYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBrYmQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVrYmQuZWxlbWVudDtbCi08IUVOVElUWSAlIGtiZC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGtiZC5xbmFtZSAgImtiZCIgPgotPCFFTEVNRU5UICVrYmQucW5hbWU7ICAla2JkLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGtiZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGtiZC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWtiZC5hdHRsaXN0O1sKLTwhQVRUTElTVCAla2JkLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBrYmQuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBxLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcS5lbGVtZW50O1sKLTwhRU5USVRZICUgcS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHEucW5hbWUgICJxIiA+Ci08IUVMRU1FTlQgJXEucW5hbWU7ICAlcS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBxLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgcS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXEuYXR0bGlzdDtbCi08IUFUVExJU1QgJXEucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGNpdGUgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHEuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzYW1wLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc2FtcC5lbGVtZW50O1sKLTwhRU5USVRZICUgc2FtcC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHNhbXAucW5hbWUgICJzYW1wIiA+Ci08IUVMRU1FTlQgJXNhbXAucW5hbWU7ICAlc2FtcC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzYW1wLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc2FtcC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXNhbXAuYXR0bGlzdDtbCi08IUFUVExJU1QgJXNhbXAucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHNhbXAuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzdHJvbmcuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzdHJvbmcuZWxlbWVudDtbCi08IUVOVElUWSAlIHN0cm9uZy5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHN0cm9uZy5xbmFtZSAgInN0cm9uZyIgPgotPCFFTEVNRU5UICVzdHJvbmcucW5hbWU7ICAlc3Ryb25nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHN0cm9uZy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHN0cm9uZy5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXN0cm9uZy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc3Ryb25nLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzdHJvbmcuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSB2YXIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV2YXIuZWxlbWVudDtbCi08IUVOVElUWSAlIHZhci5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHZhci5xbmFtZSAgInZhciIgPgotPCFFTEVNRU5UICV2YXIucW5hbWU7ICAldmFyLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHZhci5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHZhci5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXZhci5hdHRsaXN0O1sKLTwhQVRUTElTVCAldmFyLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB2YXIuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtaW5scGhyYXMtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ibGtzdHJ1Y3QubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtYmxrc3RydWN0Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWJsa3N0cnVjdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFN0cnVjdHVyYWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQmxvY2sgU3RydWN0dXJhbCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmxrc3RydWN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFN0cnVjdHVyYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1ibGtzdHJ1Y3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmxvY2sgU3RydWN0dXJhbAotCi0gICAgICAgIGRpdiwgcAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgYmxvY2stbGV2ZWwgc3RydWN0dXJhbCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSBkaXYuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkaXYuZWxlbWVudDtbCi08IUVOVElUWSAlIGRpdi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBkaXYucW5hbWUgICJkaXYiID4KLTwhRUxFTUVOVCAlZGl2LnFuYW1lOyAgJWRpdi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkaXYuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkaXYuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVkaXYuYXR0bGlzdDtbCi08IUFUVExJU1QgJWRpdi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZGl2LmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgcC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXAuZWxlbWVudDtbCi08IUVOVElUWSAlIHAuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIiA+Ci08IUVOVElUWSAlIHAucW5hbWUgICJwIiA+Ci08IUVMRU1FTlQgJXAucW5hbWU7ICAlcC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBwLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgcC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXAuYXR0bGlzdDtbCi08IUFUVExJU1QgJXAucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHAuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmxrc3RydWN0LTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtYmxrcGhyYXMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtYmxrcGhyYXMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYmxrcGhyYXMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBQaHJhc2FsIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYmxrcGhyYXMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQmxvY2sgUGhyYXNhbCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmxrcGhyYXMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgUGhyYXNhbCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJsa3BocmFzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJsb2NrIFBocmFzYWwKLQotICAgICAgICBhZGRyZXNzLCBibG9ja3F1b3RlLCBwcmUsIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IGJsb2NrLWxldmVsIHBocmFzYWwgbWFya3VwLgotLS0+Ci0KLTwhRU5USVRZICUgYWRkcmVzcy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWFkZHJlc3MuZWxlbWVudDtbCi08IUVOVElUWSAlIGFkZHJlc3MuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIiA+Ci08IUVOVElUWSAlIGFkZHJlc3MucW5hbWUgICJhZGRyZXNzIiA+Ci08IUVMRU1FTlQgJWFkZHJlc3MucW5hbWU7ICAlYWRkcmVzcy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBhZGRyZXNzLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYWRkcmVzcy5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWFkZHJlc3MuYXR0bGlzdDtbCi08IUFUVExJU1QgJWFkZHJlc3MucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGFkZHJlc3MuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBibG9ja3F1b3RlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYmxvY2txdW90ZS5lbGVtZW50O1sKLTwhRU5USVRZICUgYmxvY2txdW90ZS5jb250ZW50Ci0gICAgICIoICVCbG9jay5taXg7ICkrIgotPgotPCFFTlRJVFkgJSBibG9ja3F1b3RlLnFuYW1lICAiYmxvY2txdW90ZSIgPgotPCFFTEVNRU5UICVibG9ja3F1b3RlLnFuYW1lOyAgJWJsb2NrcXVvdGUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYmxvY2txdW90ZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJsb2NrcXVvdGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVibG9ja3F1b3RlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVibG9ja3F1b3RlLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBjaXRlICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBibG9ja3F1b3RlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgcHJlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcHJlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBwcmUuY29udGVudAotICAgICAiKCAjUENEQVRBCi0gICAgICB8ICVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICB8ICV0dC5xbmFtZTsgfCAlaS5xbmFtZTsgfCAlYi5xbmFtZTsKLSAgICAgICVJMThuLmNsYXNzOwotICAgICAgJUFuY2hvci5jbGFzczsKLSAgICAgIHwgJXNjcmlwdC5xbmFtZTsgfCAlbWFwLnFuYW1lOwotICAgICAgJUlubGluZS5leHRyYTsgKSoiCi0+Ci08IUVOVElUWSAlIHByZS5xbmFtZSAgInByZSIgPgotPCFFTEVNRU5UICVwcmUucW5hbWU7ICAlcHJlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHByZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHByZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXByZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcHJlLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICB4bWw6c3BhY2UgICAgKCBwcmVzZXJ2ZSApICAgICAgICAgICAgICNGSVhFRCAncHJlc2VydmUnCi0+Ci08IS0tIGVuZCBvZiBwcmUuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uICBIZWFkaW5nIEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIEhlYWRpbmcuY29udGVudCAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIgPgotCi08IUVOVElUWSAlIGgxLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDEuZWxlbWVudDtbCi08IUVOVElUWSAlIGgxLnFuYW1lICAiaDEiID4KLTwhRUxFTUVOVCAlaDEucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoMS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGgxLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDEuYXR0bGlzdDtbCi08IUFUVExJU1QgJWgxLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoMS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGgyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDIuZWxlbWVudDtbCi08IUVOVElUWSAlIGgyLnFuYW1lICAiaDIiID4KLTwhRUxFTUVOVCAlaDIucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoMi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGgyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDIuYXR0bGlzdDtbCi08IUFUVExJU1QgJWgyLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoMi5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGgzLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDMuZWxlbWVudDtbCi08IUVOVElUWSAlIGgzLnFuYW1lICAiaDMiID4KLTwhRUxFTUVOVCAlaDMucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoMy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGgzLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDMuYXR0bGlzdDtbCi08IUFUVExJU1QgJWgzLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoMy5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGg0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDQuZWxlbWVudDtbCi08IUVOVElUWSAlIGg0LnFuYW1lICAiaDQiID4KLTwhRUxFTUVOVCAlaDQucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoNC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGg0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWg0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoNC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGg1LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDUuZWxlbWVudDtbCi08IUVOVElUWSAlIGg1LnFuYW1lICAiaDUiID4KLTwhRUxFTUVOVCAlaDUucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoNS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGg1LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDUuYXR0bGlzdDtbCi08IUFUVExJU1QgJWg1LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoNS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGg2LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDYuZWxlbWVudDtbCi08IUVOVElUWSAlIGg2LnFuYW1lICAiaDYiID4KLTwhRUxFTUVOVCAlaDYucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoNi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGg2LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDYuYXR0bGlzdDtbCi08IUFUVExJU1QgJWg2LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoNi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1ibGtwaHJhcy0xLm1vZCAtLT4KLV1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC10ZXh0LTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gSHlwZXJ0ZXh0IE1vZHVsZSAocmVxdWlyZWQpIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtaHlwZXJ0ZXh0Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWh5cGVydGV4dC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1oeXBlcnRleHQubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBIeXBlcnRleHQgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaHlwZXJ0ZXh0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEh5cGVydGV4dCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWh5cGVydGV4dC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBIeXBlcnRleHQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1oeXBlcnRleHQtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSHlwZXJ0ZXh0Ci0KLSAgICAgICAgYQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBhbmNob3IgKCdhJykgZWxlbWVudCB0eXBlLCB3aGljaAotICAgICBkZWZpbmVzIHRoZSBzb3VyY2Ugb2YgYSBoeXBlcnRleHQgbGluay4gVGhlIGRlc3RpbmF0aW9uCi0gICAgIChvciBsaW5rICd0YXJnZXQnKSBpcyBpZGVudGlmaWVkIHZpYSBpdHMgJ2lkJyBhdHRyaWJ1dGUKLSAgICAgcmF0aGVyIHRoYW4gdGhlICduYW1lJyBhdHRyaWJ1dGUgYXMgd2FzIHVzZWQgaW4gSFRNTC4KLS0tPgotCi08IS0tIC4uLi4uLi4uLi4uLiAgQW5jaG9yIEVsZW1lbnQgIC4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBhLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYS5lbGVtZW50O1sKLTwhRU5USVRZICUgYS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5sTm9BbmNob3IubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYS5xbmFtZSAgImEiID4KLTwhRUxFTUVOVCAlYS5xbmFtZTsgICVhLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgaHJlZiAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgY2hhcnNldCAgICAgICVDaGFyc2V0LmRhdGF0eXBlOyAgICAgICAjSU1QTElFRAotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjSU1QTElFRAotICAgICAgaHJlZmxhbmcgICAgICVMYW5ndWFnZUNvZGUuZGF0YXR5cGU7ICAjSU1QTElFRAotICAgICAgcmVsICAgICAgICAgICVMaW5rVHlwZXMuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgcmV2ICAgICAgICAgICVMaW5rVHlwZXMuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgdGFiaW5kZXggICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgYS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1oeXBlcnRleHQtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBMaXN0cyBNb2R1bGUgKHJlcXVpcmVkKSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1saXN0Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWxpc3QubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtbGlzdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIExpc3RzIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWxpc3QtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgTGlzdHMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbGlzdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBMaXN0cyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWxpc3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTGlzdHMKLQotICAgICAgICBkbCwgZHQsIGRkLCBvbCwgdWwsIGxpCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGxpc3Qtb3JpZW50ZWQgZWxlbWVudCB0eXBlcwotICAgICBhbmQgdGhlaXIgYXR0cmlidXRlcy4KLS0tPgotCi08IUVOVElUWSAlIGRsLnFuYW1lICAiZGwiID4KLTwhRU5USVRZICUgZHQucW5hbWUgICJkdCIgPgotPCFFTlRJVFkgJSBkZC5xbmFtZSAgImRkIiA+Ci08IUVOVElUWSAlIG9sLnFuYW1lICAib2wiID4KLTwhRU5USVRZICUgdWwucW5hbWUgICJ1bCIgPgotPCFFTlRJVFkgJSBsaS5xbmFtZSAgImxpIiA+Ci0KLTwhLS0gZGw6IERlZmluaXRpb24gTGlzdCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGRsLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZGwuZWxlbWVudDtbCi08IUVOVElUWSAlIGRsLmNvbnRlbnQgICIoICVkdC5xbmFtZTsgfCAlZGQucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJWRsLnFuYW1lOyAgJWRsLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGRsLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGwuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVkbC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZGwucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGRsLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZHQ6IERlZmluaXRpb24gVGVybSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGR0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZHQuZWxlbWVudDtbCi08IUVOVElUWSAlIGR0LmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlZHQucW5hbWU7ICAlZHQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgZHQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkdC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWR0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkdC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZHQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBkZDogRGVmaW5pdGlvbiBEZXNjcmlwdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgZGQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkZC5lbGVtZW50O1sKLTwhRU5USVRZICUgZGQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlZGQucW5hbWU7ICAlZGQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkZC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRkLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkZC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZGQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBvbDogT3JkZXJlZCBMaXN0IChudW1iZXJlZCBzdHlsZXMpIC4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgb2wuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVvbC5lbGVtZW50O1sKLTwhRU5USVRZICUgb2wuY29udGVudCAgIiggJWxpLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICVvbC5xbmFtZTsgICVvbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBvbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIG9sLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslb2wuYXR0bGlzdDtbCi08IUFUVExJU1QgJW9sLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBvbC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHVsOiBVbm9yZGVyZWQgTGlzdCAoYnVsbGV0IHN0eWxlcykgLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB1bC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXVsLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB1bC5jb250ZW50ICAiKCAlbGkucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJXVsLnFuYW1lOyAgJXVsLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHVsLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdWwuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV1bC5hdHRsaXN0O1sKLTwhQVRUTElTVCAldWwucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHVsLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gbGk6IExpc3QgSXRlbSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGxpLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslbGkuZWxlbWVudDtbCi08IUVOVElUWSAlIGxpLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJWxpLnFuYW1lOyAgJWxpLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGxpLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbGkuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVsaS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbGkucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGxpLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWxpc3QtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSA6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiAtLT4KLQotPCEtLSBFZGl0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1lZGl0Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWVkaXQubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtZWRpdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEVkaXRpbmcgRWxlbWVudHMgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtZWRpdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBFZGl0aW5nIEVsZW1lbnRzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1lZGl0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEVkaXRpbmcgTWFya3VwIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtZWRpdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBFZGl0aW5nIEVsZW1lbnRzCi0KLSAgICAgICAgaW5zLCBkZWwKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyBlbGVtZW50IHR5cGVzIGFuZCBhdHRyaWJ1dGVzIHVzZWQgdG8gaW5kaWNhdGUKLSAgICAgaW5zZXJ0ZWQgYW5kIGRlbGV0ZWQgY29udGVudCB3aGlsZSBlZGl0aW5nIGEgZG9jdW1lbnQuCi0tLT4KLQotPCEtLSBpbnM6IEluc2VydGVkIFRleHQgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgaW5zLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaW5zLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBpbnMuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyApKiIKLT4KLTwhRU5USVRZICUgaW5zLnFuYW1lICAiaW5zIiA+Ci08IUVMRU1FTlQgJWlucy5xbmFtZTsgICVpbnMuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaW5zLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaW5zLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaW5zLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVpbnMucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGNpdGUgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGRhdGV0aW1lICAgICAlRGF0ZXRpbWUuZGF0YXR5cGU7ICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGlucy5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGRlbDogRGVsZXRlZCBUZXh0ICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBkZWwuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkZWwuZWxlbWVudDtbCi08IUVOVElUWSAlIGRlbC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBkZWwucW5hbWUgICJkZWwiID4KLTwhRUxFTUVOVCAlZGVsLnFuYW1lOyAgJWRlbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkZWwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkZWwuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVkZWwuYXR0bGlzdDtbCi08IUFUVExJU1QgJWRlbC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgY2l0ZSAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgZGF0ZXRpbWUgICAgICVEYXRldGltZS5kYXRhdHlwZTsgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgZGVsLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWVkaXQtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBCSURJIE92ZXJyaWRlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1iZG8ubW9kdWxlICIlWEhUTUwuYmlkaTsiID4KLTwhWyV4aHRtbC1iZG8ubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYmRvLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQklESSBPdmVycmlkZSBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJkby0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCRE8gRWxlbWVudCBNb2R1bGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1iZG8tMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQkRPIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1iZG8tMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmlkaXJlY3Rpb25hbCBPdmVycmlkZSAoYmRvKSBFbGVtZW50Ci0KLSAgICAgVGhpcyBtb2R1bGVzIGRlY2xhcmVzIHRoZSBlbGVtZW50ICdiZG8nLCB1c2VkIHRvIG92ZXJyaWRlIHRoZQotICAgICBVbmljb2RlIGJpZGlyZWN0aW9uYWwgYWxnb3JpdGhtIGZvciBzZWxlY3RlZCBmcmFnbWVudHMgb2YgdGV4dC4KLQotICAgICBERVBFTkRFTkNJRVM6Ci0gICAgIFJlbGllcyBvbiB0aGUgY29uZGl0aW9uYWwgc2VjdGlvbiBrZXl3b3JkICVYSFRNTC5iaWRpOyBkZWNsYXJlZAotICAgICBhcyAiSU5DTFVERSIuIEJpZGlyZWN0aW9uYWwgdGV4dCBzdXBwb3J0IGluY2x1ZGVzIGJvdGggdGhlIGJkbwotICAgICBlbGVtZW50IGFuZCB0aGUgJ2RpcicgYXR0cmlidXRlLgotLS0+Ci0KLTwhRU5USVRZICUgYmRvLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYmRvLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBiZG8uY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBiZG8ucW5hbWUgICJiZG8iID4KLTwhRUxFTUVOVCAlYmRvLnFuYW1lOyAgJWJkby5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBiZG8uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBiZG8uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyViZG8uYXR0bGlzdDtbCi08IUFUVExJU1QgJWJkby5xbmFtZTsKLSAgICAgICVDb3JlLmF0dHJpYjsKLSAgICAgIHhtbDpsYW5nICAgICAlTGFuZ3VhZ2VDb2RlLmRhdGF0eXBlOyAgI0lNUExJRUQKLSAgICAgIGRpciAgICAgICAgICAoIGx0ciB8IHJ0bCApICAgICAgICAgICAgI1JFUVVJUkVECi0+Ci1dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmRvLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gUnVieSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgUnVieS5jb21tb24uYXR0bGlzdHMgIklOQ0xVREUiID4KLTwhRU5USVRZICUgUnVieS5jb21tb24uYXR0cmliICIlQ29tbW9uLmF0dHJpYjsiID4KLTwhRU5USVRZICUgeGh0bWwtcnVieS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1ydWJ5Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXJ1YnkubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBSdWJ5IDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvcnVieS94aHRtbC1ydWJ5LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFJ1YnkgTW9kdWxlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXJ1YnktMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OS0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJAotCi0gICAgIFRoaXMgbW9kdWxlIGlzIGJhc2VkIG9uIHRoZSBXM0MgUnVieSBBbm5vdGF0aW9uIFNwZWNpZmljYXRpb246Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvcnVieQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBSdWJ5IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi9ydWJ5L3hodG1sLXJ1YnktMS5tb2QiCi0KLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBSdWJ5IEVsZW1lbnRzCi0KLSAgICAgICAgcnVieSwgcmJjLCBydGMsIHJiLCBydCwgcnAKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IHJ1YnkgYW5ub3RhdGlvbiBtYXJrdXAuCi0tLT4KLQotPCEtLSBkZWNsYXJlIHF1YWxpZmllZCBlbGVtZW50IHR5cGUgbmFtZXM6Ci0tLT4KLTwhRU5USVRZICUgcnVieS5xbmFtZSAgInJ1YnkiID4KLTwhRU5USVRZICUgcmJjLnFuYW1lICAicmJjIiA+Ci08IUVOVElUWSAlIHJ0Yy5xbmFtZSAgInJ0YyIgPgotPCFFTlRJVFkgJSByYi5xbmFtZSAgInJiIiA+Ci08IUVOVElUWSAlIHJ0LnFuYW1lICAicnQiID4KLTwhRU5USVRZICUgcnAucW5hbWUgICJycCIgPgotCi08IS0tIHJwIGZhbGxiYWNrIGlzIGluY2x1ZGVkIGJ5IGRlZmF1bHQuCi0tLT4KLTwhRU5USVRZICUgUnVieS5mYWxsYmFjayAiSU5DTFVERSIgPgotPCFFTlRJVFkgJSBSdWJ5LmZhbGxiYWNrLm1hbmRhdG9yeSAiSUdOT1JFIiA+Ci0KLTwhLS0gQ29tcGxleCBydWJ5IGlzIGluY2x1ZGVkIGJ5IGRlZmF1bHQ7IGl0IG1heSBiZSAKLSAgICAgb3ZlcnJpZGRlbiBieSBvdGhlciBtb2R1bGVzIHRvIGlnbm9yZSBpdC4KLS0tPgotPCFFTlRJVFkgJSBSdWJ5LmNvbXBsZXggIklOQ0xVREUiID4KLQotPCEtLSBGcmFnbWVudHMgZm9yIHRoZSBjb250ZW50IG1vZGVsIG9mIHRoZSBydWJ5IGVsZW1lbnQgLS0+Ci08IVslUnVieS5mYWxsYmFjaztbCi08IVslUnVieS5mYWxsYmFjay5tYW5kYXRvcnk7WwotPCFFTlRJVFkgJSBSdWJ5LmNvbnRlbnQuc2ltcGxlIAotICAgICAiKCAlcmIucW5hbWU7LCAlcnAucW5hbWU7LCAlcnQucW5hbWU7LCAlcnAucW5hbWU7ICkiCi0+Ci1dXT4KLTwhRU5USVRZICUgUnVieS5jb250ZW50LnNpbXBsZSAKLSAgICAgIiggJXJiLnFuYW1lOywgKCAlcnQucW5hbWU7IHwgKCAlcnAucW5hbWU7LCAlcnQucW5hbWU7LCAlcnAucW5hbWU7ICkgKSApIgotPgotXV0+Ci08IUVOVElUWSAlIFJ1YnkuY29udGVudC5zaW1wbGUgIiggJXJiLnFuYW1lOywgJXJ0LnFuYW1lOyApIiA+Ci0KLTwhWyVSdWJ5LmNvbXBsZXg7WwotPCFFTlRJVFkgJSBSdWJ5LmNvbnRlbnQuY29tcGxleCAKLSAgICAgInwgKCAlcmJjLnFuYW1lOywgJXJ0Yy5xbmFtZTssICVydGMucW5hbWU7PyApIgotPgotXV0+Ci08IUVOVElUWSAlIFJ1YnkuY29udGVudC5jb21wbGV4ICIiID4KLQotPCEtLSBDb250ZW50IG1vZGVscyBvZiB0aGUgcmIgYW5kIHRoZSBydCBlbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8KLSAgICAgYWxsb3cgb3RoZXIgaW5saW5lLWxldmVsIGVsZW1lbnRzIG9mIGl0cyBwYXJlbnQgbWFya3VwIGxhbmd1YWdlLAotICAgICBidXQgaXQgc2hvdWxkIG5vdCBpbmNsdWRlIHJ1YnkgZGVzY2VuZGVudCBlbGVtZW50cy4gVGhlIGZvbGxvd2luZwotICAgICBwYXJhbWV0ZXIgZW50aXR5ICVOb1J1YnkuY29udGVudDsgY2FuIGJlIHVzZWQgdG8gcmVkZWZpbmUKLSAgICAgdGhvc2UgY29udGVudCBtb2RlbHMgd2l0aCBtaW5pbXVtIGVmZm9ydC4gIEl0J3MgZGVmaW5lZCBhcwotICAgICAnKCAjUENEQVRBICknIGJ5IGRlZmF1bHQuCi0tLT4KLTwhRU5USVRZICUgTm9SdWJ5LmNvbnRlbnQgIiggI1BDREFUQSApIiA+Ci0KLTwhLS0gb25lIG9yIG1vcmUgZGlnaXRzIChOVU1CRVIpIC0tPgotPCFFTlRJVFkgJSBOdW1iZXIuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gcnVieSBlbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHJ1YnkuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVydWJ5LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBydWJ5LmNvbnRlbnQKLSAgICAgIiggJVJ1YnkuY29udGVudC5zaW1wbGU7ICVSdWJ5LmNvbnRlbnQuY29tcGxleDsgKSIKLT4KLTwhRUxFTUVOVCAlcnVieS5xbmFtZTsgICVydWJ5LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHJ1YnkuZWxlbWVudCAtLT5dXT4KLQotPCFbJVJ1YnkuY29tcGxleDtbCi08IS0tIHJiYyAocnVieSBiYXNlIGNvbXBvbmVudCkgZWxlbWVudCAuLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSByYmMuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVyYmMuZWxlbWVudDtbCi08IUVOVElUWSAlIHJiYy5jb250ZW50Ci0gICAgICIoJXJiLnFuYW1lOykrIgotPgotPCFFTEVNRU5UICVyYmMucW5hbWU7ICAlcmJjLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHJiYy5lbGVtZW50IC0tPl1dPgotCi08IS0tIHJ0YyAocnVieSB0ZXh0IGNvbXBvbmVudCkgZWxlbWVudCAuLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBydGMuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVydGMuZWxlbWVudDtbCi08IUVOVElUWSAlIHJ0Yy5jb250ZW50Ci0gICAgICIoJXJ0LnFuYW1lOykrIgotPgotPCFFTEVNRU5UICVydGMucW5hbWU7ICAlcnRjLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHJ0Yy5lbGVtZW50IC0tPl1dPgotXV0+Ci0KLTwhLS0gcmIgKHJ1YnkgYmFzZSkgZWxlbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHJiLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcmIuZWxlbWVudDtbCi08IS0tICVyYi5jb250ZW50OyB1c2VzICVOb1J1YnkuY29udGVudDsgYXMgaXRzIGNvbnRlbnQgbW9kZWwsCi0gICAgIHdoaWNoIGlzICcoICNQQ0RBVEEgKScgYnkgZGVmYXVsdC4gSXQgbWF5IGJlIG92ZXJyaWRkZW4KLSAgICAgYnkgb3RoZXIgbW9kdWxlcyB0byBhbGxvdyBvdGhlciBpbmxpbmUtbGV2ZWwgZWxlbWVudHMKLSAgICAgb2YgaXRzIHBhcmVudCBtYXJrdXAgbGFuZ3VhZ2UsIGJ1dCBpdCBzaG91bGQgbm90IGluY2x1ZGUKLSAgICAgcnVieSBkZXNjZW5kZW50IGVsZW1lbnRzLgotLS0+Ci08IUVOVElUWSAlIHJiLmNvbnRlbnQgIiVOb1J1YnkuY29udGVudDsiID4KLTwhRUxFTUVOVCAlcmIucW5hbWU7ICAlcmIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcmIuZWxlbWVudCAtLT5dXT4KLQotPCEtLSBydCAocnVieSB0ZXh0KSBlbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgcnQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVydC5lbGVtZW50O1sKLTwhLS0gJXJ0LmNvbnRlbnQ7IHVzZXMgJU5vUnVieS5jb250ZW50OyBhcyBpdHMgY29udGVudCBtb2RlbCwKLSAgICAgd2hpY2ggaXMgJyggI1BDREFUQSApJyBieSBkZWZhdWx0LiBJdCBtYXkgYmUgb3ZlcnJpZGRlbgotICAgICBieSBvdGhlciBtb2R1bGVzIHRvIGFsbG93IG90aGVyIGlubGluZS1sZXZlbCBlbGVtZW50cwotICAgICBvZiBpdHMgcGFyZW50IG1hcmt1cCBsYW5ndWFnZSwgYnV0IGl0IHNob3VsZCBub3QgaW5jbHVkZQotICAgICBydWJ5IGRlc2NlbmRlbnQgZWxlbWVudHMuCi0tLT4KLTwhRU5USVRZICUgcnQuY29udGVudCAiJU5vUnVieS5jb250ZW50OyIgPgotCi08IUVMRU1FTlQgJXJ0LnFuYW1lOyAgJXJ0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHJ0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhLS0gcmJzcGFuIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBjb21wbGV4IHJ1Ynkgb25seSAuLi4uLi4gLS0+Ci08IVslUnVieS5jb21wbGV4O1sKLTwhRU5USVRZICUgcnQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVydC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcnQucW5hbWU7Ci0gICAgICByYnNwYW4gICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICIxIgotPgotPCEtLSBlbmQgb2YgcnQuYXR0bGlzdCAtLT5dXT4KLV1dPgotCi08IS0tIHJwIChydWJ5IHBhcmVudGhlc2lzKSBlbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFbJVJ1YnkuZmFsbGJhY2s7WwotPCFFTlRJVFkgJSBycC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXJwLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBycC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgKSIKLT4KLTwhRUxFTUVOVCAlcnAucW5hbWU7ICAlcnAuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcnAuZWxlbWVudCAtLT5dXT4KLV1dPgotCi08IS0tIFJ1YnkgQ29tbW9uIEF0dHJpYnV0ZXMKLQotICAgICBUaGUgZm9sbG93aW5nIG9wdGlvbmFsIEFUVExJU1QgZGVjbGFyYXRpb25zIHByb3ZpZGUgYW4gZWFzeSB3YXkKLSAgICAgdG8gZGVmaW5lIGNvbW1vbiBhdHRyaWJ1dGVzIGZvciBydWJ5IGVsZW1lbnRzLiAgVGhlc2UgZGVjbGFyYXRpb25zCi0gICAgIGFyZSBpZ25vcmVkIGJ5IGRlZmF1bHQuCi0KLSAgICAgUnVieSBlbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gaGF2ZSBjb21tb24gYXR0cmlidXRlcyBvZiBpdHMKLSAgICAgcGFyZW50IG1hcmt1cCBsYW5ndWFnZS4gIEZvciBleGFtcGxlLCBpZiBhIG1hcmt1cCBsYW5ndWFnZSBkZWZpbmVzCi0gICAgIGNvbW1vbiBhdHRyaWJ1dGVzIGFzIGEgcGFyYW1ldGVyIGVudGl0eSAlYXR0cnM7LCB5b3UgbWF5IGFkZAotICAgICB0aG9zZSBhdHRyaWJ1dGVzIGJ5IGp1c3QgZGVjbGFyaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIGVudGl0aWVzCi0KLSAgICAgICAgIDwhRU5USVRZICUgUnVieS5jb21tb24uYXR0bGlzdHMgICJJTkNMVURFIiA+Ci0gICAgICAgICA8IUVOVElUWSAlIFJ1YnkuY29tbW9uLmF0dHJpYiAgIiVhdHRyczsiID4KLQotICAgICBiZWZvcmUgaW5jbHVkaW5nIHRoZSBSdWJ5IG1vZHVsZS4KLS0tPgotCi08IUVOVElUWSAlIFJ1YnkuY29tbW9uLmF0dGxpc3RzICAiSUdOT1JFIiA+Ci08IVslUnVieS5jb21tb24uYXR0bGlzdHM7WwotPCFFTlRJVFkgJSBSdWJ5LmNvbW1vbi5hdHRyaWIgICIiID4KLQotPCEtLSBjb21tb24gYXR0cmlidXRlcyBmb3IgcnVieSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgUnVieS5jb21tb24uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVSdWJ5LmNvbW1vbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcnVieS5xbmFtZTsKLSAgICAgICVSdWJ5LmNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBSdWJ5LmNvbW1vbi5hdHRsaXN0IC0tPl1dPgotCi08IVslUnVieS5jb21wbGV4O1sKLTwhLS0gY29tbW9uIGF0dHJpYnV0ZXMgZm9yIHJiYyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIFJiYy5jb21tb24uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVSYmMuY29tbW9uLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVyYmMucW5hbWU7Ci0gICAgICAlUnVieS5jb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgUmJjLmNvbW1vbi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGNvbW1vbiBhdHRyaWJ1dGVzIGZvciBydGMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBSdGMuY29tbW9uLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslUnRjLmNvbW1vbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcnRjLnFuYW1lOwotICAgICAgJVJ1YnkuY29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIFJ0Yy5jb21tb24uYXR0bGlzdCAtLT5dXT4KLV1dPgotCi08IS0tIGNvbW1vbiBhdHRyaWJ1dGVzIGZvciByYiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBSYi5jb21tb24uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVSYi5jb21tb24uYXR0bGlzdDtbCi08IUFUVExJU1QgJXJiLnFuYW1lOwotICAgICAgJVJ1YnkuY29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIFJiLmNvbW1vbi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGNvbW1vbiBhdHRyaWJ1dGVzIGZvciBydCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBSdC5jb21tb24uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVSdC5jb21tb24uYXR0bGlzdDtbCi08IUFUVExJU1QgJXJ0LnFuYW1lOwotICAgICAgJVJ1YnkuY29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIFJ0LmNvbW1vbi5hdHRsaXN0IC0tPl1dPgotCi08IVslUnVieS5mYWxsYmFjaztbCi08IS0tIGNvbW1vbiBhdHRyaWJ1dGVzIGZvciBycCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBScC5jb21tb24uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVScC5jb21tb24uYXR0bGlzdDtbCi08IUFUVExJU1QgJXJwLnFuYW1lOwotICAgICAgJVJ1YnkuY29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIFJwLmNvbW1vbi5hdHRsaXN0IC0tPl1dPgotXV0+Ci1dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtcnVieS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIFByZXNlbnRhdGlvbiBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXByZXMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtcHJlcy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1wcmVzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgUHJlc2VudGF0aW9uIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXByZXMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgUHJlc2VudGF0aW9uIE1vZHVsZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtcHJlcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBQcmVzZW50YXRpb24gMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1wcmVzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFByZXNlbnRhdGlvbmFsIEVsZW1lbnRzCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVmaW5lcyBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyBmb3IKLSAgICAgc2ltcGxlIHByZXNlbnRhdGlvbi1yZWxhdGVkIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIHhodG1sLWlubHByZXMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtaW5scHJlcy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1pbmxwcmVzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFByZXNlbnRhdGlvbiAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWlubHByZXMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW5saW5lIFByZXNlbnRhdGlvbiBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaW5scHJlcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgUHJlc2VudGF0aW9uIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW5scHJlcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbmxpbmUgUHJlc2VudGF0aW9uYWwgRWxlbWVudHMKLQotICAgICAgICBiLCBiaWcsIGksIHNtYWxsLCBzdWIsIHN1cCwgdHQKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IGlubGluZS1sZXZlbCBwcmVzZW50YXRpb25hbCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSBiLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYi5lbGVtZW50O1sKLTwhRU5USVRZICUgYi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGIucW5hbWUgICJiIiA+Ci08IUVMRU1FTlQgJWIucW5hbWU7ICAlYi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBiLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWIuYXR0bGlzdDtbCi08IUFUVExJU1QgJWIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGIuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBiaWcuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyViaWcuZWxlbWVudDtbCi08IUVOVElUWSAlIGJpZy5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGJpZy5xbmFtZSAgImJpZyIgPgotPCFFTEVNRU5UICViaWcucW5hbWU7ICAlYmlnLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJpZy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJpZy5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJpZy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYmlnLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBiaWcuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBpLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaS5lbGVtZW50O1sKLTwhRU5USVRZICUgaS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGkucW5hbWUgICJpIiA+Ci08IUVMRU1FTlQgJWkucW5hbWU7ICAlaS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBpLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWkuYXR0bGlzdDtbCi08IUFUVExJU1QgJWkucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGkuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzbWFsbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXNtYWxsLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzbWFsbC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHNtYWxsLnFuYW1lICAic21hbGwiID4KLTwhRUxFTUVOVCAlc21hbGwucW5hbWU7ICAlc21hbGwuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc21hbGwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzbWFsbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXNtYWxsLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzbWFsbC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc21hbGwuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzdWIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzdWIuZWxlbWVudDtbCi08IUVOVElUWSAlIHN1Yi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHN1Yi5xbmFtZSAgInN1YiIgPgotPCFFTEVNRU5UICVzdWIucW5hbWU7ICAlc3ViLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHN1Yi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHN1Yi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXN1Yi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc3ViLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzdWIuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzdXAuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzdXAuZWxlbWVudDtbCi08IUVOVElUWSAlIHN1cC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHN1cC5xbmFtZSAgInN1cCIgPgotPCFFTEVNRU5UICVzdXAucW5hbWU7ICAlc3VwLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHN1cC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHN1cC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXN1cC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc3VwLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzdXAuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0dC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXR0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0dC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHR0LnFuYW1lICAidHQiID4KLTwhRUxFTUVOVCAldHQucW5hbWU7ICAldHQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdHQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0dC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXR0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0dC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdHQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtaW5scHJlcy0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWJsa3ByZXMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtYmxrcHJlcy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1ibGtwcmVzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgUHJlc2VudGF0aW9uIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYmxrcHJlcy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCbG9jayBQcmVzZW50YXRpb24gTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ibGtwcmVzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFByZXNlbnRhdGlvbiAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJsa3ByZXMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmxvY2sgUHJlc2VudGF0aW9uYWwgRWxlbWVudHMKLQotICAgICAgICBocgotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgYmxvY2stbGV2ZWwgcHJlc2VudGF0aW9uYWwgbWFya3VwLgotLS0+Ci0KLTwhRU5USVRZICUgaHIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoci5lbGVtZW50O1sKLTwhRU5USVRZICUgaHIuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIGhyLnFuYW1lICAiaHIiID4KLTwhRUxFTUVOVCAlaHIucW5hbWU7ICAlaHIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaHIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoci5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWhyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoci5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaHIuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmxrcHJlcy0xLm1vZCAtLT4KLV1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1wcmVzLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gTGluayBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtbGluay5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1saW5rLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWxpbmsubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBMaW5rIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbGluay0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBMaW5rIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1saW5rLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIExpbmsgRWxlbWVudCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWxpbmstMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTGluayBlbGVtZW50Ci0KLSAgICAgICAgbGluawotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBsaW5rIGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsCi0gICAgIHdoaWNoIGNvdWxkIChpbiBwcmluY2lwbGUpIGJlIHVzZWQgdG8gZGVmaW5lIGRvY3VtZW50LWxldmVsIGxpbmtzCi0gICAgIHRvIGV4dGVybmFsIHJlc291cmNlcyBzdWNoIGFzOgotCi0gICAgIGEpIGZvciBkb2N1bWVudCBzcGVjaWZpYyB0b29sYmFycy9tZW51cywgZS5nLiBzdGFydCwgY29udGVudHMsCi0gICAgICAgIHByZXZpb3VzLCBuZXh0LCBpbmRleCwgZW5kLCBoZWxwCi0gICAgIGIpIHRvIGxpbmsgdG8gYSBzZXBhcmF0ZSBzdHlsZSBzaGVldCAocmVsPSJzdHlsZXNoZWV0IikKLSAgICAgYykgdG8gbWFrZSBhIGxpbmsgdG8gYSBzY3JpcHQgKHJlbD0ic2NyaXB0IikKLSAgICAgZCkgYnkgc3R5bGVzaGVldHMgdG8gY29udHJvbCBob3cgY29sbGVjdGlvbnMgb2YgaHRtbCBub2RlcyBhcmUKLSAgICAgICAgcmVuZGVyZWQgaW50byBwcmludGVkIGRvY3VtZW50cwotICAgICBlKSB0byBtYWtlIGEgbGluayB0byBhIHByaW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgICAgZS5nLiBhIHBvc3RzY3JpcHQgb3IgcGRmIHZlcnNpb24gKHJlbD0iYWx0ZXJuYXRlIiBtZWRpYT0icHJpbnQiKQotLS0+Ci0KLTwhLS0gbGluazogTWVkaWEtSW5kZXBlbmRlbnQgTGluayAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGxpbmsuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVsaW5rLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBsaW5rLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBsaW5rLnFuYW1lICAibGluayIgPgotPCFFTEVNRU5UICVsaW5rLnFuYW1lOyAgJWxpbmsuY29udGVudDsgPgotPCEtLSBlbmQgb2YgbGluay5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGxpbmsuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVsaW5rLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVsaW5rLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBjaGFyc2V0ICAgICAgJUNoYXJzZXQuZGF0YXR5cGU7ICAgICAgICNJTVBMSUVECi0gICAgICBocmVmICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBocmVmbGFuZyAgICAgJUxhbmd1YWdlQ29kZS5kYXRhdHlwZTsgICNJTVBMSUVECi0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICByZWwgICAgICAgICAgJUxpbmtUeXBlcy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICByZXYgICAgICAgICAgJUxpbmtUeXBlcy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICBtZWRpYSAgICAgICAgJU1lZGlhRGVzYy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBsaW5rLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWxpbmstMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBEb2N1bWVudCBNZXRhaW5mb3JtYXRpb24gTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1tZXRhLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLW1ldGEubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtbWV0YS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIE1ldGFpbmZvcm1hdGlvbiAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1tZXRhLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIERvY3VtZW50IE1ldGFpbmZvcm1hdGlvbiBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLW1ldGEtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTWV0YWluZm9ybWF0aW9uIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbWV0YS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBNZXRhIEluZm9ybWF0aW9uCi0KLSAgICAgICAgbWV0YQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBtZXRhIGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsCi0gICAgIHVzZWQgdG8gcHJvdmlkZSBkZWNsYXJhdGl2ZSBkb2N1bWVudCBtZXRhaW5mb3JtYXRpb24uCi0tLT4KLQotPCEtLSBtZXRhOiBHZW5lcmljIE1ldGFpbmZvcm1hdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgbWV0YS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW1ldGEuZWxlbWVudDtbCi08IUVOVElUWSAlIG1ldGEuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIG1ldGEucW5hbWUgICJtZXRhIiA+Ci08IUVMRU1FTlQgJW1ldGEucW5hbWU7ICAlbWV0YS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBtZXRhLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbWV0YS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJW1ldGEuYXR0bGlzdDtbCi08IUFUVExJU1QgJW1ldGEucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotICAgICAgaHR0cC1lcXVpdiAgIE5NVE9LRU4gICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgbmFtZSAgICAgICAgIE5NVE9LRU4gICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgY29udGVudCAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIHNjaGVtZSAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIG1ldGEuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbWV0YS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIEJhc2UgRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWJhc2UubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtYmFzZS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1iYXNlLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzZSBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJhc2UtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQmFzZSBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmFzZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNlIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1iYXNlLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJhc2UgZWxlbWVudAotCi0gICAgICAgIGJhc2UKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgYmFzZSBlbGVtZW50IHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGVzLAotICAgICB1c2VkIHRvIGRlZmluZSBhIGJhc2UgVVJJIGFnYWluc3Qgd2hpY2ggcmVsYXRpdmUgVVJJcyBpbiB0aGUKLSAgICAgZG9jdW1lbnQgd2lsbCBiZSByZXNvbHZlZC4KLQotICAgICBOb3RlIHRoYXQgdGhpcyBtb2R1bGUgYWxzbyByZWRlY2xhcmVzIHRoZSBjb250ZW50IG1vZGVsIGZvcgotICAgICB0aGUgaGVhZCBlbGVtZW50IHRvIGluY2x1ZGUgdGhlIGJhc2UgZWxlbWVudC4KLS0tPgotCi08IS0tIGJhc2U6IERvY3VtZW50IEJhc2UgVVJJIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBiYXNlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYmFzZS5lbGVtZW50O1sKLTwhRU5USVRZICUgYmFzZS5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgYmFzZS5xbmFtZSAgImJhc2UiID4KLTwhRUxFTUVOVCAlYmFzZS5xbmFtZTsgICViYXNlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJhc2UuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBiYXNlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYmFzZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYmFzZS5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICBocmVmICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNSRVFVSVJFRAotPgotPCEtLSBlbmQgb2YgYmFzZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGhlYWQuY29udGVudAotICAgICIoICVIZWFkT3B0cy5taXg7LAotICAgICAoICggJXRpdGxlLnFuYW1lOywgJUhlYWRPcHRzLm1peDssICggJWJhc2UucW5hbWU7LCAlSGVhZE9wdHMubWl4OyApPyApCi0gICAgIHwgKCAlYmFzZS5xbmFtZTssICVIZWFkT3B0cy5taXg7LCAoICV0aXRsZS5xbmFtZTssICVIZWFkT3B0cy5taXg7ICkpKSkiCi0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJhc2UtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBTY3JpcHRpbmcgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1zY3JpcHQubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtc2NyaXB0Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXNjcmlwdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFNjcmlwdGluZyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1zY3JpcHQtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgRG9jdW1lbnQgU2NyaXB0aW5nIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtc2NyaXB0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFNjcmlwdGluZyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXNjcmlwdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBTY3JpcHRpbmcKLQotICAgICAgICBzY3JpcHQsIG5vc2NyaXB0Ci0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgZWxlbWVudCB0eXBlcyBhbmQgYXR0cmlidXRlcyB1c2VkIHRvIHByb3ZpZGUKLSAgICAgc3VwcG9ydCBmb3IgZXhlY3V0YWJsZSBzY3JpcHRzIGFzIHdlbGwgYXMgYW4gYWx0ZXJuYXRlIGNvbnRlbnQKLSAgICAgY29udGFpbmVyIHdoZXJlIHNjcmlwdHMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0tLT4KLQotPCEtLSBzY3JpcHQ6IFNjcmlwdGluZyBTdGF0ZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgc2NyaXB0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc2NyaXB0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzY3JpcHQuY29udGVudCAgIiggI1BDREFUQSApIiA+Ci08IUVOVElUWSAlIHNjcmlwdC5xbmFtZSAgInNjcmlwdCIgPgotPCFFTEVNRU5UICVzY3JpcHQucW5hbWU7ICAlc2NyaXB0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHNjcmlwdC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHNjcmlwdC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXNjcmlwdC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc2NyaXB0LnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgIGNoYXJzZXQgICAgICAlQ2hhcnNldC5kYXRhdHlwZTsgICAgICAgI0lNUExJRUQKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI1JFUVVJUkVECi0gICAgICBzcmMgICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBkZWZlciAgICAgICAgKCBkZWZlciApICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB4bWw6c3BhY2UgICAgKCBwcmVzZXJ2ZSApICAgICAgICAgICAgICNGSVhFRCAncHJlc2VydmUnCi0+Ci08IS0tIGVuZCBvZiBzY3JpcHQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBub3NjcmlwdDogTm8tU2NyaXB0IEFsdGVybmF0ZSBDb250ZW50IC4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgbm9zY3JpcHQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVub3NjcmlwdC5lbGVtZW50O1sKLTwhRU5USVRZICUgbm9zY3JpcHQuY29udGVudAotICAgICAiKCAlQmxvY2subWl4OyApKyIKLT4KLTwhRU5USVRZICUgbm9zY3JpcHQucW5hbWUgICJub3NjcmlwdCIgPgotPCFFTEVNRU5UICVub3NjcmlwdC5xbmFtZTsgICVub3NjcmlwdC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBub3NjcmlwdC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIG5vc2NyaXB0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbm9zY3JpcHQuYXR0bGlzdDtbCi08IUFUVExJU1QgJW5vc2NyaXB0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBub3NjcmlwdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1zY3JpcHQtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBTdHlsZSBTaGVldHMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtc3R5bGUubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtc3R5bGUubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtc3R5bGUubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBTdHlsZSBTaGVldHMgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc3R5bGUtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgRG9jdW1lbnQgU3R5bGUgU2hlZXQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXN0eWxlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCBTdHlsZSBTaGVldHMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1zdHlsZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBTdHlsZSBTaGVldHMKLQotICAgICAgICBzdHlsZQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBzdHlsZSBlbGVtZW50IHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGVzLAotICAgICB1c2VkIHRvIGVtYmVkIHN0eWxlc2hlZXQgaW5mb3JtYXRpb24gaW4gdGhlIGRvY3VtZW50IGhlYWQgZWxlbWVudC4KLS0tPgotCi08IS0tIHN0eWxlOiBTdHlsZSBTaGVldCBJbmZvcm1hdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgc3R5bGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzdHlsZS5lbGVtZW50O1sKLTwhRU5USVRZICUgc3R5bGUuY29udGVudCAgIiggI1BDREFUQSApIiA+Ci08IUVOVElUWSAlIHN0eWxlLnFuYW1lICAic3R5bGUiID4KLTwhRUxFTUVOVCAlc3R5bGUucW5hbWU7ICAlc3R5bGUuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc3R5bGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzdHlsZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXN0eWxlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzdHlsZS5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAldGl0bGUuYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjUkVRVUlSRUQKLSAgICAgIG1lZGlhICAgICAgICAlTWVkaWFEZXNjLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIHhtbDpzcGFjZSAgICAoIHByZXNlcnZlICkgICAgICAgICAgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLT4KLTwhLS0gZW5kIG9mIHN0eWxlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXN0eWxlLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gSW1hZ2UgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtaW1hZ2UubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtaW1hZ2UubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtaW1hZ2UubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbWFnZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW1hZ2UtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW1hZ2VzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaW1hZ2UtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJvdmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW1hZ2VzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW1hZ2UtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW1hZ2VzCi0KLSAgICAgICAgaW1nCi0KLSAgICAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgbWFya3VwIHRvIHN1cHBvcnQgYmFzaWMgaW1hZ2UgZW1iZWRkaW5nLgotLS0+Ci0KLTwhLS0gVG8gYXZvaWQgcHJvYmxlbXMgd2l0aCB0ZXh0LW9ubHkgVUFzIGFzIHdlbGwgYXMgdG8gbWFrZQotICAgICBpbWFnZSBjb250ZW50IHVuZGVyc3RhbmRhYmxlIGFuZCBuYXZpZ2FibGUgdG8gdXNlcnMgb2YKLSAgICAgbm9uLXZpc3VhbCBVQXMsIHlvdSBuZWVkIHRvIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiB3aXRoCi0gICAgIHRoZSAnYWx0JyBhdHRyaWJ1dGUsIGFuZCBhdm9pZCBzZXJ2ZXItc2lkZSBpbWFnZSBtYXBzLgotLS0+Ci0KLTwhRU5USVRZICUgaW1nLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaW1nLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBpbWcuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIGltZy5xbmFtZSAgImltZyIgPgotPCFFTEVNRU5UICVpbWcucW5hbWU7ICAlaW1nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGltZy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGltZy5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWltZy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaW1nLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBzcmMgICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgYWx0ICAgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIGxvbmdkZXNjICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhlaWdodCAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIHdpZHRoICAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGltZy5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbWFnZS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIENsaWVudC1zaWRlIEltYWdlIE1hcCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWNzaXNtYXAubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtY3Npc21hcC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1jc2lzbWFwLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQ2xpZW50LXNpZGUgSW1hZ2UgTWFwcyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1jc2lzbWFwLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIENsaWVudC1zaWRlIEltYWdlIE1hcCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWNzaXNtYXAtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQ2xpZW50LXNpZGUgSW1hZ2UgTWFwcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWNzaXNtYXAtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQ2xpZW50LXNpZGUgSW1hZ2UgTWFwcwotCi0gICAgICAgIGFyZWEsIG1hcAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHRvIHN1cHBvcnQgY2xpZW50LXNpZGUKLSAgICAgaW1hZ2UgbWFwcy4gVGhpcyByZXF1aXJlcyB0aGF0IHRoZSBJbWFnZSBNb2R1bGUgKG9yIGEgbW9kdWxlCi0gICAgIGRlY2xhcmluZyB0aGUgaW1nIGVsZW1lbnQgdHlwZSkgYmUgaW5jbHVkZWQgaW4gdGhlIERURC4KLQotICAgICBUaGVzZSBjYW4gYmUgcGxhY2VkIGluIHRoZSBzYW1lIGRvY3VtZW50IG9yIGdyb3VwZWQgaW4gYQotICAgICBzZXBhcmF0ZSBkb2N1bWVudCwgYWx0aG91Z2ggdGhlIGxhdHRlciBpc24ndCB3aWRlbHkgc3VwcG9ydGVkCi0tLT4KLQotPCFFTlRJVFkgJSBhcmVhLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYXJlYS5lbGVtZW50O1sKLTwhRU5USVRZICUgYXJlYS5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgYXJlYS5xbmFtZSAgImFyZWEiID4KLTwhRUxFTUVOVCAlYXJlYS5xbmFtZTsgICVhcmVhLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGFyZWEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBTaGFwZS5kYXRhdHlwZSAiKCByZWN0IHwgY2lyY2xlIHwgcG9seSB8IGRlZmF1bHQgKSI+Ci08IUVOVElUWSAlIENvb3Jkcy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCFFTlRJVFkgJSBhcmVhLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYXJlYS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYXJlYS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgaHJlZiAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgc2hhcGUgICAgICAgICVTaGFwZS5kYXRhdHlwZTsgICAgICAgICAncmVjdCcKLSAgICAgIGNvb3JkcyAgICAgICAlQ29vcmRzLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG5vaHJlZiAgICAgICAoIG5vaHJlZiApICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGFsdCAgICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI1JFUVVJUkVECi0gICAgICB0YWJpbmRleCAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBhcmVhLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gbW9kaWZ5IGFuY2hvciBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBsaXN0Ci0gICAgIHRvIGFsbG93IGZvciBjbGllbnQtc2lkZSBpbWFnZSBtYXBzCi0tLT4KLTwhQVRUTElTVCAlYS5xbmFtZTsKLSAgICAgIHNoYXBlICAgICAgICAlU2hhcGUuZGF0YXR5cGU7ICAgICAgICAgJ3JlY3QnCi0gICAgICBjb29yZHMgICAgICAgJUNvb3Jkcy5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhLS0gbW9kaWZ5IGltZyBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBsaXN0Ci0gICAgIHRvIGFsbG93IGZvciBjbGllbnQtc2lkZSBpbWFnZSBtYXBzCi0tLT4KLTwhQVRUTElTVCAlaW1nLnFuYW1lOwotICAgICAgdXNlbWFwICAgICAgIElEUkVGICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotPgotCi08IS0tIG1vZGlmeSBmb3JtIGlucHV0IGF0dHJpYnV0ZSBkZWZpbml0aW9uIGxpc3QKLSAgICAgdG8gYWxsb3cgZm9yIGNsaWVudC1zaWRlIGltYWdlIG1hcHMKLS0tPgotPCFBVFRMSVNUICVpbnB1dC5xbmFtZTsKLSAgICAgIHVzZW1hcCAgICAgICBJRFJFRiAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBtb2RpZnkgb2JqZWN0IGF0dHJpYnV0ZSBkZWZpbml0aW9uIGxpc3QKLSAgICAgdG8gYWxsb3cgZm9yIGNsaWVudC1zaWRlIGltYWdlIG1hcHMKLS0tPgotPCFBVFRMSVNUICVvYmplY3QucW5hbWU7Ci0gICAgICB1c2VtYXAgICAgICAgSURSRUYgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhLS0gJ3VzZW1hcCcgcG9pbnRzIHRvIHRoZSAnaWQnIGF0dHJpYnV0ZSBvZiBhIDxtYXA+IGVsZW1lbnQsCi0gICAgIHdoaWNoIG11c3QgYmUgaW4gdGhlIHNhbWUgZG9jdW1lbnQ7IHN1cHBvcnQgZm9yIGV4dGVybmFsCi0gICAgIGRvY3VtZW50IG1hcHMgd2FzIG5vdCB3aWRlbHkgc3VwcG9ydGVkIGluIEhUTUwgYW5kIGlzCi0gICAgIGVsaW1pbmF0ZWQgaW4gWEhUTUwuCi0KLSAgICAgSXQgaXMgY29uc2lkZXJlZCBhbiBlcnJvciBmb3IgdGhlIGVsZW1lbnQgcG9pbnRlZCB0byBieQotICAgICBhIHVzZW1hcCBJRFJFRiB0byBvY2N1ciBpbiBhbnl0aGluZyBidXQgYSA8bWFwPiBlbGVtZW50LgotLS0+Ci0KLTwhRU5USVRZICUgbWFwLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslbWFwLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBtYXAuY29udGVudAotICAgICAiKCggJUJsb2NrLm1peDsgKSB8ICVhcmVhLnFuYW1lOyApKyIKLT4KLTwhRU5USVRZICUgbWFwLnFuYW1lICAibWFwIiA+Ci08IUVMRU1FTlQgJW1hcC5xbmFtZTsgICVtYXAuY29udGVudDsgPgotPCEtLSBlbmQgb2YgbWFwLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbWFwLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbWFwLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVtYXAucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgaWQgICAgICAgICAgIElEICAgICAgICAgICAgICAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgICVjbGFzcy5hdHRyaWI7Ci0gICAgICAldGl0bGUuYXR0cmliOwotICAgICAgJUNvcmUuZXh0cmEuYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotICAgICAgJUV2ZW50cy5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBtYXAuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtY3Npc21hcC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIFNlcnZlci1zaWRlIEltYWdlIE1hcCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXNzaXNtYXAubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtc3Npc21hcC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1zc2lzbWFwLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgU2VydmVyLXNpZGUgSW1hZ2UgTWFwcyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1zc2lzbWFwLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFNlcnZlci1zaWRlIEltYWdlIE1hcCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXNzaXNtYXAtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgU2VydmVyLXNpZGUgSW1hZ2UgTWFwcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXNzaXNtYXAtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotIzIwMDAtMTAtMjI6IGFkZGVkIGRlY2xhcmF0aW9uIGZvciAnaXNtYXAnIG9uIDxpbnB1dD4KLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gU2VydmVyLXNpZGUgSW1hZ2UgTWFwcwotCi0gICAgIFRoaXMgYWRkcyB0aGUgJ2lzbWFwJyBhdHRyaWJ1dGUgdG8gdGhlIGltZyBhbmQgaW5wdXQgZWxlbWVudHMKLSAgICAgdG8gc3VwcG9ydCBzZXJ2ZXItc2lkZSBwcm9jZXNzaW5nIG9mIGEgdXNlciBzZWxlY3Rpb24uCi0tLT4KLQotPCFBVFRMSVNUICVpbWcucW5hbWU7Ci0gICAgICBpc21hcCAgICAgICAgKCBpc21hcCApICAgICAgICAgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhQVRUTElTVCAlaW5wdXQucW5hbWU7Ci0gICAgICBpc21hcCAgICAgICAgKCBpc21hcCApICAgICAgICAgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXNzaXNtYXAtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBQYXJhbSBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1wYXJhbS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1wYXJhbS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1wYXJhbS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFBhcmFtIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtcGFyYW0tMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgUGFyYW0gRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXBhcmFtLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFBhcmFtIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1wYXJhbS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBQYXJhbWV0ZXJzIGZvciBKYXZhIEFwcGxldHMgYW5kIEVtYmVkZGVkIE9iamVjdHMKLQotICAgICAgICBwYXJhbQotCi0gICAgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGRlY2xhcmF0aW9ucyBmb3IgdGhlIHBhcmFtIGVsZW1lbnQsCi0gICAgIHVzZWQgdG8gcHJvdmlkZSBuYW1lZCBwcm9wZXJ0eSB2YWx1ZXMgZm9yIHRoZSBhcHBsZXQKLSAgICAgYW5kIG9iamVjdCBlbGVtZW50cy4KLS0tPgotCi08IS0tIHBhcmFtOiBOYW1lZCBQcm9wZXJ0eSBWYWx1ZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBwYXJhbS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXBhcmFtLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBwYXJhbS5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgcGFyYW0ucW5hbWUgICJwYXJhbSIgPgotPCFFTEVNRU5UICVwYXJhbS5xbmFtZTsgICVwYXJhbS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBwYXJhbS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHBhcmFtLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcGFyYW0uYXR0bGlzdDtbCi08IUFUVExJU1QgJXBhcmFtLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICVpZC5hdHRyaWI7Ci0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgdmFsdWUgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdmFsdWV0eXBlICAgICggZGF0YSB8IHJlZiB8IG9iamVjdCApICAnZGF0YScKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHBhcmFtLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXBhcmFtLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gRW1iZWRkZWQgT2JqZWN0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtb2JqZWN0Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLW9iamVjdC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1vYmplY3QubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBFbWJlZGRlZCBPYmplY3QgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtb2JqZWN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEVtYmVkZGVkIE9iamVjdCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLW9iamVjdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBFbWJlZGRlZCBPYmplY3QgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1vYmplY3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gRW1iZWRkZWQgT2JqZWN0cwotCi0gICAgICAgIG9iamVjdAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBvYmplY3QgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywgdXNlZAotICAgICB0byBlbWJlZCBleHRlcm5hbCBvYmplY3RzIGFzIHBhcnQgb2YgWEhUTUwgcGFnZXMuIEluIHRoZSBkb2N1bWVudCwKLSAgICAgcGxhY2UgcGFyYW0gZWxlbWVudHMgcHJpb3IgdG8gb3RoZXIgY29udGVudCB3aXRoaW4gdGhlIG9iamVjdCBlbGVtZW50LgotCi0gICAgIE5vdGUgdGhhdCB1c2Ugb2YgdGhpcyBtb2R1bGUgcmVxdWlyZXMgaW5zdGFudGlhdGlvbiBvZiB0aGUgUGFyYW0KLSAgICAgRWxlbWVudCBNb2R1bGUuCi0tLT4KLQotPCEtLSBvYmplY3Q6IEdlbmVyaWMgRW1iZWRkZWQgT2JqZWN0IC4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgb2JqZWN0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslb2JqZWN0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBvYmplY3QuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyB8ICVwYXJhbS5xbmFtZTsgKSoiCi0+Ci08IUVOVElUWSAlIG9iamVjdC5xbmFtZSAgIm9iamVjdCIgPgotPCFFTEVNRU5UICVvYmplY3QucW5hbWU7ICAlb2JqZWN0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG9iamVjdC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIG9iamVjdC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJW9iamVjdC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlb2JqZWN0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBkZWNsYXJlICAgICAgKCBkZWNsYXJlICkgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjbGFzc2lkICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjb2RlYmFzZSAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBkYXRhICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICBjb2RldHlwZSAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICBhcmNoaXZlICAgICAgJVVSSXMuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICBzdGFuZGJ5ICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICBoZWlnaHQgICAgICAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICB3aWR0aCAgICAgICAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB0YWJpbmRleCAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBvYmplY3QuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtb2JqZWN0LTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gVGFibGVzIE1vZHVsZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtdGFibGUubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtdGFibGUubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtdGFibGUubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBUYWJsZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtdGFibGUtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgVGFibGUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtdGFibGUtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgVGFibGVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtdGFibGUtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVGFibGVzCi0KLSAgICAgICAgdGFibGUsIGNhcHRpb24sIHRoZWFkLCB0Zm9vdCwgdGJvZHksIGNvbGdyb3VwLCBjb2wsIHRyLCB0aCwgdGQKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyBlbGVtZW50IHR5cGVzIGFuZCBhdHRyaWJ1dGVzIHVzZWQgdG8gcHJvdmlkZQotICAgICB0YWJsZSBtYXJrdXAgc2ltaWxhciB0byBIVE1MIDQuMCwgaW5jbHVkaW5nIGZlYXR1cmVzIHRoYXQgZW5hYmxlCi0gICAgIGJldHRlciBhY2Nlc3NpYmlsaXR5IGZvciBub24tdmlzdWFsIHVzZXIgYWdlbnRzLgotLS0+Ci0KLTwhLS0gZGVjbGFyZSBxdWFsaWZpZWQgZWxlbWVudCB0eXBlIG5hbWVzOgotLS0+Ci08IUVOVElUWSAlIHRhYmxlLnFuYW1lICAidGFibGUiID4KLTwhRU5USVRZICUgY2FwdGlvbi5xbmFtZSAgImNhcHRpb24iID4KLTwhRU5USVRZICUgdGhlYWQucW5hbWUgICJ0aGVhZCIgPgotPCFFTlRJVFkgJSB0Zm9vdC5xbmFtZSAgInRmb290IiA+Ci08IUVOVElUWSAlIHRib2R5LnFuYW1lICAidGJvZHkiID4KLTwhRU5USVRZICUgY29sZ3JvdXAucW5hbWUgICJjb2xncm91cCIgPgotPCFFTlRJVFkgJSBjb2wucW5hbWUgICJjb2wiID4KLTwhRU5USVRZICUgdHIucW5hbWUgICJ0ciIgPgotPCFFTlRJVFkgJSB0aC5xbmFtZSAgInRoIiA+Ci08IUVOVElUWSAlIHRkLnFuYW1lICAidGQiID4KLQotPCEtLSBUaGUgZnJhbWUgYXR0cmlidXRlIHNwZWNpZmllcyB3aGljaCBwYXJ0cyBvZiB0aGUgZnJhbWUgYXJvdW5kCi0gICAgIHRoZSB0YWJsZSBzaG91bGQgYmUgcmVuZGVyZWQuIFRoZSB2YWx1ZXMgYXJlIG5vdCB0aGUgc2FtZSBhcwotICAgICBDQUxTIHRvIGF2b2lkIGEgbmFtZSBjbGFzaCB3aXRoIHRoZSB2YWxpZ24gYXR0cmlidXRlLgotLS0+Ci08IUVOVElUWSAlIGZyYW1lLmF0dHJpYgotICAgICAiZnJhbWUgICAgICAgICggdm9pZAotICAgICAgICAgICAgICAgICAgIHwgYWJvdmUKLSAgICAgICAgICAgICAgICAgICB8IGJlbG93Ci0gICAgICAgICAgICAgICAgICAgfCBoc2lkZXMKLSAgICAgICAgICAgICAgICAgICB8IGxocwotICAgICAgICAgICAgICAgICAgIHwgcmhzCi0gICAgICAgICAgICAgICAgICAgfCB2c2lkZXMKLSAgICAgICAgICAgICAgICAgICB8IGJveAotICAgICAgICAgICAgICAgICAgIHwgYm9yZGVyICkgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCEtLSBUaGUgcnVsZXMgYXR0cmlidXRlIGRlZmluZXMgd2hpY2ggcnVsZXMgdG8gZHJhdyBiZXR3ZWVuIGNlbGxzOgotCi0gICAgIElmIHJ1bGVzIGlzIGFic2VudCB0aGVuIGFzc3VtZToKLQotICAgICAgICJub25lIiBpZiBib3JkZXIgaXMgYWJzZW50IG9yIGJvcmRlcj0iMCIgb3RoZXJ3aXNlICJhbGwiCi0tLT4KLTwhRU5USVRZICUgcnVsZXMuYXR0cmliCi0gICAgICJydWxlcyAgICAgICAgKCBub25lCi0gICAgICAgICAgICAgICAgICAgfCBncm91cHMKLSAgICAgICAgICAgICAgICAgICB8IHJvd3MKLSAgICAgICAgICAgICAgICAgICB8IGNvbHMKLSAgICAgICAgICAgICAgICAgICB8IGFsbCApICAgICAgICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cwotLS0+Ci08IUVOVElUWSAlIENlbGxIQWxpZ24uYXR0cmliCi0gICAgICJhbGlnbiAgICAgICAgKCBsZWZ0Ci0gICAgICAgICAgICAgICAgICAgfCBjZW50ZXIKLSAgICAgICAgICAgICAgICAgICB8IHJpZ2h0Ci0gICAgICAgICAgICAgICAgICAgfCBqdXN0aWZ5Ci0gICAgICAgICAgICAgICAgICAgfCBjaGFyICkgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjaGFyICAgICAgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICBjaGFyb2ZmICAgICAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVEIgotPgotCi08IS0tIHZlcnRpY2FsIGFsaWdubWVudCBhdHRyaWJ1dGUgZm9yIGNlbGwgY29udGVudHMKLS0tPgotPCFFTlRJVFkgJSBDZWxsVkFsaWduLmF0dHJpYgotICAgICAidmFsaWduICAgICAgICggdG9wCi0gICAgICAgICAgICAgICAgICAgfCBtaWRkbGUKLSAgICAgICAgICAgICAgICAgICB8IGJvdHRvbQotICAgICAgICAgICAgICAgICAgIHwgYmFzZWxpbmUgKSAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCEtLSBzY29wZSBpcyBzaW1wbGVyIHRoYW4gYXhlcyBhdHRyaWJ1dGUgZm9yIGNvbW1vbiB0YWJsZXMKLS0tPgotPCFFTlRJVFkgJSBzY29wZS5hdHRyaWIKLSAgICAgInNjb3BlICAgICAgICAoIHJvdwotICAgICAgICAgICAgICAgICAgIHwgY29sCi0gICAgICAgICAgICAgICAgICAgfCByb3dncm91cAotICAgICAgICAgICAgICAgICAgIHwgY29sZ3JvdXAgKSAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCEtLSB0YWJsZTogVGFibGUgRWxlbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdGFibGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0YWJsZS5lbGVtZW50O1sKLTwhRU5USVRZICUgdGFibGUuY29udGVudAotICAgICAiKCAlY2FwdGlvbi5xbmFtZTs/LCAoICVjb2wucW5hbWU7KiB8ICVjb2xncm91cC5xbmFtZTsqICksCi0gICAgICAoKCAldGhlYWQucW5hbWU7PywgJXRmb290LnFuYW1lOz8sICV0Ym9keS5xbmFtZTsrICkgfCAoICV0ci5xbmFtZTsrICkpKSIKLT4KLTwhRUxFTUVOVCAldGFibGUucW5hbWU7ICAldGFibGUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGFibGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0YWJsZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRhYmxlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0YWJsZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgc3VtbWFyeSAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotICAgICAgd2lkdGggICAgICAgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgYm9yZGVyICAgICAgICVQaXhlbHMuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgJWZyYW1lLmF0dHJpYjsKLSAgICAgICVydWxlcy5hdHRyaWI7Ci0gICAgICBjZWxsc3BhY2luZyAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBjZWxscGFkZGluZyAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiB0YWJsZS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGNhcHRpb246IFRhYmxlIENhcHRpb24gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBjYXB0aW9uLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslY2FwdGlvbi5lbGVtZW50O1sKLTwhRU5USVRZICUgY2FwdGlvbi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJWNhcHRpb24ucW5hbWU7ICAlY2FwdGlvbi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBjYXB0aW9uLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgY2FwdGlvbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWNhcHRpb24uYXR0bGlzdDtbCi08IUFUVExJU1QgJWNhcHRpb24ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGNhcHRpb24uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0aGVhZDogVGFibGUgSGVhZGVyIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVXNlIHRoZWFkIHRvIGR1cGxpY2F0ZSBoZWFkZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBoZWFkZXJzIHdoZW4KLSAgICAgdGJvZHkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLS0tPgotCi08IUVOVElUWSAlIHRoZWFkLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGhlYWQuZWxlbWVudDtbCi08IUVOVElUWSAlIHRoZWFkLmNvbnRlbnQgICIoICV0ci5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAldGhlYWQucW5hbWU7ICAldGhlYWQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGhlYWQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0aGVhZC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRoZWFkLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0aGVhZC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgJUNlbGxIQWxpZ24uYXR0cmliOwotICAgICAgJUNlbGxWQWxpZ24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdGhlYWQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0Zm9vdDogVGFibGUgRm9vdGVyIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVXNlIHRmb290IHRvIGR1cGxpY2F0ZSBmb290ZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBmb290ZXJzIHdoZW4KLSAgICAgdGJvZHkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLS0tPgotCi08IUVOVElUWSAlIHRmb290LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGZvb3QuZWxlbWVudDtbCi08IUVOVElUWSAlIHRmb290LmNvbnRlbnQgICIoICV0ci5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAldGZvb3QucW5hbWU7ICAldGZvb3QuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGZvb3QuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0Zm9vdC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRmb290LmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0Zm9vdC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgJUNlbGxIQWxpZ24uYXR0cmliOwotICAgICAgJUNlbGxWQWxpZ24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdGZvb3QuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0Ym9keTogVGFibGUgQm9keSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVXNlIG11bHRpcGxlIHRib2R5IHNlY3Rpb25zIHdoZW4gcnVsZXMgYXJlIG5lZWRlZAotICAgICBiZXR3ZWVuIGdyb3VwcyBvZiB0YWJsZSByb3dzLgotLS0+Ci0KLTwhRU5USVRZICUgdGJvZHkuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0Ym9keS5lbGVtZW50O1sKLTwhRU5USVRZICUgdGJvZHkuY29udGVudCAgIiggJXRyLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICV0Ym9keS5xbmFtZTsgICV0Ym9keS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0Ym9keS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRib2R5LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGJvZHkuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRib2R5LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0Ym9keS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGNvbGdyb3VwOiBUYWJsZSBDb2x1bW4gR3JvdXAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBjb2xncm91cCBncm91cHMgYSBzZXQgb2YgY29sIGVsZW1lbnRzLiBJdCBhbGxvd3MgeW91Ci0gICAgIHRvIGdyb3VwIHNldmVyYWwgc2VtYW50aWNhbGx5LXJlbGF0ZWQgY29sdW1ucyB0b2dldGhlci4KLS0tPgotCi08IUVOVElUWSAlIGNvbGdyb3VwLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslY29sZ3JvdXAuZWxlbWVudDtbCi08IUVOVElUWSAlIGNvbGdyb3VwLmNvbnRlbnQgICIoICVjb2wucW5hbWU7ICkqIiA+Ci08IUVMRU1FTlQgJWNvbGdyb3VwLnFuYW1lOyAgJWNvbGdyb3VwLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGNvbGdyb3VwLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgY29sZ3JvdXAuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVjb2xncm91cC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlY29sZ3JvdXAucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHNwYW4gICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICB3aWR0aCAgICAgICAgJU11bHRpTGVuZ3RoLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBjb2xncm91cC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGNvbDogVGFibGUgQ29sdW1uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBjb2wgZWxlbWVudHMgZGVmaW5lIHRoZSBhbGlnbm1lbnQgcHJvcGVydGllcyBmb3IKLSAgICAgY2VsbHMgaW4gb25lIG9yIG1vcmUgY29sdW1ucy4KLQotICAgICBUaGUgd2lkdGggYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlCi0gICAgIGNvbHVtbnMsIGUuZy4KLQotICAgICAgIHdpZHRoPSI2NCIgICAgICAgIHdpZHRoIGluIHNjcmVlbiBwaXhlbHMKLSAgICAgICB3aWR0aD0iMC41KiIgICAgICByZWxhdGl2ZSB3aWR0aCBvZiAwLjUKLQotICAgICBUaGUgc3BhbiBhdHRyaWJ1dGUgY2F1c2VzIHRoZSBhdHRyaWJ1dGVzIG9mIG9uZQotICAgICBjb2wgZWxlbWVudCB0byBhcHBseSB0byBtb3JlIHRoYW4gb25lIGNvbHVtbi4KLS0tPgotCi08IUVOVElUWSAlIGNvbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWNvbC5lbGVtZW50O1sKLTwhRU5USVRZICUgY29sLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTEVNRU5UICVjb2wucW5hbWU7ICAlY29sLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGNvbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGNvbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWNvbC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlY29sLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBzcGFuICAgICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICcxJwotICAgICAgd2lkdGggICAgICAgICVNdWx0aUxlbmd0aC5kYXRhdHlwZTsgICAjSU1QTElFRAotICAgICAgJUNlbGxIQWxpZ24uYXR0cmliOwotICAgICAgJUNlbGxWQWxpZ24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgY29sLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdHI6IFRhYmxlIFJvdyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHRyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldHIuZWxlbWVudDtbCi08IUVOVElUWSAlIHRyLmNvbnRlbnQgICIoICV0aC5xbmFtZTsgfCAldGQucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJXRyLnFuYW1lOyAgJXRyLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdHIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0ci5hdHRsaXN0O1sKLTwhQVRUTElTVCAldHIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdGg6IFRhYmxlIEhlYWRlciBDZWxsIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIHRoIGlzIGZvciBoZWFkZXIgY2VsbHMsIHRkIGZvciBkYXRhLAotICAgICBidXQgZm9yIGNlbGxzIGFjdGluZyBhcyBib3RoIHVzZSB0ZAotLS0+Ci0KLTwhRU5USVRZICUgdGguZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0aC5lbGVtZW50O1sKLTwhRU5USVRZICUgdGguY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAldGgucW5hbWU7ICAldGguY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGguZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0aC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRoLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0aC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgYWJiciAgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotICAgICAgYXhpcyAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgaGVhZGVycyAgICAgIElEUkVGUyAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgJXNjb3BlLmF0dHJpYjsKLSAgICAgIHJvd3NwYW4gICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICBjb2xzcGFuICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICcxJwotICAgICAgJUNlbGxIQWxpZ24uYXR0cmliOwotICAgICAgJUNlbGxWQWxpZ24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdGguYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0ZDogVGFibGUgRGF0YSBDZWxsIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdGQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0ZC5lbGVtZW50O1sKLTwhRU5USVRZICUgdGQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAldGQucW5hbWU7ICAldGQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0ZC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRkLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0ZC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgYWJiciAgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotICAgICAgYXhpcyAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgaGVhZGVycyAgICAgIElEUkVGUyAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgJXNjb3BlLmF0dHJpYjsKLSAgICAgIHJvd3NwYW4gICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICBjb2xzcGFuICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICcxJwotICAgICAgJUNlbGxIQWxpZ24uYXR0cmliOwotICAgICAgJUNlbGxWQWxpZ24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdGQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtdGFibGUtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBGb3JtcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1mb3JtLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWZvcm0ubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtZm9ybS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEZvcm1zIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWZvcm0tMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgRm9ybXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtZm9ybS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBGb3JtcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWZvcm0tMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gRm9ybXMKLQotICAgICAgICBmb3JtLCBsYWJlbCwgaW5wdXQsIHNlbGVjdCwgb3B0Z3JvdXAsIG9wdGlvbiwKLSAgICAgICAgdGV4dGFyZWEsIGZpZWxkc2V0LCBsZWdlbmQsIGJ1dHRvbgotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIG1hcmt1cCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIG9ubGluZQotICAgICBmb3JtcywgYmFzZWQgb24gdGhlIGZlYXR1cmVzIGZvdW5kIGluIEhUTUwgNC4wIGZvcm1zLgotLS0+Ci0KLTwhLS0gZGVjbGFyZSBxdWFsaWZpZWQgZWxlbWVudCB0eXBlIG5hbWVzOgotLS0+Ci08IUVOVElUWSAlIGZvcm0ucW5hbWUgICJmb3JtIiA+Ci08IUVOVElUWSAlIGxhYmVsLnFuYW1lICAibGFiZWwiID4KLTwhRU5USVRZICUgaW5wdXQucW5hbWUgICJpbnB1dCIgPgotPCFFTlRJVFkgJSBzZWxlY3QucW5hbWUgICJzZWxlY3QiID4KLTwhRU5USVRZICUgb3B0Z3JvdXAucW5hbWUgICJvcHRncm91cCIgPgotPCFFTlRJVFkgJSBvcHRpb24ucW5hbWUgICJvcHRpb24iID4KLTwhRU5USVRZICUgdGV4dGFyZWEucW5hbWUgICJ0ZXh0YXJlYSIgPgotPCFFTlRJVFkgJSBmaWVsZHNldC5xbmFtZSAgImZpZWxkc2V0IiA+Ci08IUVOVElUWSAlIGxlZ2VuZC5xbmFtZSAgImxlZ2VuZCIgPgotPCFFTlRJVFkgJSBidXR0b24ucW5hbWUgICJidXR0b24iID4KLQotPCEtLSAlQmxrTm9Gb3JtLm1peDsgaW5jbHVkZXMgYWxsIG5vbi1mb3JtIGJsb2NrIGVsZW1lbnRzLAotICAgICBwbHVzICVNaXNjLmNsYXNzOwotLS0+Ci08IUVOVElUWSAlIEJsa05vRm9ybS5taXgKLSAgICAgIiVIZWFkaW5nLmNsYXNzOwotICAgICAgfCAlTGlzdC5jbGFzczsKLSAgICAgIHwgJUJsa1N0cnVjdC5jbGFzczsKLSAgICAgICVCbGtQaHJhcy5jbGFzczsKLSAgICAgICVCbGtQcmVzLmNsYXNzOwotICAgICAgJVRhYmxlLmNsYXNzOwotICAgICAgJUJsb2NrLmV4dHJhOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IS0tIGZvcm06IEZvcm0gRWxlbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBmb3JtLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZm9ybS5lbGVtZW50O1sKLTwhRU5USVRZICUgZm9ybS5jb250ZW50Ci0gICAgICIoICVCbGtOb0Zvcm0ubWl4OwotICAgICAgfCAlZmllbGRzZXQucW5hbWU7ICkrIgotPgotPCFFTEVNRU5UICVmb3JtLnFuYW1lOyAgJWZvcm0uY29udGVudDsgPgotPCEtLSBlbmQgb2YgZm9ybS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGZvcm0uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVmb3JtLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVmb3JtLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBhY3Rpb24gICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgbWV0aG9kICAgICAgICggZ2V0IHwgcG9zdCApICAgICAgICAgICAnZ2V0JwotICAgICAgZW5jdHlwZSAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJwotICAgICAgYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzLmRhdGF0eXBlOyAgICAjSU1QTElFRAotICAgICAgYWNjZXB0ICAgICAgICVDb250ZW50VHlwZXMuZGF0YXR5cGU7ICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgZm9ybS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGxhYmVsOiBGb3JtIEZpZWxkIExhYmVsIFRleHQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBFYWNoIGxhYmVsIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIE9ORSBmaWVsZAotLS0+Ci0KLTwhRU5USVRZICUgbGFiZWwuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVsYWJlbC5lbGVtZW50O1sKLTwhRU5USVRZICUgbGFiZWwuY29udGVudAotICAgICAiKCAjUENEQVRBCi0gICAgICB8ICVpbnB1dC5xbmFtZTsgfCAlc2VsZWN0LnFuYW1lOyB8ICV0ZXh0YXJlYS5xbmFtZTsgfCAlYnV0dG9uLnFuYW1lOwotICAgICAgfCAlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUkxOG4uY2xhc3M7Ci0gICAgICAlSW5sUHJlcy5jbGFzczsKLSAgICAgICVBbmNob3IuY2xhc3M7Ci0gICAgICAlSW5sU3BlY2lhbC5jbGFzczsKLSAgICAgICVJbmxpbmUuZXh0cmE7Ci0gICAgICAlTWlzYy5jbGFzczsgKSoiCi0+Ci08IUVMRU1FTlQgJWxhYmVsLnFuYW1lOyAgJWxhYmVsLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGxhYmVsLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbGFiZWwuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVsYWJlbC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbGFiZWwucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGZvciAgICAgICAgICBJRFJFRiAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGxhYmVsLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gaW5wdXQ6IEZvcm0gQ29udHJvbCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGlucHV0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaW5wdXQuZWxlbWVudDtbCi08IUVOVElUWSAlIGlucHV0LmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTEVNRU5UICVpbnB1dC5xbmFtZTsgICVpbnB1dC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBpbnB1dC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGlucHV0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaW5wdXQuYXR0bGlzdDtbCi08IUVOVElUWSAlIElucHV0VHlwZS5jbGFzcwotICAgICAiKCB0ZXh0IHwgcGFzc3dvcmQgfCBjaGVja2JveCB8IHJhZGlvIHwgc3VibWl0Ci0gICAgICB8IHJlc2V0IHwgZmlsZSB8IGhpZGRlbiB8IGltYWdlIHwgYnV0dG9uICkiCi0+Ci08IS0tIGF0dHJpYnV0ZSAnbmFtZScgcmVxdWlyZWQgZm9yIGFsbCBidXQgc3VibWl0ICYgcmVzZXQKLS0tPgotPCFBVFRMSVNUICVpbnB1dC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgdHlwZSAgICAgICAgICVJbnB1dFR5cGUuY2xhc3M7ICAgICAgICAndGV4dCcKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHZhbHVlICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNoZWNrZWQgICAgICAoIGNoZWNrZWQgKSAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGRpc2FibGVkICAgICAoIGRpc2FibGVkICkgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHJlYWRvbmx5ICAgICAoIHJlYWRvbmx5ICkgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHNpemUgICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG1heGxlbmd0aCAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIHNyYyAgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGFsdCAgICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIGFjY2VwdCAgICAgICAlQ29udGVudFR5cGVzLmRhdGF0eXBlOyAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGlucHV0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gc2VsZWN0OiBPcHRpb24gU2VsZWN0b3IgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHNlbGVjdC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXNlbGVjdC5lbGVtZW50O1sKLTwhRU5USVRZICUgc2VsZWN0LmNvbnRlbnQKLSAgICAgIiggJW9wdGdyb3VwLnFuYW1lOyB8ICVvcHRpb24ucW5hbWU7ICkrIgotPgotPCFFTEVNRU5UICVzZWxlY3QucW5hbWU7ICAlc2VsZWN0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHNlbGVjdC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHNlbGVjdC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXNlbGVjdC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc2VsZWN0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBzaXplICAgICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBtdWx0aXBsZSAgICAgKCBtdWx0aXBsZSApICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBkaXNhYmxlZCAgICAgKCBkaXNhYmxlZCApICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB0YWJpbmRleCAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBzZWxlY3QuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBvcHRncm91cDogT3B0aW9uIEdyb3VwIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgb3B0Z3JvdXAuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVvcHRncm91cC5lbGVtZW50O1sKLTwhRU5USVRZICUgb3B0Z3JvdXAuY29udGVudCAgIiggJW9wdGlvbi5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAlb3B0Z3JvdXAucW5hbWU7ICAlb3B0Z3JvdXAuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygb3B0Z3JvdXAuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBvcHRncm91cC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJW9wdGdyb3VwLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVvcHRncm91cC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgZGlzYWJsZWQgICAgICggZGlzYWJsZWQgKSAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgbGFiZWwgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjUkVRVUlSRUQKLT4KLTwhLS0gZW5kIG9mIG9wdGdyb3VwLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gb3B0aW9uOiBTZWxlY3RhYmxlIENob2ljZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIG9wdGlvbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW9wdGlvbi5lbGVtZW50O1sKLTwhRU5USVRZICUgb3B0aW9uLmNvbnRlbnQgICIoICNQQ0RBVEEgKSIgPgotPCFFTEVNRU5UICVvcHRpb24ucW5hbWU7ICAlb3B0aW9uLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG9wdGlvbi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIG9wdGlvbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJW9wdGlvbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlb3B0aW9uLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBzZWxlY3RlZCAgICAgKCBzZWxlY3RlZCApICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBkaXNhYmxlZCAgICAgKCBkaXNhYmxlZCApICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBsYWJlbCAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICB2YWx1ZSAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBvcHRpb24uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0ZXh0YXJlYTogTXVsdGktTGluZSBUZXh0IEZpZWxkIC4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdGV4dGFyZWEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0ZXh0YXJlYS5lbGVtZW50O1sKLTwhRU5USVRZICUgdGV4dGFyZWEuY29udGVudCAgIiggI1BDREFUQSApIiA+Ci08IUVMRU1FTlQgJXRleHRhcmVhLnFuYW1lOyAgJXRleHRhcmVhLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRleHRhcmVhLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGV4dGFyZWEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0ZXh0YXJlYS5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGV4dGFyZWEucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHJvd3MgICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI1JFUVVJUkVECi0gICAgICBjb2xzICAgICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNSRVFVSVJFRAotICAgICAgZGlzYWJsZWQgICAgICggZGlzYWJsZWQgKSAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgcmVhZG9ubHkgICAgICggcmVhZG9ubHkgKSAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdGFiaW5kZXggICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgdGV4dGFyZWEuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBmaWVsZHNldDogRm9ybSBDb250cm9sIEdyb3VwIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gI1BDREFUQSBpcyB0byBzb2x2ZSB0aGUgbWl4ZWQgY29udGVudCBwcm9ibGVtLAotICAgICBwZXIgc3BlY2lmaWNhdGlvbiBvbmx5IHdoaXRlc3BhY2UgaXMgYWxsb3dlZAotLS0+Ci0KLTwhRU5USVRZICUgZmllbGRzZXQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVmaWVsZHNldC5lbGVtZW50O1sKLTwhRU5USVRZICUgZmllbGRzZXQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJWxlZ2VuZC5xbmFtZTsgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTEVNRU5UICVmaWVsZHNldC5xbmFtZTsgICVmaWVsZHNldC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBmaWVsZHNldC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGZpZWxkc2V0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZmllbGRzZXQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWZpZWxkc2V0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBmaWVsZHNldC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGxlZ2VuZDogRmllbGRzZXQgTGVnZW5kIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBsZWdlbmQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVsZWdlbmQuZWxlbWVudDtbCi08IUVOVElUWSAlIGxlZ2VuZC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJWxlZ2VuZC5xbmFtZTsgICVsZWdlbmQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgbGVnZW5kLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbGVnZW5kLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbGVnZW5kLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVsZWdlbmQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGxlZ2VuZC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGJ1dHRvbjogUHVzaCBCdXR0b24gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBidXR0b24uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVidXR0b24uZWxlbWVudDtbCi08IUVOVElUWSAlIGJ1dHRvbi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEKLSAgICAgIHwgJUJsa05vRm9ybS5taXg7Ci0gICAgICB8ICVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICAlSW5sUHJlcy5jbGFzczsKLSAgICAgICVJMThuLmNsYXNzOwotICAgICAgJUlubFNwZWNpYWwuY2xhc3M7Ci0gICAgICAlSW5saW5lLmV4dHJhOyApKiIKLT4KLTwhRUxFTUVOVCAlYnV0dG9uLnFuYW1lOyAgJWJ1dHRvbi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBidXR0b24uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBidXR0b24uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVidXR0b24uYXR0bGlzdDtbCi08IUFUVExJU1QgJWJ1dHRvbi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdmFsdWUgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdHlwZSAgICAgICAgICggYnV0dG9uIHwgc3VibWl0IHwgcmVzZXQgKSAnc3VibWl0JwotICAgICAgZGlzYWJsZWQgICAgICggZGlzYWJsZWQgKSAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdGFiaW5kZXggICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgYnV0dG9uLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWZvcm0tMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBMZWdhY3kgTWFya3VwIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1sZWdhY3kubW9kdWxlICJJR05PUkUiID4KLTwhWyV4aHRtbC1sZWdhY3kubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtbGVnYWN5Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTGVnYWN5IE1hcmt1cCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1sZWdhY3ktMS5tb2QiID4KLSV4aHRtbC1sZWdhY3kubW9kO11dPgotCi08IS0tIERvY3VtZW50IFN0cnVjdHVyZSBNb2R1bGUgKHJlcXVpcmVkKSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXN0cnVjdC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1zdHJ1Y3QubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtc3RydWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRG9jdW1lbnQgU3RydWN0dXJlIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXN0cnVjdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBTdHJ1Y3R1cmUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1zdHJ1Y3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRG9jdW1lbnQgU3RydWN0dXJlIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc3RydWN0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIERvY3VtZW50IFN0cnVjdHVyZQotCi0gICAgICAgIHRpdGxlLCBoZWFkLCBib2R5LCBodG1sCi0KLSAgICAgVGhlIFN0cnVjdHVyZSBNb2R1bGUgZGVmaW5lcyB0aGUgbWFqb3Igc3RydWN0dXJhbCBlbGVtZW50cyBhbmQKLSAgICAgdGhlaXIgYXR0cmlidXRlcy4KLQotICAgICBOb3RlIHRoYXQgdGhlIGNvbnRlbnQgbW9kZWwgb2YgdGhlIGhlYWQgZWxlbWVudCB0eXBlIGlzIHJlZGVjbGFyZWQKLSAgICAgd2hlbiB0aGUgQmFzZSBNb2R1bGUgaXMgaW5jbHVkZWQgaW4gdGhlIERURC4KLQotICAgICBUaGUgcGFyYW1ldGVyIGVudGl0eSBjb250YWluaW5nIHRoZSBYTUwgbmFtZXNwYWNlIFVSSSB2YWx1ZSB1c2VkCi0gICAgIGZvciBYSFRNTCBpcyAnJVhIVE1MLnhtbG5zOycsIGRlZmluZWQgaW4gdGhlIFF1YWxpZmllZCBOYW1lcyBtb2R1bGUuCi0tLT4KLQotPCEtLSB0aXRsZTogRG9jdW1lbnQgVGl0bGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVGhlIHRpdGxlIGVsZW1lbnQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgZmxvdyBvZiB0ZXh0LgotICAgICBJdCBzaG91bGQgYmUgZGlzcGxheWVkLCBmb3IgZXhhbXBsZSBhcyB0aGUgcGFnZSBoZWFkZXIgb3IKLSAgICAgd2luZG93IHRpdGxlLiBFeGFjdGx5IG9uZSB0aXRsZSBpcyByZXF1aXJlZCBwZXIgZG9jdW1lbnQuCi0tLT4KLQotPCFFTlRJVFkgJSB0aXRsZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRpdGxlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0aXRsZS5jb250ZW50ICAiKCAjUENEQVRBICkiID4KLTwhRU5USVRZICUgdGl0bGUucW5hbWUgICJ0aXRsZSIgPgotPCFFTEVNRU5UICV0aXRsZS5xbmFtZTsgICV0aXRsZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0aXRsZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRpdGxlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGl0bGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRpdGxlLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRpdGxlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gaGVhZDogRG9jdW1lbnQgSGVhZCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGhlYWQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoZWFkLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoZWFkLmNvbnRlbnQKLSAgICAiKCAlSGVhZE9wdHMubWl4OywgJXRpdGxlLnFuYW1lOywgJUhlYWRPcHRzLm1peDsgKSIKLT4KLTwhRU5USVRZICUgaGVhZC5xbmFtZSAgImhlYWQiID4KLTwhRUxFTUVOVCAlaGVhZC5xbmFtZTsgICVoZWFkLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGhlYWQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoZWFkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaGVhZC5hdHRsaXN0O1sKLTwhLS0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2Ugd2l0aCBkb2N1bWVudCBwcm9maWxlcwotLS0+Ci08IUVOVElUWSAlIHByb2ZpbGUuYXR0cmliCi0gICAgICJwcm9maWxlICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICclWEhUTUwucHJvZmlsZTsnIgotPgotCi08IUFUVExJU1QgJWhlYWQucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotICAgICAgJXByb2ZpbGUuYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaGVhZC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGJvZHk6IERvY3VtZW50IEJvZHkgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBib2R5LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYm9keS5lbGVtZW50O1sKLTwhRU5USVRZICUgYm9keS5jb250ZW50Ci0gICAgICIoICVCbG9jay5taXg7ICkrIgotPgotPCFFTlRJVFkgJSBib2R5LnFuYW1lICAiYm9keSIgPgotPCFFTEVNRU5UICVib2R5LnFuYW1lOyAgJWJvZHkuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYm9keS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJvZHkuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVib2R5LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVib2R5LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBib2R5LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gaHRtbDogWEhUTUwgRG9jdW1lbnQgRWxlbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGh0bWwuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVodG1sLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgICIoICVoZWFkLnFuYW1lOywgJWJvZHkucW5hbWU7ICkiID4KLTwhRU5USVRZICUgaHRtbC5xbmFtZSAgImh0bWwiID4KLTwhRUxFTUVOVCAlaHRtbC5xbmFtZTsgICVodG1sLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGh0bWwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBodG1sLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaHRtbC5hdHRsaXN0O1sKLTwhLS0gdmVyc2lvbiBhdHRyaWJ1dGUgdmFsdWUgZGVmaW5lZCBpbiBkcml2ZXIKLS0tPgotPCFFTlRJVFkgJSBYSFRNTC52ZXJzaW9uLmF0dHJpYgotICAgICAidmVyc2lvbiAgICAgICVGUEkuZGF0YXR5cGU7ICAgICAgICAgICAjRklYRUQgJyVYSFRNTC52ZXJzaW9uOyciCi0+Ci0KLTwhLS0gc2VlIHRoZSBRdWFsaWZpZWQgTmFtZXMgbW9kdWxlIGZvciBpbmZvcm1hdGlvbgotICAgICBvbiBob3cgdG8gZXh0ZW5kIFhIVE1MIHVzaW5nIFhNTCBuYW1lc3BhY2VzCi0tLT4KLTwhQVRUTElTVCAlaHRtbC5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAlWEhUTUwudmVyc2lvbi5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBodG1sLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXN0cnVjdC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIGVuZCBvZiBYSFRNTCAxLjEgRFREICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzQ1NzBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWRvY3VtZW50VHlwZS5kaXNwbGF5TmFtZS4wID0gWEhUTUwgMS4wIFN0cmljdAotZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjEgPSBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsCi1kb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuMiA9IFhIVE1MIDEuMCBGcmFtZXNldAotZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjMgPSBYSFRNTCBCYXNpYyAxLjAKLWRvY3VtZW50VHlwZS5kaXNwbGF5TmFtZS40ID0gWEhUTUwgMS4xCi1kb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuNSA9IFhIVE1MIE1QIDEuMAotZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjYgPSBXTUwgMS4zCi1CdW5kbGUtTmFtZS4wID0gU3RhbmRhcmQgU2NoZW1hcyBhbmQgRFREcwotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwM2E5ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0KLSAgICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICAgPCEtLSBDYXRhbG9nIENvbnRyaWJ1dGlvbnMgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gUmVnaXN0ZXIgd2VsbCBrbm93biBXZWIgRFREcyBhbmQgWFNEcyAgICAtLT4KLSAgICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLSAgICA8IS0tIG5ldyBmb3JtIC0tPgotCi0gICAgPCEtLSAKLSAgICAgICAgU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDA0ODEKLSAgICAgICAgeW91IG1heSBoYXZlIHRvIGNvbW1lbnQgb3V0IGZvbGxvd2luZyBleHRlbnNpb24gaWYgdXNlZCAKLSAgICAgICAgaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuIAotICAgICAgICAKLSAgICAtLT4KLQotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jYXRhbG9nQ29udHJpYnV0aW9ucyI+Ci0gICAgICAgIDxjYXRhbG9nQ29udHJpYnV0aW9uIGlkPSJkZWZhdWx0Ij4KLQotCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1dBUEZPUlVNLy9EVEQgV01MIDEuMS8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzL3dtbDExLmR0ZCI+Ci0gICAgICAgICAgICA8L3B1YmxpYz4KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHMveGh0bWwxLXN0cmljdC5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLSAgICAgICAgICAgIDwvcHVibGljPgotCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkcy94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotICAgICAgICAgICAgPC9wdWJsaWM+Ci0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBGcmFtZXNldC8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzL3hodG1sMS1mcmFtZXNldC5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1mcmFtZXNldC5kdGQiPgotICAgICAgICAgICAgPC9wdWJsaWM+Ci0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgQmFzaWMgMS4wLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHMveGh0bWwtYmFzaWMxMC1mLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLWJhc2ljL3hodG1sLWJhc2ljMTAuZHRkIj4KLSAgICAgICAgICAgIDwvcHVibGljPgotCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzL3hodG1sMTEtZmxhdC5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDExL0RURC94aHRtbDExLmR0ZCI+Ci0gICAgICAgICAgICA8L3B1YmxpYz4KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAxLjAvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkcy94aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC94aHRtbC1tb2JpbGUxMC5kdGQiPgotICAgICAgICAgICAgPC9wdWJsaWM+Ci0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vV0FQRk9SVU0vL0RURCBXTUwgMS4zLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHMvd21sMTMuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3dtbDEzLmR0ZCI+Ci0gICAgICAgICAgICA8L3B1YmxpYz4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzL2ZyYW1lc2V0LmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2ZyYW1lc2V0LmR0ZCI+Ci0gICAgICAgICAgICA8L3B1YmxpYz4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9XM0MvL0VOVElUSUVTIExhdGluIDEvL0VOLy9IVE1MIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkcy9IVE1MbGF0MS5lbnQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJIVE1MbGF0MS5lbnQiPgotICAgICAgICAgICAgPC9wdWJsaWM+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9FTlRJVElFUyBTcGVjaWFsLy9FTi8vSFRNIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkcy9IVE1Mc3BlY2lhbC5lbnQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJIVE1Mc3BlY2lhbC5lbnQiPgotICAgICAgICAgICAgPC9wdWJsaWM+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzLy9FTi8vSFRNTCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHMvSFRNTHN5bWJvbC5lbnQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJIVE1Mc3ltYm9sLmVudCI+Ci0gICAgICAgICAgICA8L3B1YmxpYz4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHMvbG9vc2UuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLSAgICAgICAgICAgIDwvcHVibGljPgotICAgICAgICAKLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHMvc3RyaWN0LmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPgotICAgICAgICAgICAgPC9wdWJsaWM+Ci0KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgICAgICB1cmk9InhzZC93c2RsLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgICAgICAgICAgICAgIHVyaT0ieHNkL3NvYXAueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iCi0gICAgICAgICAgICAgICAgdXJpPSJ4c2QvaHR0cC54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIKLSAgICAgICAgICAgICAgICB1cmk9InhzZC93c2RsLW1pbWUueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHVyaT0ieHNkL3NvYXBlbmMueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9InVybjpvYXNpczpuYW1lczp0YzplbnRpdHk6eG1sbnM6eG1sOmNhdGFsb2ciCi0gICAgICAgICAgICAgICAgdXJpPSJ4c2QveG1sY2F0YWxvZzExLnhzZCIgLz4KLQotCi0gICAgICAgICAgICA8IS0tIHRoZXNlIGFyZSByZW1vdmVkIGZyb20gdGhlIGNhdGFsb2csIHNpbmNlIHRoZXkgYXJlIC1ub3QtIAotICAgICAgICAgICAgdGhlIHNhbWUgYXMgdGhvc2UgaW4gdGhlIHhzZC51aSBwbHVnaW4sIHdoaWNoIAotICAgICAgICAgICAgcG9pbnQgdG8gdGhlIG9yZy5lY2xpcHNlLnhzZCB2ZXJzaW9ucwotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvWE1MU2NoZW1hLmR0ZCIgLz4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDxzeXN0ZW0KLSAgICAgICAgICAgICAgICBzeXN0ZW1JZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMveG1sLnhzZCIgLz4KLSAgICAgICAgICAgICAtLT4KLSAgICAgICAgPC9jYXRhbG9nQ29udHJpYnV0aW9uPgotCi0gICAgPC9leHRlbnNpb24+Ci0KLQotCi0KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnRUeXBlcyI+Ci0gICAgICAgIDxkb2N1bWVudFR5cGUKLSAgICAgICAgICAgIGVsZW1lbnROYW1lPSJodG1sIgotICAgICAgICAgICAgZGlzcGxheU5hbWU9IiVkb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuMCIKLSAgICAgICAgICAgIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgICAgICAgIGlzWEhUTUw9InRydWUiCi0gICAgICAgICAgICBoYXNGcmFtZXNldD0iZmFsc2UiCi0gICAgICAgICAgICBwdWJsaWNJRD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgICAgICAgICBzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci0gICAgICAgIDwvZG9jdW1lbnRUeXBlPgotICAgICAgICA8ZG9jdW1lbnRUeXBlCi0gICAgICAgICAgICBlbGVtZW50TmFtZT0iaHRtbCIKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lPSIlZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjEiCi0gICAgICAgICAgICBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICAgICBpc1hIVE1MPSJ0cnVlIgotICAgICAgICAgICAgaGFzRnJhbWVzZXQ9ImZhbHNlIgotICAgICAgICAgICAgcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAgICAgZGVmYXVsdFhIVE1MPSJ0cnVlIgotICAgICAgICAgICAgc3lzdGVtSUQ9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotICAgICAgICA8L2RvY3VtZW50VHlwZT4KLSAgICAgICAgPGRvY3VtZW50VHlwZQotICAgICAgICAgICAgZWxlbWVudE5hbWU9Imh0bWwiCi0gICAgICAgICAgICBkaXNwbGF5TmFtZT0iJWRvY3VtZW50VHlwZS5kaXNwbGF5TmFtZS4yIgotICAgICAgICAgICAgbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgICAgICAgaXNYSFRNTD0idHJ1ZSIKLSAgICAgICAgICAgIGhhc0ZyYW1lc2V0PSJ0cnVlIgotICAgICAgICAgICAgcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBGcmFtZXNldC8vRU4iCi0gICAgICAgICAgICBzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtZnJhbWVzZXQuZHRkIj4KLSAgICAgICAgPC9kb2N1bWVudFR5cGU+Ci0gICAgICAgIDxkb2N1bWVudFR5cGUKLSAgICAgICAgICAgIGVsZW1lbnROYW1lPSJodG1sIgotICAgICAgICAgICAgZGlzcGxheU5hbWU9IiVkb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuMyIKLSAgICAgICAgICAgIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgICAgICAgIGlzWEhUTUw9InRydWUiCi0gICAgICAgICAgICBoYXNGcmFtZXNldD0iZmFsc2UiCi0gICAgICAgICAgICBwdWJsaWNJRD0iLS8vVzNDLy9EVEQgWEhUTUwgQmFzaWMgMS4wLy9FTiIKLSAgICAgICAgICAgIHN5c3RlbUlEPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1iYXNpYy94aHRtbC1iYXNpYzEwLmR0ZCI+Ci0gICAgICAgIDwvZG9jdW1lbnRUeXBlPgotICAgICAgICA8ZG9jdW1lbnRUeXBlCi0gICAgICAgICAgICBlbGVtZW50TmFtZT0iaHRtbCIKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lPSIlZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjQiCi0gICAgICAgICAgICBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICAgICBpc1hIVE1MPSJ0cnVlIgotICAgICAgICAgICAgaGFzRnJhbWVzZXQ9ImZhbHNlIgotICAgICAgICAgICAgcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iCi0gICAgICAgICAgICBzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPgotICAgICAgICA8L2RvY3VtZW50VHlwZT4KLSAgICAgICAgPGRvY3VtZW50VHlwZQotICAgICAgICAgICAgZWxlbWVudE5hbWU9Imh0bWwiCi0gICAgICAgICAgICBkaXNwbGF5TmFtZT0iJWRvY3VtZW50VHlwZS5kaXNwbGF5TmFtZS41IgotICAgICAgICAgICAgbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgICAgICAgaXNYSFRNTD0idHJ1ZSIKLSAgICAgICAgICAgIGhhc0ZyYW1lc2V0PSJmYWxzZSIKLSAgICAgICAgICAgIHB1YmxpY0lEPSItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAxLjAvL0VOIgotICAgICAgICAgICAgc3lzdGVtSUQ9Imh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC94aHRtbC1tb2JpbGUxMC5kdGQiPgotICAgICAgICA8L2RvY3VtZW50VHlwZT4KLSAgICAgICAgPGRvY3VtZW50VHlwZQotICAgICAgICAgICAgZWxlbWVudE5hbWU9IndtbCIKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lPSIlZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjYiCi0gICAgICAgICAgICBuYW1lc3BhY2VVUkk9IiIKLSAgICAgICAgICAgIGlzV01MPSJ0cnVlIgotICAgICAgICAgICAgaGFzRnJhbWVzZXQ9ImZhbHNlIgotICAgICAgICAgICAgcHVibGljSUQ9Ii0vL1dBUEZPUlVNLy9EVEQgV01MIDEuMy8vRU4iCi0gICAgICAgICAgICBkZWZhdWx0V01MPSJ0cnVlIgotICAgICAgICAgICAgc3lzdGVtSUQ9Imh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC93bWwxMy5kdGQiPgotICAgICAgICA8L2RvY3VtZW50VHlwZT4KLSAgICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC9odHRwLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL2h0dHAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTQ2NmY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL2h0dHAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAKLUNvcHlyaWdodCAyMDAxIC0gMjAwNSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgTWljcm9zb2Z0IENvcnBvcmF0aW9uCi1BbGwgUmlnaHRzIFJlc2VydmVkCi0KLUxpY2Vuc2UgZm9yIFdTREwgU2NoZW1hIEZpbGVzCi0KLVRoZSBBdXRob3JzIGdyYW50IHBlcm1pc3Npb24gdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgV1NETCBTY2hlbWEgCi1GaWxlcyBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgZmVlIG9yIHJveWFsdHkgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBhbmQgCi1saWNlbnNlIGFyZSBkaXN0cmlidXRlZCB3aXRoIHRoZW0uICBUaGUgb3JpZ2luYWxzIG9mIHRoZXNlIGZpbGVzIGNhbiAKLWJlIGxvY2F0ZWQgYXQ6Ci0KLWh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC93c2RsLWh0dHAueHNkCi0KLVRIRVNFIFNDSEVNQSBGSUxFUyBBUkUgUFJPVklERUQgIkFTIElTLCIgQU5EIFRIRSBBVVRIT1JTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIAotT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBSRUdBUkRJTkcgVEhFU0UgRklMRVMsIElOQ0xVRElORywgQlVUIE5PVCAKLUxJTUlURUQgVE8sIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgCi1OT04tSU5GUklOR0VNRU5UIE9SIFRJVExFLiAgVEhFIEFVVEhPUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCAKLUlORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBPUiAKLVJFTEFUSU5HIFRPIEFOWSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRVNFIEZJTEVTLgotCi1UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiB0aGUgQXV0aG9ycyBtYXkgTk9UIGJlIHVzZWQgaW4gYW55IG1hbm5lciwgCi1pbmNsdWRpbmcgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlc2UgZmlsZXMgb3IgYW55IHByb2dyYW0gCi1vciBzZXJ2aWNlIHRoYXQgdXNlcyB0aGVzZSBmaWxlcywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGl0bGUgdG8gY29weXJpZ2h0IAotaW4gdGhlc2UgZmlsZXMgd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggdGhlIEF1dGhvcnMuCi0KLU5vIG90aGVyIHJpZ2h0cyBhcmUgZ3JhbnRlZCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLgotCi0KLQotICAtLT4gCi08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIKLSAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyI+Ci0KLQk8aW1wb3J0IG5hbWVzcGFjZSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotCi0gICAJPGVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgdHlwZT0iaHR0cDphZGRyZXNzVHlwZSIvPgotCi0gICAJPGNvbXBsZXhUeXBlIG5hbWU9ImFkZHJlc3NUeXBlIj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQk8ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLQkJCTxzZXF1ZW5jZS8+Ci0KLSAgIAkJCTxhdHRyaWJ1dGUgbmFtZT0ibG9jYXRpb24iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLSAgIAk8L2NvbXBsZXhUeXBlPgotCi0gICAJPGVsZW1lbnQgbmFtZT0iYmluZGluZyIgdHlwZT0iaHR0cDpiaW5kaW5nVHlwZSIvPgotICAgCTxjb21wbGV4VHlwZSBuYW1lPSJiaW5kaW5nVHlwZSI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJPGV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0KLQkJCTxzZXF1ZW5jZS8+Ci0JICAgICAgCQk8YXR0cmlidXRlIG5hbWU9InZlcmIiIHR5cGU9Ik5NVE9LRU4iIHVzZT0icmVxdWlyZWQiLz4KLQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0gICAJPC9jb21wbGV4VHlwZT4KLQotICAgCTxlbGVtZW50IG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0iaHR0cDpvcGVyYXRpb25UeXBlIi8+Ci0gICAJPGNvbXBsZXhUeXBlIG5hbWU9Im9wZXJhdGlvblR5cGUiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0KLQkJPGV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0JCQk8c2VxdWVuY2UvPgotCSAgICAgIAkJPGF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0KLSAgIAk8ZWxlbWVudCBuYW1lPSJ1cmxFbmNvZGVkIj4KLSAgICAgIAkJPGNvbXBsZXhUeXBlLz4gIAkJCi0gICAJPC9lbGVtZW50PgotCi0gICAJPGVsZW1lbnQgbmFtZT0idXJsUmVwbGFjZW1lbnQiPgotICAgICAgCQk8Y29tcGxleFR5cGUvPgotICAgICAJPC9lbGVtZW50PgotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy94c2Qvc29hcC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC9zb2FwLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmODUyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC9zb2FwLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotIAotQ29weXJpZ2h0IDIwMDEgLSAyMDA1LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBNaWNyb3NvZnQgQ29ycG9yYXRpb24KLUFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotTGljZW5zZSBmb3IgV1NETCBTY2hlbWEgRmlsZXMKLQotVGhlIEF1dGhvcnMgZ3JhbnQgcGVybWlzc2lvbiB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBXU0RMIFNjaGVtYSAKLUZpbGVzIGluIGFueSBtZWRpdW0gd2l0aG91dCBmZWUgb3Igcm95YWx0eSBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGFuZCAKLWxpY2Vuc2UgYXJlIGRpc3RyaWJ1dGVkIHdpdGggdGhlbS4gIFRoZSBvcmlnaW5hbHMgb2YgdGhlc2UgZmlsZXMgY2FuIAotYmUgbG9jYXRlZCBhdDoKLQotaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLzIwMDMtMDItMTEueHNkCi0KLVRIRVNFIFNDSEVNQSBGSUxFUyBBUkUgUFJPVklERUQgIkFTIElTLCIgQU5EIFRIRSBBVVRIT1JTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIAotT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBSRUdBUkRJTkcgVEhFU0UgRklMRVMsIElOQ0xVRElORywgQlVUIE5PVCAKLUxJTUlURUQgVE8sIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgCi1OT04tSU5GUklOR0VNRU5UIE9SIFRJVExFLiAgVEhFIEFVVEhPUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCAKLUlORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBPUiAKLVJFTEFUSU5HIFRPIEFOWSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRVNFIEZJTEVTLgotCi1UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiB0aGUgQXV0aG9ycyBtYXkgTk9UIGJlIHVzZWQgaW4gYW55IG1hbm5lciwgCi1pbmNsdWRpbmcgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlc2UgZmlsZXMgb3IgYW55IHByb2dyYW0gCi1vciBzZXJ2aWNlIHRoYXQgdXNlcyB0aGVzZSBmaWxlcywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGl0bGUgdG8gY29weXJpZ2h0IAotaW4gdGhlc2UgZmlsZXMgd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggdGhlIEF1dGhvcnMuCi0KLU5vIG90aGVyIHJpZ2h0cyBhcmUgZ3JhbnRlZCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLgotCi0KLS0tPiAKLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiA+Ci0KLSAgPHhzOmltcG9ydCBuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIC8+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW5jb2RpbmdTdHlsZSIgPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAiZW5jb2RpbmdTdHlsZSIgaW5kaWNhdGVzIGFueSBjYW5vbmljYWxpemF0aW9uIGNvbnZlbnRpb25zIGZvbGxvd2VkIGluIHRoZSBjb250ZW50cyBvZiB0aGUgY29udGFpbmluZyBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIGluZGljYXRlcyB0aGUgcGF0dGVybiBkZXNjcmliZWQgaW4gU09BUCBzcGVjaWZpY2F0aW9uCi0gICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgPC94czphbm5vdGF0aW9uPgotCi0gICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOmFueVVSSSIgLz4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImJpbmRpbmciIHR5cGU9InNvYXA6dEJpbmRpbmciIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0QmluZGluZyIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJpbGl0eUVsZW1lbnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc3BvcnQiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdHlsZSIgdHlwZT0ic29hcDp0U3R5bGVDaG9pY2UiIHVzZT0ib3B0aW9uYWwiIC8+Ci0KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idFN0eWxlQ2hvaWNlIiA+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIgPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJycGMiIC8+Ci0gICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRvY3VtZW50IiAvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0ic29hcDp0T3BlcmF0aW9uIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idE9wZXJhdGlvbiIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJpbGl0eUVsZW1lbnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzb2FwQWN0aW9uIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0ib3B0aW9uYWwiIC8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3R5bGUiIHR5cGU9InNvYXA6dFN0eWxlQ2hvaWNlIiB1c2U9Im9wdGlvbmFsIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImJvZHkiIHR5cGU9InNvYXA6dEJvZHkiIC8+Ci0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJ0Qm9keUF0dHJpYnV0ZXMiID4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nU3R5bGUiIHR5cGU9InNvYXA6ZW5jb2RpbmdTdHlsZSIgdXNlPSJvcHRpb25hbCIgLz4JICAgCi0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UiIHR5cGU9InNvYXA6dXNlQ2hvaWNlIiB1c2U9Im9wdGlvbmFsIiAvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0ib3B0aW9uYWwiIC8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0Qm9keSIgPgotCi0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmlsaXR5RWxlbWVudCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InBhcnRzIiB0eXBlPSJ4czpOTVRPS0VOUyIgdXNlPSJvcHRpb25hbCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZiA9ICJzb2FwOnRCb2R5QXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIAotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ1c2VDaG9pY2UiID4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIiA+Ci0KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGl0ZXJhbCIgLz4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZW5jb2RlZCIgLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZmF1bHQiIHR5cGU9InNvYXA6dEZhdWx0IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idEZhdWx0UmVzIiBhYnN0cmFjdD0idHJ1ZSIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJzb2FwOnRCb2R5IiA+Ci0KLQkgICAgPHhzOmF0dHJpYnV0ZSByZWY9IndzZGw6cmVxdWlyZWQiIHVzZT0ib3B0aW9uYWwiIC8+IAotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InBhcnRzIiB0eXBlPSJ4czpOTVRPS0VOUyIgdXNlPSJwcm9oaWJpdGVkIiAvPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJzb2FwOnRCb2R5QXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4gIAkKLSAgPC94czpjb21wbGV4VHlwZT4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRGYXVsdCIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ic29hcDp0RmF1bHRSZXMiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLQotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotCi0gIDx4czplbGVtZW50IG5hbWU9ImhlYWRlciIgdHlwZT0ic29hcDp0SGVhZGVyIiAvPgotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0idEhlYWRlckF0dHJpYnV0ZXMiID4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzOlFOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icGFydCIgdHlwZT0ieHM6Tk1UT0tFTiIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZSIgdHlwZT0ic29hcDp1c2VDaG9pY2UiIHVzZT0icmVxdWlyZWQiIC8+Ci0KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nU3R5bGUiIHR5cGU9InNvYXA6ZW5jb2RpbmdTdHlsZSIgdXNlPSJvcHRpb25hbCIgLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIiB1c2U9Im9wdGlvbmFsIiAvPiAgICAgIAotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idEhlYWRlciIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJpbGl0eUVsZW1lbnQiID4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ic29hcDpoZWFkZXJmYXVsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLQotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJzb2FwOnRIZWFkZXJBdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJoZWFkZXJmYXVsdCIgdHlwZT0ic29hcDp0SGVhZGVyRmF1bHQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0SGVhZGVyRmF1bHQiID4KLQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJzb2FwOnRIZWFkZXJBdHRyaWJ1dGVzIiAvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImFkZHJlc3MiIHR5cGU9InNvYXA6dEFkZHJlc3MiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0QWRkcmVzcyIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJpbGl0eUVsZW1lbnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy94c2Qvc29hcGVuYy54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC9zb2FwZW5jLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVjODBkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC9zb2FwZW5jLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCcgPz4KLQotPCEtLSBTY2hlbWEgZm9yIHRoZSBTT0FQLzEuMSBlbmNvZGluZwotCi1Qb3J0aW9ucyDCqSAyMDAxIERldmVsb3BNZW50b3IuIAotwqkgMjAwMSBXM0MgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAKLSAKLVRoaXMgZG9jdW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIFczQyBTb2Z0d2FyZSBMaWNlbnNlIFsxXSBhcyBkZXNjcmliZWQgaW4gdGhlIEZBUSBbMl0uCi1bMV0gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAKLVsyXSBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL0lQUi1GQVEtMjAwMDA2MjAuaHRtbCNEVEQgCi1CeSBvYnRhaW5pbmcsIHVzaW5nIGFuZC9vciBjb3B5aW5nIHRoaXMgd29yaywgeW91ICh0aGUgbGljZW5zZWUpIGFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwgYW5kIHdpbGwgY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9uczoKLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sICBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIG9yIHJveWFsdHkgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgeW91IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBvbiBBTEwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBvciBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9ucywgdGhhdCB5b3UgbWFrZToKLQotMS4gIFRoZSBmdWxsIHRleHQgb2YgdGhpcyBOT1RJQ0UgaW4gYSBsb2NhdGlvbiB2aWV3YWJsZSB0byB1c2VycyBvZiB0aGUgcmVkaXN0cmlidXRlZCBvciBkZXJpdmF0aXZlIHdvcmsuIAotCi0yLiAgQW55IHByZS1leGlzdGluZyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgZGlzY2xhaW1lcnMsIG5vdGljZXMsIG9yIHRlcm1zIGFuZCBjb25kaXRpb25zLiBJZiBub25lIGV4aXN0LCBhIHNob3J0IG5vdGljZSBvZiB0aGUgZm9sbG93aW5nIGZvcm0gKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKSBzaG91bGQgYmUgdXNlZCB3aXRoaW4gdGhlIGJvZHkgb2YgYW55IHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSBjb2RlOiAiQ29weXJpZ2h0IMKpIDIwMDEgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIiAKLQotMy4gIE5vdGljZSBvZiBhbnkgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHRvIHRoZSBXM0MgZmlsZXMsIGluY2x1ZGluZyB0aGUgZGF0ZSBjaGFuZ2VzIHdlcmUgbWFkZS4gKFdlIHJlY29tbWVuZCB5b3UgcHJvdmlkZSBVUklzIHRvIHRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIHRoZSBjb2RlIGlzIGRlcml2ZWQuKSAgIAotCi1PcmlnaW5hbCBXM0MgZmlsZXM7IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDYvc29hcC1lbmNvZGluZwotQ2hhbmdlcyBtYWRlOiAKLSAgICAgLSByZXZlcnRlZCBuYW1lc3BhY2UgdG8gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgLSByZXZlcnRlZCByb290IHRvIG9ubHkgYWxsb3cgMCBhbmQgMSBhcyBsZXhpY2FsIHZhbHVlcwotCSAtIHJlbW92ZWQgZGVmYXVsdCB2YWx1ZSBmcm9tIHJvb3QgYXR0cmlidXRlIGRlY2xhcmF0aW9uCi0KLVRISVMgU09GVFdBUkUgQU5EIERPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTLCIgQU5EIENPUFlSSUdIVCBIT0xERVJTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBUSEFUIFRIRSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04gV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFRISVJEIFBBUlRZIFBBVEVOVFMsIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLgotCi1DT1BZUklHSFQgSE9MREVSUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBBTlkgVVNFIE9GIFRIRSBTT0ZUV0FSRSBPUiBET0NVTUVOVEFUSU9OLgotCi1UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiBjb3B5cmlnaHQgaG9sZGVycyBtYXkgTk9UIGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gVGl0bGUgdG8gY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgYW5kIGFueSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggY29weXJpZ2h0IGhvbGRlcnMuCi0KLS0tPgotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iID4KLSAgICAgICAgCi0gPHhzOmF0dHJpYnV0ZSBuYW1lPSJyb290IiA+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0JICAgJ3Jvb3QnIGNhbiBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIHNlcmlhbGl6YXRpb24gcm9vdHMgZnJvbSBvdGhlcgotICAgICAgIGVsZW1lbnRzIHRoYXQgYXJlIHByZXNlbnQgaW4gYSBzZXJpYWxpemF0aW9uIGJ1dCBhcmUgbm90IHJvb3RzIG9mCi0gICAgICAgYSBzZXJpYWxpemVkIHZhbHVlIGdyYXBoIAotCSA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLQotICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6Ym9vbGVhbic+Ci0JICAgPHhzOnBhdHRlcm4gdmFsdWU9JzB8MScgLz4KLQkgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSA8L3hzOmF0dHJpYnV0ZT4KLQotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iY29tbW9uQXR0cmlidXRlcyIgPgotICAgIDx4czphbm5vdGF0aW9uPgotCSAgPHhzOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgQXR0cmlidXRlcyBjb21tb24gdG8gYWxsIGVsZW1lbnRzIHRoYXQgZnVuY3Rpb24gYXMgYWNjZXNzb3JzIG9yIAotICAgICAgICByZXByZXNlbnQgaW5kZXBlbmRlbnQgKG11bHRpLXJlZikgdmFsdWVzLiAgVGhlIGhyZWYgYXR0cmlidXRlIGlzCi0gICAgICAgIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gYSBtYW5uZXIgbGlrZSBDT05SRUYuICBUaGF0IGlzLCB0aGUgZWxlbWVudAotICAgICAgICBjb250ZW50IHNob3VsZCBiZSBlbXB0eSBpZmYgdGhlIGhyZWYgYXR0cmlidXRlIGFwcGVhcnMKLQkgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiIC8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJocmVmIiB0eXBlPSJ4czphbnlVUkkiIC8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotCi0gIDwhLS0gR2xvYmFsIEF0dHJpYnV0ZXMuICBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGludGVuZGVkIHRvIGJlIHVzYWJsZSB2aWEgcXVhbGlmaWVkIGF0dHJpYnV0ZSBuYW1lcyBvbiBhbnkgY29tcGxleCB0eXBlIHJlZmVyZW5jaW5nIHRoZW0uIC0tPgotICAgICAgIAotICA8IS0tIEFycmF5IGF0dHJpYnV0ZXMuIE5lZWRlZCB0byBnaXZlIHRoZSB0eXBlIGFuZCBkaW1lbnNpb25zIG9mIGFuIGFycmF5J3MgY29udGVudHMsIGFuZCB0aGUgb2Zmc2V0IGZvciBwYXJ0aWFsbHktdHJhbnNtaXR0ZWQgYXJyYXlzLiAtLT4KLQotICAgCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImFycmF5Q29vcmRpbmF0ZSIgPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciIC8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAKLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhcnJheVR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvZmZzZXQiIHR5cGU9InRuczphcnJheUNvb3JkaW5hdGUiIC8+Ci0gIAotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iYXJyYXlBdHRyaWJ1dGVzIiA+Ci0gICAgPHhzOmF0dHJpYnV0ZSByZWY9InRuczphcnJheVR5cGUiIC8+Ci0gICAgPHhzOmF0dHJpYnV0ZSByZWY9InRuczpvZmZzZXQiIC8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+ICAgIAotICAKLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwb3NpdGlvbiIgdHlwZT0idG5zOmFycmF5Q29vcmRpbmF0ZSIgLz4gCi0gIAotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iYXJyYXlNZW1iZXJBdHRyaWJ1dGVzIiA+Ci0KLSAgICA8eHM6YXR0cmlidXRlIHJlZj0idG5zOnBvc2l0aW9uIiAvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPiAgICAKLQotICA8eHM6Z3JvdXAgbmFtZT0iQXJyYXkiID4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNhbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCTwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Z3JvdXA+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iQXJyYXkiIHR5cGU9InRuczpBcnJheSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkFycmF5IiA+Ci0KLSAgICA8eHM6YW5ub3RhdGlvbj4KLQkgIDx4czpkb2N1bWVudGF0aW9uPgotCSAgICdBcnJheScgaXMgYSBjb21wbGV4IHR5cGUgZm9yIGFjY2Vzc29ycyBpZGVudGlmaWVkIGJ5IHBvc2l0aW9uIAotCSAgPC94czpkb2N1bWVudGF0aW9uPgotCTwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ0bnM6QXJyYXkiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6YXJyYXlBdHRyaWJ1dGVzIiAvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICA8L3hzOmNvbXBsZXhUeXBlPiAKLQotICA8IS0tICdTdHJ1Y3QnIGlzIGEgY29tcGxleCB0eXBlIGZvciBhY2Nlc3NvcnMgaWRlbnRpZmllZCBieSBuYW1lLiAKLSAgICAgICBDb25zdHJhaW50OiBObyBlbGVtZW50IG1heSBiZSBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYW55IG90aGVyLAotICAgICAgIG5vciBtYXkgYW55IGVsZW1lbnQgaGF2ZSBhIG1heE9jY3VycyA+IDEuIC0tPgotCi0gICAKLSAgPHhzOmVsZW1lbnQgbmFtZT0iU3RydWN0IiB0eXBlPSJ0bnM6U3RydWN0IiAvPgotCi0gIDx4czpncm91cCBuYW1lPSJTdHJ1Y3QiID4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNhbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCTwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Z3JvdXA+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlN0cnVjdCIgPgotICAgIDx4czpncm91cCByZWY9InRuczpTdHJ1Y3QiIG1pbk9jY3Vycz0iMCIgLz4KLQotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIi8+Ci0gIDwveHM6Y29tcGxleFR5cGU+IAotCi0gIDwhLS0gJ0Jhc2U2NCcgY2FuIGJlIHVzZWQgdG8gc2VyaWFsaXplIGJpbmFyeSBkYXRhIHVzaW5nIGJhc2U2NCBlbmNvZGluZwotICAgICAgIGFzIGRlZmluZWQgaW4gUkZDMjA0NSBidXQgd2l0aG91dCB0aGUgTUlNRSBsaW5lIGxlbmd0aCBsaW1pdGF0aW9uLiAtLT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJiYXNlNjQiID4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YmFzZTY0QmluYXJ5IiAvPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8IS0tIEVsZW1lbnQgZGVjbGFyYXRpb25zIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBvZiB0aGUgc2ltcGxlIHR5cGVzIGluIHRoZSAKLSAgICAgIFhNTCBTY2hlbWFzIFNwZWNpZmljYXRpb24uIC0tPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJ0bnM6ZHVyYXRpb24iIC8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImR1cmF0aW9uIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmR1cmF0aW9uIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImRhdGVUaW1lIiB0eXBlPSJ0bnM6ZGF0ZVRpbWUiIC8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGVUaW1lIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmRhdGVUaW1lIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJOT1RBVElPTiIgdHlwZT0idG5zOk5PVEFUSU9OIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTk9UQVRJT04iID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6UU5hbWUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIAotCi0gIDx4czplbGVtZW50IG5hbWU9InRpbWUiIHR5cGU9InRuczp0aW1lIiAvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnRpbWUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGF0ZSIgdHlwZT0idG5zOmRhdGUiIC8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGUiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6ZGF0ZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJnWWVhck1vbnRoIiB0eXBlPSJ0bnM6Z1llYXJNb250aCIgLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ1llYXJNb250aCIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpnWWVhck1vbnRoIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImdZZWFyIiB0eXBlPSJ0bnM6Z1llYXIiIC8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImdZZWFyIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmdZZWFyIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImdNb250aERheSIgdHlwZT0idG5zOmdNb250aERheSIgLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ01vbnRoRGF5IiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmdNb250aERheSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJnRGF5IiB0eXBlPSJ0bnM6Z0RheSIgLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ0RheSIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpnRGF5IiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImdNb250aCIgdHlwZT0idG5zOmdNb250aCIgLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ01vbnRoIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmdNb250aCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgCi0gIDx4czplbGVtZW50IG5hbWU9ImJvb2xlYW4iIHR5cGU9InRuczpib29sZWFuIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYm9vbGVhbiIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmJvb2xlYW4iID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iYmFzZTY0QmluYXJ5IiB0eXBlPSJ0bnM6YmFzZTY0QmluYXJ5IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYmFzZTY0QmluYXJ5IiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YmFzZTY0QmluYXJ5IiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImhleEJpbmFyeSIgdHlwZT0idG5zOmhleEJpbmFyeSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImhleEJpbmFyeSIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6aGV4QmluYXJ5IiA+Ci0gICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJmbG9hdCIgdHlwZT0idG5zOmZsb2F0IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZmxvYXQiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpmbG9hdCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJkb3VibGUiIHR5cGU9InRuczpkb3VibGUiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkb3VibGUiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpkb3VibGUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iYW55VVJJIiB0eXBlPSJ0bnM6YW55VVJJIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYW55VVJJIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW55VVJJIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9IlFOYW1lIiB0eXBlPSJ0bnM6UU5hbWUiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJRTmFtZSIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOlFOYW1lIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIAotICA8eHM6ZWxlbWVudCBuYW1lPSJzdHJpbmciIHR5cGU9InRuczpzdHJpbmciIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzdHJpbmciID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibm9ybWFsaXplZFN0cmluZyIgdHlwZT0idG5zOm5vcm1hbGl6ZWRTdHJpbmciIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJub3JtYWxpemVkU3RyaW5nIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6bm9ybWFsaXplZFN0cmluZyIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ0b2tlbiIgdHlwZT0idG5zOnRva2VuIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idG9rZW4iID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czp0b2tlbiIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJsYW5ndWFnZSIgdHlwZT0idG5zOmxhbmd1YWdlIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibGFuZ3VhZ2UiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpsYW5ndWFnZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIiB0eXBlPSJ0bnM6TmFtZSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWUiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpOYW1lIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Ik5NVE9LRU4iIHR5cGU9InRuczpOTVRPS0VOIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTk1UT0tFTiIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOk5NVE9LRU4iID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iTkNOYW1lIiB0eXBlPSJ0bnM6TkNOYW1lIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTkNOYW1lIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6TkNOYW1lIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Ik5NVE9LRU5TIiB0eXBlPSJ0bnM6Tk1UT0tFTlMiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJOTVRPS0VOUyIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOk5NVE9LRU5TIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9IklEIiB0eXBlPSJ0bnM6SUQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJRCIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOklEIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9IklEUkVGIiB0eXBlPSJ0bnM6SURSRUYiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJRFJFRiIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOklEUkVGIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9IkVOVElUWSIgdHlwZT0idG5zOkVOVElUWSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkVOVElUWSIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOkVOVElUWSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJJRFJFRlMiIHR5cGU9InRuczpJRFJFRlMiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJRFJFRlMiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpJRFJFRlMiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iRU5USVRJRVMiIHR5cGU9InRuczpFTlRJVElFUyIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkVOVElUSUVTIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6RU5USVRJRVMiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGVjaW1hbCIgdHlwZT0idG5zOmRlY2ltYWwiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkZWNpbWFsIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6ZGVjaW1hbCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJpbnRlZ2VyIiB0eXBlPSJ0bnM6aW50ZWdlciIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImludGVnZXIiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czppbnRlZ2VyIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Im5vblBvc2l0aXZlSW50ZWdlciIgdHlwZT0idG5zOm5vblBvc2l0aXZlSW50ZWdlciIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5vblBvc2l0aXZlSW50ZWdlciIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm5vblBvc2l0aXZlSW50ZWdlciIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJuZWdhdGl2ZUludGVnZXIiIHR5cGU9InRuczpuZWdhdGl2ZUludGVnZXIiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJuZWdhdGl2ZUludGVnZXIiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpuZWdhdGl2ZUludGVnZXIiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibG9uZyIgdHlwZT0idG5zOmxvbmciIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsb25nIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6bG9uZyIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJpbnQiIHR5cGU9InRuczppbnQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJpbnQiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czppbnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ic2hvcnQiIHR5cGU9InRuczpzaG9ydCIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNob3J0IiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6c2hvcnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iYnl0ZSIgdHlwZT0idG5zOmJ5dGUiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJieXRlIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6Ynl0ZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJub25OZWdhdGl2ZUludGVnZXIiIHR5cGU9InRuczpub25OZWdhdGl2ZUludGVnZXIiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJub25OZWdhdGl2ZUludGVnZXIiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idW5zaWduZWRMb25nIiB0eXBlPSJ0bnM6dW5zaWduZWRMb25nIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idW5zaWduZWRMb25nIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dW5zaWduZWRMb25nIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InVuc2lnbmVkSW50IiB0eXBlPSJ0bnM6dW5zaWduZWRJbnQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ1bnNpZ25lZEludCIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnVuc2lnbmVkSW50IiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InVuc2lnbmVkU2hvcnQiIHR5cGU9InRuczp1bnNpZ25lZFNob3J0IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idW5zaWduZWRTaG9ydCIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnVuc2lnbmVkU2hvcnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idW5zaWduZWRCeXRlIiB0eXBlPSJ0bnM6dW5zaWduZWRCeXRlIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idW5zaWduZWRCeXRlIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dW5zaWduZWRCeXRlIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InBvc2l0aXZlSW50ZWdlciIgdHlwZT0idG5zOnBvc2l0aXZlSW50ZWdlciIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InBvc2l0aXZlSW50ZWdlciIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnBvc2l0aXZlSW50ZWdlciIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJhbnlUeXBlIiAvPgotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC93c2RsLW1pbWUueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy94c2Qvd3NkbC1taW1lLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZkZmJlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC93c2RsLW1pbWUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gCi1Db3B5cmlnaHQgMjAwMS0yMDA1LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBNaWNyb3NvZnQgQ29ycG9yYXRpb24KLUFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotTGljZW5zZSBmb3IgV1NETCBTY2hlbWEgRmlsZXMKLQotVGhlIEF1dGhvcnMgZ3JhbnQgcGVybWlzc2lvbiB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBXU0RMIFNjaGVtYSAKLUZpbGVzIGluIGFueSBtZWRpdW0gd2l0aG91dCBmZWUgb3Igcm95YWx0eSBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGFuZCAKLWxpY2Vuc2UgYXJlIGRpc3RyaWJ1dGVkIHdpdGggdGhlbS4gIFRoZSBvcmlnaW5hbHMgb2YgdGhlc2UgZmlsZXMgY2FuIAotYmUgbG9jYXRlZCBhdDoKLQotaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLzIwMDQtMDgtMjQueHNkCi0KLVRIRVNFIFNDSEVNQSBGSUxFUyBBUkUgUFJPVklERUQgIkFTIElTLCIgQU5EIFRIRSBBVVRIT1JTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIAotT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBSRUdBUkRJTkcgVEhFU0UgRklMRVMsIElOQ0xVRElORywgQlVUIE5PVCAKLUxJTUlURUQgVE8sIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgCi1OT04tSU5GUklOR0VNRU5UIE9SIFRJVExFLiAgVEhFIEFVVEhPUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCAKLUlORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBPUiAKLVJFTEFUSU5HIFRPIEFOWSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRVNFIEZJTEVTLgotCi1UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiB0aGUgQXV0aG9ycyBtYXkgTk9UIGJlIHVzZWQgaW4gYW55IG1hbm5lciwgCi1pbmNsdWRpbmcgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlc2UgZmlsZXMgb3IgYW55IHByb2dyYW0gCi1vciBzZXJ2aWNlIHRoYXQgdXNlcyB0aGVzZSBmaWxlcywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGl0bGUgdG8gY29weXJpZ2h0IAotaW4gdGhlc2UgZmlsZXMgd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggdGhlIEF1dGhvcnMuCi0KLU5vIG90aGVyIHJpZ2h0cyBhcmUgZ3JhbnRlZCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLgotCi0KLSAgLS0+IAotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iPgotCTxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotCTxlbGVtZW50IG5hbWU9ImNvbnRlbnQiIHR5cGU9Im1pbWU6Y29udGVudFR5cGUiLz4KLQk8Y29tcGxleFR5cGUgbmFtZT0iY29udGVudFR5cGUiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLQkJCQk8c2VxdWVuY2UvPgotCQkJCTxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQkJPGF0dHJpYnV0ZSBuYW1lPSJwYXJ0IiB0eXBlPSJOTVRPS0VOIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxlbGVtZW50IG5hbWU9Im11bHRpcGFydFJlbGF0ZWQiIHR5cGU9Im1pbWU6bXVsdGlwYXJ0UmVsYXRlZFR5cGUiLz4KLQk8Y29tcGxleFR5cGUgbmFtZT0ibXVsdGlwYXJ0UmVsYXRlZFR5cGUiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IHJlZj0ibWltZTpwYXJ0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC9zZXF1ZW5jZT4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGVsZW1lbnQgbmFtZT0icGFydCIgdHlwZT0ibWltZTp0UGFydCIvPgotCTxjb21wbGV4VHlwZSBuYW1lPSJ0UGFydCI+Ci0JCTxzZXF1ZW5jZT4KLQkJCTxhbnkgbmFtZXNwYWNlPSIjI2FueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3NlcXVlbmNlPgotCQk8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9Ik5NVE9LRU4iIHVzZT0ib3B0aW9uYWwiLz4KLQk8L2NvbXBsZXhUeXBlPgotICAgCTxlbGVtZW50IG5hbWU9Im1pbWVYbWwiIHR5cGUgPSAibWltZTp0TWltZVhtbCIvPgotICAgCTxjb21wbGV4VHlwZSBuYW1lPSJ0TWltZVhtbCI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotCQkJCTxzZXF1ZW5jZS8+Ci0JCQkJPGF0dHJpYnV0ZSBuYW1lPSJwYXJ0IiB0eXBlPSJOTVRPS0VOIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLSAgIAk8L2NvbXBsZXhUeXBlPgotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC93c2RsLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL3dzZGwueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTgxZDYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL3dzZGwueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gCi1Db3B5cmlnaHQgMjAwMSAtIDIwMDUsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbgotQWxsIFJpZ2h0cyBSZXNlcnZlZAotCi1MaWNlbnNlIGZvciBXU0RMIFNjaGVtYSBGaWxlcwotCi1UaGUgQXV0aG9ycyBncmFudCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFdTREwgU2NoZW1hIAotRmlsZXMgaW4gYW55IG1lZGl1bSB3aXRob3V0IGZlZSBvciByb3lhbHR5IGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgYW5kIAotbGljZW5zZSBhcmUgZGlzdHJpYnV0ZWQgd2l0aCB0aGVtLiAgVGhlIG9yaWdpbmFscyBvZiB0aGVzZSBmaWxlcyBjYW4gCi1iZSBsb2NhdGVkIGF0OgotCi1odHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLzIwMDQtMDgtMjQueHNkCi0KLVRIRVNFIFNDSEVNQSBGSUxFUyBBUkUgUFJPVklERUQgIkFTIElTLCIgQU5EIFRIRSBBVVRIT1JTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIAotT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBSRUdBUkRJTkcgVEhFU0UgRklMRVMsIElOQ0xVRElORywgQlVUIE5PVCAKLUxJTUlURUQgVE8sIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgCi1OT04tSU5GUklOR0VNRU5UIE9SIFRJVExFLiAgVEhFIEFVVEhPUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCAKLUlORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBPUiAKLVJFTEFUSU5HIFRPIEFOWSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRVNFIEZJTEVTLgotCi1UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiB0aGUgQXV0aG9ycyBtYXkgTk9UIGJlIHVzZWQgaW4gYW55IG1hbm5lciwgCi1pbmNsdWRpbmcgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlc2UgZmlsZXMgb3IgYW55IHByb2dyYW0gCi1vciBzZXJ2aWNlIHRoYXQgdXNlcyB0aGVzZSBmaWxlcywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGl0bGUgdG8gY29weXJpZ2h0IAotaW4gdGhlc2UgZmlsZXMgd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggdGhlIEF1dGhvcnMuCi0KLU5vIG90aGVyIHJpZ2h0cyBhcmUgZ3JhbnRlZCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLgotCi0KLS0tPiAKLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiID4KLSAgIAotICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiIG5hbWU9InREb2N1bWVudGF0aW9uIiA+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmFueSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0RG9jdW1lbnRlZCIgPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBUaGlzIHR5cGUgaXMgZXh0ZW5kZWQgYnkgIGNvbXBvbmVudCB0eXBlcyB0byBhbGxvdyB0aGVtIHRvIGJlIGRvY3VtZW50ZWQKLSAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZG9jdW1lbnRhdGlvbiIgdHlwZT0id3NkbDp0RG9jdW1lbnRhdGlvbiIgbWluT2NjdXJzPSIwIiAvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8IS0tIGltcGxlbWVudGVkIHJlc29sdXRpb24gb2Ygc3dhMTI0IC0tPgotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0RXh0ZW5zaWJsZUF0dHJpYnV0ZXNEb2N1bWVudGVkIiBhYnN0cmFjdD0idHJ1ZSIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RG9jdW1lbnRlZCIgPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICBUaGlzIHR5cGUgaXMgZXh0ZW5kZWQgYnkgY29tcG9uZW50IHR5cGVzIHRvIGFsbG93IGF0dHJpYnV0ZXMgZnJvbSBvdGhlciBuYW1lc3BhY2VzIHRvIGJlIGFkZGVkLgotICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+ICAgCi0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPCEtLSBpbXBsZW1lbnRlZCByZXNvbHV0aW9uIG9mIHN3YTEyNCAtLT4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgYWJzdHJhY3Q9InRydWUiID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dERvY3VtZW50ZWQiID4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgVGhpcyB0eXBlIGlzIGV4dGVuZGVkIGJ5IGNvbXBvbmVudCB0eXBlcyB0byBhbGxvdyBlbGVtZW50cyBmcm9tIG90aGVyIG5hbWVzcGFjZXMgdG8gYmUgYWRkZWQuCi0gICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4gICAKLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGVmaW5pdGlvbnMiIHR5cGU9IndzZGw6dERlZmluaXRpb25zIiA+Ci0gICAgPHhzOmtleSBuYW1lPSJtZXNzYWdlIiA+Ci0gICAgICA8eHM6c2VsZWN0b3IgeHBhdGg9IndzZGw6bWVzc2FnZSIgLz4KLSAgICAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiIC8+Ci0gICAgPC94czprZXk+Ci0gICAgPHhzOmtleSBuYW1lPSJwb3J0VHlwZSIgPgotICAgICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ3c2RsOnBvcnRUeXBlIiAvPgotICAgICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIgLz4KLSAgICA8L3hzOmtleT4KLSAgICA8eHM6a2V5IG5hbWU9ImJpbmRpbmciID4KLSAgICAgIDx4czpzZWxlY3RvciB4cGF0aD0id3NkbDpiaW5kaW5nIiAvPgotICAgICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIgLz4KLSAgICA8L3hzOmtleT4KLSAgICA8eHM6a2V5IG5hbWU9InNlcnZpY2UiID4KLSAgICAgIDx4czpzZWxlY3RvciB4cGF0aD0id3NkbDpzZXJ2aWNlIiAvPgotICAgICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIgLz4KLSAgICA8L3hzOmtleT4KLSAgICA8eHM6a2V5IG5hbWU9ImltcG9ydCIgPgotICAgICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ3c2RsOmltcG9ydCIgLz4KLSAgICAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWVzcGFjZSIgLz4KLSAgICA8L3hzOmtleT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpncm91cCBuYW1lPSJhbnlUb3BMZXZlbE9wdGlvbmFsRWxlbWVudCIgPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBBbnkgdG9wIGxldmVsIG9wdGlvbmFsIGVsZW1lbnQgYWxsb3dlZCB0byBhcHBlYXIgbW9yZSB0aGVuIG9uY2UgLSBhbnkgY2hpbGQgb2YgZGVmaW5pdGlvbnMgZWxlbWVudCBleGNlcHQgd3NkbDp0eXBlcy4gQW55IGV4dGVuc2liaWxpdHkgZWxlbWVudCBpcyBhbGxvd2VkIGluIGFueSBwbGFjZS4KLSAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImltcG9ydCIgdHlwZT0id3NkbDp0SW1wb3J0IiAvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idHlwZXMiIHR5cGU9IndzZGw6dFR5cGVzIiAvPiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgIHR5cGU9IndzZGw6dE1lc3NhZ2UiID4KLSAgICAgICAgPHhzOnVuaXF1ZSBuYW1lPSJwYXJ0IiA+Ci0gICAgICAgICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ3c2RsOnBhcnQiIC8+Ci0gICAgICAgICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIgLz4KLSAgICAgICAgPC94czp1bmlxdWU+Ci0gICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwb3J0VHlwZSIgdHlwZT0id3NkbDp0UG9ydFR5cGUiIC8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJiaW5kaW5nIiAgdHlwZT0id3NkbDp0QmluZGluZyIgLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InNlcnZpY2UiICB0eXBlPSJ3c2RsOnRTZXJ2aWNlIiA+Ci0gICAgICAgIDx4czp1bmlxdWUgbmFtZT0icG9ydCIgPgotICAgICAgICAgIDx4czpzZWxlY3RvciB4cGF0aD0id3NkbDpwb3J0IiAvPgotICAgICAgICAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiIC8+Ci0gICAgICAgIDwveHM6dW5pcXVlPgotCSAgPC94czplbGVtZW50PgotICAgIDwveHM6Y2hvaWNlPgotICA8L3hzOmdyb3VwPgotCi0gIDwhLS0gaW1wbGVtZW50ZWQgcmVzb2x1dGlvbiBvZiBlcjAxNSBhbmQgVVBBIGZpeC4gQVNLIC0tPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idERlZmluaXRpb25zIj4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVEb2N1bWVudGVkIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgPHhzOmdyb3VwIHJlZj0id3NkbDphbnlUb3BMZXZlbE9wdGlvbmFsRWxlbWVudCIvPgotICAgICAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ3c2RsOmFueVRvcExldmVsT3B0aW9uYWxFbGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIgdXNlPQotIm9wdGlvbmFsIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0SW1wb3J0IiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlQXR0cmlidXRlc0RvY3VtZW50ZWQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgIAotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idFR5cGVzIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PiAgIAotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgLz4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PiAgIAotICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRNZXNzYWdlIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PiAgIAotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFydCIgdHlwZT0id3NkbDp0UGFydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PiAgIAotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0UGFydCIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4gICAKLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJsZUF0dHJpYnV0ZXNEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVsZW1lbnQiIHR5cGU9InhzOlFOYW1lIiB1c2U9Im9wdGlvbmFsIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOlFOYW1lIiB1c2U9Im9wdGlvbmFsIiAvPiAgICAKLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+ICAgCi0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRQb3J0VHlwZSIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4gICAKLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJsZUF0dHJpYnV0ZXNEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvcGVyYXRpb24iIHR5cGU9IndzZGw6dE9wZXJhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PiAgIAotICA8L3hzOmNvbXBsZXhUeXBlPgotICAgCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0T3BlcmF0aW9uIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PiAgIAotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgPgotCSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmNob2ljZT4KLSAgICAgICAgICAgIDx4czpncm91cCByZWY9IndzZGw6cmVxdWVzdC1yZXNwb25zZS1vci1vbmUtd2F5LW9wZXJhdGlvbiIgLz4KLSAgICAgICAgICAgIDx4czpncm91cCByZWY9IndzZGw6c29saWNpdC1yZXNwb25zZS1vci1ub3RpZmljYXRpb24tb3BlcmF0aW9uIiAvPgotICAgICAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXJhbWV0ZXJPcmRlciIgdHlwZT0ieHM6Tk1UT0tFTlMiIHVzZT0ib3B0aW9uYWwiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PiAgIAotICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIAotICA8eHM6Z3JvdXAgbmFtZT0icmVxdWVzdC1yZXNwb25zZS1vci1vbmUtd2F5LW9wZXJhdGlvbiIgPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImlucHV0IiB0eXBlPSJ3c2RsOnRQYXJhbSIgLz4KLQkgIDx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9JzAnID4KLQkgICAgPHhzOmVsZW1lbnQgbmFtZT0ib3V0cHV0IiB0eXBlPSJ3c2RsOnRQYXJhbSIgLz4KLQkJPHhzOmVsZW1lbnQgbmFtZT0iZmF1bHQiIHR5cGU9IndzZGw6dEZhdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmdyb3VwPgotCi0gIDx4czpncm91cCBuYW1lPSJzb2xpY2l0LXJlc3BvbnNlLW9yLW5vdGlmaWNhdGlvbi1vcGVyYXRpb24iID4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvdXRwdXQiIHR5cGU9IndzZGw6dFBhcmFtIiAvPgotCSAgPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0nMCcgPgotCSAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbnB1dCIgdHlwZT0id3NkbDp0UGFyYW0iIC8+Ci0JCTx4czplbGVtZW50IG5hbWU9ImZhdWx0IiB0eXBlPSJ3c2RsOnRGYXVsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpncm91cD4KLSAgICAgICAgCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0UGFyYW0iID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVBdHRyaWJ1dGVzRG9jdW1lbnRlZCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJvcHRpb25hbCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRGYXVsdCIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJsZUF0dHJpYnV0ZXNEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgIAotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idEJpbmRpbmciID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvcGVyYXRpb24iIHR5cGU9IndzZGw6dEJpbmRpbmdPcGVyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOlFOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRCaW5kaW5nT3BlcmF0aW9uTWVzc2FnZSIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJsZURvY3VtZW50ZWQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0ib3B0aW9uYWwiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRCaW5kaW5nT3BlcmF0aW9uRmF1bHQiID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idEJpbmRpbmdPcGVyYXRpb24iID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbnB1dCIgdHlwZT0id3NkbDp0QmluZGluZ09wZXJhdGlvbk1lc3NhZ2UiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvdXRwdXQiIHR5cGU9IndzZGw6dEJpbmRpbmdPcGVyYXRpb25NZXNzYWdlIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZmF1bHQiIHR5cGU9IndzZGw6dEJpbmRpbmdPcGVyYXRpb25GYXVsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRTZXJ2aWNlIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icG9ydCIgdHlwZT0id3NkbDp0UG9ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRQb3J0IiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJiaW5kaW5nIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhcnJheVR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRFeHRlbnNpYmlsaXR5RWxlbWVudCIgYWJzdHJhY3Q9InRydWUiID4KLSAgICA8eHM6YXR0cmlidXRlIHJlZj0id3NkbDpyZXF1aXJlZCIgdXNlPSJvcHRpb25hbCIgLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC94bWxjYXRhbG9nMTEueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy94c2QveG1sY2F0YWxvZzExLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjNzk1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC94bWxjYXRhbG9nMTEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLSANCi1Db3B5cmlnaHQgKGMpIFRoZSBPcmdhbml6YXRpb24gZm9yIHRoZSBBZHZhbmNlbWVudCBvZiBTdHJ1Y3R1cmVkIEluZm9ybWF0aW9uIFN0YW5kYXJkcyANCi1bT0FTSVNdIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotDQotT0FTSVMgdGFrZXMgbm8gcG9zaXRpb24gcmVnYXJkaW5nIHRoZSB2YWxpZGl0eSBvciBzY29wZSBvZiBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9yIG90aGVyIHJpZ2h0cw0KLXRoYXQgbWlnaHQgYmUgY2xhaW1lZCB0byBwZXJ0YWluIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvciB1c2Ugb2YgdGhlIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQNCi1vciB0aGUgZXh0ZW50IHRvIHdoaWNoIGFueSBsaWNlbnNlIHVuZGVyIHN1Y2ggcmlnaHRzIG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSBhdmFpbGFibGU7IG5laXRoZXIgZG9lcyBpdA0KLXJlcHJlc2VudCB0aGF0IGl0IGhhcyBtYWRlIGFueSBlZmZvcnQgdG8gaWRlbnRpZnkgYW55IHN1Y2ggcmlnaHRzLiBJbmZvcm1hdGlvbiBvbiBPQVNJUydzIHByb2NlZHVyZXMNCi13aXRoIHJlc3BlY3QgdG8gcmlnaHRzIGluIE9BU0lTIHNwZWNpZmljYXRpb25zIGNhbiBiZSBmb3VuZCBhdCB0aGUgT0FTSVMgd2Vic2l0ZS4gQ29waWVzIG9mIGNsYWltcyBvZg0KLXJpZ2h0cyBtYWRlIGF2YWlsYWJsZSBmb3IgcHVibGljYXRpb24gYW5kIGFueSBhc3N1cmFuY2VzIG9mIGxpY2Vuc2VzIHRvIGJlIG1hZGUgYXZhaWxhYmxlLCBvciB0aGUgcmVzdWx0DQotb2YgYW4gYXR0ZW1wdCBtYWRlIHRvIG9idGFpbiBhIGdlbmVyYWwgbGljZW5zZSBvciBwZXJtaXNzaW9uIGZvciB0aGUgdXNlIG9mIHN1Y2ggcHJvcHJpZXRhcnkgcmlnaHRzIGJ5DQotaW1wbGVtZW50b3JzIG9yIHVzZXJzIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiwgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIE9BU0lTIEV4ZWN1dGl2ZSBEaXJlY3Rvci4NCi0NCi1PQVNJUyBpbnZpdGVzIGFueSBpbnRlcmVzdGVkIHBhcnR5IHRvIGJyaW5nIHRvIGl0cyBhdHRlbnRpb24gYW55IGNvcHlyaWdodHMsIHBhdGVudHMgb3IgcGF0ZW50DQotYXBwbGljYXRpb25zLCBvciBvdGhlciBwcm9wcmlldGFyeSByaWdodHMgd2hpY2ggbWF5IGNvdmVyIHRlY2hub2xvZ3kgdGhhdCBtYXkgYmUgcmVxdWlyZWQgdG8gaW1wbGVtZW50DQotdGhpcyBzcGVjaWZpY2F0aW9uLiBQbGVhc2UgYWRkcmVzcyB0aGUgaW5mb3JtYXRpb24gdG8gdGhlIE9BU0lTIEV4ZWN1dGl2ZSBEaXJlY3Rvci4NCi0NCi1UaGlzIGRvY3VtZW50IGFuZCB0cmFuc2xhdGlvbnMgb2YgaXQgbWF5IGJlIGNvcGllZCBhbmQgZnVybmlzaGVkIHRvIG90aGVycywgYW5kIGRlcml2YXRpdmUgd29ya3MgdGhhdA0KLWNvbW1lbnQgb24gb3Igb3RoZXJ3aXNlIGV4cGxhaW4gaXQgb3IgYXNzaXN0IGluIGl0cyBpbXBsZW1lbnRhdGlvbiBtYXkgYmUgcHJlcGFyZWQsIGNvcGllZCwgcHVibGlzaGVkIGFuZA0KLWRpc3RyaWJ1dGVkLCBpbiB3aG9sZSBvciBpbiBwYXJ0LCB3aXRob3V0IHJlc3RyaWN0aW9uIG9mIGFueSBraW5kLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQNCi1ub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZSBpbmNsdWRlZCBvbiBhbGwgc3VjaCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MuIEhvd2V2ZXIsIHRoaXMgZG9jdW1lbnQNCi1pdHNlbGYgbWF5IG5vdCBiZSBtb2RpZmllZCBpbiBhbnkgd2F5LCBzdWNoIGFzIGJ5IHJlbW92aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIG9yIHJlZmVyZW5jZXMgdG8gT0FTSVMsDQotZXhjZXB0IGFzIG5lZWRlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgZGV2ZWxvcGluZyBPQVNJUyBzcGVjaWZpY2F0aW9ucywgaW4gd2hpY2ggY2FzZSB0aGUgcHJvY2VkdXJlcyBmb3INCi1jb3B5cmlnaHRzIGRlZmluZWQgaW4gdGhlIE9BU0lTIEludGVsbGVjdHVhbCBQcm9wZXJ0eSBSaWdodHMgZG9jdW1lbnQgbXVzdCBiZSBmb2xsb3dlZCwgb3IgYXMgcmVxdWlyZWQgdG8NCi10cmFuc2xhdGUgaXQgaW50byBsYW5ndWFnZXMgb3RoZXIgdGhhbiBFbmdsaXNoLg0KLQ0KLVRoZSBsaW1pdGVkIHBlcm1pc3Npb25zIGdyYW50ZWQgYWJvdmUgYXJlIHBlcnBldHVhbCBhbmQgd2lsbCBub3QgYmUgcmV2b2tlZCBieSBPQVNJUyBvciBpdHMgc3VjY2Vzc29ycw0KLW9yIGFzc2lnbnMuDQotDQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gaXMgcHJvdmlkZWQgb24gYW4gIkFTIElTIiBiYXNpcyBhbmQgT0FTSVMgRElTQ0xBSU1TDQotQUxMIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBBTlkgV0FSUkFOVFkgVEhBVCBUSEUgVVNFIE9GIFRIRQ0KLUlORk9STUFUSU9OIEhFUkVJTiBXSUxMIE5PVCBJTkZSSU5HRSBBTlkgUklHSFRTIE9SIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MNCi1GT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuDQotDQotT0FTSVMgaGFzIGJlZW4gbm90aWZpZWQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBjbGFpbWVkIGluIHJlZ2FyZCB0byBzb21lIG9yIGFsbCBvZiB0aGUgY29udGVudHMNCi1vZiB0aGlzIHNwZWNpZmljYXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uIGNvbnN1bHQgdGhlIG9ubGluZSBsaXN0IG9mIGNsYWltZWQgcmlnaHRzLg0KLSAtLT4NCi08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICAgIHhtbG5zOmVyPSJ1cm46b2FzaXM6bmFtZXM6dGM6ZW50aXR5OnhtbG5zOnhtbDpjYXRhbG9nIg0KLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJ1cm46b2FzaXM6bmFtZXM6dGM6ZW50aXR5OnhtbG5zOnhtbDpjYXRhbG9nIg0KLSAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KLQ0KLSAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIvPg0KLQ0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0icHViSWRDaGFycyI+DQotICAgIDwhLS0gQSBzdHJpbmcgb2YgdGhlIGNoYXJhY3RlcnMgZGVmaW5lZCBhcyBwdWJJZENoYXIgaW4gcHJvZHVjdGlvbiAxMw0KLSAgICAgICAgIG9mIHRoZSBTZWNvbmQgRWRpdGlvbiBvZiB0aGUgWE1MIDEuMCBSZWNvbW1lbmRhdGlvbi4gRG9lcyBub3QgaW5jbHVkZQ0KLSAgICAgICAgIHRoZSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgYmVjYXVzZSB0aGV5J3JlIG5vcm1hbGl6ZWQgYnkgWE1MIHBhcnNpbmcuIC0tPg0KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4NCi0gICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iW2EtekEtWjAtOVwtJ1woXCkrLC4vOj0/OyEqI0AkXyVdKiIvPg0KLSAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgPC94czpzaW1wbGVUeXBlPg0KLQ0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0icHVibGljSWRlbnRpZmllciI+DQotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJlcjpwdWJJZENoYXJzIi8+DQotICA8L3hzOnNpbXBsZVR5cGU+DQotDQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJwYXJ0aWFsUHVibGljSWRlbnRpZmllciI+DQotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJlcjpwdWJJZENoYXJzIi8+DQotICA8L3hzOnNpbXBsZVR5cGU+DQotDQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJzeXN0ZW1PclB1YmxpYyI+DQotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPg0KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3lzdGVtIi8+DQotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwdWJsaWMiLz4NCi0gICAgPC94czpyZXN0cmljdGlvbj4NCi0gIDwveHM6c2ltcGxlVHlwZT4NCi0NCi0gIDwhLS0gVGhlIGdsb2JhbCBhdHRyaWJ1dGUgeG1sOmJhc2UgaXMgbm90IGV4cGxpY2l0bHkgZGVjbGFyZWQ7IC0tPg0KLSAgPCEtLSBpdCBpcyBhbGxvd2VkIGJ5IHRoZSBhbnlBdHRyaWJ1dGUgZGVjbGFyYXRpb25zLiAtLT4NCi0NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJjYXRhbG9nIj4NCi0gICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCi0gICAgICA8eHM6ZWxlbWVudCByZWY9ImVyOnB1YmxpYyIvPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZXI6c3lzdGVtIi8+DQotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJlcjp1cmkiLz4NCi0gICAgICA8eHM6ZWxlbWVudCByZWY9ImVyOnJld3JpdGVTeXN0ZW0iLz4NCi0gICAgICA8eHM6ZWxlbWVudCByZWY9ImVyOnJld3JpdGVVUkkiLz4NCi0gICAgICA8eHM6ZWxlbWVudCByZWY9ImVyOnVyaVN1ZmZpeCIvPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZXI6c3lzdGVtU3VmZml4Ii8+DQotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJlcjpkZWxlZ2F0ZVB1YmxpYyIvPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZXI6ZGVsZWdhdGVTeXN0ZW0iLz4NCi0gICAgICA8eHM6ZWxlbWVudCByZWY9ImVyOmRlbGVnYXRlVVJJIi8+DQotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJlcjpuZXh0Q2F0YWxvZyIvPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZXI6Z3JvdXAiLz4NCi0gICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJza2lwIi8+DQotICAgIDwveHM6Y2hvaWNlPg0KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPg0KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InByZWZlciIgdHlwZT0iZXI6c3lzdGVtT3JQdWJsaWMiLz4NCi0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLQ0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InB1YmxpYyI+DQotICAgIDx4czpjb21wbGV4Q29udGVudD4NCi0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VHlwZSI+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InB1YmxpY0lkIiB0eXBlPSJlcjpwdWJsaWNJZGVudGlmaWVyIg0KLSAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1cmkiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4NCi0gICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPg0KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+DQotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLQ0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InN5c3RlbSI+DQotICAgIDx4czpjb21wbGV4Q29udGVudD4NCi0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VHlwZSI+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN5c3RlbUlkIiB0eXBlPSJ4czpzdHJpbmciDQotICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPg0KLSAgICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+DQotICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgPC94czpjb21wbGV4Q29udGVudD4NCi0gIDwveHM6Y29tcGxleFR5cGU+DQotDQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idXJpIj4NCi0gICAgPHhzOmNvbXBsZXhDb250ZW50Pg0KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlUeXBlIj4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6YW55VVJJIg0KLSAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1cmkiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4NCi0gICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPg0KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+DQotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLQ0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InJld3JpdGVTeXN0ZW0iPg0KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+DQotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVR5cGUiPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzeXN0ZW1JZFN0YXJ0U3RyaW5nIg0KLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHM6c3RyaW5nIg0KLSAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXdyaXRlUHJlZml4IiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+DQotICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4NCi0gICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi0NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJyZXdyaXRlVVJJIj4NCi0gICAgPHhzOmNvbXBsZXhDb250ZW50Pg0KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlUeXBlIj4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXJpU3RhcnRTdHJpbmciDQotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4czpzdHJpbmciDQotICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJld3JpdGVQcmVmaXgiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4NCi0gICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPg0KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+DQotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLQ0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InN5c3RlbVN1ZmZpeCI+DQotICAgIDx4czpjb21wbGV4Q29udGVudD4NCi0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VHlwZSI+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN5c3RlbUlkU3VmZml4Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHM6c3RyaW5nIg0KLSAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1cmkiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4NCi0gICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPg0KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+DQotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLQ0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InVyaVN1ZmZpeCI+DQotICAgIDx4czpjb21wbGV4Q29udGVudD4NCi0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VHlwZSI+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVyaVN1ZmZpeCINCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzOnN0cmluZyINCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiLz4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXJpIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+DQotICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4NCi0gICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi0NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkZWxlZ2F0ZVB1YmxpYyI+DQotICAgIDx4czpjb21wbGV4Q29udGVudD4NCi0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VHlwZSI+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InB1YmxpY0lkU3RhcnRTdHJpbmciDQotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJlcjpwYXJ0aWFsUHVibGljSWRlbnRpZmllciINCi0gICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiLz4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPg0KLSAgICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+DQotICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgPC94czpjb21wbGV4Q29udGVudD4NCi0gIDwveHM6Y29tcGxleFR5cGU+DQotDQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZGVsZWdhdGVTeXN0ZW0iPg0KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+DQotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVR5cGUiPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzeXN0ZW1JZFN0YXJ0U3RyaW5nIg0KLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHM6c3RyaW5nIg0KLSAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+DQotICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4NCi0gICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi0NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkZWxlZ2F0ZVVSSSI+DQotICAgIDx4czpjb21wbGV4Q29udGVudD4NCi0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VHlwZSI+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVyaVN0YXJ0U3RyaW5nIg0KLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHM6c3RyaW5nIg0KLSAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+DQotICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4NCi0gICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi0NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJuZXh0Q2F0YWxvZyI+DQotICAgIDx4czpjb21wbGV4Q29udGVudD4NCi0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VHlwZSI+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4NCi0gICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPg0KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+DQotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLQ0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Imdyb3VwIj4NCi0gICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCi0gICAgICA8eHM6ZWxlbWVudCByZWY9ImVyOnB1YmxpYyIvPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZXI6c3lzdGVtIi8+DQotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJlcjp1cmkiLz4NCi0gICAgICA8eHM6ZWxlbWVudCByZWY9ImVyOnJld3JpdGVTeXN0ZW0iLz4NCi0gICAgICA8eHM6ZWxlbWVudCByZWY9ImVyOnJld3JpdGVVUkkiLz4NCi0gICAgICA8eHM6ZWxlbWVudCByZWY9ImVyOnVyaVN1ZmZpeCIvPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZXI6c3lzdGVtU3VmZml4Ii8+DQotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJlcjpkZWxlZ2F0ZVB1YmxpYyIvPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0iZXI6ZGVsZWdhdGVTeXN0ZW0iLz4NCi0gICAgICA8eHM6ZWxlbWVudCByZWY9ImVyOmRlbGVnYXRlVVJJIi8+DQotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJlcjpuZXh0Q2F0YWxvZyIvPg0KLSAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9InNraXAiLz4NCi0gICAgPC94czpjaG9pY2U+DQotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHJlZmVyIiB0eXBlPSJlcjpzeXN0ZW1PclB1YmxpYyIvPg0KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPg0KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4NCi0gIDwveHM6Y29tcGxleFR5cGU+DQotDQotICA8eHM6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJlcjpjYXRhbG9nIi8+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJwdWJsaWMiIHR5cGU9ImVyOnB1YmxpYyIvPg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ic3lzdGVtIiB0eXBlPSJlcjpzeXN0ZW0iLz4NCi0gIDx4czplbGVtZW50IG5hbWU9InVyaSIgdHlwZT0iZXI6dXJpIi8+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJyZXdyaXRlU3lzdGVtIiB0eXBlPSJlcjpyZXdyaXRlU3lzdGVtIi8+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJyZXdyaXRlVVJJIiB0eXBlPSJlcjpyZXdyaXRlVVJJIi8+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJzeXN0ZW1TdWZmaXgiIHR5cGU9ImVyOnN5c3RlbVN1ZmZpeCIvPg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idXJpU3VmZml4IiB0eXBlPSJlcjp1cmlTdWZmaXgiLz4NCi0gIDx4czplbGVtZW50IG5hbWU9ImRlbGVnYXRlUHVibGljIiB0eXBlPSJlcjpkZWxlZ2F0ZVB1YmxpYyIvPg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGVsZWdhdGVTeXN0ZW0iIHR5cGU9ImVyOmRlbGVnYXRlU3lzdGVtIi8+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJkZWxlZ2F0ZVVSSSIgdHlwZT0iZXI6ZGVsZWdhdGVVUkkiLz4NCi0gIDx4czplbGVtZW50IG5hbWU9Im5leHRDYXRhbG9nIiB0eXBlPSJlcjpuZXh0Q2F0YWxvZyIvPg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZ3JvdXAiIHR5cGU9ImVyOmdyb3VwIi8+DQotDQotPC94czpzY2hlbWE+DQotDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOTdkMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1jb250ZW50bW9kZWwiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtc2VhcmNoIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXZhbGlkYXRpb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtY2F0YWxvZyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1lbWZNb2RlbFN5bmNoIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ij4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMvZG9tL1RyZWVXYWxrZXJJbXBsIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvdzNjL2RvbS9yYW5nZXMvRG9jdW1lbnRSYW5nZSIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL3czYy9kb20vcmFuZ2VzL1JhbmdlIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvdzNjL2RvbS90cmF2ZXJzYWwvRG9jdW1lbnRUcmF2ZXJzYWwiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy93M2MvZG9tL3RyYXZlcnNhbC9Ob2RlRmlsdGVyIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvdzNjL2RvbS90cmF2ZXJzYWwvTm9kZUl0ZXJhdG9yIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvdzNjL2RvbS90cmF2ZXJzYWwvVHJlZVdhbGtlciIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL3czYy9kb20vcmFuZ2VzL1JhbmdlRXhjZXB0aW9uIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy9pbXBsL1hNTEVycm9yUmVwb3J0ZXIiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3BhcnNlcnMvU3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvQXVnbWVudGF0aW9ucyIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMveG5pL05hbWVzcGFjZUNvbnRleHQiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9RTmFtZSIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMveG5pL1hNTEF0dHJpYnV0ZXMiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9YTUxMb2NhdG9yIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvWE1MUmVzb3VyY2VJZGVudGlmaWVyIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvWE5JRXhjZXB0aW9uIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvcGFyc2VyL1hNTEVudGl0eVJlc29sdmVyIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvcGFyc2VyL1hNTElucHV0U291cmNlIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy9wYXJzZXJzL1NBWFBhcnNlciIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMvcGFyc2Vycy9BYnN0cmFjdFNBWFBhcnNlciIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzNmOGJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAoteG1sbW9kZWwuamFyCi1vcmcuZWNsaXBzZS53c3QueG1sLmNvcmVfMS4wLjAuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDZlNGY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvZGVidWc9dHJ1ZQotb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2RlYnVnL3RyYWNlZmlsdGVyPQotb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2RlYnVnL2NtZG9jdW1lbnRtYW5hZ2VyPWZhbHNlCi1vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvZGVidWcvY21kb2N1bWVudGNhY2hlPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxNzUxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54bWwuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPjwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQwNTMwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jU2F0IE1hciAyNCAwMjoxODoyMyBFRFQgMjAwNw0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjINCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDANCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2E1YzVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNXZWQgTm92IDE1IDAyOjI2OjEwIEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmNhNWE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jV2VkIE5vdiAxNSAwMjoxMzozMSBFU1QgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMuakZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzLmpGbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzNlNjViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMuakZsZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotJSUKLQotJXRhYmxlCi0lcHVibGljCi0lZmluYWwKLSVjbGFzcyBYTUwxME5hbWVzCi0lZnVuY3Rpb24gaXNWYWxpZFhNTDEwTmFtZQotJXR5cGUgYm9vbGVhbgotJXVuaWNvZGUKLSVpZ25vcmVjYXNlCi0lYnVmZmVyIDIwNDgKLSVhcGlwcml2YXRlCi0KLVMgPSAoXHgyMCB8IFx4MDkgfCBceDBEIHwgXHgwQSkKLQotQmFzZUNoYXIgPSBbXHUwMDQxLVx1MDA1QVx1MDA2MS1cdTAwN0FcdTAwQzAtXHUwMEQ2XHUwMEQ4LVx1MDBGNlx1MDBGOC1cdTAwRkZcdTAxMDAtXHUwMTMxXHUwMTM0LVx1MDEzRVx1MDE0MS1cdTAxNDhcdTAxNEEtXHUwMTdFXHUwMTgwLVx1MDFDM1x1MDFDRC1cdTAxRjBcdTAxRjQtXHUwMUY1XHUwMUZBLVx1MDIxN1x1MDI1MC1cdTAyQThcdTAyQkItXHUwMkMxXHUwMzg2XHUwMzg4LVx1MDM4QVx1MDM4Q1x1MDM4RS1cdTAzQTFcdTAzQTMtXHUwM0NFXHUwM0QwLVx1MDNENlx1MDNEQVx1MDNEQ1x1MDNERVx1MDNFMFx1MDNFMi1cdTAzRjNcdTA0MDEtXHUwNDBDXHUwNDBFLVx1MDQ0Rlx1MDQ1MS1cdTA0NUNcdTA0NUUtXHUwNDgxXHUwNDkwLVx1MDRDNFx1MDRDNy1cdTA0QzhcdTA0Q0ItXHUwNENDXHUwNEQwLVx1MDRFQlx1MDRFRS1cdTA0RjVcdTA0RjgtXHUwNEY5XHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MS1cdTA1ODZcdTA1RDAtXHUwNUVBXHUwNUYwLVx1MDVGMlx1MDYyMS1cdTA2M0FcdTA2NDEtXHUwNjRBXHUwNjcxLVx1MDZCN1x1MDZCQS1cdTA2QkVcdTA2QzAtXHUwNkNFXHUwNkQwLVx1MDZEM1x1MDZENVx1MDZFNS1cdTA2RTZcdTA5MDUtXHUwOTM5XHUwOTNEXHUwOTU4LVx1MDk2MVx1MDk4NS1cdTA5OENcdTA5OEYtXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOURDLVx1MDlERFx1MDlERi1cdTA5RTFcdTA5RjAtXHUwOUYxXHUwQTA1LVx1MEEwQVx1MEEwRi1cdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMi1cdTBBMzNcdTBBMzUtXHUwQTM2XHUwQTM4LVx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4Qlx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMi1cdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUUwXHUwQjA1LVx1MEIwQ1x1MEIwRi1cdTBCMTBcdTBCMTMtXHUwQjI4XHUwQjJBLVx1MEIzMFx1MEIzMi1cdTBCMzNcdTBCMzYtXHUwQjM5XHUwQjNEXHUwQjVDLVx1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTktXHUwQjlBXHUwQjlDXHUwQjlFLVx1MEI5Rlx1MEJBMy1cdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCNVx1MEJCNy1cdTBCQjlcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzMzXHUwQzM1LVx1MEMzOVx1MEM2MC1cdTBDNjFcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENERVx1MENFMC1cdTBDRTFcdTBEMDUtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEMjhcdTBEMkEtXHUwRDM5XHUwRDYwLVx1MEQ2MVx1MEUwMS1cdTBFMkVcdTBFMzBcdTBFMzItXHUwRTMzXHUwRTQwLVx1MEU0NVx1MEU4MS1cdTBFODJcdTBFODRcdTBFODctXHUwRTg4XHUwRThBXHUwRThEXHUwRTk0LVx1MEU5N1x1MEU5OS1cdTBFOUZcdTBFQTEtXHUwRUEzXHUwRUE1XHUwRUE3XHUwRUFBLVx1MEVBQlx1MEVBRC1cdTBFQUVcdTBFQjBcdTBFQjItXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEY0MC1cdTBGNDdcdTBGNDktXHUwRjY5XHUxMEEwLVx1MTBDNVx1MTBEMC1cdTEwRjZcdTExMDBcdTExMDItXHUxMTAzXHUxMTA1LVx1MTEwN1x1MTEwOVx1MTEwQi1cdTExMENcdTExMEUtXHUxMTEyXHUxMTNDXHUxMTNFXHUxMTQwXHUxMTRDXHUxMTRFXHUxMTUwXHUxMTU0LVx1MTE1NVx1MTE1OVx1MTE1Ri1cdTExNjFcdTExNjNcdTExNjVcdTExNjdcdTExNjlcdTExNkQtXHUxMTZFXHUxMTcyLVx1MTE3M1x1MTE3NVx1MTE5RVx1MTFBOFx1MTFBQlx1MTFBRS1cdTExQUZcdTExQjctXHUxMUI4XHUxMUJBXHUxMUJDLVx1MTFDMlx1MTFFQlx1MTFGMFx1MTFGOVx1MUUwMC1cdTFFOUJcdTFFQTAtXHUxRUY5XHUxRjAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMTI2XHUyMTJBLVx1MjEyQlx1MjEyRVx1MjE4MC1cdTIxODJcdTMwNDEtXHUzMDk0XHUzMEExLVx1MzBGQVx1MzEwNS1cdTMxMkNcdUFDMDAtXHVEN0EzXQotCi1JZGVvZ3JhcGhpYyA9IFtcdTRFMDAtXHU5RkE1XHUzMDA3XHUzMDIxLVx1MzAyOV0KLQotQ29tYmluaW5nQ2hhciA9IFtcdTAzMDAtXHUwMzQ1XHUwMzYwLVx1MDM2MVx1MDQ4My1cdTA0ODZcdTA1OTEtXHUwNUExXHUwNUEzLVx1MDVCOVx1MDVCQi1cdTA1QkRcdTA1QkZcdTA1QzEtXHUwNUMyXHUwNUM0XHUwNjRCLVx1MDY1Mlx1MDY3MFx1MDZENi1cdTA2RENcdTA2REQtXHUwNkRGXHUwNkUwLVx1MDZFNFx1MDZFNy1cdTA2RThcdTA2RUEtXHUwNkVEXHUwOTAxLVx1MDkwM1x1MDkzQ1x1MDkzRS1cdTA5NENcdTA5NERcdTA5NTEtXHUwOTU0XHUwOTYyLVx1MDk2M1x1MDk4MS1cdTA5ODNcdTA5QkNcdTA5QkVcdTA5QkZcdTA5QzAtXHUwOUM0XHUwOUM3LVx1MDlDOFx1MDlDQi1cdTA5Q0RcdTA5RDdcdTA5RTItXHUwOUUzXHUwQTAyXHUwQTNDXHUwQTNFXHUwQTNGXHUwQTQwLVx1MEE0Mlx1MEE0Ny1cdTBBNDhcdTBBNEItXHUwQTREXHUwQTcwLVx1MEE3MVx1MEE4MS1cdTBBODNcdTBBQkNcdTBBQkUtXHUwQUM1XHUwQUM3LVx1MEFDOVx1MEFDQi1cdTBBQ0RcdTBCMDEtXHUwQjAzXHUwQjNDXHUwQjNFLVx1MEI0M1x1MEI0Ny1cdTBCNDhcdTBCNEItXHUwQjREXHUwQjU2LVx1MEI1N1x1MEI4Mi1cdTBCODNcdTBCQkUtXHUwQkMyXHUwQkM2LVx1MEJDOFx1MEJDQS1cdTBCQ0RcdTBCRDdcdTBDMDEtXHUwQzAzXHUwQzNFLVx1MEM0NFx1MEM0Ni1cdTBDNDhcdTBDNEEtXHUwQzREXHUwQzU1LVx1MEM1Nlx1MEM4Mi1cdTBDODNcdTBDQkUtXHUwQ0M0XHUwQ0M2LVx1MENDOFx1MENDQS1cdTBDQ0RcdTBDRDUtXHUwQ0Q2XHUwRDAyLVx1MEQwM1x1MEQzRS1cdTBENDNcdTBENDYtXHUwRDQ4XHUwRDRBLVx1MEQ0RFx1MEQ1N1x1MEUzMVx1MEUzNC1cdTBFM0FcdTBFNDctXHUwRTRFXHUwRUIxXHUwRUI0LVx1MEVCOVx1MEVCQi1cdTBFQkNcdTBFQzgtXHUwRUNEXHUwRjE4LVx1MEYxOVx1MEYzNVx1MEYzN1x1MEYzOVx1MEYzRVx1MEYzRlx1MEY3MS1cdTBGODRcdTBGODYtXHUwRjhCXHUwRjkwLVx1MEY5NVx1MEY5N1x1MEY5OS1cdTBGQURcdTBGQjEtXHUwRkI3XHUwRkI5XHUyMEQwLVx1MjBEQ1x1MjBFMVx1MzAyQS1cdTMwMkZcdTMwOTlcdTMwOUFdCi0KLURpZ2l0ID0gIFtcdTAwMzAtXHUwMDM5XHUwNjYwLVx1MDY2OVx1MDZGMC1cdTA2RjlcdTA5NjYtXHUwOTZGXHUwOUU2LVx1MDlFRlx1MEE2Ni1cdTBBNkZcdTBBRTYtXHUwQUVGXHUwQjY2LVx1MEI2Rlx1MEJFNy1cdTBCRUZcdTBDNjYtXHUwQzZGXHUwQ0U2LVx1MENFRlx1MEQ2Ni1cdTBENkZcdTBFNTAtXHUwRTU5XHUwRUQwLVx1MEVEOVx1MEYyMC1cdTBGMjldCi0KLUV4dGVuZGVyID0gW1x1MDBCN1x1MDJEMFx1MDJEMVx1MDM4N1x1MDY0MFx1MEU0Nlx1MEVDNlx1MzAwNVx1MzAzMS1cdTMwMzVcdTMwOUQtXHUzMDlFXHUzMEZDLVx1MzBGRV0KLQotTGV0dGVyID0gKHtCYXNlQ2hhcn0gfCB7SWRlb2dyYXBoaWN9KQotCi1OYW1lQ2hhciA9ICh7TGV0dGVyfSB8IHtEaWdpdH0gfCAuIHwgLSB8IF8gfCA6IHwge0NvbWJpbmluZ0NoYXJ9IHwge0V4dGVuZGVyfSkKLQotTmFtZSA9ICh7TGV0dGVyfSB8IF8gfCA6ICkgKHtOYW1lQ2hhcn0pKgotCi0KLQotJXsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotCSAqLwotCXB1YmxpYyBYTUwxME5hbWVzKCkgewotCQl0aGlzLnp6UmVhZGVyID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkWE1MMTBOYW1lKFN0cmluZyBzdHJpbmdUb0NoZWNrKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXl5cmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKHN0cmluZ1RvQ2hlY2spKTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGlzVmFsaWRYTUwxME5hbWUoKTsKLQkJfQotCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGQgYmUgaW1wb3NzaWJsZSB3aXRoIHN0cmluZ3MsIGJ1dCBpZiBvY2N1cnMsIGp1c3QgbWVhbnMKLQkJCS8vICJub3QiCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotJX0KLQotCi0KLQotJSUKLQotPFlZSU5JVElBTD4KLXsKLQotCS8vIGRvbid0IG1hdGNoIGlmIGNvbnRhaW5zIHRyYWlsaW5nIG9yIGVtYmVkZGVkIHNwYWNlCi0Je05hbWV9IHtTfSsgICAgICAgICB7cmV0dXJuIGZhbHNlO30KLQl7TmFtZX0ge1N9KyB7TmFtZX0gIHtyZXR1cm4gZmFsc2U7fQotCi0Je05hbWV9ICAgICAgICAgICAgICB7cmV0dXJuIHRydWU7fQotCi0JLy8gbWF0Y2ggYW55dGhpbmcgc2hvdWxkIGNvbWUgbGFzdAotCS4gICAgICAgICAgICAgICAgICAge3JldHVybiBmYWxzZTt9Ci0KLX0KLQotCi0vLyB0aGlzIHJ1bGUgYWx3YXlzIGluIGVmZmVjdAotPDxFT0Y+PgotewotCXtyZXR1cm4gZmFsc2U7fQotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIuakZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyLmpGbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWQ1YjBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIuakZsZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qbmxzWFhYKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7DQotDQotDQotJSUNCi0NCi0lew0KLQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7DQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDgwMDA7DQotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcNCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOw0KLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOw0KLQ0KLQ0KLQlwdWJsaWMgWE1MSGVhZFRva2VuaXplcigpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7DQotICAgICAgICAgICAgICAgIC8qIHRoZSBpbnB1dCBkZXZpY2UgKi8NCi0gICAgICAgICAgICAgICAgenpSZWFkZXIgPSBpbjsNCi0NCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLw0KLSAgICAgICAgICAgICAgICB6elN0YXRlID0gMDsNCi0NCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLw0KLSAgICAgICAgICAgICAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsNCi0NCi0gICAgICAgICAgICAgICAgLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcw0KLSAgICAgICAgICAgICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovDQotICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheXMuZmlsbCh6ekJ1ZmZlciwgKGNoYXIpMCk7DQotDQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovDQotICAgICAgICAgICAgICAgIHp6TWFya2VkUG9zID0gMDsNCi0NCi0gICAgICAgICAgICAgICAgLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8NCi0gICAgICAgICAgICAgICAgenpQdXNoYmFja1BvcyA9IDA7DQotDQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLw0KLSAgICAgICAgICAgICAgICB6ekN1cnJlbnRQb3MgPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8NCi0gICAgICAgICAgICAgICAgenpTdGFydFJlYWQgPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKioNCi0gICAgICAgICAgICAgICAgICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotICAgICAgICAgICAgICAgICAqIGZyb20gaW5wdXQNCi0gICAgICAgICAgICAgICAgICovDQotICAgICAgICAgICAgICAgIHp6RW5kUmVhZCA9IDA7DQotDQotICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLSAgICAgICAgICAgICAgICB5eWxpbmUgPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gICAgICAgICAgICAgICAgeXljaGFyID0gMDsNCi0NCi0gICAgICAgICAgICAgICAgLyoqDQotICAgICAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0DQotICAgICAgICAgICAgICAgICAqIG9mIHRoZSBtYXRjaGVkIHRleHQNCi0gICAgICAgICAgICAgICAgICovDQotICAgICAgICAgICAgICAgIHl5Y29sdW1uID0gMDsNCi0NCi0gICAgICAgICAgICAgICAgLyoqDQotICAgICAgICAgICAgICAgICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nDQotICAgICAgICAgICAgICAgICAqIG9mIGEgbGluZQ0KLSAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICAgenpBdEJPTCA9IHRydWU7DQotDQotICAgICAgICAgICAgICAgIC8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0gICAgICAgICAgICAgICAgenpBdEVPRiA9IGZhbHNlOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8NCi0gICAgICAgICAgICAgICAgenpFT0ZEb25lID0gZmFsc2U7DQotDQotDQotICAgICAgICAgICAgICAgIGZTdGF0ZVN0YWNrLmNsZWFyKCk7DQotDQotICAgICAgICAgICAgICAgIGhhc01vcmUgPSB0cnVlOw0KLSAgCQkNCi0gIAl9DQotDQotDQotCXB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsNCi0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQlIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsNCi0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgew0KLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsNCi0JCQl2YWx1ZVRleHQgPSBudWxsOw0KLQkJfSBlbHNlIHsNCi0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsNCi0JCX0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsNCi0JCXJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOw0KLQl9DQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgew0KLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBwb3BTdGF0ZSgpIHsNCi0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQl9DQotCQ0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgew0KLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOw0KLQl9CQ0KLQ0KLSV9DQotDQotJWVvZnsNCi0JaGFzTW9yZT1mYWxzZTsNCi0lZW9mfQ0KLQ0KLSVwdWJsaWMNCi0lY2xhc3MgWE1MSGVhZFRva2VuaXplcg0KLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuDQotJXR5cGUgU3RyaW5nDQotJWNoYXINCi0ldW5pY29kZQ0KLSVpZ25vcmVjYXNlIA0KLS8vJWRlYnVnDQotJXN3aXRjaA0KLSVidWZmZXIgODE5Mg0KLQ0KLVVURjE2QkUgPSBceEZFXHhGRg0KLVVURjE2TEUgPSBceEZGXHhGRQ0KLVVURjgzQnl0ZUJPTSA9IFx4RUZceEJCXHhCRg0KLQ0KLS8vU3BhY2VDaGFyID0gW1x4MjBceDA5XQ0KLQ0KLS8vIFszXSBTIDo6PSAoMHgyMCB8IDB4OSB8IDB4RCB8IDB4QSkrDQotUyA9IFtceDIwXHgwOVx4MERceDBBXQ0KLQ0KLS8vQmVnaW5BdHRyaWJlVmFsdWUgPSB7U30qIFw9IHtTfSoNCi0NCi1MaW5lVGVybWluYXRvciA9IFxyfFxuDQotDQotLy8gWiBpcyB0aGUgc2luZ2xlLWJ5dGUgemVybyBjaGFyYWN0ZXIgdG8gYmUgdXNlZCBpbiBwYXJzaW5nIGRvdWJsZS1ieXRlIGZpbGVzDQotWiA9IChceDAwKT8NCi1TX1VURiA9IHtafXtTfXtafQ0KLUJlZ2luQXR0cmlidXRlVmFsdWVVVEYgPSB7U19VVEZ9KiBcPSB7U19VVEZ9Kg0KLQ0KLSVzdGF0ZSBTVF9YTUxEZWNsDQotJXN0YXRlIFF1b3RlZEF0dHJpYnV0ZVZhbHVlDQotJXN0YXRlIERRX1NUUklORw0KLSVzdGF0ZSBTUV9TVFJJTkcNCi0lc3RhdGUgVW5EZWxpbWl0ZWRTdHJpbmcNCi0NCi0lJQ0KLQ0KLQ0KLTxZWUlOSVRJQUw+ICANCi17DQotCS8vIGZvcmNlIHRvIHN0YXJ0IGF0IGJlZ2lubmluZyBvZiBsaW5lICheKSBhbmQgYXQgYmVnaW5uaW5nIG9mIGZpbGUgKHl5Y2hhciA9PSAwKQ0KLQlee1VURjE2QkV9ICAgCQl7aWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7fX0NCi0JXntVVEYxNkxFfSAgIAkJe2lmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFO319DQotCV57VVRGODNCeXRlQk9NfSAgIAl7aWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTt9fQ0KLQkNCi0JLy8gZm9yY2UgdG8gYmUgc3RhcnRlZCBvbiBmaXJzdCBsaW5lLCBidXQgd2UgZG8gYWxsb3cgcHJlY2VlZGluZyBzcGFjZXMNCi0JXiB7U19VVEZ9KiAoe1p9PHtafVw/e1p9eHtafW17Wn1se1p9KXtTX1VURn0rIHtpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O319DQotCQ0KLX0JDQotCQ0KLTxTVF9YTUxEZWNsPiANCi17DQotCSh7Wn12e1p9ZXtafXJ7Wn1ze1p9aXtafW97Wn1ue1p9KSB7QmVnaW5BdHRyaWJ1dGVWYWx1ZVVURn0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xWZXJzaW9uO30NCi0JKHtafWV7Wn1ue1p9Y3tafW97Wn1ke1p9aXtafW57Wn1ne1p9KSB7QmVnaW5BdHRyaWJ1dGVWYWx1ZVVURn0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nO30NCi0JLy8gbm90ZSB0aGUgImZvcmNlZCBlbmQiICh2aWEgJ2hhc01vcmU9ZmFsc2UnKSBvbmNlIHRoZSBlbmQgb2YgWE1MIERlY2xhcmF0aW9uIGZvdW5kDQotCS8vIFRoaXMgaXMgc2luY2Ugbm9uLWFzY2lpIGNoYXJzIG1heSBmb2xsb3cgYW5kIG1heSBjYXVzZSBJT0V4Y2VwdGlvbnMgd2hpY2ggd291bGQgbm90IG9jY3VyIG9uY2Ugc3RyZWFtIGlzIA0KLQkvLyByZWFkIHdpdGggaW5jb3JyZWN0IGVuY29kaW5nIChzdWNoIGFzIGlmIHBsYXRmb3JtIGVuY29kaW5nIGlzIGluIGVmZmVjdCB1bnRpbCB0cnVlIGVuY29kaW5nIGRldGVjdGVkKS4gDQotCSh7Wn1cP3tafT57Wn0pICAgIHt5eWJlZ2luKFlZSU5JVElBTCk7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDt9DQotfQkNCi0NCi0JDQotDQotPFF1b3RlZEF0dHJpYnV0ZVZhbHVlPg0KLXsNCi0Je1p9XCJ7Wn0gICAgICAgIHsgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9DQotCXtafVwne1p9CQkJeyB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0NCi0JLy8gaW4gdGhpcyBzdGF0ZSwgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHNwYWNlIGNoYXJhY3RlciBjYW4gc3RhcnQgYW4gdW5kZWxpbWl0ZWQgc3RyaW5nDQotCXtTX1VURn0qLiAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTt9DQotDQotfQkNCi0NCi0NCi08RFFfU1RSSU5HPg0KLXsNCi0NCi0Je1p9XCJ7Wn0gICAgICAgICAgICAgICAgICAgICAgeyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOyB9DQotICAJe1p9e0xpbmVUZXJtaW5hdG9yfXtafSAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafVw/e1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9PHtafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQlbXlx4MDBdCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9DQotDQotfQ0KLQ0KLTxTUV9TVFJJTkc+DQotew0KLQ0KLQl7Wn1cJ3tafSAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7fQ0KLSAgCXtafXtMaW5lVGVybWluYXRvcn17Wn0gICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn0le1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn08e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCVteXHgwMF0JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0NCi0NCi19DQotDQotPFVuRGVsaW1pdGVkU3RyaW5nPg0KLXsNCi0NCi0Je1NfVVRGfSAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0NCi0gIAl7Wn17TGluZVRlcm1pbmF0b3J9e1p9ICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9XD97Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafTx7Wn0JDQotCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQkvLyB0aGVzZSBhcmUgYSBiaXQgc3BlY2lhbCwgc2luY2Ugd2Ugc3RhcnRlZCBhbiB1bmRlbGltaXQgc3RyaW5nLCBidXQgZm91bmQgYSBxdW90ZSAuLi4gcHJvYmFibHkgaW5kaWNhdGVzIGEgbWlzc2luZyBiZWdpbm5pbmcgcXVvdGUNCi0Je1p9XCd7Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30NCi0JDQotCXtafVwie1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9DQotCQ0KLQlbXlx4MDBdCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9DQotDQotfQ0KLQ0KLS8vIFRoZSAibWF0Y2ggYW55dGhpbmciIHJ1bGUgc2hvdWxkIGFsd2F5cyBiZSBpbiBlZmZlY3QgZXhjZXB0IGZvciB3aGVuIGxvb2tpbmcgZm9yIGVuZCBvZiBzdHJpbmcNCi0vLyAoVGhhdCBpcywgcmVtZW1iZXIgdG8gdXBkYXRlIHN0YXRlIGxpc3QgaWYvd2hlbiBuZXcgc3RhdGVzIGFkZGVkKQ0KLS58XG4Je2lmKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO319DQotDQotLy8gdGhpcyBydWxlIGFsd2F5cyBpbiBlZmZlY3QNCi08PEVPRj4+ICAgICAgICAge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjt9DQotDQotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkTmFtZXMueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGROYW1lcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTc1NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGROYW1lcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0idG9rZW5pemVyIiBkZWZhdWx0PSJYTUwxME5hbWVzIj4KLQkKLQk8IS0tIE5vdGU6IGZvciBFY2xpcHNlIGVudi4sIHRoZSBKRmxleCAxLjQgamFyIHNob3VsZCBiZSBhZGRlZCAKLQl0byB0aGUgYW50IGdsb2JhbCBlbnRyaWVzICAtLT4KLQk8dGFza2RlZiBjbGFzc25hbWU9IkpGbGV4LmFudHRhc2suSkZsZXhUYXNrIiBuYW1lPSJqZmxleCIgLz4KLQkJCi0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5maWxlIiB2YWx1ZT0iWE1MMTBOYW1lcy5qRmxleCIvPgkJCQotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9IkhlYWRQYXJzZXJzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpciIgdmFsdWU9Ii4uL3NyYyIvPgotCQk8IS0tIHRvdWNoIGNhdXNlcyB0byBhbHdheXMgYnVpbGQsIHJlbW92ZSBmb3IgcmVhbCAnbWFrZScgYmVoYXZpb3IgLS0+Ci0JCTx0b3VjaCBmaWxlPSIke3NyYy5kaXJ9LyR7c3JjLmZpbGV9Ii8+Ci0JCQkJCQotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJYTUwxME5hbWVzIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudGNhbGwgdGFyZ2V0PSJydW4tamZsZXgiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnVuLWpmbGV4IiBkZXBlbmRzPSJpbml0Ij4KLQkJPGpmbGV4Ci0JICAgIAlmaWxlPSIke3NyYy5kaXJ9LyR7c3JjLmZpbGV9IgotCSAgICAJZGVzdGRpcj0iJHtkZXN0LmRpcn0iCi0JCQl2ZXJib3NlPSJ0cnVlIgotCQkJbm9iYWs9InRydWUiCi0JCQl0aW1lPSJvbiIKLQkgICAgLz4KLQk8L3RhcmdldD4KLQkKLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkUGFyc2VyLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkUGFyc2VyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk2MTlkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZFBhcnNlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0idG9rZW5pemVyIiBkZWZhdWx0PSJIZWFkVG9rZW5pemVyIj4KLQkKLQk8IS0tIE5vdGU6IGZvciBFY2xpcHNlIGVudi4sIHRoZSBKRmxleCAxLjQgamFyIHNob3VsZCBiZSBhZGRlZCAKLQl0byB0aGUgYW50IGdsb2JhbCBlbnRyaWVzICAtLT4KLQk8dGFza2RlZiBjbGFzc25hbWU9IkpGbGV4LmFudHRhc2suSkZsZXhUYXNrIiBuYW1lPSJqZmxleCIgLz4KLQkJCi0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5maWxlIiB2YWx1ZT0iWE1MSGVhZFRva2VuaXplci5qRmxleCIvPgkJCQotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9IkhlYWRQYXJzZXJzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpciIgdmFsdWU9Ii4uL3NyYyIvPgotCQk8IS0tIHRvdWNoIGNhdXNlcyB0byBhbHdheXMgYnVpbGQsIHJlbW92ZSBmb3IgcmVhbCAnbWFrZScgYmVoYXZpb3IgLS0+Ci0JCTx0b3VjaCBmaWxlPSIke3NyYy5kaXJ9LyR7c3JjLmZpbGV9Ii8+Ci0JCQkJCQotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJIZWFkVG9rZW5pemVyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudGNhbGwgdGFyZ2V0PSJydW4tamZsZXgiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnVuLWpmbGV4IiBkZXBlbmRzPSJpbml0Ij4KLQkJPGpmbGV4Ci0JICAgIAlmaWxlPSIke3NyYy5kaXJ9LyR7c3JjLmZpbGV9IgotCSAgICAJZGVzdGRpcj0iJHtkZXN0LmRpcn0iCi0JCQl2ZXJib3NlPSJ0cnVlIgotCQkJbm9iYWs9InRydWUiCi0JCQl0aW1lPSJvbiIKLQkgICAgLz4KLQk8L3RhcmdldD4KLQkKLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNTY3N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuNjAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYzt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmZhY3Rvcnk7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVtZjJ4bWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVuY29kaW5nO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZzt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLnF1aWNrc2Nhbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGFza3M7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5sb2dnaW5nO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0Ci1JbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudXRpbDsgdmVyc2lvbj0iMy44IiwKLSBjb20uaWJtLmljdS50ZXh0OyB2ZXJzaW9uPSIzLjgiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmFwYWNoZS54ZXJjZXM7YnVuZGxlLXZlcnNpb249IlsyLjkuMCwzLjAuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnM7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAxLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjUwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjIwMCwzLjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjEwMCwxLjMuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjMuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjMuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDEsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenk7IGV4Y2x1ZGU6PSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL1JFQURNRS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmE2NDY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1USGUgWE1MIHNwZWNpZmljIG1vZGVsIGltcGxlbWVudGF0aW9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDQ5YjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8sXAotICAgICAgICAgICAgICAgRGV2VGltZVN1cHBvcnQvCi1zb3VyY2UuLiA9IHNyYy1jYXRhbG9nLyxcCi0gICAgICAgICAgIHNyYy1jb250ZW50bW9kZWwvLFwKLSAgICAgICAgICAgc3JjLXZhbGlkYXRpb24vLFwKLSAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgIHNyYy1lbWZNb2RlbFN5bmNoLyxcCi0gICAgICAgICAgIHNyYy1zZWFyY2gvCi0KLW91dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNjFlYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC54bWwiPgotCTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlciIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vZWNsaXBzZS5vcmcvd2VidG9vbHMvd3N0L2NvbXBvbmVudHMveG1sL292ZXJ2aWV3Lmh0bWwiIC8+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTCIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MucHJvcGVydGllcyIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IlhNTFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcCIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLnNvdXJjZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5zb3VyY2UiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuYXBhY2hlLnhlcmNlcyIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWU3NDNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotcGx1Z2luTmFtZT1TdHJ1Y3R1cmVkIFNvdXJjZSBYTUwgTW9kZWwKLVN0cnVjdHVyZWRfWE1MX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWU9U3RydWN0dXJlZCBYTUwgRG9jdW1lbnQgRmFjdG9yeSBFeHRlbnNpb24KLVhNTF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1YTUwgKElsbGZvcm1lZCkKLSMgY29udGVudG1vZGVsIHN0cmluZ3MKLUNvbnRlbnRfTW9kZWxfRG9jdW1lbnRfRmFjdG9yaWVzX0V4dGVuc2lvbi5uYW1lPUNvbnRlbnQgTW9kZWwgRG9jdW1lbnQgRmFjdG9yaWVzCi1Db250ZW50X01vZGVsX0Fubm90YXRpb25fRmlsZXNfRXh0ZW5zaW9uLm5hbWU9Q29udGVudCBNb2RlbCBBbm5vdGF0aW9uIEZpbGVzCi1Nb2RlbF9RdWVyeV9FeHRlbnNpb24ubmFtZT1Nb2RlbCBRdWVyeSBFeHRlbnNpb24KLVhNTF9DYXRhbG9nX0NvbnRyaWJ1dGlvbnNfRXh0ZW5zaW9uX1BvaW50Lm5hbWU9WE1MIENhdGFsb2cgQ29udHJpYnV0aW9ucyBFeHRlbnNpb24gUG9pbnQKLVhTTF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1YU0wKLVhNSV9Db250ZW50X1R5cGU9WE1JCi1YTUxfVmFsaWRhdG9yLm5hbWU9WE1MIFZhbGlkYXRvcgotWE1MX1ZhbGlkYXRpb25fRXJyb3JfQ3VzdG9taXplci5uYW1lPVhNTCBWYWxpZGF0b3IgRXJyb3IgQ3VzdG9taXplciBFeHRlbnNpb24gUG9pbnQKLV92YWxpZGF0aW9uTWFya2VyLm5hbWU9WE1MIFByb2JsZW0KLV90YXNrTWFya2VyLm5hbWU9WE1MIFRhc2sKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmY2YTE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDwhLS0gQW4gZXh0ZW5zaW9uIGZvciBjb250cmlidXRpbmcgYSBYTUwgdmFsaWRhdGlvbiBlcnJvciBjdXN0b21pemVyLiAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVycm9yQ3VzdG9taXplciIgbmFtZT0iJVhNTF9WYWxpZGF0aW9uX0Vycm9yX0N1c3RvbWl6ZXIubmFtZSIgc2NoZW1hPSJzY2hlbWEvZXJyb3JDdXN0b21pemVyLmV4c2QiLz4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbEhhbmRsZXIiPgotCQk8bW9kZWxIYW5kbGVyCi0JCQlkZWZhdWx0PSJ0cnVlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9yWE1MIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlciI+Ci0JCTwvbW9kZWxIYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbEhhbmRsZXIiPgotCQk8bW9kZWxIYW5kbGVyCi0JCQlkZWZhdWx0PSJ0cnVlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9yWE1MIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZW1iZWRkZWRUeXBlSGFuZGxlciI+Ci0JCTxlbWJlZGRlZFR5cGVIYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5FbWJlZGRlZFhNTCI+Ci0JCTwvZW1iZWRkZWRUeXBlSGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50YXNrc2Nhbm5lciI+Ci0JCTxzY2FubmVyCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRhc2tzLlhNTEZpbGVUYXNrU2Nhbm5lciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGFza3MuWE1MRmlsZVRhc2tTY2FubmVyOm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50YXNrTWFya2VyIgotCQkJY29udGVudFR5cGVJZHM9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlpZD0idGFza01hcmtlciIKLQkJbmFtZT0iJV90YXNrTWFya2VyLm5hbWUiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLQkJPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRhc2ttYXJrZXIiLz4KLQkJPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KLQk8L2V4dGVuc2lvbj4KLQkgCi0gICA8IS0tIEhlcmUgd2UgZGVmaW5lIGEgbmV3IGV4dGVuc2lvbiBwb2ludC4gIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQKLSAgICAgICAgdG8gcHJvZ3JhbW1hdGljYWxseSBjb250cmlidXRlIGNhdGFsb2cgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2cuIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iY2F0YWxvZ0NvbnRyaWJ1dGlvbnMiIG5hbWU9IiVYTUxfQ2F0YWxvZ19Db250cmlidXRpb25zX0V4dGVuc2lvbl9Qb2ludC5uYW1lIiBzY2hlbWE9InNjaGVtYS9jYXRhbG9nQ29udHJpYnV0aW9ucy5leHNkIi8+Ci0KLSAgIDwhLS0gVGhpcyBleHRlbnNpb24gcG9pbnQgZXh0ZW5kcyB0aGUgQ29tbW9uIEV4dGVuc2JpbGUgVVJJIFJlc29sdmVyIHNvIHRoYXQKLSAgICAgICAgdGhlIFhNTCBDYXRhbG9nIGNhbiBwYXJ0aWNpcGFyZSBpbiByZXNvbHZpbmcgcHJvY2Vzc2VzLiAtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIucmVzb2x2ZXJFeHRlbnNpb25zIj4KLSAgICAgIDxyZXNvbHZlckV4dGVuc2lvbgotICAgICAgICAgICAgc3RhZ2U9InBvc3Rub3JtYWxpemF0aW9uIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLlhNTENhdGFsb2dVUklSZXNvbHZlckV4dGVuc2lvbiI+Ci0gICAgICA8L3Jlc29sdmVyRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmRvY3VtZW50Q3JlYXRpb24iCi0JCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnRmYWN0b3JpZXMiCi0JCW5hbWU9IiVTdHJ1Y3R1cmVkX1hNTF9Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZpbGVidWZmZXJzLkJhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmRvY3VtZW50Q3JlYXRpb24iCi0JCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnRmYWN0b3JpZXMyIgotCQluYW1lPSIlU3RydWN0dXJlZF9YTUxfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZSI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5maWxlYnVmZmVycy5CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlLmZpbGVUeXBlcyI+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InhzbCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ4c2x0Ij4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249ImRhZHgiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0id3NkbCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJuc3QiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ieG1pIj4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InhzZCI+Ci0JCTwvZmlsZVR5cGVzPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXRQcm9jZXNzb3JzIj4KLQkJPHByb2Nlc3NvcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuWE1MRm9ybWF0dGVyRm9ybWF0UHJvY2Vzc29yIgotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCI+Ci0JCTwvcHJvY2Vzc29yPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMzA4MyAtLT5cCi0JPCEtLSAgRllJOiB0aGlzIHhtaSB0eXBlICpzaG91bGQqIGJlIGRlZmluZWQgaW4gRU1GLCBidXQsIHNpbmNlIGlzbid0Ci0JCQl3ZSB3aWxsIGhlcmUuIEluIGZ1dHVyZSB2ZXJzaW9ucyBpcyBjb3VsZCBiZSByZW1vdmVkIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUuY29udGVudFR5cGVzIj4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ4bWkiCi0JCQlwcmlvcml0eT0ibG93IgotCQkJbmFtZT0iJVhNSV9Db250ZW50X1R5cGUiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtaXNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCI+Ci0JCTwvY29udGVudC10eXBlPgotCi0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0ieG1sLHhzbCx4c2x0LHdzZGwseHNkLGV4c2QseG1pIgotCQkJcHJpb3JpdHk9ImxvdyIKLQkJCW5hbWU9IiVYTUxfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnRleHQiCi0JCQlkZWZhdWx0LWNoYXJzZXQ9IlVURi04Ij4KLQkJCTxkZXNjcmliZXIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9yWE1MIiAvPgotCQk8L2NvbnRlbnQtdHlwZT4KLQotCQk8Y29udGVudC10eXBlCi0JCQlmaWxlLWV4dGVuc2lvbnM9InhzbCx4c2x0IgotCQkJcHJpb3JpdHk9ImhpZ2giCi0JCQluYW1lPSIlWFNMX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54c2xzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0JCQlkZWZhdWx0LWNoYXJzZXQ9IlVURi04Ij4KLQkJPC9jb250ZW50LXR5cGU+Ci0JPC9leHRlbnNpb24+Ci0KLQotCTwhLS0gaW5pdGlhbGl6ZSB4bWwgY29yZSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbi1wb2ludCBpZD0iZG9jdW1lbnRGYWN0b3JpZXMiIG5hbWU9IiVDb250ZW50X01vZGVsX0RvY3VtZW50X0ZhY3Rvcmllc19FeHRlbnNpb24ubmFtZSIgc2NoZW1hPSJzY2hlbWEvZG9jdW1lbnRGYWN0b3JpZXMuZXhzZCIvPgotCi0JPGV4dGVuc2lvbi1wb2ludCBpZD0ibW9kZWxRdWVyeUV4dGVuc2lvbnMiIG5hbWU9IiVNb2RlbF9RdWVyeV9FeHRlbnNpb24ubmFtZSIgc2NoZW1hPSJzY2hlbWEvbW9kZWxRdWVyeUV4dGVuc2lvbnMuZXhzZCIvPgotCi0JPGV4dGVuc2lvbi1wb2ludCBpZD0iYW5ub3RhdGlvbkZpbGVzIiBuYW1lPSIlQ29udGVudF9Nb2RlbF9Bbm5vdGF0aW9uX0ZpbGVzX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9hbm5vdGF0aW9uRmlsZXMuZXhzZCIvPgkKLQkJCi0JPGV4dGVuc2lvbiAKLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgICAgY29udGV4dD0iVUkiCi0gICAgICAgICAgICBrZXk9InJlbmRlcmVyRmFjdG9yeSIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVtZjJ4bWwuRU1GMkRPTVNTRVJlbmRlcmVyRmFjdG9yeSI+Ci0gICAgICAgPC91aUNvbnRleHRTZW5zaXRpdmVDbGFzcz4KLSAgPC9leHRlbnNpb24+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gUmVnaXN0ZXIgdGhlIFhNTCB2YWxpZGF0b3Igd2l0aCB0aGUgdmFsaWRhdGlvbiAJCS0tPgotCTwhLS0gZnJhbWV3b3JrLiAJCQkJCQkJCQkJICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InZhbGlkYXRpb25NYXJrZXIiCi0gICAgICAgICBuYW1lPSIlX3ZhbGlkYXRpb25NYXJrZXIubmFtZSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5wcm9ibGVtbWFya2VyIi8+Ci0gICAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgotIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIGlkPSJ4bWwiIG5hbWU9IiVYTUxfVmFsaWRhdG9yLm5hbWUiIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiI+Ci0gICAgICA8dmFsaWRhdG9yCi0gICAgICAgICAgICBidWlsZD0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvciIKLSAgICAgICAgICAgIG1hbnVhbD0idHJ1ZSIKLSAgICAgICAgICAgIHNvdXJjZWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTCIKLSAgICAgICAgICAgIHZlcnNpb249IjMiCi0gICAgICAgICAgICBtYXJrZXJJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnZhbGlkYXRpb25NYXJrZXIiPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiPjwvY29udGVudFR5cGU+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiPjwvY29udGVudFR5cGU+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54c2xzb3VyY2UiPjwvY29udGVudFR5cGU+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50bGRzb3VyY2UiPjwvY29udGVudFR5cGU+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9InhtbCI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICA8L3J1bGVzPgotICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICAgPGV4Y2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0JCQkJPHByb2plY3ROYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJOYXR1cmUiLz4KLQkJCQk8cHJvamVjdE5hdHVyZSBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuRUFSTmF0dXJlIi8+Ci0gICAgCQkJPGZpbGUgY2FzZVNlbnNpdGl2ZT0idHJ1ZSIgbmFtZT0iLnByb2plY3QiIHR5cGU9ImZpbGUiLz4KLSAgICAJCQk8ZmlsZSBjYXNlU2Vuc2l0aXZlPSJ0cnVlIiBuYW1lPSIuY2xhc3NwYXRoIiB0eXBlPSJmaWxlIi8+Ci0gICAgCQkJPGZpbGUgY2FzZVNlbnNpdGl2ZT0idHJ1ZSIgbmFtZT0iLnNldHRpbmdzIiAgdHlwZT0iZm9sZGVyIi8+Ci0gICAgICAgICAgICA8L3J1bGVzPgotICAgICAgICAgPC9leGNsdWRlPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL2Fubm90YXRpb25GaWxlcy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL2Fubm90YXRpb25GaWxlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDE3ZjU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uRmlsZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIgaWQ9ImFubm90YXRpb25GaWxlcyIgbmFtZT0iQ29udGVudCBNb2RlbCBBbm5vdGF0aW9uIEZpbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhbm5vdGF0aW9uRmlsZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uRmlsZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InB1YmxpY0lkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvY2F0YWxvZ0NvbnRyaWJ1dGlvbnMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9jYXRhbG9nQ29udHJpYnV0aW9ucy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2JhZDFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9jYXRhbG9nQ29udHJpYnV0aW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIiBpZD0iY2F0YWxvZ0NvbnRyaWJ1dGlvbnMiIG5hbWU9IlhNTCBDYXRhbG9nIENvbnRyaWJ1dGlvbnMgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyB0byBzcGVjaWZ5IGVudHJpZXMgZm9yIFhNTCBDYXRhbG9nLiAgQ2F0YWxvZyBlbnRyaWVzIGhhdmUgZm9ybWF0IHNwZWNpZmllZCBpbiAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9kb3dubG9hZC5waHAvMTQwNDEveG1sLWNhdGFsb2dzLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2VudGl0eS9zcGVjLmh0bWwmbHQ7L2EmZ3Q7LiAgCi1FYWNoIGNhdGFsb2cgZXh0ZW5zaW9uIGNvbnNpc3RzIG9mIGEgc2luZ2xlIGNhdGFsb2dDb250cmlidXRpb24gZWxlbWVudC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNhdGFsb2dDb250cmlidXRpb24iLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjYXRhbG9nQ29udHJpYnV0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgY2F0YWxvZ0NvbnRyaWJ1dGlvbiBlbGVtZW50IG1heSBoYXZlIGlkLCBhbmQgaXQgaXMganVzdCBhIGNvbnRhaW5lciBmb3IgdGhlIGNvbnRyaWJ1dGVkIGNhdGFsb2cgZW50cmllcy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHVibGljIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InN5c3RlbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ1cmkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibmV4dENhdGFsb2ciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElkIG9mIHRoZSBjYXRhbG9nIHRvIHdoaWNoIGVudHJpZXMgd2lsbCBiZSBhZGRlZC4gQ291bGQgYmUgJnF1b3Q7ZGVmYXVsdCZxdW90OywgYW5kIGlmIG9tbWl0ZWQsIGVudHJpZXMgYXJlIGFkZGVkIHRvIHRoZSBkZWZhdWx0IHdvcmtzcGFjZSBjYXRhbG9nLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwdWJsaWMiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSBwdWJsaWMgZWxlbWVudCBhc3NvY2lhdGVzIGEgVVJJIHJlZmVyZW5jZSB3aXRoIHRoZSBwdWJsaWMgaWRlbnRpdGllciBwb3J0aW9uIG9mIGFuIGV4dGVybmFsIGlkZW50aWZpZXIuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZCBvZiB0aGUgZWxlbWVudCwgb3B0aW9uYWwuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHVibGljSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHB1YmxpYyBpZGVudGlmaWVyIHBvcnRpb24gb2YgYW4gZXh0ZXJuYWwgaWRlbnRpZmllci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSB1cmkgYXR0cmlidXRlIGNvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4ueG1sIGZpbGUsIHVzZSBwbGF0Zm9ybTovIG9yIGZpbGU6LyBwcm90b2NvbHMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9IndlYlVSTCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbHRlcm5hdGl2ZSBXZWIgYWRkcmVzcyBmb3IgdGhlIHB1YmxpYyBJRAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzeXN0ZW0iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSBzeXN0ZW0gZWxlbWVudHMgYXNzb2NpYXRlcyBhIFVSSSByZWZlcmVuY2Ugd2l0aCB0aGUgc3lzdGVtIGlkZW50aWZpZXIgb2YgYW4gZXh0ZXJuYWwgaWRlbnRpZmllcgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSWQgb2YgdGhlIGVsZW1lbnQsIG9wdGlvbmFsLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN5c3RlbUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBzeXN0ZW0gaWRlbnRpZmllciBwb3J0aW9uIG9mIGFuIGV4dGVybmFsIGlkZW50aWZpZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJpIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgdXJpIGF0dHJpYnV0ZSBjb3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgcGx1Z2luLnhtbCBmaWxlLCB1c2UgcGxhdGZvcm06LyBvciBmaWxlOi8gcHJvdG9jb2xzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idXJpIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgdXJpIGVsZW1lbnQgYXNzb2NpYXRlcyBhIFVSSSByZWZlcmVuY2Ugd2l0aCB0aGUgYSBVUkkgcmVmZXJlbmNlIHRoYXQgaXMgbm90IHBhcnQgb2YgYW4gZXh0ZXJuYWwgaWRlbnRpZmllci4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElkIG9mIHRoZSBlbGVtZW50LCBvcHRpb25hbC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSB1cmkgYXR0cmlidXRlIGNvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4ueG1sIGZpbGUsIHVzZSBwbGF0Zm9ybTovIG9yIGZpbGU6LyBwcm90b2NvbHMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBVUkkgcmVmZXJlbmNlIHRoYXQgaXMgbm90IHBhcnQgb2YgYW4gZXh0ZXJuYWwgaWRlbnRpdGllci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibmV4dENhdGFsb2ciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSBuZXh0Q2F0YWxvZyBlbGVtZW50cyBpbmRpY2F0ZSBhZGRpdGlvbmFsIGNhdGFsb2cgZW50cnkgZmlsZShzKSB0byBiZSBjb25zaWRlcmVkIGR1cmluZyB0aGUgcHJvY2VzcyBvZiByZXNvbHV0aW9uLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZCBvZiB0aGUgZWxlbWVudCwgb3B0aW9uYWwuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHVyaSBhdHRyaWJ1dGUgY291bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHBsdWdpbi54bWwgZmlsZSwgdXNlIHBsYXRmb3JtOi8gb3IgZmlsZTovIHByb3RvY29scy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiAKLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jYXRhbG9nQ29udHJpYnV0aW9ucyZxdW90OyZndDsKLSAgICAgICZsdDtjYXRhbG9nQ29udHJpYnV0aW9uJmd0OyAKLSAgICAgICAgICZsdDtzeXN0ZW0gCi0gICAgICAgICAgICAgICBzeXN0ZW1JZD0mcXVvdDtodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyZxdW90OwotICAgICAgICAgICAgICAgdXJpPSZxdW90O2RhdGEveHNkL3dzZGwueG1sJnF1b3Q7ICZndDsgCi0gICAgICAgICAgICAmbHQ7cHJvcGVydHkgCi0gICAgICAgICAgICAgICAgICBuYW1lPSZxdW90O3dlYlVSTCZxdW90OwotICAgICAgICAgICAgICAgICAgdmFsdWU9JnF1b3Q7aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8mcXVvdDsvJmd0OwotICAgICAgICAgJmx0Oy9zeXN0ZW0mZ3Q7Ci0gICAgICAgICAmbHQ7dXJpCi0gICAgICAgICAgICAgICBuYW1lPSZxdW90O2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8mcXVvdDsgCi0gICAgICAgICAgICAgICB1cmk9JnF1b3Q7ZGF0YS94c2Qvc29hcC54c2QmcXVvdDsvJmd0OyAKLSAgICAgICAgICZsdDtwdWJsaWMKLSAgICAgICAgICAgICAgIHB1YmxpY0lkPSZxdW90O2h0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSZxdW90OwotICAgICAgICAgICAgICAgdXJpPSZxdW90O2RhdGEveHNkL1hTTFNjaGVtYS54c2QmcXVvdDsmZ3Q7Ci0gICAgICAgICAmbHQ7L3B1YmxpYyZndDsKLSAgICAgICAgICZsdDtuZXh0Q2F0YWxvZwotICAgICAgICAgICAgICAgaWQ9JnF1b3Q7bmVzdGVkQ2F0YWxvZyZxdW90OyAKLSAgICAgICAgICAgICAgIGNhdGFsb2c9JnF1b3Q7ZGF0YS9jYXRhbG9nMS54bWwmcXVvdDsvJmd0OyAKLSAgICAgICZsdDsvY2F0YWxvZ0NvbnRyaWJ1dGlvbiZndDsgCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL2RvY3VtZW50RmFjdG9yaWVzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvZG9jdW1lbnRGYWN0b3JpZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwZDkwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvZG9jdW1lbnRGYWN0b3JpZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIgaWQ9ImRvY3VtZW50RmFjdG9yaWVzIiBuYW1lPSJDb250ZW50IE1vZGVsIERvY3VtZW50IEZhY3RvcmllcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjdG9yeSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmFjdG9yeSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9lcnJvckN1c3RvbWl6ZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9lcnJvckN1c3RvbWl6ZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4ZjE5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvZXJyb3JDdXN0b21pemVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiIGlkPSJlcnJvckN1c3RvbWl6ZXIiIG5hbWU9IlhNTCBWYWxpZGF0aW9uIEVycm9yIEN1c3RvbWl6ZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGVycm9yIGN1c3RvbWl6ZXIgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhIGNsaWVudCB0byBjb250cmlidXRlIGFuIGVycm9yIGN1c3RvbWl6ZXIgZm9yIGEgc3BlY2lmaWMgbmFtZXNwYWNlLiBUaGUgZXJyb3IgY3VzdG9taXplciBjYW4gcHJvdmlkZSBlcnJvciBtZXNzYWdlcyB0aGF0IGFyZSBtb3JlIGRvbWFpbiBzcGVjaWZpYyB0aGFuIHRoZSBnZW5lcmljIGVycm9yIG1lc3NhZ2VzIHByb3ZpZGVkIGJ5IHRoZSB1bmRlcmx5aW5nIGdlbmVyaWMgWE1MIHZhbGlkYXRvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZXJyb3JDdXN0b21pemVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJlcnJvckN1c3RvbWl6ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWVzcGFjZSBmb3Igd2hpY2ggdGhpcyBlcnJvciBjdXN0b21pemVyIHdpbGwgY29uc2lkZXIgZXJyb3IgY3VzdG9taXphdGlvbnMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXImbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIEVycm9yIEN1c3RvbWl6ZXIgY29udHJpYnV0aW9uOgotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIGlkPSZxdW90O3NhbXBsZUVycm9yQ3VzdG9taXplciZxdW90OwotICAgICAgICAgbmFtZT0mcXVvdDtTYW1wbGUgRXJyb3IgQ3VzdG9taXplciZxdW90OwotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmVycm9yQ3VzdG9taXplciZxdW90OyZndDsKLSAgICAgICZsdDtlcnJvckN1c3RvbWl6ZXIKLSAgICAgICAgICAgIG5hbWVzcGFjZT0mcXVvdDtodHRwOi8vc2FtcGxlLm5hbWVzcGFjZSZxdW90OwotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLlNhbXBsZUVycm9yQ3VzdG9taXplciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBzdXBwbGllZCBjbGFzcyBtdXN0IGltcGxlbWVudCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXImbHQ7L2NvZGUmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL21vZGVsUXVlcnlFeHRlbnNpb25zLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvbW9kZWxRdWVyeUV4dGVuc2lvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIyZjk3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvbW9kZWxRdWVyeUV4dGVuc2lvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIiBpZD0ibW9kZWxRdWVyeUV4dGVuc2lvbnMiIG5hbWU9Ik1vZGVsIFF1ZXJ5IEV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGludGVybmFsPSJ0cnVlIiAvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtb2RlbFF1ZXJ5RXh0ZW5zaW9uIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJtb2RlbFF1ZXJ5RXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBbGxvd3MgZm9yIHRoZSBjdXN0b21pemF0aW9uIG9mIHJldHVybmVkIHZhdWVzIGZyb20gYSBNb2RlbFF1ZXJ5IG9iamVjdC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uLk1vZGVsUXVlcnlFeHRlbnNpb246Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGVudFR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQ29udGVudCBUeXBlcyBmb3Igd2hpY2ggdG8gdXNlIHRoaXMgZXh0ZW5zaW9uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ODZjMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTW9lbGxlciAtIEFkZGVkIFhNTCBDYXRhbG9ncyAxLjEgc3VwcG9ydAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSURlbGVnYXRlQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSVJld3JpdGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JU3VmZml4RW50cnk7Ci1wdWJsaWMgY2xhc3MgQ2F0YWxvZyBpbXBsZW1lbnRzIElDYXRhbG9nCi17Ci0KLQljbGFzcyBDYXRhbG9nTFMKLQl7Ci0JCXB1YmxpYyB2b2lkIGxvYWQoKQotCQl7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2F2ZSgpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCW5ldyBDYXRhbG9nV3JpdGVyKCkud3JpdGUoQ2F0YWxvZy50aGlzLCBsb2NhdGlvbik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgRGVmYXVsdENhdGFsb2dMUyBleHRlbmRzIENhdGFsb2dMUwotCXsKLQkJcHVibGljIHZvaWQgbG9hZCgpCi0JCXsKLQkJCU5leHRDYXRhbG9nIHVzZXJDYXRhbG9nUmVmZXJlbmNlID0gbmV3IE5leHRDYXRhbG9nKCk7Ci0JCQl1c2VyQ2F0YWxvZ1JlZmVyZW5jZS5zZXRJZChYTUxDb3JlUGx1Z2luLlVTRVJfQ0FUQUxPR19JRCk7Ci0JCQl1c2VyQ2F0YWxvZ1JlZmVyZW5jZS5zZXRDYXRhbG9nTG9jYXRpb24oVVNFUl9DQVRBTE9HX0ZJTEUpOwotCQkJYWRkQ2F0YWxvZ0VsZW1lbnQodXNlckNhdGFsb2dSZWZlcmVuY2UpOwotCi0JCQlOZXh0Q2F0YWxvZyBzeXN0ZW1DYXRhbG9nUmVmZXJlbmNlID0gbmV3IE5leHRDYXRhbG9nKCk7Ci0JCQlzeXN0ZW1DYXRhbG9nUmVmZXJlbmNlLnNldElkKFhNTENvcmVQbHVnaW4uU1lTVEVNX0NBVEFMT0dfSUQpOwotCQkJc3lzdGVtQ2F0YWxvZ1JlZmVyZW5jZS5zZXRDYXRhbG9nTG9jYXRpb24oU1lTVEVNX0NBVEFMT0dfRklMRSk7Ci0JCQlhZGRDYXRhbG9nRWxlbWVudChzeXN0ZW1DYXRhbG9nUmVmZXJlbmNlKTsKLQotCQkJLyoKLQkJCSAqIEhlcmUgd2Ugc2F2ZSB0aGUgZmlsZSBpbiBvcmRlciB0byAncmVmbGVjdCcgdGhlIGNhdGFsb2cgdGhhdAotCQkJICogd2UndmUgY3JlYXRlZCBmcm9tIHBsdWctaW4gZXh0ZW5zaW9ucyB0byBkaXNrLiBUaGUgJ2RlZmF1bHQnCi0JCQkgKiBjYXRhbG9nIGlzIG9ubHkgZXZlciB3cml0dGVuIHRvIGRpc2sgYW5kIG5ldmVyIHJlYWQgZnJvbSBkaXNrLgotCQkJICovCi0JCQlzYXZlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDb21wYXJhdG9yIExPTkdFU1RfUkVXUklURV9GSVJTVCA9IG5ldyBDb21wYXJhdG9yKCkgCi0JewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGVudHJ5MSwgT2JqZWN0IGVudHJ5MikgCi0JCXsKLQkJCVN0cmluZyBzdGFydDEgPSAoKElSZXdyaXRlRW50cnkpZW50cnkxKS5nZXRTdGFydFN0cmluZygpOwotCQkJU3RyaW5nIHN0YXJ0MiA9ICgoSVJld3JpdGVFbnRyeSllbnRyeTIpLmdldFN0YXJ0U3RyaW5nKCk7Ci0JCQkKLQkJCS8vIEJpZ2dlciBpcyBlYXJsaWVyCi0JCQlyZXR1cm4gc3RhcnQyLmxlbmd0aCgpIC0gc3RhcnQxLmxlbmd0aCgpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIENvbXBhcmF0b3IgTE9OR0VTVF9TVUZGSVhfRklSU1QgPSBuZXcgQ29tcGFyYXRvcigpIAotCXsKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBlbnRyeTEsIE9iamVjdCBlbnRyeTIpIAotCQl7Ci0JCQlTdHJpbmcgc3VmZml4MSA9ICgoSVN1ZmZpeEVudHJ5KWVudHJ5MSkuZ2V0U3VmZml4KCk7Ci0JCQlTdHJpbmcgc3VmZml4MiA9ICgoSVN1ZmZpeEVudHJ5KWVudHJ5MikuZ2V0U3VmZml4KCk7Ci0JCQkKLQkJCS8vIEJpZ2dlciBpcyBlYXJsaWVyCi0JCQlyZXR1cm4gc3VmZml4Mi5sZW5ndGgoKSAtIHN1ZmZpeDEubGVuZ3RoKCk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcGFyYXRvciBMT05HRVNUX0RFTEVHQVRFX1BSRUZJWF9GSVJTVCA9IG5ldyBDb21wYXJhdG9yKCkgCi0JewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGVudHJ5MSwgT2JqZWN0IGVudHJ5MikgCi0JCXsKLQkJCVN0cmluZyBwcmVmaXgxID0gKChJRGVsZWdhdGVDYXRhbG9nKWVudHJ5MSkuZ2V0U3RhcnRTdHJpbmcoKTsKLQkJCVN0cmluZyBwcmVmaXgyID0gKChJRGVsZWdhdGVDYXRhbG9nKWVudHJ5MikuZ2V0U3RhcnRTdHJpbmcoKTsKLQkJCQotCQkJLy8gQmlnZ2VyIGlzIGVhcmxpZXIKLQkJCXJldHVybiBwcmVmaXgyLmxlbmd0aCgpIC0gcHJlZml4MS5sZW5ndGgoKTsKLQkJfQotCX07Ci0KLQljbGFzcyBJbnRlcm5hbFJlc29sdmVyCi0JewotCQlwcm90ZWN0ZWQgTWFwIHB1YmxpY01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJcHJvdGVjdGVkIE1hcCBzeXN0ZW1NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXByb3RlY3RlZCBNYXAgdXJpTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQkvLyBUaGVzZSBhcmUgc29ydGVkIGJ5IGxvbmdlc3QgImtleSIgZmlyc3QuCi0JCXByb3RlY3RlZCBMaXN0IHJld3JpdGVTeXN0ZW1MaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcHJvdGVjdGVkIExpc3QgcmV3cml0ZVVyaUxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlwcm90ZWN0ZWQgTGlzdCBzdWZmaXhTeXN0ZW1MaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcHJvdGVjdGVkIExpc3Qgc3VmZml4VXJpTGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXByb3RlY3RlZCBMaXN0IGRlbGVnYXRlUHVibGljTGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXByb3RlY3RlZCBMaXN0IGRlbGVnYXRlU3lzdGVtTGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXByb3RlY3RlZCBMaXN0IGRlbGVnYXRlVXJpTGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCQotCQlJbnRlcm5hbFJlc29sdmVyKCkKLQkJewotCQkJZm9yIChJdGVyYXRvciBpID0gY2F0YWxvZ0VsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCXsKLQkJCQlJQ2F0YWxvZ0VsZW1lbnQgY2F0YWxvZ0VsZW1lbnQgPSAoSUNhdGFsb2dFbGVtZW50KSBpLm5leHQoKTsKLQkJCQlpZiAoY2F0YWxvZ0VsZW1lbnQuZ2V0VHlwZSgpID09IElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZKQotCQkJCXsKLQkJCQkJSUNhdGFsb2dFbnRyeSBlbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBjYXRhbG9nRWxlbWVudDsKLQkJCQkJTWFwIG1hcCA9IGdldEVudHJ5TWFwKGVudHJ5LmdldEVudHJ5VHlwZSgpKTsKLQkJCQkJbWFwLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkpOwotCQkJCX0gCi0JCQkJZWxzZSBpZiAoY2F0YWxvZ0VsZW1lbnQuZ2V0VHlwZSgpID09IElDYXRhbG9nRWxlbWVudC5UWVBFX1JFV1JJVEUpIAotCQkJCXsKLQkJCQkJSVJld3JpdGVFbnRyeSBlbnRyeSA9IChJUmV3cml0ZUVudHJ5KSBjYXRhbG9nRWxlbWVudDsKLQkJCQkJaWYgKGVudHJ5LmdldEVudHJ5VHlwZSgpID09IElSZXdyaXRlRW50cnkuUkVXUklURV9UWVBFX1NZU1RFTSkgCi0JCQkJCXsKLQkJCQkJCXJld3JpdGVTeXN0ZW1MaXN0LmFkZChlbnRyeSk7Ci0JCQkJCX0gCi0JCQkJCWVsc2UgCi0JCQkJCXsKLQkJCQkJCXJld3JpdGVVcmlMaXN0LmFkZChlbnRyeSk7Ci0JCQkJCX0KLQkJCQl9IAotCQkJCWVsc2UgaWYgKGNhdGFsb2dFbGVtZW50LmdldFR5cGUoKSA9PSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9TVUZGSVgpIAotCQkJCXsKLQkJCQkJSVN1ZmZpeEVudHJ5IGVudHJ5ID0gKElTdWZmaXhFbnRyeSkgY2F0YWxvZ0VsZW1lbnQ7Ci0JCQkJCWlmIChlbnRyeS5nZXRFbnRyeVR5cGUoKSA9PSBJU3VmZml4RW50cnkuU1VGRklYX1RZUEVfU1lTVEVNKSAKLQkJCQkJewotCQkJCQkJc3VmZml4U3lzdGVtTGlzdC5hZGQoZW50cnkpOwotCQkJCQl9IAotCQkJCQllbHNlIAotCQkJCQl7Ci0JCQkJCQlzdWZmaXhVcmlMaXN0LmFkZChlbnRyeSk7Ci0JCQkJCX0KLQkJCQl9IAotCQkJCWVsc2UgaWYgKGNhdGFsb2dFbGVtZW50LmdldFR5cGUoKSA9PSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ERUxFR0FURSkgCi0JCQkJewotCQkJCQlJRGVsZWdhdGVDYXRhbG9nIGRlbGVnYXRlID0gKElEZWxlZ2F0ZUNhdGFsb2cpIGNhdGFsb2dFbGVtZW50OwotCQkJCQlpZiAoZGVsZWdhdGUuZ2V0RW50cnlUeXBlKCkgPT0gSURlbGVnYXRlQ2F0YWxvZy5ERUxFR0FURV9UWVBFX1BVQkxJQykgCi0JCQkJCXsKLQkJCQkJCWRlbGVnYXRlUHVibGljTGlzdC5hZGQoZGVsZWdhdGUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGRlbGVnYXRlLmdldEVudHJ5VHlwZSgpID09IElEZWxlZ2F0ZUNhdGFsb2cuREVMRUdBVEVfVFlQRV9TWVNURU0pIAotCQkJCQl7Ci0JCQkJCQlkZWxlZ2F0ZVN5c3RlbUxpc3QuYWRkKGRlbGVnYXRlKTsKLQkJCQkJfQotCQkJCQllbHNlIAotCQkJCQl7Ci0JCQkJCQlkZWxlZ2F0ZVVyaUxpc3QuYWRkKGRlbGVnYXRlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJQ29sbGVjdGlvbnMuc29ydChyZXdyaXRlU3lzdGVtTGlzdCwgTE9OR0VTVF9SRVdSSVRFX0ZJUlNUKTsKLQkJCUNvbGxlY3Rpb25zLnNvcnQocmV3cml0ZVVyaUxpc3QsIExPTkdFU1RfUkVXUklURV9GSVJTVCk7Ci0KLQkJCUNvbGxlY3Rpb25zLnNvcnQoc3VmZml4U3lzdGVtTGlzdCwgTE9OR0VTVF9TVUZGSVhfRklSU1QpOwotCQkJQ29sbGVjdGlvbnMuc29ydChzdWZmaXhVcmlMaXN0LCBMT05HRVNUX1NVRkZJWF9GSVJTVCk7Ci0JCQotCQkJQ29sbGVjdGlvbnMuc29ydChkZWxlZ2F0ZVB1YmxpY0xpc3QsIExPTkdFU1RfREVMRUdBVEVfUFJFRklYX0ZJUlNUKTsKLQkJCUNvbGxlY3Rpb25zLnNvcnQoZGVsZWdhdGVTeXN0ZW1MaXN0LCBMT05HRVNUX0RFTEVHQVRFX1BSRUZJWF9GSVJTVCk7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KGRlbGVnYXRlVXJpTGlzdCwgTE9OR0VTVF9ERUxFR0FURV9QUkVGSVhfRklSU1QpOwotCQl9Ci0KLQkJcHJpdmF0ZSBNYXAgZ2V0RW50cnlNYXAoaW50IGVudHJ5VHlwZSkKLQkJewotCQkJTWFwIG1hcCA9IHN5c3RlbU1hcDsKLQkJCXN3aXRjaCAoZW50cnlUeXBlKQotCQkJewotCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDOgotCQkJCW1hcCA9IHB1YmxpY01hcDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSToKLQkJCQltYXAgPSB1cmlNYXA7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIG1hcDsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFwcGVkVVJJKE1hcCBtYXAsIFN0cmluZyBrZXkpCi0JCXsKLQkJCUNhdGFsb2dFbnRyeSBlbnRyeSA9IChDYXRhbG9nRW50cnkpIG1hcC5nZXQoa2V5KTsKLQkJCWlmKGVudHJ5ID09IG51bGwpIHJldHVybiBudWxsOwotCQkJU3RyaW5nIHVyaSA9IGVudHJ5LmdldFVSSSgpOwotCQkJdHJ5Ci0JCQl7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBDUyA6IGRvIHdlIHJlYWxseSB3YW50IHRvIHJlc29sdmUgdGhlc2UgaGVyZT8KLSAgICAgICAgICAgICAgICAvLyBJJ20gZ3Vlc3Npbmcgd2Ugc2hvdWxkIHJldHVybiB0aGUgJ3BsYXRmb3JtOicgZm9ybSBvZiB0aGUgVVJJCi0gICAgICAgICAgICAgICAgLy8gdG8gdGhlIGNhbGxlci4KLSAgICAgICAgICAgICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoInBsYXRmb3JtOiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgeyAgCi0JCQkJICBVUkwgZW50cnlVUkwgPSBuZXcgVVJMKGVudHJ5LmdldEFic29sdXRlUGF0aCh1cmkpKTsgICAgICAgICAgICAgICAgCi0JCQkJICB1cmkgPSBQbGF0Zm9ybS5yZXNvbHZlKGVudHJ5VVJMKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGVuc3VyZSBVUkkncyBhcmUgb2YgZm9ybSAiZmlsZTovLy9EOi9YWFgiIGFuZCBOT1QgIAotICAgICAgICAgICAgICAgICAgLy8gImZpbGU6RDovWFhYIi4gIE90aGVyd2lzZSB0aGUgRU1GIFVSSSBjbGFzcyBnZXRzIGNvbmZ1c2VkCi0gICAgICAgICAgICAgICAgICAvLyAoc2VlIGJ1ZyAxMDM2MDcpIAotICAgICAgICAgICAgICAgICAgU3RyaW5nIEZJTEVfU0NIRU1FID0gImZpbGU6IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgaWYgKHVyaS5zdGFydHNXaXRoKEZJTEVfU0NIRU1FKSAmJiAhdXJpLnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUUgKyAiLyIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHVyaSA9IEZJTEVfU0NIRU1FICsgIi8vLyIgKyB1cmkuc3Vic3RyaW5nKEZJTEVfU0NIRU1FLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIHVyaTsgCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQkJewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIFN0cmluZyByZXNvbHZlUHVibGljKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotCQkJCXRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0JCXsKLQkJCVN0cmluZyByZXN1bHQgPSBnZXRNYXBwZWRVUkkocHVibGljTWFwLCBwdWJsaWNJZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gZ2V0TWFwcGVkVVJJKHN5c3RlbU1hcCwgc3lzdGVtSWQpOwotCQkJfQotCQkJLy8gb3VyIGNsaWVudHMgdXNlZCB0byBwYXNzIG5hbWVzcGFjZSBpbiBwbGFjZSBvZiBwdWJsaWMgaWQsIHNvIHdlIG5lZWQgdG8gY2hlY2sgdXJpIG1hcCBmb3IgdGhvc2UKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXN1bHQgPSBnZXRNYXBwZWRVUkkodXJpTWFwLCBwdWJsaWNJZCk7Ci0JCQl9Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gcmVzb2x2ZURlbGVnYXRlQ2F0YWxvZ3MoZGVsZWdhdGVQdWJsaWNMaXN0LCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQkJfQotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJewotCQkJCXJlc3VsdCA9IHJlc29sdmVTdWJvcmRpbmF0ZUNhdGFsb2dzKAotCQkJCQkJSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQywgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHJlc29sdmVTeXN0ZW0oU3RyaW5nIHN5c3RlbUlkKQotCQkJCXRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0JCXsKLQkJCVN0cmluZyByZXN1bHQgPSBnZXRNYXBwZWRVUkkoc3lzdGVtTWFwLCBzeXN0ZW1JZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gcmVzb2x2ZVJld3JpdGUocmV3cml0ZVN5c3RlbUxpc3QsIHN5c3RlbUlkKTsKLQkJCX0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXN1bHQgPSByZXNvbHZlU3VmZml4KHN1ZmZpeFN5c3RlbUxpc3QsIHN5c3RlbUlkKTsKLQkJCX0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXN1bHQgPSByZXNvbHZlRGVsZWdhdGVDYXRhbG9ncyhkZWxlZ2F0ZVN5c3RlbUxpc3QsIHN5c3RlbUlkLCBzeXN0ZW1JZCk7IC8vIHN5c3RlbUlkIGlzIHRoZSBrZXkgZm9yICJzdGFydFN0cmluZyIKLQkJCX0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXN1bHQgPSByZXNvbHZlU3Vib3JkaW5hdGVDYXRhbG9ncygKLQkJCQkJCUlDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU0sIG51bGwsIHN5c3RlbUlkKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyByZXNvbHZlUmV3cml0ZShMaXN0IHJld3JpdGVMaXN0LCBTdHJpbmcgc2VhcmNoU3RyaW5nKSAKLQkJewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJld3JpdGVMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIAotCQkJewotCQkJCUlSZXdyaXRlRW50cnkgZW50cnkgPSAoSVJld3JpdGVFbnRyeSkgaXQubmV4dCgpOwotCQkJCVN0cmluZyBzdGFydFN0cmluZyA9IGVudHJ5LmdldFN0YXJ0U3RyaW5nKCk7Ci0JCQkJaWYgKHNlYXJjaFN0cmluZy5zdGFydHNXaXRoKHN0YXJ0U3RyaW5nKSkgCi0JCQkJewotCQkJCQlyZXR1cm4gZW50cnkuZ2V0UmV3cml0ZVByZWZpeCgpICsgc2VhcmNoU3RyaW5nLnN1YnN0cmluZyhzdGFydFN0cmluZy5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyByZXNvbHZlU3VmZml4KExpc3Qgc3VmZml4TGlzdCwgU3RyaW5nIHNlYXJjaFN0cmluZykgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHN1ZmZpeExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUlTdWZmaXhFbnRyeSBlbnRyeSA9IChJU3VmZml4RW50cnkpIGl0Lm5leHQoKTsKLQkJCQlpZiAoc2VhcmNoU3RyaW5nLmVuZHNXaXRoKGVudHJ5LmdldFN1ZmZpeCgpKSkgewotCQkJCQlyZXR1cm4gZW50cnkuZ2V0VVJJKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVEZWxlZ2F0ZUNhdGFsb2dzKExpc3QgZGVsZWdhdGVDYXRhbG9ncywgU3RyaW5nIGtleSwKLQkJCQlTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0JCXsKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRlbGVnYXRlQ2F0YWxvZ3MuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlJRGVsZWdhdGVDYXRhbG9nIGRlbGVnYXRlID0gKElEZWxlZ2F0ZUNhdGFsb2cpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkKLQkJCQlpZiAoa2V5LnN0YXJ0c1dpdGgoZGVsZWdhdGUuZ2V0U3RhcnRTdHJpbmcoKSkpIHsKLQkKLQkJCQkJSUNhdGFsb2cgY2F0YWxvZyA9IGRlbGVnYXRlLmdldFJlZmVyZW5jZWRDYXRhbG9nKCk7Ci0JCQkJCWlmIChjYXRhbG9nICE9IG51bGwpCi0JCQkJCXsKLQkJCQkJCXN3aXRjaCAoZGVsZWdhdGUuZ2V0RW50cnlUeXBlKCkpCi0JCQkJCQl7Ci0JCQkJCQljYXNlIElEZWxlZ2F0ZUNhdGFsb2cuREVMRUdBVEVfVFlQRV9QVUJMSUM6Ci0JCQkJCQkJcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlUHVibGljKGtleSwgc3lzdGVtSWQpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJRGVsZWdhdGVDYXRhbG9nLkRFTEVHQVRFX1RZUEVfU1lTVEVNOgotCQkJCQkJCXJlc3VsdCA9IGNhdGFsb2cucmVzb2x2ZVN5c3RlbShzeXN0ZW1JZCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElEZWxlZ2F0ZUNhdGFsb2cuREVMRUdBVEVfVFlQRV9VUkk6Ci0JCQkJCQkJcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlVVJJKHN5c3RlbUlkKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJCQl7Ci0JCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKLQkJCQlJT0V4Y2VwdGlvbgotCQl7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gZ2V0TWFwcGVkVVJJKHVyaU1hcCwgdXJpKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXN1bHQgPSByZXNvbHZlUmV3cml0ZShyZXdyaXRlVXJpTGlzdCwgdXJpKTsKLQkJCX0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXN1bHQgPSByZXNvbHZlU3VmZml4KHN1ZmZpeFVyaUxpc3QsIHVyaSk7Ci0JCQl9Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gcmVzb2x2ZURlbGVnYXRlQ2F0YWxvZ3MoZGVsZWdhdGVVcmlMaXN0LCB1cmksIHVyaSk7IC8vIHVyaSBpcyB0cmVhdGVkIGFzIHRoZSBzeXN0ZW1JZAotCQkJfQotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJewotCQkJCXJlc3VsdCA9IHJlc29sdmVTdWJvcmRpbmF0ZUNhdGFsb2dzKAotCQkJCQkJSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSSwgbnVsbCwgdXJpKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQljbGFzcyBTeXN0ZW1DYXRhbG9nTFMgZXh0ZW5kcyBDYXRhbG9nTFMKLQl7Ci0JCXB1YmxpYyB2b2lkIGxvYWQoKQotCQl7Ci0JCQluZXcgQ2F0YWxvZ0NvbnRyaWJ1dG9yUmVnaXN0cnlSZWFkZXIoQ2F0YWxvZy50aGlzKS5yZWFkUmVnaXN0cnkoKTsKLQotCQkJLyoKLQkJCSAqIEhlcmUgd2Ugc2F2ZSB0aGUgZmlsZSBpbiBvcmRlciB0byAncmVmbGVjdCcgdGhlIGNhdGFsb2cgdGhhdAotCQkJICogd2UndmUgY3JlYXRlZCBmcm9tIHBsdWdpbiBleHRlbnNpb25zIHRvIGRpc2suIAotCQkJICogVGhlICdzeXN0ZW0nIGNhdGFsb2cgaXMgb25seSBldmVyIHdyaXR0ZW4gdG8gZGlzayBhbmQgbmV2ZXIgcmVhZCBmcm9tIGRpc2suCi0JCQkgKi8KLQkJCXNhdmUoKTsKLQkJfQotCX0KLQotCWNsYXNzIFVzZXJDYXRhbG9nTFMgZXh0ZW5kcyBDYXRhbG9nTFMKLQl7Ci0JCXB1YmxpYyB2b2lkIGxvYWQoKQotCQl7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQl0cnkKLQkJCXsKLQkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCAmJiBsb2NhdGlvbi5sZW5ndGgoKSA+IDApIAotCQkJCXsKLQkJCQkJVVJMIHVybCA9IG5ldyBVUkwobG9jYXRpb24pOwotCQkJCQlpbnB1dFN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQkJCWJvb2xlYW4gb2xkTm90aWZpY2F0aW9uRW5hYmxlZCA9IGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQkJCQlzZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCQkJY2xlYXIoKTsKLQkJCQkJdHJ5Ci0JCQkJCXsKLQkJCQkJCUNhdGFsb2dSZWFkZXIucmVhZChDYXRhbG9nLnRoaXMsIGlucHV0U3RyZWFtKTsKLQkJCQkJfSBmaW5hbGx5Ci0JCQkJCXsKLQkJCQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQob2xkTm90aWZpY2F0aW9uRW5hYmxlZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJY2xlYXIoKTsKLQkJCQl9Ci0JCQkJbm90aWZ5Q2hhbmdlZCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJLy8gVGhpcyBpcyBPSyBzaW5jZSB0aGUgY2F0YWxvZyBtYXkgbm90IGV4aXN0IGJlZm9yZSB3ZSBjcmVhdGUgaXQKLQkJCX0gZmluYWxseQotCQkJewotCQkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKQotCQkJCXsKLQkJCQkJdHJ5Ci0JCQkJCXsKLQkJCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkJCQl7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NBVEFMT0dfRklMRSA9ICJkZWZhdWx0X2NhdGFsb2cueG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX0NBVEFMT0dfRklMRSA9ICJzeXN0ZW1fY2F0YWxvZy54bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0NBVEFMT0dfRklMRSA9ICJ1c2VyX2NhdGFsb2cueG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBiYXNlOwotCi0JcHJvdGVjdGVkIExpc3QgY2F0YWxvZ0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIENhdGFsb2dMUyBjYXRhbG9nTFM7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkOwotCi0JcHJvdGVjdGVkIEludGVybmFsUmVzb2x2ZXIgaW50ZXJuYWxSZXNvbHZlcjsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzTm90aWZpY2F0aW9uRW5hYmxlZDsKLQotCXByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb247Ci0KLQlwcm90ZWN0ZWQgQ2F0YWxvZ1NldCByZXNvdXJjZVNldDsKLQotCXB1YmxpYyBDYXRhbG9nKENhdGFsb2dTZXQgY2F0YWxvZ1Jlc291cmNlU2V0LCBTdHJpbmcgaWQsIFN0cmluZyBsb2NhdGlvbikKLQl7Ci0JCXRoaXMucmVzb3VyY2VTZXQgPSBjYXRhbG9nUmVzb3VyY2VTZXQ7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCi0JCWlmIChYTUxDb3JlUGx1Z2luLkRFRkFVTFRfQ0FUQUxPR19JRC5lcXVhbHMoaWQpKQotCQl7Ci0JCQljYXRhbG9nTFMgPSBuZXcgRGVmYXVsdENhdGFsb2dMUygpOwotCQl9IGVsc2UgaWYgKFhNTENvcmVQbHVnaW4uU1lTVEVNX0NBVEFMT0dfSUQuZXF1YWxzKGlkKSkKLQkJewotCQkJY2F0YWxvZ0xTID0gbmV3IFN5c3RlbUNhdGFsb2dMUygpOwotCQl9IGVsc2UKLQkJewotCQkJY2F0YWxvZ0xTID0gbmV3IFVzZXJDYXRhbG9nTFMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENhdGFsb2dFbGVtZW50KElDYXRhbG9nRWxlbWVudCBlbGVtZW50KQotCXsKLQkJY2F0YWxvZ0VsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJZWxlbWVudC5zZXRPd25lckNhdGFsb2codGhpcyk7Ci0JCWludGVybmFsUmVzb2x2ZXIgPSBudWxsOwotCQlub3RpZnlBZGRFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVudHJpZXNGcm9tQ2F0YWxvZyhJQ2F0YWxvZyBjYXRhbG9nKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkKLQkJCXsKLQkJCQlJQ2F0YWxvZ0VsZW1lbnRbXSBlbnRyaWVzID0gKChDYXRhbG9nKWNhdGFsb2cpLmdldENhdGFsb2dFbGVtZW50cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKLQkJCQl7Ci0JCQkJCUNhdGFsb2dFbGVtZW50IGNsb25lID0gKENhdGFsb2dFbGVtZW50KSgoQ2F0YWxvZ0VsZW1lbnQpZW50cmllc1tpXSkuY2xvbmUoKTsKLQkJCQkJYWRkQ2F0YWxvZ0VsZW1lbnQoY2xvbmUpOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiYXJndW1lbnQgd2FzIG51bGwgaW4gQ2F0YWxvZy5hZGRFbnRyaWVzRnJvbUNhdGFsb2ciKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGZpbmFsbHkKLQkJewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZCh0cnVlKTsKLQkJfQotCQlpbnRlcm5hbFJlc29sdmVyID0gbnVsbDsKLQkJbm90aWZ5Q2hhbmdlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElDYXRhbG9nTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpCi0JewotCQljYXRhbG9nRWxlbWVudHMuY2xlYXIoKTsKLQkJaW50ZXJuYWxSZXNvbHZlciA9IG51bGw7Ci0JCW5vdGlmeUNoYW5nZWQoKTsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2dFbGVtZW50IGNyZWF0ZUNhdGFsb2dFbGVtZW50KGludCB0eXBlKQotCXsKLQkJc3dpdGNoICh0eXBlKQotCQl7Ci0JCWNhc2UgSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlk6Ci0JCQlyZXR1cm4gbmV3IENhdGFsb2dFbnRyeSgpOyAvLyBUT0RPOiBTaG91bGQgYmUga2luZCBvZiBkZXByZWNhdGVkCi0JCWNhc2UgSUNhdGFsb2dFbGVtZW50LlRZUEVfTkVYVF9DQVRBTE9HOgotCQkJcmV0dXJuIG5ldyBOZXh0Q2F0YWxvZygpOwotCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM6Ci0JCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTToKLQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJOgotCQkJcmV0dXJuIG5ldyBDYXRhbG9nRW50cnkodHlwZSk7Ci0JCWNhc2UgSUNhdGFsb2dFbGVtZW50LlRZUEVfUkVXUklURToJCi0JCWNhc2UgSVJld3JpdGVFbnRyeS5SRVdSSVRFX1RZUEVfU1lTVEVNOgotCQljYXNlIElSZXdyaXRlRW50cnkuUkVXUklURV9UWVBFX1VSSToKLQkJCXJldHVybiBuZXcgUmV3cml0ZUVudHJ5KHR5cGUpOwotCQljYXNlIElDYXRhbG9nRWxlbWVudC5UWVBFX1NVRkZJWDoJCi0JCWNhc2UgSVN1ZmZpeEVudHJ5LlNVRkZJWF9UWVBFX1NZU1RFTToKLQkJY2FzZSBJU3VmZml4RW50cnkuU1VGRklYX1RZUEVfVVJJOgotCQkJcmV0dXJuIG5ldyBTdWZmaXhFbnRyeSh0eXBlKTsKLQkJY2FzZSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ERUxFR0FURToJCi0JCWNhc2UgSURlbGVnYXRlQ2F0YWxvZy5ERUxFR0FURV9UWVBFX1BVQkxJQzoKLQkJY2FzZSBJRGVsZWdhdGVDYXRhbG9nLkRFTEVHQVRFX1RZUEVfU1lTVEVNOgotCQljYXNlIElEZWxlZ2F0ZUNhdGFsb2cuREVMRUdBVEVfVFlQRV9VUkk6Ci0JCQlyZXR1cm4gbmV3IERlbGVnYXRlQ2F0YWxvZyh0eXBlKTsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gZWxlbWVudCB0eXBlICIgKyB0eXBlKTsvLyROT04tTkxTLTEgLy8gTWFrZXMgbm8gc2Vuc2UgYXQgYWxsIQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCYXNlKCkKLQl7Ci0JCXJldHVybiBiYXNlOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRDYXRhbG9nRWxlbWVudHMoaW50IHR5cGUpCi0JewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUNhdGFsb2dFbGVtZW50W10gZWxlbWVudHMgPSAoSUNhdGFsb2dFbGVtZW50W10pIGNhdGFsb2dFbGVtZW50cwotCQkJCS50b0FycmF5KG5ldyBJQ2F0YWxvZ0VsZW1lbnRbY2F0YWxvZ0VsZW1lbnRzLnNpemUoKV0pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJaWYgKGVsZW1lbnQuZ2V0VHlwZSgpID09IHR5cGUpCi0JCQl7Ci0JCQkJcmVzdWx0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJQ2F0YWxvZ0VudHJ5W10gZ2V0Q2F0YWxvZ0VudHJpZXMoKQotCXsKLQkJTGlzdCByZXN1bHQgPSBnZXRDYXRhbG9nRWxlbWVudHMoSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlkpOwotCQlyZXR1cm4gKElDYXRhbG9nRW50cnlbXSkgcmVzdWx0Ci0JCQkJLnRvQXJyYXkobmV3IElDYXRhbG9nRW50cnlbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBJRGVsZWdhdGVDYXRhbG9nW10gZ2V0RGVsZWdhdGVDYXRhbG9ncygpIAotCXsKLQkJTGlzdCByZXN1bHQgPSBnZXRDYXRhbG9nRWxlbWVudHMoSUNhdGFsb2dFbGVtZW50LlRZUEVfREVMRUdBVEUpOwotCQlyZXR1cm4gKElEZWxlZ2F0ZUNhdGFsb2dbXSkgcmVzdWx0Ci0JCQkJLnRvQXJyYXkobmV3IElEZWxlZ2F0ZUNhdGFsb2dbcmVzdWx0LnNpemUoKV0pOwotCX0KLQkKLQlwdWJsaWMgSVJld3JpdGVFbnRyeVtdIGdldFJld3JpdGVFbnRyaWVzKCkgCi0JewotCQlMaXN0IHJlc3VsdCA9IGdldENhdGFsb2dFbGVtZW50cyhJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9SRVdSSVRFKTsKLQkJcmV0dXJuIChJUmV3cml0ZUVudHJ5W10pIHJlc3VsdAotCQkJCS50b0FycmF5KG5ldyBJUmV3cml0ZUVudHJ5W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0JCi0JcHVibGljIElTdWZmaXhFbnRyeVtdIGdldFN1ZmZpeEVudHJpZXMoKSAKLQl7Ci0JCUxpc3QgcmVzdWx0ID0gZ2V0Q2F0YWxvZ0VsZW1lbnRzKElDYXRhbG9nRWxlbWVudC5UWVBFX1NVRkZJWCk7Ci0JCXJldHVybiAoSVN1ZmZpeEVudHJ5W10pIHJlc3VsdAotCQkJCS50b0FycmF5KG5ldyBJU3VmZml4RW50cnlbcmVzdWx0LnNpemUoKV0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ2F0YWxvZ1NldCBnZXRDYXRhbG9nU2V0KCkKLQl7Ci0JCXJldHVybiByZXNvdXJjZVNldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkKLQl7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkKLQl7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgSU5leHRDYXRhbG9nW10gZ2V0TmV4dENhdGFsb2dzKCkKLQl7Ci0JCUxpc3QgcmVzdWx0ID0gZ2V0Q2F0YWxvZ0VsZW1lbnRzKElDYXRhbG9nRWxlbWVudC5UWVBFX05FWFRfQ0FUQUxPRyk7Ci0JCXJldHVybiAoSU5leHRDYXRhbG9nW10pIHJlc3VsdC50b0FycmF5KG5ldyBJTmV4dENhdGFsb2dbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBJbnRlcm5hbFJlc29sdmVyIGdldE9yQ3JlYXRlSW50ZXJuYWxSZXNvbHZlcigpCi0JewotCQlpZiAoaW50ZXJuYWxSZXNvbHZlciA9PSBudWxsKQotCQl7Ci0JCQlpbnRlcm5hbFJlc29sdmVyID0gbmV3IEludGVybmFsUmVzb2x2ZXIoKTsKLQkJfQotCQlyZXR1cm4gaW50ZXJuYWxSZXNvbHZlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKQotCXsKLQkJcmV0dXJuIGlzTm90aWZpY2F0aW9uRW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQljYXRhbG9nTFMubG9hZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUFkZEVsZW1lbnQoSUNhdGFsb2dFbGVtZW50IGVudHJ5KQotCXsKLQkJaWYgKGlzTm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJewotCQkJSUNhdGFsb2dFdmVudCBldmVudCA9IG5ldyBDYXRhbG9nRXZlbnQodGhpcywgZW50cnksCi0JCQkJCUlDYXRhbG9nRXZlbnQuRUxFTUVOVF9BRERFRCk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2hhbmdlZCgpCi0JewotCQlJQ2F0YWxvZ0V2ZW50IGV2ZW50ID0gbmV3IENhdGFsb2dFdmVudCh0aGlzLCBudWxsLAotCQkJCUlDYXRhbG9nRXZlbnQuQ0hBTkdFRCk7Ci0JCW5vdGlmeUxpc3RlbmVycyhldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKElDYXRhbG9nRXZlbnQgZXZlbnQpCi0JewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWxpc3QuYWRkQWxsKGxpc3RlbmVyTGlzdCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQl7Ci0JCQlJQ2F0YWxvZ0xpc3RlbmVyIGxpc3RlbmVyID0gKElDYXRhbG9nTGlzdGVuZXIpIGkubmV4dCgpOwotCQkJbGlzdGVuZXIuY2F0YWxvZ0NoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5UmVtb3ZlRWxlbWVudChJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWlmIChpc05vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCXsKLQkJCUlDYXRhbG9nRXZlbnQgZXZlbnQgPSBuZXcgQ2F0YWxvZ0V2ZW50KHRoaXMsIGVsZW1lbnQsCi0JCQkJCUlDYXRhbG9nRXZlbnQuRUxFTUVOVF9SRU1PVkVEKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDYXRhbG9nRWxlbWVudChJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWNhdGFsb2dFbGVtZW50cy5yZW1vdmUoZWxlbWVudCk7Ci0JCWludGVybmFsUmVzb2x2ZXIgPSBudWxsOwotCQlub3RpZnlSZW1vdmVFbGVtZW50KGVsZW1lbnQpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJQ2F0YWxvZ0xpc3RlbmVyIGxpc3RlbmVyKQotCXsKLQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyByZXNvbHZlUHVibGljKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotCQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRPckNyZWF0ZUludGVybmFsUmVzb2x2ZXIoKS5yZXNvbHZlUHVibGljKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlU3Vib3JkaW5hdGVDYXRhbG9ncyhpbnQgZW50cnlUeXBlLCBTdHJpbmcgcHVibGljSWQsCi0JCQlTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0JewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gZ2V0TmV4dENhdGFsb2dzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlJTmV4dENhdGFsb2cgbmV4dENhdGFsb2cgPSBuZXh0Q2F0YWxvZ3NbaV07Ci0JCQlJQ2F0YWxvZyBjYXRhbG9nID0gbmV4dENhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQkJCWlmIChjYXRhbG9nICE9IG51bGwpCi0JCQl7Ci0JCQkJc3dpdGNoIChlbnRyeVR5cGUpCi0JCQkJewotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzoKLQkJCQkJcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlUHVibGljKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTToKLQkJCQkJcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlU3lzdGVtKHN5c3RlbUlkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJOgotCQkJCQlyZXN1bHQgPSBjYXRhbG9nLnJlc29sdmVVUkkoc3lzdGVtSWQpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCXsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyByZXNvbHZlU3lzdGVtKFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKLQkJCUlPRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0T3JDcmVhdGVJbnRlcm5hbFJlc29sdmVyKCkucmVzb2x2ZVN5c3RlbShzeXN0ZW1JZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyByZXNvbHZlVVJJKFN0cmluZyB1cmkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0JCQlJT0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldE9yQ3JlYXRlSW50ZXJuYWxSZXNvbHZlcigpLnJlc29sdmVVUkkodXJpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQljYXRhbG9nTFMuc2F2ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJhc2UoU3RyaW5nIGJhc2UpCi0JewotCQl0aGlzLmJhc2UgPSBiYXNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkKLQl7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pCi0JewotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChib29sZWFuIGIpCi0JewotCQlpc05vdGlmaWNhdGlvbkVuYWJsZWQgPSBiOwotCX0KLQotCXB1YmxpYyBJQ2F0YWxvZ0VsZW1lbnRbXSBnZXRDYXRhbG9nRWxlbWVudHMoKQotCXsKLQkJcmV0dXJuIChJQ2F0YWxvZ0VsZW1lbnRbXSkgY2F0YWxvZ0VsZW1lbnRzLnRvQXJyYXkobmV3IElDYXRhbG9nRWxlbWVudFtjYXRhbG9nRWxlbWVudHMuc2l6ZSgpXSk7Ci0JfQotCQotCi0JCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dDb250cmlidXRvclJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nQ29udHJpYnV0b3JSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjAxYzVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dDb250cmlidXRvclJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBDYXRhbG9nQ29udHJpYnV0b3JSZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiY2F0YWxvZ0NvbnRyaWJ1dGlvbnMiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT05UUklCVVRJT04gPSAiY2F0YWxvZ0NvbnRyaWJ1dGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgLyoKLSAgICogdGhpcyBpcyBhIHNhbXBsZSBleHB0ZW5zaW9uIAotICAgKiA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY2F0YWxvZ0NvbnRyaWJ1dGlvbnMiPiAKLSAgICogPGNhdGFsb2dDb250cmlidXRpb24+Ci0gICAqICAgIDx1cmkKLSAgICogICAgICAgICAgICAgbmFtZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgCi0gICAqICAgICAgICAgICAgIHVyaT0ieHNkL3NvYXAueHNkIi8+IAotICAgKiAgIAk8cHVibGljCi0gICAqICAgICAgICAgIHB1YmxpY0lkPSItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIgotICAgKiAgICAgICAgICB1cmk9ImR0ZHMveGh0bWwxMS1mbGF0LmR0ZCIvPiAKLSAgICogIAk8bmV4dENhdGFsb2cgaWQ9Im5lc3RlZENhdGFsb2ciIGNhdGFsb2c9ImRhdGEvY2F0YWxvZzEueG1sIi8+IAotICAgKiAgPC9jYXRhbG9nQ29udHJpYnV0aW9uPiAKLSAgICogIDwvZXh0ZW5zaW9uPgotICAgKiAgCi0gICAqLwotICBwcm90ZWN0ZWQgSUNhdGFsb2cgY2F0YWxvZzsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGRlY2xhcmluZ0V4dGVuc2lvbklkOwotICAKLSAgcHJvdGVjdGVkIENhdGFsb2dDb250cmlidXRvclJlZ2lzdHJ5UmVhZGVyKElDYXRhbG9nIGFDYXRhbG9nKQotICB7Ci0gICAgY2F0YWxvZyA9IGFDYXRhbG9nOwotICB9Ci0KLSAgLyoqCi0gICAqIHJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIHBhcnNlIGl0LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcmVhZFJlZ2lzdHJ5KCkKLSAgewotICAgIElFeHRlbnNpb25SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcGx1Z2luUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0gICAgaWYgKHBvaW50ICE9IG51bGwpCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVQYXRoKFVSTCBwbGF0Zm9ybVVSTCwgU3RyaW5nIHBhdGgpIAotICB7ICAgICAgCi0JU3RyaW5nIGZpbGVMb2NhdGlvbiA9IHBhdGg7Ci0JaW50IGphclBhdGhTdGFydCA9IHBhdGguaW5kZXhPZigiamFyOiIpOyAvLyROT04tTkxTLTEkCi0JamFyUGF0aFN0YXJ0ID0gamFyUGF0aFN0YXJ0IDwgMCA/IDAgOiBqYXJQYXRoU3RhcnQgKyAiamFyOiIubGVuZ3RoKCk7IC8vJE5PTi1OTFMtMSQKLQlpbnQgamFyUGF0aEVuZCA9IHBhdGguaW5kZXhPZigiISIpOyAvLyROT04tTkxTLTEkCi0JamFyUGF0aEVuZCA9IGphclBhdGhFbmQgPCAwID8gcGF0aC5sZW5ndGgoKSA6IGphclBhdGhFbmQ7Ci0JZmlsZUxvY2F0aW9uID0gcGF0aC5zdWJzdHJpbmcoamFyUGF0aFN0YXJ0LCBqYXJQYXRoRW5kKTsKLQkKLQlTdHJpbmcgcmVzdWx0ID0gcGF0aDsKLQlTdHJpbmcgcmVzb2x2ZWRMb2NhdGlvbiA9IGZpbGVMb2NhdGlvbjsKLQlVUkwgcmVzb2x2ZWRVUkwgPSBudWxsOwotICAgIGlmIChmaWxlTG9jYXRpb24uc3RhcnRzV2l0aCgicGxhdGZvcm06L3BsdWdpbiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgLy8gdGhpcyBpcyB0aGUgc3BlY2xpYWwgY2FzZSwgd2hlcmUgdGhlIHJlc291cmNlIGlzIGxvY2F0ZWQgcmVsYXRpdmUgCi0gICAgICAvLyB0byBhbm90aGVyIHBsdWdpbiAobm90IHRoZSBvbmUgdGhhdCBkZWNsYXJlcyB0aGUgZXh0ZW5zaW9uIHBvaW50KQotICAgICAgLy8KLQkJdHJ5Ci0JCXsKLQkJCXJlc29sdmVkVVJMID0gUGxhdGZvcm0ucmVzb2x2ZShuZXcgVVJMKGZpbGVMb2NhdGlvbikpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQl7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0gCi0gICAgfQotICAgIGVsc2V7Ci0gICAgCSAvLyB0aGlzIGlzIHRoZSB0eXBpY2FsIGNhc2UsIHdoZXJlIHRoZSByZXNvdXJjZSBpcyBsb2NhdGVkIHJlbGF0aXZlCi0gICAgICAgIC8vIHRvIHRoZSBwbHVnaW4gdGhhdCBkZWNsYXJlcyB0aGUgZXh0ZW5zaW9uIHBvaW50Ci0gICAgCSB0cnkgewotICAgIAkgICAgIAlyZXNvbHZlZFVSTCA9IG5ldyBVUkwoUGxhdGZvcm0ucmVzb2x2ZShwbGF0Zm9ybVVSTCksIGZpbGVMb2NhdGlvbik7Ci0gICAgCSB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgCSAgICAJLy8gZG8gbm90aGluZwotICAgIAkgfQotICAgIH0KLSAgIAotICAgaWYocmVzb2x2ZWRVUkwgIT0gbnVsbCl7Ci0gICAgCXJlc29sdmVkTG9jYXRpb24gPSByZXNvbHZlZFVSTC50b0V4dGVybmFsRm9ybSgpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLSAgICAJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VGaXJzdChmaWxlTG9jYXRpb24sIHJlc29sdmVkTG9jYXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFVSTCBnZXRQbGF0Zm9ybVVSTChTdHJpbmcgcGx1Z2luSWQpewotCSAgQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkKLQkJewotCQkJVVJMIGJ1bmRsZUVudHJ5ID0gYnVuZGxlLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJaWYoYnVuZGxlRW50cnkgIT0gbnVsbCl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlyZXR1cm4gUGxhdGZvcm0ucmVzb2x2ZShidW5kbGVFbnRyeSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZVBhdGgoU3RyaW5nIHBhdGgpCi0gIHsKLQkgIHJldHVybiByZXNvbHZlUGF0aChnZXRQbGF0Zm9ybVVSTChkZWNsYXJpbmdFeHRlbnNpb25JZCksIHBhdGgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0JICBkZWNsYXJpbmdFeHRlbnNpb25JZCA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotICAgIGNhdGNoIChJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgICAKLSAgICBpZiAoVEFHX0NPTlRSSUJVVElPTi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKXsKLSAgICAJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gbWFwcGluZ0luZm9FbGVtZW50TGlzdCA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19QVUJMSUMpOwotICAgIAlwcm9jZXNzTWFwcGluZ0luZm9FbGVtZW50cyhtYXBwaW5nSW5mb0VsZW1lbnRMaXN0KTsKLSAgICAJbWFwcGluZ0luZm9FbGVtZW50TGlzdCA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19TWVNURU0pOwotICAgIAlwcm9jZXNzTWFwcGluZ0luZm9FbGVtZW50cyhtYXBwaW5nSW5mb0VsZW1lbnRMaXN0KTsKLSAgICAJbWFwcGluZ0luZm9FbGVtZW50TGlzdCA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19VUkkpOwotICAgIAlwcm9jZXNzTWFwcGluZ0luZm9FbGVtZW50cyhtYXBwaW5nSW5mb0VsZW1lbnRMaXN0KTsKLSAgICAJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gbmV4dENhdGFsb2dFbGVtZW50TGlzdCA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19ORVhUX0NBVEFMT0cpOwotICAgIAlwcm9jZXNzTmV4dENhdGFsb2dFbGVtZW50cyhuZXh0Q2F0YWxvZ0VsZW1lbnRMaXN0KTsKLSAgICAJCi0gICAgfQotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNYXBwaW5nSW5mb0VsZW1lbnRzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkRWxlbWVudExpc3QpCi0gIHsKLSAgICBpZiAoY2F0YWxvZyA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRFbGVtZW50TGlzdC5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGRFbGVtZW50ID0gY2hpbGRFbGVtZW50TGlzdFtpXTsKLSAgICAgIFN0cmluZyBuYW1lID0gY2hpbGRFbGVtZW50LmdldE5hbWUoKTsKLSAgICAgIFN0cmluZyBrZXkgPSBudWxsOwotCQotICAgICAgaW50IHR5cGUgPSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDOwotICAgICAgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfUFVCTElDLmVxdWFscyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAga2V5ID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9QVUJMSUNfSUQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19TWVNURU0uZXF1YWxzKG5hbWUpKQotICAgICAgewotICAgICAgICBrZXkgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1NZU1RFTV9JRCk7Ci0gICAgICAgIHR5cGUgPSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19VUkkuZXF1YWxzKG5hbWUpKQotICAgICAgewotICAgICAgICBrZXkgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX05BTUUpOwotICAgICAgICB0eXBlID0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfTkVYVF9DQVRBTE9HLmVxdWFscyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcHJvY2Vzc05leHRDYXRhbG9nRWxlbWVudHMobmV3IElDb25maWd1cmF0aW9uRWxlbWVudFtde2NoaWxkRWxlbWVudH0pOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCBrZXkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFhNTENvcmVNZXNzYWdlcy5DYXRhbG9nX2VudHJ5X2tleV9ub3Rfc2V0KTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBTdHJpbmcgZW50cnlVUkkgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSk7IC8vIG1hbmRhdG9yeQotICAgICAgaWYgKGVudHJ5VVJJID09IG51bGwgfHwgZW50cnlVUkkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19lbnRyeV91cmlfbm90X3NldCk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgSUNhdGFsb2dFbGVtZW50IGNhdGFsb2dFbGVtZW50ID0gY2F0YWxvZy5jcmVhdGVDYXRhbG9nRWxlbWVudCh0eXBlKTsKLSAgICAgIGlmIChjYXRhbG9nRWxlbWVudCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpCi0gICAgICB7Ci0gICAgICAgIElDYXRhbG9nRW50cnkgZW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgY2F0YWxvZ0VsZW1lbnQ7Ci0gICAgICAgIGVudHJ5LnNldEtleShrZXkpOwotCQlTdHJpbmcgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZVBhdGgoZW50cnlVUkkpOwotCQllbnRyeS5zZXRVUkkocmVzb2x2ZWRQYXRoKTsKLSAgICAgICAgU3RyaW5nIGlkID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9JRCk7IC8vIG9wdGlvbmFsCi0gICAgICAgIGlmIChpZCAhPSBudWxsICYmICFpZC5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICBlbnRyeS5zZXRJZChpZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIHByb2Nlc3MgYW55IG90aGVyIGF0dHJpYnV0ZXMKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZU5hbWVzKCkubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGVOYW1lcygpW2pdOwotICAgICAgICBpZiAoIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUkkpICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfTkFNRSkgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9QVUJMSUNfSUQpCi0gICAgICAgICAgICAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1NZU1RFTV9JRCkgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9DQVRBTE9HKSAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0lEKQotICAgICAgICAgICAgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9CQVNFKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTsKLSAgICAgICAgICBpZiAoYXR0clZhbHVlICE9IG51bGwgJiYgIWF0dHJWYWx1ZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgewotICAgICAgICAgICAgY2F0YWxvZ0VsZW1lbnQuc2V0QXR0cmlidXRlVmFsdWUoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRhbG9nLmFkZENhdGFsb2dFbGVtZW50KGNhdGFsb2dFbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcHJvY2Vzc05leHRDYXRhbG9nRWxlbWVudHMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRFbGVtZW50TGlzdCkKLSAgewotICAgIGlmIChjYXRhbG9nID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZEVsZW1lbnRMaXN0Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBjaGlsZEVsZW1lbnRMaXN0W2ldOwotICAgICAgU3RyaW5nIGxvY2F0aW9uID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9DQVRBTE9HKTsgLy8gbWFuZGF0b3J5Ci0gICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCB8fCBsb2NhdGlvbi5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19uZXh0X2NhdGFsb2dfbG9jYXRpb25fdXJpX25vdF9zZXQpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIElOZXh0Q2F0YWxvZyBuZXh0Q2F0YWxvZyA9IG5ldyBOZXh0Q2F0YWxvZygpOwotCSAgU3RyaW5nIHJlc29sdmVkUGF0aCA9IHJlc29sdmVQYXRoKGxvY2F0aW9uKTsKLSAgICAgIG5leHRDYXRhbG9nLnNldENhdGFsb2dMb2NhdGlvbihyZXNvbHZlZFBhdGgpOwotCSAgU3RyaW5nIGlkID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9JRCk7Ci0JICBpZiAoaWQgIT0gbnVsbCAmJiAhaWQuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgeyAKLQkJICBuZXh0Q2F0YWxvZy5zZXRJZChpZCk7Ci0gICAgICB9Ci0gICAgICBjYXRhbG9nLmFkZENhdGFsb2dFbGVtZW50KG5leHRDYXRhbG9nKTsKLSAgICB9Ci0gIH0KLSAgCi0gCi0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4NmUyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTW9sbGVyIC0gamVzcGVyQHNlbHNrYWJldC5vcmcgLSBidWcgMTEyMjg0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgQ2F0YWxvZ0VsZW1lbnQgaW1wbGVtZW50cyBJQ2F0YWxvZ0VsZW1lbnQKLXsKLQlpbnQgdHlwZTsKLQotCVN0cmluZyBpZDsKLQotCVN0cmluZyBiYXNlOwotCi0JTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JSUNhdGFsb2cgb3duZXJDYXRhbG9nOwotCi0JcHVibGljIENhdGFsb2dFbGVtZW50KGludCBhVHlwZSkKLQl7Ci0JCXN1cGVyKCk7Ci0JCXR5cGUgPSBhVHlwZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKQotCXsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCYXNlKCkKLQl7Ci0JCXJldHVybiBiYXNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJhc2UoU3RyaW5nIGJhc2UpCi0JewotCQl0aGlzLmJhc2UgPSBiYXNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIG5hbWUpCi0JewotCQlyZXR1cm4gKFN0cmluZykgYXR0cmlidXRlcy5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLQl7Ci0JCWF0dHJpYnV0ZXMucHV0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0QXR0cmlidXRlcygpCi0JewotCQlDb2xsZWN0aW9uIGMgPSBhdHRyaWJ1dGVzLnZhbHVlcygpOwotCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2Muc2l6ZSgpXTsKLQkJYXR0cmlidXRlcy5rZXlTZXQoKS50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpCi0JewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKQotCXsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCXB1YmxpYyBJQ2F0YWxvZyBnZXRPd25lckNhdGFsb2coKQotCXsKLQkJcmV0dXJuIG93bmVyQ2F0YWxvZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPd25lckNhdGFsb2coSUNhdGFsb2cgY2F0YWxvZykKLQl7Ci0JCXRoaXMub3duZXJDYXRhbG9nID0gY2F0YWxvZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBtYWtlQWJzb2x1dGUoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIGxvY2F0aW9uKQotCXsKLQkJVVJMIGxvY2FsID0gbnVsbDsKLQkJbG9jYXRpb24gPSBsb2NhdGlvbi5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCXRyeQotCQl7Ci0JCQlVUkwgYmFzZVVSTCA9IG5ldyBVUkwoYmFzZUxvY2F0aW9uKTsKLQkJCWxvY2FsID0gbmV3IFVSTChiYXNlVVJMLCBsb2NhdGlvbik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotCQl7Ci0JCX0KLQotCQlpZiAobG9jYWwgIT0gbnVsbCkKLQkJewotCQkJcmV0dXJuIGxvY2FsLnRvU3RyaW5nKCk7Ci0JCX0gZWxzZQotCQl7Ci0JCQlyZXR1cm4gbG9jYXRpb247Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFic29sdXRlUGF0aChTdHJpbmcgcGF0aCkKLQl7Ci0JCXRyeQotCQl7Ci0JCQlVUkkgdXJpID0gbmV3IFVSSShwYXRoKTsKLQkJCWlmICh1cmkuaXNBYnNvbHV0ZSgpKQotCQkJewotCQkJCXJldHVybiBwYXRoOwotCQkJfQotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkKLQkJewotCQl9Ci0KLQkJaWYgKHRoaXMuYmFzZSAhPSBudWxsICYmICF0aGlzLmJhc2UuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlyZXR1cm4gbWFrZUFic29sdXRlKGJhc2UsIHBhdGgpOwkJCi0JCX0KLQkJCi0JCVN0cmluZyByZXN1bHQgPSBwYXRoOwotCQlDYXRhbG9nIGNhdGFsb2cgPSAoQ2F0YWxvZykgZ2V0T3duZXJDYXRhbG9nKCk7Ci0JCWlmIChjYXRhbG9nICE9IG51bGwpCi0JCXsKLQkJCVN0cmluZyBiYXNlID0gY2F0YWxvZy5nZXRCYXNlKCk7Ci0JCQlpZiAoYmFzZSA9PSBudWxsIHx8IGJhc2UuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWJhc2UgPSBjYXRhbG9nLmdldExvY2F0aW9uKCk7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBtYWtlQWJzb2x1dGUoYmFzZSwgcGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JICAvKgotCSAgICogU2luY2Ugd2UgZG9uJ3QgaGF2ZSBldmVudHMgbm90aWZpY2F0aW9ucyBmb3IgZW50cnkgcHJvcGVydGllcywgY2xvbmUoKQotCSAgICogY291bGQgYWxsb3cgdG8gY29weSBhbmQgZWRpdCBlbnRyeSBhbmQgdGhlbiByZXBsYWNlIGl0IGluIGNhdGFsb2cuIEVudHJ5Ci0JICAgKiByZXBsYWNlbWVudCB3aWxsIHNpZ25hbCBJQ2F0YWxvZ0V2ZW50IEByZXR1cm4KLQkgICAqLwotCSAgcHVibGljIE9iamVjdCBjbG9uZSgpCi0JICB7Ci0JCUlDYXRhbG9nRWxlbWVudCBlbGVtZW50ID0gb3duZXJDYXRhbG9nLmNyZWF0ZUNhdGFsb2dFbGVtZW50KHR5cGUpOwotCSAgICBTdHJpbmdbXSBhdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlcygpOyAgIAotCSAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspCi0JICAgIHsKLQkgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzW2ldOwotCSAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhdHRyTmFtZSk7Ci0JICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVWYWx1ZShhdHRyTmFtZSwgYXR0clZhbHVlKTsKLQkgICAgfQotCQllbGVtZW50LnNldE93bmVyQ2F0YWxvZyhvd25lckNhdGFsb2cpOwotCQllbGVtZW50LnNldElkKGlkKTsKLQkJZWxlbWVudC5zZXRCYXNlKGJhc2UpOwotCSAgICByZXR1cm4gZWxlbWVudDsKLQkgIH0KLQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0VudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUwYThlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotCi1wdWJsaWMgY2xhc3MgQ2F0YWxvZ0VudHJ5IGV4dGVuZHMgQ2F0YWxvZ0VsZW1lbnQgaW1wbGVtZW50cyBJQ2F0YWxvZ0VudHJ5LCBDbG9uZWFibGUKLXsKLSAgaW50IGVudHJ5VHlwZSA9IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM7Ci0gIFN0cmluZyBrZXk7Ci0gIFN0cmluZyB1cmk7Ci0KLSAgcHJvdGVjdGVkIENhdGFsb2dFbnRyeShpbnQgYW5FbnRyeVR5cGUpCi0gIHsKLSAgICBzdXBlcihJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9FTlRSWSk7Ci0gICAgZW50cnlUeXBlID0gYW5FbnRyeVR5cGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ2F0YWxvZ0VudHJ5KCkKLSAgewotICAgIHN1cGVyKElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVudHJ5VHlwZShpbnQgdmFsdWUpCi0gIHsKLSAgICBlbnRyeVR5cGUgPSB2YWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0RW50cnlUeXBlKCkKLSAgewotICAgIHJldHVybiBlbnRyeVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAga2V5ID0gdmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gIHsKLSAgICByZXR1cm4ga2V5OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRVUkkoKQotICB7Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VVJJKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHVyaSA9IHZhbHVlOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjbG9uZSgpCi0gIHsKLSAgICBDYXRhbG9nRW50cnkgZW50cnkgPSAoQ2F0YWxvZ0VudHJ5KXN1cGVyLmNsb25lKCk7Ci0JZW50cnkuc2V0RW50cnlUeXBlKGVudHJ5VHlwZSk7Ci0gICAgZW50cnkuc2V0S2V5KGtleSk7Ci0gICAgZW50cnkuc2V0VVJJKHVyaSk7Ci0gICAgcmV0dXJuIGVudHJ5OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmJhNjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRXZlbnQ7Ci0KLQotcHVibGljIGNsYXNzIENhdGFsb2dFdmVudCBpbXBsZW1lbnRzIElDYXRhbG9nRXZlbnQKLXsKLSAgcHJvdGVjdGVkIElDYXRhbG9nIGNhdGFsb2c7Ci0gIHByb3RlY3RlZCBJQ2F0YWxvZ0VsZW1lbnQgY2F0YWxvZ0VsZW1lbnQ7Ci0gIHByb3RlY3RlZCBpbnQgZXZlbnRUeXBlOwotCi0gIHB1YmxpYyBDYXRhbG9nRXZlbnQoQ2F0YWxvZyBjYXRhbG9nLCBJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCwgaW50IGV2ZW50VHlwZSkKLSAgewotICAgIHRoaXMuY2F0YWxvZyA9IGNhdGFsb2c7Ci0gICAgdGhpcy5jYXRhbG9nRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgdGhpcy5ldmVudFR5cGUgPSBldmVudFR5cGU7Ci0gIH0KLQotICBwdWJsaWMgSUNhdGFsb2cgZ2V0Q2F0YWxvZygpCi0gIHsKLSAgICByZXR1cm4gY2F0YWxvZzsKLSAgfQotCi0gIHB1YmxpYyBJQ2F0YWxvZ0VsZW1lbnQgZ2V0Q2F0YWxvZ0VsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGNhdGFsb2dFbGVtZW50OwotICB9Ci0KLSAgcHVibGljIGludCBnZXRFdmVudFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGV2ZW50VHlwZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1JlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1JlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTNhMTViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE1vZWxsZXIgLSBBZGRlZCBYTUwgQ2F0YWxvZ3MgMS4xIHN1cHBvcnQKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSURlbGVnYXRlQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JUmV3cml0ZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklTdWZmaXhFbnRyeTsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIAotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDYXRhbG9nUmVhZGVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWFkKENhdGFsb2cgeG1sQ2F0YWxvZywgSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgIGZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0gICAgICBmYWN0b3J5LnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9ub252YWxpZGF0aW5nL2xvYWQtZXh0ZXJuYWwtZHRkIiwgZmFsc2UpOy8vJE5PTi1OTFMtMSQKLSAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbnB1dCksIG5ldyBDYXRhbG9nQ29udGVudEhhbmRsZXIoeG1sQ2F0YWxvZykpOwotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgfQotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENhdGFsb2dDb250ZW50SGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgQ2F0YWxvZyBjYXRhbG9nOwotICAgIHByb3RlY3RlZCBTdGFjayBiYXNlVVJJU3RhY2sgPSBuZXcgU3RhY2soKTsKLQotICAgIHB1YmxpYyBDYXRhbG9nQ29udGVudEhhbmRsZXIoQ2F0YWxvZyB4bWxDYXRhbG9nKQotICAgIHsKLSAgICAgIHRoaXMuY2F0YWxvZyA9IHhtbENhdGFsb2c7Ci0gICAgICBTdHJpbmcgYmFzZSA9IHhtbENhdGFsb2cuZ2V0QmFzZSgpOwotICAgICAgaWYoYmFzZSA9PSBudWxsIHx8IGJhc2UgPT0gIiIpIHsgIC8vJE5PTi1OTFMtMSQKLSAgICAJICBiYXNlID0geG1sQ2F0YWxvZy5nZXRMb2NhdGlvbigpOwotICAgICAgfQotICAgICAgYmFzZVVSSVN0YWNrLnB1c2goYmFzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgLy8gc2V0IGJhc2UgYXR0cmlidXRlIHhtbDpiYXNlCi0gICAgICBTdHJpbmcgYmFzZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQkFTRSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChiYXNlICE9IG51bGwgJiYgIWJhc2UuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICAgIC8vIHNpbmNlIHRoZSB4bWw6YmFzZSBhdHRyaWJ1dGUgY2FuIGJlIHJlbGF0aXZlIHRvIHRoZSBlbmNsb3NpbmcgZWxlbWVudCdzIGVmZmVjdGl2ZSBiYXNlLCB3ZSdyZSBtYWludGFpbmluZyBhCi0gICAgICAgICAgLy8gc3RhY2sgb2YgYWJzb2x1dGUgVVJJcwotCQkgIGlmIChVUkkuY3JlYXRlVVJJKGJhc2UpLmlzUmVsYXRpdmUoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBiYXNlID0gVVJJLnJlc29sdmVSZWxhdGl2ZVVSSShiYXNlLCBiYXNlVVJJU3RhY2sucGVlaygpLnRvU3RyaW5nKCkpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGJhc2VVUklTdGFjay5wdXNoKFVSSUhlbHBlci5lbnN1cmVVUklQcm90b2NvbEZvcm1hdChiYXNlKSk7Ci0gICAgICB9IGVsc2UgewotICAgIAkgIGJhc2VVUklTdGFjay5wdXNoKGJhc2VVUklTdGFjay5wZWVrKCkpOwotICAgICAgfQotCi0JICAvLyBwcm9jZXNzaW5nIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHN0YXJ0Ci0JICBpZiAobG9jYWxOYW1lLmVxdWFscyhDb21wYXRhYmlsaXR5Q29uc3RhbnRzLlRBR19VU0VSX0VOVFJZKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgQ29tcGF0YWJpbGl0eUNvbnN0YW50cy5BVFRfVFlQRSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYm9vbGVhbiBpc1N5c3RlbSA9IGZhbHNlOwotICAgICAgICBpZiAodHlwZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAJaXNTeXN0ZW0gPSAodHlwZU5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZSgiU1lTVEVNIikgPT0gMCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSA9IG5ldyBDYXRhbG9nRW50cnkoaXNTeXN0ZW0gPyBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNIDogSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQyk7Ci0gICAgICAgIGNhdGFsb2dFbnRyeS5zZXRLZXkoYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgQ29tcGF0YWJpbGl0eUNvbnN0YW50cy5BVFRfSUQpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgZW50cnlVcmkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBDb21wYXRhYmlsaXR5Q29uc3RhbnRzLkFUVF9VUkkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICAvLyBGb3IgcmVsYXRpdmUgVVJJcywgdHJ5IHRvIHJlc29sdmUgdGhlbSB1c2luZyB0aGUgY29ycmVzcG9uZGluZyBiYXNlIFVSSS4KLSAgICAgICAgY2F0YWxvZ0VudHJ5LnNldFVSSShyZXNvbHZlUmVsYXRpdmUoZW50cnlVcmkpKTsKLQotICAgICAgICBTdHJpbmcgd2ViVVJMID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgQ29tcGF0YWJpbGl0eUNvbnN0YW50cy5BVFRfV0VCX1VSTCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHdlYlVSTCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgIAljYXRhbG9nRW50cnkuc2V0QXR0cmlidXRlVmFsdWUoCi0gICAgICAgIAkJCUlDYXRhbG9nRW50cnkuQVRUUl9XRUJfVVJMLCB3ZWJVUkwpOwotICAgICAgICB9Ci0JCWNhdGFsb2cuYWRkQ2F0YWxvZ0VsZW1lbnQoY2F0YWxvZ0VudHJ5KTsKLQkJcmV0dXJuOwotICAgICAgfQotCSAgLy8gIHByb2Nlc3NpbmcgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZW5kCi0JICBJQ2F0YWxvZ0VsZW1lbnQgY2F0YWxvZ0VsZW1lbnQgPSBudWxsOwotCi0gICAgICBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19QVUJMSUMuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgCSAgLy8gNi41LjMuIFRoZSBwdWJsaWMgRW50cnkKLSAgICAJICBjYXRhbG9nRWxlbWVudCA9IGNyZWF0ZUVudHJ5KGF0dHJpYnV0ZXMsIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUMsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1BVQkxJQ19JRCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1NZU1RFTS5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAJICAvLyA2LjUuNC4gVGhlIHN5c3RlbSBFbGVtZW50Ci0gICAgCSAgY2F0YWxvZ0VsZW1lbnQgPSBjcmVhdGVFbnRyeShhdHRyaWJ1dGVzLCBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9TWVNURU1fSUQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19VUkkuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgCSAgLy8gNi41LjkuIFRoZSB1cmkgRWxlbWVudAotICAgIAkgIGNhdGFsb2dFbGVtZW50ID0gY3JlYXRlRW50cnkoYXR0cmlidXRlcywgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSSwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1JFV1JJVEVfU1lTVEVNLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgIAkgIC8vIDYuNS41LiBUaGUgcmV3cml0ZVN5c3RlbSBFbGVtZW50Ci0gICAgCSAgY2F0YWxvZ0VsZW1lbnQgPSBjcmVhdGVSZXdyaXRlKGF0dHJpYnV0ZXMsIElSZXdyaXRlRW50cnkuUkVXUklURV9UWVBFX1NZU1RFTSwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfU1lTVEVNX0lEX1NUQVJUX1NUUklORyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1JFV1JJVEVfVVJJLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgIAkgIC8vIDYuNS45LiBUaGUgdXJpIEVsZW1lbnQKLSAgICAJICBjYXRhbG9nRWxlbWVudCA9IGNyZWF0ZVJld3JpdGUoYXR0cmlidXRlcywgSVJld3JpdGVFbnRyeS5SRVdSSVRFX1RZUEVfVVJJLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUklfU1RBUlRfU1RSSU5HKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfREVMRUdBVEVfUFVCTElDLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgIAkgIC8vIDYuNS43LiBUaGUgZGVsZWdhdGVQdWJsaWMgRWxlbWVudAotICAgIAkgIGNhdGFsb2dFbGVtZW50ID0gY3JlYXRlRGVsZWdhdGUoYXR0cmlidXRlcywgSURlbGVnYXRlQ2F0YWxvZy5ERUxFR0FURV9UWVBFX1BVQkxJQywgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfUFVCTElDX0lEX1NUQVJUX1NUUklORyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX0RFTEVHQVRFX1NZU1RFTS5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAJICAvLyA2LjUuOC4gVGhlIGRlbGVnYXRlU3lzdGVtIEVsZW1lbnQKLSAgICAJICBjYXRhbG9nRWxlbWVudCA9IGNyZWF0ZURlbGVnYXRlKGF0dHJpYnV0ZXMsIElEZWxlZ2F0ZUNhdGFsb2cuREVMRUdBVEVfVFlQRV9TWVNURU0sIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1NZU1RFTV9JRF9TVEFSVF9TVFJJTkcpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19ERUxFR0FURV9VUkkuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgCSAgLy8gNi41LjEyLiBUaGUgZGVsZWdhdGVVUkkgRWxlbWVudAotICAgIAkgIGNhdGFsb2dFbGVtZW50ID0gY3JlYXRlRGVsZWdhdGUoYXR0cmlidXRlcywgSURlbGVnYXRlQ2F0YWxvZy5ERUxFR0FURV9UWVBFX1VSSSwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfVVJJX1NUQVJUX1NUUklORyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1NZU1RFTV9TVUZGSVguZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgCSAgLy8gNi41LjYuIFRoZSBzeXN0ZW1TdWZmaXggRWxlbWVudAotICAgIAkgIGNhdGFsb2dFbGVtZW50ID0gY3JlYXRlU3VmZml4KGF0dHJpYnV0ZXMsIElTdWZmaXhFbnRyeS5TVUZGSVhfVFlQRV9TWVNURU0sIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1NZU1RFTV9JRF9TVUZGRklYKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfVVJJX1NVRkZJWC5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAJICAvLyA2LjUuMTEuIFRoZSB1cmlTdWZmaXggRWxlbWVudAotICAgIAkgIGNhdGFsb2dFbGVtZW50ID0gY3JlYXRlU3VmZml4KGF0dHJpYnV0ZXMsIElTdWZmaXhFbnRyeS5TVUZGSVhfVFlQRV9VUkksIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSV9TVUZGSVgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19ORVhUX0NBVEFMT0cuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGNhdGFsb2dFbGVtZW50ID0gY3JlYXRlTmV4dENhdGFsb2coYXR0cmlidXRlcyk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChjYXRhbG9nRWxlbWVudCA9PSBudWxsKQotICAgICAgewotICAgIAkvLyBkbyBub3Qgc2V0IHRoZSBleHRyYSBpbmZvcm1hdGlvbgotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLQkgIFN0cmluZyBhdHRySWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9JRCk7Ly8kTk9OLU5MUy0xJAotCSAgaWYgKGF0dHJJZCAhPSBudWxsICYmICEgIiIuZXF1YWxzKGF0dHJJZCkpIGNhdGFsb2dFbGVtZW50LnNldElkKGF0dHJJZCk7Ly8kTk9OLU5MUy0xJAotICAgICAgLy8gcHJvY2VzcyBhbnkgb3RoZXIgYXR0cmlidXRlcwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBqKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0TG9jYWxOYW1lKGopOwotICAgICAgICBpZiAoIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUkkpICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfTkFNRSkgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9QVUJMSUNfSUQpCi0gICAgICAgICAgICAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1NZU1RFTV9JRCkgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9DQVRBTE9HKSAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0lEKQotICAgICAgICAgICAgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9CQVNFKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGF0dHJOYW1lKTsKLSAgICAgICAgICBpZiAoYXR0clZhbHVlICE9IG51bGwgJiYgIWF0dHJWYWx1ZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgewotICAgICAgICAgICAgY2F0YWxvZ0VsZW1lbnQuc2V0QXR0cmlidXRlVmFsdWUoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRhbG9nLmFkZENhdGFsb2dFbGVtZW50KGNhdGFsb2dFbGVtZW50KTsKLQotICAgIH0KLQotCXByaXZhdGUgSUNhdGFsb2dFbGVtZW50IGNyZWF0ZU5leHRDYXRhbG9nKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlTdHJpbmcgbG9jYXRpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9DQVRBTE9HKTsgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICBOZXh0Q2F0YWxvZyBkZWxlZ2F0ZSA9IG5ldyBOZXh0Q2F0YWxvZygpOwotICAgICAgICBkZWxlZ2F0ZS5zZXRCYXNlKChTdHJpbmcpYmFzZVVSSVN0YWNrLnBlZWsoKSk7Ci0gICAgICAgIGRlbGVnYXRlLnNldENhdGFsb2dMb2NhdGlvbihsb2NhdGlvbik7ICAKLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQotICAgIHByaXZhdGUgSUNhdGFsb2dFbnRyeSBjcmVhdGVFbnRyeShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIGludCBlbnRyeVR5cGUsIFN0cmluZyBrZXlBdHRyaWJ1dGVOYW1lKSB7Ci0gICAgCVN0cmluZyBrZXkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBrZXlBdHRyaWJ1dGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotICAgIAlpZiAoa2V5ID09IG51bGwgfHwga2V5LmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAJewotICAgIAkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFhNTENvcmVNZXNzYWdlcy5DYXRhbG9nX2VudHJ5X2tleV9ub3Rfc2V0KTsKLSAgICAJCXJldHVybiBudWxsOwotICAgIAl9Ci0gICAgCVN0cmluZyBlbnRyeVVSSSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSk7IC8vJE5PTi1OTFMtMSQKLSAgICAJaWYgKGVudHJ5VVJJID09IG51bGwgfHwgZW50cnlVUkkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgIAl7Ci0gICAgCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfZW50cnlfdXJpX25vdF9zZXQpOwotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICAJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gbmV3IENhdGFsb2dFbnRyeShlbnRyeVR5cGUpOwotICAgIAllbnRyeS5zZXRLZXkoa2V5KTsKLSAgICAJZW50cnkuc2V0VVJJKHJlc29sdmVSZWxhdGl2ZShlbnRyeVVSSSkpOwotICAgIAlyZXR1cm4gZW50cnk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJUmV3cml0ZUVudHJ5IGNyZWF0ZVJld3JpdGUoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBpbnQgZW50cnlUeXBlLCBTdHJpbmcgcHJlZml4U3RyaW5nTmFtZSkgewotICAgIAlTdHJpbmcgc3RhcnRTdHJpbmcgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBwcmVmaXhTdHJpbmdOYW1lKTsgLy8kTk9OLU5MUy0xJAotICAgIAlpZiAoc3RhcnRTdHJpbmcgPT0gbnVsbCB8fCBzdGFydFN0cmluZy5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgCXsKLSAgICAJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19yZXdyaXRlX3N0YXJ0U3RyaW5nX25vdF9zZXQpOwotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICAJU3RyaW5nIHByZWZpeCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1JFV1JJVEVfUFJFRklYKTsgLy8kTk9OLU5MUy0xJAotICAgIAlpZiAocHJlZml4ID09IG51bGwgfHwgcHJlZml4LmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAJewotICAgIAkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFhNTENvcmVNZXNzYWdlcy5DYXRhbG9nX3Jld3JpdGVfcHJlZml4X25vdF9zZXQpOwotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICAJUmV3cml0ZUVudHJ5IGVudHJ5ID0gbmV3IFJld3JpdGVFbnRyeShlbnRyeVR5cGUpOwotICAgIAllbnRyeS5zZXRTdGFydFN0cmluZyhzdGFydFN0cmluZyk7Ci0gICAgCWVudHJ5LnNldFJld3JpdGVQcmVmaXgocmVzb2x2ZVJlbGF0aXZlKHByZWZpeCkpOwotICAgIAlyZXR1cm4gZW50cnk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJRGVsZWdhdGVDYXRhbG9nIGNyZWF0ZURlbGVnYXRlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgaW50IGVudHJ5VHlwZSwgU3RyaW5nIHN0YXJ0U3RyaW5nQXR0ck5hbWUpIHsKLSAgICAJU3RyaW5nIHN0YXJ0U3RyaW5nID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgc3RhcnRTdHJpbmdBdHRyTmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAJaWYgKHN0YXJ0U3RyaW5nID09IG51bGwgfHwgc3RhcnRTdHJpbmcuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgIAl7Ci0gICAgCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfZGVsZWdhdGVfcHJlZml4X25vdF9zZXQpOwotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICAJU3RyaW5nIGNhdGFsb2dVcmkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9DQVRBTE9HKTsgLy8kTk9OLU5MUy0xJAotICAgIAlpZiAoY2F0YWxvZ1VyaSA9PSBudWxsIHx8IGNhdGFsb2dVcmkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgIAl7Ci0gICAgCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfZGVsZWdhdGVfcHJlZml4X25vdF9zZXQpOwotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICAJRGVsZWdhdGVDYXRhbG9nIGVudHJ5ID0gbmV3IERlbGVnYXRlQ2F0YWxvZyhlbnRyeVR5cGUpOwotICAgIAllbnRyeS5zZXRTdGFydFN0cmluZyhzdGFydFN0cmluZyk7Ci0gICAgCWVudHJ5LnNldENhdGFsb2dMb2NhdGlvbihjYXRhbG9nVXJpKTsKLSAgICAJcmV0dXJuIGVudHJ5OwotICAgIH0KLQotICAgIHByaXZhdGUgSVN1ZmZpeEVudHJ5IGNyZWF0ZVN1ZmZpeChBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIGludCBlbnRyeVR5cGUsIFN0cmluZyBzdWZmaXhBdHRyTmFtZSkgewotICAgIAlTdHJpbmcgc3VmZml4ID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgc3VmZml4QXR0ck5hbWUpOyAvLyROT04tTkxTLTEkCi0gICAgCWlmIChzdWZmaXggPT0gbnVsbCB8fCBzdWZmaXguZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgIAl7Ci0gICAgCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfc3VmZml4X3N0cmluZ19ub3Rfc2V0KTsKLSAgICAJCXJldHVybiBudWxsOwotICAgIAl9Ci0gICAgCVN0cmluZyB1cmkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUkkpOyAvLyROT04tTkxTLTEkCi0gICAgCWlmICh1cmkgPT0gbnVsbCB8fCB1cmkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgIAl7Ci0gICAgCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfc3VmZml4X3VyaV9ub3Rfc2V0KTsKLSAgICAJCXJldHVybiBudWxsOwotICAgIAl9Ci0gICAgCVN1ZmZpeEVudHJ5IGVudHJ5ID0gbmV3IFN1ZmZpeEVudHJ5KGVudHJ5VHlwZSk7Ci0gICAgCWVudHJ5LnNldFN1ZmZpeChzdWZmaXgpOwotICAgIAllbnRyeS5zZXRVUkkocmVzb2x2ZVJlbGF0aXZlKHVyaSkpOwotICAgIAlyZXR1cm4gZW50cnk7Ci0gICAgfQotCi0JcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZVJlbGF0aXZlKFN0cmluZyBlbnRyeVVSSSkgCi0JewotCQlpZihVUkkuY3JlYXRlVVJJKGVudHJ5VVJJKS5pc1JlbGF0aXZlKCkpIAotCQl7Ci0gICAgICAgIAllbnRyeVVSSSA9IFVSSS5yZXNvbHZlUmVsYXRpdmVVUkkoZW50cnlVUkksIGJhc2VVUklTdGFjay5wZWVrKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQkJcmV0dXJuIFVSSUhlbHBlci5lbnN1cmVVUklQcm90b2NvbEZvcm1hdChlbnRyeVVSSSk7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBpZiAoYmFzZVVSSVN0YWNrLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGJhc2VVUklTdGFjay5wb3AoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gIH0gIAotICAKLSAgLy8gZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkKLSAgaW50ZXJmYWNlIENvbXBhdGFiaWxpdHlDb25zdGFudHN7Ci0JICAKLQkgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JRF9YTUxfQ0FUQUxPR19TRVRUSU5HUyA9ICJYTUxDYXRhbG9nU2V0dGluZ3MiOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfSURfVVNFUl9FTlRSSUVTID0gIlVzZXJFbnRyaWVzIjsgLy8kTk9OLU5MUy0xJAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1VTRVJfRU5UUlkgPSAiVXNlckVudHJ5IjsgLy8kTk9OLU5MUy0xJAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RZUEUgPSAiVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQkgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJJRCI7IC8vJE5PTi1OTFMtMSQKLQkgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9VUkkgPSAiVVJJIjsgLy8kTk9OLU5MUy0xJAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1dFQl9VUkwgPSAiV0VCX1VSTCI7IC8vJE5PTi1OTFMtMSQKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1NldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1NldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2ZiZDE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLQotcHVibGljIGNsYXNzIENhdGFsb2dTZXQgewotCXByb3RlY3RlZCBNYXAgdXJpUmVzb3VyY2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByb3RlY3RlZCBNYXAgY2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQlwdWJsaWMgQ2F0YWxvZ1NldCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIGEgQ2F0YWxvZyB3aXRoIHRoZSBnaXZlbiBJRC4gIElmIG9uZSBpcyBub3QgZm91bmQsIGNyZWF0ZSBvbmUgYXQgdGhlIGdpdmVuIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gdXJpIC0gdGhlIFVSSSwgdGhlIHBhcmVudCBvZiB0aGlzIGZpbGUgcGF0aCBtdXN0IGFscmVhZHkgZXhpc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENhdGFsb2cgbG9va3VwT3JDcmVhdGVDYXRhbG9nKFN0cmluZyBpZCwgU3RyaW5nIHVyaSkgewotCQlDYXRhbG9nIGNhdGFsb2cgPSBnZXRDYXRhbG9nKGlkLCB1cmkpOwotCQlpZiAoY2F0YWxvZyA9PSBudWxsKSB7Ci0JCQljYXRhbG9nID0gbmV3IENhdGFsb2codGhpcywgaWQsIHVyaSk7Ci0JCQl0cnkgewotCQkJCWNhdGFsb2cubG9hZCgpOwotCQkJCXVyaVJlc291cmNlTWFwLnB1dCh1cmksIGNhdGFsb2cpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gd2UgY2F0Y2ggYW5kIGxvZyBhbGwgZXhjZXB0aW9ucywgdG8gZGlzYWxsb3cKLQkJCQkvLyBvbmUgYmFkIGV4dGVuc2lvbiBpbnRlcmZlcmluZyB3aXRoIG90aGVycwotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImVycm9yIGxvYWRpbmcgY2F0YWxvZzogIiArIGlkICsgIiAiICsgdXJpLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhdGFsb2c7Ci0JfQotCi0JcHJpdmF0ZSBDYXRhbG9nIGdldENhdGFsb2coU3RyaW5nIGlkLCBTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiAoQ2F0YWxvZykgdXJpUmVzb3VyY2VNYXAuZ2V0KHVyaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHV0Q2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb24oU3RyaW5nIGxvZ2ljYWxVUkksIFN0cmluZyBhY3R1YWxVUkkpIHsKLQkJY2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb25zLnB1dChsb2dpY2FsVVJJLCBhY3R1YWxVUkkpOwotCX0KLQotCS8vIE5ldmVyIHVzZWQ/Ci0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nUGVyc2lzdGVuY2VMb2NhdGlvbihTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGNhdGFsb2dQZXJzaXN0ZW5jZUxvY2F0aW9ucy5nZXQoaWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dXcml0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBkNTE2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSURlbGVnYXRlQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSVJld3JpdGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JU3VmZml4RW50cnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBXcml0ZSBPQVNJUyBYTUwgQ2F0YWxvZyBmb3JtYXQKLSAqIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2F0YWxvZ1dyaXRlcgotewotICBwcml2YXRlIERvY3VtZW50IGRvYzsKLQotICBwdWJsaWMgdm9pZCB3cml0ZShJQ2F0YWxvZyB4bWxDYXRhbG9nLCBTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0JT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JdHJ5IHsKLSAgICAgIHZpc2l0Q2F0YWxvZyh4bWxDYXRhbG9nKTsKLSAgICAgIG91dHB1dFN0cmVhbSA9IGdldE91dHB1dFN0cmVhbSh1cmkpOwotICAgICAgc2VyaWFsaXplKG91dHB1dFN0cmVhbSk7Ci0JfQotCWZpbmFsbHkgewotCSAgaWYob3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLQkJb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0JICB9Ci0JfQotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGUoSUNhdGFsb2cgY2F0YWxvZywgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGNhdGFsb2cgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2aXNpdENhdGFsb2coY2F0YWxvZyk7Ci0gICAgICBzZXJpYWxpemUob3MpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCB2aXNpdENhdGFsb2coSUNhdGFsb2cgeG1sQ2F0YWxvZykKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGRvYyA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgfQotICAgIGlmIChkb2MgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBFbGVtZW50IGNhdGFsb2dFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhPQVNJU0NhdGFsb2dDb25zdGFudHMubmFtZXNwYWNlTmFtZSwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19DQVRBTE9HKTsKLSAgICBkb2MuYXBwZW5kQ2hpbGQoY2F0YWxvZ0VsZW1lbnQpOwotICAgIHByb2Nlc3NDYXRhbG9nRW50cmllcyh4bWxDYXRhbG9nLCBjYXRhbG9nRWxlbWVudCk7Ci0gICAgcHJvY2Vzc05leHRDYXRhbG9ncyh4bWxDYXRhbG9nLCBjYXRhbG9nRWxlbWVudCk7Ci0gICAgcHJvY2Vzc0RlbGVnYXRlQ2F0YWxvZ3MoeG1sQ2F0YWxvZywgY2F0YWxvZ0VsZW1lbnQpOwotICAgIHByb2Nlc3NTdWZmaXhFbnRyaWVzKHhtbENhdGFsb2csIGNhdGFsb2dFbGVtZW50KTsKLSAgICBwcm9jZXNzUmV3cml0ZUVudHJpZXMoeG1sQ2F0YWxvZywgY2F0YWxvZ0VsZW1lbnQpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NSZXdyaXRlRW50cmllcyhJQ2F0YWxvZyBjYXRhbG9nLCBFbGVtZW50IHBhcmVudCkKLSAgewotICAgIElSZXdyaXRlRW50cnlbXSBjYXRhbG9nRW50cmllcyA9IGNhdGFsb2cuZ2V0UmV3cml0ZUVudHJpZXMoKTsKLSAgICAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhdGFsb2dFbnRyaWVzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElSZXdyaXRlRW50cnkgZW50cnkgPSBjYXRhbG9nRW50cmllc1tpXTsKLSAgICAgIFN0cmluZyBzdGFydFN0cmluZyA9IGVudHJ5LmdldFN0YXJ0U3RyaW5nKCk7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gZW50cnkuZ2V0UmV3cml0ZVByZWZpeCgpOwotCSAgRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBudWxsOwotCSAKLSAgICAgc3dpdGNoIChlbnRyeS5nZXRFbnRyeVR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBJUmV3cml0ZUVudHJ5LlJFV1JJVEVfVFlQRV9TWVNURU0gOgotICAgICAgICAgIGNoaWxkRWxlbWVudCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1JFV1JJVEVfU1lTVEVNKTsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9TWVNURU1fSURfU1RBUlRfU1RSSU5HLCBzdGFydFN0cmluZyk7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1JFV1JJVEVfUFJFRklYLCBwcmVmaXgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJUmV3cml0ZUVudHJ5LlJFV1JJVEVfVFlQRV9VUkk6Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfUkVXUklURV9VUkkpOwotICAgICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0JICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUklfU1RBUlRfU1RSSU5HLCBzdGFydFN0cmluZyk7Ci0JICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9SRVdSSVRFX1BSRUZJWCwgcHJlZml4KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKGNoaWxkRWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBzZXRBdHRyaWJ1dGVzKGVudHJ5LCBjaGlsZEVsZW1lbnQpOwotICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGRFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcHJvY2Vzc1N1ZmZpeEVudHJpZXMoSUNhdGFsb2cgY2F0YWxvZywgRWxlbWVudCBwYXJlbnQpCi0gIHsKLSAgICBJU3VmZml4RW50cnlbXSBzdWZmaXhFbnRyaWVzID0gY2F0YWxvZy5nZXRTdWZmaXhFbnRyaWVzKCk7Ci0gICAgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWZmaXhFbnRyaWVzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElTdWZmaXhFbnRyeSBlbnRyeSA9IHN1ZmZpeEVudHJpZXNbaV07Ci0gICAgICBTdHJpbmcgc3VmZml4U3RyaW5nID0gZW50cnkuZ2V0U3VmZml4KCk7Ci0gICAgICBTdHJpbmcgdXJpID0gZW50cnkuZ2V0VVJJKCk7Ci0JICBFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0JIAotICAgICBzd2l0Y2ggKGVudHJ5LmdldEVudHJ5VHlwZSgpKQotICAgICAgewotICAgICAgICBjYXNlIElTdWZmaXhFbnRyeS5TVUZGSVhfVFlQRV9TWVNURU0gOgotICAgICAgICAgIGNoaWxkRWxlbWVudCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1NZU1RFTV9TVUZGSVgpOwotICAgICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1NZU1RFTV9JRF9TVUZGRklYLCBzdWZmaXhTdHJpbmcpOwotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUkksIHVyaSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElTdWZmaXhFbnRyeS5TVUZGSVhfVFlQRV9VUkk6Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfVVJJX1NVRkZJWCk7Ci0gICAgICAgICAgaWYgKGNoaWxkRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLQkgICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSV9TVUZGSVgsIHN1ZmZpeFN0cmluZyk7Ci0JICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUkksIHVyaSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2V0QXR0cmlidXRlcyhlbnRyeSwgY2hpbGRFbGVtZW50KTsKLSAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkRWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NEZWxlZ2F0ZUNhdGFsb2dzKElDYXRhbG9nIGNhdGFsb2csIEVsZW1lbnQgcGFyZW50KQotICB7Ci0gICAgSURlbGVnYXRlQ2F0YWxvZ1tdIGRlbGVnYXRlQ2F0YWxvZ3MgPSBjYXRhbG9nLmdldERlbGVnYXRlQ2F0YWxvZ3MoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsZWdhdGVDYXRhbG9ncy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJRGVsZWdhdGVDYXRhbG9nIGVudHJ5ID0gZGVsZWdhdGVDYXRhbG9nc1tpXTsKLSAgICAgIFN0cmluZyBwcmVmaXhTdHJpbmcgPSBlbnRyeS5nZXRTdGFydFN0cmluZygpOwotICAgICAgU3RyaW5nIGNhdGFsb2dMb2NhdGlvbiA9IGVudHJ5LmdldENhdGFsb2dMb2NhdGlvbigpOwotICAgICAgRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBudWxsOwotCi0gICAgICBzd2l0Y2ggKGVudHJ5LmdldEVudHJ5VHlwZSgpKQotICAgICAgewotICAgICAgY2FzZSBJRGVsZWdhdGVDYXRhbG9nLkRFTEVHQVRFX1RZUEVfUFVCTElDOgotICAgICAgICBjaGlsZEVsZW1lbnQgPSBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19ERUxFR0FURV9QVUJMSUMpOwotICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1BVQkxJQ19JRF9TVEFSVF9TVFJJTkcsIHByZWZpeFN0cmluZyk7Ci0gICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9DQVRBTE9HLCBjYXRhbG9nTG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBJRGVsZWdhdGVDYXRhbG9nLkRFTEVHQVRFX1RZUEVfU1lTVEVNOgotICAgICAgICBjaGlsZEVsZW1lbnQgPSBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19ERUxFR0FURV9TWVNURU0pOwotICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1NZU1RFTV9JRF9TVEFSVF9TVFJJTkcsIHByZWZpeFN0cmluZyk7Ci0gICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9DQVRBTE9HLCBjYXRhbG9nTG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBJRGVsZWdhdGVDYXRhbG9nLkRFTEVHQVRFX1RZUEVfVVJJOgotICAgICAgICBjaGlsZEVsZW1lbnQgPSBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19ERUxFR0FURV9VUkkpOwotICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSV9TVEFSVF9TVFJJTkcsIHByZWZpeFN0cmluZyk7Ci0gICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9DQVRBTE9HLCBjYXRhbG9nTG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKGNoaWxkRWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBzZXRBdHRyaWJ1dGVzKGVudHJ5LCBjaGlsZEVsZW1lbnQpOwotICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGRFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcHJvY2Vzc0NhdGFsb2dFbnRyaWVzKElDYXRhbG9nIGNhdGFsb2csIEVsZW1lbnQgcGFyZW50KQotICB7Ci0gICAgSUNhdGFsb2dFbnRyeVtdIGNhdGFsb2dFbnRyaWVzID0gY2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpOwotICAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhdGFsb2dFbnRyaWVzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElDYXRhbG9nRW50cnkgZW50cnkgPSBjYXRhbG9nRW50cmllc1tpXTsKLSAgICAgIFN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgIFN0cmluZyB1cmkgPSBlbnRyeS5nZXRVUkkoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGRFbGVtZW50ID0gbnVsbDsKLQkgCi0gICAgICBzd2l0Y2ggKGVudHJ5LmdldEVudHJ5VHlwZSgpKQotICAgICAgewotICAgICAgICBjYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUMgOgotICAgICAgICAgIGNoaWxkRWxlbWVudCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1BVQkxJQyk7Ci0gICAgICAgICAgaWYgKGNoaWxkRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfUFVCTElDX0lELCBrZXkpOwotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUkksIHVyaSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU0gOgotICAgICAgICAgIGNoaWxkRWxlbWVudCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1NZU1RFTSk7Ci0gICAgICAgICAgaWYgKGNoaWxkRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfU1lTVEVNX0lELCBrZXkpOwotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUkksIHVyaSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkkgOgotICAgICAgICAgIGNoaWxkRWxlbWVudCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1VSSSk7Ci0gICAgICAgICAgaWYgKGNoaWxkRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfTkFNRSwga2V5KTsKLSAgICAgICAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfVVJJLCB1cmkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgCSAgc2V0QXR0cmlidXRlcyhlbnRyeSwgY2hpbGRFbGVtZW50KTsKLSAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkRWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldEF0dHJpYnV0ZXMoSUNhdGFsb2dFbGVtZW50IGVudHJ5LCBFbGVtZW50IGNoaWxkRWxlbWVudCkKLSAgewotICAgIFN0cmluZ1tdIGF0dHJpYnV0ZXMgPSBlbnRyeS5nZXRBdHRyaWJ1dGVzKCk7ICAgCi0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaisrKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyTmFtZSA9IGF0dHJpYnV0ZXNbal07Ci0gICAgICBpZiAoYXR0ck5hbWUgIT0gbnVsbCAmJiAhYXR0ck5hbWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gZW50cnkuZ2V0QXR0cmlidXRlVmFsdWUoYXR0ck5hbWUpOwotICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwgJiYgYXR0clZhbHVlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIFN0cmluZyBpZCA9IGVudHJ5LmdldElkKCk7Ci0gICAgaWYgKGlkICE9IG51bGwpCi0gICAgewotICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9JRCwgaWQpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzTmV4dENhdGFsb2dzKElDYXRhbG9nIGNhdGFsb2csIEVsZW1lbnQgcGFyZW50KQotICB7Ci0gICAgLy8gaGFuZGxlIGNhdGFsb2cgZW50cmllcwotICAgIElOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGNhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0gICAgRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBudWxsOwotICAgLy9kdyBTdHJpbmcgYXR0clZhbHVlID0gbnVsbDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5leHRDYXRhbG9ncy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJTmV4dENhdGFsb2cgZGVsZWdhdGUgPSBuZXh0Q2F0YWxvZ3NbaV07Ci0gICAgICBjaGlsZEVsZW1lbnQgPSBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19ORVhUX0NBVEFMT0cpOwotICAgICAgaWYgKGNoaWxkRWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGRFbGVtZW50KTsKLSAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gZGVsZWdhdGUuZ2V0Q2F0YWxvZ0xvY2F0aW9uKCk7Ci0gICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9DQVRBTE9HLCBsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0QXR0cmlidXRlcyhkZWxlZ2F0ZSwgY2hpbGRFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2VyaWFsaXplKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoZG9jID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zZm9ybWVyRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIC8vIFVubGVzcyBhIHdpZHRoIGlzIHNldCwgdGhlcmUgd2lsbCBiZSBvbmx5IGxpbmUgYnJlYWtzIGJ1dCBubwotICAgICAgLy8gaW5kZW50YXRpb24uCi0gICAgICAvLyBUaGUgSUJNIEpESyBhbmQgdGhlIFN1biBKREsgZG9uJ3QgYWdyZWUgb24gdGhlIHByb3BlcnR5IG5hbWUsCi0gICAgICAvLyBzbyB3ZSBzZXQgdGhlbSBib3RoLgotICAgICAgLy8KLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFufWluZGVudC1hbW91bnQiLCAiMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICIyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgU3RyaW5nIGVuY29kaW5nID0gIlVURi04IjsgLy8gVEJEIC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCBlbmNvZGluZyk7Ci0gICAgICB9Ci0gICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2MpLCBuZXcgU3RyZWFtUmVzdWx0KG91dHB1dFN0cmVhbSkpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGZpbGVQYXRoID0gcmVtb3ZlUHJvdG9jb2wodXJpKTsKLSAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlUGF0aCk7Ci0gICAgT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotICAgIHJldHVybiBzdHJlYW07Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHJlbW92ZVByb3RvY29sKFN0cmluZyB1cmkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gdXJpOyAgCi0gICAgU3RyaW5nIHByb3RvY29sX3BhdHRlcm4gPSAiOiI7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gdXJpLmluZGV4T2YocHJvdG9jb2xfcGF0dGVybik7Ci0gICAgICBpZiAoaW5kZXggPiAyKQotICAgICAgewotICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKGluZGV4ICsgcHJvdG9jb2xfcGF0dGVybi5sZW5ndGgoKSk7ICAgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvRGVsZWdhdGVDYXRhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9EZWxlZ2F0ZUNhdGFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdlNzI5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9EZWxlZ2F0ZUNhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSmVzcGVyIFN0ZWVuIE1vZWxsZXIKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIEplc3BlciBTdGVlbiBNb2VsbGVyIC0gQWRkZWQgWE1MIENhdGFsb2dzIDEuMSBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSURlbGVnYXRlQ2F0YWxvZzsKLQotCi0KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0ZUNhdGFsb2cgZXh0ZW5kcyBUeXBlZENhdGFsb2dFbGVtZW50IGltcGxlbWVudHMgSURlbGVnYXRlQ2F0YWxvZwotewotICBwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKLSAgcHJpdmF0ZSBJQ2F0YWxvZyByZWZlcmVuY2VkQ2F0YWxvZzsKLSAgcHJpdmF0ZSBTdHJpbmcgc3RhcnRTdHJpbmc7IAotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRTdHJpbmcoKSAKLSAgewotICAgIHJldHVybiBzdGFydFN0cmluZzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFN0YXJ0U3RyaW5nKFN0cmluZyBzdGFydFN0cmluZykgCi0gIHsKLSAgICB0aGlzLnN0YXJ0U3RyaW5nID0gc3RhcnRTdHJpbmc7Ci0gIH0KLQotICBwdWJsaWMgRGVsZWdhdGVDYXRhbG9nKGludCB0eXBlKQotICB7Ci0gICAgc3VwZXIoSUNhdGFsb2dFbGVtZW50LlRZUEVfREVMRUdBVEUsIHR5cGUpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRDYXRhbG9nTG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGxvY2F0aW9uOwotICB9Ci0KLSAgcHVibGljIElDYXRhbG9nIGdldFJlZmVyZW5jZWRDYXRhbG9nKCkKLSAgewotICAgIGlmIChyZWZlcmVuY2VkQ2F0YWxvZyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlZmVyZW5jZWRDYXRhbG9nID0gKChDYXRhbG9nKW93bmVyQ2F0YWxvZykuZ2V0Q2F0YWxvZ1NldCgpLmxvb2t1cE9yQ3JlYXRlQ2F0YWxvZyhnZXRJZCgpLCBnZXRBYnNvbHV0ZVBhdGgobG9jYXRpb24pKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlZmVyZW5jZWRDYXRhbG9nOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0xvY2F0aW9uKFN0cmluZyB1cmkpCi0gIHsKLSAgICBsb2NhdGlvbiA9IHVyaTsKLSAgICByZWZlcmVuY2VkQ2F0YWxvZyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLSAgewotICAgIERlbGVnYXRlQ2F0YWxvZyBuZXh0Q2F0YWxvZyA9IChEZWxlZ2F0ZUNhdGFsb2cpc3VwZXIuY2xvbmUoKTsKLSAgICBuZXh0Q2F0YWxvZy5zZXRDYXRhbG9nTG9jYXRpb24obG9jYXRpb24pOwotICAgIG5leHRDYXRhbG9nLnNldFN0YXJ0U3RyaW5nKHN0YXJ0U3RyaW5nKTsKLSAgICByZXR1cm4gbmV4dENhdGFsb2c7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL05leHRDYXRhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9OZXh0Q2F0YWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmY3NTVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL05leHRDYXRhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgUmFqIE1hbmRheWFtLCBJQk0KLSAqICAgICAgICAgICAxMzY0MDAgTmV4dENhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKSB0YWtlcyBhIGxvdCBvZiB0aW1lIGNvbXB1dGluZyBjb25zdGFudCBpbmZvcm1hdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLQotCi0KLXB1YmxpYyBjbGFzcyBOZXh0Q2F0YWxvZyBleHRlbmRzIENhdGFsb2dFbGVtZW50IGltcGxlbWVudHMgSU5leHRDYXRhbG9nCi17Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOwotICBwcml2YXRlIElDYXRhbG9nIHJlZmVyZW5jZWRDYXRhbG9nOwotCi0gIHB1YmxpYyBOZXh0Q2F0YWxvZygpCi0gIHsKLSAgICBzdXBlcihJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ORVhUX0NBVEFMT0cpOwotICB9Ci0gICAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZ0xvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBsb2NhdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBJQ2F0YWxvZyBnZXRSZWZlcmVuY2VkQ2F0YWxvZygpCi0gIHsKLSAgICBpZiAocmVmZXJlbmNlZENhdGFsb2cgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZWZlcmVuY2VkQ2F0YWxvZyA9ICgoQ2F0YWxvZylvd25lckNhdGFsb2cpLmdldENhdGFsb2dTZXQoKS5sb29rdXBPckNyZWF0ZUNhdGFsb2coZ2V0SWQoKSwgZ2V0QWJzb2x1dGVQYXRoKGxvY2F0aW9uKSk7Ci0gICAgfQotICAgIHJldHVybiByZWZlcmVuY2VkQ2F0YWxvZzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENhdGFsb2dMb2NhdGlvbihTdHJpbmcgdXJpKQotICB7Ci0gICAgbG9jYXRpb24gPSB1cmk7Ci0gICAgcmVmZXJlbmNlZENhdGFsb2cgPSBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLSAgewotCU5leHRDYXRhbG9nIG5leHRDYXRhbG9nID0gKE5leHRDYXRhbG9nKXN1cGVyLmNsb25lKCk7Ci0JbmV4dENhdGFsb2cuc2V0Q2F0YWxvZ0xvY2F0aW9uKGxvY2F0aW9uKTsKLSAgICByZXR1cm4gbmV4dENhdGFsb2c7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL09BU0lTQ2F0YWxvZ0NvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvT0FTSVNDYXRhbG9nQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MTZhNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvT0FTSVNDYXRhbG9nQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE1vZWxsZXIgLSBBZGRlZCBYTUwgQ2F0YWxvZ3MgMS4xIHN1cHBvcnQKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotcHVibGljIGludGVyZmFjZSBPQVNJU0NhdGFsb2dDb25zdGFudHMKLXsKLSAgU3RyaW5nIG5hbWVzcGFjZU5hbWUgPSAidXJuOm9hc2lzOm5hbWVzOnRjOmVudGl0eTp4bWxuczp4bWw6Y2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIFR5cGVzIG9mIHRoZSBjYXRhbG9nIGVudHJpZXMgKi8KLSAgLyoqIFRoZSBDQVRBTE9HIGVsZW1lbnQgbmFtZS4gKi8KLSAgU3RyaW5nIFRBR19DQVRBTE9HID0gImNhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUaGUgR1JPVVAgY2F0YWxvZyBlbnRyeS4gKi8KLSAgU3RyaW5nIFRBR19HUk9VUCA9ICJncm91cCI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIFRoZSBQVUJMSUMgY2F0YWxvZyBlbnRyeS4gKi8KLSAgU3RyaW5nIFRBR19QVUJMSUMgPSAicHVibGljIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIFNZU1RFTSBjYXRhbG9nIGV0bnJ5LiAqLwotICBTdHJpbmcgVEFHX1NZU1RFTSA9ICJzeXN0ZW0iOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUaGUgVVJJIGNhdGFsb2cgZW50cnkuICovCi0gIFN0cmluZyBUQUdfVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIFRoZSBSRVdSSVRFX1NZU1RFTSBjYXRhbG9nIGVudHJ5LiAqLwotICBTdHJpbmcgVEFHX1JFV1JJVEVfU1lTVEVNID0gInJld3JpdGVTeXN0ZW0iOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUaGUgUkVXUklURV9VUkkgY2F0YWxvZyBlbnRyeS4gKi8KLSAgU3RyaW5nIFRBR19SRVdSSVRFX1VSSSA9ICJyZXdyaXRlVVJJIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIHN5c3RlbVN1ZmZpeCBjYXRhbG9nIGVudHJ5LiAqLwotICBTdHJpbmcgVEFHX1NZU1RFTV9TVUZGSVggPSAic3lzdGVtU3VmZml4IjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIHVyaVN1ZmZpeCBjYXRhbG9nIGVudHJ5LiAqLwotICBTdHJpbmcgVEFHX1VSSV9TVUZGSVggPSAidXJpU3VmZml4IjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIERFTEVHQVRFX1BVQkxJQyBjYXRhbG9nIGVudHJ5LiAqLwotICBTdHJpbmcgVEFHX0RFTEVHQVRFX1BVQkxJQyA9ICJkZWxlZ2F0ZVB1YmxpYyI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIFRoZSBERUxFR0FURV9TWVNURU0gY2F0YWxvZyBlbnRyeS4gKi8KLSAgU3RyaW5nIFRBR19ERUxFR0FURV9TWVNURU0gPSAiZGVsZWdhdGVTeXN0ZW0iOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUaGUgREVMRUdBVEVfVVJJIGNhdGFsb2cgZW50cnkuICovCi0gIFN0cmluZyBUQUdfREVMRUdBVEVfVVJJID0gImRlbGVnYXRlVVJJIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIE5FWFRfQ0FUQUxPRyBjYXRhbG9nIGVudHJ5LiAqLwotICBTdHJpbmcgVEFHX05FWFRfQ0FUQUxPRyA9ICJuZXh0Q2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIEF0dHJpYnV0ZXMgKi8KLSAgLyoqIEF0dHJpYnV0ZSBpZCB1c2VkIGluIGFsbCBjYXRhbG9nIGVudHJpZXMgKi8KLSAgU3RyaW5nIEFUVFJfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0gIC8qKiBBdHRyaWJ1dGUgaWQgYmFzZSBpbiBhbGwgY2F0YWxvZyBlbnRyaWVzICovCi0gIFN0cmluZyBBVFRSX0JBU0UgPSAieG1sOmJhc2UiOyAvLyROT04tTkxTLTEkCi0gIC8qKiBBdHRyaWJ1dGUgaWQgcHJlZmVyIGluIGNhdGFsb2cgZW50cmllczogQ0FUQUxPRywgR1JPVVAgKi8KLSAgU3RyaW5nIEFUVFJfUFJFRkVSRSA9ICJwcmVmZXIiOyAvLyROT04tTkxTLTEkCi0gIC8qKiBBdHRyaWJ1dGUgdXNlZCBpbiBjYXRhbG9nIGVudHJpZXMgb2YgdHlwZTogUFVCTElDICovCi0gIFN0cmluZyBBVFRSX1BVQkxJQ19JRCA9ICJwdWJsaWNJZCI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBTWVNURU0KLSAgICovCi0gIFN0cmluZyBBVFRSX1NZU1RFTV9JRCA9ICJzeXN0ZW1JZCI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBTWVNURU1fU1VGRklYCi0gICAqLwotICBTdHJpbmcgQVRUUl9TWVNURU1fSURfU1VGRkZJWCA9ICJzeXN0ZW1JZFN1ZmZpeCI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBVUkkKLSAgICovCi0gIFN0cmluZyBBVFRSX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBQVUJMSUMsIFVSSQotICAgKi8KLSAgU3RyaW5nIEFUVFJfVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBVUklfU1VGRklYCi0gICAqLwotICBTdHJpbmcgQVRUUl9VUklfU1VGRklYID0gInVyaVN1ZmZpeCI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBSRVdSSVRFX1NZU1RFTSwgREVMRUdBVEVfU1lTVEVNCi0gICAqLwotICBTdHJpbmcgQVRUUl9TWVNURU1fSURfU1RBUlRfU1RSSU5HID0gInN5c3RlbUlkU3RhcnRTdHJpbmciOyAvLyROT04tTkxTLTEkCi0gIC8qKgotICAgKiBBdHRyaWJ1dGUgdXNlZCBpbiBjYXRhbG9nIGVudHJpZXMgb2YgdHlwZTogUkVXUklURV9TWVNURU0sIFJFV1JJVEVfVVJJCi0gICAqLwotICBTdHJpbmcgQVRUUl9SRVdSSVRFX1BSRUZJWCA9ICJyZXdyaXRlUHJlZml4IjsgLy8kTk9OLU5MUy0xJAotICAvKioKLSAgICogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IERFTEVHQVRFX1BVQkxJQwotICAgKi8KLSAgU3RyaW5nIEFUVFJfUFVCTElDX0lEX1NUQVJUX1NUUklORyA9ICJwdWJsaWNJZFN0YXJ0U3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotICAvKioKLSAgICogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IERFTEVHQVRFX1BVQkxJQywKLSAgICogREVMRUdBVEVfU1lTVEVNLCBERUxFR0FURV9VUkksIE5FWFRfQ0FUQUxPRwotICAgKi8KLSAgU3RyaW5nIEFUVFJfQ0FUQUxPRyA9ICJjYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotICAvKioKLSAgICogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IFJFV1JJVEVfVVJJLCBERUxFR0FURV9VUkkKLSAgICovCi0gIFN0cmluZyBBVFRSX1VSSV9TVEFSVF9TVFJJTkcgPSAidXJpU3RhcnRTdHJpbmciOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9SZXdyaXRlRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL1Jld3JpdGVFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDk1OTBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL1Jld3JpdGVFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBKZXNwZXIgU3RlZW4gTW9lbGxlcgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSmVzcGVyIFN0ZWVuIE1vZWxsZXIgLSBBZGRlZCBYTUwgQ2F0YWxvZ3MgMS4xIHN1cHBvcnQKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JUmV3cml0ZUVudHJ5OwotCi1wdWJsaWMgY2xhc3MgUmV3cml0ZUVudHJ5IGV4dGVuZHMgVHlwZWRDYXRhbG9nRWxlbWVudCBpbXBsZW1lbnRzIElSZXdyaXRlRW50cnksIENsb25lYWJsZSAKLXsKLQlTdHJpbmcgc3RhcnRTdHJpbmc7Ci0JU3RyaW5nIHJld3JpdGVQcmVmaXg7Ci0KLQlwcm90ZWN0ZWQgUmV3cml0ZUVudHJ5KGludCBhbkVudHJ5VHlwZSkgCi0JewotCQlzdXBlcihJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9SRVdSSVRFLCBhbkVudHJ5VHlwZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGFydFN0cmluZygpIAotCXsKLQkJcmV0dXJuIHN0YXJ0U3RyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0U3RyaW5nKFN0cmluZyBzdGFydFN0cmluZykgCi0JewotCQl0aGlzLnN0YXJ0U3RyaW5nID0gc3RhcnRTdHJpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZXdyaXRlUHJlZml4KCkgCi0JewotCQlyZXR1cm4gcmV3cml0ZVByZWZpeDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXdyaXRlUHJlZml4KFN0cmluZyByZXdyaXRlUHJlZml4KSAKLQl7Ci0JCXRoaXMucmV3cml0ZVByZWZpeCA9IHJld3JpdGVQcmVmaXg7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIAotCXsKLQkJUmV3cml0ZUVudHJ5IGVudHJ5ID0gKFJld3JpdGVFbnRyeSkgc3VwZXIuY2xvbmUoKTsKLQkJZW50cnkuc2V0UmV3cml0ZVByZWZpeChyZXdyaXRlUHJlZml4KTsKLQkJZW50cnkuc2V0U3RhcnRTdHJpbmcoc3RhcnRTdHJpbmcpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvU3VmZml4RW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL1N1ZmZpeEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZGFhYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvU3VmZml4RW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSmVzcGVyIFN0ZWVuIE1vZWxsZXIKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIEplc3BlciBTdGVlbiBNb2VsbGVyIC0gQWRkZWQgWE1MIENhdGFsb2dzIDEuMSBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSVN1ZmZpeEVudHJ5OwotCi1wdWJsaWMgY2xhc3MgU3VmZml4RW50cnkgZXh0ZW5kcyBUeXBlZENhdGFsb2dFbGVtZW50IGltcGxlbWVudHMgSVN1ZmZpeEVudHJ5LCBDbG9uZWFibGUKLXsKLSAgU3RyaW5nIHN1ZmZpeDsKLSAgU3RyaW5nIHVyaTsKLQotICBwcm90ZWN0ZWQgU3VmZml4RW50cnkoaW50IGFuRW50cnlUeXBlKQotICB7Ci0gICAgc3VwZXIoSUNhdGFsb2dFbGVtZW50LlRZUEVfU1VGRklYLCBhbkVudHJ5VHlwZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTdWZmaXgoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgc3VmZml4ID0gdmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFN1ZmZpeCgpCi0gIHsKLSAgICByZXR1cm4gc3VmZml4OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRVUkkoKQotICB7Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VVJJKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHVyaSA9IHZhbHVlOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjbG9uZSgpCi0gIHsKLSAgICBTdWZmaXhFbnRyeSBlbnRyeSA9IChTdWZmaXhFbnRyeSlzdXBlci5jbG9uZSgpOwotICAgIGVudHJ5LnNldFN1ZmZpeChzdWZmaXgpOwotICAgIGVudHJ5LnNldFVSSSh1cmkpOwotICAgIHJldHVybiBlbnRyeTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvVHlwZWRDYXRhbG9nRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvVHlwZWRDYXRhbG9nRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTkyZDZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL1R5cGVkQ2F0YWxvZ0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSmVzcGVyIFN0ZWVuIE1vZWxsZXIKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIEplc3BlciBTdGVlbiBNb2VsbGVyIC0gQWRkZWQgWE1MIENhdGFsb2dzIDEuMSBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLQotcHVibGljIGNsYXNzIFR5cGVkQ2F0YWxvZ0VsZW1lbnQgZXh0ZW5kcyBDYXRhbG9nRWxlbWVudCAKLXsKLQlwcm90ZWN0ZWQgaW50IGVudHJ5VHlwZTsKLQotCXB1YmxpYyBUeXBlZENhdGFsb2dFbGVtZW50KGludCB0eXBlLCBpbnQgZW50cnlUeXBlKSAKLQl7Ci0JCXN1cGVyKHR5cGUpOwotCQl0aGlzLmVudHJ5VHlwZSA9IGVudHJ5VHlwZTsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgdm9pZCBzZXRFbnRyeVR5cGUoaW50IHZhbHVlKSAKLQl7Ci0JICAgIGVudHJ5VHlwZSA9IHZhbHVlOwotCX0KLQotCWZpbmFsIHB1YmxpYyBpbnQgZ2V0RW50cnlUeXBlKCkgCi0JewotCSAgICByZXR1cm4gZW50cnlUeXBlOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0JewotCQlUeXBlZENhdGFsb2dFbGVtZW50IHRlbXAgPSAoVHlwZWRDYXRhbG9nRWxlbWVudClzdXBlci5jbG9uZSgpOwotCQl0ZW1wLnNldEVudHJ5VHlwZSh0aGlzLmdldEVudHJ5VHlwZSgpKTsKLQkJcmV0dXJuIHRlbXA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1VSSVJlc29sdmVyRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nVVJJUmVzb2x2ZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI0YWYwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nVVJJUmVzb2x2ZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW5qZWN0IHRoZSBYTUxDYXRhbG9nIHJlc29sdXRpb24gYmVoYXZpb3VyIGludG8gdGhlCi0gKiBDb21tb24gRXh0ZW5zaWJsZSBVUkkgUmVzb2x2ZXIuIFRoaXMgY2xhc3MgaXMgcmVmZXJlbmNlZCBpbiB0aGUgWE1MIENhdGFsb2cKLSAqIHBsdWdpbidzIHBsdWdpbi54bWwgZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIFhNTENhdGFsb2dVUklSZXNvbHZlckV4dGVuc2lvbiBpbXBsZW1lbnRzIFVSSVJlc29sdmVyRXh0ZW5zaW9uCi17Ci0gIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZShJRmlsZSBmaWxlLCBTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgewotICAgIC8vIGlmIHdlIGhhdmUgY2F0YWxvZyBpbiBhIHByb2plY3Qgd2UgbWF5IGFkZCBpdAotICAgIC8vIHRvIHRoZSBjYXRhbG9nIG1hbmFnZXIgZmlyc3QKLSAgICBJQ2F0YWxvZyBjYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLSAgICBpZiAoY2F0YWxvZyA9PSBudWxsKQotICAgIHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19yZXNvbHV0aW9uX251bGxfY2F0YWxvZyk7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgU3RyaW5nIHJlc29sdmVkID0gbnVsbDsKLSAgICBpZiAoc3lzdGVtSWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgcmVzb2x2ZWQgPSBjYXRhbG9nLnJlc29sdmVTeXN0ZW0oc3lzdGVtSWQpOwotICAgICAgICBpZiAocmVzb2x2ZWQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc29sdmVkID0gY2F0YWxvZy5yZXNvbHZlVVJJKHN5c3RlbUlkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZSkKLSAgICAgIHsKLSAgICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIFhNTENvcmVNZXNzYWdlcy5DYXRhbG9nX3Jlc29sdXRpb25fbWFsZm9ybWVkX3VybCk7Ci0gICAgICAgIHJlc29sdmVkID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpZSkKLSAgICAgIHsKLSAgICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIFhNTENvcmVNZXNzYWdlcy5DYXRhbG9nX3Jlc29sdXRpb25faW9fZXhjZXB0aW9uKTsKLSAgICAgICAgcmVzb2x2ZWQgPSBudWxsOwotICAgICAgfQotICAgIH0KLSAgICBpZiAocmVzb2x2ZWQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAocHVibGljSWQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gQ1MgOiB0aGlzIGlzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGJ1ZyA5Njc3MgotICAgICAgICAvLwotICAgICAgICAvLyBGb3Igc2NoZW1hcyB3ZSBhbHdheXMgdXNlIGxvY2F0aW9ucyB3aGVyZSBhdmFpbGFibGUgYW5kIG9ubHkgdXNlCi0gICAgICAgIC8vIG5hbWVzcGFjZSB3aGVuIG5vIGxvY2F0aW9uIGlzIHNwZWNpZmllZC4gIEZvciBYTUwgZW50aXRpZXMgKHN1Y2ggYXMgRE9DVFlQRSkgCi0gICAgICAgIC8vIGRlZmF1bHQgYWx3YXlzIHV0aWxpemUgdGhlIHB1YmxpYyBjYXRhbG9nIGVudHJ5LgotICAgICAgICAvLwotICAgICAgICAvLyBUaGlzIGxhbWUgdGVzdCBiZWxvdyByb3VnaGx5IGRpc2NyaW1pbmF0ZSBiZXR3ZWVuIHNjaGVtYSBhbmQgWE1MIGVudGl0aWVzLgotICAgICAgICAvLyBUT0RPIChidWcgMTAzMjQzKSByZW1vdmUgdGhpcyBsYW1lIHRlc3Qgb25jZSB3ZSBtb3ZlIHRvIHRoZSBuZXcgVVJJUmVzb2x2ZXIgQVBJCi0gICAgICAgIC8vIHNpbmNlIHRoZSBuZXcgQVBJIGlzIGV4cGxpY2l0IGFib3V0IG5hbWVzcGFjZSBhbmQgcHVibGljSWQKLSAgICAgICAgLy8gCi0gICAgICAgIGlmICghKHN5c3RlbUlkICE9IG51bGwgJiYgc3lzdGVtSWQuZW5kc1dpdGgoIi54c2QiKSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc29sdmVkID0gY2F0YWxvZy5yZXNvbHZlUHVibGljKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZWQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzb2x2ZWQgPSBjYXRhbG9nLnJlc29sdmVVUkkocHVibGljSWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1lKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19yZXNvbHV0aW9uX21hbGZvcm1lZF91cmwpOwotICAgICAgICAgICAgcmVzb2x2ZWQgPSBudWxsOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaWUpCi0gICAgICAgICAgewotICAgICAgICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIFhNTENvcmVNZXNzYWdlcy5DYXRhbG9nX3Jlc29sdXRpb25faW9fZXhjZXB0aW9uKTsKLSAgICAgICAgICAgIHJlc29sdmVkID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc29sdmVkOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc5NmI3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTW9lbGxlciAtIEFkZGVkIFhNTCBDYXRhbG9ncyAxLjEgc3VwcG9ydAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nLgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhdGFsb2cKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNhdGFsb2cgaWQgc3RyaW5nCi0gICAgICogCi0gICAgICogQHJldHVybiBjYXRhbG9nIGlkIHN0cmluZwotICAgICAqLwotICAgIFN0cmluZyBnZXRJZCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgY2F0YWxvZyBpZCBzdHJpbmcKLSAgICAgKiAKLSAgICAgKi8KLSAgICB2b2lkIHNldElkKFN0cmluZyBpZCk7Ci0gICAgCi0gICAgCi0gICAgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pOwotICAgIFN0cmluZyBnZXRMb2NhdGlvbigpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgYXBwbGljYWJsZSBvciBTWVNURU0gaWRlbnRpZmllci4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBzZWFyY2hlcyB0aGUgQ2F0YWxvZyBhbmQgcmV0dXJucyB0aGUgc3lzdGVtIGlkZW50aWZpZXIKLSAgICAgKiBzcGVjaWZpZWQgZm9yIHRoZSBnaXZlbiBzeXN0ZW0gb3IgaWRlbnRpZmllcnMuIElmIG5vIGFwcHJvcHJpYXRlCi0gICAgICogb3IgU1lTVEVNIGVudHJ5IGlzIGZvdW5kIGluIHRoZSBDYXRhbG9nLCBudWxsIGlzIHJldHVybmVkLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHVibGljSWQKLSAgICAgKiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIHRvIGxvY2F0ZSBpbiB0aGUgY2F0YWxvZy4gUHVibGljCi0gICAgICogICAgICAgICAgICBpZGVudGlmaWVycyBhcmUgbm9ybWFsaXplZCBiZWZvcmUgY29tcGFyaXNvbi4KLSAgICAgKiBAcGFyYW0gc3lzdGVtSWQKLSAgICAgKiAgICAgICAgICAgIFRoZSBub21pbmFsIHN5c3RlbSBpZGVudGlmaWVyIGZvciB0aGUgZW50aXR5IGluIHF1ZXN0aW9uIChhcwotICAgICAqICAgICAgICAgICAgcHJvdmlkZWQgaW4gdGhlIHNvdXJjZSBkb2N1bWVudCkuCi0gICAgICogCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBUaGUgZm9ybWFsIHN5c3RlbSBpZGVudGlmaWVyIG9mIGEgc3Vib3JkaW5hdGUgY2F0YWxvZyBjYW5ub3QKLSAgICAgKiAgICAgICAgICAgICBiZSB0dXJuZWQgaW50byBhIHZhbGlkIFVSTC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgRXJyb3IgcmVhZGluZyBzdWJvcmRpbmF0ZSBjYXRhbG9nIGZpbGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgc3lzdGVtIGlkZW50aWZpZXIgdG8gdXNlLiBOb3RlIHRoYXQgdGhlIG5vbWluYWwgc3lzdGVtCi0gICAgICogICAgICAgICBpZGVudGlmaWVyIGlzIG5vdCByZXR1cm5lZCBpZiBhIG1hdGNoIGlzIG5vdCBmb3VuZCBpbiB0aGUKLSAgICAgKiAgICAgICAgIGNhdGFsb2csIGluc3RlYWQgbnVsbCBpcyByZXR1cm5lZCB0byBpbmRpY2F0ZSB0aGF0IG5vIG1hdGNoIHdhcwotICAgICAqICAgICAgICAgZm91bmQuCi0gICAgICovCi0gICAgU3RyaW5nIHJlc29sdmVQdWJsaWMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgYXBwbGljYWJsZSBTWVNURU0gc3lzdGVtIGlkZW50aWZpZXIuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogSWYgYSBTWVNURU0gZW50cnkgZXhpc3RzIGluIHRoZSBDYXRhbG9nIGZvciB0aGUgc3lzdGVtIElEIHNwZWNpZmllZCwKLSAgICAgKiByZXR1cm4gdGhlIG1hcHBlZCB2YWx1ZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogT24gV2luZG93cy1iYXNlZCBvcGVyYXRpbmcgc3lzdGVtcywgdGhlIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgc3lzdGVtCi0gICAgICogaWRlbnRpZmllciBwcm92aWRlZCBhbmQgdGhlIFNZU1RFTSBlbnRyaWVzIGluIHRoZSBDYXRhbG9nIGlzCi0gICAgICogY2FzZS1pbnNlbnNpdGl2ZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHN5c3RlbUlkCi0gICAgICogICAgICAgICAgICBUaGUgc3lzdGVtIElEIHRvIGxvY2F0ZSBpbiB0aGUgY2F0YWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSByZXNvbHZlZCBzeXN0ZW0gaWRlbnRpZmllci4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIFRoZSBmb3JtYWwgc3lzdGVtIGlkZW50aWZpZXIgb2YgYSBzdWJvcmRpbmF0ZSBjYXRhbG9nIGNhbm5vdAotICAgICAqICAgICAgICAgICAgIGJlIHR1cm5lZCBpbnRvIGEgdmFsaWQgVVJMLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBFcnJvciByZWFkaW5nIHN1Ym9yZGluYXRlIGNhdGFsb2cgZmlsZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgcmVzb2x2ZVN5c3RlbShTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0gICAgICAgICAgICBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgYXBwbGljYWJsZSBVUkkuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogSWYgYSBVUkkgZW50cnkgZXhpc3RzIGluIHRoZSBDYXRhbG9nIGZvciB0aGUgVVJJIHNwZWNpZmllZCwgcmV0dXJuIHRoZQotICAgICAqIG1hcHBlZCB2YWx1ZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogVVJJIGNvbXBhcmlzb24gaXMgY2FzZSBzZW5zaXRpdmUuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKiAgICAgICAgICAgIFRoZSBVUkkgdG8gbG9jYXRlIGluIHRoZSBjYXRhbG9nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHJlc29sdmVkIFVSSS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIFRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiBhIHN1Ym9yZGluYXRlIGNhdGFsb2cgY2Fubm90IGJlCi0gICAgICogICAgICAgICAgICAgdHVybmVkIGludG8gYSB2YWxpZCBVUkwuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIEVycm9yIHJlYWRpbmcgc3Vib3JkaW5hdGUgY2F0YWxvZyBmaWxlLgotICAgICAqLwotICAgIFN0cmluZyByZXNvbHZlVVJJKFN0cmluZyB1cmkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0gICAgICAgICAgICBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEFkZHMgY2F0YWxvZyBlbGVtZW50IHRvIHRoZSBjb2xsZWN0aW9uIG9mIHRoZSBjYXRhbG9nIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50IC0KLSAgICAgKiAgICAgICAgICAgIGNhdGFsb2cgZWxlbWVudAotICAgICAqLwotICAgIHZvaWQgYWRkQ2F0YWxvZ0VsZW1lbnQoSUNhdGFsb2dFbGVtZW50IGVsZW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBjYXRhbG9nIGVsZW1lbnQgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiB0aGUgY2F0YWxvZyBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudCAtCi0gICAgICogICAgICAgICAgICBjYXRhbG9nIGVsZW1lbnQKLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZUNhdGFsb2dFbGVtZW50KElDYXRhbG9nRWxlbWVudCBlbGVtZW50KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgY2F0YWxvZyBlbGVtZW50cyBvZiB0eXBlIElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBjYXRhbG9nIGVsZW1lbnRzCi0gICAgICovCi0gICAgSUNhdGFsb2dFbnRyeVtdIGdldENhdGFsb2dFbnRyaWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGNhdGFsb2cgZWxlbWVudHMgb2YgdHlwZSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9SRVdSSVRFCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiByZXdyaXRlIGNhdGFsb2cgZWxlbWVudHMKLSAgICAgKi8KLSAgICBJUmV3cml0ZUVudHJ5W10gZ2V0UmV3cml0ZUVudHJpZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgY2F0YWxvZyBlbGVtZW50cyBvZiB0eXBlIElDYXRhbG9nRWxlbWVudC5UWVBFX1NVRkZJWAotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc3VmZml4IGVudHJ5IGVsZW1lbnRzCi0gICAgICovCi0gICAgSVN1ZmZpeEVudHJ5W10gZ2V0U3VmZml4RW50cmllcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBjYXRhbG9nIGVsZW1lbnRzIG9mIHR5cGUgSUNhdGFsb2dFbGVtZW50LlRZUEVfREVMRUdBVEUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGRlbGVnYXRlIGNhdGFsb2cgZWxlbWVudHMKLSAgICAgKi8KLSAgICBJRGVsZWdhdGVDYXRhbG9nW10gZ2V0RGVsZWdhdGVDYXRhbG9ncygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBjYXRhbG9nIGVsZW1lbnRzIG9mIHR5cGUKLSAgICAgKiBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ERUxFR0FURQotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY2F0YWxvZyBlbGVtZW50cwotICAgICAqLwotICAgIElOZXh0Q2F0YWxvZ1tdIGdldE5leHRDYXRhbG9ncygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBuZXcgY2F0YWxvZyBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCB0eXBlLiBJZiB0aGUgdHlwZSBpcyBvbmUKLSAgICAgKiBvZiBFTEVNRU5UX1RZUEUsIHRoZSByZXN1bHQgZW50cnkgd2lsbCBoYXZlIGNvcnJlc3BvbmRpbmcgaW50ZXJmYWNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBJQ2F0YWxvZ0VsZW1lbnQgY3JlYXRlQ2F0YWxvZ0VsZW1lbnQoaW50IHR5cGUpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgdGhlIGVsZW1lbnRzIGZyb20gdGhpcyBjYXRhbG9nLgotICAgICAqIAotICAgICAqLwotICAgIHZvaWQgY2xlYXIoKTsKLSAgICAKLSAgICAvL3ZvaWQgbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgICAKLSAgICB2b2lkIHNhdmUoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKgotICAgICAqIExvYWRzIGNhdGFsb2cgZnJvbSB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLiBFeHBlY3RpbmcgT0FTSVMgWE1MIENhdGFsb2cKLSAgICAgKiBmb3JtYXQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gLQotICAgICAqICAgICAgICAgICAgdXJpIG9mIHRoZSBmaWxlIHdoZXJlIGNhdGFsb2cgd2lsbCBiZSBzYXZlZAotCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAtCi0gICAgICogICAgICAgICAgICAgcHJvYmxlbSBsb2FkaW5nIGZpbGUKLSAgICAgKiAKLSAgICAgKi8KLSAgICAvL3ZvaWQgbG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoKLSAgICAgKiBTYXZlcyBjYXRhbG9nIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gT0FTSVMgWE1MIENhdGFsb2cgZm9ybWF0Ci0gICAgICogCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIC0KLSAgICAgKiAgICAgICAgICAgIHVyaSBvZiB0aGUgZmlsZSB3aGVyZSBjYXRhbG9nIHdpbGwgYmUgc2F2ZWQKLQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gLQotICAgICAqICAgICAgICAgICAgIHByb2JsZW0gc2F2aW5nIGZpbGUKLSAgICAgKiAKLSAgICAgKi8KLSAgICAvL3ZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBjb3BpZXMgYWxsIGNhdGFsb2cgZW50cmllcyBmcm9tIHNvdXJjZSBjYXRhbG9nIHRvIHRoaXMgb25lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjYXRhbG9nIC0KLSAgICAgKiAgICAgICAgICAgIHNvdXJjZSBjYXRhbG9nCi0gICAgICogQHBhcmFtIGluY2x1ZGVOZXN0ZWQgLQotICAgICAqICAgICAgICAgICAgYSBib29sZWFuIGZsYWcgaW5kaWNhdGluZyB3ZXRoZXIgdG8gaW5jbHVkZSBlbnRyaWVzIG9mIHRoZQotICAgICAqICAgICAgICAgICAgc2FtZSB0eXBlIGZyb20gdGhlIG5lc3RlZCBjYXRhbG9ncwotICAgICAqLwotICAgIHZvaWQgYWRkRW50cmllc0Zyb21DYXRhbG9nKElDYXRhbG9nIGNhdGFsb2cpOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGxpc3RlbmVyIG9mIHRoZSBjYXRhbG9nIGV2ZW50cwotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciAtCi0gICAgICogICAgICAgICAgICBsaXN0ZW5lciBvZiB0aGUgY2F0YWxvZyBldmVudHMKLSAgICAgKiBAc2VlIElDYXRhbG9nRXZlbnQKLSAgICAgKi8KLSAgICB2b2lkIGFkZExpc3RlbmVyKElDYXRhbG9nTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIGxpc3RlbmVyIG9mIHRoZSBjYXRhbG9nIGV2ZW50cwotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciAtCi0gICAgICogICAgICAgICAgICBsaXN0ZW5lciBvZiB0aGUgY2F0YWxvZyBldmVudHMKLSAgICAgKiBAc2VlIElDYXRhbG9nRXZlbnQKLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZUxpc3RlbmVyKElDYXRhbG9nTGlzdGVuZXIgbGlzdGVuZXIpOyAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAxMWM5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTW9lbGxlciAtIEFkZGVkIFhNTCBDYXRhbG9ncyAxLjEgc3VwcG9ydAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsOwotCi0KLS8qKgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhdGFsb2dFbGVtZW50Ci17Ci0gICAgLyoqIFR5cGVzIG9mIHRoZSBjYXRhbG9nIGVudHJpZXMgKi8KLSAgICAvKiogVGhlIFBVQkxJQywgVVJJIG9yIFNZU1RFTSBDYXRhbG9nIEVudHJ5LiAqLwotICAgIGludCBUWVBFX0VOVFJZID0gMTsKLQotICAgIC8qKiBUaGUgTkVYVF9DQVRBTE9HIENhdGFsb2cgRW50cnkgdHlwZS4gKi8KLSAgICBpbnQgVFlQRV9ORVhUX0NBVEFMT0cgPSAxMDsKLQotICAgIC8qKiBSZXdyaXRlIHR5cGVzIChzaW5jZSBYTUwgQ2F0YWxvZ3MgMS4xKSAqLwotICAgIGludCBUWVBFX1JFV1JJVEUgPSAyMDsKLQotICAgIC8qKiBEZWxlZ2F0ZSB0eXBlcyAoc2luY2VYTUwgQ2F0YWxvZ3MgMS4xKSAqLwotICAgIGludCBUWVBFX0RFTEVHQVRFID0gMzA7Ci0gICAgCi0gICAgLyoqIFN1ZmZpeCB0eXBlcyAoc2luY2UgWE1MIENhdGFsb2dzIDEuMSkgICovCi0gICAgaW50IFRZUEVfU1VGRklYID0gNDA7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgaW50IGdldFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgd2l0aCBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHdpdGggc3BlY2lmaWVkIG5hbWUuCi0gICAgICogQHNlZSAjc2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nKQotICAgICAqLwotICAgIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQgYXR0cmlidXRlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgd2lsbCBiZSBzZXQKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlIG5hbWVkIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRBdHRyaWJ1dGVWYWx1ZSgpCi0gICAgICovCi0gICAgdm9pZCBzZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYXR0cmlidXRlIG5hbWVzIGZvciBhbnkgZHluYW1pYyBhdHRyaWJ1dGVzIHRoYXQgbWF5IGV4aXN0Ci0gICAgICogCi0gICAgICogQHJldHVybiBhcnJheSBvZiBhdHRyaWJ1dGUgbmFtZXMKLSAgICAgKiBAc2VlICNnZXRBdHRyaWJ1dGVWYWx1ZSgpCi0gICAgICogQHNlZSAjc2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nKQotICAgICAqLwotICAgIFN0cmluZ1tdIGdldEF0dHJpYnV0ZXMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGVsZW1lbnQncyBpZCBzdHJpbmcKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGVsZW1lbnQncyBpZCBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyBlbGVtZW50J3MgaWQgc3RyaW5nCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRPd25lckNhdGFsb2coSUNhdGFsb2cgY2F0YWxvZyk7Ci0gICAgCi0gICAgcHVibGljIElDYXRhbG9nIGdldE93bmVyQ2F0YWxvZygpOwotCi0Jdm9pZCBzZXRCYXNlKFN0cmluZyBiYXNlKTsKLQotCVN0cmluZyBnZXRCYXNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0VudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0VudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MmRiZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYXRhbG9nRW50cnkgZXh0ZW5kcyBJQ2F0YWxvZ0VsZW1lbnQKLXsKLSAgICAvKiogVGhlIFBVQkxJQyBDYXRhbG9nIEVudHJ5IHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5UUllfVFlQRV9QVUJMSUMgPSAyOwotCi0gICAgLyoqIFRoZSBTWVNURU0gQ2F0YWxvZyBFbnRyeSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVFJZX1RZUEVfU1lTVEVNID0gMzsKLQotICAgIC8qKiBUaGUgVVJJIENhdGFsb2cgRW50cnkgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRSWV9UWVBFX1VSSSA9IDQ7Ci0KLSAgICAvKiogQXR0cmlidXRlIG5hbWUgZm9yIFdlYiBhZGRyZXNzIG9mIGNhdGFsb2cgZW50cnkgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1dFQl9VUkwgPSAid2ViVVJMIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGVudHJ5VHlwZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVudHJ5VHlwZShpbnQgZW50cnlUeXBlKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEVudHJ5VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VVJJKFN0cmluZyB1cmkpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODI1NzY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbDsKLQotCi0KLS8qKgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhdGFsb2dFdmVudAotewotICAgIC8qKiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRUQgPSAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9BRERFRCA9IDE7Ci0KLSAgICAvKiogKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX1JFTU9WRUQgPSAyOwotCi0gICAgLyoqICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9DSEFOR0VEID0gMzsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBJQ2F0YWxvZyBnZXRDYXRhbG9nKCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIElDYXRhbG9nRWxlbWVudCBnZXRDYXRhbG9nRWxlbWVudCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzNkYzBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi0KLS8qKgotICogVGhlIGNsaWVudHMgb2YgdGhlIGNhdGFsb2cgdGhhdCB3YW50IHRvIGxpc3RlbiB0byBjYXRhbG9nIGNoYW5nZXMgc2hvdWxkCi0gKiBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKiAKLSAqIEBzZWUgSUNhdGFsb2csIElDYXRhbG9nRXZlbnQsCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2F0YWxvZ0xpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcgotewotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGFsbG93cyB0byByZWFjdCB0byBjYXRhbG9nIGV2ZW50cwotICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudCAtCi0gICAgICogICAgICAgICAgICBhbiBldmVudCB0aGF0IGNsaWVudCBzaG91bGQgcmVhY3QgdG8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYXRhbG9nQ2hhbmdlZChJQ2F0YWxvZ0V2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lEZWxlZ2F0ZUNhdGFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lEZWxlZ2F0ZUNhdGFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIwNDBiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JRGVsZWdhdGVDYXRhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IEplc3BlciBTdGVlbiBNb2VsbGVyCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBKZXNwZXIgU3RlZW4gTW9lbGxlciAtIEFkZGVkIFhNTCBDYXRhbG9ncyAxLjEgc3VwcG9ydAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEZWxlZ2F0ZUNhdGFsb2cgZXh0ZW5kcyBJQ2F0YWxvZ0VsZW1lbnQKLXsKLSAgICAvKiogVGhlIFNZU1RFTSBDYXRhbG9nIEVudHJ5IHR5cGUuICovCi0gICAgaW50IERFTEVHQVRFX1RZUEVfUFVCTElDID0gMzE7Ci0KLSAgICAvKiogVGhlIFNZU1RFTSBDYXRhbG9nIEVudHJ5IHR5cGUuICovCi0gICAgaW50IERFTEVHQVRFX1RZUEVfU1lTVEVNID0gMzI7Ci0KLSAgICAvKiogVGhlIFVSSSBDYXRhbG9nIEVudHJ5IHR5cGUuICovCi0gICAgaW50IERFTEVHQVRFX1RZUEVfVVJJID0gMzM7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW50cnlUeXBlCi0gICAgICovCi0gICAgdm9pZCBzZXRFbnRyeVR5cGUoaW50IGVudHJ5VHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgaW50IGdldEVudHJ5VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleQotICAgICAqLwotICAgIHZvaWQgc2V0U3RhcnRTdHJpbmcoU3RyaW5nIGtleSk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgU3RyaW5nIGdldFN0YXJ0U3RyaW5nKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IGxvY2F0aW9uIG9mIHRoZSByZWZlcmVuY2VkIGNhdGFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaSAtCi0gICAgICogICAgICAgICAgICBsb2NhdGlvbiB1cmkgb2YgdGhlIHJlZmVyZW5jZWQgY2F0YWxvZwotICAgICAqLwotICAgIHZvaWQgc2V0Q2F0YWxvZ0xvY2F0aW9uKFN0cmluZyB1cmkpOwotCi0gICAgLyoqCi0gICAgICogR2V0IGxvY2F0aW9uIHVyaSBvZiB0aGUgcmVmZXJlbmNlZCBjYXRhbG9nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gbG9jYXRpb24gdXJpIG9mIHRoZSByZWZlcmVuY2VkIGNhdGFsb2cKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q2F0YWxvZ0xvY2F0aW9uKCk7Ci0gICAgCi0gICAgSUNhdGFsb2cgZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lOZXh0Q2F0YWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSU5leHRDYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YzkzOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSU5leHRDYXRhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWw7Ci0KLQotCi0vKioKLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbmV4dENhdGFsb2cgT0FTSVMgWE1MIGNhdGFsb2cgZWxlbWVudC4gT2JqZWN0IG9mIHRoZQotICogY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIHdvdWxkIHNlcnZlIGFzIGEgcmVmZXJlbmNlIHRvIHRoZQotICogY2F0YWxvZyBvYmplY3QuCi0gKiAKLSAqIEBzZWUgSUNhdGFsb2csIElDYXRhbG9nRWxlbWVudAotICogCi0gKiBUaGlzIGludGVyZmFjZSBjdXJyZW50bHkgaXMgdXNlZCBvbmx5IGJ5IHRoZSBjYXRhbG9nIGl0c2VsZi4gTmVlZCB0byBmaW5kIGlmCi0gKiB0aGVyZSBhcmUgYW55IGNsaWVudHMgdGhhdCBuZWVkIGl0LgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5leHRDYXRhbG9nIGV4dGVuZHMgSUNhdGFsb2dFbGVtZW50Ci17Ci0gICAgLyoqCi0gICAgICogU2V0IGxvY2F0aW9uIG9mIHRoZSByZWZlcmVuY2VkIGNhdGFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaSAtCi0gICAgICogICAgICAgICAgICBsb2NhdGlvbiB1cmkgb2YgdGhlIHJlZmVyZW5jZWQgY2F0YWxvZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhdGFsb2dMb2NhdGlvbihTdHJpbmcgdXJpKTsKLQotICAgIC8qKgotICAgICAqIEdldCBsb2NhdGlvbiB1cmkgb2YgdGhlIHJlZmVyZW5jZWQgY2F0YWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGxvY2F0aW9uIHVyaSBvZiB0aGUgcmVmZXJlbmNlZCBjYXRhbG9nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDYXRhbG9nTG9jYXRpb24oKTsKLSAgICAKLSAgICBwdWJsaWMgSUNhdGFsb2cgZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQotICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JUmV3cml0ZUVudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JUmV3cml0ZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOTU1OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSVJld3JpdGVFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBKZXNwZXIgU3RlZW4gTW9lbGxlcgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSmVzcGVyIFN0ZWVuIE1vZWxsZXIgLSBBZGRlZCBYTUwgQ2F0YWxvZ3MgMS4xIHN1cHBvcnQKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbDsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmV3cml0ZUVudHJ5IGV4dGVuZHMgSUNhdGFsb2dFbGVtZW50Ci17Ci0gICAgLyoqIFRoZSByZXdyaXRlU3lzdGVtIENhdGFsb2cgdHlwZS4gKi8KLSAgICBpbnQgUkVXUklURV9UWVBFX1NZU1RFTSA9IDIxOwotCi0gICAgLyoqIFRoZSBVUkkgQ2F0YWxvZyBFbnRyeSB0eXBlLiAqLwotICAgIGludCBSRVdSSVRFX1RZUEVfVVJJID0gMjI7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW50cnlUeXBlCi0gICAgICovCi0gICAgdm9pZCBzZXRFbnRyeVR5cGUoaW50IGVudHJ5VHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgaW50IGdldEVudHJ5VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleQotICAgICAqLwotICAgIHZvaWQgc2V0U3RhcnRTdHJpbmcoU3RyaW5nIHN0YXJ0U3RyaW5nKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0U3RhcnRTdHJpbmcoKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0UmV3cml0ZVByZWZpeCgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqLwotICAgIHZvaWQgc2V0UmV3cml0ZVByZWZpeChTdHJpbmcgdXJpKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lTdWZmaXhFbnRyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSVN1ZmZpeEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDQwMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSVN1ZmZpeEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IEplc3BlciBTdGVlbiBNb2VsbGVyCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBKZXNwZXIgU3RlZW4gTW9lbGxlciAtIEFkZGVkIFhNTCBDYXRhbG9ncyAxLjEgc3VwcG9ydAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdWZmaXhFbnRyeSBleHRlbmRzIElDYXRhbG9nRWxlbWVudAotewotICAgIC8qKiBUaGUgcmV3cml0ZVN5c3RlbSBDYXRhbG9nIHR5cGUuICovCi0gICAgaW50IFNVRkZJWF9UWVBFX1NZU1RFTSA9IDQxOwotCi0gICAgLyoqIFRoZSBVUkkgQ2F0YWxvZyBFbnRyeSB0eXBlLiAqLwotICAgIGludCBTVUZGSVhfVFlQRV9VUkkgPSA0MjsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbnRyeVR5cGUKLSAgICAgKi8KLSAgICB2b2lkIHNldEVudHJ5VHlwZShpbnQgZW50cnlUeXBlKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBpbnQgZ2V0RW50cnlUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICovCi0gICAgdm9pZCBzZXRTdWZmaXgoU3RyaW5nIHN1ZmZpeFN0cmluZyk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgU3RyaW5nIGdldFN1ZmZpeCgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIFN0cmluZyBnZXRVUkkoKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKi8KLSAgICB2b2lkIHNldFVSSShTdHJpbmcgdXJpKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUFueUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUFueUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJhNDcwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01BbnlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTUFueUVsZW1lbnQgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01BbnlFbGVtZW50IGV4dGVuZHMgQ01Db250ZW50IHsKLS8qKgotICogZ2V0TmFtZXNwYWNlVVJJIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXROYW1lc3BhY2VVUkkoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWY3MThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotLyoqCi0gKiBBdHRyaWJ1dGVEZWNsYXJhdGlvbiBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGV4dGVuZHMgQ01Ob2RlIHsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OQUwgICA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVJUkVEICAgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSVhFRCAgICAgID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPSElCSVRFRCA9IDQ7Ci0vKioKLSAqIGdldEF0dHJOYW1lIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXRBdHRyTmFtZSgpOwotLyoqCi0gKiBnZXRBdHRyVHlwZSBtZXRob2QKLSAqIEByZXR1cm4gQ01EYXRhVHlwZQotICovCi1DTURhdGFUeXBlIGdldEF0dHJUeXBlKCk7Ci0vKioKLSAqIGdldERlZmF1bHRWYWx1ZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICogQGRlcHJlY2F0ZWQgLS0gdG8gYmUgcmVwbGFjZWQgaW4gZnV0dXJlIHdpdGggYWRkaXRpb25hbCBDTURhdGFUeXBlIG1ldGhvZHMgKGN1cnJlbnRseSBmb3VuZCBvbiBDTURhdGFUeXBlSGVscGVyKQotICovCi1TdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vKioKLSAqIGdldEVudW1BdHRyIG1ldGhvZAotICogQHJldHVybiBqYXZhLnV0aWwuRW51bWVyYXRpb24KLSAqIEBkZXByZWNhdGVkIC0tIHRvIGJlIHJlcGxhY2VkIGluIGZ1dHVyZSB3aXRoIGFkZGl0aW9uYWwgQ01EYXRhVHlwZSBtZXRob2RzIChjdXJyZW50bHkgZm91bmQgb24gQ01EYXRhVHlwZUhlbHBlcikKLSAqLwotRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKTsKLS8qKgotICogZ2V0VXNhZ2UgbWV0aG9kCi0gKiBAcmV0dXJuIGludAotICovCi1pbnQgZ2V0VXNhZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4YjI5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Db250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotcHVibGljIGludGVyZmFjZSBDTUNvbnRlbnQgZXh0ZW5kcyBDTU5vZGUKLXsKLS8qKgotICogZ2V0TWF4T2NjdXIgbWV0aG9kCi0gKiBAcmV0dXJuIGludAotICoKLSAqIElmIC0xLCBpdCdzIFVOQk9VTkRFRC4KLSAqLwotaW50IGdldE1heE9jY3VyKCk7Ci0vKioKLSAqIGdldE1pbk9jY3VyIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqCi0gKiBJZiAwLCBpdCdzIE9QVElPTkFMLgotICogSWYgMSwgaXQncyBSRVFVSVJFRC4KLSAqLwotaW50IGdldE1pbk9jY3VyKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01EYXRhVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRGF0YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0NzIyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01EYXRhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLS8qKgotICogQ01EYXRhVHlwZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRGF0YVR5cGUgZXh0ZW5kcyBDTU5vZGUgewotICAgIAotICAvLyB0b2RvLi4uIGF0IHNvbWUgcG9pbnQgd2Ugc2hvdWxkIHJlbW92ZSB0aGVzZSBuYW1lcyB0bwotICAvLyBhdm9pZCBleHBvc2luZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHZpYSB0aGUgaW50ZXJmYWNlcwotICAvLwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEEgPSAiQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJJRCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIElEUkVGID0gIklEUkVGIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUZTID0gIklEUkVGUyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWSA9ICJFTlRJVFkiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVElFUyA9ICJFTlRJVElFUyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OID0gIk5PVEFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTiA9ICJOTVRPS0VOIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTlMgPSAiTk1UT0tFTlMiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOVU1CRVIgPSAiTlVNQkVSIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJID0gIlVSSSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVOVU0gPSAiRU5VTSI7IC8vJE5PTi1OTFMtMSQKLQotICBzdGF0aWMgZmluYWwgaW50IElNUExJRURfVkFMVUVfTk9ORSAgICAgICAgICAgICA9IDE7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgSU1QTElFRF9WQUxVRV9GSVhFRCAgICAgICAgICAgID0gMjsKLSAgc3RhdGljIGZpbmFsIGludCBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQgICAgICAgICAgPSAzOwotCi0vKioKLSAqIGdldFR5cGVOYW1lIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXREYXRhVHlwZU5hbWUoKTsgICAgCi0KLS8qKgotICogZ2V0SW1wbGllZFZhbHVlS2luZCBtZXRob2QKLSAqIEByZXR1cm4gaW50Ci0gKgotICogUmV0dXJucyBvbmUgb2YgOgotICogSU1QTElFRF9WQUxVRV9OT05FLCBJTVBMSUVEX1ZBTFVFX0ZJWEVELCBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQuCi0gKi8gICAgICAKLQotaW50IGdldEltcGxpZWRWYWx1ZUtpbmQoKTsgIAotCi0vKioKLSAqIGdldFR5cGVOYW1lIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nICAKLSAqCi0gKiBSZXR1cm5zIHRoZSBpbXBsaWVkIHZhbHVlIG9yIG51bGwgaWYgbm9uZSBleGlzdHMuCi0gKi8KLVN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKTsKLQotLyoqCi0gKiBnZXRUeXBlTmFtZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0gKgotICovCi1TdHJpbmdbXSBnZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0KLS8qKgotICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqCi0gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgc3VpdGFibGUgZGVmYXVsdCB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGRhdGEgdHlwZSBpcyBjcmVhdGVkLgotICogVGhpcyByZXR1cm5zIG51bGwgb2YgYSBzdWl0YWJsZSBkZWZhdWx0IGlzIG5vdCBhdmFpbGFibGUuCi0gKi8KLVN0cmluZyBnZW5lcmF0ZUluc3RhbmNlVmFsdWUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGQ3YTQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTURvY3VtZW50IGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnQgZXh0ZW5kcyBDTU5vZGUgewotLyoqCi0gKiBnZXRFbGVtZW50cyBtZXRob2QKLSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLSAqCi0gKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEVsZW1lbnREZWNsYXJhdGlvbgotICovCi1DTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpOwotLyoqCi0gKiBnZXRFbnRpdGllcyBtZXRob2QKLSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLSAqCi0gKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEVudGl0eURlY2xhcmF0aW9uCi0gKi8KLUNNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCk7Ci0vKioKLSAqIGdldE5hbWVzcGFjZSBtZXRob2QKLSAqIEByZXR1cm4gQ01OYW1lc3BhY2UKLSAqLwotQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZTRkOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLS8qKgotICogQ01Eb2N1bWVudGF0aW9uIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRhdGlvbiBleHRlbmRzIENNTm9kZSB7ICAgICAgICAKLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpOwotICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01FbGVtZW50RGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzQ4MDc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLS8qKgotICogQ01FbGVtZW50RGVjbGFyYXRpb24gaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01FbGVtZW50RGVjbGFyYXRpb24gZXh0ZW5kcyBDTUNvbnRlbnQgewotICAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTlkgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVNUFRZID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSVhFRCA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUENEQVRBID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDREFUQSA9IDU7IC8vIHRvZG8uLi4gY2xhcmlmeSB0aGlzIG9uZQotLyoqCi0gKiBnZXRBdHRyaWJ1dGVzIG1ldGhvZAotICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotICoKLSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgQXR0cmlidXRlRGVjbGFyYXRpb24KLSAqLwotQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpOwotLyoqCi0gKiBnZXRDTUNvbnRlbnQgbWV0aG9kCi0gKiBAcmV0dXJuIENNQ29udGVudAotICoKLSAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGlzIGVsZW1lbnQncyBjb250ZW50IG1vZGVsLgotICogVGhpcyBjYW4gYmUgYW4gQ01FbGVtZW50RGVjbGFyYXRpb24gb3IgYSBDTUdyb3VwCi0gKi8KLUNNQ29udGVudCBnZXRDb250ZW50KCk7Ci0vKioKLSAqIGdldENvbnRlbnRUeXBlIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqCi0gKiBSZXR1cm5zIG9uZSBvZiA6Ci0gKiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQS4KLSAqLwotcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpOwotLyoqCi0gKiBnZXRFbGVtZW50TmFtZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICovCi1TdHJpbmcgZ2V0RWxlbWVudE5hbWUoKTsKLQotLyoqCi0gKiBnZXREYXRhVHlwZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICovCi1DTURhdGFUeXBlIGdldERhdGFUeXBlKCk7Ci0KLS8qKgotICogZ2V0TG9jYWxFbGVtZW50cyBtZXRob2QKLSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLSAqCi0gKiBSZXR1cm5zIGEgbGlzdCBvZiBsb2NhbGx5IGRlZmluZWQgZWxlbWVudHMuCi0gKi8KLUNNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUVudGl0eURlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01FbnRpdHlEZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWI1NDM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUVudGl0eURlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTUVudGl0eURlY2xhcmF0aW9uIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRW50aXR5RGVjbGFyYXRpb24gZXh0ZW5kcyBDTU5vZGUgewotICAKLS8qKgotICogZ2V0TmFtZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICovCi1TdHJpbmcgZ2V0TmFtZSgpOwotLyoqCi0gKiBnZXRWYWx1ZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICovCi1TdHJpbmcgZ2V0VmFsdWUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTAxY2E3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTUdyb3VwIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNR3JvdXAgZXh0ZW5kcyBDTUNvbnRlbnQgewotICAKLQlzdGF0aWMgZmluYWwgaW50IEFMTCA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBDSE9JQ0UgPSAyOwotCXN0YXRpYyBmaW5hbCBpbnQgU0VRVUVOQ0UgPSAxOwotLyoqCi0gKiBnZXRDaGlsZE5vZGVzIG1ldGhvZAotICogQHJldHVybiBDTU5vZGVMaXN0Ci0gKgotICogUmV0dXJucyBjaGlsZCBDTU5vZGVMaXN0LCB3aGljaCBpbmNsdWRlcyBFbGVtZW50RGVmaW5pdGlvbiBvciBDTUVsZW1lbnQuCi0gKi8KLUNNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpOwotCi0vKioKLSAqIGdldE9wZXJhdGlvbiBtZXRob2QKLSAqIEByZXR1cm4gaW50Ci0gKgotICogUmV0dXJucyBvbmUgb2YgOgotICogQUxPTkUgKGEpLCBTRVFVRU5DRSAoYSxiKSwgQ0hPSUNFIChhfGIpLCBBTEwgKGEmYikuCi0gKi8KLWludCBnZXRPcGVyYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZWROb2RlTWFwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lZE5vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3OWI4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lZE5vZGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLS8qKgotICogTmFtZWRDTU5vZGVNYXAKLSAqLwotcHVibGljIGludGVyZmFjZSBDTU5hbWVkTm9kZU1hcCB7Ci0vKioKLSAqIGdldExlbmd0aCBtZXRob2QKLSAqIEByZXR1cm4gaW50Ci0gKi8KLWludCBnZXRMZW5ndGgoKTsKLS8qKgotICogZ2V0TmFtZWRJdGVtIG1ldGhvZAotICogQHJldHVybiBDTU5vZGUKLSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAqLwotQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSk7Ci0vKioKLSAqIGl0ZW0gbWV0aG9kCi0gKiBAcmV0dXJuIENNTm9kZQotICogQHBhcmFtIGluZGV4IGludAotICovCi1DTU5vZGUgaXRlbShpbnQgaW5kZXgpOwotCi0vKioKLSAqCi0gKi8KLUl0ZXJhdG9yIGl0ZXJhdG9yKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDBiY2JjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLS8qKgotICogQ01OYW1lc3BhY2UgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01OYW1lc3BhY2UgZXh0ZW5kcyBDTU5vZGUgewotICAKLS8qKgotICogZ2V0UHJlZml4IG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXRQcmVmaXgoKTsKLS8qKgotICogZ2V0VVJJIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXRVUkkoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkOTVlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTU5vZGUgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Ob2RlIHsgICAgICAgIAotICAKLSAgc3RhdGljIGZpbmFsIGludCBBTllfRUxFTUVOVCAgICAgICAgICAgPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX0RFQ0xBUkFUSU9OID0gMjsKLQlzdGF0aWMgZmluYWwgaW50IERBVEFfVFlQRSAgICAgICAgICAgICA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBET0NVTUVOVCAgICAgICAgICAgICAgPSA0OwotCXN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9ERUNMQVJBVElPTiAgID0gNTsKLQlzdGF0aWMgZmluYWwgaW50IEVOVElUWV9ERUNMQVJBVElPTiAgICA9IDY7Ci0Jc3RhdGljIGZpbmFsIGludCBHUk9VUCAgICAgICAgICAgICAgICAgPSA3OwotICBzdGF0aWMgZmluYWwgaW50IE5BTUVfU1BBQ0UgICAgICAgICAgICA9IDg7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgRE9DVU1FTlRBVElPTiAgICAgICAgID0gOTsKLS8qKgotICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldE5vZGVOYW1lKCk7Ci0vKioKLSAqIGdldE5vZGVUeXBlIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqCi0gKiBSZXR1cm5zIG9uZSBvZiA6Ci0gKgotICovCi1pbnQgZ2V0Tm9kZVR5cGUoKTsKLQotLyoqCi0gKiBzdXBwb3J0cyBtZXRob2QKLSAqIEByZXR1cm4gYm9vbGVhbgotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0gKgotICovCi1ib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0vKioKLSAqIGdldFByb3BlcnR5IG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0gKgotICogUmV0dXJucyB0aGUgb2JqZWN0IHByb3BlcnR5IGRlc2NpcGVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLSAqCi0gKi8KLU9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsgLy90b2RvIHRocm93IHVuc3VwcG9ydGVkIHByb3BlcnR5IGV4Y2VwdGlvbgotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhZGJmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLS8qKgotICogQ01Ob2RlTGlzdCBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDTU5vZGVMaXN0IHsKLSAgCi0vKioKLSAqIGdldExlbmd0aCBtZXRob2QKLSAqIEByZXR1cm4gaW50Ci0gKi8KLWludCBnZXRMZW5ndGgoKTsKLS8qKgotICogaXRlbSBtZXRob2QKLSAqIEByZXR1cm4gQ01Ob2RlCi0gKiBAcGFyYW0gaW5kZXggaW50Ci0gKi8KLUNNTm9kZSBpdGVtKGludCBpbmRleCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29udGVudE1vZGVsTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAyYjE2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29udGVudE1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5LkNNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeS5DTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeS5DTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyOwotCi0KLS8qKgotICogQ29udGVudE1vZGVsTWFuYWdlciBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudE1vZGVsTWFuYWdlciBleHRlbmRzIFBsdWdpbiB7Ci0JLy8gcHJpdmF0ZSBzdGF0aWMgSW5mZXJyZWRHcmFtbWFyRmFjdG9yeSBpbmZlcnJlZEdyYW1tYXJGYWN0b3J5OwotCXByaXZhdGUgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSBjbURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5OwotCXByaXZhdGUgQW5ub3RhdGlvbkZpbGVSZWdpc3RyeSBhbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5OwotCi0JcHJpdmF0ZSBzdGF0aWMgQ29udGVudE1vZGVsTWFuYWdlciBpbnN0YW5jZTsKLQotCXB1YmxpYyBDb250ZW50TW9kZWxNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29udGVudE1vZGVsTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IENvbnRlbnRNb2RlbE1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpLCBTdHJpbmcgcmVzb3VyY2VUeXBlKSB7Ci0JCWlmIChyZXNvdXJjZVR5cGUgPT0gbnVsbCAmJiB1cmkgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc291cmNlVHlwZSA9IHVyaS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJfQotCi0JCWlmIChyZXNvdXJjZVR5cGUgIT0gbnVsbCkgewotCQkJcmVzb3VyY2VUeXBlID0gcmVzb3VyY2VUeXBlLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJQ01Eb2N1bWVudEZhY3RvcnkgZmFjdG9yeSA9IGdldENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkoKS5nZXRGYWN0b3J5KHJlc291cmNlVHlwZSk7Ci0JCXJldHVybiBmYWN0b3J5ICE9IG51bGwgPyBmYWN0b3J5LmNyZWF0ZUNNRG9jdW1lbnQodXJpKSA6IG51bGw7Ci0JfQotCi0KLQlwcml2YXRlIENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkgZ2V0Q01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJaWYgKGNtRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkgPT0gbnVsbCkgewotCQkJY21Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSA9IG5ldyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCQluZXcgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeVJlYWRlcihjbURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5KS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gY21Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeTsKLQl9Ci0KLQotCXB1YmxpYyBMaXN0IGdldEFubm90YXRpb25GaWxlc0luZm9zKFN0cmluZyBwdWJsaWNJZCkgewotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbkZpbGVSZWdpc3RyeSgpLmdldEFubm90YXRpb25GaWxlc0luZm9zKHB1YmxpY0lkKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25GaWxlUmVnaXN0cnkgZ2V0QW5ub3RhdGlvbkZpbGVSZWdpc3RyeSgpIHsKLQkJaWYgKGFubm90YXRpb25GaWxlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJYW5ub3RhdGlvbkZpbGVSZWdpc3RyeSA9IG5ldyBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5KCk7Ci0JCQluZXcgQW5ub3RhdGlvbkZpbGVSZWdpc3RyeVJlYWRlcihhbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5KS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gYW5ub3RhdGlvbkZpbGVSZWdpc3RyeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYTNiMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Fubm90YXRpb24vQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0gICAgICAgICAKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uCi17ICAgICAgIAotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGhhc2h0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgQW5ub3RhdGlvbigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNwZWMoU3RyaW5nIHNwZWMpCi0gIHsKLSAgICBoYXNodGFibGUucHV0KCJzcGVjIiwgc3BlYyk7IC8vJE5PTi1OTFMtMSQKLSAgfSAgICAgCi0KLSAgcHVibGljIFN0cmluZyBnZXRTcGVjKCkKLSAgewotICAgIHJldHVybiAoU3RyaW5nKWhhc2h0YWJsZS5nZXQoInNwZWMiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0gICAgICAKLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaGFzaHRhYmxlLnB1dChuYW1lLCB2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsgICAgIAotICAgIHJldHVybiAoU3RyaW5nKWhhc2h0YWJsZS5nZXQocHJvcGVydHlOYW1lKTsKLSAgfSAgICAKLQotICBwdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVMaXN0KCkKLSAgewotICAgIHJldHVybiBudWxsOyAvLyB0b2RvCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb25NYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb25NYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI5MzAzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb24uQW5ub3RhdGlvbkZpbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmlsZVBhcnNlcjsKLQotCi0vKioKLSAqIEFubm90YXRpb25NYXAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25NYXAgewotCXByb3RlY3RlZCBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JcHJvdGVjdGVkIEhhc2h0YWJsZSBoYXNodGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZTsKLQotCXB1YmxpYyBBbm5vdGF0aW9uTWFwKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhc2VTZW5zaXRpdmUoYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKLQkJdGhpcy5pc0Nhc2VTZW5zaXRpdmUgPSBpc0Nhc2VTZW5zaXRpdmU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJU3RyaW5nIHNwZWMgPSBhbm5vdGF0aW9uLmdldFNwZWMoKTsKLQkJaWYgKHNwZWMgIT0gbnVsbCkgewotCQkJbGlzdC5hZGQoYW5ub3RhdGlvbik7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNwZWMsICJbXXxcdFxuXHJcZiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjbU5vZGVTcGVjID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJYWRkQW5ub3RhdGlvbkZvckNNTm9kZVNwZWMoY21Ob2RlU3BlYywgYW5ub3RhdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uRm9yQ01Ob2RlU3BlYyhTdHJpbmcgY21Ob2RlU3BlYywgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCVN0cmluZyBrZXkgPSBpc0Nhc2VTZW5zaXRpdmUgPyBjbU5vZGVTcGVjIDogY21Ob2RlU3BlYy50b0xvd2VyQ2FzZSgpOwotCQlMaXN0IGxpc3QgPSAoTGlzdCkgaGFzaHRhYmxlLmdldChrZXkpOwotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IFZlY3RvcigpOwotCi0JCQloYXNodGFibGUucHV0KGtleSwgbGlzdCk7Ci0JCX0KLQkJbGlzdC5hZGQoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgY21Ob2RlU3BlYywgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGtleSA9IGlzQ2FzZVNlbnNpdGl2ZSA/IGNtTm9kZVNwZWMgOiBjbU5vZGVTcGVjLnRvTG93ZXJDYXNlKCk7Ci0JCUxpc3QgYW5ub3RhdGlvbkxpc3QgPSAoTGlzdCkgaGFzaHRhYmxlLmdldChrZXkpOwotCQlpZiAoYW5ub3RhdGlvbkxpc3QgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gYW5ub3RhdGlvbkxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEFubm90YXRpb24pIGkubmV4dCgpOwotCQkJCXJlc3VsdCA9IGFubm90YXRpb24uZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShDTU5vZGUgY21Ob2RlLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgY21Ob2RlU3BlYyA9IChTdHJpbmcpIGNtTm9kZS5nZXRQcm9wZXJ0eSgic3BlYyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChjbU5vZGVTcGVjID09IG51bGwpIHsKLQkJCWNtTm9kZVNwZWMgPSBjbU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJfQotCQlpZiAoY21Ob2RlU3BlYyAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRQcm9wZXJ0eShjbU5vZGVTcGVjLCBwcm9wZXJ0eU5hbWUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWQoU3RyaW5nIHVyaSwgU3RyaW5nIGJ1bmRsZUlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQW5ub3RhdGlvbkZpbGVQYXJzZXIgcGFyc2VyID0gbmV3IEFubm90YXRpb25GaWxlUGFyc2VyKCk7Ci0JCUFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbyA9IG5ldyBBbm5vdGF0aW9uRmlsZUluZm8odXJpLCBidW5kbGVJZCk7Ci0JCXBhcnNlci5wYXJzZSh0aGlzLCBmaWxlSW5mbyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNQW55RWxlbWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUFueUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMDBhOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNQW55RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIENNQW55RWxlbWVudEltcGwgZXh0ZW5kcyBDTUNvbnRlbnRJbXBsIGltcGxlbWVudHMgQ01BbnlFbGVtZW50Ci17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlVVJJOyAgCi0KLSAgcHVibGljIENNQW55RWxlbWVudEltcGwoU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgewotICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgIG1pbk9jY3VyID0gLTE7Ci0gIH0gICAgICAgICAgICAgCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU5vZGVOYW1lKFN0cmluZyB1cmkpCi0gIHsKLSAgICByZXR1cm4gdXJpICE9IG51bGwgPyAoImFueSMiICsgdXJpKSA6ICJhbnkiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgfQotCi0gIC8vIGltcGxlbWVudHMgQ01Ob2RlCi0gIC8vCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGNvbXB1dGVOb2RlTmFtZShuYW1lc3BhY2VVUkkpOwotICB9Ci0gCi0gIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIEFOWV9FTEVNRU5UOwotICB9IAotCi0gIC8vIGltcGxlbWVudHMgQ01BbnlFbGVtZW50Ci0gIC8vCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkKLSAgewotICAgIHJldHVybiBuYW1lc3BhY2VVUkk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNTU0YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbgotewotICBwcm90ZWN0ZWQgQ01EYXRhVHlwZSBkYXRhVHlwZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBub2RlTmFtZTsgICAgCi0gIHByb3RlY3RlZCBpbnQgdXNhZ2U7ICAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnQgY21Eb2N1bWVudDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJlZml4UXVhbGlmaWNhdGlvbjsKLSAgcHJvdGVjdGVkIExpc3QgeHNpVHlwZXM7Ci0gICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbChTdHJpbmcgbm9kZU5hbWUsIGludCB1c2FnZSkKLSAgewotICAgIHRoaXMobm9kZU5hbWUsIHVzYWdlLCBuZXcgQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSwgIiIpKTsKLSAgfSAgICAgCi0KLSAgcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsKFN0cmluZyBub2RlTmFtZSwgaW50IHVzYWdlLCBDTURhdGFUeXBlIGRhdGFUeXBlKQotICB7ICAgICAgICAKLSAgICB0aGlzLm5vZGVOYW1lID0gbm9kZU5hbWU7Ci0gICAgdGhpcy51c2FnZSA9IHVzYWdlOwotICAgIHRoaXMuZGF0YVR5cGUgPSBkYXRhVHlwZTsgCi0gIH0gICAgCi0KLSAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTjsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOyAgIAotICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJDTURvY3VtZW50IikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICByZXN1bHQgPSBjbURvY3VtZW50OwotICAgIH0gCi0gICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiWFNJVHlwZXMiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcmVzdWx0ID0geHNpVHlwZXM7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uc1ByZWZpeFF1YWxpZmljYXRpb24iKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJlc3VsdCA9IHByZWZpeFF1YWxpZmljYXRpb24gPyAicXVhbGlmaWVkIiA6ICJ1bnF1YWxpZmllZCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0gIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHJlZml4UXVhbGlmaWNhdGlvbihib29sZWFuIHF1YWxpZmllZCkKLSAgewotICAgIHByZWZpeFF1YWxpZmljYXRpb24gPSBxdWFsaWZpZWQ7Ci0gIH0gICAgICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldFhTSVR5cGVzKExpc3QgbGlzdCkKLSAgewotICAgIHhzaVR5cGVzID0gbGlzdDsKLSAgfQotICAgICAKLSAgcHVibGljIHZvaWQgc2V0Q01Eb2N1bWVudChDTURvY3VtZW50IGNtRG9jdW1lbnQpCi0gIHsKLSAgICB0aGlzLmNtRG9jdW1lbnQgPSBjbURvY3VtZW50OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbm9kZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEF0dHJOYW1lKCkKLSAgewotICAgIHJldHVybiBub2RlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEF0dHJUeXBlKENNRGF0YVR5cGUgZGF0YVR5cGUpCi0gIHsKLSAgICB0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZGF0YVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldFVzYWdlKCkKLSAgewotICAgIHJldHVybiB1c2FnZTsKLSAgfQotICAgICAgICAgICAKLSAgLyoqIEBkZXByZWNhdGVkICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkKLSAgewotICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9ICAgICAgICAgICAgICAgICAKLQotICAvKiogQGRlcHJlY2F0ZWQgKi8KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldEVudW1BdHRyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Db250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1N2VlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Db250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ01Db250ZW50SW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBDTUNvbnRlbnQKLXsKLSAgcHJvdGVjdGVkIGludCBtaW5PY2N1ciA9IDA7Ci0gIHByb3RlY3RlZCBpbnQgbWF4T2NjdXIgPSAtMTsgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gIC8vIGltcGxlbWVudHMgQ01Db250ZW50Ci0gIC8vCi0gIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKQotICB7Ci0gICAgcmV0dXJuIG1heE9jY3VyOwotICB9ICAgICAgICAgIAotIAotICBwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkKLSAgewotICAgIHJldHVybiBtaW5PY2N1cjsKLSAgfSAgCi0gICAgIAotICAvLyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYwotICAvLwotICBwdWJsaWMgdm9pZCBzZXRNYXhPY2N1cihpbnQgbikKLSAgewotICAgIG1heE9jY3VyID0gbjsKLSAgfSAgICAgICAgICAKLSAKLSAgcHVibGljIHZvaWQgc2V0TWluT2NjdXIoaW50IG4pCi0gIHsKLSAgICBtaW5PY2N1ciA9IG47Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01EYXRhVHlwZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTURhdGFUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA0NjI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTURhdGFUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDTURhdGFUeXBlSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBDTURhdGFUeXBlCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgZGF0YVR5cGVOYW1lOwotICBwcm90ZWN0ZWQgU3RyaW5nW10gZW51bWVyYXRlZFZhbHVlczsgICAgIAotICBwcm90ZWN0ZWQgU3RyaW5nIGluc3RhbmNlVmFsdWU7Ci0KLSAgcHVibGljIENNRGF0YVR5cGVJbXBsKFN0cmluZyBkYXRhVHlwZU5hbWUsIFN0cmluZyBpbnN0YW5jZVZhbHVlKQotICB7Ci0gICAgdGhpcy5kYXRhVHlwZU5hbWUgPSBkYXRhVHlwZU5hbWU7Ci0gICAgdGhpcy5pbnN0YW5jZVZhbHVlID0gaW5zdGFuY2VWYWx1ZTsKLSAgICB0aGlzLmVudW1lcmF0ZWRWYWx1ZXMgPSBuZXcgU3RyaW5nWzBdOwotICB9Ci0KLSAgcHVibGljIENNRGF0YVR5cGVJbXBsKFN0cmluZyBkYXRhVHlwZU5hbWUsIFN0cmluZ1tdIGVudW1lcmF0ZWRWYWx1ZXMpCi0gIHsKLSAgICB0aGlzLmRhdGFUeXBlTmFtZSA9IGRhdGFUeXBlTmFtZTsKLSAgICB0aGlzLmVudW1lcmF0ZWRWYWx1ZXMgPSBlbnVtZXJhdGVkVmFsdWVzOyAgIAotICAgIHRoaXMuaW5zdGFuY2VWYWx1ZSA9IGVudW1lcmF0ZWRWYWx1ZXNbMF07Ci0gIH0KLQotCi0gIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIENNTm9kZS5EQVRBX1RZUEU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgewotICAgIHJldHVybiBnZXREYXRhVHlwZU5hbWUoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKCkKLSAgewotICAgIHJldHVybiBkYXRhVHlwZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEltcGxpZWRWYWx1ZUtpbmQoKQotICB7Ci0gICAgcmV0dXJuIElNUExJRURfVkFMVUVfTk9ORTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW1wbGllZFZhbHVlKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEVudW1lcmF0ZWRWYWx1ZXMoKQotICB7Ci0gICAgcmV0dXJuIGVudW1lcmF0ZWRWYWx1ZXM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSW5zdGFuY2VWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gaW5zdGFuY2VWYWx1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRG9jdW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Eb2N1bWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M3NmE4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Eb2N1bWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLQotCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudAotewotICBwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLSAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBlbGVtZW50cyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBsb2NhbEVsZW1lbnRQb29sOwotICBwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGFueUVsZW1lbnRzOwotCi0gIHB1YmxpYyBDTURvY3VtZW50SW1wbChTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0gICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgewotICAgIHJldHVybiBET0NVTUVOVDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0KLSAKLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJlc3VsdCA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB9ICAgICAgICAgICAgICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudHM7Ci0gIH0KLQotICBwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsIGdldEFueUVsZW1lbnRzKCkKLSAgeyAKLSAgICBpZiAoYW55RWxlbWVudHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBhbnlFbGVtZW50cyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFueUVsZW1lbnRzOwotICB9Ci0gIAotICBwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsIGdldExvY2FsRWxlbWVudFBvb2woKQotICB7IAotICAgIGlmIChsb2NhbEVsZW1lbnRQb29sID09IG51bGwpCi0gICAgewotICAgICAgbG9jYWxFbGVtZW50UG9vbCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICB9ICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gbG9jYWxFbGVtZW50UG9vbDsKLSAgfQotCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpCi0gIHsKLSAgICByZXR1cm4gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICB9Ci0KLSAgcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRWxlbWVudERlY2xhcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRWxlbWVudERlY2xhcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODc5YjlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUVsZW1lbnREZWNsYXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwgZXh0ZW5kcyBDTUNvbnRlbnRJbXBsIGltcGxlbWVudHMgQ01FbGVtZW50RGVjbGFyYXRpb24KLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOyAgICAgICAgICAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnQgY21Eb2N1bWVudDsKLSAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBhdHRyaWJ1dGVNYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gIHByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgbG9jYWxFbGVtZW50TWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICBwcm90ZWN0ZWQgQ01Db250ZW50IGNvbnRlbnQ7Ci0gIHByb3RlY3RlZCBDTURhdGFUeXBlIGRhdGFUeXBlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xvY2FsOwotCi0gIHB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwoQ01Eb2N1bWVudCBjbURvY3VtZW50LCBTdHJpbmcgbmFtZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuY21Eb2N1bWVudCA9IGNtRG9jdW1lbnQ7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfSAgICAgCi0KLSAgLy8gaW1wbGVtZW50cyBDTU5vZGUKLSAgLy8KLSAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotIAotICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgewotICAgIHJldHVybiBFTEVNRU5UX0RFQ0xBUkFUSU9OOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7IAotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOyAgICAgICAgICAgICAgIAotICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvbnNQcmVmaXhRdWFsaWZpY2F0aW9uIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICByZXN1bHQgPSBpc0xvY2FsID8gInVucXVhbGlmaWVkIiA6ICJxdWFsaWZpZWQiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9ICAgIAotICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIkNNRG9jdW1lbnQiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJlc3VsdCA9IGNtRG9jdW1lbnQ7ICAgICAgIAotICAgIH0gICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgICAgICAgICAgICAgICAKLSAgLy8gaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbgotICAvLwotICBwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpCi0gIHsKLSAgICByZXR1cm4gYXR0cmlidXRlTWFwOwotICB9ICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkKLSAgewotICAgIHJldHVybiBjb250ZW50OwotICB9Ci0KLSAgcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gTUlYRUQ7Ci0gIH0gICAgICAgICAgICAKLQotICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKQotICB7IAotICAgIHJldHVybiBkYXRhVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRMb2NhbEVsZW1lbnRzKCkKLSAgeyAKLSAgICByZXR1cm4gbG9jYWxFbGVtZW50TWFwOwotICB9IAotICAgIAotICAvLwotICAvLwotICBwdWJsaWMgdm9pZCBzZXRDb250ZW50KENNQ29udGVudCBjbUNvbnRlbnQpCi0gIHsKLSAgICBjb250ZW50ID0gY21Db250ZW50OwotICB9ICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBzZXREYXRhVHlwZShDTURhdGFUeXBlIGNtRGF0YVR5cGUpCi0gIHsKLSAgICBkYXRhVHlwZSA9IGNtRGF0YVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsIGdldEF0dHJpYnV0ZU1hcCgpCi0gIHsKLSAgICByZXR1cm4gYXR0cmlidXRlTWFwOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TG9jYWwoYm9vbGVhbiBpc0xvY2FsKQotICB7Ci0gICAgdGhpcy5pc0xvY2FsID0gaXNMb2NhbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRW50aXR5RGVjbGFyYXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkOTdmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVudGl0eURlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgQ01FbnRpdHlEZWNsYXJhdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOwotCi0gIHB1YmxpYyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgewotICAgIHJldHVybiBFTlRJVFlfREVDTEFSQVRJT047Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0gCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci19ICAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Hcm91cEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUdyb3VwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWM0ZWNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUdyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgQ01Hcm91cEltcGwgZXh0ZW5kcyBDTUNvbnRlbnRJbXBsIGltcGxlbWVudHMgQ01Hcm91cAotewotICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBub2RlTGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBpbnQgb3BlcmF0b3I7ICAKLQotICBwdWJsaWMgQ01Hcm91cEltcGwoQ01Ob2RlTGlzdCBub2RlTGlzdCwgaW50IG9wZXJhdG9yKQotICB7Ci0gICAgdGhpcy5ub2RlTGlzdCA9IG5vZGVMaXN0OwotICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIEdST1VQOwotICB9Ci0gCi0gIHB1YmxpYyBDTU5vZGVMaXN0IGdldENoaWxkTm9kZXMoKQotICB7Ci0gICAgcmV0dXJuIG5vZGVMaXN0OwotICB9Ci0KLSAgcHVibGljIGludCBnZXRPcGVyYXRvcigpCi0gIHsKLSAgICByZXR1cm4gb3BlcmF0b3I7Ci0gIH0gCi19ICAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZTYzZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBDTU5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCAKLXsKLSAgcHVibGljIHN0YXRpYyBDTU5hbWVkTm9kZU1hcEltcGwgRU1QVFlfTkFNRURfTk9ERV9NQVAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gIHByb3RlY3RlZCBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgLyoqCi0gICAqIENNTmFtZWROb2RlTWFwSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotICAgKi8KLSAgcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCgpCi0gIHsKLSAgCXN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsKENNTmFtZWROb2RlTWFwIGluaXRpYWxDb250ZW50c01hcCkgewotCQlzdXBlcigpOwotCQlpZiAoaW5pdGlhbENvbnRlbnRzTWFwICE9IG51bGwpIHsKLQkJCWludCBsZW5ndGggPSBpbml0aWFsQ29udGVudHNNYXAuZ2V0TGVuZ3RoKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7Ci0JCQkJcHV0KGluaXRpYWxDb250ZW50c01hcC5pdGVtKGopKTsKLQkJCX0KLQkJfQotCX0KLSAgLyoqCi0gICAqIGdldExlbmd0aCBtZXRob2QKLSAgICogQHJldHVybiBpbnQKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkKLSAgewotICAJcmV0dXJuIHRhYmxlLnNpemUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0gICAqIEByZXR1cm4gQ01Ob2RlCi0gICAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAgICovCi0gIHB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKQotICB7Ci0gIAlyZXR1cm4gKENNTm9kZSl0YWJsZS5nZXQobmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogaXRlbSBtZXRob2QKLSAgICogQHJldHVybiBDTU5vZGUKLSAgICogQHBhcmFtIGluZGV4IGludAotICAgKi8KLSAgcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkKLSAgewotICAgIENNTm9kZSByZXN1bHQgPSBudWxsOwotICAgIGludCBzaXplID0gdGFibGUuc2l6ZSgpOwotICAgIGlmIChpbmRleCA8IHNpemUpCi0gICAgewotICAgICAgRW51bWVyYXRpb24gdmFsdWVzID0gdGFibGUuZWxlbWVudHMoKTsKLSAgICAgIGZvcihpbnQgaSA9IDA7IGkgPD0gaW5kZXg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKENNTm9kZSl2YWx1ZXMubmV4dEVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHVibGljIEhhc2h0YWJsZSBnZXRIYXNodGFibGUoKQotICB7Ci0gICAgICAgICAgcmV0dXJuIHRhYmxlOwotICB9Ci0gIAotICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKQotICB7Ci0gICAgICAgICAgcmV0dXJuIHRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gIH0gICAgICAgIAotICAKLSAgcHVibGljIHZvaWQgcHV0KENNTm9kZSBjbU5vZGUpCi0gIHsKLSAgICB0YWJsZS5wdXQoY21Ob2RlLmdldE5vZGVOYW1lKCksIGNtTm9kZSk7Ci0gIH0KLX0KLSAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Ob2RlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyZTJhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Ob2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIENNTm9kZQoteyAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0luZmVycmVkID0gZmFsc2U7Ci0gICAKLSAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgfQotIAotICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IAotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgeyAgICAgICAgICAgICAgCi0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKCJpc0luZmVycmVkIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJlc3VsdCA9IGlzSW5mZXJyZWQgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldEluZmVycmVkKGJvb2xlYW4gaXNJbmZlcnJlZCkKLSAgewotICAgIHRoaXMuaXNJbmZlcnJlZCA9IGlzSW5mZXJyZWQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTU5vZGVMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNTm9kZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiY2JhMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgQ01Ob2RlTGlzdEltcGwgaW1wbGVtZW50cyBDTU5vZGVMaXN0IAotewotICBwdWJsaWMgc3RhdGljIENNTm9kZUxpc3RJbXBsIEVNUFRZX05PREVfTElTVCA9IG5ldyBDTU5vZGVMaXN0SW1wbChDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLSAgcHJvdGVjdGVkIExpc3QgbGlzdDsKLQotICBwdWJsaWMgQ01Ob2RlTGlzdEltcGwoKQotICB7Ci0gICAgdGhpcyhuZXcgVmVjdG9yKCkpOwotICB9Ci0KLSAgcHVibGljIENNTm9kZUxpc3RJbXBsKExpc3QgbGlzdCkKLSAgewotICAgIHRoaXMubGlzdCA9IGxpc3Q7Ci0gIH0KLQotICAvKioKLSAgICogZ2V0TGVuZ3RoIG1ldGhvZAotICAgKiBAcmV0dXJuIGludAotICAgKi8KLSAgcHVibGljIGludCBnZXRMZW5ndGgoKQotICB7Ci0gICAgcmV0dXJuIGxpc3Quc2l6ZSgpOwotICB9Ci0gIC8qKgotICAgKiBpdGVtIG1ldGhvZAotICAgKiBAcmV0dXJuIENNTm9kZQotICAgKiBAcGFyYW0gaW5kZXggaW50Ci0gICAqLwotICBwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KQotICB7Ci0gICAgcmV0dXJuIChDTU5vZGUpbGlzdC5nZXQoaW5kZXgpOwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRMaXN0KCkKLSAgewotICAgIHJldHVybiBsaXN0OwotICB9Ci0gIAotICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKQotICB7Ci0gICAgcmV0dXJuIGxpc3QuaXRlcmF0b3IoKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIHJldHVybiBsaXN0LmNvbnRhaW5zKGNtTm9kZSk7Ci0gIH0gCi0gIAotICBwdWJsaWMgdm9pZCBhZGQoQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIGxpc3QuYWRkKGNtTm9kZSk7Ci0gIH0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvZmFjdG9yeS9DTURvY3VtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0YmU5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvZmFjdG9yeS9DTURvY3VtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotLy8gdGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBidWlsZCBhIGdyYW1tYXIgZG9jdW1lbnQgZ2l2ZW4gYSBsb2NhbCBmaWxlIG5hbWUKLS8vCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRGYWN0b3J5Ci17ICAgCi0gIHB1YmxpYyBDTURvY3VtZW50IGNyZWF0ZUNNRG9jdW1lbnQoU3RyaW5nIHVyaSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvZmFjdG9yeS9DTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzM3YjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yCi17Ci0gIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZFbGVtZW50OwotICBwcml2YXRlIENNRG9jdW1lbnRGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgcHVibGljIENNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHRoaXMuZkVsZW1lbnQgPSBlbGVtZW50OwotICB9Ci0KLSAgcHVibGljIENNRG9jdW1lbnRGYWN0b3J5IGdldEZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZmFjdG9yeSA9IChDTURvY3VtZW50RmFjdG9yeSkgZkVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gbG9hZGluZyBDTURvY3VtZW50RmFjdG9yeSIsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhY3Rvcnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY0MDNiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvZmFjdG9yeS9DTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5IAotewotCXByb3RlY3RlZCBzdGF0aWMgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSBpbnN0YW5jZTsKLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9SRVNPVVJDRV9UWVBFID0gIioiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgTWFwIHJlc291cmNlVHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcm90ZWN0ZWQgVmVjdG9yIGRvY3VtZW50QnVpbGRlckxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwdXRGYWN0b3J5KFN0cmluZyByZXNvdXJjZVR5cGUsIENNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvciBmYWN0b3J5RGVzY3JpcHRvcikgewotCQlyZXNvdXJjZVR5cGVNYXAucHV0KHJlc291cmNlVHlwZSwgZmFjdG9yeURlc2NyaXB0b3IpOwotCX0KLQotCXB1YmxpYyBDTURvY3VtZW50RmFjdG9yeSBnZXRGYWN0b3J5KFN0cmluZyByZXNvdXJjZVR5cGUpIHsKLQkJQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yIGZhY3RvcnlEZXNjcmlwdG9yID0gbnVsbDsKLQkJaWYgKHJlc291cmNlVHlwZSAhPSBudWxsKSB7Ci0JCQlmYWN0b3J5RGVzY3JpcHRvciA9IChDTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IpIHJlc291cmNlVHlwZU1hcC5nZXQocmVzb3VyY2VUeXBlKTsKLQkJfQotCQlpZiAoZmFjdG9yeURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJLy8gKGRtdykgaXNzdWU6IGEgZGVmYXVsdCB0eXBlIG9mICcqJyBtZWFucyB3aGF0PyByZWdpc3RlcmVkIGFzCi0JCQkvLyAnKicgaXMgdGhlIHdheSB0aGlzIHdvcmtzIG5vdy4gaXMgdGhhdCB0aGUgaW50ZW50PyBPciBzaG91bGQgaXQKLQkJCS8vIG1lYW4gcmVnaXN0ZXJlZCBhcyBhbnkgb3RoZXIgdHlwZT8KLQkJCWZhY3RvcnlEZXNjcmlwdG9yID0gKENNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvcikgcmVzb3VyY2VUeXBlTWFwLmdldChERUZBVUxUX1JFU09VUkNFX1RZUEUpOwotCQl9Ci0JCXJldHVybiBmYWN0b3J5RGVzY3JpcHRvciAhPSBudWxsID8gZmFjdG9yeURlc2NyaXB0b3IuZ2V0RmFjdG9yeSgpIDogbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvZmFjdG9yeS9DTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvZmFjdG9yeS9DTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOGIxOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLQotCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiZG9jdW1lbnRGYWN0b3JpZXMiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gImZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RZUEUgPSAidHlwZSI7ICAgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgU3RyaW5nIHBsdWdpbklkLCBleHRlbnNpb25Qb2ludElkOwotICAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnk7Ci0gIAotICBwdWJsaWMgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeVJlYWRlcihDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KQotICB7Ci0gIAl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKQotICB7Ci0gICAgU3RyaW5nIGJ1bmRsZWlkID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KGJ1bmRsZWlkLCBFWFRFTlNJT05fUE9JTlRfSUQpOwotICAgIGlmIChwb2ludCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgZmFjdG9yeUNsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLSAgICAgIFN0cmluZyBmaWxlbmFtZUV4dGVuc2lvbnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVFlQRSk7Ci0gICAgICBpZiAoZmFjdG9yeUNsYXNzICE9IG51bGwgJiYgZmlsZW5hbWVFeHRlbnNpb25zICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yKGVsZW1lbnQpOwotICAgICAgICAgIGZvciAoU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihmaWxlbmFtZUV4dGVuc2lvbnMsICIsIik7IHN0Lmhhc01vcmVUb2tlbnMoKTsgKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgewotICAgICAgICAgIAlTdHJpbmcgdG9rZW4gPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlyZWdpc3RyeS5wdXRGYWN0b3J5KHRva2VuLCBkZXNjcmlwdG9yKTsJCi0gICAgICAgICAgfSAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vQW5ub3RhdGlvbkZpbGVJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlhMzcyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb247Ci0KLS8qKgotICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYW5ub3RhdGlvbiBmaWxlcwotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkZpbGVJbmZvIHsKLQlwcml2YXRlIFN0cmluZyBmQW5ub3RhdGlvbkZpbGVMb2NhdGlvbjsKLQlwcml2YXRlIFN0cmluZyBmQnVuZGxlSWQ7Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbkZpbGVJbmZvKFN0cmluZyBhbm5vdGF0aW9uRmlsZUxvY2F0aW9uLCBTdHJpbmcgYnVuZGxlSWQpIHsKLQkJZkFubm90YXRpb25GaWxlTG9jYXRpb24gPSBhbm5vdGF0aW9uRmlsZUxvY2F0aW9uOwotCQlmQnVuZGxlSWQgPSBidW5kbGVJZDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBhbm5vdGF0aW9uIGZpbGUgYXMgb3JpZ2luYWxseSBzcGVjaWZpZWQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25GaWxlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBmQW5ub3RhdGlvbkZpbGVMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGJ1bmRsZSBpZCB3aGVyZSB0aGUgYW5ub3RhdGlvbiBmaWxlIGlzIGxvY2F0ZWQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJ1bmRsZUlkKCkgewotCQlyZXR1cm4gZkJ1bmRsZUlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDE5MTVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnR5UmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25NYXA7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkZpbGVQYXJzZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JRF9BTk5PVEFUSU9OUyA9ICJhYnN0cmFjdEdyYW1tYXJBbm5vdGF0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfSURfQU5OT1RBVElPTiA9ICJhbm5vdGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JRF9QUk9QRVJUWSA9ICJwcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBwYXJzZSBhbiBhbm5vdGF0aW9uIGZpbGUgYW5kIHN0b3JlIHRoZQotCSAqIGNvbnRlbnRzIGludG8gYW4gYW5ub3RhdGlvbk1hcAotCSAqLwotCXByaXZhdGUgdm9pZCBwYXJzZShBbm5vdGF0aW9uTWFwIGFubm90YXRpb25NYXAsIElucHV0U3RyZWFtIGlucHV0LCBBbm5vdGF0aW9uRmlsZUluZm8gZmlsZUluZm8pIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBtb3ZlIHRvIFhlcmNlcy0yLi4uLiBhZGQgJ2NvbnRleHRDbGFzc0xvYWRlcicgc3R1ZmYKLQkJQ2xhc3NMb2FkZXIgcHJldkNsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQkJdHJ5IHsKLQkJCVNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCWZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCQlTQVhQYXJzZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkJCXBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW5wdXQpLCBuZXcgQW5ub3RhdGlvbk1hcENvbnRlbnRIYW5kbGVyKGFubm90YXRpb25NYXAsIGZpbGVJbmZvKSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihwcmV2Q2xhc3NMb2FkZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHBhcnNlIGFuIGFubm90YXRpb24gZmlsZSBhbmQgc3RvcmUgdGhlCi0JICogY29udGVudHMgaW50byBhbiBhbm5vdGF0aW9uTWFwCi0JICovCi0JcHVibGljIHZvaWQgcGFyc2UoQW5ub3RhdGlvbk1hcCBtYXAsIEFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBQbGF0Zm9ybS5maW5kKFBsYXRmb3JtLmdldEJ1bmRsZShmaWxlSW5mby5nZXRCdW5kbGVJZCgpKSwgUGF0aC5mcm9tT1NTdHJpbmcoZmlsZUluZm8uZ2V0QW5ub3RhdGlvbkZpbGVMb2NhdGlvbigpKSk7Ci0JCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQlpbnB1dFN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQkJcGFyc2UobWFwLCBpbnB1dFN0cmVhbSwgZmlsZUluZm8pOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJdGhyb3cgKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgQW5ub3RhdGlvbk1hcENvbnRlbnRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCQlwcml2YXRlIEFubm90YXRpb25NYXAgYW5ub3RhdGlvbk1hcDsKLQkJcHJpdmF0ZSBBbm5vdGF0aW9uIGN1cnJlbnRBbm5vdGF0aW9uOwotCQlwcml2YXRlIFN0cmluZyBjdXJyZW50UHJvcGVydHlOYW1lOwotCQlwcml2YXRlIFN0cmluZ0J1ZmZlciBwcm9wZXJ0eVZhbHVlQnVmZmVyOwotCQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQlwcml2YXRlIEFubm90YXRpb25GaWxlSW5mbyBmRmlsZUluZm87Ci0KLQkJcHVibGljIEFubm90YXRpb25NYXBDb250ZW50SGFuZGxlcihBbm5vdGF0aW9uTWFwIGFubm90YXRpb25NYXAsIEFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbykgewotCQkJdGhpcy5hbm5vdGF0aW9uTWFwID0gYW5ub3RhdGlvbk1hcDsKLQkJCXRoaXMuZkZpbGVJbmZvID0gZmlsZUluZm87Ci0JCX0KLQotCQlwcml2YXRlIFVSTCBnZW5lcmF0ZVByb3BlcnRpZXNGaWxlVVJMKEFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbywgU3RyaW5nIHByb3BlcnRpZXNMb2NhdGlvbikgewotCQkJVVJMIHByb3BlcnRpZXNVUkwgPSBudWxsOwotCi0JCQkvLyBwcmVwZW5kICRubCQgdmFyaWFibGUgdG8gbG9jYXRpb24KLQkJCUlQYXRoIGFubm90YXRpb25QYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcoIiRubCQvIiArIGZpbGVJbmZvLmdldEFubm90YXRpb25GaWxlTG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHJlbW92ZSB0aGUgYW5ub3RhdGlvbi54bWwgZmlsZQotCQkJSVBhdGggYW5ub3RhdGlvbkZvbGRlciA9IGFubm90YXRpb25QYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJCS8vIGFwcGVuZCBsb2NhdGlvbiBvZiBwcm9wZXJ0aWxlcyBmaWxlCi0JCQlJUGF0aCBwcm9wZXJ0aWVzRmlsZSA9IGFubm90YXRpb25Gb2xkZXIuYXBwZW5kKHByb3BlcnRpZXNMb2NhdGlvbik7Ci0JCQkvLyBhcHBlbmQgLnByb3BlcnRpZXMgZXh0ZW5zaW9uIGlmIG5lZWRlZAotCQkJaWYgKHByb3BlcnRpZXNGaWxlLmdldEZpbGVFeHRlbnNpb24oKSA9PSBudWxsKQotCQkJCXByb3BlcnRpZXNGaWxlID0gcHJvcGVydGllc0ZpbGUuYWRkRmlsZUV4dGVuc2lvbigicHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBjcmVhdGUgYSBVUkwgb3V0IG9mIHRoZSBwcm9wZXJ0aWVzIGZpbGUgbG9jYXRpb24KLQkJCXByb3BlcnRpZXNVUkwgPSBQbGF0Zm9ybS5maW5kKFBsYXRmb3JtLmdldEJ1bmRsZShmaWxlSW5mby5nZXRCdW5kbGVJZCgpKSwgcHJvcGVydGllc0ZpbGUpOwotCQkJcmV0dXJuIHByb3BlcnRpZXNVUkw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJcHJvcGVydHlWYWx1ZUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWlmIChsb2NhbE5hbWUuZXF1YWxzKFRBR19JRF9BTk5PVEFUSU9OUykpIHsKLQkJCQlpbnQgYXR0cmlidXRlc0xlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzTGVuZ3RoOyBpKyspIHsKLQkJCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVzLmdldExvY2FsTmFtZShpKTsKLQkJCQkJU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLQkJCQkJaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKCJwcm9wZXJ0aWVzTG9jYXRpb24iKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl7Ci0JCQkJCQlVUkwgYnVuZGxlVVJMID0gZ2VuZXJhdGVQcm9wZXJ0aWVzRmlsZVVSTChmRmlsZUluZm8sIGF0dHJpYnV0ZVZhbHVlKTsKLQkJCQkJCWlmIChidW5kbGVVUkwgIT0gbnVsbCkgewotCQkJCQkJCUlucHV0U3RyZWFtIGJ1bmRsZVN0cmVhbSA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJYnVuZGxlU3RyZWFtID0gYnVuZGxlVVJMLm9wZW5TdHJlYW0oKTsKLQkJCQkJCQkJcmVzb3VyY2VCdW5kbGUgPSBuZXcgUHJvcGVydHlSZXNvdXJjZUJ1bmRsZShidW5kbGVTdHJlYW0pOwotCQkJCQkJCX0KLQkJCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJaWYgKGJ1bmRsZVN0cmVhbSAhPSBudWxsKQotCQkJCQkJCQkJCWJ1bmRsZVN0cmVhbS5jbG9zZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCB4LmdldE1lc3NhZ2UoKSwgeCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoImNhc2VTZW5zaXRpdmUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl7Ci0JCQkJCQlpZiAoYXR0cmlidXRlVmFsdWUudHJpbSgpLmVxdWFscygiZmFsc2UiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJewotCQkJCQkJCWFubm90YXRpb25NYXAuc2V0Q2FzZVNlbnNpdGl2ZShmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFRBR19JRF9BTk5PVEFUSU9OKSkgewotCQkJCWN1cnJlbnRBbm5vdGF0aW9uID0gbnVsbDsKLQkJCQlTdHJpbmcgc3BlY1ZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgic3BlYyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHNwZWNWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCWN1cnJlbnRBbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb24oKTsKLQkJCQkJY3VycmVudEFubm90YXRpb24uc2V0U3BlYyhzcGVjVmFsdWUpOwotCQkJCX0KLQkJCQlhbm5vdGF0aW9uTWFwLmFkZEFubm90YXRpb24oY3VycmVudEFubm90YXRpb24pOwotCQkJfQotCQkJZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhUQUdfSURfUFJPUEVSVFkpKSB7Ci0JCQkJaWYgKGN1cnJlbnRBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQkJY3VycmVudFByb3BlcnR5TmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCWlmIChjdXJyZW50UHJvcGVydHlOYW1lICE9IG51bGwgJiYgY3VycmVudEFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCVN0cmluZyBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZUJ1ZmZlci50b1N0cmluZygpOwotCQkJCWlmIChwcm9wZXJ0eVZhbHVlICE9IG51bGwpIHsKLQkJCQkJaWYgKHByb3BlcnR5VmFsdWUuc3RhcnRzV2l0aCgiJSIpICYmIHJlc291cmNlQnVuZGxlICE9IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwcm9wZXJ0eVZhbHVlID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKHByb3BlcnR5VmFsdWUuc3Vic3RyaW5nKDEpKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIGlnbm9yZSBhbnkgZXhjZXB0aW9uIHRoYXQgb2NjdXJzIHdoaWxlIHRyeWluZwotCQkJCQkJCS8vIHRvIGZldGNoIGEgcmVzb3VyY2UKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljdXJyZW50QW5ub3RhdGlvbi5zZXRQcm9wZXJ0eShjdXJyZW50UHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChsb2NhbE5hbWUuZXF1YWxzKFRBR19JRF9BTk5PVEFUSU9OKSkgewotCQkJCWN1cnJlbnRBbm5vdGF0aW9uID0gbnVsbDsKLQkJCX0KLQkJCWVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoVEFHX0lEX1BST1BFUlRZKSkgewotCQkJCWN1cnJlbnRQcm9wZXJ0eU5hbWUgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQkJaWYgKGN1cnJlbnRQcm9wZXJ0eU5hbWUgIT0gbnVsbCAmJiBjdXJyZW50QW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJcHJvcGVydHlWYWx1ZUJ1ZmZlci5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vQW5ub3RhdGlvbkZpbGVSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vQW5ub3RhdGlvbkZpbGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODk5MWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGFzc29jaWF0ZSBvbmUgb3IgbW9yZSBhbm5vdGF0aW9uIGZpbGVzIHdpdGggYSBncmFtbWFyCi0gKiBmaWxlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5IHsKLQlwcml2YXRlIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIEFubm90YXRpb25GaWxlUmVnaXN0cnkoKSB7Ci0JCW5ldyBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyKHRoaXMpLnJlYWRSZWdpc3RyeSgpOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIExpc3QgZ2V0QW5ub3RhdGlvbkZpbGVzSW5mb3MoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCUxpc3QgdGhlTGlzdCA9IChMaXN0KSBtYXAuZ2V0KHB1YmxpY0lkKTsKLQkJcmV0dXJuIHRoZUxpc3QgIT0gbnVsbCA/IHRoZUxpc3QgOiBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCQkKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQW5ub3RhdGlvbkZpbGUoU3RyaW5nIHB1YmxpY0lkLCBBbm5vdGF0aW9uRmlsZUluZm8gZmlsZUluZm8pIHsKLQkJTGlzdCBmaWxlSW5mb3MgPSAoTGlzdCkgbWFwLmdldChwdWJsaWNJZCk7Ci0JCWlmIChmaWxlSW5mb3MgPT0gbnVsbCkgewotCQkJZmlsZUluZm9zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbWFwLnB1dChwdWJsaWNJZCwgZmlsZUluZm9zKTsKLQkJfQotCQlmaWxlSW5mb3MuYWRkKGZpbGVJbmZvKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbkZpbGUoU3RyaW5nIHB1YmxpY0lkLCBBbm5vdGF0aW9uRmlsZUluZm8gZmlsZUluZm8pIHsKLQkJTGlzdCBmaWxlSW5mb3MgPSAoTGlzdCkgbWFwLmdldChwdWJsaWNJZCk7Ci0JCWlmIChmaWxlSW5mb3MgIT0gbnVsbCkgewotCQkJZmlsZUluZm9zLnJlbW92ZShmaWxlSW5mbyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjN2M0MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vQW5ub3RhdGlvbkZpbGVSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyB0aGUgcGx1Z2luIG1hbmlmZXN0cyBhbmQgYWRkcyBlYWNoIHNwZWNpZmllZCBncmFtYW1yCi0gKiBhbm5vdGF0aW9uIGZpbGUgd2l0aCB0aGUgQW5ub3RhdGlvblByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiYW5ub3RhdGlvbkZpbGVzIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gImFubm90YXRpb25GaWxlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QVUJMSUNfSUQgPSAicHVibGljSWQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0xPQ0FUSU9OID0gImxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5IGFubm90YXRpb25GaWxlUmVnaXN0cnk7Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbkZpbGVSZWdpc3RyeVJlYWRlcihBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5IGFubm90YXRpb25GaWxlUmVnaXN0cnkpIHsKLQkJdGhpcy5hbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5ID0gYW5ub3RhdGlvbkZpbGVSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiByZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGFuZCBwYXJzZSBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KHBsdWdpbklkLCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZWFkRWxlbWVudCgpIC0gcGFyc2UgYW5kIGRlYWwgd2l0aCBhbiBleHRlbnNpb24gbGlrZToKLQkgKiAKLQkgKiA8ZXh0ZW5zaW9uCi0JICogcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbF9pbXBsZW1lbnRhdGlvbiI+Ci0JICogPHV0aWxfaW1wbGVtZW50YXRpb24gY2xhc3MgPQotCSAqIGNvcmcuZWNsaXBzZS53c3QuYmFzZXV0aWwuQ01VdGlsSW1wbGVtZW50YXRpb25JbXBsIC8+IDwvZXh0ZW5zaW9uPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKSB7Ci0JCQlTdHJpbmcgcHVibGljSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFVCTElDX0lEKTsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9MT0NBVElPTik7Ci0JCQlpZiAocHVibGljSWQgIT0gbnVsbCAmJiBsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIGJ1bmRsZUlkID0gZWxlbWVudC5nZXROYW1lc3BhY2UoKTsKLQkJCQkJQW5ub3RhdGlvbkZpbGVJbmZvIGZpbGVJbmZvID0gbmV3IEFubm90YXRpb25GaWxlSW5mbyhsb2NhdGlvbiwgYnVuZGxlSWQpOwotCQkJCQlhbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5LmFkZEFubm90YXRpb25GaWxlKHB1YmxpY0lkLCBmaWxlSW5mbyk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJwcm9ibGVtIGFkZGluZyBhbm5vdGF0aW9uIGZpbGUgIiArIGxvY2F0aW9uLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25VdGlsaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjEwODhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25VdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Db250ZW50TW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWFwOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVXRpbGl0eSB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWRBbm5vdGF0aW9uc0ZvckdyYW1tYXIoU3RyaW5nIHB1YmxpY0lkLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpIHsKLQkJTGlzdCBhbm5vdGF0aW9uRmlsZXMgPSBDb250ZW50TW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbkZpbGVzSW5mb3MocHVibGljSWQpOwotCQlBbm5vdGF0aW9uTWFwIG1hcCA9IChBbm5vdGF0aW9uTWFwKSBjbURvY3VtZW50LmdldFByb3BlcnR5KCJhbm5vdGF0aW9uTWFwIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBhbm5vdGF0aW9uRmlsZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJQW5ub3RhdGlvbkZpbGVJbmZvIGFubm90YXRpb25GaWxlSW5mbyA9IChBbm5vdGF0aW9uRmlsZUluZm8pIGkubmV4dCgpOwotCQkJCQlBbm5vdGF0aW9uRmlsZVBhcnNlciBwYXJzZXIgPSBuZXcgQW5ub3RhdGlvbkZpbGVQYXJzZXIoKTsKLQkJCQkJcGFyc2VyLnBhcnNlKG1hcCwgYW5ub3RhdGlvbkZpbGVJbmZvKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vUmVzb3VyY2VCdW5kbGVIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL1Jlc291cmNlQnVuZGxlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZWViYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vUmVzb3VyY2VCdW5kbGVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLQotcHVibGljIGNsYXNzIFJlc291cmNlQnVuZGxlSGVscGVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoU3RyaW5nIHJlc291cmNlVVJJLCBMb2NhbGUgdGFyZ2V0TG9jYWxlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLQkgIC8vIHRyeSB0byBsb2FkIGJ1bmRsZSBmcm9tIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gdGhlIHJlc291cmNlVVJJCi0gICAgLy8gd2UgbWFrZSB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSByZXNvdXJjZVVSSSBwb2ludHMgdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtCi0gICAgICAgICAKLSAgICBpbnQgaW5kZXggPSByZXNvdXJjZVVSSS5sYXN0SW5kZXhPZigiLyIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGluZGV4ID09IC0xKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgcmVzb3VyY2VVUkkiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAvLyBCZWxvdyB3ZSBzZXQgJ3Jlc291cmNlRGlyZWN0b3J5JyBzbyB0aGF0IGl0IGVuZHMgd2l0aCBhICcvJy4KLSAgICAvLyBIZXJlJ3MgYW4gZXhjZXJwdCBmcm9tIHRoZSBDbGFzc0xvYWRlciBKYXZhZG9jIC4uLgotICAgIC8vIEFueSBVUkwgdGhhdCBlbmRzIHdpdGggYSAnLycgaXMgYXNzdW1lZCB0byByZWZlciB0byBhIGRpcmVjdG9yeS4gT3RoZXJ3aXNlLCB0aGUgVVJMIGlzIGFzc3VtZWQKLSAgICAvLyB0byByZWZlciB0byBhIEpBUiBmaWxlIHdoaWNoIHdpbGwgYmUgb3BlbmVkIGFzIG5lZWRlZC4gCi0gICAgLy8KLSAgICBTdHJpbmcgcmVzb3VyY2VEaXJlY3RvcnkgPSByZXNvdXJjZVVSSS5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTsKLSAgICBTdHJpbmcgcmVzb3VyY2VCdW5kbGVOYW1lID0gcmVzb3VyY2VVUkkuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgCi0gICAgLy8gY3JlYXRlIGEgY2xhc3MgbG9hZGVyIHdpdGggYSBjbGFzcyBwYXRoIHRoYXQgcG9pbnRzIHRvIHRoZSByZXNvdXJjZSBidW5kbGUncyBsb2NhdGlvbgotICAgIC8vICAgICAgICAgCi0gICAgVVJMW10gY2xhc3NwYXRoID0gbmV3IFVSTFsxXTsKLSAgICBjbGFzc3BhdGhbMF0gPSBQbGF0Zm9ybS5yZXNvbHZlKG5ldyBVUkwocmVzb3VyY2VEaXJlY3RvcnkpKTsKLQkgIENsYXNzTG9hZGVyIHJlc291cmNlTG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKGNsYXNzcGF0aCwgbnVsbCk7IAotICAgICAgIAotICAJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShyZXNvdXJjZUJ1bmRsZU5hbWUsIHRhcmdldExvY2FsZSwgcmVzb3VyY2VMb2FkZXIpOwotCX0gIAotCi0gIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoU3RyaW5nIHJlc291cmNlVVJJKSB0aHJvd3MgRXhjZXB0aW9uIAotICB7Ci0JICByZXR1cm4gZ2V0UmVzb3VyY2VCdW5kbGUocmVzb3VyY2VVUkksIExvY2FsZS5nZXREZWZhdWx0KCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvSW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL0luZmVycmVkR3JhbW1hckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlkODEzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvSW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLm1vZGVscXVlcnlpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNQW55RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5hbWVkTm9kZU1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5vZGVMaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01EZXNjcmlwdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLQotIAotCi1wdWJsaWMgY2xhc3MgSW5mZXJyZWRHcmFtbWFyRmFjdG9yeQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBJbmZlcnJlZEdyYW1tYXJGYWN0b3J5KCkKLSAgewotICB9Ci0KLSAgcHVibGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIENNRG9jdW1lbnRJbXBsIGNtZG9jdW1lbnQgPW5ldyBDTURvY3VtZW50SW1wbCh1cmkpOwotICAgIGNtZG9jdW1lbnQuc2V0SW5mZXJyZWQodHJ1ZSk7Ci0gICAgcmV0dXJuIGNtZG9jdW1lbnQ7Ci0gIH0gICAgCi0gCi0gIHB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVDTUVsZW1lbnREZWNsYXJhdGlvbihDTURvY3VtZW50IGNtRG9jdW1lbnQsIEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBpc0xvY2FsKQotICB7Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBDTURvY3VtZW50SW1wbCBjbURvY3VtZW50SW1wbCA9IChDTURvY3VtZW50SW1wbCljbURvY3VtZW50OwotCi0gICAgQ01OYW1lZE5vZGVNYXBJbXBsIGVsZW1lbnRNYXAgPSBpc0xvY2FsID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDTU5hbWVkTm9kZU1hcEltcGwpY21Eb2N1bWVudEltcGwuZ2V0TG9jYWxFbGVtZW50UG9vbCgpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDTU5hbWVkTm9kZU1hcEltcGwpY21Eb2N1bWVudEltcGwuZ2V0RWxlbWVudHMoKTsKLQotICAgIENNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwpZWxlbWVudE1hcC5nZXROYW1lZEl0ZW0obG9jYWxOYW1lKTsKLSAgICBpZiAoZWQgPT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlIGVkICIgKyBsb2NhbE5hbWUpOwotICAgICAgZWQgPSBuZXcgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKGNtRG9jdW1lbnQsIGxvY2FsTmFtZSk7Ci0gICAgICBlZC5zZXRJbmZlcnJlZCh0cnVlKTsKLSAgICAgIGVkLnNldExvY2FsKGlzTG9jYWwpOwotICAgICAgZWQuc2V0TWF4T2NjdXIoMSk7Ci0gICAgICBDTUdyb3VwSW1wbCBncm91cCA9IG5ldyBDTUdyb3VwSW1wbChuZXcgQ01Ob2RlTGlzdEltcGwoKSwgQ01Hcm91cC5DSE9JQ0UpOwotICAgICAgZ3JvdXAuc2V0SW5mZXJyZWQodHJ1ZSk7Ci0gICAgICBncm91cC5zZXRNaW5PY2N1cigwKTsKLSAgICAgIGdyb3VwLnNldE1heE9jY3VyKC0xKTsKLSAgICAgIGVkLnNldENvbnRlbnQoZ3JvdXApOyAgICAgICAgICAgIAotICAgICAgZWxlbWVudE1hcC5wdXQoZWQpOwotICAgIH0gCi0KLSAgICAvLyBsb29rdXAgb3IgY3JlYXRlIHRoZSBhdHRyaWJ1dGVzCi0gICAgLy8KLSAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlTWFwID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgaW50IGF0dHJpYnV0ZU1hcExlbmd0aCA9IGF0dHJpYnV0ZU1hcC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZU1hcExlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIEF0dHIgYXR0ciA9IChBdHRyKWF0dHJpYnV0ZU1hcC5pdGVtKGkpOwotICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwgYWQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwpZWQuZ2V0QXR0cmlidXRlTWFwKCkuZ2V0TmFtZWRJdGVtKGF0dHIuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICBpZiAoYWQgPT0gbnVsbCkKLSAgICAgIHsgICAgIAotICAgICAgICAvLyB0b2RvLi4uIHVzZSBhbiBhdHRyaWJ1dGUgcG9vbCB0byBiZSBtb3JlIGVmZmljaWVudD8KLSAgICAgICAgYWQgPSBuZXcgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwoYXR0ci5nZXROb2RlTmFtZSgpLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLSAgICAgICAgYWQuc2V0SW5mZXJyZWQodHJ1ZSk7Ci0gICAgICAgIGVkLmdldEF0dHJpYnV0ZU1hcCgpLnB1dChhZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlZDsKLSAgfSAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNNQ29udGVudChDTURvY3VtZW50IHBhcmVudENNRG9jdW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkLCBDTURvY3VtZW50IGNoaWxkQ01Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gY2hpbGRFZCwgYm9vbGVhbiBpc0xvY2FsLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgLy8gYWRkIGVsZW1lbnQgdG8gdGhlIHBhcmVudCdzIGNvbnRlbnQKLSAgICAvLyBjb25zaWRlciBhbGwgY29udGVudCB0byBiZSBvZiB0aGUgZm9ybSAoQSB8IEIgfCBDKSogICAgCi0gICAgLy8KLSAgICBDTUdyb3VwSW1wbCBncm91cCA9IChDTUdyb3VwSW1wbClwYXJlbnRFZC5nZXRDb250ZW50KCk7Ci0gICAgQ01Ob2RlTGlzdEltcGwgZ3JvdXBDaGlsZE5vZGVMaXN0ID0gKENNTm9kZUxpc3RJbXBsKWdyb3VwLmdldENoaWxkTm9kZXMoKTsKLQotICAgIGlmIChwYXJlbnRDTURvY3VtZW50ID09IGNoaWxkQ01Eb2N1bWVudCkKLSAgICB7Ci0gICAgICBpZiAoIWdyb3VwQ2hpbGROb2RlTGlzdC5jb250YWlucyhjaGlsZEVkKSkKLSAgICAgIHsKLSAgICAgICAgZ3JvdXBDaGlsZE5vZGVMaXN0LmFkZChjaGlsZEVkKTsKLSAgICAgIH0KLSAgICAgIGlmIChpc0xvY2FsKQotICAgICAgewotICAgICAgICBDTU5hbWVkTm9kZU1hcEltcGwgbG9jYWxFbGVtZW50TWFwID0gKENNTmFtZWROb2RlTWFwSW1wbClwYXJlbnRFZC5nZXRMb2NhbEVsZW1lbnRzKCk7Ci0gICAgICAgIGxvY2FsRWxlbWVudE1hcC5wdXQoY2hpbGRFZCk7Ci0gICAgICB9Ci0gICAgfSAgICAgCi0gICAgZWxzZQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBDTUFueUVsZW1lbnQgY21BbnlFbGVtZW50ID0gbG9va3VwT3JDcmVhdGVDTUFueUVsZW1lbnQoKENNRG9jdW1lbnRJbXBsKXBhcmVudENNRG9jdW1lbnQsIHVyaSk7Ci0gICAgICBpZiAoIWdyb3VwQ2hpbGROb2RlTGlzdC5jb250YWlucyhjbUFueUVsZW1lbnQpKQotICAgICAgewotICAgICAgICBncm91cENoaWxkTm9kZUxpc3QuYWRkKGNtQW55RWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfSAgICAgIAotICB9ICAgCi0KLSAgcHJvdGVjdGVkIENNQW55RWxlbWVudCBsb29rdXBPckNyZWF0ZUNNQW55RWxlbWVudChDTURvY3VtZW50SW1wbCBwYXJlbnRDTURvY3VtZW50LCBTdHJpbmcgdXJpKQotICB7Ci0gICAgQ01OYW1lZE5vZGVNYXBJbXBsIGFueUVsZW1lbnRNYXAgPSBwYXJlbnRDTURvY3VtZW50LmdldEFueUVsZW1lbnRzKCk7Ci0gICAgQ01BbnlFbGVtZW50SW1wbCBhbnlFbGVtZW50ID0gKENNQW55RWxlbWVudEltcGwpYW55RWxlbWVudE1hcC5nZXROYW1lZEl0ZW0oQ01BbnlFbGVtZW50SW1wbC5jb21wdXRlTm9kZU5hbWUodXJpKSk7Ci0gICAgaWYgKGFueUVsZW1lbnQgPT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZSBhbnlFbGVtZW50ICIgKyB1cmkpOwotICAgICAgYW55RWxlbWVudCA9IG5ldyBDTUFueUVsZW1lbnRJbXBsKHVyaSk7Ci0gICAgICBhbnlFbGVtZW50LnNldEluZmVycmVkKHRydWUpOwotICAgICAgYW55RWxlbWVudE1hcC5wdXQoYW55RWxlbWVudCk7Ci0gICAgfQotICAgIHJldHVybiBhbnlFbGVtZW50OwotICB9IAotICAgICAgCi0KLSAgcHVibGljIHZvaWQgZGVidWdQcmludChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWl0ZXIubmV4dCgpOyAKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjbURvY3VtZW50ICgiICsgY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpICsiKSIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIENNTmFtZWROb2RlTWFwSW1wbCBlbGVtZW50TWFwID0gKENNTmFtZWROb2RlTWFwSW1wbCljbURvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0gICAgICBpbnQgc2l6ZSA9IGVsZW1lbnRNYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pZWxlbWVudE1hcC5pdGVtKGkpOwotICAgICAgICBDTURlc2NyaXB0aW9uQnVpbGRlciBidWlsZGVyID0gbmV3IENNRGVzY3JpcHRpb25CdWlsZGVyKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBFTEVNRU5UICIgKyBlZC5nZXROb2RlTmFtZSgpICsgIiA9ICIgKyBidWlsZGVyLmJ1aWxkRGVzY3JpcHRpb24oZWQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICB9Ci0gICAgfQotICB9ICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZDk0OTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5tb2RlbHF1ZXJ5aW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uOwotCi0vKioKLSAqIERlc2NyaWJlcyBhbiBleHRlbnNpb24gdG8gdGhlIDxjb2RlPm1vZGVsUXVlcnlFeHRlbnNpb248L2NvZGU+IGV4dGVuc2lvbgotICogcG9pbnQuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEVfQVRUUklCVVRFID0gImNvbnRlbnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX0FUVFJJQlVURSA9ICJuYW1lc3BhY2UiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19BVFRSSUJVVEUgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb247Ci0gIHByaXZhdGUgU3RyaW5nIGNvbnRlbnRUeXBlSWQ7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLSAgcHJpdmF0ZSBNb2RlbFF1ZXJ5RXh0ZW5zaW9uIGV4dGVuc2lvbjsKLQotICBwdWJsaWMgTW9kZWxRdWVyeUV4dGVuc2lvbkRlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBjb25maWd1cmF0aW9uID0gZWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uIGNyZWF0ZU1vZGVsUXVlcnlFeHRlbnNpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGV4dGVuc2lvbiA9PSBudWxsKQotICAgIHsgIAotICAgICAgZXh0ZW5zaW9uID0gKE1vZGVsUXVlcnlFeHRlbnNpb24pIGNvbmZpZ3VyYXRpb24uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihDTEFTU19BVFRSSUJVVEUpOwotICAgIH0gIAotICAgIHJldHVybiBleHRlbnNpb247Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlSWQoKQotICB7Ci0gICAgaWYgKGNvbnRlbnRUeXBlSWQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb250ZW50VHlwZUlkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQ09OVEVOVF9UWVBFX0FUVFJJQlVURSk7Ci0gICAgfQotICAgIHJldHVybiBjb250ZW50VHlwZUlkOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKQotICB7Ci0gICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKE5BTUVTUEFDRV9BVFRSSUJVVEUpOwotICAgIH0KLSAgICByZXR1cm4gbmFtZXNwYWNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYzI4ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLm1vZGVscXVlcnlpbXBsOwotICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb24uTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlckltcGwgaW1wbGVtZW50cyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlcgoteyAgICAgICAgICAgCi0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5RXh0ZW5zaW9uUmVnaXN0cnkgbW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5ID0gbmV3IE1vZGVsUXVlcnlFeHRlbnNpb25SZWdpc3RyeSgpOwotCi0gIHB1YmxpYyBMaXN0IGdldERhdGFUeXBlVmFsdWVzKEVsZW1lbnQgZWxlbWVudCwgQ01Ob2RlIGNtTm9kZSkKLSAgeyAgICAKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAgICAgCi0gICAgU3RyaW5nIGNvbnRlbnRUeXBlSWQgPSBnZXRDb250ZW50VHlwZUlkKGVsZW1lbnQpOwotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBnZXROYW1lc3BhY2UoY21Ob2RlKTsKLSAgICBTdHJpbmcgbmFtZSA9IGNtTm9kZS5nZXROb2RlTmFtZSgpOwotICAgIAotICAgIGZvciAoSXRlcmF0b3IgaSA9IG1vZGVsUXVlcnlFeHRlbnNpb25SZWdpc3RyeS5nZXRBcHBsaWNhYmxlRXh0ZW5zaW9ucyhjb250ZW50VHlwZUlkLCBuYW1lc3BhY2UpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBNb2RlbFF1ZXJ5RXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChNb2RlbFF1ZXJ5RXh0ZW5zaW9uKWkubmV4dCgpOwotICAgICAgU3RyaW5nW10gdmFsdWVzID0gbnVsbDsKLSAgICAgIGlmIChjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKQotICAgICAgeyAgCi0gICAgICAgIHZhbHVlcyA9IGV4dGVuc2lvbi5nZXRBdHRyaWJ1dGVWYWx1ZXMoZWxlbWVudCwgbmFtZXNwYWNlLCBuYW1lKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdmFsdWVzID0gZXh0ZW5zaW9uLmdldEVsZW1lbnRWYWx1ZXMoZWxlbWVudCwgbmFtZXNwYWNlLCBuYW1lKTsgICAgICAgIAotICAgICAgfQotICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KHZhbHVlcykpOwotICAgICAgfSAgCi0gICAgfSAgCi0gICAgcmV0dXJuIGxpc3Q7ICAKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBmaWx0ZXJBdmFpbGFibGVFbGVtZW50Q29udGVudChMaXN0IGNtbm9kZXMsIEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsKLQkgIGZpbHRlckF2YWlsYWJsZUVsZW1lbnRDb250ZW50KGNtbm9kZXMsIGVsZW1lbnQsIGVkLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZmlsdGVyQXZhaWxhYmxlRWxlbWVudENvbnRlbnQoTGlzdCBjbW5vZGVzLCBFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5jbHVkZU9wdGlvbnMpCi0gIHsKLSAgICBTdHJpbmcgY29udGVudFR5cGVJZCA9IGdldENvbnRlbnRUeXBlSWQoZWxlbWVudCk7Ci0gICAgU3RyaW5nIHBhcmVudE5hbWVzcGFjZSA9IGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLQlMaXN0IG1vZGVsUXVlcnlFeHRlbnNpb25zID0gbW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5LmdldEFwcGxpY2FibGVFeHRlbnNpb25zKGNvbnRlbnRUeXBlSWQsIHBhcmVudE5hbWVzcGFjZSk7Ci0JaWYoKGluY2x1ZGVPcHRpb25zICYgTW9kZWxRdWVyeS5JTkNMVURFX0NISUxEX05PREVTKSA+IDApCi0JewotICAgICAgZm9yIChJdGVyYXRvciBqID0gY21ub2Rlcy5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBDTU5vZGUgY21Ob2RlID0gKENNTm9kZSlqLm5leHQoKTsgIAotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZ2V0TmFtZXNwYWNlKGNtTm9kZSk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gY21Ob2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICAKLSAgICAgICAgYm9vbGVhbiBpbmNsdWRlID0gdHJ1ZTsKLSAgICAgICAgZm9yKGludCBrID0gMDsgayA8IG1vZGVsUXVlcnlFeHRlbnNpb25zLnNpemUoKSAmJiBpbmNsdWRlOyBrKyspIHsKLSAgICAgICAgewotICAgICAgICAgICAgTW9kZWxRdWVyeUV4dGVuc2lvbiBleHRlbnNpb24gPSAoTW9kZWxRdWVyeUV4dGVuc2lvbiltb2RlbFF1ZXJ5RXh0ZW5zaW9ucy5nZXQoayk7Ci0gICAgICAgICAgICBpbmNsdWRlID0gZXh0ZW5zaW9uLmlzQXBwbGljYWJsZUNoaWxkRWxlbWVudChlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUpOwotICAgICAgICAgICAgaWYgKCFpbmNsdWRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGNtTm9kZSBmcm9tIHRoZSBsaXN0Ci0gICAgICAgICAgICAgIGoucmVtb3ZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGFkZCBNUUUtcHJvdmlkZWQgY29udGVudAotICAgIGZvcihpbnQgayA9IDA7IGsgPCBtb2RlbFF1ZXJ5RXh0ZW5zaW9ucy5zaXplKCk7IGsrKykKLSAgICB7Ci0gICAgICAgIE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5zaW9uID0gKE1vZGVsUXVlcnlFeHRlbnNpb24pbW9kZWxRdWVyeUV4dGVuc2lvbnMuZ2V0KGspOwotICAgICAgICBjbW5vZGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGV4dGVuc2lvbi5nZXRBdmFpbGFibGVFbGVtZW50Q29udGVudChlbGVtZW50LCBwYXJlbnROYW1lc3BhY2UsIGluY2x1ZGVPcHRpb25zKSkpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZXNwYWNlKENNTm9kZSBjbU5vZGUpCi0gIHsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCljbU5vZGUuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpICAgICAgICAgIAotICAgIHsgICAgIAotICAgICAgbmFtZXNwYWNlID0gKFN0cmluZyljbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIik7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q29udGVudFR5cGVJZChOb2RlIG5vZGUpCi0gIHsKLSAgICBTdHJpbmcgY29udGVudFR5cGVJZCA9ICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIjsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgSURPTU5vZGUgZG9tTm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLSAgICAgIGNvbnRlbnRUeXBlSWQgPSBkb21Ob2RlLmdldE1vZGVsKCkuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0gICAgfSAgIAotICAgIHJldHVybiBjb250ZW50VHlwZUlkOwotICB9IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzY2ZjQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLm1vZGVscXVlcnlpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb24uTW9kZWxRdWVyeUV4dGVuc2lvbjsKLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlFeHRlbnNpb25SZWdpc3RyeQotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAibW9kZWxRdWVyeUV4dGVuc2lvbnMiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gIm1vZGVsUXVlcnlFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgTGlzdCBkZXNjcmlwdG9yczsKLQotICBwdWJsaWMgTGlzdCBnZXRBcHBsaWNhYmxlRXh0ZW5zaW9ucyhTdHJpbmcgY29udGVudFR5cGVJZCwgU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoY29udGVudFR5cGVJZCAhPSBudWxsKQotICAgIHsKLSAgICAgIGVuc3VyZUV4dGVuc2lvbnNMb2FkZWQoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgTW9kZWxRdWVyeUV4dGVuc2lvbkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChNb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVzY3JpcHRvcikgaS5uZXh0KCk7Ci0gICAgICAgIGlmIChjb250ZW50VHlwZUlkLmVxdWFscyhkZXNjcmlwdG9yLmdldENvbnRlbnRUeXBlSWQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZGVzY3JpcHRvci5nZXROYW1lc3BhY2UoKSA9PSBudWxsIHx8ICBkZXNjcmlwdG9yLmdldE5hbWVzcGFjZSgpLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZGVzY3JpcHRvci5jcmVhdGVNb2RlbFF1ZXJ5RXh0ZW5zaW9uKCk7Ci0gICAgICAgICAgICAgIGxpc3QuYWRkKGV4dGVuc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigicHJvYmxlbSBjcmVhdGluZyBtb2RlbCBxdWVyeSBleHRlbnNpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgIH0gIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0gIAotICAvKgotICAgKiAgVE9ETyA6IGNvbnNpZGVyIHByb3ZpZGluZyBhIG5vbi1wbHVnaW4gbWVhbnMgYWRkL3JlbW92ZSBleHRlbnNpb25zCi0gICAqICAgCi0gIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbihNb2RlbFF1ZXJ5RXh0ZW5zaW9uIGV4dGVuc2lvbikKLSAgeyAgICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVFeHRlbnNpb24oTW9kZWxRdWVyeUV4dGVuc2lvbkRlcHJlY2F0ZWQgZXh0ZW5zaW9uKQotICB7Ci0gIH0qLwotCi0gIC8qKgotICAgKiBSZWFkcyBhbGwgZXh0ZW5zaW9ucy4KLSAgICogPHA+Ci0gICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgaW4gb3JkZXIgdG8gcmVsb2FkIGZyb20gYSBjaGFuZ2VkCi0gICAqIGV4dGVuc2lvbiByZWdpc3RyeS4KLSAgICogPC9wPgotICAgKi8KLSAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCByZWxvYWRFeHRlbnNpb25zKCkKLSAgewotICAgIGRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFN0cmluZyBidW5kbGVpZCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiOyAvLyROT04tTkxTLTEkICAgICAgCi0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihidW5kbGVpZCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIE1vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgTW9kZWxRdWVyeUV4dGVuc2lvbkRlc2NyaXB0b3IoZWxlbWVudHNbaV0pOwotICAgICAgZGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmVzIHRoZSBleHRlbnNpb25zIGhhdmUgYmVlbiBsb2FkZWQgYXQgbGVhc3Qgb25jZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBlbnN1cmVFeHRlbnNpb25zTG9hZGVkKCkKLSAgewotICAgIGlmIChkZXNjcmlwdG9ycyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlbG9hZEV4dGVuc2lvbnMoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL0NNRGF0YVR5cGVWYWx1ZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvQ01EYXRhVHlwZVZhbHVlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwOWZhNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvQ01EYXRhVHlwZVZhbHVlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlVGFibGU7Ci0KLQotcHVibGljIGNsYXNzIENNRGF0YVR5cGVWYWx1ZUhlbHBlcgotewotICBwcm90ZWN0ZWQgaW50IGlkQ291bnQgPSAwOwotCi0KLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkLCBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSkKLSAgewotICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0gICAgICAgCi0gICAgaWYgKGlzWFNJVHlwZShhZCkpICAgICAgICAgCi0gICAgeyAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IGdldFF1YWxpZmllZFhTSVR5cGVzKGFkLCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICB2YWx1ZSA9IGxpc3Quc2l6ZSgpID4gMCA/IChTdHJpbmcpbGlzdC5nZXQoMCkgOiBudWxsOwotICAgIH0gCi0KLSAgICAvLyBzaGFtZWxlc3MgaGFjawotICAgIC8vCi0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgaWYgKGFkLmdldEF0dHJOYW1lKCkuZXF1YWxzKCJ4bWw6bGFuZyIpKSAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICB2YWx1ZSA9ICJFTiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gYWQuZ2V0QXR0clR5cGUoKTsKLSAgICAgIGlmIChkYXRhVHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICB2YWx1ZSA9IGdldFZhbHVlKGRhdGFUeXBlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLQotICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKENNRGF0YVR5cGUgZGF0YVR5cGUpCi0gIHsKLSAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgIHZhbHVlID0gZGF0YVR5cGUuZ2V0SW1wbGllZFZhbHVlKCk7Ci0KLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBkYXRhVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0gICAgICBpZiAodmFsdWVzICE9IG51bGwgJiYgdmFsdWVzLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIHZhbHVlID0gdmFsdWVzWzBdOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHZhbHVlID0gZGF0YVR5cGUuZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCk7Ci0gICAgfSAgICAgICAgICAgICAgIAotCi0gICAgLy8gSGVyZSBpcyBhIHNwZWNpYWwgY2FzZSB3aGVyZSB3ZSBoYW5kbGUgRFREJ3MgSUQgcmVsYXRlZCBkYXRhdHlwZXMuCi0gICAgLy8gVGhlc2UgdmFsdWVzIG11c3QgYmUgZ2VuZXJhdGVkL3ZhbGlkYXRlIGJ5IGNvbnNpZGVyaW5nIHRoZSBlbnRpcmUgeG1sIGZpbGUKLSAgICAvLyBzbyB3ZSBjYW4ndCByZWx5IG9uIHRoZSAnZ2VuZXJhdGVJbnN0YW5jZVZhbHVlJyBtZXRob2QuCi0gICAgLy8KLSAgICAvLyB0b2RvLi4uIGZpbmQgYSBuaWNlciB3YXkgdG8gaGFuZGxlIHRoaXMgICAgCi0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGRhdGFUeXBlTmFtZSA9IGRhdGFUeXBlLmdldERhdGFUeXBlTmFtZSgpOwotICAgICAgaWYgKGRhdGFUeXBlTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoZGF0YVR5cGVOYW1lLmVxdWFscygiSUQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWUgPSAiaWR2YWx1ZSIgKyBpZENvdW50Kys7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChkYXRhVHlwZU5hbWUuZXF1YWxzKCJJRFJFRiIpIHx8IGRhdGFUeXBlTmFtZS5lcXVhbHMoIklEUkVGUyIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlID0gImlkdmFsdWUwIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgCi0gICAgcmV0dXJuIHZhbHVlOwotICB9IAotICAgICAgCi0KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZEVtcHR5VmFsdWUoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgeyAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0gICAgQ01EYXRhVHlwZSBkYXRhVHlwZSA9IGFkLmdldEF0dHJUeXBlKCk7Ci0gICAgaWYgKGRhdGFUeXBlICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFN0cmluZyBwcm9wZXJ0eVZhbHVlID0gKFN0cmluZylkYXRhVHlwZS5nZXRQcm9wZXJ0eSgiaXNWYWxpZEVtcHR5VmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKHByb3BlcnR5VmFsdWUgIT0gbnVsbCAmJiBwcm9wZXJ0eVZhbHVlLmVxdWFscygiZmFsc2UiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9ICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIGJvb2xlYW4gaXNYU0lUeXBlKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpCi0gIHsgICAgICAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGlmIChhZC5nZXROb2RlTmFtZSgpLmVxdWFscygidHlwZSIpKSAgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWFkLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VOYW1lID0gKFN0cmluZyljbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKG5hbWVzcGFjZU5hbWUgIT0gbnVsbCAmJiBuYW1lc3BhY2VOYW1lLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7ICAgICAgICAgICAKLSAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAKLQotICBwdWJsaWMgTGlzdCBnZXRRdWFsaWZpZWRYU0lUeXBlcyhDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkLCBOYW1lc3BhY2VUYWJsZSB0YWJsZSkKLSAgeyAgICAgICAgICAKLSAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTGlzdCB4c2lUeXBlcyA9IChMaXN0KWFkLmdldFByb3BlcnR5KCJYU0lUeXBlcyIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKHhzaVR5cGVzICE9IG51bGwgJiYgeHNpVHlwZXMuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2lUeXBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgeyAKLSAgICAgICAgU3RyaW5nIHVyaVF1YWxpZmllZE5hbWUgPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICBTdHJpbmdbXSBjb21wb25lbnRzID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVSSVF1YWxpZmllZE5hbWVDb21wb25lbnRzKHVyaVF1YWxpZmllZE5hbWUpOyAgCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSB0YWJsZS5nZXRQcmVmaXhGb3JVUkkoY29tcG9uZW50c1swXSAhPSBudWxsID8gY29tcG9uZW50c1swXSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgPyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArICI6IiArIGNvbXBvbmVudHNbMV0gOiAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50c1sxXTsKLSAgICAgICAgbGlzdC5hZGQodHlwZU5hbWUpOwotICAgICAgfQotICAgIH0gICAgICAgICAgIAotICAgIHJldHVybiBsaXN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9DTVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvQ01WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlNTU5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9DTVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTcwMDUgLSBTb21lIHN0YXRpYyBjb25zdGFudHMgbm90IG1hZGUgZmluYWwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNVmlzaXRvcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBDTVZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ0VsZW1lbnRDb250ZW50Q29tcGFyYXRvciBzdHJpbmdDb250ZW50Q29tcGFyaXRvciA9IG5ldyBTdHJpbmdFbGVtZW50Q29udGVudENvbXBhcmF0b3IoKTsKLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBncmFwaE5vZGVUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotICAvKioKLSAgICogR3JhcGhOb2RlCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEdyYXBoTm9kZQotICB7Ci0gICAgcHVibGljIFN0cmluZyBuYW1lOwotICAgIHB1YmxpYyBib29sZWFuIGlzVGVybWluYWw7Ci0gICAgcHVibGljIFZlY3RvciBhcmNMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gICAgcHVibGljIEdyYXBoTm9kZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEFyYyhBcmMgYXJjKQotICAgIHsKLSAgICAgIGFyY0xpc3QuYWRkRWxlbWVudChhcmMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgIHJldHVybiAiW0dyYXBoTm9kZSAiICsgbmFtZSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogQXJjCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEFyYwotICB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVCAgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUEVBVCAgID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05BTCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFVl9JTiAgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9ORVhUID0gNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSU5LICAgICA9IDY7Ci0KLSAgICBwdWJsaWMgaW50IGtpbmQ7Ci0gICAgcHVibGljIFN0cmluZyBuYW1lOwotICAgIHB1YmxpYyBHcmFwaE5vZGUgbm9kZTsKLSAgICBwdWJsaWMgQ01Ob2RlIGNtTm9kZTsKLQotICAgIHB1YmxpYyBBcmMoaW50IGtpbmQsIEdyYXBoTm9kZSBub2RlLCBDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIHRoaXMoa2luZCwgIiIsIG5vZGUsIGNtTm9kZSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQXJjKGludCBraW5kLCBTdHJpbmcgbmFtZSwgR3JhcGhOb2RlIG5vZGUsIENNTm9kZSBjbU5vZGUpCi0gICAgewotICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gICAgICB0aGlzLm5vZGUgPSBub2RlOwotICAgICAgdGhpcy5jbU5vZGUgPSBjbU5vZGU7Ci0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogR3JhcGhHZW5lcmF0b3IKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgR3JhcGhHZW5lcmF0b3IgZXh0ZW5kcyBDTVZpc2l0b3IKLSAgewotICAgIHB1YmxpYyBpbnQgaW5kZW50OwotICAgIHB1YmxpYyBpbnQgY291bnQ7Ci0gICAgcHVibGljIEdyYXBoTm9kZSBzdGFydEdyYXBoTm9kZTsKLSAgICBwdWJsaWMgQ29udGV4dCBjb250ZXh0OwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBDb250ZXh0Ci0gICAgewotICAgICAgR3JhcGhOb2RlIGZyb207Ci0gICAgICBHcmFwaE5vZGUgdG87Ci0KLSAgICAgIENvbnRleHQoR3JhcGhOb2RlIGZyb20sIEdyYXBoTm9kZSB0bykKLSAgICAgIHsKLSAgICAgICAgdGhpcy5mcm9tID0gZnJvbTsKLSAgICAgICAgdGhpcy50byA9IHRvOwotICAgICAgfQotCi0gICAgICBHcmFwaE5vZGUgZ2V0TGFzdEdyYXBoTm9kZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAodG8gIT0gbnVsbCkgPyB0byA6IGZyb207Ci0gICAgICB9Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgR3JhcGhHZW5lcmF0b3IoKQotICAgIHsKLSAgICAgIHN0YXJ0R3JhcGhOb2RlID0gbmV3IEdyYXBoTm9kZShnZXRHcmFwaE5vZGVOYW1lKCkpOwotICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0KHN0YXJ0R3JhcGhOb2RlLCBudWxsKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlR3JhcGgoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gICAgewotICAgICAgaW50IGNvbnRlbnRUeXBlID0gZWQuZ2V0Q29udGVudFR5cGUoKTsKLQotICAgICAgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIHx8Ci0gICAgICAgICAgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRDTU5vZGUoZWQuZ2V0Q29udGVudCgpKTsKLSAgICAgIH0KLSAgICAgIC8vIENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQS4uLiBubyBncmFwaCByZXF1aXJlZAotICAgICAgLy8gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZLi4uIG5vIGdyYXBoIHJlcXVpcmVkCi0gICAgICBjb250ZXh0LmdldExhc3RHcmFwaE5vZGUoKS5pc1Rlcm1pbmFsID0gdHJ1ZTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0R3JhcGhOb2RlTmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuICJuIiArIGNvdW50Kys7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBHcmFwaE5vZGUgZ2V0U3RhcnRHcmFwaE5vZGUoKQotICAgIHsKLSAgICAgIHJldHVybiBzdGFydEdyYXBoTm9kZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqICAgICAgICAgICAgICAgIHJlcGVhdAotICAgICAqICAgICAgICAgICAgICstLS0tIy0tLS0tKwotICAgICAqICAgICAgICAgICAgIHwgICAgICAgICAgfAotICAgICAqICAgICAgICAgICAgIHYgICAgICAgICAgfAotICAgICAqICBwcmV2IC0tIy0+IGluIC0tJ3gnLT4gb3V0IC0tIy0+IG5leHQKLSAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCi0gICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAqICArLS0tLS0tLS0tLS0tLS0tLSMtLS0tLS0tLS0tLS0tLSsKLSAgICAgKiAgICAgICAgICAgICAgICBvcHRpb25hbAotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXJjcyhHcmFwaE5vZGUgaW4sIEdyYXBoTm9kZSBvdXQsIENNQ29udGVudCBjbUNvbnRlbnQpCi0gICAgewotICAgICAgY3JlYXRlQXJjcyhpbiwgb3V0LCBjbUNvbnRlbnQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBcmNzKEdyYXBoTm9kZSBpbiwgR3JhcGhOb2RlIG91dCwgQ01Db250ZW50IGNtQ29udGVudCwgYm9vbGVhbiBpc0FsbEdyb3VwKQotICAgIHsKLSAgICAgIC8vcHJpbnRsbigiK2NyZWF0ZUFyY3MoKSAiICsgZWQuZ2V0RGVzY3JpcHRpb24oKSArICIgIiArIGVkLmdldE1pbk9jY3VyKCkpOwotICAgICAgR3JhcGhOb2RlIHByZXYgPSBjb250ZXh0LmZyb207Ci0gICAgICBHcmFwaE5vZGUgbmV4dCA9IG5ldyBHcmFwaE5vZGUoZ2V0R3JhcGhOb2RlTmFtZSgpKTsKLQotICAgICAgcHJldi5hZGRBcmMobmV3IEFyYyhBcmMuUFJFVl9JTiwgaW4sIGNtQ29udGVudCkpOwotICAgICAgb3V0LmFkZEFyYyhuZXcgQXJjKEFyYy5PVVRfTkVYVCwgbmV4dCwgY21Db250ZW50KSk7Ci0KLSAgICAgIGlmIChjb250ZXh0LnRvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5leHQuYWRkQXJjKG5ldyBBcmMoQXJjLkxJTkssIGNvbnRleHQudG8sIGNtQ29udGVudCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjb250ZXh0LmZyb20gPSBuZXh0OwotICAgICAgfQotCi0gICAgICBpZiAoY21Db250ZW50LmdldE1pbk9jY3VyKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gdG9kby4uLiBzaG91bGQgd2Ugc2VlIGlmIGFuIG9wdGlvbmFsIGFyYyBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkPwotICAgICAgICBwcmV2LmFkZEFyYyhuZXcgQXJjKEFyYy5PUFRJT05BTCwgbmV4dCwgY21Db250ZW50KSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChjbUNvbnRlbnQuZ2V0TWF4T2NjdXIoKSA9PSAtMSB8fCBjbUNvbnRlbnQuZ2V0TWF4T2NjdXIoKSA+IDEgfHwgaXNBbGxHcm91cCkKLSAgICAgIHsKLSAgICAgICAgb3V0LmFkZEFyYyhuZXcgQXJjKEFyYy5SRVBFQVQsIGluLCBjbUNvbnRlbnQpKTsKLSAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGdyb3VwKQotICAgIHsKLSAgICAgIENvbnRleHQgcHJldkNvbnRleHQgPSBjb250ZXh0OwotICAgICAgR3JhcGhOb2RlIGluID0gbmV3IEdyYXBoTm9kZSgiKCIgKyBnZXRHcmFwaE5vZGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICBHcmFwaE5vZGUgb3V0ID0gbmV3IEdyYXBoTm9kZSgiKSIgKyBnZXRHcmFwaE5vZGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgIGludCBncm91cE9wZXJhdG9yID0gZ3JvdXAuZ2V0T3BlcmF0b3IoKTsKLSAgICAgIGlmIChncm91cE9wZXJhdG9yID09IENNR3JvdXAuU0VRVUVOQ0UpCi0gICAgICB7Ci0gICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dChpbiwgbnVsbCk7Ci0gICAgICAgIHN1cGVyLnZpc2l0Q01Hcm91cChncm91cCk7Ci0gICAgICAgIGNvbnRleHQuZnJvbS5hZGRBcmMobmV3IEFyYyhBcmMuTElOSywgb3V0LCBncm91cCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZ3JvdXBPcGVyYXRvciA9PSBDTUdyb3VwLkNIT0lDRSB8fAotICAgICAgICAgICAgICAgZ3JvdXBPcGVyYXRvciA9PSBDTUdyb3VwLkFMTCkKLSAgICAgIHsKLSAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0KGluLCBvdXQpOwotICAgICAgICBzdXBlci52aXNpdENNR3JvdXAoZ3JvdXApOwotICAgICAgfQotCi0gICAgICBjb250ZXh0ID0gcHJldkNvbnRleHQ7Ci0gICAgICBjcmVhdGVBcmNzKGluLCBvdXQsIGdyb3VwLCBncm91cE9wZXJhdG9yID09IENNR3JvdXAuQUxMKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gICAgewotICAgICAgR3JhcGhOb2RlIGluID0gbmV3IEdyYXBoTm9kZShnZXRHcmFwaE5vZGVOYW1lKCkpOwotICAgICAgR3JhcGhOb2RlIG91dCA9IG5ldyBHcmFwaE5vZGUoZ2V0R3JhcGhOb2RlTmFtZSgpKTsKLSAgICAgIGNyZWF0ZUFyY3MoaW4sIG91dCwgZWQpOwotICAgICAgaW4uYWRkQXJjKG5ldyBBcmMoQXJjLkVMRU1FTlQsIGVkLmdldEVsZW1lbnROYW1lKCksIG91dCwgZWQpKTsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdENNQW55RWxlbWVudChDTUFueUVsZW1lbnQgYW55RWxlbWVudCkKLSAgICB7Ci0gICAgICBHcmFwaE5vZGUgaW4gPSBuZXcgR3JhcGhOb2RlKGdldEdyYXBoTm9kZU5hbWUoKSk7Ci0gICAgICBHcmFwaE5vZGUgb3V0ID0gbmV3IEdyYXBoTm9kZShnZXRHcmFwaE5vZGVOYW1lKCkpOwotICAgICAgY3JlYXRlQXJjcyhpbiwgb3V0LCBhbnlFbGVtZW50KTsKLSAgICAgIGluLmFkZEFyYyhuZXcgQXJjKEFyYy5FTEVNRU5ULCAiYW55Iiwgb3V0LCBhbnlFbGVtZW50KSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLQotICAvLyB0b2RvLi4gaW1wbGVtZW50IGNhY2hlIHN0cmF0ZWd5IGhvb2ssIGhhbmRsZSBuYW1lIHNwYWNlcywgbG9jYWxzIGV0Yy4KLSAgLy8KLSAgcHVibGljIEdyYXBoTm9kZSBsb29rdXBPckNyZWF0ZUdyYXBoKENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gIHsKLSAgICBPYmplY3Qga2V5ID0gZWxlbWVudDsKLSAgICBHcmFwaE5vZGUgbm9kZSA9IChHcmFwaE5vZGUpZ3JhcGhOb2RlVGFibGUuZ2V0KGtleSk7Ci0gICAgaWYgKG5vZGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBub2RlID0gY3JlYXRlR3JhcGgoZWxlbWVudCk7Ci0gICAgICBncmFwaE5vZGVUYWJsZS5wdXQoa2V5LCBub2RlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5vZGU7Ci0gIH0KLQotICBwdWJsaWMgR3JhcGhOb2RlIGNyZWF0ZUdyYXBoKENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gIHsKLSAgICBHcmFwaEdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgR3JhcGhHZW5lcmF0b3IoKTsKLSAgICBnZW5lcmF0b3IuZ2VuZXJhdGVHcmFwaChlbGVtZW50KTsKLSAgICByZXR1cm4gZ2VuZXJhdG9yLmdldFN0YXJ0R3JhcGhOb2RlKCk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHByaW50R3JhcGgoR3JhcGhOb2RlIG5vZGUsIFZlY3RvciBuYW1lZEFyY0xpc3QsIFZlY3RvciB1bmFtZWRBcmNMaXN0LCBpbnQgaW5kZW50KQotICB7Ci0gICAgLy9TdHJpbmcgZGVjb3JhdGlvbiA9IG5vZGUuaXNUZXJtaW5hbCA/ICIgKiIgOiAiIjsKLSAgICAvL3ByaW50bG5JbmRlbnRlZChpbmRlbnQsICJHcmFwaE5vZGU6IiArIG5vZGUubmFtZSArIGRlY29yYXRpb24pOwotCi0gICAgaW5kZW50ICs9IDI7Ci0gICAgZm9yIChFbnVtZXJhdGlvbiBlID0gbm9kZS5hcmNMaXN0LmVsZW1lbnRzKCkgOyBlLmhhc01vcmVFbGVtZW50cygpIDspCi0gICAgewotICAgICAgQXJjIGFyYyA9IChBcmMpZS5uZXh0RWxlbWVudCgpOwotICAgICAgLy9ib29sZWFuIHZpc2l0ID0gZmFsc2U7Ci0gICAgICAvL3ByaW50bG5JbmRlbnRlZChpbmRlbnQsICJBcmM6IiArIGFyYy5uYW1lICsgIiAoIiArIGFyYy5raW5kICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuRUxFTUVOVCkKLSAgICAgIHsKLSAgICAgICAgLy90YWJsZS5hZGQoY3VycmVudEdyYW1tYXJPYmplY3QsIGFyYy5ncmFtbWFyT2JqZWN0KTsKLSAgICAgICAgaWYgKCFuYW1lZEFyY0xpc3QuY29udGFpbnMoYXJjKSkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVkQXJjTGlzdC5hZGQoYXJjKTsKLSAgICAgICAgICB1bmFtZWRBcmNMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgIHByaW50R3JhcGgoYXJjLm5vZGUsIG5hbWVkQXJjTGlzdCwgdW5hbWVkQXJjTGlzdCwgaW5kZW50ICsgMik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCF1bmFtZWRBcmNMaXN0LmNvbnRhaW5zKGFyYykpCi0gICAgICAgIHsKLSAgICAgICAgICB1bmFtZWRBcmNMaXN0LmFkZChhcmMpOwotICAgICAgICAgIHByaW50R3JhcGgoYXJjLm5vZGUsIG5hbWVkQXJjTGlzdCwgdW5hbWVkQXJjTGlzdCwgaW5kZW50ICsgMik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludEdyYXBoKEdyYXBoTm9kZSBub2RlKQotICB7Ci0gICAgcHJpbnRHcmFwaChub2RlLCBuZXcgVmVjdG9yKCksIG5ldyBWZWN0b3IoKSwgMCk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlRWxlbWVudExpc3QoRWxlbWVudExpc3QgaW5pdGlhbExpc3QsIEdyYXBoTm9kZSBpbml0aWFsR3JhcGhOb2RlLCBFbGVtZW50Q29udGVudENvbXBhcmF0b3IgY29tcGFyYXRvciwgUmVzdWx0IHJlc3VsdCwgYm9vbGVhbiBpbml0aWFsTG9vcEZsYWcpIHsKLQkgIFN0YWNrIGFyY1N0YWNrID0gbmV3IFN0YWNrKCk7Ci0JICBhcmNTdGFjay5wdXNoKG5ldyBBcmNTdGFja0l0ZW0obnVsbCwgZmFsc2UpKTsKLQkgIGJvb2xlYW4gbG9vcEZsYWcgPSBpbml0aWFsTG9vcEZsYWc7Ci0JICBFbGVtZW50TGlzdCBlbGVtZW50TGlzdCA9IGluaXRpYWxMaXN0OwotCSAgR3JhcGhOb2RlIGdyYXBoTm9kZSA9IGluaXRpYWxHcmFwaE5vZGU7Ci0JICB3aGlsZSghYXJjU3RhY2suaXNFbXB0eSgpICYmICFyZXN1bHQuaXNWYWxpZCkgewotCQkgIEFyY1N0YWNrSXRlbSBzdGFja0VsZW1lbnQgPSAoQXJjU3RhY2tJdGVtKSBhcmNTdGFjay5wZWVrKCk7Ci0JCSAgaWYoc3RhY2tFbGVtZW50LmlzVmlzaXRlZCkgewotCQkJICBhcmNTdGFjay5wb3AoKTsKLQkJCSAgaWYoc3RhY2tFbGVtZW50LmFyYyAhPSBudWxsKSB7Ci0JCQkJICByZXN1bHQucG9wKHN0YWNrRWxlbWVudC5hcmMpOwotCQkJCSAgY29udGludWU7Ci0JCQkgIH0KLQkJICB9IGVsc2UgewotCQkJICBzdGFja0VsZW1lbnQuaXNWaXNpdGVkID0gdHJ1ZTsKLQkJCSAgcmVzdWx0LnB1c2goc3RhY2tFbGVtZW50LmFyYyk7Ci0JCQkgIGdyYXBoTm9kZSA9IHN0YWNrRWxlbWVudC5hcmMubm9kZTsKLQkJCSAgbG9vcEZsYWcgPSBzdGFja0VsZW1lbnQubG9vcEZsYWc7Ci0JCSAgfSAKLQkJICBpZihlbGVtZW50TGlzdCA9PSBudWxsICYmIGdyYXBoTm9kZS5pc1Rlcm1pbmFsKSB7Ci0JCQkgIHJlc3VsdC5pc1ZhbGlkID0gdHJ1ZTsKLQkJICB9IGVsc2UgewotCQkJICBmb3IoSXRlcmF0b3IgYXJjSXRlcmF0b3IgPSBncmFwaE5vZGUuYXJjTGlzdC5pdGVyYXRvcigpOyBhcmNJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJICBBcmMgYXJjID0gKEFyYylhcmNJdGVyYXRvci5uZXh0KCk7Ci0JCQkJICBib29sZWFuIHRyYXZlcnNlQXJjID0gZmFsc2U7Ci0JCQkJICBpZiAoYXJjLmtpbmQgPT0gQXJjLkVMRU1FTlQpIHsKLQkJCQkJICBpZihlbGVtZW50TGlzdCAhPSBudWxsICYmIGNvbXBhcmF0b3IubWF0Y2hlcyhlbGVtZW50TGlzdC5oZWFkLCBhcmMuY21Ob2RlKSkgewotCQkJCQkJICBsb29wRmxhZyA9IGZhbHNlOwotCQkJCQkJICB0cmF2ZXJzZUFyYyA9IHRydWU7Ci0JCQkJCQkgIGVsZW1lbnRMaXN0ID0gZWxlbWVudExpc3QudGFpbDsgLy8gaW5jcmVtZW50IG91ciBwb3NpdGlvbiBpbiB0aGUgbGlzdAotCQkJCQkgIH0KLQkJCQkgIH0gZWxzZSBpZihhcmMua2luZCA9PSBBcmMuUkVQRUFUKSB7Ci0JCQkJCSAgaWYoIWxvb3BGbGFnKSB7Ci0JCQkJCQkgIHRyYXZlcnNlQXJjID0gdHJ1ZTsKLQkJCQkJICB9Ci0JCQkJCSAgbG9vcEZsYWcgPSB0cnVlOwotCQkJCSAgfSBlbHNlIHsKLQkJCQkJICB0cmF2ZXJzZUFyYyA9IHRydWU7Ci0JCQkJICB9Ci0JCQkJICBpZih0cmF2ZXJzZUFyYykgewotCQkJCQkgIGlmIChyZXN1bHQuY2FuUHVzaChhcmMpKSB7IC8vIHRlc3QgdG8gc2VlIGlmIHdlIGNhbiBwdXNoIHRoaXMgYXJjIGR1ZSB0byBmYWNldCBjb25zdHJhaW50cyAgCi0JCQkJCQkgIGFyY1N0YWNrLnB1c2gobmV3IEFyY1N0YWNrSXRlbShhcmMsIGxvb3BGbGFnKSk7Ci0JCQkJCSAgfQotCQkJCSAgfQotCQkJICB9Ci0JCSAgfQotCSAgfQotICB9Ci0gIAotICAKLSAgcHJpdmF0ZSBjbGFzcyBBcmNTdGFja0l0ZW0gewotCSAgCi0JICBBcmMgYXJjOwotCSAgYm9vbGVhbiBsb29wRmxhZzsKLQkgIGJvb2xlYW4gaXNWaXNpdGVkOwotCSAgCi0JICBwdWJsaWMgQXJjU3RhY2tJdGVtKEFyYyBhcmMsIGJvb2xlYW4gbG9vcGZsYWcpIHsKLQkJICB0aGlzLmFyYyA9IGFyYzsKLQkJICB0aGlzLmxvb3BGbGFnID0gbG9vcGZsYWc7Ci0JCSAgdGhpcy5pc1Zpc2l0ZWQgPSBhcmMgPT0gbnVsbDsKLQkgIH0KLQotICB9Ci0KLQotICAvKioKLSAgICoKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgRWxlbWVudExpc3QgY3JlYXRlRWxlbWVudExpc3QoaW50IGNvbnRlbnRUeXBlLCBMaXN0IHYsIEVsZW1lbnRDb250ZW50Q29tcGFyYXRvciBjb21wYXJhdG9yLCBSZXN1bHQgcmVzdWx0KQotICB7Ci0gICAgRWxlbWVudExpc3QgZmlyc3QgPSBudWxsOwotICAgIEVsZW1lbnRMaXN0IHByZXYgPSBudWxsOwotCi0gICAgaW50IHNpemUgPSB2LnNpemUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IHYuZ2V0KGkpOwotICAgICAgaWYgKG8gIT0gbnVsbCAmJiAhY29tcGFyYXRvci5pc0lnbm9yYWJsZShvKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNvbXBhcmF0b3IuaXNFbGVtZW50KG8pKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudExpc3QgbGlzdCA9IG5ldyBFbGVtZW50TGlzdCgpOwotICAgICAgICAgIGxpc3QuaGVhZCA9IG87Ci0KLSAgICAgICAgICBpZiAocHJldiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByZXYudGFpbCA9IGxpc3Q7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmaXJzdCA9IGxpc3Q7Ci0gICAgICAgICAgfQotICAgICAgICAgIHByZXYgPSBsaXN0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQuaXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIHJlc3VsdC5lcnJvckluZGV4ID0gaTsKLSAgICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlID0gIkVsZW1lbnQgY2FuIG5vdCBpbmNsdWRlIFBDREFUQSBjb250ZW50IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmaXJzdDsKLSAgfQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgZWxlbWVudENvbnRlbnQsIEVsZW1lbnRDb250ZW50Q29tcGFyYXRvciBjb21wYXJhdG9yLCBSZXN1bHQgcmVzdWx0KQotICB7Ci0gICAgaW50IGNvbnRlbnRUeXBlID0gZWQuZ2V0Q29udGVudFR5cGUoKTsKLQotICAgIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCB8fAotICAgICAgICBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UKQotICAgIHsKLSAgICAgIEVsZW1lbnRMaXN0IGVsZW1lbnRMaXN0ID0gY3JlYXRlRWxlbWVudExpc3QoY29udGVudFR5cGUsIGVsZW1lbnRDb250ZW50LCBjb21wYXJhdG9yLCByZXN1bHQpOwotICAgICAgaWYgKHJlc3VsdC5pc1ZhbGlkID09IHRydWUpCi0gICAgICB7ICAKLSAgICAgICAgICBib29sZWFuIGlzR3JhcGhWYWxpZGF0aW9uTmVlZGVkID0gIShlbGVtZW50TGlzdCA9PSBudWxsICYmIGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEKTsKLSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAvLyBleHBsaWNpdGx5IGhhbmRsZSAnQWxsJyBncm91cHMKLSAgICAgICAgICAvLwotICAgICAgICAgIENNQ29udGVudCBjb250ZW50ID0gZWQuZ2V0Q29udGVudCgpOwotICAgICAgICAgIGlmIChjb250ZW50ICE9IG51bGwgJiYgY29udGVudC5nZXROb2RlVHlwZSgpID09IENNTm9kZS5HUk9VUCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDTUdyb3VwIGdyb3VwID0gKENNR3JvdXApY29udGVudDsKLSAgICAgICAgICAgIGlmIChncm91cC5nZXRPcGVyYXRvcigpID09IENNR3JvdXAuQUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpc0dyYXBoVmFsaWRhdGlvbk5lZWRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICB2YWxpZGF0QWxsR3JvdXBDb250ZW50KGVsZW1lbnRDb250ZW50LCBjb21wYXJhdG9yLCBncm91cCwgcmVzdWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9ICAgICAgICAgICAgICAKLSAgICAgICAgICB9ICAKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoaXNHcmFwaFZhbGlkYXRpb25OZWVkZWQpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gdmFsaWRhdGUgdGhlIGVsZW1lbnRMaXN0IHVzaW5nIGEgZ3JhcGgKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICByZXN1bHQuaXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgR3JhcGhOb2RlIG5vZGUgPSBsb29rdXBPckNyZWF0ZUdyYXBoKGVkKTsKLSAgICAgICAgICAgIHZhbGlkYXRlRWxlbWVudExpc3QoZWxlbWVudExpc3QsIG5vZGUsIGNvbXBhcmF0b3IsIHJlc3VsdCwgZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBKQotICAgIHsKLSAgICAgIGludCBzaXplID0gZWxlbWVudENvbnRlbnQuc2l6ZSgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gZWxlbWVudENvbnRlbnQuZ2V0KGkpOwotICAgICAgICBpZiAoY29tcGFyYXRvci5pc0VsZW1lbnQobykpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQuaXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIHJlc3VsdC5lcnJvckluZGV4ID0gaTsKLSAgICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlID0gIkVsZW1lbnQgbWF5IG9ubHkgaW5jbHVkZSBQQ0RBVEEgY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkKLSAgICB7Ci0gICAgICBpbnQgc2l6ZSA9IGVsZW1lbnRDb250ZW50LnNpemUoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGVsZW1lbnRDb250ZW50LmdldChpKTsKLSAgICAgICAgaWYgKCFjb21wYXJhdG9yLmlzSWdub3JhYmxlKG8pKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmlzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICByZXN1bHQuZXJyb3JJbmRleCA9IGk7Ci0gICAgICAgICAgcmVzdWx0LmVycm9yTWVzc2FnZSA9ICJFbGVtZW50IG1heSBub3QgY29udGFpbiBQQ0RBVEEgb3IgRWxlbWVudCBjb250ZW50IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vZWxzZSBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKQotICAgIC8vIHsKLSAgICAvLyAgIGFzc3VtZSBlbGVtZW50Q29udGVudCB3aWxsIGFsd2F5cyBiZSB2YWxpZCBmb3IgdGhpcyBjb250ZW50IHR5cGUKLSAgICAvLyB9Ci0gIH0KLSAgICAKLSAgc3RhdGljIGNsYXNzIEl0ZW1Db3VudAotICB7Ci0gICAgaW50IGNvdW50ID0gMDsgICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB2YWxpZGF0QWxsR3JvdXBDb250ZW50KExpc3QgZWxlbWVudENvbnRlbnQsIEVsZW1lbnRDb250ZW50Q29tcGFyYXRvciBjb21wYXJhdG9yLCBDTUdyb3VwIGFsbEdyb3VwLCBSZXN1bHQgcmVzdWx0KSAKLSAgewotICAgIGJvb2xlYW4gaXNWYWxpZCA9IHRydWU7Ci0gICAgYm9vbGVhbiBpc1BhcnRpYWxseVZhbGlkID0gdHJ1ZTsKLSAgICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgQ01Ob2RlTGlzdCBsaXN0ID0gYWxsR3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotICAgIGZvciAoaW50IGogPSBsaXN0LmdldExlbmd0aCgpIC0gMTsgaiA+PSAwOyBqLS0pCi0gICAgewotICAgICAgQ01Ob2RlIG5vZGUgPSBsaXN0Lml0ZW0oaik7ICAgICAgCi0gICAgICBpZiAobWFwLmdldChub2RlKSA9PSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIG1hcC5wdXQobm9kZSwgbmV3IEl0ZW1Db3VudCgpKTsKLSAgICAgIH0gIAotICAgIH0gICAgCi0gICAgaW50IHZhbGlkaXRpb25Db3VudCA9IDA7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZWxlbWVudENvbnRlbnQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IHZhbGlkaXRpb25Db3VudCsrKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7ICAgICAgICAKLSAgICAgIGlmIChjb21wYXJhdG9yLmlzRWxlbWVudChvKSkKLSAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICAvLyB0ZXN0IHRvIHNlZSBpZiB0aGUgZWxlbWVudCBpcyBsaXN0ZWQgaW4gdGhlIGFsbCBncm91cAotICAgICAgICAvLwotICAgICAgICBDTU5vZGUgbWF0Y2hpbmdDTU5vZGUgPSBudWxsOwotICAgICAgICBmb3IgKGludCBqID0gbGlzdC5nZXRMZW5ndGgoKSAtIDE7IGogPj0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgQ01Ob2RlIG5vZGUgPSBsaXN0Lml0ZW0oaik7Ci0gICAgICAgICAgaWYgKGNvbXBhcmF0b3IubWF0Y2hlcyhvLCBub2RlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaGluZ0NNTm9kZSA9IG5vZGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9ICAgICAgICAgICAgIAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChtYXRjaGluZ0NNTm9kZSA9PSBudWxsKQotICAgICAgICB7ICAgICAKLSAgICAgICAgICBpc1BhcnRpYWxseVZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeyAgCi0gICAgICAgICAgLy8gdGVzdCB0byBzZWUgdGhhdCB0aGUgZWxlbWVudCBvY2N1cnMgb25seSBvbmNlCi0gICAgICAgICAgLy8KLSAgICAgICAgICBJdGVtQ291bnQgaXRlbUNvdW50ID0gKEl0ZW1Db3VudCltYXAuZ2V0KG1hdGNoaW5nQ01Ob2RlKTsKLSAgICAgICAgICBpZiAoaXRlbUNvdW50ICE9IG51bGwpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICBpZiAoaXRlbUNvdW50LmNvdW50ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBhbGxvdyB0b28gbWFueSBlbGVtZW50cyEKLSAgICAgICAgICAgICAgLy8gd2UgY29uc2lkZXIgJ25vdCBlbm91Z2gnIHRvIGJlIHBhcnRpYWxseSB2YWxpZC4uLiBidXQgbm90ICd0b28gbWFueScKLSAgICAgICAgICAgICAgaXNQYXJ0aWFsbHlWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpdGVtQ291bnQuY291bnQrKzsKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgICB9ICAKLSAgICB9Ci0gICAgaWYgKGlzVmFsaWQpCi0gICAgeyAgCi0gICAgICBmb3IgKGludCBqID0gbGlzdC5nZXRMZW5ndGgoKSAtIDE7IGogPj0gMDsgai0tKQotICAgICAgewotICAgICAgICBDTU5vZGUgbm9kZSA9IGxpc3QuaXRlbShqKTsgICAgICAKLSAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLSAgICAgICAgeyAgCi0gICAgICAgICAgQ01Db250ZW50IGNvbnRlbnQgPSAoQ01Db250ZW50KW5vZGU7Ci0gICAgICAgICAgSXRlbUNvdW50IGl0ZW1Db3VudCA9IChJdGVtQ291bnQpbWFwLmdldChub2RlKTsKLS8vICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoImNvbnRlbnQgIiArIGNvbnRlbnQuZ2V0Tm9kZU5hbWUoKSArICIgIiArIGNvbnRlbnQuZ2V0TWluT2NjdXIoKSk7Ci0gICAgICAgICAgaWYgKGl0ZW1Db3VudC5jb3VudCA8IGNvbnRlbnQuZ2V0TWluT2NjdXIoKSkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gIAotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVsZW1lbnRQYXRoUmVjb3JkaW5nUmVzdWx0ICYmIGlzUGFydGlhbGx5VmFsaWQpCi0gICAgewotICAgICAgKChFbGVtZW50UGF0aFJlY29yZGluZ1Jlc3VsdClyZXN1bHQpLnNldFBhcnRpYWxWYWxpZGF0aW9uQ291bnQodmFsaWRpdGlvbkNvdW50KTsKLSAgICB9ICAKLSAgICByZXN1bHQuaXNWYWxpZCA9IGlzVmFsaWQ7Ci0gIH0gIAotICAKLSAgCi0gIHB1YmxpYyB2b2lkIGdldE9yaWdpbkFycmF5KENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGVsZW1lbnRDb250ZW50LCBFbGVtZW50Q29udGVudENvbXBhcmF0b3IgY29tcGFyYXRvciwgRWxlbWVudFBhdGhSZWNvcmRpbmdSZXN1bHQgcmVzdWx0KQotICB7Ci0gICAgQ01Ob2RlW10gY21Ob2RlQXJyYXkgPSBudWxsOwotICAgIHZhbGlkYXRlKGVkLCBlbGVtZW50Q29udGVudCwgY29tcGFyYXRvciwgcmVzdWx0KTsKLSAgICBpZiAocmVzdWx0LmlzVmFsaWQpCi0gICAgewotICAgICAgQ01EYXRhVHlwZSBkYXRhVHlwZSA9IGVkLmdldERhdGFUeXBlKCk7Ci0gICAgICBpbnQgc2l6ZSA9IGVsZW1lbnRDb250ZW50LnNpemUoKTsKLSAgICAgIGNtTm9kZUFycmF5ID0gbmV3IENNTm9kZVtzaXplXTsKLSAgICAgIFZlY3RvciBvcmlnaW5MaXN0ID0gcmVzdWx0LmdldEVsZW1lbnRPcmlnaW5MaXN0KCk7Ci0gICAgICBpbnQgb3JpZ2luTGlzdFNpemUgPSBvcmlnaW5MaXN0LnNpemUoKTsgCi0gICAgICBpbnQgb3JpZ2luTGlzdEluZGV4ID0gMDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGVsZW1lbnRDb250ZW50LmdldChpKTsKLSAgICAgICAgaWYgKGNvbXBhcmF0b3IuaXNFbGVtZW50KG8pKQotICAgICAgICB7ICAgICAKLSAgICAgICAgICBpZiAob3JpZ2luTGlzdEluZGV4IDwgb3JpZ2luTGlzdFNpemUpCi0gICAgICAgICAgewotICAgICAgICAgICAgY21Ob2RlQXJyYXlbaV0gPSAoQ01Ob2RlKW9yaWdpbkxpc3QuZ2V0KG9yaWdpbkxpc3RJbmRleCk7Ci0gICAgICAgICAgICBvcmlnaW5MaXN0SW5kZXgrKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29tcGFyYXRvci5pc1BDRGF0YShvKSkKLSAgICAgICAgewotICAgICAgICAgIGNtTm9kZUFycmF5W2ldID0gZGF0YVR5cGU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZWxzZSB0aGUgQ01Ob2RlIGF0IHRoaXMgaW5kZXggaXMgbnVsbAotICAgICAgfQotICAgICAgcmVzdWx0LnNldE9yaWdpbkFycmF5KGNtTm9kZUFycmF5KTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBjb2xsZWN0TmFtZWRBcmNzKEdyYXBoTm9kZSBub2RlLCBMaXN0IG5hbWVkQXJjTGlzdCwgaW50IGluZGVudCkKLSAgewotICAgIC8vcHJpbnRsbkluZGVudGVkKGluZGVudCwgIkdyYXBoTm9kZToiICsgbm9kZS5uYW1lICsgZGVjb3JhdGlvbik7Ci0gICAgaW5kZW50ICs9IDI7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbm9kZS5hcmNMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpIDspCi0gICAgewotICAgICAgQXJjIGFyYyA9IChBcmMpaS5uZXh0KCk7Ci0gICAgICAvL3ByaW50bG5JbmRlbnRlZChpbmRlbnQsICJBcmM6IiArIGFyYy5uYW1lICsgIiAoIiArIGFyYy5raW5kICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuRUxFTUVOVCkKLSAgICAgIHsgCi0gICAgICAgIGlmICghbmFtZWRBcmNMaXN0LmNvbnRhaW5zKGFyYykpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lZEFyY0xpc3QuYWRkKGFyYyk7Ci0gICAgICAgICAgY29sbGVjdE5hbWVkQXJjcyhhcmMubm9kZSwgbmFtZWRBcmNMaXN0LCBpbmRlbnQgKyAyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgIT0gQXJjLlJFUEVBVCAmJiBhcmMua2luZCAhPSBBcmMuT1BUSU9OQUwpCi0gICAgICB7Ci0gICAgICAgIGNvbGxlY3ROYW1lZEFyY3MoYXJjLm5vZGUsIG5hbWVkQXJjTGlzdCwgaW5kZW50ICsgMik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAKLSAgcHJpdmF0ZSBMaXN0IGdldE1hdGNoaW5nQXJjcyhDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgU3RyaW5nIGVsZW1lbnROYW1lKQotICB7Ci0gICAgTGlzdCBhcmNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEdyYXBoTm9kZSBncmFwaE5vZGUgPSBsb29rdXBPckNyZWF0ZUdyYXBoKGVkKTsKLSAgICBpZiAoZWxlbWVudE5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBoZXJlIHdlIGFkZCB0aGUgJ3Jvb3QnIGFyYwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZ3JhcGhOb2RlLmFyY0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCkgOykKLSAgICAgIHsKLSAgICAgICAgQXJjIGFyYyA9IChBcmMpaS5uZXh0KCk7Ci0gICAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuUFJFVl9JTikKLSAgICAgICAgewotICAgICAgICAgIGFyY0xpc3QuYWRkKGFyYyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgeyAKLSAgICAgIExpc3QgbmFtZWRBcmNzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgY29sbGVjdE5hbWVkQXJjcyhncmFwaE5vZGUsIG5hbWVkQXJjcywgMCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuYW1lZEFyY3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQXJjIGFyYyA9IChBcmMpaS5uZXh0KCk7Ci0gICAgICAgIGlmIChhcmMuY21Ob2RlICE9IG51bGwgJiYgZWxlbWVudE5hbWUuZXF1YWxzKGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSkpCi0gICAgICAgIHsgIAotICAgICAgICAgIGFyY0xpc3QuYWRkKGFyYyk7Ci0gICAgICAgIH0gIAotICAgICAgfSAgCi0gICAgfSAgICAgIAotICAgIHJldHVybiBhcmNMaXN0OwotICB9Ci0KLSAgCi0gIHByaXZhdGUgdm9pZCBjb2xsZWN0TmV4dFNpYmxpbmdzKEdyYXBoTm9kZSBub2RlLCBMaXN0IG5leHRTaWJsaW5nTGlzdCwgTGlzdCBuYW1lZEFyY0xpc3QsIExpc3QgdW5hbWVkQXJjTGlzdCwgaW50IGluZGVudCkKLSAgewotICAgIC8vcHJpbnRsbkluZGVudGVkKGluZGVudCwgIkdyYXBoTm9kZToiICsgbm9kZS5uYW1lICsgZGVjb3JhdGlvbik7Ci0gICAgaW5kZW50ICs9IDI7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbm9kZS5hcmNMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQXJjIGFyYyA9IChBcmMpaS5uZXh0KCk7Ci0gICAgICBpZiAoYXJjLmtpbmQgPT0gQXJjLkVMRU1FTlQpCi0gICAgICB7ICAgICAgIAotICAgICAgICBpZiAoIW5hbWVkQXJjTGlzdC5jb250YWlucyhhcmMpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGFyYy5jbU5vZGUgIT0gbnVsbCkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIG5leHRTaWJsaW5nTGlzdC5hZGQoYXJjLmNtTm9kZSk7Ci0gICAgICAgICAgICBpZiAoYXJjLmNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIHx8Ci0gICAgICAgICAgICAgICAgYXJjLmNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BTllfRUxFTUVOVCkKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICAgICAgICBuYW1lZEFyY0xpc3QuYWRkKGFyYyk7Ci0gICAgICAgICAgICAgIENNQ29udGVudCBjbU5vZGUgPSAoQ01Db250ZW50KWFyYy5jbU5vZGU7IAotICAgICAgICAgICAgICBpZiAoY21Ob2RlLmdldE1pbk9jY3VyKCkgPT0gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVuYW1lZEFyY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgY29sbGVjdE5leHRTaWJsaW5ncyhhcmMubm9kZSwgbmV4dFNpYmxpbmdMaXN0LCBuYW1lZEFyY0xpc3QsIHVuYW1lZEFyY0xpc3QsIGluZGVudCArIDIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9ICAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCF1bmFtZWRBcmNMaXN0LmNvbnRhaW5zKGFyYykpCi0gICAgICAgIHsKLSAgICAgICAgICB1bmFtZWRBcmNMaXN0LmFkZChhcmMpOwotICAgICAgICAgIGNvbGxlY3ROZXh0U2libGluZ3MoYXJjLm5vZGUsIG5leHRTaWJsaW5nTGlzdCwgbmFtZWRBcmNMaXN0LCB1bmFtZWRBcmNMaXN0LCBpbmRlbnQgKyAyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gIAotICB9Ci0gICAgCi0gIHB1YmxpYyBDTU5vZGVbXSBnZXROZXh0U2libGluZ3MoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIFN0cmluZyBlbGVtZW50TmFtZSkKLSAgewotICAgIExpc3QgYXJjTGlzdCA9IGdldE1hdGNoaW5nQXJjcyhlZCwgZWxlbWVudE5hbWUpOwotICAgIExpc3QgbmV4dFNpYmxpbmdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGFyY0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBBcmMgYXJjID0gKEFyYylpLm5leHQoKTsKLSAgICAgIGNvbGxlY3ROZXh0U2libGluZ3MoYXJjLm5vZGUsIG5leHRTaWJsaW5nTGlzdCwgbmV3IEFycmF5TGlzdCgpLCBuZXcgQXJyYXlMaXN0KCksIDApOyAgICAgIAotICAgIH0gIAotICAgIENNTm9kZVtdIHJlc3VsdCA9IG5ldyBDTU5vZGVbbmV4dFNpYmxpbmdMaXN0LnNpemUoKV07Ci0gICAgbmV4dFNpYmxpbmdMaXN0LnRvQXJyYXkocmVzdWx0KTsgICAgCi0gICAgLy9TeXN0ZW0ub3V0LnByaW50KCJnZXROZXh0U2libGluZygiICtlbGVtZW50TmFtZSArICIpIik7Ci0gICAgLy9mb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKLSAgICAvL3sKLSAgICAvLyAgU3lzdGVtLm91dC5wcmludCgiWyIgKyByZXN1bHRbaV0uZ2V0Tm9kZU5hbWUoKSArICJdIik7Ci0gICAgLy99ICAKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzdWx0Ci0gIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLSAgICBwdWJsaWMgaW50IGVycm9ySW5kZXggPSAtMTsKLSAgICBwdWJsaWMgU3RyaW5nIGVycm9yTWVzc2FnZTsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGVhdFRyYXZlcnNlZDsgLy8gZGV0ZWN0cyBpZiBhIHJlcGVhdCBoYXMgYmVlbiB0cmF2ZXJzZWQKLQotICAgIHB1YmxpYyBib29sZWFuIGNhblB1c2goQXJjIGFyYykKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHVzaChBcmMgYXJjKQotICAgIHsKLSAgICAgIC8vIG92ZXJpZGUgdGhpcyBtZXRob2QgdG8gcmVjb3JkIHRyYXZlcnNlZCBub2RlcwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBwb3AoQXJjIGFyYykKLSAgICB7Ci0gICAgICAvLyBvdmVyaWRlIHRoaXMgbWV0aG9kIHRvIHJlY29yZCB0cmF2ZXJzZWQgbm9kZXMKLSAgICB9Ci0gICAgcHVibGljIENNTm9kZVtdIGdldE9yaWdpbkFycmF5KCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgRWxlbWVudFBhdGhSZWNvcmRpbmdSZXN1bHQgZXh0ZW5kcyBSZXN1bHQKLSAgeyAgCi0gICAgcHJvdGVjdGVkIExpc3QgYWN0aXZlSXRlbUNvdW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcm90ZWN0ZWQgTGlzdCBpbmFjdGl2ZUl0ZW1Db3VudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAgIAotICAgIHByb3RlY3RlZCBWZWN0b3IgZWxlbWVudE9yaWdpblN0YWNrID0gbmV3IFZlY3RvcigpOwotICAgIHByb3RlY3RlZCBDTU5vZGVbXSBvcmlnaW5BcnJheSA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIGludCBwYXJ0aWFsVmFsaWRhdGlvbkNvdW50ID0gMDsKLQotICAgIAotICAgIC8vIHRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc3VwcG9ydCBmYWNldCBjb3VudHMKLSAgICAvLwotICAgIHB1YmxpYyBib29sZWFuIGNhblB1c2goQXJjIGFyYykKLSAgICB7ICAgICAKLSAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsgICAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7ICAgICAgICAKLSAgICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5SRVBFQVQpCi0gICAgICAgIHsgICAgICAgICAgCi0gICAgICAgICAgaWYgKGFyYy5jbU5vZGUgaW5zdGFuY2VvZiBDTUNvbnRlbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ01Db250ZW50IGNvbnRlbnQgPSAoQ01Db250ZW50KWFyYy5jbU5vZGU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHdlIG9ubHkgbmVlZCB0byBkbyAnc3BlY2lhbCcgZmFjZXQgY2hlY2tpbmcgaWYgdGhlIG1heE9jY3VycyBpcyA+IDEKLSAgICAgICAgICAgIC8vIHZhbHVlcyBvZiAnMCcgYW5kICctMScgKHVuYm91bmRlZCkgd29yayAnZm9yIGZyZWUnIHdpdGhvdXQgYW55IHNwZWNpYWwgY2hlY2tpbmcKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBpZiAoY29udGVudC5nZXRNYXhPY2N1cigpID4gMSkKLSAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICBJdGVtQ291bnQgaXRlbUNvdW50ID0gKEl0ZW1Db3VudClhY3RpdmVJdGVtQ291bnRMaXN0LmdldChhY3RpdmVJdGVtQ291bnRMaXN0LnNpemUoKSAtIDEpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgLy8gaGVyZSB3ZSBuZWVkIHRvIGNvbXB1dGUgaWYgd2UgY2FuIGRvIGFub3RoZXIgcmVwZWF0Ci0gICAgICAgICAgICAgIC8vIGlmIHdlIGluY3JlYXNlIHRoZSByZXBlYXQgY291bnQgYnkgJzEnIHdpbGwgdGhpcyB2aW9sYXRlIHRoZSBtYXhPY2N1cnMKLSAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgaWYgKGl0ZW1Db3VudC5jb3VudCArIDEgPj0gY29udGVudC5nZXRNYXhPY2N1cigpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJjYW5QdXNoIFJFUEVBVCAoIiArIGl0ZW1Db3VudC5jb3VudCArICIpIiArIGNvbnRlbnQuZ2V0Tm9kZU5hbWUoKSArICIgcmVzdWx0PSAiICsgcmVzdWx0KTsgICAgICAgICAgICAKLSAgICAgICAgICB9IAotICAgICAgICB9ICAgICAgIAotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgICAgLy9TeXN0ZW0ub3V0LmZsdXNoKCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwdXNoKEFyYyBhcmMpCi0gICAgewotICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5FTEVNRU5UKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiW1hdcHVzaCgiICsgYXJjLmtpbmQgKyAiKSIgKyBhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBlbGVtZW50T3JpZ2luU3RhY2suYWRkKGFyYy5jbU5vZGUpOwotICAgICAgICBwYXJ0aWFsVmFsaWRhdGlvbkNvdW50ID0gTWF0aC5tYXgoZWxlbWVudE9yaWdpblN0YWNrLnNpemUoKSwgcGFydGlhbFZhbGlkYXRpb25Db3VudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuUFJFVl9JTikKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIltYXXB1c2goIiArIGFyYy5raW5kICsgIikiICsgYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgYWN0aXZlSXRlbUNvdW50TGlzdC5hZGQobmV3IEl0ZW1Db3VudCgpKTsgICAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5PVVRfTkVYVCkKLSAgICAgIHsgICAgICAgIAotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiW1hdcHVzaCgiICsgYXJjLmtpbmQgKyAiKSIgKyBhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkgKyAiWyIgKyBhcmMgKyAiXSIpOwotICAgICAgICBpbnQgc2l6ZSA9IGFjdGl2ZUl0ZW1Db3VudExpc3Quc2l6ZSgpOwotICAgICAgICBJdGVtQ291bnQgaXRlbUNvdW50ID0gKEl0ZW1Db3VudClhY3RpdmVJdGVtQ291bnRMaXN0LmdldChzaXplIC0gMSk7Ci0gICAgICAgIGFjdGl2ZUl0ZW1Db3VudExpc3QucmVtb3ZlKHNpemUgLSAxKTsKLSAgICAgICAgaW5hY3RpdmVJdGVtQ291bnRMaXN0LmFkZChpdGVtQ291bnQpOyAKLSAgICAgIH0gICAgICAKLSAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5SRVBFQVQpCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJbWF1wdXNoKCIgKyBhcmMua2luZCArICIpIiArIGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIEl0ZW1Db3VudCBpdGVtQ291bnQgPSAoSXRlbUNvdW50KWFjdGl2ZUl0ZW1Db3VudExpc3QuZ2V0KGFjdGl2ZUl0ZW1Db3VudExpc3Quc2l6ZSgpIC0gMSk7Ci0gICAgICAgIGl0ZW1Db3VudC5jb3VudCsrOwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicmVwZWF0KCIgKyBpdGVtQ291bnQuY291bnQgKyAiKSIgKyBhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgfSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wKEFyYyBhcmMpCi0gICAgewotICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5FTEVNRU5UKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiW1hdcG9wKCIgKyBhcmMua2luZCArICIpIiArIGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIGludCBzaXplID0gZWxlbWVudE9yaWdpblN0YWNrLnNpemUoKTsKLSAgICAgICAgZWxlbWVudE9yaWdpblN0YWNrLnJlbW92ZShzaXplIC0gMSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuUFJFVl9JTikKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIltYXXBvcCgiICsgYXJjLmtpbmQgKyAiKSIgKyBhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBhY3RpdmVJdGVtQ291bnRMaXN0LnJlbW92ZShhY3RpdmVJdGVtQ291bnRMaXN0LnNpemUoKSAtIDEpOyAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuT1VUX05FWFQpCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJbWF1wb3AoIiArIGFyYy5raW5kICsgIikiICsgYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgaW50IHNpemUgPSBpbmFjdGl2ZUl0ZW1Db3VudExpc3Quc2l6ZSgpOwotICAgICAgICBJdGVtQ291bnQgaXRlbUNvdW50ID0gKEl0ZW1Db3VudClpbmFjdGl2ZUl0ZW1Db3VudExpc3QuZ2V0KHNpemUgLSAxKTsKLSAgICAgICAgaW5hY3RpdmVJdGVtQ291bnRMaXN0LnJlbW92ZShzaXplIC0gMSk7Ci0gICAgICAgIGFjdGl2ZUl0ZW1Db3VudExpc3QuYWRkKGl0ZW1Db3VudCk7ICAgICAKLSAgICAgIH0gIAotICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLlJFUEVBVCkKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIltYXXBvcCgiICsgYXJjLmtpbmQgKyAiKSIgKyBhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBJdGVtQ291bnQgaXRlbUNvdW50ID0gKEl0ZW1Db3VudClhY3RpdmVJdGVtQ291bnRMaXN0LmdldChhY3RpdmVJdGVtQ291bnRMaXN0LnNpemUoKSAtIDEpOwotICAgICAgICBpdGVtQ291bnQuY291bnQtLTsKLSAgICAgIH0gICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBWZWN0b3IgZ2V0RWxlbWVudE9yaWdpbkxpc3QoKQotICAgIHsKLSAgICAgIHJldHVybiBlbGVtZW50T3JpZ2luU3RhY2s7Ci0gICAgfQotCi0gICAgcHVibGljIENNTm9kZVtdIGdldE9yaWdpbkFycmF5KCkKLSAgICB7Ci0gICAgICByZXR1cm4gb3JpZ2luQXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3JpZ2luQXJyYXkoQ01Ob2RlW10gb3JpZ2luQXJyYXkpCi0gICAgewotICAgICAgdGhpcy5vcmlnaW5BcnJheSA9IG9yaWdpbkFycmF5OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFBhcnRpYWxWYWxpZGF0aW9uQ291bnQoKQotICAgIHsKLSAgICAgIHJldHVybiBwYXJ0aWFsVmFsaWRhdGlvbkNvdW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcnRpYWxWYWxpZGF0aW9uQ291bnQoaW50IHBhcnRpYWxWYWxpZGF0aW9uQ291bnQpCi0gICAgewotICAgICAgdGhpcy5wYXJ0aWFsVmFsaWRhdGlvbkNvdW50ID0gcGFydGlhbFZhbGlkYXRpb25Db3VudDsKLSAgICB9Ci0gIH0gIAotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXRoUmVjb3JkaW5nUmVzdWx0IGV4dGVuZHMgUmVzdWx0Ci0gIHsKLSAgICBwcm90ZWN0ZWQgVmVjdG9yIGFyY0xpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXNoKEFyYyBhcmMpCi0gICAgewotICAgICAgYXJjTGlzdC5hZGQoYXJjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3AoQXJjIGFyYykKLSAgICB7Ci0gICAgICBpbnQgc2l6ZSA9IGFyY0xpc3Quc2l6ZSgpOwotICAgICAgYXJjTGlzdC5yZW1vdmUoc2l6ZSAtIDEpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldEFyY0xpc3QoKQotICAgIHsKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhcmNMaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBBcmMgYXJjID0gKEFyYylpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGFyYyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBNYXRjaE1vZGVsTm9kZSBnZXRNYXRjaE1vZGVsKCkKLSAgICB7Ci0gICAgICBNYXRjaE1vZGVsTm9kZUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNYXRjaE1vZGVsTm9kZUJ1aWxkZXIoYXJjTGlzdCk7Ci0gICAgICBidWlsZGVyLmJ1aWxkTWF0Y2hNb2RlbCgpOwotICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0Um9vdCgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXRjaE1vZGVsTm9kZQotICB7Ci0gICAgcHVibGljIENNTm9kZSBjbU5vZGU7Ci0gICAgcHVibGljIExpc3QgY2hpbGRyZW4gPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHVibGljIE9iamVjdCBkYXRhOwotCi0gICAgcHVibGljIE1hdGNoTW9kZWxOb2RlKE1hdGNoTW9kZWxOb2RlIHBhcmVudCwgQ01Ob2RlIGNtTm9kZSkKLSAgICB7Ci0gICAgICB0aGlzLmNtTm9kZSA9IGNtTm9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmludE1vZGVsKGludCBpbmRlbnQpCi0gICAgewotICAgICAgLy9TdHJpbmcgY21Ob2RlTmFtZSA9IGNtTm9kZSAhPSBudWxsID8gY21Ob2RlLmdldE5vZGVOYW1lKCkgOiAibnVsbCI7Ci0gICAgICAvL3ByaW50bG5JbmRlbnRlZChpbmRlbnQsICJNYXRjaE1vZGVsTm9kZSA6ICIgKyBjbU5vZGVOYW1lKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgTWF0Y2hNb2RlbE5vZGUgY2hpbGQgPSAoTWF0Y2hNb2RlbE5vZGUpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBjaGlsZC5wcmludE1vZGVsKGluZGVudCArIDIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWF0Y2hNb2RlbE5vZGVCdWlsZGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgTGlzdCBhcmNMaXN0OwotICAgIHByb3RlY3RlZCBMaXN0IHN0YWNrID0gbmV3IFZlY3RvcigpOwotICAgIHByb3RlY3RlZCBNYXRjaE1vZGVsTm9kZSByb290OwotICAgIHByb3RlY3RlZCBNYXRjaE1vZGVsTm9kZSBjdXJyZW50OwotCi0gICAgcHVibGljIE1hdGNoTW9kZWxOb2RlQnVpbGRlcihMaXN0IGFyY0xpc3QpCi0gICAgewotICAgICAgdGhpcy5hcmNMaXN0ID0gYXJjTGlzdDsKLSAgICAgIHJvb3QgPSBuZXcgTWF0Y2hNb2RlbE5vZGUobnVsbCwgbnVsbCk7Ci0gICAgICBwdXNoKHJvb3QpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHB1c2goTWF0Y2hNb2RlbE5vZGUgbm9kZSkKLSAgICB7Ci0gICAgICBjdXJyZW50ID0gbm9kZTsKLSAgICAgIHN0YWNrLmFkZChub2RlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3AoKQotICAgIHsKLSAgICAgIGludCBzaXplID0gc3RhY2suc2l6ZSgpOwotICAgICAgc3RhY2sucmVtb3ZlKHNpemUgLSAxKTsKLSAgICAgIGN1cnJlbnQgPSAoTWF0Y2hNb2RlbE5vZGUpc3RhY2suZ2V0KHNpemUgLSAyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NNR3JvdXAoQ01Ob2RlIGNtTm9kZSkKLSAgICB7Ci0gICAgICByZXR1cm4gY21Ob2RlICE9IG51bGwgJiYgY21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkdST1VQOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJ1aWxkTWF0Y2hNb2RlbCgpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFyY0xpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEFyYyBhcmMgPSAoQXJjKWl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICBpZiAoYXJjLmtpbmQgPT0gQXJjLkVMRU1FTlQpCi0gICAgICAgIHsKLSAgICAgICAgICBjdXJyZW50LmNoaWxkcmVuLmFkZChuZXcgTWF0Y2hNb2RlbE5vZGUoY3VycmVudCwgYXJjLmNtTm9kZSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5QUkVWX0lOKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzQ01Hcm91cChhcmMuY21Ob2RlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBNYXRjaE1vZGVsTm9kZSBuZXdNb2RlbE5vZGUgPSBuZXcgTWF0Y2hNb2RlbE5vZGUoY3VycmVudCwgYXJjLmNtTm9kZSk7Ci0gICAgICAgICAgICBjdXJyZW50LmNoaWxkcmVuLmFkZChuZXdNb2RlbE5vZGUpOwotICAgICAgICAgICAgcHVzaChuZXdNb2RlbE5vZGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuT1VUX05FWFQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNDTUdyb3VwKGFyYy5jbU5vZGUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBvcCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuUkVQRUFUKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzQ01Hcm91cChhcmMuY21Ob2RlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwb3AoKTsKLSAgICAgICAgICAgIE1hdGNoTW9kZWxOb2RlIG5ld01vZGVsTm9kZSA9IG5ldyBNYXRjaE1vZGVsTm9kZShjdXJyZW50LCBhcmMuY21Ob2RlKTsKLSAgICAgICAgICAgIGN1cnJlbnQuY2hpbGRyZW4uYWRkKG5ld01vZGVsTm9kZSk7Ci0gICAgICAgICAgICBwdXNoKG5ld01vZGVsTm9kZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1hdGNoTW9kZWxOb2RlIGdldFJvb3QoKQotICAgIHsKLSAgICAgIHJldHVybiByb290OwotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnRDb250ZW50Q29tcGFyYXRvcgotICB7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmFibGUoT2JqZWN0IG8pOwotICAgIHB1YmxpYyBib29sZWFuIGlzUENEYXRhKE9iamVjdCBvKTsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnQoT2JqZWN0IG8pOwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoT2JqZWN0IG8sIENNTm9kZSBjbU5vZGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgbGlua2VkIGxpc3QKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgRWxlbWVudExpc3QKLSAgewotICAgIHByb3RlY3RlZCBPYmplY3QgaGVhZDsKLSAgICBwcm90ZWN0ZWQgRWxlbWVudExpc3QgdGFpbDsKLQotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudExpc3QgY3JlYXRlKExpc3QgdikKLSAgICB7Ci0gICAgICBFbGVtZW50TGlzdCBmaXJzdCA9IG51bGw7Ci0gICAgICBFbGVtZW50TGlzdCBwcmV2ID0gbnVsbDsKLQotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHYuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBpZiAobyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudExpc3QgbGlzdCA9IG5ldyBFbGVtZW50TGlzdCgpOwotICAgICAgICAgIGxpc3QuaGVhZCA9IG87Ci0KLSAgICAgICAgICBpZiAocHJldiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByZXYudGFpbCA9IGxpc3Q7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmaXJzdCA9IGxpc3Q7Ci0gICAgICAgICAgfQotICAgICAgICAgIHByZXYgPSBsaXN0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmlyc3Q7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyaW5nID0gIlsiICsgaGVhZCArICJdLCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICBpZiAodGFpbCAhPSBudWxsKQotICAgICAgewotICAgICAgICBzdHJpbmcgKz0gdGFpbC50b1N0cmluZygpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gc3RyaW5nOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdHJpbmdFbGVtZW50Q29udGVudENvbXBhcmF0b3IKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyaW5nRWxlbWVudENvbnRlbnRDb21wYXJhdG9yIGltcGxlbWVudHMgRWxlbWVudENvbnRlbnRDb21wYXJhdG9yCi0gIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0lnbm9yYWJsZShPYmplY3QgbykKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyaW5nID0gby50b1N0cmluZygpOwotICAgICAgcmV0dXJuIHN0cmluZy5zdGFydHNXaXRoKCIhIikgfHwgc3RyaW5nLnN0YXJ0c1dpdGgoIj8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQQ0RhdGEoT2JqZWN0IG8pCi0gICAgewotICAgICAgU3RyaW5nIHN0cmluZyA9IG8udG9TdHJpbmcoKTsKLSAgICAgIHJldHVybiBzdHJpbmcuc3RhcnRzV2l0aCgiJyIpIHx8IHN0cmluZy5zdGFydHNXaXRoKCJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnQoT2JqZWN0IG8pCi0gICAgewotICAgICAgcmV0dXJuICFpc0lnbm9yYWJsZShvKSAmJiAhaXNQQ0RhdGEobyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgbywgQ01Ob2RlIGNtTm9kZSkKLSAgICB7Ci0gICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgaWYgKGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotICAgICAgeyAKLSAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbiljbU5vZGU7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gby50b1N0cmluZygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoIl0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsgICAgICAgIAotCi0gICAgICAgIC8vIFRPRE8uLi4gaGVyZSdzIHdlIGNvbnNpZGVyIHN1YnN0aXR1dGlvbiBncm91cHMuLi4gcmV2aXNpdCB0byBzZWUgaWYgdGhpcyBzaG91bGQgYmUgbW92ZWQgaW50byB2YWxpZGF0b3IgY29kZQotICAgICAgICBpZiAoIXJlc3VsdCkKLSAgICAgICAgewotICAgICAgICAgIENNTm9kZUxpc3QgY21Ob2RlTGlzdCA9IChDTU5vZGVMaXN0KWVsZW1lbnQuZ2V0UHJvcGVydHkoIlN1YnN0aXR1dGlvbkdyb3VwIik7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChjbU5vZGVMaXN0ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW50IGNtTm9kZUxpc3RMZW5ndGggPSBjbU5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgICAgICAgICAgaWYgKGNtTm9kZUxpc3RMZW5ndGggPiAxKQotICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNtTm9kZUxpc3RMZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGFsdGVybmF0aXZlQ01FbGVtZW50RGVjbGFyYXRpb24gPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Ob2RlTGlzdC5pdGVtKGkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBhbHROYW1lID0gYWx0ZXJuYXRpdmVDTUVsZW1lbnREZWNsYXJhdGlvbi5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5hbWUuZXF1YWxzSWdub3JlQ2FzZShhbHROYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgIAotICAgICAgfSAgIAotICAgICAgZWxzZSBpZiAoY21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFOWV9FTEVNRU5UKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFN0cmluZyBzdHJpbmcgPSBvLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmIChzdHJpbmcuZXF1YWxzKCIqIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgQ01BbnlFbGVtZW50IGFueUVsZW1lbnQgPSAoQ01BbnlFbGVtZW50KWNtTm9kZTsKLSAgICAgICAgICBTdHJpbmcgYW55RWxlbWVudFVSSSA9IGFueUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7ICAgIAotICAgICAgICAgIGlmIChhbnlFbGVtZW50VVJJICE9IG51bGwpCi0gICAgICAgICAgeyAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoYW55RWxlbWVudFVSSS5lcXVhbHMoIiMjYW55IikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChhbnlFbGVtZW50VVJJLmVxdWFscygiIyNvdGhlciIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB7ICAgICAKLSAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsgICAgCi0gICAgICAgICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWFueUVsZW1lbnQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXhjbHVkZWRVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGlmIChleGNsdWRlZFVSSSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgICBTdHJpbmcgc3BlY2lmaWVkVVJJID0gZ2V0VVJJRm9yQ29udGVudFNwZWNpZmljYXRpb24oc3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgIGlmIChzcGVjaWZpZWRVUkkgIT0gbnVsbCAmJiBleGNsdWRlZFVSSS5lcXVhbHMoc3BlY2lmaWVkVVJJKSkKLSAgICAgICAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBlbHNlIGlmIChhbnlFbGVtZW50VVJJLmVxdWFscygiIyN0YXJnZXROYW1lc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudClhbnlFbGVtZW50LmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgICAgICAgICAgICB7ICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlVVJJID0gKFN0cmluZyljbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3BlY2lmaWVkVVJJID0gZ2V0VVJJRm9yQ29udGVudFNwZWNpZmljYXRpb24oc3RyaW5nKTsKLSAgICAgICAgICAgICAgICBpZiAoc3BlY2lmaWVkVVJJICE9IG51bGwgJiYgIXRhcmdldE5hbWVzcGFjZVVSSS5lcXVhbHMoc3BlY2lmaWVkVVJJKSkKLSAgICAgICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAgCi0gICAgICAgICAgICB7ICAgICAgICAKLSAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgU3RyaW5nIHNwZWNpZmllZFVSSSA9IGdldFVSSUZvckNvbnRlbnRTcGVjaWZpY2F0aW9uKHN0cmluZyk7Ci0gICAgICAgICAgICAgIGlmIChzcGVjaWZpZWRVUkkgIT0gbnVsbCAmJiAhYW55RWxlbWVudFVSSS5lcXVhbHMoc3BlY2lmaWVkVVJJKSkKLSAgICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfSAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0gIAotICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgfSAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSAgICAgCi0gICAgCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFVSSUZvckNvbnRlbnRTcGVjaWZpY2F0aW9uKFN0cmluZyBzcGVjaWZpY2F0aW9uKQotICAgIHsgICAgICAgICAgIAotICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpbnQgaW5kZXggPSBzcGVjaWZpY2F0aW9uLmluZGV4T2YoIl0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gc3BlY2lmaWNhdGlvbi5zdWJzdHJpbmcoMSwgaW5kZXgpOwotICAgICAgfSAKLSAgICAgIHJldHVybiByZXN1bHQ7ICAKLSAgICB9Ci0gIH0gICAgICAKLQotICBwdWJsaWMgc3RhdGljIExpc3QgY3JlYXRlU3RyaW5nTGlzdChTdHJpbmcgYXJnW10sIGludCBzdGFydEluZGV4KQotICB7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBhcmcubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgdi5hZGQoYXJnW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIHY7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL0RPTVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvRE9NVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMTFhMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvRE9NVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiBBIHNwZWNpYWwgQ01WYWxpZGF0b3IgdGhhdCBrbm93cyBhYm91dCBET01zCi0gKi8KLXB1YmxpYyBjbGFzcyBET01WYWxpZGF0b3IgZXh0ZW5kcyBDTVZhbGlkYXRvcgoteyAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShOb2RlIG5vZGUpCi0gIHsgICAKLSAgICByZXR1cm4gRE9NTmFtZXNwYWNlSGVscGVyLmdldE5hbWVzcGFjZVVSSShub2RlKTsKLSAgICAvL3JldHVybiBub2RlLmdldE5hbWVzcGFjZVVSSSgpOwotICB9Ci0gICAgICAgICAgCi0KLSAgLy8KLSAgLy8gVGhpcyBpcyBhIHRlbXBvcmFyeSBoYWNrISEKLSAgLy8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRGYWxsYmFja05hbWVwYWNlVVJJKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7ICAgCi0gICAgU3RyaW5nIGZhbGxiYWNrTmFtZXBhY2VVUkkgPSBudWxsOwotICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWVkLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGZhbGxiYWNrTmFtZXBhY2VVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgICAvLyROT04tTkxTLTEkCi0gICAgfSAgCi0gICAgcmV0dXJuIGZhbGxiYWNrTmFtZXBhY2VVUkk7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlIHRoZSBFbGVtZW50J3MgTm9kZUxpc3QgYXMgYSBMaXN0IG9mIHN0cmluZ3MgdGhhdCB0aGUgdmFsaWRhdG9yIHJlY29nbml6ZXMKLSAgICovCi0gIHB1YmxpYyBMaXN0IGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBib29sZWFuIGlzTmFtZXNwYWNlQXdhcmUgPSBpc05hbWVzcGFjZUF3YXJlKGVkKTsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsgICAgICAgICAKLSAgICBmb3IgKE5vZGUgY2hpbGROb2RlID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkTm9kZSAhPSBudWxsOyBjaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICB7IAotICAgICAgdi5hZGQoY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb24oY2hpbGROb2RlLCBpc05hbWVzcGFjZUF3YXJlLCBpc05hbWVzcGFjZUF3YXJlID8gZ2V0RmFsbGJhY2tOYW1lcGFjZVVSSShlZCkgOiBudWxsKSk7Ci0gICAgfQotICAgIHJldHVybiB2OwotICB9Ci0KLQotICBwdWJsaWMgTGlzdCBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoTGlzdCBub2RlTGlzdCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsgICAgICAgICAgICAgCi0gICAgYm9vbGVhbiBpc05hbWVzcGFjZUF3YXJlID0gaXNOYW1lc3BhY2VBd2FyZShlZCk7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7ICAgICAgICAgICAgCi0gCi0gICAgZm9yIChJdGVyYXRvciBpID0gbm9kZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSAoTm9kZSlpLm5leHQoKTsKLSAgICAgIHYuYWRkKGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uKG5vZGUsIGlzTmFtZXNwYWNlQXdhcmUsIGdldEZhbGxiYWNrTmFtZXBhY2VVUkkoZWQpKSk7Ci0gICAgfQotICAgIHJldHVybiB2OwotICB9Ci0KLQotICAvKioKLSAgICogRW5jb2RlIHRoZSBOb2RlIGFzIGEgc3RyaW5nIHRoYXQgdGhlIHZhbGlkYXRvciByZWNvZ25pemVzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uKE5vZGUgbm9kZSwgYm9vbGVhbiBpc05hbWVzcGFjZUF3YXJlLCBTdHJpbmcgZmFsbGJhY2tOYW1lcGFjZVVSSSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSAiISI7IC8vJE5PTi1OTFMtMSQKLSAgICBzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkKLSAgICB7Ci0gICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLSAgICAgIHsgIAotICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7ICAKLSAgICAgICAgaWYgKG5vZGVOYW1lLnN0YXJ0c1dpdGgoImpzcDoiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7ICAKLSAgICAgICAgICByZXN1bHQgPSAiISI7IC8vIHRyZWF0IGl0IGFzIGEgY29tbWVudCBzbyB0aGF0IGl0J3MgaWdub3JlZCBieSB0aGUgdmFsaWRhdG9yIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNOYW1lc3BhY2VBd2FyZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VW5wcmVmaXhlZE5hbWUobm9kZU5hbWUpOwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGdldE5hbWVzcGFjZVVSSShub2RlKTsKLSAgICAgICAgICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gIlsiICsgdXJpICsgIl0iICsgcmVzdWx0OyAgICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBlbHNlIGlmIChmYWxsYmFja05hbWVwYWNlVVJJICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9ICJbIiArIGZhbGxiYWNrTmFtZXBhY2VVUkkgKyAiXSIgKyByZXN1bHQ7ICAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgCi0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5vZGVOYW1lOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIC8vQ29udGVudE1vZGVsTWFuYWdlci5wcmludGxuKCJyZXN1bHQgIiArIHJlc3VsdCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9ICI/IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSAiISI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gIlwiIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5URVhUX05PREUgOgotICAgICAgewotICAgICAgICBTdHJpbmcgZGF0YSA9ICgoVGV4dClub2RlKS5nZXREYXRhKCk7Ci0gICAgICAgIC8vIGhlcmUgd2UgdGVzdCB0byBzZWUgaWYgdGhlIHRlc3Qgbm9kZSBpcyAnaWdub3JhYmxlJwotICAgICAgICBpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEudHJpbSgpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9ICJcIiIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAiISI7IC8vIHRvZG8uLi4gdXNlIGFub3RoZXIgc3ltYm9sPyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIExpc3QgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KENNTm9kZSBjbU5vZGUpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgc3dpdGNoIChjbU5vZGUuZ2V0Tm9kZVR5cGUoKSkKLSAgICB7Ci0gICAgICBjYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLSAgICAgIHsgICAgICAgICAKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25Gb3JDTUVsZW1lbnREZWNsYXJhdGlvbigoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Ob2RlKSk7ICAgCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDTU5vZGUuREFUQV9UWVBFIDoKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoIlwiIiArIGNtTm9kZS5nZXROb2RlTmFtZSgpICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ01Ob2RlLkdST1VQIDoKLSAgICAgIHsKLSAgICAgICAgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0Rm9yQ01Hcm91cCgoQ01Hcm91cCljbU5vZGUsIGxpc3QpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ01Ob2RlLkFOWV9FTEVNRU5UIDoKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQgOgotICAgICAgewotICAgICAgICBsaXN0LmFkZCgiISIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0gICAgIAotCi0gIC8qKgotICAgKiAKLSAgICovICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkZvckNNRWxlbWVudERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7ICAKLSAgICBDTURvY3VtZW50IGRvY3VtZW50ID0gKENNRG9jdW1lbnQpZWQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyB1cmkgPSBkb2N1bWVudCAhPSBudWxsID8gKFN0cmluZylkb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpIDogbnVsbDsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBzdHJpbmcgPSBlZC5nZXROb2RlTmFtZSgpOwotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgCi0gICAgICBzdHJpbmcgPSAiWyIgKyB1cmkgKyAiXSIgKyBzdHJpbmc7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgICByZXR1cm4gc3RyaW5nOwotICB9Ci0gIAotICAvKioKLSAgICoKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdEZvckNNR3JvdXAoQ01Hcm91cCBncm91cCwgTGlzdCBsaXN0KQotICB7ICAgICAgICAgCi0gICAgQ01Hcm91cENvbnRlbnRWaXNpdG9yIHZpc2l0b3IgPSBuZXcgQ01Hcm91cENvbnRlbnRWaXNpdG9yKGdyb3VwLCBsaXN0KTsKLSAgICB2aXNpdG9yLnZpc2l0Q01Ob2RlKGdyb3VwKTsKLSAgfSAKLSAgICAgCi0gIHByb3RlY3RlZCBjbGFzcyBDTUdyb3VwQ29udGVudFZpc2l0b3IgZXh0ZW5kcyBDTVZpc2l0b3IKLSAgeyAgCi0gICAgcHJvdGVjdGVkIENNR3JvdXAgcm9vdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGxpc3Q7Ci0KLSAgICBwdWJsaWMgQ01Hcm91cENvbnRlbnRWaXNpdG9yKENNR3JvdXAgcm9vdCwgTGlzdCBsaXN0KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB0aGlzLnJvb3QgPSByb290OyAgICAgICAgCi0gICAgICB0aGlzLmxpc3QgPSBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gICAgeyAgICAgICAgICAgCi0gICAgICBpZiAoZWQuZ2V0TWluT2NjdXIoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uRm9yQ01FbGVtZW50RGVjbGFyYXRpb24oZWQpKTsKLSAgICAgIH0KLSAgICB9ICAgICAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUFueUVsZW1lbnQoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpCi0gICAgeyAgIAotICAgICAgbGlzdC5hZGQoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGdyb3VwKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChncm91cCA9PSByb290IHx8IGdyb3VwLmdldE1pbk9jY3VyKCkgPiAwKQotICAgICAgewotICAgICAgICBpbnQgb3AgPSBncm91cC5nZXRPcGVyYXRvcigpOwotICAgICAgICBpZiAob3AgPT0gQ01Hcm91cC5TRVFVRU5DRSkKLSAgICAgICAgewotICAgICAgICAgIHN1cGVyLnZpc2l0Q01Hcm91cChncm91cCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAob3AgPT0gQ01Hcm91cC5DSE9JQ0UpCi0gICAgICAgIHsKLSAgICAgICAgICBDTU5vZGVMaXN0IG5vZGVMaXN0ID0gZ3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgIGlmIChub2RlTGlzdC5nZXRMZW5ndGgoKSA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgdmlzaXRDTU5vZGUobm9kZUxpc3QuaXRlbSgwKSk7Ci0gICAgICAgICAgfSAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VBd2FyZShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgeyAKLSAgICByZXR1cm4gZWQgIT0gbnVsbCA/IGVkLmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvaXNOYW1lU3BhY2VBd2FyZSIpICE9IG51bGwgOiBmYWxzZTsgLy8kTk9OLU5MUy0xJAotICB9Ci0gICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBDTU5vZGVbXSBnZXRPcmlnaW5BcnJheShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgRWxlbWVudFBhdGhSZWNvcmRpbmdSZXN1bHQgcmVzdWx0ID0gbmV3IEVsZW1lbnRQYXRoUmVjb3JkaW5nUmVzdWx0KCk7Ci0gICAgZ2V0T3JpZ2luQXJyYXkoZWQsIGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChlbGVtZW50LCBlZCksIHN0cmluZ0NvbnRlbnRDb21wYXJpdG9yLCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQuZ2V0T3JpZ2luQXJyYXkoKTsKLSAgfQotICAgICAgICAgICAgICAgICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBNYXRjaE1vZGVsTm9kZSBnZXRNYXRjaE1vZGVsKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBNYXRjaE1vZGVsTm9kZSBtYXRjaE1vZGVsTm9kZSA9IG51bGw7Ci0gICAgUGF0aFJlY29yZGluZ1Jlc3VsdCByZXN1bHQgPSBuZXcgUGF0aFJlY29yZGluZ1Jlc3VsdCgpOwotICAgIHZhbGlkYXRlKGVkLCBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoZWxlbWVudCwgZWQpLCBzdHJpbmdDb250ZW50Q29tcGFyaXRvciwgcmVzdWx0KTsKLSAgICBpZiAocmVzdWx0LmlzVmFsaWQpCi0gICAgewotICAgICAgbWF0Y2hNb2RlbE5vZGUgPSByZXN1bHQuZ2V0TWF0Y2hNb2RlbCgpOwotICAgIH0KLSAgICByZXR1cm4gbWF0Y2hNb2RlbE5vZGU7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBMaXN0IGNsb25lKExpc3QgbGlzdCkKLSAgeyAgIAotICAgIExpc3QgcmVzdWx0ID0gbmV3IFZlY3RvcihsaXN0LnNpemUoKSk7Ci0gICAgcmVzdWx0LmFkZEFsbChsaXN0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2FuSW5zZXJ0KENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW50IGluc2VydEluZGV4LCBDTU5vZGUgY21Ob2RlKQotICB7ICAgICAgICAgICAKLSAgICBMaXN0IGNsb25lZExpc3QgPSBjbG9uZShjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpOwotICAgIGluc2VydChjbG9uZWRMaXN0LCBpbnNlcnRJbmRleCwgY21Ob2RlKTsKLSAgICBib29sZWFuIHJlc3VsdCA9IGlzUGFydGlhbGx5VmFsaWQoZWQsIGNsb25lZExpc3QpOyAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gIAotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2FuSW5zZXJ0KENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW50IGluc2VydEluZGV4LCBMaXN0IGNtTm9kZUxpc3QpCi0gIHsgICAgICAgICAgICAgIAotICAgIExpc3QgY2xvbmVkTGlzdCA9IGNsb25lKGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCk7Ci0gICAgaW5zZXJ0KGNsb25lZExpc3QsIGluc2VydEluZGV4LCBjbU5vZGVMaXN0KTsKLSAgICByZXR1cm4gaXNWYWxpZChlZCwgY2xvbmVkTGlzdCk7Ci0gIH0gIAotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW50IHN0YXJ0UmVtb3ZlSW5kZXgpCi0gIHsKLSAgICByZXR1cm4gY2FuUmVtb3ZlKGVkLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIHN0YXJ0UmVtb3ZlSW5kZXgsIHN0YXJ0UmVtb3ZlSW5kZXgpOwotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmUoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBpbnQgc3RhcnRSZW1vdmVJbmRleCwgaW50IGVuZFJlbW92ZUluZGV4KQotICB7Ci0gICAgTGlzdCBjbG9uZWRMaXN0ID0gY2xvbmUoY29udGVudFNwZWNpZmljYXRpb25MaXN0KTsKLSAgICByZW1vdmUoY2xvbmVkTGlzdCwgc3RhcnRSZW1vdmVJbmRleCwgZW5kUmVtb3ZlSW5kZXgpOwotICAgIHJldHVybiBpc1ZhbGlkKGVkLCBjbG9uZWRMaXN0KTsKLSAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2FuUmVwbGFjZShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIGludCBzdGFydFJlbW92ZUluZGV4LCBpbnQgZW5kUmVtb3ZlSW5kZXgsIENNTm9kZSBjbU5vZGUpCi0gIHsKLSAgICBMaXN0IGNsb25lZExpc3QgPSBjbG9uZShjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpOwotICAgIHJlbW92ZShjbG9uZWRMaXN0LCBzdGFydFJlbW92ZUluZGV4LCBlbmRSZW1vdmVJbmRleCk7IAotICAgIGluc2VydChjbG9uZWRMaXN0LCBzdGFydFJlbW92ZUluZGV4LCBjbU5vZGUpOwotICAgIHJldHVybiBpc1ZhbGlkKGVkLCBjbG9uZWRMaXN0KTsKLSAgfQotCi0gIC8qKgotICAgKgotICAgKi8gICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0KQotICB7Ci0gICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKLSAgICB2YWxpZGF0ZShlZCwgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBzdHJpbmdDb250ZW50Q29tcGFyaXRvciwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0LmlzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1BhcnRpYWxseVZhbGlkKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCkKLSAgewotICAgIENNVmFsaWRhdG9yLkVsZW1lbnRQYXRoUmVjb3JkaW5nUmVzdWx0IHJlc3VsdCA9IG5ldyBDTVZhbGlkYXRvci5FbGVtZW50UGF0aFJlY29yZGluZ1Jlc3VsdCgpOwotICAgIHZhbGlkYXRlKGVkLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIHN0cmluZ0NvbnRlbnRDb21wYXJpdG9yLCByZXN1bHQpOwotICAgIGludCBjb3VudCA9IGdldEVsZW1lbnRDb3VudChjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJlbGVtZW50T3JpZ2luTGlzdCAiICsgcmVzdWx0LmdldFBhcnRpYWxWYWxpZGF0aW9uQ291bnQoKSArICJ2cyIgKyBjb3VudCk7Ci0gICAgcmV0dXJuIHJlc3VsdC5nZXRQYXJ0aWFsVmFsaWRhdGlvbkNvdW50KCkgPj0gY291bnQ7Ci0gIH0gIAotICAKLSAgcHVibGljIGludCBnZXRFbGVtZW50Q291bnQoTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpCi0gIHsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIGlmIChzdHJpbmdDb250ZW50Q29tcGFyaXRvci5pc0VsZW1lbnQoaS5uZXh0KCkpKQotICAgICAgewotICAgICAgICBjb3VudCsrOwotICAgICAgfSAgCi0gICAgfSAgCi0gICAgcmV0dXJuIGNvdW50OwotICB9Ci0KLSAgcHJvdGVjdGVkIFJlc3VsdCB2YWxpZGF0ZShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKLSAgICB2YWxpZGF0ZShlZCwgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGVsZW1lbnQsIGVkKSwgc3RyaW5nQ29udGVudENvbXBhcml0b3IsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKExpc3Qgc3RyaW5nTGlzdCwgaW50IHN0YXJ0UmVtb3ZlSW5kZXgsIGludCBlbmRSZW1vdmVJbmRleCkKLSAgewotICAgIGlmIChzdGFydFJlbW92ZUluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSBzdGFydFJlbW92ZUluZGV4OyBpIDw9IGVuZFJlbW92ZUluZGV4OyBpKyspCi0gICAgICB7Ci0gICAgICAgIHN0cmluZ0xpc3QucmVtb3ZlKGkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluc2VydChMaXN0IHN0cmluZ0xpc3QsIGludCBpbnNlcnRJbmRleCwgQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIGlmIChpbnNlcnRJbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBzdHJpbmdMaXN0LmFkZEFsbChpbnNlcnRJbmRleCwgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGNtTm9kZSkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluc2VydChMaXN0IHN0cmluZ0xpc3QsIGludCBpbnNlcnRJbmRleCwgTGlzdCBjbU5vZGVMaXN0KQotICB7Ci0gICAgaWYgKGluc2VydEluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGludCBpbnNlcnRMaXN0U2l6ZSA9IGNtTm9kZUxpc3Quc2l6ZSgpOwotICAgICAgZm9yIChpbnQgaSA9IGluc2VydExpc3RTaXplIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBjbU5vZGUgPSAoQ01Ob2RlKWNtTm9kZUxpc3QuZ2V0KGkpOwotICAgICAgICBzdHJpbmdMaXN0LmFkZEFsbChpbnNlcnRJbmRleCwgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGNtTm9kZSkpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYmVlMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci0KLQotLyoqCi0gKiBUaGUgQ01Eb2N1bWVudE1hbmFnZXIgY2FuIGJlIHZpc3VhbGl6ZWQgYXMgYSB0YWJsZSBvZiBDTURvY3VtZW50Ci0gKiByZWZlcmVuY2VzLCBlYWNoIHdpdGggYSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIGEgQ01Eb2N1bWVudCBjYWNoZS4gVGhlCi0gKiBDTURvY3VtZW50TWFuYWdlciBhbHNvIHBlcmZvcm1zIHRoZSB0YXNrIG9mIGxvYWRpbmcgQ01Eb2N1bWVudHMgcHJvdmlkaW5nCi0gKiBzdXBwb3J0IGZvciBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIGxvYWRpbmcuCi0gKiAKLSAqIHB1YmxpY0lkVGFibGUgQ01Eb2N1bWVudENhY2hlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgcHVibGljSWQgfCByZXNvbHZlZFVSSSB8IC0+IHwKLSAqIHJlc29sdmVkVVJJIHwgc3RhdHVzIHwgQ01Eb2N1bWVudCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgKG51bGwpIHwgZmlsZToveC5kdGQgfCB8Ci0gKiBmaWxlOi94LmR0ZCB8IGxvYWRpbmcgfCAobnVsbCkgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IGh0dHA6Ly4uLiB8IGZpbGU6L3kueHNkIHwgfAotICogZmlsZToveS54c2QgfCBsb2FkZWQgfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBDTURvY3VtZW50TWFuYWdlciB7Ci0JLyoqCi0JICogVGhpcyBwcm9wZXJ0eSBzcGVjaWZpZXMgV0hFTiBDTURvY3VtZW50cyBhcmUgbG9hZGVkLiBTZXR0aW5nIHRoaXMKLQkgKiBwcm9wZXJ0eSB0byB0cnVlIGFsbG93cyB0aGUgQ01Eb2N1bWVudE1hbmFnZXIgdG8gbG9hZCBDTURvY3VtZW50cyBvbgotCSAqIGRlbWFuZC4gU2V0dGluZ3MgdGhpcyBwcm9wZXJ0eSBhIGZhbHNlIHB1dHMgdGhlIG9udXMgb24gdGhlIGNsaWVudCB0bwotCSAqIGNhbGwgYWRkQ01Eb2N1bWVudFJlZmVyZW5jZSgpIHRvIGV4cGxpY2l0eSB0cmlnZ2VyIGEgbG9hZC4gVGhpcyBhbGxvd3MKLQkgKiB0aGUgY2xpZW50IHRvIGNvbnRyb2wgZXhhY3RseSB3aGVuIGxvYWRpbmcgc2hvdWxkIHRha2UgcGxhY2UuICkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9BVVRPX0xPQUQgPSAiYXV0b0xvYWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGlzIHByb3BlcnR5IHNwZWNpZmllcyBIT1cgQ01Eb2N1bWVudHMgYXJlIGxvYWRlZC4gV2hlbiBzZXQgdG8gZmFsc2UsCi0JICogdGhlIGdldENNRG9jdW1lbnQoKSBtZXRob2Qgd2lsbCBsb2FkIHRoZSBDTURvY3VtZW50IHN5bmNocm9ub3VzbHkgYW5kCi0JICogcmV0dXJuIGEgQ01Eb2N1bWVudCBvYmplY3Qgd2hlbiBsb2FkaW5nIGlzIHN1Y2Nlc3NmdWwuIFdoZW4gc2V0IHRvCi0JICogdHJ1ZSwgdGhlIGdldENNRG9jdW1lbnQoKSB3aWxsIGxvYWQgdGhlIENNRG9jdW1lbnQgYXN5bmNocm9ub3VzbHkgYW5kCi0JICogd2lsbCBpbW1lZGlhdGVseSByZXR1cm4gbnVsbC4gV2hlbiBsb2FkaW5nIGlzIGNvbXBsZXRlLCB0aGUKLQkgKiBDTURvY3VtZW50TWFuYWdlciB3aWxsIGluZm9ybSBpdHMgbGlzdGVuZXJzIHRoYXQgdGhlIENNRG9jdW1lbnQgaGFzCi0JICogYmVlbiBsb2FkZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQVNZTkNfTE9BRCA9ICJhc3luY0xvYWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9VU0VfQ0FDSEVEX1JFU09MVkVEX1VSSSA9ICJ1c2VDYWNoZWRSZXNvdmxlZFVSSSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM2Mzk5Ci0JICogQWxsb3dzIGEgY2xpZW50IHRvIGNvbnRyb2wgd2hldGhlciB0aGUgZG9jdW1lbnQgbWFuYWdlciBhdHRlbXB0cyB0byByZXNvbHZlIGEKLQkgKiBDTSBkb2N1bWVudCdzIFVSSS4gV2hlbiBzZXQgdG8gZmFsc2UsIHRoZSBDTSBzeXN0ZW1JRCB3aWxsIGJlIGFzc3VtZWQgdG8gcG9pbnQKLQkgKiB0byBhbiBhbHJlYWR5IHJlc29sdmVkIFVSSS4gQnkgZGVmYXVsdCB0aGlzIHByb3BlcnR5IGlzIHNldCB0byB0cnVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1BFUkZPUk1fVVJJX1JFU09MVVRJT04gPSAicGVyZm9ybVVSSVJlc29sdXRpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogU2V0IHRoZSBlbmFibGVkIHN0YXRlIG9mIGEgcHJvcGVydHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gZW5hYmxlZCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFByb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lci4gTGlzdGVuZXJzIHNob3VsZCBleHBlY3QgdG8gcmVjZWl2ZSBjYWxsIGJhY2tzIG9uIGEKLQkgKiBzZWNvbmRhcnkgdGhyZWFkIHdoZW4gYXN5bmNocm9ub3VzbHkgbG9hZGluZyBpcyB1c2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogTG9va3VwIG9yIGNyZWF0ZSBhIENNRG9jdW1lbnQgKGRlcGVuZGluZyBvbiBQUk9QRVJUWV9BVVRPX0xPQUQpLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaWNJZAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqIEBwYXJhbSB0eXBlIC0KLQkgKiAgICAgICAgICAgICdkdGQnLCAneHNkJywgJ3RsZCcsIGV0Yy4gaWYgbnVsbCBpcyBnaXZlbiBhcyB0aGUgdHlwZSwgdGhlbgotCSAqICAgICAgICAgICAgdGhlIHR5cGUgaXMgY2FsY3VsYXRlZCBhcyBsYXN0IHNlZ21lbnQgKGUuZy4gZmlsZSBleHRlbnNpb24pCi0JICogICAgICAgICAgICBvZiB0aGUgcmVzb2x2ZWQgVVJJCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyB0eXBlKTsKLQotCS8qKgotCSAqIExvb2t1cCBhIENNRG9jdW1lbnQuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgcHVibGljSWQpOwotCi0JLyoqCi0JICogR2V0IHRoZSBzdGF0dXMgb2YgYSBDTURvY3VtZW50LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q01Eb2N1bWVudFN0YXR1cyhTdHJpbmcgcHVibGljSWQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIENNRG9jdW1lbnQgYW5kIGFkZHMgdGhlIGFzc29jaWF0ZWQgQ01Eb2N1bWVudCByZWZlcmVuY2UKLQkgKiBpbmZvcm1hdGlvbiB0byB0aGUgdGFibGUuIENhbGxpbmcgdGhpcyBtZXRob2QgYWx3YXlzIHRyaWdnZXJzIGEKLQkgKiBDTURvY3VtZW50IGxvYWQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ01Eb2N1bWVudFJlZmVyZW5jZShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHR5cGUpOwotCi0JLyoqCi0JICogQWRkIGFuIGV4aXN0aW5nQ01Eb2N1bWVudCBhbmQgdGhlIHJlZmVyZW5jZSBpbmZvcm1hdGlvbiB0byB0aGUgdGFibGUuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ01Eb2N1bWVudChTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHJlc29sdmVkVVJJLCBTdHJpbmcgdHlwZSwgQ01Eb2N1bWVudCBjbURvY3VtZW50KTsKLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgZW50cmllcyBmcm9tIHRoZSB0YWJsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxSZWZlcmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIENNRG9jdW1lbnRDYWNoZSB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgbG9hZGVkIENNRG9jdW1lbnRzIGFuZAotCSAqIGFzc29jaWF0ZWQgc3RhdHVzLgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50Q2FjaGUgZ2V0Q01Eb2N1bWVudENhY2hlKCk7Ci0KLQkvKioKLQkgKiBCdWlsZHMgYSBDTURvY3VtZW50IGdpdmVuIGEgcmVzb3VsdmVkVVJJLiBOb3RlIHRoYXQgbm8gZW50cmllcyBhcmUKLQkgKiBhZGRlZCB0byB0aGUgdGFibGUuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHJlc29sdmVkVVJJLCBTdHJpbmcgdHlwZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50TWFuYWdlckxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50TWFuYWdlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNjA3ZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGVMaXN0ZW5lcjsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgZXh0ZW5kcyBDTURvY3VtZW50Q2FjaGVMaXN0ZW5lcgoteyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChDTURvY3VtZW50TWFuYWdlciBjbURvY3VtZW50TWFuYWdlciwgU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci19ICAgICAgIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudFJlZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDU3ZjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnk7Ci0KLQotcHVibGljIGludGVyZmFjZSBDTURvY3VtZW50UmVmZXJlbmNlCi17Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKTsKLSAgcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkYzhiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0gCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgaXMgdXNlZCB0byBhYnN0cmFjdCB0aGUgdGFzayBvZiBjb21wdXRpbmcgdGhlIGRvY3VtZW50IHJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIGEgRE9NCi0gKiBvciBhIHBhcnRpY3VsYXIgbm9kZSB3aXRoaW4gdGhlIERPTS4gIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlcgotewotICBMaXN0IGdldENNRG9jdW1lbnRSZWZlcmVuY2VzKE5vZGUgbm9kZSwgYm9vbGVhbiBkZWVwKTsKLSAgU3RyaW5nIHJlc29sdmVHcmFtbWFyVVJJKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzMDBlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb24uTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgcGVyZm9ybWluZyBoaWdoZXIgbGV2ZWwgcXVlcmllcyBiYXNlZCBvbgotICogYSB4bWwgbW9kZWwgKERPTSkgYW5kIG9uZSBvciBtb3JlIGFzc29jaWF0ZWQgY29udGVudCBtb2RlbHMgKENNRG9jdW1lbnQpLgotICoKLSAqIFRoZSBxdWVyaWVzIHByb3ZpZGVkIGNhbiBiZSBvcmdhbml6ZWQgaW50byB0aHJlZSBncm91cHM6Ci0gKgotICogMSkgRE9NIE5vZGUgdG8gQ01Ob2RlIG1hcHBpbmcKLSAqICAgICAgR2l2ZW4gYSBncmFtbWF0aWNhbGx5IHZhbGlkIERPTSBOb2RlIHRoZSBjb3JyZXNwb25kaW5nIENNTm9kZSBjYW4gYmUgZGV0ZXJtaW5lZC4KLSAqICAgICAgKGkuZS4gRWxlbWVudCAtPiBDTUVsZW1lbnREZWNsYXJhdGlvbiwgQXR0ciAtPiBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLCBDaGFyYWN0ZXJEYXRhIC0+IENNRGF0YVR5cGUpCi0gKgotICogMikgRE9NIGVkaXRpbmcgdGVzdHMgKCJDYW4gSSBkbyB0aGlzPyIpCi0gKiAgICAgIFF1ZXN0aW9ucyBzdWNoIGFzIGNhbkluc2VydCwgY2FuUmVtb3ZlLCBjYW5SZXBsYWNlIGNhbiBhc3Npc3QgaW4gdGhlIGVkaXRpbmcgb2YgYSBET00uCi0gKgotICogICAgICBUaGUgdmFsaWRpdHlDaGVja2luZyBhcmd1bWVudCBkZXRlcm1pbmVzIHRoZSBzdHJpY3RuZXNzIG9mIHRoZSB2YWxpZGl0eSB0ZXN0aW5nIHRoYXQgb2NjdXJzLgotICoKLSAqICAgICAgLSBWQUxJRElUWV9OT05FICAgIDogVGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgRWxlbWVudCBpcyBpZ25vcmVkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IHRoZSBjb250ZW50IG1vZGVsIGlzIGNvbnNpZGVyZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgbW9zdCB1c2VmdWwgZm9yIGNvZGVhc3Npc3QgcmVsYXRlZCBxdWVyaWVzLgotICoKLSAqICAgICAgLSBWQUxJRElUWV9TVFJJQ1QgIDogVGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgRWxlbWVudCBpcyBjb25zaWRlcmVkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5zIHRydWUgb25seSBpZiB0aGUgb3BlcmF0aW9uIHByZXNlcnZlcyBjb250ZW50IHZhbGlkaXR5LgotICogICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHVzZWZ1bCB3aGVuIERPTSBlZGl0aW5nIG5lZWRzIHRvIGJlIGNvbnN0cmFpbmVkIHRvIG1haW50YWluIHZhbGlkaXR5LgotICoKLSAqICAgICAgLSBWQUxJRElUWV9QQVJUSUFMIDogU29tZSBvcHRpbWl6ZWQgY29tcHJvbWlzZSBiZXR3ZWVuIHRoZSB0d28gb3B0aW9ucyBhYm92ZS4KLSAqCi0gKiAzKSBET00gZWRpdGluZyBhY3Rpb25zICgiV2hhdCBjYW4gSSBkbyBoZXJlPyIpCi0gKiAgICAgIFRoZXNlIG1ldGhvZHMgcmV0dXJuIE1vZGVsUXVlcnlBY3Rpb25zIHRoYXQgYXJlIHJlbGV2YW50IGF0IHNvbWUgc3BlY2lmaWVkIERPTSBOb2RlLgotICogICAgICBUaGUgYWN0aW9ucyBpbmRpY2F0ZSB3aGF0IGtpbmRzIG9mIERPTSBOb2RlIGNhbiBiZSBpbnNlcnRlZCB3aGVyZSAoYXQgd2hhdCBpbmRleCkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxRdWVyeQotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxJRElUWV9OT05FID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURJVFlfUEFSVElBTCA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTElESVRZX1NUUklDVCA9IDI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERV9BTEwgPSAweEZGOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0FUVFJJQlVURVMgPSAweDAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0NISUxEX05PREVTID0gMHgwMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERV9TRVFVRU5DRV9HUk9VUFMgPSAweDA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX1RFWFRfTk9ERVMgPSAweDA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0VOQ0xPU0lOR19SRVBMQUNFX0FDVElPTlMgPSAweDEwOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVESVRfTU9ERV9VTkNPTlNUUkFJTkVEID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRURJVF9NT0RFX0NPTlNUUkFJTkVEX0xFTklFTlQ9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QgPSAyOwotCi0KLSAgdm9pZCBzZXRFZGl0TW9kZShpbnQgZWRpdE1vZGUpOwotCi0gIGludCAgZ2V0RWRpdE1vZGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgQ01Eb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBET00gTm9kZS4KLSAgICogb3IgbnVsbCBpZiBubyBDTURvY3VtZW50IGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgRE9NIE5vZGUuCi0gICAqLwotICBDTURvY3VtZW50IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUgbm9kZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgQ01Ob2RlIGZvciB0aGUgRE9NIE5vZGUKLSAgICogb3IgbnVsbCBpZiBubyBDTU5vZGUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBET00gTm9kZS4KLSAgICovCi0gIENNTm9kZSBnZXRDTU5vZGUoTm9kZSBub2RlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBDTUF0dHJpYnV0ZSBmb3IgdGhlIERPTSBOb2RlCi0gICAqIG9yIG51bGwgaWYgbm8gQ01Ob2RlIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgRE9NIE5vZGUuCi0gICAqLwotICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oQXR0ciBhdHRyKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBDTUF0dHJpYnV0ZSBmb3IgdGhlIERPTSBOb2RlCi0gICAqIG9yIG51bGwgaWYgbm8gQ01Ob2RlIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgRE9NIE5vZGUuCi0gICAqLwotICBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgaXMgdmFsaWQKLSAgICovCi0gIGJvb2xlYW4gaXNDb250ZW50VmFsaWQoRWxlbWVudCBlbGVtZW50KTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgQ01Ob2RlIG9mIHRoZSBwYXJlbnQgZWxlbWVudCdzIGNvbnRlbnQgbW9kZWwKLSAgICogdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbm9kZQotICAgKi8KLSAgQ01Ob2RlIGdldE9yaWdpbihOb2RlIG5vZGUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIENNTm9kZXMgb2YgdGhlIHBhcmVudCBlbGVtZW50J3MgY29udGVudCBtb2RlbAotICAgKiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBub2RlCi0gICAqLwotICBDTU5vZGVbXSBnZXRPcmlnaW5BcnJheShFbGVtZW50IGVsZW1lbnQpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgQ01Ob2RlICdtZXRhIGRhdGEnIHRoYXQgbWF5IGJlIHBvdGVudGlhbGx5IGFkZGVkIHRvIHRoZSBlbGVtZW50LgotICAgKi8KLSAgTGlzdCBnZXRBdmFpbGFibGVDb250ZW50KEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucyk7Ci0KLSAgLyoqCi0gICAqIENhbiBhIERPTSBOb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIENNTm9kZSAnbWV0YSBkYXRhJyBiZSBhZGRlZCB0byB0aGUgcGFyZW50Ci0gICAqLwotICBib29sZWFuIGNhbkluc2VydChFbGVtZW50IHBhcmVudCwgQ01Ob2RlIGNtTm9kZSwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZyk7Ci0KLSAgLyoqCi0gICAqIENhbiBtdWx0aXBsZSBET00gTm9kZXMgY29ycmVzcG9uZGluZyB0byB0aGUgbGlzdCBvZiBDTU5vZGUgJ21ldGEgZGF0YScgYmUgYWRkZWQgdG8gdGhlIHBhcmVudAotICAgKi8KLSAgYm9vbGVhbiBjYW5JbnNlcnQoRWxlbWVudCBwYXJlbnQsIExpc3QgY21Ob2RlTGlzdCwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZyk7Ci0KLSAgLyoqCi0gICAqIENhbiB0aGUgRE9NIE5vZGUgYmUgcmVtb3ZlZAotICAgKi8KLSAgYm9vbGVhbiBjYW5SZW1vdmUoTm9kZSBub2RlLCBpbnQgdmFsaWRpdHlDaGVja2luZyk7Ci0KLSAgLyoqCi0gICAqIENhbiB0aGUgbGlzdCBvZiBET00gTm9kZXMgYmUgcmVtb3ZlZAotICAgKi8KLSAgYm9vbGVhbiBjYW5SZW1vdmUoTGlzdCBub2RlTGlzdCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpOwotCi0gIC8qKgotICAgKiBDYW4gdGhlIGNoaWxkcmVuIHdpdGhpbiB0aGUgaW5kaWNhdGVkIGluZGljZXMgYmUgcmVwbGFjZWQgd2l0aCBhIERPTSBOb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIENNTm9kZSAnbWV0YSBkYXRhJwotICAgKi8KLSAgYm9vbGVhbiBjYW5SZXBsYWNlKEVsZW1lbnQgcGFyZW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBDTU5vZGUgY21Ob2RlLCBpbnQgdmFsaWRpdHlDaGVja2luZyk7Ci0KLSAgLyoqCi0gICAqIENhbiB0aGUgY2hpbGRyZW4gd2l0aGluIHRoZSBpbmRpY2F0ZWQgaW5kaWNlcyBiZSByZXBsYWNlZCB3aXRoIG11bHRpcGxlIERPTSBOb2RlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsaXN0IG9mIENNTm9kZSAnbWV0YSBkYXRhJwotICAgKi8KLSAgYm9vbGVhbiBjYW5SZXBsYWNlKEVsZW1lbnQgcGFyZW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBMaXN0IGNtTm9kZUxpc3QsIGludCB2YWxpZGl0eUNoZWNraW5nKTsKLQotICAvKioKLSAgICoKLSAgICovCi0gIHZvaWQgZ2V0SW5zZXJ0QWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmRleCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KTsKLQotICAvKioKLSAgICoKLSAgICovCi0gIHZvaWQgZ2V0SW5zZXJ0QWN0aW9ucyhEb2N1bWVudCBwYXJlbnQsIENNRG9jdW1lbnQgY21Eb2N1bWVudCwgaW50IGluZGV4LCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBsaXN0IG9mIHJlcGxhY2UgYWN0aW9ucyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIHBhcmVudCdzIGNvbnRlbnQKLSAgICovCi0gIHZvaWQgZ2V0UmVwbGFjZUFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBsaXN0IG9mIHJlcGxhY2UgYWN0aW9ucyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIHNlbGVjdGVkIGNoaWxkcmVuIG9mIHRoYXQgcGFyZW50IAotICAgKi8KLSAgdm9pZCBnZXRSZXBsYWNlQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3Qgc2VsZWN0ZWRDaGlsZHJlbiwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8qKiAKLSAgICogIEBkZXByZWNhdGVkIC0gdXNlIGdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMoKQotICAgKi8KLSAgTGlzdCBnZXREYXRhVHlwZVZhbHVlcyhFbGVtZW50IGVsZW1lbnQsIENNTm9kZSBjbU5vZGUpOwotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZHMgcmV0dXJuIGFuIGFycmF5IG9mIHBvc3NpYmxlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBkYXRhdHlwZSBvZiB0aGUgQ01Ob2RlIChlaXRoZXIgYW4gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBvciBhIENNRWxlbWVudERlY2xhcmF0aW9uKQotICAgKi8KLSAgU3RyaW5nW10gZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhFbGVtZW50IGVsZW1lbnQsIENNTm9kZSBjbU5vZGUpOwotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwgaWYgYSBDTURvY3VtZW50TWFuYWdlciBpcyBub3QgdXNlZCBieSB0aGUgTW9kZWxRdWVyeQotICAgKi8KLSAgQ01Eb2N1bWVudE1hbmFnZXIgZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsIHRoZSBNb2RlbFF1ZXJ5IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgdXNlIG9mIGV4dGVuc2lvbnMKLSAgICovCi0gIE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyIGdldEV4dGVuc2lvbk1hbmFnZXIoKTsgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU5YzRmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsUXVlcnlBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5TRVJUICA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRSAgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFID0gNDsKLQotICBwdWJsaWMgaW50IGdldEtpbmQoKTsKLSAgLyoqCi0gICAqIGlmIHN0YXJ0IGluZGV4ID09IC0xIHRoZW4gbm8gaW5zZXJ0IGlzIHBvc3NpYmxlCi0gICAqIGlmIHN0YXJ0IGluZGV4ICE9IC0xIGFuZCBlbmRJbmRleCA9PSAtMSB0aGVuIGFuIGluc2VydCBhdCBhbnkgcG9zaXRpb24gaXMgcG9zc2libGUKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U3RhcnRJbmRleCgpOwotICBwdWJsaWMgaW50IGdldEVuZEluZGV4KCk7Ci0gIHB1YmxpYyBOb2RlIGdldFBhcmVudCgpOwotICBwdWJsaWMgQ01Ob2RlIGdldENNTm9kZSgpOwotICBwdWJsaWMgT2JqZWN0IGdldFVzZXJEYXRhKCk7Ci0gIHB1YmxpYyB2b2lkIHNldFVzZXJEYXRhKE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3Nzc3NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqIAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBleHRlbmRzIE1vZGVsUXVlcnlDTVByb3ZpZGVyCi17Ci0gIHB1YmxpYyBDTU5vZGUgZ2V0Q01Ob2RlKE5vZGUgbm9kZSk7Ci0gIHB1YmxpYyBDTURhdGFUeXBlIGdldENNRGF0YVR5cGUoVGV4dCB0ZXh0KTsgCi0gIHB1YmxpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oQXR0ciBhdHRyKTsKLSAgcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeUNNUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmOTM3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsUXVlcnlDTVByb3ZpZGVyCi17Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBDTURvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIERPTSBOb2RlLgotICAgKiBvciBudWxsIGlmIG5vIENNRG9jdW1lbnQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBET00gTm9kZS4KLSAgICovCi0gIENNRG9jdW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSBub2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L2V4dGVuc2lvbi9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9leHRlbnNpb24vTW9kZWxRdWVyeUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE3ZjU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L2V4dGVuc2lvbi9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZGVsUXVlcnlFeHRlbnNpb24KLXsgIAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX1NUUklOR19BUlJBWSA9IHt9OwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENNTm9kZVtdIEVNUFRZX0NNTk9ERV9BUlJBWSA9IHt9OwotICAKLSAgLyoqCi0gKiBAcGFyYW0gb3duZXJFbGVtZW50IC0gdGhlIG93bmVyIGVsZW1lbnQKLSAqIEBwYXJhbSBuYW1lc3BhY2UgLSB0aGUgYWN0aXZlIG5hbWVzcGFjZQotICogQHBhcmFtIG5hbWUgLSB0aGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgbm9kZQotICogQHJldHVybiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUKLSAqLwotcHVibGljIFN0cmluZ1tdIGdldEF0dHJpYnV0ZVZhbHVlcyhFbGVtZW50IG93bmVyRWxlbWVudCwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gRU1QVFlfU1RSSU5HX0FSUkFZOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0RWxlbWVudFZhbHVlcyhOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuIEVNUFRZX1NUUklOR19BUlJBWTsKLSAgfQotICAKLSAgLyoqCi0gKiBAcGFyYW0gcGFyZW50Tm9kZQotICogQHBhcmFtIG5hbWVzcGFjZQotICogQHBhcmFtIG5hbWUKLSAqIEByZXR1cm4gd2hldGhlciBhIGNoaWxkIGVsZW1lbnQgb2YgdGhlIGdpdmVuIHBhcmVudE5vZGUgaXMgdmFsaWQgZ2l2ZW4gdGhlIGFjdGl2ZSBuYW1lc3BhY2UKLSAqLwotcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlQ2hpbGRFbGVtZW50KE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLyoqCi0gKiBAcGFyYW0gcGFyZW50RWxlbWVudCAtIHRoZSBwYXJlbnQgRWxlbWVudCB3aGVuIGFza2luZyBmb3IgY2hpbGRyZW4sIHRoZSBvd25lciBFbGVtZW50IHdoZW4gYXNraW5nIGZvciBhdHRyaWJ1dGVzIAotICogQHBhcmFtIG5hbWVzcGFjZSAtIHRoZSBhY3RpdmUgbmFtZXNwYWNlCi0gKiBAcGFyYW0gaW5jbHVkZU9wdGlvbnMgLSBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyBvciBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVMKLSAqIEByZXR1cm4gYWRkaXRpb25hbCB2YWxpZCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9ucyBvciBDTUVsZW1lbnREZWNsYXJhdGlvbnMgCi0gKi8KLXB1YmxpYyBDTU5vZGVbXSBnZXRBdmFpbGFibGVFbGVtZW50Q29udGVudChFbGVtZW50IHBhcmVudEVsZW1lbnQsIFN0cmluZyBuYW1lc3BhY2UsIGludCBpbmNsdWRlT3B0aW9ucykgCi0gIHsKLQkgIHJldHVybiBFTVBUWV9DTU5PREVfQVJSQVk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L2V4dGVuc2lvbi9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvZXh0ZW5zaW9uL01vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYzQ0MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvZXh0ZW5zaW9uL01vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLQotcHVibGljIGludGVyZmFjZSBNb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlcgotewotICBMaXN0IGdldERhdGFUeXBlVmFsdWVzKEVsZW1lbnQgZWxlbWVudCwgQ01Ob2RlIGNtTm9kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICB2b2lkIGZpbHRlckF2YWlsYWJsZUVsZW1lbnRDb250ZW50KExpc3QgYXZhaWxhYmxlQ29udGVudCwgRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCk7Ci0KLSAgdm9pZCBmaWx0ZXJBdmFpbGFibGVFbGVtZW50Q29udGVudChMaXN0IGF2YWlsYWJsZUNvbnRlbnQsIEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQmFzZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9CYXNlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDI0MmY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9CYXNlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUFzc29jaWF0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcgoteyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBCYXNlQXNzb2NpYXRpb25Qcm92aWRlcigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBDTU5vZGUgZ2V0Q01Ob2RlKE5vZGUgbm9kZSkKLSAgewotICAgIENNTm9kZSByZXN1bHQgPSBudWxsOwotICAgIHN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKQotICAgIHsKLSAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oKEF0dHIpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KW5vZGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldENNRGF0YVR5cGUoKFRleHQpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgQ01EYXRhVHlwZSBnZXRDTURhdGFUeXBlKFRleHQgdGV4dCkKLSAgewotICAgIENNRGF0YVR5cGUgcmVzdWx0ID0gbnVsbDsKLSAgICBOb2RlIHBhcmVudE5vZGUgPSB0ZXh0LmdldFBhcmVudE5vZGUoKTsKLSAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsICYmIHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICB7Ci0gICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KXBhcmVudE5vZGUpOwotICAgICAgcmVzdWx0ID0gZWQuZ2V0RGF0YVR5cGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihBdHRyIGF0dHIpCi0gIHsKLSAgICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pZWQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0NNRG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwNTk0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VUYWJsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudExvYWRlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OwotICBwcm90ZWN0ZWQgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5OwotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudE1hbmFnZXIgY21Eb2N1bWVudE1hbmFnZXI7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzSW5mZXJyZWRHcmFtbWFyRW5hYmxlZCA9IHRydWU7ICAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnRMb2FkaW5nTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGU7Ci0gIHByb3RlY3RlZCBpbnQgY291bnQgPSAwOwotICAgIAotICBwdWJsaWMgQ01Eb2N1bWVudExvYWRlcihEb2N1bWVudCBkb2N1bWVudCwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzKGRvY3VtZW50LCBtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCkpOwotICB9Ci0gIAotICBwdWJsaWMgQ01Eb2N1bWVudExvYWRlcihEb2N1bWVudCBkb2N1bWVudCwgQ01Eb2N1bWVudE1hbmFnZXIgY21Eb2N1bWVudE1hbmFnZXIpCi0gIHsgICAKLSAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5jbURvY3VtZW50TWFuYWdlciA9IGNtRG9jdW1lbnRNYW5hZ2VyOyAgCQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBsb2FkQ01Eb2N1bWVudHMoKQotICB7ICAgICAgICAgIAotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tbG9hZENNRG9jdW1lbnRzIC0tLS0tLS0tLS0tLSIpOyAgICAgICAgICAKLSAgICAvL2xvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgIAotICAgIGJvb2xlYW4gd2Fsa0RvY3VtZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICBjbURvY3VtZW50TWFuYWdlci5yZW1vdmVBbGxSZWZlcmVuY2VzKCk7Ci0gICAgICAKLSAgICBTdHJpbmdbXSBkb2N0eXBlSW5mbyA9IFhNTEFzc29jaWF0aW9uUHJvdmlkZXIuZ2V0RG9jdHlwZUluZm8oZG9jdW1lbnQpOwotICAgIGlmIChkb2N0eXBlSW5mbyAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIGxvYWQgdGhlIGRvY3R5cGUgaWYgcmVxdWlyZWQKLSAgICAgIHdhbGtEb2N1bWVudCA9IGhhbmRsZUdyYW1tYXIoZG9jdHlwZUluZm9bMF0sIGRvY3R5cGVJbmZvWzFdLCAiRFREIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBlbHNlCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgRWxlbWVudCBlbGVtZW50ID0gZ2V0Um9vdEVsZW1lbnQoZG9jdW1lbnQpOwotICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZXNwYWNlVGFibGUgPSBuZXcgQ01Eb2N1bWVudExvYWRpbmdOYW1lc3BhY2VUYWJsZShkb2N1bWVudCk7ICAgCi0gICAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VUYWJsZS5pc05hbWVzcGFjZUVuY291bnRlcmVkKCkpCi0gICAgICAgIHsgICAKLSAgICAgICAgICB3YWxrRG9jdW1lbnQgPSB0cnVlOwotICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJpc05hbWVzcGFjZUF3YXJlIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZXNwYWNlVGFibGUgPSBudWxsOwotICAgICAgICAgIHdhbGtEb2N1bWVudCA9IGlzSW5mZXJyZWRHcmFtbWFyRW5hYmxlZDsKLSAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiaXMgTk9UIG5hbWVzcGFjZUF3YXJlIik7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfSAgCi0gICAgfSAKLQotICAgIGlmICh3YWxrRG9jdW1lbnQpCi0gICAgewotICAgICAgdmlzaXROb2RlKGRvY3VtZW50KTsgICAKLSAgICB9IAotCi0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIi0tLSBlbGFwc2VkIHRpbWUgKCIgKyBjb3VudCArICIpID0gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpKTsKLSAgfQotCi0KLSAgcHVibGljIGJvb2xlYW4gaGFuZGxlR3JhbW1hcihTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHR5cGUpCi0gIHsgICAgICAgICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgCi0gICAgaW50IHN0YXR1cyA9IGNtRG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnRTdGF0dXMocHVibGljSWQpOwotICAgIGlmIChzdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19OT1RfTE9BREVEKQotICAgIHsKLSAgICAgIGNtRG9jdW1lbnRNYW5hZ2VyLmFkZENNRG9jdW1lbnRSZWZlcmVuY2UocHVibGljSWQsIHN5c3RlbUlkLCB0eXBlKTsKLSAgICB9ICAgICAgICAgICAgICAgICAKLSAgICBlbHNlIGlmIChzdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19FUlJPUikKLSAgICB7Ci0gICAgICByZXN1bHQgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotICAgIAotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7ICAKLSAgICB2aXNpdENoaWxkTm9kZXMoZWxlbWVudCk7Ci0gIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgaGFuZGxlRWxlbWVudE5TKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgdmlzaXRDaGlsZE5vZGVzKGVsZW1lbnQpOwotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHZvaWQgdmlzaXROb2RlKE5vZGUgbm9kZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotICAgIGlmIChub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICB7Ci0gICAgICBjb3VudCsrOyAgICAgICAKLQotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsgICAgCi0gICAgICBpZiAobmFtZXNwYWNlVGFibGUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaGFuZGxlRWxlbWVudChlbGVtZW50KTsgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGhhbmRsZUVsZW1lbnROUyhlbGVtZW50KTsKLSAgICAgIH0gICAgICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotICAgIHsKLSAgICAgIHZpc2l0Q2hpbGROb2Rlcyhub2RlKTsKLSAgICB9Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0Q2hpbGROb2RlcyhOb2RlIG5vZGUpCi0gIHsgICAKLQkgIGZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIAotICAgIHsKLQkgICAgdmlzaXROb2RlKGNoaWxkKTsKLSAgICB9Ci0JfSAgICAgICAgICAgICAKLQotCi0gIHByb3RlY3RlZCBjbGFzcyBDTURvY3VtZW50TG9hZGluZ05hbWVzcGFjZVRhYmxlIGV4dGVuZHMgTmFtZXNwYWNlVGFibGUKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBuZXdOYW1lc3BhY2VMaXN0OwotCi0gICAgcHVibGljIENNRG9jdW1lbnRMb2FkaW5nTmFtZXNwYWNlVGFibGUoRG9jdW1lbnQgZG9jdW1lbnQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHN1cGVyKGRvY3VtZW50KTsgICAgIAotICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHVibGljIHZvaWQgYWRkRWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIG5ld05hbWVzcGFjZUxpc3QgPSBudWxsOwotICAgICAgc3VwZXIuYWRkRWxlbWVudChlbGVtZW50KTsgIAotICAgICAgaWYgKG5ld05hbWVzcGFjZUxpc3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbmV3TmFtZXNwYWNlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8paS5uZXh0KCk7Ci0gICAgICAgICAgaGFuZGxlR3JhbW1hcihpbmZvLnVyaSwgaW5mby5sb2NhdGlvbkhpbnQsICJYU0QiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgCi0gICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGludGVybmFsQWRkTmFtZXNwYWNlSW5mbyhTdHJpbmcga2V5LCBOYW1lc3BhY2VJbmZvIGluZm8pCi0gICAgewotICAgICAgc3VwZXIuaW50ZXJuYWxBZGROYW1lc3BhY2VJbmZvKGtleSwgaW5mbyk7ICAgICAgICAgICAKLSAgICAgIGlmIChuZXdOYW1lc3BhY2VMaXN0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5ld05hbWVzcGFjZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICB9Ci0gICAgICBuZXdOYW1lc3BhY2VMaXN0LmFkZChpbmZvKTsgICAgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgIAotICB9Ci0KLSAgCi0gIHByb3RlY3RlZCBFbGVtZW50IGdldFJvb3RFbGVtZW50KERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgRWxlbWVudCByZXN1bHQgPSBudWxsOwotICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChFbGVtZW50KW5vZGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudE1hbmFnZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudE1hbmFnZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNGFmOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0NNRG9jdW1lbnRNYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ29udGVudE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb24uQW5ub3RhdGlvblV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5HbG9iYWxDTURvY3VtZW50Q2FjaGUuR2xvYmFsQ2FjaGVRdWVyeVJlc3BvbnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIENNRG9jdW1lbnRNYW5hZ2VySW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnRNYW5hZ2VyCi17Ci0gIHByb3RlY3RlZCBDTURvY3VtZW50Q2FjaGUgY21Eb2N1bWVudENhY2hlOwotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyIGNtRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlcjsKLSAgcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IFZlY3RvcigpOyAKLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIHB1YmxpY0lkVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIHByaXZhdGUgYm9vbGVhbiBnbG9iYWxDTURvY3VtZW50Q2FjaGVFbmFibGVkIDsKLQotICAgICAgIAotICBwdWJsaWMgQ01Eb2N1bWVudE1hbmFnZXJJbXBsKENNRG9jdW1lbnRDYWNoZSBjbURvY3VtZW50Q2FjaGUsIENNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlciBjbURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLmNtRG9jdW1lbnRDYWNoZSA9IGNtRG9jdW1lbnRDYWNoZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5jbURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIgPSBjbURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXI7Ci0gICAgc2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX0FVVE9fTE9BRCwgdHJ1ZSk7Ci0gICAgc2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX1VTRV9DQUNIRURfUkVTT0xWRURfVVJJLCBmYWxzZSk7Ci0gICAgc2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX1BFUkZPUk1fVVJJX1JFU09MVVRJT04sIHRydWUpOwotICAgIGluaXRpYWxpemVHbG9iYWxDTURvY3VtZW50Q2FjaGVTZXR0aW5ncygpOwotICB9ICAgICAgICAgCi0KLSAgICAgICAKLSAgcHVibGljIENNRG9jdW1lbnRDYWNoZSBnZXRDTURvY3VtZW50Q2FjaGUoKQotICB7Ci0gICAgcmV0dXJuIGNtRG9jdW1lbnRDYWNoZTsKLSAgfQotCi0gCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIHZhbHVlKQotICB7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQocHJvcGVydHlOYW1lLCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0ZW5lckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyID0gKENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICBsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQodGhpcywgcHJvcGVydHlOYW1lKTsKLSAgICB9Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgCi0gIHB1YmxpYyBib29sZWFuIGdldFByb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IHByb3BlcnR5VGFibGUuZ2V0KHByb3BlcnR5TmFtZSk7Ci0gICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIG9iamVjdC5lcXVhbHMoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gICAgY21Eb2N1bWVudENhY2hlLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotICAgIGNtRG9jdW1lbnRDYWNoZS5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgIAotICAgCi0gICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgbG9va3VwUmVzb2x2ZWRVUkkoU3RyaW5nIHB1YmxpY0lkKQotICB7Ci0gICAgU3RyaW5nIGtleSA9IHB1YmxpY0lkICE9IG51bGwgPyBwdWJsaWNJZCA6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgcmV0dXJuIChTdHJpbmcpcHVibGljSWRUYWJsZS5nZXQoa2V5KTsKLSAgfQotICAgIAotCi0gIHByb3RlY3RlZCBTdHJpbmcgbG9va3VwT3JDcmVhdGVSZXNvbHZlZFVSSShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc29sdmVkVVJJID0gbnVsbDsgICAgICAgICAgICAgICAgICAKLQotICAgIFN0cmluZyBrZXkgPSBwdWJsaWNJZCAhPSBudWxsID8gcHVibGljSWQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgaWYgKGdldFByb3BlcnR5RW5hYmxlZChQUk9QRVJUWV9VU0VfQ0FDSEVEX1JFU09MVkVEX1VSSSkpCi0gICAgewotICAgICAgcmVzb2x2ZWRVUkkgPSAoU3RyaW5nKXB1YmxpY0lkVGFibGUuZ2V0KGtleSk7Ci0gICAgfSAgIAotCi0gICAgaWYgKHJlc29sdmVkVVJJID09IG51bGwpCi0gICAgewotICAgICAgcmVzb2x2ZWRVUkkgPSBjbURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIucmVzb2x2ZUdyYW1tYXJVUkkocHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICAgIGlmIChyZXNvbHZlZFVSSSA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXNvbHZlZFVSSSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBwdWJsaWNJZFRhYmxlLnB1dChrZXksIHJlc29sdmVkVVJJKTsgICAgIAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAotICAKLSAgICByZXR1cm4gcmVzb2x2ZWRVUkk7Ci0gIH0KLQotCi0gIHB1YmxpYyBpbnQgZ2V0Q01Eb2N1bWVudFN0YXR1cyhTdHJpbmcgcHVibGljSWQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50IHN0YXR1cyA9IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTk9UX0xPQURFRDsgCi0gICAgU3RyaW5nIHJlc29sdmVkVVJJID0gbG9va3VwUmVzb2x2ZWRVUkkocHVibGljSWQpOwotICAgIGlmIChyZXNvbHZlZFVSSSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBzdGF0dXMgPSBjbURvY3VtZW50Q2FjaGUuZ2V0U3RhdHVzKHJlc29sdmVkVVJJKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfSAgICAKLSAgICAgICAgICAgICAgCi0KLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgcHVibGljSWQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgIFN0cmluZyByZXNvbHZlZFVSSSA9IGxvb2t1cFJlc29sdmVkVVJJKHB1YmxpY0lkKTsKLSAgICBpZiAocmVzb2x2ZWRVUkkgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcmVzdWx0ID0gY21Eb2N1bWVudENhY2hlLmdldENNRG9jdW1lbnQocmVzb2x2ZWRVUkkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotICAKLQotICAvKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlciNnZXRDTURvY3VtZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyB0eXBlKQotICB7ICAgICAgICAgICAgICAgIAotICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc29sdmVkVVJJID0gbnVsbDsKLQotICAgIGlmIChnZXRQcm9wZXJ0eUVuYWJsZWQoUFJPUEVSVFlfQVVUT19MT0FEKSkKLSAgICB7Ci0gICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNjM5OQotICAgICAgCi0gICAgICBpZiAoZ2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX1BFUkZPUk1fVVJJX1JFU09MVVRJT04pKQotICAgICAgewotICAgICAgICByZXNvbHZlZFVSSSA9IGxvb2t1cE9yQ3JlYXRlUmVzb2x2ZWRVUkkocHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzb2x2ZWRVUkkgPSBzeXN0ZW1JZDsKLSAgICAgIH0KLSAgICB9ICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXNvbHZlZFVSSSA9IGxvb2t1cFJlc29sdmVkVVJJKHB1YmxpY0lkKTsKLSAgICB9IAotCi0gICAgaWYgKHJlc29sdmVkVVJJICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgIGludCBzdGF0dXMgPSBjbURvY3VtZW50Q2FjaGUuZ2V0U3RhdHVzKHJlc29sdmVkVVJJKTsKLSAgICAgIGlmIChzdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19MT0FERUQpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBjbURvY3VtZW50ID0gY21Eb2N1bWVudENhY2hlLmdldENNRG9jdW1lbnQocmVzb2x2ZWRVUkkpOwotICAgICAgfSAgIAotICAgICAgZWxzZSBpZiAoc3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTk9UX0xPQURFRCkKLSAgICAgIHsgICAgIAotICAgICAgICBpZiAoZ2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX0FVVE9fTE9BRCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjbURvY3VtZW50ID0gbG9hZENNRG9jdW1lbnQocHVibGljSWQsIHJlc29sdmVkVVJJLCB0eXBlLCBnZXRQcm9wZXJ0eUVuYWJsZWQoUFJPUEVSVFlfQVNZTkNfTE9BRCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjbURvY3VtZW50OyAgIAotICB9IAotICAKLSAgcHVibGljIHZvaWQgYWRkQ01Eb2N1bWVudFJlZmVyZW5jZShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBTdHJpbmcgcmVzb2x2ZWRVUkkgPSBsb29rdXBPckNyZWF0ZVJlc29sdmVkVVJJKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgaWYgKHJlc29sdmVkVVJJICE9IG51bGwgJiYgcmVzb2x2ZWRVUkkubGVuZ3RoKCkgPiAwKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpbnQgc3RhdHVzID0gY21Eb2N1bWVudENhY2hlLmdldFN0YXR1cyhyZXNvbHZlZFVSSSk7Ci0gICAgICBpZiAoc3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTk9UX0xPQURFRCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGxvYWRDTURvY3VtZW50KHB1YmxpY0lkLCByZXNvbHZlZFVSSSwgdHlwZSwgZ2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX0FTWU5DX0xPQUQpKTsKLSAgICAgIH0gICAgICAgICAKLSAgICB9IAotICB9Ci0gICAgIAotCi0gIHB1YmxpYyB2b2lkIGFkZENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyByZXNvbHZlZFVSSSwgU3RyaW5nIHR5cGUsIENNRG9jdW1lbnQgY21Eb2N1bWVudCkKLSAgewotICAgIFN0cmluZyBrZXkgPSBwdWJsaWNJZCAhPSBudWxsID8gcHVibGljSWQgOiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpY0lkVGFibGUucHV0KGtleSwgcmVzb2x2ZWRVUkkpOwotICAgIGNtRG9jdW1lbnRDYWNoZS5wdXRDTURvY3VtZW50KHJlc29sdmVkVVJJLCBjbURvY3VtZW50KTsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIENNRG9jdW1lbnQgbG9hZENNRG9jdW1lbnQoZmluYWwgU3RyaW5nIHB1YmxpY0lkLCBmaW5hbCBTdHJpbmcgcmVzb2x2ZWRVUkksIGZpbmFsIFN0cmluZyB0eXBlLCBib29sZWFuIGFzeW5jKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJhYm91dCB0byBidWlsZCBDTURvY3VtZW50KCIgKyBwdWJsaWNJZCArICIsICIgKyB1bnJlc29sdmVkVVJJICsgIiA9ICIgKyByZXNvbHZlZFVSSSArICIpIik7Ci0gICAgaWYgKGFzeW5jKQotICAgIHsgICAgIAotICAgICAgY21Eb2N1bWVudENhY2hlLnNldFN0YXR1cyhyZXNvbHZlZFVSSSwgQ01Eb2N1bWVudENhY2hlLlNUQVRVU19MT0FESU5HKTsKLSAgICAgIC8vVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQobmV3IEFzeW5jQnVpbGRPcGVyYXRpb24ocHVibGljSWQsIHJlc29sdmVkVVJJLCB0eXBlKSk7Ci0gICAgICAvL3RocmVhZC5zdGFydCgpOwotICAgICAgSm9iIGpvYiA9IG5ldyBKb2IoWE1MQ29yZU1lc3NhZ2VzLmxvYWRpbmcgKyByZXNvbHZlZFVSSSkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpCi0gICAgICAgIHsKLSAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IChmYW1pbHkgPT0gQ01Eb2N1bWVudE1hbmFnZXIuY2xhc3MpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgIAkgIGJ1aWxkQ01Eb2N1bWVudChwdWJsaWNJZCwgcmVzb2x2ZWRVUkksIHR5cGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAJICBMb2dnZXIubG9nRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFhNTENvcmVNZXNzYWdlcy5DTURvY3VtZW50X2xvYWRfZXhjZXB0aW9uLCBuZXcgT2JqZWN0W117cmVzb2x2ZWRVUkksIHB1YmxpY0lkfSksIGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICAgIGpvYi5zY2hlZHVsZSgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgICAgICAgICAgICAgICAKLSAgICAgIHJlc3VsdCA9IGJ1aWxkQ01Eb2N1bWVudChwdWJsaWNJZCwgcmVzb2x2ZWRVUkksIHR5cGUpOwotICAgIH0gICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAKLQotICAgIAotCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgcmVzb2x2ZWRVUkksIFN0cmluZyB0eXBlKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGNtRG9jdW1lbnRDYWNoZS5zZXRTdGF0dXMocmVzb2x2ZWRVUkksIENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTE9BRElORyk7Ci0gICAgYm9vbGVhbiBkb2N1bWVudENhY2hlYWJsZSA9IGZhbHNlOwotICAgIGlmKGdsb2JhbENNRG9jdW1lbnRDYWNoZUVuYWJsZWQpIHsKLSAgICAJR2xvYmFsQ2FjaGVRdWVyeVJlc3BvbnNlIHJlc3BvbnNlID0gR2xvYmFsQ01Eb2N1bWVudENhY2hlLmdldEluc3RhbmNlKCkuZ2V0Q01Eb2N1bWVudChyZXNvbHZlZFVSSSk7Ci0gICAgCUNNRG9jdW1lbnQgY2FjaGVkQ01Eb2N1bWVudCA9IHJlc3BvbnNlLmdldENhY2hlZENNRG9jdW1lbnQoKTsKLSAgICAJZG9jdW1lbnRDYWNoZWFibGUgPSByZXNwb25zZS5pc0RvY3VtZW50Q2FjaGVhYmxlKCk7Ci0gICAgCWlmKGNhY2hlZENNRG9jdW1lbnQgIT0gbnVsbCkgewotICAgIAkJY21Eb2N1bWVudENhY2hlLnB1dENNRG9jdW1lbnQocmVzb2x2ZWRVUkksIGNhY2hlZENNRG9jdW1lbnQpOwotICAgIAkJcmV0dXJuIGNhY2hlZENNRG9jdW1lbnQ7Ci0gICAgCX0KLSAgICB9Ci0KLSAgICBDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7ICAgICAgICAgCi0gICAgaWYgKHJlc29sdmVkVVJJICE9IG51bGwgJiYgcmVzb2x2ZWRVUkkubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIC8vIFRPRE8uLi4gcGFzcyB0aGUgVFlQRSB0aHJ1IHRvIHRoZSBDTURvY3VtZW50QnVpbGRlcgotICAgICAgcmVzdWx0ID0gQ29udGVudE1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNNRG9jdW1lbnQocmVzb2x2ZWRVUkksIHR5cGUpOwotICAgIH0KLSAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgeyAKLSAgICAgIC8vIGxvYWQgdGhlIGFubm90YXRpb24gZmlsZXMgZm9yIHRoZSBkb2N1bWVudCAKLSAgICAgIGlmIChwdWJsaWNJZCAhPSBudWxsKQotICAgICAgeyAgICAKLSAgICAgICAgQW5ub3RhdGlvblV0aWxpdHkubG9hZEFubm90YXRpb25zRm9yR3JhbW1hcihwdWJsaWNJZCwgcmVzdWx0KTsKLSAgICAgIH0KLSAgICAgIGlmKGdsb2JhbENNRG9jdW1lbnRDYWNoZUVuYWJsZWQgJiYgZG9jdW1lbnRDYWNoZWFibGUpIHsKLSAgICAJICBHbG9iYWxDTURvY3VtZW50Q2FjaGUuZ2V0SW5zdGFuY2UoKS5wdXRDTURvY3VtZW50KHJlc29sdmVkVVJJLCByZXN1bHQpOwotICAgICAgfQotICAgICAgY21Eb2N1bWVudENhY2hlLnB1dENNRG9jdW1lbnQocmVzb2x2ZWRVUkksIHJlc3VsdCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjbURvY3VtZW50Q2FjaGUuc2V0U3RhdHVzKHJlc29sdmVkVVJJLCBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0VSUk9SKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAKLQotICBwdWJsaWMgdm9pZCByZW1vdmVBbGxSZWZlcmVuY2VzKCkKLSAgewotICAgIC8vIFRPRE8uLi4gaW5pdGlhdGUgYSB0aW1lZCByZWxlYXNlIG9mIHRoZSBlbnRyaWVzIGluIHRoZSBDTURvY3VtZW50Q2FjaGUKLSAgICBwdWJsaWNJZFRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUdsb2JhbENNRG9jdW1lbnRDYWNoZVNldHRpbmdzKCkgewotCSAgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCSAgaWYocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkgIGdsb2JhbENNRG9jdW1lbnRDYWNoZUVuYWJsZWQgPSBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ01ET0NVTUVOVF9HTE9CQUxfQ0FDSEVfRU5BQkxFRCk7Ci0JICB9Ci0gIH0KLQotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudFJlZmVyZW5jZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9DTURvY3VtZW50UmVmZXJlbmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGVkYWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9DTURvY3VtZW50UmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIENNRG9jdW1lbnRSZWZlcmVuY2VJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudFJlZmVyZW5jZQoteyAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgc3lzdGVtSWQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgcHVibGljSWQ7Ci0KLSAgcHVibGljIENNRG9jdW1lbnRSZWZlcmVuY2VJbXBsKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgdGhpcy5wdWJsaWNJZCA9IHB1YmxpY0lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuc3lzdGVtSWQgPSBzeXN0ZW1JZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcHVibGljSWQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHN5c3RlbUlkOwotICB9ICAgICAgCi0gIAotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiAiWyIgKyBwdWJsaWNJZCArICIsICIgKyBzeXN0ZW1JZCArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0dsb2JhbENNRG9jdW1lbnRDYWNoZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0dsb2JhbENNRG9jdW1lbnRDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTk4MWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9HbG9iYWxDTURvY3VtZW50Q2FjaGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQWJzdHJhY3RNZW1vcnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50OwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnRDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBHbG9iYWxDTURvY3VtZW50Q2FjaGUgewotCQotCXByaXZhdGUgc3RhdGljIEdsb2JhbENNRG9jdW1lbnRDYWNoZSBnbG9iYWxEb2N1bWVudENhY2hlID0gbmV3IEdsb2JhbENNRG9jdW1lbnRDYWNoZSgpOwotCXByaXZhdGUgTWFwIHN5c3RlbUNhdGFsb2dFbnRyaWVzID0gZ2V0U3lzdGVtQ2F0YWxvZ0VudHJpZXMoKTsKLQlwcml2YXRlIE1lbW9yeUxpc3RlbmVyIG1lbW9yeUxpc3RlbmVyOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDQVRFR09SWSA9ICJDTURvY3VtZW50R2xvYmFsQ2FjaGUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIEdsb2JhbENNRG9jdW1lbnRDYWNoZSgpIHsKLQkJTG9nZ2VyLnRyYWNlKENBVEVHT1JZLCAiQ2FjaGUgaW5pdGlhbGl6ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQltZW1vcnlMaXN0ZW5lciA9IG5ldyBNZW1vcnlMaXN0ZW5lcigpOwotCQltZW1vcnlMaXN0ZW5lci5jb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBHbG9iYWxDTURvY3VtZW50Q2FjaGUgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBnbG9iYWxEb2N1bWVudENhY2hlOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIEdsb2JhbENhY2hlUXVlcnlSZXNwb25zZSBnZXRDTURvY3VtZW50KFN0cmluZyBncmFtbWFyVVJJKSB7Ci0JCS8vTG9nZ2VyLnRyYWNlKENBVEVHT1JZLCAiUXVlcnkgZm9yOiAiICsgZ3JhbW1hclVSSSk7IC8vJE5PTi1OTFMtMSQKLQkJT2JqZWN0IHN5c3RlbUNhdGFsb2dFbnRyeSA9IHN5c3RlbUNhdGFsb2dFbnRyaWVzLmdldChncmFtbWFyVVJJKTsKLQkJaWYoc3lzdGVtQ2F0YWxvZ0VudHJ5ICE9IG51bGwpIHsKLQkJCS8vTG9nZ2VyLnRyYWNlKENBVEVHT1JZLCAiRG9jdW1lbnQgIiArIGdyYW1tYXJVUkkgKyAiIGlzIGluIHN5c3RlbSBjYXRhbG9nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJT2JqZWN0IG9iamVjdCA9ICgoU29mdFJlZmVyZW5jZSlzeXN0ZW1DYXRhbG9nRW50cnkpLmdldCgpOwotCQkJaWYob2JqZWN0ICE9IG51bGwpIHsKLQkJCQkvL0xvZ2dlci50cmFjZShDQVRFR09SWSwgIkRvY3VtZW50ICIgKyBncmFtbWFyVVJJICsgImlzIGluIGNhY2hlLCByZXR1cm5pbmcgY2FjaGVkIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmV0dXJuIG5ldyBHbG9iYWxDYWNoZVF1ZXJ5UmVzcG9uc2UoKENNRG9jdW1lbnQpb2JqZWN0LCB0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy9Mb2dnZXIudHJhY2UoQ0FURUdPUlksICJEb2N1bWVudCAiICsgZ3JhbW1hclVSSSArICIgaXMgbm90IGluIGNhY2hlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJldHVybiBuZXcgR2xvYmFsQ2FjaGVRdWVyeVJlc3BvbnNlKG51bGwsIHRydWUpOwotCQkJfQotCQl9Ci0JCS8vTG9nZ2VyLnRyYWNlKENBVEVHT1JZLCAiRG9jdW1lbnQgIiArIGdyYW1tYXJVUkkgKyAiIGlzIG5vdCBpbiBzeXN0ZW0gY2F0YWxvZywgbm90IGNhY2hlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmV0dXJuIG5ldyBHbG9iYWxDYWNoZVF1ZXJ5UmVzcG9uc2UobnVsbCwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHV0Q01Eb2N1bWVudChTdHJpbmcgZ3JhbW1hclVSSSwgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCS8vTG9nZ2VyLnRyYWNlKENBVEVHT1JZLCAiRG9jdW1lbnQ6ICIgKyBncmFtbWFyVVJJICsgIiBhZGRlZCB0byBnbG9iYWwgY2FjaGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXN5c3RlbUNhdGFsb2dFbnRyaWVzLnB1dChncmFtbWFyVVJJLCBuZXcgU29mdFJlZmVyZW5jZShjbURvY3VtZW50KSk7Ci0JfQotCQotCXByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyBIYXNoTWFwIGdldFN5c3RlbUNhdGFsb2dFbnRyaWVzKCl7Ci0JCUhhc2hNYXAgc3lzdGVtQ2F0YWxvZ1VSSXMgPSBuZXcgSGFzaE1hcCgpOwotCQlJQ2F0YWxvZyBzeXN0ZW1DYXRhbG9nID0gbnVsbDsKLQkJSUNhdGFsb2cgZGVmYXVsdENhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCQlJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBkZWZhdWx0Q2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0Q2F0YWxvZ3MubGVuZ3RoOyBpKyspIHsKLQkJCUlOZXh0Q2F0YWxvZyBjYXRhbG9nID0gbmV4dENhdGFsb2dzW2ldOwotCQkJSUNhdGFsb2cgcmVmZXJlbmNlZENhdGFsb2cgPSBjYXRhbG9nLmdldFJlZmVyZW5jZWRDYXRhbG9nKCk7Ci0JCQlpZiAocmVmZXJlbmNlZENhdGFsb2cgIT0gbnVsbCkgewotCQkJCWlmIChYTUxDb3JlUGx1Z2luLlNZU1RFTV9DQVRBTE9HX0lELmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkgewotCQkJCQlzeXN0ZW1DYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKHN5c3RlbUNhdGFsb2cgIT0gbnVsbCkgewotCQkJSUNhdGFsb2dFbnRyeVtdIGNhdGFsb2dFbnRyaWVzID0gc3lzdGVtQ2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRhbG9nRW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCXN5c3RlbUNhdGFsb2dVUklzLnB1dChjYXRhbG9nRW50cmllc1tpXS5nZXRVUkkoKSwgbmV3IFNvZnRSZWZlcmVuY2UobnVsbCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzeXN0ZW1DYXRhbG9nVVJJczsKLQl9Ci0JCi0JcHVibGljIGNsYXNzIEdsb2JhbENhY2hlUXVlcnlSZXNwb25zZSB7Ci0JCQotCQlwcml2YXRlIENNRG9jdW1lbnQgY2FjaGVkRG9jdW1lbnQ7Ci0JCXByaXZhdGUgYm9vbGVhbiBkb2N1bWVudENhY2hlYWJsZTsKLQkJCi0JCXB1YmxpYyBHbG9iYWxDYWNoZVF1ZXJ5UmVzcG9uc2UoQ01Eb2N1bWVudCBjYWNoZWRDTURvY3VtZW50LCBib29sZWFuIGRvY3VtZW50Q2FjaGVhYmxlKSB7Ci0JCQl0aGlzLmNhY2hlZERvY3VtZW50ID0gY2FjaGVkQ01Eb2N1bWVudDsKLQkJCXRoaXMuZG9jdW1lbnRDYWNoZWFibGUgPSBkb2N1bWVudENhY2hlYWJsZTsKLQkJfQotCQkKLQkJcHVibGljIENNRG9jdW1lbnQgZ2V0Q2FjaGVkQ01Eb2N1bWVudCgpIHsKLQkJCXJldHVybiBjYWNoZWREb2N1bWVudDsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNEb2N1bWVudENhY2hlYWJsZSgpIHsKLQkJCXJldHVybiBkb2N1bWVudENhY2hlYWJsZTsKLQkJfQotCQkKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIE1lbW9yeUxpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RNZW1vcnlMaXN0ZW5lciB7Ci0JCXByb3RlY3RlZCB2b2lkIGhhbmRsZU1lbW9yeUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlPYmplY3QgdG9waWMgPSBldmVudC5nZXRQcm9wZXJ0eShFdmVudENvbnN0YW50cy5FVkVOVF9UT1BJQyk7Ci0JCQlpZihTRVZfU0VSSU9VUy5lcXVhbHModG9waWMpIHx8IFNFVl9DUklUSUNBTC5lcXVhbHModG9waWMpKSB7Ci0JCQkJTG9nZ2VyLnRyYWNlKENBVEVHT1JZLCAiU2VyaW91cyBzZXZlcml0eSBsb3cgbWVtb3J5IGV2ZW50IHJlY2VpdmVkLCBmbHVzaGluZyBnbG9iYWwgQ01Eb2N1bWVudCBjYWNoZS4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN5c3RlbUNhdGFsb2dFbnRyaWVzID0gZ2V0U3lzdGVtQ2F0YWxvZ0VudHJpZXMoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0luZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0luZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTFlNzJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9JbmZlcnJlZEdyYW1tYXJCdWlsZGluZ0NNRG9jdW1lbnRMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGwuSW5mZXJyZWRHcmFtbWFyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIEluZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlciBleHRlbmRzIENNRG9jdW1lbnRMb2FkZXIKLXsgICAgIAotICBwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbjsKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnQgaW5mZXJyZWRDTURvY3VtZW50OwotICBwcm90ZWN0ZWQgSW5mZXJyZWRHcmFtbWFyRmFjdG9yeSBpbmZlcnJlZEdyYW1tYXJGYWN0b3J5OwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGNyZWF0ZWRDTURvY3VtZW50VGFibGU7Ci0KLSAgcHVibGljIEluZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlcihEb2N1bWVudCBkb2N1bWVudCwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzKGRvY3VtZW50LCBtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCkpOwotICB9Ci0gIAotICBwdWJsaWMgSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyKERvY3VtZW50IGRvY3VtZW50LCBDTURvY3VtZW50TWFuYWdlciBjbURvY3VtZW50TWFuYWdlcikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgc3VwZXIoZG9jdW1lbnQsIGNtRG9jdW1lbnRNYW5hZ2VyKTsKLSAgICBjcmVhdGVkQ01Eb2N1bWVudFRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOyAgICAgICAgICAgICAKLSAgICBpbmZlcnJlZEdyYW1tYXJGYWN0b3J5ID0gbmV3IEluZmVycmVkR3JhbW1hckZhY3RvcnkoKTsKLSAgfSAgICAgCi0KLSAgICAgCi0gIHB1YmxpYyB2b2lkIGxvYWRDTURvY3VtZW50cygpCi0gIHsgICAKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLWxvYWRDTURvY3VtZW50cyAtLS0tLS0tLS0tLS0iKTsgICAgICAgICAgCi0gICAgaWYgKGluZmVycmVkR3JhbW1hckZhY3RvcnkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvL2xvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgc3VwZXIubG9hZENNRG9jdW1lbnRzKCk7Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiLS0tIGVsYXBzZWQgdGltZSAoIiArIGNvdW50ICsgIikgPSAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkpOwotICAgICAgLy9pbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmRlYnVnUHJpbnQoY3JlYXRlZENNRG9jdW1lbnRUYWJsZS52YWx1ZXMoKSk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlRWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsgCi0gICAgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgCi0gICAgaWYgKGluZmVycmVkQ01Eb2N1bWVudCA9PSBudWxsKQotICAgIHsgICAgIAotICAgICAgU3RyaW5nIGNhY2hlS2V5ID0gImluZmVycmVkLWRvY3VtZW50IjsgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgIGluZmVycmVkQ01Eb2N1bWVudCA9IGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01Eb2N1bWVudCgiIik7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgY21Eb2N1bWVudE1hbmFnZXIuYWRkQ01Eb2N1bWVudCgiIiwgIiIsIGNhY2hlS2V5LCAiRFREIiwgaW5mZXJyZWRDTURvY3VtZW50KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIGNyZWF0ZWRDTURvY3VtZW50VGFibGUucHV0KGNhY2hlS2V5LCBpbmZlcnJlZENNRG9jdW1lbnQpOwotICAgIH0gCi0KLSAgICBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uID0gaW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5jcmVhdGVDTUVsZW1lbnREZWNsYXJhdGlvbihpbmZlcnJlZENNRG9jdW1lbnQsIGVsZW1lbnQsIGZhbHNlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAKLSAgICBpZiAocGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01Db250ZW50KGluZmVycmVkQ01Eb2N1bWVudCwgcGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiwgaW5mZXJyZWRDTURvY3VtZW50LCBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uLCBmYWxzZSwgbnVsbCk7Ci0gICAgfSAgICAgCi0gICAgICAgCi0KLSAgICB2aXNpdENoaWxkTm9kZXMoZWxlbWVudCk7ICAgCi0gICAgICAgICAgIAotICAgIC8vIHJlc2V0IHRoZSAnY3VycmVudCcgc3RhdGUgdG8gaW5pdGFsIHZhbHVlcwotICAgIGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gPSBwYXJlbnRJbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uOwotICB9Ci0gIAotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUVsZW1lbnROUyhFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIENNRG9jdW1lbnQgcGFyZW50SW5mZXJyZWRDTURvY3VtZW50ID0gaW5mZXJyZWRDTURvY3VtZW50OwotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gPSBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uOwotICAgICAgICAKLSAgICBpbmZlcnJlZENNRG9jdW1lbnQgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gPSBudWxsOwotCi0gICAgLy8gYnkgYWRkaW5nIHRoZSBlbGVtZW50IHRvIHRoZSBuYW1lc3BhY2VUYWJsZSwgaGFuZGxlR3JhbW1hcigpIHdpbGwgZ2V0IGNhbGxlZCBmb3IgYW55IHNjaGVtYSByZWZlcmVuY2VzCi0gICAgaWYgKGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpICE9IGRvY3VtZW50KQotICAgIHsKLSAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgU3RyaW5nIHVyaSA9IG5hbWVzcGFjZVRhYmxlLmdldFVSSUZvclByZWZpeChwcmVmaXgpOwotCi0gICAgaWYgKHVyaSA9PSBudWxsICYmIGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpID09IGRvY3VtZW50KQotICAgIHsKLSAgICAgIC8vIHdoZW4gdGhpcyBpcyB0aGUgcm9vdCBlbGVtZW50Ci0gICAgICAvLyB3ZSBuZWVkIHRvIGFkZCBhbiBpbXBsaWVkICJubyBuYW1lc3BhY2Ugc2NoZW1hIGxvY2F0aW9uIgotICAgICAgdXJpID0gIm9tbWl0dGVkLW5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZE5hbWVzcGFjZUluZm8ocHJlZml4LCB1cmksICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0gIAotCi0gICAgLy8gaGVyZSdzIHdoZXJlIHdlIHVwZGF0ZSB0aGUgaW5mZXJyZWQgZ3JhbW1hciBpZiByZXF1aXJlZAotICAgIC8vIAotICAgIGJvb2xlYW4gY3JlYXRlQ01FbGVtZW50RGVjbGFyYXRpb24gPSB0cnVlOwotICAgICAgICAgIAotICAgIGJvb2xlYW4gaXNMb2NhbCA9ICh1cmkgPT0gbnVsbCAmJiBwcmVmaXggPT0gbnVsbCk7ICAgICAgICAgCi0gICAgaWYgKGlzTG9jYWwpCi0gICAgeyAgICAgICAgICAKLSAgICAgIGlmIChwYXJlbnRJbmZlcnJlZENNRG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gdGhpcyBpcyBhIGxvY2FsIGVsZW1lbnQuLi4gYW5kIHRoZSBwYXJlbnQgaXMgbm90IGluZmVycmVkIChlLmcpIGl0IGhhcyBhIGtub3duIGdyYW1tYXIKLSAgICAgICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiBmb3IgdGhpcyBlbGVtZW50Ci0gICAgICAgIGNyZWF0ZUNNRWxlbWVudERlY2xhcmF0aW9uID0gZmFsc2U7IAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHVyaSA9ICJvbW1pdHRlZC1uYW1lc3BhY2UiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoY3JlYXRlQ01FbGVtZW50RGVjbGFyYXRpb24pCi0gICAgeyAgICAgICAgICAgIAotICAgICAgaWYgKGlzTG9jYWwpCi0gICAgICB7Ci0gICAgICAgIGluZmVycmVkQ01Eb2N1bWVudCA9IHBhcmVudEluZmVycmVkQ01Eb2N1bWVudDsKLSAgICAgICAgaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01FbGVtZW50RGVjbGFyYXRpb24oaW5mZXJyZWRDTURvY3VtZW50LCBlbGVtZW50LCB0cnVlKTsgICAgICAgCi0gICAgICB9ICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBib29sZWFuIGNyZWF0ZUNNRG9jdW1lbnQgPSBmYWxzZTsKLQotICAgICAgICBTdHJpbmcgY2FjaGVLZXkgPSAiaW5mZXJyZWQtZG9jdW1lbnQiICsgdXJpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBpbmZlcnJlZENNRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCljcmVhdGVkQ01Eb2N1bWVudFRhYmxlLmdldChjYWNoZUtleSk7Ci0KLSAgICAgICAgaWYgKGluZmVycmVkQ01Eb2N1bWVudCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBhbiBpbmZlcnJlZCBkb2N1bWVudCBmb3IgdGhpcyB1cmkgeWV0Li4uIGxldCdzIHNlZSBvZiB3ZSBuZWVkIG9uZQotICAgICAgICAgIGludCBzdGF0dXMgPSBjbURvY3VtZW50TWFuYWdlci5nZXRDTURvY3VtZW50U3RhdHVzKHVyaSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGlmIChzdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19OT1RfTE9BREVEIHx8IHN0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0VSUk9SKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHRoZSBjYWNoZSBkb2VzIG5vdCBjb250YWluIGEgJ3Byb3BlcicgQ01Eb2N1bWVudCBmb3IgdGhpcyB1cmkKLSAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gY3JlYXRlIGFuIGluZmVycmVkIG9uZQotICAgICAgICAgICAgY3JlYXRlQ01Eb2N1bWVudCA9IHRydWU7Ci0gICAgICAgICAgfSAKLSAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGNyZWF0ZUNNRG9jdW1lbnQpCi0gICAgICAgIHsgICAgICAgICAgIAotICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJlbmNvdW50ZXJlZCBlbGVtZW50IHsiICsgZWxlbWVudC5nZXROb2RlTmFtZSgpICsgIn0gLi4uIGNyZWF0aW5nIGluZmVycmVkIENNRG9jdW1lbnQgZm9yICIgKyB1cmkpOwotICAgICAgICAgIGluZmVycmVkQ01Eb2N1bWVudCA9IGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01Eb2N1bWVudCh1cmkpOwotICAgICAgICAgIGNtRG9jdW1lbnRNYW5hZ2VyLmFkZENNRG9jdW1lbnQodXJpLCAiIiwgY2FjaGVLZXksICJYU0QiLCBpbmZlcnJlZENNRG9jdW1lbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICBjcmVhdGVkQ01Eb2N1bWVudFRhYmxlLnB1dChjYWNoZUtleSwgaW5mZXJyZWRDTURvY3VtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmZlcnJlZENNRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gPSBpbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmNyZWF0ZUNNRWxlbWVudERlY2xhcmF0aW9uKGluZmVycmVkQ01Eb2N1bWVudCwgZWxlbWVudCwgZmFsc2UpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB9Ci0KLSAgICAgIGlmIChwYXJlbnRJbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01Db250ZW50KHBhcmVudEluZmVycmVkQ01Eb2N1bWVudCwgcGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiwgaW5mZXJyZWRDTURvY3VtZW50LCBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uLCBpc0xvY2FsLCB1cmkpOwotICAgICAgfSAKLSAgICB9ICAgICAgICAgICAgICAgCi0gICAgICAgICAgCi0gICAgdmlzaXRDaGlsZE5vZGVzKGVsZW1lbnQpOwotICAgICAgCi0gICAgLy8gcmVzZXQgdGhlICdjdXJyZW50JyBzdGF0ZSB0byBpbml0YWwgdmFsdWVzCi0gICAgaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IHBhcmVudEluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb247Ci0gICAgaW5mZXJyZWRDTURvY3VtZW50ID0gcGFyZW50SW5mZXJyZWRDTURvY3VtZW50OwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlBY3Rpb25IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5QWN0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NmEwZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlBY3Rpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbC5DTVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlBY3Rpb25IZWxwZXIKLXsKLSAgcHJvdGVjdGVkIE1vZGVsUXVlcnlJbXBsIG1vZGVsUXVlcnk7Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBBY3Rpb24gaW1wbGVtZW50cyBNb2RlbFF1ZXJ5QWN0aW9uCi0gIHsKLSAgICBwdWJsaWMgaW50IGtpbmQ7Ci0gICAgcHVibGljIGludCBzdGFydEluZGV4OwotICAgIHB1YmxpYyBpbnQgZW5kSW5kZXg7Ci0gICAgcHVibGljIE5vZGUgcGFyZW50OwotICAgIHB1YmxpYyBDTU5vZGUgY21Ob2RlOwotICAgIHB1YmxpYyBPYmplY3QgdXNlckRhdGE7Ci0KLSAgICBwdWJsaWMgQWN0aW9uKGludCBraW5kLCBOb2RlIHBhcmVudCwgQ01Ob2RlIGNtTm9kZSkKLSAgICB7Ci0gICAgICB0aGlzLmtpbmQgPSBraW5kOwotICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICB0aGlzLmNtTm9kZSA9IGNtTm9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWN0aW9uKGludCBraW5kLCBOb2RlIHBhcmVudCwgQ01Ob2RlIGNtTm9kZSwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkKLSAgICB7Ci0gICAgICB0aGlzLmtpbmQgPSBraW5kOwotICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICB0aGlzLmNtTm9kZSA9IGNtTm9kZTsKLSAgICAgIHRoaXMuc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXg7Ci0gICAgICB0aGlzLmVuZEluZGV4ID0gZW5kSW5kZXg7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRLaW5kKCkKLSAgICB7Ci0gICAgICByZXR1cm4ga2luZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFN0YXJ0SW5kZXgoKQotICAgIHsKLSAgICAgIHJldHVybiBzdGFydEluZGV4OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RW5kSW5kZXgoKQotICAgIHsKLSAgICAgIHJldHVybiBlbmRJbmRleDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBnZXRQYXJlbnQoKQotICAgIHsKLSAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIENNTm9kZSBnZXRDTU5vZGUoKQotICAgIHsKLSAgICAgIHJldHVybiBjbU5vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRVc2VyRGF0YSgpCi0gICAgewotICAgICAgcmV0dXJuIHVzZXJEYXRhOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVzZXJEYXRhKE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgdXNlckRhdGEgPSBvYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGVyZm9ybUFjdGlvbigpCi0gICAgewotICAgIH0KLSAgfQotCi0KLSAgcHVibGljIE1vZGVsUXVlcnlBY3Rpb25IZWxwZXIoTW9kZWxRdWVyeUltcGwgbW9kZWxRdWVyeSkKLSAgewotICAgIHRoaXMubW9kZWxRdWVyeSA9IG1vZGVsUXVlcnk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGdldEFsbEFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gIH0KLQotCi0gIC8vIGluc2VydCBhY3Rpb25zCi0gIC8vCi0gIHB1YmxpYyB2b2lkIGdldEluc2VydEFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5kZXgsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIGlmICgoaW5jbHVkZU9wdGlvbnMgJiBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUykgIT0gMCkKLSAgICB7Ci0gICAgICBnZXRJbnNlcnRBdHRyaWJ1dGVBY3Rpb25zKHBhcmVudCwgZWQsIHZhbGlkaXR5Q2hlY2tpbmcsIGFjdGlvbkxpc3QpOwotICAgIH0KLSAgICBpbmNsdWRlT3B0aW9ucyAmPSB+TW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVM7Ci0gICAgaWYgKChpbmNsdWRlT3B0aW9ucyAmIE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUykgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGdldEluc2VydENoaWxkTm9kZUFjdGlvbnNBdEluZGV4KHBhcmVudCwgZWQsIGluZGV4LCBpbmNsdWRlT3B0aW9ucywgdmFsaWRpdHlDaGVja2luZywgYWN0aW9uTGlzdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGdldEluc2VydENoaWxkTm9kZUFjdGlvbnMocGFyZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMsIHZhbGlkaXR5Q2hlY2tpbmcsIGFjdGlvbkxpc3QpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLQotICBwcm90ZWN0ZWQgdm9pZCBnZXRJbnNlcnRBdHRyaWJ1dGVBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIC8vIGdldCBhY3Rpb25zIGZvciBlYWNoIGluc2VydGFibGUgYXR0cmlidXRlCi0gICAgLy8KLSAgICBMaXN0IGF2YWlsYWJsZUF0dHJpYnV0ZUxpc3QgPSBtb2RlbFF1ZXJ5LmdldEF2YWlsYWJsZUNvbnRlbnQocGFyZW50LCBlZCwgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMpOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gYXZhaWxhYmxlQXR0cmlidXRlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbilpLm5leHQoKTsKLSAgICAgIGlmIChtb2RlbFF1ZXJ5LmNhbkluc2VydChwYXJlbnQsIGVkLCBhZCwgMCwgdmFsaWRpdHlDaGVja2luZykpCi0gICAgICB7Ci0gICAgICAgIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJULCBwYXJlbnQsIGFkKTsKLSAgICAgICAgYWN0aW9uTGlzdC5hZGQoYWN0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIGdldEluc2VydENoaWxkTm9kZUFjdGlvbnNBdEluZGV4KEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluZGV4LCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vIGdldCBhY3Rpb25zIGZvciBlYWNoIGluc2VydGFibGUgYXR0cmlidXRlCi0gICAgLy8KLSAgICBpbnQgc2l6ZSA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCk7Ci0gICAgaWYgKGluZGV4IDw9IHNpemUpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QgPSBtb2RlbFF1ZXJ5LmdldFZhbGlkYXRvcigpLmNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChwYXJlbnQsIGVkKTsgCi0gICAgICBMaXN0IGF2YWlsYWJsZUNoaWxkTm9kZUxpc3QgPSBtb2RlbFF1ZXJ5LmdldEF2YWlsYWJsZUNvbnRlbnQocGFyZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMpOwotCi0gICAgICBib29sZWFuIGlzU2ltcGxlQ2hvaWNlID0gaXNTaW1wbGVDaG9pY2VHcm91cENvbnRlbnRNb2RlbChlZCk7Ci0gICAgIAotICAgICAgZm9yIChJdGVyYXRvciBpID0gYXZhaWxhYmxlQ2hpbGROb2RlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBDTU5vZGUgY21Ob2RlID0gKENNTm9kZSlpLm5leHQoKTsgICAgICAKLSAgICAgICAgaWYgKGlzU2ltcGxlQ2hvaWNlIHx8IG1vZGVsUXVlcnkuY2FuSW5zZXJ0KHBhcmVudCwgZWQsIGNtTm9kZSwgaW5kZXgsIHZhbGlkaXR5Q2hlY2tpbmcsIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCkpCi0gICAgICAgIHsKLSAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbihNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCwgcGFyZW50LCBjbU5vZGUsIGluZGV4LCBpbmRleCk7Ci0gICAgICAgICAgYWN0aW9uTGlzdC5hZGQoYWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAgICAgICAgICAgICAgICAgCi0gCi0gIHByb3RlY3RlZCBib29sZWFuIGlzU2ltcGxlQ2hvaWNlR3JvdXBDb250ZW50TW9kZWwoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsgICAgICAgCi0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBDTU5vZGUgY21Ob2RlID0gZWQuZ2V0Q29udGVudCgpOwotICAgIGlmIChjbU5vZGUgIT0gbnVsbCAmJiBjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuR1JPVVApCi0gICAgewotICAgICAgQ01Hcm91cCBjbUdyb3VwID0gKENNR3JvdXApY21Ob2RlOwotICAgICAgaWYgKGNtR3JvdXAuZ2V0T3BlcmF0b3IoKSA9PSBDTUdyb3VwLkNIT0lDRSAmJiBjbUdyb3VwLmdldE1heE9jY3VyKCkgPT0gLTEpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICBDTU5vZGVMaXN0IGxpc3QgPSBjbUdyb3VwLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IGxpc3QuZ2V0TGVuZ3RoKCkgLSAxOyBpID49IDA7IGktLSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChsaXN0Lml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKSAhPSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCBnZXRJbnNlcnRDaGlsZE5vZGVBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgaW50IHNpemUgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpOwotICAgIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0ID0gbW9kZWxRdWVyeS5nZXRWYWxpZGF0b3IoKS5jcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QocGFyZW50LCBlZCk7Ci0gICAgTGlzdCBhdmFpbGFibGVDaGlsZE5vZGVMaXN0ID0gbW9kZWxRdWVyeS5nZXRBdmFpbGFibGVDb250ZW50KHBhcmVudCwgZWQsIGluY2x1ZGVPcHRpb25zKTsKLQotICAgIGJvb2xlYW4gaXNTaW1wbGVDaG9pY2UgPSBpc1NpbXBsZUNob2ljZUdyb3VwQ29udGVudE1vZGVsKGVkKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhdmFpbGFibGVDaGlsZE5vZGVMaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIENNTm9kZSBjbU5vZGUgPSAoQ01Ob2RlKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGZvciAoaW50IGkgPSBzaXplOyBpID49IDA7IGktLSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGlzU2ltcGxlQ2hvaWNlIHx8IG1vZGVsUXVlcnkuY2FuSW5zZXJ0KHBhcmVudCwgZWQsIGNtTm9kZSwgaSwgdmFsaWRpdHlDaGVja2luZywgY29udGVudFNwZWNpZmljYXRpb25MaXN0KSkKLSAgICAgICAgewotICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJULCBwYXJlbnQsIGNtTm9kZSwgaSwgaSk7Ci0gICAgICAgICAgYWN0aW9uTGlzdC5hZGQoYWN0aW9uKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdldEluc2VydEFjdGlvbnMoRG9jdW1lbnQgcGFyZW50LCBDTURvY3VtZW50IGNtRG9jdW1lbnQsIGludCBpbmRleCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgLy8gZ2V0IHRoZSByb290IGVsZW1lbnQgYW5kIGRvY3R5cGUgaW5kZXggKGlmIGFueSkKLSAgICAvLwotICAgIGludCBkb2N0eXBlSW5kZXggPSAtMTsKLSAgICBEb2N1bWVudFR5cGUgZG9jdHlwZSA9IG51bGw7Ci0gICAgRWxlbWVudCByb290RWxlbWVudCA9IG51bGw7Ci0gICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3RMZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIGNoaWxkTm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0gICAgICBpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIHJvb3RFbGVtZW50ID0gKEVsZW1lbnQpY2hpbGROb2RlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKQotICAgICAgewotICAgICAgICBkb2N0eXBlID0gKERvY3VtZW50VHlwZSljaGlsZE5vZGU7Ci0gICAgICAgIGRvY3R5cGVJbmRleCA9IGk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gbWFrZSBzdXJlIHRoYXQgcm9vdCBlbGVtZW50cyBhcmUgb25seSBhZGRlZCBhZnRlciB0aGUgZG9jdHlwZSAoaWYgYW55KQotICAgIGlmIChyb290RWxlbWVudCA9PSBudWxsICYmIGluZGV4ID4gZG9jdHlwZUluZGV4KQotICAgIHsKLSAgICAgIENNTmFtZWROb2RlTWFwIG1hcCA9IGNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsKLSAgICAgIGludCBtYXBMZW5ndGggPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcExlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBDTU5vZGUgY21Ob2RlID0gbWFwLml0ZW0oaSk7Ci0KLSAgICAgICAgYm9vbGVhbiBjYW5BZGQgPSB0cnVlOwotICAgICAgICBpZiAodmFsaWRpdHlDaGVja2luZyA9PSBNb2RlbFF1ZXJ5LlZBTElESVRZX1NUUklDVCkKLSAgICAgICAgewotICAgICAgICAgIGNhbkFkZCA9IGRvY3R5cGUgPT0gbnVsbCB8fCBkb2N0eXBlLmdldE5hbWUoKS5lcXVhbHMoY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNhbkFkZCkKLSAgICAgICAgewotICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJULCBwYXJlbnQsIGNtTm9kZSwgaW5kZXgsIGluZGV4KTsKLSAgICAgICAgICBhY3Rpb25MaXN0LmFkZChhY3Rpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotCi0gIHB1YmxpYyB2b2lkIGdldEluc2VydENoaWxkTm9kZUFjdGlvblRhYmxlKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIEhhc2h0YWJsZSBhY3Rpb25UYWJsZSkKLSAgewotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBnZXRSZXBsYWNlQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIENNVmFsaWRhdG9yLk1hdGNoTW9kZWxOb2RlIG1hdGNoTW9kZWxOb2RlID0gbW9kZWxRdWVyeS5nZXRWYWxpZGF0b3IoKS5nZXRNYXRjaE1vZGVsKGVkLCBwYXJlbnQpOwotICAgIGlmIChtYXRjaE1vZGVsTm9kZSAhPSBudWxsKQotICAgIHsKLSAgICAgIE1hdGNoTW9kZWxWaXNpdG9yIHZpc2l0b3IgPSBuZXcgTWF0Y2hNb2RlbFZpc2l0b3IocGFyZW50LCBhY3Rpb25MaXN0KTsKLSAgICAgIHZpc2l0b3IudmlzaXRNYXRjaE1vZGVsTm9kZShtYXRjaE1vZGVsTm9kZSk7Ci0gICAgfSAgICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBnZXRSZXBsYWNlQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3Qgc2VsZWN0ZWRDaGlsZHJlbiwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgaW50W10gcmFuZ2UgPSBnZXRSYW5nZShwYXJlbnQsIHNlbGVjdGVkQ2hpbGRyZW4pOwotICAgIGlmIChyYW5nZSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICBpZiAoaXNDb250aWd1b3VzKHBhcmVudCwgcmFuZ2UsIHNlbGVjdGVkQ2hpbGRyZW4pKQotICAgICAgewotICAgICAgICBMaXN0IHRlbXBMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBnZXRSZXBsYWNlQWN0aW9ucyhwYXJlbnQsIGVkLCBpbmNsdWRlT3B0aW9ucywgdmFsaWRpdHlDaGVja2luZywgdGVtcExpc3QpOwotICAgICAgICBpZiAoKGluY2x1ZGVPcHRpb25zICYgTW9kZWxRdWVyeS5JTkNMVURFX0VOQ0xPU0lOR19SRVBMQUNFX0FDVElPTlMpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICByZW1vdmVBY3Rpb25zTm90Q29udGFpbmluZ1JhbmdlKHRlbXBMaXN0LCByYW5nZVswXSwgcmFuZ2VbMV0pOyAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlbW92ZUFjdGlvbnNOb3RNYXRjaGluZ1JhbmdlKHRlbXBMaXN0LCByYW5nZVswXSwgcmFuZ2VbMV0pOyAgICAKLSAgICAgICAgfQotICAgICAgICBhY3Rpb25MaXN0LmFkZEFsbCh0ZW1wTGlzdCk7Ci0gICAgICB9Ci0gICAgfSAgIAotICAgIAotICAgIGlmIChzZWxlY3RlZENoaWxkcmVuLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIE5vZGUgbm9kZSA9IChOb2RlKXNlbGVjdGVkQ2hpbGRyZW4uZ2V0KDApOwotICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsgICAgICAgIAotICAgICAgICBFbGVtZW50IGNoaWxkRWxlbWVudCA9IChFbGVtZW50KW5vZGU7ICAgICAgIAotICAgICAgICBDTU5vZGUgY2hpbGRFZCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oY2hpbGRFbGVtZW50KTsKLSAgICAgICAgaWYgKGNoaWxkRWQgIT0gbnVsbCkKLSAgICAgICAgeyAgICAgICAgIAotCi0gICAgICAgICAgQ01Ob2RlIGNoaWxkT3JpZ2luPSBtb2RlbFF1ZXJ5LmdldE9yaWdpbihjaGlsZEVsZW1lbnQpOwotCi0gICAgICAgICAgQ01Ob2RlTGlzdCBjbU5vZGVMaXN0ID0gY2hpbGRPcmlnaW4gIT0gbnVsbCA/IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENNTm9kZUxpc3QpY2hpbGRPcmlnaW4uZ2V0UHJvcGVydHkoIlN1YnN0aXR1dGlvbkdyb3VwIikgOiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ01Ob2RlTGlzdCljaGlsZEVkLmdldFByb3BlcnR5KCJTdWJzdGl0dXRpb25Hcm91cCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICBpZiAoY21Ob2RlTGlzdCAhPSBudWxsICYmIGNtTm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAxKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgcmVwbGFjZUluZGV4ID0gZ2V0SW5kZXgocGFyZW50LCBjaGlsZEVsZW1lbnQpOwotICAgICAgICAgICAgU3RyaW5nIGNoaWxkRWROYW1lID0gY2hpbGRFZC5nZXROb2RlTmFtZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbU5vZGVMaXN0LmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgICAgICB7ICAgICAgICAgCi0gICAgICAgICAgICAgIENNTm9kZSBzdWJzdGl0dXRpb24gPSBjbU5vZGVMaXN0Lml0ZW0oaSk7Ci0gICAgICAgICAgICAgIGlmICghc3Vic3RpdHV0aW9uLmdldE5vZGVOYW1lKCkuZXF1YWxzKGNoaWxkRWROYW1lKSAmJiAhQm9vbGVhbi5UUlVFLmVxdWFscyhzdWJzdGl0dXRpb24uZ2V0UHJvcGVydHkoIkFic3RyYWN0IikpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbihNb2RlbFF1ZXJ5QWN0aW9uLlJFUExBQ0UsIHBhcmVudCwgY21Ob2RlTGlzdC5pdGVtKGkpLCByZXBsYWNlSW5kZXgsIHJlcGxhY2VJbmRleCk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uTGlzdC5hZGQoYWN0aW9uKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSAgIAotICAgIH0KLSAgfSAgICAgCi0gICAgICAgICAgIAotICAKLSAgLy8gcmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RlZCBub2RlcyBhcmUgY29udGlndW91cwotICAvLyAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzQ29udGlndW91cyhFbGVtZW50IHBhcmVudCwgaW50W10gcmFuZ2UsIExpc3Qgc2VsZWN0ZWROb2RlTGlzdCkKLSAgeyAgICAgICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICBOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JLy8gaXNzdWU6IG5vZGVMaXN0TGVuZ3RoIHdhcyBuZXZlciByZWFkLCBidXQgaW4gdGhlb3J5LCAKLQkvLyBub2RlbExpc3QuZ2V0TGVuZ3RoKCkgbWlnaHQgY2F1c2Ugc29tZSBjbGVhcmluZyBvZiBjYWNoZWQgCi0JLy8gZGF0YSwgb3Igc29tZXRoaW5nLCBzbyBsZWF2aW5nIGluIGEgcG90ZW50aWFsIG1lYW5pbmdsZXNzIGNhbGwsIGZvciBub3cuCi0gICAgLy9pbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQlub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gcmFuZ2VbMF07IGkgPCByYW5nZVsxXTsgaSsrKQotICAgIHsgICAgICAgCi0gICAgICBOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOyAgICAKLSAgICAgIGlmICghaXNXaGl0ZXNwYWNlTm9kZShub2RlKSAmJiAhc2VsZWN0ZWROb2RlTGlzdC5jb250YWlucyhub2RlKSkKLSAgICAgIHsgICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0gICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gCi0gCi0gIHByb3RlY3RlZCBpbnRbXSBnZXRSYW5nZShFbGVtZW50IHBhcmVudCwgTGlzdCBsaXN0KQotICB7Ci0gICAgaW50W10gcmVzdWx0ID0gbnVsbDsKLSAgICBpbnQgZmlyc3QgPSAtMTsKLSAgICBpbnQgbGFzdCA9IC0xOyAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3RMZW5ndGg7IGkrKykKLSAgICB7ICAgICAgIAotICAgICAgTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbShpKTsgICAgCi0gICAgICBpZiAobGlzdC5jb250YWlucyhub2RlKSkKLSAgICAgIHsgICAgICAgICAgICAgCi0gICAgICAgIGZpcnN0ID0gKGZpcnN0ID09IC0xKSA/IGkgOiBNYXRoLm1pbihmaXJzdCwgaSk7ICAgICAgICAKLSAgICAgICAgbGFzdCA9IE1hdGgubWF4KGxhc3QsIGkpOwotICAgICAgfSAgICAKLSAgICB9Ci0gICAKLSAgICBpZiAoZmlyc3QgIT0gLTEgJiYgbGFzdCE9IC0xKQotICAgIHsgICAgICAgICAgICAgCi0gICAgICByZXN1bHQgPSBuZXcgaW50WzJdOwotICAgICAgcmVzdWx0WzBdID0gZmlyc3Q7Ci0gICAgICByZXN1bHRbMV0gPSBsYXN0OwotICAgIH0gICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotCi0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNXaGl0ZXNwYWNlTm9kZShOb2RlIG5vZGUpCi0gIHsKLSAgICByZXR1cm4gbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmCi0gICAgICAgICAgIG5vZGUuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDA7Ci0gIH0gCi0KLQotICBwcm90ZWN0ZWQgaW50IGdldEluZGV4KE5vZGUgcGFyZW50Tm9kZSwgTm9kZSBjaGlsZCkKLSAgewotICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IGluZGV4ID0gLTE7Ci0gICAgaW50IHNpemUgPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobm9kZUxpc3QuaXRlbShpKSA9PSBjaGlsZCkKLSAgICAgIHsKLSAgICAgICAgaW5kZXggPSBpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGluZGV4OwotICB9ICAgICAgICAgICAgICAgICAgICAKLQotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzQWN0aW9uQ29udGFpbmluZ1JhbmdlKE1vZGVsUXVlcnlBY3Rpb24gYWN0aW9uLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KQotICB7Ci0gICAgaW50IGFjdGlvblN0YXJ0SW5kZXggPSBhY3Rpb24uZ2V0U3RhcnRJbmRleCgpOwotICAgIGludCBhY3Rpb25FbmRJbmRleCA9IGFjdGlvbi5nZXRFbmRJbmRleCgpOwotCi0gICAgcmV0dXJuIChhY3Rpb25TdGFydEluZGV4IDw9IHN0YXJ0SW5kZXggJiYKLSAgICAgICAgICAgIGFjdGlvbkVuZEluZGV4ID49IGVuZEluZGV4KTsKLSAgfSAKLSAgICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBY3Rpb25NYXRjaGluZ1JhbmdlKE1vZGVsUXVlcnlBY3Rpb24gYWN0aW9uLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KQotICB7Ci0gICAgaW50IGFjdGlvblN0YXJ0SW5kZXggPSBhY3Rpb24uZ2V0U3RhcnRJbmRleCgpOwotICAgIGludCBhY3Rpb25FbmRJbmRleCA9IGFjdGlvbi5nZXRFbmRJbmRleCgpOwotICAgIHJldHVybiAoYWN0aW9uU3RhcnRJbmRleCA9PSBzdGFydEluZGV4ICYmICAgICAgICAKLSAgICAgICAgICAgIGFjdGlvbkVuZEluZGV4ID09IGVuZEluZGV4KTsKLSAgfSAKLSAgICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWN0aW9uc05vdENvbnRhaW5pbmdSYW5nZShMaXN0IGFjdGlvbkxpc3QsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpCi0gIHsKLSAgICBmb3IgKGludCBpID0gYWN0aW9uTGlzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkKLSAgICB7Ci0gICAgICBNb2RlbFF1ZXJ5QWN0aW9uIGFjdGlvbiA9IChNb2RlbFF1ZXJ5QWN0aW9uKWFjdGlvbkxpc3QuZ2V0KGkpOwotICAgICAgaWYgKCFpc0FjdGlvbkNvbnRhaW5pbmdSYW5nZShhY3Rpb24sIHN0YXJ0SW5kZXgsIGVuZEluZGV4KSkKLSAgICAgIHsKLSAgICAgICAgYWN0aW9uTGlzdC5yZW1vdmUoaSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVBY3Rpb25zTm90TWF0Y2hpbmdSYW5nZShMaXN0IGFjdGlvbkxpc3QsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpCi0gIHsKLSAgICBmb3IgKGludCBpID0gYWN0aW9uTGlzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkKLSAgICB7Ci0gICAgICBNb2RlbFF1ZXJ5QWN0aW9uIGFjdGlvbiA9IChNb2RlbFF1ZXJ5QWN0aW9uKWFjdGlvbkxpc3QuZ2V0KGkpOwotICAgICAgaWYgKCFpc0FjdGlvbk1hdGNoaW5nUmFuZ2UoYWN0aW9uLCBzdGFydEluZGV4LCBlbmRJbmRleCkpCi0gICAgICB7Ci0gICAgICAgIGFjdGlvbkxpc3QucmVtb3ZlKGkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXRjaE1vZGVsVmlzaXRvcgotICB7Ci0gICAgaW50IGluZGVudDsKLSAgICBpbnQgZWxlbWVudEluZGV4OwotICAgIE5vZGUgcGFyZW50OwotICAgIExpc3QgYWN0aW9uTGlzdDsKLQotICAgIHB1YmxpYyBNYXRjaE1vZGVsVmlzaXRvcihOb2RlIHBhcmVudCwgTGlzdCBhY3Rpb25MaXN0KQotICAgIHsKLSAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgdGhpcy5hY3Rpb25MaXN0ID0gYWN0aW9uTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGluZGV4T2ZOZXh0RWxlbWVudChpbnQgc3RhcnQpCi0gICAgewotICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgaW50IGxlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgICAgaW50IHJlc3VsdCA9IGxlbmd0aDsKLSAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gaTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdE1hdGNoTW9kZWxOb2RlKENNVmFsaWRhdG9yLk1hdGNoTW9kZWxOb2RlIG1hdGNoTW9kZWxOb2RlKQotICAgIHsKLSAgICAgIGludCBzdGFydEluZGV4ID0gaW5kZXhPZk5leHRFbGVtZW50KGVsZW1lbnRJbmRleCk7Ci0KLSAgICAgIC8vU3RyaW5nIGNtTm9kZU5hbWUgPSBtYXRjaE1vZGVsTm9kZS5jbU5vZGUgIT0gbnVsbCA/IG1hdGNoTW9kZWxOb2RlLmNtTm9kZS5nZXROb2RlTmFtZSgpIDogIm51bGwiOwotICAgICAgLy9wcmludEluZGVudGVkKGluZGVudCwgIitNYXRjaE1vZGVsTm9kZSA6ICIgKyBjbU5vZGVOYW1lICsgICIgIiArIHN0YXJ0SW5kZXgpOwotCi0gICAgICBpbmRlbnQgKz0gMjsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXRjaE1vZGVsTm9kZS5jaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQ01WYWxpZGF0b3IuTWF0Y2hNb2RlbE5vZGUgY2hpbGQgPSAoQ01WYWxpZGF0b3IuTWF0Y2hNb2RlbE5vZGUpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICB2aXNpdE1hdGNoTW9kZWxOb2RlKGNoaWxkKTsKLSAgICAgIH0KLSAgICAgIGluZGVudCAtPSAyOwotCi0gICAgICBpZiAobWF0Y2hNb2RlbE5vZGUuY21Ob2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGludCBub2RlVHlwZSA9IG1hdGNoTW9kZWxOb2RlLmNtTm9kZS5nZXROb2RlVHlwZSgpOwotICAgICAgICBpZiAobm9kZVR5cGUgPT0gQ01Ob2RlLkdST1VQKQotICAgICAgICB7Ci0gICAgICAgICAgQ01Hcm91cCBncm91cCA9IChDTUdyb3VwKW1hdGNoTW9kZWxOb2RlLmNtTm9kZTsKLSAgICAgICAgICBpZiAoZ3JvdXAuZ2V0T3BlcmF0b3IoKSA9PSBDTUdyb3VwLkNIT0lDRSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhZGRSZXBsYWNlQWN0aW9ucyhtYXRjaE1vZGVsTm9kZSwgZ3JvdXAsIHN0YXJ0SW5kZXgsIGVsZW1lbnRJbmRleCAtIDEpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChub2RlVHlwZSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnRJbmRleCA9IHN0YXJ0SW5kZXggKyAxOwotICAgICAgICB9Ci0gICAgICAgIC8vcHJpbnRJbmRlbnRlZChpbmRlbnQsICItTWF0Y2hNb2RlbE5vZGUgOiAiICsgY21Ob2RlTmFtZSArICAiICIgKyAoZWxlbWVudEluZGV4IC0gMSkpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlcGxhY2VBY3Rpb25zKENNVmFsaWRhdG9yLk1hdGNoTW9kZWxOb2RlIG1hdGNoTW9kZWxOb2RlLCBDTUdyb3VwIGdyb3VwLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KQotICAgIHsKLSAgICAgIENNTm9kZSBleGNsdWRlQ01Ob2RlID0gbnVsbDsKLSAgICAgIGlmIChtYXRjaE1vZGVsTm9kZS5jaGlsZHJlbi5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBDTVZhbGlkYXRvci5NYXRjaE1vZGVsTm9kZSBjaGlsZCA9IChDTVZhbGlkYXRvci5NYXRjaE1vZGVsTm9kZSltYXRjaE1vZGVsTm9kZS5jaGlsZHJlbi5nZXQoMCk7Ci0gICAgICAgIGV4Y2x1ZGVDTU5vZGUgPSBjaGlsZC5jbU5vZGU7Ci0gICAgICB9Ci0KLSAgICAgIENNTm9kZUxpc3Qgbm9kZUxpc3QgPSBncm91cC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBpbnQgc2l6ZSA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBhbHRlcm5hdGl2ZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0gICAgICAgIGlmIChhbHRlcm5hdGl2ZSAhPSBleGNsdWRlQ01Ob2RlKQotICAgICAgICB7Ci0gICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oTW9kZWxRdWVyeUFjdGlvbi5SRVBMQUNFLCBwYXJlbnQsIGFsdGVybmF0aXZlLCBzdGFydEluZGV4LCBlbmRJbmRleCk7Ci0gICAgICAgICAgYWN0aW9uTGlzdC5hZGQoYWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vcHVibGljIHN0YXRpYyB2b2lkIHByaW50SW5kZW50ZWQoaW50IGluZGVudCwgU3RyaW5nIHN0cmluZykKLSAgLy97Ci0gIC8vICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKQotICAvLyAgewotICAvLyAgICBTeXN0ZW0ub3V0LnByaW50KCIgIik7Ci0gIC8vICB9Ci0gIC8vICBTeXN0ZW0ub3V0LnByaW50bG4oc3RyaW5nKTsKLSAgLy99Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzY0ODVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BbnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGwuTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbC5DTURhdGFUeXBlVmFsdWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsLkRPTVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb24uTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VUYWJsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgbGFyZ2UgcG9ydGlvbiBvZiB0aGUgTW9kZWxRdWVyeSBpbnRlcmZhY2VzLgotICogU29tZSB3b3JrIGlzIGRlbGVnYXRlZCB0byB0aGUgRE9NSGVscGVyLCBDTURvY3VtZW50TWFuYWdlciwgYW5kIERPTVZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlJbXBsIGltcGxlbWVudHMgTW9kZWxRdWVyeQotewotICBwcm90ZWN0ZWQgTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyIG1vZGVsUXVlcnlBY3Rpb25IZWxwZXI7Ci0gIHByb3RlY3RlZCBET01WYWxpZGF0b3IgdmFsaWRhdG9yOyAgIAotICBwcm90ZWN0ZWQgTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXJJbXBsIGV4dGVuc2lvbk1hbmFnZXI7ICAgCi0gIHByb3RlY3RlZCBDTURhdGFUeXBlVmFsdWVIZWxwZXIgdmFsdWVIZWxwZXI7Ci0gIHByb3RlY3RlZCBpbnQgZWRpdE1vZGUgPSBFRElUX01PREVfQ09OU1RSQUlORURfU1RSSUNUOwotCi0gIHB1YmxpYyBNb2RlbFF1ZXJ5SW1wbChNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcikKLSAgewotICAgIHRoaXMubW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgPSBtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcjsKLSAgICBtb2RlbFF1ZXJ5QWN0aW9uSGVscGVyID0gY3JlYXRlTW9kZWxRdWVyeUFjdGlvbkhlbHBlcigpOwotICAgIHZhbGlkYXRvciA9IG5ldyBET01WYWxpZGF0b3IoKTsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgZXh0ZW5zaW9uTWFuYWdlciA9IG5ldyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlckltcGwoKTsKLSAgICB2YWx1ZUhlbHBlciA9IG5ldyBDTURhdGFUeXBlVmFsdWVIZWxwZXIoKTsKLSAgfQotICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgaW50IGdldEVkaXRNb2RlKCkKLSAgewotICAgIHJldHVybiBlZGl0TW9kZTsKLSAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgc2V0RWRpdE1vZGUoaW50IGVkaXRNb2RlKQotICB7Ci0gICAgdGhpcy5lZGl0TW9kZSA9ZWRpdE1vZGU7Ci0gIH0KLQotCi0gIC8vIGZhY3RvcnkgbWV0aG9kcwotICBwdWJsaWMgTW9kZWxRdWVyeUFjdGlvbkhlbHBlciBjcmVhdGVNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyKCkKLSAgewotICAgIHJldHVybiBuZXcgTW9kZWxRdWVyeUFjdGlvbkhlbHBlcih0aGlzKTsKLSAgfSAKLQotICBwdWJsaWMgRE9NVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpCi0gIHsKLSAgICByZXR1cm4gdmFsaWRhdG9yOwotICB9Ci0KLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSBub2RlKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KG5vZGUpOwotICB9Ci0KLSAgcHVibGljIENNTm9kZSBnZXRDTU5vZGUoTm9kZSBub2RlKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNTm9kZShub2RlKTsKLSAgfQotCi0gIHB1YmxpYyBDTURhdGFUeXBlIGdldENNRGF0YVR5cGUoVGV4dCB0ZXh0KQotICB7Ci0gICAgcmV0dXJuIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNRGF0YVR5cGUodGV4dCk7Ci0gIH0KLQotICBwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKEF0dHIgYXR0cikKLSAgewotICAgIHJldHVybiBtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5nZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotICB9Ci0KLSAgcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHJldHVybiBtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgfQotICAgCi0gIHB1YmxpYyBDTURvY3VtZW50TWFuYWdlciBnZXRDTURvY3VtZW50TWFuYWdlcigpCi0gIHsKLSAgICBDTURvY3VtZW50TWFuYWdlciByZXN1bHQgPSBudWxsOwotICAgIGlmIChtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBpbnN0YW5jZW9mIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIpCi0gICAgeyAgICAgICAgICAgICAKLSAgICAgIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIgeG1sQXNzb2NpYXRpb25Qcm92aWRlciA9IChYTUxBc3NvY2lhdGlvblByb3ZpZGVyKW1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyOwotICAgICAgcmVzdWx0ID0geG1sQXNzb2NpYXRpb25Qcm92aWRlci5nZXRDTURvY3VtZW50TWFuYWdlcigpOwotICAgIH0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAgICAgIAotCi0gIC8qKgotICAgKiBAZGVwcmVjdGVkIC0gdXNlIDMgYXJnIHZlcnNpb24gYmVsb3cKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldENNRG9jdW1lbnRMaXN0KEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHVyaSkKLSAgeyAgICAgICAgCi0gICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRDTURvY3VtZW50TGlzdChFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgIAotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBpbnN0YW5jZW9mIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIpCi0gICAgeyAgICAgICAgICAgICAgCi0gICAgICBYTUxBc3NvY2lhdGlvblByb3ZpZGVyIHhtbEFzc29jaWF0aW9uUHJvdmlkZXIgPSAoWE1MQXNzb2NpYXRpb25Qcm92aWRlciltb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcjsKLSAgICAgCi0gICAgICAvLyB0b2RvLi4uIHJldmlzdC4uLiBoYW5kbGUgZWFjaCAjI3RoaW5nIGV4cGxpY2l0bHkKLSAgICAgIC8vICAgICAgICAgIAotICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgewotICAgICAgICB1cmkgPSAiIyNhbnkiOyAvLyROT04tTkxTLTEkCi0gICAgICB9ICAgICAgICAgICAgICAgCi0KLSAgICAgIGlmICh1cmkuZXF1YWxzKCIjI3RhcmdldE5hbWVzcGFjZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWVkLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgcmVzdWx0LmFkZChjbURvY3VtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAodXJpLmVxdWFscygiIyNhbnkiKSB8fCB1cmkuZXF1YWxzKCIjI290aGVyIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nIGV4Y2x1ZGVkVVJJID0gbnVsbDsKLSAgICAgICAgaWYgKHVyaS5lcXVhbHMoIiMjb3RoZXIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpZWQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGV4Y2x1ZGVkVVJJID0gKFN0cmluZyljbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHdlIHNob3VsZCBjb25zaWRlciBhbGwgb2YgdGhlIHNjaGVtYSByZWxhdGVkIHRvIHRoaXMgZG9jdW1lbnQKLSAgICAgICAgLy8KLSAgICAgICAgTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50TGluZWFnZShlbGVtZW50KTsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmFtZXNwYWNlVGFibGUuZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsKLSAgICAgICAgICBpZiAoaW5mby51cmkgIT0gbnVsbCAmJiAhaW5mby51cmkuZXF1YWxzKGV4Y2x1ZGVkVVJJKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDTURvY3VtZW50IGRvY3VtZW50ID0geG1sQXNzb2NpYXRpb25Qcm92aWRlci5nZXRDTURvY3VtZW50KGluZm8udXJpLCBpbmZvLmxvY2F0aW9uSGludCwgIlhTRCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0LmFkZChkb2N1bWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9ICAgCi0gICAgICBlbHNlCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgQ01Eb2N1bWVudCBkb2N1bWVudCA9IHhtbEFzc29jaWF0aW9uUHJvdmlkZXIuZ2V0Q01Eb2N1bWVudChlbGVtZW50LCB1cmkpOwotICAgICAgICBpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hZGQoZG9jdW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgIAotCi0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgIGlmIChtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBpbnN0YW5jZW9mIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIpCi0gICAgeyAgICAgICAgICAgICAKLSAgICAgIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIgeG1sQXNzb2NpYXRpb25Qcm92aWRlciA9IChYTUxBc3NvY2lhdGlvblByb3ZpZGVyKW1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyOwotICAgICAgcmVzdWx0ID0geG1sQXNzb2NpYXRpb25Qcm92aWRlci5nZXRDTURvY3VtZW50KGVsZW1lbnQsIHVyaSk7Ci0gICAgfQotICAgIC8vQ29udGVudE1vZGVsTWFuYWdlci5wcmludGxuKCJNb2RlbFF1ZXJ5SW1wbC5nZXRDTURvY3VtZW50KCIgKyBlbGVtZW50LmdldE5vZGVOYW1lKCkgKyAiLCAiICsgdXJpICsgIikgPSAiICsgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNDb250ZW50VmFsaWQoRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAgICAgICAgICAgCi0gICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICByZXR1cm4gaXNDb250ZW50VmFsaWQoZWQsIGVsZW1lbnQpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNDb250ZW50VmFsaWQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIEVsZW1lbnQgZWxlbWVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOyAgICAKLSAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICB7IAotICAgICAgLy8gZmlyc3QgY2hlY2sgdG8gc2VlIGlmIGFsbCB0aGUgcmVxdWlyZWQgYXR0cmlidXRlcyBhcmUgcHJlc2VudAotICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIENNTmFtZWROb2RlTWFwIG1hcCA9IGVkLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgIGludCBtYXBMZW5ndGggPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcExlbmd0aDsgaSsrKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiltYXAuaXRlbShpKTsKLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuY29tcHV0ZU5hbWUoYWQsIGVsZW1lbnQsIG51bGwpOwotICAgICAgICBpZiAoYWQuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKQotICAgICAgICB7ICAgICAgICAgICAgICAgCi0gICAgICAgICAgIEF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgICAgaWYgKGF0dHIgPT0gbnVsbCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gbm93IGNoZWNrIHRvIHNlZSBvZiB0aGUgY2hpbGRyZW4gdmFsaWRhdGUgcHJvcGVybHkKLSAgICAgIC8vCi0gICAgICBpZiAocmVzdWx0KSAKLSAgICAgIHsKLSAgICAgICAgQ01Ob2RlW10gb3JpZ2luQXJyYXkgPSBnZXRPcmlnaW5BcnJheShlbGVtZW50KTsKLSAgICAgICAgcmVzdWx0ID0gb3JpZ2luQXJyYXkgIT0gbnVsbCAmJiBvcmlnaW5BcnJheS5sZW5ndGggPT0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBDTU5vZGUgZ2V0T3JpZ2luKE5vZGUgbm9kZSkKLSAgewotICAgIENNTm9kZSByZXN1bHQgPSBudWxsOwotICAgIC8vIHRvZG8uLi4gbWFrZSBzdXJlIHBhcmVudCBpcyByaWdodAotICAgIC8vCi0gICAgTm9kZSBwYXJlbnROb2RlID0gZ2V0UGFyZW50T3JPd25lck5vZGUobm9kZSk7Ci0gICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCAmJiBwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgewotICAgICAgRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gKEVsZW1lbnQpcGFyZW50Tm9kZTsKLSAgICAgIENNTm9kZVtdIGFycmF5ID0gZ2V0T3JpZ2luQXJyYXkocGFyZW50RWxlbWVudCk7Ci0gICAgICBpZiAoYXJyYXkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IGluZGV4ID0gZ2V0SW5kZXhPZk5vZGUocGFyZW50RWxlbWVudC5nZXRDaGlsZE5vZGVzKCksIG5vZGUpOwotICAgICAgICBpZiAoaW5kZXggPCBhcnJheS5sZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBhcnJheVtpbmRleF07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBDTU5vZGVbXSBnZXRPcmlnaW5BcnJheShFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIHJldHVybiAoZWQgIT0gbnVsbCkgPyBnZXRWYWxpZGF0b3IoKS5nZXRPcmlnaW5BcnJheShlZCwgZWxlbWVudCkgOiBudWxsOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRJbmRleE9mTm9kZShOb2RlTGlzdCBub2RlTGlzdCwgTm9kZSBub2RlKQotICB7Ci0gICAgaW50IHJlc3VsdCA9IC0xOwotICAgIGludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgIGlmIChub2RlTGlzdC5pdGVtKGkpID09IG5vZGUpCi0gICAgICAgewotICAgICAgICAgcmVzdWx0ID0gaTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBDTU5vZGUgJ21ldGEgZGF0YScgdGhhdCBtYXkgYmUgcG90ZW50aWFsbHkgYWRkZWQgdG8gdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVDb250ZW50KEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucykKLSAgewotICAgIEF2YWlsYWJsZUNvbnRlbnRDTVZpc2l0b3IgdmlzaXRvciA9IG5ldyBBdmFpbGFibGVDb250ZW50Q01WaXNpdG9yKGVsZW1lbnQsIGVkKTsKLSAgICBMaXN0IGxpc3QgPSB2aXNpdG9yLmNvbXB1dGVBdmFpbGFibGVDb250ZW50KGluY2x1ZGVPcHRpb25zKTsKLSAgICBpZiAoZXh0ZW5zaW9uTWFuYWdlciAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgIAotICAgICAgZXh0ZW5zaW9uTWFuYWdlci5maWx0ZXJBdmFpbGFibGVFbGVtZW50Q29udGVudChsaXN0LCBlbGVtZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMpOwotICAgIH0gIAotICAgIHJldHVybiBsaXN0OwotICB9ICAKLQotCi0gIHB1YmxpYyBib29sZWFuIGNhbkluc2VydChFbGVtZW50IHBhcmVudCwgQ01Ob2RlIGNtTm9kZSwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZykKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudCk7Ci0gICAgaWYgKGVkICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gY2FuSW5zZXJ0KHBhcmVudCwgZWQsIGNtTm9kZSwgaW5kZXgsIHZhbGlkaXR5Q2hlY2tpbmcpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5JbnNlcnQoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBDTU5vZGUgY21Ob2RlLCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nKQotICB7Ci0gICAgcmV0dXJuIGNhbkluc2VydChwYXJlbnQsIGVkLCBjbU5vZGUsIGluZGV4LCB2YWxpZGl0eUNoZWNraW5nLCBudWxsKTsKLSAgfSAgICAgICAgIAotCi0gIHByb3RlY3RlZCBib29sZWFuIGNhbkluc2VydChFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIENNTm9kZSBjbU5vZGUsIGludCBpbmRleCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIE9iamVjdCByZXVzZWFibGVEYXRhKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIHN3aXRjaCAoY21Ob2RlLmdldE5vZGVUeXBlKCkpCi0gICAgewotICAgICAgY2FzZSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OIDoKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuY29tcHV0ZU5hbWUoY21Ob2RlLCBwYXJlbnQsIG51bGwpOwotICAgICAgICByZXN1bHQgPSBwYXJlbnQuZ2V0QXR0cmlidXRlTm9kZShhdHRyaWJ1dGVOYW1lKSA9PSBudWxsOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04gOgotICAgICAgY2FzZSBDTU5vZGUuR1JPVVAgOgotICAgICAgewotICAgICAgICBpZiAodmFsaWRpdHlDaGVja2luZyA9PSBWQUxJRElUWV9TVFJJQ1QpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgLy8gY3JlYXRlIGxpc3QgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0ID0gbnVsbDsKLSAgICAgICAgICBpZiAocmV1c2VhYmxlRGF0YSAhPSBudWxsKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QgPSAoTGlzdClyZXVzZWFibGVEYXRhOwotICAgICAgICAgIH0gICAgCi0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QgPSBnZXRWYWxpZGF0b3IoKS5jcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QocGFyZW50LCBlZCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJlc3VsdCA9IGdldFZhbGlkYXRvcigpLmNhbkluc2VydChlZCwgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBpbmRleCwgY21Ob2RlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ01Ob2RlLkRBVEFfVFlQRSA6Ci0gICAgICB7Ci0gICAgICAgIGludCBjb250ZW50VHlwZSA9IGVkLmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICAgIHJlc3VsdCA9IChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCB8fAotICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBIHx8Ci0gICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5JbnNlcnQoRWxlbWVudCBwYXJlbnQsIExpc3QgY21Ob2RlTGlzdCwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZykKLSAgewotICAgIC8vIHRvZG8KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0KLSAgcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlKE5vZGUgbm9kZSwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7ICAgICAgCi0gICAgaWYgKHZhbGlkaXR5Q2hlY2tpbmcgPT0gVkFMSURJVFlfU1RSSUNUKQotICAgIHsKLSAgICAgIGludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLSAgICAgIHN3aXRjaCAobm9kZVR5cGUpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERToKLSAgICAgICAgewotICAgICAgICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQgPSBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKChBdHRyKW5vZGUpOwotICAgICAgICAgIGlmIChhZCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IChhZC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBwYXJlbnROb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudClwYXJlbnROb2RlOwotICAgICAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnRFbGVtZW50KTsKLSAgICAgICAgICAgIGlmIChlZCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCA9IGdldFZhbGlkYXRvcigpLmNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChwYXJlbnRFbGVtZW50LCBlZCk7Ci0gICAgICAgICAgICAgIGludCBpbmRleCA9IGdldEluZGV4T2ZOb2RlKHBhcmVudEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpLCBub2RlKTsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0VmFsaWRhdG9yKCkuY2FuUmVtb3ZlKGVkLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlKExpc3Qgbm9kZUxpc3QsIGludCB2YWxpZGl0eUNoZWNraW5nKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi0gICAgaWYgKHZhbGlkaXR5Q2hlY2tpbmcgPT0gVkFMSURJVFlfU1RSSUNUKQotICAgIHsKLSAgICAgIEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IG51bGw7Ci0gICAgICBMaXN0IGNoaWxkTGlzdCA9IG51bGw7Ci0KLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5vZGVMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKWkubmV4dCgpOwotCi0gICAgICAgIGlmIChwYXJlbnRFbGVtZW50ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBwYXJlbnRFbGVtZW50ID0gZ2V0UGFyZW50T3JPd25lckVsZW1lbnQobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyZW50RWxlbWVudCAhPSBnZXRQYXJlbnRPck93bmVyRWxlbWVudChub2RlKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgcGFyZW50IGFyZSB0aGUgc2FtZQotICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0gICAgICAgIGlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFjYW5SZW1vdmUobm9kZSwgdmFsaWRpdHlDaGVja2luZykpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGNoaWxkTGlzdCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNoaWxkTGlzdCA9IG5vZGVMaXN0VG9MaXN0KHBhcmVudEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2hpbGRMaXN0LnJlbW92ZShub2RlKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAocmVzdWx0ICYmIGNoaWxkTGlzdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudEVsZW1lbnQpOwotICAgICAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QgPSBnZXRWYWxpZGF0b3IoKS5jcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoY2hpbGRMaXN0LCBlZCk7Ci0gICAgICAgICAgcmVzdWx0ID0gZ2V0VmFsaWRhdG9yKCkuaXNWYWxpZChlZCwgY29udGVudFNwZWNpZmljYXRpb25MaXN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5SZXBsYWNlKEVsZW1lbnQgcGFyZW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBDTU5vZGUgY21Ob2RlLCBpbnQgdmFsaWRpdHlDaGVja2luZykKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gY2FuUmVwbGFjZShFbGVtZW50IHBhcmVudCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCwgTGlzdCBjbU5vZGVMaXN0LCBpbnQgdmFsaWRpdHlDaGVja2luZykKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9ICAgICAKLSAgIAotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgZXhwZXJpbWVudGFsLi4uIHVzZSBhdCB5b3VyIG93biByaXNrCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjYW5XcmFwKEVsZW1lbnQgY2hpbGRFbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiB3cmFwRWxlbWVudCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7ICAKLSAgICBOb2RlIHBhcmVudE5vZGUgPSBjaGlsZEVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOyAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgIHsgICAgICAgICAgIAotICAgICAgRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gKEVsZW1lbnQpcGFyZW50Tm9kZTsgICAgICAKLSAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50RWxlbWVudCk7Ci0gICAgICBpZiAocGFyZW50RWQgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAodmFsaWRpdHlDaGVja2luZyA9PSBWQUxJRElUWV9TVFJJQ1QpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgaW5kZXggPSBnZXRJbmRleE9mTm9kZShwYXJlbnRFbGVtZW50LmdldENoaWxkTm9kZXMoKSwgY2hpbGRFbGVtZW50KTsKLQotICAgICAgICAgIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0ID0gZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KHBhcmVudEVsZW1lbnQsIHBhcmVudEVkKTsKLSAgICAgICAgICBMaXN0IHN1Ykxpc3QgPSBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3Quc3ViTGlzdChpbmRleCwgaW5kZXggKyAxKTsKLSAgICAgICAgICByZXN1bHQgPSBnZXRWYWxpZGF0b3IoKS5jYW5SZXBsYWNlKHBhcmVudEVkLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIGluZGV4LCBpbmRleCwgd3JhcEVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gZ2V0VmFsaWRhdG9yKCkuaXNWYWxpZCh3cmFwRWxlbWVudCwgc3ViTGlzdCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9ICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZXRJbnNlcnRBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluZGV4LCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICBtb2RlbFF1ZXJ5QWN0aW9uSGVscGVyLmdldEluc2VydEFjdGlvbnMocGFyZW50LCBlZCwgaW5kZXgsIGluY2x1ZGVPcHRpb25zLCB2YWxpZGl0eUNoZWNraW5nLCBhY3Rpb25MaXN0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdldEluc2VydEFjdGlvbnMoRG9jdW1lbnQgcGFyZW50LCBDTURvY3VtZW50IGNtRG9jdW1lbnQsIGludCBpbmRleCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgbW9kZWxRdWVyeUFjdGlvbkhlbHBlci5nZXRJbnNlcnRBY3Rpb25zKHBhcmVudCwgY21Eb2N1bWVudCwgaW5kZXgsIGluY2x1ZGVPcHRpb25zLCB2YWxpZGl0eUNoZWNraW5nLCBhY3Rpb25MaXN0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdldFJlcGxhY2VBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgbW9kZWxRdWVyeUFjdGlvbkhlbHBlci5nZXRSZXBsYWNlQWN0aW9ucyhwYXJlbnQsIGVkLCBpbmNsdWRlT3B0aW9ucywgdmFsaWRpdHlDaGVja2luZywgYWN0aW9uTGlzdCk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBnZXRSZXBsYWNlQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3Qgc2VsZWN0ZWRDaGlsZHJlbiwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgbW9kZWxRdWVyeUFjdGlvbkhlbHBlci5nZXRSZXBsYWNlQWN0aW9ucyhwYXJlbnQsIGVkLCBzZWxlY3RlZENoaWxkcmVuLCBpbmNsdWRlT3B0aW9ucywgdmFsaWRpdHlDaGVja2luZywgYWN0aW9uTGlzdCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZXRJbnNlcnRDaGlsZE5vZGVBY3Rpb25UYWJsZShFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCB2YWxpZGl0eUNoZWNraW5nLCBIYXNodGFibGUgYWN0aW9uVGFibGUpCi0gIHsKLSAgICBtb2RlbFF1ZXJ5QWN0aW9uSGVscGVyLmdldEluc2VydENoaWxkTm9kZUFjdGlvblRhYmxlKHBhcmVudCwgZWQsIHZhbGlkaXR5Q2hlY2tpbmcsIGFjdGlvblRhYmxlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdldEFjdGlvblRhYmxlKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZywgSGFzaHRhYmxlIGFjdGlvblRhYmxlKQotICB7Ci0gICAgLy9tb2RlbFF1ZXJ5QWN0aW9uSGVscGVyLmdldEFsbEFjdGlvbnMocGFyZW50LCBlZCwgdmFsaWRpdHlDaGVja2luZywgYWN0aW9uTGlzdCk7Ci0gIH0KLQotCi0gIC8vIHNvbWUgaGVscGVyIG1ldGhvZHMKLSAgLy8KLSAgcHJvdGVjdGVkIE5vZGUgZ2V0UGFyZW50T3JPd25lck5vZGUoTm9kZSBub2RlKQotICB7Ci0gICAgcmV0dXJuIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgPwotICAgICAgICAgICAoKEF0dHIpbm9kZSkuZ2V0T3duZXJFbGVtZW50KCkgOgotICAgICAgICAgICBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBFbGVtZW50IGdldFBhcmVudE9yT3duZXJFbGVtZW50KE5vZGUgbm9kZSkKLSAgewotICAgIE5vZGUgcGFyZW50ID0gZ2V0UGFyZW50T3JPd25lck5vZGUobm9kZSk7Ci0gICAgcmV0dXJuIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgPyAoRWxlbWVudClwYXJlbnQgOiBudWxsOwotICB9Ci0gICAgICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgTGlzdCBub2RlTGlzdFRvTGlzdChOb2RlTGlzdCBub2RlTGlzdCkKLSAgewotICAgIGludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgTGlzdCB2ID0gbmV3IEFycmF5TGlzdChzaXplKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICB2LmFkZChub2RlTGlzdC5pdGVtKGkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHY7Ci0gIH0gICAKLSAgIAotICAvKioKLSAgcHJvdGVjdGVkIExpc3QgZ2V0Q01Ob2RlTGlzdChOb2RlTGlzdCBub2RlTGlzdCkKLSAgewotICAgIGludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKHNpemUpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHYuYWRkKGdldENNTm9kZShub2RlTGlzdC5pdGVtKGkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHY7Ci0gIH0KLSAgKi8gIAotCi0gIHB1YmxpYyBjbGFzcyBBdmFpbGFibGVDb250ZW50Q01WaXNpdG9yIGV4dGVuZHMgQ01WaXNpdG9yCi0gIHsKLSAgICBwdWJsaWMgSGFzaHRhYmxlIGNoaWxkTm9kZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHB1YmxpYyBIYXNodGFibGUgYXR0cmlidXRlVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgcHVibGljIEVsZW1lbnQgcm9vdEVsZW1lbnQ7Ci0gICAgcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIHJvb3RFbGVtZW50RGVjbGFyYXRpb247IAotICAgIHB1YmxpYyBib29sZWFuIGlzUm9vdFZpc2l0ZWQ7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZVNlcXVlbmNlR3JvdXBzOwotCi0gICAgcHVibGljIEF2YWlsYWJsZUNvbnRlbnRDTVZpc2l0b3IoRWxlbWVudCByb290RWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdEVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgdGhpcy5yb290RWxlbWVudCA9IHJvb3RFbGVtZW50OwotICAgICAgdGhpcy5yb290RWxlbWVudERlY2xhcmF0aW9uID0gcm9vdEVsZW1lbnREZWNsYXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEtleShDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIFN0cmluZyBrZXkgPSBjbU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWNtTm9kZS5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IChTdHJpbmcpY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpOyAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkKLSAgICAgICAgeyAgIAotICAgICAgICAgIGtleSA9ICJbIiArIG5hbWVzcGFjZVVSSSArICJdIiArIGtleTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFkZFRvVGFibGUoSGFzaHRhYmxlIHRhYmxlLCBDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIFN0cmluZyBub2RlTmFtZSA9IGNtTm9kZS5nZXROb2RlTmFtZSgpOwotICAgICAgaWYgKG5vZGVOYW1lICE9IG51bGwgJiYgbm9kZU5hbWUubGVuZ3RoKCkgPiAwKQotICAgICAgeyAgCi0gICAgICAgIHRhYmxlLnB1dChnZXRLZXkoY21Ob2RlKSwgY21Ob2RlKTsKLSAgICAgIH0gIAotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGNvbXB1dGVBdmFpbGFibGVDb250ZW50KGludCBpbmNsdWRlT3B0aW9ucykKLSAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOyAgCi0KLSAgICAgIGludCBjb250ZW50VHlwZSA9IHJvb3RFbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgIGluY2x1ZGVTZXF1ZW5jZUdyb3VwcyA9ICgoaW5jbHVkZU9wdGlvbnMgJiBJTkNMVURFX1NFUVVFTkNFX0dST1VQUykgIT0gMCk7Ci0gICAgICB2aXNpdENNTm9kZShyb290RWxlbWVudERlY2xhcmF0aW9uKTsKLSAgICAgIAotICAgICAgaWYgKChpbmNsdWRlT3B0aW9ucyAmIElOQ0xVREVfQVRUUklCVVRFUykgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgdi5hZGRBbGwoYXR0cmlidXRlVGFibGUudmFsdWVzKCkpOwotICAgICAgICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIG5pbGxhYmxlQXR0cmlidXRlID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pcm9vdEVsZW1lbnREZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25pbGxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKG5pbGxhYmxlQXR0cmlidXRlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB2LmFkZChuaWxsYWJsZUF0dHJpYnV0ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gIAotCi0gICAgICBpZiAoKGluY2x1ZGVPcHRpb25zICYgSU5DTFVERV9DSElMRF9OT0RFUykgIT0gMCkKLSAgICAgIHsgICAgICAKLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIHx8Ci0gICAgICAgICAgICBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UKQotICAgICAgICB7Ci0gICAgICAgICAgdi5hZGRBbGwoY2hpbGROb2RlVGFibGUudmFsdWVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkFOWSkKLSAgICAgICAgeyAgICAgIAotICAgICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9ICAoQ01Eb2N1bWVudClyb290RWxlbWVudERlY2xhcmF0aW9uLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENNTmFtZWROb2RlTWFwIGVsZW1lbnRzID0gY21Eb2N1bWVudC5nZXRFbGVtZW50cygpOyAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdi5hZGQoaS5uZXh0KCkpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB2OwotICAgIH0gICAKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KQotICAgIHsgICAgICAgICAgICAKLSAgICAgIFN0cmluZyB1cmkgPSBhbnlFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBnZXRDTURvY3VtZW50TGlzdChyb290RWxlbWVudCwgcm9vdEVsZW1lbnREZWNsYXJhdGlvbiwgdXJpKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBDTURvY3VtZW50IGNtZG9jdW1lbnQgPSAoQ01Eb2N1bWVudClpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIGlmIChjbWRvY3VtZW50ICE9IG51bGwpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIENNTmFtZWROb2RlTWFwIG1hcCA9IGNtZG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsKLSAgICAgICAgICBpbnQgc2l6ZSA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIENNTm9kZSBlZCA9IG1hcC5pdGVtKGkpOyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgYWRkVG9UYWJsZShjaGlsZE5vZGVUYWJsZSxlZCk7Ci0gICAgICAgICAgfSAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpCi0gICAgewotICAgICAgc3VwZXIudmlzaXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKGFkKTsKLSAgICAgIGF0dHJpYnV0ZVRhYmxlLnB1dChhZC5nZXROb2RlTmFtZSgpLCBhZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgICB7Ci0gICAgICBpZiAoZWQgPT0gcm9vdEVsZW1lbnREZWNsYXJhdGlvbiAmJiAhaXNSb290VmlzaXRlZCkKLSAgICAgIHsKLSAgICAgICAgaXNSb290VmlzaXRlZCA9IHRydWU7Ci0gICAgICAgIHN1cGVyLnZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oZWQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKCFCb29sZWFuLlRSVUUuZXF1YWxzKGVkLmdldFByb3BlcnR5KCJBYnN0cmFjdCIpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgYWRkVG9UYWJsZShjaGlsZE5vZGVUYWJsZSxlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBDTU5vZGVMaXN0IHN1YnN0aXR1dGlvbkdyb3VwID0gKENNTm9kZUxpc3QpZWQuZ2V0UHJvcGVydHkoIlN1YnN0aXR1dGlvbkdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHN1YnN0aXR1dGlvbkdyb3VwICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVTdWJzdGl0dXRpb25Hcm91cChzdWJzdGl0dXRpb25Hcm91cCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU3Vic3RpdHV0aW9uR3JvdXAoQ01Ob2RlTGlzdCBzdWJzdGl0dXRpb25Hcm91cCkKLSAgICB7Ci0gICAgICBpbnQgc3Vic3RpdHV0aW9uR3JvdXBMZW5ndGggPSBzdWJzdGl0dXRpb25Hcm91cC5nZXRMZW5ndGgoKTsKLSAgICAgIGlmIChzdWJzdGl0dXRpb25Hcm91cExlbmd0aCA+IDEpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3Vic3RpdHV0aW9uR3JvdXBMZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIENNTm9kZSBlZCA9IHN1YnN0aXR1dGlvbkdyb3VwLml0ZW0oaSk7Ci0gICAgICAgICAgaWYgKCFCb29sZWFuLlRSVUUuZXF1YWxzKGVkLmdldFByb3BlcnR5KCJBYnN0cmFjdCIpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFkZFRvVGFibGUoY2hpbGROb2RlVGFibGUsZWQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGdyb3VwKQotICAgIHsKLSAgICAgIGlmIChpbmNsdWRlU2VxdWVuY2VHcm91cHMpCi0gICAgICB7Ci0gICAgICAgIGlmIChncm91cC5nZXRPcGVyYXRvcigpID09IENNR3JvdXAuU0VRVUVOQ0UgJiYKLSAgICAgICAgICAgIGdyb3VwLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA+IDEgJiYKLSAgICAgICAgICAgIGluY2x1ZGVzUmVxdWlyZWRDb250ZW50KGdyb3VwKSkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBjaGlsZE5vZGVUYWJsZS5wdXQoZ3JvdXAsIGdyb3VwKTsKLSAgICAgICAgfQotICAgICAgfSAgCi0gICAgICBzdXBlci52aXNpdENNR3JvdXAoZ3JvdXApOwotICAgIH0gICAKLQotICAgIHB1YmxpYyBib29sZWFuIGluY2x1ZGVzUmVxdWlyZWRDb250ZW50KENNR3JvdXAgZ3JvdXApCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGdyb3VwKTsKLSAgICAgIHJldHVybiBsaXN0LnNpemUoKSA+IDE7Ci0gICAgfQotICB9ICAgIAotCi0gCi0gIC8qKgotICAgKiBAZGVwcmVjdGVkIC0gdXNlIGdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMoKQotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0RGF0YVR5cGVWYWx1ZXMoRWxlbWVudCBlbGVtZW50LCBDTU5vZGUgY21Ob2RlKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChnZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKGVsZW1lbnQsIGNtTm9kZSkpOwotICB9Ci0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2RzIHJldHVybiBhbiBhcnJheSBvZiBwb3NzaWJsZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZGF0YXR5cGUgb2YgdGhlIENNTm9kZSAoZWl0aGVyIGFuIENNQXR0cmlidXRlRGVjbGFyYXRpb24gb3IgYSBDTUVsZW1lbnREZWNsYXJhdGlvbikKLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKEVsZW1lbnQgZWxlbWVudCwgQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKGNtTm9kZSAhPSBudWxsKQotICAgIHsgICAgICAgCi0gICAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gbnVsbDsKLSAgICAgIGlmIChjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKQotICAgICAgewotICAgICAgICBkYXRhVHlwZSA9ICgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiljbU5vZGUpLmdldEF0dHJUeXBlKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLSAgICAgIHsKLSAgICAgICAgZGF0YVR5cGUgPSAoKENNRWxlbWVudERlY2xhcmF0aW9uKWNtTm9kZSkuZ2V0RGF0YVR5cGUoKTsKLSAgICAgIH0gICAgICAgICAKLSAgICAgCi0gICAgICBTdHJpbmdbXSBlbnVtZXJhdGVkVmFsdWVzID0gZGF0YVR5cGUgIT0gbnVsbCA/IGRhdGFUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKSA6IG51bGw7ICAgICAgCi0gICAgICBpZiAoZW51bWVyYXRlZFZhbHVlcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1lcmF0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChlbnVtZXJhdGVkVmFsdWVzW2ldKTsKLSAgICAgICAgfSAKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgYWRkVmFsdWVzRm9yWFNJVHlwZShlbGVtZW50LCBjbU5vZGUsIGxpc3QpOwotICAgIAotICAgIGlmIChleHRlbnNpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgICBsaXN0LmFkZEFsbChleHRlbnNpb25NYW5hZ2VyLmdldERhdGFUeXBlVmFsdWVzKGVsZW1lbnQsIGNtTm9kZSkpOwotICAgIH0gICAgICAgICAgCi0gICAgCi0gICAgLy8gUmVtb3ZlIGR1cGxpY2F0ZXMKLSAgICBMaXN0IGR1cGxpY2F0ZUZyZWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotICAgIHdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgIAlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAJaWYoZHVwbGljYXRlRnJlZUxpc3QuaW5kZXhPZihuZXh0KSA9PSAtMSkgewotICAgIAkJZHVwbGljYXRlRnJlZUxpc3QuYWRkKG5leHQpOwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIHJldHVybiAoU3RyaW5nW10pIGR1cGxpY2F0ZUZyZWVMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tkdXBsaWNhdGVGcmVlTGlzdC5zaXplKCldKTsKLSAgfSAgICAKLQotICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVzRm9yWFNJVHlwZShFbGVtZW50IGVsZW1lbnQsIENNTm9kZSBjbU5vZGUsIExpc3QgbGlzdCkKLSAgeyAgICAgICAgICAgICAgIAotICAgIGlmIChjbU5vZGUgIT0gbnVsbCAmJiBjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSAKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKWNtTm9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmICh2YWx1ZUhlbHBlci5pc1hTSVR5cGUoYWQpKQotICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgTmFtZXNwYWNlVGFibGUgdGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgICB0YWJsZS5hZGRFbGVtZW50TGluZWFnZShlbGVtZW50KTsKLSAgICAgICAgbGlzdC5hZGRBbGwodmFsdWVIZWxwZXIuZ2V0UXVhbGlmaWVkWFNJVHlwZXMoYWQsIHRhYmxlKSk7ICAgICAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgICAKLQotICBwdWJsaWMgTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXIgZ2V0RXh0ZW5zaW9uTWFuYWdlcigpCi0gIHsKLSAgICByZXR1cm4gZXh0ZW5zaW9uTWFuYWdlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL1NpbXBsZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9TaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNTI0MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL1NpbXBsZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlDTVByb3ZpZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgQmFzZUFzc29jaWF0aW9uUHJvdmlkZXIKLXsKLSAgcHJvdGVjdGVkIE1vZGVsUXVlcnlDTVByb3ZpZGVyIG1vZGVsUXVlcnlDTVByb3ZpZGVyOwotICAgICAgICAgIAotICBwdWJsaWMgU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlcihNb2RlbFF1ZXJ5Q01Qcm92aWRlciBtb2RlbFF1ZXJ5Q01Qcm92aWRlcikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLm1vZGVsUXVlcnlDTVByb3ZpZGVyID0gbW9kZWxRdWVyeUNNUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxRdWVyeUNNUHJvdmlkZXIuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KGVsZW1lbnQpOwotICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgeyAgICAgICAgCi0gICAgICByZXN1bHQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Eb2N1bWVudC5nZXRFbGVtZW50cygpLmdldE5hbWVkSXRlbShlbGVtZW50LmdldE5vZGVOYW1lKCkpOyAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL1hNTEFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9YTUxBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MzczOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL1hNTEFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VUYWJsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWE1MQXNzb2NpYXRpb25Qcm92aWRlciBleHRlbmRzIEJhc2VBc3NvY2lhdGlvblByb3ZpZGVyIGltcGxlbWVudHMgQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyCi17ICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnRDYWNoZSBjbURvY3VtZW50Q2FjaGU7IAotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudE1hbmFnZXJJbXBsIGRvY3VtZW50TWFuYWdlcjsKLQotICBwdWJsaWMgWE1MQXNzb2NpYXRpb25Qcm92aWRlcihDTURvY3VtZW50Q2FjaGUgY21Eb2N1bWVudENhY2hlKQotICB7Ci0gICAgdGhpcy5jbURvY3VtZW50Q2FjaGUgPSBjbURvY3VtZW50Q2FjaGU7IAotICAgIGRvY3VtZW50TWFuYWdlciA9IG5ldyBDTURvY3VtZW50TWFuYWdlckltcGwoY21Eb2N1bWVudENhY2hlLCB0aGlzKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBDTURvY3VtZW50TWFuYWdlciBnZXRDTURvY3VtZW50TWFuYWdlcigpCi0gIHsKLSAgICByZXR1cm4gZG9jdW1lbnRNYW5hZ2VyOwotICB9Ci0gCi0gICAgICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXREb2N0eXBlSW5mbyhEb2N1bWVudCBkb2N1bWVudCkKLSAgeyAgIAotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG51bGw7Ci0gICAgRG9jdW1lbnRUeXBlIGRvY3R5cGUgPSBkb2N1bWVudC5nZXREb2N0eXBlKCk7Ci0KLSAgICAvLyBkZWZlY3QgMjA2ODMzIC4uLiBoZXJlIHdlIHRlc3QgZm9yIERURHMgdGhhdCBhcmUgZGVjbGFyZWQgaW5saW5lCi0gICAgLy8gc2luY2Ugd2UgY3VycmVudGx5IGhhdmUgbm8gd2F5IG9mIG1ha2luZyB1c2Ugb2YgaW5saW5lIERURHMgd2UgaW5nb3JlIHRoZW0KLSAgICAvLyBzbyB0aGF0IHRoZSBpbXBsaWN0IERURCAoaWYgYW55KSBjYW4gYmUgdXNlZAotICAgIGlmIChkb2N0eXBlICE9IG51bGwgJiYgKGRvY3R5cGUuZ2V0UHVibGljSWQoKSAhPSBudWxsIHx8IGRvY3R5cGUuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgcmVzdWx0WzBdID0gZG9jdHlwZS5nZXRQdWJsaWNJZCgpOwotICAgICAgcmVzdWx0WzFdID0gZG9jdHlwZS5nZXRTeXN0ZW1JZCgpOwotICAgIH0gICAKLSAgICBlbHNlIGlmIChnZXRJbXBsaWN0RG9jdHlwZShkb2N1bWVudCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBnZXRJbXBsaWN0RG9jdHlwZShkb2N1bWVudCk7Ci0gICAgfSAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAKLQotCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gZ2V0SW1wbGljdERvY3R5cGUoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsgCi0gICAgU3RyaW5nW10gcmVzdWx0ID0gbnVsbDsKLSAgICAvKgotICAgIERPTUV4dGVuc2lvbiBkb21FeHRlbnNpb24gPSBET01FeHRlbnNpb25Qcm92aWRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RE9NRXh0ZW5zaW9uKGRvY3VtZW50KTsKLSAgICBpZiAoZG9tRXh0ZW5zaW9uICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gZG9tRXh0ZW5zaW9uLmdldEltcGxpY2l0RG9jdHlwZSgpOwotICAgIH0qLwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpCi0gIHsgICAgICAgIAotICAgIHJldHVybiBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChub2RlLCB0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDTURvY3VtZW50IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUgbm9kZSwgYm9vbGVhbiBnZXREb2N1bWVudEZyb21DTU5vZGUpCi0gIHsgICAgICAgICAgICAKLSAgICBDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFID8gKERvY3VtZW50KW5vZGUgOiBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgIAotICAgICAgU3RyaW5nW10gZG9jdHlwZUluZm8gPSBnZXREb2N0eXBlSW5mbyhkb2N1bWVudCk7Ci0KLSAgICAgIGlmIChkb2N0eXBlSW5mbyAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXRDTURvY3VtZW50KGRvY3R5cGVJbmZvWzBdLCBkb2N0eXBlSW5mb1sxXSwgIkRURCIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAvLyBkZWZlY3QgMjExMjM2IC4uLiBpbiBzb21lIGNhc2VzIGNhbGxpbmcgdGhpcyBtZXRob2QgY2FuIHJlc3VsdCBpbiBhIGN5Y2xlCi0gICAgICAvLyB3ZSB1c2UgdGhlIGdldERvY3VtZW50RnJvbUNNTm9kZSBhcyBhIGZsYWcgdG8gYXZvaWQgdGhpcyAKLSAgICAgIC8vIFRPRE8uLi4gc2VlIGlmIHRoZXJlIGlzIGEgd2F5IHRvIHJlLW9yZ2FuaXplIHRvIGF2b2lkIHRoZSBuZWVkIGZvciB0aGlzIGZsYWcKLSAgICAgIGVsc2UgaWYgKGdldERvY3VtZW50RnJvbUNNTm9kZSkKLSAgICAgIHsKLSAgICAgICAgQ01Ob2RlIGNtTm9kZSA9IGdldENNTm9kZShub2RlKTsKLSAgICAgICAgaWYgKGNtTm9kZSAhPSBudWxsKSAgICAgICAKLSAgICAgICAgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAvLyB0b2RvLi4uIGFkZCBhIGdldENNRG9jdW1lbnQoKSBtZXRob2RzIHRvIENNTm9kZQotICAgICAgICAgIC8vIGZvciBub3cgdXNlIHRoZSBnZXRQcm9wZXJ0eSBpbnRlcmZhY2UKLSAgICAgICAgICByZXN1bHQgPSAoQ01Eb2N1bWVudCljbU5vZGUuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gbG9jYXRpbmcgQ01Eb2N1bWVudCBmb3IgIiArIG5vZGUsIGUpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgCi0KLSAgICAgIAotICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHVyaSkKLSAgewotICAgIENNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLSAgICBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudExpbmVhZ2UoZWxlbWVudCk7Ci0gICAgTmFtZXNwYWNlSW5mbyBuYW1lc3BhY2VJbmZvID0gbmFtZXNwYWNlVGFibGUuZ2V0TmFtZXNwYWNlSW5mb0ZvclVSSSh1cmkpOwotICAgIGlmIChuYW1lc3BhY2VJbmZvICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0Q01Eb2N1bWVudChuYW1lc3BhY2VJbmZvLnVyaSwgbmFtZXNwYWNlSW5mby5sb2NhdGlvbkhpbnQsICJYU0QiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAgICAgCi0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHR5cGUpCi0gIHsgICAgICAgICAgICAgICAgICAgCi0gICAgLy9TdHJpbmcgcmVzb2x2ZWRHcmFtbWFyVVJJID0gcmVzb2x2ZUdyYW1tYXJVUkkoZG9jdW1lbnQsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgcmV0dXJuIGRvY3VtZW50TWFuYWdlci5nZXRDTURvY3VtZW50KHB1YmxpY0lkLCBzeXN0ZW1JZCwgdHlwZSk7ICAKLSAgfQotCi0gIC8vcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIC8veyAgICAgICAgICAgICAgICAgICAKLSAgLy8gIC8vU3RyaW5nIHJlc29sdmVkR3JhbW1hclVSSSA9IHJlc29sdmVHcmFtbWFyVVJJKGRvY3VtZW50LCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAvLyAgcmV0dXJuIGRvY3VtZW50TWFuYWdlci5nZXRDTURvY3VtZW50KHB1YmxpY0lkLCBzeXN0ZW1JZCk7ICAKLSAgLy99Ci0gICAKLSAgcHVibGljIFN0cmluZyByZXNvbHZlR3JhbW1hclVSSShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgewotICAgIHJldHVybiByZXNvbHZlR3JhbW1hclVSSShudWxsLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotICB9Ci0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHNwZWNpYWxpemVkIGluIG9yZGVyIHRvIGltcGxlbWVudCBzcGVjaWFsaXplZCB1cmkgcmVzb2x1dGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlR3JhbW1hclVSSShEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICByZXR1cm4gc3lzdGVtSWQ7Ci0gIH0KLSAgCi0KLSAgcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkKLSAgeyAKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOyAKLSAgICBEb2N1bWVudCBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgIFN0cmluZ1tdIGRvY3R5cGVJbmZvID0gZ2V0RG9jdHlwZUluZm8oZG9jdW1lbnQpOwotICAgIGlmIChkb2N0eXBlSW5mbyAhPSBudWxsKQotICAgIHsgICAKLSAgICAgIC8vIHdlIGhhdmUgZGV0ZWN0ZWQgZG9jdHlwZSBpbmZvcm1hdGlvbiBzbyB3ZSBhc3N1bWUgdGhhdCB3ZSBjYW4gbG9jYXRlIHRoZSBDTUVsZW1lbnREZWNsYXJhdGlvbiAKLSAgICAgIC8vIGluIHRoZSBDTURvY3VtZW50J3MgdGFibGUgb2YgZ2xvYmFsIGVsZW1lbnRzIAotICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoZWxlbWVudCwgZmFsc2UpOwotCi0gICAgICAvLyBUT0RPLi4uIGNvbnNpZGVyIHJlcGxhY2luZyBhYm92ZSB3aXRoIAotICAgICAgLy8gQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudChkb2N1bWVudCwgZG9jdHlwZUluZm9bMF0sIGRvY3R5cGVJbmZvWzFdKTsKLQotICAgICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgIAotICAgICAgICByZXN1bHQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Eb2N1bWVudC5nZXRFbGVtZW50cygpLmdldE5hbWVkSXRlbShlbGVtZW50LmdldE5vZGVOYW1lKCkpOyAgICAKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgIC8vIHRoaXMgaXMgYSBoYWNrIHRvIGdldCBvdXIgeHNsIGNvZGUgYXNzaXN0IHdvcmtpbmcuLi4gd2UgbWlnaHQgd2FudCB0byBoYW5kbGUgc2ltaWxhcgotICAgICAgICAvLyBncmFtbWFyIGJlaGF2aW91ciB2aWEgc29tZSBlc3RhYmxpc2hlZCBtb2RlbCBxdWVyeSBzZXR0aW5nIAotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZ2V0SW1wbGljdERvY3R5cGUoZG9jdW1lbnQpICE9IG51bGwpCi0gICAgICAgIHsgICAgICAgICAKLSAgICAgICAgICBOb2RlIHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudClwYXJlbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgCi0gICAgZWxzZQotICAgIHsgIAotICAgICAgLy8gaGVyZSB3ZSB1c2UgYSBuYW1lc3BhY2VUYWJsZSB0byBjb25zaWRlciBpZiB0aGUgcm9vdCBlbGVtZW50IGhhcyBhbnkgbmFtZXNwYWNlIGluZm9ybWF0aW9uCi0gICAgICAvLwotICAgICAgTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgTGlzdCBsaXN0ID0gTmFtZXNwYWNlVGFibGUuZ2V0RWxlbWVudExpbmVhZ2UoZWxlbWVudCk7Ci0gICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gKEVsZW1lbnQpbGlzdC5nZXQoMCk7Ci0gICAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50KHJvb3RFbGVtZW50KTsKLSAgICAgICAgIAotICAgICAgaWYgKG5hbWVzcGFjZVRhYmxlLmlzTmFtZXNwYWNlRW5jb3VudGVyZWQoKSkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAvLyB3ZSBhc3N1bWUgdGhhdCB0aGlzIGlzIGFuIFhNTFNjaGVtYSBzdHlsZSBuYW1lc3BhY2UgYXdhcmUgZG9jdW1lbnQKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCwgbGlzdCwgbmFtZXNwYWNlVGFibGUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAKLSAgICAgICAgLy8gd2UgYXNzdW1lIHRoYXQgdGhpcyBpcyBhbiBpbmZlcnJlZCBDTURvY3VtZW50IGZvciBhIERURCBzdHlsZSAnbmFtZXNwYWNlbGVzcycgZG9jdW1lbnQKLSAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudCgiIiwgIiIsICJEVEQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbiljbURvY3VtZW50LmdldEVsZW1lbnRzKCkuZ2V0TmFtZWRJdGVtKGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSk7IAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotICAgICAKLQotICBwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCB0YXJnZXRFbGVtZW50LCBMaXN0IGxpc3QsIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlKQotICB7ICAgICAgICAgCi0gICAgQ01FbGVtZW50RGVjbGFyYXRpb24gY3VycmVudEVEID0gbnVsbDsKLSAgICB0cnkKLSAgICB7ICAgIAotICAgICAgaW50IGxpc3RTaXplID0gbGlzdC5zaXplKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTaXplOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KWxpc3QuZ2V0KGkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50KGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG5vZGVOYW1lID0gZWxlbWVudC5nZXROb2RlTmFtZSgpOwotICAgICAgICBTdHJpbmcgdW5wcmVmaXhlZE5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VW5wcmVmaXhlZE5hbWUobm9kZU5hbWUpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFByZWZpeChub2RlTmFtZSk7Ci0gCi0gICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbnVsbDsKLSAKLSAgICAgICAgLy8gc2VlIGlmIHRoZSBlbGVtZW50IGlzIGEgbG9jYWwgb2YgdGhlIGN1cnJlbnRFRAotICAgICAgICAvLyAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGN1cnJlbnRFRCAhPSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbiljdXJyZW50RUQuZ2V0TG9jYWxFbGVtZW50cygpLmdldE5hbWVkSXRlbSh1bnByZWZpeGVkTmFtZSk7Ci0gICAgICAgIH0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChlZCA9PSBudWxsKSAKLSAgICAgICAgeyAgICAgICAgICAgICAgIAotICAgICAgICAgIE5hbWVzcGFjZUluZm8gbmFtZXNwYWNlSW5mbyA9IG5hbWVzcGFjZVRhYmxlLmdldE5hbWVzcGFjZUluZm9Gb3JQcmVmaXgocHJlZml4KTsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgaWYgKG5hbWVzcGFjZUluZm8gIT0gbnVsbCkgCi0gICAgICAgICAgewotICAgICAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudChuYW1lc3BhY2VJbmZvLnVyaSwgbmFtZXNwYWNlSW5mby5sb2NhdGlvbkhpbnQsICJYU0QiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKWNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXROYW1lZEl0ZW0odW5wcmVmaXhlZE5hbWUpOyAgIAotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgY3VycmVudEVEID0gZWQ7ICAgICAKLQotICAgICAgICAvLyBoYW5kbGUgWFNJVHlwZSAgICAgCi0gICAgICAgIGlmIChjdXJyZW50RUQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGRlcml2ZWRFRCA9IGdldERlcml2ZWRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50LCBjdXJyZW50RUQsIG5hbWVzcGFjZVRhYmxlKTsKLSAgICAgICAgICBpZiAoZGVyaXZlZEVEICE9IG51bGwpCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY3VycmVudEVEID0gZGVyaXZlZEVEOwotICAgICAgICAgIH0gICAgCi0gICAgICAgIH0KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsgCi0gICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gbG9jYXRpbmcgZWxlbWVudCBkZWNsYXJhdGlvbiBmb3IgIiArIHRhcmdldEVsZW1lbnQsIGUpOyAvLyROT04tTkxTLTEkCi0gICAgfSAKLSAgCi0gICAgcmV0dXJuIGN1cnJlbnRFRDsKLSAgfSAgCi0gICAgICAKLQotICBwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVyaXZlZENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlKQotICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgU3RyaW5nIHhzaVByZWZpeCA9IG5hbWVzcGFjZVRhYmxlLmdldFByZWZpeEZvclVSSSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmICh4c2lQcmVmaXggIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgeHNpVHlwZVZhbHVlID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoeHNpUHJlZml4ICsgIjp0eXBlIikgPyBlbGVtZW50LmdldEF0dHJpYnV0ZSh4c2lQcmVmaXggKyAiOnR5cGUiKSA6IG51bGw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgaWYgKHhzaVR5cGVWYWx1ZSAhPSBudWxsICYmIHhzaVR5cGVWYWx1ZS5sZW5ndGgoKSA+IDApCi0gICAgICB7ICAKLSAgICAgICAgU3RyaW5nIHR5cGVQcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KHhzaVR5cGVWYWx1ZSk7Ci0gICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZSh4c2lUeXBlVmFsdWUpOwotICAgICAgICBTdHJpbmcgdHlwZVVSSSA9IG5hbWVzcGFjZVRhYmxlLmdldFVSSUZvclByZWZpeCh0eXBlUHJlZml4KTsKLSAgICAgICAgU3RyaW5nIHVyaVF1YWxpZmllZFR5cGVOYW1lID0gdHlwZU5hbWU7Ci0gICAgICAgIGlmICh0eXBlVVJJICE9IG51bGwgJiYgdHlwZVVSSS5sZW5ndGgoKSA+IDApIAotICAgICAgICB7Ci0gICAgICAgICAgdXJpUXVhbGlmaWVkVHlwZU5hbWUgPSAiWyIgKyAgdHlwZVVSSSArICJdIiArIHR5cGVOYW1lOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pZWQuZ2V0UHJvcGVydHkoIkRlcml2ZWRFbGVtZW50RGVjbGFyYXRpb249IiArIHVyaVF1YWxpZmllZFR5cGVOYW1lKTsgICAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgCi0KLQotICBwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKEF0dHIgYXR0cikKLSAgewotICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgIGlmIChlZCAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbillZC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIC8vIHRyeSB0byBnZXQgdGhlIHVucHJlZml4ZWQgbmFtZSAgICAgICAgICAgICAKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgcmVzdWx0ID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pZWQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShuYW1lKTsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyB0b2RvLi4uIHBlcmhhcHMgdGhpcyBpcyBhIGdsb2JhbGx5IGRlZmluZWQgYXR0cmlidXRlLi4uIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAgICAgICAKLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgQ01Eb2N1bWVudFJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBub2RlIG9yIHN1YnRyZWUKLSAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgTGlzdCBnZXRDTURvY3VtZW50UmVmZXJlbmNlcyhOb2RlIG5vZGUsIGJvb2xlYW4gZGVlcCkKLSAgeyAKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsgIAotICAgIERvY3VtZW50IGRvY3VtZW50ID0gKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpID8gKERvY3VtZW50KW5vZGUgOiBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICBEb2N1bWVudFR5cGUgZG9jdHlwZSA9IGRvY3VtZW50LmdldERvY3R5cGUoKTsKLSAgICAvLyBkZWZlY3QgMjA2ODMzIC4uLiBoZXJlIHdlIHRlc3QgZm9yIERURHMgdGhhdCBhcmUgZGVjbGFyZWQgaW5saW5lCi0gICAgLy8gc2luY2Ugd2UgY3VycmVudGx5IGhhdmUgbm8gd2F5IG9mIG1ha2luZyB1c2Ugb2YgaW5saW5lIERURHMgd2UgaW5nb3JlIHRoZW0KLSAgICAvLyBzbyB0aGF0IHRoZSBpbXBsaWN0IERURCAoaWYgYW55KSBjYW4gYmUgdXNlZAotICAgIGlmIChkb2N0eXBlICE9IG51bGwgJiYgKGRvY3R5cGUuZ2V0UHVibGljSWQoKSAhPSBudWxsIHx8IGRvY3R5cGUuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHVyaSA9IHJlc29sdmVHcmFtbWFyVVJJKGRvY3VtZW50LCBkb2N0eXBlLmdldFB1YmxpY0lkKCksIGRvY3R5cGUuZ2V0U3lzdGVtSWQoKSk7Ci0gICAgICByZXN1bHQuYWRkKG5ldyBDTURvY3VtZW50UmVmZXJlbmNlSW1wbChkb2N0eXBlLmdldFB1YmxpY0lkKCksIHVyaSkpOwotICAgIH0gICAKLSAgICBlbHNlIGlmIChnZXRJbXBsaWN0RG9jdHlwZShkb2N1bWVudCkgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICBTdHJpbmdbXSBpbXBsaWNpdERvY3R5cGUgPSBnZXRJbXBsaWN0RG9jdHlwZShkb2N1bWVudCk7Ci0gICAgICBTdHJpbmcgdXJpID0gcmVzb2x2ZUdyYW1tYXJVUkkoZG9jdW1lbnQsIGltcGxpY2l0RG9jdHlwZVswXSwgaW1wbGljaXREb2N0eXBlWzFdKTsKLSAgICAgIHJlc3VsdC5hZGQobmV3IENNRG9jdW1lbnRSZWZlcmVuY2VJbXBsKGltcGxpY2l0RG9jdHlwZVswXSwgdXJpKSk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGVsc2UKLSAgICB7ICAgCi0gICAgICBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShkb2N1bWVudCk7Ci0gICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotCQkgICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudCgoRWxlbWVudClub2RlKTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpZiAoZGVlcCkKLSAgICAgIHsKLSAgICAgICAgYWRkQ2hpbGRFbGVtZW50c1RvTmFtZXNwYWNlVGFibGUobm9kZSwgbmFtZXNwYWNlVGFibGUpOwotICAgICAgfQotCSAgICBMaXN0IGxpc3QgPSBuYW1lc3BhY2VUYWJsZS5nZXROYW1lc3BhY2VJbmZvTGlzdCgpOwotCQkgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSAKLSAgICAgIHsKLQkJCSAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOyAgICAKLSAgICAgICAgU3RyaW5nIHVyaSA9IHJlc29sdmVHcmFtbWFyVVJJKGRvY3VtZW50LCBpbmZvLnVyaSwgaW5mby5sb2NhdGlvbkhpbnQpOwotICAgICAgICByZXN1bHQuYWRkKG5ldyBDTURvY3VtZW50UmVmZXJlbmNlSW1wbChpbmZvLnVyaSwgdXJpKSk7Ci0JCSAgfQkKLSAgICB9IAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZEVsZW1lbnRzVG9OYW1lc3BhY2VUYWJsZShOb2RlIG5vZGUsIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlKQotICB7Ci0gICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkgIGlmIChub2RlTGlzdCAhPSBudWxsKSAKLSAgICB7Ci0JCSAgaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCSAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKSAKLSAgICAgIHsKLQkJCSAgTm9kZSBjaGlsZE5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgICBpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgIHsgICAKLSAgICAgICAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50KChFbGVtZW50KWNoaWxkTm9kZSk7Ci0gICAgICAgICAgYWRkQ2hpbGRFbGVtZW50c1RvTmFtZXNwYWNlVGFibGUoY2hpbGROb2RlLCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICAgIH0KLQkJICB9Ci0JICB9Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01EZXNjcmlwdGlvbkJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNRGVzY3JpcHRpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MmFiMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01EZXNjcmlwdGlvbkJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgQ01EZXNjcmlwdGlvbkJ1aWxkZXIgZXh0ZW5kcyBDTVZpc2l0b3IKLXsKLSAgcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBzYjsKLSAgcHJvdGVjdGVkIENNTm9kZSByb290OwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1Jvb3RWaXNpdGVkOwotICBwdWJsaWMgU3RyaW5nIGJ1aWxkRGVzY3JpcHRpb24oQ01Ob2RlIG5vZGUpCi0gIHsKLSAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICByb290ID0gbm9kZTsKLSAgICBpc1Jvb3RWaXNpdGVkID0gZmFsc2U7Ci0gICAgdmlzaXRDTU5vZGUobm9kZSk7Ci0gICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gIH0gICAgICAgCi0KLSAgcHVibGljIHZvaWQgdmlzaXRDTUFueUVsZW1lbnQoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpCi0gIHsKLSAgICBzYi5hcHBlbmQoIm5hbWVzcGFjZTp1cmk9XCIiICsgYW55RWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01EYXRhVHlwZShDTURhdGFUeXBlIGRhdGFUeXBlKQotICB7Ci0gICAgc2IuYXBwZW5kKCIjUENEQVRBIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01Eb2N1bWVudChDTURvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgQ01OYW1lZE5vZGVNYXAgbWFwID0gZG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsKLSAgICBpbnQgc2l6ZSA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICB2aXNpdENNTm9kZShtYXAuaXRlbShpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTUdyb3VwKENNR3JvdXAgZ3JvdXApCi0gIHsKLSAgICBpbnQgb3AgPSBncm91cC5nZXRPcGVyYXRvcigpOwotICAgIGlmIChvcCA9PSBDTUdyb3VwLkFMTCkKLSAgICB7Ci0gICAgICBzYi5hcHBlbmQoImFsbCIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgc2IuYXBwZW5kKCIoIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIFN0cmluZyBzZXBhcmF0b3IgPSAiLCAiOyAvLyROT04tTkxTLTEkCi0KLSAgICBpZiAob3AgPT0gQ01Hcm91cC5DSE9JQ0UpCi0gICAgewotICAgICAgc2VwYXJhdG9yID0gIiB8ICI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAKLSAgICBDTU5vZGVMaXN0IG5vZGVMaXN0ID0gZ3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgdmlzaXRDTU5vZGUobm9kZUxpc3QuaXRlbShpKSk7Ci0gICAgICBpZiAoaSA8IHNpemUgLSAxKQotICAgICAgewotICAgICAgICBzYi5hcHBlbmQoc2VwYXJhdG9yKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgc2IuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLSAgICBhZGRPY2N1cmVuY2VTeW1ib2woZ3JvdXApOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgewotICAgIGlmIChlZCA9PSByb290ICYmICFpc1Jvb3RWaXNpdGVkKQotICAgIHsKLSAgICAgIGlzUm9vdFZpc2l0ZWQgPSB0cnVlOwotICAgICAgQ01Db250ZW50IGNvbnRlbnQgPSBlZC5nZXRDb250ZW50KCk7Ci0gICAgICBpZiAoY29udGVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoY29udGVudC5nZXROb2RlVHlwZSgpICE9IENNTm9kZS5HUk9VUCkKLSAgICAgICAgewotICAgICAgICAgIHNiLmFwcGVuZCgiKCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgdmlzaXRDTU5vZGUoY29udGVudCk7Ci0gICAgICAgICAgc2IuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNTm9kZShjb250ZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2IuYXBwZW5kKGVkLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgYWRkT2NjdXJlbmNlU3ltYm9sKGVkKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRPY2N1cmVuY2VTeW1ib2woQ01Db250ZW50IGNvbnRlbnQpCi0gIHsKLSAgICBpbnQgbWluID0gY29udGVudC5nZXRNaW5PY2N1cigpOwotICAgIGludCBtYXggPSBjb250ZW50LmdldE1heE9jY3VyKCk7Ci0gICAgaWYgKG1pbiA9PSAwKQotICAgIHsKLSAgICAgIGlmIChtYXggPiAxIHx8IG1heCA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgc2IuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2IuYXBwZW5kKCI/Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAobWF4ID4gMSB8fCBtYXggPT0gLTEpCi0gICAgewotICAgICAgc2IuYXBwZW5kKCIrIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNRG9jdW1lbnRDYWNoZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01Eb2N1bWVudENhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MGZmNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01Eb2N1bWVudENhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50Q2FjaGUKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19OT1RfTE9BREVEID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0xPQURJTkcgICAgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfTE9BREVEICAgICA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19FUlJPUiAgICAgID0gNDsKLQotICBwcm90ZWN0ZWQgY2xhc3MgRW50cnkKLSAgewotICAgIHB1YmxpYyBTdHJpbmcgdXJpOwotICAgIHB1YmxpYyBpbnQgc3RhdHVzID0gU1RBVFVTX05PVF9MT0FERUQ7Ci0gICAgcHVibGljIGZsb2F0IHByb2dyZXNzOwotICAgIHB1YmxpYyBDTURvY3VtZW50IGNtRG9jdW1lbnQ7Ci0KLSAgICBwdWJsaWMgRW50cnkoU3RyaW5nIHVyaSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgdGhpcy51cmkgPSB1cmk7ICAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIEVudHJ5KFN0cmluZyB1cmksIGludCBzdGF0dXMsIENNRG9jdW1lbnQgY21Eb2N1bWVudCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgdGhpcy51cmkgPSB1cmk7Ci0gICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsgICAgICAKLSAgICAgIHRoaXMuY21Eb2N1bWVudCA9IGNtRG9jdW1lbnQ7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBoYXNodGFibGU7Ci0gIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotCi0gIC8qKgotICAgKiB0ZW1wb3JhcmlseSBwdWJsaWMgdW50aWwgY2FjaGluZyBwcm9ibGVtIGlzIHNvbHZlZAotICAgKi8KLSAgcHVibGljIENNRG9jdW1lbnRDYWNoZSgpCi0gIHsKLSAgICBoYXNodGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihDTURvY3VtZW50Q2FjaGVMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ01Eb2N1bWVudENhY2hlTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgfSAgIAotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgZ3JhbW1hclVSSSkKLSAgewotICAgIENNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoZ3JhbW1hclVSSSAhPSBudWxsKQotICAgIHsgIAotICAgICAgRW50cnkgZW50cnkgPSAoRW50cnkpaGFzaHRhYmxlLmdldChncmFtbWFyVVJJKTsKLSAgICAgIGlmIChlbnRyeSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBlbnRyeS5jbURvY3VtZW50OwotICAgICAgfSAgIAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGludCBnZXRTdGF0dXMoU3RyaW5nIGdyYW1tYXJVUkkpCi0gIHsKLSAgICBpbnQgcmVzdWx0ID0gU1RBVFVTX05PVF9MT0FERUQ7Ci0gICAgaWYgKGdyYW1tYXJVUkkgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KWhhc2h0YWJsZS5nZXQoZ3JhbW1hclVSSSk7Ci0gICAgICBpZiAoZW50cnkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZW50cnkuc3RhdHVzOwotICAgICAgfSAgICAgIAotICAgICAgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHByb3RlY3RlZCBFbnRyeSBsb29rdXBPckNyZWF0ZShTdHJpbmcgZ3JhbW1hclVSSSkKLSAgewotICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KWhhc2h0YWJsZS5nZXQoZ3JhbW1hclVSSSk7Ci0gICAgaWYgKGVudHJ5ID09IG51bGwpCi0gICAgewotICAgICAgZW50cnkgPSBuZXcgRW50cnkoZ3JhbW1hclVSSSk7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGhhc2h0YWJsZS5wdXQoZ3JhbW1hclVSSSwgZW50cnkpOwotICAgIH0KLSAgICByZXR1cm4gZW50cnk7Ci0gIH0KLQotICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyB2b2lkIHB1dENNRG9jdW1lbnQoU3RyaW5nIGdyYW1tYXJVUkksIENNRG9jdW1lbnQgY21Eb2N1bWVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChncmFtbWFyVVJJICE9IG51bGwgJiYgY21Eb2N1bWVudCAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIEVudHJ5IGVudHJ5ID0gbG9va3VwT3JDcmVhdGUoZ3JhbW1hclVSSSk7Ci0gICAgICBpbnQgb2xkU3RhdHVzID0gZW50cnkuc3RhdHVzOwotICAgICAgZW50cnkuc3RhdHVzID0gU1RBVFVTX0xPQURFRDsKLSAgICAgIGVudHJ5LmNtRG9jdW1lbnQgPSBjbURvY3VtZW50OyAgCi0gICAgICBub3RpZnlDYWNoZVVwZGF0ZWQoZ3JhbW1hclVSSSwgb2xkU3RhdHVzLCBlbnRyeS5zdGF0dXMsIGVudHJ5LmNtRG9jdW1lbnQpOyAgCi0gICAgfQotICB9Ci0gICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgZ3JhbW1hclVSSSwgaW50IHN0YXR1cykKLSAgewotICAgIGlmIChncmFtbWFyVVJJICE9IG51bGwpCi0gICAgewotICAgICAgRW50cnkgZW50cnkgPSBsb29rdXBPckNyZWF0ZShncmFtbWFyVVJJKTsKLSAgICAgIGludCBvbGRTdGF0dXMgPSBlbnRyeS5zdGF0dXM7Ci0gICAgICBlbnRyeS5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgICBub3RpZnlDYWNoZVVwZGF0ZWQoZ3JhbW1hclVSSSwgb2xkU3RhdHVzLCBlbnRyeS5zdGF0dXMsIGVudHJ5LmNtRG9jdW1lbnQpOyAgIAotICAgIH0KLSAgfQotICAgICAKLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbGVhcigpCi0gIHsKLSAgICBoYXNodGFibGUuY2xlYXIoKTsKLSAgICBub3RpZnlDYWNoZUNsZWFyZWQoKTsKLSAgfSAgCi0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlDYWNoZVVwZGF0ZWQoU3RyaW5nIHVyaSwgaW50IG9sZFN0YXR1cywgaW50IG5ld1N0YXR1cywgQ01Eb2N1bWVudCBjbURvY3VtZW50KQotICB7ICAgICAgCi0gICAgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotICAgIGxpc3QuYWRkQWxsKGxpc3RlbmVyTGlzdCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIENNRG9jdW1lbnRDYWNoZUxpc3RlbmVyIGxpc3RlbmVyID0gKENNRG9jdW1lbnRDYWNoZUxpc3RlbmVyKWkubmV4dCgpOwotICAgICAgbGlzdGVuZXIuY2FjaGVVcGRhdGVkKHRoaXMsIHVyaSwgb2xkU3RhdHVzLCBuZXdTdGF0dXMsIGNtRG9jdW1lbnQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2FjaGVDbGVhcmVkKCkKLSAgeyAgICAgCi0gICAgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotICAgIGxpc3QuYWRkQWxsKGxpc3RlbmVyTGlzdCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIENNRG9jdW1lbnRDYWNoZUxpc3RlbmVyIGxpc3RlbmVyID0gKENNRG9jdW1lbnRDYWNoZUxpc3RlbmVyKWkubmV4dCgpOwotICAgICAgbGlzdGVuZXIuY2FjaGVDbGVhcmVkKHRoaXMpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0Q01Eb2N1bWVudHMoKQotICB7Ci0gIAlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAJCi0gIAlmb3IgKEl0ZXJhdG9yIGkgPSBoYXNodGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgCXsKLSAgCQlFbnRyeSBlbnRyeSA9IChFbnRyeSlpLm5leHQoKTsKLSAgCQlsaXN0LmFkZChlbnRyeS5jbURvY3VtZW50KTsKLSAgCX0KLSAgCXJldHVybiBsaXN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9DTURvY3VtZW50Q2FjaGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01Eb2N1bWVudENhY2hlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmNmRjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9DTURvY3VtZW50Q2FjaGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotCi0vKioKLSAqIHRvZG8uLi4gYWRkIG1vcmUgaW50ZXJmYWNlIG1ldGhvZHMKLSAqLwotcHVibGljIGludGVyZmFjZSBDTURvY3VtZW50Q2FjaGVMaXN0ZW5lcgotewotICAvKiogVGVsbHMgdGhlIGNsaWVudCB0aGF0IHRoZSBjYWNoZSBoYXMgYmVlbiBjbGVhcmVkLgotICAgKiAgVGhpcyBnaXZlcyBjbGllbnRzIGFuIG9wcG9ydHVuaXR5IHRvIGZsdXNoIGFueSBzdGF0ZSB0aGF0IGRlcGVuZHMgb24gdGhlIENNRG9jdW1lbnQKLSAgICogIHNpbmNlIHRoaXMgQ01Eb2N1bWVudCB3aWxsIGJlIHJlY29tcHV0ZWQgb24gYSBzdWJzZXF1ZW50ICdsb29rdXAnIHJlcXVlc3QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhY2hlQ2xlYXJlZChDTURvY3VtZW50Q2FjaGUgY2FjaGUpOyAKLQotICAvKiogCi0gICAqICBUZWxscyB0aGUgY2xpZW50IHRoYXQgdGhlIGNhY2hlIGhhcyBiZWVuIHVwZGF0ZWQuICAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhY2hlVXBkYXRlZChDTURvY3VtZW50Q2FjaGUgY2FjaGUsIFN0cmluZyB1cmksIGludCBvbGRTdGF0dXMsIGludCBuZXdTdGF0dXMsIENNRG9jdW1lbnQgY21Eb2N1bWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9DTVZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWJiOWQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIENNVmlzaXRvcgotewotICBwcm90ZWN0ZWQgaW50IGluZGVudCA9IDA7Ci0gIHByb3RlY3RlZCBTdGFjayB2aXNpdGVkQ01Hcm91cFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTU5vZGUoQ01Ob2RlIG5vZGUpCi0gIHsKLSAgICBpZiAobm9kZSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vQ29udGVudE1vZGVsTWFuYWdlci5wcmludGxuSW5kZW50ZWQoInZpc2l0Q01Ob2RlIDogIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICIgIiArIG5vZGUpOwotICAgICAgaW5kZW50ICs9IDI7Ci0gICAgICBpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0gICAgICBzd2l0Y2ggKG5vZGVUeXBlKQotICAgICAgewotICAgICAgICBjYXNlIENNTm9kZS5BTllfRUxFTUVOVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNQW55RWxlbWVudCgoQ01BbnlFbGVtZW50KW5vZGUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNQXR0cmlidXRlRGVjbGFyYXRpb24oKENNQXR0cmlidXRlRGVjbGFyYXRpb24pbm9kZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDTU5vZGUuREFUQV9UWVBFIDoKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0Q01EYXRhVHlwZSgoQ01EYXRhVHlwZSlub2RlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENNTm9kZS5ET0NVTUVOVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNRG9jdW1lbnQoKENNRG9jdW1lbnQpbm9kZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKChDTUVsZW1lbnREZWNsYXJhdGlvbilub2RlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENNTm9kZS5HUk9VUCA6Ci0gICAgICAgIHsKLSAgICAgICAgICBDTUdyb3VwIGdyb3VwID0gKENNR3JvdXApbm9kZTsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBUaGlzIGlzIHRvIHByZXZlbnQgcmVjdXJzaW9uLgotICAgICAgICAgIGlmICh2aXNpdGVkQ01Hcm91cFN0YWNrLmNvbnRhaW5zKGdyb3VwKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gUHVzaCB0aGUgY3VycmVudCBncm91cCB0byBjaGVjayBsYXRlciB0byBhdm9pZCBwb3RlbnRpYWwgcmVjdXJzaW9uCi0gICAgICAgICAgdmlzaXRlZENNR3JvdXBTdGFjay5wdXNoKGdyb3VwKTsKLSAgICAgICAgICAKLSAgICAgICAgICB2aXNpdENNR3JvdXAoZ3JvdXApOwotCi0gICAgICAgICAgLy8gUG9wIHRoZSBjdXJyZW50IGdyb3VwCi0gICAgICAgICAgdmlzaXRlZENNR3JvdXBTdGFjay5wb3AoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaW5kZW50IC09IDI7Ci0gICAgfQotICB9Ci0gICAgICAKLSAgcHVibGljIHZvaWQgdmlzaXRDTUFueUVsZW1lbnQoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNRGF0YVR5cGUoQ01EYXRhVHlwZSBkYXRhVHlwZSkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTURvY3VtZW50KENNRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBDTU5hbWVkTm9kZU1hcCBtYXAgPSBkb2N1bWVudC5nZXRFbGVtZW50cygpOwotICAgIGludCBzaXplID0gbWFwLmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHZpc2l0Q01Ob2RlKG1hcC5pdGVtKGkpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNR3JvdXAoQ01Hcm91cCBncm91cCkKLSAgewotICAgIENNTm9kZUxpc3Qgbm9kZUxpc3QgPSBncm91cC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IHNpemUgPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICB2aXNpdENNTm9kZShub2RlTGlzdC5pdGVtKGkpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7Ci0gICAgQ01OYW1lZE5vZGVNYXAgbm9kZU1hcCA9IGVkLmdldEF0dHJpYnV0ZXMoKTsKLSAgICBpbnQgc2l6ZSA9IG5vZGVNYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgdmlzaXRDTU5vZGUobm9kZU1hcC5pdGVtKGkpKTsKLSAgICB9Ci0KLSAgICB2aXNpdENNTm9kZShlZC5nZXRDb250ZW50KCkpOwotCi0gICAgdmlzaXRDTURhdGFUeXBlKGVkLmdldERhdGFUeXBlKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9Db250ZW50QnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ29udGVudEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRkMDJiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9Db250ZW50QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotICAgICAgICAgICAgICAgICAgIAotLyoqCi0gKiBUaGlzIGNsYXNzIGxldHMgeW91IHRyYXZlcnNlIGEgJ0NNJyBtb2RlbCBwcm92aWRpbmcgY2FsbGJhY2tzIHRvIGJ1aWxkIGNvbnRlbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50QnVpbGRlciBleHRlbmRzIENNVmlzaXRvcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUlMRF9BTExfQ09OVEVOVCA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVSUxEX09OTFlfUkVRVUlSRURfQ09OVEVOVCA9IDI7Ci0gIHByb3RlY3RlZCBpbnQgYnVpbGRQb2xpY3kgPSBCVUlMRF9BTExfQ09OVEVOVDsKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBhbHdheXNWaXNpdDsKLSAgcHJvdGVjdGVkIFZlY3RvciB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gIHB1YmxpYyBDb250ZW50QnVpbGRlcigpCi0gIHsKLSAgfQotICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBzZXRCdWlsZFBvbGljeShpbnQgYnVpbGRQb2xpY3kpCi0gIHsKLSAgICB0aGlzLmJ1aWxkUG9saWN5ID0gYnVpbGRQb2xpY3k7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEJ1aWxkUG9saWN5KCkKLSAgewotICAgIHJldHVybiBidWlsZFBvbGljeTsKLSAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFueUVsZW1lbnROb2RlKENNQW55RWxlbWVudCBhbnlFbGVtZW50KQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFbGVtZW50Tm9kZVN0YXJ0KENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7ICAgICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFbGVtZW50Tm9kZUVuZChDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGV4dE5vZGUoQ01EYXRhVHlwZSBkYXRhVHlwZSkKLSAgewotICB9IAotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZU5vZGUoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGUpCi0gIHsKLSAgfSAKLSAKLSAgcHVibGljIHZvaWQgdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgewotICAgIGludCBmb3JjZWRNaW4gPSAoYnVpbGRQb2xpY3kgPT0gQlVJTERfQUxMX0NPTlRFTlQgfHwgYWx3YXlzVmlzaXQpID8gMSA6IDA7Ci0gICAgaW50IG1pbiA9IE1hdGgubWF4KGVkLmdldE1pbk9jY3VyKCksIGZvcmNlZE1pbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBhbHdheXNWaXNpdCA9IGZhbHNlOwotCi0gICAgaWYgKG1pbiA+IDAgJiYgIXZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QuY29udGFpbnMoZWQpKQotICAgIHsKLSAgICAgIHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QuYWRkKGVkKTsKLSAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG1pbjsgaSsrKQotICAgICAgeyAgICAgICAKLSAgICAgICAgY3JlYXRlRWxlbWVudE5vZGVTdGFydChlZCk7ICAgICAgIAotICAgICAgICAKLSAgICAgICAgLy8gaW5zdGVhZCBvZiBjYWxsaW5nIHN1cGVyLnZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oKQotICAgICAgICAvLyB3ZSBkdXBsaWNhdGUgdGhlIGNvZGUgd2l0aCBzb21lIG1pbm9yIG1vZGlmaWNhdGlvbnMKLSAgICAgICAgQ01OYW1lZE5vZGVNYXAgbm9kZU1hcCA9IGVkLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgaW50IHNpemUgPSBub2RlTWFwLmdldExlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0Q01Ob2RlKG5vZGVNYXAuaXRlbShqKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDTUNvbnRlbnQgY29udGVudCA9IGVkLmdldENvbnRlbnQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0Q01Ob2RlKGNvbnRlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVkLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBKQotICAgICAgICB7Ci0gICAgICAgICAgQ01EYXRhVHlwZSBkYXRhVHlwZSA9IGVkLmdldERhdGFUeXBlKCk7Ci0gICAgICAgICAgaWYgKGRhdGFUeXBlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdmlzaXRDTURhdGFUeXBlKGRhdGFUeXBlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZW5kIGR1cGxpY2F0aW9uCi0gICAgICAgIGNyZWF0ZUVsZW1lbnROb2RlRW5kKGVkKTsgIAotICAgICAgfQotICAgICAgaW50IHNpemUgPSB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LnNpemUoKTsKLSAgICAgIHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QucmVtb3ZlKHNpemUgLSAxKTsKLSAgICB9Ci0gIH0KLSAgICAKLQotICBwdWJsaWMgdm9pZCB2aXNpdENNRGF0YVR5cGUoQ01EYXRhVHlwZSBkYXRhVHlwZSkKLSAgewotICAgIGNyZWF0ZVRleHROb2RlKGRhdGFUeXBlKTsgICAKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgdmlzaXRDTUdyb3VwKENNR3JvdXAgZSkKLSAgeyAKLSAgICBpbnQgZm9yY2VkTWluID0gKGJ1aWxkUG9saWN5ID09IEJVSUxEX0FMTF9DT05URU5UIHx8IGFsd2F5c1Zpc2l0KSA/IDEgOiAwOwotICAgIGludCBtaW4gPSBNYXRoLm1heChlLmdldE1pbk9jY3VyKCksIGZvcmNlZE1pbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBhbHdheXNWaXNpdCA9IGZhbHNlOwotCi0gICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbWluOyBpKyspCi0gICAgeyAgIAotICAgICAgaWYgKGUuZ2V0T3BlcmF0b3IoKSA9PSBDTUdyb3VwLkNIT0lDRSkKLSAgICAgIHsKLSAgICAgICAgLy8gYWRkIG9ubHkgMSBlbGVtZW50IGZyb20gdGhlIGdyb3VwCi0gICAgICAgIC8vIHRvZG8uLi4gcGVyaGFwcyBhZGQgc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIGZpcnN0IG9uZSAgICAgICAgCi0gICAgICAgIENNTm9kZUxpc3Qgbm9kZUxpc3QgPSBlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0Q01Ob2RlKG5vZGVMaXN0Lml0ZW0oMCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIC8vIFNFUVVFTkNFLCBBTEwKLSAgICAgIHsKLSAgICAgICAgLy8gdmlzaXQgYWxsIG9mIHRoZSBjb250ZW50Ci0gICAgICAgIHN1cGVyLnZpc2l0Q01Hcm91cChlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gCi0KLSAgcHVibGljIHZvaWQgdmlzaXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpCi0gIHsKLSAgICBpZiAoYWx3YXlzVmlzaXQgfHwKLSAgICAgICAgYnVpbGRQb2xpY3kgPT0gQlVJTERfQUxMX0NPTlRFTlQgfHwKLSAgICAgICAgYWQuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKQotICAgIHsKLSAgICAgIGNyZWF0ZUF0dHJpYnV0ZU5vZGUoYWQpOyAgICAgIAotICAgIH0KLSAgfSAgICAgICAgICAgICAgICAgICAgIAotICAKLQotICBwdWJsaWMgdm9pZCB2aXNpdENNQW55RWxlbWVudChDTUFueUVsZW1lbnQgYW55RWxlbWVudCkKLSAgeyAgCi0gICAgaW50IGZvcmNlZE1pbiA9IChidWlsZFBvbGljeSA9PSBCVUlMRF9BTExfQ09OVEVOVCB8fCBhbHdheXNWaXNpdCkgPyAxIDogMDsKLSAgICBhbHdheXNWaXNpdCA9IGZhbHNlOyAKLSAgICBpbnQgbWluID0gTWF0aC5tYXgoYW55RWxlbWVudC5nZXRNaW5PY2N1cigpLCBmb3JjZWRNaW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbWluOyBpKyspCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBjcmVhdGVBbnlFbGVtZW50Tm9kZShhbnlFbGVtZW50KTsKLSAgICB9Ci0gIH0gICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NQ29udGVudEJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTUNvbnRlbnRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMjM1NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NQ29udGVudEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBET01Db250ZW50QnVpbGRlcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUlMRF9PUFRJT05BTF9BVFRSSUJVVEVTID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVJTERfT1BUSU9OQUxfRUxFTUVOVFMgPSAxPDwxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUlMRF9GSVJTVF9DSE9JQ0UgPSAxPDwyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUlMRF9URVhUX05PREVTID0gMTw8MzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVJTERfRklSU1RfU1VCU1RJVFVUSU9OID0gMTw8NDsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IAotICAgIEJVSUxEX09OTFlfUkVRVUlSRURfQ09OVEVOVCA9Ci0gICAgICBCVUlMRF9GSVJTVF9DSE9JQ0UKLSAgICAgIHwgQlVJTERfVEVYVF9OT0RFUzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgCi0gICAgQlVJTERfQUxMX0NPTlRFTlQgPSAKLSAgICAgIEJVSUxEX09QVElPTkFMX0FUVFJJQlVURVMgCi0gICAgICB8IEJVSUxEX09QVElPTkFMX0VMRU1FTlRTIAotICAgICAgfCBCVUlMRF9GSVJTVF9DSE9JQ0UKLSAgICAgIHwgQlVJTERfVEVYVF9OT0RFUzsKLSAgICAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9CVUlMRF9CTEFOS19URVhUX05PREVTID0gImJ1aWxkQmxhbmtUZXh0Tm9kZXMiOyAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgdm9pZCBzZXRCdWlsZFBvbGljeShpbnQgYnVpbGRQb2xpY3kpOwotICBwdWJsaWMgaW50ICBnZXRCdWlsZFBvbGljeSgpOwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgdmFsdWUpOwotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotICBwdWJsaWMgTGlzdCBnZXRSZXN1bHQoKTsKLSAgcHVibGljIHZvaWQgYnVpbGQoTm9kZSBwYXJlbnQsIENNTm9kZSBjaGlsZCk7Ci0gIHB1YmxpYyB2b2lkIGNyZWF0ZURlZmF1bHRSb290Q29udGVudChDTURvY3VtZW50IGNtRG9jdW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHJvb3RDTUVsZW1lbnREZWNsYXJhdGlvbikgdGhyb3dzIEV4Y2VwdGlvbjsKLSAgcHVibGljIHZvaWQgY3JlYXRlRGVmYXVsdFJvb3RDb250ZW50KENNRG9jdW1lbnQgY21Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdENNRWxlbWVudERlY2xhcmF0aW9uLCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0KSB0aHJvd3MgRXhjZXB0aW9uOwotICBwdWJsaWMgdm9pZCBjcmVhdGVEZWZhdWx0Q29udGVudChOb2RlIHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpIHRocm93cyBFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01Db250ZW50QnVpbGRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTUNvbnRlbnRCdWlsZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDM0MWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTUNvbnRlbnRCdWlsZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Db250ZW50TW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbC5DTURhdGFUeXBlVmFsdWVIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogdG9kby4uLiBjb21tb24gdXAgdGhpcyBjb2RlIHdpdGggJ0NvbnRlbnRCdWlsZGVyJwotICovCi1wdWJsaWMgY2xhc3MgRE9NQ29udGVudEJ1aWxkZXJJbXBsIGV4dGVuZHMgQ01WaXNpdG9yIGltcGxlbWVudHMgRE9NQ29udGVudEJ1aWxkZXIgewotCXByb3RlY3RlZCBpbnQgYnVpbGRQb2xpY3kgPSBCVUlMRF9BTExfQ09OVEVOVDsKLQlwcm90ZWN0ZWQgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhbHdheXNWaXNpdCA9IGZhbHNlOwotCXByb3RlY3RlZCBMaXN0IHJlc3VsdExpc3Q7Ci0JcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OwotCXByb3RlY3RlZCBOb2RlIGN1cnJlbnRQYXJlbnQ7Ci0JcHJvdGVjdGVkIE5vZGUgdG9wUGFyZW50OwotCXByb3RlY3RlZCBWZWN0b3IgdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdHRhY2hOb2Rlc1RvUGFyZW50ID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGU7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdDsKLQlwcm90ZWN0ZWQgRWxlbWVudCByb290RWxlbWVudDsgLy8gdGhpcyBpcyB1c2VkIG9ubHkgdGVwb3JhcmlseSB2aWEKLQkJCQkJCQkJCS8vIGNyZWF0ZURlZmF1bHRSb290Q29udGVudAotCXByb3RlY3RlZCBFeHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0IGV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQ7Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXByZXNzQ3JlYXRpb25PZkRvY3R5cGVBbmRYTUxEZWNsYXJhdGlvbjsKLQotCXByb3RlY3RlZCBDTURhdGFUeXBlVmFsdWVIZWxwZXIgdmFsdWVIZWxwZXIgPSBuZXcgQ01EYXRhVHlwZVZhbHVlSGVscGVyKCk7Ci0KLQlwcm90ZWN0ZWQgaW50IG51bU9mUmVwZWF0YWJsZUVsZW1lbnRzID0gMTsKLQlwcm90ZWN0ZWQgU3RhY2sgY21Hcm91cFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JcHJvdGVjdGVkIGludCBkZXB0aExpbWl0ID0gLTE7Ci0KLQlwcm90ZWN0ZWQgaW50IGRvbUxldmVsOwotCXByaXZhdGUgaW50IG9yaWdpbmFsQnVpbGRQb2xpY3k7Ci0JCi0JcHVibGljIGludGVyZmFjZSBFeHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0IHsKLQkJcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB1cmkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQoRXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydCBleHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0KSB7Ci0JCXRoaXMuZXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydCA9IGV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQ7Ci0JfQotCi0JcHVibGljIERPTUNvbnRlbnRCdWlsZGVySW1wbChEb2N1bWVudCBkb2N1bWVudCkgewotCQl0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCW5hbWVzcGFjZVRhYmxlID0gbmV3IE5hbWVzcGFjZVRhYmxlKGRvY3VtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCdWlsZFBvbGljeShpbnQgYnVpbGRQb2xpY3kpIHsKLQkJdGhpcy5idWlsZFBvbGljeSA9IGJ1aWxkUG9saWN5OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QnVpbGRQb2xpY3koKSB7Ci0JCXJldHVybiBidWlsZFBvbGljeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZEFsbENvbnRlbnQoaW50IHBvbGljeSkgewotCQlyZXR1cm4gKHBvbGljeSAmIEJVSUxEX0FMTF9DT05URU5UKSA9PSBCVUlMRF9BTExfQ09OVEVOVDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZE9wdGlvbmFsRWxlbWVudHMoaW50IHBvbGljeSkgewotCQlyZXR1cm4gKHBvbGljeSAmIEJVSUxEX09QVElPTkFMX0VMRU1FTlRTKSA9PSBCVUlMRF9PUFRJT05BTF9FTEVNRU5UUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZE9wdGlvbmFsQXR0cmlidXRlcyhpbnQgcG9saWN5KSB7Ci0JCXJldHVybiAocG9saWN5ICYgQlVJTERfT1BUSU9OQUxfQVRUUklCVVRFUykgPT0gQlVJTERfT1BUSU9OQUxfQVRUUklCVVRFUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZEZpcnN0Q2hvaWNlKGludCBwb2xpY3kpIHsKLQkJcmV0dXJuIChwb2xpY3kgJiBCVUlMRF9GSVJTVF9DSE9JQ0UpID09IEJVSUxEX0ZJUlNUX0NIT0lDRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFRleHROb2RlcyhpbnQgcG9saWN5KSB7Ci0JCXJldHVybiAocG9saWN5ICYgQlVJTERfVEVYVF9OT0RFUykgPT0gQlVJTERfVEVYVF9OT0RFUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZEZpcnN0U3Vic3RpdHV0aW9uKGludCBwb2xpY3kpIHsKLQkJcmV0dXJuIChwb2xpY3kgJiBCVUlMRF9GSVJTVF9TVUJTVElUVVRJT04pID09IEJVSUxEX0ZJUlNUX1NVQlNUSVRVVElPTjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiByZXN1bHRMaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlwcm9wZXJ0eVRhYmxlLnB1dChwcm9wZXJ0eU5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHByb3BlcnR5VGFibGUuZ2V0KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYnVpbGQoTm9kZSBwYXJlbnQsIENNTm9kZSBjaGlsZCkgewotCQlyZXN1bHRMaXN0ID0gbmV3IFZlY3RvcigpOwotCQl0b3BQYXJlbnQgPSBwYXJlbnQ7Ci0JCWN1cnJlbnRQYXJlbnQgPSBwYXJlbnQ7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQluYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50TGluZWFnZSgoRWxlbWVudCkgcGFyZW50KTsKLQkJfQotCQlhdHRhY2hOb2Rlc1RvUGFyZW50ID0gZmFsc2U7Ci0JCWFsd2F5c1Zpc2l0ID0gdHJ1ZTsKLQkJdmlzaXRDTU5vZGUoY2hpbGQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZURlZmF1bHRSb290Q29udGVudChDTURvY3VtZW50IGNtRG9jdW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHJvb3RDTUVsZW1lbnREZWNsYXJhdGlvbiwgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMubmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvTGlzdDsKLQkJY3JlYXRlRGVmYXVsdFJvb3RDb250ZW50KGNtRG9jdW1lbnQsIHJvb3RDTUVsZW1lbnREZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlRGVmYXVsdFJvb3RDb250ZW50KENNRG9jdW1lbnQgY21Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdENNRWxlbWVudERlY2xhcmF0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSA9IGNtRG9jdW1lbnQuZ2V0Tm9kZU5hbWUoKTsKLQkJaWYgKCFzdXByZXNzQ3JlYXRpb25PZkRvY3R5cGVBbmRYTUxEZWNsYXJhdGlvbikgewotCQkJLy8gVE9ETyBjcy4uLiBpbnZlc3RpZ2F0ZSB0byBzZWUgaWYgdGhpcyBjb2RlIHBhdGggaXMgZXZlciB1c2VkLAotCQkJLy8gZG9lc24ndCBzZWVtIHRvIGJlCi0JCQkvLyBmb3Igbm93IEknbSBzZXR0aW5nIHRoZSBlbmNvZGluZyB0byBVVEYtOCBqdXN0IGluY2FzZSB0aGlzIGNvZGUKLQkJCS8vIHBhdGggaXMgdXNlZCBzb21ld2hlcmUKLQkJCS8vCi0JCQlTdHJpbmcgcGlWYWx1ZSA9ICJ2ZXJzaW9uPVwiMS4wXCIiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZW5jb2RpbmcgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCQlwaVZhbHVlICs9ICIgZW5jb2Rpbmc9XCIiICsgZW5jb2RpbmcgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgICAgICAKLQkJCVByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSA9IGRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbigieG1sIiwgcGlWYWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRvY3VtZW50LmFwcGVuZENoaWxkKHBpKTsKLQotCQkJLy8gaWYgd2UgaGF2ZSBhICdkdGQnIHRoZW4gYWRkIGEgRE9DVFlQRSB0YWcKLQkJCS8vCi0JCQlpZiAoZ3JhbW1hckZpbGVOYW1lICE9IG51bGwgJiYgZ3JhbW1hckZpbGVOYW1lLmVuZHNXaXRoKCJkdGQiKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCURPTUltcGxlbWVudGF0aW9uIGRvbUltcGwgPSBkb2N1bWVudC5nZXRJbXBsZW1lbnRhdGlvbigpOwotCQkJCURvY3VtZW50VHlwZSBkb2N1bWVudFR5cGUgPSBkb21JbXBsLmNyZWF0ZURvY3VtZW50VHlwZShyb290Q01FbGVtZW50RGVjbGFyYXRpb24uZ2V0RWxlbWVudE5hbWUoKSwgZ3JhbW1hckZpbGVOYW1lLCBncmFtbWFyRmlsZU5hbWUpOwotCQkJCWRvY3VtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50VHlwZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiB3ZSBoYXZlIGEgc2NoZW1hIGFkZCBhbiB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlCi0JCS8vCi0JCWlmIChncmFtbWFyRmlsZU5hbWUgIT0gbnVsbCAmJiBncmFtbWFyRmlsZU5hbWUuZW5kc1dpdGgoInhzZCIpICYmIG5hbWVzcGFjZUluZm9MaXN0ICE9IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIgbWFuYWdlciA9IG5ldyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcigpOwotCQkJU3RyaW5nIG5hbWUgPSByb290Q01FbGVtZW50RGVjbGFyYXRpb24uZ2V0Tm9kZU5hbWUoKTsKLQkJCWlmIChuYW1lc3BhY2VJbmZvTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIG5hbWVzcGFjZUluZm9MaXN0LmdldCgwKTsKLQkJCQlpZiAoaW5mby5wcmVmaXggIT0gbnVsbCAmJiBpbmZvLnByZWZpeC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJbmFtZSA9IGluZm8ucHJlZml4ICsgIjoiICsgbmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXJvb3RFbGVtZW50ID0gY3JlYXRlRWxlbWVudChyb290Q01FbGVtZW50RGVjbGFyYXRpb24sIG5hbWUsIGRvY3VtZW50KTsKLQkJCW1hbmFnZXIuYWRkTmFtZXNwYWNlSW5mbyhyb290RWxlbWVudCwgbmFtZXNwYWNlSW5mb0xpc3QsIHRydWUpOwotCQl9Ci0JCWNyZWF0ZURlZmF1bHRDb250ZW50KGRvY3VtZW50LCByb290Q01FbGVtZW50RGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZURlZmF1bHRDb250ZW50KE5vZGUgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkgewotCQljdXJyZW50UGFyZW50ID0gcGFyZW50OwotCQlhbHdheXNWaXNpdCA9IHRydWU7Ci0JCW9yaWdpbmFsQnVpbGRQb2xpY3kgPSBidWlsZFBvbGljeTsKLQkJdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihlZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBjb21wdXRlTmFtZShDTU5vZGUgY21Ob2RlLCBOb2RlIHBhcmVudCkgewotCQlTdHJpbmcgcHJlZml4ID0gbnVsbDsKLQkJcmV0dXJuIERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShjbU5vZGUsIHBhcmVudCwgcHJlZml4LCBuYW1lc3BhY2VUYWJsZSk7Ci0JfQotCi0JLy8gb3ZlcmlkZSB0aGUgZm9sbG93aW5nICdjcmVhdGUnIG1ldGhvZHMgdG8gY29udHJvbCBob3cgbm9kZXMgYXJlIGNyZWF0ZWQKLQkvLwotCXByb3RlY3RlZCBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIFN0cmluZyBuYW1lLCBOb2RlIHBhcmVudCkgewotCQlyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXR0ciBjcmVhdGVBdHRyaWJ1dGUoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCwgU3RyaW5nIG5hbWUsIE5vZGUgcGFyZW50KSB7Ci0JCXJldHVybiBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlVGV4dE5vZGUoQ01EYXRhVHlwZSBkYXRhVHlwZSwgU3RyaW5nIHZhbHVlLCBOb2RlIHBhcmVudCkgewotCQlyZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVB1c2hQYXJlbnQoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkKSB7Ci0JICBkb21MZXZlbCsrOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVBvcFBhcmVudChFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkKSB7Ci0gICAgICBkb21MZXZlbC0tOwotCX0KLQotCS8vIFRoZSByYW5nZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgOTkuCi0JcHVibGljIHZvaWQgc2V0TnVtT2ZSZXBlYXRhYmxlRWxlbWVudHMoaW50IGkpIHsKLQkJbnVtT2ZSZXBlYXRhYmxlRWxlbWVudHMgPSBpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0TnVtT2ZSZXBlYXRhYmxlRWxlbWVudHMoKSB7Ci0JCXJldHVybiBudW1PZlJlcGVhdGFibGVFbGVtZW50czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKSB7Ci0JCWludCBmb3JjZWRNaW4gPSAoYnVpbGRPcHRpb25hbEVsZW1lbnRzKGJ1aWxkUG9saWN5KSB8fCBhbHdheXNWaXNpdCkgPyAxIDogMDsKLQkJaW50IG1pbiA9IE1hdGgubWF4KGVkLmdldE1pbk9jY3VyKCksIGZvcmNlZE1pbik7Ci0KLQkJLy8gQ29ycmVjdCB0aGUgbWluIHZhbHVlIGlmIHRoZSBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbgotCQkvLyBhIGdyb3VwLgotCQlpZiAoIWNtR3JvdXBTdGFjay5pc0VtcHR5KCkpIHsKLQkJCUNNR3JvdXAgZ3JvdXAgPSAoQ01Hcm91cCkgY21Hcm91cFN0YWNrLnBlZWsoKTsKLQkJCWludCBnbWluID0gZ3JvdXAuZ2V0TWluT2NjdXIoKTsKLQkJCWlmIChnbWluID09IDApCi0JCQkJaWYgKGJ1aWxkT3B0aW9uYWxFbGVtZW50cyhidWlsZFBvbGljeSkpIHsgCi0JCQkJCS8qIGRvIG5vdGhpbmc6IG1pbiA9IG1pbiAqLwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbWluID0gbWluICogZ21pbjsgLy8gbWluID0gMAotCQkJCX0KLQkJCWVsc2UgewotCQkJCW1pbiA9IG1pbiAqIGdtaW47Ci0JCQl9Ci0JCX0KLQotCQlpbnQgbWF4ID0gTWF0aC5taW4oZWQuZ2V0TWF4T2NjdXIoKSwgZ2V0TnVtT2ZSZXBlYXRhYmxlRWxlbWVudHMoKSk7Ci0JCWlmIChtYXggPCBtaW4pCi0JCQltYXggPSBtaW47Ci0KLQkJYWx3YXlzVmlzaXQgPSBmYWxzZTsKLQotCQkvLyBOb3RlIC0gZWQgbWF5IG5vdCBiZSBhYnN0cmFjdCBidXQgaGFzIHN1YnN0aXR1dGlvbkdyb3VwcwotCQkvLyBpbnZvbHZlZC4KLQkJaWYgKGJ1aWxkRmlyc3RTdWJzdGl0dXRpb24oYnVpbGRQb2xpY3kpIHx8IGlzQWJzdHJhY3QoZWQpKSAvLyBsZWF2ZQotCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGlzCi0JCQkJCQkJCQkJCQkJCQkJCS8vIGZvcgotCQkJCQkJCQkJCQkJCQkJCQkvLyBiYWNrd2FyZAotCQkJCQkJCQkJCQkJCQkJCQkvLyBjb21wYXRpYmlsaXR5Ci0JCQkJCQkJCQkJCQkJCQkJCS8vIGZvciBub3cKLQkJewotCQkJLy8gTm90ZSAtIFRvIGNoYW5nZSBzbyB0aGF0IGlmIGVkIGlzIG9wdGlvbmFsLCB3ZSBkbyBub3QKLQkJCS8vIGdlbmVyYXRlIGFueXRoaW5nIGhlcmUuCi0JCQllZCA9IGdldFN1YnN0aXR1dGlvbihlZCk7Ci0KLQkJCS8vIE5vdGUgLSB0aGUgcmV0dXJuZWQgZWQgbWF5IGJlIGFuIGFic3RyYWN0IGVsZW1lbnQgaW4KLQkJCS8vIHdoaWNoIGNhc2UgdGhlIHhtbCB3aWxsIGJlIGludmFsaWQuCi0JCX0KLQotCQlpZiAobWluID4gMCAmJiAhdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5jb250YWlucyhlZCkpIHsKLQkJCXZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QuYWRkKGVkKTsKLQkJCWZvciAoaW50IGkgPSAxOyBpIDw9IG1heDsgaSsrKSB7Ci0JCQkJLy8gY3JlYXRlIGFuIEVsZW1lbnQgZm9yIGVhY2gKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQkJCWlmIChyb290RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnQgPSByb290RWxlbWVudDsKLQkJCQkJcm9vdEVsZW1lbnQgPSBudWxsOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoZWQsIGNvbXB1dGVOYW1lKGVkLCBjdXJyZW50UGFyZW50KSwgY3VycmVudFBhcmVudCk7Ci0JCQkJfQotCi0JCQkJLy8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBHcmFtbWFyRWxlbWVudAotCQkJCU5vZGUgb2xkUGFyZW50ID0gY3VycmVudFBhcmVudDsKLQkJCQljdXJyZW50UGFyZW50ID0gZWxlbWVudDsKLQkJCQloYW5kbGVQdXNoUGFyZW50KGVsZW1lbnQsIGVkKTsKLQotCQkJCW5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0KLQkJCQlib29sZWFuIG9sZEF0dGFjaE5vZGVzVG9QYXJlbnQgPSBhdHRhY2hOb2Rlc1RvUGFyZW50OwotCQkJCWF0dGFjaE5vZGVzVG9QYXJlbnQgPSB0cnVlOwotCi0JCQkJLy8gaW5zdGVhZCBvZiBjYWxsaW5nIHN1cGVyLnZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oKQotCQkJCS8vIHdlIGR1cGxpY2F0ZSB0aGUgY29kZSB3aXRoIHNvbWUgbWlub3IgbW9kaWZpY2F0aW9ucwotCQkJCUNNTmFtZWROb2RlTWFwIG5vZGVNYXAgPSBlZC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJaW50IHNpemUgPSBub2RlTWFwLmdldExlbmd0aCgpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7Ci0JCQkJCXZpc2l0Q01Ob2RlKG5vZGVNYXAuaXRlbShqKSk7Ci0JCQkJfQotCi0JCQkJQ01Db250ZW50IGNvbnRlbnQgPSBlZC5nZXRDb250ZW50KCk7Ci0JCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJCQl2aXNpdENNTm9kZShjb250ZW50KTsKLQkJCQl9Ci0KLQkJCQlpZiAoZWQuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEpIHsKLQkJCQkJQ01EYXRhVHlwZSBkYXRhVHlwZSA9IGVkLmdldERhdGFUeXBlKCk7Ci0JCQkJCWlmIChkYXRhVHlwZSAhPSBudWxsKSB7Ci0JCQkJCQl2aXNpdENNRGF0YVR5cGUoZGF0YVR5cGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIGVuZCBkdXBsaWNhdGlvbgotCQkJCWF0dGFjaE5vZGVzVG9QYXJlbnQgPSBvbGRBdHRhY2hOb2Rlc1RvUGFyZW50OwotCQkJCWhhbmRsZVBvcFBhcmVudChlbGVtZW50LCBlZCk7Ci0JCQkJY3VycmVudFBhcmVudCA9IG9sZFBhcmVudDsKLQkJCQlsaW5rTm9kZShlbGVtZW50KTsKLQkJCX0KLQkJCWludCBzaXplID0gdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5zaXplKCk7Ci0JCQl2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LnJlbW92ZShzaXplIC0gMSk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01EYXRhVHlwZShDTURhdGFUeXBlIGRhdGFUeXBlKSB7Ci0JCVRleHQgdGV4dCA9IG51bGw7Ci0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0KLQkJLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci0JCS8vIFByZXZpb3VzIGNvZGUgdXNlcyBhIHByb3BlcnR5IHZhbHVlIGJ1dCBuZXcgb25lIHVzZXMKLQkJLy8gYnVpbGRQb2xpY3kuCi0JCWlmIChnZXRQcm9wZXJ0eShQUk9QRVJUWV9CVUlMRF9CTEFOS19URVhUX05PREVTKSAhPSBudWxsICYmIGdldFByb3BlcnR5KFBST1BFUlRZX0JVSUxEX0JMQU5LX1RFWFRfTk9ERVMpLmVxdWFscygidHJ1ZSIpKSAvLyROT04tTkxTLTEkCi0JCQlidWlsZFBvbGljeSA9IGJ1aWxkUG9saWN5IF4gQlVJTERfVEVYVF9OT0RFUzsKLQotCQlpZiAoYnVpbGRUZXh0Tm9kZXMoYnVpbGRQb2xpY3kpKSB7Ci0JCQl2YWx1ZSA9IHZhbHVlSGVscGVyLmdldFZhbHVlKGRhdGFUeXBlKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJaWYgKGN1cnJlbnRQYXJlbnQgIT0gbnVsbCAmJiBjdXJyZW50UGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJdmFsdWUgPSBjdXJyZW50UGFyZW50LmdldE5vZGVOYW1lKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl2YWx1ZSA9ICJwY2RhdGEiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRleHQgPSBjcmVhdGVUZXh0Tm9kZShkYXRhVHlwZSwgdmFsdWUsIGN1cnJlbnRQYXJlbnQpOwotCQlsaW5rTm9kZSh0ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdENNTm9kZShDTU5vZGUgbm9kZSkgewotCQlpZiAoZGVwdGhMaW1pdCAhPSAtMSkgewotCQkJaWYgKGRvbUxldmVsID4gZGVwdGhMaW1pdCkgewotCQkJCWJ1aWxkUG9saWN5ID0gYnVpbGRQb2xpY3kgJj0gfkJVSUxEX09QVElPTkFMX0VMRU1FTlRTOwotCQkJfSBlbHNlIHsKLQkJCQlidWlsZFBvbGljeSA9IG9yaWdpbmFsQnVpbGRQb2xpY3k7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIudmlzaXRDTU5vZGUobm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRDTUdyb3VwKENNR3JvdXAgZSkgewotCQljbUdyb3VwU3RhY2sucHVzaChlKTsKLQotCQlpbnQgZm9yY2VkTWluID0gKGJ1aWxkT3B0aW9uYWxFbGVtZW50cyhidWlsZFBvbGljeSkgfHwgYWx3YXlzVmlzaXQpID8gMSA6IDA7Ci0JCWludCBtaW4gPSBNYXRoLm1heChlLmdldE1pbk9jY3VyKCksIGZvcmNlZE1pbik7Ci0KLQkJaW50IG1heCA9IDA7Ci0JCWlmIChlLmdldE1heE9jY3VyKCkgPT0gLTEpIC8vIHVuYm91bmRlZAotCQkJbWF4ID0gZ2V0TnVtT2ZSZXBlYXRhYmxlRWxlbWVudHMoKTsKLQkJZWxzZQotCQkJbWF4ID0gTWF0aC5taW4oZS5nZXRNYXhPY2N1cigpLCBnZXROdW1PZlJlcGVhdGFibGVFbGVtZW50cygpKTsKLQotCQlpZiAobWF4IDwgbWluKQotCQkJbWF4ID0gbWluOwotCi0JCWFsd2F5c1Zpc2l0ID0gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbWF4OyBpKyspIHsKLQkJCWlmIChlLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5DSE9JQ0UgJiYgYnVpbGRGaXJzdENob2ljZShidWlsZFBvbGljeSkpIHsKLQkJCQlDTU5vZGUgaGludE5vZGUgPSBudWxsOwotCi0JCQkJLy8gdG9kby4uLiB0aGUgQ01Hcm91cCBzaG91bGQgc3BlY2lmeSB0aGUgaGludC4uLiBidXQgaXQgc2VlbXMKLQkJCQkvLyBhcyB0aG91Z2gKLQkJCQkvLyB0aGUgWWFtYXRvIGd1eXMgYXJlIG1ha2luZyB0aGUgQ01FbGVtZW50IHNwZWNpZnkgdGhlIGhpbnQuCi0JCQkJLy8gSSBkbyBpdCB0aGF0IHdheSBmb3Igbm93IHVudGlsLi4uIHdlIHNob3VsZCBmaXggdGhpcyBwb3N0Ci0JCQkJLy8gR0EKLQkJCQkvLyAgICAKLQkJCQlpbnQgbGlzdFNpemUgPSB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LnNpemUoKTsKLQkJCQlpZiAobGlzdFNpemUgPiAwKSB7Ci0JCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LmdldChsaXN0U2l6ZSAtIDEpOwotCQkJCQlPYmplY3QgY29udGVudEhpbnQgPSBlZC5nZXRQcm9wZXJ0eSgiY29udGVudEhpbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoY29udGVudEhpbnQgaW5zdGFuY2VvZiBDTU5vZGUpIHsKLQkJCQkJCWhpbnROb2RlID0gKENNTm9kZSkgY29udGVudEhpbnQ7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzZWUgaWYgdGhpcyBoaW50IGNvcnJlc3BvbmRzIHRvIGEgdmFsaWQgY2hvaWNlCi0JCQkJLy8KLQkJCQlDTU5vZGUgY21Ob2RlID0gbnVsbDsKLQotCQkJCWlmIChoaW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCUNNTm9kZUxpc3Qgbm9kZUxpc3QgPSBlLmdldENoaWxkTm9kZXMoKTsKLQkJCQkJaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbm9kZUxpc3RMZW5ndGg7IGorKykgewotCQkJCQkJaWYgKGhpbnROb2RlID09IG5vZGVMaXN0Lml0ZW0oaikpIHsKLQkJCQkJCQljbU5vZGUgPSBoaW50Tm9kZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGlmIG5vIGNtTm9kZSBoYXMgYmVlbiBkZXRlcm1pbmVkIGZyb20gdGhlIGhpbnQsIGp1c3QgdXNlCi0JCQkJLy8gdGhlIGZpcnN0IGNob2ljZQotCQkJCS8vCi0JCQkJaWYgKGNtTm9kZSA9PSBudWxsKSB7Ci0JCQkJCUNNTm9kZUxpc3Qgbm9kZUxpc3QgPSBlLmdldENoaWxkTm9kZXMoKTsKLQkJCQkJaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkgewotCQkJCQkJY21Ob2RlID0gbm9kZUxpc3QuaXRlbSgwKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChjbU5vZGUgIT0gbnVsbCkgewotCQkJCQl2aXNpdENNTm9kZShjbU5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGUuZ2V0T3BlcmF0b3IoKSA9PSBDTUdyb3VwLkFMTCAvLyBBTEwKLQkJCQkJCXx8IGUuZ2V0T3BlcmF0b3IoKSA9PSBDTUdyb3VwLlNFUVVFTkNFKSAvLyBTRVFVRU5DRQotCQkJewotCQkJCS8vIHZpc2l0IGFsbCBvZiB0aGUgY29udGVudAotCQkJCXN1cGVyLnZpc2l0Q01Hcm91cChlKTsKLQkJCX0KLQkJfQotCi0JCWNtR3JvdXBTdGFjay5wb3AoKTsKLQl9Ci0KLQlzdGF0aWMgaW50IGNvdW50ID0gMDsKLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKSB7Ci0JCWlmIChhbHdheXNWaXNpdCB8fCBidWlsZE9wdGlvbmFsQXR0cmlidXRlcyhidWlsZFBvbGljeSkgfHwgYWQuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQlhbHdheXNWaXNpdCA9IGZhbHNlOwotCQkJU3RyaW5nIG5hbWUgPSBjb21wdXRlTmFtZShhZCwgY3VycmVudFBhcmVudCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSB2YWx1ZUhlbHBlci5nZXRWYWx1ZShhZCwgbmFtZXNwYWNlVGFibGUpOwotCQkJQXR0ciBhdHRyID0gY3JlYXRlQXR0cmlidXRlKGFkLCBuYW1lLCBjdXJyZW50UGFyZW50KTsKLQkJCWF0dHIuc2V0VmFsdWUodmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCQlsaW5rTm9kZShhdHRyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQWJzdHJhY3QoQ01Ob2RlIGVkKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChlZCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBlZC5nZXRQcm9wZXJ0eSgiQWJzdHJhY3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0ID0gKHZhbHVlID09IEJvb2xlYW4uVFJVRSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0U3Vic3RpdHV0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IGVkOwotCQlDTU5vZGVMaXN0IGwgPSAoQ01Ob2RlTGlzdCkgZWQuZ2V0UHJvcGVydHkoIlN1YnN0aXR1dGlvbkdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGwgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlDTU5vZGUgY2FuZGlkYXRlID0gbC5pdGVtKGkpOwotCQkJCWlmICghaXNBYnN0cmFjdChjYW5kaWRhdGUpICYmIChjYW5kaWRhdGUgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikpIHsKLQkJCQkJcmVzdWx0ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBjYW5kaWRhdGU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRQYXJlbnRDTUVsZW1lbnREZWNsYXJhdGlvbigpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBudWxsOwotCQlpbnQgbGlzdFNpemUgPSB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LnNpemUoKTsKLQkJaWYgKGxpc3RTaXplID4gMCkgewotCQkJZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QuZ2V0KGxpc3RTaXplIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KSB7Ci0JCS8vIGluZ25vcmUgYnVpbGRQb2xpY3kgZm9yIEFOWSBlbGVtZW50cy4uLiBvbmx5IGNyZWF0ZSBlbGVtZW50cyBpZgotCQkvLyBhYnNvbHV0ZWx5IG5lZWRlZAotCQkvLwotCQlpbnQgZm9yY2VkTWluID0gYWx3YXlzVmlzaXQgPyAxIDogMDsKLQkJaW50IG1pbiA9IE1hdGgubWF4KGFueUVsZW1lbnQuZ2V0TWluT2NjdXIoKSwgZm9yY2VkTWluKTsKLQkJYWx3YXlzVmlzaXQgPSBmYWxzZTsKLQotCQlTdHJpbmcgdXJpID0gYW55RWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQkJU3RyaW5nIHRhcmdldE5TUHJvcGVydHkgPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSI7IC8vJE5PTi1OTFMtMSQKLQkJQ01Eb2N1bWVudCBwYXJlbnRDTURvY3VtZW50ID0gKENNRG9jdW1lbnQpIGFueUVsZW1lbnQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG51bGw7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJwYXJlbnRDTURvY3VtZW50ID0gIiArIHBhcmVudENNRG9jdW1lbnQpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCWlmIChwYXJlbnRDTURvY3VtZW50ICE9IG51bGwpIHsKLQkJCWlmICh1cmkgPT0gbnVsbCB8fCB1cmkuc3RhcnRzV2l0aCgiIyMiKSB8fCB1cmkuZXF1YWxzKHBhcmVudENNRG9jdW1lbnQuZ2V0UHJvcGVydHkodGFyZ2V0TlNQcm9wZXJ0eSkpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJZWQgPSBnZXRTdWl0YWJsZUVsZW1lbnQoZ2V0UGFyZW50Q01FbGVtZW50RGVjbGFyYXRpb24oKSwgcGFyZW50Q01Eb2N1bWVudCk7Ci0JCQl9Ci0JCX0KLQotCi0JCWlmIChlZCA9PSBudWxsICYmIGV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQgIT0gbnVsbCAmJiB1cmkgIT0gbnVsbCAmJiAhdXJpLnN0YXJ0c1dpdGgoIiMjIikgJiYgY3VycmVudFBhcmVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJQ01Eb2N1bWVudCBleHRlcm5hbENNRG9jdW1lbnQgPSBleHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0LmdldENNRG9jdW1lbnQoKEVsZW1lbnQpIGN1cnJlbnRQYXJlbnQsIHVyaSk7Ci0JCQlpZiAoZXh0ZXJuYWxDTURvY3VtZW50ICE9IG51bGwpIHsKLQkJCQllZCA9IGdldFN1aXRhYmxlRWxlbWVudChudWxsLCBleHRlcm5hbENNRG9jdW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbWluOyBpKyspIHsKLQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihlZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJBTlktRUxFTUVOVCIpOyAvLyROT04tTkxTLTEkCi0JCQkJbGlua05vZGUoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0U3VpdGFibGVFbGVtZW50KENNTmFtZWROb2RlTWFwIG5hbWVOb2RlTWFwKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0JCWludCBzaXplID0gbmFtZU5vZGVNYXAuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBjYW5kaWRhdGUgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIG5hbWVOb2RlTWFwLml0ZW0oaSk7Ci0JCQlpZiAoIXZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QuY29udGFpbnMoY2FuZGlkYXRlKSkgewotCQkJCXJlc3VsdCA9IGNhbmRpZGF0ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRTdWl0YWJsZUVsZW1lbnQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIENNRG9jdW1lbnQgY21Eb2N1bWVudCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotCi0JCWlmIChlZCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRTdWl0YWJsZUVsZW1lbnQoZWQuZ2V0TG9jYWxFbGVtZW50cygpKTsKLQkJfQotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCAmJiBjbURvY3VtZW50ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGdldFN1aXRhYmxlRWxlbWVudChjbURvY3VtZW50LmdldEVsZW1lbnRzKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGxpbmtOb2RlKE5vZGUgbm9kZSkgewotCQlpZiAoYXR0YWNoTm9kZXNUb1BhcmVudCAmJiBjdXJyZW50UGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCSgoRWxlbWVudCkgY3VycmVudFBhcmVudCkuc2V0QXR0cmlidXRlTm9kZSgoQXR0cikgbm9kZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljdXJyZW50UGFyZW50LmFwcGVuZENoaWxkKG5vZGUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHJlc3VsdExpc3QgIT0gbnVsbCkgewotCQkJcmVzdWx0TGlzdC5hZGQobm9kZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFBvcHVsYXRlRG9jdW1lbnRGcm9tR3JhbW1hckZpbGUoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBncmFtbWFyRmlsZU5hbWUsIFN0cmluZyByb290RWxlbWVudE5hbWUsIGJvb2xlYW4gaGFjaykgewotCQl0cnkgewotCQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gQ29udGVudE1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNNRG9jdW1lbnQoZ3JhbW1hckZpbGVOYW1lLCBudWxsKTsKLQkJCUNNTmFtZWROb2RlTWFwIGVsZW1lbnRNYXAgPSBjbURvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50TWFwLmdldE5hbWVkSXRlbShyb290RWxlbWVudE5hbWUpOwotCi0JCQlET01Db250ZW50QnVpbGRlckltcGwgY29udGVudEJ1aWxkZXIgPSBuZXcgRE9NQ29udGVudEJ1aWxkZXJJbXBsKGRvY3VtZW50KTsKLQkJCWNvbnRlbnRCdWlsZGVyLnN1cHJlc3NDcmVhdGlvbk9mRG9jdHlwZUFuZFhNTERlY2xhcmF0aW9uID0gaGFjazsKLQkJCWNvbnRlbnRCdWlsZGVyLmNyZWF0ZURlZmF1bHRSb290Q29udGVudChjbURvY3VtZW50LCBlbGVtZW50KTsKLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJCURPTVdyaXRlciB3cml0ZXIgPSBuZXcgRE9NV3JpdGVyKCk7Ci0JCQlpZiAoaGFjaykgewotCQkJCXdyaXRlci5wcmludChkb2N1bWVudCwgZ3JhbW1hckZpbGVOYW1lKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXdyaXRlci5wcmludChkb2N1bWVudCk7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6ICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbEVsZW1lbnREZXB0aExpbWl0KGludCBkZXB0aCkgewotCQlkZXB0aExpbWl0ID0gZGVwdGg7Ci0JfQotCQotCi0JLy8gdGVzdAotCS8vCi0JLyoKLQkgKiBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnW10pIHsgaWYgKGFyZy5sZW5ndGggPj0gMikgeyB0cnkgewotCSAqIENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlckNNRG9jdW1lbnRCdWlsZGVyV2l0aENsYXNzTmFtZSgib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2ZpbXBsLkNNRG9jdW1lbnRCdWlsZGVySW1wbCIpOwotCSAqIAotCSAqIFN0cmluZyBncmFtbWFyRmlsZU5hbWUgPSBhcmdbMF07IFN0cmluZyByb290RWxlbWVudE5hbWUgPSBhcmdbMV07Ci0JICogCi0JICogRG9jdW1lbnQgZG9jdW1lbnQgPQotCSAqIChEb2N1bWVudClDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnhlcmNlcy5kb20uRG9jdW1lbnRJbXBsIikubmV3SW5zdGFuY2UoKTsKLQkgKiB0ZXN0UG9wdWxhdGVEb2N1bWVudEZyb21HcmFtbWFyRmlsZShkb2N1bWVudCwgZ3JhbW1hckZpbGVOYW1lLAotCSAqIHJvb3RFbGVtZW50TmFtZSwgdHJ1ZSk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JICogU3lzdGVtLm91dC5wcmludGxuKCJET01Db250ZW50QnVpbGRlckltcGwgZXJyb3IiKTsgZS5wcmludFN0YWNrVHJhY2UoKTsgfSB9Ci0JICogZWxzZSB7IFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2UgOiBqYXZhCi0JICogb3JnLmVjbGlwc2Uud3N0LnhtbC51dGlsLkRPTUNvbnRlbnRCdWlsZGluZ0NNVmlzaXRvciBncmFtbWFyRmlsZU5hbWUKLQkgKiByb290RWxlbWVudE5hbWUiKTsgfSB9Ci0JICovCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01OYW1lc3BhY2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTU5hbWVzcGFjZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDlkNDQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTU5hbWVzcGFjZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIERPTU5hbWVzcGFjZUhlbHBlcgoteyAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VVJJRm9yUHJlZml4KEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHByZWZpeCkKLSAgeyAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JICBTdHJpbmcgbnNBdHRyTmFtZSA9IG51bGw7Ci0JICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgCi0gICAgewotCQkgIG5zQXR0ck5hbWUgPSAieG1sbnM6IiArIHByZWZpeDsgLy8kTk9OLU5MUy0xJAotCSAgfQotCSAgZWxzZSAKLSAgICB7Ci0JCSAgbnNBdHRyTmFtZSA9ICJ4bWxucyI7IC8vJE5PTi1OTFMtMSQKLQkgIH0KLSAgICAgICAgICAgIAotICAgIC8vIGFzc3VtZSB0aGUgbm9kZSBpcyBxdWFsaWZpZWQuLi4gbG9vayB1cCB0aGUgVVJJIGJhc2Ugb24gdGhlIHByZWZpeAotICAgIC8vCi0JICBmb3IgKE5vZGUgbm9kZSA9IGVsZW1lbnQ7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSAKLSAgICB7Ci0JICAgCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IChFbGVtZW50KW5vZGU7Ci0JCSAgICBBdHRyIGF0dHIgPSB0aGVFbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUobnNBdHRyTmFtZSk7Ci0JCSAgICBpZiAoYXR0ciAhPSBudWxsKSAKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGF0dHIuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgICAgICAKLSAgICAvLyBzZWUgaWYgd2UgY2FuIGZpbmQgc29tZSBpbmZvIGZyb20gYW4gJ2ltcGxpY2l0JyBuYW1lc3BhY2UKLSAgICAvLwotICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIE5hbWVzcGFjZVRhYmxlIHRhYmxlID0gbmV3IE5hbWVzcGFjZVRhYmxlKGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICAgIHJlc3VsdCA9IHRhYmxlLmdldFVSSUZvclByZWZpeChwcmVmaXgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotCX0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoTm9kZSBub2RlKQotICB7ICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICB7ICAgICAgICAgICAgICAgCi0gICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudClub2RlOwotICAgICAgU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgICByZXN1bHQgPSBnZXRVUklGb3JQcmVmaXgoZWxlbWVudCwgcHJlZml4KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpCi0gICAgeyAgICAgIAotICAgICAgQXR0ciBhdHRyID0gKEF0dHIpbm9kZTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBhdHRyLmdldFByZWZpeCgpOwotICAgICAgcmVzdWx0ID0gZ2V0VVJJRm9yUHJlZml4KGF0dHIuZ2V0T3duZXJFbGVtZW50KCksIHByZWZpeCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAgICAgICAgIAotCi0gIC8vIHRvZG8uLi4gdGhpcyBpcyBhbiB1Z2x5IGhhY2suLi4gbmVlZHMgdG8gYmUgZml4ZWQKLSAgLy8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZVByZWZpeChDTU5vZGUgY21Ob2RlLCBOb2RlIHBhcmVudE5vZGUpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKE5vZGUgbm9kZSA9IHBhcmVudE5vZGU7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKQotICAgIHsKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldFByZWZpeChub2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAgICAKLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgIGludCBpbmRleCA9IG5hbWUuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIHByZWZpeCA9IG5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICB9Ci0gICAgcmV0dXJuIHByZWZpeDsKLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5wcmVmaXhlZE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoIjoiKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVOYW1lKENNTm9kZSBjbU5vZGUsIE5vZGUgcGFyZW50LCBTdHJpbmcgcHJlZml4KQotICB7ICAgICAKLSAgICByZXR1cm4gY29tcHV0ZU5hbWUoY21Ob2RlLCBwYXJlbnQsIHByZWZpeCwgbnVsbCk7Ci0gIH0gICAKLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVOYW1lKENNTm9kZSBjbU5vZGUsIE5vZGUgcGFyZW50LCBTdHJpbmcgcHJlZml4LCBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBjbU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQotICAgIC8vIGlmIHRoZSBjbU5vZGUgaGFzIGEgaGFyZCBjb2RlZCBwcmVmaXggdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nCi0gICAgLy8KLSAgICBpZiAoZ2V0UHJlZml4KHJlc3VsdCkgPT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAKLSAgICAgIFN0cmluZyBxdWFsaWZpY2F0aW9uID0gKFN0cmluZyljbU5vZGUuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uc1ByZWZpeFF1YWxpZmljYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgLy8gc2VlIGlmIHdlIG5lZWQgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAvLwotICAgICAgaWYgKHF1YWxpZmljYXRpb24gIT0gbnVsbCAmJiBxdWFsaWZpY2F0aW9uLmVxdWFscygicXVhbGlmaWVkIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSAgICAgICAgICAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICAvLyB0b2RvLi4uIGFkZCBnZXRDTURvY3VtZW50KCkgbWV0aG9kIHRvIENNTm9kZQotICAgICAgICAgIC8vIGZvciBub3cgdXNlIHRoaXMgZ2V0UHJvcGVydHkoKSBoYWNrCi0gICAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpY21Ob2RlLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKSAgICAgICAgICAKLSAgICAgICAgICB7ICAgICAKLSAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKQotICAgICAgICAgICAgeyAgIAotICAgICAgICAgICAgICAvLyB1c2UgdGhlIE5hbWVzcGFjZVRhYmxlIHRvIGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QgcHJlZml4IGZvciB0aGlzIG5hbWVzcGFjZSB1cmkKLSAgICAgICAgICAgICAgLy8gICAgICAKLSAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVRhYmxlID09IG51bGwpCi0gICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFID8gKERvY3VtZW50KXBhcmVudCA6IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlVGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoZG9jdW1lbnQpOwotICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnRMaW5lYWdlKChFbGVtZW50KXBhcmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHByZWZpeCA9IG5hbWVzcGFjZVRhYmxlLmdldFByZWZpeEZvclVSSShuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IHByZWZpeCArICI6IiArIHJlc3VsdDsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9ICAgIAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAKLSAgCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRVUklRdWFsaWZpZWROYW1lQ29tcG9uZW50cyhTdHJpbmcgdXJpUXVhbGlmaWVkTmFtZSkKLSAgewotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbMl07Ci0gICAgaW50IGZpcnN0SW5kZXggPSB1cmlRdWFsaWZpZWROYW1lLmluZGV4T2YoIlsiKTsgLy8kTk9OLU5MUy0xJAotICAgIGludCBsYXN0SW5kZXggPSB1cmlRdWFsaWZpZWROYW1lLmluZGV4T2YoIl0iKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChmaXJzdEluZGV4ICE9IC0xICYmIGxhc3RJbmRleCA+IGZpcnN0SW5kZXgpCi0gICAgewotICAgICAgcmVzdWx0WzBdID0gdXJpUXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoZmlyc3RJbmRleCArIDEsIGxhc3RJbmRleCk7Ci0gICAgICByZXN1bHRbMV0gPSB1cmlRdWFsaWZpZWROYW1lLnN1YnN0cmluZyhsYXN0SW5kZXggKyAxKTsKLSAgICB9ICAKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0WzFdID0gdXJpUXVhbGlmaWVkTmFtZTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTU5hbWVzcGFjZUluZm9NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0N2VmYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBET01OYW1lc3BhY2VJbmZvTWFuYWdlciAgICAgICAgICAKLSAqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTSV9VUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyKCkKLSAgewotICB9ICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VJbmZvTGlzdChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBOYW1lc3BhY2VJbmZvUmVhZGVyIHJlYWRlciA9IG5ldyBOYW1lc3BhY2VJbmZvUmVhZGVyKCk7Ci0gICAgcmV0dXJuIHJlYWRlci5nZXROYW1lc3BhY2VJbmZvTGlzdChlbGVtZW50KTsKLSAgfSAgICAgICAgICAgIAotICAgCi0gIHB1YmxpYyB2b2lkIHJlbW92ZU5hbWVzcGFjZUluZm8oRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAKLSAgICBOYW1lc3BhY2VJbmZvUmVtb3ZlciByZW1vdmVyID0gbmV3IE5hbWVzcGFjZUluZm9SZW1vdmVyKCk7Ci0gICAgcmVtb3Zlci5yZW1vdmVOYW1lc3BhY2VJbmZvKGVsZW1lbnQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlSW5mbyhFbGVtZW50IGVsZW1lbnQsIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QsIGJvb2xlYW4gbmVlZHNYU0kpCi0gIHsgIAotICAgIC8vIGZpcnN0IHdlIGNyZWF0ZSBhbiB4bWxucyBhdHRyaWJ1dGUgZm9yIGVhY2ggbmFtZXNwYWNlCi0gICAgLy8gICAgICAgICAgICAgICAgICAgCi0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uVmFsdWUgPSAiIjsgICAgICAvLyROT04tTkxTLTEkCi0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbmFtZXNwYWNlSW5mb0xpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgTmFtZXNwYWNlSW5mbyBuc0luZm8gPSAoTmFtZXNwYWNlSW5mbylpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBuc0luZm8ubm9ybWFsaXplKCk7Ci0gICAgICAgICAgICAgICAKLSAgICAgIGlmIChuc0luZm8udXJpICE9IG51bGwpIAotICAgICAgeyAgICAgICAgICAgIAotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBuc0luZm8ucHJlZml4ICE9IG51bGwgPyAieG1sbnM6IiArIG5zSW5mby5wcmVmaXggOiAieG1sbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgQXR0ciBuYW1lc3BhY2VBdHRyID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGF0dHJOYW1lKTsgIAotICAgICAgICBuYW1lc3BhY2VBdHRyLnNldFZhbHVlKG5zSW5mby51cmkpOwotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUobmFtZXNwYWNlQXR0cik7ICAgCi0KLSAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHdlIHVzZSB0aGUgYXR0cmlidXRlICJ4c2k6c2NoZW1hTG9jYXRpb24iCi0gICAgICAgIC8vIGhlcmUgd2UgYnVpbGQgdXAgaXRzIHZhbHVlCi0gICAgICAgIC8vCi0gICAgICAgIGlmIChuc0luZm8ubG9jYXRpb25IaW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzY2hlbWFMb2NhdGlvblZhbHVlICs9IG5zSW5mby51cmk7Ci0gICAgICAgICAgc2NoZW1hTG9jYXRpb25WYWx1ZSArPSAiICI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBzY2hlbWFMb2NhdGlvblZhbHVlICs9IG5zSW5mby5sb2NhdGlvbkhpbnQ7Ci0gICAgICAgICAgc2NoZW1hTG9jYXRpb25WYWx1ZSArPSAiICI7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSAgIAotCi0gICAgICAgIGlmIChuc0luZm8udXJpLmVxdWFscyhYU0lfVVJJKSkKLSAgICAgICAgewotICAgICAgICAgIG5lZWRzWFNJID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgIAotICAgICAgZWxzZSBpZiAobnNJbmZvLmxvY2F0aW9uSGludCAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugd2UgdXNlIHRoZSBhdHRyaWJ1dGUgInhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIgotICAgICAgICAvLwotICAgICAgICBBdHRyIGF0dHIgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoInhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIik7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgICBhdHRyLnNldFZhbHVlKG5zSW5mby5sb2NhdGlvbkhpbnQpOwotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0gICAgICB9IAotICAgIH0gCi0KLSAgICBpZiAobmVlZHNYU0kpCi0gICAgewotICAgICAgLy8gd2UgYWRkIGFuIHhtbG5zOnhzaSBhdHRyaWJ1dGUgdG8gZGVmaW5lICd4c2k6c2NoZW1hTG9jYXRpb24nIGF0dHJpYnV0ZQotICAgICAgLy8gICAKLSAgICAgIEF0dHIgYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZSgieG1sbnM6eHNpIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGF0dHIuc2V0VmFsdWUoWFNJX1VSSSk7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0gICAgfQotCi0gICAgaWYgKHNjaGVtYUxvY2F0aW9uVmFsdWUubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIC8vIGNyZWF0ZSB0aGUgInhzaTpzY2hlbWFMb2NhdGlvbiIgYXR0cmlidXRlCi0gICAgICAvLwotICAgICAgQXR0ciBhdHRyID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKCJ4c2k6c2NoZW1hTG9jYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgYXR0ci5zZXRWYWx1ZShzY2hlbWFMb2NhdGlvblZhbHVlKTsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShhdHRyKTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfSAKLSAgICAgICAKLSAgLyoqCi0gICAqCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5hbWVzcGFjZUluZm9SZWFkZXIgZXh0ZW5kcyBOYW1lc3BhY2VBdHRyaWJ1dGVWaXNpdG9yCi0gIHsgIAotICAgIHByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gICAgcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlSW5mb0xpc3QoRWxlbWVudCBlbGVtZW50KQotICAgIHsKLSAgICAgIHZpc2l0RWxlbWVudChlbGVtZW50KTsKLSAgICAgIHJldHVybiBuYW1lc3BhY2VJbmZvTGlzdDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0lOb05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IGNyZWF0ZU5hbWVzcGFjZUluZm8oKTsKLSAgICAgIGluZm8ubG9jYXRpb25IaW50ID0gdmFsdWU7ICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IGNyZWF0ZU5hbWVzcGFjZUluZm8oKTsKLSAgICAgIGluZm8udXJpID0gdXJpOwotICAgICAgaW5mby5wcmVmaXggPSBwcmVmaXg7ICAgICAgCi0gICAgICBzdXBlci52aXNpdFhNTE5hbWVzcGFjZUF0dHJpYnV0ZShhdHRyLCBwcmVmaXgsIHVyaSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0lTY2hlbWFMb2NhdGlvblZhbHVlUGFpcihTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYXRpb25IaW50KQotICAgIHsgICAgCi0gICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBnZXROYW1lc3BhY2VJbmZvRm9yVVJJKHVyaSk7ICAgICAgICAgICAgCi0gICAgICBpZiAoaW5mbyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbmZvLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSGludDsKLSAgICAgIH0gCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGluZm8gPSBjcmVhdGVOYW1lc3BhY2VJbmZvKCk7Ci0gICAgICAgIGluZm8udXJpID0gdXJpOwotICAgICAgICBpbmZvLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSGludDsKLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIHByb3RlY3RlZCBOYW1lc3BhY2VJbmZvIGdldE5hbWVzcGFjZUluZm9Gb3JVUkkoU3RyaW5nIHVyaSkKLSAgICB7ICAgIAotICAgICAgTmFtZXNwYWNlSW5mbyByZXN1bHQgPSBudWxsOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gbmFtZXNwYWNlSW5mb0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8paS5uZXh0KCk7Ci0gICAgICAgIGlmIChpbmZvLnVyaSAhPSBudWxsICYmIGluZm8udXJpLmVxdWFscyh1cmkpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gaW5mbzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgIAotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgICAKLQotICAgIHByb3RlY3RlZCBOYW1lc3BhY2VJbmZvIGNyZWF0ZU5hbWVzcGFjZUluZm8oKQotICAgIHsKLSAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbyk7Ci0gICAgICByZXR1cm4gaW5mbzsKLSAgICB9Ci0gIH0KLSAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgLyoqCi0gICAqCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5hbWVzcGFjZUluZm9SZW1vdmVyIGV4dGVuZHMgTmFtZXNwYWNlQXR0cmlidXRlVmlzaXRvcgotICB7ICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGF0dHJpYnV0ZXNUb1JlbW92ZSA9IG5ldyBWZWN0b3IoKTsKLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5hbWVzcGFjZUluZm8oRWxlbWVudCBlbGVtZW50KQotICAgIHsgIAotICAgICAgdmlzaXRFbGVtZW50KGVsZW1lbnQpOwotICAgICAgcmVtb3ZlQXR0cmlidXRlcygpOwotICAgIH0gICAKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNJTm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbkF0dHJpYnV0ZShBdHRyIGF0dHIsIFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICBhdHRyaWJ1dGVzVG9SZW1vdmUuYWRkKGF0dHIpOwotICAgIH0gICAgICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIG5hbWVzcGFjZVByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgICB7ICAgCi0gICAgICBhdHRyaWJ1dGVzVG9SZW1vdmUuYWRkKGF0dHIpOwotICAgICAgc3VwZXIudmlzaXRYTUxOYW1lc3BhY2VBdHRyaWJ1dGUoYXR0ciwgbmFtZXNwYWNlUHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTSVNjaGVtYUxvY2F0aW9uQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgIGF0dHJpYnV0ZXNUb1JlbW92ZS5hZGQoYXR0cik7Ci0gICAgfSAgIAotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlcygpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gYXR0cmlidXRlc1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKWkubmV4dCgpOwotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgIAotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQyZjdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTVZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLy8gdG9kby4uIG1vdmUgdGhpcyBjbGFzcyB0byBhbm90aGVyIHBhY2thZ2UgKHBlcmhhcHMgeG1sdXRpbGl0eSkKLS8vCi1wdWJsaWMgY2xhc3MgRE9NVmlzaXRvcgoteyAgICAgICAgIAotICBwdWJsaWMgdm9pZCB2aXNpdE5vZGUoTm9kZSBub2RlKQotICB7Ci0gICAgc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpCi0gICAgewotICAgICAgY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgdmlzaXRBdHRyKChBdHRyKW5vZGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotICAgICAgewotICAgICAgICB2aXNpdENEQVRBU2VjdGlvbigoQ0RBVEFTZWN0aW9uKW5vZGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotICAgICAgewotICAgICAgICB2aXNpdENvbW1lbnQoKENvbW1lbnQpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX05PREUgOgotICAgICAgewotICAgICAgICB2aXNpdERvY3VtZW50KChEb2N1bWVudClub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgdmlzaXREb2N1bWVudFR5cGUoKERvY3VtZW50VHlwZSlub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgdmlzaXRFbGVtZW50KChFbGVtZW50KW5vZGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotICAgICAgewotICAgICAgICB2aXNpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbigoUHJvY2Vzc2luZ0luc3RydWN0aW9uKW5vZGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5URVhUX05PREUgOgotICAgICAgewotICAgICAgICB2aXNpdFRleHQoKFRleHQpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gIAotICB9ICAgIAotICAgIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdERvY3VtZW50KERvY3VtZW50IGRvY3VtZW50KQotICB7ICAgICAgICAgICAgICAgICAgIAotICAgIHZpc2l0Q2hpbGROb2Rlc0hlbHBlcihkb2N1bWVudCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdERvY3VtZW50VHlwZShEb2N1bWVudFR5cGUgZG9jdHlwZSkKLSAgeyAgICAgICAgIAotCi0gIH0gIAotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAgICAgIAotICAgIHZpc2l0QXR0cmlidXRlc0hlbHBlcihlbGVtZW50KTsKLSAgICB2aXNpdENoaWxkTm9kZXNIZWxwZXIoZWxlbWVudCk7Ci0gIH0gCi0gCi0KLSAgcHVibGljIHZvaWQgdmlzaXRBdHRyKEF0dHIgYXR0cikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0VGV4dChUZXh0IHRleHQpCi0gIHsgICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdENEQVRBU2VjdGlvbihDREFUQVNlY3Rpb24gY2RhdGFTZWN0aW9uKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgfSAgICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRDb21tZW50KENvbW1lbnQgY29tbWVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAKLSAgfSAgIAotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UHJvY2Vzc2luZ0luc3RydWN0aW9uKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSkKLSAgeyAgICAKLSAgfQotIAotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0Q2hpbGROb2Rlc0hlbHBlcihOb2RlIG5vZGUpCi0gIHsKLSAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICB2aXNpdE5vZGUoY2hpbGRyZW4uaXRlbShpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRBdHRyaWJ1dGVzSGVscGVyKE5vZGUgbm9kZSkKLSAgewotICAgIE5hbWVkTm9kZU1hcCBtYXAgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcC5nZXRMZW5ndGgoKTsgaSsrICkKLSAgICB7Ci0gICAgICB2aXNpdE5vZGUobWFwLml0ZW0oaSkpOwotICAgIH0KLSAgfSAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NV3JpdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01Xcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxMGQ1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01Xcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuVGV4dFByb2Nlc3NvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogVGhpcyBpcyBhIGhhY2tlZCB1cCBkb20gd3JpdGVyIHN0b2xlbiBmcm9tIGEgWGVyY2VzIHNhbXBsZS4KLSAqIEknZCBsaWtlIHRvIHVzZSBhbiBleGlzaXRuZyAnZ2VuZXJpYyBET00nIHdyaXRlcgotICogSWYgYW55b25lIGNhbiBmaW5kIHN1Y2ggYSB0aGluZyB0aGVuIHBsZWFzZSBnbyBhaGVhZCBhbmQganVuayB0aGlzLgotICoKLSAqIEB2ZXJzaW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBET01Xcml0ZXIKLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZm9ybWF0dGluZ0VuYWJsZWQgPSB0cnVlOwotICAgcHJvdGVjdGVkIGJvb2xlYW4gb3V0cHV0RG9jdHlwZUVuYWJsZWQgPSB0cnVlOwotICAgcHJvdGVjdGVkIFByaW50V3JpdGVyIG91dDsKLSAgIHByb3RlY3RlZCBpbnQgaW5kZW50ID0gMDsgIAotCi0gICBwdWJsaWMgRE9NV3JpdGVyKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgIHsKLSAgICAgdGhpcyhTeXN0ZW0ub3V0KTsKLSAgIH0KLQotICAgcHVibGljIERPTVdyaXRlcihPdXRwdXRTdHJlYW0gb3V0cHV0U3RlYW0pCi0gICB7Ci0gICAgIG91dCA9IG5ldyBQcmludFdyaXRlcihvdXRwdXRTdGVhbSk7Ci0gICB9Ci0KLSAgIHB1YmxpYyBET01Xcml0ZXIoV3JpdGVyIHdyaXRlcikKLSAgIHsKLSAgICAgb3V0ID0gbmV3IFByaW50V3JpdGVyKHdyaXRlcik7Ci0gICB9Ci0KLSAgIHB1YmxpYyB2b2lkIHNldEZvcm1hdHRpbmdFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKLSAgIHsKLSAgICAgZm9ybWF0dGluZ0VuYWJsZWQgPSBlbmFibGVkOwotICAgfQotCi0gICBwdWJsaWMgYm9vbGVhbiBnZXRGb3JtYXR0aW5nRW5hYmxlZCgpCi0gICB7Ci0gICAgIHJldHVybiBmb3JtYXR0aW5nRW5hYmxlZDsKLSAgIH0KLQotICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RG9jdHlwZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQotICAgewotICAgICBvdXRwdXREb2N0eXBlRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICB9Ci0KLSAgIHB1YmxpYyBjbGFzcyBYTUxWaXNpdG9yCi0gICB7Ci0gICAgIHByb3RlY3RlZCBib29sZWFuIGN1cnJlbnRFbGVtZW50SGFzQ2hpbGRFbGVtZW50cyA9IGZhbHNlOwotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0Tm9kZShOb2RlIG5vZGUpCi0gICAgIHsKLSAgICAgICBzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkKLSAgICAgICB7Ci0gICAgICAgICBjYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOgotICAgICAgICAgewotICAgICAgICAgICB2aXNpdEF0dHIoKEF0dHIpbm9kZSk7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgIHZpc2l0Q0RBVEFTZWN0aW9uKChDREFUQVNlY3Rpb24pbm9kZSk7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgIHZpc2l0Q29tbWVudCgoQ29tbWVudClub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfTk9ERSA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgIHZpc2l0RG9jdW1lbnQoKERvY3VtZW50KW5vZGUpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOgotICAgICAgICAgewotICAgICAgICAgICB2aXNpdERvY3VtZW50VHlwZSgoRG9jdW1lbnRUeXBlKW5vZGUpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotICAgICAgICAgewotICAgICAgICAgICB2aXNpdEVsZW1lbnQoKEVsZW1lbnQpbm9kZSk7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgIHZpc2l0UHJvY2Vzc2luZ0luc3RydWN0aW9uKChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pbm9kZSk7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgIHZpc2l0VGV4dCgoVGV4dClub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgfQotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXREb2N1bWVudChEb2N1bWVudCBkb2N1bWVudCkKLSAgICAgewotICAgICAgIHZpc2l0Q2hpbGROb2Rlc0hlbHBlcihkb2N1bWVudCk7Ci0gICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdERvY3VtZW50VHlwZShEb2N1bWVudFR5cGUgZG9jdHlwZSkKLSAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgaWYgKG91dHB1dERvY3R5cGVFbmFibGVkKQotICAgICAgIHsKLSAgICAgICAgIFN0cmluZyBkYXRhID0gZ2V0RG9jdW1lbnRUeXBlRGF0YShkb2N0eXBlKTsKLSAgICAgICAgIHByaW50KCI8IURPQ1RZUEUgIiArIGRhdGEgKyAiPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICB9Ci0gICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIGlmICghZG9TaG93KGVsZW1lbnQpKQotICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgYm9vbGVhbiBwYXJlbnRFbGVtZW50SGFzQ2hpbGROb2RlcyA9IGN1cnJlbnRFbGVtZW50SGFzQ2hpbGRFbGVtZW50czsKLSAgICAgICBjdXJyZW50RWxlbWVudEhhc0NoaWxkRWxlbWVudHMgPSBoYXNDaGlsZEVsZW1lbnRzKGVsZW1lbnQpOwotCi0gICAgICAgcHJpbnRJbmRlbnQoKTsKLSAgICAgICBwcmludCgiPCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgcHJpbnQoZWxlbWVudC5nZXROb2RlTmFtZSgpKTsKLSAgICAgICB2aXNpdEF0dHJpYnV0ZXNIZWxwZXIoZWxlbWVudCk7Ci0KLSAgICAgICBib29sZWFuIGhhc0NoaWxkTm9kZXMgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA+IDA7ICAgICAgICAgICAgICAgIAotICAgICAgIGJvb2xlYW4gaXNSb290RWxlbWVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFOwotICAgICAgIGlmIChoYXNDaGlsZE5vZGVzIHx8IGlzUm9vdEVsZW1lbnQpCi0gICAgICAgewotICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50SGFzQ2hpbGRFbGVtZW50cykKLSAgICAgICAgIHsKLSAgICAgICAgICAgcHJpbnRsbigiPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByaW50KCI+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgIH0KLSAgICAgICAgIGluZGVudCArPSAyOwotICAgICAgICAgdmlzaXRDaGlsZE5vZGVzSGVscGVyKGVsZW1lbnQpOwotICAgICAgICAgaW5kZW50IC09IDI7Ci0KLSAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudEhhc0NoaWxkRWxlbWVudHMgfHwgaXNSb290RWxlbWVudCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgcHJpbnRJbmRlbnQoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHByaW50KCI8LyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICBwcmludChlbGVtZW50LmdldE5vZGVOYW1lKCkpOwotICAgICAgICAgcHJpbnRsbigiPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgfQotICAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgICBwcmludGxuKCIvPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgfQotCi0gICAgICAgY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzID0gcGFyZW50RWxlbWVudEhhc0NoaWxkTm9kZXM7Ci0gICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHIoQXR0ciBhdHRyKQotICAgICB7Ci0gICAgICAgcHJpbnQoIiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIHByaW50KGF0dHIuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgcHJpbnQoIj1cIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgcHJpbnQoY3JlYXRlUHJpbnRhYmxlQ2hhcmFjdGVyRGF0YShhdHRyLmdldFZhbHVlKCkpKTsKLSAgICAgICBwcmludCgiXCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXRUZXh0KFRleHQgdGV4dCkKLSAgICAgewotICAgICAgIGlmIChjdXJyZW50RWxlbWVudEhhc0NoaWxkRWxlbWVudHMpCi0gICAgICAgewotICAgICAgICAgcHJpbnRJbmRlbnQoKTsKLSAgICAgICAgIHByaW50KGNyZWF0ZVByaW50YWJsZUNoYXJhY3RlckRhdGEodGV4dC5nZXROb2RlVmFsdWUoKSkpOwotICAgICAgICAgcHJpbnRsbigpOwotICAgICAgIH0KLSAgICAgICBlbHNlCi0gICAgICAgewotICAgICAgICAgcHJpbnQoY3JlYXRlUHJpbnRhYmxlQ2hhcmFjdGVyRGF0YSh0ZXh0LmdldE5vZGVWYWx1ZSgpKSk7Ci0gICAgICAgfQotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXRDREFUQVNlY3Rpb24oQ0RBVEFTZWN0aW9uIGNkYXRhU2VjdGlvbikKLSAgICAgewotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXRDb21tZW50KENvbW1lbnQgY29tbWVudCkKLSAgICAgewotICAgICAgIHByaW50SW5kZW50KCk7Ci0gICAgICAgcHJpbnQoIjwhLS0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIHByaW50KGNvbW1lbnQuZ2V0Tm9kZVZhbHVlKCkpOwotICAgICAgIHByaW50bG4oIi0tPiIpOyAvLyROT04tTkxTLTEkCi0gICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbihQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkpCi0gICAgIHsKLSAgICAgICBwcmludEluZGVudCgpOwotICAgICAgIHByaW50KCI8PyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgcHJpbnQocGkuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgcHJpbnQoIiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIHByaW50KHBpLmdldE5vZGVWYWx1ZSgpKTsKLSAgICAgICBwcmludGxuKCI/PiIpOyAvLyROT04tTkxTLTEkCi0gICAgIH0KLSAgICAgICAgICAgICAKLQotICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZEVsZW1lbnRzKE5vZGUgbm9kZSkKLSAgICAgewotICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgewotICAgICAgICAgaWYgKGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdENoaWxkTm9kZXNIZWxwZXIoTm9kZSBub2RlKQotICAgICB7Ci0gICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgewotICAgICAgICAgdmlzaXROb2RlKGNoaWxkcmVuLml0ZW0oaSkpOwotICAgICAgIH0KLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlc0hlbHBlcihOb2RlIG5vZGUpCi0gICAgIHsKLSAgICAgICBOYW1lZE5vZGVNYXAgbWFwID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXAuZ2V0TGVuZ3RoKCk7IGkrKyApCi0gICAgICAgewotICAgICAgICAgdmlzaXROb2RlKG1hcC5pdGVtKGkpKTsKLSAgICAgICB9Ci0gICAgIH0KLSAgIH0KLQotICAvKiogYW4gdWdseSBoYWNrIHVudGlsIEkgcmVzdHJ1Y3QgdGhpcyBjb2RlIGEgbGl0dGxlCi0gICAqICAKLSAgICovICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZG9TaG93KEVsZW1lbnQgZWxlbWVudCkgICAgCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgLyoqIGNvbnZlcnRzIERPTSB0ZXh0IHZhbHVlcyB0byAncHJpbnRhYmxlJyB2YWx1ZXMgCi0gICAqICAtIGNvbnZlcnRzICcmJyB0byAnJmFtcDsnCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZVByaW50YWJsZUNoYXJhY3RlckRhdGEoU3RyaW5nIHN0cmluZykKLSAgeyAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgaW50IGluZGV4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHdoaWxlICh0cnVlKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpbnQgYW1wZXJzYW5kSW5kZXggPSBzdHJpbmcuaW5kZXhPZigiJiIsIGluZGV4KTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGFtcGVyc2FuZEluZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICByZXN1bHQgKz0gc3RyaW5nLnN1YnN0cmluZyhpbmRleCwgYW1wZXJzYW5kSW5kZXgpOwotICAgICAgICByZXN1bHQgKz0gIiZhbXA7IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpbmRleCA9IGFtcGVyc2FuZEluZGV4ICsgMTsgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gCi0gICAgcmVzdWx0ICs9IHN0cmluZy5zdWJzdHJpbmcoaW5kZXgpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qKiBQcmludHMgdGhlIHNwZWNpZmllZCBub2RlLCByZWN1cnNpdmVseS4gKi8KLSAgcHVibGljIHZvaWQgcHJpbnQoTm9kZSBub2RlKQotICB7Ci0gICAgLy8gaXMgdGhlcmUgYW55dGhpbmcgdG8gZG8/Ci0gICAgaWYgKG5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYTUxWaXNpdG9yIHZpc2l0b3IgPSBuZXcgWE1MVmlzaXRvcigpOwotICAgICAgdmlzaXRvci52aXNpdE5vZGUobm9kZSk7Ci0gICAgfQotICAgIG91dC5mbHVzaCgpOwotICB9Ci0KLSAgLyoqIGEgdGVtcG9yYXJ5IGhhY2sgdG8gd29ya2Fyb3VuZCBvdXIgaW5hYmlsaXR5IHRvIGNyZWF0ZSBhIERvY3VtZW50VHlwZSB0YWcqLwotICBwdWJsaWMgdm9pZCBwcmludChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGdyYW1tYXJVUkwpCi0gIHsKLSAgICBTdHJpbmcgc3lzdGVtSWQgPSBudWxsOwotICAgIGlmIChncmFtbWFyVVJMLmVuZHNXaXRoKCJkdGQiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIGludCBsYXN0U2xhc2hJbmRleCA9IE1hdGgubWF4KGdyYW1tYXJVUkwubGFzdEluZGV4T2YoIi8iKSwgZ3JhbW1hclVSTC5sYXN0SW5kZXhPZigiXFwiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgaWYgKGxhc3RTbGFzaEluZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICBzeXN0ZW1JZCA9IGdyYW1tYXJVUkwuc3Vic3RyaW5nKGxhc3RTbGFzaEluZGV4ICsgMSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHByaW50KGRvY3VtZW50LCAiVVRGLTgiLCBncmFtbWFyVVJMLCBudWxsLCBzeXN0ZW1JZCk7IC8vJE5PTi1OTFMtMSQKLQotICB9Ci0KLSAgLyoqIGEgdGVtcG9yYXJ5IGhhY2sgdG8gd29ya2Fyb3VuZCBvdXIgaW5hYmlsaXR5IHRvIGNyZWF0ZSBhIERvY3VtZW50VHlwZSB0YWcqLwotICBwdWJsaWMgdm9pZCBwcmludChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgZ3JhbW1hckZpbGVOYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgewotCXB1YmxpY0lkID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKHB1YmxpY0lkKTsKLQlzeXN0ZW1JZCA9IFRleHRQcm9jZXNzb3IucHJvY2VzcyhzeXN0ZW1JZCk7Ci0gICAgb3V0LnByaW50bG4oIjw/eG1sIHZlcnNpb249XCIxLjBcIiIgKyAiIGVuY29kaW5nPVwiIiArIGVuY29kaW5nICsgIlwiPz4iKTsgICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgIGlmIChncmFtbWFyRmlsZU5hbWUuZW5kc1dpdGgoIi5kdGQiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIFN0cmluZyBkb2NUeXBlTGluZSA9ICI8IURPQ1RZUEUgIiArIGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpLmdldE5vZGVOYW1lKCkgKyAiICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgaWYgKHB1YmxpY0lkICE9IG51bGwpIAotICAgICAgewotICAgICAgICBkb2NUeXBlTGluZSArPSAiUFVCTElDIFwiIiArIHB1YmxpY0lkICsgIlwiICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBpZiAoc3lzdGVtSWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGRvY1R5cGVMaW5lICs9ICJcIiIgKyBzeXN0ZW1JZCArICJcIiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgICAgICBkb2NUeXBlTGluZSArPSAiPiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgb3V0LnByaW50bG4oZG9jVHlwZUxpbmUpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoc3lzdGVtSWQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZG9jVHlwZUxpbmUgKz0gIlNZU1RFTSBcIiIgKyBzeXN0ZW1JZCArICJcIiA+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIG91dC5wcmludGxuKGRvY1R5cGVMaW5lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcHJpbnQoZG9jdW1lbnQpOwotICB9ICAKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREb2N1bWVudFR5cGVEYXRhKERvY3VtZW50VHlwZSBkb2N0eXBlKQotICB7Ci0gICAgU3RyaW5nIGRhdGEgPSBkb2N0eXBlLmdldE5hbWUoKTsKLSAgICBpZiAoZG9jdHlwZS5nZXRQdWJsaWNJZCgpICE9IG51bGwpCi0gICAgewotICAgICAgZGF0YSArPSAiIFBVQkxJQyBcIiIgKyBkb2N0eXBlLmdldFB1YmxpY0lkKCkgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIFN0cmluZyBzeXN0ZW1JZCA9IGRvY3R5cGUuZ2V0U3lzdGVtSWQoKTsKLSAgICAgIGlmIChzeXN0ZW1JZCA9PSBudWxsKQotICAgICAgewotICAgICAgICBzeXN0ZW1JZCA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBkYXRhICs9ICIgXCIiICsgc3lzdGVtSWQgKyAiXCIiOyAgICAgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZGF0YSArPSAiIFNZU1RFTSBcIiIgKyBkb2N0eXBlLmdldFN5c3RlbUlkKCkgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci0gICAgcmV0dXJuIGRhdGE7Ci0gIH0gICAgIAotCi0gIHB1YmxpYyB2b2lkIHByaW50bG4oKQotICB7Ci0gICAgaWYgKGZvcm1hdHRpbmdFbmFibGVkKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJpbnRsbihTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgaWYgKGZvcm1hdHRpbmdFbmFibGVkKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKHN0cmluZyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXQucHJpbnQoc3RyaW5nKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludEluZGVudCgpCi0gIHsgICAgICAgICAgICAgCi0gICAgaWYgKGZvcm1hdHRpbmdFbmFibGVkKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludCgiICIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICB9ICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIHByaW50KFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgICBvdXQucHJpbnQoc3RyaW5nKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9JbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9JbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YTNjNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvSW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vLyB0aGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGJ1aWxkIGEgZ3JhbW1hciBkb2N1bWVudCBnaXZlbiBhIGxvY2FsIGZpbGUgbmFtZQotLy8KLXB1YmxpYyBpbnRlcmZhY2UgSW5mZXJyZWRHcmFtbWFyRmFjdG9yeQoteyAgIAotICBwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KFN0cmluZyB1cmkpOyAKLSAgcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGNyZWF0ZUNNRWxlbWVudERlY2xhcmF0aW9uKENNRG9jdW1lbnQgY21Eb2N1bWVudCwgRWxlbWVudCBlbGVtZW50LCBib29sZWFuIGlzTG9jYWwpOwotICBwdWJsaWMgdm9pZCBjcmVhdGVDTUNvbnRlbnQoQ01Eb2N1bWVudCBwYXJlbnRDTURvY3VtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCwgQ01Eb2N1bWVudCBjaGlsZENNRG9jdW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGNoaWxkRWQsIGJvb2xlYW4gaXNMb2NhbCwgU3RyaW5nIHVyaSk7Ci0gIHB1YmxpYyB2b2lkIGRlYnVnUHJpbnQoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTsgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9OYW1lc3BhY2VBdHRyaWJ1dGVWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9OYW1lc3BhY2VBdHRyaWJ1dGVWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZDE5M2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvTmFtZXNwYWNlQXR0cmlidXRlVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gYnVnIDE5ODgwNyAtIGF0dHJpYnV0ZSBvcmRlciBkZXBlbmRhbmN5LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlQXR0cmlidXRlVmlzaXRvcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9TQ0hFTUFfSU5TVEFOQ0VfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIHhzaVByZWZpeCA9ICJ4c2kiOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIHZvaWQgdmlzaXRYTUxOYW1lc3BhY2VBdHRyaWJ1dGUoQXR0ciBhdHRyLCBTdHJpbmcgbmFtZXNwYWNlUHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7ICAgCi0gICAgaWYgKG5hbWVzcGFjZVVSSS5lcXVhbHMoWE1MX1NDSEVNQV9JTlNUQU5DRV9VUkkpKQotICAgIHsKLSAgICAgIHhzaVByZWZpeCA9IG5hbWVzcGFjZVByZWZpeDsKLSAgICB9Ci0gIH0gCi0KLSAgcHVibGljIHZvaWQgdmlzaXRYU0lOb05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIHZhbHVlKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdFhTSVNjaGVtYUxvY2F0aW9uQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSk7ICAgICAgICAgIAotICAgIHdoaWxlICh0cnVlKQotICAgIHsKLSAgICAgIFN0cmluZyBuc1VSSSA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsKLSAgICAgIFN0cmluZyBsb2NhdGlvbkhpbnQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7ICAgICAgICAgICAgCi0gICAgICBpZiAobnNVUkkgIT0gbnVsbCAmJiBsb2NhdGlvbkhpbnQgIT0gbnVsbCkKLSAgICAgIHsgICAgCi0gICAgICAgIHZpc2l0WFNJU2NoZW1hTG9jYXRpb25WYWx1ZVBhaXIobnNVUkksIGxvY2F0aW9uSGludCk7ICAgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0gICAKLQotICBwdWJsaWMgdm9pZCB2aXNpdFhTSVNjaGVtYUxvY2F0aW9uVmFsdWVQYWlyKFN0cmluZyB1cmksIFN0cmluZyBsb2NhdGlvbkhpbnQpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBOYW1lZE5vZGVNYXAgbWFwID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgaW50IG1hcExlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICAKLSAgICAvLyBGaXJzdCByZXRyaWV2ZSBhbGwgdGhlIG5hbWVzcGFjZXMgc28gdGhhdCB0aGV5IGFyZSBsb2FkZWQgYmVmb3JlCi0gICAgLy8gZG9pbmcgYW55IHNwZWNpYWwgcHJlZml4IGhhbmRsaW5nLiAgVGhpcyBhbGxvd3MgdGhlIGF0dHJpYnV0ZXMgdG8gYmUKLSAgICAvLyBkZWZpbmVkIGluIGFueSBvcmRlciwgYnV0IHRoZSBuYW1lc3BhY2VzIGhhdmUgdG8gYmUgcmV0cmlldmVkIGZpcnN0LgotICAgIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwTGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgQXR0ciBhdHRyID0gKEF0dHIpbWFwLml0ZW0oaSk7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFByZWZpeChhdHRyLmdldE5hbWUoKSk7Ci0gICAgICBTdHJpbmcgdW5wcmVmaXhlZE5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VW5wcmVmaXhlZE5hbWUoYXR0ci5nZXROYW1lKCkpOwotICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHVucHJlZml4ZWROYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChwcmVmaXguZXF1YWxzKCJ4bWxucyIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdFhNTE5hbWVzcGFjZUF0dHJpYnV0ZShhdHRyLCB1bnByZWZpeGVkTmFtZSwgYXR0ci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAodW5wcmVmaXhlZE5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHVucHJlZml4ZWROYW1lLmVxdWFscygieG1sbnMiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYTUxOYW1lc3BhY2VBdHRyaWJ1dGUoYXR0ciwgIiIsIGF0dHIuZ2V0VmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgfSAgICAgIAotCi0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBMZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBBdHRyIGF0dHIgPSAoQXR0ciltYXAuaXRlbShpKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgIFN0cmluZyB1bnByZWZpeGVkTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyLmdldE5hbWUoKSk7Ci0gICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgdW5wcmVmaXhlZE5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAJaWYgKHByZWZpeC5lcXVhbHMoeHNpUHJlZml4KSAmJiB1bnByZWZpeGVkTmFtZS5lcXVhbHMoInNjaGVtYUxvY2F0aW9uIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0WFNJU2NoZW1hTG9jYXRpb25BdHRyaWJ1dGUoYXR0ciwgYXR0ci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwcmVmaXguZXF1YWxzKHhzaVByZWZpeCkgJiYgdW5wcmVmaXhlZE5hbWUuZXF1YWxzKCJub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0WFNJTm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbkF0dHJpYnV0ZShhdHRyLCBhdHRyLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9OYW1lc3BhY2VJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9OYW1lc3BhY2VJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YWY5MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvTmFtZXNwYWNlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VJbmZvCi17ICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBTdHJpbmcgdXJpOwotICBwdWJsaWMgU3RyaW5nIHByZWZpeDsKLSAgcHVibGljIFN0cmluZyBsb2NhdGlvbkhpbnQ7Ci0gIHB1YmxpYyBib29sZWFuIGlzUHJlZml4UmVxdWlyZWQ7IAotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGhhc2h0YWJsZTsKLQotICBwdWJsaWMgTmFtZXNwYWNlSW5mbygpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBOYW1lc3BhY2VJbmZvKFN0cmluZyB1cmksIFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhdGlvbkhpbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLnVyaSA9IHVyaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMucHJlZml4ID0gcHJlZml4OwotICAgIHRoaXMubG9jYXRpb25IaW50ID0gbG9jYXRpb25IaW50OwotICB9ICAgCi0KLSAgcHVibGljIE5hbWVzcGFjZUluZm8oTmFtZXNwYWNlSW5mbyB0aGF0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLnVyaSA9IHRoYXQudXJpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5wcmVmaXggPSB0aGF0LnByZWZpeDsKLSAgICB0aGlzLmxvY2F0aW9uSGludCA9IHRoYXQubG9jYXRpb25IaW50OwotICAgIC8vIHRvZG8uLi4gc2VlIGlmIHdlIG5lZWQgdG8gY2xvbmUgdGhlIGhhc3RhYmxlIAotICB9Ci0KLSAgcHVibGljIHZvaWQgbm9ybWFsaXplKCkKLSAgewotICAgIHVyaSA9IGdldE5vcm1hbGl6ZWRWYWx1ZSh1cmkpOwotICAgIHByZWZpeCAgPSBnZXROb3JtYWxpemVkVmFsdWUocHJlZml4KTsKLSAgICBsb2NhdGlvbkhpbnQ9IGdldE5vcm1hbGl6ZWRWYWx1ZShsb2NhdGlvbkhpbnQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXROb3JtYWxpemVkVmFsdWUoU3RyaW5nIHN0cmluZykKLSAgewotICAgIHJldHVybiAoc3RyaW5nICE9IG51bGwgJiYgc3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSA/IG51bGwgOiBzdHJpbmc7Ci0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBpZiAoaGFzaHRhYmxlID09IG51bGwpCi0gICAgewotICAgICAgaGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIH0KLSAgICBoYXNodGFibGUucHV0KHByb3BlcnR5LCB2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIHJldHVybiAoaGFzaHRhYmxlICE9IG51bGwpID8gaGFzaHRhYmxlLmdldChwcm9wZXJ0eSkgOiBudWxsOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGNsb25lTmFtZXNwYWNlSW5mb0xpc3QoTGlzdCBvbGRMaXN0KQotICB7ICAKLSAgICBMaXN0IG5ld0xpc3QgPSBuZXcgVmVjdG9yKG9sZExpc3Quc2l6ZSgpKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvbGRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgTmFtZXNwYWNlSW5mbyBvbGRJbmZvID0gKE5hbWVzcGFjZUluZm8paS5uZXh0KCk7Ci0gICAgICBuZXdMaXN0LmFkZChuZXcgTmFtZXNwYWNlSW5mbyhvbGRJbmZvKSk7Ci0gICAgfSAgICAgICAgICAgICAgIAotICAgIHJldHVybiBuZXdMaXN0OwotICB9Ci19ICAgICAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9OYW1lc3BhY2VUYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvTmFtZXNwYWNlVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkMTE1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9OYW1lc3BhY2VUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VUYWJsZSBleHRlbmRzIE5hbWVzcGFjZUF0dHJpYnV0ZVZpc2l0b3IKLXsgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBIYXNodGFibGUgaGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKiBAcGFyYW0gZG9jdW1lbnQgLSBubyBsb25nZXIgdXNlZAotICovCi1wdWJsaWMgTmFtZXNwYWNlVGFibGUoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsgICAgICAgICAKLQkgIHRoaXMoKTsKLSAgICAvL0RPTUV4dGVuc2lvbiBkb21FeHRlbnNpb24gPSBET01FeHRlbnNpb25Qcm92aWRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RE9NRXh0ZW5zaW9uKGRvY3VtZW50KTsKLSAgICAvL2lmIChkb21FeHRlbnNpb24gIT0gbnVsbCkKLSAgICAvL3sgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vICBhZGROYW1lc3BhY2VJbmZvTGlzdChkb21FeHRlbnNpb24uZ2V0SW1wbGljdE5hbWVzcGFjZUluZm9MaXN0KCksIHRydWUpOwotICAgIC8vIH0KLSAgfSAgIAotCi0gIHByaXZhdGUgTmFtZXNwYWNlVGFibGUoKQotICB7ICAgICAgIAotCSAgc3VwZXIoKTsKLSAgfSAgCi0KLSAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCgpCi0gIHsKLSAgICByZXR1cm4gaGFzaHRhYmxlLnZhbHVlcygpLnNpemUoKSA+IDA7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeEZvclVSSShTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBOYW1lc3BhY2VJbmZvIGVudHJ5ID0gZ2V0TmFtZXNwYWNlSW5mb0ZvclVSSSh1cmksIHRydWUpOwotICAgIGlmIChlbnRyeSAhPSBudWxsKSAKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbnRyeS5wcmVmaXg7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgICAKLQotICBwdWJsaWMgU3RyaW5nIGdldFVSSUZvclByZWZpeChTdHJpbmcgcHJlZml4KQotICB7ICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBnZXROYW1lc3BhY2VJbmZvRm9yUHJlZml4KHByZWZpeCk7Ci0gICAgaWYgKGluZm8gIT0gbnVsbCkgCi0gICAgewotICAgICAgcmVzdWx0ID0gaW5mby51cmk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotCi0gICAgICAgICAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzTWF0Y2hpbmdTdHJpbmcoU3RyaW5nIGEsIFN0cmluZyBiKQotICB7Ci0gICAgcmV0dXJuICgoYSA9PSBudWxsICYmIGIgPT0gbnVsbCkgfHwgKGEgIT0gbnVsbCAmJiBiICE9IG51bGwgJiYgYS5lcXVhbHMoYikpKTsKLSAgfQotICAgCi0KLSAgcHVibGljIE5hbWVzcGFjZUluZm8gZ2V0TmFtZXNwYWNlSW5mb0ZvclVSSShTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gZ2V0TmFtZXNwYWNlSW5mb0ZvclVSSSh1cmksIGZhbHNlKTsKLSAgfQotCi0KLSAgcHVibGljIE5hbWVzcGFjZUluZm8gZ2V0TmFtZXNwYWNlSW5mb0ZvclVSSShTdHJpbmcgdXJpLCBib29sZWFuIHRlc3RJbXBsaWVkKQotICB7Ci0gICAgTmFtZXNwYWNlSW5mbyByZXN1bHQgPSBudWxsOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGhhc2h0YWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsgICAgICAgICAgICAgICAgICAgIAotICAgICAgTmFtZXNwYWNlSW5mbyBuc0luZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsgCi0gICAgICBpZiAoaXNNYXRjaGluZ1N0cmluZyhuc0luZm8udXJpLCB1cmkpKQotICAgICAgeyAgICAgICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IG5zSW5mbzsKLSAgICAgICAgaWYgKHRlc3RJbXBsaWVkICYmIG5zSW5mby5nZXRQcm9wZXJ0eSgiaXNJbXBsaWVkIikgIT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotCi0KLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb25IaW50Rm9yVVJJKFN0cmluZyB1cmksIFN0cmluZyBsb2NhdGlvbkhpbnQpCi0gIHsgICAgICAKLSAgIC8vIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBoYXNodGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgIE5hbWVzcGFjZUluZm8gbnNJbmZvID0gKE5hbWVzcGFjZUluZm8paS5uZXh0KCk7IAotICAgICAgaWYgKGlzTWF0Y2hpbmdTdHJpbmcobnNJbmZvLnVyaSwgdXJpKSkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBuc0luZm8ubG9jYXRpb25IaW50ID0gbG9jYXRpb25IaW50OwotICAgICAgfQotICAgIH0KLSAgfQotICAgIAotCi0gIHB1YmxpYyBOYW1lc3BhY2VJbmZvIGdldE5hbWVzcGFjZUluZm9Gb3JQcmVmaXgoU3RyaW5nIHByZWZpeCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJlZml4ID0gcHJlZml4ICE9IG51bGwgPyBwcmVmaXggOiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIHJldHVybiAoTmFtZXNwYWNlSW5mbyloYXNodGFibGUuZ2V0KHByZWZpeCk7Ci0gIH0gICAKLQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIG5hbWVzcGFjZVByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE5hbWVzcGFjZUluZm8gbnNJbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsgICAgICAKLSAgICBuc0luZm8ucHJlZml4ID0gbmFtZXNwYWNlUHJlZml4OwotICAgIG5zSW5mby51cmkgPSBuYW1lc3BhY2VVUkk7ICAgICAgCi0gICAKLSAgICBOYW1lc3BhY2VJbmZvIG1hdGNoaW5nTmFtZXNwYWNlSW5mbyA9IGdldE5hbWVzcGFjZUluZm9Gb3JVUkkobmFtZXNwYWNlVVJJKTsKLSAgICBpZiAobWF0Y2hpbmdOYW1lc3BhY2VJbmZvICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgbnNJbmZvLmxvY2F0aW9uSGludCA9IG1hdGNoaW5nTmFtZXNwYWNlSW5mby5sb2NhdGlvbkhpbnQ7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBpbnRlcm5hbEFkZE5hbWVzcGFjZUluZm8obmFtZXNwYWNlUHJlZml4LCBuc0luZm8pOwotCi0gICAgc3VwZXIudmlzaXRYTUxOYW1lc3BhY2VBdHRyaWJ1dGUoYXR0ciwgbmFtZXNwYWNlUHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICB9IAotICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgdmlzaXRYU0lTY2hlbWFMb2NhdGlvblZhbHVlUGFpcihTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYXRpb25IaW50KQotICB7Ci0gICAgc2V0TG9jYXRpb25IaW50Rm9yVVJJKHVyaSwgbG9jYXRpb25IaW50KTsKLSAgfSAgIAotCi0gIHB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZUluZm8oTmFtZXNwYWNlSW5mbyBpbmZvKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIGtleSAgPSAoaW5mby5wcmVmaXggIT0gbnVsbCkgPyBpbmZvLnByZWZpeCA6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgaW50ZXJuYWxBZGROYW1lc3BhY2VJbmZvKGtleSwgaW5mbyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbEFkZE5hbWVzcGFjZUluZm8oU3RyaW5nIGtleSwgTmFtZXNwYWNlSW5mbyBpbmZvKQotICB7Ci0gICAgaGFzaHRhYmxlLnB1dChrZXksIGluZm8pOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkTmFtZXNwYWNlSW5mb0xpc3QoTGlzdCBsaXN0LCBib29sZWFuIGlzSW1wbGllZCkKLSAgeyAgICAgICAKLSAgICBpZiAobGlzdCAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8paS5uZXh0KCk7Ci0gICAgICAgIE5hbWVzcGFjZUluZm8gY2xvbmUgPSBuZXcgTmFtZXNwYWNlSW5mbyhpbmZvKTsgICAgCi0gICAgICAgIGlmIChpc0ltcGxpZWQpCi0gICAgICAgIHsKLSAgICAgICAgICBjbG9uZS5zZXRQcm9wZXJ0eSgiaXNJbXBsaWVkIiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0KLSAgICAgICAgYWRkTmFtZXNwYWNlSW5mbyhjbG9uZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlSW5mb0xpc3QoTGlzdCBsaXN0KQotICB7ICAKLSAgICBhZGROYW1lc3BhY2VJbmZvTGlzdChsaXN0LCBmYWxzZSk7ICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0WFNJTm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbkF0dHJpYnV0ZShBdHRyIGF0dHIsIFN0cmluZyBsb2NhdGlvbkhpbnQpCi0gIHsKLSAgICBhZGROb05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uKGxvY2F0aW9uSGludCk7Ci0gIH0gCi0KLSAgcHVibGljIHZvaWQgYWRkTm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbihTdHJpbmcgbG9jYXRpb25IaW50KQotICB7Ci0gICAgTmFtZXNwYWNlSW5mbyBuc0luZm8gPSBuZXcgTmFtZXNwYWNlSW5mbygpOyAgICAgIAotICAgIG5zSW5mby5wcmVmaXggPSBudWxsOwotICAgIG5zSW5mby51cmkgPSAiIjsgICAgICAgLy8kTk9OLU5MUy0xJAotICAgIG5zSW5mby5sb2NhdGlvbkhpbnQgPSBsb2NhdGlvbkhpbnQ7ICAKLSAgICBpbnRlcm5hbEFkZE5hbWVzcGFjZUluZm8oIiIsIG5zSW5mbyk7IC8vJE5PTi1OTFMtMSQKLSAgfSAKLQotICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VJbmZvKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIFN0cmluZyBsb2NhdGlvbkhpbnQpCi0gIHsKLSAgICBOYW1lc3BhY2VJbmZvIG5zSW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7ICAgICAgCi0gICAgbnNJbmZvLnByZWZpeCA9IHByZWZpeDsKLSAgICBuc0luZm8udXJpID0gdXJpOyAgICAgIAotICAgIG5zSW5mby5sb2NhdGlvbkhpbnQgPSBsb2NhdGlvbkhpbnQ7ICAKLSAgICBpbnRlcm5hbEFkZE5hbWVzcGFjZUluZm8ocHJlZml4ICE9IG51bGwgPyBwcmVmaXggOiAiIiwgbnNJbmZvKTsgLy8kTk9OLU5MUy0xJAotICB9IAotCi0gIHB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7ICAgCi0gICAgdmlzaXRFbGVtZW50KGVsZW1lbnQpOyAgCi0gIH0gICAgICAKLSAgICAgICAgIAotICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50TGluZWFnZShFbGVtZW50IHRhcmdldEVsZW1lbnQpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBOYW1lc3BhY2VUYWJsZS5nZXRFbGVtZW50TGluZWFnZSh0YXJnZXRFbGVtZW50KTsgICAgICAgICAgICAgICAgIAotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudClpLm5leHQoKTsKLSAgICAgIGFkZEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgfSAgICAgICAgICAgIAotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldEVsZW1lbnRMaW5lYWdlKEVsZW1lbnQgZWxlbWVudCkKLSAgeyAgICAgICAgICAKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAgICAgICAgCi0gICAgZm9yIChOb2RlIG5vZGUgPSBlbGVtZW50OyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFkZCgwLCBub2RlKTsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgCi0KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0TmFtZXNwYWNlSW5mb0NvbGxlY3Rpb24oKQotICB7ICAgICAgICAgICAgICAKLSAgICByZXR1cm4gaGFzaHRhYmxlLnZhbHVlcygpOwotICB9IAotCi0gIHB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZUluZm9MaXN0KCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgbGlzdC5hZGRBbGwoaGFzaHRhYmxlLnZhbHVlcygpKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotfSAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGNlZTFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW1mMnhtbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkVNRjJET01BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkVNRjJET01BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5GZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIEVNRjJET01TU0VBZGFwdGVyIGV4dGVuZHMgRU1GMkRPTUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyIHsKLQkKLQlwcml2YXRlIENsYXNzIHJlc291cmNlQ2xhc3M7Ci0JcHVibGljIEVNRjJET01TU0VBZGFwdGVyKE5vZGUgbm9kZSwgRU1GMkRPTVJlbmRlcmVyIHJlbmRlcmVyLCBUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJc3VwZXIobm9kZSwgcmVuZGVyZXIsIHRyYW5zbGF0b3IpOwotCX0KLQotCXB1YmxpYyBFTUYyRE9NU1NFQWRhcHRlcihOb3RpZmllciBvYmplY3QsIE5vZGUgbm9kZSwgRU1GMkRPTVJlbmRlcmVyIHJlbmRlcmVyLCBUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJc3VwZXIob2JqZWN0LCBub2RlLCByZW5kZXJlciwgdHJhbnNsYXRvcik7Ci0JfQotCi0JcHVibGljIEVNRjJET01TU0VBZGFwdGVyKFRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSwgRG9jdW1lbnQgZG9jdW1lbnQsIEVNRjJET01SZW5kZXJlciByZW5kZXJlciwgVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXN1cGVyKHJlc291cmNlLCBkb2N1bWVudCwgcmVuZGVyZXIsIHRyYW5zbGF0b3IpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgY2FsY0luZGVudFN0cmluZyhOb2RlIG5vZGUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlLmdldFBhcmVudE5vZGUoKSwgIk5vZGUgbXVzdCBiZSBjb25uZWN0ZWQgaW50byB0aGUgdHJlZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQlTdHJpbmcgaW5kZW50U3RyaW5nID0gZ2V0TmV3bGluZVN0cmluZyhub2RlKTsKLQotCQkvLyBGaW5kIGluZGVudGF0aW9uIHN0cmluZyBmb3IgdGhpcyBub2RlIGJhc2VkIG9uIGl0cyBzaWJsaW5nIG9yCi0JCS8vIHBhcmVudAotCQlOb2RlIHByZXZpb3VzU2libGluZyA9IERPTVV0aWxpdGllcy5nZXRQcmV2aW91c05vZGVTaWJsaW5nKG5vZGUpOwotCQlpZiAocHJldmlvdXNTaWJsaW5nICE9IG51bGwpIHsKLQkJCWluZGVudFN0cmluZyA9IHByaW1HZXRJbmRlbnRTdHJpbmcocHJldmlvdXNTaWJsaW5nKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBwYXJlbnRJbmRlbnRTdHJpbmcgPSBwcmltR2V0SW5kZW50U3RyaW5nKHBhcmVudCk7Ci0JCQlpbmRlbnRTdHJpbmcgPSBwYXJlbnRJbmRlbnRTdHJpbmcgKyBET01VdGlsaXRpZXMuSU5ERU5UX1NUUklORzsKLQkJfQotCQlyZXR1cm4gaW5kZW50U3RyaW5nOwotCX0KLQotCS8qCi0JICogUHJpbnRzIG91dCBhIERPTSBub3RpZmljYXRpb24gZm9yIGRlYnVnZ2luZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWJ1Z0RPTU5vdGlmeShJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmIChmRGVidWcpIHsKLQkJCVN0cmluZyBub3RpZlR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJc3dpdGNoIChldmVudFR5cGUpIHsKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuQUREIDoKLQkJCQkJbm90aWZUeXBlID0gIkFERCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLlJFTU9WRSA6Ci0JCQkJCW5vdGlmVHlwZSA9ICJSRU1PVkUiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5DSEFOR0UgOgotCQkJCQlub3RpZlR5cGUgPSAiQ0hBTkdFIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEIDoKLQkJCQkJbm90aWZUeXBlID0gIkNPTlRFTlRfQ0hBTkdFRCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEIDoKLQkJCQkJbm90aWZUeXBlID0gIlNUUlVDVFVSRV9DSEFOR0UiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgIkRPTSBDaGFuZ2U6ICIgKyBub3RpZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiXHRub3RpZmllciAgICAgIDogIiArIG5vdGlmaWVyKTsgLy8kTk9OLU5MUy0xJAotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgIlx0Y2hhbmdlZEZlYXR1cmU6ICIgKyBjaGFuZ2VkRmVhdHVyZSk7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJcdG9sZFZhbHVlICAgICAgOiAiICsgb2xkVmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiXHRuZXdWYWx1ZSAgICAgIDogIiArIG5ld1ZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzYWJsZVVuZG9NYW5hZ2VtZW50SWZOZWNlc3NhcnkoKSB7Ci0JCUlET01Nb2RlbCBtb2RlbCA9IGdldFhNTE1vZGVsKCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldFVuZG9NYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCW1vZGVsLmRpc2FibGVVbmRvTWFuYWdlbWVudCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVVuZG9NYW5hZ2VtZW50KCkgewotCQlJRE9NTW9kZWwgbW9kZWwgPSBnZXRYTUxNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRVbmRvTWFuYWdlcigpICE9IG51bGwpCi0JCQltb2RlbC5lbmFibGVVbmRvTWFuYWdlbWVudCgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmV3bGluZVN0cmluZyhOb2RlIG5vZGUpIHsKLQkJLyoKLQkJICogV2Ugc2hvdWxkIGFsd2F5cyBoYXZlIElET01Ob2RlLCBhbmQgSVN0cnVjdHVyZWREb2N1bWVudCwgYW5kCi0JCSAqIGNvbnNxdWVudGx5IGEgdmFsaWQgInByZWZlcnJlZCIgbGluZSBkZWxpbWl0ZXIsIGJ1dCBqdXN0IHRvIGJlCi0JCSAqIHNhZmUsIHdlJ2xsIGFzc2lnbiBzb21ldGhpbmcgYnkgZGVmYXVsdC4KLQkJICovCi0JCWlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlET01Ob2RlIHhtbE5vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0geG1sTm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGRvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRE9NVXRpbGl0aWVzLk5FV0xJTkVfU1RSSU5HOwotCX0KLQotCXByb3RlY3RlZCBJRE9NTW9kZWwgZ2V0WE1MTW9kZWwoKSB7Ci0JCWlmIChnZXROb2RlKCkgIT0gbnVsbCkKLQkJCXJldHVybiAoKElET01Ob2RlKSBnZXROb2RlKCkpLmdldE1vZGVsKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJRE9NTm9kZSBnZXRYTUxOb2RlKCkgewotCQlyZXR1cm4gKElET01Ob2RlKSBnZXROb2RlKCk7Ci0JfQotCi0JLyoKLQkgKiBEbyBub3RoaW5nIGZvciBTU0UsIHdlIHdpbGwgdG9sZXJhdGUgYW55dGhpbmcgdGhleSBhZGQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uKEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24gZXgpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQotCS8qCi0JICogRG8gbm90aGluZyBmb3IgU1NFLCB3ZSB3aWxsIHRvbGVyYXRlIGFueXRoaW5nIHRoZXkgYWRkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlSW52YWxpZE11bHRpTm9kZXMoU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCS8vIERvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbmRlbnQoTm9kZSBub2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCAiTm9kZSBtdXN0IGJlIGNvbm5lY3RlZCBpbnRvIHRoZSB0cmVlIik7IC8vJE5PTi1OTFMtMSQKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQotCQlTdHJpbmcgaW5kZW50U3RyaW5nID0gY2FsY0luZGVudFN0cmluZyhub2RlKTsKLQotCQkvLyBJbmRlbnQgYmVmb3JlIHRoZSBzdGFydCB0YWcKLQkJaW5kZW50U3RhcnRUYWcoaW5kZW50U3RyaW5nLCBub2RlLCBtYXApOwotCi0JCS8vIEluZGVudCBiZWZvcmUgdGhlIGVuZCB0YWcKLQkJaW5kZW50RW5kVGFnKGluZGVudFN0cmluZywgbm9kZSwgbWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBJbmRlbnQgYmVmb3JlIHRoZSBlbmQgdGFnIG9mIHRoZSA8bm9kZT5wYXNzZWQgaW4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5kZW50RW5kVGFnKFN0cmluZyBpbmRlbnRTdHJpbmcsIE5vZGUgbm9kZSwgVHJhbnNsYXRvciBtYXApIHsKLQkJaWYgKCFtYXAuc2hvdWxkSW5kZW50RW5kVGFnKG5vZGUpKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgZG9tUGF0aCA9IG1hcC5nZXRET01QYXRoKCk7Ci0KLQkJaWYgKCghbWFwLmlzTWFuYWdlZEJ5UGFyZW50KCkgJiYgIW1hcC5pc0RPTVRleHRWYWx1ZSgpKSB8fCAobWFwLmlzTWFuYWdlZEJ5UGFyZW50KCkgJiYgZG9tUGF0aC5sZW5ndGgoKSAhPSAwKSAmJiBub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKGRvbVBhdGgpKSB7Ci0JCQlUZXh0IG5ld1dTID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoZ2V0TmV3bGluZVN0cmluZyhub2RlKSArIGluZGVudFN0cmluZyk7IC8vJE5PTi1OTFMtMSQKLQkJCURPTVV0aWxpdGllcy5pbnNlcnRCZWZvcmVOb2RlKG5vZGUsIG5ld1dTLCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluZGVudCBiZWZvcmUgdGhlIHN0YXJ0IHRhZyBvZiB0aGUgPG5vZGU+cGFzc2VkIGluLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluZGVudFN0YXJ0VGFnKFN0cmluZyBpbmRlbnRTdHJpbmcsIE5vZGUgbm9kZSwgVHJhbnNsYXRvciBtYXApIHsKLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJVGV4dCBuZXdXUyA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKGdldE5ld2xpbmVTdHJpbmcobm9kZSkgKyBpbmRlbnRTdHJpbmcpOyAvLyROT04tTkxTLTEkCi0JCURPTVV0aWxpdGllcy5pbnNlcnRBZnRlck5vZGUocGFyZW50LCBuZXdXUywgRE9NVXRpbGl0aWVzLmdldFByZXZpb3VzTm9kZVNpYmxpbmcobm9kZSkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRW1wdHlUYWcoRWxlbWVudCBwYXJlbnQpIHsKLQkJcmV0dXJuICgoSURPTUVsZW1lbnQpIHBhcmVudCkuaXNFbXB0eVRhZygpOwotCX0KLQotCS8qCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIERPTSBub2RlIGNoYW5nZXMuIEl0IGF0dGVtcHRzIHRvIHVwZGF0ZQotCSAqIE1PRiBvYmplY3QgYmFzZWQgb24gdGhlIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0KLQkJaWYgKCFpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSkKLQkJCXJldHVybjsKLQotCQlkZWJ1Z0RPTU5vdGlmeShub3RpZmllciwgZXZlbnRUeXBlLCBjaGFuZ2VkRmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQotCQlpZiAobm90aWZpZXIgIT0gZ2V0Tm9kZSgpICYmIGV2ZW50VHlwZSAhPSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkgewotCQkJLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB0aGUgbm90aWZpY2F0aW9uIHdhcyBzZW50IGZyb20gYQotCQkJLy8gc3ViIG5vZGUuIFVzZSB0aGUgbm90aWZpZXJzIG5hbWUgdG8gZGV0ZXJtaW5lIHdoaWNoCi0JCQkvLyBNT0YgZmVhdHVyZSB0byB1cGRhdGUuIE5vdGUgdGhhdCBpcyBpcyBhc3N1bWVkIHRoYXQgaWYKLQkJCS8vIHRoZSBldmVudFR5cGUgaXMgQ0hBTkdFIHRoZW4gaXQgYXR0cmlidXRlIG9uIGEgcGF0aCBub2RlCi0JCQkvLyBjaGFuZ2luZy4gVGhpcyB3YXMgcHV0IGluIGZvciB0aGUgRUdMIGdyb3VwLgotCQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCWlmIChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCB8fCBldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQgfHwgZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ0hBTkdFKSB7Ci0JCQkJCUVsZW1lbnQgbm90aWZ5aW5nTm9kZSA9IChFbGVtZW50KSBub3RpZmllcjsKLQkJCQkJVHJhbnNsYXRvciBtYXAgPSBmaW5kVHJhbnNsYXRvcihub3RpZnlpbmdOb2RlLmdldE5vZGVOYW1lKCksIGZhbHNlKTsKLQkJCQkJaWYgKG1hcCAhPSBudWxsKQotCQkJCQkJdXBkYXRlTU9GRmVhdHVyZShtYXAsIGdldE5vZGUoKSwgZ2V0RU9iamVjdCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBVcGRhdGUgZXZlcnl0aGluZyBvbiBTVFJVQ1RVUkVfQ0hBTkdFIG9yIENPTlRFTlRfQ0hBTkdFLgotCQkJLy8gT3RoZXIgZXZlbnQgdHlwZXMgb2NjdXIgdG9vIG9mdGVuLgotCQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEIHx8IGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNPTlRFTlRfQ0hBTkdFRCkgewotCQkJCXVwZGF0ZU1PRigpOwotCQkJfQotCQkJLy8gVXBkYXRlIGp1c3QgdGhlIGF0dHJpYnV0ZSB0aGF0IGNoYW5nZWQuCi0JCQllbHNlIGlmIChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5DSEFOR0UpIHsKLQkJCQlUcmFuc2xhdG9yIG1hcCA9IGZpbmRUcmFuc2xhdG9yKGNoYW5nZWRGZWF0dXJlLnRvU3RyaW5nKCksIHRydWUpOwotCQkJCWlmIChtYXAgIT0gbnVsbCkKLQkJCQkJdXBkYXRlTU9GRmVhdHVyZShtYXAsIGdldE5vZGUoKSwgZ2V0RU9iamVjdCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvc3RVcGRhdGVET01GZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWVuYWJsZVVuZG9NYW5hZ2VtZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlVXBkYXRlRE9NRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlzdXBlci5wcmVVcGRhdGVET01GZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJZGlzYWJsZVVuZG9NYW5hZ2VtZW50SWZOZWNlc3NhcnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltQWRkRE9NQWRhcHRlcihOb2RlIGFOb2RlLCBFTUYyRE9NQWRhcHRlciBhbkFkYXB0ZXIpIHsKLQkJKChJRE9NTm9kZSkgYU5vZGUpLmFkZEFkYXB0ZXIoKEVNRjJET01TU0VBZGFwdGVyKSBhbkFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhZGFwdGVyIGZvciBhIGNoaWxkIERPTSBub2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUgdG8gY3JlYXRlIHRoZSBhZGFwdGVyIGZvci4KLQkgKi8KLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgcHJpbUNyZWF0ZUFkYXB0ZXIoRU9iamVjdCBtb2ZPYmplY3QsIFRyYW5zbGF0b3IgY2hpbGRNYXApIHsKLQkJRWxlbWVudCBuZXdOb2RlID0gY3JlYXRlTmV3Tm9kZShtb2ZPYmplY3QsIGNoaWxkTWFwKTsKLQkJcmV0dXJuIG5ldyBFTUYyRE9NU1NFQWRhcHRlcihtb2ZPYmplY3QsIG5ld05vZGUsIGZSZW5kZXJlciwgY2hpbGRNYXApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhZGFwdGVyIGZvciBhIGNoaWxkIERPTSBub2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUgdG8gY3JlYXRlIHRoZSBhZGFwdGVyIGZvci4KLQkgKi8KLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgcHJpbUNyZWF0ZUFkYXB0ZXIoTm9kZSBub2RlLCBUcmFuc2xhdG9yIGNoaWxkTWFwKSB7Ci0JCXJldHVybiBuZXcgRU1GMkRPTVNTRUFkYXB0ZXIobm9kZSwgZlJlbmRlcmVyLCBjaGlsZE1hcCk7Ci0JfQotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vZGUgbm9kZSwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCi0JCS8vQXNzZXJ0LmlzTm90TnVsbChjaGlsZE1hcC5nZXRDaGlsZEFkYXB0ZXJDbGFzcygpKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gcHJpbUdldEV4aXN0aW5nQWRhcHRlcihub2RlLGNoaWxkTWFwKTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlpZiAoYWRhcHRlci5pc01PRlByb3h5KCkgfHwgYWRhcHRlci5nZXRUYXJnZXQoKSA9PSBudWxsKSB7Ci0JCQkJcmVtb3ZlRE9NQWRhcHRlcihub2RlLCBhZGFwdGVyKTsKLQkJCQlpZiAoYWRhcHRlci5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXIuZ2V0VGFyZ2V0KCkuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotCQkJCX0KLQkJCQlhZGFwdGVyID0gbnVsbDsKLQkJCX0KLQkJfQotCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQlhZGFwdGVyID0gcHJpbUNyZWF0ZUFkYXB0ZXIobm9kZSwgY2hpbGRNYXApOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRET01BZGFwdGVyKE5vZGUgY2hpbGROb2RlKSB7Ci0KLQkJLy8gT25seSBhZGQgdGhlIGFkYXB0ZXIgaWYgdGhpcyBpcyBhbiBjaGlsZCBub2RlIHRoYXQgd2lsbCBub3QgYmUKLQkJLy8gYWRhcHRlZC4gRm9yIGluc3RhbmNlIGEgc3VidHJlZSB0aGF0IG1hcHMgdG8gYSBNT0YgYXR0cmlidXRlCi0JCS8vIHNldHRpbmcuCi0JCWlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJRU1GMkRPTUFkYXB0ZXIgYXR0ckFkYXB0ZXIgPSBwcmltR2V0RXhpc3RpbmdBZGFwdGVyKGNoaWxkTm9kZSk7Ci0KLQkJCWlmIChhdHRyQWRhcHRlciA9PSBudWxsIHx8IGF0dHJBZGFwdGVyLmdldE5vZGUoKSAhPSBnZXROb2RlKCkpIHsKLQkJCQkvLyBJZiB0aGUgbm9kZSBpcyBhZGFwdGVkLCBidXQgbm90IGJ5IHRoaXMgYWRhcHRlciB0aGVuIHJlbW92ZQotCQkJCS8vIGl0LiBUaGlzIGhhcHBlbnMgdG8gbm9uLW9iamVjdCBjaGlsZHJlbiB3aGVuIHRoZSBwYXJlbnQgdGFnCi0JCQkJLy8gbmFtZSBpcyBjaGFuZ2VkLgotCQkJCXJlbW92ZURPTUFkYXB0ZXIoY2hpbGROb2RlLCBhdHRyQWRhcHRlcik7Ci0KLQkJCQlpZiAoZkRlYnVnKSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0Q0hJTEQ6IEFkZGluZyBET00gYWRhcHRlcjogIiArIHRoaXMpOyAvLyROT04tTkxTLTEkCi0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0XHR0bzogIiArIGNoaWxkTm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcHJpbUFkZERPTUFkYXB0ZXIoY2hpbGROb2RlLCB0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgcHJpbUdldEV4aXN0aW5nQWRhcHRlcihOb2RlIGFOb2RlLCBUcmFuc2xhdG9yIGNoaWxkTWFwKSB7Ci0JCUlOb2RlTm90aWZpZXIgc3NlTm9kZSA9IChJTm9kZU5vdGlmaWVyKSBhTm9kZTsKLQkJQ29sbGVjdGlvbiBhZGFwdGVycyA9IHNzZU5vZGUuZ2V0QWRhcHRlcnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFkYXB0ZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKElOb2RlQWRhcHRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJLy8gRmlyc3QgQ2hlY2sgaWYgaXQncyBhbiBFTUYyRE9NQWRhcHRlcgotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmlzQWRhcHRlckZvclR5cGUoRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUykpIHsKLQkJCQkvLyBDYXN0IHRvIEVNRjJET01BZGFwdGVyCi0JCQkJRU1GMkRPTVNTRUFkYXB0ZXIgZTJEQWRhcHRlciA9IChFTUYyRE9NU1NFQWRhcHRlcikgYWRhcHRlcjsKLQkJCQlPYmplY3QgYWRhcHRlclRhcmdldCA9IGUyREFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0JCQkJLy9UcmFuc2xhdG9yIGFkYXB0ZXJUcmFuc2xhdG9yID0gZTJEQWRhcHRlci5mVHJhbnNsYXRvcjsKLQkJCQkKLQkJCQkvL0hhbmRsZSB0aGUgY2FzZXMgd2hlcmUgZWl0aGVyIGFkYXB0ZXIncyB0YXJnZXQgaXMgbnVsbCAKLQkJCQlpZiAoKGdldFRhcmdldCgpID09IG51bGwpIHx8IChhZGFwdGVyVGFyZ2V0ID09IG51bGwpKQotCQkJCQlpZiAocmVzb3VyY2VDbGFzcyAhPSBudWxsICYmIHJlc291cmNlQ2xhc3MuZXF1YWxzKGUyREFkYXB0ZXIuZ2V0UmVzb3VyY2VDbGFzcygpKSkKLQkJCQkJCXJldHVybiBlMkRBZGFwdGVyOwotCQkJCQllbHNlCi0JCQkJCQljb250aW51ZTsKLQkJCQkKLQkJCQkKLQkJCQkvLyBDaGVjayBpZiB0YXJnZXQgaXMgYW4gRU1GIHJlc291cmNlCi0JCQkJaWYgKGdldFRhcmdldCgpIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCQkJLyoKLQkJCQkJICogTm93IGNoZWNrIGlmIGl0J3MgdGhlIHJpZ2h0IG9uZSAoTXVsdGlwbGUgcmVzb3VyY2VzCi0JCQkJCSAqIGNvdWxkIGJlIGF0dGFjaGVkKQotCQkJCQkgKi8KLQkJCQkJaWYgKGFkYXB0ZXJUYXJnZXQgIT0gbnVsbCAmJiBhZGFwdGVyVGFyZ2V0ID09IGdldFRhcmdldCgpKSB7Ci0JCQkJCQlyZXR1cm4gZTJEQWRhcHRlcjsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gQ2hlY2sgaWYgdGFyZ2V0cyBhcmUgRU9iamVjdHMgd2l0aCB0aGUgc2FtZSByZXNvdXJjZXMKLQkJCQkJRU9iamVjdCBteVRhcmdldCA9IChFT2JqZWN0KSBnZXRUYXJnZXQoKTsKLQkJCQkJLyoKLQkJCQkJICogTm93IGNoZWNrIGlmIGl0J3MgdGhlIHJpZ2h0IG9uZSAoTXVsdGlwbGUgcmVzb3VyY2VzIGNvdWxkCi0JCQkJCSAqIGJlIGF0dGFjaGVkKQotCQkJCQkgKi8KLQkJCQkJaWYgKGFkYXB0ZXJUYXJnZXQgIT0gbnVsbCAmJiAoKEVPYmplY3QpYWRhcHRlclRhcmdldCkuZVJlc291cmNlKCkgPT0gbXlUYXJnZXQuZVJlc291cmNlKCkpIHsKLQkJCQkJCXJldHVybiBlMkRBZGFwdGVyOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmIChhZGFwdGVyVGFyZ2V0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQlpZiAoKChFT2JqZWN0KSBlMkRBZGFwdGVyLmdldFRhcmdldCgpKS5lUmVzb3VyY2UoKSA9PSBudWxsICYmIGUyREFkYXB0ZXIuZlRyYW5zbGF0b3IgPT0gY2hpbGRNYXApIHsKLQkJCQkJCXJldHVybiBlMkRBZGFwdGVyOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgcHJpbUdldEV4aXN0aW5nQWRhcHRlcihOb2RlIGFOb2RlKSB7Ci0JCUlOb2RlTm90aWZpZXIgc3NlTm9kZSA9IChJTm9kZU5vdGlmaWVyKSBhTm9kZTsKLQkJQ29sbGVjdGlvbiBhZGFwdGVycyA9IHNzZU5vZGUuZ2V0QWRhcHRlcnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFkYXB0ZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKElOb2RlQWRhcHRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJLy8gRmlyc3QgQ2hlY2sgaWYgaXQncyBhbiBFTUYyRE9NQWRhcHRlcgotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmlzQWRhcHRlckZvclR5cGUoRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUykpIHsKLQkJCQkvLyBDYXN0IHRvIEVNRjJET01BZGFwdGVyCi0JCQkJRU1GMkRPTVNTRUFkYXB0ZXIgZTJEQWRhcHRlciA9IChFTUYyRE9NU1NFQWRhcHRlcikgYWRhcHRlcjsKLQkJCQlPYmplY3QgYWRhcHRlclRhcmdldCA9IGUyREFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0JCQkJCi0JCQkJLy9IYW5kbGUgdGhlIGNhc2VzIHdoZXJlIGVpdGhlciBhZGFwdGVyJ3MgdGFyZ2V0IGlzIG51bGwgCi0JCQkJaWYgKChnZXRUYXJnZXQoKSA9PSBudWxsKSB8fCAoYWRhcHRlclRhcmdldCA9PSBudWxsKSkKLQkJCQkJaWYgKHJlc291cmNlQ2xhc3MgIT0gbnVsbCAmJiByZXNvdXJjZUNsYXNzLmVxdWFscyhlMkRBZGFwdGVyLmdldFJlc291cmNlQ2xhc3MoKSkpCi0JCQkJCQlyZXR1cm4gZTJEQWRhcHRlcjsKLQkJCQkJZWxzZQotCQkJCQkJY29udGludWU7Ci0JCQkJCi0JCQkJCi0JCQkJLy8gQ2hlY2sgaWYgdGFyZ2V0IGlzIGFuIEVNRiByZXNvdXJjZQotCQkJCWlmIChnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIE5vdyBjaGVjayBpZiBpdCdzIHRoZSByaWdodCBvbmUgKE11bHRpcGxlIHJlc291cmNlcwotCQkJCQkgKiBjb3VsZCBiZSBhdHRhY2hlZCkKLQkJCQkJICovCi0JCQkJCWlmIChhZGFwdGVyVGFyZ2V0ICE9IG51bGwgJiYgYWRhcHRlclRhcmdldCA9PSBnZXRUYXJnZXQoKSkgewotCQkJCQkJcmV0dXJuIGUyREFkYXB0ZXI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIENoZWNrIGlmIHRhcmdldHMgYXJlIEVPYmplY3RzIHdpdGggdGhlIHNhbWUgcmVzb3VyY2VzCi0JCQkJCUVPYmplY3QgbXlUYXJnZXQgPSAoRU9iamVjdCkgZ2V0VGFyZ2V0KCk7Ci0JCQkJCS8qCi0JCQkJCSAqIE5vdyBjaGVjayBpZiBpdCdzIHRoZSByaWdodCBvbmUgKE11bHRpcGxlIHJlc291cmNlcyBjb3VsZAotCQkJCQkgKiBiZSBhdHRhY2hlZCkKLQkJCQkJICovCi0JCQkJCWlmIChhZGFwdGVyVGFyZ2V0ICE9IG51bGwgJiYgKChFT2JqZWN0KWFkYXB0ZXJUYXJnZXQpLmVSZXNvdXJjZSgpID09IG15VGFyZ2V0LmVSZXNvdXJjZSgpKSB7Ci0JCQkJCQlyZXR1cm4gZTJEQWRhcHRlcjsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoYWRhcHRlclRhcmdldCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJaWYgKCgoRU9iamVjdCkgZTJEQWRhcHRlci5nZXRUYXJnZXQoKSkuZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGUyREFkYXB0ZXI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBwcmltR2V0SW5kZW50U3RyaW5nKE5vZGUgbm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IGZsYXRNb2RlbCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpbnQgbm9kZVN0YXJ0T2ZmID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQlpbnQgc3RhcnRPZmYgPSBNYXRoLm1heCgwLCBub2RlU3RhcnRPZmYgLSAxMDApOwotCQlpbnQgZW5kT2ZmID0gbm9kZVN0YXJ0T2ZmOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGZsYXRNb2RlbC5nZXQoc3RhcnRPZmYsIGVuZE9mZiAtIHN0YXJ0T2ZmKTsKLQotCQkJaW50IGlueCA9IHRleHQubGVuZ3RoKCkgLSAxOwotCQkJaWYgKGlueCA+PSAwKSB7Ci0JCQkJZm9yICg7IGlueCA+PSAwOyBpbngtLSkgewotCQkJCQljaGFyIGNoID0gdGV4dC5jaGFyQXQoaW54KTsKLQkJCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2gpICYmIGNoICE9ICdcbicgJiYgY2ggIT0gJ1xyJykgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJaW54Kys7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCXJldHVybiB0ZXh0LnN1YnN0cmluZyhpbngpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRE9NQWRhcHRlcihOb2RlIGFOb2RlLCBFTUYyRE9NQWRhcHRlciBhbkFkYXB0ZXIpIHsKLQkJKChJRE9NTm9kZSkgYU5vZGUpLnJlbW92ZUFkYXB0ZXIoKElOb2RlQWRhcHRlcikgYW5BZGFwdGVyKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIHJlb3JkZXJET01DaGlsZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgY2hpbGROb2RlLCBOb2RlIGluc2VydEJlZm9yZU5vZGUsIFRyYW5zbGF0b3IgbWFwKSB7Ci0JCXN1cGVyLnJlb3JkZXJET01DaGlsZChwYXJlbnROb2RlLCBjaGlsZE5vZGUsIGluc2VydEJlZm9yZU5vZGUsIG1hcCk7Ci0JCS8vIFNpbmNlIHJlb3JkZXJpbmcgZGVsZXRlcyBhbGwgdGhlIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBub2RlLCB3ZQotCQkvLyBtdXN0IGluZGVudCAuCi0JCWlmIChpbnNlcnRCZWZvcmVOb2RlICE9IG51bGwgJiYgaW5zZXJ0QmVmb3JlTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJaW5kZW50U3RhcnRUYWcoY2FsY0luZGVudFN0cmluZyhpbnNlcnRCZWZvcmVOb2RlKSwgaW5zZXJ0QmVmb3JlTm9kZSwgbWFwKTsKLQkJZWxzZQotCQkJaW5kZW50U3RhcnRUYWcoY2FsY0luZGVudFN0cmluZyhjaGlsZE5vZGUpLCBjaGlsZE5vZGUsIG1hcCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW1wdHlUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCSgoSURPTUVsZW1lbnQpIGVsZW1lbnQpLnNldEVtcHR5VGFnKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZURPTSgpIHsKLQkJaWYgKCFpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWRpc2FibGVVbmRvTWFuYWdlbWVudElmTmVjZXNzYXJ5KCk7Ci0JCQlwcmltVXBkYXRlRE9NKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQllbmFibGVVbmRvTWFuYWdlbWVudCgpOwotCQl9Ci0JfQotCi0JcHVibGljIENsYXNzIGdldFJlc291cmNlQ2xhc3MoKSB7Ci0JCXJldHVybiByZXNvdXJjZUNsYXNzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDaGlsZFRyYW5zbGF0b3JzKCkgewotCQlpZiAoZlJlbmRlcmVyICE9IG51bGwgJiYgZlJlbmRlcmVyLmdldFJlc291cmNlKCkgIT0gbnVsbCkKLQkJCXJlc291cmNlQ2xhc3MgPSBmUmVuZGVyZXIuZ2V0UmVzb3VyY2UoKS5nZXRDbGFzcygpOwotCQlzdXBlci5pbml0Q2hpbGRUcmFuc2xhdG9ycygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWVtZk1vZGVsU3luY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VtZjJ4bWwvRU1GMkRPTVNTRVJlbmRlcmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAyODlkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbWYyeG1sOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTVJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLlJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuTW9kZWxMaWZlY3ljbGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbFN0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIEVNRjJET01TU0VSZW5kZXJlciBleHRlbmRzIEVNRjJET01SZW5kZXJlciBpbXBsZW1lbnRzIElNb2RlbFN0YXRlTGlzdGVuZXIsIElNb2RlbExpZmVjeWNsZUxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBPYmplY3QgYWJvdXRUb0NoYW5nZU5vZGUgPSBudWxsOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNCYXRjaENoYW5nZXMgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1NhdmluZyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcjsKLQkKLQlwcml2YXRlIENsYXNzIHJlc291cmNlQ2xhc3M7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHJldmVydGluZyA9IGZhbHNlOwotCi0JLyoqIFRoZSBYTUwgRE9NIG1vZGVsICovCi0JcHJvdGVjdGVkIElET01Nb2RlbCB4bWxNb2RlbDsKLQotCS8qKiBVc2VkIGludGVybmFsbHk7IHRoZSB1bmlxdWUgaWQgZm9yIHRoZSB4bWwgbW9kZWwgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHhtbE1vZGVsSWQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB4bWxNb2RlbFJldmVydGVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgRU1GMkRPTVNTRVJlbmRlcmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFjY2Vzc0ZvclJlYWQoKSB7Ci0JCWlmICghcmVzb3VyY2UuaXNOZXcoKSkgewotCQkJU3RyaW5nIGlkID0gZ2V0TW9kZWxNYW5hZ2VySWQoKTsKLQkJCWdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGlkKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFjY2Vzc0ZvcldyaXRlKCkgewotCQltb2RlbEFjY2Vzc0ZvcldyaXRlKCk7Ci0JfQotCi0JLyoqCi0JICogc2VlIGJhdGNoTW9kZWxFbmQKLQkgKiAKLQkgKi8KLQotCXB1YmxpYyB2b2lkIGJhdGNoTW9kZUVuZCgpIHsKLQkJZ2V0WE1MTW9kZWwoKS5jaGFuZ2VkTW9kZWwoKTsKLQkJc2V0Um9vdE5vZGVBZGFwdGVyTm90aWZpY2F0aW9uRW5hYmxlZCh0cnVlKTsKLQkJaXNCYXRjaENoYW5nZXMgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBiYXRjaE1vZGVTdGFydCBhbmQgYmF0Y2hNb2RlRW5kIGlzIGEgcGFpciB0aGF0IGNvbnRyb2xzIG5vdGlmaWNhdGlvbnMsCi0JICogYW5kIHRyZWFkIGFjY2Vzcy4gVGhleSBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCBpbiBhIHRyeS9maW5hbGx5IGJsb2NrLgotCSAqIAotCSAqIHNldEJhdGNoTW9kZWwgYmVnaW5zIHRoZSBwcm9jZXNzaW5nIHdoZXJlIG5vdGlmaWNhdGlvbnMgYXJlIG5vdCBzZW50Ci0JICogb3V0IG9uIGVhY2ggY2hhbmdlLCBidXQgc2F2ZWQgdXAgdW50aWwgdGhlIGVuZEJhdGNoTW9kZSBjYWxsZWQuCi0JICogCi0JICogVGhpcyBwYWlyIG9mIGNhbGxzIGNhbiBhbHNvLCBpbmRpcmVjdGx5LCAibG9jayIgdGhlIERPTSBNb2RlbCB0byBhY2Nlc3MKLQkgKiBmcm9tIG9ubHkgb25lIHRocmVhZCwgc28gaXQgc2hvdWxkIG5vdCBiZSBsb2NrZWQgZm9yIGxvbmcgcGVyaW9kcyBvZgotCSAqIHRpbWUuIFRoYXQncyBhbHNvIHdoeSBpdCBpcyBpbXBvcnRhbnQgdG8gaGF2ZSB0aGUgZW5kQmF0Y2hNb2RlIGluIGEKLQkgKiBmaW5hbGx5IGJsb2NrIHRvIGJlIHN1cmUgaXQgaXMgYWx3YXlzIGNhbGxlZCwgb3IgdGhlIERPTSB3aWxsIGJlIGxlZnQKLQkgKiBpbiBhIGxvY2tlZCwgdW51c2FibGUsIHN0YXRlIGFuZCBvbmx5IHNob3J0bHkgYXdheSBmcm9tIHNldmVyZXJlCi0JICogcHJvZ3JhbSBlcnJvci4KLQkgKiAKLQkgKiA8cHJlPjxjb2RlPgotCSAqIEV4YW1wbGUKLQkgKiA8L2NvZGU+Ci0JICogIAotCSAqICB0cnkgeyAKLQkgKiAgCQliYXRjaE1vZGVsU3RhcnQoKTsKLQkgKiAgCQkuLi5kbyBhIHNvbWUgd29yayAuLi4KLQkgKiAgCQl9Ci0JICogIAlmaW5hbGx5IHsKLQkgKiAgCQllbmRCYXRjaE1vZGUoKTsKLQkgKiAgCQl9Ci0JICogIAotCSAqICAKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBiYXRjaE1vZGVTdGFydCgpIHsKLQkJaXNCYXRjaENoYW5nZXMgPSB0cnVlOwotCQlnZXRYTUxNb2RlbCgpLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQlzZXRSb290Tm9kZUFkYXB0ZXJOb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FjaGVTeW5jaHJvbml6YXRpb25TdGFtcCgpIHsKLQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzb3VyY2UpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCQl4bWxNb2RlbC5yZXNldFN5bmNocm9uaXphdGlvblN0YW1wKGZpbGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IERvY3VtZW50IGdpdmVuCi0JICogCi0JICogQGFSZXNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEb2N1bWVudCgpIHsKLQkJVHJhbnNsYXRvclJlc291cmNlIHJlcyA9IGdldFJlc291cmNlKCk7Ci0JCXJlcy5zZXREZWZhdWx0cygpOwotCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXNvdXJjZSk7Ci0JCUlucHV0U3RyZWFtIGlzID0gRE9NVXRpbGl0aWVzLmNyZWF0ZUhlYWRlcklucHV0U3RyZWFtKHJlcy5nZXREb2N0eXBlKCksIHJlcy5nZXRQdWJsaWNJZCgpLCByZXMuZ2V0U3lzdGVtSWQoKSk7Ci0JCWlmIChpcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlMaXN0IGZvbGRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBmaWxlLmdldFBhcmVudCgpOwotCQkJCXdoaWxlIChudWxsICE9IGNvbnRhaW5lciAmJiAhY29udGFpbmVyLmV4aXN0cygpICYmIGNvbnRhaW5lciBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJZm9sZGVycy5hZGQoY29udGFpbmVyKTsKLQkJCQkJY29udGFpbmVyID0gY29udGFpbmVyLmdldFBhcmVudCgpOwotCQkJCX0KLQkJCQlJRm9sZGVyIGZvbGRlciA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb2xkZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCWZvbGRlciA9IChJRm9sZGVyKSBmb2xkZXJzLmdldChpKTsKLQkJCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQl9Ci0JCQkJZmlsZS5jcmVhdGUoaXMsIHRydWUsIG51bGwpOwotCQkJCWZpbGUuc2V0TG9jYWwodHJ1ZSwgMSwgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKG51bGwgIT0gaXMpIHsKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpbml0aWFsaXplWE1MTW9kZWwoZmlsZSwgcmVzb3VyY2UuZ2V0V3JpdGVDb3VudCgpICE9IDApOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJV0FFMDAxN0UgVW5leHBlY3RlZCBJTyBleGNlcHRpb24gb2NjdXJyZWQgY3JlYXRpbmcgeG1sIGRvY3VtZW50Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRE9NVHJlZUlmTmVjZXNzYXJ5KCkgewotCQlpZiAobmVlZHNUb0NyZWF0ZURPTSkKLQkJCWNyZWF0ZURPTVRyZWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgY3JlYXRlUm9vdERPTUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRU1GMkRPTVNTRUFkYXB0ZXIoZ2V0UmVzb3VyY2UoKSwgZG9jdW1lbnQsIHRoaXMsIGdldFJlc291cmNlKCkuZ2V0Um9vdFRyYW5zbGF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVSZWdpc3RlckFzTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcigpIHsKLQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQl4bWxNb2RlbC5yZW1vdmVNb2RlbExpZmVjeWNsZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlUmVnaXN0ZXJBc01vZGVsU3RhdGVMaXN0ZW5lcigpIHsKLQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQl4bWxNb2RlbC5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlcmVnaXN0ZXJGcm9tWE1MTW9kZWwoKSB7Ci0JCQotCQlkZVJlZ2lzdGVyQXNNb2RlbFN0YXRlTGlzdGVuZXIoKTsKLQkJZGVSZWdpc3RlckFzTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcigpOwotCQkvLyBUaGlzIHRyeS9jYXRjaCBibG9jayBpcyBhIGhhY2sgdG8gZml4IGRlZmVjdCAyMDQxMTQuIFRoaXMgb2NjdXJzCi0JCS8vIGJlY2F1c2UKLQkJLy8gdGhlIG1vZGVsIG1hbmFnZXIgcGx1Z2luIGlzIHNodXQgZG93biBhbmQgdW5sb2FkZWQgYmVmb3JlIHRoZSBqMmVlCi0JCS8vIHBsdWdpbi4KLQkJLy8gQ2FsbGluZyBnZXRNb2RlbE1hbmFnZXIoKSBjYW4gcmVzdWx0IGluIGEgY2xhc3MgY2FzdCBleGNlcHRpb24gdGhhdAotCQkvLyBzaG91bGQKLQkJLy8gYmUgaWdub3JlZC4KLQkJLy8gTW9kZWxNYW5hZ2VyIG1nciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlnZXRNb2RlbE1hbmFnZXIoKTsKLQkJfQotCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4YykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQlpbnQgd3JpdGVDb3VudCA9IHJlc291cmNlLmdldFdyaXRlQ291bnQoKTsKLQkJCWludCByZWFkQ291bnQgPSByZXNvdXJjZS5nZXRSZWFkQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd3JpdGVDb3VudDsgaSsrKQotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHJlYWRDb3VudDsgaWkrKykKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihyZXNvdXJjZS5lQWRhcHRlcnMoKSwgRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCWFkYXB0ZXIucmVtb3ZlQWRhcHRlcnMoYWRhcHRlci5nZXROb2RlKCkpOwotCQl9Ci0JCXhtbE1vZGVsID0gbnVsbDsKLQkJeG1sTW9kZWxJZCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQlpc1NhdmluZyA9IHRydWU7Ci0JCQlpZiAobnVsbCAhPSBvdXRwdXRTdHJlYW0pIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzaG91bGQgbm90IHVzZSBhbiBPdXRwdXRTdHJlYW0gZm9yIHNhdmluZyIpO30gLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRE9NVHJlZUlmTmVjZXNzYXJ5KCk7Ci0JCQlSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gKFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcikgKChQcm9qZWN0UmVzb3VyY2VTZXQpIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkpLmdldFN5bmNocm9uaXplcigpOwotCQkJSUZpbGUgYUZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlc291cmNlKTsKLQkJCXRyeSB7Ci0JCQkJc3luY2hyb25pemVyLnByZVNhdmUoYUZpbGUsIHJlc291cmNlKTsKLQkJCQl4bWxNb2RlbC5zYXZlKGFGaWxlKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJc3luY2hyb25pemVyLnJlbW92ZUZyb21SZWNlbnRseVNhdmVkTGlzdChhRmlsZSk7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCQljYWNoZVN5bmNocm9uaXphdGlvblN0YW1wKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpc1NhdmluZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIEVNRjJET01BZGFwdGVyIGdldEV4aXN0aW5nRE9NQWRhcHRlcihOb2RlIG5vZGUpIHsKLQkJLy9JRE9NTm9kZSB4Tm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQkJLy9yZXR1cm4gKEVNRjJET01TU0VBZGFwdGVyKSB4Tm9kZS5nZXRBZGFwdGVyRm9yKEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpOwotCi0JCUlOb2RlTm90aWZpZXIgc3NlTm9kZSA9IChJTm9kZU5vdGlmaWVyKSBub2RlOwotCQlDb2xsZWN0aW9uIGFkYXB0ZXJzID0gc3NlTm9kZS5nZXRBZGFwdGVycygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWRhcHRlcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkvLyBGaXJzdCBDaGVjayBpZiBpdCdzIGFuIEVNRjJET01BZGFwdGVyCi0JCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNBZGFwdGVyRm9yVHlwZShFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKSkgewotCQkJCS8vIENhc3QgdG8gRU1GMkRPTVNTRUFkYXB0ZXIKLQkJCQlFTUYyRE9NU1NFQWRhcHRlciBlMkRBZGFwdGVyID0gKEVNRjJET01TU0VBZGFwdGVyKSBhZGFwdGVyOwotCQkJCS8vSGFuZGxlIHRoZSBjYXNlcyB3aGVyZSBlaXRoZXIgYWRhcHRlcidzIHRhcmdldCBpcyBudWxsIAotCQkJCS8vVXNlIHRoZSByZXNvdXJjZUNsYXNzIHRvIG1ha2Ugc3VyZSB0aGUgcmVzb3VyY2UgdHlwZSBpcyBpZGVudGljYWwKLQkJCQlpZiAoZ2V0UmVzb3VyY2UoKSA9PSBudWxsIHx8IGUyREFkYXB0ZXIuZ2V0VGFyZ2V0KCkgPT0gbnVsbCkKLQkJCQkJaWYocmVzb3VyY2VDbGFzcy5lcXVhbHMoZTJEQWRhcHRlci5nZXRSZXNvdXJjZUNsYXNzKCkpKQotCQkJCQkJcmV0dXJuIGUyREFkYXB0ZXI7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQotCQkJCS8vIEZpcnN0IGNoZWNrIGlmIHRhcmdldHMgYXJlIHJlc291cmNlcwotCQkJCWlmIChlMkRBZGFwdGVyLmdldFRhcmdldCgpIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCQkJLyoKLQkJCQkJICogTm93IGNoZWNrIGlmIGl0J3MgdGhlIHJpZ2h0IG9uZSAoTXVsdGlwbGUgcmVzb3VyY2VzCi0JCQkJCSAqIGNvdWxkIGJlIGF0dGFjaGVkKQotCQkJCQkgKi8KLQkJCQkJaWYgKGUyREFkYXB0ZXIuZ2V0VGFyZ2V0KCkgPT0gZ2V0UmVzb3VyY2UoKSkgewotCQkJCQkJcmV0dXJuIGUyREFkYXB0ZXI7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBDaGVjayBpZiB0YXJnZXRzIGFyZSBFT2JqZWN0cyB3aXRoIHRoZSBzYW1lIHJlc291cmNlcwotCQkJCQlUcmFuc2xhdG9yUmVzb3VyY2UgbXlUYXJnZXQgPSBnZXRSZXNvdXJjZSgpOwotCQkJCQlFT2JqZWN0IGFkYXB0ZXJUYXJnZXQgPSAoRU9iamVjdCkgZTJEQWRhcHRlci5nZXRUYXJnZXQoKTsKLQkJCQkJLyoKLQkJCQkJICogTm93IGNoZWNrIGlmIGl0J3MgdGhlIHJpZ2h0IG9uZSAoTXVsdGlwbGUgcmVzb3VyY2VzIGNvdWxkCi0JCQkJCSAqIGJlIGF0dGFjaGVkKQotCQkJCQkgKi8KLQkJCQkJaWYgKGFkYXB0ZXJUYXJnZXQuZVJlc291cmNlKCkgPT0gbXlUYXJnZXQgfHwgYWRhcHRlclRhcmdldC5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gZTJEQWRhcHRlcjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQkKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0JCWlmIChtb2RlbE1hbmFnZXIgPT0gbnVsbCkKLQkJCW1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCXJldHVybiBtb2RlbE1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGlkIHVzZWQgdG8ga2V5IHRoZSBYTUwgcmVzb3VyY2UgaW4gdGhlIFhNTCBNb2RlbE1hbmFnZXIuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2RlbE1hbmFnZXJJZCgpIHsKLQkJaWYgKHhtbE1vZGVsSWQgPT0gbnVsbCkgewotCQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoZ2V0UmVzb3VyY2UoKSk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWxJZCA9IGdldE1vZGVsTWFuYWdlcigpLmNhbGN1bGF0ZUlkKGZpbGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJeG1sTW9kZWxJZCA9IHJlc291cmNlLmdldFVSSSgpICsgTG9uZy50b1N0cmluZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHhtbE1vZGVsSWQ7Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQlyZXR1cm4gcmVzb3VyY2UgPT0gbnVsbCA/IG51bGwgOiByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgRE9NIG1vZGVsIGZvciB0aGlzIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBJRE9NTW9kZWwgZ2V0WE1MTW9kZWwoKSB7Ci0JCXJldHVybiB4bWxNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFhNTE1vZGVsSWQoKSB7Ci0JCXJldHVybiB4bWxNb2RlbElkOwotCX0JCi0JCi0JcHJpdmF0ZSBJRE9NTW9kZWwgaW5pdGlhbGl6ZVhNTE1vZGVsKElGaWxlIGZpbGUsIGJvb2xlYW4gZm9yV3JpdGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlID09IG51bGwgfHwgIWZpbGUuZXhpc3RzKCkpCi0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKChmaWxlID09IG51bGwpID8gIm51bGwiIDogZmlsZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCQkJU3RyaW5nIGlkID0gbWFuYWdlci5jYWxjdWxhdGVJZChmaWxlKTsJCQkKLQkJCWlmIChmb3JXcml0ZSkgewotCQkJCUlET01Nb2RlbCBtb2QgPSAoSURPTU1vZGVsKW1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoaWQpOwotCQkJCWlmIChtb2QgPT0gbnVsbCkKLQkJCQkJc2V0WE1MTW9kZWwoKElET01Nb2RlbCkgbWFuYWdlci5nZXRNb2RlbEZvckVkaXQoZmlsZSkpOwotCQkJCWVsc2UgewotCQkJCQlzZXRYTUxNb2RlbChtb2QpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUlET01Nb2RlbCBtb2QgPSAoSURPTU1vZGVsKW1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoaWQpOwotCQkJCWlmIChtb2QgPT0gbnVsbCkKLQkJCQkJc2V0WE1MTW9kZWwoKElET01Nb2RlbCkgbWFuYWdlci5nZXRNb2RlbEZvclJlYWQoZmlsZSkpOwotCQkJCWVsc2UgewotCQkJCQlzZXRYTUxNb2RlbChtb2QpOwotCQkJCX0KLQkJCX0KLQkJCXNldFhNTE1vZGVsSWQoZ2V0WE1MTW9kZWwoKS5nZXRJZCgpKTsKLQkJCW5lZWRzVG9DcmVhdGVET00gPSBmYWxzZTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGlkID0gZ2V0WE1MTW9kZWwoKS5nZXRJZCgpOwotCQlzeW5jUmVmZXJlbmNlQ291bnRzKGlkLCBmb3JXcml0ZSk7Ci0JCWlmICh4bWxNb2RlbCAhPSBudWxsKQotCQkJZG9jdW1lbnQgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQlyZXR1cm4geG1sTW9kZWw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNCYXRjaE1vZGUoKSB7Ci0JCXJldHVybiBpc0JhdGNoQ2hhbmdlczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVkKCkgewotCQlyZXR1cm4gKGdldFhNTE1vZGVsKCkgIT0gbnVsbCAmJiBnZXRYTUxNb2RlbCgpLmlzRGlydHkoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7Ci0JCQotCQlpZiggeG1sTW9kZWwgPT0gbnVsbCkgeyAvL3Jlc291cmNlIGNvdWxkIGJlIGluIHByb2Nlc3Mgb2YgYmVpbmcgdW5sb2FkZWQgLSBjaGVjayB3aXRoIG1vZGVsIG1hbmFnZXIKLQkJCVN0cmluZyBpZCA9IGdldE1vZGVsTWFuYWdlcklkKCk7Ci0JCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuaXNTaGFyZWQoaWQpOwotCQl9Ci0JCWlmIChnZXRSZXNvdXJjZVNldCgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB4bWxNb2RlbC5pc1NoYXJlZCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkRm9yV3JpdGUoKSB7Ci0JCWlmIChnZXRSZXNvdXJjZVNldCgpID09IG51bGwgfHwgeG1sTW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHhtbE1vZGVsLmlzU2hhcmVkRm9yRWRpdCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWREb2N1bWVudChJbnB1dFN0cmVhbSBpbiwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChudWxsICE9IGluKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzaG91bGQgbm90IHVzZSBhbiBJbnB1dFN0cmVhbSBmb3IgbG9hZGluZyIpO30gLy8kTk9OLU5MUy0xJAotCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXNvdXJjZSk7Ci0JCWluaXRpYWxpemVYTUxNb2RlbChmaWxlLCAocmVzb3VyY2UuZ2V0V3JpdGVDb3VudCgpICE9IDApKTsKLQkJY2FjaGVTeW5jaHJvbml6YXRpb25TdGFtcCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG1hbmFnZXNET01BZGFwdGVycygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWlmIChtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSAhPSBudWxsKQotCQkJYWJvdXRUb0NoYW5nZU5vZGUgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbW9kZWxBY2Nlc3NGb3JXcml0ZSgpIHsKLQkJU3RyaW5nIGlkID0gZ2V0TW9kZWxNYW5hZ2VySWQoKTsKLQkJZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoaWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWlmIChpc0JhdGNoQ2hhbmdlcykKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWlmIChyZXZlcnRpbmcgJiYgYWJvdXRUb0NoYW5nZU5vZGUgIT0gbnVsbCAmJiBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSAhPSBudWxsCi0JCQkJCSYmIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gYWJvdXRUb0NoYW5nZU5vZGUpIHsKLQkJCQlTdHJpbmcgaWQgPSBnZXRNb2RlbE1hbmFnZXJJZCgpOwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgdGVtcE1vZGVsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQl0ZW1wTW9kZWwgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChpZCk7Ci0JCQkJCXhtbE1vZGVsUmV2ZXJ0ZWQgPSB0cnVlOwotCQkJCQlyZXNvdXJjZS51bmxvYWQoKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAodGVtcE1vZGVsICE9IG51bGwgJiYgKHRlbXBNb2RlbC5nZXRSZWZlcmVuY2VDb3VudEZvckVkaXQoKSA+IDApKSB7Ci0JCQkJCQl0ZW1wTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJCX0KLQkJCQkJcmV2ZXJ0aW5nID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJYWJvdXRUb0NoYW5nZU5vZGUgPSBudWxsOwotCQl9Ci0JfSAKLQkKLQlwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkgewotCQlpZiAoIWlzRGlydHkgJiYgcmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7IC8vIFRoZSBYTUxNb2RlbCB3YXMgc2F2ZWQKLQkJCXJlc291cmNlLnNldE1vZGlmaWVkKGZhbHNlKTsKLQkJCWxvbmcgc3RhbXAgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5jb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAocmVzb3VyY2UpOwotCQkJV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuc2V0U3luaHJvbml6YXRpb25TdGFtcChyZXNvdXJjZSwgc3RhbXApOwotCQkJSVByb2plY3QgcHJvaiA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldFByb2plY3QocmVzb3VyY2UpOwotCQkJUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyIHN5bmNocm9uaXplciA9IChSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIpICgoUHJvamVjdFJlc291cmNlU2V0KSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2VTZXQocHJvaikpLmdldFN5bmNocm9uaXplcigpOwotCQkJSUZpbGUgYUZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlc291cmNlKTsKLQkJCXN5bmNocm9uaXplci5wcmVTYXZlKGFGaWxlLCByZXNvdXJjZSk7Ci0JCX0KLQkJaWYgKGlzRGlydHkpCi0JCQlyZXNvdXJjZS5zZXRNb2RpZmllZCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RlbFJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkvLyBEbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBqdXN0IHByaW9yIHRvIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgUmVzb3VyY2VTZXQuCi0JICogRW5zdXJlIHRoYXQgYWxsIHJlZmVyZW5jZSBjb3VudHMgdG8gdGhlIFhNTE1vZGVsIGFyZSByZW1vdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHByZURlbGV0ZSgpIHsKLQkJaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpCi0JCQlkZXJlZ2lzdGVyRnJvbVhNTE1vZGVsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJlVW5sb2FkKCkgewotCQlkZXJlZ2lzdGVyRnJvbVhNTE1vZGVsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvY2Vzc1Bvc3RNb2RlbEV2ZW50KE1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1JFVkVSVCkKLQkJCXJldmVydGluZyA9IGZhbHNlOwotCi0JfQotCi0JcHVibGljIHZvaWQgcHJvY2Vzc1ByZU1vZGVsRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0VHlwZSgpID09IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfUkVWRVJUKQotCQkJcmV2ZXJ0aW5nID0gdHJ1ZTsKLQkJCQotCQlpZiAoIWlzU2F2aW5nKSB7Ci0JCQlpZiAoZXZlbnQuZ2V0VHlwZSgpID09IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQpIHsKLQkJCQlSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gKFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcikgKChQcm9qZWN0UmVzb3VyY2VTZXQpIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkpLmdldFN5bmNocm9uaXplcigpOwotCQkJCUlGaWxlIGFGaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXNvdXJjZSk7Ci0JCQkJc3luY2hyb25pemVyLnByZVNhdmUoYUZpbGUsIHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQXNNb2RlbExpZmVjeWNsZUxpc3RlbmVyKCkgewotCQl0aGlzLnhtbE1vZGVsLmFkZE1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOS83LzIwMDEgMTA6NDk6NTMKLQkgKiBBTSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlckFzTW9kZWxTdGF0ZUxpc3RlbmVyKCkgewotCQl0aGlzLnhtbE1vZGVsLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVJlYWQoKSB7Ci0JCWlmICh4bWxNb2RlbCAhPSBudWxsKQotCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21Xcml0ZSgpIHsKLQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQl4bWxNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVET01BZGFwdGVyKE5vZGUgYU5vZGUsIEVNRjJET01BZGFwdGVyIGFuQWRhcHRlcikgewotCQkoKElET01Ob2RlKSBhTm9kZSkucmVtb3ZlQWRhcHRlcigoRU1GMkRPTVNTRUFkYXB0ZXIpIGFuQWRhcHRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYueG1sLkVNRjJET01SZW5kZXJlciNyZXBsYWNlRG9jdW1lbnRUeXBlKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VEb2N1bWVudFR5cGUoU3RyaW5nIGRvY1R5cGVOYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRG9jdW1lbnRUeXBlSW1wbCBkb2NUeXBlID0gKERvY3VtZW50VHlwZUltcGwpIGRvY3VtZW50LmdldERvY3R5cGUoKTsKLQkJaWYgKGRvY1R5cGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHB1YmxpY0lkID09IG51bGwgJiYgc3lzdGVtSWQgPT0gbnVsbCkKLQkJCWRvY3VtZW50LnJlbW92ZUNoaWxkKGRvY1R5cGUpOwotCQllbHNlIHsKLQkJCWRvY1R5cGUuc2V0UHVibGljSWQocHVibGljSWQpOwotCQkJZG9jVHlwZS5zZXRTeXN0ZW1JZChzeXN0ZW1JZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgYmF0Y2hNb2RlU3RhcnQgYW5kIEJhdGNoTW9kZUVuZCBpbnN0ZWFkIGV2ZW4gaWYgeW91IGRvCi0JICogICAgICAgICAgICAgbm90IHVzZSBiYXRjaE1vZGVsU3RhcnQvRW5kLCB5b3Ugc3RpbGwgbmVlZCB0byB1c2UgdGhlCi0JICogICAgICAgICAgICAgdHJ5L2ZpbmFsbHkgcGF0dGVybiBkb2N1bWVudGVkIHRoZXJlLgotCSAqLwotCi0JcHVibGljIHZvaWQgc2V0QmF0Y2hNb2RlKGJvb2xlYW4gaXNCYXRjaCkgewotCi0JCS8vIFRoaXMgaXMgc29tZSBleHRyYSBwcm9jZXNzaW5nIGZvciBjbGllbnRzIHRvIGtub3cgdGhleSBtYXkgYmUgdXNpbmcKLQkJLy8gaW5jb3JyZWN0bHkKLQkJaWYgKGlzQmF0Y2gpIHsKLQkJCWlmIChpc0JhdGNoQ2hhbmdlcykgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJzZXRCYXRjaCB3YXMgc2V0IHRvIHRydWUgd2hlbiBpdCB3YXMgYWxyZWFkeSB0cnVlLiBUaGlzIGNhbiBiZSBhbiBpbmRpY2F0aW9uIG9mIGludmFsaWQgY2FsbGluZyBvcmRlciIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCi0JCWlmIChpc0JhdGNoKSB7Ci0JCQliYXRjaE1vZGVTdGFydCgpOwotCQl9Ci0JCWVsc2UgewotCQkJYmF0Y2hNb2RlRW5kKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Um9vdE5vZGVBZGFwdGVyTm90aWZpY2F0aW9uRW5hYmxlZChib29sZWFuIGIpIHsKLQkJRU9iamVjdCByb290ID0gcmVzb3VyY2UuZ2V0Um9vdE9iamVjdCgpOwotCQlpZiAocm9vdCAhPSBudWxsKSB7Ci0JCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKHJvb3QsIEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXIuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChiKTsKLQkJCQlpZiAoYikKLQkJCQkJYWRhcHRlci51cGRhdGVET00oKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgRE9NIG1vZGVsIGZvciB0aGlzIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFhNTE1vZGVsKElET01Nb2RlbCB4bWxNb2RlbCkgewotCQlkZVJlZ2lzdGVyQXNNb2RlbFN0YXRlTGlzdGVuZXIoKTsKLQkJZGVSZWdpc3RlckFzTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcigpOwotCQl0aGlzLnhtbE1vZGVsID0geG1sTW9kZWw7Ci0JCXJlZ2lzdGVyQXNNb2RlbFN0YXRlTGlzdGVuZXIoKTsKLQkJcmVnaXN0ZXJBc01vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRYTUxNb2RlbElkKFN0cmluZyBpZCkgewotCQl4bWxNb2RlbElkID0gaWQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNSZWZlcmVuY2VDb3VudHMoU3RyaW5nIGlkLCBib29sZWFuIGZvcldyaXRlKSB7Ci0JCWludCBlZGl0SW5kZXggPSAwLCByZWFkSW5kZXggPSAwOwotCQlpZiAoZm9yV3JpdGUpCi0JCQllZGl0SW5kZXgrKzsKLQkJZWxzZQotCQkJcmVhZEluZGV4Kys7Ci0JCWludCB3cml0ZUNvdW50ID0gcmVzb3VyY2UuZ2V0V3JpdGVDb3VudCgpOwotCQlpbnQgcmVhZENvdW50ID0gcmVzb3VyY2UuZ2V0UmVhZENvdW50KCk7Ci0JCWZvciAoaW50IGkgPSB3cml0ZUNvdW50OyBpID4gZWRpdEluZGV4OyBpLS0pCi0JCQltb2RlbE1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoaWQpOwotCQlmb3IgKGludCBpID0gcmVhZENvdW50OyBpID4gcmVhZEluZGV4OyBpLS0pCi0JCQltb2RlbE1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoaWQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZVN0cmVhbXNGb3JJTygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHdhc1JldmVydGVkKCkgewotCQlyZXR1cm4geG1sTW9kZWxSZXZlcnRlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3VwZXIuc2V0UmVzb3VyY2UocmVzb3VyY2UpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkKLQkJCXJlc291cmNlQ2xhc3MgPSByZXNvdXJjZS5nZXRDbGFzcygpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1JldmVydGluZygpIHsKLQkJcmV0dXJuIHRoaXMucmV2ZXJ0aW5nOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNzkxMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWVtZk1vZGVsU3luY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VtZjJ4bWwvRU1GMkRPTVNTRVJlbmRlcmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW1mMnhtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5IGV4dGVuZHMgUmVuZGVyZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRU1GMkRPTVNTRVJlbmRlcmVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBFTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5KCk7Ci0KLQlwdWJsaWMgRU1GMkRPTVNTRVJlbmRlcmVyRmFjdG9yeSgpIHsKLQkJLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotCX0KLQotCi0JcHVibGljIFJlbmRlcmVyIGNyZWF0ZVJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IEVNRjJET01TU0VSZW5kZXJlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9Db21wb25lbnRTZWFyY2hDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL0NvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMWRjZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL0NvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnRTZWFyY2hDb250cmlidXRvciAgewotCi0JcHJvdGVjdGVkIEhhc2hNYXAgZGVjbGFyYXRpb25zOwotCi0JcHJvdGVjdGVkIEhhc2hNYXAgcmVmZXJlbmNlczsKLQotCXByb3RlY3RlZCBTdHJpbmdbXSBuYW1lc3BhY2VzOwotCi0JcHVibGljIENvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBYTUxTZWFyY2hQYXR0ZXJuIGdldERlY2xhcmF0aW9uUGF0dGVybihRdWFsaWZpZWROYW1lIGNvbXBvbmVudE5hbWUpIHsKLQkJcmV0dXJuIChYTUxTZWFyY2hQYXR0ZXJuKSBnZXREZWNsYXJhdGlvbnMoKS5nZXQoY29tcG9uZW50TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBnZXREZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChkZWNsYXJhdGlvbnMgPT0gbnVsbCkgewotCQkJaW5pdGlhbGl6ZURlY2xhcmF0aW9ucygpOwotCQl9Ci0JCXJldHVybiBkZWNsYXJhdGlvbnM7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBnZXRSZWZlcmVuY2VzKCkgewotCQlpZiAocmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlpbml0aWFsaXplUmVmZXJlbmNlcygpOwotCQl9Ci0JCXJldHVybiByZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyBYTUxTZWFyY2hQYXR0ZXJuW10gZ2V0UmVmZXJlbmNlc1BhdHRlcm5zKFF1YWxpZmllZE5hbWUgY29tcG9uZW50TmFtZSkgewotCQlMaXN0IHJlZmVyZW5jZXMgPSAoTGlzdCkgZ2V0UmVmZXJlbmNlcygpLmdldChjb21wb25lbnROYW1lKTsKLQkJaWYgKHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJcmV0dXJuIChYTUxTZWFyY2hQYXR0ZXJuW10pIHJlZmVyZW5jZXMKLQkJCQkJLnRvQXJyYXkobmV3IFhNTFNlYXJjaFBhdHRlcm5bcmVmZXJlbmNlcy5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gbmV3IFhNTFNlYXJjaFBhdHRlcm5bMF07Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFF1YWxpZmllZE5hbWUgY29tcG9uZW50TmFtZSl7Ci0JCXJldHVybiBnZXRSZWZlcmVuY2VzUGF0dGVybnMoY29tcG9uZW50TmFtZSkubGVuZ3RoID4gMCB8fAotCQkJZ2V0RGVjbGFyYXRpb25QYXR0ZXJuKGNvbXBvbmVudE5hbWUpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZE5hbWVzcGFjZXMoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2VzOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVEZWNsYXJhdGlvbnMoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVSZWZlcmVuY2VzKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplU3VwcG9ydGVkTmFtZXNwYWNlcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1RhcmdldE5hbWVzcGFjZVJlZmVyZW5jZVBhdHRlcm4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9UYXJnZXROYW1lc3BhY2VSZWZlcmVuY2VQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjFiN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1RhcmdldE5hbWVzcGFjZVJlZmVyZW5jZVBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci0KLXB1YmxpYyBjbGFzcyBUYXJnZXROYW1lc3BhY2VSZWZlcmVuY2VQYXR0ZXJuIGV4dGVuZHMgU2VhcmNoUGF0dGVybiB7Ci0JCi0JU3RyaW5nIG5hbWVzcGFjZVVSSTsKLQkKLQlwdWJsaWMgVGFyZ2V0TmFtZXNwYWNlUmVmZXJlbmNlUGF0dGVybihpbnQgbWF0Y2hSdWxlLCBTdHJpbmcgbmFtZXNwYWNldXJpKSB7Ci0JCXN1cGVyKG1hdGNoUnVsZSk7Ci0JCW5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZXVyaTsKLQl9Ci0JCi0JcHVibGljIFRhcmdldE5hbWVzcGFjZVJlZmVyZW5jZVBhdHRlcm4oU3RyaW5nIG5hbWVzcGFjZXVyaSkgewotCQlzdXBlcigpOwotCQluYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2V1cmk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZjQ3NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLQotcHVibGljIGNsYXNzIFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybiBleHRlbmRzIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4gewotCi0JcHVibGljIFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybihRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwgUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUsIGludCBtYXRjaFJ1bGUpIHsKLQkJc3VwZXIobnVsbCwgZWxlbWVudFFOYW1lLCB0eXBlUU5hbWUsIG1hdGNoUnVsZSk7Ci0JCQotCX0KLQotCXB1YmxpYyBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4oSUZpbGUgZmlsZSwgUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUsIFF1YWxpZmllZE5hbWUgdHlwZVFOYW1lKSB7Ci0JCXN1cGVyKGZpbGUsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lKTsKLQl9Ci0JCi0JcHVibGljIFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybihRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwgUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUpIHsKLQkJc3VwZXIobnVsbCwgZWxlbWVudFFOYW1lLCB0eXBlUU5hbWUpOwotCX0KLQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OGE4YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuIGV4dGVuZHMgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybnsKLQotCXB1YmxpYyBYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSwgaW50IG1hdGNoUnVsZSkgewotCQlzdXBlcihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSwgbWF0Y2hSdWxlKTsKLQkJCi0JfQotCi0JcHVibGljIFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4oSUZpbGUgZmlsZSwgUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUsIFF1YWxpZmllZE5hbWUgdHlwZVFOYW1lKSB7Ci0JCXN1cGVyKGZpbGUsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lKTsKLQkJCi0JfQotCQotCXB1YmxpYyBYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSkgewotCQlzdXBlcihudWxsLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSk7Ci0JCQotCX0KLQkKLQkKLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmYzMDQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5Db21wb25lbnRTZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotCi0vKioKLSAqIFhNTCBjb21wb25lbnQgc2VhcmNoIHBhdHRlcm4gaXMgYSBjb21wb3NpdGUgcGF0dGVybiB0aGF0IGNvbWJpbmVzIFhNTCBlbGVtZW50IHBhdHRlcm4uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybiBleHRlbmRzIENvbXBvbmVudFNlYXJjaFBhdHRlcm4gewotCQotCS8qKgotCSAqIENvbnRhaW5pbmcgZWxlbWVudCBwYXR0ZXJucwotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JWE1MU2VhcmNoUGF0dGVybltdIGNoaWxkcmVuID0gbmV3IFhNTFNlYXJjaFBhdHRlcm5bMF07Ci0JCi0JLyoqCi0JICogQSBtYXAgb2YgWE1MU2VhcmNoUGF0dGVybltdIGJ5IHtAbGluayBTZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2ggcGFydGljaXBhbnR9LgotCSAqLwotCXByb3RlY3RlZCBNYXAgY2hpbGRQYXR0ZXJuc0J5UGFydGljaXBhbnQgPSBuZXcgSGFzaE1hcCgpOwotCQotCXB1YmxpYyBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSwgaW50IG1hdGNoUnVsZSkgewotCQlzdXBlcihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSwgbWF0Y2hSdWxlKTsKLQkJCi0JfQotCi0KLQlwdWJsaWMgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybihJRmlsZSBmaWxlLCBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwgUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUpIHsKLQkJc3VwZXIoZmlsZSwgZWxlbWVudFFOYW1lLCB0eXBlUU5hbWUpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDaGlsZHJlbihTZWFyY2hQYXJ0aWNpcGFudCl9IGluc3RlYWQuCi0JICovCi0JcHVibGljIFhNTFNlYXJjaFBhdHRlcm5bXSBnZXRDaGlsZHJlbigpewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2FkZENoaWxkcmVuKFNlYXJjaFBhcnRpY2lwYW50LCBYTUxTZWFyY2hQYXR0ZXJuW10pfSBpbnN0ZWFkLgotICAgICAqLwotCXB1YmxpYyB2b2lkIHNldENoaWxkcmVuKFhNTFNlYXJjaFBhdHRlcm5bXSBwYXR0ZXJucyl7Ci0JCWNoaWxkcmVuID0gcGF0dGVybnM7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBQcm92aWRlcyB0aGUgY2hpbGQgcGF0dGVybnMgY29udHJpYnV0ZWQgYnkgdGhlIGdpdmVuIHNlYXJjaCBwYXJ0aWNpcGFudC4gCi0JICogQHBhcmFtIHNlYXJjaFBhcnRpY2lwYW50IHRoZSB7QGxpbmsgU2VhcmNoUGFydGljaXBhbnQgc2VhcmNoIHBhcnRpY2lwYW50fSB0aGF0IGNvbnRyaWJ1dGVkIHRoZSBwYXR0ZXJucy4KLSAgICAgKiBAc2VlIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4jYWRkQ2hpbGRyZW4oU2VhcmNoUGFydGljaXBhbnQsIFhNTFNlYXJjaFBhdHRlcm5bXSkgYWRkQ2hpbGRyZW4KLQkgKiBAcmV0dXJuIGFuIGFycmF5IHdpdGggdGhlIHtAbGluayBYTUxTZWFyY2hQYXR0ZXJuIHBhdHRlcm5zfSBjb250cmlidXRlZCBieSB0aGUge0BsaW5rIFNlYXJjaFBhcnRpY2lwYW50IHNlYXJjaCBwYXJ0aWNpcGFudH0uCi0JICovCi0JcHVibGljIFhNTFNlYXJjaFBhdHRlcm5bXSBnZXRDaGlsZHJlbihTZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2hQYXJ0aWNpcGFudCl7Ci0JICBYTUxTZWFyY2hQYXR0ZXJuW10gY2hpbGRQYXR0ZXJucyA9IGdldENoaWxkcmVuKCk7Ci0JICBpZiAoc2VhcmNoUGFydGljaXBhbnQgIT0gbnVsbCl7Ci0JICAgIGNoaWxkUGF0dGVybnMgPSAoWE1MU2VhcmNoUGF0dGVybltdKWNoaWxkUGF0dGVybnNCeVBhcnRpY2lwYW50LmdldChzZWFyY2hQYXJ0aWNpcGFudCk7Ci0JICAgIGlmIChjaGlsZFBhdHRlcm5zID09IG51bGwpewotCSAgICAgIGNoaWxkUGF0dGVybnMgPSBnZXRDaGlsZHJlbigpOwotCSAgICB9Ci0JICB9Ci0JICByZXR1cm4gY2hpbGRQYXR0ZXJuczsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY2hpbGQgcGF0dGVybnMgY29udHJpYnV0ZWQgYnkgdGhlIGdpdmVuIHNlYXJjaCBwYXJ0aWNpcGFudC4KLQkgKiBAcGFyYW0gc2VhcmNoUGFydGljaXBhbnQgdGhlIHtAbGluayBTZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2ggcGFydGljaXBhbnR9IHRoYXQgaXMgY29udHJpYnV0aW5nIHRoZSBjaGlsZCBzZWFyY2ggcGF0dGVybnMuCi0JICogQHBhcmFtIGNoaWxkUGF0dGVybnMgdGhlIGNoaWxkIHBhdHRlcm5zIGNvbnRyaWJ1dGVkIGJ5IHRoZSB7QGxpbmsgU2VhcmNoUGFydGljaXBhbnQgc2VhcmNoUGFydGljaXBhbnQgc2VhcmNoIHBhcnRpY2lwYW50fS4KLQkgKiBAc2VlIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4jZ2V0Q2hpbGRyZW4oU2VhcmNoUGFydGljaXBhbnQpIGdldENoaWxkcmVuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGRyZW4oU2VhcmNoUGFydGljaXBhbnQgc2VhcmNoUGFydGljaXBhbnQsIFhNTFNlYXJjaFBhdHRlcm5bXSBjaGlsZFBhdHRlcm5zKXsKLQkgIGlmIChzZWFyY2hQYXJ0aWNpcGFudCAhPSBudWxsICYmIGNoaWxkUGF0dGVybnMgIT0gbnVsbCkgewotCSAgICBjaGlsZFBhdHRlcm5zQnlQYXJ0aWNpcGFudC5wdXQoc2VhcmNoUGFydGljaXBhbnQsIGNoaWxkUGF0dGVybnMpOwotCSAgfQotCSAgZWxzZSB7Ci0JICAgIGNoaWxkcmVuID0gY2hpbGRQYXR0ZXJuczsKLQkgIH0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MU2VhcmNoUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzA5ZjU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkNvbXBvbmVudERlY2xhcmF0aW9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkZpbGVSZWZlcmVuY2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLkNvbXBvbmVudFNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLkZpbGVSZWZlcmVuY2VQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuQ29udGVudFR5cGVTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGwuSVhNTFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGwuWE1MU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZy5QYXR0ZXJuTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1hdGNoaW5nLlhNTFNlYXJjaFBhdHRlcm5NYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gucXVpY2tzY2FuLlhNTFF1aWNrU2NhbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFhNTFNlYXJjaFBhcnRpY2lwYW50IGV4dGVuZHMgU2VhcmNoUGFydGljaXBhbnQgewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1BlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC9wZXJmIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXB1YmxpYyBYTUxTZWFyY2hQYXJ0aWNpcGFudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkKLQkvKgotIHB1YmxpYyAgYm9vbGVhbiBpbml0aWFsaXplKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgU3RyaW5nW10gY29udGVudFR5cGVzKXsKLQkJCi0JICAgIHN1cGVyLmluaXRpYWxpemUocGF0dGVybiwgY29udGVudFR5cGVzKTsKLQkJdGhpcy5zdXBwb3J0ZWRDb250ZW50VHlwZXMgPSBjb250ZW50VHlwZXM7Ci0JCQotCQlpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybil7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfSovCi0KLQkKLQotCXB1YmxpYyBTZWFyY2hEb2N1bWVudCBjcmVhdGVTZWFyY2hEb2N1bWVudChTdHJpbmcgZG9jdW1lbnRQYXRoKSB7Ci0KLQkJcmV0dXJuIG5ldyBYTUxTZWFyY2hEb2N1bWVudChkb2N1bWVudFBhdGgsIHRoaXMpOwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJYTUwgc2VhcmNoIHBhcnRpY2lwYW50IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0KLQlwcml2YXRlIHZvaWQgbG9jYXRlTWF0Y2hlcyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaERvY3VtZW50IGRvY3VtZW50LAotCQkJU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgTWFwIHNlYXJjaE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0gICAgICAgIC8vIFRPRE8uLi4gdXRpbGl6ZSBzZWFyY2ggb3B0aW9ucyAodGhhdCBzaG91bGQgZ2V0IHBhc3NlZCBkb3duIHZpYSB0aGUgU2VhcmNoRW5naW5lKQotICAgICAgICAvLyB0byBzcGVjaWZ5IGlmIGFjY3VyYXRlIHNvdXJjZSBjb29yZGluYXRlcyBhcmUgcmVxJ2QgaWYgbm90LCBzaW1wbHkgdXNlIHRoZSBTQVggcmVzdWx0cwotICAgICAgICAvLwotICAgICAgICBpZiAocGF0dGVybi5nZXRNYXRjaFJ1bGUoKSA9PSBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSCkKLSAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICBJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgoZG9jdW1lbnQuZ2V0UGF0aCgpKSk7Ci0gICAgICAgICAgLy8gVE9ETy4uIGRvbid0IGFzc3VtZSB0aGUgY2F0ZWdvcnkgaXMgQ09NUE9ORU5UX0RFQ0wuLi4gaGFuZGxlIGFueSBhcmJpdGFydHkgY2F0ZWdvcnkKLSAgICAgICAgICBFbnRyeVtdIGVudHJpZXMgPSBkb2N1bWVudC5nZXRFbnRyaWVzKElYTUxTZWFyY2hDb25zdGFudHMuQ09NUE9ORU5UX0RFQ0wsIG51bGwsIDApOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPLi4gZG9uJ3QgYXNzdW1lIHRoaXMgaXMganVzdCBhIGNvbXBvbmVudCBkZWNsYXJhdGlvbiBlbnRyeSAgICAgICAgICAgIAotICAgICAgICAgICAgQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeSBlbnRyeSA9IChDb21wb25lbnREZWNsYXJhdGlvbkVudHJ5KWVudHJpZXNbaV07Ci0gICAgICAgICAgICBTZWFyY2hNYXRjaCBzZWFyY2hNYXRjaCA9IG5ldyBTZWFyY2hNYXRjaChudWxsLCAwLCAwLCBmaWxlKTsKLSAgICAgICAgICAgIHNlYXJjaE1hdGNoLm1hcC5wdXQoIm5hbWUiLCBlbnRyeS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzZWFyY2hNYXRjaC5tYXAucHV0KCJtZXRhTmFtZSIsIGVudHJ5LmdldE1ldGFOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVxdWVzdG9yLmFjY2VwdFNlYXJjaE1hdGNoKHNlYXJjaE1hdGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0gIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi0gICAgICAgIHsgIGlmIChkb2N1bWVudC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQkJSURPTUVsZW1lbnQgY29udGV4dE5vZGUgPSAoSURPTUVsZW1lbnQpIGRvbU1vZGVsLmdldERvY3VtZW50KCkKLQkJCQkJLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJRE9NVmlzaXRvciB2aXNpdG9yID0gbmV3IERPTVZpc2l0b3IoZG9jdW1lbnQuZ2V0UGF0aCgpLCBwYXR0ZXJuLAotCQkJCQlyZXF1ZXN0b3IpOwotCQkJdmlzaXRvci52aXNpdChjb250ZXh0Tm9kZSk7Ci0JCX0KLSAgICAgICAgfQotCX0KLQkKLQlwcml2YXRlIFBhdHRlcm5NYXRjaGVyIGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKFBhdHRlcm5NYXRjaGVyLmNsYXNzLmVxdWFscyhhZGFwdGVyVHlwZSkgJiYKLQkJCQkoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgWE1MU2VhcmNoUGF0dGVybiB8fAotCQkJCWFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4pICkgewotCQkJcmV0dXJuIG5ldyBYTUxTZWFyY2hQYXR0ZXJuTWF0Y2hlcih0aGlzKTsKLQkJfSAKLQkJcmV0dXJuIG51bGw7IAotCX0KLQotCXByaXZhdGUgY2xhc3MgRE9NVmlzaXRvciB7Ci0KLQkJU3RyaW5nIHBhdGg7Ci0JCVNlYXJjaFBhdHRlcm4gcGF0dGVybjsKLQkJU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcjsKLQkJUGF0dGVybk1hdGNoZXIgbWF0Y2hlcjsKLQotCQkKLQkJcHJvdGVjdGVkIERPTVZpc2l0b3IoU3RyaW5nIHBhdGgsIFNlYXJjaFBhdHRlcm4gcGF0dGVybiwKLQkJCQlTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJCXRoaXMucGF0dGVybiA9IHBhdHRlcm47Ci0JCQkKLQkJCW1hdGNoZXIgPSAoUGF0dGVybk1hdGNoZXIpcGF0dGVybi5nZXRBZGFwdGVyKFBhdHRlcm5NYXRjaGVyLmNsYXNzKTsKLQkJCWlmKG1hdGNoZXIgPT0gbnVsbCl7Ci0JCQkJbWF0Y2hlciA9IGdldEFkYXB0ZXIocGF0dGVybiwgUGF0dGVybk1hdGNoZXIuY2xhc3MpOwotCQkJfQotCQkJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgdmlzaXQoTm9kZSBub2RlKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJbWF0Y2goKEVsZW1lbnQpbm9kZSk7Ci0JCQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJTm9kZSBhTm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQkJCXZpc2l0KGFOb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgbWF0Y2goRWxlbWVudCBub2RlKSB7Ci0JCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24oCi0JCQkJCW5ldyBQYXRoKHBhdGgpKTsKLQkJCWlmKG1hdGNoZXIgIT0gbnVsbCl7Ci0JCQkJbWF0Y2hlci5sb2NhdGVNYXRjaGVzKHBhdHRlcm4sIGZpbGUsIG5vZGUsIHJlcXVlc3Rvcik7Ci0JCQl9Ci0KLQkJCQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgU2VhcmNoU2NvcGUgc2VsZWN0RG9jdW1lbnRMb2NhdGlvbnMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBTZWFyY2hTY29wZSBzY29wZSwgTWFwIHNlYXJjaE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvKgotCQkgKiBnYXRlICMxOiByZWR1Y2UgdGhlIHNjb3BlIHRvIHRoZSBmaWxlcyB3aXRoIHRoZSBjb250ZW50IHR5cGUgdGhhdAotCQkgKiBjb3VsZCBiZSBzZWFyY2hlZCB1c2luZyB0aGlzIHBhcnRpY2lwYW50Ci0JCSAqLyAKLQkJU3RyaW5nW10gY29udGVudFR5cGVzID0gZ2V0U3VwcG9ydGVkQ29udGVudFR5cGVzKCk7CQotCQlpZihjb250ZW50VHlwZXMgIT0gbnVsbCAmJiBjb250ZW50VHlwZXMubGVuZ3RoID4gMCl7Ci0JCQlzY29wZSA9IG5ldyBDb250ZW50VHlwZVNlYXJjaFNjb3BlKHNjb3BlLCBjb250ZW50VHlwZXMpOwotCQl9Ci0JCXJldHVybiBzdXBlci5zZWxlY3REb2N1bWVudExvY2F0aW9ucyhwYXR0ZXJuLCBzY29wZSwgc2VhcmNoT3B0aW9ucywgbW9uaXRvcik7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBDb21wb25lbnRTZWFyY2hDb250cmlidXRvciBnZXRTZWFyY2hDb250cmlidXRvcigpOwotCi0KLQlwdWJsaWMgdm9pZCBiZWdpblNlYXJjaGluZyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIE1hcCBzZWFyY2hPcHRpb25zKSB7Ci0JCQotCQlzdXBlci5iZWdpblNlYXJjaGluZyhwYXR0ZXJuLCBzZWFyY2hPcHRpb25zKTsKLQkJaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybil7Ci0JCQlYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4gY29tcG9uZW50UGF0dGVybiA9IChYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4pcGF0dGVybjsKLQkJCVhNTFNlYXJjaFBhdHRlcm4gY2hpbGRQYXR0ZXJuID0gZ2V0U2VhcmNoQ29udHJpYnV0b3IoKS5nZXREZWNsYXJhdGlvblBhdHRlcm4oY29tcG9uZW50UGF0dGVybi5nZXRNZXRhTmFtZSgpKTsKLQkJCWlmKGNoaWxkUGF0dGVybiAhPSBudWxsKXsKLQkJCQkJY2hpbGRQYXR0ZXJuLnNldFNlYXJjaE5hbWUoY29tcG9uZW50UGF0dGVybi5nZXROYW1lKCkuZ2V0TG9jYWxOYW1lKCkpOwotCQkJCQljaGlsZFBhdHRlcm4uc2V0U2VhcmNoTmFtZXNwYWNlKGNvbXBvbmVudFBhdHRlcm4uZ2V0TmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkgICAgIAkJCWNvbXBvbmVudFBhdHRlcm4uYWRkQ2hpbGRyZW4odGhpcywgbmV3IFhNTFNlYXJjaFBhdHRlcm5bXXtjaGlsZFBhdHRlcm59KTsKLQkJCX0KLQkJCQotCQl9Ci0JCWVsc2UgaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4pewotCQkJWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybiBjb21wb25lbnRQYXR0ZXJuID0gKFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4pcGF0dGVybjsKLQkJCVhNTFNlYXJjaFBhdHRlcm5bXSBjaGlsZFBhdHRlcm5zID0gZ2V0U2VhcmNoQ29udHJpYnV0b3IoKS5nZXRSZWZlcmVuY2VzUGF0dGVybnMoY29tcG9uZW50UGF0dGVybi5nZXRNZXRhTmFtZSgpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRQYXR0ZXJucy5sZW5ndGg7IGkrKykgewotCQkJCVhNTFNlYXJjaFBhdHRlcm4gY2hpbGRQYXR0ZXJuID0gY2hpbGRQYXR0ZXJuc1tpXTsKLQkJCQljaGlsZFBhdHRlcm4uc2V0U2VhcmNoTmFtZShjb21wb25lbnRQYXR0ZXJuLmdldE5hbWUoKS5nZXRMb2NhbE5hbWUoKSk7Ci0JCQkJY2hpbGRQYXR0ZXJuLnNldFNlYXJjaE5hbWVzcGFjZShjb21wb25lbnRQYXR0ZXJuLmdldE5hbWUoKS5nZXROYW1lc3BhY2UoKSk7CQkJCQotCQkJfQotCQkJY29tcG9uZW50UGF0dGVybi5hZGRDaGlsZHJlbih0aGlzLCBjaGlsZFBhdHRlcm5zKTsKLQkJCQotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIFRoZSBpbnRlbmQgb2YgdGhpcyBtZXRob2QgaXMgdG8gbGltaXQgdGhlIHNlYXJjaCB0byB0aGUgZmlsZXMgdGhhdCBoYXZlIGNvbnRlbnQgCi0JICogd2hpY2ggY2FuIGJlIHNlYXJjaGVkIGZvciB0aGUgZ2l2ZW4gcGF0dGVybi4gSXQgaXMgY2FsbGVkIGZyb20gCi0JICoge0BsaW5rICNzZWxlY3REb2N1bWVudExvY2F0aW9ucyhTZWFyY2hQYXR0ZXJuLCBTZWFyY2hTY29wZSwgSVByb2dyZXNzTW9uaXRvcil9Ci0JICogCi0JICogQHBhcmFtIHBhdHRlcm4gdGhlIHNlYXJjaCBwYXR0ZXJuIHRoYXQgaXMgc2VhcmNoZWQgZm9yCi0JICogQHJldHVybiBjb250ZW50IHR5cGUncyB1bmlxdWUgaWRlbnRpZmllcnMgdGhhdCBjb3VsZCBiZSBzZWFyY2hlZCBmb3IgdGhlIGdpdmVuIHBhdHRlcm4uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldFN1cHBvcnRlZENvbnRlbnRUeXBlcygpOwotCi0JcHVibGljIHZvaWQgcG9wdWxhdGVTZWFyY2hEb2N1bWVudChTZWFyY2hEb2N1bWVudCBkb2N1bWVudCwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuKQotCXsKLQkJUGF0dGVybk1hdGNoZXIgbWF0Y2hlciA9IChQYXR0ZXJuTWF0Y2hlcilwYXR0ZXJuLmdldEFkYXB0ZXIoUGF0dGVybk1hdGNoZXIuY2xhc3MpOwotCQlpZihtYXRjaGVyID09IG51bGwpewotCQkJbWF0Y2hlciA9IGdldEFkYXB0ZXIocGF0dGVybiwgUGF0dGVybk1hdGNoZXIuY2xhc3MpOwotCQl9Ci0JCVhNTFF1aWNrU2Nhbi5wb3B1bGF0ZVNlYXJjaERvY3VtZW50KGRvY3VtZW50LCBtYXRjaGVyLCBwYXR0ZXJuKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIGxvY2F0ZU1hdGNoZXMoU2VhcmNoRG9jdW1lbnRTZXQgZG9jdW1lbnRTZXQsIFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIE1hcCBzZWFyY2hPcHRpb25zLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCi0JCS8vIFRPRE86IHVzZSB0aGUgZmlsZSByZWZlcmVuY2UgZW50cmllcyBpbiB0aGUgZG9jdW1lbnRzIHRvIHJlZHVjZSB0aGUgc2NvcGUgdG8gdGhlIHJlZmVyZW5jZWQgZmlsZXMgb25seQotCQkvLyBTZWFyY2hEb2N1bWVudFtdIGRvY3VtZW50cyA9IGRvY3VtZW50U2V0LmdldFNlYXJjaERvY3VtZW50cyhpZCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB0aGUgc2VhcmNoIHBhdHRlcm4gaXMgcXVhbGlmaWVkIGJ5IGEgZmlsZSBsb2NhdGlvbgotICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gd2UgY2FuIHVzZSBmaWxlIHNjb3BpbmcgcnVsZXMgdG8gcHJ1bmUgdGhlIG1hdGNoZXMKLSAgICAgICAgSUZpbGUgdGFyZ2V0RmlsZSA9IG51bGw7Ci0gICAgICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgQ29tcG9uZW50U2VhcmNoUGF0dGVybikKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudFNlYXJjaFBhdHRlcm4gY29tcG9uZW50U2VhcmNoUGF0dGVybiA9IChDb21wb25lbnRTZWFyY2hQYXR0ZXJuKXBhdHRlcm47Ci0gICAgICAgICAgdGFyZ2V0RmlsZSA9IGNvbXBvbmVudFNlYXJjaFBhdHRlcm4uZ2V0RmlsZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9CQkKLSAgICAgICAgCi0JCS8vIGhlcmUgd2Ugc2hvdWxkIGhhdmUgaW4gc2NvcGUgb25seSByZWZlcmVuY2VkIGZpbGVzCi0JCUlGaWxlW10gZmlsZXMgPSBzY29wZS5lbmNsb3NpbmdGaWxlcygpOyAgCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCi0JCXsKLQkJCUlGaWxlIGZpbGUgPSBmaWxlc1tpXTsKLQkJCVN0cmluZyBwYXRoID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQlTZWFyY2hEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50U2V0LmdldFNlYXJjaERvY3VtZW50KHBhdGgsIGlkKTsgCi0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJCXsgICAgICAgICAgICAgIAotCQkJRW50cnlbXSBlbnRyaWVzID0gZG9jdW1lbnQuZ2V0RW50cmllcyhnZXRTZWFyY2hFbnRyeUNhdGVnb3J5KHBhdHRlcm4pLCBudWxsLCAwKTsgICAgICAgICAgIAotCQkJaWYgKChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggPiAwKSB8fCAoc2VhcmNoT3B0aW9ucyAhPSBudWxsICYmIHNlYXJjaE9wdGlvbnMuZ2V0KCJzZWFyY2hEaXJ0eUNvbnRlbnQiKSAhPSBudWxsKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy9mb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAvLyAgRW50cnkgZW50cnkgPSBlbnRyaWVzW2pdOwotICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJlbnRyeSAiICsgZW50cnkuZ2V0Q2F0ZWdvcnkoKSArICIgIiArIGVudHJ5LmdldEtleSgpICsgIiAiICsgZW50cnkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIC8vfSAgCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBib29sZWFuIGlzSW5TY29wZSA9IHRydWU7Ci0gICAgICAgICAgICAgIGlmICh0YXJnZXRGaWxlICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpc0luU2NvcGUgPSBpc0xpbmtlZChkb2N1bWVudFNldCwgImZpbGU6Ly8vIiArIHBhdGgsICJmaWxlOi8vLyIgKyB0YXJnZXRGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgICAgLy9pZiAocGF0aC5lbmRzV2l0aCgiQ2FuY2VsU2VsZWN0aW9uLndzZGwiKSAgJiYgcGF0aC5pbmRleE9mKCJjbG9uZTEiKSAhPSAtMSkKLSAgICAgICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgICAgLy8gIGZpbGVSZWZlcmVuY2VUYWJsZS5kZWJ1ZyhxdWFsaWZpZWRQYXRoLCAwLCA1KTsKLSAgICAgICAgICAgICAgICAgIC8vfSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKGlzSW5TY29wZSkKLSAgICAgICAgICAgICAgeyAKLQkJCSAgICB0aGlzLmxvY2F0ZU1hdGNoZXMocGF0dGVybiwgZG9jdW1lbnQsIHJlcXVlc3Rvciwgc2VhcmNoT3B0aW9ucywgbW9uaXRvcik7Ci0gICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgfQotCQkJfQotCQl9Ci0JCQotCQkKLQkJaWYgKGRlYnVnUGVyZikKLQkJewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBnZXREZXNjcmlwdGlvbigpCi0JCQkJCQkJKyAiOiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkgKyAibXMgZm9yIGxvY2F0ZU1hdGNoZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQkKLQl9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGlua2VkKFNlYXJjaERvY3VtZW50U2V0IHNldCwgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkKLSAgICB7Ci0gICAgICByZXR1cm4gaXNMaW5rZWQoc2V0LCBzb3VyY2UsIHRhcmdldCwgbmV3IEhhc2hNYXAoKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0xpbmtlZChTZWFyY2hEb2N1bWVudFNldCBzZXQsIFN0cmluZyBzb3VyY2UsIFN0cmluZyB0YXJnZXQsIEhhc2hNYXAgdmlzaXRlZCkKLSAgICB7Ci0gICAgICBpZiAoc291cmNlLmVxdWFscyh0YXJnZXQpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIAotICAgICAgU3RyaW5nIGZpbGVQcm90b2NvbCA9ICJmaWxlOi8vLyI7ICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgIAotICAgICAgLy8gRml4IGZvciBidWcgMjA0MTc0IC0gQmVnaW4KLSAgICAgIGlmKHRhcmdldC5jaGFyQXQoZmlsZVByb3RvY29sLmxlbmd0aCgpKSA9PSAnLycpICAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgICAgdGFyZ2V0ID0gZmlsZVByb3RvY29sICsgdGFyZ2V0LnN1YnN0cmluZyhmaWxlUHJvdG9jb2wubGVuZ3RoKCkgKyAxKTsKLSAgICAgIH0KLSAgICAgIC8vIEZpeCBmb3IgYnVnIDIwNDE3NCAtIEVuZAotICAgICAgICAgICAgCi0gICAgICBpZiAoc291cmNlLnN0YXJ0c1dpdGgoZmlsZVByb3RvY29sKSkKLSAgICAgIHsgICAgCi0gICAgICAgIAotICAgICAgU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQgPSBzZXQuX3RlbXBHZXRTZWFyY2hEb2N1bWV0bihzb3VyY2Uuc3Vic3RyaW5nKGZpbGVQcm90b2NvbC5sZW5ndGgoKSkpOyAgICAgIAotICAgICAgaWYgKGRvY3VtZW50ICE9IG51bGwpCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOyAgICAgICAgCi0gICAgICAgIEVudHJ5W10gZW50cmllcyA9IGRvY3VtZW50LmdldEVudHJpZXMoSVhNTFNlYXJjaENvbnN0YW50cy5SRUYsIG51bGwsIDApOwotICAgICAgICBTdHJpbmdbXSByZXNvbHZlRW50cnkgPSBuZXcgU3RyaW5nW2VudHJpZXMubGVuZ3RoXTsgICAgICAgIAotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXMubGVuZ3RoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBFbnRyeSBlbnRyeSA9IGVudHJpZXNbal07Ci0gICAgICAgICAgaWYgKGVudHJ5IGluc3RhbmNlb2YgRmlsZVJlZmVyZW5jZUVudHJ5KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVSZWZlcmVuY2VFbnRyeSBmaWxlUmVmZXJlbmNlRW50cnkgPSAoRmlsZVJlZmVyZW5jZUVudHJ5KWVudHJ5OwotICAgICAgICAgICAgLy8gVE9ETy4uIHJlY29yZCBhbiB1dGlsaXplIHRoZSBwdWJsaWMgaWQgZnJvbSB0aGUgZmlsZVJlZmVyZW5jZUVudHJ5Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaWYgKGZpbGVSZWZlcmVuY2VFbnRyeS5nZXRSZWxhdGl2ZUZpbGVQYXRoKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICBTdHJpbmcgcmVzb2x2ZWRVUkkgPSB1cmlSZXNvbHZlci5yZXNvbHZlKHNvdXJjZSwgbnVsbCwgZmlsZVJlZmVyZW5jZUVudHJ5LmdldFJlbGF0aXZlRmlsZVBhdGgoKSk7Ci0gICAgICAgICAgICAgIHJlc29sdmVFbnRyeVtqXSA9IHJlc29sdmVkVVJJOwotICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRVUkkuZXF1YWxzKHRhcmdldCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgfSAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBub3cgc2VlIGlmIHRoZXJlJ3MgYW4gaW5kaXJlY3QgbGluayBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlIHRhcmdldAotICAgICAgICAvLyB3ZSBrZWVwIHRyYWNrIG9mIHRoZSBub2RlcyB3ZSd2ZSBhbHJlYWR5IHZpc2l0ZWQgdG8gYXZvaWQgY3ljbGVzCi0gICAgICAgIGlmICh2aXNpdGVkLmdldChzb3VyY2UpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdGVkLnB1dChzb3VyY2UsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyaWVzLmxlbmd0aDsgaisrKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyByZXNvbHZlZFVSSSA9IHJlc29sdmVFbnRyeVtqXTsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlZFVSSSAhPSBudWxsICYmIGlzTGlua2VkKHNldCwgcmVzb2x2ZUVudHJ5W2pdLCB0YXJnZXQsIHZpc2l0ZWQpKSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgCi0gICAgICAgICAgfSAgICAKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0gICAgICAgICAgICAKLSAgICAgIH0gCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgCi0gICAgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VhcmNoRW50cnlDYXRlZ29yeShTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pewotCQlpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKXsKLQkJCXJldHVybiBJWE1MU2VhcmNoQ29uc3RhbnRzLkNPTVBPTkVOVF9ERUNMOwotCQl9Ci0JCWVsc2UgaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4pewotCQkJcmV0dXJuIElYTUxTZWFyY2hDb25zdGFudHMuQ09NUE9ORU5UX1JFRjsKLQkJfQotCQllbHNlIGlmKHBhdHRlcm4gaW5zdGFuY2VvZiBGaWxlUmVmZXJlbmNlUGF0dGVybil7Ci0JCSAgIHJldHVybiBJWE1MU2VhcmNoQ29uc3RhbnRzLkNPTVBPTkVOVF9SRUY7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfSAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTFNlYXJjaFBhdHRlcm4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxTZWFyY2hQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYjU4ZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTFNlYXJjaFBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotCi1wdWJsaWMgY2xhc3MgWE1MU2VhcmNoUGF0dGVybiBleHRlbmRzIFNlYXJjaFBhdHRlcm57Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZWxlbWVudE5hbWVzcGFjZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZWxlbWVudE5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHNlYXJjaE5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHNlYXJjaE5hbWVzcGFjZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcGFyZW50TmFtZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBpbnQgZGVwdGggPSAtMTsKLQotICAgIHB1YmxpYyBYTUxTZWFyY2hQYXR0ZXJuKFN0cmluZyBlbGVtZW50TmFtZXNwYWNlLCBTdHJpbmcgcGFyZW50RWxlbWVudE5hbWUsU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotICAgIAl0aGlzKGVsZW1lbnROYW1lc3BhY2UsIHBhcmVudEVsZW1lbnROYW1lLCBlbGVtZW50TmFtZSwgYXR0cmlidXRlTmFtZSwgLTEpOwotICAgIH0KLQkKLQlwdWJsaWMgWE1MU2VhcmNoUGF0dGVybihTdHJpbmcgZWxlbWVudE5hbWVzcGFjZSwgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotICAgICAgIHRoaXMoZWxlbWVudE5hbWVzcGFjZSwgbnVsbCwgZWxlbWVudE5hbWUsIGF0dHJpYnV0ZU5hbWUsIC0xKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFhNTFNlYXJjaFBhdHRlcm4oU3RyaW5nIGVsZW1lbnROYW1lc3BhY2UsIFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGludCBkZXB0aCkgewotICAgIAl0aGlzKGVsZW1lbnROYW1lc3BhY2UsIG51bGwsIGVsZW1lbnROYW1lLCBhdHRyaWJ1dGVOYW1lLCBkZXB0aCk7ICAgICAgIAotICAgIH0KLSAgICAgICAgICAgCi0gICAgcHJpdmF0ZSBYTUxTZWFyY2hQYXR0ZXJuKFN0cmluZyBlbGVtZW50TmFtZXNwYWNlLCBTdHJpbmcgcGFyZW50RWxlbWVudE5hbWUsIFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGludCBkZXB0aCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lOwotICAgICAgICB0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0gICAgICAgIHRoaXMucGFyZW50TmFtZSA9IHBhcmVudEVsZW1lbnROYW1lOwotICAgICAgICB0aGlzLmVsZW1lbnROYW1lc3BhY2UgPSBlbGVtZW50TmFtZXNwYWNlOwotICAgICAgICB0aGlzLmRlcHRoID0gZGVwdGg7Ci0gICAgfQotICAgIAotCXB1YmxpYyBYTUxTZWFyY2hQYXR0ZXJuKCl7Ci0JCQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBlbGVtZW50TmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VhcmNoTmFtZSgpIHsKLQkJcmV0dXJuIHNlYXJjaE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZWFyY2hOYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBzZWFyY2hOYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VhcmNoTmFtZShTdHJpbmcgc2VhcmNoTmFtZSkgewotCQl0aGlzLnNlYXJjaE5hbWUgPSBzZWFyY2hOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlYXJjaE5hbWVzcGFjZShTdHJpbmcgc2VhcmNoTmFtZXNwYWNlKSB7Ci0JCXRoaXMuc2VhcmNoTmFtZXNwYWNlID0gc2VhcmNoTmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU5hbWUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50TmFtZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnROYW1lc3BhY2UoU3RyaW5nIGVsZW1lbnROYW1lc3BhY2UpIHsKLQkJdGhpcy5lbGVtZW50TmFtZXNwYWNlID0gZWxlbWVudE5hbWVzcGFjZTsKLQl9Ci0KLSAgcHVibGljIGludCBnZXREZXB0aCgpCi0gIHsKLSAgICByZXR1cm4gZGVwdGg7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZXB0aChpbnQgZGVwdGgpCi0gIHsKLSAgICB0aGlzLmRlcHRoID0gZGVwdGg7Ci0gIH0KLQotcHVibGljIFN0cmluZyBnZXRQYXJlbnROYW1lKCkgewotCXJldHVybiBwYXJlbnROYW1lOwotfQotCi1wdWJsaWMgdm9pZCBzZXRQYXJlbnROYW1lKFN0cmluZyBwYXJlbnROYW1lKSB7Ci0JdGhpcy5wYXJlbnROYW1lID0gcGFyZW50TmFtZTsKLX0KLQkKLQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL0lYTUxTZWFyY2hDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL0lYTUxTZWFyY2hDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE2MGQ4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9JWE1MU2VhcmNoQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5pbXBsOwotCi1wdWJsaWMgaW50ZXJmYWNlIElYTUxTZWFyY2hDb25zdGFudHMKLXsKLQkJU3RyaW5nIFJFRj0gIm91dExpbmsiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBDT01QT05FTlRfREVDTCA9ICJjb21wb25lbnREZWNsIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgQ09NUE9ORU5UX1JFRiA9ICJjb21wb25lbnREZWNsIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YWUyMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQkKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQkKLQkvKioKLQkgKiBCaW5kIHRoZSBnaXZlbiBtZXNzYWdlJ3Mgc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmcgdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIG1hbmlwdWxhdGVkCi0JICogQHJldHVybiB0aGUgbWFuaXB1bGF0ZWQgU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gYmluZChtZXNzYWdlLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQmluZCB0aGUgZ2l2ZW4gbWVzc2FnZSdzIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBtYW5pcHVsYXRlZAotCSAqIEBwYXJhbSBiaW5kaW5nIHRoZSBvYmplY3QgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgbWVzc2FnZQotCSAqIEByZXR1cm4gdGhlIG1hbmlwdWxhdGVkIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBiaW5kaW5nKSB7Ci0JCXJldHVybiBiaW5kKG1lc3NhZ2UsIG5ldyBPYmplY3RbXSB7YmluZGluZ30pOwotCX0KLQotCS8qKgotCSAqIEJpbmQgdGhlIGdpdmVuIG1lc3NhZ2UncyBzdWJzdGl0dXRpb24gbG9jYXRpb25zIHdpdGggdGhlIGdpdmVuIHN0cmluZyB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbWFuaXB1bGF0ZWQKLQkgKiBAcGFyYW0gYmluZGluZzEgQW4gb2JqZWN0IHRvIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UKLQkgKiBAcGFyYW0gYmluZGluZzIgQSBzZWNvbmQgb2JqZWN0IHRvIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UKLQkgKiBAcmV0dXJuIHRoZSBtYW5pcHVsYXRlZCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgYmluZGluZzEsIE9iamVjdCBiaW5kaW5nMikgewotCQlyZXR1cm4gYmluZChtZXNzYWdlLCBuZXcgT2JqZWN0W10ge2JpbmRpbmcxLCBiaW5kaW5nMn0pOwotCX0KLQotCS8qKgotCSAqIEJpbmQgdGhlIGdpdmVuIG1lc3NhZ2UncyBzdWJzdGl0dXRpb24gbG9jYXRpb25zIHdpdGggdGhlIGdpdmVuIHN0cmluZyB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbWFuaXB1bGF0ZWQKLQkgKiBAcGFyYW0gYmluZGluZ3MgQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlCi0JICogQHJldHVybiB0aGUgbWFuaXB1bGF0ZWQgU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgbWVzc2FnZSwgT2JqZWN0W10gYmluZGluZ3MpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1lc3NhZ2UsIGJpbmRpbmdzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL1hNTFNlYXJjaERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9YTUxTZWFyY2hEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTA4YWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL1hNTFNlYXJjaERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTFNlYXJjaFBhcnRpY2lwYW50OwotCi1wdWJsaWMgY2xhc3MgWE1MU2VhcmNoRG9jdW1lbnQgZXh0ZW5kcyBTZWFyY2hEb2N1bWVudCB7Ci0JCi0JSURPTU1vZGVsIG1vZGVsOwotCU1hcCBlbnRyaWVzID0gbmV3IEhhc2hNYXAoKTsgLy8gY2F0ZWdvcnkgLT4gc2V0IChlbnRyeSkJCi0KLQlwdWJsaWMgWE1MU2VhcmNoRG9jdW1lbnQoU3RyaW5nIGRvY3VtZW50UGF0aCwgWE1MU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQpIHsKLQkJc3VwZXIoZG9jdW1lbnRQYXRoLCBwYXJ0aWNpcGFudCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNb2RlbCgpIHsKLQkJaWYobW9kZWwgPT0gbnVsbCl7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRpbmcgRE9NIGZvciAiICsgZ2V0UGF0aCgpKTsKLQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChnZXRQYXRoKCkpKTsKLQkJCWlmKGZpbGUgIT0gbnVsbCl7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9kZWwgPSAoSURPTU1vZGVsKVN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KGZpbGUpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIEVudHJ5W10gZ2V0RW50cmllcyhTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBrZXksIGludCBtYXRjaFJ1bGUpCi0JewotCQkvLyBUT0RPIHVzZSBtYXRjaFJ1bGUKLQkJU2V0IHJlc3VsdHMgPSBuZXcgSGFzaFNldCgpOwotCQlpZihjYXRlZ29yeSAhPSBudWxsKXsKLQkJCVNldCB2YWx1ZXMgPSAoU2V0KWVudHJpZXMuZ2V0KGNhdGVnb3J5KTsKLQkJCWlmKHZhbHVlcyA9PSBudWxsKXsKLQkJCQlyZXR1cm4gbmV3IEVudHJ5WzBdOwotCQkJfQotCQkJaWYoa2V5ID09IG51bGwgfHwgIiIuZXF1YWxzKGtleSkgfHwgIioiLmVxdWFscyhrZXkpKXsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJLy8gZW50cmllcyB3aXRoIGFueSBrZXkgaW4gdGhlIGdpdmVuIGNhdGVnb3J5Ci0JCQkJcmVzdWx0cy5hZGRBbGwodmFsdWVzKTsKLQkJCX0KLQkJCWVsc2V7Ci0JCQkJLy8gZW50cmllcyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZSBnaXZlbiBjYXRlZ29yeQotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHZhbHVlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCQkJewotCQkJCQlFbnRyeSBlbnRyeSA9IChFbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmKGtleS5lcXVhbHMoZW50cnkuZ2V0S2V5KCkpKXsKLQkJCQkJCXJlc3VsdHMuYWRkKGVudHJ5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0JCXJldHVybiAoRW50cnlbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBFbnRyeVtyZXN1bHRzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHB1dEVudHJ5KEVudHJ5IGVudHJ5KQotCXsKLQkJaWYoZW50cnkuZ2V0Q2F0ZWdvcnkoKSAhPSBudWxsKXsKLQkJCVNldCB2YWx1ZXMgPSAoU2V0KWVudHJpZXMuZ2V0KGVudHJ5LmdldENhdGVnb3J5KCkpOwotCQkJaWYodmFsdWVzID09IG51bGwpewotCQkJCWVudHJpZXMucHV0KGVudHJ5LmdldENhdGVnb3J5KCksIHZhbHVlcz1uZXcgSGFzaFNldCgpKTsKLQkJCX0KLQkJCXZhbHVlcy5hZGQoZW50cnkpOwotCQl9Ci0JCQotCX0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsgICAgIAotICAgICAgaWYgKG1vZGVsICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7ICAgICAgICAKLSAgICAgIH0gIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2FlYTk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvbWF0Y2hpbmcvUGF0dGVybk1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9QYXR0ZXJuTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTUxOGU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9QYXR0ZXJuTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWF0Y2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBtYXRjaGluZyBpbXBsZW1lbnRhdGlvbi4gIAotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG9mIHRoZSBQYXR0ZXJuTWF0Y2hlcyBzaG91bGQgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWMgcGF0dGVybiBtYXRjaGluZy4KLSAqIDwvcD4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBvZiB0aGUgUGF0dGVybk1hdGNoZXMgc2hvdWxkIGJlIHNldCBhcyBhZGFwdGVycyBmb3IgdGhlIHBhdHRlcm5zIHRoYXQgdGhleSBtYXRjaC4KLSAqIDwvcD4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50I3NlbGVjdERvY3VtZW50TG9jYXRpb25zKCl9IHdpbGwgY2FsbCAKLSAqIHsgQGxpbmsgUGF0dGVybk1hdGNoZXIjbWF0Y2hlcygpIH0gb24gdGhlIGFkYXB0ZXIgb24gcGF0dGVybiBtYXRjaGVyLgotICogCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudCNsb2NhdGVNYXRjaGVzKCl9IHdpbGwgY2FsbCAKLSAqIHsgQGxpbmsgUGF0dGVybk1hdGNoZXIjbG9jYXRlTWF0Y2hlcygpIH0gb24gdGhlIGFkYXB0ZXIgb24gcGF0dGVybiBtYXRjaGVyLgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFBhdHRlcm5NYXRjaGVyIHsKLQkKLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkb2VzIGRpdmUgYWN0dWFsIG1hdGNoIGxvY2F0aW9uIHRvIHRoZSByZXF1ZXN0b3IgaWYgdGhlcmUgYXJlIG1hdGNoZXMKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBsb2NhdGVNYXRjaGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUZpbGUgZmlsZSwgRWxlbWVudCBlbGVtZW50LCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG9ubHkgYW5zd2VycyBpZiB0aGUgcGF0dGVybiBtYXRjaGVzIGVsZW1lbnQsIGl0IGRvZXMgbm90IGdpdmUgYWN0dWFsIG1hdGNoIGxvY2F0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gbWF0Y2hlcyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIE9iamVjdCBlbGVtZW50KTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgU2VhcmNoTWF0Y2ggY3JlYXRlU2VhcmNoTWF0Y2goSUZpbGUgZmlsZSwgQXR0ciBhdHRyaWJ1dGVOb2RlKQotICAgIHsKLSAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgaW50IGxlbmd0aCA9IDA7Ci0gICAgICAgIGlmKGF0dHJpYnV0ZU5vZGUgaW5zdGFuY2VvZiBJRE9NQXR0cil7Ci0gICAgICAgICAgICBJRE9NQXR0ciBkb21BdHRyID0gKElET01BdHRyKWF0dHJpYnV0ZU5vZGU7Ci0gICAgICAgICAgICBzdGFydCA9IGRvbUF0dHIuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotICAgICAgICAgICAgbGVuZ3RoID0gZG9tQXR0ci5nZXRWYWx1ZVJlZ2lvblRleHQoKS5sZW5ndGgoKTsKLSAgICAgICAgfQotICAgICAgICBTZWFyY2hNYXRjaCBtYXRjaCA9IG5ldyBTZWFyY2hNYXRjaChhdHRyaWJ1dGVOb2RlLCBzdGFydCwgbGVuZ3RoLCBmaWxlKTsKLSAgICAgICAgcmV0dXJuIG1hdGNoOwotICAgIH0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYXRjaChTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElGaWxlIGZpbGUsIEF0dHIgYXR0cmlidXRlTm9kZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiYWRkTWF0Y2ggIiArIHBhdHRlcm4gKyAiICIgKyBhdHRyaWJ1dGVOb2RlLmdldE5hbWUoKSArICI9IiArIGF0dHJpYnV0ZU5vZGUuZ2V0VmFsdWUoKSk7Ci0JCWlmIChhdHRyaWJ1dGVOb2RlICE9IG51bGwpIHsKLQkJCQlTZWFyY2hNYXRjaCBtYXRjaCA9IGNyZWF0ZVNlYXJjaE1hdGNoKGZpbGUsIGF0dHJpYnV0ZU5vZGUpOyAgICAgICAgICAgICAgICAKLQkJCQlpZihyZXF1ZXN0b3IgIT0gbnVsbCl7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXF1ZXN0b3IuYWNjZXB0U2VhcmNoTWF0Y2gobWF0Y2gpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vZG8gbm90aGluZwotCQkJCQl9Ci0JCQkJfQotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9TQVhTZWFyY2hFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvbWF0Y2hpbmcvU0FYU2VhcmNoRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWVjNGExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9TQVhTZWFyY2hFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotcHVibGljIGNsYXNzIFNBWFNlYXJjaEVsZW1lbnR7Ci0JQXR0cmlidXRlcyBhdHRyaWJ1dGVzOwotCVN0cmluZyBlbGVtZW50TmFtZTsKLQlTdHJpbmcgZWxlbWVudE5hbWVzcGFjZTsKLQlNYXAgbmFtZXNwYWNlTWFwID0gbmV3IEhhc2hNYXAoKTsgLy8gTWFwIG9mIHN0cmluZyBwcmVmaXgga2V5cyBhbmQgbmFtZXNwYWNlCi0JU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIHBhcmVudE5hbWU7Ci0gICAgaW50IGRlcHRoID0gLTE7Ci0JCi0JcHVibGljIFNBWFNlYXJjaEVsZW1lbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCXB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZWxlbWVudE5hbWU7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnROYW1lc3BhY2U7Ci0JfQotCXB1YmxpYyBNYXAgZ2V0TmFtZXNwYWNlTWFwKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlTWFwOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLQl9Ci0JcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWVzcGFjZShTdHJpbmcgZWxlbWVudE5hbWVzcGFjZSkgewotCQl0aGlzLmVsZW1lbnROYW1lc3BhY2UgPSBlbGVtZW50TmFtZXNwYWNlOwotCX0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VNYXAoTWFwIG5hbWVzcGFjZU1hcCkgewotCQl0aGlzLm5hbWVzcGFjZU1hcCA9IG5hbWVzcGFjZU1hcDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLQkJdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0JfQotICBwdWJsaWMgaW50IGdldERlcHRoKCkKLSAgewotICAgIHJldHVybiBkZXB0aDsKLSAgfQotICBwdWJsaWMgdm9pZCBzZXREZXB0aChpbnQgZGVwdGgpCi0gIHsKLSAgICB0aGlzLmRlcHRoID0gZGVwdGg7Ci0gIH0KLXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50TmFtZSgpIHsKLQlyZXR1cm4gcGFyZW50TmFtZTsKLX0KLXB1YmxpYyB2b2lkIHNldFBhcmVudE5hbWUoU3RyaW5nIHBhcmVudE5hbWUpIHsKLQl0aGlzLnBhcmVudE5hbWUgPSBwYXJlbnROYW1lOwotfQotCQotCQotCQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9YTUxTZWFyY2hQYXR0ZXJuTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1hNTFNlYXJjaFBhdHRlcm5NYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOGUzNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1hNTFNlYXJjaFBhdHRlcm5NYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWF0Y2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgWE1MU2VhcmNoUGF0dGVybk1hdGNoZXIgZXh0ZW5kcyBQYXR0ZXJuTWF0Y2hlcnsKLQkKLSAgIC8qKgotICAgICogVGhlIGFjdGl2ZSBzZWFyY2ggcGFydGljaXBhbnQuCi0gICAgKi8KLSAgICBwcml2YXRlIFNlYXJjaFBhcnRpY2lwYW50IHNlYXJjaFBhcnRpY2lwYW50OwotICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgcGF0dGVybiBtYXRjaGVyIGdpdmVuIGEgc2VhcmNoIHBhcnRpY2lwYW50LgotICAgICAqIEBwYXJhbSBzZWFyY2hQYXJ0aWNpcGFudCB0aGUgYWN0aXZlIHtAbGluayBTZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2ggcGFydGljaXBhbnR9LgotICAgICAqLwotICAgIHB1YmxpYyBYTUxTZWFyY2hQYXR0ZXJuTWF0Y2hlcihTZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2hQYXJ0aWNpcGFudCkKLSAgICB7Ci0gICAgICB0aGlzLnNlYXJjaFBhcnRpY2lwYW50ID0gc2VhcmNoUGFydGljaXBhbnQ7Ci0gICAgfQotICAgIAotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZU5hbWVzcGFjZUZvclByZWZpeChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwcmVmaXgpCi0JewotCSAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JICBmb3IgKE5vZGUgbm9kZSA9IGVsZW1lbnQ7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKQotCSAgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotCQl7Ci0JCSAgRWxlbWVudCBlID0gKEVsZW1lbnQpbm9kZTsKLQkJICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSA/ICgieG1sbnM6IiArIHByZWZpeCkgOiAieG1sbnMiOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgcmVzdWx0ID0gZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgPyBlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA6IG51bGw7Ci0JCSAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGgoKSA+IDApCi0JCSAgewotCQkJIGJyZWFrOyAgCi0JCSAgfQkgIAotCQl9CQotCSAgfQkgIAotCSAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhNTFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgRWxlbWVudCBkb21FbGVtZW50KSB7Ci0JCi0JCQlwYXR0ZXJuLnNldEVsZW1lbnROYW1lKGRvbUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotCQkJcGF0dGVybi5zZXRFbGVtZW50TmFtZXNwYWNlKGRvbUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgLy8gVE9ETyAoY3MpIHNldCB0aGUgZGVwdGggYXR0cmlidXRlIG9uIHRoZSBwYXR0ZXJuCi0gICAgICAgICAgICAvLwotCQkJU3RyaW5nIGFjdHVhbFZhbHVlID0gZG9tRWxlbWVudC5oYXNBdHRyaWJ1dGUocGF0dGVybi5nZXRBdHRyaWJ1dGVOYW1lKCkpID8gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUocGF0dGVybi5nZXRBdHRyaWJ1dGVOYW1lKCkpIDogbnVsbDsKLQkJCSBpZihhY3R1YWxWYWx1ZSAhPSBudWxsICYmIGFjdHVhbFZhbHVlLmxlbmd0aCgpID4gMCl7Ci0JCQkJCWludCBuID0gYWN0dWFsVmFsdWUuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmKG4gPiAwKXsKLQkJCQkJCVN0cmluZyBwcmVmaXggPSBhY3R1YWxWYWx1ZS5zdWJzdHJpbmcoMCwgbik7Ci0JCQkJCQlwYXR0ZXJuLnNldFNlYXJjaE5hbWUoYWN0dWFsVmFsdWUuc3Vic3RyaW5nKG4rMSkpOyAgICAgIAotCQkJCQkJCi0JCQkJCQlTdHJpbmcgbmFtZXNwYWNlID0gY29tcHV0ZU5hbWVzcGFjZUZvclByZWZpeChkb21FbGVtZW50LCBwcmVmaXgpOwotCQkJCQkJcGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2UobmFtZXNwYWNlKTsKLQkJCQkJCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlwYXR0ZXJuLnNldFNlYXJjaE5hbWUoYWN0dWFsVmFsdWUpOwotCQkJCQkJcGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2UoZG9tRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJICAgIH0KLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWE1MU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBTQVhTZWFyY2hFbGVtZW50IHNheEVsZW1lbnQpIHsKLQkJCi0JCXBhdHRlcm4uc2V0RWxlbWVudE5hbWUoc2F4RWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKLQkJcGF0dGVybi5zZXRFbGVtZW50TmFtZXNwYWNlKHNheEVsZW1lbnQuZ2V0RWxlbWVudE5hbWVzcGFjZSgpKTsKLSAgICAgICAgcGF0dGVybi5zZXREZXB0aChzYXhFbGVtZW50LmdldERlcHRoKCkpOwotICAgICAgICBwYXR0ZXJuLnNldFBhcmVudE5hbWUoc2F4RWxlbWVudC5nZXRQYXJlbnROYW1lKCkpOwotCQlTdHJpbmcgYWN0dWFsVmFsdWUgPSBzYXhFbGVtZW50LmdldEF0dHJpYnV0ZXMoKS5nZXRWYWx1ZShwYXR0ZXJuLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCSBpZihhY3R1YWxWYWx1ZSAhPSBudWxsKXsKLQkJCQlpbnQgbiA9IGFjdHVhbFZhbHVlLmluZGV4T2YoIjoiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKG4gPiAwKXsKLQkJCQkJU3RyaW5nIHByZWZpeCA9IGFjdHVhbFZhbHVlLnN1YnN0cmluZygwLCBuKTsKLQkJCQkJcGF0dGVybi5zZXRTZWFyY2hOYW1lKGFjdHVhbFZhbHVlLnN1YnN0cmluZyhuKzEpKTsKLQkJCQkJcGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2UoKFN0cmluZylzYXhFbGVtZW50LmdldE5hbWVzcGFjZU1hcCgpLmdldChwcmVmaXgpKTsKLQkJCQkKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXBhdHRlcm4uc2V0U2VhcmNoTmFtZShhY3R1YWxWYWx1ZSk7Ci0JCQkJCXBhdHRlcm4uc2V0U2VhcmNoTmFtZXNwYWNlKHNheEVsZW1lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCQkJCX0KLQkJICAgIH0KLQkKLQl9Ci0JCi0JWE1MU2VhcmNoUGF0dGVybiBzZWFyY2hQYXR0ZXJuOwotCQotCXB1YmxpYyBYTUxTZWFyY2hQYXR0ZXJuTWF0Y2hlcigpIHsKLQkJc3VwZXIoKTsKLQkJCi0JfQotCi0JCi0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkb2VzIGRpdmUgYWN0dWFsIG1hdGNoIGxvY2F0aW9uIHRvIHRoZSByZXF1ZXN0b3IgaWYgdGhlcmUgYXJlIG1hdGNoZXMKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBsb2NhdGVNYXRjaGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUZpbGUgZmlsZSwgRWxlbWVudCBlbGVtZW50LCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0JCWlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKXsKLQkJCVhNTFNlYXJjaFBhdHRlcm5bXSBjaGlsZFBhdHRlcm5zID0gKChYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKXBhdHRlcm4pLmdldENoaWxkcmVuKHNlYXJjaFBhcnRpY2lwYW50KTsKLQkJCWlmIChjaGlsZFBhdHRlcm5zID09IG51bGwpewotCQkJICByZXR1cm47Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkUGF0dGVybnMubGVuZ3RoOyBpKyspIHsKLQkJCQlQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyID0gKFBhdHRlcm5NYXRjaGVyKWNoaWxkUGF0dGVybnNbaV0uZ2V0QWRhcHRlcihQYXR0ZXJuTWF0Y2hlci5jbGFzcyk7Ci0JCQkJaWYobWF0Y2hlciA9PSBudWxsKXsKLQkJCQkJbWF0Y2hlciA9IHRoaXM7Ci0JCQkJfQotCQkJCWlmKG1hdGNoZXIgIT0gbnVsbCl7Ci0JCQkJCW1hdGNoZXIubG9jYXRlTWF0Y2hlcyhjaGlsZFBhdHRlcm5zW2ldLCBmaWxlLCBlbGVtZW50LCByZXF1ZXN0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxTZWFyY2hQYXR0ZXJuKXsKLQkJCWlmKG1hdGNoZXMocGF0dGVybiwgZWxlbWVudCkpewotCQkJCUF0dHIgYXR0cmlidXRlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCgoWE1MU2VhcmNoUGF0dGVybilwYXR0ZXJuKS5nZXRBdHRyaWJ1dGVOYW1lKCkpOwotCQkJCWFkZE1hdGNoKHBhdHRlcm4sIGZpbGUsIGF0dHJpYnV0ZSwgcmVxdWVzdG9yKTsKLQkJCX0KLQkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgb25seSBhbnN3ZXJzIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgZWxlbWVudCwgaXQgZG9lcyBub3QgZ2l2ZSBhY3R1YWwgbWF0Y2ggbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgT2JqZWN0IGVsZW1lbnQpewotCQlpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybil7Ci0JCQlYTUxTZWFyY2hQYXR0ZXJuW10gY2hpbGRQYXR0ZXJucyA9ICgoWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybilwYXR0ZXJuKS5nZXRDaGlsZHJlbihzZWFyY2hQYXJ0aWNpcGFudCk7Ci0gICAgICAgICAgICBpZiAoY2hpbGRQYXR0ZXJucyA9PSBudWxsKXsKLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZFBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUGF0dGVybk1hdGNoZXIgbWF0Y2hlciA9IChQYXR0ZXJuTWF0Y2hlciljaGlsZFBhdHRlcm5zW2ldLmdldEFkYXB0ZXIoUGF0dGVybk1hdGNoZXIuY2xhc3MpOwotCQkJCWlmKG1hdGNoZXIgPT0gbnVsbCl7Ci0JCQkJCW1hdGNoZXIgPSB0aGlzOwotCQkJCX0KLQkJCQlpZihtYXRjaGVyICE9IG51bGwpewotCQkJCQlpZihtYXRjaGVyLm1hdGNoZXMoY2hpbGRQYXR0ZXJuc1tpXSwgZWxlbWVudCkpewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MU2VhcmNoUGF0dGVybil7Ci0JCQkKLQkJCVhNTFNlYXJjaFBhdHRlcm4gcG9zc2libGVNYXRjaCA9IG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCk7Ci0JCQlwb3NzaWJsZU1hdGNoLnNldEF0dHJpYnV0ZU5hbWUoKChYTUxTZWFyY2hQYXR0ZXJuKXBhdHRlcm4pLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCl7Ci0JCQkJaW5pdGlhbGl6ZShwb3NzaWJsZU1hdGNoLCAoRWxlbWVudCllbGVtZW50KTsKLQkJCX0KLQkJCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIFNBWFNlYXJjaEVsZW1lbnQpewotCQkJCWluaXRpYWxpemUocG9zc2libGVNYXRjaCwgKFNBWFNlYXJjaEVsZW1lbnQpZWxlbWVudCk7Ci0JCQl9Ci0JCQlzZWFyY2hQYXR0ZXJuID0gKFhNTFNlYXJjaFBhdHRlcm4pcGF0dGVybjsKLQkJCXJldHVybiBtYXRjaGVzUGF0dGVybihwb3NzaWJsZU1hdGNoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoZXNQYXR0ZXJuKFNlYXJjaFBhdHRlcm4gcGF0dGVybikgewotCQlpZihzZWFyY2hQYXR0ZXJuICE9IG51bGwgJiYgcGF0dGVybiBpbnN0YW5jZW9mIFhNTFNlYXJjaFBhdHRlcm4pewotCQkJWE1MU2VhcmNoUGF0dGVybiBkZWNvZGVkUGF0dGVybiA9IChYTUxTZWFyY2hQYXR0ZXJuKXBhdHRlcm47Ci0gICAgICAgICAgICBpZihzZWFyY2hQYXR0ZXJuLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGRlY29kZWRQYXR0ZXJuLmdldEVsZW1lbnROYW1lKCkpICYmICAgICAgICAgICAgICAgICAgICAKLQkJCQkJc2VhcmNoUGF0dGVybi5nZXRFbGVtZW50TmFtZXNwYWNlKCkuZXF1YWxzKGRlY29kZWRQYXR0ZXJuLmdldEVsZW1lbnROYW1lc3BhY2UoKSkpeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZihzZWFyY2hQYXR0ZXJuLmdldFBhcmVudE5hbWUoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgZGVjb2RlZFBhdHRlcm4uZ2V0UGFyZW50TmFtZSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAhc2VhcmNoUGF0dGVybi5nZXRQYXJlbnROYW1lKCkuZXF1YWxzKGRlY29kZWRQYXR0ZXJuLmdldFBhcmVudE5hbWUoKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgCi0gICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgaWYoc2VhcmNoUGF0dGVybi5nZXRTZWFyY2hOYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIioiLmVxdWFscyhzZWFyY2hQYXR0ZXJuLmdldFNlYXJjaE5hbWUoKSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICBlbHNlIGlmKHNlYXJjaFBhdHRlcm4uZ2V0U2VhcmNoTmFtZXNwYWNlKCkgPT0gbnVsbCl7Ci0JCQkJCXJldHVybiBzZWFyY2hQYXR0ZXJuLmdldFNlYXJjaE5hbWUoKS5lcXVhbHMoZGVjb2RlZFBhdHRlcm4uZ2V0U2VhcmNoTmFtZSgpKTsKLQkJCQl9Ci0JCQkJZWxzZXsKLQkJCQkJcmV0dXJuIHNlYXJjaFBhdHRlcm4uZ2V0U2VhcmNoTmFtZSgpLmVxdWFscyhkZWNvZGVkUGF0dGVybi5nZXRTZWFyY2hOYW1lKCkpICYmCi0JCQkJCXNlYXJjaFBhdHRlcm4uZ2V0U2VhcmNoTmFtZXNwYWNlKCkuZXF1YWxzKGRlY29kZWRQYXR0ZXJuLmdldFNlYXJjaE5hbWVzcGFjZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0gICAgCi0gICAgcHJvdGVjdGVkIFNlYXJjaE1hdGNoIGNyZWF0ZVNlYXJjaE1hdGNoKElGaWxlIGZpbGUsIEF0dHIgYXR0cmlidXRlTm9kZSkKLSAgICB7Ci0gICAgICBTZWFyY2hNYXRjaCBtYXRjaCA9IHN1cGVyLmNyZWF0ZVNlYXJjaE1hdGNoKGZpbGUsIGF0dHJpYnV0ZU5vZGUpOwotICAgICAgLy8gdG9kby4uLiByZW1vdmUgdGhpcyB1Z2x5IGhhY2shIQotICAgICAgaWYgKCJuYW1lIi5lcXVhbHMoYXR0cmlidXRlTm9kZS5nZXROYW1lKCkpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKCJ0b2RvLWNvbXB1dGUtdGFyZ2V0TmFtZXNwYWNlIiwgYXR0cmlidXRlTm9kZS5nZXRWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtYXRjaC5tYXAucHV0KCJuYW1lIiwgcXVhbGlmaWVkTmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIC8vRWxlbWVudCBlbGVtZW50ID0gYXR0cmlidXRlTm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAvL2lmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIikpCi0gICAgICAvL3sgICAgICAgIAotICAgICAgLy99ICAKLSAgICAgIHJldHVybiBtYXRjaDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9xdWlja3NjYW4vWE1MUXVpY2tTY2FuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvcXVpY2tzY2FuL1hNTFF1aWNrU2Nhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjhhMTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9xdWlja3NjYW4vWE1MUXVpY2tTY2FuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gucXVpY2tzY2FuOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1hdGNoaW5nLlBhdHRlcm5NYXRjaGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWE1MUXVpY2tTY2FuCi17Ci0gICAgLyoKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIGZ1bGxGaWxlUGF0aCkKLQl7Ci0JCVhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIoKTsKLQkJcGFyc2VGaWxlKGZ1bGxGaWxlUGF0aCwgaGFuZGxlcik7Ci0JCXJldHVybiBoYW5kbGVyLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCX0qLwotCQotCS8qCi0JICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBtYXRjaGVzIGVuY291bnRlcmVkIGJhc2VkIG9uIHRoZSBjcml0ZXJpYQotCSAqIHByb3ZpZGVkLgotCSAqCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc01hdGNoKFN0cmluZyBmdWxsRmlsZVBhdGgsIFBhdHRlcm5NYXRjaGVyIG1hdGNoZXIsIFNlYXJjaFBhdHRlcm4gcGF0dGVybikKLQl7Ci0JCVhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIobWF0Y2hlciwgcGF0dGVybik7Ci0JCXBhcnNlRmlsZShmdWxsRmlsZVBhdGgsIGhhbmRsZXIpOwotCQlyZXR1cm4gaGFuZGxlci5oYXNNYXRjaCgpOwotCX0qLwotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwb3B1bGF0ZVNlYXJjaERvY3VtZW50KFNlYXJjaERvY3VtZW50IGRvY3VtZW50LCBQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pCi0JewotCQlYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlciBoYW5kbGVyID0gbmV3IFhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyKGRvY3VtZW50LCBtYXRjaGVyLCBwYXR0ZXJuKTsKLQkJcGFyc2VGaWxlKGRvY3VtZW50LmdldFBhdGgoKSwgaGFuZGxlcik7Ci0JCXJldHVybiBoYW5kbGVyLmhhc01hdGNoKCk7Ci0JfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgWE1MUmVhZGVyIHJlYWRlcjsKLSAgICBwcml2YXRlIHN0YXRpYyBYTUxSZWFkZXIgZ2V0T3JDcmVhdGVSZWFkZXIoKQotICAgIHsKLSAgICAgICBpZiAocmVhZGVyID09IG51bGwpCi0gICAgICAgewotICAgICAgICAgdHJ5Ci0gICAgICAgICB7Ci0gICAgICAgICAgU0FYUGFyc2VyIHBhcnNlciA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgICAgICByZWFkZXIgPSBwYXJzZXIuZ2V0WE1MUmVhZGVyKCk7ICAKLSAgICAgICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHJlYWRlci5zZXRFcnJvckhhbmRsZXIobmV3IEludGVybmFsRXJyb3JIYW5kbGVyKCkpOyAgICAgICAgICAKLSAgICAgICAgIH0KLSAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgIHsgICAgICAgICAgIAotICAgICAgICAgfQotICAgICAgIH0gCi0gICAgICAgcmV0dXJuIHJlYWRlcjsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIGNsYXNzIEludGVybmFsRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyCi0gICAgewotICAgICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7ICAgICAgICAgIAotICAgICAgfQotICAgICAgCi0gICAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgewotICAgICAgfQotICAgICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgIHsgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICAKLQlwcml2YXRlIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBwYXJzZUZpbGUoU3RyaW5nIGZ1bGxGaWxlUGF0aCwKLQkJCVhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyIGhhbmRsZXIpCi0JewotCQlGaWxlSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQl0cnkKLQkJeyAgICAgICAgICAgIAotCQkJaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGZ1bGxGaWxlUGF0aCkpOwotCQkJWE1MUmVhZGVyIHJlYWRlciA9IGdldE9yQ3JlYXRlUmVhZGVyKCk7Ci0gICAgICAgICAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigicGFyc2VGaWxlIiArIHJlYWRlciArICIgKCIgKyAgZnVsbEZpbGVQYXRoICsgIikiKTsJCQkKLQkJCXJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW5wdXRTdHJlYW0pKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JCXsKLQkJCS8vIHNraXAgdGhlIGZpbGUKLQkJfSAKLQkJZmluYWxseXsKLQkJCWlmKGlucHV0U3RyZWFtICE9IG51bGwpewotCQkJCXRyeSB7Ci0JCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyBjYW4gbm90IGRvIG11Y2ggCi0JCQkJfQotCQkJfQotCQkJCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvcXVpY2tzY2FuL1hNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvcXVpY2tzY2FuL1hNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZDg3Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL3F1aWNrc2Nhbi9YTUxRdWlja1NjYW5Db250ZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLnF1aWNrc2NhbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5Db21wb25lbnREZWNsYXJhdGlvbkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuQ29tcG9uZW50UmVmZXJlbmNlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5GaWxlUmVmZXJlbmNlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5pbXBsLklYTUxTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZy5QYXR0ZXJuTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1hdGNoaW5nLlNBWFNlYXJjaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgU0FYIGNvbnRlbnQgaGFuZGxlciwgaXQgc2hvdWxkIGJlIHJlY3ljbGVkIGJlZm9yZSBzY2FubmluZyBhIGZpbGUgZm9yIHRoZSBuZXcgU2VhcmNoUGF0dGVybi4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyCi17Ci0JcHJpdmF0ZSBNYXAgbmFtZXNwYWNlTWFwID0gbmV3IEhhc2hNYXAoKTsgLy8gTWFwIG9mIHN0cmluZyBwcmVmaXgga2V5cyBhbmQgbmFtZXNwYWNlCi0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIFNlYXJjaFBhdHRlcm4gcGF0dGVybjsKLQlwcml2YXRlIFNlYXJjaERvY3VtZW50IGRvY3VtZW50OyAgLy8gd2UnbGwgYWRkIHVzZWZ1bCBlbnRyaWVzIGluIHRoZSBzZWFyY2ggZG9jdW1lbnQgYXMgd2UgcGFyc2luZwotCXByaXZhdGUgU0FYU2VhcmNoRWxlbWVudCBzZWFyY2hFbGVtZW50ID0gbmV3IFNBWFNlYXJjaEVsZW1lbnQoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaCA9IGZhbHNlOwotCXByaXZhdGUgU3RhY2sgY3VycmVudFBhdGggPSBuZXcgU3RhY2soKTsKLQlwcml2YXRlIFBhdHRlcm5NYXRjaGVyIG1hdGNoZXI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MU0NIRU1BX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9OQU1FU1BBQ0UgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iOyAvLyROT04tTkxTLTEkCi0KLQkKLQlwdWJsaWMgWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIoUGF0dGVybk1hdGNoZXIgbWF0Y2hlciwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucGF0dGVybiA9IHBhdHRlcm47Ci0JCXRoaXMubWF0Y2hlciA9IG1hdGNoZXI7Ci0JfQotCQotCXB1YmxpYyBYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlcihTZWFyY2hEb2N1bWVudCBkb2N1bWVudCwgUGF0dGVybk1hdGNoZXIgbWF0Y2hlciwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucGF0dGVybiA9IHBhdHRlcm47Ci0JCXRoaXMubWF0Y2hlciA9IG1hdGNoZXI7Ci0JCXRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKLQl9Ci0JCi0JcHVibGljIFhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsCi0JCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24KLQl7CQotCQkvLyBTZWFyY2ggZm9yIHRhcmdldE5hbWVzcGFjZSBpZiB3ZSBoYXZlbid0IGVuY291bnRlcmVkIGl0IHlldC4KLQkJaWYgKHRhcmdldE5hbWVzcGFjZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCWludCBuQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5BdHRyaWJ1dGVzOyBpKyspCi0JCQl7Ci0JCQkJaWYgKCJ0YXJnZXROYW1lc3BhY2UiLmVxdWFscyhhdHRyaWJ1dGVzLmdldFFOYW1lKGkpKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJdGFyZ2V0TmFtZXNwYWNlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBjb2xsZWN0IGxpbmsgaW5mbwotICAgIAotICAgIC8vIFRPRE8gVGhpcyBjb2RlIHNob3VsZCBiZSByZWZhY3RvcmVkIHRvIGRlbGVnYXRlIHRoZSByZXNwb25zaWJpbGl0eSB0bwotICAgIC8vIGRldGVjdCBsaW5rcyBiZXR3ZWVuIGZpbGVzIHRvIHRoZSBzZWFyY2ggcHJvdmlkZXJzL2NvbnRyaWJ1dG9ycy4KLSAgICAvLyBUaGUgY3VycmVudCBjb2RlIG9ubHkgaGFuZGxlcyB0aGUgWFNEIGFuZCBXU0RMIGNhc2VzLiAKLSAgICAKLQkJaWYoImltcG9ydCIuZXF1YWxzKGxvY2FsTmFtZSkgJiYgbmFtZXNwYWNlTWF0Y2hlcyh1cmkpKXsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZVJlZmVyZW5jZUVudHJ5IGRvY3VtZW50RW50cnkgPSBuZXcgRmlsZVJlZmVyZW5jZUVudHJ5KCk7Ci0JCQlkb2N1bWVudEVudHJ5LnNldENhdGVnb3J5KElYTUxTZWFyY2hDb25zdGFudHMuUkVGKTsKLQkJCWRvY3VtZW50RW50cnkuc2V0S2V5KCJpbXBvcnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG5hbWVzcGFjZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5hbWVzcGFjZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbG9jYXRpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGdldExvY2F0aW9uQXR0cmlidXRlTmFtZSh1cmkpKTsgLy8kTk9OLU5MUy0xJAotCQkJZG9jdW1lbnRFbnRyeS5zZXRQdWJsaWNJZGVudGlmaWVyKG5hbWVzcGFjZSk7Ci0JCQlkb2N1bWVudEVudHJ5LnNldFJlbGF0aXZlRmlsZVBhdGgobG9jYXRpb24pOyAgICAgICAgICAgIAotCQkJZG9jdW1lbnQucHV0RW50cnkoZG9jdW1lbnRFbnRyeSk7Ci0JCX0KLQkJaWYoKCJyZWRlZmluZSIuZXF1YWxzKGxvY2FsTmFtZSl8fCAiaW5jbHVkZSIuZXF1YWxzKGxvY2FsTmFtZSkpICYmIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW5hbWVzcGFjZU1hdGNoZXModXJpKSl7Ci0JCQlGaWxlUmVmZXJlbmNlRW50cnkgZG9jdW1lbnRFbnRyeSA9IG5ldyBGaWxlUmVmZXJlbmNlRW50cnkoKTsKLQkJCWRvY3VtZW50RW50cnkuc2V0Q2F0ZWdvcnkoSVhNTFNlYXJjaENvbnN0YW50cy5SRUYpOwotCQkJZG9jdW1lbnRFbnRyeS5zZXRLZXkoImluY2x1ZGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGxvY2F0aW9uID0gYXR0cmlidXRlcy5nZXRWYWx1ZShnZXRMb2NhdGlvbkF0dHJpYnV0ZU5hbWUodXJpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRvY3VtZW50RW50cnkuc2V0UHVibGljSWRlbnRpZmllcih1cmkpOwotCQkJZG9jdW1lbnRFbnRyeS5zZXRSZWxhdGl2ZUZpbGVQYXRoKGxvY2F0aW9uKTsKLQkJCWRvY3VtZW50LnB1dEVudHJ5KGRvY3VtZW50RW50cnkpOwotCQl9Ci0JCQotCQkKLSAgICAgICAgLy8gaXNzdWUgKGNzKSB5b3UgbWF5IHdhbnQgdG8gdHJ5IHBlcmYgbWVhc3VyZW1lbnRzIHRvIGNvbXBhdGUgcmV1c2luZyB0aGUgc2FtZQotICAgICAgICAvLyBpbnN0YW5jZSBvZiBhIFNBWFNlYXJjaEVsZW1lbnQgaW5zdGVhZCBvZiBuZXdpbmcgb25lIGVhY2ggdGltZSAKLQkJLy9YTUxTZWFyY2hQYXR0ZXJuLlNBWFNlYXJjaEVsZW1lbnQgc2VhcmNoRWxlbWVudCA9IG5ldyBYTUxTZWFyY2hQYXR0ZXJuLlNBWFNlYXJjaEVsZW1lbnQoKTsKLQkJc2VhcmNoRWxlbWVudC5zZXRFbGVtZW50TmFtZShsb2NhbE5hbWUpOwotCQlzZWFyY2hFbGVtZW50LnNldEVsZW1lbnROYW1lc3BhY2UodXJpKTsKLQkJc2VhcmNoRWxlbWVudC5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCQlzZWFyY2hFbGVtZW50LnNldE5hbWVzcGFjZU1hcChuYW1lc3BhY2VNYXApOwotCQlzZWFyY2hFbGVtZW50LnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotCQlpZiAoY3VycmVudFBhdGguc2l6ZSgpID4gMCkKLQkJewotCQkgIFN0cmluZyBwYXJlbnROYW1lID0gKFN0cmluZyljdXJyZW50UGF0aC5wZWVrKCk7Ci0JCSAgc2VhcmNoRWxlbWVudC5zZXRQYXJlbnROYW1lKHBhcmVudE5hbWUpOwotCQl9CQkJCi0JCi0KLQkJaWYobWF0Y2hlciAhPSBudWxsKXsKLQkJCWlmKG1hdGNoZXIubWF0Y2hlcyhwYXR0ZXJuLCBzZWFyY2hFbGVtZW50KSl7Ci0JCQkJaGFzTWF0Y2ggPSB0cnVlOwotCQkJCWlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKXsKLQkJCQkJQ29tcG9uZW50UmVmZXJlbmNlRW50cnkgZG9jdW1lbnRFbnRyeSA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VFbnRyeSgpOwotCQkJCQlkb2N1bWVudEVudHJ5LnNldENhdGVnb3J5KElYTUxTZWFyY2hDb25zdGFudHMuQ09NUE9ORU5UX1JFRik7Ci0JCQkJCVF1YWxpZmllZE5hbWUgbmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKHVyaSwgbG9jYWxOYW1lKTsKLQkJCQkJZG9jdW1lbnRFbnRyeS5zZXRLZXkobmFtZS50b1N0cmluZygpKTsKLQkJCQkJZG9jdW1lbnRFbnRyeS5zZXROYW1lKG5hbWUpOwotCQkJCQlkb2N1bWVudC5wdXRFbnRyeShkb2N1bWVudEVudHJ5KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKXsKLQkJCQkJQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeSBkb2N1bWVudEVudHJ5ID0gbmV3IENvbXBvbmVudERlY2xhcmF0aW9uRW50cnkoKTsKLQkJCQkJZG9jdW1lbnRFbnRyeS5zZXRDYXRlZ29yeShJWE1MU2VhcmNoQ29uc3RhbnRzLkNPTVBPTkVOVF9ERUNMKTsKLSAgICAgICAgICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBuYW1lID0gbmV3IFF1YWxpZmllZE5hbWUodGFyZ2V0TmFtZXNwYWNlLCBhdHRyaWJ1dGVzLmdldFZhbHVlKCJuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCVF1YWxpZmllZE5hbWUgbWV0YU5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZSh1cmksIGxvY2FsTmFtZSk7ICAgICAgICAgICAgICAgICAgICAKLQkJCQkJZG9jdW1lbnRFbnRyeS5zZXRLZXkobmFtZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRFbnRyeS5zZXROYW1lKG5hbWUpOwotCQkJCQlkb2N1bWVudEVudHJ5LnNldE1ldGFOYW1lKG1ldGFOYW1lKTsKLQkJCQkJZG9jdW1lbnQucHV0RW50cnkoZG9jdW1lbnRFbnRyeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWN1cnJlbnRQYXRoLnB1c2gobG9jYWxOYW1lKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldExvY2F0aW9uQXR0cmlidXRlTmFtZShTdHJpbmcgdXJpKQotICB7Ci0gICAgaWYgKFhNTFNDSEVNQV9OQU1FU1BBQ0UuZXF1YWxzKHVyaSkpCi0gICAgewotICAgICAgcmV0dXJuICJzY2hlbWFMb2NhdGlvbiI7Ci0gICAgfQotICAgIAotICAgIGVsc2UgaWYgKFdTRExfTkFNRVNQQUNFLmVxdWFscyh1cmkpKQotICAgIHsKLSAgICAgIHJldHVybiAibG9jYXRpb24iOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gbmFtZXNwYWNlTWF0Y2hlcyhTdHJpbmcgdXJpKQotICB7Ci0gICAgcmV0dXJuIFhNTFNDSEVNQV9OQU1FU1BBQ0UuZXF1YWxzKHVyaSkgfHwKLSAgICAgICAgICBXU0RMX05BTUVTUEFDRS5lcXVhbHModXJpKTsKLSAgfQotCQotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKQotCQkJdGhyb3dzIFNBWEV4Y2VwdGlvbgotCXsKLQkJY3VycmVudFBhdGgucG9wKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGJhY2sgZm9yIFNBWCBwYXJzZXIKLQkgKiAKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3N0YXJ0UHJlZml4TWFwcGluZyhqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKQotCQkJdGhyb3dzIFNBWEV4Y2VwdGlvbgotCXsKLQkJaWYgKGFyZzAgIT0gbnVsbCAmJiBhcmcwLmxlbmd0aCgpID4gMCkKLQkJewotCQkJdGhpcy5uYW1lc3BhY2VNYXAucHV0KGFyZzAsIGFyZzEpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLQkJdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTWF0Y2goKSB7Ci0JCXJldHVybiBoYXNNYXRjaDsKLQl9Ci0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9Bbm5vdGF0aW9uTXNnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9Bbm5vdGF0aW9uTXNnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYTY1ZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vQW5ub3RhdGlvbk1zZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25Nc2cgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST0JNTEVNX0lEID0gIlByb2JsZW1JZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMRU5HVEggPSAiTGVuZ3RoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFUVFJWQUxVRVRFWFQgPSAiQXR0cmlidXRlVmFsdWVUZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFUVFJWQUxVRU5PID0gIkF0dHJpYnV0ZVZhbHVlTm8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVRUUk5PID0gIkF0dHJObyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGludCBwcm9ibGVtSWQ7Ci0JcHJpdmF0ZSBPYmplY3QgYXR0cmlidXRlVmFsdWVUZXh0OwotCXByaXZhdGUgaW50IGxlbmd0aDsKLQkKLQlwdWJsaWMgQW5ub3RhdGlvbk1zZyhpbnQgcHJvYmxlbUlkLCBPYmplY3QgYXR0cmlidXRlVmFsdWVUZXh0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHJvYmxlbUlkID0gcHJvYmxlbUlkOwotCQl0aGlzLmF0dHJpYnV0ZVZhbHVlVGV4dCA9IGF0dHJpYnV0ZVZhbHVlVGV4dDsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0UHJvYmxlbUlkKCkgewotCQlyZXR1cm4gcHJvYmxlbUlkOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlVmFsdWVUZXh0KCkgewotCQlyZXR1cm4gYXR0cmlidXRlVmFsdWVUZXh0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCl7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vTWFya3VwVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9NYXJrdXBWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZkMTliZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9NYXJrdXBWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkxvY2FsaXplZE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQmFzaWMgWE1MIHN5bnRheCBjaGVja2luZyBzdGVwLgotICovCi1wdWJsaWMgY2xhc3MgTWFya3VwVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX0VSUk9SX0xJTUlUID0gMjU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSVElBTCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9UQUwgPSAwOwotCXByaXZhdGUgU3RyaW5nIERRVU9URSA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBTUVVPVEUgPSAiJyI7IC8vJE5PTi1OTFMtMSQKLQkKLQotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGZSb290Q29udGVudFR5cGUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBJUmVwb3J0ZXIgZlJlcG9ydGVyID0gbnVsbDsKLSAgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05NU0cgPSBBbm5vdGF0aW9uTXNnLmNsYXNzLmdldE5hbWUoKTsKLQotCXB1YmxpYyB2b2lkIGdldEFubm90YXRpb25Nc2coSVJlcG9ydGVyIHJlcG9ydGVyLCBpbnQgcHJvYmxlbUlkLCBMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UsIE9iamVjdCBhdHRyaWJ1dGVWYWx1ZVRleHQsIGludCBsZW4pewotCQlBbm5vdGF0aW9uTXNnIGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbk1zZyhwcm9ibGVtSWQsIGF0dHJpYnV0ZVZhbHVlVGV4dCxsZW4pOwotCQltZXNzYWdlLnNldEF0dHJpYnV0ZShBTk5PVEFUSU9OTVNHLCBhbm5vdGF0aW9uKTsKLQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQl9Ci0JCi0JCQotCXByaXZhdGUgdm9pZCBhZGRBdHRyaWJ1dGVFcnJvcihTdHJpbmcgbWVzc2FnZVRleHQsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZVRleHQsIGludCBzdGFydCwgaW50IGxlbmd0aCwgaW50IHByb2JsZW1JZCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyLCBpbnQgbWVzc2FnZVNldmVyaXR5KSB7Ci0KLQkJaWYgKHNkUmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgbGluZU5vID0gZ2V0TGluZU51bWJlcihzdGFydCk7Ci0JCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKG1lc3NhZ2VTZXZlcml0eSwgbWVzc2FnZVRleHQpOwotCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0JCQotCi0JCWdldEFubm90YXRpb25Nc2cocmVwb3J0ZXIsIHByb2JsZW1JZCwgbWVzc2FnZSwgYXR0cmlidXRlVmFsdWVUZXh0LGxlbmd0aCk7Ci0JCQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0F0dHJpYnV0ZXNJbkVuZFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0KLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVRleHRSZWdpb25MaXN0IHRleHRSZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJaW50IGVycm9yQ291bnQgPSAwOwotCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCWludCBlbmQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyAoaSA8IHRleHRSZWdpb25zLnNpemUoKSkgJiYgKGVycm9yQ291bnQgPCBFTEVNRU5UX0VSUk9SX0xJTUlUKSAmJiAhc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoKHRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgfHwgKHRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB8fCAodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkpIHsKLQkJCQlpZiAoc3RhcnQgPiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQodGV4dFJlZ2lvbikpIHsKLQkJCQkJc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQodGV4dFJlZ2lvbik7Ci0JCQkJfQotCQkJCWVuZCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQodGV4dFJlZ2lvbik7Ci0JCQkJZXJyb3JDb3VudCsrOwotCQkJfQotCQl9Ci0JCS8vIGNyZWF0ZSBvbmUgZXJyb3IgZm9yIGFsbCBhdHRyaWJ1dGVzIGluIHRoZSBlbmQgdGFnCi0JCWlmIChlcnJvckNvdW50ID4gMCkgewotCQkJLy8gUG9zaXRpb24gcCA9IG5ldyBQb3NpdGlvbihzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gWE1MQ29yZU1lc3NhZ2VzLkVuZF90YWdfaGFzX2F0dHJpYnV0ZXM7Ci0JCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShnZXRQbHVnaW5QcmVmZXJlbmNlKCkuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuRU5EX1RBR19XSVRIX0FUVFJJQlVURVMpLCBtZXNzYWdlVGV4dCk7Ci0JCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQltZXNzYWdlLnNldExlbmd0aChlbmQgLSBzdGFydCk7Ci0JCQltZXNzYWdlLnNldExpbmVObyhnZXRMaW5lTnVtYmVyKHN0YXJ0KSk7Ci0KLQkJCWdldEFubm90YXRpb25Nc2cocmVwb3J0ZXIsIFByb2JsZW1JRHNYTUwuQXR0cnNJbkVuZFRhZywgbWVzc2FnZSwgbnVsbCxlbmQtc3RhcnQpOwotCQkJCi0JCX0KLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBjaGVja0Nsb3NpbmdCcmFja2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlib29sZWFuIGNsb3NlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgKGkgPCByZWdpb25zLnNpemUoKSkgJiYgIXN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKTsgaSsrKSB7Ci0JCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgfHwgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkpIHsKLQkJCQljbG9zZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmICghY2xvc2VkKSB7Ci0KLQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IFhNTENvcmVNZXNzYWdlcy5SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzY7Ci0KLQkJCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGxlbmd0aCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpOwotCQkJaW50IGxpbmVObyA9IGdldExpbmVOdW1iZXIoc3RhcnQpOwotCi0JCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShnZXRQbHVnaW5QcmVmZXJlbmNlKCkuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTUlTU0lOR19DTE9TSU5HX0JSQUNLRVQpICwgbWVzc2FnZVRleHQpOwotCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0JCQlnZXRBbm5vdGF0aW9uTXNnKHJlcG9ydGVyLCBQcm9ibGVtSURzWE1MLk1pc3NpbmdDbG9zaW5nQnJhY2tldCwgbWVzc2FnZSwgbnVsbCxsZW5ndGgpOwotCi0JCQkKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0VtcHR5VGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBuYXZpZ2F0ZSB0byBuYW1lCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMuc2l6ZSgpID09IDIpIHsKLQkJCS8vIG1pc3NpbmcgbmFtZSByZWdpb24KLQkJCWlmICgocmVnaW9ucy5nZXQoMCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSAmJiAocmVnaW9ucy5nZXQoMSkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkpIHsKLQkJCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBYTUxDb3JlTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF8zOwotCQkJCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJaW50IGxpbmVObyA9IGdldExpbmVOdW1iZXIoc3RhcnQpOwotCi0JCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoZ2V0UGx1Z2luUHJlZmVyZW5jZSgpLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLk1JU1NJTkdfVEFHX05BTUUpICwgbWVzc2FnZVRleHQpOwotCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0KLQkJCQlnZXRBbm5vdGF0aW9uTXNnKHJlcG9ydGVyLCBQcm9ibGVtSURzWE1MLkVtcHR5VGFnLCBtZXNzYWdlLCBudWxsLGxlbmd0aCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBnZXRMaW5lTnVtYmVyKGludCBzdGFydCkgewotCQlpbnQgbGluZU5vID0gLTE7Ci0JCXRyeSB7Ci0JCQlsaW5lTm8gPSBnZXREb2N1bWVudCgpLmdldExpbmVPZk9mZnNldChzdGFydCkgKyAxOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBsaW5lTm87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRm9yQXR0cmlidXRlVmFsdWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBjaGVjayBmb3IgYXR0cmlidXRlcyB3aXRob3V0IGEgdmFsdWUKLQkJLy8gdHJhY2sgdGhlIGF0dHJpYnV0ZS9lcXVhbHMvdmFsdWUgc2VxdWVuY2UgdXNpbmcgYSBzdGF0ZSBvZiAwLCAxICwyCi0JCS8vIHJlcHJlc2VudGluZyB0aGUgbmFtZSwgPSwgYW5kIHZhbHVlLCByZXNwZWN0aXZlbHkKLQkJaW50IGF0dHJTdGF0ZSA9IDA7Ci0JCUlUZXh0UmVnaW9uTGlzdCB0ZXh0UmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCS8vIFJlY29uY2lsZUFubm90YXRpb25LZXkga2V5ID0gY3JlYXRlS2V5KHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwKLQkJLy8gZ2V0U2NvcGUoKSk7Ci0KLQkJaW50IGVycm9yQ291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgKGkgPCB0ZXh0UmVnaW9ucy5zaXplKCkpICYmIChlcnJvckNvdW50IDwgRUxFTUVOVF9FUlJPUl9MSU1JVCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChpKTsKLQkJCWlmICgodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB8fCBpc1RhZ0Nsb3NlVGV4dFJlZ2lvbih0ZXh0UmVnaW9uKSkgewotCQkJCS8vIGRhbmdsaW5nIG5hbWUgYW5kICc9JwotCQkJCWlmICgoYXR0clN0YXRlID09IDIpICYmIChpID49IDIpKSB7Ci0JCQkJCS8vIGNyZWF0ZSBhbm5vdGF0aW9uCi0JCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoaSAtIDIpOwotCQkJCQlpZiAoIShuYW1lUmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpKSB7Ci0JCQkJCQlPYmplY3RbXSBhcmdzID0ge3N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KG5hbWVSZWdpb24pfTsKLQkJCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IE5MUy5iaW5kKFhNTENvcmVNZXNzYWdlcy5BdHRyaWJ1dGVfX2lzX21pc3NpbmdfYV92YWx1ZSwgYXJncyk7Ci0KLQkJCQkJCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKTsKLQkJCQkJCWludCBlbmQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQlpbnQgbGluZU5vID0gZ2V0TGluZU51bWJlcihzdGFydCk7Ci0JCQkJCQlpbnQgdGV4dExlbmd0aCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KG5hbWVSZWdpb24pLnRyaW0oKS5sZW5ndGgoKTsKLQotCQkJCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoZ2V0UGx1Z2luUHJlZmVyZW5jZSgpLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9IQVNfTk9fVkFMVUUpICwgbWVzc2FnZVRleHQpOwotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgodGV4dExlbmd0aCk7Ci0JCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCi0JCQkJCQkvLyBxdWljayBmaXggaW5mbwotCQkJCQkJSVRleHRSZWdpb24gZXF1YWxzUmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGkgLSAyICsgMSk7Ci0JCQkJCQlpbnQgaW5zZXJ0T2Zmc2V0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQoZXF1YWxzUmVnaW9uKSAtIGVuZDsKLQkJCQkJCU9iamVjdFtdIGFkZGl0aW9uYWxGaXhJbmZvID0ge3N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KG5hbWVSZWdpb24pLCBuZXcgSW50ZWdlcihpbnNlcnRPZmZzZXQpfTsKLQotCQkJCQkJZ2V0QW5ub3RhdGlvbk1zZyhyZXBvcnRlciwgUHJvYmxlbUlEc1hNTC5NaXNzaW5nQXR0clZhbHVlLCBtZXNzYWdlLCBhZGRpdGlvbmFsRml4SW5mbyx0ZXh0TGVuZ3RoKTsKLQkJCQkJCWVycm9yQ291bnQrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBuYW1lIGJ1dCBubyAnPScgKFhNTCBvbmx5KQotCQkJCWVsc2UgaWYgKChhdHRyU3RhdGUgPT0gMSkgJiYgKGkgPj0gMSkpIHsKLQkJCQkJLy8gY3JlYXRlIGFubm90YXRpb24KLQkJCQkJSVRleHRSZWdpb24gcHJldmlvdXNSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoaSAtIDEpOwotCQkJCQlpZiAoIShwcmV2aW91c1JlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSkgewotCQkJCQkJT2JqZWN0W10gYXJncyA9IHtzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChwcmV2aW91c1JlZ2lvbil9OwotCQkJCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gTkxTLmJpbmQoWE1MQ29yZU1lc3NhZ2VzLkF0dHJpYnV0ZV9faGFzX25vX3ZhbHVlLCBhcmdzKTsKLQkJCQkJCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChwcmV2aW91c1JlZ2lvbik7Ci0JCQkJCQlpbnQgdGV4dExlbmd0aCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHByZXZpb3VzUmVnaW9uKS50cmltKCkubGVuZ3RoKCk7Ci0JCQkJCQlpbnQgbGluZU5vID0gZ2V0TGluZU51bWJlcihzdGFydCk7Ci0KLQkJCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGdldFBsdWdpblByZWZlcmVuY2UoKS5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfSEFTX05PX1ZBTFVFKSwgbWVzc2FnZVRleHQpOwotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgodGV4dExlbmd0aCk7Ci0JCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCi0JCQkJCQlnZXRBbm5vdGF0aW9uTXNnKHJlcG9ydGVyLCBQcm9ibGVtSURzWE1MLk5vQXR0clZhbHVlLCBtZXNzYWdlLCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChwcmV2aW91c1JlZ2lvbiksdGV4dExlbmd0aCk7Ci0JCQkJCi0KLQkJCQkJCWVycm9yQ291bnQrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQlhdHRyU3RhdGUgPSAxOwotCQkJfQotCQkJZWxzZSBpZiAodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQlhdHRyU3RhdGUgPSAyOwotCQkJfQotCQkJZWxzZSBpZiAodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWF0dHJTdGF0ZSA9IDA7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0ZvclNwYWNlQmVmb3JlTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0KLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIHNkUmVnaW9uVGV4dCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQlpZiAoc2RSZWdpb25UZXh0LnN0YXJ0c1dpdGgoIiAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXYgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCQkvLyB0aGlzIGlzIHBvc3NpYmx5IHRoZSBjYXNlIG9mICI8IHRhZyIKLQkJCQlpZiAoKHByZXYuZ2V0UmVnaW9ucygpLnNpemUoKSA9PSAxKSAmJiBpc1N0YXJ0VGFnKHByZXYpKSB7Ci0JCQkJCS8vIGFkZCB0aGUgZXJyb3IgZm9yIHByZWNlZGluZyBzcGFjZSBpbiB0YWcgbmFtZQotCQkJCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBYTUxDb3JlTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF8yOwotCQkJCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJLy8gZmluZCBsZW5ndGggb2Ygd2hpdGVzcGFjZQotCQkJCQlpbnQgbGVuZ3RoID0gc2RSZWdpb25UZXh0LnRyaW0oKS5lcXVhbHMoIiIpID8gc2RSZWdpb25UZXh0Lmxlbmd0aCgpIDogc2RSZWdpb25UZXh0LmluZGV4T2Yoc2RSZWdpb25UZXh0LnRyaW0oKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShnZXRQbHVnaW5QcmVmZXJlbmNlKCkuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuV0hJVEVTUEFDRV9CRUZPUkVfVEFHTkFNRSkgLCBtZXNzYWdlVGV4dCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJCQkJbWVzc2FnZS5zZXRMaW5lTm8oZ2V0TGluZU51bWJlcihzdGFydCkpOwotCQkJCQlnZXRBbm5vdGF0aW9uTXNnKHJlcG9ydGVyLCBQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVRhZ05hbWUsIG1lc3NhZ2UsIG51bGwsbGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tOb05hbWVzcGFjZUluUEkoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotCi0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIG5hdmlnYXRlIHRvIG5hbWUKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJaW50IGVycm9yQ291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgKGkgPCByZWdpb25zLnNpemUoKSkgJiYgKGVycm9yQ291bnQgPCBFTEVNRU5UX0VSUk9SX0xJTUlUKSAmJiAhc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpOyBpKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCVN0cmluZyBwaVRleHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChyKTsKLQkJCQlpbnQgaW5kZXggPSBwaVRleHQuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IFhNTENvcmVNZXNzYWdlcy5SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzQ7Ci0JCQkJCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSArIGluZGV4OwotCQkJCQlpbnQgbGVuZ3RoID0gcGlUZXh0LnRyaW0oKS5sZW5ndGgoKSAtIGluZGV4OwotCi0JCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGdldFBsdWdpblByZWZlcmVuY2UoKS5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5OQU1FU1BBQ0VfSU5fUElfVEFSR0VUKSAsIG1lc3NhZ2VUZXh0KTsKLQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQkJCQltZXNzYWdlLnNldExpbmVObyhnZXRMaW5lTnVtYmVyKHN0YXJ0KSk7Ci0KLQkJCQkJCi0JCQkJCWdldEFubm90YXRpb25Nc2cocmVwb3J0ZXIsIFByb2JsZW1JRHNYTUwuTmFtZXNwYWNlSW5QSSwgbWVzc2FnZSwgbnVsbCxsZW5ndGgpOwotCi0JCQkJCWVycm9yQ291bnQrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tRdW90ZXNGb3JBdHRyaWJ1dGVWYWx1ZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlTdHJpbmcgYXR0clZhbHVlVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBlcnJvckNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IChpIDwgcmVnaW9ucy5zaXplKCkpICYmIChlcnJvckNvdW50IDwgRUxFTUVOVF9FUlJPUl9MSU1JVCk7IGkrKykgewotCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHIuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJYXR0clZhbHVlVGV4dCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJLy8gYXR0cmlidXRlIHZhbHVlIGluY2x1ZGVzIHF1b3RlcyBpbiB0aGUgc3RyaW5nCi0JCQkvLyBzcGxpdCB1cCBhdHRyaWJ1dGUgdmFsdWUgb24gcXVvdGVzCi0JCQkvKgotCQkJICogV09SS0FST1VORCB0aWxsCi0JCQkgKiBodHRwOi8vZGV2LmljdS1wcm9qZWN0Lm9yZy9jZ2ktYmluL2ljdS1idWdzL2luY29taW5nP2ZpbmRpZD01MjA3Ci0JCQkgKiBpcyBmaXhlZC4gKEFsc28gc2VlIEJVRzE0MzYyOCkKLQkJCSAqLwotCi0JCQlqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIoYXR0clZhbHVlVGV4dCwgIlwiJyIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgc2l6ZSA9IHN0LmNvdW50VG9rZW5zKCk7Ci0JCQkvLyBnZXQgdGhlIHBpZWNlcyBvZiB0aGUgYXR0cmlidXRlIHZhbHVlCi0JCQlTdHJpbmcgb25lID0gIiIsIHR3byA9ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChzaXplID4gMCkgewotCQkJCW9uZSA9IHN0Lm5leHRUb2tlbigpOwotCQkJfQotCQkJaWYgKHNpemUgPiAxKSB7Ci0JCQkJdHdvID0gc3QubmV4dFRva2VuKCk7Ci0JCQl9Ci0JCQlpZiAoc2l6ZSA+IDIpIHsKLQkJCQkvLyBzaG91bGQgYmUgaGFuZGxlZCBieSBwYXJzaW5nLi4uCi0JCQkJLy8gYXMgaW4gd2UgY2FuJ3QgaGF2ZSBhbiBhdHRyaWJ1dGUgdmFsdWUgbGlrZTogPGVsZW1lbnQKLQkJCQkvLyBhdHRyPSJhImIiYyIvPgotCQkJCS8vIGFuZCA8ZWxlbWVudCBhdHRyPSdhImIiYycgLz4gaXMgbGVnYWwKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCi0JCQlpZiAoc2l6ZSA9PSAxKSB7Ci0JCQkJaWYgKG9uZS5lcXVhbHMoRFFVT1RFKSB8fCBvbmUuZXF1YWxzKFNRVU9URSkpIHsKLQkJCQkJLy8gbWlzc2luZyBjbG9zaW5nIHF1b3RlCi0JCQkJCVN0cmluZyBtZXNzYWdlID0gWE1MQ29yZU1lc3NhZ2VzLlJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMDsKLQkJCQkJYWRkQXR0cmlidXRlRXJyb3IobWVzc2FnZSwgYXR0clZhbHVlVGV4dCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpLCBhdHRyVmFsdWVUZXh0LnRyaW0oKS5sZW5ndGgoKSwgUHJvYmxlbUlEc1hNTC5VbmNsYXNzaWZpZWQsIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIsIGdldFBsdWdpblByZWZlcmVuY2UoKS5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX0NMT1NJTkdfUVVPVEUpKTsKLQkJCQkJZXJyb3JDb3VudCsrOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbWlzc2luZyBib3RoCi0JCQkJCVN0cmluZyBtZXNzYWdlID0gWE1MQ29yZU1lc3NhZ2VzLlJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMTsKLQkJCQkJYWRkQXR0cmlidXRlRXJyb3IobWVzc2FnZSwgYXR0clZhbHVlVGV4dCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpLCBhdHRyVmFsdWVUZXh0LnRyaW0oKS5sZW5ndGgoKSwgUHJvYmxlbUlEc1hNTC5BdHRyVmFsdWVOb3RRdW90ZWQsIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIsIGdldFBsdWdpblByZWZlcmVuY2UoKS5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX0NMT1NJTkdfUVVPVEUpKTsKLQkJCQkJZXJyb3JDb3VudCsrOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHNpemUgPT0gMikgewotCQkJCWlmICgob25lLmVxdWFscyhTUVVPVEUpICYmICF0d28uZXF1YWxzKFNRVU9URSkpIHx8IChvbmUuZXF1YWxzKERRVU9URSkgJiYgIXR3by5lcXVhbHMoRFFVT1RFKSkpIHsKLQkJCQkJLy8gbWlzc2luZyBjbG9zaW5nIHF1b3RlCi0JCQkJCVN0cmluZyBtZXNzYWdlID0gWE1MQ29yZU1lc3NhZ2VzLlJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMDsKLQkJCQkJYWRkQXR0cmlidXRlRXJyb3IobWVzc2FnZSwgYXR0clZhbHVlVGV4dCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpLCBhdHRyVmFsdWVUZXh0LnRyaW0oKS5sZW5ndGgoKSwgUHJvYmxlbUlEc1hNTC5VbmNsYXNzaWZpZWQsIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIsIGdldFBsdWdpblByZWZlcmVuY2UoKS5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX0NMT1NJTkdfUVVPVEUpKTsKLQkJCQkJZXJyb3JDb3VudCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBlbmQgb2YgcmVnaW9uIGZvciBsb29wCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU3RhcnRFbmRUYWdQYWlycyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc2RSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGNoZWNrIHN0YXJ0L2VuZCB0YWcgcGFpcnMKLQkJSURPTU5vZGUgeG1sTm9kZSA9IGdldFhNTE5vZGUoc2RSZWdpb24pOwotCi0JCWlmICh4bWxOb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gc2VsZkNsb3NlZCA9IGZhbHNlOwotCQlTdHJpbmcgdGFnTmFtZSA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIEZvciB0YWdzIHRoYXQgYXJlbid0IG1lYW50IHRvIGJlIEVNUFRZLCBtYWtlIHN1cmUgaXQncyBlbXB0eSBvciBoYXMgYW4gZW5kIHRhZwotCQkgKi8KLQkJaWYgKHhtbE5vZGUuaXNDb250YWluZXIoKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRSZWdpb24gPSB4bWxOb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGVuZFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFJlZ2lvbiA9IHhtbE5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoc3RhcnRSZWdpb24gIT0gbnVsbCAmJiAhc3RhcnRSZWdpb24uaXNEZWxldGVkKCkgJiYgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4uZXF1YWxzKHN0YXJ0UmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpKSkgewotCQkJCQkvLyBhbmFseXplIHRoZSB0YWcgKGNoZWNrIHNlbGYgY2xvc2luZykKLQkJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdGFydFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQkJCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQkJCQlpbnQgc3RhcnQgPSBzZFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCQlpbnQgbGVuZ3RoID0gc2RSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCQkJCXRhZ05hbWUgPSBzZFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCQkJCXN0YXJ0ID0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQocik7Ci0JCQkJCQkJbGVuZ3RoID0gci5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQkJCQlzZWxmQ2xvc2VkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCi0KLQkJCQkJaWYgKCFzZWxmQ2xvc2VkICYmICh0YWdOYW1lICE9IG51bGwpKSB7Ci0JCQkJCQlPYmplY3RbXSBhcmdzID0ge3RhZ05hbWV9OwotCQkJCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gTkxTLmJpbmQoWE1MQ29yZU1lc3NhZ2VzLk1pc3NpbmdfZW5kX3RhZ18sIGFyZ3MpOwotCi0JCQkJCQlpbnQgbGluZU51bWJlciA9IGdldExpbmVOdW1iZXIoc3RhcnQpOwotCi0JCQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShnZXRQbHVnaW5QcmVmZXJlbmNlKCkuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTUlTU0lOR19FTkRfVEFHKSAsIG1lc3NhZ2VUZXh0KTsKLQkJCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTnVtYmVyKTsKLQkJCQkJCU9iamVjdFtdIGFkZGl0aW9uYWxGaXhJbmZvID0gZ2V0U3RhcnRFbmRGaXhJbmZvKHhtbE5vZGUsIHRhZ05hbWUsIHIpOwotCQotCQkJCQkJZ2V0QW5ub3RhdGlvbk1zZyhyZXBvcnRlciwgUHJvYmxlbUlEc1hNTC5NaXNzaW5nRW5kVGFnLCBtZXNzYWdlLCBhZGRpdGlvbmFsRml4SW5mbyxsZW5ndGgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFJlZ2lvbiA9IHhtbE5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoc3RhcnRSZWdpb24gPT0gbnVsbCB8fCBzdGFydFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJCQkvLyBhbmFseXplIHRoZSB0YWcgKGNoZWNrIHNlbGYgY2xvc2luZykKLQkJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBlbmRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJCQkJaW50IHN0YXJ0ID0gc2RSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJaW50IGxlbmd0aCA9IHNkUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQkJCQl0YWdOYW1lID0gc2RSZWdpb24uZ2V0VGV4dChyKTsKLQkJCQkJCQlzdGFydCA9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpOwotCQkJCQkJCWxlbmd0aCA9IHIuZ2V0VGV4dExlbmd0aCgpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJCQkJT2JqZWN0W10gYXJncyA9IHt0YWdOYW1lfTsKLQkJCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IE5MUy5iaW5kKFhNTENvcmVNZXNzYWdlcy5NaXNzaW5nX3N0YXJ0X3RhZ18sIGFyZ3MpOwotCi0JCQkJCQlpbnQgbGluZU51bWJlciA9IGdldExpbmVOdW1iZXIoc3RhcnQpOwotCi0JCQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShnZXRQbHVnaW5QcmVmZXJlbmNlKCkuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTUlTU0lOR19TVEFSVF9UQUcpLCBtZXNzYWdlVGV4dCk7Ci0JCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQkJCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU51bWJlcik7Ci0JCQkJCQlPYmplY3RbXSBhZGRpdGlvbmFsRml4SW5mbyA9IGdldFN0YXJ0RW5kRml4SW5mbyh4bWxOb2RlLCB0YWdOYW1lLCByKTsKLQkJCQkJCQkJCQkJCQotCQkJCQkJZ2V0QW5ub3RhdGlvbk1zZyhyZXBvcnRlciwgUHJvYmxlbUlEc1hNTC5NaXNzaW5nU3RhcnRUYWcsIG1lc3NhZ2UsIGFkZGl0aW9uYWxGaXhJbmZvLGxlbmd0aCk7Ci0JCQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCS8qCi0JCSAqIENoZWNrIGZvciBhbiBlbmQgdGFnIHRoYXQgaGFzIG5vIHN0YXJ0IHRhZwotCQkgKi8KLQkJZWxzZSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0UmVnaW9uID0geG1sTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKHN0YXJ0UmVnaW9uID09IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFJlZ2lvbiA9IHhtbE5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKCFlbmRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCQkJLy8gZ2V0IG5hbWUKLQkJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBlbmRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQkJCQl0YWdOYW1lID0gc2RSZWdpb24uZ2V0VGV4dChyKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmICghc2VsZkNsb3NlZCAmJiAodGFnTmFtZSAhPSBudWxsKSkgewotCQkJCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gWE1MQ29yZU1lc3NhZ2VzLkluZGljYXRlX25vX2dyYW1tYXJfc3BlY2lmaWVkX3NldmVyaXRpZXNfZXJyb3I7Ci0KLQkJCQkJCWludCBzdGFydCA9IHNkUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJCQlpbnQgbGluZU51bWJlciA9IGdldExpbmVOdW1iZXIoc3RhcnQpOwotCi0JCQkJCQkvLyBTRVZFUklUWV9TVFJVQ1RVUkUgPT0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWQotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIG1lc3NhZ2VUZXh0KTsKLQkJCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKHNkUmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTnVtYmVyKTsKLQotCQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gZ2V0U3RhcnRFbmRGaXhJbmZvKElET01Ob2RlIHhtbE5vZGUsIFN0cmluZyB0YWdOYW1lLCBJVGV4dFJlZ2lvbiByKSB7Ci0JCS8vIHF1aWNrIGZpeCBpbmZvCi0JCVN0cmluZyB0YWdDbG9zZSA9ICIvPiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IHRhZ0Nsb3NlT2Zmc2V0ID0geG1sTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCgpOwotCQlpZiAoKHIgIT0gbnVsbCkgJiYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkpIHsKLQkJCXRhZ0Nsb3NlID0gIi8iOyAvLyROT04tTkxTLTEkCi0JCQl0YWdDbG9zZU9mZnNldC0tOwotCQl9Ci0JCUlET01Ob2RlIGZpcnN0Q2hpbGQgPSAoSURPTU5vZGUpIHhtbE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoKGZpcnN0Q2hpbGQgIT0gbnVsbCkgJiYgKGZpcnN0Q2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkpIHsKLQkJCWZpcnN0Q2hpbGQgPSAoSURPTU5vZGUpIGZpcnN0Q2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlpbnQgZW5kT2Zmc2V0ID0geG1sTm9kZS5nZXRFbmRPZmZzZXQoKTsgCi0JCWludCBmaXJzdENoaWxkU3RhcnRPZmZzZXQgPSBmaXJzdENoaWxkID09IG51bGwgPyBlbmRPZmZzZXQgOiBmaXJzdENoaWxkLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCU9iamVjdFtdIGFkZGl0aW9uYWxGaXhJbmZvID0ge3RhZ05hbWUsIHRhZ0Nsb3NlLCBuZXcgSW50ZWdlcih0YWdDbG9zZU9mZnNldCksIG5ldyBJbnRlZ2VyKHhtbE5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKSksIC8vIHN0YXJ0VGFnRW5kT2Zmc2V0Ci0JCQkJCW5ldyBJbnRlZ2VyKGZpcnN0Q2hpbGRTdGFydE9mZnNldCksIC8vIGZpcnN0Q2hpbGRTdGFydE9mZnNldAotCQkJCQluZXcgSW50ZWdlcihlbmRPZmZzZXQpfTsgLy8gZW5kT2Zmc2V0Ci0JCXJldHVybiBhZGRpdGlvbmFsRml4SW5mbzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tTdGFydGluZ1NwYWNlRm9yUEkoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotCi0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldiA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQlpZiAoKHByZXYgIT0gbnVsbCkgJiYgcHJldi5nZXRTdGFydE9mZnNldCgpID09IDApIHsKLQkJCWlmIChwcmV2LmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gWE1MQ29yZU1lc3NhZ2VzLlJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNTsKLQkJCQlpbnQgc3RhcnQgPSBwcmV2LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGxlbmd0aCA9IHByZXYuZ2V0TGVuZ3RoKCk7Ci0KLQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShnZXRQbHVnaW5QcmVmZXJlbmNlKCkuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuV0hJVEVTUEFDRV9BVF9TVEFSVCkgLCBtZXNzYWdlVGV4dCk7Ci0JCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCQkJbWVzc2FnZS5zZXRMaW5lTm8oZ2V0TGluZU51bWJlcihzdGFydCkpOwotCi0JCQkKLQkJCQlnZXRBbm5vdGF0aW9uTXNnKHJlcG9ydGVyLCBQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVBJLCBtZXNzYWdlLCBudWxsLGxlbmd0aCk7Ci0JCQkJCi0JCQkJLy8gUG9zaXRpb24gcCA9IG5ldyBQb3NpdGlvbihzdGFydCwgbGVuZ3RoKTsKLQkJCQkvLwkJCQkKLQkJCQkvLyBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IGtleSA9Ci0JCQkJLy8gY3JlYXRlS2V5KHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZ2V0U2NvcGUoKSk7Ci0JCQkJLy8gVGVtcG9yYXJ5QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbmV3IFRlbXBvcmFyeUFubm90YXRpb24ocCwKLQkJCQkvLyBTRVZFUklUWV9TWU5UQVhfRVJST1IsIG1lc3NhZ2UsIGtleSwKLQkJCQkvLyBQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVBJKTsKLQkJCQkvLyByZXN1bHRzLmFkZChhbm5vdGF0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2NvcGUoKSB7Ci0JCXJldHVybiBQQVJUSUFMOwotCX0KLQotCXByaXZhdGUgSURPTU5vZGUgZ2V0WE1MTm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0KLQkJaWYgKHNkUmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCB4TW9kZWwgPSBudWxsOwotCQlJRE9NTm9kZSB4bWxOb2RlID0gbnVsbDsKLQkJLy8gZ2V0L3JlbGVhc2UgbW9kZWxzIHNob3VsZCBhbHdheXMgYmUgaW4gYSB0cnkvZmluYWxseSBibG9jawotCQl0cnkgewotCQkJeE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJCS8vIHhNb2RlbCBpcyBzb21ldGltZSBudWxsLCB3aGVuIGNsb3NpbmcgZWRpdG9yLCBmb3IgZXhhbXBsZQotCQkJaWYgKHhNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTm9kZSA9IChJRE9NTm9kZSkgeE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc2RSZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoeE1vZGVsICE9IG51bGwpIHsKLQkJCQl4TW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHhtbE5vZGU7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIGEgWE1MICJlbmQgdGFnIgotCSAqIHNpbmNlIHRoZXkncmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBhdHRyaWJ1dGUgSVRleHRSZWdpb25zCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VuZFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAoKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB8fCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTjsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIGFuIFhNTCBQcm9jZXNzaW5nCi0JICogSW5zdHJ1Y3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUEkoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgfHwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBhIFhNTCAic3RhcnQgdGFnIgotCSAqIHNpbmNlIHRoZXkgbmVlZCB0byBiZSBjaGVja2VkIGZvciBwcm9wZXIgWE1MIGF0dHJpYnV0ZSByZWdpb24gc2VxdWVuY2VzCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1N0YXJ0VGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmICgoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHx8IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU47Ci0JfQotCi0JLy8gQmVjYXVzZSB3ZSBjaGVjayB0aGUgInByb3BlciIgY2xvc2luZyBzZXBhcmF0ZWx5IGZyb20gYXR0cmlidXRlCi0JLy8gc2VxdWVuY2luZywgd2UgbmVlZCB0byBrbm93IHdoYXQncwotCS8vIGFuIGFwcHJvcHJpYXRlIGNsb3NlLgotCXByaXZhdGUgYm9vbGVhbiBpc1RhZ0Nsb3NlVGV4dFJlZ2lvbihJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uKSB7Ci0JCXJldHVybiAodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB8fCAodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIFhNTCBDb250ZW50Ci0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1hNTENvbnRlbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgfHwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UOwotCX0KLQotCXByaXZhdGUgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZEb2N1bWVudCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotCi0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGlzU3RhcnRUYWcoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSkgewotCQkJLy8gY2hlY2sgZm9yIGF0dHJpYnV0ZXMgd2l0aG91dCBhIHZhbHVlCi0JCQljaGVja0ZvckF0dHJpYnV0ZVZhbHVlKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJLy8gY2hlY2sgaWYgc3RhcnRlZCB0YWcgaXMgZW5kZWQKLQkJCWNoZWNrU3RhcnRFbmRUYWdQYWlycyhzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJCS8vIGNoZWNrIGVtcHR5IHRhZyA8PgotCQkJY2hlY2tFbXB0eVRhZyhzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJCS8vIGNoZWNrIHRoYXQgZWFjaCBhdHRyaWJ1dGUgaGFzIHF1b3RlcwotCQkJY2hlY2tRdW90ZXNGb3JBdHRyaWJ1dGVWYWx1ZXMoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQkvLyBjaGVjayB0aGF0IHRoZSBjbG9zaW5nICc+JyBpcyB0aGVyZQotCQkJY2hlY2tDbG9zaW5nQnJhY2tldChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJfQotCQllbHNlIGlmIChpc0VuZFRhZyhzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkvLyBjaGVjayBpZiBlbmRpbmcgdGFnIHdhcyBzdGFydGVkCi0JCQljaGVja1N0YXJ0RW5kVGFnUGFpcnMoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQkvLyBjaGVjayBmb3IgYXR0cmlidXRlcyBpbiBhbiBlbmQgdGFnCi0JCQljaGVja0F0dHJpYnV0ZXNJbkVuZFRhZyhzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJCS8vIGNoZWNrIHRoYXQgdGhlIGNsb3NpbmcgJz4nIGlzIHRoZXJlCi0JCQljaGVja0Nsb3NpbmdCcmFja2V0KHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQl9Ci0JCWVsc2UgaWYgKGlzUEkoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSkgewotCQkJLy8gY2hlY2sgdmFsaWRpdHkgb2YgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgotCQkJY2hlY2tTdGFydGluZ1NwYWNlRm9yUEkoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQljaGVja05vTmFtZXNwYWNlSW5QSShzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJfQotCQllbHNlIGlmIChpc1hNTENvbnRlbnQoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSkgewotCQkJY2hlY2tGb3JTcGFjZUJlZm9yZU5hbWUoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoaXNYTUxEb2N0eXBlRGVjbGFyYXRpb24oc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSkgewotCQkJY2hlY2tEb2N1bWVudFR5cGVSZWZlcmVuY2VzKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0RvY3VtZW50VHlwZVJlZmVyZW5jZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzWE1MRG9jdHlwZURlY2xhcmF0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmICgoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHx8IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTiAmJiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQlmRG9jdW1lbnQgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmdbXSB1cmlzID0gaGVscGVyLmdldFVSSXMoKTsKLQkJSVdvcmtzcGFjZVJvb3Qgd3NSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJaWYgKHVyaXMubGVuZ3RoID4gMCkgewotCQkJSUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaXMubGVuZ3RoICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIHsKLQkJCQkvLyBtaWdodCBiZSBjYWxsZWQgd2l0aCBqdXN0IHByb2plY3QgcGF0aD8KLQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgodXJpc1tpXSk7Ci0JCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCWN1cnJlbnRGaWxlID0gd3NSb290LmdldEZpbGUocGF0aCk7Ci0JCQkJCWlmIChzaG91bGRWYWxpZGF0ZShjdXJyZW50RmlsZSwgdHJ1ZSkpIHsKLQkJCQkJCXZhbGlkYXRlVjFGaWxlKGN1cnJlbnRGaWxlLCByZXBvcnRlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAodXJpcy5sZW5ndGggPT0gMSkgewotCQkJCQl2YWxpZGF0ZVYxUHJvamVjdChoZWxwZXIsIHJlcG9ydGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJdmFsaWRhdGVWMVByb2plY3QoaGVscGVyLCByZXBvcnRlcik7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZShJUmVzb3VyY2VQcm94eSBwcm94eSkgewotCQlpZihwcm94eS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCVN0cmluZyBuYW1lID0gcHJveHkuZ2V0TmFtZSgpOwotCQkJaWYobmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpLmVuZHNXaXRoKCIueG1sIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzaG91bGRWYWxpZGF0ZShwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKSwgZmFsc2UpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSVJlc291cmNlIGZpbGUsIGJvb2xlYW4gY2hlY2tFeHRlbnNpb24pIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSB8fCBmaWxlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGNoZWNrRXh0ZW5zaW9uKSB7Ci0JCQlTdHJpbmcgZXh0ZW5zaW9uID0gZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgInhtbCIuZW5kc1dpdGgoZXh0ZW5zaW9uLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb250ZW50RGVzY3JpcHRpb24gPSAoKElGaWxlKSBmaWxlKS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpOwotCQkJCXJldHVybiBjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCAmJiBjb250ZW50VHlwZS5pc0tpbmRPZihnZXRYTUxDb250ZW50VHlwZSgpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaGVscGVyCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVjFQcm9qZWN0KElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIGZpbmFsIElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBpZiB1cmlzW10gbGVuZ3RoIDAgLT4gdmFsaWRhdGUoKSBnZXRzIGNhbGxlZCBmb3IgZWFjaCBwcm9qZWN0Ci0JCWlmIChoZWxwZXIgaW5zdGFuY2VvZiBJV29ya2JlbmNoQ29udGV4dCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9ICgoSVdvcmtiZW5jaENvbnRleHQpIGhlbHBlcikuZ2V0UHJvamVjdCgpOwotCQkJSVJlc291cmNlUHJveHlWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVJlc291cmNlUHJveHlWaXNpdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCWlmIChzaG91bGRWYWxpZGF0ZShwcm94eSkpIHsKLQkJCQkJCXZhbGlkYXRlVjFGaWxlKChJRmlsZSkgcHJveHkucmVxdWVzdFJlc291cmNlKCksIHJlcG9ydGVyKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9OwotCQkJdHJ5IHsKLQkJCQkvLyBjb2xsZWN0IGFsbCBqc3AgZmlsZXMgZm9yIHRoZSBwcm9qZWN0Ci0JCQkJcHJvamVjdC5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogQHBhcmFtIGN1cnJlbnRGaWxlCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVjFGaWxlKElGaWxlIGN1cnJlbnRGaWxlLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBjdXJyZW50RmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpKTsKLQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2soTWFya3VwVmFsaWRhdG9yLnRoaXMsIG1lc3NhZ2UpOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChjdXJyZW50RmlsZSk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJZG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQljb25uZWN0KGRvY3VtZW50KTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHZhbGlkYXRpb25SZWdpb24gPSBkb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCXdoaWxlICh2YWxpZGF0aW9uUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJdmFsaWRhdGUodmFsaWRhdGlvblJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJCQl2YWxpZGF0aW9uUmVnaW9uID0gdmFsaWRhdGlvblJlZ2lvbi5nZXROZXh0KCk7Ci0JCQkJfQotCQkJCWRpc2Nvbm5lY3QoZG9jdW1lbnQpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZ2V0WE1MQ29udGVudFR5cGUoKSB7Ci0JCWlmIChmUm9vdENvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWZSb290Q29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZSgib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZSb290Q29udGVudFR5cGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3IjdmFsaWRhdGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLQkJCXJldHVybiBudWxsOwotCQlWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7Ci0JCWZSZXBvcnRlciA9IHJlc3VsdC5nZXRSZXBvcnRlcihtb25pdG9yKTsKLQotCQl2YWxpZGF0ZVYxRmlsZSgoSUZpbGUpIHJlc291cmNlLCBmUmVwb3J0ZXIpOwotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIElSZXBvcnRlciB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUpIHsKLQkJdmFsaWRhdGUocmVzb3VyY2Usa2luZCxzdGF0ZSxuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJcmV0dXJuIGZSZXBvcnRlcjsKLQl9Ci0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBnZXRQbHVnaW5QcmVmZXJlbmNlKCl7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElSZWdpb24gZGlydHlSZWdpb24sIElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoZ2V0RG9jdW1lbnQoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCEoZ2V0RG9jdW1lbnQoKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyByZW1vdmUgb2xkIG1lc3NhZ2VzCi0JCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSByZWdpb25zID0gKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoZGlydHlSZWdpb24uZ2V0T2Zmc2V0KCksIGRpcnR5UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQl2YWxpZGF0ZShyZWdpb25zW2ldLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1Byb2JsZW1JRHNYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1Byb2JsZW1JRHNYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YzNGU3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9Qcm9ibGVtSURzWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBQcm9ibGVtSURzWE1MIHsKLQlpbnQgQXR0cnNJbkVuZFRhZyA9IDM7Ci0JaW50IEF0dHJWYWx1ZU5vdFF1b3RlZCA9IDEzOwotCWludCBFbXB0eVRhZyA9IDE7Ci0JaW50IEludmFsaWRBdHRyVmFsdWUgPSAxMTsKLQlpbnQgTWlzc2luZ0F0dHJWYWx1ZSA9IDQ7Ci0JaW50IE1pc3NpbmdDbG9zaW5nQnJhY2tldCA9IDE0OwotCWludCBNaXNzaW5nRW5kVGFnID0gMjsKLQlpbnQgTWlzc2luZ1JlcXVpcmVkQXR0ciA9IDEyOwotCWludCBNaXNzaW5nU3RhcnRUYWcgPSAxNTsKLQlpbnQgTmFtZXNwYWNlSW5QSSA9IDg7Ci0JaW50IE5vQXR0clZhbHVlID0gNTsKLQlpbnQgU3BhY2VzQmVmb3JlUEkgPSA3OwotCWludCBTcGFjZXNCZWZvcmVUYWdOYW1lID0gNjsKLQlpbnQgVW5jbGFzc2lmaWVkID0gMDsKLQlpbnQgVW5rbm93bkF0dHIgPSAxMDsKLQlpbnQgVW5rbm93bkVsZW1lbnQgPSA5OwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdG9ySGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0b3JIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjYWUwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0b3JIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIHRoZSBYTUwgdmFsaWRhdG9yLgotICogCi0gKiBAYXV0aG9yIENyYWlnIFNhbHRlciwgSUJNCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JIZWxwZXIKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIExpc3QgbmFtZXNwYWNlVVJJTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgcHVibGljIGJvb2xlYW4gaXNHcmFtbWFyRW5jb3VudGVyZWQgPSBmYWxzZTsgICAgCi0gIHB1YmxpYyBib29sZWFuIGlzRFRERW5jb3VudGVyZWQgPSBmYWxzZTsKLSAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCA9IGZhbHNlOwotICBwdWJsaWMgU3RyaW5nIHNjaGVtYUxvY2F0aW9uU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIGludCBudW1EVERFbGVtZW50cyA9IDA7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRvckhlbHBlcigpCi0gIHsKLSAgfQotIAotICAvKioKLSAgICogQ3JlYXRlIGFuIFhNTCBSZWFkZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIEFuIFhNTCBSZWFkZXIgaWYgb25lIGNhbiBiZSBjcmVhdGVkIG9yIG51bGwuCi0gICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgWE1MUmVhZGVyIGNyZWF0ZVhNTFJlYWRlcihTdHJpbmcgdXJpKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsgICAgIAotICAgIFhNTFJlYWRlciByZWFkZXIgPSBudWxsOwotICAgIAotICAgIHJlYWRlciA9IG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcigpOyAgICAgCi0gICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9jb250aW51ZS1hZnRlci1mYXRhbC1lcnJvciIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLSAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLSAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL25vbnZhbGlkYXRpbmcvbG9hZC1leHRlcm5hbC1kdGQiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLSAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IE15Q29udGVudEhhbmRsZXIodXJpKSk7Ci0gICAgcmVhZGVyLnNldEVycm9ySGFuZGxlcihuZXcgSW50ZXJuYWxFcnJvckhhbmRsZXIoKSk7IAotCi0gICAgTGV4aWNhbEhhbmRsZXIgbGV4aWNhbEhhbmRsZXIgPSBuZXcgTGV4aWNhbEhhbmRsZXIoKQotICAgIHsgICAgICAKLSAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RFREIChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gICAgICB7Ci0gICAgICAgIGlzR3JhbW1hckVuY291bnRlcmVkID0gdHJ1ZTsgICAKLSAgICAgICAgaXNEVERFbmNvdW50ZXJlZCA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIGVuZERURCgpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgIHsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgc3RhcnRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgIHsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgZW5kRW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q0RBVEEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIGVuZENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgewotICAgICAgfQotIAotICAgICAgcHVibGljIHZvaWQgY29tbWVudCAoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgIHsKLSAgICAgIH0KLSAgICB9OwotICAgIHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgbGV4aWNhbEhhbmRsZXIpOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcmV0dXJuIHJlYWRlcjsKLSAgfSAgCi0KLSAgLyoqCi0gICAqIEFuIGVycm9yIGhhbmRsZXIgdG8gc3VwcHJlc3MgZXJyb3IgYW5kIHdhcm5pbmcgaW5mb3JtYXRpb24uCi0gICAqLwotICBwcml2YXRlIGNsYXNzIEludGVybmFsRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyCi0gIHsKLQlwdWJsaWMgSW50ZXJuYWxFcnJvckhhbmRsZXIoKQotCXsKLQkgIHN1cGVyKCk7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0gIH0KLQotIAotICAvKioKLSAgICogRmlndXJlcyBvdXQgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgdmFsaWRhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIHVyaSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIHVyaVJlc29sdmVyIEEgaGVscGVyIHRvIHJlc29sdmUgbG9jYXRpb25zLgotICAgKi8KLSAgcHVibGljIHZvaWQgY29tcHV0ZVZhbGlkYXRpb25JbmZvcm1hdGlvbihTdHJpbmcgdXJpLCBSZWFkZXIgY2hhcmFjdGVyU3RyZWFtLCBVUklSZXNvbHZlciB1cmlSZXNvbHZlcikKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFhNTFJlYWRlciByZWFkZXIgPSBjcmVhdGVYTUxSZWFkZXIodXJpKTsgIAotICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UodXJpKTsKLSAgICAgIGlucHV0U291cmNlLnNldENoYXJhY3RlclN0cmVhbShjaGFyYWN0ZXJTdHJlYW0pOwotICAgICAgcmVhZGVyLnBhcnNlKGlucHV0U291cmNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsgICAgIAotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgfQotICB9Ci0gIAotIAotCi0gIC8qKgotICAgKiBIYW5kbGUgdGhlIGNvbnRlbnQgd2hpbGUgcGFyc2luZyB0aGUgZmlsZS4KLSAgICovCi0gIGNsYXNzIE15Q29udGVudEhhbmRsZXIgZXh0ZW5kcyBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyCi0gIHsgICAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1Jvb3RFbGVtZW50ID0gdHJ1ZTsKLSAgICBTdHJpbmcgYmFzZVVSSTsKLSAgICAKLSAgICBNeUNvbnRlbnRIYW5kbGVyKFN0cmluZyB1cmkpCi0gICAgewotICAgICAgdGhpcy5iYXNlVVJJID0gdXJpOyAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNmYXRhbEVycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI3dhcm5pbmcob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgIH0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgIGludCBpbmRleCA9IG5hbWUuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHByZWZpeCA9IG5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgfSAgICAKLSAgICAgICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRVbnByZWZpeGVkTmFtZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoIjoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeGVkTmFtZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lKQotICAgIHsKLSAgICAgIHJldHVybiBwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwID8gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lIDogbG9jYWxOYW1lOyAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHJhd05hbWUsIEF0dHJpYnV0ZXMgYXR0cykKLSAgICB7ICAgICAgCi0gICAgICAvL1N0cmluZyBleHBsaWNpdExvY2F0aW9uID0gbnVsbDsKLSAgICAgIGlmIChpc1Jvb3RFbGVtZW50KQotICAgICAgeyAgCi0gICAgICAgIAotICAgICAgICBpc1Jvb3RFbGVtZW50ID0gZmFsc2U7ICAKLSAgICAgICAgaW50IG5BdHRzID0gYXR0cy5nZXRMZW5ndGgoKTsgICAgCi0gICAgICAgIFN0cmluZyBzY2hlbWFJbnN0YW5jZVByZWZpeCA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGkgPTA7IGkgPCBuQXR0czsgaSsrKQotICAgICAgICB7ICAgICAgICAgICAgICAKLSAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGF0dHMuZ2V0UU5hbWUoaSk7ICAgICAgIAotICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscygieG1sbnMiKSB8fCBhdHRyaWJ1dGVOYW1lLnN0YXJ0c1dpdGgoInhtbG5zOiIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlzTmFtZXNwYWNlRW5jb3VudGVyZWQgPSB0cnVlOyAgICAKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGF0dHMuZ2V0VmFsdWUoaSk7ICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnczLm9yZy8iKSAmJiB2YWx1ZS5lbmRzV2l0aCgiL1hNTFNjaGVtYS1pbnN0YW5jZSIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2NoZW1hSW5zdGFuY2VQcmVmaXggPSBhdHRyaWJ1dGVOYW1lLmVxdWFscygieG1sbnMiKSA/ICIiIDogZ2V0VW5wcmVmaXhlZE5hbWUoYXR0cmlidXRlTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IGdldFByZWZpeChyYXdOYW1lKTsKLSAgICAgICAgU3RyaW5nIHJvb3RFbGVtZW50TmFtZXNwYWNlRGVjbGFyYXRpb25OYW1lID0gKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApID8gInhtbG5zOiIgKyBwcmVmaXggOiAieG1sbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgU3RyaW5nIHJvb3RFbGVtZW50TmFtZXNwYWNlID0gcm9vdEVsZW1lbnROYW1lc3BhY2VEZWNsYXJhdGlvbk5hbWUgIT0gbnVsbCA/IGF0dHMuZ2V0VmFsdWUocm9vdEVsZW1lbnROYW1lc3BhY2VEZWNsYXJhdGlvbk5hbWUpIDogbnVsbDsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIC8vIGZpcnN0IHdlIHVzZSBhbnkgJ3hzaTpzY2hlbWFMb2NhdGlvbicgb3IgJ3hzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uJyBhdHRyaWJ1dGUKLSAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIGEgbG9jYXRpb24KLSAgICAgICAgaWYgKHNjaGVtYUluc3RhbmNlUHJlZml4ICE9IG51bGwpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBsb2NhdGlvbiA9IGF0dHMuZ2V0VmFsdWUoZ2V0UHJlZml4ZWROYW1lKHNjaGVtYUluc3RhbmNlUHJlZml4LCAibm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKQotICAgICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgCVN0cmluZyBzY2hlbWFMb2MgPSBhdHRzLmdldFZhbHVlKGdldFByZWZpeGVkTmFtZShzY2hlbWFJbnN0YW5jZVByZWZpeCwgInNjaGVtYUxvY2F0aW9uIikpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbG9jYXRpb24gPSBnZXRTY2hlbWFMb2NhdGlvbkZvck5hbWVzcGFjZShzY2hlbWFMb2MsIHJvb3RFbGVtZW50TmFtZXNwYWNlKTsKLSAgICAgICAgICB9ICAKLSAgICAgICAgfSAgCi0gICAgICAgIGlmIChyb290RWxlbWVudE5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcm9vdEVsZW1lbnROYW1lc3BhY2UgPSAiIjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbG9jYXRpb24gPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoYmFzZVVSSSwgcm9vdEVsZW1lbnROYW1lc3BhY2UsIGxvY2F0aW9uKTsgICAgCi0gICAgICAgIGxvY2F0aW9uID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbihiYXNlVVJJLCByb290RWxlbWVudE5hbWVzcGFjZSwgbG9jYXRpb24pOwotICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGxvY2F0aW9uID0gVVJJSGVscGVyLmFkZEltcGxpZWRGaWxlUHJvdG9jb2wobG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzY2hlbWFMb2NhdGlvblN0cmluZyA9IGxvY2F0aW9uOwotICAgICAgICAKLSAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChsb2NhdGlvbik7Ci0gICAgICAgICAgICBpcyA9IHVybC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICBpc0dyYW1tYXJFbmNvdW50ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgCS8vIERvIG5vdGhpbmcuCi0gICAgICAgICAgfQotICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICB7Ci0gICAgICAgIAlpZihpcyAhPSBudWxsKQotICAgICAgICAJewotICAgICAgICAJICB0cnkKLSAgICAgICAgCSAgewotICAgICAgICAJICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgIAkgIH0KLSAgICAgICAgCSAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICAgIAkgIHsKLSAgICAgICAgCQkvLyBEbyBub3RoaW5nLgotICAgICAgICAJICB9Ci0gICAgICAgIAl9Ci0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9ICAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjZWxlbWVudERlY2woamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbGVtZW50RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG1vZGVsKSAKLSAgICB7Ci0gICAgICBudW1EVERFbGVtZW50cysrOwotICAgIH0KLSAgICAKLSAgICAvLyBUaGUgeHNpU2NoZW1hTG9jYXRpb25WYWx1ZSBpcyBhIGxpc3Qgb2YgbmFtZXNwYWNlL2xvY2F0aW9uIHBhaXJzIHRoYXQgYXJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIAotICAgIC8vIHRoaXMgbWV0aG9kIHdhbGtzIHRoZSBsaXN0IG9mIHBhaXJzIGxvb2tpbmcgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlIGFuZCByZXR1cm5zIHRoZSBhc3NvY2lhdGVkCi0gICAgLy8gbG9jYXRpb24uCi0gICAgLy8gICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNjaGVtYUxvY2F0aW9uRm9yTmFtZXNwYWNlKFN0cmluZyB4c2lTY2hlbWFMb2NhdGlvblZhbHVlLCBTdHJpbmcgbmFtZXNwYWNlKQotICAgIHsgICAgICAKLSAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKHhzaVNjaGVtYUxvY2F0aW9uVmFsdWUgIT0gbnVsbCAmJiBuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoeHNpU2NoZW1hTG9jYXRpb25WYWx1ZSk7Ci0gICAgICAgIHdoaWxlKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmKHN0Lm5leHRUb2tlbigpLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZihzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHN0Lm5leHRUb2tlbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgICAgICAgCi0gIH0gICAKLSAgICAgICAKLSAgCi0gIC8qKgotICAgKiBSZXBsYWNlIGFsbCBpbnN0YW5jZXMgaW4gdGhlIHN0cmluZyBvZiB0aGUgb2xkIHBhdHRlcm4gd2l0aCB0aGUgbmV3IHBhdHRlcm4uCi0gICAqIAotICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBzdHJpbmcgdG8gcmVwbGFjZSB0aGUgcGF0dGVybnMgaW4uCi0gICAqIEBwYXJhbSBvbGRQYXR0ZXJuIFRoZSBvbGQgcGF0dGVybiB0byByZXBsYWNlLgotICAgKiBAcGFyYW0gbmV3UGF0dGVybiBUaGUgcGF0dGVybiB1c2VkIGZvciByZXBsYWNlbWVudC4KLSAgICogQHJldHVybiBUaGUgbW9kaWZpZWQgc3RyaW5nIHdpdGggYWxsIG9jY3VycmFuY2VzIG9mIG9sZFBhdHRlcm4gcmVwbGFjZWQgYnkgbmV3IFBhdHRlcm4uCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyByZXBsYWNlKFN0cmluZyBzdHJpbmcsIFN0cmluZyBvbGRQYXR0ZXJuLCBTdHJpbmcgbmV3UGF0dGVybikKLSAgeyAgICAgCi0gICAgaW50IGluZGV4ID0gMDsKLSAgICB3aGlsZSAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihvbGRQYXR0ZXJuLCBpbmRleCk7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHN0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpICsgbmV3UGF0dGVybiArIHN0cmluZy5zdWJzdHJpbmcoaW5kZXggKyBvbGRQYXR0ZXJuLmxlbmd0aCgpKTsKLSAgICAgICAgaW5kZXggPSBpbmRleCArIG9sZFBhdHRlcm4ubGVuZ3RoKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdHJpbmc7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTE5lc3RlZFZhbGlkYXRvckNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTE5lc3RlZFZhbGlkYXRvckNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljNWU3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxOZXN0ZWRWYWxpZGF0b3JDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dDsKLQotCi0vKioKLSAqIFhNTE5lc3RlZFZhbGlkYXRvckNvbnRleHQgaXMgdXNlZCB0byBzdG9yZSBzdGF0ZSBkYXRhIG5lZWRlZCBkdXJpbmcgYW4gWE1MCi0gKiB2YWxpZGF0aW9uIHNlc3Npb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGV4dGVuZHMgTmVzdGVkVmFsaWRhdG9yQ29udGV4dAotewotICAvKioKLSAgICogQSBzZXQgb2YgaW5hY2Nlc3NpYmxlIGxvY2F0aW9ucyBVUklzIChTdHJpbmcpLgotICAgKi8KLSAgcHJpdmF0ZSBIYXNoU2V0IGluYWNjZXNzaWJsZUxvY2F0aW9uVVJJcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgLyoqCi0gICAqIERldGVybWluZXMgaWYgYSBsb2NhdGlvbiBVUkkgd2FzIG1hcmtlZCBhcyBpbmFjY2Vzc2libGUuCi0gICAqIAotICAgKiBAcGFyYW0gbG9jYXRpb25VUkkKLSAgICogICAgICAgICAgdGhlIGxvY2F0aW9uIFVSSSB0byB0ZXN0LiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcmV0dXJuIHRydWUgaWYgYSBsb2NhdGlvbiBVUkkgd2FzIG1hcmtlZCBhcyBpbmFjY2Vzc2libGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVVJJTWFya2VkSW5hY2Nlc3NpYmxlKFN0cmluZyBsb2NhdGlvblVSSSkKLSAgewotICAgIHJldHVybiBsb2NhdGlvblVSSSAhPSBudWxsICYmIGluYWNjZXNzaWJsZUxvY2F0aW9uVVJJcy5jb250YWlucyhsb2NhdGlvblVSSSk7Ci0gIH0KLQotICAvKioKLSAgICogTWFya3MgdGhlIGdpdmVuIGxvY2F0aW9uIFVSSSBhcyBpbmFjY2Vzc2libGUuCi0gICAqIAotICAgKiBAcGFyYW0gbG9jYXRpb25VUkkKLSAgICogICAgICAgICAgdGhlIGxvY2F0aW9uIFVSSSB0byBtYXJrIGFzIGluYWNjZXNzaWJsZS4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIG1hcmtVUklJbmFjY2Vzc2libGUoU3RyaW5nIGxvY2F0aW9uVVJJKQotICB7Ci0gICAgaWYgKGxvY2F0aW9uVVJJICE9IG51bGwpCi0gICAgewotICAgICAgaW5hY2Nlc3NpYmxlTG9jYXRpb25VUklzLmFkZChsb2NhdGlvblVSSSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0NTE1NTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjk3MDA1IC0gU29tZSBzdGF0aWMgY29uc3RhbnRzIG5vdCBtYWRlIGZpbmFsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKioKLSAqIEFuIFhNTCB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gYWxsb3dzIHNldHRpbmcgc3BlY2lmaWMgY29uZmlndXJhdGlvbgotICogaW5mb3JtYXRpb24gZm9yIGEgV1RQIFhNTCB2YWxpZGF0aW9uIHJ1bi4gQW55IGZlYXR1cmVzIGFuZCBwcm9wZXJ0aWVzCi0gKiBzZXQgb24gdGhpcyBjb25maWd1cmF0aW9uIHNob3VsZCBub3QgYmUgY29uZnVzZWQgd2l0aCB0aG9zZSBmcm9tCi0gKiBwYXJzZXJzIHN1Y2ggYXMgWGVyY2VzLiAoVGhpcyBvYmplY3QgZG9lcyBub3QgYnkgZGVmYXVsdCB3cmFwIGZlYXR1cmVzCi0gKiBhbmQgcHJvcGVydGllcyBmcm9tIHNwZWNpZmljIHBhcnNlcnMuKQotICovCi1wdWJsaWMgY2xhc3MgWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gCi17Ci0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTl9OT19HUkFNTUFSID0gIldBUk5fTk9fR1JBTU1BUiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ESUNBVEVfTk9fR1JBTU1BUiA9ICJJTkRJQ0FURV9OT19HUkFNTUFSIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfWElOQ0xVREUgPSAiVVNFX1hJTkNMVURFIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMgPSAiSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TIjsgLy8kTk9OLU5MUy0xJAotCi0gIHByaXZhdGUgYm9vbGVhbiB3YXJuX25vX2dyYW1tYXJfdmFsdWUgPSBmYWxzZTsKLSAgcHJpdmF0ZSBpbnQgaW5kaWNhdGVfbm9fZ3JhbW1hcl92YWx1ZSA9IDE7Ci0gIHByaXZhdGUgYm9vbGVhbiB1c2VfeGluY2x1ZGUgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIGhvbm91cl9hbGxfc2NoZW1hX2xvY2F0aW9uc192YWx1ZSA9IGZhbHNlOwotICAKLSAgLyoqCi0gICAqIFNldCBhIGZlYXR1cmUgb2YgdGhpcyBjb25maWd1cmF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGZlYXR1cmUKLSAgICogCQlUaGUgZmVhdHVyZSB0byBzZXQuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiAJCVRoZSB2YWx1ZSB0byBzZXQgZm9yIHRoZSBmZWF0dXJlLgotICAgKiBAdGhyb3dzIAotICAgKiAJCUFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHJlY29nbml6ZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBib29sZWFuIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLQlpZihXQVJOX05PX0dSQU1NQVIuZXF1YWxzKGZlYXR1cmUpKQotCSAgd2Fybl9ub19ncmFtbWFyX3ZhbHVlID0gdmFsdWU7Ci0gICAgZWxzZSBpZihVU0VfWElOQ0xVREUuZXF1YWxzKGZlYXR1cmUpKQotICAgICAgdXNlX3hpbmNsdWRlID0gdmFsdWU7Ci0gICAgZWxzZSBpZihIT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMuZXF1YWxzKGZlYXR1cmUpKQotICAgICAgaG9ub3VyX2FsbF9zY2hlbWFfbG9jYXRpb25zX3ZhbHVlID0gdmFsdWU7Ci0JZWxzZQotCSAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmVhdHVyZSBub3QgcmVjb2duaXplZC4iKTsgLy8kTk9OLU5MUy0xJAotCQotICB9Ci0gIAotICAvKioKLSAgICogU2V0IGEgZmVhdHVyZSBvZiB0aGlzIGNvbmZpZ3VyYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gZmVhdHVyZQotICAgKiAJCVRoZSBmZWF0dXJlIHRvIHNldC4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIAkJVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGZlYXR1cmUuCi0gICAqIEB0aHJvd3MgCi0gICAqIAkJQW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgZmVhdHVyZSBpcyBub3QgcmVjb2duaXplZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0JaWYoSU5ESUNBVEVfTk9fR1JBTU1BUi5lcXVhbHMoZmVhdHVyZSkpCi0JICBpbmRpY2F0ZV9ub19ncmFtbWFyX3ZhbHVlID0gdmFsdWU7Ci0JZWxzZQotCSAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmVhdHVyZSBub3QgcmVjb2duaXplZC4iKTsgLy8kTk9OLU5MUy0xJAotCQotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gZmVhdHVyZS4gSWYgdGhlIGZlYXR1cmUgaXMgbm90IGRlZmluZWQKLSAgICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gZmVhdHVyZQotICAgKiAJCVRoZSBmZWF0dXJlIGZvciB3aGljaCB0byByZXRyaWV2ZSB0aGUgdmFsdWUuCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgZmVhdHVyZSdzIHZhbHVlLCB0cnVlIG9yIGZhbHNlLgotICAgKiBAdGhyb3dzIAotICAgKiAJCUFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHJlY29nbml6ZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLQlpZihXQVJOX05PX0dSQU1NQVIuZXF1YWxzKGZlYXR1cmUpKQotCSAgcmV0dXJuIHdhcm5fbm9fZ3JhbW1hcl92YWx1ZTsKLQllbHNlIGlmKFVTRV9YSU5DTFVERS5lcXVhbHMoZmVhdHVyZSkpCi0gICAgICByZXR1cm4gdXNlX3hpbmNsdWRlOwotICAgIGlmKEhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUy5lcXVhbHMoZmVhdHVyZSkpCi0gICAgICByZXR1cm4gaG9ub3VyX2FsbF9zY2hlbWFfbG9jYXRpb25zX3ZhbHVlOwotCQkJCi0JdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmVhdHVyZSBub3QgcmVjb2duaXplZC4iKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gZmVhdHVyZS4gSWYgdGhlIGZlYXR1cmUgaXMgbm90IGRlZmluZWQKLSAgICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gZmVhdHVyZQotICAgKiAJCVRoZSBmZWF0dXJlIGZvciB3aGljaCB0byByZXRyaWV2ZSB0aGUgdmFsdWUuCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgZmVhdHVyZSdzIHZhbHVlLCB0cnVlIG9yIGZhbHNlLgotICAgKiBAdGhyb3dzIAotICAgKiAJCUFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHJlY29nbml6ZWQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldEludEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUpIHRocm93cyBFeGNlcHRpb24KLSAgewotCWlmKElORElDQVRFX05PX0dSQU1NQVIuZXF1YWxzKGZlYXR1cmUpKQotCSAgcmV0dXJuIGluZGljYXRlX25vX2dyYW1tYXJfdmFsdWU7Ci0JCi0JdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmVhdHVyZSBub3QgcmVjb2duaXplZC4iKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25JbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTEzZWI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gWzIwNTk4OV0gLSBbdmFsaWRhdGlvbl0gdmFsaWRhdGUgWE1MIGFmdGVyIFhJbmNsdWRlIHJlc29sdXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTExvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uRXJyb3JDdXN0b21pemF0aW9uTWFuYWdlcjsKLQotCi0vKioKLSAqIEEgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbiBvYmplY3Qgc3BlY2lmaWMgdG8gWE1MIHZhbGlkYXRvcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWYWxpZGF0aW9uSW5mbyBleHRlbmRzIFZhbGlkYXRpb25JbmZvIGltcGxlbWVudHMgWE1MVmFsaWRhdGlvblJlcG9ydAotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBncmFtbWFyRW5jb3VudGVyZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZHRkRW5jb3VudGVyZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gbmFtZXNwYWNlRW5jb3VudGVyZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGludCBlbGVtZW50RGVjbENvdW50ID0gMDsKLSAgcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50RXJyb3JLZXk7Ci0gIHByb3RlY3RlZCBPYmplY3QgbWVzc2FnZUFyZ3VtZW50c1tdID0gbnVsbDsKLSAgcHJvdGVjdGVkIFhNTExvY2F0b3IgbG9jYXRvciA9IG51bGw7Ci0gIHByb3RlY3RlZCBFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyIGVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIEEgc3RhY2sgb2Ygc3RhcnQgdGFnIGxvY2F0aW9ucywgdXNlZCB0byBtb3ZlIGVycm9ycwotICAgKiByZXBvcnRlZCBhdCB0aGUgY2xvc2UgdGFnIHRvIGJlIHJlcG9ydGVkIGF0IHRoZSBzdGFydCB0YWcuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RhY2sgc3RhcnRFbGVtZW50TG9jYXRpb25zID0gbmV3IFN0YWNrKCk7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhpcyByZXBvcnQgZGVzY3JpYmVzLgotICAgKi8KLSAgcHVibGljIFhNTFZhbGlkYXRpb25JbmZvKFN0cmluZyB1cmkpCi0gIHsKLSAgICBzdXBlcih1cmkpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0dyYW1tYXJFbmNvdW50ZXJlZCgpCi0gIHsKLSAgICByZXR1cm4gZ3JhbW1hckVuY291bnRlcmVkOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHdoZXRoZXIgYSBncmFtbWFyIGhhcyBiZWVuIGVuY291bnRlcmVkIG9yIG5vdC4KLSAgICogCi0gICAqIEBwYXJhbSBncmFtbWFyRW5jb3VudGVyZWQgU2V0IHRydWUgaWYgYSBncmFtbWFyIGhhcyBiZWVuIGVuY291bnRlcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRHcmFtbWFyRW5jb3VudGVyZWQoYm9vbGVhbiBncmFtbWFyRW5jb3VudGVyZWQpCi0gIHsKLSAgICB0aGlzLmdyYW1tYXJFbmNvdW50ZXJlZCA9IGdyYW1tYXJFbmNvdW50ZXJlZDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNEVERXaXRob3V0RWxlbWVudERlY2xhcmF0aW9uRW5jb3VudGVyZWQoKQotICB7Ci0gICAgcmV0dXJuIGR0ZEVuY291bnRlcmVkICYmIGVsZW1lbnREZWNsQ291bnQgPT0gMDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB3aGV0aGVyIGEgRFREIHdpdGhvdXQgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiB3YXMgZW5jb3VudGVyZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZHRkV2l0aG91dEVsZW1lbnREZWNsYXJhdGlvbkVuY291bnRlcmVkIFNldCB0cnVlIGlmIGEgRFREIHdpdGhvdXQgYW4KLSAgICogICAgICAgICBlbGVtZW50IGRlY2xhcmF0aW9uIHdhcyBlbmNvdW50ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RFRERW5jb3VudGVyZWQoYm9vbGVhbiBkdGRFbmNvdW50ZXJlZCkKLSAgewotICAgIHRoaXMuZHRkRW5jb3VudGVyZWQgPSBkdGRFbmNvdW50ZXJlZDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlRW5jb3VudGVyZWQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgd2hldGhlciBhIG5hbWVzcGFjZSB3YXMgZW5jb3VudGVyZWQuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlRW5jb3VudGVyZWQgU2V0IHRydWUgaWYgYSBuYW1lc3BhY2Ugd2FzIGVuY291bnRlcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VFbmNvdW50ZXJlZChib29sZWFuIG5hbWVzcGFjZUVuY291bnRlcmVkKQotICB7Ci0gICAgdGhpcy5uYW1lc3BhY2VFbmNvdW50ZXJlZCA9IG5hbWVzcGFjZUVuY291bnRlcmVkOwotICB9Ci0gIAotICAvKioKLSAgICogSW5jcmVhc2UgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gY291bnQgZm9yIERURCBlbGVtZW50cyBieSBvbmUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbmNyZWFzZUVsZW1lbnREZWNsYXJhdGlvbkNvdW50KCkKLSAgewotICAgIHRoaXMuZWxlbWVudERlY2xDb3VudCsrOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBudW1iZXIgb2YgRFREIGVsZW1lbnRzIGVuY291bnRlcmVkLgotICAgKiAKLSAgICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgRFREIGVsZW1lbnRzIGVuY291bnRlcmVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudERlY2xhcmF0aW9uQ291bnQoaW50IGNvdW50KQotICB7Ci0gIAllbGVtZW50RGVjbENvdW50ID0gY291bnQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIFhNTCBsb2NhdG9yIGlmIG9uZSBoYXMgYmVlbiBzcGVjaWZpZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBYTUwgbG9jYXRvciBpZiBvbmUgaGFzIGJlZW4gc3BlY2lmaWVkIG9yIG51bGwuCi0gICAqLwotICBwdWJsaWMgWE1MTG9jYXRvciBnZXRYTUxMb2NhdG9yKCkKLSAgewotICAgIHJldHVybiBsb2NhdG9yOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBYTUxMb2NhdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGxvY2F0b3IgVGhlIFhNTExvY2F0b3IgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0WE1MTG9jYXRvcihYTUxMb2NhdG9yIGxvY2F0b3IpCi0gIHsKLSAgICB0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IGVycm9yIGtleS4KLSAgICogCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3VycmVudEVycm9yS2V5LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDdXJyZW50RXJyb3JLZXkoKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRFcnJvcktleTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgY3VycmVudCBlcnJvciBrZXkuCi0gICAqIAotICAgKiBAcGFyYW0gY3VycmVudEVycm9yS2V5IFRoZSBjdXJyZW50RXJyb3JLZXkgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q3VycmVudEVycm9yS2V5KFN0cmluZyBjdXJyZW50RXJyb3JLZXkpCi0gIHsKLSAgICB0aGlzLmN1cnJlbnRFcnJvcktleSA9IGN1cnJlbnRFcnJvcktleTsKLSAgfQotCi1wdWJsaWMgT2JqZWN0W10gZ2V0TWVzc2FnZUFyZ3VtZW50cygpIHsKLQlyZXR1cm4gbWVzc2FnZUFyZ3VtZW50czsKLX0KLQotCi1wdWJsaWMgdm9pZCBzZXRNZXNzYWdlQXJndW1lbnRzKE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpIHsKLQl0aGlzLm1lc3NhZ2VBcmd1bWVudHMgPSBtZXNzYWdlQXJndW1lbnRzOwotfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHN0YXJ0IGVsZW1lbnRzIGxvY2F0aW9ucy4KLSAgICogCi0gICAqIEByZXR1cm4gCi0gICAqIAkJQSBzdGFjayBjb250YWluaW5nIHRoZSBzdGFydCBlbGVtZW50IGxvY2F0aW9ucy4KLSAgICovCi0gIHByb3RlY3RlZCBTdGFjayBnZXRTdGFydEVsZW1lbnRMb2NhdGlvbnMoKQotICB7Ci0gICAgcmV0dXJuIHN0YXJ0RWxlbWVudExvY2F0aW9uczsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgZXJyb3IgY3VzdG9taXphdGlvbiBtYW5hZ2VyIGZvciB0aGlzIHZhbGlkYXRpb24gcnVuLgotICAgKiAKLSAgICogQHJldHVybgotICAgKiAJVGhlIGVycm9yIGN1c3RvbWl6YXRpb24gbWFuYWdlciBmb3IgdGhpcyB2YWxpZGF0aW9uIHJ1bi4KLSAgICovCi0gIHByb3RlY3RlZCBFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyIGdldEVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIoKQotICB7Ci0JICBpZihlcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyID09IG51bGwpCi0JICB7Ci0JCSAgZXJyb3JDdXN0b21pemF0aW9uTWFuYWdlciA9IG5ldyBFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyKCk7Ci0JICB9Ci0JICByZXR1cm4gZXJyb3JDdXN0b21pemF0aW9uTWFuYWdlcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb259IGluc3RlYWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1VzZVhJbmNsdWRlKCkgewotCSAgcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVTRV9YSU5DTFVERSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2QwOGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgWE1MIFZhbGlkYXRpb24KLSAqLwotcHVibGljIGNsYXNzIFhNTFZhbGlkYXRpb25NZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLnhtbHZhbGlkYXRpb24iOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9CTEVNU19WQUxJREFUSU5HX1VOS05PV05fSE9TVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPQkxFTVNfVkFMSURBVElOR19GSUxFX05PVF9GT1VORDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPQkxFTVNfQ09OTkVDVElPTl9SRUZVU0VEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9XQVJOX05PX0dSQU1NQVI7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgWE1MVmFsaWRhdGlvbk1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFhNTFZhbGlkYXRpb25NZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uUmVwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uUmVwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNGYxZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvblJlcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25SZXBvcnQ7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIHJlcHJlc2VudGlvbiBhIHZhbGlkYXRpb24gcmVwb3J0IGZvciBYTUwgdmFsaWRhdGlvbi4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhNTFZhbGlkYXRpb25SZXBvcnQgZXh0ZW5kcyBWYWxpZGF0aW9uUmVwb3J0Ci17Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIGEgZ3JhbW1hciB3YXMgZW5jb3VudGVyZWQgZHVyaW5nIHRoZSB2YWxpZGF0aW9uLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIGEgZ3JhbW1hciB3YXMgZW5jb3VudGVyZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzR3JhbW1hckVuY291bnRlcmVkKCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIGEgbmFtZXNwYWNlIHdhcyBlbmNvdW50ZXJlZC4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBhIG5hbWVzcGFjZSB3YXMgZW5jb3VudGVyZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTmFtZXNwYWNlRW5jb3VudGVyZWQoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBEVEQgd2l0aG91dCBlbGVtZW50IGRlY2xhcmF0aW9ucyB3YXMgZW5jb3VudGVyZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgYSBEVEQgd2l0aG91dCBlbGVtZW50IGRlY2xhcmF0aW9ucyB3YXMgZW5jb3VudGVyZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0RURFdpdGhvdXRFbGVtZW50RGVjbGFyYXRpb25FbmNvdW50ZXJlZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUyNjhkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIFsyMDU5ODldIC0gW3ZhbGlkYXRpb25dIHZhbGlkYXRlIFhNTCBhZnRlciBYSW5jbHVkZSByZXNvbHV0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVycm9yUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5tc2cuWE1MTWVzc2FnZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlhJbmNsdWRlQXdhcmVQYXJzZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5BdWdtZW50YXRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MQXR0cmlidXRlczsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MTG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Mb2NhbGl6ZWRNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5MYXp5VVJMSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBlcmZvcm1zIHZhbGlkYXRpb24gdXNpbmcgYSB4ZXJjZXMgc2F4IHBhcnNlci4gIAotICogSGVyZSdzIGEgcXVpY2sgb3ZlcnZpZXcgb2YgdGhlIGRldGFpbHMgOiAKLSAqICAgLSBhbiBFcnJvckhhbmRsZXIgaXMgdXNlZCB0byBjb2xsZWN0IGVycm9ycyBpbnRvIGEgbGlzdCAoc28gdGhleSBtYXkgYmUgZGlzcGxheWVkIGJ5IHRoZSBVSSkKLSAqICAgLSBhbiBFbnRpdHlSZXNvbHZlciBpcyB1c2VkIGFsb25nIHdpdGggdGhlIHhlcmNlcyAiZXh0ZXJuYWwtc2NoZW1hTG9jYXRpb24iIHByb3BlcnR5IHRvIGltcGxlbWVudCBYTUwgQ2F0YWxvZyBzdXBwb3J0Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWYWxpZGF0b3IKLXsKLSAgcHJvdGVjdGVkIFVSSVJlc29sdmVyIHVyaVJlc29sdmVyID0gbnVsbDsKLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBpbmdvcmVkRXJyb3JLZXlUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgcHJvdGVjdGVkIFNldCBhZGp1c3RMb2NhdGlvbkVycm9yS2V5U2V0ID0gbmV3IFRyZWVTZXQoKTsKLQotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJR05PUkVfQUxXQVlTID0gIklHTk9SRV9BTFdBWVMiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElHTk9SRV9JRl9EVERfV0lUSE9VVF9FTEVNRU5UX0RFQ0wgPSAiSUdOT1JFX0lGX0RURF9XSVRIT1VUX0VMRU1FTlRfREVDTCI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFTUFUVVJFX0VPRiA9ICJQcmVtYXR1cmVFT0YiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfRUxFTUVOVF9UWVBFX01VU1RfTUFUQ0hfRE9DVFlQRURFQ0wgPSAiUm9vdEVsZW1lbnRUeXBlTXVzdE1hdGNoRG9jdHlwZWRlY2wiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19FTEVNRU5UX05PVF9ERUNMQVJFRCA9ICJNU0dfRUxFTUVOVF9OT1RfREVDTEFSRUQiOyAvLyROT04tTkxTLTEkCi0gIAotICAvLyBXVFAgWE1MIHZhbGlkYXRvciBzcGVjaWZpYyBrZXkuCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0dSQU1NQVJfRk9VTkQgPSAiTk9fR1JBTU1BUl9GT1VORCI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX05PVF9GT1VORF9LRVkgPSAiRklMRV9OT1RfRk9VTkQiOyAvLyROT04tTkxTLTEkCi0gICAKLSAgcHJpdmF0ZSBNYXJrdXBWYWxpZGF0b3IgdmFsID0gbmV3IE1hcmt1cFZhbGlkYXRvcigpOwotICAKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTk1TRyA9IEFubm90YXRpb25Nc2cuY2xhc3MuZ2V0TmFtZSgpOwotIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgWE1MVmFsaWRhdG9yKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy8gSGVyZSB3ZSBhZGQgc29tZSBlcnJvciBrZXlzIHRoYXQgd2UgbmVlZCB0byBmaWx0ZXIgb3V0IHdoZW4gd2UncmUgdmFsaWRhdGlvbiAKLSAgICAvLyBhZ2FpbnN0IGEgRFREIHdpdGhvdXQgYW55IGVsZW1lbnQgZGVjbGFyYXRpb25zLiAgICAgICAKLSAgICBpbmdvcmVkRXJyb3JLZXlUYWJsZS5wdXQoUFJFTUFUVVJFX0VPRiwgSUdOT1JFX0FMV0FZUyk7Ci0gICAgaW5nb3JlZEVycm9yS2V5VGFibGUucHV0KFJPT1RfRUxFTUVOVF9UWVBFX01VU1RfTUFUQ0hfRE9DVFlQRURFQ0wsIElHTk9SRV9JRl9EVERfV0lUSE9VVF9FTEVNRU5UX0RFQ0wpOwotICAgIGluZ29yZWRFcnJvcktleVRhYmxlLnB1dChNU0dfRUxFTUVOVF9OT1RfREVDTEFSRUQsIElHTk9SRV9JRl9EVERfV0lUSE9VVF9FTEVNRU5UX0RFQ0wpOwotICAgIAotICAgIC8vIEhlcmUgd2UgYWRkIHNvbWUgZXJyb3Iga2V5cyB0aGF0IHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IuCi0gICAgLy8gVGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdpbGwgYmUgYWRqdXN0ZWQgdG8gcGxhY2UgdGhlIG1lc3NhZ2Ugb24gdGhlIGxpbmUgb2YgdGhlIHN0YXJ0aW5nCi0gICAgLy8gZWxlbWVudCBpbnN0ZWFkIG9mIG9uIHRoZSBsaW5lIG9mIHRoZSBjbG9zaW5nIGVsZW1lbnQuCi0gICAgYWRqdXN0TG9jYXRpb25FcnJvcktleVNldC5hZGQoIk1TR19DT05URU5UX0lOVkFMSUQiKTsgLy8kTk9OLU5MUy0xJAotICAgIGFkanVzdExvY2F0aW9uRXJyb3JLZXlTZXQuYWRkKCJNU0dfQ09OVEVOVF9JTkNPTVBMRVRFIik7IC8vJE5PTi1OTFMtMSQKLSAgICBhZGp1c3RMb2NhdGlvbkVycm9yS2V5U2V0LmFkZCgiY3ZjLWNvbXBsZXgtdHlwZS4yLjQuYiIpOyAvLyROT04tTkxTLTEkCi0gICAgYWRqdXN0TG9jYXRpb25FcnJvcktleVNldC5hZGQoImN2Yy1jb21wbGV4LXR5cGUuMi4zIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIFVSSSBSZXNvbHZlciB0byB1c2UuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpUmVzb2x2ZXIgVGhlIFVSSSBSZXNvbHZlciB0byB1c2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVUklSZXNvbHZlcihVUklSZXNvbHZlciB1cmlSZXNvbHZlcikKLSAgewotICAgIHRoaXMudXJpUmVzb2x2ZXIgPSB1cmlSZXNvbHZlcjsKLSAgICAvL2VudGl0eVJlc29sdmVyID0gbmV3IE15RW50aXR5UmVzb2x2ZXIodXJpUmVzb2x2ZXIpOwotICB9Ci0KLSAKLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBYTUwgUmVhZGVyLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBYTUwgcmVhZGVyIG9yIG51bGwgaWYgdW5zdWNjZXNzZnVsLgotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIFhNTFJlYWRlciBjcmVhdGVYTUxSZWFkZXIoZmluYWwgWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbywgWE1MRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIpIHRocm93cyBFeGNlcHRpb24KLSAgeyAgICAgCi0gICAgWE1MUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgLy8gbW92ZSB0byBYZXJjZXMtMi4uLiBhZGQgdGhlIGNvbnRleHRDbGFzc0xvYWRlciBzdHVmZgotICAgIENsYXNzTG9hZGVyIHByZXZDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgIE15U3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgTXlTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24odmFsaW5mbyk7Ci0gICAgICByZWFkZXIgPSBuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoY29uZmlndXJhdGlvbikKLSAgICAgIHsKLSAgICAJcHJpdmF0ZSBYTUxMb2NhdG9yIGxvY2F0b3IgPSBudWxsOwotICAgIAkKLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuQWJzdHJhY3RTQVhQYXJzZXIjc3RhcnREb2N1bWVudChvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MTG9jYXRvciwgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS54ZXJjZXMueG5pLk5hbWVzcGFjZUNvbnRleHQsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5BdWdtZW50YXRpb25zKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudChvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MTG9jYXRvciB0aGVMb2NhdG9yLCBqYXZhLmxhbmcuU3RyaW5nIGVuY29kaW5nLCBOYW1lc3BhY2VDb250ZXh0IG5zY29udGV4dCwgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnMgYXVncykgCi0gICAgICAgIHsKLSAgICAgICAgICBsb2NhdG9yID0gdGhlTG9jYXRvcjsKLSAgICAgICAgICB2YWxpbmZvLnNldFhNTExvY2F0b3IodGhlTG9jYXRvcik7Ci0gICAgICAgICAgc3VwZXIuc3RhcnREb2N1bWVudCh0aGVMb2NhdG9yLCBlbmNvZGluZywgbnNjb250ZXh0LCBhdWdzKTsgCi0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5BYnN0cmFjdFNBWFBhcnNlciNzdGFydEVsZW1lbnQob3JnLmFwYWNoZS54ZXJjZXMueG5pLlFOYW1lLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MQXR0cmlidXRlcywgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnMpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoUU5hbWUgYXJnMCwgWE1MQXR0cmlidXRlcyBhcmcxLCBBdWdtZW50YXRpb25zIGFyZzIpIHRocm93cyBYTklFeGNlcHRpb24gCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpbmZvLmdldFN0YXJ0RWxlbWVudExvY2F0aW9ucygpLnB1c2gobmV3IExvY2F0aW9uQ29vcmRpbmF0ZShsb2NhdG9yLmdldExpbmVOdW1iZXIoKSwgbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSkpOwotCQkgIHN1cGVyLnN0YXJ0RWxlbWVudChhcmcwLCBhcmcxLCBhcmcyKTsKLQkJfQotICAgICAgICAKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuQWJzdHJhY3RTQVhQYXJzZXIjZW5kRWxlbWVudChvcmcuYXBhY2hlLnhlcmNlcy54bmkuUU5hbWUsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5BdWdtZW50YXRpb25zKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZW5kRWxlbWVudChRTmFtZSBhcmcwLCBBdWdtZW50YXRpb25zIGFyZzEpIHRocm93cyBYTklFeGNlcHRpb24gewotCQkJc3VwZXIuZW5kRWxlbWVudChhcmcwLCBhcmcxKTsKLQkJCXZhbGluZm8uZ2V0U3RhcnRFbGVtZW50TG9jYXRpb25zKCkucG9wKCk7Ci0JCX0KLSAgICAgIH07Ci0KLSAgICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzIiwgdmFsaW5mby5pc05hbWVzcGFjZUVuY291bnRlcmVkKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiLCB2YWxpbmZvLmlzTmFtZXNwYWNlRW5jb3VudGVyZWQoKSk7ICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgdmFsaW5mby5pc0dyYW1tYXJFbmNvdW50ZXJlZCgpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEiLCB2YWxpbmZvLmlzR3JhbW1hckVuY291bnRlcmVkKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IERlZmF1bHRIYW5kbGVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICB2YWxpbmZvLmdldEVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIoKS5zdGFydEVsZW1lbnQodXJpLCBsb2NhbE5hbWUpOyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICB2YWxpbmZvLmdldEVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIoKS5lbmRFbGVtZW50KHVyaSwgbG9jYWxOYW1lKTsKLSAgICAgICAgfQotICAgICAgfSk7ICAgICAgCi0gICAgICAKLSAgICAgIC8vIE1IIG1ha2Ugc3VyZSB2YWxpZGF0aW9uIHdvcmtzIGV2ZW4gd2hlbiBhIGN1c3RvbWVyIGVudGl0eVJlc29sdmVyIGlzIG5vdGUgc2V0IChpLmUuIHZpYSBzZXRVUklSZXNvbHZlcigpKQotICAgICAgaWYgKGVudGl0eVJlc29sdmVyICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8vYXBhY2hlLm9yZy94bWwvcHJvcGVydGllcy9pbnRlcm5hbC9lbnRpdHktcmVzb2x2ZXIiLCBlbnRpdHlSZXNvbHZlcik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0gIAotICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9kZWNsYXJhdGlvbi1oYW5kbGVyIiwgbmV3IE15RGVjbEhhbmRsZXIoKSk7ICAgICAgLy8kTk9OLU5MUy0xJAotICAgIH0gCi0gICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgeyAKLSAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihwcmV2Q2xhc3NMb2FkZXIpOwotICAgIH0KLSAgICByZXR1cm4gcmVhZGVyOwotICB9ICAKLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGZpbGUgbG9jYXRlZCBhdCB0aGUgZ2l2ZW4gVVJJLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcmV0dXJuIFJldHVybnMgYW4gWE1MIHZhbGlkYXRpb24gcmVwb3J0LgotICAgKi8KLSAgcHVibGljIFhNTFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiB2YWxpZGF0ZSh1cmksIG51bGwsIG5ldyBYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbigpKTsgIAotICB9Ci0KLSAgZmluYWwgU3RyaW5nIGNyZWF0ZVN0cmluZ0ZvcklucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKQotICB7Ci0gICAgLy8gSGVyZSB3ZSBhcmUgcmVhZGluZyB0aGUgZmlsZSBhbmQgc3RvcmluZyB0byBhIHN0cmluZ2J1ZmZlci4KLSAgICBTdHJpbmdCdWZmZXIgZmlsZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJbnB1dFN0cmVhbVJlYWRlciBpbnB1dFJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpbnB1dFJlYWRlcik7Ci0gICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhclsxMDI0XTsKLSAgICAgIGludCBudW1iZXJSZWFkID0gcmVhZGVyLnJlYWQoY2hhcnMpOwotICAgICAgd2hpbGUgKG51bWJlclJlYWQgIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGZpbGVTdHJpbmcuYXBwZW5kKGNoYXJzLCAwLCBudW1iZXJSZWFkKTsKLSAgICAgICAgbnVtYmVyUmVhZCA9IHJlYWRlci5yZWFkKGNoYXJzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vVE9ETzogbG9nIGVycm9yIG1lc3NhZ2UKLSAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZpbGVTdHJpbmcudG9TdHJpbmcoKTsKLSAgfQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGlucHV0U3RyZWFtCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSB0aGUgaW5wdXRTdHJlYW0gb2YgdGhlIGZpbGUgdG8gdmFsaWRhdGUKLSAgICogQHJldHVybiBSZXR1cm5zIGFuIFhNTCB2YWxpZGF0aW9uIHJlcG9ydC4KLSAgICovCi0gIHB1YmxpYyBYTUxWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKQotICB7Ci0JcmV0dXJuIHZhbGlkYXRlKHVyaSwgaW5wdXRTdHJlYW0sIG5ldyBYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbigpKTsKLSAgfQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGlucHV0U3RyZWFtCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIAotICAgKiAJCVRoZSBVUkkgb2YgdGhlIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBpbnB1dHN0cmVhbQotICAgKiAJCVRoZSBpbnB1dFN0cmVhbSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZQotICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotICAgKiAJCUEgY29uZmlndXJhdGlvbiBmb3IgdGhpcyB2YWxpZGF0aW9uIHNlc3Npb24uCi0gICAqIEByZXR1cm4gCi0gICAqIAkJUmV0dXJucyBhbiBYTUwgdmFsaWRhdGlvbiByZXBvcnQuCi0gICAqLwotICBwdWJsaWMgWE1MVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLSAgewotICAgIHJldHVybiB2YWxpZGF0ZSh1cmksIGlucHV0U3RyZWFtLCBjb25maWd1cmF0aW9uLCBudWxsKTsgIAotICB9Ci0gCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgaW5wdXRTdHJlYW0KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgCi0gICAqICAgIFRoZSBVUkkgb2YgdGhlIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBpbnB1dHN0cmVhbQotICAgKiAgICBUaGUgaW5wdXRTdHJlYW0gb2YgdGhlIGZpbGUgdG8gdmFsaWRhdGUKLSAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLSAgICogICAgQSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHZhbGlkYXRpb24gc2Vzc2lvbi4KLSAgICogQHBhcmFtIHJlc3VsdAotICAgKiAgICBUaGUgdmFsaWRhdGlvbiByZXN1bHQKLSAgICogQHJldHVybiAKLSAgICogICAgUmV0dXJucyBhbiBYTUwgdmFsaWRhdGlvbiByZXBvcnQuCi0gICAqLwotICBwdWJsaWMgWE1MVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgVmFsaWRhdGlvblJlc3VsdCByZXN1bHQpCi0gIHsKLQkgIHJldHVybiB2YWxpZGF0ZSh1cmksIGlucHV0U3RyZWFtLCBjb25maWd1cmF0aW9uLCBudWxsLCBudWxsKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBpbnB1dFN0cmVhbQotICAgKiAKLSAgICogQHBhcmFtIHVyaSAKLSAgICogICAgVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGlucHV0c3RyZWFtCi0gICAqICAgIFRoZSBpbnB1dFN0cmVhbSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZQotICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotICAgKiAgICBBIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgdmFsaWRhdGlvbiBzZXNzaW9uLgotICAgKiBAcGFyYW0gcmVzdWx0Ci0gICAqICAgIFRoZSB2YWxpZGF0aW9uIHJlc3VsdAotICAgKiBAcGFyYW0gY29udGV4dAotICAgKiAgICBUaGUgdmFsaWRhdGlvbiBjb250ZXh0ICAgCi0gICAqIEByZXR1cm4gCi0gICAqICAgIFJldHVybnMgYW4gWE1MIHZhbGlkYXRpb24gcmVwb3J0LgotICAgKi8KLSAgcHVibGljIFhNTFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0LCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpCi0gIHsKLSAgICBTdHJpbmcgZ3JhbW1hckZpbGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIFJlYWRlciByZWFkZXIxID0gbnVsbDsgLy8gVXNlZCBmb3IgdGhlIHByZXBhcnNlLgotICAgIFJlYWRlciByZWFkZXIyID0gbnVsbDsgLy8gVXNlZCBmb3IgdmFsaWRhdGlvbiBwYXJzZS4KLSAgICAKLSAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIFN0cmluZyBzdHJpbmcgPSBjcmVhdGVTdHJpbmdGb3JJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSk7Ci0gICAgICByZWFkZXIxID0gbmV3IFN0cmluZ1JlYWRlcihzdHJpbmcpOwotICAgICAgcmVhZGVyMiA9IG5ldyBTdHJpbmdSZWFkZXIoc3RyaW5nKTsKLSAgICB9IAotICAgICAgICAKLSAgICBYTUxWYWxpZGF0aW9uSW5mbyB2YWxpbmZvID0gbmV3IFhNTFZhbGlkYXRpb25JbmZvKHVyaSk7Ci0gICAgTXlFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlciA9IG5ldyBNeUVudGl0eVJlc29sdmVyKHVyaVJlc29sdmVyLCBjb250ZXh0KTsgCi0gICAgVmFsaWRhdG9ySGVscGVyIGhlbHBlciA9IG5ldyBWYWxpZGF0b3JIZWxwZXIoKTsgCi0gICAgdHJ5Ci0gICAgeyAgCi0gICAgICAgIGhlbHBlci5jb21wdXRlVmFsaWRhdGlvbkluZm9ybWF0aW9uKHVyaSwgcmVhZGVyMSwgdXJpUmVzb2x2ZXIpOwotICAgICAgICB2YWxpbmZvLnNldERUREVuY291bnRlcmVkKGhlbHBlci5pc0RUREVuY291bnRlcmVkKTsKLSAgICAgICAgdmFsaW5mby5zZXRFbGVtZW50RGVjbGFyYXRpb25Db3VudChoZWxwZXIubnVtRFRERWxlbWVudHMpOwotICAgICAgICB2YWxpbmZvLnNldE5hbWVzcGFjZUVuY291bnRlcmVkKGhlbHBlci5pc05hbWVzcGFjZUVuY291bnRlcmVkKTsKLSAgICAgICAgdmFsaW5mby5zZXRHcmFtbWFyRW5jb3VudGVyZWQoaGVscGVyLmlzR3JhbW1hckVuY291bnRlcmVkKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFJlYWRlciByZWFkZXIgPSBjcmVhdGVYTUxSZWFkZXIodmFsaW5mbywgZW50aXR5UmVzb2x2ZXIpOwotICAgICAgICAvLyBTZXQgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9uCi0gICAgICAgIGlmIChjb25maWd1cmF0aW9uLmdldEZlYXR1cmUoWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9ob25vdXItYWxsLXNjaGVtYUxvY2F0aW9ucyIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0RmVhdHVyZShYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5VU0VfWElOQ0xVREUpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy94aW5jbHVkZSIsIHRydWUpOyAvLyROT04tTkxTLTEkICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgWE1MRXJyb3JIYW5kbGVyIGVycm9yaGFuZGxlciA9IG5ldyBYTUxFcnJvckhhbmRsZXIodmFsaW5mbyk7Ci0gICAgICAgIHJlYWRlci5zZXRFcnJvckhhbmRsZXIoZXJyb3JoYW5kbGVyKTsKLSAgICAgICAgCi0gICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHVyaSk7Ci0gICAgICAgIGlucHV0U291cmNlLnNldENoYXJhY3RlclN0cmVhbShyZWFkZXIyKTsKLSAgICAgICAgcmVhZGVyLnBhcnNlKGlucHV0U291cmNlKTsgICAKLSAgICAgICAgaWYoY29uZmlndXJhdGlvbi5nZXRJbnRGZWF0dXJlKFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uLklORElDQVRFX05PX0dSQU1NQVIpID4gMCAmJiAKLSAgICAgICAgCQl2YWxpbmZvLmlzVmFsaWQoKSAmJiAhaGVscGVyLmlzR3JhbW1hckVuY291bnRlcmVkKQotICAgICAgICB7Ci0gICAgICAgICAgaWYoY29uZmlndXJhdGlvbi5nZXRJbnRGZWF0dXJlKFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uLklORElDQVRFX05PX0dSQU1NQVIpID09IDEpCi0gICAgICAgICAgICB2YWxpbmZvLmFkZFdhcm5pbmcoWE1MVmFsaWRhdGlvbk1lc3NhZ2VzLl9XQVJOX05PX0dSQU1NQVIsIDEsIDAsIHVyaSwgTk9fR1JBTU1BUl9GT1VORCwgbnVsbCk7Ci0gICAgICAgICAgZWxzZSAvLyAyCi0gICAgICAgICAgICAgIHZhbGluZm8uYWRkRXJyb3IoWE1MVmFsaWRhdGlvbk1lc3NhZ2VzLl9XQVJOX05PX0dSQU1NQVIsIDEsIDAsIHVyaSwgTk9fR1JBTU1BUl9GT1VORCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGVscGVyLmlzRFRERW5jb3VudGVyZWQpCi0gICAgICAgICAgZ3JhbW1hckZpbGUgPSBlbnRpdHlSZXNvbHZlci5nZXRMb2NhdGlvbigpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgZ3JhbW1hckZpbGUgPSBoZWxwZXIuc2NoZW1hTG9jYXRpb25TdHJpbmc7Ci0gICAgfQotICAgIGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBzYXhQYXJzZUV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICAvLyBUaGVzZSBlcnJvcnMgYXJlIGNhdWdodCBieSB0aGUgZXJyb3IgaGFuZGxlci4KLSAgICAgIC8vYWRkVmFsaWRhdGlvbk1lc3NhZ2UodmFsaW5mbywgc2F4UGFyc2VFeGNlcHRpb24pOwotICAgIH0gICAgICAgICAgICAgICAgIAotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4Y2VwdGlvbikKLSAgICB7Ci0gICAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZSh2YWxpbmZvLCBpb0V4Y2VwdGlvbik7Ci0gICAgfSAgICAgICAgICAgICAgICAgCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pCi0gICAgeyAgCi0gICAgCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLSAgICB9Ci0KLSAgICAvLyBOb3cgc2V0IHVwIHRoZSBkZXBlbmRlbmNpZXMKLSAgICAvLyBXcmFwIHdpdGggdHJ5IGNhdGNoIHNvIHRoYXQgaWYgc29tZXRoaW5nIHdyb25nIGhhcHBlbnMsIHZhbGlkYXRpb24gY2FuCi0gICAgLy8gc3RpbGwgcHJvY2VlZCBhcyBiZWZvcmUKLSAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFdvcmtzcGFjZUZpbGVGcm9tTG9jYXRpb24oZ3JhbW1hckZpbGUpOwotICAgICAgICBBcnJheUxpc3QgcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgICByZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLSAgICAgICAgcmVzdWx0LnNldERlcGVuZHNPbigoSVJlc291cmNlIFtdKXJlc291cmNlcy50b0FycmF5KG5ldyBJUmVzb3VyY2UgWzBdKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGUpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTUFSS1VQX1ZBTElEQVRJT04pKXsKLQkgICAgSVJlcG9ydGVyIHJlcG9ydGVyID0gZXhlY3V0ZU1hcmt1cFZhbGlkYXRvcih1cmkpOwotCSAgICBpZiAocmVwb3J0ZXIgIT0gbnVsbCl7Ci0JCSAgICBMaXN0IG1zZ0xpc3QgPSByZXBvcnRlci5nZXRNZXNzYWdlcygpOwotCQkgICAgZm9yIChpbnQgaSA9IDA7aSA8IG1zZ0xpc3Quc2l6ZSgpO2krKyl7Ci0JCSAgICAJTG9jYWxpemVkTWVzc2FnZSBtc2cgPSAoTG9jYWxpemVkTWVzc2FnZSltc2dMaXN0LmdldChpKTsKLQkJICAgIAlpZiAobXNnLmdldFNldmVyaXR5KCkgPT0gMikKLQkJICAgIAkJdmFsaW5mby5hZGRFcnJvcihtc2cuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBtc2cuZ2V0TGluZU51bWJlcigpLCBtc2cuZ2V0T2Zmc2V0KCksdmFsaW5mby5nZXRGaWxlVVJJKCksIm51bGwiLGdldE1zZ0FyZ3VtZW50cyhtc2cpICk7IC8vJE5PTi1OTFMtMSQKLQkJICAgIAllbHNlIGlmIChtc2cuZ2V0U2V2ZXJpdHkoKSA9PSAxKQotCQkgICAgCQl2YWxpbmZvLmFkZFdhcm5pbmcobXNnLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgbXNnLmdldExpbmVOdW1iZXIoKSwgbXNnLmdldE9mZnNldCgpLHZhbGluZm8uZ2V0RmlsZVVSSSgpLCJudWxsIiwgZ2V0TXNnQXJndW1lbnRzKG1zZykpOyAvLyROT04tTkxTLTEkCi0JCSAgICB9Ci0JICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHZhbGluZm87Ci0gICAgICAgCi0gIH0KLQotICBwcml2YXRlIE9iamVjdFtdIGdldE1zZ0FyZ3VtZW50cyhMb2NhbGl6ZWRNZXNzYWdlIG1zZyl7Ci0JICBPYmplY3Qgb2JqID0gbXNnLmdldEF0dHJpYnV0ZShBTk5PVEFUSU9OTVNHKTsKLQkgIHJldHVybiBuZXcgT2JqZWN0W117b2JqfTsKLSAgfQotIAotCi0JcHJpdmF0ZSBJUmVwb3J0ZXIgZXhlY3V0ZU1hcmt1cFZhbGlkYXRvcihTdHJpbmcgdXJpKXsKLQkJUGF0aCBwYXRoID0gbmV3IFBhdGgodXJpKTsKLQkJU3RyaW5nIGZpbGVQcm90b2NvbCA9ICJmaWxlOi8vIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaW5kZXggPSB1cmkuaW5kZXhPZihmaWxlUHJvdG9jb2wpOwotCQkKLQkJSUZpbGUgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAoaW5kZXggPT0gMCl7Ci0JCQlTdHJpbmcgdHJhbnNmb3JtZWRVcmkgPSB1cmkuc3Vic3RyaW5nKGZpbGVQcm90b2NvbC5sZW5ndGgoKSk7Ci0JCQlQYXRoIHRyYW5zZm9ybWVkUGF0aCA9IG5ldyBQYXRoKHRyYW5zZm9ybWVkVXJpKTsKLQkJCXJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24odHJhbnNmb3JtZWRQYXRoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJCi0JCX0KLQkJSVJlcG9ydGVyIHJlcG9ydGVyID0gbnVsbDsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpewotCQkgICAgcmVwb3J0ZXIgPSB2YWwudmFsaWRhdGUocmVzb3VyY2UsIDAsIG5ldyBWYWxPcGVyYXRpb24oKS5nZXRTdGF0ZSgpKSA7Ci0JCX0KLQkJcmV0dXJuIHJlcG9ydGVyOwotCX0KLSAgCi0gIC8qKgotICAgKiBBZGQgYSB2YWxpZGF0aW9uIG1lc3NhZ2UgdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotICAgKiAKLSAgICogQHBhcmFtIHZhbGluZm8gVGhlIHZhbGlkYXRpb24gaW5mbyBvYmplY3QgdG8gYWRkIHRoZSBlcnJvciB0by4KLSAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRoYXQgY29udGFpbnMgdGhlIHZhbGlkYXRpb24gaW5mb3JtYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRWYWxpZGF0aW9uTWVzc2FnZShYTUxWYWxpZGF0aW9uSW5mbyB2YWxpbmZvLCBJT0V4Y2VwdGlvbiBleGNlcHRpb24pCi0gIHsgCi0gICAgU3RyaW5nIHZhbGlkYXRpb25NZXNzYWdlU3RyID0gZXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsKLQlUaHJvd2FibGUgY2F1c2UgPSBleGNlcHRpb24uZ2V0Q2F1c2UoKSAhPSBudWxsID8gZXhjZXB0aW9uLmdldENhdXNlKCkgOiBleGNlcHRpb247Ci0Jd2hpbGUodmFsaWRhdGlvbk1lc3NhZ2VTdHIgPT0gbnVsbCAmJiBjYXVzZSAhPSBudWxsKXsKLQkJU3RyaW5nIGxvY2FsaXplZE1lc3NhZ2UgPSBjYXVzZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JICAgIGNhdXNlID0gY2F1c2UuZ2V0Q2F1c2UoKTsKLQkgICAgaWYoY2F1c2UgPT0gbnVsbCAmJiBsb2NhbGl6ZWRNZXNzYWdlICE9IG51bGwgKQotCSAgICB7Ci0JICAgICAgdmFsaWRhdGlvbk1lc3NhZ2VTdHIgPSBsb2NhbGl6ZWRNZXNzYWdlOwotCSAgICB9Ci0JfQotCQotCWlmICh2YWxpZGF0aW9uTWVzc2FnZVN0ciAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGlvbk1lc3NhZ2VTdHIgPSBOTFMuYmluZChYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1VJX1BST0JMRU1TX1ZBTElEQVRJTkdfRklMRV9OT1RfRk9VTkQsIG5ldyBPYmplY3QgW10geyB2YWxpZGF0aW9uTWVzc2FnZVN0ciB9KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNhdXNlIGluc3RhbmNlb2YgVW5rbm93bkhvc3RFeGNlcHRpb24pCi0gICAgICB7Ci0gICAgCXZhbGlkYXRpb25NZXNzYWdlU3RyID0gTkxTLmJpbmQoWE1MVmFsaWRhdGlvbk1lc3NhZ2VzLl9VSV9QUk9CTEVNU19WQUxJREFUSU5HX1VOS05PV05fSE9TVCwgbmV3IE9iamVjdCBbXSB7IHZhbGlkYXRpb25NZXNzYWdlU3RyIH0pOwotICAgICAgfQotICAgICAgZWxzZSBpZihjYXVzZSBpbnN0YW5jZW9mIENvbm5lY3RFeGNlcHRpb24pCi0gICAgICB7Ci0gICAgCXZhbGlkYXRpb25NZXNzYWdlU3RyID0gWE1MVmFsaWRhdGlvbk1lc3NhZ2VzLl9VSV9QUk9CTEVNU19DT05ORUNUSU9OX1JFRlVTRUQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHZhbGlkYXRpb25NZXNzYWdlU3RyICE9IG51bGwpCi0gICAgewotICAgICAgWE1MTG9jYXRvciBsb2NhdG9yID0gdmFsaW5mby5nZXRYTUxMb2NhdG9yKCk7Ci0gICAgICB2YWxpbmZvLmFkZFdhcm5pbmcodmFsaWRhdGlvbk1lc3NhZ2VTdHIsIGxvY2F0b3IgIT0gbnVsbCA/IGxvY2F0b3IuZ2V0TGluZU51bWJlcigpIDogMSwgbG9jYXRvciAhPSBudWxsID8gbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSA6IDAsIHZhbGluZm8uZ2V0RmlsZVVSSSgpLCBGSUxFX05PVF9GT1VORF9LRVksIG51bGwpOwotICAgIH0KLSAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgLyoqCi0gICAqIEFkZCBhIHZhbGlkYXRpb24gbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaW5mbyBUaGUgdmFsaWRhdGlvbiBpbmZvIG9iamVjdCB0byBhZGQgdGhlIGVycm9yIHRvLgotICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdGhhdCBjb250YWlucyB0aGUgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKFhNTFZhbGlkYXRpb25JbmZvIHZhbGluZm8sIFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgeyAKLSAgICBpZiAoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSAhPSBudWxsKQotICAgIHsgCi0gICAgICB2YWxpbmZvLmFkZEVycm9yKGV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCksIGV4Y2VwdGlvbi5nZXRDb2x1bW5OdW1iZXIoKSwgZXhjZXB0aW9uLmdldFN5c3RlbUlkKCkpOwotICAgIH0KLSAgfQotCi0gIAotICAvKioKLSAgICogQSBjdXN0b20gZW50aXR5IHJlc29sdmVyIHRoYXQgdXNlcyB0aGUgVVJJIHJlc29sdmVyIHNwZWNpZmllZCB0byByZXNvbHZlIGVudGl0aWVzLgotICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIE15RW50aXR5UmVzb2x2ZXIgaW1wbGVtZW50cyBYTUxFbnRpdHlSZXNvbHZlciAKLSAgewotICAgIHByaXZhdGUgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZWREVERMb2NhdGlvbjsKLSAgICBwcml2YXRlIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dDsKLSAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmlSZXNvbHZlciBUaGUgVVJJIHJlc29sdmVyIHRvIHVzZSB3aXRoIHRoaXMgZW50aXR5IHJlc29sdmVyLgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBYTUwgdmFsaWRhdG9yIGNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIE15RW50aXR5UmVzb2x2ZXIoVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIsIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICB0aGlzLnVyaVJlc29sdmVyID0gdXJpUmVzb2x2ZXI7Ci0gICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyI3Jlc29sdmVFbnRpdHkob3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcikKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShYTUxSZXNvdXJjZUlkZW50aWZpZXIgcmlkKSB0aHJvd3MgWE5JRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgWE1MSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBfaW50ZXJuYWxSZXNvbHZlRW50aXR5KHVyaVJlc29sdmVyLCByaWQsIGNvbnRleHQpOwotICAgICAgICBpZiAoaW5wdXRTb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc29sdmVkRFRETG9jYXRpb24gPSBpbnB1dFNvdXJjZS5nZXRTeXN0ZW1JZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnB1dFNvdXJjZTsKLSAgICB9Ci0gICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4gcmVzb2x2ZWREVERMb2NhdGlvbjsKLSAgICB9Ci0gIH0KLSAgCi0gIC8vIGNzIDogSSd2ZSByZWZhY3RvcmVkIHRoZSBjb21tb24gU0FYIGJhc2VkIHJlc29sdXRpb24gY29kZSBpbnRvIHRoaXMgbWV0aG9kIGZvciB1c2UgYnkgb3RoZXIgdmFsaWRhdG9ycyAKLSAgLy8gKGkuZS4gWE1MIFNjaGVtYSwgV1NETCBldGMpLiAgIFRoZSBvdGhlciBhcHByb2FjaCBpcyBtYWludGFpbiBhIGNvcHkgZm9yIGVhY2ggdmFsaWRhdG9yIHRoYXQgaGFzCi0gIC8vIGlkZW50aWNhbCBjb2RlLiAgSW4gYW55IGNhc2Ugd2Ugc2hvdWxkIHN0cml2ZSB0byBlbnN1cmUgdGhhdCB0aGUgdmFsaWRhdG9ycyBwZXJmb3JtIHJlc29sdXRpb24gY29uc2lzdGVudGx5LiAKLSAgcHVibGljIHN0YXRpYyBYTUxJbnB1dFNvdXJjZSBfaW50ZXJuYWxSZXNvbHZlRW50aXR5KFVSSVJlc29sdmVyIHVyaVJlc29sdmVyLCBYTUxSZXNvdXJjZUlkZW50aWZpZXIgcmlkKSB0aHJvd3MgIElPRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gX2ludGVybmFsUmVzb2x2ZUVudGl0eSh1cmlSZXNvbHZlciwgcmlkLCBudWxsKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBYTUxJbnB1dFNvdXJjZSBfaW50ZXJuYWxSZXNvbHZlRW50aXR5KFVSSVJlc29sdmVyIHVyaVJlc29sdmVyLCBYTUxSZXNvdXJjZUlkZW50aWZpZXIgcmlkLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyAgSU9FeGNlcHRpb24KLSAgewotICAgIFhNTElucHV0U291cmNlIGlzID0gbnVsbDsKLSAgICAKLSAgICBpZiAodXJpUmVzb2x2ZXIgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgCi0gICAgICBTdHJpbmcgaWQgPSByaWQuZ2V0UHVibGljSWQoKTsKLSAgICAgIGlmKGlkID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlkID0gcmlkLmdldE5hbWVzcGFjZSgpOwotICAgICAgfQotICAgICAgCi0gICAgICBTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotICAgICAgaWYgKGlkICE9IG51bGwgfHwgcmlkLmdldExpdGVyYWxTeXN0ZW1JZCgpICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgbG9jYXRpb24gPSB1cmlSZXNvbHZlci5yZXNvbHZlKHJpZC5nZXRCYXNlU3lzdGVtSWQoKSwgaWQsIHJpZC5nZXRMaXRlcmFsU3lzdGVtSWQoKSk7Ci0gICAgICB9ICAKLSAgICAgIAotICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFN0cmluZyBwaHlzaWNhbCA9IHVyaVJlc29sdmVyLnJlc29sdmVQaHlzaWNhbExvY2F0aW9uKHJpZC5nZXRCYXNlU3lzdGVtSWQoKSwgaWQsIGxvY2F0aW9uKTsKLQotICAgICAgICAvLyBpZiBwaHlzaWNhbCBpcyBhbHJlYWR5IGEga25vd24gYmFkIHVyaSwganVzdCBnbyBhaGVhZCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgIFhNTE5lc3RlZFZhbGlkYXRvckNvbnRleHQgeG1sQ29udGV4dCA9ICgoWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dCljb250ZXh0KTsKLQotICAgICAgICAgIGlmICh4bWxDb250ZXh0LmlzVVJJTWFya2VkSW5hY2Nlc3NpYmxlKHBoeXNpY2FsKSkKLSAgICAgICAgICB7Ci0gICAgICAgIAkgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihwaHlzaWNhbCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpcyA9IG5ldyBYTUxJbnB1dFNvdXJjZShyaWQuZ2V0UHVibGljSWQoKSwgbG9jYXRpb24sIGxvY2F0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoaXMgYmxvY2sgY2hlY2tzIHRoYXQgdGhlIGZpbGUgZXhpc3RzLiBJZiBpdCBkb2Vzbid0IHdlIG5lZWQgdG8gdGhyb3cKLSAgICAgICAgLy8gYW4gZXhjZXB0aW9uIHNvIFhlcmNlcyB3aWxsIHJlcG9ydCBhbiBlcnJvci4gbm90ZTogVGhpcyBtYXkgbm90IGJlCi0gICAgICAgIC8vIG5lY2Vzc2FyeSB3aXRoIGFsbCB2ZXJzaW9ucyBvZiBYZXJjZXMgYnV0IGhhcyBzcGVjaWZpY2FsbHkgYmVlbiAKLSAgICAgICAgLy8gZXhwZXJpZW5jZWQgd2l0aCB0aGUgdmVyc2lvbiBpbmNsdWRlZCBpbiBJQk0ncyAxLjQuMiBKREsuCi0gICAgICAgIElucHV0U3RyZWFtIGlzVGVtcCA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgaXNUZW1wID0gbmV3IFVSTChwaHlzaWNhbCkub3BlblN0cmVhbSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gcGh5c2ljYWwgd2FzIGEgYmFkIHVybCwgc28gY2FjaGUgaXQgc28gd2Uga25vdyBuZXh0IHRpbWUKLSAgICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIFhNTE5lc3RlZFZhbGlkYXRvckNvbnRleHQpCi0gICAgICAgICAgewotICAgICAgICAgICAgWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dCB4bWxDb250ZXh0ID0gKChYTUxOZXN0ZWRWYWxpZGF0b3JDb250ZXh0KWNvbnRleHQpOwotICAgICAgICAgICAgeG1sQ29udGV4dC5tYXJrVVJJSW5hY2Nlc3NpYmxlKHBoeXNpY2FsKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICBpZihpc1RlbXAgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpc1RlbXAuY2xvc2UoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaXMuc2V0Qnl0ZVN0cmVhbShuZXcgTGF6eVVSTElucHV0U3RyZWFtKHBoeXNpY2FsKSk7ICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpczsgICAgCi0gIH0gICAgICAKLSAgCi0gIC8qKgotICAgKiBBbiBlcnJvciBoYW5kbGVyIHRvIGNhdGNoIGVycm9ycyBlbmNvdW50ZXJlZCB3aGlsZSBwYXJzaW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgWE1MRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyCi0gIHsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IEVSUk9SID0gMDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBXQVJOSU5HID0gMTsKLSAgICBwcml2YXRlIFhNTFZhbGlkYXRpb25JbmZvIHZhbGluZm87Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbGluZm8gVGhlIFhNTCB2YWxpZGF0aW9uIGluZm8gb2JqZWN0IHRoYXQgd2lsbCBob2xkIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyBYTUxFcnJvckhhbmRsZXIoWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbykKLSAgICB7Ci0gICAgICB0aGlzLnZhbGluZm8gPSB2YWxpbmZvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIHZhbGlkYXRpb24gbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgICAqLwotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbiwgaW50IHNldmVyaXR5KQotICAgIHsKLSAgICAgIGlmKGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpICE9IG51bGwpCi0gICAgICB7ICAgICAgIAkKLSAgICAJaW50IGxpbmVOdW1iZXIgPSBleGNlcHRpb24uZ2V0TGluZU51bWJlcigpOwotICAgIAlpbnQgY29sdW1uTnVtYmVyID0gZXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpOwotICAgIAkKLSAgICAJLy8gRm9yIHRoZSBmb2xsb3dpbmcgdGhyZWUgZXJyb3JzIHRoZSBsaW5lIG51bWJlciB3aWxsIGJlIG1vZGlmaWVkIHRvIHVzZSB0aGF0IG9mIHRoZSBzdGFydAotICAgIAkvLyB0YWcgaW5zdGVhZCBvZiB0aGUgZW5kIHRhZy4gVW5sZXNzIGl0cyBhIHNlbGYgZW5kaW5nIHRhZyBhbmQgaW4gdGhhdCBjYXNlIHRoZSBzdGFydEVsZW1lbnRMb2NhdGlvbnMgd2lsbCBiZSBlbXB0eQotICAgIAlTdHJpbmcgY3VycmVudEVycm9yS2V5ID0gdmFsaW5mby5jdXJyZW50RXJyb3JLZXk7Ci0gICAgCWlmIChjdXJyZW50RXJyb3JLZXkgIT0gbnVsbCAmJiBhZGp1c3RMb2NhdGlvbkVycm9yS2V5U2V0LmNvbnRhaW5zKGN1cnJlbnRFcnJvcktleSkgJiYgdmFsaW5mby5nZXRTdGFydEVsZW1lbnRMb2NhdGlvbnMoKS5zaXplKCkgPiAwKSAgCi0gICAgCXsKLSAgICAJICBMb2NhdGlvbkNvb3JkaW5hdGUgYWRqdXN0ZWRDb29yZGluYXRlcyA9IChMb2NhdGlvbkNvb3JkaW5hdGUpdmFsaW5mby5nZXRTdGFydEVsZW1lbnRMb2NhdGlvbnMoKS5wZWVrKCk7Ci0gICAgCSAgbGluZU51bWJlciA9IGFkanVzdGVkQ29vcmRpbmF0ZXMuZ2V0TGluZU51bWJlcigpOwotICAgIAkgIGNvbHVtbk51bWJlciA9IGFkanVzdGVkQ29vcmRpbmF0ZXMuZ2V0Q29sdW1uTnVtbmVyKCk7Ci0gICAgCX0KLSAgICAJCi0gICAgICAgIGlmKHNldmVyaXR5ID09IFdBUk5JTkcpCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpbmZvLmFkZFdhcm5pbmcoZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyLCBleGNlcHRpb24uZ2V0U3lzdGVtSWQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdmFsaW5mby5hZGRFcnJvcihleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIsIGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpLCB2YWxpbmZvLmdldEN1cnJlbnRFcnJvcktleSgpLCB2YWxpbmZvLmdldE1lc3NhZ2VBcmd1bWVudHMoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoZXhjZXB0aW9uLCBFUlJPUik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZShleGNlcHRpb24sIEVSUk9SKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjd2FybmluZyhvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKGV4Y2VwdGlvbiwgV0FSTklORyk7Ci0gICAgfQotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvKiogCi0gICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb3VudCB0aGUgZWxlbWVudERlY2xzIHRoYXQgYXJlIGVuY291bnRlcmVkIGluIGEgRFRELgotICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIE15RGVjbEhhbmRsZXIgaW1wbGVtZW50cyBEZWNsSGFuZGxlciAKLSAgewotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWxpbmZvIFRoZSBYTUxWYWxpZGF0aW9uSW5mbyBvYmplY3QgdGhhdCB3aWxsIGNvdW50IHRoZSBkZWNsYXJhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIE15RGVjbEhhbmRsZXIoKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2F0dHJpYnV0ZURlY2woamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVEZWNsKFN0cmluZyBlTmFtZSwgU3RyaW5nIGFOYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZhbHVlRGVmYXVsdCwgU3RyaW5nIHZhbHVlKSAKLSAgICB7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2VsZW1lbnREZWNsKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZWxlbWVudERlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBtb2RlbCkgCi0gICAgewotICAgICAgLy92YWxpbmZvLmluY3JlYXNlRWxlbWVudERlY2xhcmF0aW9uQ291bnQoKTsKLSAgICB9Ci0gIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlciNleHRlcm5hbEVudGl0eURlY2woamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleHRlcm5hbEVudGl0eURlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSAKLSAgICB7Ci0gICAgfSAgICAgIAotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2ludGVybmFsRW50aXR5RGVjbChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGludGVybmFsRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSAKLSAgICB7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEEgWEluY2x1ZGVBd2FyZVBhcnNlckNvbmZpZ3VyYXRpb24gdGhhdCBjcmVhdGVzIGFuIGVycm9yIHJlcG9ydGVyIHdoaWNoIGNhbiBpZ25vcmUKLSAgICogRFREIGVycm9yIG1lc3NhZ2VzIGZvciBEVEQncyB3aXRoIG5vIGVsZW1lbnRzIGRlZmluZWQuCi0gICAqLwotCi0gIHByb3RlY3RlZCBjbGFzcyBNeVN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbiBleHRlbmRzIFhJbmNsdWRlQXdhcmVQYXJzZXJDb25maWd1cmF0aW9uCi0gIHsKLSAgCVhNTFZhbGlkYXRpb25JbmZvIHZhbGluZm8gPSBudWxsOwotICAgIExpc3QgcmVwb3J0ZWRFeGNlcHRpb25zID0gbmV3IEFycmF5TGlzdCgpOyAKLSAgCQotICAJLyoqCi0gIAkgKiBDb25zdHJ1Y3Rvci4KLSAgCSAqIAotICAJICogQHBhcmFtIHZhbGluZm8gVGhlIFhNTFZhbGlkYXRpb25JbmZvIG9iamVjdCB0byB1c2UuCi0gIAkgKi8KLSAgCXB1YmxpYyBNeVN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbihYTUxWYWxpZGF0aW9uSW5mbyB2YWxpbmZvKQotICAJewotICAJICB0aGlzLnZhbGluZm8gPSB2YWxpbmZvOwotICAJICAKLSAgCSAgWE1MRXJyb3JSZXBvcnRlciBlcnJvclJlcG9ydGVyID0gY3JlYXRlRXJyb3JSZXBvcnRlcigpOwotICAgICAgaWYgKGVycm9yUmVwb3J0ZXIuZ2V0TWVzc2FnZUZvcm1hdHRlcihYTUxNZXNzYWdlRm9ybWF0dGVyLlhNTF9ET01BSU4pID09IG51bGwpIHsKLSAgICAgICAgICBYTUxNZXNzYWdlRm9ybWF0dGVyIHhtZnQgPSBuZXcgWE1MTWVzc2FnZUZvcm1hdHRlcigpOwotICAgICAgICAgIGVycm9yUmVwb3J0ZXIucHV0TWVzc2FnZUZvcm1hdHRlcihYTUxNZXNzYWdlRm9ybWF0dGVyLlhNTF9ET01BSU4sIHhtZnQpOwotICAgICAgICAgIGVycm9yUmVwb3J0ZXIucHV0TWVzc2FnZUZvcm1hdHRlcihYTUxNZXNzYWdlRm9ybWF0dGVyLlhNTE5TX0RPTUFJTiwgeG1mdCk7Ci0gICAgICB9ICAJICAKLSAgICAgIGZFcnJvclJlcG9ydGVyID0gZXJyb3JSZXBvcnRlcjsKLQkgIHNldFByb3BlcnR5KEVSUk9SX1JFUE9SVEVSLCBlcnJvclJlcG9ydGVyKTsKLQkgIGZDb21tb25Db21wb25lbnRzLnJlbW92ZShmRXJyb3JSZXBvcnRlcik7Ci0JICBmQ29tbW9uQ29tcG9uZW50cy5hZGQoZkVycm9yUmVwb3J0ZXIpOwotICAJfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5EVERDb25maWd1cmF0aW9uI2NyZWF0ZUVycm9yUmVwb3J0ZXIoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBYTUxFcnJvclJlcG9ydGVyIGNyZWF0ZUVycm9yUmVwb3J0ZXIoKSAKLSAgICB7Ci0gICAgCXJldHVybiBuZXcgWE1MRXJyb3JSZXBvcnRlcigpCi0JCXsKLSAgICAJCS8qIChub24tSmF2YWRvYykKLSAgICAJCSAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxFcnJvclJlcG9ydGVyI3JlcG9ydEVycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSwgc2hvcnQpCi0gICAgCQkgKi8KLSAgICAJCXB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKFN0cmluZyBkb21haW4sIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3VtZW50cywgc2hvcnQgc2V2ZXJpdHkpIHRocm93cyBYTklFeGNlcHRpb24gCi0gICAgCSAgICB7ICAgICAgICAgICAgICAgICAgICAKLQkJICAgICAgYm9vbGVhbiByZXBvcnRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgIHZhbGluZm8uc2V0Q3VycmVudEVycm9yS2V5KGtleSk7ICAKLQkJCSAgdmFsaW5mby5zZXRNZXNzYWdlQXJndW1lbnRzKGFyZ3VtZW50cyk7Ci0JCSAgICAgIFN0cmluZyBpZ25vcmVDb25kaXRpb24gPSAoU3RyaW5nKWluZ29yZWRFcnJvcktleVRhYmxlLmdldChrZXkpOwotCQkgICAgICBpZiAoaWdub3JlQ29uZGl0aW9uICE9IG51bGwpCi0JCSAgICAgIHsKLQkJICAgICAgICBpZiAoaWdub3JlQ29uZGl0aW9uLmVxdWFscyhYTUxWYWxpZGF0b3IuSUdOT1JFX0lGX0RURF9XSVRIT1VUX0VMRU1FTlRfREVDTCkpCi0JCSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgCi0JCSAgICAgICAgICBib29sZWFuIGlzRFREV2l0aG91dEVsZW1lbnREZWNsYXJhdGlvbkVuY291bnRlcmVkID0gdmFsaW5mby5pc0RURFdpdGhvdXRFbGVtZW50RGVjbGFyYXRpb25FbmNvdW50ZXJlZCgpOyAKLQkJICAgICAgICAgIHJlcG9ydEVycm9yID0gIWlzRFREV2l0aG91dEVsZW1lbnREZWNsYXJhdGlvbkVuY291bnRlcmVkOyAgCi0JCSAgICAgICAgfQotCQkgICAgICAgIGVsc2UgCi0JCSAgICAgICAgewotCQkgICAgICAgICAgcmVwb3J0RXJyb3IgPSBmYWxzZTsKLQkJICAgICAgICB9Ci0JCSAgICAgIH0KLQkJICAgICAgaWYgKCJzY2hlbWFfcmVmZXJlbmNlLjQiLmVxdWFscyhrZXkpICYmIGFyZ3VtZW50cy5sZW5ndGggPiAwKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbG9jYXRpb24gPSBhcmd1bWVudHNbMF07ICAKLSAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgICAgIGlmKHJlcG9ydGVkRXhjZXB0aW9ucy5jb250YWlucyhsb2NhdGlvbikpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydEVycm9yID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkRXhjZXB0aW9ucy5hZGQobG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfSAgICAgICAgICAKLQkJICAgICAgaWYgKHJlcG9ydEVycm9yKQotCQkgICAgICB7Ci0JCSAgICAgICAgc3VwZXIucmVwb3J0RXJyb3IoZG9tYWluLCBrZXksIGFyZ3VtZW50cywgc2V2ZXJpdHkpOwotCQkgICAgICAgIHZhbGluZm8uZ2V0RXJyb3JDdXN0b21pemF0aW9uTWFuYWdlcigpLmNvbnNpZGVyUmVwb3J0ZWRFcnJvcih2YWxpbmZvLCBrZXksIGFyZ3VtZW50cyk7Ci0JCSAgICAgIH0KLQkJICAgIH0KLQkJfTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKiAKLSAgICogQSBsaW5lIGFuZCBjb2x1bW4gbnVtYmVyIGNvb3JkaW5hdGUuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgTG9jYXRpb25Db29yZGluYXRlCi0gIHsJCi0JcHJpdmF0ZSBpbnQgbGluZU5vID0gLTE7Ci0gICAgcHJpdmF0ZSBpbnQgY29sdW1uTm8gPSAtMTsKLSAgICAKLSAgICBwdWJsaWMgTG9jYXRpb25Db29yZGluYXRlKGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVyKQotICAgIHsKLSAgICAgIHRoaXMubGluZU5vID0gbGluZU51bWJlcjsKLSAgICAgIHRoaXMuY29sdW1uTm8gPSBjb2x1bW5OdW1iZXI7Ci0gICAgfQotICAgIAkKLSAgICBwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKQotICAgIHsgCi0gICAgICByZXR1cm4gdGhpcy5saW5lTm87Ci0gICAgfQotICAgIAkKLSAgICBwdWJsaWMgaW50IGdldENvbHVtbk51bW5lcigpCi0gICAgeyAKLSAgICAgIHJldHVybiB0aGlzLmNvbHVtbk5vOwotICAgIH0gCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBJUmVzb3VyY2UgZ2V0V29ya3NwYWNlRmlsZUZyb21Mb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pCi0gIHsKLSAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgLy8gVG8gY2Fub25pY2FsaXplIHRoZSBFTUYgVVJJCi0gICAgSVBhdGggY2Fub25pY2FsRm9ybSA9IG5ldyBQYXRoKGxvY2F0aW9uKTsKLSAgICAvLyBOZWVkIHRvIGNvbnZlcnQgdG8gYWJzb2x1dGUgbG9jYXRpb24uLi4KLSAgICBJUGF0aCBwYXRoTG9jYXRpb24gPSBuZXcgUGF0aChVUklIZWxwZXIucmVtb3ZlUHJvdG9jb2woY2Fub25pY2FsRm9ybS50b1N0cmluZygpKSk7Ci0gICAgLy8gLi4udG8gZmluZCB0aGUgcmVzb3VyY2UgZmlsZSB0aGF0IGlzIGluIHRoZSB3b3Jrc3BhY2UKLSAgICBJUmVzb3VyY2UgcmVzb3VyY2VGaWxlID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aExvY2F0aW9uKTsKLSAgICAvLyBJZiB0aGUgcmVzb3VyY2UgaXMgcmVzb2x2ZWQgdG8gYSBmaWxlIGZyb20gaHR0cCwgb3IgYSBmaWxlIG91dHNpZGUKLSAgICAvLyB0aGUgd29ya3NwYWNlLCB0aGVuIHdlIHdpbGwganVzdCBpZ25vcmUgaXQuCi0gICAgcmV0dXJuIHJlc291cmNlRmlsZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9BYnN0cmFjdE5lc3RlZFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9BYnN0cmFjdE5lc3RlZFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTgzZjQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uQW5ub3RhdGlvbk1zZzsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCB2YWxpZGF0b3IgdGhhdCBhc3Npc3RzIHZhbGlkYXRvcnMgaW4gcnVubmluZyBhbmQgY29udHJpYnV0aW5nCi0gKiBuZXN0ZWQgbWVzc2FnZXMgaW4gdGhlIHZhbGlkYXRpb24gcmVzdWx0cy4gCi0gKiAqbm90ZTogU3ViY2xhc3NlcyBkbyBub3QgbmVlZCB0byBjb250cmlidXRlIG5lc3RlZCBtZXNzYWdlcyBpbiBvcmRlciB0bwotICogYmVuZWZpdCBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBjbGFzcy4gVGhpcyBjbGFzcyB0YWtlcyBjYXJlIG9mIGl0ZXJhdGluZwotICogdGhyb3VnaCByZXN1bHRzIGZvciB2YWxpZGF0b3JzIHRoYXQgdXNlIHRoZSBzdGFuZGFyZCBjb250ZXh0LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3JKb2IgCi17Ci0gIC8vIExvY2FsbHkgdXNlZCwgbm9uLVVJIHN0cmluZ3MuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VEX0ZJTEVfRVJST1JfT1BFTiA9ICJyZWZlcmVuY2VkRmlsZUVycm9yKCI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfRklMRV9FUlJPUl9DTE9TRSA9ICIpIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTF9OT19TTEFTSCA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZTovLy8iOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEdFVF9GSUxFID0gImdldEZpbGUiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEdFVF9QUk9KRUNUX0ZJTEVTID0gImdldEFsbEZpbGVzIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBHRVRfSU5QVVRTVFJFQU0gPSAiaW5wdXRTdHJlYW0iOyAvLyROT04tTkxTLTEkCi0gIAotICAvLyBJbnRlcm5hbCBzdHJpbmdzLiBUaGVzZSBzdHJpbmdzIGFyZSBjb21tb24gYWRkaXRpb24gaW5mb3JtYXRpb24gdHlwZXMuCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OVU1CRVJfQVRUUklCVVRFID0gImNvbHVtbk51bWJlciI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1FVSUdHTEVfU0VMRUNUSU9OX1NUUkFURUdZX0FUVFJJQlVURSA9ICJzcXVpZ2dsZVNlbGVjdGlvblN0cmF0ZWd5IjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUVVJR0dMRV9OQU1FX09SX1ZBTFVFX0FUVFJJQlVURSA9ICJzcXVpZ2dsZU5hbWVPclZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSB2YWxpZGF0aW9uIHVzaW5nIHZlcnNpb24gMiBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JICBWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7ICAKLQkgIElSZXBvcnRlciByZXBvcnRlciA9IHJlc3VsdC5nZXRSZXBvcnRlcihtb25pdG9yKTsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKWZpbGUgPSAoSUZpbGUpcmVzb3VyY2U7Ci0JCWlmIChmaWxlICE9IG51bGwpCi0JCXsKLQkJICBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IG5lc3RlZGNvbnRleHQgPSBnZXROZXN0ZWRDb250ZXh0KHN0YXRlLCBmYWxzZSk7Ci0JICAgICAgYm9vbGVhbiB0ZWFyZG93blJlcXVpcmVkID0gZmFsc2U7Ci0JICAgICAgaWYgKG5lc3RlZGNvbnRleHQgPT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICAvLyB2YWxpZGF0aW9uc3RhcnQgd2FzIG5vdCBjYWxsZWQsIHNvIG1hbnVhbGx5IHNldHVwIGFuZCB0ZWFyIGRvd24KLQkgICAgICAgIG5lc3RlZGNvbnRleHQgPSBnZXROZXN0ZWRDb250ZXh0KHN0YXRlLCB0cnVlKTsKLQkgICAgICAgIHNldHVwVmFsaWRhdGlvbihuZXN0ZWRjb250ZXh0KTsKLQkgICAgICAgIHRlYXJkb3duUmVxdWlyZWQgPSB0cnVlOwotCSAgICAgIH0KLQotCQkgIHZhbGlkYXRlKGZpbGUsIG51bGwsIHJlc3VsdCwgcmVwb3J0ZXIsIG5lc3RlZGNvbnRleHQpOwotCi0JICAgICAgaWYgKHRlYXJkb3duUmVxdWlyZWQpCi0JICAgICAgICB0ZWFyZG93blZhbGlkYXRpb24obmVzdGVkY29udGV4dCk7Ci0JCX0KLQkgICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotIAotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2IjdmFsaWRhdGVJbkpvYihvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIpCi0gICAqLwotICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0LCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIAotICB7Ci0JTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBuZXN0ZWRjb250ZXh0ID0gbmV3IE5lc3RlZFZhbGlkYXRvckNvbnRleHQoKTsKLQlzZXR1cFZhbGlkYXRpb24obmVzdGVkY29udGV4dCk7Ci0JU3RyaW5nW10gZmlsZVVSSXMgPSBjb250ZXh0LmdldFVSSXMoKTsKLQlpZiAoZmlsZVVSSXMgIT0gbnVsbCAmJiBmaWxlVVJJcy5sZW5ndGggPiAwKSAKLQl7Ci0JICBpbnQgbnVtRmlsZXMgPSBmaWxlVVJJcy5sZW5ndGg7Ci0JICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZpbGVzICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIAotCSAgewotCSAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlVVJJc1tpXTsKLQkgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpCi0JICAgIHsgICAgICAgICAgCi0JICAgICAgT2JqZWN0IFtdcGFybXMgPSB7ZmlsZU5hbWV9OwotCi0JICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgY29udGV4dC5sb2FkTW9kZWwoR0VUX0ZJTEUsIHBhcm1zKTsKLQkgICAgICBpZiAoZmlsZSAhPSBudWxsICYmIHNob3VsZFZhbGlkYXRlKGZpbGUpKSAKLQkgICAgICB7IAotCSAgICAJLy8gVGhlIGhlbHBlciBtYXkgbm90IGhhdmUgYSBmaWxlIHN0b3JlZCBpbiBpdCBidXQgbWF5IGhhdmUgYW4gSW5wdXRTdHJlYW0gaWYgYmVpbmcKLQkgICAgCS8vIGNhbGxlZCBmcm9tIGEgc291cmNlIG90aGVyIHRoYW4gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHN1Y2ggYXMgYW4gZWRpdG9yLgotCSAgICAgICAgaWYgKGNvbnRleHQubG9hZE1vZGVsKEdFVF9JTlBVVFNUUkVBTSkgaW5zdGFuY2VvZiBJbnB1dFN0cmVhbSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgdmFsaWRhdGUoZmlsZSwgKElucHV0U3RyZWFtKWNvbnRleHQubG9hZE1vZGVsKEdFVF9JTlBVVFNUUkVBTSksIG51bGwsIHJlcG9ydGVyLCBuZXN0ZWRjb250ZXh0KTsgLy9kbyB3ZSBuZWVkIHRoZSBmaWxlTmFtZT8gIHdoYXQgaXMgaW50IHJ1bGVHcm91cD8KLQkgICAgICAgIH0KLQkgICAgICAgIGVsc2UKLQkgICAgICAgIHsKLQkgICAgCSAgdmFsaWRhdGUoZmlsZSwgbnVsbCwgbnVsbCwgcmVwb3J0ZXIsIG5lc3RlZGNvbnRleHQpOwotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCX0KLQkvLyBUT0RPOiBJcyB0aGlzIG5lZWRlZD8gU2hvdWxkbid0IHRoZSBmcmFtZXdvcmsgcGFzcyB0aGUgY29tcGxldGUgbGlzdD8gCi0JLy8gU2hvdWxkIEkga25vdyB0aGF0IEknbSB2YWxpZGF0aW5nIGEgcHJvamVjdCBhcyBvcHBvc2VkIHRvIGZpbGVzPwotCWVsc2UgCi0gICAgewotICAgICAgT2JqZWN0IFtdcGFybXMgPSB7Z2V0VmFsaWRhdG9ySUQoKX07Ci0gICAgICBDb2xsZWN0aW9uIGZpbGVzID0gKENvbGxlY3Rpb24pIGNvbnRleHQubG9hZE1vZGVsKEdFVF9QUk9KRUNUX0ZJTEVTLCBwYXJtcyk7Ci0gICAgICAvLyBmaWxlcyBjYW4gYmUgbnVsbCBpZiB0aGV5J3JlIG91dHNpZGUgb2YgdGhlIHdvcmtzcGFjZQotICAgICAgaWYgKGZpbGVzICE9IG51bGwpIHsKLQkgICAgICBJdGVyYXRvciBpdGVyID0gZmlsZXMuaXRlcmF0b3IoKTsKLQkgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIAotCSAgICAgIHsKLQkgICAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpIGl0ZXIubmV4dCgpOwotCSAgICAgICAgaWYoc2hvdWxkVmFsaWRhdGUoZmlsZSkpCi0JICAgICAgICB7Ci0JCSAgICAgIHZhbGlkYXRlKGZpbGUsIG51bGwsIG51bGwsIHJlcG9ydGVyLCBuZXN0ZWRjb250ZXh0KTsKLQkgICAgICAgIH0KLQkgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCQotCXRlYXJkb3duVmFsaWRhdGlvbihuZXN0ZWRjb250ZXh0KTsKLQlpZihyZXBvcnRlci5pc0NhbmNlbGxlZCgpKQotCSAgcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICB9Ci0gIAotICAvKioKLSAgICogUHJvdmlkZXMgdGhlIGlkIG9mIHRoaXMgdmFsaWRhdG9yLiBUaGUgSUQgaXMgdXNlZCBieSB0aGUgdmFsaWRhdGlvbgotICAgKiBmcmFtZXdvcmsuIEl0IHVzdWFsbHkgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjbGFzcwotICAgKiBpbXBsZW1lbnRpbmcgdGhlIElWYWxpZGF0b3IgaW50ZXJmYWNlLgotICAgKiAKLSAgICogQHJldHVybiBhIFN0cmluZyB3aXRoIHRoZSBJRCBvZiB0aGlzIHZhbGlkYXRvci4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdG9ySUQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQZXJmb3JtIHNldCB1cCBiZWZvcmUgdmFsaWRhdGlvbiBydW5zLiBTdWJjbGFzc2VzIG1heSBpbXBsZW1lbnQgdGhpcwotICAgKiBtZXRob2QgdG8gcGVyZm9ybSB2YWxpZGF0aW9uIHNwZWNpZmljIHNldCB1cC4KLSAgICogCi0gICAqIEBwYXJhbSBjb250ZXh0Ci0gICAqIAkJVGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldHVwVmFsaWRhdGlvbihOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpCi0gIHsKLQkvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLSAgfQotICAKLSAgLyoqCi0gICAqIFBlcmZvcm0gdGVhciBkb3duIGFmdGVyIHZhbGlkYXRpb24gcnVucy4gU3ViY2xhc3NlcyBtYXkgaW1wbGVtZW50IHRoaXMKLSAgICogbWV0aG9kIHRvIHBlcmZvcm0gdmFsaWRhdGlvbiBzcGVjaWZpYyB0ZWFyIGRvd24uCi0gICAqIAotICAgKiBAcGFyYW0gY29udGV4dAotICAgKiAJCVRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB0ZWFyZG93blZhbGlkYXRpb24oTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KQotICB7Ci0JLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2IjZ2V0U2NoZWR1bGluZ1J1bGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKElWYWxpZGF0aW9uQ29udGV4dCBhcmcwKSAKLSAgewotCS8vIFRPRE8gcmV2aWV3IHdoZXRoZXIgcmV0dXJuaW5nIGEgbnVsbCBydWxlIGlzIGNvcnJlY3QuIEdhcnkgaGFkIGEgc3VnZ2VzdGlvbiBpbiB0aGUgYnVnIHJlcG9ydC4KLQlyZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IjY2xlYW51cChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIGFyZzApIAotICB7Ci0gICAgLy8gTm8gY2xlYW51cCB0byBwZXJmb3JtLiBTdWJjbGFzc2VzIGFyZSBmcmVlIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZC4KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gCi0gIHsgIAotCXZhbGlkYXRlSW5Kb2IoY29udGV4dCwgcmVwb3J0ZXIpOwotICB9Ci0JCi0JCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgYSBnaXZlbiBmaWxlIHNob3VsZCBiZSB2YWxpZGF0ZWQuIAotICAgKiAKLSAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdGhhdCBtYXkgYmUgdmFsaWRhdGVkLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgc2hvdWxkIGJlIHZhbGlkYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZShJRmlsZSBmaWxlKSAKLSAgewotCUlSZXNvdXJjZSByZXNvdXJjZSA9IGZpbGU7Ci0JZG8gCi0JewotCSAgaWYgKHJlc291cmNlLmlzRGVyaXZlZCgpIHx8IHJlc291cmNlLmlzVGVhbVByaXZhdGVNZW1iZXIoKSB8fCAKLQkJICAhcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkgfHwgcmVzb3VyY2UuZ2V0TmFtZSgpLmNoYXJBdCgwKSA9PSAnLicpIAotCSAgewotCQlyZXR1cm4gZmFsc2U7Ci0JICB9Ci0JICByZXNvdXJjZSA9IHJlc291cmNlLmdldFBhcmVudCgpOwotCX13aGlsZSAoKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5QUk9KRUNUKSA9PSAwKTsKLQkKLQlyZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBnaXZlbiBmaWxlIGFuZCB1c2UgdGhlIHJlcG9ydGVyIGZvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgcGVyZm9ybSB0aGUgdmFsaWRhdGlvbiBsb2dpYyBidXQgcmF0aGVyIGRlbGVnYXRlcwotICAgKiB0byB0aGUgdmFsaWRhdGUgbWV0aG9kIGluIHN1YmNsYXNzZXMgdG8gdmFsaWRhdGUuIFRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlCi0gICAqIGZvciByZXBvcnRpbmcgdGhlIG1lc3NhZ2VzIHRoYXQgcmVzdWx0IGZyb20gdmFsaWRhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlIAotICAgKiAJCUFuIElGaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gaW5wdXRzdHJlYW0gCi0gICAqIAkJQW4gSW5wdXRTdHJlYW0gdGhhdCByZXByZXNlbnRzIHRoZSBmaWxlLiBUaGUgSW5wdXRTdHJlYW0gbWF5IGJlIG51bGwKLSAgICogCQlpbiB3aGljaCBjYXNlIHRoZSBmaWxlcyBzaG91bGQgYmUgdmFsaWRhdGVkIGZyb20gdGhlIElGaWxlLgotICAgKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHZhbGlkYXRpb24gcmVzdWx0Ci0gICAqIEBwYXJhbSByZXBvcnRlciAKLSAgICogCQlUaGUgcmVwb3J0ZXIgd2l0aCB3aGljaCB0byByZXBvcnQgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogQHBhcmFtIGNvbnRleHQKLSAgICogCQlUaGUgY29udGV4dCBvZiB0aGUgY3VycmVudCB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKElGaWxlIGZpbGUsIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCwgSVJlcG9ydGVyIHJlcG9ydGVyLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpCi0gIHsgIAotCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotICAgIHJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKHRoaXMsIG1lc3NhZ2UpOwotICAgIAotCVN0cmluZyBsb2NhdGlvblN0cmluZyA9IG51bGw7CQkKLQlpZiAoZmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJbG9jYXRpb25TdHJpbmcgPSBmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQl9Ci0JaWYgKGxvY2F0aW9uU3RyaW5nID09IG51bGwgJiYgZmlsZS5nZXRMb2NhdGlvblVSSSgpICE9IG51bGwpIHsKLQkJbG9jYXRpb25TdHJpbmcgPSBmaWxlLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKTsKLQl9Ci0JaWYgKGxvY2F0aW9uU3RyaW5nID09IG51bGwpIHsKLQkJbG9jYXRpb25TdHJpbmcgPSBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQl9Ci0JU3RyaW5nIHVyaSA9IGNyZWF0ZVVSSUZvckZpbGVQYXRoKGxvY2F0aW9uU3RyaW5nKTsKLQotCWNsZWFyTWFya2VycyhmaWxlLCB0aGlzLCByZXBvcnRlcik7Ci0JCi0JVmFsaWRhdGlvblJlcG9ydCB2YWxyZXBvcnQgPSBudWxsOwotCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkgIHZhbHJlcG9ydCA9IHZhbGlkYXRlKHVyaSwgaW5wdXRzdHJlYW0sIGNvbnRleHQpOwotCWVsc2UKLQkgIHZhbHJlcG9ydCA9IHZhbGlkYXRlKHVyaSwgaW5wdXRzdHJlYW0sIGNvbnRleHQsIHJlc3VsdCk7Ci0JCi0JY3JlYXRlTWFya2VycyhmaWxlLCB2YWxyZXBvcnQuZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCksIHJlcG9ydGVyKTsKLQkgICAgICAgIAotCXRyeQotCXsKLQkgIGZpbGUuc2V0U2Vzc2lvblByb3BlcnR5KFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SX01FU1NBR0VfTUFQX1FVQUxJRklFRF9OQU1FLCB2YWxyZXBvcnQuZ2V0TmVzdGVkTWVzc2FnZXMoKSk7Ci0JfQotCWNhdGNoKENvcmVFeGNlcHRpb24gZSkKLQl7Ci0JICBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBzZXQgbmVzdGVkIG1lc3NhZ2VzIHByb3BlcnR5LiIpOyAvLyROT04tTkxTLTEkCi0JfQotICB9Ci0JCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gZmlsZSBhbmQgdXNlIHRoZSByZXBvcnRlciBmb3IgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqIENsaWVudHMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2Qgd2l0aCB0aGVpciBzcGVjaWZpYyB2YWxpZGF0aW9uIGxvZ2ljLgotICAgKiAKLSAgICogQHBhcmFtIHVyaQotICAgKiAJCVRoZSBVUkkgb2YgdGhlIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBpbnB1dHN0cmVhbSAKLSAgICogCQlBbiBJbnB1dFN0cmVhbSB0aGF0IHJlcHJlc2VudHMgdGhlIGZpbGUuIFRoZSBJbnB1dFN0cmVhbSBtYXkgYmUgbnVsbAotICAgKiAJCWluIHdoaWNoIGNhc2UgdGhlIGZpbGVzIHNob3VsZCBiZSB2YWxpZGF0ZWQgZnJvbSB0aGUgSUZpbGUuCi0gICAqIEBwYXJhbSBjb250ZXh0Ci0gICAqIAkJVGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbi4KLSAgICogQHJldHVybgotICAgKiAJCUEgdmFsaWRhdGlvbiByZXBvcnQgc3VtbWFyaXppbmcgdGhlIHZhbGlkYXRpb24uCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dHN0cmVhbSwgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KTsKLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gZmlsZSBhbmQgdXNlIHRoZSByZXBvcnRlciBmb3IgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqIENsaWVudHMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHdpdGggdGhlaXIgc3BlY2lmaWMgdmFsaWRhdGlvbiBsb2dpYy4KLSAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGFic3RyYWN0IHZlcnNpb24uCi0gICAqIERlc2lnbiBkZWNpc2lvbiB0byBub3QgbWFrZSB0aGlzIGFic3RyYWN0LgotICAgKiAKLSAgICogQHBhcmFtIHVyaQotICAgKiBAcGFyYW0gaW5wdXRzdHJlYW0KLSAgICogQHBhcmFtIGNvbnRleHQKLSAgICogQHBhcmFtIHJlc3VsdAotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dHN0cmVhbSwgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0LCBWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCkKLSAgewotICAgIHJldHVybiB2YWxpZGF0ZSh1cmksIGlucHV0c3RyZWFtLCBjb250ZXh0KTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBjbGVhcnMgYWxsIHRoZSBtYXJrZXJzIG9uIHRoZSBnaXZlbiBJRmlsZSBmb3IgYSBzcGVjaWZpZWQKLSAgICogdmFsaWRhdG9yLgotICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBzdWJjbGFzc2VzLgotICAgKiAKLSAgICogQHBhcmFtIGlGaWxlCi0gICAqIAkJVGhlIElGaWxlIGZyb20gd2hpY2ggdG8gY2xlYXIgdGhlIG1hcmtlcnMuCi0gICAqIEBwYXJhbSB2YWxpZGF0b3IKLSAgICogCQlUaGUgdmFsaWRhdG9yIGZvciB3aGljaCB0byByZW1vdmUgdGhlIG1hcmtlcnMuCi0gICAqIEBwYXJhbSByZXBvcnRlcgotICAgKiAJCVRoZSByZXBvcnRlciB0aGF0IGNhbiByZW1vdmUgdGhlIG1hcmtlcnMuCi0gICAqLwotICBwcml2YXRlIHZvaWQgY2xlYXJNYXJrZXJzKElGaWxlIGlGaWxlLCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgSVJlcG9ydGVyIHJlcG9ydGVyKQotICB7Ci0JaWYgKGZpbGVJc0FjY2Vzc2libGUoaUZpbGUpKQotCXsKLQkgIHJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHZhbGlkYXRvciwgaUZpbGUpOwotCX0KLSAgfQotCSAgCi0gIC8qKgotICAgKiBUZXN0IHdoZXRoZXIgdGhlIGdpdmVuIGZpbGUgaXMgYWNjZXNzaWJsZSBhbmQgbWF5IGJlIHVzZWQgZm9yIHZhbGlkYXRpb24uIEEgZmlsZSBpcyAKLSAgICogYXZhaWxhYmxlIGlmIAotICAgKiAxLiBJdCBpcyBub3QgbnVsbC4KLSAgICogMi4gSXQgZXhpc3RzLiAKLSAgICogMy4gVGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgZmlsZSBpcyBhY2Nlc3NpYmxlLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGUgCi0gICAqIAkJVGhlIGZpbGUgdG8gY2hlY2sgdG8gZW5zdXJlIGl0IGlzIGFjY2Vzc2libGUuCi0gICAqIEByZXR1cm4gCi0gICAqIAkJVHJ1ZSBpZiB0aGUgZmlsZSBpcyBhY2Nlc3NpYmxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gZmlsZUlzQWNjZXNzaWJsZShJRmlsZSBmaWxlKQotICB7Ci0gICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpICYmIGZpbGUuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKQotCXsKLQkgIHJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci0gIH0KLQkgIAotICAvKioKLSAgICogRm9ybWF0IGEgZmlsZSBuYW1lIGludG8gYSBjb3JyZWN0IFVSSS4gCi0gICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHN1YmNsYXNzZXMuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZW5hbWUgCi0gICAqIAkJVGhlIGZpbGUgbmFtZSB0byBmb3JtYXQuCi0gICAqIEByZXR1cm4gCi0gICAqIAkJCi0gICAqIFRoZSBmb3JtYXR0ZWQgVVJJLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlVVJJRm9yRmlsZVBhdGgoU3RyaW5nIGZpbGVuYW1lKQotICB7Ci0JaWYoIWZpbGVuYW1lLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTF9OT19TTEFTSCkpCi0JewotCSAgd2hpbGUoZmlsZW5hbWUuc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JICB7Ci0JICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDEpOwotCSAgfQotCSAgZmlsZW5hbWUgPSBGSUxFX1BST1RPQ09MICsgZmlsZW5hbWU7Ci0JfQotCXJldHVybiBmaWxlbmFtZTsKLSAgfQotCSAgCi0gIC8qKgotICAgKiBDcmVhdGUgbWFya2VycyBmb3IgdGhlIHZhbGlhdGlvbiBtZXNzYWdlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgdmFsaWRhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBpRmlsZQotICAgKiAgICAgICAgICBUaGUgcmVzb3VyY2UgdG8gY3JlYXRlIHRoZSBtYXJrZXJzIG9uLgotICAgKiBAcGFyYW0gdmFsbWVzc2FnZXMKLSAgICogICAgICAgICAgVGhlIGFycmF5IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjcmVhdGVNYXJrZXJzKElGaWxlIGlGaWxlLCBWYWxpZGF0aW9uTWVzc2FnZVtdIHZhbG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpCi0gIHsKLSAgICBpZiAoIWZpbGVJc0FjY2Vzc2libGUoaUZpbGUpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IG51bW1lc3NhZ2VzID0gdmFsbWVzc2FnZXMubGVuZ3RoOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtbWVzc2FnZXM7IGkrKykKLSAgICB7Ci0gICAgICBWYWxpZGF0aW9uTWVzc2FnZSB2YWxpZGF0aW9uTWVzc2FnZSA9IHZhbG1lc3NhZ2VzW2ldOwotICAgICAgU3RyaW5nIHVyaSA9IHZhbGlkYXRpb25NZXNzYWdlLmdldFVyaSgpOwotCi0gICAgICBMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2U7Ci0gICAgICBpZiAodmFsaWRhdGlvbk1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSA9PSBWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTE9XKQotICAgICAgewotICAgICAgICBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLCAKLSAgICAgICAgCQl2YWxpZGF0aW9uTWVzc2FnZS5nZXRNZXNzYWdlKCksIGlGaWxlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgCi0gICAgICAgIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCB2YWxpZGF0aW9uTWVzc2FnZS5nZXRNZXNzYWdlKCksIGlGaWxlKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgbWVzc2FnZS5zZXRMaW5lTm8odmFsaWRhdGlvbk1lc3NhZ2UuZ2V0TGluZU51bWJlcigpKTsKLSAgICAgIGFkZEluZm9Ub01lc3NhZ2UodmFsaWRhdGlvbk1lc3NhZ2UsIG1lc3NhZ2UpOwotICAgICAgT2JqZWN0W10gb2JqbGlzdCA9IHZhbGlkYXRpb25NZXNzYWdlLmdldE1lc3NhZ2VBcmd1bWVudHMoKTsKLSAgICAgIGlmIChvYmpsaXN0ICE9IG51bGwgJiYgb2JqbGlzdC5sZW5ndGggPT0xICl7Ci0gICAgCSAgT2JqZWN0IG9iaiA9IG9iamxpc3RbMF07Ci0gICAgCSAgaWYgKG9iaiBpbnN0YW5jZW9mIEFubm90YXRpb25Nc2cpewotCSAgICAJIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKEFubm90YXRpb25Nc2cuUFJPQk1MRU1fSUQsIG5ldyBJbnRlZ2VyKCgoQW5ub3RhdGlvbk1zZylvYmopLmdldFByb2JsZW1JZCgpKSk7Ci0JICAgIAkgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoQW5ub3RhdGlvbk1zZy5MRU5HVEgsIG5ldyBJbnRlZ2VyKCgoQW5ub3RhdGlvbk1zZylvYmopLmdldExlbmd0aCgpKSk7Ci0JICAgIAkgIE9iamVjdCBvYmoxID0gKChBbm5vdGF0aW9uTXNnKW9iaikuZ2V0QXR0cmlidXRlVmFsdWVUZXh0KCk7Ci0JICAgIAkgIGlmIChvYmoxIGluc3RhbmNlb2YgU3RyaW5nKXsKLQkgICAgCQkgIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKEFubm90YXRpb25Nc2cuQVRUUlZBTFVFVEVYVCwgb2JqMSk7Ci0JICAgIAkgIH0KLQkgICAgCSAgZWxzZSBpZiAoIG9iajEgaW5zdGFuY2VvZiBPYmplY3RbXSl7Ci0JICAgIAkJICBPYmplY3RbXSBvYmpBcnJheSA9IChPYmplY3RbXSlvYmoxOwotCSAgICAJCSAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoQW5ub3RhdGlvbk1zZy5BVFRSVkFMVUVOTywgbmV3IEludGVnZXIob2JqQXJyYXkubGVuZ3RoKSk7Ci0JICAgIAkJICBmb3IgKGludCBqPTA7IGogPG9iakFycmF5Lmxlbmd0aDtqKyspewotCSAgICAJCQkgIE9iamVjdCBvYmoyID0gb2JqQXJyYXlbal07Ci0JICAgIAkJCSAgU3RyaW5nIGF0dHJOYW1lID0gQW5ub3RhdGlvbk1zZy5BVFRSTk8gKyBqOwotCSAgICAJCQkgIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBvYmoyKTsKLQkgICAgCQkgIH0KLQkgICAgCQkgIAotCSAgICAJICB9Ci0gICAgCSAgfQotICAgICAgfQotICAgICAgTGlzdCBuZXN0ZWRlcnJvcnMgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXROZXN0ZWRNZXNzYWdlcygpOwotICAgICAgaWYgKG5lc3RlZGVycm9ycyAhPSBudWxsICYmICFuZXN0ZWRlcnJvcnMuaXNFbXB0eSgpKQotICAgICAgewotICAgICAgICBtZXNzYWdlLnNldEdyb3VwTmFtZShSRUZFUkVOQ0VEX0ZJTEVfRVJST1JfT1BFTiArIHVyaSArIFJFRkVSRU5DRURfRklMRV9FUlJPUl9DTE9TRSk7Ci0gICAgICB9Ci0KLSAgICAgIHJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JICAgICAgCi0gICAgfQotICB9Ci0JICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGFsbG93cyB0aGUgYWRkaXRpb24gb2YgaW5mb3JtYXRpb24gdG8gdGhlIHZhbGlkYXRpb24gbWVzc2FnZQotICAgKiBAcGFyYW0gdmFsaWRhdGlvbm1lc3NhZ2UKLSAgICogCQlUaGUgVmFsaWRhdGlvbk1lc3NhZ2UgdG8gcmV0cmlldmUgdGhlIGluZm9ybWF0aW9uIGZyb20uCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqIAkJVGhlIElNZXNzYWdlIHRvIGFkZCB0aGUgaW5mb3JtYXRpb24gdG8uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRJbmZvVG9NZXNzYWdlIChWYWxpZGF0aW9uTWVzc2FnZSB2YWxpZGF0aW9ubWVzc2FnZSwgSU1lc3NhZ2UgbWVzc2FnZSkKLSAgeyAKLQkvLyBUaGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzCi0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBuZXN0ZWQgdmFsaWRhdGlvbiBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIHN0YXRlCi0gICAqICAgICAgICAgIHRoZSB2YWxpZGF0aW9uIHN0YXRlLgotICAgKiBAcGFyYW0gY3JlYXRlCi0gICAqICAgICAgICAgIHdoZW4gdHJ1ZSwgYSBuZXcgY29udGV4dCB3aWxsIGJlIGNyZWF0ZWQgaWYgb25lIGlzIG5vdCBmb3VuZAotICAgKiBAcmV0dXJuIHRoZSBuZXN0ZWQgdmFsaWRhdGlvbiBjb250ZXh0LgotICAgKi8KLSAgcHJvdGVjdGVkIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgZ2V0TmVzdGVkQ29udGV4dChWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIGJvb2xlYW4gY3JlYXRlKQotICB7Ci0gICAgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKLSAgICBpZiAoY3JlYXRlKQotICAgIHsKLSAgICAgIGNvbnRleHQgPSBuZXcgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCgpOwotICAgIH0KLSAgICByZXR1cm4gY29udGV4dDsKLSAgfQotCi0gIC8qKgotICAgKiBBIGxvY2FsaXplZCBtZXNzYWdlIGlzIGEgc3BlY2lhbGl6ZWQgdHlwZSBvZiBJTWVzc2FnZSB0aGF0IGFsbG93cyBzZXR0aW5nCi0gICAqIGFuZCB1c2luZyBhIGxvY2FsaXplZCBtZXNzYWdlIHN0cmluZyBmb3IgYSBtZXNzYWdlLgotICAgKi8KLSAgY2xhc3MgTG9jYWxpemVkTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2UgCi0gIHsKLSAgICBwcml2YXRlIFN0cmluZyBfbWVzc2FnZSA9IG51bGw7Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCkgCi0JewotCSAgdGhpcyhzZXZlcml0eSwgbWVzc2FnZVRleHQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0KSAKLQl7Ci0JICB0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgKE9iamVjdCkgdGFyZ2V0T2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgT2JqZWN0IHRhcmdldE9iamVjdCkgCi0JewotCSAgc3VwZXIobnVsbCwgc2V2ZXJpdHksIG51bGwpOwotCSAgc2V0TG9jYWxpemVkTWVzc2FnZShtZXNzYWdlVGV4dCk7Ci0JICBzZXRUYXJnZXRPYmplY3QodGFyZ2V0T2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbGl6ZWRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSAKLQl7Ci0JICBfbWVzc2FnZSA9IG1lc3NhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkgCi0JewotCSAgcmV0dXJuIF9tZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIAotCXsKLQkgIHJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KENsYXNzTG9hZGVyIGNsKSAKLQl7Ci0JICByZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCkgCi0JewotCSAgcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwsIENsYXNzTG9hZGVyIGNsKSAKLQl7Ci0JICByZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NDk3YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIHZhbGlkYXRpb24gaW4gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICogCi0gKiBAYXV0aG9yIEVybmVzdCBNYWggKGVybmVzdEBjYS5pYm0uY29tKQotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgSGVscGVyIGV4dGVuZHMgV29ya2JlbmNoQ29udGV4dAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfUFJPSkVDVF9GSUxFUyA9ICJnZXRBbGxGaWxlcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0ZJTEUgPSAiZ2V0RmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgLy9kdyBwcml2YXRlIHN0YXRpYyBmaW5hbCBJQ29udGFpbmVyW10gTk9fQ09OVEFJTkVSUyA9IG5ldyBJQ29udGFpbmVyWzBdOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUiA9ICJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5wcm9ibGVtbWFya2VyIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUl9PV05FUiA9ICJvd25lciI7ICAgLy8kTk9OLU5MUy0xJAotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBIZWxwZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLQotICAgIC8vIHRoZSBmb2xsb3dpbmcgd2lsbCByZWdpc3RlciB0aGUgaGVscGVyJ3Mgc3ltYm9saWMgbWV0aG9kcwotICAgIENsYXNzIFtdIGFyZ3MgPSBuZXcgQ2xhc3NbMV0gOwotICAgIGFyZ3NbMF0gPSBTdHJpbmcuY2xhc3MgOyAgLy8gYSBzdHJpbmcgYXJndW1lbnQgZGVub3RpbmcgYSBzcGVjaWZpYyBKU1AuCi0gICAgCi0gICAgcmVnaXN0ZXJNb2RlbChHRVRfRklMRSwgImdldEZpbGUiLCBhcmdzKTsvLyROT04tTkxTLTEkCi0gICAgcmVnaXN0ZXJNb2RlbChHRVRfUFJPSkVDVF9GSUxFUywgImdldEZpbGVzIiwgYXJncyk7Ly8kTk9OLU5MUy0xJAotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgSUZpbGUgZm9yIHRoZSBnaXZlbiBmaWxlbmFtZS4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byByZXRyaWV2ZS4KLSAgICogQHJldHVybiBBbiBJRmlsZSByZXByZXNlbnRpbmcgdGhlIGZpbGUgc3BlY2lmaWVkIG9yIG51bGwgaWYgaXQgY2FuJ3QgYmUgcmVzb2x2ZWQuCi0gICAqLwotICBwdWJsaWMgSUZpbGUgZ2V0RmlsZShTdHJpbmcgZmlsZW5hbWUpCi0gIHsKLSAgICAvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZpbGUgbmFtZSA9ICIgKyBmaWxlbmFtZSk7Ci0gICAgSVJlc291cmNlIHJlcyA9IGdldFByb2plY3QoKS5maW5kTWVtYmVyKGZpbGVuYW1lLCB0cnVlKTsgLy8gdHJ1ZSBtZWFucyBpbmNsdWRlIHBoYW50b20gcmVzb3VyY2VzCi0gICAgaWYgKHJlcyBpbnN0YW5jZW9mIElGaWxlKSAKLSAgICB7Ci0gICAgICByZXR1cm4gKElGaWxlKSByZXM7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBjb2xsZWN0aW9uIG9mIGZpbGVzIGZyb20gdGhlIHByb2plY3QgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIHRoZQotICAgKiB2YWxpZGF0b3Igd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgbmFtZS4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcy4KLSAgICogQHJldHVybiBUaGUgY29sbGVjdGlvbiBvZiBmaWxlcyByZWxldmFudCBmb3IgdGhlIHZhbGlkYXRvciBjbGFzcyBzcGVjaWZpZWQuCi0gICAqLwotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRGaWxlcyhTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lKQotICB7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLSAgICBMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGdldEZpbGVzKGZpbGVzLCBwcm9qZWN0LCB2YWxpZGF0b3JDbGFzc05hbWUpOwotICAgIHJldHVybiBmaWxlczsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvbGxlY3Rpb24gb2YgZmlsZXMgZnJvbSB0aGUgcHJvamVjdCB0aGF0IGFyZSByZWxldmFudCBmb3IgdGhlCi0gICAqIHZhbGlkYXRvciB3aXRoIHRoZSBnaXZlbiBjbGFzcyBuYW1lLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGVzIFRoZSBmaWxlcyByZWxldmFudCBmb3IgdGhlIGNsYXNzIG5hbWUuCi0gICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgcmVzb3VyY2UgdG8gbG9vayBmb3IgZmlsZXMgaW4uCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGdldEZpbGVzKENvbGxlY3Rpb24gZmlsZXMsIElDb250YWluZXIgcmVzb3VyY2UsIFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgW10gcmVzb3VyY2VBcnJheSA9IHJlc291cmNlLm1lbWJlcnMoZmFsc2UpOwotICAgICAgZm9yIChpbnQgaT0wOyBpPHJlc291cmNlQXJyYXkubGVuZ3RoOyBpKyspCi0gICAgICB7ICAgICAgIAotICAgICAgICBpZiAoVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNBcHBsaWNhYmxlVG8odmFsaWRhdG9yQ2xhc3NOYW1lLCByZXNvdXJjZUFycmF5W2ldKSkgCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocmVzb3VyY2VBcnJheVtpXSBpbnN0YW5jZW9mIElGaWxlKSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlcy5hZGQocmVzb3VyY2VBcnJheVtpXSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXNvdXJjZUFycmF5W2ldLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKQotICAgICAgICAgZ2V0RmlsZXMoZmlsZXMsKElDb250YWluZXIpcmVzb3VyY2VBcnJheVtpXSwgdmFsaWRhdG9yQ2xhc3NOYW1lKSA7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgfQotCi0gIAotLyoqCi0gKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLCB3aXRob3V0IHRoZSBwcm9qZWN0LXNwZWNpZmljIGluZm9ybWF0aW9uIAotICogaW4gZnJvbnQuCi0gKgotICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBWYWxpZGF0aW9uT3BlcmF0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgbm9uLWVudmlyb25tZW50IAotICogc3BlY2lmaWMgbmFtZXMgb2YgdGhlIGZpbGVzLiBPbmx5IHRoZSBJV29ya2JlbmNoQ29udGV4dCBpbXBsZW1lbnRhdGlvbiBrbm93cyBob3cgCi0gKiBtdWNoIGluZm9ybWF0aW9uIHRvIHN0cmlwIG9mZiBvZiB0aGUgSVJlc291cmNlIG5hbWUuIEZvciBleGFtcGxlLCBpZiB0aGVyZSBpcwotICogYW4gRUpCIFByb2plY3QgbmFtZWQgIk15RUpCUHJvamVjdCIsIGFuZCBpdCB1c2VzIHRoZSBkZWZhdWx0IG5hbWVzIGZvciB0aGUgCi0gKiBzb3VyY2UgYW5kIG91dHB1dCBmb2xkZXJzLCAic291cmNlIiBhbmQgImVqYk1vZHVsZSIsIHJlc3BlY3RpdmVseSwgdGhlbiB0aGUKLSAqIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgRUpCIEhlbHBlciBrbm93cyBob3cgbXVjaCBvZiB0aGF0IHN0cnVjdHVyZSBpcyAKLSAqIGVjbGlwc2Utc3BlY2lmaWMuIAotICoKLSAqIFNpbmNlIHRoZSAic291cmNlIiBmb2xkZXIgY29udGFpbnMgSmF2YSBzb3VyY2UgZmlsZXMsIGEgcG9ydGFibGUgbmFtZSB3b3VsZAotICogYmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzLCB3aXRob3V0IHRoZSBlY2xpcHNlLXNwZWNpZmljCi0gKiBwcm9qZWN0IGFuZCBmb2xkZXIgbmFtZXMgaW4gZnJvbnQgb2YgdGhlIGZpbGUgbmFtZS4gVGhlIEVKQkhlbHBlciBrbm93cyB0aGF0IAotICogZXZlcnl0aGluZyB1cCB0byB0aGUgInNvdXJjZSIgZm9sZGVyLCBmb3IgZXhhbXBsZSwgY2FuIGJlIHJlbW92ZWQsIGJlY2F1c2UsIAotICogYWNjb3JkaW5nIHRvIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBFSkIgUHJvamVjdCwgZXZlcnl0aGluZyBjb250YWluZWQKLSAqIGluIHRoZSBzb3VyY2UgZm9sZGVyIGlzIGphdmEgc291cmNlIGNvZGUuIFNvIGlmIHRoZXJlIGlzIGFuIElSZXNvdXJjZSBpbiBhbgotICogRUpCIFByb2plY3QgbmFtZWQgIi9NeUVKQlByb2plY3Qvc291cmNlL2NvbS9pYm0vbXljbGFzc2VzL015SmF2YUZpbGUuamF2YSIsCi0gKiB0aGlzIG1ldGhvZCB3b3VsZCBtYWtlIHRoaXMgbmFtZSBwb3J0YWJsZSBieSBzdHJpcHBpbmcgb2ZmIHRoZQotICogIi9NeUVKQlByb2plY3Qvc291cmNlIiwgYW5kIHJldHVybmluZyAiY29tL2libS9teWNsYXNzZXMvTXlKYXZhRmlsZS5qYXZhIi4KLSAqCi0gKiBUaGUgb3V0cHV0IG9mIHRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIFZhbGlkYXRpb25PcGVyYXRpb24sIHdoZW4gaXQKLSAqIGlzIGNhbGN1bGF0aW5nIHRoZSBsaXN0IG9mIGFkZGVkL2NoYW5nZWQvZGVsZXRlZCBmaWxlIG5hbWVzIGZvciBpbmNyZW1lbnRhbAotICogdmFsaWRhdGlvbi4gSWYgZ2V0UG9ydGFibGVOYW1lKElSZXNvdXJjZSkgcmV0dXJucyBudWxsLCB0aGF0IG1lYW5zCi0gKiB0aGF0IHRoZSBJV29ya2JlbmNoQ29udGV4dCdzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhhdCBwYXJ0aWN1bGFyCi0gKiB0eXBlIG9mIHJlc291cmNlLCBhbmQgdGhlIHJlc291cmNlIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGFycmF5IG9mCi0gKiBJRmlsZURlbHRhIG9iamVjdHMgaW4gdGhlIElWYWxpZGF0b3IncyAidmFsaWRhdGUiIG1ldGhvZC4gCi0gKiAKLSAqIEBwYXJhbSByZXNvdXJjZSBUaGUgcmVzb3VyY2UgdG8gZ2V0IHRoZSBuYW1lIGZyb20uCi0gKiBAcmV0dXJuIFRoZSBwb3J0YWJsZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4KLSAqLwotcHVibGljIFN0cmluZyBnZXRQb3J0YWJsZU5hbWUoSVJlc291cmNlIHJlc291cmNlKQotICB7Ci0gICAgLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXQgcG9ydGFibGVuYW1lIGZvciAiICsgcmVzb3VyY2UpOwotICAgIHJldHVybiByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKTsKLSAgfQotCi0vKioKLSAqIFdoZW4gYW4gSVZhbGlkYXRvciBhc3NvY2lhdGVzIGEgdGFyZ2V0IG9iamVjdCB3aXRoIGFuIElNZXNzYWdlLAotICogdGhlIFdvcmtiZW5jaFJlcG9ydGVyIGV2ZW50dWFsbHkgcmVzb2x2ZXMgdGhhdCB0YXJnZXQgb2JqZWN0Ci0gKiB3aXRoIGFuIElSZXNvdXJjZS4gU29tZXRpbWVzIG1vcmUgdGhhbiBvbmUgdGFyZ2V0IG9iamVjdCByZXNvbHZlcwotICogdG8gdGhlIHNhbWUgSVJlc291cmNlICh1c3VhbGx5IHRoZSBJUHJvamVjdCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQKLSAqIElSZXNvdXJjZSB3aGVuIGFuIElGaWxlIGNhbm5vdCBiZSBmb3VuZCkuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCwKLSAqIGJ5IHRoZSBXb3JrYmVuY2hSZXBvcnRlciwgc28gdGhhdCB0aGUgV29ya2JlbmNoUmVwb3J0ZXIgY2FuIAotICogZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgSU1lc3NhZ2VzIHdoaWNoIGFyZSBvbiB0aGUgc2FtZSBJUmVzb3VyY2UsIAotICogYnV0IHJlZmVyIHRvIGRpZmZlcmVudCB0YXJnZXQgb2JqZWN0cy4gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSAKLSAqIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IsIE9iamVjdCkgbWV0aG9kLCBzbyB0aGF0IHdoZW4gb25lCi0gKiB0YXJnZXQgb2JqZWN0IHJlbW92ZXMgYWxsIG9mIGl0cyBtZXNzYWdlcywgdGhhdCBpdCBkb2Vzbid0IHJlbW92ZQotICogYW5vdGhlciB0YXJnZXQgb2JqZWN0J3MgbWVzc2FnZXMuCi0gKgotICogVGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsIG9ubHkgaWYgb2JqZWN0IGlzIG51bGwuIE90aGVyd2lzZSwgYW4KLSAqIGlkIHdoaWNoIGNhbiB1bmlxdWVseSBpZGVudGlmeSBhIHBhcnRpY3VsYXIgb2JqZWN0IG11c3QgYmUgcmV0dXJuZWQuCi0gKiBUaGUgaWQgbmVlZHMgdG8gYmUgdW5pcXVlIG9ubHkgd2l0aGluIG9uZSBwYXJ0aWN1bGFyIElWYWxpZGF0b3IuCi0gKiAKLSAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgbmFtZS4KLSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIG9iamVjdCBvciBudWxsIGlmIHRoZSBvYmplY3QgaXMgbnVsbC4KLSAqLwotcHVibGljIFN0cmluZyBnZXRUYXJnZXRPYmplY3ROYW1lKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0ID09IG51bGwpIAotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldCB0YXJnZXRuYW1lIGZvciAiICsgb2JqZWN0KTsKLSAgICByZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBEZWxldGUgdGhlIG1hcmtlcnMgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGZyb20gdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KLSAgICogCi0gICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgcmVzb3VyY2UgdG8gZGVsZXRlIHRoZSBtYXJrZXJzIGZyb20uCi0gICAqIEBwYXJhbSBtYXJrZXJUeXBlIFRoZSB0eXBlIG9mIG1hcmtlcnMgdG8gZGVsZXRlIGZyb20gdGhlIHJlc291cmNlLgotICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHdoaWNoIHRoZSBtYXJrZXJzIG11c3QgaGF2ZSB0byBiZSBkZWxldGVkLgotICAgKiBAcGFyYW0gYXR0cmlidXRlVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgY29ycmVzcG9uZGluZyB0byBhdHRyaWJ1dGVOYW1lIHdoaWNoIHRoZSBtYXJrZXJzIG11c3QgaGF2ZSB0byBiZSBkZWxldGVkLgotICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVNYXJrZXJzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG1hcmtlclR5cGUsIGZpbmFsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBmaW5hbCBPYmplY3QgYXR0cmlidXRlVmFsdWUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsgICAgICAgICAgCi0gICAgZmluYWwgSU1hcmtlcltdIHY0MDBNYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLSAgICBmaW5hbCBJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKG1hcmtlclR5cGUsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0gICAgSVdvcmtzcGFjZVJ1bm5hYmxlIG9wID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIAotICAgICB7Ci0gICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLSAgICAgICB7ICAgIAotICAgICAgICAgLy8gdGhpcyBmaXhlcyBkZWZlY3QgMTkzNDA2Ci0gICAgICAgICAvLyBoZXJlIHdlIHJlbW92ZSBtYXJrZXJzIHRoYXQgbWF5IGhhdmUgYmVlbiBhZGRlZCBieSB0aGUgdjQwMCBjb2RlCi0gICAgICAgICAvLyBob3BlZnVsbHkgdGhlICcubWFya2VycycgbWV0YWRhdGEgZmlsZXMgd2lsbCBiZSByZW1vdmVkIGZvciB0aGUgVjUgaW5zdGFsbAotICAgICAgICAgLy8gYW5kIHRoaXMga2x1ZGdlIHdpbGwgbm90IGJlIG5lZWRlZCB0aGVyZQotICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2NDAwTWFya2Vycy5sZW5ndGg7IGkrKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOyAgICAgICAgICAgCi0gICAgICAgICAgIG1hcmtlci5kZWxldGUoKTsgICAgICAgICAgIAotICAgICAgICAgfQotICAgIAotICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSAKLSAgICAgICAgIHsKLSAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotICAgICAgICAgICAKLSAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbWFya2VyLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgIHZhbHVlLmVxdWFscyhhdHRyaWJ1dGVWYWx1ZSkpIAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgbWFya2VyLmRlbGV0ZSgpOwotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgfQotICAgICB9OwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ob3AsIG51bGwpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgfQotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBzZXZlcml0eSBmb3IgdGhlIGdpdmVuIHNldmVyaXR5LgotICAgKiAKLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSB0byBjb252ZXJ0IHRvIHZhbGlkYXRpb24gZnJhbWV3b3JrIHNldmVyaXR5LgotICAgKiBAcmV0dXJuIFRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBzZXZlcml0eSBmb3IgdGhlIGdpdmVuIHNldmVyaXR5LgotICAgKi8KLSAgc3RhdGljIHB1YmxpYyBpbnQgZ2V0VmFsaWRhdGlvbkZyYW1ld29ya1NldmVyaXR5KGludCBzZXZlcml0eSkKLSAgewotICAgIHN3aXRjaCAoc2V2ZXJpdHkpCi0gICAgewotICAgICAgY2FzZSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SOgotICAgICAgICByZXR1cm4gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLSAgICAgIGNhc2UgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOgotICAgICAgICByZXR1cm4gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotICAgICAgY2FzZSBJTWFya2VyLlNFVkVSSVRZX0lORk86Ci0gICAgICAgIHJldHVybiBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7Ci0gICAgfQotICAgIHJldHVybiBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7ICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9MYXp5VVJMSW5wdXRTdHJlYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvTGF6eVVSTElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNGNiMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9MYXp5VVJMSW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBhbGxvd3MgSW5wdXRTdHJlYW1zIHRvIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkIHRvIHhlcmNlcyB3aXRob3V0Ci0gKiBhY3R1YWxseSBvcGVuaW5nIGZpbGUgaGFuZGxlcyBvciBuZXR3b3JrIGNvbm5lY3Rpb25zIHVudGlsIGl0IGlzIGFic29sdXRlbHkKLSAqIG5lY2Nlc3NhcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXp5VVJMSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbQoteyAgCi0gIHByaXZhdGUgc3RhdGljIGludCBkZWJ1Z1RvdGFsT3BlblN0cmVhbUNvdW50ID0gMDsgCi0gIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBpbm5lcjsKLSAgcHJvdGVjdGVkIFN0cmluZyB1cmw7Ci0gIHByb3RlY3RlZCBib29sZWFuIGVycm9yOwotICBib29sZWFuIGhhc01hcmtzOwotICBib29sZWFuIHByZXRlbmRGaWxlSXNTdGlsbE9wZW47Ci0KLSAgcHVibGljIExhenlVUkxJbnB1dFN0cmVhbShTdHJpbmcgdXJsKQotICB7Ci0gICAgdGhpcy51cmwgPSB1cmw7Ci0JaW5uZXIgPSBudWxsOwotCXByZXRlbmRGaWxlSXNTdGlsbE9wZW4gPSBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVJbm5lclN0cmVhbUlmUmVxdWlyZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGlmIChpbm5lciA9PSBudWxsICYmICFlcnJvcikKLSAgICB7Ci0gICAgICBkZWJ1Z1RvdGFsT3BlblN0cmVhbUNvdW50Kys7Ci0gICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaW5uZXIgPSBuZXcgVVJMKHVybCkub3BlblN0cmVhbSgpOwotCQlwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuID0gZmFsc2U7Ci0JCWhhc01hcmtzID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5IAotICAgICAgewotICAgICAgICBpZiAoaW5uZXIgPT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbG9zZVN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpbm5lciAhPSBudWxsICYmICFwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSB7Ci0JCQlpbm5lci5jbG9zZSgpOwotCQkJcHJldGVuZEZpbGVJc1N0aWxsT3BlbiA9IHRydWU7Ci0JCX0KLSAgCX0KLQotICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybiAwOwotCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCWlmIChpbm5lciA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBub3QgYXZhaWxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gaW5uZXIuYXZhaWxhYmxlKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHsKLQkJLy8gU3RvcCBiZWhhdmluZyBhcyBpZiB0aGUgc3RyZWFtIHdlcmUgc3RpbGwgb3Blbi4KLQkJcHJldGVuZEZpbGVJc1N0aWxsT3BlbiA9IGZhbHNlOwotCX0gZWxzZSB7Ci0JCWlmIChpbm5lciAhPSBudWxsKSB7Ci0JCQlkZWJ1Z1RvdGFsT3BlblN0cmVhbUNvdW50LS07Ci0JCQlpbm5lci5jbG9zZSgpOwotCQl9Ci0JfQotICB9Ci0KLSAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KQotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybjsKLQloYXNNYXJrcyA9IHRydWU7Ci0JdHJ5IHsKLQkJY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JCWlubmVyLm1hcmsocmVhZGxpbWl0KTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkKLSAgewotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSByZXR1cm4gZmFsc2U7Ci0JdHJ5IHsKLQkJY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JCWlmIChpbm5lciA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBpbm5lci5tYXJrU3VwcG9ydGVkKCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotCXJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybiAtMTsKLQljcmVhdGVJbm5lclN0cmVhbUlmUmVxdWlyZWQoKTsKLQlpZiAoaW5uZXIgPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gbm90IGF2YWlsYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JaW50IGJ5dGVzUmVhZCA9IGlubmVyLnJlYWQoKTsKLQlpZiAoYnl0ZXNSZWFkID09IC0xICYmICFoYXNNYXJrcykgY2xvc2VTdHJlYW0oKTsKLQlyZXR1cm4gYnl0ZXNSZWFkOwotICB9Ci0KLQotCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybiAtMTsKLQkJY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JCWlmIChpbm5lciA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBub3QgYXZhaWxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGJ5dGVzUmVhZCA9IGlubmVyLnJlYWQoYik7Ci0JCWlmIChieXRlc1JlYWQgPT0gLTEgJiYgIWhhc01hcmtzKSBjbG9zZVN0cmVhbSgpOwotCQlyZXR1cm4gYnl0ZXNSZWFkOwotCX0KLQotICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICB7ICAgIAotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSByZXR1cm4gLTE7Ci0JY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JaWYgKGlubmVyID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIG5vdCBhdmFpbGFibGUiKTsgLy8kTk9OLU5MUy0xJAotCWludCBieXRlc1JlYWQgPSBpbm5lci5yZWFkKGIsIG9mZiwgbGVuKTsKLQlpZiAoYnl0ZXNSZWFkID09IC0xICYmICFoYXNNYXJrcykgY2xvc2VTdHJlYW0oKTsKLQlyZXR1cm4gYnl0ZXNSZWFkOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSByZXR1cm47Ci0JY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JaWYgKGlubmVyID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIG5vdCBhdmFpbGFibGUiKTsgLy8kTk9OLU5MUy0xJAotCWlubmVyLnJlc2V0KCk7Ci0gIH0KLQotICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsgICAKLQlpZiAocHJldGVuZEZpbGVJc1N0aWxsT3BlbikgcmV0dXJuIDA7Ci0JY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JaWYgKGlubmVyID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIG5vdCBhdmFpbGFibGUiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBpbm5lci5za2lwKG4pOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL05lc3RlZFZhbGlkYXRvckNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvTmVzdGVkVmFsaWRhdG9yQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzI3MTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvTmVzdGVkVmFsaWRhdG9yQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmU7Ci0KLQotLyoqCi0gKiBBIGNvbnRleHQgY2xhc3MgZm9yIHZhbGlkYXRvcnMgdG8gYmUgYWJsZSB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQgb2YKLSAqIGdpdmVuIHZhbGlkYXRpb24gc2Vzc2lvbi4gQ3VycmVudGx5IHRoaXMgY2xhc3MgaXMgb25seSB1c2VkIHRvIGlkZW50aWZ5Ci0gKiB0aGUgdW5pcXVlIGNvbnRleHQuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9WYWxpZGF0aW9uSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9WYWxpZGF0aW9uSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGY1ZTA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvVmFsaWRhdGlvbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTcwMDUgLSBTb21lIHN0YXRpYyBjb25zdGFudHMgbm90IG1hZGUgZmluYWwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uWE1MVmFsaWRhdGlvbk1lc3NhZ2VzOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaGFuZGxlcyBtZXNzYWdlcyBmcm9tIGEgdmFsaWRhdG9yLiBUaGlzIGNsYXNzIGNhbiBoYW5kbGUKLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkluZm8gaW1wbGVtZW50cyBWYWxpZGF0aW9uUmVwb3J0Ci17Ci0gIHByaXZhdGUgYm9vbGVhbiBXUkFQUEVSX0VSUk9SX1NVUFBPUlRfRU5BQkxFRCA9IHRydWU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50ICBTRVZfRVJST1IgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVZfV0FSTklORyA9IDE7Ci0gIAotICBwcml2YXRlIFN0cmluZyB2YWxpZGF0aW5nX2ZpbGVfdXJpID0gbnVsbDsKLSAgcHJpdmF0ZSBVUkwgdmFsaWRhdGluZ19maWxlX3VybCA9IG51bGw7Ci0gIHByaXZhdGUgYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0gIHByaXZhdGUgTGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJpdmF0ZSBIYXNoTWFwIG5lc3RlZE1lc3NhZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqICAgICAgICAgICAgVGhlIFVSSSBvZiB0aGUgZmlsZSBmb3IgdGhlIHZhbGlkYXRpb24uCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbkluZm8oU3RyaW5nIHVyaSkKLSAgewotICAgIGlmKHVyaSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRoaXMudmFsaWRhdGluZ19maWxlX3VyaSA9IHVyaTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICB0aGlzLnZhbGlkYXRpbmdfZmlsZV91cmwgPSBuZXcgVVJMKHVyaSk7Ci0gICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZpbGVVUkkoKQotICB7Ci0gICAgcmV0dXJuIHZhbGlkYXRpbmdfZmlsZV91cmk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLSAgewotICAgIHJldHVybiB2YWxpZDsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYW4gZXJyb3IgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGFkZC4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmkpCi0gIHsKLSAgICBhZGRFcnJvcihtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSwgbnVsbCwgbnVsbCk7Ci0gIH0gIAotICAKLSAgLyoqCi0gICAqIAotICAgKiBBZGQgYW4gZXJyb3IgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGFkZC4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBtZXNzYWdlQXJndW1lbnRzIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmksIFN0cmluZyBrZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpCi0gIHsgICAgCi0gICAgaWYoYWRkTWVzc2FnZShtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSwgU0VWX0VSUk9SLCBrZXksIG1lc3NhZ2VBcmd1bWVudHMpKQotICAgIHsKLSAgICAgIHZhbGlkID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHdhcm5pbmcgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBzdHJpbmcgbWVzc2FnZSBvZiB0aGUgd2FybmluZy4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIHdhcm5pbmcuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgd2FybmluZy4KLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHdhcm5pbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSkKLSAgewotICAgIGFkZFdhcm5pbmcobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmksIG51bGwsIG51bGwpOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEFkZCBhbiBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIG1lc3NhZ2VBcmd1bWVudHMgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpLCBTdHJpbmcga2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKQotICB7ICAgIAotICAgIGFkZE1lc3NhZ2UobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmksIFNFVl9XQVJOSU5HLCBrZXksIG1lc3NhZ2VBcmd1bWVudHMpOwotICB9Ci0gIAotICAvKioKLSAgICogQWRkIGEgbWVzc2FnZSB0byB0aGUgbGlzdC4gUmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkIHRvIHRoZSBsaXN0LgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGtleSB0aGUgWGVyY2VzIGVycm9yIGtleSBmb3IgdGhpcyBlcnJvcgotICAgKiBAcGFyYW0gbWVzc2FnZUFyZ3VtZW50cyBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBlcnJvcgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG1lc3NhZ2Ugd2FzIHN1Y2Nlc3NmdWxseSBhZGRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGFkZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBrZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpCi0gIHsKLSAgICBib29sZWFuIHN1Y2Nlc3NmdWxseUFkZGVkID0gZmFsc2U7Ci0gICAgLy8gSWYgdGhlIG1lc3NhZ2UgaWYgbnVsbCB0aGVyZSBpcyBub3RoaW5nIHRvIGFkZC4KLSAgICBpZihtZXNzYWdlID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHN1Y2Nlc3NmdWxseUFkZGVkOwotICAgIH0KLSAgICBTdHJpbmcgZXJyb3JVUkkgPSBub3JtYWxpemUodXJpKTsKLSAgICBVUkwgZXJyb3JVUkwgPSBudWxsOwotICAgIGlmIChlcnJvclVSSSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBlcnJvclVSTCA9IG5ldyBVUkwoZXJyb3JVUkkpOwotICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICAvL2Vycm9yVVJJID0gbm9ybWFsaXplVVJJKGVycm9yVVJJKTsKLSAgICB9Ci0gICAgLy9ib29sZWFuIGRvRGlhbG9nID0gdHJ1ZTsKLSAgICBpZiAoZXJyb3JVUkwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdWNjZXNzZnVsbHlBZGRlZCA9IHRydWU7Ci0gICAgICAvLyBBZGQgdG8gdGhlIGFwcHJvcHJpYXRlIGxpc3QgaWYgbmVzdGVkIGVycm9yIHN1cHBvcnQgaXMgb2ZmIG9yCi0gICAgICAvLyB0aGlzIG1lc3NhZ2UgaXMgZm9yIHRoZSBjdXJyZW50IGZpbGUuCi0gICAgICBpZiAoIVdSQVBQRVJfRVJST1JfU1VQUE9SVF9FTkFCTEVEIHx8IHZhbGlkYXRpbmdfZmlsZV91cmwuc2FtZUZpbGUoZXJyb3JVUkwpKQotICAgICAgewotCi0gICAgICAgIFZhbGlkYXRpb25NZXNzYWdlIHZhbG1lcyA9IG5ldyBWYWxpZGF0aW9uTWVzc2FnZShtZXNzYWdlLCBsaW5lLAotICAgICAgICAgICAgY29sdW1uLCB2YWxpZGF0aW5nX2ZpbGVfdXJpLCBrZXksIG1lc3NhZ2VBcmd1bWVudHMpOwotICAgICAgICBpZiAoc2V2ZXJpdHkgPT0gU0VWX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsbWVzLnNldFNldmVyaXR5KFZhbGlkYXRpb25NZXNzYWdlLlNFVl9OT1JNQUwpOwotICAgICAgICB9IGVsc2UgaWYgKHNldmVyaXR5ID09IFNFVl9XQVJOSU5HKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsbWVzLnNldFNldmVyaXR5KFZhbGlkYXRpb25NZXNzYWdlLlNFVl9MT1cpOwotICAgICAgICB9Ci0gICAgICAgIG1lc3NhZ2VzLmFkZCh2YWxtZXMpOwotICAgICAgfQotICAgICAgLy8gSWYgbmVzdGVkIGVycm9yIHN1cHBvcnQgaXMgZW5hYmxlZCBjcmVhdGUgYSBuZXN0ZWQgZXJyb3IuCi0gICAgICBlbHNlIGlmIChXUkFQUEVSX0VSUk9SX1NVUFBPUlRfRU5BQkxFRCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5lc3RlZHVyaSA9IGVycm9yVVJMLnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgICAgIFZhbGlkYXRpb25NZXNzYWdlIG5lc3RlZG1lc3MgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UobWVzc2FnZSwgbGluZSwKLSAgICAgICAgICAgIGNvbHVtbiwgbmVzdGVkdXJpLCBrZXksIG1lc3NhZ2VBcmd1bWVudHMpOwotICAgICAgICBpZihzZXZlcml0eSA9PSBTRVZfV0FSTklORykKLSAgICAgICAgewotICAgICAgICAgIG5lc3RlZG1lc3Muc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0xPVyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmVzdGVkbWVzcy5zZXRTZXZlcml0eShWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTk9STUFMKTsKLSAgICAgICAgfQotCi0gICAgICAgIFZhbGlkYXRpb25NZXNzYWdlIGNvbnRhaW5lciA9IChWYWxpZGF0aW9uTWVzc2FnZSkgbmVzdGVkTWVzc2FnZXMuZ2V0KG5lc3RlZHVyaSk7Ci0gICAgICAgIGlmKGNvbnRhaW5lciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGFpbmVyID0gbmV3IFZhbGlkYXRpb25NZXNzYWdlKE5MUy5iaW5kKFhNTFZhbGlkYXRpb25NZXNzYWdlcy5fVUlfUkVGX0ZJTEVfRVJST1JfTUVTU0FHRSwgbmV3IE9iamVjdCBbXSB7IG5lc3RlZHVyaSB9KSwgMSwgMCwgbmVzdGVkdXJpKTsKLSAgICAgICAKLSAgICAgICAgICAvLyBJbml0aWFsbHkgc2V0IHRoZSBuZXN0ZWQgZXJyb3IgdG8gYSB3YXJuaW5nLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjaGFuZ2VkCi0gICAgICAgICAgLy8gdG8gYW4gZXJyb3IgaWYgYSBuZXN0ZWQgbWVzc2FnZSBoYXMgYSBzZXZlcml0eSBvZiBlcnJvci4KLSAgICAgICAgICBjb250YWluZXIuc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0xPVyk7Ci0gICAgICAgICAgbmVzdGVkTWVzc2FnZXMucHV0KG5lc3RlZHVyaSwgY29udGFpbmVyKTsKLSAgICAgICAgICBtZXNzYWdlcy5hZGQoY29udGFpbmVyKTsKLSAgICAgICAgfQotICAgICAgICBjb250YWluZXIuYWRkTmVzdGVkTWVzc2FnZShuZXN0ZWRtZXNzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN1Y2Nlc3NmdWxseUFkZGVkOwotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIEFkZCBhIG5lc3RlZCBtZXNzYWdlIHRvIHRoZSB2YWxpZGF0aW9uIGluZm9ybWF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHN0cmluZyBtZXNzYWdlIG9mIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGROZXN0ZWRNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSwgaW50IHNldmVyaXR5KQotLy8gIHsKLS8vICAgIFZhbGlkYXRpb25NZXNzYWdlIG5lc3RlZG1lc3MgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmkpOwotLy8gICAgaWYoc2V2ZXJpdHkgPT0gU0VWX1dBUk5JTkcpCi0vLyAgICB7Ci0vLyAgICAgIG5lc3RlZG1lc3Muc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0xPVyk7Ci0vLyAgICB9Ci0vLyAgICBlbHNlCi0vLyAgICB7Ci0vLyAgICAgIG5lc3RlZG1lc3Muc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX05PUk1BTCk7Ci0vLyAgICB9Ci0vLyAgICBWYWxpZGF0aW9uTWVzc2FnZSBjb250YWluZXIgPSAoVmFsaWRhdGlvbk1lc3NhZ2UpbmVzdGVkTWVzc2FnZXMuZ2V0KHVyaSk7Ci0vLyAgICBpZihjb250YWluZXIgPT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgY29udGFpbmVyID0gbmV3IFZhbGlkYXRpb25NZXNzYWdlKFhNTENvcmVWYWxpZGF0aW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKF9VSV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFLCB1cmkpLCAxLCAwLCB2YWxpZGF0aW5nX2ZpbGVfdXJpKTsKLS8vICAgICAgLy8gSW5pdGlhbGx5IHNldCB0aGUgbmVzdGVkIGVycm9yIHRvIGEgd2FybmluZy4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2hhbmdlZAotLy8gICAgICAvLyB0byBhbiBlcnJvciBpZiBhIG5lc3RlZCBtZXNzYWdlIGhhcyBhIHNldmVyaXR5IG9mIGVycm9yLgotLy8gICAgICBjb250YWluZXIuc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0xPVyk7Ci0vLyAgICAgIG5lc3RlZE1lc3NhZ2VzLnB1dCh1cmksIGNvbnRhaW5lcik7Ci0vLyAgICAgIG1lc3NhZ2VzLmFkZChjb250YWluZXIpOwotLy8gICAgfQotLy8gICAgY29udGFpbmVyLmFkZE5lc3RlZE1lc3NhZ2UobmVzdGVkbWVzcyk7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuVmFsaWRhdGlvblJlcG9ydCNnZXRWYWxpZGF0aW9uTWVzc2FnZXMoKQotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25NZXNzYWdlW10gZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCkKLSAgewotICAgIHJldHVybiAoVmFsaWRhdGlvbk1lc3NhZ2VbXSltZXNzYWdlcy50b0FycmF5KG5ldyBWYWxpZGF0aW9uTWVzc2FnZVttZXNzYWdlcy5zaXplKCldKTsKLSAgfQotCi0gIHB1YmxpYyBIYXNoTWFwIGdldE5lc3RlZE1lc3NhZ2VzKCkKLSAgewotICAgIHJldHVybiBuZXN0ZWRNZXNzYWdlczsKLSAgfQotICAKLSAgLyoqCi0gICAqIFB1dCB0aGUgVVJJIGluIGEgc3RhbmRhcmQgZm9ybWF0LgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHRvIHB1dCBpbnRvIGEgc3RhbmRhcmQgZm9ybWF0LgotICAgKiBAcmV0dXJuIFRoZSBzdGFuZGFyZCBmb3JtYXQgb2YgdGhlIFVSSS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgdXJpKQotICB7Ci0vLyAgICBpZih1cmkuc3RhcnRzV2l0aCgicGxhdGZvcm06IikpCi0vLyAgICB7Ci0vLyAgICAgIHRyeQotLy8gICAgICB7Ci0vLyAgICAgICAgdXJpID0gUGxhdGZvcm0ucmVzb2x2ZShuZXcgVVJMKHVyaSkpLnRvU3RyaW5nKCk7Ci0vLyAgICAgIH0KLS8vICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0vLyAgICAgIHsKLS8vICAgICAgfQotLy8gICAgfQotICAgIHVyaSA9IHVyaS5yZXBsYWNlQWxsKCIlMjAiLCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHVyaSA9IHVyaS5yZXBsYWNlQWxsKCIlNUUiLCAiXiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB1cmkgPSB1cmkucmVwbGFjZSgnXFwnLCcvJyk7Ci0gICAgCi0gICAgcmV0dXJuIHVyaTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvVmFsaWRhdGlvbk1lc3NhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvVmFsaWRhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI2NjJjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL1ZhbGlkYXRpb25NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjk3MDA1IC0gU29tZSBzdGF0aWMgY29uc3RhbnRzIG5vdCBtYWRlIGZpbmFsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBBIGNsYXNzIGZvciBob2xkaW5nIHZhbGlkYXRpb24gbWVzc2FnZSBpbmZvcm1hdGlvbi4gSG9sZHMgdGhlIG1lc3NhZ2UgYW5kIHRoZQotICogbWVzc2FnZSBsb2NhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25NZXNzYWdlCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBFUlJPUl9NRVNTQUdFX01BUF9RVUFMSUZJRURfTkFNRSA9IG5ldyBRdWFsaWZpZWROYW1lKCJvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24iLCAiZXJyb3JNZXNzYWdlTWFwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICBwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7Ci0gIHByb3RlY3RlZCBpbnQgbGluZU51bWJlcjsKLSAgcHJvdGVjdGVkIGludCBjb2x1bW5OdW1iZXI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdXJpOwotICBwcm90ZWN0ZWQgTGlzdCBuZXN0ZWRFcnJvcnM7Ci0gIHByb3RlY3RlZCBTdHJpbmcga2V5OwotICBwcm90ZWN0ZWQgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50czsKLSAgcHJvdGVjdGVkIGludCBzdGFydE9mZnNldDsKLSAgcHJvdGVjdGVkIGludCBzZXZlcml0eSA9IElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VWX0hJR0ggPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVZfTk9STUFMID0gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVZfTE9XID0gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiBAcGFyYW0gbGluZU51bWJlciBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbk51bWJlciBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25NZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlcikKLSAgewotICAgIHRoaXMobWVzc2FnZSwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyLCBudWxsKTsKLSAgfQotCi0gIC8qKiAKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogQHBhcmFtIGxpbmVOdW1iZXIgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBjb2x1bW5OdW1iZXIgVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSBmaWxlIHRoZSBtZXNzYWdlIGlzIGZvci4KLSAgICovCi0gICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVyLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgIHRoaXMobWVzc2FnZSwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyLCB1cmksIG51bGwsIG51bGwpOwotICB9Ci0gICAKLSAgIC8qKiAKLSAgICAqIENvbnN0cnVjdG9yLgotICAgICogCi0gICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICAqIEBwYXJhbSBsaW5lTnVtYmVyIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgICogQHBhcmFtIGNvbHVtbk51bWJlciBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSBmaWxlIHRoZSBtZXNzYWdlIGlzIGZvci4KLSAgICAqIEBwYXJhbSBrZXkgYSB1bmlxdWUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXJyb3IKLSAgICAqIEBwYXJhbSBtZXNzYWdlQXJndW1lbnRzIHRoZSBhcmd1bWVudHMgWGVyY2VzIHVzZXMgdG8gY3JlYXRlIHRoZSBtZXNzYWdlCi0gICAgKi8KLSAgICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVyLCBTdHJpbmcgdXJpLCBTdHJpbmcga2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKQotICAgewotICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotICAgICB0aGlzLmNvbHVtbk51bWJlciA9IGNvbHVtbk51bWJlcjsKLSAgICAgdGhpcy51cmkgPSB1cmk7Ci0gICAgIHRoaXMua2V5ID0ga2V5OwotCSB0aGlzLm1lc3NhZ2VBcmd1bWVudHMgPSBtZXNzYWdlQXJndW1lbnRzOwotICAgICB0aGlzLnN0YXJ0T2Zmc2V0ID0gMDsgICAgCi0gICB9Ci0gICAKLQotICAvKioKLSAgICogR2V0IHRoZSBtZXNzYWdlIGZvciB0aGlzIHZhbGlhdGlvbiBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbWVzc2FnZSBmb3IgdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjb2x1bW4gbG9jYXRpb24uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBjb2x1bW4gbnVtYmVyLgotICAgKi8KLSAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbHVtbk51bWJlcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGxpbmUgbG9jYXRpb24uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaW5lIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpCi0gIHsKLSAgICByZXR1cm4gbGluZU51bWJlcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHVyaSBmb3IgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHVyaSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVcmkoKQotICB7Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIG5lc3RlZCB2YWxpZGF0aW9uIG1lc3NhZ2UgdG8gdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdGlvbk1lc3NhZ2UgVGhlIHZhbGlkYXRpb24gbWVzc2FnZSB0byBhZGQgYXMgYSBuZXN0ZWQgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE5lc3RlZE1lc3NhZ2UoVmFsaWRhdGlvbk1lc3NhZ2UgdmFsaWRhdGlvbk1lc3NhZ2UpCi0gIHsKLSAgICBpZiAobmVzdGVkRXJyb3JzID09IG51bGwpCi0gICAgewotICAgICAgbmVzdGVkRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLSAgICBuZXN0ZWRFcnJvcnMuYWRkKHZhbGlkYXRpb25NZXNzYWdlKTsKLSAgICBpbnQgdmFsaWRhaXRvbm1lc3NhZ2VTZXZlcml0eSA9IHZhbGlkYXRpb25NZXNzYWdlLmdldFNldmVyaXR5KCk7Ci0gICAgaWYodmFsaWRhaXRvbm1lc3NhZ2VTZXZlcml0eSA9PSBTRVZfTk9STUFMIHx8IHZhbGlkYWl0b25tZXNzYWdlU2V2ZXJpdHkgPT0gU0VWX0hJR0gpCi0gICAgewotICAgICAgc2V0U2V2ZXJpdHkoU0VWX05PUk1BTCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbGlzdCBvZiBuZXN0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgbmVzdGVkIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXROZXN0ZWRNZXNzYWdlcygpCi0gIHsKLSAgICByZXR1cm4gbmVzdGVkRXJyb3JzICE9IG51bGwgPyBuZXN0ZWRFcnJvcnMgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBzZXZlcml0eSBvZiB0aGUgZGVmZWN0LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgc2V2ZXJpdHkgb2YgdGhlIGRlZmVjdC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKQotICB7Ci0gIAlyZXR1cm4gc2V2ZXJpdHk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIHNldiBUaGUgc2V2ZXJpdHkgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoaW50IHNldikKLSAgewotICAJc2V2ZXJpdHkgPSBzZXY7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCBvZmZzZXQpCi0gIHsKLSAgICB0aGlzLnN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBrZXkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gIHsKLSAgICByZXR1cm4ga2V5OwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0W10gZ2V0TWVzc2FnZUFyZ3VtZW50cygpCi0gIHsKLQkgIHJldHVybiB0aGlzLm1lc3NhZ2VBcmd1bWVudHM7Ci0gIH0KLSAgCi0KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkKLSAgewotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9WYWxpZGF0aW9uUmVwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL1ZhbGlkYXRpb25SZXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiMTU3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL1ZhbGlkYXRpb25SZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciBhIHZhbGlkYXRpb24gcmVwb3J0LgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblJlcG9ydAotewotICAvKioKLSAgICogUmV0dXJucyB0aGUgVVJJIGZvciB0aGUgZmlsZSB0aGUgcmVwb3J0IHJlZmVycyB0by4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFVSSSBmb3IgdGhlIGZpbGUgdGhlIHJlcG9ydCByZWZlcnMgdG8uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZpbGVVUkkoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGZpbGUgaXMgdmFsaWQuIFRoZSBmaWxlIG1heSBoYXZlIHdhcm5pbmdzIGFzc29jaWF0ZWQgd2l0aCBpdC4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2VbXSBnZXRWYWxpZGF0aW9uTWVzc2FnZXMoKTsKLSAgCi0gIHB1YmxpYyBIYXNoTWFwIGdldE5lc3RlZE1lc3NhZ2VzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9Db21tYW5kTGluZUxvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0NvbW1hbmRMaW5lTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMzhmMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0NvbW1hbmRMaW5lTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmxvZ2dpbmc7Ci0KLS8qKgotICogQSBsb2dnZXIgdGhhdCB3aWxsIHByaW50IGxvZyBpbmZvIHRvIFN5c3RlbS5vdXQuCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRMaW5lTG9nZ2VyIGltcGxlbWVudHMgSUxvZ2dlcgotewotICBwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgZXJyb3IsIFRocm93YWJsZSBleGNlcHRpb24pCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oZXJyb3IpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihleGNlcHRpb24udG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyB3YXJuaW5nLCBUaHJvd2FibGUgZXhjZXB0aW9uKQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKHdhcm5pbmcpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihleGNlcHRpb24udG9TdHJpbmcoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9FY2xpcHNlTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvRWNsaXBzZUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzNjZjJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9FY2xpcHNlTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotCi0KLS8qKgotICogQSBsb2dnZXIgdGhhdCB3aWxsIGxvZyB0byB0aGUgbG9nIGZpbGUgaW4gdGhlIGVjbGlwc2UgbWV0YWRhdGEgZGlyZWN0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxvZ2dlciBpbXBsZW1lbnRzIElMb2dnZXIKLXsKLSAgCi0gIHB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvciwgVGhyb3dhYmxlIGV4Y2VwdGlvbikKLSAgewotICAgIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCBlcnJvciwgZXhjZXB0aW9uKSk7Ci0gIH0KLSAKLSAgcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgd2FybmluZywgVGhyb3dhYmxlIGV4Y2VwdGlvbikKLSAgewotICAgIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuV0FSTklORywgd2FybmluZywgZXhjZXB0aW9uKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9JTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvSUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODFhNDEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9JTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5sb2dnaW5nOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgc3RhbmRhcmQgbG9nZ2VyLiBBbGxvd3MgZm9yIGxvZ2dpbmcgZXJyb3JzIGFuZCB3YXJuaW5ncy4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMb2dnZXIKLXsKLSAgLyoqCi0gICAqIExvZyBhbiBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciBtZXNzYWdlIHRvIGxvZy4KLSAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvciwgVGhyb3dhYmxlIGV4Y2VwdGlvbik7Ci0KLSAgLyoqCi0gICAqIExvZyBhIHdhcm5pbmcgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSB3YXJuaW5nIFRoZSB3YXJuaW5nIG1lc3NhZ2UgdG8gbG9nLgotICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgd2FybmluZywgVGhyb3dhYmxlIGV4Y2VwdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvTG9nZ2VyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0xvZ2dlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1NDllMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvTG9nZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmxvZ2dpbmc7Ci0KLS8qKgotICogVGhlIGxvZ2dlciBmYWN0b3J5IGFsbG93cyBmb3Igc2ltcGxlIHVzZSBvZiB3aGF0ZXZlciBsb2dnaW5nIG1lY2hhbmlzbSBpcyBpbgotICogcGxhY2UuIFRoZSB0b29sIGNhbiBzcGVjaWZ5IGEgY3VzdG9tIGxvZ2dpbmcgY2xhc3MgYW5kIGNhbiByZXF1ZXN0IHRoZQotICogbG9nZ2VyIGZyb20gdGhpcyBjbGFzcy4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICogCi0gKiBAZGVwcmVjYXRlZCAtIG5vdCB1c2VkIGluIFdUUCBvciBieSBhbnkgYWRvcHRlcnMgYXMgb2YgOS8xMi8yMDA3Ci0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXJGYWN0b3J5Ci17Ci0gIHByaXZhdGUgc3RhdGljIElMb2dnZXIgICAgICBsb2dnZXIgICAgICAgICAgICA9IG51bGw7Ci0gIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyICBjbGFzc2xvYWRlciAgICAgICA9IG51bGw7Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyAgICAgICBsb2dnZXJDbGFzcyAgICAgICA9IG51bGw7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBjb21tYW5kbGluZWxvZ2dlciA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5sb2dnaW5nLkNvbW1hbmRMaW5lTG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZWNsaXBzZWxvZ2dlciAgICAgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUubG9nZ2luZy5FY2xpcHNlTG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgICAgICAgZGVmYXVsdGxvZ2dlciAgICAgPSBjb21tYW5kbGluZWxvZ2dlcjsKLQotICAvKioKLSAgICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIGxvZ2dlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgbG9nZ2VyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJTG9nZ2VyIGdldExvZ2dlckluc3RhbmNlKCkKLSAgewotICAgIGlmKGxvZ2dlciA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmKGxvZ2dlckNsYXNzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmKGNsYXNzbG9hZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyBsYyA9IGNsYXNzbG9hZGVyLmxvYWRDbGFzcyhsb2dnZXJDbGFzcyk7Ci0gICAgICAgICAgICBsb2dnZXIgPSAoSUxvZ2dlcikgbGMubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYobG9nZ2VyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyBsYyA9IExvZ2dlckZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MobG9nZ2VyQ2xhc3MpOwotICAgICAgICAgICAgbG9nZ2VyID0gKElMb2dnZXIpIGxjLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZihsb2dnZXIgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBDbGFzcyBsYyA9IExvZ2dlckZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoZGVmYXVsdGxvZ2dlcik7Ci0gICAgICAgICAgbG9nZ2VyID0gKElMb2dnZXIpIGxjLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxvZ2dlcjsKLSAgfQotCi0gIC8qKgotICAgKiBTcGVjaWZ5IHRoZSBsb2dnZXIgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZC4KLSAgICogCi0gICAqIEBwYXJhbSBjbGFzc25hbWUKLSAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgbG9nZ2VyIGNsYXNzLgotICAgKiBAcGFyYW0gbG9nZ2VyY2xhc3Nsb2FkZXIKLSAgICogICAgICAgICAgICBUaGUgY2xhc3Nsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIGxvZ2dlci4gSWYgbnVsbCwgdGhlIGRlZmF1bHQKLSAgICogICAgICAgICAgICBjbGFzc2xvYWRlciB3aWxsIGJlIHVzZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc3BlY2lmeUxvZ2dlcihTdHJpbmcgY2xhc3NuYW1lLCBDbGFzc0xvYWRlciBsb2dnZXJjbGFzc2xvYWRlcikKLSAgewotICAgIGxvZ2dlckNsYXNzID0gY2xhc3NuYW1lOwotICAgIGNsYXNzbG9hZGVyID0gbG9nZ2VyY2xhc3Nsb2FkZXI7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBkZWZhdWx0IGxvZ2dlciB0byB0aGUgZWNsaXBzZSBsb2dnZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgdXNlRWNsaXBzZUxvZ2dlcigpCi0gIHsKLSAgICBkZWZhdWx0bG9nZ2VyID0gZWNsaXBzZWxvZ2dlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9FcnJvckN1c3RvbWl6YXRpb25QbHVnaW5SZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9FcnJvckN1c3RvbWl6YXRpb25QbHVnaW5SZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGE2NDgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvRXJyb3JDdXN0b21pemF0aW9uUGx1Z2luUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uLkVycm9yTWVzc2FnZUN1c3RvbWl6ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSBwbHVnLWluIG1hbmlmZXN0cyBhbmQgcmVnaXN0ZXJzIGVhY2ggZXh0ZW5zaW9uCi0gKiBlcnJvciBjdXN0b21pemVyIHdpdGggdGhlIEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5LgotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JDdXN0b21pemF0aW9uUGx1Z2luUmVnaXN0cnlSZWFkZXIgewotCQotCSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQkgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImVycm9yQ3VzdG9taXplciI7IC8vJE5PTi1OTFMtMSQKLQkgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIHRhZ05hbWUgPSBFWFRFTlNJT05fUE9JTlRfSUQ7Ci0KLQkgIC8qKgotCSAgICogUmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBmb3IgdGhlIGVycm9yY3VzdG9taXplciBleHRlbnNpb24uCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0JICB7Ci0JICAgIElFeHRlbnNpb25SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkgICAgaWYgKHBvaW50ICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JICAgICAgewotCSAgICAgICAgcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCi0JICAvKioKLQkgICAqIHJlYWRFbGVtZW50KCkgLSBwYXJzZSBhbmQgZGVhbCB3aXRoIGFuIGV4dGVuc2lvbiBsaWtlOgotCSAgICoKLQkgICAqIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5lcnJvckN1c3RvbWl6ZXIiCi0JICAgKiAgICAgICAgICAgIGlkPSJzcGVjaWZpY0Vycm9yQ3VzdG9taXplciIKLQkgICAqICAgICAgICAgICAgbmFtZT0iU3BlY2lmaWMgRXJyb3IgQ3VzdG9taXplciI+Ci0JICAgKiAgIDxlcnJvckN1c3RvbWl6ZXIKLQkgICAqICAgCQkJbmFtZXNwYWNlPSJodHRwOi8vc3BlY2lmaWNuYW1lc3BhY2UiCi0JICAgKiAgIAkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuTXlTcGVjaWZpY0Vycm9yQ3VzdG9taXplci8+Ci0JICAgKiA8L2V4dGVuc2lvbj4KLQkgICAqLwotCSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JICB7Ci0JICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHModGFnTmFtZSkpCi0JICAgIHsKLQkgICAgICBTdHJpbmcgZXJyb3JDdXN0b21pemVyQ2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTkFNRVNQQUNFKTsKLQotCSAgICAgIGlmIChlcnJvckN1c3RvbWl6ZXJDbGFzcyAhPSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIHRyeQotCSAgICAgICAgewotCSAgICAgICAgICBCdW5kbGUgcGx1Z2luQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpOwotCSAgICAgICAgICBFcnJvck1lc3NhZ2VDdXN0b21pemVyRGVsZWdhdGUgZGVsZWdhdGUgPSBuZXcgRXJyb3JNZXNzYWdlQ3VzdG9taXplckRlbGVnYXRlKHBsdWdpbkJ1bmRsZSwgZXJyb3JDdXN0b21pemVyQ2xhc3MpOwotCSAgICAgICAgICBFcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmFkZEVycm9yTWVzc2FnZUN1c3RvbWl6ZXIobmFtZXNwYWNlLCBkZWxlZ2F0ZSk7Ci0JICAgICAgICB9Ci0JICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JICAgICAgICB7Ci0JICAgICAgICB9Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhZTg3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhNTE5lc3RlZFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uWE1MVmFsaWRhdGlvblJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvblJlcG9ydDsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0TmVzdGVkVmFsaWRhdG9yCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVkFMSURBVE9SX0NPTlRFWFQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnZhbGlkYXRvckNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBpbnQgaW5kaWNhdGVOb0dyYW1tYXIgPSAwOwotICAKLSAgLyoqCi0gICAqIFNldCBhbnkgcHJlZmVyZW5jZXMgZm9yIFhNTCB2YWxpZGF0aW9uLgotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI3NldHVwVmFsaWRhdGlvbihvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLk5lc3RlZFZhbGlkYXRvckNvbnRleHQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXR1cFZhbGlkYXRpb24oTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSAKLSAgewotCXN1cGVyLnNldHVwVmFsaWRhdGlvbihjb250ZXh0KTsKLQlpbmRpY2F0ZU5vR3JhbW1hciA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ESUNBVEVfTk9fR1JBTU1BUik7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvciN2YWxpZGF0ZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmlvLklucHV0U3RyZWFtLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLk5lc3RlZFZhbGlkYXRvckNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dHN0cmVhbSwgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KQotICB7Ci0gICAgcmV0dXJuIHZhbGlkYXRlKHVyaSwgaW5wdXRzdHJlYW0sIGNvbnRleHQsIG51bGwpOwotICB9Ci0KLSAgcHVibGljIFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRzdHJlYW0sIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCwgVmFsaWRhdGlvblJlc3VsdCByZXN1bHQpCi0gIHsKLSAgICBYTUxWYWxpZGF0b3IgdmFsaWRhdG9yID0gWE1MVmFsaWRhdG9yLmdldEluc3RhbmNlKCk7Ci0KLSAgICBYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgUHJlZmVyZW5jZXMgcGx1Z2luUHJlZmVyZW5jZXMgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotICAgICAgY29uZmlndXJhdGlvbi5zZXRGZWF0dXJlKFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uLklORElDQVRFX05PX0dSQU1NQVIsIGluZGljYXRlTm9HcmFtbWFyKTsKLSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RmVhdHVyZShYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5VU0VfWElOQ0xVREUsIHBsdWdpblByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VU0VfWElOQ0xVREUpKTsKLSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RmVhdHVyZShYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMsIHBsdWdpblByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMpKTsKLSAgICB9Ci0gICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gVE9ETzogVW5hYmxlIHRvIHNldCB0aGUgcHJlZmVyZW5jZS4gTG9nIHRoaXMgcHJvYmxlbS4KLSAgICB9Ci0gICAgCi0gICAgWE1MVmFsaWRhdGlvblJlcG9ydCB2YWxyZXBvcnQgPSB2YWxpZGF0b3IudmFsaWRhdGUodXJpLCBpbnB1dHN0cmVhbSwgY29uZmlndXJhdGlvbiwgcmVzdWx0LCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHZhbHJlcG9ydDsKLSAgfQotCSAgCi0gIC8qKgotICAgKiBTdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBtZXNzYWdlIHBhcmFtZXRlcnMuIEZvciBYTUwgdmFsaWRhdGlvbiB0aGVyZQotICAgKiBhcmUgdGhyZWUgYWRkaXRpb25hbCBwaWVjZXMgb2YgaW5mb3JtYXRpb24gdG8gc3RvcmU6Ci0gICAqIHBhcmFtWzBdID0gdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGVycm9yCi0gICAqIHBhcmFtWzFdID0gdGhlICdzcXVpZ2dsZSBzZWxlY3Rpb24gc3RyYXRlZ3knIGZvciB3aGljaCBET00gcGFydCB0byBzcXVpZ2dsZQotICAgKiBwYXJhbVsyXSA9IHRoZSBuYW1lIG9yIHZhbHVlIG9mIHdoYXQgaXMgdG8gYmUgc3F1aWdnbGVkCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IjYWRkSW5mb1RvTWVzc2FnZShvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25NZXNzYWdlLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYWRkSW5mb1RvTWVzc2FnZShWYWxpZGF0aW9uTWVzc2FnZSB2YWxpZGF0aW9uTWVzc2FnZSwgSU1lc3NhZ2UgbWVzc2FnZSkKLSAgeyAKLQlTdHJpbmcga2V5ID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0S2V5KCk7Ci0JaWYoa2V5ICE9IG51bGwpCi0JewotICAgICAgWE1MTWVzc2FnZUluZm9IZWxwZXIgbWVzc2FnZUluZm9IZWxwZXIgPSBuZXcgWE1MTWVzc2FnZUluZm9IZWxwZXIoKTsKLSAgICAgIFN0cmluZ1tdIG1lc3NhZ2VJbmZvID0gbWVzc2FnZUluZm9IZWxwZXIuY3JlYXRlTWVzc2FnZUluZm8oa2V5LCB2YWxpZGF0aW9uTWVzc2FnZS5nZXRNZXNzYWdlQXJndW1lbnRzKCkpOwotICAgICAgCi0gICAgICBtZXNzYWdlLnNldEF0dHJpYnV0ZShDT0xVTU5fTlVNQkVSX0FUVFJJQlVURSwgbmV3IEludGVnZXIodmFsaWRhdGlvbk1lc3NhZ2UuZ2V0Q29sdW1uTnVtYmVyKCkpKTsKLSAgICAgIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKFNRVUlHR0xFX1NFTEVDVElPTl9TVFJBVEVHWV9BVFRSSUJVVEUsIG1lc3NhZ2VJbmZvWzBdKTsKLSAgICAgIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKFNRVUlHR0xFX05BTUVfT1JfVkFMVUVfQVRUUklCVVRFLCBtZXNzYWdlSW5mb1sxXSk7Ci0JfQotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBuZXN0ZWQgdmFsaWRhdGlvbiBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIHN0YXRlCi0gICAqICAgICAgICAgIHRoZSB2YWxpZGF0aW9uIHN0YXRlLgotICAgKiBAcGFyYW0gY3JlYXRlCi0gICAqICAgICAgICAgIHdoZW4gdHJ1ZSwgYSBuZXcgY29udGV4dCB3aWxsIGJlIGNyZWF0ZWQgaWYgb25lIGlzIG5vdCBmb3VuZAotICAgKiBAcmV0dXJuIHRoZSBuZXN0ZWQgdmFsaWRhdGlvbiBjb250ZXh0LgotICAgKi8KLSAgcHJvdGVjdGVkIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgZ2V0TmVzdGVkQ29udGV4dChWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIGJvb2xlYW4gY3JlYXRlKQotICB7Ci0gICAgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKLSAgICBPYmplY3QgbyA9IHN0YXRlLmdldChYTUxfVkFMSURBVE9SX0NPTlRFWFQpOwotICAgIGlmIChvIGluc3RhbmNlb2YgWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICAgIGNvbnRleHQgPSAoWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dClvOwotICAgIGVsc2UgaWYgKGNyZWF0ZSkKLSAgICB7Ci0gICAgICBjb250ZXh0ID0gbmV3IFhNTE5lc3RlZFZhbGlkYXRvckNvbnRleHQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbnRleHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRpb25TdGFydGluZyhJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgewotICAgIGlmIChwcm9qZWN0ICE9IG51bGwpCi0gICAgewotICAgICAgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0ID0gZ2V0TmVzdGVkQ29udGV4dChzdGF0ZSwgZmFsc2UpOwotICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29udGV4dCA9IGdldE5lc3RlZENvbnRleHQoc3RhdGUsIHRydWUpOwotICAgICAgICBzZXR1cFZhbGlkYXRpb24oY29udGV4dCk7Ci0gICAgICAgIHN0YXRlLnB1dChYTUxfVkFMSURBVE9SX0NPTlRFWFQsIGNvbnRleHQpOwotICAgICAgfQotICAgICAgc3VwZXIudmFsaWRhdGlvblN0YXJ0aW5nKHByb2plY3QsIHN0YXRlLCBtb25pdG9yKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gIHsKLSAgICBpZiAocHJvamVjdCAhPSBudWxsKQotICAgIHsKLSAgICAgIHN1cGVyLnZhbGlkYXRpb25GaW5pc2hpbmcocHJvamVjdCwgc3RhdGUsIG1vbml0b3IpOwotICAgICAgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0ID0gZ2V0TmVzdGVkQ29udGV4dChzdGF0ZSwgZmFsc2UpOwotICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGVhcmRvd25WYWxpZGF0aW9uKGNvbnRleHQpOwotICAgICAgICBzdGF0ZS5wdXQoWE1MX1ZBTElEQVRPUl9DT05URVhULCBudWxsKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWE1MTWVzc2FnZUluZm9IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWE1MTWVzc2FnZUluZm9IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlNzUyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hNTE1lc3NhZ2VJbmZvSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotLyoqCi0gKiBUaGUgbWVzc2FnZSBpbmZvIGhlbHBlciBkZXRlcm1pbmVzIHRoZSBzZWxlY3Rpb24gc3RyYXRlZ3kgZm9yIGVsZW1lbnRzCi0gKiBpbiBhIFNTRSBlZGl0b3IuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgWE1MTWVzc2FnZUluZm9IZWxwZXIKLXsKLSAgcHVibGljIFhNTE1lc3NhZ2VJbmZvSGVscGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHNob3VsZCBiZSB1bmRlcmxpbmVkIHdpdGggdGhlIHJlZCAic3F1aWdnbGVzIgotICAgKiAgdXNpbmcgdGhlIGVycm9yS2V5LCBhbmQgdGhlIG1lc3NhZ2VBcmd1bWVudHMuCi0gICAqICA8YnI+UG9zaXRpb24gMCBvZiB0aGUgYXJyYXkgcmV0dXJuZWQgY29udGFpbnMgdGhlIHNlbGVjdGlvbiBTdHJhdGVneSwgb3Igd2hhdCBET00gRWxlbWVudCB0byB1bmRlcmxpbmUuICAKLSAgICogIEZvciBleGFtcGxlICJBVFRSSUJVVEVfTkFNRSIgIAotICAgKiAgPGJyPlBvc2l0aW9uIDEgY29udGFpbnMgdGhlIG5hbWUgb3IgdmFsdWUgdG8gc3F1aWdnbGUuCi0gICAqICA8cD5Gb3IgZXhhbXBsZSwgaWYgd2Ugd2FudGVkIHRvIHNxdWlnZ2xlIHRoZSBhdHRyaWJ1dGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgbmFtZQotICAgKiAgZm9vIHRoaXMgbWV0aG9kIHdvdWxkIHJldHVybiB7IkFUVFJJQlVURV9OQU1FIiwgImZvbyJ9Ci0gICAqICA8L3A+Ci0gICAqICBAcGFyYW0gZXJyb3JLZXkgCi0gICAqICAJCVRoZSBlcnJvciBrZXkgZ2l2ZW4gYnkgdGhlIFhlcmNlcyBwYXJzZXIuCi0gICAqICBAcGFyYW0gbWVzc2FnZUFyZ3VtZW50cyAKLSAgICogIAkJVGhlIGFyZ3VtZW50cyB1c2VkIGJ5IFhlcmNlcyB0byAiZmlsbCBpbiB0aGUgYmxhbmtzIiBvZiB0aGVpciBtZXNzYWdlcy4KLSAgICogIEByZXR1cm4gCi0gICAqICAJCUFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHNxdWlnZ2xlIGluZm9ybWF0aW9uLgotICAgKiAgQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvcgotICAgKiAgCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gY3JlYXRlTWVzc2FnZUluZm8oU3RyaW5nIGVycm9yS2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKQotICB7IAotICAgIFN0cmluZyBzZWxlY3Rpb25TdHJhdGVneSA9IG51bGw7Ci0gICAgU3RyaW5nIG5hbWVPclZhbHVlID0gbnVsbDsKLSAgICAKLSAgICBpZihlcnJvcktleSAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuMi40LmEiKSB8fCBlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuMi40LmQiKSB8fCBlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuMi40LmIiKSB8fCBlcnJvcktleS5lcXVhbHMoIk1TR19DT05URU5UX0lOVkFMSUQiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0gICAgICAgIHwgZXJyb3JLZXkuZXF1YWxzKCJNU0dfQ09OVEVOVF9JTkNPTVBMRVRFIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJNU0dfUkVRVUlSRURfQVRUUklCVVRFX05PVF9TUEVDSUZJRUQiKSB8fCBlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuNCIpIHx8IGVycm9yS2V5LmVxdWFscygiRWxlbWVudFByZWZpeFVuYm91bmQiKSAgICkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotICAgICAgewotICAgICAgICBzZWxlY3Rpb25TdHJhdGVneSA9ICJTVEFSVF9UQUciOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoImN2Yy10eXBlLjMuMS4zIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiVEVYVCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS4yLjMiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgIAlzZWxlY3Rpb25TdHJhdGVneSA9ICJGSVJTVF9OT05fV0hJVEVTUEFDRV9URVhUIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtdHlwZS4zLjEuMSIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvblN0cmF0ZWd5ID0gIkFMTF9BVFRSSUJVVEVTIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjMuMi4yIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJNU0dfQVRUUklCVVRFX05PVF9ERUNMQVJFRCIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiQVRUUklCVVRFX05BTUUiOyAvLyROT04tTkxTLTEkCi0JICAgIC8vaW4gdGhpcyBjYXNlIHdlIG5lZWQgbmFtZU9yVmFsdWUgdG8gYmUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byB1bmRlcmxpbmUKLQkgICAgbmFtZU9yVmFsdWUgPSAoU3RyaW5nKW1lc3NhZ2VBcmd1bWVudHNbMV07Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoImN2Yy1hdHRyaWJ1dGUuMyIpIHx8IGVycm9yS2V5LmVxdWFscygiTVNHX0FUVFJJQlVURV9WQUxVRV9OT1RfSU5fTElTVCIpIHx8IGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS4zLjEiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIHsJCi0gICAgCXNlbGVjdGlvblN0cmF0ZWd5ID0gIkFUVFJJQlVURV9WQUxVRSI7ICAgLy8kTk9OLU5MUy0xJAotCQkvL2luIHRoaXMgY2FzZSB3ZSBuZWVkIG5hbWVPclZhbHVlIHRvIGJlIHRoZSBuYW1lIG9mIHRoZSBBdHRyaWJ1dGUKLSAgICAJaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWF0dHJpYnV0ZS4zIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjMuMSIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAJeyAKLSAgICAJICBuYW1lT3JWYWx1ZSA9IChTdHJpbmcpbWVzc2FnZUFyZ3VtZW50c1sxXTsKLSAgICAJfQotICAgIAllbHNlIGlmIChlcnJvcktleS5lcXVhbHMoIk1TR19BVFRSSUJVVEVfVkFMVUVfTk9UX0lOX0xJU1QiKSkgLy8kTk9OLU5MUy0xJAotICAgIAl7CQotICAgIAkgIG5hbWVPclZhbHVlID0gKFN0cmluZyltZXNzYWdlQXJndW1lbnRzWzBdOwotICAgIAl9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoImN2Yy1lbHQuNC4yIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsJCi0gICAgCXNlbGVjdGlvblN0cmF0ZWd5PSJWQUxVRV9PRl9BVFRSSUJVVEVfV0lUSF9HSVZFTl9WQUxVRSI7IC8vJE5PTi1OTFMtMSQKLQkJLy9pbiB0aGlzIGNhc2Ugd2UgbmVlZCBuYW1lT3JWYWx1ZSB0byBiZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB3ZSB3YW50IHRvIHVuZXJsaW5lCi0gICAgCW5hbWVPclZhbHVlID0gKFN0cmluZyltZXNzYWdlQXJndW1lbnRzWzFdOwkKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiRW50aXR5Tm90RGVjbGFyZWQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgeyAgCQotICAgIAlzZWxlY3Rpb25TdHJhdGVneT0iVEVYVF9FTlRJVFlfUkVGRVJFTkNFIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBuYW1lT3JWYWx1ZSA9IChTdHJpbmcpbWVzc2FnZUFyZ3VtZW50c1swXTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiRWxlbWVudFVudGVybWluYXRlZCIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvblN0cmF0ZWd5ID0gIkVOVElSRV9FTEVNRU5UIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJFVGFnVW50ZXJtaW5hdGVkIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJFVGFnUmVxdWlyZWQiKSkgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiRU5EX1RBRyI7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgICBTdHJpbmcgbWVzc2FnZUluZm9bXSA9IG5ldyBTdHJpbmdbMl07Ci0gICAgbWVzc2FnZUluZm9bMF0gPSBzZWxlY3Rpb25TdHJhdGVneSAhPSBudWxsPyBzZWxlY3Rpb25TdHJhdGVneTogIiI7IC8vJE5PTi1OTFMtMSQKLSAgICBtZXNzYWdlSW5mb1sxXSA9IG5hbWVPclZhbHVlOwotICAgIHJldHVybiBtZXNzYWdlSW5mbzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YTUxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWE1MVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ODEwNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YTUxWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotCi0vKioKLSAqIEFuIFhNTCB2YWxpZGF0b3Igc3BlY2lmaWMgdG8gRWNsaXBzZS4gVGhpcyB2YWxpZGF0b3Igd2lsbCB3cmFwIHRoZSBpbnRlcm5hbAotICogWE1MIHZhbGlkYXRvciBhbmQgcHJvdmlkZSBhdXRvbWF0aWMgVVJJIHJlc29sdXRpb24gc3VwcG9ydC4gVGhpcyBjbGFzcyBhbHNvCi0gKiByZWFkcyBmcm9tIHRoZSBwbHVnLWluIHJlZ2lzdHJ5IGFuZCByZWdpc3RlcnMgYWxsIGVycm9yIGN1c3RvbWl6ZXJzIHdpdGggdGhlCi0gKiByZWdpc3RyeS4KLSAqLwotcHVibGljIGNsYXNzIFhNTFZhbGlkYXRvciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhNTFZhbGlkYXRvcgotewotICBwcml2YXRlIHN0YXRpYyBYTUxWYWxpZGF0b3IgaW5zdGFuY2UgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBYTUwgdmFsaWRhdG9yLiBUaGUgdmFsaWRhdG9yCi0gICAqIGNhbiBiZSByZXVzZWQgYW5kIGNhbm5vdCBiZSBjdXN0b21pemVkIHNvIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBpbnN0YW5jZSBvZiBpdC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgWE1MIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgWE1MVmFsaWRhdG9yIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmKGluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2UgPSBuZXcgWE1MVmFsaWRhdG9yKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotICAvKioKLSAgICogQ29uc3RydWN0b3IuIENyZWF0ZSB0aGUgWE1MIHZhbGlkYXRvciwgc2V0IHRoZSBVUkkgcmVzb2x2ZXIgYW5kCi0gICAqIGdldCB0aGUgZXh0ZW5zaW9uIGVycm9yIGN1c3RvbWl6ZXJzIGZyb20gdGhlIHJlZ2lzdHJ5LgotICAgKi8KLSAgcHJvdGVjdGVkIFhNTFZhbGlkYXRvcigpCi0gIHsKLSAgICBzZXRVUklSZXNvbHZlcihVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpKTsKLSAgICBuZXcgRXJyb3JDdXN0b21pemF0aW9uUGx1Z2luUmVnaXN0cnlSZWFkZXIoKS5yZWFkUmVnaXN0cnkoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0VsZW1lbnRJbmZvcm1hdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0VsZW1lbnRJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDljOTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FbGVtZW50SW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBIHNpbXBsZSBjbGFzcyB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCBhbiBYTUwgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRJbmZvcm1hdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsTmFtZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2U7Ci0gIHByb3RlY3RlZCBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogCQlUaGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgZWxlbWVudC4KLSAgICogQHBhcmFtIGxvY2FsTmFtZQotICAgKiAJCVRoZSBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIEVsZW1lbnRJbmZvcm1hdGlvbihTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gICAgdGhpcy5uYW1lc3BhY2UgPSB1cmk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIG5hbWVzcGFjZSBvZiB0aGlzIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuCi0gICAqIAkJVGhlIG5hbWVzcGFjZSBvZiB0aGlzIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gIHsKLQlyZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsb2NhbCBuYW1lIG9mIHRoaXMgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgbG9jYWwgbmFtZSBvZiB0aGlzIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2FsbmFtZSgpCi0gIHsKLQlyZXR1cm4gbG9jYWxOYW1lOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsaXN0IG9mIGNoaWxkcmVuIG9mIHRoaXMgZWxlbWVudC4gVGhlIGxpc3QgY29udGFpbnMKLSAgICogRWxlbWVudEluZm9ybWF0aW9uIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuCi0gICAqIAkJVGhlIGxpc3Qgb2YgY2hpbGRyZW4gb2YgdGhpcyBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKQotICB7Ci0JcmV0dXJuIGNoaWxkcmVuOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0Vycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NWFjYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0Vycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uTWVzc2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHRyYWNrcyB0aGUgY29udGV4dCBvZiB0aGUgcGFyc2VkIGRvY3VtZW50IHRvIGhlbHAgaWRlbnRpZnkgZXJyb3IKLSAqIGNvbmRpdGlvbnMKLSAqLwotcHVibGljIGNsYXNzIEVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIKLXsKLSAgcHJvdGVjdGVkIFN0YWNrIGVsZW1lbnRJbmZvcm1hdGlvblN0YWNrID0gbmV3IFN0YWNrKCk7Ci0gIHByb3RlY3RlZCBFcnJvck1lc3NhZ2VJbmZvcm1hdGlvbiBtZXNzYWdlRm9yQ29uc2lkZXJhdGlvbjsKLQotICAvKioKLSAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbiB0aGUgc3RhcnQgZWxlbWVudCBtZXRob2Qgb2YgdGhlIFhNTCB2YWxpZGF0b3IncwotICAgKiBjb250ZW50IGhhbmRsZXIuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqIAkJVGhlIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudC4KLSAgICogQHBhcmFtIGxvY2FsTmFtZQotICAgKiAJCVRoZSBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsgCi0gICAgRWxlbWVudEluZm9ybWF0aW9uIGVsZW1lbnRJbmZvcm1hdGlvbiA9IG5ldyBFbGVtZW50SW5mb3JtYXRpb24odXJpLCBsb2NhbE5hbWUpOwotICAgIGlmIChlbGVtZW50SW5mb3JtYXRpb25TdGFjay5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIEVsZW1lbnRJbmZvcm1hdGlvbiBwYXJlbnQgPSAoRWxlbWVudEluZm9ybWF0aW9uKSBlbGVtZW50SW5mb3JtYXRpb25TdGFjay5wZWVrKCk7Ci0gICAgICBwYXJlbnQuY2hpbGRyZW4uYWRkKGVsZW1lbnRJbmZvcm1hdGlvbik7Ci0gICAgfQotICAgIGVsZW1lbnRJbmZvcm1hdGlvblN0YWNrLnB1c2goZWxlbWVudEluZm9ybWF0aW9uKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBlbmQgZWxlbWVudCBtZXRob2Qgb2YgdGhlIFhNTCB2YWxpZGF0b3IncwotICAgKiBjb250ZW50IGhhbmRsZXIuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqIAkJVGhlIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudC4KLSAgICogQHBhcmFtIGxvY2FsTmFtZQotICAgKiAJCVRoZSBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7ICAgCi0gICAgaWYgKGVsZW1lbnRJbmZvcm1hdGlvblN0YWNrLnNpemUoKSA+IDApCi0gICAgewotICAgICAgRWxlbWVudEluZm9ybWF0aW9uIGVsZW1lbnRJbmZvcm1hdGlvbiA9IChFbGVtZW50SW5mb3JtYXRpb24pZWxlbWVudEluZm9ybWF0aW9uU3RhY2sucG9wKCk7Ci0gICAgICBpZiAobWVzc2FnZUZvckNvbnNpZGVyYXRpb24gIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBJRXJyb3JNZXNzYWdlQ3VzdG9taXplcltdIGN1c3RvbWl6ZXJzID0gRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDdXN0b21pemVycyhlbGVtZW50SW5mb3JtYXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBpbnQgbnVtQ3VzdG9taXplcnMgPSBjdXN0b21pemVycy5sZW5ndGg7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1DdXN0b21pemVyczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBjdXN0b21pemVyc1tpXS5jdXN0b21pemVNZXNzYWdlKGVsZW1lbnRJbmZvcm1hdGlvbiwgbWVzc2FnZUZvckNvbnNpZGVyYXRpb24ua2V5LCBtZXNzYWdlRm9yQ29uc2lkZXJhdGlvbi5hcmd1bWVudHMpOwotICAgICAgICAgIGlmKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgIAltZXNzYWdlRm9yQ29uc2lkZXJhdGlvbi5tZXNzYWdlLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgIAlicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gIAotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb25zaWRlciB0aGUgcmVwb3J0ZWQgZXJyb3IgZm9yIGN1c3RvbWl6YXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gdmFsSW5mbwotICAgKiAJCVRoZSBjdXJyZW50IFZhbGlkYXRpb25JbmZvIG9iamVjdCBjb250YWluaW5nIHZhbGlkYXRpb24gc3BlY2lmaWMgaW5mb3JtYXRpb24uCi0gICAqIEBwYXJhbSBrZXkKLSAgICogCQlUaGUga2V5IHJlbGF0ZWQgdG8gdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBhcmd1bWVudHMKLSAgICogCQlBbnkgbWVzc2FnZSBhcmd1bWVudHMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjb25zaWRlclJlcG9ydGVkRXJyb3IoVmFsaWRhdGlvbkluZm8gdmFsSW5mbywgU3RyaW5nIGtleSwgT2JqZWN0W10gYXJndW1lbnRzKQotICB7Ci0gICAgbWVzc2FnZUZvckNvbnNpZGVyYXRpb24gPSBudWxsOwotICAgIFZhbGlkYXRpb25NZXNzYWdlW10gbWVzc2FnZXMgPSB2YWxJbmZvLmdldFZhbGlkYXRpb25NZXNzYWdlcygpOwotICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPiAwKQotICAgIHsgIAotICAgICAgbWVzc2FnZUZvckNvbnNpZGVyYXRpb24gPSBuZXcgRXJyb3JNZXNzYWdlSW5mb3JtYXRpb24oKTsKLSAgICAgIG1lc3NhZ2VGb3JDb25zaWRlcmF0aW9uLmtleSA9IGtleTsKLSAgICAgIG1lc3NhZ2VGb3JDb25zaWRlcmF0aW9uLmFyZ3VtZW50cyA9IGFyZ3VtZW50czsKLSAgICAgIG1lc3NhZ2VGb3JDb25zaWRlcmF0aW9uLm1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXTsgCi0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogQSBzaW1wbGUgY2xhc3MgdG8gaG9sZCBlcnJvciBtZXNzYWdlIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHVibGljIGNsYXNzIEVycm9yTWVzc2FnZUluZm9ybWF0aW9uCi0gIHsKLQlwdWJsaWMgU3RyaW5nIGtleSA9IG51bGw7Ci0JcHVibGljIE9iamVjdFtdIGFyZ3VtZW50cyA9IG51bGw7Ci0JcHVibGljIFZhbGlkYXRpb25NZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDk0ODc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhlIGVycm9yIGN1c3RvbWl6YXRpb24gcmVnc2l0cnkgbWFuYWdlcyBhbGwgcmVnaXN0ZXJlZAotICogSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXJzIGJ5IG5hbWVzcGFjZS4KLSAqLwotcHVibGljIGNsYXNzIEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5IAotewotICBwcm90ZWN0ZWQgc3RhdGljIEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbnVsbDsKLSAgcHJvdGVjdGVkIE1hcCBjdXN0b21pemVycyA9IG5ldyBIYXNoTWFwKCk7Ci0gIAotICAvKioKLSAgICogUmVzdHJpY3RlZCBjb25zdHJ1Y3RvciBpbiBrZWVwaW5nIHdpdGggdGhlIHNpbmdsZXRvbiBwYXR0ZXJuLgotICAgKi8KLSAgcHJvdGVjdGVkIEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5KCkKLSAgewotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIHJlZ2lzdHJ5LgotICAgKiAKLSAgICogQHJldHVybgotICAgKiAJCVRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIHJlZ2lzdHJ5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBFcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeSBnZXRJbnN0YW5jZSgpCi0gIHsKLQlpZihyZWdpc3RyeSA9PSBudWxsKQotCXsKLQkgIHJlZ2lzdHJ5ID0gbmV3IEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5KCk7Ci0JfQotCXJldHVybiByZWdpc3RyeTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIGN1c3RvbWl6ZXIgdG8gdGhlIHJlZ2lzdHJ5LiAKLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICogCQlUaGUgbmFtZXNwYWNlIHRoZSBjdXN0b21pemVyIHdpbGwgYWN0IG9uLgotICAgKiBAcGFyYW0gY3VzdG9taXplcgotICAgKiAJCVRoZSBlcnJvciBjdXN0b21pemVyIHRvIHJlZ2lzdGVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXJyb3JNZXNzYWdlQ3VzdG9taXplcihTdHJpbmcgbmFtZXNwYWNlLCBJRXJyb3JNZXNzYWdlQ3VzdG9taXplciBjdXN0b21pemVyKQotICB7Ci0JLy8gVG8gcmVnaXN0ZXIgYSBjdXN0b21pemVyIGZvciB0aGUgbm8gbmFtZXNwYWNlIHVzZSBhbiBlbXB0eSBzdHJpbmcuCi0JaWYobmFtZXNwYWNlID09IG51bGwpCi0JewotCSAgbmFtZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JTGlzdCBjdXN0b21pemVyc0Zvck5TID0gKExpc3QpY3VzdG9taXplcnMuZ2V0KG5hbWVzcGFjZSk7Ci0JaWYoY3VzdG9taXplcnNGb3JOUyA9PSBudWxsKQotCXsKLQkgIGN1c3RvbWl6ZXJzRm9yTlMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICBjdXN0b21pemVycy5wdXQobmFtZXNwYWNlLCBjdXN0b21pemVyc0Zvck5TKTsKLQl9Ci0JaWYoY3VzdG9taXplciAhPSBudWxsKQotCXsKLQkgIGN1c3RvbWl6ZXJzRm9yTlMuYWRkKGN1c3RvbWl6ZXIpOwotCX0KLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgZXJyb3IgY3VzdG9taXplcnMgZm9yIGEgZ2l2ZW4gbmFtZXNwYWNlLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgKiAJCVRoZSBuYW1lc3BhY2UgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBjdXN0b21pemVycy4KLSAgICogQHJldHVybgotICAgKiAJCUFuIGFycmF5IG9mIGN1c3RvbWl6ZXJzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgbmFtZXNwYWNlLgotICAgKi8KLSAgcHVibGljIElFcnJvck1lc3NhZ2VDdXN0b21pemVyW10gZ2V0Q3VzdG9taXplcnMoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotCWlmKG5hbWVzcGFjZSA9PSBudWxsKQotCXsKLQkgIG5hbWVzcGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCUxpc3QgY3VzdG9taXplcnNGb3JOUyA9IChMaXN0KWN1c3RvbWl6ZXJzLmdldChuYW1lc3BhY2UpOwotCWlmKGN1c3RvbWl6ZXJzRm9yTlMgPT0gbnVsbCkKLQl7Ci0JICBjdXN0b21pemVyc0Zvck5TID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQlyZXR1cm4gKElFcnJvck1lc3NhZ2VDdXN0b21pemVyW10pY3VzdG9taXplcnNGb3JOUy50b0FycmF5KG5ldyBJRXJyb3JNZXNzYWdlQ3VzdG9taXplcltjdXN0b21pemVyc0Zvck5TLnNpemUoKV0pOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRXJyb3JNZXNzYWdlQ3VzdG9taXplckRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRXJyb3JNZXNzYWdlQ3VzdG9taXplckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MTQ3YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0Vycm9yTWVzc2FnZUN1c3RvbWl6ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQW4gZXJyb3IgbWVzc2FnZSBjdXN0b21pemVyIGRlbGVnYXRlIGlzIHVzZWQgdG8gYWxsb3cgZm9yCi0gKiBsYXp5IGxvYWRpbmcgb2YgZXJyb3IgY3VzdG9taXplcnMuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JNZXNzYWdlQ3VzdG9taXplckRlbGVnYXRlIGltcGxlbWVudHMgSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXIKLXsKLSAgcHJvdGVjdGVkIEJ1bmRsZSBidW5kbGUgPSBudWxsOwotICBwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzbmFtZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBJRXJyb3JNZXNzYWdlQ3VzdG9taXplciBjdXN0b21pemVyID0gbnVsbDsKLSAgCi0gIHB1YmxpYyBFcnJvck1lc3NhZ2VDdXN0b21pemVyRGVsZWdhdGUoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGNsYXNzbmFtZSkKLSAgewotCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCXRoaXMuY2xhc3NuYW1lID0gY2xhc3NuYW1lOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbi5JRXJyb3JNZXNzYWdlQ3VzdG9taXplciNjdXN0b21pemVNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbi5FbGVtZW50SW5mb3JtYXRpb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgY3VzdG9taXplTWVzc2FnZShFbGVtZW50SW5mb3JtYXRpb24gZWxlbWVudEluZm8sIFN0cmluZyBlcnJvcktleSwgT2JqZWN0W10gYXJndW1lbnRzKSAKLSAgewotCWlmKGN1c3RvbWl6ZXIgPT0gbnVsbCkKLQl7Ci0JICBsb2FkQ3VzdG9taXplcigpOwotCX0KLQlpZihjdXN0b21pemVyID09IG51bGwpCi0JewotCSAgcmV0dXJuIG51bGw7Ci0JfQotCXJldHVybiBjdXN0b21pemVyLmN1c3RvbWl6ZU1lc3NhZ2UoZWxlbWVudEluZm8sIGVycm9yS2V5LCBhcmd1bWVudHMpOwotICB9Ci0gIAotICAvKioKLSAgICogTG9hZCB0aGUgY3VzdG9taXplciBjbGFzcy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGxvYWRDdXN0b21pemVyKCkKLSAgewotCXRyeQotCXsKLQkgIENsYXNzIGN1c3RvbWl6ZXJDbGFzcyA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NuYW1lKTsKLQkgIGN1c3RvbWl6ZXIgPSAoSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXIpY3VzdG9taXplckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JfQotCWNhdGNoKEV4Y2VwdGlvbiBlKQotCXsKLQkgIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZygKLQkJCSAgbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIAotCQkJCQkgICAgIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAKLQkJCQkJICAgICBJU3RhdHVzLk9LLCAKLQkJCQkJICAgICAiVGhlIFhNTCB2YWxpZGF0b3IgZXJyb3IgY3VzdG9taXplciB3YXMgdW5hYmxlIHRvIGxvYWQgY2xhc3MgIiArIGNsYXNzbmFtZSwgZSkpOyAvLyROT04tTkxTLTEkCi0JfQotICB9Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9JRXJyb3JNZXNzYWdlQ3VzdG9taXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0lFcnJvck1lc3NhZ2VDdXN0b21pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNmQxZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0lFcnJvck1lc3NhZ2VDdXN0b21pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbjsKLQotLyoqCi0gKiBBbiBlcnJvciBtZXNzYWdlIGN1c3RvbWl6ZXIgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIFhNTCB2YWxpZGF0b3IgdG8gY3VzdG9taXplCi0gKiBYTUwgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIGEgZ2l2ZW4gbmFtZXNwYWNlLiBUaGUgY3VzdG9taXplciBjYW4gYmUgdXNlZCB0byAKLSAqIGNyZWF0ZSBjbGVhcmVyIGVycm9ycyBmb3Igc3BlY2lmaWMgYXBwbGljYXRpb24gZG9tYWlucy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRXJyb3JNZXNzYWdlQ3VzdG9taXplciAKLXsKLSAgLyoqCi0gICAqIFJldHVybiBhIGN1c3RvbWl6ZWQgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIE51bGwgc2hvdWxkIGJlIHJldHVybmVkCi0gICAqIGlmIHRoZSBtZXNzYWdlIHNob3VsZCBub3QgYmUgY3VzdG9taXplZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50SW5mb3JtYXRpb24KLSAgICogCQlUaGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGN1c3RvbWl6ZSB0aGUgZXJyb3IuCi0gICAqIEBwYXJhbSBlcnJvcktleQotICAgKiAJCVRoZSBrZXkgZm9yIHRoZSBlcnJvciBmb3Igd2hpY2ggdG8gcmVwbGFjZSB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGFyZ3VtZW50cwotICAgKiAJCUFyZ3VtZW50cyByZWxhdGVkIHRoZSB0aGUgZXJyb3IgbWVzc2FnZS4KLSAgICogQHJldHVybgotICAgKiAJCUEgY3VzdG9taXplZCBlcnJvciBtZXNzYWdlIG9yIG51bGwgaWYgdGhpcyBjdXN0b21pemVyIHdpbGwgbm90IGN1c3RvbWl6ZSB0aGUgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgY3VzdG9taXplTWVzc2FnZShFbGVtZW50SW5mb3JtYXRpb24gZWxlbWVudEluZm8sIFN0cmluZyBlcnJvcktleSwgT2JqZWN0W10gYXJndW1lbnRzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL3htbHZhbGlkYXRpb24ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL3htbHZhbGlkYXRpb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxMDY1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi94bWx2YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hLS0gQ29uc3RhbnRzIGZvciBzdHJpbmdzICAKLQotISBVc2FnZToKLSEgICB7MH0gcmVwbGFjZWQgd2l0aCB0aGUgaG9zdCBuYW1lCi0hCi1fVUlfUFJPQkxFTVNfVkFMSURBVElOR19VTktOT1dOX0hPU1QgICAgICAgICAgICAgPSBUaGUgZmlsZSBjYW5ub3QgYmUgdmFsaWRhdGVkIGFzIHRoZSBob3N0ICJ7MH0iIGlzIGN1cnJlbnRseSB1bnJlYWNoYWJsZS4KLQotISBVc2FnZToKLSEgICB7MH0gcmVwbGFjZWQgd2l0aCB0aGUgZmlsZSBuYW1lCi0hCi1fVUlfUFJPQkxFTVNfVkFMSURBVElOR19GSUxFX05PVF9GT1VORCAgICAgICAgICAgPSBUaGUgZmlsZSBjYW5ub3QgYmUgdmFsaWRhdGVkIGFzIHRoZSBYTUwgZGVmaW5pdGlvbiAiezB9IiB0aGF0IGlzIHNwZWNpZmllZCBhcyBkZXNjcmliaW5nIHRoZSBzeW50YXggb2YgdGhlIGZpbGUgY2Fubm90IGJlIGxvY2F0ZWQuCi0KLV9VSV9QUk9CTEVNU19DT05ORUNUSU9OX1JFRlVTRUQgICAgICAgICAgICAgICAgICA9IFRoZSBmaWxlIGNhbm5vdCBiZSB2YWxpZGF0ZWQgYXMgdGhlcmUgd2FzIGEgY29ubmVjdGlvbiBwcm9ibGVtLgotCi0hCi0hIFJlZmVyZW5jZWQgRmlsZSBEaWFsb2cgUmVsYXRlZCBNZXNzYWdlCi0hCi1fVUlfUkVGX0ZJTEVfRVJST1JfTUVTU0FHRSAgICAgICAgICAgICAgICAgICAgICAgPSBSZWZlcmVuY2VkIGZpbGUgY29udGFpbnMgZXJyb3JzICh7MH0pLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJpZ2h0IGNsaWNrIG9uIHRoZSBtZXNzYWdlIGluIHRoZSBQcm9ibGVtcyBWaWV3IGFuZCBzZWxlY3QgIlNob3cgRGV0YWlscy4uLiIKLQotIyBXYXJuaW5nIHdoZW4gbm8gZ3JhbW1hciBpcyBsb2NhdGVkLgotX1dBUk5fTk9fR1JBTU1BUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTm8gZ3JhbW1hciBjb25zdHJhaW50cyAoRFREIG9yIFhNTCBzY2hlbWEpIGRldGVjdGVkIGZvciB0aGUgZG9jdW1lbnQuCi0gCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDFjMjllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotbm90ZWJvb2suanBhZ2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvRGVidWdBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9EZWJ1Z0FkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NmI4MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9EZWJ1Z0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci0KLQotcHVibGljIGNsYXNzIERlYnVnQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVidWdBZGFwdGVyRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgRGVidWdBZGFwdGVyRmFjdG9yeSgpIHsKLQkJdGhpcyhJRGVidWdBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAgZm9yIERlYnVnQWRhcHRlckZhY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGZBZGFwdGVyS2V5Ci0JICogQHBhcmFtIHJlZ2lzdGVyQWRhcHRlcnMKLQkgKi8KLQlwcml2YXRlIERlYnVnQWRhcHRlckZhY3RvcnkoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCBhZGRDb250cmlidXRlZEZhY3RvcmllcyhJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJLy9ub25lIGV4cGVjdGVkCi0JfQotCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIG5ldyBEZWJ1Z0FkYXB0ZXJGYWN0b3J5KGdldEFkYXB0ZXJLZXkoKSwgaXNTaG91bGRSZWdpc3RlckFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCUV2ZXJ5Tm9kZURlYnVnQWRhcHRlciByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBFdmVyeU5vZGVEZWJ1Z0FkYXB0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklBZGFwdGVyRmFjdG9yeSNpc0ZhY3RvcnlGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCi0JCXJldHVybiBJRGVidWdBZGFwdGVyLmNsYXNzID09IHR5cGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeSNzZXRDb250cmlidXRlZEZhY3RvcmllcyhqYXZhLnV0aWwuQXJyYXlMaXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRyaWJ1dGVkRmFjdG9yaWVzKEFycmF5TGlzdCBsaXN0KSB7Ci0JCS8vIG5vbmUgZXhwZWN0ZWQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0V2ZXJ5Tm9kZURlYnVnQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9FdmVyeU5vZGVEZWJ1Z0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhNzE4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0V2ZXJ5Tm9kZURlYnVnQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLkFib3V0VG9CZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotCi0vKioKLSAqIFB1cmVseSBmb3IgdXNlIGluIGRlYnVnZ2luZwotICovCi1wdWJsaWMgY2xhc3MgRXZlcnlOb2RlRGVidWdBZGFwdGVyIGltcGxlbWVudHMgSURlYnVnQWRhcHRlciB7Ci0KLQlzdGF0aWMgY2xhc3MgSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50TGlzdGVuZXIgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCURlYnVnLnByaW50bG4oIklkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQ6ICIgKyBldmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyI2RvY3VtZW50Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJRGVidWcucHJpbnRsbigiSWRvY3VtZW50Q2hhbmdlZDogIiArIGV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCX0KLQotCXN0YXRpYyBjbGFzcyBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElNb2RlbFN0YXRlTGlzdGVuZXIgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxBYm91dFRvQmVDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCURlYnVnLnByaW50bG4oIm1vZGVsQWJvdXRUb0JlQ2hhbmdlZDogIiArIG1vZGVsKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsQ2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJtb2RlbENoYW5nZWQ6ICIgKyBtb2RlbCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbCwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpIHsKLQkJCURlYnVnLnByaW50bG4oIm1vZGVsRGlydHlTdGF0ZUNoYW5nZWQ6ICIgKyBtb2RlbCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlRGVsZXRlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCURlYnVnLnByaW50bG4oIm1vZGVsUmVzb3VyY2VEZWxldGVkOiAiICsgbW9kZWwpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZU1vdmVkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJCURlYnVnLnByaW50bG4oIm1vZGVsUmVzb3VyY2VNb3ZlZDogIiArICJvbGRNb2RlbDogIiArIG9sZE1vZGVsICsgIm5ld01vZGVsOiAiICsgbmV3TW9kZWwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQ6ICIgKyAic3RydWN0dXJlZE1vZGVsOiAiICsgc3RydWN0dXJlZE1vZGVsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkJRGVidWcucHJpbnRsbigibW9kZWxSZWluaXRpYWxpemVkOiAiICsgInN0cnVjdHVyZWRNb2RlbDogIiArIHN0cnVjdHVyZWRNb2RlbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCX0KLQotCX0KLQotCXN0YXRpYyBjbGFzcyBJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UgaW1wbGVtZW50cyBJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5JTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIjbW9kZWxBYm91dFRvQmVDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuQWJvdXRUb0JlQ2hhbmdlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKEFib3V0VG9CZUNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJRGVidWcucHJpbnRsbigic3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZDogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCX0KLQotCXN0YXRpYyBjbGFzcyBJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIHsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI25ld01vZGVsKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuTmV3RG9jdW1lbnRDb250ZW50RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkIC0gbmV3TW9kZWw6ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNub0NoYW5nZShvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5vQ2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkIC0gbm9DaGFuZ2U6ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNub2Rlc1JlcGxhY2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkIC0gbm9kZXNSZXBsYWNlZDogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI3JlZ2lvbkNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJRGVidWcucHJpbnRsbigic3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZCAtIHJlZ2lvbkNoYW5nZWQ6ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNyZWdpb25zUmVwbGFjZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJRGVidWcucHJpbnRsbigic3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZCAtIHJlZ2lvbnNSZXBsYWNlZDogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIEV2ZXJ5Tm9kZURlYnVnQWRhcHRlciBzaW5nbGV0b25JbnN0YW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgRXZlcnlOb2RlRGVidWdBZGFwdGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoc2luZ2xldG9uSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc2luZ2xldG9uSW5zdGFuY2UgPSBuZXcgRXZlcnlOb2RlRGVidWdBZGFwdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHNpbmdsZXRvbkluc3RhbmNlOwotCX0KLQotCUludGVybmFsRG9jdW1lbnRMaXN0ZW5lciBmSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyOwotCUludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGZJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcjsKLQlJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UgZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZTsKLQlJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotCUlTdHJ1Y3R1cmVkTW9kZWwgZk1vZGVsOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEV2ZXJ5Tm9kZURlYnVnQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQkJZkludGVybmFsRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIoKTsKLQkJZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZSA9IG5ldyBJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UoKTsKLQkJZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcigpOwotCQlmSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICovCi0JcHVibGljIEV2ZXJ5Tm9kZURlYnVnQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQl0aGlzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBJRGVidWdBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllciwKLQkgKiAgICAgIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJc2V0TW9kZWwoKChJRE9NTm9kZSkgbm90aWZpZXIpLmdldE1vZGVsKCkpOwotCQl9Ci0JCURlYnVnLnByaW50bG4oIm5vdGlmaWVyOiAiICsgbm90aWZpZXIgKyAiICIgKyBJTm9kZU5vdGlmaWVyLkVWRU5UX1RZUEVfU1RSSU5HU1tldmVudFR5cGVdICsgIiBjaGFuZ2VkRmVhdHVyZTogIiArIGNoYW5nZWRGZWF0dXJlICsgIiBvbGRWYWx1ZTogIiArIG9sZFZhbHVlICsgIiBuZXdWYWx1ZTogIiArIG5ld1ZhbHVlICsgIiBwb3M6ICIgKyBwb3MpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuSURlYnVnQWRhcHRlciNzZXREb2N1bWVudChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50KQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlpZiAoZk1vZGVsID09IHN0cnVjdHVyZWRNb2RlbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZk1vZGVsICE9IG51bGwpIHsKLQkJCWZNb2RlbC5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoZkludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKTsKLQkJCS8vCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGZNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGZJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIpOwotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlKTsKLQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCWZNb2RlbCA9IHN0cnVjdHVyZWRNb2RlbDsKLQkJaWYgKGZNb2RlbCAhPSBudWxsKSB7Ci0KLQkJCWZNb2RlbC5hZGRNb2RlbFN0YXRlTGlzdGVuZXIoZkludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKTsKLQkJCS8vCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGZNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudExpc3RlbmVyKGZJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIpOwotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlKTsKLQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvSURlYnVnQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9JRGVidWdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YzU3MTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9JRGVidWdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElEZWJ1Z0FkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5OGM5YmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYKLSAqIGRlc2lyZWQsIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzCi0gKiBwbHVnaW4uIE90aGVyIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9YTUxDb3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMWMwYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9YTUxDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogSmVzcGVyIFN0ZWVuIE1vZWxsZXIgLSBBZGRlZCBYTUwgQ2F0YWxvZ3MgMS4xIHN1cHBvcnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBYTUwgQ29yZQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTENvcmVNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF9jaGFyYWN0ZXJfbHRfZm9fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfY2hhcmFjdGVyX2d0X2ZvX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX2NoYXJhY3Rlcl9hbXBfZm9fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfY2hhcmFjdGVyX19mX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXRhbG9nX2VudHJ5X2tleV9ub3Rfc2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGFsb2dfZW50cnlfdXJpX25vdF9zZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19yZXdyaXRlX3N0YXJ0U3RyaW5nX25vdF9zZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19yZXdyaXRlX3ByZWZpeF9ub3Rfc2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGFsb2dfc3VmZml4X3N0cmluZ19ub3Rfc2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGFsb2dfc3VmZml4X3VyaV9ub3Rfc2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGFsb2dfZGVsZWdhdGVfcHJlZml4X25vdF9zZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19kZWxlZ2F0ZV9jYXRhbG9nX25vdF9zZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19uZXh0X2NhdGFsb2dfbG9jYXRpb25fdXJpX25vdF9zZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19yZXNvbHV0aW9uX251bGxfY2F0YWxvZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXRhbG9nX3Jlc29sdXRpb25fbWFsZm9ybWVkX3VybDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXRhbG9nX3Jlc29sdXRpb25faW9fZXhjZXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENNRG9jdW1lbnRfbG9hZF9leGNlcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kX3RhZ19oYXNfYXR0cmlidXRlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfX2lzX21pc3NpbmdfYV92YWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfX2hhc19ub192YWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaXNzaW5nX2VuZF90YWdfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3Npbmdfc3RhcnRfdGFnXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVjb25jaWxlU3RlcEZvck1hcmt1cF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVjb25jaWxlU3RlcEZvck1hcmt1cF80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWRfc2V2ZXJpdGllc19lcnJvcjsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBYTUxDb3JlTWVzc2FnZXMuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIFhNTENvcmVNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjE0OGEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5DYXRhbG9nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotCi0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFhNTENvcmVQbHVnaW4gcGx1Z2luOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfQ0FUQUxPR19JRCA9ICJ1c2VyX2NhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DQVRBTE9HX0lEID0gImRlZmF1bHRfY2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fQ0FUQUxPR19JRCA9ICJzeXN0ZW1fY2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIENhdGFsb2dTZXQgY2F0YWxvZ1NldCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdENhdGFsb2dGaWxlU3RhdGVMb2NhdGlvbjsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgWE1MQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkgZGlyZWN0bHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgWE1MQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKFN0cmluZyBmaWxlTmFtZSkgewotCQlTdHJpbmcgbG9jYXRpb24gPSBnZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKGZpbGVOYW1lKS50b1N0cmluZygpOwotCQlTdHJpbmcgZmlsZV9wcm90b2NvbCA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwgJiYgIWxvY2F0aW9uLnN0YXJ0c1dpdGgoZmlsZV9wcm90b2NvbCkpIHsKLQkJCWxvY2F0aW9uID0gZmlsZV9wcm90b2NvbCArIGxvY2F0aW9uOwotCQl9Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2cgZ2V0RGVmYXVsdFhNTENhdGFsb2coKSB7Ci0JCWlmIChjYXRhbG9nU2V0ID09IG51bGwpIHsKLQkJCWNhdGFsb2dTZXQgPSBuZXcgQ2F0YWxvZ1NldCgpOwotCi0JCQlkZWZhdWx0Q2F0YWxvZ0ZpbGVTdGF0ZUxvY2F0aW9uID0gZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbihDYXRhbG9nLkRFRkFVTFRfQ0FUQUxPR19GSUxFKTsKLQotCQkJY2F0YWxvZ1NldC5wdXRDYXRhbG9nUGVyc2lzdGVuY2VMb2NhdGlvbihERUZBVUxUX0NBVEFMT0dfSUQsIGRlZmF1bHRDYXRhbG9nRmlsZVN0YXRlTG9jYXRpb24pOwotCQkJY2F0YWxvZ1NldC5wdXRDYXRhbG9nUGVyc2lzdGVuY2VMb2NhdGlvbihTWVNURU1fQ0FUQUxPR19JRCwgZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbihDYXRhbG9nLlNZU1RFTV9DQVRBTE9HX0ZJTEUpKTsKLQkJCWNhdGFsb2dTZXQucHV0Q2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb24oVVNFUl9DQVRBTE9HX0lELCBnZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKENhdGFsb2cuVVNFUl9DQVRBTE9HX0ZJTEUpKTsKLQkJfQotCQlyZXR1cm4gY2F0YWxvZ1NldC5sb29rdXBPckNyZWF0ZUNhdGFsb2coREVGQVVMVF9DQVRBTE9HX0lELCBkZWZhdWx0Q2F0YWxvZ0ZpbGVTdGF0ZUxvY2F0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9YTUxDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZjFmYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9YTUxDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIEplc3BlciBTdGVlbiBNb2VsbGVyIC0gQWRkZWQgWE1MIENhdGFsb2dzIDEuMSBzdXBwb3J0Ci0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUludmFsaWRfY2hhcmFjdGVyX2x0X2ZvX0VSUk9SXz1JbnZhbGlkIGNoYXJhY3RlciAoJzwnKSBmb3VuZAotSW52YWxpZF9jaGFyYWN0ZXJfZ3RfZm9fRVJST1JfPUludmFsaWQgY2hhcmFjdGVyICgnPicpIGZvdW5kCi1JbnZhbGlkX2NoYXJhY3Rlcl9hbXBfZm9fRVJST1JfPUludmFsaWQgY2hhcmFjdGVyICgnJicpIGZvdW5kCi1JbnZhbGlkX2NoYXJhY3Rlcl9fZl9FWENfPUludmFsaWQgY2hhcmFjdGVyICgnXCInKSBmb3VuZAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBjb250ZW50bW9kZWwgc3RyaW5ncwotbG9hZGluZz1sb2FkaW5nIAotIyBjYXRhbG9nIHN0cmluZ3MKLUNhdGFsb2dfZW50cnlfa2V5X25vdF9zZXQ9Q2F0YWxvZyBlbnRyeSBrZXkgaXMgbm90IHNldAotQ2F0YWxvZ19lbnRyeV91cmlfbm90X3NldD1DYXRhbG9nIGVudHJ5IFVSSSBpcyBub3Qgc2V0Ci1DYXRhbG9nX3Jld3JpdGVfc3RhcnRTdHJpbmdfbm90X3NldD1DYXRhbG9nIHJld3JpdGUgc3RhcnQgc3RyaW5nIGlzIG5vdCBzZXQKLUNhdGFsb2dfcmV3cml0ZV9wcmVmaXhfbm90X3NldD1DYXRhbG9nIHJld3JpdGUgcHJlZml4IGlzIG5vdCBzZXQKLUNhdGFsb2dfc3VmZml4X3N0cmluZ19ub3Rfc2V0PUNhdGFsb2cgc3VmZml4IHN0cmluZyBpcyBub3Qgc2V0Ci1DYXRhbG9nX3N1ZmZpeF91cmlfbm90X3NldD1DYXRhbG9nIHN1ZmZpeCBVUkkgaXMgbm90IHNldAotQ2F0YWxvZ19kZWxlZ2F0ZV9wcmVmaXhfbm90X3NldD1DYXRhbG9nIGRlbGVnYXRlIHByZWZpeCBpcyBub3Qgc2V0Ci1DYXRhbG9nX2RlbGVnYXRlX2NhdGFsb2dfbm90X3NldD1DYXRhbG9nIGRlbGVnYXRlIFVSSSBpcyBub3Qgc2V0Ci1DYXRhbG9nX25leHRfY2F0YWxvZ19sb2NhdGlvbl91cmlfbm90X3NldD1OZXh0IGNhdGFsb2cgbG9jYXRpb24gVVJJIGlzIG5vdCBzZXQKLUNhdGFsb2dfcmVzb2x1dGlvbl9udWxsX2NhdGFsb2c9Q2F0YWxvZyByZXNvbHV0aW9uIGF0dGVtcHRlZCB3aXRoIG51bGwgY2F0YWxvZzsgaWdub3JlZAotQ2F0YWxvZ19yZXNvbHV0aW9uX21hbGZvcm1lZF91cmw9TWFsZm9ybWVkIFVSTCBleGNlcHRpb24gdHJ5aW5nIHRvIHJlc29sdmUKLUNhdGFsb2dfcmVzb2x1dGlvbl9pb19leGNlcHRpb249SS9PIGV4Y2VwdGlvbiB0cnlpbmcgdG8gcmVzb2x2ZQotQ01Eb2N1bWVudF9sb2FkX2V4Y2VwdGlvbj1BbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBsb2FkaW5nIGRvY3VtZW50IHswfSB3aXRoIHB1YmxpY0lkIHsxfQotRW5kX3RhZ19oYXNfYXR0cmlidXRlcz1FbmQgdGFnIGhhcyBhdHRyaWJ1dGVzCi1BdHRyaWJ1dGVfX2lzX21pc3NpbmdfYV92YWx1ZT1BdHRyaWJ1dGUgXCJ7MH1cIiBpcyBtaXNzaW5nIGEgdmFsdWUKLUF0dHJpYnV0ZV9faGFzX25vX3ZhbHVlPUF0dHJpYnV0ZSBcInswfVwiICBoYXMgbm8gdmFsdWUKLU1pc3Npbmdfc3RhcnRfdGFnXz1NaXNzaW5nIHN0YXJ0IHRhZyBcInswfVwiCi1NaXNzaW5nX2VuZF90YWdfPU1pc3NpbmcgZW5kIHRhZyBcInswfVwiCi1SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzA9TWlzc2luZyBjbG9zaW5nIHF1b3RlCi1SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzE9TWlzc2luZyBxdW90ZXMgZm9yIGF0dHJpYnV0ZSB2YWx1ZQotUmVjb25jaWxlU3RlcEZvck1hcmt1cF8yPUEgdGFnbmFtZSBjYW5ub3Qgc3RhcnQgd2l0aCBhIHNwYWNlCi1SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzM9RW1wdHkgdGFncyBhcmUgbm90IGFsbG93ZWQKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfND1OYW1lc3BhY2VzIGFyZSBub3QgYWxsb3dlZCBpbiBhIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24gdGFyZ2V0Ci1SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzU9U3BhY2VzIGFyZSBub3QgYWxsb3dlZCBiZWZvcmUgYSBQcm9jZXNzaW5nIEluc3RydWN0aW9uCi1SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzY9VGFnIG1pc3NpbmcgY2xvc2luZyBicmFja2V0ICc+JwotSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWRfc2V2ZXJpdGllc19lcnJvcj1FcnJvckNNRG9jdW1lbnRfbG9hZF9leGNlcHRpb249QW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyBkb2N1bWVudCB7MH0gd2l0aCBwdWJsaWNJZCB7MX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DbGVhbnVwUHJvY2Vzc29yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQ2xlYW51cFByb2Nlc3NvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWE0YWY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DbGVhbnVwUHJvY2Vzc29yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkFic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5TdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5ET01Nb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlRleHRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuWE1MRm9ybWF0dGVyRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwUHJvY2Vzc29yWE1MIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGZDbGVhbnVwUHJlZmVyZW5jZXMgPSBudWxsOwotCQotCXB1YmxpYyB2b2lkIGNsZWFudXBNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwgJiYgcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZJWF9YTUxfREVDTEFSQVRJT04pKSB7Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSAoKERPTU1vZGVsSW1wbCkgc3RydWN0dXJlZE1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJaWYgKCFmaXhFeGlzdGluZ1htbERlY2woZG9jdW1lbnQpKSB7Ci0JCQkJU3RyaW5nIGVuY29kaW5nID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQkJCQlOb2RlIHhtbCA9IGRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbigieG1sIiwgInZlcnNpb249XCIxLjBcIiAiICsgImVuY29kaW5nPVwiIiArIGVuY29kaW5nICsiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCWRvY3VtZW50Lmluc2VydEJlZm9yZSh4bWwsIGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuY2xlYW51cE1vZGVsKHN0cnVjdHVyZWRNb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhlIG5vZGUgYW4gWE1MIGRlY2xhcmF0aW9uCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgaXMgYW4gWE1MIGRlY2xhcmF0aW9uOyBvdGhlcndpc2UsIGZhbHNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1hNTERlY2woSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSAmJiAieG1sIi5lcXVhbHNJZ25vcmVDYXNlKCgoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlKS5nZXRUYXJnZXQoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZml4RXhpc3RpbmdYbWxEZWNsKElET01Eb2N1bWVudCBkb2N1bWVudCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmICgoVGV4dEltcGwpIG5vZGUpLmlzV2hpdGVzcGFjZSgpKQotCQkJbm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXROZXh0U2libGluZygpOwotCQlpZiAoaXNYTUxEZWNsKG5vZGUpKSB7Ci0JCQlkb2N1bWVudC5pbnNlcnRCZWZvcmUobm9kZSwgZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBnZXRDbGVhbnVwSGFuZGxlcihOb2RlIG5vZGUpIHsKLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgY2xlYW51cEhhbmRsZXIgPSBudWxsOwotCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCWNsZWFudXBIYW5kbGVyID0gbmV3IEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJY2xlYW51cEhhbmRsZXIgPSBuZXcgTm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZWZhdWx0IDogewotCQkJCWNsZWFudXBIYW5kbGVyID0gbmV3IE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJfQotCQl9Ci0KLQkJLy8gaW5pdCBDbGVhbnVwUHJlZmVyZW5jZXMKLQkJY2xlYW51cEhhbmRsZXIuc2V0Q2xlYW51cFByZWZlcmVuY2VzKGdldENsZWFudXBQcmVmZXJlbmNlcygpKTsKLQotCQlyZXR1cm4gY2xlYW51cEhhbmRsZXI7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGdldENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZDbGVhbnVwUHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzKCk7Ci0KLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRJbnNlcnRSZXF1aXJlZEF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydE1pc3NpbmdUYWdzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRRdW90ZUF0dHJWYWx1ZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRGb3JtYXRTb3VyY2UocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbnZlcnRFT0xDb2RlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEVPTENvZGUocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUw7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGdldEZvcm1hdFByb2Nlc3NvcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxGb3JtYXR0ZXJGb3JtYXRQcm9jZXNzb3IoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0VsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9FbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYmFhNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0VsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChJbnRhbGlvbikgLSBDbGVhbnVwIFJlcGVhdGVkIENvbmRpdGlvbmFsIGNoZWNrIGluIGlzWE1MVHlwZSBtZXRob2QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSVNvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIgZXh0ZW5kcyBOb2RlQ2xlYW51cEhhbmRsZXIgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfUVVPVEUgPSAnXCInOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX1FVT1RFUyA9ICJcIlwiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1RBR19DTE9TRSA9ICIvPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfVEFHX09QRU4gPSAiPC8iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIFNJTkdMRV9RVU9URSA9ICdcJyc7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfUVVPVEVTID0gIicnIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIE5vbi1OTFMgc3RyaW5ncyAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RBR19PUEVOID0gIjwiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NMT1NFID0gIj4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSkgewotCQlOb2RlIG5ld05vZGUgPSBjbGVhbnVwQ2hpbGRyZW4obm9kZSk7Ci0JCUlET01Ob2RlIHJlbmFtZWROb2RlID0gbmV3Tm9kZSBpbnN0YW5jZW9mIElET01Ob2RlID8gKElET01Ob2RlKSBuZXdOb2RlIDogbnVsbDsKLQotCQkvLyBjYWxsIHF1b3RlQXR0clZhbHVlKCkgZmlyc3Qgc28gaXQgd2lsbCBjbG9zZSBhbnkgdW5jbG9zZWQgYXR0cgotCQkvLyBxdW90ZUF0dHJWYWx1ZSgpIHdpbGwgcmV0dXJuIHRoZSBuZXcgc3RhcnQgdGFnIGlmIHRoZXJlIGlzIGEKLQkJLy8gc3RydWN0dXJlIGNoYW5nZQotCQlyZW5hbWVkTm9kZSA9IHF1b3RlQXR0clZhbHVlKHJlbmFtZWROb2RlKTsKLQotCQkvLyBpbnNlcnQgdGFnIGNsb3NlIGlmIG1pc3NpbmcKLQkJLy8gaWYgbm9kZSBpcyBub3QgY29tbWVudCB0YWcKLQkJLy8gYW5kIG5vdCBpbXBsaWNpdCB0YWcKLQkJaWYgKCFpc0NvbW1lbnRUYWcocmVuYW1lZE5vZGUpICYmICFpc0ltcGxpY2l0VGFnKHJlbmFtZWROb2RlKSkgewotCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IHJlbmFtZWROb2RlLmdldE1vZGVsKCk7Ci0KLQkJCS8vIHNhdmUgc3RhcnQgb2Zmc2V0IGJlZm9yZSBpbnNlcnRUYWdDbG9zZSgpCi0JCQkvLyBvciBlbHNlIHJlbmFtZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgd2lsbCBiZSB6ZXJvIGlmCi0JCQkvLyByZW5hbWVkTm9kZSByZXBsYWNlZCBieSBpbnNlcnRUYWdDbG9zZSgpCi0JCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IHJlbmFtZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCS8vIGZvciBzdGFydCB0YWcKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSByZW5hbWVkTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaW5zZXJ0VGFnQ2xvc2Uoc3RydWN0dXJlZE1vZGVsLCBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJCS8vIHVwZGF0ZSByZW5hbWVkTm9kZSBhbmQgc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYWZ0ZXIKLQkJCS8vIGluc2VydFRhZ0Nsb3NlKCkKLQkJCXJlbmFtZWROb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsKLQkJCXN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gcmVuYW1lZE5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkJLy8gZm9yIGVuZCB0YWcKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gcmVuYW1lZE5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCWluc2VydFRhZ0Nsb3NlKHN0cnVjdHVyZWRNb2RlbCwgZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCi0JCS8vIGNhbGwgaW5zZXJ0TWlzc2luZ1RhZ3MoKSBuZXh0LCBpdCB3aWxsIGdlbmVyYXRlIGltcGxpY2l0IHRhZ3MgaWYKLQkJLy8gdGhlcmUgYXJlIGFueQotCQkvLyBpbnNlcnRNaXNzaW5nVGFncygpIHdpbGwgcmV0dXJuIHRoZSBuZXcgbWlzc2luZyBzdGFydCB0YWcgaWYgb25lIGlzCi0JCS8vIG1pc3NpbmcKLQkJcmVuYW1lZE5vZGUgPSBpbnNlcnRNaXNzaW5nVGFncyhyZW5hbWVkTm9kZSk7Ci0KLQkJcmVuYW1lZE5vZGUgPSBjb21wcmVzc0VtcHR5RWxlbWVudFRhZyhyZW5hbWVkTm9kZSk7Ci0KLQkJcmVuYW1lZE5vZGUgPSBpbnNlcnRSZXF1aXJlZEF0dHJzKHJlbmFtZWROb2RlKTsKLQotCQlyZXR1cm4gcmVuYW1lZE5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgY2xlYW51cENoaWxkcmVuKE5vZGUgbm9kZSkgewotCQlOb2RlIHBhcmVudE5vZGUgPSBub2RlOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCU5vZGUgY2hpbGROb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAoY2hpbGROb2RlICE9IG51bGwpIHsKLQkJCQkvLyBnZXQgY2xlYW51cCBoYW5kbGVyCi0JCQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjbGVhbnVwSGFuZGxlciA9IGdldENsZWFudXBIYW5kbGVyKGNoaWxkTm9kZSk7Ci0KLQkJCQkvLyBjbGVhbnVwIGVhY2ggY2hpbGQKLQkJCQljaGlsZE5vZGUgPSBjbGVhbnVwSGFuZGxlci5jbGVhbnVwKGNoaWxkTm9kZSk7Ci0KLQkJCQkvLyBnZXQgbmV3IHBhcmVudCBub2RlCi0JCQkJcGFyZW50Tm9kZSA9IGNoaWxkTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQkvLyBnZXQgbmV4dCBjaGlsZCBub2RlCi0JCQkJY2hpbGROb2RlID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50Tm9kZTsKLQl9Ci0KLQlwcml2YXRlIElET01Ob2RlIGNvbXByZXNzRW1wdHlFbGVtZW50VGFnKElET01Ob2RlIG5vZGUpIHsKLQkJYm9vbGVhbiBjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MgPSBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKS5nZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MoKTsKLQkJSURPTU5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXdOb2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQlpZiAoY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzICYmIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAmJiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJLy8gZm9ybWF0IGNoaWxkcmVuIGFuZCBlbmQgdGFnIGlmIG5vdCBlbXB0eSBlbGVtZW50IHRhZwotCQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBuZXdOb2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCQlpZiAoY2hpbGROb2RlcyA9PSBudWxsIHx8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCB8fCAoY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSA9PSAxICYmIChjaGlsZE5vZGVzLml0ZW0oMCkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgKChjaGlsZE5vZGVzLml0ZW0oMCkpLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkpIHsKLQkJCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5ld05vZGUuZ2V0TW9kZWwoKTsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJCQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBuZXdOb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWludCBvZmZzZXQgPSBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJaW50IGxlbmd0aCA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsgLy8gc2F2ZQotCi0JCQkJCW9mZnNldCA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCkgKyBsYXN0UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgMCwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsgLy8gc2F2ZQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGdldENsZWFudXBIYW5kbGVyKE5vZGUgbm9kZSkgewotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjbGVhbnVwSGFuZGxlciA9IG51bGw7Ci0JCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCWNhc2Ugb3JnLnczYy5kb20uTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJY2xlYW51cEhhbmRsZXIgPSBuZXcgRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBvcmcudzNjLmRvbS5Ob2RlLlRFWFRfTk9ERSA6IHsKLQkJCQljbGVhbnVwSGFuZGxlciA9IG5ldyBOb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJY2xlYW51cEhhbmRsZXIgPSBuZXcgTm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbml0IENsZWFudXBQcmVmZXJlbmNlcwotCQljbGVhbnVwSGFuZGxlci5zZXRDbGVhbnVwUHJlZmVyZW5jZXMoZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkpOwotCi0JCXJldHVybiBjbGVhbnVwSGFuZGxlcjsKLQl9Ci0KLQotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlyZXR1cm4gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoRG9jdW1lbnQpIG5vZGUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVxdWlyZWRBdHRycyhOb2RlIG5vZGUpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gZ2V0TW9kZWxRdWVyeShub2RlKTsKLQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJQ01OYW1lZE5vZGVNYXAgYXR0ck1hcCA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlJdGVyYXRvciBpdCA9IGF0dHJNYXAuaXRlcmF0b3IoKTsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBudWxsOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJYXR0ciA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChhdHRyLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCQkJcmVzdWx0LmFkZChhdHRyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBpbnNlcnRFbmRUYWcoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm4gbm9kZTsgLy8gZG8gbm90aGluZwotCi0JCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCi0JCWlmIChpc0VtcHR5RWxlbWVudChlbGVtZW50KSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGxhc3RSZWdpb24pLCBsYXN0UmVnaW9uLmdldExlbmd0aCgpLCBFTVBUWV9UQUdfQ0xPU0UpOwotCi0JCQlpZiAocmVnaW9ucy5zaXplKCkgPiAxKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uQmVmb3JlVGFnQ2xvc2UgPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEgLSAxKTsKLQotCQkJCS8vIGluc2VydCBhIHNwYWNlIHNlcGFyYXRvciBiZWZvcmUgdGFnIGNsb3NlIGlmIHRoZSBwcmV2aW91cwotCQkJCS8vIHJlZ2lvbiBkb2VzIG5vdCBoYXZlIGV4dHJhIHNwYWNlcwotCQkJCWlmIChyZWdpb25CZWZvcmVUYWdDbG9zZS5nZXRUZXh0TGVuZ3RoKCkgPT0gcmVnaW9uQmVmb3JlVGFnQ2xvc2UuZ2V0TGVuZ3RoKCkpCi0JCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGxhc3RSZWdpb24pLCAwLCAiICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCVN0cmluZyBlbmRUYWcgPSBFTkRfVEFHX09QRU4uY29uY2F0KHRhZ05hbWUpLmNvbmNhdChUQUdfQ0xPU0UpOwotCi0JCQlJRE9NTm9kZSBsYXN0Q2hpbGQgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCQlpbnQgZW5kVGFnU3RhcnRPZmZzZXQgPSAwOwotCQkJaWYgKGxhc3RDaGlsZCAhPSBudWxsKQotCQkJCS8vIGlmIHRoaXMgbm9kZSBoYXMgY2hpbGRyZW4sIGluc2VydCB0aGUgZW5kIHRhZyBhZnRlciB0aGUKLQkJCQkvLyBsYXN0IGNoaWxkCi0JCQkJZW5kVGFnU3RhcnRPZmZzZXQgPSBsYXN0Q2hpbGQuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQllbHNlCi0JCQkJLy8gaWYgdGhpcyBub2RlIGRvZXMgbm90IGhhcyBjaGlsZHJlbiwgaW5zZXJ0IHRoZSBlbmQgdGFnCi0JCQkJLy8gYWZ0ZXIgdGhlIHN0YXJ0IHRhZwotCQkJCWVuZFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBlbmRUYWdTdGFydE9mZnNldCwgMCwgZW5kVGFnKTsKLQkJfQotCi0JCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCS8vIG5ldwotCQkvLyBub2RlCi0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBpbnNlcnRNaXNzaW5nVGFncyhJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gaW5zZXJ0TWlzc2luZ1RhZ3MgPSBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKS5nZXRJbnNlcnRNaXNzaW5nVGFncygpOwotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlpZiAoaW5zZXJ0TWlzc2luZ1RhZ3MpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCS8vIGltcGxpY2l0IHN0YXJ0IHRhZzsgZ2VuZXJhdGUgdGFnIGZvciBpdAotCQkJCW5ld05vZGUgPSBpbnNlcnRTdGFydFRhZyhub2RlKTsKLQkJCQlzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXdOb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJSVRleHRSZWdpb25MaXN0IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uUmVnaW9ucyA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsICYmIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uUmVnaW9ucyAhPSBudWxsICYmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblJlZ2lvbnMuZ2V0KHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uUmVnaW9ucy5zaXplKCkgLSAxKSkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCi0JCQl9IGVsc2UgewotCQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIHN0YXJ0IHRhZyBtaXNzaW5nCi0JCQkJCWlmIChpc1N0YXJ0VGFnUmVxdWlyZWQobmV3Tm9kZSkpCi0JCQkJCQluZXdOb2RlID0gaW5zZXJ0U3RhcnRUYWcobmV3Tm9kZSk7Ci0JCQkJfSBlbHNlIGlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCQkvLyBlbmQgdGFnIG1pc3NpbmcKLQkJCQkJaWYgKGlzRW5kVGFnUmVxdWlyZWQobmV3Tm9kZSkpCi0JCQkJCQluZXdOb2RlID0gaW5zZXJ0RW5kVGFnKG5ld05vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByaXZhdGUgSURPTU5vZGUgaW5zZXJ0UmVxdWlyZWRBdHRycyhJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gaW5zZXJ0UmVxdWlyZWRBdHRycyA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldEluc2VydFJlcXVpcmVkQXR0cnMoKTsKLQkJSURPTU5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0KLQkJaWYgKGluc2VydFJlcXVpcmVkQXR0cnMpIHsKLQkJCUxpc3QgcmVxdWlyZWRBdHRycyA9IGdldFJlcXVpcmVkQXR0cnMobmV3Tm9kZSk7Ci0JCQlpZiAocmVxdWlyZWRBdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJTmFtZWROb2RlTWFwIGN1cnJlbnRBdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCUxpc3QgaW5zZXJ0QXR0cnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGN1cnJlbnRBdHRycy5nZXRMZW5ndGgoKSA9PSAwKQotCQkJCQlpbnNlcnRBdHRycy5hZGRBbGwocmVxdWlyZWRBdHRycyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWlyZWRBdHRycy5zaXplKCk7IGkrKykgewotCQkJCQkJU3RyaW5nIHJlcXVpcmVkQXR0ck5hbWUgPSAoKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIHJlcXVpcmVkQXR0cnMuZ2V0KGkpKS5nZXRBdHRyTmFtZSgpOwotCQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjdXJyZW50QXR0cnMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJCVN0cmluZyBjdXJyZW50QXR0ck5hbWUgPSBjdXJyZW50QXR0cnMuaXRlbShqKS5nZXROb2RlTmFtZSgpOwotCQkJCQkJCWlmIChyZXF1aXJlZEF0dHJOYW1lLmNvbXBhcmVUb0lnbm9yZUNhc2UoY3VycmVudEF0dHJOYW1lKSA9PSAwKSB7Ci0JCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKCFmb3VuZCkKLQkJCQkJCQlpbnNlcnRBdHRycy5hZGQocmVxdWlyZWRBdHRycy5nZXQoaSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChpbnNlcnRBdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXdOb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWludCBpbmRleCA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGFzdFJlZ2lvbigpOwotCQkJCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQkJCQlpbmRleC0tOwotCQkJCQkJbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4IC0gMSk7Ci0JCQkJCX0gZWxzZSBpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJCQlpbmRleCA9IGluZGV4IC0gMjsKLQkJCQkJCWxhc3RSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbmRleCAtIDEpOwotCQkJCQl9Ci0JCQkJCU11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmb3IgKGludCBpID0gaW5zZXJ0QXR0cnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGluc2VydEF0dHJzLmdldChpKTsKLQkJCQkJCQlTdHJpbmcgcmVxdWlyZWRBdHRyaWJ1dGVOYW1lID0gYXR0ckRlY2wuZ2V0QXR0ck5hbWUoKTsKLQkJCQkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gYXR0ckRlY2wuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQkJCQkJaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKQotCQkJCQkJCQlkZWZhdWx0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBuYW1lQW5kRGVmYXVsdFZhbHVlID0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKGkgPT0gMCAmJiBsYXN0UmVnaW9uLmdldExlbmd0aCgpID4gbGFzdFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpCi0JCQkJCQkJCW5hbWVBbmREZWZhdWx0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW5hbWVBbmREZWZhdWx0VmFsdWUgKz0gcmVxdWlyZWRBdHRyaWJ1dGVOYW1lICsgIj1cIiIgKyBkZWZhdWx0VmFsdWUgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQltdWx0aVRleHRFZGl0LmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KGluZGV4LCBuYW1lQW5kRGVmYXVsdFZhbHVlKSk7Ci0JCQkJCQkJLy8gQlVHMzM4MTogTXVsdGlUZXh0RWRpdCBhcHBsaWVzIGFsbCBjaGlsZAotCQkJCQkJCS8vIFRleHRFZGl0J3MgYmFzaW5nIG9uIG9mZnNldHMKLQkJCQkJCQkvLyAgICAgICAgICBpbiB0aGUgZG9jdW1lbnQgYmVmb3JlIHRoZSBmaXJzdCBUZXh0RWRpdCwgbm90Ci0JCQkJCQkJLy8gYWZ0ZXIgZWFjaAotCQkJCQkJCS8vICAgICAgICAgIGNoaWxkIFRleHRFZGl0LiBUaGVyZWZvcmUsIGRvIG5vdCBuZWVkIHRvCi0JCQkJCQkJLy8gYWR2YW5jZSB0aGUgaW5kZXguCi0JCQkJCQkJLy9pbmRleCArPSBuYW1lQW5kRGVmYXVsdFZhbHVlLmxlbmd0aCgpOwotCQkJCQkJfQotCQkJCQkJbXVsdGlUZXh0RWRpdC5hcHBseShuZXdOb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByaXZhdGUgSURPTU5vZGUgaW5zZXJ0U3RhcnRUYWcoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlpZiAoaXNDb21tZW50VGFnKG5vZGUpKQotCQkJcmV0dXJuIG5vZGU7IC8vIGRvIG5vdGhpbmcKLQotCQlTdHJpbmcgdGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJU3RyaW5nIHN0YXJ0VGFnID0gU1RBUlRfVEFHX09QRU4uY29uY2F0KHRhZ05hbWUpLmNvbmNhdChUQUdfQ0xPU0UpOwotCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnRUYWdTdGFydE9mZnNldCwgMCwgc3RhcnRUYWcpOwotCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsgLy8gc2F2ZQotCQkvLyBuZXcKLQkJLy8gbm9kZQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnNlcnRUYWdDbG9zZShJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgZmxhdG5vZGVSZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJaWYgKGZsYXRub2RlUmVnaW9ucyAhPSBudWxsKSB7Ci0JCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IGZsYXRub2RlUmVnaW9ucy5nZXQoZmxhdG5vZGVSZWdpb25zLnNpemUoKSAtIDEpOwotCQkJCWlmIChsYXN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBsYXN0UmVnaW9uLmdldFR5cGUoKTsKLQkJCQkJaWYgKChyZWdpb25UeXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgJiYgKHJlZ2lvblR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSkgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJCQkJCS8vIGluc2VydCAiPiIgYWZ0ZXIgbGFzdFJlZ2lvbiBvZiBmbGF0Tm9kZQotCQkJCQkJLy8gYXMgaW4gIjxhPC9hPiIgaWYgZmxhdE5vZGUgaXMgZm9yIHN0YXJ0IHRhZywgb3IgaW4KLQkJCQkJCS8vICI8YT48L2EiIGlmIGZsYXROb2RlIGlzIGZvciBlbmQgdGFnCi0JCQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBmbGF0Tm9kZS5nZXRUZXh0RW5kT2Zmc2V0KGxhc3RSZWdpb24pLCAwLCAiPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVuYW1lZE5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudFRhZyhOb2RlIHJlbmFtZWROb2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChyZW5hbWVkTm9kZSBpbnN0YW5jZW9mIElET01FbGVtZW50KSB7Ci0JCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSByZW5hbWVkTm9kZTsKLQkJCXJlc3VsdCA9IGVsZW1lbnQuaXNDb21tZW50VGFnKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eUVsZW1lbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCS8vIHVuZGVmaW5lZCB0YWcsIHJldHVybiBkZWZhdWx0Ci0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2N1bWVudCk7Ci0JCWlmIChtb2RlbFF1ZXJ5ID09IG51bGwpCi0JCQkvLyB1bmRlZmluZWQgdGFnLCByZXR1cm4gZGVmYXVsdAotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJLy8gdW5kZWZpbmVkIHRhZywgcmV0dXJuIGRlZmF1bHQKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5kVGFnUmVxdWlyZWQoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gbm9kZS5pc0NvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIEEgdGFnIGlzIGltcGxpY2l0IGlmIGl0IGhhcyBub3QgY29ycmVzcG9uZGluZyByZWdpb24gaW4gZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlbmFtZWROb2RlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ltcGxpY2l0VGFnKElET01Ob2RlIHJlbmFtZWROb2RlKSB7Ci0JCXJldHVybiByZW5hbWVkTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIGVuZCB0YWdzIG9mIEhUTUwgRU1QVFkgY29udGVudCB0eXBlLCBzdWNoIGFzIElNRywgYW5kIEhUTUwKLQkgKiB1bmRlZmluZWQgdGFncyBhcmUgcGFyc2VkIHNlcGFyYXRlbHkgZnJvbSB0aGUgc3RhcnQgdGFncy4gU28gaW5zZXJ0aW5nCi0JICogdGhlIG1pc3Npbmcgc3RhcnQgdGFnIGlzIHVzZWxlc3MgYW5kIGV2ZW4gaGFybWZ1bC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNTdGFydFRhZ1JlcXVpcmVkKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG5vZGUuaXNDb250YWluZXIoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxUeXBlKElET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXREb2N1bWVudCgpOwotCi0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkb2N1bWVudC5pc1hNTFR5cGUoKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBxdW90ZUF0dHJWYWx1ZShJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCQkvL1hNTEVsZW1lbnQgZWxlbWVudCA9IChYTUxFbGVtZW50KSBub2RlOwotCQlpZiAoaXNDb21tZW50VGFnKG5vZGUpKQotCQkJcmV0dXJuIG5vZGU7IC8vIGRvIG5vdGhpbmcKLQotCQlib29sZWFuIHF1b3RlQXR0clZhbHVlcyA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldFF1b3RlQXR0clZhbHVlcygpOwotCi0JCWlmIChxdW90ZUF0dHJWYWx1ZXMpIHsKLQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbmV3Tm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQkJaW50IGF0dHJpYnV0ZXNMZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQkJCUlTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbm9kZS5nZXRNb2RlbCgpLmdldEdlbmVyYXRvcigpOwotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzTGVuZ3RoOyBpKyspIHsKLQkJCQkJYXR0cmlidXRlcyA9IG5ld05vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCQlhdHRyaWJ1dGVzTGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJCQkJSURPTUF0dHIgZWFjaEF0dHIgPSAoSURPTUF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQkJLy9JVGV4dFJlZ2lvbiBvbGRBdHRyVmFsdWVSZWdpb24gPQotCQkJCQkvLyBlYWNoQXR0ci5nZXRWYWx1ZVJlZ2lvbigpOwotCQkJCQlTdHJpbmcgb2xkQXR0clZhbHVlID0gZWFjaEF0dHIuZ2V0VmFsdWVSZWdpb25UZXh0KCk7Ci0JCQkJCWlmIChvbGRBdHRyVmFsdWUgPT0gbnVsbCkgewotCQkJCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJCQkJCWlmIChpc1hNTFR5cGUoc3RydWN0dXJlZE1vZGVsKSkgewotCQkJCQkJCVN0cmluZyBuZXdBdHRyVmFsdWUgPSAiXCIiICsgZWFjaEF0dHIuZ2V0TmFtZVJlZ2lvblRleHQoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCQkJaWYgKGVhY2hBdHRyLmdldEVxdWFsUmVnaW9uKCkgIT0gbnVsbCkKLQkJCQkJCQkJLy8gZXF1YWwgcmVnaW9uIGV4aXN0cwotCQkJCQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBlYWNoQXR0ci5nZXRFbmRPZmZzZXQoKSwgMCwgbmV3QXR0clZhbHVlKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCS8vIG5vIGVxdWFsIHJlZ2lvbgotCQkJCQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBlYWNoQXR0ci5nZXROYW1lUmVnaW9uVGV4dEVuZE9mZnNldCgpLCAwLCAiPSIuY29uY2F0KG5ld0F0dHJWYWx1ZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24obm9kZS5nZXRTdGFydE9mZnNldCgpKTsgLy8gc2F2ZQotCQkJCQkJCS8vIG5ldwotCQkJCQkJCS8vIG5vZGUKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vU3RyaW5nIG9sZEF0dHJWYWx1ZSA9IG9sZEF0dHJWYWx1ZVJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQkJCQljaGFyIHF1b3RlID0gU3RyaW5nVXRpbHMuaXNRdW90ZWQob2xkQXR0clZhbHVlKSA/IG9sZEF0dHJWYWx1ZS5jaGFyQXQoMCkgOiBET1VCTEVfUVVPVEU7Ci0JCQkJCQlTdHJpbmcgbmV3QXR0clZhbHVlID0gZ2VuZXJhdG9yLmdlbmVyYXRlQXR0clZhbHVlKGVhY2hBdHRyLCBxdW90ZSk7Ci0KLQkJCQkJCS8vIFRoZXJlIGlzIGEgcHJvYmxlbSBpbgotCQkJCQkJLy8gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUoSVRleHRSZWdpb24pCi0JCQkJCQkvLyB3aGVuIHRoZSByZWdpb24gaXMgaW5zdGFuY2VvZiBDb250ZXh0UmVnaW9uLgotCQkJCQkJLy8gV29ya2Fyb3VuZCBmb3Igbm93Li4uCi0JCQkJCQlpZiAob2xkQXR0clZhbHVlLmxlbmd0aCgpID09IDEpIHsKLQkJCQkJCQljaGFyIGZpcnN0Q2hhciA9IG9sZEF0dHJWYWx1ZS5jaGFyQXQoMCk7Ci0JCQkJCQkJaWYgKGZpcnN0Q2hhciA9PSBTSU5HTEVfUVVPVEUpCi0JCQkJCQkJCW5ld0F0dHJWYWx1ZSA9IFNJTkdMRV9RVU9URVM7Ci0JCQkJCQkJZWxzZSBpZiAoZmlyc3RDaGFyID09IERPVUJMRV9RVU9URSkKLQkJCQkJCQkJbmV3QXR0clZhbHVlID0gRE9VQkxFX1FVT1RFUzsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKG5ld0F0dHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKG5ld0F0dHJWYWx1ZS5jb21wYXJlVG8ob2xkQXR0clZhbHVlKSAhPSAwKSB7Ci0JCQkJCQkJCWludCBhdHRyVmFsdWVTdGFydE9mZnNldCA9IGVhY2hBdHRyLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCQkJCQkJaW50IGF0dHJWYWx1ZUxlbmd0aCA9IG9sZEF0dHJWYWx1ZS5sZW5ndGgoKTsKLQkJCQkJCQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCQkJCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGF0dHJWYWx1ZVN0YXJ0T2Zmc2V0LCBhdHRyVmFsdWVMZW5ndGgsIG5ld0F0dHJWYWx1ZSk7Ci0JCQkJCQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCQkJCQkJCS8vIG5ldwotCQkJCQkJCQkvLyBub2RlCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL05vZGVDbGVhbnVwSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL05vZGVDbGVhbnVwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWMyMDk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9Ob2RlQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLlN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgTm9kZUNsZWFudXBIYW5kbGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciB7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZkNsZWFudXBQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQotCXB1YmxpYyBOb2RlIGNsZWFudXAoTm9kZSBub2RlKSB7Ci0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGdldENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZDbGVhbnVwUHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzKCk7Ci0KLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRJbnNlcnRSZXF1aXJlZEF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydE1pc3NpbmdUYWdzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRRdW90ZUF0dHJWYWx1ZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRGb3JtYXRTb3VyY2UocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbnZlcnRFT0xDb2RlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEVPTENvZGUocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsZWFudXBQcmVmZXJlbmNlcyhJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBjbGVhbnVwUHJlZmVyZW5jZXMpIHsKLQotCQlmQ2xlYW51cFByZWZlcmVuY2VzID0gY2xlYW51cFByZWZlcmVuY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9YTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvWE1MQ2xlYW51cFByZWZlcmVuY2VzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzNjNDg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9YTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MUHJlZmVyZW5jZU5hbWVzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHJlbmFtZWQgdG8gU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcwotICogCi0gKiBUT0RPIHdpbGwgZGVsZXRlIGluIEM1Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFhNTENsZWFudXBQcmVmZXJlbmNlc0ltcGwgZkluc3RhbmNlOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWE1MQ2xlYW51cFByZWZlcmVuY2VzSW1wbCBnZXRJbnN0YW5jZSgpIHsKLQotCQkvLyBhZGRlZCBmb3Igb25lIG1ldGhvZCBpbiBDbGVhbnVwRGlhbG9nIC4uLiBtYXkgYmUgYmV0dGVyIHdheQotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBYTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIGludCBmQXR0ck5hbWVDYXNlOwotCXByaXZhdGUgYm9vbGVhbiBmQ29udmVydEVPTENvZGVzOwotCXByaXZhdGUgU3RyaW5nIGZFT0xDb2RlOwotCXByaXZhdGUgYm9vbGVhbiBmRm9ybWF0U291cmNlOwotCXByaXZhdGUgYm9vbGVhbiBmSW5zZXJ0TWlzc2luZ1RhZ3M7Ci0JLy8gcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGZQcmVmZXJlbmNlU3RvcmUgPSBudWxsOwotCXByaXZhdGUgUHJlZmVyZW5jZXMgZlByZWZlcmVuY2VzID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZlF1b3RlQXR0clZhbHVlczsKLQlwcml2YXRlIGludCBmVGFnTmFtZUNhc2U7Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJOYW1lQ2FzZSgpIHsKLQotCQlyZXR1cm4gZkF0dHJOYW1lQ2FzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDb252ZXJ0RU9MQ29kZXMoKSB7Ci0KLQkJcmV0dXJuIGZDb252ZXJ0RU9MQ29kZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFT0xDb2RlKCkgewotCi0JCXJldHVybiBmRU9MQ29kZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRGb3JtYXRTb3VyY2UoKSB7Ci0KLQkJcmV0dXJuIGZGb3JtYXRTb3VyY2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0SW5zZXJ0TWlzc2luZ1RhZ3MoKSB7Ci0KLQkJcmV0dXJuIGZJbnNlcnRNaXNzaW5nVGFnczsKLQl9Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7Ci0KLQkJaWYgKGZQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmUHJlZmVyZW5jZXMgPSBTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQl9Ci0JCXJldHVybiBmUHJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0UXVvdGVBdHRyVmFsdWVzKCkgewotCi0JCXJldHVybiBmUXVvdGVBdHRyVmFsdWVzOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGFnTmFtZUNhc2UoKSB7Ci0KLQkJcmV0dXJuIGZUYWdOYW1lQ2FzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyTmFtZUNhc2UoaW50IGF0dHJOYW1lQ2FzZSkgewotCi0JCWZBdHRyTmFtZUNhc2UgPSBhdHRyTmFtZUNhc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udmVydEVPTENvZGVzKGJvb2xlYW4gY29udmVydEVPTENvZGVzKSB7Ci0KLQkJZkNvbnZlcnRFT0xDb2RlcyA9IGNvbnZlcnRFT0xDb2RlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFT0xDb2RlKFN0cmluZyBFT0xDb2RlKSB7Ci0KLQkJZkVPTENvZGUgPSBFT0xDb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvcm1hdFNvdXJjZShib29sZWFuIGZvcm1hdFNvdXJjZSkgewotCi0JCWZGb3JtYXRTb3VyY2UgPSBmb3JtYXRTb3VyY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0TWlzc2luZ1RhZ3MoYm9vbGVhbiBpbnNlcnRNaXNzaW5nVGFncykgewotCi0JCWZJbnNlcnRNaXNzaW5nVGFncyA9IGluc2VydE1pc3NpbmdUYWdzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZWZlcmVuY2VzKFByZWZlcmVuY2VzIHByZWZzKSB7Ci0KLQkJZlByZWZlcmVuY2VzID0gcHJlZnM7Ci0JCXVwZGF0ZU9wdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRRdW90ZUF0dHJWYWx1ZXMoYm9vbGVhbiBxdW90ZUF0dHJWYWx1ZXMpIHsKLQotCQlmUXVvdGVBdHRyVmFsdWVzID0gcXVvdGVBdHRyVmFsdWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhZ05hbWVDYXNlKGludCB0YWdOYW1lQ2FzZSkgewotCi0JCWZUYWdOYW1lQ2FzZSA9IHRhZ05hbWVDYXNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU9wdGlvbnMoKSB7Ci0KLQkJUHJlZmVyZW5jZXMgcCA9IGdldFByZWZlcmVuY2VzKCk7Ci0JCWZUYWdOYW1lQ2FzZSA9IHAuZ2V0SW50KElYTUxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFKTsKLQkJZkF0dHJOYW1lQ2FzZSA9IHAuZ2V0SW50KElYTUxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9BVFRSX05BTUVfQ0FTRSk7Ci0JCWZJbnNlcnRNaXNzaW5nVGFncyA9IHAuZ2V0Qm9vbGVhbihJWE1MUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MpOwotCQlmUXVvdGVBdHRyVmFsdWVzID0gcC5nZXRCb29sZWFuKElYTUxQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMpOwotCQlmRm9ybWF0U291cmNlID0gcC5nZXRCb29sZWFuKElYTUxQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSk7Ci0JCWZDb252ZXJ0RU9MQ29kZXMgPSBwLmdldEJvb2xlYW4oSVhNTFByZWZlcmVuY2VOYW1lcy5DT05WRVJUX0VPTF9DT0RFUyk7Ci0JCWZFT0xDb2RlID0gcC5nZXRTdHJpbmcoSVhNTFByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L0NvbW1lbnRFbGVtZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9Db21tZW50RWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2YWY1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L0NvbW1lbnRFbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGwuQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5UYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENvbW1lbnRFbGVtZW50QWRhcHRlciBpbXBsZW1lbnRzIFRhZ0FkYXB0ZXIgewotCXByaXZhdGUgQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uIGZDb25maWd1cmF0aW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIGZFbmRUYWc7Ci0JcHJpdmF0ZSBDb21tZW50RWxlbWVudEhhbmRsZXIgZkhhbmRsZXI7Ci0KLQlwdWJsaWMgQ29tbWVudEVsZW1lbnRBZGFwdGVyKGJvb2xlYW4gaXNFbmRUYWcsIENvbW1lbnRFbGVtZW50SGFuZGxlciBoYW5kbGVyKSB7Ci0JCWZFbmRUYWcgPSBpc0VuZFRhZzsKLQkJZkhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdlbmVyYXRlQ29tbWVudENsb3NlKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChlbGVtZW50LmlzSlNQVGFnKCkpID8gIi0tJT4iIDogIi0tPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdlbmVyYXRlQ29tbWVudE9wZW4oSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gKGVsZW1lbnQuaXNKU1BUYWcoKSkgPyAiPCUtLSIgOiAiPCEtLSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByaXZhdGUgQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBmQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuZFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBjb250ZW50ID0gZkhhbmRsZXIuZ2VuZXJhdGVFbmRUYWdDb250ZW50KGVsZW1lbnQpOwotCQlpZiAoY29udGVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJ1ZmZlci5hcHBlbmQoZ2VuZXJhdGVDb21tZW50T3BlbihlbGVtZW50KSk7Ci0JCWJ1ZmZlci5hcHBlbmQoY29udGVudCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2VuZXJhdGVDb21tZW50Q2xvc2UoZWxlbWVudCkpOwotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhhbmRsZXJJRCgpIHsKLQkJcmV0dXJuIGdldENvbmZpZ3VyYXRpb24oKS5nZXRIYW5kbGVySUQoKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eShuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXJ0VGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGNvbnRlbnQgPSBmSGFuZGxlci5nZW5lcmF0ZVN0YXJ0VGFnQ29udGVudChlbGVtZW50KTsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlidWZmZXIuYXBwZW5kKGdlbmVyYXRlQ29tbWVudE9wZW4oZWxlbWVudCkpOwotCQlidWZmZXIuYXBwZW5kKGNvbnRlbnQpOwotCQlidWZmZXIuYXBwZW5kKGdlbmVyYXRlQ29tbWVudENsb3NlKGVsZW1lbnQpKTsKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ29tbWVudEVsZW1lbnRBZGFwdGVyLmNsYXNzIHx8IHR5cGUgPT0gVGFnQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7Ci0JCXJldHVybiAoIWZIYW5kbGVyLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmRUYWcoKSB7Ci0JCXJldHVybiBmRW5kVGFnOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb24oQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJZkNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L0NvbW1lbnRFbGVtZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2U4ZTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tZW50RWxlbWVudEhhbmRsZXIgewotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwcmVmaXggb2YgdGhlIGNvbW1lbnQgY29udGVudCBtYXRjaGVzCi0JICogdGhlIHN0cmluZyBzcGVjaWZpZWQgaW4gJmx0O3N0YXJ0c3dpdGggcHJlZml4PSIiLyZndDsgaW4gcGx1Z2luCi0JICogZXh0ZW5zaW9uLiBDb21tZW50IGNvbnRlbnQgaXMgcGFyc2VkIGFuZCBuZXcgRE9NIGVsZW1lbnQgaXMgY3JlYXRlZCBpbgotCSAqIHRoaXMgbWV0aG9kLiBJbXBsZW1lbnRvciBoYXMgdG8gZG8gZm9sbG93aW5nOgotCSAqIDxsaT5Gb3Igc3RhcnQgdGFnIDoKLQkgKiA8dWw+Ci0JICogPGxpPnBhcnNlIGNvbW1lbnQgY29udGVudCBhbmQgY3JlYXRlIG5ldyBlbGVtZW50IGluc3RhbmNlLjwvbGk+Ci0JICogPC91bD4KLQkgKiA8L2xpPgotCSAqIDxsaT5Gb3IgZW5kIHRhZyA6Ci0JICogPHVsPgotCSAqIDxsaT5wYXJzZSBjb21tZW50IGNvbnRlbnQgYW5kIGNyZWF0ZSBuZXcgZWxlbWVudCBpbnN0YW5jZS48L2xpPgotCSAqIDxsaT5tYWtlIGlzRW5kVGFnIGZsYWcgdHJ1ZS48L2xpPgotCSAqIDxsaT5QYXJzZXIgZnJhbWV3b3JrIHNlYXJjaGVzIG1hY2hlZCBzdGFydCB0YWcgZWxlbWVudCBpbnN0YW5jZSBhZnRlcgotCSAqIHRoaXMgY3JlYXRlRWxlbWVudCBjYWxsLCBhbmQgbmV3IGluc3RhbmNlIGlzIGp1c3QgdGhyb3duIGF3YXkuPC9saT4KLQkgKiA8L3VsPgotCSAqIDwvbGk+Ci0JICogPGxpPkZvciBlbXB0eSB0YWcgOgotCSAqIDx1bD4KLQkgKiA8bGk+cGFyc2UgY29tbWVudCBjb250ZW50IGFuZCBjcmVhdGUgbmV3IGVsZW1lbnQgaW5zdGFuY2UuPC9saT4KLQkgKiA8bGk+bWFrZSBpc0VuZFRhZyBmbGFnIHRydWUuPC9saT4KLQkgKiA8L3VsPgotCSAqIDwvbGk+Ci0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICBwYXJlbnQgRE9NIGRvY3VtZW50Ci0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGNvbW1lbnQgY29udGVudC4gY29tbWVudCBwcmVmaXggKCZsdDshLS0gb3IgJmx0OyUtLSksIHN1ZmZpeAotCSAqICAgICAgICAgICAgKC0tJmd0OyBvciAtLSUmZ3Q7KSwgYW5kIHN1cnJvdW5kaW5nIHNwYWNlcyBhcmUgdHJpbW1lZC4KLQkgKiBAcGFyYW0gaXNKU1BUYWcKLQkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIGNvbW1lbnQgaXMgSlNQIHN0eWxlIGNvbW1lbnQuIFRoaXMgaW5mb3JtYXRpb24KLQkgKiAgICAgICAgICAgIG1heSBiZSByZXF1aXJlZCBieSBoYW5kbGVyIHdoZW4gdGhlIGhhbmRsZXIgYWNjZXB0cyBib3RoIFhNTAotCSAqICAgICAgICAgICAgc3R5bGUgYW5kIEpTUCBzdHlsZSBjb21tZW50IChuYW1lbHksCi0JICogICAgICAgICAgICBjb21tZW50dHlwZT0mcXVvdDtib3RoJnF1b3Q7IGluIHBsdWdpbi54bWwpLgotCSAqIEByZXR1cm4gY29tbWVudCBlbGVtZW50IGluc3RhbmNlIGlmIHRoZSBjb21tZW50IGNvbnRlbnQgaXMgcmlnaHRseQotCSAqICAgICAgICAgcGFyc2VkLiBpZiBwYXJzZSBmYWlsZWQsIHJldHVybnMgbnVsbC4KLQkgKi8KLQlFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyB0aGUgc291cmNlIHRleHQgb2YgdGhlIGVuZCB0YWcgZm9yIHRoZSBwYXNzZWQKLQkgKiBlbGVtZW50LiBEbyBub3QgZ2VuZXJhdGUgY29tbWVudCBwcmVmaXggKCZsdDshLS0gb3IgJmx0OyUtLSkgYW5kIHN1ZmZpeAotCSAqICgtLSZndDsgb3IgLS0lJmd0OykuIFhNTEdlbmVyYXRvciB1c2VzIHRoaXMgbWV0aG9kIHRvIGdlbmVyYXRlIFhNTC9IVE1MCi0JICogc291cmNlIGZvciBhIGNvbW1lbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGNvbW1lbnQgZWxlbWVudAotCSAqIEByZXR1cm4gZ2VuZXJhdGVkIHRhZyBzdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVFbmRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIHRoZSBzb3VyY2UgdGV4dCBvZiB0aGUgc3RhcnQgdGFnIGZvciB0aGUgcGFzc2VkCi0JICogZWxlbWVudC4gRG8gbm90IGdlbmVyYXRlIGNvbW1lbnQgcHJlZml4ICgmbHQ7IS0tIG9yICZsdDslLS0pIGFuZCBzdWZmaXgKLQkgKiAoLS0mZ3Q7IG9yIC0tJSZndDspLiBYTUxHZW5lcmF0b3IgdXNlcyB0aGlzIG1ldGhvZCB0byBnZW5lcmF0ZSBYTUwvSFRNTAotCSAqIHNvdXJjZSBmb3IgYSBjb21tZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tZW50IGVsZW1lbnQKLQkgKiBAcmV0dXJuIGdlbmVyYXRlZCB0YWcgc3RyaW5nCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlU3RhcnRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgY29tbWVudCBlbGVtZW50IG9yIG5vdAotCSAqLwotCWJvb2xlYW4gaXNDb21tZW50RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiB3aGV0aGVyIHRoaXMgZWxlbWVudCBjYW4gaGF2ZSBjaGlsZHJlbiBvciBub3QKLQkgKi8KLQlib29sZWFuIGlzRW1wdHkoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JLy8JU3RyaW5nIGdldEVsZW1lbnRQcmVmaXgoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9CYXNpY0NvbW1lbnRFbGVtZW50SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0Jhc2ljQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZjYyMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0Jhc2ljQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5pbXBsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LnV0aWwuQ29tbWVudEVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC51dGlsLlRhZ1NjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSVNvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotCi0KLS8qKgotICovCi1jbGFzcyBCYXNpY0NvbW1lbnRFbGVtZW50SGFuZGxlciBpbXBsZW1lbnRzIENvbW1lbnRFbGVtZW50SGFuZGxlciB7Ci0KLQlwcml2YXRlIFN0cmluZyBlbGVtZW50TmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eTsKLQotCXB1YmxpYyBCYXNpY0NvbW1lbnRFbGVtZW50SGFuZGxlcihTdHJpbmcgZWxlbWVudE5hbWUsIGJvb2xlYW4gaXNFbXB0eSkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0JCXRoaXMuaXNFbXB0eSA9IGlzRW1wdHk7Ci0JfQotCi0KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZGF0YSwgYm9vbGVhbiBpc0pTUFRhZykgewotCQlFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQlTdHJpbmcgc3RyID0gZGF0YS50cmltKCk7Ci0JCUNvbW1lbnRFbGVtZW50RmFjdG9yeSBmYWN0b3J5ID0gbmV3IENvbW1lbnRFbGVtZW50RmFjdG9yeShkb2N1bWVudCwgaXNKU1BUYWcsIHRoaXMpOwotCQlpZiAoc3RyLmNoYXJBdCgwKSA9PSAnLycpIHsgLy8gZW5kIHRhZwotCQkJVGFnU2Nhbm5lciBzY2FubmVyID0gbmV3IFRhZ1NjYW5uZXIoc3RyLCAxKTsgLy8gc2tpcCAnLycKLQkJCVN0cmluZyBuYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQkJaWYgKG5hbWUuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotCQkJCWVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZShuYW1lLCBDb21tZW50RWxlbWVudEZhY3RvcnkuSVNfRU5EKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gc3RhcnQgdGFnCi0JCQlUYWdTY2FubmVyIHNjYW5uZXIgPSBuZXcgVGFnU2Nhbm5lcihzdHIsIDApOwotCQkJU3RyaW5nIG5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCQlpZiAobmFtZS5lcXVhbHMoZWxlbWVudE5hbWUpKSB7Ci0JCQkJZWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlKG5hbWUsIChpc0VtcHR5KSA/IENvbW1lbnRFbGVtZW50RmFjdG9yeS5JU19FTVBUWSA6IENvbW1lbnRFbGVtZW50RmFjdG9yeS5JU19TVEFSVCk7Ci0JCQkJLy8gc2V0IGF0dHJpYnV0ZXMKLQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCQkJd2hpbGUgKGF0dHJOYW1lICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IHNjYW5uZXIubmV4dFZhbHVlKCk7Ci0JCQkJCUF0dHIgYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0JCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkKLQkJCQkJCQkoKElET01BdHRyKSBhdHRyKS5zZXRWYWx1ZVNvdXJjZShhdHRyVmFsdWUpOwotCQkJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJCQl9Ci0JCQkJCWF0dHJOYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbmRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGlzRW1wdHkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gZWxlbWVudC5nZXRNb2RlbCgpLmdldEdlbmVyYXRvcigpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJ1ZmZlci5hcHBlbmQoIiAvIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHRhZ05hbWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVUYWdOYW1lKGVsZW1lbnQpOwotCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVN0YXJ0VGFnQ29udGVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gZWxlbWVudC5nZXRNb2RlbCgpLmdldEdlbmVyYXRvcigpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVUYWdOYW1lKGVsZW1lbnQpOwotCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQl9Ci0KLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IGxlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHIgYXR0ciA9IChBdHRyKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQlTdHJpbmcgYXR0ck5hbWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVBdHRyTmFtZShhdHRyKTsKLQkJCWlmIChhdHRyTmFtZSAhPSBudWxsKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChhdHRyTmFtZSk7Ci0JCQl9Ci0JCQlTdHJpbmcgYXR0clZhbHVlID0gZ2VuZXJhdG9yLmdlbmVyYXRlQXR0clZhbHVlKGF0dHIpOwotCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJLy8gYXR0ciBuYW1lIG9ubHkgZm9yIEhUTUwgYm9vbGVhbiBhbmQgSlNQCi0JCQkJYnVmZmVyLmFwcGVuZCgnPScpOwotCQkJCWJ1ZmZlci5hcHBlbmQoYXR0clZhbHVlKTsKLQkJCX0KLQkJfQotCi0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb21tZW50RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZ2V0VGFnTmFtZSgpLmVxdWFscyhlbGVtZW50TmFtZSkpID8gdHJ1ZSA6IGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBpc0VtcHR5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9Db21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9Db21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkOTAwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2ltcGwvQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LkNvbW1lbnRFbGVtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbiB7Ci0JcHJpdmF0ZSBNYXAgZkF0dHJpYnV0ZXMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmQ3VzdG9tOwotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZFbGVtZW50ID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBmRW1wdHk7Ci0JcHJpdmF0ZSBDb21tZW50RWxlbWVudEhhbmRsZXIgZkhhbmRsZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZJRCA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZKU1BDb21tZW50OwotCXByaXZhdGUgU3RyaW5nW10gZlByZWZpeCA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZYTUxDb21tZW50OwotCi0JQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCWZFbGVtZW50ID0gZWxlbWVudDsKLQkJZkN1c3RvbSA9ICJoYW5kbGVyLWN1c3RvbSIuZXF1YWxzSWdub3JlQ2FzZShlbGVtZW50LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmaWxsQXR0cmlidXRlcyhlbGVtZW50KTsKLQotCQlmWE1MQ29tbWVudCA9IGZKU1BDb21tZW50ID0gZmFsc2U7Ci0JCVN0cmluZyBjb21tZW50VHlwZSA9IGdldFByb3BlcnR5KCJjb21tZW50dHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmICgieG1sIi5lcXVhbHNJZ25vcmVDYXNlKGNvbW1lbnRUeXBlKSkgeyAvLyROT04tTkxTLTEkCi0JCQlmWE1MQ29tbWVudCA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoImpzcCIuZXF1YWxzSWdub3JlQ2FzZShjb21tZW50VHlwZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJZkpTUENvbW1lbnQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKCJib3RoIi5lcXVhbHNJZ25vcmVDYXNlKGNvbW1lbnRUeXBlKSkgeyAvLyROT04tTkxTLTEkCi0JCQlmWE1MQ29tbWVudCA9IGZKU1BDb21tZW50ID0gdHJ1ZTsKLQkJfQotCQlTdHJpbmcgZW1wdHkgPSBnZXRQcm9wZXJ0eSgiaXNlbXB0eSIpOyAvLyROT04tTkxTLTEkCi0JCWZFbXB0eSA9IEJvb2xlYW4udmFsdWVPZihlbXB0eSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRKU1BDb21tZW50KCkgewotCQlyZXR1cm4gZkpTUENvbW1lbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0WE1MQ29tbWVudCgpIHsKLQkJcmV0dXJuIGZYTUxDb21tZW50OwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKSB7Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIGdldEhhbmRsZXIoKS5jcmVhdGVFbGVtZW50KGRvY3VtZW50LCBkYXRhLCBpc0pTUFRhZyk7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCUNvbW1lbnRFbGVtZW50QWRhcHRlciBhZGFwdGVyID0gKENvbW1lbnRFbGVtZW50QWRhcHRlcikgZWxlbWVudC5nZXRBZGFwdGVyRm9yKENvbW1lbnRFbGVtZW50QWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlci5zZXRDb25maWd1cmF0aW9uKHRoaXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBmaWxsQXR0cmlidXRlcyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZkF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJZkF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9IGVsc2UgewotCQkJZkF0dHJpYnV0ZXMuY2xlYXIoKTsKLQkJfQotCQlTdHJpbmdbXSBuYW1lcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZXMoKTsKLQkJaWYgKG5hbWVzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgbGVuZ3RoID0gbmFtZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOwotCQkJZkF0dHJpYnV0ZXMucHV0KG5hbWUudG9Mb3dlckNhc2UoKSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIENvbW1lbnRFbGVtZW50SGFuZGxlciBnZXRIYW5kbGVyKCkgewotCQlpZiAoZkhhbmRsZXIgPT0gbnVsbCkgewotCQkJaWYgKGZFbGVtZW50ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoaXNDdXN0b20oKSkgewotCQkJCQkJZkhhbmRsZXIgPSAoQ29tbWVudEVsZW1lbnRIYW5kbGVyKSBmRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBnZXRQcm9wZXJ0eSgiZWxlbWVudG5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKGVsZW1lbnROYW1lICE9IG51bGwpIHsKLQkJCQkJCQlmSGFuZGxlciA9IG5ldyBCYXNpY0NvbW1lbnRFbGVtZW50SGFuZGxlcihlbGVtZW50TmFtZSwgZkVtcHR5KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLwkJCQkJKChBYnN0cmFjdENvbW1lbnRFbGVtZW50SGFuZGxlcilmSGFuZGxlcikuc2V0RWxlbWVudFByZWZpeChmRWxlbWVudC5nZXRBdHRyaWJ1dGUoInByZWZpeCIpKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBjYXRjaCBhbmQgbG9nIChhbmQgaWdub3JlKSBBTlkgZXhjZXB0aW9uIGNyZWF0ZWQKLQkJCQkJLy8gYnkgZXhlY3V0YWJsZSBleHRlbnNpb24uCi0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCWZIYW5kbGVyID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZkhhbmRsZXIgPT0gbnVsbCkgewotCQkJCWZIYW5kbGVyID0gbmV3IENvbW1lbnRFbGVtZW50SGFuZGxlcigpIHsKLQkJCQkJcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIFN0cmluZyBnZW5lcmF0ZUVuZFRhZ0NvbnRlbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlU3RhcnRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLS8vIHJlbW92ZWQgaW4gUkMyLCBybyByZW1vdmVkICJ1bnVzZWQiIGVycm9yL3dhcm5pbmcKLS8vCQkJCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRQcmVmaXgoKSB7Ci0vLwkJCQkJCXJldHVybiBudWxsOwotLy8JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0NvbW1lbnRFbGVtZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9Ci0JCXJldHVybiBmSGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhhbmRsZXJJRCgpIHsKLQkJaWYgKGZJRCA9PSBudWxsKSB7Ci0JCQlmSUQgPSBnZXRQcm9wZXJ0eSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGZJRCA9PSBudWxsKSB7Ci0JCQkJaWYgKGlzQ3VzdG9tKCkpIHsKLQkJCQkJZklEID0gZ2V0UHJvcGVydHkoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJYnVmLmFwcGVuZChmRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQkJCWJ1Zi5hcHBlbmQoJy4nKTsKLQkJCQkJYnVmLmFwcGVuZChnZXRQcm9wZXJ0eSgiZWxlbWVudG5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZklEID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmSUQ7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UHJlZml4KCkgewotCQlpZiAoZlByZWZpeCA9PSBudWxsKSB7Ci0JCQlpZiAoZkVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlmIChpc0N1c3RvbSgpKSB7IC8vIGN1c3RvbQotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBwcmVmaXhlcyA9IGZFbGVtZW50LmdldENoaWxkcmVuKCJzdGFydHdpdGgiKTsgLy8kTk9OLU5MUy0xJAkKLQkJCQkJaWYgKHByZWZpeGVzICE9IG51bGwpIHsKLQkJCQkJCUxpc3QgcHJlZml4VmFsdWVzID0gbmV3IEFycmF5TGlzdChwcmVmaXhlcy5sZW5ndGgpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCVN0cmluZyBwcmVmaXggPSBwcmVmaXhlc1tpXS5nZXRBdHRyaWJ1dGUoInByZWZpeCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKHByZWZpeCAhPSBudWxsKSB7Ci0JCQkJCQkJCXByZWZpeFZhbHVlcy5hZGQocHJlZml4KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAibWlzY29uZmlndXJlZCBjb21tZW50IGVsZW1lbnQgaW4iICsgZkVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCksIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0YXJ0d2l0aCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCX0KLQkJCQkJCQkJY2F0Y2ggKEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkvLyBzdGFsZSBidW5kbGU/Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIXByZWZpeFZhbHVlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlmUHJlZml4ID0gKFN0cmluZ1tdKSBwcmVmaXhWYWx1ZXMudG9BcnJheShuZXcgU3RyaW5nW3ByZWZpeFZhbHVlcy5zaXplKCldKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7IC8vIGJhc2ljCi0JCQkJCVN0cmluZyBuYW1lID0gZ2V0UHJvcGVydHkoImVsZW1lbnRuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCQkJaWYgKGlzRW1wdHkoKSkgewotCQkJCQkJCWZQcmVmaXggPSBuZXcgU3RyaW5nWzFdOwotCQkJCQkJCWZQcmVmaXhbMF0gPSBuYW1lOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlmUHJlZml4ID0gbmV3IFN0cmluZ1syXTsKLQkJCQkJCQlmUHJlZml4WzBdID0gbmFtZTsKLQkJCQkJCQlmUHJlZml4WzFdID0gJy8nICsgbmFtZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZlByZWZpeCA9PSBudWxsKSB7Ci0JCQlmUHJlZml4ID0gbmV3IFN0cmluZ1swXTsKLQkJfQotCQlyZXR1cm4gZlByZWZpeDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoZkF0dHJpYnV0ZXMgIT0gbnVsbCkgPyAoU3RyaW5nKSBmQXR0cmlidXRlcy5nZXQobmFtZSkgOiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0N1c3RvbSgpIHsKLQkJcmV0dXJuIGZDdXN0b207Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBmRW1wdHk7Ci0JfQotCi0Jdm9pZCBzZXR1cENvbW1lbnRFbGVtZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJZWxlbWVudC5zZXRDb21tZW50VGFnKHRydWUpOwotCQlDb21tZW50RWxlbWVudEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBDb21tZW50RWxlbWVudEFkYXB0ZXIoZmFsc2UsIGZIYW5kbGVyKTsKLQkJYWRhcHRlci5zZXRDb25maWd1cmF0aW9uKHRoaXMpOwotCQllbGVtZW50LmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0NvbW1lbnRFbGVtZW50UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9Db21tZW50RWxlbWVudFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZDFmNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0NvbW1lbnRFbGVtZW50UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LkNvbW1lbnRFbGVtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tZW50RWxlbWVudFJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgc3RhdGljIENvbW1lbnRFbGVtZW50UmVnaXN0cnkgZkluc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENvbW1lbnRFbGVtZW50UmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENvbW1lbnRFbGVtZW50UmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJjb21tZW50RWxlbWVudEhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb25bXSBmQ29uZmlndXJhdGlvbnMgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDb21tZW50RWxlbWVudFJlZ2lzdHJ5LgotCSAqLwotCXByaXZhdGUgQ29tbWVudEVsZW1lbnRSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uW10gZ2V0Q29uZmlndXJhdGlvbnMoKSB7Ci0JCWlmIChmQ29uZmlndXJhdGlvbnMgPT0gbnVsbCkgewotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmQ29uZmlndXJhdGlvbnMgPSBuZXcgQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uW2VsZW1lbnRzLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlmQ29uZmlndXJhdGlvbnNbaV0gPSBuZXcgQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uKGVsZW1lbnRzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZkNvbmZpZ3VyYXRpb25zID09IG51bGwpIHsKLQkJCQlmQ29uZmlndXJhdGlvbnMgPSBuZXcgQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uWzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiBmQ29uZmlndXJhdGlvbnM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2V0dXBDb21tZW50RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uc1tdID0gZ2V0Q29uZmlndXJhdGlvbnMoKTsKLQkJaW50IGxlbmd0aCA9IGNvbmZpZ3VyYXRpb25zLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uIGNvbmYgPSBjb25maWd1cmF0aW9uc1tpXTsKLQkJCWJvb2xlYW4gaXNKU1AgPSBlbGVtZW50LmlzSlNQVGFnKCk7Ci0JCQlpZiAoaXNKU1AgJiYgY29uZi5hY2NlcHRKU1BDb21tZW50KCkgfHwgIWlzSlNQICYmIGNvbmYuYWNjZXB0WE1MQ29tbWVudCgpKSB7Ci0JCQkJQ29tbWVudEVsZW1lbnRIYW5kbGVyIGhhbmRsZXIgPSBjb25mLmdldEhhbmRsZXIoKTsKLQkJCQlpZiAoaGFuZGxlci5pc0NvbW1lbnRFbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQkJCWNvbmYuc2V0dXBDb21tZW50RWxlbWVudChlbGVtZW50KTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L3V0aWwvQ29tbWVudEVsZW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L3V0aWwvQ29tbWVudEVsZW1lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYzI3YmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC91dGlsL0NvbW1lbnRFbGVtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC51dGlsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LkNvbW1lbnRFbGVtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENvbW1lbnRFbGVtZW50RmFjdG9yeSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVNfRU1QVFkgPSA0ODY2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElTX0VORCA9IDE4MDg7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJU19TVEFSVCA9IDI4MDExOwotCi0JcHJpdmF0ZSBEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBDb21tZW50RWxlbWVudEhhbmRsZXIgZkhhbmRsZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZKU1BUYWc7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29tbWVudEVsZW1lbnRGYWN0b3J5LgotCSAqLwotCXByaXZhdGUgQ29tbWVudEVsZW1lbnRGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDb21tZW50RWxlbWVudEZhY3RvcnkoRG9jdW1lbnQgZG9jdW1lbnQsIGJvb2xlYW4gaXNKU1BUYWcsIENvbW1lbnRFbGVtZW50SGFuZGxlciBoYW5kbGVyKSB7Ci0JCXRoaXMoKTsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZKU1BUYWcgPSBpc0pTUFRhZzsKLQkJZkhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZShTdHJpbmcgbmFtZSwgaW50IG5vZGVUeXBlKSB7Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIGZEb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsZW1lbnQuc2V0Q29tbWVudFRhZyh0cnVlKTsKLQkJaWYgKG5vZGVUeXBlID09IElTX0VNUFRZKSB7Ci0JCQllbGVtZW50LnNldEVtcHR5VGFnKHRydWUpOwotCQl9Ci0JCWVsZW1lbnQuc2V0SlNQVGFnKGZKU1BUYWcpOwotCi0JCUNvbW1lbnRFbGVtZW50QWRhcHRlciBhZGFwdGVyID0gbmV3IENvbW1lbnRFbGVtZW50QWRhcHRlcigobm9kZVR5cGUgPT0gSVNfRU5EKSwgZkhhbmRsZXIpOwotCQllbGVtZW50LmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC91dGlsL1RhZ1NjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvdXRpbC9UYWdTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMGQ0MDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC91dGlsL1RhZ1NjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LnV0aWw7Ci0KLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFRhZ1NjYW5uZXIgewotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VxdWFsKGNoYXIgYykgewotCQlyZXR1cm4gKGMgPT0gJz0nKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUXVvdGUoY2hhciBjKSB7Ci0JCXJldHVybiAoYyA9PSAnIicgfHwgYyA9PSAnXCcnKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3BhY2UoY2hhciBjKSB7Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpOwotCX0KLQotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBpbnQgbWVtT2Zmc2V0ID0gMDsKLQlwcml2YXRlIGludCBvZmZzZXQgPSAwOwotCXByaXZhdGUgYm9vbGVhbiBvbmVMaW5lID0gZmFsc2U7Ci0KLQlwcml2YXRlIFN0cmluZyB0YWcgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIFRhZ1NjYW5uZXIoU3RyaW5nIHRhZywgaW50IG9mZnNldCkgewotCQlzdXBlcigpOwotCi0JCXRoaXMudGFnID0gdGFnOwotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJdGhpcy5tZW1PZmZzZXQgPSAtMTsKLQkJaWYgKHRhZyAhPSBudWxsKQotCQkJdGhpcy5sZW5ndGggPSB0YWcubGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFRhZ1NjYW5uZXIoU3RyaW5nIHRhZywgaW50IG9mZnNldCwgYm9vbGVhbiBvbmVMaW5lKSB7Ci0JCXRoaXModGFnLCBvZmZzZXQpOwotCi0JCXRoaXMub25lTGluZSA9IG9uZUxpbmU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXROZXh0T2Zmc2V0KCkgewotCQlpbnQgaTsKLQkJY2hhciBjOwotCQlmb3IgKGkgPSBvZmZzZXQ7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJYyA9IHRhZy5jaGFyQXQoaSk7Ci0JCQlpZiAoaXNFbmQoYykpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoaXNRdW90ZShjKSkgewotCQkJCWkrKzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICghaXNTcGFjZShjKSAmJiAhaXNFcXVhbChjKSkKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gaTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIHRoaXMubWVtT2Zmc2V0OwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0VuZChjaGFyIGMpIHsKLQkJcmV0dXJuICh0aGlzLm9uZUxpbmUgJiYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ld0xpbmUoKSB7Ci0JCWlmIChvbmVMaW5lKQotCQkJcmV0dXJuIGZhbHNlOwotCQljaGFyIGM7Ci0JCWZvciAoaW50IGkgPSBtZW1PZmZzZXQgLSAxOyAwIDw9IGk7IGktLSkgewotCQkJYyA9IHRhZy5jaGFyQXQoaSk7Ci0JCQlpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmICghaXNTcGFjZShjKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgY2hhciBuZXh0Q2hhcigpIHsKLQkJZm9yICg7IHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGg7IHRoaXMub2Zmc2V0KyspIHsKLQkJCWNoYXIgYyA9IHRoaXMudGFnLmNoYXJBdCh0aGlzLm9mZnNldCk7Ci0JCQlpZiAoaXNFbmQoYykpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoIWlzU3BhY2UoYykpCi0JCQkJcmV0dXJuIGM7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBuZXh0TmFtZSgpIHsKLQkJaWYgKHRoaXMudGFnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMubGVuZ3RoKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKG5leHRDaGFyKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBuYW1lT2Zmc2V0ID0gdGhpcy5vZmZzZXQ7Ci0JCWZvciAoOyB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoOyB0aGlzLm9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSB0aGlzLnRhZy5jaGFyQXQodGhpcy5vZmZzZXQpOwotCQkJaWYgKGlzRW5kKGMpIHx8IGlzU3BhY2UoYykpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoaXNFcXVhbChjKSAmJiB0aGlzLm9mZnNldCA+IG5hbWVPZmZzZXQpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHRoaXMub2Zmc2V0ID09IG5hbWVPZmZzZXQpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQl0aGlzLm1lbU9mZnNldCA9IG5hbWVPZmZzZXQ7Ci0JCXJldHVybiB0aGlzLnRhZy5zdWJzdHJpbmcobmFtZU9mZnNldCwgdGhpcy5vZmZzZXQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgbmV4dFZhbHVlKCkgewotCQlpZiAodGhpcy50YWcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5sZW5ndGgpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQljaGFyIHNlcGVyYXRvciA9IG5leHRDaGFyKCk7Ci0JCWlmICghaXNFcXVhbChzZXBlcmF0b3IpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRoaXMub2Zmc2V0Kys7IC8vIHNraXAgJz0nCi0JCWNoYXIgcXVvdGUgPSBuZXh0Q2hhcigpOwotCQlpZiAocXVvdGUgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoaXNRdW90ZShxdW90ZSkpCi0JCQl0aGlzLm9mZnNldCsrOwotCQllbHNlCi0JCQlxdW90ZSA9IDA7Ci0KLQkJaW50IHZhbHVlT2Zmc2V0ID0gdGhpcy5vZmZzZXQ7Ci0JCWZvciAoOyB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoOyB0aGlzLm9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSB0aGlzLnRhZy5jaGFyQXQodGhpcy5vZmZzZXQpOwotCQkJaWYgKGlzRW5kKGMpKSB7Ci0JCQkJcXVvdGUgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHF1b3RlID09IDApIHsKLQkJCQlpZiAoaXNTcGFjZShjKSkKLQkJCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjID09IHF1b3RlKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpbnQgdmFsdWVFbmQgPSB0aGlzLm9mZnNldDsKLQkJaWYgKHF1b3RlICE9IDAgJiYgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aCkKLQkJCXRoaXMub2Zmc2V0Kys7Ci0JCWlmICh2YWx1ZUVuZCA9PSB2YWx1ZU9mZnNldCkKLQkJCXJldHVybiBudWxsOwotCi0JCXRoaXMubWVtT2Zmc2V0ID0gdmFsdWVPZmZzZXQ7Ci0JCXJldHVybiB0aGlzLnRhZy5zdWJzdHJpbmcodmFsdWVPZmZzZXQsIHZhbHVlRW5kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYmNiZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHsKLQotCXByb3RlY3RlZCBFbmNvZGluZ01lbWVudG8gZkVuY29kaW5nTWVtZW50bzsKLQotCXByb3RlY3RlZCBib29sZWFuIGZIZWFkZXJQYXJzZWQ7Ci0KLQlwcm90ZWN0ZWQgUmVhZGVyIGZSZWFkZXI7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGRldGVjdGVkQ2hhcnNldE5hbWUpKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXREZXRlY3RlZENoYXJzZXROYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyBUT0RPOiBpZiBkZXRlY3RlZENoYXJzZXQgYW5kIHNwZWMgZGVmYXVsdCBpcwotCQkvLyBudWxsLCBuZWVkIHRvIHVzZSAid29yawotCQkvLyBiZW5jaCBiYXNlZCIgZGVmYXVsdHMuCi0JCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHBhcmFtIHJlYXNvbgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbikgewotCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGVuc3VyZUlucHV0U2V0KCkgewotCQlpZiAoZlJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gbnVsbCwgaWYgaW52YWxpZCBjaGFyc2V0IG5hbWUgKGluIHdoaWNoIGNhc2UKLQkgKiAiYXBwcm9wcmlhdGVEZWZhdWx0IiBzaG91bGQgYmUgdXNlZCwgaWYgYSBuYW1lIGlzIHJlYWxseSBuZWVkIGZvciBzb21lCi0JICogInNhdmUgYW55d2F5IiBjYXNlcykuCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gMS4gQ2hlY2sgZXhwbGljaXQgbWFwcGluZyBvdmVycmlkZXMgZnJvbQotCQkvLyBwcm9wZXJ0eSBmaWxlIC0tIGl0cyBoZXJlIHdlIHBpY2sgdXAgInJ1bGVzIiBmb3IgY2FzZXMKLQkJLy8gdGhhdCBhcmUgbm90IGV2ZW4gaW4gSmF2YQotCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gMi4gVXNlIHRoZSAiY2Fub25pY2FsIiBuYW1lIGZyb20gSlJFIG1hcHBpbmdzCi0JCS8vIE5vdGU6IHNlZSBDaGFyc2V0IEphdmFEb2MsIHRoZSBuYW1lIHlvdSBnZXQgb25lCi0JCS8vIHdpdGggY2FuIGJlIGFsaWFzLAotCQkvLyB0aGUgbmFtZSB5b3UgZ2V0IGJhY2sgaXMgInN0YW5kYXJkIiBuYW1lLgotCQlDaGFyc2V0IGphdmFDaGFyc2V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphdmFDaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfQotCQkvLyBnaXZlIHByaW9yaXR5IHRvIGphdmEgY29ub25pY2FsIG5hbWUsIGlmIHByZXNlbnQKLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGphdmFDaGFyc2V0Lm5hbWUoKTsKLQkJCS8vIGJ1dCBzdGlsbCBhbGxvdyBvdmVycmlkZXMKLQkJCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEVuY29kaW5nTWVtZW50bygpLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQl9Ci0KLQkvLyB0byBlbnN1cmUgY29uc2lzdCBvdmVyYWxsIHJ1bGVzIHVzZWQsIHdlJ2xsIG1hcmsgYXMKLQkvLyBmaW5hbCwKLQkvLyBhbmQgcmVxdWlyZSBzdWJjbGFzc2VzIHRvIHByb3ZpZGUgY2VydGFpbiBwaWVjZXMgb2YKLQkvLyB0aGUKLQkvLyBpbXBsZW1lbnRhdGlvbgotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbgotCQkJLy8gcGFyc2UsIHNvIGNhbiBtYWtlCi0JCQkvLyBtdWx0aXBsZSAnZ2V0JyBjYWxscywgd2l0aG91dCBjYXVzaW5nCi0JCQkvLyByZXBhcnNpbmcuCi0JCQlmSGVhZGVyUGFyc2VkID0gdHJ1ZTsKLQkJCS8vIE5vdGU6IHRoZXJlIGlzIGEgImhpZGRlbiBhc3N1bXB0aW9uIiBoZXJlCi0JCQkvLyB0aGF0IGFuIGVtcHR5Ci0JCQkvLyBzdHJpbmcgaW4gY29udGVudCBzaG91bGQgYmUgdHJlYXRlZCBzYW1lIGFzCi0JCQkvLyBub3QgcHJlc2VudC4KLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQloYW5kbGVTcGVjRGVmYXVsdCgpOwotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCS8vIHNhZnR5IG5ldAotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBOdWxsTWVtZW50bygpOwotCQl9Ci0JCXJldHVybiBmRW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdG8gcmV0dXJuIGEgZGVmYXVsdCBlbmNvZGluZyAtLSBhcyBzcGVjaWZpZWQgYnkgYW4gaW5kdXN0cnkKLQkgKiBjb250ZW50IHR5cGUgc3BlYyAtLSB3aGVuIG5vdCBwcmVzZW50IGluIHRoZSBzdHJlYW0sIGZvciBleGFtcGxlLCBYTUwKLQkgKiBzcGVjaWZpZXMgVVRGLTgsIEpTUCBzcGVjaWZpZXMgSVNPLTg4NTktMS4gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybgotCSAqIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCAic3BlYyBkZWZhdWx0Ii4KLQkgKi8KLQlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgZW5jID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmMpOwotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTcGVjRGVmYXVsdCgpIHsKLQkJU3RyaW5nIGVuY29kaW5nTmFtZTsKLQkJZW5jb2RpbmdOYW1lID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jb2RpbmdOYW1lICE9IG51bGwpIHsKLQkJCS8vY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuY29kaW5nTmFtZSwKLQkJCS8vIEVuY29kaW5nTWVtZW50by5VU0VEX0NPTlRFTlRfVFlQRV9ERUZBVUxUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShlbmNvZGluZ05hbWUpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZW5jb2RpbmdOYW1lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV2ZXJ5IHN1YmNsYXNzIG11c3QgcHJvdmlkZSBhIHdheSB0byBwYXJzZSB0aGUgaW5wdXQuIFRoaXMgbWV0aG9kIGhhcwotCSAqIHNldmVyYWwgY3JpdGljYWwgcmVzcG9uc2liaWxpdGllczoKLQkgKiA8bGk+c2V0IHRoZSBmRW5jb2RpbmdNZW1lbnRvIGZpZWxkIGFwcHJvcHJpYXRlbHksIGFjY29yZGluZyB0byB0aGUKLQkgKiByZXN1bHRzIG9mIHRoZSBwYXJzZSBvZiBmUmVhZGVyLjwvbGk+Ci0JICogPGxpPnNldCBmSGFyZGVyUGFyc2VkIHRvIHRydWUsIHRvIGF2b2lkIHdhc3RlZCByZS1wYXJzaW5nLjwvbGk+Ci0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNldEFsbCgpIHsKLQkJZlJlYWRlciA9IG51bGw7Ci0JCWZIZWFkZXJQYXJzZWQgPSBmYWxzZTsKLQkJZkVuY29kaW5nTWVtZW50byA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gbmV3IEJ5dGVSZWFkZXIoaW5wdXRTdHJlYW0pOwotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGtub3cgQnl0ZVJlYWRlcgotCQkJLy8gc3VwcG9ydHMgbWFya2luZwotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJU3RvcmFnZSBpU3RvcmFnZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXNldEFsbCgpOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGlTdG9yYWdlLmdldENvbnRlbnRzKCk7Ci0JCUlucHV0U3RyZWFtIHJlc2V0dGFibGVTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQlyZXNldHRhYmxlU3RyZWFtLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJc2V0KHJlc2V0dGFibGVTdHJlYW0pOwotCQkvLyBUT0RPIHdlJ2xsIG5lZWQgdG8gInJlbWVtYmVyIiBJRmlsZSwgb3IKLQkJLy8gZ2V0IGl0cyAob3IgaXRzIHByb2plY3Qncykgc2V0dGluZ3MsIGluIGNhc2UKLQkJLy8gdGhvc2UgYXJlIG5lZWRlZCB0byBoYW5kbGUgY2FzZXMgd2hlbiB0aGUKLQkJLy8gZW5jb2RpbmcgaXMgbm90IGluIHRoZSBmaWxlIHN0cmVhbS4KLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiB0aGlzIGlzIG5vdCBwYXJ0IG9mIGludGVyZmFjZSB0byBoZWxwIGF2b2lkIGNvbmZ1c2lvbiAuLi4gaXQKLQkgKiBleHBlY3RlZCB0aGlzIFJlYWRlciBpcyBhIHdlbGwgZm9ybWVkIGNoYXJhY3RlciByZWFkZXIgLi4uIHRoYXQgaXMsIGl0cwotCSAqIGFsbCByZWFkeSBiZWVuIGRldGVybWluZWQgdG8gbm90IGJlIGEgdW5pY29kZSBtYXJrZWQgaW5wdXQgc3RyZWFtLiBBbmQsCi0JICogaXRzIGFzc3VtZWQgdG8gYmUgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24sIGF0IHBvc2l0aW9uIHplcm8sIHJlYWR5IHRvCi0JICogcmVhZCBmaXJzdCBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IHJlYWRlcjsKLQkJaWYgKCFmUmVhZGVyLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJZlJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmUmVhZGVyKTsKLQkJfQotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2JsZSwgc2luY2Ugd2UganVzdCBjaGVja2VkIGlmIG1hcmthYmxlCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0J5dGVSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDUwYjNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLQotLyoqCi0gKiBUaGlzIGlzIGFuICJhZGFwdGVyIiBjbGFzcywgc2ltcGx5IHRvIGdldCBpbiBpbnB1dCBzdHJlYW0gdG8gYWN0IGxpa2UgYQotICogcmVhZGVyLiBXZSBjb3VsZCBub3QgdXNlIElucHV0U3RyZWFtUmVhZGVyIGRpcmVjdGx5IGJlY2F1c2UgaXRzIGludGVybmFsCi0gKiBidWZmZXJzIGFyZSBub3QgY29udHJvbGxhYmxlLCBhbmQgaXQgc29tZXRpbWVzIHB1bGxzIHRvbyBtdWNoIG91dCBvZiBpbnB1dAotICogc3RyZWFtIChldmVuIHdoZW4gaXQgd2Fzbid0IG5lZWRlZCBmb3Igb3VyIHB1cnBvc2VzKS4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIGhpZ2hseSBzcGVjaWFsaXplZCBhbmQgYnkgbm90IG1lYW5zIG1lYW50IHRvIGJlCi0gKiBnZW5lcmFsIHB1cnBvc2UuIEl0cyB1c2UgaXMgcmVzdHJpY3RlZCB0byB0aG9zZSBjYXNlcyB3aGVyZSB0aGUgaW5wdXQKLSAqIHN0cmVhbSBjYW4gYmUgcmVnYXJkZWQgYXMgYXNjaWkganVzdCBsb25nIGVub3VnaCB0byBkZXRlcm1pbmUgd2hhdCB0aGUgcmVhbAotICogZW5jb2Rpbmcgc2hvdWxkIGJlLgotICovCi0KLXB1YmxpYyBjbGFzcyBCeXRlUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSBDb2RlZElPLk1BWF9CVUZfU0laRTsKLQotCXByb3RlY3RlZCBieXRlW10gZkJ1ZmZlcjsKLQotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBmSW5wdXRTdHJlYW07Ci0KLQlwcm90ZWN0ZWQgQnl0ZVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQl0aGlzKGlucHV0U3RyZWFtLCBERUZBVUxUX0JVRkZFUl9TSVpFKTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBpbnQgc2l6ZSkgewotCQlmSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZJbnB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRBaGVhZExpbWl0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmSW5wdXRTdHJlYW0ubWFyayhyZWFkQWhlYWRMaW1pdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGIwID0gZklucHV0U3RyZWFtLnJlYWQoKTsKLQkJcmV0dXJuIChiMCAmIDB4MDBGRik7Ci0JfQotCi0JcHVibGljIGludCByZWFkKGNoYXIgY2hbXSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGxlbmd0aCA+IGZCdWZmZXIubGVuZ3RoKSB7Ci0JCQlsZW5ndGggPSBmQnVmZmVyLmxlbmd0aDsKLQkJfQotCi0JCWludCBjb3VudCA9IGZJbnB1dFN0cmVhbS5yZWFkKGZCdWZmZXIsIDAsIGxlbmd0aCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlpbnQgYjAgPSBmQnVmZmVyW2ldOwotCQkJLy8gdGhlIDB4MDBGRiBpcyB0byAibG9zZSIgdGhlIG5lZ2F0aXZlIGJpdHMgZmlsbGVkIGluIHRoZSBieXRlIHRvCi0JCQkvLyBpbnQgY29udmVyc2lvbgotCQkJLy8gKGFuZCB3aGljaCB3b3VsZCBiZSB0aGVyZSBpZiBjYXN0IGRpcmVjdGx5IGZyb20gYnl0ZSB0byBjaGFyKS4KLQkJCWNoYXIgYzAgPSAoY2hhcikgKGIwICYgMHgwMEZGKTsKLQkJCWNoW29mZnNldCArIGldID0gYzA7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmSW5wdXRTdHJlYW0ucmVzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZJbnB1dFN0cmVhbS5za2lwKG4pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1NmU3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRlbnREZXNjcmliZXJGb3JYTUwgaW1wbGVtZW50cyBJVGV4dENvbnRlbnREZXNjcmliZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWVbXSBTVVBQT1JURURfT1BUSU9OUyA9IHtJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUfTsKLQkvKioKLQkgKiA8Y29kZT5yZXN0cmljdGVkTW9kZTwvY29kZT4gaXMgdXNlZCBqdXN0IGZvciB0ZXN0aW5nL2V4cGVyaW1lbnRzLgotCSAqIAotCSAqIElmIGluIHJlc3RyaWN0ZWRNb2RlLCBvdXIgImN1c3RvbSIgY29udGVudFR5cGUgaXMgc2VlbiBhcyB2YWxpZCBvbmx5IGluCi0JICogY2FzZXMgdGhhdCB0aGUgcGxhdGZvcm0ncyBzdGFuZGFyZCBvbmUgZG9lcyBub3QgY292ZXIuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiByZXN0cmljdGVkTW9kZSA9IHRydWU7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZ2V0RGV0ZWN0b3IoKSB7Ci0JCQlyZXR1cm4gbmV3IFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXIjZGVzY3JpYmUoamF2YS5pby5JbnB1dFN0cmVhbSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZm9yIHRoaXMgc3BlY2lhbCBjYXNlLCBhbHdheXMgYXNzdW1lIGludmFsaWQsIHVubGVzcwotCQkvLyBvdXIgc3BlY2lhbCBjaXJjdW1zdGFuY2VzIGFyZSBtZXQuCi0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTlZBTElEOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkvLyBwdXJlbHkgcmVxdWVzdCBmb3IgdmFsaWR0eQotCQkJcmVzdWx0ID0gZGV0ZXJtaW5lVmFsaWRpdHkocmVzdWx0LCBjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKHJlc3VsdCwgY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyI2Rlc2NyaWJlKGphdmEuaW8uUmVhZGVyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZm9yIHRoaXMgc3BlY2lhbCBjYXNlLCBhbHdheXMgYXNzdW1lIGludmFsaWQsIHVubGVzcwotCQkvLyBvdXIgc3BlY2lhbCBjaXJjdW1zdGFuY2VzIGFyZSBtZXQuCi0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTlZBTElEOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkvLyBwdXJlbHkgcmVxdWVzdCBmb3IgdmFsaWR0eQotCQkJcmVzdWx0ID0gZGV0ZXJtaW5lVmFsaWRpdHkocmVzdWx0LCBjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKHJlc3VsdCwgY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXIjZ2V0U3VwcG9ydGVkT3B0aW9ucygpCi0JICovCi0JcHVibGljIFF1YWxpZmllZE5hbWVbXSBnZXRTdXBwb3J0ZWRPcHRpb25zKCkgewotCi0JCXJldHVybiBTVVBQT1JURURfT1BUSU9OUzsKLQl9Ci0KLQlwcml2YXRlIGludCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGludCByZXN1bHQsIElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmV0dXJuUmVzdWx0ID0gcmVzdWx0OwotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCQljb250ZW50cy5yZXNldCgpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCXJldHVyblJlc3VsdCA9IGhhbmRsZUNhbGN1bGF0aW9ucyhyZXN1bHQsIGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCX0KLQkJcmV0dXJuIHJldHVyblJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGludCBkZXRlcm1pbmVWYWxpZGl0eShpbnQgcmVzdWx0LCBJbnB1dFN0cmVhbSBjb250ZW50cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJldHVyblJlc3VsdCA9IHJlc3VsdDsKLQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJY29udGVudHMucmVzZXQoKTsKLQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJcmV0dXJuUmVzdWx0ID0gZGV0ZXJtaW5lVmFsaWRpdHkoZGV0ZWN0b3IsIHJldHVyblJlc3VsdCk7Ci0JCXJldHVybiByZXR1cm5SZXN1bHQ7Ci0JfQotCXByaXZhdGUgaW50IGRldGVybWluZVZhbGlkaXR5KGludCByZXN1bHQsIFJlYWRlciBjb250ZW50cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJldHVyblJlc3VsdCA9IHJlc3VsdDsKLQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJY29udGVudHMucmVzZXQoKTsKLQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJcmV0dXJuUmVzdWx0ID0gZGV0ZXJtaW5lVmFsaWRpdHkoZGV0ZWN0b3IsIHJldHVyblJlc3VsdCk7Ci0JCXJldHVybiByZXR1cm5SZXN1bHQ7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIGludCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGludCByZXN1bHQsIFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJldHVyblJlc3VsdCA9IHJlc3VsdDsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCXJldHVyblJlc3VsdCA9IGhhbmRsZUNhbGN1bGF0aW9ucyhyZXN1bHQsIGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCX0KLQkJcmV0dXJuIHJldHVyblJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0LCBPYmplY3QgamF2YUNoYXJzZXQpIHsKLQkJLy8gc2luY2UgZXF1YWwsIHdlIGRvbid0IG5lZWQgdG8gYWRkLCBidXQgaWYgb3VyIGRldGVjdGVkIHZlcnNpb24gaXMKLQkJLy8gZGlmZmVyZW50IHRoYW4KLQkJLy8gamF2YUNoYXJzZXQsIHRoZW4gd2Ugc2hvdWxkIGFkZCBpdC4gVGhpcyB3aWxsIGhhcHBlbiwgZm9yIGV4YW1wbGUsCi0JCS8vIGlmIHRoZXJlJ3MKLQkJLy8gZGlmZmVyZW5jZXMgaW4gY2FzZSwgb3IgZGlmZmVyZW5jZXMgZHVlIHRvIG92ZXJyaWRlIHByb3BlcnRpZXMKLQkJaWYgKGRldGVjdGVkQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQkvLyBpZiAoIWRldGVjdGVkQ2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkvLyBkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwKLQkJCS8vIGRldGVjdGVkQ2hhcnNldCk7Ci0JCQkvLyB9Ci0KLQkJCS8vIE9uY2Ugd2UgZGV0ZWN0ZWQgYSBjaGFyc2V0LCB3ZSBzaG91bGQgc2V0IHRoZSBwcm9wZXJ0eSBldmVuCi0JCQkvLyB0aG91Z2ggaXQncyB0aGUgc2FtZSBhcyBqYXZhQ2hhcnNldAotCQkJLy8gYmVjYXVzZSB0aGVyZSBhcmUgY2xpZW50cyB0aGF0IHJlbHkgb24gdGhpcyBwcm9wZXJ0eSB0bwotCQkJLy8gZGV0ZXJtaW5lIGlmIHRoZSBjaGFyc2V0IGlzIGFjdHVhbGx5IGRldGVjdGVkIGluIGZpbGUgb3Igbm90LgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIGRldGVjdGVkQ2hhcnNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZlbnQoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSykpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGV0ZWN0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBpbnQgaGFuZGxlQ2FsY3VsYXRpb25zKGludCByZXN1bHQsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJldHVyblJlc3VsdCA9IHJlc3VsdDsKLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9ICgoWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcikuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkvLyBUT0RPOiBJIG5lZWQgdG8gdmVyaWZ5IHRvIHNlZSBpZiB0aGlzIEJPTSB3b3JrIGlzIGFsd2F5cyBkb25lCi0JCQkvLyBieSB0ZXh0IHR5cGUuCi0JCQlPYmplY3QgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrID0gZW5jb2RpbmdNZW1lbnRvLmdldFVuaWNvZGVCT00oKTsKLQkJCWlmIChkZXRlY3RlZEJ5dGVPcmRlck1hcmsgIT0gbnVsbCkgewotCQkJCU9iamVjdCBleGlzdGluZ0J5dGVPcmRlck1hcmsgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSyk7Ci0JCQkJLy8gbm90IHN1cmUgd2h5IHdvdWxkIGV2ZXIgYmUgZGlmZmVyZW50LCBzbyBpZiBpcyBkaWZmZXJlbnQsCi0JCQkJLy8gbWF5Ci0JCQkJLy8gbmVlZCB0byAicHVzaCIgdXAgaW50byBiYXNlLgotCQkJCWlmICghZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrLmVxdWFscyhleGlzdGluZ0J5dGVPcmRlck1hcmspKQotCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrKTsKLQkJCX0KLQotCi0JCQlpZiAoIWVuY29kaW5nTWVtZW50by5pc1ZhbGlkKCkpIHsKLQkJCQkvLyBub3RlOiBhZnRlciBzZXR0aW5nIGhlcmUsIGl0cyB0aGUgbWVyZSBwcmVzZW5jZSBvZgotCQkJCS8vIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUCi0JCQkJLy8gaW4gdGhlIHJlc291cmNlJ3MgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUKLQkJCQkvLyBpZiBpbnZhbGlkIGluIHRob3NlIGNhc2VzLCB0aGUgImRldGVjdGVkIiBwcm9wZXJ0eSBjb250YWlucwotCQkJCS8vIGFuICJhcHByb3ByaWF0ZSBkZWZhdWx0IiB0byB1c2UuCi0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIGVuY29kaW5nTWVtZW50by5nZXRJbnZhbGlkRW5jb2RpbmcoKSk7Ci0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQsIGVuY29kaW5nTWVtZW50by5nZXRBcHByb3ByaWF0ZURlZmF1bHQoKSk7Ci0JCQl9Ci0KLQkJCU9iamVjdCBkZXRlY3RlZENoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQkJT2JqZWN0IGphdmFDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCi0JCQkvLyB3ZSBhbHdheXMgaW5jbHVkZSBkZXRlY3RlZCwgaWYgaXRzIGRpZmZlcmVudCB0aGFuIGphdmEKLQkJCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCi0JCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJCU9iamVjdCBleGlzdGluZ0NoYXJzZXQgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpOwotCQkJCWlmIChqYXZhQ2hhcnNldC5lcXVhbHMoZXhpc3RpbmdDaGFyc2V0KSkgewotCQkJCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHdlIG1heSBuZWVkIHRvIGFkZCB3aGF0IHdlIGZvdW5kLCBidXQgb25seSBuZWVkIHRvIGFkZAotCQkJCQkvLyBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdAotCQkJCQlPYmplY3QgZGVmYXVsdENoYXJzZXQgPSBkZXRlY3Rvci5nZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCQkJCWlmIChkZWZhdWx0Q2hhcnNldCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoIWRlZmF1bHRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGFzc3VtaW5nIGlmIHRoZXJlIGlzIG5vIHNwZWMgZGVmYXVsdCwgd2UgYWx3YXlzCi0JCQkJCQkvLyBuZWVkIHRvIGFkZC4KLQkJCQkJCS8vIFRPRE86IHRoaXMgaXMgcHJvYmFibHkgYSBkZWFkIGJyYW5jaCBpbiBjdXJyZW50Ci0JCQkJCQkvLyBjb2RlLCBzaG91bGQgcmUtZXhhbWluZSBmb3IgcmVtb3ZhbC4KLQkJCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuUmVzdWx0ID0gZGV0ZXJtaW5lVmFsaWRpdHkoZGV0ZWN0b3IsIHJldHVyblJlc3VsdCk7Ci0JCXJldHVybiByZXR1cm5SZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZGV0ZXJtaW5lVmFsaWRpdHkoSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yLCBpbnQgcmV0dXJuUmVzdWx0KSB7Ci0JCS8vIHdlIGFsd2F5cyBleHBlY3QgWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLCBidXQganVzdCB0byBtYWtlIHNhZmUKLQkJLy8gY2FzdC4KLQkJaWYgKGRldGVjdG9yIGluc3RhbmNlb2YgWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSB7Ci0JCQlYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgeG1sUmVzb3VyY2VEZXRlY3RvciA9IChYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IpIGRldGVjdG9yOwotCQkJaWYgKHhtbFJlc291cmNlRGV0ZWN0b3IuaXNEZWNsRGV0ZWN0ZWQoKSkgewotCQkJCWlmIChyZXN0cmljdGVkTW9kZSkgewotCQkJCQkvLyBpZiB0aGVyZSBpcyBubyBpbml0aWFsIHdoaXRlc3BhY2UsIHRoZW4gcGxhdGZvcm0ncwotCQkJCQkvLyBkZWZhdWx0IG9uZSB3aWxsIGRvLgotCQkJCQlpZiAoeG1sUmVzb3VyY2VEZXRlY3Rvci5oYXNJbml0aWFsV2hpdGVTcGFjZSgpKSB7Ci0JCQkJCQlyZXR1cm5SZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5WQUxJRDsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuUmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuVkFMSUQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXR1cm5SZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0VuY29kaW5nUGFyc2VyQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0VuY29kaW5nUGFyc2VyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NTQyYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ1BhcnNlckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzIHsKLQotCWZpbmFsIFN0cmluZyBFT0YgPSAiRU9GIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBJbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlID0gIkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIEludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUgPSAiSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgTUFYX0NIQVJTX1JFQUNIRUQgPSAiTUFYX0NIQVJTX1JFQUNIRUQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIFN0cmluZ1ZhbHVlID0gInN0cnZhbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSA9ICJVbkRlbGltaXRlZFN0cmluZ1ZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBTdHJpbmcgVVRGMTZCRSA9ICJVVEYxNkJFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBTdHJpbmcgVVRGMTZMRSA9ICJVVEYxNkxFIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIFVURjgzQnl0ZUJPTSA9ICJVVEY4M0J5dGVCT00iOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjE0YjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotcHVibGljIGNsYXNzIEhlYWRQYXJzZXJUb2tlbiB7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCi0JcHJpdmF0ZSBTdHJpbmcgZlRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZlR5cGU7Ci0KLQlwcm90ZWN0ZWQgSGVhZFBhcnNlclRva2VuKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBIZWFkUGFyc2VyVG9rZW4oU3RyaW5nIHR5cGUsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcygpOwotCQlmVHlwZSA9IHR5cGU7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dCA9IHRleHQ7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBmVGV4dDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gKCJ0ZXh0OiAiICsgZlRleHQgKyAiIG9mZnNldDogIiArIGZTdGFydCArICIgdHlwZTogIiArIGZUeXBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZGJhZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi0vKgotICogCi0gKiBBIG5vbi1yZXNpemFibGUgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBiZWhhdmlvciBvZiBqYXZhLnV0aWwuU3RhY2ssIGJ1dAotICogZGlyZWN0bHkgZm9yIHRoZSA8Y29kZT4gaW50ZWdlciA8L2NvZGU+IHByaW1pdGl2ZS4KLSAqLwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW50U3RhY2sgewotCXByaXZhdGUgaW50W10gbGlzdCA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBzaXplID0gMDsKLQotCXB1YmxpYyBJbnRTdGFjaygpIHsKLQkJdGhpcygxMDApOwotCX0KLQotCXB1YmxpYyBJbnRTdGFjayhpbnQgbWF4ZGVwdGgpIHsKLQkJc3VwZXIoKTsKLQkJbGlzdCA9IG5ldyBpbnRbbWF4ZGVwdGhdOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbXB0eSgpIHsKLQkJcmV0dXJuIHNpemUgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldChpbnQgc2xvdCkgewotCQlyZXR1cm4gbGlzdFtzbG90XTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKQotCQkJbGlzdFtpXSA9IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aXRob3V0IHJlbW92aW5nIGl0Ci0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwZWVrKCkgewotCQlpZiAoc2l6ZSA9PSAwKQotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGxpc3Rbc2l6ZSAtIDFdOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcG9wKCkgewotCQlpbnQgdmFsdWUgPSBwZWVrKCk7Ci0JCWxpc3Rbc2l6ZSAtIDFdID0gLTE7Ci0JCXNpemUtLTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFB1c2hlcyBhbiBpdGVtIG9udG8gdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZSAtCi0JICogICAgICAgICAgICB0aGUgaW50IHRvIGJlIHB1c2hlZCBvbnRvIHRoaXMgc3RhY2suCi0JICogQHJldHVybiB0aGUgPGNvZGU+bmV3VmFsdWU8L2NvZGU+IGFyZ3VtZW50LgotCSAqLwotCXB1YmxpYyBpbnQgcHVzaChpbnQgbmV3VmFsdWUpIHsKLQkJaWYgKHNpemUgPT0gbGlzdC5sZW5ndGgpIHsKLQkJCXRocm93IG5ldyBTdGFja092ZXJmbG93RXJyb3IoKTsKLQkJfQotCQlsaXN0W3NpemUrK10gPSBuZXdWYWx1ZTsKLQkJcmV0dXJuIG5ld1ZhbHVlOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHNpemU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRDbGFzcygpLmdldE5hbWUoKSArICI6IiArc2l6ZSArICIgWyIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcy5hcHBlbmQobGlzdFtpXSk7Ci0JCQlpZihpIDwgc2l6ZSAtIDEpIHsKLQkJCQlzLmFwcGVuZCgiLCAiKTsKLQkJCX0KLQkJfQotCQlzLmFwcGVuZCgiXSIpOwotCQlyZXR1cm4gcy50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNmNzQ2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL051bGxNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlczsKLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBhbiBFbmNvZGluZ01lbWVudG8gKGl0cyBzdXBlciBjbGFzcyksCi0gKiB3aGVuIHRoZXJlIGlzIG5vdCBpbiBmYWN0IEFOWSBlbmNvZGluZyBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIHdoZW4gYQotICogc3RydWN0dXJlZERvY3VtZW50IGlzIGNyZWF0ZWQgZGlyZWN0bHkgZnJvbSBhIFN0cmluZwotICovCi1wdWJsaWMgY2xhc3MgTnVsbE1lbWVudG8gZXh0ZW5kcyBFbmNvZGluZ01lbWVudG8gewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgTnVsbE1lbWVudG8oKSB7Ci0JCXN1cGVyKCk7Ci0JCVN0cmluZyBkZWZhdWx0Q2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhudWxsKTsKLQkJc2V0SmF2YUNoYXJzZXROYW1lKGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MRGVjbERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTERlY2xEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmMzNTUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MRGVjbERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjk3MDA2IC0gU3RyaW5nIENvbXBhcmlzb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFhNTERlY2xEZXRlY3RvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9CVUZfU0laRSA9IDEwMjQgKiA4OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTUFSS19TSVpFID0gMTAyNCAqIDg7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZkhlYWRlclBhcnNlZDsKLQlwcml2YXRlIGJvb2xlYW4gZklzWE1MOwotCXByb3RlY3RlZCBSZWFkZXIgZlJlYWRlcjsKLQkvL3ByaXZhdGUgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXByaXZhdGUgWE1MSGVhZFRva2VuaXplciBmVG9rZW5pemVyOwotCi0JcHJpdmF0ZSBib29sZWFuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbShTdHJpbmcgdG9rZW5UeXBlKSB7Ci0JCWJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gZmFsc2U7Ci0JCWlmIChFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT00uZXF1YWxzKHRva2VuVHlwZSkpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQkvL2ZVbmljb2RlID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkUuZXF1YWxzKHRva2VuVHlwZSkpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQkvL2ZVbmljb2RlID0gIlVURi0xNkJFIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEUuZXF1YWxzKHRva2VuVHlwZSkpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQkvL2ZVbmljb2RlID0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtOwotCX0KLQotCWZpbmFsIHByaXZhdGUgdm9pZCBlbnN1cmVJbnB1dFNldCgpIHsKLQkJaWYgKGZSZWFkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5wdXQgbXVzdCBiZSBzZXQgYmVmb3JlIHVzZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvL3ByaXZhdGUgU3RyaW5nIGZVbmljb2RlOwotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0b2tlbml6ZXIuCi0JICovCi0JcHJpdmF0ZSBYTUxIZWFkVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBYTUxIZWFkVG9rZW5pemVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpc1hNTC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1hNTCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVuc3VyZUlucHV0U2V0KCk7Ci0JCWlmICghZkhlYWRlclBhcnNlZCkgewotCQkJcGFyc2VJbnB1dCgpOwotCQl9Ci0JCXJldHVybiBmSXNYTUw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlYTUxIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQl0b2tlbml6ZXIucmVzZXQoZlJlYWRlcik7Ci0JCUhlYWRQYXJzZXJUb2tlbiB0b2tlbiA9IG51bGw7Ci0JCVN0cmluZyB0b2tlblR5cGUgPSBudWxsOwotCQlkbyB7Ci0JCQl0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCXRva2VuVHlwZSA9IHRva2VuLmdldFR5cGUoKTsKLQkJCWlmIChjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0odG9rZW5UeXBlKSkgewotCQkJCWZSZWFkZXIucmVzZXQoKTsKLQkJCQkvLyB0aGlzIGlzIChvYnZpb3VzbHkpIG5vdCBhbHdheXMgdHJ1ZS4KLQkJCQkvLyBUT0RPOiBuZWVkIHRvIGZpeCBzbyB3ZSAicmVtZW1iZXIiIG9yaWdpbmFsIGlGaWxlIG9yCi0JCQkJLy8gaW5wdXRzdHJlYW0sIGFuZAotCQkJCS8vIGNyZWF0ZSBhcHByb3ByaWF0ZSBJbnB1dFN0cmVhbVJlYWRlci4KLQkJCQkvLyBJJ20gbm90IHN1cmUgd2hhdCB0byBkbyBmb3IgdGhlIHNldChyZWFkZXIpIGNhc2UgLi4uIGlmIGl0cwotCQkJCS8vIGV2ZW4gcmVsZXZlbnQuCi0JCQkJLy8gcGx1cywgZW5zdXJlIGFnYWluc3QgaW5maW5pdGUgbG9vcHMhCi0JCQkJZklzWE1MID0gdHJ1ZTsKLQkJCQkvL2ZSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZlJlYWRlciwgZlVuaWNvZGUpOwotCQkJCS8vIHBhcnNlSW5wdXQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2RpbmcuZXF1YWxzKHRva2VuVHlwZSkpIHsKLQkJCQkJZklzWE1MID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmUmVhZGVyID0gbnVsbDsKLQkJZkhlYWRlclBhcnNlZCA9IGZhbHNlOwotCQlmSXNYTUwgPSBmYWxzZTsKLQkJLy9mVW5pY29kZSA9IG51bGw7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSUZpbGUgaUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVzZXRBbGwoKTsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBpRmlsZS5nZXRDb250ZW50cyh0cnVlKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBNQVhfQlVGX1NJWkUpOwotCQlyZXNldHRhYmxlU3RyZWFtLm1hcmsoTUFYX01BUktfU0laRSk7Ci0JCXNldChyZXNldHRhYmxlU3RyZWFtKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IG5ldyBCeXRlUmVhZGVyKGlucHV0U3RyZWFtKTsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhNQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2Uga25vdyBCeXRlUmVhZGVyIHN1cHBvcnRzIG1hcmtpbmcKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhNQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTEhlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmZiNDBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1MSArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjQuMiBvbiA3LzI4LzA4IDk6MjkgQU0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5qZmxleC5kZS8iPkpGbGV4PC9hPiAxLjQuMgotICogb24gNy8yOC8wOCA5OjI5IEFNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PkQ6L3dvcmtzcGFjZXMvd3RwMzAxL3dvcmtzcGFjZS9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci5qRmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxIZWFkVG9rZW5pemVyIHsKLQotICAvKiogVGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogaW5pdGlhbCBzaXplIG9mIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9CVUZGRVJTSVpFID0gODE5MjsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWVlJTklUSUFMID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFFfU1RSSU5HID0gNjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FfU1RSSU5HID0gODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFF1b3RlZEF0dHJpYnV0ZVZhbHVlID0gNDsKLQotICAvKioKLSAgICogWlpfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogWlpfTEVYU1RBVEVbbCsxXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqIGwgaXMgb2YgdGhlIGZvcm0gbCA9IDIqaywgayBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTEVYU1RBVEVbXSA9IHsgCi0gICAgIDAsICAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCA2Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9DTUFQX1BBQ0tFRCA9IAotICAgICJcMVwxMVwxMFwwXDFcNlwxXDEwXDJcMFwxXDdcMjJcMFwxXDZcMVwwXDFcMzMiKwotICAgICJcMlwwXDFcMzVcMVwwXDFcMzRcMjRcMFwxXDEzXDFcMTJcMVwzMlwxXDE0XDNcMCIrCi0gICAgIlwxXDI3XDFcMzBcMVwyMVwxXDBcMVwzMVwxXDBcMVwyNFwyXDBcMVwxN1wxXDE2IisKLSAgICAiXDFcMjZcMVwyNVwyXDBcMVwyMlwxXDIzXDJcMFwxXDIwXDFcMFwxXDE1XDEyXDAiKwotICAgICJcMVwyN1wxXDMwXDFcMjFcMVwwXDFcMzFcMVwwXDFcMjRcMlwwXDFcMTdcMVwxNiIrCi0gICAgIlwxXDI2XDFcMjVcMlwwXDFcMjJcMVwyM1wyXDBcMVwyMFwxXDBcMVwxNVwxMDJcMCIrCi0gICAgIlwxXDRcM1wwXDFcNVwxN1wwXDFcM1wxNlwwXDFcMVwyMFwwXDFcM1wxNlwwIisKLSAgICAiXDFcMVwxXDJcMTcwXDBcMVwyXHVmZTg3XDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFtdIFpaX0NNQVAgPSB6elVucGFja0NNYXAoWlpfQ01BUF9QQUNLRUQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBERkEgc3RhdGVzIHRvIGFjdGlvbiBzd2l0Y2ggbGFiZWxzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX0FDVElPTiA9IHp6VW5wYWNrQWN0aW9uKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0FDVElPTl9QQUNLRURfMCA9Ci0gICAgIlw3XDBcMTNcMVwyXDJcMVwxXDFcMlwxXDNcMVw0XDFcNSIrCi0gICAgIlwxXDZcMVwxXDFcNVwxXDdcMVwxXDFcNVwxXDEwXDFcMSIrCi0gICAgIlwxXDExXDFcMTJcMVwxM1wxMlwwXDFcMTRcNVwwXDFcMlwxXDMiKwotICAgICJcMVw0XDFcNlwyXDBcMVwxNVwxXDdcMlwwXDFcMTBcMVwxMSIrCi0gICAgIlwxXDE2XDNcMFwxXDE0XDRcMFwxXDJcMVwxNVwxNFwwXDFcMTciKwotICAgICJcNVwwXDFcMTdcNlwwXDFcMjBcM1wwXDFcMjBcMlwwXDFcMjEiKwotICAgICJcMVwwXDFcMjFcMVwwIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBY3Rpb24oKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbMTExXTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja0FjdGlvbihaWl9BQ1RJT05fUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrQWN0aW9uKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gcmVzdWx0W2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9VTktOT1dOX0VSUk9SID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX05PX01BVENIID0gMTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1BVU0hCQUNLXzJCSUcgPSAyOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHp6UmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHp6U3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgenpCdWZmZXJbXSA9IG5ldyBjaGFyW1paX0JVRkZFUlNJWkVdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ek1hcmtlZFBvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHp6Q3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHp6U3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgenpFbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLS8vICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotLy8gIHByaXZhdGUgaW50IHl5Y29sdW1uOwotCi0gIC8qKiAKLSAgICogenpBdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0Qk9MID0gdHJ1ZTsKLQotICAvKiogenpBdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBhdCB0aGUgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6RU9GRG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOwotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotCi0KLQlwdWJsaWMgWE1MSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLSAgICAgICAgICAgICAgICAvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gICAgICAgICAgICAgICAgenpSZWFkZXIgPSBpbjsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgICAgICAgICAgICAgICB6elN0YXRlID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAgICAgICAgICAgICAgIC8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgICAgICAgICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5cy5maWxsKHp6QnVmZmVyLCAoY2hhcikwKTsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgenpNYXJrZWRQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLS8vICAgICAgICAgICAgICAgIHp6UHVzaGJhY2tQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgenpDdXJyZW50UG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHp6U3RhcnRSZWFkID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgICAgICAgICAgICAqIGZyb20gaW5wdXQKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB6ekVuZFJlYWQgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0vLyAgICAgICAgICAgICAgICB5eWxpbmUgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gICAgICAgICAgICAgICAgeXljaGFyID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICogb2YgdGhlIG1hdGNoZWQgdGV4dAotICAgICAgICAgICAgICAgICAqLwotLy8gICAgICAgICAgICAgICAgeXljb2x1bW4gPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcKLSAgICAgICAgICAgICAgICAgKiBvZiBhIGxpbmUKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB6ekF0Qk9MID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIC8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgICAgICAgICAgICAgICB6ekF0RU9GID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgICAgICAgICAgICAgICB6ekVPRkRvbmUgPSBmYWxzZTsKLQotCi0gICAgICAgICAgICAgICAgZlN0YXRlU3RhY2suY2xlYXIoKTsKLQotICAgICAgICAgICAgICAgIGhhc01vcmUgPSB0cnVlOwotICAJCQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQkKLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQkKLQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTEhlYWRUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnp6UmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10genpVbnBhY2tDTWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE1MCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLSAgICogCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6UmVmaWxsKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoenpTdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6RW5kUmVhZC16elN0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB6ekVuZFJlYWQtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6Q3VycmVudFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpNYXJrZWRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6U3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHp6Q3VycmVudFBvcyA+PSB6ekJ1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3p6Q3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgenpCdWZmZXIubGVuZ3RoKTsKLSAgICAgIHp6QnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0genpSZWFkZXIucmVhZCh6ekJ1ZmZlciwgenpFbmRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlci5sZW5ndGgtenpFbmRSZWFkKTsKLQotICAgIGlmIChudW1SZWFkID4gMCkgewotICAgICAgenpFbmRSZWFkKz0gbnVtUmVhZDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy8gdW5saWtlbHkgYnV0IG5vdCBpbXBvc3NpYmxlOiByZWFkIDAgY2hhcmFjdGVycywgYnV0IG5vdCBhdCBlbmQgb2Ygc3RyZWFtICAgIAotICAgIGlmIChudW1SZWFkID09IDApIHsKLSAgICAgIGludCBjID0genpSZWFkZXIucmVhZCgpOwotICAgICAgaWYgKGMgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB6ekJ1ZmZlclt6ekVuZFJlYWQrK10gPSAoY2hhcikgYzsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSAgICAgCi0gICAgfQotCi0JLy8gbnVtUmVhZCA8IDAKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gICAgCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgenpBdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0KLSAgICBpZiAoenpSZWFkZXIgIT0gbnVsbCkKLSAgICAgIHp6UmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXNldHMgdGhlIHNjYW5uZXIgdG8gcmVhZCBmcm9tIGEgbmV3IGlucHV0IHN0cmVhbS4KLSAgICogRG9lcyBub3QgY2xvc2UgdGhlIG9sZCByZWFkZXIuCi0gICAqCi0gICAqIEFsbCBpbnRlcm5hbCB2YXJpYWJsZXMgYXJlIHJlc2V0LCB0aGUgb2xkIGlucHV0IHN0cmVhbSAKLSAgICogPGI+Y2Fubm90PC9iPiBiZSByZXVzZWQgKGludGVybmFsIGJ1ZmZlciBpcyBkaXNjYXJkZWQgYW5kIGxvc3QpLgotICAgKiBMZXhpY2FsIHN0YXRlIGlzIHNldCB0byA8dHQ+WlpfSU5JVElBTDwvdHQ+LgotICAgKgotICAgKiBAcGFyYW0gcmVhZGVyICAgdGhlIG5ldyBpbnB1dCBzdHJlYW0gCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB5eXJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlcikgewotICAgIHp6UmVhZGVyID0gcmVhZGVyOwotICAgIHp6QXRCT0wgID0gdHJ1ZTsKLSAgICB6ekF0RU9GICA9IGZhbHNlOwotICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkID0gMDsKLSAgICB6ekN1cnJlbnRQb3MgPSB6ek1hcmtlZFBvcyA9IDA7Ci0gICAgeXljaGFyID0gMDsKLSAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4genpMZXhpY2FsU3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHp6TGV4aWNhbFN0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgcHVibGljIGZpbmFsIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwgenpNYXJrZWRQb3MtenpTdGFydFJlYWQgKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA8dHQ+cG9zPC90dD4gZnJvbSB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dC4gCi0gICAqIAotICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvIHl5dGV4dCgpLmNoYXJBdChwb3MpLCBidXQgZmFzdGVyCi0gICAqCi0gICAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgdG8gZmV0Y2guIAotICAgKiAgICAgICAgICAgIEEgdmFsdWUgZnJvbSAwIHRvIHl5bGVuZ3RoKCktMS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIHBvcwotICAgKi8KLSAgcHVibGljIGZpbmFsIGNoYXIgeXljaGFyYXQoaW50IHBvcykgewotICAgIHJldHVybiB6ekJ1ZmZlclt6elN0YXJ0UmVhZCtwb3NdOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4genpNYXJrZWRQb3MtenpTdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogSW4gYSB3ZWxsZm9ybWVkIHNjYW5uZXIgKG5vIG9yIG9ubHkgY29ycmVjdCB1c2FnZSBvZiAKLSAgICogeXlwdXNoYmFjayhpbnQpIGFuZCBhIG1hdGNoLWFsbCBmYWxsYmFjayBydWxlKSB0aGlzIG1ldGhvZCAKLSAgICogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoaW5ncyB0aGF0ICJDYW4ndCBQb3NzaWJseSBIYXBwZW4iLgotICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcKLSAgICogKGUuZy4gYSBKRmxleCBidWcgcHJvZHVjaW5nIGEgZmF1bHR5IHNjYW5uZXIgZXRjLikuCi0gICAqCi0gICAqIFVzdWFsIHN5bnRheC9zY2FubmVyIGxldmVsIGVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lCi0gICAqIGluIGVycm9yIGZhbGxiYWNrIHJ1bGVzLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHp6U2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICB0cnkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1tlcnJvckNvZGVdOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbWlpfVU5LTk9XTl9FUlJPUl07Ci0gICAgfQotCi0gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHB1YmxpYyB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgenpTY2FuRXJyb3IoWlpfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB6ek1hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHp6RG9FT0YoKSB7Ci0gICAgaWYgKCF6ekVPRkRvbmUpIHsKLSAgICAgIHp6RU9GRG9uZSA9IHRydWU7Ci0gICAgCWhhc01vcmU9ZmFsc2U7Ci0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgenpJbnB1dDsKLSAgICBpbnQgenpBY3Rpb247Ci0KLSAgICAvLyBjYWNoZWQgZmllbGRzOgotICAgIGludCB6ekN1cnJlbnRQb3NMOwotICAgIGludCB6ek1hcmtlZFBvc0w7Ci0gICAgaW50IHp6RW5kUmVhZEwgPSB6ekVuZFJlYWQ7Ci0gICAgY2hhciBbXSB6ekJ1ZmZlckwgPSB6ekJ1ZmZlcjsKLSAgICBjaGFyIFtdIHp6Q01hcEwgPSBaWl9DTUFQOwotCi0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgenpNYXJrZWRQb3NMID0genpNYXJrZWRQb3M7Ci0KLSAgICAgIHl5Y2hhcis9IHp6TWFya2VkUG9zTC16elN0YXJ0UmVhZDsKLQotICAgICAgaWYgKHp6TWFya2VkUG9zTCA+IHp6U3RhcnRSZWFkKSB7Ci0gICAgICAgIHN3aXRjaCAoenpCdWZmZXJMW3p6TWFya2VkUG9zTC0xXSkgewotICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgIGNhc2UgJ1x1MDAwQic6Ci0gICAgICAgIGNhc2UgJ1x1MDAwQyc6Ci0gICAgICAgIGNhc2UgJ1x1MDA4NSc6Ci0gICAgICAgIGNhc2UgJ1x1MjAyOCc6Ci0gICAgICAgIGNhc2UgJ1x1MjAyOSc6Ci0gICAgICAgICAgenpBdEJPTCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xyJzogCi0gICAgICAgICAgaWYgKHp6TWFya2VkUG9zTCA8IHp6RW5kUmVhZEwpCi0gICAgICAgICAgICB6ekF0Qk9MID0genpCdWZmZXJMW3p6TWFya2VkUG9zTF0gIT0gJ1xuJzsKLSAgICAgICAgICBlbHNlIGlmICh6ekF0RU9GKQotICAgICAgICAgICAgenpBdEJPTCA9IGZhbHNlOwotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgYm9vbGVhbiBlb2YgPSB6elJlZmlsbCgpOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMID0genpNYXJrZWRQb3M7Ci0gICAgICAgICAgICB6ekVuZFJlYWRMID0genpFbmRSZWFkOwotICAgICAgICAgICAgenpCdWZmZXJMID0genpCdWZmZXI7Ci0gICAgICAgICAgICBpZiAoZW9mKSAKLSAgICAgICAgICAgICAgenpBdEJPTCA9IGZhbHNlOwotICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgenpBdEJPTCA9IHp6QnVmZmVyTFt6ek1hcmtlZFBvc0xdICE9ICdcbic7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHp6QXRCT0wgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgenpBY3Rpb24gPSAtMTsKLQotICAgICAgenpDdXJyZW50UG9zTCA9IHp6Q3VycmVudFBvcyA9IHp6U3RhcnRSZWFkID0genpNYXJrZWRQb3NMOwotICAKLSAgICAgIGlmICh6ekF0Qk9MKQotICAgICAgICB6elN0YXRlID0gWlpfTEVYU1RBVEVbenpMZXhpY2FsU3RhdGUrMV07Ci0gICAgICBlbHNlCi0gICAgICAgIHp6U3RhdGUgPSBaWl9MRVhTVEFURVt6ekxleGljYWxTdGF0ZV07Ci0KLQotICAgICAgenpGb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICBpZiAoenpDdXJyZW50UG9zTCA8IHp6RW5kUmVhZEwpCi0gICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgZWxzZSBpZiAoenpBdEVPRikgewotICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb25zCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3MgID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zICAgPSB6ek1hcmtlZFBvc0w7Ci0gICAgICAgICAgICBib29sZWFuIGVvZiA9IHp6UmVmaWxsKCk7Ci0gICAgICAgICAgICAvLyBnZXQgdHJhbnNsYXRlZCBwb3NpdGlvbnMgYW5kIHBvc3NpYmx5IG5ldyBidWZmZXIKLSAgICAgICAgICAgIHp6Q3VycmVudFBvc0wgID0genpDdXJyZW50UG9zOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMICAgPSB6ek1hcmtlZFBvczsKLSAgICAgICAgICAgIHp6QnVmZmVyTCAgICAgID0genpCdWZmZXI7Ci0gICAgICAgICAgICB6ekVuZFJlYWRMICAgICA9IHp6RW5kUmVhZDsKLSAgICAgICAgICAgIGlmIChlb2YpIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHp6SW5wdXQgPSB6ekNNYXBMW3p6SW5wdXRdOwotCi0gICAgICAgICAgYm9vbGVhbiB6eklzRmluYWwgPSBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIHp6Tm9Mb29rQWhlYWQgPSBmYWxzZTsKLQotICAgICAgICAgIHp6Rm9yTmV4dDogeyBzd2l0Y2ggKHp6U3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDExOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDM0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6IHp6U3RhdGUgPSAzNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAzNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDM5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDM3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDM5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6elN0YXRlID0gNDE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6elN0YXRlID0gNDI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB6elN0YXRlID0gNDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6elN0YXRlID0gNDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA0NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQ3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpTdGF0ZSA9IDQ4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogenpJc0ZpbmFsID0gdHJ1ZTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDE4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDE4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDUzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDU1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSA1NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDU3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDU4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDU5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSA2MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDYxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDYyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpTdGF0ZSA9IDYwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDYzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA1OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDY0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDM5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDM3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDM5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSA0MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSA0MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDY2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogenpTdGF0ZSA9IDY3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSA0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQ5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDY4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpTdGF0ZSA9IDQ4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gNzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA3MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSA3MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA3MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA1NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA1ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA1ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA3NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDYxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDM3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDM5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogenpTdGF0ZSA9IDY3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gNzY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gNzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA3NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSA3ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSA3MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDc5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogenpTdGF0ZSA9IDgwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDc2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gODE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gODI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gNzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA4MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSA4NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSA4MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDg1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDg2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpTdGF0ZSA9IDgyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDg3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gODg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gODQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA4OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSA5MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHp6U3RhdGUgPSA4NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDkxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDkyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDkzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDg3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gOTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB6elN0YXRlID0gOTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA5NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSA5NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSA5MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDk3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDk4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDg3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gOTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gOTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gOTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTAwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDk4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTAxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogenpTdGF0ZSA9IDEwMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSA5NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDEwNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB6elN0YXRlID0gMTAyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTA3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSA5NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDEwMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDExMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMTAyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgZXZlciByZWFjaGVkLCB0aGVyZSBpcyBhIHNlcmlvdXMgYnVnIGluIEpGbGV4Ci0gICAgICAgICAgICAgIHp6U2NhbkVycm9yKFpaX1VOS05PV05fRVJST1IpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9IH0KLQotICAgICAgICAgIGlmICggenpJc0ZpbmFsICkgewotICAgICAgICAgICAgenpBY3Rpb24gPSB6elN0YXRlOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIGlmICggenpOb0xvb2tBaGVhZCApIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9uCi0gICAgICB6ek1hcmtlZFBvcyA9IHp6TWFya2VkUG9zTDsKLQotICAgICAgc3dpdGNoICh6ekFjdGlvbiA8IDAgPyB6ekFjdGlvbiA6IFpaX0FDVElPTlt6ekFjdGlvbl0pIHsKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTg6IGJyZWFrOwotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007fQotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjA6IGJyZWFrOwotICAgICAgICBjYXNlIDI6IAotICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDIxOiBicmVhazsKLSAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDIyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDIzOiBicmVhazsKLSAgICAgICAgY2FzZSAxOiAKLSAgICAgICAgICB7IGlmKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO30KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDY6IAotICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDI1OiBicmVhazsKLSAgICAgICAgY2FzZSA1OiAKLSAgICAgICAgICB7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDI2OiBicmVhazsKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDI3OiBicmVhazsKLSAgICAgICAgY2FzZSA0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjg6IGJyZWFrOwotICAgICAgICBjYXNlIDM6IAotICAgICAgICAgIHsgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgODogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzA6IGJyZWFrOwotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDMyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDMzOiBicmVhazsKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsVmVyc2lvbjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzQ6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoenpJbnB1dCA9PSBZWUVPRiAmJiB6elN0YXJ0UmVhZCA9PSB6ekN1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHp6QXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgenpEb0VPRigpOwotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHp6U2NhbkVycm9yKFpaX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmMjNmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgWE1MSGVhZFRva2VuaXplckNvbnN0YW50cyBleHRlbmRzIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzIHsKLQotCWZpbmFsIFN0cmluZyBYTUxEZWNsRW5kID0gIlhNTERlY2xFbmQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIFhNTERlY2xTdGFydCA9ICJYTUxEZWNsU3RhcnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIFhNTERlbEVuY29kaW5nID0gIlhNTERlbEVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBYTUxEZWNsVmVyc2lvbiA9ICJYTUxEZWNsVmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjEwNzliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjk3MDA2IC0gU3RyaW5nIENvbXBhcmlzb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLQotcHVibGljIGNsYXNzIFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHsKLQlwcml2YXRlIFhNTEhlYWRUb2tlbml6ZXIgZlRva2VuaXplcjsKLQlwcml2YXRlIGJvb2xlYW4gZkRlY2xEZXRlY3RlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSW5pdGlhbFdoaXRlU3BhY2UgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0oU3RyaW5nIHRva2VuVHlwZSkgewotCQlib29sZWFuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IGZhbHNlOwotCQlpZiAoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NLmVxdWFscyh0b2tlblR5cGUpKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0VVRGODNCeXRlQk9NVXNlZCh0cnVlKTsKLQkJfQotCQllbHNlIGlmIChFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFLmVxdWFscyh0b2tlblR5cGUpIHx8IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEUuZXF1YWxzKHRva2VuVHlwZSkpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkJCWJ5dGVbXSBib20gPSAoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRS5lcXVhbHModG9rZW5UeXBlKSkgPyBJQ29udGVudERlc2NyaXB0aW9uLkJPTV9VVEZfMTZCRSA6IElDb250ZW50RGVzY3JpcHRpb24uQk9NX1VURl8xNkxFOwotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRVbmljb2RlU3RyZWFtKHRydWUpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRVbmljb2RlQk9NKGJvbSk7Ci0JCX0KLQkJcmV0dXJuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIFVURi04IGFzIHBlciBYTUwgc3BlYwotCQlmaW5hbCBTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdG9rZW5pemVyLgotCSAqLwotCXByaXZhdGUgWE1MSGVhZFRva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gd29yayBvbiAncmVzZXQnIGluIHRva2VuaXplciwgc28gbmV3IGluc3RhbmNlIGlzbid0Ci0JCS8vIGFsd2F5cyBuZWVkZWQKLQkJLy8gaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQlmVG9rZW5pemVyID0gbmV3IFhNTEhlYWRUb2tlbml6ZXIoKTsKLQkJLy8gfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNMZWdhbFN0cmluZyhTdHJpbmcgdmFsdWVUb2tlblR5cGUpIHsKLQkJaWYgKHZhbHVlVG9rZW5UeXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UKLQkJCXJldHVybiB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlYTUxIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQl0b2tlbml6ZXIucmVzZXQoZlJlYWRlcik7Ci0JCUhlYWRQYXJzZXJUb2tlbiB0b2tlbiA9IG51bGw7Ci0JCVN0cmluZyB0b2tlblR5cGUgPSBudWxsOwotCQlkbyB7Ci0JCQl0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCXRva2VuVHlwZSA9IHRva2VuLmdldFR5cGUoKTsKLQotCQkJLy8gaGFuZGxlIHhtbCBjb250ZW50IHR5cGUgZGV0ZWN0aW9uCi0JCQlpZiAodG9rZW5UeXBlID09IFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0KSB7Ci0JCQkJZkRlY2xEZXRlY3RlZCA9IHRydWU7Ci0JCQkJU3RyaW5nIGRlY2xUZXh0ID0gdG9rZW4uZ2V0VGV4dCgpOwotCQkJCWlmIChkZWNsVGV4dC5zdGFydHNXaXRoKCI8PyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZkluaXRpYWxXaGl0ZVNwYWNlID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmSW5pdGlhbFdoaXRlU3BhY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaGFuZGxlIGVuY29kaW5nIGRldGVjdGlvbgotCQkJaWYgKGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSh0b2tlblR5cGUpKSB7Ci0JCQkJLy8gc2lkZSBlZmZlY3Qgb2YgY2FuSGFuZGxlIGlzIHRvIGNyZWF0ZSBhcHByb3ByaWF0ZSBtZW1lbnRvCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAodG9rZW5UeXBlID09IFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2RpbmcpIHsKLQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQkJdG9rZW5UeXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCQkJCQkJaWYgKGlzTGVnYWxTdHJpbmcodG9rZW5UeXBlKSkgewotCQkJCQkJCVN0cmluZyBlbmMgPSB0b2tlbi5nZXRUZXh0KCk7Ci0JCQkJCQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkZPVU5EX0VOQ09ESU5HX0lOX0NPTlRFTlQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlY2xEZXRlY3RlZCgpIHsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQl0cnkgewotCQkJCXBhcnNlSW5wdXQoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZkRlY2xEZXRlY3RlZCA9IGZhbHNlOwotCQkJfQotCQkJLy8gd2Uga2VlcCB0cmFjayBvZiBpZiBoZWFkZXIncyBhbHJlYWR5IGJlZW4KLQkJCS8vIHBhcnNlLCBzbyBjYW4gbWFrZQotCQkJLy8gbXVsdGlwbGUgJ2dldCcgY2FsbHMsIHdpdGhvdXQgY2F1c2luZwotCQkJLy8gcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCX0KLQkJLy8gZkRlY2xEZXRlY3RlZCBpcyBzZXQgYXMgcGFydCBvZiBwYXJzaW5nLgotCQlyZXR1cm4gZkRlY2xEZXRlY3RlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNJbml0aWFsV2hpdGVTcGFjZSgpIHsKLQkJcmV0dXJuIGZJbml0aWFsV2hpdGVTcGFjZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldEFsbCgpIHsKLQkgICAgc3VwZXIucmVzZXRBbGwoKTsKLQkJZkRlY2xEZXRlY3RlZCA9IGZhbHNlOwotCQlmSW5pdGlhbFdoaXRlU3BhY2UgPSBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0F0dHJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0F0dHJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMGFmMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9BdHRySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTY5OTkgLSBJbmVmZmljaWVudCB1c2Ugb2YgbmV3IFN0cmluZygpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MQ2hhckVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVhNTE5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0KLS8qKgotICogQXR0ckltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIEF0dHJJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBJRE9NQXR0ciB7Ci0KLQlwcml2YXRlIElUZXh0UmVnaW9uIGVxdWFsUmVnaW9uID0gbnVsbDsKLQotCXByaXZhdGUgY2hhcltdIGZOYW1lID0gbnVsbDsKLQlwcml2YXRlIElUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBudWxsOwotCXByaXZhdGUgRWxlbWVudEltcGwgb3duZXJFbGVtZW50ID0gbnVsbDsKLQlwcml2YXRlIElUZXh0UmVnaW9uIGZWYWx1ZVJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBjaGFyW10gZlZhbHVlU291cmNlID0gbnVsbDsKLQlwcml2YXRlIGNoYXJbXSBmTmFtZXNwYWNlVVJJID0gbnVsbDsKLQotCS8qKgotCSAqIEF0dHJJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEF0dHJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEF0dHJJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIEF0dHJJbXBsCi0JICovCi0JcHJvdGVjdGVkIEF0dHJJbXBsKEF0dHJJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5mTmFtZSA9IHRoYXQuZk5hbWU7Ci0JCQlTdHJpbmcgdmFsdWVTb3VyY2UgPSB0aGF0LmdldFZhbHVlU291cmNlKCk7Ci0JCQlpZiAodmFsdWVTb3VyY2UgIT0gbnVsbCkKLQkJCQl0aGlzLmZWYWx1ZVNvdXJjZSA9IHZhbHVlU291cmNlLnRvQ2hhckFycmF5KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlBdHRySW1wbCBjbG9uZWQgPSBuZXcgQXR0ckltcGwodGhpcyk7Ci0JCW5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVELCBjbG9uZWQpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKCkgewotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBnZXRPd25lckVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IGVsZW1lbnQuZ2V0RGVjbGFyYXRpb24oKTsKLQkJaWYgKGVsZW1lbnREZWNsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlMaXN0IG5vZGVzID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShnZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoZ2V0T3duZXJFbGVtZW50KCksIGVsZW1lbnREZWNsLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgbm9kZXMuZ2V0KGspOwotCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04gJiYgbmFtZS5lcXVhbHMoY21ub2RlLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0RW5kT2Zmc2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCWludCBvZmZzZXQgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQlpZiAodGhpcy5mVmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIChvZmZzZXQgKyB0aGlzLmZWYWx1ZVJlZ2lvbi5nZXRFbmQoKSk7Ci0JCX0KLQkJaWYgKHRoaXMuZXF1YWxSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIChvZmZzZXQgKyB0aGlzLmVxdWFsUmVnaW9uLmdldEVuZCgpKTsKLQkJfQotCQlpZiAodGhpcy5uYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiAob2Zmc2V0ICsgdGhpcy5uYW1lUmVnaW9uLmdldEVuZCgpKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRFcXVhbFJlZ2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZXF1YWxSZWdpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0JCWlmICh0aGlzLmZOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGluZGV4ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKHRoaXMuZk5hbWUsICc6Jyk7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLmZOYW1lKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmcodGhpcy5mTmFtZSwgaW5kZXggKyAxLCB0aGlzLmZOYW1lLmxlbmd0aCAtIGluZGV4IC0gMSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmICh0aGlzLmZOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLmZOYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lUmVnaW9uOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TmFtZVJlZ2lvbkVuZE9mZnNldCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJLy8gYXNzdW1pbmcgdGhlIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIHRoZSBvbmUgdGhhdCBjb250YWlucwotCQkvLyBhdHRyaWJ1dGVzCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHRoaXMubmFtZVJlZ2lvbik7Ci0JfQotCi0JcHVibGljIGludCBnZXROYW1lUmVnaW9uU3RhcnRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCS8vIGFzc3VtaW5nIHRoZSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyB0aGUgb25lIHRoYXQgY29udGFpbnMKLQkJLy8gYXR0cmlidXRlcwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHRoaXMubmFtZVJlZ2lvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lUmVnaW9uVGV4dCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gYXNzdW1pbmcgdGhlIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIHRoZSBvbmUgdGhhdCBjb250YWlucwotCQkvLyBhdHRyaWJ1dGVzCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dCh0aGlzLm5hbWVSZWdpb24pOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TmFtZVJlZ2lvblRleHRFbmRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCS8vIGFzc3VtaW5nIHRoZSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyB0aGUgb25lIHRoYXQgY29udGFpbnMKLQkJLy8gYXR0cmlidXRlcwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQodGhpcy5uYW1lUmVnaW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLQkJU3RyaW5nIG5zQXR0ck5hbWUgPSBudWxsOwotCQlTdHJpbmcgcHJlZml4ID0gZ2V0UHJlZml4KCk7Ci0JCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAocHJlZml4LmVxdWFscyhJWE1MTmFtZXNwYWNlLlhNTE5TKSkgewotCQkJCS8vIGZpeGVkIFVSSQotCQkJCXJldHVybiBJWE1MTmFtZXNwYWNlLlhNTE5TX1VSSTsKLQkJCX0KLQkJCWVsc2UgaWYgKHByZWZpeC5lcXVhbHMoSVhNTE5hbWVzcGFjZS5YTUwpKSB7Ci0JCQkJLy8gZml4ZWQgVVJJCi0JCQkJcmV0dXJuIElYTUxOYW1lc3BhY2UuWE1MX1VSSTsKLQkJCX0KLQotCQkJbnNBdHRyTmFtZSA9IElYTUxOYW1lc3BhY2UuWE1MTlNfUFJFRklYICsgcHJlZml4OwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JCQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUuZXF1YWxzKElYTUxOYW1lc3BhY2UuWE1MTlMpKSB7Ci0JCQkJLy8gZml4ZWQgVVJJCi0JCQkJcmV0dXJuIElYTUxOYW1lc3BhY2UuWE1MTlNfVVJJOwotCQkJfQotCQkJLy8gZG9lcyBub3QgaW5oZXJpdCBuYW1lc3BhY2UgZnJvbSBvd25lciBlbGVtZW50Ci0JCQkvLyBpZiAodGhpcy5vd25lckVsZW1lbnQgIT0gbnVsbCkgcmV0dXJuCi0JCQkvLyB0aGlzLm93bmVyRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQkJCWlmICh0aGlzLmZOYW1lc3BhY2VVUkkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBuZXcgU3RyaW5nKHRoaXMuZk5hbWVzcGFjZVVSSSk7Ci0JCX0KLQotCQlmb3IgKE5vZGUgbm9kZSA9IHRoaXMub3duZXJFbGVtZW50OyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJYnJlYWs7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuc0F0dHJOYW1lKTsKLQkJCWlmIChhdHRyICE9IG51bGwpCi0JCQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLQkJfQotCi0JCWlmICh0aGlzLmZOYW1lc3BhY2VVUkkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLmZOYW1lc3BhY2VVUkkpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIEFUVFJJQlVURV9OT0RFOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0T3duZXJFbGVtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXB1YmxpYyBFbGVtZW50IGdldE93bmVyRWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXJFbGVtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlpZiAodGhpcy5mTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBpbmRleCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZih0aGlzLmZOYW1lLCAnOicpOwotCQlpZiAoaW5kZXggPD0gMCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBleGNsdWRlIEpTUCB0YWcgaW4gbmFtZQotCQlpZiAodGhpcy5mTmFtZVswXSA9PSAnPCcpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBTdHJpbmcodGhpcy5mTmFtZSwgMCwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIGdldFNwZWNpZmllZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRTcGVjaWZpZWQoKSB7Ci0JCS8vIGlmIHRoZXJlIGlzIG5vIHVuZGVybHlpbmcgZG9jdW1lbnQgcmVnaW9uLCAKLQkJLy8gdGhlbiB0aGlzIGF0dHJpYnV0ZXMgdmFsdWUgaGFzIG5vdCByZWFsbHkgYmUgc3BlY2lmaWVkCi0JCS8vIHlldCBpbiB0aGUgZG9jdW1lbnQsIGFuZCBhbnkgcmV0dXJuZWQgdmFsdWVzLCBzdWNoIGFzIAotCQkvLyBhbiBlbXB0eSBzdHJpbmcgb3IgYSBkZWZhdWx0IHZhbHVlIGFyZSBiZWluZyBzdXBwbGllZAotCQkvLyBhcyBwZXIgc3BlYywgbm90IHBlciB3aGF0J3MgaW4gdGhlIHVzZXJzIGRvY3VtZW50LgotCQlyZXR1cm4gdGhpcy5mVmFsdWVSZWdpb24gIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTdGFydE9mZnNldCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCWludCBvZmZzZXQgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQlpZiAodGhpcy5uYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiAob2Zmc2V0ICsgdGhpcy5uYW1lUmVnaW9uLmdldFN0YXJ0KCkpOwotCQl9Ci0JCWlmICh0aGlzLmVxdWFsUmVnaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiAob2Zmc2V0ICsgdGhpcy5lcXVhbFJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJfQotCQlpZiAodGhpcy5mVmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIChvZmZzZXQgKyB0aGlzLmZWYWx1ZVJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gZ2V0VmFsdWUoZ2V0VmFsdWVTb3VyY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB2YWx1ZSBmb3IgdGhlIHNvdXJjZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFZhbHVlKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJaWYgKHNvdXJjZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIHNvdXJjZTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpbnQgcmVmID0gc291cmNlLmluZGV4T2YoJyYnKTsKLQkJd2hpbGUgKHJlZiA+PSAwKSB7Ci0JCQlpbnQgZW5kID0gc291cmNlLmluZGV4T2YoJzsnLCByZWYgKyAxKTsKLQkJCWlmIChlbmQgPiByZWYgKyAxKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBzb3VyY2Uuc3Vic3RyaW5nKHJlZiArIDEsIGVuZCk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gZ2V0Q2hhclZhbHVlKG5hbWUpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKLQkJCQkJaWYgKHJlZiA+IG9mZnNldCkKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhvZmZzZXQsIHJlZikpOwotCQkJCQlidWZmZXIuYXBwZW5kKHZhbHVlKTsKLQkJCQkJb2Zmc2V0ID0gZW5kICsgMTsKLQkJCQkJcmVmID0gZW5kOwotCQkJCX0KLQkJCX0KLQkJCXJlZiA9IHNvdXJjZS5pbmRleE9mKCcmJywgcmVmICsgMSk7Ci0JCX0KLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIHNvdXJjZTsKLQkJaWYgKGxlbmd0aCA+IG9mZnNldCkKLQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhvZmZzZXQpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRWYWx1ZVJlZ2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZlZhbHVlUmVnaW9uOwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB3aGF0IHNob3VsZCBiZWhhdmlvciBiZSBpZiB0aGlzLnZhbHVlID09IG51bGw/IEl0J3MgYW4gImVycm9yIgotCSAqIHRvIGJlIGluIHRoYXQgc3RhdGUsIGJ1dCBzZWVtcyB0byBvY2N1ciByZWxhdGl2ZWx5IGVhc2lseSAuLi4gcHJvYmFibHkKLQkgKiBkdWUgdG8gdGhyZWFkaW5nIGJ1Z3MgLi4uIGJ1dCB0aGlzIGp1c3Qgc2hvd3MgaXRzIG5lZWRzIHRvIGJlIHNwZWMnZC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCS8vIGFzc3VtaW5nIHRoZSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyB0aGUgb25lIHRoYXQgY29udGFpbnMKLQkJLy8gdGhlIHZhbHVlUmVnaW9uIC0tIHNob3VsZCBtYWtlIHNtYXJ0ZXI/Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCS8vIGVuc3VyZSB3ZSBuZXZlciBwYXNzIG51bGwgdG8gZ2V0U3RhcnRPZmZzZXQuCi0JCWlmICh0aGlzLmZWYWx1ZVJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHRoaXMuZlZhbHVlUmVnaW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlUmVnaW9uVGV4dCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gYXNzdW1pbmcgdGhlIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIHRoZSBvbmUgdGhhdCBjb250YWlucwotCQkvLyBhdHRyaWJ1dGVzCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5mVmFsdWVSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dCh0aGlzLmZWYWx1ZVJlZ2lvbik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVNvdXJjZSgpIHsKLQkJaWYgKHRoaXMuZlZhbHVlU291cmNlICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLmZWYWx1ZVNvdXJjZSk7Ci0JCS8vIERXOiA0LzE2LzIwMDMgZHVlIHRvIGNoYW5nZSBpbiBzdHJ1Y3R1cmVkRG9jdW1lbnQgLi4uIHdlIG5lZWQgYQotCQkvLyBmbGF0bm9kZSB0bwotCQkvLyBnZXQgYXQgcmVnaW9uIHZhbHVlcy4gRm9yIG5vdyBJJ2xsIGFzc3VtZSB0aGlzIGlzIGFsd2F5cyB0aGUgZmlyc3QKLQkJLy8gZmxhdG5vZGUgLi4gbWF5IG5lZWQgdG8gbWFrZSBzbWFydGVyIGxhdGVyIChlLmcuIHRvIHNlYXJjaCBmb3IKLQkJLy8gdGhlIGZsYXRub2RlIHRoYXQgdGhpcy52YWx1ZVJlZ2lvbiBiZWxvbmdzIHRvLgotCQkvLyBEVzogNC8zMC8yMDAzIEZvciBzb21lIHJlYXNvbiwgdGhpcyBtZXRob2QgaXMgZ2V0dGluZyBjYWxsZWQgYSBsb3QKLQkJLy8gTm90IHN1cmUgaWYgaXRzIGEgdGhyZWFkaW5nIHByb2JsZW0sIG9yIGEgZnVuZGFtZW50YWwgZXJyb3IKLQkJLy8gZWxzZXdoZXJlLgotCQkvLyBJdCBuZWVkcyBtb3JlIGludmVzdGlnYXRpb24sIGJ1dCBpbiB0aGUgdXNlIGNhc2VzIEkndmUgc2VlbiwKLQkJLy8gZG9lc24ndAotCQkvLyBzZWVtIHRvIGh1cnQgdG8gc2ltcGx5IHJldHVybiBudWxsIGluIHRob3NlIGNhc2VzLiBJIHNhdyB0aGlzIG51bGwKLQkJLy8gY2FzZSwKLQkJLy8gd2hlbiB0cnlpbmcgZ28gZm9ybWF0IGFuIFhNTCBmaWxlLgotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvL2F0dHJpYnV0ZSB2YWx1ZXMgd2lsbCBhbHdheXMgYmUgaW4gdGhlIHN0YXJ0IHJlZ2lvbgotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG93bmVyUmVnaW9uID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKG93bmVyUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMuZlZhbHVlUmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUob3duZXJSZWdpb24sIHRoaXMuZlZhbHVlUmVnaW9uKTsKLQkJcmV0dXJuIE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRWYWx1ZVNvdXJjZShFbGVtZW50SW1wbCBvd25lckVsZW1lbnQpIHsKLQkJaWYgKHRoaXMuZlZhbHVlU291cmNlICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLmZWYWx1ZVNvdXJjZSk7Ci0JCS8vIERXOiA0LzE2LzIwMDMgZHVlIHRvIGNoYW5nZSBpbiBzdHJ1Y3R1cmVkRG9jdW1lbnQgLi4uIHdlIG5lZWQgYQotCQkvLyBmbGF0bm9kZSB0bwotCQkvLyBnZXQgYXQgcmVnaW9uIHZhbHVlcy4gRm9yIG5vdyBJJ2xsIGFzc3VtZSB0aGlzIGlzIGFsd2F5cyB0aGUgZmlyc3QKLQkJLy8gZmxhdG5vZGUgLi4gbWF5IG5lZWQgdG8gbWFrZSBzbWFydGVyIGxhdGVyIChlLmcuIHRvIHNlYXJjaCBmb3IKLQkJLy8gdGhlIGZsYXRub2RlIHRoYXQgdGhpcy52YWx1ZVJlZ2lvbiBiZWxvbmdzIHRvLgotCQlpZiAodGhpcy5mVmFsdWVSZWdpb24gIT0gbnVsbCkKLQkJCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEF0dHJWYWx1ZShvd25lckVsZW1lbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIHRoaXMuZlZhbHVlUmVnaW9uKTsKLQkJcmV0dXJuIE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRWYWx1ZVNvdXJjZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotCQlpbnQgYW1wID0gdmFsdWUuaW5kZXhPZignJicpOwotCQl3aGlsZSAoYW1wID49IDApIHsKLQkJCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDQpOwotCQkJaWYgKGFtcCA+IG9mZnNldCkKLQkJCQlidWZmZXIuYXBwZW5kKHZhbHVlLnN1YnN0cmluZyhvZmZzZXQsIGFtcCkpOwotCQkJYnVmZmVyLmFwcGVuZChJWE1MQ2hhckVudGl0eS5BTVBfUkVGKTsKLQkJCW9mZnNldCA9IGFtcCArIDE7Ci0JCQlhbXAgPSB2YWx1ZS5pbmRleE9mKCcmJywgb2Zmc2V0KTsKLQkJfQotCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCWlmIChsZW5ndGggPiBvZmZzZXQpCi0JCQlidWZmZXIuYXBwZW5kKHZhbHVlLnN1YnN0cmluZyhvZmZzZXQpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIEF0dHIgaGFzIEpTUCBpbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05lc3RlZFZhbHVlKCkgewotCQlpZiAodGhpcy5mVmFsdWVSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCEodGhpcy5mVmFsdWVSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgdGhpcy5mVmFsdWVSZWdpb24pLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gfHwgaXNOZXN0ZWRMYW5ndWFnZU9wZW5pbmcocmVnaW9uVHlwZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIEF0dHIgaGFzIG9ubHkgbmFtZSBidXQgbm90IGVxdWFsIHNpZ24gbm9yIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTmFtZU9ubHkoKSB7Ci0JCXJldHVybiAodGhpcy5uYW1lUmVnaW9uICE9IG51bGwgJiYgdGhpcy5lcXVhbFJlZ2lvbiA9PSBudWxsICYmIHRoaXMuZlZhbHVlUmVnaW9uID09IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc1ByZWZpeCgpIHsKLQkJaWYgKHRoaXMuZk5hbWUgPT0gbnVsbCB8fCB0aGlzLmZOYW1lLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5pbmRleE9mKHRoaXMuZk5hbWUsICc6JykgPiAwICYmIHRoaXMuZk5hbWVbMF0gIT0gJzwnOwotCX0KLQkKLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpZ25vcmVDYXNlKCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMub3duZXJFbGVtZW50Lmlnbm9yZUNhc2UoKSkgewotCQkJCXJldHVybiAhaGFzUHJlZml4KCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5pZ25vcmVDYXNlKCkpIHsKLQkJCQkvLyBldmVuIGluIGNhc2UgaW5zZW5zaXRpdmUgZG9jdW1lbnQsIGlmIGhhdmluZyBwcmVmaXgsIGl0J3MKLQkJCQkvLyBjYXNlIHNlbnNpdGl2ZQotCQkJCXJldHVybiAhaGFzUHJlZml4KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2xvYmFsQXR0cigpIHsKLQkJaWYgKGhhc1ByZWZpeCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRoaXMub3duZXJFbGVtZW50LmlzR2xvYmFsVGFnKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNYTUxBdHRyKCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKCF0aGlzLm93bmVyRWxlbWVudC5pc1hNTFRhZygpKSB7Ci0JCQkJcmV0dXJuIGhhc1ByZWZpeCgpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgIWRvY3VtZW50LmlzWE1MVHlwZSgpKSB7Ci0JCQkJLy8gZXZlbiBpbiBub24tWE1MIGRvY3VtZW50LCBpZiBoYXZpbmcgcHJlZml4LCBpdCdzIFhNTCB0YWcKLQkJCQlyZXR1cm4gaGFzUHJlZml4KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogbWF0Y2hOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gKHRoaXMuZk5hbWUgPT0gbnVsbCk7Ci0JCWlmICh0aGlzLmZOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLmZOYW1lLCBuYW1lLnRvQ2hhckFycmF5KCksIGlnbm9yZUNhc2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hOYW1lKGNoYXJbXSBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gKHRoaXMuZk5hbWUgPT0gbnVsbCk7Ci0JCWlmICh0aGlzLmZOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBDaGFyT3BlcmF0aW9uLmVxdWFscyh0aGlzLmZOYW1lLCBuYW1lLCBpZ25vcmVDYXNlKCkpOwotCX0KLQotCi0JLyoqCi0JICogbm90aWZ5VmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeU5hbWVDaGFuZ2VkKCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgdGhpcy5vd25lckVsZW1lbnQuZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5uYW1lQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBub3RpZnlWYWx1ZUNoYW5nZWQgbWV0aG9kCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5VmFsdWVDaGFuZ2VkKCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgdGhpcy5vd25lckVsZW1lbnQuZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC52YWx1ZUNoYW5nZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlUmVnaW9ucyBtZXRob2QKLQkgKi8KLQl2b2lkIHJlbW92ZVJlZ2lvbnMoKSB7Ci0JCXRoaXMubmFtZVJlZ2lvbiA9IG51bGw7Ci0JCXRoaXMuZlZhbHVlUmVnaW9uID0gbnVsbDsKLQkJdGhpcy5lcXVhbFJlZ2lvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFJlZ2lvbnMoKSB7Ci0JCXRoaXMuZlZhbHVlU291cmNlID0gZ2V0VmFsdWVTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlyZW1vdmVSZWdpb25zKCk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFJlZ2lvbnMoRWxlbWVudEltcGwgb3duZXJFbGVtZW50KSB7Ci0JCXRoaXMuZlZhbHVlU291cmNlID0gZ2V0VmFsdWVTb3VyY2Uob3duZXJFbGVtZW50KS50b0NoYXJBcnJheSgpOwotCQlyZW1vdmVSZWdpb25zKCk7Ci0JfQotCi0Jdm9pZCBzZXRFcXVhbFJlZ2lvbihJVGV4dFJlZ2lvbiBlcXVhbFJlZ2lvbikgewotCQl0aGlzLmVxdWFsUmVnaW9uID0gZXF1YWxSZWdpb247Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ICE9IG51bGwpIHsKLQkJCXZhbHVlID0gZ2V0VmFsdWUoKTsKLQkJCXN0YXJ0T2Zmc2V0ID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCXRoaXMub3duZXJFbGVtZW50Lm5vdGlmeShSRU1PVkUsIHRoaXMsIHZhbHVlLCBudWxsLCBzdGFydE9mZnNldCk7Ci0JCX0KLQkJdGhpcy5mTmFtZSA9IENoYXJhY3RlclN0cmluZ1Bvb2wuZ2V0Q2hhclN0cmluZyhuYW1lKTsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ICE9IG51bGwpIHsKLQkJCXRoaXMub3duZXJFbGVtZW50Lm5vdGlmeShBREQsIHRoaXMsIG51bGwsIHZhbHVlLCBzdGFydE9mZnNldCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHNldE5hbWVSZWdpb24oSVRleHRSZWdpb24gbmFtZVJlZ2lvbikgewotCQl0aGlzLm5hbWVSZWdpb24gPSBuYW1lUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCWlmIChuYW1lc3BhY2VVUkkgPT0gbnVsbCkKLQkJCXRoaXMuZk5hbWVzcGFjZVVSSSA9IG51bGw7Ci0JCWVsc2UKLQkJCXRoaXMuZk5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSS50b0NoYXJBcnJheSgpOwotCX0KLQotCS8qKgotCSAqIHNldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZVZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZVZhbHVlKFN0cmluZyBub2RlVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXRWYWx1ZShub2RlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIHNldE93bmVyRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJFbGVtZW50KEVsZW1lbnQgb3duZXJFbGVtZW50KSB7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvd25lckVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgIT0gbnVsbCAmJiAhdGhpcy5vd25lckVsZW1lbnQuaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0JCWludCBwcmVmaXhMZW5ndGggPSAocHJlZml4ICE9IG51bGwgPyBwcmVmaXgubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nIGxvY2FsTmFtZSA9IGdldExvY2FsTmFtZSgpOwotCQlpZiAocHJlZml4TGVuZ3RoID09IDApIHsKLQkJCXNldE5hbWUobG9jYWxOYW1lKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobG9jYWxOYW1lID09IG51bGwpCi0JCQlsb2NhbE5hbWUgPSBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCWludCBsb2NhbExlbmd0aCA9IGxvY2FsTmFtZS5sZW5ndGgoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocHJlZml4TGVuZ3RoICsgMSArIGxvY2FsTGVuZ3RoKTsKLQkJYnVmZmVyLmFwcGVuZChwcmVmaXgpOwotCQlidWZmZXIuYXBwZW5kKCc6Jyk7Ci0JCWJ1ZmZlci5hcHBlbmQobG9jYWxOYW1lKTsKLQkJc2V0TmFtZShidWZmZXIudG9TdHJpbmcoKSk7Ci0KLQkJbm90aWZ5TmFtZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJLy8gUmVtZW1iZXI6IGFzIHdlIGFjY291bnQgZm9yICJmbG9hdGVycyIgaW4KLQkJLy8gZnV0dXJlLCByZW1lbWJlciB0aGF0IHNvbWUgYXJlIGNyZWF0ZWQKLQkJLy8gaW4gdGhlIG5hdHVyYWwgcHJvY2VzcyBvZiBpbXBsZW1lbnRpbmcKLQkJLy8gRE9NIGFwaXMuCi0JCS8vIHRoaXMgInNlbGYgbm90aWZpY2F0aW9uIiBvZiBhYm91dC9jaGFuZ2VkLAotCQkvLyBpcyBhZGRlZCBmb3IgdGhpcyBjYXNlLCBiZWNhdXNlIGl0IGtub3duIHRvCi0JCS8vIGJlIGNhbGxlZCBmcm9tIHByb3BlcnRpZXMgcGFnZXMuIFNob3VsZCBiZSBhCi0JCS8vIGFkZGVkIHRvIGFsbCBET00gTW9kaWZpeWluZyBBUElzIGV2ZW50dWFsbHkuCi0JCXRyeSB7Ci0JCQlnZXRNb2RlbCgpLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJc2V0VmFsdWVTb3VyY2UoZ2V0VmFsdWVTb3VyY2UodmFsdWUpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWdldE1vZGVsKCkuY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHNldFZhbHVlUmVnaW9uKElUZXh0UmVnaW9uIHZhbHVlUmVnaW9uKSB7Ci0JCXRoaXMuZlZhbHVlUmVnaW9uID0gdmFsdWVSZWdpb247Ci0JCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKQotCQkJdGhpcy5mVmFsdWVTb3VyY2UgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlU291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ICE9IG51bGwgJiYgIXRoaXMub3duZXJFbGVtZW50LmlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCQl0aGlzLmZWYWx1ZVNvdXJjZSA9IChzb3VyY2UgIT0gbnVsbCkgPyBzb3VyY2UudG9DaGFyQXJyYXkoKSA6IG51bGw7Ci0KLQkJbm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlCi0JICogCi0JICogQHBhcmFtIHJlZ2lvblR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRMYW5ndWFnZU9wZW5pbmcoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NEQVRBU2VjdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ0RBVEFTZWN0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTNhZDU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ0RBVEFTZWN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTY5OTkgLSBJbmVmZmljaWVudCB1c2Ugb2YgbmV3IFN0cmluZygpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotCi0vKioKLSAqIENEQVRBU2VjdGlvbkltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIENEQVRBU2VjdGlvbkltcGwgZXh0ZW5kcyBUZXh0SW1wbCBpbXBsZW1lbnRzIENEQVRBU2VjdGlvbiB7Ci0KLQkvKioKLQkgKiBDREFUQVNlY3Rpb25JbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIENEQVRBU2VjdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ0RBVEFTZWN0aW9uSW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBDREFUQVNlY3Rpb25JbXBsCi0JICovCi0JcHJvdGVjdGVkIENEQVRBU2VjdGlvbkltcGwoQ0RBVEFTZWN0aW9uSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ0RBVEFTZWN0aW9uSW1wbCBjbG9uZWQgPSBuZXcgQ0RBVEFTZWN0aW9uSW1wbCh0aGlzKTsKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gaW5zdGVhZCBvZiBzdXBlcihUZXh0SW1wbCkuZ2V0RGF0YSgpLCBjYWxsIGdldENoYXJhY3RlckRhdGEoKQotCQljaGFyW10gZGF0YSA9IGdldENoYXJhY3RlckRhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJU3RyaW5nIHNkYXRhID0gZ2V0RGF0YShnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCQlpZiAoc2RhdGEgIT0gbnVsbCkKLQkJCQlyZXR1cm4gc2RhdGE7Ci0JCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKGRhdGEpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERhdGEoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlUZXh0UmVnaW9uIGNvbnRlbnRSZWdpb24gPSBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTiB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoY29udGVudFJlZ2lvbiA9PSBudWxsKSB7IC8vIGZpcnN0IGNvbnRlbnQKLQkJCQljb250ZW50UmVnaW9uID0gcmVnaW9uOwotCQkJfSBlbHNlIHsgLy8gbXVsdGlwbGUgY29udGVudHMKLQkJCQlpZiAoYnVmZmVyID09IG51bGwpIHsKLQkJCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihmbGF0Tm9kZS5nZXRUZXh0KGNvbnRlbnRSZWdpb24pKTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbikpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGJ1ZmZlciAhPSBudWxsKQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQlpZiAoY29udGVudFJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHQoY29udGVudFJlZ2lvbik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiAiI2NkYXRhLXNlY3Rpb24iOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ0RBVEFfU0VDVElPTl9OT0RFOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIHdpbGwgYmUgZ2VuZXJhdGVkCi0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCXJldHVybiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DTU5vZGVVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NNTm9kZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU1MzNhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NNTm9kZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ01Ob2RlVXRpbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oQXR0ciBhdHRyKSB7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuICgoQXR0ckltcGwpIGF0dHIpLmdldERlY2xhcmF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuICgoRWxlbWVudEltcGwpIGVsZW1lbnQpLmdldERlY2xhcmF0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DaGFyT3BlcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NoYXJPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ0NmJkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NoYXJPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50Ow0KLQ0KLWNsYXNzIENoYXJPcGVyYXRpb24gew0KLQ0KLQlwcml2YXRlIENoYXJPcGVyYXRpb24oKSB7DQotCX0NCi0NCi0Jc3RhdGljIGludCBpbmRleE9mKGNoYXJbXSBhcnJheSwgY2hhciBjKSB7DQotCQlyZXR1cm4gaW5kZXhPZihhcnJheSwgYywgMCk7DQotCX0NCi0NCi0Jc3RhdGljIGludCBpbmRleE9mKGNoYXJbXSBhcnJheSwgY2hhciBjLCBpbnQgc3RhcnQpIHsNCi0JCWZvciAoaW50IGkgPSBzdGFydDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7DQotCQkJaWYgKGFycmF5W2ldID09IGMpDQotCQkJCXJldHVybiBpOw0KLQkJfQ0KLQkJcmV0dXJuIC0xOw0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBub3RlOiBUaGlzIG1ldGhvZCB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb24NCi0JICogDQotCSAqIEFuc3dlcnMgdHJ1ZSBpZiB0aGUgdHdvIGFycmF5cyBhcmUgaWRlbnRpY2FsIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIsIG90aGVyd2lzZSBmYWxzZS4NCi0JICogVGhlIGVxdWFsaXR5IGlzIGNhc2Ugc2Vuc2l0aXZlLg0KLQkgKiA8YnI+DQotCSAqIDxicj4NCi0JICogRm9yIGV4YW1wbGU6DQotCSAqIDxvbD4NCi0JICogPGxpPjxwcmU+DQotCSAqICAgIGZpcnN0ID0gbnVsbA0KLQkgKiAgICBzZWNvbmQgPSBudWxsDQotCSAqICAgIHJlc3VsdCA9PiB0cnVlDQotCSAqIDwvcHJlPg0KLQkgKiA8L2xpPg0KLQkgKiA8bGk+PHByZT4NCi0JICogICAgZmlyc3QgPSB7IH0NCi0JICogICAgc2Vjb25kID0gbnVsbA0KLQkgKiAgICByZXN1bHQgPT4gZmFsc2UNCi0JICogPC9wcmU+DQotCSAqIDwvbGk+DQotCSAqIDxsaT48cHJlPg0KLQkgKiAgICBmaXJzdCA9IHsgJ2EnIH0NCi0JICogICAgc2Vjb25kID0geyAnYScgfQ0KLQkgKiAgICByZXN1bHQgPT4gdHJ1ZQ0KLQkgKiA8L3ByZT4NCi0JICogPC9saT4NCi0JICogPGxpPjxwcmU+DQotCSAqICAgIGZpcnN0ID0geyAnYScgfQ0KLQkgKiAgICBzZWNvbmQgPSB7ICdBJyB9DQotCSAqICAgIHJlc3VsdCA9PiBmYWxzZQ0KLQkgKiA8L3ByZT4NCi0JICogPC9saT4NCi0JICogPC9vbD4NCi0JICogQHBhcmFtIGZpcnN0IHRoZSBmaXJzdCBhcnJheQ0KLQkgKiBAcGFyYW0gc2Vjb25kIHRoZSBzZWNvbmQgYXJyYXkNCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSB0d28gYXJyYXlzIGFyZSBpZGVudGljYWwgY2hhcmFjdGVyIGJ5IGNoYXJhY3Rlciwgb3RoZXJ3aXNlIGZhbHNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGNoYXJbXSBmaXJzdCwgY2hhcltdIHNlY29uZCwgYm9vbGVhbiBpZ25vcmVDYXNlKSB7DQotCQlpZiAoZmlyc3QgPT0gc2Vjb25kKQ0KLQkJCXJldHVybiB0cnVlOw0KLQkJaWYgKGZpcnN0ID09IG51bGwgfHwgc2Vjb25kID09IG51bGwpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJaWYgKGZpcnN0Lmxlbmd0aCAhPSBzZWNvbmQubGVuZ3RoKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0NCi0JCWZvciAoaW50IGkgPSBmaXJzdC5sZW5ndGg7IC0taSA+PSAwOykgew0KLQkJCWlmIChpZ25vcmVDYXNlKSB7DQotCQkJCWlmIChDaGFyYWN0ZXIudG9VcHBlckNhc2UoZmlyc3RbaV0pICE9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShzZWNvbmRbaV0pKSB7DQotCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCX0NCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCWlmIChmaXJzdFtpXSAhPSBzZWNvbmRbaV0pIHsNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ2hhcmFjdGVyRGF0YUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ2hhcmFjdGVyRGF0YUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFiOTMxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NoYXJhY3RlckRhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjk2OTk5IC0gSW5lZmZpY2llbnQgdXNlIG9mIG5ldyBTdHJpbmcoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBDaGFyYWN0ZXJEYXRhSW1wbCBjbGFzcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2hhcmFjdGVyRGF0YUltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIENoYXJhY3RlckRhdGEgewotCi0JcHJpdmF0ZSBjaGFyW10gZGF0YSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDaGFyYWN0ZXJEYXRhSW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBDaGFyYWN0ZXJEYXRhSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFyYWN0ZXJEYXRhSW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBDaGFyYWN0ZXJEYXRhSW1wbAotCSAqLwotCXByb3RlY3RlZCBDaGFyYWN0ZXJEYXRhSW1wbChDaGFyYWN0ZXJEYXRhSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMuZGF0YSA9IHRoYXQuZ2V0RGF0YSgpLnRvQ2hhckFycmF5KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhcHBlbmREYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBhcmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmREYXRhKFN0cmluZyBhcmcpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoYXJnID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpCi0JCQlkYXRhID0gYXJnOwotCQllbHNlCi0JCQlkYXRhICs9IGFyZzsKLQkJc2V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBkZWxldGVEYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBjb3VudAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoY291bnQgPT0gMCkKLQkJCXJldHVybjsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlpZiAoY291bnQgPCAwIHx8IG9mZnNldCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCX0KLQotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJaWYgKG9mZnNldCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCQlpZiAob2Zmc2V0ID09IDApIHsKLQkJCWlmIChjb3VudCA+IGxlbmd0aCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCQl9Ci0JCQlpZiAoY291bnQgPT0gbGVuZ3RoKQotCQkJCWRhdGEgPSBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCQllbHNlCi0JCQkJZGF0YSA9IGRhdGEuc3Vic3RyaW5nKGNvdW50KTsKLQkJfSBlbHNlIHsKLQkJCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJCWlmIChlbmQgPiBsZW5ndGgpIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQkJfQotCQkJaWYgKGVuZCA9PSBsZW5ndGgpCi0JCQkJZGF0YSA9IGRhdGEuc3Vic3RyaW5nKDAsIG9mZnNldCk7Ci0JCQllbHNlCi0JCQkJZGF0YSA9IGRhdGEuc3Vic3RyaW5nKDAsIG9mZnNldCkgKyBkYXRhLnN1YnN0cmluZyhlbmQpOwotCQl9Ci0JCXNldERhdGEoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGNoYXJbXSBnZXRDaGFyYWN0ZXJEYXRhKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhOwotCX0KLQotCS8qKgotCSAqIGdldERhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWNoYXJbXSBjZGF0YSA9IGdldENoYXJhY3RlckRhdGEoKTsKLQkJaWYgKGNkYXRhICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZyhjZGF0YSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZGF0YS5sZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoKSB7Ci0JCXJldHVybiBnZXREYXRhKCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gYXJnCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0RGF0YShpbnQgb2Zmc2V0LCBTdHJpbmcgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGFyZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCX0KLQotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJaWYgKG9mZnNldCA+IDApIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQkJfQotCQkJZGF0YSA9IGFyZzsKLQkJfSBlbHNlIGlmIChvZmZzZXQgPT0gMCkgewotCQkJZGF0YSA9IGFyZyArIGRhdGE7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQkJfQotCQkJaWYgKG9mZnNldCA9PSBsZW5ndGgpCi0JCQkJZGF0YSArPSBhcmc7Ci0JCQllbHNlCi0JCQkJZGF0YSA9IGRhdGEuc3Vic3RyaW5nKDAsIG9mZnNldCkgKyBhcmcgKyBkYXRhLnN1YnN0cmluZyhvZmZzZXQpOwotCQl9Ci0JCXNldERhdGEoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogaXNKU1BDb250ZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSlNQQ29udGVudCgpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQlyZXR1cm4gZWxlbWVudC5pc0pTUENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VEYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBjb3VudAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCwgU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJaWYgKGFyZyA9PSBudWxsKSB7Ci0JCQlkZWxldGVEYXRhKG9mZnNldCwgY291bnQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChjb3VudCA9PSAwKSB7Ci0JCQlpbnNlcnREYXRhKG9mZnNldCwgYXJnKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCX0KLQotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfSBlbHNlIGlmIChvZmZzZXQgPT0gMCkgewotCQkJaW50IGxlbmd0aCA9IGRhdGEubGVuZ3RoKCk7Ci0JCQlpZiAoY291bnQgPiBsZW5ndGgpIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQkJfQotCQkJaWYgKGNvdW50ID09IGxlbmd0aCkKLQkJCQlkYXRhID0gYXJnOwotCQkJZWxzZQotCQkJCWRhdGEgPSBhcmcgKyBkYXRhLnN1YnN0cmluZyhjb3VudCk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJCWlmIChlbmQgPiBsZW5ndGgpIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQkJfQotCQkJaWYgKGVuZCA9PSBsZW5ndGgpCi0JCQkJZGF0YSA9IGRhdGEuc3Vic3RyaW5nKDAsIG9mZnNldCkgKyBhcmc7Ci0JCQllbHNlCi0JCQkJZGF0YSA9IGRhdGEuc3Vic3RyaW5nKDAsIG9mZnNldCkgKyBhcmcgKyBkYXRhLnN1YnN0cmluZyhlbmQpOwotCQl9Ci0JCXNldERhdGEoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCXRoaXMuZGF0YSA9IGdldERhdGEoKS50b0NoYXJBcnJheSgpOwotCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JfQotCi0JLyoqCi0JICogc2V0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIGRhdGEpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCi0JCXRoaXMuZGF0YSA9IChkYXRhICE9IG51bGwgPyBkYXRhLnRvQ2hhckFycmF5KCkgOiBudWxsKTsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGVWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0RGF0YShub2RlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQl0aGlzLmRhdGEgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHN1YnN0cmluZ0RhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHN1YnN0cmluZ0RhdGEoaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGNvdW50ID09IDApCi0JCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQlpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCX0KLQotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJaWYgKG9mZnNldCA9PSAwICYmIGNvdW50ID09IGxlbmd0aCkKLQkJCXJldHVybiBkYXRhOwotCQlpZiAob2Zmc2V0ID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQl9Ci0JCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJaWYgKGVuZCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCQlyZXR1cm4gZGF0YS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIHRvU3RyaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0Tm9kZU5hbWUoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQkJYnVmZmVyLmFwcGVuZChnZXREYXRhKCkpOwotCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJ0AnKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZmxhdE5vZGUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ2hhcmFjdGVyU3RyaW5nUG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DaGFyYWN0ZXJTdHJpbmdQb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZGIzODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DaGFyYWN0ZXJTdHJpbmdQb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotCi0vKioKLSAqIE9yZ2FuaXplcyBhIHBvb2wgb2YgZnJlcXVlbnRseSB1c2VkIFN0cmluZ3MgYXMgY2hhcmFjdGVyIGFycmF5cy4KLSAqIAotICovCi1maW5hbCBjbGFzcyBDaGFyYWN0ZXJTdHJpbmdQb29sIHsKLQotCXN0YXRpYyBwcml2YXRlIExpbmtlZEhhc2hNYXAgZlBvb2wgPSBuZXcgTGltaXRlZEhhc2hNYXAoKTsKLQotCXN0YXRpYyBwcml2YXRlIGNsYXNzIExpbWl0ZWRIYXNoTWFwIGV4dGVuZHMgTGlua2VkSGFzaE1hcCB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYID0gNTAwOwotCi0JCXB1YmxpYyBMaW1pdGVkSGFzaE1hcCgpIHsKLQkJCXN1cGVyKE1BWCAvIDEwLCAuNzVmLCB0cnVlKTsKLQkJfQotCQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVFbGRlc3RFbnRyeShqYXZhLnV0aWwuTWFwLkVudHJ5IGVsZGVzdCkgewotCQkJcmV0dXJuIHNpemUoKSA+IE1BWDsKLQkJfQotCX0KLQotCXN0YXRpYyBwcml2YXRlIGNsYXNzIENoYXJBcnJheSB7Ci0JCWNoYXJbXSBmQXJyYXk7Ci0JCS8qKgotCQkgKiBBbnN3ZXJzIGEgaGFzaGNvZGUgZm9yIHRoZSBhcnJheS4gQWxnb3JpdGhtIGZyb20gb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbgotCQkgKgotCQkgKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IGZvciB3aGljaCBhIGhhc2hjb2RlIGlzIHJlcXVpcmVkCi0JCSAqIEByZXR1cm4gdGhlIGhhc2hjb2RlCi0JCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYXJyYXkgaXMgbnVsbAotCQkgKi8KLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCWludCBsZW5ndGggPSBmQXJyYXkubGVuZ3RoOwotCQkJaW50IGhhc2ggPSBsZW5ndGggPT0gMCA/IDMxIDogZkFycmF5WzBdOwotCQkJaWYgKGxlbmd0aCA8IDgpIHsKLQkJCQlmb3IgKGludCBpID0gbGVuZ3RoOyAtLWkgPiAwOykKLQkJCQkJaGFzaCA9IChoYXNoICogMzEpICsgZkFycmF5W2ldOwotCQkJfSBlbHNlIHsKLQkJCQkvLyA4IGNoYXJhY3RlcnMgaXMgZW5vdWdoIHRvIGNvbXB1dGUgYSBkZWNlbnQgaGFzaCBjb2RlLCBkb24ndCB3YXN0ZSB0aW1lIGV4YW1pbmluZyBldmVyeSBjaGFyYWN0ZXIKLQkJCQlmb3IgKGludCBpID0gbGVuZ3RoIC0gMSwgbGFzdCA9IGkgPiAxNiA/IGkgLSAxNiA6IDA7IGkgPiBsYXN0OyBpIC09IDIpCi0JCQkJCWhhc2ggPSAoaGFzaCAqIDMxKSArIGZBcnJheVtpXTsKLQkJCX0KLQkJCXJldHVybiBoYXNoICYgMHg3RkZGRkZGRjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAodGhpcyA9PSBvYmopCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBDaGFyQXJyYXkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCUNoYXJBcnJheSBvdGhlciA9IChDaGFyQXJyYXkpIG9iajsKLQkJCWlmIChmQXJyYXkubGVuZ3RoICE9IG90aGVyLmZBcnJheS5sZW5ndGgpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZkFycmF5W2ldICE9IG90aGVyLmZBcnJheVtpXSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENoYXJhY3RlclN0cmluZ1Bvb2woKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGFycmF5IGZvciA8Y29kZT5zdHJpbmc8L2NvZGU+LiBJZgotCSAqIHRoZSBjaGFyYWN0ZXIgYXJyYXkgaXMgYWxyZWFkeSBpbiB0aGUgcG9vbCBmb3IgY2hhcmFjdGVyIGFycmF5cywKLQkgKiB0aGUgYXJyYXkgaXMgcmV1c2VkLgotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmcgdGhlIHN0cmluZyB0byByZXRyaWV2ZSB0aGUgY2hhcmFjdGVyIGFycmF5IGZvcgotCSAqIEByZXR1cm4gYSBwb29sZWQgaW5zdGFuY2Ugb2YgdGhlIGNoYXJhY3RlciBhcnJheQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGdldENoYXJTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQlDaGFyQXJyYXkgYXJyYXkgPSBuZXcgQ2hhckFycmF5KCk7Ci0JCWFycmF5LmZBcnJheSA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCi0JCU9iamVjdCBvYmogPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKGZQb29sKSB7Ci0JCQlvYmogPSBmUG9vbC5nZXQoYXJyYXkpOwotCQkJaWYgKG9iaiA9PSBudWxsKSB7Ci0JCQkJb2JqID0gYXJyYXk7Ci0JCQkJZlBvb2wucHV0KG9iaiwgb2JqKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKChDaGFyQXJyYXkpIG9iaikuZkFycmF5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Db21tZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Db21tZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTgxN2UwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ29tbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKiAgICAgQmFsYXpzIEJhbmZhaTogQnVnIDE1NDczNyBnZXRVc2VyRGF0YS9zZXRVc2VyRGF0YSBzdXBwb3J0IGZvciBOb2RlCi0gKiAgICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDczNwotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjk2OTk5IC0gSW5lZmZpY2llbnQgdXNlIG9mIG5ldyBTdHJpbmcoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0KLS8qKgotICogQ29tbWVudEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIENvbW1lbnRJbXBsIGV4dGVuZHMgQ2hhcmFjdGVyRGF0YUltcGwgaW1wbGVtZW50cyBDb21tZW50IHsKLQotCXByaXZhdGUgYm9vbGVhbiBpc0pTUFRhZyA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tbWVudEltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29tbWVudEltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgQ29tbWVudEltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWVudEltcGwoQ29tbWVudEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmlzSlNQVGFnID0gdGhhdC5pc0pTUFRhZzsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ29tbWVudEltcGwgY2xvbmVkID0gbmV3IENvbW1lbnRJbXBsKHRoaXMpOwotCQlub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwgY2xvbmVkKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQljaGFyW10gZGF0YSA9IGdldENoYXJhY3RlckRhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJU3RyaW5nIHNkYXRhID0gZ2V0RGF0YShnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCQlpZiAoc2RhdGEgIT0gbnVsbCkKLQkJCQlyZXR1cm4gc2RhdGE7Ci0JCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKGRhdGEpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERhdGEoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlUZXh0UmVnaW9uIGNvbnRlbnRSZWdpb24gPSBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSB8fCBpc05lc3RlZENvbW1lbnRPcGVuQ2xvc2UocmVnaW9uVHlwZSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjb250ZW50UmVnaW9uID09IG51bGwpIHsgLy8gZmlyc3QgY29udGVudAotCQkJCWNvbnRlbnRSZWdpb24gPSByZWdpb247Ci0JCQl9Ci0JCQllbHNlIHsgLy8gbXVsdGlwbGUgY29udGVudHMKLQkJCQlpZiAoYnVmZmVyID09IG51bGwpIHsKLQkJCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihmbGF0Tm9kZS5nZXRUZXh0KGNvbnRlbnRSZWdpb24pKTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbikpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGJ1ZmZlciAhPSBudWxsKQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQlpZiAoY29udGVudFJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHQoY29udGVudFJlZ2lvbik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiAiI2NvbW1lbnQiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ09NTUVOVF9OT0RFOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIHdpbGwgYmUgZ2VuZXJhdGVkCi0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCXJldHVybiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFIHx8IGlzTmVzdGVkQ29tbWVudENsb3NlKHJlZ2lvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUKLQkgKiBAcGFyYW0gcmVnaW9uVHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbW1lbnRDbG9zZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0JLyoqCi0JICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlCi0JICogQHBhcmFtIHJlZ2lvblR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDb21tZW50T3BlbkNsb3NlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQotCXB1YmxpYyBib29sZWFuIGlzSlNQVGFnKCkgewotCQlyZXR1cm4gdGhpcy5pc0pTUFRhZzsKLQl9Ci0KLQkvKioKLQkgKiBzZXRKU1BUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGlzSlNQVGFnCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SlNQVGFnKGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJaWYgKGlzSlNQVGFnID09IHRoaXMuaXNKU1BUYWcpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChpc0pTUFRhZykgewotCQkJaWYgKGRvY3VtZW50ID09IG51bGwgfHwgIWRvY3VtZW50LmlzSlNQVHlwZSgpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCXRoaXMuaXNKU1BUYWcgPSBpc0pTUFRhZzsKLQotCQlpZiAoZ2V0Q29udGFpbmVyRG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkvLyBhbHJlYWR5IGluIHRoZSB0cmVlLCB1cGRhdGUgSVN0cnVjdHVyZWREb2N1bWVudAotCQkJc2V0RGF0YShnZXREYXRhKCkpOyAvLyBjYWxscyBub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwN2JmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKiAgICAgDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7DQotDQotY2xhc3MgRE9NTWVzc2FnZXMgZXh0ZW5kcyBOTFMgew0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRPTU1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlzdGF0aWMgew0KLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRE9NTWVzc2FnZXMuY2xhc3MpOw0KLQl9DQotDQotCXByaXZhdGUgRE9NTWVzc2FnZXMoKSB7DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9NU1RSSU5HX1NJWkVfRVJSOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBISUVSQVJDSFlfUkVRVUVTVF9FUlI7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOREVYX1NJWkVfRVJSOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlVTRV9BVFRSSUJVVEVfRVJSOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX0FDQ0VTU19FUlI7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfQ0hBUkFDVEVSX0VSUjsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX1NUQVRFX0VSUjsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTkFNRVNQQUNFX0VSUjsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTk9fREFUQV9BTExPV0VEX0VSUjsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOT1RfRk9VTkRfRVJSOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOT1RfU1VQUE9SVEVEX0VSUjsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU1lOVEFYX0VSUjsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9NSVNNQVRDSF9FUlI7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fRVJSOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXUk9OR19ET0NVTUVOVF9FUlI7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlYWMyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTU1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1ET01TVFJJTkdfU0laRV9FUlI9RE9NU3RyaW5nIFNpemUgRXJyb3INCi1ISUVSQVJDSFlfUkVRVUVTVF9FUlI9SW52YWxpZCBIaWVyYXJjaHkgUmVxdWVzdA0KLUlOREVYX1NJWkVfRVJSPUluY29ycmVjdCBJbmRleCBFcnJvcg0KLUlOVVNFX0FUVFJJQlVURV9FUlI9QXR0cmlidXRlIE5vZGUgSW4gVXNlIEVycm9yDQotSU5WQUxJRF9BQ0NFU1NfRVJSPUludmFsaWQgQWNjZXNzIEVycm9yDQotSU5WQUxJRF9DSEFSQUNURVJfRVJSPUludmFsaWQgQ2hhcmFjZXIgRXJyb3INCi1JTlZBTElEX01PRElGSUNBVElPTl9FUlI9SW52YWxpZCBNb2RpZmljYXRpb24gRXJyb3INCi1JTlZBTElEX1NUQVRFX0VSUj1JbnZhbGlkIFN0YXRlIEVycm9yDQotTkFNRVNQQUNFX0VSUj1OYW1lc3BhY2UgRXJyb3INCi1OT19EQVRBX0FMTE9XRURfRVJSPU5vIERhdGEgQWxsb3dlZA0KLU5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUj1ObyBNb2RpZmljYXRpb24gQWxsb3dlZA0KLU5PVF9GT1VORF9FUlI9Tm90IEZvdW5kDQotTk9UX1NVUFBPUlRFRF9FUlI9Tm90IFN1cHBvcnRlZA0KLVNZTlRBWF9FUlI9U3ludGF4IEVycm9yDQotVFlQRV9NSVNNQVRDSF9FUlI9VHlwZSBNaXNtYXRjaCBFcnJvcg0KLVZBTElEQVRJT05fRVJSPVZhbGlkYXRpb24gRXJyb3INCi1XUk9OR19ET0NVTUVOVF9FUlI9V3JvbmcgRG9jdW1lbnQNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTU1vZGVsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01Nb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVlYjg3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTU1vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIFhNTE1vZGVsSW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgRE9NTW9kZWxJbXBsIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIsIElET01Nb2RlbCwgRE9NSW1wbGVtZW50YXRpb24gewotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUUkFDRV9QQVJTRVJfTUFOQUdFTUVOVF9FWENFUFRJT04gPSAicGFyc2VyTWFuYWdlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIE9iamVjdCBhY3RpdmUgPSBudWxsOwotCXByaXZhdGUgRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIElTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbnVsbDsKLQlwcml2YXRlIFhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBudWxsOwotCXByaXZhdGUgWE1MTW9kZWxQYXJzZXIgcGFyc2VyID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gcmVmcmVzaCA9IGZhbHNlOwotCXByaXZhdGUgWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBudWxsOwotCi0JLyoqCi0JICogWE1MTW9kZWxJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIERPTU1vZGVsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGludGVybmFsQ3JlYXRlRG9jdW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgY2xpZW50cyB0byBkZWNsYXJlIHRoYXQgdGhleSBhcmUgYWJvdXQgdG8gbWFrZSBhCi0JICogImxhcmdlIiBjaGFuZ2UgdG8gdGhlIG1vZGVsLiBUaGlzIGNoYW5nZSBtaWdodCBiZSBpbiB0ZXJtcyBvZiBjb250ZW50Ci0JICogb3IgaXQgbWlnaHQgYmUgaW4gdGVybXMgb2YgdGhlIG1vZGVsIGlkIG9yIGJhc2UgbG9jYXRpb24uCi0JICogCi0JICogTm90ZSB0aGF0IGluIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCBub3RpZmljYXRpb24gdG8gbGlzdG5lcnMgaXMKLQkgKiBzZW50IG9ubHkgb25jZS4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgdGhlIGNsaWVudCB3aG8gaXMgbWFraW5nIHRoZXNlIGNoYW5nZXMgaGFzIHRoZSByZXNwb25zaWJpbGl0eQotCSAqIHRvIHJlc3RvcmUgdGhlIG1vZGVscyBzdGF0ZSBvbmNlIGZpbmlzaGVkIHdpdGggdGhlIGNoYW5nZXMuIFNlZQotCSAqIGdldE1lbWVudG8gYW5kIHJlc3RvcmVTdGF0ZS4KLQkgKiAKLQkgKiBUaGUgbWV0aG9kIGlzTW9kZWxTdGF0ZUNoYW5naW5nIGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRldGVybWluZSBpZgotCSAqIHRoZSBtb2RlbCBpcyBhbHJlYWR5IGluIGEgY2hhbmdlIHNlcXVlbmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIGFib3V0VG9DaGFuZ2VNb2RlbCgpIHsKLQkJc3VwZXIuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCS8vIHRlY2huaWNhbGx5LCBubyBuZWVkIHRvIGNhbGwgYmVnaW5DaGFuZ2luZyBzbyBvZnRlbiwKLQkJLy8gc2luY2UgYWJvdXRUb0NoYW5nZU1vZGVsIGNhbiBiZSBuZXN0ZWQuCi0JCS8vIGJ1dCB3aWxsIGxlYXZlIGFzIGlzIGZvciB0aGlzIHJlbGVhc2UuCi0JCS8vIHNlZSBtb2RlbENoYW5nZWQsIGFuZCBiZSBzdXJlIHN0YXlzIGNvb3JkaW5hdGVkIHRoZXJlLgotCQlnZXRNb2RlbE5vdGlmaWVyKCkuYmVnaW5DaGFuZ2luZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFib3V0VG9SZWluaXRpYWxpemVNb2RlbCgpIHsKLQkJWE1MTW9kZWxOb3RpZmllciBub3RpZmllciA9IGdldE1vZGVsTm90aWZpZXIoKTsKLQkJbm90aWZpZXIuY2FuY2VsUGVuZGluZygpOwotCQlzdXBlci5hYm91dFRvUmVpbml0aWFsaXplTW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBhdHRyUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3QXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBvbGRBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXR0clJlcGxhY2VkKEVsZW1lbnQgZWxlbWVudCwgQXR0ciBuZXdBdHRyLCBBdHRyIG9sZEF0dHIpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldEFjdGl2ZVBhcnNlcigpID09IG51bGwpIHsKLQkJCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0TW9kZWxVcGRhdGVyKCk7Ci0JCQlzZXRBY3RpdmUodXBkYXRlcik7Ci0JCQl1cGRhdGVyLmluaXRpYWxpemUoKTsKLQkJCXVwZGF0ZXIucmVwbGFjZUF0dHIoZWxlbWVudCwgbmV3QXR0ciwgb2xkQXR0cik7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCX0KLQkJZ2V0TW9kZWxOb3RpZmllcigpLmF0dHJSZXBsYWNlZChlbGVtZW50LCBuZXdBdHRyLCBvbGRBdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgYSBjbGllbnQgY29udHJvbGxlZCB3YXkgb2Ygbm90aWZ5aW5nIGFsbCBNb2RlbEV2ZW50Ci0JICogbGlzdG5lcnMgdGhhdCB0aGUgbW9kZWwgaGFzIGJlZW4gY2hhbmdlZC4gVGhpcyBtZXRob2QgaXMgYSBtYXRjaGVkIHBhaXIKLQkgKiB0byBhYm91dFRvQ2hhbmdlTW9kZWwsIGFuZCBtdXN0IGJlIGNhbGxlZCBhZnRlciBhYm91dFRvQ2hhbmdlTW9kZWwgLi4uCi0JICogb3Igc29tZSBsaXN0ZW5lcnMgY291bGQgYmUgbGVmdCB3YWl0aW5nIGluZGVmaW5pdGVseSBmb3IgdGhlIGNoYW5nZWQKLQkgKiBldmVudC4gU28sIGl0cyBzdWdnZXN0ZWQgdGhhdCBjaGFuZ2VkTW9kZWwgYWx3YXlzIGJlIGluIGEgZmluYWxseQotCSAqIGNsYXVzZS4gTGlrZXdpc2UsIGEgY2xpZW50IHNob3VsZCBuZXZlciBjYWxsIGNoYW5nZWRNb2RlbCB3aXRob3V0Ci0JICogY2FsbGluZyBhYm91dFRvQ2hhbmdlTW9kZWwgZmlyc3QuCi0JICogCi0JICogSW4gdGhlIGNhc2Ugb2YgZW1iZWRkZWQgY2FsbHMsIHRoZSBub3RpZmljYXRpb24gaXMganVzdCBzZW50IG9uY2UuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgY2hhbmdlZE1vZGVsKCkgewotCQkvLyBOT1RFOiB0aGUgb3JkZXIgb2YgJ2NoYW5nZWRNb2RlbCcgYW5kICdlbmRDaGFuZ2luZycgaXMgc2lnbmlmaWNhbnQuCi0JCS8vIEJ5IGNhbGxpbmcgY2hhbmdlZE1vZGVsIGZpcnN0LCB0aGlzIGJhc2ljYWxseSBkZWNyZW1lbnRzIHRoZQotCQkvLyAiaXNDaGFuZ2luZyIgY291bnRlcgotCQkvLyBpbiBzdXBlciBjbGFzcyBhbmQgd2hlbiB6ZXJvIGFsbCBsaXN0ZW5lcnMgdG8gbW9kZWwgc3RhdGUgZXZlbnRzCi0JCS8vIHdpbGwgYmUgbm90aWZpZWQKLQkJLy8gdGhhdCB0aGUgbW9kZWwgaGFzIGJlZW4gY2hhbmdlZC4gJ2VuZENoYW5naW5nJyB3aWxsIG5vdGlmeSBhbGwKLQkJLy8gZGVmZXJyZWQgYWRhcHRlcnMuCi0JCS8vIFNvLCB0aGUgc2lnbmlmaWNhbmNlIG9mIG9yZGVyIGlzIHRoYXQgYWRhcHRlcnMgKGFuZCBtZXRob2RzIHRoZXkKLQkJLy8gY2FsbCkKLQkJLy8gY2FuIGNvdW50IG9uIHRoZSBzdGF0ZSBvZiBtb2RlbCAiaXNDaGFuZ2luZyIgdG8gYmUgYWNjdXJhdGUuCi0JCS8vIEJ1dCwgcmVtZW1iZXIsIHRoYXQgdGhpcyBtZWFucyB0aGUgIm1vZGVsQ2hhbmdlZCIgZXZlbnQgY2FuIGJlCi0JCS8vIHJlY2VpdmVkIGJlZm9yZSBhbGwKLQkJLy8gYWRhcHRlcnMgaGF2ZSBmaW5pc2hlZCB0aGVpciBwcm9jZXNzaW5nLgotCQkvLyBOT1RFIE5PVEU6IFRoZSBhYm92ZSBub3RlIGlzIG9ic29sZXRlIGluIGZhY3QgKHRob3VnaCBzdGlsbCBzdGF0ZXMKLQkJLy8gaXNzdWUgY29ycmVjdGx5KS4KLQkJLy8gRHVlIHRvIHBvcHVsYXIgZGVtYW5kLCB0aGUgb3JkZXIgb2YgdGhlc2UgY2FsbHMgd2VyZSByZXZlcnNlZCBhbmQKLQkJLy8gYmVoYXZpb3IKLQkJLy8gY2hhbmdlZCBvbiAwNy8yMi8yMDA0LgotCQkvLyAKLQkJLy8gc2VlIGFsc28KLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQzMDIKLQkJLy8gZm9yIG1vdGl2YXRpb24gZm9yIHRoaXMgJ29uIHZlcmdlIG9mJyBjYWxsLgotCQkvLyB0aGlzIGNvdWxkIGJlIGltcHJvdmVkIGluIGZ1dHVyZSBpZiBub3RpZmllciBhbHNvIHVzZWQgY291bnRpbmcKLQkJLy8gZmxhZyB0byBhdm9pZCBuZXN0ZWQgY2FsbHMuIElmL3doZW4gY2hhbmdlZCBiZSBzdXJlIHRvIGNoZWNrIGlmCi0JCS8vIGFib3V0VG9DaGFuZ2VNb2RlbCBuZWVkcyBhbnkgY2hhbmdlcyB0b28uCi0JCWlmIChpc01vZGVsQ2hhbmdlU3RhdGVPblZlcmdlT2ZFbmRpbmcoKSkgewotCQkJLy8gZW5kIGxvY2sgYmVmb3JlIG5vdGljaWF0aW9uIGxvb3AsIHNpbmNlIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkKLQkJCS8vIHdlIG1heSBiZSAiY2FsbGVkIGZyb20gZm9yaWVnbiBjb2RlIiBkdXJpbmcgbm90aWZpY2F0aW9uLgotCQkJZW5kTG9jaygpOwotCQkJLy8gd2UgbnVsbCBvdXQgaGVyZSB0byBhdm9pZCBzcHVyaW91cyJ3YXJuaW5nIiBtZXNzYWdlIHdoaWxlIGRlYnVnCi0JCQkvLyB0cmFjaW5nIGlzIGVuYWJsZWQKLQkJCWZMb2NrT2JqZWN0ID0gbnVsbDsKLQkJCS8vIHRoZSBub3RpZmllciBpcyB3aGF0IGNvbnRyb2xzIGFkYXBlciBub3RpZmljYXRpb24sIHdoaWNoCi0JCQkvLyBzaG91bGQgYmUgc2VudCBvdXQgYmVmb3JlIHRoZSAnbW9kZWxDaGFuZ2VkJyBldmVudC4KLQkJCWdldE1vZGVsTm90aWZpZXIoKS5lbmRDaGFuZ2luZygpOwotCQl9Ci0JCS8vIGNoYW5nZWRNb2RlbCBoYW5kbGVzICduZXN0aW5nJywgc28gb25seSBvbmUgZXZlbnQgc2VudCBvdXQKLQkJLy8gd2hlbiBtdWxpdHBsZSBjYWxscyB0byAnYWJvdXRUb0NoYW5nZS9DaGFuZ2VkJy4KLQkJc3VwZXIuY2hhbmdlZE1vZGVsKCk7Ci0JCWhhbmRsZVJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGlsZFJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hpbGRSZXBsYWNlZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldEFjdGl2ZVBhcnNlcigpID09IG51bGwpIHsKLQkJCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0TW9kZWxVcGRhdGVyKCk7Ci0JCQlzZXRBY3RpdmUodXBkYXRlcik7Ci0JCQl1cGRhdGVyLmluaXRpYWxpemUoKTsKLQkJCXVwZGF0ZXIucmVwbGFjZUNoaWxkKHBhcmVudE5vZGUsIG5ld0NoaWxkLCBvbGRDaGlsZCk7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCX0KLQkJZ2V0TW9kZWxOb3RpZmllcigpLmNoaWxkUmVwbGFjZWQocGFyZW50Tm9kZSwgbmV3Q2hpbGQsIG9sZENoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIFhNTCA8Y29kZT5Eb2N1bWVudDwvY29kZT4gb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZQotCSAqIHdpdGggaXRzIGRvY3VtZW50IGVsZW1lbnQuIEhUTUwtb25seSBET00gaW1wbGVtZW50YXRpb25zIGRvIG5vdCBuZWVkIHRvCi0JICogaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lc3BhY2VVUklUaGUKLQkgKiAgICAgICAgICAgIG5hbWVzcGFjZSBVUkkgb2YgdGhlIGRvY3VtZW50IGVsZW1lbnQgdG8gY3JlYXRlLgotCSAqIEBwYXJhbSBxdWFsaWZpZWROYW1lVGhlCi0JICogICAgICAgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZG9jdW1lbnQgZWxlbWVudCB0byBiZSBjcmVhdGVkLgotCSAqIEBwYXJhbSBkb2N0eXBlVGhlCi0JICogICAgICAgICAgICB0eXBlIG9mIGRvY3VtZW50IHRvIGJlIGNyZWF0ZWQgb3IgPGNvZGU+bnVsbDwvY29kZT4uIFdoZW4KLQkgKiAgICAgICAgICAgIDxjb2RlPmRvY3R5cGU8L2NvZGU+IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiwgaXRzCi0JICogICAgICAgICAgICA8Y29kZT5Ob2RlLm93bmVyRG9jdW1lbnQ8L2NvZGU+IGF0dHJpYnV0ZSBpcyBzZXQgdG8gdGhlCi0JICogICAgICAgICAgICBkb2N1bWVudCBiZWluZyBjcmVhdGVkLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG9iamVjdC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgcXVhbGlmaWVkCi0JICogICAgICAgICAgICAgICAgbmFtZSBjb250YWlucyBhbiBpbGxlZ2FsIGNoYXJhY3Rlci4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5BTUVTUEFDRV9FUlI6IFJhaXNlZCBpZiB0aGUgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBpcyBtYWxmb3JtZWQsIGlmIHRoZSA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiBoYXMgYQotCSAqICAgICAgICAgICAgICAgIHByZWZpeCBhbmQgdGhlIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT4gaXMKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgb3IgaWYgdGhlCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4gaGFzIGEgcHJlZml4IHRoYXQgaXMgInhtbCIKLQkgKiAgICAgICAgICAgICAgICBhbmQgdGhlIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT4gaXMgZGlmZmVyZW50IGZyb20gIgotCSAqICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgLjxicj4KLQkgKiAgICAgICAgICAgICAgICBXUk9OR19ET0NVTUVOVF9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kb2N0eXBlPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gdXNlZCB3aXRoIGEgZGlmZmVyZW50IGRvY3VtZW50IG9yIHdhcwotCSAqICAgICAgICAgICAgICAgIGNyZWF0ZWQgZnJvbSBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi4KLQkgKiBAc2VlIERPTSBMZXZlbCAyCi0JICovCi0JcHVibGljIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBxdWFsaWZpZWROYW1lLCBEb2N1bWVudFR5cGUgZG9jdHlwZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZW1wdHkgPGNvZGU+RG9jdW1lbnRUeXBlPC9jb2RlPiBub2RlLiBFbnRpdHkgZGVjbGFyYXRpb25zCi0JICogYW5kIG5vdGF0aW9ucyBhcmUgbm90IG1hZGUgYXZhaWxhYmxlLiBFbnRpdHkgcmVmZXJlbmNlIGV4cGFuc2lvbnMgYW5kCi0JICogZGVmYXVsdCBhdHRyaWJ1dGUgYWRkaXRpb25zIGRvIG5vdCBvY2N1ci4gSXQgaXMgZXhwZWN0ZWQgdGhhdCBhIGZ1dHVyZQotCSAqIHZlcnNpb24gb2YgdGhlIERPTSB3aWxsIHByb3ZpZGUgYSB3YXkgZm9yIHBvcHVsYXRpbmcgYQotCSAqIDxjb2RlPkRvY3VtZW50VHlwZTwvY29kZT4uPGJyPgotCSAqIEhUTUwtb25seSBET00gaW1wbGVtZW50YXRpb25zIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZVRoZQotCSAqICAgICAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGRvY3VtZW50IHR5cGUgdG8gYmUgY3JlYXRlZC4KLQkgKiBAcGFyYW0gcHVibGljSWRUaGUKLQkgKiAgICAgICAgICAgIGV4dGVybmFsIHN1YnNldCBwdWJsaWMgaWRlbnRpZmllci4KLQkgKiBAcGFyYW0gc3lzdGVtSWRUaGUKLQkgKiAgICAgICAgICAgIGV4dGVybmFsIHN1YnNldCBzeXN0ZW0gaWRlbnRpZmllci4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkRvY3VtZW50VHlwZTwvY29kZT4gbm9kZSB3aXRoCi0JICogICAgICAgICA8Y29kZT5Ob2RlLm93bmVyRG9jdW1lbnQ8L2NvZGU+IHNldCB0byA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgcXVhbGlmaWVkCi0JICogICAgICAgICAgICAgICAgbmFtZSBjb250YWlucyBhbiBpbGxlZ2FsIGNoYXJhY3Rlci4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5BTUVTUEFDRV9FUlI6IFJhaXNlZCBpZiB0aGUgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBpcyBtYWxmb3JtZWQuCi0JICogQHNlZSBET00gTGV2ZWwgMgotCSAqLwotCXB1YmxpYyBEb2N1bWVudFR5cGUgY3JlYXRlRG9jdW1lbnRUeXBlKFN0cmluZyBxdWFsaWZpZWROYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50VHlwZUltcGwgZG9jdW1lbnRUeXBlID0gbmV3IERvY3VtZW50VHlwZUltcGwoKTsKLQkJZG9jdW1lbnRUeXBlLnNldE5hbWUocXVhbGlmaWVkTmFtZSk7Ci0JCWRvY3VtZW50VHlwZS5zZXRQdWJsaWNJZChwdWJsaWNJZCk7Ci0JCWRvY3VtZW50VHlwZS5zZXRTeXN0ZW1JZChzeXN0ZW1JZCk7Ci0JCXJldHVybiBkb2N1bWVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9jdW1lbnRUeXBlQ2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMucmVmcmVzaCkKLQkJCXJldHVybjsKLQkJLy8gdW5saWtlICdyZXNmcmVzaCcsICdyZWluaXRpYWxpemUnIGZpbmlzaGVzIGxvb3AKLQkJLy8gYW5kIGZsdXNoZXMgcmVtYWluaW5nIG5vdGlmaWNhdGlvbiBxdWUgYmVmb3JlCi0JCS8vIGFjdHVhbGx5IHJlaW5pdGlhbGl6aW5nLgotCQkvLyBJU1NVRTogc2hvdWxkIHJlaW5pdCBiZSB1c2VkIGluc3RlYWQgb2YgaGFuZGxlcmVmcmVzaD8KLQkJLy8gdGhpcy5zZXRSZWluaXRpYWxpemVOZWVkZWQodHJ1ZSk7Ci0JCWlmICh0aGlzLmFjdGl2ZSAhPSBudWxsIHx8IGdldE1vZGVsTm90aWZpZXIoKS5pc0NoYW5naW5nKCkpCi0JCQlyZXR1cm47IC8vIGRlZmVyCi0JCWhhbmRsZVJlZnJlc2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0YWJsZUNoYW5nZWQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWdldE1vZGVsTm90aWZpZXIoKS5lZGl0YWJsZUNoYW5nZWQobm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmRUYWdDaGFuZ2VkKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0QWN0aXZlUGFyc2VyKCkgPT0gbnVsbCkgewotCQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRNb2RlbFVwZGF0ZXIoKTsKLQkJCXNldEFjdGl2ZSh1cGRhdGVyKTsKLQkJCXVwZGF0ZXIuaW5pdGlhbGl6ZSgpOwotCQkJdXBkYXRlci5jaGFuZ2VFbmRUYWcoZWxlbWVudCk7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCX0KLQkJZ2V0TW9kZWxOb3RpZmllcigpLmVuZFRhZ0NoYW5nZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBYTUxNb2RlbFBhcnNlciBnZXRBY3RpdmVQYXJzZXIoKSB7Ci0JCWlmICh0aGlzLnBhcnNlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLnBhcnNlciAhPSB0aGlzLmFjdGl2ZSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdGhpcy5wYXJzZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBYTUxNb2RlbFVwZGF0ZXIgZ2V0QWN0aXZlVXBkYXRlcigpIHsKLQkJaWYgKHRoaXMudXBkYXRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLnVwZGF0ZXIgIT0gdGhpcy5hY3RpdmUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHRoaXMudXBkYXRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChEb2N1bWVudC5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCi0JCQlyZXR1cm4gZ2V0RG9jdW1lbnQoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogZ2V0RG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBYTUxEb2N1bWVudAotCSAqLwotCXB1YmxpYyBJRE9NRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJU291cmNlR2VuZXJhdG9yIGdldEdlbmVyYXRvcigpIHsKLQkJaWYgKHRoaXMuZ2VuZXJhdG9yID09IG51bGwpIHsKLQkJCXRoaXMuZ2VuZXJhdG9yID0gWE1MR2VuZXJhdG9ySW1wbC5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oaW50IG9mZnNldCkgewotCQlpZiAodGhpcy5kb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIHNlYXJjaCBpbiBkb2N1bWVudCBjaGlsZHJlbgotCQlJRE9NTm9kZSBwYXJlbnQgPSBudWxsOwotCQlpbnQgbGVuZ3RoID0gdGhpcy5kb2N1bWVudC5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG9mZnNldCAqIDIgPCBsZW5ndGgpIHsKLQkJCS8vIHNlYXJjaCBmcm9tIHRoZSBmaXJzdAotCQkJSURPTU5vZGUgY2hpbGQgPSAoSURPTU5vZGUpIHRoaXMuZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCQlpZiAoY2hpbGQuZ2V0RW5kT2Zmc2V0KCkgPD0gb2Zmc2V0KSB7Ci0JCQkJCWNoaWxkID0gKElET01Ob2RlKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGNoaWxkLmdldFN0YXJ0T2Zmc2V0KCkgPiBvZmZzZXQpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBjaGlsZC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKSA+IG9mZnNldCkKLQkJCQkJCXJldHVybiBjaGlsZDsKLQkJCQl9Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBjaGlsZC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpIDw9IG9mZnNldCkKLQkJCQkJCXJldHVybiBjaGlsZDsKLQkJCQl9Ci0JCQkJLy8gZGlnIG1vcmUKLQkJCQlwYXJlbnQgPSBjaGlsZDsKLQkJCQljaGlsZCA9IChJRE9NTm9kZSkgcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIHNlYXJjaCBmcm9tIHRoZSBsYXN0Ci0JCQlJRE9NTm9kZSBjaGlsZCA9IChJRE9NTm9kZSkgdGhpcy5kb2N1bWVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNoaWxkLmdldFN0YXJ0T2Zmc2V0KCkgPiBvZmZzZXQpIHsKLQkJCQkJY2hpbGQgPSAoSURPTU5vZGUpIGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGNoaWxkLmdldEVuZE9mZnNldCgpIDw9IG9mZnNldCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGNoaWxkLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpID4gb2Zmc2V0KQotCQkJCQkJcmV0dXJuIGNoaWxkOwotCQkJCX0KLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGNoaWxkLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCkgPD0gb2Zmc2V0KQotCQkJCQkJcmV0dXJuIGNoaWxkOwotCQkJCX0KLQkJCQkvLyBkaWcgbW9yZQotCQkJCXBhcmVudCA9IGNoaWxkOwotCQkJCWNoaWxkID0gKElET01Ob2RlKSBwYXJlbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgWE1MTW9kZWxOb3RpZmllciBnZXRNb2RlbE5vdGlmaWVyKCkgewotCQlpZiAodGhpcy5ub3RpZmllciA9PSBudWxsKSB7Ci0JCQl0aGlzLm5vdGlmaWVyID0gbmV3IFhNTE1vZGVsTm90aWZpZXJJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubm90aWZpZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBYTUxNb2RlbFBhcnNlciBnZXRNb2RlbFBhcnNlcigpIHsKLQkJaWYgKHRoaXMucGFyc2VyID09IG51bGwpIHsKLQkJCXRoaXMucGFyc2VyID0gY3JlYXRlTW9kZWxQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5wYXJzZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFhNTE1vZGVsUGFyc2VyIGNyZWF0ZU1vZGVsUGFyc2VyKCkgewotCQlyZXR1cm4gbmV3IFhNTE1vZGVsUGFyc2VyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgWE1MTW9kZWxVcGRhdGVyIGdldE1vZGVsVXBkYXRlcigpIHsKLQkJaWYgKHRoaXMudXBkYXRlciA9PSBudWxsKSB7Ci0JCQl0aGlzLnVwZGF0ZXIgPSBjcmVhdGVNb2RlbFVwZGF0ZXIoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy51cGRhdGVyOwotCX0KLQotCXByb3RlY3RlZCBYTUxNb2RlbFVwZGF0ZXIgY3JlYXRlTW9kZWxVcGRhdGVyKCkgewotCQlyZXR1cm4gbmV3IFhNTE1vZGVsVXBkYXRlcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlUmVmcmVzaCgpIHsKLQkJaWYgKCF0aGlzLnJlZnJlc2gpCi0JCQlyZXR1cm47Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCWJvb2xlYW4gaXNDaGFuZ2luZyA9IG5vdGlmaWVyLmlzQ2hhbmdpbmcoKTsKLQkJaWYgKCFpc0NoYW5naW5nKQotCQkJbm90aWZpZXIuYmVnaW5DaGFuZ2luZyh0cnVlKTsKLQkJWE1MTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0TW9kZWxQYXJzZXIoKTsKLQkJc2V0QWN0aXZlKHBhcnNlcik7Ci0JCXRoaXMuZG9jdW1lbnQucmVtb3ZlQ2hpbGROb2RlcygpOwotCQl0cnkgewotCQkJcGFyc2VyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkxpc3QoKSwgbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQlpZiAoIWlzQ2hhbmdpbmcpCi0JCQkJbm90aWZpZXIuZW5kQ2hhbmdpbmcoKTsKLQkJCXRoaXMucmVmcmVzaCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVzdCBpZiB0aGUgRE9NIGltcGxlbWVudGF0aW9uIGltcGxlbWVudHMgYSBzcGVjaWZpYyBmZWF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlVGhlCi0JICogICAgICAgICAgICBuYW1lIG9mIHRoZSBmZWF0dXJlIHRvIHRlc3QgKGNhc2UtaW5zZW5zaXRpdmUpLiBUaGUgdmFsdWVzCi0JICogICAgICAgICAgICB1c2VkIGJ5IERPTSBmZWF0dXJlcyBhcmUgZGVmaW5lZCB0aHJvdWdob3V0IHRoZSBET00gTGV2ZWwgMgotCSAqICAgICAgICAgICAgc3BlY2lmaWNhdGlvbnMgYW5kIGxpc3RlZCBpbiB0aGUgc2VjdGlvbi4gVGhlIG5hbWUgbXVzdCBiZQotCSAqICAgICAgICAgICAgYW4gWE1MIG5hbWUuIFRvIGF2b2lkIHBvc3NpYmxlIGNvbmZsaWN0cywgYXMgYSBjb252ZW50aW9uLAotCSAqICAgICAgICAgICAgbmFtZXMgcmVmZXJyaW5nIHRvIGZlYXR1cmVzIGRlZmluZWQgb3V0c2lkZSB0aGUgRE9NCi0JICogICAgICAgICAgICBzcGVjaWZpY2F0aW9uIHNob3VsZCBiZSBtYWRlIHVuaXF1ZSBieSByZXZlcnNpbmcgdGhlIG5hbWUgb2YKLQkgKiAgICAgICAgICAgIHRoZSBJbnRlcm5ldCBkb21haW4gbmFtZSBvZiB0aGUgcGVyc29uIChvciB0aGUgb3JnYW5pemF0aW9uCi0JICogICAgICAgICAgICB0aGF0IHRoZSBwZXJzb24gYmVsb25ncyB0bykgd2hvIGRlZmluZXMgdGhlIGZlYXR1cmUsCi0JICogICAgICAgICAgICBjb21wb25lbnQgYnkgY29tcG9uZW50LCBhbmQgdXNpbmcgdGhpcyBhcyBhIHByZWZpeC4gRm9yCi0JICogICAgICAgICAgICBpbnN0YW5jZSwgdGhlIFczQyBTVkcgV29ya2luZyBHcm91cCBkZWZpbmVzIHRoZSBmZWF0dXJlCi0JICogICAgICAgICAgICAib3JnLnczYy5kb20uc3ZnIi4KLQkgKiBAcGFyYW0gdmVyc2lvblRoaXMKLQkgKiAgICAgICAgICAgIGlzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZmVhdHVyZSB0byB0ZXN0LiBJbiBMZXZlbCAyLAotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyBjYW4gYmUgZWl0aGVyICIyLjAiIG9yICIxLjAiLiBJZiB0aGUgdmVyc2lvbiBpcwotCSAqICAgICAgICAgICAgbm90IHNwZWNpZmllZCwgc3VwcG9ydGluZyBhbnkgdmVyc2lvbiBvZiB0aGUgZmVhdHVyZSBjYXVzZXMKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgdG8gcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZlYXR1cmUgaXMgaW1wbGVtZW50ZWQgaW4gdGhlCi0JICogICAgICAgICBzcGVjaWZpZWQgdmVyc2lvbiwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodmVyc2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAoIXZlcnNpb24uZXF1YWxzKCIxLjAiKSAmJiAhdmVyc2lvbi5lcXVhbHMoIjIuMCIpKSB7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmIChmZWF0dXJlLmVxdWFsc0lnbm9yZUNhc2UoIkNvcmUiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZlYXR1cmUuZXF1YWxzSWdub3JlQ2FzZSgiWE1MIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVEb2N1bWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50IGludGVybmFsQ3JlYXRlRG9jdW1lbnQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudEltcGwoKTsKLQkJZG9jdW1lbnQuc2V0TW9kZWwodGhpcyk7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQlib29sZWFuIGlzUmVwYXJzaW5nKCkgewotCQlyZXR1cm4gKGFjdGl2ZSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBuYW1lQ2hhbmdlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5hbWVDaGFuZ2VkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0QWN0aXZlUGFyc2VyKCkgPT0gbnVsbCkgewotCQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRNb2RlbFVwZGF0ZXIoKTsKLQkJCXNldEFjdGl2ZSh1cGRhdGVyKTsKLQkJCXVwZGF0ZXIuaW5pdGlhbGl6ZSgpOwotCQkJdXBkYXRlci5jaGFuZ2VOYW1lKG5vZGUpOwotCQkJc2V0QWN0aXZlKG51bGwpOwotCQl9Ci0JCS8vIG5vdGlmaWNhdGlvbiBpcyBhbHJlYWR5IHNlbnQKLQl9Ci0KLQkvKioKLQkgKiBuZXdNb2RlbCBtZXRob2QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCBmb3IgdGhlIGNhc2UKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCAmJiBmU3RydWN0dXJlZERvY3VtZW50ICE9IHN0cnVjdHVyZWREb2N1bWVudCkKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCi0JCWludGVybmFsU2V0TmV3RG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxTZXROZXdEb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25MaXN0KCk7Ci0JCWlmICgoZmxhdE5vZGVzID09IG51bGwpIHx8IChmbGF0Tm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodGhpcy5kb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBiZWluZyBjb25zdHJ1Y3RlZAotCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldEFjdGl2ZVVwZGF0ZXIoKTsKLQkJaWYgKHVwZGF0ZXIgIT0gbnVsbCkgeyAvLyBiZWluZyB1cGRhdGVkCi0JCQl0cnkgewotCQkJCXVwZGF0ZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoZmxhdE5vZGVzLCBudWxsKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCX0KLQkJCS8vIC8vIGZvciBuZXcgbW9kZWwsIHdlIG1pZ2h0IG5lZWQgdG8KLQkJCS8vIC8vIHJlLWluaXQsIGUuZy4gaWYgc29tZW9uZSBjYWxscyBzZXRUZXh0Ci0JCQkvLyAvLyBvbiBhbiBleGlzdGluZyBtb2RlbAotCQkJLy8gY2hlY2tGb3JSZWluaXQoKTsKLQkJCXJldHVybjsKLQkJfQotCQlYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gZ2V0TW9kZWxOb3RpZmllcigpOwotCQlib29sZWFuIGlzQ2hhbmdpbmcgPSBub3RpZmllci5pc0NoYW5naW5nKCk7Ci0JCS8vIGNhbGwgZXZlbiBpZiBjaGFuZ2luZyB0byBub3RpZnkgZG9pbmcgbmV3IG1vZGVsCi0JCWdldE1vZGVsTm90aWZpZXIoKS5iZWdpbkNoYW5naW5nKHRydWUpOwotCQlYTUxNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRNb2RlbFBhcnNlcigpOwotCQlzZXRBY3RpdmUocGFyc2VyKTsKLQkJdGhpcy5kb2N1bWVudC5yZW1vdmVDaGlsZE5vZGVzKCk7Ci0JCXRyeSB7Ci0JCQlwYXJzZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoZmxhdE5vZGVzLCBudWxsKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCS8vIG1lYW5pbmdsZXNzIHRvIHJlZnJlc2gsIGJlY2F1c2UgdGhlIHJlc3VsdCBtaWdodCBiZSB0aGUgc2FtZQotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJaWYgKCFpc0NoYW5naW5nKSB7Ci0JCQkJZ2V0TW9kZWxOb3RpZmllcigpLmVuZENoYW5naW5nKCk7Ci0JCQl9Ci0JCQkvLyBpZ25vcmUgcmVmcmVzaAotCQkJdGhpcy5yZWZyZXNoID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0QWN0aXZlVXBkYXRlcigpOwotCQlpZiAodXBkYXRlciAhPSBudWxsKSB7IC8vIGJlaW5nIHVwZGF0ZWQKLQkJCS8vIGNsZWFudXAgdXBkYXRlciBzdGFmZnMKLQkJCXRyeSB7Ci0JCQkJdXBkYXRlci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhudWxsLCBudWxsKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCX0KLQkJCS8vIEkgZ3Vlc3Mgbm8gY2hhbmFnZSBtZWFucyB0aGUgbW9kZWwgY291bGQgbm90IG5lZWQgcmUtaW5pdAotCQkJLy8gY2hlY2tGb3JSZWluaXQoKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIG5vZGVzUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGV2ZW50LmdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGV2ZW50LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRBY3RpdmVVcGRhdGVyKCk7Ci0JCWlmICh1cGRhdGVyICE9IG51bGwpIHsgLy8gYmVpbmcgdXBkYXRlZAotCQkJdHJ5IHsKLQkJCQl1cGRhdGVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCWlmIChleC5nZXRDbGFzcygpLmVxdWFscyhTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uLmNsYXNzKSkgewotCQkJCQlMb2dnZXIudHJhY2VFeGNlcHRpb24oVFJBQ0VfUEFSU0VSX01BTkFHRU1FTlRfRVhDRVBUSU9OLCBleCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQl9Ci0JCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQl9Ci0JCQkvLyBjaGVja0ZvclJlaW5pdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCWJvb2xlYW4gaXNDaGFuZ2luZyA9IG5vdGlmaWVyLmlzQ2hhbmdpbmcoKTsKLQkJaWYgKCFpc0NoYW5naW5nKQotCQkJbm90aWZpZXIuYmVnaW5DaGFuZ2luZygpOwotCQlYTUxNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRNb2RlbFBhcnNlcigpOwotCQlzZXRBY3RpdmUocGFyc2VyKTsKLQkJdHJ5IHsKLQkJCXBhcnNlci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCXRoaXMucmVmcmVzaCA9IHRydWU7Ci0JCQloYW5kbGVSZWZyZXNoKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQlpZiAoIWlzQ2hhbmdpbmcpIHsKLQkJCQlub3RpZmllci5lbmRDaGFuZ2luZygpOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogcmVnaW9uQ2hhbmdlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZXZlbnQuZ2V0UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRBY3RpdmVVcGRhdGVyKCk7Ci0JCWlmICh1cGRhdGVyICE9IG51bGwpIHsgLy8gYmVpbmcgdXBkYXRlZAotCQkJdHJ5IHsKLQkJCQl1cGRhdGVyLmNoYW5nZVJlZ2lvbihldmVudCwgZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQl9Ci0JCQkvLyBjaGVja0ZvclJlaW5pdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCWJvb2xlYW4gaXNDaGFuZ2luZyA9IG5vdGlmaWVyLmlzQ2hhbmdpbmcoKTsKLQkJaWYgKCFpc0NoYW5naW5nKQotCQkJbm90aWZpZXIuYmVnaW5DaGFuZ2luZygpOwotCQlYTUxNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRNb2RlbFBhcnNlcigpOwotCQlzZXRBY3RpdmUocGFyc2VyKTsKLQkJdHJ5IHsKLQkJCXBhcnNlci5jaGFuZ2VSZWdpb24oZXZlbnQsIGZsYXROb2RlLCByZWdpb24pOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCWlmICghaXNDaGFuZ2luZykgewotCQkJCW5vdGlmaWVyLmVuZENoYW5naW5nKCk7Ci0JCQkJaGFuZGxlUmVmcmVzaCgpOwotCQkJfQotCQl9Ci0JCS8vIGNoZWNrRm9yUmVpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogcmVnaW9uc1JlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMgPSBldmVudC5nZXRPbGRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zID0gZXZlbnQuZ2V0TmV3UmVnaW9ucygpOwotCQlpZiAob2xkUmVnaW9ucyA9PSBudWxsICYmIG5ld1JlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRBY3RpdmVVcGRhdGVyKCk7Ci0JCWlmICh1cGRhdGVyICE9IG51bGwpIHsgLy8gYmVpbmcgdXBkYXRlZAotCQkJdHJ5IHsKLQkJCQl1cGRhdGVyLnJlcGxhY2VSZWdpb25zKGZsYXROb2RlLCBuZXdSZWdpb25zLCBvbGRSZWdpb25zKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCX0KLQkJCS8vIGNoZWNrRm9yUmVpbml0KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJWE1MTW9kZWxOb3RpZmllciBub3RpZmllciA9IGdldE1vZGVsTm90aWZpZXIoKTsKLQkJYm9vbGVhbiBpc0NoYW5naW5nID0gbm90aWZpZXIuaXNDaGFuZ2luZygpOwotCQlpZiAoIWlzQ2hhbmdpbmcpCi0JCQlub3RpZmllci5iZWdpbkNoYW5naW5nKCk7Ci0JCVhNTE1vZGVsUGFyc2VyIHBhcnNlciA9IGdldE1vZGVsUGFyc2VyKCk7Ci0JCXNldEFjdGl2ZShwYXJzZXIpOwotCQl0cnkgewotCQkJcGFyc2VyLnJlcGxhY2VSZWdpb25zKGZsYXROb2RlLCBuZXdSZWdpb25zLCBvbGRSZWdpb25zKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCXRoaXMucmVmcmVzaCA9IHRydWU7Ci0JCQloYW5kbGVSZWZyZXNoKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQlpZiAoIWlzQ2hhbmdpbmcpIHsKLQkJCQlub3RpZmllci5lbmRDaGFuZ2luZygpOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0KLQkJfQotCQkvLyBjaGVja0ZvclJlaW5pdCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tRWRpdCgpIHsKLQkJaWYgKCFpc1NoYXJlZCgpKSB7Ci0JCQkvLyB0aGlzLmRvY3VtZW50LnJlbGVhc2VTdHlsZVNoZWV0cygpOwotCQkJLy8gdGhpcy5kb2N1bWVudC5yZWxlYXNlRG9jdW1lbnRUeXBlKCk7Ci0JCX0KLQkJc3VwZXIucmVsZWFzZUZyb21FZGl0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21SZWFkKCkgewotCQlpZiAoIWlzU2hhcmVkKCkpIHsKLQkJCS8vIHRoaXMuZG9jdW1lbnQucmVsZWFzZVN0eWxlU2hlZXRzKCk7Ci0JCQkvLyB0aGlzLmRvY3VtZW50LnJlbGVhc2VEb2N1bWVudFR5cGUoKTsKLQkJfQotCQlzdXBlci5yZWxlYXNlRnJvbVJlYWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QWN0aXZlKE9iamVjdCBhY3RpdmUpIHsKLQkJdGhpcy5hY3RpdmUgPSBhY3RpdmU7Ci0JCS8vIHNpZGUgZWZmZWN0Ci0JCS8vIHdoZW4gZXZlciBiZWNvbWVzIGFjdGl2ZSwgYmVzdXJlIHRhZ05hbWVDYWNoZSBpcyBjbGVhcmVkCi0JCS8vIChhbmQgbm90IHVzZWQpCi0JCWlmIChhY3RpdmUgPT0gbnVsbCkgewotCQkJZG9jdW1lbnQuYWN0aXZhdGVUYWdOYW1lQ2FjaGUodHJ1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkb2N1bWVudC5hY3RpdmF0ZVRhZ05hbWVDYWNoZShmYWxzZSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRvcihJU291cmNlR2VuZXJhdG9yIGdlbmVyYXRvcikgewotCQl0aGlzLmdlbmVyYXRvciA9IGdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbE5vdGlmaWVyKFhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJdGhpcy5ub3RpZmllciA9IG5vdGlmaWVyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsUGFyc2VyKFhNTE1vZGVsUGFyc2VyIHBhcnNlcikgewotCQl0aGlzLnBhcnNlciA9IHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbFVwZGF0ZXIoWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIpIHsKLQkJdGhpcy51cGRhdGVyID0gdXBkYXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IG9sZFN0cnVjdHVyZWREb2N1bWVudCA9IHN1cGVyLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG9sZFN0cnVjdHVyZWREb2N1bWVudCkKLQkJCXJldHVybjsgLy8gbm90aGluZyB0byBkbwotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpCi0JCQlvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlpbnRlcm5hbFNldE5ld0RvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RhcnRUYWdDaGFuZ2VkKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0QWN0aXZlUGFyc2VyKCkgPT0gbnVsbCkgewotCQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRNb2RlbFVwZGF0ZXIoKTsKLQkJCXNldEFjdGl2ZSh1cGRhdGVyKTsKLQkJCXVwZGF0ZXIuaW5pdGlhbGl6ZSgpOwotCQkJdXBkYXRlci5jaGFuZ2VTdGFydFRhZyhlbGVtZW50KTsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJfQotCQlnZXRNb2RlbE5vdGlmaWVyKCkuc3RhcnRUYWdDaGFuZ2VkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIHZhbHVlQ2hhbmdlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldEFjdGl2ZVBhcnNlcigpID09IG51bGwpIHsKLQkJCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0TW9kZWxVcGRhdGVyKCk7Ci0JCQlzZXRBY3RpdmUodXBkYXRlcik7Ci0JCQl1cGRhdGVyLmluaXRpYWxpemUoKTsKLQkJCXVwZGF0ZXIuY2hhbmdlVmFsdWUobm9kZSk7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCX0KLQkJZ2V0TW9kZWxOb3RpZmllcigpLnZhbHVlQ2hhbmdlZChub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gMy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRGcmFnbWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRGcmFnbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlODgyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50RnJhZ21lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKiAgICAgQmFsYXpzIEJhbmZhaTogQnVnIDE1NDczNyBnZXRVc2VyRGF0YS9zZXRVc2VyRGF0YSBzdXBwb3J0IGZvciBOb2RlCi0gKiAgICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDczNwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0KLS8qKgotICogRG9jdW1lbnRGcmFnbWVudEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50RnJhZ21lbnRJbXBsIGV4dGVuZHMgTm9kZUNvbnRhaW5lciBpbXBsZW1lbnRzIERvY3VtZW50RnJhZ21lbnQgewotCi0JLyoqCi0JICogRG9jdW1lbnRGcmFnbWVudEltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRGcmFnbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRG9jdW1lbnRGcmFnbWVudEltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudEltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRGcmFnbWVudEltcGwoRG9jdW1lbnRGcmFnbWVudEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCURvY3VtZW50RnJhZ21lbnRJbXBsIGNsb25lZCA9IG5ldyBEb2N1bWVudEZyYWdtZW50SW1wbCh0aGlzKTsKLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQkJCi0JCW5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVELCBjbG9uZWQpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiAiI2RvY3VtZW50LWZyYWdtZW50IjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwODJmZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICogICAgIEJhbGF6cyBCYW5mYWk6IEJ1ZyAxNTQ3MzcgZ2V0VXNlckRhdGEvc2V0VXNlckRhdGEgc3VwcG9ydCBmb3IgTm9kZQotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ3MzcKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDI5Njk5OSAtIEluZWZmaWNpZW50IHVzZSBvZiBuZXcgU3RyaW5nKCkKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKEludGFsaW8pIC0gYnVnIDI3MzAwNCAtIGFkZCBjaGVjayBmb3IgdmFsaWQgeG1sIGNoYXJhY3RlcnMgaW4gY3JlYXRlQXR0cmlidXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotLy8gZm9yIG9yZy5hcGFjaGUueGVyY2VzIDMuMi4xCi0vLyBpbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbHMuWE1MQ2hhcmFjdGVyUHJvcGVydGllczsKLS8vIERNVyBtb2RpZmllZCBmb3IgWE1MNEogNC4wLjEKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmRvbS5UcmVlV2Fsa2VySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5pbXBsLkNvbW1lbnRFbGVtZW50UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVudGl0eURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklYTUxDaGFyRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5OYW1lVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob3RhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20ucmFuZ2VzLkRvY3VtZW50UmFuZ2U7Ci1pbXBvcnQgb3JnLnczYy5kb20ucmFuZ2VzLlJhbmdlOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Eb2N1bWVudFRyYXZlcnNhbDsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5UcmVlV2Fsa2VyOwotCi0KLS8qKgotICogRG9jdW1lbnRJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEltcGwgZXh0ZW5kcyBOb2RlQ29udGFpbmVyIGltcGxlbWVudHMgSURPTURvY3VtZW50LCBEb2N1bWVudFJhbmdlLCBEb2N1bWVudFRyYXZlcnNhbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbWF4RG9jVHlwZVNlYXJjaCA9IDUwMDsKLQlwcml2YXRlIHN0YXRpYyBpbnQgbm9NYXhTZWFyY2ggPSAtMTsKLQkvKioKLQkgKiBJbnRlcm5hbC11c2Ugb25seSBjbGFzcy4gVGhpcyBjbGFzcyB3YXMgYWRkZWQgdG8gYmV0dGVyIGFibGUgdG8gaGFuZGxlCi0JICogcmVwZXRldGl2ZSByZXF1ZXN0IGZvciBnZXRFbGVtZW50c0J5VGFnTmFtZS4gVGhlIGNhY2hlIGlzIGNsZWFyZWQgd2hlbgotCSAqIGV2ZXIgdGhlIGRvY3VtZW50IGNoYW5nZXMgYXQgYWxsLCBzbyBzdGlsbCBub3QgcmVhbCBlZmZpY2llbnQsCi0JICovCi0JY2xhc3MgVGFnTmFtZUNhY2hlIHsKLQotCQlwcml2YXRlIGJvb2xlYW4gYWN0aXZlID0gdHJ1ZTsKLQotCQlwcml2YXRlIE1hcCBjYWNoZTsKLQotCQlwdWJsaWMgVGFnTmFtZUNhY2hlKCkgewotCQkJc3VwZXIoKTsKLQkJCWNhY2hlID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gYgotCQkgKi8KLQkJcHVibGljIHZvaWQgYWN0aXZhdGUoYm9vbGVhbiBiKSB7Ci0JCQlhY3RpdmUgPSBiOwotCQkJaWYgKCFiKQotCQkJCWNsZWFyKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRJdGVtKFN0cmluZyB0YWduYW1lLCBOb2RlTGlzdEltcGwgbm9kZWxpc3QpIHsKLQkJCWlmICh0YWduYW1lID09IG51bGwgfHwgbm9kZWxpc3QgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQljYWNoZS5wdXQodGFnbmFtZSwgbm9kZWxpc3QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQljYWNoZS5jbGVhcigpOwotCQl9Ci0KLQkJcHVibGljIE5vZGVMaXN0SW1wbCBnZXRJdGVtKFN0cmluZyB0YWdOYW1lKSB7Ci0JCQlOb2RlTGlzdEltcGwgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChhY3RpdmUpIHsKLQkJCQlyZXN1bHQgPSAoTm9kZUxpc3RJbXBsKSBjYWNoZS5nZXQodGFnTmFtZSk7Ci0JCQkJLy8gaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJnZXRFbGVtZW50c0J5VGFnbmFtZSBmcm9tIGNhY2hlOiAiICsKLQkJCQkvLyB0YWdOYW1lKTsKLQkJCQkvLyB9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIExpbWl0ZWRDYWNoZSBleHRlbmRzIExpbmtlZEhhc2hNYXAgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TSVpFID0gMTA7Ci0JCXB1YmxpYyBMaW1pdGVkQ2FjaGUoKSB7Ci0JCQlzdXBlcigwLCAwLjc1ZiwgdHJ1ZSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVFbGRlc3RFbnRyeShqYXZhLnV0aWwuTWFwLkVudHJ5IGVudHJ5KSB7Ci0JCQlyZXR1cm4gc2l6ZSgpID4gTUFYX1NJWkU7Ci0JCX0KLQl9Ci0KLQkvLyB0aGlzIGlzIGEgY29uc3RhbnQganVzdCB0byBnaXZlIGNvbXBpbGUtdGltZSBjb250cm9sIG92ZXIKLQkvLyB3aGV0aGVyIG9yIG5vdCB0byB1c2UgdGhlIGNhY2hlLiBJZiwgaW4gZnV0dXJlLCBpdHMgZm91bmQgdGhhdAotCS8vIHRoZXJlIGFyZSBubyAob3IgZmV3KSAiZHVwbGljYXRlIHJlcXVlc3RzIiAuLi4gdGhlbiB0aGlzIGNhY2hlCi0JLy8gaXMgbm90IG5lZWRlZC4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHVzZXRhZ25hbWVjYWNoZSA9IHRydWU7Ci0KLQkvLyBwcml2YXRlIERvY3VtZW50VHlwZUFkYXB0ZXIgZG9jdW1lbnRUeXBlQWRhcHRlciA9IG51bGw7Ci0KLQlwcml2YXRlIERPTU1vZGVsSW1wbCBtb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBUYWdOYW1lQ2FjaGUgdGFnTmFtZUNhY2hlOwotCi0JcHJpdmF0ZSBNYXAgZkNNQ2FjaGU7Ci0JLyoqCi0JICogRG9jdW1lbnRJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHVzZXRhZ25hbWVjYWNoZSkgewotCQkJdGFnTmFtZUNhY2hlID0gbmV3IFRhZ05hbWVDYWNoZSgpOwotCQl9Ci0JCWZDTUNhY2hlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBMaW1pdGVkQ2FjaGUoKSk7Ci0JfQotCi0JLyoqCi0JICogRG9jdW1lbnRJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIERvY3VtZW50SW1wbAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudEltcGwoRG9jdW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JCWlmICh1c2V0YWduYW1lY2FjaGUpIHsKLQkJCXRhZ05hbWVDYWNoZSA9IG5ldyBUYWdOYW1lQ2FjaGUoKTsKLQkJfQotCQlmQ01DYWNoZSA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgTGltaXRlZENhY2hlKCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiCi0JICovCi0Jdm9pZCBhY3RpdmF0ZVRhZ05hbWVDYWNoZShib29sZWFuIGIpIHsKLQkJdGFnTmFtZUNhY2hlLmFjdGl2YXRlKGIpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBDaGFuZ2VzIHRoZSA8Y29kZT5vd25lckRvY3VtZW50PC9jb2RlPiBvZiBhIG5vZGUsIGl0cyBjaGlsZHJlbiwgYXMKLQkgKiB3ZWxsIGFzIHRoZSBhdHRhY2hlZCBhdHRyaWJ1dGUgbm9kZXMgaWYgdGhlcmUgYXJlIGFueS4gSWYgdGhlIG5vZGUgaGFzCi0JICogYSBwYXJlbnQgaXQgaXMgZmlyc3QgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQgY2hpbGQgbGlzdC4gVGhpcwotCSAqIGVmZmVjdGl2ZWx5IGFsbG93cyBtb3ZpbmcgYSBzdWJ0cmVlIGZyb20gb25lIGRvY3VtZW50IHRvIGFub3RoZXIuIFRoZQotCSAqIGZvbGxvd2luZyBsaXN0IGRlc2NyaWJlcyB0aGUgc3BlY2lmaWNzIGZvciBlYWNoIHR5cGUgb2Ygbm9kZS4KLQkgKiA8ZGw+Ci0JICogPGR0PkFUVFJJQlVURV9OT0RFPC9kdD4KLQkgKiA8ZGQ+VGhlIDxjb2RlPm93bmVyRWxlbWVudDwvY29kZT4gYXR0cmlidXRlIGlzIHNldCB0bwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGFuZCB0aGUgPGNvZGU+c3BlY2lmaWVkPC9jb2RlPiBmbGFnIGlzIHNldCB0bwotCSAqIDxjb2RlPnRydWU8L2NvZGU+IG9uIHRoZSBhZG9wdGVkIDxjb2RlPkF0dHI8L2NvZGU+LiBUaGUKLQkgKiBkZXNjZW5kYW50cyBvZiB0aGUgc291cmNlIDxjb2RlPkF0dHI8L2NvZGU+IGFyZSByZWN1cnNpdmVseSBhZG9wdGVkLgotCSAqIDwvZGQ+Ci0JICogPGR0PkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU8L2R0PgotCSAqIDxkZD5UaGUgZGVzY2VuZGFudHMgb2YgdGhlIHNvdXJjZSBub2RlIGFyZSByZWN1cnNpdmVseSBhZG9wdGVkLjwvZGQ+Ci0JICogPGR0PkRPQ1VNRU5UX05PREU8L2R0PgotCSAqIDxkZD48Y29kZT5Eb2N1bWVudDwvY29kZT4gbm9kZXMgY2Fubm90IGJlIGFkb3B0ZWQuPC9kZD4KLQkgKiA8ZHQ+RE9DVU1FTlRfVFlQRV9OT0RFPC9kdD4KLQkgKiA8ZGQ+PGNvZGU+RG9jdW1lbnRUeXBlPC9jb2RlPiBub2RlcyBjYW5ub3QgYmUgYWRvcHRlZC48L2RkPgotCSAqIDxkdD5FTEVNRU5UX05PREU8L2R0PgotCSAqIDxkZD5TcGVjaWZpZWQgYXR0cmlidXRlIG5vZGVzIG9mIHRoZSBzb3VyY2UgZWxlbWVudCBhcmUgYWRvcHRlZCwgYW5kCi0JICogdGhlIGdlbmVyYXRlZCA8Y29kZT5BdHRyPC9jb2RlPiBub2Rlcy4gRGVmYXVsdCBhdHRyaWJ1dGVzIGFyZQotCSAqIGRpc2NhcmRlZCwgdGhvdWdoIGlmIHRoZSBkb2N1bWVudCBiZWluZyBhZG9wdGVkIGludG8gZGVmaW5lcyBkZWZhdWx0Ci0JICogYXR0cmlidXRlcyBmb3IgdGhpcyBlbGVtZW50IG5hbWUsIHRob3NlIGFyZSBhc3NpZ25lZC4gVGhlIGRlc2NlbmRhbnRzCi0JICogb2YgdGhlIHNvdXJjZSBlbGVtZW50IGFyZSByZWN1cnNpdmVseSBhZG9wdGVkLjwvZGQ+Ci0JICogPGR0PkVOVElUWV9OT0RFPC9kdD4KLQkgKiA8ZGQ+PGNvZGU+RW50aXR5PC9jb2RlPiBub2RlcyBjYW5ub3QgYmUgYWRvcHRlZC48L2RkPgotCSAqIDxkdD5FTlRJVFlfUkVGRVJFTkNFX05PREU8L2R0PgotCSAqIDxkZD5Pbmx5IHRoZSA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+IG5vZGUgaXRzZWxmIGlzIGFkb3B0ZWQsCi0JICogdGhlIGRlc2NlbmRhbnRzIGFyZSBkaXNjYXJkZWQsIHNpbmNlIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uCi0JICogZG9jdW1lbnRzIG1pZ2h0IGhhdmUgZGVmaW5lZCB0aGUgZW50aXR5IGRpZmZlcmVudGx5LiBJZiB0aGUgZG9jdW1lbnQKLQkgKiBiZWluZyBpbXBvcnRlZCBpbnRvIHByb3ZpZGVzIGEgZGVmaW5pdGlvbiBmb3IgdGhpcyBlbnRpdHkgbmFtZSwgaXRzCi0JICogdmFsdWUgaXMgYXNzaWduZWQuPC9kZD4KLQkgKiA8ZHQ+Tk9UQVRJT05fTk9ERTwvZHQ+Ci0JICogPGRkPjxjb2RlPk5vdGF0aW9uPC9jb2RlPiBub2RlcyBjYW5ub3QgYmUgYWRvcHRlZC48L2RkPgotCSAqIDxkdD5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUsIFRFWFRfTk9ERSwgQ0RBVEFfU0VDVElPTl9OT0RFLAotCSAqIENPTU1FTlRfTk9ERTwvZHQ+Ci0JICogPGRkPlRoZXNlIG5vZGVzIGNhbiBhbGwgYmUgYWRvcHRlZC4gTm8gc3BlY2lmaWNzLjwvZGQ+Ci0JICogU2hvdWxkIHRoaXMgbWV0aG9kIHNpbXBseSByZXR1cm4gbnVsbCB3aGVuIGl0IGZhaWxzPyBIb3cgImV4Y2VwdGlvbmFsIgotCSAqIGlzIGZhaWx1cmUgZm9yIHRoaXMgbWV0aG9kP1N0aWNrIHdpdGggcmFpc2luZyBleGNlcHRpb25zIG9ubHkgaW4KLQkgKiBleGNlcHRpb25hbCBjaXJjdW1zdGFuY2VzLCByZXR1cm4gbnVsbCBvbiBmYWlsdXJlIChGMkYgMTkgSnVuIDIwMDApLkNhbgotCSAqIGFuIGVudGl0eSBub2RlIHJlYWxseSBiZSBhZG9wdGVkP05vLCBuZWl0aGVyIGNhbiBOb3RhdGlvbiBub2RlcyAoVGVsY29uCi0JICogMTMgRGVjIDIwMDApLkRvZXMgdGhpcyBhZmZlY3Qga2V5cyBhbmQgaGFzaENvZGUncyBvZiB0aGUgYWRvcHRlZAotCSAqIHN1YnRyZWUgbm9kZXM/SWYgc28sIHdoYXQgYWJvdXQgcmVhZG9ubHktbmVzcyBvZiBrZXkgYW5kIGhhc2hDb2RlP2lmCi0JICogbm90LCB3b3VsZCBhcHBlbmRDaGlsZCBhZmZlY3Qga2V5cy9oYXNoQ29kZXMgb3Igd291bGQgaXQgZ2VuZXJhdGUKLQkgKiBleGNlcHRpb25zIGlmIGtleSdzIGFyZSBkdXBsaWNhdGU/IFVwZGF0ZTogSGFzaGNvZGVzIGhhdmUgYmVlbiBkcm9wcGVkLgotCSAqIEdpdmVuIHRoYXQgdGhlIGtleSBpcyBvbmx5IHVuaXF1ZSB3aXRoaW4gYSBkb2N1bWVudCBhbiBhZG9wdGVkIG5vZGUKLQkgKiBuZWVkcyB0byBiZSBnaXZlbiBhIG5ldyBrZXksIGJ1dCB3aGF0IGRvZXMgaXQgbWVhbiBmb3IgdGhlIGFwcGxpY2F0aW9uPwotCSAqIAotCSAqIFRPRE86IE5lZWRzIHRvIG5vdGlmeSBVc2VyRGF0YUhhbmRsZXJzIGZvciB0aGUgbm9kZSBpZiBhbnkKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogICAgICAgICAgICBUaGUgbm9kZSB0byBtb3ZlIGludG8gdGhpcyBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIFRoZSBhZG9wdGVkIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgb3BlcmF0aW9uCi0JICogICAgICAgICBmYWlscywgc3VjaCBhcyB3aGVuIHRoZSBzb3VyY2Ugbm9kZSBjb21lcyBmcm9tIGEgZGlmZmVyZW50Ci0JICogICAgICAgICBpbXBsZW1lbnRhdGlvbi4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PVF9TVVBQT1JURURfRVJSOiBSYWlzZWQgaWYgdGhlIHNvdXJjZSBub2RlIGlzIG9mIHR5cGUKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5ET0NVTUVOVDwvY29kZT4sPGNvZGU+RE9DVU1FTlRfVFlQRTwvY29kZT4uCi0JICogICAgICAgICAgICAgICAgPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIHdoZW4gdGhlIHNvdXJjZSBub2RlCi0JICogICAgICAgICAgICAgICAgaXMgcmVhZG9ubHkuCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGFkb3B0Tm9kZShvcmcudzNjLmRvbS5Ob2RlIHNvdXJjZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tUYWdOYW1lVmFsaWRpdHkoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKCFpc1ZhbGlkTmFtZSh0YWdOYW1lKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9DSEFSQUNURVJfRVJSLCBjcmVhdGVET01FeGNlcHRpb25NZXNzYWdlKERPTUV4Y2VwdGlvbi5JTlZBTElEX0NIQVJBQ1RFUl9FUlIsIHRhZ05hbWUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRG9jdW1lbnRJbXBsIGNsb25lZCA9IG5ldyBEb2N1bWVudEltcGwodGhpcyk7Ci0JCWlmIChkZWVwKQotCQkJY2xvbmVkLmltcG9ydENoaWxkTm9kZXModGhpcywgdHJ1ZSk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQXR0cmlidXRlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEF0dHIgY3JlYXRlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJY2hlY2tUYWdOYW1lVmFsaWRpdHkobmFtZSk7Ci0JCUF0dHJJbXBsIGF0dHIgPSBuZXcgQXR0ckltcGwoKTsKLQkJYXR0ci5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlhdHRyLnNldE5hbWUobmFtZSk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBBdHRyIGNyZWF0ZUF0dHJpYnV0ZU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJY2hlY2tUYWdOYW1lVmFsaWRpdHkobmFtZSk7Ci0JCUF0dHJJbXBsIGF0dHIgPSBuZXcgQXR0ckltcGwoKTsKLQkJYXR0ci5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlhdHRyLnNldE5hbWUobmFtZSk7Ci0JCWF0dHIuc2V0TmFtZXNwYWNlVVJJKHVyaSk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUNEQVRBU2VjdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbgotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENEQVRBU2VjdGlvbiBjcmVhdGVDREFUQVNlY3Rpb24oU3RyaW5nIGRhdGEpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBhbGxvdyBDREFUQSBzZWN0aW9uCi0JCS8vIGlmICghaXNYTUxUeXBlKCkpIHsKLQkJLy8gdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsIG5ldwotCQkvLyBTdHJpbmcoKSk7Ci0JCS8vIH0KLQkJQ0RBVEFTZWN0aW9uSW1wbCBjZGF0YSA9IG5ldyBDREFUQVNlY3Rpb25JbXBsKCk7Ci0JCWNkYXRhLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWlmIChkYXRhICE9IG51bGwpCi0JCQljZGF0YS5zZXREYXRhKGRhdGEpOwotCQlyZXR1cm4gY2RhdGE7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQ29tbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkNvbW1lbnQKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDb21tZW50IGNyZWF0ZUNvbW1lbnQoU3RyaW5nIGRhdGEpIHsKLQkJQ29tbWVudEltcGwgY29tbWVudCA9IG5ldyBDb21tZW50SW1wbCgpOwotCQljb21tZW50LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWlmIChkYXRhICE9IG51bGwpCi0JCQljb21tZW50LnNldERhdGEoZGF0YSk7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUNvbW1lbnRFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBib29sZWFuIGlzSlNQVGFnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJRWxlbWVudCByZXN1bHQgPSBudWxsOwotCQlpZiAoIWlzSlNQVHlwZSgpICYmIGlzSlNQVGFnKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsIERPTU1lc3NhZ2VzLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUik7Ci0JCX0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKLQkJZWxlbWVudC5zZXRKU1BUYWcoaXNKU1BUYWcpOwotCQlDb21tZW50RWxlbWVudFJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gQ29tbWVudEVsZW1lbnRSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlpZiAocmVnaXN0cnkuc2V0dXBDb21tZW50RWxlbWVudChlbGVtZW50KSkgewotCQkJcmVzdWx0ID0gZWxlbWVudDsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQ0hBUkFDVEVSX0VSUiwgRE9NTWVzc2FnZXMuSU5WQUxJRF9DSEFSQUNURVJfRVJSKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZURvY3R5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBEb2N1bWVudFR5cGUgY3JlYXRlRG9jdHlwZShTdHJpbmcgbmFtZSkgewotCQlEb2N1bWVudFR5cGVJbXBsIGRvY1R5cGUgPSBuZXcgRG9jdW1lbnRUeXBlSW1wbCgpOwotCQlkb2NUeXBlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWRvY1R5cGUuc2V0TmFtZShuYW1lKTsKLQkJcmV0dXJuIGRvY1R5cGU7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRG9jdW1lbnRGcmFnbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBjcmVhdGVEb2N1bWVudEZyYWdtZW50KCkgewotCQlEb2N1bWVudEZyYWdtZW50SW1wbCBmcmFnbWVudCA9IG5ldyBEb2N1bWVudEZyYWdtZW50SW1wbCgpOwotCQlmcmFnbWVudC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlyZXR1cm4gZnJhZ21lbnQ7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQljaGVja1RhZ05hbWVWYWxpZGl0eSh0YWdOYW1lKTsKLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gbmV3IEVsZW1lbnRJbXBsKCk7Ci0JCWVsZW1lbnQuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJZWxlbWVudC5zZXRUYWdOYW1lKHRhZ05hbWUpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50TlMoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZ05hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIWlzVmFsaWROYW1lKHRhZ05hbWUpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0NIQVJBQ1RFUl9FUlIsIERPTU1lc3NhZ2VzLklOVkFMSURfQ0hBUkFDVEVSX0VSUik7Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBjcmVhdGVFbGVtZW50KHRhZ05hbWUpOwotCQllbGVtZW50LnNldE5hbWVzcGFjZVVSSSh1cmkpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVFbnRpdHkgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbnRpdHkKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBFbnRpdHkgY3JlYXRlRW50aXR5KFN0cmluZyBuYW1lKSB7Ci0JCUVudGl0eUltcGwgZW50aXR5ID0gbmV3IEVudGl0eUltcGwoKTsKLQkJZW50aXR5LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWVudGl0eS5zZXROYW1lKG5hbWUpOwotCQlyZXR1cm4gZW50aXR5OwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUVudGl0eVJlZmVyZW5jZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEVudGl0eVJlZmVyZW5jZSBjcmVhdGVFbnRpdHlSZWZlcmVuY2UoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIWlzWE1MVHlwZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgRE9NTWVzc2FnZXMuTk9UX1NVUFBPUlRFRF9FUlIpOwotCQl9Ci0KLQkJRW50aXR5UmVmZXJlbmNlSW1wbCByZWYgPSBuZXcgRW50aXR5UmVmZXJlbmNlSW1wbCgpOwotCQlyZWYuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJcmVmLnNldE5hbWUobmFtZSk7Ci0JCXJldHVybiByZWY7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIE5vZGVJdGVyYXRvciBjcmVhdGVOb2RlSXRlcmF0b3IoTm9kZSByb290LCBpbnQgd2hhdFRvU2hvdywgTm9kZUZpbHRlciBmaWx0ZXIsIGJvb2xlYW4gZW50aXR5UmVmZXJlbmNlRXhwYW5zaW9uKSB7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyb290ID0gdGhpczsKLQkJcmV0dXJuIG5ldyBOb2RlSXRlcmF0b3JJbXBsKHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlcik7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlTm90YXRpb24gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob3RhdGlvbgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIE5vdGF0aW9uIGNyZWF0ZU5vdGF0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCU5vdGF0aW9uSW1wbCBub3RhdGlvbiA9IG5ldyBOb3RhdGlvbkltcGwoKTsKLQkJbm90YXRpb24uc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJbm90YXRpb24uc2V0TmFtZShuYW1lKTsKLQkJcmV0dXJuIG5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbgotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBwaSA9IG5ldyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKCk7Ci0JCXBpLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCXBpLnNldFRhcmdldCh0YXJnZXQpOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJcGkuc2V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIHBpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBSYW5nZSBjcmVhdGVSYW5nZSgpIHsKLQkJcmV0dXJuIG5ldyBSYW5nZUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVUZXh0Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLlRleHQKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBUZXh0IGNyZWF0ZVRleHROb2RlKFN0cmluZyBkYXRhKSB7Ci0JCVRleHRJbXBsIHRleHQgPSBuZXcgVGV4dEltcGwoKTsKLQkJdGV4dC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQl0ZXh0LnNldERhdGEoZGF0YSk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiB0cmVlIHdhbGsKLQkgKi8KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Eb2N1bWVudFRyYXZlcnNhbCNjcmVhdGVUcmVlV2Fsa2VyKG9yZy53M2MuZG9tLk5vZGUsCi0JICogICAgICBpbnQsIG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBUcmVlV2Fsa2VyIGNyZWF0ZVRyZWVXYWxrZXIoTm9kZSByb290LCBpbnQgd2hhdFRvU2hvdywgTm9kZUZpbHRlciBmaWx0ZXIsIGJvb2xlYW4gZW50aXR5UmVmZXJlbmNlRXhwYW5zaW9uKSB7Ci0JCWlmIChyb290ID09IG51bGwpIHsKLQkJCVN0cmluZyBtc2cgPSBET01NZXNzYWdlcy5OT1RfU1VQUE9SVEVEX0VSUiArICIgLSBQcm9ncmFtIEVycm9yOiByb290IG5vZGUgY2FuIG5vdCBiZSBudWxsIGZvciBUcmVlV2Fsa2VyIjsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCBtc2cpOwotCQl9Ci0JCS8vIElTU1VFOiB3ZSBqdXN0IHVzZSBYZXJjZXMgaW1wbGVtZW50YXRpb24gZm9yIG5vdywgYnV0IGxvbmdlciB0ZXJtLAotCQkvLyB3ZSBzaG91bGQgbWFrZSBhCi0JCS8vIHRocmVhZC9qb2Igc2FmZSB2ZXJzaW9uIChhcyB3ZWxsIGFzIG5vdCByZWx5IG9uIFhlcmNlcyAiaW1wbCIKLQkJLy8gY2xhc3MuCi0JCXJldHVybiBuZXcgVHJlZVdhbGtlckltcGwocm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyLCBlbnRpdHlSZWZlcmVuY2VFeHBhbnNpb24pOwotCi0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudFR5cGUgZmluZERvY3R5cGUoTm9kZSBub2RlKSB7Ci0JCQotCQlpbnQgY291bnRTZWFyY2ggPSAwOwotCQlmb3IgKE5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY291bnRTZWFyY2grKyA+IG1heERvY1R5cGVTZWFyY2gpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IERPQ1VNRU5UX1RZUEVfTk9ERSAmJiBjaGlsZCBpbnN0YW5jZW9mIERvY3VtZW50VHlwZSkgewotCQkJCXJldHVybiAoRG9jdW1lbnRUeXBlKSBjaGlsZDsKLQkJCX0KLQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gRUxFTUVOVF9OT0RFICYmICgoSURPTUVsZW1lbnQpIGNoaWxkKS5pc0NvbW1lbnRUYWcoKSkgewotCQkJCS8vIHNlYXJjaCBET0NUWVBFIGluc2lkZSBvZiBnZW5lcmljIGNvbW1lbnQgZWxlbWVudAotCQkJCURvY3VtZW50VHlwZSBkb2NUeXBlID0gZmluZERvY3R5cGUoY2hpbGQpOwotCQkJCWlmIChkb2NUeXBlICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGRvY1R5cGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBFbGVtZW50IGZpbmREb2N1bWVudEVsZW1lbnQoU3RyaW5nIGRvY05hbWUsIE5vZGUgbm9kZSwgTm9kZVtdIGZpcnN0Rm91bmQsIGludCBtYXgpIHsKLQkJaW50IGNvdW50U2VhcmNoID0gMDsKLQkJZm9yIChOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCi0JCQkvKiAKLQkJCSAqIG1heERvY1R5cGVTZWFyY2ggbGltaXRzIGFkZGVkIHZpYSBidWcgMTUxOTI5Ci0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUxOTI5Ci0JCQkgKiBidXQsIGluIG90aGVyIGNvbnRleHRzLCAKLQkJCSAqIGlmIG5vTWF4U2VhcmNoIGlzIHNwZWNpZmllZCwgdGhlbiBkbyBub3QgImJyZWFrIG91dCIgb2YgbG9uZyBzZWFyY2hlcyAKLQkJCSAqICovCi0JCQlpZiAobWF4ICE9IG5vTWF4U2VhcmNoICYmIGNvdW50U2VhcmNoKysgPiBtYXgpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGNoaWxkOwotCQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCQlFbGVtZW50IGRvY0VsZW1lbnQgPSBmaW5kRG9jdW1lbnRFbGVtZW50KGRvY05hbWUsIGVsZW1lbnQsIGZpcnN0Rm91bmQsIG1heCk7Ci0JCQkJaWYgKGRvY0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZG9jRWxlbWVudDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGFkZGVkICdlbHNlIGNvbnRpbnVlJyB0byBiZXR0ZXIgaGFuZGxlIGNhc2VzIHdoZXJlCi0JCQkJCS8vIHRoZXJlIGlzICJtb3JlIHRoYW4gb25lIHJvb3QiIGVsZW1lbnQKLQkJCQkJLy8gZXNwZWNpYWxseSBjb21wbGljYXRlZCBieSBDb21tZW50RWxlbWVudHMsIHdoaWNoIGFyZQotCQkJCQkvLyBzb21ldGltZXMgdHJlYXRlZCBhcyBlbGVtZW50cywgYnV0IHNob3VsZAotCQkJCQkvLyBiZSB0cmVhdGVkIGFzIGNvbW1lbnRzIGluIHRoaXMgY29udGV4dC4KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJLy8gbm90ZTogdGhlICJuYW1lIiB3b24ndCBtYXRjaCBpbiB0aGUgZXZlbnQgb2YgYSBqc3AgdGFnIC4uLiBidXQKLQkJCS8vIGluY2FzZQotCQkJLy8gdGhlIG5hbWUgaXMgbnVsbCwgd2UgZG8gbm90IHdhbnQgdGhlIGpzcCBlbGVtZW50IHJldHVybmVkIGFzCi0JCQkvLyBkb2N1bWVudEVsZW1lbnQKLQkJCWlmIChlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoZG9jTmFtZSA9PSBudWxsKQotCQkJCXJldHVybiBlbGVtZW50OwotCQkJLy8gdXNlIGxvY2FsIG5hbWUgZm9yIG5hbWVzcGFjZQotCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0JCQlpZiAobG9jYWxOYW1lID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoaXNYTUxUeXBlKCkpIHsKLQkJCQlpZiAobG9jYWxOYW1lLmVxdWFscyhkb2NOYW1lKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobG9jYWxOYW1lLmVxdWFsc0lnbm9yZUNhc2UoZG9jTmFtZSkpCi0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQkJaWYgKGZpcnN0Rm91bmRbMF0gPT0gbnVsbCkKLQkJCQlmaXJzdEZvdW5kWzBdID0gZWxlbWVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDaGFyVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENoYXJWYWx1ZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBsZW5ndGggPSBuYW1lLmxlbmd0aCgpOwotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAobmFtZS5jaGFyQXQoMCkgPT0gJyMnKSB7IC8vIGNoYXJhY3RlciByZWZlcmVuY2UKLQkJCWlmIChsZW5ndGggPT0gMSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWludCByYWRpeCA9IDEwOwotCQkJU3RyaW5nIHMgPSBudWxsOwotCQkJLy8gbm93IGFsbG93IGhleGFkZWNpbWFsIGFsc28gZm9yIG5vbiBYTUwgZG9jdW1lbnQKLQkJCWlmIChuYW1lLmNoYXJBdCgxKSA9PSAneCcpIHsgLy8gaGV4YWRlY2ltYWwKLQkJCQlyYWRpeCA9IDE2OwotCQkJCXMgPSBuYW1lLnN1YnN0cmluZygyKTsKLQkJCX0KLQkJCWVsc2UgeyAvLyBkZWNpbWFsCi0JCQkJcyA9IG5hbWUuc3Vic3RyaW5nKDEpOwotCQkJfQotCQkJaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAocy5jaGFyQXQoMCkgPT0gJy0nKQotCQkJCXJldHVybiBudWxsOyAvLyBubyBtaW51cyBhY2NlcHRlZAotCQkJY2hhciBjID0gMDsKLQkJCXRyeSB7Ci0JCQkJYyA9IChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50KHMsIHJhZGl4KTsKLQkJCX0KLQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKLQkJCX0KLQkJCWlmIChjID09IDApCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoYyk7Ci0JCX0KLQotCQkvLyBpbXBsaWNpdCBjaGFyYWN0ZXIgZW50aXRpZXMgZm9yIFhNTAotCQlpZiAobmFtZS5lcXVhbHMoSVhNTENoYXJFbnRpdHkuTFRfTkFNRSkpCi0JCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuTFRfVkFMVUU7Ci0JCWlmIChuYW1lLmVxdWFscyhJWE1MQ2hhckVudGl0eS5HVF9OQU1FKSkKLQkJCXJldHVybiBJWE1MQ2hhckVudGl0eS5HVF9WQUxVRTsKLQkJaWYgKG5hbWUuZXF1YWxzKElYTUxDaGFyRW50aXR5LkFNUF9OQU1FKSkKLQkJCXJldHVybiBJWE1MQ2hhckVudGl0eS5BTVBfVkFMVUU7Ci0JCWlmIChuYW1lLmVxdWFscyhJWE1MQ2hhckVudGl0eS5RVU9UX05BTUUpKQotCQkJcmV0dXJuIElYTUxDaGFyRW50aXR5LlFVT1RfVkFMVUU7Ci0JCWlmIChpc1hNTFR5cGUoKSkgewotCQkJaWYgKG5hbWUuZXF1YWxzKElYTUxDaGFyRW50aXR5LkFQT1NfTkFNRSkpCi0JCQkJcmV0dXJuIElYTUxDaGFyRW50aXR5LkFQT1NfVkFMVUU7Ci0JCX0KLQotCQlDTURvY3VtZW50IGNtID0gZ2V0Q01Eb2N1bWVudCgpOwotCQlpZiAoY20gIT0gbnVsbCkgewotCQkJQ01OYW1lZE5vZGVNYXAgbWFwID0gY20uZ2V0RW50aXRpZXMoKTsKLQkJCWlmIChtYXAgIT0gbnVsbCkgewotCQkJCUNNRW50aXR5RGVjbGFyYXRpb24gZGVjbCA9IChDTUVudGl0eURlY2xhcmF0aW9uKSBtYXAuZ2V0TmFtZWRJdGVtKG5hbWUpOwotCQkJCWlmIChkZWNsICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHZhbHVlID0gZGVjbC5nZXRWYWx1ZSgpOwotCQkJCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQlpbnQgdmFsdWVMZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLQkJCQkJaWYgKHZhbHVlTGVuZ3RoID4gMSAmJiB2YWx1ZS5jaGFyQXQoMCkgPT0gJyYnICYmIHZhbHVlLmNoYXJBdCgxKSA9PSAnIycgJiYgdmFsdWUuY2hhckF0KHZhbHVlTGVuZ3RoIC0gMSkgPT0gJzsnKSB7Ci0JCQkJCQkvLyBjaGFyYWN0ZXIgcmVmZXJlbmNlCi0JCQkJCQlyZXR1cm4gZ2V0Q2hhclZhbHVlKHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZUxlbmd0aCAtIDEpKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpIHsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSh0aGlzKTsKLQkJaWYgKG1vZGVsUXVlcnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbW9kZWxRdWVyeS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREb2N0eXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlCi0JICovCi0JcHVibGljIERvY3VtZW50VHlwZSBnZXREb2N0eXBlKCkgewotCQlyZXR1cm4gZmluZERvY3R5cGUodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RG9jdW1lbnRFbGVtZW50Ci0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50IEZyb20gRE9NIDIgU3BlYzogZG9jdW1lbnRFbGVtZW50IG9mIHR5cGUKLQkgKiAgICAgICAgIEVsZW1lbnQgW3AuNjJdICwgcmVhZG9ubHkgVGhpcyBpcyBhIGNvbnZlbmllbmNlIFtwLjExOV0KLQkgKiAgICAgICAgIGF0dHJpYnV0ZSB0aGF0IGFsbG93cyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBjaGlsZCBub2RlIHRoYXQgaXMKLQkgKiAgICAgICAgIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIGRvY3VtZW50LiBGb3IgSFRNTCBkb2N1bWVudHMsIHRoaXMgaXMKLQkgKiAgICAgICAgIHRoZSBlbGVtZW50IHdpdGggdGhlIHRhZ05hbWUgIkhUTUwiLiBOb3RlOiB3ZSBkaWZmZXIgZnJvbSB0aGlzCi0JICogICAgICAgICBkZWZpbml0aW9uIGEgbGl0dGxlIGluIHRoYXQgd2UgZG9uJ3QgbmVjZXNzYXJpbHkgdGFrZSB0aGUgZmlyc3QKLQkgKiAgICAgICAgIGNoaWxkIGJ1dCBhbHNvIGxvb2sgdG8gbWF0Y2ggdGhlIG5hbWUuIEluIGEgd2VsbCBmb3JtZWQKLQkgKiAgICAgICAgIGRvY3VtZW50LCBvZiBjb3Vyc2UsIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUsIGJ1dCBub3QKLQkgKiAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGluIGFuIGlsbC1mb3JtZWQgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIEVsZW1lbnQgZ2V0RG9jdW1lbnRFbGVtZW50KCkgewotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCURvY3VtZW50VHlwZSBkb2NUeXBlID0gZ2V0RG9jdW1lbnRUeXBlKCk7Ci0JCWlmIChkb2NUeXBlICE9IG51bGwpIHsKLQkJCW5hbWUgPSBkb2NUeXBlLmdldE5hbWUoKTsKLQkJfQotCi0JCUVsZW1lbnQgZmlyc3RbXSA9IG5ldyBFbGVtZW50WzFdOwotCQlFbGVtZW50IGRvY0VsZW1lbnQgPSBmaW5kRG9jdW1lbnRFbGVtZW50KG5hbWUsIHRoaXMsIGZpcnN0LCBub01heFNlYXJjaCk7Ci0JCWlmIChkb2NFbGVtZW50ID09IG51bGwpIHsKLQkJCWRvY0VsZW1lbnQgPSBmaXJzdFswXTsKLQkJfQotCi0JCXJldHVybiBkb2NFbGVtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudFR5cGUgZ2V0RG9jdW1lbnRUeXBlKCkgewotCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBnZXREb2N0eXBlKCk7Ci0JCXJldHVybiBhZGFwdGVyLmdldERvY3VtZW50VHlwZSgpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXREb2N1bWVudFR5cGVJZCgpIHsKLQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBnZXREb2N1bWVudFR5cGUoKTsKLQkJaWYgKGRvY1R5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgaWQgPSBkb2NUeXBlLmdldFB1YmxpY0lkKCk7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJaWQgPSBkb2NUeXBlLmdldFN5c3RlbUlkKCk7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50QnlJZChTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZUl0ZXJhdG9yIGl0ID0gY3JlYXRlTm9kZUl0ZXJhdG9yKHRoaXMsIE5vZGVGaWx0ZXIuU0hPV19BTEwsIG51bGwsIGZhbHNlKTsKLQkJaWYgKGl0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlmb3IgKE5vZGUgbm9kZSA9IGl0Lm5leHROb2RlKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IGl0Lm5leHROb2RlKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gRUxFTUVOVF9OT0RFKQotCQkJCWNvbnRpbnVlOwotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCWlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgiaWQiKSAmJiBpZC5lcXVhbHMoZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIikpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCQlOb2RlTGlzdEltcGwgZWxlbWVudHMgPSBudWxsOwotCi0JCWlmICh1c2V0YWduYW1lY2FjaGUpIHsKLQkJCWVsZW1lbnRzID0gdGFnTmFtZUNhY2hlLmdldEl0ZW0odGFnTmFtZSk7Ci0JCX0KLQotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJZWxlbWVudHMgPSBpbnRlcm5hbEdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOwotCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJTm9kZUl0ZXJhdG9yIGl0ID0gY3JlYXRlTm9kZUl0ZXJhdG9yKHRoaXMsIE5vZGVGaWx0ZXIuU0hPV19BTEwsIG51bGwsIGZhbHNlKTsKLQkJaWYgKGl0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCgpOwotCQlOb2RlTGlzdEltcGwgZWxlbWVudHMgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJaWYgKHVyaSAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA9PSAxICYmIHVyaS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQl1cmkgPSBudWxsOyAvLyBkbyBub3QgY2FyZQotCQl9Ci0JCWlmICh0YWdOYW1lLmxlbmd0aCgpID09IDEgJiYgdGFnTmFtZS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQl0YWdOYW1lID0gbnVsbDsgLy8gZG8gbm90IGNhcmUKLQkJfQotCi0JCWZvciAoTm9kZSBub2RlID0gaXQubmV4dE5vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gaXQubmV4dE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBsb2NhbE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotCQkJCWlmIChsb2NhbE5hbWUgPT0gbnVsbCB8fCAhbG9jYWxOYW1lLmVxdWFscyh0YWdOYW1lKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbnNVUkkgPSBlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotCQkJCWlmIChuc1VSSSA9PSBudWxsIHx8ICFuc1VSSS5lcXVhbHModXJpKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbGVtZW50cy5hcHBlbmROb2RlKGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgWE1MIGRlY2xhcmF0aW9uLCB0aGUgZW5jb2RpbmcKLQkgKiBvZiB0aGlzIGRvY3VtZW50LiBUaGlzIGlzIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gdW5zcGVjaWZpZWQuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRE9NSW1wbGVtZW50YXRpb24gZ2V0SW1wbGVtZW50YXRpb24oKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBvdGhlciBub2RlcyB3aWxsIGJlIHJlZmVycmluZyB0byB0aGlzIG9uZSB0byBnZXQgdGhlIG93bmluZyBtb2RlbAotCSAqLwotCXB1YmxpYyBJRE9NTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gIiNkb2N1bWVudCI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBET0NVTUVOVF9OT0RFOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgWE1MIGRlY2xhcmF0aW9uLCB3aGV0aGVyIHRoaXMKLQkgKiBkb2N1bWVudCBpcyBzdGFuZGFsb25lLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRTdGFuZGFsb25lKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nIHdoZXRoZXIgZXJyb3JzIGNoZWNraW5nIGlzIGVuZm9yY2VkIG9yIG5vdC4KLQkgKiBXaGVuIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHRvIG5vdAotCSAqIHRlc3QgZXZlcnkgcG9zc2libGUgZXJyb3IgY2FzZSBub3JtYWxseSBkZWZpbmVkIG9uIERPTSBvcGVyYXRpb25zLCBhbmQKLQkgKiBub3QgcmFpc2UgYW55IDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4uIEluIGNhc2Ugb2YgZXJyb3IsIHRoZQotCSAqIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4gVGhpcyBhdHRyaWJ1dGUgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gYnkKLQkgKiBkZWZhdWx0cy4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U3RyaWN0RXJyb3JDaGVja2luZygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgWE1MIGRlY2xhcmF0aW9uLCB0aGUgdmVyc2lvbgotCSAqIG51bWJlciBvZiB0aGlzIGRvY3VtZW50LiBUaGlzIGlzIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gdW5zcGVjaWZpZWQuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaWdub3JlQ2FzZSgpIHsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpIGdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoYWRhcHRlci5nZXRUYWdOYW1lQ2FzZSgpICE9IERvY3VtZW50VHlwZUFkYXB0ZXIuU1RSSUNUX0NBU0UpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGltcG9ydENoaWxkTm9kZXMoTm9kZSBwYXJlbnQsIGJvb2xlYW4gZGVlcCkgewotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJcmVtb3ZlQ2hpbGROb2RlcygpOwotCi0JCWZvciAoTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJTm9kZSBpbXBvcnRlZCA9IGltcG9ydE5vZGUoY2hpbGQsIGRlZXApOwotCQkJaWYgKGltcG9ydGVkID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlhcHBlbmRDaGlsZChpbXBvcnRlZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgTm9kZSBpbXBvcnROb2RlKE5vZGUgbm9kZSwgYm9vbGVhbiBkZWVwKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlOb2RlSW1wbCBpbXBvcnRlZCA9IChOb2RlSW1wbCkgbm9kZS5jbG9uZU5vZGUoZGVlcCk7Ci0JCWlmIChpbXBvcnRlZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vc3VjY2Vzc2Z1bCBpbXBvcnQsIG5vdGlmeSBVc2VyRGF0YUhhbmRsZXJzIGlmIGFueQotCQlOb2RlSW1wbCBub2RlVG9Ob3RpZnk9KE5vZGVJbXBsKSBub2RlOwotCQlub2RlVG9Ob3RpZnkubm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9JTVBPUlRFRCwgbnVsbCk7Ci0JCWltcG9ydGVkLnNldE93bmVyRG9jdW1lbnQodGhpcywgZGVlcCk7Ci0JCXJldHVybiBpbXBvcnRlZDsKLQl9Ci0KLQlwcml2YXRlIE5vZGVMaXN0SW1wbCBpbnRlcm5hbEdldEVsZW1lbnRzQnlUYWdOYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0RWxlbWVudHNCeVRhZ25hbWU6ICIgKyB0YWdOYW1lKTsKLQkJTm9kZUl0ZXJhdG9yIGl0ID0gY3JlYXRlTm9kZUl0ZXJhdG9yKHRoaXMsIE5vZGVGaWx0ZXIuU0hPV19BTEwsIG51bGwsIGZhbHNlKTsKLQkJaWYgKGl0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCgpOwotCQlOb2RlTGlzdEltcGwgZWxlbWVudHMgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJaWYgKHRhZ05hbWUubGVuZ3RoKCkgPT0gMSAmJiB0YWdOYW1lLmNoYXJBdCgwKSA9PSAnKicpIHsKLQkJCXRhZ05hbWUgPSBudWxsOyAvLyBkbyBub3QgY2FyZQotCQl9Ci0KLQkJZm9yIChOb2RlIG5vZGUgPSBpdC5uZXh0Tm9kZSgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBpdC5uZXh0Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCWlmICh0YWdOYW1lICE9IG51bGwpIHsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJCWlmICghZWxlbWVudC5tYXRjaFRhZ05hbWUodGFnTmFtZSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxlbWVudHMuYXBwZW5kTm9kZShub2RlKTsKLQkJfQotCQlpZiAodXNldGFnbmFtZWNhY2hlKSB7Ci0JCQl0YWdOYW1lQ2FjaGUuYWRkSXRlbSh0YWdOYW1lLCBlbGVtZW50cyk7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSlNQRG9jdW1lbnQoKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldERvY3VtZW50RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHMoSlNQVGFnLkpTUF9ST09UKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0pTUFR5cGUoKSB7Ci0JCWlmICh0aGlzLm1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IHRoaXMubW9kZWwuZ2V0TW9kZWxIYW5kbGVyKCk7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBpZCA9IGhhbmRsZXIuZ2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoKTsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIElTU1VFOiAtLSBhdm9pZCB0aGlzIGhhcmRjb2RlZCBzdHJpbmcKLQkJcmV0dXJuIGlkLmVxdWFscygib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIC8vIERNVzogbW9kaWZpZWQgZm9yIFhNTDRKIDQuMC4xCi0JCS8vIGlmIChYTUxDaGFyLmlzVmFsaWROYW1lKG5hbWUpKSByZXR1cm4gdHJ1ZTsKLQkJaWYgKE5hbWVWYWxpZGF0b3IuaXNWYWxpZChuYW1lKSkKLQkJCXJldHVybiB0cnVlOwotCQkvLyBzcGVjaWFsIGZvciBpbnZhbGlkIGRlY2xhcmF0aW9uCi0JCWlmIChuYW1lLmxlbmd0aCgpID09IDEgJiYgbmFtZS5jaGFyQXQoMCkgPT0gJyEnKQotCQkJcmV0dXJuIHRydWU7Ci0JCS8vIHNwZWNpYWwgZm9yIEpTUCB0YWcgaW4gdGFnIG5hbWUKLQkJaWYgKG5hbWUuc3RhcnRzV2l0aChKU1BUYWcuVEFHX09QRU4pKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1hNTFR5cGUoKSB7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBhZGFwdGVyLmlzWE1MVHlwZSgpOwotCX0KLQotCS8qKgotCSAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHJlbGVhc2VEb2N1bWVudFR5cGUoKSB7Ci0JLy8gaWYgKHRoaXMuZG9jdW1lbnRUeXBlQWRhcHRlciA9PSBudWxsKQotCS8vIHJldHVybjsKLQkvLyB0aGlzLmRvY3VtZW50VHlwZUFkYXB0ZXIucmVsZWFzZSgpOwotCS8vIHRoaXMuZG9jdW1lbnRUeXBlQWRhcHRlciA9IG51bGw7Ci0JLy8gfQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgWE1MIGRlY2xhcmF0aW9uLCB0aGUgZW5jb2RpbmcKLQkgKiBvZiB0aGlzIGRvY3VtZW50LiBUaGlzIGlzIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gdW5zcGVjaWZpZWQuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nKGphdmEubGFuZy5TdHJpbmcgZW5jb2RpbmcpIHsKLQl9Ci0KLQkvKioKLQkgKiBzZXRNb2RlbCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIFhNTE1vZGVsCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbChJRE9NTW9kZWwgbW9kZWwpIHsKLQkJdGhpcy5tb2RlbCA9IChET01Nb2RlbEltcGwpIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIGFuIGVsZW1lbnQncyBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gcmV0cmlldmUgdGhlIGF0dHJpYnV0ZSBtYXAgb2YKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q01OYW1lZE5vZGVNYXA8L2NvZGU+IG9mIGF0dHJpYnV0ZXMgaWYgdGhlIGRlY2xhcmF0aW9uIGV4aXN0czsgbnVsbCBvdGhlcndpc2UuCi0JICovCi0JQ01OYW1lZE5vZGVNYXAgZ2V0Q01BdHRyaWJ1dGVzKEVsZW1lbnQgZWxlbWVudCkgewotCQlDTU5hbWVkTm9kZU1hcCBtYXAgPSAoQ01OYW1lZE5vZGVNYXApIGZDTUNhY2hlLmdldChlbGVtZW50KTsKLQkJaWYgKG1hcCA9PSBudWxsKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSh0aGlzKS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCWlmIChkZWNsICE9IG51bGwpIHsKLQkJCQltYXAgPSBkZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlmQ01DYWNoZS5wdXQoZWxlbWVudCwgbWFwKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgWE1MIGRlY2xhcmF0aW9uLCB3aGV0aGVyIHRoaXMKLQkgKiBkb2N1bWVudCBpcyBzdGFuZGFsb25lLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFuZGFsb25lKGJvb2xlYW4gc3RhbmRhbG9uZSkgewotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZyB3aGV0aGVyIGVycm9ycyBjaGVja2luZyBpcyBlbmZvcmNlZCBvciBub3QuCi0JICogV2hlbiBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGUgaW1wbGVtZW50YXRpb24gaXMgZnJlZSB0byBub3QKLQkgKiB0ZXN0IGV2ZXJ5IHBvc3NpYmxlIGVycm9yIGNhc2Ugbm9ybWFsbHkgZGVmaW5lZCBvbiBET00gb3BlcmF0aW9ucywgYW5kCi0JICogbm90IHJhaXNlIGFueSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+LiBJbiBjYXNlIG9mIGVycm9yLCB0aGUKLQkgKiBiZWhhdmlvciBpcyB1bmRlZmluZWQuIFRoaXMgYXR0cmlidXRlIGlzIDxjb2RlPnRydWU8L2NvZGU+IGJ5Ci0JICogZGVmYXVsdHMuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cmljdEVycm9yQ2hlY2tpbmcoYm9vbGVhbiBzdHJpY3RFcnJvckNoZWNraW5nKSB7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHRoZSB2ZXJzaW9uCi0JICogbnVtYmVyIG9mIHRoaXMgZG9jdW1lbnQuIFRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hlbiB1bnNwZWNpZmllZC4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihqYXZhLmxhbmcuU3RyaW5nIHZlcnNpb24pIHsKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dEVuY29kaW5nKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhtbEVuY29kaW5nKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRYbWxTdGFuZGFsb25lKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRYbWxTdGFuZGFsb25lKGJvb2xlYW4geG1sU3RhbmRhbG9uZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WG1sVmVyc2lvbigpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0WG1sVmVyc2lvbihTdHJpbmcgeG1sVmVyc2lvbikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRVUkkoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50VVJJKFN0cmluZyBkb2N1bWVudFVSSSkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgRE9NQ29uZmlndXJhdGlvbiBnZXREb21Db25maWcoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyB2b2lkIG5vcm1hbGl6ZURvY3VtZW50KCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgTm9kZSByZW5hbWVOb2RlKE5vZGUgbiwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMTY3MDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50VHlwZUFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCXN0YXRpYyBmaW5hbCBpbnQgTE9XRVJfQ0FTRSA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBTVFJJQ1RfQ0FTRSA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBVUFBFUl9DQVNFID0gMTsKLQotCS8qKgotCSAqLwotCWludCBnZXRBdHRyTmFtZUNhc2UoKTsKLQotCS8qKgotCSAqLwotCURvY3VtZW50VHlwZSBnZXREb2N1bWVudFR5cGUoKTsKLQotCS8qKgotCSAqLwotCWludCBnZXRUYWdOYW1lQ2FzZSgpOwotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBoYXNGZWF0dXJlKFN0cmluZyBmZWF0dXJlKTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNYTUxUeXBlKCk7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlbGVhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlQWRhcHRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljM2U5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50VHlwZUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRUeXBlQWRhcHRlckltcGwgaW1wbGVtZW50cyBEb2N1bWVudFR5cGVBZGFwdGVyIHsKLQotCXByaXZhdGUgSURPTURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIERvY3VtZW50VHlwZSBkb2N1bWVudFR5cGUgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZUFkYXB0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudFR5cGVBZGFwdGVySW1wbChJRE9NRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJdGhpcy5kb2N1bWVudFR5cGUgPSBkb2N1bWVudC5nZXREb2N0eXBlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJOYW1lQ2FzZSgpIHsKLQkJcmV0dXJuIFNUUklDVF9DQVNFOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBJRE9NRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBEb2N1bWVudFR5cGUgZ2V0RG9jdW1lbnRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kb2N1bWVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRUYWdOYW1lQ2FzZSgpIHsKLQkJcmV0dXJuIFNUUklDVF9DQVNFOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzWE1MVHlwZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmIChldmVudFR5cGUgIT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkKLQkJCXJldHVybjsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwgfHwgIShub3RpZmllciBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkpCi0JCQlyZXR1cm47Ci0JCXRoaXMuZG9jdW1lbnRUeXBlID0gKChJRE9NRG9jdW1lbnQpIG5vdGlmaWVyKS5nZXREb2N0eXBlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5RG9jdW1lbnRUeXBlQ2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMuZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTU1vZGVsIG1vZGVsID0gdGhpcy5kb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJKChET01Nb2RlbEltcGwpIG1vZGVsKS5kb2N1bWVudFR5cGVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50VHlwZShEb2N1bWVudFR5cGUgZG9jdW1lbnRUeXBlKSB7Ci0JCXRoaXMuZG9jdW1lbnRUeXBlID0gZG9jdW1lbnRUeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZjg2YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICogICAgIEJhbGF6cyBCYW5mYWk6IEJ1ZyAxNTQ3MzcgZ2V0VXNlckRhdGEvc2V0VXNlckRhdGEgc3VwcG9ydCBmb3IgTm9kZQotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ3MzcKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDI5Njk5OSAtIEluZWZmaWNpZW50IHVzZSBvZiBuZXcgU3RyaW5nKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBEb2N1bWVudFR5cGUgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50VHlwZUltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIElET01Eb2N1bWVudFR5cGUgewotCXByaXZhdGUgU3RyaW5nIGludGVybmFsU3Vic2V0ID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBzeXN0ZW1JZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBEb2N1bWVudFR5cGVJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRG9jdW1lbnRUeXBlSW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBEb2N1bWVudFR5cGVJbXBsCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZUltcGwoRG9jdW1lbnRUeXBlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZSA9IHRoYXQubmFtZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRG9jdW1lbnRUeXBlSW1wbCBjbG9uZWQgPSBuZXcgRG9jdW1lbnRUeXBlSW1wbCh0aGlzKTsKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0RW50aXRpZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXAKLQkgKi8KLQlwdWJsaWMgTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEludGVybmFsU3Vic2V0KCkgewotCQlyZXR1cm4gdGhpcy5pbnRlcm5hbFN1YnNldDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIERPQ1VNRU5UX1RZUEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb3RhdGlvbnMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXAKLQkgKi8KLQlwdWJsaWMgTmFtZWROb2RlTWFwIGdldE5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGljSWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3lzdGVtSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3lzdGVtSWQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJcmV0dXJuIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT05fQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9DTE9TRSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW50ZXJuYWxTdWJzZXQoU3RyaW5nIGludGVybmFsU3Vic2V0KSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJdGhpcy5pbnRlcm5hbFN1YnNldCA9IGludGVybmFsU3Vic2V0OwotCX0KLQotCS8qKgotCSAqIHNldE5hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogc2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJdGhpcy5wdWJsaWNJZCA9IHB1YmxpY0lkOwotCi0JCW5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIHNldFN5c3RlbUlkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZCkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCi0JCXRoaXMuc3lzdGVtSWQgPSBzeXN0ZW1JZDsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKGdldE5hbWUoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRQdWJsaWNJZCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0U3lzdGVtSWQoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgnQCcpOwotCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGE2YTg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgCi0gKiAgICAgVmFsZW50aW4gQmFjaXUgLSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5NTUyCi0gKiAgICAgCi0gKiAgICAgQmFsYXpzIEJhbmZhaTogQnVnIDE1NDczNyBnZXRVc2VyRGF0YS9zZXRVc2VyRGF0YSBzdXBwb3J0IGZvciBOb2RlCi0gKiAgICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDczNwotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjk2OTk5IC0gSW5lZmZpY2llbnQgdXNlIG9mIG5ldyBTdHJpbmcoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklYTUxOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLQotCi0vKioKLSAqIEVsZW1lbnRJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50SW1wbCBleHRlbmRzIE5vZGVDb250YWluZXIgaW1wbGVtZW50cyBJRE9NRWxlbWVudCB7Ci0KLQlwcml2YXRlIGNsYXNzIEF0dHJpYnV0ZXMgaW1wbGVtZW50cyBOYW1lZE5vZGVNYXAgewotCQlBdHRyaWJ1dGVzKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJaWYgKGF0dHJOb2RlcyA9PSBudWxsKQotCQkJCXJldHVybiAwOwotCQkJcmV0dXJuIGF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5vZGUobmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBnZXROYW1lZEl0ZW1OUyhTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5vZGVOUyh1cmksIG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCWlmIChhdHRyTm9kZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBhdHRyTm9kZXMuaXRlbShpbmRleCk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSByZW1vdmVOYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQkJcmV0dXJuIHJlbW92ZUF0dHJpYnV0ZU5vZGUobmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSByZW1vdmVOYW1lZEl0ZW1OUyhTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gcmVtb3ZlQXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBzZXROYW1lZEl0ZW0oTm9kZSBhcmcpIHRocm93cyBET01FeGNlcHRpb24gewotCQkJcmV0dXJuIHNldEF0dHJpYnV0ZU5vZGUoKEF0dHJJbXBsKSBhcmcpOwotCQl9Ci0KLQkJcHVibGljIE5vZGUgc2V0TmFtZWRJdGVtTlMoTm9kZSBhcmcpIHRocm93cyBET01FeGNlcHRpb24gewotCQkJcmV0dXJuIHNldEF0dHJpYnV0ZU5vZGVOUygoQXR0ckltcGwpIGFyZyk7Ci0JCX0KLQl9Ci0KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBYTUxOU19QUkVGSVggPSBJWE1MTmFtZXNwYWNlLlhNTE5TX1BSRUZJWC50b0NoYXJBcnJheSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgRkxBR19DT01NRU5UID0gMHgxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgRkxBR19FTVBUWSA9IDB4MjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEZMQUdfSlNQID0gMHg0OwotCQotCXByaXZhdGUgYnl0ZSBmVGFnRmxhZ3MgPSAwOwotCQotCU5vZGVMaXN0SW1wbCBhdHRyTm9kZXMgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQotCXByaXZhdGUgY2hhcltdIGZUYWdOYW1lID0gbnVsbDsKLQotCXByaXZhdGUgY2hhcltdIGZOYW1lc3BhY2VVUkkgPSBudWxsOwotCi0JLyoqCi0JICogRWxlbWVudEltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRWxlbWVudEltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgRWxlbWVudEltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudEltcGwoRWxlbWVudEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmZUYWdOYW1lID0gdGhhdC5mVGFnTmFtZTsKLQkJCXRoaXMuZlRhZ0ZsYWdzID0gdGhhdC5mVGFnRmxhZ3M7Ci0KLQkJCS8vIGNsb25lIGF0dHJpYnV0ZXMKLQkJCXRoYXQuY2xvbmVBdHRyaWJ1dGVzKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogYWRkRW5kVGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbmQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRUYWcoRWxlbWVudCBlbmRUYWcpIHsKLQkJaWYgKGVuZFRhZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaGFzRW5kVGFnKCkpCi0JCQlyZXR1cm47Ci0JCUVsZW1lbnRJbXBsIGVuZCA9IChFbGVtZW50SW1wbCkgZW5kVGFnOwotCi0JCS8vIG1vdmUgdGhlIGVuZCBmbGF0IG5vZGUgZnJvbSB0aGUgZW5kIHRhZwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZW5kLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZW5kLnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBhcHBlbmRBdHRpYnV0ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG5ld0F0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwdWJsaWMgQXR0ciBhcHBlbmRBdHRyaWJ1dGVOb2RlKEF0dHIgbmV3QXR0cikgewotCQlpZiAobmV3QXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIG5ld0F0dHI7Ci0JCWlmIChhdHRyLmdldE93bmVyRWxlbWVudCgpICE9IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCi0JCWlmICh0aGlzLmF0dHJOb2RlcyA9PSBudWxsKQotCQkJdGhpcy5hdHRyTm9kZXMgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCXRoaXMuYXR0ck5vZGVzLmFwcGVuZE5vZGUoYXR0cik7Ci0JCWF0dHIuc2V0T3duZXJFbGVtZW50KHRoaXMpOwotCi0JCW5vdGlmeUF0dHJSZXBsYWNlZChhdHRyLCBudWxsKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogY2xvbmVBdHRyaWJ1dGVzIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuZXdPd25lcgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsb25lQXR0cmlidXRlcyhFbGVtZW50IG5ld093bmVyKSB7Ci0JCWlmIChuZXdPd25lciA9PSBudWxsIHx8IG5ld093bmVyID09IHRoaXMpCi0JCQlyZXR1cm47Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3T3duZXI7Ci0JCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlcygpOwotCi0JCWlmICh0aGlzLmF0dHJOb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBsZW5ndGggPSB0aGlzLmF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJTm9kZSBub2RlID0gdGhpcy5hdHRyTm9kZXMuaXRlbShpKTsKLQkJCWlmIChub2RlID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlBdHRyIGNsb25lZCA9IChBdHRyKSBub2RlLmNsb25lTm9kZShmYWxzZSk7Ci0JCQlpZiAoY2xvbmVkICE9IG51bGwpCi0JCQkJZWxlbWVudC5hcHBlbmRBdHRyaWJ1dGVOb2RlKGNsb25lZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUVsZW1lbnRJbXBsIGNsb25lZCA9IG5ldyBFbGVtZW50SW1wbCh0aGlzKTsKLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQkJCi0JCW5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVELCBjbG9uZWQpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGdldEF0dHJpYnV0ZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0JCUF0dHIgYXR0ciA9IGdldEF0dHJpYnV0ZU5vZGUobmFtZSk7Ci0JCS8vIEluIHRoZSBhYnNlbmNlIG9mIHRoZSBhdHRyaWJ1dGUsIGdldCB0aGUgZGVmYXVsdCB2YWx1ZQotCQlpZiAoYXR0ciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gZ2V0RGVmYXVsdFZhbHVlKG5hbWUpOwotCQkJcmV0dXJuIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgPyBkZWZhdWx0VmFsdWUgOiBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCX0KLQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGF0dHJpYnV0ZSA8Y29kZT5uYW1lPC9jb2RlPi4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoU3RyaW5nIG5hbWUpIHsKLQkJQ01OYW1lZE5vZGVNYXAgbWFwID0gKChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKSkuZ2V0Q01BdHRyaWJ1dGVzKHRoaXMpOwotCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCUNNTm9kZSBhdHRyaWJ1dGUgPSBtYXAuZ2V0TmFtZWRJdGVtKG5hbWUpOwotCQkJaWYgKGF0dHJpYnV0ZSBpbnN0YW5jZW9mIENNQXR0cmlidXRlRGVjbGFyYXRpb24pCi0JCQkJcmV0dXJuICgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlKS5nZXRBdHRyVHlwZSgpLmdldEltcGxpZWRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0cmlidXRlTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBBdHRyIGdldEF0dHJpYnV0ZU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBhdHRyaWJ1dGUKLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWNoYXJbXSBuYW1lQ2hhcnMgPSBuYW1lLnRvQ2hhckFycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGF0dHIubWF0Y2hOYW1lKG5hbWVDaGFycykpCi0JCQkJcmV0dXJuIGF0dHI7IC8vIGZvdW5kCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEF0dHIgZ2V0QXR0cmlidXRlTm9kZU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm8gYXR0cmlidXRlCi0KLQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSB0aGlzLmF0dHJOb2Rlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyBsb2NhbE5hbWUgPSBhdHRyLmdldExvY2FsTmFtZSgpOwotCQkJaWYgKGxvY2FsTmFtZSA9PSBudWxsIHx8ICFsb2NhbE5hbWUuZXF1YWxzKG5hbWUpKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIG5zVVJJID0gYXR0ci5nZXROYW1lc3BhY2VVUkkoKTsKLQkJCWlmICh1cmkgPT0gbnVsbCkgewotCQkJCWlmIChuc1VSSSAhPSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChuc1VSSSA9PSBudWxsIHx8ICFuc1VSSS5lcXVhbHModXJpKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8vIGZvdW5kCi0JCQlyZXR1cm4gYXR0cjsKLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB7Ci0JCUF0dHIgYXR0ciA9IGdldEF0dHJpYnV0ZU5vZGVOUyh1cmksIG5hbWUpOwotCQkvLyBJbiB0aGUgYWJzZW5jZSBvZiB0aGUgYXR0cmlidXRlLCBnZXQgdGhlIGRlZmF1bHQgdmFsdWUKLQkJaWYgKGF0dHIgPT0gbnVsbCkgewotCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGdldERlZmF1bHRWYWx1ZShuYW1lKTsKLQkJCXJldHVybiAoZGVmYXVsdFZhbHVlICE9IG51bGwpID8gZGVmYXVsdFZhbHVlIDogTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQl9Ci0JCXJldHVybiBhdHRyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0cmlidXRlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcAotCSAqLwotCXB1YmxpYyBOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG5ldyBBdHRyaWJ1dGVzKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKCkgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2N1bWVudCk7Ci0JCWlmIChtb2RlbFF1ZXJ5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24odGhpcyk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RWxlbWVudHNCeVRhZ05hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCgpOwotCi0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCgpOwotCQlOb2RlSXRlcmF0b3IgaXQgPSBkb2N1bWVudC5jcmVhdGVOb2RlSXRlcmF0b3IodGhpcywgTm9kZUZpbHRlci5TSE9XX0FMTCwgbnVsbCwgZmFsc2UpOwotCQlpZiAoaXQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCU5vZGVMaXN0SW1wbCBlbGVtZW50cyA9IG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCQlpZiAodGFnTmFtZS5sZW5ndGgoKSA9PSAxICYmIHRhZ05hbWUuY2hhckF0KDApID09ICcqJykgewotCQkJdGFnTmFtZSA9IG51bGw7IC8vIGRvIG5vdCBjYXJlCi0JCX0KLQotCQlpdC5uZXh0Tm9kZSgpOyAvLyBza2lwIHRoZSBmaXJzdCBub2RlIHNpbmNlIGl0IGlzIHRoZSByb290IGZyb20gY3JlYXRlTm9kZUl0ZXJhdG9yCi0JCWZvciAoTm9kZSBub2RlID0gaXQubmV4dE5vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gaXQubmV4dE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCQlpZiAoIWVsZW1lbnQubWF0Y2hUYWdOYW1lKHRhZ05hbWUpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsZW1lbnRzLmFwcGVuZE5vZGUobm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCU5vZGVJdGVyYXRvciBpdCA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcih0aGlzLCBOb2RlRmlsdGVyLlNIT1dfQUxMLCBudWxsLCBmYWxzZSk7Ci0JCWlmIChpdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJTm9kZUxpc3RJbXBsIGVsZW1lbnRzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotCi0JCWlmICh1cmkgIT0gbnVsbCAmJiB1cmkubGVuZ3RoKCkgPT0gMSAmJiB1cmkuY2hhckF0KDApID09ICcqJykgewotCQkJdXJpID0gbnVsbDsgLy8gZG8gbm90IGNhcmUKLQkJfQotCQlpZiAodGFnTmFtZS5sZW5ndGgoKSA9PSAxICYmIHRhZ05hbWUuY2hhckF0KDApID09ICcqJykgewotCQkJdGFnTmFtZSA9IG51bGw7IC8vIGRvIG5vdCBjYXJlCi0JCX0KLQotCQlpdC5uZXh0Tm9kZSgpOyAvLyBza2lwIHRoZSBmaXJzdCBub2RlIHNpbmNlIGl0IGlzIHRoZSByb290IGZyb20gY3JlYXRlTm9kZUl0ZXJhdG9yCi0JCWZvciAoTm9kZSBub2RlID0gaXQubmV4dE5vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gaXQubmV4dE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBsb2NhbE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotCQkJCWlmIChsb2NhbE5hbWUgPT0gbnVsbCB8fCAhbG9jYWxOYW1lLmVxdWFscyh0YWdOYW1lKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbnNVUkkgPSBlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotCQkJCWlmIChuc1VSSSA9PSBudWxsIHx8ICFuc1VSSS5lcXVhbHModXJpKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbGVtZW50cy5hcHBlbmROb2RlKGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIGdldEVuZE9mZnNldCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlpZiAodGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIGdldEVuZFN0YXJ0T2Zmc2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFbmRTdGFydE9mZnNldCgpIHsKLQkJaWYgKHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiB0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuZFRhZ05hbWUoKSB7Ci0JCWlmICh0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSB0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRFbmRUYWcocmVnaW9uVHlwZSkpIHsKLQkJCQlyZXR1cm4gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChyZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRFbmRUYWcoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlpZiAodGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0JCWlmICh0aGlzLmZUYWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGluZGV4ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKHRoaXMuZlRhZ05hbWUsICc6Jyk7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLmZUYWdOYW1lKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmcodGhpcy5mVGFnTmFtZSwgaW5kZXggKyAxLCB0aGlzLmZUYWdOYW1lLmxlbmd0aCAtIGluZGV4IC0gMSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0JCVN0cmluZyBuc0F0dHJOYW1lID0gbnVsbDsKLQkJU3RyaW5nIHByZWZpeCA9IGdldFByZWZpeCgpOwotCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJbnNBdHRyTmFtZSA9IElYTUxOYW1lc3BhY2UuWE1MTlNfUFJFRklYICsgcHJlZml4OwotCQl9Ci0JCWVsc2UgewotCQkJbnNBdHRyTmFtZSA9IElYTUxOYW1lc3BhY2UuWE1MTlM7Ci0JCX0KLQotCQlmb3IgKE5vZGUgbm9kZSA9IHRoaXM7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQlicmVhazsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKG5zQXR0ck5hbWUpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCQl9Ci0KLQkJaWYgKHRoaXMuZk5hbWVzcGFjZVVSSSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgU3RyaW5nKHRoaXMuZk5hbWVzcGFjZVVSSSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFRhZ05hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRUxFTUVOVF9OT0RFOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlpZiAodGhpcy5mVGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBpbmRleCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZih0aGlzLmZUYWdOYW1lLCAnOicpOwotCQlpZiAoaW5kZXggPD0gMCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBleGNsdWRlIEpTUCB0YWcgaW4gbmFtZQotCQlpZiAodGhpcy5mVGFnTmFtZVswXSA9PSAnPCcpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBTdHJpbmcodGhpcy5mVGFnTmFtZSwgMCwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIGdldFN0YXJ0RW5kT2Zmc2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdGFydEVuZE9mZnNldCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiBmbGF0Tm9kZS5nZXRFbmQoKTsKLQkJcmV0dXJuIHN1cGVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlpZiAoZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsICYmIHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgIWhhc0NoaWxkTm9kZXMoKSkgewotCQkJcmV0dXJuIHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUYWdOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKLQkJaWYgKHRoaXMuZlRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGZUYWdOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChnZXRBdHRyaWJ1dGVOb2RlKG5hbWUpICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoZ2V0QXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuICh0aGlzLmF0dHJOb2RlcyAhPSBudWxsICYmIHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpID4gMCk7Ci0JfQotCi0JLyoqCi0JICogaGFzRW5kVGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0VuZFRhZygpIHsKLQkJcmV0dXJuICh0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBoYXNQcmVmaXgoKSB7Ci0JCWlmICh0aGlzLmZUYWdOYW1lID09IG51bGwgfHwgdGhpcy5mVGFnTmFtZS5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIENoYXJPcGVyYXRpb24uaW5kZXhPZih0aGlzLmZUYWdOYW1lLCAnOicpID4gMCAmJiB0aGlzLmZUYWdOYW1lWzBdICE9ICc8JzsKLQl9Ci0KLQkvKioKLQkgKiBoYXNTdGFydFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNTdGFydFRhZygpIHsKLQkJcmV0dXJuIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpZ25vcmVDYXNlKCkgewotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50Lmlnbm9yZUNhc2UoKSkgewotCQkJLy8gZXZlbiBpbiBjYXNlIGluc2Vuc2l0aXZlIGRvY3VtZW50LCBpZiBoYXZpbmcgcHJlZml4LCBpdCdzIGNhc2UKLQkJCS8vIHNlbnNpdGl2ZSB0YWcKLQkJCXJldHVybiAhaGFzUHJlZml4KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBBdHRyIGluc2VydEF0dHJpYnV0ZU5vZGUoQXR0ciBuZXdBdHRyLCBpbnQgaW5kZXgpIHsKLQkJaWYgKG5ld0F0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBuZXdBdHRyOwotCQlpZiAoYXR0ci5nZXRPd25lckVsZW1lbnQoKSAhPSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQl0aGlzLmF0dHJOb2RlcyA9IG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJdGhpcy5hdHRyTm9kZXMuaW5zZXJ0Tm9kZShhdHRyLCBpbmRleCk7Ci0JCWF0dHIuc2V0T3duZXJFbGVtZW50KHRoaXMpOwotCi0JCW5vdGlmeUF0dHJSZXBsYWNlZChhdHRyLCBudWxsKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0QmVmb3JlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSByZWZDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGluc2VydEJlZm9yZShOb2RlIG5ld0NoaWxkLCBOb2RlIHJlZkNoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gc2hvdWxkIHRocm93IERPTUV4Y2VwdGlvbiBpbnN0ZWFkIG9mIHJldHVybiBudWxsPwotCQlpZiAobmV3Q2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIWlzQ29udGFpbmVyKCkpIHsgLy8gbmV2ZXIgYmUgY29udGFpbmVyCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5ISUVSQVJDSFlfUkVRVUVTVF9FUlIsIERPTU1lc3NhZ2VzLkhJRVJBUkNIWV9SRVFVRVNUX0VSUik7Ci0JCX0KLQkJaWYgKG5ld0NoaWxkLmdldE5vZGVUeXBlKCkgIT0gVEVYVF9OT0RFICYmIG5ld0NoaWxkLmdldE5vZGVUeXBlKCkgIT0gQ0RBVEFfU0VDVElPTl9OT0RFKSB7Ci0JCQlpZiAoaXNKU1BDb250YWluZXIoKSB8fCBpc0NEQVRBQ29udGFpbmVyKCkpIHsgLy8gYWNjZXB0cyBvbmx5Ci0JCQkJLy8gVGV4dAotCQkJCS8vIGNoaWxkCi0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCBET01NZXNzYWdlcy5ISUVSQVJDSFlfUkVRVUVTVF9FUlIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5pbnNlcnRCZWZvcmUobmV3Q2hpbGQsIHJlZkNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NEQVRBQ29udGFpbmVyKCkgewotCQkvLyB1c2UgQmxvY2tNYWtlciBpbnN0ZWFkIG9mIENNRWxlbWVudERlY2xhcmF0aW9uCi0JCS8vIGJlY2F1c2UgPHN0eWxlPiBhbmQgPHNjcmlwdD4gaW4gWEhUTUwgaXMgbm90IENEQVRBIGNvbnRlbnQgdHlwZQotCQlJRE9NTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsgLy8gZXJyb3IKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsIHx8IGZUYWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIGVyb3IKLQkJUmVnaW9uUGFyc2VyIHBhcnNlciA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKTsKLQkJaWYgKHBhcnNlciA9PSBudWxsIHx8ICEocGFyc2VyIGluc3RhbmNlb2YgWE1MU291cmNlUGFyc2VyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoKFhNTFNvdXJjZVBhcnNlcikgcGFyc2VyKS5nZXRCbG9ja01hcmtlcihuZXcgU3RyaW5nKHRoaXMuZlRhZ05hbWUpKSAhPSBudWxsKTsKLQkJLyoKLQkJICogQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldERlY2xhcmF0aW9uKCk7IGlmIChkZWNsID09IG51bGwpCi0JCSAqIHJldHVybiBmYWxzZTsgaWYgKGRlY2wgaW5zdGFuY2VvZiBDTU5vZGVXcmFwcGVyKSB7IGRlY2wgPQotCQkgKiAoQ01FbGVtZW50RGVjbGFyYXRpb24pKChDTU5vZGVXcmFwcGVyKWRlY2wpLmdldE9yaWdpbk5vZGUoKTsgaWYKLQkJICogKGRlY2wgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyB9IGlmIChkZWNsIGluc3RhbmNlb2YKLQkJICogVExERWxlbWVudERlY2xhcmF0aW9uKSB7IFN0cmluZyBjb250ZW50ID0KLQkJICogKChUTERFbGVtZW50RGVjbGFyYXRpb24pZGVjbCkuZ2V0Qm9keWNvbnRlbnQoKTsgaWYgKGNvbnRlbnQgPT0KLQkJICogbnVsbCkgcmV0dXJuIGZhbHNlOyByZXR1cm4KLQkJICogY29udGVudC5lcXVhbHMoSlNQMTFUTEROYW1lcy5DT05URU5UX1RBR0RFUEVOREVOVCk7IH0gaWYKLQkJICogKCFpc0dsb2JhbFRhZygpKSByZXR1cm4gZmFsc2U7IHJldHVybiAoZGVjbC5nZXRDb250ZW50VHlwZSgpID09Ci0JCSAqIENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBKTsKLQkJICovCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQlpZiAoaXNFbXB0eVRhZygpIHx8ICFpc0NvbnRhaW5lcigpKSB7Ci0JCQlmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7IC8vIHdpbGwgYmUgZ2VuZXJhdGVkCi0JCX0KLQkJZWxzZSB7Ci0JCQlmbGF0Tm9kZSA9IGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOyAvLyBtdXN0IGJlIGdlbmVyYXRlZAotCQl9Ci0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCWlmIChpc0NvbW1lbnRUYWcoKSkgewotCQkJcmV0dXJuIChpc05lc3RlZENsb3NlZENvbW1lbnQocmVnaW9uVHlwZSkgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFKTsKLQkJfQotCQlpZiAoaXNKU1BUYWcoKSkgewotCQkJcmV0dXJuIGlzTmVzdGVkQ2xvc2VkKHJlZ2lvblR5cGUpOwotCQl9Ci0JCXJldHVybiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9DTE9TRSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDbG9zZWQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENsb3NlZENvbW1lbnQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NvbW1lbnRUYWcoKSB7Ci0JCXJldHVybiAoZlRhZ0ZsYWdzICYgRkxBR19DT01NRU5UKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIGlzQ29udGFpbmVyIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyKCkgewotCQlpZiAoaXNDb21tZW50VGFnKCkpIHsKLQkJCUNvbW1lbnRFbGVtZW50QWRhcHRlciBhZGFwdGVyID0gKENvbW1lbnRFbGVtZW50QWRhcHRlcikgZ2V0QWRhcHRlckZvcihDb21tZW50RWxlbWVudEFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiAoYWRhcHRlci5pc0NvbnRhaW5lcigpKTsKLQkJCX0KLQkJCXJldHVybiAoZ2V0RGVjbGFyYXRpb24oKSA9PSBudWxsKTsKLQkJfQotCQlpZiAoaXNKU1BUYWcoKSkgewotCQkJLy8gZXhjbHVkZSBKU1AgZGlyZWN0aXZlCi0JCQlyZXR1cm4gKG1hdGNoVGFnTmFtZShKU1BUYWcuSlNQX1NDUklQVExFVCkgfHwgbWF0Y2hUYWdOYW1lKEpTUFRhZy5KU1BfREVDTEFSQVRJT04pIHx8IG1hdGNoVGFnTmFtZShKU1BUYWcuSlNQX0VYUFJFU1NJT04pKTsKLQkJfQotCQlpZiAoIWlzWE1MVGFnKCkpIHsgLy8gbm9uLVhNTCB0YWcKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXREZWNsYXJhdGlvbigpOwotCQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7IC8vIHVuZGVmaW5lZCB0YWcKLQkJCXJldHVybiAoZGVjbC5nZXRDb250ZW50VHlwZSgpICE9IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBpc0VtcHR5VGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHlUYWcoKSB7Ci0JCWlmIChpc0pTUFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghaXNYTUxUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChmVGFnRmxhZ3MgJiBGTEFHX0VNUFRZKSAhPSAwOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5kVGFnKCkgewotCQlyZXR1cm4gKGhhc0VuZFRhZygpICYmICFoYXNTdGFydFRhZygpICYmICFoYXNDaGlsZE5vZGVzKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2xvYmFsVGFnKCkgewotCQlyZXR1cm4gIWhhc1ByZWZpeCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXRUYWcoKSB7Ci0JCWlmIChoYXNTdGFydFRhZygpIHx8IGhhc0VuZFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBtYWtlIHN1cmUgdGhpcyBpcyBpbiB0aGUgZG9jdW1lbnQgdHJlZQotCQkvLyBiZWNhdXNlIGlmIG5vdCBpbiB0aGUgZG9jdW1lbnQgdHJlZSwgbm8gdGFncyBhcmUgZ2VuZXJhdGVkIHlldAotCQlyZXR1cm4gKGdldENvbnRhaW5lckRvY3VtZW50KCkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKU1BDb250YWluZXIoKSB7Ci0JCXJldHVybiAoaXNKU1BUYWcoKSAmJiAhaXNDb21tZW50VGFnKCkgJiYgaXNDb250YWluZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogaXNKU1BUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNKU1BUYWcoKSB7Ci0JCXJldHVybiAoZlRhZ0ZsYWdzICYgRkxBR19KU1ApICE9IDA7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdGFydFRhZ0Nsb3NlZCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOyAvLyB3aWxsIGJlIGdlbmVyYXRlZAotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0TGFzdFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlpZiAoaXNDb21tZW50VGFnKCkpIHsKLQkJCXJldHVybiAoaXNOZXN0ZWRDbG9zZWRDb21tZW50KHJlZ2lvblR5cGUpIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSk7Ci0JCX0KLQkJaWYgKGlzSlNQVGFnKCkpIHsKLQkJCWlmIChpc0NvbnRhaW5lcigpKQotCQkJCXJldHVybiB0cnVlOyAvLyBzdGFydCB0YWcgYWx3YXlzIGhhcyBhIHNpbmdsZSByZWdpb24KLQkJCXJldHVybiBpc0Nsb3NlZE5lc3RlZERpcmVjdGl2ZShyZWdpb25UeXBlKTsKLQkJfQotCQlyZXR1cm4gKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQ2xvc2VkTmVzdGVkRGlyZWN0aXZlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNYTUxUYWcoKSB7Ci0JCWlmIChpc0pTUFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgIWRvY3VtZW50LmlzWE1MVHlwZSgpKSB7Ci0JCQkvLyBldmVuIGluIG5vbi1YTUwgZG9jdW1lbnQsIGlmIGhhdmluZyBwcmVmaXgsIGl0J3MgWE1MIHRhZwotCQkJcmV0dXJuIGhhc1ByZWZpeCgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoRW5kVGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlFbGVtZW50SW1wbCBpbXBsID0gKEVsZW1lbnRJbXBsKSBlbGVtZW50OwotCQlpZiAoaXNKU1BUYWcoKSAmJiAhaXNDb21tZW50VGFnKCkpIHsKLQkJCXJldHVybiAoaW1wbC5pc0pTUFRhZygpICYmICFpbXBsLmlzQ29tbWVudFRhZygpKTsKLQkJfQotCQlyZXR1cm4gbWF0Y2hUYWdOYW1lKGVsZW1lbnQuZ2V0VGFnTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBtYXRjaFRhZ05hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaFRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiAodGhpcy5mVGFnTmFtZSA9PSBudWxsKTsKLQkJaWYgKHRoaXMuZlRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHRoaXMuZlRhZ05hbWUubGVuZ3RoICE9IHRhZ05hbWUubGVuZ3RoKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBzdHJpbmdOYW1lID0gbmV3IFN0cmluZyh0aGlzLmZUYWdOYW1lKTsKLQkJaWYgKCFpZ25vcmVDYXNlKCkpCi0JCQlyZXR1cm4gc3RyaW5nTmFtZS5lcXVhbHModGFnTmFtZSk7Ci0JCXJldHVybiBzdHJpbmdOYW1lLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm90aWZ5QXR0clJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG9sZEF0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlBdHRyUmVwbGFjZWQoQXR0ciBuZXdBdHRyLCBBdHRyIG9sZEF0dHIpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5hdHRyUmVwbGFjZWQodGhpcywgbmV3QXR0ciwgb2xkQXR0cik7Ci0JfQotCi0JLyoqCi0JICogbm90aWZ5VmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUVuZFRhZ0NoYW5nZWQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuZW5kVGFnQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlTdGFydFRhZ0NoYW5nZWQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuc3RhcnRUYWdDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHByZWZlckVtcHR5VGFnKCkgewotCQlpZiAoaGFzQ2hpbGROb2RlcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoaXNKU1BUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlzQ29tbWVudFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWlzWE1MVGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXREZWNsYXJhdGlvbigpOwotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQXR0cmlidXRlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmVtb3ZlQXR0cmlidXRlTm9kZShuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVBdHRyaWJ1dGVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBvbGRBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0JcHVibGljIEF0dHIgcmVtb3ZlQXR0cmlidXRlTm9kZShBdHRyIG9sZEF0dHIpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAob2xkQXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGludmFsaWQgcGFyYW1ldGVyCi0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkgeyAvLyBubyBhdHRyaWJ1dGUKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9GT1VORF9FUlIsIERPTU1lc3NhZ2VzLk5PVF9GT1VORF9FUlIpOwotCQl9Ci0KLQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSB0aGlzLmF0dHJOb2Rlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgIT0gb2xkQXR0cikKLQkJCQljb250aW51ZTsKLQotCQkJLy8gZm91bmQKLQkJCXRoaXMuYXR0ck5vZGVzLnJlbW92ZU5vZGUoaSk7Ci0JCQlhdHRyLnNldE93bmVyRWxlbWVudChudWxsKTsKLQotCQkJbm90aWZ5QXR0clJlcGxhY2VkKG51bGwsIGF0dHIpOwotCQkJcmV0dXJuIGF0dHI7Ci0JCX0KLQotCQkvLyBub3QgZm91bmQKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX0ZPVU5EX0VSUiwgRE9NTWVzc2FnZXMuTk9UX0ZPVU5EX0VSUik7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQXR0cmlidXRlTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBBdHRyIHJlbW92ZUF0dHJpYnV0ZU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBhdHRyaWJ1dGUKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCi0JCWludCBsZW5ndGggPSB0aGlzLmF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgdGhpcy5hdHRyTm9kZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoIWF0dHIubWF0Y2hOYW1lKG5hbWUpKQotCQkJCWNvbnRpbnVlOwotCi0JCQkvLyBmb3VuZAotCQkJdGhpcy5hdHRyTm9kZXMucmVtb3ZlTm9kZShpKTsKLQkJCWF0dHIuc2V0T3duZXJFbGVtZW50KG51bGwpOwotCi0JCQlub3RpZnlBdHRyUmVwbGFjZWQobnVsbCwgYXR0cik7Ci0JCQlyZXR1cm4gYXR0cjsKLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQXR0ciByZW1vdmVBdHRyaWJ1dGVOb2RlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBhdHRyaWJ1dGUKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCi0JCWludCBsZW5ndGggPSB0aGlzLmF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgdGhpcy5hdHRyTm9kZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgbG9jYWxOYW1lID0gYXR0ci5nZXRMb2NhbE5hbWUoKTsKLQkJCWlmIChsb2NhbE5hbWUgPT0gbnVsbCB8fCAhbG9jYWxOYW1lLmVxdWFscyhuYW1lKSkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyBuc1VSSSA9IGF0dHIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQlpZiAodXJpID09IG51bGwpIHsKLQkJCQlpZiAobnNVUkkgIT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobnNVUkkgPT0gbnVsbCB8fCAhbnNVUkkuZXF1YWxzKHVyaSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvLyBmb3VuZAotCQkJdGhpcy5hdHRyTm9kZXMucmVtb3ZlTm9kZShpKTsKLQkJCWF0dHIuc2V0T3duZXJFbGVtZW50KG51bGwpOwotCi0JCQlub3RpZnlBdHRyUmVwbGFjZWQobnVsbCwgYXR0cik7Ci0JCQlyZXR1cm4gYXR0cjsKLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZUF0dHJpYnV0ZU5vZGVOUyh1cmksIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZUF0dHJpYnV0ZXMgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlcygpIHsKLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJYXR0ci5zZXRPd25lckVsZW1lbnQobnVsbCk7Ci0JCQkJbm90aWZ5QXR0clJlcGxhY2VkKG51bGwsIGF0dHIpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5hdHRyTm9kZXMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZUVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudCByZW1vdmVFbmRUYWcoKSB7Ci0JCWlmICghaGFzRW5kVGFnKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZUxpc3RJbXBsIGF0dHJOb2RlcyA9IHRoaXMuYXR0ck5vZGVzOwotCQl0aGlzLmF0dHJOb2RlcyA9IG51bGw7IC8vIG5vdCB0byBjb3B5IGF0dHJpYnV0ZXMKLQkJRWxlbWVudEltcGwgZW5kID0gKEVsZW1lbnRJbXBsKSBjbG9uZU5vZGUoZmFsc2UpOwotCQl0aGlzLmF0dHJOb2RlcyA9IGF0dHJOb2RlczsKLQkJaWYgKGVuZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gbW92ZSB0aGUgZW5kIGZsYXQgbm9kZSB0byB0aGUgZW5kIHRhZwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJZW5kLnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCXJldHVybiBlbmQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3RhcnRUYWcoKSB7Ci0JCXJlbW92ZUF0dHJpYnV0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgYXR0cmlidXRlIHZhbHVlcyBmcm9tIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uCi0JICovCi0Jdm9pZCByZXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCWlmICh0aGlzLmF0dHJOb2RlcyAhPSBudWxsKSB7Ci0JCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgdGhpcy5hdHRyTm9kZXMuaXRlbShpKTsKLQkJCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlhdHRyLnJlc2V0UmVnaW9ucygpOwotCQkJfQotCQl9Ci0KLQkJc3VwZXIucmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7IC8vIGZvciBjaGlsZHJlbgotCi0JCXRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBzZXRBdHRyaWJ1dGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlBdHRyIGF0dHIgPSBnZXRBdHRyaWJ1dGVOb2RlKG5hbWUpOwotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRyLnNldFZhbHVlKHZhbHVlKTsgLy8gY2hhbmdlIHZhbHVlCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBuZXcgYXR0cmlidXRlCi0JCURvY3VtZW50IGRvYyA9IGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlhdHRyID0gZG9jLmNyZWF0ZUF0dHJpYnV0ZShuYW1lKTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCWFwcGVuZEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JfQotCi0JLyoqCi0JICogc2V0QXR0cmlidXRlTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gbmV3QXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXB1YmxpYyBBdHRyIHNldEF0dHJpYnV0ZU5vZGUoQXR0ciBuZXdBdHRyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld0F0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBub3RoaW5nIHRvIGRvCi0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBuZXdBdHRyOwotCQlFbGVtZW50IG93bmVyID0gYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJaWYgKG93bmVyICE9IG51bGwpIHsKLQkJCWlmIChvd25lciA9PSB0aGlzKQotCQkJCXJldHVybiBudWxsOyAvLyBub3RoaW5nIHRvIGRvCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlVTRV9BVFRSSUJVVEVfRVJSLCBET01NZXNzYWdlcy5JTlVTRV9BVFRSSUJVVEVfRVJSKTsKLQkJfQotCi0JCUF0dHIgb2xkQXR0ciA9IHJlbW92ZUF0dHJpYnV0ZU5vZGUobmV3QXR0ci5nZXROYW1lKCkpOwotCQlhcHBlbmRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQlyZXR1cm4gb2xkQXR0cjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQXR0ciBzZXRBdHRyaWJ1dGVOb2RlTlMoQXR0ciBuZXdBdHRyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld0F0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBub3RoaW5nIHRvIGRvCi0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBuZXdBdHRyOwotCQlFbGVtZW50IG93bmVyID0gYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJaWYgKG93bmVyICE9IG51bGwpIHsKLQkJCWlmIChvd25lciA9PSB0aGlzKQotCQkJCXJldHVybiBudWxsOyAvLyBub3RoaW5nIHRvIGRvCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlVTRV9BVFRSSUJVVEVfRVJSLCBET01NZXNzYWdlcy5JTlVTRV9BVFRSSUJVVEVfRVJSKTsKLQkJfQotCi0JCVN0cmluZyBuYW1lID0gbmV3QXR0ci5nZXRMb2NhbE5hbWUoKTsKLQkJU3RyaW5nIHVyaSA9IG5ld0F0dHIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCUF0dHIgb2xkQXR0ciA9IHJlbW92ZUF0dHJpYnV0ZU5vZGVOUyh1cmksIG5hbWUpOwotCQlhcHBlbmRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQlyZXR1cm4gb2xkQXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogd2Ugc2hvdWxkIGNoZWNrIGZvciBhbmQgdGhyb3cgTkFNRVNQQUNFX0VSUiwgYWNjb3JkaW5nIHRvIHNwZWMuIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU5TKFN0cmluZyB1cmksIFN0cmluZyBxdWFsaWZpZWROYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAocXVhbGlmaWVkTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzk1NTIKLQkJLy8gZml4IHByb3ZpZGVkIGJ5IFZhbGVudGluIEJhY2l1Ci0JCWludCBpbmRleCA9IHF1YWxpZmllZE5hbWUuaW5kZXhPZignOicpOwotCQlTdHJpbmcgbG9jYWxOYW1lID0gaW5kZXggIT0gLTEgPyBxdWFsaWZpZWROYW1lLnN1YnN0cmluZyhpbmRleCArIDEpIDogcXVhbGlmaWVkTmFtZTsKLQotCQlBdHRyIGF0dHIgPSBnZXRBdHRyaWJ1dGVOb2RlTlModXJpLCBsb2NhbE5hbWUpOwotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRyLnNldFZhbHVlKHZhbHVlKTsgLy8gY2hhbmdlIHZhbHVlCi0JCX0KLQkJZWxzZSB7Ci0KLQkJCS8vIG5ldyBhdHRyaWJ1dGUKLQkJCURvY3VtZW50IGRvYyA9IGdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChkb2MgIT0gbnVsbCkgewotCQkJCWF0dHIgPSBkb2MuY3JlYXRlQXR0cmlidXRlTlModXJpLCBxdWFsaWZpZWROYW1lKTsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0VmFsdWUodmFsdWUpOwotCQkJCQlhcHBlbmRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbW1lbnRUYWcoYm9vbGVhbiBpc0NvbW1lbnRUYWcpIHsKLQkJSURPTU5vZGUgcGFyZW50ID0gKElET01Ob2RlKSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlpZiAoaXNDb21tZW50VGFnKQotCQkJZlRhZ0ZsYWdzIHw9IEZMQUdfQ09NTUVOVDsKLQkJZWxzZQotCQkJZlRhZ0ZsYWdzICY9IH5GTEFHX0NPTU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogc2V0RW1wdHlUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGlzRW1wdHlUYWcKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbXB0eVRhZyhib29sZWFuIGlzRW1wdHlUYWcpIHsKLQkJSURPTU5vZGUgcGFyZW50ID0gKElET01Ob2RlKSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlpZiAoaXNFbXB0eVRhZykKLQkJCWZUYWdGbGFncyB8PSBGTEFHX0VNUFRZOwotCQllbHNlCi0JCQlmVGFnRmxhZ3MgJj0gfkZMQUdfRU1QVFk7Ci0JfQotCi0JLyoqCi0JICogc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBmbGF0Tm9kZQotCSAqLwotCXZvaWQgc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBmbGF0Tm9kZTsKLQotCQlOb2RlQ29udGFpbmVyIHBhcmVudCA9IChOb2RlQ29udGFpbmVyKSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LnN5bmNDaGlsZEVkaXRhYmxlU3RhdGUodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzZXRKU1BUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGlzSlNQVGFnCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SlNQVGFnKGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJSURPTU5vZGUgcGFyZW50ID0gKElET01Ob2RlKSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIE5vZGVJbXBsLkVNUFRZX1NUUklORyk7Ci0JCX0KLQotCQlpZiAoaXNKU1BUYWcpCi0JCQlmVGFnRmxhZ3MgfD0gRkxBR19KU1A7Ci0JCWVsc2UKLQkJCWZUYWdGbGFncyAmPSB+RkxBR19KU1A7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJaWYgKG5hbWVzcGFjZVVSSSA9PSBudWxsKQotCQkJdGhpcy5mTmFtZXNwYWNlVVJJID0gbnVsbDsKLQkJZWxzZQotCQkJdGhpcy5mTmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJLnRvQ2hhckFycmF5KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJEb2N1bWVudChEb2N1bWVudCBvd25lckRvY3VtZW50LCBib29sZWFuIGRlZXApIHsKLQkJc3VwZXIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50LCBkZWVwKTsKLQotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJYXR0ci5zZXRPd25lckRvY3VtZW50KG93bmVyRG9jdW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlJRE9NTm9kZSBwYXJlbnQgPSAoSURPTU5vZGUpIGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgTm9kZUltcGwuRU1QVFlfU1RSSU5HKTsKLQkJfQotCi0JCWludCBwcmVmaXhMZW5ndGggPSAocHJlZml4ICE9IG51bGwgPyBwcmVmaXgubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nIGxvY2FsTmFtZSA9IGdldExvY2FsTmFtZSgpOwotCQlpZiAocHJlZml4TGVuZ3RoID09IDApIHsKLQkJCWlmIChsb2NhbE5hbWUgPT0gbnVsbCB8fCBsb2NhbE5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCS8vIGludmFsaWQgbG9jYWwgbmFtZQotCQkJCXJldHVybjsKLQkJCX0KLQkJCXNldFRhZ05hbWUobG9jYWxOYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCWludCBsb2NhbExlbmd0aCA9IChsb2NhbE5hbWUgIT0gbnVsbCA/IGxvY2FsTmFtZS5sZW5ndGgoKSA6IDApOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocHJlZml4TGVuZ3RoICsgMSArIGxvY2FsTGVuZ3RoKTsKLQkJCWJ1ZmZlci5hcHBlbmQocHJlZml4KTsKLQkJCWJ1ZmZlci5hcHBlbmQoJzonKTsKLQkJCWlmIChsb2NhbE5hbWUgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKGxvY2FsTmFtZSk7Ci0JCQlzZXRUYWdOYW1lKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCi0JCWJvb2xlYW4gY2hhbmdlRW5kVGFnID0gaGFzRW5kVGFnKCk7Ci0JCW5vdGlmeVN0YXJ0VGFnQ2hhbmdlZCgpOwotCQlpZiAoY2hhbmdlRW5kVGFnKQotCQkJbm90aWZ5RW5kVGFnQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIHNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBmbGF0Tm9kZQotCSAqLwotCXZvaWQgc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqIHNldFRhZ05hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWdOYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXRoaXMuZlRhZ05hbWUgPSBDaGFyYWN0ZXJTdHJpbmdQb29sLmdldENoYXJTdHJpbmcodGFnTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogdG9TdHJpbmcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBnZXRUYWdOYW1lKCk7Ci0JCWlmIChoYXNTdGFydFRhZygpKQotCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQkJaWYgKGlzRW1wdHlUYWcoKSkKLQkJCWJ1ZmZlci5hcHBlbmQoJy8nKTsKLQkJaWYgKGhhc0VuZFRhZygpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCcvJyk7Ci0JCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQl9Ci0JCWlmIChidWZmZXIubGVuZ3RoKCkgPT0gMCkKLQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCdAJyk7Ci0JCQlidWZmZXIuYXBwZW5kKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgnQCcpOwotCQkJYnVmZmVyLmFwcGVuZChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0lkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3Qgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkQXR0cmlidXRlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgYm9vbGVhbiBpc0lkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3Qgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkQXR0cmlidXRlTm9kZShBdHRyIGlkQXR0ciwgYm9vbGVhbiBpc0lkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3Qgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbnRpdHlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlMzljYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKiAgICAgQmFsYXpzIEJhbmZhaTogQnVnIDE1NDczNyBnZXRVc2VyRGF0YS9zZXRVc2VyRGF0YSBzdXBwb3J0IGZvciBOb2RlCi0gKiAgICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDczNwotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjk2OTk5IC0gSW5lZmZpY2llbnQgdXNlIG9mIG5ldyBTdHJpbmcoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0vKioKLSAqIEVudGl0eUltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eUltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIEVudGl0eSB7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBub3RhdGlvbk5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBzeXN0ZW1JZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBFbnRpdHlJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEVudGl0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRW50aXR5SW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBFbnRpdHlJbXBsCi0JICovCi0JcHJvdGVjdGVkIEVudGl0eUltcGwoRW50aXR5SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZSA9IHRoYXQubmFtZTsKLQkJCXRoaXMucHVibGljSWQgPSB0aGF0LnB1YmxpY0lkOwotCQkJdGhpcy5zeXN0ZW1JZCA9IHRoYXQuc3lzdGVtSWQ7Ci0JCQl0aGlzLm5vdGF0aW9uTmFtZSA9IHRoYXQubm90YXRpb25OYW1lOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlFbnRpdHlJbXBsIGNsb25lZCA9IG5ldyBFbnRpdHlJbXBsKHRoaXMpOwotCQlub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwgY2xvbmVkKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIHRleHQgZGVjbGFyYXRpb24sIHRoZSBlbmNvZGluZwotCSAqIG9mIHRoaXMgZW50aXR5LCB3aGVuIGl0IGlzIGFuIGV4dGVybmFsIHBhcnNlZCBlbnRpdHkuIFRoaXMgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlpZiAodGhpcy5uYW1lID09IG51bGwpCi0JCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBFTlRJVFlfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb3RhdGlvbk5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5vdGF0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQdWJsaWNJZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgewotCQlyZXR1cm4gdGhpcy5wdWJsaWNJZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTeXN0ZW1JZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlyZXR1cm4gdGhpcy5zeXN0ZW1JZDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIHRleHQgZGVjbGFyYXRpb24sIHRoZSB2ZXJzaW9uCi0JICogbnVtYmVyIG9mIHRoaXMgZW50aXR5LCB3aGVuIGl0IGlzIGFuIGV4dGVybmFsIHBhcnNlZCBlbnRpdHkuIFRoaXMgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgdGV4dCBkZWNsYXJhdGlvbiwgdGhlIGVuY29kaW5nCi0JICogb2YgdGhpcyBlbnRpdHksIHdoZW4gaXQgaXMgYW4gZXh0ZXJuYWwgcGFyc2VkIGVudGl0eS4gVGhpcyBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoamF2YS5sYW5nLlN0cmluZyBlbmNvZGluZykgewotCX0KLQotCS8qKgotCSAqIHNldE5hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogc2V0Tm90YXRpb25OYW1lIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub3RhdGlvbk5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb3RhdGlvbk5hbWUoU3RyaW5nIG5vdGF0aW9uTmFtZSkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCi0JCXRoaXMubm90YXRpb25OYW1lID0gbm90YXRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIHNldFB1YmxpY0lkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwdWJsaWNJZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKFN0cmluZyBwdWJsaWNJZCkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCi0JCXRoaXMucHVibGljSWQgPSBwdWJsaWNJZDsKLQl9Ci0KLQkvKioKLQkgKiBzZXRTeXN0ZW1JZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gc3lzdGVtSWQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JZChTdHJpbmcgc3lzdGVtSWQpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQl0aGlzLnN5c3RlbUlkID0gc3lzdGVtSWQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSB0ZXh0IGRlY2xhcmF0aW9uLCB0aGUgdmVyc2lvbgotCSAqIG51bWJlciBvZiB0aGlzIGVudGl0eSwgd2hlbiBpdCBpcyBhbiBleHRlcm5hbCBwYXJzZWQgZW50aXR5LiBUaGlzIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKGphdmEubGFuZy5TdHJpbmcgdmVyc2lvbikgewotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5wdXRFbmNvZGluZygpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFhtbEVuY29kaW5nKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRYbWxWZXJzaW9uKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbnRpdHlSZWZlcmVuY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VudGl0eVJlZmVyZW5jZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRlZGIzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VudGl0eVJlZmVyZW5jZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTY5OTkgLSBJbmVmZmljaWVudCB1c2Ugb2YgbmV3IFN0cmluZygpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotLyoqCi0gKiBFbnRpdHlSZWZlcmVuY2UgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eVJlZmVyZW5jZUltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIEVudGl0eVJlZmVyZW5jZSB7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIEVudGl0eVJlZmVyZW5jZUltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRW50aXR5UmVmZXJlbmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFbnRpdHlSZWZlcmVuY2VJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIEVudGl0eVJlZmVyZW5jZUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgRW50aXR5UmVmZXJlbmNlSW1wbChFbnRpdHlSZWZlcmVuY2VJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5uYW1lID0gdGhhdC5uYW1lOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlFbnRpdHlSZWZlcmVuY2VJbXBsIGNsb25lZCA9IG5ldyBFbnRpdHlSZWZlcmVuY2VJbXBsKHRoaXMpOwotCQlub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwgY2xvbmVkKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlpZiAodGhpcy5uYW1lID09IG51bGwpCi0JCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBFTlRJVFlfUkVGRVJFTkNFX05PREU7Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0ludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTNhMDc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICogVGhyb3duIGFuIGludmFsaWQgY2hhcmFjdGVyIGlzIHNwZWNpZmllZCBpbiA6IFhNTE5vZGUjc2V0U291cmNlKFN0cmluZykKLSAqLwotcHVibGljIGNsYXNzIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JLyoqCi0JICogRGVmYXVsdCA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgY2hhciBpbnZhbGlkQ2hhciA9IDA7Ci0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gLTE7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbihTdHJpbmcgcywgY2hhciBjKSB7Ci0JCXN1cGVyKHMpOwotCQl0aGlzLmludmFsaWRDaGFyID0gYzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbihTdHJpbmcgcywgY2hhciBjLCBpbnQgb2Zmc2V0KSB7Ci0JCXN1cGVyKHMpOwotCQl0aGlzLmludmFsaWRDaGFyID0gYzsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGNoYXIgZ2V0SW52YWxpZENoYXIoKSB7Ci0JCXJldHVybiB0aGlzLmludmFsaWRDaGFyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gdGhpcy5vZmZzZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BUYWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMmRlNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIEpTUFRhZyBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBKU1BUYWcgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9DTE9TRSA9ICItLSU+IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX09QRU4gPSAiPCUtLSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVDTEFSQVRJT05fVE9LRU4gPSAiISI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUSVZFX1RPS0VOID0gIkAiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fVE9LRU4gPSAiPSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RFQ0xBUkFUSU9OID0gImpzcDpkZWNsYXJhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRSA9ICJqc3A6ZGlyZWN0aXZlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRVhQUkVTU0lPTiA9ICJqc3A6ZXhwcmVzc2lvbiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1JPT1QgPSAianNwOnJvb3QiOy8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1NDUklQVExFVCA9ICJqc3A6c2NyaXB0bGV0IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0xPU0UgPSAiJT4iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PUEVOID0gIjwlIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01vZGVsUGFyc2VyQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Nb2RlbFBhcnNlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYxOTA3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01vZGVsUGFyc2VyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxQYXJzZXJBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkJlSW1wbGljaXRUYWcoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkJlSW1wbGljaXRUYWcoRWxlbWVudCBlbGVtZW50LCBOb2RlIGNoaWxkKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNvbnRhaW4oRWxlbWVudCBlbGVtZW50LCBOb2RlIGNoaWxkKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUNvbW1lbnRFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZGF0YSwgYm9vbGVhbiBpc0pTUFRhZyk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVJbXBsaWNpdEVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIE5vZGUgcGFyZW50LCBOb2RlIGNoaWxkKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmluZFJvb3ROYW1lKFN0cmluZyB0YWdOYW1lKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5kVGFnKElET01FbGVtZW50IGVsZW1lbnQpOwotCi0JYm9vbGVhbiBpc0VuZFRhZ09taXNzaWJsZShFbGVtZW50IGVsZW1lbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhmNmQ2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTY5OTkgLSBJbmVmZmljaWVudCB1c2Ugb2YgbmV3IFN0cmluZygpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKiBOb2RlQ29udGFpbmVyIGNsYXNzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlQ29udGFpbmVyIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBOb2RlLCBOb2RlTGlzdCB7Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGNsYXNzIENoaWxkTm9kZXNDYWNoZSBpbXBsZW1lbnRzIE5vZGVMaXN0IHsKLQkJcHJpdmF0ZSBOb2RlIGN1ckNoaWxkID0gbnVsbDsKLQkJcHJpdmF0ZSBpbnQgY3VySW5kZXggPSAtMTsKLQkJcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLQotCQlDaGlsZE5vZGVzQ2FjaGUoKSB7Ci0JCQlpbml0aWFsaXplQ2FjaGUoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJLy8gYXRvbWljCi0JCQlyZXR1cm4gdGhpcy5sZW5ndGg7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNhY2hlKCkgewotCQkJLy8gbm90ZSB3ZSB1c2UgdGhlIG91dHRlciBvYmplY3RzIGxvY2tvYmplY3QKLQkJCS8vIChzaW5jZSB3ZSBhcmUgdXNpbmcgdGhlaXIgImNoaWxkcmVuIi4KLQkJCXN5bmNocm9uaXplZCAobG9ja09iamVjdCkgewotCQkJCWZvciAoTm9kZSBjaGlsZCA9IGZpcnN0Q2hpbGQ7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQl0aGlzLmxlbmd0aCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGxvY2tPYmplY3QpIHsKLQkJCQlpZiAodGhpcy5sZW5ndGggPT0gMCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJaWYgKGluZGV4IDwgMCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJaWYgKGluZGV4ID49IHRoaXMubGVuZ3RoKQotCQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJCWlmICh0aGlzLmN1ckluZGV4IDwgMCkgeyAvLyBmaXJzdCB0aW1lCi0JCQkJCWlmIChpbmRleCAqIDIgPj0gdGhpcy5sZW5ndGgpIHsgLy8gc2VhcmNoIGZyb20gdGhlIGxhc3QKLQkJCQkJCXRoaXMuY3VySW5kZXggPSB0aGlzLmxlbmd0aCAtIDE7Ci0JCQkJCQl0aGlzLmN1ckNoaWxkID0gbGFzdENoaWxkOwotCQkJCQl9IGVsc2UgeyAvLyBzZWFyY2ggZnJvbSB0aGUgZmlyc3QKLQkJCQkJCXRoaXMuY3VySW5kZXggPSAwOwotCQkJCQkJdGhpcy5jdXJDaGlsZCA9IGZpcnN0Q2hpbGQ7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoaW5kZXggPT0gdGhpcy5jdXJJbmRleCkKLQkJCQkJcmV0dXJuIHRoaXMuY3VyQ2hpbGQ7Ci0KLQkJCQlpZiAoaW5kZXggPiB0aGlzLmN1ckluZGV4KSB7Ci0JCQkJCXdoaWxlIChpbmRleCA+IHRoaXMuY3VySW5kZXgpIHsKLQkJCQkJCXRoaXMuY3VySW5kZXgrKzsKLQkJCQkJCXRoaXMuY3VyQ2hpbGQgPSB0aGlzLmN1ckNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgeyAvLyBpbmRleCA8IHRoaXMuY3VySW5kZXgKLQkJCQkJd2hpbGUgKGluZGV4IDwgdGhpcy5jdXJJbmRleCkgewotCQkJCQkJdGhpcy5jdXJJbmRleC0tOwotCQkJCQkJdGhpcy5jdXJDaGlsZCA9IHRoaXMuY3VyQ2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdGhpcy5jdXJDaGlsZDsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgTm9kZUxpc3QgY2hpbGROb2Rlc0NhY2hlID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBmQ2hpbGRFZGl0YWJsZSA9IHRydWU7Ci0JTm9kZUltcGwgZmlyc3RDaGlsZCA9IG51bGw7Ci0JTm9kZUltcGwgbGFzdENoaWxkID0gbnVsbDsKLQotCU9iamVjdCBsb2NrT2JqZWN0ID0gbmV3IGJ5dGVbMF07Ci0KLQkvKioKLQkgKiBOb2RlQ29udGFpbmVyIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIE5vZGVDb250YWluZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm9kZUNvbnRhaW5lciBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBOb2RlQ29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIE5vZGVDb250YWluZXIoTm9kZUNvbnRhaW5lciB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIGFwcGVuZENoaWxkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGFwcGVuZENoaWxkKE5vZGUgbmV3Q2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBjbG9uZUNoaWxkTm9kZXMgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xvbmVDaGlsZE5vZGVzKE5vZGUgbmV3UGFyZW50LCBib29sZWFuIGRlZXApIHsKLQkJaWYgKG5ld1BhcmVudCA9PSBudWxsIHx8IG5ld1BhcmVudCA9PSB0aGlzKQotCQkJcmV0dXJuOwotCQlpZiAoIShuZXdQYXJlbnQgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyKSkKLQkJCXJldHVybjsKLQotCQlOb2RlQ29udGFpbmVyIGNvbnRhaW5lciA9IChOb2RlQ29udGFpbmVyKSBuZXdQYXJlbnQ7Ci0JCWNvbnRhaW5lci5yZW1vdmVDaGlsZE5vZGVzKCk7Ci0KLQkJZm9yIChOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCU5vZGUgY2xvbmVkID0gY2hpbGQuY2xvbmVOb2RlKGRlZXApOwotCQkJaWYgKGNsb25lZCAhPSBudWxsKQotCQkJCWNvbnRhaW5lci5hcHBlbmRDaGlsZChjbG9uZWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0Q2hpbGROb2RlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGVMaXN0Ci0JICovCi0JcHVibGljIE5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIGdldEZpcnN0Q2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Rmlyc3RDaGlsZCgpIHsKLQkJcmV0dXJuIHRoaXMuZmlyc3RDaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMYXN0Q2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0TGFzdENoaWxkKCkgewotCQlyZXR1cm4gdGhpcy5sYXN0Q2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCWlmICh0aGlzLmZpcnN0Q2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlzeW5jaHJvbml6ZWQgKGxvY2tPYmplY3QpIHsKLQkJCWlmICh0aGlzLmNoaWxkTm9kZXNDYWNoZSA9PSBudWxsKQotCQkJCXRoaXMuY2hpbGROb2Rlc0NhY2hlID0gbmV3IENoaWxkTm9kZXNDYWNoZSgpOwotCQkJcmV0dXJuIHRoaXMuY2hpbGROb2Rlc0NhY2hlLmdldExlbmd0aCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc291cmNlID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dCgpOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlKTsKLQkJfQotCi0JCWZvciAoTm9kZUltcGwgY2hpbGQgPSBmaXJzdENoaWxkOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IChOb2RlSW1wbCkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJU3RyaW5nIHNvdXJjZSA9IGNoaWxkLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlKTsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHNvdXJjZSA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChzb3VyY2UpOwotCQl9Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGhhc0NoaWxkTm9kZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpIHsKLQkJcmV0dXJuICh0aGlzLmZpcnN0Q2hpbGQgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0QmVmb3JlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSByZWZDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGluc2VydEJlZm9yZShOb2RlIG5ld0NoaWxkLCBOb2RlIHJlZkNoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld0NoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm90aGluZyB0byBkbwotCQlpZiAocmVmQ2hpbGQgIT0gbnVsbCAmJiByZWZDaGlsZC5nZXRQYXJlbnROb2RlKCkgIT0gdGhpcykgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX0ZPVU5EX0VSUiwgRE9NTWVzc2FnZXMuTk9UX0ZPVU5EX0VSUik7Ci0JCX0KLQkJaWYgKCFpc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0JCWlmIChuZXdDaGlsZCA9PSByZWZDaGlsZCkKLQkJCXJldHVybiBuZXdDaGlsZDsgLy8gbm90aGluZyB0byBkbwotCQkvL25ldyBjaGlsZCBjYW4gbm90IGJlIGEgcGFyZW50IG9mIHRoaXMsIHdvdWxkIGNhdXNlIGN5Y2xlCi0JCWlmKGlzUGFyZW50KG5ld0NoaWxkKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCBET01NZXNzYWdlcy5ISUVSQVJDSFlfUkVRVUVTVF9FUlIpOwotCQl9Ci0KLQkJaWYgKG5ld0NoaWxkLmdldE5vZGVUeXBlKCkgPT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSkgewotCQkJLy8gaW5zZXJ0IGNoaWxkIG5vZGVzIGluc3RlYWQKLQkJCWZvciAoTm9kZSBjaGlsZCA9IG5ld0NoaWxkLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBuZXdDaGlsZC5nZXRGaXJzdENoaWxkKCkpIHsKLQkJCQluZXdDaGlsZC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJaW5zZXJ0QmVmb3JlKGNoaWxkLCByZWZDaGlsZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JCX0KLQkJLy8gc3luY2hyb25pemVkIGluIGNhc2UgYW5vdGhlciB0aHJlYWQgaXMgZ2V0dGluZyBpdGVtLCBvciBsZW5ndGgKLQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQl0aGlzLmNoaWxkTm9kZXNDYWNoZSA9IG51bGw7IC8vIGludmFsaWRhdGUgY2hpbGQgbm9kZXMgY2FjaGUKLQkJfQotCi0JCU5vZGVJbXBsIGNoaWxkID0gKE5vZGVJbXBsKSBuZXdDaGlsZDsKLQkJTm9kZUltcGwgbmV4dCA9IChOb2RlSW1wbCkgcmVmQ2hpbGQ7Ci0JCU5vZGVJbXBsIHByZXYgPSBudWxsOwotCQlOb2RlIG9sZFBhcmVudCA9IGNoaWxkLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKG9sZFBhcmVudCAhPSBudWxsKQotCQkJb2xkUGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJaWYgKG5leHQgPT0gbnVsbCkgewotCQkJcHJldiA9IHRoaXMubGFzdENoaWxkOwotCQkJdGhpcy5sYXN0Q2hpbGQgPSBjaGlsZDsKLQkJfSBlbHNlIHsKLQkJCXByZXYgPSAoTm9kZUltcGwpIG5leHQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQluZXh0LnNldFByZXZpb3VzU2libGluZyhjaGlsZCk7Ci0JCX0KLQkJaWYgKHByZXYgPT0gbnVsbCkKLQkJCXRoaXMuZmlyc3RDaGlsZCA9IGNoaWxkOwotCQllbHNlCi0JCQlwcmV2LnNldE5leHRTaWJsaW5nKGNoaWxkKTsKLQkJY2hpbGQuc2V0UHJldmlvdXNTaWJsaW5nKHByZXYpOwotCQljaGlsZC5zZXROZXh0U2libGluZyhuZXh0KTsKLQkJY2hpbGQuc2V0UGFyZW50Tm9kZSh0aGlzKTsKLQkJLy8gbWFrZSBzdXJlIGhhdmluZyB0aGUgc2FtZSBvd25lciBkb2N1bWVudAotCQlpZiAoY2hpbGQuZ2V0T3duZXJEb2N1bWVudCgpID09IG51bGwpIHsKLQkJCWlmIChnZXROb2RlVHlwZSgpID09IERPQ1VNRU5UX05PREUpIHsKLQkJCQljaGlsZC5zZXRPd25lckRvY3VtZW50KChEb2N1bWVudCkgdGhpcyk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLnNldE93bmVyRG9jdW1lbnQoZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCX0KLQkJfQotCi0JCW5vdGlmeUNoaWxkUmVwbGFjZWQoY2hpbGQsIG51bGwpOwotCi0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoaWxkRWRpdGFibGUoKSB7Ci0JCWlmICghZkNoaWxkRWRpdGFibGUpIHsKLQkJCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGdldE1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5pc1JlcGFyc2luZygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZDaGlsZEVkaXRhYmxlOwotCX0KLQotCS8qKgotCSAqIGlzQ29udGFpbmVyIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKHRoaXMuZmlyc3RDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXN5bmNocm9uaXplZCAobG9ja09iamVjdCkgewotCQkJaWYgKHRoaXMuY2hpbGROb2Rlc0NhY2hlID09IG51bGwpCi0JCQkJdGhpcy5jaGlsZE5vZGVzQ2FjaGUgPSBuZXcgQ2hpbGROb2Rlc0NhY2hlKCk7Ci0JCQlyZXR1cm4gdGhpcy5jaGlsZE5vZGVzQ2FjaGUuaXRlbShpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBub3RpZnlDaGlsZFJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUNoaWxkUmVwbGFjZWQoTm9kZSBuZXdDaGlsZCwgTm9kZSBvbGRDaGlsZCkgewotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRDb250YWluZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlzeW5jQ2hpbGRFZGl0YWJsZVN0YXRlKG5ld0NoaWxkKTsKLQotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuY2hpbGRSZXBsYWNlZCh0aGlzLCBuZXdDaGlsZCwgb2xkQ2hpbGQpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZUNoaWxkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIHJlbW92ZUNoaWxkKE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAob2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAob2xkQ2hpbGQuZ2V0UGFyZW50Tm9kZSgpICE9IHRoaXMpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9GT1VORF9FUlIsIERPTU1lc3NhZ2VzLk5PVF9GT1VORF9FUlIpOwotCQl9Ci0KLQkJaWYgKCFpc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJLy8gc3luY2hyb25pemVkIGluIGNhc2UgYW5vdGhlciB0aHJlYWQgaXMgZ2V0dGluZyBpdGVtLCBvciBsZW5ndGgKLQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQl0aGlzLmNoaWxkTm9kZXNDYWNoZSA9IG51bGw7IC8vIGludmFsaWRhdGUgY2hpbGQgbm9kZXMgY2FjaGUKLQkJfQotCi0JCU5vZGVJbXBsIGNoaWxkID0gKE5vZGVJbXBsKSBvbGRDaGlsZDsKLQkJTm9kZUltcGwgcHJldiA9IChOb2RlSW1wbCkgY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCU5vZGVJbXBsIG5leHQgPSAoTm9kZUltcGwpIGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJY2hpbGQuc2V0RWRpdGFibGUodHJ1ZSwgdHJ1ZSk7IC8vIGNsZWFyIFJlYWRPbmx5IGZsYWdzCi0KLQkJaWYgKHByZXYgPT0gbnVsbCkKLQkJCXRoaXMuZmlyc3RDaGlsZCA9IG5leHQ7Ci0JCWVsc2UKLQkJCXByZXYuc2V0TmV4dFNpYmxpbmcobmV4dCk7Ci0JCWlmIChuZXh0ID09IG51bGwpCi0JCQl0aGlzLmxhc3RDaGlsZCA9IHByZXY7Ci0JCWVsc2UKLQkJCW5leHQuc2V0UHJldmlvdXNTaWJsaW5nKHByZXYpOwotCQljaGlsZC5zZXRQcmV2aW91c1NpYmxpbmcobnVsbCk7Ci0JCWNoaWxkLnNldE5leHRTaWJsaW5nKG51bGwpOwotCQljaGlsZC5zZXRQYXJlbnROb2RlKG51bGwpOwotCi0JCW5vdGlmeUNoaWxkUmVwbGFjZWQobnVsbCwgY2hpbGQpOwotCi0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVDaGlsZE5vZGVzIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkTm9kZXMoKSB7Ci0JCWlmICghaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCi0JCU5vZGUgbmV4dENoaWxkID0gbnVsbDsKLQkJZm9yIChOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IG5leHRDaGlsZCkgewotCQkJbmV4dENoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJlbW92ZUNoaWxkTm9kZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50Ci0JICogQHBhcmFtIGZpcnN0Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbGFzdENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIERvY3VtZW50RnJhZ21lbnQgcmVtb3ZlQ2hpbGROb2RlcyhOb2RlIGZpcnN0Q2hpbGQsIE5vZGUgbGFzdENoaWxkKSB7Ci0JCWlmICghaGFzQ2hpbGROb2RlcygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCi0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJaWYgKGdldE5vZGVUeXBlKCkgPT0gRE9DVU1FTlRfTk9ERSkKLQkJCWRvY3VtZW50ID0gKERvY3VtZW50KSB0aGlzOwotCQllbHNlCi0JCQlkb2N1bWVudCA9IGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRG9jdW1lbnRGcmFnbWVudCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKLQkJaWYgKGZyYWdtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoZmlyc3RDaGlsZCA9PSBudWxsKQotCQkJZmlyc3RDaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGxhc3RDaGlsZCA9PSBudWxsKQotCQkJbGFzdENoaWxkID0gZ2V0TGFzdENoaWxkKCk7Ci0JCU5vZGUgbmV4dENoaWxkID0gbnVsbDsKLQkJZm9yIChOb2RlIGNoaWxkID0gZmlyc3RDaGlsZDsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBuZXh0Q2hpbGQpIHsKLQkJCW5leHRDaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlyZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQlmcmFnbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQlpZiAoY2hpbGQgPT0gbGFzdENoaWxkKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIGZyYWdtZW50OwotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSByZXBsYWNlQ2hpbGQoTm9kZSBuZXdDaGlsZCwgTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCi0JCWlmIChvbGRDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG5ld0NoaWxkOwotCQlpZiAobmV3Q2hpbGQgIT0gbnVsbCkKLQkJCWluc2VydEJlZm9yZShuZXdDaGlsZCwgb2xkQ2hpbGQpOwotCQlyZXR1cm4gcmVtb3ZlQ2hpbGQob2xkQ2hpbGQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoaWxkRWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSkgewotCQlpZiAoZkNoaWxkRWRpdGFibGUgPT0gZWRpdGFibGUpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVJlYWRPbmx5Q29udHJvbGxlciByb2MgPSBSZWFkT25seUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTsKLQkJTm9kZSBub2RlOwotCQlpZiAoZWRpdGFibGUpIHsKLQkJCWZvciAobm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJcm9jLnVubG9ja05vZGUoKElET01Ob2RlKSBub2RlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAobm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJcm9jLmxvY2tOb2RlKChJRE9NTm9kZSkgbm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlmQ2hpbGRFZGl0YWJsZSA9IGVkaXRhYmxlOwotCQlub3RpZnlFZGl0YWJsZUNoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jQ2hpbGRFZGl0YWJsZVN0YXRlKE5vZGUgY2hpbGQpIHsKLQkJUmVhZE9ubHlDb250cm9sbGVyIHJvYyA9IFJlYWRPbmx5Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpOwotCQlpZiAoZkNoaWxkRWRpdGFibGUpIHsKLQkJCXJvYy51bmxvY2tOb2RlKChOb2RlSW1wbCkgY2hpbGQpOwotCQl9IGVsc2UgewotCQkJcm9jLmxvY2tOb2RlKChOb2RlSW1wbCkgY2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+Q2hlY2tzIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gPGNvZGU+Tm9kZTwvY29kZT4gaXMgYSBwYXJlbnQgb2YgPGNvZGU+dGhpczwvY29kZT4gbm9kZTwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zc2libGVQYXJlbnQgdGhlIHBvc3NpYmxlIHBhcmVudCA8Y29kZT5Ob2RlPC9jb2RlPiBvZiA8Y29kZT50aGlzPC9jb2RlPiBub2RlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5wb3NzaWJsZVBhcmVudDwvY29kZT4gaXMgdGhlIHBhcmVudCBvZiA8Y29kZT50aGlzPC9jb2RlPiwKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1BhcmVudChOb2RlIHBvc3NpYmxlUGFyZW50KSB7Ci0JCU5vZGUgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlKHBhcmVudCAhPSBudWxsICYmIHBhcmVudCAhPSBwb3NzaWJsZVBhcmVudCkgewotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnQgPT0gcG9zc2libGVQYXJlbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzhkZWI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICogICAgIEJhbGF6cyBCYW5mYWk6IEJ1ZyAxNTQ3MzcgZ2V0VXNlckRhdGEvc2V0VXNlckRhdGEgc3VwcG9ydCBmb3IgTm9kZQotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ3MzcKLSAqICAgICAKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDI5NTEyNyAtIGltcGxlbWVudCBpc1NhbWVOb2RlIGFuZCBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiBtZXRob2RzLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdCBUZXN0cyBjb3ZlcmVkIGluIHdzdC54c2wgWFBhdGggMi4wIHRlc3RzLgotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjk2OTk5IC0gSW5lZmZpY2llbnQgdXNlIG9mIG5ldyBTdHJpbmcoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3ROb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLlR5cGVJbmZvOwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotLyoqCi0gKiBOb2RlSW1wbCBjbGFzcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUltcGwgZXh0ZW5kcyBBYnN0cmFjdE5vdGlmaWVyIGltcGxlbWVudHMgTm9kZSwgSURPTU5vZGUgewotCS8vIGRlZmluZSBvbmUgZW1wdHkgbm9kZWxpc3QsIGZvciByZXBlYXRlZCB1c2UKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBOb2RlTGlzdCBFTVBUWV9OT0RFX0xJU1QgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JLy8gRG9jdW1lbnRQb3NpdGlvbgotCS8vcHJpdmF0ZSBmaW5hbCBzdGF0aWMgc2hvcnQgICAgICBET0NVTUVOVF9QT1NJVElPTl9ESVNDT05ORUNURUQgPSAweDAxOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIHNob3J0ICAgICAgRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HICAgID0gMHgwMjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBzaG9ydCAgICAgIERPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORyAgICA9IDB4MDQ7Ci0gICAgLy9wcml2YXRlIGZpbmFsIHN0YXRpYyBzaG9ydCAgICAgIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5TICAgICA9IDB4MDg7Ci0JLy9wcml2YXRlIGZpbmFsIHN0YXRpYyBzaG9ydCAgICAgIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWSA9IDB4MTA7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgc2hvcnQgICAgICBET0NVTUVOVF9QT1NJVElPTl9JTVBMRU1FTlRBVElPTl9TUEVDSUZJQyA9IDB4MjA7Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBmRGF0YUVkaXRhYmxlID0gdHJ1ZTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCXByaXZhdGUgTm9kZUltcGwgbmV4dFNpYmxpbmcgPSBudWxsOwotCi0JcHJpdmF0ZSBEb2N1bWVudEltcGwgb3duZXJEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBOb2RlSW1wbCBwYXJlbnROb2RlID0gbnVsbDsKLQlwcml2YXRlIE5vZGVJbXBsIHByZXZpb3VzU2libGluZyA9IG51bGw7Ci0JLy8gZGVmaW5lIG9uZSBlbXB0eSBTdHJpbmcgY29uc3RhbnQgZm9yIHJlcGVhdGVkIHVzZQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7Ci0JCi0JLyoqCi0JICogTm9kZUltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm9kZUltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgTm9kZUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUltcGwoTm9kZUltcGwgdGhhdCkgewotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLm93bmVyRG9jdW1lbnQgPSB0aGF0Lm93bmVyRG9jdW1lbnQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhcHBlbmRDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBhcHBlbmRDaGlsZChOb2RlIG5ld0NoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCBET01NZXNzYWdlcy5ISUVSQVJDSFlfUkVRVUVTVF9FUlIpOwotCX0KLQotCS8qKgotCSAqIGNvbnRhaW5zIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIChvZmZzZXQgPj0gZ2V0U3RhcnRPZmZzZXQoKSAmJiBvZmZzZXQgPCBnZXRFbmRPZmZzZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHMKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZURPTUV4Y2VwdGlvbk1lc3NhZ2Uoc2hvcnQgcywgU3RyaW5nIHRhZ05hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIFRPRE86IFNob3VsZCBsb2NhbGl6ZSB0aGVzZSBtZXNzYWdlcywgYW5kIHByb3ZpZGUgL3UgZXNjYXBlZAotCQkvLyB2ZXJzaW9uIG9mIHRhZ05hbWUKLQkJcmVzdWx0ID0gbG9va3VwTWVzc2FnZShzKSArICIgIiArIHRhZ05hbWU7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyaWJ1dGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTmFtZWROb2RlTWFwCi0JICovCi0JcHVibGljIE5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENoYXJWYWx1ZShTdHJpbmcgbmFtZSkgewotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBkb2N1bWVudC5nZXRDaGFyVmFsdWUobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q2hpbGROb2RlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGVMaXN0Ci0JICovCi0JcHVibGljIE5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCS8vIEFzIHBlciBET00gc3BlYywgY29ycmVjdCBiZWhhdmlvciBmb3IgZ2V0Q2hpbGROb2RlcyBpcyB0byByZXR1cm4gYQotCQkvLyB6ZXJvIGxlbmd0aCBOb2RlTGlzdCwgbm90IG51bGwsIHdoZW4gdGhlcmUgYXJlIG5vIGNoaWxkcmVuLgotCQkvLyBXZSdsbCB1c2UgYSBjb21tb24gaW5zdGFuY2Ugb2YgYW4gZW1wdHkgbm9kZSBsaXN0LCBqdXN0IHRvIHByZXZlbnQKLQkJLy8gY3JlYXRpbmcgYSB0cml2YWwgb2JqZWN0IG1hbnkgbWFueSB0aW1lcy4KLQotCQlyZXR1cm4gRU1QVFlfTk9ERV9MSVNUOwotCX0KLQotCS8qKgotCSAqIGdldENvbW1vbkFuY2VzdG9yIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Q29tbW9uQW5jZXN0b3IoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlmb3IgKE5vZGUgbmEgPSBub2RlOyBuYSAhPSBudWxsOyBuYSA9IG5hLmdldFBhcmVudE5vZGUoKSkgewotCQkJZm9yIChOb2RlIHRhID0gdGhpczsgdGEgIT0gbnVsbDsgdGEgPSB0YS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCQlpZiAodGEgPT0gbmEpCi0JCQkJCXJldHVybiB0YTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQkvKioKLQkgKiBnZXRDb250YWluZXJEb2N1bWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0JICovCi0JcHVibGljIERvY3VtZW50IGdldENvbnRhaW5lckRvY3VtZW50KCkgewotCQlOb2RlIHBhcmVudCA9IG51bGw7Ci0JCWZvciAoTm9kZSBub2RlID0gdGhpczsgbm9kZSAhPSBudWxsOyBub2RlID0gcGFyZW50KSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCXJldHVybiAoRG9jdW1lbnQpIG5vZGU7Ci0JCQl9Ci0JCQkvKiBCcmVhayBvdXQgb2YgYSBiYWQgaGllcmFyY2h5ICovCi0JCQlpZiAoKHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSA9PSBub2RlKQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldEVuZE9mZnNldCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlOb2RlIG5vZGUgPSB0aGlzOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJCQlyZXR1cm4gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQkJfQotCi0JCQlOb2RlIGxhc3QgPSBub2RlLmdldExhc3RDaGlsZCgpOwotCQkJaWYgKGxhc3QgIT0gbnVsbCkgeyAvLyBkaWcgaW50byB0aGUgbGFzdAotCQkJCW5vZGUgPSBsYXN0OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQkJcmV0dXJuIGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCk7Ci0KLQkJCU5vZGUgcHJldiA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlpZiAocHJldiAhPSBudWxsKSB7IC8vIG1vdmUgdG8gdGhlIHByZXZpb3VzCi0JCQkJbm9kZSA9IHByZXY7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlub2RlID0gbnVsbDsKLQkJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQkJCX0KLQkJCQlOb2RlIHBhcmVudFByZXYgPSBwYXJlbnQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJaWYgKHBhcmVudFByZXYgIT0gbnVsbCkgeyAvLyBtb3ZlIHRvIHRoZSBwcmV2aW91cwotCQkJCQlub2RlID0gcGFyZW50UHJldjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJSURPTU1vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCUZhY3RvcnlSZWdpc3RyeSByZWcgPSBtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCWlmIChyZWcgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVnOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldEZpcnN0Q2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Rmlyc3RDaGlsZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0aGlzLmZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOyAvLyBlcnJvcgotCQlpbnQgaW5kZXggPSAwOwotCQlmb3IgKE5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZCA9PSB0aGlzKQotCQkJCXJldHVybiBpbmRleDsKLQkJCWluZGV4Kys7Ci0JCX0KLQkJcmV0dXJuIC0xOyAvLyBlcnJvcgotCX0KLQotCS8qKgotCSAqIGdldExhc3RDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHRoaXMuZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYW4ganVzdCByZWZlciB0byB0aGUgb3duaW5nIGRvY3VtZW50Ci0JICovCi0JcHVibGljIElET01Nb2RlbCBnZXRNb2RlbCgpIHsKLQkJaWYgKHRoaXMub3duZXJEb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBhbGwgYnV0IGF0dHIgcmV0dXJuIG51bGwKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TmFtZVJlZ2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5leHRTaWJsaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldE5leHRTaWJsaW5nKCkgewotCQlyZXR1cm4gdGhpcy5uZXh0U2libGluZzsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlQXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JTm9kZSBnZXROb2RlQXQoaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBwYXJlbnQgPSB0aGlzOwotCQlJRE9NTm9kZSBjaGlsZCA9IChJRE9NTm9kZSkgZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldEVuZE9mZnNldCgpIDw9IG9mZnNldCkgewotCQkJCWNoaWxkID0gKElET01Ob2RlKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNoaWxkLmdldFN0YXJ0T2Zmc2V0KCkgPiBvZmZzZXQpIHsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGNoaWxkLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKSA+IG9mZnNldCkKLQkJCQkJcmV0dXJuIGNoaWxkOwotCQkJfQotCi0JCQkvLyBkaWcgbW9yZQotCQkJcGFyZW50ID0gY2hpbGQ7Ci0JCQljaGlsZCA9IChJRE9NTm9kZSkgcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE93bmVyRG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCkgewotCQlyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIGdldFBhcmVudE5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJldmlvdXNTaWJsaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLQkJcmV0dXJuIHRoaXMucHJldmlvdXNTaWJsaW5nOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQlpZiAodGhpcy5mbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJcmV0dXJuIHRoaXMuZmxhdE5vZGUuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIGdldFN0YXJ0T2Zmc2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLmZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCU5vZGVJbXBsIHByZXYgPSAoTm9kZUltcGwpIGdldFByZXZpb3VzU2libGluZygpOwotCQlpZiAocHJldiAhPSBudWxsKQotCQkJcmV0dXJuIHByZXYuZ2V0RW5kT2Zmc2V0KCk7Ci0JCU5vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCWlmIChlbGVtZW50Lmhhc1N0YXJ0VGFnKCkpCi0JCQkJcmV0dXJuIGVsZW1lbnQuZ2V0U3RhcnRFbmRPZmZzZXQoKTsKLQkJCXJldHVybiBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQkJLy8gZmluYWwgZmFsbGJhY2sgdG8gbG9vayBpbnRvIGZpcnN0IGNoaWxkCi0JCU5vZGVJbXBsIGNoaWxkID0gKE5vZGVJbXBsKSBnZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNoaWxkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gY2hpbGQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoY2hpbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCQlyZXR1cm4gY2hpbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCWNoaWxkID0gKE5vZGVJbXBsKSBjaGlsZC5nZXRGaXJzdENoaWxkKCk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCX0KLQotCS8qKgotCSAqIEV2ZXJ5IG5vZGUgKGluZGlyZWN0bHkpIGtub3dzIGl0cyBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBnZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy5mbGF0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBhbGwgYnV0IGF0dHIgcmV0dXJuIG51bGwKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0VmFsdWVSZWdpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVTb3VyY2UoKSB7Ci0JCXJldHVybiBnZXROb2RlVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogaGFzQ2hpbGROb2RlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogaGFzUHJvcGVydGllcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0QmVmb3JlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSByZWZDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGluc2VydEJlZm9yZShOb2RlIG5ld0NoaWxkLCBOb2RlIHJlZkNoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCBET01NZXNzYWdlcy5ISUVSQVJDSFlfUkVRVUVTVF9FUlIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBpc0NvbnRhaW5lciBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGF0YUVkaXRhYmxlKCkgewotCQlpZiAoIWZEYXRhRWRpdGFibGUpIHsKLQkJCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGdldE1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5pc1JlcGFyc2luZygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZEYXRhRWRpdGFibGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0ZWQoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCWlmICh0aGlzLm93bmVyRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJRE9NSW1wbGVtZW50YXRpb24gaW1wbCA9IHRoaXMub3duZXJEb2N1bWVudC5nZXRJbXBsZW1lbnRhdGlvbigpOwotCQlpZiAoaW1wbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaW1wbC5oYXNGZWF0dXJlKGZlYXR1cmUsIHZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGxvb2t1cE1lc3NhZ2Uoc2hvcnQgcykgewotCQkvLyBUT0RPOiBtYWtlIGxvY2FsaXplZCB2ZXJzaW9uCi0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlzd2l0Y2ggKHMpIHsKLQkJCWNhc2UgRE9NRXhjZXB0aW9uLkRPTVNUUklOR19TSVpFX0VSUiA6Ci0JCQkJcmVzdWx0ID0gRE9NTWVzc2FnZXMuRE9NU1RSSU5HX1NJWkVfRVJSOwotCQkJCWJyZWFrOwotCQkJY2FzZSBET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSIDoKLQkJCQlyZXN1bHQgPSBET01NZXNzYWdlcy5ISUVSQVJDSFlfUkVRVUVTVF9FUlI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiA6Ci0JCQkJcmVzdWx0ID0gRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERPTUV4Y2VwdGlvbi5JTlVTRV9BVFRSSUJVVEVfRVJSIDoKLQkJCQlyZXN1bHQgPSBET01NZXNzYWdlcy5JTlVTRV9BVFRSSUJVVEVfRVJSOwotCQkJCWJyZWFrOwotCQkJY2FzZSBET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSIDoKLQkJCQlyZXN1bHQgPSBET01NZXNzYWdlcy5JTlZBTElEX0FDQ0VTU19FUlI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERPTUV4Y2VwdGlvbi5JTlZBTElEX0NIQVJBQ1RFUl9FUlIgOgotCQkJCXJlc3VsdCA9IERPTU1lc3NhZ2VzLklOVkFMSURfQ0hBUkFDVEVSX0VSUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiA6Ci0JCQkJcmVzdWx0ID0gRE9NTWVzc2FnZXMuSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSOwotCQkJCWJyZWFrOwotCQkJY2FzZSBET01FeGNlcHRpb24uSU5WQUxJRF9TVEFURV9FUlIgOgotCQkJCXJlc3VsdCA9IERPTU1lc3NhZ2VzLklOVkFMSURfU1RBVEVfRVJSOwotCQkJCWJyZWFrOwotCQkJY2FzZSBET01FeGNlcHRpb24uTkFNRVNQQUNFX0VSUiA6Ci0JCQkJcmVzdWx0ID0gRE9NTWVzc2FnZXMuTkFNRVNQQUNFX0VSUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgRE9NRXhjZXB0aW9uLk5PX0RBVEFfQUxMT1dFRF9FUlIgOgotCQkJCXJlc3VsdCA9IERPTU1lc3NhZ2VzLk5PX0RBVEFfQUxMT1dFRF9FUlI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIgOgotCQkJCXJlc3VsdCA9IERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgRE9NRXhjZXB0aW9uLk5PVF9GT1VORF9FUlIgOgotCQkJCXJlc3VsdCA9IERPTU1lc3NhZ2VzLk5PVF9GT1VORF9FUlI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiA6Ci0JCQkJcmVzdWx0ID0gRE9NTWVzc2FnZXMuTk9UX1NVUFBPUlRFRF9FUlI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERPTUV4Y2VwdGlvbi5TWU5UQVhfRVJSIDoKLQkJCQlyZXN1bHQgPSBET01NZXNzYWdlcy5TWU5UQVhfRVJSOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxNzovLyBET01FeGNlcHRpb24uVFlQRV9NSVNNQVRDSF9FUlIgOgotCQkJCXJlc3VsdCA9IERPTU1lc3NhZ2VzLlRZUEVfTUlTTUFUQ0hfRVJSOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxNjovLyBET01FeGNlcHRpb24uVkFMSURBVElPTl9FUlIgOgotCQkJCXJlc3VsdCA9IERPTU1lc3NhZ2VzLlZBTElEQVRJT05fRVJSOwotCQkJCWJyZWFrOwotCQkJY2FzZSBET01FeGNlcHRpb24uV1JPTkdfRE9DVU1FTlRfRVJSIDoKLQkJCQlyZXN1bHQgPSBET01NZXNzYWdlcy5XUk9OR19ET0NVTUVOVF9FUlI7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXN1bHQgPSBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBub3JtYWxpemUgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgbm9ybWFsaXplKCkgewotCQlUZXh0SW1wbCBwcmV2VGV4dCA9IG51bGw7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlzd2l0Y2ggKGNoaWxkLmdldE5vZGVUeXBlKCkpIHsKLQkJCQljYXNlIFRFWFRfTk9ERSA6IHsKLQkJCQkJaWYgKHByZXZUZXh0ID09IG51bGwpIHsKLQkJCQkJCXByZXZUZXh0ID0gKFRleHRJbXBsKSBjaGlsZDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCVRleHQgdGV4dCA9IChUZXh0KSBjaGlsZDsKLQkJCQkJcmVtb3ZlQ2hpbGQodGV4dCk7Ci0JCQkJCXByZXZUZXh0LmFwcGVuZFRleHQodGV4dCk7Ci0JCQkJCWNoaWxkID0gcHJldlRleHQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIEVMRU1FTlRfTk9ERSA6IHsKLQkJCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIGNoaWxkOwotCQkJCQllbGVtZW50Lm5vcm1hbGl6ZSgpOwotCQkJCQlwcmV2VGV4dCA9IG51bGw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlkZWZhdWx0IDoKLQkJCQkJcHJldlRleHQgPSBudWxsOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUVkaXRhYmxlQ2hhbmdlZCgpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5lZGl0YWJsZUNoYW5nZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogbm90aWZ5VmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVZhbHVlQ2hhbmdlZCgpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJc3luY0RhdGFFZGl0YWJsZVN0YXRlKCk7Ci0KLQkJRE9NTW9kZWxJbXBsIG1vZGVsID0gKERPTU1vZGVsSW1wbCkgZG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLnZhbHVlQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSByZW1vdmVDaGlsZChOb2RlIG9sZENoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX0ZPVU5EX0VSUiwgRE9NTWVzc2FnZXMuTk9UX0ZPVU5EX0VSUik7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQ2hpbGROb2RlcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZE5vZGVzKCkgewotCX0KLQotCS8qKgotCSAqIHJlbW92ZUNoaWxkTm9kZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50Ci0JICogQHBhcmFtIGZpcnN0Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbGFzdENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIERvY3VtZW50RnJhZ21lbnQgcmVtb3ZlQ2hpbGROb2RlcyhOb2RlIGZpcnN0Q2hpbGQsIE5vZGUgbGFzdENoaWxkKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSByZXBsYWNlQ2hpbGQoTm9kZSBuZXdDaGlsZCwgTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgRE9NTWVzc2FnZXMuSElFUkFSQ0hZX1JFUVVFU1RfRVJSKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgY2hpbGRyZW4gdmFsdWVzIGZyb20gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi4KLQkgKi8KLQl2b2lkIHJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpIHsKLQkJZm9yIChOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IChOb2RlSW1wbCkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJY2hpbGQucmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCX0KLQkJdGhpcy5mbGF0Tm9kZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCS8vIG5vcAotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWlmIChmRGF0YUVkaXRhYmxlID09IGVkaXRhYmxlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlSZWFkT25seUNvbnRyb2xsZXIgcm9jID0gUmVhZE9ubHlDb250cm9sbGVyLmdldEluc3RhbmNlKCk7Ci0JCWlmIChlZGl0YWJsZSkgewotCQkJcm9jLnVubG9ja0RhdGEodGhpcyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyb2MubG9ja0RhdGEodGhpcyk7Ci0JCX0KLQotCQlmRGF0YUVkaXRhYmxlID0gZWRpdGFibGU7Ci0KLQkJbm90aWZ5RWRpdGFibGVDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSwgYm9vbGVhbiBkZWVwKSB7Ci0JCWlmIChkZWVwKSB7Ci0JCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBnZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJbm9kZS5zZXRFZGl0YWJsZShlZGl0YWJsZSwgZGVlcCk7Ci0JCQkJbm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCQl9Ci0JCXNldENoaWxkRWRpdGFibGUoZWRpdGFibGUpOwotCQlzZXREYXRhRWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIHNldE5leHRTaWJsaW5nIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuZXh0U2libGluZwotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5leHRTaWJsaW5nKE5vZGUgbmV4dFNpYmxpbmcpIHsKLQkJdGhpcy5uZXh0U2libGluZyA9IChOb2RlSW1wbCkgbmV4dFNpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICogc2V0Tm9kZVZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlVmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoU3RyaW5nIG5vZGVWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogc2V0T3duZXJEb2N1bWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJEb2N1bWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJdGhpcy5vd25lckRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgb3duZXJEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQsIGJvb2xlYW4gZGVlcCkgewotCQl0aGlzLm93bmVyRG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBvd25lckRvY3VtZW50OwotCi0JCWlmIChkZWVwKSB7Ci0JCQlmb3IgKE5vZGVJbXBsIGNoaWxkID0gKE5vZGVJbXBsKSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gKE5vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJY2hpbGQuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50LCBkZWVwKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHNldFBhcmVudE5vZGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQYXJlbnROb2RlKE5vZGUgcGFyZW50Tm9kZSkgewotCQl0aGlzLnBhcmVudE5vZGUgPSAoTm9kZUltcGwpIHBhcmVudE5vZGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHRocm93cyBET01FeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIHNldFByZXZpb3VzU2libGluZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcHJldmlvdXNTaWJsaW5nCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJldmlvdXNTaWJsaW5nKE5vZGUgcHJldmlvdXNTaWJsaW5nKSB7Ci0JCXRoaXMucHJldmlvdXNTaWJsaW5nID0gKE5vZGVJbXBsKSBwcmV2aW91c1NpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlKFN0cmluZyBzb3VyY2UpIHRocm93cyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJdGhpcy5mbGF0Tm9kZSA9IGZsYXROb2RlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlU291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQkJc2V0Tm9kZVZhbHVlKHNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0RhdGFFZGl0YWJsZVN0YXRlKCkgewotCQlSZWFkT25seUNvbnRyb2xsZXIgcm9jID0gUmVhZE9ubHlDb250cm9sbGVyLmdldEluc3RhbmNlKCk7Ci0JCWlmIChmRGF0YUVkaXRhYmxlKSB7Ci0JCQlyb2MudW5sb2NrRGF0YSh0aGlzKTsKLQkJfQotCQllbHNlIHsKLQkJCXJvYy5sb2NrRGF0YSh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHRvU3RyaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWludCBzdGFydCA9IGdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWlmIChzdGFydCA+PSAwKSB7Ci0JCQlpbnQgZW5kID0gZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAoZW5kID49IDApIHsKLQkJCQlyZXN1bHQgPSBlbmQgLSBzdGFydDsKLQkJCQlpZiAocmVzdWx0IDwgLTEpIHsKLQkJCQkJcmVzdWx0ID0gLTE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLnczYy5kb20uTm9kZSNjb21wYXJlRG9jdW1lbnRQb3NpdGlvbihvcmcudzNjLmRvbS5Ob2RlKQotCSAqLwotCXB1YmxpYyBzaG9ydCBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbihOb2RlIG90aGVyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBJRE9NTm9kZSkpCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgRE9NTWVzc2FnZXMuTk9UX1NVUFBPUlRFRF9FUlIpOwotCi0JCWludCBub2RlU3RhcnQgPSB0aGlzLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBvdGhlclN0YXJ0ID0gKChJRE9NTm9kZSkgb3RoZXIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJaWYgKG90aGVyU3RhcnQgPiBub2RlU3RhcnQpIHsKLQkJCXJldHVybiBET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkc7Ci0JCX0KLQkJZWxzZSBpZiAob3RoZXJTdGFydCA8IG5vZGVTdGFydCkgewotCQkJcmV0dXJuIERPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORzsKLQkJfQotCQlyZXR1cm4gRE9DVU1FTlRfUE9TSVRJT05fSU1QTEVNRU5UQVRJT05fU1BFQ0lGSUM7Ci0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VVUkkoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dENvbnRlbnQoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcudzNjLmRvbS5Ob2RlI2lzRXF1YWxOb2RlKG9yZy53M2MuZG9tLk5vZGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFcXVhbE5vZGUoTm9kZSBhcmcpIHsKLQkJcmV0dXJuIHRoaXMuZXF1YWxzKGFyZyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLnczYy5kb20uTm9kZSNpc1NhbWVOb2RlKG9yZy53M2MuZG9tLk5vZGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYW1lTm9kZShOb2RlIG90aGVyKSB7Ci0JCXJldHVybiB0aGlzID09IG90aGVyOwotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBsb29rdXBOYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9va3VwUHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0Q29udGVudChTdHJpbmcgdGV4dENvbnRlbnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBUeXBlSW5mbyBnZXRTY2hlbWFUeXBlSW5mbygpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lkKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBvYmplY3QgZm9yIGEgbm9kZSBhc3NvY2lhdGVkIHRvIGEga2V5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkgVGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdC4KLQkgKiBAcmV0dXJuIG9iamVjdCBUaGUgb2JqZWN0IGZvciB0aGlzIG5vZGUsIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IHBhc3NlZAotCSAqIG9yIG51bGwgaWYgdGhlcmUgd2FzIG5vbmUgc2V0LgotCSAqCi0JICogQHNpbmNlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRVc2VyRGF0YShTdHJpbmcga2V5KSB7Ci0JCQotCQlpZiAoa2V5PT1udWxsKSByZXR1cm4gbnVsbDsKLQkJTWFwIHVzZXJEYXRhVGFibGUgPSBVc2VyRGF0YS5nZXRJbnN0YW5jZSgpLmdldFVzZXJEYXRhVGFibGUodGhpcyk7Ci0JCWlmICh1c2VyRGF0YVRhYmxlIT1udWxsKSB7Ci0JCQlVc2VyRGF0YUFuZEhhbmRsZXIgdXNlckRhdGFBbmRIYW5kbGVyID0gKFVzZXJEYXRhQW5kSGFuZGxlcikgdXNlckRhdGFUYWJsZS5nZXQoa2V5KTsKLQkJCWlmICh1c2VyRGF0YUFuZEhhbmRsZXIhPW51bGwpIHsKLQkJCQlyZXR1cm4gdXNlckRhdGFBbmRIYW5kbGVyLmdldERhdGEoKTsKLQkJCX0gCi0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB1c2VyIGRhdGEgYW5kIGhhbmRsZXIgZm9yIGEga2V5Ci0JICogCi0JICogQHBhcmFtIGtleSBUaGUga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0LgotCSAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBmb3IgdGhpcyBub2RlLCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBwYXNzZWQuCi0JICogTnVsbCBwYXNzZWQgcmVtb3ZlcyB0aGUgZXhpc3RpbmcgYXNzb2NpYXRpb24gdG8gdGhlIGtleS4KLQkgKiBAcGFyYW0gaGFuZGxlciBVc2VyRGF0YUhhbmRsZXIgZm9yIHRoZSB1c2VyZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXkKLQkgKiBAcmV0dXJuIE9iamVjdCBUaGUgcHJldmlvdXMgdXNlcmRhdGEgb2JqZWN0IGlmIHNldCwgbnVsbCBpZiBpdCB3YXMgbm9uZS4gIAotCSAqIAotCSAqIEBzaW5jZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3Qgc2V0VXNlckRhdGEoU3RyaW5nIGtleSwgT2JqZWN0IGRhdGEsIFVzZXJEYXRhSGFuZGxlciBoYW5kbGVyKSB7Ci0KLQkJVXNlckRhdGFBbmRIYW5kbGVyIHByZXZpb3VzRGF0YUFuZEhhbmRsZXI9bnVsbDsKLQkJCi0JCS8vcmV0dXJuIGltbWVkaWF0ZWx5IGZvciBudWxsIGtleXMKLQkJaWYgKGtleSA9PW51bGwpIHJldHVybiBudWxsOwotCQlNYXAgdXNlckRhdGFUYWJsZSA9IFVzZXJEYXRhLmdldEluc3RhbmNlKCkuZ2V0VXNlckRhdGFUYWJsZSh0aGlzKTsKLQkJLy9yZW1vdmUgYXNzb2NpYXRpb24gZm9yIHRoZSBrZXkgaWYgZGF0YSBpcyBudWxsCi0JCWlmIChkYXRhPT1udWxsKSB7Ci0JCQlpZiAodXNlckRhdGFUYWJsZT09bnVsbCkgcmV0dXJuIG51bGw7Ci0JCQkKLQkJCS8vc2VlIGlmIHRoZXJlIGlzIGEgcHJldmlvdXMgdmFsdWUgc2V0Ci0JCQlwcmV2aW91c0RhdGFBbmRIYW5kbGVyID0gKFVzZXJEYXRhQW5kSGFuZGxlcikgdXNlckRhdGFUYWJsZS5nZXQoa2V5KTsKLQkJCWlmIChwcmV2aW91c0RhdGFBbmRIYW5kbGVyIT1udWxsKSB7Ci0JCQkJdXNlckRhdGFUYWJsZS5yZW1vdmUoa2V5KTsKLQkJCQlyZXR1cm4gcHJldmlvdXNEYXRhQW5kSGFuZGxlci5nZXREYXRhKCk7Ci0JCQl9Ci0JCQkvL3RoZXJlIGlzIG5vIHByZXZpb3VzIHZhbHVlIGZvdW5kCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJLy9pZiBkYXRhIHBhc3NlZCBpcyBub3QgbnVsbAotCQkvL3RoZSBmaXJzdCBkYXRhIGluIHRoZSBoYXNodGFibGUKLQkJaWYgKHVzZXJEYXRhVGFibGU9PW51bGwpIHsKLQkJCXVzZXJEYXRhVGFibGU9bmV3IEhhc2h0YWJsZSgpOwotCQkJVXNlckRhdGFBbmRIYW5kbGVyIHVzZXJEYXRhQW5kSGFuZGxlcj1uZXcgVXNlckRhdGFBbmRIYW5kbGVyKGRhdGEsaGFuZGxlcik7Ci0JCQl1c2VyRGF0YVRhYmxlLnB1dChrZXksdXNlckRhdGFBbmRIYW5kbGVyKTsKLQkJCXJldHVybiBudWxsOwotCQkJLy90aGVyZSBpcyBhbHJlYWR5IGRhdGEgaW4gdGhlIGhhc2h0YWJsZQotCQl9IGVsc2UgewotCQkJVXNlckRhdGFBbmRIYW5kbGVyIHVzZXJEYXRhQW5kSGFuZGxlcj1uZXcgVXNlckRhdGFBbmRIYW5kbGVyKGRhdGEsaGFuZGxlcik7Ci0JCQlwcmV2aW91c0RhdGFBbmRIYW5kbGVyPShVc2VyRGF0YUFuZEhhbmRsZXIpIHVzZXJEYXRhVGFibGUucHV0KGtleSx1c2VyRGF0YUFuZEhhbmRsZXIpOwotCQkJCi0JCQkvL2lmIHdlIHJlcGxhY2UgYSB2YWx1ZQotCQkJaWYgKHByZXZpb3VzRGF0YUFuZEhhbmRsZXIhPW51bGwpCi0JCQkJcmV0dXJuIHByZXZpb3VzRGF0YUFuZEhhbmRsZXIuZ2V0RGF0YSgpOwotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIFVzZXJEYXRhSGFuZGxlcnMgb2YgdGhlIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoc2hvcnQgb3BlcmF0aW9uLCBOb2RlIGRlc3RpbmF0aW9uKSB7Ci0JCQotCQlpZiAob3BlcmF0aW9uIT1Vc2VyRGF0YUhhbmRsZXIuTk9ERV9BRE9QVEVEIAotCQkJCSYgb3BlcmF0aW9uIT1Vc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQKLQkJCQkmIG9wZXJhdGlvbiE9VXNlckRhdGFIYW5kbGVyLk5PREVfREVMRVRFRAotCQkJCSYgb3BlcmF0aW9uIT1Vc2VyRGF0YUhhbmRsZXIuTk9ERV9JTVBPUlRFRAotCQkJCSYgb3BlcmF0aW9uIT1Vc2VyRGF0YUhhbmRsZXIuTk9ERV9SRU5BTUVEKQotCQkJcmV0dXJuOyAKLQkJTWFwIHVzZXJEYXRhVGFibGUgPSBVc2VyRGF0YS5nZXRJbnN0YW5jZSgpLmdldFVzZXJEYXRhVGFibGUodGhpcyk7CQotCQlpZiAodXNlckRhdGFUYWJsZSE9bnVsbCkgewotCQkJSXRlcmF0b3IgZW50cmllcyA9dXNlckRhdGFUYWJsZS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZW50cmllcy5oYXNOZXh0KCkpIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBlbnRyaWVzLm5leHQoKTsKLQkJCQlTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKTsgLy9zaG91bGQgYWx3YXlzIGJlIGEgc3RyaW5nCi0JCQkJVXNlckRhdGFBbmRIYW5kbGVyIGRhdGFBbmRIYW5kbGVyID0gKFVzZXJEYXRhQW5kSGFuZGxlcikgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoZGF0YUFuZEhhbmRsZXIhPW51bGwpIHsKLQkJCQkJVXNlckRhdGFIYW5kbGVyIGRhdGFIYW5kbGVyPWRhdGFBbmRIYW5kbGVyLmdldEhhbmRsZXIoKTsKLQkJCQkJaWYgKGRhdGFIYW5kbGVyIT1udWxsKSB7Ci0JCQkJCQlkYXRhSGFuZGxlci5oYW5kbGUob3BlcmF0aW9uLCBrZXksIGRhdGFBbmRIYW5kbGVyLmdldERhdGEoKSwgdGhpcywgZGVzdGluYXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIENsYXNzIGZvciB1c2VyIGRhdGEgYW5kIFVzZXJEYXRhSGFuZGxlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVXNlckRhdGFBbmRIYW5kbGVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotCQkvKioKLQkJICogR2VuZXJhdGVkIFNlcmlhbCBJRAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDg2MDUyMTIzNzMxNTQ0NDg0MUw7Ci0JCS8qKgotCQkgKiBHZW5lcmF0ZWQgc2VyaWFsaXphdGlvbiB2ZXJzaW9uCi0JCSAqLwotCQkKLQkJcHJpdmF0ZSBPYmplY3QgZGF0YTsKLQkJcHJpdmF0ZSBVc2VyRGF0YUhhbmRsZXIgaGFuZGxlcjsKLQkJCi0JCXB1YmxpYyBVc2VyRGF0YUFuZEhhbmRsZXIoT2JqZWN0IGRhdGEsIFVzZXJEYXRhSGFuZGxlciBoYW5kbGVyKQotCQl7Ci0JCQl0aGlzLmRhdGE9ZGF0YTsKLQkJCXRoaXMuaGFuZGxlcj1oYW5kbGVyOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXREYXRhKCkgewotCQkJcmV0dXJuIGRhdGE7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXREYXRhKE9iamVjdCBkYXRhKSB7Ci0JCQl0aGlzLmRhdGEgPSBkYXRhOwotCQl9Ci0KLQkJcHVibGljIFVzZXJEYXRhSGFuZGxlciBnZXRIYW5kbGVyKCkgewotCQkJcmV0dXJuIGhhbmRsZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRIYW5kbGVyKFVzZXJEYXRhSGFuZGxlciBoYW5kbGVyKSB7Ci0JCQl0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlSXRlcmF0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVJdGVyYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhMjc4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVJdGVyYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOwotCi0vKioKLSAqIE5vZGVJdGVyYXRvckltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIE5vZGVJdGVyYXRvckltcGwgaW1wbGVtZW50cyBOb2RlSXRlcmF0b3IgewotCXByaXZhdGUgTm9kZUZpbHRlciBmaWx0ZXIgPSBudWxsOwotCXByaXZhdGUgTm9kZSBuZXh0Tm9kZSA9IG51bGw7Ci0KLQlwcml2YXRlIE5vZGUgcm9vdE5vZGUgPSBudWxsOwotCXByaXZhdGUgaW50IHdoYXRUb1Nob3cgPSBOb2RlRmlsdGVyLlNIT1dfQUxMOwotCi0JLyoqCi0JICogTm9kZUl0ZXJhdG9ySW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSByb290Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCU5vZGVJdGVyYXRvckltcGwoTm9kZSByb290Tm9kZSwgaW50IHdoYXRUb1Nob3csIE5vZGVGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMucm9vdE5vZGUgPSByb290Tm9kZTsKLQkJdGhpcy5uZXh0Tm9kZSA9IHJvb3ROb2RlOwotCQl0aGlzLndoYXRUb1Nob3cgPSB3aGF0VG9TaG93OwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gYWNjZXB0Tm9kZShOb2RlIG5vZGUpIHsKLQkJaWYgKHRoaXMud2hhdFRvU2hvdyAhPSBOb2RlRmlsdGVyLlNIT1dfQUxMKSB7Ci0JCQlpZiAobm9kZSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJc3dpdGNoICh0aGlzLndoYXRUb1Nob3cpIHsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19BVFRSSUJVVEUgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfVEVYVCA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfQ0RBVEFfU0VDVElPTiA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfRU5USVRZX1JFRkVSRU5DRSA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfRU5USVRZIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuRU5USVRZX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX1BST0NFU1NJTkdfSU5TVFJVQ1RJT04gOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0NPTU1FTlQgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5DT01NRU5UX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfRE9DVU1FTlRfVFlQRSA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfRE9DVU1FTlRfRlJBR01FTlQgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19OT1RBVElPTiA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLk5PVEFUSU9OX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRoaXMuZmlsdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiAodGhpcy5maWx0ZXIuYWNjZXB0Tm9kZShub2RlKSA9PSBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIERldGFjaGVzIHRoZSA8Y29kZT5Ob2RlSXRlcmF0b3I8L2NvZGU+IGZyb20gdGhlIHNldCB3aGljaCBpdCBpdGVyYXRlZAotCSAqIG92ZXIsIHJlbGVhc2luZyBhbnkgY29tcHV0YXRpb25hbCByZXNvdXJjZXMgYW5kIHBsYWNpbmcgdGhlIGl0ZXJhdG9yIGluCi0JICogdGhlIElOVkFMSUQgc3RhdGUuIEFmdGVyIDxjb2RlPmRldGFjaDwvY29kZT4gaGFzIGJlZW4gaW52b2tlZCwgY2FsbHMKLQkgKiB0byA8Y29kZT5uZXh0Tm9kZTwvY29kZT4gb3IgPGNvZGU+cHJldmlvdXNOb2RlPC9jb2RlPiB3aWxsIHJhaXNlCi0JICogdGhlIGV4Y2VwdGlvbiBJTlZBTElEX1NUQVRFX0VSUi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXRhY2goKSB7Ci0JCXRoaXMucm9vdE5vZGUgPSBudWxsOwotCQl0aGlzLm5leHROb2RlID0gbnVsbDsKLQkJdGhpcy5maWx0ZXIgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGlzIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjaGlsZHJlbiBvZiBlbnRpdHkKLQkgKiByZWZlcmVuY2Ugbm9kZXMgYXJlIHZpc2libGUgdG8gdGhlIGl0ZXJhdG9yLiBJZiBmYWxzZSwgdGhleSBhbmQgdGhlaXIKLQkgKiBkZXNjZW5kYW50cyB3aWxsIGJlIHJlamVjdGVkLiBOb3RlIHRoYXQgdGhpcyByZWplY3Rpb24gdGFrZXMgcHJlY2VkZW5jZQotCSAqIG92ZXIgPGNvZGU+d2hhdFRvU2hvdzwvY29kZT4gYW5kIHRoZSBmaWx0ZXIuIEFsc28gbm90ZSB0aGF0IHRoaXMgaXMKLQkgKiBjdXJyZW50bHkgdGhlIG9ubHkgc2l0dWF0aW9uIHdoZXJlIDxjb2RlPk5vZGVJdGVyYXRvcnM8L2NvZGU+IG1heQotCSAqIHJlamVjdCBhIGNvbXBsZXRlIHN1YnRyZWUgcmF0aGVyIHRoYW4gc2tpcHBpbmcgaW5kaXZpZHVhbCBub2Rlcy4gPGJyPgotCSAqIDxicj4KLQkgKiBUbyBwcm9kdWNlIGEgdmlldyBvZiB0aGUgZG9jdW1lbnQgdGhhdCBoYXMgZW50aXR5IHJlZmVyZW5jZXMgZXhwYW5kZWQKLQkgKiBhbmQgZG9lcyBub3QgZXhwb3NlIHRoZSBlbnRpdHkgcmVmZXJlbmNlIG5vZGUgaXRzZWxmLCB1c2UgdGhlCi0JICogPGNvZGU+d2hhdFRvU2hvdzwvY29kZT4gZmxhZ3MgdG8gaGlkZSB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGFuZAotCSAqIHNldCA8Y29kZT5leHBhbmRFbnRpdHlSZWZlcmVuY2VzPC9jb2RlPiB0byB0cnVlIHdoZW4gY3JlYXRpbmcgdGhlCi0JICogaXRlcmF0b3IuIFRvIHByb2R1Y2UgYSB2aWV3IG9mIHRoZSBkb2N1bWVudCB0aGF0IGhhcyBlbnRpdHkgcmVmZXJlbmNlCi0JICogbm9kZXMgYnV0IG5vIGVudGl0eSBleHBhbnNpb24sIHVzZSB0aGUgPGNvZGU+d2hhdFRvU2hvdzwvY29kZT4gZmxhZ3MKLQkgKiB0byBzaG93IHRoZSBlbnRpdHkgcmVmZXJlbmNlIG5vZGUgYW5kIHNldAotCSAqIDxjb2RlPmV4cGFuZEVudGl0eVJlZmVyZW5jZXM8L2NvZGU+IHRvIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoKSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSA8Y29kZT5Ob2RlRmlsdGVyPC9jb2RlPiB1c2VkIHRvIHNjcmVlbiBub2Rlcy4KLQkgKi8KLQlwdWJsaWMgTm9kZUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGZpbmFsIE5vZGUgZ2V0TmV4dE5vZGUoKSB7Ci0JCWlmICh0aGlzLm5leHROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZSBvbGROZXh0ID0gdGhpcy5uZXh0Tm9kZTsKLQkJTm9kZSBjaGlsZCA9IHRoaXMubmV4dE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJdGhpcy5uZXh0Tm9kZSA9IGNoaWxkOwotCQkJcmV0dXJuIG9sZE5leHQ7Ci0JCX0KLQkJZm9yIChOb2RlIG5vZGUgPSB0aGlzLm5leHROb2RlOyBub2RlICE9IG51bGwgJiYgbm9kZSAhPSB0aGlzLnJvb3ROb2RlOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCU5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQl0aGlzLm5leHROb2RlID0gbmV4dDsKLQkJCQlyZXR1cm4gb2xkTmV4dDsKLQkJCX0KLQkJfQotCQl0aGlzLm5leHROb2RlID0gbnVsbDsKLQkJcmV0dXJuIG9sZE5leHQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBOb2RlIGdldFByZXZpb3VzTm9kZSgpIHsKLQkJaWYgKHRoaXMubmV4dE5vZGUgPT0gdGhpcy5yb290Tm9kZSkKLQkJCXJldHVybiBudWxsOwotCQlOb2RlIHByZXYgPSBudWxsOwotCQlpZiAodGhpcy5uZXh0Tm9kZSA9PSBudWxsKSB7Ci0JCQlwcmV2ID0gdGhpcy5yb290Tm9kZTsgLy8gbmV2ZXIgbnVsbAotCQl9IGVsc2UgewotCQkJcHJldiA9IHRoaXMubmV4dE5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJdGhpcy5uZXh0Tm9kZSA9IHRoaXMubmV4dE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCXJldHVybiB0aGlzLm5leHROb2RlOwotCQkJfQotCQl9Ci0JCU5vZGUgbGFzdCA9IHByZXYuZ2V0TGFzdENoaWxkKCk7Ci0JCXdoaWxlIChsYXN0ICE9IG51bGwpIHsKLQkJCXByZXYgPSBsYXN0OwotCQkJbGFzdCA9IHByZXYuZ2V0TGFzdENoaWxkKCk7Ci0JCX0KLQkJdGhpcy5uZXh0Tm9kZSA9IHByZXY7Ci0JCXJldHVybiB0aGlzLm5leHROb2RlOwotCX0KLQotCS8qKgotCSAqIFRoZSByb290IG5vZGUgb2YgdGhlIDxjb2RlPk5vZGVJdGVyYXRvcjwvY29kZT4sIGFzIHNwZWNpZmllZCB3aGVuIGl0Ci0JICogd2FzIGNyZWF0ZWQuCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIHRoaXMucm9vdE5vZGU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgZGV0ZXJtaW5lcyB3aGljaCBub2RlIHR5cGVzIGFyZSBwcmVzZW50ZWQgdmlhIHRoZQotCSAqIGl0ZXJhdG9yLiBUaGUgYXZhaWxhYmxlIHNldCBvZiBjb25zdGFudHMgaXMgZGVmaW5lZCBpbiB0aGUKLQkgKiA8Y29kZT5Ob2RlRmlsdGVyPC9jb2RlPiBpbnRlcmZhY2UuIE5vZGVzIG5vdCBhY2NlcHRlZCBieQotCSAqIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IHdpbGwgYmUgc2tpcHBlZCwgYnV0IHRoZWlyIGNoaWxkcmVuIG1heSBzdGlsbAotCSAqIGJlIGNvbnNpZGVyZWQuIE5vdGUgdGhhdCB0aGlzIHNraXAgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBmaWx0ZXIsIGlmCi0JICogYW55LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0V2hhdFRvU2hvdygpIHsKLQkJcmV0dXJuIHRoaXMud2hhdFRvU2hvdzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXh0IG5vZGUgaW4gdGhlIHNldCBhbmQgYWR2YW5jZXMgdGhlIHBvc2l0aW9uIG9mIHRoZQotCSAqIGl0ZXJhdG9yIGluIHRoZSBzZXQuIEFmdGVyIGEgPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPiBpcyBjcmVhdGVkLAotCSAqIHRoZSBmaXJzdCBjYWxsIHRvIDxjb2RlPm5leHROb2RlKCk8L2NvZGU+IHJldHVybnMgdGhlIGZpcnN0IG5vZGUgaW4KLQkgKiB0aGUgc2V0LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5leHQgPGNvZGU+Tm9kZTwvY29kZT4gaW4gdGhlIHNldCBiZWluZyBpdGVyYXRlZCBvdmVyLCBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWVtYmVycyBpbiB0aGF0IHNldC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyCi0JICogICAgICAgICAgICAgICAgdGhlIDxjb2RlPmRldGFjaDwvY29kZT4gbWV0aG9kIHdhcyBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBOb2RlIG5leHROb2RlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWZvciAoTm9kZSBub2RlID0gZ2V0TmV4dE5vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gZ2V0TmV4dE5vZGUoKSkgewotCQkJaWYgKGFjY2VwdE5vZGUobm9kZSkpCi0JCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJldmlvdXMgbm9kZSBpbiB0aGUgc2V0IGFuZCBtb3ZlcyB0aGUgcG9zaXRpb24gb2YgdGhlCi0JICogPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPiBiYWNrd2FyZHMgaW4gdGhlIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwcmV2aW91cyA8Y29kZT5Ob2RlPC9jb2RlPiBpbiB0aGUgc2V0IGJlaW5nIGl0ZXJhdGVkCi0JICogICAgICAgICBvdmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gbW9yZSBtZW1iZXJzIGluCi0JICogICAgICAgICB0aGF0IHNldC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyCi0JICogICAgICAgICAgICAgICAgdGhlIDxjb2RlPmRldGFjaDwvY29kZT4gbWV0aG9kIHdhcyBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBOb2RlIHByZXZpb3VzTm9kZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlmb3IgKE5vZGUgbm9kZSA9IGdldFByZXZpb3VzTm9kZSgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBnZXRQcmV2aW91c05vZGUoKSkgewotCQkJaWYgKGFjY2VwdE5vZGUobm9kZSkpCi0JCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlTGlzdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjBmMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEFuIGFycmF5LWJhY2tlZCBOb2RlTGlzdCwgdXNlZCB0byBrZWVwIHRoZSBhcnJheSBzaXplIGRvd24KLSAqLwotcHVibGljIGNsYXNzIE5vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIE5vZGVMaXN0IHsKLQotCXByaXZhdGUgT2JqZWN0IGZMb2NrT2JqZWN0ID0gbmV3IGJ5dGVbMF07Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IGdyb3d0aENvbnN0YW50ID0gMjsKLQlwcml2YXRlIE5vZGVbXSBmTm9kZXMgPSBudWxsOwotCXByaXZhdGUgaW50IGZOb2RlQ291bnQgPSAwOwotCi0JLyoqCi0JICogTm9kZUxpc3RJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIE5vZGVMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZUxpc3RJbXBsKE5vZGVMaXN0SW1wbCBsaXN0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZOb2RlQ291bnQgPSBsaXN0LmZOb2RlQ291bnQ7Ci0JCWZOb2RlcyA9IGxpc3QuZk5vZGVzOwotCX0KLQotCS8qKgotCSAqIGFwcGVuZE5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBhcHBlbmROb2RlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXN5bmNocm9uaXplZCAoZkxvY2tPYmplY3QpIHsKLQkJCWVuc3VyZUNhcGFjaXR5KGZOb2RlQ291bnQgKyAxKTsKLQkJCWZOb2Rlc1tmTm9kZUNvdW50KytdID0gbm9kZTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBHcm93IHRoZSBub2RlIGFycmF5IHRvIGF0IGxlYXN0IHRoZSBnaXZlbiBzaXplIHdoaWxlIGtlZXBpbmcgdGhlCi0JICogY29udGVudHMgdGhlIHNhbWUKLQkgKiAKLQkgKiBAcGFyYW0gbmVlZGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZUNhcGFjaXR5KGludCBuZWVkZWQpIHsKLQkJaWYgKGZOb2RlcyA9PSBudWxsKSB7Ci0JCQkvLyBmaXJzdCB0aW1lCi0JCQlmTm9kZXMgPSBuZXcgTm9kZVtuZWVkZWRdOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBvbGRMZW5ndGggPSBmTm9kZXMubGVuZ3RoOwotCQlpZiAob2xkTGVuZ3RoIDwgbmVlZGVkKSB7Ci0JCQlOb2RlW10gb2xkTm9kZXMgPSBmTm9kZXM7Ci0JCQlOb2RlW10gbmV3Tm9kZXMgPSBuZXcgTm9kZVtuZWVkZWQgKyBncm93dGhDb25zdGFudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9sZE5vZGVzLCAwLCBuZXdOb2RlcywgMCwgZk5vZGVDb3VudCk7Ci0JCQlmTm9kZXMgPSBuZXdOb2RlczsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy53M2MuZG9tLk5vZGVMaXN0I2dldExlbmd0aCgpCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTm9kZUNvdW50OwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgTm9kZVtdIGdldE5vZGVzKCkgewotCQlyZXR1cm4gZk5vZGVzOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBOb2RlIGluc2VydE5vZGUoTm9kZSBub2RlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlzeW5jaHJvbml6ZWQgKGZMb2NrT2JqZWN0KSB7Ci0JCQlpZiAoZk5vZGVzID09IG51bGwpIHsKLQkJCQkvLyBmaXJzdCB0aW1lLCBpZ25vcmUgaW5kZXgKLQkJCQlmTm9kZXMgPSBuZXcgTm9kZVsxXTsKLQkJCQlmTm9kZXNbZk5vZGVDb3VudCsrXSA9IG5vZGU7Ci0JCQkJcmV0dXJuIG5vZGU7Ci0JCQl9Ci0KLQkJCS8vIGdyYWNlZnVsbHkgaGFuZGxlIG91dCBvZiBib3VuZHMKLQkJCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBmTm9kZUNvdW50ICsgMSkKLQkJCQlyZXR1cm4gYXBwZW5kTm9kZShub2RlKTsKLQotCQkJLyoKLQkJCSAqIEdyb3cgYSBuZXcgTm9kZSBhcnJheSwgY29weWluZyB0aGUgb2xkIGNvbnRlbnRzIGFyb3VuZCB0aGUgbmV3Ci0JCQkgKiBOb2RlCi0JCQkgKi8KLQkJCU5vZGVbXSBuZXdOb2RlcyA9IG5ldyBOb2RlW2ZOb2RlQ291bnQgKyBncm93dGhDb25zdGFudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGZOb2RlcywgMCwgbmV3Tm9kZXMsIDAsIGluZGV4KTsKLQkJCW5ld05vZGVzW2luZGV4XSA9IG5vZGU7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGZOb2RlcywgaW5kZXgsIG5ld05vZGVzLCBpbmRleCArIDEsIGZOb2RlQ291bnQgLSBpbmRleCk7Ci0JCQlmTm9kZXMgPSBuZXdOb2RlczsKLQkJCWZOb2RlQ291bnQrKzsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcudzNjLmRvbS5Ob2RlTGlzdCNpdGVtKGludCkKLQkgKi8KLQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGZOb2RlQ291bnQpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQkJcmV0dXJuIGZOb2Rlc1tpbmRleF07Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXByb3RlY3RlZCBOb2RlIHJlbW92ZU5vZGUoaW50IGluZGV4KSB7Ci0JCWlmICh0aGlzLmZOb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIG5vIG5vZGUKLQotCQlzeW5jaHJvbml6ZWQgKGZMb2NrT2JqZWN0KSB7Ci0JCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGZOb2RlQ291bnQpCi0JCQkJcmV0dXJuIG51bGw7IC8vIGludmFsaWQgcGFyYW1ldGVyCi0KLQkJCU5vZGUgcmVtb3ZlZCA9IGZOb2Rlc1tpbmRleF07Ci0JCQlOb2RlW10gbmV3Tm9kZXMgPSBuZXcgTm9kZVtmTm9kZUNvdW50IC0gMV07Ci0JCQkvLyBjb3B5IGFyb3VuZCBub2RlIGJlaW5nIHJlbW92ZWQKLQkJCVN5c3RlbS5hcnJheWNvcHkoZk5vZGVzLCAwLCBuZXdOb2RlcywgMCwgaW5kZXgpOwotCQkJU3lzdGVtLmFycmF5Y29weShmTm9kZXMsIGluZGV4ICsgMSwgbmV3Tm9kZXMsIGluZGV4LCBmTm9kZUNvdW50IC0gaW5kZXggLSAxKTsKLQkJCWZOb2RlcyA9IG5ld05vZGVzOwotCQkJZk5vZGVDb3VudC0tOwotCQkJcmV0dXJuIHJlbW92ZWQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vdGF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob3RhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg2ZWVhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vdGF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTY5OTkgLSBJbmVmZmljaWVudCB1c2Ugb2YgbmV3IFN0cmluZygpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vdGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotLyoqCi0gKiBOb3RhdGlvbkltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIE5vdGF0aW9uSW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgTm90YXRpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLQotCS8qKgotCSAqIE5vdGF0aW9uSW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBOb3RhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm90YXRpb25JbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIE5vdGF0aW9uSW1wbAotCSAqLwotCXByb3RlY3RlZCBOb3RhdGlvbkltcGwoTm90YXRpb25JbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5uYW1lID0gdGhhdC5uYW1lOwotCQkJdGhpcy5wdWJsaWNJZCA9IHRoYXQucHVibGljSWQ7Ci0JCQl0aGlzLnN5c3RlbUlkID0gdGhhdC5zeXN0ZW1JZDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJTm90YXRpb25JbXBsIGNsb25lZCA9IG5ldyBOb3RhdGlvbkltcGwodGhpcyk7Ci0JCW5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVELCBjbG9uZWQpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIE5PVEFUSU9OX05PREU7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGljSWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3lzdGVtSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3lzdGVtSWQ7Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRQdWJsaWNJZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSWQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgcHVibGljSWQpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQkJdGhpcy5wdWJsaWNJZCA9IHB1YmxpY0lkOwotCX0KLQotCS8qKgotCSAqIHNldFN5c3RlbUlkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZCkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCQl0aGlzLnN5c3RlbUlkID0gc3lzdGVtSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ0ZWI1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKiAgICAgQmFsYXpzIEJhbmZhaTogQnVnIDE1NDczNyBnZXRVc2VyRGF0YS9zZXRVc2VyRGF0YSBzdXBwb3J0IGZvciBOb2RlCi0gKiAgICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDczNwotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjk2OTk5IC0gSW5lZmZpY2llbnQgdXNlIG9mIG5ldyBTdHJpbmcoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gewotCXByaXZhdGUgU3RyaW5nIGRhdGEgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0ID0gbnVsbDsKLQotCS8qKgotCSAqIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy50YXJnZXQgPSB0aGF0LnRhcmdldDsKLQkJCXRoaXMuZGF0YSA9IHRoYXQuZ2V0RGF0YSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIGNsb25lZCA9IG5ldyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKHRoaXMpOwotCQlub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwgY2xvbmVkKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHsKLQkJaWYgKHRoaXMuZGF0YSAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMuZGF0YTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0KLQkJSVRleHRSZWdpb24gdGFyZ2V0UmVnaW9uID0gbnVsbDsKLQkJSVRleHRSZWdpb24gZGF0YVJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIGNsb3NlUmVnaW9uID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTikKLQkJCQljb250aW51ZTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFKSB7Ci0JCQkJY2xvc2VSZWdpb24gPSByZWdpb247Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAodGFyZ2V0UmVnaW9uID09IG51bGwpCi0JCQkJCXRhcmdldFJlZ2lvbiA9IHJlZ2lvbjsKLQkJCQllbHNlIGlmIChkYXRhUmVnaW9uID09IG51bGwpCi0JCQkJCWRhdGFSZWdpb24gPSByZWdpb247Ci0JCQl9Ci0JCX0KLQkJaWYgKGRhdGFSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCWludCBvZmZzZXQgPSBkYXRhUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWludCBlbmQgPSBmbGF0Tm9kZS5nZXRMZW5ndGgoKTsKLQkJaWYgKGNsb3NlUmVnaW9uICE9IG51bGwpCi0JCQllbmQgPSBjbG9zZVJlZ2lvbi5nZXRTdGFydCgpOwotCQlTdHJpbmcgc291cmNlID0gZmxhdE5vZGUuZ2V0VGV4dCgpOwotCQlyZXR1cm4gc291cmNlLnN1YnN0cmluZyhvZmZzZXQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFRhcmdldCgpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKCkgewotCQlyZXR1cm4gZ2V0RGF0YSgpOwotCX0KLQotCS8qKgotCSAqIGdldFRhcmdldCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldCgpIHsKLQkJaWYgKHRoaXMudGFyZ2V0ID09IG51bGwpCi0JCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQlyZXR1cm4gdGhpcy50YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJcmV0dXJuIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpIHsKLQkJdGhpcy5kYXRhID0gZ2V0RGF0YSgpOwotCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JfQotCi0JLyoqCi0JICogc2V0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIGRhdGEpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCi0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0KLQkJbm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogc2V0Tm9kZVZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlVmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoU3RyaW5nIG5vZGVWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXNldERhdGEobm9kZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5kYXRhID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBzZXRUYXJnZXQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFRhcmdldChTdHJpbmcgdGFyZ2V0KSB7Ci0JCXRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIHRvU3RyaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0VGFyZ2V0KCkpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0RGF0YSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SYW5nZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmFuZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MDMzNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SYW5nZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20ucmFuZ2VzLlJhbmdlOwotaW1wb3J0IG9yZy53M2MuZG9tLnJhbmdlcy5SYW5nZUV4Y2VwdGlvbjsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFJhbmdlSW1wbCBpbXBsZW1lbnRzIFJhbmdlIHsKLQlwcml2YXRlIE5vZGUgZW5kQ29udGFpbmVyID0gbnVsbDsKLQlwcml2YXRlIGludCBlbmRPZmZzZXQgPSAwOwotCi0JcHJpdmF0ZSBOb2RlIHN0YXJ0Q29udGFpbmVyID0gbnVsbDsKLQlwcml2YXRlIGludCBzdGFydE9mZnNldCA9IDA7Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgUmFuZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBSYW5nZUltcGwoUmFuZ2VJbXBsIHRoYXQpIHsKLQkJc3VwZXIoKTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0YXJ0Q29udGFpbmVyID0gdGhhdC5zdGFydENvbnRhaW5lcjsKLQkJCXRoaXMuc3RhcnRPZmZzZXQgPSB0aGF0LnN0YXJ0T2Zmc2V0OwotCQkJdGhpcy5lbmRDb250YWluZXIgPSB0aGF0LmVuZENvbnRhaW5lcjsKLQkJCXRoaXMuZW5kT2Zmc2V0ID0gdGhhdC5lbmRPZmZzZXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEdXBsaWNhdGVzIHRoZSBjb250ZW50cyBvZiBhIFJhbmdlCi0JICogCi0JICogQHJldHVybiBBIERvY3VtZW50RnJhZ21lbnQgdGhhdCBjb250YWlucyBjb250ZW50IGVxdWl2YWxlbnQgdG8gdGhpcwotCSAqICAgICAgICAgUmFuZ2UuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBISUVSQVJDSFlfUkVRVUVTVF9FUlI6IFJhaXNlZCBpZiBhIERvY3VtZW50VHlwZSBub2RlCi0JICogICAgICAgICAgICAgICAgd291bGQgYmUgZXh0cmFjdGVkIGludG8gdGhlIG5ldyBEb2N1bWVudEZyYWdtZW50LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIERvY3VtZW50RnJhZ21lbnQgY2xvbmVDb250ZW50cygpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFByb2R1Y2VzIGEgbmV3IFJhbmdlIHdob3NlIGJvdW5kYXJ5LXBvaW50cyBhcmUgZXF1YWwgdG8gdGhlCi0JICogYm91bmRhcnktcG9pbnRzIG9mIHRoZSBSYW5nZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBkdXBsaWNhdGVkIFJhbmdlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIFJhbmdlIGNsb25lUmFuZ2UoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBSYW5nZUltcGwodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQ29sbGFwc2UgYSBSYW5nZSBvbnRvIG9uZSBvZiBpdHMgYm91bmRhcnktcG9pbnRzCi0JICogCi0JICogQHBhcmFtIHRvU3RhcnRJZgotCSAqICAgICAgICAgICAgVFJVRSwgY29sbGFwc2VzIHRoZSBSYW5nZSBvbnRvIGl0cyBzdGFydDsgaWYgRkFMU0UsCi0JICogICAgICAgICAgICBjb2xsYXBzZXMgaXQgb250byBpdHMgZW5kLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgY29sbGFwc2UoYm9vbGVhbiB0b1N0YXJ0KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHRvU3RhcnQpIHsKLQkJCXRoaXMuZW5kQ29udGFpbmVyID0gdGhpcy5zdGFydENvbnRhaW5lcjsKLQkJCXRoaXMuZW5kT2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldDsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc3RhcnRDb250YWluZXIgPSB0aGlzLmVuZENvbnRhaW5lcjsKLQkJCXRoaXMuc3RhcnRPZmZzZXQgPSB0aGlzLmVuZE9mZnNldDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXBhcmUgdGhlIGJvdW5kYXJ5LXBvaW50cyBvZiB0d28gUmFuZ2VzIGluIGEgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIGhvd0EKLQkgKiAgICAgICAgICAgIGNvZGUgcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIGNvbXBhcmlzb24sIGFzIGRlZmluZWQgYWJvdmUuCi0JICogQHBhcmFtIHNvdXJjZVJhbmdlVGhlCi0JICogICAgICAgICAgICA8Y29kZT5SYW5nZTwvY29kZT4gb24gd2hpY2ggdGhpcyBjdXJyZW50Ci0JICogICAgICAgICAgICA8Y29kZT5SYW5nZTwvY29kZT4gaXMgY29tcGFyZWQgdG8uCi0JICogQHJldHVybiAtMSwgMCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nCi0JICogICAgICAgICBib3VuZGFyeS1wb2ludCBvZiB0aGUgUmFuZ2UgaXMgcmVzcGVjdGl2ZWx5IGJlZm9yZSwgZXF1YWwgdG8sCi0JICogICAgICAgICBvciBhZnRlciB0aGUgY29ycmVzcG9uZGluZyBib3VuZGFyeS1wb2ludCBvZgotCSAqICAgICAgICAgPGNvZGU+c291cmNlUmFuZ2U8L2NvZGU+LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgdGhlIHR3byBSYW5nZXMgYXJlIG5vdCBpbgotCSAqICAgICAgICAgICAgICAgIHRoZSBzYW1lIERvY3VtZW50IG9yIERvY3VtZW50RnJhZ21lbnQuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHNob3J0IGhvdywgUmFuZ2Ugc291cmNlUmFuZ2UpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoc291cmNlUmFuZ2UgPT0gbnVsbCkKLQkJCXJldHVybiAoc2hvcnQpIDA7IC8vIGVycm9yCi0KLQkJTm9kZSBjb250YWluZXIxID0gbnVsbDsKLQkJaW50IG9mZnNldDEgPSAwOwotCQlOb2RlIGNvbnRhaW5lcjIgPSBudWxsOwotCQlpbnQgb2Zmc2V0MiA9IDA7Ci0KLQkJc3dpdGNoIChob3cpIHsKLQkJCWNhc2UgU1RBUlRfVE9fU1RBUlQgOgotCQkJCWNvbnRhaW5lcjEgPSB0aGlzLnN0YXJ0Q29udGFpbmVyOwotCQkJCW9mZnNldDEgPSB0aGlzLnN0YXJ0T2Zmc2V0OwotCQkJCWNvbnRhaW5lcjIgPSBzb3VyY2VSYW5nZS5nZXRTdGFydENvbnRhaW5lcigpOwotCQkJCW9mZnNldDIgPSBzb3VyY2VSYW5nZS5nZXRTdGFydE9mZnNldCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFSVF9UT19FTkQgOgotCQkJCWNvbnRhaW5lcjEgPSB0aGlzLnN0YXJ0Q29udGFpbmVyOwotCQkJCW9mZnNldDEgPSB0aGlzLnN0YXJ0T2Zmc2V0OwotCQkJCWNvbnRhaW5lcjIgPSBzb3VyY2VSYW5nZS5nZXRFbmRDb250YWluZXIoKTsKLQkJCQlvZmZzZXQyID0gc291cmNlUmFuZ2UuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVORF9UT19FTkQgOgotCQkJCWNvbnRhaW5lcjEgPSB0aGlzLmVuZENvbnRhaW5lcjsKLQkJCQlvZmZzZXQxID0gdGhpcy5lbmRPZmZzZXQ7Ci0JCQkJY29udGFpbmVyMiA9IHNvdXJjZVJhbmdlLmdldEVuZENvbnRhaW5lcigpOwotCQkJCW9mZnNldDIgPSBzb3VyY2VSYW5nZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRU5EX1RPX1NUQVJUIDoKLQkJCQljb250YWluZXIxID0gdGhpcy5lbmRDb250YWluZXI7Ci0JCQkJb2Zmc2V0MSA9IHRoaXMuZW5kT2Zmc2V0OwotCQkJCWNvbnRhaW5lcjIgPSBzb3VyY2VSYW5nZS5nZXRTdGFydENvbnRhaW5lcigpOwotCQkJCW9mZnNldDIgPSBzb3VyY2VSYW5nZS5nZXRTdGFydE9mZnNldCgpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIChzaG9ydCkgMDsgLy8gZXJyb3IKLQkJfQotCi0JCXJldHVybiBjb21wYXJlUG9pbnRzKGNvbnRhaW5lcjEsIG9mZnNldDEsIGNvbnRhaW5lcjIsIG9mZnNldDIpOwotCX0KLQotCS8qCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IGNvbXBhcmVQb2ludHMoTm9kZSBjb250YWluZXIxLCBpbnQgb2Zmc2V0MSwgTm9kZSBjb250YWluZXIyLCBpbnQgb2Zmc2V0MikgewotCQlpZiAoY29udGFpbmVyMSA9PSBudWxsIHx8IGNvbnRhaW5lcjIgPT0gbnVsbCkKLQkJCXJldHVybiAoc2hvcnQpIDA7IC8vIGVycm9yCi0KLQkJaWYgKGNvbnRhaW5lcjEgPT0gY29udGFpbmVyMikgewotCQkJaWYgKG9mZnNldDEgPiBvZmZzZXQyKQotCQkJCXJldHVybiAoc2hvcnQpIDE7Ci0JCQlpZiAob2Zmc2V0MSA8IG9mZnNldDIpCi0JCQkJcmV0dXJuIChzaG9ydCkgLTE7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8vIGdldCBub2RlIG9mZnNldHMKLQkJSURPTU5vZGUgbm9kZTEgPSBudWxsOwotCQlpZiAoY29udGFpbmVyMS5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCU5vZGUgY2hpbGQgPSBjb250YWluZXIxLmdldEZpcnN0Q2hpbGQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0MTsgaSsrKSB7Ci0JCQkJTm9kZSBuZXh0ID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV4dCA9PSBudWxsKQotCQkJCQlicmVhazsKLQkJCQljaGlsZCA9IG5leHQ7Ci0JCQl9Ci0JCQlub2RlMSA9IChJRE9NTm9kZSkgY2hpbGQ7Ci0JCQlvZmZzZXQxID0gMDsKLQkJfSBlbHNlIHsKLQkJCW5vZGUxID0gKElET01Ob2RlKSBjb250YWluZXIxOwotCQl9Ci0JCWludCBub2RlT2Zmc2V0MSA9IG5vZGUxLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCUlET01Ob2RlIG5vZGUyID0gbnVsbDsKLQkJaWYgKGNvbnRhaW5lcjIuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQlOb2RlIGNoaWxkID0gY29udGFpbmVyMi5nZXRGaXJzdENoaWxkKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldDI7IGkrKykgewotCQkJCU5vZGUgbmV4dCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKG5leHQgPT0gbnVsbCkKLQkJCQkJYnJlYWs7Ci0JCQkJY2hpbGQgPSBuZXh0OwotCQkJfQotCQkJbm9kZTIgPSAoSURPTU5vZGUpIGNoaWxkOwotCQkJb2Zmc2V0MiA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlub2RlMiA9IChJRE9NTm9kZSkgY29udGFpbmVyMTsKLQkJfQotCQlpbnQgbm9kZU9mZnNldDIgPSBub2RlMi5nZXRTdGFydE9mZnNldCgpOwotCi0JCWlmIChub2RlT2Zmc2V0MSA+IG5vZGVPZmZzZXQyKQotCQkJcmV0dXJuIChzaG9ydCkgMTsKLQkJaWYgKG5vZGVPZmZzZXQxIDwgbm9kZU9mZnNldDIpCi0JCQlyZXR1cm4gKHNob3J0KSAtMTsKLQkJaWYgKG9mZnNldDEgPiBvZmZzZXQyKQotCQkJcmV0dXJuIChzaG9ydCkgMTsKLQkJaWYgKG9mZnNldDEgPCBvZmZzZXQyKQotCQkJcmV0dXJuIChzaG9ydCkgLTE7Ci0JCXJldHVybiAoc2hvcnQpIDA7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgY29udGVudHMgb2YgYSBSYW5nZSBmcm9tIHRoZSBjb250YWluaW5nIGRvY3VtZW50IG9yCi0JICogZG9jdW1lbnQgZnJhZ21lbnQgd2l0aG91dCByZXR1cm5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIHJlbW92ZWQgY29udGVudC4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIGFueSBwb3J0aW9uIG9mCi0JICogICAgICAgICAgICAgICAgdGhlIGNvbnRlbnQgb2YgdGhlIFJhbmdlIGlzIHJlYWQtb25seSBvciBhbnkgb2YgdGhlCi0JICogICAgICAgICAgICAgICAgbm9kZXMgdGhhdCBjb250YWluIGFueSBvZiB0aGUgY29udGVudCBvZiB0aGUgUmFuZ2UgYXJlCi0JICogICAgICAgICAgICAgICAgcmVhZC1vbmx5LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlQ29udGVudHMoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBSYW5nZSBpcyBubyBsb25nZXIgaW4gdXNlIGFuZCB0aGF0IHRoZQotCSAqIGltcGxlbWVudGF0aW9uIG1heSByZWxpbnF1aXNoIGFueSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmFuZ2UuCi0JICogU3Vic2VxdWVudCBjYWxscyB0byBhbnkgbWV0aG9kcyBvciBhdHRyaWJ1dGUgZ2V0dGVycyBvbiB0aGlzIFJhbmdlIHdpbGwKLQkgKiByZXN1bHQgaW4gYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IGJlaW5nIHRocm93biB3aXRoIGFuIGVycm9yIGNvZGUKLQkgKiBvZiA8Y29kZT5JTlZBTElEX1NUQVRFX0VSUjwvY29kZT4uCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXRhY2goKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhpcy5zdGFydENvbnRhaW5lciA9IG51bGw7Ci0JCXRoaXMuc3RhcnRPZmZzZXQgPSAwOwotCQl0aGlzLmVuZENvbnRhaW5lciA9IG51bGw7Ci0JCXRoaXMuZW5kT2Zmc2V0ID0gMDsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlcyB0aGUgY29udGVudHMgb2YgYSBSYW5nZSBmcm9tIHRoZSBjb250YWluaW5nIGRvY3VtZW50IG9yIGRvY3VtZW50Ci0JICogZnJhZ21lbnQgdG8gYSBuZXcgRG9jdW1lbnRGcmFnbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgRG9jdW1lbnRGcmFnbWVudCBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgY29udGVudHMuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiBhbnkgcG9ydGlvbiBvZgotCSAqICAgICAgICAgICAgICAgIHRoZSBjb250ZW50IG9mIHRoZSBSYW5nZSBpcyByZWFkLW9ubHkgb3IgYW55IG9mIHRoZQotCSAqICAgICAgICAgICAgICAgIG5vZGVzIHdoaWNoIGNvbnRhaW4gYW55IG9mIHRoZSBjb250ZW50IG9mIHRoZSBSYW5nZSBhcmUKLQkgKiAgICAgICAgICAgICAgICByZWFkLW9ubHkuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBISUVSQVJDSFlfUkVRVUVTVF9FUlI6IFJhaXNlZCBpZiBhIERvY3VtZW50VHlwZSBub2RlCi0JICogICAgICAgICAgICAgICAgd291bGQgYmUgZXh0cmFjdGVkIGludG8gdGhlIG5ldyBEb2N1bWVudEZyYWdtZW50LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIERvY3VtZW50RnJhZ21lbnQgZXh0cmFjdENvbnRlbnRzKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVFJVRSBpZiB0aGUgUmFuZ2UgaXMgY29sbGFwc2VkCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRDb2xsYXBzZWQoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuc3RhcnRDb250YWluZXIgPT0gdGhpcy5lbmRDb250YWluZXIgJiYgdGhpcy5zdGFydE9mZnNldCA9PSB0aGlzLmVuZE9mZnNldCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZXBlc3QgY29tbW9uIGFuY2VzdG9yIGNvbnRhaW5lciBvZiB0aGUgUmFuZ2UncyB0d28KLQkgKiBib3VuZGFyeS1wb2ludHMuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRDb21tb25BbmNlc3RvckNvbnRhaW5lcigpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAodGhpcy5zdGFydENvbnRhaW5lciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKE5vZGVJbXBsKSB0aGlzLnN0YXJ0Q29udGFpbmVyKS5nZXRDb21tb25BbmNlc3Rvcih0aGlzLmVuZENvbnRhaW5lcik7Ci0JfQotCi0JLyoqCi0JICogTm9kZSB3aXRoaW4gd2hpY2ggdGhlIFJhbmdlIGVuZHMKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBOb2RlIGdldEVuZENvbnRhaW5lcigpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5lbmRDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogT2Zmc2V0IHdpdGhpbiB0aGUgZW5kaW5nIG5vZGUgb2YgdGhlIFJhbmdlLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZW5kT2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIE5vZGUgd2l0aGluIHdoaWNoIHRoZSBSYW5nZSBiZWdpbnMKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBOb2RlIGdldFN0YXJ0Q29udGFpbmVyKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLnN0YXJ0Q29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIE9mZnNldCB3aXRoaW4gdGhlIHN0YXJ0aW5nIG5vZGUgb2YgdGhlIFJhbmdlLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5zdGFydE9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnRzIGEgbm9kZSBpbnRvIHRoZSBEb2N1bWVudCBvciBEb2N1bWVudEZyYWdtZW50IGF0IHRoZSBzdGFydCBvZgotCSAqIHRoZSBSYW5nZS4gSWYgdGhlIGNvbnRhaW5lciBpcyBhIFRleHQgbm9kZSwgdGhpcyB3aWxsIGJlIHNwbGl0IGF0IHRoZQotCSAqIHN0YXJ0IG9mIHRoZSBSYW5nZSAoYXMgaWYgdGhlIFRleHQgbm9kZSdzIHNwbGl0VGV4dCBtZXRob2Qgd2FzCi0JICogcGVyZm9ybWVkIGF0IHRoZSBpbnNlcnRpb24gcG9pbnQpIGFuZCB0aGUgaW5zZXJ0aW9uIHdpbGwgb2NjdXIgYmV0d2VlbgotCSAqIHRoZSB0d28gcmVzdWx0aW5nIFRleHQgbm9kZXMuIEFkamFjZW50IFRleHQgbm9kZXMgd2lsbCBub3QgYmUKLQkgKiBhdXRvbWF0aWNhbGx5IG1lcmdlZC4gSWYgdGhlIG5vZGUgdG8gYmUgaW5zZXJ0ZWQgaXMgYSBEb2N1bWVudEZyYWdtZW50Ci0JICogbm9kZSwgdGhlIGNoaWxkcmVuIHdpbGwgYmUgaW5zZXJ0ZWQgcmF0aGVyIHRoYW4gdGhlIERvY3VtZW50RnJhZ21lbnQKLQkgKiBub2RlIGl0c2VsZi4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3Tm9kZVRoZQotCSAqICAgICAgICAgICAgbm9kZSB0byBpbnNlcnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZQotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgYW4gYW5jZXN0b3IKLQkgKiAgICAgICAgICAgICAgICBjb250YWluZXIgb2YgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZSBpcyByZWFkLW9ubHkuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBXUk9OR19ET0NVTUVOVF9FUlI6IFJhaXNlZCBpZiA8Y29kZT5uZXdOb2RlPC9jb2RlPiBhbmQKLQkgKiAgICAgICAgICAgICAgICB0aGUgY29udGFpbmVyIG9mIHRoZSBzdGFydCBvZiB0aGUgUmFuZ2Ugd2VyZSBub3QgY3JlYXRlZAotCSAqICAgICAgICAgICAgICAgIGZyb20gdGhlIHNhbWUgZG9jdW1lbnQuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBISUVSQVJDSFlfUkVRVUVTVF9FUlI6IFJhaXNlZCBpZiB0aGUgY29udGFpbmVyIG9mIHRoZQotCSAqICAgICAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBSYW5nZSBpcyBvZiBhIHR5cGUgdGhhdCBkb2VzIG5vdCBhbGxvdwotCSAqICAgICAgICAgICAgICAgIGNoaWxkcmVuIG9mIHRoZSB0eXBlIG9mIDxjb2RlPm5ld05vZGU8L2NvZGU+IG9yIGlmCi0JICogICAgICAgICAgICAgICAgPGNvZGU+bmV3Tm9kZTwvY29kZT4gaXMgYW4gYW5jZXN0b3Igb2YgdGhlIGNvbnRhaW5lci4KLQkgKiAgICAgICAgICAgICAgICA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIDxjb2RlPm5ld05vZGU8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgaXMgYW4gQXR0ciwgRW50aXR5LCBOb3RhdGlvbiwgb3IgRG9jdW1lbnQgbm9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnROb2RlKE5vZGUgbmV3Tm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JLyoqCi0JICogU2VsZWN0IGEgbm9kZSBhbmQgaXRzIGNvbnRlbnRzCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVUaGUKLQkgKiAgICAgICAgICAgIG5vZGUgdG8gc2VsZWN0LgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiBhbiBhbmNlc3RvciBvZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGFuIEVudGl0eSwgTm90YXRpb24gb3IKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudFR5cGUgbm9kZSBvciBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnQsIERvY3VtZW50RnJhZ21lbnQsIEF0dHIsIEVudGl0eSwgb3IgTm90YXRpb24KLQkgKiAgICAgICAgICAgICAgICBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0Tm9kZShOb2RlIHJlZk5vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJlZk5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSByZWZOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAoKE5vZGVJbXBsKSByZWZOb2RlKS5nZXRJbmRleCgpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlzZXRTdGFydChwYXJlbnQsIGluZGV4KTsKLQkJc2V0RW5kKHBhcmVudCwgaW5kZXggKyAxKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgdGhlIGNvbnRlbnRzIHdpdGhpbiBhIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZU5vZGUKLQkgKiAgICAgICAgICAgIHRvIHNlbGVjdCBmcm9tCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgb3IgYW4gYW5jZXN0b3Igb2YgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYW4gRW50aXR5LAotCSAqICAgICAgICAgICAgICAgIE5vdGF0aW9uIG9yIERvY3VtZW50VHlwZSBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0Tm9kZUNvbnRlbnRzKE5vZGUgcmVmTm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQlpZiAocmVmTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAocmVmTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgcmVmTm9kZTsKLQkJCXNldFN0YXJ0KHJlZk5vZGUsIDApOwotCQkJc2V0RW5kKHJlZk5vZGUsIHRleHQuZ2V0TGVuZ3RoKCkpOwotCQl9IGVsc2UgewotCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IHJlZk5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJaW50IGxlbmd0aCA9IChjaGlsZE5vZGVzICE9IG51bGwgPyBjaGlsZE5vZGVzLmdldExlbmd0aCgpIDogMCk7Ci0JCQlzZXRTdGFydChyZWZOb2RlLCAwKTsKLQkJCXNldEVuZChyZWZOb2RlLCBsZW5ndGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBlbmQgb2YgYSBSYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZVRoZQotCSAqICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gdmFsdWUuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUKLQkgKiAgICAgICAgICAgIGRpZmZlcmVudCBmcm9tIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBvZmZzZXRUaGUKLQkgKiAgICAgICAgICAgIDxjb2RlPmVuZE9mZnNldDwvY29kZT4gdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgb3IgYW4gYW5jZXN0b3Igb2YgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYW4gRW50aXR5LAotCSAqICAgICAgICAgICAgICAgIE5vdGF0aW9uLCBvciBEb2N1bWVudFR5cGUgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpcwotCSAqICAgICAgICAgICAgICAgIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGNoaWxkIHVuaXRzIGluCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4uIENoaWxkIHVuaXRzIGFyZSAxNi1iaXQgdW5pdHMgaWYKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhIHR5cGUgb2YgQ2hhcmFjdGVyRGF0YSBub2RlCi0JICogICAgICAgICAgICAgICAgKGUuZy4sIGEgVGV4dCBvciBDb21tZW50IG5vZGUpIG9yIGEKLQkgKiAgICAgICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gbm9kZS4gQ2hpbGQgdW5pdHMgYXJlIE5vZGVzIGluIGFsbAotCSAqICAgICAgICAgICAgICAgIG90aGVyIGNhc2VzLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kKE5vZGUgcmVmTm9kZSwgaW50IG9mZnNldCkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQl0aGlzLmVuZENvbnRhaW5lciA9IHJlZk5vZGU7Ci0JCXRoaXMuZW5kT2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGVuZCBvZiBhIFJhbmdlIHRvIGJlIGFmdGVyIGEgbm9kZQotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlUmFuZ2UKLQkgKiAgICAgICAgICAgIGVuZHMgYWZ0ZXIgPGNvZGU+cmVmTm9kZTwvY29kZT4uCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIHRoZSByb290IGNvbnRhaW5lciBvZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIG5vdCBhbiBBdHRyLCBEb2N1bWVudCBvcgotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50RnJhZ21lbnQgbm9kZSBvciBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnQsIERvY3VtZW50RnJhZ21lbnQsIEF0dHIsIEVudGl0eSwgb3IgTm90YXRpb24KLQkgKiAgICAgICAgICAgICAgICBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kQWZ0ZXIoTm9kZSByZWZOb2RlKSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChyZWZOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcGFyZW50ID0gcmVmTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGluZGV4ID0gKChOb2RlSW1wbCkgcmVmTm9kZSkuZ2V0SW5kZXgoKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybjsKLQkJc2V0RW5kKHBhcmVudCwgaW5kZXggKyAxKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlbmQgcG9zaXRpb24gdG8gYmUgYmVmb3JlIGEgbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZVJhbmdlCi0JICogICAgICAgICAgICBlbmRzIGJlZm9yZSA8Y29kZT5yZWZOb2RlPC9jb2RlPgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiB0aGUgcm9vdCBjb250YWluZXIgb2YKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBub3QgYW4gQXR0ciwgRG9jdW1lbnQsIG9yCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBub2RlIG9yIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCwgQXR0ciwgRW50aXR5LCBvciBOb3RhdGlvbgotCSAqICAgICAgICAgICAgICAgIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRCZWZvcmUoTm9kZSByZWZOb2RlKSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChyZWZOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcGFyZW50ID0gcmVmTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGluZGV4ID0gKChOb2RlSW1wbCkgcmVmTm9kZSkuZ2V0SW5kZXgoKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybjsKLQkJc2V0RW5kKHBhcmVudCwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGF0dHJpYnV0ZXMgZGVzY3JpYmluZyB0aGUgc3RhcnQgb2YgdGhlIFJhbmdlLgotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlVGhlCi0JICogICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiB2YWx1ZS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZQotCSAqICAgICAgICAgICAgZGlmZmVyZW50IGZyb20gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIG9mZnNldFRoZQotCSAqICAgICAgICAgICAgPGNvZGU+c3RhcnRPZmZzZXQ8L2NvZGU+IHZhbHVlLgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPgotCSAqICAgICAgICAgICAgICAgIG9yIGFuIGFuY2VzdG9yIG9mIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGFuIEVudGl0eSwKLQkgKiAgICAgICAgICAgICAgICBOb3RhdGlvbiwgb3IgRG9jdW1lbnRUeXBlIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIDxjb2RlPm9mZnNldDwvY29kZT4gaXMKLQkgKiAgICAgICAgICAgICAgICBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBjaGlsZCB1bml0cyBpbgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+LiBDaGlsZCB1bml0cyBhcmUgMTYtYml0IHVuaXRzIGlmCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYSB0eXBlIG9mIENoYXJhY3RlckRhdGEgbm9kZQotCSAqICAgICAgICAgICAgICAgIChlLmcuLCBhIFRleHQgb3IgQ29tbWVudCBub2RlKSBvciBhCi0JICogICAgICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uIG5vZGUuIENoaWxkIHVuaXRzIGFyZSBOb2RlcyBpbiBhbGwKLQkgKiAgICAgICAgICAgICAgICBvdGhlciBjYXNlcy4gPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KE5vZGUgcmVmTm9kZSwgaW50IG9mZnNldCkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQl0aGlzLnN0YXJ0Q29udGFpbmVyID0gcmVmTm9kZTsKLQkJdGhpcy5zdGFydE9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGFydCBwb3NpdGlvbiB0byBiZSBhZnRlciBhIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZVJhbmdlCi0JICogICAgICAgICAgICBzdGFydHMgYWZ0ZXIgPGNvZGU+cmVmTm9kZTwvY29kZT4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgdGhlIHJvb3QgY29udGFpbmVyIG9mCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgbm90IGFuIEF0dHIsIERvY3VtZW50LCBvcgotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50RnJhZ21lbnQgbm9kZSBvciBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnQsIERvY3VtZW50RnJhZ21lbnQsIEF0dHIsIEVudGl0eSwgb3IgTm90YXRpb24KLQkgKiAgICAgICAgICAgICAgICBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRBZnRlcihOb2RlIHJlZk5vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJlZk5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSByZWZOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAoKE5vZGVJbXBsKSByZWZOb2RlKS5nZXRJbmRleCgpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlzZXRTdGFydChwYXJlbnQsIGluZGV4ICsgMSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhcnQgcG9zaXRpb24gdG8gYmUgYmVmb3JlIGEgbm9kZQotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlUmFuZ2UKLQkgKiAgICAgICAgICAgIHN0YXJ0cyBiZWZvcmUgPGNvZGU+cmVmTm9kZTwvY29kZT4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgdGhlIHJvb3QgY29udGFpbmVyIG9mCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgbm90IGFuIEF0dHIsIERvY3VtZW50LCBvcgotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50RnJhZ21lbnQgbm9kZSBvciBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnQsIERvY3VtZW50RnJhZ21lbnQsIEF0dHIsIEVudGl0eSwgb3IgTm90YXRpb24KLQkgKiAgICAgICAgICAgICAgICBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRCZWZvcmUoTm9kZSByZWZOb2RlKSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChyZWZOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcGFyZW50ID0gcmVmTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGluZGV4ID0gKChOb2RlSW1wbCkgcmVmTm9kZSkuZ2V0SW5kZXgoKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybjsKLQkJc2V0U3RhcnQocGFyZW50LCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogUmVwYXJlbnRzIHRoZSBjb250ZW50cyBvZiB0aGUgUmFuZ2UgdG8gdGhlIGdpdmVuIG5vZGUgYW5kIGluc2VydHMgdGhlCi0JICogbm9kZSBhdCB0aGUgcG9zaXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3UGFyZW50VGhlCi0JICogICAgICAgICAgICBub2RlIHRvIHN1cnJvdW5kIHRoZSBjb250ZW50cyB3aXRoLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgYW4gYW5jZXN0b3IKLQkgKiAgICAgICAgICAgICAgICBjb250YWluZXIgb2YgZWl0aGVyIGJvdW5kYXJ5LXBvaW50IG9mIHRoZSBSYW5nZSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWQtb25seS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIFdST05HX0RPQ1VNRU5UX0VSUjogUmFpc2VkIGlmIDxjb2RlPiBuZXdQYXJlbnQ8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgYW5kIHRoZSBjb250YWluZXIgb2YgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZSB3ZXJlIG5vdAotCSAqICAgICAgICAgICAgICAgIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBkb2N1bWVudC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIHRoZSBjb250YWluZXIgb2YgdGhlCi0JICogICAgICAgICAgICAgICAgc3RhcnQgb2YgdGhlIFJhbmdlIGlzIG9mIGEgdHlwZSB0aGF0IGRvZXMgbm90IGFsbG93Ci0JICogICAgICAgICAgICAgICAgY2hpbGRyZW4gb2YgdGhlIHR5cGUgb2YgPGNvZGU+bmV3UGFyZW50PC9jb2RlPiBvciBpZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPm5ld1BhcmVudDwvY29kZT4gaXMgYW4gYW5jZXN0b3Igb2YgdGhlIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgICAgIG9yIGlmIDxjb2RlPm5vZGU8L2NvZGU+IHdvdWxkIGVuZCB1cCB3aXRoIGEgY2hpbGQgbm9kZQotCSAqICAgICAgICAgICAgICAgIG9mIGEgdHlwZSBub3QgYWxsb3dlZCBieSB0aGUgdHlwZSBvZiA8Y29kZT5ub2RlPC9jb2RlPi4KLQkgKiAgICAgICAgICAgICAgICA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIEJBRF9CT1VOREFSWVBPSU5UU19FUlI6IFJhaXNlZCBpZiB0aGUgUmFuZ2UgcGFydGlhbGx5Ci0JICogICAgICAgICAgICAgICAgc2VsZWN0cyBhIG5vbi10ZXh0IG5vZGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT4gbm9kZTwvY29kZT4gaXMKLQkgKiAgICAgICAgICAgICAgICBhbiBBdHRyLCBFbnRpdHksIERvY3VtZW50VHlwZSwgTm90YXRpb24sIERvY3VtZW50LCBvcgotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50RnJhZ21lbnQgbm9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdXJyb3VuZENvbnRlbnRzKE5vZGUgbmV3UGFyZW50KSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JlYWRPbmx5Q29udHJvbGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SZWFkT25seUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjMjM3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JlYWRPbmx5Q29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLWNsYXNzIFJlYWRPbmx5Q29udHJvbGxlciB7Ci0KLQljbGFzcyBTcGFuIHsKLQkJaW50IGxlbmd0aDsKLQkJaW50IG9mZnNldDsKLQotCQlTcGFuKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBSZWFkT25seUNvbnRyb2xsZXIgZkluc3RhbmNlOwotCi0Jc3RhdGljIHN5bmNocm9uaXplZCBSZWFkT25seUNvbnRyb2xsZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IFJlYWRPbmx5Q29udHJvbGxlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgdm9pZCBsb2NrKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBib29sZWFuIGNhbkluc2VydEJlZm9yZSwgYm9vbGVhbiBjYW5JbnNlcnRBZnRlcikgewotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZG9jIGluc3RhbmNlb2YgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpZG9jKS5tYWtlUmVhZE9ubHkob2Zmc2V0LCBsZW5ndGgsIGNhbkluc2VydEJlZm9yZSwgY2FuSW5zZXJ0QWZ0ZXIpOwotCQl9IGVsc2UgewotCQkJZG9jLm1ha2VSZWFkT25seShvZmZzZXQsIGxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSB2b2lkIGxvY2soSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlLCBib29sZWFuIGNhbkluc2VydEJlZm9yZSwgYm9vbGVhbiBjYW5JbnNlcnRBZnRlcikgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBub2RlLmdldFBhcmVudERvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudClkb2MpLm1ha2VSZWFkT25seShub2RlLmdldFN0YXJ0KCksIG5vZGUuZ2V0TGVuZ3RoKCksIGNhbkluc2VydEJlZm9yZSwgY2FuSW5zZXJ0QWZ0ZXIpOwotCQl9IGVsc2UgewotCQkJZG9jLm1ha2VSZWFkT25seShub2RlLmdldFN0YXJ0KCksIG5vZGUuZ2V0TGVuZ3RoKCkpOwotCQl9Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgdm9pZCB1bmxvY2soSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IG5vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZG9jLmNsZWFyUmVhZE9ubHkobm9kZS5nZXRTdGFydCgpLCBub2RlLmdldExlbmd0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIFJlYWRPbmx5Q29udHJvbGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFNwYW4gZ2V0RGF0YVNwYW4oSURPTU5vZGUgbm9kZSkgewotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQkJcmV0dXJuIGdldERhdGFTcGFuRm9yRWxlbWVudCgoSURPTUVsZW1lbnQpIG5vZGUpOwotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0JCQkJcmV0dXJuIGdldERhdGFTcGFuRm9yVGV4dCgoSURPTVRleHQpIG5vZGUpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG5ldyBTcGFuKDAsIC0xKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3BhbiBnZXREYXRhU3BhbkZvckVsZW1lbnQoSURPTUVsZW1lbnQgbm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY1JlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGRvY1JlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFNwYW4oMCwgLTEpOwotCQl9Ci0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2NSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFNwYW4oMCwgLTEpOwotCQl9Ci0KLQkJU3RyaW5nIHN0YXJ0VHlwZTsKLQkJU3RyaW5nIGVuZFR5cGU7Ci0JCWlmIChub2RlLmlzQ29tbWVudFRhZygpKSB7Ci0JCQlzdGFydFR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU47Ci0JCQllbmRUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRTsKLQkJfSBlbHNlIHsKLQkJCXN0YXJ0VHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FOwotCQkJZW5kVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRTsKLQkJfQotCi0JCWludCBzdGFydE9mZnNldCA9IC0xOwotCQlpbnQgZW5kT2Zmc2V0ID0gLTE7Ci0JCUlUZXh0UmVnaW9uIHByZXZSZWdpb24gPSBudWxsOwotCQlJVGV4dFJlZ2lvbiByZWdpb247Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBzdGFydFR5cGUpIHsKLQkJCQlzdGFydE9mZnNldCA9IHJlZ2lvbi5nZXRFbmQoKTsKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBlbmRUeXBlICYmIHByZXZSZWdpb24gIT0gbnVsbCkgewotCQkJCWVuZE9mZnNldCA9IHByZXZSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJfQotCQkJcHJldlJlZ2lvbiA9IHJlZ2lvbjsKLQkJfQotCi0JCWlmICgwIDw9IHN0YXJ0T2Zmc2V0ICYmIDAgPD0gZW5kT2Zmc2V0KSB7Ci0JCQlyZXR1cm4gbmV3IFNwYW4oc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBuZXcgU3BhbigwLCAtMSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNwYW4gZ2V0RGF0YVNwYW5Gb3JUZXh0KElET01UZXh0IG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2NSZWdpb24gPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGRvY1JlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFNwYW4oMCwgLTEpOwotCQl9Ci0JCXJldHVybiBuZXcgU3BhbigwLCBkb2NSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZnJvbSBwYXJlbnQncyBzZXRDaGlsZEVkaXRhYmxlKCkKLQkgKiAKLQkgKiBjYXNlIDE6PHBhcmVudD48bm9kZSBhdHRyPSJ2YWx1ZSIvPiA8bm9kZTI+PC9wYXJlbnQ+Ci0JICogeCMjIyMjIyMjIyMjIyMjIyMjIyMjeCBjYXNlIDI6PHBhcmVudD48bm9kZSBhdHRyPSJ2YWx1ZSI+IDxjaGlsZD4KLQkgKiA8L2NoaWxkPiA8L25vZGU+IDwvcGFyZW50PiB4IyMjIyMjIyMjIyMjIyMjIyMjIz8gPyMjIyMjIyN4ICg/IDoKLQkgKiBlZGl0YWJsZSBpZiBub2RlLmlzRWRpdGFibGUoKSA9PSB0cnVlKQotCSAqLwotCXZvaWQgbG9ja0JvdGgoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCQlib29sZWFuIGNhbkluc2VydCA9IGZhbHNlOwotCi0JCS8vIGVuZCBub2RlIChlbGVtZW50KQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCWNhbkluc2VydCA9IG5vZGUuaXNDaGlsZEVkaXRhYmxlKCk7Ci0JCQkJbG9jayhmbGF0Tm9kZSwgY2FuSW5zZXJ0LCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gc3RhcnQgbm9kZQotCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCWxvY2soZmxhdE5vZGUsIGZhbHNlLCBjYW5JbnNlcnQpOwotCQl9Ci0JfQotCi0Jdm9pZCBsb2NrRGF0YShJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVNwYW4gc3BhbiA9IGdldERhdGFTcGFuKG5vZGUpOwotCQlpZiAoMCA8PSBzcGFuLmxlbmd0aCkgewotCQkJbG9jayhub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArIHNwYW4ub2Zmc2V0LCBzcGFuLmxlbmd0aCwgZmFsc2UsIGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGxvY2sgaXRzZWxmIGFuZCBhbGwgZGVzY2VuZGFudHMKLQkgKi8KLQl2b2lkIGxvY2tEZWVwKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IG5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBvZmZzZXQ7Ci0KLQkJYm9vbGVhbiBjYW5JbnNlcnQgPSB0cnVlOwotCQlJRE9NTm9kZSBwYXJlbnQgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5pc0NoaWxkRWRpdGFibGUoKSkgewotCQkJY2FuSW5zZXJ0ID0gZmFsc2U7Ci0JCX0KLQkJbG9jayhub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBvZmZzZXQsIGxlbmd0aCwgY2FuSW5zZXJ0LCBjYW5JbnNlcnQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZnJvbSBwYXJlbnQncyBzZXRDaGlsZEVkaXRhYmxlKCkKLQkgKiAKLQkgKiBjYXNlIDE6PHBhcmVudD48bm9kZSBhdHRyPSJ2YWx1ZSIvPiA8bm9kZTI+PC9wYXJlbnQ+IHgjIyMjIyN4IHgjI3gKLQkgKiBjYXNlIDI6PHBhcmVudD48bm9kZSBhdHRyPSJ2YWx1ZSI+IDxjaGlsZD48L2NoaWxkPiA8L25vZGU+IDwvcGFyZW50PgotCSAqIHgjIyMjIyN4IHgjPyA/IyMjIyMjI3ggKD8gOiBlZGl0YWJsZSBpZiBub2RlLmlzRWRpdGFibGUoKSA9PSB0cnVlKQotCSAqLwotCXZvaWQgbG9ja05vZGUoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCFub2RlLmlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCWxvY2tCb3RoKG5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQkJYm9vbGVhbiBjYW5JbnNlcnQgPSBmYWxzZTsKLQotCQkvLyBlbmQgbm9kZSAoZWxlbWVudCkKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJZmxhdE5vZGUgPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQljYW5JbnNlcnQgPSBub2RlLmlzQ2hpbGRFZGl0YWJsZSgpOwotCQkJCWxvY2soZmxhdE5vZGUsIGNhbkluc2VydCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JCS8vIHN0YXJ0IG5vZGUKLQkJZmxhdE5vZGUgPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlTcGFuIHNwYW4gPSBnZXREYXRhU3Bhbihub2RlKTsKLQkJCWlmICgwIDw9IHNwYW4ubGVuZ3RoKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBmbGF0Tm9kZS5nZXRQYXJlbnREb2N1bWVudCgpOwotCQkJCWludCBvZmZzZXQsIGxlbmd0aDsKLQkJCQlvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQkJCWxlbmd0aCA9IHNwYW4ub2Zmc2V0OwotCQkJCWxvY2soc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgZmFsc2UsIGZhbHNlKTsKLQkJCQlvZmZzZXQgPSBvZmZzZXQgKyBzcGFuLm9mZnNldCArIHNwYW4ubGVuZ3RoOwotCQkJCWxlbmd0aCA9IGZsYXROb2RlLmdldEVuZCgpIC0gb2Zmc2V0OwotCQkJCWxvY2soc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgZmFsc2UsIGNhbkluc2VydCk7Ci0JCQl9IGVsc2UgewotCQkJCWxvY2soZmxhdE5vZGUsIGZhbHNlLCBjYW5JbnNlcnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVubG9jayhJU3RydWN0dXJlZERvY3VtZW50IGRvYywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlkb2MuY2xlYXJSZWFkT25seShvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0Jdm9pZCB1bmxvY2tCb3RoKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQkJLy8gc3RhcnQgbm9kZQotCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCXVubG9jayhmbGF0Tm9kZSk7Ci0JCX0KLQkJLy8gZW5kIG5vZGUKLQkJZmxhdE5vZGUgPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJdW5sb2NrKGZsYXROb2RlKTsKLQkJfQotCX0KLQotCXZvaWQgdW5sb2NrRGF0YShJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVNwYW4gc3BhbiA9IGdldERhdGFTcGFuKG5vZGUpOwotCQlpZiAoMCA8PSBzcGFuLmxlbmd0aCkgewotCQkJdW5sb2NrKG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgc3Bhbi5vZmZzZXQsIHNwYW4ubGVuZ3RoKTsKLQkJfQotCX0KLQotCXZvaWQgdW5sb2NrRGVlcChJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBvZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSBub2RlLmdldEVuZE9mZnNldCgpIC0gb2Zmc2V0OwotCi0JCXVubG9jayhub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0Jdm9pZCB1bmxvY2tOb2RlKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQkJLy8gZW5kIG5vZGUKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJZmxhdE5vZGUgPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQl1bmxvY2soZmxhdE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gc3RhcnQgbm9kZQotCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlLmlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCQl1bmxvY2soZmxhdE5vZGUpOwotCQkJfSBlbHNlIHsKLQkJCQlTcGFuIHNwYW4gPSBnZXREYXRhU3Bhbihub2RlKTsKLQkJCQlpZiAoc3Bhbi5sZW5ndGggPD0gMCkgewotCQkJCQl1bmxvY2soZmxhdE5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZmxhdE5vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJCQkJaW50IG9mZnNldCwgbGVuZ3RoOwotCQkJCQlvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQkJCQlsZW5ndGggPSBzcGFuLm9mZnNldCAtIG9mZnNldDsKLQkJCQkJdW5sb2NrKHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgpOwotCQkJCQlvZmZzZXQgPSBzcGFuLm9mZnNldCArIHNwYW4ubGVuZ3RoOwotCQkJCQlsZW5ndGggPSBmbGF0Tm9kZS5nZXRFbmQoKSAtIHNwYW4ub2Zmc2V0OwotCQkJCQl1bmxvY2soc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Tb3VyY2VWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU291cmNlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNTEyMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Tb3VyY2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVhNTENoYXJFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgU291cmNlVmFsaWRhdG9yIHsKLQotCXByaXZhdGUgTm9kZUltcGwgbm9kZSA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU291cmNlVmFsaWRhdG9yKE5vZGUgbm9kZSkgewotCQlzdXBlcigpOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXRoaXMubm9kZSA9IChOb2RlSW1wbCkgbm9kZTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5ub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQotCQkvLyBzZXR1cCBjb252ZXJzaW9uIGNvbmRpdGlvbnMKLQkJYm9vbGVhbiBhY2NlcHRUYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBhY2NlcHRDbG9zZSA9IGZhbHNlOwotCQlib29sZWFuIGFjY2VwdFF1b3RlID0gZmFsc2U7Ci0JCWJvb2xlYW4gYWNjZXB0QW1wZXJzYW5kID0gZmFsc2U7Ci0JCWJvb2xlYW4gYWNjZXB0RW50aXR5UmVmID0gdHJ1ZTsKLQkJYm9vbGVhbiBhY2NlcHRKU1BFbmQgPSB0cnVlOwotCQlTdHJpbmcgZW5kVGFnTmFtZSA9IG51bGw7Ci0JCWlmICh0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSAoSURPTURvY3VtZW50KSB0aGlzLm5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuaXNKU1BUeXBlKCkpCi0JCQkJYWNjZXB0VGFnID0gdHJ1ZTsKLQkJCWlmIChhY2NlcHRUYWcpIHsKLQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgdGhpcy5ub2RlOwotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQkJCWFjY2VwdFRhZyA9IGZhbHNlOwotCQkJfQotCQkJLy8gaWYgdGhlIHNvdXJjZSBkb2VzIG5vdCBpbmNsdWRlIHNpbmdsZSBxdW90ZSwKLQkJCS8vIGRvdWJsZSBxdW90ZSBpcyB2YWxpZAotCQkJYWNjZXB0UXVvdGUgPSAoc291cmNlLmluZGV4T2YoJ1wnJykgPCAwKTsKLQkJfSBlbHNlIGlmICh0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5ub2RlOwotCQkJaWYgKHRleHQuaXNKU1BDb250ZW50KCkpIHsKLQkJCQlpbnQgaW5kZXggPSBzb3VyY2UuaW5kZXhPZihKU1BUYWcuVEFHX0NMT1NFKTsKLQkJCQlpZiAoaW5kZXggPCAwKQotCQkJCQlyZXR1cm4gc291cmNlOwotCQkJCWFjY2VwdFRhZyA9IHRydWU7Ci0JCQkJYWNjZXB0Q2xvc2UgPSB0cnVlOwotCQkJCWFjY2VwdFF1b3RlID0gdHJ1ZTsKLQkJCQlhY2NlcHRBbXBlcnNhbmQgPSB0cnVlOwotCQkJCWFjY2VwdEpTUEVuZCA9IGZhbHNlOwotCQkJfSBlbHNlIGlmICh0ZXh0LmlzQ0RBVEFDb250ZW50KCkpIHsKLQkJCQllbmRUYWdOYW1lID0gdGV4dC5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAoZW5kVGFnTmFtZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJCQlhY2NlcHRUYWcgPSB0cnVlOwotCQkJCWFjY2VwdENsb3NlID0gdHJ1ZTsKLQkJCQlhY2NlcHRRdW90ZSA9IHRydWU7Ci0JCQkJYWNjZXB0QW1wZXJzYW5kID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCQlpZiAodGhpcy5ub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJZG9jdW1lbnQgPSAoSURPTURvY3VtZW50KSB0aGlzLm5vZGU7Ci0JCQl9IGVsc2UgewotCQkJCWRvY3VtZW50ID0gKElET01Eb2N1bWVudCkgdGhpcy5ub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCX0KLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmlzSlNQVHlwZSgpKQotCQkJCWFjY2VwdFRhZyA9IHRydWU7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJaW50IGNvcGllZExlbmd0aCA9IDA7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyByZWYgPSBudWxsOwotCQkJY2hhciBjID0gc291cmNlLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJzwnIDoKLQkJCQkJaWYgKGFjY2VwdFRhZykgewotCQkJCQkJaWYgKGVuZFRhZ05hbWUgIT0gbnVsbCkgewotCQkJCQkJCWlmICghbWF0Y2hFbmRUYWcoc291cmNlLCBpICsgMSwgZW5kVGFnTmFtZSkpCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpbnQgc2tpcCA9IHNraXBUYWcoc291cmNlLCBpICsgMSk7Ci0JCQkJCQkJaWYgKHNraXAgPj0gMCkgewotCQkJCQkJCQlpICs9IHNraXA7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIGludmFsaWQgSlNQIHRhZwotCQkJCQl9Ci0JCQkJCXJlZiA9IElYTUxDaGFyRW50aXR5LkxUX1JFRjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnPicgOgotCQkJCQlpZiAoYWNjZXB0Q2xvc2UpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJcmVmID0gSVhNTENoYXJFbnRpdHkuR1RfUkVGOwotCQkJCQlicmVhazsKLQkJCQljYXNlICcmJyA6Ci0JCQkJCWlmIChhY2NlcHRBbXBlcnNhbmQpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaWYgKGFjY2VwdEVudGl0eVJlZikgewotCQkJCQkJaW50IHNraXAgPSBza2lwRW50aXR5UmVmKHNvdXJjZSwgaSArIDEpOwotCQkJCQkJaWYgKHNraXAgPj0gMCkgewotCQkJCQkJCWkgKz0gc2tpcDsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZWYgPSBJWE1MQ2hhckVudGl0eS5BTVBfUkVGOwotCQkJCQlicmVhazsKLQkJCQljYXNlICciJyA6Ci0JCQkJCWlmIChhY2NlcHRRdW90ZSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlyZWYgPSBJWE1MQ2hhckVudGl0eS5RVU9UX1JFRjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnJScgOgotCQkJCQlpZiAoYWNjZXB0SlNQRW5kKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmIChzb3VyY2UuY2hhckF0KGkgKyAxKSAhPSAnPicpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaSsrOwotCQkJCQlyZWYgPSBJWE1MQ2hhckVudGl0eS5HVF9SRUY7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKHJlZiAhPSBudWxsKSB7Ci0JCQkJaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0JCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgOCk7Ci0JCQkJfQotCQkJCWlmIChpID4gY29waWVkTGVuZ3RoKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhjb3BpZWRMZW5ndGgsIGkpKTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZChyZWYpOwotCQkJCWNvcGllZExlbmd0aCA9IGkgKyAxOyAvLyBza2lwIHRoaXMgY2hhcmFjdGVyCi0JCQl9Ci0JCX0KLQotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCWlmIChjb3BpZWRMZW5ndGggPCBsZW5ndGgpIHsKLQkJCQlidWZmZXIuYXBwZW5kKHNvdXJjZS5zdWJzdHJpbmcoY29waWVkTGVuZ3RoLCBsZW5ndGgpKTsKLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBtYXRjaEVuZFRhZyhTdHJpbmcgc291cmNlLCBpbnQgb2Zmc2V0LCBTdHJpbmcgZW5kVGFnTmFtZSkgewotCQlpZiAoc291cmNlID09IG51bGwgfHwgZW5kVGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gbGVuZ3RoKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoc291cmNlLmNoYXJBdChvZmZzZXQpICE9ICcvJykKLQkJCXJldHVybiBmYWxzZTsKLQkJb2Zmc2V0Kys7Ci0JCWludCBlbmQgPSBvZmZzZXQgKyBlbmRUYWdOYW1lLmxlbmd0aCgpOwotCQlpZiAoZW5kID4gbGVuZ3RoKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZW5kVGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBza2lwRW50aXR5UmVmKFN0cmluZyBzb3VyY2UsIGludCBvZmZzZXQpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gc291cmNlLmxlbmd0aCgpKQotCQkJcmV0dXJuIC0xOwotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSB0aGlzLm5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsgLy8gZXJyb3IKLQotCQlpbnQgZW5kID0gc291cmNlLmluZGV4T2YoJzsnLCBvZmZzZXQpOwotCQlpZiAoZW5kIDwgMCB8fCBlbmQgPT0gb2Zmc2V0KQotCQkJcmV0dXJuIC0xOwotCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpOwotCQlpZiAobmFtZSA9PSBudWxsIHx8IGRvY3VtZW50LmdldENoYXJWYWx1ZShuYW1lKSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gKGVuZCArIDEgLSBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHNraXBUYWcoU3RyaW5nIHNvdXJjZSwgaW50IG9mZnNldCkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBzb3VyY2UubGVuZ3RoKCkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaW50IGVuZCA9IG9mZnNldDsKLQkJaWYgKHNvdXJjZS5jaGFyQXQob2Zmc2V0KSA9PSAnJScpIHsKLQkJCS8vIEpTUCB0YWcKLQkJCWludCBmb3VuZCA9IHNvdXJjZS5pbmRleE9mKEpTUFRhZy5UQUdfQ0xPU0UsIG9mZnNldCArIDEpOwotCQkJaWYgKGZvdW5kIDwgMCkKLQkJCQlyZXR1cm4gLTE7IC8vIGludmFsaWQgSlNQIHRhZwotCQkJZW5kID0gZm91bmQgKyAyOwotCQl9IGVsc2UgewotCQkJLy8gbm9ybWFsIHRhZwotCQkJaW50IGZvdW5kID0gc291cmNlLmxhc3RJbmRleE9mKCc+Jyk7Ci0JCQlpZiAoZm91bmQgPCBvZmZzZXQpCi0JCQkJcmV0dXJuIC0xOyAvLyBpbnZhbGlkIHRhZwotCQkJZW5kID0gZm91bmQgKyAxOwotCQl9Ci0JCXJldHVybiAoZW5kIC0gb2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNvdXJjZShTdHJpbmcgc291cmNlKSB0aHJvd3MgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbiB7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAodGhpcy5ub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIGVycm9yCi0JCVN0cmluZyBtZXNzYWdlID0gbnVsbDsKLQotCi0JCS8vIHNldHVwIHZhbGlkYXRpb24gY29uZGl0aW9ucwotCQlib29sZWFuIGFjY2VwdFRhZyA9IGZhbHNlOwotCQlib29sZWFuIGFjY2VwdENsb3NlID0gZmFsc2U7Ci0JCWJvb2xlYW4gYWNjZXB0UXVvdGUgPSB0cnVlOwotCQlib29sZWFuIGFjY2VwdEVudGl0eVJlZiA9IHRydWU7Ci0JCVN0cmluZyBlbmRUYWdOYW1lID0gbnVsbDsKLQkJaWYgKHRoaXMubm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIHRoaXMubm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5pc0pTUFR5cGUoKSkKLQkJCQlhY2NlcHRUYWcgPSB0cnVlOwotCQkJaWYgKGFjY2VwdFRhZykgewotCQkJCUF0dHIgYXR0ciA9IChBdHRyKSB0aGlzLm5vZGU7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCQkJYWNjZXB0VGFnID0gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBpZiB0aGUgc291cmNlIGRvZXMgbm90IGluY2x1ZGUgc2luZ2xlIHF1b3RlLAotCQkJLy8gZG91YmxlIHF1b3RlIGlzIHZhbGlkCi0JCQlhY2NlcHRRdW90ZSA9IChzb3VyY2UuaW5kZXhPZignXCcnKSA8IDApOwotCQl9IGVsc2UgaWYgKHRoaXMubm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSB0aGlzLm5vZGU7Ci0JCQlpZiAodGV4dC5pc0pTUENvbnRlbnQoKSkgewotCQkJCWludCBpbmRleCA9IHNvdXJjZS5pbmRleE9mKEpTUFRhZy5UQUdfQ0xPU0UpOwotCQkJCWlmIChpbmRleCA8IDApCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCW1lc3NhZ2UgPSBYTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9jaGFyYWN0ZXJfZ3RfZm9fRVJST1JfOwotCQkJCXRocm93IG5ldyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uKG1lc3NhZ2UsICc+JywgaW5kZXggKyAxKTsKLQkJCX0gZWxzZSBpZiAodGV4dC5pc0NEQVRBQ29udGVudCgpKSB7Ci0JCQkJZW5kVGFnTmFtZSA9IHRleHQuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKGVuZFRhZ05hbWUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBlcnJvcgotCQkJCWFjY2VwdFRhZyA9IHRydWU7Ci0JCQkJYWNjZXB0Q2xvc2UgPSB0cnVlOwotCQkJfSBlbHNlIGlmKGhhc05lc3RlZFJlZ2lvbih0ZXh0KSkgewotCQkJCS8vdGhlcmUgYXJlIGNhc2VzIChzdWNoIGFzIHdpdGggRUwpIHRoYXQgdGhlIHRleHQgaXMgdG8gY29tcGxpY2F0ZWQKLQkJCQkvLwl0byBiZSB2ZXJpZmllZCBieSB0aGlzIHZhbGlkYXRvcgotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJCWlmICh0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQlkb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIHRoaXMubm9kZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZG9jdW1lbnQgPSAoSURPTURvY3VtZW50KSB0aGlzLm5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJfQotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuaXNKU1BUeXBlKCkpCi0JCQkJYWNjZXB0VGFnID0gdHJ1ZTsKLQkJfQotCi0JCWNoYXIgYyA9IDA7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWMgPSBzb3VyY2UuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnPCcgOgotCQkJCQlpZiAoYWNjZXB0VGFnKSB7Ci0JCQkJCQlpZiAoZW5kVGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKCFtYXRjaEVuZFRhZyhzb3VyY2UsIGkgKyAxLCBlbmRUYWdOYW1lKSkKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWludCBza2lwID0gc2tpcFRhZyhzb3VyY2UsIGkgKyAxKTsKLQkJCQkJCQlpZiAoc2tpcCA+PSAwKSB7Ci0JCQkJCQkJCWkgKz0gc2tpcDsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gaW52YWxpZCB0YWcKLQkJCQkJfQotCQkJCQltZXNzYWdlID0gWE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfY2hhcmFjdGVyX2x0X2ZvX0VSUk9SXzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnPicgOgotCQkJCQlpZiAoYWNjZXB0Q2xvc2UpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJbWVzc2FnZSA9IFhNTENvcmVNZXNzYWdlcy5JbnZhbGlkX2NoYXJhY3Rlcl9ndF9mb19FUlJPUl87Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyYnIDoKLQkJCQkJaWYgKGFjY2VwdEVudGl0eVJlZikgewotCQkJCQkJaWYgKGVuZFRhZ05hbWUgIT0gbnVsbCkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCWludCBza2lwID0gc2tpcEVudGl0eVJlZihzb3VyY2UsIGkgKyAxKTsKLQkJCQkJCWlmIChza2lwID49IDApIHsKLQkJCQkJCQlpICs9IHNraXA7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBpbnZhbGlkIGVudGl0eSByZWZlcmVuY2UKLQkJCQkJfQotCQkJCQltZXNzYWdlID0gWE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfY2hhcmFjdGVyX2FtcF9mb19FUlJPUl87Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyInIDoKLQkJCQkJaWYgKGFjY2VwdFF1b3RlKQotCQkJCQkJY29udGludWU7Ci0JCQkJCW1lc3NhZ2UgPSBYTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9jaGFyYWN0ZXJfX2ZfRVhDXzsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24obWVzc2FnZSwgYywgaSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogVHJ1ZSBpZiB0aGUgdGV4dCBoYXMgbmVzdGVkIHJlZ2lvbnMsIG1lYW5pbmcgY29udGFpbmVyIGlzIHByb2JhYmx5IHRvbwotCSAqIGNvbXBsaWNhdGVkIChsaWtlIEVMIHJlZ2lvbnMpIHRvIHZhbGlkYXRlIHdpdGggdGhpcyB2YWxpZGF0b3IuCi0JICoKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTmVzdGVkUmVnaW9uKFRleHRJbXBsIHRleHQpIHsKLQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyUmVnaW9uID0gdGV4dC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RSZWdpb24gPSB0ZXh0LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQl3aGlsZShjdXJyUmVnaW9uICE9IG51bGwgJiYgIWRvbmUpIHsKLQkJCQotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBjdXJyUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWZvcihpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgKytpKSB7Ci0JCQkJSVRleHRSZWdpb24gY29udGFpbmVyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJaWYgKChjb250YWluZXIgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMyID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgY29udGFpbmVyKS5nZXRSZWdpb25zKCk7Ci0JCQkJCWlmIChyZWdpb25zMiAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJZG9uZSA9IGN1cnJSZWdpb24gPT0gbGFzdFJlZ2lvbjsKLQkJCWN1cnJSZWdpb24gPSBjdXJyUmVnaW9uLmdldE5leHQoKTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNoZWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdjOGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBvbmx5IGZvciBkZWJ1ZyBwdXJwb3NlLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlciB7Ci0JU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMDsKLQlXcml0ZXIgdGVzdFdyaXRlciA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlcihXcml0ZXIgd3JpdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRlc3RXcml0ZXIgPSB3cml0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ2hpbGROb2RlcyhOb2RlIG5vZGUpIHsKLQkJZm9yIChOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJY2hlY2tOb2RlKGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrTW9kZWwoSURPTU1vZGVsIG1vZGVsKSB7Ci0JCWNoZWNrQ2hpbGROb2Rlcyhtb2RlbC5nZXREb2N1bWVudCgpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tOb2RlKE5vZGUgbm9kZSkgewotCQljaGVja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigoKE5vZGVJbXBsKSBub2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWNoZWNrQ2hpbGROb2Rlcyhub2RlKTsKLQkJCWNoZWNrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCgoRWxlbWVudEltcGwpIG5vZGUpLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaW50IG4gPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoYyA9PSBudWxsKSB7Ci0JCQkJCXJlcG9ydEVycm9yKCJudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWNoZWNrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGMpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaWYgKHN0YXJ0IDwgdGhpcy5vZmZzZXQpCi0JCQlyZXBvcnRFcnJvcigib3ZlcndyYXAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc3RhcnQgPiB0aGlzLm9mZnNldCkKLQkJCXJlcG9ydEVycm9yKCJnYXAiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgZW5kID0gZmxhdE5vZGUuZ2V0RW5kKCk7Ci0JCXRoaXMub2Zmc2V0ID0gZW5kOwotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHAgPSBwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChwID09IG51bGwpIHsKLQkJCQlyZXBvcnRFcnJvcigibnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJaW50IHMgPSBwLmdldFN0YXJ0KCk7Ci0JCQlpbnQgZSA9IHAuZ2V0RW5kKCk7Ci0JCQlpZiAocyA+IHN0YXJ0IHx8IGUgPCBlbmQpCi0JCQkJcmVwb3J0RXJyb3IoIm91dCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocyA9PSBzdGFydCAmJiBlID09IGVuZCkKLQkJCQlyZXBvcnRXYXJuaW5nKCJ2YWluIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZXBvcnRFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCQlTdHJpbmcgbXNnID0gIlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNoZWNrZXIgOiBlcnJvciA6ICIgKyBtZXNzYWdlOyAvLyROT04tTkxTLTEkCi0JCWlmICh0ZXN0V3JpdGVyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJdGVzdFdyaXRlci53cml0ZShtc2cgKyBFT0wpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJfQotCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZXBvcnRXYXJuaW5nKFN0cmluZyBtZXNzYWdlKSB7Ci0JCVN0cmluZyBtc2cgPSAiU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlciA6IHdhcm5pbmcgOiAiICsgbWVzc2FnZTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGVzdFdyaXRlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXRlc3RXcml0ZXIud3JpdGUobXNnICsgRU9MKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1MjExZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDI5Njk5OSAtIEluZWZmaWNpZW50IHVzZSBvZiBuZXcgU3RyaW5nKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotCi1jbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHsKLQotCXByaXZhdGUgVmVjdG9yIGZsYXROb2RlcyA9IG5ldyBWZWN0b3IoMik7Ci0KLQkvKioKLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGRSZWdpb24oSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0KGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIGFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWlmIChjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKSA+IDApIHsKLQkJCQl0aGlzLmZsYXROb2Rlcy5hZGRBbGwoY29udGFpbmVyLmZsYXROb2Rlcyk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmZsYXROb2Rlcy5hZGRFbGVtZW50KGZsYXROb2RlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXREZWVwZXN0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3QgPSBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChsYXN0ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGxhc3QuZ2V0RW5kKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRFbmQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0Rmlyc3RSZWdpb24oKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJaWYgKHRoaXMuZmxhdE5vZGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHRoaXMuZmxhdE5vZGVzLmVsZW1lbnRBdCgwKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KCkgewotCQlyZXR1cm4gZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoU3RyaW5nIGNvbnRleHQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TGFzdFJlZ2lvbigpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCWludCBzaXplID0gdGhpcy5mbGF0Tm9kZXMuc2l6ZSgpOwotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgdGhpcy5mbGF0Tm9kZXMuZWxlbWVudEF0KHNpemUgLSAxKTsKLQl9Ci0KLQkvKiogCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiAoZ2V0RW5kKCkgLSBnZXRTdGFydCgpKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXROZXh0KCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZSZWdpb25zKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbkNvbnRhaW5lciBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFBhcmVudERvY3VtZW50KCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFByZXZpb3VzKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uTGlzdCBnZXRSZWdpb25zKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3QgPSBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmlyc3QgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZmlyc3QuZ2V0U3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdCA9IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmaXJzdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBmaXJzdC5nZXRQYXJlbnREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZmxhdE5vZGVzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHRoaXMuZmxhdE5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICovCi0JaW50IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCkgewotCQlyZXR1cm4gdGhpcy5mbGF0Tm9kZXMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJaW50IHNpemUgPSB0aGlzLmZsYXROb2Rlcy5zaXplKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB0aGlzLmZsYXROb2Rlcy5lbGVtZW50QXQoaSk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWJ1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoU3RyaW5nIGNvbnRleHQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBnZXRFbmQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRUZXh0RW5kKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSB0ZXh0IGxlbmd0aCBpcyBlcXVhbCB0byBsZW5ndGggaWYgdGhlcmUgaXMgbm8gd2hpdGUgc3BhY2UgYXQgdGhlCi0JICogZW5kIG9mIGEgcmVnaW9uLiBPdGhlcndpc2UgaXQgaXMgc21hbGxlciB0aGFuIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiAoZ2V0VGV4dEVuZCgpIC0gZ2V0U3RhcnQoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gIlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIGludCBpbmRleCkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybjsKLQkJaW50IHNpemUgPSB0aGlzLmZsYXROb2Rlcy5zaXplKCk7Ci0JCWlmIChpbmRleCA+IHNpemUpCi0JCQlyZXR1cm47Ci0JCWlmIChpbmRleCA9PSBzaXplKSB7Ci0JCQlhcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuZmxhdE5vZGVzLmluc2VydEVsZW1lbnRBdChmbGF0Tm9kZSwgaW5kZXgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW5kZWQoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5mbGF0Tm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgdGhpcy5mbGF0Tm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQkJdGhpcy5mbGF0Tm9kZXMucmVtb3ZlRWxlbWVudEF0KGluZGV4KTsKLQkJcmV0dXJuIGZsYXROb2RlOwotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgc2l6ZSA9IHRoaXMuZmxhdE5vZGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgdGhpcy5mbGF0Tm9kZXMuZWxlbWVudEF0KGkpOwotCQkJaWYgKGZsYXROb2RlID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCXRoaXMuZmxhdE5vZGVzLnJlbW92ZUVsZW1lbnRBdChpKTsKLQkJCQlyZXR1cm4gZmxhdE5vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7IC8vIG5vdCBmb3VuZAotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGluZGV4KTsKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmZsYXROb2Rlcy5zaXplKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgdGhpcy5mbGF0Tm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQkJdGhpcy5mbGF0Tm9kZXMuc2V0RWxlbWVudEF0KGZsYXROb2RlLCBpbmRleCk7Ci0JCXJldHVybiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVRleHRSZWdpb24gb2xkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXdSZWdpb24sIGludCBzaGlmdCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuZGVkKGJvb2xlYW4gaGFzRW5kKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBuZXdMZW5ndGgpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3TmV4dCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmV2aW91cyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1ByZXZpb3VzKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVnaW9ucyhJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRSZWdpb25zKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IG5ld1N0YXJ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogdG9TdHJpbmcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgneycpOwotCQlpbnQgY291bnQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWlmIChpICE9IDApCi0JCQkJYnVmZmVyLmFwcGVuZCgnLCcpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQoIm51bGwiKTsvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS50b1N0cmluZygpKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCd9Jyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdG5vZGUsIFN0cmluZyBjaGFuZ2VzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZCgpIHsKLQkJLy8gaWYgc29tZW9uZSAiZ2V0cyIgdGhlc2UgdGVtcCByZWdpb25zIGJ5Ci0JCS8vIGFjY2lkZW50LCB3ZSdsbCBhbHdheXMgcmV0dXJuICJkZWxldGVkIi4KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXREZWxldGVkKGJvb2xlYW4gZGVsZXRlZCkgewotCQkvLyBkbyBub3RoaW5nCi0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGZlY2JlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCJJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1hbmFnZW1lbnQgZmFpbGVkLiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMTIyNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDI5Njk5OSAtIEluZWZmaWNpZW50IHVzZSBvZiBuZXcgU3RyaW5nKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi0KLWNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCi0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMDsKLQotCS8qKgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcigpOwotCi0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQkJdGhpcy5mbGF0Tm9kZSA9IGZsYXROb2RlOwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5vZmZzZXQgLT0gdGhpcy5mbGF0Tm9kZS5nZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlZ2lvbihJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3QoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXREZWVwZXN0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlpbnQgZmxhdE5vZGVPZmZzZXQgPSAwOwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJZmxhdE5vZGVPZmZzZXQgPSB0aGlzLmZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCXJldHVybiBmbGF0Tm9kZU9mZnNldCArIHRoaXMub2Zmc2V0ICsgdGhpcy5sZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRFbmQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0Rmlyc3RSZWdpb24oKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dCgpIHsKLQkJcmV0dXJuIGdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiB0aGlzLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXROZXh0KCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZSZWdpb25zKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCWludCBnZXRPZmZzZXQoKSB7Ci0JCWludCBmbGF0Tm9kZU9mZnNldCA9IDA7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQlmbGF0Tm9kZU9mZnNldCA9IHRoaXMuZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJcmV0dXJuIGZsYXROb2RlT2Zmc2V0ICsgdGhpcy5vZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uQ29udGFpbmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0UGFyZW50RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCQkvLyB0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlcgotCQkvLyBiZSBjYWxsZWQiKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2aW91cygpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbkxpc3QgZ2V0UmVnaW9ucygpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlpbnQgZmxhdE5vZGVPZmZzZXQgPSAwOwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJZmxhdE5vZGVPZmZzZXQgPSB0aGlzLmZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCXJldHVybiBmbGF0Tm9kZU9mZnNldCArIHRoaXMub2Zmc2V0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKiAKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZmxhdE5vZGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlpZiAodGhpcy5mbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJU3RyaW5nIHRleHQgPSB0aGlzLmZsYXROb2RlLmdldFRleHQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCWludCBlbmQgPSB0aGlzLm9mZnNldCArIHRoaXMubGVuZ3RoOwotCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcodGhpcy5vZmZzZXQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoU3RyaW5nIGNvbnRleHQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBnZXRFbmQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRUZXh0RW5kKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSB0ZXh0IGxlbmd0aCBpcyBlcXVhbCB0byBsZW5ndGggaWYgdGhlcmUgaXMgbm8gd2hpdGUgc3BhY2UgYXQgdGhlCi0JICogZW5kIG9mIGEgcmVnaW9uLiBPdGhlcndpc2UgaXQgaXMgc21hbGxlciB0aGFuIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiAiU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoKSB7Ci0JCS8vIEknbGwgYXNzdW1lIG5ldmVyIHJlYWxseSBuZWVkZWQgaGVyZQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZGVkKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWxldGVkKGJvb2xlYW4gZGVsZXRlZCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuZGVkKGJvb2xlYW4gaGFzRW5kKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaGFkIHRvIG1ha2UgcHVibGljLCBkdWUgdG8gQVBJIHRyYW5zaXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpIHsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05leHQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5vZmZzZXQgLT0gdGhpcy5mbGF0Tm9kZS5nZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmV2aW91cyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1ByZXZpb3VzKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVnaW9ucyhJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRSZWdpb25zKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IG5ld1N0YXJ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5vZmZzZXQgKz0gdGhpcy5mbGF0Tm9kZS5nZXRTdGFydCgpOwotCQl0aGlzLmZsYXROb2RlID0gZmxhdE5vZGU7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQl0aGlzLm9mZnNldCAtPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCX0KLQotCS8qKgotCSAqIHRvU3RyaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJ1snKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRTdGFydCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnLCcpOwotCQlidWZmZXIuYXBwZW5kKGdldEVuZCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnXScpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHRoaXMuZmxhdE5vZGUudG9TdHJpbmcoKSk7Ci0JCWVsc2UKLQkJCWJ1ZmZlci5hcHBlbmQoIm51bGwiKTsvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0bm9kZSwgU3RyaW5nIGNoYW5nZXMsIGludCBzdGFydCwgaW50IGVuZCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YTM3OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogUHJvdmlkZXMgY29udmVuaWVudCBmdW5jdGlvbnMgdG8gaGFuZGxlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5kCi0gKiBJVGV4dFJlZ2lvbi4KLSAqLwotY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbCB7Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyBjb250ZW50cyBlbmNsb3NlZCB3aXRoIHF1b3Rlcy4gUXVvdGVzIG1heSBiZSBkb3VibGUgb3Igc2luZ2xlLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0QXR0clZhbHVlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHZhbHVlID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybiB2YWx1ZTsKLQkJY2hhciBmaXJzdENoYXIgPSB2YWx1ZS5jaGFyQXQoMCk7Ci0JCWlmIChmaXJzdENoYXIgPT0gJyInIHx8IGZpcnN0Q2hhciA9PSAnXCcnKSB7Ci0JCQlpZiAobGVuZ3RoID09IDEpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAodmFsdWUuY2hhckF0KGxlbmd0aCAtIDEpID09IGZpcnN0Q2hhcikKLQkJCQlsZW5ndGgtLTsKLQkJCXJldHVybiB2YWx1ZS5zdWJzdHJpbmcoMSwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogRXh0cmFjdHMgdGhlIG5hbWUgd2l0aG91dCBoZWFkaW5nICcmJyBhbmQgdGFpbGluZyAnOycuCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRFbnRpdHlSZWZOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHJlZiA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJaW50IGxlbmd0aCA9IHJlZi5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIHJlZjsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWlmIChyZWYuY2hhckF0KDApID09ICcmJykKLQkJCW9mZnNldCA9IDE7Ci0JCWlmIChyZWYuY2hhckF0KGxlbmd0aCAtIDEpID09ICc7JykKLQkJCWxlbmd0aC0tOwotCQlpZiAob2Zmc2V0ID49IGxlbmd0aCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcmVmLnN1YnN0cmluZyhvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgcmVnaW9uLgotCSAqLwotCXN0YXRpYyBJVGV4dFJlZ2lvbiBnZXRGaXJzdFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCWZsYXROb2RlID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSlmbGF0Tm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcmVnaW9ucy5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZmlyc3QgcmVnaW9uLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0Rmlyc3RSZWdpb25UeXBlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KWZsYXROb2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCXJldHVybiByZWdpb24uZ2V0VHlwZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlmbGF0Tm9kZSA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZSkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGZsYXROb2RlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxhc3QgcmVnaW9uLgotCSAqLwotCXN0YXRpYyBJVGV4dFJlZ2lvbiBnZXRMYXN0UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KWZsYXROb2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGZpcnN0IHJlZ2lvbi4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldExhc3RSZWdpb25UeXBlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KWZsYXROb2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJcmV0dXJuIHJlZ2lvbi5nZXRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0Jc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGUpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGZsYXROb2RlOwotCX0KLQotCS8qKgotCSAqLwotCXN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlmbGF0Tm9kZSA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQlyZXR1cm4gZmxhdE5vZGU7Ci0JfQotCi0JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RhZ0FkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGFnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDlmZjdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGFnQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFnQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKi8KLQlTdHJpbmcgZ2V0RW5kVGFnKElET01FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICovCi0JU3RyaW5nIGdldFN0YXJ0VGFnKElET01FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBpc0VuZFRhZygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UZXh0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UZXh0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWQzMjA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGV4dEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICogICAgIEJhbGF6cyBCYW5mYWk6IEJ1ZyAxNTQ3MzcgZ2V0VXNlckRhdGEvc2V0VXNlckRhdGEgc3VwcG9ydCBmb3IgTm9kZQotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ3MzcKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gYnVnIDI5Njk5OSAtIEluZWZmaWNpZW50IHVzZSBvZiBuZXcgU3RyaW5nKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLS8qKgotICogVGV4dEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIFRleHRJbXBsIGV4dGVuZHMgQ2hhcmFjdGVyRGF0YUltcGwgaW1wbGVtZW50cyBJRE9NVGV4dCB7Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFN0cmluZ1BhaXIgewotCQlwcml2YXRlIFN0cmluZyBmRmlyc3QgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBmU2Vjb25kID0gbnVsbDsKLQotCQlTdHJpbmdQYWlyKFN0cmluZyBmaXJzdCwgU3RyaW5nIHNlY29uZCkgewotCQkJdGhpcy5mRmlyc3QgPSBmaXJzdDsKLQkJCXRoaXMuZlNlY29uZCA9IHNlY29uZDsKLQkJfQotCi0JCVN0cmluZyBnZXRGaXJzdCgpIHsKLQkJCXJldHVybiB0aGlzLmZGaXJzdDsKLQkJfQotCi0JCVN0cmluZyBnZXRTZWNvbmQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mU2Vjb25kOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZlNvdXJjZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUZXh0SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBUZXh0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXh0SW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBUZXh0SW1wbAotCSAqLwotCXByb3RlY3RlZCBUZXh0SW1wbChUZXh0SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMuZlNvdXJjZSA9IHRoYXQuZ2V0U291cmNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhcHBlbmREYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBhcmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmREYXRhKFN0cmluZyBhcmcpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoYXJnID09IG51bGwgfHwgYXJnLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQlTdHJpbmcgbmV3U291cmNlID0gZ2V0U291cmNlKGFyZyk7Ci0JCWlmIChuZXdTb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQlzZXRUZXh0U291cmNlKHNvdXJjZSArIG5ld1NvdXJjZSk7Ci0JCWVsc2UKLQkJCXNldFRleHRTb3VyY2UobmV3U291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCXJldHVybiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKCk7Ci0JCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250YWluZXIpOwotCQl9Ci0KLQkJcmV0dXJuIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBhcHBlbmRUZXh0IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5UZXh0Ci0JICovCi0JcHVibGljIHZvaWQgYXBwZW5kVGV4dChUZXh0IG5ld1RleHQpIHsKLQkJaWYgKG5ld1RleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCi0JCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG5ld1RleHQ7Ci0JCVN0cmluZyBuZXdTb3VyY2UgPSB0ZXh0LmdldFNvdXJjZSgpOwotCQlpZiAobmV3U291cmNlID09IG51bGwgfHwgbmV3U291cmNlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJc2V0VGV4dFNvdXJjZShzb3VyY2UgKyBuZXdTb3VyY2UpOwotCQllbHNlCi0JCQlzZXRUZXh0U291cmNlKG5ld1NvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlUZXh0SW1wbCBjbG9uZWQgPSBuZXcgVGV4dEltcGwodGhpcyk7Ci0JCW5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVELCBjbG9uZWQpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGRlbGV0ZURhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuOwotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCQlpZiAoY291bnQgPCAwIHx8IG9mZnNldCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlKCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCQlTdHJpbmdQYWlyIHBhaXIgPSBzdWJzdHJpbmdTb3VyY2VFeGNsdWRlZChzb3VyY2UsIG9mZnNldCwgY291bnQpOwotCQlpZiAocGFpciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzb3VyY2UgPSBudWxsOwotCQlTdHJpbmcgZmlyc3QgPSBwYWlyLmdldEZpcnN0KCk7Ci0JCWlmIChmaXJzdCAhPSBudWxsKQotCQkJc291cmNlID0gZmlyc3Q7Ci0JCVN0cmluZyBzZWNvbmQgPSBwYWlyLmdldFNlY29uZCgpOwotCQlpZiAoc2Vjb25kICE9IG51bGwpIHsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlzb3VyY2UgKz0gc2Vjb25kOwotCQkJZWxzZQotCQkJCXNvdXJjZSA9IHNlY29uZDsKLQkJfQotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlzb3VyY2UgPSBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7IC8vIGRlbGV0ZSBhbGwKLQkJc2V0VGV4dFNvdXJjZShzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIGdldERhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmZTb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiBnZXREYXRhKHRoaXMuZlNvdXJjZSk7Ci0JCVN0cmluZyBkYXRhID0gc3VwZXIuZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJcmV0dXJuIGRhdGE7Ci0JCXJldHVybiBnZXREYXRhKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREYXRhKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaW50IGxlbmd0aCA9IGNvbnRhaW5lci5nZXRMZW5ndGgoKTsKLQkJCWlmIChsZW5ndGggPCAxNikKLQkJCQlsZW5ndGggPSAxNjsgLy8gZGVmYXVsdAotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoY29udGVudCk7Ci0JCQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJYnVmZmVyLmFwcGVuZChkYXRhKTsKLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dCgpOwotCQl9Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEVudGl0eVJlZk5hbWUoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgdmFsdWUgPSBkb2N1bWVudC5nZXRDaGFyVmFsdWUobmFtZSk7Ci0JCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZGF0YSBmb3IgdGhlIHNvdXJjZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERhdGEoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpbnQgcmVmID0gc291cmNlLmluZGV4T2YoJyYnKTsKLQkJd2hpbGUgKHJlZiA+PSAwKSB7Ci0JCQlpbnQgZW5kID0gc291cmNlLmluZGV4T2YoJzsnLCByZWYgKyAxKTsKLQkJCWlmIChlbmQgPiByZWYgKyAxKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBzb3VyY2Uuc3Vic3RyaW5nKHJlZiArIDEsIGVuZCk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gZ2V0Q2hhclZhbHVlKG5hbWUpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKLQkJCQkJaWYgKHJlZiA+IG9mZnNldCkKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhvZmZzZXQsIHJlZikpOwotCQkJCQlidWZmZXIuYXBwZW5kKHZhbHVlKTsKLQkJCQkJb2Zmc2V0ID0gZW5kICsgMTsKLQkJCQkJcmVmID0gZW5kOwotCQkJCX0KLQkJCX0KLQkJCXJlZiA9IHNvdXJjZS5pbmRleE9mKCcmJywgcmVmICsgMSk7Ci0JCX0KLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIHNvdXJjZTsKLQkJaWYgKGxlbmd0aCA+IG9mZnNldCkKLQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhvZmZzZXQpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gIiN0ZXh0IjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFRFWFRfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLQkJaWYgKHRoaXMuZlNvdXJjZSAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMuZlNvdXJjZTsKLQkJU3RyaW5nIGRhdGEgPSBzdXBlci5nZXREYXRhKCk7Ci0JCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoZGF0YSk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJcmV0dXJuIHNvdXJjZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzb3VyY2UgZm9yIHRoZSBkYXRhCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U291cmNlKFN0cmluZyBkYXRhKSB7Ci0JCWlmIChkYXRhID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSURPTU1vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJSVNvdXJjZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBtb2RlbC5nZXRHZW5lcmF0b3IoKTsKLQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCXJldHVybiBnZW5lcmF0b3IuZ2VuZXJhdGVUZXh0RGF0YSh0aGlzLCBkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlTdHJpbmcgZ2V0VGV4dFNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZlNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlU291cmNlKCkgewotCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBoYXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhc2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAoYXNrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChmbGF0Tm9kZSA9PSBhc2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gYXNrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudCA9PSBhc2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IGFza2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGluc2VydERhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydERhdGEoaW50IG9mZnNldCwgU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChhcmcgPT0gbnVsbCB8fCBhcmcubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlKCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UubGVuZ3RoKCkgPT0gMCkgewotCQkJaWYgKG9mZnNldCA+IDApIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQkJfQotCQkJc291cmNlID0gZ2V0U291cmNlKGFyZyk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJc2V0VGV4dFNvdXJjZShzb3VyY2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nUGFpciBwYWlyID0gc3Vic3RyaW5nU291cmNlRXhjbHVkZWQoc291cmNlLCBvZmZzZXQsIDApOwotCQlpZiAocGFpciA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzb3VyY2UubGVuZ3RoKCkgKyBhcmcubGVuZ3RoKCkpOwotCQlTdHJpbmcgZmlyc3QgPSBwYWlyLmdldEZpcnN0KCk7Ci0JCWlmIChmaXJzdCAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChmaXJzdCk7Ci0JCXNvdXJjZSA9IGdldFNvdXJjZShhcmcpOwotCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHNvdXJjZSk7Ci0JCVN0cmluZyBzZWNvbmQgPSBwYWlyLmdldFNlY29uZCgpOwotCQlpZiAoc2Vjb25kICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHNlY29uZCk7Ci0JCXNldFRleHRTb3VyY2UoYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCi0JCWlmIChmbGF0Tm9kZSA9PSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcigpOwotCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyKTsKLQkJCXJldHVybiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCWNvbnRhaW5lci5pbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpKTsKLQkJCQkJcmV0dXJuIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBlcnJvcgotCX0KLQotCS8qKgotCSAqIGluc2VydFRleHQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLlRleHQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnRUZXh0KFRleHQgbmV3VGV4dCwgaW50IG9mZnNldCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdUZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0JCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG5ld1RleHQ7Ci0JCVN0cmluZyBuZXdTb3VyY2UgPSB0ZXh0LmdldFNvdXJjZSgpOwotCQlpZiAobmV3U291cmNlID09IG51bGwgfHwgbmV3U291cmNlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0JCWlmIChvZmZzZXQgPCAwKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQl9Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlID09IG51bGwgfHwgc291cmNlLmxlbmd0aCgpID09IDApIHsKLQkJCWlmIChvZmZzZXQgPiAwKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJCX0KLQkJCXNldFRleHRTb3VyY2UobmV3U291cmNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZ1BhaXIgcGFpciA9IHN1YnN0cmluZ1NvdXJjZUV4Y2x1ZGVkKHNvdXJjZSwgb2Zmc2V0LCAwKTsKLQkJaWYgKHBhaXIgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc291cmNlLmxlbmd0aCgpICsgbmV3U291cmNlLmxlbmd0aCgpKTsKLQkJU3RyaW5nIGZpcnN0ID0gcGFpci5nZXRGaXJzdCgpOwotCQlpZiAoZmlyc3QgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZmlyc3QpOwotCQlidWZmZXIuYXBwZW5kKG5ld1NvdXJjZSk7Ci0JCVN0cmluZyBzZWNvbmQgPSBwYWlyLmdldFNlY29uZCgpOwotCQlpZiAoc2Vjb25kICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHNlY29uZCk7Ci0JCXNldFRleHRTb3VyY2UoYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIGlzQ0RBVEFDb250ZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ0RBVEFDb250ZW50KCkgewotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuIGZhbHNlOwotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCXJldHVybiBlbGVtZW50LmlzQ0RBVEFDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ludmFsaWQoKSB7Ci0JCXJldHVybiBpc0ludmFsaWQoZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ludmFsaWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoaXNJbnZhbGlkKGNvbnRlbnQpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQlyZXR1cm4gaXNJbnZhbGlkKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJfQotCi0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlpZiAocmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UICYmIGlzTm90TmVzdGVkQ29udGVudChyZWdpb25UeXBlKSAmJiByZWdpb25UeXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UgJiYgcmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSAmJiByZWdpb25UeXBlICE9IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCAmJiByZWdpb25UeXBlICE9IERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTm90TmVzdGVkQ29udGVudChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBpc1NoYXJpbmdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGZsYXROb2RlID09IHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChjb250ZW50ID09IHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdGV4dCBub2RlIGNvbnRhaW5zIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwNC9SRUMteG1sLWluZm9zZXQtMjAwNDAyMDQjaW5mb2l0ZW0uY2hhcmFjdGVyJz4KLQkgKiBlbGVtZW50IGNvbnRlbnQgd2hpdGVzcGFjZTwvYT4sIG9mdGVuIGFidXNpdmVseSBjYWxsZWQgImlnbm9yYWJsZQotCSAqIHdoaXRlc3BhY2UiLiBUaGUgdGV4dCBub2RlIGlzIGRldGVybWluZWQgdG8gY29udGFpbiB3aGl0ZXNwYWNlIGluCi0JICogZWxlbWVudCBjb250ZW50IGR1cmluZyB0aGUgbG9hZCBvZiB0aGUgZG9jdW1lbnQgb3IgaWYgdmFsaWRhdGlvbiBvY2N1cnMKLQkgKiB3aGlsZSB1c2luZyA8Y29kZT5Eb2N1bWVudC5ub3JtYWxpemVEb2N1bWVudCgpPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbGVtZW50Q29udGVudFdoaXRlc3BhY2UoKSB7Ci0JCXJldHVybiBpc1doaXRlc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1doaXRlc3BhY2UoKSB7Ci0JCVN0cmluZyBkYXRhID0gZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoZGF0YS5jaGFyQXQoaSkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0KLQkJaWYgKGZsYXROb2RlID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJLy8gcmVtb3ZlZCB3aXRoIHByb3h5Ci0JCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJCXJldHVybiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCWlmIChjb250ZW50ID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQljb250YWluZXIucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCQlpZiAoY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCkgPT0gMSkgewotCQkJCQkJLy8gZ2V0IGJhY2sgdG8gc2luZ2xlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKDApKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCX0KLQotCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJCS8vIHJlbW92ZWQgd2l0aCBwcm94eQotCQkJCQkJY29udGFpbmVyLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQkJCWlmIChjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKSA9PSAxKSB7Ci0JCQkJCQkJLy8gZ2V0IGJhY2sgdG8gc2luZ2xlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigwKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlRGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gY291bnQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBhcmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBsYWNlRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQsIFN0cmluZyBhcmcpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCQlpZiAoYXJnID09IG51bGwgfHwgYXJnLmxlbmd0aCgpID09IDApIHsKLQkJCWRlbGV0ZURhdGEob2Zmc2V0LCBjb3VudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGNvdW50ID09IDApIHsKLQkJCWluc2VydERhdGEob2Zmc2V0LCBhcmcpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChvZmZzZXQgPCAwIHx8IGNvdW50IDwgMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsIHx8IHNvdXJjZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQl9Ci0KLQkJU3RyaW5nUGFpciBwYWlyID0gc3Vic3RyaW5nU291cmNlRXhjbHVkZWQoc291cmNlLCBvZmZzZXQsIGNvdW50KTsKLQkJaWYgKHBhaXIgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc291cmNlLmxlbmd0aCgpICsgYXJnLmxlbmd0aCgpKTsKLQkJU3RyaW5nIGZpcnN0ID0gcGFpci5nZXRGaXJzdCgpOwotCQlpZiAoZmlyc3QgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZmlyc3QpOwotCQlzb3VyY2UgPSBnZXRTb3VyY2UoYXJnKTsKLQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChzb3VyY2UpOwotCQlTdHJpbmcgc2Vjb25kID0gcGFpci5nZXRTZWNvbmQoKTsKLQkJaWYgKHNlY29uZCAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChzZWNvbmQpOwotCQlzZXRUZXh0U291cmNlKGJ1ZmZlci50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCi0JCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCS8vIHByb3h5IG11c3Qgbm90IGJlIG5lc3RlZAotCQkJCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCX0KLQkJCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJfQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQlpZiAoY29udGVudCA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJY29udGFpbmVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpKTsKLQkJCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQl9Ci0KLQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJCQkvLyBwcm94eSBtdXN0IG5vdCBiZSBuZXN0ZWQKLQkJCQkJCQljb250YWluZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpIHsKLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmxlbmd0aCgpID4gMCkKLQkJCXRoaXMuZlNvdXJjZSA9IHNvdXJjZTsKLQkJc3VwZXIucmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQl0aGlzLmZTb3VyY2UgPSBudWxsOwotCQlzdXBlci5zZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShTdHJpbmcgc291cmNlKSB0aHJvd3MgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0KLQkJU291cmNlVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBTb3VyY2VWYWxpZGF0b3IodGhpcyk7Ci0JCWlmICh2YWxpZGF0b3IudmFsaWRhdGVTb3VyY2Uoc291cmNlKSkKLQkJCXNldFRleHRTb3VyY2Uoc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5mU291cmNlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0U291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIERPTU1lc3NhZ2VzLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUik7Ci0JCX0KLQotCQl0aGlzLmZTb3VyY2UgPSBzb3VyY2U7Ci0KLQkJbm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgRE9NTWVzc2FnZXMuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSKTsKLQkJfQotCi0JCVNvdXJjZVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU291cmNlVmFsaWRhdG9yKHRoaXMpOwotCQlzZXRUZXh0U291cmNlKHZhbGlkYXRvci5jb252ZXJ0U291cmNlKHNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIHNwbGl0VGV4dCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLlRleHQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgVGV4dCBzcGxpdFRleHQoaW50IG9mZnNldCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBET01NZXNzYWdlcy5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIpOwotCQl9Ci0JCWlmIChvZmZzZXQgPCAwKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQl9Ci0JCWludCBsZW5ndGggPSBnZXRMZW5ndGgoKTsKLQkJaWYgKG9mZnNldCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCQlEb2N1bWVudCBkb2N1bWVudCA9IGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgc291cmNlID0gbnVsbDsKLQkJaWYgKG9mZnNldCA8IGxlbmd0aCkgewotCQkJaW50IGNvdW50ID0gbGVuZ3RoIC0gb2Zmc2V0OwotCQkJc291cmNlID0gc3Vic3RyaW5nU291cmNlKG9mZnNldCwgY291bnQpOwotCQkJZGVsZXRlRGF0YShvZmZzZXQsIGNvdW50KTsKLQkJfQotCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShudWxsKTsKLQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJdGV4dC5zZXRUZXh0U291cmNlKHNvdXJjZSk7Ci0KLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXBhcmVudC5pbnNlcnRCZWZvcmUodGV4dCwgZ2V0TmV4dFNpYmxpbmcoKSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICovCi0JVGV4dCBzcGxpdFRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsIHx8ICEoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0KLQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJaW50IGluZGV4ID0gMDsKLQkJZm9yICg7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKLQkJCWlmIChjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGluZGV4KSA9PSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpbmRleCA+PSBjb3VudCkgewotCQkJLy8gdGhpcyBpcyB0aGUgY2FzZSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIGEgbmV3Ci0JCQkvLyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkvLyBzZWFyY2ggZ2FwIGJ5IG9mZnNldAotCQkJaW50IG9mZnNldCA9IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbmRleCk7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJY29udGludWU7IC8vIGVycm9yCi0JCQkJaWYgKGNvbnRlbnQuZ2V0U3RhcnQoKSA+PSBvZmZzZXQpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGluZGV4ID49IGNvdW50KQotCQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQl9Ci0JCWlmIChpbmRleCA9PSAwKQotCQkJcmV0dXJuIHRoaXM7IC8vIG5vdGhpbmcgdG8gZG8KLQotCQlEb2N1bWVudCBkb2N1bWVudCA9IGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQlUZXh0SW1wbCBuZXh0VGV4dCA9IChUZXh0SW1wbCkgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobnVsbCk7Ci0JCWlmIChuZXh0VGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0KLQkJZm9yICg7IGluZGV4IDwgY291bnQ7IGNvdW50LS0pIHsKLQkJCW5leHRUZXh0LmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250YWluZXIucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGluZGV4KSk7Ci0JCX0KLQotCQkvLyBub3JtYWxpemUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQlpZiAoaW5kZXggPT0gMSkgewotCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oMCkpOwotCQl9Ci0KLQkJcGFyZW50Lmluc2VydEJlZm9yZShuZXh0VGV4dCwgZ2V0TmV4dFNpYmxpbmcoKSk7Ci0JCXJldHVybiBuZXh0VGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRydW5zIGRhdGEgZm9yIHRoZSByYW5nZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIHN1YnN0cmluZ0RhdGEoU3RyaW5nIGRhdGEsIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIHN1cmUgb2Zmc2V0IGFuZCBjb3VudCBhcmUgbm9uLW5lZ2F0aXZlCi0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuIE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJaWYgKG9mZnNldCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCQlpbnQgZW5kID0gb2Zmc2V0ICsgY291bnQ7Ci0JCWlmIChlbmQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCX0KLQkJcmV0dXJuIGRhdGEuc3Vic3RyaW5nKG9mZnNldCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHNvdXJjZSBmb3IgdGhlIHJhbmdlIHNwZWNpZmllZCBieTogb2Zmc2V0OiBkYXRhIG9mZnNldCBjb3VudDoKLQkgKiBkYXRhIGNvdW50Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgc3Vic3RyaW5nU291cmNlKGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIHN1cmUgb2Zmc2V0IGFuZCBjb3VudCBhcmUgbm9uLW5lZ2F0aXZlCi0JCWlmICh0aGlzLmZTb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiBzdWJzdHJpbmdTb3VyY2UodGhpcy5mU291cmNlLCBvZmZzZXQsIGNvdW50KTsKLQotCQlTdHJpbmcgZGF0YSA9IHN1cGVyLmdldERhdGEoKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCgpID4gMCkgewotCQkJZGF0YSA9IHN1YnN0cmluZ0RhdGEoZGF0YSwgb2Zmc2V0LCBjb3VudCk7Ci0JCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJCXJldHVybiBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCQlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlKGRhdGEpOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJCXJldHVybiBzb3VyY2U7Ci0JCX0KLQotCQlyZXR1cm4gc3Vic3RyaW5nU291cmNlKGdldFNvdXJjZSgpLCBvZmZzZXQsIGNvdW50KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHNvdXJjZSBmb3IgdGhlIHJhbmdlIHNwZWNpZmllZCBieTogb2Zmc2V0OiBkYXRhIG9mZnNldCBjb3VudDoKLQkgKiBkYXRhIGNvdW50Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgc3Vic3RyaW5nU291cmNlKFN0cmluZyBzb3VyY2UsIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIHN1cmUgb2Zmc2V0IGFuZCBjb3VudCBhcmUgbm9uLW5lZ2F0aXZlCi0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuIE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQl9Ci0KLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJaW50IGVuZCA9IG9mZnNldCArIGNvdW50OwotCi0JCS8vIGZpbmQgY2hhcmFjdGVyIHJlZmVyZW5jZQotCQlpbnQgcmVmID0gc291cmNlLmluZGV4T2YoJyYnKTsKLQkJd2hpbGUgKHJlZiA+PSAwKSB7Ci0JCQlpZiAocmVmID49IGVuZCkKLQkJCQlicmVhazsKLQkJCWludCByZWZFbmQgPSBzb3VyY2UuaW5kZXhPZignOycsIHJlZiArIDEpOwotCQkJaWYgKHJlZkVuZCA+IHJlZiArIDEpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcocmVmICsgMSwgcmVmRW5kKTsKLQkJCQlpZiAoZ2V0Q2hhclZhbHVlKG5hbWUpICE9IG51bGwpIHsKLQkJCQkJLy8gZm91bmQsIHNoaWZ0IGZvciBzb3VyY2Ugb2Zmc2V0cwotCQkJCQlpbnQgcmVmQ291bnQgPSByZWZFbmQgLSByZWY7Ci0JCQkJCWlmIChyZWYgPCBvZmZzZXQpCi0JCQkJCQlvZmZzZXQgKz0gcmVmQ291bnQ7Ci0JCQkJCWlmIChyZWYgPCBlbmQpCi0JCQkJCQllbmQgKz0gcmVmQ291bnQ7Ci0JCQkJCXJlZiA9IHJlZkVuZDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZWYgPSBzb3VyY2UuaW5kZXhPZignJicsIHJlZiArIDEpOwotCQl9Ci0KLQkJaWYgKG9mZnNldCA+IGxlbmd0aCB8fCBlbmQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBET01NZXNzYWdlcy5JTkRFWF9TSVpFX0VSUik7Ci0JCX0KLQotCQlyZXR1cm4gc291cmNlLnN1YnN0cmluZyhvZmZzZXQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzb3VyY2VzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHJhbmdlIHNwZWNpZmllZCBieTogb2Zmc2V0OiBkYXRhCi0JICogb2Zmc2V0IGNvdW50OiBkYXRhIGNvdW50Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmdQYWlyIHN1YnN0cmluZ1NvdXJjZUV4Y2x1ZGVkKFN0cmluZyBzb3VyY2UsIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIHN1cmUgb2Zmc2V0IGFuZCBjb3VudCBhcmUgbm9uLW5lZ2F0aXZlCi0JCWlmIChzb3VyY2UgPT0gbnVsbCkgewotCQkJaWYgKG9mZnNldCA9PSAwICYmIGNvdW50ID09IDApCi0JCQkJcmV0dXJuIG5ldyBTdHJpbmdQYWlyKG51bGwsIG51bGwpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIERPTU1lc3NhZ2VzLklOREVYX1NJWkVfRVJSKTsKLQkJfQotCi0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQotCQkvLyBmaW5kIGNoYXJhY3RlciByZWZlcmVuY2UKLQkJaW50IHJlZiA9IHNvdXJjZS5pbmRleE9mKCcmJyk7Ci0JCXdoaWxlIChyZWYgPj0gMCkgewotCQkJaWYgKHJlZiA+PSBlbmQpCi0JCQkJYnJlYWs7Ci0JCQlpbnQgcmVmRW5kID0gc291cmNlLmluZGV4T2YoJzsnLCByZWYgKyAxKTsKLQkJCWlmIChyZWZFbmQgPiByZWYgKyAxKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBzb3VyY2Uuc3Vic3RyaW5nKHJlZiArIDEsIHJlZkVuZCk7Ci0JCQkJaWYgKGdldENoYXJWYWx1ZShuYW1lKSAhPSBudWxsKSB7Ci0JCQkJCS8vIGZvdW5kLCBzaGlmdCBmb3Igc291cmNlIG9mZnNldHMKLQkJCQkJaW50IHJlZkNvdW50ID0gcmVmRW5kIC0gcmVmOwotCQkJCQlpZiAocmVmIDwgb2Zmc2V0KQotCQkJCQkJb2Zmc2V0ICs9IHJlZkNvdW50OwotCQkJCQlpZiAocmVmIDwgZW5kKQotCQkJCQkJZW5kICs9IHJlZkNvdW50OwotCQkJCQlyZWYgPSByZWZFbmQ7Ci0JCQkJfQotCQkJfQotCQkJcmVmID0gc291cmNlLmluZGV4T2YoJyYnLCByZWYgKyAxKTsKLQkJfQotCi0JCWlmIChvZmZzZXQgPiBsZW5ndGggfHwgZW5kID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgRE9NTWVzc2FnZXMuSU5ERVhfU0laRV9FUlIpOwotCQl9Ci0KLQkJU3RyaW5nIGZpcnN0ID0gKG9mZnNldCA+IDAgPyBzb3VyY2Uuc3Vic3RyaW5nKDAsIG9mZnNldCkgOiBudWxsKTsKLQkJU3RyaW5nIHNlY29uZCA9IChlbmQgPCBsZW5ndGggPyBzb3VyY2Uuc3Vic3RyaW5nKGVuZCwgbGVuZ3RoKSA6IG51bGwpOwotCQlyZXR1cm4gbmV3IFN0cmluZ1BhaXIoZmlyc3QsIHNlY29uZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXaG9sZVRleHQoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IEltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLSAgICAvKioKLQkgKiBSZXBsYWNlcyB0aGUgdGV4dCBvZiB0aGUgY3VycmVudCBub2RlIGFuZCBhbGwgbG9naWNhbGx5LWFkamFjZW50IHRleHQKLQkgKiBub2RlcyB3aXRoIHRoZSBzcGVjaWZpZWQgdGV4dC4gQWxsIGxvZ2ljYWxseS1hZGphY2VudCB0ZXh0IG5vZGVzIGFyZQotCSAqIHJlbW92ZWQgaW5jbHVkaW5nIHRoZSBjdXJyZW50IG5vZGUgdW5sZXNzIGl0IHdhcyB0aGUgcmVjaXBpZW50IG9mIHRoZQotCSAqIHJlcGxhY2VtZW50IHRleHQuIDxicj4KLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBub2RlIHdoaWNoIHJlY2VpdmVkIHRoZSByZXBsYWNlbWVudCB0ZXh0LiBUaGUKLQkgKiByZXR1cm5lZCBub2RlIGlzOgotCSAqIDx1bD4KLQkgKiA8bGk+PGNvZGU+bnVsbDwvY29kZT4sIHdoZW4gdGhlIHJlcGxhY2VtZW50IHRleHQgaXMgdGhlIGVtcHR5Ci0JICogc3RyaW5nOyA8L2xpPgotCSAqIDxsaT50aGUgY3VycmVudCBub2RlLCBleGNlcHQgd2hlbiB0aGUgY3VycmVudCBub2RlIGlzIHJlYWQtb25seTsgPC9saT4KLQkgKiA8bGk+IGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUgb2YgdGhlIHNhbWUgdHlwZSAoCi0JICogPGNvZGU+VGV4dDwvY29kZT4gb3IgPGNvZGU+Q0RBVEFTZWN0aW9uPC9jb2RlPikgYXMgdGhlIGN1cnJlbnQKLQkgKiBub2RlIGluc2VydGVkIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwbGFjZW1lbnQuIDwvbGk+Ci0JICogPC91bD4KLQkgKiA8YnI+Ci0JICogRm9yIGluc3RhbmNlLCBpbiB0aGUgYWJvdmUgZXhhbXBsZSBjYWxsaW5nCi0JICogPGNvZGU+cmVwbGFjZVdob2xlVGV4dDwvY29kZT4gb24gdGhlIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUgdGhhdAotCSAqIGNvbnRhaW5zICJiYXIiIHdpdGggInlvIiBpbiBhcmd1bWVudCByZXN1bHRzIGluIHRoZSBmb2xsb3dpbmc6IDxicj4KLQkgKiBXaGVyZSB0aGUgbm9kZXMgdG8gYmUgcmVtb3ZlZCBhcmUgcmVhZC1vbmx5IGRlc2NlbmRhbnRzIG9mIGFuCi0JICogPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiwgdGhlIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4KLQkgKiBtdXN0IGJlIHJlbW92ZWQgaW5zdGVhZCBvZiB0aGUgcmVhZC1vbmx5IG5vZGVzLiBJZiBhbnkKLQkgKiA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+IHRvIGJlIHJlbW92ZWQgaGFzIGRlc2NlbmRhbnRzIHRoYXQgYXJlCi0JICogbm90IDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4sIDxjb2RlPlRleHQ8L2NvZGU+LCBvcgotCSAqIDxjb2RlPkNEQVRBU2VjdGlvbjwvY29kZT4gbm9kZXMsIHRoZSA8Y29kZT5yZXBsYWNlV2hvbGVUZXh0PC9jb2RlPgotCSAqIG1ldGhvZCBtdXN0IGZhaWwgYmVmb3JlIHBlcmZvcm1pbmcgYW55IG1vZGlmaWNhdGlvbiBvZiB0aGUgZG9jdW1lbnQsCi0JICogcmFpc2luZyBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gd2l0aCB0aGUgY29kZQotCSAqIDxjb2RlPk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjwvY29kZT4uIDxicj4KLQkgKiBGb3IgaW5zdGFuY2UsIGluIHRoZSBleGFtcGxlIGJlbG93IGNhbGxpbmcKLQkgKiA8Y29kZT5yZXBsYWNlV2hvbGVUZXh0PC9jb2RlPiBvbiB0aGUgPGNvZGU+VGV4dDwvY29kZT4gbm9kZSB0aGF0Ci0JICogY29udGFpbnMgImJhciIgZmFpbHMsIGJlY2F1c2UgdGhlIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4gbm9kZQotCSAqICJlbnQiIGNvbnRhaW5zIGFuIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IG5vZGUgd2hpY2ggY2Fubm90IGJlIHJlbW92ZWQuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiAgICAgICAgICAgIFRoZSBjb250ZW50IG9mIHRoZSByZXBsYWNpbmcgPGNvZGU+VGV4dDwvY29kZT4gbm9kZS4KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIGNyZWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogICAgICAgICBjb250ZW50LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgb25lIG9mIHRoZQotCSAqICAgICAgICAgICAgICAgIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGVzIGJlaW5nIHJlcGxhY2VkIGlzIHJlYWRvbmx5LgotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLSAgICBwdWJsaWMgVGV4dCByZXBsYWNlV2hvbGVUZXh0KFN0cmluZyBjb250ZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1VzZXJEYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1VzZXJEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NWZmNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Vc2VyRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQ29sbGVjdHMgdXNlciBkYXRhIGFzc29jaWF0ZWQgdG8gYSBOb2RlLgotICogCi0gKi8KLWZpbmFsIGNsYXNzIFVzZXJEYXRhIHsKLQotCXByaXZhdGUgc3RhdGljIFVzZXJEYXRhIGZJbnN0YW5jZTsKLQotCS8qKgotCSAqIE1hcHBpbmcgb2YgYSBOb2RlIHRvIGl0cyBVc2VyIERhdGEgdGFibGUgKHJlcHJlc2VudGVkIGJ5IGEgTWFwKQotCSAqLwotCXByaXZhdGUgTWFwIGZEYXRhOwotCi0JcHJpdmF0ZSBVc2VyRGF0YSgpIHsKLQkJZkRhdGEgPSBuZXcgV2Vha0hhc2hNYXAoMCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgVXNlckRhdGEgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkKLQkJCWZJbnN0YW5jZSA9IG5ldyBVc2VyRGF0YSgpOwotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdXNlciBkYXRhIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCA8Y29kZT5ub2RlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQotCSAqIEByZXR1cm4gdGhlIHVzZXIgZGF0YSB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIDxjb2RlPm5vZGU8L2NvZGU+Ci0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBNYXAgZ2V0VXNlckRhdGFUYWJsZShOb2RlIG5vZGUpIHsKLQkJaWYgKGZEYXRhLmNvbnRhaW5zS2V5KG5vZGUpKQotCQkJcmV0dXJuIChNYXApIGZEYXRhLmdldChub2RlKTsKLQkJTWFwIHRhYmxlID0gbmV3IEhhc2hNYXAoKTsKLQkJZkRhdGEucHV0KG5vZGUsIHRhYmxlKTsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MR2VuZXJhdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxHZW5lcmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YzdlYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxHZW5lcmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbC5Db21tZW50RWxlbWVudFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklYTUxDaGFyRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqIAotICovCi1wdWJsaWMgY2xhc3MgWE1MR2VuZXJhdG9ySW1wbCBpbXBsZW1lbnRzIElTb3VyY2VHZW5lcmF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQV9DTE9TRSA9ICJdXT4iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfT1BFTiA9ICI8IVtDREFUQVsiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9DTE9TRSA9ICItLT4iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9PUEVOID0gIjwhLS0iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVFlQRV9PUEVOID0gIjwhRE9DVFlQRSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9DTE9TRSA9ICIgLz4iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX09QRU4gPSAiPC8iOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFhNTEdlbmVyYXRvckltcGwgaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9DTE9TRSA9ICI/PiI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9PUEVOID0gIjw/IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19JRCA9ICJQVUJMSUMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX1BSRUZJWCA9ICJzc2kiOy8vJE5PTi1OTFMtMSQKLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfRkVBVFVSRSA9ICJTU0kiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX1RPS0VOID0gIiMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX0lEID0gIlNZU1RFTSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0xPU0UgPSAiPiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSVNvdXJjZUdlbmVyYXRvciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBYTUxHZW5lcmF0b3JJbXBsKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQkvL3ByaXZhdGUgYm9vbGVhbiBpc0NvbW1lbnRUYWcoWE1MRWxlbWVudCBlbGVtZW50KSB7Ci0JLy8JaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCS8vCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JLy8JaWYgKGRvY3VtZW50ID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkvLwlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSBkb2N1bWVudC5nZXREb2N1bWVudFR5cGVBZGFwdGVyKCk7Ci0JLy8JaWYgKGFkYXB0ZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCS8vCWlmICghYWRhcHRlci5oYXNGZWF0dXJlKFNTSV9GRUFUVVJFKSkgcmV0dXJuIGZhbHNlOwotCS8vCVN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldFByZWZpeCgpOwotCS8vCXJldHVybiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4LmVxdWFscyhTU0lfUFJFRklYKSk7Ci0JLy99Ci0JLyoqCi0JICogSGVscGVyIHRvIG1vZGlmeSB0aGUgdGFnIG5hbWUgaW4gc3ViLWNsYXNzZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldFRhZ05hbWUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJKChFbGVtZW50SW1wbCkgZWxlbWVudCkuc2V0VGFnTmFtZSh0YWdOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBYTUxNb2RlbEdlbmVyYXRvciBjb25zdHJ1Y3RvcgotCSAqLwotCXByaXZhdGUgWE1MR2VuZXJhdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlQXR0ck5hbWUoQXR0ciBhdHRyKSB7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCWlmIChhdHRyTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChhdHRyTmFtZS5zdGFydHNXaXRoKEpTUFRhZy5UQUdfT1BFTikpIHsKLQkJCWlmICghYXR0ck5hbWUuZW5kc1dpdGgoSlNQVGFnLlRBR19DTE9TRSkpIHsKLQkJCQkvLyBjbG9zZSBKU1AKLQkJCQlyZXR1cm4gKGF0dHJOYW1lICsgSlNQVGFnLlRBR19DTE9TRSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCgoSURPTUF0dHIpIGF0dHIpLmlzR2xvYmFsQXR0cigpICYmIENNTm9kZVV0aWwuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cikgIT0gbnVsbCkgewotCQkJc3dpdGNoIChnZXRBdHRyTmFtZUNhc2UoYXR0cikpIHsKLQkJCQljYXNlIERvY3VtZW50VHlwZUFkYXB0ZXIuVVBQRVJfQ0FTRSA6Ci0JCQkJCWF0dHJOYW1lID0gYXR0ck5hbWUudG9VcHBlckNhc2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0UgOgotCQkJCQlhdHRyTmFtZSA9IGF0dHJOYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQkvLyBBU0lTX0NBU0UKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGF0dHJOYW1lOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVBdHRyVmFsdWUoQXR0ciBhdHRyKSB7Ci0JCXJldHVybiBnZW5lcmF0ZUF0dHJWYWx1ZShhdHRyLCAoY2hhcikgMCk7IC8vIG5vIHF1b3RlIHByZWZlcmVuY2UKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlQXR0clZhbHVlKEF0dHIgYXR0ciwgY2hhciBxdW90ZSkgewotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBuYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCVNvdXJjZVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU291cmNlVmFsaWRhdG9yKGF0dHIpOwotCQlTdHJpbmcgdmFsdWUgPSB2YWxpZGF0b3IuY29udmVydFNvdXJjZSgoKElET01Ob2RlKSBhdHRyKS5nZXRWYWx1ZVNvdXJjZSgpKTsKLQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLnN0YXJ0c1dpdGgoSlNQVGFnLlRBR19PUEVOKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChpc0Jvb2xlYW5BdHRyKGF0dHIpKSB7Ci0JCQkJaWYgKCgoQXR0ckltcGwpIGF0dHIpLmlzWE1MQXR0cigpKSB7Ci0JCQkJCS8vIGdlbmVyYXRlIHRoZSBuYW1lIGFzIHZhbHVlCi0JCQkJCXZhbHVlID0gYXR0ci5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gbm90IHRvIGdlbmVyYXRlICc9JyBhbmQgdmFsdWUgZm9yIEhUTUwgYm9vbGVhbgotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdlbmVyYXRlQXR0clZhbHVlKHZhbHVlLCBxdW90ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUF0dHJWYWx1ZShTdHJpbmcgdmFsdWUsIGNoYXIgcXVvdGUpIHsKLQkJLy8gYXNzdW1lIHRoZSB2YWxpZCBpcyBhbHJlYWR5IHZhbGlkYXRlZCBub3QgdG8gaW5jbHVkZSBib3RoIHF1b3RlcwotCQlpZiAocXVvdGUgPT0gJyInKSB7Ci0JCQlpZiAoKHZhbHVlICE9IG51bGwpICYmICh2YWx1ZS5pbmRleE9mKCciJykgPj0gMCkpCi0JCQkJcXVvdGUgPSAnXCcnOyAvLyBmb3JjZQotCQl9IGVsc2UgaWYgKHF1b3RlID09ICdcJycpIHsKLQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYgKHZhbHVlLmluZGV4T2YoJ1wnJykgPj0gMCkpCi0JCQkJcXVvdGUgPSAnIic7IC8vIGZvcmNlCi0JCX0gZWxzZSB7IC8vIG5vIHByZWZlcmVuY2UKLQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYgKHZhbHVlLmluZGV4T2YoJyInKSA8IDApKQotCQkJCXF1b3RlID0gJyInOwotCQkJZWxzZQotCQkJCXF1b3RlID0gJ1wnJzsKLQkJfQotCi0JCWludCBsZW5ndGggPSAodmFsdWUgPT0gbnVsbCA/IDAgOiB2YWx1ZS5sZW5ndGgoKSk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDIpOwotCQlidWZmZXIuYXBwZW5kKHF1b3RlKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHZhbHVlKTsKLQkJYnVmZmVyLmFwcGVuZChxdW90ZSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUNEQVRBU2VjdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUNEQVRBU2VjdGlvbihDREFUQVNlY3Rpb24gY2RhdGEpIHsKLQkJaWYgKGNkYXRhID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgZGF0YSA9IGNkYXRhLmdldERhdGEoKTsKLQkJaW50IGxlbmd0aCA9IChkYXRhICE9IG51bGwgPyBkYXRhLmxlbmd0aCgpIDogMCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDE2KTsKLQkJYnVmZmVyLmFwcGVuZChDREFUQV9PUEVOKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZGF0YSk7Ci0JCWJ1ZmZlci5hcHBlbmQoQ0RBVEFfQ0xPU0UpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVDaGlsZChOb2RlIHBhcmVudE5vZGUpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIXBhcmVudE5vZGUuaGFzQ2hpbGROb2RlcygpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50Tm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJU3RyaW5nIGNoaWxkU291cmNlID0gZ2VuZXJhdGVTb3VyY2UoY2hpbGQpOwotCQkJaWYgKGNoaWxkU291cmNlICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChjaGlsZFNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVDbG9zZVRhZyhOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCQkJaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCQkJCXJldHVybiBKU1BUYWcuQ09NTUVOVF9DTE9TRTsKLQkJCQkJcmV0dXJuIENPTU1FTlRfQ0xPU0U7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQkJCXJldHVybiBKU1BUYWcuVEFHX0NMT1NFOwotCQkJCWlmIChlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQkJcmV0dXJuIEVNUFRZX0NMT1NFOwotCQkJCXJldHVybiBUQUdfQ0xPU0U7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCUNvbW1lbnRJbXBsIGNvbW1lbnQgPSAoQ29tbWVudEltcGwpIG5vZGU7Ci0JCQkJaWYgKGNvbW1lbnQuaXNKU1BUYWcoKSkKLQkJCQkJcmV0dXJuIEpTUFRhZy5DT01NRU5UX0NMT1NFOwotCQkJCXJldHVybiBDT01NRU5UX0NMT1NFOwotCQkJfQotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0JCQkJcmV0dXJuIFRBR19DTE9TRTsKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCXJldHVybiBQSV9DTE9TRTsKLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCXJldHVybiBDREFUQV9DTE9TRTsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVDb21tZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21tZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Db21tZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUNvbW1lbnQoQ29tbWVudCBjb21tZW50KSB7Ci0JCWlmIChjb21tZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgZGF0YSA9IGNvbW1lbnQuZ2V0RGF0YSgpOwotCQlpbnQgbGVuZ3RoID0gKGRhdGEgIT0gbnVsbCA/IGRhdGEubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgOCk7Ci0JCUNvbW1lbnRJbXBsIGltcGwgPSAoQ29tbWVudEltcGwpIGNvbW1lbnQ7Ci0JCWlmICghaW1wbC5pc0pTUFRhZygpKQotCQkJYnVmZmVyLmFwcGVuZChDT01NRU5UX09QRU4pOwotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKEpTUFRhZy5DT01NRU5UX09QRU4pOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChkYXRhKTsKLQkJaWYgKCFpbXBsLmlzSlNQVGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKENPTU1FTlRfQ0xPU0UpOwotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKEpTUFRhZy5DT01NRU5UX0NMT1NFKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlRG9jdHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZG9jVHlwZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZURvY3R5cGUoRG9jdW1lbnRUeXBlIGRvY1R5cGUpIHsKLQkJaWYgKGRvY1R5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBuYW1lID0gZG9jVHlwZS5nZXROYW1lKCk7Ci0JCWludCBsZW5ndGggPSAobmFtZSAhPSBudWxsID8gbmFtZS5sZW5ndGgoKSA6IDApOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyAxNik7Ci0JCWJ1ZmZlci5hcHBlbmQoRE9DVFlQRV9PUEVOKTsKLQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQlpZiAobmFtZSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChuYW1lKTsKLQkJRG9jdW1lbnRUeXBlSW1wbCBkdCA9IChEb2N1bWVudFR5cGVJbXBsKSBkb2NUeXBlOwotCQlTdHJpbmcgcHVibGljSUQgPSBkdC5nZXRQdWJsaWNJZCgpOwotCQlTdHJpbmcgc3lzdGVtSUQgPSBkdC5nZXRTeXN0ZW1JZCgpOwotCQlpZiAocHVibGljSUQgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJYnVmZmVyLmFwcGVuZChQVUJMSUNfSUQpOwotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQkJYnVmZmVyLmFwcGVuZChwdWJsaWNJRCk7Ci0JCQlidWZmZXIuYXBwZW5kKCciJyk7Ci0JCQlpZiAoc3lzdGVtSUQgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCQlidWZmZXIuYXBwZW5kKCciJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChzeXN0ZW1JRCk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHN5c3RlbUlEICE9IG51bGwpIHsKLQkJCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChTWVNURU1fSUQpOwotCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCQlidWZmZXIuYXBwZW5kKCciJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChzeXN0ZW1JRCk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQkJfQotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoJz4nKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgRWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gaWYgZW1wdHkgdGFnIGlzIHByZWZlcnJhYmxlLCBnZW5lcmF0ZSBhcyBlbXB0eSB0YWcKLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaWYgKGltcGwucHJlZmVyRW1wdHlUYWcoKSkKLQkJCWltcGwuc2V0RW1wdHlUYWcodHJ1ZSk7Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIHN0YXJ0VGFnID0gZ2VuZXJhdGVTdGFydFRhZyhlbGVtZW50KTsKLQkJaWYgKHN0YXJ0VGFnICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHN0YXJ0VGFnKTsKLQkJU3RyaW5nIGNoaWxkID0gZ2VuZXJhdGVDaGlsZChlbGVtZW50KTsKLQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGNoaWxkKTsKLQkJU3RyaW5nIGVuZFRhZyA9IGdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQlpZiAoZW5kVGFnICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGVuZFRhZyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbmRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlFbGVtZW50SW1wbCBpbXBsID0gKEVsZW1lbnRJbXBsKSBlbGVtZW50OwotCi0JCS8vIGZpcnN0IGNoZWNrIGlmIHRhZyBhZGFwdGVyIGV4aXN0cwotCQlUYWdBZGFwdGVyIGFkYXB0ZXIgPSAoVGFnQWRhcHRlcikgaW1wbC5nZXRFeGlzdGluZ0FkYXB0ZXIoVGFnQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZyBlbmRUYWcgPSBhZGFwdGVyLmdldEVuZFRhZyhpbXBsKTsKLQkJCWlmIChlbmRUYWcgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZW5kVGFnOwotCQl9Ci0KLQkJaWYgKGltcGwuaXNFbXB0eVRhZygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghaW1wbC5pc0NvbnRhaW5lcigpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChpbXBsLmlzSlNQVGFnKCkpCi0JCQlyZXR1cm4gSlNQVGFnLlRBR19DTE9TRTsKLQotCQlTdHJpbmcgdGFnTmFtZSA9IGdlbmVyYXRlVGFnTmFtZShlbGVtZW50KTsKLQkJaW50IGxlbmd0aCA9ICh0YWdOYW1lICE9IG51bGwgPyB0YWdOYW1lLmxlbmd0aCgpIDogMCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDQpOwotCQlidWZmZXIuYXBwZW5kKEVORF9PUEVOKTsKLQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJz4nKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlRW50aXR5UmVmIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlbnRpdHlSZWYKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbnRpdHlSZWYoRW50aXR5UmVmZXJlbmNlIGVudGl0eVJlZikgewotCQlpZiAoZW50aXR5UmVmID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgbmFtZSA9IGVudGl0eVJlZi5nZXROb2RlTmFtZSgpOwotCQlpbnQgbGVuZ3RoID0gKG5hbWUgIT0gbnVsbCA/IG5hbWUubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgNCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyYnKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJzsnKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlUEkgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBpCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlUEkoUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpKSB7Ci0JCWlmIChwaSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHRhcmdldCA9IHBpLmdldFRhcmdldCgpOwotCQlTdHJpbmcgZGF0YSA9IHBpLmdldERhdGEoKTsKLQkJaW50IGxlbmd0aCA9ICh0YXJnZXQgIT0gbnVsbCA/IHRhcmdldC5sZW5ndGgoKSA6IDApOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJbGVuZ3RoICs9IGRhdGEubGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDgpOwotCQlidWZmZXIuYXBwZW5kKFBJX09QRU4pOwotCQlpZiAodGFyZ2V0ICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHRhcmdldCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZGF0YSk7Ci0JCWJ1ZmZlci5hcHBlbmQoUElfQ0xPU0UpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVTb3VyY2UgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlU291cmNlKE5vZGUgbm9kZSkgewotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlRWxlbWVudCgoRWxlbWVudCkgbm9kZSk7Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVUZXh0KChUZXh0KSBub2RlKTsKLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJCXJldHVybiBnZW5lcmF0ZUNvbW1lbnQoKENvbW1lbnQpIG5vZGUpOwotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlRG9jdHlwZSgoRG9jdW1lbnRUeXBlKSBub2RlKTsKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCXJldHVybiBnZW5lcmF0ZVBJKChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIG5vZGUpOwotCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlQ0RBVEFTZWN0aW9uKChDREFUQVNlY3Rpb24pIG5vZGUpOwotCQkJY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlRW50aXR5UmVmKChFbnRpdHlSZWZlcmVuY2UpIG5vZGUpOwotCQkJZGVmYXVsdCA6Ci0JCQkJLy8gRE9DVU1FTlQKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gZ2VuZXJhdGVDaGlsZChub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZVN0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBFbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVN0YXJ0VGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQotCQlpZiAoaW1wbC5pc0pTUFRhZygpKSB7Ci0JCQkvLyBjaGVjayBpZiBKU1AgY29udGVudCB0eXBlIGFuZCBKU1AgRG9jdW1lbnQKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuaXNKU1BUeXBlKCkpIHsKLQkJCQlpZiAoZG9jdW1lbnQuaXNKU1BEb2N1bWVudCgpICYmICFpbXBsLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlpbXBsLnNldEpTUFRhZyhmYWxzZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpbXBsLnNldEpTUFRhZyhmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGltcGwuaXNDb21tZW50VGFnKCkgJiYgaW1wbC5nZXRFeGlzdGluZ0FkYXB0ZXIoVGFnQWRhcHRlci5jbGFzcykgPT0gbnVsbCkgewotCQkJQ29tbWVudEVsZW1lbnRSZWdpc3RyeSByZWdpc3RyeSA9IENvbW1lbnRFbGVtZW50UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJCXJlZ2lzdHJ5LnNldHVwQ29tbWVudEVsZW1lbnQoaW1wbCk7Ci0JCX0KLQotCQkvLyBmaXJzdCBjaGVjayBpZiB0YWcgYWRhcHRlciBleGlzdHMKLQkJVGFnQWRhcHRlciBhZGFwdGVyID0gKFRhZ0FkYXB0ZXIpIGltcGwuZ2V0RXhpc3RpbmdBZGFwdGVyKFRhZ0FkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc3RhcnRUYWcgPSBhZGFwdGVyLmdldFN0YXJ0VGFnKGltcGwpOwotCQkJaWYgKHN0YXJ0VGFnICE9IG51bGwpCi0JCQkJcmV0dXJuIHN0YXJ0VGFnOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlpZiAoaW1wbC5pc0NvbW1lbnRUYWcoKSkgewotCQkJaWYgKGltcGwuaXNKU1BUYWcoKSkKLQkJCQlidWZmZXIuYXBwZW5kKEpTUFRhZy5DT01NRU5UX09QRU4pOwotCQkJZWxzZQotCQkJCWJ1ZmZlci5hcHBlbmQoQ09NTUVOVF9PUEVOKTsKLQkJCVN0cmluZyB0YWdOYW1lID0gZ2VuZXJhdGVUYWdOYW1lKGVsZW1lbnQpOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQl9IGVsc2UgaWYgKGltcGwuaXNKU1BUYWcoKSkgewotCQkJYnVmZmVyLmFwcGVuZChKU1BUYWcuVEFHX09QRU4pOwotCQkJU3RyaW5nIHRhZ05hbWUgPSBnZW5lcmF0ZVRhZ05hbWUoZWxlbWVudCk7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0JCQlpZiAoaW1wbC5pc0NvbnRhaW5lcigpKQotCQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsgLy8gSlNQIGNvbnRhaW5lcgotCQl9IGVsc2UgewotCQkJYnVmZmVyLmFwcGVuZCgnPCcpOwotCQkJU3RyaW5nIHRhZ05hbWUgPSBnZW5lcmF0ZVRhZ05hbWUoZWxlbWVudCk7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0JCX0KLQotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IGdlbmVyYXRlQXR0ck5hbWUoYXR0cik7Ci0JCQlpZiAoYXR0ck5hbWUgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKGF0dHJOYW1lKTsKLQkJCVN0cmluZyBhdHRyVmFsdWUgPSBnZW5lcmF0ZUF0dHJWYWx1ZShhdHRyKTsKLQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkgewotCQkJCS8vIGF0dHIgbmFtZSBvbmx5IGZvciBIVE1MIGJvb2xlYW4gYW5kIEpTUAotCQkJCWJ1ZmZlci5hcHBlbmQoJz0nKTsKLQkJCQlidWZmZXIuYXBwZW5kKGF0dHJWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgY2xvc2VUYWcgPSBnZW5lcmF0ZUNsb3NlVGFnKGVsZW1lbnQpOwotCQlpZiAoY2xvc2VUYWcgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoY2xvc2VUYWcpOwotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlVGFnTmFtZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJRE9NRWxlbWVudCB4ZSA9IChJRE9NRWxlbWVudCkgZWxlbWVudDsKLQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoeGUuaXNKU1BUYWcoKSkgewotCQkJaWYgKHRhZ05hbWUuZXF1YWxzKEpTUFRhZy5KU1BfRVhQUkVTU0lPTikpCi0JCQkJcmV0dXJuIEpTUFRhZy5FWFBSRVNTSU9OX1RPS0VOOwotCQkJaWYgKHRhZ05hbWUuZXF1YWxzKEpTUFRhZy5KU1BfREVDTEFSQVRJT04pKQotCQkJCXJldHVybiBKU1BUYWcuREVDTEFSQVRJT05fVE9LRU47Ci0JCQlpZiAodGFnTmFtZS5lcXVhbHMoSlNQVGFnLkpTUF9ESVJFQ1RJVkUpKQotCQkJCXJldHVybiBKU1BUYWcuRElSRUNUSVZFX1RPS0VOOwotCQkJaWYgKHRhZ05hbWUuc3RhcnRzV2l0aChKU1BUYWcuSlNQX0RJUkVDVElWRSkpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gSlNQVGFnLkpTUF9ESVJFQ1RJVkUubGVuZ3RoKCkgKyAxOyAvLyBhZnRlciAnLicKLQkJCQlyZXR1cm4gKEpTUFRhZy5ESVJFQ1RJVkVfVE9LRU4gKyB0YWdOYW1lLnN1YnN0cmluZyhvZmZzZXQpKTsKLQkJCX0KLQkJCXJldHVybiAoeGUuaXNDb21tZW50VGFnKCkpID8gdGFnTmFtZSA6IG51bGw7Ci0JCX0gZWxzZSBpZiAodGFnTmFtZS5zdGFydHNXaXRoKEpTUFRhZy5UQUdfT1BFTikpIHsKLQkJCWlmICghdGFnTmFtZS5lbmRzV2l0aChKU1BUYWcuVEFHX0NMT1NFKSkgewotCQkJCS8vIGNsb3NlIEpTUAotCQkJCXJldHVybiAodGFnTmFtZSArIEpTUFRhZy5UQUdfQ0xPU0UpOwotCQkJfQotCQl9IGVsc2UgaWYgKHhlLmlzQ29tbWVudFRhZygpKSB7Ci0JCQlTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLQkJCWlmIChwcmVmaXguZXF1YWxzKFNTSV9QUkVGSVgpKSB7Ci0JCQkJcmV0dXJuIChTU0lfVE9LRU4gKyBlbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgheGUuaXNKU1BUYWcoKSAmJiB4ZS5pc0dsb2JhbFRhZygpICYmIC8vIGdsb2JhbCB0YWcKLQkJCQkJCUNNTm9kZVV0aWwuZ2V0RWxlbWVudERlY2xhcmF0aW9uKHhlKSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5ld05hbWUgPSB0YWdOYW1lOwotCQkJCXN3aXRjaCAoZ2V0VGFnTmFtZUNhc2UoeGUpKSB7Ci0JCQkJCWNhc2UgRG9jdW1lbnRUeXBlQWRhcHRlci5VUFBFUl9DQVNFIDoKLQkJCQkJCW5ld05hbWUgPSB0YWdOYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0UgOgotCQkJCQkJbmV3TmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAobmV3TmFtZSAhPSB0YWdOYW1lKSB7Ci0JCQkJCXRhZ05hbWUgPSBuZXdOYW1lOwotCQkJCQlzZXRUYWdOYW1lKGVsZW1lbnQsIHRhZ05hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdGFnTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZVRleHQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLlRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlVGV4dChUZXh0IHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlUZXh0SW1wbCBpbXBsID0gKFRleHRJbXBsKSB0ZXh0OwotCQlTdHJpbmcgc291cmNlID0gaW1wbC5nZXRUZXh0U291cmNlKCk7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiBzb3VyY2U7Ci0JCXJldHVybiBnZW5lcmF0ZVRleHREYXRhKHRleHQsIGltcGwuZ2V0RGF0YSgpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlVGV4dERhdGEoVGV4dCB0ZXh0LCBTdHJpbmcgZGF0YSkgewotCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVGV4dEltcGwgaW1wbCA9IChUZXh0SW1wbCkgdGV4dDsKLQkJaWYgKGltcGwuaXNKU1BDb250ZW50KCkgfHwgaW1wbC5pc0NEQVRBQ29udGVudCgpKSB7Ci0JCQlyZXR1cm4gbmV3IFNvdXJjZVZhbGlkYXRvcihpbXBsKS5jb252ZXJ0U291cmNlKGRhdGEpOwotCQl9Ci0JCVN0cmluZyBzb3VyY2UgPSBkYXRhOwotCi0JCS8vIGNvbnZlcnQgc3BlY2lhbCBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBlbnRpdGllcwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGdldENoYXJOYW1lKGRhdGEuY2hhckF0KGkpKTsKLQkJCWlmIChuYW1lID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyA4KTsKLQkJCWlmIChpID4gb2Zmc2V0KQotCQkJCWJ1ZmZlci5hcHBlbmQoZGF0YS5zdWJzdHJpbmcob2Zmc2V0LCBpKSk7Ci0JCQlidWZmZXIuYXBwZW5kKCcmJyk7Ci0JCQlidWZmZXIuYXBwZW5kKG5hbWUpOwotCQkJYnVmZmVyLmFwcGVuZCgnOycpOwotCQkJb2Zmc2V0ID0gaSArIDE7Ci0JCX0KLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlpZiAobGVuZ3RoID4gb2Zmc2V0KQotCQkJCWJ1ZmZlci5hcHBlbmQoZGF0YS5zdWJzdHJpbmcob2Zmc2V0KSk7Ci0JCQlzb3VyY2UgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCWlmIChzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgaW50IGdldEF0dHJOYW1lQ2FzZShBdHRyIGF0dHIpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgYXR0ci5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIERvY3VtZW50VHlwZUFkYXB0ZXIuU1RSSUNUX0NBU0U7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBkb2N1bWVudC5nZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIERvY3VtZW50VHlwZUFkYXB0ZXIuU1RSSUNUX0NBU0U7Ci0JCXJldHVybiBhZGFwdGVyLmdldEF0dHJOYW1lQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENoYXJOYW1lKGNoYXIgYykgewotCQlzd2l0Y2ggKGMpIHsKLQkJCWNhc2UgJzwnIDoKLQkJCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuTFRfTkFNRTsKLQkJCWNhc2UgJz4nIDoKLQkJCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuR1RfTkFNRTsKLQkJCWNhc2UgJyYnIDoKLQkJCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuQU1QX05BTUU7Ci0JCQljYXNlICciJyA6Ci0JCQkJcmV0dXJuIElYTUxDaGFyRW50aXR5LlFVT1RfTkFNRTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGludCBnZXRUYWdOYW1lQ2FzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIERvY3VtZW50VHlwZUFkYXB0ZXIuU1RSSUNUX0NBU0U7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBkb2N1bWVudC5nZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIERvY3VtZW50VHlwZUFkYXB0ZXIuU1RSSUNUX0NBU0U7Ci0JCXJldHVybiBhZGFwdGVyLmdldFRhZ05hbWVDYXNlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQm9vbGVhbkF0dHIoQXR0ciBhdHRyKSB7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gZGVjbCA9IENNTm9kZVV0aWwuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNNRGF0YVR5cGUgdHlwZSA9IGRlY2wuZ2V0QXR0clR5cGUoKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIHZhbHVlc1tdID0gdHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0JCWlmICh2YWx1ZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICh2YWx1ZXMubGVuZ3RoID09IDEgJiYgdmFsdWVzWzBdLmVxdWFscyhkZWNsLmdldEF0dHJOYW1lKCkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE3OTlmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vKioKLSAqIFhNTE1vZGVsQ29udGV4dCBjbGFzcwotICovCi1jbGFzcyBYTUxNb2RlbENvbnRleHQgewotCXByaXZhdGUgTm9kZSBuZXh0Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBOb2RlIHBhcmVudE5vZGUgPSBudWxsOwotCi0JLy8JcHJpdmF0ZSBYTUxNb2RlbEltcGwgbW9kZWwgPSBudWxsOwotCXByaXZhdGUgTm9kZSByb290Tm9kZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBYTUxNb2RlbENvbnRleHQgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gcm9vdE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlYTUxNb2RlbENvbnRleHQoTm9kZSByb290Tm9kZSkgewotCQlzdXBlcigpOwotCi0JCXRoaXMucm9vdE5vZGUgPSByb290Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBmaW5kRW5kVGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JRWxlbWVudCBmaW5kRW5kVGFnKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMucGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChOb2RlIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJYnJlYWs7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQlpZiAoZWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCWlmIChlbGVtZW50Lm1hdGNoVGFnTmFtZSh0YWdOYW1lKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkJLy8gaWYgYW5jZXN0b3IgZWxlbWVudCBoYXMgZW5kIHRhZyBzdG9wIHNlYXJjaAotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKSAhPSBudWxsKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JVGV4dCBmaW5kTmV4dFRleHQoKSB7Ci0JCU5vZGUgbm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlICE9IHRoaXMubmV4dE5vZGUgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgbm9kZTsKLQkJCQkvLyBza2lwIGVtcHR5IHRleHQKLQkJCQlpZiAodGV4dC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKQotCQkJCQlyZXR1cm4gdGV4dDsKLQkJCX0KLQkJCU5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJbm9kZSA9IGNoaWxkOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCU5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJCW5vZGUgPSBuZXh0OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGZpbmRQcmV2aW91c1RleHQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5UZXh0Ci0JICovCi0JVGV4dCBmaW5kUHJldmlvdXNUZXh0KCkgewotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkKLQkJCW5vZGUgPSB0aGlzLm5leHROb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQllbHNlCi0JCQlub2RlID0gdGhpcy5wYXJlbnROb2RlLmdldExhc3RDaGlsZCgpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKFRleHQpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogZmluZFN0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JRWxlbWVudCBmaW5kU3RhcnRUYWcoU3RyaW5nIHRhZ05hbWUsIFN0cmluZyByb290TmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gY2hlY2sgcHJldmlvdXMgZm9yIGVtcHR5IGNvbnRlbnQgZWxlbWVudAotCQlOb2RlIHByZXYgPSBudWxsOwotCQlpZiAodGhpcy5uZXh0Tm9kZSAhPSBudWxsKQotCQkJcHJldiA9IHRoaXMubmV4dE5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCWVsc2UgaWYgKHRoaXMucGFyZW50Tm9kZSAhPSBudWxsKQotCQkJcHJldiA9IHRoaXMucGFyZW50Tm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaWYgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHByZXY7Ci0JCQlpZiAoIWVsZW1lbnQuaGFzRW5kVGFnKCkgJiYgIWVsZW1lbnQuaXNFbXB0eVRhZygpICYmIGVsZW1lbnQubWF0Y2hUYWdOYW1lKHRhZ05hbWUpKQotCQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJZm9yIChOb2RlIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlicmVhazsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCWlmIChlbGVtZW50Lm1hdGNoVGFnTmFtZSh0YWdOYW1lKSkKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCWlmIChyb290TmFtZSAhPSBudWxsICYmIGVsZW1lbnQubWF0Y2hUYWdOYW1lKHJvb3ROYW1lKSkKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5leHROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCU5vZGUgZ2V0TmV4dE5vZGUoKSB7Ci0JCXJldHVybiB0aGlzLm5leHROb2RlOwotCX0KLQotCS8qKgotCSAqIGdldFBhcmVudE5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JTm9kZSBnZXRQYXJlbnROb2RlKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnROb2RlOwotCX0KLQotCS8qKgotCSAqIGdldFJvb3ROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCU5vZGUgZ2V0Um9vdE5vZGUoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3ROb2RlOwotCX0KLQotCS8qKgotCSAqIHNldExhc3QgbWV0aG9kCi0JICovCi0Jdm9pZCBzZXRMYXN0KCkgewotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLm5leHROb2RlICE9IG51bGwpIHsKLQkJCU5vZGUgcHJldiA9IHRoaXMubmV4dE5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlpZiAocHJldiA9PSBudWxsIHx8IHByZXYuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlyZXR1cm47Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwcmV2OwotCQkJaWYgKGVsZW1lbnQuaGFzRW5kVGFnKCkgfHwgIWVsZW1lbnQuaXNDb250YWluZXIoKSB8fCBlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQlyZXR1cm47Ci0JCQlzZXRQYXJlbnROb2RlKHByZXYpOwotCQl9Ci0KLQkJLy8gZmluZCBsYXN0IG9wZW4gcGFyZW50Ci0JCU5vZGUgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwotCQlOb2RlIGxhc3QgPSBwYXJlbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCXdoaWxlIChsYXN0ICE9IG51bGwpIHsKLQkJCWlmIChsYXN0LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJYnJlYWs7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBsYXN0OwotCQkJaWYgKGVsZW1lbnQuaGFzRW5kVGFnKCkgfHwgIWVsZW1lbnQuaXNDb250YWluZXIoKSB8fCBlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQlicmVhazsKLQkJCXBhcmVudCA9IGVsZW1lbnQ7Ci0JCQlsYXN0ID0gcGFyZW50LmdldExhc3RDaGlsZCgpOwotCQl9Ci0JCWlmIChwYXJlbnQgIT0gdGhpcy5wYXJlbnROb2RlKQotCQkJc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIHNldE5leHROb2RlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuZXh0Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXZvaWQgc2V0TmV4dE5vZGUoTm9kZSBuZXh0Tm9kZSkgewotCQl0aGlzLm5leHROb2RlID0gbmV4dE5vZGU7Ci0JCWlmIChuZXh0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0aGlzLnBhcmVudE5vZGUgPSBuZXh0Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogc2V0UGFyZW50Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXZvaWQgc2V0UGFyZW50Tm9kZShOb2RlIHBhcmVudE5vZGUpIHsKLQkJdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTsKLQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbE5vdGlmaWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsTm90aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEzZTI1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsTm90aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIAotICogWE1MTW9kZWxOb3RpZmllciBtYW5hZ2VzIHRoZSBub3RpZmljYXRpb24gcHJvY2Vzcy4gQ2xpZW50cyBzaG91bGQgbm90IHVzZQotICogZXh0ZW5kIG9yIHJlZmVyZW5jZS4KLSAqIAotICogSVNTVUU6IHNob3VsZCBiZSBpbnRlcm5hbGl6ZWQuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBYTUxNb2RlbE5vdGlmaWVyIHsKLQotCS8qKgotCSAqIGF0dHJSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG9sZEF0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQl2b2lkIGF0dHJSZXBsYWNlZChFbGVtZW50IGVsZW1lbnQsIEF0dHIgbmV3QXR0ciwgQXR0ciBvbGRBdHRyKTsKLQotCS8qKgotCSAqIFNpZ25hbCB0aGF0IGNoYW5naW5nIGlzIHN0YXJ0aW5nLgotCSAqIAotCSAqLwotCXZvaWQgYmVnaW5DaGFuZ2luZygpOwotCi0JLyoqCi0JICogU2lnbmFsIHRoYXQgY2hhbmdpbmcgaXMgc3RhcnRpbmcgd2l0aCBhIGJyYW5kIG5ldyBtb2RlbC4KLQkgKiAKLQkgKi8KLQl2b2lkIGJlZ2luQ2hhbmdpbmcoYm9vbGVhbiBuZXdNb2RlbCk7Ci0KLQkvKioKLQkgKiBDYW5jZWwgcGVuZGluZyBub3RpZmljYXRpb25zLiBUaGlzIGlzIGNhbGxlZCBpbiB0aGUgY29udGV4dCBvZgotCSAqICJyZWluaXRpYWxpemF0aW9uIiBzbyBpcyBhc3N1bWVkIEFMTCBub3RpZmljYXRpb25zIGNhbiBiZSBzYWZlbHkKLQkgKiBjYW5jZWxlZCwgYXNzdW1pbmcgdGhhdCBvbmNlIGZhY3RvcmllcyBhbmQgYWRhcHRlcnMgYXJlIHJlLWluaXRpYWxpemVkCi0JICogdGhleSB3aWxsIGJlIHJlLW5vdGlmaWVkIGFzIHRleHQgaXMgc2V0IGluIG1vZGVsLCBpZiBzdGlsbCBhcHByb3ByaWF0ZS4KLQkgKi8KLQl2b2lkIGNhbmNlbFBlbmRpbmcoKTsKLQotCS8qKgotCSAqIGNoaWxkUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIGNoaWxkUmVwbGFjZWQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKTsKLQotCS8qKgotCSAqIEVkaXRhYmxlIHN0YXRlIGNoYW5nZWQgZm9yIG5vZGUuCi0JICogCi0JICovCi0Jdm9pZCBlZGl0YWJsZUNoYW5nZWQoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIFNpZ25hbCBjaGFuZ2luZyBpcyBmaW5pc2hlZC4KLQkgKiAKLQkgKi8KLQl2b2lkIGVuZENoYW5naW5nKCk7Ci0KLQkvKioKLQkgKiBTaWduYWwgZW5kIHRhZyBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogCi0JICovCi0Jdm9pZCBlbmRUYWdDaGFuZ2VkKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJlZmxlY3Qgc3RhdGUgb2YgbW9kZWwuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIG1vZGVsIGhhZCBjaGFuZ2VkLgotCSAqIAotCSAqLwotCWJvb2xlYW4gaGFzQ2hhbmdlZCgpOwotCi0JLyoqCi0JICogVXNlZCB0byByZWZsZWN0IHN0YXRlIG9mIHBhcnNpbmcgcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgbW9kZWwgaXMgY3VycmVudGx5IGNoYW5naW5nLgotCSAqLwotCWJvb2xlYW4gaXNDaGFuZ2luZygpOwotCi0JLyoqCi0JICogc2lnbmFsIHByb3BlcnR5IGNoYW5nZWQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXZvaWQgcHJvcGVydHlDaGFuZ2VkKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBzaWduYWwgc3RhcnQgdGFnIGNoYW5nZWQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXZvaWQgc3RhcnRUYWdDaGFuZ2VkKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBzaWduYWwgc3RydWN0dXJlZCBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0Jdm9pZCBzdHJ1Y3R1cmVDaGFuZ2VkKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiB2YWx1ZUNoYW5nZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIHZhbHVlQ2hhbmdlZChOb2RlIG5vZGUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsTm90aWZpZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsTm90aWZpZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1Zjg5YTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbE5vdGlmaWVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFhNTE1vZGVsTm90aWZpZXJJbXBsIGltcGxlbWVudHMgWE1MTW9kZWxOb3RpZmllciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb3RpZnlFdmVudCB7Ci0JCU9iamVjdCBjaGFuZ2VkRmVhdHVyZTsKLQkJYm9vbGVhbiBkaXNjYXJkZWQ7Ci0JCU9iamVjdCBuZXdWYWx1ZTsKLQkJLy8gbm90ZTogZG9uJ3QgaW5pdGlhbGl6ZSBpbnN0YW5jZSB2YXJpYWJsZXMsIHNpbmNlCi0JCS8vIHRoYXQgY2F1c2VzIGRvdWJsZSBhc3NpZ25tZW50cywgYW5kIGxvdHMgb2YgdGhlc2UgYXJlIGNyZWF0ZWQuCi0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXI7Ci0JCU9iamVjdCBvbGRWYWx1ZTsKLQkJaW50IHBvczsKLQkJU3RyaW5nIHJlYXNvbjsKLQkJaW50IHR5cGU7Ci0JCWludCBpbmRleDsKLQotCQlOb3RpZnlFdmVudChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgdHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkJdGhpcy5ub3RpZmllciA9IG5vdGlmaWVyOwotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMuY2hhbmdlZEZlYXR1cmUgPSBjaGFuZ2VkRmVhdHVyZTsKLQkJCXRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTsKLQkJCXRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKLQkJCXRoaXMucG9zID0gcG9zOwotCQkJdGhpcy5yZWFzb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFEREVEX1RIRU5fUkVNT1ZFRCA9ICJEaXNjYXJkOiBBZGRlZCB0aGVuIHJlbW92ZWQgcnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGZPcHRpbWl6ZURlZmVycmVkID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGZPcHRpbWl6ZURlZmVycmVkQWNjb3JkaW5nVG9QYXJlbnRBZGRlZCA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBmT3B0aW1pemVEZWZlcnJlZEFjY29yZGluZ1RvUGFyZW50UmVtb3ZlZCA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkVOVF9JU19BRERFRCA9ICJEaXNhcmRlZDogUGFyZW50IGhhcyBqdXN0IGJlZW4gYWRkZWQiOyAvLyROT04tTkxTLTEkCi0JLyogc3RhcnQ6IGZvciBkZWJ1Z2dpbmcgb25seSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQQVJFTlRfSVNfUkVNT1ZFRF9UT08gPSAiRGlzY2FyZDogUGFyZW50IHdhcyByZW1vdmVkIHRvbyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSRU5UX0lTX1JFUEFSRU5URUQgPSAiTm90IERpc2NhcmQ6IFBhcmVudCB3YXMgcmVtb3ZlZCBzbyB0aGlzIGltcGxpZXMgcmVwYXJlbnRpbmciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBOb2RlIGNoYW5nZWRSb290ID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBjaGFuZ2luZyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBkb2luZ05ld01vZGVsID0gZmFsc2U7Ci0JcHJpdmF0ZSBMaXN0IGZFdmVudHMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmbHVzaGluZyA9IGZhbHNlOwotCi0JLyoqCi0JICovCi0JcHVibGljIFhNTE1vZGVsTm90aWZpZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGF0dHJSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG9sZEF0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhdHRyUmVwbGFjZWQoRWxlbWVudCBlbGVtZW50LCBBdHRyIG5ld0F0dHIsIEF0dHIgb2xkQXR0cikgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlBdHRyIGF0dHIgPSBudWxsOwotCQlTdHJpbmcgb2xkVmFsdWUgPSBudWxsOwotCQlTdHJpbmcgbmV3VmFsdWUgPSBudWxsOwotCQlpZiAob2xkQXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRyID0gb2xkQXR0cjsKLQkJCW9sZFZhbHVlID0gb2xkQXR0ci5nZXRWYWx1ZSgpOwotCQl9Ci0JCWlmIChuZXdBdHRyICE9IG51bGwpIHsKLQkJCWF0dHIgPSBuZXdBdHRyOwotCQkJbmV3VmFsdWUgPSBuZXdBdHRyLmdldFZhbHVlKCk7Ci0JCX0KLQkJSURPTU5vZGUgbm90aWZpZXIgPSAoSURPTU5vZGUpIGVsZW1lbnQ7Ci0JCWludCBvZmZzZXQgPSBub3RpZmllci5nZXRTdGFydE9mZnNldCgpOwotCQlub3RpZnkobm90aWZpZXIsIElOb2RlTm90aWZpZXIuQ0hBTkdFLCBhdHRyLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIG9mZnNldCk7Ci0JCXByb3BlcnR5Q2hhbmdlZChub3RpZmllcik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5DaGFuZ2luZygpIHsKLQkJdGhpcy5jaGFuZ2luZyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5DaGFuZ2luZyhib29sZWFuIG5ld01vZGVsKSB7Ci0JCWJlZ2luQ2hhbmdpbmcoKTsKLQkJdGhpcy5kb2luZ05ld01vZGVsID0gbmV3TW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgY2FuY2VsUGVuZGluZygpIHsKLQkJLy8gd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIHNpemUgb2YgdGhpcyBhcnJheSwgc2luY2UKLQkJLy8gdGhlIGFycmF5IG1heSBiZSBiZWluZyBwcm9jZXNzZWQsIGluIHRoZSBkZWZlcnJlZCBub3RpZmljYXRpb24KLQkJLy8gbG9vcCwgYnV0IHdlIGNhbiBzaWduYWwgdGhhdCBhbGwKLQkJLy8gc2hvdWxkIGJlIGRpc2NhcmRlZCwgc28gYW55IHJlbWFpbmluZyBvbmVzIHdpbGwgYmUgaWdub3JlZC4KLQkJaWYgKHRoaXMuZkV2ZW50cyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGZFdmVudHMuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlOb3RpZnlFdmVudCBldmVudCA9IChOb3RpZnlFdmVudCkgZkV2ZW50cy5nZXQoaSk7Ci0JCQkJZXZlbnQuZGlzY2FyZGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLyB0aGlzIGNhbmNlbCBpcyBwcmVzdW1hYmx5IGJlaW5nIGNhbGxlZCBhcyBhIGZ1bmN0aW9uIG9mCi0JCS8vICJyZWluaXRpYWlsaXphdGlvbiIgc28gd2UgY2FuIGlnbm9yZSBjaGFuZ2VzIHRvIHRoZQotCQkvLyBvbGQgcm9vdCwgYW5kIGNoYW5nZXMgdG8gdGhlIG5ldyBvbmUgd2lsbCBiZSB0cmlnZ2VyZWQgZHVyaW5nCi0JCS8vIHJlaW5pdGlhbGl6YXRpb24uCi0JCWNoYW5nZWRSb290ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBjaGlsZFJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIHZvaWQgY2hpbGRSZXBsYWNlZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTU5vZGUgbm90aWZpZXIgPSAoSURPTU5vZGUpIHBhcmVudE5vZGU7Ci0JCWludCB0eXBlID0gSU5vZGVOb3RpZmllci5DSEFOR0U7Ci0JCWlmIChuZXdDaGlsZCA9PSBudWxsKQotCQkJdHlwZSA9IElOb2RlTm90aWZpZXIuUkVNT1ZFOwotCQllbHNlIGlmIChvbGRDaGlsZCA9PSBudWxsKQotCQkJdHlwZSA9IElOb2RlTm90aWZpZXIuQUREOwotCQlpbnQgb2Zmc2V0ID0gbm90aWZpZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJbm90aWZ5KG5vdGlmaWVyLCB0eXBlLCBvbGRDaGlsZCwgb2xkQ2hpbGQsIG5ld0NoaWxkLCBvZmZzZXQpOwotCQlzdHJ1Y3R1cmVDaGFuZ2VkKG5vdGlmaWVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlZGl0YWJsZUNoYW5nZWQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Ob2RlIG5vdGlmaWVyID0gKElET01Ob2RlKSBub2RlOwotCQlpbnQgb2Zmc2V0ID0gbm90aWZpZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJbm90aWZ5KG5vdGlmaWVyLCBJTm9kZU5vdGlmaWVyLkNIQU5HRSwgbnVsbCwgbnVsbCwgbnVsbCwgb2Zmc2V0KTsKLQkJcHJvcGVydHlDaGFuZ2VkKG5vdGlmaWVyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRDaGFuZ2luZygpIHsKLQkJdGhpcy5kb2luZ05ld01vZGVsID0gZmFsc2U7Ci0JCWlmICghdGhpcy5jaGFuZ2luZykKLQkJCXJldHVybjsgLy8gYXZvaWQgbmVzdGluZyBjYWxscwotCQlub3RpZnlEZWZlcnJlZCgpOwotCQlpZiAodGhpcy5jaGFuZ2VkUm9vdCAhPSBudWxsKSB7Ci0JCQlub3RpZnlTdHJ1Y3R1cmVDaGFuZ2VkKHRoaXMuY2hhbmdlZFJvb3QpOwotCQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCQlTdHJpbmcgcCA9IHRoaXMuY2hhbmdlZFJvb3QuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmVycmVkIFNUUlVDVFVSRV9DSEFOR0VEOiAiICsgcCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRoaXMuY2hhbmdlZFJvb3QgPSBudWxsOwotCQl9Ci0JCXRoaXMuY2hhbmdpbmcgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRUYWdDaGFuZ2VkKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NTm9kZSBub3RpZmllciA9IChJRE9NTm9kZSkgZWxlbWVudDsKLQkJaW50IG9mZnNldCA9IG5vdGlmaWVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCW5vdGlmeShub3RpZmllciwgSU5vZGVOb3RpZmllci5DSEFOR0UsIG51bGwsIG51bGwsIG51bGwsIG9mZnNldCk7Ci0JCXByb3BlcnR5Q2hhbmdlZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGFuZ2VkKCkgewotCQlyZXR1cm4gKHRoaXMuZkV2ZW50cyAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoYW5naW5nKCkgewotCQlyZXR1cm4gdGhpcy5jaGFuZ2luZzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5KElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmNoYW5naW5nICYmICF0aGlzLmZsdXNoaW5nKSB7Ci0JCQkvLyBkZWZlciBub3RpZmljYXRpb24KLQkJCWlmICh0aGlzLmZFdmVudHMgPT0gbnVsbCkKLQkJCQl0aGlzLmZFdmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvLyB3ZSBkbyBub3QgZGVmZXIgYW55dGhpbmcgaWYgd2UgYXJlIGRvaW5nIGEgbmV3IE1vZGVsLAotCQkJLy8gZXhjZXB0IGZvciB0aGUgZG9jdW1lbnQgZXZlbnQsIHNpbmNlIGFsbCBvdGhlcnMgYXJlCi0JCQkvLyB0cml2aWFsIGFuZCBub3QgbmVlZGVkIGF0IHRoYXQgaW5pdGlhbCBwb2ludC4KLQkJCS8vIEJ1dCBldmVuIGZvciB0aGF0IG9uZSBkb2N1bWVudCBldmVudCwgaW4gdGhlIG5ldyBtb2RlbCBjYXNlLAotCQkJLy8gaXQgaXMgc3RpbGwgaW1wb3J0YW50IHRvIGRlZmVyIGl0LgotCQkJaWYgKCghZG9pbmdOZXdNb2RlbCkgfHwgKCgoTm9kZSkgbm90aWZpZXIpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgewotCQkJCXRoaXMuZkV2ZW50cy5hZGQobmV3IE5vdGlmeUV2ZW50KG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcykpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQkvLyBJdHMgaW1wb3J0YW50IHRvICJrZWVwIGdvaW5nIiBpZiBleGNlcHRpb24gb2NjdXJzLCBzaW5jZSB0aGlzCi0JCQkvLyBub3RpZmljYXRpb24KLQkJCS8vIGNvbWVzIGluIGJldHdlZW4gImFib3V0IHRvIGNoYW5nZSIgYW5kICJjaGFuZ2VkIiBldmVudHMuIFdlIGRvCi0JCQkvLyBsb2csIGhvd2V2ZXIsCi0JCQkvLyBzaW5jZSB3b3VsZCBpbmRpY2F0ZSBhIHByb2dyYW0gZXJyb3IuCi0JCQlub3RpZmllci5ub3RpZnkoZXZlbnRUeXBlLCBjaGFuZ2VkRmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwb3MpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQSBzdHJ1Y3R1cmVkIG1vZGVsIGNsaWVudCB0aHJldyBmb2xsb3dpbmcgZXhjZXB0aW9uIGR1cmluZyBhZGFwdGVyIG5vdGlmaWNhdGlvbiAoIiArIElOb2RlTm90aWZpZXIuRVZFTlRfVFlQRV9TVFJJTkdTW2V2ZW50VHlwZV0gKyAiICkiLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5RGVmZXJyZWQoKSB7Ci0JCWlmICh0aGlzLmZFdmVudHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuZmx1c2hpbmcpCi0JCQlyZXR1cm47Ci0JCXRoaXMuZmx1c2hpbmcgPSB0cnVlOyAvLyBmb3JjZSBub3RpZmljYXRpb24KLQkJaW50IGNvdW50ID0gdGhpcy5mRXZlbnRzLnNpemUoKTsKLQkJCi0JCWlmICghZG9pbmdOZXdNb2RlbCAmJiBmT3B0aW1pemVEZWZlcnJlZCkgewotCQkJTWFwIG5vdGlmeUV2ZW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlOb3RpZnlFdmVudCBldmVudCA9IChOb3RpZnlFdmVudCkgdGhpcy5mRXZlbnRzLmdldChpKTsKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCQkJY29udGludWU7IC8vIGVycm9yCi0JCQkJZXZlbnQuaW5kZXggPSBpOwotCQkJCWlmKGV2ZW50LnR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpIHsKLQkJCQkJYWRkVG9NYXAoZXZlbnQub2xkVmFsdWUsIGV2ZW50LCBub3RpZnlFdmVudHMpOwotCQkJCX0KLQkJCQlpZihldmVudC50eXBlID09IElOb2RlTm90aWZpZXIuQUREKSB7Ci0JCQkJCWFkZFRvTWFwKGV2ZW50Lm5ld1ZhbHVlLCBldmVudCwgbm90aWZ5RXZlbnRzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlJdGVyYXRvciBpdCA9IG5vdGlmeUV2ZW50cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCU5vdGlmeUV2ZW50W10gZXMgPSAoTm90aWZ5RXZlbnRbXSkgaXQubmV4dCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXMubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQkJCU5vdGlmeUV2ZW50IGV2ZW50ID0gZXNbaV07Ci0JCQkJCWlmKGVzW2ldLmRpc2NhcmRlZCkgY29udGludWU7Ci0JCQkJCU5vdGlmeUV2ZW50IG5leHQgPSBlc1tpICsgMV07Ci0JCQkJCWlmKGVzW2ldLnR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQgJiYgbmV4dC50eXBlID09IElOb2RlTm90aWZpZXIuUkVNT1ZFKSB7Ci0JCQkJCQkvLyBBZGRlZCB0aGVuIHJlbW92ZWQgbGF0ZXIsIGRpc2NhcmQgYm90aAotCQkJCQkJZXZlbnQuZGlzY2FyZGVkID0gdHJ1ZTsKLQkJCQkJCW5leHQuZGlzY2FyZGVkID0gdHJ1ZTsKLQkJCQkJCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmeURlZmVycmVkKSB7Ci0JCQkJCQkJZXZlbnQucmVhc29uID0gZXZlbnQucmVhc29uICsgQURERURfVEhFTl9SRU1PVkVEICsgIihzZWUgIiArIG5leHQuaW5kZXggKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCW5leHQucmVhc29uID0gbmV4dC5yZWFzb24gKyBBRERFRF9USEVOX1JFTU9WRUQgKyAiKHNlZSAiICsgZXZlbnQuaW5kZXggKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJTm90aWZ5RXZlbnQgZXZlbnQgPSAoTm90aWZ5RXZlbnQpIHRoaXMuZkV2ZW50cy5nZXQoaSk7Ci0JCQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOyAvLyBlcnJvcgotCQkJCWlmKGV2ZW50LmRpc2NhcmRlZCkgY29udGludWU7Ci0JCQkJaWYgKGV2ZW50Lm5vdGlmaWVyICE9IG51bGwgJiYgZk9wdGltaXplRGVmZXJyZWRBY2NvcmRpbmdUb1BhcmVudEFkZGVkKSB7Ci0JCQkJCWlmIChldmVudC50eXBlID09IElOb2RlTm90aWZpZXIuQUREKSB7Ci0JCQkJCQlOb3RpZnlFdmVudFtdIGVzID0gKE5vdGlmeUV2ZW50W10pbm90aWZ5RXZlbnRzLmdldChldmVudC5ub3RpZmllcik7Ci0JCQkJCQlpZihlcyAhPSBudWxsKSBmb3IgKGludCBwID0gMDsgcCA8IGVzLmxlbmd0aCAmJiBlc1twXS5pbmRleCA8IGV2ZW50LmluZGV4OyBwKyspIHsKLQkJCQkJCQlOb3RpZnlFdmVudCBwcmV2ID0gZXNbcF07Ci0JCQkJCQkJaWYgKHByZXYudHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSAmJiBwcmV2Lm9sZFZhbHVlID09IGV2ZW50Lm5vdGlmaWVyKSB7Ci0JCQkJCQkJCS8vIHBhcmVudCBpcyByZXBhcmVudGVkLCBkbyBub3QgZGlzY2FyZAotCQkJCQkJCQlpZiAoRGVidWcuZGVidWdOb3RpZnlEZWZlcnJlZCkgewotCQkJCQkJCQkJZXZlbnQucmVhc29uID0gZXZlbnQucmVhc29uICsgUEFSRU5UX0lTX1JFUEFSRU5URUQgKyAiKHNlZSAiICsgcHJldi5pbmRleCArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfSBlbHNlIGlmIChwcmV2LnR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQgJiYgcHJldi5uZXdWYWx1ZSA9PSBldmVudC5ub3RpZmllcikgewotCQkJCQkJCQkvLyBwYXJlbnQgaGFzIGJlZW4gYWRkZWQsIGRpc2NhcmQgdGhpcwotCQkJCQkJCQlldmVudC5kaXNjYXJkZWQgPSB0cnVlOwotCQkJCQkJCQlpZiAoRGVidWcuZGVidWdOb3RpZnlEZWZlcnJlZCkgewotCQkJCQkJCQkJZXZlbnQucmVhc29uID0gZXZlbnQucmVhc29uICsgUEFSRU5UX0lTX0FEREVEICsgIihzZWUgIiArIHByZXYuaW5kZXggKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0JCQkJCQkJCi0JCQkJCX0JCQkJCQkKLQkJCQl9Ci0JCQkJaWYoZXZlbnQuZGlzY2FyZGVkKSBjb250aW51ZTsKLQkJCQlpZiAoZXZlbnQubm90aWZpZXIgIT0gbnVsbCAmJiBmT3B0aW1pemVEZWZlcnJlZEFjY29yZGluZ1RvUGFyZW50UmVtb3ZlZCkgewotCQkJCQlpZiAoZXZlbnQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSkgewotCQkJCQkJTm90aWZ5RXZlbnRbXSBlcyA9IChOb3RpZnlFdmVudFtdKW5vdGlmeUV2ZW50cy5nZXQoZXZlbnQubm90aWZpZXIpOwotCQkJCQkJaWYoZXMgIT0gbnVsbCkgZm9yIChpbnQgbiA9IDA7IG4gPCBlcy5sZW5ndGg7IG4rKykgewotCQkJCQkJCU5vdGlmeUV2ZW50IG5leHQgPSBlc1tuXTsKLQkJCQkJCQlpZihuZXh0LmluZGV4ID4gZXZlbnQuaW5kZXggJiYgbmV4dC50eXBlID09IElOb2RlTm90aWZpZXIuUkVNT1ZFKSB7Ci0JCQkJCQkJCWlmIChuZXh0Lm9sZFZhbHVlID09IGV2ZW50Lm5vdGlmaWVyKSB7Ci0JCQkJCQkJCQkvLyBwYXJlbnQgd2lsbCBiZSByZW1vdmVkLCBkaXNjYXJkIHRoaXMKLQkJCQkJCQkJCWV2ZW50LmRpc2NhcmRlZCA9IHRydWU7Ci0JCQkJCQkJCQlpZiAoRGVidWcuZGVidWdOb3RpZnlEZWZlcnJlZCkgewotCQkJCQkJCQkJCWV2ZW50LnJlYXNvbiA9IGV2ZW50LnJlYXNvbiArIFBBUkVOVF9JU19SRU1PVkVEX1RPTyArICIoc2VlICIgKyBuZXh0LmluZGV4ICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9CQkJCQkJCi0JCQkJfQotCQkJCWlmKGV2ZW50LmRpc2NhcmRlZCkgY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlOb3RpZnlFdmVudCBldmVudCA9IChOb3RpZnlFdmVudCkgdGhpcy5mRXZlbnRzLmdldChpKTsKLQkJCWlmIChldmVudCA9PSBudWxsKQotCQkJCWNvbnRpbnVlOyAvLyBlcnJvcgotCQkJaWYoZXZlbnQuZGlzY2FyZGVkKSBjb250aW51ZTsKLQkJCW5vdGlmeShldmVudC5ub3RpZmllciwgZXZlbnQudHlwZSwgZXZlbnQuY2hhbmdlZEZlYXR1cmUsIGV2ZW50Lm9sZFZhbHVlLCBldmVudC5uZXdWYWx1ZSwgZXZlbnQucG9zKTsKLQkJfQotCQlpZiAoRGVidWcuZGVidWdOb3RpZnlEZWZlcnJlZCkgewotCQkJZm9yIChpbnQgbCA9IDA7IGwgPCBjb3VudDsgbCsrKSB7Ci0JCQkJTm90aWZ5RXZlbnQgZXZlbnQgPSAoTm90aWZ5RXZlbnQpIHRoaXMuZkV2ZW50cy5nZXQobCk7Ci0JCQkJT2JqZWN0IG8gPSBudWxsOwotCQkJCVN0cmluZyB0ID0gbnVsbDsKLQkJCQlpZiAoZXZlbnQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCkgewotCQkJCQlvID0gZXZlbnQubmV3VmFsdWU7Ci0JCQkJCXQgPSAiICsgIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSkgewotCQkJCQlvID0gZXZlbnQub2xkVmFsdWU7Ci0JCQkJCXQgPSAiIC0gIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAobyBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQkJU3RyaW5nIHAgPSAoKE5vZGUpIGV2ZW50Lm5vdGlmaWVyKS5nZXROb2RlTmFtZSgpOwotCQkJCQlTdHJpbmcgYyA9ICgoTm9kZSkgbykuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJU3RyaW5nIGQgPSAoZXZlbnQuZGlzY2FyZGVkID8gIiEgIiA6ICIgICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGQgKyBwICsgdCArIGMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0aGlzLmZsdXNoaW5nID0gZmFsc2U7Ci0JCXRoaXMuZkV2ZW50cyA9IG51bGw7Ci0JfQotCi0Jdm9pZCBhZGRUb01hcChPYmplY3QgbywgTm90aWZ5RXZlbnQgZXZlbnQsIE1hcCBtYXApIHsKLQkJaWYobyA9PSBudWxsKSByZXR1cm47Ci0JCU9iamVjdCB4ID0gbWFwLmdldChvKTsKLQkJaWYoeCA9PSBudWxsKSB7Ci0JCQltYXAucHV0KG8sIG5ldyBOb3RpZnlFdmVudFtde2V2ZW50fSk7Ci0JCX0gZWxzZSB7Ci0JCQlOb3RpZnlFdmVudFtdIGVzID0gKE5vdGlmeUV2ZW50W10peDsKLQkJCU5vdGlmeUV2ZW50W10gZXMyID0gbmV3IE5vdGlmeUV2ZW50W2VzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShlcywgMCwgZXMyLCAwLCBlcy5sZW5ndGgpOwotCQkJZXMyW2VzLmxlbmd0aF0gPSBldmVudDsKLQkJCW1hcC5wdXQobywgZXMyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBub3RpZnlTdHJ1Y3R1cmVDaGFuZ2VkKE5vZGUgcm9vdCkgewotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIHJvb3Q7Ci0JCXRyeSB7Ci0JCQkvLyBJdHMgaW1wb3J0YW50IHRvICJrZWVwIGdvaW5nIiBpZiBleGNlcHRpb24gb2NjdXJzLCBzaW5jZSB0aGlzCi0JCQkvLyBub3RpZmljYXRpb24KLQkJCS8vIGNvbWVzIGluIGJldHdlZW4gImFib3V0IHRvIGNoYW5nZSIgYW5kICJjaGFuZ2VkIiBldmVudHMuIFdlIGRvCi0JCQkvLyBsb2csIGhvd2V2ZXIsCi0JCQkvLyBzaW5jZSB3b3VsZCBpbmRpY2F0ZSBhIHByb2dyYW0gZXJyb3IuCi0JCQlub3RpZmllci5ub3RpZnkoSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCwgbnVsbCwgbnVsbCwgbnVsbCwgLTEpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQSBzdHJ1Y3R1cmVkIG1vZGVsIGNsaWVudCB0aHJldyBmb2xsb3dpbmcgZXhjZXB0aW9uIGR1cmluZyBhZGFwdGVyIG5vdGlmaWNhdGlvbiAoIiArIElOb2RlTm90aWZpZXIuRVZFTlRfVFlQRV9TVFJJTkdTW0lOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRURdICsgIiApIiwgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoTm9kZSBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0Q29tbW9uUm9vdElmTmVlZGVkKE5vZGUgbm9kZSkgewotCQkvLyBkZWZlciBub3RpZmljYXRpb24KLQkJaWYgKHRoaXMuY2hhbmdlZFJvb3QgPT0gbnVsbCkgewotCQkJdGhpcy5jaGFuZ2VkUm9vdCA9IG5vZGU7Ci0JCX0gZWxzZSB7Ci0JCQkvLyB0aW55IG9wdGltaXphdGlvbjogaWYgcHJldmlvdXMgY29tbW9uQW5jZXN0b3IgKGNoYW5nZWRSb290KSBpcwotCQkJLy8gYWxyZWFkeSAnZG9jdW1lbnQnLAotCQkJLy8gb3IgaWYgYWxyZWFkeSBlcXVhbCB0byB0aGlzICdub2RlJywKLQkJCS8vIHRoZW4gbm8gbmVlZCB0byByZS1jYWxjdWxhdGUKLQkJCWlmIChjaGFuZ2VkUm9vdC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSAmJiBjaGFuZ2VkUm9vdCAhPSBub2RlKSB7Ci0JCQkJTm9kZSBjb21tb24gPSAoKE5vZGVJbXBsKSB0aGlzLmNoYW5nZWRSb290KS5nZXRDb21tb25BbmNlc3Rvcihub2RlKTsKLQkJCQlpZiAoY29tbW9uICE9IG51bGwpCi0JCQkJCXRoaXMuY2hhbmdlZFJvb3QgPSBjb21tb247Ci0JCQkJZWxzZQotCQkJCQl0aGlzLmNoYW5nZWRSb290ID0gbm9kZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0VGFnQ2hhbmdlZChFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTU5vZGUgbm90aWZpZXIgPSAoSURPTU5vZGUpIGVsZW1lbnQ7Ci0JCWludCBvZmZzZXQgPSBub3RpZmllci5nZXRTdGFydE9mZnNldCgpOwotCQlub3RpZnkobm90aWZpZXIsIElOb2RlTm90aWZpZXIuQ0hBTkdFLCBudWxsLCBudWxsLCBudWxsLCBvZmZzZXQpOwotCQlwcm9wZXJ0eUNoYW5nZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc3RydWN0dXJlQ2hhbmdlZChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzQ2hhbmdpbmcoKSkgewotCQkJc2V0Q29tbW9uUm9vdElmTmVlZGVkKG5vZGUpOwotCQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCQlTdHJpbmcgcCA9IHRoaXMuY2hhbmdlZFJvb3QuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlcXVlc3RlZCBTVFJVQ1RVUkVfQ0hBTkdFRDogIiArIHApOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCVN0cmluZyBwID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTVFJVQ1RVUkVfQ0hBTkdFRDogIiArIHApOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJbm90aWZ5U3RydWN0dXJlQ2hhbmdlZChub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiB2YWx1ZUNoYW5nZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Ob2RlIG5vdGlmaWVyID0gbnVsbDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQlBdHRyIGF0dHIgPSAoQXR0cikgbm9kZTsKLQkJCW5vdGlmaWVyID0gKElET01Ob2RlKSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotCQkJLy8gVE9ET19kbXc6IGV4cGVyaW1lbnRhbDogY2hhbmdlZCAwNi8yOS8yMDA0IHRvIHNlbmQgInN0cnVjdHV1cmUKLQkJCS8vIGNoYW5nZWQiIGV2ZW4gZm9yIGF0dHJpYnV0ZSB2YWx1ZSBjaGFuZ2VzCi0JCQkvLyB0aGVyZSBhcmUgcHJvcyBhbmQgY29ucyB0byBjb25zaWRlcmluZyBhdHRyaWJ1dGUgdmFsdWUKLQkJCS8vICJzdHJ1Y3R1cmUgY2hhbmdlZCIuIFdpbGwgKHJlKWNvbnNpZGVyCi0JCQkvLyBzZXRDb21tb25Sb290SWZOZWVkZWQobm90aWZpZXIpOwotCQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJU3RyaW5nIHZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotCQkJaW50IG9mZnNldCA9IG5vdGlmaWVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlub3RpZnkobm90aWZpZXIsIElOb2RlTm90aWZpZXIuQ0hBTkdFLCBhdHRyLCBudWxsLCB2YWx1ZSwgb2Zmc2V0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIG5vdGU6IHdlIGRvIG5vdCBzZW5kIHN0cnVjdHVyZWQgY2hhbmdlZCBldmVudCBmb3IgY29udGVudAotCQkJLy8gY2hhbmdlZAotCQkJbm90aWZpZXIgPSAoSURPTU5vZGUpIG5vZGU7Ci0JCQlTdHJpbmcgdmFsdWUgPSBub2RlLmdldE5vZGVWYWx1ZSgpOwotCQkJaW50IG9mZnNldCA9IG5vdGlmaWVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlub3RpZnkobm90aWZpZXIsIElOb2RlTm90aWZpZXIuQ0hBTkdFLCBudWxsLCBudWxsLCB2YWx1ZSwgb2Zmc2V0KTsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlJRE9NTm9kZSBwYXJlbnQgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlub3RpZnkocGFyZW50LCBJTm9kZU5vdGlmaWVyLkNPTlRFTlRfQ0hBTkdFRCwgbm9kZSwgbnVsbCwgdmFsdWUsIG9mZnNldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXByb3BlcnR5Q2hhbmdlZChub3RpZmllcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbFBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjg5M2JiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5pbXBsLkNvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbC5Db21tZW50RWxlbWVudFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogWE1MTW9kZWxQYXJzZXIKLSAqLwotcHVibGljIGNsYXNzIFhNTE1vZGVsUGFyc2VyIHsKLQlwcml2YXRlIFhNTE1vZGVsQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIERPTU1vZGVsSW1wbCBtb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBUZXh0SW1wbCBsYXN0VGV4dE5vZGUgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFhNTE1vZGVsUGFyc2VyKERPTU1vZGVsSW1wbCBtb2RlbCkgewotCQlzdXBlcigpOwotCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5CZUltcGxpY2l0VGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlNb2RlbFBhcnNlckFkYXB0ZXIgYWRhcHRlciA9IGdldFBhcnNlckFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuY2FuQmVJbXBsaWNpdFRhZyhlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuQmVJbXBsaWNpdFRhZyhFbGVtZW50IGVsZW1lbnQsIE5vZGUgY2hpbGQpIHsKLQkJTW9kZWxQYXJzZXJBZGFwdGVyIGFkYXB0ZXIgPSBnZXRQYXJzZXJBZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBhZGFwdGVyLmNhbkJlSW1wbGljaXRUYWcoZWxlbWVudCwgY2hpbGQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5Db250YWluKEVsZW1lbnQgZWxlbWVudCwgTm9kZSBjaGlsZCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUVsZW1lbnRJbXBsIGltcGwgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0JCWlmIChpbXBsLmlzRW5kVGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIGludmFsaWQgKGZsb2F0aW5nKSBlbmQgdGFnCi0JCWlmICghaW1wbC5pc0NvbnRhaW5lcigpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkgewotCQkJaWYgKGltcGwuaXNKU1BDb250YWluZXIoKSB8fCBpbXBsLmlzQ0RBVEFDb250YWluZXIoKSkgewotCQkJCS8vIGFjY2VwdHMgb25seSBUZXh0IGNoaWxkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCU1vZGVsUGFyc2VyQWRhcHRlciBhZGFwdGVyID0gZ2V0UGFyc2VyQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5jYW5Db250YWluKGVsZW1lbnQsIGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlQXR0ckVxdWFsKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm47Ci0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXRSb290Tm9kZSgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIG5vZGUgPSByb290LmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7Ci0JCQkJLy8ganVzdCBub3RpZnkgdGhlIGNoYW5nZSBpbnN0ZWFkIG9mIHNldHRpbmcgZGF0YQotCQkJCVByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgcGkgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCkgbm9kZTsKLQkJCQlwaS5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkvLyBhY3R1YWxseSwgZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIGNoYW5nZUF0dHJOYW1lIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VBdHRyTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOwotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgewotCQkJCS8vIGp1c3Qgbm90aWZ5IHRoZSBjaGFuZ2UgaW5zdGVhZCBvZiBzZXR0aW5nIGRhdGEKLQkJCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwpIG5vZGU7Ci0JCQkJcGkubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChhdHRyLmdldE5hbWVSZWdpb24oKSAhPSByZWdpb24pCi0JCQkJY29udGludWU7Ci0KLQkJCVN0cmluZyBuYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJYXR0ci5zZXROYW1lKG5hbWUpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VBdHRyVmFsdWUgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZUF0dHJWYWx1ZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOwotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgewotCQkJCS8vIGp1c3Qgbm90aWZ5IHRoZSBjaGFuZ2UgaW5zdGVhZCBvZiBzZXR0aW5nIGRhdGEKLQkJCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwpIG5vZGU7Ci0JCQkJcGkubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChhdHRyLmdldFZhbHVlUmVnaW9uKCkgIT0gcmVnaW9uKQotCQkJCWNvbnRpbnVlOwotCQkJLy8ganVzdCBub3RpZnkgdGhlIGNoYW5nZSBpbnN0ZWFkIG9mIHNldHRpbmcgdmFsdWUKLQkJCWF0dHIubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNoYW5nZURhdGEgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZURhdGEoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWludCBvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybjsKLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgbm9kZSA9IHJvb3QuZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG5vZGU7Ci0JCQkJaWYgKHRleHQuaXNTaGFyaW5nU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKSkgewotCQkJCQkvLyBoYXMgY29uc2VjdXRpdmUgdGV4dCBzaGFyaW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobm9kZSk7Ci0JCQkJY2xlYW51cFRleHQoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCS8vIGNvbW1lbnQgdGFnCi0JCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQlyZXR1cm47Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBqdXN0IG5vdGlmeSB0aGUgY2hhbmdlIGluc3RlYWQgb2Ygc2V0dGluZyBkYXRhCi0JCU5vZGVJbXBsIGltcGwgPSAoTm9kZUltcGwpIG5vZGU7Ci0JCWltcGwubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZUVuZFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMpIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgY2hhbmdlIGlzIG9ubHkgZm9yIGNsb3NlIHRhZwotCQlpZiAobmV3UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gbmV3UmVnaW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKQotCQkJCQljb250aW51ZTsKLQotCQkJCS8vIG90aGVyIHJlZ2lvbiBoYXMgY2hhbmdlZAotCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmIChvbGRSZWdpb25zICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGUgPSBvbGRSZWdpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJLy8gb3RoZXIgcmVnaW9uIGhhcyBjaGFuZ2VkCi0JCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGFuZ2UgZm9yIGNsb3NlIHRhZyBoYXMgbm8gaW1wYWN0Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0Jdm9pZCBjaGFuZ2VSZWdpb24oUmVnaW9uQ2hhbmdlZEV2ZW50IGNoYW5nZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsIHx8IHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRoaXMuY29udGV4dCA9IG5ldyBYTUxNb2RlbENvbnRleHQodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpKTsKLQkJCi0JCS8vZGV0ZXJtaW5lIGlmIGNoYW5nZSB3YXMgd2hpdGVzcGFjZSBvbmx5IGNoYW5nZQotCQlib29sZWFuIGlzV2hpdGVzcGFjZUNoYW5nZSA9IGZhbHNlOwotCQlpZihjaGFuZ2UuZ2V0VGV4dCgpICE9IG51bGwgJiYgY2hhbmdlLmdldFRleHQoKS5sZW5ndGgoKSA+IDApIHsKLQkJCWlzV2hpdGVzcGFjZUNoYW5nZSA9IENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2hhbmdlLmdldFRleHQoKS5jaGFyQXQoMCkpOwotCQl9IGVsc2UgaWYoY2hhbmdlLmdldERlbGV0ZWRUZXh0KCkgIT0gbnVsbCAmJiBjaGFuZ2UuZ2V0RGVsZXRlZFRleHQoKS5sZW5ndGgoKSA+IDApIHsKLQkJCWlzV2hpdGVzcGFjZUNoYW5nZSA9IENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2hhbmdlLmdldERlbGV0ZWRUZXh0KCkuY2hhckF0KDApKTsKLQkJfQotCi0JCS8vIG9wdGltaXplIHR5cGljYWwgY2FzZXMKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCB8fCBpc05lc3RlZENvbnRlbnQocmVnaW9uVHlwZSkpIHsKLQkJCWNoYW5nZURhdGEoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCWlmIChpc1doaXRlc3BhY2VDaGFuZ2UgJiYgKGNoYW5nZS5nZXRPZmZzZXQoKSA+PSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFRleHRFbmQoKSkpIHsKLQkJCQkvLyBjaGFuZ2UgaXMgZW50aXJlbHkgaW4gd2hpdGUtc3BhY2UKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljaGFuZ2VBdHRyTmFtZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWlmIChpc1doaXRlc3BhY2VDaGFuZ2UgJiYgKGNoYW5nZS5nZXRPZmZzZXQoKSA+PSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFRleHRFbmQoKSkpIHsKLQkJCQkvLyBjaGFuZ2UgaXMgZW50aXJlbHkgaW4gd2hpdGUtc3BhY2UKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljaGFuZ2VBdHRyVmFsdWUoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJaWYgKGlzV2hpdGVzcGFjZUNoYW5nZSAmJiAoY2hhbmdlLmdldE9mZnNldCgpID49IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyByZWdpb24uZ2V0VGV4dEVuZCgpKSkgewotCQkJCS8vIGNoYW5nZSBpcyBlbnRpcmVseSBpbiB3aGl0ZS1zcGFjZQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNoYW5nZUF0dHJFcXVhbChmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkVGFnTmFtZShyZWdpb25UeXBlKSkgewotCQkJaWYgKGlzV2hpdGVzcGFjZUNoYW5nZSAmJiAoY2hhbmdlLmdldE9mZnNldCgpID49IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyByZWdpb24uZ2V0VGV4dEVuZCgpKSkgewotCQkJCS8vIGNoYW5nZSBpcyBlbnRpcmVseSBpbiB3aGl0ZS1zcGFjZQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNoYW5nZVRhZ05hbWUoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQl9Ci0JfQotCi0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VTdGFydFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMpIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0KLQkJLy8gY2hlY2sgaWYgY2hhbmdlcyBhcmUgb25seSBmb3IgYXR0cmlidXRlcyBhbmQgY2xvc2UgdGFnCi0JCWJvb2xlYW4gdGFnTmFtZVVuY2hhbmdlZCA9IGZhbHNlOwotCQlpZiAobmV3UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gbmV3UmVnaW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJLy8gY2hhbmdlIGZyb20gZW1wdHkgdGFnIG1heSBoYXZlIGltcGFjdCBvbiBzdHJ1Y3R1cmUKLQkJCQkJaWYgKCFlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkVGFnTmFtZShyZWdpb25UeXBlKSkgewotCQkJCQlTdHJpbmcgb2xkVGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCQlTdHJpbmcgbmV3VGFnTmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCQkJaWYgKG9sZFRhZ05hbWUgIT0gbnVsbCAmJiBuZXdUYWdOYW1lICE9IG51bGwgJiYgb2xkVGFnTmFtZS5lcXVhbHMobmV3VGFnTmFtZSkpIHsKLQkJCQkJCS8vIHRoZSB0YWcgbmFtZSBpcyB1bmNoYW5nZWQKLQkJCQkJCXRhZ05hbWVVbmNoYW5nZWQgPSB0cnVlOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBvdGhlciByZWdpb24gaGFzIGNoYW5nZWQKLQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpZiAob2xkUmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gb2xkUmVnaW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJLy8gY2hhbmdlIGZyb20gZW1wdHkgdGFnIG1heSBoYXZlIGltcGFjdCBvbiBzdHJ1Y3R1cmUKLQkJCQkJaWYgKCFlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkVGFnTmFtZShyZWdpb25UeXBlKSkgewotCQkJCQkvLyBpZiBuZXcgdGFnIG5hbWUgaXMgdW5jaGFuZ2VkLCBpdCdzIE9LCi0JCQkJCWlmICh0YWdOYW1lVW5jaGFuZ2VkKQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJLy8gb3RoZXIgcmVnaW9uIGhhcyBjaGFuZ2VkCi0JCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyB1cGRhdGUgYXR0cmlidXRlcwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQkvLyBmaXJzdCByZW1vdmUgYXR0cmlidXRlcwotCQlpbnQgcmVnaW9uSW5kZXggPSAwOwotCQlpbnQgYXR0ckluZGV4ID0gMDsKLQkJQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCXdoaWxlIChhdHRySW5kZXggPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpKSB7Ci0JCQlhdHRyID0gKEF0dHJJbXBsKSBhdHRyaWJ1dGVzLml0ZW0oYXR0ckluZGV4KTsKLQkJCWlmIChhdHRyID09IG51bGwpIHsgLy8gZXJyb3IKLQkJCQlhdHRySW5kZXgrKzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBhdHRyLmdldE5hbWVSZWdpb24oKTsKLQkJCWlmIChuYW1lUmVnaW9uID09IG51bGwpIHsgLy8gZXJyb3IKLQkJCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gcmVnaW9uSW5kZXg7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJaWYgKHJlZ2lvbiA9PSBuYW1lUmVnaW9uKSB7Ci0JCQkJCXJlZ2lvbkluZGV4ID0gaSArIDE7IC8vIG5leHQgcmVnaW9uCi0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZvdW5kKSB7Ci0JCQkJYXR0ckluZGV4Kys7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbnNlcnQgb3IgdXBkYXRlIGF0dHJpYnV0ZXMKLQkJYXR0ckluZGV4ID0gMDsgLy8gcmVzZXQgdG8gZmlyc3QKLQkJQXR0ckltcGwgbmV3QXR0ciA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIG9sZFZhbHVlUmVnaW9uID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJaWYgKG5ld0F0dHIgIT0gbnVsbCkgewotCQkJCQkvLyBpbnNlcnQgZGVmZXJyZWQgbmV3IGF0dHJpYnV0ZQotCQkJCQllbGVtZW50Lmluc2VydEF0dHJpYnV0ZU5vZGUobmV3QXR0ciwgYXR0ckluZGV4KyspOwotCQkJCQluZXdBdHRyID0gbnVsbDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYXR0ciAhPSBudWxsICYmIG9sZFZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJLy8gbm90aWZ5IGV4aXN0aW5nIGF0dHJpYnV0ZSB2YWx1ZSByZW1vdmFsCi0JCQkJCWF0dHIubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQkJfQotCi0JCQkJb2xkVmFsdWVSZWdpb24gPSBudWxsOwotCQkJCWF0dHIgPSAoQXR0ckltcGwpIGF0dHJpYnV0ZXMuaXRlbShhdHRySW5kZXgpOwotCQkJCWlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5nZXROYW1lUmVnaW9uKCkgPT0gcmVnaW9uKSB7Ci0JCQkJCS8vIGV4aXN0aW5nIGF0dHJpYnV0ZQotCQkJCQlhdHRySW5kZXgrKzsKLQkJCQkJLy8gY2xlYXIgb3RoZXIgcmVnaW9ucwotCQkJCQlvbGRWYWx1ZVJlZ2lvbiA9IGF0dHIuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihudWxsKTsKLQkJCQkJYXR0ci5zZXRWYWx1ZVJlZ2lvbihudWxsKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJCQlhdHRyID0gKEF0dHJJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlQXR0cmlidXRlKG5hbWUpOwotCQkJCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJCQkJYXR0ci5zZXROYW1lUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCS8vIGRlZmVyIGluc2VydGlvbiBvZiBuZXcgYXR0cmlidXRlCi0JCQkJCW5ld0F0dHIgPSBhdHRyOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0RXF1YWxSZWdpb24ocmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0VmFsdWVSZWdpb24ocmVnaW9uKTsKLQkJCQkJaWYgKGF0dHIgIT0gbmV3QXR0ciAmJiBvbGRWYWx1ZVJlZ2lvbiAhPSByZWdpb24pIHsKLQkJCQkJCS8vIG5vdGlmeSBleGlzdGluZyBhdHRyaWJ1dGUgdmFsdWUgY2hhbmdlZAotCQkJCQkJYXR0ci5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCQkJfQotCQkJCQlvbGRWYWx1ZVJlZ2lvbiA9IG51bGw7Ci0JCQkJCWF0dHIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChuZXdBdHRyICE9IG51bGwpIHsKLQkJCS8vIGluc2VydCBkZWZlcnJlZCBuZXcgYXR0cmlidXRlCi0JCQllbGVtZW50LmFwcGVuZEF0dHJpYnV0ZU5vZGUobmV3QXR0cik7Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ciAhPSBudWxsICYmIG9sZFZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIG5vdGlmeSBleGlzdGluZyBhdHRyaWJ1dGUgdmFsdWUgcmVtb3ZhbAotCQkJYXR0ci5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLm1vZGVsLmdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlzZXR1cENvbnRleHQoZmxhdE5vZGUpOwotCi0JCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGUgcGFyZW50IGlzIHNldCB0byBkZWVwZXN0IGxldmVsCi0JCS8vIHdoZW4gZW5kIHRhZyBoYXMgYmVlbiByZW1vdmVkCi0JCXRoaXMuY29udGV4dC5zZXRMYXN0KCk7Ci0JCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0KLQkJY2xlYW51cFRleHQoKTsKLQkJY2xlYW51cEVuZFRhZygpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VUYWdOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXRSb290Tm9kZSgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlIG5vZGUgPSByb290LmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQlTdHJpbmcgbmV3VGFnTmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJaWYgKG5ld1RhZ05hbWUgPT0gbnVsbCB8fCAhZWxlbWVudC5tYXRjaFRhZ05hbWUobmV3VGFnTmFtZSkpIHsKLQkJCS8vIHRoZSB0YWcgbmFtZSBpcyBjaGFuZ2VkCi0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gdGhlIHRhZyBuYW1lIGlzIHVuY2hhbmdlZAotCQkvLyB0aGlzIGhhcHBlbnMgd2hlbiB0eXBpbmcgc3BhY2VzIGFmdGVyIHRoZSB0YWcgbmFtZQotCQkvLyBkbyBub3RoaW5nLCBidXQuLi4KLQkJLy8gaWYgaXQncyBub3QgYSBjaGFuZ2UgaW4gdGhlIGVuZCB0YWcgb2YgYW4gZWxlbWVudCB3aXRoIHRoZSBzdGFydAotCQkvLyB0YWcsCi0JCS8vIGFuZCBjYXNlIGhhcyBiZWVuIGNoYW5nZWQsIHNldCB0byBlbGVtZW50IGFuZCBub3RpZnkKLQkJaWYgKCFlbGVtZW50Lmhhc1N0YXJ0VGFnKCkgfHwgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFJlZ2lvblR5cGUoZmxhdE5vZGUpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCWlmICh0YWdOYW1lID09IG51bGwgfHwgIXRhZ05hbWUuZXF1YWxzKG5ld1RhZ05hbWUpKSB7Ci0JCQkJZWxlbWVudC5zZXRUYWdOYW1lKG5ld1RhZ05hbWUpOwotCQkJCWVsZW1lbnQubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbGVhbnVwQ29udGV4dCBtZXRob2QKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYW51cEVuZFRhZygpIHsKLQkJTm9kZSBwYXJlbnQgPSB0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlOb2RlIG5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQl3aGlsZSAobmV4dCAhPSBudWxsKSB7Ci0JCQkJaWYgKG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJCQlpZiAoZWxlbWVudC5pc0VuZFRhZygpKSB7Ci0JCQkJCQkvLyBmbG9hdGluZyBlbmQgdGFnCi0JCQkJCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCQkJU3RyaW5nIHJvb3ROYW1lID0gZ2V0RmluZFJvb3ROYW1lKHRhZ05hbWUpOwotCQkJCQkJRWxlbWVudEltcGwgc3RhcnQgPSAoRWxlbWVudEltcGwpIHRoaXMuY29udGV4dC5maW5kU3RhcnRUYWcodGFnTmFtZSwgcm9vdE5hbWUpOwotCQkJCQkJaWYgKHN0YXJ0ICE9IG51bGwpIHsKLQkJCQkJCQlpbnNlcnRFbmRUYWcoc3RhcnQpOwotCQkJCQkJCS8vIG1vdmUgdGhlIGVuZCB0YWcgZnJvbSAnZWxlbWVudCcgdG8gJ3N0YXJ0JwotCQkJCQkJCXN0YXJ0LmFkZEVuZFRhZyhlbGVtZW50KTsKLQkJCQkJCQlyZW1vdmVOb2RlKGVsZW1lbnQpOwotCQkJCQkJCXBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQkJbmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTm9kZSBmaXJzdCA9IG5leHQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChmaXJzdCAhPSBudWxsKSB7Ci0JCQkJCXBhcmVudCA9IG5leHQ7Ci0JCQkJCW5leHQgPSBmaXJzdDsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQkJCWlmICghZWxlbWVudC5oYXNFbmRUYWcoKSAmJiBlbGVtZW50Lmhhc1N0YXJ0VGFnKCkgJiYgZWxlbWVudC5nZXROZXh0U2libGluZygpID09IG51bGwpIHsKLQkJCQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCQkJRWxlbWVudEltcGwgZW5kID0gKEVsZW1lbnRJbXBsKSB0aGlzLmNvbnRleHQuZmluZEVuZFRhZyh0YWdOYW1lKTsKLQkJCQkJaWYgKGVuZCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBtb3ZlIHRoZSBlbmQgdGFnIGZyb20gJ2VuZCcgdG8gJ2VsZW1lbnQnCi0JCQkJCQllbGVtZW50LmFkZEVuZFRhZyhlbmQpOwotCQkJCQkJcmVtb3ZlRW5kVGFnKGVuZCk7Ci0JCQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOyAvLyByZXNldCBjb250ZXh0Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJbmV4dCA9IHBhcmVudC5nZXROZXh0U2libGluZygpOwotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXBUZXh0KCkgewotCQlpZiAobGFzdFRleHROb2RlICE9IG51bGwpIHsKLQkJCWxhc3RUZXh0Tm9kZS5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCWxhc3RUZXh0Tm9kZSA9IG51bGw7Ci0JCX0KLQkJTm9kZSBwYXJlbnQgPSB0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCU5vZGUgbmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQlOb2RlIHByZXYgPSAobmV4dCA9PSBudWxsID8gcGFyZW50LmdldExhc3RDaGlsZCgpIDogbmV4dC5nZXRQcmV2aW91c1NpYmxpbmcoKSk7Ci0KLQkJVGV4dEltcGwgbmV4dFRleHQgPSBudWxsOwotCQlUZXh0SW1wbCBwcmV2VGV4dCA9IG51bGw7Ci0JCWlmIChuZXh0ICE9IG51bGwgJiYgbmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQluZXh0VGV4dCA9IChUZXh0SW1wbCkgbmV4dDsKLQkJfQotCQlpZiAocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJcHJldlRleHQgPSAoVGV4dEltcGwpIHByZXY7Ci0JCX0KLQkJaWYgKG5leHRUZXh0ID09IG51bGwgJiYgcHJldlRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5leHRUZXh0ICE9IG51bGwgJiYgcHJldlRleHQgIT0gbnVsbCkgewotCQkJLy8gY29uc2VjdXRpdmUgVGV4dCBub2RlcyBjcmVhdGVkIGJ5IHNldHVwQ29udGV4dCgpLAotCQkJLy8gY29uY2F0IHRoZW0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXh0VGV4dC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJCXByZXZUZXh0LmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlOb2RlIG5ld05leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQlwYXJlbnQucmVtb3ZlQ2hpbGQobmV4dCk7Ci0JCQluZXh0ID0gbnVsbDsKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXdOZXh0KTsKLQkJfQotCi0JCVRleHRJbXBsIGNoaWxkVGV4dCA9IChwcmV2VGV4dCAhPSBudWxsID8gcHJldlRleHQgOiBuZXh0VGV4dCk7Ci0JCWlmIChjaGlsZFRleHQuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsICYmIGNoaWxkVGV4dC5nZXRQcmV2aW91c1NpYmxpbmcoKSA9PSBudWxsKSB7Ci0JCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50SW1wbCBwYXJlbnRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQkJaWYgKCFwYXJlbnRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkgJiYgIXBhcmVudEVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJaWYgKGNoaWxkVGV4dC5pc1doaXRlc3BhY2UoKSB8fCBjaGlsZFRleHQuaXNJbnZhbGlkKCkpIHsKLQkJCQkJCS8vIGltcGxpY2l0IHBhcmVudCBpcyBub3QgcmVxdWlyZWQKLQkJCQkJCU5vZGUgbmV3UGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmIChuZXdQYXJlbnQgIT0gbnVsbCkgewotCQkJCQkJCU5vZGUgbmV3TmV4dCA9IHBhcmVudC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCW5ld1BhcmVudC5yZW1vdmVDaGlsZChwYXJlbnQpOwotCQkJCQkJCXBhcmVudC5yZW1vdmVDaGlsZChjaGlsZFRleHQpOwotCQkJCQkJCW5ld1BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGRUZXh0LCBuZXdOZXh0KTsKLQkJCQkJCQlpZiAoY2hpbGRUZXh0ID09IG5leHQpIHsKLQkJCQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGNoaWxkVGV4dCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKG5ld05leHQgIT0gbnVsbCkgewotCQkJCQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV3TmV4dCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShuZXdQYXJlbnQpOwotCQkJCQkJCX0KLQkJCQkJCQkvLyB0cnkgYWdhaW4KLQkJCQkJCQljbGVhbnVwVGV4dCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyByb3V0aW5lIGNyZWF0ZSBhbiBFbGVtZW50IGZyb20gY29tbWVudCBkYXRhIGZvciBjb21tZW50IHN0eWxlCi0JICogZWxlbWVudHMsIHN1Y2ggYXMgU1NJIGFuZCBNRVRBREFUQQotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50IGNyZWF0ZUNvbW1lbnRFbGVtZW50KFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKSB7Ci0JCVN0cmluZyB0cmltbWVkRGF0YSA9IGRhdGEudHJpbSgpOwotCQlDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gQ29tbWVudEVsZW1lbnRSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCWZvciAoaW50IGlDb25maWcgPSAwOyBpQ29uZmlnIDwgY29uZmlncy5sZW5ndGg7IGlDb25maWcrKykgewotCQkJQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uIGNvbmZpZyA9IGNvbmZpZ3NbaUNvbmZpZ107Ci0JCQlpZiAoKGlzSlNQVGFnICYmICFjb25maWcuYWNjZXB0SlNQQ29tbWVudCgpKSB8fCAoIWlzSlNQVGFnICYmICFjb25maWcuYWNjZXB0WE1MQ29tbWVudCgpKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nW10gcHJlZml4ZXMgPSBjb25maWcuZ2V0UHJlZml4KCk7Ci0JCQlmb3IgKGludCBpUHJlZml4ID0gMDsgaVByZWZpeCA8IHByZWZpeGVzLmxlbmd0aDsgaVByZWZpeCsrKSB7Ci0JCQkJaWYgKHRyaW1tZWREYXRhLnN0YXJ0c1dpdGgocHJlZml4ZXNbaVByZWZpeF0pKSB7Ci0JCQkJCXJldHVybiBjb25maWcuY3JlYXRlRWxlbWVudCh0aGlzLm1vZGVsLmdldERvY3VtZW50KCksIGRhdGEsIGlzSlNQVGFnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTW9kZWxQYXJzZXJBZGFwdGVyIGFkYXB0ZXIgPSBnZXRQYXJzZXJBZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBhZGFwdGVyLmNyZWF0ZUNvbW1lbnRFbGVtZW50KHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKSwgZGF0YSwgaXNKU1BUYWcpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcm91dGluZSBjcmVhdGUgYW4gaW1wbGljaXQgRWxlbWVudCBmb3IgZ2l2ZW4gcGFyZW50IGFuZCBjaGlsZCwKLQkgKiBzdWNoIGFzIEhUTUwsIEJPRFksIEhFQUQsIGFuZCBUQk9EWSBmb3IgSFRNTCBkb2N1bWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVJbXBsaWNpdEVsZW1lbnQoTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpIHsKLQkJTW9kZWxQYXJzZXJBZGFwdGVyIGFkYXB0ZXIgPSBnZXRQYXJzZXJBZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBhZGFwdGVyLmNyZWF0ZUltcGxpY2l0RWxlbWVudCh0aGlzLm1vZGVsLmdldERvY3VtZW50KCksIHBhcmVudCwgY2hpbGQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBkZW1vdGVOb2RlcyhOb2RlIHJvb3QsIE5vZGUgbmV3UGFyZW50LCBOb2RlIG9sZFBhcmVudCwgTm9kZSBuZXh0KSB7Ci0JCWlmIChuZXdQYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybjsKLQkJRWxlbWVudEltcGwgbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCi0JCS8vIGZpbmQgbmV4dAotCQl3aGlsZSAobmV4dCA9PSBudWxsKSB7Ci0JCQlpZiAob2xkUGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJcmV0dXJuOwotCQkJRWxlbWVudEltcGwgb2xkRWxlbWVudCA9IChFbGVtZW50SW1wbCkgb2xkUGFyZW50OwotCQkJaWYgKG9sZEVsZW1lbnQuaGFzRW5kVGFnKCkpCi0JCQkJcmV0dXJuOwotCQkJb2xkUGFyZW50ID0gb2xkRWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAob2xkUGFyZW50ID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBlcnJvcgotCQkJbmV4dCA9IG9sZEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCi0JCXdoaWxlIChuZXh0ICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQkJaWYgKG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIG5leHRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJCWlmICghbmV4dEVsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJCQlOb2RlIG5leHRDaGlsZCA9IG5leHRFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJaWYgKG5leHRDaGlsZCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBkZW1vdGUgY2hpbGRyZW4KLQkJCQkJCW5leHQgPSBuZXh0Q2hpbGQ7Ci0JCQkJCQlvbGRQYXJlbnQgPSBuZXh0RWxlbWVudDsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJaWYgKG5leHRFbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCQlpZiAobmV4dEVsZW1lbnQubWF0Y2hFbmRUYWcobmV3RWxlbWVudCkpIHsKLQkJCQkJCQkvLyBzdG9wIGF0IHRoZSBtYXRjaGVkIGludmFsaWQgZW5kIHRhZwotCQkJCQkJCW5leHQgPSBuZXh0RWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCW9sZFBhcmVudC5yZW1vdmVDaGlsZChuZXh0RWxlbWVudCk7Ci0JCQkJCQkJbmV3RWxlbWVudC5hZGRFbmRUYWcobmV4dEVsZW1lbnQpOwotCi0JCQkJCQkJaWYgKG5ld0VsZW1lbnQgPT0gcm9vdCkKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCU5vZGUgcCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJCS8vIGNoZWNrIGlmIHJlYWNoZWQgdG8gdG9wCi0JCQkJCQkJaWYgKHAgPT0gbnVsbCB8fCBwID09IG9sZFBhcmVudCB8fCBwLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwOwotCQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gcmVtb3ZlIGltcGxpY2l0IGVsZW1lbnQKLQkJCQkJCW5leHQgPSBuZXh0RWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJCQkJb2xkUGFyZW50LnJlbW92ZUNoaWxkKG5leHRFbGVtZW50KTsKLQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIWRvbmUpIHsKLQkJCQlpZiAoIWNhbkNvbnRhaW4obmV3RWxlbWVudCwgbmV4dCkpIHsKLQkJCQkJaWYgKG5ld0VsZW1lbnQgPT0gcm9vdCkKLQkJCQkJCXJldHVybjsKLQkJCQkJTm9kZSBwID0gbmV3RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCS8vIGNoZWNrIGlmIHJlYWNoZWQgdG8gdG9wCi0JCQkJCWlmIChwID09IG51bGwgfHwgcCA9PSBvbGRQYXJlbnQgfHwgcC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJcmV0dXJuOwotCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlOb2RlIGNoaWxkID0gbmV4dDsKLQkJCQluZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpOwotCQkJCW9sZFBhcmVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJaW5zZXJ0Tm9kZShuZXdFbGVtZW50LCBjaGlsZCwgbnVsbCk7Ci0JCQkJTm9kZSBjaGlsZFBhcmVudCA9IGNoaWxkLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAoY2hpbGRQYXJlbnQgIT0gbmV3RWxlbWVudCkgewotCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBjaGlsZFBhcmVudDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGZpbmQgbmV4dCBwYXJlbnQgYW5kIHNpYmxpbmcKLQkJCXdoaWxlIChuZXh0ID09IG51bGwpIHsKLQkJCQlpZiAob2xkUGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCXJldHVybjsKLQkJCQlFbGVtZW50SW1wbCBvbGRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvbGRQYXJlbnQ7Ci0KLQkJCQkvLyBkdWcgcGFyZW50IG11c3Qgbm90IGhhdmUgY2hpbGRyZW4gYXQgdGhpcyBwb2ludAotCQkJCWlmICghb2xkRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkgJiYgIW9sZEVsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJCQlvbGRQYXJlbnQgPSBvbGRFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJaWYgKG9sZFBhcmVudCA9PSBudWxsKQotCQkJCQkJcmV0dXJuOyAvLyBlcnJvcgotCQkJCQluZXh0ID0gb2xkRWxlbWVudDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJaWYgKG9sZEVsZW1lbnQuaGFzRW5kVGFnKCkpCi0JCQkJCXJldHVybjsKLQkJCQlvbGRQYXJlbnQgPSBvbGRFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAob2xkUGFyZW50ID09IG51bGwpCi0JCQkJCXJldHVybjsgLy8gZXJyb3IKLQkJCQluZXh0ID0gb2xkRWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBNb2RlbFBhcnNlckFkYXB0ZXIgZ2V0UGFyc2VyQWRhcHRlcigpIHsKLQkJcmV0dXJuIChNb2RlbFBhcnNlckFkYXB0ZXIpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5nZXRBZGFwdGVyRm9yKE1vZGVsUGFyc2VyQWRhcHRlci5jbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmluZFJvb3ROYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCU1vZGVsUGFyc2VyQWRhcHRlciBhZGFwdGVyID0gZ2V0UGFyc2VyQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRGaW5kUm9vdE5hbWUodGFnTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElET01Nb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubW9kZWw7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0Q0RBVEFTZWN0aW9uIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRDREFUQVNlY3Rpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlDREFUQVNlY3Rpb25JbXBsIGNkYXRhID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNkYXRhID0gKENEQVRBU2VjdGlvbkltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVDREFUQVNlY3Rpb24obnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWlmIChjZGF0YSA9PSBudWxsKSB7IC8vIENEQVRBIHNlY3Rpb24gbWlnaHQgbm90IGJlIHN1cHBvcnRlZAotCQkJaW5zZXJ0SW52YWxpZERlY2woZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCBkZWNsCi0JCQlyZXR1cm47Ci0JCX0KLQotCQljZGF0YS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnROb2RlKGNkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRDb21tZW50IG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRDb21tZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nQnVmZmVyIGRhdGEgPSBudWxsOwotCQlib29sZWFuIGlzSlNQVGFnID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChpc05lc3RlZENvbW1lbnRPcGVuKHJlZ2lvblR5cGUpKSB7Ci0JCQkJaXNKU1BUYWcgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQgfHwgaXNOZXN0ZWRDb21tZW50VGV4dChyZWdpb25UeXBlKSkgewotCQkJCWlmIChkYXRhID09IG51bGwpIHsKLQkJCQkJZGF0YSA9IG5ldyBTdHJpbmdCdWZmZXIoZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRhdGEuYXBwZW5kKGZsYXROb2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgY3JlYXRlQ29tbWVudEVsZW1lbnQoZGF0YS50b1N0cmluZygpLCBpc0pTUFRhZyk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKCFpc0VuZFRhZyhlbGVtZW50KSkgewotCQkJCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkJaW5zZXJ0U3RhcnRUYWcoZWxlbWVudCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQkvLyBlbmQgdGFnCi0JCQkJZWxlbWVudC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCi0JCQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCQlTdHJpbmcgcm9vdE5hbWUgPSBnZXRGaW5kUm9vdE5hbWUodGFnTmFtZSk7Ci0JCQkJRWxlbWVudEltcGwgc3RhcnQgPSAoRWxlbWVudEltcGwpIHRoaXMuY29udGV4dC5maW5kU3RhcnRUYWcodGFnTmFtZSwgcm9vdE5hbWUpOwotCQkJCWlmIChzdGFydCAhPSBudWxsKSB7IC8vIHN0YXJ0IHRhZyBmb3VuZAotCQkJCQlpbnNlcnRFbmRUYWcoc3RhcnQpOwotCQkJCQlzdGFydC5hZGRFbmRUYWcoZWxlbWVudCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQkvLyBpbnZhbGlkIGVuZCB0YWcKLQkJCQlpbnNlcnROb2RlKGVsZW1lbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCUNvbW1lbnRJbXBsIGNvbW1lbnQgPSAoQ29tbWVudEltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVDb21tZW50KG51bGwpOwotCQlpZiAoY29tbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaXNKU1BUYWcpCi0JCQljb21tZW50LnNldEpTUFRhZyh0cnVlKTsKLQkJY29tbWVudC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnROb2RlKGNvbW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydERlY2wgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydERlY2woSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlib29sZWFuIGlzRG9jVHlwZSA9IGZhbHNlOwotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCVN0cmluZyBwdWJsaWNJZCA9IG51bGw7Ci0JCVN0cmluZyBzeXN0ZW1JZCA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04pIHsKLQkJCQlpc0RvY1R5cGUgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX05BTUUpIHsKLQkJCQlpZiAobmFtZSA9PSBudWxsKQotCQkJCQluYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRikgewotCQkJCWlmIChwdWJsaWNJZCA9PSBudWxsKQotCQkJCQlwdWJsaWNJZCA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0QXR0clZhbHVlKGZsYXROb2RlLCByZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRikgewotCQkJCWlmIChzeXN0ZW1JZCA9PSBudWxsKQotCQkJCQlzeXN0ZW1JZCA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0QXR0clZhbHVlKGZsYXROb2RlLCByZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJLy8gaW52YWxpZCBkZWNsYXJhdGlvbgotCQlpZiAoIWlzRG9jVHlwZSkgewotCQkJaW5zZXJ0SW52YWxpZERlY2woZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRG9jdW1lbnRUeXBlSW1wbCBkb2NUeXBlID0gKERvY3VtZW50VHlwZUltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N0eXBlKG5hbWUpOwotCQlpZiAoZG9jVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAocHVibGljSWQgIT0gbnVsbCkKLQkJCWRvY1R5cGUuc2V0UHVibGljSWQocHVibGljSWQpOwotCQlpZiAoc3lzdGVtSWQgIT0gbnVsbCkKLQkJCWRvY1R5cGUuc2V0U3lzdGVtSWQoc3lzdGVtSWQpOwotCQlkb2NUeXBlLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUoZG9jVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0RW5kVGFnIG1ldGhvZCBjYW4gYmUgdXNlZCBieSBzdWJjbGFzc2VzLCBidXQgbm90IG92ZXJyaWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluc2VydEVuZFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlOb2RlIG5ld1BhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAobmV3UGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaWYgKCEoKEVsZW1lbnRJbXBsKSBlbGVtZW50KS5pc0NvbnRhaW5lcigpKSB7Ci0JCQkvLyBqdXN0IHVwZGF0ZSBjb250ZXh0Ci0JCQlOb2RlIGVsZW1lbnROZXh0ID0gZWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJaWYgKGVsZW1lbnROZXh0ICE9IG51bGwpCi0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGVsZW1lbnROZXh0KTsKLQkJCWVsc2UKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShuZXdQYXJlbnQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gcHJvbW90ZSBjaGlsZHJlbgotCQlOb2RlIG5ld05leHQgPSBlbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCU5vZGUgb2xkUGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKG9sZFBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlIG9sZE5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJcHJvbW90ZU5vZGVzKGVsZW1lbnQsIG5ld1BhcmVudCwgbmV3TmV4dCwgb2xkUGFyZW50LCBvbGROZXh0KTsKLQotCQkvLyB1cGRhdGUgY29udGV4dAotCQkvLyByZS1jaGVjayB0aGUgbmV4dCBzaWJsaW5nCi0JCW5ld05leHQgPSBlbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCWlmIChuZXdOZXh0ICE9IG51bGwpCi0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV3TmV4dCk7Ci0JCWVsc2UKLQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG5ld1BhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0RW5kVGFnIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRFbmRUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgdGFnTmFtZSA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkVGFnTmFtZShyZWdpb25UeXBlKSkgewotCQkJCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQkJCXRhZ05hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGFnTmFtZSA9PSBudWxsKSB7IC8vIGludmFsaWQgZW5kIHRhZwotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIHRleHQKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyByb290TmFtZSA9IGdldEZpbmRSb290TmFtZSh0YWdOYW1lKTsKLQkJRWxlbWVudEltcGwgc3RhcnQgPSAoRWxlbWVudEltcGwpIHRoaXMuY29udGV4dC5maW5kU3RhcnRUYWcodGFnTmFtZSwgcm9vdE5hbWUpOwotCQlpZiAoc3RhcnQgIT0gbnVsbCkgeyAvLyBzdGFydCB0YWcgZm91bmQKLQkJCWluc2VydEVuZFRhZyhzdGFydCk7Ci0JCQlzdGFydC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gaW52YWxpZCBlbmQgdGFnCi0JCUVsZW1lbnRJbXBsIGVuZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbmQgPSAoRWxlbWVudEltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KHRhZ05hbWUpOwotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZXgpIHsKLQkJfQotCQlpZiAoZW5kID09IG51bGwpIHsgLy8gaW52YWxpZCBlbmQgdGFnCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0JCWVuZC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnROb2RlKGVuZCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0RW50aXR5UmVmIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRFbnRpdHlSZWYoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSkgewotCQkJCWlmIChuYW1lID09IG51bGwpCi0JCQkJCW5hbWUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEVudGl0eVJlZk5hbWUoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmFtZSA9PSBudWxsKSB7IC8vIGludmFsaWQgZW50aXR5Ci0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIElTU1VFOiBhdm9pZCB0aGlzIGNhc3QKLQkJU3RyaW5nIHZhbHVlID0gKChEb2N1bWVudEltcGwpdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpKS5nZXRDaGFyVmFsdWUobmFtZSk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7IC8vIGNoYXJhY3RlciBlbnRpdHkKLQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRoaXMuY29udGV4dC5maW5kUHJldmlvdXNUZXh0KCk7Ci0JCQlpZiAodGV4dCAhPSBudWxsKSB7IC8vIGV4aXN0aW5nIHRleHQgZm91bmQKLQkJCQkvLyBkbyBub3QgYXBwZW5kIGRhdGEKLQkJCQl0ZXh0LmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJLy8gQWRqYWNlbnQgdGV4dCBub2Rlcywgd2hlcmUgY2hhbmdlcyB3ZXJlIHF1ZXVlZAotCQkJCWlmIChsYXN0VGV4dE5vZGUgIT0gbnVsbCAmJiBsYXN0VGV4dE5vZGUgIT0gdGV4dCkKLQkJCQkJbGFzdFRleHROb2RlLm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJCWxhc3RUZXh0Tm9kZSA9IHRleHQ7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBuZXcgdGV4dAotCQkJdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKG51bGwpOwotCQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQl0ZXh0LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlpbnNlcnROb2RlKHRleHQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZ2VuZXJhbCBlbnRpdHkgcmVmZXJlbmNlCi0JCUVudGl0eVJlZmVyZW5jZUltcGwgcmVmID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZiA9IChFbnRpdHlSZWZlcmVuY2VJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlRW50aXR5UmVmZXJlbmNlKG5hbWUpOwotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZXgpIHsKLQkJfQotCQlpZiAocmVmID09IG51bGwpIHsgLy8gZW50aXR5IHJlZmVyZW5jZSBtaWdodCBub3QgYmUgc3VwcG9ydGVkCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcmVmLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUocmVmKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRJbnZhbGlkRGVjbCBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0SW52YWxpZERlY2woSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCIhIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZXgpIHsKLQkJfQotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7IC8vIGludmFsaWQgdGFnCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0JCWVsZW1lbnQuc2V0RW1wdHlUYWcodHJ1ZSk7Ci0JCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnROb2RlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydEpTUFRhZyBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0TmVzdGVkVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBudWxsOwotCQlBdHRySW1wbCBhdHRyID0gbnVsbDsKLQkJTGlzdCBhdHRyTm9kZXMgPSBudWxsOwotCQlib29sZWFuIGlzQ2xvc2VUYWcgPSBmYWxzZTsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKGlzTmVzdGVkVGFnT3BlbihyZWdpb25UeXBlKSB8fCBpc05lc3RlZFRhZ05hbWUocmVnaW9uVHlwZSkpIHsKLQkJCQl0YWdOYW1lID0gY29tcHV0ZU5lc3RlZFRhZyhyZWdpb25UeXBlLCB0YWdOYW1lLCBmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGlzTmVzdGVkVGFnQ2xvc2UocmVnaW9uVHlwZSkpIHsKLQkJCQlpc0Nsb3NlVGFnID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJYXR0ciA9IChBdHRySW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUF0dHJpYnV0ZShuYW1lKTsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0TmFtZVJlZ2lvbihyZWdpb24pOwotCQkJCQlpZiAoYXR0ck5vZGVzID09IG51bGwpCi0JCQkJCQlhdHRyTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWF0dHJOb2Rlcy5hZGQoYXR0cik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXRWYWx1ZVJlZ2lvbihyZWdpb24pOwotCQkJCQlhdHRyID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGFnTmFtZSA9PSBudWxsKSB7Ci0JCQlpZiAoaXNDbG9zZVRhZykgewotCQkJCS8vIGNsb3NlIEpTUCB0YWcKLQkJCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCUVsZW1lbnRJbXBsIHN0YXJ0ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQkJCWlmIChzdGFydC5pc0pTUENvbnRhaW5lcigpKSB7Ci0JCQkJCQlpbnNlcnRFbmRUYWcoc3RhcnQpOwotCQkJCQkJc3RhcnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGludmFsaWQgSlNQIHRhZwotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIHRleHQKLQkJCXJldHVybjsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsgLy8gaW52YWxpZCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGF0dHJOb2RlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJOb2Rlcy5zaXplKCk7IGkrKykgewotCQkJCWVsZW1lbnQuYXBwZW5kQXR0cmlidXRlTm9kZSgoQXR0cikgYXR0ck5vZGVzLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudC5zZXRKU1BUYWcodHJ1ZSk7Ci0JCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnRTdGFydFRhZyhlbGVtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZFRhZ0Nsb3NlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWdPcGVuKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlTmVzdGVkVGFnKFN0cmluZyByZWdpb25UeXBlLCBTdHJpbmcgdGFnTmFtZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gdGFnTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnROb2RlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBjaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnROb2RlKE5vZGUgbm9kZSkgewotCQlpZihub2RlICE9IG51bGwgJiYgdGhpcy5jb250ZXh0ICE9IG51bGwpIHsKLQkJCU5vZGUgcGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJTm9kZSBuZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQkJLy8gUmVzZXQgcGFyZW50cyB3aGljaCBhcmUgY2xvc2VkIGNvbnRhaW5lciBlbGVtZW50czsgc2hvdWxkIG5vdCBiZSBwYXJlbnRzCi0JCQkJaWYocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJU3RyaW5nIHR5cGUgPSAoKEVsZW1lbnRJbXBsKXBhcmVudCkuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpOwotCQkJCQlpZigoKEVsZW1lbnRJbXBsKXBhcmVudCkuaXNDb250YWluZXIoKSAmJiB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCQkJbmV4dCA9IHBhcmVudC5nZXROZXh0U2libGluZygpOwotCQkJCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCU1vZGVsUGFyc2VyQWRhcHRlciBhZGFwdGVyID0gZ2V0UGFyc2VyQWRhcHRlcigpOwotCQkJCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJCXdoaWxlIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiAhYWRhcHRlci5jYW5Db250YWluKCAoRWxlbWVudCkgcGFyZW50LCBub2RlKSAmJiBhZGFwdGVyLmlzRW5kVGFnT21pc3NpYmxlKChFbGVtZW50KSBwYXJlbnQpKSB7Ci0JCQkJCQkJCW5leHQgPSBwYXJlbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9CQotCQkJCWluc2VydE5vZGUocGFyZW50LCBub2RlLCBuZXh0KTsKLQkJCQluZXh0ID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG5vZGUuZ2V0UGFyZW50Tm9kZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0Tm9kZShOb2RlIHBhcmVudCwgTm9kZSBub2RlLCBOb2RlIG5leHQpIHsKLQkJd2hpbGUgKG5leHQgIT0gbnVsbCAmJiBuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIG5leHRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJaWYgKG5leHRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoIWNhbkJlSW1wbGljaXRUYWcobmV4dEVsZW1lbnQsIG5vZGUpKQotCQkJCWJyZWFrOwotCQkJcGFyZW50ID0gbmV4dEVsZW1lbnQ7Ci0JCQluZXh0ID0gbmV4dEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQl9Ci0JCUVsZW1lbnQgaW1wbGljaXRFbGVtZW50ID0gY3JlYXRlSW1wbGljaXRFbGVtZW50KHBhcmVudCwgbm9kZSk7Ci0JCWlmIChpbXBsaWNpdEVsZW1lbnQgIT0gbnVsbCkKLQkJCW5vZGUgPSBpbXBsaWNpdEVsZW1lbnQ7Ci0JCXBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0UEkgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydFBJKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRhcmdldCA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSkKLQkJCQljb250aW51ZTsKLQkJCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCQl0YXJnZXQgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCX0KLQotCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LCBudWxsKTsKLQkJaWYgKHBpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXBpLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUocGkpOwotCX0KLQotCS8qKgotCSAqIGluc2VydFN0YXJ0VGFnIG1ldGhvZCBjYW4gYmUgdXNlZCBieSBzdWJjbGFzc2VzLCBidXQgbm90IG92ZXJyaWRkZW4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRTdGFydFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWluc2VydE5vZGUoZWxlbWVudCk7Ci0KLQkJRWxlbWVudEltcGwgbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaWYgKG5ld0VsZW1lbnQuaXNFbXB0eVRhZygpIHx8ICFuZXdFbGVtZW50LmlzQ29udGFpbmVyKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gSWdub3JlIGNvbnRhaW5lciB0YWdzIHRoYXQgaGF2ZSBiZWVuIGNsb3NlZAotCQlTdHJpbmcgdHlwZSA9IG5ld0VsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpOwotCQlpZihuZXdFbGVtZW50LmlzQ29udGFpbmVyKCkgJiYgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZGVtb3RlIHNpYmxpbmdzCi0JCU5vZGUgcGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlIG5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJZGVtb3RlTm9kZXMoZWxlbWVudCwgZWxlbWVudCwgcGFyZW50LCBuZXh0KTsKLQotCQkvLyB1cGRhdGUgY29udGV4dAotCQlOb2RlIGZpcnN0Q2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGZpcnN0Q2hpbGQgIT0gbnVsbCkKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShmaXJzdENoaWxkKTsKLQkJZWxzZQotCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0U3RhcnRUYWcgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydFN0YXJ0VGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBudWxsOwotCQlib29sZWFuIGlzRW1wdHlUYWcgPSBmYWxzZTsKLQkJQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCUxpc3QgYXR0ck5vZGVzID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRUYWdOYW1lKHJlZ2lvblR5cGUpKSB7Ci0JCQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCQkJdGFnTmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJaXNFbXB0eVRhZyA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCVN0cmluZyBuYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJCWF0dHIgPSAoQXR0ckltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldE5hbWVSZWdpb24ocmVnaW9uKTsKLQkJCQkJaWYgKGF0dHJOb2RlcyA9PSBudWxsKQotCQkJCQkJYXR0ck5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlhdHRyTm9kZXMuYWRkKGF0dHIpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0RXF1YWxSZWdpb24ocmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0VmFsdWVSZWdpb24ocmVnaW9uKTsKLQkJCQkJYXR0ciA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkgeyAvLyBpbnZhbGlkIHN0YXJ0IHRhZwotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIHRleHQKLQkJCXJldHVybjsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBleCkgewotCQkJLy8gdHlwaWNhbGx5IGludmFsaWQgbmFtZQotCQl9Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsgLy8gaW52YWxpZCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGF0dHJOb2RlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJOb2Rlcy5zaXplKCk7IGkrKykgewotCQkJCWVsZW1lbnQuYXBwZW5kQXR0cmlidXRlTm9kZSgoQXR0cikgYXR0ck5vZGVzLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGlzRW1wdHlUYWcpCi0JCQllbGVtZW50LnNldEVtcHR5VGFnKHRydWUpOwotCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0U3RhcnRUYWcoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlib29sZWFuIGlzVGV4dE5vZGUgPSBmYWxzZTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCWluc2VydFN0YXJ0VGFnKGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJaW5zZXJ0RW5kVGFnKGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTiB8fCBpc05lc3RlZENvbW1lbnRPcGVuKHJlZ2lvblR5cGUpKSB7Ci0JCQlpbnNlcnRDb21tZW50KGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSkgewotCQkJaW5zZXJ0RW50aXR5UmVmKGZsYXROb2RlKTsKLQkJCWlzVGV4dE5vZGUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTikgewotCQkJaW5zZXJ0RGVjbChmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOKSB7Ci0JCQlpbnNlcnRQSShmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOKSB7Ci0JCQlpbnNlcnRDREFUQVNlY3Rpb24oZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKGlzTmVzdGVkVGFnKHJlZ2lvblR5cGUpKSB7Ci0JCQlpbnNlcnROZXN0ZWRUYWcoZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgewotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7Ci0JCQlpc1RleHROb2RlID0gdHJ1ZTsKLQkJfQotCi0JCS8vIENoYW5nZXMgdG8gdGV4dCByZWdpb25zIGFyZSBxdWV1ZWQgdXAsIGFuZCBvbmNlIHRoZSB2YWx1ZSBpcyBkb25lIGNoYW5naW5nIGEgbm90aWZpY2F0aW9uIGlzIHNlbnQKLQkJaWYgKCFpc1RleHROb2RlICYmIGxhc3RUZXh0Tm9kZSAhPSBudWxsKSB7Ci0JCQlsYXN0VGV4dE5vZGUubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQlsYXN0VGV4dE5vZGUgPSBudWxsOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWcoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbW1lbnRUZXh0KFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbW1lbnRPcGVuKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWdOYW1lKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDb250ZW50KFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0VGV4dCBtZXRob2QgQ2FuIGJlIGNhbGxlZCBmcm9tIHN1YmNsYXNzZXMsIG5vdCB0byBiZSBvdmVycmlkZWQgb3IKLQkgKiByZS1pbXBsZW1lbnRlZC4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRUZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5jb250ZXh0LmZpbmRQcmV2aW91c1RleHQoKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgeyAvLyBleGlzdGluZyB0ZXh0IGZvdW5kCi0JCQl0ZXh0LmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkvLyBBZGphY2VudCB0ZXh0IG5vZGVzLCB3aGVyZSBjaGFuZ2VzIHdlcmUgcXVldWVkCi0JCQlpZiAobGFzdFRleHROb2RlICE9IG51bGwgJiYgbGFzdFRleHROb2RlICE9IHRleHQpCi0JCQkJbGFzdFRleHROb2RlLm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJbGFzdFRleHROb2RlID0gdGV4dDsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIG5ldyB0ZXh0Ci0JCXRleHQgPSAoVGV4dEltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZShudWxsKTsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGV4dC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnROb2RlKHRleHQpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRW5kVGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJTW9kZWxQYXJzZXJBZGFwdGVyIGFkYXB0ZXIgPSBnZXRQYXJzZXJBZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBhZGFwdGVyLmlzRW5kVGFnKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50LmlzRW5kVGFnKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb21vdGVOb2RlcyhOb2RlIHJvb3QsIE5vZGUgbmV3UGFyZW50LCBOb2RlIG5ld05leHQsIE5vZGUgb2xkUGFyZW50LCBOb2RlIG5leHQpIHsKLQkJRWxlbWVudEltcGwgbmV3RWxlbWVudCA9IG51bGw7Ci0JCWlmIChuZXdQYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQl9Ci0KLQkJTm9kZSByb290UGFyZW50ID0gcm9vdC5nZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChvbGRQYXJlbnQgIT0gcm9vdFBhcmVudCkgewotCQkJd2hpbGUgKG5leHQgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQkJCWJvb2xlYW4gZW5kVGFnID0gZmFsc2U7Ci0JCQkJaWYgKG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBuZXh0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV4dDsKLQkJCQkJaWYgKCFuZXh0RWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJCQlOb2RlIG5leHRDaGlsZCA9IG5leHRFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJCWlmIChuZXh0Q2hpbGQgIT0gbnVsbCkgewotCQkJCQkJCS8vIHByb21vdGUgY2hpbGRyZW4KLQkJCQkJCQluZXh0ID0gbmV4dENoaWxkOwotCQkJCQkJCW9sZFBhcmVudCA9IG5leHRFbGVtZW50OwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCi0JCQkJCQlpZiAobmV4dEVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJCQlpZiAobmV4dEVsZW1lbnQubWF0Y2hFbmRUYWcobmV3RWxlbWVudCkpIHsKLQkJCQkJCQkJZW5kVGFnID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyByZW1vdmUgaW1wbGljaXQgZWxlbWVudAotCQkJCQkJCW5leHQgPSBuZXh0RWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCW9sZFBhcmVudC5yZW1vdmVDaGlsZChuZXh0RWxlbWVudCk7Ci0JCQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoIWRvbmUpIHsKLQkJCQkJaWYgKCFlbmRUYWcgJiYgbmV3RWxlbWVudCAhPSBudWxsICYmICFjYW5Db250YWluKG5ld0VsZW1lbnQsIG5leHQpKSB7Ci0JCQkJCQluZXdQYXJlbnQgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmIChuZXdQYXJlbnQgPT0gbnVsbCkKLQkJCQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQkJCQlOb2RlIGVsZW1lbnROZXh0ID0gbmV3RWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJCQkJLy8gcHJvbW90ZSBzaWJsaW5ncwotCQkJCQkJcHJvbW90ZU5vZGVzKG5ld0VsZW1lbnQsIG5ld1BhcmVudCwgZWxlbWVudE5leHQsIG5ld0VsZW1lbnQsIG5ld05leHQpOwotCQkJCQkJbmV3TmV4dCA9IG5ld0VsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCWlmIChuZXdQYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld1BhcmVudDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCW5ld0VsZW1lbnQgPSBudWxsOwotCQkJCQkJfQotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlOb2RlIGNoaWxkID0gbmV4dDsKLQkJCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJb2xkUGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQkJaW5zZXJ0Tm9kZShuZXdQYXJlbnQsIGNoaWxkLCBuZXdOZXh0KTsKLQkJCQkJTm9kZSBjaGlsZFBhcmVudCA9IGNoaWxkLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJaWYgKGNoaWxkUGFyZW50ICE9IG5ld1BhcmVudCkgewotCQkJCQkJbmV3UGFyZW50ID0gY2hpbGRQYXJlbnQ7Ci0JCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQluZXdOZXh0ID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG9sZFBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCXJldHVybjsKLQkJCUVsZW1lbnRJbXBsIG9sZEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG9sZFBhcmVudDsKLQkJCW9sZFBhcmVudCA9IG9sZEVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKG9sZFBhcmVudCA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gZXJyb3IKLQkJCW5leHQgPSBvbGRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCWlmIChvbGRFbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJRWxlbWVudCBlbmQgPSBudWxsOwotCQkJCWlmICghb2xkRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkgJiYgIW9sZEVsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQob2xkRWxlbWVudCk7Ci0JCQkJCWVuZCA9IG9sZEVsZW1lbnQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQllbmQgPSBvbGRFbGVtZW50LnJlbW92ZUVuZFRhZygpOwotCQkJCX0KLQkJCQlpZiAoZW5kICE9IG51bGwpIHsKLQkJCQkJaW5zZXJ0Tm9kZShuZXdQYXJlbnQsIGVuZCwgbmV3TmV4dCk7Ci0JCQkJCU5vZGUgZW5kUGFyZW50ID0gZW5kLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJaWYgKGVuZFBhcmVudCAhPSBuZXdQYXJlbnQpIHsKLQkJCQkJCW5ld1BhcmVudCA9IGVuZFBhcmVudDsKLQkJCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld1BhcmVudDsKLQkJCQkJCW5ld05leHQgPSBlbmQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJlbW92ZUVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVFbmRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlOb2RlIHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaWYgKCEoKEVsZW1lbnRJbXBsKSBlbGVtZW50KS5pc0NvbnRhaW5lcigpKSB7Ci0JCQkvLyBqdXN0IHVwZGF0ZSBjb250ZXh0Ci0JCQlOb2RlIGVsZW1lbnROZXh0ID0gZWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJaWYgKGVsZW1lbnROZXh0ICE9IG51bGwpCi0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGVsZW1lbnROZXh0KTsKLQkJCWVsc2UKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZGVtb3RlIHNpYmxpbmdzCi0JCU5vZGUgbmV4dCA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJRWxlbWVudEltcGwgbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJLy8gZmluZCBuZXcgcGFyZW50Ci0JCWZvciAoTm9kZSBsYXN0ID0gbmV3RWxlbWVudC5nZXRMYXN0Q2hpbGQoKTsgbGFzdCAhPSBudWxsOyBsYXN0ID0gbGFzdC5nZXRMYXN0Q2hpbGQoKSkgewotCQkJaWYgKGxhc3QuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlicmVhazsKLQkJCUVsZW1lbnRJbXBsIGxhc3RFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBsYXN0OwotCQkJaWYgKGxhc3RFbGVtZW50Lmhhc0VuZFRhZygpIHx8IGxhc3RFbGVtZW50LmlzRW1wdHlUYWcoKSB8fCAhbGFzdEVsZW1lbnQuaXNDb250YWluZXIoKSkKLQkJCQlicmVhazsKLQkJCW5ld0VsZW1lbnQgPSBsYXN0RWxlbWVudDsKLQkJfQotCQlOb2RlIGxhc3RDaGlsZCA9IG5ld0VsZW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCWRlbW90ZU5vZGVzKGVsZW1lbnQsIG5ld0VsZW1lbnQsIHBhcmVudCwgbmV4dCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRleHQKLQkJTm9kZSBuZXdOZXh0ID0gbnVsbDsKLQkJaWYgKGxhc3RDaGlsZCAhPSBudWxsKQotCQkJbmV3TmV4dCA9IGxhc3RDaGlsZC5nZXROZXh0U2libGluZygpOwotCQllbHNlCi0JCQluZXdOZXh0ID0gbmV3RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChuZXdOZXh0ICE9IG51bGwpCi0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV3TmV4dCk7Ci0JCWVsc2UKLQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG5ld0VsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG5vZGUgaWYgaXQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGltcGxpY2l0IHRhZyB3aXRoCi0JICogcmVtYWluaW5nIGNoaWxkIG5vZGVzIHByb21vdGVkLgotCSAqLwotCXByaXZhdGUgRWxlbWVudCByZW1vdmVJbXBsaWNpdEVsZW1lbnQoTm9kZSBwYXJlbnQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBudWxsOwotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCWlmICghZWxlbWVudC5pc0ltcGxpY2l0VGFnKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGNhbkJlSW1wbGljaXRUYWcoZWxlbWVudCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlOb2RlIGVsZW1lbnRQYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKGVsZW1lbnRQYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQlOb2RlIGZpcnN0Q2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJTm9kZSBjaGlsZCA9IGZpcnN0Q2hpbGQ7Ci0JCU5vZGUgZWxlbWVudE5leHQgPSBlbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlOb2RlIG5leHRDaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQllbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCWVsZW1lbnRQYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBlbGVtZW50TmV4dCk7Ci0JCQljaGlsZCA9IG5leHRDaGlsZDsKLQkJfQotCi0JCS8vIHJlc2V0IGNvbnRleHQKLQkJaWYgKHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCkgPT0gZWxlbWVudCkgewotCQkJTm9kZSBvbGROZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAob2xkTmV4dCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG9sZE5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGVsZW1lbnROZXh0ICE9IG51bGwpIHsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGVsZW1lbnROZXh0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKGVsZW1lbnRQYXJlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmICh0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKSA9PSBlbGVtZW50KSB7Ci0JCQlpZiAoZmlyc3RDaGlsZCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGZpcnN0Q2hpbGQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGVsZW1lbnROZXh0ICE9IG51bGwpIHsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGVsZW1lbnROZXh0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKGVsZW1lbnRQYXJlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJlbW92ZU5vZGUoZWxlbWVudCk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIHJlbW92ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTm9kZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBuZXh0ID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQlOb2RlIHByZXYgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCi0JCS8vIHVwZGF0ZSBjb250ZXh0Ci0JCU5vZGUgb2xkUGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKG5vZGUgPT0gb2xkUGFyZW50KSB7Ci0JCQlpZiAobmV4dCAhPSBudWxsKQotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQkJCWVsc2UKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCQl9Ci0JCWVsc2UgewotCQkJTm9kZSBvbGROZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobm9kZSA9PSBvbGROZXh0KSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJfQotCQl9Ci0KLQkJcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCi0JCWlmIChyZW1vdmVJbXBsaWNpdEVsZW1lbnQocGFyZW50KSAhPSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGRlbW90ZSBzaWJsaW5nCi0JCWlmIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBuZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwcmV2OwotCQkJaWYgKCFuZXdFbGVtZW50Lmhhc0VuZFRhZygpICYmICFuZXdFbGVtZW50LmlzRW1wdHlUYWcoKSAmJiBuZXdFbGVtZW50LmlzQ29udGFpbmVyKCkpIHsKLQkJCQkvLyBmaW5kIG5ldyBwYXJlbnQKLQkJCQlmb3IgKE5vZGUgbGFzdCA9IG5ld0VsZW1lbnQuZ2V0TGFzdENoaWxkKCk7IGxhc3QgIT0gbnVsbDsgbGFzdCA9IGxhc3QuZ2V0TGFzdENoaWxkKCkpIHsKLQkJCQkJaWYgKGxhc3QuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCWJyZWFrOwotCQkJCQlFbGVtZW50SW1wbCBsYXN0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbGFzdDsKLQkJCQkJaWYgKGxhc3RFbGVtZW50Lmhhc0VuZFRhZygpIHx8IGxhc3RFbGVtZW50LmlzRW1wdHlUYWcoKSB8fCAhbGFzdEVsZW1lbnQuaXNDb250YWluZXIoKSkKLQkJCQkJCWJyZWFrOwotCQkJCQluZXdFbGVtZW50ID0gbGFzdEVsZW1lbnQ7Ci0JCQkJfQotCQkJCU5vZGUgbGFzdENoaWxkID0gbmV3RWxlbWVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJCQlkZW1vdGVOb2RlcyhwcmV2LCBuZXdFbGVtZW50LCBwYXJlbnQsIG5leHQpOwotCi0JCQkJLy8gdXBkYXRlIGNvbnRleHQKLQkJCQlOb2RlIG5ld05leHQgPSBudWxsOwotCQkJCWlmIChsYXN0Q2hpbGQgIT0gbnVsbCkKLQkJCQkJbmV3TmV4dCA9IGxhc3RDaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWVsc2UKLQkJCQkJbmV3TmV4dCA9IG5ld0VsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChuZXdOZXh0ICE9IG51bGwpCi0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXdOZXh0KTsKLQkJCQllbHNlCi0JCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG5ld0VsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlU3RhcnRUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RhcnRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBmb3IgaW1wbGljaXQgdGFnCi0JCUVsZW1lbnRJbXBsIG9sZEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0JCWlmIChjYW5CZUltcGxpY2l0VGFnKG9sZEVsZW1lbnQpKSB7Ci0JCQlOb2RlIG5ld1BhcmVudCA9IG51bGw7Ci0JCQlOb2RlIHByZXYgPSBvbGRFbGVtZW50LmdldFByZXZpb3VzU2libGluZygpOwotCQkJaWYgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50SW1wbCBwcmV2RWxlbWVudCA9IChFbGVtZW50SW1wbCkgcHJldjsKLQkJCQlpZiAoIXByZXZFbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCWlmIChwcmV2RWxlbWVudC5oYXNTdGFydFRhZygpIHx8IHByZXZFbGVtZW50Lm1hdGNoVGFnTmFtZShvbGRFbGVtZW50LmdldFRhZ05hbWUoKSkpIHsKLQkJCQkJCW5ld1BhcmVudCA9IHByZXZFbGVtZW50OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5ld1BhcmVudCA9PSBudWxsKSB7Ci0JCQkJLy8gdGhpcyBlbGVtZW50IHNob3VsZCBzdGF5IGFzIGltcGxpY2l0IHRhZwotCQkJCS8vIGp1c3QgcmVtb3ZlIGFsbCBhdHRyaWJ1dGVzCi0JCQkJb2xkRWxlbWVudC5yZW1vdmVTdGFydFRhZygpOwotCi0JCQkJLy8gdXBkYXRlIGNvbnRleHQKLQkJCQlOb2RlIGNoaWxkID0gb2xkRWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGNoaWxkKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAob2xkRWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShvbGRFbGVtZW50KTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCS8vIGZvciBjb21tZW50IHRhZwotCQlpZiAob2xkRWxlbWVudC5pc0NvbW1lbnRUYWcoKSkKLQkJCW9sZEVsZW1lbnQucmVtb3ZlU3RhcnRUYWcoKTsKLQotCQkvLyBwcm9tb3RlIGNoaWxkcmVuCi0JCU5vZGUgZWxlbWVudFBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQlOb2RlIHBhcmVudCA9IGVsZW1lbnRQYXJlbnQ7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBmaXJzdCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQlOb2RlIGZpcnN0RWxlbWVudCA9IG51bGw7IC8vIGZvciB0aGUgY2FzZSBmaXJzdCBpcyByZW1vdmVkIGFzIGVuZAotCQkvLyB0YWcKLQkJaWYgKGZpcnN0ICE9IG51bGwpIHsKLQkJCS8vIGZpbmQgbmV3IHBhcmVudCBmb3IgY2hpbGRyZW4KLQkJCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSBudWxsOwotCQkJZm9yIChOb2RlIGxhc3QgPSBlbGVtZW50LmdldFByZXZpb3VzU2libGluZygpOyBsYXN0ICE9IG51bGw7IGxhc3QgPSBsYXN0LmdldExhc3RDaGlsZCgpKSB7Ci0JCQkJaWYgKGxhc3QuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJYnJlYWs7Ci0JCQkJRWxlbWVudEltcGwgbGFzdEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGxhc3Q7Ci0JCQkJaWYgKGxhc3RFbGVtZW50Lmhhc0VuZFRhZygpIHx8IGxhc3RFbGVtZW50LmlzRW1wdHlUYWcoKSB8fCAhbGFzdEVsZW1lbnQuaXNDb250YWluZXIoKSkKLQkJCQkJYnJlYWs7Ci0JCQkJbmV3RWxlbWVudCA9IGxhc3RFbGVtZW50OwotCQkJfQotCQkJTm9kZSBuZXh0ID0gZmlyc3Q7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJd2hpbGUgKG5leHQgIT0gbnVsbCkgewotCQkJCQlpZiAoIW5ld0VsZW1lbnQuaGFzRW5kVGFnKCkgJiYgbmV3RWxlbWVudC5oYXNTdGFydFRhZygpICYmIG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJRWxlbWVudEltcGwgbmV4dEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5leHQ7Ci0JCQkJCQlpZiAoIW5leHRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkgJiYgbmV4dEVsZW1lbnQuaGFzRW5kVGFnKCkgJiYgbmV4dEVsZW1lbnQubWF0Y2hFbmRUYWcobmV3RWxlbWVudCkpIHsKLQkJCQkJCQkvLyBzdG9wIGF0IHRoZSBtYXRjaGVkIGludmFsaWQgZW5kIHRhZwotCQkJCQkJCU5vZGUgZWxlbWVudENoaWxkID0gbmV4dEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQkJCXdoaWxlIChlbGVtZW50Q2hpbGQgIT0gbnVsbCkgewotCQkJCQkJCQlOb2RlIG5leHRDaGlsZCA9IGVsZW1lbnRDaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCQluZXh0RWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50Q2hpbGQpOwotCQkJCQkJCQluZXdFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnRDaGlsZCk7Ci0JCQkJCQkJCWVsZW1lbnRDaGlsZCA9IG5leHRDaGlsZDsKLQkJCQkJCQl9Ci0KLQkJCQkJCQluZXh0ID0gbmV4dEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQllbGVtZW50LnJlbW92ZUNoaWxkKG5leHRFbGVtZW50KTsKLQkJCQkJCQluZXdFbGVtZW50LmFkZEVuZFRhZyhuZXh0RWxlbWVudCk7Ci0JCQkJCQkJaWYgKG5leHRFbGVtZW50ID09IGZpcnN0KQotCQkJCQkJCQlmaXJzdEVsZW1lbnQgPSBuZXdFbGVtZW50OwotCi0JCQkJCQkJTm9kZSBuZXdQYXJlbnQgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCQlpZiAobmV3UGFyZW50ID09IHBhcmVudCkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBudWxsIHx8IG5ld1BhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJCQlicmVhazsgLy8gZXJyb3IKLQkJCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFjYW5Db250YWluKG5ld0VsZW1lbnQsIG5leHQpKSB7Ci0JCQkJCQlOb2RlIG5ld1BhcmVudCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBwYXJlbnQpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlpZiAobmV3UGFyZW50ID09IG51bGwgfHwgbmV3UGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQkJYnJlYWs7IC8vIGVycm9yCi0JCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlOb2RlIGNoaWxkID0gbmV4dDsKLQkJCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJZWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJCW5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCX0KLQkJCQluZXdFbGVtZW50ID0gbnVsbDsKLQkJCX0KLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCX0KLQkJCXdoaWxlIChuZXh0ICE9IG51bGwpIHsKLQkJCQlpZiAobmV3RWxlbWVudCA9PSBudWxsIHx8IGNhbkNvbnRhaW4obmV3RWxlbWVudCwgbmV4dCkpIHsKLQkJCQkJTm9kZSBjaGlsZCA9IG5leHQ7Ci0JCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCWVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBlbGVtZW50KTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJcGFyZW50ID0gbmV3RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0KLQkJCQkvLyBwcm9tb3RlIHNpYmxpbmdzCi0JCQkJTm9kZSBuZXdOZXh0ID0gbmV3RWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJCU5vZGUgY2hpbGQgPSBlbGVtZW50OwotCQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCU5vZGUgbmV4dENoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJbmV3RWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIG5ld05leHQpOwotCQkJCQljaGlsZCA9IG5leHRDaGlsZDsKLQkJCQl9Ci0KLQkJCQkvLyBsZWF2ZSB0aGUgb2xkIGVuZCB0YWcgd2hlcmUgaXQgaXMKLQkJCQlpZiAobmV3RWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQlFbGVtZW50IGVuZCA9IG5ld0VsZW1lbnQucmVtb3ZlRW5kVGFnKCk7Ci0JCQkJCWlmIChlbmQgIT0gbnVsbCkgewotCQkJCQkJcGFyZW50Lmluc2VydEJlZm9yZShlbmQsIG5ld05leHQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghbmV3RWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJCS8vIGltcGxpY2l0IGVsZW1lbnQKLQkJCQkJaWYgKCFuZXdFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKG5ld0VsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5ld0VsZW1lbnQgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCU5vZGUgbmV3TmV4dCA9IGVsZW1lbnQ7Ci0JCU5vZGUgc3RhcnRFbGVtZW50ID0gbnVsbDsgLy8gZm9yIHRoZSBjYXNlIGVsZW1lbnQgaXMgcmVtb3ZlZCBhcyBlbmQKLQkJLy8gdGFnCi0JCWlmIChvbGRFbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkvLyBmaW5kIG5ldyBwYXJlbnQgZm9yIGludmFsaWQgZW5kIHRhZyBhbmQgc2libGluZ3MKLQkJCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSBudWxsOwotCQkJZm9yIChOb2RlIGxhc3QgPSBlbGVtZW50LmdldFByZXZpb3VzU2libGluZygpOyBsYXN0ICE9IG51bGw7IGxhc3QgPSBsYXN0LmdldExhc3RDaGlsZCgpKSB7Ci0JCQkJaWYgKGxhc3QuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJYnJlYWs7Ci0JCQkJRWxlbWVudEltcGwgbGFzdEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGxhc3Q7Ci0JCQkJaWYgKGxhc3RFbGVtZW50Lmhhc0VuZFRhZygpIHx8IGxhc3RFbGVtZW50LmlzRW1wdHlUYWcoKSB8fCAhbGFzdEVsZW1lbnQuaXNDb250YWluZXIoKSkKLQkJCQkJYnJlYWs7Ci0JCQkJbmV3RWxlbWVudCA9IGxhc3RFbGVtZW50OwotCQkJfQotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCS8vIGRlbW90ZSBpbnZhbGlkIGVuZCB0YWcgYW5kIHNpYmxpbmcKLQkJCQlOb2RlIG5leHQgPSBlbGVtZW50OwotCQkJCXdoaWxlIChuZXh0ICE9IG51bGwpIHsKLQkJCQkJaWYgKCFuZXdFbGVtZW50Lmhhc0VuZFRhZygpICYmIG5ld0VsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiBuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUVsZW1lbnRJbXBsIG5leHRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJCQkJaWYgKCFuZXh0RWxlbWVudC5oYXNTdGFydFRhZygpICYmIG5leHRFbGVtZW50Lmhhc0VuZFRhZygpICYmIG5leHRFbGVtZW50Lm1hdGNoRW5kVGFnKG5ld0VsZW1lbnQpKSB7Ci0JCQkJCQkJLy8gc3RvcCBhdCB0aGUgbWF0Y2hlZCBpbnZhbGlkIGVuZCB0YWcKLQkJCQkJCQlOb2RlIGVsZW1lbnRDaGlsZCA9IG5leHRFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJCQl3aGlsZSAoZWxlbWVudENoaWxkICE9IG51bGwpIHsKLQkJCQkJCQkJTm9kZSBuZXh0Q2hpbGQgPSBlbGVtZW50Q2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQkJbmV4dEVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudENoaWxkKTsKLQkJCQkJCQkJbmV3RWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50Q2hpbGQpOwotCQkJCQkJCQllbGVtZW50Q2hpbGQgPSBuZXh0Q2hpbGQ7Ci0JCQkJCQkJfQotCi0JCQkJCQkJbmV4dCA9IG5leHRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKG5leHRFbGVtZW50KTsKLQkJCQkJCQluZXdFbGVtZW50LmFkZEVuZFRhZyhuZXh0RWxlbWVudCk7Ci0JCQkJCQkJaWYgKG5leHRFbGVtZW50ID09IG5ld05leHQpCi0JCQkJCQkJCXN0YXJ0RWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0KLQkJCQkJCQlOb2RlIG5ld1BhcmVudCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJCWlmIChuZXdQYXJlbnQgPT0gcGFyZW50KQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlpZiAobmV3UGFyZW50ID09IG51bGwgfHwgbmV3UGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQkJCWJyZWFrOyAvLyBlcnJvcgotCQkJCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld1BhcmVudDsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWNhbkNvbnRhaW4obmV3RWxlbWVudCwgbmV4dCkpIHsKLQkJCQkJCU5vZGUgbmV3UGFyZW50ID0gbmV3RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlpZiAobmV3UGFyZW50ID09IHBhcmVudCkKLQkJCQkJCQlicmVhazsKLQkJCQkJCWlmIChuZXdQYXJlbnQgPT0gbnVsbCB8fCBuZXdQYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCQlicmVhazsgLy8gZXJyb3IKLQkJCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld1BhcmVudDsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCU5vZGUgY2hpbGQgPSBuZXh0OwotCQkJCQluZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCQlpZiAoY2hpbGQgPT0gb2xkRWxlbWVudCkgewotCQkJCQkJaWYgKCFvbGRFbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQkJCQkJLy8gY2xvbmUgKHJlLWNyZWF0ZSkgZW5kIHRhZwotCQkJCQkJCUVsZW1lbnQgZW5kID0gb2xkRWxlbWVudC5yZW1vdmVFbmRUYWcoKTsKLQkJCQkJCQlpZiAoZW5kICE9IG51bGwpIHsKLQkJCQkJCQkJY2hpbGQgPSBlbmQ7Ci0JCQkJCQkJCW5ld05leHQgPSBlbmQ7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghb2xkRWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJCQkvLyBjbG9uZSAocmUtY3JlYXRlKSBlbmQgdGFnCi0JCQkJCUVsZW1lbnQgZW5kID0gb2xkRWxlbWVudC5yZW1vdmVFbmRUYWcoKTsKLQkJCQkJaWYgKGVuZCAhPSBudWxsKSB7Ci0JCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGVuZCwgb2xkRWxlbWVudCk7Ci0JCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQob2xkRWxlbWVudCk7Ci0JCQkJCQluZXdOZXh0ID0gZW5kOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJbmV3TmV4dCA9IG9sZEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXBhcmVudC5yZW1vdmVDaGlsZChvbGRFbGVtZW50KTsKLQkJfQotCi0JCS8vIHVwZGF0ZSBjb250ZXh0Ci0JCU5vZGUgb2xkUGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJTm9kZSBvbGROZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCWlmIChlbGVtZW50ID09IG9sZFBhcmVudCkgewotCQkJaWYgKG9sZE5leHQgIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShvbGROZXh0KTsgLy8gcmVzZXQgZm9yIG5ldyBwYXJlbnQKLQkJCX0KLQkJCWVsc2UgaWYgKG5ld05leHQgIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXdOZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHBhcmVudCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCA9PSBvbGROZXh0KSB7Ci0JCQlpZiAoZmlyc3RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShmaXJzdEVsZW1lbnQpOwotCQkJfQotCQkJZWxzZSBpZiAoZmlyc3QgIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShmaXJzdCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzdGFydEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHN0YXJ0RWxlbWVudCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV3TmV4dCk7Ci0JCQl9Ci0JCX0KLQotCQlyZW1vdmVJbXBsaWNpdEVsZW1lbnQoZWxlbWVudFBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJTm9kZUltcGwgbmV4dCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCXNob3J0IG5vZGVUeXBlID0gbmV4dC5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5leHQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGZsYXROb2RlID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQlyZW1vdmVOb2RlKG5leHQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJCQkvLyB0aGlzIGlzIHRoZSBjYXNlIGZvciBlbXB0eSBUZXh0Ci0JCQkJCS8vIHJlbW92ZSBhbmQgY29udGludWUKLQkJCQkJcmVtb3ZlTm9kZShuZXh0KTsKLQkJCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgbmV4dDsKLQkJCQlib29sZWFuIGlzU2hhcmVkID0gdGV4dC5pc1NoYXJpbmdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQlpZiAoaXNTaGFyZWQpIHsKLQkJCQkJLy8gbWFrZSBzdXJlIHRoZXJlIGlzIG5leHQgVGV4dCBub2RlIHNoYXJpbmcgdGhpcwotCQkJCQlUZXh0SW1wbCBuZXh0VGV4dCA9IChUZXh0SW1wbCkgdGhpcy5jb250ZXh0LmZpbmROZXh0VGV4dCgpOwotCQkJCQlpZiAobmV4dFRleHQgPT0gbnVsbCB8fCAhbmV4dFRleHQuaGFzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCQkJCWlzU2hhcmVkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gdGV4dC5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJaWYgKHRleHQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgewotCQkJCQkvLyB0aGlzIGlzIHRoZSBjYXNlIHBhcnRpYWwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcwotCQkJCQkvLyByZW1vdmVkCi0JCQkJCXJlbW92ZU5vZGUodGV4dCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBub3RpZnkgdGhlIGNoYW5nZQotCQkJCQl0ZXh0Lm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJCX0KLQkJCQkvLyBpZiBzaGFyZWQsIGNvbnRpbnVlIHRvIHJlbW92ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJLy8gZnJvbSB0aGVtCi0JCQkJaWYgKGlzU2hhcmVkKQotCQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5leHQ7Ci0JCQlpZiAoZWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50Lmhhc0VuZFRhZygpIHx8IGVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQkJCXJlbW92ZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVtb3ZlTm9kZShlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGNoaWxkKTsKLQkJCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAoIWVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJLy8gaW1wbGljaXQgZWxlbWVudAotCQkJCQlyZW1vdmVOb2RlKGVsZW1lbnQpOwotCQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBlbGVtZW50LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChmbGF0Tm9kZSAhPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJcmVtb3ZlTm9kZShlbGVtZW50KTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCU5vZGUgcGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJRWxlbWVudEltcGwgZW5kID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCWlmIChlbmQuaGFzRW5kVGFnKCkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBlbmQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWlmICghZW5kLmhhc1N0YXJ0VGFnKCkgJiYgIWVuZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoZW5kKTsKLQkJCQlyZW1vdmVOb2RlKGVuZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQllbmQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJCXJlbW92ZUVuZFRhZyhlbmQpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJbmV4dCA9IChOb2RlSW1wbCkgZW5kLmdldE5leHRTaWJsaW5nKCk7Ci0JCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcGFyZW50ID0gZW5kLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlUmVnaW9ucyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmV3UmVnaW9ucwotCSAqICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvcgotCSAqIEBwYXJhbSBvbGRSZWdpb25zCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yCi0JICovCi0Jdm9pZCByZXBsYWNlUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLm1vZGVsLmdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGhpcy5jb250ZXh0ID0gbmV3IFhNTE1vZGVsQ29udGV4dCh0aGlzLm1vZGVsLmdldERvY3VtZW50KCkpOwotCi0JCS8vIG9wdGltaXplIHR5cGljYWwgY2FzZXMKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEZpcnN0UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQljaGFuZ2VTdGFydFRhZyhmbGF0Tm9kZSwgbmV3UmVnaW9ucywgb2xkUmVnaW9ucyk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCWNoYW5nZUVuZFRhZyhmbGF0Tm9kZSwgbmV3UmVnaW9ucywgb2xkUmVnaW9ucyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgbWV0aG9kCi0JICogCi0JICovCi0Jdm9pZCByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCWlmICh0aGlzLm1vZGVsLmdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGhpcy5jb250ZXh0ID0gbmV3IFhNTE1vZGVsQ29udGV4dCh0aGlzLm1vZGVsLmdldERvY3VtZW50KCkpOwotCi0JCWludCBuZXdDb3VudCA9IChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgPyBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpIDogMCk7Ci0JCWludCBvbGRDb3VudCA9IChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgPyBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpIDogMCk7Ci0KLQkJaWYgKG9sZENvdW50ID4gMCkgewotCQkJc2V0dXBDb250ZXh0KG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbSgwKSk7Ci0JCQkvLyBOb2RlIHN0YXJ0UGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRDb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbShpKTsKLQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRSZWdpb24pOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKG5ld0NvdW50ID09IDApCi0JCQkJcmV0dXJuOwotCQkJc2V0dXBDb250ZXh0KG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbSgwKSk7Ci0JCX0KLQkJLy8gbWFrZSBzdXJlIHRoZSBwYXJlbnQgaXMgc2V0IHRvIGRlZXBlc3QgbGV2ZWwKLQkJLy8gd2hlbiBlbmQgdGFnIGhhcyBiZWVuIHJlbW92ZWQKLQkJdGhpcy5jb250ZXh0LnNldExhc3QoKTsKLQotCQlpZiAobmV3Q291bnQgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0NvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKGkpOwotCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQljbGVhbnVwVGV4dCgpOwotCQljbGVhbnVwRW5kVGFnKCk7Ci0JfQotCi0JLyoqCi0JICogc2V0dXBDb250ZXh0IG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cENvbnRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpbnQgb2Zmc2V0ID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm47Ci0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXRSb290Tm9kZSgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChvZmZzZXQgPT0gMCkgewotCQkJLy8gYXQgdGhlIGJlZ2lubmluZyBvZiBkb2N1bWVudAotCQkJTm9kZSBjaGlsZCA9IHJvb3QuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGNoaWxkKTsKLQkJCWVsc2UKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShyb290KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCU5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpIHJvb3QuZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCS8vIG1pZ2h0IGJlIGF0IHRoZSBlbmQgb2YgZG9jdW1lbnQKLQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHJvb3QpOwotCQkJdGhpcy5jb250ZXh0LnNldExhc3QoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChvZmZzZXQgPT0gbm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSBub2RlOwotCQkJVGV4dCBuZXh0VGV4dCA9IHRleHQuc3BsaXRUZXh0KHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCS8vIG5vdGlmeSB0aGUgY2hhbmdlCi0JCQl0ZXh0Lm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJaWYgKG5leHRUZXh0ID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBlcnJvcgotCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHRUZXh0KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChvZmZzZXQgPj0gKChOb2RlSW1wbCkgY2hpbGQpLmdldEVuZE9mZnNldCgpKQotCQkJCWNvbnRpbnVlOwotCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGNoaWxkKTsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShub2RlKTsKLQkJdGhpcy5jb250ZXh0LnNldExhc3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MTW9kZWxDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbFVwZGF0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MmIyMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbFVwZGF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIERhdmlkIENhcnZlciAoU1RBUikgLSBidWcgMjk2OTk5IC0gSW5lZmZpY2llbnQgdXNlIG9mIG5ldyBTdHJpbmcoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiBYTUxNb2RlbFVwZGF0ZXIgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIFhNTE1vZGVsVXBkYXRlciB7Ci0JcHJpdmF0ZSBpbnQgZGlmZiA9IDA7Ci0JcHJpdmF0ZSBpbnQgZ2FwTGVuZ3RoID0gMDsKLQlwcml2YXRlIGludCBnYXBPZmZzZXQgPSAwOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCXByaXZhdGUgSVNvdXJjZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBudWxsOwotCXByaXZhdGUgRE9NTW9kZWxJbXBsIG1vZGVsID0gbnVsbDsKLQlwcml2YXRlIE5vZGVJbXBsIG5leHROb2RlID0gbnVsbDsKLQlwcml2YXRlIE5vZGVJbXBsIHBhcmVudE5vZGUgPSBudWxsOwotCi0JcHJvdGVjdGVkIFhNTE1vZGVsVXBkYXRlcihET01Nb2RlbEltcGwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQkJdGhpcy5nZW5lcmF0b3IgPSBtb2RlbC5nZXRHZW5lcmF0b3IoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNoYW5nZUF0dHJWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gYXR0ck5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlQXR0ck5hbWUoQXR0ciBhdHRyTm9kZSkgewotCQlpZiAoYXR0ck5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBhdHRyTm9kZTsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJY2hhbmdlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gZWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSBvZmZzZXQ7Ci0JCWludCBlbmQgPSBvZmZzZXQ7Ci0KLQkJU3RyaW5nIG5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBhdHRyLmdldE5hbWVSZWdpb24oKTsKLQkJaWYgKG5hbWVSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJc3RhcnQgKz0gbmFtZVJlZ2lvbi5nZXRTdGFydCgpOwotCQkvLyB1c2UgZ2V0VGV4dEVuZCgpIGJlY2F1c2UgZ2V0RW5kKCkgbWF5IGluY2x1ZGUgdGhlIHRhaWxpbmcgc3BhY2VzCi0JCWVuZCArPSBuYW1lUmVnaW9uLmdldFRleHRFbmQoKTsKLQotCQlyZXBsYWNlU291cmNlKG5hbWUsIHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIGNoYW5nZUF0dHJWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gYXR0ck5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlQXR0clZhbHVlKEF0dHIgYXR0ck5vZGUpIHsKLQkJaWYgKGF0dHJOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0ck5vZGU7Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCWNoYW5nZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG9mZnNldCA9IGVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gb2Zmc2V0OwotCQlpbnQgZW5kID0gb2Zmc2V0OwotCi0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gYXR0ci5nZXRWYWx1ZVJlZ2lvbigpOwotCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJY2hhciBxdW90ZSA9IDA7IC8vIG5vIHF1b3RlIHByZWZlcmVuY2UKLQkJCS8vIERXOiA0LzE2LzIwMDMgZHVlIHRvIGNoYW5nZSBpbiBzdHJ1Y3R1cmVkRG9jdW1lbnQgLi4uIHdlIG5lZWQgYQotCQkJLy8gZmxhdG5vZGUgdG8KLQkJCS8vIGdldCBhdCByZWdpb24gdmFsdWVzLiBGb3Igbm93IEknbGwgYXNzdW1lIHRoaXMgaXMgYWx3YXlzIHRoZQotCQkJLy8gZmlyc3QKLQkJCS8vIGZsYXRub2RlIC4uIG1heSBuZWVkIHRvIG1ha2Ugc21hcnRlciBsYXRlciAoZS5nLiB0byBzZWFyY2ggZm9yCi0JCQkvLyB0aGUgZmxhdG5vZGUgdGhhdCB0aGlzLnZhbHVlUmVnaW9uIGJlbG9uZ3MgdG8uCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gZWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJU3RyaW5nIG9sZFZhbHVlID0gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dCh2YWx1ZVJlZ2lvbik7Ci0JCQlpZiAob2xkVmFsdWUgIT0gbnVsbCAmJiBvbGRWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQljaGFyIGZpcnN0Q2hhciA9IG9sZFZhbHVlLmNoYXJBdCgwKTsKLQkJCQlpZiAoZmlyc3RDaGFyID09ICciJyB8fCBmaXJzdENoYXIgPT0gJ1wnJykgewotCQkJCQlxdW90ZSA9IGZpcnN0Q2hhcjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUlUZXh0UmVnaW9uIHN0YXJ0UmVnaW9uID0gdmFsdWVSZWdpb247Ci0KLQkJCXZhbHVlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVBdHRyVmFsdWUoYXR0ciwgcXVvdGUpOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQl2YWx1ZSA9IE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJCQkvLyByZW1vdmUgZXF1YWwgdG9vCi0JCQkJSVRleHRSZWdpb24gZXF1YWxSZWdpb24gPSBhdHRyLmdldEVxdWFsUmVnaW9uKCk7Ci0JCQkJaWYgKGVxdWFsUmVnaW9uICE9IG51bGwpCi0JCQkJCXN0YXJ0UmVnaW9uID0gZXF1YWxSZWdpb247Ci0JCQl9Ci0JCQlhdHRyLnNldFZhbHVlUmVnaW9uKHZhbHVlUmVnaW9uKTsgLy8gcmVzZXQgdmFsdWUKLQotCQkJc3RhcnQgKz0gc3RhcnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCS8vIHVzZSBnZXRUZXh0RW5kKCkgYmVjYXVzZSBnZXRFbmQoKSBtYXkgaW5jbHVkZSB0aGUgdGFpbGluZwotCQkJLy8gc3BhY2VzCi0JCQllbmQgKz0gdmFsdWVSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQl9Ci0JCWVsc2UgewotCQkJSVRleHRSZWdpb24gZXF1YWxSZWdpb24gPSBhdHRyLmdldEVxdWFsUmVnaW9uKCk7Ci0KLQkJCXZhbHVlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVBdHRyVmFsdWUoYXR0cik7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCWlmIChlcXVhbFJlZ2lvbiA9PSBudWxsKQotCQkJCQlyZXR1cm47IC8vIG5vdGhuZyB0byBkbwotCQkJCXZhbHVlID0gTm9kZUltcGwuRU1QVFlfU1RSSU5HOwotCQkJCS8vIHJlbW92ZSBlcXVhbAotCQkJCXN0YXJ0ICs9IGVxdWFsUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJZW5kICs9IGVxdWFsUmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChlcXVhbFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCS8vIHVzZSBnZXRUZXh0RW5kKCkgYmVjYXVzZSBnZXRFbmQoKSBtYXkgaW5jbHVkZSB0aGUKLQkJCQkJLy8gdGFpbGluZyBzcGFjZXMKLQkJCQkJc3RhcnQgKz0gZXF1YWxSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGF0dHIuZ2V0TmFtZVJlZ2lvbigpOwotCQkJCQlpZiAobmFtZVJlZ2lvbiA9PSBudWxsKQotCQkJCQkJcmV0dXJuOyAvLyBtdXN0IG5ldmVyIGhhcHBlbgotCQkJCQkvLyB1c2UgZ2V0VGV4dEVuZCgpIGJlY2F1c2UgZ2V0RW5kKCkgbWF5IGluY2x1ZGUgdGhlCi0JCQkJCS8vIHRhaWxpbmcgc3BhY2VzCi0JCQkJCXN0YXJ0ICs9IG5hbWVSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJCQl2YWx1ZSA9ICc9JyArIHZhbHVlOwotCQkJCX0KLQkJCQllbmQgPSBzdGFydDsKLQkJCX0KLQkJfQotCi0JCXJlcGxhY2VTb3VyY2UodmFsdWUsIHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgY2hhbmdlRW5kVGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgc291cmNlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCi0JCUVsZW1lbnRJbXBsIGltcGwgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0JCWludCBvZmZzZXQgPSBpbXBsLmdldEVuZFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IG9mZnNldDsKLQkJaW50IGVuZCA9IG9mZnNldDsKLQkJaWYgKGltcGwuaGFzRW5kVGFnKCkpIHsKLQkJCWVuZCA9IGltcGwuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGltcGwuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpbXBsLnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2Zmc2V0LCBsZW5ndGgpKTsKLQkJfQotCi0JCXJlcGxhY2VTb3VyY2Uoc291cmNlLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VOYW1lIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jdm9pZCBjaGFuZ2VOYW1lKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBzdXBwb3J0IGNoYW5naW5nIG5hbWUgb2YgYXR0cmlidXRlIGZvciBzZXRQcmVmaXgoKQotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCWNoYW5nZUF0dHJOYW1lKChBdHRyKSBub2RlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuOwotCX0KLQotCXZvaWQgY2hhbmdlUmVnaW9uKFJlZ2lvbkNoYW5nZWRFdmVudCBjaGFuZ2UsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpZiAoY2hhbmdlLmdldE9mZnNldCgpID49IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyByZWdpb24uZ2V0VGV4dEVuZCgpKSB7Ci0JCQkvLyBjaGFuZ2UgaXMgZW50aXJlbHkgaW4gd2hpdGUtc3BhY2UKLQkJCXJldHVybjsKLQkJfQotCi0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJdGhpcy5wYXJlbnROb2RlID0gcm9vdDsKLQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0KLQkJcmVtb3ZlR2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQmVmb3JlKGZsYXROb2RlLmdldFN0YXJ0KCkpOwotCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25BZnRlcihmbGF0Tm9kZS5nZXRFbmQoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBhIGZhbGxiYWNrIG1ldGhvZCB0byByZWdlbmVyYXRlIHRoZSBzdGFydCB0YWcuCi0JICovCi0Jdm9pZCBjaGFuZ2VTdGFydFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQotCQlpZiAoIWltcGwuaGFzU3RhcnRUYWcoKSAmJiAhaW1wbC5oYXNFbmRUYWcoKSkgewotCQkJLy8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgdGFncwotCQkJTm9kZSBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCXJlcGxhY2VDaGlsZChwYXJlbnQsIGVsZW1lbnQsIGVsZW1lbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIGVsc2UgZXJyb3IKLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQotCQlpbnQgb2Zmc2V0ID0gaW1wbC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSBvZmZzZXQ7Ci0JCWludCBlbmQgPSBvZmZzZXQ7Ci0JCWlmIChpbXBsLmhhc1N0YXJ0VGFnKCkpIHsKLQkJCWVuZCA9IGltcGwuZ2V0U3RhcnRFbmRPZmZzZXQoKTsKLQkJCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gaW1wbC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl9Ci0JCWltcGwuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKSk7Ci0KLQkJcmVwbGFjZVNvdXJjZShzb3VyY2UsIHN0YXJ0LCBlbmQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaW50IG9sZE9mZnNldCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQlpbnQgb2xkRW5kID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQlib29sZWFuIGlzRW5kVGFnID0gZmFsc2U7Ci0KLQkJLy8gZmluZCBvd25lciBub2RlCi0JCU5vZGVJbXBsIG93bmVyTm9kZSA9IG51bGw7Ci0JCXdoaWxlICh0aGlzLnBhcmVudE5vZGUgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRoaXMubmV4dE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpZiAobmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJCW93bmVyTm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpbnQgbmV4dE9mZnNldCA9IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJaWYgKG5leHRPZmZzZXQgPT0gb2xkT2Zmc2V0KSB7IC8vIGZvdW5kCi0JCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5uZXh0Tm9kZTsKLQkJCQkJCWlmICh0ZXh0Lmhhc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkJCQkJb3duZXJOb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWludCBuZXh0RW5kID0gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJCQkJCWlmIChuZXh0T2Zmc2V0IDwgb2xkRW5kICYmIG5leHRFbmQgPiBvbGRPZmZzZXQpIHsKLQkJCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTm9kZSBjaGlsZCA9IHRoaXMubmV4dE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIGNoaWxkOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAodGhpcy5uZXh0Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSBudWxsOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0aGlzLm5leHROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICh0aGlzLnBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRoaXMucGFyZW50Tm9kZTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlvd25lck5vZGUgPSB0aGlzLnBhcmVudE5vZGU7Ci0JCQkJCQlpc0VuZFRhZyA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpbnQgZW5kT2Zmc2V0ID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJCWlmIChlbmRPZmZzZXQgPT0gb2xkT2Zmc2V0KSB7IC8vIGZvdW5kCi0JCQkJCQlvd25lck5vZGUgPSB0aGlzLnBhcmVudE5vZGU7Ci0JCQkJCQlpc0VuZFRhZyA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGhpcy5wYXJlbnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSAoTm9kZUltcGwpIHRoaXMucGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKG93bmVyTm9kZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQotCQlzaG9ydCBub2RlVHlwZSA9IG93bmVyTm9kZS5nZXROb2RlVHlwZSgpOwotCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG93bmVyTm9kZTsKLQkJCWlmIChpc0VuZFRhZykgewotCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJdXBkYXRlQXR0clJlZ2lvbnMoZWxlbWVudCwgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgb3duZXJOb2RlOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGV4dC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQlpbnQgbmV3T2Zmc2V0ID0gb2xkT2Zmc2V0OwotCQkJCWludCBuZXdFbmQgPSBvbGRFbmQ7Ci0JCQkJaWYgKG9sZE9mZnNldCA9PSB0aGlzLmdhcE9mZnNldCkgewotCQkJCQluZXdPZmZzZXQgKz0gdGhpcy5kaWZmOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmV3RW5kID0gdGhpcy5nYXBPZmZzZXQ7Ci0JCQkJfQotCQkJCWludCBuZXdMZW5ndGggPSBuZXdFbmQgLSBuZXdPZmZzZXQ7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkobmV3T2Zmc2V0LCBuZXdMZW5ndGgsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJdGV4dC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQkJCWlmIChvbGRFbmQgPiBuZXdFbmQpIHsKLQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZTsKLQkJCQlpbnQgb2Zmc2V0ID0gcHJveHkuZ2V0T2Zmc2V0KCk7Ci0JCQkJaW50IGVuZCA9IG9mZnNldCArIHByb3h5LmdldExlbmd0aCgpOwotCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSB7Ci0JCQkJCWlmIChvZmZzZXQgPT0gb2xkT2Zmc2V0ICYmIGVuZCA9PSBvbGRFbmQpIHsKLQkJCQkJCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoZW5kID4gb2xkRW5kKSB7Ci0JCQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKTsKLQkJCQkJCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJcHJveHkuc2V0T2Zmc2V0KG9sZEVuZCk7Ci0JCQkJCQkJcHJveHkuc2V0TGVuZ3RoKGVuZCAtIG9sZEVuZCk7Ci0JCQkJCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihwcm94eSk7Ci0JCQkJCQkJdGV4dC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JCQkJCQkJaWYgKGVuZCA8IG9sZEVuZCkgeyAvLyB0byBiZSBzaGFyZWQKLQkJCQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChvZmZzZXQgPj0gdGhpcy5nYXBPZmZzZXQpIHsKLQkJCQkJcHJveHkuc2V0T2Zmc2V0KG9mZnNldCArIHRoaXMuZGlmZik7Ci0JCQkJCWVuZCArPSB0aGlzLmRpZmY7Ci0JCQkJfQotCQkJCWlmIChlbmQgPCBvbGRFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOyAvLyBlcnJvcgotCQkJCQlpZiAoY29udGVudCA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJCWludCBuZXdPZmZzZXQgPSBvbGRPZmZzZXQ7Ci0JCQkJCQlpbnQgbmV3RW5kID0gb2xkRW5kOwotCQkJCQkJaWYgKG9sZE9mZnNldCA9PSB0aGlzLmdhcE9mZnNldCkgewotCQkJCQkJCW5ld09mZnNldCArPSB0aGlzLmRpZmY7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQluZXdFbmQgPSB0aGlzLmdhcE9mZnNldDsKLQkJCQkJCX0KLQkJCQkJCWludCBuZXdMZW5ndGggPSBuZXdFbmQgLSBuZXdPZmZzZXQ7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShuZXdPZmZzZXQsIG5ld0xlbmd0aCwgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCWNvbnRhaW5lci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0KLQkJCQkJCWlmIChvbGRFbmQgPiBuZXdFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gcHJveHkuZ2V0T2Zmc2V0KCk7Ci0JCQkJCQlpbnQgZW5kID0gb2Zmc2V0ICsgcHJveHkuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQlpZiAoZW5kIDw9IG9sZE9mZnNldCkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSB7Ci0JCQkJCQkJaWYgKG9mZnNldCA9PSBvbGRPZmZzZXQgJiYgZW5kID09IG9sZEVuZCkgewotCQkJCQkJCQljb250YWluZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJaWYgKGVuZCA+IG9sZEVuZCkgewotCQkJCQkJCQkJY29udGFpbmVyLmluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJCQkJcHJveHkuc2V0T2Zmc2V0KG9sZEVuZCk7Ci0JCQkJCQkJCQlwcm94eS5zZXRMZW5ndGgoZW5kIC0gb2xkRW5kKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JCQkJCQkJCQlpZiAoZW5kIDwgb2xkRW5kKSB7IC8vIHRvIGJlIHNoYXJlZAotCQkJCQkJCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChvZmZzZXQgPj0gdGhpcy5nYXBPZmZzZXQpIHsKLQkJCQkJCQlwcm94eS5zZXRPZmZzZXQob2Zmc2V0ICsgdGhpcy5kaWZmKTsKLQkJCQkJCQllbmQgKz0gdGhpcy5kaWZmOwotCQkJCQkJfQotCQkJCQkJaWYgKGVuZCA8IG9sZEVuZCkgeyAvLyB0byBiZSBzaGFyZWQKLQkJCQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0ZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCW93bmVyTm9kZS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VUZXh0RGF0YShUZXh0IHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgc291cmNlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVTb3VyY2UodGV4dCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQotCQlUZXh0SW1wbCBpbXBsID0gKFRleHRJbXBsKSB0ZXh0OwotCQlpbnQgc3RhcnQgPSBpbXBsLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSBpbXBsLmdldEVuZE9mZnNldCgpOwotCQlpbnQgb2Zmc2V0ID0gc3RhcnQ7Ci0KLQkJLy8gbWFrZSBzdXJlIHByZXZpb3VzIHRhZyBpcyBjbG9zZWQKLQkJTm9kZSBwcmV2ID0gdGV4dC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZVRhZyA9IGdldENsb3NlVGFnKChJRE9NTm9kZSkgcHJldik7Ci0JCQlpZiAocHJlVGFnICE9IG51bGwgJiYgcHJlVGFnLmxlbmd0aCgpID4gMCkgewotCQkJCW9mZnNldCArPSBwcmVUYWcubGVuZ3RoKCk7Ci0JCQkJc291cmNlID0gcHJlVGFnICsgc291cmNlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJTm9kZSBwYXJlbnQgPSB0ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCQlTdHJpbmcgcHJlVGFnID0gZ2V0U3RhcnRDbG9zZVRhZyhlbGVtZW50KTsKLQkJCQlpZiAocHJlVGFnICE9IG51bGwgJiYgcHJlVGFnLmxlbmd0aCgpID4gMCkgewotCQkJCQlvZmZzZXQgKz0gcHJlVGFnLmxlbmd0aCgpOwotCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlidWZmZXIuYXBwZW5kKHByZVRhZyk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlKTsKLQkJCQkJaWYgKHRleHQuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsICYmICFlbGVtZW50Lmhhc0VuZFRhZygpICYmIChlbGVtZW50LmlzSlNQQ29udGFpbmVyKCkgfHwgZWxlbWVudC5pc0NEQVRBQ29udGFpbmVyKCkpKSB7Ci0JCQkJCQkvLyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBlbmQgdGFnCi0JCQkJCQlTdHJpbmcgcG9zdFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQkJCQkJaWYgKHBvc3RUYWcgIT0gbnVsbCkgewotCQkJCQkJCWludCBwb3N0TGVuZ3RoID0gcG9zdFRhZy5sZW5ndGgoKTsKLQkJCQkJCQlpZiAocG9zdExlbmd0aCA+IDApIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZChwb3N0VGFnKTsKLQkJCQkJCQkJaW50IHBvc3RPZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7Ci0JCQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkocG9zdE9mZnNldCwgcG9zdExlbmd0aCk7Ci0JCQkJCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc291cmNlID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBpbXBsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCWlmIChsZW5ndGggPiAwKQotCQkJbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJaW1wbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQlyZXBsYWNlU291cmNlKHNvdXJjZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogY2hhbmdlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIGNoYW5nZVZhbHVlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQljaGFuZ2VUZXh0RGF0YSgoVGV4dCkgbm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCWNoYW5nZUF0dHJWYWx1ZSgoQXR0cikgbm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQljaGFuZ2VTdGFydFRhZygoRWxlbWVudCkgbm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVTb3VyY2Uobm9kZSk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQotCQlOb2RlSW1wbCBpbXBsID0gKE5vZGVJbXBsKSBub2RlOwotCQlpbnQgc3RhcnQgPSBpbXBsLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSBpbXBsLmdldEVuZE9mZnNldCgpOwotCi0JCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gaW1wbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCWlmIChsZW5ndGggPiAwKQotCQkJZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkoc3RhcnQsIGxlbmd0aCk7Ci0JCWltcGwuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQotCQlyZXBsYWNlU291cmNlKHNvdXJjZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0clZhbHVlQ2xvc2UoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0UmVnaW9uKGZsYXROb2RlKTsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsIHx8IHJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgdmFsdWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gY2hlY2sgb3BlbiBKU1AgdGFnCi0JCWJvb2xlYW4gY2xvc2VKU1BUYWcgPSBmYWxzZTsKLQkJaW50IG9mZnNldCA9IHZhbHVlLmluZGV4T2YoSlNQVGFnLlRBR19PUEVOKTsKLQkJd2hpbGUgKG9mZnNldCA+PSAwKSB7Ci0JCQlvZmZzZXQgPSB2YWx1ZS5pbmRleE9mKEpTUFRhZy5UQUdfQ0xPU0UsIG9mZnNldCArIDIpOwotCQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCQljbG9zZUpTUFRhZyA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlvZmZzZXQgPSB2YWx1ZS5pbmRleE9mKEpTUFRhZy5UQUdfT1BFTiwgb2Zmc2V0ICsgMik7Ci0JCX0KLQotCQkvLyBjaGVjayBxdW90ZQotCQlib29sZWFuIGNsb3NlUXVvdGUgPSBmYWxzZTsKLQkJY2hhciBmaXJzdENoYXIgPSB2YWx1ZS5jaGFyQXQoMCk7Ci0JCWlmIChmaXJzdENoYXIgPT0gJyInIHx8IGZpcnN0Q2hhciA9PSAnXCcnKSB7Ci0JCQlpZiAoY2xvc2VKU1BUYWcgfHwgbGVuZ3RoID09IDEgfHwgdmFsdWUuY2hhckF0KGxlbmd0aCAtIDEpICE9IGZpcnN0Q2hhcikgewotCQkJCWNsb3NlUXVvdGUgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFjbG9zZUpTUFRhZyAmJiAhY2xvc2VRdW90ZSkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChjbG9zZUpTUFRhZykKLQkJCWJ1ZmZlci5hcHBlbmQoSlNQVGFnLlRBR19DTE9TRSk7Ci0JCWlmIChjbG9zZVF1b3RlKQotCQkJYnVmZmVyLmFwcGVuZChmaXJzdENoYXIpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2F0aGVyIGNsb3NlIHRhZ3MgcmVjdXJzaXZlbHkuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xvc2VUYWcoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUuaXNDbG9zZWQoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCXJldHVybiB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUNsb3NlVGFnKG5vZGUpOwotCQl9Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJaWYgKGVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCS8vIGVuZCB0YWcgaXMgbm90IGNsb3NlZAotCQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlQ2xvc2VUYWcoZWxlbWVudCk7Ci0JCX0KLQotCQkvLyBubyBlbmQgdGFnCi0JCWludCBvZmZzZXQgPSBlbGVtZW50LmdldEVuZE9mZnNldCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCUlET01Ob2RlIGxhc3RDaGlsZCA9IChJRE9NTm9kZSkgZWxlbWVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJaWYgKGxhc3RDaGlsZCA9PSBudWxsKSB7Ci0JCQlpZiAoIWVsZW1lbnQuaXNTdGFydFRhZ0Nsb3NlZCgpKSB7Ci0JCQkJaWYgKGVsZW1lbnQucHJlZmVyRW1wdHlUYWcoKSkKLQkJCQkJZWxlbWVudC5zZXRFbXB0eVRhZyh0cnVlKTsKLQkJCQlTdHJpbmcgY2xvc2VUYWcgPSBnZXRTdGFydENsb3NlVGFnKGVsZW1lbnQpOwotCQkJCWlmIChjbG9zZVRhZyAhPSBudWxsKSB7Ci0JCQkJCWludCBsZW5ndGggPSBjbG9zZVRhZy5sZW5ndGgoKTsKLQkJCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoY2xvc2VUYWcpOwotCQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBjbG9zZVRhZyA9IGdldENsb3NlVGFnKGxhc3RDaGlsZCk7Ci0JCQlpZiAoY2xvc2VUYWcgIT0gbnVsbCkgewotCQkJCWludCBsZW5ndGggPSBjbG9zZVRhZy5sZW5ndGgoKTsKLQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQlidWZmZXIuYXBwZW5kKGNsb3NlVGFnKTsKLQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgZW5kVGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCWlmIChlbmRUYWcgIT0gbnVsbCkgewotCQkJaW50IGxlbmd0aCA9IGVuZFRhZy5sZW5ndGgoKTsKLQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChlbmRUYWcpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2Zmc2V0LCBsZW5ndGgpOwotCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRTdGFydENsb3NlVGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50LmlzU3RhcnRUYWdDbG9zZWQoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBhdHRyVmFsdWVDbG9zZSA9IGdldEF0dHJWYWx1ZUNsb3NlKGVsZW1lbnQpOwotCQlpZiAoYXR0clZhbHVlQ2xvc2UgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoYXR0clZhbHVlQ2xvc2UpOwotCQlTdHJpbmcgY2xvc2VUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUNsb3NlVGFnKGVsZW1lbnQpOwotCQlpZiAoY2xvc2VUYWcgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoY2xvc2VUYWcpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQl0aGlzLmdhcE9mZnNldCA9IDA7Ci0JCXRoaXMuZ2FwTGVuZ3RoID0gMDsKLQkJdGhpcy5kaWZmID0gMDsKLQkJdGhpcy5wYXJlbnROb2RlID0gbnVsbDsKLQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkFmdGVyKGludCBlbmRPZmZzZXQpIHsKLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudC5nZXRTdGFydCgpIDwgZW5kT2Zmc2V0KQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gcHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZShpbnQgc3RhcnRPZmZzZXQpIHsKLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudC5nZXRTdGFydCgpID49IHN0YXJ0T2Zmc2V0KQotCQkJCQlyZXR1cm47Ci0JCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaW50IG5ld09mZnNldCA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQlpbnQgbmV3RW5kID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQlib29sZWFuIGlzRW5kVGFnID0gZmFsc2U7Ci0KLQkJLy8gZmluZCBvd25lciBub2RlCi0JCU5vZGVJbXBsIG93bmVyTm9kZSA9IG51bGw7Ci0JCXdoaWxlICh0aGlzLnBhcmVudE5vZGUgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRoaXMubmV4dE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpbnQgbmV4dE9mZnNldCA9IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJaWYgKG5leHRPZmZzZXQgPT0gbmV3T2Zmc2V0KSB7IC8vIGZvdW5kCi0JCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJaW50IG5leHRFbmQgPSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQkJCQkJaWYgKG5leHRPZmZzZXQgPCBuZXdFbmQgJiYgbmV4dEVuZCA+IG5ld09mZnNldCkgewotCQkJCQkJCW93bmVyTm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlOb2RlIGNoaWxkID0gdGhpcy5uZXh0Tm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJdGhpcy5wYXJlbnROb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgY2hpbGQ7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICh0aGlzLm5leHROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJdGhpcy5wYXJlbnROb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRoaXMubmV4dE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAodGhpcy5uZXh0Tm9kZSAhPSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKHRoaXMucGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGhpcy5wYXJlbnROb2RlOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaW50IGVuZE9mZnNldCA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCQlpZiAoZW5kT2Zmc2V0ID09IG5ld09mZnNldCkgeyAvLyBmb3VuZAotCQkJCQkJb3duZXJOb2RlID0gdGhpcy5wYXJlbnROb2RlOwotCQkJCQkJaXNFbmRUYWcgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRoaXMucGFyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCQkJdGhpcy5wYXJlbnROb2RlID0gKE5vZGVJbXBsKSB0aGlzLnBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmIChvd25lck5vZGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0KLQkJc2hvcnQgbm9kZVR5cGUgPSBvd25lck5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvd25lck5vZGU7Ci0JCQlpZiAoaXNFbmRUYWcpIHsKLQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCXVwZGF0ZUF0dHJSZWdpb25zKGVsZW1lbnQsIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG93bmVyTm9kZTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gdGV4dC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpbnQgb2xkT2Zmc2V0ID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQlpbnQgb2xkRW5kID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQkJaWYgKG9sZE9mZnNldCA9PSBuZXdPZmZzZXQgJiYgb2xkRW5kID09IG5ld0VuZCkgewotCQkJCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCWlmIChvbGRFbmQgPiBuZXdFbmQpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKTsKLQkJCQkJaWYgKG9sZE9mZnNldCA9PSBuZXdPZmZzZXQpIHsKLQkJCQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IG5ld1Byb3h5ID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KCk7Ci0JCQkJCQluZXdQcm94eS5zZXRPZmZzZXQob2xkT2Zmc2V0KTsKLQkJCQkJCW5ld1Byb3h5LnNldExlbmd0aChuZXdFbmQgLSBvbGRPZmZzZXQpOwotCQkJCQkJbmV3UHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1Byb3h5KTsKLQkJCQkJfQotCQkJCQlwcm94eS5zZXRPZmZzZXQobmV3RW5kKTsKLQkJCQkJcHJveHkuc2V0TGVuZ3RoKG9sZEVuZCAtIG5ld0VuZCk7Ci0JCQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocHJveHkpOwotCQkJCQl0ZXh0LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250YWluZXIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJCQkJaWYgKG9sZEVuZCA8IG5ld0VuZCkgeyAvLyB0byBiZSBzaGFyZWQKLQkJCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQkJaW50IG9mZnNldCA9IGNvbnRlbnQuZ2V0U3RhcnQoKTsKLQkJCQkJaW50IGVuZCA9IGNvbnRlbnQuZ2V0RW5kKCk7Ci0JCQkJCWlmIChlbmQgPD0gbmV3T2Zmc2V0KQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmIChvZmZzZXQgPT0gbmV3T2Zmc2V0ICYmIGVuZCA9PSBuZXdFbmQpIHsKLQkJCQkJCWNvbnRhaW5lci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJCWlmIChlbmQgPiBuZXdFbmQpIHsKLQkJCQkJCQlpZiAob2Zmc2V0ID09IG5ld09mZnNldCkgewotCQkJCQkJCQljb250YWluZXIuaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBuZXdQcm94eSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSgpOwotCQkJCQkJCQluZXdQcm94eS5zZXRPZmZzZXQob2Zmc2V0KTsKLQkJCQkJCQkJbmV3UHJveHkuc2V0TGVuZ3RoKG5ld0VuZCAtIG9mZnNldCk7Ci0JCQkJCQkJCW5ld1Byb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCQljb250YWluZXIuaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1Byb3h5LCBpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcHJveHkuc2V0T2Zmc2V0KG5ld0VuZCk7Ci0JCQkJCQkJcHJveHkuc2V0TGVuZ3RoKGVuZCAtIG5ld0VuZCk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJaWYgKGVuZCA9PSBuZXdFbmQpCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChvbGRFbmQgPCBuZXdFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlvd25lck5vZGUuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlR2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gcHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJfQotCQllbHNlIGlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChjb250ZW50ID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQlpZiAoY291bnQgPiAxKQotCQkJCQkJY29udGFpbmVyLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQkJZWxzZQotCQkJCQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJCWlmIChjb3VudCA+IDEpCi0JCQkJCQkJY29udGFpbmVyLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJaWYgKHRoaXMucGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWludCBnYXBFbmQgPSB0aGlzLmdhcE9mZnNldCArIHRoaXMuZ2FwTGVuZ3RoOwotCQlpbnQgb2xkT2Zmc2V0ID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWludCBvbGRFbmQgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCk7Ci0JCWlmIChvbGRPZmZzZXQgPj0gdGhpcy5nYXBPZmZzZXQgJiYgb2xkRW5kIDw9IGdhcEVuZCkKLQkJCXJldHVybjsgLy8gZG8gbm90aGluZwotCQlpbnQgb2xkTGVuZ3RoID0gb2xkRW5kIC0gb2xkT2Zmc2V0OwotCQlpZiAob2xkT2Zmc2V0ID49IGdhcEVuZCkKLQkJCW9sZE9mZnNldCArPSB0aGlzLmRpZmY7Ci0KLQkJLy8gZmluZCBvd25lciBub2RlCi0JCU5vZGVJbXBsIG93bmVyTm9kZSA9IG51bGw7Ci0JCUVsZW1lbnRJbXBsIG93bmVyRW5kVGFnID0gbnVsbDsKLQkJVGV4dEltcGwgb3duZXJUZXh0ID0gbnVsbDsKLQkJd2hpbGUgKHRoaXMucGFyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5uZXh0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCW93bmVyTm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAodGhpcy5uZXh0Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRoaXMubmV4dE5vZGU7Ci0JCQkJCWlmICh0ZXh0Lmhhc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJb3duZXJUZXh0ID0gdGV4dDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTm9kZSBjaGlsZCA9IHRoaXMubmV4dE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIGNoaWxkOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAodGhpcy5uZXh0Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSBudWxsOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0aGlzLm5leHROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICh0aGlzLnBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRoaXMucGFyZW50Tm9kZTsKLQkJCQlpZiAoZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJb3duZXJOb2RlID0gdGhpcy5wYXJlbnROb2RlOwotCQkJCQlvd25lckVuZFRhZyA9IGVsZW1lbnQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGhpcy5wYXJlbnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSAoTm9kZUltcGwpIHRoaXMucGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKG93bmVyTm9kZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQotCQlpZiAob3duZXJUZXh0ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBvd25lclRleHQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2xkT2Zmc2V0LCBvbGRMZW5ndGgpOwotCQkJCW93bmVyVGV4dC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJaW50IG9mZnNldCA9IHByb3h5LmdldE9mZnNldCgpOwotCQkJCWludCBlbmQgPSBvZmZzZXQgKyBwcm94eS5nZXRMZW5ndGgoKTsKLQkJCQlpZiAob2Zmc2V0ID49IHRoaXMuZ2FwT2Zmc2V0KSB7Ci0JCQkJCXByb3h5LnNldE9mZnNldChvZmZzZXQgKyB0aGlzLmRpZmYpOwotCQkJCX0KLQkJCQlwcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQkJaWYgKGVuZCA8IG9sZEVuZCAmJiAoZW5kIDwgdGhpcy5nYXBPZmZzZXQgfHwgb2xkRW5kID4gZ2FwRW5kKSkgeyAvLyBoYXMKLQkJCQkJLy8gc2hhcmVkCi0JCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQkJaWYgKGNvbnRlbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvbGRPZmZzZXQsIG9sZExlbmd0aCk7Ci0JCQkJCQljb250YWluZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQkJaW50IG9mZnNldCA9IHByb3h5LmdldE9mZnNldCgpOwotCQkJCQkJCWludCBlbmQgPSBvZmZzZXQgKyBwcm94eS5nZXRMZW5ndGgoKTsKLQkJCQkJCQlpZiAob2Zmc2V0ID49IHRoaXMuZ2FwT2Zmc2V0KSB7Ci0JCQkJCQkJCXByb3h5LnNldE9mZnNldChvZmZzZXQgKyB0aGlzLmRpZmYpOwotCQkJCQkJCX0KLQkJCQkJCQlwcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQkJCQkJaWYgKGVuZCA8IG9sZEVuZCAmJiAoZW5kIDwgdGhpcy5nYXBPZmZzZXQgfHwgb2xkRW5kID4gZ2FwRW5kKSkgeyAvLyBoYXMKLQkJCQkJCQkJLy8gc2hhcmVkCi0JCQkJCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9sZE9mZnNldCwgb2xkTGVuZ3RoKTsKLQkJCWlmIChvd25lckVuZFRhZyAhPSBudWxsKSB7Ci0JCQkJb3duZXJFbmRUYWcuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlvd25lck5vZGUuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlQXR0ciBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIG5ld0F0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gb2xkQXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXZvaWQgcmVwbGFjZUF0dHIoRWxlbWVudCBvd25lckVsZW1lbnQsIEF0dHIgbmV3QXR0ciwgQXR0ciBvbGRBdHRyKSB7Ci0JCWlmIChvd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgb3duZXJFbGVtZW50OwotCQlpZiAoIWVsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJY2hhbmdlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCWNoYW5nZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG9mZnNldCA9IGVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gb2Zmc2V0OwotCQlpbnQgZW5kID0gb2Zmc2V0OwotCi0JCWJvb2xlYW4gaW5zZXJ0U3BhY2UgPSBmYWxzZTsKLQkJU3RyaW5nIGF0dHJWYWx1ZUNsb3NlID0gbnVsbDsKLQkJaWYgKG9sZEF0dHIgIT0gbnVsbCkgewotCQkJQXR0ckltcGwgaW1wbCA9IChBdHRySW1wbCkgb2xkQXR0cjsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBpbXBsLmdldE5hbWVSZWdpb24oKTsKLQkJCWlmIChuYW1lUmVnaW9uID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBtdXN0IG5ldmVyIGhhcHBlbgotCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IGltcGwuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCWlmIChsYXN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQllbmQgKz0gbGFzdFJlZ2lvbi5nZXRFbmQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWxhc3RSZWdpb24gPSBpbXBsLmdldEVxdWFsUmVnaW9uKCk7Ci0JCQkJaWYgKGxhc3RSZWdpb24gIT0gbnVsbCkgewotCQkJCQllbmQgKz0gbGFzdFJlZ2lvbi5nZXRFbmQoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWVuZCArPSBuYW1lUmVnaW9uLmdldEVuZCgpOwotCQkJCQlsYXN0UmVnaW9uID0gbmFtZVJlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjaGVjayB0aGVyZSBhcmUgZXh0cmEgc3BhY2UgYmVmb3JlIHRoZSBsYXN0IGF0dHJpYnV0ZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gbXVzdCBuZXZlciBoYXBwZW4KLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIG11c3QgbmV2ZXIgaGFwcGVuCi0JCQlJVGV4dFJlZ2lvbiBwcmV2UmVnaW9uID0gbnVsbDsKLQkJCUlUZXh0UmVnaW9uIG5leHRSZWdpb24gPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJaWYgKHJlZ2lvbiA9PSBuYW1lUmVnaW9uKSB7Ci0JCQkJCWlmIChpID4gMCkgewotCQkJCQkJcHJldlJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkgLSAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocmVnaW9uID09IGxhc3RSZWdpb24pIHsKLQkJCQkJaWYgKGkgKyAxIDwgcmVnaW9ucy5zaXplKCkpIHsKLQkJCQkJCW5leHRSZWdpb24gPSByZWdpb25zLmdldChpICsgMSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJYm9vbGVhbiBpc0xhc3RBdHRyID0gZmFsc2U7Ci0JCQlpZiAobmV4dFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBuZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UgfHwgaXNOZXN0ZWRUYWdDbG9zZShyZWdpb25UeXBlKSkgewotCQkJCQlpc0xhc3RBdHRyID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXNMYXN0QXR0ciAmJiBwcmV2UmVnaW9uICE9IG51bGwpIHsKLQkJCQlzdGFydCArPSBwcmV2UmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0YXJ0ICs9IG5hbWVSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCX0KLQotCQkJLy8gaW1wbC5yZXNldFJlZ2lvbnMob3duZXJFbGVtZW50KTsKLQkJCWltcGwucmVzZXRSZWdpb25zKGVsZW1lbnQpOwotCQl9Ci0JCWVsc2UgeyAvLyBhcHBlbmQgYXR0cmlidXRlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBtdXN0IG5ldmVyIGhhcHBlbgotCi0JCQlhdHRyVmFsdWVDbG9zZSA9IGdldEF0dHJWYWx1ZUNsb3NlKGVsZW1lbnQpOwotCQkJaWYgKGF0dHJWYWx1ZUNsb3NlICE9IG51bGwgJiYgYXR0clZhbHVlQ2xvc2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaW5zZXJ0U3BhY2UgPSB0cnVlOwotCQkJCXN0YXJ0ID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJZW5kID0gc3RhcnQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJCQlyZXR1cm47IC8vIG11c3QgbmV2ZXIgaGFwcGVuCi0JCQkJaW50IGF0dHJTdGFydCA9IDA7Ci0JCQkJZm9yIChpbnQgaSA9IHJlZ2lvbnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFIHx8IGlzTmVzdGVkVGFnQ2xvc2UocmVnaW9uVHlwZSkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaW50IHJlZ2lvbkVuZCA9IHJlZ2lvbi5nZXRFbmQoKTsKLQkJCQkJaWYgKHJlZ2lvbkVuZCA9PSByZWdpb24uZ2V0VGV4dEVuZCgpKQotCQkJCQkJaW5zZXJ0U3BhY2UgPSB0cnVlOwotCQkJCQlhdHRyU3RhcnQgPSByZWdpb25FbmQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoYXR0clN0YXJ0ID09IDApCi0JCQkJCXJldHVybjsgLy8gbm90IGZvdW5kLCBtdXN0IG5ldmVyIGhhcHBlbgotCQkJCXN0YXJ0ICs9IGF0dHJTdGFydDsKLQkJCQllbmQgPSBzdGFydDsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSBudWxsOwotCQlpZiAobmV3QXR0ciAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IDI7Ci0JCQlpZiAoYXR0clZhbHVlQ2xvc2UgIT0gbnVsbCkKLQkJCQlzaXplICs9IGF0dHJWYWx1ZUNsb3NlLmxlbmd0aCgpOwotCQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUF0dHJOYW1lKG5ld0F0dHIpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCQlzaXplICs9IG5hbWUubGVuZ3RoKCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShuZXdBdHRyKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCXNpemUgKz0gdmFsdWUubGVuZ3RoKCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzaXplKTsKLQkJCWlmIChhdHRyVmFsdWVDbG9zZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQoYXR0clZhbHVlQ2xvc2UpOwotCQkJaWYgKGluc2VydFNwYWNlKQotCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZSk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoJz0nKTsKLQkJCQlidWZmZXIuYXBwZW5kKHZhbHVlKTsKLQkJCX0KLQkJCXNvdXJjZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJcmVwbGFjZVNvdXJjZShzb3VyY2UsIHN0YXJ0LCBlbmQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnQ2xvc2UoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIHJlcGxhY2VDaGlsZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5ld0NoaWxkID09IG51bGwgJiYgb2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW50IGVuZCA9IDA7Ci0JCVN0cmluZyBwcmVUYWcgPSBudWxsOwotCQlTdHJpbmcgcG9zdFRhZyA9IG51bGw7Ci0JCUVsZW1lbnRJbXBsIHBvc3RFbGVtZW50ID0gbnVsbDsKLQkJaWYgKG9sZENoaWxkICE9IG51bGwpIHsKLQkJCU5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpIG9sZENoaWxkOwotCQkJc3RhcnQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQllbmQgPSBub2RlLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKG9sZENoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQl9Ci0JCQlub2RlLnJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOyAvLyByZXNldCB2YWx1ZXMgZnJvbQotCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQl9Ci0JCWVsc2UgewotCQkJTm9kZUltcGwgcHJldiA9IChOb2RlSW1wbCkgbmV3Q2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlpZiAocHJldiAhPSBudWxsKSB7Ci0JCQkJc3RhcnQgPSBwcmV2LmdldEVuZE9mZnNldCgpOwotCQkJCWVuZCA9IHN0YXJ0OwotCQkJCXByZVRhZyA9IGdldENsb3NlVGFnKHByZXYpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gZmlyc3QgY2hpbGQKLQkJCQlOb2RlSW1wbCBuZXh0ID0gKE5vZGVJbXBsKSBuZXdDaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQkJc3RhcnQgPSBuZXh0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWVuZCA9IHN0YXJ0OwotCQkJCQlpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlwcmVUYWcgPSBnZXRTdGFydENsb3NlVGFnKChJRE9NRWxlbWVudCkgcGFyZW50Tm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5ld2x5IGhhdmluZyBhIGNoaWxkCi0JCQkJCWlmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudE5vZGU7Ci0JCQkJCQlpZiAoZWxlbWVudC5pc0VtcHR5VGFnKCkpIHsgLy8gZW1wdHkgdGFnIGZvcm1hdAotCQkJCQkJCS8vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIHRhZ3MKLQkJCQkJCQllbmQgPSBlbGVtZW50LmdldEVuZE9mZnNldCgpOwotCQkJCQkJCXN0YXJ0ID0gZW5kIC0gMjsgLy8gZm9yICIvPiIKLQkJCQkJCQllbGVtZW50LnNldEVtcHR5VGFnKGZhbHNlKTsKLQkJCQkJCQlwcmVUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUNsb3NlVGFnKGVsZW1lbnQpOwotCQkJCQkJCXBvc3RUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJCQkJCQlwb3N0RWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmICghZWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJCQkJc3RhcnQgPSBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJZW5kID0gc3RhcnQ7Ci0JCQkJCQkJLy8gaW52YWxpZCBlbmQgdGFnIG9yIGltcGxpY2l0IHRhZwotCQkJCQkJCS8vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHN0YXJ0IHRhZwotCQkJCQkJCXByZVRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQkJCQkJaWYgKHByZVRhZyAhPSBudWxsKSB7Ci0JCQkJCQkJCWludCBsZW5ndGggPSBwcmVUYWcubGVuZ3RoKCk7Ci0JCQkJCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KHN0YXJ0LCBsZW5ndGgpOwotCQkJCQkJCQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCFlbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCQkJCS8vIGltcGxpY2l0IHRhZwotCQkJCQkJCQkvLyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBlbmQgdGFncwotCQkJCQkJCQlwb3N0VGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCQkJCQkJCXBvc3RFbGVtZW50ID0gZWxlbWVudDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlzdGFydCA9IGVsZW1lbnQuZ2V0U3RhcnRFbmRPZmZzZXQoKTsKLQkJCQkJCQllbmQgPSBzdGFydDsKLQkJCQkJCQlwcmVUYWcgPSBnZXRTdGFydENsb3NlVGFnKGVsZW1lbnQpOwotCQkJCQkJCWlmIChwcmVUYWcgIT0gbnVsbCAmJiBwcmVUYWcubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCWlmICghZWxlbWVudC5oYXNFbmRUYWcoKSAmJiAoZWxlbWVudC5pc0pTUENvbnRhaW5lcigpIHx8IGVsZW1lbnQuaXNDREFUQUNvbnRhaW5lcigpKSkgewotCQkJCQkJCQkJLy8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgZW5kIHRhZwotCQkJCQkJCQkJcG9zdFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQkJCQkJCQkJcG9zdEVsZW1lbnQgPSBlbGVtZW50OwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIGVsc2UgbWlnaHQgRE9DVU1FTlRfTk9ERSwgc3RhcnQgYW5kIGVuZCBhcmUgMAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSBudWxsOwotCQlpZiAobmV3Q2hpbGQgIT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWludCBvZmZzZXQgPSBzdGFydDsKLQkJCWlmIChwcmVUYWcgIT0gbnVsbCkgewotCQkJCWludCBsZW5ndGggPSBwcmVUYWcubGVuZ3RoKCk7Ci0JCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQkJYnVmZmVyLmFwcGVuZChwcmVUYWcpOwotCQkJCX0KLQkJCX0KLQotCQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgbmV3Q2hpbGQ7Ci0JCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJCQlpZiAoZWxlbWVudC5wcmVmZXJFbXB0eVRhZygpKQotCQkJCQkJZWxlbWVudC5zZXRFbXB0eVRhZyh0cnVlKTsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCQkJCVN0cmluZyBzdGFydFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQkJCWlmIChzdGFydFRhZyAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgbGVuZ3RoID0gc3RhcnRUYWcubGVuZ3RoKCk7Ci0JCQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoc3RhcnRUYWcpOwotCQkJCQkJCWZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJCQlvZmZzZXQgKz0gbGVuZ3RoOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJU3RyaW5nIGNvbnRlbnQgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZVNvdXJjZShub2RlKTsKLQkJCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJCWNvbnRlbnQgPSBOb2RlSW1wbC5FTVBUWV9TVFJJTkc7Ci0JCQkJCWludCBsZW5ndGggPSBjb250ZW50Lmxlbmd0aCgpOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQkJCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoY29udGVudCk7Ci0JCQkJCQlmbGF0Tm9kZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQlvZmZzZXQgKz0gbGVuZ3RoOwotCQkJCQl9Ci0JCQkJCW5vZGUuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0KLQkJCQlOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJbm9kZSA9IGNoaWxkOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQkJCQlTdHJpbmcgZW5kVGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCQkJCWlmIChlbmRUYWcgIT0gbnVsbCkgewotCQkJCQkJaW50IGxlbmd0aCA9IGVuZFRhZy5sZW5ndGgoKTsKLQkJCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChlbmRUYWcpOwotCQkJCQkJCWZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJCQlvZmZzZXQgKz0gbGVuZ3RoOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0KLQkJCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChub2RlID09IG5ld0NoaWxkKSB7Ci0JCQkJCQlub2RlID0gbnVsbDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCU5vZGVJbXBsIG5leHQgPSAoTm9kZUltcGwpIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCQkJbm9kZSA9IG5leHQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCQkJCW5vZGUgPSAoTm9kZUltcGwpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJY29udGludWU7Ci0JCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQkJCQlTdHJpbmcgZW5kVGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCQkJCWlmIChlbmRUYWcgIT0gbnVsbCkgewotCQkJCQkJaW50IGxlbmd0aCA9IGVuZFRhZy5sZW5ndGgoKTsKLQkJCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChlbmRUYWcpOwotCQkJCQkJCWZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJCQlvZmZzZXQgKz0gbGVuZ3RoOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChwb3N0VGFnICE9IG51bGwpIHsKLQkJCQlpbnQgbGVuZ3RoID0gcG9zdFRhZy5sZW5ndGgoKTsKLQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQlidWZmZXIuYXBwZW5kKHBvc3RUYWcpOwotCQkJCQlpZiAocG9zdEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQlwb3N0RWxlbWVudC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc291cmNlID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlpZiAoc3RhcnQgPT0gZW5kICYmIChzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIG5vIHRoaW5nIGNoYW5nZWQKLQkJCXJldHVybjsKLQkJfQotCi0JCXJlcGxhY2VTb3VyY2Uoc291cmNlLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQl2b2lkIHJlcGxhY2VSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucykgewotCQkvLyBmdXR1cmVfVE9ETzogb3B0aW1pemUKLQotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCk7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IHJvb3Q7Ci0JCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHJvb3QuZ2V0Rmlyc3RDaGlsZCgpOwotCi0JCXJlbW92ZUdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZShmbGF0Tm9kZS5nZXRTdGFydCgpKTsKLQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQWZ0ZXIoZmxhdE5vZGUuZ2V0RW5kKCkpOwotCX0KLQotCS8qKgotCSAqIFdyYXBzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ucmVwbGFjZVRleHQoKSBhbmQgc2V0cyBjb250ZXh0dWFsCi0JICogaW5mb3JtYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlcGxhY2VTb3VyY2UoU3RyaW5nIHNvdXJjZSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWludCBpbnNlcnRlZCA9IDA7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IE5vZGVJbXBsLkVNUFRZX1NUUklORzsKLQkJZWxzZQotCQkJaW5zZXJ0ZWQgPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWludCByZW1vdmVkID0gZW5kIC0gc3RhcnQ7Ci0JCWlmIChpbnNlcnRlZCA9PSAwICYmIHJlbW92ZWQgPT0gMCkKLQkJCXJldHVybjsKLQotCQl0aGlzLmdhcE9mZnNldCA9IHN0YXJ0OwotCQl0aGlzLmdhcExlbmd0aCA9IHJlbW92ZWQ7Ci0JCXRoaXMuZGlmZiA9IGluc2VydGVkIC0gcmVtb3ZlZDsKLQkJLy8gTm90ZTogZHVlIHRvIGJ1ZwotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzYxOQotCQkvLyBmb3Igbm93IGFzc3VtZSAiaWdub3JlIHJlYWRvbmx5IiByZWdpb24gaXMgb2sgLS0gYXNzdW1lIERPTSBpdHNlbGYKLQkJLy8gY2hlY2tzIGlmCi0JCS8vIG9rIHRvIGluc2VydCBvciBub3QuIEluIHJlYWxpdHksIHdlIG1heSBoYXZlIHRvIG1ha2Ugb3IgImNvbnRhaW5zIgotCQkvLyBtZXRob2QgbW9yZQotCQkvLyBiZXR0ZXIuIE9yLCB3ZSBtYXkgaGF2ZSB0byAicGVyY3VsYXRlIHVwIiB0aGUgcGFyYW1ldGVyIGZvciBjbGllbnRzCi0JCS8vIHRvIHRlbGwgdXMgcHJvZ3JhbWF0aWNhbGx5Ci0JCS8vIHRoYXQgaXRzIG9rIHRvIGluc2VydC9mb3JtYXQgaW4gYSByZWFkLW9ubHkgcmVnaW9uLgotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLm1vZGVsLCB0aGlzLmdhcE9mZnNldCwgdGhpcy5nYXBMZW5ndGgsIHNvdXJjZSwgdHJ1ZSk7Ci0JfQotCi0Jdm9pZCByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSByb290OwotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0KLQkJCUVudW1lcmF0aW9uIGUgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmVsZW1lbnRzKCk7Ci0JCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCXJlbW92ZUdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSByb290OwotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCQlFbnVtZXJhdGlvbiBlID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5lbGVtZW50cygpOwotCQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQmVmb3JlKGZsYXROb2RlLmdldFN0YXJ0KCkpOwotCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGZsYXROb2RlOwotCQkJfQotCQkJaWYgKGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkFmdGVyKGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQmVmb3JlKHRoaXMuZ2FwT2Zmc2V0KTsKLQkJCQkvLyBtYWtlIHN1cmUgdG8gcmVzdG9yZSBhbGwgYmFja3VwZWQgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkFmdGVyKHRoaXMuZ2FwT2Zmc2V0KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMucGFyZW50Tm9kZSA9IHJvb3Q7Ci0JCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSByb290LmdldEZpcnN0Q2hpbGQoKTsKLQotCQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQmVmb3JlKHRoaXMuZ2FwT2Zmc2V0KTsKLQkJCS8vIG1ha2Ugc3VyZSB0byByZXN0b3JlIGFsbCBiYWNrdXBlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JCQlpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25BZnRlcih0aGlzLmdhcE9mZnNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlQXR0clJlZ2lvbnMoRWxlbWVudCBlbGVtZW50LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0KLQkJLy8gdXBkYXRlIGF0dHJpYnV0ZXMKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpbmRleCA9IC0xOwotCQlBdHRySW1wbCBhdHRyID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKCsraW5kZXgpOwotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXROYW1lUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCS8vIHJlc2V0IG90aGVyIHJlZ2lvbnMKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihudWxsKTsKLQkJCQkJYXR0ci5zZXRWYWx1ZVJlZ2lvbihudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihyZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldFZhbHVlUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWF0dHIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3ZjY0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL1hNTERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYW5kIHBhcnNlcyBmaXJzdCBvZiBYTUwgZmlsZSB0byBnZXQgZW5jb2RpbmcuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxEb2N1bWVudENoYXJzZXREZXRlY3RvciBleHRlbmRzIFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElEb2N1bWVudENoYXJzZXREZXRlY3RvciB7Ci0KLQkvKioKLQkgKiBYTUxMb2FkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlzZXQobmV3IERvY3VtZW50UmVhZGVyKGRvY3VtZW50LCAwKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9YTUxEb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9YTUxEb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzE2YjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvWE1MRG9jdW1lbnRMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYW4gWE1MIGZpbGUgYW5kIGNyZWF0ZXMgYW4gWE1MIFN0cnVjdHVyZWQgTW9kZWwuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTERvY3VtZW50TG9hZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudExvYWRlciB7Ci0KLQlwdWJsaWMgWE1MRG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJaWYgKGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9IG5ldyBYTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlyZXR1cm4gbmV3IFhNTFNvdXJjZVBhcnNlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihJRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBkZWxpbWl0ZXIgPSBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKTsKLQkJaWYgKGRlbGltaXRlciA9PSBudWxsKQotCQkJZGVsaW1pdGVyID0gc3VwZXIuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihmaWxlKTsKLQkJcmV0dXJuIGRlbGltaXRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIFVURi04IGFzIHBlciBYTUwgc3BlYwotCQlmaW5hbCBTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCXByb3RlY3RlZCBJRW5jb2RlZERvY3VtZW50IG5ld0VuY29kZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKGdldFBhcnNlcigpKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCBpbnN0YW5jZW9mIEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnNldFJlUGFyc2VyKG5ldyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpKTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgWE1MRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlZmF1bHRYTUxQYXJ0aXRpb25Gb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlZmF1bHRYTUxQYXJ0aXRpb25Gb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhlY2E4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9EZWZhdWx0WE1MUGFydGl0aW9uRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTcwMDYgLSBTdHJpbmcgQ29tcGFyaXNvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuRGVsZXRlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFhNTFBhcnRpdGlvbkZvcm1hdHRlciB7Ci0JLyoqCi0JICogSnVzdCBhIHNtYWxsIGNvbnRhaW5lciBjbGFzcyB0aGF0IGhvbGRzIGEgRE9NTm9kZSAmIGRvY3VtZW50UmVnaW9uIHRoYXQKLQkgKiBzaG91bGQgcmVwcmVzZW50IGVhY2ggb3RoZXIuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIERPTVJlZ2lvbiB7Ci0JCXB1YmxpYyBJRE9NTm9kZSBkb21Ob2RlOwotCQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUFJFU0VSVkUgPSAicHJlc2VydmUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ09MTEFQU0UgPSAiY29sbGFwc2UiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUkVQTEFDRSA9ICJyZXBsYWNlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFBSRVNFUlZFX1FVT1RFRCA9ICJcInByZXNlcnZlXCIiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWE1MX1NQQUNFID0gInhtbDpzcGFjZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBYU0xfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWFNMX0FUVFJJQlVURSA9ICJhdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFhTTF9URVhUID0gInRleHQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFNQQUNFID0gIiAiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIEVNUFRZID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfV0hJVEVTUEFDRV9GQUNFVCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLmNtLnByb3BlcnRpZXMvd2hpdGVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzIGZQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3I7Ci0KLQlwcml2YXRlIGludCByZXBsYWNlU3BhY2VzKFRleHRFZGl0IHRleHRFZGl0LCBpbnQgc3BhY2VTdGFydE9mZnNldCwgaW50IGF2YWlsYWJsZUxpbmVXaWR0aCwgU3RyaW5nIHdoaXRlc3BhY2VSdW4pIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKHdoaXRlc3BhY2VSdW4pOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgYnVmZi5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlidWZmLnNldENoYXJBdChpLCAnICcpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nID0gYnVmZi50b1N0cmluZygpOwotCQlpZiAoIXJlcGxhY2VtZW50U3RyaW5nLmVxdWFscyh3aGl0ZXNwYWNlUnVuKSkgewotCQkJUmVwbGFjZUVkaXQgcmVwbGFjZUVkaXQgPSBuZXcgUmVwbGFjZUVkaXQoc3BhY2VTdGFydE9mZnNldCwgd2hpdGVzcGFjZVJ1bi5sZW5ndGgoKSwgcmVwbGFjZW1lbnRTdHJpbmcpOwotCQkJdGV4dEVkaXQuYWRkQ2hpbGQocmVwbGFjZUVkaXQpOwotCQl9Ci0JCXJldHVybiBhdmFpbGFibGVMaW5lV2lkdGg7Ci0JfQotCQotCXByaXZhdGUgaW50IGNvbGxhcHNlU3BhY2VzKFRleHRFZGl0IHRleHRFZGl0LCBpbnQgc3BhY2VTdGFydE9mZnNldCwgaW50IGF2YWlsYWJsZUxpbmVXaWR0aCwgU3RyaW5nIHdoaXRlc3BhY2VSdW4pIHsKLQkJLy8gcHJlZmVyIHRvIHVzZSB1c2UgZXhpc3Rpbmcgd2hpdGVzcGFjZQotCQlpbnQgZXhpc3RpbmdXaGl0ZXNwYWNlT2Zmc2V0ID0gd2hpdGVzcGFjZVJ1bi5pbmRleE9mKCcgJyk7Ci0JCWlmIChleGlzdGluZ1doaXRlc3BhY2VPZmZzZXQgPiAtMSkgewotCQkJLy8gZGVsZXRlIHdoaXRlc3BhY2VzIGJlZm9yZSBhbmQgYWZ0ZXIgZXhpc3Rpbmcgd2hpdGVzcGFjZQotCQkJaWYgKGV4aXN0aW5nV2hpdGVzcGFjZU9mZnNldCA+IDApIHsKLQkJCQlEZWxldGVFZGl0IGRlbGV0ZUVkaXQgPSBuZXcgRGVsZXRlRWRpdChzcGFjZVN0YXJ0T2Zmc2V0LCBleGlzdGluZ1doaXRlc3BhY2VPZmZzZXQpOwotCQkJCXRleHRFZGl0LmFkZENoaWxkKGRlbGV0ZUVkaXQpOwotCQkJfQotCQkJaWYgKGV4aXN0aW5nV2hpdGVzcGFjZU9mZnNldCA8IHdoaXRlc3BhY2VSdW4ubGVuZ3RoKCkgLSAxKSB7Ci0JCQkJaW50IG5leHRPZmZzZXQgPSBleGlzdGluZ1doaXRlc3BhY2VPZmZzZXQgKyAxOwotCQkJCURlbGV0ZUVkaXQgZGVsZXRlRWRpdCA9IG5ldyBEZWxldGVFZGl0KHNwYWNlU3RhcnRPZmZzZXQgKyBuZXh0T2Zmc2V0LCB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpIC0gbmV4dE9mZnNldCk7Ci0JCQkJdGV4dEVkaXQuYWRkQ2hpbGQoZGVsZXRlRWRpdCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBkZWxldGUgYWxsIHdoaXRlc3BhY2UgYW5kIGluc2VydCBuZXcgb25lCi0JCQkvLyBjb2xsYXBzZSB3aGl0ZXNwYWNlIGJ5IGRlbGV0aW5nIHdoaXRlc3BhY2UKLQkJCURlbGV0ZUVkaXQgZGVsZXRlRWRpdCA9IG5ldyBEZWxldGVFZGl0KHNwYWNlU3RhcnRPZmZzZXQsIHdoaXRlc3BhY2VSdW4ubGVuZ3RoKCkpOwotCQkJdGV4dEVkaXQuYWRkQ2hpbGQoZGVsZXRlRWRpdCk7Ci0JCQkvLyB0aGVuIGluc2VydCBvbmUgc3BhY2UKLQkJCUluc2VydEVkaXQgaW5zZXJ0RWRpdCA9IG5ldyBJbnNlcnRFZGl0KHNwYWNlU3RhcnRPZmZzZXQsIFNQQUNFKTsKLQkJCXRleHRFZGl0LmFkZENoaWxkKGluc2VydEVkaXQpOwotCQl9Ci0JCS8vIHJlbWVtYmVyIHRvIGFjY291bnQgZm9yIHNwYWNlIGFkZGVkCi0JCS0tYXZhaWxhYmxlTGluZVdpZHRoOwotCQlyZXR1cm4gYXZhaWxhYmxlTGluZVdpZHRoOwotCX0KLQkKLQlwcml2YXRlIGludCBjb2xsYXBzZUFuZEluZGVudChUZXh0RWRpdCB0ZXh0RWRpdCwgaW50IHNwYWNlU3RhcnRPZmZzZXQsIGludCBhdmFpbGFibGVMaW5lV2lkdGgsIGludCBpbmRlbnRMZXZlbCwgU3RyaW5nIHdoaXRlc3BhY2VSdW4sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudFJlZ2lvbikgewotCQkvLyBOZWVkIHRvIGtlZXAgYmxhbmsgbGluZXMsIGJ1dCBzdGlsbCBjb2xsYXBzZSB0aGUgd2hpdGVzcGFjZQotCQlTdHJpbmcgbGluZURlbGltaXRlcnMgPSBudWxsOwotCQlpZiAoIWdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldENsZWFyQWxsQmxhbmtMaW5lcygpKSB7Ci0JCQlsaW5lRGVsaW1pdGVycyA9IGV4dHJhY3RMaW5lRGVsaW1pdGVycyh3aGl0ZXNwYWNlUnVuLCBjdXJyZW50UmVnaW9uKTsKLQkJCVN0cmluZyBmb3JtYXR0ZWRMaW5lID0gbGluZURlbGltaXRlcnMgKyBnZXRJbmRlbnRTdHJpbmcoaW5kZW50TGV2ZWwpOwotCQkJaWYobGluZURlbGltaXRlcnMubGVuZ3RoKCkgPiAwICYmICFmb3JtYXR0ZWRMaW5lLmVxdWFscyh3aGl0ZXNwYWNlUnVuKSkgewotCQkJCXRleHRFZGl0LmFkZENoaWxkKG5ldyBSZXBsYWNlRWRpdChzcGFjZVN0YXJ0T2Zmc2V0LCB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpLCBmb3JtYXR0ZWRMaW5lKSk7Ci0JCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gZ2V0Rm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkuZ2V0TWF4TGluZVdpZHRoKCkgLSBpbmRlbnRMZXZlbDsKLQkJCX0KLQkJfQotCQlpZiAobGluZURlbGltaXRlcnMgPT0gbnVsbCB8fCBsaW5lRGVsaW1pdGVycy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlhdmFpbGFibGVMaW5lV2lkdGggPSBjb2xsYXBzZVNwYWNlcyh0ZXh0RWRpdCwgc3BhY2VTdGFydE9mZnNldCwgYXZhaWxhYmxlTGluZVdpZHRoLCB3aGl0ZXNwYWNlUnVuKTsKLQkJfQotCQlyZXR1cm4gYXZhaWxhYmxlTGluZVdpZHRoOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWxldGVUcmFpbGluZ1NwYWNlcyhUZXh0RWRpdCB0ZXh0RWRpdCwgSVRleHRSZWdpb24gY3VycmVudFRleHRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudERvY3VtZW50UmVnaW9uKSB7Ci0JCWludCB0ZXh0RW5kID0gY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQlpbnQgdGV4dEVuZE9mZnNldCA9IGN1cnJlbnREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgdGV4dEVuZDsKLQkJaW50IGRpZmZlcmVuY2UgPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRFbmQoKSAtIHRleHRFbmQ7Ci0JCURlbGV0ZUVkaXQgZGVsZXRlRWRpdCA9IG5ldyBEZWxldGVFZGl0KHRleHRFbmRPZmZzZXQsIGRpZmZlcmVuY2UpOwotCQl0ZXh0RWRpdC5hZGRDaGlsZChkZWxldGVFZGl0KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dEVkaXQgZm9ybWF0KElEb2N1bWVudCBkb2N1bWVudCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBmb3JtYXQoZG9jdW1lbnQsIHN0YXJ0LCBsZW5ndGgsIG5ldyBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKSk7Ci0JfQotCi0JcHVibGljIFRleHRFZGl0IGZvcm1hdChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCwgWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzIHByZWZlcmVuY2VzKSB7Ci0JCVRleHRFZGl0IGVkaXQgPSBudWxsOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZWRpdCA9IGZvcm1hdChtb2RlbCwgc3RhcnQsIGxlbmd0aCwgcHJlZmVyZW5jZXMpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0OwotCX0KLQotCXB1YmxpYyBUZXh0RWRpdCBmb3JtYXQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBmb3JtYXQobW9kZWwsIHN0YXJ0LCBsZW5ndGgsIG5ldyBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKSk7Ci0JfQotCi0JcHVibGljIFRleHRFZGl0IGZvcm1hdChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgsIFhNTEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcykgewotCQlzZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMocHJlZmVyZW5jZXMpOwotCi0JCVRleHRFZGl0IGVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCS8vIGdldCBpbml0aWFsIGRvY3VtZW50IHJlZ2lvbgotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBkb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCWlmIChjdXJyZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCWludCBzdGFydE9mZnNldCA9IGN1cnJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJLy8gZ2V0IGluaXRpYWwgZG9tIG5vZGUKLQkJCUluZGV4ZWRSZWdpb24gY3VycmVudEluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0T2Zmc2V0KTsKLQkJCWlmIChjdXJyZW50SW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJLy8gc2V0IHVwIGRvbVJlZ2lvbiB3aGljaCB3aWxsIGNvbnRhaW4gY3VycmVudCByZWdpb24gdG8gYmUKLQkJCQkvLyBmb3JtYXR0ZWQKLQkJCQlJRE9NTm9kZSBjdXJyZW50RE9NTm9kZSA9IChJRE9NTm9kZSkgY3VycmVudEluZGV4ZWRSZWdpb247Ci0JCQkJRE9NUmVnaW9uIGRvbVJlZ2lvbiA9IG5ldyBET01SZWdpb24oKTsKLQkJCQlkb21SZWdpb24uZG9jdW1lbnRSZWdpb24gPSBjdXJyZW50UmVnaW9uOwotCQkJCWRvbVJlZ2lvbi5kb21Ob2RlID0gY3VycmVudERPTU5vZGU7Ci0JCQkJCi0JCQkJWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHBhcmVudENvbnN0cmFpbnRzID0gZ2V0UmVnaW9uQ29uc3RyYWludHMoY3VycmVudERPTU5vZGUpOwotCQkJCQotCQkJCS8qIGlmIHRoZSB3aGl0ZXNwYWNlIHN0cmF0ZWd5IGlzIGRlY2xhcmVkIGFzIGRlZmF1bHQsIGdldCBpdCBmcm9tIHRoZSBwcmVmZXJlbmNlcyAqLwotCQkJCWlmKFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ERUZBVUxULmVxdWFscyhwYXJlbnRDb25zdHJhaW50cy5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKSkpCi0JCQkJCXBhcmVudENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShwcmVmZXJlbmNlcy5nZXRFbGVtZW50V2hpdGVzcGFjZVN0cmF0ZWd5KCkpOwotCQkJCQotCQkJCS8vIFRPRE86IGluaXRpYWxpemUgaW5kZW50TGV2ZWwKLQkJCQkvLyBpbml0aWFsaXplIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQkJaW50IGxpbmVXaWR0aCA9IGdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldE1heExpbmVXaWR0aCgpOwotCQkJCXRyeSB7Ci0JCQkJCUlSZWdpb24gbGluZUluZm8gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChzdGFydE9mZnNldCk7Ci0JCQkJCWxpbmVXaWR0aCA9IGxpbmVXaWR0aCAtIChzdGFydE9mZnNldCAtIGxpbmVJbmZvLmdldE9mZnNldCgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0KLQkJCQlwYXJlbnRDb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgobGluZVdpZHRoKTsKLQotCQkJCS8vIGZvcm1hdCBhbGwgc2libGluZ3MgKGFuZCB0aGVpciBjaGlsZHJlbikgYXMgbG9uZyB0aGV5Ci0JCQkJLy8gb3ZlcmxhcCB3aXRoIHN0YXJ0L2xlbmd0aAotCQkJCVBvc2l0aW9uIGZvcm1hdFJhbmdlID0gbmV3IFBvc2l0aW9uKHN0YXJ0LCBsZW5ndGgpOwotCQkJCWZvcm1hdFNpYmxpbmdzKGVkaXQsIGRvbVJlZ2lvbiwgcGFyZW50Q29uc3RyYWludHMsIGZvcm1hdFJhbmdlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdDsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHRoZSBmb3JtYXR0aW5nIGNvbnN0cmFpbnRzIGZvciBhIHNwZWNpZmllZCBub2RlIGJhc2VkIG9uCi0JICogaXRzIGFuY2VzdG9ycycgZm9ybWF0dGluZy4gSW4gcGFydGljdWxhciwgaWYgYW55IGFuY2VzdG9yIG5vZGUgZWl0aGVyCi0JICogZXhwbGljaXRseSBkZWZpbmVzIHdoaXRlc3BhY2UgcHJlc2VydmF0aW9uIG9yIGlnbm9yYW5jZSwgdGhhdAotCSAqIHdoaXRlc3BhY2Ugc3RyYXRlZ3kgc2hvdWxkIGJlIHVzZWQgZm9yIDxjb2RlPmN1cnJlbnROb2RlPC9jb2RlPiBhbmQgCi0JICogYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gY3VycmVudE5vZGUgdGhlIG5vZGUgdG8gaW52ZXN0aWdhdGUgdGhlIGFuY2VzdHJ5IG9mIHRvIGRldGVybWluZQotCSAqIGZvcm1hdHRpbmcgY29uc3RyYWludHMKLQkgKiAKLQkgKiBAcmV0dXJuIGZvcm1hdHRpbmcgY29uc3RyYWludHMgZGVmaW5lZCBieSBhbiBhbmNlc3RvcgotCSAqLwotCXByaXZhdGUgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIGdldFJlZ2lvbkNvbnN0cmFpbnRzKElET01Ob2RlIGN1cnJlbnROb2RlKSB7Ci0JCUlET01Ob2RlIGl0ZXJhdG9yID0gY3VycmVudE5vZGU7Ci0JCVhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyByZXN1bHQgPSBuZXcgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzKCk7Ci0JCURPTVJlZ2lvbiByZWdpb24gPSBuZXcgRE9NUmVnaW9uKCk7Ci0JCVhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBwYXJlbnRDb25zdHJhaW50cyA9IG5ldyBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMoKTsKLQkJYm9vbGVhbiBwYXJlbnQgPSB0cnVlOwotCQkKLQkJLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBhbmNlc3RyeSB0byBmaW5kIGlmIGFueSBleHBsaWNpdCB3aGl0ZXNwYWNlIHN0cmF0ZWd5IGhhcwotCQkgKiBiZWVuIGRlZmluZWQKLQkJICovCi0JCXdoaWxlKGl0ZXJhdG9yICE9IG51bGwgJiYgaXRlcmF0b3IuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCWl0ZXJhdG9yID0gKElET01Ob2RlKSBpdGVyYXRvci5nZXRQYXJlbnROb2RlKCk7Ci0JCQlyZWdpb24uZG9tTm9kZSA9IGl0ZXJhdG9yOwotCQkJcmVnaW9uLmRvY3VtZW50UmVnaW9uID0gaXRlcmF0b3IuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQotCQkJdXBkYXRlRm9ybWF0dGluZ0NvbnN0cmFpbnRzKG51bGwsIG51bGwsIHJlc3VsdCwgcmVnaW9uKTsKLQkJCQotCQkJLyogSWYgdGhpcyBpcyB0aGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUsIGtlZXAgdGhlIGNvbnN0cmFpbnRzCi0JCQkgKiBpbiBjYXNlIG5vIG90aGVyIGNvbnN0cmFpbnRzIGFyZSBpZGVudGlmaWVkCi0JCQkgKi8KLQkJCWlmKHBhcmVudCkgewotCQkJCXBhcmVudENvbnN0cmFpbnRzLmNvcHlDb25zdHJhaW50cyhyZXN1bHQpOwotCQkJCXBhcmVudCA9IGZhbHNlOwotCQkJfQotCQkJCi0JCQkvKiBBIHBhcmVudCB3aG8gaGFzIGRlZmluZWQgYSBzcGVjaWZpYyB3aGl0ZXNwYWNlIHN0cmF0ZWd5IHdhcyBmb3VuZCAqLwotCQkJaWYoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFLmVxdWFscyhyZXN1bHQuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkpIHx8IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ERUZBVUxULmVxdWFscyhyZXN1bHQuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkpKQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJldHVybiBwYXJlbnRDb25zdHJhaW50czsKLQl9Ci0vLwlwcml2YXRlIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBnZXRSZWdpb25Db25zdHJhaW50cyhJRE9NTm9kZSBjdXJyZW50Tm9kZSkgewotLy8JCUlET01Ob2RlIGl0ZXJhdG9yID0gKElET01Ob2RlKSBjdXJyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0vLwkJWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHJlc3VsdCA9IG5ldyBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMoKTsKLS8vCQlET01SZWdpb24gcmVnaW9uID0gbmV3IERPTVJlZ2lvbigpOwotLy8JCQotLy8JCS8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYW5jZXN0cnkgdG8gZmluZCBpZiBhbnkgZXhwbGljaXQgd2hpdGVzcGFjZSBzdHJhdGVneSBoYXMKLS8vCQkgKiBiZWVuIGRlZmluZWQKLS8vCQkgKi8KLS8vCQl3aGlsZShpdGVyYXRvciAhPSBudWxsICYmIGl0ZXJhdG9yLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0KLS8vCQkJcmVnaW9uLmRvbU5vZGUgPSBpdGVyYXRvcjsKLS8vCQkJcmVnaW9uLmRvY3VtZW50UmVnaW9uID0gaXRlcmF0b3IuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLS8vCQkJCi0vLwkJCXVwZGF0ZUZvcm1hdHRpbmdDb25zdHJhaW50cyhudWxsLCBudWxsLCByZXN1bHQsIHJlZ2lvbik7Ci0vLwkJCQotLy8JCQkvKiBBIHBhcmVudCB3aG8gaGFzIGRlZmluZWQgYSBzcGVjaWZpYyB3aGl0ZXNwYWNlIHN0cmF0ZWd5IHdhcyBmb3VuZCAqLwotLy8JCQlpZihYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUgPT0gcmVzdWx0LmdldFdoaXRlc3BhY2VTdHJhdGVneSgpIHx8IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ERUZBVUxUID09IHJlc3VsdC5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKSkKLS8vCQkJCXJldHVybiByZXN1bHQ7Ci0vLwkJCQotLy8JCQlpdGVyYXRvciA9IChJRE9NTm9kZSkgaXRlcmF0b3IuZ2V0UGFyZW50Tm9kZSgpOwotLy8JCX0KLS8vCQkKLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLQkKLQkvKioKLQkgKiBGb3JtYXRzIHRoZSBnaXZlbiB4bWwgY29udGVudCByZWdpb24KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dEVkaXQKLQkgKiBAcGFyYW0gZm9ybWF0UmFuZ2UKLQkgKiBAcGFyYW0gcGFyZW50Q29uc3RyYWludHMKLQkgKiBAcGFyYW0gY3VycmVudERPTVJlZ2lvbgotCSAqIEBwYXJhbSBwcmV2aW91c1JlZ2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRDb250ZW50KFRleHRFZGl0IHRleHRFZGl0LCBQb3NpdGlvbiBmb3JtYXRSYW5nZSwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHBhcmVudENvbnN0cmFpbnRzLCBET01SZWdpb24gY3VycmVudERPTVJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c1JlZ2lvbikgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBjdXJyZW50RE9NUmVnaW9uLmRvY3VtZW50UmVnaW9uOwotCQlTdHJpbmcgZnVsbFRleHQgPSBjdXJyZW50RE9NUmVnaW9uLmRvbU5vZGUuZ2V0U291cmNlKCk7Ci0KLQkJLy8gY2hlY2sgaWYgaW4gcHJlc2VydmUgc3BhY2UgbW9kZSwgaWYgc28sIGRvbid0IHRvdWNoIGFueXRoaW5nIGJ1dAotCQkvLyBtYWtlIHN1cmUgdG8gdXBkYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCVN0cmluZyB3aGl0ZXNwYWNlTW9kZSA9IHBhcmVudENvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpOwotCQlpZiAoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFLmVxdWFscyh3aGl0ZXNwYWNlTW9kZSkpIHsKLQkJCWludCBhdmFpbGFibGVMaW5lV2lkdGggPSBwYXJlbnRDb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKTsKLQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IHVwZGF0ZUxpbmVXaWR0aFdpdGhMYXN0TGluZShmdWxsVGV4dCwgYXZhaWxhYmxlTGluZVdpZHRoKTsKLQotCQkJLy8gdXBkYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIGluIGNvbnN0cmFpbnRzCi0JCQlwYXJlbnRDb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlTGluZVdpZHRoKTsKLQkJCS8vIEEgdGV4dCBub2RlIGNhbiBjb250YWluIG11bHRpcGxlIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9ucyAtIHN5bmMgdGhlIGRvY3VtZW50UmVnaW9uCi0JCQkvLyB3aXRoIHRoZSBsYXN0IHJlZ2lvbiBvZiB0aGUgbm9kZSBzaW5jZSB0aGUgdGV4dCBmcm9tIGFsbCByZWdpb25zIHdhcyBmb3JtYXR0ZWQKLQkJCWN1cnJlbnRET01SZWdpb24uZG9jdW1lbnRSZWdpb24gPSBjdXJyZW50RE9NUmVnaW9uLmRvbU5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gaWYgY29udGVudCBpcyBqdXN0IHdoaXRlc3BhY2UgYW5kIHRoZXJlJ3Mgc29tZXRoaW5nIGFmdGVyIGl0Ci0JCS8vIGp1c3Qgc2tpcCBvdmVyIHRoaXMgcmVnaW9uIGJlY2F1c2UgcmVnaW9uIHdpbGwgdGFrZSBjYXJlIG9mIGl0Ci0JCWJvb2xlYW4gaXNBbGxXaGl0ZXNwYWNlID0gKChJRE9NVGV4dCkgY3VycmVudERPTVJlZ2lvbi5kb21Ob2RlKS5pc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCWlmIChpc0FsbFdoaXRlc3BhY2UpIHsKLQkJCXBhcmVudENvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChmUHJlZmVyZW5jZXMuZ2V0TWF4TGluZVdpZHRoKCkpOwotCQkJbmV4dERvY3VtZW50UmVnaW9uID0gY3VycmVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCQlpZiAobmV4dERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gc3BlY2lhbCBoYW5kbGluZyBpZiB0ZXh0IGZvbGxvd3MgYW4gZW50aXR5IG9yIGNkYXRhIHJlZ2lvbgotCQlpZiAoIVhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5DT0xMQVBTRS5lcXVhbHMod2hpdGVzcGFjZU1vZGUpICYmIHByZXZpb3VzUmVnaW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmV2aW91UmVnaW9uVHlwZSA9IHByZXZpb3VzUmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFLmVxdWFscyhwcmV2aW91UmVnaW9uVHlwZSkgfHwgRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVC5lcXVhbHMocHJldmlvdVJlZ2lvblR5cGUpKQotCQkJCXdoaXRlc3BhY2VNb2RlID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLkNPTExBUFNFOwotCQl9Ci0JCS8vIGFsc28sIHNwZWNpYWwgaGFuZGxpbmcgaWYgdGV4dCBpcyBiZWZvcmUgYW4gZW50aXR5IG9yIGNkYXRhIHJlZ2lvbgotCQlpZiAoIVhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5DT0xMQVBTRS5lcXVhbHMod2hpdGVzcGFjZU1vZGUpKSB7Ci0JCQkvLyBnZXQgbmV4dCBkb2N1bWVudCByZWdpb24gaWYgZG9udCBhbHJlYWR5IGhhdmUgaXQKLQkJCWlmIChuZXh0RG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCQluZXh0RG9jdW1lbnRSZWdpb24gPSBjdXJyZW50UmVnaW9uLmdldE5leHQoKTsKLQkJCWlmIChuZXh0RG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCVN0cmluZyBuZXh0UmVnaW9uVHlwZSA9IG5leHREb2N1bWVudFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UuZXF1YWxzKG5leHRSZWdpb25UeXBlKSB8fCBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhULmVxdWFscyhuZXh0UmVnaW9uVHlwZSkpCi0JCQkJCXdoaXRlc3BhY2VNb2RlID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLkNPTExBUFNFOwotCQkJfQotCQl9Ci0JCWZvcm1hdFRleHRJbkNvbnRlbnQodGV4dEVkaXQsIHBhcmVudENvbnN0cmFpbnRzLCBjdXJyZW50UmVnaW9uLCBmdWxsVGV4dCwgd2hpdGVzcGFjZU1vZGUpOwotCQkvLyBBIHRleHQgbm9kZSBjYW4gY29udGFpbiBtdWx0aXBsZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbnMgLSBzeW5jIHRoZSBkb2N1bWVudFJlZ2lvbgotCQkvLyB3aXRoIHRoZSBsYXN0IHJlZ2lvbiBvZiB0aGUgbm9kZSBzaW5jZSB0aGUgdGV4dCBmcm9tIGFsbCByZWdpb25zIHdhcyBmb3JtYXR0ZWQKLQkJY3VycmVudERPTVJlZ2lvbi5kb2N1bWVudFJlZ2lvbiA9IGN1cnJlbnRET01SZWdpb24uZG9tTm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdEVtcHR5U3RhcnRUYWdXaXRoTm9BdHRyKFRleHRFZGl0IHRleHRFZGl0LCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgY29uc3RyYWludHMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudERvY3VtZW50UmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzRG9jdW1lbnRSZWdpb24sIGludCBhdmFpbGFibGVMaW5lV2lkdGgsIFN0cmluZyBpbmRlbnRTdHJhdGVneSwgU3RyaW5nIHdoaXRlc3BhY2VTdHJhdGVneSwgSVRleHRSZWdpb24gY3VycmVudFRleHRSZWdpb24pIHsKLQkJLy8gZ2V0IHByZWZlcmVuY2UgaWYgdGhlcmUgc2hvdWxkIGJlIGEgc3BhY2Ugb3Igbm90IGJldHdlZW4gdGFnCi0JCS8vIG5hbWUgYW5kIGVtcHR5IHRhZyBjbG9zZQotCQkvLyA8dGFnTmFtZSAvPgotCQlib29sZWFuIG9uZVNwYWNlSW5UYWdOYW1lID0gZ2V0Rm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkuZ2V0U3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnKCk7Ci0KLQkJLy8gY2FsY3VsYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCWludCB0YWdOYW1lTGluZVdpZHRoID0gY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpICsgMzsKLQkJaWYgKG9uZVNwYWNlSW5UYWdOYW1lKSB7Ci0JCQkvLyBhZGQgb25lIG1vcmUgdG8gYWNjb3VudCBmb3Igc3BhY2UgYmVmb3JlIGVtcHR5IHRhZyBjbG9zZQotCQkJKyt0YWdOYW1lTGluZVdpZHRoOwotCQl9Ci0JCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSB0YWdOYW1lTGluZVdpZHRoOwotCi0JCWlmIChYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSU5MSU5FLmVxdWFscyhpbmRlbnRTdHJhdGVneSkpIHsKLQkJCS8vIGlmIHdhcyBpbmxpbmluZywgbmVlZCB0byBjaGVjayBpZiBvdXQgb2YgYXZhaWxhYmxlIGxpbmUKLQkJCS8vIHdpZHRoCi0JCQlpZiAoYXZhaWxhYmxlTGluZVdpZHRoIDwgMCkgewotCQkJCS8vIG5lZWQgdG8gaW5kZW50IGlmIHBvc3NpYmxlCi0JCQkJaW50IGxpbmVXaWR0aCA9IGluZGVudElmUG9zc2libGUodGV4dEVkaXQsIGNvbnN0cmFpbnRzLCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIHByZXZpb3VzRG9jdW1lbnRSZWdpb24sIHdoaXRlc3BhY2VTdHJhdGVneSwgaW5kZW50U3RyYXRlZ3ksIHRydWUpOwotCQkJCS8vIHVwZGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJCWlmIChsaW5lV2lkdGggPiAwKQotCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBsaW5lV2lkdGggLSB0YWdOYW1lTGluZVdpZHRoOwotCQkJCWVsc2UKLQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoIC09IHRhZ05hbWVMaW5lV2lkdGg7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBubyBuZWVkIHRvIGluZGVudAotCQkJCS8vIGp1c3QgbWFrZSBzdXJlIHRvIGRlbGV0ZSBwcmV2aW91cyB3aGl0ZXNwYWNlIGlmCi0JCQkJLy8gbmVlZGVkCi0JCQkJaWYgKChET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5ULmVxdWFscyhwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFR5cGUoKSkpICYmIChwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGNvbGxhcHNlU3BhY2VzKHRleHRFZGl0LCBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGF2YWlsYWJsZUxpbmVXaWR0aCwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRGdWxsVGV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBkZWxldGUgYW55IHRyYWlsIHNwYWNlcyBhZnRlciB0YWcgbmFtZQotCQlpbnQgdGV4dExlbmd0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJaW50IHJlZ2lvbkxlbmd0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldExlbmd0aCgpOwotCi0JCWJvb2xlYW4gdGhlcmVBcmVTcGFjZXMgPSB0ZXh0TGVuZ3RoIDwgcmVnaW9uTGVuZ3RoOwotCQlpZiAoIW9uZVNwYWNlSW5UYWdOYW1lICYmIHRoZXJlQXJlU3BhY2VzKSB7Ci0JCQlkZWxldGVUcmFpbGluZ1NwYWNlcyh0ZXh0RWRpdCwgY3VycmVudFRleHRSZWdpb24sIGN1cnJlbnREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZihvbmVTcGFjZUluVGFnTmFtZSkgewotCQkJaW5zZXJ0U3BhY2VBbmRDb2xsYXBzZSh0ZXh0RWRpdCwgY3VycmVudERvY3VtZW50UmVnaW9uLCBhdmFpbGFibGVMaW5lV2lkdGgsIGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJfQotCQljb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlTGluZVdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIGFuIGVuZCB0YWcKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dEVkaXQKLQkgKiBAcGFyYW0gY3VycmVudFJlZ2lvbgotCSAqIEBwYXJhbSB0ZXh0UmVnaW9ucwotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRFbmRUYWcoVGV4dEVkaXQgdGV4dEVkaXQsIFBvc2l0aW9uIGZvcm1hdFJhbmdlLCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgY29uc3RyYWludHMsIERPTVJlZ2lvbiBjdXJyZW50RE9NUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzRG9jdW1lbnRSZWdpb24pIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50RG9jdW1lbnRSZWdpb24gPSBjdXJyZW50RE9NUmVnaW9uLmRvY3VtZW50UmVnaW9uOwotCi0JCVN0cmluZyB3aGl0ZXNwYWNlU3RyYXRlZ3kgPSBjb25zdHJhaW50cy5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKTsKLQkJU3RyaW5nIGluZGVudFN0cmF0ZWd5ID0gY29uc3RyYWludHMuZ2V0SW5kZW50U3RyYXRlZ3koKTsKLQotCQkvLyBkbyBub3QgZm9ybWF0IHNwYWNlIGJlZm9yZSBzdGFydCB0YWcgaWYgcHJlc2VydmluZyBzcGFjZXMKLQkJaWYgKHdoaXRlc3BhY2VTdHJhdGVneSAhPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUpIHsKLQkJCS8vIGZvcm1hdCBsaWtlIGluZGVudCBzdHJhdGVneSBzYXlzCi0JCQlpZiAoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOREVOVC5lcXVhbHMoaW5kZW50U3RyYXRlZ3kpIHx8IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ORVdfTElORS5lcXVhbHMoaW5kZW50U3RyYXRlZ3kpKSB7Ci0JCQkJaW50IGF2YWlsYWJsZUxpbmVXaWR0aCA9IGluZGVudElmUG9zc2libGUodGV4dEVkaXQsIGNvbnN0cmFpbnRzLCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIHByZXZpb3VzRG9jdW1lbnRSZWdpb24sIHdoaXRlc3BhY2VTdHJhdGVneSwgaW5kZW50U3RyYXRlZ3ksIGZhbHNlKTsKLQkJCQljb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlTGluZVdpZHRoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSU5MSU5FLmVxdWFscyhpbmRlbnRTdHJhdGVneSkpewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gY3VycmVudERvY3VtZW50UmVnaW9uLmdldFBhcmVudERvY3VtZW50KCk7Ci0JCQkJaW50IGN1cnJlbnRMaW5lID0gZG9jLmdldExpbmVPZk9mZnNldChjdXJyZW50RG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJaW50IHByZXZMaW5lID0gZG9jLmdldExpbmVPZk9mZnNldChwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCWlmICggY3VycmVudExpbmUgIT0gcHJldkxpbmUpewotCQkJCQlpbnQgYXZhaWxhYmxlTGluZVdpZHRoID0gaW5kZW50SWZQb3NzaWJsZSh0ZXh0RWRpdCwgY29uc3RyYWludHMsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgd2hpdGVzcGFjZVN0cmF0ZWd5LCBpbmRlbnRTdHJhdGVneSwgZmFsc2UpOwotCQkJCQljb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlTGluZVdpZHRoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZm9ybWF0IHRoZSBlbmQgdGFnIGl0c2VsZgotCQlmb3JtYXRXaXRoaW5FbmRUYWcodGV4dEVkaXQsIGNvbnN0cmFpbnRzLCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIHByZXZpb3VzRG9jdW1lbnRSZWdpb24pOwotCX0KLQotCS8qKgotCSAqIEZvcm1hdHMgdGhlIGdpdmVuIHJlZ2lvbiAoYW5kIGFsbCBpdHMgY2hpbGRyZW4pIGNvbnRhaW5lZCBpbiBkb21SZWdpb24uCi0JICogCi0JICogQHBhcmFtIGVkaXQKLQkgKiAgICAgICAgICAgIGVkaXRzIHJlcXVpcmVkIHRvIGZvcm1hdAotCSAqIEBwYXJhbSBmb3JtYXRSYW5nZQotCSAqICAgICAgICAgICAgZG9jdW1lbnQgcmFuZ2UgdG8gZm9ybWF0IChvbmx5IGZvcm1hdCBjb250ZW50IHdpdGhpbiB0aGlzCi0JICogICAgICAgICAgICByYW5nZSkKLQkgKiBAcGFyYW0gcGFyZW50Q29uc3RyYWludHMKLQkgKiBAcGFyYW0gZG9tUmVnaW9uCi0JICogICAgICAgICAgICBhc3N1bWVzIGRvbSBub2RlICYgcmVnaW9uIGFyZSBub3QgbnVsbAotCSAqIEBwYXJhbSBwcmV2aW91c1JlZ2lvbgotCSAqICAgICAgICAgICAgY291bGQgYmUgbnVsbAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGFzdCByZWdpb24gZm9ybWF0dGVkCi0JICovCi0JcHJpdmF0ZSBET01SZWdpb24gZm9ybWF0UmVnaW9uKFRleHRFZGl0IGVkaXQsIFBvc2l0aW9uIGZvcm1hdFJhbmdlLCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgcGFyZW50Q29uc3RyYWludHMsIERPTVJlZ2lvbiBkb21SZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNSZWdpb24pIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gZG9tUmVnaW9uLmRvY3VtZW50UmVnaW9uOwotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUuZXF1YWxzKHJlZ2lvblR5cGUpKSB7Ci0JCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gY3VycmVudFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpOwotCQkJU3RyaW5nIHRleHRSZWdpb25UeXBlID0gdGV4dFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4uZXF1YWxzKHRleHRSZWdpb25UeXBlKSkgewotCQkJCWRvbVJlZ2lvbiA9IGZvcm1hdFN0YXJ0VGFnKGVkaXQsIGZvcm1hdFJhbmdlLCBwYXJlbnRDb25zdHJhaW50cywgZG9tUmVnaW9uLCBwcmV2aW91c1JlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4uZXF1YWxzKHRleHRSZWdpb25UeXBlKSkgewotCQkJCWZvcm1hdEVuZFRhZyhlZGl0LCBmb3JtYXRSYW5nZSwgcGFyZW50Q29uc3RyYWludHMsIGRvbVJlZ2lvbiwgcHJldmlvdXNSZWdpb24pOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQuZXF1YWxzKHJlZ2lvblR5cGUpIHx8IGRvbVJlZ2lvbi5kb21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCWZvcm1hdENvbnRlbnQoZWRpdCwgZm9ybWF0UmFuZ2UsIHBhcmVudENvbnN0cmFpbnRzLCBkb21SZWdpb24sIHByZXZpb3VzUmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQuZXF1YWxzKHJlZ2lvblR5cGUpKSB7Ci0JCQlmb3JtYXRDb21tZW50KGVkaXQsIGZvcm1hdFJhbmdlLCBwYXJlbnRDb25zdHJhaW50cywgZG9tUmVnaW9uLCBwcmV2aW91c1JlZ2lvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB1bmtub3duLCBzbyBqdXN0IGxlYXZlIGFsb25lIGZvciBub3cgYnV0IG1ha2Ugc3VyZSB0byB1cGRhdGUKLQkJCS8vIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQlTdHJpbmcgZnVsbFRleHQgPSBjdXJyZW50UmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0JCQlpbnQgd2lkdGggPSB1cGRhdGVMaW5lV2lkdGhXaXRoTGFzdExpbmUoZnVsbFRleHQsIHBhcmVudENvbnN0cmFpbnRzLmdldEF2YWlsYWJsZUxpbmVXaWR0aCgpKTsKLQkJCXBhcmVudENvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aCh3aWR0aCk7Ci0JCX0KLQkJcmV0dXJuIGRvbVJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIHRoZSBkb21SZWdpb24gYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4gYW5kIHNpYmxpbmdzCi0JICogCi0JICogQHBhcmFtIGVkaXQKLQkgKiBAcGFyYW0gZG9tUmVnaW9uCi0JICogQHBhcmFtIHBhcmVudENvbnN0cmFpbnRzCi0JICogQHBhcmFtIGZvcm1hdFJhbmdlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdFNpYmxpbmdzKFRleHRFZGl0IGVkaXQsIERPTVJlZ2lvbiBkb21SZWdpb24sIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBwYXJlbnRDb25zdHJhaW50cywgUG9zaXRpb24gZm9ybWF0UmFuZ2UpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c1JlZ2lvbiA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGRvbVJlZ2lvbi5kb2N1bWVudFJlZ2lvbjsKLQkJSURPTU5vZGUgY3VycmVudERPTU5vZGUgPSBkb21SZWdpb24uZG9tTm9kZTsKLQkJd2hpbGUgKGN1cnJlbnRET01Ob2RlICE9IG51bGwgJiYgY3VycmVudFJlZ2lvbiAhPSBudWxsICYmIGZvcm1hdFJhbmdlLm92ZXJsYXBzV2l0aChjdXJyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnJlbnRSZWdpb24uZ2V0TGVuZ3RoKCkpICYmIChmUHJvZ3Jlc3NNb25pdG9yID09IG51bGwgfHwgIWZQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSkgewotCQkJZG9tUmVnaW9uLmRvY3VtZW50UmVnaW9uID0gY3VycmVudFJlZ2lvbjsKLQkJCWRvbVJlZ2lvbi5kb21Ob2RlID0gY3VycmVudERPTU5vZGU7Ci0KLQkJCS8vIG5lZWQgdG8gbWFrZSBzdXJlIGN1cnJlbnQgZG9jdW1lbnQgcmVnaW9uIGFuZCBjdXJyZW50Ci0JCQkvLyBkb20gbm9kZSBtYXRjaCB1cAotCQkJaWYgKGN1cnJlbnRET01Ob2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZXF1YWxzKGN1cnJlbnRSZWdpb24pKSB7Ci0JCQkJLy8gZm9ybWF0IHRoaXMgZG9jdW1lbnQgcmVnaW9uL25vZGUsIGZvcm1hdFJlZ2lvbiB3aWxsCi0JCQkJLy8gcmV0dXJuIHRoZSBsYXN0IG5vZGUvcmVnaW9uIGZvcm1hdHRlZAotCQkJCWRvbVJlZ2lvbiA9IGZvcm1hdFJlZ2lvbihlZGl0LCBmb3JtYXRSYW5nZSwgcGFyZW50Q29uc3RyYWludHMsIGRvbVJlZ2lvbiwgcHJldmlvdXNSZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gVE9ETzogbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gaWYgdGhleSBkb24ndAotCQkJCS8vIG1hdGNoIHVwCi0JCQl9Ci0JCQlwcmV2aW91c1JlZ2lvbiA9IGRvbVJlZ2lvbi5kb2N1bWVudFJlZ2lvbjsKLQkJCS8vIGdldCB0aGUgbmV4dCBzaWJsaW5nIGluZm9ybWF0aW9uCi0JCQlpZiAoZG9tUmVnaW9uLmRvbU5vZGUgIT0gbnVsbCkKLQkJCQljdXJyZW50RE9NTm9kZSA9IChJRE9NTm9kZSkgZG9tUmVnaW9uLmRvbU5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWVsc2UKLQkJCQljdXJyZW50RE9NTm9kZSA9IG51bGw7Ci0JCQljdXJyZW50UmVnaW9uID0gcHJldmlvdXNSZWdpb24uZ2V0TmV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0cyBhIHN0YXJ0IHRhZwotCSAqIAotCSAqIEBwYXJhbSB0ZXh0RWRpdAotCSAqIEBwYXJhbSBjdXJyZW50UmVnaW9uCi0JICogQHBhcmFtIHRleHRSZWdpb25zCi0JICovCi0JcHJpdmF0ZSBET01SZWdpb24gZm9ybWF0U3RhcnRUYWcoVGV4dEVkaXQgdGV4dEVkaXQsIFBvc2l0aW9uIGZvcm1hdFJhbmdlLCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgcGFyZW50Q29uc3RyYWludHMsIERPTVJlZ2lvbiBjdXJyZW50RE9NUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzRG9jdW1lbnRSZWdpb24pIHsKLQkJLy8gZGV0ZXJtaW5lIHByb3BlciBpbmRlbnQgYnkgcmVmZXJyaW5nIHRvIHBhcmVudCBjb25zdHJhaW50cywKLQkJLy8gcHJldmlvdXMgbm9kZSwgYW5kIGN1cnJlbnQgbm9kZQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnREb2N1bWVudFJlZ2lvbiA9IGN1cnJlbnRET01SZWdpb24uZG9jdW1lbnRSZWdpb247Ci0JCUlET01Ob2RlIGN1cnJlbnRET01Ob2RlID0gY3VycmVudERPTVJlZ2lvbi5kb21Ob2RlOwotCi0JCS8vIGNyZWF0ZSBhIGNvbnN0cmFpbnQgZm9yIHRoaXMgdGFnCi0JCVhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyB0aGlzQ29uc3RyYWludHMgPSBuZXcgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzKCk7Ci0JCVhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBjaGlsZHJlbkNvbnN0cmFpbnRzID0gbmV3IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cygpOwotCQl1cGRhdGVGb3JtYXR0aW5nQ29uc3RyYWludHMocGFyZW50Q29uc3RyYWludHMsIHRoaXNDb25zdHJhaW50cywgY2hpbGRyZW5Db25zdHJhaW50cywgY3VycmVudERPTVJlZ2lvbik7Ci0KLQkJaWYoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLkRFRkFVTFQuZXF1YWxzKGNoaWxkcmVuQ29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkpKQotCQkJY2hpbGRyZW5Db25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKG5ldyBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKSkuZ2V0RWxlbWVudFdoaXRlc3BhY2VTdHJhdGVneSgpKTsKLQkJCQotCQlTdHJpbmcgd2hpdGVzcGFjZVN0cmF0ZWd5ID0gdGhpc0NvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpOwotCQlTdHJpbmcgaW5kZW50U3RyYXRlZ3kgPSB0aGlzQ29uc3RyYWludHMuZ2V0SW5kZW50U3RyYXRlZ3koKTsKLQkJaW50IGF2YWlsYWJsZUxpbmVXaWR0aCA9IHRoaXNDb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKTsKLQotCQkvLyBmb3JtYXQgc3BhY2UgYmVmb3JlIHN0YXJ0IHRhZwotCQkvLyBkbyBub3QgZm9ybWF0IHNwYWNlIGJlZm9yZSBzdGFydCB0YWcgaWYgcHJlc2VydmluZyBzcGFjZXMKLQkJaWYgKCFYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUuZXF1YWxzKHdoaXRlc3BhY2VTdHJhdGVneSkpIHsKLQkJCS8vIGZvcm1hdCBsaWtlIGluZGVudCBzdHJhdGVneSBzYXlzCi0JCQlpZiAoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOREVOVC5lcXVhbHMoaW5kZW50U3RyYXRlZ3kpIHx8IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ORVdfTElORS5lcXVhbHMoaW5kZW50U3RyYXRlZ3kpKSB7Ci0JCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gaW5kZW50SWZQb3NzaWJsZSh0ZXh0RWRpdCwgdGhpc0NvbnN0cmFpbnRzLCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIHByZXZpb3VzRG9jdW1lbnRSZWdpb24sIHdoaXRlc3BhY2VTdHJhdGVneSwgaW5kZW50U3RyYXRlZ3ksIHRydWUpOwotCQkJCWlmIChhdmFpbGFibGVMaW5lV2lkdGggPiAwKQotCQkJCQl0aGlzQ29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0JCQl9Ci0JCX0KLQkJLy8gZm9ybWF0IHRoZSBzdGFydCB0YWcgaXRzZWxmCi0JCWJvb2xlYW4gdGFnRW5kZWQgPSBmb3JtYXRXaXRoaW5UYWcodGV4dEVkaXQsIHRoaXNDb25zdHJhaW50cywgY3VycmVudERvY3VtZW50UmVnaW9uLCBwcmV2aW91c0RvY3VtZW50UmVnaW9uKTsKLQotCQkvLyBmb3JtYXQgY2hpbGRyZW4KLQkJaWYgKCF0YWdFbmRlZCkgewotCQkJLy8gdXBkYXRlIGNoaWxkQ29uc3RyYWludHMgd2l0aCB0aGlzQ29uc3RyYWludCdzIGluZGVudExldmVsICYKLQkJCS8vIGF2YWlsYWJsZUxpbmVXaWR0aAotCQkJY2hpbGRyZW5Db25zdHJhaW50cy5zZXRJbmRlbnRMZXZlbCh0aGlzQ29uc3RyYWludHMuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCQljaGlsZHJlbkNvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aCh0aGlzQ29uc3RyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCkpOwotCi0JCQlwcmV2aW91c0RvY3VtZW50UmVnaW9uID0gY3VycmVudERvY3VtZW50UmVnaW9uOwotCQkJSURPTU5vZGUgY2hpbGRET01Ob2RlID0gKElET01Ob2RlKSBjdXJyZW50RE9NTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRSZWdpb24gPSBjdXJyZW50RG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQkJYm9vbGVhbiBwYXNzZWRGb3JtYXRSYW5nZSA9IGZhbHNlOwotCQkJLy8gYXMgbG9uZyBhcyB0aGVyZSBpcyBvbmUgY2hpbGQKLQkJCWlmIChjaGlsZERPTU5vZGUgIT0gbnVsbCAmJiBuZXh0UmVnaW9uICE9IG51bGwpIHsKLQkJCQl3aGlsZSAoY2hpbGRET01Ob2RlICE9IG51bGwgJiYgbmV4dFJlZ2lvbiAhPSBudWxsICYmICFwYXNzZWRGb3JtYXRSYW5nZSAmJiAoZlByb2dyZXNzTW9uaXRvciA9PSBudWxsIHx8ICFmUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkpIHsKLQkJCQkJRE9NUmVnaW9uIGNoaWxkRE9NUmVnaW9uID0gbmV3IERPTVJlZ2lvbigpOwotCQkJCQljaGlsZERPTVJlZ2lvbi5kb2N1bWVudFJlZ2lvbiA9IG5leHRSZWdpb247Ci0JCQkJCWNoaWxkRE9NUmVnaW9uLmRvbU5vZGUgPSBjaGlsZERPTU5vZGU7Ci0JCQkJCWlmIChuZXh0UmVnaW9uLmVxdWFscyhjaGlsZERPTU5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSkpIHsKLQkJCQkJCS8vIGZvcm1hdCBjaGlsZHJlbi4gcGFzcyBpbiBjaGlsZCBjb25zdHJhaW50cwotCQkJCQkJY2hpbGRET01SZWdpb24gPSBmb3JtYXRSZWdpb24odGV4dEVkaXQsIGZvcm1hdFJhbmdlLCBjaGlsZHJlbkNvbnN0cmFpbnRzLCBjaGlsZERPTVJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBUT0RPOiB3aGF0IGhhcHBlbnMgaWYgdGhleSBkb250IG1hdGNoIHVwPwotCQkJCQl9Ci0KLQkJCQkJLy8gdXBkYXRlIGNoaWxkRE9NUmVnaW9uIHdpdGggbmV4dCBkb20vcmVnaW9uIG5vZGUKLQkJCQkJaWYgKGNoaWxkRE9NUmVnaW9uLmRvbU5vZGUgIT0gbnVsbCkgewotCQkJCQkJY2hpbGRET01Ob2RlID0gKElET01Ob2RlKSBjaGlsZERPTVJlZ2lvbi5kb21Ob2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQljaGlsZERPTU5vZGUgPSBudWxsOwotCQkJCQl9Ci0JCQkJCXByZXZpb3VzRG9jdW1lbnRSZWdpb24gPSBjaGlsZERPTVJlZ2lvbi5kb2N1bWVudFJlZ2lvbjsKLQkJCQkJbmV4dFJlZ2lvbiA9IHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQkJCQlpZiAobmV4dFJlZ2lvbiAhPSBudWxsKQotCQkJCQkJcGFzc2VkRm9ybWF0UmFuZ2UgPSAhZm9ybWF0UmFuZ2Uub3ZlcmxhcHNXaXRoKG5leHRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgbmV4dFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdGhlcmUgd2VyZSBubyBjaGlsZHJlbiwgc28ga2VlcCBlbmQgdGFnIGlubGluZWQKLQkJCQljaGlsZHJlbkNvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuQ09MTEFQU0UpOwotCQkJCWNoaWxkcmVuQ29uc3RyYWludHMuc2V0SW5kZW50U3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOTElORSk7Ci0JCQl9Ci0KLQkJCWlmICghcGFzc2VkRm9ybWF0UmFuZ2UpIHsKLQkJCQkvLyB1cGRhdGUgdGhlIGRvbSByZWdpb24gd2l0aCB0aGUgbGFzdCBmb3JtYXR0ZWQgcmVnaW9uL2RvbQotCQkJCS8vIG5vZGUgc2hvdWxkIGJlIGVuZCB0YWcgYW5kIHRoaXMgdGFnJ3MgRE9NTm9kZQotCQkJCWN1cnJlbnRET01SZWdpb24uZG9jdW1lbnRSZWdpb24gPSBuZXh0UmVnaW9uOwotCQkJCWN1cnJlbnRET01SZWdpb24uZG9tTm9kZSA9IGN1cnJlbnRET01Ob2RlOwotCi0JCQkJLy8gZW5kIHRhZydzIGluZGVudCBsZXZlbCBzaG91bGQgYmUgc2FtZSBhcyBzdGFydCB0YWcncwotCQkJCWNoaWxkcmVuQ29uc3RyYWludHMuc2V0SW5kZW50TGV2ZWwodGhpc0NvbnN0cmFpbnRzLmdldEluZGVudExldmVsKCkpOwotCQkJCS8vIGZvcm1hdCBlbmQgdGFnCi0JCQkJYm9vbGVhbiBmb3JtYXRFbmRUYWcgPSBmYWxzZTsKLQkJCQlpZiAobmV4dFJlZ2lvbiAhPSBudWxsICYmIGN1cnJlbnRET01Ob2RlICE9IG51bGwpIHsKLQkJCQkJSVRleHRSZWdpb25MaXN0IHJzID0gbmV4dFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQkJCWlmIChycy5zaXplKCkgPiAxKSB7Ci0JCQkJCQlJVGV4dFJlZ2lvbiByID0gcnMuZ2V0KDApOwotCQkJCQkJaWYgKHIgIT0gbnVsbCAmJiBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4uZXF1YWxzKHIuZ2V0VHlwZSgpKSkgewotCQkJCQkJCXIgPSBycy5nZXQoMSk7Ci0JCQkJCQkJaWYgKHIgIT0gbnVsbCAmJiBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRS5lcXVhbHMoci5nZXRUeXBlKCkpKSB7Ci0JCQkJCQkJCVN0cmluZyB0YWdOYW1lID0gbmV4dFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCQkJCQlpZiAodGFnTmFtZSAhPSBudWxsICYmIHRhZ05hbWUuZXF1YWxzKGN1cnJlbnRET01Ob2RlLmdldE5vZGVOYW1lKCkpKQotCQkJCQkJCQkJZm9ybWF0RW5kVGFnID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZm9ybWF0RW5kVGFnKQotCQkJCQlmb3JtYXRFbmRUYWcodGV4dEVkaXQsIGZvcm1hdFJhbmdlLCBjaGlsZHJlbkNvbnN0cmFpbnRzLCBjdXJyZW50RE9NUmVnaW9uLCBwcmV2aW91c0RvY3VtZW50UmVnaW9uKTsKLQkJCQllbHNlIHsKLQkJCQkJLy8gbWlzc2luZyBlbmQgdGFnIHNvIHJldHVybiBsYXN0IGZvcm1hdHRlZCBkb2N1bWVudAotCQkJCQkvLyByZWdpb24KLQkJCQkJY3VycmVudERPTVJlZ2lvbi5kb2N1bWVudFJlZ2lvbiA9IHByZXZpb3VzRG9jdW1lbnRSZWdpb247Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gcGFzc2VkIGZvcm1hdCByYW5nZSBiZWZvcmUgY291bGQgZmluaXNoLCBzbyB1cGRhdGUgZG9tCi0JCQkJLy8gcmVnaW9uIHRvIGxhc3Qga25vd24gZm9ybWF0dGVkIHJlZ2lvbgotCQkJCWN1cnJlbnRET01SZWdpb24uZG9jdW1lbnRSZWdpb24gPSBuZXh0UmVnaW9uOwotCQkJCWN1cnJlbnRET01SZWdpb24uZG9tTm9kZSA9IGNoaWxkRE9NTm9kZTsKLQkJCX0KLQotCQkJLy8gdXBkYXRlIHBhcmVudCBjb25zdHJhaW50IHNpbmNlIHRoaXMgaXMgd2hhdCBpcyBwYXNzZWQgYmFjawotCQkJcGFyZW50Q29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGNoaWxkcmVuQ29uc3RyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gdXBkYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQlwYXJlbnRDb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgodGhpc0NvbnN0cmFpbnRzLmdldEF2YWlsYWJsZUxpbmVXaWR0aCgpKTsKLQkJfQotCQlyZXR1cm4gY3VycmVudERPTVJlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZm9ybWF0U3RhcnRUYWdXaXRoTm9BdHRyKFRleHRFZGl0IHRleHRFZGl0LCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgY29uc3RyYWludHMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudERvY3VtZW50UmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzRG9jdW1lbnRSZWdpb24sIGludCBhdmFpbGFibGVMaW5lV2lkdGgsIFN0cmluZyBpbmRlbnRTdHJhdGVneSwgU3RyaW5nIHdoaXRlc3BhY2VTdHJhdGVneSwgSVRleHRSZWdpb24gY3VycmVudFRleHRSZWdpb24pIHsKLQkJLy8gY2FsY3VsYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCWludCB0YWdOYW1lTGluZVdpZHRoID0gY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpICsgMjsKLQkJYXZhaWxhYmxlTGluZVdpZHRoIC09IHRhZ05hbWVMaW5lV2lkdGg7Ci0KLQkJaWYgKFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkxJTkUuZXF1YWxzKGluZGVudFN0cmF0ZWd5KSkgewotCQkJLy8gaWYgd2FzIGlubGluaW5nLCBuZWVkIHRvIGNoZWNrIGlmIG91dCBvZiBhdmFpbGFibGUgbGluZQotCQkJLy8gd2lkdGgKLQkJCWlmIChhdmFpbGFibGVMaW5lV2lkdGggPCAwKSB7Ci0JCQkJLy8gbmVlZCB0byBpbmRlbnQgaWYgcG9zc2libGUKLQkJCQlpbnQgbGluZVdpZHRoID0gaW5kZW50SWZQb3NzaWJsZSh0ZXh0RWRpdCwgY29uc3RyYWludHMsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgd2hpdGVzcGFjZVN0cmF0ZWd5LCBpbmRlbnRTdHJhdGVneSwgdHJ1ZSk7Ci0JCQkJLy8gdXBkYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQkJaWYgKGxpbmVXaWR0aCA+IDApCi0JCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGxpbmVXaWR0aCAtIHRhZ05hbWVMaW5lV2lkdGg7Ci0JCQkJZWxzZQotCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gdGFnTmFtZUxpbmVXaWR0aDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5vIG5lZWQgdG8gaW5kZW50Ci0JCQkJLy8ganVzdCBtYWtlIHN1cmUgdG8gZGVsZXRlIHByZXZpb3VzIHdoaXRlc3BhY2UgaWYKLQkJCQkvLyBuZWVkZWQKLQkJCQlpZiAocHJldmlvdXNEb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWlmIChET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5ULmVxdWFscyhwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJCVN0cmluZyBwcmV2aW91c0RvY3VtZW50UmVnaW9uVGV4dCA9IHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0RnVsbFRleHQoKTsKLQkJCQkJCWlmIChwcmV2aW91c0RvY3VtZW50UmVnaW9uVGV4dC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGNvbGxhcHNlU3BhY2VzKHRleHRFZGl0LCBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGF2YWlsYWJsZUxpbmVXaWR0aCwgcHJldmlvdXNEb2N1bWVudFJlZ2lvblRleHQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gZGVsZXRlIGFueSB0cmFpbCBzcGFjZXMgYWZ0ZXIgdGFnIG5hbWUKLQkJaWYgKGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSA8IGN1cnJlbnRUZXh0UmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQlkZWxldGVUcmFpbGluZ1NwYWNlcyh0ZXh0RWRpdCwgY3VycmVudFRleHRSZWdpb24sIGN1cnJlbnREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQkJY29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0IHRoZSB0ZXh0IGluIHhtbCBjb250ZW50Ci0JICogCi0JICogQHBhcmFtIHRleHRFZGl0Ci0JICogQHBhcmFtIHBhcmVudENvbnN0cmFpbnRzCi0JICogQHBhcmFtIGN1cnJlbnRSZWdpb24KLQkgKiBAcGFyYW0gZnVsbFRleHQKLQkgKiBAcGFyYW0gd2hpdGVzcGFjZU1vZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgZm9ybWF0VGV4dEluQ29udGVudChUZXh0RWRpdCB0ZXh0RWRpdCwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHBhcmVudENvbnN0cmFpbnRzLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24sIFN0cmluZyBmdWxsVGV4dCwgU3RyaW5nIHdoaXRlc3BhY2VNb2RlKSB7Ci0JCWludCBhdmFpbGFibGVMaW5lV2lkdGggPSBwYXJlbnRDb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKTsKLQotCQkvLyBkZXRlcm1pbmUgaW5kZW50YXRpb24KLQkJYm9vbGVhbiBmb3JjZUluaXRpYWxJbmRlbnQgPSBmYWxzZTsKLQkJaW50IGluZGVudExldmVsID0gcGFyZW50Q29uc3RyYWludHMuZ2V0SW5kZW50TGV2ZWwoKSArIDE7Ci0JCVN0cmluZyBpbmRlbnRNb2RlID0gcGFyZW50Q29uc3RyYWludHMuZ2V0SW5kZW50U3RyYXRlZ3koKTsKLQkJaWYgKFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkRFTlQuZXF1YWxzKGluZGVudE1vZGUpKSB7Ci0JCQlmb3JjZUluaXRpYWxJbmRlbnQgPSB0cnVlOwotCQl9Ci0JCWlmIChYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuTkVXX0xJTkUuZXF1YWxzKGluZGVudE1vZGUpKSB7Ci0JCQlpbmRlbnRMZXZlbCA9IHBhcmVudENvbnN0cmFpbnRzLmdldEluZGVudExldmVsKCk7Ci0JCQlmb3JjZUluaXRpYWxJbmRlbnQgPSB0cnVlOwotCQl9Ci0KLQkJaW50IGZ1bGxUZXh0T2Zmc2V0ID0gMDsKLQkJY2hhcltdIGZ1bGxUZXh0QXJyYXkgPSBmdWxsVGV4dC50b0NoYXJBcnJheSgpOwotCQl3aGlsZSAoZnVsbFRleHRPZmZzZXQgPCBmdWxsVGV4dEFycmF5Lmxlbmd0aCkgewotCQkJLy8gZ2F0aGVyIGFsbCB3aGl0ZXNwYWNlcwotCQkJU3RyaW5nIHdoaXRlc3BhY2VSdW4gPSBnZXRDaGFyYWN0ZXJSdW4oZnVsbFRleHRBcnJheSwgZnVsbFRleHRPZmZzZXQsIHRydWUpOwotCQkJaWYgKHdoaXRlc3BhY2VSdW4ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJLy8gb2Zmc2V0IHdoZXJlIHdoaXRlc3BhY2Ugc3RhcnRzCi0JCQkJaW50IHdoaXRlc3BhY2VTdGFydCA9IGZ1bGxUZXh0T2Zmc2V0OwotCQkJCS8vIHVwZGF0ZSBjdXJyZW50IG9mZnNldCBpbiBmdWxsVGV4dAotCQkJCWZ1bGxUZXh0T2Zmc2V0ICs9IHdoaXRlc3BhY2VSdW4ubGVuZ3RoKCk7Ci0KLQkJCQkvLyBnYXRoZXIgZm9sbG93aW5nIHdvcmQKLQkJCQlTdHJpbmcgY2hhcmFjdGVyUnVuID0gZ2V0Q2hhcmFjdGVyUnVuKGZ1bGxUZXh0QXJyYXksIGZ1bGxUZXh0T2Zmc2V0LCBmYWxzZSk7Ci0JCQkJaW50IGNoYXJhY3RlclJ1bkxlbmd0aCA9IGNoYXJhY3RlclJ1bi5sZW5ndGgoKTsKLQkJCQlpZiAoY2hhcmFjdGVyUnVuTGVuZ3RoID4gMCkgewotCQkJCQkvLyBpbmRlbnQgaWYgd29yZCBpcyB0b28gbG9uZyBvciBmb3JjaW5nIGluaXRpYWwKLQkJCQkJLy8gaW5kZW50Ci0JCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSBjaGFyYWN0ZXJSdW5MZW5ndGg7Ci0JCQkJCS8vIG9mZnNldCB3aGVyZSBpbmRlbnQvY29sbGFwc2Ugd2lsbCBoYXBwZW4KLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gY3VycmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgd2hpdGVzcGFjZVN0YXJ0OwotCQkJCQlpZiAoZm9yY2VJbml0aWFsSW5kZW50IHx8IChhdmFpbGFibGVMaW5lV2lkdGggPD0gMCkpIHsKLQkJCQkJCS8vIGluZGVudCBpZiBub3QgYWxyZWFkeSBpbmRlbnRlZAotCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gaW5kZW50SWZOb3RBbHJlYWR5SW5kZW50ZWQodGV4dEVkaXQsIGN1cnJlbnRSZWdpb24sIGluZGVudExldmVsLCBzdGFydE9mZnNldCwgd2hpdGVzcGFjZVJ1bik7Ci0JCQkJCQkvLyByZW1lbWJlciB0byBzdWJ0cmFjdCB3b3JkIGxlbmd0aAotCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoIC09IGNoYXJhY3RlclJ1bkxlbmd0aDsKLQkJCQkJCWZvcmNlSW5pdGlhbEluZGVudCA9IGZhbHNlOyAvLyBpbml0aWFsIGluZGVudCBkb25lCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBqdXN0IGNvbGxhcHNlIHNwYWNlcywgYnV0IGFkanVzdCBmb3IgYW55IGluZGVudGluZyB0aGF0IG1heSByZXN1bHQgZnJvbSBwcmVzZXJ2aW5nIGxpbmUgZGVsaW1pdGVycwotCQkJCQkJaWYgKHdoaXRlc3BhY2VTdGFydCA9PSAwICYmIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkVBTkRUUklNLmVxdWFscyh3aGl0ZXNwYWNlTW9kZSkpIHsKLQkJCQkJCQkvLyBpZiBpZ25vcmUsIHRyaW0KLQkJCQkJCQlEZWxldGVFZGl0IGRlbGV0ZVRyYWlsaW5nID0gbmV3IERlbGV0ZUVkaXQoc3RhcnRPZmZzZXQsIHdoaXRlc3BhY2VSdW4ubGVuZ3RoKCkpOwotCQkJCQkJCXRleHRFZGl0LmFkZENoaWxkKGRlbGV0ZVRyYWlsaW5nKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlJFUExBQ0UuZXF1YWxzKHdoaXRlc3BhY2VNb2RlKSkKLQkJCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSByZXBsYWNlU3BhY2VzKHRleHRFZGl0LCBzdGFydE9mZnNldCwgYXZhaWxhYmxlTGluZVdpZHRoLCB3aGl0ZXNwYWNlUnVuKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBjb2xsYXBzZUFuZEluZGVudCh0ZXh0RWRpdCwgc3RhcnRPZmZzZXQsIGF2YWlsYWJsZUxpbmVXaWR0aCwgaW5kZW50TGV2ZWwsIHdoaXRlc3BhY2VSdW4sIGN1cnJlbnRSZWdpb24pOwotCQkJCQl9Ci0KLQkJCQkJZnVsbFRleHRPZmZzZXQgKz0gY2hhcmFjdGVyUnVuTGVuZ3RoOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gaGFuZGxlIHRyYWlsaW5nIHdoaXRlc3BhY2UKLQkJCQkJaW50IHdoaXRlc3BhY2VPZmZzZXQgPSBjdXJyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgKyB3aGl0ZXNwYWNlU3RhcnQ7Ci0JCQkJCWlmIChYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUkVQTEFDRS5lcXVhbHMod2hpdGVzcGFjZU1vZGUpKQotCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gcmVwbGFjZVNwYWNlcyh0ZXh0RWRpdCwgd2hpdGVzcGFjZU9mZnNldCwgYXZhaWxhYmxlTGluZVdpZHRoLCB3aGl0ZXNwYWNlUnVuKTsKLQkJCQkJZWxzZSBpZiAoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklHTk9SRUFORFRSSU0uZXF1YWxzKHdoaXRlc3BhY2VNb2RlKSkgewotCQkJCQkJLy8gYWx3YXlzIHRyaW0KLQkJCQkJCURlbGV0ZUVkaXQgZGVsZXRlVHJhaWxpbmcgPSBuZXcgRGVsZXRlRWRpdCh3aGl0ZXNwYWNlT2Zmc2V0LCB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpKTsKLQkJCQkJCXRleHRFZGl0LmFkZENoaWxkKGRlbGV0ZVRyYWlsaW5nKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmKGdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldENsZWFyQWxsQmxhbmtMaW5lcygpKSB7Ci0JCQkJCQlpZiAoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklHTk9SRS5lcXVhbHMod2hpdGVzcGFjZU1vZGUpKSB7Ci0JCQkJCQkJLy8gaWYgaWdub3JlLCB0cmltCi0JCQkJCQkJRGVsZXRlRWRpdCBkZWxldGVUcmFpbGluZyA9IG5ldyBEZWxldGVFZGl0KHdoaXRlc3BhY2VPZmZzZXQsIHdoaXRlc3BhY2VSdW4ubGVuZ3RoKCkpOwotCQkJCQkJCXRleHRFZGl0LmFkZENoaWxkKGRlbGV0ZVRyYWlsaW5nKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGlmIGNvbGxhcHNlLCBsZWF2ZSBhIHNwYWNlLiBidXQgd2hhdCBpZiBlbmQgdXAKLQkJCQkJCQkvLyB3YW50aW5nIHRvIGFkZCBpbmRlbnQ/IHRoZW4gbmVlZCB0byBkZWxldGUgc3BhY2UKLQkJCQkJCQkvLyBhZGRlZCBhbmQgYWRkIGluZGVudCBpbnN0ZWFkCi0JCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gY29sbGFwc2VTcGFjZXModGV4dEVkaXQsIHdoaXRlc3BhY2VPZmZzZXQsIGF2YWlsYWJsZUxpbmVXaWR0aCwgd2hpdGVzcGFjZVJ1bik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBnYXRoZXIgd29yZAotCQkJCVN0cmluZyBjaGFyYWN0ZXJSdW4gPSBnZXRDaGFyYWN0ZXJSdW4oZnVsbFRleHRBcnJheSwgZnVsbFRleHRPZmZzZXQsIGZhbHNlKTsKLQkJCQlpbnQgY2hhcmFjdGVyUnVuTGVuZ3RoID0gY2hhcmFjdGVyUnVuLmxlbmd0aCgpOwotCQkJCWlmIChjaGFyYWN0ZXJSdW5MZW5ndGggPiAwKSB7Ci0JCQkJCS8vIGluZGVudCBpZiB3b3JkIGlzIHRvbyBsb25nIG9yIGZvcmNpbmcgaW5pdGlhbAotCQkJCQkvLyBpbmRlbnQKLQkJCQkJLy8gWzI0MzA5MV0gLSBjaGFyYWN0ZXJSdW5MZW5ndGggc2hvdWxkIG9ubHkgYmUgc3VidHJhY3RlZCBvbmNlIG9yIHRleHQgZm9ybWF0dGluZyB3cmFwcyBwcmVtYXR1cmVseQotCQkJCQkvLyBhdmFpbGFibGVMaW5lV2lkdGggPSBhdmFpbGFibGVMaW5lV2lkdGggLSBjaGFyYWN0ZXJSdW5MZW5ndGg7Ci0JCQkJCWlmICgoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklHTk9SRS5lcXVhbHMod2hpdGVzcGFjZU1vZGUpIHx8IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkVBTkRUUklNLmVxdWFscyh3aGl0ZXNwYWNlTW9kZSkpICYmIChmb3JjZUluaXRpYWxJbmRlbnQgfHwgKGF2YWlsYWJsZUxpbmVXaWR0aCA8PSAwKSkpIHsKLQkJCQkJCS8vIGluZGVudCBpZiBub3QgYWxyZWFkeSBpbmRlbnRlZAotCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gaW5kZW50SWZOb3RBbHJlYWR5SW5kZW50ZWQodGV4dEVkaXQsIGN1cnJlbnRSZWdpb24sIGluZGVudExldmVsLCBjdXJyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIHdoaXRlc3BhY2VSdW4pOwotCQkJCQkJLy8gcmVtZW1iZXIgdG8gc3VidHJhY3Qgd29yZCBsZW5ndGgKLQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSBjaGFyYWN0ZXJSdW5MZW5ndGg7Ci0JCQkJCQlmb3JjZUluaXRpYWxJbmRlbnQgPSBmYWxzZTsgLy8gaW5pdGlhbCBpbmRlbnQgZG9uZQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8ganVzdCBjb2xsYXBzZSBzcGFjZXMKLQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSBjaGFyYWN0ZXJSdW5MZW5ndGg7Ci0JCQkJCX0KLQotCQkJCQlmdWxsVGV4dE9mZnNldCArPSBjaGFyYWN0ZXJSdW5MZW5ndGg7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIHVwZGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQlwYXJlbnRDb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlTGluZVdpZHRoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZm9ybWF0V2l0aGluRW5kVGFnKFRleHRFZGl0IHRleHRFZGl0LCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgY29uc3RyYWludHMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudERvY3VtZW50UmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzRG9jdW1lbnRSZWdpb24pIHsKLQkJU3RyaW5nIGluZGVudFN0cmF0ZWd5ID0gY29uc3RyYWludHMuZ2V0SW5kZW50U3RyYXRlZ3koKTsKLQkJU3RyaW5nIHdoaXRlc3BhY2VTdHJhdGVneSA9IGNvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpOwotCQlpbnQgYXZhaWxhYmxlTGluZVdpZHRoID0gY29uc3RyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCB0ZXh0UmVnaW9ucyA9IGN1cnJlbnREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWludCBjdXJyZW50TnVtYmVyT2ZSZWdpb25zID0gY3VycmVudERvY3VtZW50UmVnaW9uLmdldE51bWJlck9mUmVnaW9ucygpOwotCQlpbnQgY3VycmVudFRleHRSZWdpb25JbmRleCA9IDE7Ci0KLQkJSVRleHRSZWdpb24gY3VycmVudFRleHRSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoY3VycmVudFRleHRSZWdpb25JbmRleCk7Ci0JCVN0cmluZyBjdXJyZW50VHlwZSA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJLy8gdGFnIG5hbWUgc2hvdWxkIGFsd2F5cyBiZSB0aGUgZmlyc3QgdGV4dCByZWdpb24KLQkJaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLmVxdWFscyhjdXJyZW50VHlwZSkgJiYgY3VycmVudFRleHRSZWdpb25JbmRleCA8IGN1cnJlbnROdW1iZXJPZlJlZ2lvbnMgLSAxKSB7Ci0JCQlJVGV4dFJlZ2lvbiBuZXh0VGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChjdXJyZW50VGV4dFJlZ2lvbkluZGV4ICsgMSk7Ci0JCQkvLyBCdWcgMjIxMjc5IC0gU29tZSBub24gd2VsbC1mb3JtZWQgZG9jdW1lbnRzIHdpbGwgbm90IGNvbnRyaWJ1dGUgYSBuZXh0IHJlZ2lvbgotCQkJaWYgKG5leHRUZXh0UmVnaW9uICE9IG51bGwgJiYgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFLmVxdWFscyhuZXh0VGV4dFJlZ2lvbi5nZXRUeXBlKCkpKSB7Ci0JCQkJLy8gY2FsY3VsYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQkJaW50IHRhZ05hbWVMaW5lV2lkdGggPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgKyAzOwotCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSB0YWdOYW1lTGluZVdpZHRoOwotCi0JCQkJaWYgKFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkxJTkUuZXF1YWxzKGluZGVudFN0cmF0ZWd5KSkgewotCQkJCQkvLyBpZiB3YXMgaW5saW5pbmcsIG5lZWQgdG8gY2hlY2sgaWYgb3V0IG9mIGF2YWlsYWJsZSBsaW5lCi0JCQkJCS8vIHdpZHRoIC0gV2hpdGVzcGFjZSBtYXkgaGF2ZSBiZWVuIGNvcnJlY3RlZCBpbiB0aGUgdGV4dCBjb250ZW50Ci0JCQkJCWlmIChhdmFpbGFibGVMaW5lV2lkdGggPCAwICYmIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkUuZXF1YWxzKHdoaXRlc3BhY2VTdHJhdGVneSkpIHsKLQkJCQkJCS8vIG5lZWQgdG8gZGVpbmRlbnQgaWYgcG9zc2libGUKLQkJCQkJCWludCBsaW5lV2lkdGggPSBpbmRlbnRJZlBvc3NpYmxlKHRleHRFZGl0LCBjb25zdHJhaW50cywgY3VycmVudERvY3VtZW50UmVnaW9uLCBwcmV2aW91c0RvY3VtZW50UmVnaW9uLCB3aGl0ZXNwYWNlU3RyYXRlZ3ksIGluZGVudFN0cmF0ZWd5LCBmYWxzZSk7Ci0JCQkJCQkvLyB1cGRhdGUgYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJCQkJCWlmIChsaW5lV2lkdGggPiAwKQotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGxpbmVXaWR0aCAtIHRhZ05hbWVMaW5lV2lkdGg7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBubyBuZWVkIHRvIGluZGVudAotCQkJCQkJLy8ganVzdCBtYWtlIHN1cmUgdG8gZGVsZXRlIHByZXZpb3VzIHdoaXRlc3BhY2UgaWYKLQkJCQkJCS8vIG5lZWRlZAotCQkJCQkJaWYgKHByZXZpb3VzRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCWlmIChET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5ULmVxdWFscyhwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJCQkJU3RyaW5nIHByZXZpb3VzRG9jdW1lbnRSZWdpb25UZXh0ID0gcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQkJCQkJCQlpZiAocHJldmlvdXNEb2N1bWVudFJlZ2lvblRleHQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGNvbGxhcHNlU3BhY2VzKHRleHRFZGl0LCBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGF2YWlsYWJsZUxpbmVXaWR0aCwgcHJldmlvdXNEb2N1bWVudFJlZ2lvblRleHQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIGRlbGV0ZSBhbnkgdHJhaWwgc3BhY2VzIGFmdGVyIHRhZyBuYW1lCi0JCQkJaWYgKGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSA8IGN1cnJlbnRUZXh0UmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJCWRlbGV0ZVRyYWlsaW5nU3BhY2VzKHRleHRFZGl0LCBjdXJyZW50VGV4dFJlZ2lvbiwgY3VycmVudERvY3VtZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBlbmQgdGFnIGhhcyB1bmV4cGVjdGVkIHN0dWZmLCBzbyBqdXN0IGxlYXZlIGl0IGFsb25lCi0JCX0KLQkJY29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0cyB0aGUgY29udGVudHMgd2l0aGluIGEgdGFnIGxpa2UgdGFnIG5hbWUgYW5kIGF0dHJpYnV0ZXMKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dEVkaXQKLQkgKiBAcGFyYW0gY3VycmVudERvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIHRleHRSZWdpb25zCi0JICogICAgICAgICAgICBjb250YWlucyBhdCBsZWFzdCAzIHJlZ2lvbnMKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGFnIHdhcyBlbmRlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZvcm1hdFdpdGhpblRhZyhUZXh0RWRpdCB0ZXh0RWRpdCwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c0RvY3VtZW50UmVnaW9uKSB7Ci0JCWludCBhdmFpbGFibGVMaW5lV2lkdGggPSBjb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKTsKLQkJU3RyaW5nIGluZGVudFN0cmF0ZWd5ID0gY29uc3RyYWludHMuZ2V0SW5kZW50U3RyYXRlZ3koKTsKLQkJU3RyaW5nIHdoaXRlc3BhY2VTdHJhdGVneSA9IGNvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpOwotCQlpbnQgaW5kZW50TGV2ZWwgPSBjb25zdHJhaW50cy5nZXRJbmRlbnRMZXZlbCgpOwotCQlJVGV4dFJlZ2lvbkxpc3QgdGV4dFJlZ2lvbnMgPSBjdXJyZW50RG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlpbnQgY3VycmVudFRleHRSZWdpb25JbmRleCA9IDE7Ci0KLQkJSVRleHRSZWdpb24gY3VycmVudFRleHRSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoY3VycmVudFRleHRSZWdpb25JbmRleCk7Ci0JCVN0cmluZyBjdXJyZW50VHlwZSA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJLy8gdGFnIG5hbWUgc2hvdWxkIGFsd2F5cyBiZSB0aGUgZmlyc3QgdGV4dCByZWdpb24KLQkJaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLmVxdWFscyhjdXJyZW50VHlwZSkpIHsKLQkJCUlUZXh0UmVnaW9uIG5leHRUZXh0UmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGN1cnJlbnRUZXh0UmVnaW9uSW5kZXggKyAxKTsKLQkJCVN0cmluZyBuZXh0VHlwZSA9IChuZXh0VGV4dFJlZ2lvbiAhPSBudWxsKSA/IG5leHRUZXh0UmVnaW9uLmdldFR5cGUoKSA6IG51bGw7Ci0JCQlpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFLmVxdWFscyhuZXh0VHlwZSkpIHsKLQkJCQkvLyBhbHJlYWR5IGF0IHRhZyBjbG9zZQotCQkJCWZvcm1hdFN0YXJ0VGFnV2l0aE5vQXR0cih0ZXh0RWRpdCwgY29uc3RyYWludHMsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgYXZhaWxhYmxlTGluZVdpZHRoLCBpbmRlbnRTdHJhdGVneSwgd2hpdGVzcGFjZVN0cmF0ZWd5LCBjdXJyZW50VGV4dFJlZ2lvbik7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFLmVxdWFscyhuZXh0VHlwZSkpIHsKLQkJCQkvLyBhbHJlYWR5IGF0IGVtcHR5IHRhZyBjbG9zZQotCQkJCWZvcm1hdEVtcHR5U3RhcnRUYWdXaXRoTm9BdHRyKHRleHRFZGl0LCBjb25zdHJhaW50cywgY3VycmVudERvY3VtZW50UmVnaW9uLCBwcmV2aW91c0RvY3VtZW50UmVnaW9uLCBhdmFpbGFibGVMaW5lV2lkdGgsIGluZGVudFN0cmF0ZWd5LCB3aGl0ZXNwYWNlU3RyYXRlZ3ksIGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSAoY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpICsgMik7Ci0JCQkJYm9vbGVhbiBhbGlnbkZpbmFsQnJhY2tldCA9IGdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldEFsaWduRmluYWxCcmFja2V0KCk7Ci0JCQkJYm9vbGVhbiBvbmVTcGFjZUluVGFnTmFtZSA9IGdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldFNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZygpOwotCQkJCWJvb2xlYW4gaW5kZW50TXVsdGlwbGVBdHRyaWJ1dGUgPSBnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKS5nZXRJbmRlbnRNdWx0aXBsZUF0dHJpYnV0ZXMoKTsKLQkJCQkvLyBpbmRpY2F0ZXMgaWYgdGFnIHNwYW5uZWQgbW9yZSB0aGFuIG9uZSBsaW5lCi0JCQkJYm9vbGVhbiBzcGFuTW9yZVRoYW4xTGluZSA9IGZhbHNlOwotCQkJCS8vIGluZGljYXRlcyBpZiBhbGwgYXR0cmlidXRlcyBzaG91bGQgYmUgaW5kZW50ZWQKLQkJCQlib29sZWFuIGluZGVudEFsbEF0dHJpYnV0ZXMgPSBmYWxzZTsKLQkJCQlpZiAoaW5kZW50TXVsdGlwbGVBdHRyaWJ1dGUpIHsKLQkJCQkJaW50IGF0dHJpYnV0ZXNDb3VudCA9IDA7Ci0JCQkJCWludCBpID0gMjsKLQkJCQkJd2hpbGUgKGkgPCB0ZXh0UmVnaW9ucy5zaXplKCkgJiYgYXR0cmlidXRlc0NvdW50IDwgMikgewotCQkJCQkJaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRS5lcXVhbHModGV4dFJlZ2lvbnMuZ2V0KGkpLmdldFR5cGUoKSkpCi0JCQkJCQkJKythdHRyaWJ1dGVzQ291bnQ7Ci0JCQkJCX0KLQkJCQkJaW5kZW50QWxsQXR0cmlidXRlcyA9IChhdHRyaWJ1dGVzQ291bnQgPiAxKTsKLQkJCQl9Ci0KLQkJCQl3aGlsZSAoKGN1cnJlbnRUZXh0UmVnaW9uSW5kZXggKyAxKSA8IHRleHRSZWdpb25zLnNpemUoKSkgewotCQkJCQluZXh0VGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChjdXJyZW50VGV4dFJlZ2lvbkluZGV4ICsgMSk7Ci0JCQkJCW5leHRUeXBlID0gbmV4dFRleHRSZWdpb24uZ2V0VHlwZSgpOwotCQkJCQlpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FLmVxdWFscyhuZXh0VHlwZSkpIHsKLQkJCQkJCWJvb2xlYW4gaW5kZW50QXR0cmlidXRlID0gaW5kZW50QWxsQXR0cmlidXRlczsKLQkJCQkJCWlmICghaW5kZW50QXR0cmlidXRlKQotCQkJCQkJCWluZGVudEF0dHJpYnV0ZSA9IHNob3VsZEluZGVudEJlZm9yZUF0dHJpYnV0ZShjb25zdHJhaW50cywgdGV4dFJlZ2lvbnMsIGF2YWlsYWJsZUxpbmVXaWR0aCwgY3VycmVudFRleHRSZWdpb25JbmRleCwgY3VycmVudFRleHRSZWdpb24sIG5leHRUZXh0UmVnaW9uKTsKLQkJCQkJCWlmIChpbmRlbnRBdHRyaWJ1dGUpIHsKLQkJCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBpbmRlbnRJZk5vdEFscmVhZHlJbmRlbnRlZCh0ZXh0RWRpdCwgaW5kZW50TGV2ZWwgKyAxLCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJCQkJCQlzcGFuTW9yZVRoYW4xTGluZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBvdGhlcndpc2UsIGluc2VydFNwYWNlQW5kQ29sbGFwc2UKLQkJCQkJCQlpbnNlcnRTcGFjZUFuZENvbGxhcHNlKHRleHRFZGl0LCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIGF2YWlsYWJsZUxpbmVXaWR0aCwgY3VycmVudFRleHRSZWdpb24pOwotCQkJCQkJCS8vIHVwZGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSAoY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpICsgMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFLmVxdWFscyhuZXh0VHlwZSkpIHsKLQkJCQkJCS8vIGlmIG5lZWQgdG8gYWxpZ24gYnJhY2tldCBvbiBuZXh0IGxpbmUsIGluZGVudAotCQkJCQkJaWYgKGFsaWduRmluYWxCcmFja2V0ICYmIHNwYW5Nb3JlVGhhbjFMaW5lKSB7Ci0JCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gaW5kZW50SWZOb3RBbHJlYWR5SW5kZW50ZWQodGV4dEVkaXQsIGluZGVudExldmVsLCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJCQkJCQktLWF2YWlsYWJsZUxpbmVXaWR0aDsgLy8gZm9yIHRhZyBjbG9zZSBpdHNlbGYKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIG90aGVyd2lzZSwganVzdCBkZWxldGUgc3BhY2UgYmVmb3JlIHRhZyBjbG9zZQotCQkJCQkJCWlmIChjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgPCBjdXJyZW50VGV4dFJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJCQkJCQlkZWxldGVUcmFpbGluZ1NwYWNlcyh0ZXh0RWRpdCwgY3VycmVudFRleHRSZWdpb24sIGN1cnJlbnREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSAoY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpICsgMSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gdXBkYXRlIGxpbmUgd2lkdGgKLQkJCQkJCWNvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVMaW5lV2lkdGgpOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRS5lcXVhbHMobmV4dFR5cGUpKSB7Ci0JCQkJCQlpbnQgdGV4dExlbmd0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJCWludCByZWdpb25MZW5ndGggPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQotCQkJCQkJYm9vbGVhbiB0aGVyZUFyZVNwYWNlcyA9IHRleHRMZW5ndGggPCByZWdpb25MZW5ndGg7Ci0JCQkJCQlpZiAoIW9uZVNwYWNlSW5UYWdOYW1lICYmIHRoZXJlQXJlU3BhY2VzKSB7Ci0JCQkJCQkJLy8gZGVsZXRlIGFueSB0cmFpbCBzcGFjZXMgYWZ0ZXIgdGFnIG5hbWUKLQkJCQkJCQlkZWxldGVUcmFpbGluZ1NwYWNlcyh0ZXh0RWRpdCwgY3VycmVudFRleHRSZWdpb24sIGN1cnJlbnREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoIC09IChjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgKyAyKTsKLQkJCQkJCX0KLQkJCQkJCS8vIGluc2VydCBhIHNwYWNlIGFuZCBjb2xsYXBzZSBPTkxZIElGIGl0J3Mgc3BlY2lmaWVkCi0JCQkJCQllbHNlIGlmIChvbmVTcGFjZUluVGFnTmFtZSkgewotCQkJCQkJCWluc2VydFNwYWNlQW5kQ29sbGFwc2UodGV4dEVkaXQsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgYXZhaWxhYmxlTGluZVdpZHRoLCBjdXJyZW50VGV4dFJlZ2lvbik7Ci0JCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoIC09IChjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgKyAzKTsKLQkJCQkJCX0KLQkJCQkJCS8vIHVwZGF0ZSBsaW5lIHdpZHRoCi0JCQkJCQljb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlTGluZVdpZHRoKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRS5lcXVhbHMoY3VycmVudFR5cGUpICYmIERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTLmVxdWFscyhuZXh0VHlwZSkpIHsKLQkJCQkJCQlpZiAoY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpIDwgY3VycmVudFRleHRSZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQkJCQkJZGVsZXRlVHJhaWxpbmdTcGFjZXModGV4dEVkaXQsIGN1cnJlbnRUZXh0UmVnaW9uLCBjdXJyZW50RG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCX0KLQkJCQkJCQkvLyB1cGRhdGUgYXZhaWxhYmxlIHdpZHRoCi0JCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoIC09IGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTLmVxdWFscyhjdXJyZW50VHlwZSkgJiYgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRS5lcXVhbHMobmV4dFR5cGUpKSB7Ci0JCQkJCQkJaWYgKGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSA8IGN1cnJlbnRUZXh0UmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJCQkJCWRlbGV0ZVRyYWlsaW5nU3BhY2VzKHRleHRFZGl0LCBjdXJyZW50VGV4dFJlZ2lvbiwgY3VycmVudERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gdXBkYXRlIGF2YWlsYWJsZSB3aWR0aAotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBvdGhlcndpc2UsIGluc2VydFNwYWNlQW5kQ29sbGFwc2UKLQkJCQkJCQlpbnNlcnRTcGFjZUFuZENvbGxhcHNlKHRleHRFZGl0LCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIGF2YWlsYWJsZUxpbmVXaWR0aCwgY3VycmVudFRleHRSZWdpb24pOwotCQkJCQkJCS8vIHVwZGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSAoY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpICsgMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY3VycmVudFRleHRSZWdpb24gPSBuZXh0VGV4dFJlZ2lvbjsKLQkJCQkJY3VycmVudFR5cGUgPSBuZXh0VHlwZTsKLQkJCQkJKytjdXJyZW50VGV4dFJlZ2lvbkluZGV4OwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyB1cGRhdGUgbGluZSB3aWR0aAotCQljb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlTGluZVdpZHRoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBGb3JtYXQgYW4gWE1MIGNvbW1lbnQgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdENvbW1lbnQoVGV4dEVkaXQgdGV4dEVkaXQsIFBvc2l0aW9uIGZvcm1hdFJhbmdlLCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgcGFyZW50Q29uc3RyYWludHMsIERPTVJlZ2lvbiBjdXJyZW50RE9NUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzUmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGN1cnJlbnRET01SZWdpb24uZG9jdW1lbnRSZWdpb247Ci0JCWludCBsaW5lV2lkdGggPSBwYXJlbnRDb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKSAtIGN1cnJlbnRSZWdpb24uZ2V0RnVsbFRleHQoKS5sZW5ndGgoKTsKLQkJLy8gRG9uJ3QgZm9ybWF0IGlmIHdlJ3JlIG5vdCBleGNlZWRpbmcgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoLCBvciBpZiB0aGUgd2hpdGVzcGFjZQotCQkvLyBzdHJhdGVneSBpcyB0byBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIC0gQnV0IHVwZGF0ZSBsaW5lIHdpZHRoLgotCQlpZihjdXJyZW50UmVnaW9uID09IG51bGwgfHwJWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFLmVxdWFscyhwYXJlbnRDb25zdHJhaW50cy5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKSkgfHwgIWZQcmVmZXJlbmNlcy5nZXRGb3JtYXRDb21tZW50VGV4dCgpKSB7Ci0JCQlwYXJlbnRDb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgobGluZVdpZHRoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUl0ZXJhdG9yIGl0ID0gY3VycmVudFJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJSVRleHRSZWdpb24gcHJldmlvdXMgPSBudWxsOwotCQlpZiAocHJldmlvdXNSZWdpb24gPT0gbnVsbCkKLQkJCXByZXZpb3VzUmVnaW9uID0gY3VycmVudFJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkvLyBJdGVyYXRlIG92ZXIgZWFjaCB0ZXh0IHJlZ2lvbiBvZiB0aGUgY29tbWVudAotCQlOb2RlIHBhcmVudCA9IGN1cnJlbnRET01SZWdpb24uZG9tTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gdGV4dCA9IChJVGV4dFJlZ2lvbikgaXQubmV4dCgpOwotCQkJU3RyaW5nIHR5cGUgPSB0ZXh0LmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTikgewotCQkJCWludCBpbmRlbnRMZXZlbCA9IChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpID8gMCA6IDE7Ci0JCQkJaW50IHdpZHRoID0gZm9ybWF0Q29tbWVudFN0YXJ0KHRleHRFZGl0LCBwYXJlbnRDb25zdHJhaW50cywgaW5kZW50TGV2ZWwsIGN1cnJlbnRSZWdpb24sIHByZXZpb3VzUmVnaW9uLCB0ZXh0KTsKLQkJCQlwYXJlbnRDb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgod2lkdGgpOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQpIHsKLQkJCQlpbnQgaW5kZW50TGV2ZWwgPSAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSA/IC0xIDogcGFyZW50Q29uc3RyYWludHMuZ2V0SW5kZW50TGV2ZWwoKTsKLQkJCQlmb3JtYXRDb21tZW50Q29udGVudCh0ZXh0RWRpdCwgcGFyZW50Q29uc3RyYWludHMsIGluZGVudExldmVsLCBjdXJyZW50UmVnaW9uLCBwcmV2aW91cywgdGV4dCk7Ci0JCQl9Ci0JCQlwcmV2aW91cyA9IHRleHQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZm9ybWF0Q29tbWVudENvbnRlbnQoVGV4dEVkaXQgdGV4dEVkaXQsIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBwYXJlbnRDb25zdHJhaW50cywgaW50IGluZGVudExldmVsLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24sIElUZXh0UmVnaW9uIHByZXZpb3VzLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IGxpbmVXaWR0aCA9IHBhcmVudENvbnN0cmFpbnRzLmdldEF2YWlsYWJsZUxpbmVXaWR0aCgpIC0gY3VycmVudFJlZ2lvbi5nZXRGdWxsVGV4dChwcmV2aW91cykubGVuZ3RoKCk7Ci0JCS8vIElmIHRoZXJlJ3MgbW9yZSB0ZXh0IHRoYW4gbGluZSB3aWR0aCBhdmFpbGFibGUsIGZvcm1hdAotCQlTdHJpbmcgdGV4dCA9IGN1cnJlbnRSZWdpb24uZ2V0RnVsbFRleHQocmVnaW9uKTsKLQkJY29tcHJlc3NDb250ZW50KHRleHRFZGl0LCBjdXJyZW50UmVnaW9uLCBjdXJyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbiksIGluZGVudExldmVsICsgMSwgbGluZVdpZHRoLCB0ZXh0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcHJlc3NDb250ZW50KFRleHRFZGl0IHRleHRFZGl0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgaW5kZW50TGV2ZWwsIGludCBsaW5lV2lkdGgsIFN0cmluZyB0ZXh0KSB7Ci0JCWludCBsZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOwotCQlpbnQgc3RhcnQgPSAwLCBlbmQgPSAwOwotCQljaGFyIGMgPSAwOwotCQlpbnQgcmVzdWx0TGVuZ3RoID0gMDsKLQkJYm9vbGVhbiBqb2luTGluZXMgPSBmUHJlZmVyZW5jZXMuZ2V0Sm9pbkNvbW1lbnRMaW5lcygpOwotCQlib29sZWFuIG9uT3duTGluZSA9IGZhbHNlOwotCi0JCVN0cmluZyBpbmRlbnQgPSBnZXRJbmRlbnRTdHJpbmcoaW5kZW50TGV2ZWwgKyAxKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQljID0gdGV4dC5jaGFyQXQoaSk7Ci0JCQkvLyBDb21wcmVzcyB3aGl0ZXNwYWNlIHVubGVzcyBpdHMgYSBsaW5lIGRlbGltaXRlciBhbmQgZm9ybWF0dGluZyBkb2VzIG5vdCBwZXJtaXQgam9pbmluZyBsaW5lcwotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQlpZiAoKGMgIT0gJ1xyJyAmJiBjIT0gJ1xuJykgfHwgam9pbkxpbmVzKSB7Ci0JCQkJCS8vIEp1c3QgY2FtZSBvZmYgb2YgYSB3b3JkCi0JCQkJCWlmIChzdGFydCA9PSBlbmQpIHsKLQkJCQkJCXN0YXJ0ID0gZW5kID0gaTsKLQkJCQkJfQotCQkJCQllbmQrKzsKLQkJCQkJcmVzdWx0TGVuZ3RoKys7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBjb3JyZWN0IHRoZSBpbmRlbnQgb2YgdGhpcyBsaW5lCi0JCQkJCWxpbmVXaWR0aCA9IGZQcmVmZXJlbmNlcy5nZXRNYXhMaW5lV2lkdGgoKTsKLQkJCQkJcmVzdWx0TGVuZ3RoID0gMDsKLQkJCQkJb25Pd25MaW5lID0gdHJ1ZTsKLQotCQkJCQkvLyBDb21wcmVzcyBhbnkgd2hpdGVzcGFjZSBiZWZvcmUgdGhlIGxpbmUgZGVsaW1pdGVyCi0JCQkJCWlmIChzdGFydCAhPSBlbmQpIHsKLQkJCQkJCWludCByZXBsYWNlTGVuZ3RoID0gZW5kIC0gc3RhcnQ7Ci0JCQkJCQl0ZXh0RWRpdC5hZGRDaGlsZChuZXcgUmVwbGFjZUVkaXQoc3RhcnQgKyBzdGFydE9mZnNldCwgcmVwbGFjZUxlbmd0aCwgRU1QVFkpKTsKLQkJCQkJCXN0YXJ0ID0gZW5kID0gaTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIFRyYW5zaXRpb25lZCB0byBhIG5ldyB3b3JkCi0JCQkJaWYgKHN0YXJ0ICE9IGVuZCkgewotCQkJCQlpbnQgcmVwbGFjZUxlbmd0aCA9IGVuZCAtIHN0YXJ0OwotCQkJCQlpZiAob25Pd25MaW5lKSB7Ci0JCQkJCQkvLyBJZiBjb250ZW50IGlzIG9uIGl0cyBvd24gbGluZSwgcmVwbGFjZSBsZWFkaW5nIHdoaXRlc3BhY2Ugd2l0aCBwcm9wZXIgaW5kZW50Ci0JCQkJCQl0ZXh0RWRpdC5hZGRDaGlsZChuZXcgUmVwbGFjZUVkaXQoc3RhcnQgKyBzdGFydE9mZnNldCwgcmVwbGFjZUxlbmd0aCwgaW5kZW50KSk7Ci0JCQkJCQlyZXN1bHRMZW5ndGggLT0gKHJlcGxhY2VMZW5ndGggLSBpbmRlbnQubGVuZ3RoKCkpOwotCQkJCQkJb25Pd25MaW5lID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoIShyZXBsYWNlTGVuZ3RoID09IDEgJiYgdGV4dC5jaGFyQXQoc3RhcnQpID09ICcgJykpIHsKLQkJCQkJCXRleHRFZGl0LmFkZENoaWxkKG5ldyBSZXBsYWNlRWRpdChzdGFydCArIHN0YXJ0T2Zmc2V0LCByZXBsYWNlTGVuZ3RoLCBTUEFDRSkpOwotCQkJCQkJcmVzdWx0TGVuZ3RoIC09IChyZXBsYWNlTGVuZ3RoIC0gMSk7Ci0JCQkJCX0KLQkJCQkJc3RhcnQgPSBlbmQgPSBpOwotCQkJCQkvLyBNYWtlIHN1cmUgdGhlIHdvcmQgc3RhcnRzIG9uIGEgbmV3IGxpbmUKLQkJCQkJaWYgKHJlc3VsdExlbmd0aCA+IGxpbmVXaWR0aCkgewotCQkJCQkJbGluZVdpZHRoID0gZlByZWZlcmVuY2VzLmdldE1heExpbmVXaWR0aCgpOwotCQkJCQkJcmVzdWx0TGVuZ3RoID0gMDsKLQkJCQkJCXRleHRFZGl0LmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KHN0YXJ0ICsgc3RhcnRPZmZzZXQsIGdldExpbmVEZWxpbWl0ZXIocmVnaW9uKSArIGluZGVudCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIFdvcmQgaXMgaW1tZWRpYXRlbHkgYWZ0ZXIgbGluZSBkZWxpbWl0ZXJzLCBpbmRlbnQgYXBwcm9wcmlhdGVseQotCQkJCWlmIChvbk93bkxpbmUpIHsKLQkJCQkJdGV4dEVkaXQuYWRkQ2hpbGQobmV3IEluc2VydEVkaXQoaSArIHN0YXJ0T2Zmc2V0LCBpbmRlbnQpKTsKLQkJCQkJb25Pd25MaW5lID0gZmFsc2U7Ci0JCQkJfQotCQkJCXJlc3VsdExlbmd0aCsrOwotCQkJfQotCQl9Ci0KLQkJLy8gQ2xlYW4gdXAgYW55IGRhbmdsaW5nIHdoaXRlc3BhY2UKLQkJaW50IHJlcGxhY2VMZW5ndGggPSBlbmQgLSBzdGFydDsKLQkJaW5kZW50ID0gZ2V0SW5kZW50U3RyaW5nKGluZGVudExldmVsKTsKLQkJaWYgKHJlcGxhY2VMZW5ndGggPT0gMCkgeyAvLyBObyB0cmFpbGluZyB3aGl0ZXNwYWNlCi0JCQl0ZXh0RWRpdC5hZGRDaGlsZChuZXcgSW5zZXJ0RWRpdChsZW5ndGggKyBzdGFydE9mZnNldCwgKG9uT3duTGluZSkgPyBpbmRlbnQgOiBTUEFDRSkpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIHdoaXRlc3BhY2UgPSB0ZXh0LnN1YnN0cmluZyhzdGFydCk7Ci0JCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSAob25Pd25MaW5lKSA/IGluZGVudCA6IFNQQUNFOwotCQkJaWYgKCF3aGl0ZXNwYWNlLmVxdWFscyhyZXBsYWNlbWVudCkpIHsKLQkJCQl0ZXh0RWRpdC5hZGRDaGlsZChuZXcgUmVwbGFjZUVkaXQoc3RhcnQgKyBzdGFydE9mZnNldCwgcmVwbGFjZUxlbmd0aCwgcmVwbGFjZW1lbnQpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGZvcm1hdENvbW1lbnRTdGFydChUZXh0RWRpdCB0ZXh0RWRpdCwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHBhcmVudENvbnN0cmFpbnRzLCBpbnQgaW5kZW50TGV2ZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c1JlZ2lvbiwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWludCBsaW5lV2lkdGggPSBwYXJlbnRDb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKTsKLQkJaWYgKHByZXZpb3VzUmVnaW9uIT1udWxsJiYoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVC5lcXVhbHMocHJldmlvdXNSZWdpb24uZ2V0VHlwZSgpKSkpIHsKLQkJCVN0cmluZyBwcmV2aW91c1RleHQgPSBwcmV2aW91c1JlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQkJU3RyaW5nIHRyYWlsaW5nV2hpdGVzcGFjZSA9IGdldFRyYWlsaW5nV2hpdGVzcGFjZShwcmV2aW91c1RleHQpOwotCQkJU3RyaW5nIGRlbGltaXRlcnMgPSBleHRyYWN0TGluZURlbGltaXRlcnModHJhaWxpbmdXaGl0ZXNwYWNlLCBwcmV2aW91c1JlZ2lvbik7Ci0JCQlpZiAoZGVsaW1pdGVycyAhPSBudWxsICYmIGRlbGltaXRlcnMubGVuZ3RoKCkgPiAwKXsvLyAmJiBwcmV2aW91c1RleHQubGVuZ3RoKCkgPT0gdHJhaWxpbmdXaGl0ZXNwYWNlLmxlbmd0aCgpKSB7Ci0JCQkJLy8gRm9ybWF0IHRoZSBjb21tZW50IGlmIGl0J3Mgb24gYSBuZXcgbGluZQotCQkJCWludCBvZmZzZXQgPSBwcmV2aW91c1JlZ2lvbi5nZXRFbmQoKSAtIHRyYWlsaW5nV2hpdGVzcGFjZS5sZW5ndGgoKTsKLQkJCQlsaW5lV2lkdGggPSBpbmRlbnRJZk5vdEFscmVhZHlJbmRlbnRlZCh0ZXh0RWRpdCwgY3VycmVudFJlZ2lvbiwgcGFyZW50Q29uc3RyYWludHMuZ2V0SW5kZW50TGV2ZWwoKSArIGluZGVudExldmVsLCBvZmZzZXQsIHRyYWlsaW5nV2hpdGVzcGFjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpbmVXaWR0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGVpdGhlciBhIFN0cmluZyBvZiB3aGl0ZXNwYWNlIG9yIGNoYXJhY3RlcnMgZGVwZW5kaW5nIG9uCi0JICogZm9yV2hpdGVzcGFjZQotCSAqIAotCSAqIEBwYXJhbSBmdWxsVGV4dEFycmF5Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBhcnJheSB0byBsb29rIGluCi0JICogQHBhcmFtIHRleHRPZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBzdGFydCBvZmZzZXQgdG8gc3RhcnQgc2VhcmNoaW5nCi0JICogQHBhcmFtIGZvcldoaXRlc3BhY2UKLQkgKiAgICAgICAgICAgIHRydWUgaWYgc2hvdWxkIHJldHVybiB3aGl0ZXNwYWNlcywgZmFsc2Ugb3RoZXJ3aXNlCi0JICogQHJldHVybiBhIFN0cmluZyBvZiBlaXRoZXIgYWxsIHdoaXRlc3BhY2Ugb3IgYWxsIGNoYXJhY3RlcnMuIE5ldmVyCi0JICogICAgICAgICByZXR1cm5zIG51bGwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDaGFyYWN0ZXJSdW4oY2hhcltdIGZ1bGxUZXh0QXJyYXksIGludCB0ZXh0T2Zmc2V0LCBib29sZWFuIGZvcldoaXRlc3BhY2UpIHsKLQkJU3RyaW5nQnVmZmVyIGNoYXJhY3RlclJ1biA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYm9vbGVhbiBub25DaGFyYWN0ZXJGb3VuZCA9IGZhbHNlOwotCQl3aGlsZSAodGV4dE9mZnNldCA8IGZ1bGxUZXh0QXJyYXkubGVuZ3RoICYmICFub25DaGFyYWN0ZXJGb3VuZCkgewotCQkJY2hhciBjID0gZnVsbFRleHRBcnJheVt0ZXh0T2Zmc2V0XTsKLQkJCWJvb2xlYW4gaXNXaGl0ZXNwYWNlID0gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKTsKLQkJCWlmICgoZm9yV2hpdGVzcGFjZSAmJiBpc1doaXRlc3BhY2UpIHx8ICghZm9yV2hpdGVzcGFjZSAmJiAhaXNXaGl0ZXNwYWNlKSkKLQkJCQljaGFyYWN0ZXJSdW4uYXBwZW5kKGMpOwotCQkJZWxzZQotCQkJCW5vbkNoYXJhY3RlckZvdW5kID0gdHJ1ZTsKLQkJCSsrdGV4dE9mZnNldDsKLQkJfQotCQlyZXR1cm4gY2hhcmFjdGVyUnVuLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFRyYWlsaW5nV2hpdGVzcGFjZShTdHJpbmcgdGV4dCkgewotCQlTdHJpbmdCdWZmZXIgd2hpdGVzcGFjZVJ1biA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGluZGV4ID0gdGV4dC5sZW5ndGgoKSAtIDE7Ci0JCXdoaWxlKGluZGV4ID49IDApIHsKLQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KGluZGV4LS0pOwotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpCi0JCQkJd2hpdGVzcGFjZVJ1bi5pbnNlcnQoMCwgYyk7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHdoaXRlc3BhY2VSdW4udG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnRTdHJpbmcoaW50IGluZGVudExldmVsKSB7Ci0JCVN0cmluZ0J1ZmZlciBpbmRlbnRTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBpbmRlbnQgPSBnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKS5nZXRPbmVJbmRlbnQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRMZXZlbDsgKytpKSB7Ci0JCQlpbmRlbnRTdHJpbmcuYXBwZW5kKGluZGVudCk7Ci0JCX0KLQkJcmV0dXJuIGluZGVudFN0cmluZy50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMgZ2V0Rm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkgewotCQlpZiAoZlByZWZlcmVuY2VzID09IG51bGwpCi0JCQlmUHJlZmVyZW5jZXMgPSBuZXcgWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBmUHJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9ybWF0dGluZ1ByZWZlcmVuY2VzKFhNTEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcykgewotCQlmUHJlZmVyZW5jZXMgPSBwcmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBJbmRlbnQgaWYgd2hpdGVzcGFjZVJ1biBkb2VzIG5vdCBhbHJlYWR5IGNvbnRhaW4gYW4gaW5kZW50Ci0JICogCi0JICogQHBhcmFtIHRleHRFZGl0Ci0JICogQHBhcmFtIGluZGVudExldmVsCi0JICogQHBhcmFtIGluZGVudFN0YXJ0T2Zmc2V0Ci0JICogQHBhcmFtIG1heEF2YWlsYWJsZUxpbmVXaWR0aAotCSAqIEBwYXJhbSB3aGl0ZXNwYWNlUnVuCi0JICogQHJldHVybiBuZXcgYXZhaWxhYmxlIGxpbmUgd2lkdGggdXAgdG8gd2hlcmUgaW5kZW50ZWQKLQkgKi8KLQlwcml2YXRlIGludCBpbmRlbnRJZk5vdEFscmVhZHlJbmRlbnRlZChUZXh0RWRpdCB0ZXh0RWRpdCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50UmVnaW9uLCBpbnQgaW5kZW50TGV2ZWwsIGludCBpbmRlbnRTdGFydE9mZnNldCwgU3RyaW5nIHdoaXRlc3BhY2VSdW4pIHsKLQkJaW50IG1heEF2YWlsYWJsZUxpbmVXaWR0aCA9IGdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldE1heExpbmVXaWR0aCgpOwotCi0JCWludCBhdmFpbGFibGVMaW5lV2lkdGg7Ci0JCVN0cmluZyBpbmRlbnRTdHJpbmcgPSBnZXRJbmRlbnRTdHJpbmcoaW5kZW50TGV2ZWwpOwotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IGdldExpbmVEZWxpbWl0ZXIoY3VycmVudFJlZ2lvbik7Ci0JCVN0cmluZyBuZXdMaW5lQW5kSW5kZW50ID0gbGluZURlbGltaXRlciArIGluZGVudFN0cmluZzsKLQkJCi0JCVRleHRFZGl0IGluZGVudGF0aW9uID0gbnVsbDsKLQkJCi0JCS8vIGlmIG5vdCBhbHJlYWR5IGNvcnJlY3RseSBpbmRlbnRlZAotCQlpZiAoIW5ld0xpbmVBbmRJbmRlbnQuZXF1YWxzKHdoaXRlc3BhY2VSdW4pKSB7Ci0JCQlpZiAoZ2V0Rm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCkpIHsKLQkJCQlpZiAod2hpdGVzcGFjZVJ1biAhPSBudWxsKSB7Ci0JCQkJCS8vIHJlcGxhY2UgZXhpc3Rpbmcgd2hpdGVzcGFjZSBydW4KLQkJCQkJaW5kZW50YXRpb24gPSBuZXcgUmVwbGFjZUVkaXQoaW5kZW50U3RhcnRPZmZzZXQsIHdoaXRlc3BhY2VSdW4ubGVuZ3RoKCksIG5ld0xpbmVBbmRJbmRlbnQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8ganVzdCBpbnNlcnQgY29ycmVjdCBpbmRlbnQKLQkJCQkJaW5kZW50YXRpb24gPSBuZXcgSW5zZXJ0RWRpdChpbmRlbnRTdGFydE9mZnNldCwgbmV3TGluZUFuZEluZGVudCk7Ci0JCQkJfQotCQkJfQotCQkJLy8gS2VlcCB0aGUgZW1wdHkgbGluZXMKLQkJCWVsc2UgewotCQkJCS8vIGp1c3QgaW5zZXJ0IGNvcnJlY3QgaW5kZW50Ci0JCQkJaWYod2hpdGVzcGFjZVJ1biA9PSBudWxsKQotCQkJCQlpbmRlbnRhdGlvbiA9IG5ldyBJbnNlcnRFZGl0KGluZGVudFN0YXJ0T2Zmc2V0LCBuZXdMaW5lQW5kSW5kZW50KTsKLQkJCQkvLyBOZWVkIHRvIHByZXNlcnZlIHRoZSBudW1iZXIgb2YgZW1wdHkgbGluZXMsIGJ1dCBzdGlsbCBpbmRlbnQgb24gdGhlIGN1cnJlbnQgbGluZSBwcm9wZXJseQotCQkJCWVsc2UgewotCQkJCQlTdHJpbmcgZXhpc3RpbmdEZWxpbWl0ZXJzID0gZXh0cmFjdExpbmVEZWxpbWl0ZXJzKHdoaXRlc3BhY2VSdW4sIGN1cnJlbnRSZWdpb24pOwotCQkJCQlpZihleGlzdGluZ0RlbGltaXRlcnMgIT0gbnVsbCAmJiBleGlzdGluZ0RlbGltaXRlcnMubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlTdHJpbmcgZm9ybWF0dGVkID0gZXhpc3RpbmdEZWxpbWl0ZXJzICsgaW5kZW50U3RyaW5nOwotCQkJCQkJLy8gRG9uJ3QgcGVyZm9ybSBhIHJlcGxhY2UgaWYgdGhlIGZvcm1hdHRlZCBzdHJpbmcgaXMgdGhlIHNhbWUgYXMgdGhlIGV4aXN0aW5nIHdoaXRlc3BhY2VSdW4KLQkJCQkJCWlmKCFmb3JtYXR0ZWQuZXF1YWxzKHdoaXRlc3BhY2VSdW4pKQotCQkJCQkJCWluZGVudGF0aW9uID0gbmV3IFJlcGxhY2VFZGl0KGluZGVudFN0YXJ0T2Zmc2V0LCB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpLCBmb3JtYXR0ZWQpOwotCQkJCQl9Ci0JCQkJCS8vIE5vIGJsYW5rIGxpbmVzIHRvIHByZXNlcnZlIC0gY29ycmVjdCB0aGUgaW5kZW50Ci0JCQkJCWVsc2UKLQkJCQkJCWluZGVudGF0aW9uID0gbmV3IFJlcGxhY2VFZGl0KGluZGVudFN0YXJ0T2Zmc2V0LCB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpLCBuZXdMaW5lQW5kSW5kZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKGluZGVudGF0aW9uICE9IG51bGwpCi0JCQl0ZXh0RWRpdC5hZGRDaGlsZChpbmRlbnRhdGlvbik7Ci0JCS8vIHVwZGF0ZSBsaW5lIHdpZHRoCi0JCWF2YWlsYWJsZUxpbmVXaWR0aCA9IG1heEF2YWlsYWJsZUxpbmVXaWR0aCAtIGluZGVudFN0cmluZy5sZW5ndGgoKTsKLQkJcmV0dXJuIGF2YWlsYWJsZUxpbmVXaWR0aDsKLQl9Ci0KLQlwcml2YXRlIGludCBpbmRlbnRJZk5vdEFscmVhZHlJbmRlbnRlZChUZXh0RWRpdCB0ZXh0RWRpdCwgaW50IGluZGVudExldmVsLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gY3VycmVudFRleHRSZWdpb24pIHsKLQkJLy8gaW5kZW50IGlmIG5vdCBhbHJlYWR5IGluZGVudGVkCi0JCWludCB0ZXh0TGVuZ3RoID0gY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQlpbnQgcmVnaW9uTGVuZ3RoID0gY3VycmVudFRleHRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWludCBpbmRlbnRTdGFydE9mZnNldCA9IGN1cnJlbnREb2N1bWVudFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJU3RyaW5nIGZ1bGxUZXh0ID0gY3VycmVudERvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJU3RyaW5nIHdoaXRlc3BhY2VSdW4gPSBmdWxsVGV4dC5zdWJzdHJpbmcodGV4dExlbmd0aCwgcmVnaW9uTGVuZ3RoKTsKLQotCQkvLyB1cGRhdGUgbGluZSB3aWR0aAotCQlpbnQgYXZhaWxhYmxlTGluZVdpZHRoID0gaW5kZW50SWZOb3RBbHJlYWR5SW5kZW50ZWQodGV4dEVkaXQsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgaW5kZW50TGV2ZWwsIGluZGVudFN0YXJ0T2Zmc2V0LCB3aGl0ZXNwYWNlUnVuKTsKLQkJcmV0dXJuIGF2YWlsYWJsZUxpbmVXaWR0aDsKLQl9Ci0KLQlwcml2YXRlIGludCBpbmRlbnRJZlBvc3NpYmxlKFRleHRFZGl0IHRleHRFZGl0LCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgdGhpc0NvbnN0cmFpbnRzLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c0RvY3VtZW50UmVnaW9uLCBTdHJpbmcgd2hpdGVzcGFjZVN0cmF0ZWd5LCBTdHJpbmcgaW5kZW50U3RyYXRlZ3ksIGJvb2xlYW4gYWRkSW5kZW50KSB7Ci0JCWludCBhdmFpbGFibGVMaW5lV2lkdGggPSAtMTsKLQkJLy8gaWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgZG9jdW1lbnQgcmVnaW9uLCB0aGVyZSBpcyBubyBuZWVkIHRvIGluZGVudAotCQkvLyBiZWNhdXNlIHdlJ3JlIGF0IGJlZ2lubmluZyBvZiBkb2N1bWVudAotCQlpZiAocHJldmlvdXNEb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGF2YWlsYWJsZUxpbmVXaWR0aDsKLQotCQkvLyBvbmx5IGluZGVudCBpZiBpZ25vcmluZyB3aGl0ZXNwYWNlIG9yIGlmIGNvbGxhcHNpbmcgYW5kCi0JCS8vIHRoZXJlIHdhcyBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGJlZm9yZSB0aGlzIHJlZ2lvbgotCQlib29sZWFuIGNhbkluZGVudCA9IGZhbHNlOwotCQlTdHJpbmcgcHJldmlvdXNSZWdpb25GdWxsVGV4dCA9IG51bGw7Ci0JCVN0cmluZyBwcmV2aW91c1JlZ2lvblR5cGUgPSBudWxsOwotCi0JCWlmICgoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklHTk9SRS5lcXVhbHMod2hpdGVzcGFjZVN0cmF0ZWd5KSkgfHwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklHTk9SRUFORFRSSU0uZXF1YWxzKHdoaXRlc3BhY2VTdHJhdGVneSkpIHsKLQkJCS8vIGlmIGlnbm9yaW5nLCBuZWVkIHRvIGNoZWNrIGlmIHByZXZpb3VzIHJlZ2lvbiB3YXMgY2RhdGEKLQkJCXByZXZpb3VzUmVnaW9uVHlwZSA9IHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQuZXF1YWxzKHByZXZpb3VzUmVnaW9uVHlwZSkpCi0JCQkJY2FuSW5kZW50ID0gZmFsc2U7Ci0JCQllbHNlCi0JCQkJY2FuSW5kZW50ID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuQ09MTEFQU0UuZXF1YWxzKHdoaXRlc3BhY2VTdHJhdGVneSkpIHsKLQkJCS8vIGlmIGNvbGxhcHNpbmcsIG5lZWQgdG8gY2hlY2sgaWYgcHJldmlvdXMgcmVnaW9uIGVuZGVkIGluIGEKLQkJCS8vIHdoaXRlc3BhY2UKLQkJCXByZXZpb3VzUmVnaW9uVHlwZSA9IHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQuZXF1YWxzKHByZXZpb3VzUmVnaW9uVHlwZSkpIHsKLQkJCQlwcmV2aW91c1JlZ2lvbkZ1bGxUZXh0ID0gcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQkJCWludCBsZW5ndGggPSBwcmV2aW91c1JlZ2lvbkZ1bGxUZXh0Lmxlbmd0aCgpOwotCQkJCWlmIChsZW5ndGggPiAxKQotCQkJCQljYW5JbmRlbnQgPSBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHByZXZpb3VzUmVnaW9uRnVsbFRleHQuY2hhckF0KGxlbmd0aCAtIDEpKTsKLQkJCX0KLQkJfQotCQlpZiAoY2FuSW5kZW50KSB7Ci0JCQlpbnQgaW5kZW50U3RhcnRPZmZzZXQgPSBjdXJyZW50RG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCVN0cmluZyB3aGl0ZXNwYWNlUnVuID0gbnVsbDsKLQotCQkJLy8gZ2V0IHByZXZpb3VzIHJlZ2lvbiB0eXBlIGlmIGl0IHdhcyBub3QgcHJldmlvdXNseSByZXRyaWV2ZWQKLQkJCWlmIChwcmV2aW91c1JlZ2lvblR5cGUgPT0gbnVsbCkKLQkJCQlwcmV2aW91c1JlZ2lvblR5cGUgPSBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFR5cGUoKTsKLQotCQkJLy8gZ2V0IHByZXZpb3VzIHJlZ2lvbidzIHRleHQgaWYgaXQgd2FzIG5vdCBwcmV2aW91c2x5IHJldHJpZXZlZAotCQkJaWYgKHByZXZpb3VzUmVnaW9uRnVsbFRleHQgPT0gbnVsbCAmJiBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5ULmVxdWFscyhwcmV2aW91c1JlZ2lvblR5cGUpKQotCQkJCXByZXZpb3VzUmVnaW9uRnVsbFRleHQgPSBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0KLQkJCS8vIGlmIHByZXZpb3VzIHJlZ2lvbiB3YXMgb25seSB3aGl0ZXNwYWNlLCB0aGlzIG1heQotCQkJLy8gYWxyZWFkeSBiZSBpbmRlbnRlZCwgc28gbmVlZCB0byBtYWtlIHN1cmUKLQkJCWlmICgocHJldmlvdXNSZWdpb25GdWxsVGV4dCAhPSBudWxsKSAmJiAocHJldmlvdXNSZWdpb25GdWxsVGV4dC50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQlpbmRlbnRTdGFydE9mZnNldCA9IHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQl3aGl0ZXNwYWNlUnVuID0gcHJldmlvdXNSZWdpb25GdWxsVGV4dDsKLQkJCX0KLQkJCWlmICgocHJldmlvdXNSZWdpb25GdWxsVGV4dCAhPSBudWxsKSAmJiAod2hpdGVzcGFjZVJ1biA9PSBudWxsKSAmJiAhZ2V0Rm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCkpIHsKLQkJCQl3aGl0ZXNwYWNlUnVuID0gZ2V0VHJhaWxpbmdXaGl0ZXNwYWNlKHByZXZpb3VzUmVnaW9uRnVsbFRleHQpOwotCQkJCWluZGVudFN0YXJ0T2Zmc2V0ID0gcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIHdoaXRlc3BhY2VSdW4ubGVuZ3RoKCk7Ci0JCQl9Ci0KLQkJCWludCBpbmRlbnRMZXZlbCA9IHRoaXNDb25zdHJhaW50cy5nZXRJbmRlbnRMZXZlbCgpOwotCQkJaWYgKGFkZEluZGVudCAmJiBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSU5ERU5ULmVxdWFscyhpbmRlbnRTdHJhdGVneSkpIHsKLQkJCQkrK2luZGVudExldmVsOwotCQkJCXRoaXNDb25zdHJhaW50cy5zZXRJbmRlbnRMZXZlbChpbmRlbnRMZXZlbCk7Ci0JCQl9Ci0KLQkJCS8vIGluZGVudCBpZiBub3QgYWxyZWFkeSBpbmRlbnRlZAotCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gaW5kZW50SWZOb3RBbHJlYWR5SW5kZW50ZWQodGV4dEVkaXQsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgaW5kZW50TGV2ZWwsIGluZGVudFN0YXJ0T2Zmc2V0LCB3aGl0ZXNwYWNlUnVuKTsKLQkJfQotCQlyZXR1cm4gYXZhaWxhYmxlTGluZVdpZHRoOwotCX0KLQotCS8qKgotCSAqIEFsbG93IGV4YWN0bHkgb25lIHdoaXRlc3BhY2UgaW4gY3VycmVudFRleHRSZWdpb24uIElmIHRoZXJlIGFyZSBtb3JlLAotCSAqIGNvbGxhcHNlIHRvIG9uZS4gSWYgdGhlcmUgYXJlIG5vbmUsIGluc2VydCBvbmUuCi0JICogCi0JICogQHBhcmFtIHRleHRFZGl0Ci0JICogQHBhcmFtIGN1cnJlbnREb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSBhdmFpbGFibGVMaW5lV2lkdGgKLQkgKiBAcGFyYW0gY3VycmVudFRleHRSZWdpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0U3BhY2VBbmRDb2xsYXBzZShUZXh0RWRpdCB0ZXh0RWRpdCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50RG9jdW1lbnRSZWdpb24sIGludCBhdmFpbGFibGVMaW5lV2lkdGgsIElUZXh0UmVnaW9uIGN1cnJlbnRUZXh0UmVnaW9uKSB7Ci0JCWludCB0ZXh0TGVuZ3RoID0gY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQlpbnQgcmVnaW9uTGVuZ3RoID0gY3VycmVudFRleHRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWJvb2xlYW4gdGhlcmVBcmVTcGFjZXMgPSB0ZXh0TGVuZ3RoIDwgcmVnaW9uTGVuZ3RoOwotCQlpbnQgc3BhY2VzU3RhcnRPZmZzZXQgPSBjdXJyZW50RG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY3VycmVudFRleHRSZWdpb24pICsgdGV4dExlbmd0aDsKLQotCQlpZiAodGhlcmVBcmVTcGFjZXMpIHsKLQkJCVN0cmluZyBmdWxsVGFnTmFtZSA9IGN1cnJlbnREb2N1bWVudFJlZ2lvbi5nZXRGdWxsVGV4dChjdXJyZW50VGV4dFJlZ2lvbik7Ci0JCQlTdHJpbmcgd2hpdGVzcGFjZVJ1biA9IGZ1bGxUYWdOYW1lLnN1YnN0cmluZyh0ZXh0TGVuZ3RoLCByZWdpb25MZW5ndGgpOwotCQkJY29sbGFwc2VTcGFjZXModGV4dEVkaXQsIHNwYWNlc1N0YXJ0T2Zmc2V0LCBhdmFpbGFibGVMaW5lV2lkdGgsIHdoaXRlc3BhY2VSdW4pOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gaW5zZXJ0IGEgc3BhY2UKLQkJCUluc2VydEVkaXQgaW5zZXJ0RWRpdCA9IG5ldyBJbnNlcnRFZGl0KHNwYWNlc1N0YXJ0T2Zmc2V0LCBTUEFDRSk7Ci0JCQl0ZXh0RWRpdC5hZGRDaGlsZChpbnNlcnRFZGl0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRJbmRlbnRCZWZvcmVBdHRyaWJ1dGUoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzLCBJVGV4dFJlZ2lvbkxpc3QgdGV4dFJlZ2lvbnMsIGludCBhdmFpbGFibGVMaW5lV2lkdGgsIGludCBjdXJyZW50VGV4dFJlZ2lvbkluZGV4LCBJVGV4dFJlZ2lvbiBjdXJyZW50VGV4dFJlZ2lvbiwgSVRleHRSZWdpb24gbmV4dFRleHRSZWdpb24pIHsKLQkJYm9vbGVhbiBpbmRlbnRBdHRyaWJ1dGUgPSBmYWxzZTsKLQotCQkvLyBsb29rIGFoZWFkIHRvIHNlZSBpZiBnb2luZyB0byBoaXQgbWF4IGxpbmUgd2lkdGgKLQkJLy8gc29tZXRoaW5nIGF0dHJOYW1lCi0JCWludCBjdXJyZW50V2lkdGggPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgKyBuZXh0VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgKyAxOwotCQlpZiAoY3VycmVudFdpZHRoID4gYXZhaWxhYmxlTGluZVdpZHRoKQotCQkJaW5kZW50QXR0cmlidXRlID0gdHJ1ZTsKLQkJZWxzZSB7Ci0JCQlpZiAoKGN1cnJlbnRUZXh0UmVnaW9uSW5kZXggKyAyKSA8IHRleHRSZWdpb25zLnNpemUoKSkgewotCQkJCS8vIHN0aWxsIG9rYXksIHNvIHRyeSBuZXh0IHJlZ2lvbgotCQkJCS8vIHNvbWV0aGluZyBhdHRyTmFtZT0KLQkJCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGN1cnJlbnRUZXh0UmVnaW9uSW5kZXggKyAyKTsKLQkJCQlpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMuZXF1YWxzKHRleHRSZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJCQkrK2N1cnJlbnRXaWR0aDsKLQkJCQkJaWYgKGN1cnJlbnRXaWR0aCA+IGF2YWlsYWJsZUxpbmVXaWR0aCkKLQkJCQkJCWluZGVudEF0dHJpYnV0ZSA9IHRydWU7Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKChjdXJyZW50VGV4dFJlZ2lvbkluZGV4ICsgMykgPCB0ZXh0UmVnaW9ucy5zaXplKCkpIHsKLQkJCQkJCQkvLyBzdGlsbCBva2F5LCBzbyB0cnkgbmV4dCByZWdpb24KLQkJCQkJCQkvLyBzb21ldGhpbmcgYXR0ck5hbWU9YXR0clZhbHVlCi0JCQkJCQkJdGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChjdXJyZW50VGV4dFJlZ2lvbkluZGV4ICsgMyk7Ci0JCQkJCQkJaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUuZXF1YWxzKHRleHRSZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJCQkJCQljdXJyZW50V2lkdGggPSArdGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQkJCWlmIChjdXJyZW50V2lkdGggPiBhdmFpbGFibGVMaW5lV2lkdGgpCi0JCQkJCQkJCQlpbmRlbnRBdHRyaWJ1dGUgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZW50QXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSBwcm92aWRlZCBpbmZvcm1hdGlvbiAocGFyZW50Q29uc3RyYWludHMgJiBjdXJyZW50RE9NUmVnaW9uKSwKLQkgKiB1cGRhdGUgdGhlIGZvcm1hdHRpbmcgY29uc3RyYWludHMgKGZvciB0aGlzICYgY2hpbGQpCi0JICogCi0JICogQHBhcmFtIHBhcmVudENvbnN0cmFpbnRzCi0JICogICAgICAgICAgICBjYW4gYmUgbnVsbAotCSAqIEBwYXJhbSB0aGlzQ29uc3RyYWludHMKLQkgKiAgICAgICAgICAgIGNhbiBiZSBudWxsCi0JICogQHBhcmFtIGNoaWxkQ29uc3RyYWludHMKLQkgKiAgICAgICAgICAgIGNhbiBiZSBudWxsCi0JICogQHBhcmFtIGN1cnJlbnRET01SZWdpb24KLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRm9ybWF0dGluZ0NvbnN0cmFpbnRzKFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBwYXJlbnRDb25zdHJhaW50cywgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHRoaXNDb25zdHJhaW50cywgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIGNoaWxkQ29uc3RyYWludHMsIERPTVJlZ2lvbiBjdXJyZW50RE9NUmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGN1cnJlbnRET01SZWdpb24uZG9jdW1lbnRSZWdpb247Ci0JCUlET01Ob2RlIGN1cnJlbnROb2RlID0gY3VycmVudERPTVJlZ2lvbi5kb21Ob2RlOwotCi0JCS8vIGRlZmF1bHQgdG8gd2hhdGV2ZXIgcGFyZW50J3MgY29uc3RyYWludCBzYWlkIHRvIGRvCi0JCWlmIChwYXJlbnRDb25zdHJhaW50cyAhPSBudWxsKSB7Ci0JCQlpZiAodGhpc0NvbnN0cmFpbnRzICE9IG51bGwpIHsKLQkJCQl0aGlzQ29uc3RyYWludHMuY29weUNvbnN0cmFpbnRzKHBhcmVudENvbnN0cmFpbnRzKTsKLQkJCX0KLQkJCWlmIChjaGlsZENvbnN0cmFpbnRzICE9IG51bGwpIHsKLQkJCQljaGlsZENvbnN0cmFpbnRzLmNvcHlDb25zdHJhaW50cyhwYXJlbnRDb25zdHJhaW50cyk7Ci0JCQkJLy8gaWYgd2hpdGVzcGFjZSBzdHJhdGVneSB3YXMgb25seSBhIGhpbnQsIG51bGwgaXQgb3V0IHNvCi0JCQkJLy8gZGVmYXVsdHMgYXJlIHRha2VuIGluc3RlYWQKLQkJCQlpZiAocGFyZW50Q29uc3RyYWludHMuaXNXaGl0ZXNwYWNlU3RyYXRlZ3lBSGludCgpKQotCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShudWxsKTsKLQkJCX0KLQkJfQotCi0JCS8vIHNldCB1cCBjb25zdHJhaW50cyBmb3IgZGlyZWN0IGNoaWxkcmVuIG9mIGRvY3VtZW50IHJvb3QKLQkJTm9kZSBwYXJlbnROb2RlID0gY3VycmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50Tm9kZSAhPSBudWxsICYmIHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCWlmICh0aGlzQ29uc3RyYWludHMgIT0gbnVsbCkgewotCQkJCXRoaXNDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklHTk9SRSk7Ci0JCQkJdGhpc0NvbnN0cmFpbnRzLnNldEluZGVudFN0cmF0ZWd5KFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ORVdfTElORSk7Ci0JCQkJdGhpc0NvbnN0cmFpbnRzLnNldEluZGVudExldmVsKDApOwotCQkJfQotCQkJaWYgKGNoaWxkQ29uc3RyYWludHMgIT0gbnVsbCkgewotCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KG51bGwpOwotCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0SW5kZW50U3RyYXRlZ3kobnVsbCk7Ci0JCQkJY2hpbGRDb25zdHJhaW50cy5zZXRJbmRlbnRMZXZlbCgwKTsKLQkJCX0KLQkJfQotCi0JCS8vIG90aGVyIGNvbmRpdGlvbnMgdG8gY2hlY2sgd2hlbiBzZXR0aW5nIHVwIGNoaWxkIGNvbnN0cmFpbnRzCi0JCWlmIChjaGlsZENvbnN0cmFpbnRzICE9IG51bGwpIHsKLQkJCVhNTEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpOwotCi0JCQkvLyBpZiB3ZSdyZSBhdCBkb2N1bWVudCByb290LCBjaGlsZCB0YWdzIHNob3VsZCBhbHdheXMganVzdCBzdGFydAotCQkJLy8gb24gYSBuZXcgbGluZSBhbmQgaGF2ZSBhbiBpbmRlbnQgbGV2ZWwgb2YgMAotCQkJaWYgKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklHTk9SRSk7Ci0JCQkJY2hpbGRDb25zdHJhaW50cy5zZXRJbmRlbnRTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuTkVXX0xJTkUpOwotCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0SW5kZW50TGV2ZWwoMCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBCVUcxMDgwNzQgJiBCVUc4NDY4OCAtIHByZXNlcnZlIHdoaXRlc3BhY2UgaW4geHNsOnRleHQgJgotCQkJCS8vIHhzbDphdHRyaWJ1dGUKLQkJCQlTdHJpbmcgbm9kZU5hbWVzcGFjZVVSSSA9IGN1cnJlbnROb2RlLmdldE5hbWVzcGFjZVVSSSgpOwotCQkJCWlmIChYU0xfTkFNRVNQQUNFLmVxdWFscyhub2RlTmFtZXNwYWNlVVJJKSkgewotCQkJCQlTdHJpbmcgbm9kZU5hbWUgPSAoKEVsZW1lbnQpIGN1cnJlbnROb2RlKS5nZXRMb2NhbE5hbWUoKTsKLQkJCQkJaWYgKFhTTF9BVFRSSUJVVEUuZXF1YWxzKG5vZGVOYW1lKSB8fCBYU0xfVEVYVC5lcXVhbHMobm9kZU5hbWUpKSB7Ci0JCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBzZWFyY2ggd2l0aGluIGN1cnJlbnQgdGFnIGZvciB4bWw6c3BhY2UgYXR0cmlidXRlCi0JCQkJCUlUZXh0UmVnaW9uTGlzdCB0ZXh0UmVnaW9ucyA9IGN1cnJlbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJCQlpbnQgaSA9IDA7Ci0JCQkJCWJvb2xlYW4geG1sU3BhY2VGb3VuZCA9IGZhbHNlOwotCQkJCQlib29sZWFuIHByZXNlcnZlRm91bmQgPSBmYWxzZTsKLQkJCQkJd2hpbGUgKGkgPCB0ZXh0UmVnaW9ucy5zaXplKCkgJiYgIXhtbFNwYWNlRm91bmQpIHsKLQkJCQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoaSk7Ci0JCQkJCQlpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FLmVxdWFscyh0ZXh0UmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJCQlTdHJpbmcgcmVnaW9uVGV4dCA9IGN1cnJlbnRSZWdpb24uZ2V0VGV4dCh0ZXh0UmVnaW9uKTsKLQkJCQkJCQlpZiAoWE1MX1NQQUNFLmVxdWFscyhyZWdpb25UZXh0KSkgewotCQkJCQkJCQlpZiAoKGkgKyAxKSA8IHRleHRSZWdpb25zLnNpemUoKSkgewotCQkJCQkJCQkJKytpOwotCQkJCQkJCQkJdGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChpKTsKLQkJCQkJCQkJCWlmIChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUy5lcXVhbHModGV4dFJlZ2lvbi5nZXRUeXBlKCkpICYmICgoaSArIDEpIDwgdGV4dFJlZ2lvbnMuc2l6ZSgpKSkgewotCQkJCQkJCQkJCSsraTsKLQkJCQkJCQkJCQl0ZXh0UmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkJCQkJCXJlZ2lvblRleHQgPSBjdXJyZW50UmVnaW9uLmdldFRleHQodGV4dFJlZ2lvbik7Ci0JCQkJCQkJCQkJaWYgKFBSRVNFUlZFLmVxdWFscyhyZWdpb25UZXh0KSB8fCBQUkVTRVJWRV9RVU9URUQuZXF1YWxzKHJlZ2lvblRleHQpKSB7Ci0JCQkJCQkJCQkJCXByZXNlcnZlRm91bmQgPSB0cnVlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQl4bWxTcGFjZUZvdW5kID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkrK2k7Ci0JCQkJCX0KLQkJCQkJaWYgKHhtbFNwYWNlRm91bmQpIHsKLQkJCQkJCWlmIChwcmVzZXJ2ZUZvdW5kKSB7Ci0JCQkJCQkJLy8gcHJlc2VydmUgd2FzIGZvdW5kIHNvIHNldCB0aGUgc3RyYXRlZ3kKLQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8geG1sOnNwYWNlIHdhcyBmb3VuZCBidXQgaXQgd2FzIG5vdCBjb2xsYXBzZSwgc28KLQkJCQkJCQkvLyB1c2UgZGVmYXVsdCB3aGl0ZXNwYWNlIHN0cmF0ZWd5Ci0JCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLkRFRkFVTFQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gaG93IHRvIGhhbmRlIG5vZGVzIHRoYXQgaGF2ZSBub253aGl0ZXNwYWNlIHRleHQKLQkJCQkJCS8vIGNvbnRlbnQKLQkJCQkJCU5vZGVMaXN0IG5vZGVMaXN0ID0gY3VycmVudE5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCQkJaW50IGxlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJCWJvb2xlYW4gdGV4dE5vZGVGb3VuZCA9IGZhbHNlOwotCQkJCQkJLy8gQlVHMjE0NTE2IC0gSWYgdGhlIHBhcmVudCBjb25zdHJhaW50IGlzIHRvIHByZXNlcnZlIHdoaXRlc3BhY2UsIGNoaWxkIGNvbnN0cmFpbnRzIHNob3VsZAotCQkJCQkJLy8gc3RpbGwgcmVmbGVjdCB0aGUgcGFyZW50IGNvbnN0cmFpbnRzCi0JCQkJCQl3aGlsZSAoaW5kZXggPCBsZW5ndGggJiYgIXRleHROb2RlRm91bmQgJiYgcGFyZW50Q29uc3RyYWludHMgIT0gbnVsbCAmJiAhWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFLmVxdWFscyhwYXJlbnRDb25zdHJhaW50cy5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKSkpIHsKLQkJCQkJCQlOb2RlIGNoaWxkTm9kZSA9IG5vZGVMaXN0Lml0ZW0oaW5kZXgpOwotCQkJCQkJCWlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJCQl0ZXh0Tm9kZUZvdW5kID0gISgoSURPTVRleHQpIGNoaWxkTm9kZSkuaXNFbGVtZW50Q29udGVudFdoaXRlc3BhY2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJKytpbmRleDsKLQkJCQkJCX0KLQkJCQkJCWlmICh0ZXh0Tm9kZUZvdW5kKSB7Ci0JCQkJCQkJaWYgKGxlbmd0aCA+IDEpIHsKLQkJCQkJCQkJLy8gbW9yZSBpbiBoZXJlIHRoYW4ganVzdCB0ZXh0LCBzbyBjb25zaWRlcgotCQkJCQkJCQkvLyB0aGlzIG1peGVkIGNvbnRlbnQKLQkJCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3kocHJlZmVyZW5jZXMuZ2V0TWl4ZWRXaGl0ZXNwYWNlU3RyYXRlZ3koKSk7Ci0JCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0SW5kZW50U3RyYXRlZ3kocHJlZmVyZW5jZXMuZ2V0TWl4ZWRJbmRlbnRTdHJhdGVneSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCS8vIHRoZXJlJ3Mgb25seSB0ZXh0Ci0JCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KHByZWZlcmVuY2VzLmdldFRleHRXaGl0ZXNwYWNlU3RyYXRlZ3koKSk7Ci0JCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0SW5kZW50U3RyYXRlZ3kocHJlZmVyZW5jZXMuZ2V0VGV4dEluZGVudFN0cmF0ZWd5KCkpOwotCQkJCQkJCX0KLQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldElzV2hpdGVzcGFjZVN0cmF0ZWd5QUhpbnQodHJ1ZSk7Ci0JCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRJc0luZGVudFN0cmF0ZWd5QUhpbnQodHJ1ZSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHRyeSByZWZlcnJpbmcgdG8gY29udGVudCBtb2RlbCBmb3IgaW5mb3JtYXRpb24gb24KLQkJCQkJCS8vIHdoaXRlc3BhY2UgJiBpbmRlbnQgc3RyYXRlZ3kKLQkJCQkJCU1vZGVsUXVlcnlBZGFwdGVyIGFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpICgoSURPTURvY3VtZW50KSBjdXJyZW50Tm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBhZGFwdGVyLmdldE1vZGVsUXVlcnkoKS5nZXRDTU5vZGUoY3VycmVudE5vZGUpOwotCQkJCQkJaWYgKGVsZW1lbnREZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJLy8gZm9sbG93IHdoaXRlc3BhY2Ugc3RyYXRlZ3kgcHJlZmVyZW5jZSBmb3IKLQkJCQkJCQkvLyBwY2RhdGEgY29udGVudAotCQkJCQkJCWludCBjb250ZW50VHlwZSA9IGVsZW1lbnREZWNsYXJhdGlvbi5nZXRDb250ZW50VHlwZSgpOwotCQkJCQkJCQotCQkJCQkJCVN0cmluZyBmYWNldFZhbHVlID0gbnVsbDsKLQkJCQkJCQlpZihlbGVtZW50RGVjbGFyYXRpb24uZ2V0RGF0YVR5cGUoKSAhPSBudWxsKQotCQkJCQkJCQlmYWNldFZhbHVlID0gKFN0cmluZykgZWxlbWVudERlY2xhcmF0aW9uLmdldERhdGFUeXBlKCkuZ2V0UHJvcGVydHkoUFJPUEVSVFlfV0hJVEVTUEFDRV9GQUNFVCk7Ci0JCQkJCQkJaWYoZmFjZXRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmKFBSRVNFUlZFLmVxdWFscyhmYWNldFZhbHVlKSkKLQkJCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5QUkVTRVJWRSk7Ci0JCQkJCQkJCS8vIEZvciBYU0QgdHlwZXMsICJjb2xsYXBzZSIgY29ycmVzcG9uZHMgdG8gdGhlIElHTk9SRUFORFRSSU0gc3RyYXRlZ3kKLQkJCQkJCQkJZWxzZSBpZihDT0xMQVBTRS5lcXVhbHMoZmFjZXRWYWx1ZSkpCi0JCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSUdOT1JFQU5EVFJJTSk7Ci0JCQkJCQkJCWVsc2UgaWYoUkVQTEFDRS5lcXVhbHMoZmFjZXRWYWx1ZSkpCi0JCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUkVQTEFDRSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSAmJiBwYXJlbnRDb25zdHJhaW50cyAhPSBudWxsICYmICFYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUuZXF1YWxzKHBhcmVudENvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpKSkgewotCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShwcmVmZXJlbmNlcy5nZXRQQ0RhdGFXaGl0ZXNwYWNlU3RyYXRlZ3koKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQgJiYgcGFyZW50Q29uc3RyYWludHMgIT0gbnVsbCAmJiAhWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFLmVxdWFscyhwYXJlbnRDb25zdHJhaW50cy5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKSkpIHsKLQkJCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklHTk9SRSk7Ci0JCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0SW5kZW50U3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOREVOVCk7Ci0JCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0SXNXaGl0ZXNwYWNlU3RyYXRlZ3lBSGludCh0cnVlKTsKLQkJCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRJc0luZGVudFN0cmF0ZWd5QUhpbnQodHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQkvLyBsb29rIGZvciB4bWw6c3BhY2UgaW4gY29udGVudCBtb2RlbAotCQkJCQkJCQlDTU5hbWVkTm9kZU1hcCBjbUF0dHJpYnV0ZXMgPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0QXR0cmlidXRlcygpOwotCi0JCQkJCQkJCS8vIE5vdCBuZWVkZWQgLSB3ZSdyZSBsb29raW5nIGZvciB4bWw6c3BhY2UKLQkJCQkJCQkJLy9DTU5hbWVkTm9kZU1hcEltcGwgYWxsQXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoY21BdHRyaWJ1dGVzKTsKLQkJCQkJCQkJLy9MaXN0IG5vZGVzID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShjdXJyZW50Tm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIGN1cnJlbnROb2RlLCBlbGVtZW50RGVjbGFyYXRpb24sIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCQkJCQkJLy9mb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJCQkJCS8vCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoayk7Ci0JCQkJCQkJCS8vCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCQkJCS8vCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCQkJCQkvLwl9Ci0JCQkJCQkJCS8vfQotCQkJCQkJCQkvL2NtQXR0cmlidXRlcyA9IGFsbEF0dHJpYnV0ZXM7Ci0KLQkJCQkJCQkJLy8gQ2hlY2sgaW1wbGllZCB2YWx1ZXMgZnJvbSB0aGUgRFREIHdheS4KLQkJCQkJCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGVEZWNsYXJhdGlvbiA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbUF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKFhNTF9TUEFDRSk7Ci0JCQkJCQkJCWlmIChhdHRyaWJ1dGVEZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCQkvLyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGZvdW5kLCBjaGVjawotCQkJCQkJCQkJLy8gaXQKLQkJCQkJCQkJCS8vIG91dC4KLQotCQkJCQkJCQkJLy9CVUcyMTQ1MTYvMTk2NTQ0IC0gRml4ZWQgTlBFIHRoYXQgd2FzIGNhdXNlZCBieSBhbiBhdHRyIGhhdmluZwotCQkJCQkJCQkJLy8gYSBudWxsIGF0dHIgdHlwZQotCQkJCQkJCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IG51bGw7Ci0JCQkJCQkJCQlDTURhdGFUeXBlIGF0dHJUeXBlID0gYXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0QXR0clR5cGUoKTsKLQkJCQkJCQkJCWlmIChhdHRyVHlwZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJaWYgKChhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgIT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX05PTkUpICYmIGF0dHJUeXBlLmdldEltcGxpZWRWYWx1ZSgpICE9IG51bGwpCi0JCQkJCQkJCQkJCWRlZmF1bHRWYWx1ZSA9IGF0dHJUeXBlLmdldEltcGxpZWRWYWx1ZSgpOwotCQkJCQkJCQkJCWVsc2UgaWYgKChhdHRyVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkgIT0gbnVsbCkgJiYgKGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKS5sZW5ndGggPiAwKSkgewotCQkJCQkJCQkJCQlkZWZhdWx0VmFsdWUgPSBhdHRyVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKClbMF07Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkvLyB4bWw6c3BhY2U9InByZXNlcnZlIiBtZWFucyBwcmVzZXJ2ZQotCQkJCQkJCQkJLy8gc3BhY2UsCi0JCQkJCQkJCQkvLyBldmVyeXRoaW5nIGVsc2UgbWVhbnMgYmFjayB0bwotCQkJCQkJCQkJLy8gZGVmYXVsdC4KLQkJCQkJCQkJCWlmIChQUkVTRVJWRS5lcXVhbHMoZGVmYXVsdFZhbHVlKSkKLQkJCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUpOwotCQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ERUZBVUxUKTsKLQkJCQkJCQkJfQotCQkJCQkJCQkvLyBJZiB0aGUgbm9kZSBoYXMgbm8gYXR0cmlidXRlcywgaW5oZXJpdCB0aGUgcGFyZW50cyB3aGl0ZXNwYWNlIHN0cmF0ZWd5Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJaWYgKHBhcmVudENvbnN0cmFpbnRzICE9IG51bGwpCi0JCQkJCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3kocGFyZW50Q29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkpOwotCQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KG51bGwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gc2V0IGRlZmF1bHQgdmFsdWVzIGFjY29yZGluZyB0byBwcmVmZXJlbmNlcwotCQkJaWYgKGNoaWxkQ29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkgPT0gbnVsbCkgewotCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KHByZWZlcmVuY2VzLmdldEVsZW1lbnRXaGl0ZXNwYWNlU3RyYXRlZ3koKSk7Ci0JCQl9Ci0JCQlpZiAoY2hpbGRDb25zdHJhaW50cy5nZXRJbmRlbnRTdHJhdGVneSgpID09IG51bGwpIHsKLQkJCQljaGlsZENvbnN0cmFpbnRzLnNldEluZGVudFN0cmF0ZWd5KHByZWZlcmVuY2VzLmdldEVsZW1lbnRJbmRlbnRTdHJhdGVneSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZXMgdGhlIGN1cnJlbnQgYXZhaWxhYmxlIGxpbmUgd2lkdGggZ2l2ZW4gZnVsbFRleHQuCi0JICogCi0JICogQHBhcmFtIGZ1bGxUZXh0Ci0JICogQHBhcmFtIGF2YWlsYWJsZUxpbmVXaWR0aAotCSAqIEBwYXJhbSBtYXhBdmFpbGFibGVMaW5lV2lkdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgdXBkYXRlTGluZVdpZHRoV2l0aExhc3RMaW5lKFN0cmluZyBmdWxsVGV4dCwgaW50IGF2YWlsYWJsZUxpbmVXaWR0aCkgewotCQlpbnQgbWF4QXZhaWxhYmxlTGluZVdpZHRoID0gZ2V0Rm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkuZ2V0TWF4TGluZVdpZHRoKCk7Ci0JCWludCBsaW5lV2lkdGggPSBhdmFpbGFibGVMaW5lV2lkdGg7Ci0JCWlmIChmdWxsVGV4dCAhPSBudWxsKSB7Ci0JCQlpbnQgdGV4dExlbmd0aCA9IGZ1bGxUZXh0Lmxlbmd0aCgpOwotCQkJLy8gdXBkYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQkvLyBmaW5kIGxhc3QgbmV3bGluZQotCQkJaW50IGxhc3RMRk9mZnNldCA9IGZ1bGxUZXh0Lmxhc3RJbmRleE9mKCdcbicpOwotCQkJaW50IGxhc3RDUk9mZnNldCA9IGZ1bGxUZXh0Lmxhc3RJbmRleE9mKCdccicpOwotCQkJLy8gYWxsIHRleHQgd2FzIG9uIDEgbGluZQotCQkJaWYgKGxhc3RMRk9mZnNldCA9PSAtMSAmJiBsYXN0Q1JPZmZzZXQgPT0gLTEpIHsKLQkJCQkvLyBqdXN0IHN1YnRyYWN0IHRleHQgbGVuZ3RoIGZyb20gY3VycmVudAotCQkJCS8vIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQkJbGluZVdpZHRoIC09IGZ1bGxUZXh0Lmxlbmd0aCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gY2FsY3VsYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIG9mIGxhc3QgbGluZQotCQkJCWludCBsYXN0TmV3TGluZSA9IE1hdGgubWF4KGxhc3RMRk9mZnNldCwgbGFzdENST2Zmc2V0KTsKLQkJCQlsaW5lV2lkdGggPSBtYXhBdmFpbGFibGVMaW5lV2lkdGggLSAodGV4dExlbmd0aCAtIGxhc3ROZXdMaW5lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGluZVdpZHRoOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50UmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gY3VycmVudFJlZ2lvbi5nZXRQYXJlbnREb2N1bWVudCgpOwotCQlpbnQgbGluZSA9IGRvYy5nZXRMaW5lT2ZPZmZzZXQoY3VycmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcigpOwotCQl0cnkgewotCQkJaWYgKGxpbmUgPiAwKSB7Ci0JCQkJbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKGxpbmUgLSAxKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQkvLyBCVUcxMTU3MTY6IGlmIGNhbm5vdCBnZXQgbGluZSBkZWxpbWl0ZXIgZnJvbSBjdXJyZW50IGxpbmUsIGp1c3QKLQkJLy8gdXNlIGRlZmF1bHQgbGluZSBkZWxpbWl0ZXIKLQkJaWYgKGxpbmVEZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCWxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcigpOwotCQlyZXR1cm4gbGluZURlbGltaXRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdExpbmVEZWxpbWl0ZXJzKFN0cmluZyBiYXNlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24pIHsKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBnZXRMaW5lRGVsaW1pdGVyKGN1cnJlbnRSZWdpb24pOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IGJhc2UubGVuZ3RoKCk7KSB7Ci0JCQlpbmRleCA9IGJhc2UuaW5kZXhPZihsaW5lRGVsaW1pdGVyLCBpbmRleCk7Ci0JCQlpZihpbmRleCsrID49IDApCi0JCQkJc2IuYXBwZW5kKGxpbmVEZWxpbWl0ZXIpOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmUHJvZ3Jlc3NNb25pdG9yID0gbW9uaXRvcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvWE1MRm9ybWF0dGVyRm9ybWF0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9YTUxGb3JtYXR0ZXJGb3JtYXRQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyZWU3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9YTUxGb3JtYXR0ZXJGb3JtYXRQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhpcyBpcyBhIHdyYXBwZXIgZm9yIHRoZSBuZXcgeG1sIGZvcm1hdHRlciBzbyB0aGF0IGl0IGNhbiBiZSBzdGlsbAotICogY29uc2lkZXJlZCBhbiBJU3RydXR1cmVkRm9ybWF0UHJvY2Vzc29yCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxGb3JtYXR0ZXJGb3JtYXRQcm9jZXNzb3IgaW1wbGVtZW50cyBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBEZWZhdWx0WE1MUGFydGl0aW9uRm9ybWF0dGVyIGZGb3JtYXR0ZXIgPSBudWxsOwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQotCXB1YmxpYyB2b2lkIGZvcm1hdERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9ybWF0TW9kZWwobW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RmlsZShJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCBzdGFydCA9IDA7Ci0JCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0KLQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmKGZQcm9ncmVzc01vbml0b3IgIT0gbnVsbCkKLQkJCWZQcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKCIiLCAyKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCURvY3VtZW50UmV3cml0ZVNlc3Npb24gYWN0aXZlUmV3cml0ZVNlc3Npb24gPSAoKElEb2N1bWVudEV4dGVuc2lvbjQpIHN0cnVjdHVyZWREb2N1bWVudCkuZ2V0QWN0aXZlUmV3cml0ZVNlc3Npb24oKTsKLQkJYm9vbGVhbiBzdGFydGVkUmV3cml0ZVNlc3Npb24gPSBmYWxzZTsKLQkJaWYgKGFjdGl2ZVJld3JpdGVTZXNzaW9uID09IG51bGwpIHsKLQkJCWFjdGl2ZVJld3JpdGVTZXNzaW9uID0gKChJRG9jdW1lbnRFeHRlbnNpb240KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEKTsKLQkJCXN0YXJ0ZWRSZXdyaXRlU2Vzc2lvbiA9IHRydWU7Ci0JCX0KLQkJZ2V0Rm9ybWF0dGVyKCkuc2V0UHJvZ3Jlc3NNb25pdG9yKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgewotCQkJcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQkJCQlyZXR1cm4gZlByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIGZQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOwotCQkJfQotCQl9KTsKLQkJVGV4dEVkaXQgZWRpdCA9IGdldEZvcm1hdHRlcigpLmZvcm1hdChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCQlpZihmUHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpCi0JCQlmUHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsKLQkJCi0JCXRyeSB7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQllZGl0LmFwcGx5KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQlpZihmUHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpCi0JCQkJZlByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc3RhcnRlZFJld3JpdGVTZXNzaW9uICYmIGFjdGl2ZVJld3JpdGVTZXNzaW9uICE9IG51bGwpIHsKLQkJCQkoKElEb2N1bWVudEV4dGVuc2lvbjQpIHN0cnVjdHVyZWREb2N1bWVudCkuc3RvcFJld3JpdGVTZXNzaW9uKGFjdGl2ZVJld3JpdGVTZXNzaW9uKTsKLQkJCX0KLQkJCXN0cnVjdHVyZWRNb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCWlmKGZQcm9ncmVzc01vbml0b3IgIT0gbnVsbCkKLQkJCQlmUHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdE5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlET01Ob2RlIGRvbU5vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0JCQlmb3JtYXRNb2RlbChkb21Ob2RlLmdldE1vZGVsKCksIGRvbU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgZG9tTm9kZS5nZXRMZW5ndGgoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZQcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCX0KLQotCXByaXZhdGUgRGVmYXVsdFhNTFBhcnRpdGlvbkZvcm1hdHRlciBnZXRGb3JtYXR0ZXIoKSB7Ci0JCWlmIChmRm9ybWF0dGVyID09IG51bGwpIHsKLQkJCWZGb3JtYXR0ZXIgPSBuZXcgRGVmYXVsdFhNTFBhcnRpdGlvbkZvcm1hdHRlcigpOwotCQl9Ci0JCXJldHVybiBmRm9ybWF0dGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9YTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEyYTUzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9YTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi1wdWJsaWMgY2xhc3MgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUkVTRVJWRSA9ICJQUkVTRVJWRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xMQVBTRSA9ICJDT0xMQVBTRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJR05PUkUgPSAiSUdOT1JFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElHTk9SRUFORFRSSU0gPSAiSUdOT1JFQU5EVFJJTSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUID0gIkRFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVQTEFDRSA9ICJSRVBMQUNFIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOREVOVCA9ICJJTkRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkVXX0xJTkUgPSAiTkVXX0xJTkUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5MSU5FID0gIklOTElORSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgaW50IGZBdmFpbGFibGVMaW5lV2lkdGggPSAwOwotCXByaXZhdGUgaW50IGZJbmRlbnRMZXZlbCA9IDA7Ci0JcHJpdmF0ZSBTdHJpbmcgZkluZGVudFN0cmF0ZWd5OwotCXByaXZhdGUgU3RyaW5nIGZXaGl0ZXNwYWNlU3RyYXRlZ3k7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0luZGVudFN0cmF0ZWd5QUhpbnQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzV2hpdGVzcGFjZVN0cmF0ZWd5QUhpbnQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB2YWx1ZXMgaW4gdGhpcyBmb3JtYXR0aW5nIGNvbnN0cmFpbnQgd2l0aCB2YWx1ZXMgZnJvbQotCSAqIGNvbnN0cmFpbnRzCi0JICogCi0JICogQHBhcmFtIGNvbnN0cmFpbnRzCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlDb25zdHJhaW50cyhYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgY29uc3RyYWludHMpIHsKLQkJc2V0QXZhaWxhYmxlTGluZVdpZHRoKGNvbnN0cmFpbnRzLmdldEF2YWlsYWJsZUxpbmVXaWR0aCgpKTsKLQkJc2V0SW5kZW50TGV2ZWwoY29uc3RyYWludHMuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXNldEluZGVudFN0cmF0ZWd5KGNvbnN0cmFpbnRzLmdldEluZGVudFN0cmF0ZWd5KCkpOwotCQlzZXRXaGl0ZXNwYWNlU3RyYXRlZ3koY29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCkgewotCQlyZXR1cm4gZkF2YWlsYWJsZUxpbmVXaWR0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdmFpbGFibGVMaW5lV2lkdGgoaW50IGxpbmVXaWR0aCkgewotCQlmQXZhaWxhYmxlTGluZVdpZHRoID0gbGluZVdpZHRoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW5kZW50TGV2ZWwoKSB7Ci0JCXJldHVybiBmSW5kZW50TGV2ZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5kZW50TGV2ZWwoaW50IGluZGVudExldmVsKSB7Ci0JCWZJbmRlbnRMZXZlbCA9IGluZGVudExldmVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5kZW50U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBmSW5kZW50U3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5kZW50U3RyYXRlZ3koU3RyaW5nIGluZGVudFN0cmF0ZWd5KSB7Ci0JCWZJbmRlbnRTdHJhdGVneSA9IGluZGVudFN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gZldoaXRlc3BhY2VTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXaGl0ZXNwYWNlU3RyYXRlZ3koU3RyaW5nIHdoaXRlc3BhY2VTdHJhdGVneSkgewotCQlmV2hpdGVzcGFjZVN0cmF0ZWd5ID0gd2hpdGVzcGFjZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW5kZW50U3RyYXRlZ3lBSGludCgpIHsKLQkJcmV0dXJuIGZJc0luZGVudFN0cmF0ZWd5QUhpbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXNJbmRlbnRTdHJhdGVneUFIaW50KGJvb2xlYW4gaXNJbmRlbnRTdHJhdGVneUFIaW50KSB7Ci0JCWZJc0luZGVudFN0cmF0ZWd5QUhpbnQgPSBpc0luZGVudFN0cmF0ZWd5QUhpbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlU3RyYXRlZ3lBSGludCgpIHsKLQkJcmV0dXJuIGZJc1doaXRlc3BhY2VTdHJhdGVneUFIaW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElzV2hpdGVzcGFjZVN0cmF0ZWd5QUhpbnQoYm9vbGVhbiBpc1doaXRlc3BhY2VTdHJhdGVneUFIaW50KSB7Ci0JCWZJc1doaXRlc3BhY2VTdHJhdGVneUFIaW50ID0gaXNXaGl0ZXNwYWNlU3RyYXRlZ3lBSGludDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9YTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjMWI0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9YTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci0KLXB1YmxpYyBjbGFzcyBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRVNFUlZFID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTExBUFNFID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLkNPTExBUFNFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElHTk9SRSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkU7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTkRFTlQgPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSU5ERU5UOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5FV19MSU5FID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLk5FV19MSU5FOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOTElORSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkxJTkU7Ci0KLQlwcml2YXRlIGludCBmTWF4TGluZVdpZHRoID0gNzI7Ci0JcHJpdmF0ZSBib29sZWFuIGZBbGlnbkZpbmFsQnJhY2tldCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmU3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gZkluZGVudE11bHRpcGxlQXR0cmlidXRlcyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmRm9ybWF0Q29tbWVudFRleHQgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBmSm9pbkNvbW1lbnRMaW5lcyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZlBDRGF0YVdoaXRlc3BhY2VTdHJhdGVneSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5QUkVTRVJWRTsKLQlwcml2YXRlIFN0cmluZyBmVGV4dEluZGVudFN0cmF0ZWd5ID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOTElORTsKLQlwcml2YXRlIFN0cmluZyBmVGV4dFdoaXRlc3BhY2VTdHJhdGVneSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5DT0xMQVBTRTsKLQlwcml2YXRlIFN0cmluZyBmRWxlbWVudEluZGVudFN0cmF0ZWd5ID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOREVOVDsKLQlwcml2YXRlIFN0cmluZyBmRWxlbWVudFdoaXRlc3BhY2VTdHJhdGVneSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkU7Ci0JcHJpdmF0ZSBTdHJpbmcgZk1peGVkSW5kZW50U3RyYXRlZ3kgPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSU5ERU5UOwotCXByaXZhdGUgU3RyaW5nIGZNaXhlZFdoaXRlc3BhY2VTdHJhdGVneSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkU7Ci0JcHJpdmF0ZSBTdHJpbmcgZk9uZUluZGVudCA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGJvb2xlYW4gZkNsZWFyQWxsQmxhbmtMaW5lcyA9IGZhbHNlOwotCi0JcHVibGljIFhNTEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJc2V0Rm9ybWF0Q29tbWVudFRleHQocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9DT01NRU5UX1RFWFQpKTsKLQkJCXNldEpvaW5Db21tZW50TGluZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9DT01NRU5UX0pPSU5fTElORVMpKTsKLQotCQkJc2V0TWF4TGluZVdpZHRoKHByZWZlcmVuY2VzLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKTsKLQkJCXNldEluZGVudE11bHRpcGxlQXR0cmlidXRlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMpKTsKLQkJCXNldEFsaWduRmluYWxCcmFja2V0KHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BTElHTl9FTkRfQlJBQ0tFVCkpOwotCQkJc2V0U3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUEFDRV9CRUZPUkVfRU1QVFlfQ0xPU0VfVEFHKSk7Ci0JCQkKLQkJCWJvb2xlYW4gcHJlc2VydmVwY2RhdGEgPSBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUFJFU0VSVkVfQ0RBVEFDT05URU5UKTsKLQkJCWlmIChwcmVzZXJ2ZXBjZGF0YSkKLQkJCQlmUENEYXRhV2hpdGVzcGFjZVN0cmF0ZWd5ID0gWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzLlBSRVNFUlZFOwotCQkJZWxzZQotCQkJCWZQQ0RhdGFXaGl0ZXNwYWNlU3RyYXRlZ3kgPSBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMuQ09MTEFQU0U7Ci0KLQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJaWYgKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQlpbmRlbnRDaGFyID0gJ1x0JzsKLQkJCX0KLQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQl9Ci0JCQlzZXRPbmVJbmRlbnQoaW5kZW50LnRvU3RyaW5nKCkpOwotCQkJc2V0Q2xlYXJBbGxCbGFua0xpbmVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TWF4TGluZVdpZHRoKCkgewotCQlyZXR1cm4gZk1heExpbmVXaWR0aDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRGb3JtYXRDb21tZW50VGV4dCgpIHsKLQkJcmV0dXJuIGZGb3JtYXRDb21tZW50VGV4dDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBbGlnbkZpbmFsQnJhY2tldCgpIHsKLQkJcmV0dXJuIGZBbGlnbkZpbmFsQnJhY2tldDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRTcGFjZUJlZm9yZUVtcHR5Q2xvc2VUYWcoKSB7Ci0JCXJldHVybiBmU3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRJbmRlbnRNdWx0aXBsZUF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBmSW5kZW50TXVsdGlwbGVBdHRyaWJ1dGVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UENEYXRhV2hpdGVzcGFjZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gZlBDRGF0YVdoaXRlc3BhY2VTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRJbmRlbnRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGZUZXh0SW5kZW50U3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0V2hpdGVzcGFjZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gZlRleHRXaGl0ZXNwYWNlU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50SW5kZW50U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBmRWxlbWVudEluZGVudFN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFdoaXRlc3BhY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGZFbGVtZW50V2hpdGVzcGFjZVN0cmF0ZWd5OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRKb2luQ29tbWVudExpbmVzKCkgewotCQlyZXR1cm4gZkpvaW5Db21tZW50TGluZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Sm9pbkNvbW1lbnRMaW5lcyhib29sZWFuIGpvaW5Db21tZW50TGluZXMpIHsKLQkJZkpvaW5Db21tZW50TGluZXMgPSBqb2luQ29tbWVudExpbmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvcm1hdENvbW1lbnRUZXh0KGJvb2xlYW4gZm9ybWF0Q29tbWVudFRleHQpIHsKLQkJZkZvcm1hdENvbW1lbnRUZXh0ID0gZm9ybWF0Q29tbWVudFRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnKGJvb2xlYW4gc3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnKSB7Ci0JCWZTcGFjZUJlZm9yZUVtcHR5Q2xvc2VUYWcgPSBzcGFjZUJlZm9yZUVtcHR5Q2xvc2VUYWc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5kZW50TXVsdGlwbGVBdHRyaWJ1dGVzKGJvb2xlYW4gaW5kZW50TXVsdGlwbGVBdHRyaWJ1dGVzKSB7Ci0JCWZJbmRlbnRNdWx0aXBsZUF0dHJpYnV0ZXMgPSBpbmRlbnRNdWx0aXBsZUF0dHJpYnV0ZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UENEYXRhV2hpdGVzcGFjZVN0cmF0ZWd5KFN0cmluZyBkYXRhV2hpdGVzcGFjZVN0cmF0ZWd5KSB7Ci0JCWZQQ0RhdGFXaGl0ZXNwYWNlU3RyYXRlZ3kgPSBkYXRhV2hpdGVzcGFjZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsaWduRmluYWxCcmFja2V0KGJvb2xlYW4gYWxpZ25GaW5hbEJyYWNrZXQpIHsKLQkJZkFsaWduRmluYWxCcmFja2V0ID0gYWxpZ25GaW5hbEJyYWNrZXQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNaXhlZEluZGVudFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gZk1peGVkSW5kZW50U3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWl4ZWRJbmRlbnRTdHJhdGVneShTdHJpbmcgbWl4ZWRJbmRlbnRTdHJhdGVneSkgewotCQlmTWl4ZWRJbmRlbnRTdHJhdGVneSA9IG1peGVkSW5kZW50U3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNaXhlZFdoaXRlc3BhY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGZNaXhlZFdoaXRlc3BhY2VTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNaXhlZFdoaXRlc3BhY2VTdHJhdGVneShTdHJpbmcgbWl4ZWRXaGl0ZXNwYWNlU3RyYXRlZ3kpIHsKLQkJZk1peGVkV2hpdGVzcGFjZVN0cmF0ZWd5ID0gbWl4ZWRXaGl0ZXNwYWNlU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRPbmVJbmRlbnQoKSB7Ci0JCXJldHVybiBmT25lSW5kZW50OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE1heExpbmVXaWR0aChpbnQgbWF4TGluZVdpZHRoKSB7Ci0JCWZNYXhMaW5lV2lkdGggPSBtYXhMaW5lV2lkdGg7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T25lSW5kZW50KFN0cmluZyBvbmVJbmRlbnQpIHsKLQkJZk9uZUluZGVudCA9IG9uZUluZGVudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDbGVhckFsbEJsYW5rTGluZXMoKSB7Ci0JCXJldHVybiBmQ2xlYXJBbGxCbGFua0xpbmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsZWFyQWxsQmxhbmtMaW5lcyhib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcykgewotCQlmQ2xlYXJBbGxCbGFua0xpbmVzID0gY2xlYXJBbGxCbGFua0xpbmVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmZmMWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MOwotCi0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZFhNTCBpbXBsZW1lbnRzIEVtYmVkZGVkVHlwZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBzdXBwb3J0ZWRNaW1lVHlwZXM7Ci0JcHVibGljIFN0cmluZyBDb250ZW50VHlwZUlEX0VtYmVkZGVkWE1MID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jb250ZW50dHlwZS5FbWJlZGRlZFhNTCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFbWJlZGRlZFhNTC4KLQkgKi8KLQlwdWJsaWMgRW1iZWRkZWRYTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVtYmVkZGVkQ29udGVudFR5cGUjZ2V0QWRhcHRlckZhY3RvcmllcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpIHsKLQkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MKCkpOwotCQkvLyBmYWN0b3JpZXMuYWRkQWxsKFBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldEZhY3Rvcmllcyh0aGlzKSk7Ci0JCXJldHVybiBmYWN0b3JpZXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBFbWJlZGRlZENvbnRlbnRUeXBlI2dldEZhbWlseUlkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZhbWlseUlkKCkgewotCQlyZXR1cm4gTW9kZWxIYW5kbGVyRm9yWE1MLkFzc29jaWF0ZWRDb250ZW50VHlwZUlEOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFN1cHBvcnRlZE1pbWVUeXBlcygpIHsKLQkJaWYgKHN1cHBvcnRlZE1pbWVUeXBlcyA9PSBudWxsKSB7Ci0JCQlzdXBwb3J0ZWRNaW1lVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzdXBwb3J0ZWRNaW1lVHlwZXMuYWRkKCJhcHBsaWNhdGlvbi94bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3VwcG9ydGVkTWltZVR5cGVzLmFkZCgidGV4dC94bWwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzdXBwb3J0ZWRNaW1lVHlwZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJLy9UT0RPOiBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhcnNlcihSZWdpb25QYXJzZXIgcGFyc2VyKSB7Ci0JCS8vIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZSBmb3IgInB1cmUiIFhNTAotCQkvLyBjb21wYXJlIHdpdGggWEhUTUwKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBFbWJlZGRlZFhNTCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJLy8gVE9ETzogbmVlZCB0byB1bmRvIGFueXRoaW5nIHdlIGRpZCBpbiBpbml0aWFsaXplCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluaXRpYWxpemVQYXJzZXIoUmVnaW9uUGFyc2VyIHBhcnNlcikgewotCQkvLyBuZWVkIHRvIHVuZG8gYW55dGhpbmcgd2UgZGlkIGluIGluaXRpYWxpemUKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5IYW5kbGVNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHsKLQkJYm9vbGVhbiBjYW5IYW5kbGUgPSBnZXRTdXBwb3J0ZWRNaW1lVHlwZXMoKS5jb250YWlucyhtaW1lVHlwZSk7Ci0JCWlmKCFjYW5IYW5kbGUpIHsKLQkJCWNhbkhhbmRsZSA9IG1pbWVUeXBlLmVuZHNXaXRoKCIreG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gY2FuSGFuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YmRmM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVuY29kaW5nLlhNTERvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5YTUxEb2N1bWVudExvYWRlcjsKLQotCi0vKioKLSAqIFByb3ZpZGVzIGdlbmVyaWMgWE1MIG1vZGVsIGhhbmRsaW5nLiBJdCBpcyBhbHNvIG1hcmtlZCBhcyB0aGUgZGVmYXVsdAotICogY29udGVudCB0eXBlIGhhbmRsZXIuIFRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAqIGRlZmF1bHQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJGb3JYTUwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCS8qKgotCSAqIE5lZWRzIHRvIG1hdGNoIHdoYXQncyBpbiBwbHVnaW4gcmVnaXN0cnkuIEluIGZhY3QsIGNhbiBiZSBvdmVyd3JpdHRlbgotCSAqIGF0IHJ1biB0aW1lIHdpdGggd2hhdCdzIGluIHJlZ2lzdHJ5ISAoc28gc2hvdWxkIG5ldmVyIGJlICdmaW5hbCcpCi0JICovCi0Jc3RhdGljIFN0cmluZyBBc3NvY2lhdGVkQ29udGVudFR5cGVJRCA9ICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE5lZWRzIHRvIG1hdGNoIHdoYXQncyBpbiBwbHVnaW4gcmVnaXN0cnkuIEluIGZhY3QsIGNhbiBiZSBvdmVyd3JpdHRlbgotCSAqIGF0IHJ1biB0aW1lIHdpdGggd2hhdCdzIGluIHJlZ2lzdHJ5ISAoc28gc2hvdWxkIG5ldmVyIGJlICdmaW5hbCcpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1vZGVsSGFuZGxlcklEID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5tb2RlbGhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTW9kZWxIYW5kbGVyRm9yWE1MKCkgewotCQlzdXBlcigpOwkKLQkJc2V0SWQoTW9kZWxIYW5kbGVySUQpOwotCQlzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChBc3NvY2lhdGVkQ29udGVudFR5cGVJRCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxEb2N1bWVudExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgZ2V0TW9kZWxMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgWE1MTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1hNTE1vZGVsTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9YTUxNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Y5MjIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1hNTE1vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuRGVidWdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRE9NTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5YTUxEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyBhbiBYTUwgZmlsZSBhbmQgY3JlYXRlcyBhbiBYTUwgU3RydWN0dXJlZCBNb2RlbC4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFhNTE1vZGVsTG9hZGVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbExvYWRlciB7Ci0KLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSX0VOQ09ESU5HID0gImVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogWE1MTG9hZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFhNTE1vZGVsTG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlmYWN0b3J5ID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQkvLyBEb2VzIFhNTCBuZWVkIHByb3BhZ2F0aW5nIGFkYXB0ZXI/IE9yIGp1c3QgSlNQPwotCQlmYWN0b3J5ID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJaWYgKGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG5ldyBYTUxEb2N1bWVudExvYWRlcigpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudExvYWRlckluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgWE1MTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBET01Nb2RlbEltcGwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVMb2FkQWRhcHQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJc3VwZXIucHJlTG9hZEFkYXB0KHN0cnVjdHVyZWRNb2RlbCk7Ci0JCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHN0cnVjdHVyZWRNb2RlbDsKLQkJLy8gaWYgdGhlcmUgaXMgYSBtb2RlbCBpbiB0aGUgYWRhcHRlciwgdGhpcyB3aWxsIGFkYXB0IGl0IHRvCi0JCS8vIGZpcnN0IG5vZGUuIEFmdGVyIHRoYXQgdGhlIFByb3BhZ2F0aW5nQWRhdGVyIHNwcmVhZHMgb3ZlciB0aGUKLQkJLy8gY2hpbGRyZW4gYmVpbmcKLQkJLy8gY3JlYXRlZC4gRWFjaCB0aW1lIHRoYXQgaGFwcGVuZHMsIGEgc2lkZSBlZmZlY3QgaXMgdG8KLQkJLy8gYWxzbyAic3ByZWFkIiBzcHJlY2lmaWMgcmVnaXN0ZXJlZCBhZGFwdGVycywKLQkJLy8gdGhleSB0d28gY2FuIHByb3BpZ2F0ZSBpcyBuZWVkZWQuCi0JCSgoSU5vZGVOb3RpZmllcikgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCi0JCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmaWNhdGlvbkFuZEV2ZW50cykgewotCQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkJcHJvcGFnYXRpbmdBZGFwdGVyLmFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KG5ldyBEZWJ1Z0FkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNWE5YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MIGV4dGVuZHMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MIHsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MLgotCSAqLwotCXB1YmxpYyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTCgpIHsKLQkJc3VwZXIoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVEb2N1bWVudE1hbmFnZXIoQ01Eb2N1bWVudE1hbmFnZXIgbWdyKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZURvY3VtZW50TWFuYWdlcihtZ3IpOwotCQltZ3Iuc2V0UHJvcGVydHlFbmFibGVkKENNRG9jdW1lbnRNYW5hZ2VyLlBST1BFUlRZX0FTWU5DX0xPQUQsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBJU1NVRTogdGhpcyAiZm9yY2VzIiBhIG5ldyBvbmUgdG8gYWx3YXlzIGJlIGNyZWF0ZWQvcmV0dXJuZWQsIAotCSAqIG5vdCAiY2FjaGVkIiBvbiB0aGUgbm9kZS4gVGhhdCBzZWVtcyBpbmNvcnJlY3QuIAotCSAqIFNpbXBseSB1c2luZyBzaG91bGRSZWdpc3RlckZhbHNlIHNob3VsZCB3b3JrLCBleGNlcHQsIAotCSAqIHRoZXJlIG1pZ2h0IGhhdmUgYmVlbiBvbmUgdGhlcmUgdGhhdCBzb21lb25lIGVsc2UgYWxyZWFkeSAKLQkgKiBleHBsaWNpdGx5IHB1dCB0aGVyZSwgc28gdGhpcyBpcyBvbmx5IHdheSBJIGtub3cgdG8gCi0JICogb3ZlcnJpZGUgdGhhdC4gRXNwZWNpYWxseSBjb21wbGljYXRlZCBoZXJlIHNpbmNlIGEgbnVtYmVyCi0JICogb2YgYWRhcHRlcnMgYXJlIGZvciBNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcy4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGFkYXB0KElOb2RlTm90aWZpZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBhZGFwdE5ldyhvYmplY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JiNGFkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgTW9kZWxRdWVyeUFkYXB0ZXJJbXBsIG1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLQlJU3RydWN0dXJlZE1vZGVsIHN0YXRlTm90aWZpZXIgPSBudWxsOwotCXByaXZhdGUgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MKCkgewotCQl0aGlzKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcktleQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqIEBwYXJhbSByZWdpc3RlckFkYXB0ZXJzCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTChPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCWNsYXNzIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGltcGxlbWVudHMgSU1vZGVsU3RhdGVMaXN0ZW5lciB7Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsLAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCwKLQkJICogICAgICBJU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJCXN0YXRlTm90aWZpZXIucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQkJc3RhdGVOb3RpZmllciA9IG5ld01vZGVsOwotCQkJdXBkYXRlUmVzb2x2ZXIoc3RhdGVOb3RpZmllcik7Ci0JCQlzdGF0ZU5vdGlmaWVyLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RlbFJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCXVwZGF0ZVJlc29sdmVyKHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkJfQotCi0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvTG9hZENNKCkgewotCQkvLyB1bnRpbCB0aGUgZXhpc3RlbmNlIG9mIGEgQ01Eb2N1bWVudFJlcXVlc3RlckZhY3RvcnkgdG8gY3JlYXRlIHRoZQotCQkvLyBsb2FkIHJlcXVlc3RzLAotCQkvLyByZXR1cm4gdHJ1ZQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVEb2N1bWVudE1hbmFnZXIoQ01Eb2N1bWVudE1hbmFnZXIgbWdyKSB7Ci0JCS8vIHRoaXMgZGVwZW5kcyBvbiB0aGVyZSBiZWluZyBhIENNRG9jdW1lbnRSZXF1ZXN0ZXJGYWN0b3J5IGluc3RhbGxlZAotCQltZ3Iuc2V0UHJvcGVydHlFbmFibGVkKENNRG9jdW1lbnRNYW5hZ2VyLlBST1BFUlRZX0FVVE9fTE9BRCwgYXV0b0xvYWRDTSgpKTsKLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCi0JCXJldHVybiBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MKGdldEFkYXB0ZXJLZXkoKSwgaXNTaG91bGRSZWdpc3RlckFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQWRhcHRlciBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQotCQlpZiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcuZGlzcGxheUluZm8pCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MLmNyZWF0ZUFkYXB0ZXIiICsgdGFyZ2V0KTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXJJbXBsID09IG51bGwpIHsKLQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCUlET01Ob2RlIHhtbE5vZGUgPSAoSURPTU5vZGUpIHRhcmdldDsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0geG1sTm9kZS5nZXRNb2RlbCgpOwotCQkJCXN0YXRlTm90aWZpZXIgPSB4bWxOb2RlLmdldE1vZGVsKCk7Ci0JCQkJc3RhdGVOb3RpZmllci5hZGRNb2RlbFN0YXRlTGlzdGVuZXIoZ2V0SW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKSk7Ci0KLQkJCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlciByZXNvbHZlciA9IG1vZGVsLmdldFJlc29sdmVyKCk7Ci0JCQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS1Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwuLi4gYmFzZUxvY2F0aW9uIDogIiArIHJlc29sdmVyLmdldEZpbGVCYXNlTG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCS8qKgotCQkJCSAqIFhNTENhdGFsb2dJZFJlc29sdmVyIGN1cnJlbnRseSByZXF1aXJlcyBhIGZpbGVzeXN0ZW0KLQkJCQkgKiBsb2NhdGlvbiBzdHJpbmcuIEN1c3RvbWFyaWx5IHRoaXMgd2lsbCBiZSB3aGF0IGlzIGluIHRoZQotCQkJCSAqIGRlcHJlY2F0ZWQgU1NFIFVSSVJlc29sdmVyIGFuZCByZXF1aXJlZCBieSB0aGUgQ29tbW9uIFVSSQotCQkJCSAqIFJlc29sdmVyLgotCQkJCSAqLwotCQkJCVVSSVJlc29sdmVyIGlkUmVzb2x2ZXIgPSBudWxsOwotCQkJCWlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0JCQkJCWlkUmVzb2x2ZXIgPSBuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIocmVzb2x2ZXIuZ2V0RmlsZUJhc2VMb2NhdGlvbigpLCByZXNvbHZlcik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvKgotCQkJCQkgKiAyMDM2NDkgLSB0aGlzIGJsb2NrIG1heSBiZSBuZWNlc3NhcnkgZHVlIHRvIG9yZGVyaW5nIG9mCi0JCQkJCSAqIHNldHRpbmcgdGhlIHJlc29sdmVyIGludG8gdGhlIG1vZGVsCi0JCQkJCSAqLwotCQkJCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJCQkJU3RyaW5nIG1vZGVsc0Jhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCQlpZiAobW9kZWxzQmFzZUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBQYXRoKG1vZGVsc0Jhc2VMb2NhdGlvbikudG9GaWxlKCk7Ci0JCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCWJhc2VMb2NhdGlvbiA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlJUGF0aCBiYXNlUGF0aCA9IG5ldyBQYXRoKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJCQkJCQlJUmVzb3VyY2UgZGVyaXZlZFJlc291cmNlID0gbnVsbDsKLQkJCQkJCQlpZiAoYmFzZVBhdGguc2VnbWVudENvdW50KCkgPiAxKQotCQkJCQkJCQlkZXJpdmVkUmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoYmFzZVBhdGgpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJZGVyaXZlZFJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGJhc2VQYXRoLnNlZ21lbnQoMCkpOwotCQkJCQkJCUlQYXRoIGRlcml2ZWRQYXRoID0gZGVyaXZlZFJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJaWYgKGRlcml2ZWRQYXRoICE9IG51bGwpIHsKLQkJCQkJCQkJYmFzZUxvY2F0aW9uID0gZGVyaXZlZFBhdGgudG9TdHJpbmcoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCVVSSSB1cmkgPSBkZXJpdmVkUmVzb3VyY2UuZ2V0TG9jYXRpb25VUkkoKTsKLQkJCQkJCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJCQkJCQliYXNlTG9jYXRpb24gPSB1cmkudG9TdHJpbmcoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmKGJhc2VMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQkJYmFzZUxvY2F0aW9uID0gbW9kZWxzQmFzZUxvY2F0aW9uOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlkUmVzb2x2ZXIgPSBuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoYmFzZUxvY2F0aW9uLCBudWxsKTsKLQkJCQl9Ci0KLQkJCQlDTURvY3VtZW50Q2FjaGUgY21Eb2N1bWVudENhY2hlID0gbmV3IENNRG9jdW1lbnRDYWNoZSgpOwotCQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IG5ldyBYTUxNb2RlbFF1ZXJ5SW1wbChjbURvY3VtZW50Q2FjaGUsIGlkUmVzb2x2ZXIpOwotCi0JCQkJLy8gY3MgdG9kby4uLgotCQkJCS8vIGZvciBub3cgd2UgY3JlYXRlIGEgQ01Eb2N1bWVudENhY2hlIG9uIGEgJ3BlciBlZGl0b3InIGJhc2lzCi0JCQkJLy8gaW4gdGhlIGZ1dHVyZSB3ZSBuZWVkIHRvIHN1cHBvcnQgYSBDTURvY3VtZW50Q2FjaGUgdGhhdCBpcwotCQkJCS8vIHNoYXJlZCBiZXR3ZWVuIGVkaXRvcnMKLQkJCQkvLyBuc2QgY29tbWVudDogbWF5IG5vdCBiZSBhcHByb3ByaWF0ZSBkZXBlbmRpbmcgb24KLQkJCQlDTURvY3VtZW50TWFuYWdlciBkb2N1bWVudE1hbmFnZXIgPSBtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCQkJaWYgKGRvY3VtZW50TWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCWNvbmZpZ3VyZURvY3VtZW50TWFuYWdlcihkb2N1bWVudE1hbmFnZXIpOwotCQkJCX0KLQkJCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwgPSBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJJbXBsKGNtRG9jdW1lbnRDYWNoZSwgbW9kZWxRdWVyeSwgaWRSZXNvbHZlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlzdXBlci5yZWxlYXNlKCk7Ci0JCWlmIChzdGF0ZU5vdGlmaWVyICE9IG51bGwpCi0JCQlzdGF0ZU5vdGlmaWVyLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcihnZXRJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpKTsKLQkJc3RhdGVOb3RpZmllciA9IG51bGw7Ci0JCWlmIChtb2RlbFF1ZXJ5QWRhcHRlckltcGwgIT0gbnVsbCkKLQkJCW1vZGVsUXVlcnlBZGFwdGVySW1wbC5yZWxlYXNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVzb2x2ZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCi0JCVN0cmluZyBiYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJSUZpbGUgYmFzZUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpKTsKLQkJaWYgKGJhc2VGaWxlICE9IG51bGwpIHsKLQkJCWlmIChiYXNlRmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQliYXNlTG9jYXRpb24gPSBiYXNlRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlpZiAoYmFzZUxvY2F0aW9uID09IG51bGwgJiYgYmFzZUZpbGUuZ2V0TG9jYXRpb25VUkkoKSAhPSBudWxsKSB7Ci0JCQkJYmFzZUxvY2F0aW9uID0gYmFzZUZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGJhc2VMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJYmFzZUxvY2F0aW9uID0gYmFzZUZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCX0KLQkJbW9kZWxRdWVyeUFkYXB0ZXJJbXBsLnNldElkUmVzb2x2ZXIobmV3IFhNTENhdGFsb2dJZFJlc29sdmVyKGJhc2VMb2NhdGlvbiwgbW9kZWwuZ2V0UmVzb2x2ZXIoKSkpOwotCX0KLQotCXByaXZhdGUgZmluYWwgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgZ2V0SW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKSB7Ci0JCWlmIChpbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlpbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiBpbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWUzZTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGFzc29jaWF0ZSBNb2RlbFF1ZXJ5IChhbmQgcmVsYXRlZCBkYXRhKSB3aXRoIGEKLSAqIERvY3VtZW50IChvciBJU3RydWN0dXJlZE1vZGVsKS4KLSAqLwotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgQ01Eb2N1bWVudENhY2hlIGdldENNRG9jdW1lbnRDYWNoZShEb2N1bWVudCBub2RlKSB7Ci0JCU1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gZ2V0TW9kZWxRdWVyeUFkYXB0ZXIobm9kZSk7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlciAhPSBudWxsID8gbW9kZWxRdWVyeUFkYXB0ZXIuZ2V0Q01Eb2N1bWVudENhY2hlKCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJUmVzb2x2ZXIgZ2V0SWRSZXNvbHZlcihEb2N1bWVudCBub2RlKSB7Ci0JCU1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gZ2V0TW9kZWxRdWVyeUFkYXB0ZXIobm9kZSk7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlciAhPSBudWxsID8gbW9kZWxRdWVyeUFkYXB0ZXIuZ2V0SWRSZXNvbHZlcigpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeShEb2N1bWVudCBub2RlKSB7Ci0JCU1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gZ2V0TW9kZWxRdWVyeUFkYXB0ZXIobm9kZSk7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlciAhPSBudWxsID8gbW9kZWxRdWVyeUFkYXB0ZXIuZ2V0TW9kZWxRdWVyeSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWlmICgoIShtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkpIHx8IG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldE1vZGVsUXVlcnkoKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1vZGVsUXVlcnlBZGFwdGVyIGdldE1vZGVsUXVlcnlBZGFwdGVyKERvY3VtZW50IG5vZGUpIHsKLQkJTW9kZWxRdWVyeUFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgbm9kZTsKLQkJCXJlc3VsdCA9IChNb2RlbFF1ZXJ5QWRhcHRlcikgbm90aWZpZXIuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YTUxDYXRhbG9nSWRSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTENhdGFsb2dJZFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxODUyZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTENhdGFsb2dJZFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi0vLyBUT0RPIGNzIDogcmVtb3ZlIHRoaXMgY2xhc3MgYW5kIHV0aWxpemUgdGhlIGNvbW1vbiBVUklSZXNvbHZlciBkaXJlY3RseQotLy8gV2UgbmVlZCB0byB1cGRhdGUgc29tZSBvZiB0aGUgTW9kZWxRdWVyeSByZWxhdGVkIGNvZGUgdG8gcGFzcyB0aGUKLS8vICdiYXNlTG9jYXRpb24nIHRocnUKLS8vIGFuZCB0aGVuIHRoZXJlJ2xsIGJlIG5vZGUgbmVlZCBmb3IgdGhpcyBjbGFzcy4KLS8vIAotcHVibGljIGNsYXNzIFhNTENhdGFsb2dJZFJlc29sdmVyIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlciB7Ci0JcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uOwotCi0JcHJvdGVjdGVkIFVSSVJlc29sdmVyIHVyaXJlc29sdmVyOwotCi0JcHJpdmF0ZSBYTUxDYXRhbG9nSWRSZXNvbHZlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFhNTENhdGFsb2dJZFJlc29sdmVyKFN0cmluZyByZXNvdXJjZUxvY2F0aW9uKSB7Ci0JCXRoaXMoKTsKLQkJdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoU3RyaW5nIHJlc291cmNlTG9jYXRpb24sIFVSSVJlc29sdmVyIHVyaXJlc29sdmVyKSB7Ci0JCXRoaXMocmVzb3VyY2VMb2NhdGlvbik7Ci0vLyB0aGlzIGNvbnN0cnVjdG9yIHNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggdHdvIG51bGwgYXJndW1lbnRzLgotLy8gSWYgc28sIGFuIGFzc2VydCB3aWxsIG9jY3VyIGxhdGVyIHdoZW4gcmVzb2x2ZSBpcyBjYWxsZWQuIAotLy8gU2VlIDExODM3MSBYTUxDYXRhbG9nSWRSZXNvbHZlciNyZXNvbHZlIHRocm93cyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24KLS8vCi0vLyBidXQsIEknbSBub3QgZW5hYmxpbmcgdGhpcyBjaGVjayBub3cgZHVlIHRvIGxhdGVuZXNzIGluIGN5Y2xlLiAJCQotLy8JCWlmIChyZXNvdXJjZUxvY2F0aW9uID09IG51bGwgJiYgdXJpcmVzb2x2ZXIgPT0gbnVsbCkgewotLy8JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJib3RoIGxvY2F0aW9uIGFuZCByZXNvbHZlciBjYW4gbm90IGJlIG51bGwiKTsKLS8vCQl9Ci0JCXRoaXMudXJpcmVzb2x2ZXIgPSB1cmlyZXNvbHZlcjsKLQl9Ci0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlc291cmNlTG9jYXRpb24uCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVzb3VyY2VMb2NhdGlvbigpIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCWlmICh1cmlyZXNvbHZlciAhPSBudWxsKQotCQkJCWxvY2F0aW9uID0gdXJpcmVzb2x2ZXIuZ2V0RmlsZUJhc2VMb2NhdGlvbigpOwotCQl9Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZShTdHJpbmcgYmFzZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQotCQlTdHJpbmcgcmVzdWx0ID0gc3lzdGVtSWQ7Ci0JCWlmIChiYXNlID09IG51bGwpIHsKLQkJCWJhc2UgPSBnZXRSZXNvdXJjZUxvY2F0aW9uKCk7Ci0JCQkvLyBidWcgMTE3MzIwLCBlbnN1cmUgYmFzZSBVUkkgaXMgJ3Byb3RvY2FsJyBxdWFsaWZpZWQgYmVmb3JlCi0JCQkvLyBwYXNzaW5nIGl0IHRocnUgdG8gVVJJUmVzb2x2ZXIKLQkJCS8vIGJ1ZyAxMTc0MjQsIHdlIHNob3VsZCBiZSBhYmxlIHRvIGFzc3VtZSB0aGF0IHRoZSBiYXNlIGxvY2F0aW9uCi0JCQkvLyBpcyBub24tbnVsbAotCi0JCQkvKioKLQkJCSAqIFdlIHNob3VsZG4ndCBhc3NlcnQgYSBmYWlsdXJlIGJlY2F1c2UgdGhlIGNhdGFsb2cgZG9lcyBub3QKLQkJCSAqIHJlcXVpcmUgYSBiYXNlIGxvY2F0aW9uIHRvIG9wZXJhdGUgYW5kIGl0IHdpbGwgYmUgY2FsbGVkIGZyb20KLQkJCSAqIG5vbi1maWxlLWJhc2VkIHNjZW5hcmlvcy4KLQkJCSAqIAotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNjE3NgotCQkJICovCi0JCQkvLyBBc3NlcnQuaXNOb3ROdWxsKGJhc2UsICJCYXNlIGxvY2F0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIG5vbiBudWxsLiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJYmFzZSA9IFVSSUhlbHBlci5hZGRJbXBsaWVkRmlsZVByb3RvY29sKGJhc2UpOwotCQkJfQotCQl9Ci0JCXJlc3VsdCA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShiYXNlLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgbG9naWNhbExvY2F0aW9uKSB7Ci0JCS8vIFRoaXMgY2xhc3Mgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCB0byBwZXJmb3JtIHBoeXNpY2FsIHJlc29sdXRpb24hCi0JCS8vIElmIGl0IGRvZXMgd2Ugc2hvdWxkIGxvZyBpdCBhcyBhbiBlcnJvcgotCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgIlhNTENhdGFsb2dJRFJlc29sdmVyLnJlc29sdmVQaHlzaWNhbExvY2F0aW9uKCkgY2FsbGVkIHVuZXhwZWN0ZWRseSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBsb2dpY2FsTG9jYXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRkMTRhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuWE1MQXNzb2NpYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyCi0gKiAKLSAqIFRoaXMgYWRkZWQgYW5kL29yIG1hZGUgcHVibGljIHNwZWNpZmljYWxseSBmb3IgZXhwZXJpbWVudGF0aW9uLiBJdCB3aWxsCi0gKiBjaGFuZ2UgYXMgdGhpcyBmdW5jdGlvbmFsaXR5IGJlY29tZXMgQVBJLiBTZWUKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTkwODQKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgZXh0ZW5kcyBYTUxBc3NvY2lhdGlvblByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBVUklSZXNvbHZlciBpZFJlc29sdmVyOwotCi0JcHVibGljIFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgVVJJUmVzb2x2ZXIgaWRSZXNvbHZlcikgewotCQlzdXBlcihjYWNoZSk7Ci0JCXRoaXMuaWRSZXNvbHZlciA9IGlkUmVzb2x2ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlR3JhbW1hclVSSShEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQotCQkvLyBDUyA6IHNwb29reSBjb2RlIGFsZXJ0IQotCQkvLyB0aGlzIGxvb2sgcmVhbGx5IHN0cmFuZ2UgYmVjYXVzZSB3ZSdyZSBwYXNzaW5nIG51bGwgaW4gYXMgdGhlIGZpcnN0Ci0JCS8vIGFyZ3VtZW50Ci0JCS8vIGhvd2V2ZXIgd2UncmUgYXNzdW1pbmcgdGhlIHVzZSBvZiBhICdmdWRnZWQnIFVSSVJlc29sdmVyIHRoYXQga25vd3MKLQkJLy8gdGhlCi0JCS8vIGNvcnJlY3QgYmFzZUxvY2F0aW9uIGFuZCB3aWxsIGNhbGwgdG8gdGhlIFVSSVJlc29sdmVyIGZyYW1ld29yawotCQkvLyBwcm9wZXJseQotCi0JCS8vIENTIDogbm90ZSB0aGF0IHdlIHNob3VsZCBuZXZlciBjYWxsIHJlc29sdmVQaHlzaWNhbCBhdCB0aGlzIHBvaW50LgotCQkvLyBQaHlzaWNhbCByZXNvbHV0aW9uIHNob3VsZCBvbmx5IG9jY3VyIHdoZW4gd2UncmUgaW50ZXJlc3RpbmcgdG8KLQkJLy8gb3BlbmluZyB0aGUgYWN0dWFsIHN0cmVhbS4KLQkJLy8gVGhlIENNRG9jdW1lbnRGYWN0b3J5IGltcGxlbWVudGF0aW9uIHdvdWxkIGJlIHJlc3BvbnNpYmxlIGZvcgotCQkvLyBjYWxsaW5nIHJlc29sdmVQaHlzaWNhbC4KLQkJLy8gQWxsIHdlIG5lZWQgdG8gZG8gaGVyZSBpcyByZXR1cm4gYSAnbG9naWNhbCcgVVJJCi0KLQkJaWYgKGlkUmVzb2x2ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gaWRSZXNvbHZlci5yZXNvbHZlKG51bGwsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTE1vZGVsUXVlcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWE1MTW9kZWxRdWVyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmYTAwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWE1MTW9kZWxRdWVyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuTW9kZWxRdWVyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb3ZhYmxlTW9kZWxRdWVyeTsKLQotCi1wdWJsaWMgY2xhc3MgWE1MTW9kZWxRdWVyeUltcGwgZXh0ZW5kcyBNb2RlbFF1ZXJ5SW1wbCBpbXBsZW1lbnRzIE1vdmFibGVNb2RlbFF1ZXJ5IHsKLQotCXByb3RlY3RlZCBDTURvY3VtZW50Q2FjaGUgZkNhY2hlID0gbnVsbDsKLQotCXB1YmxpYyBYTUxNb2RlbFF1ZXJ5SW1wbChDTURvY3VtZW50Q2FjaGUgY2FjaGUsIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJc3VwZXIobmV3IFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKGNhY2hlLCBpZFJlc29sdmVyKSk7Ci0JCWZDYWNoZSA9IGNhY2hlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTW92YWJsZU1vZGVsUXVlcnkjc2V0SWRSZXNvbHZlcihVUklSZXNvbHZlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZFJlc29sdmVyKFVSSVJlc29sdmVyIG5ld0lkUmVzb2x2ZXIpIHsKLQkJbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgPSBuZXcgWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIoZkNhY2hlLCBuZXdJZFJlc29sdmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9CbG9ja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvQmxvY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc1NGE4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9CbG9ja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuSUJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIEJsb2NrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGV4dGVuZHMgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW1wbGVtZW50cyBJQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB7Ci0KLQlwcml2YXRlIFN0cmluZyBwYXJ0aXRpb25UeXBlOwotCi0JLyoqCi0JICogQSBCbG9ja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBsaWtlIGEgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwKLQkgKiBidXQgaXMgdGhlIHJlc3VsdCBvZiBhICJibG9jayBzY2FuIi4KLQkgKi8KLQlwdWJsaWMgQmxvY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKCkgewotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQkvLyBldmVudHVhbGx5IGNhbiBsb29rIHVwIHN1cnJvdW5kaW5nVGFnIG5hbWUKLQkJCS8vIGJ1dCB0aGlzIGZpZWxkIGlzIHByaW1hcmlseSBlbnRlbmRlZCBmb3IgZnV0dXJlCi0JCQkvLyBleHRlbnNpYmlsaXR5LiBUaGlzIG1heSBjaGFuZ2UuCi0JCQkvL3BhcnRpdGlvblR5cGUgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLiIgKyB0YWduYW1lOwotCQl9Ci0JCXJldHVybiBwYXJ0aXRpb25UeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcnRpdGlvblR5cGUoU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJdGhpcy5wYXJ0aXRpb25UeXBlID0gcGFydGl0aW9uVHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9Db250ZXh0UmVnaW9uQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9Db250ZXh0UmVnaW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZTMzMDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ29udGV4dFJlZ2lvbkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5UZXh0UmVnaW9uTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgQ29udGV4dFJlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIElUZXh0UmVnaW9uQ29udGFpbmVyIHsKLQlwcm90ZWN0ZWQgaW50IGxlbmd0aDsKLQlwcm90ZWN0ZWQgSVRleHRSZWdpb25Db2xsZWN0aW9uIHBhcmVudDsKLQlwcm90ZWN0ZWQgSVRleHRSZWdpb25MaXN0IHJlZ2lvbnM7Ci0JcHJvdGVjdGVkIGludCBzdGFydDsKLQlwcm90ZWN0ZWQgaW50IHRleHRMZW5ndGg7Ci0JcHJvdGVjdGVkIFN0cmluZyB0eXBlOwotCi0JcHVibGljIENvbnRleHRSZWdpb25Db250YWluZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiB0aGVzZSAiZGVlcCIgcGFyZW50aW5nIGlzIG5vdCBub3JtYWwsIGJ1dCBqdXN0IGluIGNhc2UuCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IF9nZXRQYXJlbnREb2N1bWVudCgpIHsKLQkJLy8gZ28gdXAgZW5vdWdoIHBhcmVudHMgdG8gZ2V0IHRvIGRvY3VtZW50Ci0JCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCS8vIHdvdWxkIGJlIGFuIGVycm9yIG5vdCB0byBiZSBjb250YWluZXIsIGJ1dAotCQkJLy8gd29uJ3QgY2hlY2sgZm9yIGl0IG5vdwotCQkJcGFyZW50ID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50KS5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gKChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBwYXJlbnQpLmdldFBhcmVudERvY3VtZW50KCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3QoaW50IGkpIHsKLQotCQlzdGFydCArPSBpOwotCQkvLyBJIGVycm9uZW91c2x5IGFkZGVkIGxlbmd0aCBhbmQgdGV4dExlbmd0aAotCQkvLyBUT0RPOiBtYXkgd2FudCB0byByZW5hbWUgdGhpcyBtZXRob2QgdG8gYWRqdXN0U3RhcnQKLQkJLy9sZW5ndGggKz0gaTsKLQkJLy90ZXh0TGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJbGVuZ3RoICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJc3RhcnQgKz0gaTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJdGV4dExlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IGkpIHsKLQotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSA8PSBpICYmIGkgPCBnZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KGNvbnRhaW5lZFJlZ2lvbikgPD0gb2Zmc2V0ICYmIG9mZnNldCA8IGdldEVuZE9mZnNldChjb250YWluZWRSZWdpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGp1c3QgdG8gZXF1YXRlIHBvc2l0aW9ucy4gY2xpZW50cyBtYXkgKHdpbGwgcHJvYmFibHkpCi0JICogc3RpbGwgbmVlZCB0byBtYWtlIGNhbGxzIHRvIGVxdWF0ZSByZWdpb25zLCBwYXJlbnQsIGV0Yy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJdGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBzdGFydCArIGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJLy8gb3VyIHN0YXJ0T2Zmc2V0IHRha2UgaW50byBhY2NvdW50IG91ciBwYXJlbnQsIGFuZCBvdXIgc3RhcnQKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgKyBnZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KGNvbnRhaW5lZFJlZ2lvbikgKyBjb250YWluZWRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldEZpcnN0UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0UmVnaW9ucygpLmdldCgwKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0RnVsbFRleHQodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCS8vIE11c3QgYmUgcHJveGllZCBoZXJlIHNpbmNlIGFSZWdpb24gc2hvdWxkIGFsd2F5cyBiZSBhIGNoaWxkIG9mCi0JCS8vICp0aGlzKiBjb250YWluZXIgYW5kIGluZGV4ZWQgZnJvbQotCQkvLyB0aGlzIGNvbnRhaW5lcidzIG9mZnNldAotCQlyZXR1cm4gcGFyZW50LmdldEZ1bGxUZXh0KCkuc3Vic3RyaW5nKHN0YXJ0ICsgYVJlZ2lvbi5nZXRTdGFydCgpLCBzdGFydCArIGFSZWdpb24uZ2V0RW5kKCkpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRMYXN0UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0UmVnaW9ucygpLmdldChnZXRSZWdpb25zKCkuc2l6ZSgpIC0gMSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0KLQlwdWJsaWMgaW50IGdldE51bWJlck9mUmVnaW9ucygpIHsKLQkJcmV0dXJuIGdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIHBhcmFtZXRlciBvZmZzZXQgcmVmZXJzIHRvIHRoZSBvdmVyYWxsIG9mZnNldCBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJSVRleHRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlZ2lvbnMgIT0gbnVsbCkgewotCQkJaW50IHRoaXNTdGFydE9mZnNldCA9IGdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpZiAob2Zmc2V0IDwgdGhpc1N0YXJ0T2Zmc2V0KQotCQkJCXJldHVybiBudWxsOwotCQkJaW50IHRoaXNFbmRPZmZzZXQgPSBnZXRTdGFydE9mZnNldCgpICsgZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAob2Zmc2V0ID4gdGhpc0VuZE9mZnNldCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCS8vIHRyYW5zZm9ybSB0aGUgcmVxdWVzdGVkIG9mZnNldCB0byB0aGUgInNjYWxlIiB0aGF0Ci0JCQkvLyByZWdpb25zIGFyZSBzdG9yZWQgaW4sIHdoaWNoIGFyZSBhbGwgcmVsYXRpdmUgdG8gdGhlCi0JCQkvLyBzdGFydCBwb2ludC4KLQkJCS8vaW50IHRyYW5zZm9ybWVkT2Zmc2V0ID0gb2Zmc2V0IC0gZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCS8vCi0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGdldFJlZ2lvbnMoKTsKLQkJCWludCBsZW5ndGggPSByZWdpb25zLnNpemUoKTsKLQkJCWludCBsb3cgPSAwOwotCQkJaW50IGhpZ2ggPSBsZW5ndGg7Ci0JCQlpbnQgbWlkID0gMDsKLQkJCS8vIEJpbmFyeSBzZWFyY2ggZm9yIHRoZSByZWdpb24KLQkJCXdoaWxlIChsb3cgPCBoaWdoKSB7Ci0JCQkJbWlkID0gbG93ICsgKChoaWdoIC0gbG93KSA+PiAxKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChtaWQpOwotCQkJCWlmIChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlZ2lvbihzKSBpbiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOjpnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldDogIiArIHJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgbWlkcG9pbnQgb2Ygc2VhcmNoOiIgKyBtaWQpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlcXVlc3RlZCBvZmZzZXQ6ICIgKyBvZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCIgdHJhbnNmb3JtZWRPZmZzZXQ6ICIgKwotCQkJCQkvLyB0cmFuc2Zvcm1lZE9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgcmVnaW9uIHN0YXJ0OiAiICsgcmVnaW9uLmdldFN0YXJ0KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiBlbmQ6ICIgKyByZWdpb24uZ2V0RW5kKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiB0eXBlOiAiICsgcmVnaW9uLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgcmVnaW9uIGNsYXNzOiAiICsgcmVnaW9uLmdldENsYXNzKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQl9Ci0JCQkJLy8gUmVnaW9uIGlzIGJlZm9yZSB0aGlzIG9uZQotCQkJCWlmIChvZmZzZXQgPCByZWdpb24uZ2V0U3RhcnQoKSArIHRoaXNTdGFydE9mZnNldCkKLQkJCQkJaGlnaCA9IG1pZDsKLQkJCQllbHNlIGlmIChvZmZzZXQgPiAocmVnaW9uLmdldEVuZCgpICsgdGhpc1N0YXJ0T2Zmc2V0IC0gMSkpCi0JCQkJCWxvdyA9IG1pZCArIDE7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb25MaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCXJldHVybiByZWdpb25zOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0U3RhcnRPZmZzZXQoKSArIGdldFN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJLy8gaXQgaXMgYW4gZXJyb3IgdG8gcGFzcyBudWxsIHRvIHRoaXMgbWV0aG9kCi0JCS8vIElTU1VFOiBuZWVkIGJldHRlciAic3BlYyIgb24gZXJyb3IgYmVoYXZpb3I6IAotCQkvLyBmb3Igbm93IHdpbGwgcmV0dXJuIHplcm8gYXMgdGhpcyB3aWxsIHJvdWdobHkgCi0JCS8vIHdvcmsgZm9yIHNvbWUgY2FzZXMgKGFuZCBhdm9pZCBOUEUpLgotCQlpZiAoY29udGFpbmVkUmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBnZXRTdGFydE9mZnNldCgpOwotCQl9Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpICsgY29udGFpbmVkUmVnaW9uLmdldFN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogc2FtZSBhcyBnZXRGdWxsVGV4dCBmb3IgdGhpcyByZWdpb24gdHlwZSAuLi4gZG8gd2UgbmVlZCB0byB0YWtlIHdoaXRlCi0JICogc3BhY2Ugb2ZmPwotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcGFyZW50RG9jdW1lbnQgPSBfZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJCXJlc3VsdCA9IHBhcmVudERvY3VtZW50LmdldChzdGFydCwgbGVuZ3RoKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigicHJvZ3JhbSBlcnJvcjogdW5yZWFjaGFibGUgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCS8vIE11c3QgYmUgcHJveGllZCBoZXJlIHNpbmNlIGFSZWdpb24gc2hvdWxkIGFsd2F5cyBiZSBhIGNoaWxkIG9mCi0JCS8vICp0aGlzKiBjb250YWluZXIgYW5kIGluZGV4ZWQgZnJvbQotCQkvLyB0aGlzIGNvbnRhaW5lcidzIG9mZnNldAotCQlyZXR1cm4gcGFyZW50LmdldFRleHQoKS5zdWJzdHJpbmcoc3RhcnQgKyBhUmVnaW9uLmdldFN0YXJ0KCksIHN0YXJ0ICsgYVJlZ2lvbi5nZXRUZXh0RW5kKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIHN0YXJ0ICsgdGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCS8vIG91ciBzdGFydE9mZnNldCB0YWtlIGludG8gYWNjb3VudCBvdXIgcGFyZW50LCBhbmQgb3VyIHN0YXJ0Ci0JCS8vIChwYSkgMTAvNCBjaGFuZ2VkIHRvIGJlIGJhc2VkIG9uIHRleHQgZW5kCi0JCS8vICAgICAgICAgICBpdCB1c2VkIHRvIHJldHVybiBpbmNvcnJlY3QgdmFsdWUgZm9yIGVtYmVkZGVkIHJlZ2lvbiBjb250YWluZXJzCi0JCS8vCi0KLQkJLy8gVE9ETyBDUklUSUNBTCAtLSBuZWVkIHRvIHJlLXdvcmsgdGhpcyB3b3JrIGFyb3VuZCwgc28gZG9lc24ndAotCQkvLyBkZXBlbmQgb24gWE1MUmVnaW9uQ29udGV4dAotCQkvLwkJLy8gdGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIDIyNjgyMy8vLy8vLy8vLy8vCi0JCS8vCQlmb3IgKGludCBpID0gcmVnaW9ucy5zaXplKCkgLSAxOyBpID49IDAgJiYgcmVnaW9uLmdldFR5cGUoKSA9PQotCQkvLyBYTUxSZWdpb25Db250ZXh0LldISVRFX1NQQUNFOyBpLS0pCi0JCS8vCQkJcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLmdldChpKTsKLQkJLy8JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFRleHRFbmQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlpZiAocmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZ2V0UmVnaW9ucygpLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRSZWdpb25zKCkuZ2V0KGkpOwotCQkJCWlmIChyZWdpb24gPT0gY29udGFpbmVkUmVnaW9uKSB7Ci0JCQkJCXJlc3VsdCA9IGdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgKyByZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiB0ZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBpKSB7Ci0JCWxlbmd0aCA9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KElUZXh0UmVnaW9uQ29sbGVjdGlvbiBwYXJlbnRSZWdpb24pIHsKLQkJcGFyZW50ID0gcGFyZW50UmVnaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZ2lvbnMoSVRleHRSZWdpb25MaXN0IGNvbnRhaW5lZFJlZ2lvbnMpIHsKLQkJcmVnaW9ucyA9IGNvbnRhaW5lZFJlZ2lvbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IGkpIHsKLQkJc3RhcnQgPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHRMZW5ndGgoaW50IGkpIHsKLQkJdGV4dExlbmd0aCA9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXR5cGUgPSBzdHJpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgc2hvcnRDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlc3VsdCA9ICJDb250YWluZXIhISEgIiArIHNob3J0Q2xhc3NOYW1lICsgIi0tPiAiICsgZ2V0VHlwZSgpICsgIjogIiArIGdldFN0YXJ0KCkgKyAiLSIgKyBnZXRUZXh0RW5kKCkgKyAoZ2V0VGV4dEVuZCgpICE9IGdldEVuZCgpID8gKCIvIiArIGdldEVuZCgpKSA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBGVVRVUkVfVE9fRE86IG5lZWQgdG8gaW1wbGVtZW50IHJlZ2lvbiBsZXZlbCBwYXJzaW5nIGluCi0JCS8vIElUZXh0UmVnaW9uQ29udGFpbmVyOjp1cGRhdGVNb2RlbAotCQkvLyBuZXZlciBiZWluZyBjYWxsZWQ/Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9JbnRTdGFjay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvSW50U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNiOGQ1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9JbnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotCi0KLS8qCi0gKiAKLSAqIEEgbm9uLXJlc2l6YWJsZSBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIGJlaGF2aW9yIG9mIGphdmEudXRpbC5TdGFjaywgYnV0Ci0gKiBkaXJlY3RseSBmb3IgdGhlIDxjb2RlPiBpbnRlZ2VyIDwvY29kZT4gcHJpbWl0aXZlLgotICovCi1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbnRTdGFjayB7Ci0JcHJpdmF0ZSBpbnRbXSBsaXN0ID0gbnVsbDsKLQotCXByaXZhdGUgaW50IHNpemUgPSAwOwotCi0JcHVibGljIEludFN0YWNrKCkgewotCQl0aGlzKDEwMCk7Ci0JfQotCi0JcHVibGljIEludFN0YWNrKGludCBtYXhkZXB0aCkgewotCQlzdXBlcigpOwotCQlsaXN0ID0gbmV3IGludFttYXhkZXB0aF07Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbXB0eSgpIHsKLQkJcmV0dXJuIHNpemUgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldChpbnQgc2xvdCkgewotCQlyZXR1cm4gbGlzdFtzbG90XTsKLQl9Ci0KLQl2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKLQkJCWxpc3RbaV0gPSAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aG91dCByZW1vdmluZyBpdAotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcGVlaygpIHsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBsaXN0W3NpemUgLSAxXTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBvcCgpIHsKLQkJaW50IHZhbHVlID0gcGVlaygpOwotCQlsaXN0W3NpemUgLSAxXSA9IC0xOwotCQlzaXplLS07Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQdXNoZXMgYW4gaXRlbSBvbnRvIHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUgLQotCSAqICAgICAgICAgICAgdGhlIGludCB0byBiZSBwdXNoZWQgb250byB0aGlzIHN0YWNrLgotCSAqIEByZXR1cm4gdGhlIDxjb2RlPm5ld1ZhbHVlPC9jb2RlPiBhcmd1bWVudC4KLQkgKi8KLQlwdWJsaWMgaW50IHB1c2goaW50IG5ld1ZhbHVlKSB7Ci0JCWlmIChzaXplID09IGxpc3QubGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgU3RhY2tPdmVyZmxvd0Vycm9yKCk7Ci0JCX0KLQkJbGlzdFtzaXplKytdID0gbmV3VmFsdWU7Ci0JCXJldHVybiBuZXdWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiIgK3NpemUgKyAiIFsiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXMuYXBwZW5kKGxpc3RbaV0pOwotCQkJaWYoaSA8IHNpemUgLSAxKSB7Ci0JCQkJcy5hcHBlbmQoIiwgIik7Ci0JCQl9Ci0JCX0KLQkJcy5hcHBlbmQoIl0iKTsKLQkJcmV0dXJuIHMudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9SZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9SZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMTVhNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvUmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotCi0KLXB1YmxpYyBjbGFzcyBSZWdpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBSZWdpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihJVGV4dFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQsIFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHBhcmVudCwgY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKElUZXh0UmVnaW9uQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyBsYW5nLCBTdHJpbmcgc3Vycm91bmRpbmdUYWcpIHsKLQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCS8vbmV3UmVnaW9uLnNldFBhcmVudChwYXJlbnQpOwotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyBsYW5nLCBTdHJpbmcgc3Vycm91bmRpbmdUYWcpIHsKLQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gbmV3IENvbnRleHRSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCXJldHVybiBuZXdSZWdpb247Ci0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTDEwTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTDEwTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5MWM2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUwxME5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTUgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS40IG9uIDIvMjUvMDggMTA6MjUgQU0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwyMDA4IElCTSBDb3Jwb3JhdGlvbiwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIGtiLmh1YW5nICAtIEJ1ZyAyMTQ0MTYgIERvdCBjaGFyIGlzIG5vdCBlc2NhcGVkIGluIFhNTDEwTmFtZXMuakZsZXgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleDwvYT4gMS40Ci0gKiBvbiAyLzI1LzA4IDEwOjI1IEFNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PlhNTDEwTmFtZXMuamZsZXg8L3R0PgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MMTBOYW1lcyB7Ci0KLSAgLyoqIFRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX0JVRkZFUlNJWkUgPSAyMDQ4OwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWVlJTklUSUFMID0gMDsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0NNQVBfUEFDS0VEID0gCi0gICAgIlwxMlwwXDFcM1w0MlwwXDFcMlwxXDJcMVwwXDEyXDJcMVwxXDZcMFwzMlwxIisKLSAgICAiXDRcMFwxXDFcMVwwXDMyXDFcNzRcMFwxXDJcMTBcMFwyN1wxXDFcMFwzN1wxIisKLSAgICAiXDFcMFw3MlwxXDJcMFwxM1wxXDJcMFwxMFwxXDFcMFw2NVwxXDFcMFwxMDRcMSIrCi0gICAgIlwxMVwwXDQ0XDFcM1wwXDJcMVw0XDBcMzZcMVw3MFwwXDEzMVwxXDIyXDBcN1wxIisKLSAgICAiXDE2XDBcMlwyXDU2XDBcMTA2XDJcMzJcMFwyXDJcNDRcMFwxXDFcMVwyXDNcMSIrCi0gICAgIlwxXDBcMVwxXDFcMFwyNFwxXDFcMFw1NFwxXDFcMFw3XDFcM1wwXDFcMSIrCi0gICAgIlwxXDBcMVwxXDFcMFwxXDFcMVwwXDFcMVwxXDBcMjJcMVwxNVwwXDE0XDEiKwotICAgICJcMVwwXDEwMlwxXDFcMFwxNFwxXDFcMFw0NFwxXDFcMFw0XDJcMTFcMFw2NVwxIisKLSAgICAiXDJcMFwyXDFcMlwwXDJcMVwzXDBcMzRcMVwyXDBcMTBcMVwyXDBcMlwxIisKLSAgICAiXDY3XDBcNDZcMVwyXDBcMVwxXDdcMFw0NlwxXDEyXDBcMjFcMlwxXDBcMjdcMiIrCi0gICAgIlwxXDBcM1wyXDFcMFwxXDJcMVwwXDJcMlwxXDBcMVwyXDEzXDBcMzNcMSIrCi0gICAgIlw1XDBcM1wxXDU2XDBcMzJcMVw1XDBcMVwyXDEyXDFcMTBcMlwxNVwwXDEyXDIiKwotICAgICJcNlwwXDFcMlwxMDdcMVwyXDBcNVwxXDFcMFwxN1wxXDFcMFw0XDFcMVwwIisKLSAgICAiXDFcMVwxN1wyXDJcMVwyXDJcMVwwXDRcMlwyXDBcMTJcMlx1MDIwN1wwXDNcMiIrCi0gICAgIlwxXDBcNjVcMVwyXDBcMVwyXDFcMVwyMFwyXDNcMFw0XDJcM1wwXDEyXDEiKwotICAgICJcMlwyXDJcMFwxMlwyXDIxXDBcM1wyXDFcMFwxMFwxXDJcMFwyXDFcMlwwIisKLSAgICAiXDI2XDFcMVwwXDdcMVwxXDBcMVwxXDNcMFw0XDFcMlwwXDFcMlwxXDAiKwotICAgICJcN1wyXDJcMFwyXDJcMlwwXDNcMlwxMVwwXDFcMlw0XDBcMlwxXDFcMCIrCi0gICAgIlwzXDFcMlwyXDJcMFwxMlwyXDJcMVwyMFwwXDFcMlwyXDBcNlwxXDRcMCIrCi0gICAgIlwyXDFcMlwwXDI2XDFcMVwwXDdcMVwxXDBcMlwxXDFcMFwyXDFcMVwwIisKLSAgICAiXDJcMVwyXDBcMVwyXDFcMFw1XDJcNFwwXDJcMlwyXDBcM1wyXDEzXDAiKwotICAgICJcNFwxXDFcMFwxXDFcN1wwXDEyXDJcMlwyXDNcMVwxNFwwXDNcMlwxXDAiKwotICAgICJcN1wxXDFcMFwxXDFcMVwwXDNcMVwxXDBcMjZcMVwxXDBcN1wxXDFcMCIrCi0gICAgIlwyXDFcMVwwXDVcMVwyXDBcMVwyXDFcMVwxMFwyXDFcMFwzXDJcMVwwIisKLSAgICAiXDNcMlwyMlwwXDFcMVw1XDBcMTJcMlwyMVwwXDNcMlwxXDBcMTBcMVwyXDAiKwotICAgICJcMlwxXDJcMFwyNlwxXDFcMFw3XDFcMVwwXDJcMVwyXDBcNFwxXDJcMCIrCi0gICAgIlwxXDJcMVwxXDZcMlwzXDBcMlwyXDJcMFwzXDJcMTBcMFwyXDJcNFwwIisKLSAgICAiXDJcMVwxXDBcM1wxXDRcMFwxMlwyXDIyXDBcMlwyXDFcMFw2XDFcM1wwIisKLSAgICAiXDNcMVwxXDBcNFwxXDNcMFwyXDFcMVwwXDFcMVwxXDBcMlwxXDNcMCIrCi0gICAgIlwyXDFcM1wwXDNcMVwzXDBcMTBcMVwxXDBcM1wxXDRcMFw1XDJcM1wwIisKLSAgICAiXDNcMlwxXDBcNFwyXDExXDBcMVwyXDE3XDBcMTFcMlwyMVwwXDNcMlwxXDAiKwotICAgICJcMTBcMVwxXDBcM1wxXDFcMFwyN1wxXDFcMFwxMlwxXDFcMFw1XDFcNFwwIisKLSAgICAiXDdcMlwxXDBcM1wyXDFcMFw0XDJcN1wwXDJcMlwxMVwwXDJcMVw0XDAiKwotICAgICJcMTJcMlwyMlwwXDJcMlwxXDBcMTBcMVwxXDBcM1wxXDFcMFwyN1wxXDFcMCIrCi0gICAgIlwxMlwxXDFcMFw1XDFcNFwwXDdcMlwxXDBcM1wyXDFcMFw0XDJcN1wwIisKLSAgICAiXDJcMlw3XDBcMVwxXDFcMFwyXDFcNFwwXDEyXDJcMjJcMFwyXDJcMVwwIisKLSAgICAiXDEwXDFcMVwwXDNcMVwxXDBcMjdcMVwxXDBcMjBcMVw0XDBcNlwyXDJcMCIrCi0gICAgIlwzXDJcMVwwXDRcMlwxMVwwXDFcMlwxMFwwXDJcMVw0XDBcMTJcMlwyMjFcMCIrCi0gICAgIlw1NlwxXDFcMFwxXDFcMVwyXDJcMVw3XDJcNVwwXDZcMVwxXDJcMTBcMiIrCi0gICAgIlwxXDBcMTJcMlw0N1wwXDJcMVwxXDBcMVwxXDJcMFwyXDFcMVwwXDFcMSIrCi0gICAgIlwyXDBcMVwxXDZcMFw0XDFcMVwwXDdcMVwxXDBcM1wxXDFcMFwxXDEiKwotICAgICJcMVwwXDFcMVwyXDBcMlwxXDFcMFwyXDFcMVwwXDFcMVwxXDJcMlwxIisKLSAgICAiXDZcMlwxXDBcMlwyXDFcMVwyXDBcNVwxXDFcMFwxXDJcMVwwXDZcMiIrCi0gICAgIlwyXDBcMTJcMlw3NlwwXDJcMlw2XDBcMTJcMlwxM1wwXDFcMlwxXDBcMVwyIisKLSAgICAiXDFcMFwxXDJcNFwwXDJcMlwxMFwxXDFcMFw0MVwxXDdcMFwyNFwyXDFcMCIrCi0gICAgIlw2XDJcNFwwXDZcMlwxXDBcMVwyXDFcMFwyNVwyXDNcMFw3XDJcMVwwIisKLSAgICAiXDFcMlwzNDZcMFw0NlwxXDEyXDBcNDdcMVwxMVwwXDFcMVwxXDBcMlwxXDFcMCIrCi0gICAgIlwzXDFcMVwwXDFcMVwxXDBcMlwxXDFcMFw1XDFcNTFcMFwxXDFcMVwwIisKLSAgICAiXDFcMVwxXDBcMVwxXDEzXDBcMVwxXDFcMFwxXDFcMVwwXDFcMVwzXDAiKwotICAgICJcMlwxXDNcMFwxXDFcNVwwXDNcMVwxXDBcMVwxXDFcMFwxXDFcMVwwIisKLSAgICAiXDFcMVwxXDBcMVwxXDNcMFwyXDFcM1wwXDJcMVwxXDBcMVwxXDUwXDAiKwotICAgICJcMVwxXDExXDBcMVwxXDJcMFwxXDFcMlwwXDJcMVw3XDBcMlwxXDFcMCIrCi0gICAgIlwxXDFcMVwwXDdcMVw1MFwwXDFcMVw0XDBcMVwxXDEwXDBcMVwxXHUwYzA2XDAiKwotICAgICJcMjM0XDFcNFwwXDEzMlwxXDZcMFwyNlwxXDJcMFw2XDFcMlwwXDQ2XDFcMlwwIisKLSAgICAiXDZcMVwyXDBcMTBcMVwxXDBcMVwxXDFcMFwxXDFcMVwwXDFcMVwxXDAiKwotICAgICJcMzdcMVwyXDBcNjVcMVwxXDBcN1wxXDFcMFwxXDFcM1wwXDNcMVwxXDAiKwotICAgICJcN1wxXDNcMFw0XDFcMlwwXDZcMVw0XDBcMTVcMVw1XDBcM1wxXDFcMCIrCi0gICAgIlw3XDFcMzIzXDBcMTVcMlw0XDBcMVwyXDEwNFwwXDFcMVwzXDBcMlwxXDJcMCIrCi0gICAgIlwxXDFcMTIxXDBcM1wxXHUwZTgyXDBcMVwyXDFcMFwxXDFcMzFcMFwxMVwxXDZcMiIrCi0gICAgIlwxXDBcNVwyXDEzXDBcMTI0XDFcNFwwXDJcMlwyXDBcMlwyXDJcMFwxMzJcMSIrCi0gICAgIlwxXDBcM1wyXDZcMFw1MFwxXHUxY2QzXDBcdTUxYTZcMVx1MGM1YVwwXHUyYmE0XDFcdTI4NWNcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgW10gWlpfQ01BUCA9IHp6VW5wYWNrQ01hcChaWl9DTUFQX1BBQ0tFRCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIERGQSBzdGF0ZXMgdG8gYWN0aW9uIHN3aXRjaCBsYWJlbHMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfQUNUSU9OID0genpVbnBhY2tBY3Rpb24oKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQUNUSU9OX1BBQ0tFRF8wID0KLSAgICAiXDFcMFwxXDFcMVwyXDFcMyI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrQWN0aW9uKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzRdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQWN0aW9uKFpaX0FDVElPTl9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBY3Rpb24oU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9ST1dNQVAgPSB6elVucGFja1Jvd01hcCgpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9ST1dNQVBfUEFDS0VEXzAgPQotICAgICJcMFwwXDBcNFwwXDEwXDBcMTQiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja1Jvd01hcCgpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs0XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja1Jvd01hcChaWl9ST1dNQVBfUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrUm93TWFwKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBoaWdoID0gcGFja2VkLmNoYXJBdChpKyspIDw8IDE2OwotICAgICAgcmVzdWx0W2orK10gPSBoaWdoIHwgcGFja2VkLmNoYXJBdChpKyspOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1RSQU5TIFtdID0gewotICAgIDEsIDIsIDEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMywgMiwgCi0gICAgMiwgLTEsIDMsIDMsIDMsIC0xCi0gIH07Ci0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1VOS05PV05fRVJST1IgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTk9fTUFUQ0ggPSAxOwotLy8gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9QVVNIQkFDS18yQklHID0gMjsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqCi0gICAqIFpaX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BVFRSSUJVVEUgPSB6elVucGFja0F0dHJpYnV0ZSgpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BVFRSSUJVVEVfUEFDS0VEXzAgPQotICAgICJcMVwwXDFcMTFcMlwxIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBdHRyaWJ1dGUoKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbNF07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tBdHRyaWJ1dGUoWlpfQVRUUklCVVRFX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja0F0dHJpYnV0ZShTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB6elJlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB6elN0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHp6QnVmZmVyW10gPSBuZXcgY2hhcltaWl9CVUZGRVJTSVpFXTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpNYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHp6UHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6ekN1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6elN0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHp6RW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0vLyAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLS8vICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotLy8gIHByaXZhdGUgaW50IHl5Y29sdW1uOwotCi0gIC8qKiAKLSAgICogenpBdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0vLyAgcHJpdmF0ZSBib29sZWFuIHp6QXRCT0wgPSB0cnVlOwotCi0gIC8qKiB6ekF0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGF0IHRoZSBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6QXRFT0Y7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotICAgICAgICBib29sZWFuIHJlc3VsdDsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFhNTDEwTmFtZXMoKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy56elJlYWRlciA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkWE1MMTBOYW1lKFN0cmluZyBzdHJpbmdUb0NoZWNrKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB5eXJlc2V0KG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihzdHJpbmdUb0NoZWNrKSk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzVmFsaWRYTUwxME5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGltcG9zc2libGUgd2l0aCBzdHJpbmdzLCBidXQgaWYgb2NjdXJzLCBqdXN0IG1lYW5zCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAibm90IgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTDEwTmFtZXMoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnp6UmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUwxME5hbWVzKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10genpVbnBhY2tDTWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDEyMTgpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlZmlsbHMgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgaWZmIHRoZXJlIHdhcyBuZXcgaW5wdXQuCi0gICAqIAotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB6elJlZmlsbCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHp6U3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgenpTdGFydFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLCAwLAotICAgICAgICAgICAgICAgICAgICAgICB6ekVuZFJlYWQtenpTdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgenpFbmRSZWFkLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ekN1cnJlbnRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6TWFya2VkUG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6elB1c2hiYWNrUG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6elN0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh6ekN1cnJlbnRQb3MgPj0genpCdWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt6ekN1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHp6QnVmZmVyLmxlbmd0aCk7Ci0gICAgICB6ekJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHp6UmVhZGVyLnJlYWQoenpCdWZmZXIsIHp6RW5kUmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIubGVuZ3RoLXp6RW5kUmVhZCk7Ci0KLSAgICBpZiAobnVtUmVhZCA8IDApIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHp6RW5kUmVhZCs9IG51bVJlYWQ7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLS8vICBwcml2YXRlIGZpbmFsIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLS8vICAgIHp6QXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0vLyAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0vLwotLy8gICAgaWYgKHp6UmVhZGVyICE9IG51bGwpCi0vLyAgICAgIHp6UmVhZGVyLmNsb3NlKCk7Ci0vLyAgfQotCi0KLSAgLyoqCi0gICAqIFJlc2V0cyB0aGUgc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcgaW5wdXQgc3RyZWFtLgotICAgKiBEb2VzIG5vdCBjbG9zZSB0aGUgb2xkIHJlYWRlci4KLSAgICoKLSAgICogQWxsIGludGVybmFsIHZhcmlhYmxlcyBhcmUgcmVzZXQsIHRoZSBvbGQgaW5wdXQgc3RyZWFtIAotICAgKiA8Yj5jYW5ub3Q8L2I+IGJlIHJldXNlZCAoaW50ZXJuYWwgYnVmZmVyIGlzIGRpc2NhcmRlZCBhbmQgbG9zdCkuCi0gICAqIExleGljYWwgc3RhdGUgaXMgc2V0IHRvIDx0dD5aWl9JTklUSUFMPC90dD4uCi0gICAqCi0gICAqIEBwYXJhbSByZWFkZXIgICB0aGUgbmV3IGlucHV0IHN0cmVhbSAKLSAgICovCi0gIHByaXZhdGUgZmluYWwgdm9pZCB5eXJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlcikgewotICAgIHp6UmVhZGVyID0gcmVhZGVyOwotLy8gICAgenpBdEJPTCAgPSB0cnVlOwotICAgIHp6QXRFT0YgID0gZmFsc2U7Ci0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQgPSAwOwotICAgIHp6Q3VycmVudFBvcyA9IHp6TWFya2VkUG9zID0genpQdXNoYmFja1BvcyA9IDA7Ci0vLyAgICB5eWxpbmUgPSB5eWNoYXIgPSB5eWNvbHVtbiA9IDA7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotLy8gIHByaXZhdGUgZmluYWwgaW50IHl5c3RhdGUoKSB7Ci0vLyAgICByZXR1cm4genpMZXhpY2FsU3RhdGU7Ci0vLyAgfQotCi0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0vLyAgcHJpdmF0ZSBmaW5hbCB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0vLyAgICB6ekxleGljYWxTdGF0ZSA9IG5ld1N0YXRlOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLS8vICBwcml2YXRlIGZpbmFsIFN0cmluZyB5eXRleHQoKSB7Ci0vLyAgICByZXR1cm4gbmV3IFN0cmluZyggenpCdWZmZXIsIHp6U3RhcnRSZWFkLCB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZCApOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gPHR0PnBvczwvdHQ+IGZyb20gdGhlIAotICAgKiBtYXRjaGVkIHRleHQuIAotICAgKiAKLSAgICogSXQgaXMgZXF1aXZhbGVudCB0byB5eXRleHQoKS5jaGFyQXQocG9zKSwgYnV0IGZhc3RlcgotICAgKgotICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGZldGNoLiAKLSAgICogICAgICAgICAgICBBIHZhbHVlIGZyb20gMCB0byB5eWxlbmd0aCgpLTEuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiBwb3MKLSAgICovCi0vLyAgcHJpdmF0ZSBmaW5hbCBjaGFyIHl5Y2hhcmF0KGludCBwb3MpIHsKLS8vICAgIHJldHVybiB6ekJ1ZmZlclt6elN0YXJ0UmVhZCtwb3NdOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotLy8gIHByaXZhdGUgZmluYWwgaW50IHl5bGVuZ3RoKCkgewotLy8gICAgcmV0dXJuIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogSW4gYSB3ZWxsZm9ybWVkIHNjYW5uZXIgKG5vIG9yIG9ubHkgY29ycmVjdCB1c2FnZSBvZiAKLSAgICogeXlwdXNoYmFjayhpbnQpIGFuZCBhIG1hdGNoLWFsbCBmYWxsYmFjayBydWxlKSB0aGlzIG1ldGhvZCAKLSAgICogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoaW5ncyB0aGF0ICJDYW4ndCBQb3NzaWJseSBIYXBwZW4iLgotICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcKLSAgICogKGUuZy4gYSBKRmxleCBidWcgcHJvZHVjaW5nIGEgZmF1bHR5IHNjYW5uZXIgZXRjLikuCi0gICAqCi0gICAqIFVzdWFsIHN5bnRheC9zY2FubmVyIGxldmVsIGVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lCi0gICAqIGluIGVycm9yIGZhbGxiYWNrIHJ1bGVzLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHp6U2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICB0cnkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1tlcnJvckNvZGVdOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbWlpfVU5LTk9XTl9FUlJPUl07Ci0gICAgfQotCi0gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0vLyAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgIHsKLS8vICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0vLyAgICAgIHp6U2NhbkVycm9yKFpaX1BVU0hCQUNLXzJCSUcpOwotLy8KLS8vICAgIHp6TWFya2VkUG9zIC09IG51bWJlcjsKLS8vICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFhNTDEwTmFtZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgenpJbnB1dDsKLSAgICBpbnQgenpBY3Rpb247Ci0KLSAgICAvLyBjYWNoZWQgZmllbGRzOgotICAgIGludCB6ekN1cnJlbnRQb3NMOwotICAgIGludCB6ek1hcmtlZFBvc0w7Ci0gICAgaW50IHp6RW5kUmVhZEwgPSB6ekVuZFJlYWQ7Ci0gICAgY2hhciBbXSB6ekJ1ZmZlckwgPSB6ekJ1ZmZlcjsKLSAgICBjaGFyIFtdIHp6Q01hcEwgPSBaWl9DTUFQOwotCi0gICAgaW50IFtdIHp6VHJhbnNMID0gWlpfVFJBTlM7Ci0gICAgaW50IFtdIHp6Um93TWFwTCA9IFpaX1JPV01BUDsKLSAgICBpbnQgW10genpBdHRyTCA9IFpaX0FUVFJJQlVURTsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLQotICAgICAgenpBY3Rpb24gPSAtMTsKLQotICAgICAgenpDdXJyZW50UG9zTCA9IHp6Q3VycmVudFBvcyA9IHp6U3RhcnRSZWFkID0genpNYXJrZWRQb3NMOwotICAKLSAgICAgIHp6U3RhdGUgPSB6ekxleGljYWxTdGF0ZTsKLQotCi0gICAgICB6ekZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIGlmICh6ekN1cnJlbnRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICBlbHNlIGlmICh6ekF0RU9GKSB7Ci0gICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbnMKLSAgICAgICAgICAgIHp6Q3VycmVudFBvcyAgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgenpNYXJrZWRQb3MgICA9IHp6TWFya2VkUG9zTDsKLSAgICAgICAgICAgIGJvb2xlYW4gZW9mID0genpSZWZpbGwoKTsKLSAgICAgICAgICAgIC8vIGdldCB0cmFuc2xhdGVkIHBvc2l0aW9ucyBhbmQgcG9zc2libHkgbmV3IGJ1ZmZlcgotICAgICAgICAgICAgenpDdXJyZW50UG9zTCAgPSB6ekN1cnJlbnRQb3M7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgICA9IHp6TWFya2VkUG9zOwotICAgICAgICAgICAgenpCdWZmZXJMICAgICAgPSB6ekJ1ZmZlcjsKLSAgICAgICAgICAgIHp6RW5kUmVhZEwgICAgID0genpFbmRSZWFkOwotICAgICAgICAgICAgaWYgKGVvZikgewotICAgICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaW50IHp6TmV4dCA9IHp6VHJhbnNMWyB6elJvd01hcExbenpTdGF0ZV0gKyB6ekNNYXBMW3p6SW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHp6TmV4dCA9PSAtMSkgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgenpTdGF0ZSA9IHp6TmV4dDsKLQotICAgICAgICAgIGludCB6ekF0dHJpYnV0ZXMgPSB6ekF0dHJMW3p6U3RhdGVdOwotICAgICAgICAgIGlmICggKHp6QXR0cmlidXRlcyAmIDEpID09IDEgKSB7Ci0gICAgICAgICAgICB6ekFjdGlvbiA9IHp6U3RhdGU7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgaWYgKCAoenpBdHRyaWJ1dGVzICYgOCkgPT0gOCApIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9uCi0gICAgICB6ek1hcmtlZFBvcyA9IHp6TWFya2VkUG9zTDsKLQotICAgICAgc3dpdGNoICh6ekFjdGlvbiA8IDAgPyB6ekFjdGlvbiA6IFpaX0FDVElPTlt6ekFjdGlvbl0pIHsKLSAgICAgICAgY2FzZSAxOiAKLSAgICAgICAgICB7IHJldHVybiBmYWxzZTsgLyogbWF0Y2hlZCB3aWxkICovCi0gICAgICAgICAgfQotICAgICAgICBjYXNlIDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDI6IAotICAgICAgICAgIHsgcmV0dXJuIHRydWU7IC8qIGV4YWN0IG5hbWUgKi8KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogCi0gICAgICAgICAgeyByZXR1cm4gZmFsc2U7IC8qIG1vcmUgdGhhbiBuYW1lICovCi0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoenpJbnB1dCA9PSBZWUVPRiAmJiB6elN0YXJ0UmVhZCA9PSB6ekN1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHp6QXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgICB7IHtyZXR1cm4gZmFsc2U7IC8qIGhpdCBlbmQgd2l0aCBubyBtYXRjaCAqL30gfQotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB6elNjYW5FcnJvcihaWl9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFNvdXJjZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU291cmNlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhODc5MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU291cmNlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVGFnUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQ2hhclNlcXVlbmNlUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LklSZWdpb25Db21wYXJpYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqIFRha2VzIGlucHV0IGZyb20gdGhlIEhUTUxUb2tlbml6ZXIgYW5kIGNyZWF0ZXMgYSB0YWcgbGlzdAotICovCi0KLXB1YmxpYyBjbGFzcyBYTUxTb3VyY2VQYXJzZXIgaW1wbGVtZW50cyBSZWdpb25QYXJzZXIsIEJsb2NrVGFnUGFyc2VyLCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIsIElSZWdpb25Db21wYXJpYmxlLCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb24gewotCS8vIG1hZGUgcHVibGljIHRvIGFpZCBhY2Nlc3MgZnJvbSBpbm5lciBjbGFzc2VzIGluIGhpZXJhcmNoeS4KLQkvLyBUT0RPOiBpbiBmdXR1cmUsIGZpZ3VyZSBvdXQgaG93IHRvIHNvbHZlIHdpdGhvdXQgZXhwb3NpbmcgZGF0YS4KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIGZDaGFyU2VxdWVuY2VTb3VyY2UgPSBudWxsOwotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudElucHV0OwotCXByb3RlY3RlZCBpbnQgZk9mZnNldCA9IDA7Ci0JLy8gRE1XOiAyLzEyLzAzLiBSZW1vdmVkIHNvbWUgc3RhdGUgZGF0YSwgc2luY2Ugbm90IHJlYWxseSBuZWVkZWQsCi0JLy8gYW5kIHNpbmNlIGl0IGFkZGVkIGEgbG90IHRvIG92ZXJoZWFkIChzaW5jZSBzbyBtYW55IHJlZ2lvbnMgYXJlCi0JLy8gY3JlYXRlZC4KLQkvLyBwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmQ3VycmVudE5vZGUgPSBudWxsOwotCS8vIHByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZOb2RlcyA9IG51bGw7Ci0JLy8gcHJvdGVjdGVkIExpc3QgZlJlZ2lvbnMgPSBudWxsOwotCS8vIHByb3RlY3RlZCBPYmplY3QgZklucHV0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZTdHJpbmdJbnB1dCA9IG51bGw7Ci0JcHJvdGVjdGVkIExpc3QgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzOwotCi0JcHJvdGVjdGVkIEJsb2NrVG9rZW5pemVyIGZUb2tlbml6ZXIgPSBudWxsOwotCXByb3RlY3RlZCBsb25nIHN0YXJ0VGltZTsKLQlwcm90ZWN0ZWQgbG9uZyBzdG9wVGltZTsKLQotCS8qKgotCSAqIEhUTUxTb3VyY2VQYXJzZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWE1MU291cmNlUGFyc2VyKCkgewotCQlzdXBlcigpOwotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBhIHNpbXBsZSB1dGlsaXR5IHRvIGNvdW50IG5vZGVzLiBVc2VkIG9ubHkgZm9yIGRlYnVnCi0JICogc3RhdGVtZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IF9jb3VudE5vZGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZXMpIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY291bnROb2RlID0gbm9kZXM7Ci0JCXdoaWxlIChjb3VudE5vZGUgIT0gbnVsbCkgewotCQkJcmVzdWx0Kys7Ci0JCQljb3VudE5vZGUgPSBjb3VudE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JCWdldFRva2VuaXplcigpLmFkZEJsb2NrTWFya2VyKG1hcmtlcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBoYW5kbGVyKSB7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPT0gbnVsbCkKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3luY2hyb25pemVkIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMpIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy5hZGQoaGFuZGxlcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpbkJsb2NrU2NhbihTdHJpbmcgbmV3VGFnTmFtZSkgewotCQlnZXRUb2tlbml6ZXIoKS5iZWdpbkJsb2NrVGFnU2NhbihuZXdUYWdOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oU3RyaW5nIHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlID0gbnVsbDsKLQkJaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKQotCQkJbmV3Tm9kZSA9IFhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LmNyZWF0ZVJlZ2lvbihYTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5YTUxfQkxPQ0spOwotCQllbHNlCi0JCQluZXdOb2RlID0gWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKFhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LlhNTCk7Ci0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpcmVOb2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZkN1cnJlbnROb2RlKSB7Ci0JCS8qCi0JCSAqIE5ldmVyIGxldCBhbiBFeGNlcHRpb25zIGZyb20gZm9yZWlnbiBjb2RlIGludGVyZmVyZSB3aXRoIGNvbXBsZXRpb24KLQkJICogb2YgcGFyc2luZy4gVG8gZ2V0IGFuIGV4Y2VwdGlvbiBoZXJlIGlzIGRlZmluaXRlbHkgYSBwcm9ncmFtIGVycm9yCi0JCSAqIHNvbWV3aGVyZSwgYnV0IHdlIGNhbid0IGFmZm9yZCB0byBpbnRlcnJ1cHQgdGhlIGZsb3cgb2YgY29udHJvbC4gb3IKLQkJICogYmFja3dhcmRzIHR5cGluZyBjYW4gcmVzdWx0IQotCQkgKiAKLQkJICogUHJvdGVjdCB0aGUgdXNlcidzIGRhdGEgYWJvdmUgZXZlcnl0aGluZy4KLQkJICovCi0JCU9iamVjdFtdIGhhbmRsZXJzID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMpIHsKLQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCWhhbmRsZXJzID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzLnRvQXJyYXkoKTsKLQkJfQotCQlpZiAoZkN1cnJlbnROb2RlICE9IG51bGwgJiYgaGFuZGxlcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCSgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcikgaGFuZGxlcnNbaV0pLm5vZGVQYXJzZWQoZkN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiRXJyb3Igb2NjdXJyZWQgd2hpbGUgZmlyaW5nIE5vZGUgUGFyc2VkIGV2ZW50IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQmxvY2tNYXJrZXIgZ2V0QmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUpIHsKLQkJTGlzdCBtYXJrZXJzID0gZ2V0VG9rZW5pemVyKCkuZ2V0QmxvY2tNYXJrZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKSBtYXJrZXJzLmdldChpKTsKLQkJCWlmIChtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCQlpZiAobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHModGFnTmFtZSkpCi0JCQkJCXJldHVybiBtYXJrZXI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpKQotCQkJCQlyZXR1cm4gbWFya2VyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQkJcmV0dXJuIGdldFRva2VuaXplcigpLmdldEJsb2NrTWFya2VycygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldERvY3VtZW50UmVnaW9ucygpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkbm9kZSA9IG51bGw7Ci0JCWlmIChoZWFkbm9kZSA9PSBudWxsKSB7Ci0JCQlpZiAoRGVidWcucGVyZlRlc3QpIHsKLQkJCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJCWhlYWRub2RlID0gcGFyc2VOb2RlcygpOwotCQkJaWYgKERlYnVnLnBlcmZUZXN0KSB7Ci0JCQkJc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAtLSBjcmVhdGluZyBub2RlcyBvZiBJU3RydWN0dXJlZERvY3VtZW50IC0tICIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgVGltZSBwYXJzZSBhbmQgaW5pdCBhbGwgcmVnaW9uczogIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIChtc2VjcykiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBmb3IgIiArIGZSZWdpb25zLnNpemUoKSArICIKLQkJCQkvLyBSZWdpb25zIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgIGFuZCAiICsgX2NvdW50Tm9kZXMoaGVhZG5vZGUpICsgIiBOb2RlcyIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBoZWFkbm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0TmV4dFJlZ2lvbigpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZ2lvbiA9IGdldFRva2VuaXplcigpLmdldE5leHRUb2tlbigpOwotCQkJLy8gRE1XOiAyLzEyLzAzIFJlbW92ZWQgc3RhdGUKLQkJCS8vIGlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJLy8gZlJlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JCQkvLyB9Ci0JCQlyZXR1cm4gcmVnaW9uOwotCQl9Ci0JCWNhdGNoIChTdGFja092ZXJmbG93RXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSArICI6IGlucHV0IGNvdWxkIG5vdCBiZSBwYXJzZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRUb2tlbml6ZXIoKS5nZXRPZmZzZXQoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IGU7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogaW5wdXQgY291bGQgbm90IGJlIHBhcnNlZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldFRva2VuaXplcigpLmdldE9mZnNldCgpICsgIiAoIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICsgIikiLCBlKTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxsIGxpc3Qgb2Yga25vd24gcmVnaW9ucy4gVHlwaWNhbGx5IGdldE5vZGVzIHNob3VsZCBiZQotCSAqIHVzZWQgaW5zdGVhZCBvZiB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWdpb25zKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gbnVsbDsKLQkJaWYgKCFnZXRUb2tlbml6ZXIoKS5pc0VPRigpKSB7Ci0JCQloZWFkTm9kZSA9IGdldERvY3VtZW50UmVnaW9ucygpOwotCQkJLy8gdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicGFyc2luZyBoYXMgbm90IGZpbmlzaGVkIik7Ci0JCX0KLQkJLy8gZm9yIG1lbW9yeSByZWNvdmVyeSwgd2UgYXNzdW1lIGlmIHNvbWVvbmUKLQkJLy8gcmVxdWVzdHMgYWxsIHJlZ2lvbnMsIHdlIGNhbiByZXNldCBvdXIgYmlnCi0JCS8vIG1lbW9yeSBjb25zdW1pbmcgb2JqZWN0cwotCQkvLyBidXQgdGhlIG5ldyAiZ2V0UmVnaW9ucyIgbWV0aG9kIGlzIHRoZW4gbW9yZSBleHBlbnNpdmUuCi0JCS8vIEkgZG9uJ3QgdGhpbmsgaXRzIHVzZWQgbXVjaCwgdGhvdWdoLgotCQlMaXN0IGxvY2FsUmVnaW9uc0xpc3QgPSBnZXRSZWdpb25zKGhlYWROb2RlKTsKLQkJcHJpbVJlc2V0KCk7Ci0JCXJldHVybiBsb2NhbFJlZ2lvbnNMaXN0OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRSZWdpb25zLgotCSAqIAotCSAqIEBwYXJhbSBoZWFkTm9kZQotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSkgewotCQlMaXN0IGFsbFJlZ2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBoZWFkTm9kZTsKLQkJd2hpbGUgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCBub2RlUmVnaW9ucyA9IGN1cnJlbnROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZVJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhbGxSZWdpb25zLmFkZChub2RlUmVnaW9ucy5nZXQoaSkpOwotCQkJfQotCQkJY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIGFsbFJlZ2lvbnM7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgdGhlIGFkZC9yZW1vdmUgbWV0aG9kcyBpbnN0ZWFkCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKCkgewotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzID09IG51bGwpIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCX0KLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRleHQgZnJvbSB0aGUgY3VycmVudCBpbnB1dC4gVGV4dCBpcyBvbmx5IHZhbGlkIGJlZm9yZQotCSAqIGdldE5vZGVzKCkgaGFzIGJlZW4gY2FsbGVkIGFuZCBvbmx5IHdoZW4gYSByYXcgU3RyaW5nIG9yIERvY3VtZW50UmVhZGVyCi0JICogaXMgZ2l2ZW4gYXMgdGhlIGlucHV0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGZDaGFyU2VxdWVuY2VTb3VyY2UgIT0gbnVsbCkgewotCQkJaW50IHN0YXJ0ID0gZk9mZnNldCArIG9mZnNldDsKLQkJCWludCBlbmQgPSBzdGFydCArIGxlbmd0aDsKLQkJCXRleHQgPSBmQ2hhclNlcXVlbmNlU291cmNlLnN1YlNlcXVlbmNlKHN0YXJ0LCBlbmQpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZkRvY3VtZW50SW5wdXQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl0ZXh0ID0gZkRvY3VtZW50SW5wdXQuZ2V0KG9mZnNldCwgbGVuZ3RoKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZlN0cmluZ0lucHV0ID09IG51bGwgfHwgZlN0cmluZ0lucHV0Lmxlbmd0aCgpID09IDAgfHwgb2Zmc2V0ICsgbGVuZ3RoID4gZlN0cmluZ0lucHV0Lmxlbmd0aCgpIHx8IG9mZnNldCA8IDApIHsKLQkJCQl0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG9mZnNldCBpcyBlbnRpcmVseSB2YWxpZCBkdXJpbmcgcGFyc2luZyBhcyB0aGUgcGFyc2UKLQkJCQkvLyBudW1iZXJzIGhhdmVuJ3QgYmVlbiBhZGp1c3RlZC4KLQkJCQl0ZXh0ID0gZlN0cmluZ0lucHV0LnN1YnN0cmluZyhvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIEJsb2NrVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBYTUxUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVhNTFNvdXJjZVBhcnNlciBuZXdJbnN0YW5jZSA9IG5ldyBYTUxTb3VyY2VQYXJzZXIoKTsKLQkJbmV3SW5zdGFuY2Uuc2V0VG9rZW5pemVyKGdldFRva2VuaXplcigpLm5ld0luc3RhbmNlKCkpOwotCQlyZXR1cm4gbmV3SW5zdGFuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyc2VOb2RlcygpIHsKLQkJLy8gcmVnaW9ucyBhcmUgaW5pdGlhbGx5IHJlcG9ydGVkIGFzIGNvbXBsZXRlIG9mZnNldHMgd2l0aGluIHRoZQotCQkvLyBzY2FubmVkIGlucHV0Ci0JCS8vIHRoZXkgYXJlIGFkanVzdGVkIGhlcmUgdG8gYmUgaW5kZXhlcyBmcm9tIHRoZSBjdXJyZW50Tm9kZSdzIHN0YXJ0Ci0JCS8vIG9mZnNldAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBudWxsOwotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0KLQkJd2hpbGUgKChyZWdpb24gPSBnZXROZXh0UmVnaW9uKCkpICE9IG51bGwpIHsKLQkJCXR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJLy8gdGhlc2UgdHlwZXMgKG1pZ2h0KSBkZW1hbmQgYSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZvciBlYWNoCi0JCQkvLyBvZiB0aGVtCi0JCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJCQkvLyBtdWx0aXBsZSBibG9jayB0ZXh0cyBpbmRpY2F0ZWQgZW1iZWRkZWQgY29udGFpbmVyczsgbm8KLQkJCQkJLy8gbmV3IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbm90IGNvbnRpbnVpbmcgYSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBlbnN1cmUgdGhhdCBhbnkgZXhpc3Rpbmcgbm9kZSBpcyBhdCBsZWFzdAotCQkJCQkJLy8gdGVybWluYXRlZAotCQkJCQkJaWYgKCFjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHsKLQkJCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJCQkvLyBmQ3VycmVudE5vZGUuc2V0VGV4dExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtCi0JCQkJCQkJLy8gZkN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkJfQotCQkJCQkJbGFzdE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCQkJfQotCQkJCQlmaXJlTm9kZVBhcnNlZChjdXJyZW50Tm9kZSk7Ci0JCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCQkJbGFzdE5vZGUuc2V0TmV4dChjdXJyZW50Tm9kZSk7Ci0JCQkJCX0KLQkJCQkJY3VycmVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gdGhlIGZvbGxvd2luZyBjb250ZXh0cyBPUEVOIG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JCQllbHNlIGlmICgoY3VycmVudE5vZGUgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pKSB7Ci0JCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkJLy8gZW5zdXJlIHRoYXQgYW55IGV4aXN0aW5nIG5vZGUgaXMgYXQgbGVhc3QgdGVybWluYXRlZAotCQkJCQlpZiAoIWN1cnJlbnROb2RlLmlzRW5kZWQoKSkgewotCQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCQkvLyBmQ3VycmVudE5vZGUuc2V0VGV4dExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtCi0JCQkJCQkvLyBmQ3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCX0KLQkJCQkJbGFzdE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCQl9Ci0JCQkJZmlyZU5vZGVQYXJzZWQoY3VycmVudE5vZGUpOwotCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCWxhc3ROb2RlLnNldE5leHQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQkJY3VycmVudE5vZGUuc2V0U3RhcnQocmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJfQotCQkJLy8gdGhlIGZvbGxvd2luZyBjb250ZXh0cyBuZWl0aGVyIG9wZW4gbm9yIGNsb3NlCi0JCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zOyBqdXN0IGFkZCB0byB0aGVtCi0JCQllbHNlIGlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5UKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVCkpIHsKLQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJCS8vIHRoZSBmb2xsb3dpbmcgY29udGV4dHMgY2xvc2Ugb2ZmIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkJCS8vIGNsZWFubHkKLQkJCWVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFKSkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJfQotCQkJLy8gdGhpcyBpcyBleHRyZW1lbHkgcmFyZSwgYnV0IHZhbGlkCi0JCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0UpIHsKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpOwotCQkJCS8vIHBhY2sgdGhlIGVtYmVkZGVkIGNvbnRhaW5lciB3aXRoIHRoaXMgcmVnaW9uCi0JCQkJaWYgKGxhc3RSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQlJVGV4dFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoSVRleHRSZWdpb25Db250YWluZXIpIGxhc3RSZWdpb247Ci0JCQkJCWNvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKHJlZ2lvbik7Ci0JCQkJCS8vIGNvbnRhaW5lcnMgbXVzdCBoYXZlIHBhcmVudCBzZXQgLi4uCi0JCQkJCS8vIHNldHRpbmcgZm9yIEVBQ0ggc3VicmVnaW9uIGlzIHJlZHVuZGVudCwgYnV0IG5vdCBzdXJlCi0JCQkJCS8vIHdoZXJlIGVsc2UgdG8gZG8sIHNvIHdpbGwgZG8gaGVyZSBmb3Igbm93LgotCQkJCQljb250YWluZXIuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGNvbnRhaW5lcik7Ci0JCQkJCXJlZ2lvbi5hZGp1c3RTdGFydChjb250YWluZXIuZ2V0TGVuZ3RoKCkgLSByZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJfQotCQkJCWN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQljdXJyZW50Tm9kZS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQgJiYgY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCS8vIHNraXAgb24gYSB2ZXJ5LWZpcnN0IHJlZ2lvbiBzaXR1YXRpb24gYXMgdGhlIGRlZmF1bHQKLQkJCQkvLyBiZWhhdmlvciBpcyBnb29kIGVub3VnaAotCQkJCS8vIGNvbWJpbmUgd2l0aCBwcmV2aW91cyBpZiBhbHNvIHVuZGVmaW5lZAotCQkJCWlmIChjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEKSB7Ci0JCQkJCWN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJY3VycmVudE5vZGUuYWRqdXN0TGVuZ3RoKHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJCS8vIHByZXZpb3VzIHdhc24ndCB1bmRlZmluZWQKLQkJCQllbHNlIHsKLQkJCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGlmIGFuIHVua25vd24gdHlwZSBpcyB0aGUgZmlyc3QgcmVnaW9uIGluIHRoZSBkb2N1bWVudCwKLQkJCQkvLyBlbnN1cmUgdGhhdCBhIG5vZGUgZXhpc3RzCi0JCQkJaWYgKGN1cnJlbnROb2RlID09IG51bGwpIHsKLQkJCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldFN0YXJ0KHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQl9Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZvdW5kIHJlZ2lvbiBvZiBub3Qgc3BlY2lmaWNhbGx5IGhhbmRsZWQgdHlwZSAiICsgcmVnaW9uLmdldFR5cGUoKSArICIgQCAiICsgcmVnaW9uLmdldFN0YXJ0KCkgKyAiWyIgKyByZWdpb24uZ2V0TGVuZ3RoKCkgKyAiXSIpOyAvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCS8vIHRoZXNlIHJlZ2lvbnMgYWxzbyBnZXQgdGhlaXIgb3duIG5vZGUsIHNvIGNsb3NlIHRoZW0gY2xlYW5seQotCQkJLy8gTk9URTogdGhlc2UgcmVnaW9ucyBoYXZlIG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIGNyZWF0ZWQKLQkJCS8vIGZvciB0aGVtIGFib3ZlOyBpdCBtYXkKLQkJCS8vIGJlIG1vcmUgcmVhZGFibGUgaWYgdGhhdCBpcyBoYW5kbGVkIGhlcmUgYXMgd2VsbCwgYnV0IHRoZQotCQkJLy8gY3VycmVudCBsYXlvdXQKLQkJCS8vIGVuc3VyZXMgdGhhdCB0aGV5IG9wZW4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyB0aGUgc2FtZSB3YXkKLQkJCWlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSkpIHsKLQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCX0KLQkJCWlmIChoZWFkTm9kZSA9PSBudWxsICYmIGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQloZWFkTm9kZSA9IGN1cnJlbnROb2RlOwotCQkJfQotCQl9Ci0JCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlmaXJlTm9kZVBhcnNlZChjdXJyZW50Tm9kZSk7Ci0JCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCX0KLQkJLy8gZlN0cmluZ0lucHV0ID0gbnVsbDsKLQkJcHJpbVJlc2V0KCk7Ci0JCXJldHVybiBoZWFkTm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUmVzZXQoKSB7Ci0JCS8vIGZOb2RlcyA9IG51bGw7Ci0JCS8vIGZSZWdpb25zID0gbnVsbDsKLQkJLy8gZklucHV0ID0gbnVsbDsKLQkJZlN0cmluZ0lucHV0ID0gbnVsbDsKLQkJZkNoYXJTZXF1ZW5jZVNvdXJjZSA9IG51bGw7Ci0JCWZEb2N1bWVudElucHV0ID0gbnVsbDsKLQkJZk9mZnNldCA9IDA7Ci0JCS8vIGZDdXJyZW50Tm9kZSA9IG51bGw7Ci0JCS8vIERNVzogYWxzbyByZXNldCB0b2tlbml6ZXIgc28gaXQgZG9lc24ndCBob2xkIG9uCi0JCS8vIHRvIGxhcmdlIGFycmF5cwotCQlnZXRUb2tlbml6ZXIoKS5yZXNldChuZXcgY2hhclswXSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5JUmVnaW9uQ29tcGFyaWJsZSNyZWdpb25NYXRjaGVzKGludCwKLQkgKiAgICAgIGludCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWdpb25NYXRjaGVzKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJLy8gYnkgZGVmaW5pdGlvbgotCQlpZiAoc3RyaW5nVG9Db21wYXJlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IGFqdXN0ZWRPZmZzZXQgPSBmT2Zmc2V0ICsgb2Zmc2V0OwotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZkNoYXJTZXF1ZW5jZVNvdXJjZSAhPSBudWxsICYmIGZDaGFyU2VxdWVuY2VTb3VyY2UgaW5zdGFuY2VvZiBJUmVnaW9uQ29tcGFyaWJsZSkgewotCQkJcmVzdWx0ID0gKChJUmVnaW9uQ29tcGFyaWJsZSkgZkNoYXJTZXF1ZW5jZVNvdXJjZSkucmVnaW9uTWF0Y2hlcyhhanVzdGVkT2Zmc2V0LCBsZW5ndGgsIHN0cmluZ1RvQ29tcGFyZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBvbGQgZmFzaGlvbmVkIHdheXMKLQkJCVN0cmluZyB0ZXN0ID0gbnVsbDsKLQkJCWlmIChmQ2hhclNlcXVlbmNlU291cmNlICE9IG51bGwpIHsKLQkJCQl0ZXN0ID0gZkNoYXJTZXF1ZW5jZVNvdXJjZS5zdWJTZXF1ZW5jZShhanVzdGVkT2Zmc2V0LCBhanVzdGVkT2Zmc2V0ICsgbGVuZ3RoKS50b1N0cmluZygpOwotCQkJfQotCQkJZWxzZSBpZiAoZlN0cmluZ0lucHV0ICE9IG51bGwpIHsKLQkJCQl0ZXN0ID0gZlN0cmluZ0lucHV0LnN1YnN0cmluZyhhanVzdGVkT2Zmc2V0LCBhanVzdGVkT2Zmc2V0ICsgbGVuZ3RoKTsKLQkJCX0KLQkJCXJlc3VsdCA9IHN0cmluZ1RvQ29tcGFyZS5lcXVhbHModGVzdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCS8vIGJ5IGRlZmluaXRpb24KLQkJaWYgKHN0cmluZ1RvQ29tcGFyZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWludCBhanVzdGVkT2Zmc2V0ID0gZk9mZnNldCArIG9mZnNldDsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGZDaGFyU2VxdWVuY2VTb3VyY2UgIT0gbnVsbCAmJiBmQ2hhclNlcXVlbmNlU291cmNlIGluc3RhbmNlb2YgSVJlZ2lvbkNvbXBhcmlibGUpIHsKLQkJCXJlc3VsdCA9ICgoSVJlZ2lvbkNvbXBhcmlibGUpIGZDaGFyU2VxdWVuY2VTb3VyY2UpLnJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKGFqdXN0ZWRPZmZzZXQsIGxlbmd0aCwgc3RyaW5nVG9Db21wYXJlKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIG9sZCBmYXNoaW9uZWQgd2F5cwotCQkJU3RyaW5nIHRlc3QgPSBudWxsOwotCQkJaWYgKGZDaGFyU2VxdWVuY2VTb3VyY2UgIT0gbnVsbCkgewotCQkJCXRlc3QgPSBmQ2hhclNlcXVlbmNlU291cmNlLnN1YlNlcXVlbmNlKGFqdXN0ZWRPZmZzZXQsIGFqdXN0ZWRPZmZzZXQgKyBsZW5ndGgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChmU3RyaW5nSW5wdXQgIT0gbnVsbCkgewotCQkJCXRlc3QgPSBmU3RyaW5nSW5wdXQuc3Vic3RyaW5nKGFqdXN0ZWRPZmZzZXQsIGFqdXN0ZWRPZmZzZXQgKyBsZW5ndGgpOwotCQkJfQotCQkJcmVzdWx0ID0gc3RyaW5nVG9Db21wYXJlLmVxdWFsc0lnbm9yZUNhc2UodGVzdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQkJZ2V0VG9rZW5pemVyKCkucmVtb3ZlQmxvY2tNYXJrZXIobWFya2VyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgewotCQlnZXRUb2tlbml6ZXIoKS5yZW1vdmVCbG9ja01hcmtlcih0YWdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgaGFuZGxlcikgewotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXN5bmNocm9uaXplZCAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKSB7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMucmVtb3ZlKGhhbmRsZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSBpbnN0cmVhbSkgewotCQlwcmltUmVzZXQoKTsKLQkJLy8gZklucHV0ID0gaW5zdHJlYW07Ci0JCWdldFRva2VuaXplcigpLnJlc2V0KGluc3RyZWFtKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgdGhlIGlucHV0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlcikgewotCQlyZXNldChyZWFkZXIsIDApOwotCX0KLQotCS8qKgotCSAqIFJlc2V0cyB0aGUgaW5wdXQuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyLCBpbnQgcG9zaXRpb24pIHsKLQkJcHJpbVJlc2V0KCk7Ci0JCWZPZmZzZXQgPSBwb3NpdGlvbjsKLQkJZ2V0VG9rZW5pemVyKCkucmVzZXQocmVhZGVyLCBwb3NpdGlvbik7Ci0JCWlmIChyZWFkZXIgaW5zdGFuY2VvZiBEb2N1bWVudFJlYWRlcikgewotCQkJSURvY3VtZW50IGRvYyA9ICgoRG9jdW1lbnRSZWFkZXIpIHJlYWRlcikuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2MgaW5zdGFuY2VvZiBDaGFyU2VxdWVuY2UpIHsKLQkJCQlmQ2hhclNlcXVlbmNlU291cmNlID0gKENoYXJTZXF1ZW5jZSkgZG9jOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gb2xkIGZhc2hpb25lZCBJRG9jdW1lbnQKLQkJCQlmRG9jdW1lbnRJbnB1dCA9ICgoRG9jdW1lbnRSZWFkZXIpIHJlYWRlcikuZ2V0RG9jdW1lbnQoKTsKLQkJCX0KLQotCQl9Ci0JCWVsc2UgaWYgKHJlYWRlciBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZVJlYWRlcikgewotCQkJZkNoYXJTZXF1ZW5jZVNvdXJjZSA9ICgoQ2hhclNlcXVlbmNlUmVhZGVyKSByZWFkZXIpLmdldE9yaWdpbmFsU291cmNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgdGhlIGlucHV0LiBVc2UgdGhpcyB2ZXJzaW9uIHRvIGFsbG93IHRleHQgdG8gYmUgcmV0cmlldmVkCi0JICogPGVtPmR1cmluZzwvZW0+IHBhcnNpbmcsIHN1Y2ggYXMgYnkgdGhlCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgc291cmNlU3RyaW5nKSB7Ci0JCXJlc2V0KG5ldyBTdHJpbmdSZWFkZXIoc291cmNlU3RyaW5nKSk7Ci0JCWZTdHJpbmdJbnB1dCA9IHNvdXJjZVN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgdGhlIGlucHV0LiBVc2UgdGhpcyB2ZXJzaW9uIHRvIGFsbG93IHRleHQgdG8gYmUgcmV0cmlldmVkCi0JICogPGVtPmR1cmluZzwvZW0+IHBhcnNpbmcsIHN1Y2ggYXMgYnkgdGhlCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgc291cmNlU3RyaW5nLCBpbnQgcG9zaXRpb24pIHsKLQkJU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoc291cmNlU3RyaW5nKTsKLQkJcmVzZXQocmVhZGVyLCBwb3NpdGlvbik7Ci0JCWZTdHJpbmdJbnB1dCA9IHNvdXJjZVN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldEhhbmRsZXJzKCkgewotCQlPYmplY3RbXSBoYW5kbGVycyA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKSB7Ci0JCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQloYW5kbGVycyA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy50b0FycmF5KCk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQkoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIpIGhhbmRsZXJzW2ldKS5yZXNldE5vZGVzKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkVycm9yIG9jY3VycmVkIHdoaWxlIHJlc2V0dGluZyBoYW5kbGVycyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gTGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKExpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMpIHsKLQkJZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VG9rZW5pemVyKEJsb2NrVG9rZW5pemVyIG5ld1Rva2VuaXplcikgewotCQkvLyBETVc6IGNoYW5nZWQgZnJvbSBwcml2YXRlIHRvIHByb3RlY3RlZCwgc28gc3ViY2xhc3MgY291bGQgdXNlIGluCi0JCS8vIGNyZWF0aW9uIG9mICduZXdJbnN0YW5jZScuCi0JCWZUb2tlbml6ZXIgPSBuZXdUb2tlbml6ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODU1MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciB7Ci0KLQlwdWJsaWMgWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZERpcnR5RW5kKGludCBlbmQpIHsKLQkJLy8gQ2F1dGlvbjogaGVyZSdzIG9uZSBwbGFjZSB3ZSBoYXZlIHRvIGNhc3QKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXN1bHQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGVuZCk7Ci0JCS8vIGlmIG5vdCB3ZWxsIGZvcm1lZCwgZ2V0IG9uZSBwYXN0LCBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhlcmUKLQkJaWYgKChyZXN1bHQgIT0gbnVsbCkgJiYgKCFyZXN1bHQuaXNFbmRlZCgpKSkgewotCQkJaWYgKHJlc3VsdC5nZXROZXh0KCkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHJlc3VsdC5nZXROZXh0KCk7Ci0JCQl9Ci0JCX0KLQkJLy8gYWxzbywgZ2V0IG9uZSBwYXN0IGlmIGV4YWN0bHkgZXF1YWwgdG8gdGhlIGVuZCAodGhpcyB3YXMgbmVlZGVkCi0JCS8vIGFzIGEgc2ltcGxlIGZpeCB0byB3aGVuIGEgd2hvbGUgZXhhY3QgcmVnaW9uIGlzIGRlbGV0ZWQuCi0JCS8vIHRoZXJlJ3MgcHJvYmFibHkgYSBiZXR0ZXIgd2F5LgotCQlpZiAoKHJlc3VsdCAhPSBudWxsKSAmJiAoZW5kID09IHJlc3VsdC5nZXRFbmQoKSkpIHsKLQkJCWlmIChyZXN1bHQuZ2V0TmV4dCgpICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQuZ2V0TmV4dCgpOwotCQkJfQotCQl9Ci0KLQkJLy8gMTIvNi8yMDAxIC0gU2luY2Ugd2UndmUgY2hhbmdlZCB0aGUgcGFyc2VyL3NjYW5uZXIgdG8gYWxsb3cgYSBsb25lCi0JCS8vICc8JyB3aXRob3V0Ci0JCS8vIGFsd2F5cyBpbnRlcnByZXR0aW5nIGl0IGFzIHN0YXJ0IG9mIGEgdGFnIG5hbWUsIHdlIG5lZWQgdG8gYmUgYQotCQkvLyBsaXR0bGUgZmFuY2llciwgaW4gb3JkZXIKLQkJLy8gdG8gInNraXAiIG92ZXIgYW55IHBsYWluICdvbCBjb250ZW50IGJldHdlZW4gdGhlIGxvbmUgJzwnIGFuZCBhbnkKLQkJLy8gcG90ZW50aWFsIG1lYXRpbmcKLQkJLy8gcmVnaW9ucyBwYXN0IHBsYWluICdvbCBjb250ZW50LgotCQlpZiAoaXNMb25lT3BlbkZvbGxvd2VkQnlDb250ZW50KHJlc3VsdCkgJiYgKHJlc3VsdC5nZXROZXh0KCkgIT0gbnVsbCkpIHsKLQkJCXJlc3VsdCA9IHJlc3VsdC5nZXROZXh0KCk7Ci0JCX0KLQotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKHJlc3VsdCk7Ci0JCWRpcnR5RW5kID0gcmVzdWx0OwotCi0JCXJldHVybiBkaXJ0eUVuZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaW5kRGlydHlTdGFydChpbnQgc3RhcnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXN1bHQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0KTsKLQkJLy8gaGV1cmlzdGljOiBpZiB0aGUgcG9zdGlvbiBpcyBleGFjdGx5IGVxdWFsIHRvIHRoZSBzdGFydCwgdGhlbgotCQkvLyBnbyBiYWNrIG9uZSBtb3JlLCBpZiBpdCBleGlzdHMuIFRoaXMgcHJldmVudHMgcHJvYmxlbXMgd2l0aAotCQkvLyBpbnNlcnRpb25zCi0JCS8vIG9mIHRleHQgdGhhdCBzaG91bGQgYmUgbWVyZ2VkIHdpdGggdGhlIHByZXZpb3VzIG5vZGUgaW5zdGVhZCBvZgotCQkvLyBzaW1wbHkgaHVuZwotCQkvLyBvZmYgb2YgaXQgYXMgYSBzZXBhcmF0ZSBub2RlIChleC46IFhNTCBjb250ZW50IGluc2VydGVkIHJpZ2h0Ci0JCS8vIGJlZm9yZSBhbiBvcGVuCi0JCS8vIGJyYWNrZXQgc2hvdWxkIGJlY29tZSBwYXJ0IG9mIHRoZSBwcmV2aW91cyBjb250ZW50IG5vZGUpCi0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91cyA9IHJlc3VsdC5nZXRQcmV2aW91cygpOwotCQkJaWYgKChwcmV2aW91cyAhPSBudWxsKSAmJiAoKCEocHJldmlvdXMuaXNFbmRlZCgpKSkgfHwgKHN0YXJ0ID09IHJlc3VsdC5nZXRTdGFydCgpKSkpIHsKLQkJCQlyZXN1bHQgPSBwcmV2aW91czsKLQkJCX0KLQkJCS8vIElmIHdlIGFyZSBub3cgYXQgdGhlIGVuZCBvZiBhICJ0YWcgZGVwZW5kZW50IiBjb250ZW50IGFyZWEgKG9yCi0JCQkvLyBKU1AgYXJlYSkKLQkJCS8vIHRoZW4gd2UgbmVlZCB0byBiYWNrIHVwIGFsbCB0aGUgd2F5IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhhdC4KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcG90ZW50aWFsID0gcmVzdWx0OwotCQkJd2hpbGUgKGlzUGFydE9mQmxvY2tSZWdpb24ocG90ZW50aWFsKSkgewotCQkJCXBvdGVudGlhbCA9IHBvdGVudGlhbC5nZXRQcmV2aW91cygpOwotCQkJfQotCQkJaWYgKHBvdGVudGlhbCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcG90ZW50aWFsOwotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24ocmVzdWx0KTsKLQkJCX0KLQkJfQotCQlkaXJ0eVN0YXJ0ID0gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoZSBydWxlIGlzLCB0aGF0IGlzIHdlIGFyZSBjb250ZW50LCBwcmVjZWRlZCBieSBsb25lIDwsIHRoZW4gd2UgbmVlZAotCSAqIHRvIGFkdmFuY2Ugb25lIG1vcmUgZm9yIGRpcnR5IGVuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0xvbmVPcGVuRm9sbG93ZWRCeUNvbnRlbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlTdHJpbmcgdHlwZSA9IGZsYXROb2RlLmdldFR5cGUoKTsKLQkJaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91cyA9IGZsYXROb2RlLmdldFByZXZpb3VzKCk7Ci0JCQlTdHJpbmcgcHJldmlvdXNUeXBlID0gbnVsbDsKLQkJCWlmIChwcmV2aW91cyAhPSBudWxsKSB7Ci0JCQkJcHJldmlvdXNUeXBlID0gcHJldmlvdXMuZ2V0VHlwZSgpOwotCQkJfQotCQkJaWYgKHByZXZpb3VzVHlwZSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gKHByZXZpb3VzVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhcnRPZkJsb2NrUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU3RyaW5nIHR5cGUgPSBmbGF0Tm9kZS5nZXRUeXBlKCk7Ci0JCXJlc3VsdCA9ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5OGRjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LlhNTFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi0vKioKLSAqIEEgc2ltcGxlIGNsYXNzIHRvIGdlbmVyYXRlIGluc3RhbmNlcyBvZiBTdHJ1Y3R1cmVkUmVnaW9ucy4KLSAqLwotcHVibGljIGNsYXNzIFhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5IHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBKU1BfRElSRUNUSVZFID0gMTAwMzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBYTUwgPSAxMDAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFhNTF9CTE9DSyA9IDEwMDI7Ci0KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlUmVnaW9uKGludCB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2UgPSBudWxsOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgWE1MIDoKLQkJCQlpbnN0YW5jZSA9IG5ldyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgWE1MX0JMT0NLIDoKLQkJCQlpbnN0YW5jZSA9IG5ldyBCbG9ja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQWJzdHJhY3RSZWdpb246OmNyZWF0ZVJlZ2lvbi4gSW52YWxpZCB0eXBlLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlhMzg1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MzEgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gNi8yOS8xMCAxOjA0IFBNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5YTUxQYXJzZXJSZWdpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4PC9hPiAxLjIuMgotICogb24gNi8yOS8xMCAxOjA0IFBNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PmZpbGU6L0Q6L2VjbGlwc2Uud3RwL3dvcmtzcGFjZS9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9YTUxUb2tlbml6ZXIuamZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgWE1MVG9rZW5pemVyIGltcGxlbWVudHMgQmxvY2tUb2tlbml6ZXIsIERPTVJlZ2lvbkNvbnRleHQgewotCi0gIC8qKiB0aGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCA9IDIzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UID0gMjc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FID0gMTI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9UQUdfQ0xPU0UgPSAxMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFID0gMjE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUgPSAxMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfRVFVQUxTID0gMTM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9UQUdfTkFNRSA9IDE2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFID0gMTk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSA9IDE0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0gPSAyNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9OQU1FID0gMTc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OID0gMjY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OID0gMjI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OID0gMjg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9DT01NRU5UX0VORCA9IDQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NEQVRBX1RFWFQgPSAxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9UQUdfQ0xPU0UgPSAxNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0NPTU1FTlQgPSAzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSV9DT05URU5UID0gNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUElfV1MgPSA2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DREFUQV9FTkQgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UID0gMjk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0JMT0NLX1RBR19TQ0FOID0gMzA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9FUVVBTFMgPSA5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfREVDTEFSQVRJT04gPSAyMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDID0gMjQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FUVVBTFMgPSAxODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUEkgPSA1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUgPSA4OwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9IAotICAgICJcMTFcMFwxXDVcMVwyMlwyXDBcMVwxNFwyMlwwXDFcMTRcMVwyMVwxXDExXDFcNTUiKwotICAgICJcMVwxNlwxXDE3XDFcMTJcMVwxM1wxXDE2XDFcMTZcMVwxNlwxXDE2XDFcMTZcMVw3IisKLSAgICAiXDFcNlwxXDNcMTJcMTVcMVwxMFwxXDYxXDFcMVwxXDQ1XDFcMlwxXDRcMVwxNiIrCi0gICAgIlwxXDM0XDFcNjJcMVwzMlwxXDMzXDFcNTBcMVw1N1wxXDM2XDFcMzZcMVw0MlwxXDM2IisKLSAgICAiXDFcMzZcMVwyN1wxXDI1XDFcNDRcMVw0M1wxXDQ3XDFcMzZcMVw0MFwxXDU2XDFcMzUiKwotICAgICJcMVw2MFwyXDM2XDFcMjNcMVw0NlwxXDM2XDFcMzFcMVwwXDFcMjBcMVwwXDFcMTAiKwotICAgICJcMVwwXDFcNTJcMVw2MlwxXDYzXDFcNTNcMVwzN1wxXDU3XDFcMzZcMVw2NlwxXDQyIisKLSAgICAiXDJcMzZcMVwzMFwxXDI2XDFcNDRcMVw0M1wxXDQ3XDFcMzZcMVw0MFwxXDQxXDFcNTEiKwotICAgICJcMVw2MFwxXDM2XDFcMzZcMVwyNFwxXDU0XDFcMzZcMVwwXDFcMFw3MlwwXDFcNjUiKwotICAgICJcMTBcMFwyN1w2NFwxXDBcMzdcNjRcMVwwXDcyXDY0XDJcMFwxM1w2NFwyXDBcMTBcNjQiKwotICAgICJcMVwwXDY1XDY0XDFcMFwxMDRcNjRcMTFcMFw0NFw2NFwzXDBcMlw2NFw0XDBcMzZcNjQiKwotICAgICJcNzBcMFwxMzFcNjRcMjJcMFw3XDY0XDE2XDBcMlw2NVw1NlwwXDEwNlw2NVwzMlwwXDJcNjUiKwotICAgICJcNDRcMFwxXDY0XDFcNjVcM1w2NFwxXDBcMVw2NFwxXDBcMjRcNjRcMVwwXDU0XDY0IisKLSAgICAiXDFcMFw3XDY0XDNcMFwxXDY0XDFcMFwxXDY0XDFcMFwxXDY0XDFcMFwxXDY0IisKLSAgICAiXDFcMFwyMlw2NFwxNVwwXDE0XDY0XDFcMFwxMDJcNjRcMVwwXDE0XDY0XDFcMFw0NFw2NCIrCi0gICAgIlwxXDBcNFw2NVwxMVwwXDY1XDY0XDJcMFwyXDY0XDJcMFwyXDY0XDNcMFwzNFw2NCIrCi0gICAgIlwyXDBcMTBcNjRcMlwwXDJcNjRcNjdcMFw0Nlw2NFwyXDBcMVw2NFw3XDBcNDZcNjQiKwotICAgICJcMTJcMFwyMVw2NVwxXDBcMjdcNjVcMVwwXDNcNjVcMVwwXDFcNjVcMVwwXDJcNjUiKwotICAgICJcMVwwXDFcNjVcMTNcMFwzM1w2NFw1XDBcM1w2NFw1NlwwXDMyXDY0XDVcMFwxXDY1IisKLSAgICAiXDEyXDY0XDEwXDY1XDE1XDBcMTJcNjVcNlwwXDFcNjVcMTA3XDY0XDJcMFw1XDY0XDFcMCIrCi0gICAgIlwxN1w2NFwxXDBcNFw2NFwxXDBcMVw2NFwxN1w2NVwyXDY0XDJcNjVcMVwwXDRcNjUiKwotICAgICJcMlwwXDEyXDY1XHUwMjA3XDBcM1w2NVwxXDBcNjVcNjRcMlwwXDFcNjVcMVw2NFwyMFw2NSIrCi0gICAgIlwzXDBcNFw2NVwzXDBcMTJcNjRcMlw2NVwyXDBcMTJcNjVcMjFcMFwzXDY1XDFcMCIrCi0gICAgIlwxMFw2NFwyXDBcMlw2NFwyXDBcMjZcNjRcMVwwXDdcNjRcMVwwXDFcNjRcM1wwIisKLSAgICAiXDRcNjRcMlwwXDFcNjVcMVwwXDdcNjVcMlwwXDJcNjVcMlwwXDNcNjVcMTFcMCIrCi0gICAgIlwxXDY1XDRcMFwyXDY0XDFcMFwzXDY0XDJcNjVcMlwwXDEyXDY1XDJcNjRcMjBcMCIrCi0gICAgIlwxXDY1XDJcMFw2XDY0XDRcMFwyXDY0XDJcMFwyNlw2NFwxXDBcN1w2NFwxXDAiKwotICAgICJcMlw2NFwxXDBcMlw2NFwxXDBcMlw2NFwyXDBcMVw2NVwxXDBcNVw2NVw0XDAiKwotICAgICJcMlw2NVwyXDBcM1w2NVwxM1wwXDRcNjRcMVwwXDFcNjRcN1wwXDEyXDY1XDJcNjUiKwotICAgICJcM1w2NFwxNFwwXDNcNjVcMVwwXDdcNjRcMVwwXDFcNjRcMVwwXDNcNjRcMVwwIisKLSAgICAiXDI2XDY0XDFcMFw3XDY0XDFcMFwyXDY0XDFcMFw1XDY0XDJcMFwxXDY1XDFcNjQiKwotICAgICJcMTBcNjVcMVwwXDNcNjVcMVwwXDNcNjVcMjJcMFwxXDY0XDVcMFwxMlw2NVwyMVwwIisKLSAgICAiXDNcNjVcMVwwXDEwXDY0XDJcMFwyXDY0XDJcMFwyNlw2NFwxXDBcN1w2NFwxXDAiKwotICAgICJcMlw2NFwyXDBcNFw2NFwyXDBcMVw2NVwxXDY0XDZcNjVcM1wwXDJcNjVcMlwwIisKLSAgICAiXDNcNjVcMTBcMFwyXDY1XDRcMFwyXDY0XDFcMFwzXDY0XDRcMFwxMlw2NVwyMlwwIisKLSAgICAiXDJcNjVcMVwwXDZcNjRcM1wwXDNcNjRcMVwwXDRcNjRcM1wwXDJcNjRcMVwwIisKLSAgICAiXDFcNjRcMVwwXDJcNjRcM1wwXDJcNjRcM1wwXDNcNjRcM1wwXDEwXDY0XDFcMCIrCi0gICAgIlwzXDY0XDRcMFw1XDY1XDNcMFwzXDY1XDFcMFw0XDY1XDExXDBcMVw2NVwxN1wwIisKLSAgICAiXDExXDY1XDIxXDBcM1w2NVwxXDBcMTBcNjRcMVwwXDNcNjRcMVwwXDI3XDY0XDFcMCIrCi0gICAgIlwxMlw2NFwxXDBcNVw2NFw0XDBcN1w2NVwxXDBcM1w2NVwxXDBcNFw2NVw3XDAiKwotICAgICJcMlw2NVwxMVwwXDJcNjRcNFwwXDEyXDY1XDIyXDBcMlw2NVwxXDBcMTBcNjRcMVwwIisKLSAgICAiXDNcNjRcMVwwXDI3XDY0XDFcMFwxMlw2NFwxXDBcNVw2NFw0XDBcN1w2NVwxXDAiKwotICAgICJcM1w2NVwxXDBcNFw2NVw3XDBcMlw2NVw3XDBcMVw2NFwxXDBcMlw2NFw0XDAiKwotICAgICJcMTJcNjVcMjJcMFwyXDY1XDFcMFwxMFw2NFwxXDBcM1w2NFwxXDBcMjdcNjRcMVwwIisKLSAgICAiXDIwXDY0XDRcMFw2XDY1XDJcMFwzXDY1XDFcMFw0XDY1XDExXDBcMVw2NVwxMFwwIisKLSAgICAiXDJcNjRcNFwwXDEyXDY1XDIyMVwwXDU2XDY0XDFcMFwxXDY0XDFcNjVcMlw2NFw3XDY1IisKLSAgICAiXDVcMFw2XDY0XDFcNjVcMTBcNjVcMVwwXDEyXDY1XDQ3XDBcMlw2NFwxXDBcMVw2NCIrCi0gICAgIlwyXDBcMlw2NFwxXDBcMVw2NFwyXDBcMVw2NFw2XDBcNFw2NFwxXDBcN1w2NCIrCi0gICAgIlwxXDBcM1w2NFwxXDBcMVw2NFwxXDBcMVw2NFwyXDBcMlw2NFwxXDBcMlw2NCIrCi0gICAgIlwxXDBcMVw2NFwxXDY1XDJcNjRcNlw2NVwxXDBcMlw2NVwxXDY0XDJcMFw1XDY0IisKLSAgICAiXDFcMFwxXDY1XDFcMFw2XDY1XDJcMFwxMlw2NVw3NlwwXDJcNjVcNlwwXDEyXDY1IisKLSAgICAiXDEzXDBcMVw2NVwxXDBcMVw2NVwxXDBcMVw2NVw0XDBcMlw2NVwxMFw2NFwxXDAiKwotICAgICJcNDFcNjRcN1wwXDI0XDY1XDFcMFw2XDY1XDRcMFw2XDY1XDFcMFwxXDY1XDFcMCIrCi0gICAgIlwyNVw2NVwzXDBcN1w2NVwxXDBcMVw2NVwzNDZcMFw0Nlw2NFwxMlwwXDQ3XDY0XDExXDAiKwotICAgICJcMVw2NFwxXDBcMlw2NFwxXDBcM1w2NFwxXDBcMVw2NFwxXDBcMlw2NFwxXDAiKwotICAgICJcNVw2NFw1MVwwXDFcNjRcMVwwXDFcNjRcMVwwXDFcNjRcMTNcMFwxXDY0XDFcMCIrCi0gICAgIlwxXDY0XDFcMFwxXDY0XDNcMFwyXDY0XDNcMFwxXDY0XDVcMFwzXDY0XDFcMCIrCi0gICAgIlwxXDY0XDFcMFwxXDY0XDFcMFwxXDY0XDFcMFwxXDY0XDNcMFwyXDY0XDNcMCIrCi0gICAgIlwyXDY0XDFcMFwxXDY0XDUwXDBcMVw2NFwxMVwwXDFcNjRcMlwwXDFcNjRcMlwwIisKLSAgICAiXDJcNjRcN1wwXDJcNjRcMVwwXDFcNjRcMVwwXDdcNjRcNTBcMFwxXDY0XDRcMCIrCi0gICAgIlwxXDY0XDEwXDBcMVw2NFx1MGMwNlwwXDIzNFw2NFw0XDBcMTMyXDY0XDZcMFwyNlw2NFwyXDAiKwotICAgICJcNlw2NFwyXDBcNDZcNjRcMlwwXDZcNjRcMlwwXDEwXDY0XDFcMFwxXDY0XDFcMCIrCi0gICAgIlwxXDY0XDFcMFwxXDY0XDFcMFwzN1w2NFwyXDBcNjVcNjRcMVwwXDdcNjRcMVwwIisKLSAgICAiXDFcNjRcM1wwXDNcNjRcMVwwXDdcNjRcM1wwXDRcNjRcMlwwXDZcNjRcNFwwIisKLSAgICAiXDE1XDY0XDVcMFwzXDY0XDFcMFw3XDY0XDMyM1wwXDE1XDY1XDRcMFwxXDY1XDEwNFwwIisKLSAgICAiXDFcNjRcM1wwXDJcNjRcMlwwXDFcNjRcMTIxXDBcM1w2NFx1MGU4MlwwXDFcNjVcMVwwIisKLSAgICAiXDFcNjRcMzFcMFwxMVw2NFw2XDY1XDFcMFw1XDY1XDEzXDBcMTI0XDY0XDRcMFwyXDY1IisKLSAgICAiXDJcMFwyXDY1XDJcMFwxMzJcNjRcMVwwXDNcNjVcNlwwXDUwXDY0XHUxY2QzXDBcdTUxYTZcNjQiKwotICAgICJcdTBjNWFcMFx1MmJhNFw2NFwxMzRcMFx1MDgwMFwwXHUxZmZlXDBcMlwwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgYSBzdGF0ZSB0byBhIHJvdyBpbmRleCBpbiB0aGUgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5X3Jvd01hcCBbXSA9IHsgCi0gICAgICAgIDAsICAgIDU1LCAgIDExMCwgICAxNjUsICAgMjIwLCAgIDI3NSwgICAzMzAsICAgMzg1LCAgIDQ0MCwgICA0OTUsIAotICAgICAgNTUwLCAgIDYwNSwgICA2NjAsICAgNzE1LCAgIDc3MCwgICA4MjUsICAgODgwLCAgIDkzNSwgICA5OTAsICAxMDQ1LCAKLSAgICAgMTEwMCwgIDExNTUsICAxMjEwLCAgMTI2NSwgIDEzMjAsICAxMzc1LCAgMTQzMCwgIDE0ODUsICAxNTQwLCAgMTU5NSwgCi0gICAgIDE2NTAsICAxNzA1LCAgMTc2MCwgIDE4MTUsICAxODcwLCAgMTkyNSwgIDE5ODAsICAxOTI1LCAgMTk4MCwgIDIwMzUsIAotICAgICAxOTI1LCAgMTkyNSwgIDE5ODAsICAyMDkwLCAgMjE0NSwgIDIyMDAsICAyMjU1LCAgMjMxMCwgIDIzNjUsICAyNDIwLCAKLSAgICAgMjQ3NSwgIDE5MjUsICAxOTgwLCAgMjUzMCwgIDI1ODUsICAyNjQwLCAgMTkyNSwgIDI2OTUsICAyNjk1LCAgMjc1MCwgCi0gICAgIDI4MDUsICAyODYwLCAgMjUzMCwgIDE5MjUsICAyOTE1LCAgMjk3MCwgIDE5MjUsICAzMDI1LCAgMzA4MCwgIDMxMzUsIAotICAgICAzMTkwLCAgMzI0NSwgIDMzMDAsICAxOTI1LCAgMzM1NSwgIDM0MTAsICAzNDY1LCAgMzUyMCwgIDE5MjUsICAzNTc1LCAKLSAgICAgMzYzMCwgIDM2ODUsICAzNzQwLCAgMzc5NSwgIDE5MjUsICAzODUwLCAgMzkwNSwgIDM5NjAsICA0MDE1LCAgNDA3MCwgCi0gICAgIDQxMjUsICA0MTgwLCAgNDIzNSwgIDQyMzUsICA0MjkwLCAgNDM0NSwgIDQ0MDAsICA0NDU1LCAgNDQ1NSwgIDQ1MTAsIAotICAgICA0NTY1LCAgNDYyMCwgIDQ2NzUsICA0Njc1LCAgNDczMCwgIDQ3ODUsICA0ODQwLCAgNDg5NSwgIDE5MjUsICA0OTUwLCAKLSAgICAgNDk1MCwgIDUwMDUsICA1MDYwLCAgNTExNSwgIDUxNzAsICAxOTI1LCAgMTkyNSwgIDE5ODAsICAxOTI1LCAgMTkyNSwgCi0gICAgIDUyMjUsICA1MjgwLCAgNTMzNSwgIDUzOTAsICA1NDQ1LCAgNTUwMCwgIDU1NTUsICA1NjEwLCAgMTkyNSwgIDU2NjUsIAotICAgICA1NzIwLCAgNTc3NSwgIDE5MjUsICAxOTI1LCAgMjY5NSwgIDU4MzAsICAyODA1LCAgMTkyNSwgIDU4ODUsICAyODYwLCAKLSAgICAgMjkxNSwgIDMwMjUsICAzMDgwLCAgNTk0MCwgIDMxMzUsICAxOTI1LCAgNTk5NSwgIDMxOTAsICAxOTI1LCAgMzU3NSwgCi0gICAgIDYwNTAsICAzNjg1LCAgMTkyNSwgIDYxMDUsICAzNzQwLCAgNTIyNSwgIDYxNjAsICA2MjE1LCAgNjI3MCwgIDQwMTUsIAotICAgICAxOTI1LCAgNjMyNSwgIDYzODAsICA0MjM1LCAgNjQzNSwgIDQyOTAsICAxOTI1LCAgNjQ5MCwgIDY1NDUsICA2NjAwLCAKLSAgICAgNjYwMCwgIDY2NTUsICA2NzEwLCAgNDQwMCwgIDQyMzUsICA0NDU1LCAgNjc2NSwgIDQ1MTAsICAxOTI1LCAgNjgyMCwgCi0gICAgIDQ1NjUsICA0NjIwLCAgNDQ1NSwgIDQ2NzUsICA2ODc1LCAgNDczMCwgIDE5MjUsICA2OTMwLCAgNjk4NSwgIDcwNDAsIAotICAgICA3MDQwLCAgNzA5NSwgIDcxNTAsICA3MjA1LCAgNDk1MCwgIDcyNjAsICA1MDA1LCAgMTkyNSwgIDczMTUsICA3MzcwLCAKLSAgICAgNzQyNSwgIDc0MjUsICA3NDgwLCAgNzUzNSwgIDc1OTAsICA3NjQ1LCAgNzcwMCwgIDc3NTUsICA3ODEwLCAgMTkyNSwgCi0gICAgIDc4NjUsICA3OTIwLCAgMTkyNSwgIDE5MjUsICAxOTI1LCAgMjI1NSwgIDc5NzUsICA4MDMwLCAgODA4NSwgIDgxNDAsIAotICAgICA4MTk1LCAgODI1MCwgIDgzMDUsICA2NDkwLCAgODM2MCwgIDgzNjAsICA2OTMwLCAgODQxNSwgIDg0MTUsICA4NDcwLCAKLSAgICAgNzMxNSwgIDg1MjUsICA4NTI1LCAgODU4MCwgIDE5MjUsICA4NjM1LCAgODY5MCwgIDE5MjUsICA4NzQ1LCAgODgwMCwgCi0gICAgIDg4NTUsICA4OTEwLCAgODk2NSwgIDkwMjAsICA5MDc1LCAgOTEzMCwgIDY2NTUsICA3MDk1LCAgOTE4NSwgIDc0ODAsIAotICAgICA5MjQwLCAgOTI5NSwgIDkzNTAsICA5NDA1LCAgOTQ2MCwgIDk1MTUsICA5NTcwLCAgOTYyNSwgIDk2ODAsICA5NzM1LCAKLSAgICAgOTc5MCwgIDk4NDUsICA5OTAwLCAgOTk1NSwgMTAwMTAsIDEwMDY1LCAxMDEyMCwgIDE5MjUsICAxOTI1LCAxMDE3NSwgCi0gICAgMTAyMzAsIDEwMjg1LCAxMDM0MCwgMTAzOTUsICAxOTI1LCAgMTkyNSwgIDE5MjUsIDEwNDUwLCAxMDUwNSwgMTA1NjAsIAotICAgIDEwNjE1LCAxMDY3MCwgMTA3MjUsICAxOTI1LCAxMDc4MCwgIDQ4NDAsICA1MTE1LCAxMDgzNSwgMTA4OTAsIDEwOTQ1LCAKLSAgICAxMTAwMCwgIDIyNTUKLSAgfTsKLQotICAvKiogCi0gICAqIFRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXlfcGFja2VkID0gCi0gICAgIlwxXDQwXDFcNDFcMTBcNDBcMVw0Mlw0XDQwXDFcNDNcNDdcNDBcMVw0NCIrCi0gICAgIlwxXDQ1XDY1XDQ0XDFcNDZcMVw0N1wxNlw0NlwxXDUwXDFcNDZcMVw1MSIrCi0gICAgIlw0NFw0NlwxXDUyXDFcNTNcNjVcNTJcMVw0NlwxXDQ3XDVcNDZcMVw1NCIrCi0gICAgIlwxMlw0NlwxXDUxXDQ1XDQ2XDFcNDdcMlw0NlwxXDU1XDFcNTZcMlw0NiIrCi0gICAgIlwxXDU3XDNcNDZcMVw1Nlw1XDQ2XDFcNTZcMVw2MFwxXDYxXDRcNTciKwotICAgICJcMVw0NlwxMFw1N1wxXDYyXDJcNTdcMVw0Nlw3XDU3XDFcNDZcM1w1NyIrCi0gICAgIlwxXDQ2XDNcNTdcMVw0NlwxXDU3XDFcNDZcMVw0N1wyXDQ2XDFcNTUiKwotICAgICJcMVw2M1w2XDQ2XDFcNjNcNVw0NlwxXDYzXDQ0XDQ2XDFcNjRcMVw2NSIrCi0gICAgIlwyXDY0XDFcNjZcMTVcNjRcMVw1MVw0NFw2NFwxXDQ2XDFcNDdcMlw0NiIrCi0gICAgIlwxXDY3XDFcNTZcMlw0NlwxXDcwXDNcNDZcMVw1Nlw1XDQ2XDFcNTYiKwotICAgICJcNlw3MFwxXDQ2XDEzXDcwXDFcNDZcN1w3MFwxXDQ2XDNcNzBcMVw0NiIrCi0gICAgIlwzXDcwXDFcNDZcMVw3MFwxXDQ2XDFcNDdcMlw0NlwxXDY3XDFcNTYiKwotICAgICJcMlw0NlwxXDcwXDNcNDZcMVw1Nlw1XDQ2XDFcNTZcNlw3MFwxXDQ2IisKLSAgICAiXDEzXDcwXDFcNzFcN1w3MFwxXDQ2XDNcNzBcMVw0NlwzXDcwXDFcNDYiKwotICAgICJcMVw3MFwxXDcyXDFcNDdcMVw0NlwxXDczXDFcNzRcMVw1NlwzXDcyIisKLSAgICAiXDFcNzVcMVw3MlwxXDc2XDFcNTZcNVw3MlwxXDU2XDQ0XDcyXDFcNDYiKwotICAgICJcMVw0N1wyXDQ2XDFcNzdcMTVcNDZcMVw1MVw0NVw0NlwxXDQ3XDFcMTAwIisKLSAgICAiXDFcMTAxXDFcNDZcMVw1NlwyXDQ2XDFcMTAyXDNcNDZcMVw1Nlw1XDQ2IisKLSAgICAiXDFcNTZcNlwxMDJcMVw0NlwxM1wxMDJcMVw0Nlw3XDEwMlwxXDQ2XDNcMTAyIisKLSAgICAiXDFcNDZcM1wxMDJcMVw0NlwxXDEwMlwxXDQ2XDFcNDdcMVwxMDBcMVwxMDEiKwotICAgICJcMVw0NlwxXDU2XDJcNDZcMVwxMDJcM1w0NlwxXDU2XDVcNDZcMVw1NiIrCi0gICAgIlw2XDEwMlwxXDQ2XDEzXDEwMlwxXDEwM1w3XDEwMlwxXDQ2XDNcMTAyXDFcNDYiKwotICAgICJcM1wxMDJcMVw0NlwxXDEwMlwxXDEwNFwxXDQ3XDFcMTAwXDFcMTA1XDFcMTA0IisKLSAgICAiXDFcNTZcM1wxMDRcMVwxMDZcMVwxMDRcMVwxMDdcMVw1Nlw1XDEwNFwxXDU2IisKLSAgICAiXDQ0XDEwNFwxXDQ2XDFcNDdcM1w0NlwxXDU2XDZcNDZcMVw1Nlw1XDQ2IisKLSAgICAiXDFcNTZcNDRcNDZcMVwxMTBcMVwxMTFcMVwxMTJcMVwxMTNcNFwxMTBcMVwxMTQiKwotICAgICJcMTJcMTEwXDZcMTE1XDFcMTEwXDEzXDExNVwxXDExMFw3XDExNVwxXDExMFwzXDExNSIrCi0gICAgIlwxXDExMFwzXDExNVwxXDExMFwxXDExNVwxXDQ2XDFcMTExXDFcMTEyXDFcMTEzIisKLSAgICAiXDFcNDZcMVw1NlwyXDQ2XDFcMTE2XDNcNDZcMVw1Nlw1XDQ2XDFcNTYiKwotICAgICJcNlwxMTZcMVw0NlwxM1wxMTZcMVw0Nlw3XDExNlwxXDQ2XDNcMTE2XDFcNDYiKwotICAgICJcM1wxMTZcMVw0NlwxXDExNlwxXDQ2XDFcMTExXDFcMTEyXDFcMTEzXDFcNDYiKwotICAgICJcMVw1NlwyXDQ2XDFcMTE2XDNcNDZcMVw1Nlw1XDQ2XDFcNTZcNlwxMTYiKwotICAgICJcMVw0NlwxM1wxMTZcMVwxMTdcN1wxMTZcMVw0NlwzXDExNlwxXDQ2XDNcMTE2IisKLSAgICAiXDFcNDZcMVwxMTZcMVwxMjBcMVwxMTFcMVwxMTJcMVwxMjFcMVwxMjBcMVw1NiIrCi0gICAgIlwzXDEyMFwxXDEyMlwxXDEyMFwxXDEyM1wxXDU2XDVcMTIwXDFcNTZcNDRcMTIwIisKLSAgICAiXDFcNDZcMVwxMjRcMVwxMjVcMlw0NlwxXDU2XDZcNDZcMVw1Nlw1XDQ2IisKLSAgICAiXDFcNTZcMTBcNDZcMVwxMjZcMVwxMjdcMlw0NlwxXDEzMFwxMFw0NlwxXDEzMCIrCi0gICAgIlwxXDQ2XDFcMTI3XDFcMTI2XDE0XDQ2XDFcNDdcMVwxMjVcMlw0NlwxXDU2IisKLSAgICAiXDZcNDZcMVw1Nlw1XDQ2XDFcNTZcNlw0NlwxXDEzMVwzNlw0NlwxXDQ3IisKLSAgICAiXDFcMTI1XDJcNDZcMVw1NlwyXDQ2XDFcMTMyXDNcNDZcMVw1Nlw1XDQ2IisKLSAgICAiXDFcNTZcNlwxMzJcMVwxMzFcMTNcMTMyXDFcNDZcN1wxMzJcMVw0NlwzXDEzMiIrCi0gICAgIlwxXDQ2XDNcMTMyXDFcNDZcMVwxMzJcMVw0NlwxXDQ3XDFcMTI1XDJcNDYiKwotICAgICJcMVw1Nlw2XDQ2XDFcNTZcNVw0NlwxXDU2XDZcNDZcMVwxMzFcN1w0NiIrCi0gICAgIlwxXDEzM1w1XDQ2XDFcMTM0XDZcNDZcMVwxMzNcMTBcNDZcMVwxMzVcMVw0NyIrCi0gICAgIlwxXDEyNVwxXDEzNlwxXDEzNVwxXDU2XDNcMTM1XDFcMTM3XDFcMTM1XDFcMTQwIisKLSAgICAiXDFcNTZcNVwxMzVcMVw1Nlw2XDEzNVwxXDE0MVwzNVwxMzVcMVwxNDJcMVw0NyIrCi0gICAgIlwxXDEyNVwxXDE0M1wxXDE0MlwxXDU2XDNcMTQyXDFcMTQ0XDFcMTQyXDFcMTQ1IisKLSAgICAiXDFcNTZcNVwxNDJcMVw1Nlw2XDE0MlwxXDE0NlwzNVwxNDJcMVwxNDdcMVw0NyIrCi0gICAgIlwxXDEyNVwxXDE1MFwxXDE0N1wxXDU2XDNcMTQ3XDFcMTUxXDFcMTQ3XDFcMTUyIisKLSAgICAiXDFcNTZcNVwxNDdcMVw1Nlw0NFwxNDdcMVwxNTNcMVwxNTRcMVwxNTVcNjRcMTUzIisKLSAgICAiXDFcMTU2XDFcNDdcMVwxMjVcMVwxNTdcMVwxNTZcMVw1NlwzXDE1NlwxXDE2MCIrCi0gICAgIlwxXDE1NlwxXDE2MVwxXDU2XDVcMTU2XDFcNTZcNDRcMTU2XDFcMTYyXDFcMTYzIisKLSAgICAiXDFcMTY0XDY0XDE2MlwxXDE2NVwxXDE2Nlw2NVwxNjVcMVw0MFwxXDBcMTBcNDAiKwotICAgICJcMVwwXDRcNDBcMVwwXDQ3XDQwXDNcMFwxXDE2N1wxXDE3MFwxNFwwIisKLSAgICAiXDFcMTcxXDUyXDBcMVwxNzJcMlwwXDFcMTczXDNcMFwxXDE3Mlw1XDAiKwotICAgICJcMVwxNzJcNlwxNzNcMVwwXDEzXDE3M1wxXDBcN1wxNzNcMVwxNzRcM1wxNzMiKwotICAgICJcMVwwXDNcMTczXDFcMFwxXDE3M1w1XDBcMVwxNzJcMlwwXDFcMTc1IisKLSAgICAiXDNcMFwxXDE3Mlw1XDBcMVwxNzJcNlwxNzVcMVwwXDEzXDE3NVwxXDAiKwotICAgICJcN1wxNzVcMVwwXDNcMTc1XDFcMFwzXDE3NVwxXDBcMVwxNzVcMTEwXDAiKwotICAgICJcMVwxNzZcNjVcMFwxXDE3N1w1NVwwXDFcMjAwXDYxXDBcMVwyMDFcNzFcMCIrCi0gICAgIlwxXDU2XDZcMFwxXDU2XDVcMFwxXDU2XDUyXDBcM1w1N1w0XDAiKwotICAgICJcMVw1N1w1XDBcNlw1N1wxXDBcMTNcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDNcNTdcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTdcNVwwIisKLSAgICAiXDJcNTdcMlwyMDJcMlw1N1wxXDBcMTNcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDNcNTdcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTdcNVwwIisKLSAgICAiXDJcNTdcMVwyMDJcMVwyMDNcMlw1N1wxXDBcMTNcNTdcMVwwXDdcNTciKwotICAgICJcMVwwXDNcNTdcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTciKwotICAgICJcNVwwXDJcNTdcMlwyMDRcMlw1N1wxXDBcMTNcNTdcMVwwXDdcNTciKwotICAgICJcMVwwXDNcNTdcMVwwXDVcNTdcNVwwXDFcNjNcNlwwXDFcNjMiKwotICAgICJcNVwwXDFcNjNcNDZcMFwxXDIwNVw2NlwwXDFcMjA2XDcyXDBcM1w3MCIrCi0gICAgIlw0XDBcMVw3MFw1XDBcNlw3MFwxXDBcMTNcNzBcMVwwXDdcNzAiKwotICAgICJcMVwwXDNcNzBcMVwwXDVcNzBcMVw3MlwyXDBcMVwyMDdcMVw3MiIrCi0gICAgIlwxXDBcM1w3MlwxXDBcMVw3MlwyXDBcNVw3MlwxXDBcNDVcNzIiKwotICAgICJcMVwwXDFcMjA2XDFcMjA3XDFcNzJcMVwwXDNcNzJcMVwwXDFcNzIiKwotICAgICJcMlwwXDVcNzJcMVwwXDQ0XDcyXDFcNzVcMlwyMTBcMVwyMTFcMVw3NSIrCi0gICAgIlwxXDIxMFwzXDc1XDFcMjEyXDFcNzVcMlwyMTBcNVw3NVwxXDIxMFw0NFw3NSIrCi0gICAgIlwxXDc2XDJcMjEzXDFcMjE0XDFcNzZcMVwyMTNcM1w3NlwxXDIxM1wxXDc2IisKLSAgICAiXDFcMjEyXDFcMjEzXDVcNzZcMVwyMTNcNDRcNzZcMlwwXDFcMTAwXDFcMjE1IisKLSAgICAiXDcxXDBcM1wxMDJcNFwwXDFcMTAyXDVcMFw2XDEwMlwxXDBcMTNcMTAyIisKLSAgICAiXDFcMFw3XDEwMlwxXDBcM1wxMDJcMVwwXDVcMTAyXDFcMTA0XDJcMCIrCi0gICAgIlwxXDIxNlwxXDEwNFwxXDBcM1wxMDRcMVwwXDFcMTA0XDJcMFw1XDEwNCIrCi0gICAgIlwxXDBcNDVcMTA0XDFcMFwxXDEwMFwxXDIxN1wxXDEwNFwxXDBcM1wxMDQiKwotICAgICJcMVwwXDFcMTA0XDJcMFw1XDEwNFwxXDBcNDRcMTA0XDFcMTA2XDJcMjIwIisKLSAgICAiXDFcMjIxXDFcMTA2XDFcMjIwXDNcMTA2XDFcMjIyXDFcMTA2XDJcMjIwXDVcMTA2IisKLSAgICAiXDFcMjIwXDQ0XDEwNlwxXDEwN1wyXDIyM1wxXDIyNFwxXDEwN1wxXDIyM1wzXDEwNyIrCi0gICAgIlwxXDIyM1wxXDEwN1wxXDIyMlwxXDIyM1w1XDEwN1wxXDIyM1w0NFwxMDdcMVwxMTAiKwotICAgICJcM1wwXDE3XDExMFw2XDBcMVwxMTBcMTNcMFwxXDExMFw3XDBcMVwxMTAiKwotICAgICJcM1wwXDFcMTEwXDNcMFwxXDExMFw0XDBcMVwxNjdcMTVcMFwxXDE3MSIrCi0gICAgIlw0N1wwXDFcMjI1XDY0XDBcMVwxMTBcM1wwXDJcMTEwXDNcMTE0XDRcMTEwIisKLSAgICAiXDFcMTE0XDVcMTEwXDZcMTE1XDFcMTEwXDEzXDExNVwxXDExMFw3XDExNVwxXDExMCIrCi0gICAgIlwzXDExNVwxXDExMFwzXDExNVwxXDExNFwxXDExNVw2XDBcM1wxMTVcNFwwIisKLSAgICAiXDFcMTE1XDVcMFw2XDExNVwxXDBcMTNcMTE1XDFcMFw3XDExNVwxXDAiKwotICAgICJcM1wxMTVcMVwwXDVcMTE1XDZcMFwzXDExNlw0XDBcMVwxMTZcNVwwIisKLSAgICAiXDZcMTE2XDFcMFwxM1wxMTZcMVwwXDdcMTE2XDFcMFwzXDExNlwxXDAiKwotICAgICJcNVwxMTZcMVwxMjBcMlwwXDFcMjI2XDFcMTIwXDFcMFwzXDEyMFwxXDAiKwotICAgICJcMVwxMjBcMlwwXDVcMTIwXDFcMFw0NVwxMjBcMVwwXDFcMjI1XDFcMjI2IisKLSAgICAiXDFcMTIwXDFcMFwzXDEyMFwxXDBcMVwxMjBcMlwwXDVcMTIwXDFcMCIrCi0gICAgIlw0NFwxMjBcMVwxMjJcMlwyMjdcMVwyMzBcMVwxMjJcMVwyMjdcM1wxMjJcMVwyMzEiKwotICAgICJcMVwxMjJcMlwyMjdcNVwxMjJcMVwyMjdcNDRcMTIyXDFcMTIzXDJcMjMyXDFcMjMzIisKLSAgICAiXDFcMTIzXDFcMjMyXDNcMTIzXDFcMjMyXDFcMTIzXDFcMjMxXDFcMjMyXDVcMTIzIisKLSAgICAiXDFcMjMyXDQ0XDEyM1wzXDBcMVwxNjdcMTVcMFwxXDIzNFwxMTBcMFwxXDIzNSIrCi0gICAgIlw2MFwwXDFcMjM2XDEzXDBcMVwyMzZcNDRcMFwyXDIzN1wzNlwwXDIwXDI0MCIrCi0gICAgIlwxXDI0MVw0NlwyNDBcNlwwXDNcMTMyXDRcMFwxXDEzMlw1XDBcNlwxMzIiKwotICAgICJcMVwwXDEzXDEzMlwxXDBcN1wxMzJcMVwwXDNcMTMyXDFcMFw1XDEzMiIrCi0gICAgIlw0NlwwXDFcMjQyXDVcMFwxXDI0Mlw3MlwwXDFcMjQzXDZcMFwxXDEzNSIrCi0gICAgIlwyXDBcMVwyNDRcMVwxMzVcMVwwXDNcMTM1XDFcMFwxXDEzNVwyXDAiKwotICAgICJcNVwxMzVcMVwwXDQ0XDEzNVwxXDEzN1wyXDI0NVwxXDI0NlwxXDEzN1wxXDI0NSIrCi0gICAgIlwzXDEzN1wxXDI0N1wxXDEzN1wyXDI0NVw1XDEzN1wxXDI0NVw0NFwxMzdcMVwyNTAiKwotICAgICJcMlwyNTFcMVwyNTJcMVwyNTNcMVwyNTFcM1wyNTNcMVwyNTFcMVwyNTBcMVwyNTQiKwotICAgICJcMVwyNTVcM1wyNTNcMVwyNTBcMVwyNTNcMVwyNTVcNlwyNTNcMVwyNTBcMzJcMjUzIisKLSAgICAiXDJcMjUwXDFcMjUzXDFcMTQxXDJcMjQwXDFcMjU2XDFcMTQxXDFcMjQwXDNcMTQxIisKLSAgICAiXDFcMjQwXDFcMTQxXDJcMjQwXDNcMTQxXDFcMjU3XDFcMTQxXDFcMjQwXDQ0XDE0MSIrCi0gICAgIlwxXDE0MlwyXDBcMVwyNjBcMVwxNDJcMVwwXDNcMTQyXDFcMFwxXDE0MiIrCi0gICAgIlwyXDBcNVwxNDJcMVwwXDQ0XDE0MlwxXDE0NFwyXDI2MVwxXDI2MlwxXDE0NCIrCi0gICAgIlwxXDI2MVwzXDE0NFwxXDI2M1wxXDE0NFwyXDI2MVw1XDE0NFwxXDI2MVw0NFwxNDQiKwotICAgICJcMVwxNDVcMlwyNjRcMVwyNjVcMVwxNDVcMVwyNjRcM1wxNDVcMVwyNjRcMVwxNDUiKwotICAgICJcMVwyNjNcMVwyNjRcNVwxNDVcMVwyNjRcNDRcMTQ1XDFcMTQ2XDJcMjQwXDFcMjY2IisKLSAgICAiXDFcMTQ2XDFcMjQwXDNcMTQ2XDFcMjQwXDFcMTQ2XDJcMjQwXDNcMTQ2XDFcMjY3IisKLSAgICAiXDFcMTQ2XDFcMjQwXDQ0XDE0NlwxXDE0N1wyXDBcMVwyNzBcMVwxNDdcMVwwIisKLSAgICAiXDNcMTQ3XDFcMFwxXDE0N1wyXDBcNVwxNDdcMVwwXDQ0XDE0N1wxXDE1MSIrCi0gICAgIlwyXDI3MVwxXDI3MlwxXDE1MVwxXDI3MVwzXDE1MVwxXDI3M1wxXDE1MVwyXDI3MSIrCi0gICAgIlw1XDE1MVwxXDI3MVw0NFwxNTFcMVwyNzRcMlwyNzVcMVwyNzZcMVwyNzdcMVwyNzUiKwotICAgICJcM1wyNzdcMVwyNzVcMVwyNzRcMVwzMDBcMVwzMDFcM1wyNzdcMVwyNzRcMVwyNzciKwotICAgICJcMVwzMDFcNlwyNzdcMVwyNzRcMzJcMjc3XDJcMjc0XDFcMjc3XDJcMTUzXDFcMCIrCi0gICAgIlw2NlwxNTNcMVwwXDE2XDE1M1wxXDMwMlw0NVwxNTNcMVwxNTZcMlwwXDFcMzAzIisKLSAgICAiXDFcMTU2XDFcMFwzXDE1NlwxXDBcMVwxNTZcMlwwXDVcMTU2XDFcMCIrCi0gICAgIlw0NFwxNTZcMVwxNjBcMlwzMDRcMVwzMDVcMVwxNjBcMVwzMDRcM1wxNjBcMVwzMDYiKwotICAgICJcMVwxNjBcMlwzMDRcNVwxNjBcMVwzMDRcNDRcMTYwXDFcMzA3XDJcMzEwXDFcMzExIisKLSAgICAiXDFcMzEyXDFcMzEwXDNcMzEyXDFcMzEwXDFcMzA3XDFcMzEzXDFcMzE0XDNcMzEyIisKLSAgICAiXDFcMzA3XDFcMzEyXDFcMzE0XDZcMzEyXDFcMzA3XDMyXDMxMlwyXDMwN1wxXDMxMiIrCi0gICAgIlwyXDE2MlwxXDBcNjZcMTYyXDFcMFwxNlwxNjJcMVwzMTVcNDVcMTYyXDdcMCIrCi0gICAgIlwxXDMxNlwyMVwwXDFcMzE3XDQyXDBcMVwxNzJcMlwwXDFcNDBcM1wwIisKLSAgICAiXDFcMTcyXDVcMFwxXDE3Mlw2XDQwXDFcMFwxM1w0MFwxXDBcN1w0MCIrCi0gICAgIlwxXDBcM1w0MFwxXDBcM1w0MFwxXDBcMVw0MFwxXDMyMFwxXDAiKwotICAgICJcM1wzMjBcMVwzMjFcM1wxNzNcMVwzMjBcMVwwXDFcMzIwXDFcMzIxXDFcMTczIisKLSAgICAiXDFcMzIwXDFcMFwyXDMyMFwxXDMyMVw2XDE3M1wxXDMyMFwxM1wxNzNcMVwzMjAiKwotICAgICJcN1wxNzNcMVwzMjBcM1wxNzNcMVwzMjJcNVwxNzNcMTVcMFwxXDMyM1w2XDAiKwotICAgICJcMVwzMjRcNDJcMFwxXDMyMFwxXDBcM1wzMjBcMVwzMjFcM1wxNzVcMVwzMjAiKwotICAgICJcMVwwXDFcMzIwXDFcMzIxXDFcMTc1XDFcMzIwXDFcMFwyXDMyMFwxXDMyMSIrCi0gICAgIlw2XDE3NVwxXDMyMFwxM1wxNzVcMVwzMjBcN1wxNzVcMVwzMjBcM1wxNzVcMVwzMjUiKwotICAgICJcNVwxNzVcMzFcMFwxXDMxN1wzN1wwXDFcMzI2XDY2XDBcMVwzMjdcNzJcMCIrCi0gICAgIlwzXDU3XDRcMFwxXDU3XDVcMFw0XDU3XDJcMzMwXDFcMFwxM1w1NyIrCi0gICAgIlwxXDBcN1w1N1wxXDBcM1w1N1wxXDBcNVw1N1w2XDBcM1w1NyIrCi0gICAgIlw0XDBcMVw1N1w1XDBcNFw1N1wxXDMzMFwxXDMzMVwxXDBcMTNcNTciKwotICAgICJcMVwwXDdcNTdcMVwwXDNcNTdcMVwwXDVcNTdcNlwwXDNcNTciKwotICAgICJcNFwwXDFcNTdcNVwwXDZcNTdcMVwwXDEzXDU3XDFcMFwxXDU3IisKLSAgICAiXDFcMzMyXDVcNTdcMVwwXDNcNTdcMVwwXDVcNTdcMTFcMjEwXDFcMjEyIisKLSAgICAiXDU1XDIxMFwxM1wyMTNcMVwyMTJcNTNcMjEzXDExXDIyMFwxXDIyMlw1NVwyMjBcMTNcMjIzIisKLSAgICAiXDFcMjIyXDUzXDIyM1wxMVwyMjdcMVwyMzFcNTVcMjI3XDEzXDIzMlwxXDIzMVw1M1wyMzIiKwotICAgICJcMzJcMFwxXDMzM1wzMFwwXDFcMzMzXDQwXDBcMVwzMzRcMTNcMFwxXDMzNCIrCi0gICAgIlw1NFwwXDFcMzM1XDEwXDBcMVwzMzVcNTdcMFwxXDMzNlwxNFwwXDFcMzM2IisKLSAgICAiXDcyXDBcMVwzMzdcNFwwXDExXDI0NVwxXDI0N1w1NVwyNDVcMVwyNTBcMlwyNTEiKwotICAgICJcMVwzNDBcMVwyNTBcMVwyNTFcM1wyNTBcMVwyNTFcMVwyNTBcMVwyNDdcMVwyNTEiKwotICAgICJcNVwyNTBcMVwyNTFcNDRcMjUwXDEzXDI1MVwxXDI0N1w1M1wyNTFcMVwyNTBcMlwyNTEiKwotICAgICJcMVwzNDBcMVwyNTBcMVwyNTFcM1wyNTBcMVwyNTFcMVwyNTBcMVwzNDFcMVwyNTEiKwotICAgICJcNVwyNTBcMVwyNTFcNDRcMjUwXDEzXDBcMVwzNDJcNTNcMFwxM1wyNTFcMVwzNDEiKwotICAgICJcNTNcMjUxXDExXDI2MVwxXDI2M1w1NVwyNjFcMTNcMjY0XDFcMjYzXDUzXDI2NFwxMVwyNzEiKwotICAgICJcMVwyNzNcNTVcMjcxXDFcMjc0XDJcMjc1XDFcMzQzXDFcMjc0XDFcMjc1XDNcMjc0IisKLSAgICAiXDFcMjc1XDFcMjc0XDFcMjczXDFcMjc1XDVcMjc0XDFcMjc1XDQ0XDI3NFwxM1wyNzUiKwotICAgICJcMVwyNzNcNTNcMjc1XDFcMjc0XDJcMjc1XDFcMzQzXDFcMjc0XDFcMjc1XDNcMjc0IisKLSAgICAiXDFcMjc1XDFcMjc0XDFcMzQ0XDFcMjc1XDVcMjc0XDFcMjc1XDQ0XDI3NFwxM1wwIisKLSAgICAiXDFcMzQ1XDUzXDBcMTNcMjc1XDFcMzQ0XDUzXDI3NVwyXDE1M1wxXDBcMjZcMTUzIisKLSAgICAiXDFcMzQ2XDM1XDE1M1wxMVwzMDRcMVwzMDZcNTVcMzA0XDFcMzA3XDJcMzEwXDFcMzQ3IisKLSAgICAiXDFcMzA3XDFcMzEwXDNcMzA3XDFcMzEwXDFcMzA3XDFcMzA2XDFcMzEwXDVcMzA3IisKLSAgICAiXDFcMzEwXDQ0XDMwN1wxM1wzMTBcMVwzMDZcNTNcMzEwXDFcMzA3XDJcMzEwXDFcMzQ3IisKLSAgICAiXDFcMzA3XDFcMzEwXDNcMzA3XDFcMzEwXDFcMzA3XDFcMzUwXDFcMzEwXDVcMzA3IisKLSAgICAiXDFcMzEwXDQ0XDMwN1wxM1wwXDFcMzUxXDUzXDBcMTNcMzEwXDFcMzUwXDUzXDMxMCIrCi0gICAgIlwyXDE2MlwxXDBcMjZcMTYyXDFcMzUyXDM1XDE2Mlw3XDBcMVwzNTNcMTExXDAiKwotICAgICJcMVwzNTRcMzRcMFwxXDMyMFwxXDBcMTBcMzIwXDFcMFw0XDMyMFwxXDAiKwotICAgICJcNDFcMzIwXDFcMFw2XDMyMFwxXDBcM1wzMjBcMVwzMjFcNFwzMjBcMVwwIisKLSAgICAiXDFcMzIwXDFcMzIxXDJcMzIwXDFcMFwyXDMyMFwxXDMyMVwzNlwzMjBcMVwzNTUiKwotICAgICJcNVwzMjBcMTVcMFwxXDMyM1w0M1wwXDFcMzU2XDIyXDBcMVwzNTdcMTRcMCIrCi0gICAgIlwzXDM1N1wyXDBcMVwzNTdcMTBcMFwxXDM1N1wxXDBcMlwzNTdcM1wwIisKLSAgICAiXDFcMzU3XDJcMFwyXDM1N1wxMVwwXDFcNTdcMVwzNjBcMVw1N1w0XDAiKwotICAgICJcMVw1N1w1XDBcNlw1N1wxXDBcMTNcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDNcNTdcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTdcNVwwIisKLSAgICAiXDZcNTdcMVwwXDExXDU3XDFcMzYxXDFcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDNcNTdcMVwwXDVcNTdcMzVcMFwxXDM2MlwxM1wwXDFcMzYyXDQ0XDAiKwotICAgICJcMlwzNjNcNjNcMFwyXDM2NFw3NVwwXDFcMzY1XDEzXDBcMVwzNjVcNDRcMCIrCi0gICAgIlwyXDM2Nlw0MVwwXDJcMzY3XDFcMFwzXDM2N1wyXDBcMVwyNTRcNFwzNjciKwotICAgICJcMVwwXDEwXDM2N1wxXDBcMzJcMzY3XDJcMFwxXDM2N1wzXDBcMlwzNzAiKwotICAgICJcMVwwXDNcMzcwXDJcMFwxXDMwMFw0XDM3MFwxXDBcMTBcMzcwXDFcMCIrCi0gICAgIlwzMlwzNzBcMlwwXDFcMzcwXDJcMTUzXDFcMFwyN1wxNTNcMVwzNzFcMzRcMTUzIisKLSAgICAiXDNcMFwyXDM3MlwxXDBcM1wzNzJcMlwwXDFcMzEzXDRcMzcyXDFcMCIrCi0gICAgIlwxMFwzNzJcMVwwXDMyXDM3MlwyXDBcMVwzNzJcMlwxNjJcMVwwXDI3XDE2MiIrCi0gICAgIlwxXDM3M1wzNFwxNjJcMzNcMFwxXDM3NFwxMTRcMFwxXDM1NVwyMlwwXDFcMzU3IisKLSAgICAiXDE0XDBcM1wzNTdcMlwwXDFcMzU3XDEwXDBcMVwzNTdcMVwwXDJcMzU3IisKLSAgICAiXDNcMFwxXDM1N1wxXDBcMVwzNTZcMlwzNTdcMTFcMFwzXDU3XDRcMCIrCi0gICAgIlwxXDU3XDVcMFw2XDU3XDFcMFw3XDU3XDFcMzc1XDNcNTdcMVwwIisKLSAgICAiXDdcNTdcMVwwXDNcNTdcMVwwXDVcNTdcNlwwXDNcNTdcNFwwIisKLSAgICAiXDFcNTdcNVwwXDZcNTdcMVwwXDZcNTdcMVwzNzZcNFw1N1wxXDAiKwotICAgICJcN1w1N1wxXDBcM1w1N1wxXDBcNVw1N1w0NlwwXDFcMzc3XDVcMCIrCi0gICAgIlwxXDM3N1w1NFwwXDFcdTAxMDBcNjNcMFwxXHUwMTAxXDEwXDBcMVx1MDEwMVw1NVwwIisKLSAgICAiXDFcdTAxMDJcMTBcMFwxXHUwMTAyXDYwXDBcMVx1MDEwM1wyNFwwXDJcMTUzXDFcMCIrCi0gICAgIlwzMFwxNTNcMVx1MDEwNFwzM1wxNTNcMlwxNjJcMVwwXDMwXDE2MlwxXHUwMTA1XDMzXDE2MiIrCi0gICAgIlwzNFwwXDFcdTAxMDZcNDBcMFwzXDU3XDRcMFwxXDU3XDVcMFw2XDU3IisKLSAgICAiXDFcMFwxM1w1N1wxXDBcM1w1N1wxXHUwMTA3XDNcNTdcMVwwXDNcNTciKwotICAgICJcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTdcNVwwXDZcNTciKwotICAgICJcMVwwXDNcNTdcMVx1MDEwOFw3XDU3XDFcMFwzXDU3XDFcdTAxMDhcM1w1NyIrCi0gICAgIlwxXDBcM1w1N1wxXDBcNVw1N1w0N1wwXDFcdTAxMDlcNjBcMFwxXHUwMTBhIisKLSAgICAiXDE0XDBcMVx1MDEwYVw1NFwwXDFcdTAxMGJcNDdcMFwyXHUwMTBjXDcyXDBcMVx1MDEwZCIrCi0gICAgIlwzMFwwXDFcdTAxMGRcM1wwXDJcMTUzXDFcMFwzMVwxNTNcMVx1MDEwZVwzMlwxNTMiKwotICAgICJcMlwxNjJcMVwwXDMxXDE2MlwxXHUwMTBmXDMyXDE2MlwzNVwwXDFcdTAxMTBcMzdcMCIrCi0gICAgIlwzXDU3XDRcMFwxXDU3XDVcMFw2XDU3XDFcMFwxM1w1N1wxXDAiKwotICAgICJcNlw1N1wxXHUwMTExXDFcMFwzXDU3XDFcMFw1XDU3XDVcMFwxXHUwMTEyIisKLSAgICAiXDNcNTdcM1wwXDFcdTAxMTJcMVw1N1w0XDBcMVx1MDExMlw2XDU3XDFcMCIrCi0gICAgIlwxM1w1N1wxXDBcN1w1N1wxXDBcM1w1N1wxXDBcNVw1N1wzN1wwIisKLSAgICAiXDFcdTAxMTNcMTBcMFwxXHUwMTEzXDUzXDBcMVx1MDExNFwxM1wwXDFcdTAxMTRcNTJcMCIrCi0gICAgIlwxXHUwMTE1XDEzXDBcMVx1MDExNVwxNVwwXDJcMTUzXDFcMFwzMlwxNTNcMVx1MDExNiIrCi0gICAgIlwzMVwxNTNcMlwxNjJcMVwwXDMyXDE2MlwxXHUwMTE3XDMxXDE2MlwzNFwwXDFcdTAxMTgiKwotICAgICJcNDBcMFwzXDU3XDRcMFwxXDU3XDVcMFw1XDU3XDFcdTAxMTlcMVwwIisKLSAgICAiXDEzXDU3XDFcMFw3XDU3XDFcMFwzXDU3XDFcMFw1XDU3XDVcMCIrCi0gICAgIlwxXHUwMTEyXDZcMFwxXHUwMTEyXDVcMFwxXHUwMTEyXDQ0XDBcMlwxNTNcMVwwIisKLSAgICAiXDMxXDE1M1wxXHUwMTFhXDMyXDE1M1wyXDE2MlwxXDBcMzFcMTYyXDFcdTAxMWJcMzJcMTYyIisKLSAgICAiXDMxXDBcMVx1MDExY1w0M1wwXDNcNTdcNFwwXDFcNTdcNVwwXDZcNTciKwotICAgICJcMVwwXDVcNTdcMVx1MDExZFw1XDU3XDFcMFw3XDU3XDFcMFwzXDU3IisKLSAgICAiXDFcMFw1XDU3XDJcMTUzXDFcMFwyNlwxNTNcMVx1MDExZVwzNVwxNTNcMlwxNjIiKwotICAgICJcMVwwXDI2XDE2MlwxXHUwMTFmXDM1XDE2Mlw2XDBcM1w1N1w0XDBcMVw1NyIrCi0gICAgIlw1XDBcNlw1N1wxXDBcN1w1N1wxXHUwMTIwXDNcNTdcMVwwXDdcNTciKwotICAgICJcMVwwXDNcNTdcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTciKwotICAgICJcNVwwXDZcNTdcMVwwXDEzXDU3XDFcMFw3XDU3XDFcMFwzXDU3IisKLSAgICAiXDFcMFw0XDU3XDFcdTAxMjFcNlwwXDNcNTdcNFwwXDFcNTdcNVwwIisKLSAgICAiXDZcNTdcMVwwXDVcNTdcMVx1MDEyMlw1XDU3XDFcMFw3XDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlw2XDU3XDFcMFw1XDU3XDFcdTAxMjNcNVw1N1wxXDBcN1w1N1wxXDAiKwotICAgICJcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDAiKwotICAgICJcNlw1N1wxXDBcMTNcNTdcMVwwXDNcNTdcMVx1MDEyNFwzXDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFw1XDU3IjsKLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eXRyYW5zIFtdID0geXlfdW5wYWNrKHl5X3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIC8vIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCQkvLyROT04tTkxTLTEkCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCQkvLyROT04tTkxTLTEkCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgkvLyROT04tTkxTLTEkCi0gIH07Ci0KLSAgLyoqCi0gICAqIFlZX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgWVlfQVRUUklCVVRFW10gPSB7Ci0gICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICA5LCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksIAotICAgICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICA5LCAgOSwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDAsICAwLCAKLSAgICAgOSwgIDEsICAxLCAgMSwgIDksICA5LCAgMCwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDAsICA5LCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIAotICAgICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsICA5LCAgMSwgIDAsICAwLCAgMSwgIDEsICAwLCAgMCwgIDEsICAwLCAKLSAgICAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMCwgIDksICAxLCAgMCwgIDAsICAxLCAgMSwgCi0gICAgIDAsICAxLCAgMCwgIDAsICAwLCAgOSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEsICAwLCAgMCwgIDEsIAotICAgICAxLCAgOSwgIDAsICAwLCAgOSwgIDksICA5LCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMSwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDksICAwLCAgMSwgIDksICAwLCAgMSwgCi0gICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMCwgIDAsIAotICAgICAwLCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAgMSwgIDAsICAwLCAgMCwgIDksICA5LCAgMSwgIDEsICAwLCAKLSAgICAgMSwgIDEsICA5LCAgOSwgIDksICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICAvLyBwcml2YXRlIGludCB5eWNvbHVtbjsgCi0KLSAgLyoqIAotICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIC8vIHByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsKLQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLSAgLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfZW9mX2RvbmU7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCXByaXZhdGUgaW50IGZUb2tlbkNvdW50ID0gMDsKLSAKLQkvLyByZXF1aXJlZCBob2xkZXJzIGZvciB3aGl0ZS1zcGFjZSBjb21wYWN0aW5nCi0JcHJpdmF0ZSBib29sZWFuIGZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRTdGFydCA9IDE7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkTGVuZ3RoID0gMDsKLQlwcml2YXRlIFN0cmluZyBmX2NvbnRleHQgPSBudWxsOwotCi0JLy8gc3RhdGUgc3RhY2sgZm9yIGhhbmRsaW5nIGVtYmVkZGVkIHJlZ2lvbnMKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0KLQlwcml2YXRlIFN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIGludCBzdGFydCA9IDA7Ci0JcHJpdmF0ZSBpbnQgdGV4dExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLQotCS8vIG9mZnNldCBmb3IgdHJhY2tpbmcgcG9zaXRpb24gc3BlY2lmaWMgYmxvY2sgdGFncwotCXByaXZhdGUgaW50IGZPZmZzZXQgPSAwOwotCQotCS8vIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhZyBiZWluZyBvcGVuZWQKLQlwcml2YXRlIFN0cmluZyBmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCi0JLy8gdGhlIGxpc3Qgb2YgdGFnIG5hbWUgQmxvY2tNYXJrZXJzCi0JcHJpdmF0ZSBMaXN0IGZCbG9ja01hcmtlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyByZXF1aXJlZCB0byBub3Qgc2VlayB0ZXh0IGJsb2NrcyBvbiBhbiBlbmQgdGFnCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSB0cnVlOwotCi0JcHJpdmF0ZSBYTUxQYXJzZXJSZWdpb25GYWN0b3J5IGZSZWdpb25GYWN0b3J5ID0gbmV3IFhNTFBhcnNlclJlZ2lvbkZhY3RvcnkoKTsKLS8qKgotICogdXNlciBtZXRob2QgCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgewotCWlmKGNvbnRhaW5zVGFnTmFtZShtYXJrZXIuZ2V0VGFnTmFtZSgpKSkKLQkJcmV0dXJuOwotCWZCbG9ja01hcmtlcnMuYWRkKG1hcmtlcik7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICovCi1wdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQlmQmxvY2tNYXJrZXJzLnJlbW92ZShtYXJrZXIpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ25hbWUpIHsKLQlpZiAoZkJsb2NrTWFya2VycyAhPSBudWxsKSB7Ci0JCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJCWlmICgoKEJsb2NrTWFya2VyKSBibG9ja3MubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzKHRhZ25hbWUpKQotCQkJCWJsb2Nrcy5yZW1vdmUoKTsKLQkJfQotCX0KLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmVCbG9ja2luZygpIHsKLQlyZXR1cm4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBmaW5hbCB2b2lkIHNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhib29sZWFuIG5ld1ZhbHVlKSB7Ci0JZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gbmV3VmFsdWU7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKSB7Ci0gICAgICAgIHJldHVybiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KFN0cmluZyBuYW1lKSB7Ci0JSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsKLQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOwotCQllbHNlIGlmKCFjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKLQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dCgpIHsKLQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoU3RyaW5nIG5hbWUpIHsKLQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gbWFya2VyLmdldENvbnRleHQoKTsKLQl9Ci0JcmV0dXJuIEJMT0NLX1RFWFQ7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIExpc3QgZ2V0QmxvY2tNYXJrZXJzKCkgewotCXJldHVybiBmQmxvY2tNYXJrZXJzOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgewotCXJldHVybiBmT2Zmc2V0ICsgeXljaGFyOwotfQotcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoKSB7Ci0JcmV0dXJuIGlzQmxvY2tNYXJrZXIoZkN1cnJlbnRUYWdOYW1lKTsKLX0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKSB7Ci0JaWYgKCFmSXNCbG9ja2luZ0VuYWJsZWQpCi0JCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gY29udGFpbnNUYWdOYW1lKHRhZ05hbWUpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZAotICovCi1wdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrVGFnU2NhbihTdHJpbmcgbmV3VGFnTmFtZSkgewotCWJlZ2luQmxvY2tNYXJrZXJTY2FuKG5ld1RhZ05hbWUsIEJMT0NLX1RFWFQpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZAotICoKLSAqIFNwZWNpYWwgdG9rZW5pemVyIHNldHVwLiAgQWxsb3dzIHRva2VuaXphdGlvbiB0byBiZSBpbml0aWF0ZWQgYXQgdGhlCi0gKiBzdGFydCBvZiBhIHRleHQgYmxvY2sgd2l0aGluIGEgIm5ld1RhZ05hbWUiIHRhZy4KLSAqCi0gKiBFeGFtcGxlOiAKLSAqCVRva2VuaXplciB0b2tlciA9IG5ldyBUb2tlbml6ZXIoKTsKLSAqCXRva2VyLnNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhmYWxzZSk7Ci0gKgl0b2tlci5yZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoImFmaXVocXdrZWpodGFzaWhnYWxrd2h0cTwvc2NyaXB0ZXI+PC9zY3I+PC9zY3JpcHQ+YXNnZGFzZ2EiKSk7Ci0gKgl0b2tlci5iZWdpbkJsb2NrTWFya2VyU2Nhbigic2NyaXB0IiwgQkxPQ0tfVEVYVCk7Ci0gKgl0b2tlci5nZXRSZWdpb25zKCk7IAotICoKLSAqIFJldHVybnM6Ci0gKglCTE9DS19URVhUOiAwLTQwCi0gKglYTUxfRU5EX1RBR19PUEVOOiA0MS00MgotICoJWE1MX1RBR19OQU1FOiA0My00OAotICoJWE1MX1RBR19DTE9TRTogNDktNDkKLSAqCVhNTF9DT05URU5UOiA1MC01NwotICoKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja01hcmtlclNjYW4oU3RyaW5nIG5ld1RhZ05hbWUsIFN0cmluZyBibG9ja2NvbnRleHQpIHsKLQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQlmQ3VycmVudFRhZ05hbWUgPSBuZXdUYWdOYW1lOwotfQotLyoqCi0gKiBNZXRob2QgZG9TY2FuLgotICogCi0gKiBSZXR1cm5zIGEgY29udGV4dCByZWdpb24gZm9yIGFsbCBvZiB0aGUgdGV4dCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIHVwdG8gdGhlIGVuZCBvZiBpbnB1dCBvcgotICogdG8gcmlnaHQgKmJlZm9yZSogdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBzZWFyY2hTdHJpbmcKLSAqIAotICogQHBhcmFtIHNlYXJjaFN0cmluZyAtIHRhcmdldCBzdHJpbmcgdG8gc2VhcmNoIGZvciBleC46ICItLT4iLCAiPC90YWduYW1lIgotICogQHBhcmFtIHJlcXVpcmVUYWlsU2VwYXJhdG9yIC0gd2hldGhlciB0aGUgdGFyZ2V0IG11c3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBvciAnPicKLSAqIEBwYXJhbSBjb250ZXh0IC0gdGhlIGNvbnRleHQgb2YgdGhlIHNjYW5uZWQgcmVnaW9uIGlmIG5vbi16ZXJvIGxlbmd0aAotICogQHBhcmFtIGV4aXRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgcmVnaW9uIHdhcyBvZiBub24temVybyBsZW5ndGgKLSAqIEBwYXJhbSBhYm9ydFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSBzZWFyY2hTdHJpbmcgd2FzIGZvdW5kIGltbWVkaWF0ZWx5Ci0gKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBjb250ZXh0IGZvdW5kOiB0aGUgZGVzaXJlZCBjb250ZXh0IG9uIGEgbm9uLXplcm8gbGVuZ3RoIG1hdGNoLCB0aGUgYWJvcnRDb250ZXh0IG9uIGltbWVkaWF0ZSBzdWNjZXNzCi0gKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvU2NhbihTdHJpbmcgc2VhcmNoU3RyaW5nLCBib29sZWFuIHJlcXVpcmVUYWlsU2VwYXJhdG9yLCBTdHJpbmcgc2VhcmNoQ29udGV4dCwgaW50IGV4aXRTdGF0ZSwgaW50IGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JYm9vbGVhbiBzdGlsbFNlYXJjaGluZyA9IHRydWU7Ci0JLy8gRGlzYWJsZSBmdXJ0aGVyIGJsb2NrIChwcm9iYWJseSkKLQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQlpbnQgc2VhcmNoU3RyaW5nTGVuZ3RoID0gc2VhcmNoU3RyaW5nLmxlbmd0aCgpOwotCWludCBuID0gMDsKLQljaGFyIGxhc3RDaGVja0NoYXI7Ci0JaW50IGk7Ci0JYm9vbGVhbiBzYW1lID0gZmFsc2U7Ci0Jd2hpbGUgKHN0aWxsU2VhcmNoaW5nKSB7Ci0JCW4gPSAwOwotCQkvLyBFbnN1cmUgdGhhdCBlbm91Z2ggZGF0YSBmcm9tIHRoZSBpbnB1dCBleGlzdHMgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBzZWFyY2ggU3RyaW5nLgotCQluID0geXlfYWR2YW5jZSgpOwotCQl3aGlsZShuICE9IFlZRU9GICYmIHl5X2N1cnJlbnRQb3MgPCBzZWFyY2hTdHJpbmdMZW5ndGgpCi0JCQluID0geXlfYWR2YW5jZSgpOwotCQkvLyBJZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydCBvciB3ZSd2ZSBleGhhdXN0ZWQgdGhlIGlucHV0LCBzdG9wIGltbWVkaWF0ZWx5LgotCQlpZiAobiA9PSBZWUVPRikgewotCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCXNhbWUgPSB0cnVlOwotCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDwlJT4pIHRoYXQgd2FzICpzaG9ydGVyKiB0aGFuIHRoZSBjbG9zZVRhZ1N0cmluZyBhbmQKLQkJCS8vIHRodXMgZm91bmQgdHdpY2UgYXQgY3VycmVudC10YXJnZXRMZW5ndGggW3NpbmNlIHRoZSBmaXJzdCBzY2FuIHdvdWxkIGhhdmUgY29tZSBvdXQgdGhpcyBmYXIgYW55d2F5XS4KLQkJCS8vIENoZWNrIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSB0YXJnZXQgdmVyc3VzIHRoZSBsYXN0IHRhcmdldExlbmd0aCBjaGFyYWN0ZXJzIHJlYWQgZnJvbSB0aGUgYnVmZmVyCi0JCQkvLyBhbmQgc2VlIGlmIGl0IG1hdGNoZXMKLQkJCQotCQkJLy8gc2FmZXR5IGNoZWNrIGZvciBhcnJheSBhY2Nlc3NlcyAoeXlfY3VycmVudFBvcyBpcyB0aGUgKmxhc3QqIGNoYXJhY3RlciB3ZSBjYW4gY2hlY2sgYWdhaW5zdCkKLQkJCWlmKHl5X2N1cnJlbnRQb3MgPj0gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgPD0geXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCWZvcihpID0gMDsgaSA8IHNlYXJjaFN0cmluZ0xlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmKHNhbWUgJiYgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJc2FtZSA9IHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKTsKLQkJCQkJZWxzZSBpZihzYW1lICYmICFmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpCi0JCQkJCQlzYW1lID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0pID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShzZWFyY2hTdHJpbmcuY2hhckF0KGkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBzYWZldHkgY2hlY2sgZmFpbGVkOyBubyBtYXRjaCBpcyBwb3NzaWJsZSByaWdodCBub3cKLQkJCWVsc2UgewotCQkJCXNhbWUgPSBmYWxzZTsKLQkJCX0KLQkJCWlmIChzYW1lICYmIHJlcXVpcmVUYWlsU2VwYXJhdG9yICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoKSB7Ci0JCQkJLy8gQWRkaXRpb25hbCBjaGVjayBmb3IgY2xvc2UgdGFncyB0byBlbnN1cmUgdGhhdCB0YXJnZXRTdHJpbmc9Ijwvc2NyaXB0IiBkb2Vzbid0IG1hdGNoCi0JCQkJLy8gIjwvc2NyaXB0UyIKLQkJCQlsYXN0Q2hlY2tDaGFyID0geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdOwotCQkJCS8vIFN1Y2NlZWQgb24gIjwvc2NyaXB0PiIgYW5kICI8L3NjcmlwdCAiCi0JCQkJaWYobGFzdENoZWNrQ2hhciA9PSAnPicgfHwgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShsYXN0Q2hlY2tDaGFyKSkKLQkJCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0aWxsU2VhcmNoaW5nID0gIXNhbWUgfHwgKHl5X2N1cnJlbnRQb3MgPCB5eV9zdGFydFJlYWQgKyBzZWFyY2hTdHJpbmdMZW5ndGgpOwotCQkJfQotCQl9Ci0JfQotCWlmIChuICE9IFlZRU9GIHx8IHNhbWUpIHsKLQkJLy8gV2UndmUgc3RvcHBlZCBzaG9ydCBvZiB0aGUgZW5kIG9yIGRlZmluaXRlbHkgZm91bmQgYSBtYXRjaAotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOwotCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJLy8gSWYgdGhlIHNlYXJjaFN0cmluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQotCQlpZiAoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJeXliZWdpbihpbW1lZGlhdGVGYWxsYmFja1N0YXRlKTsKLQkJCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCS8vIFdlIHJhbiB0aHJvdWdoIHRoZSByZXN0IG9mIHRoZSBpbnB1dAotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOwotCQl5eV9jdXJyZW50UG9zKys7Ci0JfQotCXl5YmVnaW4oZXhpdFN0YXRlKTsKLQkvLyBJZiB0aGUgZW5kaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlCi0JLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkKLQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKQotCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOwotCXJldHVybiBzZWFyY2hDb250ZXh0OwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZAotICoKLSAqIEEgZ2VuZXJpYyBsb29rYWhlYWQtbGlrZSBvcGVyYXRpb24KLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1NjYW4oU3RyaW5nIHRhcmdldCwgU3RyaW5nIHRhcmdldENvbnRleHQsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCXJldHVybiBkb1NjYW4odGFyZ2V0LCBmYWxzZSwgdGFyZ2V0Q29udGV4dCwgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSwgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICogZG9lcyBhIGxvb2thaGVhZCBmb3IgdGhlIGN1cnJlbnQgdGFnIG5hbWUKLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1RhZ1NjYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpOwotCXJldHVybiBkb1NjYW4oIjwvIiArIGZDdXJyZW50VGFnTmFtZSwgdHJ1ZSwgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSksIFlZSU5JVElBTCwgWVlJTklUSUFMKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBDb252ZXJ0cyB0aGUgcmF3IGNvbnRleHQgU3RyaW5nIHJldHVybmVkIGJ5IHRoZSBwcmltR2V0TmV4dFRva2VuKCkKLSAqIG1ldGhvZCBpbnRvIGEgZnVsbCBJVGV4dFJlZ2lvbiBieSBwdWxsaW5nIGluIHZhbHVlcyBmb3IgdGhlCi0gKiBjdXJyZW50IG9mZnNldCB3aXRoaW4gdGhlIHNjYW5uaW5nIHRleHQuCi0gKgotICogUmV0dXJucyBudWxsIHdoZW4gRU9GIGlzIGVuY291bnRlcmVkIGFuZCBhdHRhY2hlcyBpbnRlcm1pdHRlbnRseQotICogZGlzY292ZXJlZCB3aGl0ZXNwYWNlIG9udG8gdGhlIGVuZCBvZiB1c2VmdWwgcmVnaW9ucy4KLSAqCi0gKiBOb3RlIHRoYXQgdGhpcyBhbGdvcml0aG0gY2FjaGVzIHRoZSB0b2tlbiBmb2xsb3dpbmcgdGhlIG9uZSBiZWluZyByZXR1cm5lZAotICogc28gdGhhdCB3aGl0ZXNwYWNlIGNhbiBiZSBjb2xsYXBzZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCS8vIGxvYWQgdGhlIHN0YXJ0aW5nIG5vbi13aGl0ZXNwYWNlIHRva2VuIChhc3N1bWUgdGhhdCBpdCBpcyBzbykKLQlpZiAoZlNob3VsZExvYWRCdWZmZXJlZCkgewotCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsKLQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsKLQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsKLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCX0KLQllbHNlIHsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJaWYgKGNvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7Ci0JCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOwotCQkJZWxzZQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQkJfQotCQlzdGFydCA9IHl5Y2hhcjsKLQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCWlmICh5eV9hdEVPRikgewotCQkJZlRva2VuQ291bnQrKzsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCS8vIHN0b3JlIHRoZSBuZXh0IHRva2VuCi0JZl9jb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCWlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7Ci0JCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpCi0JCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJZWxzZQotCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQl9Ci0JZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfT1BFTikgewotCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCX0KLQllbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQl9Ci0JZkJ1ZmZlcmVkQ29udGV4dCA9IGZfY29udGV4dDsKLQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOwotCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOwotCWlmIChmQnVmZmVyZWRDb250ZXh0ID09IFdISVRFX1NQQUNFKSB7Ci0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQkJbGVuZ3RoICs9IGZCdWZmZXJlZExlbmd0aDsKLQl9Ci0JaWYgKGNvbnRleHQgPT0gbnVsbCkgewotCQkvLyBFT0YKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRpc2NvdmVyZWQgIiArIGZUb2tlbkNvdW50ICsgIiB0b2tlbnMuIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCWZUb2tlbkNvdW50Kys7Ci0JcmV0dXJuIGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgsIG51bGwsIGZDdXJyZW50VGFnTmFtZSk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIFhNTFRva2VuaXplcigpewotCXN1cGVyKCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIFhNTFRva2VuaXplcihjaGFyW10gY2hhckFycmF5KXsKLQkJdGhpcyhuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSkpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsKLQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIDApOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXksIGludCBuZXdPZmZzZXQpIHsKLQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIG5ld09mZnNldCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgMCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbiwgaW50IG5ld09mZnNldCkgewotCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgbmV3T2Zmc2V0KTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbikgewotCXJlc2V0KGluLCAwKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QgKgotICoKLSAqIFJlc2V0IGludGVybmFsIGNvdW50ZXJzIGFuZCB2YXJzIHRvICJuZXdseSBjcmVhdGVkIiB2YWx1ZXMsIGluIHRoZSBob3BlcwotICogdGhhdCByZXNldHRpbmcgYSBwcmUtZXhpc3RpbmcgdG9rZW5pemVyIGlzIGZhc3RlciB0aGFuIGNyZWF0aW5nIGEgbmV3IG9uZS4KLSAqCi0gKiBUaGlzIG1ldGhvZCBjb250YWlucyBjb2RlIGJsb2NrcyB0aGF0IHdlcmUgZXNzZW50aWFsbHkgZHVwbGljYXRlZCBmcm9tIHRoZQotICogPGVtPmdlbmVyYXRlZDwvZW0+IG91dHB1dCBvZiB0aGlzIHNwZWNpZmljYXRpb24gYmVmb3JlIHRoaXMgbWV0aG9kIHdhcwotICogYWRkZWQuICBUaG9zZSBjb2RlIGJsb2NrcyB3ZXJlIHVuZGVyIHRoZSBhYm92ZSBjb3B5cmlnaHQuCi0gKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigicmVzZXR0aW5nIHRva2VuaXplciIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZk9mZnNldCA9IG5ld09mZnNldDsKLQotCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQl5eV9yZWFkZXIgPSBpbjsKLQotCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLQl5eV9zdGF0ZSA9IDA7Ci0KLQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0JeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsKLQotCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JeXlfbWFya2VkUG9zID0gMDsKLQotCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JeXlfcHVzaGJhY2tQb3MgPSAwOwotCi0JLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JeXlfY3VycmVudFBvcyA9IDA7Ci0KLQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQl5eV9zdGFydFJlYWQgPSAwOwotCi0JLyoqIAotCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCSAqIGZyb20gaW5wdXQgCi0JICovCi0JeXlfZW5kUmVhZCA9IDA7Ci0KLQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQl5eWxpbmUgPSAwOwotCi0JLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JeXljaGFyID0gMDsKLQotCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQl5eV9hdEVPRiA9IGZhbHNlOwotCi0JLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0JeXlfZW9mX2RvbmUgPSBmYWxzZTsKLQotCi0JLyogdXNlciB2YXJzOiAqLwotCWZUb2tlbkNvdW50ID0gMDsKLSAKLQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JZkJ1ZmZlcmVkU3RhcnQgPSAxOwotCWZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQotCWNvbnRleHQgPSBudWxsOwotCXN0YXJ0ID0gMDsKLQl0ZXh0TGVuZ3RoID0gMDsKLQlsZW5ndGggPSAwOwotfQotCi0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKgotCSAqLwotCXB1YmxpYyBCbG9ja1Rva2VuaXplciBuZXdJbnN0YW5jZSgpIHsKLQkJWE1MVG9rZW5pemVyIG5ld0luc3RhbmNlID0gbmV3IFhNTFRva2VuaXplcigpOwotCQkvLyBnbG9iYWwgdGFnbWFya2VycyBjYW4gYmUgc2hhcmVkOyB0aGV5IGhhdmUgbm8gc3RhdGUgYW5kIAotCQkvLyBhcmUgbmV2ZXIgZGVzdHJveWVkIChlLmcuICdyZWxlYXNlJykKLQkJZm9yKGludCBpID0gMDsgaSA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUJsb2NrTWFya2VyIGJsb2NrTWFya2VyID0gKEJsb2NrTWFya2VyKSBmQmxvY2tNYXJrZXJzLmdldChpKTsKLQkJCWlmKGJsb2NrTWFya2VyLmlzR2xvYmFsKCkpCi0JCQkJbmV3SW5zdGFuY2UuYWRkQmxvY2tNYXJrZXIoYmxvY2tNYXJrZXIpOwotCQl9Ci0JCXJldHVybiBuZXdJbnN0YW5jZTsKLQl9Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NhblhNTENvbW1lbnRUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkvLyBTY2FuIGZvciAnLS0+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMKLQkvLyAgIFhNTF9DT01NRU5UX1RFWFQgdW5sZXNzIHRoZSBzdHJpbmcgb2NjdXJzIElNTUVESUFURUxZLCBpbiB3aGljaAotCS8vICBjYXNlIGNoYW5nZSB0byB0aGUgU1RfWE1MX0NPTU1FTlRfRU5EIHN0YXRlIGFuZCByZXR1cm4gdGhlIG5leHQKLQkvLyAgY29udGV4dCBhcyB1c3VhbC4KLQlyZXR1cm4gZG9TY2FuKCItLT4iLCBmYWxzZSwgWE1MX0NPTU1FTlRfVEVYVCwgU1RfWE1MX0NPTU1FTlRfRU5ELCBTVF9YTUxfQ09NTUVOVF9FTkQpOwotfQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUxUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBERkEgdHJhbnNpdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB5eV91bnBhY2soU3RyaW5nIHBhY2tlZCkgewotICAgIGludCBbXSB0cmFucyA9IG5ldyBpbnRbMTEwNTVdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDM2MzgpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIHZhbHVlLS07Ci0gICAgICBkbyB0cmFuc1tqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiB0cmFuczsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMzcyKSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZyAtIGZyb20gdGhlIFNFRCBKRmxleCBza2VsZXRvbgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotICAgIC8vIERPIE5PVCBFWElUIHRoZSBWTSBvbiBhbiBlcnJvcgotICAgIC8vIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKGNoYXJbXSBtYXJrZXJUYWdOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgdGFnbmFtZUxlbmd0aCkgewotCQlmb3IoaW50IGogPSAwOyBqIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGorKykgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWZCbG9ja01hcmtlcnMuZ2V0KGopOwotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5sZW5ndGgoKSA9PSB0YWduYW1lTGVuZ3RoKSB7Ci0JCQkJYm9vbGVhbiBtYXRjaGVzU29GYXIgPSB0cnVlOwotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCB0YWduYW1lTGVuZ3RoICYmIG1hdGNoZXNTb0ZhcjsgaSsrKSB7Ci0JCQkJCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkgIT0gbWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkKLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmKENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXIuZ2V0VGFnTmFtZSgpLmNoYXJBdChpKSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pKQotCQkJCQkJCW1hdGNoZXNTb0ZhciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKG1hdGNoZXNTb0ZhcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICoKLQkgKiBSZXR1cm4gQUxMIG9mIHRoZSByZWdpb25zIHNjYW5uYWJsZSB3aXRoaW4gdGhlIHJlbWFpbmluZyB0ZXh0Ci0JICogTm90ZTogZm9yIHZlcmlmaWNhdGlvbiB1c2UKLQkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdCBnZXRSZWdpb25zKCkgewotCQlMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZ2lvbiA9IGdldE5leHRUb2tlbigpOwotCQkJd2hpbGUocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkJdG9rZW5zLmFkZChyZWdpb24pOwotCQkJCX0KLQkJCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIjogaW5wdXQgY291bGQgbm90IGJlIHRva2VuaXplZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldE9mZnNldCgpLCBlKTsvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBlOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gU2luY2UgdGhpcyBpcyBjb252ZW5pZW5jZSBtZXRob2QgYW5kIE5PVCB0aGUgcmVjb21tZW5kZWQgCi0JCQkvLyB3YXkgb2YgZ2V0dGluZyB0b2tlbnMsIG1hbnkgZXJyb3JzIGFyZSBzaW1wbHkgaGlkZGVuCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gbm90IGhhbmRsZWQgcmV0cmlldmluZyByZWdpb25zOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGUpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdG9rZW5zOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBkdW1wKFN0cmluZyBzKSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHMgKyAiICgiICsgeXljaGFyICsgIi0iICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkoeXlsZW5ndGgoKSArIHl5Y2hhcikgKyAiKTpcJyIgKy8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nVXRpbHMuZXNjYXBlKHl5dGV4dCgpKSArICJcJyIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkvKiB1c2VyIG1ldGhvZCAgLSBza2VsZXRvbi5zZWQgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VPRigpIHsKLQkJcmV0dXJuIHl5X2F0RU9GOwotCX0KLS8qIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkICovCi1wcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoU3RyaW5nIG1hcmtlclRhZ05hbWUpIHsKLQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoYmxvY2tzLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpYmxvY2tzLm5leHQoKTsKLQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhtYXJrZXJUYWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShtYXJrZXJUYWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotICAgIGlmICgheXlfZW9mX2RvbmUpIHsKLSAgICAgIHl5X2VvZl9kb25lID0gdHJ1ZTsKLSAgICAvLyBkbyBub3RoaW5nLCB0aGlzIGlzIHRoZSBkb3duc3RyZWFtIHBhcnNlcidzIGpvYgotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICBib29sZWFuIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgIGZvciAoeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZDsgeXlfY3VycmVudFBvcyA8IHl5X21hcmtlZFBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2N1cnJlbnRQb3MrKykgewotICAgICAgICBzd2l0Y2ggKHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSkgewotICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgeXlfY291bnRlZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICBpZiAoeXlfY291bnRlZCkKLSAgICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHl5X2NvdW50ZWQpIHsKLSAgICAgICAgaWYgKCB5eV9hZHZhbmNlKCkgPT0gJ1xuJyApIHl5bGluZS0tOwotICAgICAgICBpZiAoICF5eV9hdEVPRiApIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIHl5X3N0YXRlID0geXlfbGV4aWNhbF9zdGF0ZTsKLQotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICBpbnQgeXlfbmV4dCA9IHl5dHJhbnNbIHl5X3Jvd01hcFt5eV9zdGF0ZV0gKyB5eWNtYXBbeXlfaW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHl5X25leHQgPT0gLTEpIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB5eV9zdGF0ZSA9IHl5X25leHQ7Ci0KLSAgICAgICAgICBpbnQgeXlfYXR0cmlidXRlcyA9IFlZX0FUVFJJQlVURVt5eV9zdGF0ZV07Ci0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDEpID4gMCApIHsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDgpID4gMCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgMjkxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYU0wgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMjkzOiBicmVhazsKLSAgICAgICAgY2FzZSAyODM6IAotICAgICAgICBjYXNlIDI4NTogCi0gICAgICAgIGNhc2UgMjg2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkNEQVRBIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQl5eWJlZ2luKFNUX0NEQVRBX1RFWFQpOwotCXJldHVybiBYTUxfQ0RBVEFfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMjk0OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSAyOTU6IGJyZWFrOwotICAgICAgICBjYXNlIDI3NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDI5NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfRE9DVFlQRV9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgMjk3OiBicmVhazsKLSAgICAgICAgY2FzZSAyNjg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgZXh0ZXJuYWwgaWQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUM7Ci0gfQotICAgICAgICBjYXNlIDI5ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNOwotIH0KLSAgICAgICAgY2FzZSAyOTk6IGJyZWFrOwotICAgICAgICBjYXNlIDI2MzogCi0gICAgICAgIGNhc2UgMjczOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMwMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkNoYXJSZWYiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9DSEFSX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgMzAxOiBicmVhazsKLSAgICAgICAgY2FzZSAyMzQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9DT01NRU5UKTsKLQlyZXR1cm4gWE1MX0NPTU1FTlRfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzAyOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTU6IAotICAgICAgICBjYXNlIDIxNjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMwMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGVuZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIFhNTF9DT01NRU5UX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiQ0RBVEEgZW5kIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfQ0RBVEFfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMwNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcblBFUmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfUEVfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSAzMDY6IGJyZWFrOwotICAgICAgICBjYXNlIDIwOTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5FbnRpdHlSZWYiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTlRJVFlfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSAzMDc6IGJyZWFrOwotICAgICAgICBjYXNlIDE2MDogCi0gICAgICAgIGNhc2UgMTc0OiAKLSAgICAgICAgY2FzZSAxODI6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVDsKLSB9Ci0gICAgICAgIGNhc2UgMzA4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNDg6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZW1wdHkgdGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gWE1MX0VNUFRZX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzA5OiBicmVhazsKLSAgICAgICAgY2FzZSAxMzM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMTA6IGJyZWFrOwotICAgICAgICBjYXNlIDEzMjogCi0gICAgICAgICAgeyAKLQkJLy8gZW5kZWQgd2l0aCBub3RoaW5nIGluc2lkZQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMxMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMTI6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMDogCi0gICAgICAgICAgeyAKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX09QRU47Ci0gfQotICAgICAgICBjYXNlIDMxMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9QSSk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzE0OiBicmVhazsKLSAgICAgICAgY2FzZSA2MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzE1OiBicmVhazsKLSAgICAgICAgY2FzZSA1NzogCi0gICAgICAgIGNhc2UgNTk6IAotICAgICAgICBjYXNlIDYwOiAKLSAgICAgICAgY2FzZSA2MTogCi0gICAgICAgIGNhc2UgMTM3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSAzMTY6IGJyZWFrOwotICAgICAgICBjYXNlIDU2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDMxNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzE4OiBicmVhazsKLSAgICAgICAgY2FzZSA1MTogCi0gICAgICAgIGNhc2UgNTI6IAotICAgICAgICBjYXNlIDUzOiAKLSAgICAgICAgICB7IAotCS8vIGJsb2NrIHNjYW4gdW50aWwgY2xvc2UgaXMgZm91bmQKLQlyZXR1cm4gZG9TY2FuKCI/PiIsIGZhbHNlLCBYTUxfUElfQ09OVEVOVCwgU1RfWE1MX1BJX1RBR19DTE9TRSwgU1RfWE1MX1BJX1RBR19DTE9TRSk7Ci0gfQotICAgICAgICBjYXNlIDMxOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oU1RfUElfQ09OVEVOVCk7Ci0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgMzIwOiBicmVhazsKLSAgICAgICAgY2FzZSA0NjogCi0gICAgICAgIGNhc2UgNDc6IAotICAgICAgICBjYXNlIDQ4OiAKLSAgICAgICAgY2FzZSA0OTogCi0gICAgICAgIGNhc2UgMTI5OiAKLSAgICAgICAgY2FzZSAxMzA6IAotICAgICAgICBjYXNlIDEzMTogCi0gICAgICAgIGNhc2UgMjE3OiAKLSAgICAgICAgY2FzZSAyMzk6IAotICAgICAgICBjYXNlIDI0MDogCi0gICAgICAgIGNhc2UgMjUyOiAKLSAgICAgICAgY2FzZSAyNTM6IAotICAgICAgICBjYXNlIDI2MjogCi0gICAgICAgIGNhc2UgMjcyOiAKLSAgICAgICAgY2FzZSAyODA6IAotICAgICAgICBjYXNlIDI4NDogCi0gICAgICAgIGNhc2UgMjg3OiAKLSAgICAgICAgY2FzZSAyODg6IAotICAgICAgICBjYXNlIDI4OTogCi0gICAgICAgIGNhc2UgMjkwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9QSV9XUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMyMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICBjYXNlIDQyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotIH0KLSAgICAgICAgY2FzZSAzMjI6IGJyZWFrOwotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJMSU5FIEZFRUQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSAzMjM6IGJyZWFrOwotICAgICAgICBjYXNlIDA6IAotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgY2FzZSAxMjI6IAotICAgICAgICBjYXNlIDEyNDogCi0gICAgICAgIGNhc2UgMjA3OiAKLSAgICAgICAgY2FzZSAyMDg6IAotICAgICAgICBjYXNlIDIzNjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5YTUwgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDMyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogCi0gICAgICAgIGNhc2UgODogCi0gICAgICAgIGNhc2UgOTogCi0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICBjYXNlIDQ1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ3aGl0ZSBzcGFjZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSAzMjU6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgY2FzZSA3MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiaW5hcHByb3ByaWF0ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzI2OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgIGNhc2UgMTA2OiAKLSAgICAgICAgY2FzZSAxMDc6IAotICAgICAgICBjYXNlIDE5MzogCi0gICAgICAgIGNhc2UgMjI5OiAKLSAgICAgICAgY2FzZSAyNDg6IAotICAgICAgICBjYXNlIDI1OTogCi0gICAgICAgIGNhc2UgMjY5OiAKLSAgICAgICAgY2FzZSAyNzc6IAotICAgICAgICBjYXNlIDI4MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzI3OiBicmVhazsKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgIGNhc2UgMTEzOiAKLSAgICAgICAgY2FzZSAxMTQ6IAotICAgICAgICBjYXNlIDIwNDogCi0gICAgICAgIGNhc2UgMjMzOiAKLSAgICAgICAgY2FzZSAyNTA6IAotICAgICAgICBjYXNlIDI2MDogCi0gICAgICAgIGNhc2UgMjcwOiAKLSAgICAgICAgY2FzZSAyNzg6IAotICAgICAgICBjYXNlIDI4MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSAzMjg6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgY2FzZSA3MjogCi0gICAgICAgIGNhc2UgODM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuc3RhcnQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzI5OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICBjYXNlIDM3OiAKLSAgICAgICAgY2FzZSAzODogCi0gICAgICAgIGNhc2UgMzk6IAotICAgICAgICBjYXNlIDQzOiAKLSAgICAgICAgY2FzZSA0NDogCi0gICAgICAgIGNhc2UgNTQ6IAotICAgICAgICBjYXNlIDU4OiAKLSAgICAgICAgY2FzZSA2MjogCi0gICAgICAgIGNhc2UgNjQ6IAotICAgICAgICBjYXNlIDY4OiAKLSAgICAgICAgY2FzZSA3NDogCi0gICAgICAgIGNhc2UgODA6IAotICAgICAgICBjYXNlIDg1OiAKLSAgICAgICAgY2FzZSA4NjogCi0gICAgICAgIGNhc2UgODc6IAotICAgICAgICBjYXNlIDg4OiAKLSAgICAgICAgY2FzZSA5MDogCi0gICAgICAgIGNhc2UgOTE6IAotICAgICAgICBjYXNlIDkzOiAKLSAgICAgICAgY2FzZSA5ODogCi0gICAgICAgIGNhc2UgMTAzOiAKLSAgICAgICAgY2FzZSAxMTA6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiEhIXVuZXhwZWN0ZWQhISE6IFwiIiArIHl5dGV4dCgpICsgIlwiOiIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJeXljaGFyICsgIi0iICsgKHl5Y2hhciArIHl5bGVuZ3RoKCkpKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFVOREVGSU5FRDsKLSB9Ci0gICAgICAgIGNhc2UgMzMwOiBicmVhazsKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIHRleHQiKTsvLyROT04tTkxTLTEkCi0JU3RyaW5nIGJsb2NrQ29udGV4dCA9IGRvQmxvY2tTY2FuKCJdXT4iLCBYTUxfQ0RBVEFfVEVYVCwgU1RfQ0RBVEFfRU5EKTsvLyROT04tTkxTLTEkCi0JaWYoYmxvY2tDb250ZXh0ID09IFhNTF9DREFUQV9URVhUKQotCQl5eWJlZ2luKFNUX0NEQVRBX0VORCk7Ci0JcmV0dXJuIGJsb2NrQ29udGV4dDsKLSB9Ci0gICAgICAgIGNhc2UgMzMxOiBicmVhazsKLSAgICAgICAgY2FzZSA2NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzMyOiBicmVhazsKLSAgICAgICAgY2FzZSA2NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgMzMzOiBicmVhazsKLSAgICAgICAgY2FzZSA2NzogCi0gICAgICAgIGNhc2UgNjk6IAotICAgICAgICBjYXNlIDcwOiAKLSAgICAgICAgY2FzZSAxNDU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSAzMzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDczOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYoaXNCbG9ja01hcmtlcigpKSB7Ci0gICAgICAgIAl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQl9Ci0JZWxzZQotICAgICAgICAJeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzM1OiBicmVhazsKLSAgICAgICAgY2FzZSA3NTogCi0gICAgICAgIGNhc2UgNzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMzNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMzNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgMzM4OiBicmVhazsKLSAgICAgICAgY2FzZSA3OTogCi0gICAgICAgIGNhc2UgODE6IAotICAgICAgICBjYXNlIDgyOiAKLSAgICAgICAgY2FzZSAxNTI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSAzMzk6IGJyZWFrOwotICAgICAgICBjYXNlIDg0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkZWNsYXJhdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzNDA6IGJyZWFrOwotICAgICAgICBjYXNlIDg5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHR5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDM0MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTI6IAotICAgICAgICBjYXNlIDk0OiAKLSAgICAgICAgY2FzZSA5NTogCi0gICAgICAgIGNhc2UgOTY6IAotICAgICAgICBjYXNlIDE2NjogCi0gICAgICAgIGNhc2UgMTY3OiAKLSAgICAgICAgY2FzZSAxNzA6IAotICAgICAgICBjYXNlIDE3MTogCi0gICAgICAgIGNhc2UgMjI0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHB1YmxpYyByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0gfQotICAgICAgICBjYXNlIDM0MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTc6IAotICAgICAgICBjYXNlIDk5OiAKLSAgICAgICAgY2FzZSAxMDA6IAotICAgICAgICBjYXNlIDEwMTogCi0gICAgICAgIGNhc2UgMTc4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHN5c3RlbSByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0gfQotICAgICAgICBjYXNlIDM0MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgY2FzZSAxMDQ6IAotICAgICAgICBjYXNlIDEwNTogCi0gICAgICAgIGNhc2UgMTg2OiAKLSAgICAgICAgY2FzZSAxODc6IAotICAgICAgICBjYXNlIDE5MDogCi0gICAgICAgIGNhc2UgMTkxOiAKLSAgICAgICAgY2FzZSAyMjc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UKTsKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzNDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDEwODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzNDU6IGJyZWFrOwotICAgICAgICBjYXNlIDEwOTogCi0gICAgICAgIGNhc2UgMTExOiAKLSAgICAgICAgY2FzZSAxMTI6IAotICAgICAgICBjYXNlIDE5NzogCi0gICAgICAgIGNhc2UgMTk4OiAKLSAgICAgICAgY2FzZSAyMDE6IAotICAgICAgICBjYXNlIDIwMjogCi0gICAgICAgIGNhc2UgMjMxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UKTsKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzNDY6IGJyZWFrOwotICAgICAgICBjYXNlIDExNTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDM0NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmVuZCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX0VORF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzQ4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTY6IAotICAgICAgICBjYXNlIDExNzogCi0gICAgICAgICAgeyAKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JIH0KLSAgICAgICAgY2FzZSAzNDk6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHl5X2RvX2VvZigpOwotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlRXF1YWxzUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZUVxdWFsc1JlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzZkZDQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlRXF1YWxzUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlRXF1YWxzUmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAxOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotCXByaXZhdGUgc2hvcnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQotCXB1YmxpYyBBdHRyaWJ1dGVFcXVhbHNSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEF0dHJpYnV0ZUVxdWFsc1JlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZMZW5ndGggPSAoc2hvcnQpIGxlbmd0aDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IChzaG9ydCkgcmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlTmFtZVJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9BdHRyaWJ1dGVOYW1lUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYzQxNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9BdHRyaWJ1dGVOYW1lUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlTmFtZVJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQkvLyBzcGVjaWZ5IGNvcnJlY3QgdHlwZQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQotCXB1YmxpYyBBdHRyaWJ1dGVOYW1lUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVOYW1lUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHRMZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gMTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWZUZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlSZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIHJlZ2lvbiBpcyBhbiBlYXN5IHR5cGUgKGUuZy4gYXR0cmlidXRlIHZhbHVlKSwKLQkJLy8gYW5kIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcyBhcmUgYWxsCi0JCS8vIGFscGhhbnVtZXJpYywgdGhlbiBtYWtlIHRoZSBjaGFuZ2UgaGVyZSBsb2NhbGx5LgotCQkvLyAoVGhpcyBjYW4gb2J2aW91c2x5IGJlIG1hZGUgbW9yZSBzb3BoaXN0aWNhdGVkIGFzIHRoZSBuZWVkIGFyaXNlcywKLQkJLy8gYnV0IHNob3VsZAotCQkvLyBhbHdheXMgZm9sbG93IHRoaXMgcGF0dGVybi4pCi0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0Q29udGV4dFJlZ2lvbjo6dXBkYXRlTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHRyZWdpb24gdHlwZSBpcyAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBjYW5IYW5kbGUgPSBmYWxzZTsKLQkJLy8gbm90ZTogd2UnbGwgYWx3YXlzIGhhbmRsZSBkZWxldGVzIGZyb20gdGhlc2UKLQkJLy8gcmVnaW9ucyAuLi4gaWYgaXRzIGFscmVhZHkgdGhhdCByZWdpb24sCi0JCS8vIGRlbGV0aW5nIHNvbWV0aGluZyBmcm9tIGl0IHdvbid0IGNoYW5nZSBpdHMKLQkJLy8gdHlwZS4gKHJlbWVtYmVyLCB0aGUgY2FsbGluZyBwcm9ncmFtIG5lZWRzCi0JCS8vIHRvIGluc3VyZSB3ZSBhcmUgbm90IGNhbGxlZCwgaWYgbm90IGFsbCBjb250YWluZWQKLQkJLy8gb24gb25lIHJlZ2lvbi4KLQkJaWYgKChjaGFuZ2VzID09IG51bGwpIHx8IChjaGFuZ2VzLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBkZWxldGUgY2FzZQotCQkJLy8gV2UgY2FuIG5vdCBkbyB0aGUgcXVpY2sgZGVsZXRlLCBpZgotCQkJLy8gaWYgYWxsIHRoZSB0ZXh0IGluIGEgcmVnaW9uIGlzIHRvIGJlIGRlbGV0ZWQuCi0JCQkvLyBPciwgaWYgdGhlIGRlbGV0ZSBzdGFydHMgaW4gdGhlIHdoaXRlIHNwYWNlIHJlZ2lvbi4KLQkJCS8vIEluIHRoZXNlIGNhc2VzLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkJLy8gTWlub3Igbm90ZSwgd2UgdXNlIHRleHRFbmQtc3RhcnQgc2luY2UgaXQgYWx3YXlzCi0JCQkvLyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZW5kLXN0YXJ0LiBUaGlzIG1pZ2h0Ci0JCQkvLyBjYXVzZSB1cyB0byBtaXNzIGEgZmV3IGNhc2VzIHdlIGNvdWxkIGhhdmUgaGFuZGxlZCwKLQkJCS8vIGJ1dCB3aWxsIHByZXZlbnQgdXMgZnJvbSB0cnlpbmcgdG8gaGFuZGxlIGZ1bm5pbmcgY2FzZXMKLQkJCS8vIGludm9sdmluZyB3aGl0ZXNwYWNlLgotCQkJaWYgKChmU3RhcnQgPj0gZ2V0VGV4dEVuZCgpKSB8fCAoTWF0aC5hYnMobGVuZ3RoVG9SZXBsYWNlKSA+PSBnZXRUZXh0RW5kKCkgLSBnZXRTdGFydCgpKSkgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgfHwgUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc0xldHRlck9yRGlnaXQodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0KLQotCQl9Ci0JCWlmIChjYW5IYW5kbGUpIHsKLQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIGhhdmUgdGhlIG9sZCByZWdpb24uIFdlIHdvbid0IGNyZWF0ZSBhCi0JCQkvLyBuZXcgaW5zdGFuY2UsIHdlJ2xsIGp1c3QgdXBkYXRlIHRoZSBvbmUgd2UgaGF2ZSwgYnkgY2hhbmdpbmcKLQkJCS8vIGl0cyBlbmQgcG9zdGlvbiwKLQkJCS8vIFRoZSBwYXJlbnQgZmxhdG5vZGUsIHVwb24gcmV0dXJuLCBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvciB1cGRhdGluZyBzaWJsaW5nIHJlZ2lvbnMuCi0JCQkvLyBhbmQgaW4gdHVybiwgdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpdHNlbGYgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IKLQkJCS8vIHVwZGF0aW5nIHRoZSB0ZXh0IHN0b3JlIGFuZCBkb3duIHN0cmVhbSBmbGF0bm9kZXMuCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBoYW5kbGVkIGJ5IHJlZ2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkvLyBOb3RlOiB3ZSBhZGp1c3QgYm90aCBlbmQgYW5kIHRleHQgZW5kLCBiZWNhdXNlIGZvciBhbnkgY2hhbmdlCi0JCQkvLyB0aGF0IGlzIGluIG9ubHkgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVnaW9uLCB3ZSBzaG91bGQgbm90Ci0JCQkvLyBkbyBhIHF1aWNrIGNoYW5nZSwKLQkJCS8vIHNvICdjYW5IYW5kbGUnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UgZm9yIHRob3NlIGNhc2UuCi0JCQkvLyBUT19ET19GVVRVUkU6IGNhY2hlIHZhbHVlIG9mIGNhbkhhbmRsZUFzV2hpdGVTcGFjZSBmcm9tIGFib3ZlCi0JCQkvLyBJZiB3ZSBhcmUgaGFuZGxpbmcgYXMgd2hpdGVzcGFjZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNyZWFzZQotCQkJLy8gdGhlIHRleHQgbGVuZ3RoLCBvbmx5Ci0JCQkvLyB0aGUgdG90YWwgbGVuZ3RoIGlzIGNoYW5naW5nLgotCQkJaWYgKCFSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWZUZXh0TGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQl9Ci0JCQlmTGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KHBhcmVudC5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIHBhcmVudCwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlVmFsdWVSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlVmFsdWVSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiYmJiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZVZhbHVlUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlVmFsdWVSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0JLy8gc3BlY2lmeSBjb3JyZWN0IHR5cGUKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCXByaXZhdGUgaW50IGZUZXh0TGVuZ3RoOwotCi0JcHVibGljIEF0dHJpYnV0ZVZhbHVlUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVWYWx1ZVJlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0TGVuZ3RoID0gdGV4dExlbmd0aDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJUmVnaW9uQ2hhbmdlZEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIHRoZSByZWdpb24gaXMgYW4gZWFzeSB0eXBlIChlLmcuIGF0dHJpYnV0ZSB2YWx1ZSksCi0JCS8vIGFuZCB0aGUgcmVxdWVzdGVkIGNoYW5nZXMgYXJlIGFsbAotCQkvLyBhbHBoYW51bWVyaWMsIHRoZW4gbWFrZSB0aGUgY2hhbmdlIGhlcmUgbG9jYWxseS4KLQkJLy8gKFRoaXMgY2FuIG9idmlvdXNseSBiZSBtYWRlIG1vcmUgc29waGlzdGljYXRlZCBhcyB0aGUgbmVlZCBhcmlzZXMsCi0JCS8vIGJ1dCBzaG91bGQKLQkJLy8gYWx3YXlzIGZvbGxvdyB0aGlzIHBhdHRlcm4uKQotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdENvbnRleHRSZWdpb246OnVwZGF0ZU1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0cmVnaW9uIHR5cGUgaXMgIiArIGZUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gY2FuSGFuZGxlID0gZmFsc2U7Ci0JCS8vIG5vdGU6IHdlJ2xsIGFsd2F5cyBoYW5kbGUgZGVsZXRlcyBmcm9tIHRoZXNlCi0JCS8vIHJlZ2lvbnMgLi4uIGlmIGl0cyBhbHJlYWR5IHRoYXQgcmVnaW9uLAotCQkvLyBkZWxldGluZyBzb21ldGhpbmcgZnJvbSBpdCB3b24ndCBjaGFuZ2UgaXRzCi0JCS8vIHR5cGUuIChyZW1lbWJlciwgdGhlIGNhbGxpbmcgcHJvZ3JhbSBuZWVkcwotCQkvLyB0byBpbnN1cmUgd2UgYXJlIG5vdCBjYWxsZWQsIGlmIG5vdCBhbGwgY29udGFpbmVkCi0JCS8vIG9uIG9uZSByZWdpb24uCi0JCWlmICgoY2hhbmdlcyA9PSBudWxsKSB8fCAoY2hhbmdlcy5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZGVsZXRlIGNhc2UKLQkJCS8vIFdlIGNhbiBub3QgZG8gdGhlIHF1aWNrIGRlbGV0ZSwgaWYKLQkJCS8vIGlmIGFsbCB0aGUgdGV4dCBpbiBhIHJlZ2lvbiBpcyB0byBiZSBkZWxldGVkLgotCQkJLy8gT3IsIGlmIHRoZSBkZWxldGUgc3RhcnRzIGluIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24uCi0JCQkvLyBJbiB0aGVzZSBjYXNlcywgYSByZXBhcnNlIGlzIG5lZWRlZC4KLQkJCS8vIE1pbm9yIG5vdGUsIHdlIHVzZSB0ZXh0RW5kLXN0YXJ0IHNpbmNlIGl0IGFsd2F5cwotCQkJLy8gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGVuZC1zdGFydC4gVGhpcyBtaWdodAotCQkJLy8gY2F1c2UgdXMgdG8gbWlzcyBhIGZldyBjYXNlcyB3ZSBjb3VsZCBoYXZlIGhhbmRsZWQsCi0JCQkvLyBidXQgd2lsbCBwcmV2ZW50IHVzIGZyb20gdHJ5aW5nIHRvIGhhbmRsZSBmdW5uaW5nIGNhc2VzCi0JCQkvLyBpbnZvbHZpbmcgd2hpdGVzcGFjZS4KLQkJCWlmICgoZlN0YXJ0ID49IGdldFRleHRFbmQoKSkgfHwgKE1hdGguYWJzKGxlbmd0aFRvUmVwbGFjZSkgPj0gZ2V0VGV4dEVuZCgpIC0gZ2V0U3RhcnQoKSkpIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgoUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHx8IFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNhbkhhbmRsZSkgewotCQkJLy8gYXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgaGF2ZSB0aGUgb2xkIHJlZ2lvbi4gV2Ugd29uJ3QgY3JlYXRlIGEKLQkJCS8vIG5ldyBpbnN0YW5jZSwgd2UnbGwganVzdCB1cGRhdGUgdGhlIG9uZSB3ZSBoYXZlLCBieSBjaGFuZ2luZwotCQkJLy8gaXRzIGVuZCBwb3N0aW9uLAotCQkJLy8gVGhlIHBhcmVudCBmbGF0bm9kZSwgdXBvbiByZXR1cm4sIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yIHVwZGF0aW5nIHNpYmxpbmcgcmVnaW9ucy4KLQkJCS8vIGFuZCBpbiB0dXJuLCB0aGUgc3RydWN0dXJlZERvY3VtZW50IGl0c2VsZiBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvcgotCQkJLy8gdXBkYXRpbmcgdGhlIHRleHQgc3RvcmUgYW5kIGRvd24gc3RyZWFtIGZsYXRub2Rlcy4KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlIGhhbmRsZWQgYnkgcmVnaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJCS8vIE5vdGU6IHdlIGFkanVzdCBib3RoIGVuZCBhbmQgdGV4dCBlbmQsIGJlY2F1c2UgZm9yIGFueSBjaGFuZ2UKLQkJCS8vIHRoYXQgaXMgaW4gb25seSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSByZWdpb24sIHdlIHNob3VsZCBub3QKLQkJCS8vIGRvIGEgcXVpY2sgY2hhbmdlLAotCQkJLy8gc28gJ2NhbkhhbmRsZScgc2hvdWxkIGhhdmUgYmVlbiBmYWxzZSBmb3IgdGhvc2UgY2FzZS4KLQkJCS8vIFRPX0RPX0ZVVFVSRTogY2FjaGUgdmFsdWUgb2YgY2FuSGFuZGxlQXNXaGl0ZVNwYWNlIGZyb20gYWJvdmUKLQkJCS8vIElmIHdlIGFyZSBoYW5kbGluZyBhcyB3aGl0ZXNwYWNlLCB0aGVyZSBpcyBubyBuZWVkIHRvIGluY3JlYXNlCi0JCQkvLyB0aGUgdGV4dCBsZW5ndGgsIG9ubHkKLQkJCS8vIHRoZSB0b3RhbCBsZW5ndGggaXMgY2hhbmdpbmcuCi0JCQlpZiAoIVJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJZlRleHRMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJCX0KLQkJCS8vIHVwZGF0ZSBsZW5ndGggKGFuZCBlbmQpIGFmdGVyIGFib3ZlIGNoZWNrIGZvciB3aGl0ZSBzcGFjZSwKLQkJCS8vIHNpbmNlCi0JCQkvLyBpdCBsb29rcyB0byBkZXRlcm1pbmUgaWYgYXQgZW5kIG9mIHJlZ2lvbi4KLQkJCWZMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQocGFyZW50LmdldFBhcmVudERvY3VtZW50KCksIHJlcXVlc3RlciwgcGFyZW50LCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0VtcHR5VGFnQ2xvc2VSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvRW1wdHlUYWdDbG9zZVJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzlkNjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvRW1wdHlUYWdDbG9zZVJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBFbXB0eVRhZ0Nsb3NlUmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXByaXZhdGUgaW50IGZMZW5ndGggPSAyOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAyOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRTsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQotCXB1YmxpYyBFbXB0eVRhZ0Nsb3NlUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBFbXB0eVRhZ0Nsb3NlUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JCWlmIChmVGV4dExlbmd0aCAhPSB0ZXh0TGVuZ3RoKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludmFsaWQgZm9yIHRoaXMgcmVnaW9uIHR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGZvciB0aGlzIHJlZ2lvbiB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9FbmRUYWdPcGVuUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0VuZFRhZ09wZW5SZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkNTU0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0VuZFRhZ09wZW5SZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIEVuZFRhZ09wZW5SZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOOwotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAyOwotCi0KLQlwdWJsaWMgRW5kVGFnT3BlblJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRW5kVGFnT3BlblJlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWlmIChmVGV4dExlbmd0aCAhPSB0ZXh0TGVuZ3RoKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludmFsaWQgZm9yIHRoaXMgcmVnaW9uIHR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyBFbmRUYWdPcGVuUmVnaW9uKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotLy8JCWZUZXh0TGVuZ3RoICs9IDE7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGZvciB0aGlzIHJlZ2lvbiB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotLy8JCWZUZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvR2VuZXJpY1RlbXBsYXRlUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0dlbmVyaWNUZW1wbGF0ZVJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjA2NGJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvR2VuZXJpY1RlbXBsYXRlUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkLCBpdHMganVzdCBwcmVzZW50IHRvIHNlcnZlciBhcyBhCi0gKiBnZW5lcmljIHN0YXJ0aW5nIHBvaW50IGZvciBhZGRpbmcgbmV3IHNwZWNpZmljIHJlZ2lvbiB0eXBlcy4KLSAqIAotICovCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljVGVtcGxhdGVSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0JLy8gc3BlY2lmeSBjb3JyZWN0IHR5cGUKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRDsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQotCi0JcHVibGljIEdlbmVyaWNUZW1wbGF0ZVJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY1RlbXBsYXRlUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHRMZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQlmVGV4dExlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZlRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9SZWdpb25Ub1N0cmluZ1V0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvUmVnaW9uVG9TdHJpbmdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNzgzZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9SZWdpb25Ub1N0cmluZ1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgUmVnaW9uVG9TdHJpbmdVdGlsIHsKLQlzdGF0aWMgcHVibGljIFN0cmluZyB0b1N0cmluZyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IHJlZ2lvbi5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHNob3J0Q2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZXN1bHQgPSBzaG9ydENsYXNzTmFtZSArICItLT4gIiArIHJlZ2lvbi5nZXRUeXBlKCkgKyAiOiAiICsgcmVnaW9uLmdldFN0YXJ0KCkgKyAiLSIgKyByZWdpb24uZ2V0VGV4dEVuZCgpICsgKHJlZ2lvbi5nZXRUZXh0RW5kKCkgIT0gcmVnaW9uLmdldEVuZCgpID8gKCIvIiArIHJlZ2lvbi5nZXRFbmQoKSkgOiAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkvLyBOT1RFOiBpZiB0aGUgZG9jdW1lbnQgaGVsZCBieSBhbnkgcmVnaW9uIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIHRoZQotCQkvLyByZWdpb24gb2Zmc2V0cyBoYXZlIG5vdAotCQkvLyB5ZXQgYmVlbiB1cGRhdGVkLCB0aGUgb3V0cHV0IGZyb20gdGhpcyBtZXRob2QgaW52YWxpZC4KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvUmVnaW9uVXBkYXRlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9SZWdpb25VcGRhdGVSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2N2QwOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9SZWdpb25VcGRhdGVSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLQotLyoqCi0gKiAKLSAqIFRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzIHRvIGNlbnRyYWxpemUgJ3JlZ2lvbicgdXBkYXRlLiBOb3RlOiBjYXJlIG11c3QgYmUKLSAqIHRha2VuIHRoYXQgaXMgaXMgbm90IHVzZWQgZm9yIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9yIGNvbnRhaW5lcgotICogcmVnaW9ucywgaXRzIG9ubHkgZm9yICJ0b2tlbiByZWdpb25zIgotICogIAotICovCi1wdWJsaWMgY2xhc3MgUmVnaW9uVXBkYXRlUnVsZSB7Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gYWxsTGV0dGVyT3JEaWdpdChTdHJpbmcgY2hhbmdlcykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkvLyBUT19ET19GVVRVUkU6IGNoZWNrIHRoYXQgYSBKYXZhIExldHRlciBvciBEaWdpdCBpcwotCQkJLy8gdGhlIHNhbWUgdGhpbmcgYXMgYW4gWE1MIGxldHRlciBvciBkaWdpdAotCQkJaWYgKCEoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjaGFuZ2VzLmNoYXJBdChpKSkpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gYWxsV2hpdGVTcGFjZShTdHJpbmcgY2hhbmdlcykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2hhbmdlcy5jaGFyQXQoaSkpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KElUZXh0UmVnaW9uIHJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBjYW5IYW5kbGVBc0xldHRlck9yRGlnaXQocmVnaW9uLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIE1ha2Ugc3VyZSB3ZSBhcmUgaW4gYSBub24td2hpdGUgc3BhY2UgYXJlYQotCQlpZiAoKHJlcXVlc3RTdGFydCA8PSAocGFyZW50LmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSkpICYmIChhbGxMZXR0ZXJPckRpZ2l0KGNoYW5nZXMpKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBjYW5IYW5kbGVBc0xldHRlck9yRGlnaXQoSVRleHRSZWdpb24gcmVnaW9uLCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBNYWtlIHN1cmUgd2UgYXJlIGluIGEgbm9uLXdoaXRlIHNwYWNlIGFyZWEKLQkJaWYgKChyZXF1ZXN0U3RhcnQgPD0gKHJlZ2lvbi5nZXRUZXh0RW5kKCkpKSAmJiAoYWxsTGV0dGVyT3JEaWdpdChjaGFuZ2VzKSkpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKElUZXh0UmVnaW9uIHJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIHdlIGRvbid0IGV4cGxlY3QgYSBudWxsIHBhcmVudCwgYnV0IGp1c3QgaW4gY2FzZSEKLQkJLy8gKGluIHdoaWNoIGNhc2UsIHdlIG11c3QgYmUgZGVhbGluZyB3aXRoIHJlZ2lvbnMgdGhhdCBhcmUKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50UmVnaW9ucykuCi0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBjYW5IYW5kbGVBc1doaXRlU3BhY2UocmVnaW9uLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGlmIHdlIGFyZSBpbiB0aGUgIndoaXRlIHNwYWNlIiBhcmVhIG9mIGEgcmVnaW9uLCB0aGVuCi0JCS8vIHdlIGRvbid0IHdhbnQgdG8gaGFuZGxlLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkvLyB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uIGlzIGNvbnNpZGVyIGFueXdoZXJlIHRoYXQgd291bGQKLQkJLy8gbGVhdmUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoaXMgY2hhcmFjdGVyIGFuZCB0aGUgdGV4dCBwYXJ0LgotCQkvLyBhbmQgb2YgY291cnNlLCB3ZSBjYW4gaW5zZXJ0IHdoaXRlc3BhY2UgaW4gd2hpdGVzcGFjZSByZWdpb24KLQkJLy8KLQkJLy8gaWYgdGhlcmUgaXMgbm8gd2hpdGVzcGFjZSBpbiB0aGlzIHJlZ2lvbiwgbm8gbmVlZCB0byBsb29rIGZ1cnRoZXIKLQkJaWYgKHJlZ2lvbi5nZXRFbmQoKSA+IHJlZ2lvbi5nZXRUZXh0RW5kKCkpIHsKLQkJCS8vIG5vIG5lZWQgdG8gYWRkIG9uZSB0byBlbmQgb2YgdGV4dCwgYXMgd2UgdXNlZCB0bywgc2luY2Ugd2UKLQkJCS8vIGNoYW5nZSBkZWZpbml0aW9uIG9mIGxlbmd0aCB0byBlcXVhdGUgdG8gb2Zmc2V0IHBsdXMgb25lLgotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTg2NgotCQkJLy8gd2F0Y2ggb3V0IGZvciB3aGl0ZXNwYWNlIGF0IGVuZCBvZiB0ZXh0Ci0JCQlpZiAocmVxdWVzdFN0YXJ0ID49IHBhcmVudC5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbikpIHsKLQkJCQkvLyBvaywgd2UgYXJlIGluIHRoZSB3aGl0ZXNwYWNlIHJlZ2lvbiwgc28gd2UgY2FuJ3QgaGFuZGxlLAotCQkJCS8vIHVubGVzcwotCQkJCS8vIHdlIGFyZSBqdXN0IGluc2VydGluZyB3aGl0ZXNwYWNlLgotCQkJCWlmIChhbGxXaGl0ZVNwYWNlKGNoYW5nZXMpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGNhbkhhbmRsZUFzV2hpdGVTcGFjZShJVGV4dFJlZ2lvbiByZWdpb24sIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGlmIHdlIGFyZSBpbiB0aGUgIndoaXRlIHNwYWNlIiBhcmVhIG9mIGEgcmVnaW9uLCB0aGVuCi0JCS8vIHdlIGRvbid0IHdhbnQgdG8gaGFuZGxlLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkvLyB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uIGlzIGNvbnNpZGVyIGFueXdoZXJlIHRoYXQgd291bGQKLQkJLy8gbGVhdmUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoaXMgY2hhcmFjdGVyIGFuZCB0aGUgdGV4dCBwYXJ0LgotCQkvLyBhbmQgb2YgY291cnNlLCB3ZSBjYW4gaW5zZXJ0IHdoaXRlc3BhY2UgaW4gd2hpdGVzcGFjZSByZWdpb24KLQkJLy8KLQkJLy8gaWYgdGhlcmUgaXMgbm8gd2hpdGVzcGFjZSBpbiB0aGlzIHJlZ2lvbiwgbm8gbmVlZCB0byBsb29rIGZ1cnRoZXIKLQkJaWYgKHJlZ2lvbi5nZXRFbmQoKSA+IHJlZ2lvbi5nZXRUZXh0RW5kKCkpIHsKLQkJCS8vIG5vIG5lZWQgdG8gYWRkIG9uZSB0byBlbmQgb2YgdGV4dCwgYXMgd2UgdXNlZCB0bywgc2luY2Ugd2UKLQkJCS8vIGNoYW5nZSBkZWZpbml0aW9uIG9mIGxlbmd0aCB0byBlcXVhdGUgdG8gb2Zmc2V0IHBsdXMgb25lLgotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTg2NgotCQkJLy8gd2F0Y2ggb3V0IGZvciB3aGl0ZXNwYWNlIGF0IGVuZCBvZiB0ZXh0Ci0JCQlpZiAocmVxdWVzdFN0YXJ0ID49IHJlZ2lvbi5nZXRUZXh0RW5kKCkpIHsKLQkJCQkvLyBvaywgd2UgYXJlIGluIHRoZSB3aGl0ZXNwYWNlIHJlZ2lvbiwgc28gd2UgY2FuJ3QgaGFuZGxlLAotCQkJCS8vIHVubGVzcwotCQkJCS8vIHdlIGFyZSBqdXN0IGluc2VydGluZyB3aGl0ZXNwYWNlLgotCQkJCWlmIChhbGxXaGl0ZVNwYWNlKGNoYW5nZXMpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gbmVlZCBhbiBhZGp1c3QgdGV4dCBsZW5ndGggQVBJIGJlZm9yZSB0aGlzIGNhbiBiZSB1c2VkCi0Jc3RhdGljIHB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVNb2RlbChJVGV4dFJlZ2lvbiByZWdpb24sIE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlSZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIHJlZ2lvbiBpcyBhbiBlYXN5IHR5cGUgKGUuZy4gYXR0cmlidXRlIHZhbHVlKSwKLQkJLy8gYW5kIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcyBhcmUgYWxsCi0JCS8vIGFscGhhbnVtZXJpYywgdGhlbiBtYWtlIHRoZSBjaGFuZ2UgaGVyZSBsb2NhbGx5LgotCQkvLyAoVGhpcyBjYW4gb2J2aW91c2x5IGJlIG1hZGUgbW9yZSBzb3BoaXN0aWNhdGVkIGFzIHRoZSBuZWVkIGFyaXNlcywKLQkJLy8gYnV0IHNob3VsZAotCQkvLyBhbHdheXMgZm9sbG93IHRoaXMgcGF0dGVybi4pCi0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0Q29udGV4dFJlZ2lvbjo6dXBkYXRlTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHRyZWdpb24gdHlwZSBpcyAiICsgcmVnaW9uLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIGNhbkhhbmRsZSA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdsbCBhbHdheXMgaGFuZGxlIGRlbGV0ZXMgZnJvbSB0aGVzZQotCQkvLyByZWdpb25zIC4uLiBpZiBpdHMgYWxyZWFkeSB0aGF0IHJlZ2lvbiwKLQkJLy8gZGVsZXRpbmcgc29tZXRoaW5nIGZyb20gaXQgd29uJ3QgY2hhbmdlIGl0cwotCQkvLyB0eXBlLiAocmVtZW1iZXIsIHRoZSBjYWxsaW5nIHByb2dyYW0gbmVlZHMKLQkJLy8gdG8gaW5zdXJlIHdlIGFyZSBub3QgY2FsbGVkLCBpZiBub3QgYWxsIGNvbnRhaW5lZAotCQkvLyBvbiBvbmUgcmVnaW9uLgotCQlpZiAoKGNoYW5nZXMgPT0gbnVsbCkgfHwgKGNoYW5nZXMubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGRlbGV0ZSBjYXNlCi0JCQkvLyBXZSBjYW4gbm90IGRvIHRoZSBxdWljayBkZWxldGUsIGlmCi0JCQkvLyBpZiBhbGwgdGhlIHRleHQgaW4gYSByZWdpb24gaXMgdG8gYmUgZGVsZXRlZC4KLQkJCS8vIE9yLCBpZiB0aGUgZGVsZXRlIHN0YXJ0cyBpbiB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uLgotCQkJLy8gSW4gdGhlc2UgY2FzZXMsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCQkvLyBNaW5vciBub3RlLCB3ZSB1c2UgdGV4dEVuZC1zdGFydCBzaW5jZSBpdCBhbHdheXMKLQkJCS8vIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQtc3RhcnQuIFRoaXMgbWlnaHQKLQkJCS8vIGNhdXNlIHVzIHRvIG1pc3MgYSBmZXcgY2FzZXMgd2UgY291bGQgaGF2ZSBoYW5kbGVkLAotCQkJLy8gYnV0IHdpbGwgcHJldmVudCB1cyBmcm9tIHRyeWluZyB0byBoYW5kbGUgZnVubmluZyBjYXNlcwotCQkJLy8gaW52b2x2aW5nIHdoaXRlc3BhY2UuCi0JCQlpZiAoKHJlZ2lvbi5nZXRTdGFydCgpID49IHJlZ2lvbi5nZXRUZXh0RW5kKCkpIHx8IChNYXRoLmFicyhsZW5ndGhUb1JlcGxhY2UpID49IHJlZ2lvbi5nZXRUZXh0RW5kKCkgLSByZWdpb24uZ2V0U3RhcnQoKSkpIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgoUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UocmVnaW9uLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgfHwgUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc0xldHRlck9yRGlnaXQocmVnaW9uLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmIChjYW5IYW5kbGUpIHsKLQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIGhhdmUgdGhlIG9sZCByZWdpb24uIFdlIHdvbid0IGNyZWF0ZSBhCi0JCQkvLyBuZXcgaW5zdGFuY2UsIHdlJ2xsIGp1c3QgdXBkYXRlIHRoZSBvbmUgd2UgaGF2ZSwgYnkgY2hhbmdpbmcKLQkJCS8vIGl0cyBlbmQgcG9zdGlvbiwKLQkJCS8vIFRoZSBwYXJlbnQgZmxhdG5vZGUsIHVwb24gcmV0dXJuLCBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvciB1cGRhdGluZyBzaWJsaW5nIHJlZ2lvbnMuCi0JCQkvLyBhbmQgaW4gdHVybiwgdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpdHNlbGYgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IKLQkJCS8vIHVwZGF0aW5nIHRoZSB0ZXh0IHN0b3JlIGFuZCBkb3duIHN0cmVhbSBmbGF0bm9kZXMuCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBoYW5kbGVkIGJ5IHJlZ2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkvLyBOb3RlOiB3ZSBhZGp1c3QgYm90aCBlbmQgYW5kIHRleHQgZW5kLCBiZWNhdXNlIGZvciBhbnkgY2hhbmdlCi0JCQkvLyB0aGF0IGlzIGluIG9ubHkgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVnaW9uLCB3ZSBzaG91bGQgbm90Ci0JCQkvLyBkbyBhIHF1aWNrIGNoYW5nZSwKLQkJCS8vIHNvICdjYW5IYW5kbGUnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UgZm9yIHRob3NlIGNhc2UuCi0JCQlyZWdpb24uYWRqdXN0TGVuZ3RoKGxlbmd0aERpZmZlcmVuY2UpOwotCQkJLy8gVE9fRE9fRlVUVVJFOiBjYWNoZSB2YWx1ZSBvZiBjYW5IYW5kbGVBc1doaXRlU3BhY2UgZnJvbSBhYm92ZQotCQkJLy8gSWYgd2UgYXJlIGhhbmRsaW5nIGFzIHdoaXRlc3BhY2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jcmVhc2UKLQkJCS8vIHRoZSB0ZXh0IGxlbmd0aCwgb25seQotCQkJLy8gdGhlIHRvdGFsIGxlbmd0aCBpcyBjaGFuZ2luZy4KLQkJCWlmICghUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UocmVnaW9uLCBwYXJlbnQsIGNoYW5nZXMsIHJlZ2lvbi5nZXRTdGFydCgpLCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJLy8JCQkJcmVnaW9uLmFkanVzdFRleHRMZW5ndGgobGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KHBhcmVudC5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIHBhcmVudCwgcmVnaW9uLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ0Nsb3NlUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ0Nsb3NlUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyN2FlNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdDbG9zZVJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBUYWdDbG9zZVJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlIGZMZW5ndGggPSAxOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAxOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRTsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQotCXB1YmxpYyBUYWdDbG9zZVJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGFnQ2xvc2VSZWdpb24oaW50IHN0YXJ0KSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGZvciB0aGlzIHJlZ2lvbiB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdOYW1lUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ05hbWVSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhiNTljNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ05hbWVSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgVGFnTmFtZVJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRTsKLQlwcml2YXRlIHNob3J0IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCXByaXZhdGUgc2hvcnQgZlRleHRMZW5ndGg7Ci0KLQotCXB1YmxpYyBUYWdOYW1lUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUYWdOYW1lUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHRMZW5ndGggPSAoc2hvcnQpIHRleHRMZW5ndGg7Ci0JCWZMZW5ndGggPSAoc2hvcnQpIGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gKHNob3J0KSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWZUZXh0TGVuZ3RoID0gKHNob3J0KSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdPcGVuUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ09wZW5SZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThjYjg1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ09wZW5SZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgVGFnT3BlblJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTjsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlIGZUZXh0TGVuZ3RoID0gMTsKLQotCi0JcHVibGljIFRhZ09wZW5SZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFRhZ09wZW5SZWdpb24oaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQl0aGlzKHN0YXJ0LCBsZW5ndGgpOwotCQlpZiAoZlRleHRMZW5ndGggIT0gdGV4dExlbmd0aCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGZvciB0aGlzIHJlZ2lvbiB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgVGFnT3BlblJlZ2lvbihpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLS8vCQlmVGV4dExlbmd0aCArPSAxOwotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCBmb3IgdGhpcyByZWdpb24gdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvV2hpdGVTcGFjZU9ubHlSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvV2hpdGVTcGFjZU9ubHlSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMwYmNjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1doaXRlU3BhY2VPbmx5UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFdoaXRlU3BhY2VPbmx5UmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAwOwotCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRTsKLQlwcm90ZWN0ZWQgaW50IGZMZW5ndGg7Ci0JcHJvdGVjdGVkIGludCBmU3RhcnQ7Ci0KLQlwdWJsaWMgV2hpdGVTcGFjZU9ubHlSZWdpb24oaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgcG9zaXRpb24pIHsKLQotCQlyZXR1cm4gZlN0YXJ0IDw9IHBvc2l0aW9uICYmIHBvc2l0aW9uIDwgZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCA9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ID0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0TGVuZ3RoKHNob3J0IGkpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludmFsaWQgY2FsbCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGNhbGwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogRm9yIHRoaXMgSVRleHRSZWdpb24gdHlwZSwgdGhlIHN0YXJ0IG11c3QgaW4gdGVybXMgb2Ygd2hhdCB0aGUgcmVnaW9uCi0JICogZXhwZWN0cyAuLi4gdGhhdCBpcywgaXRzIG5vdCBkb2N1bWVudCBvZmZzZXQsIGJ1dCBzdGFydCByZWxhdGl2ZSB0bwotCSAqIHdoYXQgZXZlciBjb250YWlucyBpdC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBpZiB0aGUgcmVnaW9uIGlzIGFuIGVhc3kgdHlwZSAoZS5nLiBhdHRyaWJ1dGUgdmFsdWUpLAotCQkvLyBhbmQgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIGFyZSBhbGwKLQkJLy8gYWxwaGFudW1lcmljLCB0aGVuIG1ha2UgdGhlIGNoYW5nZSBoZXJlIGxvY2FsbHkuCi0JCS8vIChUaGlzIGNhbiBvYnZpb3VzbHkgYmUgbWFkZSBtb3JlIHNvcGhpc3RpY2F0ZWQgYXMgdGhlIG5lZWQgYXJpc2VzLAotCQkvLyBidXQgc2hvdWxkCi0JCS8vIGFsd2F5cyBmb2xsb3cgdGhpcyBwYXR0ZXJuLikKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRDb250ZXh0UmVnaW9uOjp1cGRhdGVNb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdHJlZ2lvbiB0eXBlIGlzICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIGNhbkhhbmRsZSA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdsbCBhbHdheXMgaGFuZGxlIGRlbGV0ZXMgZnJvbSB0aGVzZQotCQkvLyByZWdpb25zIC4uLiBpZiBpdHMgYWxyZWFkeSB0aGF0IHJlZ2lvbiwKLQkJLy8gZGVsZXRpbmcgc29tZXRoaW5nIGZyb20gaXQgd29uJ3QgY2hhbmdlIGl0cwotCQkvLyB0eXBlLiAocmVtZW1iZXIsIHRoZSBjYWxsaW5nIHByb2dyYW0gbmVlZHMKLQkJLy8gdG8gaW5zdXJlIHdlIGFyZSBub3QgY2FsbGVkLCBpZiBub3QgYWxsIGNvbnRhaW5lZAotCQkvLyBvbiBvbmUgcmVnaW9uLgotCQlpZiAoKGNoYW5nZXMgPT0gbnVsbCkgfHwgKGNoYW5nZXMubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGRlbGV0ZSBjYXNlCi0JCQkvLyBXZSBjYW4gbm90IGRvIHRoZSBxdWljayBkZWxldGUsIGlmCi0JCQkvLyBpZiBhbGwgdGhlIHRleHQgaW4gYSByZWdpb24gaXMgdG8gYmUgZGVsZXRlZC4KLQkJCS8vIE9yLCBpZiB0aGUgZGVsZXRlIHN0YXJ0cyBpbiB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uLgotCQkJLy8gSW4gdGhlc2UgY2FzZXMsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCQkvLyBNaW5vciBub3RlLCB3ZSB1c2UgdGV4dEVuZC1zdGFydCBzaW5jZSBpdCBhbHdheXMKLQkJCS8vIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQtc3RhcnQuIFRoaXMgbWlnaHQKLQkJCS8vIGNhdXNlIHVzIHRvIG1pc3MgYSBmZXcgY2FzZXMgd2UgY291bGQgaGF2ZSBoYW5kbGVkLAotCQkJLy8gYnV0IHdpbGwgcHJldmVudCB1cyBmcm9tIHRyeWluZyB0byBoYW5kbGUgZnVubmluZyBjYXNlcwotCQkJLy8gaW52b2x2aW5nIHdoaXRlc3BhY2UuCi0JCQlpZiAoKGZTdGFydCA+PSBnZXRUZXh0RW5kKCkpIHx8IChNYXRoLmFicyhsZW5ndGhUb1JlcGxhY2UpID49IGdldFRleHRFbmQoKSAtIGdldFN0YXJ0KCkpKSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfQotCi0JCX0KLQkJUmVnaW9uQ2hhbmdlZEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKGNhbkhhbmRsZSkgewotCQkJLy8gYXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgaGF2ZSB0aGUgb2xkIHJlZ2lvbi4gV2Ugd29uJ3QgY3JlYXRlIGEKLQkJCS8vIG5ldyBpbnN0YW5jZSwgd2UnbGwganVzdCB1cGRhdGUgdGhlIG9uZSB3ZSBoYXZlLCBieSBjaGFuZ2luZwotCQkJLy8gaXRzIGVuZCBwb3N0aW9uLAotCQkJLy8gVGhlIHBhcmVudCBmbGF0bm9kZSwgdXBvbiByZXR1cm4sIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yIHVwZGF0aW5nIHNpYmxpbmcgcmVnaW9ucy4KLQkJCS8vIGFuZCBpbiB0dXJuLCB0aGUgc3RydWN0dXJlZERvY3VtZW50IGl0c2VsZiBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvcgotCQkJLy8gdXBkYXRpbmcgdGhlIHRleHQgc3RvcmUgYW5kIGRvd24gc3RyZWFtIGZsYXRub2Rlcy4KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlIGhhbmRsZWQgYnkgcmVnaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJCS8vIE5vdGU6IHdlIGFkanVzdCBib3RoIGVuZCBhbmQgdGV4dCBlbmQsIGJlY2F1c2UgZm9yIGFueSBjaGFuZ2UKLQkJCS8vIHRoYXQgaXMgaW4gb25seSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSByZWdpb24sIHdlIHNob3VsZCBub3QKLQkJCS8vIGRvIGEgcXVpY2sgY2hhbmdlLAotCQkJLy8gc28gJ2NhbkhhbmRsZScgc2hvdWxkIGhhdmUgYmVlbiBmYWxzZSBmb3IgdGhvc2UgY2FzZS4KLQkJCWZMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQotCQkJcmVzdWx0ID0gbmV3IFJlZ2lvbkNoYW5nZWRFdmVudChwYXJlbnQuZ2V0UGFyZW50RG9jdW1lbnQoKSwgcmVxdWVzdGVyLCBwYXJlbnQsIHRoaXMsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTENEYXRhVGV4dFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxDRGF0YVRleHRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNkYTk4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTENEYXRhVGV4dFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFhNTENEYXRhVGV4dFJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUOwotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCXByaXZhdGUgaW50IGZUZXh0TGVuZ3RoOwotCi0KLQlwdWJsaWMgWE1MQ0RhdGFUZXh0UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBYTUxDRGF0YVRleHRSZWdpb24oaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dExlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkvLyBUT0RPOiBzaG91bGRuJ3QgY2RhdGEgYmUgbGlrZSBYTUwgQ29udGVudCAuLi4gbGVuZ3RoIGFuZCB0ZXh0Ci0JCS8vIGxlbmd0aAotCQkvLyBhbHdheXMgYmUgdGhlIHNhbWUsIHJlZ2FyZGxlc3Mgb2Ygd2hpdGVzcGFjZT8KLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gVE9ETzogdGhpcyBpcyBhIHByZXR0eSBsYW1lIG1ldGhvZCwgc2luY2UgWE1MIENEYXRhIHJlZ2lvbiBjYW4gaGF2ZQotCQkvLyBhIG11Y2gKLQkJLy8gYmV0dGVyIHJ1bGUgZm9yIHJlZ2lvbiB1cGRhdGUsIGJ1dCB0aGlzIGlzIHdoYXQgcHJldmlvdXMKLQkJLy8gKHVuZmFjdG9yZWQpCi0JCS8vIHZlcnNpb24gaGFkLCBzbyBJJ2xsIGNhcnJ5IGl0IG92ZXIsIG9mIG5vdy4KLQkJUmVnaW9uQ2hhbmdlZEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIHRoZSByZWdpb24gaXMgYW4gZWFzeSB0eXBlIChlLmcuIGF0dHJpYnV0ZSB2YWx1ZSksCi0JCS8vIGFuZCB0aGUgcmVxdWVzdGVkIGNoYW5nZXMgYXJlIGFsbAotCQkvLyBhbHBoYW51bWVyaWMsIHRoZW4gbWFrZSB0aGUgY2hhbmdlIGhlcmUgbG9jYWxseS4KLQkJLy8gKFRoaXMgY2FuIG9idmlvdXNseSBiZSBtYWRlIG1vcmUgc29waGlzdGljYXRlZCBhcyB0aGUgbmVlZCBhcmlzZXMsCi0JCS8vIGJ1dCBzaG91bGQKLQkJLy8gYWx3YXlzIGZvbGxvdyB0aGlzIHBhdHRlcm4uKQotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdENvbnRleHRSZWdpb246OnVwZGF0ZU1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0cmVnaW9uIHR5cGUgaXMgIiArIGZUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gY2FuSGFuZGxlID0gZmFsc2U7Ci0JCS8vIG5vdGU6IHdlJ2xsIGFsd2F5cyBoYW5kbGUgZGVsZXRlcyBmcm9tIHRoZXNlCi0JCS8vIHJlZ2lvbnMgLi4uIGlmIGl0cyBhbHJlYWR5IHRoYXQgcmVnaW9uLAotCQkvLyBkZWxldGluZyBzb21ldGhpbmcgZnJvbSBpdCB3b24ndCBjaGFuZ2UgaXRzCi0JCS8vIHR5cGUuIChyZW1lbWJlciwgdGhlIGNhbGxpbmcgcHJvZ3JhbSBuZWVkcwotCQkvLyB0byBpbnN1cmUgd2UgYXJlIG5vdCBjYWxsZWQsIGlmIG5vdCBhbGwgY29udGFpbmVkCi0JCS8vIG9uIG9uZSByZWdpb24uCi0JCWlmICgoY2hhbmdlcyA9PSBudWxsKSB8fCAoY2hhbmdlcy5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZGVsZXRlIGNhc2UKLQkJCS8vIFdlIGNhbiBub3QgZG8gdGhlIHF1aWNrIGRlbGV0ZSwgaWYKLQkJCS8vIGlmIGFsbCB0aGUgdGV4dCBpbiBhIHJlZ2lvbiBpcyB0byBiZSBkZWxldGVkLgotCQkJLy8gT3IsIGlmIHRoZSBkZWxldGUgc3RhcnRzIGluIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24uCi0JCQkvLyBJbiB0aGVzZSBjYXNlcywgYSByZXBhcnNlIGlzIG5lZWRlZC4KLQkJCS8vIE1pbm9yIG5vdGUsIHdlIHVzZSB0ZXh0RW5kLXN0YXJ0IHNpbmNlIGl0IGFsd2F5cwotCQkJLy8gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGVuZC1zdGFydC4gVGhpcyBtaWdodAotCQkJLy8gY2F1c2UgdXMgdG8gbWlzcyBhIGZldyBjYXNlcyB3ZSBjb3VsZCBoYXZlIGhhbmRsZWQsCi0JCQkvLyBidXQgd2lsbCBwcmV2ZW50IHVzIGZyb20gdHJ5aW5nIHRvIGhhbmRsZSBmdW5uaW5nIGNhc2VzCi0JCQkvLyBpbnZvbHZpbmcgd2hpdGVzcGFjZS4KLQkJCWlmICgoZlN0YXJ0ID49IGdldFRleHRFbmQoKSkgfHwgKE1hdGguYWJzKGxlbmd0aFRvUmVwbGFjZSkgPj0gZ2V0VGV4dEVuZCgpIC0gZ2V0U3RhcnQoKSkpIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgoUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHx8IFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9Ci0KLQkJfQotCQlpZiAoY2FuSGFuZGxlKSB7Ci0JCQkvLyBhdCB0aGlzIHBvaW50LCB3ZSBzdGlsbCBoYXZlIHRoZSBvbGQgcmVnaW9uLiBXZSB3b24ndCBjcmVhdGUgYQotCQkJLy8gbmV3IGluc3RhbmNlLCB3ZSdsbCBqdXN0IHVwZGF0ZSB0aGUgb25lIHdlIGhhdmUsIGJ5IGNoYW5naW5nCi0JCQkvLyBpdHMgZW5kIHBvc3Rpb24sCi0JCQkvLyBUaGUgcGFyZW50IGZsYXRub2RlLCB1cG9uIHJldHVybiwgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IgdXBkYXRpbmcgc2libGluZyByZWdpb25zLgotCQkJLy8gYW5kIGluIHR1cm4sIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXRzZWxmIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yCi0JCQkvLyB1cGRhdGluZyB0aGUgdGV4dCBzdG9yZSBhbmQgZG93biBzdHJlYW0gZmxhdG5vZGVzLgotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2UgaGFuZGxlZCBieSByZWdpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaW50IGxlbmd0aERpZmZlcmVuY2UgPSBVdGlsaXRpZXMuY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShjaGFuZ2VzLCBsZW5ndGhUb1JlcGxhY2UpOwotCQkJLy8gTm90ZTogd2UgYWRqdXN0IGJvdGggZW5kIGFuZCB0ZXh0IGVuZCwgYmVjYXVzZSBmb3IgYW55IGNoYW5nZQotCQkJLy8gdGhhdCBpcyBpbiBvbmx5IHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIHJlZ2lvbiwgd2Ugc2hvdWxkIG5vdAotCQkJLy8gZG8gYSBxdWljayBjaGFuZ2UsCi0JCQkvLyBzbyAnY2FuSGFuZGxlJyBzaG91bGQgaGF2ZSBiZWVuIGZhbHNlIGZvciB0aG9zZSBjYXNlLgotCQkJLy8gVE9fRE9fRlVUVVJFOiBjYWNoZSB2YWx1ZSBvZiBjYW5IYW5kbGVBc1doaXRlU3BhY2UgZnJvbSBhYm92ZQotCQkJLy8gSWYgd2UgYXJlIGhhbmRsaW5nIGFzIHdoaXRlc3BhY2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jcmVhc2UKLQkJCS8vIHRoZSB0ZXh0IGxlbmd0aCwgb25seQotCQkJLy8gdGhlIHRvdGFsIGxlbmd0aCBpcyBjaGFuZ2luZy4KLQkJCWlmICghUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQlmVGV4dExlbmd0aCArPSBsZW5ndGhEaWZmZXJlbmNlOwotCQkJfQotCQkJZkxlbmd0aCArPSBsZW5ndGhEaWZmZXJlbmNlOwotCQkJcmVzdWx0ID0gbmV3IFJlZ2lvbkNoYW5nZWRFdmVudChwYXJlbnQuZ2V0UGFyZW50RG9jdW1lbnQoKSwgcmVxdWVzdGVyLCBwYXJlbnQsIHRoaXMsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTENvbnRlbnRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MQ29udGVudFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTA4OGRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MQ29udGVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgWE1MQ29udGVudFJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UOwotCS8vIGxlbmd0aCBhbmQgdGV4dExlbmd0aCBhcmUgYWx3YXlzIHRoZSBzYW1lIGZvciBjb250ZW50IHJlZ2lvbgotCS8vcHJpdmF0ZSBpbnQgZlRleHRMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQotCXB1YmxpYyBYTUxDb250ZW50UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBYTUxDb250ZW50UmVnaW9uKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gVE9ETzogdGhpcyBpcyBhIHByZXR0eSBsYW1lIG1ldGhvZCwgc2luY2UgWE1MIENvbnRlbnQgY2FuIGhhdmUgYQotCQkvLyBtdWNoCi0JCS8vIGJldHRlciBydWxlIGZvciByZWdpb24gdXBkYXRlLCBidXQgdGhpcyBpcyB3aGF0IHByZXZpb3VzCi0JCS8vICh1bmZhY3RvcmVkKQotCQkvLyB2ZXJzaW9uIGhhZCwgc28gSSdsbCBjYXJyeSBpdCBvdmVyLCBvZiBub3cuCi0JCVJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB0aGUgcmVnaW9uIGlzIGFuIGVhc3kgdHlwZSAoZS5nLiBhdHRyaWJ1dGUgdmFsdWUpLAotCQkvLyBhbmQgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIGFyZSBhbGwKLQkJLy8gYWxwaGFudW1lcmljLCB0aGVuIG1ha2UgdGhlIGNoYW5nZSBoZXJlIGxvY2FsbHkuCi0JCS8vIChUaGlzIGNhbiBvYnZpb3VzbHkgYmUgbWFkZSBtb3JlIHNvcGhpc3RpY2F0ZWQgYXMgdGhlIG5lZWQgYXJpc2VzLAotCQkvLyBidXQgc2hvdWxkCi0JCS8vIGFsd2F5cyBmb2xsb3cgdGhpcyBwYXR0ZXJuLikKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRDb250ZXh0UmVnaW9uOjp1cGRhdGVNb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdHJlZ2lvbiB0eXBlIGlzICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIGNhbkhhbmRsZSA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdsbCBhbHdheXMgaGFuZGxlIGRlbGV0ZXMgZnJvbSB0aGVzZQotCQkvLyByZWdpb25zIC4uLiBpZiBpdHMgYWxyZWFkeSB0aGF0IHJlZ2lvbiwKLQkJLy8gZGVsZXRpbmcgc29tZXRoaW5nIGZyb20gaXQgd29uJ3QgY2hhbmdlIGl0cwotCQkvLyB0eXBlLiAocmVtZW1iZXIsIHRoZSBjYWxsaW5nIHByb2dyYW0gbmVlZHMKLQkJLy8gdG8gaW5zdXJlIHdlIGFyZSBub3QgY2FsbGVkLCBpZiBub3QgYWxsIGNvbnRhaW5lZAotCQkvLyBvbiBvbmUgcmVnaW9uLgotCQlpZiAoKGNoYW5nZXMgPT0gbnVsbCkgfHwgKGNoYW5nZXMubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGRlbGV0ZSBjYXNlCi0JCQkvLyBXZSBjYW4gbm90IGRvIHRoZSBxdWljayBkZWxldGUsIGlmCi0JCQkvLyBpZiBhbGwgdGhlIHRleHQgaW4gYSByZWdpb24gaXMgdG8gYmUgZGVsZXRlZC4KLQkJCS8vIE9yLCBpZiB0aGUgZGVsZXRlIHN0YXJ0cyBpbiB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uLgotCQkJLy8gSW4gdGhlc2UgY2FzZXMsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCQkvLyBNaW5vciBub3RlLCB3ZSB1c2UgdGV4dEVuZC1zdGFydCBzaW5jZSBpdCBhbHdheXMKLQkJCS8vIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQtc3RhcnQuIFRoaXMgbWlnaHQKLQkJCS8vIGNhdXNlIHVzIHRvIG1pc3MgYSBmZXcgY2FzZXMgd2UgY291bGQgaGF2ZSBoYW5kbGVkLAotCQkJLy8gYnV0IHdpbGwgcHJldmVudCB1cyBmcm9tIHRyeWluZyB0byBoYW5kbGUgZnVubmluZyBjYXNlcwotCQkJLy8gaW52b2x2aW5nIHdoaXRlc3BhY2UuCi0JCQlpZiAoKGZTdGFydCA+PSBnZXRUZXh0RW5kKCkpIHx8IChNYXRoLmFicyhsZW5ndGhUb1JlcGxhY2UpID49IGdldFRleHRFbmQoKSAtIGdldFN0YXJ0KCkpKSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB8fCBSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdCh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfQotCi0JCX0KLQkJaWYgKGNhbkhhbmRsZSkgewotCQkJLy8gYXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgaGF2ZSB0aGUgb2xkIHJlZ2lvbi4gV2Ugd29uJ3QgY3JlYXRlIGEKLQkJCS8vIG5ldyBpbnN0YW5jZSwgd2UnbGwganVzdCB1cGRhdGUgdGhlIG9uZSB3ZSBoYXZlLCBieSBjaGFuZ2luZwotCQkJLy8gaXRzIGVuZCBwb3N0aW9uLAotCQkJLy8gVGhlIHBhcmVudCBmbGF0bm9kZSwgdXBvbiByZXR1cm4sIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yIHVwZGF0aW5nIHNpYmxpbmcgcmVnaW9ucy4KLQkJCS8vIGFuZCBpbiB0dXJuLCB0aGUgc3RydWN0dXJlZERvY3VtZW50IGl0c2VsZiBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvcgotCQkJLy8gdXBkYXRpbmcgdGhlIHRleHQgc3RvcmUgYW5kIGRvd24gc3RyZWFtIGZsYXRub2Rlcy4KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlIGhhbmRsZWQgYnkgcmVnaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJCS8vIE5vdGU6IHdlIGFkanVzdCBib3RoIGVuZCBhbmQgdGV4dCBlbmQsIGJlY2F1c2UgZm9yIGFueSBjaGFuZ2UKLQkJCS8vIHRoYXQgaXMgaW4gb25seSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSByZWdpb24sIHdlIHNob3VsZCBub3QKLQkJCS8vIGRvIGEgcXVpY2sgY2hhbmdlLAotCQkJLy8gc28gJ2NhbkhhbmRsZScgc2hvdWxkIGhhdmUgYmVlbiBmYWxzZSBmb3IgdGhvc2UgY2FzZS4KLQkJCWZMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJCS8vIFRPX0RPX0ZVVFVSRTogY2FjaGUgdmFsdWUgb2YgY2FuSGFuZGxlQXNXaGl0ZVNwYWNlIGZyb20gYWJvdmUKLQkJCS8vIElmIHdlIGFyZSBoYW5kbGluZyBhcyB3aGl0ZXNwYWNlLCB0aGVyZSBpcyBubyBuZWVkIHRvIGluY3JlYXNlCi0JCQkvLyB0aGUgdGV4dCBsZW5ndGgsIG9ubHkKLQkJCS8vIHRoZSB0b3RhbCBsZW5ndGggaXMgY2hhbmdpbmcuCi0JCQkvLyBkb24ndCBuZWVkIGZvciBjb250ZW50IHJlZ2lvbgotCQkJLy8JCQlpZiAoIVJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIGNoYW5nZXMsCi0JCQkvLyBmU3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCS8vCQkJCWZUZXh0TGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQkvLwkJCX0KLQkJCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQocGFyZW50LmdldFBhcmVudERvY3VtZW50KCksIHJlcXVlc3RlciwgcGFyZW50LCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxIZWFkUGFyc2VyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxIZWFkUGFyc2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGRmM2VhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MSGVhZFBhcnNlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIFhNTEhlYWRQYXJzZXJGYWN0b3J5IHsKLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyB0ZXh0KSB7Ci0JCUlUZXh0UmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0JCS8vCQlpZiAoY29udGV4dCA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCW5ld1JlZ2lvbiA9IG5ldyBYTUxIZWFkUGFyc2VyUmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgsIHRleHQpOwotCQkvLwkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MSGVhZFBhcnNlclJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxIZWFkUGFyc2VyUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOTE3YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxIZWFkUGFyc2VyUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkLCBpdHMganVzdCBwcmVzZW50IHRvIHNlcnZlciBhcyBhCi0gKiBnZW5lcmljIHN0YXJ0aW5nIHBvaW50IGZvciBhZGRpbmcgbmV3IHNwZWNpZmljIHJlZ2lvbiB0eXBlcy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgWE1MSGVhZFBhcnNlclJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIFN0cmluZyBmVGV4dDsKLQlwcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQkvLyBzcGVjaWZ5IGNvcnJlY3QgdHlwZQotCXByaXZhdGUgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0KLQlwdWJsaWMgWE1MSGVhZFBhcnNlclJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgWE1MSGVhZFBhcnNlclJlZ2lvbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcygpOwotCQlmVHlwZSA9IGNvbnRleHQ7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dExlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JCWZUZXh0ID0gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gMTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWZUZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MUGFyc2VyUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxQYXJzZXJSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MWY0NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxQYXJzZXJSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiAKLSAqIFRoaXMgcmVnaW9uIGZhY3RvcnkgaXMgdmVyeSBzcGVjaWZpYyB0byB0aGUgcGFyc2VyIG91dHB1dCwgYW5kIHRoZSBzcGVjaWZpYwotICogaW1wbGVtZW50YXRpb24gY2xhc3NlcyBmb3IgdmFyaW91cyByZWdpb25zLgotICovCi0KLXB1YmxpYyBjbGFzcyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihJVGV4dFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQsIFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHBhcmVudCwgY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKElUZXh0UmVnaW9uQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyBsYW5nLCBTdHJpbmcgc3Vycm91bmRpbmdUYWcpIHsKLQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCS8vIG5ld1JlZ2lvbi5zZXRQYXJlbnQocGFyZW50KTsKLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoLCBTdHJpbmcgbGFuZywgU3RyaW5nIHN1cnJvdW5kaW5nVGFnKSB7Ci0JCUlUZXh0UmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0JCWlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBYTUxDRGF0YVRleHRSZWdpb24oc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgWE1MQ29udGVudFJlZ2lvbihzdGFydCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgVGFnTmFtZVJlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJbmV3UmVnaW9uID0gbmV3IEF0dHJpYnV0ZU5hbWVSZWdpb24oc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJbmV3UmVnaW9uID0gbmV3IEF0dHJpYnV0ZUVxdWFsc1JlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBBdHRyaWJ1dGVWYWx1ZVJlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgVGFnT3BlblJlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJbmV3UmVnaW9uID0gbmV3IEVuZFRhZ09wZW5SZWdpb24oc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBUYWdDbG9zZVJlZ2lvbihzdGFydCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBFbXB0eVRhZ0Nsb3NlUmVnaW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gRE9NUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRSkgewotCQkJbmV3UmVnaW9uID0gbmV3IFdoaXRlU3BhY2VPbmx5UmVnaW9uKHN0YXJ0LCBsZW5ndGgpOwotCQl9Ci0JCWVsc2UKLQkJLy8gcmVtb3ZlZCB0aGlzIGNvbmRpdGlvbiBkdXJpbmcgdHJhbnNpdGlvbiwgYW5kIGltcGxlbWVudGVkIGluCi0JCS8vIHN1YmNsYXNzCi0JCS8vIGlmIChjb250ZXh0ID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSB7Ci0JCS8vIG5ld1JlZ2lvbiA9IG5ldyBKU1BDb2RlUmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQkvLyB9IGVsc2UKLQkJaWYgKGNvbnRleHQgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgRm9yZWlnblJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJCSgoRm9yZWlnblJlZ2lvbikgbmV3UmVnaW9uKS5zZXRTdXJyb3VuZGluZ1RhZyhzdXJyb3VuZGluZ1RhZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgQ29udGV4dFJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDUwZjlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gWzIwNTk4OV0gLSBbdmFsaWRhdGlvbl0gdmFsaWRhdGUgWE1MIGFmdGVyIFhJbmNsdWRlIHJlc29sdXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgWE1MIENvcmUgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIFhNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0KLQkJLy8gZm9ybWF0dGluZyBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgsIDcyKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTLCBmYWxzZSk7Ci0JCW5vZGUucHV0KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUiwgWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIpOwotCQlub2RlLnB1dEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUsIDEpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUywgZmFsc2UpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BTElHTl9FTkRfQlJBQ0tFVCwgZmFsc2UpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5QUkVTRVJWRV9DREFUQUNPTlRFTlQsIGZhbHNlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0VfQkVGT1JFX0VNUFRZX0NMT1NFX1RBRywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9DT01NRU5UX1RFWFQsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfQ09NTUVOVF9KT0lOX0xJTkVTLCB0cnVlKTsKLQkJLy8gY2xlYW51cCBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTLCB0cnVlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFLCB0cnVlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMsIGZhbHNlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuRklYX1hNTF9ERUNMQVJBVElPTiwgdHJ1ZSk7Ci0KLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VULCAiVVRGLTgiKTsvLyROT04tTkxTLTEkCi0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkVORF9PRl9MSU5FX0NPREUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHRoaXMgY291bGQgYmUgbWFkZSBzbWFydGVyIGJ5IGFjdHVhbGx5IGxvb2tpbmcgdXAgdGhlIGNvbnRlbnQKLQkJLy8gdHlwZSdzIHZhbGlkIGV4dGVuc2lvbnMKLQkJbm9kZS5wdXQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTiwgInhtbCIpOyAvLyROT04tTkxTLTEkCi0KLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuV0FSTl9OT19HUkFNTUFSLCB0cnVlKTsKLQkJLy8gMSA9IElNYXJrZXIuU0VWRVJJVFlfV0FSTklORwotCQlub2RlLnB1dEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklORElDQVRFX05PX0dSQU1NQVIsIDEpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VU0VfWElOQ0xVREUsIGZhbHNlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TLCB0cnVlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ01ET0NVTUVOVF9HTE9CQUxfQ0FDSEVfRU5BQkxFRCwgdHJ1ZSk7Ci0JCQotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NQVJLVVBfVkFMSURBVElPTiwgZmFsc2UpOwotCQlub2RlLnB1dEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9IQVNfTk9fVkFMVUUsIDIpOwotCQlub2RlLnB1dEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVORF9UQUdfV0lUSF9BVFRSSUJVVEVTLCAyKTsKLQkJbm9kZS5wdXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX1NUQVJUX1RBRywgMik7Ci0JCW5vZGUucHV0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTUlTU0lOR19FTkRfVEFHLCAyKTsKLQkJbm9kZS5wdXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX1RBR19OQU1FLCAyKTsKLQkJbm9kZS5wdXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX1FVT1RFUywgMik7Ci0JCW5vZGUucHV0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTUlTU0lOR19DTE9TSU5HX0JSQUNLRVQsIDIpOwotCQlub2RlLnB1dEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLk1JU1NJTkdfQ0xPU0lOR19RVU9URSwgMik7Ci0JCW5vZGUucHV0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTkFNRVNQQUNFX0lOX1BJX1RBUkdFVCwgMik7Ci0JCW5vZGUucHV0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuV0hJVEVTUEFDRV9BVF9TVEFSVCwgMik7Ci0JCW5vZGUucHV0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuV0hJVEVTUEFDRV9CRUZPUkVfVEFHTkFNRSwgMik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBmNTk3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBbMjA1OTg5XSAtIFt2YWxpZGF0aW9uXSB2YWxpZGF0ZSBYTUwgYWZ0ZXIgWEluY2x1ZGUgcmVzb2x1dGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0KLS8qKgotICogQ29tbW9uIHByZWZlcmVuY2Uga2V5cyB1c2VkIGJ5IFhNTCBjb3JlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29yZVByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBYTUxDb3JlUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBlbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIHVzZXJzIGNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGV4dGVuc2lvbiB0byB1c2Ugd2hlbiBub25lIGlzIHNwZWNpZmllZCBpbiB0aGUgTmV3IEZpbGUKLQkgKiBXaXphcmQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYVEVOU0lPTiA9ICJkZWZhdWx0RXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiBUaGUgbWF4aW11bSB3aWR0aCBvZiBhIGxpbmUgYmVmb3JlIGEgbGluZSBzcGxpdCBpcyBuZWVkZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9XSURUSCA9ICJsaW5lV2lkdGgiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiBhbGwgYmxhbmtzIGxpbmVzIHNob3VsZCBiZSBjbGVhcmVkIGR1cmluZyBmb3JtYXR0aW5nLgotCSAqIEJsYW5rIGxpbmVzIHdpbGwgYmUga2VwdCB3aGVuIGZhbHNlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSX0FMTF9CTEFOS19MSU5FUyA9ICJjbGVhckFsbEJsYW5rTGluZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgI0lOREVOVEFUSU9OX0NIQVIgZm9yIDEgaW5kZW50YXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UQVRJT05fU0laRSA9ICJpbmRlbnRhdGlvblNpemUiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjaGFyYWN0ZXIgdXNlZCBmb3IgaW5kZW50YXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge1RBQiwgU1BBQ0V9Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVEFUSU9OX0NIQVIgPSAiaW5kZW50YXRpb25DaGFyIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UgI0lOREVOVEFUSU9OX0NIQVIuIEluZGljYXRlcyB0byB1c2UKLQkgKiB0YWIgY2hhcmFjdGVyIHdoZW4gZm9ybWF0dGluZy4KLQkgKiAKLQkgKiBAc2VlICNTUEFDRQotCSAqIEBzZWUgI0lOREVOVEFUSU9OX0NIQVIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUIgPSAidGFiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlICNJTkRFTlRBVElPTl9DSEFSLiBJbmRpY2F0ZXMgdG8gdXNlCi0JICogc3BhY2UgY2hhcmFjdGVyIHdoZW4gZm9ybWF0dGluZy4KLQkgKiAKLQkgKiBAc2VlICNUQUIKLQkgKiBAc2VlICNJTkRFTlRBVElPTl9DSEFSCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0UgPSAic3BhY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgdGFncyB3aXRoIG11bHRpcGxlIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZAotCSAqIChzcGxpdHRpbmcgZWFjaCBhdHRyIG9uIGEgbmV3IGxpbmUpLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQTElUX01VTFRJX0FUVFJTID0gInNwbGl0TXVsdGlBdHRycyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGNsZWFudXAgcHJvY2Vzc29yIHNob3VsZCBmb3JtYXQgc291cmNlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9TT1VSQ0UgPSAiZm9ybWF0U291cmNlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgZW1wdHkgZWxlbWVudHMgc2hvdWxkIGJlIGNvbXByZXNzZWQgZHVyaW5nCi0JICogY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MgPSAiY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gaW5zZXJ0IHJlcXVpcmVkIGF0dHJpYnV0ZXMgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUX1JFUVVJUkVEX0FUVFJTID0gImluc2VydFJlcXVpcmVkQXR0cnMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbnNlcnQgbWlzc2luZyB0YWdzIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVF9NSVNTSU5HX1RBR1MgPSAiaW5zZXJ0TWlzc2luZ1RhZ3MiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBxdW90ZSBhbGwgYXR0cmlidXRlIHZhbHVlcyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVU9URV9BVFRSX1ZBTFVFUyA9ICJxdW90ZUF0dHJWYWx1ZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbnNlcnQgbWlzc2luZyBYTUwgZGVjbGFyYXRpb25zIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklYX1hNTF9ERUNMQVJBVElPTiA9ICJmaXhYTUxEZWNsYXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBjb252ZXJ0IGFsbCBsaW5lIGRlbGltaXRlcnMgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogQGRlcHJlY2F0ZWQgLSBubyBsb25nZXIgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRfRU9MX0NPREVTID0gImNvbnZlcnRFT0xDb2RlcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBsaW5lIGRlbGltaXRlciB0byB1c2UgZHVyaW5nIGNsZWFudXAgaWYgY29udmVydGluZyBsaW5lCi0JICogZGVsaW1pdGVycy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7Q1IsIENSTEYsIExGLCBOT19UUkFOU0xBVElPTn0KLQkgKiA8L3A+Ci0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9FT0xfQ09ERSA9ICJjbGVhbnVwRU9MQ29kZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGEgd2FybmluZyBzaG91bGQgYmUgcHJvZHVjZWQgd2hlbiB2YWxpZGF0aW5nIGEKLQkgKiBmaWxlIHRoYXQgc3BlY2lmaWVzIG5vdCBncmFtbWFyLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7VFJVRSwgRkFMU0V9Ci0JICogPC9wPgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTl9OT19HUkFNTUFSID0gIndhcm5Ob0dyYW1tYXIiOy8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgYSBtZXNzYWdlIHNob3VsZCBiZSBwcm9kdWNlZCB3aGVuIHZhbGlkYXRpbmcgYQotCSAqIGZpbGUgdGhhdCBzcGVjaWZpZXMgbm90IGdyYW1tYXIuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5pbnRlZ2VyPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHswLCAxLCAyfSAobm9uZSwgd2FybmluZywgZXJyb3IpCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElORElDQVRFX05PX0dSQU1NQVIgPSAiaW5kaWNhdGVOb0dyYW1tYXIiOy8vJE5PTi1OTFMtMSQKLQotIAkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgeGluY2x1ZGVzIHNob3VsZCBiZSBwcm9jZXNzZWQgYmVmb3JlCi0JICogdmFsaWRhdGlvbi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge1RSVUUsIEZBTFNFfQotCSAqIDwvcD4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfWElOQ0xVREUgPSAieGluY2x1ZGUiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiBhbGwgd2hpdGVzcGFjZSBpbiB0YWdzIHdpdGggQ0RBVEEgY29udGVudCBzaG91bGQgYmUKLQkgKiBwcmVzZXJ2ZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFU0VSVkVfQ0RBVEFDT05URU5UID0gInByZXNlcnZlQ0RBVEFDb250ZW50IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgZW5kIGJyYWNrZXRzIG9mIHN0YXJ0IHRhZ3Mgc2hvdWxkIGJlIHBsYWNlZCBvbiBhIG5ldyBsaW5lCi0JICogaWYgdGhlIHN0YXJ0IHRhZyBzcGFucyBtb3JlIHRoYW4gb25lIGxpbmUuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fRU5EX0JSQUNLRVQgPSAiYWxpZ25FbmRCcmFja2V0IjsvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIGFuIGVtcHR5IGNsb3NlIHRhZyBzaG91bGQgaGF2ZSBhIHNwYWNlIGluc2VydGVkIGJlZm9yZQotCSAqIGNsb3NpbmcuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRV9CRUZPUkVfRU1QVFlfQ0xPU0VfVEFHID0gInNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZyI7Ly8kTk9OLU5MUy0xJAotCQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhbGwgc2NoZW1hIGxvY2F0aW9ucyBmb3IgWFNEIHNob3VsZCBiZSBob25vdXJlZAotICAgICAqIGR1cmluZyBYU0QgdmFsaWRhdGlvbiBvZiBYTUwuCi0gICAgICogPHA+Ci0gICAgICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi48YnIgLz4KLSAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6IHtUUlVFLCBGQUxTRX0KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TID0gImhvbm91ckFsbFNjaGVtYUxvY2F0aW9ucyI7Ly8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBjb250ZW50IG9mIGNvbW1lbnRzIHNob3VsZCBiZSBmb3JtYXR0ZWQKLSAgICAgKiA8cD4KLSAgICAgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+PGJyIC8+Ci0gICAgICogUG9zc2libGUgdmFsdWVzOiB7VFJVRSwgRkFMU0V9Ci0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9DT01NRU5UX1RFWFQgPSAiZm9ybWF0Q29tbWVudFRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGxpbmVzIG9mIGNvbW1lbnRzIHNob3VsZCBiZSBqb2luZWQgd2hlbiBmb3JtYXR0aW5nCi0gICAgICogPHA+Ci0gICAgICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9DT01NRU5UX0pPSU5fTElORVMgPSAiZm9ybWF0Q29tbWVudEpvaW5MaW5lcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgQ01Eb2N1bWVudHMgc2hvdWxkIGJlIGdsb2JhbGx5IGNhY2hlZAotICAgICAqIDxwPgotICAgICAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTURPQ1VNRU5UX0dMT0JBTF9DQUNIRV9FTkFCTEVEID0gImNtRG9jdW1lbnRHbG9iYWxDYWNoZUVuYWJsZWQiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IE1hcmtVcFZhbGlkYXRvciBzaG91bGQgcnVuIGFzIHBhcnQgb2YgWE1sIFZhbGlkYXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtUUlVFLCBGQUxTRX0gCi0JICogPC9wPgotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktVUF9WQUxJREFUSU9OID0gIm1hcmt1cFZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGEgbWVzc2FnZSBzaG91bGQgYmUgcHJvZHVjZWQgd2hlbiB2YWxpZGF0aW5nIGEKLQkgKiBmaWxlIHRoYXQgc3BlY2lmaWVzIGZvbGxvd2luZyBjb25kaXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5pbnRlZ2VyPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHswLCAxLCAyfSAobm9uZSwgd2FybmluZywgZXJyb3IpCi0JICogPC9wPgotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9IQVNfTk9fVkFMVUUgPSAiYXR0cmlidXRlSGFzTm9WYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfVEFHX1dJVEhfQVRUUklCVVRFUyA9ICJlbmRUYWdXaXRoQXR0cmlidXRlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSElURVNQQUNFX0JFRk9SRV9UQUdOQU1FID0gIndoaXRlc3BhY2VCZWZvcmVUYWdOYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfQ0xPU0lOR19CUkFDS0VUID0gIm1pc3NpbmdDbG9zaW5nQnJhY2tldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX0NMT1NJTkdfUVVPVEUgPSAibWlzc2luZ0Nsb3NpbmdRdW90ZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX0VORF9UQUcgPSAibWlzc2luZ0VuZFRhZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1NUQVJUX1RBRyA9ICJtaXNzaW5nU3RhcnRUYWciOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19RVU9URVMgPSAibWlzc2luZ1F1b3RlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfSU5fUElfVEFSR0VUID0gIm5hbWVzcGFjZUluUElUYXJnZXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19UQUdfTkFNRSA9ICJtaXNzaW5nVGFnTmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSElURVNQQUNFX0FUX1NUQVJUID0gIndoaXRlc3BhY2VBdFN0YXJ0IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm9wYWdhdGUvUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvcGFnYXRlL1Byb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNzZkNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm9wYWdhdGUvUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci0KLQotLyoqCi0gKiBUaGUgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeSBpcyBwYXJ0IG9mIHRoZSAiYWRhcHQgb24gY3JlYXRlIiBtZWNoYW5pc20uIEEKLSAqIFByb3BhZ2F0aW5nQWRhcHRlciwgb25jZSBhZGRlZCB0byBhIG5vZGUsIHdpbGwgY2F1c2UgcHJvYWdhdGluZyBhZGFwdGVycyB0bwotICogYmUgY3JlYXRlZCBmb3IgYWxsIGNoaWxkIG5vZGVzLiBBIHNpZGUgZWZmZWN0IG9mIGNyZWF0aW5nIGEKLSAqIFByb3BhZ2F0aW5nQWRhcHRlciBmb3IgYSBub2RlIGlzIHRoYXQgaXMgaXMgYWxzbyBjcmVhdGVzIGFkYXB0ZXJzIGZvciBhbmQKLSAqIGFkYXB0cyB0aGUgTm9kZSBmb3IgYWxsIG90aGVyIHJlZ2lzdGVyZWQgJ2NyZWF0ZSBvbiBhZGFwdCcgQWRhcHRlcnMuIFRoaXMKLSAqIG90aGVyIGFkYXB0ZXJzIGFyZSByZWdpc3RlcmVkIGJ5IHJlZ2lzdGVyaW5nIHRoZWlyIGZhY3RvcmllcyB2aWEgcGx1Z2luCi0gKiBleHRlbnNpb24gcG9pbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbCBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgUHJvcGFnYXRpbmdBZGFwdGVyIGZBZGFwdGVySW5zdGFuY2U7Ci0JcHJpdmF0ZSBMaXN0IGZDb250cmlidXRlZEZhY3RvcmllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKCkgewotCQl0aGlzKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsgLy8gLAotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDb250cmlidXRlZEZhY3RvcmllcyhJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJaWYgKGZDb250cmlidXRlZEZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQlmQ29udHJpYnV0ZWRGYWN0b3JpZXMuYWRkKGZhY3RvcnkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVBZGFwdGVyIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQkvLyBldmVyeSBub3RpZmllciBnZXQncyBvbmUgb2YgdGhlc2UKLQkJLy8gKGFuZCB0aGUgc2FtZSBpbnN0YW5jZSBvZiBpdCkKLQkJcmV0dXJuIGdldEFkYXB0ZXJJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXJJbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBQcm9wYWdhdGluZ0FkYXB0ZXIKLQkgKi8KLQlwcml2YXRlIFByb3BhZ2F0aW5nQWRhcHRlciBnZXRBZGFwdGVySW5zdGFuY2UoKSB7Ci0JCWlmIChmQWRhcHRlckluc3RhbmNlID09IG51bGwpIHsKLQkJCWZBZGFwdGVySW5zdGFuY2UgPSBuZXcgUHJvcGFnYXRpbmdBZGFwdGVySW1wbCgpOwotCQkJaWYgKGZDb250cmlidXRlZEZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmQ29udHJpYnV0ZWRGYWN0b3JpZXMuc2l6ZSgpOyBpKyspCi0JCQkJCWZBZGFwdGVySW5zdGFuY2UuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkoKFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkpIGZDb250cmlidXRlZEZhY3Rvcmllcy5nZXQoaSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmQWRhcHRlckluc3RhbmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIGdpdmUgdGhlIGFkYXB0ZXIgaW5zdGFuY2UgYSBjaGFuY2UgdG8gcmVsZWFzZSBpdHMgZmFjdG9yaWVzCi0JCWdldEFkYXB0ZXJJbnN0YW5jZSgpLnJlbGVhc2UoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRyaWJ1dGVkRmFjdG9yaWVzKEFycmF5TGlzdCBsaXN0KSB7Ci0JCWZDb250cmlidXRlZEZhY3RvcmllcyA9IGxpc3Q7Ci0KLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IGNsb25lZEluc3RhbmNlID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKGdldEFkYXB0ZXJLZXkoKSwgaXNTaG91bGRSZWdpc3RlckFkYXB0ZXIoKSk7Ci0JCS8vIGNsb25lIHRoaXMgYWRhcHRlcnMgc3BlY2lmaWMgbGlzdCBvZiBhZGFwdGVyIGZhY3RvcmllcyB0b28KLQkJaWYgKGZDb250cmlidXRlZEZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQkKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkNvbnRyaWJ1dGVkRmFjdG9yaWVzLml0ZXJhdG9yKCk7Ci0JCQljbG9uZWRJbnN0YW5jZS5zZXRDb250cmlidXRlZEZhY3RvcmllcyhuZXcgQXJyYXlMaXN0KCkpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZXhpc3RpbmdGYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQljbG9uZWRJbnN0YW5jZS5hZGRDb250cmlidXRlZEZhY3RvcmllcyhleGlzdGluZ0ZhY3RvcnkuY29weSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2xvbmVkSW5zdGFuY2U7Ci0JfQotCi0JCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvcGFnYXRlL1Byb3BhZ2F0aW5nQWRhcHRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvcGFnYXRlL1Byb3BhZ2F0aW5nQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4MTU5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3BhZ2F0ZS9Qcm9wYWdhdGluZ0FkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvcGFnYXRlOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBQcm9wYWdhdGluZ0FkYXB0ZXJJbXBsIGltcGxlbWVudHMgUHJvcGFnYXRpbmdBZGFwdGVyIHsKLQotCXByaXZhdGUgTGlzdCBhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzID0gbnVsbDsKLQotCS8qKgotCSAqIEFic3RyYWN0UHJvcGFnYXRpbmdBZGFwdGVySW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBQcm9wYWdhdGluZ0FkYXB0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGFwdE9uQ3JlYXRlKElET01Ob2RlIG5vZGUpIHsKLQkJLy8gZ2l2ZSBlYWNoIG9mIHRoZSBmYWN0b3JpZXMgYSBjaGFuY2UgdG8gYWRhcHQgdGhlIG5vZGUsIGlmIGl0Ci0JCS8vIGNob29zZXMgdG8KLQkJaWYgKGFkYXB0T25DcmVhdGVGYWN0b3JpZXMgIT0gbnVsbCkgewotCi0KLQkJCXN5bmNocm9uaXplZCAoYWRhcHRPbkNyZWF0ZUZhY3RvcmllcykgewotCQkJCWludCBsZW5ndGggPSBhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzLmdldChpKTsKLQkJCQkJZmFjdG9yeS5hZGFwdChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZWNoYW5pc20gY2FuIGJlIG1hZGUgImVhc2llciB0byB1c2UiIGxhdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQlnZXRBZGFwdE9uQ3JlYXRlRmFjdG9yaWVzKCkuYWRkKGZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0T25DcmVhdGVGYWN0b3JpZXMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0T25DcmVhdGVGYWN0b3JpZXMoKSB7Ci0JCWlmIChhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzID09IG51bGwpCi0JCQlhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gYWRhcHRPbkNyZWF0ZUZhY3RvcmllczsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgUHJvcGFnYXRpbmdBZGFwdGVyI2luaXRpYWxpemVGb3JGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnksCi0JICogICAgICBJTm9kZU5vdGlmaWVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGb3JGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgSU5vZGVOb3RpZmllciBub2RlKSB7Ci0JCS8vIElTU1VFOiB3ZSBhcmUgYSBET00gc3BlY2lmaWMgaW1wbGltZW50YXRpb24sIAotCQkvLyB3ZSBzaG91bGQgbm90IGJlLgotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJRE9NTm9kZSB4bWxOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkJcHJvcGFnYXRlVG8oeG1sTm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUuZXF1YWxzKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW50ZXJlc3RpbmcoT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiAobmV3VmFsdWUgIT0gbnVsbCAmJiAobmV3VmFsdWUgaW5zdGFuY2VvZiBFbGVtZW50IHx8IG5ld1ZhbHVlIGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgbmV3VmFsdWUgaW5zdGFuY2VvZiBEb2N1bWVudFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJLy8gSXNzdWU6IFdlIG9ubHkgcHJvcGFnYXRlIHRvIEVsZW1lbnRzIC4uLgotCQkvLyBub3QgYXR0cmlidXRlcyB0b28hIFdlIHNob3VsZCBjYXJlZnVsIGNvbnNpZGVyIGRvbmluZyBhbGwgd2hlbgotCQkvLyB3aGVuIHdlIGltcHJvdmUgImFkYXB0IG9uIGNyZWF0ZSIgZGVzaWduLgotCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQUREICYmIGlzSW50ZXJlc3RpbmcobmV3VmFsdWUpKSB7Ci0JCQlwcm9wYWdhdGVUbygoSURPTU5vZGUpIG5ld1ZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9wYWdhdGVUbyhJRE9NTm9kZSBub2RlKSB7Ci0JCS8vIGdldCBhZGFwdGVyIHRvIGVuc3VyZSBpdHMgY3JlYXRlZAotCQlub2RlLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJYWRhcHRPbkNyZWF0ZShub2RlKTsKLQkJcHJvcGFnYXRlVG9DaGlsZHJlbihub2RlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvcGFnYXRlVG9DaGlsZHJlbihJRE9NTm9kZSBwYXJlbnQpIHsKLQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlwcm9wYWdhdGVUbygoSURPTU5vZGUpIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgUHJvcGFnYXRpbmdBZGFwdGVyI3JlbGVhc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzICE9IG51bGwpIHsKLQotCQkJc3luY2hyb25pemVkIChhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzKSB7Ci0JCQkJaW50IGxlbmd0aCA9IGFkYXB0T25DcmVhdGVGYWN0b3JpZXMuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGFkYXB0T25DcmVhdGVGYWN0b3JpZXMuZ2V0KGkpOwotCQkJCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MQ2hhckVudGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MQ2hhckVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWZiNDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVhNTENoYXJFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLQotCi0vKioKLSAqIFhNTCBOYW1lc3BhY2UgY29uc3RhbnRzCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElYTUxDaGFyRW50aXR5IHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFNUF9OQU1FID0gImFtcCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQU1QX1JFRiA9ICImYW1wOyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQU1QX1ZBTFVFID0gIiYiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFQT1NfTkFNRSA9ICJhcG9zIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBUE9TX1JFRiA9ICImYXBvczsiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFQT1NfVkFMVUUgPSAiJyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR1RfTkFNRSA9ICJndCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR1RfUkVGID0gIiZndDsiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEdUX1ZBTFVFID0gIj4iOy8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTFRfTkFNRSA9ICJsdCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTFRfUkVGID0gIiZsdDsiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIExUX1ZBTFVFID0gIjwiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFFVT1RfTkFNRSA9ICJxdW90IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBRVU9UX1JFRiA9ICImcXVvdDsiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFFVT1RfVkFMVUUgPSAiXCIiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVhNTE5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwODQ3ZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0KLQotLyoqCi0gKiBYTUwgTmFtZXNwYWNlIGNvbnN0YW50cwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJWE1MTmFtZXNwYWNlIHsKLQotCVN0cmluZyBYTUxOUyA9ICJ4bWxucyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxOU19QUkVGSVggPSAieG1sbnM6IjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTE5TX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUwgPSAieG1sIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9QUkVGSVggPSAieG1sOiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfVVJJID0gImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lYTUxQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0OWQ0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lYTUxQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogS2V5cyB0byB1c2UgZm9yIHByZWZlcmVuY2Ugc2V0dGluZ3MuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVhNTFByZWZlcmVuY2VOYW1lcyB7Ci0JU3RyaW5nIENMRUFOVVBfQVRUUl9OQU1FX0NBU0UgPSAiY2xlYW51cEF0dHJOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDTEVBTlVQX0VPTF9DT0RFID0gImNsZWFudXBFT0xDb2RlIjsvLyROT04tTkxTLTEkCi0JLy8gY2xlYW51cCBwcmVmZXJlbmNlIG5hbWVzCi0JU3RyaW5nIENMRUFOVVBfVEFHX05BTUVfQ0FTRSA9ICJjbGVhbnVwVGFnTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09OVkVSVF9FT0xfQ09ERVMgPSAiY29udmVydEVPTENvZGVzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZPUk1BVF9TT1VSQ0UgPSAiZm9ybWF0U291cmNlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIElOU0VSVF9NSVNTSU5HX1RBR1MgPSAiaW5zZXJ0TWlzc2luZ1RhZ3MiOy8vJE5PTi1OTFMtMSQKLQotCS8vIG90aGVycwotCVN0cmluZyBMQVNUX0FDVElWRV9QQUdFID0gImxhc3RBY3RpdmVQYWdlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFFVT1RFX0FUVFJfVkFMVUVTID0gInF1b3RlQXR0clZhbHVlcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBub3QgdXNlZCBmb3Igbm93IC8vIGhpZ2hsaWdodGluZyB0eXBlcyBTdHJpbmcgQ09NTUVOVF9CT1JERVIgPQotCSAqICJjb21tZW50Qm9yZGVyIjsvLyROT04tTkxTLTEkIFN0cmluZyBDT01NRU5UX1RFWFQgPQotCSAqICJjb21tZW50VGV4dCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgQ0RBVEFfQk9SREVSID0KLQkgKiAiY2RhdGFCb3JkZXIiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIENEQVRBX1RFWFQgPQotCSAqICJjZGF0YVRleHQiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIFBJX0JPUkRFUiA9ICJwaUJvcmRlciI7Ly8kTk9OLU5MUy0xJAotCSAqIFN0cmluZyBQSV9DT05URU5UID0gInBpQ29udGVudCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgVEFHX0JPUkRFUiA9Ci0JICogInRhZ0JvcmRlciI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgVEFHX05BTUUgPSAidGFnTmFtZSI7Ly8kTk9OLU5MUy0xJAotCSAqIFN0cmluZyBUQUdfQVRUUklCVVRFX05BTUUgPSAidGFnQXR0cmlidXRlTmFtZSI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcKLQkgKiBUQUdfQVRUUklCVVRFX1ZBTFVFID0gInRhZ0F0dHJpYnV0ZVZhbHVlIjsvLyROT04tTkxTLTEkIFN0cmluZwotCSAqIERFQ0xfQk9SREVSID0gImRlY2xCb2RlciI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgRE9DVFlQRV9OQU1FID0KLQkgKiAiZG9jdHlwZU5hbWUiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIERPQ1RZUEVfRVhURVJOQUxfSUQgPQotCSAqICJkb2N0eXBlRXh0ZXJuYWxJZCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYgPQotCSAqICJkb2N0eXBlRXh0ZXJuYWxQdWJyZWYiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIERPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGID0KLQkgKiAiZG9jdHlwZUV4dHJlbmFsU3lzcmVmIjsvLyROT04tTkxTLTEkIFN0cmluZyBYTUxfQ09OVEVOVCA9Ci0JICogInhtbENvbnRlbnQiOy8vJE5PTi1OTFMtMSQgLy8gaGlnaGxpZ2h0aW5nIHByZWZlcmVuY2VzIFN0cmluZyBDT01NQSA9Ci0JICogIiwiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIENPTE9SID0gImNvbG9yIjsvLyROT04tTkxTLTEkIFN0cmluZyBOQU1FID0KLQkgKiAibmFtZSI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgRk9SRUdST1VORCA9ICJmb3JlZ3JvdW5kIjsvLyROT04tTkxTLTEkCi0JICogU3RyaW5nIEJBQ0tHUk9VTkQgPSAiYmFja2dyb3VuZCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgQk9MRCA9Ci0JICogImJvbGQiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIElUQUxJQyA9ICJpdGFsaWMiOy8vJE5PTi1OTFMtMSQKLQkgKi8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTmFtZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9OYW1lVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NmJlYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9OYW1lVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTDEwTmFtZXM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBjb25zaXN0ZW50IHdheSB0byBwcmUtY2hlY2sgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBYTUwKLSAqIG5hbWUsIGJlZm9yZSwgZm9yIGV4YW1wbGUsIHRyeWluZyB0byBhY3R1YWxseSBjcmVhdGUgYW4gRWxlbWVudCB3aXRoIGl0LgotICogQXR0ZW1wdGluZyB0byBjcmVhdGUgYW4gRWxlbWVudCB3aXRoIGFuIGludmFsaWQgbmFtZSB3aWxsIHRocm93IHRoZSBhcHByb3ByaWF0ZQotICogRE9NIEV4Y2VwdGlvbiwgYnV0IG9mdGVuIGNsaWVudHMgd2FudCB0byBjaGVjayB0aGUgdmFsaWRpdGluZyBvZiBhIG5hbWUKLSAqIHN1Y2ggYXMgYmFzZWQgb24gc29tZSB1c2VyIGlucHV0LCBsb25nIGluIGFkdmFuY2Ugb2YgYWN0dWFsbHkgbWFraW5nIAotICogdGhlIERPTSBjYWxsLiBBbmQsIG5hdHVhbGx5LCB3YW50IHRvIGdpdmUgdGhlIHVzZXIgZmVlZGJhY2sgaW4gYSBtb3JlIAotICogdGltZWx5IGZhc2hpb24uCi0gKiAKLSAqIElTU1VFOiBpcyAiZW5kbnM6IiByZWFsbHkgdmFsaWQgeG1sIG5hbWU/IEkgdGhpbmsgbm90LCBidXQgdGhpcyBtZXRob2QKLSAqIChjdXJyZW50bHkpIHNheXMgaXQgaXMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTmFtZVZhbGlkYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBYTUwxME5hbWVzIHhtbDEwY2hhckNoZWNrZXIgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIDxjb2RlPm5hbWU8L2NvZGU+IGlzIHZhbGlkIFhNTCBuYW1lIGFjY29yZGluZyB0byBYTUwKLQkgKiAxLjAgcnVsZXMsIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgbmFtZSBpcyB0aGUgc3RyaW5nIHRvIHRlc3QKLQkgKiBAcmV0dXJuIHRydWUgaWYgdmFsaWQgbmFtZSBhY2NvcmRpbmcgdG8gWE1MIDEuMCBydWxlcywgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgbmFtZSkgewotCi0JCWlmICh4bWwxMGNoYXJDaGVja2VyID09IG51bGwpIHsKLQkJCXhtbDEwY2hhckNoZWNrZXIgPSBpbml0aXRhaWxpemVYTUwxME5hbWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHhtbDEwY2hhckNoZWNrZXIuaXNWYWxpZFhNTDEwTmFtZShuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBYTUwxME5hbWVzIGluaXRpdGFpbGl6ZVhNTDEwTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgWE1MMTBOYW1lcygoUmVhZGVyKSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3QgaW50ZW50ZWRlZCB0byBiZSBpbnN0YW50aWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBOYW1lVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NNRG9jVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Eb2NUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OWNlZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Eb2NUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jVHlwZSB7Ci0JLyoqCi0JICogQ0hUTUwgZmlsZXMKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDSFRNTF9ET0NfVFlQRSA9ICJDSFRNTCI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEhUTUwgZmlsZXMKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBIVE1MX0RPQ19UWVBFID0gIkhUTUwiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBIVE1MNSBmaWxlcwotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhUTUw1X0RPQ19UWVBFID0gIkhUTUw1IjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogSlNQIDEuMSBmaWxlcyAoY3VycmVudGx5IGluY2x1ZGVzIDEuMiBlbGVtZW50cyBmb3IgYmFja3dhcmQgYmVoYXZpb3JhbCBjb21wYXRpYmlsaXR5KQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTUDExX0RPQ19UWVBFID0gIkpTUDExIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogSlNQIDEuMiBmaWxlcwotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTUDEyX0RPQ19UWVBFID0gIkpTUDEyIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogSlNQIDIuMCBKU1AgZmlsZXMKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKU1AyMF9ET0NfVFlQRSA9ICJKU1AyMCI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEpTUCAyLjAgVGFnIGZpbGVzCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHMjBfRE9DX1RZUEUgPSAiSlNQMjAuVEFHIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogSlNQIDIuMSBKU1AgZmlsZXMKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKU1AyMV9ET0NfVFlQRSA9ICJKU1AyMSI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudFRyYWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRUcmFja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YmFhNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudFRyYWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi0KLS8qKgotICogUG9zaXRpb24gZGVwZW5kZW50IENNRG9jdW1lbnQgdHJhY2tlci4gQSB0cmFja2VyIG1hdGNoZXMgYQotICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB3aXRoIGEgQ01Eb2N1bWVudCB0aGF0IGl0IGVuYWJsZXMgYWxsb3dpbmcgZm9yCi0gKiBwb3NpdGlvbi1kZXBlbmRlbnQgY29udGVudCBtb2RlbHMKLSAqLwotcHVibGljIGludGVyZmFjZSBDTURvY3VtZW50VHJhY2tlciB7Ci0KLQlDTURvY3VtZW50IGdldERvY3VtZW50KCk7Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVXcmFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTc1ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Ob2RlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ01Ob2RlV3JhcHBlciBleHRlbmRzIENNTm9kZSB7Ci0JQ01Ob2RlIGdldE9yaWdpbk5vZGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2ODExZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9Db250ZW50TW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQ29udGVudE1vZGVsQWRhcHRlciBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZW50TW9kZWxBZGFwdGVyIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBnZXRDTURvY3VtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01Eb2N1bWVudAotCSAqIEBwYXJhbSBub3RpZmVyCi0JICogCi0JICogUmV0dXJucyBDTURvY3VtZW50IGFzc29jaWF0ZWQgdG8gdGhlIGFkYXB0aW5nIG5vZGUuIEZvciBleGFtcGwgOiBIVE1MCi0JICogQ01Eb2N1bWVudCBpcyBhc3NvY2lhdGVkIHRvIEhUTUwgRG9jdW1lbnQgbm9kZSwgRFREIENNRG9jdW1lbnQgaXMKLQkgKiBhc3NvY2lhdGVkIHRvIERvY3VtZW50VHlwZSBub2RlLCBEVEQvU2NoZW1hIENNRG9jdW1lbnQgaXMgYXNzb2NpYXRlZCB0bwotCSAqIEVsZW1lbnQgbm9kZSAoc29tZXRpbWUgd2l0aCBuYW1lc3BhY2UpLCBhbmQgdGFnbGliIENNRG9jdW1lbnQgaXMKLQkgKiBhc3NvY2lhdGVkIHRvIHRhZ2xpYiBkaXJlY3RpdmUgRWxlbWVudCBub2RlLgotCSAqIAotCSAqIElOb2RlTm90aWZpZXIgaXMgcGFzc2VkIGZvciBzdGF0ZWxlc3MgKHNpbmdsZXRvbikgSU5vZGVBZGFwdGVyCi0JICogaW1wbGVtZW50YXRpb24uCi0JICovCi0JQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyIG5vdGlmaWVyKTsKLQotCS8qKgotCSAqIGdldERlY2xhcmF0aW9uIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIG5vdGlmZXIKLQkgKiAKLQkgKiBSZXR1cm5zIEVsZW1lbnREZWZpbml0aW9uIG9yIEF0dHJpYnV0ZURlZmluaXRpb24gZm9yIHRoZSBhZGFwdGluZyBub2RlLgotCSAqIAotCSAqIElOb2RlTm90aWZpZXIgaXMgcGFzc2VkIGZvciBzdGF0ZWxlc3MgKHNpbmdsZXRvbikgSU5vZGVBZGFwdGVyCi0JICogaW1wbGVtZW50YXRpb24uCi0JICovCi0JQ01Ob2RlIGdldERlY2xhcmF0aW9uKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyIG5vdGlmaWVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL051bGxDb250ZW50TW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL051bGxDb250ZW50TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIyZWU2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9OdWxsQ29udGVudE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBpbnRpYWxpemUgc3BlY2lmaWMgdmFyaWFibGVzIHRoYXQgbmVlZCBhIGNvbnRlbnQKLSAqIG1vZGVsLCB1bnRpbCB0aGUgdHJ1ZSBjb250ZW50IG1vZGVsIGlzIGF2YWlsYWJsZS4gVGhpcyBwcmV2ZW50cyBoYXZpbmcgdG8KLSAqIGRvIGxvdHMgb2YgbnVsbCBjaGVja3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsQ29udGVudE1vZGVsIGltcGxlbWVudHMgQ01Eb2N1bWVudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOdWxsQ01OYW1lZE5vZGVNYXAgaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCB7Ci0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJCXJldHVybiBuZXcgTnVsbEl0ZXJhdG9yKCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE51bGxJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQkJcHVibGljIE51bGxJdGVyYXRvcigpIHsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW4gbm90IHJlbW92ZSByZWdpb25zIHZpYSBpdGVyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JfQotCi0JcHVibGljIE51bGxDb250ZW50TW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gbmV3IE51bGxDTU5hbWVkTm9kZU1hcCgpOwotCX0KLQotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJcmV0dXJuIG5ldyBOdWxsQ01OYW1lZE5vZGVNYXAoKTsKLQl9Ci0KLQlwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2MzYTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzLCB3aXRoIGl0cyBmZXcgZmllbGQsIGlzIGEgY29udmllbmNlIHRvIHByb3ZpZGUgY29tcGlsZS10aW1lCi0gKiBzYWZldHkgd2hlbiByZWZlcmluZyB0byBhIGNvbnRlbnRUeXBlIElELiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkCi0gKiBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluIHBsdWdpbi54bWwgZmlsZS4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLWZpbmFsIHB1YmxpYyBjbGFzcyBDb250ZW50VHlwZUlkRm9yWE1MIHsKLQkvKioKLQkgKiBUaGlzIGNvbnRlbnQgdHlwZSBpcyBhY3R1YWxseSBzdXBwbGllZCBieSBiYXNlIEVjbGlwc2UuIEl0cyBnaXZlbiBoZXJlCi0JICoganVzdCBhcyBkb2N1bWVudGF0aW9uIGZvciBXVFAgYmFzZWQgY2xpZW50cy4gVHlwaWNhbGx5LCBjbGllbnRzIHNob3VsZAotCSAqIHVzZSB0aGUgdmFsdWVzL2NvbnN0YW50cyBzdXBwbGllZCBieSBiYXNlIEVjbGlwc2UuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9YTUwgPSBnZXRDb25zdGFudFN0cmluZzIoKTsKLQkvKioKLQkgKiBUaGlzIHZhbHVlIGlzIHB1YmxpYyBvbmx5IGZvciB0ZXN0aW5nIGFuZCBzcGVjaWFsIGluZnJhc3RydWN0dXJlLiBUaGUKLQkgKiBjb25zdGFudCBub3IgaXMgdmFsdWUgc2hvdWxkIG5vdCBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCi0JICogCi0JICogVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZCBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluCi0JICogcGx1Z2luLnhtbCBmaWxlLiBOb3RlOiB0aGlzIHZhbHVlIGlzIGludGVudGlhbGx5IHNldCB3aXRoIGRlZmF1bHQKLQkgKiBwcm90ZWN0ZWQgbWV0aG9kIHNvIGl0IHdpbGwgbm90IGJlIGlubGluZWQuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9TU0VYTUwgPSBnZXRDb25zdGFudFN0cmluZygpOwotCi0JLyoqCi0JICogRG9uJ3QgYWxsb3cgaW5zdGFudGlhdGlvbi4KLQkgKi8KLQlwcml2YXRlIENvbnRlbnRUeXBlSWRGb3JYTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRDb25zdGFudFN0cmluZygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBTdHJpbmcgZ2V0Q29uc3RhbnRTdHJpbmcyKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01BdHRyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01BdHRyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMTZlMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NQXR0ci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGV4dGVuc2lvbnMgdG8gY29ycmVzcG9uZGluZyBET00gaW50ZXJmYWNlIHRvIGVuYWJsZQotICogZnVuY3Rpb25zIGZvciBzb3VyY2UgZWRpdGluZyBhbmQgaW5jcmVtZW50YWwgcGFyc2luZy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NQXR0ciBleHRlbmRzIElET01Ob2RlLCBBdHRyIHsKLQotCS8qKgotCSAqIEdldCdzIHRoZSByZWdpb24gaW4gYXR0cmlidXRlIHJlcHJlc2VudGluZyB0aGUgJz0nIHNpZ24uIE1heSBvciBtYXkgbm90Ci0JICogaGF2ZSB3aGl0ZXNwYWNlIHN1cnJvdW5kaW5nIGl0LgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gCi0JICogSVNTVUU6IG5lZWQgdG8gY2hhbmdlL3JlbW92ZSB0byBhdm9pZCBleHBvc2luZyAnSVRleHRSZWdpb24nCi0JICogY2hhbmdlIHRvIG9mZnNldCBwYXR0ZXJuLCBhcyBvdGhlcnMuCi0JICogCi0JICogQHJldHVybiBJVGV4dFJlZ2lvbiAtIHRoZSByZWdpb24gcmVwcmVzZW50aW5nIHRoZSBlcXVhbHMgc2lnbiwgb3IgbnVsbAotCSAqICAgICAgICAgaWYgdGhlaXIgaXMgbm8gZXF1YWxzIHNpZ24uCi0JICovCi0JSVRleHRSZWdpb24gZ2V0RXF1YWxSZWdpb24oKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZSwgaW5jbHVkaW5nCi0JICogd2hpdGVzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludCAtIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgYXR0cmlidXRlIG5hbWUsCi0JICogICAgICAgICBpbmNsdWRpbmcgd2hpdGVzcGFjZS4KLQkgKi8KLQlpbnQgZ2V0TmFtZVJlZ2lvbkVuZE9mZnNldCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgYXR0cmlidXRlIG5hbWUuCi0JICogCi0JICogQHJldHVybiBpbnQgLSB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JaW50IGdldE5hbWVSZWdpb25TdGFydE9mZnNldCgpOwotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYXR0cmlidXRlIG5hbWUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCVN0cmluZyBnZXROYW1lUmVnaW9uVGV4dCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lLCBleGNsdWRpbmcKLQkgKiB3aGl0ZXNwYWNlLgotCSAqIAotCSAqIEByZXR1cm4gaW50IC0gcmV0dXJucyB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZQotCSAqICAgICAgICAgbmFtZSwgZXhjbHVkaW5nIHdoaXRlc3BhY2UuCi0JICovCi0JaW50IGdldE5hbWVSZWdpb25UZXh0RW5kT2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCi0JICogCi0JICogQHJldHVybiBpbnQgLSByZXR1cm5zIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBhdHRyaWJ1dGUKLQkgKiAgICAgICAgIHZhbHVlLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIGJldHRlciBzcGVjIGludGVyYWN0aW9uIHdpdGggcXVvdGUgbWFya3MKLQkgKi8KLQlpbnQgZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIGF0dHJpYnV0ZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHJldHVybnMgdGhlIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlUmVnaW9uVGV4dCgpOwotCi0JLyoqCi0JICogQ2hlY2sgaWYgQXR0ciBoYXMgYSBuZXN0ZWQgdmFsdWUgKHN1Y2ggYXMgYSBKU1AgZXhwcmVzc2lvbikuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGNvbnRhaW5zIGEgbmVzdGVkIHZhbHVlLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JYm9vbGVhbiBoYXNOZXN0ZWRWYWx1ZSgpOwotCi0JLyoqCi0JICogQ2hlY2sgaWYgQXR0ciBoYXMgb25seSBuYW1lIGJ1dCBub3QgZXF1YWwgc2lnbiBub3IgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGhhcyBvbmx5IG5hbWUgYnV0IG5vdCBlcXVhbCBzaWduIG5vciB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIGhhc05hbWVPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgYXR0cmlidXRlIGlzIGRlZmluZWQgZ2xvYmFsbHkgZm9yIGRvY3VtZW50LiBSZXR1cm5zCi0JICogZmFsc2UgaWYgYXR0cmlidXRlIGlzIHByZWNlZWRlZCBieSBhIHByZWZpeCAod2hldGhlciB2YWxpZCBuYW1lIHNwYWNlCi0JICogb3Igbm90KS4gUmV0dXJucyB0cnVlIGlmIGl0cyBvd25pbmcgZWxlbWVudCBpcyBhIGdsb2JhbCBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBhdHRyaWJ1dGUgaXMgZGVmaW5lZCBnbG9iYWxseSBmb3IgZG9jdW1lbnQuIFJldHVybnMKLQkgKiAgICAgICAgIGZhbHNlIGlmIGF0dHJpYnV0ZSBpcyBwcmVjZWVkZWQgYnkgYSBwcmVmaXggKHdoZXRoZXIgdmFsaWQgbmFtZQotCSAqICAgICAgICAgc3BhY2Ugb3Igbm90KS4gUmV0dXJucyB0cnVlIGlmIGl0cyBvd25pbmcgZWxlbWVudCBpcyBhIGdsb2JhbAotCSAqICAgICAgICAgZWxlbWVudC4KLQkgKi8KLQlib29sZWFuIGlzR2xvYmFsQXR0cigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGlzIHhtbCBhdHRyCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gc3BlY2lmeSB0aGlzIG9uZSBpbiBhIG1lYW5pbmdmdWwgd2F5LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiAtIHJldHVybnMgdHJ1ZSBpZiBpcyB4bWwgYXR0cgotCSAqLwotCWJvb2xlYW4gaXNYTUxBdHRyKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTURvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Eb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDY5ZTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTURvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBlbmFibGVzIGNyZWF0aW9uIG9mIERPQ1RZUEUgZGVjbGFyYXRpb24gYW5kIHNvbWUgRE9NIExldmVsIDIKLSAqIGludGVyZmFjZXMuIE1heSBiZSByZWZlcmVuY2VkIGJ1dCBub3QgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURPTURvY3VtZW50IGV4dGVuZHMgTm9kZSwgRG9jdW1lbnQsIElET01Ob2RlIHsKLQotCS8qKgotCSAqIGNyZWF0ZSBjb21tZW50IGVsZW1lbnQuIHRhZ05hbWUgbXVzdCBiZSByZWdpc3RlcmVkIGFzIGNvbW1lbnQgZWxlbWVudAotCSAqIG5hbWUgaW4gcGx1Z2luLnhtbAotCSAqIAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lCi0JICogQHBhcmFtIGlzSlNQVGFnCi0JICogICAgICAgICAgICB0cnVlIGlmIHRoZSBlbGVtZW50IGlzIEpTUCBzdHlsZSBjb21tZW50ICgmbHQ7JS0tIC4uLgotCSAqICAgICAgICAgICAgLS0lJmd0OykKLQkgKiBAcmV0dXJuIEVsZW1lbnQgZWxlbWVudCBpbnN0YW5jZQotCSAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgdGhyb3duIGlmIHRoZSBlbGVtZW50IG5hbWUgaXMgcmVnaXN0ZXJlZCBhcyBjb21tZW50IGVsZW1lbnQKLQkgKi8KLQlFbGVtZW50IGNyZWF0ZUNvbW1lbnRFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBib29sZWFuIGlzSlNQVGFnKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIERvY3VtZW50VHlwZSBub2RlCi0JICogCi0JICogSVNTVUU6IEkgYmVsaWV2ZSB0aGlzICduYW1lJyBpcyB0aGUgb25lIHNwZWNpZmljIGluIGRvY3R5cGUgZXh0ZW5zaW9uLAotCSAqIG5lZWQgdG8gdmVyaWZ5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lIC0KLQkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIGRvY3R5cGUKLQkgKiBAcmV0dXJuIERvY3VtZW50VHlwZSAtIHJldHVybnMgYSBkb2N1bWVudCB0eXBlIG5vZGUuCi0JICovCi0JRG9jdW1lbnRUeXBlIGNyZWF0ZURvY3R5cGUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRG9jdW1lbnRUeXBlIElELiBVbmxpa2UgdGhlIHN0YW5kYXJkIERPTSBhcHByb2FjaCBvZgotCSAqICJnZXREb2N1bWVudFR5cGUoKS5nZXRQdWJsaWNJZCgpIiwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaWQgZXZlbiBpZgotCSAqIGltcGxpY2l0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIERvY3VtZW50VHlwZSBJRAotCSAqLwotCVN0cmluZyBnZXREb2N1bWVudFR5cGVJZCgpOwotCi0JLyoqCi0JICogTk9UIEFQSSAuLi4gbmVlZHMgdG8gYmUgcmVtb3ZlZC9jaGFuZ2VkCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gc3BlY2lmeQotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGlzIEpTUERvY3VtZW50Ci0JICogCi0JICovCi0JYm9vbGVhbiBpc0pTUERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBOT1QgQVBJIC4uLiBuZWVkcyB0byBiZSByZW1vdmVkL2NoYW5nZWQKLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBzcGVjaWZ5Ci0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzSlNQVHlwZSgpOwotCi0JLyoqCi0JICogTk9UIEFQSSAuLi4gbWF5IHJlbW92ZWQvY2hhbmdlZAotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHNwZWNpZnkgLS0gY3VycmVudGx5IHVzZWQgdG8gZGVub3RlIGFuIEhUTUwgRE9NIGRvY3VtZW50Ci0JICogaXMgWEhUTUwKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNYTUxUeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTURvY3VtZW50VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRG9jdW1lbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMmM2NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRG9jdW1lbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBlbmFibGVzIHNldHRpbmcgb2YgUHVibGljIGFuZCBTeXN0ZW0gSUQgZm9yIERPQ1RZUEUKLSAqIGRlY2xhcmF0aW9uLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NRG9jdW1lbnRUeXBlIGV4dGVuZHMgSURPTU5vZGUsIERvY3VtZW50VHlwZSB7Ci0KLQotCS8qKgotCSAqIFNldHMgZG9jdW1lbnQgdHlwZSdzIHB1YmxpYyBpZCwgYXMgc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBTdHJpbmcgLQotCSAqICAgICAgICAgICAgdGhlIHB1YmxpY0lkCi0JICovCi0Jdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgcHVibGljSWQpOwotCi0JLyoqCi0JICogU2V0cyBkb2NtZW50IHR5cGUncyBzeXN0ZW0gaWQsIGFzIHNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gU3RyaW5nIC0KLQkgKiAgICAgICAgICAgIHRoZSBzeXN0ZW1JZAotCSAqLwotCXZvaWQgc2V0U3lzdGVtSWQoU3RyaW5nIHN5c3RlbUlkKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNkNzc2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGV4dGVuc2lvbnMgdG8gY29ycmVzcG9uZGluZyBET00gaW50ZXJmYWNlIHRvIGVuYWJsZQotICogZnVuY3Rpb25zIGZvciBzb3VyY2UgZWRpdGluZyBhbmQgaW5jcmVtZW50YWwgcGFyc2luZy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NRWxlbWVudCBleHRlbmRzIElET01Ob2RlLCBFbGVtZW50IHsKLQotCS8qKgotCSAqIFJldHVucyB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBlbmQgdGFnLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHNvcnQgb3V0IG5lZWQgZm9yIHRoaXMKLQkgKiAKLQkgKiBAcmV0dXJuIGludCAtIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIGVuZCB0YWcuCi0JICovCi0JaW50IGdldEVuZFN0YXJ0T2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZQotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHNvcnQgb3V0IG5lZWQgZm9yIHRoaXMKLQkgKiAKLQkgKiBAcmV0dXJuIGludCAtIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZSBzdGFydCB0YWcuCi0JICovCi0JaW50IGdldFN0YXJ0RW5kT2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgaGFzIGFuIGVuZCB0YWcuCi0JICogCi0JICogSW4gb3VyIHNvdXJjZS1vcmllbnRlZCBET00sIHNvbWV0aW1lcyBFbGVtZW50cyBhcmUgImVuZGVkIiwgZXZlbgotCSAqIHdpdGhvdXQgYW4gZXhwbGljaXQgZW5kIHRhZyBpbiB0aGUgc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBoYXMgYW4gZW5kIHRhZy4KLQkgKi8KLQlib29sZWFuIGhhc0VuZFRhZygpOwotCi0JLyoqCi0JICogcmV0dXJucyB0cnVlIGlmIGhhcyBhIHN0YXJ0IHRhZy4KLQkgKiAKLQkgKiBJbiBvdXIgc291cmNlLW9yaWVudGVkIERPTSwgYSBsb25lIGVuZCB0YWcgd2lsbCBjYXVzZSBhIG5vZGUgdG8gYmUKLQkgKiBjcmVhdGVkIGluIHRoZSB0cmVlLCB1bmxpa2Ugd2VsbC1mb3JtZWQtb25seSBET01zLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBoYXMgYSBzdGFydCB0YWcuCi0JICovCi0JYm9vbGVhbiBoYXNTdGFydFRhZygpOwotCi0JLyoqCi0JICogcmV0dXJucyB0cnVlIGlmIHRoaXMgZWxlbWVudCBpcyBhIGNvbW1lbnQgZWxlbWVudAotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaXMgYSBjb21tZW50IGVsZW1lbnQKLQkgKi8KLQlib29sZWFuIGlzQ29tbWVudFRhZygpOwotCi0JLyoqCi0JICogaXNFbXB0eVRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gLSB0cnVlIGlmIGlzIGVtcHR5IHRhZywgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JYm9vbGVhbiBpc0VtcHR5VGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgZmxvYXRpbmcgZW5kIHRhZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgZmxvYXRpbmcgZW5kIHRhZy4KLQkgKi8KLQlib29sZWFuIGlzRW5kVGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgZm9yICJnbG9iYWwgdGFnIiAoYmFzaWNhbGx5LCB3aXRob3V0IHByZWZpeCkKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgZm9yICJnbG9iYWwgdGFnIiAoYmFzaWNhbGx5LCB3aXRob3V0IHByZWZpeCkKLQkgKi8KLQlib29sZWFuIGlzR2xvYmFsVGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgZm9yIG5vIHN0YXJ0IGFuZCB0aGUgZW5kIHRhZ3MgaW4gc291cmNlLgotCSAqIAotCSAqIFByb3ZpZGVkIGZvciBzb21lIHZlcnkgc3BlY2lhbCBjYXNlcyB3aGVuLCBmb3IgZXhhbXBsZSwgYW5kIEhUTUwgdGFnIGlzCi0JICogYXNzdW1lZCBpbiBhbiBIVE1MIGRvY3VtZW50IHRoYXQgZG9lcyBub3QgaGF2ZSBhIGxpdGVyYWwgSFRNTCB0YWcuCi0JICogCi0JICogSVNTVUU6IGNoZWNrIHdpdGggY2xpZW50cyB0byBzZWUgaWYgc3RpbGwgbmVlZGVkCi0JICogCi0JICogQHJldHVybiB0cnVlIG9yIG5vIHN0YXJ0IGFuZCB0aGUgZW5kIHRhZ3MgaW4gc291cmNlLgotCSAqLwotCWJvb2xlYW4gaXNJbXBsaWNpdFRhZygpOwotCi0JLyoqCi0JICogaXNKU1BUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogCi0JICogSVNTVUU6IGNoYW5nZSB0byBpc0NvbnRhaW5lckxhbmd1YWdlVGFnKFN0cmluZyB0eXBlKTsKLQkgKi8KLQlib29sZWFuIGlzSlNQVGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgc3RhcnQgdGFnIGlzIGNsb3NlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgc3RhcnQgdGFnIGlzIGNsb3NlZC4KLQkgKi8KLQlib29sZWFuIGlzU3RhcnRUYWdDbG9zZWQoKTsKLQotCS8qKgotCSAqIHJldHVybnMgdHJ1ZSBpZiBpcyB4bWwgdGFnCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gc3BlYyB0aGlzIGJldHRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgaXMgeG1sIHRhZwotCSAqLwotCWJvb2xlYW4gaXNYTUxUYWcoKTsKLQotCS8qKgotCSAqIE5PVCBDTElFTlQgQVBJCi0JICogCi0JICogbm90aWZ5RW5kVGFnQ2hhbmdlZAotCSAqIAotCSAqLwotCXZvaWQgbm90aWZ5RW5kVGFnQ2hhbmdlZCgpOwotCi0JLyoqCi0JICogTk9UIENMSUVOVCBBUEkKLQkgKiAKLQkgKiBub3RpZnlTdGFydFRhZ0NoYW5nZWQKLQkgKiAKLQkgKi8KLQl2b2lkIG5vdGlmeVN0YXJ0VGFnQ2hhbmdlZCgpOwotCi0JLyoqCi0JICogTk9UIENMSUVOVCBBUEkKLQkgKiAKLQkgKiBTaWduaWZ5IHRoYXQgdGhpcyB0YWcgaXMgYSBjb21tZW50Ci0JICogCi0JICogRm9yIHVzZSBvbmx5IGJ5IHBhcnNlcnMuCi0JICogCi0JICovCi0Jdm9pZCBzZXRDb21tZW50VGFnKGJvb2xlYW4gaXNDb21tZW50VGFnKTsKLQotCS8qKgotCSAqIE5PVCBDTElFTlQgQVBJCi0JICogCi0JICogU2lnbmlmeSB0aGF0IHRoaXMgdGFnIGlzIGFuIGVtcHR5IHRhZwotCSAqIAotCSAqIEZvciB1c2Ugb25seSBieSBwYXJzZXJzCi0JICovCi0Jdm9pZCBzZXRFbXB0eVRhZyhib29sZWFuIGlzRW1wdHlUYWcpOwotCi0JLyoqCi0JICogTk9UIENMSUVOVCBBUEkKLQkgKiAKLQkgKiBTaWduaWZ5IHRoYXQgdGhpcyB0YWcgaXMgYSBKU1AgdGFnCi0JICogCi0JICogRm9yIHVzZSBvbmx5IGJ5IHBhcnNlcnMKLQkgKiAKLQkgKiBJU1NVRTogSSBoYXZlIGhhZCBvbmUgbm9uLXBhcnNpbmcgY2xpZW50IHdobyBoYXMgaGFkIHRvIHVzZSB0aGlzIC4uLgotCSAqIG5lZWQgdG8gY2hlY2sKLQkgKiAKLQkgKi8KLQl2b2lkIHNldEpTUFRhZyhib29sZWFuIGlzSlNQVGFnKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0lkKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIGJvb2xlYW4gaXNJZCk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOb2RlKEF0dHIgaWRBdHRyLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUVudGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjJlYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURPTUVudGl0eSBleHRlbmRzIEVudGl0eSB7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gMy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElucHV0RW5jb2RpbmcoKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSAzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSAzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WG1sVmVyc2lvbigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NSW1wbGVtZW50YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUltcGxlbWVudGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNzNlMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NSW1wbGVtZW50YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotcHVibGljIGludGVyZmFjZSBJRE9NSW1wbGVtZW50YXRpb24gewotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBUaGlzIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gMy4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgc3BlY2lhbGl6ZWQgb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgdGhlCi0JICogc3BlY2lhbGl6ZWQgQVBJcyBvZiB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgYW5kIHZlcnNpb24sIGFzIHNwZWNpZmllZCBpbiAuCi0JICogVGhlIHNwZWNpYWxpemVkIG9iamVjdCBtYXkgYWxzbyBiZSBvYnRhaW5lZCBieSB1c2luZyBiaW5kaW5nLXNwZWNpZmljCi0JICogY2FzdGluZyBtZXRob2RzIGJ1dCBpcyBub3QgbmVjZXNzYXJpbHkgZXhwZWN0ZWQgdG8sIGFzIGRpc2N1c3NlZCBpbiAuCi0JICogVGhpcyBtZXRob2QgYWxzbyBhbGxvdyB0aGUgaW1wbGVtZW50YXRpb24gdG8gcHJvdmlkZSBzcGVjaWFsaXplZAotCSAqIG9iamVjdHMgd2hpY2ggZG8gbm90IHN1cHBvcnQgdGhlIDxjb2RlPkRPTUltcGxlbWVudGF0aW9uPC9jb2RlPgotCSAqIGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUgcmVxdWVzdGVkLiBOb3RlIHRoYXQgYW55IHBsdXMgc2lnbgotCSAqICAgICAgICAgICAgIisiIHByZXBlbmRlZCB0byB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSB3aWxsIGJlIGlnbm9yZWQKLQkgKiAgICAgICAgICAgIHNpbmNlIGl0IGlzIG5vdCBzaWduaWZpY2FudCBpbiB0aGUgY29udGV4dCBvZiB0aGlzIG1ldGhvZC4KLQkgKiBAcGFyYW0gdmVyc2lvbgotCSAqICAgICAgICAgICAgVGhpcyBpcyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGZlYXR1cmUgdG8gdGVzdC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYW4gb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgdGhlIHNwZWNpYWxpemVkIEFQSXMgb2YgdGhlCi0JICogICAgICAgICBzcGVjaWZpZWQgZmVhdHVyZSBhbmQgdmVyc2lvbiwgaWYgYW55LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgaWYgdGhlcmUgaXMgbm8gb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgaW50ZXJmYWNlcyBhc3NvY2lhdGVkCi0JICogICAgICAgICB3aXRoIHRoYXQgZmVhdHVyZS4gSWYgdGhlIDxjb2RlPkRPTU9iamVjdDwvY29kZT4gcmV0dXJuZWQgYnkKLQkgKiAgICAgICAgIHRoaXMgbWV0aG9kIGltcGxlbWVudHMgdGhlIDxjb2RlPkRPTUltcGxlbWVudGF0aW9uPC9jb2RlPgotCSAqICAgICAgICAgaW50ZXJmYWNlLCBpdCBtdXN0IGRlbGVnYXRlIHRvIHRoZSBwcmltYXJ5IGNvcmUKLQkgKiAgICAgICAgIDxjb2RlPkRPTUltcGxlbWVudGF0aW9uPC9jb2RlPiBhbmQgbm90IHJldHVybiByZXN1bHRzCi0JICogICAgICAgICBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgcHJpbWFyeSBjb3JlCi0JICogICAgICAgICA8Y29kZT5ET01JbXBsZW1lbnRhdGlvbjwvY29kZT4gc3VjaCBhcwotCSAqICAgICAgICAgPGNvZGU+aGFzRmVhdHVyZTwvY29kZT4sIDxjb2RlPmdldEZlYXR1cmU8L2NvZGU+LCBldGMuCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Nb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmZmM3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Nb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5YTUxNb2RlbE5vdGlmaWVyOwotCi0vKioKLSAqIFByb3ZpZGVzIG1lYW5zIHRvIGdldCB0aGUgWE1MTW9kZWwgZm9ybSBvZiBJU3RydWN1dHJlZE1vZGVsLiBOb3QgdG8gYmUKLSAqIGltcGxlbWVudGVkIG9yIGV4dGVuZGVkIGJ5IGNsaWVudHMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElET01Nb2RlbCBleHRlbmRzIElTdHJ1Y3R1cmVkTW9kZWwgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRE9NIERvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIERPTSBEb2N1bWVudC4KLQkgKi8KLQlJRE9NRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIAotCSAqIFJldHVybnMgYW4gc291cmNlIGdlbmVyYXRvciBhcHByb3ByaWF0ZSBmb3IgdGhpcyBtb2RlbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzb3VyY2UgZ2VuZXJhdG9yCi0JICovCi0JSVNvdXJjZUdlbmVyYXRvciBnZXRHZW5lcmF0b3IoKTsKLQotCS8qKgotCSAqIE5PVCBDTElFTlQgQVBJCi0JICogCi0JICogUmV0dXJucyBhbiBYTUxNb2RlbE5vdGlmaWVyLiBDbGllbnRzIHNob3VsZCBub3QgdXNlLgotCSAqIAotCSAqIElTU1VFOiBzaG91bGQgYmUgImludGVybmFsaXplZCIuCi0JICogCi0JICovCi0JWE1MTW9kZWxOb3RpZmllciBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBOT1QgQ0xJRU5UIEFQSQotCSAqCi0JICogU2V0cyB0aGUgbW9kZWwgbm90aWZpZXIgQ2xpZW50cyBzaG91bGQgbm90IHVzZS4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byByZXZpZXcgd2l0aCBsZWdhY3kgY2xpZW50cy4KLQkgKi8KLQl2b2lkIHNldE1vZGVsTm90aWZpZXIoWE1MTW9kZWxOb3RpZmllciBub3RpZmllcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkODg3NWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlc2NyaWJlcyB0aGUgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eSBvZiBvdXIgc291cmNlLW9yaWVudGVkCi0gKiBET00uIEZpcnN0LCBvdXIgbm9kZXMgZXh0ZW5kIHRoZSB3M2MgTm9kZSBpbnRlcmZhY2UsIEluZGV4ZWRSZWdpb24sIGFuZAotICogSU5vZGVOb3RpZmllci4gUGx1cywgaGFzIHRoZSBleHRyYSBtZXRob2RzIGNhbGxlZCBvdXQgaGVyZS4KLSAqIAotICogSVNTVUU6IHRoZSAncmVhZC1vbmx5JyBBUEkgc2hvdWxkIGJlIGJyb2tlbiBvdXQgaW4gdGhlaXIgb3duIGludGVyZmFjZQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElET01Ob2RlIGV4dGVuZHMgSW5kZXhlZFJlZ2lvbiwgSU5vZGVOb3RpZmllciwgTm9kZSB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsYXN0IHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIG9mIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byByZXNvbHZlIGdldEVuZC9nZXRMYXN0IGNvbmZ1c2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gLSByZXR1cm5zIHRoZSBsYXN0IHN0cnVjdHVyZWQKLQkgKiAgICAgICAgIGRvY3VtZW50IHJlZ2lvbiBhc3NvY2lhdGVkIHdpdGgKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZmlyc3Qgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gb2YgdGhpcyBub2RlLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHJlc29sdmUgZ2V0Rmlyc3QvZ2V0U3RhcnQgY29uZnVzaW9uCi0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3Qgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gb2YgdGhpcyBub2RlLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGxhc3Qgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gb2YgdGhpcyBub2RlLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHJlc29sdmUgZ2V0RW5kL2dldExhc3QgY29uZnVzaW9uLgotCSAqIAotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAtIHJldHVybnMgdGhlIGxhc3Qgc3RydWN0dXJlZAotCSAqICAgICAgICAgZG9jdW1lbnQgcmVnaW9uIGFzc29jaWF0ZWQgd2l0aAotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4gUmV0dXJucyBudWxsIGlmIG5vdCBwYXJ0Ci0JICogb2YgYW4gYWN0aXZlIG1vZGVsLgotCSAqIAotCSAqIEByZXR1cm4gSURPTU1vZGVsIC0gcmV0dXJucyB0aGUgSURPTU1vZGVsIHRoaXMgbm9kZSBpcyBwYXJ0IG9mLgotCSAqLwotCUlET01Nb2RlbCBnZXRNb2RlbCgpOwotCi0JLyoqCi0JICogR2V0J3MgdGhlIHJlZ2lvbiByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhpcyBub2RlCi0JICogCi0JICogSVNTVUU6IG9ubHkgaW1wbGVtZW50ZWQvdXNlZCBhdCBhdHRyaWJ1dGUgYW5kIERURE5vZGVzIC0tIHNob3VsZCBtb3ZlLgotCSAqIAotCSAqIEByZXR1cm4gSVRleHRSZWdpb24gLSByZXR1cm5zIHRoZSBJVGV4dFJlZ2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcwotCSAqICAgICAgICAgTm9kZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCUlUZXh0UmVnaW9uIGdldE5hbWVSZWdpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgc291cmNlIHJlcHJlc2VudGluZyB0aGlzIG5vZGUgaW4gc291cmNlIGRvY3VtZW50LgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIGZpeCBpbXBsZW1lbnRhdGlvbiB0byBtYXRjaC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXRlcmFsIHNvdXJjZSByZXByZXNlbnRpbmcgdGhpcyBub2RlIGluIHNvdXJjZSBkb2N1bWVudC4KLQkgKi8KLQlTdHJpbmcgZ2V0U291cmNlKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmaXJzdCBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiBvZiB0aGlzIG5vZGUuCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gcmVzb2x2ZSBnZXRGaXJzdC9nZXRTdGFydCBjb25mdXNpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiBvZiB0aGlzIG5vZGUuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCB0aGF0IHVuZGVybGllcyB0aGlzIG5vZGUncyBtb2RlbC4KLQkgKiAKLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhpcyBub2RlIGlzIG5vdCBhY3RpdmVseSBwYXJ0IG9mIGEgc291cmNlIGRvY3VtZW50LiBJbgotCSAqIGNvbnRyYXN0LCBpbiB0aGUgcHVyZSBET00gd29ybGQsICJvd25pbmcgZG9jdW1lbnQiIGlzIG5vdCBudWxsIGV2ZW4KLQkgKiBhZnRlciBhIG5vZGUgaXMgZGVsZXRlZCBmcm9tIHRoZSBET00uCi0JICogCi0JICogSVNTVUU6IHdlIG5lZWQgdG8gZml4IG91ciBpbXBsZW1lbnRhdGlvbiB0byBtYXRjaCB0aGlzIHNwZWMuCi0JICogCi0JICogQHJldHVybiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudC4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JLyoqCi0JICogR2V0J3MgdGhlIHJlZ2lvbiByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoaXMgbm9kZSBpZiBvbmx5IG9uZQotCSAqIElUZXh0UmVnaW9uLCBudWxsIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBJU1NVRTogb25seSBpbXBsZW1lbnRlZC91c2VkIGF0IGF0dHJpYnV0ZSBsZXZlbCwgbW92ZSAiZG93biIuCi0JICogCi0JICogQHJldHVybiBJVGV4dFJlZ2lvbiAtIHJldHVybnMgdGhlIElUZXh0UmVnaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0JICogICAgICAgICBOb2RlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JSVRleHRSZWdpb24gZ2V0VmFsdWVSZWdpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzb3VyY2Ugb2YgdGhpcyBub2RlLCBidXQgd2l0aAotCSAqIGNoYXJhY3RlciBlbnRpZXMgY29udmVydGVkIChlLmcuICZsdDsgaXMgY29udmVydGVkIHRvICc8JykuCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gYmV0dGVyIHNwZWMgZXh0ZW50IG9mIHRoaXMgY29udmVyc2lvbiwgd2UgbWF5IG5vdCBrbm93Ci0JICogYWxsIGNoYXJhY3RlciBlbnRpdGllcy4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBmaXggaW1wbGVtZW50YXRpb24gdG8gbWF0Y2ggc3BlYy4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyAtIGdldCdzIHRoZSBzb3VyY2Ugb2YgdGhpcyBOb2RlLgotCSAqLwotCVN0cmluZyBnZXRWYWx1ZVNvdXJjZSgpOwotCi0JLyoqCi0JICogVXNlZCB0byBrbm93IHJlYWQtb25seSBzdGF0ZSBvZiBjaGlsZHJlbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gV2hldGhlciBjaGlsZHJlbiBvZiB0aGUgZWxlbWVudCBjYW4gYmUgYXBwZW5kZWQgb3IKLQkgKiAgICAgICAgIHJlbW92ZWQuCi0JICovCi0JYm9vbGVhbiBpc0NoaWxkRWRpdGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0YWcgaXMgY2xvc2VkIGluIHNvdXJjZS4KLQkgKiAKLQkgKiBJbiBvdXIgc291cmNlIG9yaWVudCBET00gd2Ugc29tZXRpbWVzIGVuZCBhIE5vZGUgd2l0aG91dCBpdCBiZWluZwotCSAqIGV4cGxpY2l0bHkgY2xvc2VkIGluIHNvdXJjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gLSB0cnVlIGlmIG5vZGUgaXMgY2xvc2VkCi0JICovCi0JYm9vbGVhbiBpc0Nsb3NlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbm9kZSBjYW4gY29udGFpbiBjaGlsZHJlbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gLSB0cnVlIGlmIHRoaXMgbm9kZSBjYW4gY29udGFpbiBjaGlsZHJlbi4KLQkgKi8KLQlib29sZWFuIGlzQ29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGtub3cgcmVhZC1vbmx5IHN0YXRlIG9mIGRhdGEuCi0JICogCi0JICovCi0JYm9vbGVhbiBpc0RhdGFFZGl0YWJsZSgpOwotCi0JLyoqCi0JICogU2V0J3MgcmVhZG9ubHkgc3RhdGUgb2YgY2hpbGRyZW4KLQkgKiAKLQkgKi8KLQl2b2lkIHNldENoaWxkRWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSk7Ci0KLQkvKioKLQkgKiBTZXQncyByZWFkb25seSBzdGF0ZSBvZiBkYXRhCi0JICogCi0JICovCi0Jdm9pZCBzZXREYXRhRWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHJlYWRvbmx5IHN0YXRlIG9mIGRhdGEKLQkgKiAKLQkgKiBmYXN0ZXIgYXBwcm9hY2ggdG8gc2V0IHJlYWQtb25seSBzdGF0ZS4KLQkgKi8KLQl2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUsIGJvb2xlYW4gZGVlcCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzcGVjaWZpZWQgcmF3IHNvdXJjZSB0byB0aGUgVGV4dCBub2RlLiBUaHJvd3MKLQkgKiBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uIHdoZW4gdGhlIHNwZWNpZmllZCByYXcgc291cmNlIGluY2x1ZGVzCi0JICogaW52YWxpZCBjaGFyYWN0ZXJzLCBzdWNoIGFzLCAnIDwnLCAnPicgYW5kICcmJy4gVmFsaWQgY2hhcmFjdGVyCi0JICogZW50aXRpZXMsIHN1Y2ggYXMsICImYW1wO2x0OyIsIGFyZSBhY2NlcHRlZC4KLQkgKi8KLQl2b2lkIHNldFNvdXJjZShTdHJpbmcgc291cmNlKSB0aHJvd3MgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNldHMgdGhlIHNwZWNpZmllZCByYXcgc291cmNlIHRvIHRoZSBUZXh0IG9yIEF0dHIgbm9kZSdzIHZhbHVlLiBXaGVuCi0JICogdGhlIHNwZWNpZmllZCByYXcgc291cmNlIGluY2x1ZGVzIGludmFsaWQgY2hhcmFjdGVycywgc3VjaCBhcywgJyA8JywKLQkgKiAnPicgYW5kICcmJywgY29udmVydHMgdGhlbS4gVmFsaWQgY2hhcmFjdGVyIGVudGl0aWVzLCBzdWNoIGFzLAotCSAqICImYW1wO2x0OyIsIGFyZSBhY2NlcHRlZC4KLQkgKi8KLQl2b2lkIHNldFZhbHVlU291cmNlKFN0cmluZyBzb3VyY2UpOwotCQotCQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgc2hvcnQgY29tcGFyZURvY3VtZW50UG9zaXRpb24oTm9kZSBvdGhlcikgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlVVJJKCk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRDb250ZW50KCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRVc2VyRGF0YShTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2VVUkkpOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VxdWFsTm9kZShOb2RlIGFyZyk7Ci0JCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhbWVOb2RlKE5vZGUgb3RoZXIpOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvb2t1cE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBsb29rdXBQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSk7Ci0JCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0Q29udGVudChTdHJpbmcgdGV4dENvbnRlbnQpIHRocm93cyBET01FeGNlcHRpb247Ci0JCi0JCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01UZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01UZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjNhNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgZXh0ZW5zaW9ucyB0byBjb3JyZXNwb25kaW5nIERPTSBpbnRlcmZhY2UgdG8gZW5hYmxlCi0gKiBmdW5jdGlvbnMgZm9yIHNvdXJjZSBlZGl0aW5nIGFuZCBpbmNyZW1lbnRhbCBwYXJzaW5nLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElET01UZXh0IGV4dGVuZHMgSURPTU5vZGUsIFRleHQgewotCi0JLyoqCi0JICogTk9UIEFQSSAtIGNhbiBiZSBlbGltaW5hdGVkIG9yIG1vdmVkIHRvIGx0ayBsZXZlbAotCSAqIAotCSAqIEFwcGVuZHMgdGhlIGNvbnRlbnQgb2YgdGhlIHRleHQgbm9kZQotCSAqIAotCSAqIEBwYXJhbSB0ZXh0IC0KLQkgKiAgICAgICAgICAgIHRoZSBUZXh0IHRvIGFwcGVuZC4KLQkgKi8KLQl2b2lkIGFwcGVuZFRleHQoVGV4dCB0ZXh0KTsKLQotCS8qKgotCSAqIE5PVCBBUEkgLSBjYW4gYmUgZWxpbWluYXRlZCBvciBtb3ZlZCB0byBsdGsgbGV2ZWwKLQkgKiAKLQkgKiBSZXR1cm5zIHRydWUgaWYgaXMgbm90IHZhbGlkLgotCSAqLwotCWJvb2xlYW4gaXNJbnZhbGlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgaXMgZW50aXJlbHkgd2hpdGUgc3BhY2UuCi0JICogCi0JICogVGhpcyBpcyBpbnRlbmVkIHRvIGJlIGJldHRlciBwZXJmb3JtaW5nIHRoYXQgYWxsIGNsaWVudHMgZ2V0dGluZyB0aGUKLQkgKiBzb3VyY2UsIGFuZCBjaGVja2luZyB0aGVtc2VsdmVzLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIGNsYXJpZnkgaWYgaW1wbGVtZW50YXRpb24gaXMgcHVyZSB0byAid2hpdGUgc3BhY2UiIGFzCi0JICogcGVyIERPTSBzcGVjPyBIZXJlIGlzIHRoZSBET00gc3BlYzoKLQkgKiAKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0ZXh0IG5vZGUgY29udGFpbnMgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA0L1JFQy14bWwtaW5mb3NldC0yMDA0MDIwNCNpbmZvaXRlbS5jaGFyYWN0ZXInPgotCSAqIGVsZW1lbnQgY29udGVudCB3aGl0ZXNwYWNlPC9hPiwgb2Z0ZW4gYWJ1c2l2ZWx5IGNhbGxlZCAiaWdub3JhYmxlCi0JICogd2hpdGVzcGFjZSIuIFRoZSB0ZXh0IG5vZGUgaXMgZGV0ZXJtaW5lZCB0byBjb250YWluIHdoaXRlc3BhY2UgaW4KLQkgKiBlbGVtZW50IGNvbnRlbnQgZHVyaW5nIHRoZSBsb2FkIG9mIHRoZSBkb2N1bWVudCBvciBpZiB2YWxpZGF0aW9uIG9jY3VycwotCSAqIHdoaWxlIHVzaW5nIDxjb2RlPkRvY3VtZW50Lm5vcm1hbGl6ZURvY3VtZW50KCk8L2NvZGU+LgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgaXMgZW50aXJlbHkgd2hpdGUgc3BhY2UuCi0JICovCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpOwotCi0JLyoqCi0JICogTk9UIFlFVCBJTVBMRU1URU5URUQgYnV0IGV4aXN0cyBoZXJlIGludGVyZmFjZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NMwotCSAqIAotCSAqIFJldHVybnMgYWxsIHRleHQgb2YgPGNvZGU+VGV4dDwvY29kZT4gbm9kZXMgbG9naWNhbGx5LWFkamFjZW50IHRleHQKLQkgKiBub2RlcyB0byB0aGlzIG5vZGUsIGNvbmNhdGVuYXRlZCBpbiBkb2N1bWVudCBvcmRlci4gPGJyPgotCSAqIEZvciBpbnN0YW5jZSwgaW4gdGhlIGV4YW1wbGUgYmVsb3cgPGNvZGU+d2hvbGVUZXh0PC9jb2RlPiBvbiB0aGUKLQkgKiA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIHRoYXQgY29udGFpbnMgImJhciIgcmV0dXJucyAiYmFyZm9vIiwgd2hpbGUgb24KLQkgKiB0aGUgPGNvZGU+VGV4dDwvY29kZT4gbm9kZSB0aGF0IGNvbnRhaW5zICJmb28iIGl0IHJldHVybnMgImJhcmZvbyIuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2hvbGVUZXh0KCk7Ci0KLQkvKioKLQkgKiBOT1QgWUVUIElNUExFTVRFTlRFRCBidXQgZXhpc3RzIGhlcmUgaW50ZXJmYWNlIGluIHByZXBhcmF0aW9uIGZvciBET00zCi0JICogCi0JICogUmVwbGFjZXMgdGhlIHRleHQgb2YgdGhlIGN1cnJlbnQgbm9kZSBhbmQgYWxsIGxvZ2ljYWxseS1hZGphY2VudCB0ZXh0Ci0JICogbm9kZXMgd2l0aCB0aGUgc3BlY2lmaWVkIHRleHQuIEFsbCBsb2dpY2FsbHktYWRqYWNlbnQgdGV4dCBub2RlcyBhcmUKLQkgKiByZW1vdmVkIGluY2x1ZGluZyB0aGUgY3VycmVudCBub2RlIHVubGVzcyBpdCB3YXMgdGhlIHJlY2lwaWVudCBvZiB0aGUKLQkgKiByZXBsYWNlbWVudCB0ZXh0LiA8YnI+Ci0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbm9kZSB3aGljaCByZWNlaXZlZCB0aGUgcmVwbGFjZW1lbnQgdGV4dC4gVGhlCi0JICogcmV0dXJuZWQgbm9kZSBpczoKLQkgKiA8dWw+Ci0JICogPGxpPjxjb2RlPm51bGw8L2NvZGU+LCB3aGVuIHRoZSByZXBsYWNlbWVudCB0ZXh0IGlzIHRoZSBlbXB0eQotCSAqIHN0cmluZzsgPC9saT4KLQkgKiA8bGk+dGhlIGN1cnJlbnQgbm9kZSwgZXhjZXB0IHdoZW4gdGhlIGN1cnJlbnQgbm9kZSBpcyByZWFkLW9ubHk7IDwvbGk+Ci0JICogPGxpPiBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIG9mIHRoZSBzYW1lIHR5cGUgKAotCSAqIDxjb2RlPlRleHQ8L2NvZGU+IG9yIDxjb2RlPkNEQVRBU2VjdGlvbjwvY29kZT4pIGFzIHRoZSBjdXJyZW50Ci0JICogbm9kZSBpbnNlcnRlZCBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIHJlcGxhY2VtZW50LiA8L2xpPgotCSAqIDwvdWw+Ci0JICogPGJyPgotCSAqIEZvciBpbnN0YW5jZSwgaW4gdGhlIGFib3ZlIGV4YW1wbGUgY2FsbGluZwotCSAqIDxjb2RlPnJlcGxhY2VXaG9sZVRleHQ8L2NvZGU+IG9uIHRoZSA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIHRoYXQKLQkgKiBjb250YWlucyAiYmFyIiB3aXRoICJ5byIgaW4gYXJndW1lbnQgcmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nOiA8YnI+Ci0JICogV2hlcmUgdGhlIG5vZGVzIHRvIGJlIHJlbW92ZWQgYXJlIHJlYWQtb25seSBkZXNjZW5kYW50cyBvZiBhbgotCSAqIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4sIHRoZSA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+Ci0JICogbXVzdCBiZSByZW1vdmVkIGluc3RlYWQgb2YgdGhlIHJlYWQtb25seSBub2Rlcy4gSWYgYW55Ci0JICogPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiB0byBiZSByZW1vdmVkIGhhcyBkZXNjZW5kYW50cyB0aGF0IGFyZQotCSAqIG5vdCA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+LCA8Y29kZT5UZXh0PC9jb2RlPiwgb3IKLQkgKiA8Y29kZT5DREFUQVNlY3Rpb248L2NvZGU+IG5vZGVzLCB0aGUgPGNvZGU+cmVwbGFjZVdob2xlVGV4dDwvY29kZT4KLQkgKiBtZXRob2QgbXVzdCBmYWlsIGJlZm9yZSBwZXJmb3JtaW5nIGFueSBtb2RpZmljYXRpb24gb2YgdGhlIGRvY3VtZW50LAotCSAqIHJhaXNpbmcgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IHdpdGggdGhlIGNvZGUKLQkgKiA8Y29kZT5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI8L2NvZGU+LiA8YnI+Ci0JICogRm9yIGluc3RhbmNlLCBpbiB0aGUgZXhhbXBsZSBiZWxvdyBjYWxsaW5nCi0JICogPGNvZGU+cmVwbGFjZVdob2xlVGV4dDwvY29kZT4gb24gdGhlIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUgdGhhdAotCSAqIGNvbnRhaW5zICJiYXIiIGZhaWxzLCBiZWNhdXNlIHRoZSA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+IG5vZGUKLQkgKiAiZW50IiBjb250YWlucyBhbiA8Y29kZT5FbGVtZW50PC9jb2RlPiBub2RlIHdoaWNoIGNhbm5vdCBiZSByZW1vdmVkLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogICAgICAgICAgICBUaGUgY29udGVudCBvZiB0aGUgcmVwbGFjaW5nIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUuCi0JICogQHJldHVybiBUaGUgPGNvZGU+VGV4dDwvY29kZT4gbm9kZSBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZAotCSAqICAgICAgICAgY29udGVudC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIG9uZSBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5UZXh0PC9jb2RlPiBub2RlcyBiZWluZyByZXBsYWNlZCBpcyByZWFkb25seS4KLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFRleHQgcmVwbGFjZVdob2xlVGV4dChTdHJpbmcgY29udGVudCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JU291cmNlR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lTb3VyY2VHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczMDQ4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lTb3VyY2VHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKiAKLSAqIElTb3VyY2VHZW5lcmF0b3IgYWxsb3dzIERPTSBtb2RlbHMgdG8gZ2VuZXJhdGUgc291cmNlIGFwcHJvcHJpYXRlIGZvciB0aGVpcgotICogcGFyYW1ldGVyLCByZWxhdGl2ZSB0byB0aGUgbW9kZWwgdGhhdCBwcm92aWRlcyB0aGUgc291cmNlIGdlbmVyYXRvci4KLSAqIAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVNvdXJjZUdlbmVyYXRvciB7Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBhdHRyaWJ1dGUgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0ciAtCi0JICogICAgICAgICAgICB0aGUgQXR0cgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVBdHRyTmFtZShBdHRyIGF0dHIpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVBdHRyVmFsdWUKLQkgKiAKLQkgKiBAcGFyYW0gYXR0ciAtCi0JICogICAgICAgICAgICB0aGUgQXR0cgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVBdHRyVmFsdWUoQXR0ciBhdHRyKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlQXR0clZhbHVlCi0JICogCi0JICogQHBhcmFtIGF0dHIgLQotCSAqICAgICAgICAgICAgdGhlIEF0dHIKLQkgKiBAcGFyYW0gY2hhciAtCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBxdW90ZSBkZXNpcmVkICgnIG9yICIpLgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVBdHRyVmFsdWUoQXR0ciBhdHRyLCBjaGFyIHF1b3RlKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlQXR0clZhbHVlCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgU3RyaW5nIHZhbHVlCi0JICogQHBhcmFtIGNoYXIgLQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgcXVvdGUgZGVzaXJlZCAoJyBvciAiKS4KLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlQXR0clZhbHVlKFN0cmluZyB2YWx1ZSwgY2hhciBxdW90ZSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUNEQVRBU2VjdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWVudAotCSAqICAgICAgICAgICAgQ0RBVEFTZWN0aW9uCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUNEQVRBU2VjdGlvbihDREFUQVNlY3Rpb24gY2RhdGEpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqIEBwYXJhbSBOb2RlCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUNoaWxkKE5vZGUgcGFyZW50Tm9kZSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUNsb3NlVGFnCi0JICogCi0JICogQHBhcmFtIG5vZGUgLQotCSAqICAgICAgICAgICAgdGhlIE5vZGUKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlQ2xvc2VUYWcoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlQ29tbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQ29tbWVudAotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVDb21tZW50KENvbW1lbnQgY29tbWVudCk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZURvY3R5cGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGRvY1R5cGUKLQkgKiAgICAgICAgICAgIERvY3VtZW50VHlwZQotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVEb2N0eXBlKERvY3VtZW50VHlwZSBkb2NUeXBlKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAtCi0JICogICAgICAgICAgICBFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUVsZW1lbnQoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIGdlbmVyYXRlRW5kVGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IC0KLQkgKiAgICAgICAgICAgIEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlRW5kVGFnKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUVudGl0eVJlZiBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZW50aXR5UmVmCi0JICogICAgICAgICAgICBFbnRpdHlSZWZlcmVuY2UKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlRW50aXR5UmVmKEVudGl0eVJlZmVyZW5jZSBlbnRpdHlSZWYpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVQSSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcGkgLQotCSAqICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVBJKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZVNvdXJjZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZSAtCi0JICogICAgICAgICAgICB0aGUgTm9kZQotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVTb3VyY2UoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlU3RhcnRUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlU3RhcnRUYWcoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIEdlbmVyYXRlIHRhZyBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IC0KLQkgKiAgICAgICAgICAgIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlVGFnTmFtZShFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVUZXh0IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSB0ZXh0IC0KLQkgKiAgICAgICAgICAgIHRoZSBUZXh0Ci0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVRleHQoVGV4dCB0ZXh0KTsKLQotCS8qKgotCSAqIGdlbmVyYXRlIHRleHQgZGF0YQotCSAqIAotCSAqIEBwYXJhbSB0ZXh0IC0KLQkgKiAgICAgICAgICAgIHRoZSBUZXh0Ci0JICogQHBhcmFtIGRhdGEgLQotCSAqICAgICAgICAgICAgdGhlIGRhdGEKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlVGV4dERhdGEoVGV4dCB0ZXh0LCBTdHJpbmcgZGF0YSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Db21tZW50Tm9kZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvQ29tbWVudE5vZGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiYTkwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Db21tZW50Tm9kZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIChTVEFSKSAtIGJ1ZyAyOTY5OTkgLSBJbmVmZmljaWVudCB1c2Ugb2YgbmV3IFN0cmluZygpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWVudE5vZGVGb3JtYXR0ZXIgZXh0ZW5kcyBOb2RlRm9ybWF0dGVyIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ1IgPSAiXHIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIExGID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBhZGp1c3RJbmRlbnRhdGlvbnMoU3RyaW5nIGFTdHJpbmcsIFN0cmluZyBsaW5lSW5kZW50LCBTdHJpbmcgc2luZ2xlSW5kZW50KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBOb2RlRm9ybWF0dGVyLkVNUFRZX1NUUklORzsKLQotCQlpbnQgaW5kZXhPZkxpbmVEZWxpbWl0ZXIgPSBTdHJpbmdVdGlscy5pbmRleE9mTGluZURlbGltaXRlcihhU3RyaW5nKTsKLQkJcmVzdWx0ID0gYVN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXhPZkxpbmVEZWxpbWl0ZXIpOwotCQl3aGlsZSAoaW5kZXhPZkxpbmVEZWxpbWl0ZXIgIT0gLTEpIHsKLQkJCS8vIEJlZm9yZSBmaW5kIHRoZSBuZXh0IExpbmVEZWxpbWl0ZXIsIHdlIGhhdmUgdG8gZmlndXJlIG91dCB0aGUKLQkJCS8vIHNpemUgb2YgdGhlIGN1cnJlbnQgTGluZURlbGltaXRlcgotCQkJLy8gc28gd2UgY2FuIGZpZ3VyZSBvdXQgaG93IG1hbnkgYnl0ZXMgdG8gc2tpcCBiZWZvcmUgZmluZGluZyB0aGUKLQkJCS8vIG5leHQgTGluZURlbGltaXRlci4KLQkJCS8vIE90aGVyd2lzZSwgd2UgbWF5IHRyZWF0IHRoZSBMRiBpbiBDUkxGIGFzIHRoZSBuZXh0Ci0JCQkvLyBMaW5lRGVsaW1pdGVyLgotCQkJaW50IGxpbmVEZWxpbWl0ZXJTaXplID0gMTsKLQkJCWlmIChhU3RyaW5nLmxlbmd0aCgpID49IGluZGV4T2ZMaW5lRGVsaW1pdGVyICsgMiAmJiBhU3RyaW5nLnN1YnN0cmluZyhpbmRleE9mTGluZURlbGltaXRlciwgaW5kZXhPZkxpbmVEZWxpbWl0ZXIgKyAxKS5jb21wYXJlVG8oQ1IpID09IDAgJiYgYVN0cmluZy5zdWJzdHJpbmcoaW5kZXhPZkxpbmVEZWxpbWl0ZXIgKyAxLCBpbmRleE9mTGluZURlbGltaXRlciArIDIpLmNvbXBhcmVUbyhMRikgPT0gMCkKLQkJCQlsaW5lRGVsaW1pdGVyU2l6ZSA9IDI7Ci0KLQkJCWludCBpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXIgPSBTdHJpbmdVdGlscy5pbmRleE9mTGluZURlbGltaXRlcihhU3RyaW5nLCBpbmRleE9mTGluZURlbGltaXRlciArIGxpbmVEZWxpbWl0ZXJTaXplKTsKLQkJCWludCBpbmRleE9mTm9uYmxhbmsgPSBTdHJpbmdVdGlscy5pbmRleE9mTm9uYmxhbmsoYVN0cmluZywgaW5kZXhPZkxpbmVEZWxpbWl0ZXIpOwotCi0JCQlpZiAoaW5kZXhPZk5vbmJsYW5rICE9IC0xKSB7Ci0JCQkJaWYgKGluZGV4T2ZOZXh0TGluZURlbGltaXRlciA9PSAtMSkgewotCQkJCQkvLyBsYXN0IGxpbmU7IGNvcHkgdGlsbCB0aGUgZW5kCi0JCQkJCXJlc3VsdCArPSBsaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50ICsgYVN0cmluZy5zdWJzdHJpbmcoaW5kZXhPZk5vbmJsYW5rKTsKLQkJCQl9IGVsc2UgaWYgKGluZGV4T2ZOZXh0TGluZURlbGltaXRlciAhPSAtMSAmJiBpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXIgPCBpbmRleE9mTm9uYmxhbmspIHsKLQkJCQkJLy8gYmxhbmsgbGluZTsganVzdCBhZGQgYSBpbmRlbnQKLQkJCQkJcmVzdWx0ICs9IGxpbmVJbmRlbnQgKyBzaW5nbGVJbmRlbnQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gY29weSBhbGwgdGV4dCBiZXR3ZWVuIGluZGV4T2ZOb25ibGFuayBhbmQKLQkJCQkJLy8gaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyCi0JCQkJCXJlc3VsdCArPSBsaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50ICsgYVN0cmluZy5zdWJzdHJpbmcoaW5kZXhPZk5vbmJsYW5rLCBpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXIpOwotCQkJCX0KLQotCQkJCWluZGV4T2ZMaW5lRGVsaW1pdGVyID0gaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyID09IC0xKSB7Ci0JCQkJCXJlc3VsdCArPSBsaW5lSW5kZW50OwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGJsYW5rIGxpbmU7IGp1c3QgYWRkIGEgaW5kZW50Ci0JCQkJCXJlc3VsdCArPSBsaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50OwotCQkJCX0KLQotCQkJCWluZGV4T2ZMaW5lRGVsaW1pdGVyID0gaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCS8vIGxpbmVEZWxpbWl0ZXJGb3VuZCBtZWFucyBtdWx0aSBsaW5lIGNvbW1lbnQKLQkJCVN0cmluZyBub2RlVmFsdWUgPSBub2RlLmdldE5vZGVWYWx1ZSgpOwotCQkJYm9vbGVhbiBsaW5lRGVsaW1pdGVyRm91bmRJbkNvbW1lbnQgPSBTdHJpbmdVdGlscy5jb250YWluc0xpbmVEZWxpbWl0ZXIobm9kZVZhbHVlKTsKLQotCQkJaWYgKGxpbmVEZWxpbWl0ZXJGb3VuZEluQ29tbWVudCkgewotCQkJCS8vIGZvcm1hdCBpbmRlbnRhdGlvbiBiZWZvcmUgbm9kZQotCQkJCWZvcm1hdEluZGVudGF0aW9uQmVmb3JlTm9kZShub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQotCQkJCS8vIGFkanVzdCBpbmRlbnRhdGlvbnMgaW4gbXVsdGkgbGluZSBjb21tZW50Ci0JCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZURlbGltaXRlcigpOwotCQkJCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0JCQkJU3RyaW5nIHNpbmdsZUluZGVudCA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0SW5kZW50KCk7Ci0JCQkJU3RyaW5nIG5ld05vZGV2YWx1ZSA9IGFkanVzdEluZGVudGF0aW9ucyhub2RlVmFsdWUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50LCBzaW5nbGVJbmRlbnQpOwotCQkJCWlmIChub2RlVmFsdWUuY29tcGFyZVRvKG5ld05vZGV2YWx1ZSkgIT0gMCkKLQkJCQkJbm9kZS5zZXROb2RlVmFsdWUobmV3Tm9kZXZhbHVlKTsKLQkJCX0KLQotCQkJaWYgKCFub2RlSGFzU2libGluZ3Mobm9kZSkgfHwgKG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkgIT0gbnVsbCAmJiBub2RlLmdldFByZXZpb3VzU2libGluZygpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgIVN0cmluZ1V0aWxzLmNvbnRhaW5zTGluZURlbGltaXRlcihub2RlLmdldFByZXZpb3VzU2libGluZygpLmdldE5vZGVWYWx1ZSgpKSAmJiBub2RlLmdldE5leHRTaWJsaW5nKCkgPT0gbnVsbCkpIHsKLQkJCQkvLyBzaW5nbGUgY2hpbGQKLQkJCQkvLyBvciBpbmxpbmUgY29tbWVudCBhZnRlciB0ZXh0Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfSBlbHNlCi0JCQkJLy8gZm9ybWF0IGluZGVudGF0aW9uIGFmdGVyIG5vZGUKLQkJCQlmb3JtYXRJbmRlbnRhdGlvbkFmdGVyTm9kZShub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L0RvY3VtZW50Tm9kZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRG9jdW1lbnROb2RlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5N2RmMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRG9jdW1lbnROb2RlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIHhtbDpzcGFjZT0ncHJlc2VydmUnIHN1cHBvcnQKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLQotcHVibGljIGNsYXNzIERvY3VtZW50Tm9kZUZvcm1hdHRlciBleHRlbmRzIE5vZGVGb3JtYXR0ZXIgewotCXByb3RlY3RlZCB2b2lkIGZvcm1hdENoaWxkcmVuKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCVN0cmluZyBzaW5nbGVJbmRlbnQgPSBnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldEluZGVudCgpOwotCQlTdHJpbmcgbGluZUluZGVudCA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q3VycmVudEluZGVudCgpOwotCi0JCWlmIChub2RlICE9IG51bGwgJiYgKGZQcm9ncmVzc01vbml0b3IgPT0gbnVsbCB8fCAhZlByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpKSB7Ci0JCQkvLyBub3JtYWxpemUgbm9kZSBmaXJzdCB0byBjb21iaW5lIGFkamFjZW50IHRleHQgbm9kZXMKLQkJCW5vZGUubm9ybWFsaXplKCk7Ci0KLQkJCUlET01Ob2RlIG5leHRDaGlsZCA9IChJRE9NTm9kZSkgbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAobmV4dENoaWxkICE9IG51bGwpIHsKLQkJCQlJRE9NTm9kZSBlYWNoQ2hpbGROb2RlID0gbmV4dENoaWxkOwotCQkJCW5leHRDaGlsZCA9IChJRE9NTm9kZSkgZWFjaENoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IGdldEZvcm1hdHRlcihlYWNoQ2hpbGROb2RlKTsKLQkJCQlJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgY2hpbGRGb3JtYXRDb250cmFpbnRzID0gZm9ybWF0dGVyLmdldEZvcm1hdENvbnRyYWludHMoKTsKLQkJCQlTdHJpbmcgY2hpbGRJbmRlbnQgPSBsaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50OwotCQkJCWNoaWxkRm9ybWF0Q29udHJhaW50cy5zZXRDdXJyZW50SW5kZW50KGNoaWxkSW5kZW50KTsKLQkJCQljaGlsZEZvcm1hdENvbnRyYWludHMuc2V0Q2xlYXJBbGxCbGFua0xpbmVzKGZvcm1hdENvbnRyYWludHMuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCkpOwotCQkJCWNoaWxkRm9ybWF0Q29udHJhaW50cy5zZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KGZvcm1hdENvbnRyYWludHMuZ2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCgpKTsKLQotCQkJCS8vIGZvcm1hdCBlYWNoIGNoaWxkCi0JCQkJZm9ybWF0dGVyLmZvcm1hdChlYWNoQ2hpbGROb2RlLCBjaGlsZEZvcm1hdENvbnRyYWludHMpOwotCi0JCQkJaWYgKG5leHRDaGlsZCAhPSBudWxsICYmIG5leHRDaGlsZC5nZXRQYXJlbnROb2RlKCkgPT0gbnVsbCkKLQkJCQkJLy8gbmV4dE5vZGUgaXMgZGVsZXRlZCBkdXJpbmcgZm9ybWF0Ci0JCQkJCW5leHRDaGlsZCA9IChJRE9NTm9kZSkgZWFjaENoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJZm9ybWF0Q2hpbGRyZW4obm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRWxlbWVudE5vZGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L0VsZW1lbnROb2RlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYWY1NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRWxlbWVudE5vZGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSB4bWw6c3BhY2U9J3ByZXNlcnZlJyBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BdHRySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgRWxlbWVudE5vZGVGb3JtYXR0ZXIgZXh0ZW5kcyBEb2N1bWVudE5vZGVGb3JtYXR0ZXIgewotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGNoYXIgRE9VQkxFX1FVT1RFID0gJyInOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRE9VQkxFX1FVT1RFUyA9ICJcIlwiIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgY2hhciBFUVVBTF9DSEFSID0gJz0nOyAvLyBlcXVhbCBzaWduJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUFJFU0VSVkUgPSAicHJlc2VydmUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUFJFU0VSVkVfUVVPVEVEID0gIlwicHJlc2VydmVcIiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGNoYXIgU0lOR0xFX1FVT1RFID0gJ1wnJzsvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFhNTF9TUEFDRSA9ICJ4bWw6c3BhY2UiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBjaGFyIFNQQUNFX0NIQVIgPSAnICc7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWFNMX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFhTTF9BVFRSSUJVVEUgPSAiYXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBYU0xfVEVYVCA9ICJ0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0RW5kVGFnKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCWlmICghaXNFbmRUYWdNaXNzaW5nKG5vZGUpKSB7Ci0JCQkvLyBlbmQgdGFnIGV4aXN0cwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJCVN0cmluZyBub2RlSW5kZW50YXRpb24gPSBnZXROb2RlSW5kZW50KG5vZGUpOwotCQkJSURPTU5vZGUgbGFzdENoaWxkID0gKElET01Ob2RlKSBub2RlLmdldExhc3RDaGlsZCgpOwotCQkJaWYgKGxhc3RDaGlsZCAhPSBudWxsICYmIGxhc3RDaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJaWYgKGlzRW5kVGFnTWlzc2luZyhsYXN0Q2hpbGQpKSB7Ci0JCQkJCS8vIGZpbmQgZGVlcGVzdCBjaGlsZAotCQkJCQlJRE9NTm9kZSBkZWVwZXN0Q2hpbGQgPSAoSURPTU5vZGUpIGxhc3RDaGlsZC5nZXRMYXN0Q2hpbGQoKTsKLQkJCQkJd2hpbGUgKGRlZXBlc3RDaGlsZCAhPSBudWxsICYmIGRlZXBlc3RDaGlsZC5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmIGlzRW5kVGFnTWlzc2luZyhkZWVwZXN0Q2hpbGQpKSB7Ci0JCQkJCQlsYXN0Q2hpbGQgPSBkZWVwZXN0Q2hpbGQ7Ci0JCQkJCQlkZWVwZXN0Q2hpbGQgPSAoSURPTU5vZGUpIGRlZXBlc3RDaGlsZC5nZXRMYXN0Q2hpbGQoKTsKLQkJCQkJfQotCi0JCQkJCWlmIChkZWVwZXN0Q2hpbGQgIT0gbnVsbCkgewotCQkJCQkJaWYgKGRlZXBlc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCQkJLy8gU3BlY2lhbCBpbmRlbnRhdGlvbiBoYW5kbGluZyBpZiBsYXN0Q2hpbGQncyBlbmQKLQkJCQkJCQkvLyB0YWcgaXMgbWlzc2luZyBhbmQgZGVlcGVzdENoaWxkIGlzIGEgdGV4dCBub2RlLgotCQkJCQkJCVN0cmluZyBub2RlVGV4dCA9IGRlZXBlc3RDaGlsZC5nZXROb2RlVmFsdWUoKTsKLQotCQkJCQkJCWlmICghbm9kZVRleHQuZW5kc1dpdGgobGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbikpIHsKLQkJCQkJCQkJbm9kZVRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgobm9kZVRleHQsIGxpbmVEZWxpbWl0ZXIpOwotCQkJCQkJCQlub2RlVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChub2RlVGV4dCwgbm9kZUluZGVudGF0aW9uKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKGRlZXBlc3RDaGlsZCwgbm9kZVRleHQpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCWluc2VydEFmdGVyTm9kZShsYXN0Q2hpbGQsIGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJLy8gaW5kZW50IGVuZCB0YWcKLQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKGxhc3RDaGlsZCwgbGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChsYXN0Q2hpbGQgPT0gbnVsbCAmJiBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5zTGluZURlbGltaXRlcnMobm9kZSkpIHsKLQkJCQkvLyBCVUcxNzQyNDMgZG8gbm90IGluZGVudCBlbmQgdGFnIGlmIG5vZGUgaGFzIGVtcHR5IGNvbnRlbnQKLQkJCQkvLyAob3RoZXJ3aXNlIG5ldyB0ZXh0IG5vZGUgd291bGQgYmUgaW50cm9kdWNlZCkKLQkJCQlNb2RlbFF1ZXJ5QWRhcHRlciBhZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSAoKElET01Eb2N1bWVudCkgbm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgYWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCkuZ2V0Q01Ob2RlKG5vZGUpOwotCQkJCWlmICgoZWxlbWVudERlY2xhcmF0aW9uID09IG51bGwpIHx8IChlbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGVudFR5cGUoKSAhPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkpIHsKLQkJCQkJLy8gaW5kZW50IGVuZCB0YWcKLQkJCQkJcmVwbGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKSwgMCwgbGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbik7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBmb3JtYXQgZW5kIHRhZyBuYW1lCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpID49IDMpIHsKLQkJCQlJVGV4dFJlZ2lvbiBlbmRUYWdOYW1lUmVnaW9uID0gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJcmVtb3ZlUmVnaW9uU3BhY2VzKG5vZGUsIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZW5kVGFnTmFtZVJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCS8vIGZvcm1hdCBpbmRlbnRhdGlvbiBiZWZvcmUgbm9kZQotCQkJZm9ybWF0SW5kZW50YXRpb25CZWZvcmVOb2RlKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCi0JCQkvLyBmb3JtYXQgc3RhcnQgdGFnCi0JCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQkJCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQotCQkJYm9vbGVhbiBjdXJyZW50bHlJblhtbFNwYWNlUHJlc2VydmUgPSBmb3JtYXRDb250cmFpbnRzLmdldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoKTsKLQkJCWZvcm1hdFN0YXJ0VGFnKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCQkJLy8gc2F2ZSBuZXcgbm9kZQotCQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXdOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJCS8vIGZvcm1hdCBjaGlsZHJlbiBhbmQgZW5kIHRhZyBpZiBub3QgZW1wdHkgc3RhcnQgdGFnCi0JCQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCQkvLyBmb3JtYXQgY2hpbGRyZW4KLQkJCQkJZm9ybWF0Q2hpbGRyZW4obmV3Tm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0KLQkJCQkJLy8gc2F2ZSBuZXcgbm9kZQotCQkJCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsKLQotCQkJCQkvLyBmb3JtYXQgZW5kIHRhZwotCQkJCQlmb3JtYXRFbmRUYWcobmV3Tm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JCQkJfQotCQkJfQotCi0JCQlmb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoY3VycmVudGx5SW5YbWxTcGFjZVByZXNlcnZlKTsKLQkJCS8vIG9ubHkgaW5kZW50IGlmIG5vdCBhdCBsYXN0IG5vZGUKLQkJCWlmIChuZXdOb2RlICE9IG51bGwgJiYgbmV3Tm9kZS5nZXROZXh0U2libGluZygpICE9IG51bGwpCi0JCQkJLy8gZm9ybWF0IGluZGVudGF0aW9uIGFmdGVyIG5vZGUKLQkJCQlmb3JtYXRJbmRlbnRhdGlvbkFmdGVyTm9kZShuZXdOb2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGZvcm1hdHMgdGhlIHN0YXJ0IHRhZyBuYW1lLCBhbmQgZm9ybWF0cyB0aGUgYXR0cmlidXRlcyBpZgotCSAqIGF2YWlsYWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRTdGFydFRhZyhJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwgcHJlZmVyZW5jZXMgPSAoU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBnZXRGb3JtYXRQcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgc2luZ2xlSW5kZW50ID0gcHJlZmVyZW5jZXMuZ2V0SW5kZW50KCk7Ci0JCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0JCVN0cmluZyBhdHRySW5kZW50ID0gbGluZUluZGVudCArIHNpbmdsZUluZGVudDsKLQkJYm9vbGVhbiBzcGxpdE11bHRpQXR0cnMgPSBwcmVmZXJlbmNlcy5nZXRTcGxpdE11bHRpQXR0cnMoKTsKLQkJYm9vbGVhbiBhbGlnbkVuZEJyYWNrZXQgPSBwcmVmZXJlbmNlcy5pc0FsaWduRW5kQnJhY2tldCgpOwotCQlib29sZWFuIHNhd1htbFNwYWNlID0gZmFsc2U7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkvLyBOb3RlOiBhdHRyaWJ1dGVzIHNob3VsZCBub3QgYmUgbnVsbCBldmVuIGlmIHRoZSBub2RlIGhhcyBubwotCQkvLyBhdHRyaWJ1dGVzLiBIb3dldmVyLCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpIHdpbGwgYmUgMC4gQnV0LCBjaGVjawotCQkvLyBmb3IgbnVsbCBqdXN0IGluIGNhc2UuCi0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCS8vIGNvbXB1dGUgY3VycmVudCBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJaW50IGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggPSAwOwotCQkJdHJ5IHsKLQkJCQkvLyAxIGlzIGZvciAiPCIKLQkJCQlpbnQgbm9kZU5hbWVPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyAxICsgbm9kZS5nZXROb2RlTmFtZSgpLmxlbmd0aCgpOwotCQkJCWludCBsaW5lT2Zmc2V0ID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChub2RlTmFtZU9mZnNldCkuZ2V0T2Zmc2V0KCk7Ci0JCQkJU3RyaW5nIHRleHQgPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldChsaW5lT2Zmc2V0LCBub2RlTmFtZU9mZnNldCAtIGxpbmVPZmZzZXQpOwotCQkJCWludCB1c2VkV2lkdGggPSBnZXRJbmRlbnRhdGlvbkxlbmd0aCh0ZXh0KTsKLQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID0gcHJlZmVyZW5jZXMuZ2V0TGluZVdpZHRoKCkgLSB1c2VkV2lkdGg7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCi0JCQlTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZURlbGltaXRlcigpOwotCQkJaW50IGF0dHJMZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQkJaW50IGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQgPSAwOwotCQkJYm9vbGVhbiBzdGFydFRhZ1NwYW5zT3ZlcjFMaW5lID0gZmFsc2U7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0ckxlbmd0aDsgaSsrKSB7Ci0JCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBhdHRyLmdldE5hbWVSZWdpb24oKTsKLQkJCQlJVGV4dFJlZ2lvbiBlcXVhbFJlZ2lvbiA9IGF0dHIuZ2V0RXF1YWxSZWdpb24oKTsKLQkJCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IGF0dHIuZ2V0VmFsdWVSZWdpb24oKTsKLQotCQkJCS8vIGFwcGVuZCB1bmRlZmluZWQgcmVnaW9ucwotCQkJCVN0cmluZyB1bmRlZmluZWRSZWdpb24gPSBnZXRVbmRlZmluZWRSZWdpb25zKG5vZGUsIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQsIGF0dHIuZ2V0U3RhcnRPZmZzZXQoKSAtIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQpOwotCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQodW5kZWZpbmVkUmVnaW9uKTsKLQkJCQlsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0ID0gYXR0ci5nZXRTdGFydE9mZnNldCgpOwotCi0JCQkJLy8gY2hlY2sgZm9yIHhtbDpzcGFjZSBhdHRyaWJ1dGUKLQkJCQlpZiAoZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKS5jb21wYXJlVG8oWE1MX1NQQUNFKSA9PSAwKSB7Ci0JCQkJCWlmICh2YWx1ZVJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCQkvLyBbMTExNjc0XSBJZiBub3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4geWV0LCB0cmVhdCBhcwotCQkJCQkJLy8gcHJlc2VydmUsIGJ1dCBvbmx5IGFzIGhpbnQKLQkJCQkJCWZvcm1hdENvbnRyYWludHMuc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCh0cnVlKTsKLQkJCQkJCS8vIE5vdGUgd2UgZG9uJ3Qgc2V0ICdzYXdYbWxTcGFjZScsIHNvIHRoYXQgZGVmYXVsdCBvcgotCQkJCQkJLy8gZml4ZWQgRFREL1hTRCB2YWx1ZXMgbWF5IG92ZXJyaWRlLgotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJSVNvdXJjZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBub2RlLmdldE1vZGVsKCkuZ2V0R2VuZXJhdG9yKCk7Ci0JCQkJCQlTdHJpbmcgbmV3QXR0clZhbHVlID0gZ2VuZXJhdG9yLmdlbmVyYXRlQXR0clZhbHVlKGF0dHIpOwotCi0JCQkJCQkvLyBUaGVyZSBpcyBhIHByb2JsZW0gaW4KLQkJCQkJCS8vIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0QXR0clZhbHVlKElUZXh0UmVnaW9uKQotCQkJCQkJLy8gd2hlbiB0aGUgcmVnaW9uIGlzIGluc3RhbmNlb2YgQ29udGV4dFJlZ2lvbi4KLQkJCQkJCS8vIFdvcmthcm91bmQgZm9yIG5vdy4KLQkJCQkJCWlmIChmbGF0Tm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKS5sZW5ndGgoKSA9PSAxKSB7Ci0JCQkJCQkJY2hhciBmaXJzdENoYXIgPSBmbGF0Tm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKS5jaGFyQXQoMCk7Ci0JCQkJCQkJaWYgKChmaXJzdENoYXIgPT0gRE9VQkxFX1FVT1RFKSB8fCAoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URSkpCi0JCQkJCQkJCW5ld0F0dHJWYWx1ZSA9IERPVUJMRV9RVU9URVM7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChuZXdBdHRyVmFsdWUuY29tcGFyZVRvKFBSRVNFUlZFX1FVT1RFRCkgPT0gMCkKLQkJCQkJCQlmb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQodHJ1ZSk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZm9ybWF0Q29udHJhaW50cy5zZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KGZhbHNlKTsKLQkJCQkJCXNhd1htbFNwYWNlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChzcGxpdE11bHRpQXR0cnMgJiYgYXR0ckxlbmd0aCA+IDEpIHsKLQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChsaW5lRGVsaW1pdGVyICsgYXR0ckluZGVudCk7Ci0JCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKSk7Ci0JCQkJCXN0YXJ0VGFnU3BhbnNPdmVyMUxpbmUgPSB0cnVlOwotCQkJCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJLy8gYXBwZW5kIHVuZGVmaW5lZCByZWdpb25zCi0JCQkJCQl1bmRlZmluZWRSZWdpb24gPSBnZXRVbmRlZmluZWRSZWdpb25zKG5vZGUsIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQsIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KGVxdWFsUmVnaW9uKSAtIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQpOwotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCh1bmRlZmluZWRSZWdpb24pOwotCQkJCQkJbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KGVxdWFsUmVnaW9uKTsKLQotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChFUVVBTF9DSEFSKTsKLQotCQkJCQkJLy8gYXBwZW5kIHVuZGVmaW5lZCByZWdpb25zCi0JCQkJCQl1bmRlZmluZWRSZWdpb24gPSBnZXRVbmRlZmluZWRSZWdpb25zKG5vZGUsIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQsIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKSAtIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQpOwotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCh1bmRlZmluZWRSZWdpb24pOwotCQkJCQkJbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKTsKLQotCQkJCQkJLy8gTm90ZTogdHJpbSgpIHNob3VsZCBub3QgYmUgbmVlZGVkIGZvcgotCQkJCQkJLy8gdmFsdWVSZWdpb24uZ2V0VGV4dCgpLiBKdXN0IGEgd29ya2Fyb3VuZCBmb3IgYQotCQkJCQkJLy8gcHJvYmxlbSBmb3VuZCBpbiB2YWx1ZVJlZ2lvbiBmb3Igbm93LgotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKS50cmltKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJaW50IHRleHRMZW5ndGggPSAxICsgZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKS5sZW5ndGgoKSArIDEgKyBmbGF0Tm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKS5sZW5ndGgoKTsKLQkJCQkJCWlmIChpID09IGF0dHJMZW5ndGggLSAxKSB7Ci0JCQkJCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQkJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQkJCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJCQkJCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKQotCQkJCQkJCQkJLy8gMyBpcyBmb3IgIiAvPiIKLQkJCQkJCQkJCXRleHRMZW5ndGggKz0gMzsKLQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJLy8gMSBpcyBmb3IgIj4iCi0JCQkJCQkJCQl0ZXh0TGVuZ3RoKys7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlpZiAoY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA+PSB0ZXh0TGVuZ3RoKSB7Ci0JCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChTUEFDRV9DSEFSKTsKLQkJCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoLS07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGxpbmVEZWxpbWl0ZXIgKyBhdHRySW5kZW50KTsKLQkJCQkJCQlzdGFydFRhZ1NwYW5zT3ZlcjFMaW5lID0gdHJ1ZTsKLQkJCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID0gcHJlZmVyZW5jZXMuZ2V0TGluZVdpZHRoKCkgLSBhdHRySW5kZW50Lmxlbmd0aCgpOwotCQkJCQkJfQotCi0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikpOwotCi0JCQkJCQkvLyBhcHBlbmQgdW5kZWZpbmVkIHJlZ2lvbnMKLQkJCQkJCXVuZGVmaW5lZFJlZ2lvbiA9IGdldFVuZGVmaW5lZFJlZ2lvbnMobm9kZSwgbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCwgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoZXF1YWxSZWdpb24pIC0gbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCk7Ci0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHVuZGVmaW5lZFJlZ2lvbik7Ci0JCQkJCQlsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoZXF1YWxSZWdpb24pOwotCi0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKEVRVUFMX0NIQVIpOwotCi0JCQkJCQkvLyBhcHBlbmQgdW5kZWZpbmVkIHJlZ2lvbnMKLQkJCQkJCXVuZGVmaW5lZFJlZ2lvbiA9IGdldFVuZGVmaW5lZFJlZ2lvbnMobm9kZSwgbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCwgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pIC0gbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCk7Ci0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHVuZGVmaW5lZFJlZ2lvbik7Ci0JCQkJCQlsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pOwotCi0JCQkJCQkvLyBOb3RlOiB0cmltKCkgc2hvdWxkIG5vdCBiZSBuZWVkZWQgZm9yCi0JCQkJCQkvLyB2YWx1ZVJlZ2lvbi5nZXRUZXh0KCkuIEp1c3QgYSB3b3JrYXJvdW5kIGZvciBhCi0JCQkJCQkvLyBwcm9ibGVtIGZvdW5kIGluIHZhbHVlUmVnaW9uIGZvciBub3cuCi0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQodmFsdWVSZWdpb24pLnRyaW0oKSk7Ci0KLQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggLT0gZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKS5sZW5ndGgoKTsKLQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGgtLTsKLQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggLT0gZmxhdE5vZGUuZ2V0VGV4dCh2YWx1ZVJlZ2lvbikudHJpbSgpLmxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggPj0gMSArIGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikubGVuZ3RoKCkpIHsKLQkJCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKFNQQUNFX0NIQVIpOwotCQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGgtLTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQobGluZURlbGltaXRlciArIGF0dHJJbmRlbnQpOwotCQkJCQkJCXN0YXJ0VGFnU3BhbnNPdmVyMUxpbmUgPSB0cnVlOwotCQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRMaW5lV2lkdGgoKSAtIGF0dHJJbmRlbnQubGVuZ3RoKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKSk7Ci0KLQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggLT0gZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKS5sZW5ndGgoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gYXBwZW5kIHVuZGVmaW5lZCByZWdpb25zCi0JCQlTdHJpbmcgdW5kZWZpbmVkUmVnaW9uID0gZ2V0VW5kZWZpbmVkUmVnaW9ucyhub2RlLCBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0LCBub2RlLmdldEVuZE9mZnNldCgpIC0gbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHVuZGVmaW5lZFJlZ2lvbik7Ci0KLQkJCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCS8vIDEgaXMgZm9yICI8IgotCQkJaW50IG9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArIDEgKyBub2RlLmdldE5vZGVOYW1lKCkubGVuZ3RoKCk7Ci0JCQkvLyAxIGlzIGZvciAiPCIKLQkJCWludCBsZW5ndGggPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dExlbmd0aCgpIC0gMSAtIG5vZGUuZ2V0Tm9kZU5hbWUoKS5sZW5ndGgoKTsKLQotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCQlJVGV4dFJlZ2lvbiBmaXJzdFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCi0JCQkJaWYgKGZpcnN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pCi0JCQkJCS8vIHNraXAgZm9ybWF0dGluZyBmb3IgZW5kIHRhZ3MgaW4gdGhpcyBmb3JtYXQ6IDwvdGFnTmFtZT4KLQkJCQkJcmV0dXJuOwotCQkJCWVsc2UgewotCQkJCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IGxhc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkKLQkJCQkJCWxlbmd0aCA9IGxlbmd0aCAtIGxhc3RSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0KLQkJCQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCQkJLy8gbGVhdmUgc3BhY2UgYmVmb3JlIFhNTF9FTVBUWV9UQUdfQ0xPU0U6IDx0YWdOYW1lIC8+Ci0JCQkJCQkvLyB1bmxlc3MgYWxyZWFkeSBnb2luZyB0byBtb3ZlIGVuZCBicmFja2V0Ci0JCQkJCQlpZiAoIXN0YXJ0VGFnU3BhbnNPdmVyMUxpbmUgfHwgIWFsaWduRW5kQnJhY2tldCkKLQkJCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKFNQQUNFX0NIQVIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoc3RhcnRUYWdTcGFuc092ZXIxTGluZSAmJiBhbGlnbkVuZEJyYWNrZXQpIHsKLQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGxpbmVEZWxpbWl0ZXIpLmFwcGVuZChsaW5lSW5kZW50KTsKLQkJCX0KLQotCQkJcmVwbGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKSk7Ci0KLQkJCS8vIEJVRzEwODA3NCAmIEJVRzg0Njg4IC0gcHJlc2VydmUgd2hpdGVzcGFjZSBpbiB4c2w6dGV4dCAmCi0JCQkvLyB4c2w6YXR0cmlidXRlCi0JCQlTdHJpbmcgbm9kZU5hbWVzcGFjZVVSSSA9IG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQlpZiAoWFNMX05BTUVTUEFDRS5lcXVhbHMobm9kZU5hbWVzcGFjZVVSSSkpIHsKLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSAoKEVsZW1lbnQpIG5vZGUpLmdldExvY2FsTmFtZSgpOwotCQkJCWlmIChYU0xfQVRUUklCVVRFLmVxdWFscyhub2RlTmFtZSkgfHwgWFNMX1RFWFQuZXF1YWxzKG5vZGVOYW1lKSkgewotCQkJCQlzYXdYbWxTcGFjZSA9IHRydWU7Ci0JCQkJCWZvcm1hdENvbnRyYWludHMuc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIElmIHdlIGRpZG4ndCBzZWUgYSB4bWw6c3BhY2UgYXR0cmlidXRlIGFib3ZlLCB3ZSdsbCBsb29rIGZvcgotCQkJLy8gb25lIGluIHRoZSBEVEQuCi0JCQkvLyBXZSBkbyBub3QgY2hlY2sgZm9yIGEgY29uZmxpY3QgYmV0d2VlbiBhIERURCdzICdmaXhlZCcgdmFsdWUKLQkJCS8vIGFuZCB0aGUgYXR0cmlidXRlIHZhbHVlIGZvdW5kIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCwgd2UKLQkJCS8vIGxlYXZlIHRoYXQgdG8gdGhlIHZhbGlkYXRvci4KLQkJCWlmICghc2F3WG1sU3BhY2UpIHsKLQkJCQlNb2RlbFF1ZXJ5QWRhcHRlciBhZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSAoKElET01Eb2N1bWVudCkgbm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgYWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCkuZ2V0Q01Ob2RlKG5vZGUpOwotCQkJCWlmIChlbGVtZW50RGVjbGFyYXRpb24gIT0gbnVsbCkgewotCQkJCQlpbnQgY29udGVudFR5cGUgPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCQkJaWYgKHByZWZlcmVuY2VzLmlzUHJlc2VydmVQQ0RBVEFDb250ZW50KCkgJiYgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBKSB7Ci0JCQkJCQlmb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlDTU5hbWVkTm9kZU1hcCBjbUF0dHJpYnV0ZXMgPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJLy8gQ2hlY2sgaW1wbGllZCB2YWx1ZXMgZnJvbSB0aGUgRFREIHdheS4KLQkJCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlRGVjbGFyYXRpb24gPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21BdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShYTUxfU1BBQ0UpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZURlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQkJCQkvLyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGZvdW5kLCBjaGVjayBpdCBvdXQuCi0JCQkJCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldEF0dHJUeXBlKCkuZ2V0SW1wbGllZFZhbHVlKCk7Ci0KLQkJCQkJCQkvLyB4bWw6c3BhY2U9InByZXNlcnZlIiBtZWFucyBwcmVzZXJ2ZSBzcGFjZSwKLQkJCQkJCQkvLyBldmVyeXRoaW5nIGVsc2UgbWVhbnMgYmFjayB0byBkZWZhdWx0LgotCQkJCQkJCWlmIChQUkVTRVJWRS5jb21wYXJlVG8oZGVmYXVsdFZhbHVlKSA9PSAwKQotCQkJCQkJCQlmb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQodHJ1ZSk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlmb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbmRlZmluZWRSZWdpb25zKElET01Ob2RlIG5vZGUsIGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gTm9kZUZvcm1hdHRlci5FTVBUWV9TVFJJTkc7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpbnQgcmVnaW9uU3RhcnRPZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCi0JCQlpZiAocmVnaW9uVHlwZS5jb21wYXJlVG8oRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQpID09IDAgJiYgcmVnaW9uU3RhcnRPZmZzZXQgPj0gc3RhcnRPZmZzZXQgJiYgcmVnaW9uU3RhcnRPZmZzZXQgPCBzdGFydE9mZnNldCArIGxlbmd0aCkKLQkJCQlyZXN1bHQgPSByZXN1bHQgKyBmbGF0Tm9kZS5nZXRGdWxsVGV4dChyZWdpb24pOwotCQl9Ci0KLQkJaWYgKHJlc3VsdC5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gU1BBQ0VfQ0hBUiArIHJlc3VsdC50cmltKCk7Ci0JCWVsc2UKLQkJCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRm9ybWF0UHJvY2Vzc29yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Gb3JtYXRQcm9jZXNzb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc5OGRiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Gb3JtYXRQcm9jZXNzb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5BYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEZvcm1hdFByb2Nlc3NvclhNTCBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZkZvcm1hdFByZWZlcmVuY2VzID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuICJ4bWwiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmRm9ybWF0UHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkZvcm1hdFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCgpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldExpbmVXaWR0aChwcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCQkJKChTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGZGb3JtYXRQcmVmZXJlbmNlcykuc2V0U3BsaXRNdWx0aUF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQkJCSgoU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBmRm9ybWF0UHJlZmVyZW5jZXMpLnNldEFsaWduRW5kQnJhY2tldChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQUxJR05fRU5EX0JSQUNLRVQpKTsKLQkJCQkoKFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5zZXRQcmVzZXJ2ZVBDREFUQUNvbnRlbnQocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBSRVNFUlZFX0NEQVRBQ09OVEVOVCkpOwotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRDbGVhckFsbEJsYW5rTGluZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCi0JCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJCWlmIChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJCX0KLQkJCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJCX0KLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KGluZGVudC50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmRm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0dGVyIGdldEZvcm1hdHRlcihOb2RlIG5vZGUpIHsKLQkJLy8gMjYyMTM1IC0gTlBFIGR1cmluZyBmb3JtYXQgb2YgZW1wdHkgZG9jdW1lbnQKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBudWxsOwotCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBFbGVtZW50Tm9kZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgVGV4dE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vTW92ZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgQ29tbWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBEb2N1bWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vTW92ZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZGVmYXVsdCA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgTm9kZUZvcm1hdHRlcigpOwotCQkJfQotCQl9Ci0KLQkJLy8gaW5pdCBmb21hdHRlcgotCQlmb3JtYXR0ZXIuc2V0Rm9ybWF0UHJlZmVyZW5jZXMoZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSk7Ci0JCWZvcm1hdHRlci5zZXRQcm9ncmVzc01vbml0b3IoZlByb2dyZXNzTW9uaXRvcik7Ci0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvcm1hdFByZWZlcmVuY2VzKCkgewotCQlmRm9ybWF0UHJlZmVyZW5jZXMgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L05vTW92ZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvTm9Nb3ZlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNjhlY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvTm9Nb3ZlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogRm9ybWF0cyBlbnRpdGllcyB3aGljaCByZWFsbHkgbmVlZCBubyBmb3JtYXR0aW5nLiBUaGV5IGFyZSBqdXN0IGxpa2UgdGV4dAotICogbm9kZXMuCi0gKi8KLWNsYXNzIE5vTW92ZUZvcm1hdHRlciBleHRlbmRzIE5vZGVGb3JtYXR0ZXIgewotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEluZGVudGF0aW9uQmVmb3JlTm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBub2RlIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRJbmRlbnRhdGlvbkFmdGVyTm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBzdGlsbCBkbyBub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvTm9kZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvTm9kZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhlZDE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L05vZGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSB4bWw6c3BhY2U9J3ByZXNlcnZlJyBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNEQVRBU2VjdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNoYXJhY3RlckRhdGFJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Db21tZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuVGFnTmFtZVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBOb2RlRm9ybWF0dGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgewotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgY2hhciBTUEFDRV9DSEFSID0gJyAnOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgY2hhciBUQUJfQ0hBUiA9ICdcdCc7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFCID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZkZvcm1hdENvbnRyYWludHMgPSBudWxsOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGZGb3JtYXRQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5zTGluZURlbGltaXRlcnMoSURPTU5vZGUgbm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCVN0cmluZyBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblRleHQgPSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQkJcmVzdWx0ID0gU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVGV4dCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdChOb2RlIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMgPSBnZXRGb3JtYXRDb250cmFpbnRzKCk7Ci0KLQkJZm9ybWF0KG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdChOb2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCWlmIChmb3JtYXRDb250cmFpbnRzLmdldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KCkpCi0JCQlmb3JtYXRDb250cmFpbnRzLnNldEN1cnJlbnRJbmRlbnQoZ2V0U2libGluZ0luZGVudChub2RlKSk7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLQkJCWZvcm1hdE5vZGUoKElET01Ob2RlKSBub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRJbmRlbnRhdGlvbkFmdGVyTm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBbMTExNjc0XSBJZiBpbnNpZGUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZWxlbWVudCwgd2UgYmFpbAotCQlpZiAoZm9ybWF0Q29udHJhaW50cy5nZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCkpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUlET01Ob2RlIG5leHRTaWJsaW5nID0gKElET01Ob2RlKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZ2V0TGluZURlbGltaXRlcihub2RlLCBkb2MpOwotCi0JCQlpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkgewotCQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkKLQkJCQkJaWYgKG5leHRTaWJsaW5nICE9IG51bGwpCi0JCQkJCQlpZiAobmV4dFNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCQlnZXRGb3JtYXR0ZXIobmV4dFNpYmxpbmcpLmZvcm1hdChuZXh0U2libGluZywgZm9ybWF0Q29udHJhaW50cyk7Ci0JCQkJCQllbHNlIGlmIChuZXh0U2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFKSB7Ci0JCQkJCQkJLy8gZG8gbm90aGluZwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJU3RyaW5nIGxpbmVJbmRlbnQgPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJfQotCi0JCQkJZWxzZSBpZiAobmV4dFNpYmxpbmcgIT0gbnVsbCkKLQkJCQkJaWYgKG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQlnZXRGb3JtYXR0ZXIobmV4dFNpYmxpbmcpLmZvcm1hdChuZXh0U2libGluZywgZm9ybWF0Q29udHJhaW50cyk7Ci0JCQkJCWVsc2UgaWYgKG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpIHsKLQkJCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0JCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUlET01Ob2RlIGluZGVudE5vZGUgPSBnZXRQYXJlbnRJbmRlbnROb2RlKG5vZGUpOwotCQkJCQlTdHJpbmcgbGluZUluZGVudCA9IGdldE5vZGVJbmRlbnQoaW5kZW50Tm9kZSk7Ci0JCQkJCUlET01Ob2RlIGxhc3RDaGlsZCA9IGdldERlZXBlc3RDaGlsZE5vZGUobm9kZSk7Ci0JCQkJCWJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzID0gZm9ybWF0Q29udHJhaW50cy5nZXRDbGVhckFsbEJsYW5rTGluZXMoKTsKLQotCQkJCQlpZiAobGFzdENoaWxkICE9IG51bGwpIHsKLQkJCQkJCWlmICgobGFzdENoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChsYXN0Q2hpbGQuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpKSkgewotCQkJCQkJCS8vIHRoaXMgdGV4dCBub2RlIGFscmVhZHkgZW5kcyB3aXRoIHRoZSByZXF1ZXN0ZWQKLQkJCQkJCQkvLyBpbmRlbnRhdGlvbgotCQkJCQkJfQotCi0JCQkJCQllbHNlIGlmICgobGFzdENoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChsYXN0Q2hpbGQuZ2V0Tm9kZVZhbHVlKCkgIT0gbnVsbCAmJiBsYXN0Q2hpbGQuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlcikpKQotCQkJCQkJCWlmIChjbGVhckFsbEJsYW5rTGluZXMpIHsKLQkJCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShsYXN0Q2hpbGQsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobGFzdENoaWxkLCBsaW5lSW5kZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChsYXN0Q2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCQlpZiAobGFzdENoaWxkLmdldE5vZGVWYWx1ZSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQkJLy8gcmVwbGFjZQotCQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKGxhc3RDaGlsZCwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJCWluc2VydEFmdGVyTm9kZShsYXN0Q2hpbGQsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBhcyBsb25nIGFzIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudAotCQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0gbm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQkJaWYgKGVuZFJlZ2lvbiAhPSBudWxsICYmIGVuZFJlZ2lvbi5nZXROZXh0KCkgIT0gbnVsbCkKLQkJCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJCWluc2VydEFmdGVyTm9kZShsYXN0Q2hpbGQsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEluZGVudGF0aW9uQmVmb3JlTm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBbMTExNjc0XSBJZiBpbnNpZGUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZWxlbWVudCwgd2UgYmFpbAotCQlpZiAoZm9ybWF0Q29udHJhaW50cy5nZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCkpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUlET01Ob2RlIHByZXZpb3VzU2libGluZyA9IChJRE9NTm9kZSkgbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUsIGRvYyk7Ci0KLQkJCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0KLQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCWlmIChwcmV2aW91c1NpYmxpbmcgIT0gbnVsbCkKLQkJCQkJCWlmIChwcmV2aW91c1NpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCQlnZXRGb3JtYXR0ZXIocHJldmlvdXNTaWJsaW5nKS5mb3JtYXQocHJldmlvdXNTaWJsaW5nLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJCQkJCWVsc2UgewotCQkJCQkJCWluc2VydEJlZm9yZU5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKHByZXZpb3VzU2libGluZyA9PSBudWxsIHx8IHByZXZpb3VzU2libGluZy5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCQkvLyAyNjE5NjggLSBmb3JtYXR0aW5nIHRhZyB3aXRob3V0IGNsb3NpbmcgYnJhY2tldDoKLQkJCQkJCS8vIDx0MT48dDEKLQkJCQkJCS8vIDI2NTY3MyAtIE51bGwgcHRyIGluIGZvcm1hdEluZGVudGF0aW9uQmVmb3JlTm9kZQotCQkJCQkJaW50IHByZXZFbmROb2RlT2Zmc2V0ID0gLTE7Ci0JCQkJCQlpbnQgcHJldkVuZFJlZ2lvbk9mZnNldCA9IC0xOwotCQkJCQkJaWYgKHByZXZpb3VzU2libGluZyAhPSBudWxsKSB7Ci0JCQkJCQkJcHJldkVuZE5vZGVPZmZzZXQgPSBwcmV2aW91c1NpYmxpbmcuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRSZWdpb24gPSBwcmV2aW91c1NpYmxpbmcuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQkJaWYgKGVuZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCXByZXZFbmRSZWdpb25PZmZzZXQgPSBlbmRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmICgocHJldmlvdXNTaWJsaW5nID09IG51bGwpIHx8IChwcmV2RW5kTm9kZU9mZnNldCAhPSAtMSAmJiBwcmV2RW5kTm9kZU9mZnNldCA9PSBwcmV2RW5kUmVnaW9uT2Zmc2V0KSkgewotCQkJCQkJCWluc2VydEJlZm9yZU5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAocHJldmlvdXNTaWJsaW5nLmdldE5vZGVWYWx1ZSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQkvLyByZXBsYWNlCi0JCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShwcmV2aW91c1NpYmxpbmcsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCWlmICghcHJldmlvdXNTaWJsaW5nLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KSkgewotCQkJCQkJCQlpZiAocHJldmlvdXNTaWJsaW5nLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIpKSB7Ci0JCQkJCQkJCQlpbnNlcnRBZnRlck5vZGUocHJldmlvdXNTaWJsaW5nLCBsaW5lSW5kZW50KTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQlnZXRGb3JtYXR0ZXIocHJldmlvdXNTaWJsaW5nKS5mb3JtYXQocHJldmlvdXNTaWJsaW5nLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jKSB7Ci0JCWludCBsaW5lID0gZG9jLmdldExpbmVPZk9mZnNldChub2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCXRyeSB7Ci0JCQlpZiAobGluZSA+IDApIHsKLQkJCQlsaW5lRGVsaW1pdGVyID0gZG9jLmdldExpbmVEZWxpbWl0ZXIobGluZSAtIDEpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCS8vIEJVRzExNTcxNjogaWYgY2Fubm90IGdldCBsaW5lIGRlbGltaXRlciBmcm9tIGN1cnJlbnQgbGluZSwganVzdAotCQkvLyB1c2UgZGVmYXVsdCBsaW5lIGRlbGltaXRlcgotCQlpZiAobGluZURlbGltaXRlciA9PSBudWxsKQotCQkJbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCXJldHVybiBsaW5lRGVsaW1pdGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdE5vZGUoSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCAmJiAoZlByb2dyZXNzTW9uaXRvciA9PSBudWxsIHx8ICFmUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkpIHsKLQkJCS8vIGZvcm1hdCBpbmRlbnRhdGlvbiBiZWZvcmUgbm9kZQotCQkJZm9ybWF0SW5kZW50YXRpb25CZWZvcmVOb2RlKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCi0JCQkvLyBmb3JtYXQgaW5kZW50YXRpb24gYWZ0ZXIgbm9kZQotCQkJZm9ybWF0SW5kZW50YXRpb25BZnRlck5vZGUobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGNvbXB1dGUgdGhlIGNvcnJlY3QgaW5kZW50YXRpb24gYWZ0ZXIgdGhpcyBub2RlCi0JICogZGVwZW5kaW5nIG9uIHRoZSBpbmRlbnRhdGlvbnMgb2YgaXRzIHNpYmxpbmcgbm9kZXMgYW5kIHBhcmVudCBub2RlLiBOb3QKLQkgKiBuZWVkZWQgYW55bW9yZT8KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRUcmFpbGluZ1RleHQoSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJLy8gWzExMTY3NF0gSWYgaW5zaWRlIHhtbDpzcGFjZT0icHJlc2VydmUiIGVsZW1lbnQsIHdlIGJhaWwKLQkJaWYgKGZvcm1hdENvbnRyYWludHMuZ2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCgpKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gbm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJU3RyaW5nIGxpbmVJbmRlbnQgPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQkJU3RyaW5nIHBhcmVudExpbmVJbmRlbnQgPSBnZXROb2RlSW5kZW50KG5vZGUuZ2V0UGFyZW50Tm9kZSgpKTsKLQkJYm9vbGVhbiBjbGVhckFsbEJsYW5rTGluZXMgPSBmb3JtYXRDb250cmFpbnRzLmdldENsZWFyQWxsQmxhbmtMaW5lcygpOwotCi0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkpIHsKLQkJCUlET01Ob2RlIG5leHRTaWJsaW5nID0gKElET01Ob2RlKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAoKG5leHRTaWJsaW5nICE9IG51bGwpICYmIChuZXh0U2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSkgewotCQkJCVN0cmluZyBuZXh0U2libGluZ1RleHQgPSBuZXh0U2libGluZy5nZXROb2RlVmFsdWUoKTsKLQkJCQlpZiAobmV4dFNpYmxpbmcuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKQotCQkJCQlpZiAoKG5leHRTaWJsaW5nLmdldFBhcmVudE5vZGUoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKG5leHRTaWJsaW5nVGV4dC50cmltKCkubGVuZ3RoKCkgPT0gMCkpCi0JCQkJCQkvLyBkZWxldGUgc3BhY2VzIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50Ci0JCQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5leHRTaWJsaW5nLCBFTVBUWV9TVFJJTkcpOwotCQkJCQllbHNlCi0JCQkJCQkvLyByZXBsYWNlIHRoZSB0ZXh0IG5vZGUgd2l0aCBwYXJlbnQgaW5kZW50YXRpb24KLQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobmV4dFNpYmxpbmcsIGxpbmVEZWxpbWl0ZXIgKyBwYXJlbnRMaW5lSW5kZW50KTsKLQkJCQllbHNlCi0JCQkJCS8vIHJlcGxhY2UgdGhlIHRleHQgbm9kZSB3aXRoIGluZGVudGF0aW9uCi0JCQkJCXJlcGxhY2VOb2RlVmFsdWUobmV4dFNpYmxpbmcsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChuZXh0U2libGluZyA9PSBudWxsKSB7Ci0JCQkJCWxpbmVJbmRlbnQgPSBwYXJlbnRMaW5lSW5kZW50OwotCi0JCQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkKLQkJCQkJCWlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCkpKSB7Ci0JCQkJCQkJLy8gdGhpcyB0ZXh0IG5vZGUgYWxyZWFkeSBlbmRzIHdpdGggdGhlIHJlcXVlc3RlZAotCQkJCQkJCS8vIGluZGVudGF0aW9uCi0JCQkJCQl9Ci0KLQkJCQkJCWVsc2UgaWYgKChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIpKSkKLQkJCQkJCQlpZiAoY2xlYXJBbGxCbGFua0xpbmVzKQotCQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZUluZGVudCk7Ci0JCQkJCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQkJCQkJLy8gcmVwbGFjZQotCQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJaWYgKCFub2RlLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KSkKLQkJCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlcikpCi0JCQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZUluZGVudCk7Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJCWluc2VydEFmdGVyTm9kZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCkpKSB7Ci0JCQkJCQkvLyB0aGlzIHRleHQgbm9kZSBhbHJlYWR5IGVuZHMgd2l0aCB0aGUgcmVxdWVzdGVkCi0JCQkJCQkvLyBpbmRlbnRhdGlvbgotCQkJCQl9Ci0KLQkJCQkJZWxzZSBpZiAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlcikpKQotCQkJCQkJaWYgKGNsZWFyQWxsQmxhbmtMaW5lcykKLQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCWVsc2UKLQkJCQkJCQkvLyBhcHBlbmQgaW5kZW50YXRpb24KLQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZUluZGVudCk7Ci0JCQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCWlmIChub2RlLmdldE5vZGVWYWx1ZSgpLmxlbmd0aCgpID09IDApCi0JCQkJCQkJLy8gcmVwbGFjZQotCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJZWxzZQotCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCWluc2VydEFmdGVyTm9kZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCWVsc2UKLQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSURPTU5vZGUgZ2V0RGVlcGVzdENoaWxkTm9kZShJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIHJlc3VsdCA9IG51bGw7Ci0JCUlET01Ob2RlIGxhc3RDaGlsZCA9IChJRE9NTm9kZSkgbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQotCQlpZiAobGFzdENoaWxkID09IG51bGwpCi0JCQlyZXN1bHQgPSBub2RlOwotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGdldERlZXBlc3RDaGlsZE5vZGUobGFzdENoaWxkKTsKLQotCQkJaWYgKChyZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSB8fCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkgJiYgIWlzRW5kVGFnTWlzc2luZyhub2RlKSkKLQkJCQlyZXN1bHQgPSBub2RlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGdldEZvcm1hdENvbnRyYWludHMoKSB7Ci0JCWlmIChmRm9ybWF0Q29udHJhaW50cyA9PSBudWxsKSB7Ci0JCQlmRm9ybWF0Q29udHJhaW50cyA9IG5ldyBTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cygpOwotCi0JCQlmRm9ybWF0Q29udHJhaW50cy5zZXRDbGVhckFsbEJsYW5rTGluZXMoZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRDbGVhckFsbEJsYW5rTGluZXMoKSk7Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdENvbnRyYWludHM7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmRm9ybWF0UHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkZvcm1hdFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCgpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldExpbmVXaWR0aChwcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCQkJKChTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGZGb3JtYXRQcmVmZXJlbmNlcykuc2V0U3BsaXRNdWx0aUF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQkJCSgoU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBmRm9ybWF0UHJlZmVyZW5jZXMpLnNldEFsaWduRW5kQnJhY2tldChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQUxJR05fRU5EX0JSQUNLRVQpKTsKLQkJCQkoKFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5zZXRQcmVzZXJ2ZVBDREFUQUNvbnRlbnQocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBSRVNFUlZFX0NEQVRBQ09OVEVOVCkpOwotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRDbGVhckFsbEJsYW5rTGluZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCi0JCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJCWlmIChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJCX0KLQkJCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJCX0KLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KGluZGVudC50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmRm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0dGVyIGdldEZvcm1hdHRlcihJRE9NTm9kZSBub2RlKSB7Ci0JCS8vIDI2MjEzNSAtIE5QRSBkdXJpbmcgZm9ybWF0IG9mIGVtcHR5IGRvY3VtZW50Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlzaG9ydCBub2RlVHlwZSA9ICgoTm9kZSkgbm9kZSkuZ2V0Tm9kZVR5cGUoKTsKLQkJSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbnVsbDsKLQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgRWxlbWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IFRleHROb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBOb01vdmVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IENvbW1lbnROb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBOb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuRE9DVU1FTlRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgRG9jdW1lbnROb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBOb01vdmVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vZGVGb3JtYXR0ZXIoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGluaXQgZm9tYXR0ZXIKLQkJZm9ybWF0dGVyLnNldEZvcm1hdFByZWZlcmVuY2VzKGdldEZvcm1hdFByZWZlcmVuY2VzKCkpOwotCQlmb3JtYXR0ZXIuc2V0UHJvZ3Jlc3NNb25pdG9yKGZQcm9ncmVzc01vbml0b3IpOwotCi0JCXJldHVybiBmb3JtYXR0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRJbmRlbnRhdGlvbkxlbmd0aChTdHJpbmcgaW5kZW50KSB7Ci0JCS8vIFRPRE8gS2l0IDogVGhlIGNhbGN1bGF0aW9uIG9mIEluZGVudGF0aW9uTGVuZ3RoIGlzIG5vdCBjb3JyZWN0Ci0JCS8vIGhlcmUuCi0JCS8vIG5vZGVJbmRlbnRhdGlvbiBtYXkgY29udGFpbiB0YWJzLiBNdWx0aXBseSBieSA0IHRlbXBvcmFyaWx5IHRvIGdldAotCQkvLyBhcHByb3guIHdpZHRoLgotCQkvLyBOZWVkIHRvIHJlLXdvcmsuCi0KLQkJaW50IGluZGVudGF0aW9uTGVuZ3RoID0gMDsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudC5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoaW5kZW50LnN1YnN0cmluZyhpLCBpICsgMSkuY29tcGFyZVRvKFRBQikgPT0gMCkKLQkJCQlpbmRlbnRhdGlvbkxlbmd0aCArPSA0OwotCQkJZWxzZQotCQkJCWluZGVudGF0aW9uTGVuZ3RoKys7Ci0JCX0KLQotCQlyZXR1cm4gaW5kZW50YXRpb25MZW5ndGg7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgZmluZCB0aGUgaW5kZW50YXRpb24gZm9yIHRoaXMgbm9kZS4gSXQgd2lsbCBzZWFyY2gKLQkgKiBiYWNrd2FyZHMgc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBub2RlIHVudGlsIGEgY2hhcmFjdGVyCi0JICogb3RoZXIgdGhhbiBhIHNwYWNlIG9yIGEgdGFiIGlzIGZvdW5kLiBJZiB0aGlzIG5vZGUgaXMgbnVsbCBvciBpdCdzIGEKLQkgKiBkb2N1bWVudCBub2RlIG9yIGl0J3MgYSBmaXJzdCBsZXZlbCBub2RlIChub2RlJ3MgcGFyZW50IGlzIGEgZG9jdW1lbnQKLQkgKiBub2RlKSB0aGUgZGVmYXVsdCBlbXB0eSBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZCBhcyB0aGUgaW5kZW50YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROb2RlSW5kZW50KE5vZGUgbm9kZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gRU1QVFlfU1RSSU5HOwotCi0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpICYmIChub2RlLmdldFBhcmVudE5vZGUoKS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkpIHsKLQkJCUlET01Ob2RlIHNpYmxpbmdUZXh0Tm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCWlmICgoc2libGluZ1RleHROb2RlICE9IG51bGwpICYmIChzaWJsaW5nVGV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkpIHsKLQkJCQkvLyBmaW5kIHRoZSBpbmRlbnRhdGlvbgotCQkJCVN0cmluZyBzaWJsaW5nVGV4dCA9IHNpYmxpbmdUZXh0Tm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCQlpbnQgc2libGluZ1RleHRMZW5ndGggPSBzaWJsaW5nVGV4dC5sZW5ndGgoKTsKLQkJCQlpZiAoKHNpYmxpbmdUZXh0ICE9IG51bGwpICYmIChzaWJsaW5nVGV4dExlbmd0aCA+IDApICYmICgoc2libGluZ1RleHQuY2hhckF0KHNpYmxpbmdUZXh0TGVuZ3RoIC0gMSkgPT0gU1BBQ0VfQ0hBUikgfHwgKHNpYmxpbmdUZXh0LmNoYXJBdChzaWJsaW5nVGV4dExlbmd0aCAtIDEpID09IFRBQl9DSEFSKSkpIHsKLQkJCQkJaW50IHNlYXJjaEluZGV4ID0gc2libGluZ1RleHRMZW5ndGggLSAxOwotCQkJCQl3aGlsZSAoKHNlYXJjaEluZGV4ID49IDApICYmICgoc2libGluZ1RleHQuY2hhckF0KHNlYXJjaEluZGV4KSA9PSBTUEFDRV9DSEFSKSB8fCAoc2libGluZ1RleHQuY2hhckF0KHNlYXJjaEluZGV4KSA9PSBUQUJfQ0hBUikpKQotCQkJCQkJc2VhcmNoSW5kZXgtLTsKLQotCQkJCQlpZiAoc2VhcmNoSW5kZXggPCBzaWJsaW5nVGV4dExlbmd0aCkKLQkJCQkJCXJlc3VsdCA9IHNpYmxpbmdUZXh0LnN1YnN0cmluZyhzZWFyY2hJbmRleCArIDEsIHNpYmxpbmdUZXh0TGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9kZU5hbWUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZS5nZXROb2RlTmFtZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9kZVRleHQoSURPTU5vZGUgbm9kZSkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0KLQkJaWYgKChub2RlIGluc3RhbmNlb2YgQ2hhcmFjdGVyRGF0YUltcGwpICYmICEobm9kZSBpbnN0YW5jZW9mIENvbW1lbnRJbXBsKSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBDREFUQVNlY3Rpb25JbXBsKSAmJiAhaXNKU1BUYWcobm9kZSkpCi0JCQl0ZXh0ID0gKChDaGFyYWN0ZXJEYXRhSW1wbCkgbm9kZSkuZ2V0U291cmNlKCk7Ci0JCWVsc2UKLQkJCXRleHQgPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByb3RlY3RlZCBJRE9NTm9kZSBnZXRQYXJlbnRJbmRlbnROb2RlKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTU5vZGUgcmVzdWx0ID0gbnVsbDsKLQkJSURPTU5vZGUgcGFyZW50Tm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQlyZXN1bHQgPSBwYXJlbnROb2RlOwotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHBhcmVudE5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEZpcnN0UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pCi0JCQkJcmVzdWx0ID0gcGFyZW50Tm9kZTsKLQkJCWVsc2UKLQkJCQlyZXN1bHQgPSBnZXRQYXJlbnRJbmRlbnROb2RlKHBhcmVudE5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGZpbmQgdGhlIGluZGVudGF0aW9uIGZvciBhIG5vZGUgc2libGluZyB0byB0aGlzIG5vZGUuCi0JICogSXQgd2lsbCB0cnkgdG8gZmluZCBhIHNpYmxpbmcgbm9kZSBiZWZvcmUgdGhpcyBub2RlIGZpcnN0LiBJZiB0aGVyZSBpcwotCSAqIG5vIHNpYmxpbmcgbm9kZSBiZWZvcmUgdGhpcyBub2RlLCBpdCB3aWxsIHRyeSB0byBmaW5kIGEgc2libGluZyBub2RlCi0JICogYWZ0ZXIgdGhpcyBub2RlLiBJZiBzdGlsbCBub3QgZm91bmQsIHdlIHdpbGwgY2hlY2sgaWYgdGhpcyBub2RlIGlzCi0JICogYWxyZWFkeSBpbmRlbnRlZCBmcm9tIGl0cyBwYXJlbnQuIElmIHllcywgdGhpcyBub2RlJ3MgaW5kZW50YXRpb24gd2lsbAotCSAqIGJlIHVzZWQuIE90aGVyd2lzZSwgdGhlIHBhcmVudCBub2RlJ3MgaW5kZW50YXRpb24gcGx1cyBvbmUgaW5kZW50YXRpb24KLQkgKiB3aWxsIGJlIHVzZWQuIElmIHRoaXMgbm9kZSBpcyBudWxsIG9yIGl0J3MgYSBkb2N1bWVudCBub2RlIG9yIGl0J3MgYQotCSAqIGZpcnN0IGxldmVsIG5vZGUgKG5vZGUncyBwYXJlbnQgaXMgYSBkb2N1bWVudCBub2RlKSB0aGUgZGVmYXVsdCBlbXB0eQotCSAqIHN0cmluZyB3aWxsIGJlIHJldHVybmVkIGFzIHRoZSBpbmRlbnRhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNpYmxpbmdJbmRlbnQoTm9kZSBub2RlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBFTVBUWV9TVFJJTkc7Ci0KLQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgewotCQkJLy8gZmluZCB0aGUgdGV4dCBub2RlIGJlZm9yZSB0aGUgcHJldmlvdXMgbm9uLXRleHQgc2libGluZwotCQkJLy8gaWYgdGhhdCdzIG5vdCBmb3VuZCwgd2Ugd2lsbCB0cnkgdGhlIHRleHQgbm9kZSBiZWZvcmUgdGhlIG5leHQKLQkJCS8vIG5vbi10ZXh0IHNpYmxpbmcKLQkJCUlET01Ob2RlIHNpYmxpbmcgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQl3aGlsZSAoKHNpYmxpbmcgIT0gbnVsbCkgJiYgKHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSB8fCBzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpKSB7Ci0JCQkJaWYgKHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSAmJiBzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpICE9IG51bGwgJiYgc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIFN0cmluZ1V0aWxzLmNvbnRhaW5zTGluZURlbGltaXRlcihzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpLmdldE5vZGVWYWx1ZSgpKSkKLQkJCQkJYnJlYWs7Ci0JCQkJc2libGluZyA9IChJRE9NTm9kZSkgc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCX0KLQkJCWlmIChzaWJsaW5nID09IG51bGwpIHsKLQkJCQlzaWJsaW5nID0gKElET01Ob2RlKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJd2hpbGUgKChzaWJsaW5nICE9IG51bGwpICYmIChzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpKQotCQkJCQlzaWJsaW5nID0gKElET01Ob2RlKSBzaWJsaW5nLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCQlTdHJpbmcgc2luZ2xlSW5kZW50ID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRJbmRlbnQoKTsKLQkJCVN0cmluZyBwYXJlbnRMaW5lSW5kZW50ID0gZ2V0Tm9kZUluZGVudChub2RlLmdldFBhcmVudE5vZGUoKSk7Ci0KLQkJCWlmIChzaWJsaW5nICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgc2libGluZ0luZGVudCA9IGdldE5vZGVJbmRlbnQoc2libGluZyk7Ci0JCQkJaWYgKHNpYmxpbmdJbmRlbnQubGVuZ3RoKCkgPiAwKQotCQkJCQlyZXN1bHQgPSBzaWJsaW5nSW5kZW50OwotCQkJCWVsc2UgewotCQkJCQlTdHJpbmcgbm9kZUluZGVudCA9IGdldE5vZGVJbmRlbnQobm9kZSk7Ci0JCQkJCWlmIChub2RlSW5kZW50Lmxlbmd0aCgpID4gcGFyZW50TGluZUluZGVudC5sZW5ndGgoKSkKLQkJCQkJCS8vIHRoaXMgbm9kZSBpcyBpbmRlbnRlZCBmcm9tIGl0cyBwYXJlbnQsIGl0cwotCQkJCQkJLy8gaW5kZW50YXRpb24gd2lsbCBiZSB1c2VkCi0JCQkJCQlyZXN1bHQgPSBub2RlSW5kZW50OwotCQkJCQllbHNlCi0JCQkJCQlyZXN1bHQgPSBwYXJlbnRMaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50OwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCVN0cmluZyBub2RlSW5kZW50ID0gZ2V0Tm9kZUluZGVudChub2RlKTsKLQkJCQlpZiAobm9kZUluZGVudC5sZW5ndGgoKSA+IHBhcmVudExpbmVJbmRlbnQubGVuZ3RoKCkpCi0JCQkJCS8vIHRoaXMgbm9kZSBpcyBpbmRlbnRlZCBmcm9tIGl0cyBwYXJlbnQsIGl0cyBpbmRlbnRhdGlvbgotCQkJCQkvLyB3aWxsIGJlIHVzZWQKLQkJCQkJcmVzdWx0ID0gbm9kZUluZGVudDsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdCA9IHBhcmVudExpbmVJbmRlbnQgKyBzaW5nbGVJbmRlbnQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluc2VydEFmdGVyTm9kZShJRE9NTm9kZSBub2RlLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCWludCBvZmZzZXQgPSBub2RlLmdldEVuZE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gMDsKLQotCQkvLyAyNjE5NjggLSBmb3JtYXR0aW5nIHRhZyB3aXRob3V0IGNsb3NpbmcgYnJhY2tldDogPHQxPjx0MQotCQlpZiAobm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQlvZmZzZXQgPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHRFbmRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IG5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBvZmZzZXQ7Ci0JCX0KLQkJcmVwbGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCBzdHJpbmcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluc2VydEJlZm9yZU5vZGUoSURPTU5vZGUgbm9kZSwgU3RyaW5nIHN0cmluZykgewotCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlyZXBsYWNlKHN0cnVjdHVyZWREb2N1bWVudCwgbm9kZS5nZXRTdGFydE9mZnNldCgpLCAwLCBzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZSBhbGxvd3MgaXQKLQkgKiB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZS5lcXVhbHMoSVN0cnVjdHVyZWRGb3JtYXR0ZXIuY2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRW5kVGFnTWlzc2luZyhJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAhaXNKU1BUYWcobm9kZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCQlJVGV4dFJlZ2lvbiBzdGFydFRhZ05hbWVSZWdpb24gPSBudWxsOwotCQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCkgPiAxKQotCQkJCXN0YXJ0VGFnTmFtZVJlZ2lvbiA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQlJVGV4dFJlZ2lvbiBlbmRUYWdOYW1lUmVnaW9uID0gbnVsbDsKLQkJCWlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA+IDEpCi0JCQkJZW5kVGFnTmFtZVJlZ2lvbiA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCi0JCQlJVGV4dFJlZ2lvbkxpc3Qgc3RhcnRUYWdSZWdpb25zID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJaWYgKHN0YXJ0VGFnTmFtZVJlZ2lvbiA9PSBlbmRUYWdOYW1lUmVnaW9uICYmIHN0YXJ0VGFnTmFtZVJlZ2lvbiAhPSBudWxsICYmIChzdGFydFRhZ1JlZ2lvbnMuZ2V0KDApKS5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOICYmIChzdGFydFRhZ1JlZ2lvbnMuZ2V0KHN0YXJ0VGFnUmVnaW9ucy5zaXplKCkgLSAxKS5nZXRUeXBlKCkpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkKLQkJCQkvLyBlbmQgdGFnIG1pc3NpbmcKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub2RlSGFzU2libGluZ3MoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkgIT0gbnVsbCkgfHwgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlIGNoYW5nZWQuIE5vIGZvcm1hdCBzaG91bGQgYmUgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlZ2lvblNwYWNlcyhJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKChyZWdpb24gIT0gbnVsbCkgJiYgKHJlZ2lvbiBpbnN0YW5jZW9mIENvbnRleHRSZWdpb24gfHwgcmVnaW9uIGluc3RhbmNlb2YgVGFnTmFtZVJlZ2lvbikgJiYgKGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pID4gZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pKSkgewotCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCQlyZXBsYWNlKHN0cnVjdHVyZWREb2N1bWVudCwgZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pLCBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKSAtIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSwgRU1QVFlfU1RSSU5HKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmVwbGFjZSB0aGUgc3RyaW5nIGF0IG9mZnNldCBhbmQgbGVuZ3RoIHdpdGggYSBuZXcKLQkgKiBzdHJpbmcuIElmIHRoZSBzdHJpbmcgdG8gYmUgcmVwbGFjZWQgaXMgdGhlIHNhbWUgYXMgdGhlIG5ldyBzdHJpbmcsIHRoZQotCSAqIHN0cmluZyB3aWxsIG5vdCBiZSByZXBsYWNlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RydWN0dXJlZERvY3VtZW50U3RyaW5nID0gc3RydWN0dXJlZERvY3VtZW50LmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50U3RyaW5nLmNvbXBhcmVUbyhzdHJpbmcpICE9IDApCi0JCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsIHN0cmluZyk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJlcGxhY2UgdGhlIG5vZGUgdmFsdWUgd2l0aCBhIG5ldyBzdHJpbmcuIElmIHRoZSBub2RlCi0JICogdmFsdWUgdG8gYmUgcmVwbGFjZWQgaXMgdGhlIHNhbWUgYXMgdGhlIG5ldyBzdHJpbmcsIHRoZSBub2RlIHZhbHVlIHdpbGwKLQkgKiBub3QgYmUgcmVwbGFjZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZU5vZGVWYWx1ZShJRE9NTm9kZSBub2RlLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpbnQgb2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gbm9kZS5nZXRFbmRPZmZzZXQoKSAtIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQl0cnkgewotCQkJU3RyaW5nIHN0cnVjdHVyZWREb2N1bWVudFN0cmluZyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFN0cmluZy5jb21wYXJlVG8oc3RyaW5nKSAhPSAwKQotCQkJCXJlcGxhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgc3RyaW5nKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvcm1hdFByZWZlcmVuY2VzKElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZm9ybWF0UHJlZmVyZW5jZXMpIHsKLQkJZkZvcm1hdFByZWZlcmVuY2VzID0gZm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyI3NldFByb2dyZXNzTW9uaXRvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZQcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNKU1BUYWcoTm9kZSBub2RlKSB7Ci0KLQkJZmluYWwgU3RyaW5nIEpTUF9DTE9TRSA9ICJKU1BfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JCS8vIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9DTE9TRSA9ICJKU1BfQ09NTUVOVF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfT1BFTiA9ICJKU1BfQ09NTUVOVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfVEVYVCA9ICJKU1BfQ09NTUVOVF9URVhUIjsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbmFsIFN0cmluZyBKU1BfQ09OVEVOVCA9ICJKU1BfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEpTUF9ERUNMQVJBVElPTl9PUEVOID0gIkpTUF9ERUNMQVJBVElPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9DTE9TRSA9ICJKU1BfRElSRUNUSVZFX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9OQU1FID0gIkpTUF9ESVJFQ1RJVkVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9PUEVOID0gIkpTUF9ESVJFQ1RJVkVfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEpTUF9FWFBSRVNTSU9OX09QRU4gPSAiSlNQX0VYUFJFU1NJT05fT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX1JPT1RfVEFHX05BTUUgPSAiSlNQX1JPT1RfVEFHX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkJZmluYWwgU3RyaW5nIEpTUF9TQ1JJUFRMRVRfT1BFTiA9ICJKU1BfU0NSSVBUTEVUX09QRU4iOyAvLyROT04tTkxTLTEkCi0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCS8vIGluIHNvbWUgY2FzZXMsIHRoZSBub2RlcyBleGlzdHMsIGJ1dCBoYXNuJ3QgYmVlbiBhc3NvY2lhdGVkCi0JCQkvLyB3aXRoCi0JCQkvLyBhIGZsYXRub2RlIHlldCAodGhlIHNjcmVlbiB1cGRhdGVzIGNhbiBiZSBpbml0aWF0ZWQgb24gYQotCQkJLy8gZGlmZmVyZW50IHRocmVhZCwKLQkJCS8vIHNvIHRoZSByZXF1ZXN0IGZvciBhIGZsYXRub2RlIGNhbiBjb21lIGluIGJlZm9yZSB0aGUgbm9kZSBpcwotCQkJLy8gZnVsbHkgZm9ybWVkLgotCQkJLy8gaWYgdGhlIGZsYXRub2RlIGlzIG51bGwsIHdlJ2xsIGp1c3QgYWxsb3cgdGhlIGRlZmF1bHRzIHRvCi0JCQkvLyBhcHBseS4KLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGZsYXROb2RlVHlwZSA9IGZsYXROb2RlLmdldFR5cGUoKTsKLQkJCQkvLyBzaG91bGQgbm90IGJlIG51bGwsIGJ1dCBqdXN0IHRvIGJlIHN1cmUKLQkJCQlpZiAoZmxhdE5vZGVUeXBlICE9IG51bGwpIHsKLQkJCQkJaWYgKChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9DT05URU5UKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0VYUFJFU1NJT05fT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9TQ1JJUFRMRVRfT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ERUNMQVJBVElPTl9PUEVOKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0RJUkVDVElWRV9DTE9TRSkpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ESVJFQ1RJVkVfTkFNRSkpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ESVJFQ1RJVkVfT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9DTE9TRSkpKSB7Ci0JCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzAyNGViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwgZXh0ZW5kcyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgewotCXByaXZhdGUgYm9vbGVhbiBmU3BsaXRNdWx0aUF0dHJzID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZQcmVzZXJ2ZVBDREFUQUNvbnRlbnQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkFsaWduRW5kQnJhY2tldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVHJ1ZSBpZiBmb3JtYXR0ZXIgc2hvdWxkIHNwbGl0IGVsZW1lbnRzIHdpdGggbXVsdGlwbGUgYXR0cmlidXRlcyBvbnRvCi0JICogbmV3IGxpbmVzLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFNwbGl0TXVsdGlBdHRycygpIHsKLQkJcmV0dXJuIGZTcGxpdE11bHRpQXR0cnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIG9yIG5vdCBmb3JtYXR0ZXIgc2hvdWxkIHNwbGl0IGVsZW1lbnRzIHdpdGggbXVsdGlwbGUKLQkgKiBhdHRyaWJ1dGVzIG9udG8gbmV3IGxpbmVzLgotCSAqIAotCSAqIEBwYXJhbSBzcGxpdE11bHRpQXR0cnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGxpdE11bHRpQXR0cnMoYm9vbGVhbiBzcGxpdE11bHRpQXR0cnMpIHsKLQkJZlNwbGl0TXVsdGlBdHRycyA9IHNwbGl0TXVsdGlBdHRyczsKLQl9Ci0KLQkvKioKLQkgKiBUcnVlIGlmIHRhZ3Mgd2l0aCBQQ0RBVEEgY29udGVudCBzaG91bGQgbm90IGhhdmUgdGhlaXIgd2hpdGVzcGFjZQotCSAqIG1lc3NlZCB3aXRoIHdoZW4gZm9ybWF0dGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByZXNlcnZlUENEQVRBQ29udGVudCgpIHsKLQkJcmV0dXJuIGZQcmVzZXJ2ZVBDREFUQUNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIG9yIG5vdCBmb3JtYXR0ZXIgc2hvdWxkIHByZXNlcnZlIHdoaXRlc3BhY2UgaW4gdGFncyB3aXRoCi0JICogUENEQVRBIGNvbnRlbnQuCi0JICogCi0JICogQHBhcmFtIHByZXNlcnZlUENEQVRBQ29udGVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlcnZlUENEQVRBQ29udGVudChib29sZWFuIHByZXNlcnZlUENEQVRBQ29udGVudCkgewotCQlmUHJlc2VydmVQQ0RBVEFDb250ZW50ID0gcHJlc2VydmVQQ0RBVEFDb250ZW50OwotCX0KLQotCS8qKgotCSAqIFRydWUgaWYgZW5kIGJyYWNrZXRzIG9mIHN0YXJ0IHRhZ3Mgc2hvdWxkIGJlIHBsYWNlZCBvbiBhIG5ldyBsaW5lIGlmCi0JICogdGhlIHN0YXJ0IHRhZyBzcGFucyBtb3JlIHRoYW4gb25lIGxpbmUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWxpZ25FbmRCcmFja2V0KCkgewotCQlyZXR1cm4gZkFsaWduRW5kQnJhY2tldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgb3Igbm90IGZvcm1hdHRlciBzaG91bGQgYWxpZ24gdGhlIGVuZCBicmFja2V0IG9mIGEgc3RhcnQKLQkgKiB0YWcgb24gYSBuZXcgbGluZSBpZiB0aGUgc3RhcnQgdGFnIHNwYW5zIG1vcmUgdGhhbiBvbmUgbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWxpZ25FbmRCcmFja2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QWxpZ25FbmRCcmFja2V0KGJvb2xlYW4gYWxpZ25FbmRCcmFja2V0KSB7Ci0JCWZBbGlnbkVuZEJyYWNrZXQgPSBhbGlnbkVuZEJyYWNrZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvVGV4dE5vZGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L1RleHROb2RlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3M2FiNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvVGV4dE5vZGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSB4bWw6c3BhY2U9J3ByZXNlcnZlJyBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFRleHROb2RlRm9ybWF0dGVyIGV4dGVuZHMgTm9kZUZvcm1hdHRlciB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIENSID0gIlxyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBERUxJTUlURVJTID0gIiBcdFxuXHJcZiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRkYgPSAiXGYiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIExGID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBTUEFDRSA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBUQUIgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBjb21wcmVzc1NwYWNlcyhTdHJpbmcgc3RyaW5nLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvKgotCQkgKiBOb3RlIHRoYXQgdGhlIFN0cnVjdHVyZWRUZXh0RWRpdG9yIHN1cHBvcnRzIG1peGVkIG5ldyBsaW5lCi0JCSAqIGNoYXJhY3RlcnMgKENSLCBMRiwgQ1JMRikgaW4gb25lIGZpbGUuIFdlIGhhdmUgdG8gaGFuZGxlIHRoYXQgd2hlbgotCQkgKiB3ZSB0cnkgdG8gcHJlc2VydmUgYmxhbmsgbGluZXMuCi0JCSAqLwotCQlTdHJpbmdbXSBzdHJpbmdBcnJheSA9IG51bGw7Ci0JCWJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzID0gZm9ybWF0Q29udHJhaW50cy5nZXRDbGVhckFsbEJsYW5rTGluZXMoKTsKLQotCQlpZiAoY2xlYXJBbGxCbGFua0xpbmVzKQotCQkJc3RyaW5nQXJyYXkgPSBTdHJpbmdVdGlscy5hc0FycmF5KHN0cmluZyk7Ci0JCWVsc2UKLQkJCXN0cmluZ0FycmF5ID0gU3RyaW5nVXRpbHMuYXNBcnJheShzdHJpbmcsIERFTElNSVRFUlMsIHRydWUpOwotCi0JCVN0cmluZ0J1ZmZlciBjb21wcmVzc2VkU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoc3RyaW5nQXJyYXkubGVuZ3RoID4gMCkgewotCQkJYm9vbGVhbiBjciA9IGZhbHNlLCBsZiA9IGZhbHNlLCBjcjIgPSBmYWxzZSwgbm9uU3BhY2UgPSB0cnVlOwotCi0JCQlpZiAoc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKENSKSA9PSAwKQotCQkJCWNyID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKHN0cmluZ0FycmF5WzBdLmNvbXBhcmVUbyhMRikgPT0gMCkKLQkJCQlsZiA9IHRydWU7Ci0JCQllbHNlIGlmICgoc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKFNQQUNFKSAhPSAwKSAmJiAoc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKFRBQikgIT0gMCkgJiYgKHN0cmluZ0FycmF5WzBdLmNvbXBhcmVUbyhGRikgIT0gMCkpIHsKLQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChzdHJpbmdBcnJheVswXSk7Ci0JCQkJbm9uU3BhY2UgPSB0cnVlOwotCQkJfQotCi0JCQlmb3IgKGludCBpID0gMTsgaSA8IHN0cmluZ0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHN0cmluZ0FycmF5W2ldLmNvbXBhcmVUbyhDUikgPT0gMCkgewotCQkJCQlpZiAoY3IgJiYgbGYpIHsKLQkJCQkJCWlmIChub25TcGFjZSkgewotCQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKENSICsgTEYpOwotCQkJCQkJCW5vblNwYWNlID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChzdHJpbmdBcnJheVtpXSk7Ci0JCQkJCQljcjIgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNyKSB7Ci0JCQkJCQlpZiAobm9uU3BhY2UpIHsKLQkJCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChDUik7Ci0JCQkJCQkJbm9uU3BhY2UgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKHN0cmluZ0FycmF5W2ldKTsKLQkJCQkJCWNyMiA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJY3IgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIGlmIChzdHJpbmdBcnJheVtpXS5jb21wYXJlVG8oTEYpID09IDApIHsKLQkJCQkJaWYgKGNyICYmIGxmICYmIGNyMikgewotCQkJCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoc3RyaW5nQXJyYXlbaV0pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGxmKSB7Ci0JCQkJCQlpZiAobm9uU3BhY2UpIHsKLQkJCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChMRik7Ci0JCQkJCQkJbm9uU3BhY2UgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKHN0cmluZ0FycmF5W2ldKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQlsZiA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChzdHJpbmdBcnJheVtpXS5jb21wYXJlVG8oU1BBQ0UpICE9IDApICYmIChzdHJpbmdBcnJheVtpXS5jb21wYXJlVG8oVEFCKSAhPSAwKSAmJiAoc3RyaW5nQXJyYXlbaV0uY29tcGFyZVRvKEZGKSAhPSAwKSkgewotCQkJCQlpZiAoY29tcHJlc3NlZFN0cmluZy5sZW5ndGgoKSA+IDApCi0JCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChTUEFDRSk7Ci0JCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKHN0cmluZ0FycmF5W2ldKTsKLQotCQkJCQljciA9IGZhbHNlOwotCQkJCQlsZiA9IGZhbHNlOwotCQkJCQljcjIgPSBmYWxzZTsKLQkJCQkJbm9uU3BhY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjb21wcmVzc2VkU3RyaW5nLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBbMTExNjc0XSBJZiBpbnNpZGUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZWxlbWVudCwgd2UgYmFpbAotCQlpZiAoZm9ybWF0Q29udHJhaW50cy5nZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCkpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkJaW50IGxpbmVXaWR0aCA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0TGluZVdpZHRoKCk7Ci0JCQlpbnQgY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IGNvbXB1dGVBdmFpbGFibGVMaW5lV2lkdGgoZG9jLCBub2RlLmdldFN0YXJ0T2Zmc2V0KCksIGxpbmVXaWR0aCk7Ci0KLQkJCVN0cmluZyBub2RlVGV4dCA9IGdldE5vZGVUZXh0KG5vZGUpOwotCQkJU3RyaW5nIGNvbXByZXNzZWRUZXh0ID0gY29tcHJlc3NTcGFjZXMobm9kZVRleHQsIGZvcm1hdENvbnRyYWludHMpOwotCi0JCQlJRE9NTm9kZSBwYXJlbnROb2RlID0gKElET01Ob2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJaWYgKCgoZW5vdWdoU3BhY2UocGFyZW50Tm9kZSwgY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCwgY29tcHJlc3NlZFRleHQpKSAmJiAobm9TaWJsaW5nc0FuZE5vRm9sbG93aW5nQ29tbWVudChub2RlKSkgJiYgIWZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbnNMaW5lRGVsaW1pdGVycyhwYXJlbnROb2RlKSkgfHwgbm9kZS5nZXRTdGFydE9mZnNldCgpID09IDApIHsKLQkJCQloYW5kbGVOb1JlZmxvdyhub2RlLCBkb2MsIGNvbXByZXNzZWRUZXh0LCBwYXJlbnROb2RlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5vdCBlbm91Z2ggc3BhY2UsIG5lZWQgdG8gcmVmbG93IHRleHQKLQkJCQlTdHJpbmcgbm9kZUluZGVudGF0aW9uID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0JCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IGxpbmVXaWR0aCAtIGdldEluZGVudGF0aW9uTGVuZ3RoKG5vZGVJbmRlbnRhdGlvbik7Ci0JCQkJTGlzdCB2ZWN0b3IgPSByZWZsb3dUZXh0KGNvbXByZXNzZWRUZXh0LCBjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoKTsKLQkJCQlpbnQgdmVjdG9yU2l6ZSA9IHZlY3Rvci5zaXplKCk7Ci0JCQkJU3RyaW5nQnVmZmVyIHJlZmxvd2VkVGV4dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlTdHJpbmcgbGluZURlbGltaXRlciA9IGdldExpbmVEZWxpbWl0ZXIoZG9jLCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCS8vIGhhbmRsZSBmaXJzdCBsaW5lIHNwZWNpYWxseSB0byBjaGVjayBmb3IgYWxsb3dXaGl0ZXNwYWNlCi0JCQkJaWYgKHZlY3RvclNpemUgPiAwKSB7Ci0JCQkJCS8vIGRldGVybWluZXMgd2hldGhlciBvciBub3QgdG8gYWxsb3cgd2hpdGVzcGFjZSBpZiB0aGVyZQotCQkJCQkvLyBpcyBhbiBlbnRpdHkgb3IgY2RhdGEgYmVmb3JlIGl0Ci0JCQkJCWJvb2xlYW4gYWxsb3dXaGl0ZXNwYWNlID0gdHJ1ZTsKLQkJCQkJLy8gWzIwNjA3Ml0gU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotCQkJCQlpZiAobm9kZVRleHQubGVuZ3RoKCkgPT0gMCB8fCAhQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShub2RlVGV4dC5jaGFyQXQoMCkpKSB7Ci0JCQkJCQlOb2RlIHByZXZpb3VzU2libGluZyA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJCQlpZiAocHJldmlvdXNTaWJsaW5nICE9IG51bGwgJiYgKHByZXZpb3VzU2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIHx8IHByZXZpb3VzU2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKSkKLQkJCQkJCQlhbGxvd1doaXRlc3BhY2UgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQlTdHJpbmcgdGhlU3RyaW5nID0gKFN0cmluZykgdmVjdG9yLmdldCgwKTsKLQkJCQkJaWYgKGFsbG93V2hpdGVzcGFjZSkgewotCQkJCQkJcmVmbG93ZWRUZXh0QnVmZmVyLmFwcGVuZChsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCWlmICh0aGVTdHJpbmcudHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQkJCQlyZWZsb3dlZFRleHRCdWZmZXIuYXBwZW5kKG5vZGVJbmRlbnRhdGlvbikuYXBwZW5kKHRoZVN0cmluZyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZWZsb3dlZFRleHRCdWZmZXIuYXBwZW5kKHRoZVN0cmluZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gZG8gdGhlIHJlc3Qgb2YgdGhlIGxpbmVzCi0JCQkJZm9yIChpbnQgaSA9IDE7IGkgPCB2ZWN0b3JTaXplOyBpKyspIHsKLQkJCQkJU3RyaW5nIHRoZVN0cmluZyA9IChTdHJpbmcpIHZlY3Rvci5nZXQoaSk7Ci0JCQkJCWlmICh0aGVTdHJpbmcudHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQkJCXJlZmxvd2VkVGV4dEJ1ZmZlci5hcHBlbmQobGluZURlbGltaXRlcikuYXBwZW5kKG5vZGVJbmRlbnRhdGlvbikuYXBwZW5kKHRoZVN0cmluZyk7Ci0JCQkJCWVsc2UKLQkJCQkJCXJlZmxvd2VkVGV4dEJ1ZmZlci5hcHBlbmQobGluZURlbGltaXRlcik7Ci0JCQkJfQotCQkJCVN0cmluZyByZWZsb3dlZFRleHQgPSByZWZsb3dlZFRleHRCdWZmZXIudG9TdHJpbmcoKTsKLQkJCQlpZiAobm9kZS5nZXROZXh0U2libGluZygpID09IG51bGwpIHsKLQkJCQkJaWYgKGlzRW5kVGFnTWlzc2luZyhwYXJlbnROb2RlKSkgewotCQkJCQkJLy8gZG9uJ3QgYWRkIGluZGVudGF0aW9uIHRvIGVuZCBpZiBwYXJlbnQgZW5kIHRhZyBpcwotCQkJCQkJLy8gbWlzc2luZwotCQkJCQl9Ci0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBhZGQgcGFyZW50J3MgaW5kZW50YXRpb24gdG8gZW5kCi0JCQkJCQlub2RlSW5kZW50YXRpb24gPSBnZXROb2RlSW5kZW50KHBhcmVudE5vZGUpOwotCQkJCQkJaWYgKCFyZWZsb3dlZFRleHQuZW5kc1dpdGgobGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbikpIHsKLQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoIXJlZmxvd2VkVGV4dC5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbm9kZUluZGVudGF0aW9uKSkgewotCQkJCQkJLy8gbm90IGFscmVhZHkgZW5kZWQgd2l0aCB0aGUgZXhwZWN0ZWQgaW5kZW50YXRpb24KLQkJCQkJCU5vZGUgbmV4dFNpYmxpbmcgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQlpZiAobmV4dFNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkgewotCQkJCQkJCS8vIGFkZCBpbmRlbnRhdGlvbiB0byBlbmQgaWYKLQkJCQkJCQkvLyBjdXJyZW50VGV4dEVuZHNXaXRoTGluZURlbGltaXRlcgotCQkJCQkJCS8vIG9yIGZvbGxvd2VkIGJ5IG11bHRpTGluZUNvbW1lbnQKLQotCQkJCQkJCWludCBpbmRleE9mTGFzdExpbmVEZWxpbWl0ZXIgPSBTdHJpbmdVdGlscy5pbmRleE9mTGFzdExpbmVEZWxpbWl0ZXIobm9kZVRleHQpOwotCQkJCQkJCWJvb2xlYW4gY3VycmVudFRleHRFbmRzV2l0aExpbmVEZWxpbWl0ZXIgPSBpbmRleE9mTGFzdExpbmVEZWxpbWl0ZXIgIT0gLTE7Ci0JCQkJCQkJaWYgKGN1cnJlbnRUZXh0RW5kc1dpdGhMaW5lRGVsaW1pdGVyKSB7Ci0JCQkJCQkJCS8vIG5vIG1vcmUgbm9uIGJsYW5rIGNoYXJhY3RlciBhZnRlciB0aGUgbGFzdAotCQkJCQkJCQkvLyBsaW5lIGRlbGltaXRlcgotCQkJCQkJCQljdXJyZW50VGV4dEVuZHNXaXRoTGluZURlbGltaXRlciA9IFN0cmluZ1V0aWxzLmluZGV4T2ZOb25ibGFuayhub2RlVGV4dCwgaW5kZXhPZkxhc3RMaW5lRGVsaW1pdGVyKSA9PSAtMTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlTdHJpbmcgbm9kZVZhbHVlID0gbmV4dFNpYmxpbmcuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJYm9vbGVhbiBtdWx0aUxpbmVDb21tZW50ID0gU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKG5vZGVWYWx1ZSk7Ci0KLQkJCQkJCQlpZiAoY3VycmVudFRleHRFbmRzV2l0aExpbmVEZWxpbWl0ZXIgfHwgbXVsdGlMaW5lQ29tbWVudCkgewotCQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCQkJcmVmbG93ZWRUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKHJlZmxvd2VkVGV4dCwgbm9kZUluZGVudGF0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChuZXh0U2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIHx8IG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpIHsKLQkJCQkJCQlpbnQgdGV4dExlbmd0aCA9IG5vZGVUZXh0Lmxlbmd0aCgpOwotCQkJCQkJCWlmICh0ZXh0TGVuZ3RoID4gMCAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG5vZGVUZXh0LmNoYXJBdCh0ZXh0TGVuZ3RoIC0gMSkpKSB7Ci0JCQkJCQkJCXJlZmxvd2VkVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChyZWZsb3dlZFRleHQsIGxpbmVEZWxpbWl0ZXIpOwotCQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIG5vdCBhIGNvbW1lbnQsIGp1c3QgYWRkIGFkZCBpbmRlbnRhdGlvbiB0byBlbmQKLQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmVwbGFjZU5vZGVWYWx1ZShub2RlLCByZWZsb3dlZFRleHQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogS2VlcHMgdGV4dCBpbmxpbmUgd2l0aCBpdHMgcGFyZW50IChubyByZWZsb3cgbmVjZXNzYXJ5KQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGRvYwotCSAqIEBwYXJhbSBjb21wcmVzc2VkVGV4dAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU5vUmVmbG93KElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jLCBTdHJpbmcgY29tcHJlc3NlZFRleHQsIElET01Ob2RlIHBhcmVudE5vZGUpIHsKLQkJU3RyaW5nIG5vZGVJbmRlbnRhdGlvbjsKLQkJLy8gZW5vdWdoIHNwYWNlIGFuZCB0ZXh0IGhhcyBubyBsaW5lIGRlbGltaXRlcnMgYW5kIChub2RlIGhhcyBubwotCQkvLyBzaWJsaW5ncyBvciBmb2xsb3dlZCBieSBpbmxpbmUgY29tbWVudCkgYW5kCi0JCS8vIHBhcmVudEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbnNMaW5lRGVsaW1pdGVycwotCi0JCWlmIChpc0VuZFRhZ01pc3NpbmcocGFyZW50Tm9kZSkpIHsKLQkJCXBhcmVudE5vZGUgPSAoSURPTU5vZGUpIHBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJd2hpbGUgKGlzRW5kVGFnTWlzc2luZyhwYXJlbnROb2RlKSkKLQkJCQlwYXJlbnROb2RlID0gKElET01Ob2RlKSBwYXJlbnROb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJLy8gYWRkIHBhcmVudCdzIGluZGVudGF0aW9uIHRvIGVuZAotCQkJbm9kZUluZGVudGF0aW9uID0gZ2V0Tm9kZUluZGVudChwYXJlbnROb2RlKTsKLQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZ2V0TGluZURlbGltaXRlcihkb2MsIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpZiAoIWNvbXByZXNzZWRUZXh0LmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pKSB7Ci0JCQkJY29tcHJlc3NlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgoY29tcHJlc3NlZFRleHQsIGxpbmVEZWxpbWl0ZXIpOwotCQkJCWNvbXByZXNzZWRUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKGNvbXByZXNzZWRUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJfQotCQl9Ci0KLQkJaWYgKChwYXJlbnROb2RlICE9IG51bGwpICYmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS5sZW5ndGgoKSA+IDApICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSAmJiAoKG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkgPT0gbnVsbCkgfHwgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSkpCi0JCQkvLyBkZWxldGUgc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIHRoZSBkb2N1bWVudAotCQkJY29tcHJlc3NlZFRleHQgPSBFTVBUWV9TVFJJTkc7Ci0KLQkJcmVwbGFjZU5vZGVWYWx1ZShub2RlLCBjb21wcmVzc2VkVGV4dCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG5vU2libGluZ3NBbmROb0ZvbGxvd2luZ0NvbW1lbnQoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NTm9kZSBuZXh0U2libGluZyA9IChJRE9NTm9kZSkgbm9kZS5nZXROZXh0U2libGluZygpOwotCQlyZXR1cm4gIW5vZGVIYXNTaWJsaW5ncyhub2RlKSB8fCAobm9MaW5lRGVsaW1pdGVyKG5vZGUpICYmIGlzQ29tbWVudChuZXh0U2libGluZykgJiYgbm9MaW5lRGVsaW1pdGVyKG5leHRTaWJsaW5nKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudChJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBub0xpbmVEZWxpbWl0ZXIoSURPTU5vZGUgbm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAhU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2Ugb24gdGhlIGN1cnJlbnQgbGluZSBmb3IKLQkgKiBjb21wcmVzc2VkVGV4dCAoYW5kIGZvciBpdHMgcGFyZW50IGVuZCB0YWcpCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiBAcGFyYW0gY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aAotCSAqIEBwYXJhbSBjb21wcmVzc2VkVGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZW5vdWdoU3BhY2UoSURPTU5vZGUgcGFyZW50Tm9kZSwgaW50IGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGgsIFN0cmluZyBjb21wcmVzc2VkVGV4dCkgewotCQlpbnQgcGFyZW50RW5kVGFnTGVuZ3RoID0gcGFyZW50Tm9kZS5nZXROb2RlTmFtZSgpLmxlbmd0aCgpICsgMzsKLQkJcmV0dXJuIGNvbXByZXNzZWRUZXh0Lmxlbmd0aCgpIDw9IChjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoIC0gcGFyZW50RW5kVGFnTGVuZ3RoKSAmJiAhU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKGNvbXByZXNzZWRUZXh0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmVjdG9yIHJlZmxvd1RleHQoU3RyaW5nIHRleHQsIGludCBhdmFpbGFibGVXaWR0aCkgewotCQlTdHJpbmdbXSBzdHJpbmdBcnJheSA9IG51bGw7Ci0JCWJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRDbGVhckFsbEJsYW5rTGluZXMoKTsKLQotCQlpZiAoY2xlYXJBbGxCbGFua0xpbmVzKQotCQkJc3RyaW5nQXJyYXkgPSBTdHJpbmdVdGlscy5hc0FycmF5KHRleHQpOwotCQllbHNlCi0JCQlzdHJpbmdBcnJheSA9IFN0cmluZ1V0aWxzLmFzQXJyYXkodGV4dCwgREVMSU1JVEVSUywgdHJ1ZSk7Ci0KLQkJVmVjdG9yIG91dHB1dCA9IG5ldyBWZWN0b3IoKTsKLQkJaWYgKChzdHJpbmdBcnJheSAhPSBudWxsKSAmJiAoc3RyaW5nQXJyYXkubGVuZ3RoID4gMCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpZiAoc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKENSKSAhPSAwKQotCQkJCWJ1ZmZlci5hcHBlbmQoc3RyaW5nQXJyYXlbMF0pOwotCQkJaW50IGJ1ZmZlckxlbmd0aCA9IHN0cmluZ0FycmF5WzBdLnRvU3RyaW5nKCkubGVuZ3RoKCk7Ci0JCQlib29sZWFuIGNyID0gc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKENSKSA9PSAwOwotCi0JCQlmb3IgKGludCBpID0gMTsgaSA8IHN0cmluZ0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGVhY2hTdHJpbmcgPSBzdHJpbmdBcnJheVtpXTsKLQkJCQlpZiAoKGVhY2hTdHJpbmcuY29tcGFyZVRvKFNQQUNFKSAhPSAwKSAmJiAoZWFjaFN0cmluZy5jb21wYXJlVG8oVEFCKSAhPSAwKSAmJiAoZWFjaFN0cmluZy5jb21wYXJlVG8oRkYpICE9IDApKSB7Ci0JCQkJCWlmICgoYnVmZmVyTGVuZ3RoICsgMSArIGVhY2hTdHJpbmcubGVuZ3RoKCkgPiBhdmFpbGFibGVXaWR0aCkgfHwgKGVhY2hTdHJpbmcuY29tcGFyZVRvKENSKSA9PSAwKSB8fCAoZWFjaFN0cmluZy5jb21wYXJlVG8oTEYpID09IDApKSB7Ci0JCQkJCQlpZiAoKGVhY2hTdHJpbmcuY29tcGFyZVRvKExGKSA9PSAwKSAmJiBjcikgewotCQkJCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCW91dHB1dC5hZGQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCQlidWZmZXJMZW5ndGggPSAwOwotCQkJCQkJfQotCQkJCQkJY3IgPSBlYWNoU3RyaW5nLmNvbXBhcmVUbyhDUikgPT0gMDsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChidWZmZXIudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKFNQQUNFKTsKLQkJCQkJCWJ1ZmZlckxlbmd0aCsrOwotCQkJCQl9Ci0JCQkJCWlmICgoZWFjaFN0cmluZy5jb21wYXJlVG8oQ1IpICE9IDApICYmIChlYWNoU3RyaW5nLmNvbXBhcmVUbyhMRikgIT0gMCkpIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoZWFjaFN0cmluZyk7Ci0JCQkJCQlidWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGggKyBlYWNoU3RyaW5nLmxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJb3V0cHV0LmFkZChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQkJZWxzZQotCQkJb3V0cHV0LmFkZCh0ZXh0KTsKLQotCQlyZXR1cm4gb3V0cHV0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoSVN0cnVjdHVyZWREb2N1bWVudCBkb2MsIGludCBub2RlT2Zmc2V0KSB7Ci0JCWludCBsaW5lID0gZG9jLmdldExpbmVPZk9mZnNldChub2RlT2Zmc2V0KTsKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcigpOwotCQl0cnkgewotCQkJaWYgKGxpbmUgPiAwKSB7Ci0JCQkJbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKGxpbmUgLSAxKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQkvLyBCVUcxMTU3MTY6IGlmIGNhbm5vdCBnZXQgbGluZSBkZWxpbWl0ZXIgZnJvbSBjdXJyZW50IGxpbmUsIGp1c3QKLQkJLy8gdXNlIGRlZmF1bHQgbGluZSBkZWxpbWl0ZXIKLQkJaWYgKGxpbmVEZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCWxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcigpOwotCQlyZXR1cm4gbGluZURlbGltaXRlcjsKLQl9Ci0KLQlwcml2YXRlIGludCBjb21wdXRlQXZhaWxhYmxlTGluZVdpZHRoKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jLCBpbnQgbm9kZU9mZnNldCwgaW50IGxpbmVXaWR0aCkgewotCQkvLyBjb21wdXRlIGN1cnJlbnQgYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJaW50IGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggPSAwOwotCQl0cnkgewotCQkJaW50IGxpbmVPZmZzZXQgPSBkb2MuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQobm9kZU9mZnNldCkuZ2V0T2Zmc2V0KCk7Ci0JCQlTdHJpbmcgdGV4dCA9IGRvYy5nZXQobGluZU9mZnNldCwgbm9kZU9mZnNldCAtIGxpbmVPZmZzZXQpOwotCQkJaW50IHVzZWRXaWR0aCA9IGdldEluZGVudGF0aW9uTGVuZ3RoKHRleHQpOwotCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IGxpbmVXaWR0aCAtIHVzZWRXaWR0aDsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JWE1MUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lYTUxQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMzY3NTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lYTUxQYXJ0aXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbiB0eXBlcyBmb3IgWE1MLgotICogQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZSBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQgaGVyZSBkaXJlY3RseS4KLSAqIAotICogQGRlcHJlY2F0ZWQgdXNlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVhNTFBhcnRpdGlvbnMgewotCQotCVN0cmluZyBYTUxfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfQ0RBVEEgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9QSSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9QSSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWE1MX0RFQ0xBUkFUSU9OID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFQ0wiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0NPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoKLQkgKiBUaGlzIHZhbHVlIGlzIHVzZWQgYXMgYSBwcmVmaXggdG8gYW55IHVua25vd24gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMKLQkgKiB3ZSBmaW5kLiBUaGUgcHJvY2Vzc29yIHRhcmdldCBuYW1lIGlzIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UgYW5kCi0JICogYXBwZW5kZWQgdG8gdGhlIHByZWZpeCB0byBjcmVhdGUgYSB1bmlxdWUgcGFydGl0aW9uIHR5cGUuCi0JICovCi0JU3RyaW5nIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fUFJFRklYID0gIm9yZy5lY2xpcHNlLndzdC54bWwuUFJPQ0VTU0lOR19JTlNUUlVDVElPTjoiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTaG91bGQgbWF0Y2gKLQkgKiBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZHRkLnBhcnRpdGlvbmluZy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFRELlNUX0RURF9TVUJTRVQKLQkgKi8KLQlTdHJpbmcgRFREX1NVQlNFVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmR0ZC5pbnRlcm5hbF9zdWJzZXQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3JlZ2lvbnMvRE9NUmVnaW9uQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9yZWdpb25zL0RPTVJlZ2lvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3M2Q4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3JlZ2lvbnMvRE9NUmVnaW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zOwotCi1wdWJsaWMgaW50ZXJmYWNlIERPTVJlZ2lvbkNvbnRleHQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxPQ0tfVEVYVCA9ICJCTE9DS19URVhUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ERUZJTkVEID0gIlVOREVGSU5FRCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdISVRFX1NQQUNFID0gIldISVRFX1NQQUNFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9BVFRMSVNUX0RFQ0xfQ0xPU0UgPSAiWE1MX0FUVExJU1RfREVDTF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQgPSAiWE1MX0FUVExJU1RfREVDTF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9BVFRMSVNUX0RFQ0xfTkFNRSA9ICJYTUxfQVRUTElTVF9ERUNMX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUTElTVF9ERUNMQVJBVElPTiA9ICJYTUxfQVRUTElTVF9ERUNMQVJBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ0RBVEFfQ0xPU0UgPSAiWE1MX0NEQVRBX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DREFUQV9PUEVOID0gIlhNTF9DREFUQV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DREFUQV9URVhUID0gIlhNTF9DREFUQV9URVhUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DSEFSX1JFRkVSRU5DRSA9ICJYTUxfQ0hBUl9SRUZFUkVOQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTU1FTlRfQ0xPU0UgPSAiWE1MX0NPTU1FTlRfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ09NTUVOVF9PUEVOID0gIlhNTF9DT01NRU5UX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTU1FTlRfVEVYVCA9ICJYTUxfQ09NTUVOVF9URVhUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTlRFTlQgPSAiWE1MX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RFQ0xBUkFUSU9OX0NMT1NFID0gIlhNTF9ERUNMQVJBVElPTl9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ERUNMQVJBVElPTl9PUEVOID0gIlhNTF9ERUNMQVJBVElPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04gPSAiWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfREVDTEFSQVRJT05fQ0xPU0UgPSAiWE1MX0RPQ1RZUEVfREVDTEFSQVRJT05fQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDID0gIlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYgPSAiWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiA9ICJYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNID0gIlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1RFTSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQgPSAiWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ET0NUWVBFX05BTUUgPSAiWE1MX0RPQ1RZUEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX0NMT1NFID0gIlhNTF9FTEVNRU5UX0RFQ0xfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9DT05URU5UID0gIlhNTF9FTEVNRU5UX0RFQ0xfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX05BTUUgPSAiWE1MX0VMRU1FTlRfREVDTF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfREVDTEFSQVRJT04gPSAiWE1MX0VMRU1FTlRfREVDTEFSQVRJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VNUFRZX1RBR19DTE9TRSA9ICJYTUxfRU1QVFlfVEFHX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTkRfVEFHX09QRU4gPSAiWE1MX0VORF9UQUdfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRU5USVRZX1JFRkVSRU5DRSA9ICJYTUxfRU5USVRZX1JFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QRV9SRUZFUkVOQ0UgPSAiWE1MX1BFX1JFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfUElfQ0xPU0UgPSAiWE1MX1BJX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QSV9DT05URU5UID0gIlhNTF9QSV9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QSV9PUEVOID0gIlhNTF9QSV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyA9ICJYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19BVFRSSUJVVEVfTkFNRSA9ICJYTUxfVEFHX0FUVFJJQlVURV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFID0gIlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfQ0xPU0UgPSAiWE1MX1RBR19DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVEFHX05BTUUgPSAiWE1MX1RBR19OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19PUEVOID0gIlhNTF9UQUdfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc3NlbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YWQyYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLQotcHVibGljIGludGVyZmFjZSBNb2RlbFF1ZXJ5QWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudENhY2hlIGdldENNRG9jdW1lbnRDYWNoZSgpOwotCi0JcHVibGljIFVSSVJlc29sdmVyIGdldElkUmVzb2x2ZXIoKTsKLQotCXB1YmxpYyBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoKTsKLQotCXZvaWQgcmVsZWFzZSgpOwotCi0Jdm9pZCBzZXRJZFJlc29sdmVyKFVSSVJlc29sdmVyIG5ld0lkUmVzb2x2ZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjhlNjcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc3NlbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1vZGVsUXVlcnlBZGFwdGVyIHsKLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZTsKLQlwcm90ZWN0ZWQgVVJJUmVzb2x2ZXIgaWRSZXNvbHZlcjsKLQotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnk7Ci0KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJJbXBsKENNRG9jdW1lbnRDYWNoZSBjbURvY3VtZW50Q2FjaGUsIE1vZGVsUXVlcnkgbW9kZWxRdWVyeSwgVVJJUmVzb2x2ZXIgaWRSZXNvbHZlcikgewotCQl0aGlzLmNtRG9jdW1lbnRDYWNoZSA9IGNtRG9jdW1lbnRDYWNoZTsKLQkJdGhpcy5tb2RlbFF1ZXJ5ID0gbW9kZWxRdWVyeTsKLQkJdGhpcy5pZFJlc29sdmVyID0gaWRSZXNvbHZlcjsKLQl9Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudENhY2hlIGdldENNRG9jdW1lbnRDYWNoZSgpIHsKLQkJcmV0dXJuIGNtRG9jdW1lbnRDYWNoZTsKLQl9Ci0KLQlwdWJsaWMgVVJJUmVzb2x2ZXIgZ2V0SWRSZXNvbHZlcigpIHsKLQkJcmV0dXJuIGlkUmVzb2x2ZXI7Ci0JfQotCi0JcHVibGljIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeSgpIHsKLQkJcmV0dXJuIG1vZGVsUXVlcnk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlLmVxdWFscyhNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vZGVsUXVlcnlBZGFwdGVyI3JlbGVhc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNb2RlbFF1ZXJ5QWRhcHRlciNzZXRJZFJlc29sdmVyKFVSSVJlc29sdmVyKQotCSAqLwotCi0JcHVibGljIHZvaWQgc2V0SWRSZXNvbHZlcihVUklSZXNvbHZlciBuZXdJZFJlc29sdmVyKSB7Ci0JCWlkUmVzb2x2ZXIgPSBuZXdJZFJlc29sdmVyOwotCQlpZiAobW9kZWxRdWVyeSBpbnN0YW5jZW9mIE1vdmFibGVNb2RlbFF1ZXJ5KQotCQkJKChNb3ZhYmxlTW9kZWxRdWVyeSkgbW9kZWxRdWVyeSkuc2V0SWRSZXNvbHZlcihuZXdJZFJlc29sdmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NzZW1vZGVscXVlcnkvTW92YWJsZU1vZGVsUXVlcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc3NlbW9kZWxxdWVyeS9Nb3ZhYmxlTW9kZWxRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWQ3MzM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc3NlbW9kZWxxdWVyeS9Nb3ZhYmxlTW9kZWxRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTW92YWJsZU1vZGVsUXVlcnkgZXh0ZW5kcyBNb2RlbFF1ZXJ5IHsKLQotCXZvaWQgc2V0SWRSZXNvbHZlcihVUklSZXNvbHZlciBuZXdVUklSZXNvbHZlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Rhc2tzL1hNTEZpbGVUYXNrU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC90YXNrcy9YTUxGaWxlVGFza1NjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRiODE1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Rhc2tzL1hNTEZpbGVUYXNrU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFhNTEZpbGVUYXNrU2Nhbm5lciBleHRlbmRzIFN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXIgewotCXB1YmxpYyBYTUxGaWxlVGFza1NjYW5uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21tZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uKSB7Ci0JCXJldHVybiB0ZXh0UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3RleHQvWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3RleHQvWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNmJmMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC90ZXh0L1hNTFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZXh0ZW5kcyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gewotCi0JcHVibGljIFhNTFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBzdXBlci5nZXRUeXBlKCk7Ci0JCS8vIG5vcm1hbGx5LCB3ZSB3YW50IHRoZSBzZWNvbmQgcmVnaW9uIGFzIHRoZSBmbGF0bm9kZSB0eXBlIC4uLiBzaW5jZQotCQkvLyB0aGUKLQkJLy8gZmlyc3Qgb25lIGlzIHVzdWFsbHkganVzdCAib3BlbiB0YWciLgotCQlpZiAoKHJlc3VsdCAhPSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOKSAmJiAoZ2V0UmVnaW9ucygpLnNpemUoKSA+IDEpKSB7Ci0JCQlyZXN1bHQgPSBnZXRSZWdpb25zKCkuZ2V0KDEpLmdldFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjczODY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBjb25maWd1cmVkQ29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tde0lYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxULCBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEEsIElYTUxQYXJ0aXRpb25zLlhNTF9QSSwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFQ0xBUkFUSU9OLCBJWE1MUGFydGl0aW9ucy5YTUxfQ09NTUVOVCwgSVhNTFBhcnRpdGlvbnMuRFREX1NVQlNFVH07Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbFBhcnRpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQlzdXBlci5zZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgdHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlmU3VwcG9ydGVkVHlwZXMgPSBjb25maWd1cmVkQ29udGVudFR5cGVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJVGV4dFJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCkKLQkJCXJlc3VsdCA9IElYTUxQYXJ0aXRpb25zLlhNTF9DT01NRU5UOwotCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpCi0JCQlyZXN1bHQgPSBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEE7Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVCkgewotCQkJLyoqCi0JCQkgKiBHcmFtbWF0aWNhbGx5LCBpdCdzIGltcG9zc2libGUgdG8gZ2V0IGEgUElfQ09OVEVOVCByZWdpb24KLQkJCSAqIHdpdGhvdXQgYSBwcmVjZWRpbmcgWE1MX1RBR19OQU1FIHJlZ2lvbi4gUmVseWluZyBvbiB0aGlzLAotCQkJICogZXh0cmFjdCB0aGUgdGFyZ2V0IHByb2Nlc3NvciBuYW1lIGFuZCBjcmVhdGUgYSBwYXJ0aXRpb24gdHlwZQotCQkJICogZHluYW1pY2FsbHkuCi0JCQkgKi8KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jUmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJSVRleHRSZWdpb24gbmFtZSA9IGRvY1JlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2NSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRTdGFydCgpIC0gMSk7Ci0JCQlyZXN1bHQgPSBJWE1MUGFydGl0aW9ucy5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX1BSRUZJWCArIGRvY1JlZ2lvbi5nZXRUZXh0KG5hbWUpLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pCi0JCQlyZXN1bHQgPSBJWE1MUGFydGl0aW9ucy5YTUxfUEk7Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTikKLQkJCXJlc3VsdCA9IElYTUxQYXJ0aXRpb25zLlhNTF9ERUNMQVJBVElPTjsKLQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVCkKLQkJCXJlc3VsdCA9IElYTUxQYXJ0aXRpb25zLkRURF9TVUJTRVQ7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IHN1cGVyLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShGb3JlaWduUmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQkvLyB0ZW1wIGFkZGVkIGp1c3QgdG8gZGlzLWFtYmlndWF0ZSBjYWxsIGZyb20gc3ViY2xhc3MKLQkJcmV0dXJuIHN1cGVyLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c05vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dE5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKHByZXZpb3VzTm9kZSwgbmV4dE5vZGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKSB7Ci0JCXJldHVybiBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwgaW5zdGFuY2UgPSBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcygpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25Gcm9tQmxvY2tlZFRleHQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0LCBTdHJpbmcgcmVzdWx0KSB7Ci0JCS8vIHdhcyBtb3ZlZCB0byBzdWJjbGFzcyBmb3IgcXVpY2sgdHJhbnNpdGlvbgotCQlTdHJpbmcgbmV3UmVzdWx0ID0gcmVzdWx0OwotCQkvLyBuc2RfVE9ETzogRGF2aWQgYW5kIEkgbmVlZCB0byBkaXNjdXNzLCBkZXNpZ24sIGFuZCBpbXBsZW1lbnQgdGhpcwotCQkvLyBmb3IgYWxsIGJsb2NrIHRhZ3MgYW5kIGNvbW1lbnRzCi0JCS8vIGFuZCBtYWtlIHN1cmUgaXMgcGFydCBvZiAiZXh0ZW5zaWJsZSIgZGVzaWduIG9mIGJsb2NrIHRhZ3MKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQkvLyBmb3IgY29kZSBzYWZldHksIHdlJ2xsIGFsd2F5cyBjaGVjayBpbnN0YW5jZW9mLCBidXQgSSB0aGluawotCQkJLy8gYWx3YXlzIHRydWUuCi0JCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgRm9yZWlnblJlZ2lvbikgewotCQkJCS8vIHN1cGVyIGlzIHVzZWQgYmVsb3cgc28gd29uJ3QgYmUgYW1iaWd1b3VzCi0JCQkJbmV3UmVzdWx0ID0gZ2V0UGFydGl0aW9uVHlwZSgoRm9yZWlnblJlZ2lvbikgcmVnaW9uLCBvZmZzZXQpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uIGluc3RhbmNlb2YgRm9yZWlnblJlZ2lvbikgewotCQkJCW5ld1Jlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKEZvcmVpZ25SZWdpb24pIHJlZ2lvbiwgb2Zmc2V0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld1Jlc3VsdCA9IGdldFVua25vd24oKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRvUGFyc2VyU3BlY2lmaWNDaGVjayhpbnQgb2Zmc2V0LCBib29sZWFuIHBhcnRpdGlvbkZvdW5kLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXh0LCBJVGV4dFJlZ2lvbiBwcmV2aW91c1N0YXJ0KSB7Ci0JCS8vIHRoaXMgd2FzIG1vdmVkIGRvd24gdG8gc3ViY2xhc3Mgb2YgU3RydWN0dXJlZFRleHRQYXJ0aW9uZXIKLQkJLy8gZm9yIHF1aWNrIGZpeCB0byB0cmFuc2l0aW9uIHByb2JsZW1zLiBIZWlyYXJjaHkgbmVlZHMgbG90cyBvZgotCQkvLyBjbGVhbnVwLgotCQlpZiAocHJldmlvdXNTdGFydCAhPSBudWxsICYmIHByZXZpb3VzU3RhcnQuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOICYmIG5leHQuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJSVRleHRSZWdpb24gcHJldmlvdXNOYW1lID0gcHJldmlvdXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocHJldmlvdXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KHByZXZpb3VzU3RhcnQpKTsKLQkJCUlUZXh0UmVnaW9uIG5leHROYW1lID0gc2RSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KG5leHQpKTsKLQkJCWlmIChwcmV2aW91c05hbWUgIT0gbnVsbCAmJiBuZXh0TmFtZSAhPSBudWxsICYmIHByZXZpb3VzTmFtZS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgJiYgbmV4dE5hbWUuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCAwLCBnZXRQYXJ0aXRpb25UeXBlQmV0d2VlbihwcmV2aW91c1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgc2RSZWdpb24pKTsKLQkJCQlwYXJ0aXRpb25Gb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcnRpdGlvbkZvdW5kOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9BYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZGRkYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9BYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdGlvbkNvbXBvbmVudCB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvci4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVmFsaWRhdGlvbkNvbXBvbmVudCBnZXRQcm9wYWdhdGVlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVmFsaWRhdGlvbkFkYXB0ZXIgZ2V0VmFsaWRhdG9yKCk7Ci0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRWYWxpZGF0b3IoKS52YWxpZGF0ZShub2RlKTsKLQotCQlwcm9wYWdhdGVUb0NoaWxkRWxlbWVudHMoZ2V0UHJvcGFnYXRlZSgpLCAoTm9kZSkgbm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb3BhZ2F0ZVRvQ2hpbGRFbGVtZW50cyhWYWxpZGF0aW9uQ29tcG9uZW50IHZhbGlkYXRvciwgTm9kZSBwYXJlbnQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDbGFzcyBjbGF6eiA9IHZhbGlkYXRvci5nZXRDbGFzcygpOwotCi0JCU5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGNoaWxkOwotCQkJCVZhbGlkYXRpb25BZGFwdGVyIHZhID0gKFZhbGlkYXRpb25BZGFwdGVyKSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoY2xhenopOwotCQkJCWlmICh2YSA9PSBudWxsKSB7Ci0JCQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIodmFsaWRhdG9yKTsKLQkJCQkJdmEgPSB2YWxpZGF0b3I7Ci0JCQkJfQotCQkJCS8vIGJ1ZyAxNDMyMTMgLSBDYW4ndCBiYXRjaCB2YWxpZGF0ZSBvcGVuIEhUTUwgZmlsZXMgd2hlbgotCQkJCS8vIGFzLXlvdS10eXBlIHZhbGlkYXRpb24gaXMgZW5hYmxlZAotCQkJCXZhLnNldFJlcG9ydGVyKHZhbGlkYXRvci5nZXRSZXBvcnRlcigpKTsKLQkJCQl2YS52YWxpZGF0ZSgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpOwotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1Byb3BhZ2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvUHJvcGFnYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2U2NTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvUHJvcGFnYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBzaW5jZSAyLjAgTTUgLSBpZiBwcm9wb2dhdGVUb0NoaWxkRWxlbWVudCBpcyBuZWVkZWQsIGp1c3QgY29weQotICogICAgICAgICAgICAgbWV0aG9kIHRvIHlvdXIgb3duIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wYWdhdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcm9wYWdhdGVUb0NoaWxkRWxlbWVudHMoVmFsaWRhdGlvbkNvbXBvbmVudCB2YWxpZGF0b3IsIE5vZGUgcGFyZW50KSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ2xhc3MgY2xhenogPSB2YWxpZGF0b3IuZ2V0Q2xhc3MoKTsKLQotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQgPT0gbnVsbCB8fCBjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCWNvbnRpbnVlOwotCi0JCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGNoaWxkOwotCQkJVmFsaWRhdGlvbkFkYXB0ZXIgdmEgPSAoVmFsaWRhdGlvbkFkYXB0ZXIpIG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihjbGF6eik7Ci0JCQlpZiAodmEgPT0gbnVsbCkgewotCQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIodmFsaWRhdG9yKTsKLQkJCQl2YSA9IHZhbGlkYXRvcjsKLQkJCX0KLQkJCXZhLnZhbGlkYXRlKChJbmRleGVkUmVnaW9uKSBjaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9wYWdhdG9yIGlzIGp1c3QgYSBwbGFjZWhvbGRlciBvZiB1dGlsaXRpZXMuIERvbid0IGluc3RhbnRpYXRlLgotCSAqLwotCXByaXZhdGUgUHJvcGFnYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ZhbGlkYXRpb25Db21wb25lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbkNvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmQ5MjFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbkNvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWxpZGF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgVmFsaWRhdGlvbkFkYXB0ZXIgewotCi0JcHJvdGVjdGVkIFZhbGlkYXRpb25SZXBvcnRlciByZXBvcnRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBWYWxpZGF0aW9uQ29tcG9uZW50IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25Db21wb25lbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBWYWxpZGF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkvLyBUaGlzIG1ldGhvZCB3aWxsIGJlIGltcGxlbWVudGVkIGluIHRoZSBWMi4KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBvcnRlcihWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJdGhpcy5yZXBvcnRlciA9IHJlcG9ydGVyOwotCX0KLQotCVZhbGlkYXRpb25SZXBvcnRlciBnZXRSZXBvcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMucmVwb3J0ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS90ZXh0L0lYTUxQYXJ0aXRpb25zLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL3RleHQvSVhNTFBhcnRpdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkYTc4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL3RleHQvSVhNTFBhcnRpdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dDsKLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uIHR5cGVzIGZvciBYTUwuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVhNTFBhcnRpdGlvbnMgewotCQotCVN0cmluZyBYTUxfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfQ0RBVEEgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9QSSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9QSSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWE1MX0RFQ0xBUkFUSU9OID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFQ0wiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0NPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoKLQkgKiBUaGlzIHZhbHVlIGlzIHVzZWQgYXMgYSBwcmVmaXggdG8gYW55IHVua25vd24gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMKLQkgKiB3ZSBmaW5kLiBUaGUgcHJvY2Vzc29yIHRhcmdldCBuYW1lIGlzIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UgYW5kCi0JICogYXBwZW5kZWQgdG8gdGhlIHByZWZpeCB0byBjcmVhdGUgYSB1bmlxdWUgcGFydGl0aW9uIHR5cGUuCi0JICovCi0JU3RyaW5nIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fUFJFRklYID0gIm9yZy5lY2xpcHNlLndzdC54bWwuUFJPQ0VTU0lOR19JTlNUUlVDVElPTjoiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTaG91bGQgbWF0Y2gKLQkgKiBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZHRkLnBhcnRpdGlvbmluZy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFRELlNUX0RURF9TVUJTRVQKLQkgKi8KLQlTdHJpbmcgRFREX1NVQlNFVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmR0ZC5pbnRlcm5hbF9zdWJzZXQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDAzYzIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy12YWxpZGF0aW9uIiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1tdWx0aXBhZ2UiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXdpemFyZHMiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWNhdGFsb2ciIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIKLQkJcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIgotCQlwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvVmFsaWRhdGlvbkV4Y2VwdGlvbiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Mb2NhbGl6ZWRNZXNzYWdlLyIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZSIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9NZXNzYWdlIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlciIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvciIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZCIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFNpbmdsZUZpbGVEaWFsb2ciIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvSU1lc3NhZ2VBY2Nlc3MiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VsZWN0U2luZ2xlRmlsZVZpZXciIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL0RyYWdBbmREcm9wQ29tbWFuZCIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRHJhZ0FuZERyb3BNYW5hZ2VyIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9PYmplY3RUcmFuc2ZlciIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvVmlld2VyRHJhZ0FkYXB0ZXIiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL1ZpZXdlckRyb3BBZGFwdGVyIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db25maWd1cmF0aW9uTWFuYWdlciIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJvamVjdENvbmZpZ3VyYXRpb24iIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yTWV0YURhdGEiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL1ZhbGlkYXRpb25GYWN0b3J5IiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24iIC8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iIC8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMWMyODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXhtbGVkaXRvci5qYXIKLW9yZy5lY2xpcHNlLndzdC54bWwudWlfMS4wLjAuamFyCi1vcmcuZWNsaXBzZS53c3QueG1sLnVpXzEuMC4wLnppcAoteG1sZWRpdG9yc3JjLnppcAotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWNhZThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC54bWwudWkvcHJvamVjdGlvbnBlcmY9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkYzRhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueG1sLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+PC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MTJkYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSNTYXQgTWFyIDI0IDAyOjU5OjQ5IEVEVCAyMDA3DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVjZTdiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSNXZWQgTm92IDIyIDIzOjIzOjAxIEVTVCAyMDA2Ci1jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLWNsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz1mYWxzZQotY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLWNsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLWNsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLWNsZWFudXAuZm9ybWF0X2NvbW1lbnQ9dHJ1ZQotY2xlYW51cC5mb3JtYXRfamF2YWRvYz10cnVlCi1jbGVhbnVwLmZvcm1hdF9tdWx0aV9saW5lX2NvbW1lbnQ9dHJ1ZQotY2xlYW51cC5mb3JtYXRfc2luZ2xlX2xpbmVfY29tbWVudD10cnVlCi1jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9dHJ1ZQotY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLWNsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPWZhbHNlCi1jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLWNsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLWNsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1jbGVhbnVwLnVzZV9ibG9ja3M9dHJ1ZQotY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLWNsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1jbGVhbnVwX3Byb2ZpbGU9X1NTRSBUZWFtIFN0eWxlcwotY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNGE4YmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jV2VkIEp1biAwNCAyMDowNzo0NyBFRFQgMjAwOAotY29tcGlsZXJzLmYudW5yZXNvbHZlZC1mZWF0dXJlcz0xCi1jb21waWxlcnMuZi51bnJlc29sdmVkLXBsdWdpbnM9MQotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmRpc2NvdXJhZ2VkLWNsYXNzPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLmludGVybmFsPTEKLWNvbXBpbGVycy5wLm1pc3NpbmctcGFja2FnZXM9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24taWRlbnRpZmllcj0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucy5jcmVhdGUtZG9jcz1mYWxzZQotY29tcGlsZXJzLnMuZG9jLWZvbGRlcj1kb2MKLWNvbXBpbGVycy5zLm9wZW4tdGFncz0xCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VmYTY0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhtbC51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC54bWwudWksCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb3JyZWN0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kbmQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRvdWJsZWNsaWNrO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3I7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbms7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLm5zZWRpdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucGVyc3BlY3RpdmU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvcGVydGllczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnF1aWNrb3V0bGluZSwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnJlZ2lzdHJ5O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWFyY2g7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3BlbGxpbmcsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5lcnJvcmluZm87eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MucHJvcGVydGllcwotSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnV0aWw7IHZlcnNpb249IjMuOCIsCi0gY29tLmlibS5pY3UudGV4dDsgdmVyc2lvbj0iMy44IgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkudmlld3M7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAxLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjUwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjEuNDAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMTAwLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuNC4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW07YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eTsgZXhjbHVkZTo9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mbyIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2Fib3V0LmluaSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YWYyOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2Fib3V0Lm1hcHBpbmdzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvYWJvdXQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjYwMzk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9RWNsaXBzZSBYTUwgRWRpdG9ycyBhbmQgVG9vbHNcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNSwgMjAwOS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2RiZDEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHRlbXBsYXRlcy8sXAotICAgICAgICAgICAgICAgZXhhbXBsZXMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICBzcmMtbXVsdGlwYWdlLyxcCi0gICAgICAgICAgIHNyYy13aXphcmRzLyxcCi0gICAgICAgICAgIHNyYy1jYXRhbG9nLyxcCi0gICAgICAgICAgIHNyYy12YWxpZGF0aW9uLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2V4YW1wbGVzL0VkaXRpbmdBbmRWYWxpZGF0aW5nWE1MLnppcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9leGFtcGxlcy9FZGl0aW5nQW5kVmFsaWRhdGluZ1hNTC56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNTc3NjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2V4YW1wbGVzL0VkaXRpbmdBbmRWYWxpZGF0aW5nWE1MLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDljMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvWE1MRmlsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvWE1MRmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZWIxYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL1hNTEZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb2xsYXBzZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbGxhcHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3NDcyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbGxhcHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvY29sbGFwc2VfYWxsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvY29sbGFwc2VfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjMGRlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbGxhcHNlX2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbnN0cmFpbm9mZi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbnN0cmFpbm9mZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZGNlYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb25zdHJhaW5vZmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb25zdHJhaW5vbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbnN0cmFpbm9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyM2Q1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbnN0cmFpbm9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvZXhwYW5kLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvZXhwYW5kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzN2I3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cGFuZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cGFuZF9hbGwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9leHBhbmRfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyYzE0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cGFuZF9hbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfeG1sLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X3htbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxY2ZkZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfeG1sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvcmxkZ3Jtci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3JsZGdybXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTMyNWRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvcmxkZ3Jtci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3ZhbGlkYXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvdmFsaWRhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjFkMTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvdmFsaWRhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb2xsYXBzZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbGxhcHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1YmMxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbGxhcHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvY29sbGFwc2VfYWxsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvY29sbGFwc2VfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkODBhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbGxhcHNlX2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbnN0cmFpbm9mZi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbnN0cmFpbm9mZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYWIwNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vZmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbnN0cmFpbm9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgyZjljMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbnN0cmFpbm9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvZXhwYW5kLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvZXhwYW5kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmNDUzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2V4cGFuZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2V4cGFuZF9hbGwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBhbmRfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwNWIyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2V4cGFuZF9hbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfeG1sLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X3htbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZmI2MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfeG1sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvcmxkZ3Jtci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3JsZGdybXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDljYWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvcmxkZ3Jtci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3ZhbGlkYXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvdmFsaWRhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjM0N2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvdmFsaWRhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvWFNERmlsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9YU0RGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwZWViNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9YU0RGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2FkZF9jb3JyZWN0aW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2FkZF9jb3JyZWN0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyZDdlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9hZGRfY29ycmVjdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9hdHRfcmVxX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9hdHRfcmVxX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YzY2ZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXR0X3JlcV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkNDlkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2NkYXRhc2VjdGlvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jZGF0YXNlY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjA4NzJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2NkYXRhc2VjdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jaG9pY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2hvaWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzYmEyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jaG9pY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29tbWVudF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29tbWVudF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGMyY2NiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2NvbW1lbnRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2NvcnJlY3Rpb25fY2hhbmdlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2NvcnJlY3Rpb25fY2hhbmdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4M2M1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jb3JyZWN0aW9uX2NoYW5nZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9kZWZhdWx0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2RlZmF1bHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2VkMjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2RlZmF1bHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZG9jdHlwZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9kb2N0eXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwMGY4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9kb2N0eXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2R0ZGZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZHRkZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMGFjYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZHRkZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Njc4MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZmQzZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eV9yZWZlcmVuY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5X3JlZmVyZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZjkxNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5X3JlZmVyZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnVtLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VudW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzBhNDgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VudW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZXJyb3Itb3ZlcmxheS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lcnJvci1vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZGNjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lcnJvci1vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2Vycm9yX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lcnJvcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM2MDY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2Vycm9yX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbHZhcmlhYmxlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbHZhcmlhYmxlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNDRiMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvbG9jYWx2YXJpYWJsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvbm90YXRpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvbm90YXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2FkMDg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L25vdGF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L29jY3Vyb25lX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9vY2N1cm9uZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmI2NWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L29jY3Vyb25lX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9pbnN0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9pbnN0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDM2ZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJvaW5zdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNjNWQwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVmNTE2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctbWFjcm8uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLW1hY3JvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxZjgxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctbWFjcm8uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnX2dlbmVyaWNfZGVlbXBoYXNpemVkX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWdfZ2VuZXJpY19kZWVtcGhhc2l6ZWRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FjYjQwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWdfZ2VuZXJpY19kZWVtcGhhc2l6ZWRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZ19nZW5lcmljX2VtcGhhc2l6ZWRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZ19nZW5lcmljX2VtcGhhc2l6ZWRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVjMWRiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWdfZ2VuZXJpY19lbXBoYXNpemVkX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3RleHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmE3YTM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3RleHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdHh0ZXh0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3R4dGV4dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMjZlNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdHh0ZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3dhcm5pbmdfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3dhcm5pbmdfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1ZjVlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi93YXJuaW5nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZGNjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb3ZyMTYvc3RhbGVfZXJyb3Jfb3ZyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL292cjE2L3N0YWxlX2Vycm9yX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMDQ3MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb3ZyMTYvc3RhbGVfZXJyb3Jfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL292cjE2L3dhcm5fb3ZyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL292cjE2L3dhcm5fb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1MDcwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vdnIxNi93YXJuX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC92aWV3MTYvYXR0aWJ1dGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvdmlldzE2L2F0dGlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkNDlkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC92aWV3MTYvYXR0aWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvdmlldzE2L2hpZXJhcmNoeS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC92aWV3MTYvaGllcmFyY2h5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M3ZGNhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC92aWV3MTYvaGllcmFyY2h5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL3ZpZXcxNi9zeW5jZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvdmlldzE2L3N5bmNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MDkzNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvdmlldzE2L3N5bmNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC93aXpiYW4vZ2VuZXJhdGV4bWxfd2l6LnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL3dpemJhbi9nZW5lcmF0ZXhtbF93aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTdlNDhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL3dpemJhbi9nZW5lcmF0ZXhtbF93aXoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwveG1sX3BlcnNwZWN0aXZlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL3htbF9wZXJzcGVjdGl2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MzliNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwveG1sX3BlcnNwZWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9uZXdTYW1wbGVQcm9qZWN0X3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzk2YjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9uZXdTYW1wbGVQcm9qZWN0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXpiYW5uZXIucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL25ld1NhbXBsZVByb2plY3Rfd2l6YmFubmVyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU3MTQ3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXpiYW5uZXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL3NvdXJjZUVkaXRvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvc291cmNlRWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlYmRiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvc291cmNlRWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy94bWxkb2MuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL3htbGRvYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZWIxYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL3htbGRvYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYzI5NjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIERhdmlkIENhcnZlciAvIFNUQVIgU3RhbmRhcmRzIC0gYWRkZWQgWE1MIENhdGFsb2cgSW1wb3J0L0V4cG9ydCBXaXphcmQKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVnIDE5MjU2OAotIyAgICAgRGF2aWQgQ2FydmVyIC8gU1RBUiBTdGFuZGFyZHMgLSBidWcgMjEyMzMwIC0gbWlncmF0ZSB0byBvcmcuZWNsaXBzZS51aS5tZW51cyAJCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLXBsdWdpbk5hbWU9RWNsaXBzZSBYTUwgRWRpdG9ycyBhbmQgVG9vbHMKLVhNTC5uYW1lPVhNTAotWE1MX0ZpbGVzLm5hbWU9WE1MIEZpbGVzCi1YTUxfU291cmNlLm5hbWU9RWRpdG9yCi1YTUxfQ29udGVudF9Bc3Npc3QubmFtZT1Db250ZW50IEFzc2lzdAotWE1MX1ZhbGlkYXRvci5uYW1lPVZhbGlkYXRpb24KLVhNTF9UZW1wbGF0ZXMubmFtZT1UZW1wbGF0ZXMKLVhNTF9TdHlsZXMubmFtZT1TdHlsZXMKLVhNTF9TeW50YXhfQ29sb3Jpbmc9U3ludGF4IENvbG9yaW5nCi1YTUxfVHlwaW5nPVR5cGluZwotWE1MX0VkaXRvci5uYW1lPVhNTCBFZGl0b3IKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLV9VSV9XSVpBUkRfTkVXX1hNTD1YTUwgRmlsZQotWE1MX05ld19GaWxlLnRvb2x0aXA9TmV3IFhNTCBGaWxlCi1fVUlfV0laQVJEX1hNTF9DQVRFR09SWT1YTUwKLWdlbk1lbnVMYWJlbD0mR2VuZXJhdGUKLV9VSV9BQ1RJT05fQ1JFQVRFX1hNTD0mWE1MIEZpbGUuLi4KLV9VSV9DUkVBVEVfTkVXX1hNTF9GSUxFPUNyZWF0ZSBhIG5ldyBYTUwgZmlsZQotX1VJX1dJWkFSRF9JTVBPUlRfRVhQT1JUX1hNTENBVEFMT0c9WE1MIENhdGFsb2cKLV9VSV9JTVBPUlRfWE1MX0NBVEFMT0dfRklMRT1JbXBvcnQgYW4gZXhpc3RpbmcgWE1MIENhdGFsb2cuCi1fVUlfRVhQT1JUX1hNTF9DQVRBTE9HX0ZJTEU9RXhwb3J0IGFuIFhNTCBDYXRhbG9nLgotWE1MRXhhbXBsZS5uYW1lPUVkaXRpbmcgYW5kIHZhbGlkYXRpbmcgWE1MIGZpbGVzCi1YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmRlc2NyaXB0aW9uPUNyZWF0ZSBhIHByb2plY3QgY29udGFpbmluZyBYTUwgc2FtcGxlIGZpbGVzCi1YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnByb2plY3RuYW1lPVhNTEV4YW1wbGVzCi1YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnBhZ2V0aXRsZT1YTUwgc2FtcGxlIGZpbGVzIGZvciBlZGl0aW5nIGFuZCB2YWxpZGF0aW5nCi1YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnBhZ2VkZXNjcmlwdGlvbj1DcmVhdGUgYSBwcm9qZWN0IGNvbnRhaW5pbmcgWE1MIHNhbXBsZSBmaWxlcy4KLVhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQubGFiZWw9JlByb2plY3QgTmFtZToKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUFsbF9YTUxfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9QWxsIFhNTAotWE1MX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1OZXcgWE1MCi1YTUxfVGFnX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPVhNTCBUYWcKLVhNTF9BdHRyaWJ1dGVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9WE1MIEF0dHJpYnV0ZQotWE1MX0F0dHJpYnV0ZV92YWx1ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1YTUwgQXR0cmlidXRlIHZhbHVlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BZGRUYXNrLmxhYmVsPUFkZCAmVGFzay4uLgotQWRkVGFzay50b29sdGlwPUFkZCBUYXNrLi4uCi1BZGRCb29rbWFyay5sYWJlbD1BZGQgQm9vJmttYXJrLi4uCi1BZGRCb29rbWFyay50b29sdGlwPUFkZCBCb29rbWFyay4uLgotU2VsZWN0UnVsZXIubGFiZWw9U2VsZWN0IFJ1bGVyCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1YTUxfQ2F0YWxvZ19GaWxlX1R5cGVfRXh0ZW5zaW9uX1BvaW50Lm5hbWU9WE1MIENhdGFsb2cgZmlsZSB0eXBlIGV4dGVuc2lvbiBwb2ludAotX1VJX1BSRUZfWE1MX0NBVEFMT0c9WE1MIENhdGFsb2cKLV9VSV9QUkVGX0RURF9GSUxFUz1EVEQgRmlsZXMKLV9VSV9QUkVGX1hTRF9GSUxFUz1YU0QgRmlsZXMKLV9VSV9QUkVGX1RBR0xJQl9ERUZfRklMRVM9VGFnbGliIERlZmluaXRpb24gRmlsZXMKLV9VSV9QUkVGX0NBVEFMT0dfRklMRVM9WE1MIENhdGFsb2cgRmlsZXMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLV9VSV9YTUxfVkFMSURBVE9SICAgICAgICAgICAgICAgICAgID0gWE1MIFZhbGlkYXRvcgotX1VJX1JFRl9GSUxFX1NIT1dfREVUQUlMUyAgICAgICAgICAgPSBTaG93IERldGFpbHMuLi4KLV9VSV9NRU5VX1ZBTElEQVRFX1hNTCAgICAgICAgICAgICAgID0gVmFsaWRhdGUgWE1MIEZpbGUKLSMjCi1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotVG9nZ2xlQ29tbWVudF9sYWJlbD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF90b29sdGlwPVRvZ2dsZSBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfbGFiZWw9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF90b29sdGlwPUFkZCBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1GaW5kT2NjdXJyZW5jZXNfbGFiZWw9T2NjdXJyZW5jZXMgaW4gRmlsZQotIyMKLXByZWZlcmVuY2VLZXl3b3Jkcy5maWxlcz1lZGl0b3IgeG1sIGNyZWF0aW5nIHNhdmluZyBmaWxlcyBzdWZmaXggc3BlY2lmaWVkIGVuY29kaW5nIGlhbmEKLXByZWZlcmVuY2VLZXl3b3Jkcy5zb3VyY2U9ZWRpdG9yIHhtbCBzb3VyY2UgZm9ybWF0dGluZyBsaW5lIHdpZHRoIHNwbGl0IG11bHRpcGxlIGF0dHJpYnV0ZXMgbmV3IGNsZWFyIGJsYW5rIGluZGVudCB0YWJzIHNwYWNlcyBzaXplIGNvbnRlbnQgYXNzaXN0IGF1dG9tYXRpY2FsbHkgc3VnZ2VzdGlvbnMgcHJvbXB0IGNoYXJhY3RlcnMgaW5zZXJ0ZWQgc3RyYXRlZ3kgbGF4IHN0cmljdCBncmFtbWFyIGNvbnN0cmFpbnRzIGluZmVycmVkIGFic2VuY2UgZHRkIHNjaGVtYQotcHJlZmVyZW5jZUtleXdvcmRzLmNvbnRlbnRhc3Npc3Q9eG1sIGVkaXRvciBjb250ZW50IGNvZGUgYXNzaXN0IGNvbXBsZXRlIGNvbXBsZXRpb24gaW5zZXJ0IG92ZXJ3cml0ZSBzaW5nbGUgcHJvcG9zYWwgY29tbW9uIHByZWZpeCBhdXRvbWF0aWNhbGx5IGltcG9ydCBmaWxsIGFyZ3VtZW50IG5hbWUgZ3Vlc3MgYWxwaGFiZXRpY2FsIGhpZGUgYXV0byBhY3RpdmF0aW9uIHRyaWdnZXIgY2F0ZWdvcnkgY2F0ZWdvcmllcyBzZXBhcmF0ZSBzcGVjaWZpYwotcHJlZmVyZW5jZUtleXdvcmRzLnRlbXBsYXRlcz1lZGl0b3IgeG1sIHRlbXBsYXRlcyBzbmlwcGV0IG1hY3JvcwotcHJlZmVyZW5jZUtleXdvcmRzLnN0eWxlcz1lZGl0b3IgeG1sIHN0eWxlIGN1c3RvbWl6ZSBzeW50YXggaGlnaGxpZ2h0aW5nIHR5cGUgdGV4dCBjb250ZW50IGZvcmVncm91bmQgYmFja2dyb3VuZCBib2xkIGNvbG9yCi1wcmVmZXJlbmNlS2V5d29yZHMueG1sY2F0YWxvZz14bWwgY2F0YWxvZyBlbnRyaWVzCi1wcmVmZXJlbmNlS2V5d29yZHMuc2V2ZXJpdGllcz14bWwgZ3JhbW1hciBlcnJvcnMgd2FybmluZ3MgaWdub3JlIG9wdGlvbnMgc2V2ZXJpdHkgc2V2ZXJpdGllcyBzdXBwcmVzcyBwcm9qZWN0IHNwZWNpZmljIHByb2plY3RzcGVjaWZpYwotCi0jIwotWE1MX1NvdXJjZV90YXJnZXRfbmFtZT1YTUwgRWRpdG9ycwotWE1MX2h5cGVybGluaz1UYWdzIEFuZCBBdHRyaWJ1dGVzCi0jIwotRGVzaWduTWVudV9uYW1lPSZEZXNpZ24KLVJlbG9hZERlcGVuZGVuY2llc19uYW1lPVJlbG9hZCBEZXBlbmRlbmNpZXMKLVJlbG9hZERlcGVuZGVuY2llc19kZXNjcmlwdGlvbj1SZWxvYWQgRGVwZW5kZW5jaWVzCi1SZWxvYWREZXBlbmRlbmNpZXNfbW5lbW9uaWM9UgotQ29uc3RyYWludHNfbmFtZT1UdXJuIG9mZiBHcmFtbWFyIENvbnN0cmFpbnRzCi1Db25zdHJhaW50c19kZXNjcmlwdGlvbj1UdXJuIG9mZiBncmFtbWFyIENvbnN0cmFpbnRzCi1Db25zdHJhaW50c19tbmVtb25pYz1UCi1FeHBhbmRBbGxfbmFtZT1FeHBhbmQgQWxsCi1Db2xsYXBzZUFsbF9uYW1lPUNvbGxhcHNlIEFsbAotQWN0aW9uRGVmaW5pdGlvbi5uZXh0U2libGluZy5uYW1lPU5leHQgU2libGluZwotQWN0aW9uRGVmaW5pdGlvbi5uZXh0U2libGluZy5kZXNjcmlwdGlvbj1HbyB0byBOZXh0IFNpYmxpbmcKLUFjdGlvbkRlZmluaXRpb24ucHJldmlvdXNTaWJsaW5nLm5hbWU9UHJldmlvdXMgU2libGluZwotQWN0aW9uRGVmaW5pdGlvbi5wcmV2aW91c1NpYmxpbmcuZGVzY3JpcHRpb249R28gdG8gUHJldmlvdXMgU2libGluZwotQWN0aW9uRGVmaW5pdGlvbi5nb3RvTWF0Y2hpbmdUYWcubmFtZT1NYXRjaGluZyBUYWcKLUFjdGlvbkRlZmluaXRpb24uZ290b01hdGNoaW5nVGFnLmRlc2NyaXB0aW9uPUdvIHRvIE1hdGNoaW5nIFRhZwotTWF0Y2hpbmdUYWdQcmVmZXJlbmNlLmxhYmVsPU1hdGNoaW5nIFRhZ3MKLQotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwubmFtZT1FZGl0aW5nIFhNTCBTb3VyY2UKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmRlc2NyaXB0aW9uPUVkaXRpbmcgWE1MIFNvdXJjZQotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwubmF2aWdhdGlvbi5uYW1lPVhNTCBTb3VyY2UgTmF2aWdhdGlvbgotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwubmF2aWdhdGlvbi5kZXNjcmlwdGlvbj1YTUwgU291cmNlIE5hdmlnYXRpb24KLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmNsZWFudXAubmFtZT1YTUwgU291cmNlIENsZWFudXAKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmNsZWFudXAuZGVzY3JpcHRpb249WE1MIFNvdXJjZSBDbGVhbnVwCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5jb21tZW50cy5uYW1lPVhNTCBTb3VyY2UgQ29tbWVudHMKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmNvbW1lbnRzLmRlc2NyaXB0aW9uPVhNTCBTb3VyY2UgQ29tbWVudHMKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLnNlbGVjdGlvbi5uYW1lPVhNTCBTb3VyY2UgU2VsZWN0aW9uCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5zZWxlY3Rpb24uZGVzY3JpcHRpb249WE1MIFNvdXJjZSBTZWxlY3Rpb24KLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmRlcGVuZGVuY2llcy5uYW1lPVhNTCBTb3VyY2UgRGVwZW5kZW5jaWVzCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5kZXBlbmRlbmNpZXMuZGVzY3JpcHRpb249WE1MIFNvdXJjZSBEZXBlbmRlbmNpZXMKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmdyYW1tYXIubmFtZT1YTUwgU291cmNlIEdyYW1tYXIKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmdyYW1tYXIuZGVzY3JpcHRpb249WE1MIFNvdXJjZSBHcmFtbWFyCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5leHBhbmQubmFtZT1YTUwgU291cmNlIEV4cGFuZC9Db2xsYXBzZQotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuZXhwYW5kLmRlc2NyaXB0aW9uPVhNTCBTb3VyY2UgRXhwYW5kL0NvbGxhcHNlCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5vY2N1cnJlbmNlcy5uYW1lPVhNTCBTb3VyY2UgT2NjdXJyZW5jZXMKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLm9jY3VycmVuY2VzLmRlc2NyaXB0aW9uPVhNTCBTb3VyY2UgT2NjdXJyZW5jZXMKLQotQ29sb3JzLnRhZ0F0dHJpYnV0ZU5hbWU9VGFnIEF0dHJpYnV0ZSBOYW1lCi1Db2xvcnMudGFnQXR0cmlidXRlVmFsdWU9VGFnIEF0dHJpYnV0ZSBWYWx1ZQotQ29sb3JzLmNvbW1lbnRCb3JkZXI9Q29tbWVudCBCb3JkZXIKLUNvbG9ycy5jb21tZW50VGV4dD1Db21tZW50IFRleHQKLUNvbG9ycy5kZWNsQm9yZGVyPURlY2xhcmF0aW9uIEJvcmRlcgotQ29sb3JzLmRvY3R5cGVOYW1lPURvY3R5cGUgTmFtZQotQ29sb3JzLmRvY3R5cGVFeHRlcm5hbFB1YnJlZj1Eb2N0eXBlIEV4dGVybmFsIFB1YmxpYyBSZWZlcmVuY2UKLUNvbG9ycy5kb2N0eXBlRXh0ZXJuYWxJZD1Eb2N0eXBlIEV4dGVybmFsIElkCi1Db2xvcnMuZG9jdHlwZUV4dHJlbmFsU3lzcmVmPURvY3R5cGUgRXh0ZXJuYWwgU3lzdGVtIFJlZmVyZW5jZQotQ29sb3JzLnRhZ0JvcmRlcj1UYWcgQm9yZGVyCi1Db2xvcnMudGFnTmFtZT1UYWcgTmFtZQotQ29sb3JzLnBpQm9yZGVyPVByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24gQm9yZGVyCi1Db2xvcnMuY2RhdGFCb3JkZXI9Q0RBVEEgQm9yZGVyCi1Db2xvcnMuY2RhdGFUZXh0PUNEQVRBIFRleHQKLUNvbG9ycy5lbnRpdHlSZWZlcmVuY2U9RW50aXR5IFJlZmVyZW5jZQotCi0jIE1lbnUgY29udHJpYnV0aW9ucwotY29tbWFuZC50b2dnbGUuY29tbWVudC5tbmVtb25pYz1UCi1jb21tYW5kLmFkZC5ibG9jay5jb21tZW50Lm1uZW1vbmljPUEKLWNvbW1hbmQucmVtb3ZlLmJsb2NrLmNvbW1lbnQubW5lbW9uaWM9UgotCi0jIGNvbnRlbnQgYXNzaXN0Ci1wcm9wb3NhbENhdGVnb3J5LnhtbFRhZ3M9WE1MIFRhZyBQcm9wb3NhbHMKLXByb3Bvc2FsQ2F0ZWdvcnkueG1sVGVtcGxhdGVzPVhNTCBUZW1wbGF0ZSBQcm9wb3NhbHMKLQotI1hNTCBDb250ZW50IE1vZGVsCi1jb250ZW50TW9kZWwudmlldy5uYW1lPUNvbnRlbnQgTW9kZWwKLWNvbnRlbnRNb2RlbC52aWV3LnN5bmNoLnRvb2x0aXA9TGluayB3aXRoIEVkaXRvcgotY29udGVudE1vZGVsLmNvbW1hbmQuc3luY2gubmFtZT1TeW5jaAotCi0jIFhNTCBEb2N1bWVudGF0aW9uIHZpZXcKLXhtbGFubm90YXRpb25zPURvY3VtZW50YXRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NzEyMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4zIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbi1wb2ludCBpZD0iY2F0YWxvZ0ZpbGVUeXBlIiBuYW1lPSIlWE1MX0NhdGFsb2dfRmlsZV9UeXBlX0V4dGVuc2lvbl9Qb2ludC5uYW1lIiBzY2hlbWE9InNjaGVtYS9jYXRhbG9nRmlsZVR5cGUuZXhzZCIvPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jYXRhbG9nRmlsZVR5cGUiPgotCQk8ZmlsZVR5cGUKLQkJCWV4dGVuc2lvbnM9ImR0ZCwgZW50LCBtb2QiCi0JCQlkZXNjcmlwdGlvbj0iJV9VSV9QUkVGX0RURF9GSUxFUyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudWkuY2F0YWxvZ0ZpbGVUeXBlLmR0ZCI+Ci0JCTwvZmlsZVR5cGU+Ci0JCTxmaWxlVHlwZQotCQkJZXh0ZW5zaW9ucz0ieHNkIgotCQkJZGVzY3JpcHRpb249IiVfVUlfUFJFRl9YU0RfRklMRVMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnVpLmNhdGFsb2dGaWxlVHlwZS54c2QiPgotCQk8L2ZpbGVUeXBlPgotCQk8ZmlsZVR5cGUKLQkJCWV4dGVuc2lvbnM9InRsZCIKLQkJCWRlc2NyaXB0aW9uPSIlX1VJX1BSRUZfVEFHTElCX0RFRl9GSUxFUyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudWkuY2F0YWxvZ0ZpbGVUeXBlLnRsZCI+Ci0JCTwvZmlsZVR5cGU+Ci0JCTxmaWxlVHlwZQotCQkJZXh0ZW5zaW9ucz0ieG1sLCBjYXQsIHhtbGNhdGFsb2ciCi0JCQlkZXNjcmlwdGlvbj0iJV9VSV9QUkVGX0NBVEFMT0dfRklMRVMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnVpLmNhdGFsb2dGaWxlVHlwZS5jYXQiPgotCQk8L2ZpbGVUeXBlPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLVRoZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIGNvbnRlbnQgdHlwZSBpcyBvbmx5IGZvcgotCQloYW5kbGluZyBzb21lIHNwZWNpYWwgY2FzZXMgb2YgaWxsLWZvcm1lZCB4bWwgaW4gYSByZWFzb25hYmxlCi0JCW1hbm5lciwgYW5kIHNob3VsZCBub3QgYmUgZW11bGF0ZWQgYnkgY2xpZW50cy4gVGhlIHR3byBjb250ZW50Ci0JCXR5cGVzIGFyZSBvZnRlbiB1c2VkIGludGVyY2hhbmdlYWJseSBieSB0aGUgWE1MIGNvbXBvbmVudCwgYnV0Ci0JCXBsZWFzZSB1c2Ugb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCBpbnN0ZWFkLiAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXRvckNvbmZpZ3VyYXRpb24iPgotCQk8c291cmNlVmlld2VyQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCQk8Y29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS52aWV3cy5jb250ZW50b3V0bGluZS5YTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwsIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiIC8+Ci0JCTxxdWlja091dGxpbmVDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5xdWlja291dGxpbmUuWE1MUXVpY2tPdXRsaW5lQ29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQkJPHByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS52aWV3cy5wcm9wZXJ0aWVzLlhNTFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCQk8ZG9jdW1lbnRhdGlvblRleHRIb3ZlcgotICAgICAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFnaW5mby5YTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IiCi0gICAgICAgIAl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiPgotICAJCTwvZG9jdW1lbnRhdGlvblRleHRIb3Zlcj4KLSAgCQk8ZG91YmxlQ2xpY2tTdHJhdGVneQotICAgICAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZG91YmxlY2xpY2suWE1MRG91YmxlQ2xpY2tTdHJhdGVneSIKLSAgICAgICAgCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCI+Ci0gIAkJPC9kb3VibGVDbGlja1N0cmF0ZWd5PgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJzb3VyY2VlZGl0aW5ndGV4dHRvb2xzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuWE1MU291cmNlRWRpdGluZ1RleHRUb29scyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0iY2hhcmFjdGVycGFpcm1hdGNoZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZXh0LlhNTERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwsIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImZvbGRpbmdzdHJhdGVneSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb24uWE1MRm9sZGluZ1N0cmF0ZWd5IgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb24uWE1MUXVpY2tBc3Npc3RQcm9jZXNzb3IiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImF1dG9lZGl0c3RyYXRlZ3kiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hdXRvZWRpdC5TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneVhNTCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJlZmVyZW5jZXMueG1sLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwuc291cmNlLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC50ZW1wbGF0ZXMsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLmNvbG9ycywgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwuY29udGVudGFzc2lzdCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0ic3BlbGxpbmdyZWdpb25zIgotCQkJdmFsdWU9IlhNTF9DT01NRU5UX1RFWFQsIFhNTF9DT05URU5ULCBYTUxfREVGQVVMVCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0iYWN0aXZlY29udGV4dHMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5uYXZpZ2F0aW9uLCBvcmcuZWNsaXBzZS53c3QueG1sLmNsZWFudXAsIG9yZy5lY2xpcHNlLndzdC54bWwuY29tbWVudHMsIG9yZy5lY2xpcHNlLndzdC54bWwuc2VsZWN0aW9uLCBvcmcuZWNsaXBzZS53c3QueG1sLmRlcGVuZGVuY2llcywgb3JnLmVjbGlwc2Uud3N0LnhtbC5ncmFtbWFyLCBvcmcuZWNsaXBzZS53c3QueG1sLmV4cGFuZCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5vY2N1cnJlbmNlcyIKLSAgICAgICAgCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIgLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cyI+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwubmFtZSIKLQkJCXBhcmVudElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQlkZXNjcmlwdGlvbj0iJXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmRlc2NyaXB0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiPgotCQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwubmF2aWdhdGlvbi5uYW1lIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWRlc2NyaXB0aW9uPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwubmF2aWdhdGlvbi5kZXNjcmlwdGlvbiIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLm5hdmlnYXRpb24iPgotCQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuY2xlYW51cC5uYW1lIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWRlc2NyaXB0aW9uPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuY2xlYW51cC5kZXNjcmlwdGlvbiIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNsZWFudXAiPgotCQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuY29tbWVudHMubmFtZSIKLQkJCXBhcmVudElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQlkZXNjcmlwdGlvbj0iJXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmNvbW1lbnRzLmRlc2NyaXB0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29tbWVudHMiPgotCQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuc2VsZWN0aW9uLm5hbWUiCi0JCQlwYXJlbnRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJZGVzY3JpcHRpb249IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5zZWxlY3Rpb24uZGVzY3JpcHRpb24iCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5zZWxlY3Rpb24iPgotCQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuZGVwZW5kZW5jaWVzLm5hbWUiCi0JCQlwYXJlbnRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJZGVzY3JpcHRpb249IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5kZXBlbmRlbmNpZXMuZGVzY3JpcHRpb24iCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5kZXBlbmRlbmNpZXMiPgotCQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuZ3JhbW1hci5uYW1lIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWRlc2NyaXB0aW9uPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuZ3JhbW1hci5kZXNjcmlwdGlvbiIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmdyYW1tYXIiPgotCQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuZXhwYW5kLm5hbWUiCi0JCQlwYXJlbnRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJZGVzY3JpcHRpb249IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5leHBhbmQuZGVzY3JpcHRpb24iCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5leHBhbmQiPgotCQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwub2NjdXJyZW5jZXMubmFtZSIKLQkJCXBhcmVudElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQlkZXNjcmlwdGlvbj0iJXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLm9jY3VycmVuY2VzLmRlc2NyaXB0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwub2NjdXJyZW5jZXMiPgotCQk8L2NvbnRleHQ+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5hbm5vdGF0aW9uTW9kZWxDcmVhdGlvbiI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSIgLz4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbiI+Ci0JCTxhZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yWE1MIj4KLQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIgLz4KLQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQkJPC9hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JCTwhLS0gVGhlICJ0b3AtbGV2ZWwiIFhNTCBjYXRlZ29yeSAtLT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVYTUwubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkVtcHR5RmlsZVByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJlZmVyZW5jZXMueG1sIj4KLQkJPC9wYWdlPgotCQk8IS0tIFRoZSAibG93ZXIgbGV2ZWwiIFhNTCBGaWxlcyBjYXRlZ29yeS9wYWdlIC0tPgotCQk8cGFnZQotCQkJbmFtZT0iJVhNTF9GaWxlcy5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJlZmVyZW5jZXMueG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MRmlsZXNQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnByZWZlcmVuY2VzLnhtbC54bWwiPgotICAgICAgICAgCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmZpbGVzIi8+Ci0gICAgICAgIDwvcGFnZT4KLQkJPCEtLSBYTUwgUFJFRkVSRU5DRSBQQUdFUyAtLT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVYTUxfU291cmNlLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcmVmZXJlbmNlcy54bWwueG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MU291cmNlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwuc291cmNlIj4KLSAgICAgICAgIAk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zb3VyY2UiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJVhNTF9Db250ZW50X0Fzc2lzdC5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLnNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvbnRlbnRBc3Npc3RQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC5jb250ZW50YXNzaXN0Ij4KLSAgICAgICAgIAk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb250ZW50YXNzaXN0Ii8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVYTUxfVGVtcGxhdGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwuc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC50ZW1wbGF0ZXMiPgotICAgICAgICAgCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnRlbXBsYXRlcyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlWE1MX1N5bnRheF9Db2xvcmluZyIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC5zb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxTeW50YXhDb2xvcmluZ1BhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwuY29sb3JzIj4KLSAgICAgICAgIAk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zdHlsZXMiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJV9VSV9QUkVGX1hNTF9DQVRBTE9HIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJlZmVyZW5jZXMueG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZy5YTUxDYXRhbG9nUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnVpLlhNTENhdGFsb2dQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICAgICAJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkueG1sY2F0YWxvZyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlWE1MX1R5cGluZyIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC5zb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxUeXBpbmdQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC50eXBpbmciPgotCQk8L3BhZ2U+Ci0gICAgCTxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlWE1MX1ZhbGlkYXRvci5uYW1lIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJlZmVyZW5jZXMueG1sLnhtbCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTFZhbGlkYXRvclByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLnZhbGlkYXRpb24iPgotICAgICAgIAkgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuc2V2ZXJpdGllcyIvPgotICAgIAk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBLZXl3b3JkcyBmb3IgcHJlZmVyZW5jZSBhbmQgcHJvcGVydGllcyBwYWdlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5rZXl3b3JkcyI+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5maWxlcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmZpbGVzIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5zb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zb3VyY2UiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLmNvbnRlbnRhc3Npc3QiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb250ZW50YXNzaXN0Ii8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy50ZW1wbGF0ZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS50ZW1wbGF0ZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnN0eWxlcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnN0eWxlcyIvPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMueG1sY2F0YWxvZyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnhtbGNhdGFsb2ciLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnNldmVyaXRpZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zZXZlcml0aWVzIi8+Ci0gICAgPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBFZGl0b3IgYWN0aW9uc2V0cyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zIj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5hY3Rpb25TZXQuYW5ub3RhdGlvbk5hdmlnYXRpb24iPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwuc291cmNlIj48L3BhcnQ+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UyIj48L3BhcnQ+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuTmF2aWdhdGVBY3Rpb25TZXQiPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwuc291cmNlIj48L3BhcnQ+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UyIj48L3BhcnQ+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBUZW1wbGF0ZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZW1wbGF0ZXMiPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVBbGxfWE1MX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVYTUwiCi0JCQlpZD0ieG1sX2FsbCI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJVhNTF9OZXdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZVhNTCIKLQkJCWlkPSJ4bWxfbmV3Ij4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlWE1MX1RhZ19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlWE1MIgotCQkJaWQ9InhtbF90YWciPgotCQk8L2NvbnRleHRUeXBlPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVYTUxfQXR0cmlidXRlX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVYTUwiCi0JCQlpZD0ieG1sX2F0dHJpYnV0ZSI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJVhNTF9BdHRyaWJ1dGVfdmFsdWVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZVhNTCIKLQkJCWlkPSJ4bWxfYXR0cmlidXRlX3ZhbHVlIj4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGluY2x1ZGUKLQkJCWZpbGU9InRlbXBsYXRlcy94bWxkZWZhdWx0LXRlbXBsYXRlcy54bWwiCi0JCQl0cmFuc2xhdGlvbnM9IiRubCQvdGVtcGxhdGVzL3htbGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMiPgotCQk8L2luY2x1ZGU+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLQkJPGVkaXRvcgotCQkJbmFtZT0iJVhNTF9FZGl0b3IubmFtZSIKLQkJCWljb249IiRubCQvaWNvbnMveG1sZG9jLmdpZiIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTE11bHRpUGFnZUVkaXRvclBhcnQiCi0JCQlzeW1ib2xpY0ZvbnROYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTE11bHRpUGFnZUVkaXRvclBhcnQiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiIC8+Ci0JCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQotCQk8L2VkaXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gRWRpdG9yIGFjdGlvbnNldHMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0UGFydEFzc29jaWF0aW9ucyI+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5lZGl0LnRleHQuYWN0aW9uU2V0LmFubm90YXRpb25OYXZpZ2F0aW9uIj4KLQkJCTxwYXJ0Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTE11bHRpUGFnZUVkaXRvclBhcnQiPgotCQkJPC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ij4KLQkJCTxwYXJ0Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTE11bHRpUGFnZUVkaXRvclBhcnQiPgotCQkJPC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCi0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gQ29udHJpYnV0ZSBhICdOZXcgV2l6YXJkJyBmb3IgWE1MIGZpbGVzICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLQkJPGNhdGVnb3J5Ci0JCQluYW1lPSIlX1VJX1dJWkFSRF9YTUxfQ0FURUdPUlkiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LlhNTENhdGVnb3J5Ij4KLQkJPC9jYXRlZ29yeT4KLQkJPHdpemFyZAotCQkJbmFtZT0iJV9VSV9XSVpBUkRfTkVXX1hNTCIKLQkJCWljb249Ii9pY29ucy9mdWxsL2V0b29sMTYvbmV3X3htbC5naWYiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LlhNTENhdGVnb3J5IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdYTUxXaXphcmQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hNTFdpemFyZCI+Ci0JCQk8ZGVzY3JpcHRpb24+JV9VSV9DUkVBVEVfTkVXX1hNTF9GSUxFPC9kZXNjcmlwdGlvbj4KLQkJCTxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0JCQk8L3NlbGVjdGlvbj4KLQkJPC93aXphcmQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBBbGxvdyB0aGUgJ05ldyBYTUwnIHdpemFyZCB0byBiZSBhY2Nlc3NlZCB2aWEgdGhlICdHZW5lcmF0ZScgbWVudSBvbiBhIFhTRCBmaWxlIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkJPG9iamVjdENvbnRyaWJ1dGlvbgotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJbmFtZUZpbHRlcj0iKi54c2QiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbHdpemFyZC5jcmVhdGVYTUxGcm9tWFNEIj4KLQkJCTxtZW51Ci0JCQkJbGFiZWw9IiVnZW5NZW51TGFiZWwiCi0JCQkJcGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJnZW5lcmF0ZVhNTEFydGlmYWN0cyI+Ci0JCQkJPHNlcGFyYXRvciBuYW1lPSJ4bWwiIC8+Ci0JCQk8L21lbnU+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVfVUlfQUNUSU9OX0NSRUFURV9YTUwiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5YTUxJbXBvcnRBY3Rpb25EZWxlZ2F0ZSIKLQkJCQltZW51YmFyUGF0aD0iZ2VuZXJhdGVYTUxBcnRpZmFjdHMveG1sIgotCQkJCWVuYWJsZXNGb3I9IjEiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWx3aXphcmQuY3JlYXRlWE1MRnJvbVhTREFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9vYmplY3RDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0tLT4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIEFsbG93IHRoZSAnTmV3IFhNTCcgd2l6YXJkIHRvIGJlIGFjY2Vzc2VkIHZpYSB0aGUgJ0dlbmVyYXRlJyBtZW51IG9uIGEgRFREIGZpbGUgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkJPG9iamVjdENvbnRyaWJ1dGlvbgotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJbmFtZUZpbHRlcj0iKi5kdGQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbHdpemFyZC5jcmVhdGVYTUxGcm9tRFREIj4KLQkJCTxtZW51Ci0JCQkJbGFiZWw9IiVnZW5NZW51TGFiZWwiCi0JCQkJcGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJnZW5lcmF0ZVhNTEFydGlmYWN0cyI+Ci0JCQkJPHNlcGFyYXRvciBuYW1lPSJ4bWwiIC8+Ci0JCQk8L21lbnU+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVfVUlfQUNUSU9OX0NSRUFURV9YTUwiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5YTUxJbXBvcnRBY3Rpb25EZWxlZ2F0ZSIKLQkJCQltZW51YmFyUGF0aD0iZ2VuZXJhdGVYTUxBcnRpZmFjdHMveG1sIgotCQkJCWVuYWJsZXNGb3I9IjEiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWx3aXphcmQuY3JlYXRlWE1MRnJvbURUREFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9vYmplY3RDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0tLT4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIENvbnRyaWJ1dGUgYSBOZXctPkV4YW1wbGUuLi4gZW50cnkgZm9yIEVkaXRpbmcgYW5kIFZhbGlkYXRpbmcgWE1MIGZpbGVzICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0JPCEtLSBkZWZpbmUgdGhlIFhNTFNhbXBsZXMgcHJvamVjdCB3aXphcmQgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0JCTxjYXRlZ29yeQotCQkJbmFtZT0iJV9VSV9XSVpBUkRfWE1MX0NBVEVHT1JZIgotCQkJcGFyZW50Q2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLkV4YW1wbGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuZXhhbXBsZXMiPgotCQk8L2NhdGVnb3J5PgotCQk8d2l6YXJkCi0JCQluYW1lPSIlWE1MRXhhbXBsZS5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLkV4YW1wbGVzL29yZy5lY2xpcHNlLndzdC54bWwuZXhhbXBsZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkIgotCQkJcHJvamVjdD0idHJ1ZSIKLQkJCWljb249IiRubCQvaWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXouZ2lmIj4KLQkJCTxkZXNjcmlwdGlvbj4KLQkJCQklWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5kZXNjcmlwdGlvbgotCQkJPC9kZXNjcmlwdGlvbj4KLQkJPC93aXphcmQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIGNvbmZpZ3VyZSB0aGUgWE1MU2FtcGxlcyBwcm9qZWN0IHdpemFyZCAtLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQiCi0JCWlkPSJYTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkRXh0ZW5zaW9uIj4KLQkJPHdpemFyZAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCIKLQkJCWJhbm5lcj0iaWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXpiYW5uZXIucG5nIj4KLQkJCTxwcm9qZWN0c2V0dXAKLQkJCQlwYWdldGl0bGU9IiVYTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnBhZ2V0aXRsZSIKLQkJCQluYW1lPSIlWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5wcm9qZWN0bmFtZSIKLQkJCQlsYWJlbD0iJVhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQubGFiZWwiCi0JCQkJcGFnZWRlc2NyaXB0aW9uPSIlWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5wYWdlZGVzY3JpcHRpb24iCi0JCQkJb3Blbj0icmVhZG1lLmh0bWwiPgotCQkJCTxpbXBvcnQKLQkJCQkJZGVzdD0iIgotCQkJCQlzcmM9ImV4YW1wbGVzL0VkaXRpbmdBbmRWYWxpZGF0aW5nWE1MLnppcCIgLz4KLQkJCTwvcHJvamVjdHNldHVwPgotCQk8L3dpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0JCTxmYWN0b3J5Ci0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLkRPTVNlbGVjdGlvbkNvbnZlcnRvckZhY3RvcnkiPgotCQkJPGFkYXB0ZXIKLSAgICAgICAgICAgIAl0eXBlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5TZWxlY3Rpb25Db252ZXJ0b3IiLz4KLQkJPC9mYWN0b3J5PgotCQk8ZmFjdG9yeQotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNwZWxsaW5nLlNwZWxsY2hlY2tEZWxlZ2F0ZUFkYXB0ZXJGYWN0b3J5Ij4KLQkJCTxhZGFwdGVyCi0gICAgICAgICAgICAJdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zcGVsbGluZy5JU3BlbGxjaGVja0RlbGVnYXRlIi8+Ci0JCTwvZmFjdG9yeT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gaW5pdGlhbGl6ZSB4bWwgdWkgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxVSVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJ0b3RhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTCI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9DT01NRU5UIi8+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuU1RfREVGQVVMVCIvPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9DT01NRU5UIi8+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuU1RfREVGQVVMVCIvPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCQotCQkKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuYW5ub3RhdGlvblR5cGVzIj4KLSAgICAgIDx0eXBlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkubWF0Y2hpbmcudGFnIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMubWFya2VyQW5ub3RhdGlvblNwZWNpZmljYXRpb24iPgotICAgICAgPHNwZWNpZmljYXRpb24KLSAgICAgIAkJaW5jbHVkZU9uUHJlZmVyZW5jZVBhZ2U9InRydWUiCi0gICAgICAgICAgICBjb2xvclByZWZlcmVuY2VWYWx1ZT0iMjEyLDIxMiwyMTIiCi0gICAgICAgICAgICBhbm5vdGF0aW9uVHlwZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5tYXRjaGluZy50YWciCi0gICAgICAgICAgICBjb2xvclByZWZlcmVuY2VLZXk9Im1hdGNoaW5nVGFnSW5kaWNhdGlvbkNvbG9yIgotICAgICAgICAgICAgcHJlc2VudGF0aW9uTGF5ZXI9IjQiCi0gICAgICAgICAgICBsYWJlbD0iJU1hdGNoaW5nVGFnUHJlZmVyZW5jZS5sYWJlbCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmIgotICAgICAgICAgICAgdGV4dFByZWZlcmVuY2VWYWx1ZT0iZmFsc2UiCi0gICAgICAgICAgICB0ZXh0UHJlZmVyZW5jZUtleT0ibWF0Y2hpbmdUYWdJbmRpY2F0aW9uIgotICAgICAgICAgICAgaGlnaGxpZ2h0UHJlZmVyZW5jZUtleT0ibWF0Y2hpbmdUYWdIaWdobGlnaHQiCi0gICAgICAgICAgICBoaWdobGlnaHRQcmVmZXJlbmNlVmFsdWU9InRydWUiCi0gICAgICAgICAgICB2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZUtleT0ibWF0Y2hpbmdUYWdWZXJ0aWNhbFJ1bGVyIgotICAgICAgICAgICAgdmVydGljYWxSdWxlclByZWZlcmVuY2VWYWx1ZT0iZmFsc2UiCi0gICAgICAgICAgICBvdmVydmlld1J1bGVyUHJlZmVyZW5jZUtleT0ibWF0Y2hpbmdUYWdJbmRpY2F0aW9uSW5PdmVydmlld1J1bGVyIgotICAgICAgICAgICAgb3ZlcnZpZXdSdWxlclByZWZlcmVuY2VWYWx1ZT0idHJ1ZSIKLSAgICAgICAgICAgIHRleHRTdHlsZVByZWZlcmVuY2VLZXk9Im1hdGNoaW5nVGFnVGV4dFN0eWxlIgotCQkJdGV4dFN0eWxlUHJlZmVyZW5jZVZhbHVlPSJOT05FIj4KLSAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBEb2N1bWVudCBwcm92aWRlciBmb3IgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5kb2N1bWVudFByb3ZpZGVycyI+Ci0JCTxwcm92aWRlcgotCQkJaW5wdXRUeXBlcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsuRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRGaWxlRG9jdW1lbnRQcm92aWRlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkV4dGVybmFsRmlsZURvY3VtZW50UHJvdmlkZXIiPgotCQk8L3Byb3ZpZGVyPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBUbyBEbzogbWlncmF0ZSB0aGlzIHRvIHRoZSBvcmcuZWNsaXBzZS51aS5tZW51cyBwb3B1cDogZm9ybWF0IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCQk8dmlld2VyQ29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UuUnVsZXJDb250ZXh0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IucnVsZXIuY29udGV4dC5hY3Rpb25zIj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZFRhc2subGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuQWRkVGFza19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZFRhc2sudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZEJvb2ttYXJrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQk8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gUG9wLXVwIG1lbnUgYW5kIGFzc29jaWF0ZWQgY29tbWFuZC9oYW5kbGVyIGZvciBuZXN0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlcy4gICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgotICAgICAgPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLnVpLmlkZS5NYXJrZXJzVmlldyI+Ci0gICAgICAgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnJlZmVyZW5jZWRGaWxlRXJyb3JzIj4KLSAgICAgICAgICAgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucmVmZXJlbmNlZEZpbGVFcnJvcnMiIC8+Ci0gICAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KLSAgICAgICAgIDwvY29tbWFuZD4KLSAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0JCTxjb21tYW5kCi0JCQlkZXNjcmlwdGlvbj0iJV9VSV9SRUZfRklMRV9TSE9XX0RFVEFJTFMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5yZWZlcmVuY2VkRmlsZUVycm9ycyIgCi0JCQluYW1lPSIlX1VJX1JFRl9GSUxFX1NIT1dfREVUQUlMUyIgLz4KLQk8L2V4dGVuc2lvbj4KLQkKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuZXJyb3JpbmZvLlJlZmVyZW5jZWRGaWxlRXJyb3JzSGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucmVmZXJlbmNlZEZpbGVFcnJvcnMiPgotICAgICAgICAgICAgIDxlbmFibGVkV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5yZWZlcmVuY2VkRmlsZUVycm9ycyIgLz4KLSAgICAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVycyI+Ci0JICAgPHByb3BlcnR5VGVzdGVyCi0JICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mby5Hcm91cE5hbWVQcm9wZXJ0eVRlc3RlciIKLQkgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5tYXJrZXJHcm91cE5hbWVQcm9wZXJ0eVRlc3RlciIKLQkgICAgICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC54bWwudWkiCi0JICAgICAgICAgcHJvcGVydGllcz0iZ3JvdXBOYW1lUHJlZml4IgotCSAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIiPgotCSAgIDwvcHJvcGVydHlUZXN0ZXI+Ci0JPC9leHRlbnNpb24+Ci0JIAotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5yZWZlcmVuY2VkRmlsZUVycm9ycyI+Ci0gICAgICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICAgICA8Y291bnQgdmFsdWU9IjEiIC8+Ci0gICAgICAgICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgICAgICAgCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotICAgICAgICAgICAgICAgICAgICAgIAkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5ncm91cE5hbWVQcmVmaXgiIHZhbHVlPSJyZWZlcmVuY2VkRmlsZUVycm9yIiBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgCQk8L2FkYXB0PgotICAgICAgICAgICAgICAgICAgIAkJPC9pdGVyYXRlPgotICAgICAgICAgICAgICAgIAk8L3dpdGg+Ci0gICAgICAgICAgICAgICAgPC9hbmQ+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4JIAotCi08IS0tCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotCQk8ZWRpdG9yQ29udHJpYnV0aW9uCi0JCQlpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UuZWRpdG9yQWN0aW9ucyIKLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZSI+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkNsZWFudXBEb2N1bWVudCIKLQkJCQlsYWJlbD0iJUNsZWFudXBEb2N1bWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCIKLQkJCQl0b29sdGlwPSIlQ2xlYW51cERvY3VtZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5DbGVhbnVwQWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkNsZWFudXBEb2N1bWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iVG9nZ2xlQ29tbWVudCIKLQkJCQlsYWJlbD0iJVRvZ2dsZUNvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZ2dsZS5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVUb2dnbGVDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5Ub2dnbGVDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlRvZ2dsZUNvbW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkFkZEJsb2NrQ29tbWVudCIKLQkJCQlsYWJlbD0iJUFkZEJsb2NrQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRkLmJsb2NrLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJUFkZEJsb2NrQ29tbWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQWRkQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkFkZEJsb2NrQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iUmVtb3ZlQmxvY2tDb21tZW50IgotCQkJCWxhYmVsPSIlUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5yZW1vdmUuYmxvY2suY29tbWVudCIKLQkJCQl0b29sdGlwPSIlUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5SZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iUmVtb3ZlQmxvY2tDb21tZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJGaW5kT2NjdXJyZW5jZXMiCi0JCQkJbGFiZWw9IiVGaW5kT2NjdXJyZW5jZXNfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlYXJjaC5YTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iRmluZE9jY3VycmVuY2VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdE5leHRYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0TmV4dCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RIaXN0b3J5QWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiPgotCQkJPC9hY3Rpb24+Ci0JCTwvZWRpdG9yQ29udHJpYnV0aW9uPgotICAgICAgICA8ZWRpdG9yQ29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UucnVsZXIuYWN0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyRG91YmxlQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIi8+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVNlbGVjdFJ1bGVyLmxhYmVsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIi8+Ci0gICAgICAgIDwvZWRpdG9yQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotLS0+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci5oeXBlcmxpbmtEZXRlY3RvclRhcmdldHMiPgotCQk8dGFyZ2V0Ci0JCQlpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCW5hbWU9IiVYTUxfU291cmNlX3RhcmdldF9uYW1lIj4KLQkJPC90YXJnZXQ+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IuaHlwZXJsaW5rRGV0ZWN0b3JzIj4KLQkJPGh5cGVybGlua0RldGVjdG9yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsuWE1MSHlwZXJsaW5rRGV0ZWN0b3IiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsuWE1MSHlwZXJsaW5rRGV0ZWN0b3IiCi0JCQluYW1lPSIlWE1MX2h5cGVybGluayIKLQkJCXRhcmdldElkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIj4KLQkJPC9oeXBlcmxpbmtEZXRlY3Rvcj4KLSAgIDwvZXh0ZW5zaW9uPgotIDxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgPGNhdGVnb3J5Ci0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5YTUxDYXRlZ29yeSIKLSAgICAgICAgICBuYW1lPSIlX1VJX1dJWkFSRF9YTUxfQ0FURUdPUlkiPgotICAgIDwvY2F0ZWdvcnk+Ci0gICAgPHdpemFyZAotICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuWE1MQ2F0ZWdvcnkiCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5JbXBvcnRYTUxDYXRhbG9nV2l6YXJkIgotICAgICAgICAgIGljb249Imljb25zL3htbGRvYy5naWYiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5JbXBvcnRYTUxDYXRhbG9nV2l6YXJkIgotICAgICAgICAgIG5hbWU9IiVfVUlfV0laQVJEX0lNUE9SVF9FWFBPUlRfWE1MQ0FUQUxPRyI+Ci0gICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICVfVUlfSU1QT1JUX1hNTF9DQVRBTE9HX0ZJTEUKLSAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvd2l6YXJkPgotIDwvZXh0ZW5zaW9uPgotIDxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgPGNhdGVnb3J5Ci0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5YTUxDYXRlZ29yeSIKLSAgICAgICAgICBuYW1lPSIlX1VJX1dJWkFSRF9YTUxfQ0FURUdPUlkiPgotICAgIDwvY2F0ZWdvcnk+Ci0gICAgPHdpemFyZAotICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuWE1MQ2F0ZWdvcnkiCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5FeHBvcnRYTUxDYXRhbG9nV2l6YXJkIgotICAgICAgICAgIGljb249Imljb25zL3htbGRvYy5naWYiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5FeHBvcnRYTUxDYXRhbG9nV2l6YXJkIgotICAgICAgICAgIG5hbWU9IiVfVUlfV0laQVJEX0lNUE9SVF9FWFBPUlRfWE1MQ0FUQUxPRyI+Ci0gICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICVfVUlfRVhQT1JUX1hNTF9DQVRBTE9HX0ZJTEUKLSAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvd2l6YXJkPgotIDwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotCQk8IS0tIE5hdmlnYXRlIGNvbW1hbmRzIC0tPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJUFjdGlvbkRlZmluaXRpb24ubmV4dFNpYmxpbmcubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlQWN0aW9uRGVmaW5pdGlvbi5uZXh0U2libGluZy5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5uZXh0U2libGluZyI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVBY3Rpb25EZWZpbml0aW9uLnByZXZpb3VzU2libGluZy5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVBY3Rpb25EZWZpbml0aW9uLnByZXZpb3VzU2libGluZy5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcmV2aW91c1NpYmxpbmciPgotCQk8L2NvbW1hbmQ+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlQWN0aW9uRGVmaW5pdGlvbi5nb3RvTWF0Y2hpbmdUYWcubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlQWN0aW9uRGVmaW5pdGlvbi5nb3RvTWF0Y2hpbmdUYWcuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZ290b01hdGNoaW5nVGFnIj4KLQkJPC9jb21tYW5kPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYmluZGluZ3MiPgotICAgICAgPCEtLSAgd2luMzI6ICBNMT1DVFJMLCAgICBNMj1TSElGVCwgTTM9QUxULCBNND0tCi0gICAgICAgICAgICBjYXJib246IE0xPUNPTU1BTkQsIE0yPVNISUZULCBNMz1BTFQsIE00PUNUUkwKLSAgICAgICAgICAgIGd0azogPyAKLSAgICAgIC0tPgotICAgICAgPCEtLSBOYXZpZ2F0ZSBjb21tYW5kcyAtLT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0xK00yK0FSUk9XX1VQIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJldmlvdXNTaWJsaW5nIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iLz4KLQkJPGtleQotCQkJcGxhdGZvcm09ImNhcmJvbiIKLQkJCXNlcXVlbmNlPSJDVFJMK1NISUZUK0FSUk9XX1VQIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJldmlvdXNTaWJsaW5nIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iLz4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0xK00yK0FSUk9XX0RPV04iCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5uZXh0U2libGluZyIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIi8+Ci0JCTxrZXkKLQkJCXBsYXRmb3JtPSJjYXJib24iCi0JCQlzZXF1ZW5jZT0iQ1RSTCtTSElGVCtBUlJPV19ET1dOIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkubmV4dFNpYmxpbmciCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIvPgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTErTTIrJmd0OyIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmdvdG9NYXRjaGluZ1RhZyIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIi8+Ci0JCTxrZXkKLQkJCXBsYXRmb3JtPSJjYXJib24iCi0JCQlzZXF1ZW5jZT0iQ1RSTCtTSElGVCsuIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZ290b01hdGNoaW5nVGFnIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iLz4KLQkJCQotCTwvZXh0ZW5zaW9uPgotCQotPCEtLQotICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBuZXcgb3JnLmVjbGlwc2UudWkubWVudXMgZXh0aW9ucyBwb2ludHMgYW5kIGNvbW1hbmQgaGFuZGxlcgotICAgZGVmaW5pdGlvbnMuCi0gLS0+Ci0gCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgotCQk8IS0tIFVuYWJsZSB0byBjb250cmlidXRlIHRvIFNlYXJjaCBtZW51IGF0IHRoZSBtb21lbnQgZHVlIHRvIGJ1ZyAyMTMzODUgLS0+Ci08IS0tCi0JCTxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51Om9yZy5lY2xpcHNlLnNlYXJjaC5tZW51Ij4KLS0tPgotCSAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0ibWVudTpnb1RvP2FmdGVyPW1hdGNoaW5nRW5kIj4KLTwhLS0JCQotCSAgICAgICA8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZ290b01hdGNoaW5nVGFnIiBpZD0iR29Ub01hdGNoaW5nVGFnIiBsYWJlbD0iJUdvVG9NYXRjaGluZ1RhZ19sYWJlbCIgc3R5bGU9InB1c2giPgotCQkJICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCSAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQkgICA8L3Zpc2libGVXaGVuPgotCSAgICAgICA8L2NvbW1hbmQ+Ci0tLT4JCQotCSAgICAgICA8c2VwYXJhdG9yIG5hbWU9ImdvVG9TaWJsaW5nc0JlZ2luIiB2aXNpYmxlPSJ0cnVlIj48L3NlcGFyYXRvcj4KLQkgICAgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5leHRTaWJsaW5nIiBpZD0iR29Ub05leHRTaWJsaW5nIiBsYWJlbD0iJUFjdGlvbkRlZmluaXRpb24ubmV4dFNpYmxpbmcubmFtZSIgc3R5bGU9InB1c2giPgotCQkJICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5uYXZpZ2F0aW9uIj48L3JlZmVyZW5jZT4KLQkJCQk8L3Zpc2libGVXaGVuPgotCSAgICAgICA8L2NvbW1hbmQ+Ci0JICAgICAgIDxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcmV2aW91c1NpYmxpbmciIGlkPSJHb1RvUHJldmlvdXNTaWJsaW5nIiBsYWJlbD0iJUFjdGlvbkRlZmluaXRpb24ucHJldmlvdXNTaWJsaW5nLm5hbWUiIHN0eWxlPSJwdXNoIj4KLQkJCSAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkubmF2aWdhdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkgICAgICAgPC9jb21tYW5kPgotCSAgICAgICA8c2VwYXJhdG9yIG5hbWU9ImdvVG9TaWJsaW5nc0VuZCIgdmlzaWJsZT0iZmFsc2UiPjwvc2VwYXJhdG9yPgotCQk8L21lbnVDb250cmlidXRpb24+Ci0gICAgICAgPG1lbnVDb250cmlidXRpb24KLSAgICAgICAgICAgbG9jYXRpb25VUkk9Im1lbnU6b3JnLmVjbGlwc2UudWkubWFpbi5tZW51P2JlZm9yZT13aW5kb3ciPgotICAgICAgICA8bWVudQotICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kZXNpZ25NZW51SWQiCi0gICAgICAgICAgICAgIGxhYmVsPSIlRGVzaWduTWVudV9uYW1lIj4KLSAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICBuYW1lPSJkZXNpZ25TdGFydCI+Ci0gICAgICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZGlzYWJsZS5ncmFtbWFyLmNvbnN0cmFpbnRzIgotICAgICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvY29uc3RyYWlub24uZ2lmIgotICAgICAgICAgICAgICAgICBpZD0iVG9nZ2xlR3JhbW1hckNvbnN0cmFpbnRzIgotICAgICAgICAgICAgICAgICBtbmVtb25pYz0iJUNvbnN0cmFpbnRzX21uZW1vbmljIgotICAgICAgICAgICAgICAgICBzdHlsZT0icHVzaCI+Ci0gICAgICAgICAgICAgICAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICAJIDxhbmQ+Ci0gICAgICAgICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmdyYW1tYXIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgPG5vdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zc2VBY3RpdmVDb250ZXh0LmRlZmluaXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgPC9ub3Q+Ci0gICAgICAgICAgICAgICAgICAgIDwvYW5kPgotICAgICAgICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5yZWxvYWQuZGVwZW5kZWNpZXMiCi0gICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9ybGRncm1yLmdpZiIKLSAgICAgICAgICAgICAgICAgaWQ9IlJlbG9hZERlcGVuZGVuY2llcyIKLSAgICAgICAgICAgICAgICAgbW5lbW9uaWM9IiVSZWxvYWREZXBlbmRlbmNpZXNfbW5lbW9uaWMiCi0gICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIj4KLSAgICAgICAgICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotICAgICAgICAgICAgICAgIAk8YW5kPgotICAgICAgICAgICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kZXBlbmRlbmNpZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgPG5vdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zc2VBY3RpdmVDb250ZXh0LmRlZmluaXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgPC9ub3Q+Ci0gICAgICAgICAgICAgICAgICAgIDwvYW5kPgotICAgICAgICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgICAgIDxzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICAgbmFtZT0iZXhwYW5kIgotICAgICAgICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICAgIAotICAgICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9InNlZC50YWJsZXRyZWUuZXhwYW5kQWxsIgotICAgICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvZXhwYW5kX2FsbC5naWYiCi0gICAgICAgICAgICAgICAgIGlkPSJFeHBhbmRBbGwiCi0gICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIj4KLSAgICAgICAgICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotICAgICAgICAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5leHBhbmQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgPG5vdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zc2VBY3RpdmVDb250ZXh0LmRlZmluaXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgPC9ub3Q+Ci0gICAgICAgICAgICAgICAgICAgIDwvYW5kPgotICAgICAgICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ic2VkLnRhYmxldHJlZS5jb2xsYXBzZUFsbCIKLSAgICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L2NvbGxhcHNlX2FsbC5naWYiCi0gICAgICAgICAgICAgICAgIGlkPSJDb2xsYXBzZUFsbCIKLSAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giPgotICAgICAgICAgICAgICAgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmV4cGFuZCIvPgotICAgICAgICAgICAgICAgICAgICAgICA8bm90PgotICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICAgICA8L25vdD4KLSAgICAgICAgICAgICAgICAgICAgPC9hbmQ+Ci0gICAgICAgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+Ci0gICAgICAgICAgIDwvY29tbWFuZD4KLSAgICAgICAgICAgCi0gICAgICAgICAgIDxzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICAgbmFtZT0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICAgIDxzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICAgbmFtZT0iZGVzaWduRW5kIgotICAgICAgICAgICAgICAgICB2aXNpYmxlPSJmYWxzZSI+Ci0gICAgICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgICA8L21lbnU+Ci0gICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KLSAgICAgPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9Im1lbnU6ZWRpdD9hZnRlcj1hZGRpdGlvbnMiPgotCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5jb250ZW50QXNzaXN0LnByb3Bvc2FscyIgaWQ9IlhNTENvbnRlbnRBc3Npc3QiIHN0eWxlPSJwdXNoIj4KLQkJICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnhtbFNvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQk8L3Zpc2libGVXaGVuPgotCQk8L2NvbW1hbmQ+Ci0JPC9tZW51Q29udHJpYnV0aW9uPgkJCi0gICAgIDxtZW51Q29udHJpYnV0aW9uCi0gICAgICAgICAgIGxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS51aS5wb3B1cC5hbnk/YWZ0ZXI9YWRkaXRpb25zIj4KLSAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgaWQ9ImdlbmVyYXRlTWVudUlkIgotICAgICAgICAgICAgICBsYWJlbD0iJWdlbk1lbnVMYWJlbCI+Ci0JICAgICAgICA8Y29tbWFuZAotCSAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmdlbmVyYXRlLnhtbCIKLQkgICAgICAgICAgICAgIGlkPSJHZW5lcmF0ZVhNTCIKLQkgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIj4KLQkgICAgICAgICAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkgICAgICAgICAgICAgIDxvcj4KLQkJCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotCQkJCQkJCTx0ZXN0Ci0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0gICAgICAgICAgICAgICAgICAgIAkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlIj4KLQkJCQkJCQk8L3Rlc3Q+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLQkJCQkJCQk8dGVzdAotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnJlc291cmNlcy5jb250ZW50VHlwZUlkIgotICAgICAgICAgICAgICAgICAgICAJCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSI+Ci0JCQkJCQkJPC90ZXN0PgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9pdGVyYXRlPgotCQkJCSA8L29yPgkKLQkgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+Ci0JICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgIDwvbWVudT4KLSAgICAgPC9tZW51Q29udHJpYnV0aW9uPgotICAgICAKLSAgICAgPG1lbnVDb250cmlidXRpb24KLSAgICAgICAgICAgbG9jYXRpb25VUkk9InRvb2xiYXI6b3JnLmVjbGlwc2UudWkubWFpbi50b29sYmFyP2FmdGVyPWFkZGl0aW9ucyI+Ci0gICAgICAgIDx0b29sYmFyCi0gICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmRlc2lnbi5EZXNpZ25Ub29sQmFyIj4KLSAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICBuYW1lPSJzZWQudGFibGV0cmVlLnNlcGFyYXRvci4xIgotICAgICAgICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kaXNhYmxlLmdyYW1tYXIuY29uc3RyYWludHMiCi0gICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vbi5naWYiCi0gICAgICAgICAgICAgICAgIGlkPSJUb2dnbGVHcmFtbWFyQ29uc3RyYWludHMiCi0gICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgICB0b29sdGlwPSIlQ29uc3RyYWludHNfbmFtZSI+Ci0JICAgICAgICAgICA8dmlzaWJsZVdoZW4KLQkgICAgICAgICAgICAgICAgIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCSAgICAgICAgICAgICAgPHJlZmVyZW5jZQotCSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmdyYW1tYXIiPgotCSAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+Ci0JICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5yZWxvYWQuZGVwZW5kZWNpZXMiCi0gICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9ybGRncm1yLmdpZiIKLSAgICAgICAgICAgICAgICAgaWQ9IlJlbG9hZERlcGVuZGVuY2llcyIKLSAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giPgotCSAgICAgICAgICAgPHZpc2libGVXaGVuCi0JICAgICAgICAgICAgICAgICBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkgICAgICAgICAgICAgIDxyZWZlcmVuY2UKLQkgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kZXBlbmRlbmNpZXMiPgotCSAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+Ci0JICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgIDwvdG9vbGJhcj4KLSAgICAgPC9tZW51Q29udHJpYnV0aW9uPgotICAgICAKLSAgICAgPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9Im1lbnU6c291cmNlTWVudUlkP2FmdGVyPXNvdXJjZUJlZ2luIj4KLQkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50b2dnbGUuY29tbWVudCIKLQkJCSAgICAgICAgIGlkPSJUb2dnbGVDb21tZW50IgotCQkJICAgICAgICAgbW5lbW9uaWM9IiVjb21tYW5kLnRvZ2dsZS5jb21tZW50Lm1uZW1vbmljIgotCQkJICAgICAgICAgc3R5bGU9InB1c2giPgotCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY29tbWVudHMiLz4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkJPC9jb21tYW5kPgotCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkZC5ibG9jay5jb21tZW50IgotCQkJICAgICAgICAgaWQ9IkFkZEJsb2NrQ29tbWVudCIKLQkJCSAgICAgICAgIG1uZW1vbmljPSIlY29tbWFuZC5hZGQuYmxvY2suY29tbWVudC5tbmVtb25pYyIKLQkJCSAgICAgICAgIHN0eWxlPSJwdXNoIj4KLQkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmNvbW1lbnRzIi8+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4KLQkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5yZW1vdmUuYmxvY2suY29tbWVudCIKLQkJCSAgICAgICAgIGlkPSJSZW1vdmVCbG9ja0NvbW1lbnQiCi0JCQkgICAgICAgICBtbmVtb25pYz0iJWNvbW1hbmQucmVtb3ZlLmJsb2NrLmNvbW1lbnQubW5lbW9uaWMiCi0JCQkgICAgICAgICBzdHlsZT0icHVzaCI+Ci0JCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb21tZW50cyIvPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLQkJCi0JCTxtZW51Q29udHJpYnV0aW9uCi0JICAgICAgICAgICBsb2NhdGlvblVSST0icG9wdXA6c291cmNlUG9wdXBNZW51SWQ/YWZ0ZXI9c291cmNlQmVnaW4iPgotCQkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50b2dnbGUuY29tbWVudCIgaWQ9IlRvZ2dsZUNvbW1lbnQiIHN0eWxlPSJwdXNoIj4KLQkJCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY29tbWVudHMiPjwvcmVmZXJlbmNlPgotCQkJCQk8L3Zpc2libGVXaGVuPgotCQkJCTwvY29tbWFuZD4KLQkJCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRkLmJsb2NrLmNvbW1lbnQiIGlkPSJBZGRCbG9ja0NvbW1lbnQiIHN0eWxlPSJwdXNoIj4KLQkJCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY29tbWVudHMiPjwvcmVmZXJlbmNlPgotCQkJCQk8L3Zpc2libGVXaGVuPgotCQkJCTwvY29tbWFuZD4KLQkJCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucmVtb3ZlLmJsb2NrLmNvbW1lbnQiIGlkPSJSZW1vdmVCbG9ja0NvbW1lbnQiIHN0eWxlPSJwdXNoIj4KLQkJCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY29tbWVudHMiPjwvcmVmZXJlbmNlPgotCQkJCQk8L3Zpc2libGVXaGVuPgotCQkJCTwvY29tbWFuZD4KLQkJCQk8c2VwYXJhdG9yIG5hbWU9ImZvcm1hdCIgdmlzaWJsZT0idHJ1ZSI+PC9zZXBhcmF0b3I+Ci0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkueG1sU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj4KLSAgICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJhY3RpdmVDb250ZXh0cyI+Ci0JICAgICAgICAgICA8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCSAgICAgICAgICAgICAgPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIvPgotCSAgICAgICAgICAgPC9pdGVyYXRlPgotICAgICAgICAgICAgPC93aXRoPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+Ci0JCTxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmNvcmUiPgotCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIi8+Ci0JCQkJPC9pdGVyYXRlPgotCQkJPC93aXRoPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+Ci0JCTxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLm9jY3VycmVuY2VzIj4KLSAgICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJhY3RpdmVDb250ZXh0cyI+Ci0JICAgICAgICAgICA8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCSAgICAgICAgICAgICAgPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5vY2N1cnJlbmNlcyIvPgotCSAgICAgICAgICAgPC9pdGVyYXRlPgotICAgICAgICAgICAgPC93aXRoPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+Ci0JCTxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmNvbW1lbnRzIj4KLQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVDb250ZXh0cyI+Ci0JCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb21tZW50cyIvPgotCQkJCTwvaXRlcmF0ZT4KLQkJCTwvd2l0aD4KLQkJPC9kZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jbGVhbnVwIj4KLQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVDb250ZXh0cyI+Ci0JCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jbGVhbnVwIi8+Ci0JCQkJPC9pdGVyYXRlPgotCQkJPC93aXRoPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+Ci0JCTxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5hdmlnYXRpb24iPgotCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLm5hdmlnYXRpb24iLz4KLQkJCQk8L2l0ZXJhdGU+Ci0JCQk8L3dpdGg+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuc2VsZWN0aW9uIj4KLQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVDb250ZXh0cyI+Ci0JCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5zZWxlY3Rpb24iLz4KLQkJCQk8L2l0ZXJhdGU+Ci0JCQk8L3dpdGg+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZGVwZW5kZW5jaWVzIj4KLQkJCTxvcj4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWN0aXZlRWRpdG9ySWQiPgotCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5YTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0Ij48L2VxdWFscz4KLQkJCQk8L3dpdGg+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkJCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwuZGVwZW5kZW5jaWVzIi8+Ci0JCQkJCTwvaXRlcmF0ZT4KLQkJCQk8L3dpdGg+Ci0JCQk8L29yPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+Ci0JCTxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmdyYW1tYXIiPgotCQkJPG9yPgotCQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVFZGl0b3JJZCI+Ci0JCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTE11bHRpUGFnZUVkaXRvclBhcnQiPjwvZXF1YWxzPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWN0aXZlQ29udGV4dHMiPgotCQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5ncmFtbWFyIi8+Ci0JCQkJCTwvaXRlcmF0ZT4KLQkJCQk8L3dpdGg+Ci0JCQk8L29yPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+Ci0JCTxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmV4cGFuZCI+Ci0JCQk8b3I+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZUVkaXRvcklkIj4KLQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MTXVsdGlQYWdlRWRpdG9yUGFydCI+PC9lcXVhbHM+Ci0JCQkJPC93aXRoPgotCQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVDb250ZXh0cyI+Ci0JCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLmV4cGFuZCIvPgotCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJPC93aXRoPgotCQkJPC9vcj4KLQkJPC9kZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotICAgIDxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnMuQ2xlYW51cGRvY3VtZW50SGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCI+Ci0gICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0JCQkgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY2xlYW51cCIvPgotICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY2xlYW51cCIvPgotICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnMuVG9nZ2xlQ29tbWVudEhhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZ2dsZS5jb21tZW50Ij4KLSAgICAgICAgICA8YWN0aXZlV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY29tbWVudHMiLz4KLSAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb21tZW50cyIvPgotICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnMuQWRkQmxvY2tDb21tZW50SGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRkLmJsb2NrLmNvbW1lbnQiPgotICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb21tZW50cyIvPgotICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmNvbW1lbnRzIi8+Ci0gICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5SZW1vdmVCbG9ja0NvbW1lbnRIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5yZW1vdmUuYmxvY2suY29tbWVudCI+Ci0gICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmNvbW1lbnRzIi8+Ci0gICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY29tbWVudHMiLz4KLSAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzLlN0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdYTUxIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LmVuY2xvc2luZyI+Ci0gICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnNlbGVjdGlvbiIvPgotICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnNlbGVjdGlvbiIvPgotICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnMuU3RydWN0dXJlZFNlbGVjdE5leHRYTUxIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiPgotICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zZWxlY3Rpb24iLz4KLSAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zZWxlY3Rpb24iLz4KLSAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzLlN0cnVjdHVyZWRTZWxlY3RQcmV2aW91c1hNTEhhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QucHJldmlvdXMiPgotICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zZWxlY3Rpb24iLz4KLSAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zZWxlY3Rpb24iLz4KLSAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzLlN0cnVjdHVyZWRTZWxlY3RIaXN0b3J5SGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0Ij4KLSAgICAgICAgICA8YWN0aXZlV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuc2VsZWN0aW9uIi8+Ci0gICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuc2VsZWN0aW9uIi8+Ci0gICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5YTUxGaW5kT2NjdXJlbmNlc0hhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzIj4KLSAgICAgICAgICA8YWN0aXZlV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkub2NjdXJyZW5jZXMiLz4KLSAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5vY2N1cnJlbmNlcyIvPgotICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotPCEtLQotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnMuR29Ub01hdGNoaW5nVGFnSGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZ290b01hdGNoaW5nVGFnIj4KLSAgICAgICAgICA8YWN0aXZlV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkubmF2aWdhdGlvbiIvPgotICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5hdmlnYXRpb24iLz4KLSAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLS0tPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnMuTmV4dFNpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkubmV4dFNpYmxpbmciPgotICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5uYXZpZ2F0aW9uIi8+Ci0gICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkubmF2aWdhdGlvbiIvPgotICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnMuUHJldmlvdXNTaWJsaW5nTmF2aWdhdGlvbkhhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnByZXZpb3VzU2libGluZyI+Ci0gICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5hdmlnYXRpb24iLz4KLSAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5uYXZpZ2F0aW9uIi8+Ci0gICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5SZWxvYWREZXBlbmRlbmNpZXNIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5yZWxvYWQuZGVwZW5kZWNpZXMiPgotICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kZXBlbmRlbmNpZXMiLz4KLSAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kZXBlbmRlbmNpZXMiLz4KLSAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzLlRvZ2dsZUVkaXRNb2RlSGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZGlzYWJsZS5ncmFtbWFyLmNvbnN0cmFpbnRzIj4KLSAgICAgICAgICA8YWN0aXZlV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZ3JhbW1hciIvPgotICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmdyYW1tYXIiLz4KLSAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHMuTmV3WE1MSGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZ2VuZXJhdGUueG1sIj4KLSAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5FeHBhbmRBbGxIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ic2VkLnRhYmxldHJlZS5leHBhbmRBbGwiPgotICAgICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgICAgICA8bm90PgotCQkgICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0iYWN0aXZlQ29udGV4dHMiPgotCQkJICAgICAgICAgICA8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJICAgICAgICAgICAgICA8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiLz4KLQkJCSAgICAgICAgICAgPC9pdGVyYXRlPgotCQkgICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICAgICAgICAgIDwvbm90PgotICAgICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5Db2xsYXBzZUFsbEhhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJzZWQudGFibGV0cmVlLmNvbGxhcHNlQWxsIj4KLSAgICAgICAgICAgICA8YWN0aXZlV2hlbj4KLSAgICAgICAgICAgICAgICAgPG5vdD4KLQkJICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkJCSAgICAgICAgICAgPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCSAgICAgICAgICAgICAgPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIi8+Ci0JCQkgICAgICAgICAgIDwvaXRlcmF0ZT4KLQkJICAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgICAgICAgICA8L25vdD4KLSAgICAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotICAgIDxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotCSAgICA8Y29tbWFuZAotCSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5nZW5lcmF0ZS54bWwiCi0JICAgICAgICAgIG5hbWU9IiVfVUlfQUNUSU9OX0NSRUFURV9YTUwiPgotCSAgICA8L2NvbW1hbmQ+Ci0JICAgIDxjb21tYW5kCi0JICAgICAgICAgIGRlc2NyaXB0aW9uPSIlUmVsb2FkRGVwZW5kZW5jaWVzX2Rlc2NyaXB0aW9uIgotCSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5yZWxvYWQuZGVwZW5kZWNpZXMiCi0JICAgICAgICAgIG5hbWU9IiVSZWxvYWREZXBlbmRlbmNpZXNfbmFtZSI+Ci0JICAgIDwvY29tbWFuZD4KLQkgICAgPGNvbW1hbmQKLQkgICAgICAgICAgZGVzY3JpcHRpb249IiVDb25zdHJhaW50c19kZXNjcmlwdGlvbiIKLQkgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZGlzYWJsZS5ncmFtbWFyLmNvbnN0cmFpbnRzIgotCSAgICAgICAgICBuYW1lPSIlQ29uc3RyYWludHNfbmFtZSI+Ci0JICAgIDwvY29tbWFuZD4KLQkgICAgPGNvbW1hbmQKLQkgICAgICAgICAgaWQ9InNlZC50YWJsZXRyZWUuZXhwYW5kQWxsIgotCSAgICAgICAgICBuYW1lPSIlRXhwYW5kQWxsX25hbWUiPgotCSAgICA8L2NvbW1hbmQ+Ci0JICAgIDxjb21tYW5kCi0JICAgICAgICAgIGlkPSJzZWQudGFibGV0cmVlLmNvbGxhcHNlQWxsIgotCSAgICAgICAgICBuYW1lPSIlQ29sbGFwc2VBbGxfbmFtZSI+Ci0JICAgIDwvY29tbWFuZD4KLQk8L2V4dGVuc2lvbj4gCi0JCi0JPCEtLSBEZWZpbmUgdGhlbWUgLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkudGhlbWVzIj4KLQkJPHRoZW1lCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkuaWRlLnN5c3RlbURlZmF1bHQiPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0idGFnQXR0cmlidXRlTmFtZSIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9InRhZ0F0dHJpYnV0ZVZhbHVlIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iY29tbWVudEJvcmRlciIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9TRUxFQ1RJT04iPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iY29tbWVudFRleHQiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfU0VMRUNUSU9OIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9ImRlY2xCb2RlciIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9ImRvY3R5cGVOYW1lIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZG9jdHlwZUV4dGVybmFsUHVicmVmIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZG9jdHlwZUV4dGVybmFsSWQiCi0JCQkJdmFsdWU9IkNPTE9SX1dJREdFVF9OT1JNQUxfU0hBRE9XIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9ImRvY3R5cGVFeHRyZW5hbFN5c3JlZiIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9InRhZ0JvcmRlciIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9InRhZ05hbWUiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJwaUJvcmRlciIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9ImNkYXRhQm9yZGVyIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iY2RhdGFUZXh0IgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZW50aXR5UmVmZXJlbmNlIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQk8L3RoZW1lPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0idGFnQXR0cmlidXRlTmFtZSIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMudGFnQXR0cmlidXRlTmFtZSIKLQkJCXZhbHVlPSIxMjcsIDAsIDEyNyI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0idGFnQXR0cmlidXRlVmFsdWUiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLnRhZ0F0dHJpYnV0ZVZhbHVlIgotCQkJdmFsdWU9IjQyLCAwLCAyNTUiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImNvbW1lbnRCb3JkZXIiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmNvbW1lbnRCb3JkZXIiCi0JCQl2YWx1ZT0iNjMsIDk1LCAxOTEiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImNvbW1lbnRUZXh0IgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5jb21tZW50VGV4dCIKLQkJCXZhbHVlPSI2MywgOTUsIDE5MSI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iZGVjbEJvZGVyIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5kZWNsQm9yZGVyIgotCQkJdmFsdWU9IjAsIDEyOCwgMTI4Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJkb2N0eXBlTmFtZSIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuZG9jdHlwZU5hbWUiCi0JCQl2YWx1ZT0iMCwgMTI4LCAxMjgiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImRvY3R5cGVFeHRlcm5hbFB1YnJlZiIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuZG9jdHlwZUV4dGVybmFsUHVicmVmIgotCQkJdmFsdWU9IjAsIDEyOCwgMTI4Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJkb2N0eXBlRXh0ZXJuYWxJZCIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuZG9jdHlwZUV4dGVybmFsSWQiCi0JCQl2YWx1ZT0iMTI4LCAxMjgsIDEyOCI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iZG9jdHlwZUV4dHJlbmFsU3lzcmVmIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5kb2N0eXBlRXh0cmVuYWxTeXNyZWYiCi0JCQl2YWx1ZT0iNjMsIDEyNywgOTUiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9InRhZ0JvcmRlciIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMudGFnQm9yZGVyIgotCQkJdmFsdWU9IjAsIDEyOCwgMTI4Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJ0YWdOYW1lIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy50YWdOYW1lIgotCQkJdmFsdWU9IjYzLCAxMjcsIDEyNyI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0icGlCb3JkZXIiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLnBpQm9yZGVyIgotCQkJdmFsdWU9IjAsIDEyOCwgMTI4Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJjZGF0YUJvcmRlciIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuY2RhdGFCb3JkZXIiCi0JCQl2YWx1ZT0iMCwgMTI4LCAxMjgiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImNkYXRhVGV4dCIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuY2RhdGFUZXh0IgotCQkJdmFsdWU9IjAsIDAsIDAiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImVudGl0eVJlZmVyZW5jZSIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuZW50aXR5UmVmZXJlbmNlIgotCQkJdmFsdWU9IjQyLCAwLCAyNTUiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gRW5hYmxlIHRoZSBGb3JtYXRIYW5kbGVyIGZvciBYTUwgQ29udGVudCBUeXBlIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KLQkJPGhhbmRsZXIgCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVycy5Gb3JtYXRIYW5kbGVyIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmZvcm1hdCI+Ci0JCQk8YWN0aXZlV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS54bWxDb250ZW50VHlwZS5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCTwvYWN0aXZlV2hlbj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS54bWxDb250ZW50VHlwZS5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIFNldCB1cCBhIGRlZmluaXRpb24gZm9yIFhNTCBDb250ZW50IFR5cGVzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS54bWxDb250ZW50VHlwZS5kZWZpbml0aW9uIj4KLQkJCTxvcj4KLSAgICAgICAgICAgIAk8aXRlcmF0ZSBpZkVtcHR5PSJmYWxzZSI+Ci0JCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0JCQkJCQk8IS0tIEZvcmNlIHByb3BlcnR5IHRlc3RlciB0byBsb2FkLCBzaG91bGQgbm90IGNhdXNlIGVudGlyZSBwbHVnLWluIHRvIHN0YXJ0IC0tPgotCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5yZXNvdXJjZXMuY29udGVudFR5cGVJZCIgCi0JCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvaXRlcmF0ZT4KLQkJCQk8aXRlcmF0ZSBpZkVtcHR5PSJmYWxzZSI+Ci0JCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0JCQkJCQk8IS0tIEZvcmNlIHByb3BlcnR5IHRlc3RlciB0byBsb2FkLCBzaG91bGQgbm90IGNhdXNlIGVudGlyZSBwbHVnLWluIHRvIHN0YXJ0IC0tPgotCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5yZXNvdXJjZXMuY29udGVudFR5cGVJZCIKLQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9pdGVyYXRlPgotCQkJPC9vcj4KLQkJPC9kZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0KLQotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzIj4KLQkJPHBlcnNwZWN0aXZlIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnBlcnNwZWN0aXZlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucGVyc3BlY3RpdmUuWE1MUGVyc3BlY3RpdmVGYWN0b3J5IgotCQkJaWNvbj0iJG5sJC9pY29ucy9mdWxsL3htbF9wZXJzcGVjdGl2ZS5naWYiIAotCQkJbmFtZT0iJVhNTC5uYW1lIi8+Ci0JPC9leHRlbnNpb24+Ci0JCi0gPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLQk8cGVyc3BlY3RpdmVFeHRlbnNpb24gdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucGVyc3BlY3RpdmUiPgotCQk8IS0tIFByb2plY3RFeHBsb3JlciBvbiB0aGUgbGVmdCAtLT4KLQkJPCEtLTx2aWV3IGlkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIiByZWxhdGl2ZT0ib3JnLmVjbGlwc2UudWkuZWRpdG9yc3MiIHJlbGF0aW9uc2hpcD0ibGVmdCIgcmF0aW89IjAuMjMiIC8+LS0+Ci0JCTwhLS0gWFBhdGggb24gdGhlICJib3R0b20iIGxlZnQgZnJvbSBpdHMgb3duIFVJIHBsdWctaW4gc2luY2UgbmVpdGhlciB0aGlzIGJ1bmRsZSBub3IgaXRzIG93bmluZyBmZWF0dXJlIHJlcXVpcmUgaXQgLS0+Ci0JCTwhLS0gQ29udGVudCBPdXRsaW5lIG9uIHRoZSByaWdodCAtLT4KLQkJPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLkNvbnRlbnRPdXRsaW5lIiByZWxhdGl2ZT0ib3JnLmVjbGlwc2UudWkuZWRpdG9yc3MiIHJlbGF0aW9uc2hpcD0icmlnaHQiIHJhdGlvPSIwLjciIC8+Ci0JCTwhLS0gVGVtcGxhdGVzIG9uIHRoZSBib3R0b20gcmlnaHQgLS0+Ci0JCTx2aWV3IGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRlbXBsYXRlc1ZpZXciIHJlbGF0aXZlPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Db250ZW50T3V0bGluZSIgcmVsYXRpb25zaGlwPSJib3R0b20iIHJhdGlvPSIwLjYiIC8+Ci0JCTwhLS0gZXZlcnl0aGluZyBlbHNlIG9uIHRoZSBib3R0b20gLS0+Ci0JCTx2aWV3IGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9ibGVtVmlldyIgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnNzIiByZWxhdGlvbnNoaXA9ImJvdHRvbSIgcmF0aW89IjAuNiIgLz4KLQkJPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MuYW5ub3RhdGlvbnMuWE1MQW5ub3RhdGlvbnNWaWV3IiByZWxhdGl2ZT0ib3JnLmVjbGlwc2UudWkudmlld3MuUHJvYmxlbVZpZXciIHJlbGF0aW9uc2hpcD0ic3RhY2siIC8+Ci0JCTx2aWV3IGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0IiByZWxhdGl2ZT0ib3JnLmVjbGlwc2UudWkudmlld3MuUHJvYmxlbVZpZXciIHJlbGF0aW9uc2hpcD0ic3RhY2siLz4KLQkJPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuQ29uc29sZVZpZXciIHJlbGF0aXZlPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9ibGVtVmlldyIgcmVsYXRpb25zaGlwPSJzdGFjayIgLz4KLQkJPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uc25pcHBldHMuaW50ZXJuYWwudWkuU25pcHBldHNWaWV3IiByZWxhdGl2ZT0ib3JnLmVjbGlwc2UudWkudmlld3MuUHJvYmxlbVZpZXciIHJlbGF0aW9uc2hpcD0ic3RhY2siIC8+Ci0JCTwhLS0gdmlldyBwbGFjZWhvbGRlcnMgLS0+Ci0JCTx2aWV3IGlkPSJvcmcuZWNsaXBzZS5zZWFyY2gudWkudmlld3MuU2VhcmNoVmlldyIgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb2JsZW1WaWV3IiByZWxhdGlvbnNoaXA9InN0YWNrIiB2aXNpYmxlPSJmYWxzZSIgLz4KLQkJPHZpZXcgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb2dyZXNzVmlldyIgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb2JsZW1WaWV3IiByZWxhdGlvbnNoaXA9InN0YWNrIiB2aXNpYmxlPSJmYWxzZSIgLz4KLQotCQk8YWN0aW9uU2V0IGlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hBY3Rpb25TZXQiLz4KLQkKLQkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHMuTmV3WE1MV2l6YXJkIi8+Ci0JCTxuZXdXaXphcmRTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hTRFdpemFyZCIvPgotCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwud2l6YXJkLk5ld0RURFdpemFyZCIvPgotCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LmZvbGRlciIvPgotCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LmZpbGUiLz4KLQkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLndpemFyZHMuVW50aXRsZWRUZXh0RmlsZVdpemFyZCIvPgotCi0JCTx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiLz4KLQkJPHZpZXdTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MuUmVzb3VyY2VOYXZpZ2F0b3IiLz4KLQkJPHZpZXdTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MuQ29udGVudE91dGxpbmUiLz4KLQkJPHZpZXdTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIvPgotCQk8dmlld1Nob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9ibGVtVmlldyIvPgotCQk8dmlld1Nob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS51aS5jb25zb2xlLkNvbnNvbGVWaWV3Ii8+Ci0JCTx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlRhc2tMaXN0Ii8+Ci0JCTx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGVtcGxhdGVzVmlldyIvPgotCQk8dmlld1Nob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5zZWFyY2gudWkudmlld3MuU2VhcmNoVmlldyIvPgotCQk8dmlld1Nob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9ncmVzc1ZpZXciLz4KLQotCQk8cGVyc3BlY3RpdmVTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdQZXJzcGVjdGl2ZSIvPgotCQk8cGVyc3BlY3RpdmVTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UudWkucmVzb3VyY2VQZXJzcGVjdGl2ZSIvPgotCTwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0JCi0JPHBlcnNwZWN0aXZlRXh0ZW5zaW9uIHRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlIj4KLQkJPHBlcnNwZWN0aXZlU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucGVyc3BlY3RpdmUiLz4KLQk8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotCTxwZXJzcGVjdGl2ZUV4dGVuc2lvbiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdQZXJzcGVjdGl2ZSI+Ci0JCTxwZXJzcGVjdGl2ZVNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnBlcnNwZWN0aXZlIi8+Ci0JPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLSA8L2V4dGVuc2lvbj4KLQotIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4KLQk8Y29tbW9uV2l6YXJkIHR5cGU9Im5ldyIgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdYTUxXaXphcmQiIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS53c3QueG1sLm5ldy5tZW51R3JvdXAiPgotCQk8ZW5hYmxlbWVudD4KLQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4KLQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVXb3JrYmVuY2hXaW5kb3cuYWN0aXZlUGVyc3BlY3RpdmUiPgotCQkJICAgPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wZXJzcGVjdGl2ZSIvPgotCQkJPC93aXRoPgotCQk8L2VuYWJsZW1lbnQ+Ci0JPC9jb21tb25XaXphcmQ+Ci0gPC9leHRlbnNpb24+Ci0KLSA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyIgbmFtZT0iJVhNTC5uYW1lIiBpZD0iWE1MIj4KLQk8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0idG9vbGJhcjpvcmcuZWNsaXBzZS51aS5tYWluLnRvb2xiYXI/YWZ0ZXI9YWRkaXRpb25zIj4KLQkgPHRvb2xiYXIgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucGVyc3BlY3RpdmUuTmV3RmlsZVRvb2xCYXIiPgotCQk8Y29tbWFuZAotCQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkIgotCQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9ldG9vbDE2L25ld194bWwuZ2lmIgotCQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5ld1hNTEZpbGUiCi0JCQkJc3R5bGU9InB1c2giCi0JCQkJdG9vbHRpcD0iJVhNTF9OZXdfRmlsZS50b29sdGlwIj4KLQkJCSA8cGFyYW1ldGVyIG5hbWU9Im5ld1dpemFyZElkIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hNTFdpemFyZCIvPgotICAgICAgICAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVXb3JrYmVuY2hXaW5kb3cuYWN0aXZlUGVyc3BlY3RpdmUiPgotCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucGVyc3BlY3RpdmUiLz4KLQkJCTwvd2l0aD4KLSAgICAgICAgICAgPC92aXNpYmxlV2hlbj4gICAgICAgICAKLSAgICAgICAgPC9jb21tYW5kPgotICAgICAgIDxzZXBhcmF0b3IgbmFtZT0iYWRkaXRpb25zIiB2aXNpYmxlPSJmYWxzZSIvPgotICAgICAgPC90b29sYmFyPiAKLSAgICAgPC9tZW51Q29udHJpYnV0aW9uPgotICA8L2V4dGVuc2lvbj4KLSA8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2hhcmFjdGVyUGFpcmluZyI+Ci0gICAgPGluc2VydGVyCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGV4dC5DaGFyYWN0ZXJQYWlySW5zZXJ0ZXIiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW5zZXJ0ZXIiPgotICAgICAgIDxjb250ZW50VHlwZUlkZW50aWZpZXIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIgcGFydGl0aW9ucz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCxvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUNMIj4KLSAgICAgICA8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLSAgICAgICA8Y29udGVudFR5cGVJZGVudGlmaWVyCi0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiIHBhcnRpdGlvbnM9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQsb3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVDTCI+Ci0gICAgICAgPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0gICAgPC9pbnNlcnRlcj4KLSA8L2V4dGVuc2lvbj4KLSA8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29tcGxldGlvblByb3Bvc2FsIj4KLSAgICA8cHJvcG9zYWxDYXRlZ29yeQotICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmIgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnByb3Bvc2FsQ2F0ZWdvcnkueG1sVGFncyIKLSAgICAgICAgICBuYW1lPSIlcHJvcG9zYWxDYXRlZ29yeS54bWxUYWdzIj4KLSAgICA8L3Byb3Bvc2FsQ2F0ZWdvcnk+Ci0gICAgPHByb3Bvc2FsQ2F0ZWdvcnkKLSAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L3RhZy1tYWNyby5naWYiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJvcG9zYWxDYXRlZ29yeS54bWxUZW1wbGF0ZXMiCi0gICAgICAgICAgbmFtZT0iJXByb3Bvc2FsQ2F0ZWdvcnkueG1sVGVtcGxhdGVzIj4KLSAgICA8L3Byb3Bvc2FsQ2F0ZWdvcnk+Ci0gICAgPHByb3Bvc2FsQ29tcHV0ZXIKLSAgICAgICAgICBhY3RpdmF0ZT0iZmFsc2UiCi0gICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcm9wb3NhbENhdGVnb3J5LnhtbFRhZ3MiCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxUYWdzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJvcG9zYWxDb21wdXRlci54bWxUYWdzIj4KLSAgICAgICA8Y29udGVudFR5cGUKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCI+Ci0gICAgICAgPC9jb250ZW50VHlwZT4KLSAgICA8L3Byb3Bvc2FsQ29tcHV0ZXI+Ci0gICAgPHByb3Bvc2FsQ29tcHV0ZXIKLSAgICAgICAgICBhY3RpdmF0ZT0iZmFsc2UiCi0gICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcm9wb3NhbENhdGVnb3J5LnhtbFRlbXBsYXRlcyIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTFRlbXBsYXRlc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnByb3Bvc2FsQ29tcHV0ZXIueG1sVGVtcGxhdGVzIj4KLSAgICAgICA8Y29udGVudFR5cGUKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCI+Ci0gICAgICAgPC9jb250ZW50VHlwZT4KLSAgICA8L3Byb3Bvc2FsQ29tcHV0ZXI+Ci0gPC9leHRlbnNpb24+Ci0gPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uIj4KLSAgICA8Y2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24KLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbiIKLSAgICAgICAgICBjb250ZW50VHlwZUlEPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIj4KLSAgICA8L2NhdGVnb3JpZXNDb25maWd1cmF0aW9uPgotIDwvZXh0ZW5zaW9uPgotIAotICA8ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgIDx2aWV3IGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QueG1sIgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52aWV3cy5hbm5vdGF0aW9ucy5YTUxBbm5vdGF0aW9uc1ZpZXciCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLmFubm90YXRpb25zLlhNTEFubm90YXRpb25zVmlldyIKLSAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50X29iai5naWYiCi0gICAgICAgICAgIG5hbWU9IiV4bWxhbm5vdGF0aW9ucyIKLSAgICAgICAgICAgcmVzdG9yYWJsZT0idHJ1ZSI+Ci0gICAgIDwvdmlldz4KLSAgPC9leHRlbnNpb24+Ci0KLQk8IS0tIFhNTCBDb250ZW50IE1vZGVsIFZpZXcgLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotCQk8dmlldwotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC54bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50bW9kZWwuQ29udGVudE1vZGVsVmlldyIKLQkJCWljb249Imljb25zL2Z1bGwvdmlldzE2L2hpZXJhcmNoeS5naWYiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb250ZW50bW9kZWwudmlldyIKLQkJCW5hbWU9IiVjb250ZW50TW9kZWwudmlldy5uYW1lIgotCQkJcmVzdG9yYWJsZT0idHJ1ZSI+Ci0JCTwvdmlldz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgkJCi0JCTxmYWN0b3J5IAotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmlld3MuY29udGVudG1vZGVsLkNvbnRlbnRNb2RlbEFkYXB0ZXJGYWN0b3J5IiAKLQkJCWFkYXB0YWJsZVR5cGU9Im9yZy53M2MuZG9tLkVsZW1lbnQiPgotCQkJPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIiLz4KLQkJPC9mYWN0b3J5PgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLQkJCTxtZW51Q29udHJpYnV0aW9uCi0JCQkJbG9jYXRpb25VUkk9InRvb2xiYXI6b3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb250ZW50bW9kZWwudmlldyI+Ci0JCQkJPGNvbW1hbmQKLQkJCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmNtbmQuY29udGVudG1vZGVsLnN5Y2giCi0JCQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmNvbW1hbmQuY29udGVudG1vZGVsLnN5bmNoIgotCQkJCQlpY29uPSJpY29ucy9mdWxsL3ZpZXcxNi9zeW5jZWQuZ2lmIgotCQkJCQlzdHlsZT0idG9nZ2xlIgotCQkJCQl0b29sdGlwPSIlY29udGVudE1vZGVsLnZpZXcuc3luY2gudG9vbHRpcCI+Ci0JCQkJPC9jb21tYW5kPgotCQkJPC9tZW51Q29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KLQkJPGhhbmRsZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzLkNvbnRlbnRNb2RlbFN5bmNoV2l0aEVkaXRvckhhbmRsZXIiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY21uZC5jb250ZW50bW9kZWwuc3ljaCI+Ci0JCTwvaGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0JCTxjb21tYW5kCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jbW5kLmNvbnRlbnRtb2RlbC5zeWNoIgotCQkJbmFtZT0iJWNvbnRlbnRNb2RlbC5jb21tYW5kLnN5bmNoLm5hbWUiPgotCQkJPHN0YXRlCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLlJlZ2lzdHJ5VG9nZ2xlU3RhdGU6dHJ1ZSIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMudG9nZ2xlU3RhdGUiPgotCQkJPC9zdGF0ZT4KLQkJPC9jb21tYW5kPgotCTwvZXh0ZW5zaW9uPiAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zY2hlbWEvY2F0YWxvZ0ZpbGVUeXBlLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc2NoZW1hL2NhdGFsb2dGaWxlVHlwZS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjI5NjU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zY2hlbWEvY2F0YWxvZ0ZpbGVUeXBlLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSIgaWQ9ImNhdGFsb2dGaWxlVHlwZSIgbmFtZT0iWE1MIENhdGFsb2cgZmlsZSB0eXBlIGV4dGVuc2lvbiBwb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmlsZVR5cGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmlsZVR5cGUiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHRlbnNpb25zIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0FkdmFuY2VkT3B0aW9uc0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9BZHZhbmNlZE9wdGlvbnNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMxZGVjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0FkdmFuY2VkT3B0aW9uc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9ncy5TZWxlY3RTaW5nbGVGaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2dTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIEFkdmFuY2VkT3B0aW9uc0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZzsKLQotCXB1YmxpYyBBZHZhbmNlZE9wdGlvbnNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMud29ya2luZ1VzZXJDYXRhbG9nID0gd29ya2luZ1VzZXJDYXRhbG9nOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nQXJlYSwgbmV3Ci0JCS8vIENvbnRyb2xDb250ZXh0Q29tcHV0ZXIoZGlhbG9nQXJlYSwKLQkJLy8gWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MUF9QUk9KRUNUX0RJQUxPRykpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ESUFMT0dfREVTQ1JJUFRJT04pOwotCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQ29tcG9zaXRlIHBsYWNlSG9sZGVyID0gbmV3IENvbXBvc2l0ZShidXR0b25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcGxhY2VIb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkdyb3VwID0gbmV3IENvbXBvc2l0ZShidXR0b25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJYnV0dG9uR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlidXR0b25Hcm91cC5zZXRMYXlvdXREYXRhKGNyZWF0ZUdyaWREYXRhKCkpOwotCi0JCUJ1dHRvbiBpbXBvcnRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkdyb3VwLCBTV1QuUFVTSCB8IFNXVC5DRU5URVIpOwotCQlpbXBvcnRCdXR0b24uc2V0VGV4dCgiICAiICsgWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9JTVBPUlQgKyAiICAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJQnV0dG9uIGV4cG9ydEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIIHwgU1dULkNFTlRFUik7Ci0JCWV4cG9ydEJ1dHRvbi5zZXRUZXh0KCIgICIgKyBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfQlVUVE9OX0VYUE9SVCArICIgICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlwbGFjZUhvbGRlciA9IG5ldyBDb21wb3NpdGUoYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXBsYWNlSG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIGFkZCBpbXBvcnRCdXR0b24gbGlzdGVuZXIKLQkJU2VsZWN0aW9uTGlzdGVuZXIgaW1wb3J0QnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpbnZva2VJbXBvcnREaWFsb2coKTsKLQkJCX0KLQkJfTsKLQkJaW1wb3J0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGltcG9ydEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQkvLyBhZGQgZXhwb3J0QnV0dG9uIGxpc3RlbmVyCi0JCVNlbGVjdGlvbkxpc3RlbmVyIGV4cG9ydEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaW52b2tlRXhwb3J0RGlhbG9nKCk7Ci0JCQl9Ci0JCX07Ci0JCWV4cG9ydEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihleHBvcnRCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCi0JcHJvdGVjdGVkIEdyaWREYXRhIGNyZWF0ZUdyaWREYXRhKCkgewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5DRU5URVIpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVI7Ci0JCWdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSOwotCQlyZXR1cm4gZ2Q7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbnZva2VJbXBvcnREaWFsb2coKSB7Ci0JCVNlbGVjdFNpbmdsZUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdFNpbmdsZUZpbGVEaWFsb2coZ2V0U2hlbGwoKSwgbnVsbCwgdHJ1ZSk7Ci0JCVN0cmluZ1tdIGV4dGVuc2lvbnMgPSB7Ii54bWxjYXRhbG9nIiwgIi54bWwifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWRpYWxvZy5hZGRGaWx0ZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfVElUTEUpOwotCQlkaWFsb2cuc2V0VGl0bGUoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfSEVBRElORyk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9JTVBPUlRfRElBTE9HX01FU1NBR0UpOwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWludCByYyA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChyYyA9PSBXaW5kb3cuT0spIHsKLQkJCUlGaWxlIGZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSSSgpLnRvU3RyaW5nKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJQ2F0YWxvZ1NldCB0ZW1wUmVzb3VyY2VTZXQgPSBuZXcgQ2F0YWxvZ1NldCgpOwotCQkJCQlJQ2F0YWxvZyBuZXdDYXRhbG9nID0gdGVtcFJlc291cmNlU2V0Lmxvb2t1cE9yQ3JlYXRlQ2F0YWxvZygidGVtcCIsIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl3b3JraW5nVXNlckNhdGFsb2cuYWRkRW50cmllc0Zyb21DYXRhbG9nKG5ld0NhdGFsb2cpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVE9ETy4uLiBnaXZlIGVycm9yIG1lc3NhZ2UKLQkJCQl9Ci0JCQl9Ci0JCQljbG9zZSgpOwotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbnZva2VFeHBvcnREaWFsb2coKSB7Ci0JCUlQYXRoIG9yaWdpbmFsRmlsZVBhdGggPSBudWxsOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlpZiAocHJvamVjdHMubGVuZ3RoID4gMCkgewotCQkJb3JpZ2luYWxGaWxlUGF0aCA9IHByb2plY3RzWzBdLmdldEZ1bGxQYXRoKCkuYXBwZW5kKCIueG1sY2F0YWxvZyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTYXZlQXNEaWFsb2cgZGlhbG9nID0gbmV3IFNhdmVBc0RpYWxvZyhnZXRTaGVsbCgpKTsKLQkJaWYgKG9yaWdpbmFsRmlsZVBhdGggIT0gbnVsbCkgewotCQkJSUZpbGUgb3JpZ2luYWxGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG9yaWdpbmFsRmlsZVBhdGgpOwotCQkJZGlhbG9nLnNldE9yaWdpbmFsRmlsZShvcmlnaW5hbEZpbGUpOwotCQl9Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9FWFBPUlRfRElBTE9HX1RJVExFKTsKLQkJZGlhbG9nLnNldFRpdGxlKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9FWFBPUlRfRElBTE9HX0hFQURJTkcpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfRVhQT1JUX0RJQUxPR19NRVNTQUdFKTsKLQotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWludCByYyA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChyYyA9PSBXaW5kb3cuT0spIHsKLQkJCUlQYXRoIHBhdGggPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkudG9VUkkoKS50b1N0cmluZygpOwotCi0JCQkJLy8gaGVyZSB3ZSBzYXZlIHRoZSBjYXRhbG9nIGVudHJpZXMgdG8gdGhlIHNlbGVjdGVkIGZpbGUKLQkJCQl0cnkgewotCQkJCQljcmVhdGVGaWxlSWZSZXF1aXJlZChmaWxlKTsKLQkJCQkJd29ya2luZ1VzZXJDYXRhbG9nLnNldExvY2F0aW9uKGZpbGVOYW1lKTsKLQkJCQkJd29ya2luZ1VzZXJDYXRhbG9nLnNhdmUoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIHRpdGxlID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0NBVEFMT0dfU0FWRV9FUlJPUjsKLQkJCQkJCVN0cmluZyBicmllZk1lc3NhZ2UgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfQ0FUQUxPR19DT1VMRF9OT1RfQkVfU0FWRUQ7Ci0JCQkJCQlTdHJpbmcgcmVhc29uID0gZmlsZS5pc1JlYWRPbmx5KCkgPyBOTFMuYmluZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfRklMRV9JU19SRUFEX09OTFksIGZpbGVOYW1lKSA6IE5MUy5iaW5kKFhNTENhdGFsb2dNZXNzYWdlcy5FUlJPUl9TQVZJTkdfRklMRSwgZmlsZU5hbWUpOwotCQkJCQkJU3RyaW5nIGRldGFpbHMgPSBOTFMuYmluZChYTUxDYXRhbG9nTWVzc2FnZXMuRVJST1JfU0FWSU5HX0ZJTEUsIGZpbGVOYW1lKTsKLQotCQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHRpdGxlLCBicmllZk1lc3NhZ2UsIGNyZWF0ZVN0YXR1cyhyZWFzb24sIGRldGFpbHMpKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4MikgewotCQkJCQl9Ci0JCQkJfQotCQkJCWNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBUT0RPLi4uIFRoaXMgd2FzIGNvcGllZCBmcm9tIFdpbmRvd1V0aWxpdHkuIElzIHRoZXJlIGFuIGVhc2llciB3YXkgdG8KLQkvLyBjcmVhdGUgYSBzdGF0dXMgb2JqZWN0PwotCS8vIElmIG5vdCwgd2Ugc2hvdWxkIG9wZW4gYW4gZWNsaXBzZSBidWcgb3IgYWRkIGEgc2ltaWxhciB1dGlsaXR5IHRvCi0JLy8gYmFzZUV4dGVuc2lvbnNVSS4KLQkvLwotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKFN0cmluZyByZWFzb24sIFN0cmluZyBtc2cpIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhwbHVnaW5JZCwgMCwgcmVhc29uLCBudWxsKTsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luSWQsIDAsIG1zZywgbnVsbCk7Ci0JCW11bHRpU3RhdHVzLmFkZChzdGF0dXMpOwotCQlyZXR1cm4gbXVsdGlTdGF0dXM7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWxlSWZSZXF1aXJlZChJRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoKGZpbGUgIT0gbnVsbCkgJiYgIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7Ci0JCQkJZmlsZS5jcmVhdGUoaW5wdXRTdHJlYW0sIHRydWUsIG51bGwpOwotCQkJCS8vIGNyZWF0ZUVtcHR5WE1MQ2F0YWxvZyhmaWxlKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODViNTdkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIENhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBDYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlciBfaW5zdGFuY2U7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0VYVEVOU0lPTlMgPSAiZXh0ZW5zaW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lDT04gPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiY2F0YWxvZ0ZpbGVUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJmaWxlVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIENhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoX2luc3RhbmNlID09IG51bGwpIHsKLQkJCV9pbnN0YW5jZSA9IG5ldyBDYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlcigpOwotCQl9Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldFhNTENhdGFsb2dGaWxlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmhhc2hNYXAudmFsdWVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBIYXNoTWFwIGhhc2hNYXA7Ci0KLQlwdWJsaWMgQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXRoaXMuaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJlYWRSZWdpc3RyeSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkgewotCQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJCWlmIChpZCAhPSBudWxsKSB7Ci0JCQkJWE1MQ2F0YWxvZ0ZpbGVUeXBlIGZpbGVUeXBlID0gKFhNTENhdGFsb2dGaWxlVHlwZSkgaGFzaE1hcC5nZXQoaWQpOwotCQkJCWlmIChmaWxlVHlwZSA9PSBudWxsKSB7Ci0JCQkJCWZpbGVUeXBlID0gbmV3IFhNTENhdGFsb2dGaWxlVHlwZSgpOwotCQkJCQloYXNoTWFwLnB1dChpZCwgZmlsZVR5cGUpOwotCQkJCX0KLQkJCQlmaWxlVHlwZS5pZCA9IGlkOwotCQkJCWlmIChmaWxlVHlwZS5kZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ERVNDUklQVElPTik7Ci0JCQkJCWZpbGVUeXBlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCQkJfQotCi0JCQkJZmlsZVR5cGUuYWRkRXh0ZW5zaW9ucyhlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfRVhURU5TSU9OUykpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkJcmVhZFJlZ2lzdHJ5KEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRSZWdpc3RyeShTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBwbHVnaW5SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChYTUxVSVBsdWdpbi5JRCwgZXh0ZW5zaW9uUG9pbnRJZCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCXJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvRWRpdENhdGFsb2dFbnRyeURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OGU4YTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9ncy5TZWxlY3RTaW5nbGVGaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSURlbGVnYXRlQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSVJld3JpdGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JU3VmZml4RW50cnk7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGJvcndzZUltYWdlID0gSW1hZ2VGYWN0b3J5LklOU1RBTkNFLmdldEltYWdlKCJpY29ucy9vYmoxNi9maWxlX2V4cGFuZC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgY2F0YWxvZ0VudHJ5VG9vbEJhckltYWdlID0gSW1hZ2VGYWN0b3J5LklOU1RBTkNFLmdldEltYWdlKCJpY29ucy9ldG9vbDUwL2NhdGFsb2dFbnRyeS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgbmV4dENhdGFsb2dUb29sQmFySW1hZ2UgPSBJbWFnZUZhY3RvcnkuSU5TVEFOQ0UuZ2V0SW1hZ2UoImljb25zL2V0b29sNTAvbmV4dENhdGFsb2cuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGRlbGVnYXRlQ2F0YWxvZ1Rvb2xCYXJJbWFnZSA9IEltYWdlRmFjdG9yeS5JTlNUQU5DRS5nZXRJbWFnZSgiaWNvbnMvZXRvb2w1MC9kZWxlZ2F0ZUNhdGFsb2cuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIHJld3JpdGVUb29sQmFySW1hZ2UgPSBJbWFnZUZhY3RvcnkuSU5TVEFOQ0UuZ2V0SW1hZ2UoImljb25zL2V0b29sNTAvcmV3cml0ZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgcHJlZml4VG9vbEJhckltYWdlID0gSW1hZ2VGYWN0b3J5LklOU1RBTkNFLmdldEltYWdlKCJpY29ucy9ldG9vbDUwL3ByZWZpeC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2Ugc3VmZml4VG9vbEJhckltYWdlID0gSW1hZ2VGYWN0b3J5LklOU1RBTkNFLmdldEltYWdlKCJpY29ucy9ldG9vbDUwL3N1Zml4LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIGNsYXNzIENhdGFsb2dFbnRyeVBhZ2UgZXh0ZW5kcyBDYXRhbG9nRWxlbWVudFBhZ2UgewotCi0JCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlV29ya3NwYWNlQnV0dG9uOwotCQkKLQkJcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VGaWxlU3lzdGVtQnV0dG9uOwotCi0JCXByb3RlY3RlZCBJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeTsKLQotCQlwcm90ZWN0ZWQgQnV0dG9uIGNoZWNrYm94QnV0dG9uOwotCi0JCXByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLQotCQlwcm90ZWN0ZWQgVGV4dCBrZXlGaWVsZDsKLQotCQlwcm90ZWN0ZWQgQ29tYm8ga2V5VHlwZUNvbWJvOwotCi0JCXByb3RlY3RlZCBUZXh0IHJlc291cmNlTG9jYXRpb25GaWVsZDsKLQotCQlwcm90ZWN0ZWQgQ29tYm8gcmVzb3VyY2VUeXBlQ29tYm87Ci0KLQkJcHJvdGVjdGVkIFRleHQgd2ViQWRkcmVzc0ZpZWxkOwotCQkKLQkJcHJvdGVjdGVkIFN0cmluZyBrZXk7Ci0JCQotCQlwcm90ZWN0ZWQgaW50IHR5cGU7Ci0JCQotCQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQkJY29tcHV0ZUVycm9yTWVzc2FnZSgpOwotCQkJdXBkYXRlRXJyb3JNZXNzYWdlTGFiZWwoZXJyb3JNZXNzYWdlTGFiZWwpOwotCQkJdXBkYXRlT0tCdXR0b25TdGF0ZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCWVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCQl3YXJuaW5nTWVzc2FnZSA9IG51bGw7Ci0KLQkJCVN0cmluZyBmaWxlTmFtZSA9IHJlc291cmNlTG9jYXRpb25GaWVsZC5nZXRUZXh0KCk7Ci0JCQlpZiAoZmlsZU5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCWlmICgoZmlsZU5hbWUuaW5kZXhPZigiLi4iKSAhPSAtMSkgfHwgKGZpbGVOYW1lLmluZGV4T2YoIi4vIikgIT0gLTEpIHx8IChmaWxlTmFtZS5pbmRleE9mKCIvLiIpICE9IC0xKSB8fCAoZmlsZU5hbWUuaW5kZXhPZigiLlxcIikgIT0gLTEpIHx8IChmaWxlTmFtZS5pbmRleE9mKCJcXC4iKSAhPSAtMSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQkJCWVycm9yTWVzc2FnZSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9XQVJOSU5HX1VSSV9NVVNUX05PVF9IQVZFX0RPVFM7Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHVyaSA9IGZpbGVOYW1lOwotCQkJCWlmICghVVJJSGVscGVyLmhhc1Byb3RvY29sKHVyaSkpIHsKLQkJCQkJVVJJSGVscGVyLmlzQWJzb2x1dGUodXJpKTsKLQkJCQkJdXJpID0gKFVSSUhlbHBlci5pc0Fic29sdXRlKHVyaSkpID8gVVJJSGVscGVyLnByZXBlbmRGaWxlUHJvdG9jb2wodXJpKSA6IFVSSUhlbHBlci5wcmVwZW5kUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKHVyaSk7Ci0JCQkJfQotCi0JCQkJaWYgKChlcnJvck1lc3NhZ2UgPT0gbnVsbCkgJiYgIVVSSUhlbHBlci5pc1JlYWRhYmxlVVJJKHVyaSwgZmFsc2UpKSB7Ci0JCQkJCWVycm9yTWVzc2FnZSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9XQVJOSU5HX1VSSV9OT1RfRk9VTkRfQ09MT04gKyBmaWxlTmFtZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB0aGlzIGFuIGVycm9yIHRoYXQgaXMgbm90IGFjdGF1bGx5Ci0JCQkJLy8gcmVwb3J0ZWQgLi4uIE9LIGlzIGp1c3QgZGlzYWJsZWQKLQkJCQllcnJvck1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQkvLyBNYWtlIHN1cmUgdGhlIGtleSBpcyBhIGZ1bGx5IHF1YWxpZmllZCBVUkkgaW4gdGhlIGNhc2VzCi0JCQkvLyB3aGVyZSB0aGUga2V5IHR5cGUgaXMgIlN5c3RlbSBJRCIgb3IgIlNjaGVtYSBsb2NhdGlvbiIKLQkJCWlmICgoa2V5RmllbGQuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgJiYgKGdldEtleVR5cGUoKSA9PSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNKSkgewotCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKGtleUZpZWxkLmdldFRleHQoKSk7Ci0JCQkJaWYgKHVyaS5zY2hlbWUoKSA9PSBudWxsKSB7Ci0JCQkJCXdhcm5pbmdNZXNzYWdlID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX1dBUk5JTkdfU0hPVUxEX0JFX0ZVTExZX1FVQUxJRklFRF9VUkk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoKGVycm9yTWVzc2FnZSA9PSBudWxsKSAmJiBjaGVja2JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSAmJiAod2ViQWRkcmVzc0ZpZWxkLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQkvLyB0aGlzIGFuIGVycm9yIHRoYXQgaXMgbm90IGFjdGF1bGx5Ci0JCQkJLy8gcmVwb3J0ZWQgLi4uIE9LIGlzIGp1c3QgZGlzYWJsZWQKLQkJCQllcnJvck1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAoKGVycm9yTWVzc2FnZSA9PSBudWxsKSAmJiAoa2V5RmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCS8vIHRoaXMgYW4gZXJyb3IgdGhhdCBpcyBub3QgYWN0YXVsbHkKLQkJCQkvLyByZXBvcnRlZCAuLi4gT0sgaXMganVzdCBkaXNhYmxlZAotCQkJCWVycm9yTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDYXRhbG9nRW50cnlQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJCU1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlpZiAoZS53aWRnZXQgPT0gcmVzb3VyY2VMb2NhdGlvbkZpZWxkKSB7Ci0JCQkJCQlpZiAoa2V5RmllbGQuZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQlTdHJpbmcgdXJpID0gcmVzb3VyY2VMb2NhdGlvbkZpZWxkLmdldFRleHQoKTsKLQkJCQkJCQlpZiAodXJpLmVuZHNXaXRoKCJ4c2QiKSAmJiAhVVJJSGVscGVyLmhhc1Byb3RvY29sKHVyaSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl1cmkgPSBVUklIZWxwZXIuaXNBYnNvbHV0ZSh1cmkpID8gVVJJSGVscGVyLnByZXBlbmRGaWxlUHJvdG9jb2wodXJpKSA6IFVSSUhlbHBlci5wcmVwZW5kUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKHVyaSk7Ci0JCQkJCQkJCVN0cmluZyBuYW1lc3BhY2VVUkkgPSBYTUxRdWlja1NjYW4uZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hKHVyaSk7Ci0JCQkJCQkJCWlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotCQkJCQkJCQkJa2V5RmllbGQuc2V0VGV4dChuYW1lc3BhY2VVUkkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXVwZGF0ZVdpZGdldHMoZS53aWRnZXQpOwotCQkJCX0KLQkJCX07Ci0KLQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCUNvbXBvc2l0ZSBncm91cCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0JCQlMYWJlbCByZXNvdXJjZUxvY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCXJlc291cmNlTG9jYXRpb25MYWJlbC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9MT0NBVElPTl9DT0xPTik7Ci0KLQkJCXJlc291cmNlTG9jYXRpb25GaWVsZCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCQlyZXNvdXJjZUxvY2F0aW9uRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCXJlc291cmNlTG9jYXRpb25GaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShVUklVdGlscy5jb252ZXJ0VVJJVG9Mb2NhdGlvbihnZXRFbnRyeSgpLmdldFVSSSgpKSkpOwotCi0JCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAocmVzb3VyY2VMb2NhdGlvbkZpZWxkLAotCQkJLy8gWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MUF9FTlRSWV9VUkkpOwotCQkJcmVzb3VyY2VMb2NhdGlvbkZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKGJyb3dzZUJ1dHRvbiwKLQkJCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfRU5UUllfQlJPV1NFKTsKLQotCQkJQ29tcG9zaXRlIGJyb3dzZUJ1dHRvbnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkVORDsKLQkJCWJyb3dzZUJ1dHRvbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkKLQkJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luQm90dG9tID0gNTsKLQkJCWJyb3dzZUJ1dHRvbnNDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQkKLQkJCWJyb3dzZVdvcmtzcGFjZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnJvd3NlQnV0dG9uc0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQkJYnJvd3NlV29ya3NwYWNlQnV0dG9uLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9NRU5VX0JST1dTRV9XT1JLU1BBQ0UpOwotCQkJYnJvd3NlV29ya3NwYWNlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9IGludm9rZVdvcmtzcGFjZUZpbGVTZWxlY3Rpb25EaWFsb2coKTsKLQkJCQkJaWYodmFsdWUgIT0gbnVsbCkgewotCQkJCQkJcmVzb3VyY2VMb2NhdGlvbkZpZWxkLnNldFRleHQodmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCWJyb3dzZUZpbGVTeXN0ZW1CdXR0b24gPSBuZXcgQnV0dG9uKGJyb3dzZUJ1dHRvbnNDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJCWJyb3dzZUZpbGVTeXN0ZW1CdXR0b24uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfQlVUVE9OX01FTlVfQlJPV1NFX0ZJTEVfU1lTVEVNKTsKLQkJCWJyb3dzZUZpbGVTeXN0ZW1CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJU3RyaW5nIHZhbHVlID0gaW52b2tlRmlsZVNlbGVjdGlvbkRpYWxvZygpOwotCQkJCQlpZih2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXNvdXJjZUxvY2F0aW9uRmllbGQuc2V0VGV4dCh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJLy8gS2V5IFR5cGUKLQkJCS8vCi0JCQlMYWJlbCBrZXlUeXBlTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCWtleVR5cGVMYWJlbC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9DT0xPTik7Ci0KLQkJCWtleVR5cGVDb21ibyA9IG5ldyBDb21ibyhncm91cCwgU1dULlJFQURfT05MWSk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCQlrZXlUeXBlQ29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQl1cGRhdGVLZXlUeXBlQ29tYm8oZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKSk7Ci0JCQlrZXlUeXBlQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKGtleVR5cGVDb21ibywKLQkJCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfRU5UUllfS0VZX1RZUEUpOwotCi0JCQkvLyBLZXkKLQkJCS8vIAotCQkJTGFiZWwga2V5VmFsdWVMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJa2V5VmFsdWVMYWJlbC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9LRVlfQ09MT04pOwotCQkJa2V5RmllbGQgPSBuZXcgVGV4dChncm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKGtleUZpZWxkLAotCQkJLy8gWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MUF9FTlRSWV9LRVkpOwotCQkJa2V5RmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlrZXlGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShnZXRFbnRyeSgpLmdldEtleSgpKSk7Ci0JCQlrZXlGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCUNvbXBvc2l0ZSBncm91cDIgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyb3VwMi5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWdyb3VwMi5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJLy8gY2hlY2tib3ggLS0gbm90ZSBwYXJlbnQgaXMgZGlhbG9nQXJlYQotCQkJLy8KLQkJCWNoZWNrYm94QnV0dG9uID0gbmV3IEJ1dHRvbihncm91cDIsIFNXVC5DSEVDSyk7Ci0JCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAoY2hlY2tib3hCdXR0b24sCi0JCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX0VOVFJZX1NQRUNJRllfQUxURVJOQVRJVkUpOwotCQkJY2hlY2tib3hCdXR0b24uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfU1BFQ0lGWV9BTFRFUk5BVElWRV9XRUJfVVJMKTsKLQkJCWNoZWNrYm94QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJY2hlY2tib3hCdXR0b24uc2V0U2VsZWN0aW9uKGdldEVudHJ5KCkuZ2V0QXR0cmlidXRlVmFsdWUoSUNhdGFsb2dFbnRyeS5BVFRSX1dFQl9VUkwpICE9IG51bGwpOwotCQkJU2VsZWN0aW9uTGlzdGVuZXIgYnV0dG9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCS8vIG5vIGltcGwKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlpZiAoZXZlbnQud2lkZ2V0ID09IGNoZWNrYm94QnV0dG9uKSB7Ci0JCQkJCQl1cGRhdGVXaWRnZXRzKGNoZWNrYm94QnV0dG9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQljaGVja2JveEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidXR0b25MaXN0ZW5lcik7Ci0KLQkJCS8vIFdlYiBBZGRyZXNzIGZpZWxkCi0JCQkvLwotCi0JCQlNb2RpZnlMaXN0ZW5lciB3ZWJBZGRyZXNzRmllbGRMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJY29tcHV0ZUVycm9yTWVzc2FnZSgpOwotCQkJCQl1cGRhdGVFcnJvck1lc3NhZ2VMYWJlbChlcnJvck1lc3NhZ2VMYWJlbCk7Ci0JCQkJCXVwZGF0ZU9LQnV0dG9uU3RhdGUoKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQl3ZWJBZGRyZXNzRmllbGQgPSBuZXcgVGV4dChncm91cDIsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscCh3ZWJBZGRyZXNzRmllbGQsCi0JCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX0VOVFJZX1dFQl9BRERSRVNTKTsKLQkJCXdlYkFkZHJlc3NGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCXdlYkFkZHJlc3NGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShnZXRFbnRyeSgpLmdldEF0dHJpYnV0ZVZhbHVlKElDYXRhbG9nRW50cnkuQVRUUl9XRUJfVVJMKSkpOwotCQkJd2ViQWRkcmVzc0ZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJd2ViQWRkcmVzc0ZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHdlYkFkZHJlc3NGaWVsZExpc3RlbmVyKTsKLQotCi0JCQllcnJvck1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChncm91cDIsIFNXVC5OT05FKTsKLQkJCWVycm9yTWVzc2FnZUxhYmVsLnNldEZvcmVncm91bmQoY29sb3IpOwotCQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCXVwZGF0ZVdpZGdldHMobnVsbCk7Ci0JCQkKLQkJCWtleSA9IGdldEVudHJ5KCkuZ2V0S2V5KCk7Ci0JCQl0eXBlID0gZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKTsKLQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQlmQ29udHJvbCA9IGNyZWF0ZUNhdGFsb2dFbnRyeVBhbmVsKHBhcmVudCk7Ci0KLQkJCXJldHVybiBmQ29udHJvbDsKLQkJfQotCi0KLQkJcHVibGljIElDYXRhbG9nRWxlbWVudCBnZXREYXRhKCkgewotCQkJcmV0dXJuIGdldEVudHJ5KCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSUNhdGFsb2dFbnRyeSBnZXRFbnRyeSgpIHsKLQkJCWlmIChjYXRhbG9nRW50cnkgPT0gbnVsbCkgewotCQkJCWlmICgoZkNhdGFsb2dFbGVtZW50ICE9IG51bGwpICYmIChmQ2F0YWxvZ0VsZW1lbnQuZ2V0VHlwZSgpID09IElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZKSkgewotCQkJCQljYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgZkNhdGFsb2dFbGVtZW50OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkgewotCQkJCQkJY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIGNhdGFsb2cuY3JlYXRlQ2F0YWxvZ0VsZW1lbnQoSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNhdGFsb2dFbnRyeTsKLQkJfQotCi0JCXByb3RlY3RlZCBpbnQgZ2V0S2V5VHlwZSgpIHsKLQkJCXN3aXRjaCAoa2V5VHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQlpZiAoInNjaGVtYSIuZXF1YWxzKGtleVR5cGVDb21iby5nZXREYXRhKCJrZXlUeXBlIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJcmV0dXJuIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk7IC8vIHhzZAotCQkJCQkJCQkJCQkJCQkJCS8vIG5hbWVzcGFjZQotCQkJCQkJCQkJCQkJCQkJCS8vIGlzIFVSSSB0eXBlCi0JCQkJCQkJCQkJCQkJCQkJLy8ga2V5Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJcmV0dXJuIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU07Ci0JCQkJY2FzZSAyIDoKLQkJCQkJcmV0dXJuIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2F2ZURhdGEoKSB7Ci0JCQlpZiAodmFsaWRhdGVEYXRhKCkpIHsKLQkJCQlnZXRFbnRyeSgpLnNldFVSSShVUklVdGlscy5jb252ZXJ0TG9jYXRpb25Ub1VSSShyZXNvdXJjZUxvY2F0aW9uRmllbGQuZ2V0VGV4dCgpKSk7Ci0JCQkJZ2V0RW50cnkoKS5zZXRLZXkoa2V5RmllbGQuZ2V0VGV4dCgpKTsKLQkJCQlnZXRFbnRyeSgpLnNldEVudHJ5VHlwZShnZXRLZXlUeXBlKCkpOwotCQkJCWdldEVudHJ5KCkuc2V0QXR0cmlidXRlVmFsdWUoSUNhdGFsb2dFbnRyeS5BVFRSX1dFQl9VUkwsIGNoZWNrYm94QnV0dG9uLmdldFNlbGVjdGlvbigpID8gd2ViQWRkcmVzc0ZpZWxkLmdldFRleHQoKSA6IG51bGwpOwotCQkJCWRhdGFTYXZlZCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQllcnJvck1lc3NhZ2UgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfV0FSTklOR19EVVBMSUNBVEVfRU5UUlk7Ci0JCQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UpOwotCQkJCXVwZGF0ZU9LQnV0dG9uU3RhdGUoKTsKLQkJCQlkYXRhU2F2ZWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQkKLQkJLyoqCi0JCSAqIFZhbGlkYXRlcyB0aGF0IHRoZSBkYXRhIGVudGVyZWQgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBhbiBleGlzdGluZyBlbnRyeSBpbiBlaXRoZXIgY2F0YWxvZy4KLQkJICogQHJldHVybiBUcnVlIGlmIHZhbGlkYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVEYXRhKCkgewotCQkKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkJaWYgKGtleSA9PSBudWxsIHx8ICFrZXkuZXF1YWxzKGtleUZpZWxkLmdldFRleHQoKSkgfHwgdHlwZSAhPSBnZXRLZXlUeXBlKCkpCi0JCQl7Ci0JCQkJdHJ5IHsKLQkJCQkJc3dpdGNoKCBnZXRLZXlUeXBlKCkgKQotCQkJCQl7Ci0JCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzoKLQkJCQkJCXJlc3VsdCA9IGNhdGFsb2cucmVzb2x2ZVB1YmxpYyhrZXlGaWVsZC5nZXRUZXh0KCksIG51bGwpOwkJCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNOgotCQkJCQkJcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlU3lzdGVtKGtleUZpZWxkLmdldFRleHQoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJOgotCQkJCQkJcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlVVJJKGtleUZpZWxkLmdldFRleHQoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiAocmVzdWx0ID09IG51bGwpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlS2V5VHlwZUNvbWJvKGludCB0eXBlKSB7Ci0JCQlrZXlUeXBlQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBDYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlci5nZXRYTUxDYXRhbG9nRmlsZVR5cGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJWE1MQ2F0YWxvZ0ZpbGVUeXBlIHRoZUZpbGVUeXBlID0gKFhNTENhdGFsb2dGaWxlVHlwZSkgaS5uZXh0KCk7Ci0JCQkJaWYgKHRoZUZpbGVUeXBlLmV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGogPSB0aGVGaWxlVHlwZS5leHRlbnNpb25zLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykgewotCQkJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IChTdHJpbmcpIGoubmV4dCgpOwotCQkJCQkJaWYgKHJlc291cmNlTG9jYXRpb25GaWVsZC5nZXRUZXh0KCkuZW5kc1dpdGgoZXh0ZW5zaW9uKSkgewotCQkJCQkJCWlmICgib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnVpLmNhdGFsb2dGaWxlVHlwZS54c2QiLmVxdWFscyh0aGVGaWxlVHlwZS5pZCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlrZXlUeXBlQ29tYm8uYWRkKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9YU0RfUFVCTElDKTsKLQkJCQkJCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fWFNEX1NZU1RFTSk7Ci0JCQkJCQkJCWtleVR5cGVDb21iby5zZXREYXRhKCJrZXlUeXBlIiwgInNjaGVtYSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAoIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS51aS5jYXRhbG9nRmlsZVR5cGUuZHRkIi5lcXVhbHModGhlRmlsZVR5cGUuaWQpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fRFREX1BVQkxJQyk7Ci0JCQkJCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9TWVNURU0pOwotCQkJCQkJCQlrZXlUeXBlQ29tYm8uYWRkKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9VUkkpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fVVJJKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQkJaWYgKGtleVR5cGVDb21iby5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0JCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fRFREX1BVQkxJQyk7Ci0JCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fRFREX1NZU1RFTSk7Ci0JCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fVVJJKTsKLQkJCX0KLQotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDIDoKLQkJCQkJa2V5VHlwZUNvbWJvLnNlbGVjdCgwKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNIDoKLQkJCQkJa2V5VHlwZUNvbWJvLnNlbGVjdCgxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJIDogLy8gaGFuZGxlIFhNTCBTY2hlbWEsCi0JCQkJCQkJCQkJCQkJLy8gd2hlcmUgbmFtZXNwYWNlIG5hbWUgaXMKLQkJCQkJCQkJCQkJCQkvLyBtYXBwZWQgdG8gVVJJIHNpdHVhdGlvbgotCQkJCQlpZiAoInNjaGVtYSIuZXF1YWxzKGtleVR5cGVDb21iby5nZXREYXRhKCJrZXlUeXBlIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJa2V5VHlwZUNvbWJvLnNlbGVjdCgwKTsgLy8gbmFtZXNwYWNlIG5hbWUgYXMgVVJJIGtleQotCQkJCQkJCQkJCQkJLy8gdHlwZQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJa2V5VHlwZUNvbWJvLnNlbGVjdCgyKTsgLy8gVVJJIGtleSB0eXBlCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWlmIChrZXlUeXBlQ29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0JCQkJCQlrZXlUeXBlQ29tYm8uc2VsZWN0KDApOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJfQotCi0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXZWJBZGRyZXNzV2lkZ2V0cyhpbnQga2V5VHlwZSkgewotCQkJYm9vbGVhbiBpc1B1YmxpY0tleVR5cGUgPSAoa2V5VHlwZSA9PSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDKTsKLQkJCWNoZWNrYm94QnV0dG9uLnNldEVuYWJsZWQoaXNQdWJsaWNLZXlUeXBlKTsKLQkJCXdlYkFkZHJlc3NGaWVsZC5zZXRFbmFibGVkKGlzUHVibGljS2V5VHlwZSAmJiBjaGVja2JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXaWRnZXRzKFdpZGdldCB3aWRnZXQpIHsKLQkJCWlmICh3aWRnZXQgIT0ga2V5VHlwZUNvbWJvKSB7Ci0JCQkJdXBkYXRlS2V5VHlwZUNvbWJvKGdldEtleVR5cGUoKSk7Ci0JCQl9Ci0JCQl1cGRhdGVXZWJBZGRyZXNzV2lkZ2V0cyhnZXRLZXlUeXBlKCkpOwotCQkJY29tcHV0ZUVycm9yTWVzc2FnZSgpOwotCQkJdXBkYXRlRXJyb3JNZXNzYWdlTGFiZWwoZXJyb3JNZXNzYWdlTGFiZWwpOwotCQkJdXBkYXRlT0tCdXR0b25TdGF0ZSgpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgU3VmZml4RW50cnlQYWdlIGV4dGVuZHMgQ2F0YWxvZ0VsZW1lbnRQYWdlIHsKLQkKLQkJcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VXb3Jrc3BhY2VCdXR0b247Ci0JCQotCQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUZpbGVTeXN0ZW1CdXR0b247Ci0JCi0JCXByb3RlY3RlZCBJU3VmZml4RW50cnkgY2F0YWxvZ0VudHJ5OwotCQotCQlwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0JCi0JCXByb3RlY3RlZCBUZXh0IHN1ZmZpeEZpZWxkOwotCQotCQlwcm90ZWN0ZWQgQ29tYm8ga2V5VHlwZUNvbWJvOwotCQotCQlwcm90ZWN0ZWQgVGV4dCByZXNvdXJjZUxvY2F0aW9uRmllbGQ7Ci0JCi0JCXByb3RlY3RlZCBDb21ibyByZXNvdXJjZVR5cGVDb21ibzsKLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGtleTsKLQkJCi0JCXByb3RlY3RlZCBpbnQgdHlwZTsKLQkJCi0JCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCQljb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQl1cGRhdGVFcnJvck1lc3NhZ2VMYWJlbChlcnJvck1lc3NhZ2VMYWJlbCk7Ci0JCQl1cGRhdGVPS0J1dHRvblN0YXRlKCk7Ci0JCX0KLQkKLQkJcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCWVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCQl3YXJuaW5nTWVzc2FnZSA9IG51bGw7Ci0JCi0JCQlTdHJpbmcgZmlsZU5hbWUgPSByZXNvdXJjZUxvY2F0aW9uRmllbGQuZ2V0VGV4dCgpOwotCQkJaWYgKGZpbGVOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlpZiAoKGZpbGVOYW1lLmluZGV4T2YoIi4uIikgIT0gLTEpIHx8IChmaWxlTmFtZS5pbmRleE9mKCIuLyIpICE9IC0xKSB8fCAoZmlsZU5hbWUuaW5kZXhPZigiLy4iKSAhPSAtMSkgfHwgKGZpbGVOYW1lLmluZGV4T2YoIi5cXCIpICE9IC0xKSB8fCAoZmlsZU5hbWUuaW5kZXhPZigiXFwuIikgIT0gLTEpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJCQllcnJvck1lc3NhZ2UgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfV0FSTklOR19VUklfTVVTVF9OT1RfSEFWRV9ET1RTOwotCQkJCX0KLQotCQkJCVN0cmluZyB1cmkgPSBmaWxlTmFtZTsKLQkJCQlpZiAoIVVSSUhlbHBlci5oYXNQcm90b2NvbCh1cmkpKSB7Ci0JCQkJCVVSSUhlbHBlci5pc0Fic29sdXRlKHVyaSk7Ci0JCQkJCXVyaSA9IChVUklIZWxwZXIuaXNBYnNvbHV0ZSh1cmkpKSA/IFVSSUhlbHBlci5wcmVwZW5kRmlsZVByb3RvY29sKHVyaSkgOiBVUklIZWxwZXIucHJlcGVuZFBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbCh1cmkpOwotCQkJCX0KLQotCQkJCWlmICgoZXJyb3JNZXNzYWdlID09IG51bGwpICYmICFVUklIZWxwZXIuaXNSZWFkYWJsZVVSSSh1cmksIGZhbHNlKSkgewotCQkJCQllcnJvck1lc3NhZ2UgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfV0FSTklOR19VUklfTk9UX0ZPVU5EX0NPTE9OICsgZmlsZU5hbWU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdGhpcyBhbiBlcnJvciB0aGF0IGlzIG5vdCBhY3RhdWxseQotCQkJCS8vIHJlcG9ydGVkIC4uLiBPSyBpcyBqdXN0IGRpc2FibGVkCi0JCQkJZXJyb3JNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQotCQkJaWYgKChlcnJvck1lc3NhZ2UgPT0gbnVsbCkgJiYgKHN1ZmZpeEZpZWxkLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQkvLyB0aGlzIGFuIGVycm9yIHRoYXQgaXMgbm90IGFjdGF1bGx5Ci0JCQkJLy8gcmVwb3J0ZWQgLi4uIE9LIGlzIGp1c3QgZGlzYWJsZWQKLQkJCQllcnJvck1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCi0JCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZVN1ZmZpeEVudHJ5UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQotCQkJTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCWlmIChlLndpZGdldCA9PSByZXNvdXJjZUxvY2F0aW9uRmllbGQpIHsKLQkJCQkJCWlmIChzdWZmaXhGaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCVN0cmluZyB1cmkgPSByZXNvdXJjZUxvY2F0aW9uRmllbGQuZ2V0VGV4dCgpOwotCQkJCQkJCWlmICh1cmkuZW5kc1dpdGgoInhzZCIpICYmICFVUklIZWxwZXIuaGFzUHJvdG9jb2wodXJpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXVyaSA9IFVSSUhlbHBlci5pc0Fic29sdXRlKHVyaSkgPyBVUklIZWxwZXIucHJlcGVuZEZpbGVQcm90b2NvbCh1cmkpIDogVVJJSGVscGVyLnByZXBlbmRQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wodXJpKTsKLQkJCQkJCQkJU3RyaW5nIG5hbWVzcGFjZVVSSSA9IFhNTFF1aWNrU2Nhbi5nZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEodXJpKTsKLQkJCQkJCQkJaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlzdWZmaXhGaWVsZC5zZXRUZXh0KG5hbWVzcGFjZVVSSSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJdXBkYXRlV2lkZ2V0cyhlLndpZGdldCk7Ci0JCQkJfQotCQkJfTsKLQkKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQkJCUNvbXBvc2l0ZSBncm91cCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCi0JCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQkJCUxhYmVsIHJlc291cmNlTG9jYXRpb25MYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJcmVzb3VyY2VMb2NhdGlvbkxhYmVsLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0xPQ0FUSU9OX0NPTE9OKTsKLQkKLQkJCXJlc291cmNlTG9jYXRpb25GaWVsZCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCQlyZXNvdXJjZUxvY2F0aW9uRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCi0JCQlyZXNvdXJjZUxvY2F0aW9uRmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoVVJJVXRpbHMuY29udmVydFVSSVRvTG9jYXRpb24oZ2V0RW50cnkoKS5nZXRVUkkoKSkpKTsKLQkJCXJlc291cmNlTG9jYXRpb25GaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCQotCQkJQ29tcG9zaXRlIGJyb3dzZUJ1dHRvbnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkVORDsKLQkJCWJyb3dzZUJ1dHRvbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkKLQkJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luQm90dG9tID0gNTsKLQkJCWJyb3dzZUJ1dHRvbnNDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQkKLQkJCWJyb3dzZVdvcmtzcGFjZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnJvd3NlQnV0dG9uc0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQkJYnJvd3NlV29ya3NwYWNlQnV0dG9uLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9NRU5VX0JST1dTRV9XT1JLU1BBQ0UpOwotCQkJYnJvd3NlV29ya3NwYWNlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJfQotCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJU3RyaW5nIHZhbHVlID0gaW52b2tlV29ya3NwYWNlRmlsZVNlbGVjdGlvbkRpYWxvZygpOwotCQkJCQlpZih2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXNvdXJjZUxvY2F0aW9uRmllbGQuc2V0VGV4dCh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJYnJvd3NlRmlsZVN5c3RlbUJ1dHRvbiA9IG5ldyBCdXR0b24oYnJvd3NlQnV0dG9uc0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQkJYnJvd3NlRmlsZVN5c3RlbUJ1dHRvbi5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9CVVRUT05fTUVOVV9CUk9XU0VfRklMRV9TWVNURU0pOwotCQkJYnJvd3NlRmlsZVN5c3RlbUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCX0KLQkKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9IGludm9rZUZpbGVTZWxlY3Rpb25EaWFsb2coKTsKLQkJCQkJaWYodmFsdWUgIT0gbnVsbCkgewotCQkJCQkJcmVzb3VyY2VMb2NhdGlvbkZpZWxkLnNldFRleHQodmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCS8vIEtleSBUeXBlCi0JCQkvLwotCQkJTGFiZWwga2V5VHlwZUxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlrZXlUeXBlTGFiZWwuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfQ09MT04pOwotCQotCQkJa2V5VHlwZUNvbWJvID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJCWtleVR5cGVDb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCXVwZGF0ZUtleVR5cGVDb21ibyhnZXRFbnRyeSgpLmdldEVudHJ5VHlwZSgpKTsKLQkJCWtleVR5cGVDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCi0JCQkvLyBTdWZmaXgKLQkJCS8vIAotCQkJTGFiZWwgc3VmZml4VmFsdWVMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJc3VmZml4VmFsdWVMYWJlbC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9TVUZGSVhfQ09MT04pOwotCQkJc3VmZml4RmllbGQgPSBuZXcgVGV4dChncm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCi0JCQlzdWZmaXhGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCXN1ZmZpeEZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGdldEVudHJ5KCkuZ2V0U3VmZml4KCkpKTsKLQkJCXN1ZmZpeEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJCi0JCQllcnJvck1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWVycm9yTWVzc2FnZUxhYmVsLnNldEZvcmVncm91bmQoY29sb3IpOwotCQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCi0JCQl1cGRhdGVXaWRnZXRzKG51bGwpOwotCQkJCi0JCQlrZXkgPSBnZXRFbnRyeSgpLmdldFN1ZmZpeCgpOwotCQkJdHlwZSA9IGdldEVudHJ5KCkuZ2V0RW50cnlUeXBlKCk7Ci0JCi0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9Ci0JCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQotCQkJZkNvbnRyb2wgPSBjcmVhdGVTdWZmaXhFbnRyeVBhbmVsKHBhcmVudCk7Ci0JCi0JCQlyZXR1cm4gZkNvbnRyb2w7Ci0JCX0KLQkKLQkKLQkJcHVibGljIElDYXRhbG9nRWxlbWVudCBnZXREYXRhKCkgewotCQkJcmV0dXJuIGdldEVudHJ5KCk7Ci0JCX0KLQkKLQkJcHJvdGVjdGVkIElTdWZmaXhFbnRyeSBnZXRFbnRyeSgpIHsKLQkJCWlmIChjYXRhbG9nRW50cnkgPT0gbnVsbCkgewotCQkJCWlmICgoZkNhdGFsb2dFbGVtZW50ICE9IG51bGwpICYmIChmQ2F0YWxvZ0VsZW1lbnQuZ2V0VHlwZSgpID09IElDYXRhbG9nRWxlbWVudC5UWVBFX1NVRkZJWCkpIHsKLQkJCQkJY2F0YWxvZ0VudHJ5ID0gKElTdWZmaXhFbnRyeSkgZkNhdGFsb2dFbGVtZW50OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkgewotCQkJCQkJY2F0YWxvZ0VudHJ5ID0gKElTdWZmaXhFbnRyeSkgY2F0YWxvZy5jcmVhdGVDYXRhbG9nRWxlbWVudChJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9TVUZGSVgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNhdGFsb2dFbnRyeTsKLQkJfQotCQotCQlwcm90ZWN0ZWQgaW50IGdldEtleVR5cGUoKSB7Ci0JCQlzd2l0Y2ggKGtleVR5cGVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJcmV0dXJuIElTdWZmaXhFbnRyeS5TVUZGSVhfVFlQRV9VUkk7IC8vIHhzZCBuYW1lc3BhY2UgaXMgVVJJIHR5cGUga2V5Ci0JCQkJY2FzZSAxIDoKLQkJCQkJcmV0dXJuIElTdWZmaXhFbnRyeS5TVUZGSVhfVFlQRV9TWVNURU07Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBJU3VmZml4RW50cnkuU1VGRklYX1RZUEVfVVJJOwotCQkJfQotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHNhdmVEYXRhKCkgewotCQkJaWYgKHZhbGlkYXRlRGF0YSgpKSB7Ci0JCQkJZ2V0RW50cnkoKS5zZXRVUkkoVVJJVXRpbHMuY29udmVydExvY2F0aW9uVG9VUkkocmVzb3VyY2VMb2NhdGlvbkZpZWxkLmdldFRleHQoKSkpOwotCQkJCWdldEVudHJ5KCkuc2V0U3VmZml4KHN1ZmZpeEZpZWxkLmdldFRleHQoKSk7Ci0JCQkJZ2V0RW50cnkoKS5zZXRFbnRyeVR5cGUoZ2V0S2V5VHlwZSgpKTsKLQkJCQlkYXRhU2F2ZWQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX1dBUk5JTkdfRFVQTElDQVRFX1NVRkZJWDsKLQkJCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSk7Ci0JCQkJdXBkYXRlT0tCdXR0b25TdGF0ZSgpOwotCQkJCWRhdGFTYXZlZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZURhdGEoKSB7Ci0JCQlJU3VmZml4RW50cnkgZW50cnkgPSBnZXRFbnRyeSgpOwotCQkJU3RyaW5nIHVyaSA9IFVSSVV0aWxzLmNvbnZlcnRMb2NhdGlvblRvVVJJKHJlc291cmNlTG9jYXRpb25GaWVsZC5nZXRUZXh0KCkpOwotCQkJaWYoZW50cnkuZ2V0RW50cnlUeXBlKCkgIT0gZ2V0S2V5VHlwZSgpIHx8ICFlbnRyeS5nZXRTdWZmaXgoKS5lcXVhbHMoc3VmZml4RmllbGQuZ2V0VGV4dCgpKSB8fCAhZW50cnkuZ2V0VVJJKCkuZXF1YWxzKHVyaSkpIHsKLQkJCQlJU3VmZml4RW50cnlbXSBlbnRyaWVzID0gY2F0YWxvZy5nZXRTdWZmaXhFbnRyaWVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChlbnRyaWVzW2ldLmdldFN1ZmZpeCgpLmVxdWFscyhzdWZmaXhGaWVsZC5nZXRUZXh0KCkpICYmIGVudHJpZXNbaV0uZ2V0RW50cnlUeXBlKCkgPT0gZ2V0S2V5VHlwZSgpKSByZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkKLQkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlS2V5VHlwZUNvbWJvKGludCB0eXBlKSB7Ci0JCQlrZXlUeXBlQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBDYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlci5nZXRYTUxDYXRhbG9nRmlsZVR5cGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJWE1MQ2F0YWxvZ0ZpbGVUeXBlIHRoZUZpbGVUeXBlID0gKFhNTENhdGFsb2dGaWxlVHlwZSkgaS5uZXh0KCk7Ci0JCQkJaWYgKHRoZUZpbGVUeXBlLmV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGogPSB0aGVGaWxlVHlwZS5leHRlbnNpb25zLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykgewotCQkJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IChTdHJpbmcpIGoubmV4dCgpOwotCQkJCQkJaWYgKHJlc291cmNlTG9jYXRpb25GaWVsZC5nZXRUZXh0KCkuZW5kc1dpdGgoZXh0ZW5zaW9uKSkgewotCQkJCQkJCWlmICgib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnVpLmNhdGFsb2dGaWxlVHlwZS54c2QiLmVxdWFscyh0aGVGaWxlVHlwZS5pZCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlrZXlUeXBlQ29tYm8uYWRkKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9YU0RfUFVCTElDKTsKLQkJCQkJCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fWFNEX1NZU1RFTSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKCJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudWkuY2F0YWxvZ0ZpbGVUeXBlLmR0ZCIuZXF1YWxzKHRoZUZpbGVUeXBlLmlkKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1VSSSk7Ci0JCQkJCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9TWVNURU0pOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fVVJJKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCi0JCQkJCX0KLQkKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoa2V5VHlwZUNvbWJvLmdldEl0ZW1Db3VudCgpID09IDApIHsKLQkJCQlrZXlUeXBlQ29tYm8uYWRkKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9VUkkpOwotCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9TWVNURU0pOwotCQkJfQotCQotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQkJY2FzZSBJU3VmZml4RW50cnkuU1VGRklYX1RZUEVfVVJJOiAvLyBoYW5kbGUgWE1MIFNjaGVtYSwKLQkJCQkJa2V5VHlwZUNvbWJvLnNlbGVjdCgwKTsgLy8gbmFtZXNwYWNlIG5hbWUgYXMgVVJJIGtleQotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSVN1ZmZpeEVudHJ5LlNVRkZJWF9UWVBFX1NZU1RFTSA6Ci0JCQkJCWtleVR5cGVDb21iby5zZWxlY3QoMSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWlmIChrZXlUeXBlQ29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0JCQkJCQlrZXlUeXBlQ29tYm8uc2VsZWN0KDApOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJfQotCQotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXaWRnZXRzKFdpZGdldCB3aWRnZXQpIHsKLQkJCWlmICh3aWRnZXQgIT0ga2V5VHlwZUNvbWJvKSB7Ci0JCQkJdXBkYXRlS2V5VHlwZUNvbWJvKGdldEtleVR5cGUoKSk7Ci0JCQl9Ci0JCQljb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQl1cGRhdGVFcnJvck1lc3NhZ2VMYWJlbChlcnJvck1lc3NhZ2VMYWJlbCk7Ci0JCQl1cGRhdGVPS0J1dHRvblN0YXRlKCk7Ci0JCX0KLQkKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgQ2F0YWxvZ0VsZW1lbnRQYWdlIHsKLQotCQlDb250cm9sIGZDb250cm9sOwotCi0JCXB1YmxpYyBDYXRhbG9nRWxlbWVudFBhZ2UoKSB7Ci0JCQlzdXBlcigpOwotCi0JCX0KLQkJCi0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlZnJlc2goKTsKLQotCQlwdWJsaWMgYWJzdHJhY3QgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCQlyZXR1cm4gZkNvbnRyb2w7Ci0JCX0KLQotCQlwdWJsaWMgYWJzdHJhY3QgSUNhdGFsb2dFbGVtZW50IGdldERhdGEoKTsKLQotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzYXZlRGF0YSgpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBGaWx0ZXJhYmxlU2VsZWN0U2luZ2xlRmlsZURpYWxvZyBleHRlbmRzIFNlbGVjdFNpbmdsZUZpbGVEaWFsb2cgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXByb3RlY3RlZCBDb21ibyBmaWx0ZXJDb250cm9sOwotCi0JCXB1YmxpYyBGaWx0ZXJhYmxlU2VsZWN0U2luZ2xlRmlsZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQkJc3VwZXIocGFyZW50U2hlbGwsIG51bGwsIHRydWUpOwotCQkJc2V0RmlsdGVycyhudWxsKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUFuZE9wZW4oKSB7Ci0JCQl0aGlzLmNyZWF0ZSgpOwotCQkJc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlnZXRTaGVsbCgpLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0ZJTEVfU0VMRUNUSU9OKTsKLQkJCXRoaXMuc2V0VGl0bGUoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1NFTEVDVF9GSUxFKTsKLQkJCXRoaXMuc2V0TWVzc2FnZShYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfQ0hPT1NFX0ZJTEVfVE9fQUREX1RPX0NBVEFMT0cpOwotCQkJb3BlbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY3JlYXRlRmlsdGVyQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1NFTEVDVF9GSUxFX0ZJTFRFUl9DT05UUk9MKTsKLQotCQkJZmlsdGVyQ29udHJvbCA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWZpbHRlckNvbnRyb2wuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCWZpbHRlckNvbnRyb2wuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfVEVYVF9TRUxFQ1RfRklMRV9GSUxURVJfQ09OVFJPTCk7Ci0JCQlmaWx0ZXJDb250cm9sLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfVEVYVF9TRUxFQ1RfRklMRV9GSUxURVJfQ09OVFJPTCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaSA9IENhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyLmdldFhNTENhdGFsb2dGaWxlVHlwZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlYTUxDYXRhbG9nRmlsZVR5cGUgZmlsZVR5cGUgPSAoWE1MQ2F0YWxvZ0ZpbGVUeXBlKSBpLm5leHQoKTsKLQkJCQlpZiAoZmlsZVR5cGUuZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQlmaWx0ZXJDb250cm9sLmFkZChmaWxlVHlwZS5kZXNjcmlwdGlvbik7Ci0JCQkJfQotCQkJfQotCi0JCQlmaWx0ZXJDb250cm9sLnNlbGVjdCgwKTsKLQkJCWZpbHRlckNvbnRyb2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRGaWx0ZXJzKFhNTENhdGFsb2dGaWxlVHlwZSBmaWxlVHlwZSkgewotCQkJaWYgKGZpbGVUeXBlID09IG51bGwpIHsKLQkJCQkvLyBjb21wdXRlIGFsbCB0aGUgc3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9ucwotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBDYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlci5nZXRYTUxDYXRhbG9nRmlsZVR5cGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVhNTENhdGFsb2dGaWxlVHlwZSB0aGVGaWxlVHlwZSA9IChYTUxDYXRhbG9nRmlsZVR5cGUpIGkubmV4dCgpOwotCQkJCQlpZiAodGhlRmlsZVR5cGUuZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCQkJCQlsaXN0LmFkZEFsbCh0aGVGaWxlVHlwZS5leHRlbnNpb25zKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBBbnkgZmlsZXMgYXJlIG5vdyBzdXBwb3J0ZWQgd2l0aCBSZXNvdXJjZSBVUkkKLQkJCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5zZXRGaWx0ZXJFeHRlbnNpb25zKGNyZWF0ZVN0cmluZ0FycmF5KGxpc3QpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChmaWxlVHlwZS5leHRlbnNpb25zICE9IG51bGwpIHsKLQkJCQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcuc2V0RmlsdGVyRXh0ZW5zaW9ucyhjcmVhdGVTdHJpbmdBcnJheShmaWxlVHlwZS5leHRlbnNpb25zKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyB0ZXh0ID0gZmlsdGVyQ29udHJvbC5nZXRUZXh0KCk7Ci0JCQlYTUxDYXRhbG9nRmlsZVR5cGUgZmlsZVR5cGUgPSBnZXRNYXRjaGluZ0ZpbGVUeXBlKHRleHQpOwotCQkJc2V0RmlsdGVycyhmaWxlVHlwZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REZWxlZ2F0ZVBhZ2UgZXh0ZW5kcyBDYXRhbG9nRWxlbWVudFBhZ2UgewotCQotCQkKLQkJcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VXb3Jrc3BhY2VCdXR0b247Ci0JCQotCQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUZpbGVTeXN0ZW1CdXR0b247Ci0JCQotCQlwcm90ZWN0ZWQgVGV4dCBjYXRhbG9nTG9jYXRpb25GaWVsZDsKLQotCQlwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0KLQkJcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCWVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBjYXRhbG9nTG9jYXRpb25GaWVsZC5nZXRUZXh0KCk7Ci0JCQlpZiAoZmlsZU5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCWlmICgoZmlsZU5hbWUuaW5kZXhPZigiLi4iKSAhPSAtMSkgfHwgKGZpbGVOYW1lLmluZGV4T2YoIi4vIikgIT0gLTEpIHx8IChmaWxlTmFtZS5pbmRleE9mKCIvLiIpICE9IC0xKSB8fCAoZmlsZU5hbWUuaW5kZXhPZigiLlxcIikgIT0gLTEpIHx8IChmaWxlTmFtZS5pbmRleE9mKCJcXC4iKSAhPSAtMSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQkJCWVycm9yTWVzc2FnZSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9XQVJOSU5HX1VSSV9NVVNUX05PVF9IQVZFX0RPVFM7Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHVyaSA9IGZpbGVOYW1lOwotCQkJCWlmICghVVJJSGVscGVyLmhhc1Byb3RvY29sKHVyaSkpIHsKLQkJCQkJdXJpID0gVVJJSGVscGVyLmlzQWJzb2x1dGUodXJpKSA/IFVSSUhlbHBlci5wcmVwZW5kRmlsZVByb3RvY29sKHVyaSkgOiBVUklIZWxwZXIucHJlcGVuZFBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbCh1cmkpOwotCQkJCX0KLQotCQkJCWlmICgoZXJyb3JNZXNzYWdlID09IG51bGwpICYmICFVUklIZWxwZXIuaXNSZWFkYWJsZVVSSSh1cmksIGZhbHNlKSkgewotCQkJCQllcnJvck1lc3NhZ2UgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfV0FSTklOR19VUklfTk9UX0ZPVU5EX0NPTE9OICsgZmlsZU5hbWU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdGhpcyBhbiBlcnJvciB0aGF0IGlzIG5vdCBhY3R1YWxseQotCQkJCS8vIHJlcG9ydGVkIC4uLiBPSyBpcyBqdXN0IGRpc2FibGVkCi0JCQkJZXJyb3JNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBhYnN0cmFjdCBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlTmV4dENhdGFsb2dQYW5lbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgY2F0YWxvZ1VyaUxhYmVsKSB7Ci0JCQlNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJdXBkYXRlV2lkZ2V0cyhlLndpZGdldCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCUNvbXBvc2l0ZSBncm91cCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJY3JlYXRlU3BlY2lmaWNGaWVsZHMoZ3JvdXApOwotCQkJCi0JCQlMYWJlbCByZXNvdXJjZUxvY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCXJlc291cmNlTG9jYXRpb25MYWJlbC5zZXRUZXh0KGNhdGFsb2dVcmlMYWJlbCk7Ci0KLQkJCWNhdGFsb2dMb2NhdGlvbkZpZWxkID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCWNhdGFsb2dMb2NhdGlvbkZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJY2F0YWxvZ0xvY2F0aW9uRmllbGQuc2V0VGV4dChVUklVdGlscy5jb252ZXJ0VVJJVG9Mb2NhdGlvbihnZXREaXNwbGF5VmFsdWUoZ2V0Q2F0YWxvZ0xvY2F0aW9uKCkpKSk7Ci0JCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAocmVzb3VyY2VMb2NhdGlvbkZpZWxkLAotCQkJLy8gWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MUF9FTlRSWV9VUkkpOwotCQkJY2F0YWxvZ0xvY2F0aW9uRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJCi0JCQlDb21wb3NpdGUgYnJvd3NlQnV0dG9uc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZ3JvdXAsIFNXVC5GTEFUKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRU5EOwotCQkJYnJvd3NlQnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCQotCQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5tYXJnaW5Cb3R0b20gPSA1OwotCQkJYnJvd3NlQnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCQotCQkJYnJvd3NlV29ya3NwYWNlQnV0dG9uID0gbmV3IEJ1dHRvbihicm93c2VCdXR0b25zQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCQlicm93c2VXb3Jrc3BhY2VCdXR0b24uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfQlVUVE9OX01FTlVfQlJPV1NFX1dPUktTUEFDRSk7Ci0JCQlicm93c2VXb3Jrc3BhY2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJU3RyaW5nIHZhbHVlID0gaW52b2tlV29ya3NwYWNlRmlsZVNlbGVjdGlvbkRpYWxvZygpOwotCQkJCQlpZih2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQljYXRhbG9nTG9jYXRpb25GaWVsZC5zZXRUZXh0KHZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlicm93c2VGaWxlU3lzdGVtQnV0dG9uID0gbmV3IEJ1dHRvbihicm93c2VCdXR0b25zQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCQlicm93c2VGaWxlU3lzdGVtQnV0dG9uLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9NRU5VX0JST1dTRV9GSUxFX1NZU1RFTSk7Ci0JCQlicm93c2VGaWxlU3lzdGVtQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9IGludm9rZUZpbGVTZWxlY3Rpb25EaWFsb2coKTsKLQkJCQkJaWYodmFsdWUgIT0gbnVsbCkgewotCQkJCQkJY2F0YWxvZ0xvY2F0aW9uRmllbGQuc2V0VGV4dCh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJZXJyb3JNZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCWVycm9yTWVzc2FnZUxhYmVsLnNldEZvcmVncm91bmQoY29sb3IpOwotCQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQl1cGRhdGVXaWRnZXRzKG51bGwpOwotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNwZWNpZmljRmllbGRzKENvbXBvc2l0ZSBncm91cCkgewotCQl9Ci0KLQkJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDYXRhbG9nTG9jYXRpb24oKTsKLQotCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXaWRnZXRzKFdpZGdldCB3aWRnZXQpIHsKLQkJCWNvbXB1dGVFcnJvck1lc3NhZ2UoKTsKLQkJCXVwZGF0ZUVycm9yTWVzc2FnZUxhYmVsKGVycm9yTWVzc2FnZUxhYmVsKTsKLQkJCXVwZGF0ZU9LQnV0dG9uU3RhdGUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBOZXh0Q2F0YWxvZ1BhZ2UgZXh0ZW5kcyBBYnN0cmFjdERlbGVnYXRlUGFnZSB7Ci0JCXByb3RlY3RlZCBJTmV4dENhdGFsb2cgbmV4dENhdGFsb2c7Ci0KLQkJcHVibGljIElDYXRhbG9nRWxlbWVudCBnZXREYXRhKCkgewotCQkJcmV0dXJuIGdldE5leHRDYXRhbG9nKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCQljb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQl1cGRhdGVFcnJvck1lc3NhZ2VMYWJlbChlcnJvck1lc3NhZ2VMYWJlbCk7Ci0JCQl1cGRhdGVPS0J1dHRvblN0YXRlKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSU5leHRDYXRhbG9nIGdldE5leHRDYXRhbG9nKCkgewotCQkJaWYgKG5leHRDYXRhbG9nID09IG51bGwpIHsKLQkJCQlpZiAoKGZDYXRhbG9nRWxlbWVudCAhPSBudWxsKSAmJiAoZkNhdGFsb2dFbGVtZW50LmdldFR5cGUoKSA9PSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ORVhUX0NBVEFMT0cpKSB7Ci0JCQkJCW5leHRDYXRhbG9nID0gKElOZXh0Q2F0YWxvZykgZkNhdGFsb2dFbGVtZW50OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkgewotCQkJCQkJbmV4dENhdGFsb2cgPSAoSU5leHRDYXRhbG9nKSBjYXRhbG9nLmNyZWF0ZUNhdGFsb2dFbGVtZW50KElDYXRhbG9nRWxlbWVudC5UWVBFX05FWFRfQ0FUQUxPRyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV4dENhdGFsb2c7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzYXZlRGF0YSgpIHsKLQkJCWdldE5leHRDYXRhbG9nKCkuc2V0Q2F0YWxvZ0xvY2F0aW9uKFVSSVV0aWxzLmNvbnZlcnRMb2NhdGlvblRvVVJJKGNhdGFsb2dMb2NhdGlvbkZpZWxkLmdldFRleHQoKSkpOwotCQkJZGF0YVNhdmVkID0gdHJ1ZTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2F0YWxvZ0xvY2F0aW9uKCkgewotCQkJcmV0dXJuIGdldE5leHRDYXRhbG9nKCkuZ2V0Q2F0YWxvZ0xvY2F0aW9uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJZkNvbnRyb2wgPSBjcmVhdGVOZXh0Q2F0YWxvZ1BhbmVsKHBhcmVudCwgWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0NBVEFMT0dfVVJJX0NPTE9OKTsKLQkJCXJldHVybiBmQ29udHJvbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBEZWxlZ2F0ZUNhdGFsb2dQYWdlIGV4dGVuZHMgQWJzdHJhY3REZWxlZ2F0ZVBhZ2UgewotCQlwcm90ZWN0ZWQgSURlbGVnYXRlQ2F0YWxvZyBkZWxlZ2F0ZUNhdGFsb2c7Ci0JCXByaXZhdGUgVGV4dCBwcmVmaXhGaWVsZDsKLQkJcHJpdmF0ZSBDb21ibyBrZXlUeXBlQ29tYm87Ci0JCQotCQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQkJY29tcHV0ZUVycm9yTWVzc2FnZSgpOwotCQkJdXBkYXRlRXJyb3JNZXNzYWdlTGFiZWwoZXJyb3JNZXNzYWdlTGFiZWwpOwotCQkJdXBkYXRlT0tCdXR0b25TdGF0ZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCWVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCQlTdHJpbmcgcHJlZml4ID0gcHJlZml4RmllbGQuZ2V0VGV4dCgpOwotCQkJaWYocHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJCS8vIGdvb2QKLQkJCX0gZWxzZSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gIiI7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyBJQ2F0YWxvZ0VsZW1lbnQgZ2V0RGF0YSgpIHsKLQkJCXJldHVybiBnZXREZWxlZ2F0ZUNhdGFsb2coKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNwZWNpZmljRmllbGRzKENvbXBvc2l0ZSBncm91cCkgewotCQkJCi0JCQlDb21wb3NpdGUgcHJlZml4Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShncm91cCwgU1dULk5PTkUpOwotCQkJCi0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luQm90dG9tID0gNTsKLQkJCXByZWZpeENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCQotCQkJLy8gS2V5IFR5cGUKLQkJCS8vCi0JCQlMYWJlbCBrZXlUeXBlTGFiZWwgPSBuZXcgTGFiZWwocHJlZml4Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlrZXlUeXBlTGFiZWwuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTUFUQ0hfS0VZX1RZUEVfQ09MT04pOwotCQotCQkJa2V5VHlwZUNvbWJvID0gbmV3IENvbWJvKHByZWZpeENvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCQlrZXlUeXBlQ29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlrZXlUeXBlQ29tYm8uYWRkKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9EVERfUFVCTElDKTsKLQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9TWVNURU0pOwotCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fVVJJKTsKLQkJCXN3aXRjaCAoZ2V0RGVsZWdhdGVDYXRhbG9nKCkuZ2V0RW50cnlUeXBlKCkpIHsKLQkJCWNhc2UgSURlbGVnYXRlQ2F0YWxvZy5ERUxFR0FURV9UWVBFX1BVQkxJQzoKLQkJCQlrZXlUeXBlQ29tYm8uc2VsZWN0KDApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJRGVsZWdhdGVDYXRhbG9nLkRFTEVHQVRFX1RZUEVfU1lTVEVNOgotCQkJCWtleVR5cGVDb21iby5zZWxlY3QoMSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJY2FzZSBJRGVsZWdhdGVDYXRhbG9nLkRFTEVHQVRFX1RZUEVfVVJJOgotCQkJCWtleVR5cGVDb21iby5zZWxlY3QoMik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCUxhYmVsIHByZWZpeExhYmVsID0gbmV3IExhYmVsKHByZWZpeENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJcHJlZml4TGFiZWwuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfU1RBUlRfU1RSSU5HX0NPTE9OKTsKLQotCQkJcHJlZml4RmllbGQgPSBuZXcgVGV4dChwcmVmaXhDb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCXByZWZpeEZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuTk9ORSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXByZWZpeEZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGdldERlbGVnYXRlQ2F0YWxvZygpLmdldFN0YXJ0U3RyaW5nKCkpKTsKLQkJCU1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQl1cGRhdGVXaWRnZXRzKGUud2lkZ2V0KTsKLQkJCQl9Ci0JCQl9OwotCQkJcHJlZml4RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJcHJlZml4Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuTk9ORSwgdHJ1ZSwgZmFsc2UpKTsKLQkJfQotCi0JCXByb3RlY3RlZCBJRGVsZWdhdGVDYXRhbG9nIGdldERlbGVnYXRlQ2F0YWxvZygpIHsKLQkJCWlmIChkZWxlZ2F0ZUNhdGFsb2cgPT0gbnVsbCkgewotCQkJCWlmICgoZkNhdGFsb2dFbGVtZW50ICE9IG51bGwpICYmIChmQ2F0YWxvZ0VsZW1lbnQuZ2V0VHlwZSgpID09IElDYXRhbG9nRWxlbWVudC5UWVBFX0RFTEVHQVRFKSkgewotCQkJCQlkZWxlZ2F0ZUNhdGFsb2cgPSAoSURlbGVnYXRlQ2F0YWxvZykgZkNhdGFsb2dFbGVtZW50OwotCQkJCX0KLQkJCQllbHNlIHsJCi0JCQkJCWlmIChjYXRhbG9nICE9IG51bGwpIHsKLQkJCQkJCWRlbGVnYXRlQ2F0YWxvZyA9IChJRGVsZWdhdGVDYXRhbG9nKSBjYXRhbG9nLmNyZWF0ZUNhdGFsb2dFbGVtZW50KElEZWxlZ2F0ZUNhdGFsb2cuREVMRUdBVEVfVFlQRV9VUkkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGRlbGVnYXRlQ2F0YWxvZzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNhdmVEYXRhKCkgewotCQkJaWYgKHZhbGlkYXRlRGF0YSgpKQotCQkJewotCQkJCWdldERlbGVnYXRlQ2F0YWxvZygpLnNldENhdGFsb2dMb2NhdGlvbihVUklVdGlscy5jb252ZXJ0TG9jYXRpb25Ub1VSSShjYXRhbG9nTG9jYXRpb25GaWVsZC5nZXRUZXh0KCkpKTsKLQkJCQlnZXREZWxlZ2F0ZUNhdGFsb2coKS5zZXRTdGFydFN0cmluZyhwcmVmaXhGaWVsZC5nZXRUZXh0KCkpOwotCQkJCWdldERlbGVnYXRlQ2F0YWxvZygpLnNldEVudHJ5VHlwZShnZXREZWxlZ2F0ZVR5cGUoKSk7Ci0JCQkJZGF0YVNhdmVkID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWVycm9yTWVzc2FnZSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9XQVJOSU5HX0RVUExJQ0FURV9ERUxFR0FURTsKLQkJCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSk7Ci0JCQkJdXBkYXRlT0tCdXR0b25TdGF0ZSgpOwotCQkJCWRhdGFTYXZlZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgZ2V0RGVsZWdhdGVUeXBlKCkgewotCQkJc3dpdGNoIChrZXlUeXBlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkgewotCQkJY2FzZSAwOgotCQkJCXJldHVybiBJRGVsZWdhdGVDYXRhbG9nLkRFTEVHQVRFX1RZUEVfUFVCTElDOwotCi0JCQljYXNlIDE6Ci0JCQkJcmV0dXJuIElEZWxlZ2F0ZUNhdGFsb2cuREVMRUdBVEVfVFlQRV9TWVNURU07Ci0JCQkKLQkJCWNhc2UgMjoJCQkJCi0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBJRGVsZWdhdGVDYXRhbG9nLkRFTEVHQVRFX1RZUEVfVVJJOwotCQkJfQotCQl9Ci0JCi0JCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRGF0YSgpIHsKLQkJCUlEZWxlZ2F0ZUNhdGFsb2cgZW50cnkgPSBnZXREZWxlZ2F0ZUNhdGFsb2coKTsKLQkJCVN0cmluZyBwcmVmaXggPSBwcmVmaXhGaWVsZC5nZXRUZXh0KCk7Ci0JCQlpZihlbnRyeS5nZXRFbnRyeVR5cGUoKSAhPSBnZXREZWxlZ2F0ZVR5cGUoKSB8fCAhcHJlZml4LmVxdWFscyhlbnRyeS5nZXRTdGFydFN0cmluZygpKSkgewotCQkJCUlEZWxlZ2F0ZUNhdGFsb2dbXSBlbnRyaWVzID0gY2F0YWxvZy5nZXREZWxlZ2F0ZUNhdGFsb2dzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChlbnRyaWVzW2ldLmdldFN0YXJ0U3RyaW5nKCkuZXF1YWxzKHByZWZpeEZpZWxkKSAmJiBlbnRyaWVzW2ldLmdldEVudHJ5VHlwZSgpID09IGdldERlbGVnYXRlVHlwZSgpKSByZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENhdGFsb2dMb2NhdGlvbigpIHsKLQkJCXJldHVybiBnZXREZWxlZ2F0ZUNhdGFsb2coKS5nZXRDYXRhbG9nTG9jYXRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJZkNvbnRyb2wgPSBjcmVhdGVOZXh0Q2F0YWxvZ1BhbmVsKHBhcmVudCwgWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0RFTEVHQVRFX0NBVEFMT0dfVVJJX0NPTE9OKTsKLQkJCXJldHVybiBmQ29udHJvbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBSYWRpb0l0ZW1TZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJT2JqZWN0IHNlbGVjdGlvbiA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgQnV0dG9uKSB7Ci0JCQkJQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIHNlbGVjdGlvbjsKLQkJCQlpZiAoYnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCWlmICghc2hvd1BhZ2UoKENhdGFsb2dFbGVtZW50UGFnZSkgYnV0dG9uLmdldERhdGEoKSkpIHsKLQkJCQkJCS8vIFBhZ2UgZmxpcHBpbmcgd2Fzbid0IHN1Y2Nlc3NmdWwKLQkJCQkJCS8vIGhhbmRsZUVycm9yKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBSZXdyaXRlRW50cnlQYWdlIGV4dGVuZHMgQ2F0YWxvZ0VsZW1lbnRQYWdlIHsKLQkJcHJvdGVjdGVkIElSZXdyaXRlRW50cnkgcmV3cml0ZUVudHJ5OwotCQlwcml2YXRlIFRleHQgc3RhcnRTdHJpbmdGaWVsZDsKLQkJcHJpdmF0ZSBUZXh0IHByZWZpeEZpZWxkOwotCQlwcml2YXRlIENvbWJvIGtleVR5cGVDb21ibzsKLQkJCi0JCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCQljb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQl1cGRhdGVFcnJvck1lc3NhZ2VMYWJlbChlcnJvck1lc3NhZ2VMYWJlbCk7Ci0JCQl1cGRhdGVPS0J1dHRvblN0YXRlKCk7Ci0JCX0KLQkKLQkJcHVibGljIElDYXRhbG9nRWxlbWVudCBnZXREYXRhKCkgewotCQkJcmV0dXJuIGdldFJld3JpdGVFbnRyeSgpOwotCQl9Ci0JCi0JCXByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLQotCQlwcm90ZWN0ZWQgdm9pZCBjb21wdXRlRXJyb3JNZXNzYWdlKCkgewotCQkJZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJCQotCQkJU3RyaW5nIHN0YXJ0ID0gc3RhcnRTdHJpbmdGaWVsZC5nZXRUZXh0KCk7Ci0JCQlTdHJpbmcgcHJlZml4ID0gcHJlZml4RmllbGQuZ2V0VGV4dCgpOwotCQkJaWYgKHN0YXJ0LnRyaW0oKS5sZW5ndGgoKSA+IDAgJiYgcHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkvLyBnb29kCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB0aGlzIGFuIGVycm9yIHRoYXQgaXMgbm90IGFjdHVhbGx5Ci0JCQkJLy8gcmVwb3J0ZWQgLi4uIE9LIGlzIGp1c3QgZGlzYWJsZWQKLQkJCQllcnJvck1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIElSZXdyaXRlRW50cnkgZ2V0UmV3cml0ZUVudHJ5KCkgewotCQkJaWYgKHJld3JpdGVFbnRyeSA9PSBudWxsKSB7Ci0JCQkJaWYgKChmQ2F0YWxvZ0VsZW1lbnQgIT0gbnVsbCkgJiYgKGZDYXRhbG9nRWxlbWVudC5nZXRUeXBlKCkgPT0gSUNhdGFsb2dFbGVtZW50LlRZUEVfUkVXUklURSkpIHsKLQkJCQkJcmV3cml0ZUVudHJ5ID0gKElSZXdyaXRlRW50cnkpIGZDYXRhbG9nRWxlbWVudDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChjYXRhbG9nICE9IG51bGwpIHsKLQkJCQkJCXJld3JpdGVFbnRyeSA9IChJUmV3cml0ZUVudHJ5KSBjYXRhbG9nLmNyZWF0ZUNhdGFsb2dFbGVtZW50KElSZXdyaXRlRW50cnkuUkVXUklURV9UWVBFX1NZU1RFTSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmV3cml0ZUVudHJ5OwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2lkZ2V0cyhXaWRnZXQgd2lkZ2V0KSB7Ci0JCQljb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQl1cGRhdGVFcnJvck1lc3NhZ2VMYWJlbChlcnJvck1lc3NhZ2VMYWJlbCk7Ci0JCQl1cGRhdGVPS0J1dHRvblN0YXRlKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2F2ZURhdGEoKSB7Ci0JCQlpZiAodmFsaWRhdGVEYXRhKCkpIHsKLQkJCQlnZXRSZXdyaXRlRW50cnkoKS5zZXRSZXdyaXRlUHJlZml4KHByZWZpeEZpZWxkLmdldFRleHQoKSk7Ci0JCQkJZ2V0UmV3cml0ZUVudHJ5KCkuc2V0U3RhcnRTdHJpbmcoc3RhcnRTdHJpbmdGaWVsZC5nZXRUZXh0KCkpOwotCQkJCWdldFJld3JpdGVFbnRyeSgpLnNldEVudHJ5VHlwZShnZXRFbnRyeVR5cGUoKSk7Ci0JCQkJZGF0YVNhdmVkID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWVycm9yTWVzc2FnZSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9XQVJOSU5HX0RVUExJQ0FURV9SRVdSSVRFOwotCQkJCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoZXJyb3JNZXNzYWdlKTsKLQkJCQl1cGRhdGVPS0J1dHRvblN0YXRlKCk7Ci0JCQkJZGF0YVNhdmVkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGludCBnZXRFbnRyeVR5cGUoKSB7Ci0JCQlzd2l0Y2ggKGtleVR5cGVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKSB7Ci0JCQljYXNlIDA6Ci0JCQkJcmV0dXJuIElSZXdyaXRlRW50cnkuUkVXUklURV9UWVBFX1NZU1RFTTsKLQkJCWNhc2UgMToKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIElSZXdyaXRlRW50cnkuUkVXUklURV9UWVBFX1VSSTsKLQkJCX0KLQkJfQotCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVEYXRhKCkgewotCQkJSVJld3JpdGVFbnRyeSBlbnRyeSA9IGdldFJld3JpdGVFbnRyeSgpOwotCQkJU3RyaW5nIHN0YXJ0U3RyaW5nID0gc3RhcnRTdHJpbmdGaWVsZC5nZXRUZXh0KCk7Ci0JCQlpZihlbnRyeS5nZXRFbnRyeVR5cGUoKSAhPSBnZXRFbnRyeVR5cGUoKSB8fCAhZW50cnkuZ2V0U3RhcnRTdHJpbmcoKS5lcXVhbHMoc3RhcnRTdHJpbmcpKSB7Ci0JCQkJSVJld3JpdGVFbnRyeVtdIGVudHJpZXMgPSBjYXRhbG9nLmdldFJld3JpdGVFbnRyaWVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChlbnRyaWVzW2ldLmdldFN0YXJ0U3RyaW5nKCkuZXF1YWxzKHN0YXJ0U3RyaW5nKSAmJiBlbnRyaWVzW2ldLmdldEVudHJ5VHlwZSgpID09IGdldEVudHJ5VHlwZSgpKSByZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCQotCQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkKLQkJCWZDb250cm9sID0gY3JlYXRlUmV3cml0ZUVudHJ5UGFuZWwocGFyZW50KTsKLQkKLQkJCXJldHVybiBmQ29udHJvbDsKLQkJfQotCQotCQlwdWJsaWMgQ29udHJvbCBjcmVhdGVSZXdyaXRlRW50cnlQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJdXBkYXRlV2lkZ2V0cyhlLndpZGdldCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCUNvbXBvc2l0ZSBncm91cCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCQkKLQkJCUNvbXBvc2l0ZSBwcmVmaXhDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQkKLQkJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luQm90dG9tID0gNTsKLQkJCXByZWZpeENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCQotCQkJLy8gS2V5IFR5cGUKLQkJCS8vCi0JCQlMYWJlbCBrZXlUeXBlTGFiZWwgPSBuZXcgTGFiZWwocHJlZml4Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlrZXlUeXBlTGFiZWwuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTUFUQ0hfS0VZX1RZUEVfQ09MT04pOwotCQotCQkJa2V5VHlwZUNvbWJvID0gbmV3IENvbWJvKHByZWZpeENvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCQlrZXlUeXBlQ29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlrZXlUeXBlQ29tYm8uYWRkKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9EVERfU1lTVEVNKTsKLQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1VSSSk7Ci0JCQlzd2l0Y2ggKGdldFJld3JpdGVFbnRyeSgpLmdldEVudHJ5VHlwZSgpKSB7Ci0JCQljYXNlIElEZWxlZ2F0ZUNhdGFsb2cuREVMRUdBVEVfVFlQRV9TWVNURU06Ci0JCQkJa2V5VHlwZUNvbWJvLnNlbGVjdCgwKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQljYXNlIElEZWxlZ2F0ZUNhdGFsb2cuREVMRUdBVEVfVFlQRV9VUkk6Ci0JCQkJa2V5VHlwZUNvbWJvLnNlbGVjdCgxKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCUxhYmVsIHN0YXJ0U3RyaW5nTGFiZWwgPSBuZXcgTGFiZWwocHJlZml4Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlzdGFydFN0cmluZ0xhYmVsLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1NUQVJUX1NUUklOR19DT0xPTik7Ci0JCi0JCQlzdGFydFN0cmluZ0ZpZWxkID0gbmV3IFRleHQocHJlZml4Q29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlzdGFydFN0cmluZ0ZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuTk9ORSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXN0YXJ0U3RyaW5nRmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoZ2V0UmV3cml0ZUVudHJ5KCkuZ2V0U3RhcnRTdHJpbmcoKSkpOwotCQkJc3RhcnRTdHJpbmdGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCUxhYmVsIHByZWZpeExhYmVsID0gbmV3IExhYmVsKHByZWZpeENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJcHJlZml4TGFiZWwuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfUkVXUklURV9QUkVGSVhfQ09MT04pOwotCQotCQkJcHJlZml4RmllbGQgPSBuZXcgVGV4dChwcmVmaXhDb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCXByZWZpeEZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuTk9ORSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXByZWZpeEZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGdldFJld3JpdGVFbnRyeSgpLmdldFJld3JpdGVQcmVmaXgoKSkpOwotCQkJcHJlZml4RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQotCQkJcHJlZml4Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuTk9ORSwgdHJ1ZSwgZmFsc2UpKTsKLQotCQkJZXJyb3JNZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCWVycm9yTWVzc2FnZUxhYmVsLnNldEZvcmVncm91bmQoY29sb3IpOwotCQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQl1cGRhdGVXaWRnZXRzKG51bGwpOwotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBUb29sQmFySXRlbVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlPYmplY3Qgc2VsZWN0aW9uID0gZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBUb29sSXRlbSkgewotCQkJCVRvb2xJdGVtIHRvb2xJdGVtID0gKFRvb2xJdGVtKXNlbGVjdGlvbjsKLQkJCQlUb29sQmFyIHRvb2xiYXIgPSB0b29sSXRlbS5nZXRQYXJlbnQoKTsKLQkJCQlpZih0b29sYmFyICE9IG51bGwpIHsKLQkJCQkJVG9vbEl0ZW1bXSBpdGVtcyA9IHRvb2xiYXIuZ2V0SXRlbXMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaXRlbXNbaV0uc2V0U2VsZWN0aW9uKGl0ZW1zW2ldID09IHRvb2xJdGVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXNob3dQYWdlKChDYXRhbG9nRWxlbWVudFBhZ2UpIHRvb2xJdGVtLmdldERhdGEoKSkpIHsKLQkJCQkJLy8gUGFnZSBmbGlwcGluZyB3YXNuJ3Qgc3VjY2Vzc2Z1bAotCQkJCQkvLyBoYW5kbGVFcnJvcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGNyZWF0ZVN0cmluZ0FycmF5KExpc3QgbGlzdCkgewotCQlTdHJpbmdbXSBzdHJpbmdBcnJheSA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlzdHJpbmdBcnJheVtpXSA9IChTdHJpbmcpIGxpc3QuZ2V0KGkpOwotCQl9Ci0JCXJldHVybiBzdHJpbmdBcnJheTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVMZWFkaW5nU2xhc2goU3RyaW5nIHVyaSkgewotCQkvLyByZW1vdmUgbGVhZGluZyBzbGFzaCBmcm9tIHRoZSB2YWx1ZSB0byBhdm9pZCB0aGUgd2hvbGUgbGVhZGluZwotCQkvLyBzbGFzaAotCQkvLyBhbWJpZ3VpdHkgcHJvYmxlbQotCQkvLyAgICAgICAKLQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQl3aGlsZSAodXJpLnN0YXJ0c1dpdGgoIi8iKSB8fCB1cmkuc3RhcnRzV2l0aCgiXFwiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl1cmkgPSB1cmkuc3Vic3RyaW5nKDEpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JcHJvdGVjdGVkIElDYXRhbG9nIGNhdGFsb2c7Ci0KLQlwcm90ZWN0ZWQgSUNhdGFsb2dFbGVtZW50IGZDYXRhbG9nRWxlbWVudDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZXJyb3JNZXNzYWdlOwotCi0JcHJvdGVjdGVkIFN0cmluZyB3YXJuaW5nTWVzc2FnZTsKLQotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0KLQlwcm90ZWN0ZWQgUGFnZUJvb2sgcGFnZUNvbnRhaW5lcjsKLQotCXByb3RlY3RlZCBDYXRhbG9nRWxlbWVudFBhZ2Ugc2VsZWN0ZWRQYWdlOwotCi0JLy8gcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQkKLQlwcm90ZWN0ZWQgVG9vbEJhciB0b29sQmFyOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBlbGVtZW50VHlwZUNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb2xvciBjb2xvcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkYXRhU2F2ZWQ7Ci0KLQlwdWJsaWMgRWRpdENhdGFsb2dFbnRyeURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSUNhdGFsb2cgYUNhdGFsb2cpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl0aGlzLmNhdGFsb2cgPSBhQ2F0YWxvZzsKLQl9Ci0KLQlwdWJsaWMgRWRpdENhdGFsb2dFbnRyeURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSUNhdGFsb2dFbGVtZW50IGNhdGFsb2dFbGVtZW50LCBJQ2F0YWxvZyBhQ2F0YWxvZykgewotCQl0aGlzKHBhcmVudFNoZWxsLCBhQ2F0YWxvZyk7Ci0JCXRoaXMuZkNhdGFsb2dFbGVtZW50ID0gY2F0YWxvZ0VsZW1lbnQ7Ci0JCS8vIFRPRE8gRUI6IGZpeCBoaXMKLQkJLy8gZW50cnkuc2V0VVJJKFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woZW50cnkuZ2V0VVJJKCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJc2VsZWN0ZWRQYWdlLnNhdmVEYXRhKCk7Ci0JCQlpZiAoIWRhdGFTYXZlZCkgewkJCQkKLQkJCQkvLyBkbyBub3QgZXhpdCBlZGl0IGRpYWxvZwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQkJdXBkYXRlT0tCdXR0b25TdGF0ZSgpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQljb2xvciA9IG5ldyBDb2xvcihkaWFsb2dBcmVhQ29tcG9zaXRlLmdldERpc3BsYXkoKSwgMjAwLCAwLCAwKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZGlhbG9nQXJlYUNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2Qud2lkdGhIaW50ID0gNTUwOwotCQkvL2dkLmhlaWdodEhpbnQgPSAyNTA7Ci0JCWRpYWxvZ0FyZWFDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWNyZWF0ZU1haW5Db21wb25lbnQoZGlhbG9nQXJlYUNvbXBvc2l0ZSk7Ci0JCXJldHVybiB0aGlzLmRpYWxvZ0FyZWE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCWlmIChjb2xvciAhPSBudWxsKSB7Ci0JCQljb2xvci5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVNYWluQ29tcG9uZW50KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaWYgKGZDYXRhbG9nRWxlbWVudCAhPSBudWxsKSAvLyAiZWRpdCIgYWN0aW9uCi0JCXsKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUxID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWNvbXBvc2l0ZTEuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWNvbXBvc2l0ZTEuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCXBhZ2VDb250YWluZXIgPSBuZXcgUGFnZUJvb2soY29tcG9zaXRlMSwgU1dULk5PTkUpOwotCQkJcGFnZUNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkJaWYgKGZDYXRhbG9nRWxlbWVudC5nZXRUeXBlKCkgPT0gSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlkpIHsKLQkJCQlDYXRhbG9nRWxlbWVudFBhZ2UgZW50cnlQYWdlID0gbmV3IENhdGFsb2dFbnRyeVBhZ2UoKTsKLQkJCQllbnRyeVBhZ2UuY3JlYXRlQ29udHJvbChwYWdlQ29udGFpbmVyKTsKLQkJCQlzaG93UGFnZShlbnRyeVBhZ2UpOwotCQkJfQotCQkJZWxzZSBpZiAoZkNhdGFsb2dFbGVtZW50LmdldFR5cGUoKSA9PSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ORVhUX0NBVEFMT0cpIHsKLQkJCQlDYXRhbG9nRWxlbWVudFBhZ2UgbmV4dENhdGFsb2dQYWdlID0gbmV3IE5leHRDYXRhbG9nUGFnZSgpOwotCQkJCW5leHRDYXRhbG9nUGFnZS5jcmVhdGVDb250cm9sKHBhZ2VDb250YWluZXIpOwotCQkJCXNob3dQYWdlKG5leHRDYXRhbG9nUGFnZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChmQ2F0YWxvZ0VsZW1lbnQuZ2V0VHlwZSgpID09IElDYXRhbG9nRWxlbWVudC5UWVBFX0RFTEVHQVRFKSB7Ci0JCQkJRGVsZWdhdGVDYXRhbG9nUGFnZSBkZWxlZ2F0ZUNhdGFsb2dQYWdlID0gbmV3IERlbGVnYXRlQ2F0YWxvZ1BhZ2UoKTsKLQkJCQlkZWxlZ2F0ZUNhdGFsb2dQYWdlLmNyZWF0ZUNvbnRyb2wocGFnZUNvbnRhaW5lcik7Ci0JCQkJc2hvd1BhZ2UoZGVsZWdhdGVDYXRhbG9nUGFnZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChmQ2F0YWxvZ0VsZW1lbnQuZ2V0VHlwZSgpID09IElDYXRhbG9nRWxlbWVudC5UWVBFX1NVRkZJWCkgewotCQkJCVN1ZmZpeEVudHJ5UGFnZSBzdWZmaXhFbnRyeVBhZ2UgPSBuZXcgU3VmZml4RW50cnlQYWdlKCk7Ci0JCQkJc3VmZml4RW50cnlQYWdlLmNyZWF0ZUNvbnRyb2wocGFnZUNvbnRhaW5lcik7Ci0JCQkJc2hvd1BhZ2Uoc3VmZml4RW50cnlQYWdlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZDYXRhbG9nRWxlbWVudC5nZXRUeXBlKCkgPT0gSUNhdGFsb2dFbGVtZW50LlRZUEVfUkVXUklURSkgewotCQkJCVJld3JpdGVFbnRyeVBhZ2UgcmV3cml0ZUVudHJ5UGFnZSA9IG5ldyBSZXdyaXRlRW50cnlQYWdlKCk7Ci0JCQkJcmV3cml0ZUVudHJ5UGFnZS5jcmVhdGVDb250cm9sKHBhZ2VDb250YWluZXIpOwotCQkJCXNob3dQYWdlKHJld3JpdGVFbnRyeVBhZ2UpOwotCQkJfQotCi0JCQlyZXR1cm4gY29tcG9zaXRlMTsKLQkJfQotCQlyZXR1cm4gY3JlYXRlTWFpbkNvbXBvbmVudFdpdGhUb29sYmFyKGNvbXBvc2l0ZSk7Ci0KLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZU1haW5Db21wb25lbnRXaXRoVG9vbGJhcihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0KLQkJRm9ybUxheW91dCBmb3JtTGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKLQkJZm9ybUxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCQlmb3JtTGF5b3V0Lm1hcmdpbldpZHRoID0gNTsKLQkJY29tcG9zaXRlLnNldExheW91dChmb3JtTGF5b3V0KTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJdG9vbEJhciA9IG5ldyBUb29sQmFyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5GTEFUIHwgU1dULlZFUlRJQ0FMKTsKLQkJCi0KLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChsYWJlbCwgMCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJLy8gZGF0YS5oZWlnaHQgPSAyNTA7Ci0JCS8vIGRhdGEud2lkdGggPSA1MDsKLQkJdG9vbEJhci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUxID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGxhYmVsLCAwKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHRvb2xCYXIsIDAsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQljb21wb3NpdGUxLnNldExheW91dERhdGEoZGF0YSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZTEuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gY3JlYXRlUGFnZUJvb2tQYW5lbChjb21wb3NpdGUxKTsKLQkJcGFnZUNvbnRhaW5lciA9IG5ldyBQYWdlQm9vayhjb21wb3NpdGUxLCBTV1QuTk9ORSk7Ci0JCXBhZ2VDb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gYWRkIHBhZ2VzIGZvciBlYWNoIHR5cGUgb2YgY2F0YWxvZyBlbGVtZW50Ci0JCWNyZWF0ZUNhdGFsb2dFbnRyeUJ1dHRvbigpOwotCQljcmVhdGVSZXdyaXRlQnV0dG9uKCk7Ci0JCWNyZWF0ZVN1ZmZpeENhdGFsb2dCdXR0b24oKTsKLQkJY3JlYXRlTmV4dENhdGFsb2dCdXR0b24oKTsKLQkJY3JlYXRlRGVsZWdhdGVDYXRhbG9nQnV0dG9uKCk7Ci0JCWlmICh0b29sQmFyLmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJVG9vbEl0ZW0gaXRlbSA9IHRvb2xCYXIuZ2V0SXRlbSgwKTsKLQkJCXNob3dQYWdlKChDYXRhbG9nRWxlbWVudFBhZ2UpIChpdGVtLmdldERhdGEoKSkpOwotCQl9Ci0JCXJldHVybiBjb21wb3NpdGUxOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDYXRhbG9nRW50cnlCdXR0b24oKSB7Ci0JCUNhdGFsb2dFbGVtZW50UGFnZSBwYWdlID0gbmV3IENhdGFsb2dFbnRyeVBhZ2UoKTsKLQkJcGFnZS5jcmVhdGVDb250cm9sKHBhZ2VDb250YWluZXIpOwotCQlUb29sSXRlbSB0b29sSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuQ0hFQ0spOwotCQl0b29sSXRlbS5zZXRJbWFnZShjYXRhbG9nRW50cnlUb29sQmFySW1hZ2UpOwotCQl0b29sSXRlbS5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nX2NhdGFsb2dFbnRyeUxhYmVsKTsKLQkJdG9vbEl0ZW0uc2V0RGF0YShwYWdlKTsKLQkJdG9vbEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFRvb2xCYXJJdGVtU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRvb2xJdGVtLnNldFNlbGVjdGlvbih0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVOZXh0Q2F0YWxvZ0J1dHRvbigpIHsKLQkJQ2F0YWxvZ0VsZW1lbnRQYWdlIHBhZ2UgPSBuZXcgTmV4dENhdGFsb2dQYWdlKCk7Ci0JCXBhZ2UuY3JlYXRlQ29udHJvbChwYWdlQ29udGFpbmVyKTsKLQkJVG9vbEl0ZW0gdG9vbEl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULkNIRUNLKTsKLQkJdG9vbEl0ZW0uc2V0SW1hZ2UobmV4dENhdGFsb2dUb29sQmFySW1hZ2UpOwotCQl0b29sSXRlbS5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nX25leHRDYXRhbG9nTGFiZWwpOwotCQl0b29sSXRlbS5zZXREYXRhKHBhZ2UpOwotCQl0b29sSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgVG9vbEJhckl0ZW1TZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpKTsKLQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZXdyaXRlQnV0dG9uKCkgewotCQlDYXRhbG9nRWxlbWVudFBhZ2UgcGFnZSA9IG5ldyBSZXdyaXRlRW50cnlQYWdlKCk7Ci0JCXBhZ2UuY3JlYXRlQ29udHJvbChwYWdlQ29udGFpbmVyKTsKLQkJVG9vbEl0ZW0gdG9vbEl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULkNIRUNLKTsKLQkJdG9vbEl0ZW0uc2V0SW1hZ2UocmV3cml0ZVRvb2xCYXJJbWFnZSk7Ci0JCXRvb2xJdGVtLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLkVkaXRDYXRhbG9nRW50cnlEaWFsb2dfcmV3cml0ZUVudHJ5TGFiZWwpOwotCQl0b29sSXRlbS5zZXREYXRhKHBhZ2UpOwotCQl0b29sSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgVG9vbEJhckl0ZW1TZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVsZWdhdGVDYXRhbG9nQnV0dG9uKCkgewotCQlDYXRhbG9nRWxlbWVudFBhZ2UgcGFnZSA9IG5ldyBEZWxlZ2F0ZUNhdGFsb2dQYWdlKCk7Ci0JCXBhZ2UuY3JlYXRlQ29udHJvbChwYWdlQ29udGFpbmVyKTsKLQkJVG9vbEl0ZW0gdG9vbEl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULkNIRUNLKTsKLQkJdG9vbEl0ZW0uc2V0SW1hZ2UoZGVsZWdhdGVDYXRhbG9nVG9vbEJhckltYWdlKTsKLQkJdG9vbEl0ZW0uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuRWRpdENhdGFsb2dFbnRyeURpYWxvZ19kZWxlZ2F0ZUNhdGFsb2dMYWJlbCk7Ci0JCXRvb2xJdGVtLnNldERhdGEocGFnZSk7Ci0JCXRvb2xJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBUb29sQmFySXRlbVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTdWZmaXhDYXRhbG9nQnV0dG9uKCkgewotCQlDYXRhbG9nRWxlbWVudFBhZ2UgcGFnZSA9IG5ldyBTdWZmaXhFbnRyeVBhZ2UoKTsKLQkJcGFnZS5jcmVhdGVDb250cm9sKHBhZ2VDb250YWluZXIpOwotCQlUb29sSXRlbSB0b29sSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuQ0hFQ0spOwotCQl0b29sSXRlbS5zZXRJbWFnZShzdWZmaXhUb29sQmFySW1hZ2UpOwotCQl0b29sSXRlbS5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nX3N1ZmZpeEVudHJ5TGFiZWwpOwotCQl0b29sSXRlbS5zZXREYXRhKHBhZ2UpOwotCQl0b29sSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgVG9vbEJhckl0ZW1TZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpKTsKLQl9Ci0JCi0JCi0JCi0JCi0JCi0JCi0vLwotLy8JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmV3cml0ZUVudHJ5QnV0dG9uKCkgewotLy8JCUNhdGFsb2dFbGVtZW50UGFnZSBwYWdlID0gbmV3IFJld3JpdGVFbnRyeVBhZ2UoKTsKLS8vCQlwYWdlLmNyZWF0ZUNvbnRyb2wocGFnZUNvbnRhaW5lcik7Ci0vLwkJQnV0dG9uIHJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihlbGVtZW50VHlwZUNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLS8vCQlyYWRpb0J1dHRvbi5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nX3Jld3JpdGVFbnRyeUxhYmVsKTsKLS8vCQlyYWRpb0J1dHRvbi5zZXREYXRhKHBhZ2UpOwotLy8JCXJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBSYWRpb0l0ZW1TZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpKTsKLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTdWZmaXhFbnRyeUJ1dHRvbigpIHsKLS8vCQlDYXRhbG9nRWxlbWVudFBhZ2UgcGFnZSA9IG5ldyBTdWZmaXhFbnRyeVBhZ2UoKTsKLS8vCQlwYWdlLmNyZWF0ZUNvbnRyb2wocGFnZUNvbnRhaW5lcik7Ci0vLwkJQnV0dG9uIHJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihlbGVtZW50VHlwZUNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLS8vCQlyYWRpb0J1dHRvbi5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nX3N1ZmZpeEVudHJ5TGFiZWwpOwotLy8JCXJhZGlvQnV0dG9uLnNldERhdGEocGFnZSk7Ci0vLwkJcmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFJhZGlvSXRlbVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkpOwotLy8JfQotLy8KLS8vCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlbGVnYXRlQ2F0YWxvZ0J1dHRvbigpIHsKLS8vCQlDYXRhbG9nRWxlbWVudFBhZ2UgcGFnZSA9IG5ldyBEZWxlZ2F0ZUNhdGFsb2dQYWdlKCk7Ci0vLwkJcGFnZS5jcmVhdGVDb250cm9sKHBhZ2VDb250YWluZXIpOwotLy8JCUJ1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24oZWxlbWVudFR5cGVDb21wb3NpdGUsIFNXVC5SQURJTyk7Ci0vLwkJcmFkaW9CdXR0b24uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuRWRpdENhdGFsb2dFbnRyeURpYWxvZ19kZWxlZ2F0ZUNhdGFsb2dMYWJlbCk7Ci0vLwkJcmFkaW9CdXR0b24uc2V0RGF0YShwYWdlKTsKLS8vCQlyYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgUmFkaW9JdGVtU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSk7Ci0vLwotLy8JfQotCi0JcHJvdGVjdGVkIElDYXRhbG9nRWxlbWVudCBnZXRDYXRhbG9nRWxlbWVudCgpIHsKLQkJcmV0dXJuIGZDYXRhbG9nRWxlbWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpc3BsYXlWYWx1ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmcgIT0gbnVsbCA/IHN0cmluZyA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFhNTENhdGFsb2dGaWxlVHlwZSBnZXRNYXRjaGluZ0ZpbGVUeXBlKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlYTUxDYXRhbG9nRmlsZVR5cGUgZmlsZVR5cGUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBDYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlci5nZXRYTUxDYXRhbG9nRmlsZVR5cGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlYTUxDYXRhbG9nRmlsZVR5cGUgdGhlRmlsZVR5cGUgPSAoWE1MQ2F0YWxvZ0ZpbGVUeXBlKSBpLm5leHQoKTsKLQkJCWlmICgodGhlRmlsZVR5cGUuZGVzY3JpcHRpb24gIT0gbnVsbCkgJiYgdGhlRmlsZVR5cGUuZGVzY3JpcHRpb24uZXF1YWxzKGRlc2NyaXB0aW9uKSkgewotCQkJCWZpbGVUeXBlID0gdGhlRmlsZVR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGVUeXBlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3dQYWdlKENhdGFsb2dFbGVtZW50UGFnZSBwYWdlKSB7Ci0JCWlmIChwYWdlQ29udGFpbmVyLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXNlbGVjdGVkUGFnZSA9IHBhZ2U7Ci0JCXBhZ2VDb250YWluZXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJcGFnZUNvbnRhaW5lci5zaG93UGFnZShzZWxlY3RlZFBhZ2UuZ2V0Q29udHJvbCgpKTsKLQkJZkNhdGFsb2dFbGVtZW50ID0gc2VsZWN0ZWRQYWdlLmdldERhdGEoKTsKLQkJc2VsZWN0ZWRQYWdlLnJlZnJlc2goKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlTGFiZWwoTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWwpIHsKLQkJaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSk7Ci0JCX0KLQkJZWxzZSBpZiAod2FybmluZ01lc3NhZ2UgIT0gbnVsbCkgewotCQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dCh3YXJuaW5nTWVzc2FnZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KCIiKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU9LQnV0dG9uU3RhdGUoKSB7Ci0JCWlmIChva0J1dHRvbiAhPSBudWxsKSB7Ci0JCQlva0J1dHRvbi5zZXRFbmFibGVkKGVycm9yTWVzc2FnZSA9PSBudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlQnJvd3NlQnV0dG9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCS8vIGJyb3dzZUJ1dHRvbi5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy4KLQkJLy8gVUlfQlVUVE9OX0JST1dTRSIpKTsKLQkJYnJvd3NlQnV0dG9uLnNldEltYWdlKGJvcndzZUltYWdlKTsKLQkJUmVjdGFuZ2xlIHIgPSBib3J3c2VJbWFnZS5nZXRCb3VuZHMoKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJaW50IElNQUdFX1dJRFRIX01BUkdJTiA9IDY7Ci0JCWludCBJTUFHRV9IRUlHSFRfTUFSR0lOID0gNjsKLQkJZ2QuaGVpZ2h0SGludCA9IHIuaGVpZ2h0ICsgSU1BR0VfSEVJR0hUX01BUkdJTjsKLQkJZ2Qud2lkdGhIaW50ID0gci53aWR0aCArIElNQUdFX1dJRFRIX01BUkdJTjsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCi0JCXJldHVybiBicm93c2VCdXR0b247Ci0KLQl9Ci0JCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVXb3Jrc3BhY2VCcm93c2VCdXR0b24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlCdXR0b24gYnJvd3NlV29ya3NwYWNlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJYnJvd3NlV29ya3NwYWNlQnV0dG9uLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9NRU5VX0JST1dTRV9XT1JLU1BBQ0UpOwotCQlyZXR1cm4gYnJvd3NlV29ya3NwYWNlQnV0dG9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUZpbGVTeXN0ZW1Ccm93c2VCdXR0b24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlCdXR0b24gYnJvd3NlRmlsZVN5c3RlbUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUZpbGVTeXN0ZW1CdXR0b24uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfQlVUVE9OX01FTlVfQlJPV1NFX1dPUktTUEFDRSk7Ci0JCXJldHVybiBicm93c2VGaWxlU3lzdGVtQnV0dG9uOwotCX0KLQotCQotCVN0cmluZyBpbnZva2VXb3Jrc3BhY2VGaWxlU2VsZWN0aW9uRGlhbG9nKCkgewotCQlGaWx0ZXJhYmxlU2VsZWN0U2luZ2xlRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsdGVyYWJsZVNlbGVjdFNpbmdsZUZpbGVEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCWRpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0JCUlGaWxlIGZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotCQlTdHJpbmcgdXJpID0gbnVsbDsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJLy8gcmVtb3ZlIGxlYWRpbmcgc2xhc2ggZnJvbSB0aGUgdmFsdWUgdG8gYXZvaWQgdGhlCi0JCQkvLyB3aG9sZSBsZWFkaW5nIHNsYXNoIGFtYmlndWl0eSBwcm9ibGVtCi0JCQkvLyAgICAgICAgICAgICAgICAgICAgCi0JCQl1cmkgPSBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCXdoaWxlICh1cmkuc3RhcnRzV2l0aCgiLyIpIHx8IHVyaS5zdGFydHNXaXRoKCJcXCIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXVyaSA9IHVyaS5zdWJzdHJpbmcoMSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQlTdHJpbmcgaW52b2tlRmlsZVNlbGVjdGlvbkRpYWxvZygpIHsKLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhnZXRTaGVsbCgpLCBTV1QuU0lOR0xFKTsKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0VsZW1lbnROb2RlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9FbGVtZW50Tm9kZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVjNjFlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0VsZW1lbnROb2RlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWxlbWVudE5vZGVQYWdlIHsKLQotCUNvbnRyb2wgZkNvbnRyb2w7Ci0KLQlwdWJsaWMgRWxlbWVudE5vZGVQYWdlKCkgewotCQlzdXBlcigpOwotCi0JfQotCi0JcHVibGljIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KTsKLQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBmQ29udHJvbDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzYXZlRGF0YSgpOwotCi0JcHVibGljIGFic3RyYWN0IElDYXRhbG9nRWxlbWVudCBnZXREYXRhKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0ltYWdlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9JbWFnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzOGE3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0ltYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgSW1hZ2VGYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1BfTEVGVCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QX1JJR0hUID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1RUT01fTEVGVCA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9UVE9NX1JJR0hUID0gNDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W11bXSBPVkVSTEFZX0NPT1JESU5BVEUgPSB7ezAsIDB9LCB7MCwgMn0sIHsyLCAwfSwgezIsIDJ9fTsKLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2VGYWN0b3J5IElOU1RBTkNFID0gbmV3IEltYWdlRmFjdG9yeSgpOwotCi0JcHJvdGVjdGVkIEhhc2h0YWJsZSBjb21wb3NpdGVJbWFnZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JcHVibGljIEltYWdlRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGljb25OYW1lKSB7Ci0JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0KLQkJaWYgKGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2VSZWdpc3RyeS5wdXQoaWNvbk5hbWUsIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShnZXRDbGFzcygpLCBpY29uTmFtZSkpOwotCQkJcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJbWFnZSBjcmVhdGVDb21wb3NpdGVJbWFnZShJbWFnZSBiYXNlLCBJbWFnZSBvdmVybGF5LCBpbnQgb3ZlcmxheVBvc2l0aW9uKSB7Ci0JCVN0cmluZyBrZXkgPSBiYXNlICsgIioiICsgb3ZlcmxheSArICIqIiArIG92ZXJsYXlQb3NpdGlvbjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUltYWdlIHJlc3VsdCA9IChJbWFnZSkgY29tcG9zaXRlSW1hZ2VUYWJsZS5nZXQoa2V5KTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3Igb3ZlcmxheXNbXVtdID0gbmV3IEltYWdlRGVzY3JpcHRvclszXVszXTsKLQkJCWludFtdIGNvb3JkID0gT1ZFUkxBWV9DT09SRElOQVRFW292ZXJsYXlQb3NpdGlvbl07Ci0JCQlvdmVybGF5c1tjb29yZFsxXV1bY29vcmRbMF1dID0gbmV3IEltYWdlQmFzZWRJbWFnZURlc2NyaXB0b3Iob3ZlcmxheSk7Ci0JCQlPdmVybGF5SWNvbiBpY29uID0gbmV3IE92ZXJsYXlJY29uKG5ldyBJbWFnZUJhc2VkSW1hZ2VEZXNjcmlwdG9yKGJhc2UpLCBvdmVybGF5cywgbmV3IFBvaW50KDE2LCAxNikpOwotCQkJcmVzdWx0ID0gaWNvbi5jcmVhdGVJbWFnZSgpOwotCQkJY29tcG9zaXRlSW1hZ2VUYWJsZS5wdXQoa2V5LCByZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3JXcmFwcGVyKEltYWdlIGltYWdlKSB7Ci0JCXJldHVybiBuZXcgSW1hZ2VCYXNlZEltYWdlRGVzY3JpcHRvcihpbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogQW4gT3ZlcmxheUljb24gY29uc2lzdHMgb2YgYSBtYWluIGljb24gYW5kIHNldmVyYWwgYWRvcm5tZW50cy4KLQkgKi8KLQljbGFzcyBPdmVybGF5SWNvbiBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciB7Ci0KLQkJc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dJRFRIID0gMjI7Ci0KLQkJc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0hFSUdIVCA9IDE2OwotCi0JCXByaXZhdGUgUG9pbnQgZlNpemUgPSBudWxsOwotCi0JCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZCYXNlOwotCi0JCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZPdmVybGF5c1tdW107Ci0KLQkJcHVibGljIE92ZXJsYXlJY29uKEltYWdlRGVzY3JpcHRvciBiYXNlLCBJbWFnZURlc2NyaXB0b3JbXVtdIG92ZXJsYXlzLCBQb2ludCBzaXplKSB7Ci0JCQlmQmFzZSA9IGJhc2U7Ci0JCQlmT3ZlcmxheXMgPSBvdmVybGF5czsKLQkJCWZTaXplID0gc2l6ZTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGRyYXdCb3R0b21MZWZ0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7Ci0JCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0JCQlpbnQgeCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJCWlmICgoaSA8IGxlbmd0aCkgJiYgKG92ZXJsYXlzW2ldICE9IG51bGwpKSB7Ci0JCQkJCUltYWdlRGF0YSBpZCA9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOwotCQkJCQlkcmF3SW1hZ2UoaWQsIHgsIGdldFNpemUoKS55IC0gaWQuaGVpZ2h0KTsKLQkJCQkJeCArPSBpZC53aWR0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBkcmF3Qm90dG9tUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJCWlmIChvdmVybGF5cyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLQkJCWludCB4ID0gZ2V0U2l6ZSgpLng7Ci0JCQlmb3IgKGludCBpID0gMjsgaSA+PSAwOyBpLS0pIHsKLQkJCQlpZiAoKGkgPCBsZW5ndGgpICYmIChvdmVybGF5c1tpXSAhPSBudWxsKSkgewotCQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQkJeCAtPSBpZC53aWR0aDsKLQkJCQkJZHJhd0ltYWdlKGlkLCB4LCBnZXRTaXplKCkueSAtIGlkLmhlaWdodCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yI2RyYXdDb21wb3NpdGVJbWFnZShpbnQsIGludCkKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJCUltYWdlRGF0YSBiZzsKLQkJCWlmICgoZkJhc2UgPT0gbnVsbCkgfHwgKChiZyA9IGZCYXNlLmdldEltYWdlRGF0YSgpKSA9PSBudWxsKSkgewotCQkJCWJnID0gREVGQVVMVF9JTUFHRV9EQVRBOwotCQkJfQotCQkJZHJhd0ltYWdlKGJnLCAwLCAwKTsKLQotCQkJaWYgKGZPdmVybGF5cyAhPSBudWxsKSB7Ci0JCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAwKSB7Ci0JCQkJCWRyYXdUb3BSaWdodChmT3ZlcmxheXNbMF0pOwotCQkJCX0KLQotCQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMSkgewotCQkJCQlkcmF3Qm90dG9tUmlnaHQoZk92ZXJsYXlzWzFdKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDIpIHsKLQkJCQkJZHJhd0JvdHRvbUxlZnQoZk92ZXJsYXlzWzJdKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDMpIHsKLQkJCQkJZHJhd1RvcExlZnQoZk92ZXJsYXlzWzNdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wTGVmdChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQkJaWYgKG92ZXJsYXlzID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpbnQgbGVuZ3RoID0gb3ZlcmxheXMubGVuZ3RoOwotCQkJaW50IHggPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCQlpZiAoKGkgPCBsZW5ndGgpICYmIChvdmVybGF5c1tpXSAhPSBudWxsKSkgewotCQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQkJZHJhd0ltYWdlKGlkLCB4LCAwKTsKLQkJCQkJeCArPSBpZC53aWR0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJCWlmIChvdmVybGF5cyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLQkJCWludCB4ID0gZ2V0U2l6ZSgpLng7Ci0JCQlmb3IgKGludCBpID0gMjsgaSA+PSAwOyBpLS0pIHsKLQkJCQlpZiAoKGkgPCBsZW5ndGgpICYmIChvdmVybGF5c1tpXSAhPSBudWxsKSkgewotCQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQkJeCAtPSBpZC53aWR0aDsKLQkJCQkJZHJhd0ltYWdlKGlkLCB4LCAwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IjZ2V0U2l6ZSgpCi0JCSAqLwotCQlwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpIHsKLQkJCXJldHVybiBmU2l6ZTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBJbWFnZUJhc2VkSW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgSW1hZ2VEZXNjcmlwdG9yIHsKLQkJcHJvdGVjdGVkIEltYWdlIGltYWdlOwotCi0JCXB1YmxpYyBJbWFnZUJhc2VkSW1hZ2VEZXNjcmlwdG9yKEltYWdlIGltYWdlKSB7Ci0JCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2VEYXRhIGdldEltYWdlRGF0YSgpIHsKLQkJCXJldHVybiBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvVVJJVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvVVJJVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwYzJiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1VSSVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLQotcHVibGljIGNsYXNzIFVSSVV0aWxzIHsKLQkKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT0NPTF9QQVRURVJOID0gIjoiOyAKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MID0gImZpbGU6IjsKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9SRVNPVVJDRV9QUk9UT0NPTCA9ICJwbGF0Zm9ybTovcmVzb3VyY2UvIjsKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9GSUxFX1BST1RPQ09MX0ZPUldBUkRfU0xBU0ggPSAiXFxcXFxcIjsKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9GSUxFX1BST1RPQ09MX0JBQ0tfU0xBU0ggPSAiLy8vIjsKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgICBQQVRIX1NFUEFSQVRPUl9GT1JXQVJEX1NMQVNIID0gJy8nOwotCSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciAgIFBBVEhfU0VQQVJBVE9SX0JBQ0tfU0xBU0ggPSAnXFwnOwotCSAgCi0JICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VVJJVG9Mb2NhdGlvbihTdHJpbmcgdXJpKSB7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSB1cmk7Ci0JCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQlpZiAodXJpLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCkpIHsKLQkJCQkJbG9jYXRpb24gPSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLlVSSS5jcmVhdGVVUkkodXJpKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJaWYgKGxvY2F0aW9uICE9IG51bGwgJiYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoTE9DQUxfRklMRV9QUk9UT0NPTF9CQUNLX1NMQVNIKQotCQkJCQkJCXx8IGxvY2F0aW9uLnN0YXJ0c1dpdGgoTE9DQUxfRklMRV9QUk9UT0NPTF9GT1JXQVJEX1NMQVNIKSkpIHsKLQkJCQkJCWxvY2F0aW9uID0gbG9jYXRpb24uc3Vic3RyaW5nKExPQ0FMX0ZJTEVfUFJPVE9DT0xfQkFDS19TTEFTSC5sZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHVyaS5zdGFydHNXaXRoKFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MKSkgewotCQkJCQlsb2NhdGlvbiA9IHVyaS5zdWJzdHJpbmcoUExBVEZPUk1fUkVTT1VSQ0VfUFJPVE9DT0wubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0KLQkJcmV0dXJuIGxvY2F0aW9uOwotCSAgfQotCSAgCi0JICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0TG9jYXRpb25Ub1VSSShTdHJpbmcgbG9jYXRpb24pIHsKLQkJICBTdHJpbmcgdXJpID0gbG9jYXRpb247Ci0JCQlpZiAoIVVSSUhlbHBlci5oYXNQcm90b2NvbChsb2NhdGlvbikpIHsKLQkJCQl1cmkgPSBVUklIZWxwZXIuaXNBYnNvbHV0ZShsb2NhdGlvbik/IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwuVVJJLmNyZWF0ZUZpbGVVUkkobG9jYXRpb24pLnRvU3RyaW5nKCkKLQkJCQkJCTogVVJJSGVscGVyLnByZXBlbmRQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wobG9jYXRpb24pOwotCQkJfQotCQkJaWYgKHVyaS5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0wpICYmIHVyaS5pbmRleE9mKFBST1RPQ09MX1BBVFRFUk4sIEZJTEVfUFJPVE9DT0wubGVuZ3RoKCkpICE9IC0xKSB7Ci0JCQkJdXJpID0gVVJJSGVscGVyLmVuc3VyZUZpbGVVUklQcm90b2NvbEZvcm1hdCh1cmkpOwotCQkJfQotCQkJdXJpID0gdXJpLnJlcGxhY2UoUEFUSF9TRVBBUkFUT1JfQkFDS19TTEFTSCwgUEFUSF9TRVBBUkFUT1JfRk9SV0FSRF9TTEFTSCk7Ci0JCQlyZXR1cm4gdXJpOwotCSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dFbnRyaWVzVmlldy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nRW50cmllc1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmOGJiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dFbnRyaWVzVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLQotCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ0VudHJpZXNWaWV3IGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgQnV0dG9uIG5ld0J1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGVkaXRCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZWxldGVCdXR0b247Ci0JcHJvdGVjdGVkIFhNTENhdGFsb2dUcmVlVmlld2VyIHRhYmxlVmlld2VyOwotCXByb3RlY3RlZCBJQ2F0YWxvZyB3b3JraW5nVXNlckNhdGFsb2c7Ci0JcHJvdGVjdGVkIElDYXRhbG9nIHN5c3RlbUNhdGFsb2c7Ci0KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhZ2VFbmFibGVkID0gdHJ1ZTsKLQotCXB1YmxpYyBYTUxDYXRhbG9nRW50cmllc1ZpZXcoQ29tcG9zaXRlIHBhcmVudCwgSUNhdGFsb2cgd29ya2luZ1VzZXJDYXRhbG9nLCBJQ2F0YWxvZyBzeXN0ZW1DYXRhbG9nKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLndvcmtpbmdVc2VyQ2F0YWxvZyA9IHdvcmtpbmdVc2VyQ2F0YWxvZzsKLQkJdGhpcy5zeXN0ZW1DYXRhbG9nID0gc3lzdGVtQ2F0YWxvZzsKLQotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQl0aGlzLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQl0YWJsZVZpZXdlciA9IGNyZWF0ZVRhYmxlVmlld2VyKHRoaXMpOwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dCgiZHVtbXkiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMjY5MgotCQkvLyBzcGVjaWZpY2FsbHkgc2V0IHNpemUgb2YgdHJlZSBiZWZvcmUgZXhwYW5kaW5nIGl0Ci0JCVBvaW50IGluaXRpYWxTaXplID0gdGFibGVWaWV3ZXIuZ2V0VHJlZSgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IGluaXRpYWxTaXplLng7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBpbml0aWFsU2l6ZS55OwotCQl0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQl0YWJsZVZpZXdlci5leHBhbmRUb0xldmVsKDIpOwotCQl0YWJsZVZpZXdlci5yZXZlYWwoWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIuVVNFUl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1QpOwotCQkKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVXaWRnZXRFbmFibGVkU3RhdGUoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQljcmVhdGVCdXR0b25zKHRoaXMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUxlYWRpbmdTbGFzaChTdHJpbmcgdXJpKSB7Ci0JCS8vIHJlbW92ZSBsZWFkaW5nIHNsYXNoIGZyb20gdGhlIHZhbHVlIHRvIGF2b2lkIHRoZSB3aG9sZSBsZWFkaW5nCi0JCS8vIHNsYXNoIGFtYmlndWl0eSBwcm9ibGVtCi0JCS8vICAgICAgIAotCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCXdoaWxlICh1cmkuc3RhcnRzV2l0aCgiLyIpIHx8IHVyaS5zdGFydHNXaXRoKCJcXCIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXsKLQkJCQl1cmkgPSB1cmkuc3Vic3RyaW5nKDEpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JcHJvdGVjdGVkIFhNTENhdGFsb2dUcmVlVmlld2VyIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RyaW5nIGhlYWRpbmdzW10gPSBuZXcgU3RyaW5nWzJdOwotCQloZWFkaW5nc1swXSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9LRVk7Ci0JCWhlYWRpbmdzWzFdID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1VSSTsKLQotCQlYTUxDYXRhbG9nVHJlZVZpZXdlciB0aGVUYWJsZVZpZXdlciA9IG5ldyBYTUxDYXRhbG9nVHJlZVZpZXdlcihwYXJlbnQsIHdvcmtpbmdVc2VyQ2F0YWxvZywgc3lzdGVtQ2F0YWxvZyk7Ci0JCXJldHVybiB0aGVUYWJsZVZpZXdlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWdyaWRMYXlvdXQubWFyZ2luTGVmdCA9IDM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgPT0gbmV3QnV0dG9uKSB7Ci0JCQkJCXBlcmZvcm1OZXcoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZS53aWRnZXQgPT0gZWRpdEJ1dHRvbikgewotCQkJCQlwZXJmb3JtRWRpdCgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChlLndpZGdldCA9PSBkZWxldGVCdXR0b24pIHsKLQkJCQkJcGVyZm9ybURlbGV0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQkvLyBhZGQgdGhlICJOZXcuLi4iIGJ1dHRvbgotCQkvLwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0KLQkJbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbmV3QnV0dG9uLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9ORVcpOwotCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAobmV3QnV0dG9uLAotCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX01BUFBJTkdfTkVXKTsKLQkJbmV3QnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQluZXdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCS8vIGFkZCB0aGUgIkVkaXQuLi4iIGJ1dHRvbgotCQkvLwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQllZGl0QnV0dG9uLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9FRElUKTsKLQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKGVkaXRCdXR0b24sCi0JCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfTUFQUElOR19FRElUKTsKLQkJZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJLy8gYWRkIHRoZSAiRGVsZXRlIiBidXR0b24KLQkJLy8KLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkZWxldGVCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlkZWxldGVCdXR0b24uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfQlVUVE9OX1JFTU9WRSk7Ci0JCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkZWxldGVCdXR0b24sCi0JCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfTUFQUElOR19ERUxFVEUpOwotCQlkZWxldGVCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWRlbGV0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gNDsKLQotCQlCdXR0b24gaGlkZGVuQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJaGlkZGVuQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQloaWRkZW5CdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWhpZGRlbkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkvLyBhIGNydWRkeSBoYWNrIHNvIHRoYXQgdGhlIFByZWZlcmVuY2VEaWFsb2cgZG9lc24ndCBjbG9zZSBldmVyeSB0aW1lCi0JCS8vIHdlIHByZXNzICdlbnRlcicKLQkJLy8KLQkJZ2V0U2hlbGwoKS5zZXREZWZhdWx0QnV0dG9uKGhpZGRlbkJ1dHRvbik7Ci0JCXVwZGF0ZVdpZGdldEVuYWJsZWRTdGF0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsvLyBYTUxDYXRhbG9nVHJlZVZpZXdlci5VU0VSX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRDYXRhbG9nRW50cnlEaWFsb2cgaW52b2tlRGlhbG9nKFN0cmluZyB0aXRsZSwgSUNhdGFsb2dFbGVtZW50IGVudHJ5LCBJQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCVNoZWxsIHNoZWxsID0gWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQlFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nIGRpYWxvZyA9IGVudHJ5ICE9IG51bGwgPyBuZXcgRWRpdENhdGFsb2dFbnRyeURpYWxvZyhzaGVsbCwgZW50cnksIGNhdGFsb2cpIDogbmV3IEVkaXRDYXRhbG9nRW50cnlEaWFsb2coc2hlbGwsIGNhdGFsb2cpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybiBkaWFsb2c7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRDYXRhbG9nRW50cnlEaWFsb2cgaW52b2tlRGlhbG9nKFN0cmluZyB0aXRsZSwgSUNhdGFsb2cgY2F0YWxvZykgewotCQlyZXR1cm4gaW52b2tlRGlhbG9nKHRpdGxlLCBudWxsLCBjYXRhbG9nKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1OZXcoKSB7Ci0KLQkJLy8gSUNhdGFsb2dFbnRyeSBuZXdFbnRyeSA9Ci0JCS8vIChJQ2F0YWxvZ0VudHJ5KXdvcmtpbmdVc2VyQ2F0YWxvZy5jcmVhdGVDYXRhbG9nRWxlbWVudChJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9FTlRSWSk7Ci0JCUVkaXRDYXRhbG9nRW50cnlEaWFsb2cgZGlhbG9nID0gaW52b2tlRGlhbG9nKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ORVdfRElBTE9HX1RJVExFLCB3b3JraW5nVXNlckNhdGFsb2cpOwotCQlJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCA9IGRpYWxvZy5nZXRDYXRhbG9nRWxlbWVudCgpOwotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCXdvcmtpbmdVc2VyQ2F0YWxvZy5hZGRDYXRhbG9nRWxlbWVudChlbGVtZW50KTsKLQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlbGVtZW50KSwgdHJ1ZSk7Ci0JCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRWRpdCgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCi0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRWxlbWVudCkgewotCQkJSUNhdGFsb2dFbGVtZW50IG9sZEVudHJ5ID0gKElDYXRhbG9nRWxlbWVudCkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQlJQ2F0YWxvZ0VsZW1lbnQgbmV3RW50cnkgPSAoSUNhdGFsb2dFbGVtZW50KSAoKENhdGFsb2dFbGVtZW50KSBvbGRFbnRyeSkuY2xvbmUoKTsKLQotCQkJRWRpdENhdGFsb2dFbnRyeURpYWxvZyBkaWFsb2cgPSBpbnZva2VEaWFsb2coWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0VESVRfRElBTE9HX1RJVExFLCBuZXdFbnRyeSwgd29ya2luZ1VzZXJDYXRhbG9nKTsKLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJCS8vIGRlbGV0ZSB0aGUgb2xkIHZhbHVlIGlmIHRoZSAnbWFwRnJvbScgaGFzIGNoYW5nZWQKLQkJCQkvLwotCQkJCXdvcmtpbmdVc2VyQ2F0YWxvZy5yZW1vdmVDYXRhbG9nRWxlbWVudChvbGRFbnRyeSk7Ci0KLQkJCQkvLyB1cGRhdGUgdGhlIG5ldyBtYXBwaW5nCi0JCQkJLy8KLQkJCQl3b3JraW5nVXNlckNhdGFsb2cuYWRkQ2F0YWxvZ0VsZW1lbnQobmV3RW50cnkpOwotCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdFbnRyeSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlbGV0ZSgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbGVtZW50KSB7Ci0JCQkJCUlDYXRhbG9nRWxlbWVudCBjYXRhbG9nRWxlbWVudCA9IChJQ2F0YWxvZ0VsZW1lbnQpIHNlbGVjdGVkT2JqZWN0OwotCQkJCQl3b3JraW5nVXNlckNhdGFsb2cucmVtb3ZlQ2F0YWxvZ0VsZW1lbnQoY2F0YWxvZ0VsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldEVuYWJsZWRTdGF0ZSgpIHsKLQkJYm9vbGVhbiBpc0VkaXRhYmxlID0gZmFsc2U7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWJvb2xlYW4gbXVsdGlwbGVTZWxlY3Rpb24gPSBmYWxzZTsKLQkJaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCQkJaWYoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJbXVsdGlwbGVTZWxlY3Rpb24gPSB0cnVlOwotCQkJfQotCQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRWxlbWVudCkgewotCQkJCUlDYXRhbG9nRWxlbWVudFtdIGVsZW1lbnRzID0gKChDYXRhbG9nKSB3b3JraW5nVXNlckNhdGFsb2cpLmdldENhdGFsb2dFbGVtZW50cygpOwotCQkJCS8vIGR3IExpc3QgZW50cmllc0xpc3QgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnRzLmxlbmd0aCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCQlpc0VkaXRhYmxlID0gc2VsZWN0ZWRPYmplY3QuZXF1YWxzKGVsZW1lbnQpOwotCQkJCQlpZiAoaXNFZGl0YWJsZSkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiAoaXNQYWdlRW5hYmxlZCkKLQkJewotCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGlzRWRpdGFibGUgJiAhbXVsdGlwbGVTZWxlY3Rpb24pOwotCQkJZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoaXNFZGl0YWJsZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIHB1YmxpYyB2b2lkIHNldFBhZ2VFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeyBpc1BhZ2VFbmFibGVkID0gZW5hYmxlZDsKLQkgKiAKLQkgKiB0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChpc1BhZ2VFbmFibGVkKTsKLQkgKiAKLQkgKiBuZXdCdXR0b24uc2V0RW5hYmxlZChpc1BhZ2VFbmFibGVkKTsKLQkgKiBlZGl0QnV0dG9uLnNldEVuYWJsZWQoaXNQYWdlRW5hYmxlZCk7Ci0JICogZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoaXNQYWdlRW5hYmxlZCk7IH0KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVQYWdlKCkgewotCQlyZWZyZXNoKCk7Ci0JCXVwZGF0ZVdpZGdldEVuYWJsZWRTdGF0ZSgpOwotCX0KLQotCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0VudHJ5RGV0YWlsc1ZpZXcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0VudHJ5RGV0YWlsc1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU0Njk1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dFbnRyeURldGFpbHNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JRGVsZWdhdGVDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JUmV3cml0ZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklTdWZmaXhFbnRyeTsKLQotCi0KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nRW50cnlEZXRhaWxzVmlldyB7Ci0JcHJvdGVjdGVkIFRleHQgZGV0YWlsc1RleHQ7Ci0JcHJvdGVjdGVkIFNjcm9sbEJhciB2ZXJ0aWNhbFNjcm9sbCwgaG9yaXpvbnRhbFNjcm9sbDsKLQotCXB1YmxpYyBYTUxDYXRhbG9nRW50cnlEZXRhaWxzVmlldyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbG9yIGNvbG9yID0gcGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLQotCQlkZXRhaWxzVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhlaWdodEhpbnQgPSA4NTsKLQkJZGV0YWlsc1RleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl2ZXJ0aWNhbFNjcm9sbCA9IGRldGFpbHNUZXh0LmdldFZlcnRpY2FsQmFyKCk7Ci0JCS8vIHZlcnRpY2FsU2Nyb2xsLnNldFZpc2libGUoZmFsc2UpOwotCQlob3Jpem9udGFsU2Nyb2xsID0gZGV0YWlsc1RleHQuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlkZXRhaWxzVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWRldGFpbHNUZXh0LnNldEJhY2tncm91bmQoY29sb3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldENhdGFsb2dFbnRyeShJQ2F0YWxvZ0VudHJ5IGVudHJ5KSB7Ci0JCWlmIChlbnRyeSA9PSBudWxsKSB7Ci0JCQlkZXRhaWxzVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyB2YWx1ZSA9IGdldERpc3BsYXlWYWx1ZShlbnRyeSAhPSBudWxsID8gZW50cnkuZ2V0VVJJKCkgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxpbmUwID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0VOVFJZX0VMRU1FTlRfQ09MT04gKyAiXHRcdCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxpbmUyID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0RFVEFJTFNfVVJJX0NPTE9OICsgIlx0XHRcdFx0IiArIHZhbHVlOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsaW5lMTsKLQkJaWYgKHZhbHVlLnN0YXJ0c1dpdGgoImphcjpmaWxlOiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBqYXJGaWxlID0gVVJJVXRpbHMuY29udmVydFVSSVRvTG9jYXRpb24oVVJJSGVscGVyLmVuc3VyZVVSSVByb3RvY29sRm9ybWF0KHZhbHVlLnN1YnN0cmluZygiamFyOiIubGVuZ3RoKCksIHZhbHVlLmluZGV4T2YoJyEnKSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGludGVybmFsRmlsZSA9IFVSSVV0aWxzLmNvbnZlcnRVUklUb0xvY2F0aW9uKFVSSUhlbHBlci5lbnN1cmVVUklQcm90b2NvbEZvcm1hdCgiZmlsZTovLyIgKyB2YWx1ZS5zdWJzdHJpbmcodmFsdWUuaW5kZXhPZignIScpICsgMSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJbGluZTEgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfREVUQUlMU19VUklfTE9DQVRJT04gKyAiXHRcdFx0IiArIGludGVybmFsRmlsZSArICIgIiArIFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ERVRBSUxTX0lOX0pBUl9GSUxFICsgIiAiICsgamFyRmlsZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQllbHNlIHsKLQkJCXZhbHVlID0gVVJJVXRpbHMuY29udmVydFVSSVRvTG9jYXRpb24odmFsdWUpOwotCQkJbGluZTEgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfREVUQUlMU19VUklfTE9DQVRJT04gKyAiXHRcdFx0IiArIHZhbHVlOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCQlzd2l0Y2goZW50cnkuZ2V0RW50cnlUeXBlKCkpIHsKLQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzogbGluZTAgKz0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1BVQkxJQzsgYnJlYWs7Ci0JCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU06IGxpbmUwICs9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9TWVNURU07IGJyZWFrOwotCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJOiBsaW5lMCArPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfVVJJOyBicmVhazsKLQkJfQotCQl2YWx1ZSA9IGVudHJ5ICE9IG51bGwgPyBnZXRLZXlUeXBlVmFsdWUoZW50cnkpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxpbmUzID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFVEFJTFNfQ09MT04gKyAiXHRcdFx0IiArIHZhbHVlOyAvLyROT04tTkxTLTEkCi0JCXZhbHVlID0gZ2V0RGlzcGxheVZhbHVlKGVudHJ5ICE9IG51bGwgPyBlbnRyeS5nZXRLZXkoKSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGluZTQgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfREVUQUlMU19LRVlfQ09MT04gKyAiXHRcdFx0XHQiICsgdmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGVudGlyZVN0cmluZyA9IGxpbmUwICsgIlxuIiArIGxpbmUxICsgIlxuIiArIGxpbmUyICsgIlxuIiArIGxpbmUzICsgIlxuIiArIGxpbmU0OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWRldGFpbHNUZXh0LnNldFRleHQoZW50aXJlU3RyaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROZXh0Q2F0YWxvZyhJTmV4dENhdGFsb2cgbmV4dENhdGFsb2cpIHsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0RGlzcGxheVZhbHVlKG5leHRDYXRhbG9nICE9IG51bGwgPyBuZXh0Q2F0YWxvZy5nZXRDYXRhbG9nTG9jYXRpb24oKSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGluZTAgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfRU5UUllfRUxFTUVOVF9DT0xPTiArICJcdFx0IiArIFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ORVhUX0NBVEFMT0c7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxpbmUxID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0RFVEFJTFNfVVJJX0xPQ0FUSU9OICsgIlx0XHRcdCIgKyBVUklVdGlscy5jb252ZXJ0VVJJVG9Mb2NhdGlvbih2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxpbmUyID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0RFVEFJTFNfVVJJX0NPTE9OICsgIlx0XHRcdFx0IiArIHZhbHVlOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBlbnRpcmVTdHJpbmcgPSBsaW5lMCArICJcbiIgKyBsaW5lMSArICJcbiIgKyBsaW5lMjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWRldGFpbHNUZXh0LnNldFRleHQoZW50aXJlU3RyaW5nKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3VmZml4RW50cnkoSVN1ZmZpeEVudHJ5IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0RGlzcGxheVZhbHVlKGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQuZ2V0VVJJKCkgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxpbmUwID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0VOVFJZX0VMRU1FTlRfQ09MT04gKyAiXHRcdCIgKyBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfU1VGRklYX0VOVFJZOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsaW5lMSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ERVRBSUxTX1NVRkZJWF9DT0xPTiArICJcdFx0XHRcdCIgKyBlbGVtZW50LmdldFN1ZmZpeCgpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsaW5lMiA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ERVRBSUxTX1VSSV9MT0NBVElPTiArICJcdFx0XHQiICsgVVJJVXRpbHMuY29udmVydFVSSVRvTG9jYXRpb24odmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsaW5lMyA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVRBSUxTX0NPTE9OICsgIlx0XHRcdCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHVyaSA9IGVsZW1lbnQuZ2V0VVJJKCk7Ci0JCWJvb2xlYW4gaXNTY2hlbWEgPSBmYWxzZTsKLQkJaWYodXJpICE9IG51bGwgJiYgdXJpLmVuZHNXaXRoKCJ4c2QiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpc1NjaGVtYSA9IHRydWU7Ci0JCX0KLQkJc3dpdGNoIChlbGVtZW50LmdldEVudHJ5VHlwZSgpKSB7Ci0JCWNhc2UgSVN1ZmZpeEVudHJ5LlNVRkZJWF9UWVBFX1NZU1RFTToKLQkJCWxpbmUzICs9IGlzU2NoZW1hPyBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fWFNEX1NZU1RFTSA6IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9EVERfU1lTVEVNOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgSVN1ZmZpeEVudHJ5LlNVRkZJWF9UWVBFX1VSSToKLQkJCWxpbmUzICs9IGlzU2NoZW1hPyBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fWFNEX1BVQkxJQyA6IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9VUkk7Ci0JCQlicmVhazsKLQkJfQotCQlTdHJpbmcgZW50aXJlU3RyaW5nID0gbGluZTAgKyAiXG4iICsgbGluZTEgKyJcbiIgKyBsaW5lMiArICJcbiIgKyBsaW5lMzsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJZGV0YWlsc1RleHQuc2V0VGV4dChlbnRpcmVTdHJpbmcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFJld3JpdGVFbnRyeShJUmV3cml0ZUVudHJ5IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGxpbmUwID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0VOVFJZX0VMRU1FTlRfQ09MT04gKyAiXHRcdCIgKyBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfUkVXUklURV9FTlRSWTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGluZTEgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfU1RBUlRfU1RSSU5HICsgIlx0XHQiICsgZWxlbWVudC5nZXRTdGFydFN0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsaW5lMiA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9SRVdSSVRFX1BSRUZJWCArICJcdCIgKyBlbGVtZW50LmdldFJld3JpdGVQcmVmaXgoKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGluZTMgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVUQUlMU19DT0xPTiAgKyAiXHRcdFx0IiA7IC8vJE5PTi1OTFMtMSQKLQkJc3dpdGNoIChlbGVtZW50LmdldEVudHJ5VHlwZSgpKSB7Ci0JCWNhc2UgSVJld3JpdGVFbnRyeS5SRVdSSVRFX1RZUEVfU1lTVEVNOgotCQkJbGluZTMgKz0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9TWVNURU07Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJY2FzZSBJUmV3cml0ZUVudHJ5LlJFV1JJVEVfVFlQRV9VUkk6Ci0JCQlsaW5lMyArPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fVVJJOwotCQkJYnJlYWs7Ci0JCX0KLQkJU3RyaW5nIGVudGlyZVN0cmluZyA9IGxpbmUwICsgIlxuIiArIGxpbmUxICsgIlxuIiArIGxpbmUyICsgIlxuIiArIGxpbmUzOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlkZXRhaWxzVGV4dC5zZXRUZXh0KGVudGlyZVN0cmluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVsZWdhdGVDYXRhbG9nKElEZWxlZ2F0ZUNhdGFsb2cgZWxlbWVudCkgewotCQlTdHJpbmcgdmFsdWUgPSBnZXREaXNwbGF5VmFsdWUoZWxlbWVudCAhPSBudWxsID8gZWxlbWVudC5nZXRDYXRhbG9nTG9jYXRpb24oKSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGluZTAgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfRU5UUllfRUxFTUVOVF9DT0xPTiArICJcdFx0IiArIFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ERUxFR0FURV9DQVRBTE9HOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsaW5lMSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9TVEFSVF9TVFJJTkcgKyAiXHRcdCIgKyBlbGVtZW50LmdldFN0YXJ0U3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxpbmUyID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0RFVEFJTFNfVVJJX0xPQ0FUSU9OICsgIlx0XHRcdCIgKyBVUklVdGlscy5jb252ZXJ0VVJJVG9Mb2NhdGlvbih2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxpbmUzID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFVEFJTFNfQ09MT04gKyAiXHRcdFx0IjsgLy8kTk9OLU5MUy0xJAotCQlzd2l0Y2ggKGVsZW1lbnQuZ2V0RW50cnlUeXBlKCkpIHsKLQkJY2FzZSBJRGVsZWdhdGVDYXRhbG9nLkRFTEVHQVRFX1RZUEVfUFVCTElDOgotCQkJbGluZTMgKz0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9QVUJMSUM7Ci0JCQlicmVhazsKLQkJY2FzZSBJRGVsZWdhdGVDYXRhbG9nLkRFTEVHQVRFX1RZUEVfU1lTVEVNOgotCQkJbGluZTMgKz0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9TWVNURU07Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJY2FzZSBJRGVsZWdhdGVDYXRhbG9nLkRFTEVHQVRFX1RZUEVfVVJJOgotCQkJbGluZTMgKz0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1VSSTsKLQkJCWJyZWFrOwotCQl9Ci0JCVN0cmluZyBlbnRpcmVTdHJpbmcgPSBsaW5lMCArICJcbiIgKyBsaW5lMSArICJcbiIgKyBsaW5lMiArICJcbiIgKyBsaW5lMzsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJZGV0YWlsc1RleHQuc2V0VGV4dChlbnRpcmVTdHJpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhdGFsb2dFbGVtZW50KElDYXRhbG9nRWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIEkgd2lzaCB3ZSBoYWQgYSB2aXNpdG9yIGZvciB0aGlzIGtpbmQgb2YgbWVzcwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpIHNldENhdGFsb2dFbnRyeSgoSUNhdGFsb2dFbnRyeSllbGVtZW50KTsKLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElOZXh0Q2F0YWxvZykgc2V0TmV4dENhdGFsb2coKElOZXh0Q2F0YWxvZyllbGVtZW50KTsKLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElEZWxlZ2F0ZUNhdGFsb2cpIHNldERlbGVnYXRlQ2F0YWxvZygoSURlbGVnYXRlQ2F0YWxvZyllbGVtZW50KTsKLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSZXdyaXRlRW50cnkpIHNldFJld3JpdGVFbnRyeSgoSVJld3JpdGVFbnRyeSllbGVtZW50KTsKLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTdWZmaXhFbnRyeSkgc2V0U3VmZml4RW50cnkoKElTdWZmaXhFbnRyeSllbGVtZW50KTsKLQkJZWxzZSBzZXRDYXRhbG9nRW50cnkobnVsbCk7IC8vIEdpdmVzIG51bGwgdGV4dAotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXNwbGF5VmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nICE9IG51bGwgPyBzdHJpbmcgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5VHlwZVZhbHVlKElDYXRhbG9nRW50cnkgZW50cnkpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmICgoZW50cnkuZ2V0VVJJKCkgIT0gbnVsbCkgJiYgZW50cnkuZ2V0VVJJKCkuZW5kc1dpdGgoInhzZCIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCXJlc3VsdCA9IChlbnRyeS5nZXRFbnRyeVR5cGUoKSA9PSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJKSA/IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9YU0RfUFVCTElDIDogWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1hTRF9TWVNURU07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzd2l0Y2ggKGVudHJ5LmdldEVudHJ5VHlwZSgpKSB7Ci0JCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDIDoKLQkJCQkJcmVzdWx0ID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9QVUJMSUM7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTSA6Ci0JCQkJCXJlc3VsdCA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9EVERfU1lTVEVNOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmVzdWx0ID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1VSSTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0ZpbGVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dGaWxlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2NiYmU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0ZpbGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotcHVibGljIGNsYXNzIFhNTENhdGFsb2dGaWxlVHlwZSB7Ci0JcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbjsKLSAgICBwdWJsaWMgU3RyaW5nIGlkOwotCXB1YmxpYyBMaXN0IGV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHVibGljIFN0cmluZyBpY29uRmlsZU5hbWU7Ci0JcHVibGljIEltYWdlIGljb247Ci0KLQlwdWJsaWMgdm9pZCBhZGRFeHRlbnNpb25zKFN0cmluZyBjb250cmlidXRlZEV4dGVuc2lvbnMpIHsKLQkJTGlzdCBsaXN0ID0gcGFyc2VFeHRlbnNpb25zKGNvbnRyaWJ1dGVkRXh0ZW5zaW9ucyk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgZXh0ZW5zaW9uID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlpZiAoIWV4dGVuc2lvbnMuY29udGFpbnMoZXh0ZW5zaW9uKSkgewotCQkJCWV4dGVuc2lvbnMuYWRkKGV4dGVuc2lvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBwYXJzZUV4dGVuc2lvbnMoU3RyaW5nIHN0cmluZykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHJpbmcsICIsICIpOyBzdC5oYXNNb3JlVG9rZW5zKCk7KSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCVN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpOwotCQkJaWYgKHRva2VuICE9IG51bGwpIHsKLQkJCQlsaXN0LmFkZCh0b2tlbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTI2YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBYTUwgRWRpdG9yCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ01lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nLlhNTENhdGFsb2dSZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dJWkFSRF9TQ0hFTUFfQU5EX05BTUVfU1BBQ0VfSU5GTzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9OQU1FX1NQQUNFX1BSRUZJWDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9OQU1FX1NQQUNFX1VSSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9YU0RfTE9DQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRE9DVFlQRV9JTkZPUk1BVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TWVNURU1fSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfUFVCTElDX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NFTEVDVF9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0tFWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9LRVlfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU1VGRklYOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NVRkZJWF9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9ERVRBSUxTX0tFWV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9ERVRBSUxTX0lOX0pBUl9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1VSSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9MT0NBVElPTl9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9NQVRDSF9LRVlfVFlQRV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9BUlJPVzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9DQVRBTE9HX1VSSV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9ERVRBSUxTX1VSSV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9ERVRBSUxTX1VSSV9MT0NBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9LRVlfVFlQRV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9FTEVNRU5UX1RZUEVfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU1RBUlRfU1RSSU5HX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1JFV1JJVEVfUFJFRklYX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0tFWV9UWVBFX0RFVEFJTFNfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fWFNEX1BVQkxJQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9LRVlfVFlQRV9ERVNDUklQVElPTl9YU0RfU1lTVEVNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9QVUJMSUM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fRFREX1NZU1RFTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9LRVlfVFlQRV9ERVNDUklQVElPTl9VUkk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU1BFQ0lGWV9BTFRFUk5BVElWRV9XRUJfVVJMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfVVJJX01VU1RfTk9UX0hBVkVfRE9UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9GSUxFX1NFTEVDVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9DSE9PU0VfRklMRV9UT19BRERfVE9fQ0FUQUxPRzsKLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19VUklfTk9UX0ZPVU5EX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfVVJJX05PVF9GT1VORF9MT05HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfSU5WQUxJRF9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfSU5WQUxJRF9GSUxFX0xPTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19OT19FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfTk9fRUxFTUVOVF9EVERfTE9ORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XQVJOSU5HX05PX0VMRU1FTlRfWFNEX0xPTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19TSE9VTERfQkVfRlVMTFlfUVVBTElGSUVEX1VSSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XQVJOSU5HX0RVUExJQ0FURV9FTlRSWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XQVJOSU5HX0RVUExJQ0FURV9TVUZGSVg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19EVVBMSUNBVEVfUkVXUklURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XQVJOSU5HX0RVUExJQ0FURV9ERUxFR0FURTsKLQkKLQkvLyBOZXdNb2RlbFdpemFyZAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0lOVkFMSURfR1JBTU1BUl9FUlJPUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9CVVRUT05fQlJPV1NFOwotCi0JLy8gWE1MQ2F0YWxvZ0lkTWFwcGluZ1BhZ2UKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9NQVBfVE87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfTUFQX0ZST007Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQlVUVE9OX05FVzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9CVVRUT05fRURJVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9CVVRUT05fREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0JVVFRPTl9SRU1PVkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfTkVXX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9FRElUX0RJQUxPR19USVRMRTsKLQotCi0JLy8gWE1MQ2F0YWxvZ1ByZWZlcmVuY2VQYWdlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfVVNFUl9FTlRSSUVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1VTRVJfRU5UUklFU19UT09MX1RJUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TWVNURU1fRU5UUklFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TWVNURU1fRU5UUklFU19UT09MX1RJUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9CVVRUT05fQ0hBTkdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NFTEVDVF9QUk9KRUNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NQRUNJRllfUFJPSkVDVF9ERVNDUklQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XQVJOSU5HX05PX1BST0pFQ1RTX0NSRUFURUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19QUk9KRUNUX05PVF9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19QUk9KRUNUX0RPRVNfTk9UX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1BST0pFQ1RfVE9fVVNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0NBVEFMT0dfU0FWRV9FUlJPUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9DQVRBTE9HX0NPVUxEX05PVF9CRV9TQVZFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9BRFZBTkNFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9BRFZBTkNFRF9YTUxfQ0FUQUxPR19QUkVGUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TUEVDSUZZX1BFUlNJU1RFTkNFX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU0FWRV9DQVRBTE9HX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TQVZFX0NBVEFMT0dfRElBTE9HX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQlJPV1NFX0NBVEFMT0dfRklMRV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9CUk9XU0VfQ0FUQUxPR19GSUxFX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfREVUQUlMUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9VU0VSX1NQRUNJRklFRF9FTlRSSUVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1BMVUdJTl9TUEVDSUZJRURfRU5UUklFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9QTEFURk9STV9SRVNPVVJDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9GSUxFX1NZU1RFTV9SRVNPVVJDRTsKLQkvLyBBZHZhbmNlZE9wdGlvbnNEaWFsb2cKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9CVVRUT05fSU1QT1JUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0JVVFRPTl9FWFBPUlQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9JTVBPUlRfRElBTE9HX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9JTVBPUlRfRElBTE9HX01FU1NBR0U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9FWFBPUlRfRElBTE9HX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0VYUE9SVF9ESUFMT0dfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9FWFBPUlRfRElBTE9HX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfU0FWSU5HX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRklMRV9JU19SRUFEX09OTFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRElBTE9HX0RFU0NSSVBUSU9OOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfTkVYVF9DQVRBTE9HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RFTEVHQVRFX0NBVEFMT0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfUkVXUklURV9FTlRSWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TVUZGSVhfRU5UUlk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9ERUxFR0FURV9DQVRBTE9HX1VSSV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nX2NhdGFsb2dFbnRyeUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRDYXRhbG9nRW50cnlEaWFsb2dfbmV4dENhdGFsb2dMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nX3Jld3JpdGVFbnRyeUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRDYXRhbG9nRW50cnlEaWFsb2dfc3VmZml4RW50cnlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nX2RlbGVnYXRlQ2F0YWxvZ0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0JVVFRPTl9NRU5VX0JST1dTRV9XT1JLU1BBQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQlVUVE9OX01FTlVfQlJPV1NFX0ZJTEVfU1lTVEVNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NFTEVDVF9GSUxFX0ZJTFRFUl9DT05UUk9MOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1RFWFRfU0VMRUNUX0ZJTEVfRklMVEVSX0NPTlRST0w7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfUFVCTElDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NZU1RFTTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NUQVJUX1NUUklORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9SRVdSSVRFX1BSRUZJWDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9FTlRSWV9FTEVNRU5UX0NPTE9OOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfREVUQUlMU19TVUZGSVhfQ09MT047Ci0JCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFhNTENhdGFsb2dNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBYTUxDYXRhbG9nTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NGE4MmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyL1NUQVIgU3RhbmRhcmQgLSBkX2FfY2FydmVyQHlhaG9vLmNvbSAtIGJ1ZyAxOTI1NjgKLSAqICAgICAgICAgICAgUmVtb3ZlZCBBZHZhbmNlZCBidXR0b24gLSBGdW5jdGlvbmFsaXR5IGlzIG5vdyBpbiB0aGUKLSAqICAgICAgICAgICAgSW1wb3J0L0V4cG9ydCBYTUwgQ2F0YWxvZyBXaXphcmRzLiAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2dTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgSUNhdGFsb2dMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgWE1MQ2F0YWxvZ0VudHJpZXNWaWV3IGNhdGFsb2dFbnRyaWVzVmlldzsKLQotCXByb3RlY3RlZCBJQ2F0YWxvZyB3b3JraW5nVXNlckNhdGFsb2c7Ci0KLQlwcm90ZWN0ZWQgSUNhdGFsb2cgc3lzdGVtQ2F0YWxvZzsKLQotCXByb3RlY3RlZCBJQ2F0YWxvZyB1c2VyQ2F0YWxvZzsKLQotCXByb3RlY3RlZCBJQ2F0YWxvZyBkZWZhdWx0Q2F0YWxvZzsKLQotCXByb3RlY3RlZCBCdXR0b24gYWR2YW5jZWRCdXR0b247Ci0KLQlwdWJsaWMgWE1MQ2F0YWxvZ1ByZWZlcmVuY2VQYWdlKCkgewotCQlkZWZhdWx0Q2F0YWxvZyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0JCUlOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGRlZmF1bHRDYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5leHRDYXRhbG9ncy5sZW5ndGg7IGkrKykgewotCQkJSU5leHRDYXRhbG9nIGNhdGFsb2cgPSBuZXh0Q2F0YWxvZ3NbaV07Ci0JCQlJQ2F0YWxvZyByZWZlcmVuY2VkQ2F0YWxvZyA9IGNhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQkJCWlmIChyZWZlcmVuY2VkQ2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkJaWYgKFhNTENvcmVQbHVnaW4uU1lTVEVNX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKSB7Ci0JCQkJCXN5c3RlbUNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoWE1MQ29yZVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKSB7Ci0JCQkJCXVzZXJDYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQl3b3JraW5nVXNlckNhdGFsb2cucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCB0aGUgdmlldyBpbiByZXNwb25jZSB0byBhbiBldmVudCBzZW50IGJ5IHRoZSBDYXRhbG9nCi0JICovCi0JcHVibGljIHZvaWQgY2F0YWxvZ0NoYW5nZWQoSUNhdGFsb2dFdmVudCBldmVudCkgewotCQljYXRhbG9nRW50cmllc1ZpZXcudXBkYXRlUGFnZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgcHJlZmVyZW5jZSBwYWdlIGNvbnRyb2xzIG9uIGRlbWFuZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGZvciB0aGUgcHJlZmVyZW5jZSBwYWdlCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyB3ZSBjcmVhdGUgYSB3b3JraW5nIGNvcHkgb2YgdGhlICdVc2VyIFNldHRpbmdzJyBmb3IgdGhlIENhdGFsb2cKLQkJLy8gdGhhdCB3ZSBjYW4gbW9kaWZ5Ci0JCUNhdGFsb2dTZXQgdGVtcENhdGFsb2dTZXQgPSBuZXcgQ2F0YWxvZ1NldCgpOwotCQl3b3JraW5nVXNlckNhdGFsb2cgPSB0ZW1wQ2F0YWxvZ1NldC5sb29rdXBPckNyZWF0ZUNhdGFsb2coIndvcmtpbmciLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCS8vIFRPRE86IGFkZCBlbnRyaWVzIGZyb20gdGhlIG5lc3RlZCBjYXRhbG9ncyBhcyB3ZWxsCi0JCXdvcmtpbmdVc2VyQ2F0YWxvZy5hZGRFbnRyaWVzRnJvbUNhdGFsb2codXNlckNhdGFsb2cpOwotCQl3b3JraW5nVXNlckNhdGFsb2cuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAoY29tcG9zaXRlLCBuZXcKLQkJLy8gQ29udHJvbENvbnRleHRDb21wdXRlcihjb21wb3NpdGUsCi0JCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfQ0FUQUxPR19QQUdFKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY3JlYXRlQ2F0YWxvZ0VudHJpZXNWaWV3KGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUNhdGFsb2dEZXRhaWxzVmlldyhjb21wb3NpdGUpOwotCQkvL2NyZWF0ZUFkdmFuY2VkQnV0dG9uKGNvbXBvc2l0ZSk7Ci0JCS8vIGNhdGFsb2dFbnRyaWVzVmlldy51cGRhdGVQYWdlKCk7Ci0JCWFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWR2YW5jZWRCdXR0b24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlwYW5lbC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkvLyBUT0RPLi4uIGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBleHBhbmQgdGhlIHBhZ2Ugd2lkdGg/Ci0JCS8vIFRoaXMgaW52aXNpYmxlIGxhYmVsIGlzIGNyZWF0ZWQgdG8gZm9yY2UgdGhlIHdpZHRoIG9mIHRoZSBwYWdlIHRvCi0JCS8vIGJlCi0JCS8vIHdpZGUgZW5vdWdoIHRvIHNob3cKLQkJLy8gdGhlIHJhdGhlciBsb25nIHVyaSBhbmQga2V5IGZpZWxkcyBvZiBhIGNhdGFsb2cgZW50cnkuCi0JCUxhYmVsIHdpZHRoRnVkZ2VyID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTk9ORSk7Ci0JCVN0cmluZyB3aWR0aEZ1ZGdlclN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgNTU7IGkrKykgewotCQkJd2lkdGhGdWRnZXJTdHJpbmcgKz0gIngiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJd2lkdGhGdWRnZXIuc2V0VGV4dCh3aWR0aEZ1ZGdlclN0cmluZyk7Ci0JCXdpZHRoRnVkZ2VyLnNldFZpc2libGUoZmFsc2UpOwotCQlDb21wb3NpdGUgcGxhY2VIb2xkZXIgPSBuZXcgQ29tcG9zaXRlKHBhbmVsLCBTV1QuTk9ORSk7Ci0JCXBsYWNlSG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlhZHZhbmNlZEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZWwsIFNXVC5OT05FKTsKLQkJYWR2YW5jZWRCdXR0b24uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfQURWQU5DRUQpOwotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUFkdmFuY2VkT3B0aW9uc0RpYWxvZyBkaWFsb2cgPSBuZXcgQWR2YW5jZWRPcHRpb25zRGlhbG9nKGdldFNoZWxsKCksIHdvcmtpbmdVc2VyQ2F0YWxvZyk7Ci0JCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0FEVkFOQ0VEX1hNTF9DQVRBTE9HX1BSRUZTKTsKLQkJCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZGlhbG9nLm9wZW4oKTsKLQkJCX0KLQkJfTsKLQkJYWR2YW5jZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2FtZUZpbGVOYW1lKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoKGEgIT0gbnVsbCkgJiYgKGIgIT0gbnVsbCkpIHsKLQkJCXJlc3VsdCA9IGEuZXF1YWxzKGIpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2F0YWxvZ0VudHJpZXNWaWV3KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWdyb3VwLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1VTRVJfRU5UUklFUyk7Ci0JCWdyb3VwLnNldFRvb2xUaXBUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9VU0VSX0VOVFJJRVNfVE9PTF9USVApOwotCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAodXNlckVudHJpZXNHcm91cCwgbmV3Ci0JCS8vIENvbnRyb2xDb250ZXh0Q29tcHV0ZXIodXNlckVudHJpZXNHcm91cCwKLQkJLy8gWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MUF9DQVRBTE9HX1VTRVJfR1JPVVApKTsKLQkJY2F0YWxvZ0VudHJpZXNWaWV3ID0gbmV3IFhNTENhdGFsb2dFbnRyaWVzVmlldyhncm91cCwgd29ya2luZ1VzZXJDYXRhbG9nLCBzeXN0ZW1DYXRhbG9nKTsKLQkJY2F0YWxvZ0VudHJpZXNWaWV3LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNhdGFsb2dEZXRhaWxzVmlldyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGRldGFpbHNHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJZGV0YWlsc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlkZXRhaWxzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlkZXRhaWxzR3JvdXAuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfREVUQUlMUyk7Ci0JCWZpbmFsIFhNTENhdGFsb2dFbnRyeURldGFpbHNWaWV3IGRldGFpbHNWaWV3ID0gbmV3IFhNTENhdGFsb2dFbnRyeURldGFpbHNWaWV3KGRldGFpbHNHcm91cCk7Ci0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pICYmICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpID09IDEgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQkJCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VsZW1lbnQpIHsKLQkJCQkJZGV0YWlsc1ZpZXcuc2V0Q2F0YWxvZ0VsZW1lbnQoKElDYXRhbG9nRWxlbWVudClzZWxlY3RlZE9iamVjdCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGV0YWlsc1ZpZXcuc2V0Q2F0YWxvZ0VsZW1lbnQobnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQljYXRhbG9nRW50cmllc1ZpZXcuZ2V0Vmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBEbyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgT0sgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIGl0IGlzIG9rYXkgdG8gY2xvc2UgdGhlIHByZWZlcmVuY2UgcGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJcmV0dXJuIHN0b3JlVmFsdWVzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JLyoqCi0JICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHN0b3JlVmFsdWVzKCkgewotCQkvLyBkdyBPYmplY3QgZmlsZU9iamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyB1cGRhdGUgdGhlIHVzZXJDYXRhbG9nIHNvIHRoYXQgaXRzIHRoZSBzYW1lIGFzIHRoZSB3b3JraW5nCi0JCQkvLyBjYXRhbG9nCi0JCQl1c2VyQ2F0YWxvZy5jbGVhcigpOwotCQkJLy8gVE9ETyBhZGQgZW50cmllcyBmcm9tIHRoZSBuZXN0ZWQgY2F0YWxvZ3M/Ci0JCQl1c2VyQ2F0YWxvZy5hZGRFbnRyaWVzRnJvbUNhdGFsb2cod29ya2luZ1VzZXJDYXRhbG9nKTsKLQkJCS8vIG5vdyBzYXZlIHRoZSB1c2VyQ2F0YWxvZwotCQkJdXNlckNhdGFsb2cuc2F2ZSgpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dSZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWY5MDhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIERhdmlkIENhcnZlci9TVEFSIFN0YW5kYXJkLCBkX2FfY2FydmVyQHlhaG9vLmNvbSwgYnVnIDE5MjU2OAotIyAgICAgICAgLSBGaXhlZCBncmFtbWFyIGluIFhNTCBDYXRhbG9nIEltcG9ydCBkaWFsb2cuCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1VSV9XSVpBUkRfU0NIRU1BX0FORF9OQU1FX1NQQUNFX0lORk8gPSBTY2hlbWEgYW5kIE5hbWVzcGFjZSBJbmZvcm1hdGlvbgotVUlfTEFCRUxfTkFNRV9TUEFDRV9QUkVGSVggICAgICAgICAgID0gTmFtZXNwYWNlIHByZWZpeDoKLVVJX0xBQkVMX05BTUVfU1BBQ0VfVVJJICAgICAgICAgICAgICA9IE5hbWVzcGFjZSBVUkk6Ci1VSV9MQUJFTF9YU0RfTE9DQVRJT04gICAgICAgICAgICAgICAgPSBTY2hlbWEgbG9jYXRpb246Ci1VSV9MQUJFTF9ET0NUWVBFX0lORk9STUFUSU9OICAgICAgICAgPSBEb2N1bWVudCB0eXBlIGluZm9ybWF0aW9uCi1VSV9MQUJFTF9TWVNURU1fSUQgICAgICAgICAgICAgICAgICAgPSAmU3lzdGVtIElEOgotVUlfTEFCRUxfUFVCTElDX0lEICAgICAgICAgICAgICAgICAgID0gJlB1YmxpYyBJRDoKLVVJX0xBQkVMX1NFTEVDVF9GSUxFICAgICAgICAgICAgICAgICA9IFNlbGVjdCBGaWxlCi1VSV9MQUJFTF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgPSBLZXkKLVVJX0xBQkVMX0tFWV9DT0xPTiAgICAgICAgICAgICAgICAgICA9ICZLZXk6Ci1VSV9MQUJFTF9TVUZGSVggICAgICAgICAgICAgICAgICAgICAgPSBTdWZmaXgKLVVJX0xBQkVMX1NVRkZJWF9DT0xPTiAgICAgICAgICAgICAgICA9IFMmdWZmaXg6Ci1VSV9MQUJFTF9ERVRBSUxTX0tFWV9DT0xPTiAgICAgICAgICAgPSBLZXk6Ci1VSV9MQUJFTF9ERVRBSUxTX0lOX0pBUl9GSUxFCQkgPSBpbiBqYXIgZmlsZQotVUlfTEFCRUxfVVJJICAgICAgICAgICAgICAgICAgICAgICAgID0gVVJJCi1VSV9MQUJFTF9TVEFSVF9TVFJJTkdfQ09MT04gICAgICAgICAgPSAmTWF0Y2hpbmcgc3RhcnQgc3RyaW5nOgotVUlfTEFCRUxfUkVXUklURV9QUkVGSVhfQ09MT04gICAgICAgID0gUmV3cml0ZSBwcmVmaSZ4OiAgIAotVUlfTEFCRUxfQVJST1cJCQkJICAgICAgICAgPSAtPgotVUlfTEFCRUxfTE9DQVRJT05fQ09MT04gICAgICAgICAgICAgID0gJkxvY2F0aW9uOiAgCi1VSV9MQUJFTF9ERUxFR0FURV9DQVRBTE9HX1VSSV9DT0xPTgkgPSBEJmVsZWdhdGUgdG8gdGhpcyBYTUwgQ2F0YWxvZyBmaWxlOgotVUlfTEFCRUxfQ0FUQUxPR19VUklfQ09MT04JCSAgICAgID0gJkxvY2F0aW9uIG9mIGFub3RoZXIgWE1MIENhdGFsb2cgZmlsZToKLVVJX0xBQkVMX0RFVEFJTFNfVVJJX0NPTE9OICAgICAgICAgICA9IFVSSTogICAKLVVJX0tFWV9UWVBFX0NPTE9OICAgICAgICAgICAgICAgICAgICA9IEtleSAmdHlwZToKLVVJX0tFWV9UWVBFX0RFVEFJTFNfQ09MT04gICAgICAgICAgICA9IEtleSB0eXBlOgotVUlfTUFUQ0hfS0VZX1RZUEVfQ09MT04gICAgICAgICAgICAgID0gJktleSB0eXBlIHRvIG1hdGNoOgotVUlfTEFCRUxfREVUQUlMU19VUklfTE9DQVRJT04gICAgICAgID0gTG9jYXRpb246Ci1VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9YU0RfUFVCTElDICAgPSBOYW1lc3BhY2UgbmFtZQotVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fWFNEX1NZU1RFTSAgID0gU2NoZW1hIGxvY2F0aW9uCi1VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9EVERfUFVCTElDICAgPSBQdWJsaWMgSUQKLVVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9TWVNURU0gICA9IFN5c3RlbSBJRAotVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fVVJJICAgCQkgPSBVUkkKLVVJX0xBQkVMX1NQRUNJRllfQUxURVJOQVRJVkVfV0VCX1VSTCA9ICZBbHRlcm5hdGl2ZSB3ZWIgYWRkcmVzczoKLVVJX1dBUk5JTkdfVVJJX01VU1RfTk9UX0hBVkVfRE9UUyAgICA9IFVSSSBtdXN0IG5vdCBpbmNsdWRlICcuJyBvciAnLi4nCi1VSV9MQUJFTF9QTEFURk9STV9SRVNPVVJDRSAJCSAJID0gV29ya3NwYWNlCi1VSV9MQUJFTF9GSUxFX1NZU1RFTV9SRVNPVVJDRQkJID0gRmlsZSBzeXN0ZW0KLVVJX0VMRU1FTlRfVFlQRV9DT0xPTiAgICAgICAgICAgICAgICA9IENhdGFsb2cgZWxlbWVudCB0eXBlOgotVUlfTEFCRUxfTkVYVF9DQVRBTE9HCQkJCSA9IE5leHQgY2F0YWxvZwotVUlfTEFCRUxfREVMRUdBVEVfQ0FUQUxPRwkJCSA9IERlbGVnYXRlIGNhdGFsb2cKLVVJX0xBQkVMX1JFV1JJVEVfRU5UUlkJCQkJID0gUmV3cml0ZQotVUlfTEFCRUxfU1VGRklYX0VOVFJZCQkJCSA9IFN1ZmZpeAotVUlfTEFCRUxfRU5UUllfRUxFTUVOVF9DT0xPTgkJID0gRW50cnkgZWxlbWVudDoKLVVJX0xBQkVMX1BVQkxJQwkJCQkJCSA9IFB1YmxpYwotVUlfTEFCRUxfU1lTVEVNCQkJCQkJID0gU3lzdGVtCi0KLVVJX1dBUk5JTkdfVVJJX05PVF9GT1VORF9DT0xPTiAgICAgICA9IFRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgY2FuJ3QgYmUgbG9jYXRlZCA6Ci1VSV9XQVJOSU5HX1NIT1VMRF9CRV9GVUxMWV9RVUFMSUZJRURfVVJJID0gV2FybmluZzogdGhlIGtleSB2YWx1ZSBzaG91bGQgYmUgYSBmdWxseSBxdWFsaWZpZWQgVVJJCi1VSV9XQVJOSU5HX1VSSV9OT1RfRk9VTkRfTE9ORyAgICAgICAgPSBUaGUgc3BlY2lmaWVkIGZpbGUgY2Fubm90IGJlIGZvdW5kLiBJdCBtYXkgaGF2ZSBiZWVuIG1vdmVkIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uLiBJZiB0aGUgZmlsZSBpcyBsb2NhdGVkIHJlbW90ZWx5LCBhIG5ldHdvcmsgY29ubmVjdGlvbiBjYW5ub3QgYmUgZXN0YWJsaXNoZWQgdG8gdGhlIHJlbW90ZSBsb2NhdGlvbi4gCi1VSV9XQVJOSU5HX0lOVkFMSURfRklMRSAgICAgICAgICAgICAgPSBUaGUgc3BlY2lmaWVkIGZpbGUgaXMgaW52YWxpZC4KLVVJX1dBUk5JTkdfSU5WQUxJRF9GSUxFX0xPTkcgICAgICAgICA9IFRoZSBzcGVjaWZpZWQgZmlsZSBpcyBpbnZhbGlkLiBBIHByb3BlciBYTUwgZmlsZSBjYW5ub3QgYmUgZ2VuZXJhdGVkIGZyb20gaXQuIE9wZW4gdGhlIERURCBvciBYTUwgc2NoZW1hIGZpbGUsIGVkaXQgaXQgYXMgbmVjZXNzYXJ5LCB2YWxpZGF0ZSBpdCBhbmQgdHJ5IGFnYWluLgotVUlfV0FSTklOR19OT19FTEVNRU5UICAgICAgICAgICAgICAgID0gVGhlIHNwZWNpZmllZCBmaWxlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZWxlbWVudCBkZWNsYXJhdGlvbi4KLVVJX1dBUk5JTkdfTk9fRUxFTUVOVF9EVERfTE9ORyAgICAgICA9IFRoZSBzcGVjaWZpZWQgZmlsZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGVsZW1lbnQgZGVjbGFyYXRpb24gdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgcm9vdCBlbGVtZW50IGluIHRoZSBnZW5lcmF0ZWQgWE1MIGZpbGUuCi1VSV9XQVJOSU5HX05PX0VMRU1FTlRfWFNEX0xPTkcgICAgICAgPSBUaGUgc3BlY2lmaWVkIGZpbGUgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIHRoZSByb290IGVsZW1lbnQgaW4gdGhlIGdlbmVyYXRlZCBYTUwgZmlsZS4KLVVJX1dBUk5JTkdfRFVQTElDQVRFX0VOVFJZCQkJID0gVGhlIHNwZWNpZmllZCBlbnRyeSBpcyBpbnZhbGlkLiBBbiBleGlzdGluZyBlbnRyeSBoYXMgdGhlIHNhbWUga2V5IGFuZCBrZXkgdHlwZS4KLVVJX1dBUk5JTkdfRFVQTElDQVRFX1NVRkZJWAkJCSA9IFRoZSBzcGVjaWZpZWQgc3VmZml4IGlzIGludmFsaWQuIEFuIGV4aXN0aW5nIGVudHJ5IGhhcyB0aGUgc2FtZSBrZXkgdHlwZSBhbmQgc3VmZml4LgotVUlfV0FSTklOR19EVVBMSUNBVEVfUkVXUklURQkJID0gVGhlIHNwZWNpZmllZCByZXdyaXRlIHN0YXJ0IHN0cmluZyBpcyBpbnZhbGlkLiBBbiBleGlzdGluZyBlbnRyeSBoYXMgdGhlIHNhbWUgc3RhcnQgc3RyaW5nLgotVUlfV0FSTklOR19EVVBMSUNBVEVfREVMRUdBVEUJCSA9IFRoZSBzcGVjaWZpZWQgZGVsZWdhdGUgc3RhcnQgc3RyaW5nIGlzIGludmFsaWQuIEFuIGV4aXN0aW5nIGVudHJ5IGhhcyB0aGUgc2FtZSBwcmVmaXguCi0KLQotIU5ld01vZGVsV2l6YXJkCi1VSV9JTlZBTElEX0dSQU1NQVJfRVJST1IgICAgICAgICAgICAgPSBJbnZhbGlkIEdyYW1tYXIKLVVJX0JVVFRPTl9CUk9XU0UgICAgICAgICAgICAgICAgICAgICA9ICZCcm93c2UuLi4KLQotIVhNTENhdGFsb2dJZE1hcHBpbmdQYWdlCi1VSV9MQUJFTF9NQVBfVE8gICAgICAgICAgICAgICAgICAgICAgPSBNYXAgdG86Ci1VSV9MQUJFTF9NQVBfRlJPTSAgICAgICAgICAgICAgICAgICAgPSBNYXAgZnJvbToKLVVJX0JVVFRPTl9ORVcgICAgICAgICAgICAgICAgICAgICAgICA9ICZBZGQuLi4KLVVJX0JVVFRPTl9FRElUICAgICAgICAgICAgICAgICAgICAgICA9ICZFZGl0Li4uCi1VSV9CVVRUT05fREVMRVRFICAgICAgICAgICAgICAgICAgICAgPSAmRGVsZXRlCi1VSV9CVVRUT05fUkVNT1ZFICAgICAgICAgICAgICAgICAgICAgPSAmUmVtb3ZlCi1VSV9MQUJFTF9ORVdfRElBTE9HX1RJVExFICAgICAgICAgICAgPSBBZGQgWE1MIENhdGFsb2cgRWxlbWVudAotVUlfTEFCRUxfRURJVF9ESUFMT0dfVElUTEUgICAgICAgICAgID0gRWRpdCBYTUwgQ2F0YWxvZyBFbGVtZW50Ci0KLQotIVhNTENhdGFsb2dQcmVmZXJlbmNlUGFnZQotVUlfTEFCRUxfVVNFUl9FTlRSSUVTICAgICAgICAgICAgICAgID0gWE1MIENhdGFsb2cgRW50cmllcwotVUlfTEFCRUxfVVNFUl9FTlRSSUVTX1RPT0xfVElQICAgICAgID0gWE1MIENhdGFsb2cgZW50cmllcyB0aGF0IGhhdmUgYmVlbiBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKLVVJX0xBQkVMX1NZU1RFTV9FTlRSSUVTICAgICAgICAgICAgICA9IFBsdWctaW4gc3BlY2lmaWVkIGVudHJpZXMKLVVJX0xBQkVMX1NZU1RFTV9FTlRSSUVTX1RPT0xfVElQICAgICA9IFhNTCBDYXRhbG9nIGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gc3BlY2lmaWVkIGJ5IGEgcGx1Zy1pbgotVUlfQlVUVE9OX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgID0gQ2hhbmdlLi4uCi1VSV9MQUJFTF9TRUxFQ1RfUFJPSkVDVCAgICAgICAgICAgICAgPSBTZWxlY3QgUHJvamVjdAotVUlfTEFCRUxfU1BFQ0lGWV9QUk9KRUNUX0RFU0NSSVBUSU9OID0gU3BlY2lmeSB0aGUgcHJvamVjdCB0byBwZXJzaXN0IHRoZSBYTUwgQ2F0YWxvZyBpbmZvcm1hdGlvbgotVUlfV0FSTklOR19OT19QUk9KRUNUU19DUkVBVEVEICAgICAgID0gTm8gcHJvamVjdHMgaGF2ZSBiZWVuIGNyZWF0ZWQgeWV0LgotVUlfV0FSTklOR19QUk9KRUNUX05PVF9TUEVDSUZJRUQgICAgID0gQSBwcm9qZWN0IG5hbWUgaGFzIG5vdCBiZWVuIHNwZWNpZmllZC4KLVVJX1dBUk5JTkdfUFJPSkVDVF9ET0VTX05PVF9FWElTVCAgICA9IFRoZSBzcGVjaWZpZWQgcHJvamVjdCBkb2VzIG5vdCBleGlzdC4KLVVJX0xBQkVMX1BST0pFQ1RfVE9fVVNFICAgICAgICAgICAgICA9IFByb2plY3QgdG8gdXNlIHRvIHBlcnNpc3QgWE1MIENhdGFsb2cgVXNlciBFbnRyaWVzOiAKLVVJX0xBQkVMX0NBVEFMT0dfU0FWRV9FUlJPUiAgICAgICAgICA9IFhNTCBDYXRhbG9nIFNhdmUgRXJyb3IKLVVJX0xBQkVMX0NBVEFMT0dfQ09VTERfTk9UX0JFX1NBVkVEICA9IFRoZSBYTUwgQ2F0YWxvZyBlbnRyeSBjb3VsZCBub3QgYmUgc2F2ZWQuCi1VSV9MQUJFTF9BRFZBTkNFRCAgICAgICAgICAgICAgICAgICAgPSAmQWR2YW5jZWQuLi4KLVVJX0xBQkVMX0FEVkFOQ0VEX1hNTF9DQVRBTE9HX1BSRUZTICA9IEFkdmFuY2VkIFhNTCBDYXRhbG9nIFByZWZlcmVuY2VzICAgCi1VSV9MQUJFTF9TUEVDSUZZX1BFUlNJU1RFTkNFX0ZJTEUgICAgPSAmU3BlY2lmeSBhIGZpbGUgdG8gdXNlIHRvIHBlcnNpc3QgdGhlIFhNTCBDYXRhbG9nIGluZm9ybWF0aW9uLgotVUlfTEFCRUxfU0FWRV9DQVRBTE9HX0RJQUxPR19USVRMRSAgID0gU2F2ZSBDaGFuZ2VzCi1VSV9MQUJFTF9TQVZFX0NBVEFMT0dfRElBTE9HX0RFU0MgICAgPSBZb3UgaGF2ZSBtYWRlIHVuc2F2ZWQgY2hhbmdlcyB0byB0aGUgY3VycmVudCBYTUwgQ2F0YWxvZyBzZXR0aW5ncy4gRG8geW91IHdpc2ggdG8gc2F2ZSB5b3VyIGNoYW5nZXMgYmVmb3JlIGxvYWRpbmcgdGhlIG5ldyBYTUwgQ2F0YWxvZyBzZXR0aW5ncz8gICAKLVVJX0xBQkVMX0JST1dTRV9DQVRBTE9HX0ZJTEVfVElUTEUgICA9IFNlbGVjdCBGb2xkZXIKLVVJX0xBQkVMX0JST1dTRV9DQVRBTE9HX0ZJTEVfREVTQyAgICA9IFNlbGVjdCB0aGUgZm9sZGVyIHRoYXQgY29udGFpbnMgdGhlICcueG1sY2F0YWxvZycgZmlsZS4gICAKLVVJX0xBQkVMX0RFVEFJTFMgICAgICAgICAgICAgICAgICAgICA9IERldGFpbHMKLVVJX0xBQkVMX1VTRVJfU1BFQ0lGSUVEX0VOVFJJRVMgICAgICA9IFVzZXIgU3BlY2lmaWVkIEVudHJpZXMKLVVJX0xBQkVMX1BMVUdJTl9TUEVDSUZJRURfRU5UUklFUyAgICA9IFBsdWdpbiBTcGVjaWZpZWQgRW50cmllcwotVUlfTEFCRUxfRklMRV9TRUxFQ1RJT04JCQkJID0gRmlsZSBTZWxlY3Rpb24KLVVJX0xBQkVMX0NIT09TRV9GSUxFX1RPX0FERF9UT19DQVRBTE9HCQkJCSA9IENob29zZSBhIGZpbGUgdG8gYWRkIHRvIHRoZSBYTUwgQ2F0YWxvZwotIAotIUFkdmFuY2VkT3B0aW9uc0RpYWxvZwotVUlfTEFCRUxfRElBTE9HX0RFU0NSSVBUSU9OICAgICAgICAgID0gVXNlIHRoZSBidXR0b25zIGJlbG93IHRvIGltcG9ydCBvciBleHBvcnQgWE1MIENhdGFsb2cgc2V0dGluZ3MuCi1VSV9CVVRUT05fSU1QT1JUICAgICAgICAgICAgICAgICAgICAgPSBJbXBvcnQuLi4KLVVJX0JVVFRPTl9FWFBPUlQgICAgICAgICAgICAgICAgICAgICA9IEV4cG9ydC4uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLVVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfVElUTEUgICAgICAgICA9IEltcG9ydCBYTUwgQ2F0YWxvZyBTZXR0aW5ncwotVUlfTEFCRUxfSU1QT1JUX0RJQUxPR19IRUFESU5HICAgICAgID0gU3BlY2lmeSBYTUwgQ2F0YWxvZyBGaWxlCi1VSV9MQUJFTF9JTVBPUlRfRElBTE9HX01FU1NBR0UgICAgICAgPSBTcGVjaWZ5IHRoZSBmaWxlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGxvYWQgdGhlIFhNTCBDYXRhbG9nIFNldHRpbmdzCi0KLVVJX0xBQkVMX0VYUE9SVF9ESUFMT0dfVElUTEUgICAgICAgICA9IEV4cG9ydCBYTUwgQ2F0YWxvZyBTZXR0aW5ncwotVUlfTEFCRUxfRVhQT1JUX0RJQUxPR19IRUFESU5HICAgICAgID0gU3BlY2lmeSBYTUwgQ2F0YWxvZyBGaWxlCi1VSV9MQUJFTF9FWFBPUlRfRElBTE9HX01FU1NBR0UgICAgICAgPSBTcGVjaWZ5IHRoZSBmaWxlIHRoYXQgd2lsbCB1c2VkIHRvIHNhdmUgdGhlIFhNTCBDYXRhbG9nIFNldHRpbmcKLUVSUk9SX1NBVklOR19GSUxFCQkJCQkgPSBFcnJvciBzYXZpbmcgZmlsZSAlMQotVUlfTEFCRUxfRklMRV9JU19SRUFEX09OTFkgICAgICAgICAgID0gRmlsZSAlMSBpcyByZWFkIG9ubHkKLQotVUlfTEFCRUxfU1RBUlRfU1RSSU5HID0gU3RhcnQgc3RyaW5nOgotVUlfTEFCRUxfUkVXUklURV9QUkVGSVggPSBSZXdyaXRlIHByZWZpeDoKLQotVUlfTEFCRUxfREVUQUlMU19TVUZGSVhfQ09MT04gPSBTdWZmaXg6Ci0KLUVkaXRDYXRhbG9nRW50cnlEaWFsb2dfY2F0YWxvZ0VudHJ5TGFiZWw9JkNhdGFsb2cgRW50cnkKLUVkaXRDYXRhbG9nRW50cnlEaWFsb2dfbmV4dENhdGFsb2dMYWJlbD0mTmV4dCBDYXRhbG9nCi1FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nX3Jld3JpdGVFbnRyeUxhYmVsPSZSZXdyaXRlIEVudHJ5Ci1FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nX3N1ZmZpeEVudHJ5TGFiZWw9JlN1ZmZpeCBFbnRyeQotRWRpdENhdGFsb2dFbnRyeURpYWxvZ19kZWxlZ2F0ZUNhdGFsb2dMYWJlbD0mRGVsZWdhdGUgQ2F0YWxvZwotVUlfQlVUVE9OX01FTlVfQlJPV1NFX1dPUktTUEFDRT0mV29ya3NwYWNlLi4uCi1VSV9CVVRUT05fTUVOVV9CUk9XU0VfRklMRV9TWVNURU09JkZpbGUgU3lzdGVtLi4uCi1VSV9MQUJFTF9TRUxFQ1RfRklMRV9GSUxURVJfQ09OVFJPTD1GaWxlcyBvZiB0eXBlOgotVUlfVEVYVF9TRUxFQ1RfRklMRV9GSUxURVJfQ09OVFJPTD1BbGwgU3VwcG9ydGVkIEZpbGVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dUcmVlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dUcmVlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NjFkMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nVHJlZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5UZXh0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklEZWxlZ2F0ZUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklSZXdyaXRlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSVN1ZmZpeEVudHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nVHJlZVZpZXdlciBleHRlbmRzIFRyZWVWaWV3ZXIgewotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgeG1sQ2F0YWxvZ0ltYWdlID0gSW1hZ2VGYWN0b3J5LklOU1RBTkNFLmdldEltYWdlKCJpY29ucy9vYmoxNi94bWxjYXRhbG9nX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZXJyb3JJbWFnZSA9IEltYWdlRmFjdG9yeS5JTlNUQU5DRS5nZXRJbWFnZSgiaWNvbnMvb3ZyMTYvZXJyb3Itb3ZlcmxheS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZW50cnlJbWFnZSA9IEltYWdlRmFjdG9yeS5JTlNUQU5DRS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYvZW50cnlfb2JqLnBuZyIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBuZXh0Q2F0YWxvZ0ltYWdlID0gSW1hZ2VGYWN0b3J5LklOU1RBTkNFLmdldEltYWdlKCJpY29ucy9vYmoxNi9uZXh0Q2F0YWxvZ19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIHJld3JpdGVFbnRyeUltYWdlID0gSW1hZ2VGYWN0b3J5LklOU1RBTkNFLmdldEltYWdlKCJpY29ucy9vYmoxNi9yZXdyaXRlX2VudHJ5LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBzdWZmaXhFbnRyeUltYWdlID0gSW1hZ2VGYWN0b3J5LklOU1RBTkNFLmdldEltYWdlKCJpY29ucy9vYmoxNi9zdWZmaXhfZW50cnkuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGRlbGVnYXRlQ2F0YWxvZ0ltYWdlID0gSW1hZ2VGYWN0b3J5LklOU1RBTkNFLmdldEltYWdlKCJpY29ucy9vYmoxNi9kZWxlZ2F0ZV9jYXRhbG9nLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBFUlJPUl9TVEFURV9LRVkgPSAiZXJyb3JzdGF0ZWtleSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJQ2F0YWxvZyBmV29ya2luZ1VzZXJDYXRhbG9nOwotCXByb3RlY3RlZCBJQ2F0YWxvZyBmU3lzdGVtQ2F0YWxvZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVTRVJfU1BFQ0lGSUVEX0VOVFJJRVNfT0JKRUNUID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1VTRVJfU1BFQ0lGSUVEX0VOVFJJRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUExVR0lOX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVCA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9QTFVHSU5fU1BFQ0lGSUVEX0VOVFJJRVM7Ci0KLQlwdWJsaWMgWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUNhdGFsb2cgd29ya2luZ1VzZXJDYXRhbG9nLCBJQ2F0YWxvZyBzeXN0ZW1DYXRhbG9nKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCXRoaXMuZldvcmtpbmdVc2VyQ2F0YWxvZyA9IHdvcmtpbmdVc2VyQ2F0YWxvZzsKLQkJdGhpcy5mU3lzdGVtQ2F0YWxvZyA9IHN5c3RlbUNhdGFsb2c7Ci0KLQkJc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDYXRhbG9nRW50cnlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXNldExhYmVsUHJvdmlkZXIobmV3IENhdGFsb2dFbnRyeUxhYmVsUHJvdmlkZXIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBleHRlbnNpb25zKSB7Ci0JCXJlc2V0RmlsdGVycygpOwotCQlhZGRGaWx0ZXIobmV3IFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlcihleHRlbnNpb25zKSk7Ci0JfQotCi0JcHVibGljIGNsYXNzIENhdGFsb2dFbnRyeUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJcHJvdGVjdGVkIEhhc2hNYXAgaW1hZ2VUYWJsZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpIHsKLQkJCQlJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBvYmplY3Q7Ci0JCQkJcmVzdWx0ID0gY2F0YWxvZ0VudHJ5LmdldEtleSgpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVN1ZmZpeEVudHJ5KSB7Ci0JCQkJSVN1ZmZpeEVudHJ5IGVudHJ5ID0gKElTdWZmaXhFbnRyeSkgb2JqZWN0OwotCQkJCXJlc3VsdCA9ICJbLi4uXSIgKyBlbnRyeS5nZXRTdWZmaXgoKSArICIgIiArIFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9BUlJPVyArICIgIiArIGVudHJ5LmdldFVSSSgpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJld3JpdGVFbnRyeSkgewotCQkJCUlSZXdyaXRlRW50cnkgZW50cnkgPSAoSVJld3JpdGVFbnRyeSkgb2JqZWN0OwotCQkJCXJlc3VsdCA9IGVudHJ5LmdldFN0YXJ0U3RyaW5nKCkgKyAiWy4uLl0gIiArIFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9BUlJPVyArICIgIiArIGVudHJ5LmdldFJld3JpdGVQcmVmaXgoKSArICJbLi4uXSI7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJTmV4dENhdGFsb2cpIHsKLQkJCQlJTmV4dENhdGFsb2cgbmV4dENhdGFsb2cgPSAoSU5leHRDYXRhbG9nKSBvYmplY3Q7Ci0JCQkJLy8gcmVzdWx0ID0gbmV4dENhdGFsb2cuZ2V0Q2F0YWxvZ0xvY2F0aW9uKCk7Ci0JCQkJcmVzdWx0ID0gVVJJVXRpbHMuY29udmVydFVSSVRvTG9jYXRpb24obmV4dENhdGFsb2cuZ2V0Q2F0YWxvZ0xvY2F0aW9uKCkpOwotCQkJCWlmIChuZXh0Q2F0YWxvZy5nZXRDYXRhbG9nTG9jYXRpb24oKS5zdGFydHNXaXRoKCJmaWxlOiIpKSB7Ci0JCQkJCXJlc3VsdCArPSAiICgiICsgWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0ZJTEVfU1lTVEVNX1JFU09VUkNFICsgIikiOwotCQkJCX0KLQkJCQllbHNlIGlmIChuZXh0Q2F0YWxvZy5nZXRDYXRhbG9nTG9jYXRpb24oKS5zdGFydHNXaXRoKCJwbGF0Zm9ybToiKSkgewotCQkJCQlyZXN1bHQgKz0gIiAoIiArIFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9QTEFURk9STV9SRVNPVVJDRSArICIpIjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJRGVsZWdhdGVDYXRhbG9nKSB7Ci0JCQkJSURlbGVnYXRlQ2F0YWxvZyBuZXh0Q2F0YWxvZyA9IChJRGVsZWdhdGVDYXRhbG9nKSBvYmplY3Q7Ci0JCQkJLy8gcmVzdWx0ID0gbmV4dENhdGFsb2cuZ2V0Q2F0YWxvZ0xvY2F0aW9uKCk7Ci0JCQkJcmVzdWx0ID0gbmV4dENhdGFsb2cuZ2V0U3RhcnRTdHJpbmcoKSArICIgIiArIFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9BUlJPVyArICIgIiArIFVSSVV0aWxzLmNvbnZlcnRVUklUb0xvY2F0aW9uKG5leHRDYXRhbG9nLmdldENhdGFsb2dMb2NhdGlvbigpKTsKLQkJCQlpZiAobmV4dENhdGFsb2cuZ2V0Q2F0YWxvZ0xvY2F0aW9uKCkuc3RhcnRzV2l0aCgiZmlsZToiKSkgewotCQkJCQlyZXN1bHQgKz0gIiAoIiArIFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9GSUxFX1NZU1RFTV9SRVNPVVJDRSArICIpIjsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobmV4dENhdGFsb2cuZ2V0Q2F0YWxvZ0xvY2F0aW9uKCkuc3RhcnRzV2l0aCgicGxhdGZvcm06IikpIHsKLQkJCQkJcmVzdWx0ICs9ICIgKCIgKyBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfUExBVEZPUk1fUkVTT1VSQ0UgKyAiKSI7Ci0JCQkJfQotCQkJfQotCQkJcmVzdWx0ID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKHJlc3VsdCk7Ci0JCQlyZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiBvYmplY3QudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQlJbWFnZSByZXN1bHQgPSBudWxsOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCXJlc3VsdCA9IHhtbENhdGFsb2dJbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpIHsKLQkJCQlJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBvYmplY3Q7Ci0JCQkJU3RyaW5nIHVyaSA9IGNhdGFsb2dFbnRyeS5nZXRVUkkoKTsKLQkJCQlyZXN1bHQgPSBnZXRSZXNvdXJjZUltYWdlKHVyaSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJTmV4dENhdGFsb2cpIHsKLQkJCQkvLyBUT0RPOiBhZGQgaW1hZ2UgdG8gdGhlIGltYWdlVGFibGUgYW5kIGFkZCBlcnJvciBvdmVybGF5IGlmCi0JCQkJLy8gbmV4dCBjYXRhbG9nIFVSSSBpcyBub3QgcmVhZGFibGUKLQkJCQlyZXN1bHQgPSBuZXh0Q2F0YWxvZ0ltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSURlbGVnYXRlQ2F0YWxvZykgewotCQkJCS8vIFRPRE86IGFkZCBpbWFnZSB0byB0aGUgaW1hZ2VUYWJsZSBhbmQgYWRkIGVycm9yIG92ZXJsYXkgaWYKLQkJCQkvLyBuZXh0IGNhdGFsb2cgVVJJIGlzIG5vdCByZWFkYWJsZQotCQkJCXJlc3VsdCA9IGRlbGVnYXRlQ2F0YWxvZ0ltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVN1ZmZpeEVudHJ5KSB7Ci0JCQkJLy8gVE9ETzogYWRkIGltYWdlIHRvIHRoZSBpbWFnZVRhYmxlIGFuZCBhZGQgZXJyb3Igb3ZlcmxheSBpZgotCQkJCS8vIG5leHQgY2F0YWxvZyBVUkkgaXMgbm90IHJlYWRhYmxlCi0JCQkJcmVzdWx0ID0gc3VmZml4RW50cnlJbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElSZXdyaXRlRW50cnkpIHsKLQkJCQkvLyBUT0RPOiBhZGQgaW1hZ2UgdG8gdGhlIGltYWdlVGFibGUgYW5kIGFkZCBlcnJvciBvdmVybGF5IGlmCi0JCQkJLy8gbmV4dCBjYXRhbG9nIFVSSSBpcyBub3QgcmVhZGFibGUKLQkJCQlyZXN1bHQgPSByZXdyaXRlRW50cnlJbWFnZTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwcml2YXRlIEltYWdlIGdldFJlc291cmNlSW1hZ2UoU3RyaW5nIHVyaSkgewotCQkJSW1hZ2UgcmVzdWx0ID0gbnVsbDsKLQkJCUltYWdlIGJhc2UgPSBudWxsOwotCi0JCQlJRWRpdG9yUmVnaXN0cnkgZXIgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yKHVyaSk7Ci0JCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgaW1hZ2VUYWJsZS5nZXQoaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJCQlpbWFnZVRhYmxlLnB1dChpbWFnZURlc2NyaXB0b3IsIGltYWdlKTsKLQkJCX0KLQkJCWJhc2UgPSBpbWFnZTsKLQotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCS8vIFRPRE86IFRoaXMgc2hvdWxkIGJlIG1vdmVkIGludG8gdGhlIGNhdGFsb2cKLQkJCQlpZiAoVVJJSGVscGVyLmlzUmVhZGFibGVVUkkodXJpLCBmYWxzZSkpIHsKLQkJCQkJcmVzdWx0ID0gYmFzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IEltYWdlRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVDb21wb3NpdGVJbWFnZShiYXNlLCBlcnJvckltYWdlLCBJbWFnZUZhY3RvcnkuQk9UVE9NX0xFRlQpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGltYWdlVGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCSgoSW1hZ2UpIGl0Lm5leHQoKSkuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgY2xhc3MgQ2F0YWxvZ0VudHJ5Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCQlwcm90ZWN0ZWQgT2JqZWN0W10gcm9vdHM7Ci0KLQkJcHVibGljIENhdGFsb2dFbnRyeUNvbnRlbnRQcm92aWRlcigpIHsKLQkJCXJvb3RzID0gbmV3IE9iamVjdFsyXTsKLQkJCXJvb3RzWzBdID0gVVNFUl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1Q7Ci0JCQlyb290c1sxXSA9IFBMVUdJTl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1Q7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1Jvb3QoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHx8IChvYmplY3QgaW5zdGFuY2VvZiBJTmV4dENhdGFsb2cpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gcm9vdHM7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMF07Ci0JCQlpZiAocGFyZW50RWxlbWVudCA9PSByb290c1swXSkgewotCQkJCXJlc3VsdCA9IGdldENoaWxkcmVuSGVscGVyKGZXb3JraW5nVXNlckNhdGFsb2cpOwotCQkJfQotCQkJZWxzZSBpZiAocGFyZW50RWxlbWVudCA9PSByb290c1sxXSkgewotCQkJCXJlc3VsdCA9IGdldENoaWxkcmVuSGVscGVyKGZTeXN0ZW1DYXRhbG9nKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJTmV4dENhdGFsb2cpIHsKLQkJCQlJQ2F0YWxvZyBuZXh0Q2F0YWxvZyA9ICgoSU5leHRDYXRhbG9nKSBwYXJlbnRFbGVtZW50KS5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCQkJCXJlc3VsdCA9IGdldENoaWxkcmVuSGVscGVyKG5leHRDYXRhbG9nKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJRGVsZWdhdGVDYXRhbG9nKSB7Ci0JCQkJSUNhdGFsb2cgbmV4dENhdGFsb2cgPSAoKElEZWxlZ2F0ZUNhdGFsb2cpIHBhcmVudEVsZW1lbnQpLmdldFJlZmVyZW5jZWRDYXRhbG9nKCk7Ci0JCQkJcmVzdWx0ID0gZ2V0Q2hpbGRyZW5IZWxwZXIobmV4dENhdGFsb2cpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3RbXSBnZXRDaGlsZHJlbkhlbHBlcihJQ2F0YWxvZyBjYXRhbG9nKSB7Ci0KLQkJCUlDYXRhbG9nRW50cnlbXSBlbnRyaWVzID0gY2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpOwotCQkJaWYgKGVudHJpZXMubGVuZ3RoID4gMCkgewotCQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotCQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQkJCWludCByZXN1bHQgPSAwOwotCQkJCQkJaWYgKChvMSBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpICYmIChvMiBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpKSB7Ci0JCQkJCQkJSUNhdGFsb2dFbnRyeSBlbnRyeTEgPSAoSUNhdGFsb2dFbnRyeSkgbzE7Ci0JCQkJCQkJSUNhdGFsb2dFbnRyeSBlbnRyeTIgPSAoSUNhdGFsb2dFbnRyeSkgbzI7Ci0JCQkJCQkJcmVzdWx0ID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGVudHJ5MS5nZXRLZXkoKSwgZW50cnkyLmdldEtleSgpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCUFycmF5cy5zb3J0KGVudHJpZXMsIGNvbXBhcmF0b3IpOwotCQkJfQotCQkJVmVjdG9yIHJlc3VsdCA9IG5ldyBWZWN0b3IoKTsKLQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChlbnRyaWVzKSk7Ci0JCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoY2F0YWxvZy5nZXRSZXdyaXRlRW50cmllcygpKSk7Ci0JCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoY2F0YWxvZy5nZXRTdWZmaXhFbnRyaWVzKCkpKTsKLQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChjYXRhbG9nLmdldERlbGVnYXRlQ2F0YWxvZ3MoKSkpOwotCQkJSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gY2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLQkJCUxpc3QgbmV4dENhdGFsb2dzTGlzdCA9IEFycmF5cy5hc0xpc3QobmV4dENhdGFsb2dzKTsKLQkJCXJlc3VsdC5hZGRBbGwobmV4dENhdGFsb2dzTGlzdCk7Ci0KLQkJCXJldHVybiByZXN1bHQudG9BcnJheShuZXcgSUNhdGFsb2dFbGVtZW50W3Jlc3VsdC5zaXplKCldKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpID8gbnVsbCA6IFVTRVJfU1BFQ0lGSUVEX0VOVFJJRVNfT0JKRUNUOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBpc1Jvb3QoZWxlbWVudCkgPyBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwIDogZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJLy8gbm90aGluZyB0byBkaXNwb3NlCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZCwgT2JqZWN0IG5ld29iaikgewotCQkJLy8gSVNTVUU6IHNlZW1zIHdlIHNob3VsZCBkbyBzb21ldGhpbmcgaGVyZQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCi0JY2xhc3MgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQkJcHJvdGVjdGVkIFN0cmluZ1tdIGV4dGVuc2lvbnM7Ci0KLQkJcHVibGljIFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlcihTdHJpbmdbXSBleHRlbnNpb25zMSkgewotCQkJdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczE7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0ZpbHRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBPYmplY3QgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCUlDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIGVsZW1lbnQ7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChjYXRhbG9nRW50cnkuZ2V0VVJJKCkuZW5kc1dpdGgoZXh0ZW5zaW9uc1tpXSkpIHsKLQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGVsZW1lbnQuZXF1YWxzKFhNTENhdGFsb2dUcmVlVmlld2VyLlBMVUdJTl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1QpIHx8IGVsZW1lbnQuZXF1YWxzKFhNTENhdGFsb2dUcmVlVmlld2VyLlVTRVJfU1BFQ0lGSUVEX0VOVFJJRVNfT0JKRUNUKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTFF1aWNrU2Nhbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxRdWlja1NjYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzNTM5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTFF1aWNrU2Nhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxRdWlja1NjYW4gewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZVVSSUZvclNjaGVtYShTdHJpbmcgdXJpKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwodXJpKTsKLQkJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCXJlc3VsdCA9IFhNTFF1aWNrU2Nhbi5nZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEoaW5wdXRTdHJlYW0pOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hKElucHV0U3RyZWFtIGlucHV0KSB7Ci0JCVRhcmdldE5hbWVzcGFjZVVSSUNvbnRlbnRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgVGFyZ2V0TmFtZXNwYWNlVVJJQ29udGVudEhhbmRsZXIoKTsKLQkJQ2xhc3NMb2FkZXIgcHJldkNsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQkJdHJ5IHsKLQkJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKFhNTFF1aWNrU2Nhbi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLQkJCVNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCWZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCQlTQVhQYXJzZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkJCXBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW5wdXQpLCBoYW5kbGVyKTsKLQkJfQotCQljYXRjaCAoU3RvcFBhcnNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHRoaXMgaXMgYSBub3JtYWwgZXhjZXB0aW9uIHRvIHN0b3AgcGFyc2luZyBlYXJseSwKLQkJCS8vIHdoZW4gaW5mbyBpcyBmb3VuZCwgc28gd2UgY2FuIHNhZmVseSBpZ25vcmUKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHByZXZDbGFzc0xvYWRlcik7Ci0JCX0KLQkJcmV0dXJuIGhhbmRsZXIudGFyZ2V0TmFtZXNwYWNlVVJJOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcCBwYXJzaW5nIHdoZW4gcmVxdWlyZWQKLQkgKiBpbmZvcm1hdGlvbiBpcyBmb3VuZC4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgU3RvcFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHsKLQkJc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RvciBTdG9wUGFyc2VFeGNlcHRpb24uCi0JCSAqLwotCQlTdG9wUGFyc2VFeGNlcHRpb24oKSB7Ci0JCQlzdXBlcigidGFyZ2V0bmFtZXNwYWNlIGZvdW5kLCBubyBuZWVkIHRvIGNvbnRpbnVlIHRoZSBwYXJzZSIpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFRhcmdldE5hbWVzcGFjZVVSSUNvbnRlbnRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCQlwdWJsaWMgU3RyaW5nIHRhcmdldE5hbWVzcGFjZVVSSTsKLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJaWYgKGxvY2FsTmFtZS5lcXVhbHMoInNjaGVtYSIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJaW50IG5BdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5BdHRyaWJ1dGVzOyBpKyspIHsKLQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0TG9jYWxOYW1lKGkpLmVxdWFscygidGFyZ2V0TmFtZXNwYWNlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJdGFyZ2V0TmFtZXNwYWNlVVJJID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IFN0b3BQYXJzZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9ldG9vbDUwL2NhdGFsb2dFbnRyeS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL2V0b29sNTAvY2F0YWxvZ0VudHJ5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY1YjI4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL2V0b29sNTAvY2F0YWxvZ0VudHJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvZXRvb2w1MC9kZWxlZ2F0ZUNhdGFsb2cuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9ldG9vbDUwL2RlbGVnYXRlQ2F0YWxvZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZDg1ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9ldG9vbDUwL2RlbGVnYXRlQ2F0YWxvZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL2V0b29sNTAvbmV4dENhdGFsb2cuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9ldG9vbDUwL25leHRDYXRhbG9nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E5MzRiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL2V0b29sNTAvbmV4dENhdGFsb2cuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9ldG9vbDUwL3ByZWZpeC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL2V0b29sNTAvcHJlZml4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4NzY5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL2V0b29sNTAvcHJlZml4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvZXRvb2w1MC9yZXdyaXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvZXRvb2w1MC9yZXdyaXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAwMzA2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL2V0b29sNTAvcmV3cml0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL2V0b29sNTAvc3VmaXguZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9ldG9vbDUwL3N1Zml4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkNWI0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL2V0b29sNTAvc3VmaXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi9jYXRhbG9nX2VudHJ5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvY2F0YWxvZ19lbnRyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyN2UzMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi9jYXRhbG9nX2VudHJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvZGVsZWdhdGVfY2F0YWxvZy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2RlbGVnYXRlX2NhdGFsb2cuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWJkMmQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvZGVsZWdhdGVfY2F0YWxvZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2VudHJ5X29iai5wbmcgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2VudHJ5X29iai5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNzE0NzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi9lbnRyeV9vYmoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi9maWxlX2V4cGFuZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2ZpbGVfZXhwYW5kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmOWJhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2ZpbGVfZXhwYW5kLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvZmlsZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi9maWxlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTE2MWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi9maWxlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L25leHRDYXRhbG9nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L25leHRDYXRhbG9nX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YmZlNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi9uZXh0Q2F0YWxvZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi9uZXh0X2NhdGFsb2cuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi9uZXh0X2NhdGFsb2cuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzZjYmM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvbmV4dF9jYXRhbG9nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvcmV3cml0ZV9lbnRyeS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L3Jld3JpdGVfZW50cnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2M4ZWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvcmV3cml0ZV9lbnRyeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L3N1ZmZpeF9lbnRyeS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L3N1ZmZpeF9lbnRyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNzY0MDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi9zdWZmaXhfZW50cnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi94bWxjYXRhbG9nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L3htbGNhdGFsb2dfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYxNDQxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L3htbGNhdGFsb2dfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb3ZyMTYvZXJyb3Itb3ZlcmxheS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL292cjE2L2Vycm9yLW92ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTlkY2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb3ZyMTYvZXJyb3Itb3ZlcmxheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9ET01Qcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9ET01Qcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZWJiNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvRE9NUHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlRleHRQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvcGVydGllcy5FbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotcHVibGljIGNsYXNzIERPTVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFDSyA9ICJoYWNrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIERPTVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkoKSB7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlQXR0cmlidXRlUHJvcGVydHlEZXNjcmlwdG9yKEF0dHIgYXR0cikgewotCQlJUHJvcGVydHlEZXNjcmlwdG9yIHJlc3VsdCA9IG51bGw7Ci0KLQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQotCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShhdHRyLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0KLQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQgPSBtcS5nZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotCQkJaWYgKGFkICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSB2YWx1ZXNBcnJheSA9IG1xLmdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMoYXR0ci5nZXRPd25lckVsZW1lbnQoKSwgYWQpOwotCQkJCWlmICgodmFsdWVzQXJyYXkgIT0gbnVsbCkgJiYgKHZhbHVlc0FycmF5Lmxlbmd0aCA+IDApKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBFbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWUsIHZhbHVlc0FycmF5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0cmlidXRlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVDREFUQVNlY3Rpb25Qcm9wZXJ0eURlc2NyaXB0b3IoQ0RBVEFTZWN0aW9uIGNkYXRhU2VjdGlvbikgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihIQUNLKTsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVDb21tZW50UHJvcGVydHlEZXNjcmlwdG9yKENvbW1lbnQgY29tbWVudCkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihIQUNLKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCVRleHRQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWUpOwotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVEb2N1bWVudFR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoRG9jdW1lbnRUeXBlIGRvY3VtZW50VHlwZSkgewotCQlyZXR1cm4gbnVsbDsgLy8gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoSEFDSywgSEFDSyk7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoSEFDSyk7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRW50aXR5UmVmZXJlbmNlUHJvcGVydHlEZXNjcmlwdG9yKEVudGl0eVJlZmVyZW5jZSBlbnRpdHlSZWZlcmVuY2UpIHsKLQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoSEFDSyk7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uUHJvcGVydHlEZXNjcmlwdG9yKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihIQUNLKTsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlJUHJvcGVydHlEZXNjcmlwdG9yIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQkJaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gY3JlYXRlQXR0cmlidXRlUHJvcGVydHlEZXNjcmlwdG9yKChBdHRyKSBub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9IGNyZWF0ZUNEQVRBU2VjdGlvblByb3BlcnR5RGVzY3JpcHRvcigoQ0RBVEFTZWN0aW9uKSBub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9IGNyZWF0ZUNvbW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoKENvbW1lbnQpIG5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gY3JlYXRlRG9jdW1lbnRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKChEb2N1bWVudFR5cGUpIG5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gY3JlYXRlRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcigoRWxlbWVudCkgbm9kZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDogewotCQkJCQlyZXN1bHQgPSBjcmVhdGVFbnRpdHlSZWZlcmVuY2VQcm9wZXJ0eURlc2NyaXB0b3IoKEVudGl0eVJlZmVyZW5jZSkgbm9kZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogewotCQkJCQlyZXN1bHQgPSBjcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25Qcm9wZXJ0eURlc2NyaXB0b3IoKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgbm9kZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQlyZXN1bHQgPSBjcmVhdGVUZXh0UHJvcGVydHlEZXNjcmlwdG9yKChUZXh0KSBub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlVGV4dFByb3BlcnR5RGVzY3JpcHRvcihUZXh0IHRleHQpIHsKLQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoSEFDSyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvSURlc2lnblZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvSURlc2lnblZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWJlOTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL0lEZXNpZ25WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURlc2lnblZpZXdlciB7Ci0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpOwotCi0JU3RyaW5nIGdldFRpdGxlKCk7Ci0KLQl2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCk7Ci0KLQlJU2VsZWN0aW9uUHJvdmlkZXIgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL0lEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMWEzZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLQotcHVibGljIGludGVyZmFjZSBJRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcyBJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCXB1YmxpYyB2b2lkIGluaXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnMoSUFjdGlvbkJhcnMgYmFycyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9Tb3VyY2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvU291cmNlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcwY2RkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9Tb3VyY2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSUV4dGVuZGVkQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLQotcHVibGljIGNsYXNzIFNvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgaW1wbGVtZW50cyBJRXh0ZW5kZWRDb250cmlidXRvciB7Ci0KLQlwcm90ZWN0ZWQgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yID0gbnVsbDsKLQlwcm90ZWN0ZWQgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yID0gbnVsbDsKLQlwcm90ZWN0ZWQgTXVsdGlQYWdlRWRpdG9yUGFydCBtdWx0aVBhZ2VFZGl0b3IgPSBudWxsOwotCi0JLy8gRWRpdG9yRXh0ZW5zaW9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnVpLlhNTE11bHRpUGFnZUVkaXRvclBhcnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJRXh0ZW5kZWRDb250cmlidXRvciBleHRlbmRlZENvbnRyaWJ1dG9yOwotCi0JcHVibGljIFNvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCQlzdXBlcigpOwotCi0JCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yID0gbmV3IFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvcigpOwotCi0JCS8vIFJlYWQgYWN0aW9uIGV4dGVuc2lvbnMuCi0JCUV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlciBidWlsZGVyID0gbmV3IEV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlcigpOwotCQlleHRlbmRlZENvbnRyaWJ1dG9yID0gYnVpbGRlci5yZWFkQWN0aW9uRXh0ZW5zaW9ucyhFRElUT1JfSUQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlzdXBlci5pbml0KGFjdGlvbkJhcnMpOwotCi0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLQkJCWluaXREZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcihhY3Rpb25CYXJzKTsKLQkJCWluaXRTb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcihhY3Rpb25CYXJzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXREZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcihJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCWlmIChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5pbml0KGFjdGlvbkJhcnMsIGdldFBhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0U291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlpZiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCkgewotCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IuaW5pdChhY3Rpb25CYXJzLCBnZXRQYWdlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWlmIChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5kaXNwb3NlKCk7Ci0JCX0KLQotCQlpZiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCkgewotCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkgewotCQkJZXh0ZW5kZWRDb250cmlidXRvci5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCW11bHRpUGFnZUVkaXRvciA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51KTsKLQotCQkvL2FkZFRvTWVudShtZW51KTsKLQotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb01lbnUobWVudSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElFeHRlbmRlZENvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb1BvcHVwTWVudShJTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY29udHJpYnV0ZVRvUG9wdXBNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0KLQkJYWRkVG9Qb3B1cE1lbnUobWVudSk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkgewotCQkJZXh0ZW5kZWRDb250cmlidXRvci5jb250cmlidXRlVG9Qb3B1cE1lbnUobWVudSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1BvcHVwTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQlzdXBlci5jb250cmlidXRlVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQotCQlhZGRUb1Rvb2xCYXIodG9vbEJhck1hbmFnZXIpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvVG9vbEJhcih0b29sQmFyTWFuYWdlcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb1N0YXR1c0xpbmUoSVN0YXR1c0xpbmVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUoSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvU3RhdHVzTGluZShtYW5hZ2VyKTsKLQotCQlhZGRUb1N0YXR1c0xpbmUobWFuYWdlcik7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkgewotCQkJZXh0ZW5kZWRDb250cmlidXRvci5jb250cmlidXRlVG9TdGF0dXNMaW5lKG1hbmFnZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9TdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRXh0ZW5kZWRDb250cmlidXRvciN1cGRhdGVUb29sYmFyQWN0aW9ucygpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVG9vbGJhckFjdGlvbnMoKSB7Ci0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IudXBkYXRlVG9vbGJhckFjdGlvbnMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJLy8gc2F2ZSBtdWx0aVBhZ2VFZGl0b3IgYmVmb3JlIGNhbGxpbmcKLQkJLy8gc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHRhcmdldEVkaXRvcikKLQkJLy8gc3VwZXIuc2V0QWN0aXZlRWRpdG9yIHdpbGwgY2FsbCBzZXRBY3RpdmVQYWdlKElFZGl0b3JQYXJ0Ci0JCS8vIGFjdGl2ZUVkaXRvcikKLQkJLy8gbXVsdGlQYWdlRWRpdG9yIGlzIG5lZWRlZCBpbiBzZXRBY3RpdmVQYWdlKElFZGl0b3JQYXJ0Ci0JCS8vIGFjdGl2ZUVkaXRvcikKLQkJaWYgKHRhcmdldEVkaXRvciBpbnN0YW5jZW9mIE11bHRpUGFnZUVkaXRvclBhcnQpIHsKLQkJCW11bHRpUGFnZUVkaXRvciA9IChNdWx0aVBhZ2VFZGl0b3JQYXJ0KSB0YXJnZXRFZGl0b3I7Ci0JCX0KLQotCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IodGFyZ2V0RWRpdG9yKTsKLQotCQl1cGRhdGVUb29sYmFyQWN0aW9ucygpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKHRhcmdldEVkaXRvcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYWdlKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotCQkvLyBUaGlzIGNvbnRyaWJ1dG9yIGlzIGRlc2lnbmVkIGZvciBTdHJ1Y3R1cmVkVGV4dE11bHRpUGFnZUVkaXRvclBhcnQuCi0JCS8vIFRvIHNhZmUtZ3VhcmQgdGhpcyBmcm9tIHByb2JsZW1zIGNhdXNlZCBieSB1bmV4cGVjdGVkIHVzYWdlIGJ5Ci0JCS8vIG90aGVyIGVkaXRvcnMsIHRoZSBmb2xsb3dpbmcKLQkJLy8gY2hlY2sgaXMgYWRkZWQuCi0JCWlmIChtdWx0aVBhZ2VFZGl0b3IgIT0gbnVsbCkgewotCQkJaWYgKChhY3RpdmVFZGl0b3IgIT0gbnVsbCkgJiYgKGFjdGl2ZUVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSkgewotCQkJCWFjdGl2YXRlU291cmNlUGFnZShhY3RpdmVFZGl0b3IpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWN0aXZhdGVEZXNpZ25QYWdlKGFjdGl2ZUVkaXRvcik7Ci0JCQl9Ci0JCX0KLQotCQl1cGRhdGVUb29sYmFyQWN0aW9ucygpOwotCi0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRBY3Rpb25CYXJzKCk7Ci0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLQkJCS8vIHVwZGF0ZSBtZW51IGJhciBhbmQgdG9vbCBiYXIKLQkJCWFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVEZXNpZ25QYWdlKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotCQlpZiAoKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwpICYmIChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciBpbnN0YW5jZW9mIElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikpIHsKLQkJCWRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihtdWx0aVBhZ2VFZGl0b3IpOwotCQl9Ci0KLQkJaWYgKChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKSAmJiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpKSB7Ci0JCQkvLyBpZiBkZXNpZ24gcGFnZSBpcyBub3QgcmVhbGx5IGFuIElFZGl0b3JQYXJ0LCBhY3RpdmVFZGl0b3IgPT0KLQkJCS8vIG51bGwsIHNvIHBhc3MgaW4gbXVsdGlQYWdlRWRpdG9yIGluc3RlYWQgKGQyODI0MTQpCi0JCQlpZiAoYWN0aXZlRWRpdG9yID09IG51bGwpIHsKLQkJCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IobXVsdGlQYWdlRWRpdG9yKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCQkJfQotCQkJKChJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKS5zZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFjdGl2YXRlU291cmNlUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJaWYgKChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsKSAmJiAoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpKSB7Ci0JCQlkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IobXVsdGlQYWdlRWRpdG9yKTsKLQkJfQotCi0JCWlmICgoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCkgJiYgKHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSkgewotCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCQkoKElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1NvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMWUyNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkNvbnRyaWJ1dG9yWE1MOwotCi0KLS8qKgotICogU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgZm9yIG11bHRpIHBhZ2UgZWRpdG9yJ3Mgc291cmNlIHBhZ2UgY29udHJpYnV0b3IuCi0gKiAKLSAqIFVzZSBYTUxFZGl0b3JBY3Rpb25Db250cmlidXRvciBmb3Igc2luZ2xlIHBhZ2UgZWRpdG9yLgotICovCi1wdWJsaWMgY2xhc3MgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yIGV4dGVuZHMgQWN0aW9uQ29udHJpYnV0b3JYTUwgewotCi0JcHJpdmF0ZSBJQWN0aW9uQmFycyBmQmFyczsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbGxzOgotCSAqIDx1bD4KLQkgKiA8bGk+PGNvZGU+Y29udHJpYnV0ZVRvTWVudTwvY29kZT4gd2l0aCA8Y29kZT5iYXJzPC9jb2RlPicgbWVudQotCSAqIG1hbmFnZXI8L2xpPgotCSAqIDxsaT48Y29kZT5jb250cmlidXRlVG9Ub29sQmFyPC9jb2RlPiB3aXRoIDxjb2RlPmJhcnM8L2NvZGU+JyB0b29sCi0JICogYmFyIG1hbmFnZXI8L2xpPgotCSAqIDxsaT48Y29kZT5jb250cmlidXRlVG9TdGF0dXNMaW5lPC9jb2RlPiB3aXRoIDxjb2RlPmJhcnM8L2NvZGU+JwotCSAqIHN0YXR1cyBsaW5lIG1hbmFnZXI8L2xpPgotCSAqIDwvdWw+Ci0JICogVGhlIGdpdmVuIGFjdGlvbiBiYXJzIGFyZSBhbHNvIHJlbWVtYmVyZWQgYW5kIG1hZGUgYWNjZXNzaWJsZSB2aWEKLQkgKiA8Y29kZT5nZXRBY3Rpb25CYXJzPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gYmFycwotCSAqICAgICAgICAgICAgdGhlIGFjdGlvbiBiYXJzCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBiYXJzKSB7Ci0JCWZCYXJzID0gYmFyczsKLQkJY29udHJpYnV0ZVRvTWVudShiYXJzLmdldE1lbnVNYW5hZ2VyKCkpOwotCQljb250cmlidXRlVG9Ub29sQmFyKGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKSk7Ci0JCWNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUoYmFycy5nZXRTdGF0dXNMaW5lTWFuYWdlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgY29udHJpYnV0b3IncyBhY3Rpb24gYmFycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhY3Rpb24gYmFycwotCSAqLwotCXB1YmxpYyBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgewotCQlyZXR1cm4gZkJhcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvVHJlZUNvbnRlbnRIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1RyZWVDb250ZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMzMyMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvVHJlZUNvbnRlbnRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01Xcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqIFRoaXMgcGVyZm9ybXMgdGhlIHdvcmsgb2YgdGFraW5nIGEgRE9NIHRyZWUgYW5kIGNvbnZlcnRpbmcgaXQgdG8gYQotICogZGlzcGxheWFibGUgJ1VJJyB0cmVlLgotICogCi0gKiBGb3IgZXhhbXBsZSA6IC0gd2hpdGUgc3BhY2UgdGV4dCBub2RlcyBhcmUgb21taXRlZCBmcm9tIHRoZSAnVUknIHRyZWUgLQotICogYWRqYWNlbnQgVGV4dCBhbmQgRW50aXR5UmVmZXJlbmNlIG5vZGVzIGFyZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlICdVSScKLSAqIG5vZGUgLSBFbGVtZW50cyB3aXRoICd0ZXh0IG9ubHknIGNoaWxkcmVuIGFyZSBkaXBsYXllZCB3aXRob3V0IGNoaWxkcmVuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRyZWVDb250ZW50SGVscGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJREVfV0hJVEVfU1BBQ0VfVEVYVF9OT0RFUyA9IDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NQklORV9BREpBQ0VOVF9URVhUX0FORF9FTlRJVFlfUkVGRVJFTkNFUyA9IDE2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJREVfRUxFTUVOVF9DSElMRF9URVhUX05PREVTID0gMzI7Ci0KLQlwcm90ZWN0ZWQgaW50IHN0eWxlID0gSElERV9XSElURV9TUEFDRV9URVhUX05PREVTIHwgQ09NQklORV9BREpBQ0VOVF9URVhUX0FORF9FTlRJVFlfUkVGRVJFTkNFUyB8IEhJREVfRUxFTUVOVF9DSElMRF9URVhUX05PREVTOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzU3R5bGVGbGFnKGludCBmbGFnKSB7Ci0JCXJldHVybiAoc3R5bGUgJiBmbGFnKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlPYmplY3RbXSByZXN1bHQgPSBudWxsOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGVsZW1lbnQ7Ci0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlib29sZWFuIHRleHRDb250ZW50T25seSA9IHRydWU7Ci0KLQkJCU5hbWVkTm9kZU1hcCBtYXAgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWlmIChtYXAgIT0gbnVsbCkgewotCQkJCWludCBsZW5ndGggPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQlsaXN0LmFkZChtYXAuaXRlbShpKSk7Ci0JCQkJCXRleHRDb250ZW50T25seSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJTm9kZSBwcmV2SW5jbHVkZWROb2RlID0gbnVsbDsKLQkJCWZvciAoTm9kZSBjaGlsZE5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGROb2RlICE9IG51bGw7IGNoaWxkTm9kZSA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJaW50IGNoaWxkTm9kZVR5cGUgPSBjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCQlib29sZWFuIGluY2x1ZGVOb2RlID0gdHJ1ZTsKLQotCQkJCWlmIChpbmNsdWRlTm9kZSAmJiBoYXNTdHlsZUZsYWcoSElERV9XSElURV9TUEFDRV9URVhUX05PREVTKSkgewotCQkJCQlpZiAoaXNJZ25vcmFibGVUZXh0KGNoaWxkTm9kZSkpIHsKLQkJCQkJCS8vIGZpbHRlciBvdXQgdGhlIGlnbm9yYWJsZSB0ZXh0IG5vZGUKLQkJCQkJCWluY2x1ZGVOb2RlID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoaW5jbHVkZU5vZGUgJiYgaGFzU3R5bGVGbGFnKENPTUJJTkVfQURKQUNFTlRfVEVYVF9BTkRfRU5USVRZX1JFRkVSRU5DRVMpKSB7Ci0JCQkJCWlmIChpc1RleHRPckVudGl0eVJlZmVyZW5jZU5vZGUoY2hpbGROb2RlKSAmJiAocHJldkluY2x1ZGVkTm9kZSAhPSBudWxsKSAmJiBpc1RleHRPckVudGl0eVJlZmVyZW5jZU5vZGUocHJldkluY2x1ZGVkTm9kZSkpIHsKLQkJCQkJCS8vIHdlIG9ubHkgc2hvdyB0aGUgZmlyc3Qgb2YgYSBsaXN0IG9mIGFkamFjZW50IHRleHQKLQkJCQkJCS8vIG9yIGVudGl0eSByZWZlcmVuY2Ugbm9kZSBpbiB0aGUgdHJlZQotCQkJCQkJLy8gc28gd2UgZmlsdGVyIG91dCB0aGlzIHN1YnNlcXVlbnQgb25lCi0JCQkJCQlpbmNsdWRlTm9kZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGhhc1N0eWxlRmxhZyhISURFX0VMRU1FTlRfQ0hJTERfVEVYVF9OT0RFUykpIHsKLQkJCQkJaWYgKChjaGlsZE5vZGVUeXBlICE9IE5vZGUuVEVYVF9OT0RFKSAmJiAoY2hpbGROb2RlVHlwZSAhPSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkpIHsKLQkJCQkJCXRleHRDb250ZW50T25seSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGluY2x1ZGVOb2RlKSB7Ci0JCQkJCWxpc3QuYWRkKGNoaWxkTm9kZSk7Ci0JCQkJCXByZXZJbmNsdWRlZE5vZGUgPSBjaGlsZE5vZGU7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoaGFzU3R5bGVGbGFnKEhJREVfRUxFTUVOVF9DSElMRF9URVhUX05PREVTKSAmJiB0ZXh0Q29udGVudE9ubHkpIHsKLQkJCQlyZXN1bHQgPSBuZXcgT2JqZWN0WzBdOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzdWx0ID0gbGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RleHRPckVudGl0eVJlZmVyZW5jZU5vZGUoTm9kZSBub2RlKSB7Ci0JCXJldHVybiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB8fCAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lnbm9yYWJsZVRleHQoTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVN0cmluZyBkYXRhID0gKChUZXh0KSBub2RlKS5nZXREYXRhKCk7Ci0JCQlyZXN1bHQgPSAoKGRhdGEgPT0gbnVsbCkgfHwgKGRhdGEudHJpbSgpLmxlbmd0aCgpID09IDApKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29tYmluZWRUZXh0Tm9kZShOb2RlIG5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJTm9kZSBuZXh0Tm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChuZXh0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5leHROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKSB7Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q29tYmluZWRUZXh0Tm9kZUxpc3QoTm9kZSB0aGVOb2RlKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJYm9vbGVhbiBwcmV2SXNFbnRpdHkgPSBmYWxzZTsKLQkJZm9yIChOb2RlIG5vZGUgPSB0aGVOb2RlOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlVHlwZSA9PSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkgewotCQkJCXByZXZJc0VudGl0eSA9IHRydWU7Ci0JCQkJbGlzdC5hZGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmICgobm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpICYmIChwcmV2SXNFbnRpdHkgfHwgKG5vZGUgPT0gdGhlTm9kZSkpKSB7Ci0JCQkJcHJldklzRW50aXR5ID0gZmFsc2U7Ci0JCQkJbGlzdC5hZGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRUZXh0VmFsdWUoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUxpc3QgbGlzdCA9IF9nZXRFbGVtZW50VGV4dENvbnRlbnQoZWxlbWVudCk7Ci0JCXJldHVybiBsaXN0ICE9IG51bGwgPyBnZXRWYWx1ZUZvclRleHRDb250ZW50KGxpc3QpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50VGV4dFZhbHVlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHZhbHVlKSB7Ci0JCXNldEVsZW1lbnROb2RlVmFsdWUoZWxlbWVudCwgdmFsdWUpOwotCX0KLQotCXByaXZhdGUgTGlzdCBfZ2V0RWxlbWVudFRleHRDb250ZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IHJlc3VsdCA9IG51bGw7Ci0KLQkJZm9yIChOb2RlIG5vZGUgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgfHwgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkpIHsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotCQkJCX0KLQkJCQlyZXN1bHQuYWRkKG5vZGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzdWx0ID0gbnVsbDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBlbGVtZW50IGlzIGhhcyAndGV4dCBvbmx5JyBjb250ZW50IHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZQotCSAqIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBjb21wb3NlIHRoZSB0ZXh0IG9ubHkgY29udGVudAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVsZW1lbnRUZXh0Q29udGVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJTGlzdCByZXN1bHQgPSBudWxsOwotCQlpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlcygpKSB7Ci0JCQlyZXN1bHQgPSBfZ2V0RWxlbWVudFRleHRDb250ZW50KGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZShOb2RlIG5vZGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDogewotCQkJCXJlc3VsdCA9ICgoQXR0cikgbm9kZSkuZ2V0VmFsdWUoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCS8vIGRyb3AgdGhydQotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQlyZXN1bHQgPSAoKENoYXJhY3RlckRhdGEpIG5vZGUpLmdldERhdGEoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOiB7Ci0JCQkJcmVzdWx0ID0gZ2V0RG9jdW1lbnRUeXBlVmFsdWUoKERvY3VtZW50VHlwZSkgbm9kZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCXJlc3VsdCA9IGdldEVsZW1lbnROb2RlVmFsdWUoKEVsZW1lbnQpIG5vZGUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6Ci0JCQkJLy8gZHJvcCB0aHJ1Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCXJlc3VsdCA9IGdldFRleHROb2RlVmFsdWUobm9kZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogewotCQkJCXJlc3VsdCA9ICgoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlKS5nZXREYXRhKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoTm9kZSBub2RlLCBTdHJpbmcgdmFsdWUpIHsKLQkJc2V0Tm9kZVZhbHVlKG5vZGUsIHZhbHVlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdGhhdCB0aGUgcmVzb3VyY2UgYmFja2luZyB0aGUgbW9kZWwgaXMgd3JpdGVhYmxlIHV0aWxpemluZyA8Y29kZT52YWxpZGF0ZUVkaXQ8L2NvZGU+Ci0JICogb24gYSBnaXZlbiA8dHQ+SVdvcmtzcGFjZTwvdHQ+LgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbCB0aGUgbW9kZWwgdG8gYmUgY2hlY2tlZAotCSAqIEBwYXJhbSBjb250ZXh0IHRoZSBzaGVsbCBjb250ZXh0IGZvciB3aGljaCA8Y29kZT52YWxpZGF0ZUVkaXQ8L2NvZGU+IHdpbGwgYmUgcnVuCi0JICogQHJldHVybiBib29sZWFuIHJlc3VsdCBvZiBjaGVja2luZyA8Y29kZT52YWxpZGF0ZUVkaXQ8L2NvZGU+LiBJZiB0aGUgcmVzb3VyY2UgaXMgdW53cml0ZWFibGUsIDxjb2RlPnN0YXR1cy5pc09LKCk8L2NvZGU+Ci0JICogd2lsbCByZXR1cm4gdHJ1ZTsgb3RoZXJ3aXNlLCBmYWxzZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVFZGl0KElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFNoZWxsIGNvbnRleHQpIHsKLQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSkpOwotCQkJcmV0dXJuICFmaWxlLmlzQWNjZXNzaWJsZSgpIHx8IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQobmV3IElGaWxlW10ge2ZpbGV9LCBjb250ZXh0KS5pc09LKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShOb2RlIG5vZGUsIFN0cmluZyB2YWx1ZSwgU2hlbGwgY29udGV4dCkgewotCQkvLyBNb2RlbCBzaG91bGQgbm90IGJlIGVkaXRlZCBiZWNhdXNlIGJhc2UgbG9jYXRpb24gaXMgcmVhZC1vbmx5Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUgJiYgIXZhbGlkYXRlRWRpdCgoKElET01Ob2RlKSBub2RlKS5nZXRNb2RlbCgpLCBjb250ZXh0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJdHJ5IHsKLQkJCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCQljYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOiB7Ci0JCQkJCSgoQXR0cikgbm9kZSkuc2V0VmFsdWUodmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0JCQkJCS8vIGRyb3AgdGhydQotCQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOiB7Ci0JCQkJCSgoQ2hhcmFjdGVyRGF0YSkgbm9kZSkuc2V0RGF0YSh2YWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCQlzZXRFbGVtZW50Tm9kZVZhbHVlKChFbGVtZW50KSBub2RlLCB2YWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDoKLQkJCQkJLy8gZHJvcCB0aHJ1Ci0JCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQkJc2V0VGV4dE5vZGVWYWx1ZShub2RlLCB2YWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogewotCQkJCQkoKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgbm9kZSkuc2V0RGF0YSh2YWx1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoRE9NRXhjZXB0aW9uIGUpIHsKLQkJCURpc3BsYXkgZCA9IGdldERpc3BsYXkoKTsKLQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQlkLmJlZXAoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgRGlzcGxheSBnZXREaXNwbGF5KCkgewotCi0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RG9jdW1lbnRUeXBlVmFsdWUoRG9jdW1lbnRUeXBlIGRvY3VtZW50VHlwZSkgewotCQlyZXR1cm4gRE9NV3JpdGVyLmdldERvY3VtZW50VHlwZURhdGEoZG9jdW1lbnRUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVsZW1lbnROb2RlVmFsdWUoRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlMaXN0IGxpc3QgPSBnZXRFbGVtZW50VGV4dENvbnRlbnQoZWxlbWVudCk7Ci0JCWlmIChsaXN0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGdldFZhbHVlRm9yVGV4dENvbnRlbnQobGlzdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbGVtZW50Tm9kZVZhbHVlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHZhbHVlKSB7Ci0JCUxpc3QgbGlzdCA9IGdldEVsZW1lbnRUZXh0Q29udGVudChlbGVtZW50KTsKLQkJaWYgKGxpc3QgIT0gbnVsbCkgewotCQkJc2V0VmFsdWVGb3JUZXh0Q29udGVudChsaXN0LCB2YWx1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJVGV4dCB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUpOwotCQkJZWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGV4dE5vZGVWYWx1ZShOb2RlIG5vZGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCUxpc3QgbGlzdCA9IG51bGw7Ci0JCWlmIChpc0NvbWJpbmVkVGV4dE5vZGUobm9kZSkpIHsKLQkJCWxpc3QgPSBnZXRDb21iaW5lZFRleHROb2RlTGlzdChub2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCWxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCQlsaXN0LmFkZChub2RlKTsKLQkJfQotCQlyZXN1bHQgPSBnZXRWYWx1ZUZvclRleHRDb250ZW50KGxpc3QpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFRleHROb2RlVmFsdWUoTm9kZSBub2RlLCBTdHJpbmcgdmFsdWUpIHsKLQkJTGlzdCBsaXN0ID0gbnVsbDsKLQkJaWYgKGlzQ29tYmluZWRUZXh0Tm9kZShub2RlKSkgewotCQkJbGlzdCA9IGdldENvbWJpbmVkVGV4dE5vZGVMaXN0KG5vZGUpOwotCQl9Ci0JCWVsc2UgewotCQkJbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJCWxpc3QuYWRkKG5vZGUpOwotCQl9Ci0JCXNldFZhbHVlRm9yVGV4dENvbnRlbnQobGlzdCwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBUZXh0IGdldEVmZmVjdGl2ZVRleHROb2RlRm9yQ29tYmluZWROb2RlTGlzdChMaXN0IGxpc3QpIHsKLQkJVGV4dCByZXN1bHQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGkubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCXJlc3VsdCA9IChUZXh0KSBub2RlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZUZvclRleHRDb250ZW50KExpc3QgbGlzdCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGxpc3Quc2l6ZSgpID4gMCkgewotCQkJaWYgKGxpc3QuZ2V0KDApIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQlJRE9NTm9kZSBmaXJzdCA9IChJRE9NTm9kZSkgbGlzdC5nZXQoMCk7Ci0JCQkJSURPTU5vZGUgbGFzdCA9IChJRE9NTm9kZSkgbGlzdC5nZXQobGlzdC5zaXplKCkgLSAxKTsKLQkJCQlJRE9NTW9kZWwgbW9kZWwgPSBmaXJzdC5nZXRNb2RlbCgpOwotCQkJCWludCBzdGFydCA9IGZpcnN0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGVuZCA9IGxhc3QuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzdWx0ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KHN0YXJ0LAotCQkJCQkJCWVuZCAtIHN0YXJ0KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChsaXN0LmdldCgwKSBpbnN0YW5jZW9mIE5vZGUpCi0JCQkJewotCQkJCQlOb2RlIG4gPSAoTm9kZSkgbGlzdC5nZXQoMCk7Ci0JCQkJCWZvciAoTm9kZSBub2RlID0gbi5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJCVN0cmluZyB0ZXh0ID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCQkJCQlpZighKCh0ZXh0ID09IG51bGwpIHx8ICh0ZXh0LnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkpIHsKLQkJCQkJCQkJcmVzdWx0ID0gdGV4dC50cmltKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQkKLQkJfQotCi0JCS8vIHdlIHRyaW0gdGhlIGNvbnRlbnQgc28gdGhhdCBpdCBsb29rcyBuaWNlIHdoZW4gdmlld2VkCi0JCS8vIHdlIG5lZWQgdG8gYmUgY2FyZnVsbCB0byBwcmVzZXJ2ZSB0aGUgJ3RyaW1tZWQnIHRleHQgd2hlbiB0aGUgdmFsdWUKLQkJLy8gaXMgc2V0IChzZWUgc2V0VmFsdWVGb3JUZXh0Q29udGVudCkKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSByZXN1bHQudHJpbSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVGb3JUZXh0Q29udGVudChMaXN0IGxpc3QsIFN0cmluZyB2YWx1ZSkgewotCQkvLyBTdHJpbmcgb2xkVmFsdWUgPSBnZXRWYWx1ZUZvclRleHRDb250ZW50KCk7Ci0JCS8vIHdlIHdvcnJ5IGFib3V0IHByZXNlcnZpbmcgdHJpbW1lZCB0ZXh0Ci0JCWlmIChsaXN0LnNpemUoKSA+IDApIHsKLQkJCWlmIChsaXN0LmdldCgwKSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJSURPTU5vZGUgZmlyc3QgPSAoSURPTU5vZGUpIGxpc3QuZ2V0KDApOwotCQkJCUlET01Ob2RlIGxhc3QgPSAoSURPTU5vZGUpIGxpc3QuZ2V0KGxpc3Quc2l6ZSgpIC0gMSk7Ci0JCQkJaW50IHN0YXJ0ID0gZmlyc3QuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgZW5kID0gbGFzdC5nZXRFbmRPZmZzZXQoKTsKLQkJCQlmaXJzdC5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsCi0JCQkJCQlzdGFydCwgZW5kIC0gc3RhcnQsIHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRWRpdGFibGUoTm9kZSBub2RlKSB7Ci0JCWludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDoKLQkJCQkvLyBkcm9wIHRocnUKLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCS8vIGRyb3AgdGhydQotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6Ci0JCQkJLy8gZHJvcCB0aHJ1Ci0JCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDoKLQkJCQkvLyBkcm9wIHRocnUKLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCS8vIGRyb3AgdGhydQotCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQlyZXN1bHQgPSAoZ2V0RWxlbWVudFRleHRDb250ZW50KChFbGVtZW50KSBub2RlKSAhPSBudWxsKSB8fCAobm9kZS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPT0gMCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvVHJlZUV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvVHJlZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTgzMmNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1RyZWVFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZU1vdmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TY3JvbGxCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotcHVibGljIGNsYXNzIFRyZWVFeHRlbnNpb24gaW1wbGVtZW50cyBQYWludExpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBUcmVlIGZUcmVlOwotCXByb3RlY3RlZCBFZGl0TWFuYWdlciBlZGl0TWFuYWdlcjsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZkNvbHVtblByb3BlcnRpZXM7Ci0JcHJvdGVjdGVkIElDZWxsTW9kaWZpZXIgY2VsbE1vZGlmaWVyOwotCXByb3RlY3RlZCBpbnQgY29sdW1uUG9zaXRpb24gPSAzMDA7Ci0JcHJvdGVjdGVkIGludCBjb2x1bW5IaXRXaWR0aCA9IDU7Ci0JcHJvdGVjdGVkIENvbG9yIHRhYmxlTGluZUNvbG9yOwotCXByb3RlY3RlZCBpbnQgY29udHJvbFdpZHRoOwotCXByb3RlY3RlZCBEZWxheWVkRHJhd1RpbWVyIGRlbGF5ZWREcmF3VGltZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZpc1Vuc3VwcG9ydGVkSW5wdXQgPSBmYWxzZTsKLQotCXB1YmxpYyBUcmVlRXh0ZW5zaW9uKFRyZWUgdHJlZSkgewotCQl0aGlzLmZUcmVlID0gdHJlZTsKLQkJSW50ZXJuYWxNb3VzZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEludGVybmFsTW91c2VMaXN0ZW5lcigpOwotCQl0cmVlLmFkZE1vdXNlTW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdHJlZS5hZGRNb3VzZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdHJlZS5hZGRQYWludExpc3RlbmVyKHRoaXMpOwotCQllZGl0TWFuYWdlciA9IG5ldyBFZGl0TWFuYWdlcih0cmVlKTsKLQkJZGVsYXllZERyYXdUaW1lciA9IG5ldyBEZWxheWVkRHJhd1RpbWVyKHRyZWUpOwotCi0JCXRhYmxlTGluZUNvbG9yID0gdHJlZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9MSUdIVF9TSEFET1cpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRhYmxlTGluZUNvbG9yLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDZWxsTW9kaWZpZXIoSUNlbGxNb2RpZmllciBtb2RpZmllcikgewotCQljZWxsTW9kaWZpZXIgPSBtb2RpZmllcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldENhY2hlZERhdGEoKSB7Ci0JCS8vIHRvZG86IHN1cmUgc2VlbXMgd2Ugc2hvdWxkIHJlc2V0IHNvbWV0aGluZz8KLQl9Ci0KLQlwdWJsaWMgSUNlbGxNb2RpZmllciBnZXRDZWxsTW9kaWZpZXIoKSB7Ci0JCXJldHVybiBjZWxsTW9kaWZpZXI7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0SXRlbUxpc3QoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJZ2V0SXRlbUxpc3RIZWxwZXIoZlRyZWUuZ2V0SXRlbXMoKSwgbGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdldEl0ZW1MaXN0SGVscGVyKFRyZWVJdGVtW10gaXRlbXMsIExpc3QgbGlzdCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQlsaXN0LmFkZChpdGVtKTsKLQkJCWdldEl0ZW1MaXN0SGVscGVyKGl0ZW0uZ2V0SXRlbXMoKSwgbGlzdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVHJlZUl0ZW0gZ2V0VHJlZUl0ZW1PblJvdyhpbnQgcHgsIGludCBweSkgewotCQlUcmVlSXRlbSByZXN1bHQgPSBudWxsOwotCQlMaXN0IGxpc3QgPSBnZXRJdGVtTGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgaS5uZXh0KCk7Ci0JCQlSZWN0YW5nbGUgciA9IGl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQlpZiAoKHIgIT0gbnVsbCkgJiYgKHB4ID49IHIueCkgJiYgKHB5ID49IHIueSkgJiYgKHB5IDw9IHIueSArIHIuaGVpZ2h0KSkgewotCQkJCXJlc3VsdCA9IGl0ZW07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgSW50ZXJuYWxNb3VzZUxpc3RlbmVyIGV4dGVuZHMgTW91c2VBZGFwdGVyIGltcGxlbWVudHMgTW91c2VNb3ZlTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgaW50IGNvbHVtbkRyYWdnZWQgPSAtMTsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNEb3duID0gZmFsc2U7Ci0JCXByb3RlY3RlZCBpbnQgcHJldlggPSAtMTsKLQkJcHJvdGVjdGVkIEN1cnNvciBjdXJzb3IgPSBudWxsOwotCi0JCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsKLQkJCWlmICgoZS54ID4gY29sdW1uUG9zaXRpb24gLSBjb2x1bW5IaXRXaWR0aCkgJiYgKGUueCA8IGNvbHVtblBvc2l0aW9uICsgY29sdW1uSGl0V2lkdGgpKSB7Ci0JCQkJaWYgKGN1cnNvciA9PSBudWxsKSB7Ci0JCQkJCWN1cnNvciA9IG5ldyBDdXJzb3IoZlRyZWUuZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX1NJWkVXRSk7Ci0JCQkJCWZUcmVlLnNldEN1cnNvcihjdXJzb3IpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChjdXJzb3IgIT0gbnVsbCkgewotCQkJCQlmVHJlZS5zZXRDdXJzb3IobnVsbCk7Ci0JCQkJCWN1cnNvci5kaXNwb3NlKCk7Ci0JCQkJCWN1cnNvciA9IG51bGw7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY29sdW1uRHJhZ2dlZCAhPSAtMSkgewotCQkJCS8vIHVzaW5nIHRoZSBkZWxheSB0aW1lciB3aWxsIG1ha2UgcmVkcmF3cyBsZXNzIGZsaWNrZXJ5Ci0JCQkJaWYgKGUueCA+IDIwKSB7Ci0JCQkJCWNvbHVtblBvc2l0aW9uID0gZS54OwotCQkJCQlkZWxheWVkRHJhd1RpbWVyLnJlc2V0KDIwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkvLyBoZXJlIHdlIGhhbmRsZSB0aGUgY29sdW1uIHJlc2l6aW5nIGJ5IGRldGVjdCBpZiB0aGUgdXNlciBoYXMKLQkJCS8vIGNsaWNrIG9uIGEgY29sdW1uIHNlcGFyYXRvcgotCQkJLy8KLQkJCWNvbHVtbkRyYWdnZWQgPSAtMTsKLQkJCWVkaXRNYW5hZ2VyLmRlYWN0aXZhdGVDZWxsRWRpdG9yKCk7Ci0KLQkJCWlmICgoZS54ID4gY29sdW1uUG9zaXRpb24gLSBjb2x1bW5IaXRXaWR0aCkgJiYgKGUueCA8IGNvbHVtblBvc2l0aW9uICsgY29sdW1uSGl0V2lkdGgpKSB7Ci0JCQkJY29sdW1uRHJhZ2dlZCA9IDA7Ci0JCQl9Ci0KLQkJCS8vIGhlcmUgd2UgaGFuZGxlIHNlbGVjdGluZyB0cmVlIGl0ZW1zIHdoZW4gYW55IHRoaW5nIG9uIHRoZSAncm93JwotCQkJLy8gaXMgY2xpY2tlZAotCQkJLy8KLQkJCVRyZWVJdGVtIGl0ZW0gPSBmVHJlZS5nZXRJdGVtKG5ldyBQb2ludChlLngsIGUueSkpOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJCWl0ZW0gPSBnZXRUcmVlSXRlbU9uUm93KGUueCwgZS55KTsKLQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJCVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVHJlZUl0ZW1bMV07Ci0JCQkJCWl0ZW1zWzBdID0gaXRlbTsKLQkJCQkJZlRyZWUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJY29sdW1uRHJhZ2dlZCA9IC0xOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldENvbHVtblByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBmQ29sdW1uUHJvcGVydGllczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5Qcm9wZXJ0aWVzKFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXMpIHsKLQkJdGhpcy5mQ29sdW1uUHJvcGVydGllcyA9IGNvbHVtblByb3BlcnRpZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpIHsKLQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJUmVjdGFuZ2xlIHRyZWVCb3VuZHMgPSBmVHJlZS5nZXRCb3VuZHMoKTsKLQotCQljb250cm9sV2lkdGggPSB0cmVlQm91bmRzLndpZHRoOwotCQlDb2xvciBiZyA9IGZUcmVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLQkJQ29sb3IgYmcyID0gZlRyZWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTik7Ci0KLQkJZ2Muc2V0QmFja2dyb3VuZChiZzIpOwotCi0JCS8vIC8vIFRoaXMgbmV4dCBwYXJ0IGNhdXNlcyBwcm9ibGVtcyBvbiBMSU5VWCwgc28gbGV0J3Mgbm90IGRvIGl0Ci0JCS8vIHRoZXJlCi0JCS8vIGlmIChCMkJIYWNrcy5JU19VTklYID09IGZhbHNlKSB7Ci0JCS8vIFRyZWVJdGVtW10gc2VsZWN0ZWRJdGVtcyA9IHRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCS8vIGlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHsKLQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCS8vIFRyZWVJdGVtIGl0ZW0gPSBzZWxlY3RlZEl0ZW1zW2ldOwotCQkvLyBSZWN0YW5nbGUgYm91bmRzID0gaXRlbS5nZXRCb3VuZHMoKTsKLQkJLy8gaWYgKGJvdW5kcyAhPSBudWxsKSB7Ci0JCS8vIGdjLmZpbGxSZWN0YW5nbGUoYm91bmRzLnggKyBib3VuZHMud2lkdGgsIGJvdW5kcy55LCBjb250cm9sV2lkdGgsCi0JCS8vIGJvdW5kcy5oZWlnaHQpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vCi0JCWlmICghZmlzVW5zdXBwb3J0ZWRJbnB1dCkgewotCQkJVHJlZUl0ZW1bXSBpdGVtcyA9IGZUcmVlLmdldEl0ZW1zKCk7Ci0JCQlpZiAoaXRlbXMubGVuZ3RoID4gMCkgewotCQkJCWdjLnNldEZvcmVncm91bmQodGFibGVMaW5lQ29sb3IpOwotCQkJCWdjLnNldEJhY2tncm91bmQoYmcpOwotCi0JCQkJZ2MuZmlsbFJlY3RhbmdsZShjb2x1bW5Qb3NpdGlvbiwgdHJlZUJvdW5kcy54LCB0cmVlQm91bmRzLndpZHRoLCB0cmVlQm91bmRzLmhlaWdodCk7Ci0KLQkJCQlSZWN0YW5nbGUgaXRlbUJvdW5kcyA9IGl0ZW1zWzBdLmdldEJvdW5kcygpOwotCQkJCWludCBoZWlnaHQgPSBjb21wdXRlVHJlZUl0ZW1IZWlnaHQoKTsKLQotCQkJCWlmIChpdGVtQm91bmRzICE9IG51bGwpIHsKLQkJCQkJLyoKLQkJCQkJICogQm91bmRzIHdpbGwgYmUgZm9yIHRoZSBmaXJzdCBpdGVtLCB3aGljaCB3aWxsIGVpdGhlciBiZQotCQkJCQkgKiB2aXNpYmxlIGF0IHRoZSB0b3Agb2YgdGhlIFRyZWUsIG9yIHNjcm9sbGVkIG9mZiB3aXRoCi0JCQkJCSAqIG5lZ2F0aXZlIHZhbHVlcwotCQkJCQkgKi8KLQkJCQkJaW50IHN0YXJ0WSA9IGl0ZW1Cb3VuZHMueTsKLQotCQkJCQkvKiBPbmx5IGRyYXcgbGluZXMgd2l0aGluIHRoZSBUcmVlIGJvdW5kYXJpZXMgKi8KLQkJCQkJZm9yIChpbnQgaSA9IHN0YXJ0WTsgaSA8IHRyZWVCb3VuZHMuaGVpZ2h0OyBpICs9IGhlaWdodCkgewotCQkJCQkJaWYgKGkgPj0gdHJlZUJvdW5kcy55KSB7Ci0JCQkJCQkJZ2MuZHJhd0xpbmUoMCwgaSwgdHJlZUJvdW5kcy53aWR0aCwgaSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZ2MuZHJhd0xpbmUoY29sdW1uUG9zaXRpb24sIDAsIGNvbHVtblBvc2l0aW9uLCB0cmVlQm91bmRzLmhlaWdodCk7Ci0JCQkJcGFpbnRJdGVtcyhnYywgaXRlbXMsIHRyZWVCb3VuZHMpOwotCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGRFbXB0eVRyZWVNZXNzYWdlKGdjKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWFkZFVuYWJsZVRvUG9wdWxhdGVUcmVlTWVzc2FnZShnYyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGNvbXB1dGVUcmVlSXRlbUhlaWdodCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCi0JCS8qCi0JCSAqIE9uIEdUSyB0cmVlLmdldEl0ZW1IZWlnaHQoKSBzZWVtcyB0byBsaWUgdG8gdXMuIEl0IHJlcG9ydHMgdGhhdCB0aGUKLQkJICogdHJlZSBpdGVtIG9jY3VwaWVzIGEgZmV3IHBpeGxlcyBsZXNzIHZlcnRpY2FsIHNwYWNlIHRoYW4gaXQgc2hvdWxkCi0JCSAqIChwb3NzaWJseSBiZWNhdXNlIG9mIHRoZSBpbWFnZSBoZWlnaHQgdnMuIHRoZSB0ZXh0IGhlaWdodD8pLiBUaGlzCi0JCSAqIGZvaWxzIG91ciBjb2RlIHRoYXQgZHJhd3MgdGhlICdyb3cnIGxpbmVzIHNpbmNlIHdlIGFzc3VtZSB0aGF0Ci0JCSAqIGxpbmVzIHNob3VsZCBiZSBkcmF3biBhdCAnaXRlbUhlaWdodCcgaW5jcmVtZW50cy4gRG9uJ3QgdHJ1c3QKLQkJICogZ2V0SXRlbUhlaWdodCgpIHRvIGNvbXB1dGUgdGhlIGluY3JlbWVudC4uLiBpbnN0ZWFkIGNvbXB1dGUgdGhlCi0JCSAqIHZhbHVlIGJhc2VkIG9uIGRpc3RhbmNlIGJldHdlZW4gdHdvIFRyZWVJdGVtcywgYW5kIHRoZW4gdXNlIHRoZQotCQkgKiBsYXJnZXIgdmFsdWUuCi0JCSAqIAotCQkgKiBUaGlzIHN0cmF0ZWd5IG9ubHkgd29ya3Mgb24gdHJlZXMgd2hlcmUgdGhlIGl0ZW1zIGFyZSBvZiBldmVuCi0JCSAqIGhlaWdodCwgaG93ZXZlciBidWcKLQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNzIwMSBpbmRpY2F0ZXMgdGhhdAotCQkgKiB0aGlzIGlzIG5vIGxvbmdlciBwcm9taXNlZCwgYXQgbGVhc3Qgb24gd2luMzIgYW5kIGxpa2VseSBvbiBvdGhlcgotCQkgKiBwbGF0Zm9ybXMgc29vbi4KLQkJICovCi0JCWlmIChmVHJlZS5nZXRJdGVtQ291bnQoKSA+IDApIHsKLQkJCVRyZWVJdGVtW10gaXRlbXMgPSBmVHJlZS5nZXRJdGVtcygpOwotCQkJUmVjdGFuZ2xlIGl0ZW1Cb3VuZHMgPSBpdGVtc1swXS5nZXRCb3VuZHMoKTsKLQotCQkJaWYgKGl0ZW1zWzBdLmdldEV4cGFuZGVkKCkpIHsKLQkJCQlUcmVlSXRlbVtdIGNoaWxkcmVuID0gaXRlbXNbMF0uZ2V0SXRlbXMoKTsKLQkJCQlpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkgewotCQkJCQlyZXN1bHQgPSBjaGlsZHJlblswXS5nZXRCb3VuZHMoKS55IC0gaXRlbUJvdW5kcy55OwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGl0ZW1zLmxlbmd0aCA+IDEpIHsKLQkJCQlyZXN1bHQgPSBpdGVtc1sxXS5nZXRCb3VuZHMoKS55IC0gaXRlbUJvdW5kcy55OwotCQkJfQotCQl9Ci0KLQkJcmVzdWx0ID0gTWF0aC5tYXgoZlRyZWUuZ2V0SXRlbUhlaWdodCgpLCByZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVtcHR5VHJlZU1lc3NhZ2UoR0MgZ2MpIHsKLQkJLy8gbm90aGluZyB0byBhZGQgaGVyZQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRVbmFibGVUb1BvcHVsYXRlVHJlZU1lc3NhZ2UoR0MgZ2MpIHsKLQkJLy8gaGVyZSB3ZSBwcmludCBhIG1lc3NhZ2Ugd2hlbiB0aGUgZG9jdW1lbnQgY2Fubm90IGJlIGRpc3BsYXllZCBqdXN0Ci0JCS8vIHRvIGdpdmUgdGhlCi0JCS8vIHVzZXIgYSB2aXN1YWwgY3VlCi0JCS8vIHNvIHRoYXQgdGhleSBrbm93IGhvdyB0byBwcm9jZWVkIHRvIGVkaXQgdGhlIGJsYW5rIHZpZXcKLQkJZ2Muc2V0Rm9yZWdyb3VuZChmVHJlZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZlRyZWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpKTsKLQkJZ2MuZHJhd1N0cmluZyhYTUxFZGl0b3JNZXNzYWdlcy5UcmVlRXh0ZW5zaW9uXzAsIDEwLCAxMCk7Ci0JfQotCi0Jdm9pZCBzZXRJc1Vuc3VwcG9ydGVkSW5wdXQoYm9vbGVhbiBpc1Vuc3VwcG9ydGVkKSB7Ci0JCWZpc1Vuc3VwcG9ydGVkSW5wdXQgPSBpc1Vuc3VwcG9ydGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHBhaW50SXRlbXMoR0MgZ2MsIFRyZWVJdGVtW10gaXRlbXMsIFJlY3RhbmdsZSB0cmVlQm91bmRzKSB7Ci0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQkJCWlmIChib3VuZHMgIT0gbnVsbCkgewotCQkJCQkJaWYgKHRyZWVCb3VuZHMuaW50ZXJzZWN0cyhib3VuZHMpKSB7Ci0JCQkJCQkJcGFpbnRJdGVtKGdjLCBpdGVtLCBib3VuZHMpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gZGVmZWN0IDI0MTAzOQotCQkJCQkvLwotCQkJCQlpZiAoaXRlbS5nZXRFeHBhbmRlZCgpKSB7Ci0JCQkJCQlwYWludEl0ZW1zKGdjLCBpdGVtLmdldEl0ZW1zKCksIHRyZWVCb3VuZHMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnRJdGVtKEdDIGdjLCBUcmVlSXRlbSBpdGVtLCBSZWN0YW5nbGUgYm91bmRzKSB7Ci0JCS8vIG5vdGhpbmcgdG8gcGFpbnQKLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIElDZWxsRWRpdG9yUHJvdmlkZXIgewotCQlDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoT2JqZWN0IG8sIGludCBjb2wpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBpbXByb3ZlIGRyYXdpbmcgZHVyaW5nIGEgY29sdW1uIHJlc2l6ZS4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgRGVsYXllZERyYXdUaW1lciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJcHJvdGVjdGVkIENvbnRyb2wgY29udHJvbDsKLQotCQlwdWJsaWMgRGVsYXllZERyYXdUaW1lcihDb250cm9sIGNvbnRyb2wxKSB7Ci0JCQl0aGlzLmNvbnRyb2wgPSBjb250cm9sMTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlc2V0KGludCBtaWxsaXNlY29uZHMpIHsKLQkJCWdldERpc3BsYXkoKS50aW1lckV4ZWMobWlsbGlzZWNvbmRzLCB0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWNvbnRyb2wucmVkcmF3KCk7Ci0JCX0KLQl9Ci0KLQlEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0KLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCX0KLQotCS8qKgotCSAqIEVkaXRNYW5hZ2VyCi0JICovCi0JcHVibGljIGNsYXNzIEVkaXRNYW5hZ2VyIHsKLQkJcHJvdGVjdGVkIFRyZWUgZlRyZWUxOwotCQlwcm90ZWN0ZWQgQ29udHJvbCBjZWxsRWRpdG9ySG9sZGVyOwotCQlwcm90ZWN0ZWQgQ2VsbEVkaXRvclN0YXRlIGNlbGxFZGl0b3JTdGF0ZTsKLQotCQlwdWJsaWMgRWRpdE1hbmFnZXIoVHJlZSB0cmVlKSB7Ci0JCQl0aGlzLmZUcmVlMSA9IHRyZWU7Ci0JCQl0aGlzLmNlbGxFZGl0b3JIb2xkZXIgPSBuZXcgQ29tcG9zaXRlKHRyZWUsIFNXVC5OT05FKTsKLQotCQkJZmluYWwgVHJlZSB0aGVUcmVlID0gdHJlZTsKLQotCQkJTW91c2VBZGFwdGVyIHRoZU1vdXNlQWRhcHRlciA9IG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCQlkZWFjdGl2YXRlQ2VsbEVkaXRvcigpOwotCi0JCQkJCWlmIChlLnggPiBjb2x1bW5Qb3NpdGlvbiArIGNvbHVtbkhpdFdpZHRoKSB7Ci0JCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gdGhlVHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCS8vIE5vIGVkaXQgaWYgbW9yZSB0aGFuIG9uZSByb3cgaXMgc2VsZWN0ZWQuCi0JCQkJCQlpZiAoaXRlbXMubGVuZ3RoID09IDEpIHsKLQkJCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gaXRlbXNbMF0uZ2V0Qm91bmRzKCk7Ci0JCQkJCQkJaWYgKChib3VuZHMgIT0gbnVsbCkgJiYgKGUueSA+PSBib3VuZHMueSkgJiYgKGUueSA8PSBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpKSB7Ci0JCQkJCQkJCWludCBjb2x1bW5Ub0VkaXQgPSAxOwotCQkJCQkJCQlhY3RpdmF0ZUNlbGxFZGl0b3IoaXRlbXNbMF0sIGNvbHVtblRvRWRpdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQotCQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJYXBwbHlDZWxsRWRpdG9yVmFsdWUoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWFwcGx5Q2VsbEVkaXRvclZhbHVlKCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJS2V5TGlzdGVuZXIga2V5TGlzdGVuZXIgPSBuZXcgS2V5QWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQkJaWYgKGUuY2hhcmFjdGVyID09IFNXVC5DUikgewotCQkJCQkJZGVhY3RpdmF0ZUNlbGxFZGl0b3IoKTsKLQkJCQkJCVRyZWVJdGVtW10gaXRlbXMgPSB0aGVUcmVlLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCQkJYWN0aXZhdGVDZWxsRWRpdG9yKGl0ZW1zWzBdLCAxKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0KLQkJCXRyZWUuYWRkTW91c2VMaXN0ZW5lcih0aGVNb3VzZUFkYXB0ZXIpOwotCQkJdHJlZS5hZGRLZXlMaXN0ZW5lcihrZXlMaXN0ZW5lcik7Ci0JCQlTY3JvbGxCYXIgaEJhciA9IHRyZWUuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQkJaWYgKGhCYXIgIT0gbnVsbCkgewotCQkJCWhCYXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQkJfQotCQkJU2Nyb2xsQmFyIHZCYXIgPSB0cmVlLmdldFZlcnRpY2FsQmFyKCk7Ci0JCQlpZiAodkJhciAhPSBudWxsKSB7Ci0JCQkJdkJhci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0NlbGxFZGl0b3JBY3RpdmUoKSB7Ci0JCQlyZXR1cm4gY2VsbEVkaXRvclN0YXRlICE9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhcHBseUNlbGxFZGl0b3JWYWx1ZSgpIHsKLQkJCWlmICgoY2VsbEVkaXRvclN0YXRlICE9IG51bGwpICYmIChjZWxsTW9kaWZpZXIgIT0gbnVsbCkpIHsKLQkJCQlUcmVlSXRlbSB0cmVlSXRlbSA9IGNlbGxFZGl0b3JTdGF0ZS5mVHJlZUl0ZW07Ci0KLQkJCQkvLyBUaGUgYXJlYSBiZWxvdyB0aGUgY2VsbCBlZGl0b3IgbmVlZHMgdG8gYmUgZXhwbGljaXR5Ci0JCQkJLy8gcmVwYWludGVkIG9uIExpbnV4Ci0JCQkJLy8KLQkJCQkvLyBSZWN0YW5nbGUgciA9IEIyQkhhY2tzLklTX1VOSVggPyB0cmVlSXRlbS5nZXRCb3VuZHMoKSA6Ci0JCQkJLy8gbnVsbDsKLQotCQkJCU9iamVjdCB2YWx1ZSA9IGNlbGxFZGl0b3JTdGF0ZS5mQ2VsbEVkaXRvci5nZXRWYWx1ZSgpOwotCQkJCVN0cmluZyBwcm9wZXJ0eSA9IGNlbGxFZGl0b3JTdGF0ZS5mUHJvcGVydHk7Ci0KLQkJCQlkZWFjdGl2YXRlQ2VsbEVkaXRvcigpOwotCi0JCQkJY2VsbE1vZGlmaWVyLm1vZGlmeSh0cmVlSXRlbSwgcHJvcGVydHksIHZhbHVlKTsKLQotCQkJCS8vIGlmIChyICE9IG51bGwpIHsKLQkJCQkvLyB0cmVlLnJlZHJhdyhyLngsIHIueSwgdHJlZS5nZXRCb3VuZHMoKS53aWR0aCwgci5oZWlnaHQsCi0JCQkJLy8gZmFsc2UpOwotCQkJCS8vIH0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGVDZWxsRWRpdG9yKCkgewotCQkJLy8gQ2xlYW4gdXAgYW55IHByZXZpb3VzIGVkaXRvciBjb250cm9sCi0JCQlpZiAoY2VsbEVkaXRvclN0YXRlICE9IG51bGwpIHsKLQkJCQljZWxsRWRpdG9yU3RhdGUuZGVhY3RpdmF0ZSgpOwotCQkJCWNlbGxFZGl0b3JTdGF0ZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhY3RpdmF0ZUNlbGxFZGl0b3IoVHJlZUl0ZW0gdHJlZUl0ZW0sIGludCBjb2x1bW4pIHsKLQkJCWlmIChjZWxsTW9kaWZpZXIgaW5zdGFuY2VvZiBJQ2VsbEVkaXRvclByb3ZpZGVyKSB7Ci0JCQkJSUNlbGxFZGl0b3JQcm92aWRlciBjZWxsRWRpdG9yUHJvdmlkZXIgPSAoSUNlbGxFZGl0b3JQcm92aWRlcikgY2VsbE1vZGlmaWVyOwotCQkJCU9iamVjdCBkYXRhID0gdHJlZUl0ZW0uZ2V0RGF0YSgpOwotCQkJCWlmIChmQ29sdW1uUHJvcGVydGllcy5sZW5ndGggPiBjb2x1bW4pIHsKLQkJCQkJU3RyaW5nIHByb3BlcnR5ID0gZkNvbHVtblByb3BlcnRpZXNbY29sdW1uXTsKLQkJCQkJaWYgKGNlbGxNb2RpZmllci5jYW5Nb2RpZnkoZGF0YSwgcHJvcGVydHkpKSB7Ci0JCQkJCQlDZWxsRWRpdG9yIG5ld0NlbGxFZGl0b3IgPSBjZWxsRWRpdG9yUHJvdmlkZXIuZ2V0Q2VsbEVkaXRvcihkYXRhLCBjb2x1bW4pOwotCQkJCQkJaWYgKG5ld0NlbGxFZGl0b3IgIT0gbnVsbCkgewotCQkJCQkJCS8vIFRoZSBjb250cm9sIHRoYXQgd2lsbCBiZSB0aGUgZWRpdG9yIG11c3QgYmUgYQotCQkJCQkJCS8vIGNoaWxkIG9mIHRoZSBjb2x1bW5Qb3NpdGlvbgotCQkJCQkJCUNvbnRyb2wgY29udHJvbCA9IG5ld0NlbGxFZGl0b3IuZ2V0Q29udHJvbCgpOwotCQkJCQkJCWlmIChjb250cm9sICE9IG51bGwpIHsKLQkJCQkJCQkJY2VsbEVkaXRvclN0YXRlID0gbmV3IENlbGxFZGl0b3JTdGF0ZShuZXdDZWxsRWRpdG9yLCBjb250cm9sLCB0cmVlSXRlbSwgY29sdW1uLCBwcm9wZXJ0eSk7Ci0JCQkJCQkJCWNlbGxFZGl0b3JTdGF0ZS5hY3RpdmF0ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiB0aGlzIGNsYXNzIGhvbGRzIHRoZSBzdGF0ZSB0aGF0IGlzIG5lZWQgb24gYSBwZXIgY2VsbCBlZGl0b3IKLQkJICogaW52b2NhdGlvbiBiYXNpcwotCQkgKi8KLQkJcHVibGljIGNsYXNzIENlbGxFZGl0b3JTdGF0ZSBpbXBsZW1lbnRzIElDZWxsRWRpdG9yTGlzdGVuZXIsIEZvY3VzTGlzdGVuZXIgewotCQkJcHVibGljIENlbGxFZGl0b3IgZkNlbGxFZGl0b3I7Ci0JCQlwdWJsaWMgQ29udHJvbCBmQ29udHJvbDsKLQkJCXB1YmxpYyBUcmVlSXRlbSBmVHJlZUl0ZW07Ci0JCQlwdWJsaWMgaW50IGZDb2x1bW5OdW1iZXI7Ci0JCQlwdWJsaWMgU3RyaW5nIGZQcm9wZXJ0eTsKLQotCQkJcHVibGljIENlbGxFZGl0b3JTdGF0ZShDZWxsRWRpdG9yIGNlbGxFZGl0b3IsIENvbnRyb2wgY29udHJvbCwgVHJlZUl0ZW0gdHJlZUl0ZW0sIGludCBjb2x1bW5OdW1iZXIsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCXRoaXMuZkNlbGxFZGl0b3IgPSBjZWxsRWRpdG9yOwotCQkJCXRoaXMuZkNvbnRyb2wgPSBjb250cm9sOwotCQkJCXRoaXMuZlRyZWVJdGVtID0gdHJlZUl0ZW07Ci0JCQkJdGhpcy5mQ29sdW1uTnVtYmVyID0gY29sdW1uTnVtYmVyOwotCQkJCXRoaXMuZlByb3BlcnR5ID0gcHJvcGVydHk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQkJCU9iamVjdCBlbGVtZW50ID0gZlRyZWVJdGVtLmdldERhdGEoKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSBjZWxsTW9kaWZpZXIuZ2V0VmFsdWUoZWxlbWVudCwgZlByb3BlcnR5KS50b1N0cmluZygpOwotCQkJCWlmIChmQ29udHJvbCBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGZDb250cm9sOwotCQkJCQlpbnQgcmVxdWlyZWRTaXplID0gdmFsdWUubGVuZ3RoKCkgKyAxMDA7Ci0JCQkJCWlmICh0ZXh0LmdldFRleHRMaW1pdCgpIDwgcmVxdWlyZWRTaXplKSB7Ci0JCQkJCQl0ZXh0LnNldFRleHRMaW1pdChyZXF1aXJlZFNpemUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCVJlY3RhbmdsZSByID0gZlRyZWVJdGVtLmdldEJvdW5kcygpOwotCQkJCWlmIChyICE9IG51bGwpIHsKLQkJCQkJZkNvbnRyb2wuc2V0Qm91bmRzKGNvbHVtblBvc2l0aW9uICsgNSwgci55ICsgMSwgZlRyZWUxLmdldENsaWVudEFyZWEoKS53aWR0aCAtIChjb2x1bW5Qb3NpdGlvbiArIDUpLCByLmhlaWdodCAtIDEpOwotCQkJCQlmQ29udHJvbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQlmQ2VsbEVkaXRvci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQkJCWZDZWxsRWRpdG9yLmFkZExpc3RlbmVyKHRoaXMpOwotCQkJCQlmQ2VsbEVkaXRvci5zZXRGb2N1cygpOwotCQkJCQlmQ29udHJvbC5hZGRGb2N1c0xpc3RlbmVyKHRoaXMpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJCQlmQ2VsbEVkaXRvci5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQlmQ29udHJvbC5yZW1vdmVGb2N1c0xpc3RlbmVyKHRoaXMpOwotCQkJCWZDZWxsRWRpdG9yLmRlYWN0aXZhdGUoKTsKLQkJCQlmVHJlZTEuZm9yY2VGb2N1cygpOwotCQkJfQotCi0JCQkvLyBJQ2VsbEVkaXRvckxpc3RlbmVyIG1ldGhvZHMKLQkJCS8vCi0JCQlwdWJsaWMgdm9pZCBhcHBseUVkaXRvclZhbHVlKCkgewotCQkJCWFwcGx5Q2VsbEVkaXRvclZhbHVlKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNhbmNlbEVkaXRvcigpIHsKLQkJCQlkZWFjdGl2YXRlQ2VsbEVkaXRvcigpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBlZGl0b3JWYWx1ZUNoYW5nZWQoYm9vbGVhbiBvbGRWYWxpZFN0YXRlLCBib29sZWFuIG5ld1ZhbGlkU3RhdGUpIHsKLQkJCQkvLyBub3RoaW5nLCBmb3Igbm93Ci0JCQl9Ci0KLQkJCS8vIEZvY3VzTGlzdGVuZXIgbWV0aG9kcwotCQkJLy8KLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWFwcGx5Q2VsbEVkaXRvclZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9WaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJmZDIzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9WaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHBhbmRBY3Rpb247Ci0JcHJvdGVjdGVkIEFic3RyYWN0VHJlZVZpZXdlciB2aWV3ZXIgPSBudWxsOwotCi0JcHVibGljIFZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uKGJvb2xlYW4gaXNFeHBhbmRBY3Rpb24pIHsKLQkJdGhpcy5pc0V4cGFuZEFjdGlvbiA9IGlzRXhwYW5kQWN0aW9uOwotCQlpZiAoaXNFeHBhbmRBY3Rpb24pIHsKLQkJCUltYWdlRGVzY3JpcHRvciBlX2ltYWdlRGVzY3JpcHRvciA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfRVhQQU5EQUxMKTsKLQkJCUltYWdlRGVzY3JpcHRvciBkX2ltYWdlRGVzY3JpcHRvciA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfRVhQQU5EQUxMKTsKLQotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGVfaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKGRfaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCXNldFRvb2xUaXBUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0lORk9fRVhQQU5EX0FMTCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZV9pbWFnZURlc2NyaXB0b3IgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VUT09MX0NPTExBUFNFQUxMKTsKLQkJCUltYWdlRGVzY3JpcHRvciBkX2ltYWdlRGVzY3JpcHRvciA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQ09MTEFQU0VBTEwpOwotCi0JCQlzZXRJbWFnZURlc2NyaXB0b3IoZV9pbWFnZURlc2NyaXB0b3IpOwotCQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoZF9pbWFnZURlc2NyaXB0b3IpOwotCQkJc2V0VG9vbFRpcFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfSU5GT19DT0xMQVBTRV9BTEwpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyKEFic3RyYWN0VHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCS8vIHRlbXBvcmFyaWx5IHNldCB0aGUgdmlzaWJpbGl0eSB0byBmYWxzZQotCQkJLy8gdGhpcyBoYXMgYSBIVUdFIHBlcmZvcm1hbmNlIGJlbmVmaXQKLQkJCWJvb2xlYW4gaXNWaXNpYmxlID0gdmlld2VyLmdldENvbnRyb2woKS5nZXRWaXNpYmxlKCk7Ci0JCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldFZpc2libGUoZmFsc2UpOwotCi0JCQlpZiAoaXNFeHBhbmRBY3Rpb24pIHsKLQkJCQl2aWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2aWV3ZXIuY29sbGFwc2VBbGwoKTsKLQkJCX0KLQotCQkJLy8gcmVzdG9yZSB0aGUgcHJldmlvdXMgdmlzaWJpbGl0eSBzdGF0ZQotCQkJLy8gCi0JCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldFZpc2libGUoaXNWaXNpYmxlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzODBjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLQotCi0vKioKLSAqIERlZmluZXMgdGhlIGRlZmluaXRpb25zIGlkcyBmb3IgdGhlIFhNTCBlZGl0b3IgYWN0aW9ucy4KLSAqIAotICogQGRlcHJlY2F0ZWQgVXNlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51dGlsLkFjdGlvbkRlZmluaXRpb25JZHMKLSAqICAgICAgICAgICAgIGluc3RlYWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTEVBTlVQX0RPQ1VNRU5UID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51aS5jbGVhbnVwLmRvY3VtZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9STUFUX0RPQ1VNRU5UID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51aS5mb3JtYXQuZG9jdW1lbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1JNQVRfQUNUSVZFX0VMRU1FTlRTID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51aS5mb3JtYXQuYWN0aXZlLmVsZW1lbnRzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgT1BFTl9GSUxFID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51aS5vcGVuLmZpbGUuZnJvbS5zb3VyY2UiOy8vJE5PTi1OTFMtMSQKLQkvLyBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTkZPUk1BVElPTiA9Ci0JLy8gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51aS5zaG93LnRvb2x0aXAuaW5mb3JtYXRpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTkZPUk1BVElPTiA9ICJvcmcuZWNsaXBzZS5qZHQudWkuZWRpdC50ZXh0LmphdmEuc2hvdy5qYXZhZG9jIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0JSRUFLUE9JTlRTID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51aS5hZGQuYnJlYWtwb2ludHMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNQU5BR0VfQlJFQUtQT0lOVFMgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnVpLm1hbmFnZS5icmVha3BvaW50cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVOQUJMRV9CUkVBS1BPSU5UUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuZW5hYmxlLmJyZWFrcG9pbnRzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElTQUJMRV9CUkVBS1BPSU5UUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuZGlzYWJsZS5icmVha3BvaW50cyI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvck1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMjBhNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgWE1MIEVkaXRvcgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTEVkaXRvck1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MRWRpdG9yUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUYWJsZVRyZWVWaWV3ZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUYWJsZVRyZWVWaWV3ZXJfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUYWJsZVRyZWVWaWV3ZXJfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0XzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVHJlZUV4dGVuc2lvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRyZWVFeHRlbnNpb25fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUcmVlRXh0ZW5zaW9uXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVHJlZUV4dGVuc2lvbl80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl84OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFuX2Vycm9yX2hhc19vY2N1cnJlZF93aGVuMV9FUlJPUl87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVDb2x1bW5zX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlX19kb2VzX25vdF9leGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfY291bGRfbm90X2JlX29wZW47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JNZW51X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJlZUV4dGVuc2lvbl8wOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFhNTEVkaXRvck1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFhNTEVkaXRvck1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTExMjg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgaW1hZ2VzIHByb3ZpZGVkIGJ5IHRoaXMgcGx1Zy1pbi4KLSAqIAotICogTk9URTogRm9yIGludGVybmFsIHVzZSBvbmx5LiBGb3IgaW1hZ2VzIHVzZWQgZXh0ZXJuYWxseSwgcGxlYXNlIHVzZSB0aGUKLSAqIFNoYXJlZCoqKkltYWdlSGVscGVyIGNsYXNzIGluc3RlYWQuCi0gKiAKLSAqIEBhdXRob3IgYW15d3UKLSAqLwotcHVibGljIGNsYXNzIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQTFVHSU5JRCA9IFhNTFVJUGx1Z2luLklEOwotCXByaXZhdGUgc3RhdGljIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyIGluc3RhbmNlID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfTUVOVSA9ICJlZGl0b3IueG1sX3RhYmxldHJlZS5tZW51IjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gc2F2ZSBhIGRlc2NyaXB0b3IgZm9yIGVhY2ggaW1hZ2UKLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwIGZJbWFnZURlc2NSZWdpc3RyeSA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIoKTsKLQkJCWluaXRpYWxpemVSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRpYWxpemVSZWdpc3RyeSgpIHsKLQkJLy8gVGFrZW4gZnJvbSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hJbWFnZXMKLQkJRGlzcGxheSBkID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgICAgIAotICAgICAgICBJbWFnZSB2aWV3TWVudSA9IG5ldyBJbWFnZShkLCAxMSwgMTYpOwotICAgICAgICBJbWFnZSB2aWV3TWVudU1hc2sgPSBuZXcgSW1hZ2UoZCwgMTEsIDE2KTsKLSAgICAgICAgCi0gICAgICAgIEdDIGdjID0gbmV3IEdDKHZpZXdNZW51KTsKLSAgICAgICAgR0MgbWFza2djID0gbmV3IEdDKHZpZXdNZW51TWFzayk7Ci0gICAgICAgIGRyYXdWaWV3TWVudShnYywgbWFza2djKTsKLSAgICAgICAgZ2MuZGlzcG9zZSgpOwotICAgICAgICBtYXNrZ2MuZGlzcG9zZSgpOwotICAgICAgICAKLSAgICAgICAgSW1hZ2VEYXRhIGRhdGEgPSB2aWV3TWVudS5nZXRJbWFnZURhdGEoKTsKLSAgICAgICAgZGF0YS50cmFuc3BhcmVudFBpeGVsID0gZGF0YS5nZXRQaXhlbCgwLDApOwotICAgICAgICAKLSAgICAgICAgSW1hZ2Ugdm0yID0gbmV3IEltYWdlKGQsIHZpZXdNZW51LmdldEltYWdlRGF0YSgpLCB2aWV3TWVudU1hc2suZ2V0SW1hZ2VEYXRhKCkpOwotICAgICAgICB2aWV3TWVudS5kaXNwb3NlKCk7Ci0gICAgICAgIHZpZXdNZW51TWFzay5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIGdldEltYWdlUmVnaXN0cnkoKS5wdXQoRURJVE9SX01FTlUsIHZtMik7Ci0gICAgICAgIGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkucHV0KEVESVRPUl9NRU5VLCBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUltYWdlKHZtMikpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZHJhd1ZpZXdNZW51KEdDIGdjLCBHQyBtYXNrZ2MpIHsKLSAgICAJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgCQotICAgIAlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9EQVJLX1NIQURPVykpOwotICAgIAlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkpOwotICAgIAkKLQkgICAgaW50W10gc2hhcGVBcnJheSA9IG5ldyBpbnRbXSB7MSwgMSwgMTAsIDEsIDYsIDUsIDUsIDV9OwotCSAgICBnYy5maWxsUG9seWdvbihzaGFwZUFycmF5KTsKLQkgICAgZ2MuZHJhd1BvbHlnb24oc2hhcGVBcnJheSk7Ci0JICAgIAotCSAgICBDb2xvciBibGFjayA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKTsKLQkgICAgQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSk7Ci0JICAgIAotCSAgICBtYXNrZ2Muc2V0QmFja2dyb3VuZChibGFjayk7Ci0JICAgIG1hc2tnYy5maWxsUmVjdGFuZ2xlKDAsMCwxMiwxNik7Ci0JICAgIAotCSAgICBtYXNrZ2Muc2V0QmFja2dyb3VuZCh3aGl0ZSk7Ci0JICAgIG1hc2tnYy5zZXRGb3JlZ3JvdW5kKHdoaXRlKTsKLQkgICAgbWFza2djLmZpbGxQb2x5Z29uKHNoYXBlQXJyYXkpOwotCSAgICBtYXNrZ2MuZHJhd1BvbHlnb24oc2hhcGVBcnJheSk7Ci0gICAgfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UgZnJvbSB0aGUgaW1hZ2UgcmVnaXN0cnkuCi0JICogSWYgdGhlIGltYWdlIGNhbm5vdCBiZSByZXRyaWV2ZWQsIGF0dGVtcHQgdG8gZmluZCBhbmQgbG9hZCB0aGUgaW1hZ2UgYXQKLQkgKiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZSB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIG9yIG51bGwgaWYgb25lIGNvdWxkCi0JICogICAgICAgICBub3QgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYW4gaW1hZ2UKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlCi0JICogZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgdGhlIGltYWdlIGRlc2NyaXB0b3IgY2Fubm90IGJlIHJldHJpZXZlZCwKLQkgKiBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZAotCSAqIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIGRlc2NyaXB0b3IgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2F0ZWQgd2l0aCByZXNvdXJjZSBvcgotCSAqICAgICAgICAgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgb25lIGNvdWxkIG5vdCBiZQotCSAqICAgICAgICAgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCU9iamVjdCBvID0gZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYSBkZXNjcmlwdG9yCi0JCQlpbWFnZURlc2NyaXB0b3IgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gKEltYWdlRGVzY3JpcHRvcikgbzsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSGFzaE1hcCAtIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlmSW1hZ2VEZXNjUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJldHVybiBmSW1hZ2VEZXNjUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSW1hZ2VSZWdpc3RyeSAtIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGZyb20gdGhlIGdpdmVuIHJlc291cmNlIGFuZCBhZGRzIHRoZSBpbWFnZSB0byB0aGUKLQkgKiBpbWFnZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIEltYWdlCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBjcmVhdGVJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBnZXRJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQkvLyBkb250IGFkZCB0aGUgbWlzc2luZyBpbWFnZSBkZXNjcmlwdG9yIGltYWdlIHRvIHRoZSBpbWFnZQotCQkJLy8gcmVnaXN0cnkKLQkJCWlmICghZGVzYy5lcXVhbHMoSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKSkpIHsKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBpbWFnZUZpbGVQYXRoIGFuZCBhZGRzIHRoZQotCSAqIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIGFuIGltYWdlCi0JICogZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBpcyByZXR1cm5lZCBidXQgbm90IGFkZGVkIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgZGVzY3JpcHRvciBmb3IgaW1hZ2VGaWxlUGF0aCBvciBkZWZhdWx0Ci0JICogICAgICAgICAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRmlsZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNWYwMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLS8qKgotICogQnVuZGxlIG9mIG1vc3QgaW1hZ2VzIHVzZWQgYnkgdGhlIFhNTCBFZGl0b3IgcGx1Zy1pbi4KLSAqLwotcHVibGljIGNsYXNzIFhNTEVkaXRvclBsdWdpbkltYWdlcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0NPTExBUFNFID0gImljb25zL2Z1bGwvZHRvb2wxNi9jb2xsYXBzZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0NPTExBUFNFID0gImljb25zL2Z1bGwvZXRvb2wxNi9jb2xsYXBzZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0NPTExBUFNFQUxMID0gImljb25zL2Z1bGwvZHRvb2wxNi9jb2xsYXBzZV9hbGwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9DT0xMQVBTRUFMTCA9ICJpY29ucy9mdWxsL2V0b29sMTYvY29sbGFwc2VfYWxsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfRVhQQU5EID0gImljb25zL2Z1bGwvZHRvb2wxNi9leHBhbmQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9FWFBBTkQgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L2V4cGFuZC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0VYUEFOREFMTCA9ICJpY29ucy9mdWxsL2R0b29sMTYvZXhwYW5kX2FsbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0VYUEFOREFMTCA9ICJpY29ucy9mdWxsL2V0b29sMTYvZXhwYW5kX2FsbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX05FV19YTUwgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L25ld194bWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9ORVdfWE1MID0gImljb25zL2Z1bGwvZXRvb2wxNi9uZXdfeG1sLmdpZiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNGEzOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1YTUxUYWJsZVRyZWVWaWV3ZXJfMD1EZXNpZ24KLVhNTFRhYmxlVHJlZVZpZXdlcl8xPU5vZGUKLVhNTFRhYmxlVHJlZVZpZXdlcl8yPUNvbnRlbnQKLVhNTE11bHRpUGFnZUVkaXRvclBhcnRfMD1Tb3VyY2UKLVhNTFRyZWVFeHRlbnNpb25fMD1TdHJ1Y3R1cmUKLVhNTFRyZWVFeHRlbnNpb25fMT1WYWx1ZQotWE1MVHJlZUV4dGVuc2lvbl8zPVRoZSBkb2N1bWVudCBpcyBlbXB0eS4KLVhNTFRyZWVFeHRlbnNpb25fND1SaWdodCBtb3VzZSBjbGljayBoZXJlIHRvIGluc2VydCBjb250ZW50LgotWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfMD0mWE1MCi1YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8xPSZFeHBhbmQgQWxsCi1YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8yPSZDb2xsYXBzZSBBbGwKLVhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzM9VHVybiBHcmFtbWFyIENvbnN0cmFpbnRzIE9mZgotWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfND0mVHVybiBHcmFtbWFyIENvbnN0cmFpbnRzIE9mZgotWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNT1UdXJuIEdyYW1tYXIgQ29uc3RyYWludHMgT24KLVhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzY9JlR1cm4gR3JhbW1hciBDb25zdHJhaW50cyBPbgotWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNz1SZWxvYWQgRGVwZW5kZW5jaWVzCi1YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl84PSZSZWxvYWQgRGVwZW5kZW5jaWVzCi0jIwotQW5fZXJyb3JfaGFzX29jY3VycmVkX3doZW4xX0VSUk9SXz1BbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hlbiBpbml0aWFsaXppbmcgdGhlIGlucHV0IGZvciB0aGUgdGhlIGVkaXRvcidzIHNvdXJjZSBwYWdlLgotQ29uZmlndXJlQ29sdW1uc19sYWJlbD0mQ29sdW1ucy4uLgotUmVzb3VyY2VfX2RvZXNfbm90X2V4aXN0PVJlc291cmNlIHswfSBkb2VzIG5vdCBleGlzdC4KLUVkaXRvcl9jb3VsZF9ub3RfYmVfb3Blbj1FZGl0b3IgY291bGQgbm90IGJlIG9wZW4gb24gezB9Ci1FZGl0b3JNZW51X3Rvb2x0aXA9RWRpdG9yIE1lbnUKLVRyZWVFeHRlbnNpb25fMD1DYW5ub3QgZGlzcGxheSBkb2N1bWVudCBjb250ZW50cy4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDRlZTRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLQotcHVibGljIGNsYXNzIFhNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgU291cmNlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRzTXVsdGlJbml0ID0gdHJ1ZTsKLQotCXB1YmxpYyBYTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlzdXBlci5pbml0RGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IoYWN0aW9uQmFycyk7Ci0KLQkJaWYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWlmIChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciBpbnN0YW5jZW9mIElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJCSgoSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikuaW5pdFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9ucyhhY3Rpb25CYXJzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFjdGl2YXRlRGVzaWduUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJaWYgKChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKSAmJiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpKSB7Ci0JCQkvLyBpZiBkZXNpZ24gcGFnZSBpcyBub3QgcmVhbGx5IGFuIElFZGl0b3JQYXJ0LCBhY3RpdmVFZGl0b3IgPT0KLQkJCS8vIG51bGwsIHNvIHBhc3MgaW4gbXVsdGlQYWdlRWRpdG9yIGluc3RlYWQgKGQyODI0MTQpCi0JCQlpZiAoYWN0aXZlRWRpdG9yID09IG51bGwpIHsKLQkJCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IobXVsdGlQYWdlRWRpdG9yKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCQkJfQotCQkJKChJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKS5zZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCWlmICgoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCkgJiYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSkgewotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKG11bHRpUGFnZUVkaXRvcik7Ci0JCQkoKElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZVNvdXJjZVBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0JCWlmICgoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCkgJiYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSkgewotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKG11bHRpUGFnZUVkaXRvcik7Ci0JCQkoKElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJaWYgKChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKSAmJiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpKSB7Ci0JCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQkJCSgoSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcikuc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNpbml0KG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlzdXBlci5pbml0KGFjdGlvbkJhcnMpOwotCQluZWVkc011bHRpSW5pdCA9IHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3Ijc2V0QWN0aXZlRWRpdG9yKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJaWYgKG5lZWRzTXVsdGlJbml0KSB7Ci0JCQlkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciA9IG5ldyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQkJaW5pdERlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKGdldEFjdGlvbkJhcnMoKSk7Ci0JCQluZWVkc011bHRpSW5pdCA9IGZhbHNlOwotCQl9Ci0JCXN1cGVyLnNldEFjdGl2ZUVkaXRvcih0YXJnZXRFZGl0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MTXVsdGlQYWdlRWRpdG9yUGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MTXVsdGlQYWdlRWRpdG9yUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzY1MzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTE11bHRpUGFnZUVkaXRvclBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Ub29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Db25maWd1cmVDb2x1bW5zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuU2FtZVNoZWxsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVByb3BlcnR5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVhNTFByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgWE1MTXVsdGlQYWdlRWRpdG9yUGFydCBleHRlbmRzIE11bHRpUGFnZUVkaXRvclBhcnQgewotCi0JLyoqCi0JICogSW50ZXJuYWwgcGFydCBhY3RpdmF0aW9uIGxpc3RlbmVyLCBjb3BpZWQgZnJvbSBBYnN0cmFjdFRleHRFZGl0b3IKLQkgKi8KLQljbGFzcyBBY3RpdmF0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJUGFydExpc3RlbmVyLCBJV2luZG93TGlzdGVuZXIgewotCi0JCS8qKgotCQkgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hpbGRyZW4gdGhlIHJvb3Qgbm9kZXMgY2FuIGhhdmUgZm9yIHRoZQotCQkgKiBkZXNpZ24gcGFnZSB0byBhdXRvIGV4cGFuZCB0aGUgcm9vdCBub2RlcwotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9OVU1fQ0hJTERfTk9ERVNfRk9SX0FVVE9fRVhQQU5EID0gNTAwOwotCQkKLQkJLyoqIENhY2hlIG9mIHRoZSBhY3RpdmUgd29ya2JlbmNoIHBhcnQuICovCi0JCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgZkFjdGl2ZVBhcnQ7Ci0JCS8qKiBJbmRpY2F0ZXMgd2hldGhlciBhY3RpdmF0aW9uIGhhbmRsaW5nIGlzIGN1cnJlbnRseSBiZSBkb25lLiAqLwotCQlwcml2YXRlIGJvb2xlYW4gZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0JCS8qKgotCQkgKiBUaGUgcGFydCBzZXJ2aWNlLgotCQkgKiAKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHJpdmF0ZSBJUGFydFNlcnZpY2UgZlBhcnRTZXJ2aWNlOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIHRoaXMgYWN0aXZhdGlvbiBsaXN0ZW5lci4KLQkJICogCi0JCSAqIEBwYXJhbSBwYXJ0U2VydmljZQotCQkgKiAgICAgICAgICAgIHRoZSBwYXJ0IHNlcnZpY2Ugb24gd2hpY2ggdG8gYWRkIHRoZSBwYXJ0IGxpc3RlbmVyCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyBBY3RpdmF0aW9uTGlzdGVuZXIoSVBhcnRTZXJ2aWNlIHBhcnRTZXJ2aWNlKSB7Ci0JCQlmUGFydFNlcnZpY2UgPSBwYXJ0U2VydmljZTsKLQkJCWZQYXJ0U2VydmljZS5hZGRQYXJ0TGlzdGVuZXIodGhpcyk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERpc3Bvc2VzIHRoaXMgYWN0aXZhdGlvbiBsaXN0ZW5lci4KLQkJICogCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlmUGFydFNlcnZpY2UucmVtb3ZlUGFydExpc3RlbmVyKHRoaXMpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5yZW1vdmVXaW5kb3dMaXN0ZW5lcih0aGlzKTsKLQkJCWZQYXJ0U2VydmljZSA9IG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydEFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJZkFjdGl2ZVBhcnQgPSBwYXJ0OwotCQkJaGFuZGxlQWN0aXZhdGlvbigpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRCcm91Z2h0VG9Ub3Aob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0Q2xvc2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydERlYWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWZBY3RpdmVQYXJ0ID0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0T3BlbmVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlpZiAoZkRlc2lnblZpZXdlciBpbnN0YW5jZW9mIEFic3RyYWN0VHJlZVZpZXdlcikgewotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCQkJSURPTURvY3VtZW50IG1vZGVsRG9jdW1lbnQgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJCQlOb2RlTGlzdCByb290Q2hpbGRyZW4gPSBtb2RlbERvY3VtZW50LmdldENoaWxkTm9kZXMoKTsKLQotCQkJCQkJYm9vbGVhbiB0b29NYW55Q2hpbGRyZW4gPSAocm9vdENoaWxkcmVuLmdldExlbmd0aCgpID4gTUFYX05VTV9DSElMRF9OT0RFU19GT1JfQVVUT19FWFBBTkQpOwotCQkJCQkJLyoKLQkJCQkJCSAqIEZvciBlYWNoIHJvb3QgKHRoZXJlIHNob3VsZCByZWFsbHkgb25seSBiZSBvbmUKLQkJCQkJCSAqIHJlYWwgcm9vdCBidXQgdGhlcmUgYXJlIGFsc28gY291bGQgYmUgZW1wdHkKLQkJCQkJCSAqIHRleHQgcmVnaW9ucyBhbmQgZG9jIHR5cGUgYXQgdGhlIHJvb3QgbGV2ZWwpCi0JCQkJCQkgKiBkZXRlcm1pbmUgaWYgaXQgaGFzIHRvIG1hbnkgY2hpbGRyZW4gb3Igbm90IHRvCi0JCQkJCQkgKiBhdXRvIGV4cGFuZAotCQkJCQkJICovCi0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RDaGlsZHJlbi5nZXRMZW5ndGgoKSAmJiAhdG9vTWFueUNoaWxkcmVuOyArK2kpIHsKLQkJCQkJCQl0b29NYW55Q2hpbGRyZW4gPSAocm9vdENoaWxkcmVuLml0ZW0oaSkuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpID4gTUFYX05VTV9DSElMRF9OT0RFU19GT1JfQVVUT19FWFBBTkQpOwotCQkJCQkJfQotCi0JCQkJCQkvKgotCQkJCQkJICogaWYgcm9vdCBub2RlIGRvZXMgbm90IGhhdmUgdG8gbWFueSBjaGlsZHJlbiB0aGVuCi0JCQkJCQkgKiBhdXRvIGV4cGFuZCB0aGUgcm9vdCBub2RlCi0JCQkJCQkgKi8KLQkJCQkJCWlmICghdG9vTWFueUNoaWxkcmVuKSB7Ci0JCQkJCQkJKChBYnN0cmFjdFRyZWVWaWV3ZXIpIGZEZXNpZ25WaWV3ZXIpLmV4cGFuZFRvTGV2ZWwoMik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBIYW5kbGVzIHRoZSBhY3RpdmF0aW9uIHRyaWdnZXJpbmcgYSBlbGVtZW50IHN0YXRlIGNoZWNrIGluIHRoZQotCQkgKiBlZGl0b3IuCi0JCSAqLwotCQl2b2lkIGhhbmRsZUFjdGl2YXRpb24oKSB7Ci0JCQlpZiAoZklzSGFuZGxpbmdBY3RpdmF0aW9uIHx8IChnZXRUZXh0RWRpdG9yKCkgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChmQWN0aXZlUGFydCA9PSBYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0LnRoaXMpIHsKLQkJCQlmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSB0cnVlOwotCQkJCXRyeSB7Ci0JCQkJCWdldFRleHRFZGl0b3IoKS5zYWZlbHlTYW5pdHlDaGVja1N0YXRlKGdldEVkaXRvcklucHV0KCkpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93QWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0FjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJaWYgKHdpbmRvdyA9PSBnZXRFZGl0b3JTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkpIHsKLQkJCQkvKgotCQkJCSAqIFdvcmthcm91bmQgZm9yIHByb2JsZW0gZGVzY3JpYmVkIGluCi0JCQkJICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTczMSBXaWxsIGJlCi0JCQkJICogcmVtb3ZlZCB3aGVuIFNXVCBoYXMgc29sdmVkIHRoZSBwcm9ibGVtLgotCQkJCSAqLwotCQkJCXdpbmRvdy5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQloYW5kbGVBY3RpdmF0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0RlYWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0RlYWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lciN3aW5kb3dDbG9zZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2VkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lciN3aW5kb3dPcGVuZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgd2luZG93T3BlbmVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMaXN0ZW5zIGZvciBzZWxlY3Rpb24gZnJvbSB0aGUgc291cmNlIHBhZ2UsIGFwcGx5aW5nIGl0IHRvIHRoZSBkZXNpZ24KLQkgKiB2aWV3ZXIuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZXh0RWRpdG9yUG9zdFNlbGVjdGlvbkFkYXB0ZXIgZXh0ZW5kcyBVSUpvYiBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQlib29sZWFuIGZvcmNlUG9zdFNlbGVjdGlvbiA9IGZhbHNlOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQkJcHVibGljIFRleHRFZGl0b3JQb3N0U2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXN1cGVyKGdldFRpdGxlKCkpOwotCQkJc2V0VXNlcih0cnVlKTsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCQlmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoKGZEZXNpZ25WaWV3ZXIgIT0gbnVsbCkgJiYgKChnZXRBY3RpdmVQYWdlKCkgIT0gZkRlc2lnblBhZ2VJbmRleCkgfHwgIVhNTE11bHRpUGFnZUVkaXRvclBhcnQudGhpcy5lcXVhbHMoZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCkpKSkgewotCQkJCWlmIChmb3JjZVBvc3RTZWxlY3Rpb24pIHsKLQkJCQkJc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCXNjaGVkdWxlKDIwMCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFBhZ2VJbml0aWFsaXphdGlvbkRhdGEgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZkVsZW1lbnQ7Ci0JCVN0cmluZyBmUHJvcGVydHlOYW1lOwotCQlPYmplY3QgZkRhdGE7Ci0KLQkJUGFnZUluaXRpYWxpemF0aW9uRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2ZpZywgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGRhdGEpIHsKLQkJCXN1cGVyKCk7Ci0JCQlmRWxlbWVudCA9IGNmaWc7Ci0JCQlmUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotCQkJZkRhdGEgPSBkYXRhOwotCQl9Ci0KLQkJdm9pZCBzZW5kSW5pdGlhbGl6YXRpb25EYXRhKElFeGVjdXRhYmxlRXh0ZW5zaW9uIGV4ZWN1dGFibGVFeHRlbnNpb24pIHsKLQkJCXRyeSB7Ci0JCQkJZXhlY3V0YWJsZUV4dGVuc2lvbi5zZXRJbml0aWFsaXphdGlvbkRhdGEoZkVsZW1lbnQsIGZQcm9wZXJ0eU5hbWUsIGZEYXRhKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwgSVByb3BlcnR5TGlzdGVuZXIgb24gdGhlIHNvdXJjZSBwYWdlCi0JICovCi0JY2xhc3MgUHJvcGVydHlMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzb3VyY2UsIGludCBwcm9wSWQpIHsKLQkJCXN3aXRjaCAocHJvcElkKSB7Ci0JCQkJLy8gaGFkIHRvIGltcGxlbWVudCBpbnB1dCBjaGFuZ2VkICJsaXN0ZW5lciIgc28gdGhhdAotCQkJCS8vIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGNvdWxkIHRlbGwgaXQgY29udGFpbmluZyBlZGl0b3IgdGhhdAotCQkJCS8vIHRoZSBpbnB1dCBoYXMgY2hhbmdlLCB3aGVuIGEgJ3Jlc291cmNlIG1vdmVkJyBldmVudCBpcwotCQkJCS8vIGZvdW5kLgotCQkJCWNhc2UgSUVkaXRvclBhcnQuUFJPUF9JTlBVVCA6IHsKLQkJCQkJaWYgKHNvdXJjZSA9PSBnZXRUZXh0RWRpdG9yKCkgJiYgZkRlc2lnblZpZXdlciBpbnN0YW5jZW9mIFhNTFRhYmxlVHJlZVZpZXdlcikgewotCQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCQkJCQlJRE9NRG9jdW1lbnQgbW9kZWxEb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJCQkJT2JqZWN0IGRlc2lnbklucHV0ID0gKChYTUxUYWJsZVRyZWVWaWV3ZXIpIGZEZXNpZ25WaWV3ZXIpLmdldElucHV0KCk7Ci0JCQkJCQkJCWlmIChtb2RlbERvY3VtZW50ICE9IGRlc2lnbklucHV0KQotCQkJCQkJCQkJc2V0SW5wdXQoZ2V0VGV4dEVkaXRvcigpLmdldEVkaXRvcklucHV0KCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXNlIElFZGl0b3JQYXJ0LlBST1BfRElSVFkgOiB7Ci0JCQkJCWlmIChzb3VyY2UgPT0gZ2V0VGV4dEVkaXRvcigpKSB7Ci0JCQkJCQlpZiAoZ2V0VGV4dEVkaXRvcigpLmdldEVkaXRvcklucHV0KCkgIT0gZ2V0RWRpdG9ySW5wdXQoKSkgewotCQkJCQkJCXNldElucHV0KGdldFRleHRFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJCQkvKgotCQkJCQkJCSAqIHRpdGxlIHNob3VsZCBhbHdheXMgY2hhbmdlIHdoZW4gaW5wdXQgY2hhbmdlcy4KLQkJCQkJCQkgKiBjcmVhdGUgcnVubmFibGUgZm9yIGZvbGxvd2luZyBwb3N0IGNhbGwKLQkJCQkJCQkgKi8KLQkJCQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJX2ZpcmVQcm9wZXJ0eUNoYW5nZShJV29ya2JlbmNoUGFydC5QUk9QX1RJVExFKTsKLQkJCQkJCQkJfQotCQkJCQkJCX07Ci0JCQkJCQkJLyoKLQkJCQkJCQkgKiBVcGRhdGUgaXMganVzdCB0byBwb3N0IHRoaW5ncyBvbiB0aGUgZGlzcGxheQotCQkJCQkJCSAqIHF1ZXVlICh0aHJlYWQpLiBXZSBoYXZlIHRvIGRvIHRoaXMgdG8gZ2V0IHRoZQotCQkJCQkJCSAqIGRpcnR5IHByb3BlcnR5IHRvIGdldCB1cGRhdGVkIGFmdGVyIG90aGVyCi0JCQkJCQkJICogdGhpbmdzIG9uIHRoZSBxdWV1ZSBhcmUgZXhlY3V0ZWQuCi0JCQkJCQkJICovCi0JCQkJCQkJKChDb250cm9sKSBnZXRUZXh0RWRpdG9yKCkuZ2V0QWRhcHRlcihDb250cm9sLmNsYXNzKSkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgSVdvcmtiZW5jaFBhcnQuUFJPUF9USVRMRSA6IHsKLQkJCQkJLy8gdXBkYXRlIHRoZSBpbnB1dCBpZiB0aGUgdGl0bGUgaXMgY2hhbmdlZAotCQkJCQlpZiAoc291cmNlID09IGdldFRleHRFZGl0b3IoKSkgewotCQkJCQkJaWYgKGdldFRleHRFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpICE9IGdldEVkaXRvcklucHV0KCkpIHsKLQkJCQkJCQlzZXRJbnB1dChnZXRUZXh0RWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWRlZmF1bHQgOiB7Ci0JCQkJCS8vIHByb3BhZ2F0ZSBjaGFuZ2VzLiBJcyB0aGlzIG5lZWRlZD8gQW5zd2VyOiBZZXMuCi0JCQkJCWlmIChzb3VyY2UgPT0gZ2V0VGV4dEVkaXRvcigpKSB7Ci0JCQkJCQlfZmlyZVByb3BlcnR5Q2hhbmdlKHByb3BJZCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQl9Ci0KLQljbGFzcyBUZXh0SW5wdXRMaXN0ZW5lciBpbXBsZW1lbnRzIElUZXh0SW5wdXRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50Q2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQkJaWYgKChmRGVzaWduVmlld2VyICE9IG51bGwpICYmIChuZXdJbnB1dCAhPSBudWxsKSkgewotCQkJCWZEZXNpZ25WaWV3ZXIuc2V0RG9jdW1lbnQobmV3SW5wdXQpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKCkgewotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgZWxlbWVudDsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCXJldHVybiBnZXRUZXh0KCgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCkpOwotCQkJfQotCi0JCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiBub2RlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIG5vZGU7Ci0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gKElKRmFjZU5vZGVBZGFwdGVyKSBub3RpZmllci5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQlzLmluc2VydCgwLCBhZGFwdGVyLmdldExhYmVsVGV4dChub2RlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQkJCQlzLmluc2VydCgwLCBJUGF0aC5TRVBBUkFUT1IpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBlbGVtZW50OwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJcmV0dXJuIGdldEltYWdlKCgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCkpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqIFRoZSBkZXNpZ24gcGFnZSBpbmRleC4gKi8KLQlwcml2YXRlIGludCBmRGVzaWduUGFnZUluZGV4OwotCi0JLyoqIFRoZSBkZXNpZ24gdmlld2VyICovCi0JSURlc2lnblZpZXdlciBmRGVzaWduVmlld2VyOwotCS8qKiBBbnkgY29udGFpbmVyIGZvciB0aGUgZGVzaWduIHZpZXdlciAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGZEZXNpZ25Db250YWluZXI7Ci0KLQlwcml2YXRlIEFjdGl2YXRpb25MaXN0ZW5lciBmQWN0aXZhdGlvbkxpc3RlbmVyOwotCi0JSVByb3BlcnR5TGlzdGVuZXIgZlByb3BlcnR5TGlzdGVuZXIgPSBudWxsOwotCi0JLyoqIFRoZSBzb3VyY2UgcGFnZSBpbmRleC4gKi8KLQlpbnQgZlNvdXJjZVBhZ2VJbmRleDsKLQotCS8qKiBUaGUgdGV4dCBlZGl0b3IuICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBmVGV4dEVkaXRvcjsKLQotCXByaXZhdGUgVGV4dEVkaXRvclBvc3RTZWxlY3Rpb25BZGFwdGVyIGZUZXh0RWRpdG9yU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGZTdGF0dXNMaW5lTGFiZWxQcm92aWRlcjsKLQotCXByaXZhdGUgUGFnZUluaXRpYWxpemF0aW9uRGF0YSBmUGFnZUluaXRpYWxpemVyOwotCQotCXByaXZhdGUgVG9vbEJhck1hbmFnZXIgZlRvb2xiYXJNYW5hZ2VyOwotCXByaXZhdGUgVG9vbEJhck1hbmFnZXIgZkVkaXRvck1hbmFnZXI7Ci0KLQkvKiogQ29udGV4dCBtZW51IG1hbmFnZXIgKi8KLQlwcml2YXRlIE1lbnVNYW5hZ2VyIGZNZW51TWFuYWdlcjsKLQotCXByaXZhdGUgYm9vbGVhbiBmQWxsb2NhdGVUb29sYmFyID0gdHJ1ZTsKLQkKLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dE11bHRpUGFnZUVkaXRvclBhcnQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWE1MTXVsdGlQYWdlRWRpdG9yUGFydCgpIHsKLQkJc3VwZXIoKTsKLQkJZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyID0gbmV3IFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBpcyBqdXN0IHRvIG1ha2UgZmlyZVByb3BlcnR5Q2hhbmdlZCBhY2Nlc3NpYmxlIGZyb20gc29tZQotCSAqIChhbm9ub21vdXMpIGlubmVyIGNsYXNzZXMuCi0JICovCi0Jdm9pZCBfZmlyZVByb3BlcnR5Q2hhbmdlKGludCBwcm9wZXJ0eSkgewotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UocHJvcGVydHkpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIHNvdXJjZSBwYWdlIG9mIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU291cmNlUGFnZSgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWZTb3VyY2VQYWdlSW5kZXggPSBhZGRQYWdlKGZUZXh0RWRpdG9yLCBnZXRFZGl0b3JJbnB1dCgpKTsKLQkJc2V0UGFnZVRleHQoZlNvdXJjZVBhZ2VJbmRleCwgWE1MRWRpdG9yTWVzc2FnZXMuWE1MTXVsdGlQYWdlRWRpdG9yUGFydF8wKTsKLQotCQlmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9USVRMRSk7Ci0KLQkJLy8gQ2hhbmdlcyB0byB0aGUgVGV4dCBWaWV3ZXIncyBkb2N1bWVudCBpbnN0YW5jZSBzaG91bGQgYWxzbwotCQkvLyBmb3JjZSBhbgotCQkvLyBpbnB1dCByZWZyZXNoCi0JCWZUZXh0RWRpdG9yLmdldFRleHRWaWV3ZXIoKS5hZGRUZXh0SW5wdXRMaXN0ZW5lcihuZXcgVGV4dElucHV0TGlzdGVuZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29ubmVjdHMgdGhlIGRlc2lnbiB2aWV3ZXIgd2l0aCB0aGUgdmlld2VyIHNlbGVjdGlvbiBtYW5hZ2VyLiBTaG91bGQgYmUKLQkgKiBkb25lIGFmdGVyIGNyZWF0ZVNvdXJjZVBhZ2UoKSBpcyBkb25lIGJlY2F1c2Ugd2UgbmVlZCB0byBnZXQgdGhlCi0JICogVmlld2VyU2VsZWN0aW9uTWFuYWdlciBmcm9tIHRoZSBUZXh0RWRpdG9yLiBzZXRNb2RlbCBpcyBhbHNvIGRvbmUgaGVyZQotCSAqIGJlY2F1c2UgZ2V0TW9kZWwoKSBuZWVkcyB0byByZWZlcmVuY2UgdGhlIFRleHRFZGl0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbm5lY3REZXNpZ25QYWdlKCkgewotCQlpZiAoZkRlc2lnblZpZXdlciAhPSBudWxsKSB7Ci0JCQlmRGVzaWduVmlld2VyLnNldERvY3VtZW50KGdldERvY3VtZW50KCkpOwotCQl9Ci0KLQkJLyoKLQkJICogQ29ubmVjdCBzZWxlY3Rpb24gZnJvbSB0aGUgRGVzaWduIHBhZ2UgdG8gdGhlIHNlbGVjdGlvbiBwcm92aWRlcgotCQkgKiBmb3IgdGhlIFhNTE11bHRpUGFnZUVkaXRvclBhcnQgc28gdGhhdCBzZWxlY3Rpb24gY2hhbmdlcyBpbiB0aGUKLQkJICogRGVzaWduIHBhZ2Ugd2lsbCBwcm9wYWdhdGUgYWNyb3NzIHRoZSB3b3JrYmVuY2gKLQkJICovCi0JCWlmIChmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCkgaW5zdGFuY2VvZiBJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSB7Ci0JCQkoKElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIGZEZXNpZ25WaWV3ZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSkuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlpZiAoZ2V0QWN0aXZlUGFnZSgpICE9IGZTb3VyY2VQYWdlSW5kZXgpIHsKLQkJCQkJCSgoTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIpIGdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKS5maXJlUG9zdFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGdldEFjdGl2ZVBhZ2UoKSAhPSBmU291cmNlUGFnZUluZGV4KSB7Ci0JCQkJCSgoTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIpIGdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKS5maXJlU2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZ2V0QWN0aXZlUGFnZSgpICE9IGZTb3VyY2VQYWdlSW5kZXgpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXVwZGF0ZVN0YXR1c0xpbmUoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJCX0JCQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8qCi0JCSAqIEhhbmRsZSBkb3VibGUtY2xpY2sgaW4gdGhlIERlc2lnbiBwYWdlIGJ5IHNlbGVjdGluZyB0aGUKLQkJICogY29ycmVzcG9uZGluZyBhbW91bnQgb2YgdGV4dCBpbiB0aGUgU291cmNlIHBhZ2UuCi0JCSAqIAotCQkgKiBXYXJuaW5nOiBUaGlzIGltcGxpZXMgbW9yZSBrbm93bGVkZ2Ugb2YgdGhlIGRlc2lnbiB2aWV3ZXIncyB1bmRlcmx5aW5nCi0JCSAqIENvbnRyb2wgdGhhbiBleHByZXNzZWQgaW4gdGhlIElEZXNpZ25WaWV3ZXIgaW50ZXJmYWNlCi0JCSAqLwotCQlmRGVzaWduVmlld2VyLmdldENvbnRyb2woKS5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3VibGVDbGljaywgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGZEZXNpZ25WaWV3ZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpbnQgc3RhcnQgPSAtMTsKLQkJCQlpbnQgbGVuZ3RoID0gLTE7Ci0JCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIHNlbGVjdGlvbiBnb2VzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBvYmplY3QgdG8KLQkJCQkJICogdGhlIGVuZCBvZiB0aGUgbGFzdAotCQkJCQkgKi8KLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCQlPYmplY3QgbyA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCU9iamVjdCBvMiA9IG51bGw7Ci0JCQkJCWlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQkJCW8yID0gc3RydWN0dXJlZFNlbGVjdGlvbi50b0FycmF5KClbc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgLSAxXTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW8yID0gbzsKLQkJCQkJfQotCQkJCQlpZiAobyBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJCXN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBvKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJbGVuZ3RoID0gKChJbmRleGVkUmVnaW9uKSBvMikuZ2V0RW5kT2Zmc2V0KCkgLSBzdGFydDsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChvMiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uKSB7Ci0JCQkJCQlzdGFydCA9ICgoSVRleHRSZWdpb24pIG8pLmdldFN0YXJ0KCk7Ci0JCQkJCQlsZW5ndGggPSAoKElUZXh0UmVnaW9uKSBvMikuZ2V0RW5kKCkgLSBzdGFydDsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCQlzdGFydCA9ICgoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0T2Zmc2V0KCk7Ci0JCQkJCWxlbmd0aCA9ICgoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0TGVuZ3RoKCk7Ci0JCQkJfQotCQkJCWlmICgoc3RhcnQgPiAtMSkgJiYgKGxlbmd0aCA+IC0xKSkgewotCQkJCQlnZXRUZXh0RWRpdG9yKCkuc2VsZWN0QW5kUmV2ZWFsKHN0YXJ0LCBsZW5ndGgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJLyoKLQkJICogQ29ubmVjdCBzZWxlY3Rpb24gZnJvbSB0aGUgU291cmNlIHBhZ2UgdG8gdGhlIHNlbGVjdGlvbiBwcm92aWRlciBvZgotCQkgKiB0aGUgRGVzaWduIHBhZ2Ugc28gdGhhdCBzZWxlY3Rpb24gaW4gdGhlIFNvdXJjZSBwYWdlIHdpbGwgZHJpdmUKLQkJICogc2VsZWN0aW9uIGluIHRoZSBEZXNpZ24gcGFnZS4gUHJlZmVyIHBvc3Qgc2VsZWN0aW9uLgotCQkgKi8KLQkJSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCWlmIChmVGV4dEVkaXRvclNlbGVjdGlvbkxpc3RlbmVyID09IG51bGwpIHsKLQkJCWZUZXh0RWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgVGV4dEVkaXRvclBvc3RTZWxlY3Rpb25BZGFwdGVyKCk7Ci0JCX0KLQkJaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgewotCQkJZlRleHRFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lci5mb3JjZVBvc3RTZWxlY3Rpb24gPSBmYWxzZTsKLQkJCSgoSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgcHJvdmlkZXIpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlRleHRFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmVGV4dEVkaXRvclNlbGVjdGlvbkxpc3RlbmVyLmZvcmNlUG9zdFNlbGVjdGlvbiA9IHRydWU7Ci0JCQlwcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlRleHRFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW5kIEFkZCB0aGUgRGVzaWduIFBhZ2UgdXNpbmcgYSByZWdpc3RlcmVkIGZhY3RvcnkKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5kQWRkRGVzaWduUGFnZSgpIHsKLQkJSURlc2lnblZpZXdlciBkZXNpZ25WaWV3ZXIgPSBjcmVhdGVEZXNpZ25QYWdlKCk7Ci0KLQkJZkRlc2lnblZpZXdlciA9IGRlc2lnblZpZXdlcjsKLQkJLy8gbm90ZTogQnkgYWRkaW5nIHRoZSBkZXNpZ24gcGFnZSBhcyBhIENvbnRyb2wgaW5zdGVhZCBvZiBhbgotCQkvLyBJRWRpdG9yUGFydCwgcGFnZSBzd2l0Y2hlcyB3aWxsIGluZGljYXRlCi0JCS8vIGEgIm51bGwiIGFjdGl2ZSBlZGl0b3Igd2hlbiB0aGUgZGVzaWduIHBhZ2UgaXMgbWFkZSBhY3RpdmUKLQkJaWYgKGZEZXNpZ25Db250YWluZXIgIT0gbnVsbCkKLQkJCWZEZXNpZ25QYWdlSW5kZXggPSBhZGRQYWdlKGZEZXNpZ25Db250YWluZXIpOwotCQllbHNlCi0JCQlmRGVzaWduUGFnZUluZGV4ID0gYWRkUGFnZShkZXNpZ25WaWV3ZXIuZ2V0Q29udHJvbCgpKTsKLQkJCQotCQlzZXRQYWdlVGV4dChmRGVzaWduUGFnZUluZGV4LCBkZXNpZ25WaWV3ZXIuZ2V0VGl0bGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElEZXNpZ25WaWV3ZXIgY3JlYXRlRGVzaWduUGFnZSgpIHsJCQotCQlDb21wb3NpdGUgY29udGFpbmVyID0gZ2V0RGVzaWduQ29udGFpbmVyKGdldENvbnRhaW5lcigpKTsKLQotCQlYTUxUYWJsZVRyZWVWaWV3ZXIgdGFibGVUcmVlVmlld2VyID0gbmV3IFhNTFRhYmxlVHJlZVZpZXdlcihjb250YWluZXIpOwotCQl0YWJsZVRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkvLyBTZXQgdGhlIGRlZmF1bHQgaW5mby1wb3AgZm9yIFhNTCBkZXNpZ24gdmlld2VyLgotCQlYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRhYmxlVHJlZVZpZXdlci5nZXRDb250cm9sKCksIFhNTFRhYmxlVHJlZUhlbHBDb250ZXh0SWRzLlhNTF9ERVNJR05fVklFV19IRUxQSUQpOwotCi0JCS8vIFRvb2xiYXIgd2Fzbid0IGFsbG9jYXRlZAotCQlpZiAoZlRvb2xiYXJNYW5hZ2VyICE9IG51bGwgJiYgZkVkaXRvck1hbmFnZXIgIT0gbnVsbCkgewotCQkJYWRkVG9vbEJhckFjdGlvbnModGFibGVUcmVlVmlld2VyKTsKLQkJCWFkZEVkaXRvckFjdGlvbnModGFibGVUcmVlVmlld2VyKTsKLQkJfQotCQlyZXR1cm4gdGFibGVUcmVlVmlld2VyOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZ2V0RGVzaWduQ29udGFpbmVyKENvbXBvc2l0ZSBkZWZhdWx0Q29udGFpbmVyKSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBkZWZhdWx0Q29udGFpbmVyOwotCQkvLyBjcmVhdGUgYSBjb250YWluZXIgdG8gaG9sZCB0aGUgdG9vbGJhciBpZiBpdCBzaG91bGQgYmUgY3JlYXRlZAotCQlpZiAoZkFsbG9jYXRlVG9vbGJhcikgewotCQkJY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShkZWZhdWx0Q29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJQ29tcG9zaXRlIHRvb2xiYXJDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJCXRvb2xiYXJDb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQl0b29sYmFyQ29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSkpOwotCi0JCQlUb29sQmFyIHRiID0gbmV3IFRvb2xCYXIodG9vbGJhckNvbnRhaW5lciwgU1dULkZMQVQgfCBTV1QuTk9fQkFDS0dST1VORCk7Ci0JCQlmVG9vbGJhck1hbmFnZXIgPSBuZXcgVG9vbEJhck1hbmFnZXIodGIpOwotCQkJdGIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcsIHRydWUsIGZhbHNlKSk7Ci0JCQl0YiA9IG5ldyBUb29sQmFyKHRvb2xiYXJDb250YWluZXIsIFNXVC5GTEFUIHwgU1dULk5PX0JBQ0tHUk9VTkQpOwotCQkJZkVkaXRvck1hbmFnZXIgPSBuZXcgVG9vbEJhck1hbmFnZXIodGIpOwotCQkJdGIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcsIHRydWUsIGZhbHNlKSk7Ci0JCQlmRGVzaWduQ29udGFpbmVyID0gY29udGFpbmVyOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBFZGl0b3JBY3Rpb25zIGV4dGVuZHMgQWN0aW9uIHsKLQkJcHJpdmF0ZSBUb29sQmFyIGZUb29sYmFyOwotCi0JCXB1YmxpYyBFZGl0b3JBY3Rpb25zKFRvb2xCYXIgdG9vbGJhcikgewotCQkJZlRvb2xiYXIgPSB0b29sYmFyOwotCQl9Ci0KLQkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuRURJVE9SX01FTlUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJCXJldHVybiBYTUxFZGl0b3JNZXNzYWdlcy5FZGl0b3JNZW51X3Rvb2x0aXA7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlNZW51IG1lbnUgPSBmTWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUoZkRlc2lnbkNvbnRhaW5lcik7Ci0JCQlQb2ludCBzaXplID0gZlRvb2xiYXIuZ2V0U2l6ZSgpOwotCQkJUG9pbnQgbG9jYXRpb24gPSBmVG9vbGJhci50b0Rpc3BsYXkoMCwgc2l6ZS55KTsKLQkJCW1lbnUuc2V0TG9jYXRpb24obG9jYXRpb24ueCwgbG9jYXRpb24ueSk7Ci0JCQltZW51LnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVG9vbEJhckFjdGlvbnMoSURlc2lnblZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIEFic3RyYWN0VHJlZVZpZXdlcikgewotCQkJVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24gZXhwYW5kID0gbmV3IFZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uKHRydWUpOwotCQkJVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24gY29sbGFwc2UgPSBuZXcgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24oZmFsc2UpOwotCQkJZlRvb2xiYXJNYW5hZ2VyLmFkZChleHBhbmQpOwotCQkJZlRvb2xiYXJNYW5hZ2VyLmFkZChjb2xsYXBzZSk7Ci0JCQlmVG9vbGJhck1hbmFnZXIudXBkYXRlKHRydWUpOwotCQotCQotCQkJZXhwYW5kLnNldFZpZXdlcigoQWJzdHJhY3RUcmVlVmlld2VyKSB2aWV3ZXIpOwotCQkJY29sbGFwc2Uuc2V0Vmlld2VyKChBYnN0cmFjdFRyZWVWaWV3ZXIpIHZpZXdlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRWRpdG9yQWN0aW9ucyhJRGVzaWduVmlld2VyIHZpZXdlcikgewotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgQWJzdHJhY3RUcmVlVmlld2VyKSB7Ci0JCQlmaW5hbCBUcmVlIHRyZWUgPSAoVHJlZSkgKChBYnN0cmFjdFRyZWVWaWV3ZXIpIHZpZXdlcikuZ2V0Q29udHJvbCgpOwotCQkJZk1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0JCQlmTWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb24oWE1MRWRpdG9yTWVzc2FnZXMuQ29uZmlndXJlQ29sdW1uc19sYWJlbCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJQ29uZmlndXJlQ29sdW1ucy5mb3JUcmVlKHRyZWUgLCBuZXcgU2FtZVNoZWxsUHJvdmlkZXIodHJlZSkpOwotCQkJCX0KLQkJCX0pOwotCQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoIm9yZy5lY2xpcHNlLndzdC54bWwudWkuZWRpdG9yIiwgZk1lbnVNYW5hZ2VyLCBnZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZNZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCi0JCQlmRWRpdG9yTWFuYWdlci5hZGQobmV3IEVkaXRvckFjdGlvbnMoZkVkaXRvck1hbmFnZXIuZ2V0Q29udHJvbCgpKSk7Ci0JCQlmRWRpdG9yTWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBwYWdlcyBvZiB0aGlzIG11bHRpLXBhZ2UgZWRpdG9yLgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgb2YgPGNvZGU+TXVsdGlQYWdlRWRpdG9yPC9jb2RlPiBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQkvLyBzb3VyY2UgcGFnZSBNVVNUIGJlIGNyZWF0ZWQgYmVmb3JlIGRlc2lnbiBwYWdlLCBub3cKLQkJCWNyZWF0ZVNvdXJjZVBhZ2UoKTsKLQotCQkJY3JlYXRlQW5kQWRkRGVzaWduUGFnZSgpOwotCQkJYWRkU291cmNlUGFnZSgpOwotCQkJY29ubmVjdERlc2lnblBhZ2UoKTsKLQotCQkJLy8gc2V0IHRoZSBhY3RpdmUgZWRpdG9yIGluIHRoZSBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGZpcnN0Ci0JCQkvLyBiZWZvcmUgc2V0YWN0aXZlcGFnZSBjYWxscyBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yJ3MKLQkJCS8vIHNldGFjdGl2ZXBhZ2UgKGJ1ZzE0MTAxMyAtIHJlbW92ZSB3aGVuIGJ1ZzE1MTQ4OCBpcyBmaXhlZCkKLQkJCUlFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBjb250cmlidXRvciA9IGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpIHsKLQkJCQkoKE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBjb250cmlidXRvcikuc2V0QWN0aXZlRWRpdG9yKHRoaXMpOwotCQkJfQotCi0JCQlpbnQgYWN0aXZlUGFnZUluZGV4ID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0SW50KElYTUxQcmVmZXJlbmNlTmFtZXMuTEFTVF9BQ1RJVkVfUEFHRSk7Ci0JCQlpZiAoKGFjdGl2ZVBhZ2VJbmRleCA+PSAwKSAmJiAoYWN0aXZlUGFnZUluZGV4IDwgZ2V0UGFnZUNvdW50KCkpKSB7Ci0JCQkJc2V0QWN0aXZlUGFnZShhY3RpdmVQYWdlSW5kZXgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0QWN0aXZlUGFnZShmU291cmNlUGFnZUluZGV4KTsKLQkJCX0KLQkJfQotCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQjY3JlYXRlU2l0ZShvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUVkaXRvclNpdGUgY3JlYXRlU2l0ZShJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJSUVkaXRvclNpdGUgc2l0ZSA9IG51bGw7Ci0JCWlmIChlZGl0b3IgPT0gZlRleHRFZGl0b3IpIHsKLQkJCXNpdGUgPSBuZXcgTXVsdGlQYWdlRWRpdG9yU2l0ZSh0aGlzLCBlZGl0b3IpIHsKLQkJCQkvKioKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yU2l0ZSNnZXRBY3Rpb25CYXJDb250cmlidXRvcigpCi0JCQkJICovCi0JCQkJcHVibGljIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJCQkJSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gc3VwZXIuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQkJCQkJSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIG11bHRpQ29udHJpYnV0b3IgPSBYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0LnRoaXMuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0JCQkJCWlmIChtdWx0aUNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgWE1MTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpIHsKLQkJCQkJCWNvbnRyaWJ1dG9yID0gKChYTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcikgbXVsdGlDb250cmlidXRvcikuc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3I7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNvbnRyaWJ1dG9yOwotCQkJCX0KLQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJCS8vIHNldHMgdGhpcyBpZCBzbyBuZXN0ZWQgZWRpdG9yIGlzIGNvbnNpZGVyZWQgeG1sIHNvdXJjZQotCQkJCQkvLyBwYWdlCi0JCQkJCXJldHVybiBDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MICsgIi5zb3VyY2UiOyAvLyROT04tTkxTLTEkOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzaXRlID0gc3VwZXIuY3JlYXRlU2l0ZShlZGl0b3IpOwotCQl9Ci0JCXJldHVybiBzaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHNvdXJjZSBwYWdlIG9mIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTb3VyY2VQYWdlKCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJZlRleHRFZGl0b3IgPSBjcmVhdGVUZXh0RWRpdG9yKCk7Ci0JCWZUZXh0RWRpdG9yLnNldEVkaXRvclBhcnQodGhpcyk7Ci0KLQkJLyoKLQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNDMwMSAtIFhNTCBlZGl0b3IKLQkJICogZG9lcyBub3QgcmVtZW1iZXIgZm9udCBzZXR0aW5ncwotCQkgKiAKLQkJICogQHNlZQotCQkgKiBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciNnZXRTeW1ib2xpY0ZvbnROYW1lKCkKLQkJICovCi0JCWZQYWdlSW5pdGlhbGl6ZXIuc2VuZEluaXRpYWxpemF0aW9uRGF0YShmVGV4dEVkaXRvcik7Ci0KLQkJaWYgKGZQcm9wZXJ0eUxpc3RlbmVyID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0eUxpc3RlbmVyID0gbmV3IFByb3BlcnR5TGlzdGVuZXIoKTsKLQkJfQotCQlmVGV4dEVkaXRvci5hZGRQcm9wZXJ0eUxpc3RlbmVyKGZQcm9wZXJ0eUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgY3JlYXRlVGV4dEVkaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cnVjdHVyZWRUZXh0RWRpdG9yCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBjcmVhdGVUZXh0RWRpdG9yKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0RWRpdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc2Nvbm5lY3REZXNpZ25QYWdlKCkgewotCQlpZiAoZkRlc2lnblZpZXdlciAhPSBudWxsKSB7Ci0JCQlmRGVzaWduVmlld2VyLnNldERvY3VtZW50KG51bGwpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJTG9nZ2VyLnRyYWNlKCJTb3VyY2UgRWRpdG9yIiwgIlhNTE11bHRpUGFnZUVkaXRvclBhcnQ6OmRpc3Bvc2UgZW50cnkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJZGlzY29ubmVjdERlc2lnblBhZ2UoKTsKLQotCQlpZiAoZkFjdGl2YXRpb25MaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlmQWN0aXZhdGlvbkxpc3RlbmVyLmRpc3Bvc2UoKTsKLQkJCWZBY3RpdmF0aW9uTGlzdGVuZXIgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGZNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmTWVudU1hbmFnZXIucmVtb3ZlQWxsKCk7Ci0JCQlmTWVudU1hbmFnZXIuZGlzcG9zZSgpOwotCQkJZk1lbnVNYW5hZ2VyID0gbnVsbDsKLQkJfQotCi0JCWlmICgoZlRleHRFZGl0b3IgIT0gbnVsbCkgJiYgKGZQcm9wZXJ0eUxpc3RlbmVyICE9IG51bGwpKSB7Ci0JCQlmVGV4dEVkaXRvci5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKGZQcm9wZXJ0eUxpc3RlbmVyKTsKLQkJfQotCQkKLQkJLy8gbW92ZWQgdG8gbGFzdCB3aGVuIGFkZGVkIHdpbmRvdyAuLi4gc2VlbXMgbGlrZQotCQkvLyB3ZSdkIGJlIGluIGRhbmdlciBvZiBsb3Npbmcgc29tZSBkYXRhLCBsaWtlIHNpdGUsCi0JCS8vIG9yIHNvbWV0aGluZy4KLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCUxvZ2dlci50cmFjZSgiU291cmNlIEVkaXRvciIsICJTdHJ1Y3R1cmVkVGV4dE11bHRpUGFnZUVkaXRvclBhcnQ6OmRpc3Bvc2UgZXhpdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmVGV4dEVkaXRvci5kb1NhdmUobW9uaXRvcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQkJZlRleHRFZGl0b3IuZG9TYXZlQXMoKTsKLQkJLyoKLQkJICogVXBkYXRlIHRoZSBkZXNpZ24gdmlld2VyIHNpbmNlIHRoZSBlZGl0b3IgaW5wdXQgd291bGQgaGF2ZSBjaGFuZ2VkCi0JCSAqIHRvIHRoZSBuZXcgZmlsZS4KLQkJICovCi0JCWlmIChmRGVzaWduVmlld2VyICE9IG51bGwpIHsKLQkJCWZEZXNpZ25WaWV3ZXIuc2V0RG9jdW1lbnQoZ2V0RG9jdW1lbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0KLQkJLy8gd2UgZXh0ZW5kIHN1cGVyY2xhc3MsIG5vdCBvdmVycmlkZSBpdCwgc28gYWxsb3cgaXQgZmlyc3QKLQkJLy8gY2hhbmNlIHRvIHNhdGlzZnkgcmVxdWVzdC4KLQkJcmVzdWx0ID0gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOwotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJaWYgKGtleSA9PSBJRGVzaWduVmlld2VyLmNsYXNzKSB7Ci0JCQkJcmVzdWx0ID0gZkRlc2lnblZpZXdlcjsKLQotCQkJfQotCQkJZWxzZSBpZiAoa2V5LmVxdWFscyhJR290b01hcmtlci5jbGFzcykpIHsKLQkJCQlyZXN1bHQgPSBuZXcgSUdvdG9NYXJrZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJCQkJCVhNTE11bHRpUGFnZUVkaXRvclBhcnQudGhpcy5nb3RvTWFya2VyKG1hcmtlcik7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBETVc6IEknbSBidWxsZXQtcHJvb2ZpbmcgdGhpcyBiZWNhdXNlIGl0cyBiZWVuIHJlcG9ydGVkIChvbgotCQkJCSAqIHZlcnkgZWFybHkgdmVyc2lvbnMpIGEgbnVsbCBwb2ludGVyIHNvbWV0aW1lcyBoYXBwZW5zIGhlcmUKLQkJCQkgKiBvbiBzdGFydHVwLCB3aGVuIGFuIGVkaXRvciBoYXMgYmVlbiBsZWZ0IG9wZW4gd2hlbgotCQkJCSAqIHdvcmtiZW5jaCBzaHV0ZG93bi4KLQkJCQkgKi8KLQkJCQlpZiAoZlRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBmVGV4dEVkaXRvci5nZXRBZGFwdGVyKGtleSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCWlmIChmVGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQlkb2N1bWVudCA9IGZUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlTdHJ1Y3R1cmVkVGV4dEVkaXRvciBnZXRUZXh0RWRpdG9yKCkgewotCQlyZXR1cm4gZlRleHRFZGl0b3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNnZXRUaXRsZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJU3RyaW5nIHRpdGxlID0gbnVsbDsKLQkJaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0RWRpdG9ySW5wdXQoKSAhPSBudWxsKSB7Ci0JCQkJdGl0bGUgPSBnZXRFZGl0b3JJbnB1dCgpLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRpdGxlID0gZ2V0VGV4dEVkaXRvcigpLmdldFRpdGxlKCk7Ci0JCX0KLQkJaWYgKHRpdGxlID09IG51bGwpIHsKLQkJCXRpdGxlID0gZ2V0UGFydE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0Jdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCXNldEFjdGl2ZVBhZ2UoZlNvdXJjZVBhZ2VJbmRleCk7Ci0JCUlERS5nb3RvTWFya2VyKGZUZXh0RWRpdG9yLCBtYXJrZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwKLQkgKiBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJCS8vIHdlIHdhbnQgdG8gbGlzdGVuIGZvciBvdXIgb3duIGFjdGl2YXRpb24KLQkJCWZBY3RpdmF0aW9uTGlzdGVuZXIgPSBuZXcgQWN0aXZhdGlvbkxpc3RlbmVyKHNpdGUuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gaW5pdGlhbGl6aW5nICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzZXRQYXJ0TmFtZShpbnB1dC5nZXROYW1lKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc1NhdmVBc0FsbG93ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIChmVGV4dEVkaXRvciAhPSBudWxsKSAmJiBmVGV4dEVkaXRvci5pc1NhdmVBc0FsbG93ZWQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlT25DbG9zZU5lZWRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlT25DbG9zZU5lZWRlZCgpIHsKLQkJLy8gb3ZlcnJpZGluZyBzdXBlciBjbGFzcyBzaW5jZSBpdCBkb2VzIGEgbG93bHkgaXNEaXJ0eSEKLQkJaWYgKGZUZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCXJldHVybiBmVGV4dEVkaXRvci5pc1NhdmVPbkNsb3NlTmVlZGVkKCk7Ci0JCX0KLQkJcmV0dXJuIGlzRGlydHkoKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJldmVudHMgdGhlIGNyZWF0aW9uIG9mIHRoZSBpbi1lZGl0b3IgdG9vbGJhciwgaWYgY2FsbGVkIGJlZm9yZQotCSAqIGNyZWF0ZVBhZ2VDb250YWluZXIoKSBkdXJpbmcgZWRpdG9yIGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIG5vVG9vbGJhcigpIHsKLQkJZkFsbG9jYXRlVG9vbGJhciA9IGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I3BhZ2VDaGFuZ2UoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IG5ld1BhZ2VJbmRleCkgewotCQlpZiAobmV3UGFnZUluZGV4ID09IGZTb3VyY2VQYWdlSW5kZXgpIHsKLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IGZEZXNpZ25WaWV3ZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKHByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfQotCQlzdXBlci5wYWdlQ2hhbmdlKG5ld1BhZ2VJbmRleCk7Ci0JCXNhdmVMYXN0QWN0aXZlUGFnZUluZGV4KG5ld1BhZ2VJbmRleCk7Ci0KLQkJaWYgKG5ld1BhZ2VJbmRleCA9PSBmRGVzaWduUGFnZUluZGV4KSB7Ci0JCQkvLyBkZXNpZ24gcGFnZSBpc24ndCBhbiBJRWRpdG9yUGFydCwgdGhlcmVmb3JlIHdlIGhhdmUgdG8gc2VuZAotCQkJLy8gc2VsZWN0aW9uIGNoYW5nZXMgb3Vyc2VsdmVzCi0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSBmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCVNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKLQkJCQkoKE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyKSBnZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSkuZmlyZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCSgoTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIpIGdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKS5maXJlUG9zdFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVMYXN0QWN0aXZlUGFnZUluZGV4KGludCBuZXdQYWdlSW5kZXgpIHsKLQkJLy8gc2F2ZSB0aGUgbGFzdCBhY3RpdmUgcGFnZSBpbmRleCB0byBwcmVmZXJlbmNlIG1hbmFnZXIKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSVhNTFByZWZlcmVuY2VOYW1lcy5MQVNUX0FDVElWRV9QQUdFLCBuZXdQYWdlSW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlzdXBlci5zZXRGb2N1cygpOwotCQlDb250cm9sIGNvbnRyb2wgPSBmRGVzaWduVmlld2VyLmdldENvbnRyb2woKTsKLQkJY29udHJvbC5zZXRGb2N1cygpOwotCQkvLyAyNzEzODIgLSBGb2N1cyBub3Qgc2V0IHByb3Blcmx5IGFmdGVyIGFjdGl2YXRpbmcgWE1MIGVkaXRvcgotCQljb250cm9sLmZvcmNlRm9jdXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXphdGlvbkRhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNmaWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB7Ci0JCXN1cGVyLnNldEluaXRpYWxpemF0aW9uRGF0YShjZmlnLCBwcm9wZXJ0eU5hbWUsIGRhdGEpOwotCQlmUGFnZUluaXRpYWxpemVyID0gbmV3IFBhZ2VJbml0aWFsaXphdGlvbkRhdGEoY2ZpZywgcHJvcGVydHlOYW1lLCBkYXRhKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNzZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCS8qCi0JCSAqIElmIGRyaXZlbiBmcm9tIHRoZSBTb3VyY2UgcGFnZSwgaXQncyAibW9kZWwiIG1heSBub3QgYmUgdXAgdG8gZGF0ZQotCQkgKiB3aXRoIChvciBldmVuIGV4aXN0IGZvcikgdGhlIGlucHV0IGp1c3QgeWV0LiBMYXRlciBub3RpZmljYXRpb24KLQkJICogZnJvbSB0aGUgVGV4dFZpZXdlciBjb3VsZCBzZXQgdXMgc3RyYWlnaHQsIGFsdGhvdWdoIGl0J3Mgbm90Ci0JCSAqIGd1YXJhbnRlZWQgdG8gaGFwcGVuIGFmdGVyIHRoZSBtb2RlbCBoYXMgYmVlbiBjcmVhdGVkLgotCQkgKi8KLQkJc3VwZXIuc2V0SW5wdXQoaW5wdXQpOwotCQlpZiAoZkRlc2lnblZpZXdlciAhPSBudWxsKSB7Ci0JCQlmRGVzaWduVmlld2VyLnNldERvY3VtZW50KGdldERvY3VtZW50KCkpOwotCQl9Ci0JCXNldFBhcnROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0JfQotCi0Jdm9pZCB1cGRhdGVTdGF0dXNMaW5lKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlciA9IGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJaWYgKGZTdGF0dXNMaW5lTGFiZWxQcm92aWRlciAhPSBudWxsICYmIHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJCUltYWdlIGltYWdlID0gbnVsbDsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCU9iamVjdCBmaXJzdEVsZW1lbnQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmIChmaXJzdEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQl0ZXh0ID0gZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyLmdldFRleHQoZmlyc3RFbGVtZW50KTsKLQkJCQkJaW1hZ2UgPSBmU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoKGZpcnN0RWxlbWVudCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZSh0ZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoaW1hZ2UsIHRleHQpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWY1MDMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAtIGJ1ZyAyMTIzMzAgLSBtaWdyYXRlIHRvIG9yZy5lY2xpcHNlLnVpLm1lbnVzIGV4dGVuc2lvbiBwb2ludAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuQ01Eb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLkluZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5TaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCXByb3RlY3RlZCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIERFU0lHTl9WSUVXRVJfU0VQQVJBVE9SXzFfSUQgPSAic2VkLnRhYmxldHJlZS5zZXBhcmF0b3IuMSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBERVNJR05fVklFV0VSX1NFUEFSQVRPUl8yX0lEID0gInNlZC50YWJsZXRyZWUuc2VwYXJhdG9yLjIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfWE1MX0lEID0gInNlZC50YWJsZXRyZWUudmFsaWRhdGVYTUwiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVMT0FEX0dSQU1NQVJfSUQgPSAic2VkLnRhYmxldHJlZS5yZWxvYWRHcmFtbWFyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFRPR0dMRV9FRElUX01PREVfSUQgPSAic2VkLnRhYmxldHJlZS50b2dnbGVFZGl0TW9kZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBFWFBBTkRfQUxMX0lEID0gInNlZC50YWJsZXRyZWUuZXhwYW5kQWxsIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTExBUFNFX0FMTF9JRCA9ICJzZWQudGFibGV0cmVlLmNvbGxhcHNlQWxsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFRvZ2dsZUVkaXRNb2RlQWN0aW9uIHRvZ2dsZUFjdGlvbjsKLQlwcm90ZWN0ZWQgUmVsb2FkR3JhbW1hckFjdGlvbiByZWxvYWRHcmFtbWFyQWN0aW9uOwotCS8vIHByb3RlY3RlZCBWYWxpZGF0ZVhNTEFjdGlvbiB2YWxpZGF0ZVhNTEFjdGlvbjsKLQlwcm90ZWN0ZWQgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24gZXhwYW5kQWN0aW9uOwotCXByb3RlY3RlZCBWaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbiBjb2xsYXBzZUFjdGlvbjsKLQlwcm90ZWN0ZWQgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24geG1sTWVudUV4cGFuZEFjdGlvbjsKLQlwcm90ZWN0ZWQgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24geG1sTWVudUNvbGxhcHNlQWN0aW9uOwotCi0JcHVibGljIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbnRyaWJ1dGlvbnMoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlcikgewotLyoJCXRyeSB7Ci0JCQlkb1JlbW92ZShtYW5hZ2VyLCBERVNJR05fVklFV0VSX1NFUEFSQVRPUl8xX0lEKTsKLQkJCWRvUmVtb3ZlKG1hbmFnZXIsIERFU0lHTl9WSUVXRVJfU0VQQVJBVE9SXzJfSUQpOwotCQkJZG9SZW1vdmUobWFuYWdlciwgVkFMSURBVEVfWE1MX0lEKTsKLQkJCWRvUmVtb3ZlKG1hbmFnZXIsIFJFTE9BRF9HUkFNTUFSX0lEKTsKLQkJCWRvUmVtb3ZlKG1hbmFnZXIsIFRPR0dMRV9FRElUX01PREVfSUQpOwotCQkJZG9SZW1vdmUobWFuYWdlciwgRVhQQU5EX0FMTF9JRCk7Ci0JCQlkb1JlbW92ZShtYW5hZ2VyLCBDT0xMQVBTRV9BTExfSUQpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0qLwkJCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9SZW1vdmUoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgU3RyaW5nIGlkKSB7Ci0vKgkJdHJ5IHsKLQkJCWlmIChtYW5hZ2VyLmZpbmQoaWQpICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLnJlbW92ZShpZCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLSovCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycywgSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQlpbml0KGJhcnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycykgewotLy8JCUlUb29sQmFyTWFuYWdlciB0Ym0gPSBiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0KLS8qCQlJTWVudU1hbmFnZXIgeG1sTWVudSA9IGJhcnMuZ2V0TWVudU1hbmFnZXIoKS5maW5kTWVudVVzaW5nUGF0aCgib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5kZXNpZ24ueG1sbWVudSIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKHhtbE1lbnUgPT0gbnVsbCkgewotCQkJeG1sTWVudSA9IG5ldyBNZW51TWFuYWdlcihYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8wLCAib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5kZXNpZ24ueG1sbWVudSIpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBGb3IgUkNQIHVzYWdlCi0JCQlpZiAoYmFycy5nZXRNZW51TWFuYWdlcigpLmZpbmQoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX1dJTkRPVykgIT0gbnVsbCkgewotCQkJCWJhcnMuZ2V0TWVudU1hbmFnZXIoKS5pbnNlcnRCZWZvcmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX1dJTkRPVywgeG1sTWVudSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZW1vdmVDb250cmlidXRpb25zKHhtbE1lbnUpOwotCQl9Ci0KLQkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKCJERVNJR05fVklFV0VSX1NFUEFSQVRPUl8xX0lEIikpOyAvLyROT04tTkxTLTEkCi0qLwotCQkvLyBUb2dnbGVFZGl0TW9kZUFjdGlvbgotCQkvLyAgICAgICAgICAgCi0vKgkJdG9nZ2xlQWN0aW9uID0gbmV3IFRvZ2dsZUVkaXRNb2RlQWN0aW9uKCk7Ci0JCXRvZ2dsZUFjdGlvbi5zZXRJZChUT0dHTEVfRURJVF9NT0RFX0lEKTsKLQkJeG1sTWVudS5hZGQodG9nZ2xlQWN0aW9uKTsKLQkJdGJtLmFkZCh0b2dnbGVBY3Rpb24pOwotKi8KLQkJLy8gUmVsb2FkR3JhbW1hckFjdGlvbgotCQkvLwotLyoJCXJlbG9hZEdyYW1tYXJBY3Rpb24gPSBuZXcgUmVsb2FkR3JhbW1hckFjdGlvbigpOwotCQlyZWxvYWRHcmFtbWFyQWN0aW9uLnNldElkKFJFTE9BRF9HUkFNTUFSX0lEKTsKLQkJdGJtLmFkZChyZWxvYWRHcmFtbWFyQWN0aW9uKTsKLQkJeG1sTWVudS5hZGQocmVsb2FkR3JhbW1hckFjdGlvbik7Ci0KLQkJeG1sTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSovCi0JCS8vIEV4cGFuZENvbGxhcHNlQWN0aW9uCi0JCS8vCi0vKgkJeG1sTWVudUV4cGFuZEFjdGlvbiA9IG5ldyBWaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbih0cnVlKTsKLQkJeG1sTWVudUV4cGFuZEFjdGlvbi5zZXRJZChFWFBBTkRfQUxMX0lEKTsKLQkJeG1sTWVudUV4cGFuZEFjdGlvbi5zZXRUZXh0KFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzEpOwotCQl4bWxNZW51LmFkZCh4bWxNZW51RXhwYW5kQWN0aW9uKTsKLQotCQl4bWxNZW51Q29sbGFwc2VBY3Rpb24gPSBuZXcgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24oZmFsc2UpOwotCQl4bWxNZW51Q29sbGFwc2VBY3Rpb24uc2V0SWQoQ09MTEFQU0VfQUxMX0lEKTsKLQkJeG1sTWVudUNvbGxhcHNlQWN0aW9uLnNldElkKEVYUEFORF9BTExfSUQpOwotCQl4bWxNZW51Q29sbGFwc2VBY3Rpb24uc2V0VGV4dChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8yKTsKLQkJeG1sTWVudS5hZGQoeG1sTWVudUNvbGxhcHNlQWN0aW9uKTsKLSovCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpb25XaXRoSWQoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBBY3Rpb24gYWN0aW9uLCBTdHJpbmcgaWQpIHsKLQkJYWN0aW9uLnNldElkKGlkKTsKLQkJbWVudU1hbmFnZXIuYWRkKGFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9ucyhJQWN0aW9uQmFycyBiYXJzKSB7Ci0vKgkJSVRvb2xCYXJNYW5hZ2VyIHRibSA9IGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKERFU0lHTl9WSUVXRVJfU0VQQVJBVE9SXzJfSUQpKTsKLQotCQlleHBhbmRBY3Rpb24gPSBuZXcgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24odHJ1ZSk7Ci0JCWV4cGFuZEFjdGlvbi5zZXRJZChFWFBBTkRfQUxMX0lEKTsKLQkJdGJtLmFkZChleHBhbmRBY3Rpb24pOwotCi0JCWNvbGxhcHNlQWN0aW9uID0gbmV3IFZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uKGZhbHNlKTsKLQkJY29sbGFwc2VBY3Rpb24uc2V0SWQoQ09MTEFQU0VfQUxMX0lEKTsKLQkJdGJtLmFkZChjb2xsYXBzZUFjdGlvbik7Ci0qLwkJCi0JfQotCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLS8qCQlpZiAoZXhwYW5kQWN0aW9uICE9IG51bGwpIHsKLQkJCWV4cGFuZEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJeG1sTWVudUV4cGFuZEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0KLQkJaWYgKGNvbGxhcHNlQWN0aW9uICE9IG51bGwpIHsKLQkJCWNvbGxhcHNlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQl4bWxNZW51Q29sbGFwc2VBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotKi8JCQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJZWRpdG9yUGFydCA9IHRhcmdldEVkaXRvcjsKLQotLy8JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBnZXRNb2RlbEZvckVkaXRvclBhcnQodGFyZ2V0RWRpdG9yKTsKLS8qCQlyZWxvYWRHcmFtbWFyQWN0aW9uLnNldE1vZGVsKG1vZGVsKTsKLQkJdG9nZ2xlQWN0aW9uLnNldE1vZGVsUXVlcnkoTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShtb2RlbCkpOwotCi0JCVhNTFRhYmxlVHJlZVZpZXdlciB0YWJsZVRyZWVWaWV3ZXIgPSBnZXRUYWJsZVRyZWVWaWV3ZXJGb3JFZGl0b3JQYXJ0KGVkaXRvclBhcnQpOwotCQlpZiAodGFibGVUcmVlVmlld2VyICE9IG51bGwpIHsKLQkJCWV4cGFuZEFjdGlvbi5zZXRWaWV3ZXIodGFibGVUcmVlVmlld2VyKTsKLQkJCWNvbGxhcHNlQWN0aW9uLnNldFZpZXdlcih0YWJsZVRyZWVWaWV3ZXIpOwotCi0JCQl4bWxNZW51RXhwYW5kQWN0aW9uLnNldFZpZXdlcih0YWJsZVRyZWVWaWV3ZXIpOwotCQkJeG1sTWVudUNvbGxhcHNlQWN0aW9uLnNldFZpZXdlcih0YWJsZVRyZWVWaWV3ZXIpOwotCQl9Ci0qLwotCQlpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIFhNTE11bHRpUGFnZUVkaXRvclBhcnQpIHsKLQkJCUlXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlID0gZWRpdG9yUGFydC5nZXRTaXRlKCk7Ci0JCQlpZiAoc2l0ZSBpbnN0YW5jZW9mIElFZGl0b3JTaXRlKSB7Ci0JCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9ICgoWE1MTXVsdGlQYWdlRWRpdG9yUGFydCkgZWRpdG9yUGFydCkuZ2V0VGV4dEVkaXRvcigpOwotCQkJCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSAoKElFZGl0b3JTaXRlKSBzaXRlKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8sIGdldEFjdGlvbih0ZXh0RWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRPKSk7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJFRE8sIGdldEFjdGlvbih0ZXh0RWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5SRURPKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBUT0RPLi4uIHVuY29tbWVudCB0aGlzIGFuZCBpbnZlc3RpZ2F0ZSBOUEUKLQkJLy8KLQkJLy8gYWRkIHRoZSBjdXQvY29weS9wYXN0ZSBmb3IgdGV4dCBmaWVsZHMKLQkJLy8gQWN0aW9uSGFuZGxlclBsdWdpbi5jb25uZWN0UGFydChlZGl0b3JQYXJ0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSUFjdGlvbiBnZXRBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBTdHJpbmcgYWN0aW9uSWQpIHsKLQkJcmV0dXJuIChlZGl0b3IgPT0gbnVsbCA/IG51bGwgOiBlZGl0b3IuZ2V0QWN0aW9uKGFjdGlvbklkKSk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBub3QgdG8gYmUgdXNlZAotCSAqLwotCXByb3RlY3RlZCBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdG9yUGFydChJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIFhNTE11bHRpUGFnZUVkaXRvclBhcnQpIHsKLQkJCVN0cnVjdHVyZWRUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoKFhNTE11bHRpUGFnZUVkaXRvclBhcnQpIHRhcmdldEVkaXRvcikuZ2V0VGV4dEVkaXRvcigpOwotCQkJcmVzdWx0ID0gKHRleHRFZGl0b3IgIT0gbnVsbCkgPyB0ZXh0RWRpdG9yLmdldE1vZGVsKCkgOiBudWxsOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBub3QgdG8gYmUgdXNlZAotCSAqLwotCXByb3RlY3RlZCBYTUxUYWJsZVRyZWVWaWV3ZXIgZ2V0VGFibGVUcmVlVmlld2VyRm9yRWRpdG9yUGFydChJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJWE1MVGFibGVUcmVlVmlld2VyIHJlc3VsdCA9IG51bGw7Ci0JCU9iamVjdCBvYmplY3QgPSB0YXJnZXRFZGl0b3IuZ2V0QWRhcHRlcihJRGVzaWduVmlld2VyLmNsYXNzKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhNTFRhYmxlVHJlZVZpZXdlcikgewotCQkJcmVzdWx0ID0gKFhNTFRhYmxlVHJlZVZpZXdlcikgb2JqZWN0OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGNsYXNzIFRvZ2dsZUVkaXRNb2RlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQkJcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBvbkltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19FVE9PTF9DT05TVFJBSU5PTik7Ci0JCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3Igb2ZmSW1hZ2UgPSBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZURlc2NyaXB0b3IoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX0VUT09MX0NPTlNUUkFJTk9GRik7Ci0JCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnk7Ci0KLQkJcHVibGljIFRvZ2dsZUVkaXRNb2RlQWN0aW9uKCkgewotCQkJc2V0QXBwZWFyYW5jZUZvckVkaXRNb2RlKE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQkJaW50IG5ld1N0YXRlID0gZ2V0TmV4dFN0YXRlKG1vZGVsUXVlcnkuZ2V0RWRpdE1vZGUoKSk7Ci0JCQkJbW9kZWxRdWVyeS5zZXRFZGl0TW9kZShuZXdTdGF0ZSk7Ci0JCQkJc2V0QXBwZWFyYW5jZUZvckVkaXRNb2RlKG5ld1N0YXRlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE1vZGVsUXVlcnkoTW9kZWxRdWVyeSBuZXdNb2RlbFF1ZXJ5KSB7Ci0JCQltb2RlbFF1ZXJ5ID0gbmV3TW9kZWxRdWVyeTsKLQkJCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlzZXRBcHBlYXJhbmNlRm9yRWRpdE1vZGUobW9kZWxRdWVyeS5nZXRFZGl0TW9kZSgpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEFwcGVhcmFuY2VGb3JFZGl0TW9kZShpbnQgZWRpdE1vZGUpIHsKLQkJCWlmIChlZGl0TW9kZSA9PSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpIHsKLQkJCQlzZXRUb29sVGlwVGV4dChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8zKTsKLQkJCQlzZXRUZXh0KFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzQpOwotCQkJCXNldEltYWdlRGVzY3JpcHRvcihvbkltYWdlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldFRvb2xUaXBUZXh0KFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzUpOwotCQkJCXNldFRleHQoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNik7Ci0JCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKG9mZkltYWdlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TmV4dFN0YXRlKGludCBlZGl0TW9kZSkgewotCQkJaW50IHJlc3VsdCA9IC0xOwotCQkJaWYgKGVkaXRNb2RlID09IE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCkgewotCQkJCXJlc3VsdCA9IE1vZGVsUXVlcnkuRURJVF9NT0RFX1VOQ09OU1RSQUlORUQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1Q7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGNsYXNzIFJlbG9hZEdyYW1tYXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbDsKLQotCQlwdWJsaWMgUmVsb2FkR3JhbW1hckFjdGlvbigpIHsKLQkJCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlRGVzY3JpcHRvcihTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfRFRPT0xfUkxER1JNUikpOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlRGVzY3JpcHRvcihTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfRVRPT0xfUkxER1JNUikpOwotCQkJc2V0VG9vbFRpcFRleHQoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNyk7Ci0JCQlzZXRUZXh0KFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0TW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCQkJdGhpcy5tb2RlbCA9IG5ld01vZGVsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsKTsKLQkJCQlEb2N1bWVudCBkb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQlpZiAoKG1vZGVsUXVlcnkgIT0gbnVsbCkgJiYgKG1vZGVsUXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKSAhPSBudWxsKSkgewotCQkJCQltb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCkuZ2V0Q01Eb2N1bWVudENhY2hlKCkuY2xlYXIoKTsKLQkJCQkJLy8gVE9ETy4uLiBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGFjY2VzcyB0aGUKLQkJCQkJLy8gRE9NT2JzZXJ2ZXIgdmlhIE1vZGVsUXVlcnkKLQkJCQkJLy8gLi4ud2h5PwotCQkJCQlDTURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG5ldyBJbmZlcnJlZEdyYW1tYXJCdWlsZGluZ0NNRG9jdW1lbnRMb2FkZXIoZG9jdW1lbnQsIG1vZGVsUXVlcnkpOwotCQkJCQlsb2FkZXIubG9hZENNRG9jdW1lbnRzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzU2ZWQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUNvbG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5UZXh0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURlc2NyaXB0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWwuU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFhNTFRhYmxlVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJVGFibGVMYWJlbFByb3ZpZGVyLCBJVGFibGVDb2xvclByb3ZpZGVyLCBJTGFiZWxQcm92aWRlciwgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudE1hbmFnZXIgZG9jdW1lbnRNYW5hZ2VyOwotCi0JU3RydWN0dXJlZFZpZXdlciBmVmlld2VyID0gbnVsbDsKLQotCXByaXZhdGUgVHJlZUNvbnRlbnRIZWxwZXIgdHJlZUNvbnRlbnRIZWxwZXIgPSBuZXcgVHJlZUNvbnRlbnRIZWxwZXIoKTsKLQotCXByaXZhdGUgQ01EZXNjcmlwdGlvbkJ1aWxkZXIgZGVzY3JpcHRpb25CdWlsZGVyID0gbmV3IENNRGVzY3JpcHRpb25CdWlsZGVyKCk7Ci0KLQlwcml2YXRlIENvbG9yIGZDTUNvbG9yID0gbnVsbDsKLQotCXB1YmxpYyBYTUxUYWJsZVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLy8KLQkvLyBJTGFiZWxQcm92aWRlciBzdHVmZgotCS8vCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBzaW5jZSB3ZSBhbHdheXMgcmV0dXJuICdmYWxzZScgZm9yICJpc0xhYmVsUHJvcGVydHkiLAotCQkvLyBub3QgbmVlZCB0byBsaXN0ZW4uIE1heWJlIHRoYXQgc2hvdWxkIGNoYW5nZSBzb21lIGRheT8KLQl9Ci0KLQkvLyBDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyCi0JLy8KLQlwdWJsaWMgdm9pZCBjYWNoZUNsZWFyZWQoQ01Eb2N1bWVudENhY2hlIGNhY2hlKSB7Ci0JCWRvRGVsYXllZFJlZnJlc2hGb3JWaWV3ZXJzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2FjaGVVcGRhdGVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgZmluYWwgU3RyaW5nIHVyaSwgaW50IG9sZFN0YXR1cywgaW50IG5ld1N0YXR1cywgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCWlmICgobmV3U3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTE9BREVEKSB8fCAobmV3U3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfRVJST1IpKSB7Ci0JCQlkb0RlbGF5ZWRSZWZyZXNoRm9yVmlld2VycygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGRvY3VtZW50TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlkb2N1bWVudE1hbmFnZXIucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJaWYgKGZWaWV3ZXIgIT0gbnVsbCAmJiBmVmlld2VyLmdldElucHV0KCkgIT0gbnVsbCkgewotCQkJaWYgKGZWaWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5KSAoKElET01Ob2RlKSBmVmlld2VyLmdldElucHV0KCkpLmdldE1vZGVsKCkuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQlmYWN0b3J5LnJlbW92ZUxpc3RlbmVyKGZWaWV3ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZkNNQ29sb3IgIT0gbnVsbCkgewotCQkJZkNNQ29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvRGVsYXllZFJlZnJlc2hGb3JWaWV3ZXJzKCkgewotCQlpZiAoKGZWaWV3ZXIgIT0gbnVsbCkgJiYgIWZWaWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJZlZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoKGZWaWV3ZXIgIT0gbnVsbCkgJiYgIWZWaWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJZlZpZXdlci5yZWZyZXNoKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkoKElOb2RlTm90aWZpZXIpIGVsZW1lbnQpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQl9Ci0JCXJldHVybiB0cmVlQ29udGVudEhlbHBlci5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiAoY29sdW1uSW5kZXggPT0gMCkgPyBnZXRJbWFnZShvYmplY3QpIDogbnVsbDsKLQl9Ci0KLQkvLwotCS8vIElUYWJsZUxhYmVsUHJvdmlkZXIgc3R1ZmYKLQkvLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoY29sdW1uID09IDApIHsKLQkJCXJlc3VsdCA9IGdldFRleHQob2JqZWN0KTsKLQkJfQotCQllbHNlIGlmICgoY29sdW1uID09IDEpICYmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSkgewotCQkJcmVzdWx0ID0gdHJlZUNvbnRlbnRIZWxwZXIuZ2V0Tm9kZVZhbHVlKChOb2RlKSBvYmplY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGdldEVsZW1lbnRWYWx1ZUhlbHBlcigoRWxlbWVudCkgb2JqZWN0KTsKLQkJCQkKLQkJfQotCQlyZXN1bHQgPSBUZXh0UHJvY2Vzc29yLnByb2Nlc3MocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RWxlbWVudFZhbHVlSGVscGVyKEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQotCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCWlmICgocmVzdWx0ID09IG51bGwpICYmIChtcSAhPSBudWxsKSkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBtcS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCWlmICgoZWQgIT0gbnVsbCkgJiYgIUJvb2xlYW4uVFJVRS5lcXVhbHMoZWQuZ2V0UHJvcGVydHkoImlzSW5mZXJyZWQiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IGRlc2NyaXB0aW9uQnVpbGRlci5idWlsZERlc2NyaXB0aW9uKGVkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCSgoSU5vZGVOb3RpZmllcikgb2JqZWN0KS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJfQotCi0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6IHsKLQkJCQkJaW1hZ2UgPSBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZShTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX0FUVFJJQlVURSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCQlpbWFnZSA9IFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfQ0RBVEFTRUNUSU9OKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOiB7Ci0JCQkJCWltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9DT01NRU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOiB7Ci0JCQkJCWltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9ET0NUWVBFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJCWltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9FTEVNRU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJCWltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9QUk9DRVNTSU5HSU5TVFJVQ1RJT04pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQkJaW1hZ2UgPSBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZShTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX1RYVEVYVCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDogewotCQkJCQlpbWFnZSA9IFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfRU5USVRZX1JFRkVSRU5DRSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCS8vIEltYWdlIG1hcmtlck92ZXJsYXlJbWFnZSA9Ci0JCQkvLyBvdmVybGF5SWNvbk1hbmFnZXIuZ2V0T3ZlcmxheUltYWdlRm9yT2JqZWN0KG5vZGUpOwotCQkJLy8gaWYgKG1hcmtlck92ZXJsYXlJbWFnZSAhPSBudWxsKSB7Ci0JCQkvLyBpbWFnZSA9IGltYWdlRmFjdG9yeS5jcmVhdGVDb21wb3NpdGVJbWFnZShpbWFnZSwKLQkJCS8vIG1hcmtlck92ZXJsYXlJbWFnZSwgSW1hZ2VGYWN0b3J5LkJPVFRPTV9MRUZUKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkoKElOb2RlTm90aWZpZXIpIG8pLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQl9Ci0KLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChvIGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIG87Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQlyZXN1bHQgPSAoKEF0dHIpIG5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzdWx0ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCBnZXRSb290RWxlbWVudChEb2N1bWVudCBkb2N1bWVudCkgewotCQlFbGVtZW50IHJvb3RFbGVtZW50ID0gbnVsbDsKLQotCQlmb3IgKE5vZGUgY2hpbGROb2RlID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZE5vZGUgIT0gbnVsbDsgY2hpbGROb2RlID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCXJvb3RFbGVtZW50ID0gKEVsZW1lbnQpIGNoaWxkTm9kZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcm9vdEVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCSgoSU5vZGVOb3RpZmllcikgb2JqZWN0KS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJfQotCi0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDogewotCQkJCQlyZXN1bHQgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDogewotCQkJCQlyZXN1bHQgPSAiRE9DVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9ICgoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlKS5nZXRUYXJnZXQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJlc3VsdCA9IFRleHRQcm9jZXNzb3IucHJvY2VzcyhyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkvLyByZW1vdmUgb3VyIGxpc3RlbmVycyB0byB0aGUgb2xkIHN0YXRlCi0JCWlmIChvbGRJbnB1dCAhPSBudWxsKSB7Ci0JCQlEb2N1bWVudCBkb21Eb2MgPSAoRG9jdW1lbnQpIG9sZElucHV0OwotCQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9tRG9jKTsKLQkJCWlmIChtcSAhPSBudWxsKSB7Ci0JCQkJZG9jdW1lbnRNYW5hZ2VyID0gbXEuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKTsKLQkJCQlpZiAoZG9jdW1lbnRNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJZG9jdW1lbnRNYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICgob2xkSW5wdXQgIT0gbnVsbCkgJiYgKG9sZElucHV0IGluc3RhbmNlb2YgSURPTU5vZGUpKSB7Ci0JCQlJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkpICgoSURPTU5vZGUpIG9sZElucHV0KS5nZXRNb2RlbCgpLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkucmVtb3ZlTGlzdGVuZXIodmlld2VyKTsKLQkJCX0KLQkJfQotCi0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKSB7Ci0JCQlmVmlld2VyID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCWZWaWV3ZXIgPSAoU3RydWN0dXJlZFZpZXdlcikgdmlld2VyOwotCQl9Ci0KLQkJaWYgKChuZXdJbnB1dCAhPSBudWxsKSAmJiAobmV3SW5wdXQgaW5zdGFuY2VvZiBJRE9NTm9kZSkpIHsKLQkJCUlKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSkgKChJRE9NTm9kZSkgbmV3SW5wdXQpLmdldE1vZGVsKCkuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJZmFjdG9yeS5hZGRMaXN0ZW5lcih2aWV3ZXIpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5ld0lucHV0ICE9IG51bGwpIHsKLQkJCURvY3VtZW50IGRvbURvYyA9IChEb2N1bWVudCkgbmV3SW5wdXQ7Ci0JCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb21Eb2MpOwotCi0JCQlpZiAobXEgIT0gbnVsbCkgewotCQkJCWRvY3VtZW50TWFuYWdlciA9IG1xLmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCQkJaWYgKGRvY3VtZW50TWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCWRvY3VtZW50TWFuYWdlci5zZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVNZTkNfTE9BRCwgdHJ1ZSk7Ci0JCQkJCWRvY3VtZW50TWFuYWdlci5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbDsKLQl9Ci0KLQkvLyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgaGFuZGxlIGZpbHRlcmluZyBhc3BlY3RzIG9mIHRoZSB2aWV3ZXIKLQkvLwotCS8vCi0JcHVibGljIGJvb2xlYW4gaXNJZ25vcmFibGVUZXh0KE5vZGUgbm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQl0cnkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCVN0cmluZyBkYXRhID0gKChUZXh0KSBub2RlKS5nZXREYXRhKCk7Ci0JCQkJcmVzdWx0ID0gKChkYXRhID09IG51bGwpIHx8IChkYXRhLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKENNRG9jdW1lbnRNYW5hZ2VyIGNtRG9jdW1lbnRNYW5hZ2VyLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChjbURvY3VtZW50TWFuYWdlci5nZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVVUT19MT0FEKSkgewotCQkJZG9EZWxheWVkUmVmcmVzaEZvclZpZXdlcnMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gc2luY2Ugd2UgYWx3YXlzIHJldHVybiAnZmFsc2UnIGZvciAiaXNMYWJlbFByb3BlcnR5IiwKLQkJLy8gbm90IG5lZWQgdG8gbGlzdGVuLiBNYXliZSB0aGF0IHNob3VsZCBjaGFuZ2Ugc29tZSBkYXk/Ci0JfQotCi0JcHVibGljIENvbG9yIGdldEJhY2tncm91bmQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29sb3IgZ2V0Rm9yZWdyb3VuZChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChjb2x1bW5JbmRleCA9PSAxICYmIHRyZWVDb250ZW50SGVscGVyLmdldE5vZGVWYWx1ZSgoTm9kZSkgZWxlbWVudCkgPT0gbnVsbCkKLQkJCXJldHVybiBnZXRDTUNvbG9yKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIENvbG9yIGdldENNQ29sb3IoKSB7Ci0JCWlmIChmQ01Db2xvciA9PSBudWxsKSB7Ci0JCQlDb2xvciBiYWNrZ3JvdW5kID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0JCQlpbnQgciA9IE1hdGguYWJzKGJhY2tncm91bmQuZ2V0UmVkKCkgLSAxMjUpOwotCQkJaW50IGcgPSBNYXRoLmFicyhiYWNrZ3JvdW5kLmdldEdyZWVuKCkgLSA4NSk7Ci0JCQlpbnQgYiA9IE1hdGguYWJzKGJhY2tncm91bmQuZ2V0Qmx1ZSgpIC0gMTA1KTsKLQkJCWZDTUNvbG9yID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCByLCBnLCBiKTsKLQkJfQotCQlyZXR1cm4gZkNNQ29sb3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlSGVscENvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUhlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYmM0ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLQotCi0vKioKLSAqIEhlbHAgY29udGV4dCBpZHMgZm9yIHRoZSBUYWJsZVRyZWUgdmlldy4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQotICogaW1wbGVtZW50ZWQgb3IgZXh0ZW5kZWQuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxUYWJsZVRyZWVIZWxwQ29udGV4dElkcyB7Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBYTUxVSVBsdWdpbi5JRCArICIuIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gWE1MIERlc2lnbiBWaWV3Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RFU0lHTl9WSUVXX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxtMzAwMCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkyOWI0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVQcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3BlcnRpZXMuRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxUYWJsZVRyZWVQcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5IGV4dGVuZHMgRE9NUHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgVHJlZUNvbnRlbnRIZWxwZXIgdHJlZUNvbnRlbnRIZWxwZXIgPSBuZXcgVHJlZUNvbnRlbnRIZWxwZXIoKTsKLQotCXB1YmxpYyBYTUxUYWJsZVRyZWVQcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvckhlbHBlcihTdHJpbmcgbmFtZSwgRWxlbWVudCBlbGVtZW50LCBDTU5vZGUgY21Ob2RlKSB7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgcmVzdWx0ID0gbnVsbDsKLQotCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCVN0cmluZ1tdIHZhbHVlc0FycmF5ID0gbnVsbDsKLQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCXZhbHVlc0FycmF5ID0gbXEuZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhlbGVtZW50LCBjbU5vZGUpOwotCQl9Ci0JCWlmICgodmFsdWVzQXJyYXkgIT0gbnVsbCkgJiYgKHZhbHVlc0FycmF5Lmxlbmd0aCA+IDApKSB7Ci0JCQlyZXN1bHQgPSBuZXcgRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBuYW1lLCB2YWx1ZXNBcnJheSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVUZXh0UHJvcGVydHlEZXNjcmlwdG9yKFRleHQgdGV4dCkgewotCQlJUHJvcGVydHlEZXNjcmlwdG9yIHJlc3VsdCA9IG51bGw7Ci0JCU5vZGUgcGFyZW50Tm9kZSA9IHRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAoKHBhcmVudE5vZGUgIT0gbnVsbCkgJiYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkpIHsKLQkJCUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnROb2RlOwotCQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkodGV4dC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBudWxsOwotCQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCQllZCA9IG1xLmdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JIZWxwZXIoSEFDSywgcGFyZW50RWxlbWVudCwgZWQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzdWx0ID0gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihwYXJlbnRFbGVtZW50LmdldE5vZGVOYW1lKCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcihIQUNLLCBIQUNLKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlQXR0cmlidXRlUHJvcGVydHlEZXNjcmlwdG9yKEF0dHIgYXR0cikgewotCQlJUHJvcGVydHlEZXNjcmlwdG9yIHJlc3VsdCA9IG51bGw7Ci0KLQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoYXR0ci5nZXRPd25lckRvY3VtZW50KCkpOwotCi0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQgPSBudWxsOwotCQlpZiAobXEgIT0gbnVsbCkgewotCQkJYWQgPSBtcS5nZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotCQl9Ci0JCWlmIChhZCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JIZWxwZXIoYXR0cmlidXRlTmFtZSwgYXR0ci5nZXRPd25lckVsZW1lbnQoKSwgYWQpOwotCQl9Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcihhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVOYW1lKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihFbGVtZW50IGVsZW1lbnQpIHsKLQkJSVByb3BlcnR5RGVzY3JpcHRvciByZXN1bHQgPSBudWxsOwotCQlMaXN0IGxpc3QgPSB0cmVlQ29udGVudEhlbHBlci5nZXRFbGVtZW50VGV4dENvbnRlbnQoZWxlbWVudCk7Ci0JCWlmIChsaXN0ICE9IG51bGwpIHsKLQkJCVRleHQgdGV4dCA9IHRyZWVDb250ZW50SGVscGVyLmdldEVmZmVjdGl2ZVRleHROb2RlRm9yQ29tYmluZWROb2RlTGlzdChsaXN0KTsKLQkJCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBjcmVhdGVUZXh0UHJvcGVydHlEZXNjcmlwdG9yKHRleHQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcihIQUNLLCBIQUNLKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOTk0ZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Mb2NhbFNlbGVjdGlvblRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5Ob2RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuWE1MTm9kZUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kbmQuRHJhZ05vZGVDb21tYW5kOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWE1MVGFibGVUcmVlVmlld2VyIGV4dGVuZHMgVHJlZVZpZXdlciBpbXBsZW1lbnRzIElEZXNpZ25WaWV3ZXIgewotCi0JY2xhc3MgTm9kZUFjdGlvbk1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQkvLyB1c2VkIHRvIGRpc2FibGUgTm9kZVNlbGVjdGlvbiBsaXN0ZW5pbmcgd2hpbGUgcnVubmluZwotCQkJLy8gTm9kZUFjdGlvbgotCQkJWE1MTm9kZUFjdGlvbk1hbmFnZXIgbm9kZUFjdGlvbk1hbmFnZXIgPSBuZXcgWE1MTm9kZUFjdGlvbk1hbmFnZXIoKChJRE9NRG9jdW1lbnQpIGdldElucHV0KCkpLmdldE1vZGVsKCksIFhNTFRhYmxlVHJlZVZpZXdlci50aGlzKSB7Ci0JCQkJcHVibGljIHZvaWQgYmVnaW5Ob2RlQWN0aW9uKE5vZGVBY3Rpb24gYWN0aW9uKSB7Ci0JCQkJCXN1cGVyLmJlZ2luTm9kZUFjdGlvbihhY3Rpb24pOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGVuZE5vZGVBY3Rpb24oTm9kZUFjdGlvbiBhY3Rpb24pIHsKLQkJCQkJc3VwZXIuZW5kTm9kZUFjdGlvbihhY3Rpb24pOwotCQkJCX0KLQkJCX07Ci0JCQlub2RlQWN0aW9uTWFuYWdlci5maWxsQ29udGV4dE1lbnUobWVudU1hbmFnZXIsIGdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFNlbGVjdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSVBvc3RTZWxlY3Rpb25Qcm92aWRlciB7Ci0KLQkJcHVibGljIHZvaWQgYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlYTUxUYWJsZVRyZWVWaWV3ZXIudGhpcy5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJWE1MVGFibGVUcmVlVmlld2VyLnRoaXMucmVtb3ZlUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJWE1MVGFibGVUcmVlVmlld2VyLnRoaXMuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJCXJldHVybiBYTUxUYWJsZVRyZWVWaWV3ZXIudGhpcy5nZXRTZWxlY3Rpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlYTUxUYWJsZVRyZWVWaWV3ZXIudGhpcy5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlib29sZWFuIHNlbGVjdGlvblNldCA9IGZhbHNlOwotCQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJCQotCQkJCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQkJCUlET01Ob2RlIGRvbU5vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGRvbU5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCQlJVGV4dFJlZ2lvbiBtYXRjaGluZ1JlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCQkJCQlpbnQgYWxsb3dlZEl0ZXJhdGlvbnMgPSA0MDsKLQkJCQkJCQkJd2hpbGUgKG1hdGNoaW5nUmVnaW9uICE9IG51bGwgJiYgIW1hdGNoaW5nUmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSAmJiBhbGxvd2VkSXRlcmF0aW9ucyA+IDApIHsKLQkJCQkJCQkJCW1hdGNoaW5nUmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobWF0Y2hpbmdSZWdpb24pIC0gMSk7Ci0JCQkJCQkJCQlhbGxvd2VkSXRlcmF0aW9ucy0tOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChtYXRjaGluZ1JlZ2lvbiAhPSBudWxsICYmIG1hdGNoaW5nUmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSkgewotCQkJCQkJCQkJU3RyaW5nIGF0dHJOYW1lID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChtYXRjaGluZ1JlZ2lvbik7Ci0JCQkJCQkJCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGRvbU5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJCQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCAmJiBhdHRyTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJCQlOb2RlIGF0dHIgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCQkJCQkJCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQkJCQkJCQlzZWxlY3Rpb25TZXQgPSB0cnVlOwotCQkJCQkJCQkJCQlYTUxUYWJsZVRyZWVWaWV3ZXIudGhpcy5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYXR0cikpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICghc2VsZWN0aW9uU2V0KSB7Ci0JCQkJWE1MVGFibGVUcmVlVmlld2VyLnRoaXMuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFBhaW50TGlzdGVuZXIgZkNvbnRlbnRQYWludExpc3RlbmVyID0gbmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJR0MgZ2MgPSBlLmdjOwotCQkJaWYgKGdldFRyZWUoKS5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChnZXRUcmVlKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGdldFRyZWUoKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkpOwotCQkJCWdjLmRyYXdTdHJpbmcoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVHJlZUV4dGVuc2lvbl8zLCAxMCwgMTApOwotCQkJCWdjLmRyYXdTdHJpbmcoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVHJlZUV4dGVuc2lvbl80LCAxMCwgMTAgKyBnYy5nZXRGb250TWV0cmljcygpLmdldEhlaWdodCgpKTsKLQkJCX0KLQkJfQotCQkKLQl9OwotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uUHJvdmlkZXIgZlNlbGVjdGlvblByb3ZpZGVyID0gbmV3IFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JLy8gbm9kZTogNDAlLCBjb250ZW50OiA2MCUKLQlzdGF0aWMgZmluYWwgZG91YmxlW10gV0VJR0hUUyA9IHsgLjQsIC42IH07Ci0KLQlwcml2YXRlIENvbnRyb2xBZGFwdGVyIGZSZXNpemVBZGFwdGVyID0gbmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJc2l6ZUNvbHVtbnMoZ2V0VHJlZSgpLmdldFNpemUoKS54LCBXRUlHSFRTKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzaXplQ29sdW1ucyhpbnQgd2lkdGgsIGRvdWJsZVtdIHdlaWdodHMpIHsKLQkJCVRyZWVDb2x1bW5bXSBjb2x1bW5zID0gZ2V0VHJlZSgpLmdldENvbHVtbnMoKTsKLQkJCWludCBzaXplID0gY29sdW1ucy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWNvbHVtbnNbaV0uc2V0V2lkdGgoKGludCkod2VpZ2h0c1tpXSAqIHdpZHRoKSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHVibGljIFhNTFRhYmxlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJCi0JCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odGhpcy5nZXRUcmVlKCksIFNXVC5MRUZUKTsKLQkJY29sdW1uLnNldFRleHQoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVGFibGVUcmVlVmlld2VyXzEpOwotCi0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRoaXMuZ2V0VHJlZSgpLCBTV1QuTEVGVCk7Ci0JCWNvbHVtbi5zZXRUZXh0KFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZVZpZXdlcl8yKTsKLQotCQl0aGlzLmdldFRyZWUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0aGlzLmdldFRyZWUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCWdldFRyZWUoKS5hZGRDb250cm9sTGlzdGVuZXIoZlJlc2l6ZUFkYXB0ZXIpOwotCi0JCS8vIHNldCB1cCBwcm92aWRlcnMKLQkJcHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeSA9IG5ldyBYTUxUYWJsZVRyZWVQcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5KCk7Ci0KLQkJWE1MVGFibGVUcmVlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFhNTFRhYmxlVHJlZUNvbnRlbnRQcm92aWRlcigpOwotCQlzZXRDb250ZW50UHJvdmlkZXIocHJvdmlkZXIpOwotCQlzZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLQotCQlzZXRDb2x1bW5Qcm9wZXJ0aWVzKG5ldyBTdHJpbmdbXSB7U1RSVUNUVVJFX1BST1BFUlRZLCBWQUxVRV9QUk9QRVJUWX0pOwotCQlzZXRDZWxsRWRpdG9ycyhuZXcgQ2VsbEVkaXRvcltdIHtudWxsLCBuZXcgVGV4dENlbGxFZGl0b3IodGhpcy5nZXRUcmVlKCkpfSk7Ci0KLQkJc2V0Q2VsbE1vZGlmaWVyKG5ldyBYTUxDTUNlbGxNb2RpZmllcigpKTsKLQkJY3JlYXRlQ29udGV4dE1lbnUoKTsKLQotCQlEcmFnU291cmNlIGRyYWdTb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZShnZXRDb250cm9sKCksIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFKTsKLQkJZHJhZ1NvdXJjZS5hZGREcmFnTGlzdGVuZXIoY3JlYXRlRHJhZ1NvdXJjZUxpc3RlbmVyKCkpOwotCQlkcmFnU291cmNlLnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCl9KTsKLQkJRHJvcFRhcmdldCBkcm9wVGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQoZ2V0Q29udHJvbCgpLCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSk7Ci0JCWRyb3BUYXJnZXQuYWRkRHJvcExpc3RlbmVyKGNyZWF0ZURyb3BUYXJnZXRMaXN0ZW5lcigpKTsKLQkJZHJvcFRhcmdldC5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7TG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpfSk7Ci0KLQkJdGhpcy5nZXRUcmVlKCkuYWRkUGFpbnRMaXN0ZW5lcihmQ29udGVudFBhaW50TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlciBhbmQgYWRkcyBhIGxpc3RlbmVyIGFzIHdlbGwKLQkgKiByZWdpc3RlcmluZyB0aGUgbWVudSBmb3IgZXh0ZW5zaW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRleHRNZW51KCkgewotCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7IC8vJE5PTi1OTFMtMSQKLQkJY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTm9kZUFjdGlvbk1lbnVMaXN0ZW5lcigpKTsKLQkJTWVudSBtZW51ID0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUoZ2V0Q29udHJvbCgpKTsKLQkJZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0JfQotCi0JcHJpdmF0ZSBEcmFnU291cmNlTGlzdGVuZXIgY3JlYXRlRHJhZ1NvdXJjZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERyYWdTb3VyY2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCQlMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuc2V0U2VsZWN0aW9uKG51bGwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJCUxvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5zZXRTZWxlY3Rpb24oZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgRHJvcFRhcmdldExpc3RlbmVyIGNyZWF0ZURyb3BUYXJnZXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEcm9wVGFyZ2V0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRyYWdMZWF2ZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50Lm9wZXJhdGlvbnMgIT0gRE5ELkRST1BfTk9ORSAmJiBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQlkcmFnT3ZlcihldmVudCk7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgZXZlbnQuaXRlbSAhPSBudWxsICYmIGV2ZW50Lml0ZW0uZ2V0RGF0YSgpICE9IG51bGwpIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiB0aGUgY29tbWFuZCB1c2VzIHRoZXNlIG51bWJlcnMgaW5zdGVhZCBvZiB0aGUKLQkJCQkJCSAqIGZlZWRiYWNrIGNvbnN0YW50cyAoZXZlbiB0aG91Z2ggaXQgY29udmVydHMgaW4KLQkJCQkJCSAqIHRoZSBvdGhlciBkaXJlY3Rpb24gYXMgd2VsbCkKLQkJCQkJCSAqLwotCQkJCQkJZmxvYXQgZmVlZGJhY2tGbG9hdCA9IGdldEhlaWdodEluSXRlbShldmVudCk7Ci0KLQkJCQkJCWZpbmFsIERyYWdOb2RlQ29tbWFuZCBjb21tYW5kID0gbmV3IERyYWdOb2RlQ29tbWFuZChldmVudC5pdGVtLmdldERhdGEoKSwgZmVlZGJhY2tGbG9hdCwgZXZlbnQub3BlcmF0aW9ucywgZXZlbnQuZGV0YWlsLCBzZWxlY3Rpb24udG9MaXN0KCksIFhNTFRhYmxlVHJlZVZpZXdlci50aGlzKTsKLQkJCQkJCWlmIChjb21tYW5kICE9IG51bGwgJiYgY29tbWFuZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQkJCQlTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZHJvcEFjY2VwdChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfU0VMRUNUOwotCQkJCWZsb2F0IGZlZWRiYWNrRmxvYXQgPSBnZXRIZWlnaHRJbkl0ZW0oZXZlbnQpOwotCQkJCWlmIChmZWVkYmFja0Zsb2F0ID4gMC43NSkgewotCQkJCQlldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19JTlNFUlRfQUZURVI7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGZlZWRiYWNrRmxvYXQgPCAwLjI1KSB7Ci0JCQkJCWV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX0lOU0VSVF9CRUZPUkU7Ci0JCQkJfQotCQkJCWV2ZW50LmZlZWRiYWNrIHw9IERORC5GRUVEQkFDS19FWFBBTkQgfCBETkQuRkVFREJBQ0tfU0NST0xMOwotCQkJCWlmICggZ2V0TG9jYWxOb2RlU2VsZWN0aW9uKGV2ZW50KSA9PSBudWxsKXsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0TG9jYWxOb2RlU2VsZWN0aW9uKERyb3BUYXJnZXRFdmVudCBldmVudCl7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3Qgbm9kZSA9IGkubmV4dCgpOwotCQkJCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBOb2RlKXsKLQkJCQkJCQlyZXR1cm4gc2VsZWN0aW9uOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcHJpdmF0ZSBmbG9hdCBnZXRIZWlnaHRJbkl0ZW0oRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYoZXZlbnQuaXRlbSA9PSBudWxsKSByZXR1cm4gLjVmOwotCQkJCWlmIChldmVudC5pdGVtIGluc3RhbmNlb2YgVHJlZUl0ZW0pIHsKLQkJCQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJCUNvbnRyb2wgY29udHJvbCA9IHRyZWVJdGVtLmdldFBhcmVudCgpOwotCQkJCQlQb2ludCBwb2ludCA9IGNvbnRyb2wudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JCQkJCVJlY3RhbmdsZSBib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoKTsKLQkJCQkJcmV0dXJuIChmbG9hdCkgKHBvaW50LnkgLSBib3VuZHMueSkgLyAoZmxvYXQpIGJvdW5kcy5oZWlnaHQ7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGV2ZW50Lml0ZW0gaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKLQkJCQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IChUYWJsZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJCUNvbnRyb2wgY29udHJvbCA9IHRhYmxlSXRlbS5nZXRQYXJlbnQoKTsKLQkJCQkJUG9pbnQgcG9pbnQgPSBjb250cm9sLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQkJCQkJcmV0dXJuIChmbG9hdCkgKHBvaW50LnkgLSBib3VuZHMueSkgLyAoZmxvYXQpIGJvdW5kcy5oZWlnaHQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gMC4wRjsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRvUmVmcmVzaChPYmplY3QgbywgYm9vbGVhbiBmcm9tRGVsYXllZCkgewotCQlzdXBlci5yZWZyZXNoKG8pOwotCX0KLQotCXB1YmxpYyBJU2VsZWN0aW9uUHJvdmlkZXIgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBmU2VsZWN0aW9uUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZVZpZXdlcl8wOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURpc3Bvc2UoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmhhbmRsZURpc3Bvc2UoZXZlbnQpOwotCQl0aGlzLmdldFRyZWUoKS5yZW1vdmVQYWludExpc3RlbmVyKGZDb250ZW50UGFpbnRMaXN0ZW5lcik7Ci0JCWdldFRyZWUoKS5yZW1vdmVDb250cm9sTGlzdGVuZXIoZlJlc2l6ZUFkYXB0ZXIpOwotCQlzZXREb2N1bWVudChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLyoKLQkJICogbGV0IHRoZSB0ZXh0IGVkaXRvciB0byBiZSB0aGUgb25lIHRoYXQgbWFuYWdlcyB0aGUgbW9kZWwncyBsaWZldGltZQotCQkgKi8KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCi0JCQlpZiAoKG1vZGVsICE9IG51bGwpICYmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkpIHsKLQkJCQlEb2N1bWVudCBkb21Eb2MgPSBudWxsOwotCQkJCWRvbURvYyA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQlzZXRJbnB1dChkb21Eb2MpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCi0JfQotCQotCXByb3RlY3RlZCBUcmVlQ29udGVudEhlbHBlciB0cmVlQ29udGVudEhlbHBlciA9IG5ldyBUcmVlQ29udGVudEhlbHBlcigpOwotCXByb3RlY3RlZCBYTUxUYWJsZVRyZWVQcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5IHByb3BlcnR5RGVzY3JpcHRvckZhY3Rvcnk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUUlVDVFVSRV9QUk9QRVJUWSA9IFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRyZWVFeHRlbnNpb25fMDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSBYTUxFZGl0b3JNZXNzYWdlcy5YTUxUcmVlRXh0ZW5zaW9uXzE7Ci0JCi0JcHVibGljIGNsYXNzIFhNTENNQ2VsbE1vZGlmaWVyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllciwgVHJlZUV4dGVuc2lvbi5JQ2VsbEVkaXRvclByb3ZpZGVyIHsKLQkJcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgZWxlbWVudDsKLQkJCQlpZiAocHJvcGVydHkgPT0gVkFMVUVfUFJPUEVSVFkpIHsKLQkJCQkJcmVzdWx0ID0gdHJlZUNvbnRlbnRIZWxwZXIuaXNFZGl0YWJsZShub2RlKTsKLQkJCQkJaWYgKHJlc3VsdCkgewotCQkJCQkJLyogU2V0IHVwIHRoZSBjZWxsIGVkaXRvciBiYXNlZCBvbiB0aGUgZWxlbWVudCAqLwotCQkJCQkJQ2VsbEVkaXRvcltdIGVkaXRvcnMgPSBnZXRDZWxsRWRpdG9ycygpOwotCQkJCQkJaWYgKGVkaXRvcnMubGVuZ3RoID4gMCkgewotCQkJCQkJCWlmIChlZGl0b3JzWzFdICE9IG51bGwpCi0JCQkJCQkJCWVkaXRvcnNbMV0uZGlzcG9zZSgpOwotCQkJCQkJCWVkaXRvcnNbMV0gPSBnZXRDZWxsRWRpdG9yKGVsZW1lbnQsIDEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJCXJlc3VsdCA9IHRyZWVDb250ZW50SGVscGVyLmdldE5vZGVWYWx1ZSgoTm9kZSkgb2JqZWN0KTsKLQkJCX0KLQkJCXJldHVybiAocmVzdWx0ICE9IG51bGwpID8gcmVzdWx0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKLQkJCUl0ZW0gaXRlbSA9IChJdGVtKSBlbGVtZW50OwotCQkJU3RyaW5nIG9sZFZhbHVlID0gdHJlZUNvbnRlbnRIZWxwZXIuZ2V0Tm9kZVZhbHVlKChOb2RlKSBpdGVtLmdldERhdGEoKSk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSB2YWx1ZS50b1N0cmluZygpOwotCQkJaWYgKChuZXdWYWx1ZSAhPSBudWxsKSAmJiAhbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCXRyZWVDb250ZW50SGVscGVyLnNldE5vZGVWYWx1ZSgoTm9kZSkgaXRlbS5nZXREYXRhKCksIHZhbHVlLnRvU3RyaW5nKCksIGdldENvbnRyb2woKS5nZXRTaGVsbCgpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoT2JqZWN0IG8sIGludCBjb2wpIHsKLQkJCUlQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSBwcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5LmNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihvKTsKLQkJCXJldHVybiBwZCAhPSBudWxsID8gcGQuY3JlYXRlUHJvcGVydHlFZGl0b3IoWE1MVGFibGVUcmVlVmlld2VyLnRoaXMuZ2V0VHJlZSgpKSA6IG51bGw7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUcmVlRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUcmVlRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NjAxZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVHJlZUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01EZXNjcmlwdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIAotICogQGRlcHJlY2F0ZWQgTm8gbG9uZ2VyIHVzZWQKLSAqLwotcHVibGljIGNsYXNzIFhNTFRyZWVFeHRlbnNpb24gZXh0ZW5kcyBUcmVlRXh0ZW5zaW9uIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUUlVDVFVSRV9QUk9QRVJUWSA9IFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRyZWVFeHRlbnNpb25fMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxVRV9QUk9QRVJUWSA9IFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRyZWVFeHRlbnNpb25fMTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY29udHJvbDsKLQlwcm90ZWN0ZWQgTXlDZWxsTW9kaWZpZXIgbW9kaWZpZXI7Ci0JcHJvdGVjdGVkIFhNTFRhYmxlVHJlZVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkgcHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeTsKLQlwcm90ZWN0ZWQgQ01EZXNjcmlwdGlvbkJ1aWxkZXIgZGVjcmlwdGlvbkJ1aWxkZXIgPSBuZXcgQ01EZXNjcmlwdGlvbkJ1aWxkZXIoKTsKLQlwcm90ZWN0ZWQgVHJlZUNvbnRlbnRIZWxwZXIgdHJlZUNvbnRlbnRIZWxwZXIgPSBuZXcgVHJlZUNvbnRlbnRIZWxwZXIoKTsKLQotCXByb3RlY3RlZCBDb2xvciBmMSwgZjIsIGIxLCBiMjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYWNoZWREYXRhSXNWYWxpZCA9IHRydWU7Ci0KLQlwdWJsaWMgWE1MVHJlZUV4dGVuc2lvbihUcmVlIHRyZWUpIHsKLQkJc3VwZXIodHJlZSk7Ci0JCWNvbnRyb2wgPSB0cmVlOwotCQltb2RpZmllciA9IG5ldyBNeUNlbGxNb2RpZmllcigpOwotCQlzZXRDZWxsTW9kaWZpZXIobW9kaWZpZXIpOwotCQlTdHJpbmdbXSBwcm9wZXJ0aWVzID0ge1NUUlVDVFVSRV9QUk9QRVJUWSwgVkFMVUVfUFJPUEVSVFl9OwotCQlzZXRDb2x1bW5Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCi0JCS8qIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODU4NTEgLSBVc2VkIHRvIGJlIGhhcmRjb2RlZCBhcyBDT0xPUl9CTEFDSyAqLwotCQlmMSA9IHRyZWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpOwotCQlDb2xvciBiYWNrZ3JvdW5kID0gdHJlZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0KLQkJaW50IHIgPSBNYXRoLmFicyhiYWNrZ3JvdW5kLmdldFJlZCgpIC0gMTI1KTsKLQkJaW50IGcgPSBNYXRoLmFicyhiYWNrZ3JvdW5kLmdldEdyZWVuKCkgLSA4NSk7Ci0JCWludCBiID0gTWF0aC5hYnMoYmFja2dyb3VuZC5nZXRCbHVlKCkgLSAxMDUpOwotCi0JCWYyID0gbmV3IENvbG9yKHRyZWUuZ2V0RGlzcGxheSgpLCByLCBnLCBiKTsKLQkJYjEgPSB0cmVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04pOwotCQliMiA9IGJhY2tncm91bmQ7Ci0KLQkJcHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeSA9IG5ldyBYTUxUYWJsZVRyZWVQcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlmMi5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXRDYWNoZWREYXRhKCkgewotCQljYWNoZWREYXRhSXNWYWxpZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHBhaW50SXRlbXMoR0MgZ2MsIFRyZWVJdGVtW10gaXRlbXMsIFJlY3RhbmdsZSB0cmVlQm91bmRzKSB7Ci0JCXN1cGVyLnBhaW50SXRlbXMoZ2MsIGl0ZW1zLCB0cmVlQm91bmRzKTsKLQkJY2FjaGVkRGF0YUlzVmFsaWQgPSB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3RbXSBjb21wdXRlVHJlZUV4dGVuc2lvbkRhdGEoT2JqZWN0IG9iamVjdCkgewotCQlDb2xvciBjb2xvciA9IGYxOwotCQlTdHJpbmcgc3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzdHJpbmcgPSAoU3RyaW5nKSBtb2RpZmllci5nZXRWYWx1ZShvYmplY3QsIFZBTFVFX1BST1BFUlRZKTsKLQkJCWNvbG9yID0gZjE7Ci0JCX0KLQkJaWYgKChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgJiYgKG9iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7Ci0JCQlzdHJpbmcgPSBnZXRFbGVtZW50VmFsdWVIZWxwZXIoKEVsZW1lbnQpIG9iamVjdCk7Ci0JCQljb2xvciA9IGYyOwotCQl9Ci0JCU9iamVjdFtdIGRhdGEgPSBuZXcgT2JqZWN0WzJdOwotCQlkYXRhWzBdID0gc3RyaW5nOwotCQlkYXRhWzFdID0gY29sb3I7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhaW50SXRlbShHQyBnYywgVHJlZUl0ZW0gaXRlbSwgUmVjdGFuZ2xlIGJvdW5kcykgewotCQlzdXBlci5wYWludEl0ZW0oZ2MsIGl0ZW0sIGJvdW5kcyk7Ci0JCU9iamVjdFtdIGRhdGEgPSBjb21wdXRlVHJlZUV4dGVuc2lvbkRhdGEoaXRlbS5nZXREYXRhKCkpOwotCQlpZiAoKGRhdGEgIT0gbnVsbCkgJiYgKGRhdGEubGVuZ3RoID09IDIpKSB7Ci0JCQlnYy5zZXRDbGlwcGluZyhjb2x1bW5Qb3NpdGlvbiwgYm91bmRzLnkgKyAxLCBjb250cm9sV2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZCgoQ29sb3IpIGRhdGFbMV0pOwotCQkJZ2MuZHJhd1N0cmluZygoU3RyaW5nKSBkYXRhWzBdLCBjb2x1bW5Qb3NpdGlvbiArIDUsIGJvdW5kcy55ICsgMSk7Ci0JCQlnYy5zZXRDbGlwcGluZygoUmVjdGFuZ2xlKSBudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVtcHR5VHJlZU1lc3NhZ2UoR0MgZ2MpIHsKLQkJLy8gaGVyZSB3ZSBwcmludCBhIG1lc3NhZ2Ugd2hlbiB0aGUgZG9jdW1lbnQgaXMgZW1wdHkganVzdCB0byBnaXZlIHRoZQotCQkvLyB1c2VyIGEgdmlzdWFsIGN1ZQotCQkvLyBzbyB0aGF0IHRoZXkga25vdyBob3cgdG8gcHJvY2VlZCB0byBlZGl0IHRoZSBibGFuayB2aWV3Ci0JCWdjLnNldEZvcmVncm91bmQoZlRyZWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGZUcmVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCWdjLmRyYXdTdHJpbmcoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVHJlZUV4dGVuc2lvbl8zLCAxMCwgMTApOwotCQlnYy5kcmF3U3RyaW5nKFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRyZWVFeHRlbnNpb25fNCwgMTAsIDEwICsgZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50VmFsdWVIZWxwZXIoRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCi0JCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJaWYgKChyZXN1bHQgPT0gbnVsbCkgJiYgKG1xICE9IG51bGwpKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG1xLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKChlZCAhPSBudWxsKSAmJiAhQm9vbGVhbi5UUlVFLmVxdWFscyhlZC5nZXRQcm9wZXJ0eSgiaXNJbmZlcnJlZCIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gZGVjcmlwdGlvbkJ1aWxkZXIuYnVpbGREZXNjcmlwdGlvbihlZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTXlDZWxsTW9kaWZpZXIgaW1wbGVtZW50cyBJQ2VsbE1vZGlmaWVyLCBUcmVlRXh0ZW5zaW9uLklDZWxsRWRpdG9yUHJvdmlkZXIgewotCQlwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTm9kZSkgewotCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBlbGVtZW50OwotCQkJCXJlc3VsdCA9IChwcm9wZXJ0eSA9PSBWQUxVRV9QUk9QRVJUWSkgJiYgdHJlZUNvbnRlbnRIZWxwZXIuaXNFZGl0YWJsZShub2RlKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJCXJlc3VsdCA9IHRyZWVDb250ZW50SGVscGVyLmdldE5vZGVWYWx1ZSgoTm9kZSkgb2JqZWN0KTsKLQkJCX0KLQkJCXJldHVybiAocmVzdWx0ICE9IG51bGwpID8gcmVzdWx0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKLQkJCS8vIGVuYWJsZU5vZGVTZWxlY3Rpb25MaXN0ZW5lcihmYWxzZSk7Ci0JCQlJdGVtIGl0ZW0gPSAoSXRlbSkgZWxlbWVudDsKLQkJCVN0cmluZyBvbGRWYWx1ZSA9IHRyZWVDb250ZW50SGVscGVyLmdldE5vZGVWYWx1ZSgoTm9kZSkgaXRlbS5nZXREYXRhKCkpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKLQkJCWlmICgobmV3VmFsdWUgIT0gbnVsbCkgJiYgIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQl0cmVlQ29udGVudEhlbHBlci5zZXROb2RlVmFsdWUoKE5vZGUpIGl0ZW0uZ2V0RGF0YSgpLCB2YWx1ZS50b1N0cmluZygpKTsKLQkJCX0KLQkJCS8vIGVuYWJsZU5vZGVTZWxlY3Rpb25MaXN0ZW5lcih0cnVlKTsKLQkJfQotCi0JCXB1YmxpYyBDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoT2JqZWN0IG8sIGludCBjb2wpIHsKLQkJCUlQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSBwcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5LmNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihvKTsKLQkJCXJldHVybiBwZCAhPSBudWxsID8gcGQuY3JlYXRlUHJvcGVydHlFZGl0b3IoY29udHJvbCkgOiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjNiZWEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBYTUwgVmFsaWRhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24ueG1sdmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVGX0ZJTEVfRVJST1JfREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JFRl9GSUxFX0VSUk9SX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JFRl9GSUxFX0VSUk9SX0RFVEFJTFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RFVEFJTFNfSU5GT1JNQVRJT05fVU5BVkFJTEFCTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RFVEFJTFNfSU5GT19SRVZBTElEQVRFX1RPX1JFR0VORVJBVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NBVkVfRElSVFlfRklMRV9NRVNTQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TQVZFX0RJUlRZX0ZJTEVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3RUYWJsZVZpZXdlcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0VGFibGVWaWV3ZXJfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdFRhYmxlVmlld2VyXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3RUYWJsZVZpZXdlcl8zOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9Hcm91cE5hbWVQcm9wZXJ0eVRlc3Rlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9Hcm91cE5hbWVQcm9wZXJ0eVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzNlOWJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vR3JvdXBOYW1lUHJvcGVydHlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mbzsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotCi0KLS8qKgotICogQ3VzdG9tIHByb3BlcnR5IHRlc3RlciB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgZ3JvdXBOYW1lIGF0dHJpYnV0ZSBpcwotICogcHJlc2VudCBvbiBhIG1hcmtlciBhbmQgdGhhdCBpdHMgdmFsdWUgc3RhcnRzIHdpdGggYSBnaXZlbiBleHBlY3RlZCB2YWx1ZS4KLSAqLwotcHVibGljIGNsYXNzIEdyb3VwTmFtZVByb3BlcnR5VGVzdGVyIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXIKLXsKLSAgLyoqCi0gICAqIFRoZSBncm91cCBuYW1lIHByZWZpeCBwcm9wZXJ0eSBuYW1lLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX05BTUVfUFJFRklYID0gImdyb3VwTmFtZVByZWZpeCI7IC8vJE5PTi1OTFMtMSQgIAotCi0gIC8qKgotICAgKiBUaGUgZ3JvdXAgbmFtZSBtYXJrZXIgYXR0cmlidXRlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX05BTUUgPSAiZ3JvdXBOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgcHJvcGVydHksIE9iamVjdFtdIGFyZ3MsIE9iamVjdCBleHBlY3RlZFZhbHVlKQotICB7Ci0gICAgaWYgKEdST1VQX05BTUVfUFJFRklYLmVxdWFscyhwcm9wZXJ0eSkpCi0gICAgewotICAgICAgaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgSU1hcmtlcikKLSAgICAgIHsKLSAgICAgICAgSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcilyZWNlaXZlcjsKLQotICAgICAgICBTdHJpbmcgZ3JvdXBOYW1lID0gbWFya2VyLmdldEF0dHJpYnV0ZShHUk9VUF9OQU1FLCBudWxsKTsKLQotICAgICAgICBib29sZWFuIHRlc3RWYWx1ZSA9IGdyb3VwTmFtZSAhPSBudWxsICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgJiYgZ3JvdXBOYW1lLnN0YXJ0c1dpdGgoKFN0cmluZylleHBlY3RlZFZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRlc3RWYWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vUmVmZXJlbmNlZEZpbGVFcnJvckRpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9SZWZlcmVuY2VkRmlsZUVycm9yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYzlmMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9SZWZlcmVuY2VkRmlsZUVycm9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VNb3ZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uWE1MVmFsaWRhdGlvblVJTWVzc2FnZXM7Ci0KLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZWRGaWxlRXJyb3JEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBUYXNrTGlzdFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCXByb3RlY3RlZCBMaXN0IGVycm9yTGlzdDsKLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcmtlZFVwRGV0YWlsc01lc3NhZ2U7Ci0JcHJvdGVjdGVkIFN0cmluZyBjb250ZXh0RmlsZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlZmVyZW5jZWRGaWxlOwotCXByb3RlY3RlZCBTdHlsZWRUZXh0IHN0eWxlZFRleHQ7Ci0JcHJvdGVjdGVkIFRleHQgZnVsbEZpbGVOYW1lRmllbGQ7Ci0KLQlwdWJsaWMgUmVmZXJlbmNlZEZpbGVFcnJvckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgTGlzdCBlcnJvckxpc3QsIFN0cmluZyBjb250ZXh0RmlsZSwgU3RyaW5nIHJlZmVyZW5jZWRGaWxlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQotCQlpbnQgc3R5bGVCaXRzID0gZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRTsKLQkJc3R5bGVCaXRzICY9IH5TV1QuQVBQTElDQVRJT05fTU9EQUw7Ci0KLQkJc2V0U2hlbGxTdHlsZShzdHlsZUJpdHMpOwotCQl0aGlzLmVycm9yTGlzdCA9IGVycm9yTGlzdDsKLQotCQl0aGlzLnJlZmVyZW5jZWRGaWxlID0gcmVmZXJlbmNlZEZpbGU7Ci0JCXRoaXMuY29udGV4dEZpbGUgPSBjb250ZXh0RmlsZTsKLQkJdGhpcy5tYXJrZWRVcERldGFpbHNNZXNzYWdlID0gZ2V0TWFya2VkVXBEZXRhaWxzTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgY3JlYXRlQW5kT3BlbigpIHsKLQkJY3JlYXRlKCk7Ci0JCWdldFNoZWxsKCkuc2V0VGV4dChYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5fVUlfUkVGX0ZJTEVfRVJST1JfREVUQUlMUyk7Ci0KLQkJc2V0QmxvY2tPbk9wZW4oZmFsc2UpOwotCQlyZXR1cm4gb3BlbigpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWZ1bGxGaWxlTmFtZUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZ1bGxGaWxlTmFtZUZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlmdWxsRmlsZU5hbWVGaWVsZC5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXRCYWNrZ3JvdW5kKCkpOwotCQlmdWxsRmlsZU5hbWVGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJc3VwZXIuY3JlYXRlQnV0dG9uQmFyKGNvbXBvc2l0ZSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWRpYWxvZ0FyZWEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQljLnNldExheW91dERhdGEoY3JlYXRlR3JpZERhdGEodHJ1ZSwgLTEsIDIwMCkpOwotCi0JCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChjLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7Ci0JCXN0eWxlZFRleHQuc2V0QmFja2dyb3VuZChjLmdldEJhY2tncm91bmQoKSk7Ci0JCXNldFN0eWxlZFRleHQoc3R5bGVkVGV4dCwgbWFya2VkVXBEZXRhaWxzTWVzc2FnZSk7Ci0JCXN0eWxlZFRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlzdHlsZWRUZXh0LnNldExheW91dERhdGEoY3JlYXRlR3JpZERhdGEoZmFsc2UsIDY1MCwgLTEpKTsKLQotCQlNb3VzZUxpc3RlbmVyIG1vdXNlTGlzdGVuZXIgPSBuZXcgTW91c2VMaXN0ZW5lcigpOwotCQlzdHlsZWRUZXh0LmFkZE1vdXNlTW92ZUxpc3RlbmVyKG1vdXNlTGlzdGVuZXIpOwotCi0JCXRhYmxlVmlld2VyID0gbmV3IFRhc2tMaXN0VGFibGVWaWV3ZXIoYywgMTApOwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChlcnJvckxpc3QpOwotCQl0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IEludGVybmFsU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCXRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGNyZWF0ZUdyaWREYXRhKHRydWUsIDcwMCwgLTEpKTsKLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCi0JU3RyaW5nIGdldEZ1bGxVUkkoaW50IG9mZnNldCkgewotCQlTdHJpbmcgdXJpID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGluZGV4ID0gZ2V0SW5kZXgob2Zmc2V0KTsKLQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQlpZiAoKGluZGV4ID09IDApIHx8IChpbmRleCA9PSAyKSB8fCAoaW5kZXggPT0gMykpIHsKLQkJCQl1cmkgPSByZWZlcmVuY2VkRmlsZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXVyaSA9IGNvbnRleHRGaWxlOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0SW5kZXgoaW50IG9mZnNldCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCVN0eWxlUmFuZ2VbXSByYW5nZSA9IHN0eWxlZFRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByYW5nZS5sZW5ndGg7IGkrKykgewotCQkJaW50IGwgPSByYW5nZVtpXS5zdGFydDsKLQkJCWludCByID0gbCArIHJhbmdlW2ldLmxlbmd0aDsKLQkJCWlmICgobCA8PSBvZmZzZXQpICYmIChyID49IG9mZnNldCkpIHsKLQkJCQlyZXN1bHQgPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JY2xhc3MgTW91c2VMaXN0ZW5lciBpbXBsZW1lbnRzIE1vdXNlTW92ZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCVN0cmluZyB0b29sVGlwVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCi0JCQkJaW50IG9mZnNldCA9IHN0eWxlZFRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJCXRvb2xUaXBUZXh0ID0gZ2V0RnVsbFVSSShvZmZzZXQpOwotCi0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBEbyBub3RoaW5nLgotCQkJfQotCQkJc3R5bGVkVGV4dC5zZXRUb29sVGlwVGV4dCh0b29sVGlwVGV4dCk7Ci0JCQlpZiAoKHRvb2xUaXBUZXh0ICE9IG51bGwpICYmICh0b29sVGlwVGV4dC5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJZnVsbEZpbGVOYW1lRmllbGQuc2V0VGV4dCh0b29sVGlwVGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNYXJrZWRVcERldGFpbHNNZXNzYWdlKCkgewotCQlTdHJpbmcgZGV0YWlsc01lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBUT0RPLi4uIG5lZWQgdG8gbW92ZSAnX1VJX1JFRl9GSUxFX0VSUk9SX0RFU0NSSVBUSU9OJyB0byB0aGlzCi0JCS8vIHBsdWdpbidzIHByb3BlcnRpZXMgZmlsZQotCQkvLwkJCQotCQlTdHJpbmcgc3RyaW5nID0gWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuX1VJX1JFRl9GSUxFX0VSUk9SX0RFU0NSSVBUSU9OOwotCQkvLyBUT0RPLi4uIG5lZWQgdG8gZWRpdCB0aGUgcHJvcGVydGllcyBmaWxlIHRvIHJlbW92ZSAiJyIgY2hhcmFjdGVycwotCQkvLyBmcm9tIHRoZSBzdHJpbmcKLQkJLy8gSSdtIHVzaW5nIHRoZXNlIGNoYXJhY3RlcnMgdG8gbWFya3VwIHRoZSBib2xkIGZvbnQuIEl0J3Mgc2FmZXIgaWYgSQotCQkvLyBhZGQgdGhlc2UgcHJvZ3JhbXRpY2FsbHkuCi0JCS8vCi0JCXN0cmluZyA9IHJlbW92ZVBhdHRlcm4oc3RyaW5nLCAiJyIpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGMgPSAiJyIgKyBnZXRMYXN0U2VnbWVudChjb250ZXh0RmlsZSkgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTdHJpbmcgciA9ICInIiArIGdldExhc3RTZWdtZW50KHJlZmVyZW5jZWRGaWxlKSArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJZGV0YWlsc01lc3NhZ2UgPSBOTFMuYmluZChzdHJpbmcsIG5ldyBPYmplY3RbXXtyLCBjLCByLCBjfSk7Ci0JCXJldHVybiBkZXRhaWxzTWVzc2FnZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyByZW1vdmVQYXR0ZXJuKFN0cmluZyBzdHJpbmcsIFN0cmluZyBwYXR0ZXJuKSB7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpbnQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihwYXR0ZXJuKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCXN0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpICsgc3RyaW5nLnN1YnN0cmluZyhpbmRleCArIHBhdHRlcm4ubGVuZ3RoKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U3R5bGVkVGV4dChTdHlsZWRUZXh0IHN0eWxlZFRleHQsIFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyB2aXNpYmxlTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihtYXJrZWRVcERldGFpbHNNZXNzYWdlLCAiJyIsIGZhbHNlKTsgc3QuaGFzTW9yZVRva2VucygpOykgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlTdHJpbmcgdG9rZW4gPSBzdC5uZXh0VG9rZW4oKTsKLQkJCXZpc2libGVNZXNzYWdlICs9IHRva2VuOwotCQl9Ci0KLQkJc3R5bGVkVGV4dC5zZXRUZXh0KHZpc2libGVNZXNzYWdlKTsKLQkJLy8gZHcgRm9udCBmb250ID0gc3R5bGVkVGV4dC5nZXRGb250KCk7Ci0KLQkJYm9vbGVhbiBpblF1b3RlID0gZmFsc2U7Ci0JCWludCBwb3NpdGlvbiA9IDA7Ci0JCWZvciAoU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihtYXJrZWRVcERldGFpbHNNZXNzYWdlLCAiJyIsIHRydWUpOyBzdC5oYXNNb3JlVG9rZW5zKCk7KSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCVN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpOwotCi0JCQlpZiAodG9rZW4uZXF1YWxzKCInIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlpblF1b3RlID0gIWluUXVvdGU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoaW5RdW90ZSkgewotCQkJCQl0cnkgewotCi0JCQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UocG9zaXRpb24sIHRva2VuLmxlbmd0aCgpLCBzdHlsZWRUZXh0LmdldEZvcmVncm91bmQoKSwgc3R5bGVkVGV4dC5nZXRCYWNrZ3JvdW5kKCksIFNXVC5CT0xEKTsKLQkJCQkJCXN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXBvc2l0aW9uID0gcG9zaXRpb24gKyB0b2tlbi5sZW5ndGgoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEdyaWREYXRhIGNyZWF0ZUdyaWREYXRhKGJvb2xlYW4gZmlsbEJvdGgsIGludCB3LCBpbnQgaCkgewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShmaWxsQm90aCA/IEdyaWREYXRhLkZJTExfQk9USCA6IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLndpZHRoSGludCA9IHc7Ci0JCWdkLmhlaWdodEhpbnQgPSBoOwotCQlyZXR1cm4gZ2Q7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldExhc3RTZWdtZW50KFN0cmluZyB1cmkpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IHVyaTsKLQkJaW50IGluZGV4ID0gTWF0aC5tYXgodXJpLmxhc3RJbmRleE9mKCIvIiksIHVyaS5sYXN0SW5kZXhPZigiXFwiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCXJlc3VsdCA9IHVyaS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBJbnRlcm5hbFNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlWYWxpZGF0aW9uTWVzc2FnZSB2YWxpZGF0aW9uTWVzc2FnZSA9IChWYWxpZGF0aW9uTWVzc2FnZSkgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmICh2YWxpZGF0aW9uTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB1cmlzdHJpbmcgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRVcmkoKTsKLQkJCQkJUmVmZXJlbmNlZEZpbGVFcnJvclV0aWxpdHkub3BlbkVkaXRvckFuZEdvdG9FcnJvcih1cmlzdHJpbmcsIHZhbGlkYXRpb25NZXNzYWdlLmdldExpbmVOdW1iZXIoKSwgdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0Q29sdW1uTnVtYmVyKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vUmVmZXJlbmNlZEZpbGVFcnJvclV0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vUmVmZXJlbmNlZEZpbGVFcnJvclV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4ZWU4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1JlZmVyZW5jZWRGaWxlRXJyb3JVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mbzsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmxvZ2dpbmcuTG9nZ2VyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlZEZpbGVFcnJvclV0aWxpdHkgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuRWRpdG9yQW5kR290b0Vycm9yKFN0cmluZyB1cmlzdHJpbmcsIGZpbmFsIGludCBsaW5lLCBmaW5hbCBpbnQgY29sdW1uKSB7Ci0JCWlmICh1cmlzdHJpbmcgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlVUkwgdXJpID0gbmV3IFVSTCh1cmlzdHJpbmcpOwotCQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCQlpZiAoImZpbGUiLmVxdWFscyh1cmkuZ2V0UHJvdG9jb2woKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJU3RyaW5nIHBhdGhTdHJpbmcgPSB1cmkuZ2V0UGF0aCgpOwotCQkJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHBhdGhTdHJpbmcpOwotCQkJCQkJU3RyaW5nIGRldmljZSA9IHBhdGguZ2V0RGV2aWNlKCk7Ci0JCQkJCQlpZiAoKGRldmljZSAhPSBudWxsKSAmJiBkZXZpY2Uuc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl7Ci0JCQkJCQkJcGF0aCA9IHBhdGguc2V0RGV2aWNlKGRldmljZS5zdWJzdHJpbmcoMSkpOwotCQkJCQkJfQotCQkJCQkJZmluYWwgSUZpbGUgaUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJCQkJCWlmICgoaUZpbGUgIT0gbnVsbCkgJiYgaUZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQkvLyBPcGVuIHRoZSBlZGl0b3IgZm9yIHRoaXMgZmlsZS4KLQkJCQkJCQlmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCQkJCQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0KLQkJCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IGlGaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJCQkJCQkJSUVkaXRvclJlZ2lzdHJ5IGVkaXRvclJlZ2lzdHJ5ID0gd29ya2JlbmNoLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCQkJCQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gaUZpbGUuZ2V0TmFtZSgpOwotCQkJCQkJCQkJCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBlZGl0b3JSZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGVOYW1lLCBjb250ZW50VHlwZSk7Ci0JCQkJCQkJCQkJU3RyaW5nIGVkaXRvcklkOwotCQkJCQkJCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJZWRpdG9ySWQgPSBkZXNjcmlwdG9yLmdldElkKCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCQlkZXNjcmlwdG9yID0gZWRpdG9yUmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihmaWxlTmFtZSArICIudHh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJZWRpdG9ySWQgPSBkZXNjcmlwdG9yLmdldElkKCk7IAotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkKLQkJCQkJCQkJCQlpZiAoZWRpdG9ySWQgIT0gbnVsbCkKLQkJCQkJCQkJCQl7Ci0JCQkJCQkJCQkJICBGaWxlRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBuZXcgRmlsZUVkaXRvcklucHV0KGlGaWxlKTsKLQkJCQkJCQkJCQkgIElXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJCQkJCSAgYWN0aXZlUGFnZS5vcGVuRWRpdG9yKGVkaXRvcklucHV0LCBlZGl0b3JJZCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQkJCUxvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VySW5zdGFuY2UoKS5sb2dFcnJvcigiRXhjZXB0aW9uIGVuY291bnRlcmVkIHdoZW4gYXR0ZW1wdGluZyB0byBvcGVuIGZpbGU6ICIgKyBpRmlsZSArICJcblxuIiwgZXgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCi0JCQkJCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQkJCQkJZ290b0Vycm9yKGVkaXRvclBhcnQsIGxpbmUsIGNvbHVtbik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9OwotCQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBEbyBub3RoaW5nLgotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIHZvaWQgZ290b0Vycm9yKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQsIGludCBsaW5lLCBpbnQgY29sdW1uKSB7Ci0JCWlmIChlZGl0b3JQYXJ0ICE9IG51bGwpIHsKLQkJCVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChUZXh0RWRpdG9yKSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSURvY3VtZW50UHJvdmlkZXIgZHAgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJCQkJSURvY3VtZW50IGRvY3VtZW50ID0gKGRwICE9IG51bGwpID8gZHAuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKSA6IG51bGw7Ci0JCQkJCXRleHRFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKGRvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSAtIDEpICsgY29sdW1uIC0gMSwgMCk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJCS8vIG1hcmtlciByZWZlcnMgdG8gaW52YWxpZCB0ZXh0IHBvc2l0aW9uIC0+IGRvIG5vdGhpbmcKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1JlZmVyZW5jZWRGaWxlRXJyb3JzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9SZWZlcmVuY2VkRmlsZUVycm9yc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiNjI0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1JlZmVyZW5jZWRGaWxlRXJyb3JzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mbzsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLk1hcmtlclZpZXdIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLlhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzOwotCi0KLS8qKgotICogSGFuZGxlciBmb3IgdGhlIHJlZmVyZW5jZWQgZmlsZSBlcnJvcnMgY29tbWFuZC4gVGhpcyBjbGFzcyByZXBsYWNlcyB0aGUgb2xkCi0gKiBSZWZlcmVuY2VkRmlsZUVycm9yQWN0aW9uRGVsZWdhdGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VkRmlsZUVycm9yc0hhbmRsZXIgZXh0ZW5kcyBNYXJrZXJWaWV3SGFuZGxlcgotewotICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIGZpbmFsIElNYXJrZXJbXSBzZWxlY3RlZE1hcmtlcnMgPSBnZXRTZWxlY3RlZE1hcmtlcnMoZXZlbnQpOwotCi0gICAgSU1hcmtlciBzZWxlY3RlZE1hcmtlciA9IHNlbGVjdGVkTWFya2Vyc1swXTsKLQotICAgIGlmIChzZWxlY3RlZE1hcmtlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotCi0gICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IHNlbGVjdGVkTWFya2VyLmdldFJlc291cmNlKCk7Ci0gICAgICAgIE1hcCBtYXAgPSAoTWFwKXJlc291cmNlLmdldFNlc3Npb25Qcm9wZXJ0eShWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUl9NRVNTQUdFX01BUF9RVUFMSUZJRURfTkFNRSk7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBpbmZvVW5hdmFpbGFibGUgPSBYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5fVUlfREVUQUlMU19JTkZPUk1BVElPTl9VTkFWQUlMQUJMRTsKLSAgICAgICAgICBTdHJpbmcgcmV2YWxpZGF0ZVRvUmVnZW5lcmF0ZUVycm9ycyA9IFhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLl9VSV9ERVRBSUxTX0lORk9fUkVWQUxJREFURV9UT19SRUdFTkVSQVRFOwotICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIGluZm9VbmF2YWlsYWJsZSwgcmV2YWxpZGF0ZVRvUmVnZW5lcmF0ZUVycm9ycyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHVyaSA9IG51bGw7Ci0KLSAgICAgICAgICBTdHJpbmcgZ3JvdXBOYW1lID0gKFN0cmluZylzZWxlY3RlZE1hcmtlci5nZXRBdHRyaWJ1dGUoImdyb3VwTmFtZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKGdyb3VwTmFtZS5zdGFydHNXaXRoKCJyZWZlcmVuY2VkRmlsZUVycm9yIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaW5kZXgxID0gZ3JvdXBOYW1lLmluZGV4T2YoIigiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaW50IGluZGV4MiA9IGdyb3VwTmFtZS5sYXN0SW5kZXhPZigiKSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoKGluZGV4MSAhPSAtMSkgJiYgKGluZGV4MiA+IGluZGV4MSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVyaSA9IGdyb3VwTmFtZS5zdWJzdHJpbmcoaW5kZXgxICsgMSwgaW5kZXgyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAodXJpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgTGlzdCBsaXN0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotICAgICAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSA9IChWYWxpZGF0aW9uTWVzc2FnZSltYXAuZ2V0KHVyaSk7Ci0gICAgICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsaXN0ID0gbWVzc2FnZS5nZXROZXN0ZWRNZXNzYWdlcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJUGF0aCByZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHJlc291cmNlTG9jYXRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRlZEZpbGVVUkkgPSByZXNvdXJjZUxvY2F0aW9uLnRvT1NTdHJpbmcoKTsKLSAgICAgICAgICAgICAgdmFsaWRhdGVkRmlsZVVSSSA9ICJmaWxlOi8iICsgdmFsaWRhdGVkRmlsZVVSSTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgIFJlZmVyZW5jZWRGaWxlRXJyb3JEaWFsb2cgZGlhbG9nID0gbmV3IFJlZmVyZW5jZWRGaWxlRXJyb3JEaWFsb2coCi0gICAgICAgICAgICAgICAgSGFuZGxlclV0aWwuZ2V0QWN0aXZlU2hlbGwoZXZlbnQpLAotICAgICAgICAgICAgICAgIGxpc3QsCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVkRmlsZVVSSSwKLSAgICAgICAgICAgICAgICB1cmkpOwotICAgICAgICAgICAgICBkaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vVGFza0xpc3RUYWJsZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9UYXNrTGlzdFRhYmxlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzM2VkZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9UYXNrTGlzdFRhYmxlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uWE1MVmFsaWRhdGlvblVJTWVzc2FnZXM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgVGFza0xpc3RUYWJsZVZpZXdlciBleHRlbmRzIFRhYmxlVmlld2VyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fSUNPTiA9IDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0RFU0NSSVBUSU9OID0gMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fUkVTT1VSQ0UgPSAzOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9MT0NBVElPTiA9IDI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9JQ09OID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9ERVNDUklQVElPTiA9IFhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLlRhc2tMaXN0VGFibGVWaWV3ZXJfMDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9SRVNPVVJDRSA9IFhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLlRhc2tMaXN0VGFibGVWaWV3ZXJfMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9MT0NBVElPTiA9IFhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLlRhc2tMaXN0VGFibGVWaWV3ZXJfMjsKLQotCXByb3RlY3RlZCBpbnQgdmlzaWJsZVJvd3MgPSAtMTsKLQotCXByb3RlY3RlZCBpbnQgZ2V0Q29sdW1uV2lkdGgoaW50IGNvbHVtbikgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCWNhc2UgQ09MVU1OX0lDT04gOiB7Ci0JCQkJcmVzdWx0ID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQ09MVU1OX0RFU0NSSVBUSU9OIDogewotCQkJCXJlc3VsdCA9IDIwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBDT0xVTU5fUkVTT1VSQ0UgOiB7Ci0JCQkJcmVzdWx0ID0gMzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQ09MVU1OX0xPQ0FUSU9OIDogewotCQkJCXJlc3VsdCA9IDM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgVGFza0xpc3RUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgdmlzaWJsZVJvd3MpIHsKLQkJdGhpcyhwYXJlbnQsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIsIHZpc2libGVSb3dzKTsKLQl9Ci0KLQlwdWJsaWMgVGFza0xpc3RUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIGludCB2aXNpYmxlUm93cykgewotCQlzdXBlcihuZXcgVGFibGUocGFyZW50LCBzdHlsZSkpOwotCQlnZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotCQlQcm92aWRlciBwcm92aWRlciA9IG5ldyBQcm92aWRlcigpOwotCQlzZXRDb250ZW50UHJvdmlkZXIocHJvdmlkZXIpOwotCQlzZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLQotCQlTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkgPSB7TEFCRUxfSUNPTiwgTEFCRUxfREVTQ1JJUFRJT04sIExBQkVMX0xPQ0FUSU9OfTsKLQkJc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkpOwotCi0JCVRhYmxlIHRhYmxlID0gZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgaSk7Ci0JCQljb2x1bW4uc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzQXJyYXlbaV0pOwotCQkJY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YShnZXRDb2x1bW5XaWR0aChpKSwgdHJ1ZSkpOwotCQl9Ci0KLQkJdGFibGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJdGhpcy52aXNpYmxlUm93cyA9IHZpc2libGVSb3dzOwotCX0KLQotCS8qKgotCSAqIE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciwgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQlWaWV3ZXIgdmlld2VyOwotCQlJbWFnZSBlcnJvckltYWdlOwotCQlJbWFnZSB3YXJuSW1hZ2U7Ci0KLQkJcHVibGljIFByb3ZpZGVyKCkgewotCQkJZXJyb3JJbWFnZSA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19FUlJPUl9UU0spOwotCi0JCQl3YXJuSW1hZ2UgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfV0FSTl9UU0spOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgdmlld2VyLmdldElucHV0KCk7Ci0JCQlyZXR1cm4gbGlzdCAhPSBudWxsID8gbGlzdC50b0FycmF5KCkgOiBudWxsOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJVmFsaWRhdGlvbk1lc3NhZ2UgdmFsaWRhdGlvbk1lc3NhZ2UgPSAoVmFsaWRhdGlvbk1lc3NhZ2UpIG9iamVjdDsKLQkJCUltYWdlIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJCWludCBzZXZlcml0eSA9IHZhbGlkYXRpb25NZXNzYWdlLmdldFNldmVyaXR5KCk7Ci0JCQkJaWYgKChzZXZlcml0eSA9PSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZKSB8fCAoc2V2ZXJpdHkgPT0gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZKSkgewotCQkJCQlyZXN1bHQgPSBlcnJvckltYWdlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gd2FybkltYWdlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbikgewotCQkJVmFsaWRhdGlvbk1lc3NhZ2UgZXJyb3JNZXNzYWdlID0gKFZhbGlkYXRpb25NZXNzYWdlKSBvYmplY3Q7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXN3aXRjaCAoY29sdW1uKSB7Ci0JCQkJY2FzZSBDT0xVTU5fREVTQ1JJUFRJT04gOiB7Ci0JCQkJCXJlc3VsdCA9IGVycm9yTWVzc2FnZS5nZXRNZXNzYWdlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIENPTFVNTl9MT0NBVElPTiA6IHsKLQkJCQkJcmVzdWx0ID0gWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuVGFza0xpc3RUYWJsZVZpZXdlcl8zICsgZXJyb3JNZXNzYWdlLmdldExpbmVOdW1iZXIoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24veG1sdmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi94bWx2YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNWM4NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi94bWx2YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMgQ29uc3RhbnRzIGZvciBzdHJpbmdzICAKLQotIwotIyBSZWZlcmVuY2VkIEZpbGUgRGlhbG9nIFJlbGF0ZWQgTWVzc2FnZQotIwotX1VJX1JFRl9GSUxFX0VSUk9SX0RFU0NSSVBUSU9OICAgICAgPSBUaGUgZXJyb3JzIGJlbG93IHdlcmUgZGV0ZWN0ZWQgd2hlbiB2YWxpZGF0aW5nIHRoZSBmaWxlICJ7MH0iIHZpYSB0aGUgZmlsZSAiezF9Ii4gIEluIG1vc3QgY2FzZXMgdGhlc2UgZXJyb3JzIGNhbiBiZSBkZXRlY3RlZCBieSB2YWxpZGF0aW5nICJ7Mn0iIGRpcmVjdGx5LiAgSG93ZXZlciBpdCBpcyBwb3NzaWJsZSB0aGF0IGVycm9ycyB3aWxsIG9ubHkgb2NjdXIgd2hlbiB7Mn0gaXMgdmFsaWRhdGVkIGluIHRoZSBjb250ZXh0IG9mIHszfS4KLV9VSV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFICAgICAgICAgID0gUmVmZXJlbmNlZCBmaWxlIGNvbnRhaW5zIGVycm9ycyAoezB9KS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCByaWdodCBjbGljayBvbiB0aGUgbWVzc2FnZSBhbmQgc2VsZWN0ICJTaG93IERldGFpbHMuLi4iCi1fVUlfUkVGX0ZJTEVfRVJST1JfREVUQUlMUyAgICAgICAgICA9IFJlZmVyZW5jZWQgRmlsZSBFcnJvciBEZXRhaWxzCi0KLV9VSV9ERVRBSUxTX0lORk9STUFUSU9OX1VOQVZBSUxBQkxFICAgICAgID0gRGV0YWlscyBJbmZvcm1hdGlvbiBVbmF2YWlsYWJsZQotX1VJX0RFVEFJTFNfSU5GT19SRVZBTElEQVRFX1RPX1JFR0VORVJBVEUgPSBEZXRhaWxzIGluZm9ybWF0aW9uIGN1cnJlbnRseSB1bmF2YWlsYWJsZS4gIFBsZWFzZSByZXZhbGlkYXRlIHRoZSBmaWxlIHRvIHJlZ2VuZXJhdGUgdGhlIGVycm9yIGRldGFpbHMuCi0KLSMKLSMgRGlydHkgRmlsZSBEaWFsb2cgUmVsYXRlZCBNZXNzYWdlcwotIwotVGFza0xpc3RUYWJsZVZpZXdlcl8wPURlc2NyaXB0aW9uCi1UYXNrTGlzdFRhYmxlVmlld2VyXzE9UmVzb3VyY2UKLVRhc2tMaXN0VGFibGVWaWV3ZXJfMj1Mb2NhdGlvbgotVGFza0xpc3RUYWJsZVZpZXdlcl8zPWxpbmUgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDgwOWM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklPdmVyd3JpdGVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5JbXBvcnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuWmlwRmlsZVN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24gaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCi0JcHJpdmF0ZSBJUmVzb3VyY2UgZWxlbWVudFRvT3BlbjsKLQotCXByaXZhdGUgSU92ZXJ3cml0ZVF1ZXJ5IG92ZXJ3cml0ZVF1ZXJ5OwotCi0JcHJpdmF0ZSBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZVtdIHBhZ2VzOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbihFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZVtdIG15UGFnZXMsIElPdmVyd3JpdGVRdWVyeSBteU92ZXJ3cml0ZVF1ZXJ5KSB7Ci0JCWVsZW1lbnRUb09wZW4gPSBudWxsOwotCQlwYWdlcyA9IG15UGFnZXM7Ci0JCW92ZXJ3cml0ZVF1ZXJ5ID0gbXlPdmVyd3JpdGVRdWVyeTsKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0IGNvbmZpZ05ld1Byb2plY3QoSVdvcmtzcGFjZVJvb3Qgcm9vdCwgU3RyaW5nIG5hbWUsIFN0cmluZ1tdIG5hdHVyZUlkcywgSVByb2plY3RbXSByZWZlcmVuY2VkUHJvamVjdHMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQl0cnkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChuYW1lKTsKLQkJCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJCXByb2plY3QuY3JlYXRlKG51bGwpOwotCQkJfQotCQkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJcHJvamVjdC5vcGVuKG51bGwpOwotCQkJfQotCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJZGVzYy5zZXRMb2NhdGlvbihudWxsKTsKLQkJCWRlc2Muc2V0TmF0dXJlSWRzKG5hdHVyZUlkcyk7Ci0JCQlkZXNjLnNldFJlZmVyZW5jZWRQcm9qZWN0cyhyZWZlcmVuY2VkUHJvamVjdHMpOwotCi0JCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2MsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCi0JCQlyZXR1cm4gcHJvamVjdDsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVQcm9qZWN0KElXb3Jrc3BhY2VSb290IHJvb3QsIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlIHBhZ2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRlc2MgPSBwYWdlLmdldENvbmZpZ3VyYXRpb25FbGVtZW50KCk7Ci0KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gaW1wb3J0cyA9IGRlc2MuZ2V0Q2hpbGRyZW4oImltcG9ydCIpOyAvLyROT04tTkxTLTEkCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIG5hdHVyZXMgPSBkZXNjLmdldENoaWxkcmVuKCJuYXR1cmUiKTsgLy8kTk9OLU5MUy0xJAotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSByZWZlcmVuY2VzID0gZGVzYy5nZXRDaGlsZHJlbigicmVmZXJlbmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCWludCBuSW1wb3J0cyA9IChpbXBvcnRzID09IG51bGwpID8gMCA6IGltcG9ydHMubGVuZ3RoOwotCQlpbnQgbk5hdHVyZXMgPSAobmF0dXJlcyA9PSBudWxsKSA/IDAgOiBuYXR1cmVzLmxlbmd0aDsKLQkJaW50IG5SZWZlcmVuY2VzID0gKHJlZmVyZW5jZXMgPT0gbnVsbCkgPyAwIDogcmVmZXJlbmNlcy5sZW5ndGg7Ci0KLQkJbW9uaXRvci5iZWdpblRhc2soWE1MV2l6YXJkc01lc3NhZ2VzLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25fb3BfZGVzY19wcm9qLCBuSW1wb3J0cyArIDEpOwotCi0JCVN0cmluZyBuYW1lID0gcGFnZS5nZXRQcm9qZWN0TmFtZSgpOwotCi0JCVN0cmluZ1tdIG5hdHVyZUlkcyA9IG5ldyBTdHJpbmdbbk5hdHVyZXNdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5OYXR1cmVzOyBpKyspIHsKLQkJCW5hdHVyZUlkc1tpXSA9IG5hdHVyZXNbaV0uZ2V0QXR0cmlidXRlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSVByb2plY3RbXSByZWZlcmVuY2VkUHJvamVjdHMgPSBuZXcgSVByb2plY3RbblJlZmVyZW5jZXNdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5SZWZlcmVuY2VzOyBpKyspIHsKLQkJCXJlZmVyZW5jZWRQcm9qZWN0c1tpXSA9IHJvb3QuZ2V0UHJvamVjdChyZWZlcmVuY2VzW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUlQcm9qZWN0IHByb2ogPSBjb25maWdOZXdQcm9qZWN0KHJvb3QsIG5hbWUsIG5hdHVyZUlkcywgcmVmZXJlbmNlZFByb2plY3RzLCBtb25pdG9yKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5JbXBvcnRzOyBpKyspIHsKLQkJCWRvSW1wb3J0cyhwcm9qLCBpbXBvcnRzW2ldLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJfQotCi0JCVN0cmluZyBvcGVuID0gZGVzYy5nZXRBdHRyaWJ1dGUoIm9wZW4iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoKG9wZW4gIT0gbnVsbCkgJiYgKG9wZW4ubGVuZ3RoKCkgPiAwKSkgewotCQkJSVJlc291cmNlIGZpbGVUb09wZW4gPSBwcm9qLmZpbmRNZW1iZXIobmV3IFBhdGgob3BlbikpOwotCQkJaWYgKGZpbGVUb09wZW4gIT0gbnVsbCkgewotCQkJCWVsZW1lbnRUb09wZW4gPSBmaWxlVG9PcGVuOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9JbXBvcnRzKElQcm9qZWN0IHByb2plY3QsIElDb25maWd1cmF0aW9uRWxlbWVudCBjdXJyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBkZXN0UGF0aDsKLQkJCVN0cmluZyBuYW1lID0gY3Vyci5nZXRBdHRyaWJ1dGUoImRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKChuYW1lID09IG51bGwpIHx8IChuYW1lLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJZGVzdFBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJRm9sZGVyIGZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKG5hbWUpOwotCQkJCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCWZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQkJfQotCQkJCWRlc3RQYXRoID0gZm9sZGVyLmdldEZ1bGxQYXRoKCk7Ci0JCQl9Ci0JCQlTdHJpbmcgaW1wb3J0UGF0aCA9IGN1cnIuZ2V0QXR0cmlidXRlKCJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGltcG9ydFBhdGggPT0gbnVsbCkgewotCQkJCWltcG9ydFBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAicHJvamVjdHNldHVwIGRlc2NyaXB0b3I6IGltcG9ydCBtaXNzaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVppcEZpbGUgemlwRmlsZSA9IGdldFppcEZpbGVGcm9tUGx1Z2luRGlyKGltcG9ydFBhdGgsIGdldENvbnRyaWJ1dGluZ1BsdWdpbihjdXJyKSk7Ci0JCQlpbXBvcnRGaWxlc0Zyb21aaXAoemlwRmlsZSwgZGVzdFBhdGgsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q29udHJpYnV0aW5nUGx1Z2luKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCkgewotCQlPYmplY3QgcGFyZW50ID0gY29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElFeHRlbnNpb24pIHsKLQkJCQlyZXR1cm4gKChJRXh0ZW5zaW9uKSBwYXJlbnQpLmdldE5hbWVzcGFjZSgpOwotCQkJfQotCQkJcGFyZW50ID0gKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIHBhcmVudCkuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZSBnZXRFbGVtZW50VG9PcGVuKCkgewotCQlyZXR1cm4gZWxlbWVudFRvT3BlbjsKLQl9Ci0KLQlwcml2YXRlIFppcEZpbGUgZ2V0WmlwRmlsZUZyb21QbHVnaW5EaXIoU3RyaW5nIHBsdWdpblJlbGF0aXZlUGF0aCwgU3RyaW5nIHN5bWJvbGljTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShzeW1ib2xpY05hbWUpOwotCQkJVVJMIHN0YXJ0ZXJVUkwgPSBuZXcgVVJMKGJ1bmRsZS5nZXRFbnRyeSgiLyIpLCBwbHVnaW5SZWxhdGl2ZVBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IFppcEZpbGUoUGxhdGZvcm0uYXNMb2NhbFVSTChzdGFydGVyVVJMKS5nZXRGaWxlKCkpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IHBsdWdpblJlbGF0aXZlUGF0aCArICI6ICIgKyBlLmdldE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgWE1MVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbXBvcnRGaWxlc0Zyb21aaXAoWmlwRmlsZSBzcmNaaXBGaWxlLCBJUGF0aCBkZXN0UGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIgPSBuZXcgWmlwRmlsZVN0cnVjdHVyZVByb3ZpZGVyKHNyY1ppcEZpbGUpOwotCQlJbXBvcnRPcGVyYXRpb24gb3AgPSBuZXcgSW1wb3J0T3BlcmF0aW9uKGRlc3RQYXRoLCBzdHJ1Y3R1cmVQcm92aWRlci5nZXRSb290KCksIHN0cnVjdHVyZVByb3ZpZGVyLCBvdmVyd3JpdGVRdWVyeSk7Ci0JCW9wLnJ1bihtb25pdG9yKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJ1bm5hYmxlV2l0aFByb2dyZXNzI3J1bihJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCXRyeSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhYTUxXaXphcmRzTWVzc2FnZXMuRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbl9vcF9kZXNjLCBwYWdlcy5sZW5ndGgpOwotCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQljcmVhdGVQcm9qZWN0KHJvb3QsIHBhZ2VzW2ldLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2OGM5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5RGVsZWdhdGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklPdmVyd3JpdGVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld1Jlc291cmNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCwgSUV4ZWN1dGFibGVFeHRlbnNpb24gewotCi0JcHJpdmF0ZSBjbGFzcyBJbXBvcnRPdmVyd3JpdGVRdWVyeSBpbXBsZW1lbnRzIElPdmVyd3JpdGVRdWVyeSB7Ci0KLQkJcHJpdmF0ZSBpbnQgb3BlbkRpYWxvZyhmaW5hbCBTdHJpbmcgZmlsZSkgewotCQkJZmluYWwgaW50W10gcmVzdWx0ID0ge0lEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEfTsKLQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX292ZXJ3cml0ZXF1ZXJ5X3RpdGxlOwotCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoWE1MV2l6YXJkc01lc3NhZ2VzLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3ZlcndyaXRlcXVlcnlfbWVzc2FnZSwgZmlsZSk7Ci0JCQkJCVN0cmluZ1tdIG9wdGlvbnMgPSB7SURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwsIElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUx9OwotCQkJCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldFNoZWxsKCksIHRpdGxlLCBudWxsLCBtc2csIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sIG9wdGlvbnMsIDApOwotCQkJCQlyZXN1bHRbMF0gPSBkaWFsb2cub3BlbigpOwotCQkJCX0KLQkJCX0pOwotCQkJcmV0dXJuIHJlc3VsdFswXTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgcXVlcnlPdmVyd3JpdGUoU3RyaW5nIGZpbGUpIHsKLQkJCVN0cmluZ1tdIHJldHVybkNvZGVzID0ge1lFUywgTk8sIEFMTCwgQ0FOQ0VMfTsKLQkJCWludCByZXR1cm5WYWwgPSBvcGVuRGlhbG9nKGZpbGUpOwotCQkJcmV0dXJuIHJldHVyblZhbCA8IDAgPyBDQU5DRUwgOiByZXR1cm5Db2Rlc1tyZXR1cm5WYWxdOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgd2l6YXJkQ29uZmlnRWxlbWVudDsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBleGFtcGxlQ29uZmlnRWxlbWVudDsKLQotCXByaXZhdGUgU3RyaW5nIEVYQU1QTEVfV0laQVJEX1hQX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuZXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2VbXSBwYWdlczsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIFdFQl9CUk9XU0VSX0lEID0gIm9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuZWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldERpYWxvZ1NldHRpbmdzKFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpKTsKLQkJc2V0V2luZG93VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfdGl0bGUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgV2l6YXJkI2FkZFBhZ2VzCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXN1cGVyLmFkZFBhZ2VzKCk7Ci0KLQkJaWYgKGV4YW1wbGVDb25maWdFbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGV4YW1wbGVDb25maWdFbGVtZW50LmdldENoaWxkcmVuKCJwcm9qZWN0c2V0dXAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoKGNoaWxkcmVuID09IG51bGwpIHx8IChjaGlsZHJlbi5sZW5ndGggPT0gMCkpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiZGVzY3JpcHRvciBtdXN0IGNvbnRhaW4gb25lIG9yZSBtb3JlIHByb2plY3RzZXR1cCB0YWdzIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXBhZ2VzID0gbmV3IEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlW2NoaWxkcmVuLmxlbmd0aF07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJcGFnZXNbaV0gPSBuZXcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UoaSwgY2hpbGRyZW5baV0pOwotCQkJYWRkUGFnZShwYWdlc1tpXSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uKSB7Ci0JCWlmIChleGFtcGxlQ29uZmlnRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgYmFubmVyID0gZXhhbXBsZUNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJiYW5uZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGJhbm5lciAhPSBudWxsKSB7Ci0JCQkJVVJMIGltYWdlVVJMID0gUGxhdGZvcm0uZmluZChQbGF0Zm9ybS5nZXRCdW5kbGUoZXhhbXBsZUNvbmZpZ0VsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCkpLCBuZXcgUGF0aChiYW5uZXIpKTsKLQkJCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGltYWdlVVJMKTsKLQkJCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRFeHRlbmRlZENvbmZpZ3VyYXRpb25FbGVtZW50cygpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4YW1wbGVXaXphcmRYUCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KEVYQU1QTEVfV0laQVJEX1hQX0lEKTsKLQkJaWYgKGV4YW1wbGVXaXphcmRYUCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElDb25maWd1cmF0aW9uRWxlbWVudFswXTsKLQkJfQotCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4YW1wbGVXaXphcmRYUC5nZXRFeHRlbnNpb24oZ2V0V2l6YXJkRXh0ZW5zaW9uSWQoKSk7Ci0JCWlmIChleHRlbnNpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJfQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBleGFtcGxlV2l6YXJkQ0VzID0gZXhhbXBsZVdpemFyZFhQLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQlyZXR1cm4gZXhhbXBsZVdpemFyZENFczsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSB0YXJnZXQpIHsKLQkJU3RyaW5nIHRpdGxlID0gWE1MV2l6YXJkc01lc3NhZ2VzLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3BfZXJyb3JfdGl0bGU7Ci0JCVN0cmluZyBtZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3BfZXJyb3JfbWVzc2FnZTsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKSB0YXJnZXQpLmdldFN0YXR1cygpOwotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlLCBzdGF0dXMpOwotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihzdGF0dXMuZ2V0TWVzc2FnZSgpLCBzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgdGl0bGUsIHRhcmdldC5nZXRNZXNzYWdlKCkpOwotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbih0YXJnZXQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5SZXNvdXJjZShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmluYWwgSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpOwotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlERS5vcGVuRWRpdG9yKGFjdGl2ZVBhZ2UsIChJRmlsZSkgcmVzb3VyY2UsIFdFQl9CUk9XU0VSX0lELCB0cnVlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJQmFzaWNOZXdSZXNvdXJjZVdpemFyZC5zZWxlY3RBbmRSZXZlYWwocmVzb3VyY2UsIGFjdGl2ZVBhZ2UuZ2V0V29ya2JlbmNoV2luZG93KCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFdpemFyZCNwZXJmb3JtRmluaXNoCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbiBydW5uYWJsZSA9IG5ldyBFeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uKHBhZ2VzLCBuZXcgSW1wb3J0T3ZlcndyaXRlUXVlcnkoKSk7Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeURlbGVnYXRpbmdPcGVyYXRpb24ocnVubmFibGUpOwotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKGZhbHNlLCB0cnVlLCBvcCk7Ci0JCX0KLQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQudXBkYXRlUGVyc3BlY3RpdmUod2l6YXJkQ29uZmlnRWxlbWVudCk7Ci0JCUlSZXNvdXJjZSByZXMgPSBydW5uYWJsZS5nZXRFbGVtZW50VG9PcGVuKCk7Ci0JCWlmIChyZXMgIT0gbnVsbCkgewotCQkJb3BlblJlc291cmNlKHJlcyk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU3RvcmVzIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgZm9yIHRoZSB3aXphcmQuIFRoZSBjb25maWcgZWxlbWVudAotCSAqIHdpbGwgYmUgdXNlZCBpbiA8Y29kZT5wZXJmb3JtRmluaXNoPC9jb2RlPiB0byBzZXQgdGhlIHJlc3VsdAotCSAqIHBlcnNwZWN0aXZlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxpemF0aW9uRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2ZpZywgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGRhdGEpIHsKLQkJd2l6YXJkQ29uZmlnRWxlbWVudCA9IGNmaWc7Ci0JCVN0cmluZyB0aXRsZSA9IHdpemFyZENvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRpdGxlICE9IG51bGwpIHsKLQkJCXNldFdpbmRvd1RpdGxlKHRpdGxlKTsKLQkJfQotCQlTdHJpbmcgd2l6YXJkSWQgPSBnZXRXaXphcmRFeHRlbnNpb25JZCgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBleGFtcGxlV2l6YXJkQ0VzID0gZ2V0RXh0ZW5kZWRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGFtcGxlV2l6YXJkQ0VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGV4YW1wbGVXaXphcmRDRXNbaV07Ci0JCQlTdHJpbmcgZXh0V2l6YXJkSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCh3aXphcmRJZCAhPSBudWxsKSAmJiAoZXh0V2l6YXJkSWQgIT0gbnVsbCkgJiYgd2l6YXJkSWQuZXF1YWxzKGV4dFdpemFyZElkKSkgewotCQkJCWV4YW1wbGVDb25maWdFbGVtZW50ID0gZWxlbWVudDsKLQkJCX0KLQkJfQotCQkvLyBpbml0aWFsaXplRGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZEV4dGVuc2lvbklkKCkgewotCQlyZXR1cm4gd2l6YXJkQ29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YxM2IzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZTsKLQotcHVibGljIGNsYXNzIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZSB7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudDsKLQotCXB1YmxpYyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZShpbnQgcGFnZU51bWJlciwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0pIHsKLQotCQlzdXBlcigicGFnZSIgKyBwYWdlTnVtYmVyKTsgLy8kTk9OLU5MUy0xJAotCQljb25maWd1cmF0aW9uRWxlbWVudCA9IGVsZW07Ci0KLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoZWxlbSwgIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbml0aWFsUHJvamVjdE5hbWUoY2FsY3VsYXRlSW5pdGlhbFByb2plY3ROYW1lKG5hbWUpKTsKLQotCQlzZXREZXNjcmlwdGlvbihnZXRBdHRyaWJ1dGUoY29uZmlndXJhdGlvbkVsZW1lbnQsICJwYWdlZGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VGl0bGUoZ2V0QXR0cmlidXRlKGNvbmZpZ3VyYXRpb25FbGVtZW50LCAicGFnZXRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQkvKgotCSAqIFNldCB0aGUgZGVmYXVsdCBwcm9qZWN0IG5hbWUgdGhhdCBpcyB0byBhcHBlYXIgb24gdGhlIGluaXRpYWxQYWdlIHBhZ2UKLQkgKiBvZiB0aGlzIHdpemFyZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNhbGN1bGF0ZUluaXRpYWxQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJSVByb2plY3QgcHJvamVjdEhhbmRsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCWlmICghcHJvamVjdEhhbmRsZS5leGlzdHMoKSkgewotCQkJcmV0dXJuIHByb2plY3ROYW1lOwotCQl9Ci0JCS8vIENoYW5nZSB0aGUgbmFtZSB1bnRpbCBpdCBkb2Vzbid0IGV4aXN0cy4gVHJ5IDkgdGltZXMgYW5kIHRoZW4KLQkJLy8gZ2l2ZSB1cC4KLQkJZm9yIChpbnQgaSA9IDE7IGkgPCAxMDsgaSsrKSB7Ci0JCQlwcm9qZWN0SGFuZGxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lICsgaSk7Ci0JCQlpZiAoIXByb2plY3RIYW5kbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gcHJvamVjdE5hbWUgKyBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9qZWN0TmFtZSArICI5IjsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0cmlidXRlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtLCBTdHJpbmcgdGFnKSB7Ci0JCVN0cmluZyByZXMgPSBlbGVtLmdldEF0dHJpYnV0ZSh0YWcpOwotCQlpZiAocmVzID09IG51bGwpIHsKLQkJCXJldHVybiAnIScgKyB0YWcgKyAnISc7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IG9mIHRoaXMgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBJQ29uZmlndXJhdGlvbkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkgewotCQlyZXR1cm4gY29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2UjdmFsaWRhdGVQYWdlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCWlmICghc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IGdldFByb2plY3ROYW1lKCk7Ci0JCWlmIChwcm9qZWN0TmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJV2l6YXJkIHdpemFyZCA9IGdldFdpemFyZCgpOwotCQlpZiAod2l6YXJkIGluc3RhbmNlb2YgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCkgewotCQkJSVdpemFyZFBhZ2VbXSBwYWdlcyA9IHdpemFyZC5nZXRQYWdlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICgocGFnZXNbaV0gIT0gdGhpcykgJiYgKHBhZ2VzW2ldIGluc3RhbmNlb2YgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UpKSB7Ci0JCQkJCWlmIChwcm9qZWN0TmFtZS5lcXVhbHMoKChFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZSkgcGFnZXNbaV0pLmdldFByb2plY3ROYW1lKCkpKSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoWE1MV2l6YXJkc01lc3NhZ2VzLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlX2Vycm9yX2FscmVhZHlleGlzdHMpOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9FeHBvcnRYTUxDYXRhbG9nV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4cG9ydFhNTENhdGFsb2dXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc4ZDQ1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4cG9ydFhNTENhdGFsb2dXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIChTVEFSKSBhbmQKLSAqIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyL1NUQVIgLSBkY2FydmVyQHN0YXJzdGFuZGFyZC5vcmcvZF9hX2NhcnZlckB5YWhvby5jb20gLSBidWcgMTkyNTY4Ci0gKiAgICAgICAgICAgIEluaXRpYWwgQVBJIC0gVGhpcyBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZQotICogICAgICAgICAgICBvbGQgRXhwb3J0IERpYWxvZyBmb3IgdGhlIFhNTCBDYXRhbG9nLiAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ld3Jlc291cmNlLkJhc2ljTmV3RmlsZVJlc291cmNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2dTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLQotcHVibGljIGNsYXNzIEV4cG9ydFhNTENhdGFsb2dXaXphcmQgZXh0ZW5kcyBCYXNpY05ld0ZpbGVSZXNvdXJjZVdpemFyZCBpbXBsZW1lbnRzIElFeHBvcnRXaXphcmQgewotCi0JcHJvdGVjdGVkIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgZXhwb3J0UGFnZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZyA9IG51bGw7Ci0JcHJvdGVjdGVkIElDYXRhbG9nIHVzZXJDYXRhbG9nID0gbnVsbDsKLQkKLQlwdWJsaWMgRXhwb3J0WE1MQ2F0YWxvZ1dpemFyZCgpIHsKLQkJc2V0V2luZG93VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9ESUFMT0dfWE1MQ0FUQUxPR19FWFBPUlRfVElUTEUpOwotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfV0laQkFOX0dFTkVSQVRFWE1MKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCUlDYXRhbG9nIGRlZmF1bHRDYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gZGVmYXVsdENhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTmV4dENhdGFsb2cgY2F0YWxvZyA9IG5leHRDYXRhbG9nc1tpXTsKLQkJCUlDYXRhbG9nIHJlZmVyZW5jZWRDYXRhbG9nID0gY2F0YWxvZy5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCQkJaWYgKHJlZmVyZW5jZWRDYXRhbG9nICE9IG51bGwpIHsKLQkJCQlpZiAoWE1MQ29yZVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKSB7Ci0JCQkJCXVzZXJDYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUNhdGFsb2dTZXQgdGVtcENhdGFsb2dTZXQgPSBuZXcgQ2F0YWxvZ1NldCgpOwotCQl3b3JraW5nVXNlckNhdGFsb2cgPSB0ZW1wQ2F0YWxvZ1NldC5sb29rdXBPckNyZWF0ZUNhdGFsb2coIndvcmtpbmciLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl3b3JraW5nVXNlckNhdGFsb2cuYWRkRW50cmllc0Zyb21DYXRhbG9nKHVzZXJDYXRhbG9nKTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gd29ya3NwYWNlLmdldFJvb3QoKTsKLQkJU3RyaW5nIHdvcmtzcGFjZVBhdGggPSB3b3Jrc3BhY2VSb290LmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQlTdHJpbmcgZnVsbFBhdGggPSB3b3Jrc3BhY2VQYXRoICsgZXhwb3J0UGFnZS5nZXRDb250YWluZXJGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKTsKLQkJU3RyaW5nIHJlcXVpcmVkU3RyaW5nPWZ1bGxQYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBleHBvcnRQYWdlLmdldEZpbGVOYW1lKCk7Ci0JCXRyeSB7Ci0JCQlJRmlsZSBmaWxlID0gZXhwb3J0UGFnZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCQl3b3JraW5nVXNlckNhdGFsb2cuc2V0TG9jYXRpb24ocmVxdWlyZWRTdHJpbmcpOwotCQkJd29ya2luZ1VzZXJDYXRhbG9nLnNhdmUoKTsKLQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlleHBvcnRQYWdlID0gbmV3IFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UoIlhNTCBDYXRhbG9nIEV4cG9ydCIsICBnZXRTZWxlY3Rpb24oKSk7Ci0JCWV4cG9ydFBhZ2Uuc2V0VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9ESUFMT0dfWE1MQ0FUQUxPR19FWFBPUlRfVElUTEUpOwotCQlleHBvcnRQYWdlLnNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfRElBTE9HX1hNTENBVEFMT0dfRVhQT1JUX0RFU0NSSVBUSU9OKTsKLQkJZXhwb3J0UGFnZS5zZXRGaWxlRXh0ZW5zaW9uKCJ4bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJYWRkUGFnZShleHBvcnRQYWdlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbikgewotCQlzdXBlci5pbml0KHdvcmtiZW5jaCwgY3VycmVudFNlbGVjdGlvbik7Ci0JCXNldFdpbmRvd1RpdGxlKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfRElBTE9HX1hNTENBVEFMT0dfRVhQT1JUX1RJVExFKTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX1dJWkJBTl9HRU5FUkFURVhNTCk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0lYTUxXaXphcmRIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzQyZWZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIHhtbCB3aXphcmQuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkLgotICogPC9wPgotICovCi1pbnRlcmZhY2UgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzIHsKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IFhNTFVJUGx1Z2luLklEICsgIi4iOyAvLyROT04tTkxTLTEkCi0JLy8gQ3JlYXRlIFhNTCBmaWxlIGZyb20gYSBEVEQgZmlsZSByYWRpbwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfQ1JFQVRFWE1MMV9IRUxQSUQgPSBQUkVGSVggKyAieG1sYzAxMDEiOyAvLyROT04tTkxTLTEkCi0JLy8gQ3JlYXRlIFhNTCBmaWxlIGZyb20gYW4gWE1MIHNjaGVtYSBmaWxlIHJhZGlvIGJ1dHRvbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfQ1JFQVRFWE1MMl9IRUxQSUQgPSBQUkVGSVggKyAieG1sYzAxMDIiOyAvLyROT04tTkxTLTEkCi0JLy8gQ3JlYXRlIFhNTCBmaWxlIGZyb20gc2NyYXRjaCByYWRpbyBidXR0b24KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkVXV0laQVJEX0NSRUFURVhNTDNfSEVMUElEID0gUFJFRklYICsgInhtbGMwMTAzIjsgLy8kTk9OLU5MUy0xJAotCS8vIFNlbGVjdCBTb3VyY2UgZmlsZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX05FV1dJWkFSRF9TRUxFQ1RTT1VSQ0VfSEVMUElEID0gUFJFRklYICsgInhtbGMwNTAwIjsgLy8kTk9OLU5MUy0xJAotCS8vIFJvb3QgZWxlbWVudCBmb3IgYm90aCBEVEQgYW5kIFhNTCBzY2hlbWEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkVXV0laQVJEX1NFTEVDVFJPT1RFTEVNRU5UX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDQxMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBDcmVhdGUgT3B0aW9uYWwgQXR0cmlidXRlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQxX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDQ0MSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBDcmVhdGUgT3B0aW9uYWwgRWxlbWVudHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkVXV0laQVJEX1NFTEVDVFJPT1RFTEVNRU5UMl9IRUxQSUQgPSBQUkVGSVggKyAieG1sYzA0NDIiOyAvLyROT04tTkxTLTEkCi0JLy8gQ3JlYXRlIGZpcnN0IGNob2ljZSBvZiByZXF1aXJlZCBjaG9pY2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkVXV0laQVJEX1NFTEVDVFJPT1RFTEVNRU5UM19IRUxQSUQgPSBQUkVGSVggKyAieG1sYzA0NDMiOyAvLyROT04tTkxTLTEkCi0JLy8gRmlsbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlIHdpdGggZGF0YQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQ0X0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDQ0NCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBTeXN0ZW0gSUQgZm9yIERURAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQ1X0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDIxMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBQdWJsaWMgSUQgZm9yIERURAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQ2X0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDIyMCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvSW1wb3J0WE1MQ2F0YWxvZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvSW1wb3J0WE1MQ2F0YWxvZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhlMzQ0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0ltcG9ydFhNTENhdGFsb2dQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCAoU1RBUikgYW5kCi0gKiBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlci9TVEFSIC0gZGNhcnZlckBzdGFyc3RhbmRhcmQub3JnL2RfYV9jYXJ2ZXJAeWFob28uY29tIC0gYnVnIDE5MjU2OAotICogICAgICAgICAgICBJbml0aWFsIEFQSSAtIFRoaXMgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUKLSAqICAgICAgICAgICAgb2xkIEltcG9ydCBEaWFsb2cgZm9yIHRoZSBYTUwgQ2F0YWxvZy4gCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5TZWxlY3RTaW5nbGVGaWxlVmlldzsKLQotcHVibGljIGNsYXNzIEltcG9ydFhNTENhdGFsb2dQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0U2luZ2xlRmlsZVZpZXcgc2VsZWN0U2luZ2xlRmlsZVZpZXc7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQkKLQotCXB1YmxpYyBJbXBvcnRYTUxDYXRhbG9nUGFnZSgpIHsKLQkJc3VwZXIoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9ESUFMT0dfWE1MQ0FUQUxPR19JTVBPUlRfVElUTEUpOwotCQlzZXRUaXRsZShYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0RJQUxPR19YTUxDQVRBTE9HX0lNUE9SVF9USVRMRSk7Ci0JCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3ID0gbmV3IFNlbGVjdFNpbmdsZUZpbGVWaWV3KHNlbGVjdGlvbiwgZmFsc2UpIHsKLQkJCXB1YmxpYyB2b2lkIGNyZWF0ZUZpbHRlckNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJCUltcG9ydFhNTENhdGFsb2dQYWdlLnRoaXMuY3JlYXRlRmlsdGVyQ29udHJvbChjb21wb3NpdGUpOwotCQkJfQotCQl9OwotCi0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC53aWR0aEhpbnQgPSAzNTA7Ci0JCWdkLmhlaWdodEhpbnQgPSAzNTA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJU3RyaW5nW10gZXh0ZW5zaW9ucyA9IHsgIi54bWxjYXRhbG9nIiwgIi54bWwiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5hZGRGaWx0ZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5jcmVhdGVDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3LnNldFZpc2libGVIZWxwZXIodHJ1ZSk7Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3LmFkZFNlbGVjdGlvbkNoYW5nZWRUcmVlTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSW1wb3J0WE1MQ2F0YWxvZ1BhZ2UudGhpcy5zZXRQYWdlQ29tcGxldGUoc2VsZWN0U2luZ2xlRmlsZVZpZXcuZ2V0RmlsZSgpICE9IG51bGwpOwotCQkJfQotCQl9KTsKLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUZpbHRlckNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gc2VsZWN0U2luZ2xlRmlsZVZpZXcuZ2V0RmlsZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvSW1wb3J0WE1MQ2F0YWxvZ1dpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9JbXBvcnRYTUxDYXRhbG9nV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMjAwYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9JbXBvcnRYTUxDYXRhbG9nV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCAoU1RBUikgYW5kCi0gKiBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlci9TVEFSIC0gZGNhcnZlckBzdGFyc3RhbmRhcmQub3JnL2RfYV9jYXJ2ZXJAeWFob28uY29tIC0gYnVnIDE5MjU2OAotICogICAgICAgICAgICBJbml0aWFsIEFQSSAtIFRoaXMgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUKLSAqICAgICAgICAgICAgb2xkIEltcG9ydCBEaWFsb2cgZm9yIHRoZSBYTUwgQ2F0YWxvZy4gCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuQ2F0YWxvZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nLlhNTENhdGFsb2dNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRYTUxDYXRhbG9nV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlwcm90ZWN0ZWQgSW1wb3J0WE1MQ2F0YWxvZ1BhZ2UgaW1wb3J0UGFnZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZyA9IG51bGw7Ci0JcHJvdGVjdGVkIElDYXRhbG9nIHVzZXJDYXRhbG9nID0gbnVsbDsKLQkKLQlwdWJsaWMgSW1wb3J0WE1MQ2F0YWxvZ1dpemFyZCgpIHsKLQkJc2V0V2luZG93VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9ESUFMT0dfWE1MQ0FUQUxPR19JTVBPUlRfVElUTEUpOwotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfV0laQkFOX0dFTkVSQVRFWE1MKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCUlDYXRhbG9nIGRlZmF1bHRDYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gZGVmYXVsdENhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTmV4dENhdGFsb2cgY2F0YWxvZyA9IG5leHRDYXRhbG9nc1tpXTsKLQkJCUlDYXRhbG9nIHJlZmVyZW5jZWRDYXRhbG9nID0gY2F0YWxvZy5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCQkJaWYgKHJlZmVyZW5jZWRDYXRhbG9nICE9IG51bGwpIHsKLQkJCQlpZiAoWE1MQ29yZVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKSB7Ci0JCQkJCXVzZXJDYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQ2F0YWxvZ1NldCB0ZW1wQ2F0YWxvZ1NldCA9IG5ldyBDYXRhbG9nU2V0KCk7Ci0JCXdvcmtpbmdVc2VyQ2F0YWxvZyA9IHRlbXBDYXRhbG9nU2V0Lmxvb2t1cE9yQ3JlYXRlQ2F0YWxvZygid29ya2luZyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXdvcmtpbmdVc2VyQ2F0YWxvZy5hZGRFbnRyaWVzRnJvbUNhdGFsb2codXNlckNhdGFsb2cpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCXJldHVybiBpbXBvcnRQYWdlLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJSUZpbGUgZmlsZSA9IGltcG9ydFBhZ2UuZ2V0RmlsZSgpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkudG9VUkkoKS50b1N0cmluZygpOwotCQkJdHJ5IHsKLQkJCQlDYXRhbG9nU2V0IHRlbXBSZXNvdXJjZVNldCA9IG5ldyBDYXRhbG9nU2V0KCk7Ci0JCQkJSUNhdGFsb2cgbmV3Q2F0YWxvZyA9IHRlbXBSZXNvdXJjZVNldC5sb29rdXBPckNyZWF0ZUNhdGFsb2coInRlbXAiLCBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJCQl3b3JraW5nVXNlckNhdGFsb2cuYWRkRW50cmllc0Zyb21DYXRhbG9nKG5ld0NhdGFsb2cpOwotCQkJCXVzZXJDYXRhbG9nLmNsZWFyKCk7Ci0JCQkJdXNlckNhdGFsb2cuYWRkRW50cmllc0Zyb21DYXRhbG9nKHdvcmtpbmdVc2VyQ2F0YWxvZyk7Ci0JCQkJdXNlckNhdGFsb2cuc2F2ZSgpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlpbXBvcnRQYWdlID0gbmV3IEltcG9ydFhNTENhdGFsb2dQYWdlKCk7Ci0JCWltcG9ydFBhZ2Uuc2V0VGl0bGUoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfSEVBRElORyk7Ci0JCWltcG9ydFBhZ2Uuc2V0RGVzY3JpcHRpb24oWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9ESUFMT0dfWE1MQ0FUQUxPR19JTVBPUlRfREVTQ1JJUFRJT04pOwotCQlpbXBvcnRQYWdlLnNldE1lc3NhZ2UoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfTUVTU0FHRSk7Ci0JCWFkZFBhZ2UoaW1wb3J0UGFnZSk7Ci0JCWltcG9ydFBhZ2Uuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OYW1lc3BhY2VJbmZvQ29udGVudEJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmFtZXNwYWNlSW5mb0NvbnRlbnRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZWVkODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OYW1lc3BhY2VJbmZvQ29udGVudEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5Db250ZW50QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZUluZm9Db250ZW50QnVpbGRlciBleHRlbmRzIENvbnRlbnRCdWlsZGVyIHsKLQlwcm90ZWN0ZWQgaW50IGNvdW50ID0gMTsKLQlwdWJsaWMgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotCXByb3RlY3RlZCBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwdWJsaWMgTmFtZXNwYWNlSW5mb0NvbnRlbnRCdWlsZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpIHsKLQkJaWYgKGVkLmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZGVmaW5pdGlvbkluZm8iKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCXN1cGVyLnZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oZWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQW55RWxlbWVudE5vZGUoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpIHsKLQkJU3RyaW5nIHVyaSA9IGFueUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCWlmICgodXJpICE9IG51bGwpICYmICF1cmkuc3RhcnRzV2l0aCgiIyMiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlpZiAodGFibGUuZ2V0KHVyaSkgPT0gbnVsbCkgewotCQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0JCQkJaW5mby51cmkgPSB1cmk7Ci0JCQkJaW5mby5wcmVmaXggPSAicCIgKyBjb3VudCsrOyAvLyROT04tTkxTLTEkCi0JCQkJdGFibGUucHV0KHVyaSwgaW5mbyk7Ci0JCQkJbGlzdC5hZGQoaW5mbyk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld01vZGVsV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld01vZGVsV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNDAwZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdNb2RlbFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgkgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLQotcHVibGljIGNsYXNzIE5ld01vZGVsV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaCBmV29ya2JlbmNoOwotCXByb3RlY3RlZCBTdHJpbmcgZkN1cnJlbnREaXJlY3Rvcnk7Ci0KLQlwdWJsaWMgTmV3TW9kZWxXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuZldvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQkJdGhpcy5mU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJV2l6YXJkUGFnZSBjdXJyZW50UGFnZSA9IChXaXphcmRQYWdlKSBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpOwotCQlpZiAoY3VycmVudFBhZ2UgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3VycmVudFBhZ2UuaXNQYWdlQ29tcGxldGUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIHNob3dGaWxlRGlhbG9nCi0JICovCi0JcHVibGljIEZpbGVEaWFsb2cgc2hvd0ZpbGVEaWFsb2coU2hlbGwgc2hlbGwsIFN0cmluZyBkZWZhdWx0RGlyZWN0b3J5LCBTdHJpbmcgZGVmYXVsdEZpbGUsIFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMpIHsKLQkJRmlsZURpYWxvZyBmaWxlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLQotCQkvLyBHZXQgdGhlIGxhc3QgdmlzaXQgZGlyZWN0b3J5IGlmIHdlIGhhdmVuJ3QgZGVmaW5lZCBhIHBhcnRpY3VsYXIgb25lCi0JCS8vIGhlcmUuCi0JCWlmICgoZGVmYXVsdERpcmVjdG9yeSA9PSBudWxsKSB8fCAoZGVmYXVsdERpcmVjdG9yeS5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZGVmYXVsdERpcmVjdG9yeSA9Ci0JCQkvLyBMb2NhdGUuaW5zdGFuY2UodGhpcykuZ2V0TGFzdFNlbGVjdGVkRGlyZWN0b3J5KGdldFJlc291cmNlUGF0aCgpKTsKLQkJfQotCi0JCWlmICgoZGVmYXVsdERpcmVjdG9yeSAhPSBudWxsKSAmJiAoZGVmYXVsdERpcmVjdG9yeS5sZW5ndGgoKSAhPSAwKSkgewotCQkJZmlsZURpYWxvZy5zZXRGaWx0ZXJQYXRoKGRlZmF1bHREaXJlY3RvcnkpOwotCQl9Ci0KLQkJZmlsZURpYWxvZy5zZXRGaWxlTmFtZShkZWZhdWx0RmlsZSk7Ci0JCWZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLQotCQlmaWxlRGlhbG9nLm9wZW4oKTsKLQotCQlyZXR1cm4gZmlsZURpYWxvZzsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnREaXJlY3RvcnkoU3RyaW5nIGN1cnJlbnREaXJlY3RvcnkxKSB7Ci0JCXRoaXMuZkN1cnJlbnREaXJlY3RvcnkgPSBjdXJyZW50RGlyZWN0b3J5MTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVdvcmtiZW5jaFJlc291cmNlKElDb250YWluZXIgY29udGFpbmVyLCBTdHJpbmcgZmlsZU5hbWUpIHsKLQkJSVBhdGggcGF0aCA9IGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpOwotCQlwYXRoID0gcGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotCQlJRmlsZSBmaWxlID0gY29udGFpbmVyLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJZmlsZS5jcmVhdGUobnVsbCwgdHJ1ZSwgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gWE1MQnVpbGRlclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZSgiRW5jb3VudGVyZWQKLQkJCQkvLyBleGNlcHRpb24gY3JlYXRpbmcgZmlsZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFN0YXJ0UGFnZQotCSAqLwotCXB1YmxpYyBjbGFzcyBTdGFydFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgaW50IHNlbGVjdGVkQnV0dG9uOwotCQlwcm90ZWN0ZWQgU3RyaW5nW10gcmFkaW9CdXR0b25MYWJlbDsKLQkJcHJvdGVjdGVkIEJ1dHRvbltdIHJhZGlvQnV0dG9uOwotCi0JCXB1YmxpYyBTdGFydFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmdbXSByYWRpb0J1dHRvbkxhYmVsKSB7Ci0JCQlzdXBlcihwYWdlTmFtZSk7Ci0JCQl0aGlzLnJhZGlvQnV0dG9uTGFiZWwgPSByYWRpb0J1dHRvbkxhYmVsOwotCQkJcmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uW3JhZGlvQnV0dG9uTGFiZWwubGVuZ3RoXTsKLQkJfQotCi0JCXB1YmxpYyBCdXR0b24gZ2V0UmFkaW9CdXR0b25BdEluZGV4KGludCBpKSB7Ci0JCQlCdXR0b24gcmVzdWx0ID0gbnVsbDsKLQkJCWlmICgoaSA+PSAwKSAmJiAoaSA8IHJhZGlvQnV0dG9uLmxlbmd0aCkpIHsKLQkJCQlyZXN1bHQgPSByYWRpb0J1dHRvbltpXTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFNlbGVjdGVkUmFkaW9CdXR0b25JbmRleCgpIHsKLQkJCWludCByZXN1bHQgPSAtMTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmFkaW9CdXR0b24ubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAocmFkaW9CdXR0b25baV0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJcmVzdWx0ID0gaTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlDb21wb3NpdGUgYmFzZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQliYXNlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQkJLy8gcmFkaW8gYnV0dG9ucycgY29udGFpbmVyCi0JCQlDb21wb3NpdGUgcmFkaW9CdXR0b25zR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGJhc2UsIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQotCQkJcmFkaW9CdXR0b25zR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ2QuaGVpZ2h0SGludCA9IDMwMDsKLQkJCWdkLndpZHRoSGludCA9IDQwMDsKLQkJCXJhZGlvQnV0dG9uc0dyb3VwLnNldExheW91dERhdGEoZ2QpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJhZGlvQnV0dG9uTGFiZWwubGVuZ3RoOyBpKyspIHsKLQkJCQlyYWRpb0J1dHRvbltpXSA9IG5ldyBCdXR0b24ocmFkaW9CdXR0b25zR3JvdXAsIFNXVC5SQURJTyk7Ci0JCQkJcmFkaW9CdXR0b25baV0uc2V0VGV4dChyYWRpb0J1dHRvbkxhYmVsW2ldKTsKLQkJCQlyYWRpb0J1dHRvbltpXS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCQkvLyByYWRpb0J1dHRvbltpXS5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQkJCX0KLQkJCXNldENvbnRyb2woYmFzZSk7Ci0JCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LnR5cGUgPT0gU1dULk1vZGlmeSkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogTmV3RmlsZVBhZ2UKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTmV3RmlsZVBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIHsKLQkJcHVibGljIFN0cmluZyBkZWZhdWx0TmFtZSA9ICJOZXdGaWxlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRGaWxlRXh0ZW5zaW9uID0gIi50eHQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zID0geyIqLnR4dCJ9OyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQotCQlwdWJsaWMgTmV3RmlsZVBhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlzdXBlcigiIiwgc2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlRGVmYXVsdEZpbGVOYW1lKCkgewotCQkJaW50IGNvdW50ID0gMDsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IGRlZmF1bHROYW1lICsgZGVmYXVsdEZpbGVFeHRlbnNpb247Ci0JCQlJUGF0aCBjb250YWluZXJGdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0JCQlpZiAoY29udGFpbmVyRnVsbFBhdGggIT0gbnVsbCkgewotCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCUlQYXRoIHBhdGggPSBjb250YWluZXJGdWxsUGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotCQkJCQlpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5leGlzdHMocGF0aCkpIHsKLQkJCQkJCWNvdW50Kys7Ci0JCQkJCQlmaWxlTmFtZSA9IGRlZmF1bHROYW1lICsgY291bnQgKyBkZWZhdWx0RmlsZUV4dGVuc2lvbjsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZpbGVOYW1lOwotCQl9Ci0KLQkJLy8gcmV0dXJucyB0cnVlIGlmIGZpbGUgb2Ygc3BlY2lmaWVkIG5hbWUgZXhpc3RzIGluIGFueSBjYXNlIGZvcgotCQkvLyBzZWxlY3RlZCBjb250YWluZXIKLQkJcHJvdGVjdGVkIFN0cmluZyBleGlzdHNGaWxlQW55Q2FzZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJCWlmICgoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSAhPSBudWxsKSAmJiAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5pc0VtcHR5KCkgPT0gZmFsc2UpICYmIChmaWxlTmFtZS5jb21wYXJlVG8oIiIpICE9IDApKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJLy8gbG9vayB0aHJvdWdoIGFsbCByZXNvdXJjZXMgYXQgdGhlIHNwZWNpZmllZCBjb250YWluZXIgLQotCQkJCS8vIGNvbXBhcmUgaW4gdXBwZXIgY2FzZQotCQkJCUlSZXNvdXJjZSBwYXJlbnQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSk7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcGFyZW50OwotCQkJCQl0cnkgewotCQkJCQkJSVJlc291cmNlW10gbWVtYmVycyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0JCQkJCQlTdHJpbmcgZW50ZXJlZEZpbGVVcHBlciA9IGZpbGVOYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlTdHJpbmcgcmVzb3VyY2VVcHBlck5hbWUgPSBtZW1iZXJzW2ldLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpOwotCQkJCQkJCWlmIChyZXNvdXJjZVVwcGVyTmFtZS5lcXVhbHMoZW50ZXJlZEZpbGVVcHBlcikpIHsKLQkJCQkJCQkJcmV0dXJuIG1lbWJlcnNbaV0uZ2V0TmFtZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQkJU3RyaW5nIGZ1bGxGaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCQlpZiAoIWV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoZnVsbEZpbGVOYW1lKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxXaXphcmRzTWVzc2FnZXMuX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT04sIGdldFZhbGlkRXh0ZW5zaW9ucygpLnRvU3RyaW5nKCkpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBubyBmaWxlRXh0ZW5zaW9uLCBsZXQncyBjaGVjayBmb3IgdGhpcyBmaWxlIHdpdGggZGVmYXVsdCBmaWxlCi0JCQkvLyBleHRlbnNpb24KLQkJCWlmIChmdWxsRmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PSAtMSkKLQkJCXsKLQkJCQlmdWxsRmlsZU5hbWUgKz0gZGVmYXVsdEZpbGVFeHRlbnNpb247Ci0JCQl9Ci0KLQkJCWlmICgoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSAhPSBudWxsKSAmJiAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5pc0VtcHR5KCkgPT0gZmFsc2UpICYmIChnZXRGaWxlTmFtZSgpLmNvbXBhcmVUbygiIikgIT0gMCkpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlQYXRoIGZ1bGxQYXRoID0gbmV3IFBhdGgoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS50b1N0cmluZygpICsgJy8nICsgZnVsbEZpbGVOYW1lKTsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZnVsbFBhdGgpOwotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShYTUxXaXphcmRzTWVzc2FnZXMuX0VSUk9SX0ZJTEVfQUxSRUFEWV9FWElTVFMpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBjaGVjayBmb3IgZmlsZSBzaG91bGQgYmUgY2FzZSBpbnNlbnNpdGl2ZQotCQkJU3RyaW5nIHNhbWVOYW1lID0gZXhpc3RzRmlsZUFueUNhc2UoZnVsbEZpbGVOYW1lKTsKLQkJCWlmIChzYW1lTmFtZSAhPSBudWxsKSB7Ci0JCQkJLy8gSVNTVUU6IGlzIHF1YWxpdGlmZWRGaWxlTmFtZSBub3QgbmVlZGVkLCBvciBpcyBpdCBzdXBwb3NlZAotCQkJCS8vIHRvIGJlIHVzZWQgaW4gZXJyb3IgbWVzc2FnZT8KLQkJCQkvLyBTdHJpbmcgcXVhbGlmaWVkRmlsZU5hbWUgPQotCQkJCS8vIGdldENvbnRhaW5lckZ1bGxQYXRoKCkudG9TdHJpbmcoKSArICcvJyArIGZ1bGxGaWxlTmFtZTsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoWE1MV2l6YXJkc01lc3NhZ2VzLl9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTICsgIiAiICsgc2FtZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlyZXR1cm4gc3VwZXIudmFsaWRhdGVQYWdlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCS8vIGluaGVyaXQgZGVmYXVsdCBjb250YWluZXIgYW5kIG5hbWUgc3BlY2lmaWNhdGlvbiB3aWRnZXRzCi0JCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCQl0aGlzLnNldEZpbGVOYW1lKGNvbXB1dGVEZWZhdWx0RmlsZU5hbWUoKSk7Ci0JCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldCBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMgZm9yIFhNTCBDb250ZW50IHR5cGUKLQkJICogCi0JCSAqIEByZXR1cm4gTGlzdAotCQkgKi8KLQkJTGlzdCBnZXRWYWxpZEV4dGVuc2lvbnMoKSB7Ci0JCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKTsKLQkJCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQkJfQotCQkJcmV0dXJuIGZWYWxpZEV4dGVuc2lvbnM7Ci0JCX0KLQotCQkvKioKLQkJICogVmVyaWZpZXMgaWYgZmlsZU5hbWUgaXMgdmFsaWQgbmFtZSBmb3IgY29udGVudCB0eXBlLiBUYWtlcyBiYXNlCi0JCSAqIGNvbnRlbnQgdHlwZSBpbnRvIGNvbnNpZGVyYXRpb24uCi0JCSAqIAotCQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkJICogQHJldHVybiB0cnVlIGlmIGV4dGVuc2lvbiBpcyB2YWxpZCBmb3IgdGhpcyBjb250ZW50IHR5cGUKLQkJICovCi0JCWJvb2xlYW4gZXh0ZW5zaW9uVmFsaWRGb3JDb250ZW50VHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQotCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKTsKLQkJCS8vIHRoZXJlIGlzIGN1cnJlbnRseSBhbiBleHRlbnNpb24KLQkJCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSB7Ci0JCQkJLy8gY2hlY2sgd2hhdCBjb250ZW50IHR5cGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggY3VycmVudAotCQkJCS8vIGV4dGVuc2lvbgotCQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihmaWxlTmFtZSk7Ci0JCQkJaW50IGkgPSAwOwotCQkJCXdoaWxlICgoaSA8IHR5cGVzLmxlbmd0aCkgJiYgIXZhbGlkKSB7Ci0JCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNLaW5kT2YodHlwZSk7Ci0JCQkJCSsraTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2YWxpZCA9IHRydWU7IC8vIG5vIGV4dGVuc2lvbiBzbyB2YWxpZAotCQkJfQotCQkJcmV0dXJuIHZhbGlkOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WE1MR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NmE3NTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNvbnRlbnRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNvbnRlbnRCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01Db250ZW50QnVpbGRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgTmV3WE1MR2VuZXJhdG9yIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgZ3JhbW1hclVSSTsKLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudCBjbURvY3VtZW50OwotCXByb3RlY3RlZCBpbnQgYnVpbGRQb2xpY3k7Ci0JcHJvdGVjdGVkIFN0cmluZyByb290RWxlbWVudE5hbWU7Ci0KLQlwcm90ZWN0ZWQgSUNhdGFsb2dFbnRyeSB4bWxDYXRhbG9nRW50cnk7Ci0JcHJvdGVjdGVkIGludCBvcHRpb25hbEVsZW1lbnREZXB0aExpbWl0ID0gLTE7Ci0KLQkvLyBpbmZvIGZvciBkdGQKLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lkOwotCXByb3RlY3RlZCBTdHJpbmcgc3lzdGVtSWQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U3lzdGVtSWQ7Ci0KLQkvLyBpbmZvIGZvciB4c2QKLQlwdWJsaWMgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdDsKLQotCXB1YmxpYyBOZXdYTUxHZW5lcmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE5ld1hNTEdlbmVyYXRvcihTdHJpbmcgZ3JhbW1hclVSSSwgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCXRoaXMuZ3JhbW1hclVSSSA9IGdyYW1tYXJVUkk7Ci0JCXRoaXMuY21Eb2N1bWVudCA9IGNtRG9jdW1lbnQ7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpLCBTdHJpbmdbXSBlcnJvckluZm8pIHsKLQkJU3RyaW5nIHRpdGxlID0gbnVsbDsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotCQlMaXN0IGVycm9yTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gbnVsbDsKLQotCQlpZiAoVVJJSGVscGVyLmlzUmVhZGFibGVVUkkodXJpLCB0cnVlKSkgewotCQkJLy8gKGNzKSBhc3N1bWUgdGhlIHVyaSBoYXMgYmVlbiBwcm92aWRlZCBpbiBhIG5vcm1hbGl6ZWQgZm9ybQotCQkJY21Eb2N1bWVudCA9IENvbnRlbnRNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDTURvY3VtZW50KHVyaSwgbnVsbCk7Ci0KLQkJCWlmICh1cmkuZW5kc1dpdGgoIi5kdGQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGVycm9yTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJCXRpdGxlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9JTlZBTElEX0dSQU1NQVJfRVJST1I7Ci0JCQkJCW1lc3NhZ2UgPSBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0xBQkVMX0VSUk9SX0RURF9JTlZBTElEX0lORk87Ci0JCQkJfQotCQkJfQotCQkJZWxzZSAvLyAiLnhzZCIKLQkJCXsKLQkJCQkvLyBUbyBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHNjaGVtYSBlZGl0b3IgdmFsaWRhdGlvbgotCQkJCVhNTFNjaGVtYVZhbGlkYXRpb25DaGVja2VyIHZhbGlkYXRvciA9IG5ldyBYTUxTY2hlbWFWYWxpZGF0aW9uQ2hlY2tlcigpOwotCQkJCWlmICghdmFsaWRhdG9yLmlzVmFsaWQodXJpKSkgewotCQkJCQl0aXRsZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfSU5WQUxJRF9HUkFNTUFSX0VSUk9SOwotCQkJCQltZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9FUlJPUl9TQ0hFTUFfSU5WQUxJRF9JTkZPOwotCQkJCX0KLQkJCQllbHNlIGlmIChjbURvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJaW50IGdsb2JhbEVsZW1lbnRDb3VudCA9IGNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXRMZW5ndGgoKTsKLQkJCQkJaWYgKGdsb2JhbEVsZW1lbnRDb3VudCA9PSAwKSB7Ci0JCQkJCQl0aXRsZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0FSTklOR19USVRMRV9OT19ST09UX0VMRU1FTlRTOwotCQkJCQkJbWVzc2FnZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0FSTklOR19NU0dfTk9fUk9PVF9FTEVNRU5UUzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRpdGxlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XQVJOSU5HX1RJVExFX05PX1JPT1RfRUxFTUVOVFM7Ci0JCQltZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XQVJOSU5HX1VSSV9OT1RfRk9VTkRfQ09MT04gKyAiICIgKyB1cmk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllcnJvckluZm9bMF0gPSB0aXRsZTsKLQkJZXJyb3JJbmZvWzFdID0gbWVzc2FnZTsKLQotCQlyZXR1cm4gY21Eb2N1bWVudDsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYXBwbHlMaW5lRGVsaW1pdGVyKElGaWxlIGZpbGUsIFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBzeXN0ZW1MaW5lU2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFN0cmluZyhQbGF0Zm9ybS5QSV9SVU5USU1FLCBQbGF0Zm9ybS5QUkVGX0xJTkVfU0VQQVJBVE9SLCBzeXN0ZW1MaW5lU2VwYXJhdG9yLCBuZXcgSVNjb3BlQ29udGV4dFtdIHtuZXcgUHJvamVjdFNjb3BlKGZpbGUuZ2V0UHJvamVjdCgpKSwgbmV3IEluc3RhbmNlU2NvcGUoKSB9KTsvLyROT04tTkxTLTEkCi0JCWlmKCFzeXN0ZW1MaW5lU2VwYXJhdG9yLmVxdWFscyhsaW5lRGVsaW1pdGVyKSkgewotCQkJU3RyaW5nIGNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKHRleHQsICJcclxuIiwgIlxuIik7Ci0JCQljb252ZXJ0ZWRUZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZShjb252ZXJ0ZWRUZXh0LCAiXHIiLCAiXG4iKTsKLQkJCWNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKGNvbnZlcnRlZFRleHQsICJcbiIsIGxpbmVEZWxpbWl0ZXIpOwotCQkJcmV0dXJuIGNvbnZlcnRlZFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGNyZWF0ZVRlbXBsYXRlWE1MRG9jdW1lbnQoSUZpbGUsIFN0cmluZykgaW5zdGVhZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUVtcHR5WE1MRG9jdW1lbnQoSUZpbGUgbmV3RmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjaGFyU2V0ID0gZ2V0VXNlclByZWZlcnJlZENoYXJzZXQoKTsKLQkJU3RyaW5nIGNvbnRlbnRzID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiIgKyBjaGFyU2V0ICsgIlwiPz4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJY3JlYXRlVGVtcGxhdGVYTUxEb2N1bWVudChuZXdGaWxlLCBjb250ZW50cyk7Ci0JfQotCQotCXZvaWQgY3JlYXRlVGVtcGxhdGVYTUxEb2N1bWVudChJRmlsZSBuZXdGaWxlLCBTdHJpbmcgY29udGVudHMpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNoYXJTZXQgPSBnZXRVc2VyUHJlZmVycmVkQ2hhcnNldCgpOwotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkKLQkJCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSwgY2hhclNldCkpOwotCQkJY29udGVudHMgPSBhcHBseUxpbmVEZWxpbWl0ZXIobmV3RmlsZSwgY29udGVudHMpOwotCQkJd3JpdGVyLnByaW50bG4oY29udGVudHMpOwotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCQlvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQkKLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCW5ld0ZpbGUuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0sIHRydWUsIHRydWUsIG51bGwpOwotCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFVzZXJQcmVmZXJyZWRDaGFyc2V0KCkgewotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JCXJldHVybiBjaGFyU2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVhNTERvY3VtZW50KFN0cmluZyB4bWxGaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcih4bWxGaWxlTmFtZSk7Ci0JCVN0cmluZyBjaGFyc2V0ID0gbnVsbDsKLQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCWNoYXJzZXQgPSBjb250ZW50VHlwZS5nZXREZWZhdWx0Q2hhcnNldCgpOwotCQl9Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBjcmVhdGVYTUxEb2N1bWVudCh4bWxGaWxlTmFtZSwgY2hhcnNldCk7Ci0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoeG1sRmlsZU5hbWUpOwotCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQlvdXRwdXRTdHJlYW0ud3JpdGVUbyhmb3MpOwotCQlmb3MuY2xvc2UoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVhNTERvY3VtZW50KElGaWxlIG5ld0ZpbGUsIFN0cmluZyB4bWxGaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjaGFyc2V0ID0gbmV3RmlsZS5nZXRDaGFyc2V0KCk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBjcmVhdGVYTUxEb2N1bWVudCh4bWxGaWxlTmFtZSwgY2hhcnNldCk7Ci0KLQkJU3RyaW5nIGNvbnRlbnRzID0gb3V0cHV0U3RyZWFtLnRvU3RyaW5nKGNoYXJzZXQpOwotCQljb250ZW50cyA9IGFwcGx5TGluZURlbGltaXRlcihuZXdGaWxlLCBjb250ZW50cyk7Ci0KLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudHMuZ2V0Qnl0ZXMoY2hhcnNldCkpOwotCQluZXdGaWxlLnNldENvbnRlbnRzKGlucHV0U3RyZWFtLCB0cnVlLCB0cnVlLCBudWxsKTsKLQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQotCXB1YmxpYyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gY3JlYXRlWE1MRG9jdW1lbnQoU3RyaW5nIHhtbEZpbGVOYW1lLCBTdHJpbmcgY2hhcnNldCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChjaGFyc2V0ID09IG51bGwpIHsKLQkJCWNoYXJzZXQgPSBnZXRVc2VyUHJlZmVycmVkQ2hhcnNldCgpOwotCQkJaWYgKGNoYXJzZXQgPT0gbnVsbCkgewotCQkJCWNoYXJzZXQgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudCgpOwotCi0JCUFzc2VydC5pc05vdE51bGwoY21Eb2N1bWVudCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZ2V0Um9vdEVsZW1lbnROYW1lKCkpOwotCi0JCS8vIGNyZWF0ZSB0aGUgeG1sIG1vZGVsCi0JCUNNTmFtZWROb2RlTWFwIG5hbWVOb2RlTWFwID0gY21Eb2N1bWVudC5nZXRFbGVtZW50cygpOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBjbUVsZW1lbnREZWNsYXJhdGlvbiA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgbmFtZU5vZGVNYXAuZ2V0TmFtZWRJdGVtKGdldFJvb3RFbGVtZW50TmFtZSgpKTsKLQotCQlEb2N1bWVudCB4bWxEb2N1bWVudCA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotCQlET01Db250ZW50QnVpbGRlckltcGwgY29udGVudEJ1aWxkZXIgPSBuZXcgRE9NQ29udGVudEJ1aWxkZXJJbXBsKHhtbERvY3VtZW50KTsKLQotCQkvLyB0aGlzICd1Z2x5VGVtcEhhY2snIGZsYWcgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gc3VwcmVzcyB0aGUKLQkJLy8gY3JlYXRpb24gYSBkZWZhdWx0IGVuY29kaW5nCi0JCS8vIHdlJ2xsIGhhbmRsZSB0aGlzIGxhdGVyIGluIHRoZSBkb21Xcml0ZXIucHJpbnQoKSBtZXRob2QgdXNlZCBiZWxvdwotCQkvLwotCQljb250ZW50QnVpbGRlci5zdXByZXNzQ3JlYXRpb25PZkRvY3R5cGVBbmRYTUxEZWNsYXJhdGlvbiA9IHRydWU7Ci0JCWNvbnRlbnRCdWlsZGVyLnNldEJ1aWxkUG9saWN5KGJ1aWxkUG9saWN5KTsKLQkJY29udGVudEJ1aWxkZXIuc2V0T3B0aW9uYWxFbGVtZW50RGVwdGhMaW1pdChvcHRpb25hbEVsZW1lbnREZXB0aExpbWl0KTsKLQkJY29udGVudEJ1aWxkZXIuc2V0RXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydChuZXcgTXlFeHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0KG5hbWVzcGFjZUluZm9MaXN0LCB4bWxGaWxlTmFtZSkpOwotCQljb250ZW50QnVpbGRlci5jcmVhdGVEZWZhdWx0Um9vdENvbnRlbnQoY21Eb2N1bWVudCwgY21FbGVtZW50RGVjbGFyYXRpb24sIG5hbWVzcGFjZUluZm9MaXN0KTsKLQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0U3RyZWFtV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0sIGNoYXJzZXQpOwotCi0JCURPTVdyaXRlciBkb21Xcml0ZXIgPSBuZXcgRE9NV3JpdGVyKG91dHB1dFN0cmVhbVdyaXRlcik7Ci0KLQkJLy8gVE9ETy4uLiBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gZmlsZSBleHRlbnNpb25zLCB3ZSBuZWVkIHRvIGtlZXAKLQkJLy8gdHJhY2sgb2YgdGhlIGdyYW1tYXIgdHlwZQotCQkvLyBiZXR0ZXIgeWV0IHdlIHNob3VsZCByZWF0ZSBhbiBTU0UgZG9jdW1lbnQgc28gdGhhdCB3ZSBjYW4gZm9ybWF0IGl0Ci0JCS8vIG5pY2VseSBiZWZvcmUgc2F2aW5nCi0JCS8vIHRoZW4gd2Ugd29uJ3QgbmVlZCB0aGUgRE9NV3JpdGVyIGF0IGFsbAotCQkvLwotCQlkb21Xcml0ZXIucHJpbnQoeG1sRG9jdW1lbnQsIGNoYXJzZXQsIGNtRG9jdW1lbnQuZ2V0Tm9kZU5hbWUoKSwgZ2V0Tm9uV2hpdGVzcGFjZVN0cmluZyhnZXRQdWJsaWNJZCgpKSwgZ2V0Tm9uV2hpdGVzcGFjZVN0cmluZyhnZXRTeXN0ZW1JZCgpKSk7Ci0JCW91dHB1dFN0cmVhbS5mbHVzaCgpOwotCQlvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQotCQlyZXR1cm4gb3V0cHV0U3RyZWFtOwotCX0KLQotCi0JcHVibGljIHZvaWQgY3JlYXRlTmFtZXNwYWNlSW5mb0xpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotCQlpZiAoY21Eb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAoTGlzdCkgY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL2NvbXBsZXRlTmFtZXNwYWNlSW5mbyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IHJlc3VsdC5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIHJlc3VsdC5nZXQoaSk7Ci0JCQkJCWlmIChpID09IDApIHsKLQkJCQkJCVN0cmluZyBsb2NhdGlvbkluZm8gPSBudWxsOwotCQkJCQkJaWYgKHhtbENhdGFsb2dFbnRyeSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKHhtbENhdGFsb2dFbnRyeS5nZXRFbnRyeVR5cGUoKSA9PSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDKSB7Ci0JCQkJCQkJCWxvY2F0aW9uSW5mbyA9IHhtbENhdGFsb2dFbnRyeS5nZXRBdHRyaWJ1dGVWYWx1ZShJQ2F0YWxvZ0VudHJ5LkFUVFJfV0VCX1VSTCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlsb2NhdGlvbkluZm8gPSB4bWxDYXRhbG9nRW50cnkuZ2V0S2V5KCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGxvY2F0aW9uSW5mbyA9PSBudWxsKSB7Ci0JCQkJCQkJbG9jYXRpb25JbmZvID0gZGVmYXVsdFN5c3RlbUlkOwotCQkJCQkJfQotCQkJCQkJaW5mby5sb2NhdGlvbkhpbnQgPSBsb2NhdGlvbkluZm87Ci0JCQkJCQlpbmZvLnNldFByb3BlcnR5KCJsb2NhdGlvbkhpbnQtcmVhZE9ubHkiLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWluZm8uc2V0UHJvcGVydHkoInVyaS1yZWFkT25seSIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJaW5mby5zZXRQcm9wZXJ0eSgidW5yZW1vdmFibGUiLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWluZm8ubG9jYXRpb25IaW50ID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJTmFtZXNwYWNlSW5mb0NvbnRlbnRCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTmFtZXNwYWNlSW5mb0NvbnRlbnRCdWlsZGVyKCk7Ci0JCQlidWlsZGVyLnNldEJ1aWxkUG9saWN5KENvbnRlbnRCdWlsZGVyLkJVSUxEX09OTFlfUkVRVUlSRURfQ09OVEVOVCk7Ci0JCQlidWlsZGVyLnZpc2l0Q01Ob2RlKGNtRG9jdW1lbnQpOwotCQkJcmVzdWx0LmFkZEFsbChidWlsZGVyLmxpc3QpOwotCQl9Ci0JCW5hbWVzcGFjZUluZm9MaXN0ID0gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gaXNNaXNzaW5nTmFtZXNwYWNlTG9jYXRpb24oKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG5hbWVzcGFjZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJaWYgKGluZm8ubG9jYXRpb25IaW50ID09IG51bGwpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TmFtZXNwYWNlSW5mb0Vycm9ycygpIHsKLQkJU3RyaW5nW10gZXJyb3JMaXN0ID0gbnVsbDsKLQotLy8gTm8gd2FybmluZ3Mgc2hvdWxkIGJlIGdpdmVuIHdoZW4gbmFtZXNwYWNlcyBlbnRyaWVzIGhhdmUgbWlzc2luZyBsb2NhdGlvbiBoaW50cwotLy8gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDUxMjgJCQotLy8JCWlmICgobmFtZXNwYWNlSW5mb0xpc3QgIT0gbnVsbCkgJiYgaXNNaXNzaW5nTmFtZXNwYWNlTG9jYXRpb24oKSkgewotLy8JCQlTdHJpbmcgdGl0bGUgPSBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0xBQkVMX05PX0xPQ0FUSU9OX0hJTlQ7Ci0vLwkJCVN0cmluZyBtZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzEgKyAiICIgKyBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dBUk5JTkdfTVNHX05PX0xPQ0FUSU9OX0hJTlRfMiArICJcblxuIiArIFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0FSTklOR19NU0dfTk9fTE9DQVRJT05fSElOVF8zOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLS8vCi0vLwkJCWVycm9yTGlzdCA9IG5ldyBTdHJpbmdbMl07Ci0vLwkJCWVycm9yTGlzdFswXSA9IHRpdGxlOwotLy8JCQllcnJvckxpc3RbMV0gPSBtZXNzYWdlOwotLy8JCX0KLQkJcmV0dXJuIGVycm9yTGlzdDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFhNTENhdGFsb2dFbnRyeShJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSkgewotCQl4bWxDYXRhbG9nRW50cnkgPSBjYXRhbG9nRW50cnk7Ci0JfQotCi0JcHVibGljIElDYXRhbG9nRW50cnkgZ2V0WE1MQ2F0YWxvZ0VudHJ5KCkgewotCQlyZXR1cm4geG1sQ2F0YWxvZ0VudHJ5OwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0QnVpbGRQb2xpY3koaW50IHBvbGljeSkgewotCQlidWlsZFBvbGljeSA9IHBvbGljeTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRTeXN0ZW1JZChTdHJpbmcgc3lzSWQpIHsKLQkJZGVmYXVsdFN5c3RlbUlkID0gc3lzSWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U3lzdGVtSWQoKSB7Ci0JCXJldHVybiBkZWZhdWx0U3lzdGVtSWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSWQoU3RyaW5nIHN5c0lkKSB7Ci0JCXN5c3RlbUlkID0gc3lzSWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHN5c3RlbUlkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKFN0cmluZyBwdWJJZCkgewotCQlwdWJsaWNJZCA9IHB1YklkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCXJldHVybiBwdWJsaWNJZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRHcmFtbWFyVVJJKFN0cmluZyBncmFtVVJJKSB7Ci0JCWdyYW1tYXJVUkkgPSBncmFtVVJJOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0R3JhbW1hclVSSSgpIHsKLQkJcmV0dXJuIGdyYW1tYXJVUkk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q01Eb2N1bWVudChDTURvY3VtZW50IGNtRG9jKSB7Ci0JCWNtRG9jdW1lbnQgPSBjbURvYzsKLQl9Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkgewotCQlyZXR1cm4gY21Eb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSb290RWxlbWVudE5hbWUoU3RyaW5nIHJvb3ROYW1lKSB7Ci0JCXJvb3RFbGVtZW50TmFtZSA9IHJvb3ROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Um9vdEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gcm9vdEVsZW1lbnROYW1lOwotCX0KLQotCi0JcHJvdGVjdGVkIGNsYXNzIE15RXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydCBpbXBsZW1lbnRzIERPTUNvbnRlbnRCdWlsZGVySW1wbC5FeHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0IHsKLQkJcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QxOwotCQlwcm90ZWN0ZWQgVVJJUmVzb2x2ZXIgaWRSZXNvbHZlcjsKLQkJcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uOwotCi0JCXByb3RlY3RlZCBNeUV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQoTGlzdCBuYW1lc3BhY2VJbmZvTGlzdFBhcmFtLCBTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbikgewotCQkJdGhpcy5uYW1lc3BhY2VJbmZvTGlzdDEgPSBuYW1lc3BhY2VJbmZvTGlzdFBhcmFtOwotCQkJdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLQkJCWlkUmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOwotCQl9Ci0KLQkJcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJCUNNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJCWlmICgobmFtZXNwYWNlVVJJICE9IG51bGwpICYmIChuYW1lc3BhY2VVUkkudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLQkJCQlTdHJpbmcgbG9jYXRpb25IaW50ID0gbnVsbDsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBuYW1lc3BhY2VJbmZvTGlzdDEuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBpLm5leHQoKTsKLQkJCQkJaWYgKG5hbWVzcGFjZVVSSS5lcXVhbHMoaW5mby51cmkpKSB7Ci0JCQkJCQlsb2NhdGlvbkhpbnQgPSBpbmZvLmxvY2F0aW9uSGludDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChsb2NhdGlvbkhpbnQgIT0gbnVsbCkgewotCQkJCQlncmFtbWFyVVJJID0gaWRSZXNvbHZlci5yZXNvbHZlKHJlc291cmNlTG9jYXRpb24sIGxvY2F0aW9uSGludCwgbG9jYXRpb25IaW50KTsKLQkJCQkJcmVzdWx0ID0gQ29udGVudE1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNNRG9jdW1lbnQoZ2V0R3JhbW1hclVSSSgpLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBjbURvY3VtZW50OwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5vbldoaXRlc3BhY2VTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHN0cmluZyAhPSBudWxsKSB7Ci0JCQlpZiAoc3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlyZXN1bHQgPSBzdHJpbmc7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWxFbGVtZW50RGVwdGhMaW1pdChpbnQgb3B0aW9uYWxFbGVtZW50RGVwdGhMaW1pdCkgewotCQl0aGlzLm9wdGlvbmFsRWxlbWVudERlcHRoTGltaXQgPSBvcHRpb25hbEVsZW1lbnREZXB0aExpbWl0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WE1MSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YzI2NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uLCBidWcgMjEyMzMwCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBOZXdYTUxIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE5ld1hNTEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXIjZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gCUhhbmRsZXJVdGlsLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdyhldmVudCk7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gd29ya2JlbmNoV2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gZ2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0KLQkJaWYgKChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElGaWxlKSAmJiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKSB7Ci0JCQlJRmlsZSBmaWxlID0gKElGaWxlKSBzZWxlY3RlZE9iamVjdDsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCXRyeSB7Ci0JCQkJTmV3WE1MV2l6YXJkLnNob3dEaWFsb2cod29ya2JlbmNoV2luZG93LmdldFNoZWxsKCksIGZpbGUsIHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IAotCi0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGVzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlJdGVyYXRvciBpID0gZXMuaXRlcmF0b3IoKTsKLQkJCWlmIChpLmhhc05leHQoKSkgewotCQkJCXJlc3VsdCA9IGkubmV4dCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0YjU4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTDsKLQotLyoqCi0gKiBUZW1wbGF0ZXMgcGFnZSBpbiBuZXcgZmlsZSB3aXphcmQuIEFsbG93cyB1c2VycyB0byBzZWxlY3QgYSBuZXcgZmlsZQotICogdGVtcGxhdGUgdG8gYmUgYXBwbGllZCBpbiBuZXcgZmlsZS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQ29udGVudCBwcm92aWRlciBmb3IgdGVtcGxhdGVzCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJLyoqIFRoZSB0ZW1wbGF0ZSBzdG9yZS4gKi8KLQkJcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZTdG9yZTsKLQotCQkvKgotCQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZlN0b3JlID0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dCkgewotCQkJcmV0dXJuIGZTdG9yZS5nZXRUZW1wbGF0ZXMoVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5ORVcpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQlmU3RvcmUgPSAoVGVtcGxhdGVTdG9yZSkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMYWJlbCBwcm92aWRlciBmb3IgdGVtcGxhdGVzLgotCSAqLwotCXByaXZhdGUgY2xhc3MgVGVtcGxhdGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgZWxlbWVudDsKLQotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqIExhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUgbmFtZSAqLwotCXByaXZhdGUgU3RyaW5nIGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWU7Ci0JLyoqIFRoZSB2aWV3ZXIgZGlzcGxheXMgdGhlIHBhdHRlcm4gb2Ygc2VsZWN0ZWQgdGVtcGxhdGUuICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZlBhdHRlcm5WaWV3ZXI7Ci0JLyoqIFRoZSB0YWJsZSBwcmVzZW50aW5nIHRoZSB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBmVGFibGVWaWV3ZXI7Ci0JLyoqIFRlbXBsYXRlIHN0b3JlIHVzZWQgYnkgdGhpcyB3aXphcmQgcGFnZSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQkvKiogQ2hlY2tib3ggZm9yIHVzaW5nIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIEJ1dHRvbiBmVXNlVGVtcGxhdGVCdXR0b247Ci0KLQlwdWJsaWMgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZSgpIHsKLQkJc3VwZXIoIk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2UiLCBYTUxXaXphcmRzTWVzc2FnZXMuTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8wLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihYTUxXaXphcmRzTWVzc2FnZXMuTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8xKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3JyZWN0bHkgcmVzaXplcyB0aGUgdGFibGUgc28gbm8gcGhhbnRvbSBjb2x1bW5zIGFwcGVhcgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBidXR0b25zCi0JICogICAgICAgICAgICB0aGUgYnV0dG9ucwotCSAqIEBwYXJhbSB0YWJsZQotCSAqICAgICAgICAgICAgdGhlIHRhYmxlCi0JICogQHBhcmFtIGNvbHVtbjEKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMgotCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMwotCSAqICAgICAgICAgICAgdGhlIHRoaXJkIGNvbHVtbgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmVUYWJsZVJlc2l6aW5nKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFRhYmxlIHRhYmxlLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yKSB7Ci0JCXBhcmVudC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgYXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOwotCQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCkgewotCQkJCQkvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbgotCQkJCQkvLyB3aWR0aAotCQkJCQkvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0JCQkJCVBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0JCQkJCXdpZHRoIC09IHZCYXJTaXplLng7Ci0JCQkJfQotCi0JCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCQlpZiAob2xkU2l6ZS54ID4gd2lkdGgpIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMKLQkJCQkJLy8gc21hbGxlciBmaXJzdCBhbmQgdGhlbiByZXNpemUgdGhlIHRhYmxlIHRvCi0JCQkJCS8vIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBiaWdnZXIgc28gbWFrZSB0aGUgdGFibGUKLQkJCQkJLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJCQkJLy8gdG8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShhbmNlc3RvciwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIGNyZWF0ZSBjaGVja2JveCBmb3IgdXNlciB0byB1c2UgWE1MIFRlbXBsYXRlCi0JCWZVc2VUZW1wbGF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV80KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbmFibGVUZW1wbGF0ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZSBmb3IgVGVtcGxhdGVzIHRhYmxlCi0JCUNvbXBvc2l0ZSBpbm5lclBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgaW5uZXJMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlpbm5lckxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJaW5uZXJMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJaW5uZXJMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXQoaW5uZXJMYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChpbm5lclBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzcpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRlbXBsYXRlcwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShpbm5lclBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMik7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4yLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMyk7Ci0KLQkJZlRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJZlRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRlbXBsYXRlTGFiZWxQcm92aWRlcigpKTsKLQkJZlRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGVtcGxhdGVDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJZlRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MikgewotCQkJCWlmICgob2JqZWN0MSBpbnN0YW5jZW9mIFRlbXBsYXRlKSAmJiAob2JqZWN0MiBpbnN0YW5jZW9mIFRlbXBsYXRlKSkgewotCQkJCQlUZW1wbGF0ZSBsZWZ0ID0gKFRlbXBsYXRlKSBvYmplY3QxOwotCQkJCQlUZW1wbGF0ZSByaWdodCA9IChUZW1wbGF0ZSkgb2JqZWN0MjsKLQkJCQkJaW50IHJlc3VsdCA9IGxlZnQuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCQkJCXJldHVybiBsZWZ0LmdldERlc2NyaXB0aW9uKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBvYmplY3QxLCBvYmplY3QyKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNTb3J0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOwotCi0JCWZUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJdXBkYXRlVmlld2VySW5wdXQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHZpZXdlciB0aGF0IGRpc3BsYXlzIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZSdzIGNvbnRlbnRzCi0JCWZQYXR0ZXJuVmlld2VyID0gZG9DcmVhdGVWaWV3ZXIocGFyZW50KTsKLQotCQlmVGVtcGxhdGVTdG9yZSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWZUYWJsZVZpZXdlci5zZXRJbnB1dChmVGVtcGxhdGVTdG9yZSk7Ci0KLQkJLy8gQ3JlYXRlIGxpbmtlZCB0ZXh0IHRvIGp1c3QgdG8gdGVtcGxhdGVzIHByZWZlcmVuY2UgcGFnZQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGluay5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzYpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWxpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlsaW5rQ2xpY2tlZCgpOwotCQkJfQotCQl9KTsKLQotCQljb25maWd1cmVUYWJsZVJlc2l6aW5nKGlubmVyUGFyZW50LCB0YWJsZSwgY29sdW1uMSwgY29sdW1uMik7Ci0JCWxvYWRMYXN0U2F2ZWRQcmVmZXJlbmNlcygpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9URU1QTEFURV9IRUxQSUQpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXNldENvbnRyb2wocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCBjb25maWd1cmVzIGFuZCByZXR1cm5zIGEgc291cmNlIHZpZXdlciB0byBwcmVzZW50IHRoZSB0ZW1wbGF0ZQotCSAqIHBhdHRlcm4gb24gdGhlIHByZWZlcmVuY2UgcGFnZS4gQ2xpZW50cyBtYXkgb3ZlcnJpZGUgdG8gcHJvdmlkZSBhCi0JICogY3VzdG9tIHNvdXJjZSB2aWV3ZXIgZmVhdHVyaW5nIGUuZy4gc3ludGF4IGNvbG9yaW5nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEByZXR1cm4gYSBjb25maWd1cmVkIHNvdXJjZSB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGJhc2VDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTCgpOwotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQl9Ci0JCX07Ci0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXIocGFyZW50LCBudWxsLCBudWxsLCBmYWxzZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCXZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250KCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IikpOyAvLyROT04tTkxTLTEkCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc2NyYXRjaE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTCk7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHNjcmF0Y2hNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJdmlld2VyLmNvbmZpZ3VyZShzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBkb0NyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBjcmVhdGVWaWV3ZXIocGFyZW50KTsKLQkJdmlld2VyLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQlDb250cm9sIGNvbnRyb2wgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQkvLyBbMjYxMjc0XSAtIHNvdXJjZSB2aWV3ZXIgd2FzIGdyb3dpbmcgdG8gZml0IHRoZSBtYXggbGluZSB3aWR0aCBvZiB0aGUgdGVtcGxhdGUKLQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoMik7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZS9kaXNhYmxlIGNvbnRyb2xzIGluIHBhZ2UgYmFzZWQgb24gZlVzZVRlbXBsYXRlQnV0dG9uJ3MgY3VycmVudAotCSAqIHN0YXRlLgotCSAqLwotCXZvaWQgZW5hYmxlVGVtcGxhdGVzKCkgewotCQlib29sZWFuIGVuYWJsZWQgPSBmVXNlVGVtcGxhdGVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJaWYgKCFlbmFibGVkKSB7Ci0JCQkvLyBzYXZlIGxhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRTZWxlY3RlZFRlbXBsYXRlKGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUpOwotCQl9Ci0KLQkJZlRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmUGF0dGVyblZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRlbXBsYXRlIHByZWZlcmVuY2UgcGFnZSBpZAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlkKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLnRlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZSBnZXRTZWxlY3RlZFRlbXBsYXRlKCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCXRlbXBsYXRlID0gKFRlbXBsYXRlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHRlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGVtcGxhdGUgc3RyaW5nIHRvIGluc2VydC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0byBpbnNlcnQgb3IgbnVsbCBpZiBub25lIGlzIHRvIGJlIGluc2VydGVkCi0JICovCi0JU3RyaW5nIGdldFRlbXBsYXRlU3RyaW5nKCkgewotCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBudWxsOwotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJVGVtcGxhdGVDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLmdldENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuTkVXKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBuZXcgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCAwLCAwKTsKLQkJCXRyeSB7Ci0JCQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gY29udGV4dC5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCQkJdGVtcGxhdGVTdHJpbmcgPSBidWZmZXIuZ2V0U3RyaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSBmb3IgbmV3IHhtbCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGVtcGxhdGVTdHJpbmc7Ci0JfQotCi0Jdm9pZCBsaW5rQ2xpY2tlZCgpIHsKLQkJU3RyaW5nIHBhZ2VJZCA9IGdldFByZWZlcmVuY2VQYWdlSWQoKTsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIHBhZ2VJZCwgbmV3IFN0cmluZ1tde3BhZ2VJZH0sIG51bGwpOwotCQlkaWFsb2cub3BlbigpOwotCQlmVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGxhc3QgdGVtcGxhdGUgbmFtZSB1c2VkIGluIE5ldyBYTUwgRmlsZSB3aXphcmQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gc2V0U2VsZWN0aW9uID0gZmFsc2U7Ci0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFhNTFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUpOwotCQlpZiAodGVtcGxhdGVOYW1lID09IG51bGwgfHwgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCXRlbXBsYXRlTmFtZSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfSUQpOwotCQkJaWYgKHRlbXBsYXRlTmFtZSAhPSBudWxsICYmIHRlbXBsYXRlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGZUZW1wbGF0ZVN0b3JlLmZpbmRUZW1wbGF0ZUJ5SWQodGVtcGxhdGVOYW1lKTsKLQkJCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJCQlzZXRTZWxlY3Rpb24gPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZU5hbWU7Ci0JCQlzZXRTZWxlY3Rpb24gPSB0cnVlOwotCQl9Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24oc2V0U2VsZWN0aW9uKTsKLQkJZW5hYmxlVGVtcGxhdGVzKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0ZW1wbGF0ZSBuYW1lIHVzZWQgZm9yIG5leHQgY2FsbCB0byBOZXcgWE1MIEZpbGUgd2l6YXJkLgotCSAqLwotCXZvaWQgc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCXRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJfQotCi0JCVhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9OQU1FLCB0ZW1wbGF0ZU5hbWUpOwotCQlYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IGEgdGVtcGxhdGUgaW4gdGhlIHRhYmxlIHZpZXdlciBnaXZlbiB0aGUgdGVtcGxhdGUgbmFtZS4gSWYKLQkgKiB0ZW1wbGF0ZSBuYW1lIGNhbm5vdCBiZSBmb3VuZCBvciB0ZW1wbGF0ZU5hbWUgaXMgbnVsbCwganVzdCBzZWxlY3QKLQkgKiBmaXJzdCBpdGVtIGluIHRhYmxlLiBJZiBubyBpdGVtcyBpbiB0YWJsZSBzZWxlY3Qgbm90aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gdGVtcGxhdGVOYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkVGVtcGxhdGUoU3RyaW5nIHRlbXBsYXRlTmFtZSkgewotCQlPYmplY3QgdGVtcGxhdGUgPSBudWxsOwotCi0JCWlmICgodGVtcGxhdGVOYW1lICE9IG51bGwpICYmICh0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPiAwKSkgewotCQkJLy8gcGljayB0aGUgbGFzdCB1c2VkIHRlbXBsYXRlCi0JCQl0ZW1wbGF0ZSA9IGZUZW1wbGF0ZVN0b3JlLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuTkVXKTsKLQkJfQotCi0JCS8vIG5vIHJlY29yZCBvZiBsYXN0IHVzZWQgdGVtcGxhdGUgc28ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJaWYgKHRlbXBsYXRlID09IG51bGwpIHsKLQkJCS8vIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCQl0ZW1wbGF0ZSA9IGZUYWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCk7Ci0JCX0KLQotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGVtcGxhdGUpOwotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgcGF0dGVybiB2aWV3ZXIuCi0JICovCi0Jdm9pZCB1cGRhdGVWaWV3ZXJJbnB1dCgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hNTFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM3Nzg0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hNTFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgkgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdSZXNvdXJjZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NQ29udGVudEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLk5hbWVzcGFjZUluZm9FcnJvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0LkNvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotcHVibGljIGNsYXNzIE5ld1hNTFdpemFyZCBleHRlbmRzIE5ld01vZGVsV2l6YXJkIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDUkVBVEVfRlJPTV9EVEQgPSAwOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENSRUFURV9GUk9NX1hTRCA9IDE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ1JFQVRFX0ZST01fU0NSQVRDSCA9IDI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGNyZWF0ZUZyb21SYWRpb0J1dHRvbkxhYmVsID0ge1hNTFdpemFyZHNNZXNzYWdlcy5fVUlfUkFESU9fWE1MX0ZST01fRFRELCBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1JBRElPX1hNTF9GUk9NX1NDSEVNQSwgWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9SQURJT19YTUxfRlJPTV9TQ1JBVENIfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gZmlsZVBhZ2VGaWx0ZXJFeHRlbnNpb25zID0geyIueG1sIn07IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGJyb3dzZVhTREZpbHRlckV4dGVuc2lvbnMgPSB7Ii54c2QifTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gYnJvd3NlRFRERmlsdGVyRXh0ZW5zaW9ucyA9IHsiLmR0ZCJ9OyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OQUxfRUxFTUVOVF9ERVBUSF9MSU1JVF9ERUZBVUxUX1ZBTFVFID0gMjsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgWE1MX0VESVRPUl9GSUxFX1NJWkVfTElNSVQgPSAyNjIxNDQwMDsgLy8gMjUgbWIKLQotCXByb3RlY3RlZCBOZXdGaWxlUGFnZSBuZXdGaWxlUGFnZTsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBjbGllbnRzIHNob3VsZCBub3QgYmUgYWxsb3dlZCB0byBjaGFuZ2Ugc3RhcnQgcGFnZQotCSAqLwotCXByb3RlY3RlZCBTdGFydFBhZ2Ugc3RhcnRQYWdlOwotCXByaXZhdGUgU3RhcnRQYWdlIGZDcmVhdGVYTUxGcm9tV2l6YXJkUGFnZTsKLQlwcm90ZWN0ZWQgU2VsZWN0R3JhbW1hckZpbGVQYWdlIHNlbGVjdEdyYW1tYXJGaWxlUGFnZTsKLQlwcm90ZWN0ZWQgU2VsZWN0Um9vdEVsZW1lbnRQYWdlIHNlbGVjdFJvb3RFbGVtZW50UGFnZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgY21Eb2N1bWVudEVycm9yTWVzc2FnZTsKLQotCXByb3RlY3RlZCBOZXdYTUxHZW5lcmF0b3IgZ2VuZXJhdG9yOwotCXByaXZhdGUgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZSBmTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZTsKLQotCi0JcHVibGljIE5ld1hNTFdpemFyZCgpIHsKLQkJc2V0V2luZG93VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XSVpBUkRfQ1JFQVRFX05FV19USVRMRSk7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19XSVpCQU5fR0VORVJBVEVYTUwpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQkJZ2VuZXJhdG9yID0gbmV3IE5ld1hNTEdlbmVyYXRvcigpOwotCX0KLQotCi0JcHVibGljIE5ld1hNTFdpemFyZChJRmlsZSBmaWxlLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpIHsKLQkJdGhpcygpOwotCi0JCWdlbmVyYXRvci5zZXRHcmFtbWFyVVJJKFVSSUhlbHBlci5nZXRQbGF0Zm9ybVVSSShmaWxlKSk7Ci0JCWdlbmVyYXRvci5zZXRDTURvY3VtZW50KGNtRG9jdW1lbnQpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNob3dEaWFsb2coU2hlbGwgc2hlbGwsIElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJU3RyaW5nW10gZXJyb3JJbmZvID0gbmV3IFN0cmluZ1syXTsKLQkJLy8gKGNzKSB0aGUgVVJJIGFyZ3VtZW50IHRvIGNyZWF0ZUNNRG9jdW1lbnQgbmVlZHMgdG8gYmUgYSBmdWxseQotCQkvLyBxdWFsaWZpZWQgVVJJCi0JCS8vCi0JCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IE5ld1hNTEdlbmVyYXRvci5jcmVhdGVDTURvY3VtZW50KFVSSUhlbHBlci5nZXRQbGF0Zm9ybVVSSShmaWxlKSwgZXJyb3JJbmZvKTsKLQkJaWYgKGVycm9ySW5mb1swXSA9PSBudWxsKSB7Ci0JCQlOZXdYTUxXaXphcmQgd2l6YXJkID0gbmV3IE5ld1hNTFdpemFyZChmaWxlLCBjbURvY3VtZW50KTsKLQkJCXdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQkJd2l6YXJkLnNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfRElBTE9HX05FV19USVRMRSk7Ci0JCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQl9Ci0JCWVsc2UgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsIGVycm9ySW5mb1swXSwgZXJyb3JJbmZvWzFdKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlTdHJpbmcgZ3JhbW1hclVSSSA9IGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCk7Ci0JCQotCQkvLyBuZXcgZmlsZSBwYWdlCi0JCW5ld0ZpbGVQYWdlID0gbmV3IE5ld0ZpbGVQYWdlKGZTZWxlY3Rpb24pOwotCQluZXdGaWxlUGFnZS5zZXRUaXRsZShYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0ZJTEVfSEVBRElORyk7Ci0JCW5ld0ZpbGVQYWdlLnNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NSRUFURV9YTUxfRklMRV9FWFBMKTsKLQkJbmV3RmlsZVBhZ2UuZGVmYXVsdE5hbWUgPSAoZ3JhbW1hclVSSSAhPSBudWxsKSA/IFVSSUhlbHBlci5yZW1vdmVGaWxlRXh0ZW5zaW9uKFVSSUhlbHBlci5nZXRMYXN0U2VnbWVudChncmFtbWFyVVJJKSkgOiAiTmV3RmlsZSI7IC8vJE5PTi1OTFMtMSQKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBleHQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQkJbmV3RmlsZVBhZ2UuZGVmYXVsdEZpbGVFeHRlbnNpb24gPSAiLiIgKyBleHQ7IC8vJE5PTi1OTFMtMSQKLQkJbmV3RmlsZVBhZ2UuZmlsdGVyRXh0ZW5zaW9ucyA9IGZpbGVQYWdlRmlsdGVyRXh0ZW5zaW9uczsKLQkJYWRkUGFnZShuZXdGaWxlUGFnZSk7Ci0KLQkJaWYgKGdyYW1tYXJVUkkgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIHhtbCBmcm9tIHBhZ2UKLQkJCWZDcmVhdGVYTUxGcm9tV2l6YXJkUGFnZSA9IG5ldyBTdGFydFBhZ2UoIlN0YXJ0UGFnZSIsIGNyZWF0ZUZyb21SYWRpb0J1dHRvbkxhYmVsKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkJCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQkJCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkJCQlnZXRSYWRpb0J1dHRvbkF0SW5kZXgoZ2V0Q3JlYXRlTW9kZSgpKS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJCWdldFJhZGlvQnV0dG9uQXRJbmRleChnZXRDcmVhdGVNb2RlKCkpLnNldEZvY3VzKCk7Ci0KLQkJCQkJLy8gU2V0IHRoZSBoZWxwIGNvbnRleHQgZm9yIGVhY2ggYnV0dG9uCi0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZkNyZWF0ZVhNTEZyb21XaXphcmRQYWdlLmdldFJhZGlvQnV0dG9uQXRJbmRleCgwKSwgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfQ1JFQVRFWE1MMV9IRUxQSUQpOwotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGZDcmVhdGVYTUxGcm9tV2l6YXJkUGFnZS5nZXRSYWRpb0J1dHRvbkF0SW5kZXgoMSksIElYTUxXaXphcmRIZWxwQ29udGV4dElkcy5YTUxfTkVXV0laQVJEX0NSRUFURVhNTDJfSEVMUElEKTsKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChmQ3JlYXRlWE1MRnJvbVdpemFyZFBhZ2UuZ2V0UmFkaW9CdXR0b25BdEluZGV4KDIpLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9DUkVBVEVYTUwzX0hFTFBJRCk7Ci0JCQkJfQotCQkJfTsKLQotCi0JCQlmQ3JlYXRlWE1MRnJvbVdpemFyZFBhZ2Uuc2V0VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XSVpBUkRfQ1JFQVRFX1hNTF9IRUFESU5HKTsKLQkJCWZDcmVhdGVYTUxGcm9tV2l6YXJkUGFnZS5zZXREZXNjcmlwdGlvbihYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0VYUEwpOwotCQkJYWRkUGFnZShmQ3JlYXRlWE1MRnJvbVdpemFyZFBhZ2UpOwotCQl9Ci0KLQkJLy8gc2VsZWN0R3JhbW1hckZpbGVQYWdlCi0JCXNlbGVjdEdyYW1tYXJGaWxlUGFnZSA9IG5ldyBTZWxlY3RHcmFtbWFyRmlsZVBhZ2UoKTsKLQkJYWRkUGFnZShzZWxlY3RHcmFtbWFyRmlsZVBhZ2UpOwotCi0JCS8vIHNlbGVjdCByb290IGVsZW1lbnQgcGFnZQotCQlzZWxlY3RSb290RWxlbWVudFBhZ2UgPSBuZXcgU2VsZWN0Um9vdEVsZW1lbnRQYWdlKCk7Ci0JCXNlbGVjdFJvb3RFbGVtZW50UGFnZS5zZXRUaXRsZShYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9TRUxFQ1RfUk9PVF9IRUFESU5HKTsKLQkJc2VsZWN0Um9vdEVsZW1lbnRQYWdlLnNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX1NFTEVDVF9ST09UX0VYUEwpOwotCQlhZGRQYWdlKHNlbGVjdFJvb3RFbGVtZW50UGFnZSk7Ci0KLQkJLy8gZnJvbSAic2NyYXRjaCIKLQkJZk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2UgPSBuZXcgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZSgpOwotCQlhZGRQYWdlKGZOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlKTsKLQl9Ci0KLQotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRTdGFydGluZ1BhZ2UoKSB7Ci0JCVdpemFyZFBhZ2UgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHN0YXJ0UGFnZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBzdGFydFBhZ2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBuZXdGaWxlUGFnZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIGludCBnZXRDcmVhdGVNb2RlKCkgewotCQlTdHJpbmcgZ3JhbW1hclVSSSA9IGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCk7Ci0KLQkJaW50IHJlc3VsdCA9IENSRUFURV9GUk9NX1NDUkFUQ0g7Ci0JCWlmIChncmFtbWFyVVJJICE9IG51bGwpIHsKLQkJCWlmIChncmFtbWFyVVJJLmVuZHNXaXRoKCIuZHRkIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlyZXN1bHQgPSBDUkVBVEVfRlJPTV9EVEQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChncmFtbWFyVVJJLmVuZHNXaXRoKCIueHNkIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlyZXN1bHQgPSBDUkVBVEVfRlJPTV9YU0Q7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZkNyZWF0ZVhNTEZyb21XaXphcmRQYWdlICE9IG51bGwpIHsKLQkJCWludCBzZWxlY3RlZEluZGV4ID0gZkNyZWF0ZVhNTEZyb21XaXphcmRQYWdlLmdldFNlbGVjdGVkUmFkaW9CdXR0b25JbmRleCgpOwotCQkJaWYgKHNlbGVjdGVkSW5kZXggIT0gLTEpIHsKLQkJCQlyZXN1bHQgPSBzZWxlY3RlZEluZGV4OwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgY3VycmVudFBhZ2UpIHsKLQkJV2l6YXJkUGFnZSBuZXh0UGFnZSA9IG51bGw7Ci0JCWlmIChjdXJyZW50UGFnZSA9PSBzdGFydFBhZ2UpIHsKLQkJCW5leHRQYWdlID0gbmV3RmlsZVBhZ2U7Ci0JCX0KLQkJZWxzZSBpZiAoY3VycmVudFBhZ2UgPT0gbmV3RmlsZVBhZ2UpIHsKLQkJCWlmIChnZW5lcmF0b3IuZ2V0R3JhbW1hclVSSSgpID09IG51bGwpCi0JCQkJbmV4dFBhZ2UgPSBmQ3JlYXRlWE1MRnJvbVdpemFyZFBhZ2U7Ci0JCQllbHNlCi0JCQkJbmV4dFBhZ2UgPSBzZWxlY3RSb290RWxlbWVudFBhZ2U7Ci0JCX0KLQkJZWxzZSBpZiAoY3VycmVudFBhZ2UgPT0gZkNyZWF0ZVhNTEZyb21XaXphcmRQYWdlKSB7Ci0JCQlpZiAoZ2V0Q3JlYXRlTW9kZSgpID09IENSRUFURV9GUk9NX1NDUkFUQ0gpIHsKLQkJCQluZXh0UGFnZSA9IGZOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlOwotCQkJfQotCQkJZWxzZSBpZiAoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKSA9PSBudWxsKSB7Ci0JCQkJbmV4dFBhZ2UgPSBzZWxlY3RHcmFtbWFyRmlsZVBhZ2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluZXh0UGFnZSA9IHNlbGVjdFJvb3RFbGVtZW50UGFnZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChjdXJyZW50UGFnZSA9PSBzZWxlY3RHcmFtbWFyRmlsZVBhZ2UpIHsKLQkJCW5leHRQYWdlID0gc2VsZWN0Um9vdEVsZW1lbnRQYWdlOwotCQl9Ci0JCXJldHVybiBuZXh0UGFnZTsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlJV2l6YXJkUGFnZSBjdXJyZW50UGFnZSA9IGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCk7Ci0JCS8vIGNhbiBmaW5pc2ggb246IG5ldyBmaWxlIHBhZ2UsIGNyZWF0ZSBmcm9tICYgdGVtcGxhdGUgcGFnZSBpZiBjcmVhdGluZyBmcm9tIHNjcmF0Y2gsIHNlbGVjdCByb290IGVsZW1lbnQgcGFnZQotCQlpZiAoKGN1cnJlbnRQYWdlID09IG5ld0ZpbGVQYWdlICYmIGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCkgPT0gbnVsbCkgfHwgKGZDcmVhdGVYTUxGcm9tV2l6YXJkUGFnZSAhPSBudWxsICYmIGZDcmVhdGVYTUxGcm9tV2l6YXJkUGFnZS5nZXRTZWxlY3RlZFJhZGlvQnV0dG9uSW5kZXgoKSA9PSBDUkVBVEVfRlJPTV9TQ1JBVENIKSB8fCAoY3VycmVudFBhZ2UgPT0gc2VsZWN0Um9vdEVsZW1lbnRQYWdlKSkgewotCQkJcmVzdWx0ID0gY3VycmVudFBhZ2UuaXNQYWdlQ29tcGxldGUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtRmluaXNoKCk7Ci0JCS8vIHNhdmUgdXNlciBvcHRpb25zIGZvciBuZXh0IHVzZQotCQlmTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZS5zYXZlTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQkJCi0JCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7Ci0JCXRyeSB7Ci0KLQkJCVN0cmluZ1tdIG5hbWVzcGFjZUVycm9ycyA9IGdlbmVyYXRvci5nZXROYW1lc3BhY2VJbmZvRXJyb3JzKCk7Ci0JCQlpZiAobmFtZXNwYWNlRXJyb3JzICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBuYW1lc3BhY2VFcnJvcnNbMF07Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBuYW1lc3BhY2VFcnJvcnNbMV07Ci0JCQkJcmVzdWx0ID0gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotCQkJfQotCi0JCQlpZiAocmVzdWx0KSB7Ci0JCQkJZmlsZU5hbWUgPSBuZXdGaWxlUGFnZS5nZXRGaWxlTmFtZSgpOwotCQkJCWlmICgobmV3IFBhdGgoZmlsZU5hbWUpKS5nZXRGaWxlRXh0ZW5zaW9uKCkgPT0gbnVsbCkgewotCQkJCQluZXdGaWxlUGFnZS5zZXRGaWxlTmFtZShmaWxlTmFtZS5jb25jYXQobmV3RmlsZVBhZ2UuZGVmYXVsdEZpbGVFeHRlbnNpb24pKTsKLQkJCQl9Ci0KLQkJCQlmaW5hbCBJRmlsZSBuZXdGaWxlID0gbmV3RmlsZVBhZ2UuY3JlYXRlTmV3RmlsZSgpOwotCQkJCWZpbmFsIFN0cmluZyB4bWxGaWxlTmFtZSA9IG5ld0ZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQkJZmluYWwgU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSA9IGZpbGVOYW1lOwotCi0JCQkJaWYgKGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgPT0gc2VsZWN0Um9vdEVsZW1lbnRQYWdlKSB7Ci0KLQkJCQkJaW50IGxpbWl0ID0gc2VsZWN0Um9vdEVsZW1lbnRQYWdlLmdldE9wdGlvbmFsRWxlbWVudERlcHRoTGltaXQoKTsKLQkJCQkJZ2VuZXJhdG9yLnNldE9wdGlvbmFsRWxlbWVudERlcHRoTGltaXQobGltaXQpOwotCQkJCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQkJCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIGZhbHNlLCBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCl7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzayhYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9HRU5FUkFUSU5HX1hNTF9ET0NVTUVOVCwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlnZW5lcmF0b3IuY3JlYXRlWE1MRG9jdW1lbnQobmV3RmlsZSwgeG1sRmlsZU5hbWUpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIGNvbXBsZXRpbmcgTmV3IFhNTCB3aXphcmQgIiArIGdyYW1tYXJGaWxlTmFtZSwgZXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQlwcm9ncmVzc01vbml0b3IuZG9uZSgpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHB1dCB0ZW1wbGF0ZSBjb250ZW50cyBpbnRvIGZpbGUKLQkJCQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gZk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2UuZ2V0VGVtcGxhdGVTdHJpbmcoKTsKLQkJCQkJZ2VuZXJhdG9yLmNyZWF0ZVRlbXBsYXRlWE1MRG9jdW1lbnQobmV3RmlsZSwgdGVtcGxhdGVTdHJpbmcpOwotCQkJCX0KLQkJCQluZXdGaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJQmFzaWNOZXdSZXNvdXJjZVdpemFyZC5zZWxlY3RBbmRSZXZlYWwobmV3RmlsZSwgd29ya2JlbmNoV2luZG93KTsKLQkJCQlvcGVuRWRpdG9yKG5ld0ZpbGUpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIGNvbXBsZXRpbmcgTmV3IFhNTCB3aXphcmQgIiArIGZpbGVOYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbkVkaXRvcihJRmlsZSBmaWxlKSB7Ci0JCWxvbmcgbGVuZ3RoID0gMDsKLQkJSVBhdGggbG9jYXRpb24gPSBmaWxlLmdldExvY2F0aW9uKCk7Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQlGaWxlIGxvY2FsRmlsZSA9IGxvY2F0aW9uLnRvRmlsZSgpOwotCQkJbGVuZ3RoID0gbG9jYWxGaWxlLmxlbmd0aCgpOwotCQl9Ci0JCWlmKGxlbmd0aCA8IFhNTF9FRElUT1JfRklMRV9TSVpFX0xJTUlUKSB7Ci0JCQkvLyBPcGVuIGVkaXRvciBvbiBuZXcgZmlsZS4KLQkJCVN0cmluZyBlZGl0b3JJZCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCUlFZGl0b3JEZXNjcmlwdG9yIGVkaXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKS5nZXREZWZhdWx0RWRpdG9yKGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCksIGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCWVkaXRvcklkID0gZWRpdG9yLmdldElkKCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCQkvLyBlZGl0b3IgaWQgY291bGQgbm90IGJlIHJldHJpZXZlZCwgc28gd2UgY2FuIG5vdCBvcGVuIGVkaXRvcgotCQkJCXJldHVybjsKLQkJCX0KLQkJCUlXb3JrYmVuY2hXaW5kb3cgZHcgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJdHJ5IHsKLQkJCQlpZiAoZHcgIT0gbnVsbCkgewotCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gZHcuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJCQlwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgZWRpdG9ySWQsIHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBlZGl0b3IgY2FuIG5vdCBvcGVuIGZvciBzb21lIHJlYXNvbgotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0U3lzdGVtSWQoKSB7Ci0JCVN0cmluZyByZWxhdGl2ZVBhdGggPSAicGxhdGZvcm06L3Jlc291cmNlLyIgKyBuZXdGaWxlUGFnZS5nZXRDb250YWluZXJGdWxsUGF0aCgpLnRvU3RyaW5nKCkgKyAiL2R1bW15IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJldHVybiBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKSwgcmVsYXRpdmVQYXRoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFNlbGVjdEdyYW1tYXJGaWxlUGFnZQotCSAqLwotCWNsYXNzIFNlbGVjdEdyYW1tYXJGaWxlUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCQlwcm90ZWN0ZWQgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwgcGFuZWw7Ci0KLQkJU2VsZWN0R3JhbW1hckZpbGVQYWdlKCkgewotCQkJc3VwZXIoIlNlbGVjdEdyYW1tYXJGaWxlUGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIElYTUxXaXphcmRIZWxwQ29udGV4dElkcy5YTUxfTkVXV0laQVJEX1NFTEVDVFNPVVJDRV9IRUxQSUQpOwotCQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQkJcGFuZWwgPSBuZXcgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwoY29tcG9zaXRlKTsKLQkJCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCQlTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjb21wbGV0aW9uU3RhdGVDaGFuZ2VkKCkgewotCQkJCQl1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFuZWwuc2V0TGlzdGVuZXIobGlzdGVuZXIpOwotCQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQlpZiAodmlzaWJsZSkgewotCQkJCWlmIChnZXRDcmVhdGVNb2RlKCkgPT0gQ1JFQVRFX0ZST01fRFREKSB7Ci0JCQkJCXNldFRpdGxlKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX1NFTEVDVF9EVERfRklMRV9USVRMRSk7Ci0JCQkJCXNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX1NFTEVDVF9EVERfRklMRV9ERVNDKTsKLQkJCQkJcGFuZWwuc2V0RmlsdGVyRXh0ZW5zaW9ucyhicm93c2VEVERGaWx0ZXJFeHRlbnNpb25zKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNldFRpdGxlKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX1NFTEVDVF9YU0RfRklMRV9USVRMRSk7Ci0JCQkJCXNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX1NFTEVDVF9YU0RfRklMRV9ERVNDKTsKLQkJCQkJcGFuZWwuc2V0RmlsdGVyRXh0ZW5zaW9ucyhicm93c2VYU0RGaWx0ZXJFeHRlbnNpb25zKTsKLQkJCQl9Ci0JCQkJZ2VuZXJhdG9yLnNldEdyYW1tYXJVUkkobnVsbCk7Ci0JCQkJZ2VuZXJhdG9yLnNldENNRG9jdW1lbnQobnVsbCk7Ci0JCQkJY21Eb2N1bWVudEVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCQl9Ci0JCQlwYW5lbC5zZXRWaXNpYmxlSGVscGVyKHZpc2libGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCQlTdHJpbmcgdXJpID0gcGFuZWwuZ2V0WE1MQ2F0YWxvZ1VSSSgpOwotCQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IHBhbmVsLmdldEZpbGUoKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXVyaSA9IFVSSUhlbHBlci5nZXRQbGF0Zm9ybVVSSShmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdXJpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCQlyZXR1cm4gKGdldFVSSSgpICE9IG51bGwpICYmIChnZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0WE1MQ2F0YWxvZ0lkKCkgewotCQkJcmV0dXJuIHBhbmVsLmdldFhNTENhdGFsb2dJZCgpOwotCQl9Ci0KLQkJcHVibGljIElDYXRhbG9nRW50cnkgZ2V0WE1MQ2F0YWxvZ0VudHJ5KCkgewotCQkJcmV0dXJuIHBhbmVsLmdldFhNTENhdGFsb2dFbnRyeSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBjb21wdXRlRXJyb3JNZXNzYWdlKCkgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCQlTdHJpbmcgdXJpID0gZ2V0VVJJKCk7Ci0JCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQlpZiAoIVVSSUhlbHBlci5pc1JlYWRhYmxlVVJJKHVyaSwgZmFsc2UpKSB7Ci0JCQkJCWVycm9yTWVzc2FnZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfTEFCRUxfRVJST1JfQ0FUQUxPR19FTlRSWV9JTlZBTElEOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JCX0KLQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBjb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogU2VsZWN0Um9vdEVsZW1lbnRQYWdlCi0JICovCi0JY2xhc3MgU2VsZWN0Um9vdEVsZW1lbnRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIENvbWJvIGNvbWJvOwotCQlwcm90ZWN0ZWQgQnV0dG9uW10gcmFkaW9CdXR0b247Ci0JCXByb3RlY3RlZCBQYWdlQm9vayBwYWdlQm9vazsKLQkJcHJvdGVjdGVkIFhTRE9wdGlvbnNQYW5lbCB4c2RPcHRpb25zUGFuZWw7Ci0JCXByb3RlY3RlZCBEVERPcHRpb25zUGFuZWwgZHRkT3B0aW9uc1BhbmVsOwotCQlwcm90ZWN0ZWQgVGV4dCBsaW1pdE9wdGlvbmFsRWxlbWVudERlcHRoVGV4dENvbnRyb2w7Ci0JCXByb3RlY3RlZCBCdXR0b24gbGltaXRPcHRpb25hbEVsZW1lbnREZXB0aENoZWNrQnV0dG9uQ29udHJvbDsKLQkJIAotCi0KLQkJU2VsZWN0Um9vdEVsZW1lbnRQYWdlKCkgewotCQkJc3VwZXIoIlNlbGVjdFJvb3RFbGVtZW50UGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCS8vIGNvbnRhaW5lciBncm91cAotCQkJQ29tcG9zaXRlIGNvbnRhaW5lckdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29udGFpbmVyR3JvdXAsIElYTUxXaXphcmRIZWxwQ29udGV4dElkcy5YTUxfTkVXV0laQVJEX1NFTEVDVFJPT1RFTEVNRU5UX0hFTFBJRCk7Ci0JCQljb250YWluZXJHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQljb250YWluZXJHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCXNldENvbnRyb2woY29udGFpbmVyR3JvdXApOwotCi0JCQkvLyBzZWxlY3Qgcm9vdCBlbGVtZW50Ci0JCQlMYWJlbCBjb250YWluZXJMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXJHcm91cCwgU1dULk5PTkUpOwotCQkJY29udGFpbmVyTGFiZWwuc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0xBQkVMX1JPT1RfRUxFTUVOVCk7Ci0JCQljb21ibyA9IG5ldyBDb21ibyhjb250YWluZXJHcm91cCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQkJY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkJLy8gT3B0aW9ucwotCQkJewotCQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbnRhaW5lckdyb3VwLCBTV1QuTk9ORSk7Ci0JCQkJZ3JvdXAuc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9DT05URU5UX09QVElPTlMpOwotCi0JCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCQkJcmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uWzRdOwotCi0JCQkJcmFkaW9CdXR0b25bMF0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQkJCXJhZGlvQnV0dG9uWzBdLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMX0FUVFJJQlVURVMpOwotCQkJCXJhZGlvQnV0dG9uWzBdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCXJhZGlvQnV0dG9uWzBdLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyYWRpb0J1dHRvblswXSwgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQxX0hFTFBJRCk7Ci0KLQkJCQlyYWRpb0J1dHRvblsxXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCQkJcmFkaW9CdXR0b25bMV0uc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUxfRUxFTUVOVFMpOwotCQkJCXJhZGlvQnV0dG9uWzFdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCXJhZGlvQnV0dG9uWzFdLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyYWRpb0J1dHRvblsxXSwgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQyX0hFTFBJRCk7Ci0KLQkJCQlyYWRpb0J1dHRvblsxXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZWxlY3Rpb25FdmVudCkgewotCQkJCQkJYm9vbGVhbiBlbmFibGVkID0gcmFkaW9CdXR0b25bMV0uZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlsaW1pdE9wdGlvbmFsRWxlbWVudERlcHRoQ2hlY2tCdXR0b25Db250cm9sLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJCQllbmFibGVkID0gZW5hYmxlZCAmJiBsaW1pdE9wdGlvbmFsRWxlbWVudERlcHRoQ2hlY2tCdXR0b25Db250cm9sLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbGltaXRPcHRpb25hbEVsZW1lbnREZXB0aFRleHRDb250cm9sLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShncm91cCwgU1dULk5PTkUpOwotCQkJCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCQkJZ3JpZExheW91dC5tYXJnaW5MZWZ0ID0gMjA7Ci0JCQkJY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJCQlsaW1pdE9wdGlvbmFsRWxlbWVudERlcHRoQ2hlY2tCdXR0b25Db250cm9sID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCQkJbGltaXRPcHRpb25hbEVsZW1lbnREZXB0aENoZWNrQnV0dG9uQ29udHJvbC5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0xJTUlUX09QVElPTkFMX0VMRU1FTlRfREVQVEgpOwotCQkJCWxpbWl0T3B0aW9uYWxFbGVtZW50RGVwdGhDaGVja0J1dHRvbkNvbnRyb2wuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJbGltaXRPcHRpb25hbEVsZW1lbnREZXB0aENoZWNrQnV0dG9uQ29udHJvbC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJbGltaXRPcHRpb25hbEVsZW1lbnREZXB0aENoZWNrQnV0dG9uQ29udHJvbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZWxlY3Rpb25FdmVudCkgewotCQkJCQkJYm9vbGVhbiBlbmFibGVkID0gbGltaXRPcHRpb25hbEVsZW1lbnREZXB0aENoZWNrQnV0dG9uQ29udHJvbC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWxpbWl0T3B0aW9uYWxFbGVtZW50RGVwdGhUZXh0Q29udHJvbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJbGltaXRPcHRpb25hbEVsZW1lbnREZXB0aFRleHRDb250cm9sID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQlsaW1pdE9wdGlvbmFsRWxlbWVudERlcHRoVGV4dENvbnRyb2wuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKE9QVElPTkFMX0VMRU1FTlRfREVQVEhfTElNSVRfREVGQVVMVF9WQUxVRSkpOwotCQkJCWxpbWl0T3B0aW9uYWxFbGVtZW50RGVwdGhUZXh0Q29udHJvbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlHcmlkRGF0YSBncmlkYURhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCQlncmlkYURhdGEud2lkdGhIaW50ID0gMjU7Ci0JCQkJbGltaXRPcHRpb25hbEVsZW1lbnREZXB0aFRleHRDb250cm9sLnNldExheW91dERhdGEoZ3JpZGFEYXRhKTsKLQkJCQlsaW1pdE9wdGlvbmFsRWxlbWVudERlcHRoVGV4dENvbnRyb2wuYWRkTGlzdGVuZXIoU1dULlZlcmlmeSwgbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQkJU3RyaW5nIHN0cmluZyA9IGV2ZW50LnRleHQ7Ci0JCQkJCQljaGFyW10gY2hhcnMgPSBuZXcgY2hhcltzdHJpbmcubGVuZ3RoKCldOwotCQkJCQkJc3RyaW5nLmdldENoYXJzKDAsIGNoYXJzLmxlbmd0aCwgY2hhcnMsIDApOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWlmICghKCcwJyA8PSBjaGFyc1tpXSAmJiBjaGFyc1tpXSA8PSAnOScpKSB7Ci0JCQkJCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJCQotCQkJCXJhZGlvQnV0dG9uWzJdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJCQlyYWRpb0J1dHRvblsyXS5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NSRUFURV9GSVJTVF9DSE9JQ0UpOwotCQkJCXJhZGlvQnV0dG9uWzJdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCXJhZGlvQnV0dG9uWzJdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhZGlvQnV0dG9uWzJdLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDNfSEVMUElEKTsKLQotCQkJCXJhZGlvQnV0dG9uWzNdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJCQlyYWRpb0J1dHRvblszXS5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0ZJTExfRUxFTUVOVFNfQU5EX0FUVFJJQlVURVMpOwotCQkJCXJhZGlvQnV0dG9uWzNdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCXJhZGlvQnV0dG9uWzNdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhZGlvQnV0dG9uWzNdLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDRfSEVMUElEKTsKLQkJCQkvKgotCQkJCSAqIHJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvblsyXTsKLQkJCQkgKiAKLQkJCQkgKiByYWRpb0J1dHRvblswXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCQkJICogcmFkaW9CdXR0b25bMF0uc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuZ2V0U3RyaW5nKCJfVUlfV0laQVJEX0NSRUFURV9SRVFVSVJFRCIpKTsKLQkJCQkgKiByYWRpb0J1dHRvblswXS5zZXRMYXlvdXREYXRhKG5ldwotCQkJCSAqIEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCSAqIHJhZGlvQnV0dG9uWzBdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQkgKiBXb3JrYmVuY2hIZWxwLnNldEhlbHAocmFkaW9CdXR0b25bMF0sCi0JCQkJICogWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MQ19DUkVBVEVfUkVRVUlSRURfT05MWSk7Ci0JCQkJICogCi0JCQkJICogcmFkaW9CdXR0b25bMV0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQkJCSAqIHJhZGlvQnV0dG9uWzFdLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLmdldFN0cmluZygiX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUwiKSk7Ci0JCQkJICogcmFkaW9CdXR0b25bMV0uc2V0TGF5b3V0RGF0YShuZXcKLQkJCQkgKiBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCQkgKiBXb3JrYmVuY2hIZWxwLnNldEhlbHAocmFkaW9CdXR0b25bMV0sCi0JCQkJICogWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MQ19DUkVBVEVfUkVRVUlSRURfQU5EX09QVElPTik7Ci0JCQkJICovCi0JCQl9Ci0KLQkJCS8vIGFkZCB0aGUgZ3JhbW1hciBzcGVjaWZpYyBnZW5lcmF0aW9uIG9wdGlvbnMKLQkJCS8vCi0JCQl7Ci0JCQkJcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soY29udGFpbmVyR3JvdXAsIFNXVC5OT05FKTsKLQkJCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCQl4c2RPcHRpb25zUGFuZWwgPSBuZXcgWFNET3B0aW9uc1BhbmVsKHRoaXMsIHBhZ2VCb29rKTsKLQkJCQlkdGRPcHRpb25zUGFuZWwgPSBuZXcgRFRET3B0aW9uc1BhbmVsKHRoaXMsIHBhZ2VCb29rKTsKLQkJCQlwYWdlQm9vay5zaG93UGFnZSh4c2RPcHRpb25zUGFuZWwpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQlTdHJpbmcgcm9vdEVsZW1lbnROYW1lID0gKGluZGV4ICE9IC0xKSA/IGNvbWJvLmdldEl0ZW0oaW5kZXgpIDogbnVsbDsKLQkJCWdlbmVyYXRvci5zZXRSb290RWxlbWVudE5hbWUocm9vdEVsZW1lbnROYW1lKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0KLQkJCWlmICh2aXNpYmxlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCkgPT0gbnVsbCkgewotCQkJCQkJZ2VuZXJhdG9yLnNldEdyYW1tYXJVUkkoc2VsZWN0R3JhbW1hckZpbGVQYWdlLmdldFVSSSgpKTsKLQkJCQkJCWdlbmVyYXRvci5zZXRYTUxDYXRhbG9nRW50cnkoc2VsZWN0R3JhbW1hckZpbGVQYWdlLmdldFhNTENhdGFsb2dFbnRyeSgpKTsKLQkJCQkJfQotCQkJCQlBc3NlcnQuaXNOb3ROdWxsKGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCkpOwotCi0JCQkJCWlmIChnZW5lcmF0b3IuZ2V0Q01Eb2N1bWVudCgpID09IG51bGwpIHsKLQkJCQkJCWZpbmFsIFN0cmluZ1tdIGVycm9ySW5mbyA9IG5ldyBTdHJpbmdbMl07Ci0JCQkJCQlmaW5hbCBDTURvY3VtZW50W10gY21kb2NzID0gbmV3IENNRG9jdW1lbnRbMV07Ci0JCQkJCQlSdW5uYWJsZSByID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJY21kb2NzWzBdID0gTmV3WE1MR2VuZXJhdG9yLmNyZWF0ZUNNRG9jdW1lbnQoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKSwgZXJyb3JJbmZvKTsKLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQkJb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgcik7Ci0KLQkJCQkJCWdlbmVyYXRvci5zZXRDTURvY3VtZW50KGNtZG9jc1swXSk7Ci0JCQkJCQljbURvY3VtZW50RXJyb3JNZXNzYWdlID0gZXJyb3JJbmZvWzFdOwotCQkJCQl9Ci0KLQkJCQkJY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJCWlmICgoZ2VuZXJhdG9yLmdldENNRG9jdW1lbnQoKSAhPSBudWxsKSAmJiAoY21Eb2N1bWVudEVycm9yTWVzc2FnZSA9PSBudWxsKSkgewotCQkJCQkJQ01OYW1lZE5vZGVNYXAgbmFtZU5vZGVNYXAgPSBnZW5lcmF0b3IuZ2V0Q01Eb2N1bWVudCgpLmdldEVsZW1lbnRzKCk7Ci0JCQkJCQlWZWN0b3IgbmFtZU5vZGVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZU5vZGVNYXAuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGNtRWxlbWVudERlY2xhcmF0aW9uID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBuYW1lTm9kZU1hcC5pdGVtKGkpOwotCQkJCQkJCU9iamVjdCB2YWx1ZSA9IGNtRWxlbWVudERlY2xhcmF0aW9uLmdldFByb3BlcnR5KCJBYnN0cmFjdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKHZhbHVlICE9IEJvb2xlYW4uVFJVRSkgewotCQkJCQkJCQluYW1lTm9kZVZlY3Rvci5hZGQoY21FbGVtZW50RGVjbGFyYXRpb24uZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlPYmplY3RbXSBuYW1lTm9kZUFycmF5ID0gbmFtZU5vZGVWZWN0b3IudG9BcnJheSgpOwotCQkJCQkJaWYgKG5hbWVOb2RlQXJyYXkubGVuZ3RoID4gMCkgewotCQkJCQkJCUFycmF5cy5zb3J0KG5hbWVOb2RlQXJyYXksIENvbGxhdG9yLmdldEluc3RhbmNlKCkpOwotCQkJCQkJfQotCi0JCQkJCQlTdHJpbmcgZGVmYXVsdFJvb3ROYW1lID0gKFN0cmluZykgKGdlbmVyYXRvci5nZXRDTURvY3VtZW50KCkpLmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZGVmYXVsdFJvb3ROYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWludCBkZWZhdWx0Um9vdEluZGV4ID0gLTE7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVOb2RlQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSAoU3RyaW5nKSBuYW1lTm9kZUFycmF5W2ldOwotCi0JCQkJCQkJY29tYm8uYWRkKGVsZW1lbnROYW1lKTsKLQkJCQkJCQlpZiAoKGRlZmF1bHRSb290TmFtZSAhPSBudWxsKSAmJiBkZWZhdWx0Um9vdE5hbWUuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotCQkJCQkJCQlkZWZhdWx0Um9vdEluZGV4ID0gaTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChuYW1lTm9kZUFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCQkJCQlkZWZhdWx0Um9vdEluZGV4ID0gZGVmYXVsdFJvb3RJbmRleCAhPSAtMSA/IGRlZmF1bHRSb290SW5kZXggOiAwOwotCQkJCQkJCWNvbWJvLnNlbGVjdChkZWZhdWx0Um9vdEluZGV4KTsKLQkJCQkJCQlnZW5lcmF0b3Iuc2V0Um9vdEVsZW1lbnROYW1lKGNvbWJvLmdldEl0ZW0oZGVmYXVsdFJvb3RJbmRleCkpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCkuZW5kc1dpdGgoInhzZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXsKLQkJCQkJCXBhZ2VCb29rLnNob3dQYWdlKHhzZE9wdGlvbnNQYW5lbCk7Ci0JCQkJCQlnZW5lcmF0b3Iuc2V0RGVmYXVsdFN5c3RlbUlkKGdldERlZmF1bHRTeXN0ZW1JZCgpKTsKLQkJCQkJCWdlbmVyYXRvci5jcmVhdGVOYW1lc3BhY2VJbmZvTGlzdCgpOwotCi0JCQkJCQkvLyBQcm92aWRlIGRlZmF1bHQgbmFtZXNwYWNlIHByZWZpeCBpZiBub25lCi0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGdlbmVyYXRvci5uYW1lc3BhY2VJbmZvTGlzdC5zaXplKCk7IGkrKykgewotCQkJCQkJCU5hbWVzcGFjZUluZm8gbnNpbmZvID0gKE5hbWVzcGFjZUluZm8pIGdlbmVyYXRvci5uYW1lc3BhY2VJbmZvTGlzdC5nZXQoaSk7Ci0JCQkJCQkJaWYgKCgobnNpbmZvLnByZWZpeCA9PSBudWxsKSB8fCAobnNpbmZvLnByZWZpeC50cmltKCkubGVuZ3RoKCkgPT0gMCkpICYmICgobnNpbmZvLnVyaSAhPSBudWxsKSAmJiAobnNpbmZvLnVyaS50cmltKCkubGVuZ3RoKCkgIT0gMCkpKSB7Ci0JCQkJCQkJCW5zaW5mby5wcmVmaXggPSBnZXREZWZhdWx0UHJlZml4KGdlbmVyYXRvci5uYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJeHNkT3B0aW9uc1BhbmVsLnNldE5hbWVzcGFjZUluZm9MaXN0KGdlbmVyYXRvci5uYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKS5lbmRzV2l0aCgiZHRkIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJcGFnZUJvb2suc2hvd1BhZ2UoZHRkT3B0aW9uc1BhbmVsKTsKLQkJCQkJCWR0ZE9wdGlvbnNQYW5lbC51cGRhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gWE1MQnVpbGRlclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZUN1cnJlbnRUaHJlYWQoKTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBjb21wdXRlRXJyb3JNZXNzYWdlKCk7IGlmCi0JCQkJICogKGVycm9yTWVzc2FnZSA9PSBudWxsKSBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkJCSAqLwotCi0JCQkJdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0UHJlZml4KExpc3QgbnNJbmZvTGlzdCkgewotCQkJU3RyaW5nIGRlZmF1bHRQcmVmaXggPSAicCI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChuc0luZm9MaXN0ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdFByZWZpeDsKLQkJCX0KLQotCQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5zSW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlOYW1lc3BhY2VJbmZvIG5zaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBuc0luZm9MaXN0LmdldChpKTsKLQkJCQlpZiAobnNpbmZvLnByZWZpeCAhPSBudWxsKSB7Ci0JCQkJCXYuYWRkRWxlbWVudChuc2luZm8ucHJlZml4KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICh2LmNvbnRhaW5zKGRlZmF1bHRQcmVmaXgpKSB7Ci0JCQkJU3RyaW5nIHMgPSBkZWZhdWx0UHJlZml4OwotCQkJCWZvciAoaW50IGogPSAwOyB2LmNvbnRhaW5zKHMpOyBqKyspIHsKLQkJCQkJcyA9IGRlZmF1bHRQcmVmaXggKyBJbnRlZ2VyLnRvU3RyaW5nKGopOwotCQkJCX0KLQkJCQlyZXR1cm4gczsKLQkJCX0KLQkJCXJldHVybiBkZWZhdWx0UHJlZml4OwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGdldE9wdGlvbmFsRWxlbWVudERlcHRoTGltaXQoKSB7Ci0JCQlpbnQgZGVwdGggPSAtMTsKLQkJCWlmKHJhZGlvQnV0dG9uWzFdLmdldFNlbGVjdGlvbigpICYmIGxpbWl0T3B0aW9uYWxFbGVtZW50RGVwdGhDaGVja0J1dHRvbkNvbnRyb2wuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQl0cnkgewotCQkJCQlkZXB0aCA9IEludGVnZXIucGFyc2VJbnQobGltaXRPcHRpb25hbEVsZW1lbnREZXB0aFRleHRDb250cm9sLmdldFRleHQoKSk7Ci0JCQkJfSBjYXRjaCggRXhjZXB0aW9uIGV4Y2VwdGlvbikge30KLQkJCX0KLQkJCXJldHVybiBkZXB0aDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQkJYm9vbGVhbiBjb21wbGV0ZSA9ICgoZ2VuZXJhdG9yLmdldFJvb3RFbGVtZW50TmFtZSgpICE9IG51bGwpICYmIChnZW5lcmF0b3IuZ2V0Um9vdEVsZW1lbnROYW1lKCkubGVuZ3RoKCkgPiAwKSkgJiYgKGdldEVycm9yTWVzc2FnZSgpID09IG51bGwpOwotCi0JCQlpZiAoY29tcGxldGUpIHsKLQkJCQkvKgotCQkJCSAqIGludCBidWlsZFBvbGljeSA9IHJhZGlvQnV0dG9uWzBdLmdldFNlbGVjdGlvbigpID8KLQkJCQkgKiBET01Db250ZW50QnVpbGRlci5CVUlMRF9PTkxZX1JFUVVJUkVEX0NPTlRFTlQgOgotCQkJCSAqIERPTUNvbnRlbnRCdWlsZGVyLkJVSUxEX0FMTF9DT05URU5UOwotCQkJCSAqLwotCQkJCWludCBidWlsZFBvbGljeSA9IDA7Ci0JCQkJaWYgKHJhZGlvQnV0dG9uWzBdLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCWJ1aWxkUG9saWN5ID0gYnVpbGRQb2xpY3kgfCBET01Db250ZW50QnVpbGRlci5CVUlMRF9PUFRJT05BTF9BVFRSSUJVVEVTOwotCQkJCX0KLQkJCQlpZiAocmFkaW9CdXR0b25bMV0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJYnVpbGRQb2xpY3kgPSBidWlsZFBvbGljeSB8IERPTUNvbnRlbnRCdWlsZGVyLkJVSUxEX09QVElPTkFMX0VMRU1FTlRTOwotCQkJCX0KLQkJCQlpZiAocmFkaW9CdXR0b25bMl0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJYnVpbGRQb2xpY3kgPSBidWlsZFBvbGljeSB8IERPTUNvbnRlbnRCdWlsZGVyLkJVSUxEX0ZJUlNUX0NIT0lDRSB8IERPTUNvbnRlbnRCdWlsZGVyLkJVSUxEX0ZJUlNUX1NVQlNUSVRVVElPTjsKLQkJCQl9Ci0JCQkJaWYgKHJhZGlvQnV0dG9uWzNdLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCWJ1aWxkUG9saWN5ID0gYnVpbGRQb2xpY3kgfCBET01Db250ZW50QnVpbGRlci5CVUlMRF9URVhUX05PREVTOwotCQkJCX0KLQotCQkJCWdlbmVyYXRvci5zZXRCdWlsZFBvbGljeShidWlsZFBvbGljeSk7Ci0JCQl9Ci0KLQkJCXJldHVybiBjb21wbGV0ZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCi0JCQlpZiAoY21Eb2N1bWVudEVycm9yTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gY21Eb2N1bWVudEVycm9yTWVzc2FnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKChnZW5lcmF0b3IuZ2V0Um9vdEVsZW1lbnROYW1lKCkgPT0gbnVsbCkgfHwgKGdlbmVyYXRvci5nZXRSb290RWxlbWVudE5hbWUoKS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCWVycm9yTWVzc2FnZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fRVJST1JfUk9PVF9FTEVNRU5UX01VU1RfQkVfU1BFQ0lGSUVEOwotCQkJfQotCi0JCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwotCQl9Ci0KLQotCQlwdWJsaWMgdm9pZCB1cGRhdGVFcnJvck1lc3NhZ2UoKSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gY29tcHV0ZUVycm9yTWVzc2FnZSgpOwotCQkJaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsKSB7Ci0JCQkJaWYgKHhzZE9wdGlvbnNQYW5lbC5pc1Zpc2libGUoKSkgewotCi0JCQkJCWVycm9yTWVzc2FnZSA9IHhzZE9wdGlvbnNQYW5lbC5jb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGR0ZE9wdGlvbnNQYW5lbC5pc1Zpc2libGUoKSkgewotCQkJCQllcnJvck1lc3NhZ2UgPSBkdGRPcHRpb25zUGFuZWwuY29tcHV0ZUVycm9yTWVzc2FnZSgpOwotCQkJCX0KLQkJCX0KLQkJCXNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQl9Ci0JfQotCi0JLy8gLy8vLy8vLy8vLy8vLy9FbmQgU2VsZWN0Um9vdEVsZW1lbnRQYWdlCi0KLQotCi0JcHVibGljIHN0YXRpYyBHcmlkTGF5b3V0IGNyZWF0ZU9wdGlvbnNQYW5lbExheW91dCgpIHsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQlyZXR1cm4gZ3JpZExheW91dDsKLQl9Ci0KLQotCi0JLyoqCi0JICogCi0JICovCi0JY2xhc3MgWFNET3B0aW9uc1BhbmVsIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQkJcHJvdGVjdGVkIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCQlwcm90ZWN0ZWQgU2VsZWN0Um9vdEVsZW1lbnRQYWdlIHBhcmVudFBhZ2U7Ci0JCXByb3RlY3RlZCBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyBlZGl0TmFtZXNwYWNlczsKLQkJcHJpdmF0ZSBJUGF0aCBjdXJyZW50UGF0aCA9IG51bGw7Ci0KLQkJcHVibGljIFhTRE9wdGlvbnNQYW5lbChTZWxlY3RSb290RWxlbWVudFBhZ2UgcGFyZW50UGFnZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQl0aGlzLnBhcmVudFBhZ2UgPSBwYXJlbnRQYWdlOwotCi0JCQlzZXRMYXlvdXQoY3JlYXRlT3B0aW9uc1BhbmVsTGF5b3V0KCkpOwotCQkJc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cgZ2V0RWRpdE5hbWVzcGFjZXMoKSB7Ci0JCQlpZiAoZWRpdE5hbWVzcGFjZXMgPT0gbnVsbCkgewotCQkJCUNvbXBvc2l0ZSBjbyA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotCQkJCWNvLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCQlTdHJpbmcgdGFibGVUaXRsZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRVNQQUNFX0lORk9STUFUSU9OOwotCQkJCWVkaXROYW1lc3BhY2VzID0gbmV3IENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nKGNvLCBudWxsLCB0YWJsZVRpdGxlLCB0cnVlLCB0cnVlKTsKLQkJCQl0aGlzLmxheW91dCgpOwotCQkJfQotCQkJcmV0dXJuIGVkaXROYW1lc3BhY2VzOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlSW5mb0xpc3QoTGlzdCBsaXN0KSB7Ci0JCQlDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyBlZGl0RGlhbG9nID0gZ2V0RWRpdE5hbWVzcGFjZXMoKTsKLQkJCQotCQkgICAgaWYgKG5ld0ZpbGVQYWdlICE9IG51bGwpIHsKLQkJICAgICAgSVBhdGggbmV3UGF0aCA9IG5ld0ZpbGVQYWdlLmdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0JCSAgICAgIGlmIChuZXdQYXRoICE9IG51bGwpIHsKLQkJICAgICAgICBpZiAoIW5ld1BhdGguZXF1YWxzKGN1cnJlbnRQYXRoKSkgewotCSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VVUkkgPSAicGxhdGZvcm06L3Jlc291cmNlIiArIG5ld1BhdGgudG9TdHJpbmcoKSArICIvZHVtbXkiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkgICAgICAgICAgICAgICAgU3RyaW5nIHJlc29sdmVkUGF0aCA9IFVSSUhlbHBlci5ub3JtYWxpemUocmVzb3VyY2VVUkksIG51bGwsIG51bGwpOwotCSAgICAgICAgICAgICAgICByZXNvbHZlZFBhdGggPSBVUklIZWxwZXIucmVtb3ZlUHJvdG9jb2wocmVzb2x2ZWRQYXRoKTsKLQkgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gbmV3IFBhdGgocmVzb2x2ZWRQYXRoKTsKLQkgICAgICAgICAgICAgICAgZWRpdERpYWxvZy5zZXRSZXNvdXJjZVBhdGgoY3VycmVudFBhdGgpOwotCQkgICAgICAgIH0KLQkJICAgICAgfQotCQkgICAgfQotCQkgICAgZWRpdERpYWxvZy5zZXROYW1lc3BhY2VJbmZvTGlzdChsaXN0KTsKLQkJICAgIGVkaXREaWFsb2cudXBkYXRlRXJyb3JNZXNzYWdlKGxpc3QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKExpc3QgbmFtZXNwYWNlSW5mb0xpc3QpIHsKLQkJCU5hbWVzcGFjZUluZm9FcnJvckhlbHBlciBoZWxwZXIgPSBuZXcgTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyKCk7Ci0JCQllcnJvck1lc3NhZ2UgPSBoZWxwZXIuY29tcHV0ZUVycm9yTWVzc2FnZShuYW1lc3BhY2VJbmZvTGlzdCwgbnVsbCk7Ci0JCQlwYXJlbnRQYWdlLnVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCQl9Ci0KLQotCQlwdWJsaWMgU3RyaW5nIGNvbXB1dGVFcnJvck1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRFRET3B0aW9uc1BhbmVsIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgR3JvdXAgZ3JvdXA7Ci0JCXByb3RlY3RlZCBUZXh0IHN5c3RlbUlkRmllbGQ7Ci0JCXByb3RlY3RlZCBUZXh0IHB1YmxpY0lkRmllbGQ7Ci0JCXByb3RlY3RlZCBTZWxlY3RSb290RWxlbWVudFBhZ2UgcGFyZW50UGFnZTsKLQotCQlwdWJsaWMgRFRET3B0aW9uc1BhbmVsKFNlbGVjdFJvb3RFbGVtZW50UGFnZSBwYXJlbnRQYWdlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCXRoaXMucGFyZW50UGFnZSA9IHBhcmVudFBhZ2U7Ci0JCQlzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkJc2V0TGF5b3V0KGNyZWF0ZU9wdGlvbnNQYW5lbExheW91dCgpKTsKLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9ET0NUWVBFX0lORk9STUFUSU9OKTsKLQotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkJTGFiZWwgcHVibGljSWRMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJcHVibGljSWRMYWJlbC5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfTEFCRUxfUFVCTElDX0lEKTsKLQkJCXB1YmxpY0lkRmllbGQgPSBuZXcgVGV4dChncm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJcHVibGljSWRGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCXB1YmxpY0lkRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHB1YmxpY0lkRmllbGQsIElYTUxXaXphcmRIZWxwQ29udGV4dElkcy5YTUxfTkVXV0laQVJEX1NFTEVDVFJPT1RFTEVNRU5UNV9IRUxQSUQpOwotCi0JCQlMYWJlbCBzeXN0ZW1JZExhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlzeXN0ZW1JZExhYmVsLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9TWVNURU1fSUQpOwotCQkJc3lzdGVtSWRGaWVsZCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlzeXN0ZW1JZEZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJc3lzdGVtSWRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc3lzdGVtSWRGaWVsZCwgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQ2X0hFTFBJRCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCQlTdHJpbmcgdGhlUHVibGljSWQgPSBudWxsOwotCQkJU3RyaW5nIHRoZVN5c3RlbUlkID0gbnVsbDsKLQkJCUlDYXRhbG9nRW50cnkgeG1sQ2F0YWxvZ0VudHJ5ID0gZ2VuZXJhdG9yLmdldFhNTENhdGFsb2dFbnRyeSgpOwotCi0JCQlpZiAoeG1sQ2F0YWxvZ0VudHJ5ICE9IG51bGwpIHsKLQkJCQlpZiAoeG1sQ2F0YWxvZ0VudHJ5LmdldEVudHJ5VHlwZSgpID09IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUMpIHsKLQkJCQkJdGhlUHVibGljSWQgPSB4bWxDYXRhbG9nRW50cnkuZ2V0S2V5KCk7Ci0JCQkJCXRoZVN5c3RlbUlkID0geG1sQ2F0YWxvZ0VudHJ5LmdldEF0dHJpYnV0ZVZhbHVlKElDYXRhbG9nRW50cnkuQVRUUl9XRUJfVVJMKTsKLQkJCQkJaWYgKHRoZVN5c3RlbUlkID09IG51bGwpIHsKLQkJCQkJCXRoZVN5c3RlbUlkID0gZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKS5zdGFydHNXaXRoKCJodHRwOiIpID8gZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKSA6IFVSSUhlbHBlci5nZXRMYXN0U2VnbWVudChnZW5lcmF0b3IuZ2V0R3JhbW1hclVSSSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0aGVTeXN0ZW1JZCA9IHhtbENhdGFsb2dFbnRyeS5nZXRLZXkoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGVTeXN0ZW1JZCA9IGdldERlZmF1bHRTeXN0ZW1JZCgpOwotCQkJfQotCi0JCQlwdWJsaWNJZEZpZWxkLnNldFRleHQodGhlUHVibGljSWQgIT0gbnVsbCA/IHRoZVB1YmxpY0lkIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCQlzeXN0ZW1JZEZpZWxkLnNldFRleHQodGhlU3lzdGVtSWQgIT0gbnVsbCA/IHRoZVN5c3RlbUlkIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWdlbmVyYXRvci5zZXRTeXN0ZW1JZChzeXN0ZW1JZEZpZWxkLmdldFRleHQoKSk7Ci0JCQlnZW5lcmF0b3Iuc2V0UHVibGljSWQocHVibGljSWRGaWVsZC5nZXRUZXh0KCkpOwotCQkJcGFyZW50UGFnZS51cGRhdGVFcnJvck1lc3NhZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MSW1wb3J0QWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MSW1wb3J0QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI5MjNjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTEltcG9ydEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8vIFRPRE8gY3MuLi4gcmVuYW1lIHRoaXMgY2xhc3MgTmV3WE1MQWN0aW9uRGVsZWdhdGUKLS8vIHdlIG5lZWQgdG8gcmUtYWRkIHByZS12YWxpZGF0aW9uIHVzaW5nIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBBUEkncwotLy8gc2luY2Ugd2UgYWxzbyBuZWVkIHRvIGFkZCB2YWxpZGF0aW9uIHRvIHRoZSAnTmV3IFhNTCcgY2FzZSwgdGhpcwotLy8gcHJldmFsaWRhdGlvbgotLy8gZnVuY3Rpb24gc2hvdWxkIHJlYWxseSBnbyBpbnRvIHRoZSBOZXdXaXphcmQgc29tZXdoZXJlCi0vLwotcHVibGljIGNsYXNzIFhNTEltcG9ydEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUFjdGlvbkRlbGVnYXRlIHsKLQkvKioKLQkgKiBDaGVja3MgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGFuZCBydW5zIHRoZSBzZXBhcmF0ZSBicm93c2VyIHRvIHNob3cgdGhlCi0JICogY29udGVudCBvZiB0aGUgUmVhZG1lIGZpbGUuIFRoaXMgY29kZSBzaG93cyBob3cgdG8gbGF1bmNoIHNlcGFyYXRlCi0JICogYnJvd3NlcnMgdGhhdCBhcmUgbm90IFZBL0Jhc2UgZGVza3RvcCBwYXJ0cy4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogICAgICAgICAgICB0aGUgYWN0aW9uIHRoYXQgd2FzIHBlcmZvcm1lZAotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gd29ya2JlbmNoV2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gZ2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0KLQkJaWYgKChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElGaWxlKSAmJiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKSB7Ci0JCQlJRmlsZSBmaWxlID0gKElGaWxlKSBzZWxlY3RlZE9iamVjdDsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCXRyeSB7Ci0JCQkJTmV3WE1MV2l6YXJkLnNob3dEaWFsb2cod29ya2JlbmNoV2luZG93LmdldFNoZWxsKCksIGZpbGUsIHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB1bnVzZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyB1bnVzZWQKLQl9Ci0KLQkvLyBzY2FtbWVkIGZyb20gV2luZG93VXRpbGl0eQotCS8vCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0KLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gZXMgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCUl0ZXJhdG9yIGkgPSBlcy5pdGVyYXRvcigpOwotCQkJaWYgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJcmVzdWx0ID0gaS5uZXh0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFNjaGVtYVZhbGlkYXRpb25DaGVja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFNjaGVtYVZhbGlkYXRpb25DaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NmEzZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9YTUxTY2hlbWFWYWxpZGF0aW9uQ2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFhNTFNjaGVtYVZhbGlkYXRpb25DaGVja2VyIHsKLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKElGaWxlIGlmaWxlKSB7Ci0JCVN0cmluZyB4c2RGaWxlTmFtZSA9IGlmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGlzVmFsaWQoeHNkRmlsZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNob3VsZCB0aGlzIGJlIGltcGxlbWVudGVkIGFzIGEgVmFsaWRhdG9yIGFuZCBzaW1wbHkgY2FsbGVkIGFzIHN1Y2gKLQkgKiB3aXRoIGEgcmVwb3J0ZXIgdGhhdCBvbmx5IGNoZWNrcyB0aGUgcmVzdWx0cyBmb3Igc2V2ZXJpdHkgPSBlcnJvcj8gT3IKLQkgKiBzaG91bGQgdGhlIFhlcmNlcyByZXF1aXJlbWVudCBiZSBicm9rZW4gdXNpbmcgYSBwbHVnLWluIGV4dGVuc2lvbj8KLQkgKi8KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHhzZEZpbGVOYW1lKSB7Ci0JCS8vIERPTUFTQnVpbGRlckltcGwgYnVpbGRlciA9IG5ldyBET01BU0J1aWxkZXJJbXBsKCk7Ci0JCS8vIERPTUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIgPSBuZXcgRE9NRXJyb3JIYW5kbGVyKCk7Ci0JCS8vIGJ1aWxkZXIuc2V0RXJyb3JIYW5kbGVyKGVycm9ySGFuZGxlcik7Ci0JCXRyeSB7Ci0JCQkvLyBTdHJpbmcgdXJpID0KLQkJCVVSSUhlbHBlci5nZXRVUklGb3JGaWxlUGF0aCh4c2RGaWxlTmFtZSk7Ci0JCQkvLyBBU01vZGVsIG1vZGVsID0gYnVpbGRlci5wYXJzZUFTVVJJKHVyaSk7Ci0JCQkvLyBpZiAoZXJyb3JIYW5kbGVyLmhhc0Vycm9yKCkpCi0JCQkvLyByZXR1cm4gZmFsc2U7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSAvLyBpbnZhbGlkIHNjaGVtYQotCQl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBpbm5lciBjbGFzcwotCWNsYXNzIERPTUVycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBoYXNFcnJvciA9IGZhbHNlOwotCi0JCXB1YmxpYyBib29sZWFuIGhhc0Vycm9yKCkgewotCQkJcmV0dXJuIGhhc0Vycm9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXJyKSB7Ci0JCQloYXNFcnJvciA9IHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQloYXNFcnJvciA9IHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBub3QgYW4gZXJyb3IKLQkJfQotCX0gLy8gZW5kIERPTUVycm9ySGFuZGxlckltcGwKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9YTUxXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZWE1ZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9YTUxXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotcHVibGljIGNsYXNzIFhNTFdpemFyZCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBYTUxXaXphcmQgaW5zdGFuY2UgPSBuZXcgWE1MV2l6YXJkKCk7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBYTUxXaXphcmQgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgWE1MV2l6YXJkKCkgewotCQlpbnN0YW5jZSA9IHRoaXM7Ci0KLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3QueG1sLnVpIikuZ2V0RW50cnkoIi8iKSwgbmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MV2l6YXJkc01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFdpemFyZHNNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWU4OTQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MV2l6YXJkc01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBEYXZpZCBDYXJ2ZXIvU1RBUiBTdGFuZGFyZCAtIGRfYV9jYXJ2ZXJAeWFob28uY29tIC0gYnVnIDE5MjU2OAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IFhNTCBXaXphcmRzCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MV2l6YXJkc01lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzLndpemFyZFJlc291cmNlIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRElBTE9HX05FV19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRElBTE9HX1RJVExFX0lOVkFMSURfR1JBTU1BUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRElBTE9HX01FU1NBR0VfSU5WQUxJRF9HUkFNTUFSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfQ1JFQVRFX05FV19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkFESU9fWE1MX0ZST01fRFREOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SQURJT19YTUxfRlJPTV9TQ0hFTUE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JBRElPX1hNTF9GUk9NX1NDUkFUQ0g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0VYUEw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0ZJTEVfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX0NSRUFURV9YTUxfRklMRV9FWFBMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfU0VMRUNUX0RURF9GSUxFX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9TRUxFQ1RfRFREX0ZJTEVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9TRUxFQ1RfWFNEX0ZJTEVfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX1NFTEVDVF9YU0RfRklMRV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX1NFTEVDVF9ST09UX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9TRUxFQ1RfUk9PVF9FWFBMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ST09UX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfVElUTEVfTk9fUk9PVF9FTEVNRU5UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19NU0dfTk9fUk9PVF9FTEVNRU5UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTk9fTE9DQVRJT05fSElOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19NU0dfTk9fTE9DQVRJT05fSElOVF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTVNHX05PX0xPQ0FUSU9OX0hJTlRfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX0NPTlRFTlRfT1BUSU9OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX0NSRUFURV9SRVFVSVJFRDsvLyBjb21tZW50ZWQgb3V0Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUw7Ly8gY29tbWVudGVkIG91dAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMX0FUVFJJQlVURVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUxfRUxFTUVOVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfRklSU1RfQ0hPSUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfRklMTF9FTEVNRU5UU19BTkRfQVRUUklCVVRFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRE9DVFlQRV9JTkZPUk1BVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU1lTVEVNX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QVUJMSUNfSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfVVJJX05PVF9GT1VORF9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSU5WQUxJRF9HUkFNTUFSX0VSUk9SOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9CQURfRklMRU5BTUVfRVhURU5TSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9ST09UX0VMRU1FTlRfTVVTVF9CRV9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VSUk9SX1NDSEVNQV9JTlZBTElEX0lORk87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VSUk9SX0RURF9JTlZBTElEX0lORk87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VSUk9SX0NBVEFMT0dfRU5UUllfSU5WQUxJRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkFNRVNQQUNFX0lORk9STUFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25fUGx1Z2luc19VbmF2YWlsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX2Nhbm5vdF9iZV9wZXJmb3JtZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbl9vcF9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25fb3BfZGVzY19wcm9qOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vcF9lcnJvcl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX29wX2Vycm9yX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vdmVyd3JpdGVxdWVyeV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX292ZXJ3cml0ZXF1ZXJ5X21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2VfZXJyb3JfYWxyZWFkeWV4aXN0czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzc7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19YTUxDQVRBTE9HX0lNUE9SVF9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRElBTE9HX1hNTENBVEFMT0dfRVhQT1JUX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9ESUFMT0dfWE1MQ0FUQUxPR19FWFBPUlRfREVTQ1JJUFRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19YTUxDQVRBTE9HX0lNUE9SVF9ERVNDUklQVElPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX0xJTUlUX09QVElPTkFMX0VMRU1FTlRfREVQVEg7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9HRU5FUkFUSU5HX1hNTF9ET0NVTUVOVDsKLSAgICAKLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgWE1MV2l6YXJkc01lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFhNTFdpemFyZHNNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL3dpemFyZFJlc291cmNlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL3dpemFyZFJlc291cmNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YTJhNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy93aXphcmRSZXNvdXJjZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIERhdmlkIENhcnZlci9TVEFSIFN0YW5kYXJkIC0gZF9hX2NhcnZlckB5YWhvby5jb20gLSBidWcgMTkyNTY4Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hIFByb3BlcnRpZXMgZmlsZSBmb3IgY29tcG9uZW50OiBYTUwgVG9vbHMgLSAgTmV3IFhNTCBXaXphcmQKLSEgUGFja2FnZWQgZm9yIHRyYW5zbGF0aW9uIGluOiAgeG1sLnppcAotCi0hWE1MSW1wb3J0QWN0aW9uRGVsZWdhdGUKLV9VSV9ESUFMT0dfTkVXX1RJVExFICAgICAgICA9IE5ldyBYTUwgRmlsZQotX1VJX0RJQUxPR19USVRMRV9JTlZBTElEX0dSQU1NQVIgPSBJbnZhbGlkIEdyYW1tYXIKLV9VSV9ESUFMT0dfTUVTU0FHRV9JTlZBTElEX0dSQU1NQVIgPSBUaGUgZ3JhbW1hciBmaWxlIGNvbnRhaW5zIGVycm9ycy4gSWYgeW91IHByb2NlZWQsIGFuIGluY29ycmVjdCByZXN1bHQgZmlsZSB3aWxsIGJlIGdlbmVyYXRlZC4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci0KLSFOZXdYTUxCV2l6YXJkCi1fVUlfV0laQVJEX0NSRUFURV9ORVdfVElUTEUgICAgICAgICAgID0gTmV3IFhNTCBGaWxlCi1fVUlfUkFESU9fWE1MX0ZST01fRFREICAgICAgICAgICAgICAgID0gQ3JlYXRlIFhNTCBmaWxlIGZyb20gYSAmRFREIGZpbGUKLV9VSV9SQURJT19YTUxfRlJPTV9TQ0hFTUEgICAgICAgICAgICAgPSBDcmVhdGUgWE1MIGZpbGUgZnJvbSBhbiAmWE1MIHNjaGVtYSBmaWxlCi1fVUlfUkFESU9fWE1MX0ZST01fU0NSQVRDSCAgICAgICAgICAgID0gQ3JlYXRlIFhNTCBmaWxlIGZyb20gYW4gWE1MICZ0ZW1wbGF0ZQotX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0hFQURJTkcgICAgICAgICA9IENyZWF0ZSBYTUwgRmlsZSBGcm9tCi1fVUlfV0laQVJEX0NSRUFURV9YTUxfRVhQTCAgICAgICAgICAgID0gU2VsZWN0IGhvdyB5b3Ugd291bGQgbGlrZSB0byBjcmVhdGUgeW91ciBYTUwgZmlsZS4KLV9VSV9XSVpBUkRfQ1JFQVRFX1hNTF9GSUxFX0hFQURJTkcgICAgPSBYTUwKLV9VSV9XSVpBUkRfQ1JFQVRFX1hNTF9GSUxFX0VYUEwgICAgICAgPSBDcmVhdGUgYSBuZXcgWE1MIGZpbGUuCi1fVUlfV0laQVJEX1NFTEVDVF9EVERfRklMRV9ERVNDICAgICAgID0gU2VsZWN0IHRoZSBEVEQgZmlsZSB0byBjcmVhdGUgdGhlIFhNTCBmaWxlLgotX1VJX1dJWkFSRF9TRUxFQ1RfRFREX0ZJTEVfVElUTEUgICAgICA9IFNlbGVjdCBEVEQgRmlsZQotX1VJX1dJWkFSRF9TRUxFQ1RfWFNEX0ZJTEVfREVTQyAgICAgICA9IFNlbGVjdCB0aGUgc2NoZW1hIGZpbGUgdG8gY3JlYXRlIHRoZSBYTUwgZmlsZS4KLV9VSV9XSVpBUkRfU0VMRUNUX1hTRF9GSUxFX1RJVExFICAgICAgPSBTZWxlY3QgWE1MIFNjaGVtYSBGaWxlCi1fVUlfV0laQVJEX1NFTEVDVF9ST09UX0hFQURJTkcgICAgICAgID0gU2VsZWN0IFJvb3QgRWxlbWVudAotX1VJX1dJWkFSRF9TRUxFQ1RfUk9PVF9FWFBMICAgICAgICAgICA9IFNlbGVjdCB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBYTUwgZmlsZS4KLV9VSV9MQUJFTF9ST09UX0VMRU1FTlQgICAgICAgICAgICAgICAgPSBSb290IGVsZW1lbnQ6Ci1fVUlfV0FSTklOR19USVRMRV9OT19ST09UX0VMRU1FTlRTICAgID0gTm8gUm9vdCBFbGVtZW50cwotX1VJX1dBUk5JTkdfTVNHX05PX1JPT1RfRUxFTUVOVFMgICAgICA9IE5vIHJvb3QgZWxlbWVudCBleGlzdHMgc2luY2UgdGhlIHNjaGVtYSBwcm92aWRlZCBoYXMgbm8gZ2xvYmFsIGVsZW1lbnRzLgotX1VJX0xBQkVMX05PX0xPQ0FUSU9OX0hJTlQgICAgICAgICAgICA9IFVuc3BlY2lmaWVkIE5hbWVzcGFjZSBMb2NhdGlvbgotX1VJX1dBUk5JTkdfTVNHX05PX0xPQ0FUSU9OX0hJTlRfMSAgICA9IFlvdSBoYXZlIG5vdCBzcGVjaWZpZWQgYSBsb2NhdGlvbiBoaW50IGZvciBvbmUgb3IgbW9yZSBuYW1lc3BhY2UgZW50cmllcy4KLV9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzIgICAgPSBFbGVtZW50cyBmcm9tIHRoZXNlIG5hbWVzcGFjZXMgd2lsbCBub3QgYmUgZ2VuZXJhdGVkLiBUaGlzIG1heSBsZWFkIHRvIGFuIGludmFsaWQgZ2VuZXJhdGVkIGRvY3VtZW50LgotX1VJX1dBUk5JTkdfTVNHX05PX0xPQ0FUSU9OX0hJTlRfMyAgICA9IENsaWNrIFllcyB0byBjb250aW51ZSwgQ2xpY2sgTm8gdG8gZ28gYmFjayBhbmQgc3BlY2lmeSB0aGUgbG9jYXRpb24gaGludHMuCi1fVUlfV0laQVJEX0NPTlRFTlRfT1BUSU9OUyAgICAgICAgICAgID0gQ29udGVudCBvcHRpb25zCi0KLV9VSV9XSVpBUkRfQ1JFQVRFX1JFUVVJUkVEICAgICAgICAgICAgPSAmQ3JlYXRlIHJlcXVpcmVkIGNvbnRlbnQgb25seQotX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUwgICAgICAgICAgICA9IENyZWF0ZSByZXF1aXJlZCBhbmQgJm9wdGlvbmFsIGNvbnRlbnQKLV9VSV9XSVpBUkRfTElNSVRfT1BUSU9OQUxfRUxFTUVOVF9ERVBUSCA9IEwmaW1pdCBvcHRpb25hbCBlbGVtZW50IGRlcHRoIHRvOgotX1VJX1dJWkFSRF9HRU5FUkFUSU5HX1hNTF9ET0NVTUVOVAkgID0gR2VuZXJhdGluZyBYTUwgZG9jdW1lbnQuLi4KLQotX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUxfQVRUUklCVVRFUyA9IENyZWF0ZSBvcHRpb25hbCAmYXR0cmlidXRlcwotX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUxfRUxFTUVOVFMgICA9IENyZWF0ZSBvcHRpb25hbCBlJmxlbWVudHMKLV9VSV9XSVpBUkRfQ1JFQVRFX0ZJUlNUX0NIT0lDRSAgICAgICAgPSBDcmVhdGUgZmlyc3QgY2hvaWNlIG9mIHJlcXVpcmVkICZjaG9pY2UKLV9VSV9XSVpBUkRfRklMTF9FTEVNRU5UU19BTkRfQVRUUklCVVRFUyA9IEZpbGwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgd2l0aCAmZGF0YQotCi1fVUlfTEFCRUxfRE9DVFlQRV9JTkZPUk1BVElPTiAgICAgICAgID0gRG9jdW1lbnQgdHlwZSBpbmZvcm1hdGlvbgotX1VJX0xBQkVMX1NZU1RFTV9JRCAgICAgICAgICAgICAgICAgICA9ICZTeXN0ZW0gSUQ6Ci1fVUlfTEFCRUxfUFVCTElDX0lEICAgICAgICAgICAgICAgICAgID0gJlB1YmxpYyBJRDoKLQotX1VJX1dBUk5JTkdfVVJJX05PVF9GT1VORF9DT0xPTiAgICAgICA9IFRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgY2Fubm90IGJlIGxvY2F0ZWQgOgotCi0hTmV3TW9kZWxXaXphcmQKLV9VSV9JTlZBTElEX0dSQU1NQVJfRVJST1IgICAgICAgICAgICAgPSBJbnZhbGlkIEdyYW1tYXIKLQotIU5ld01vZGVsV2l6YXJkCi1fRVJST1JfQkFEX0ZJTEVOQU1FX0VYVEVOU0lPTiAgICAgICAgID0gVGhlIGZpbGUgbmFtZSBtdXN0IGVuZCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zIHswfS4KLV9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTICAgICAgICAgICAgPSBUaGUgc2FtZSBmaWxlIGFscmVhZHkgZXhpc3RzLgotX0VSUk9SX1JPT1RfRUxFTUVOVF9NVVNUX0JFX1NQRUNJRklFRCA9IEEgcm9vdCBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkLgotX1VJX0xBQkVMX0VSUk9SX1NDSEVNQV9JTlZBTElEX0lORk8gICA9IFRoZSBzY2hlbWEgZmlsZSBjb250YWlucyBlcnJvcnMuIE9wZW4gaXQgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yIGZvciBkZXRhaWxzLgotX1VJX0xBQkVMX0VSUk9SX0RURF9JTlZBTElEX0lORk8gICAgICA9IFRoZSBEVEQgZmlsZSBjb250YWlucyBlcnJvcnMuIE9wZW4gaXQgaW4gdGhlIERURCBlZGl0b3IgZm9yIGRldGFpbHMuCi0KLV9VSV9MQUJFTF9FUlJPUl9DQVRBTE9HX0VOVFJZX0lOVkFMSUQgPSBUaGUgc2VsZWN0ZWQgY2F0YWxvZyBlbnRyeSBzcGVjaWZpZXMgYSBVUkkgdGhhdCBjYW4gbm90IGJlIGxvY2F0ZWQuCi0KLV9VSV9MQUJFTF9OQU1FU1BBQ0VfSU5GT1JNQVRJT049TmFtZXNwYWNlIEluZm9ybWF0aW9uCi0KLVZhbGlkYXRpb25fUGx1Z2luc19VbmF2YWlsYWJsZT1WYWxpZGF0aW9uIFBsdWdpbnMgVW5hdmFpbGFibGUKLVZhbGlkYXRpb25fY2Fubm90X2JlX3BlcmZvcm1lZD1WYWxpZGF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgYmVjYXVzZSB0aGUgdmFsaWRhdGlvbiBwbHVnaW5zIHdlcmUgZGlzYWJsZWQgb3Igbm90IGZvdW5kLiAgVGhlIGdlbmVyYXRlZCBmaWxlIG1heSBiZSBpbnZhbGlkLiAgRG8geW91IHdpc2ggdG8gY29udGludWU/Ci0KLSFJbXBvcnRYTUxDYXRhbG9nV2l6YXJkCi1fVUlfRElBTE9HX1hNTENBVEFMT0dfSU1QT1JUX1RJVExFICAgID0gSW1wb3J0IFhNTCBDYXRhbG9nCi1fVUlfRElBTE9HX1hNTENBVEFMT0dfSU1QT1JUX0RFU0NSSVBUSU9OID0gSW1wb3J0IGFsbCBlbnRyaWVzIGZyb20gYW4gZXhpc3RpbmcgWE1MIENhdGFsb2cgaW50byB0aGUgVXNlciBDYXRhbG9nLgotCi0hRXhwb3J0WE1MQ2F0YWxvZ1dpemFyZAotX1VJX0RJQUxPR19YTUxDQVRBTE9HX0VYUE9SVF9USVRMRSAgICA9IEV4cG9ydCBFeGlzdGluZyBYTUwgQ2F0YWxvZwotX1VJX0RJQUxPR19YTUxDQVRBTE9HX0VYUE9SVF9ERVNDUklQVElPTiA9IEV4cG9ydCBhbGwgZXhpc3RpbmcgVXNlciBDYXRhbG9nIGVudHJpZXMuCi0jCi0jIEV4YW1wbGVQcm9qZWN0Ci1FeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uX29wX2Rlc2M9Q3JlYXRpbmcgZXhhbXBsZSBwcm9qZWN0cy4uLgotRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbl9vcF9kZXNjX3Byb2o9Q29uZmlndXJpbmcgcHJvamVjdC4uLgotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF90aXRsZT1OZXcgRXhhbXBsZSBQcm9qZWN0Ci1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX29wX2Vycm9yX3RpdGxlPVByb2plY3QgQ3JlYXRpb24gRmFpbGVkCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX29wX2Vycm9yX21lc3NhZ2U9UHJvamVjdCBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3ZlcndyaXRlcXVlcnlfdGl0bGU9T3ZlcndyaXRlCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX292ZXJ3cml0ZXF1ZXJ5X21lc3NhZ2U9RG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIHswfT8KLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlX2Vycm9yX2FscmVhZHlleGlzdHM9UHJvamVjdCBhbHJlYWR5IGV4aXN0cy4KLQotTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8wPVNlbGVjdCBYTUwgVGVtcGxhdGUKLU5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMT1TZWxlY3QgYSB0ZW1wbGF0ZSBhcyBpbml0aWFsIGNvbnRlbnQgaW4gdGhlIFhNTCBwYWdlLgotTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8yPU5hbWUKLU5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMz1EZXNjcmlwdGlvbgotTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV80PSZVc2UgWE1MIFRlbXBsYXRlCi1OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzU9JlByZXZpZXc6Ci1OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzY9VGVtcGxhdGVzIGFyZSAnTmV3IFhNTCcgdGVtcGxhdGVzIGZvdW5kIGluIHRoZSA8YT5YTUwgVGVtcGxhdGVzPC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi1OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzc9JlRlbXBsYXRlczoKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxMWVlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklDb250ZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLk11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxGb3JtYXR0aW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hdXRvZWRpdC5BdXRvRWRpdFN0cmF0ZWd5Rm9yVGFiczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIGEgc291cmNlIHZpZXdlciB3aGljaCBzaG93cyBYTUwgY29udGVudC4KLSAqIDxwPgotICogQ2xpZW50cyBjYW4gc3ViY2xhc3MgYW5kIG92ZXJyaWRlIGp1c3QgdGhvc2UgbWV0aG9kcyB3aGljaCBtdXN0IGJlIHNwZWNpZmljCi0gKiB0byB0aGVpciBuZWVkcy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MIGV4dGVuZHMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIHsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbiBiZWNhdXNlIG5vdCBzb3VyY2V2aWV3ZXItc3BlY2lmaWMgYW5kCi0JICogaXQncyBhIFN0cmluZyBhcnJheQotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGZMaW5lU3R5bGVQcm92aWRlckZvclhNTDsKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGZTdGF0dXNMaW5lTGFiZWxQcm92aWRlcjsKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTCgpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSUF1dG9FZGl0U3RyYXRlZ3lbXSBnZXRBdXRvRWRpdFN0cmF0ZWdpZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlMaXN0IGFsbFN0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCUlBdXRvRWRpdFN0cmF0ZWd5W10gc3VwZXJTdHJhdGVnaWVzID0gc3VwZXIuZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVyU3RyYXRlZ2llcy5sZW5ndGg7IGkrKykgewotCQkJYWxsU3RyYXRlZ2llcy5hZGQoc3VwZXJTdHJhdGVnaWVzW2ldKTsKLQkJfQotCi0JCS8vIGJlIHN1cmUgdGhpcyBpcyBsYXN0LCBzbyBpdCBjYW4gbW9kaWZ5IGFueSByZXN1bHRzIGZvcm0gcHJldmlvdXMKLQkJLy8gY29tbWFuZHMgdGhhdCBtaWdodCBvbiBvbiBzYW1lIHBhcnRpaW9uIHR5cGUuCi0JCS8vIGFkZCBhdXRvIGVkaXQgc3RyYXRlZ3kgdGhhdCBoYW5kbGVzIHdoZW4gdGFiIGtleSBpcyBwcmVzc2VkCi0JCWFsbFN0cmF0ZWdpZXMuYWRkKG5ldyBBdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicygpKTsKLQotCQlyZXR1cm4gKElBdXRvRWRpdFN0cmF0ZWd5W10pIGFsbFN0cmF0ZWdpZXMudG9BcnJheShuZXcgSUF1dG9FZGl0U3RyYXRlZ3lbYWxsU3RyYXRlZ2llcy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCi0JCWlmIChmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9PSBudWxsKSB7Ci0JCQlTdHJpbmdbXSB4bWxUeXBlcyA9IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwuZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcygpOwotCQkJZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW3htbFR5cGVzLmxlbmd0aCArIDJdOwotCQkJZkNvbmZpZ3VyZWRDb250ZW50VHlwZXNbMF0gPSBJU3RydWN0dXJlZFBhcnRpdGlvbnMuREVGQVVMVF9QQVJUSVRJT047Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlc1sxXSA9IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTjsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHhtbFR5cGVzLCAwLCBmQ29uZmlndXJlZENvbnRlbnRUeXBlcywgaW5kZXggKz0gMiwgeG1sVHlwZXMubGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24jZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcnMoCi0JICogCW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIElDb250ZW50QXNzaXN0UHJvY2Vzc29yW10gZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBYTUxTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvcigKLQkJCQl0aGlzLmdldENvbnRlbnRBc3Npc3RhbnQoKSwgcGFydGl0aW9uVHlwZSwgc291cmNlVmlld2VyKTsKLQkJcmV0dXJuIG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde3Byb2Nlc3Nvcn07Ci0JfQotCi0JcHVibGljIElDb250ZW50Rm9ybWF0dGVyIGdldENvbnRlbnRGb3JtYXR0ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJSUNvbnRlbnRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gc3VwZXIuZ2V0Q29udGVudEZvcm1hdHRlcihzb3VyY2VWaWV3ZXIpOwotCQkvLyBzdXBlciB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBhIGZvcm1hdHRlciwgcHJvYmFibHkgYmVjYXVzZQotCQkvLyBzb3VyY2VWaWV3ZXIgZG9lcyBub3QgaGF2ZSBkb2N1bWVudCBzZXQgeWV0LCBzbyBqdXN0IGNyZWF0ZSBhCi0JCS8vIGdlbmVyaWMgb25lCi0JCWlmICghKGZvcm1hdHRlciBpbnN0YW5jZW9mIE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIpKQotCQkJZm9ybWF0dGVyID0gbmV3IE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIoZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHNvdXJjZVZpZXdlciksIElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUKTsKLQkJKChNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKSBmb3JtYXR0ZXIpLnNldE1hc3RlclN0cmF0ZWd5KG5ldyBYTUxGb3JtYXR0aW5nU3RyYXRlZ3koKSk7CQkKLS8vCQkoKE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIpIGZvcm1hdHRlcikuc2V0TWFzdGVyU3RyYXRlZ3kobmV3IFN0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3kobmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpKSk7Ci0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0SW5kZW50UHJlZml4ZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlWZWN0b3IgdmVjdG9yID0gbmV3IFZlY3RvcigpOwotCi0JCS8vIHByZWZpeFswXSBpcyBlaXRoZXIgJ1x0JyBvciAnICcgeCB0YWJXaWR0aCwgZGVwZW5kaW5nIG9uIHByZWZlcmVuY2UKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJYm9vbGVhbiB1c2VTcGFjZXMgPSBYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFLmVxdWFscyhpbmRlbnRDaGFyUHJlZik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQlTdHJpbmdCdWZmZXIgcHJlZml4ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYm9vbGVhbiBhcHBlbmRUYWIgPSBmYWxzZTsKLQotCQkJaWYgKHVzZVNwYWNlcykgewotCQkJCWZvciAoaW50IGogPSAwOyBqICsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGorKykgewotCQkJCQlwcmVmaXguYXBwZW5kKCcgJyk7Ci0JCQkJfQotCi0JCQkJaWYgKGkgIT0gMCkgewotCQkJCQlhcHBlbmRUYWIgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7Ci0JCQkJCXByZWZpeC5hcHBlbmQoJyAnKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaSAhPSBpbmRlbnRhdGlvbldpZHRoKSB7Ci0JCQkJCWFwcGVuZFRhYiA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoYXBwZW5kVGFiKSB7Ci0JCQkJcHJlZml4LmFwcGVuZCgnXHQnKTsKLQkJCQl2ZWN0b3IuYWRkKHByZWZpeC50b1N0cmluZygpKTsKLQkJCQkvLyByZW1vdmUgdGhlIHRhYiBzbyB0aGF0IGluZGVudGF0aW9uIC0gdGFiIGlzIGFsc28gYW4gaW5kZW50Ci0JCQkJLy8gcHJlZml4Ci0JCQkJcHJlZml4LmRlbGV0ZUNoYXJBdChwcmVmaXgubGVuZ3RoKCkgLSAxKTsKLQkJCX0KLQkJCXZlY3Rvci5hZGQocHJlZml4LnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJdmVjdG9yLmFkZCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gKFN0cmluZ1tdKSB2ZWN0b3IudG9BcnJheShuZXcgU3RyaW5nW3ZlY3Rvci5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUxpbmVTdHlsZVByb3ZpZGVyW10gcHJvdmlkZXJzID0gbnVsbDsKLQotCQlpZiAoKHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpIHx8IChwYXJ0aXRpb25UeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9DREFUQSkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0NPTU1FTlQpIHx8IChwYXJ0aXRpb25UeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9ERUNMQVJBVElPTikgfHwgKHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX1BJKSkgewotCQkJcHJvdmlkZXJzID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyW117Z2V0TGluZVN0eWxlUHJvdmlkZXJGb3JYTUwoKX07Ci0JCX0KLQotCQlyZXR1cm4gcHJvdmlkZXJzOwotCX0KLQotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZ2V0TGluZVN0eWxlUHJvdmlkZXJGb3JYTUwoKSB7Ci0JCWlmIChmTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwgPT0gbnVsbCkgewotCQkJZkxpbmVTdHlsZVByb3ZpZGVyRm9yWE1MID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyRm9yWE1MKCk7Ci0JCX0KLQkJcmV0dXJuIGZMaW5lU3R5bGVQcm92aWRlckZvclhNTDsKLQl9Ci0KLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0U3RhdHVzTGluZUxhYmVsUHJvdmlkZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJaWYgKGZTdGF0dXNMaW5lTGFiZWxQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIgPSBuZXcgSkZhY2VOb2RlTGFiZWxQcm92aWRlcigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCQkJCXJldHVybiBudWxsOwotCi0JCQkJCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgZWxlbWVudDsKLQkJCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQkJCQlzLmluc2VydCgwLCBzdXBlci5nZXRUZXh0KG5vZGUpKTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotCQkJCQkJCW5vZGUgPSAoKEF0dHIpIG5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCQkJCQkJZWxzZQotCQkJCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCi0JCQkJCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQkJCQlzLmluc2VydCgwLCBJUGF0aC5TRVBBUkFUT1IpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JCQkJfQotCi0JCQl9OwotCQl9Ci0JCXJldHVybiBmU3RhdHVzTGluZUxhYmVsUHJvdmlkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBnZXRIeXBlcmxpbmtEZXRlY3RvclRhcmdldHMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJTWFwIHRhcmdldHMgPSBzdXBlci5nZXRIeXBlcmxpbmtEZXRlY3RvclRhcmdldHMoc291cmNlVmlld2VyKTsKLQkJdGFyZ2V0cy5wdXQoQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTCwgbnVsbCk7Ci0JCXJldHVybiB0YXJnZXRzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9ET01PYnNlcnZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL0RPTU9ic2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOTBjZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL0RPTU9ic2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLkNNRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5JbmZlcnJlZEdyYW1tYXJCdWlsZGluZ0NNRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIG9ic2VydmUgY2hhbmdlcyBpbiB0aGUgRE9NIGFuZCBwZXJmb3JtCi0gKiBvY2Nhc2lvbmFsJ3NjYW5zJyB0byBkZWR1Y2UgaW5mb3JtYXRpb24uIFdlIHVzZSBhIGRlbGF5IHRpbWVyIG1lY2hhbmlzbSB0bwotICogZW5zdXJlIHNjYW5zIGFyZSBtYWRlIGV2ZXJ5IGNvdXBsZSBvZiBzZWNvbmRzIHRvIGF2b2lkIHBlcmZvcm1hbmNlCi0gKiBwcm9ibGVtcy4gQ3VycmVudGx5IHRoaXMgY2xhc3MgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHJlZmVyZW5jZWQgZ3JhbW1hcgotICogdXJpJ3Mgd2l0aGluIHRoZSBkb2N1bWVudCBlbnN1cmUgdGhhdCB0aGV5IGFyZSBsb2FkZWQgYnkgdGhlCi0gKiBDTURvY3VtZW50TWFuYWdlci4gV2UgbWlnaHQgd2FudCB0byBnZW5lcmFsaXplIHRoaXMgY2xhc3MgdG8gcGVyZm9ybSBvdGhlcgotICogc3VwbGltZW50YWwgaW5mb3JtYXRpb24gZ2F0aGVyaW5nIHRoYXQgaXMgc3VpdGFibGUgZm9yICd0aW1lIGRlbGF5ZWQnCi0gKiBjb21wdXRhdGlvbiAoZXJyb3IgaGludHMgZXRjLikuCi0gKi8KLS8vIFRPRE86IFdoZXJlIHNob3VsZCB0aGlzIGNsYXNzIGdvPwotcHVibGljIGNsYXNzIERPTU9ic2VydmVyIHsKLQotCi0JLy8gQW4gYWJzdHJhY3QgYWRhcHRlciB0aGF0IGVuc3VyZXMgdGhhdCB0aGUgY2hpbGRyZW4gb2YgYSBuZXcgTm9kZSBhcmUKLQkvLyBhbHNvIGFkYXB0ZWQKLQkvLwotCWFic3RyYWN0IGNsYXNzIERvY3VtZW50QWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JCXB1YmxpYyBEb2N1bWVudEFkYXB0ZXIoKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb25uZWN0KERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQkoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5hZGRBZGFwdGVyKHRoaXMpOwotCQkJYWRhcHQoZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGljY29ubmVjdChEb2N1bWVudCBkb2N1bWVudCkgewotCQkJKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkucmVtb3ZlQWRhcHRlcih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkYXB0KEVsZW1lbnQgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlmICgoKElOb2RlTm90aWZpZXIpIGVsZW1lbnQpLmdldEV4aXN0aW5nQWRhcHRlcih0aGlzKSA9PSBudWxsKSB7Ci0JCQkJCSgoSU5vZGVOb3RpZmllcikgZWxlbWVudCkuYWRkQWRhcHRlcih0aGlzKTsKLQotCQkJCQlmb3IgKE5vZGUgY2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJCWFkYXB0KChFbGVtZW50KSBjaGlsZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gdHlwZSA9PSB0aGlzOwotCQl9Ci0KLQkJYWJzdHJhY3QgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjbGFzcyBsaXN0ZW5zIHRvIHRoZSBjaGFuZ2VzIGluIHRoZSBDTURvY3VtZW50IGFuZCB0cmlnZ2VycyBhCi0JICogQ01Eb2N1bWVudCBsb2FkCi0JICovCi0JY2xhc3MgTXlEb2N1bWVudEFkYXB0ZXIgZXh0ZW5kcyBEb2N1bWVudEFkYXB0ZXIgewotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJCXN3aXRjaCAoZXZlbnRUeXBlKSB7Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLkFERCA6IHsKLQkJCQkJaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJBREQgKHRvICIgKwotCQkJCQkJLy8gKChOb2RlKW5vdGlmaWVyKS5nZXROb2RlTmFtZSgpICsgIikgIiArCi0JCQkJCQkvLyAoKEVsZW1lbnQpbmV3VmFsdWUpLmdldE5vZGVOYW1lKCkgKyAiIG9sZCAiICsKLQkJCQkJCS8vIG9sZFZhbHVlKTsKLQkJCQkJCWFkYXB0KChFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQkvLyBjYXNlIElOb2RlTm90aWZpZXIuUkVNT1ZFOgotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5DSEFOR0UgOgotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCA6Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLkNPTlRFTlRfQ0hBTkdFRCA6IHsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIG5vdGlmaWVyOwotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlzd2l0Y2ggKGV2ZW50VHlwZSkgewotCQkJCQkJCWNhc2UgSU5vZGVOb3RpZmllci5DSEFOR0UgOgotCQkJCQkJCWNhc2UgSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCA6IHsKLQkJCQkJCQkJLy8gc3RydWN0dXJlIGNoYW5nZQotCQkJCQkJCQlpbnZva2VEZWxheWVkQ01Eb2N1bWVudExvYWQoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJCWNhc2UgSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQgOiB7Ci0JCQkJCQkJCS8vIHNvbWUgY29udGVudCBjaGFuZ2VkCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCQlpbnZva2VEZWxheWVkQ01Eb2N1bWVudExvYWQoKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnRlbnRpb25hbGx5IGxlZnQgdmlzaWJsZSB0byB0aGUgdXNlcgotCSAqLwotCWNsYXNzIFRpbWVySm9iIGV4dGVuZHMgSm9iIHsKLQkJcHVibGljIFRpbWVySm9iKCkgewotCQkJc3VwZXIoU1NFVUlNZXNzYWdlcy5Mb2FkaW5nUmVmZXJlbmNlZEdyYW1tYXJzKTsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldFByaW9yaXR5KFRocmVhZC5NSU5fUFJJT1JJVFkpOwotCQkJaW52b2tlQ01Eb2N1bWVudExvYWQoKTsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEpvYiB0aW1lciA9IG5ldyBUaW1lckpvYigpOwotCXByb3RlY3RlZCBEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNHcmFtbWFySW5mZXJlbmNlRW5hYmxlZDsKLQkvKioKLQkgKiBJZiB0cnVlLCBET01PYnNlcnZlciBpcyBjdXJyZW50bHkgZGlzYWJsZWQgYW5kIG5vdCBsb2FkaW5nIHRoZSBjb250ZW50Ci0JICogbW9kZWwKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZklzRGlzYWJsZWQgPSBmYWxzZTsKLQkvKioKLQkgKiBJZiB0cnVlLCBET01PYnNlcnZlciBpcyBjdXJyZW50bHkgdHJ5aW5nIHRvIGxvYWQgdGhlIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZklzTG9hZGluZyA9IGZhbHNlOwotCi0JcHVibGljIERPTU9ic2VydmVyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJZkRvY3VtZW50ID0gKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSA/ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKSA6IG51bGw7Ci0KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkvLyBoZXJlIHdlIGNyZWF0ZSBhbmQgaW5pdCBhbiBhZGFwdGVyIHRoYXQgd2lsbCBsaXN0ZW4gdG8KLQkJCS8vIGNoYW5nZXMgdG8gdGhlIGRvY3VtZW50IGFuZCBjb250YWluZWQgZWxlbWVudHMKLQkJCU15RG9jdW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgTXlEb2N1bWVudEFkYXB0ZXIoKTsKLQkJCWFkYXB0ZXIuY29ubmVjdChmRG9jdW1lbnQpOwotCi0JCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGZEb2N1bWVudCk7Ci0JCQlpZiAoKG1vZGVsUXVlcnkgIT0gbnVsbCkgJiYgKG1vZGVsUXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKSAhPSBudWxsKSkgewotCQkJCUNNRG9jdW1lbnRNYW5hZ2VyIGNtRG9jdW1lbnRNYW5hZ2VyID0gbW9kZWxRdWVyeS5nZXRDTURvY3VtZW50TWFuYWdlcigpOwotCQkJCWNtRG9jdW1lbnRNYW5hZ2VyLnNldFByb3BlcnR5RW5hYmxlZChDTURvY3VtZW50TWFuYWdlci5QUk9QRVJUWV9BVVRPX0xPQUQsIGZhbHNlKTsKLQkJCX0KLQkJCQotCQkJLy8gYXR0YWNoIGEgZG9tIG9ic2VydmVyIGFkYXB0ZXIgdG8gdGhlIGRvY3VtZW50IHNvIG90aGVycyBoYXZlIGFjY2VzcyB0bwotCQkJLy8gZG9tb2JzZXJ2ZXIgaWYgbmVlZGVkCi0JCQlJTm9kZUFkYXB0ZXIgZG9tT2JzZXJ2ZXJBZGFwdGVyID0gKChJTm9kZU5vdGlmaWVyKWZEb2N1bWVudCkuZ2V0RXhpc3RpbmdBZGFwdGVyKERPTU9ic2VydmVyQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoZG9tT2JzZXJ2ZXJBZGFwdGVyID09IG51bGwpIHsKLQkJCQlkb21PYnNlcnZlckFkYXB0ZXIgPSBuZXcgRE9NT2JzZXJ2ZXJBZGFwdGVyKCk7Ci0JCQkJKChJTm9kZU5vdGlmaWVyKWZEb2N1bWVudCkuYWRkQWRhcHRlcihkb21PYnNlcnZlckFkYXB0ZXIpOwotCQkJfQotCQkJKChET01PYnNlcnZlckFkYXB0ZXIpZG9tT2JzZXJ2ZXJBZGFwdGVyKS5zZXRET01PYnNlcnZlcih0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCS8vIENTOiB3ZSBzZWVtIHRvIGV4cG9zZSBhbiBYU0QgaW5pdGlhbGl6YXRpb24gcHJvYmxlbSB3aGVuIHdlIGRvIHRoaXMKLQkJLy8gaW1tZWRpYXRlbHkKLQkJLy8gdmVyeSBuYXN0eS4uLiBJIG5lZWQgdG8gcmV2aXN0IHRoaXMgcHJvYmxlbSB3aXRoIEVkIE1lcmtzCi0JCS8vCi0JCXRpbWVyLnNjaGVkdWxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW52b2tlQ01Eb2N1bWVudExvYWQoKSB7Ci0JCWlmIChmSXNEaXNhYmxlZCkgcmV0dXJuOwotCQl0cnkgewotCQkJZklzTG9hZGluZyA9IHRydWU7Ci0JCQkKLQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZkRvY3VtZW50KTsKLQkJCWlmICgobW9kZWxRdWVyeSAhPSBudWxsKSAmJiAobW9kZWxRdWVyeS5nZXRDTURvY3VtZW50TWFuYWdlcigpICE9IG51bGwpKSB7Ci0JCQkJQ01Eb2N1bWVudExvYWRlciBsb2FkZXIgPSBpc0dyYW1tYXJJbmZlcmVuY2VFbmFibGVkID8gbmV3IEluZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlcihmRG9jdW1lbnQsIG1vZGVsUXVlcnkpIDogbmV3IENNRG9jdW1lbnRMb2FkZXIoZkRvY3VtZW50LCBtb2RlbFF1ZXJ5KTsKLQkJCQlsb2FkZXIubG9hZENNRG9jdW1lbnRzKCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlmSXNMb2FkaW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnZva2VEZWxheWVkQ01Eb2N1bWVudExvYWQoKSB7Ci0JCWlmIChmSXNEaXNhYmxlZCkgcmV0dXJuOwotCQl0aW1lci5zY2hlZHVsZSgyMDAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRHcmFtbWFySW5mZXJlbmNlRW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCkgewotCQlpc0dyYW1tYXJJbmZlcmVuY2VFbmFibGVkID0gaXNFbmFibGVkOwotCX0KLQkKLQlib29sZWFuIHNldERpc2FibGVkKGJvb2xlYW4gaXNEaXNhYmxlZCwgYm9vbGVhbiBmb3JjZWQpIHsKLQkJYm9vbGVhbiBzdWNjZXNzID0gdHJ1ZTsKLQkJCi0JCWlmIChmSXNEaXNhYmxlZCAhPSBpc0Rpc2FibGVkKSB7Ci0JCQlmSXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7Ci0JCQlpZiAoZm9yY2VkKSB7Ci0JCQkJaWYgKGlzRGlzYWJsZWQpCi0JCQkJCXN1Y2Nlc3MgPSB0aW1lci5jYW5jZWwoKTsKLQkJCQllbHNlCi0JCQkJCWludm9rZUNNRG9jdW1lbnRMb2FkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JfQotCQotCWJvb2xlYW4gaXNMb2FkaW5nKCkgewotCQlyZXR1cm4gZklzTG9hZGluZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvRE9NT2JzZXJ2ZXJBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvRE9NT2JzZXJ2ZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZDYwYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL0RPTU9ic2VydmVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotCi0vKioKLSAqIFRoaXMgaXMganVzdCBhbiBhZGFwdGVyIHRoYXQgc2l0cyBvbiBhIGRvY3VtZW50IG5vZGUgdG8gYWxsb3cgY2xpZW50cwotICogbGltaXRlZCBhY2Nlc3MgdG8gdGhlIERPTU9ic2VydmVyLiBDbGllbnRzIHdobyBoYW5kbGUgdGhlaXIgb3duIGNvbnRlbnQKLSAqIG1vZGVsIGRvY3VtZW50IGxvYWRpbmcgKGFzIG9wcG9zZWQgdG8gbGV0dGluZyB0aGUgRE9NT2JzZXJ2ZXIgZG8gaXQpIG1heQotICogdXNlIHRoaXMgY2xhc3MgdG8gc3RvcCB0aGUgRE9NT2JzZXJ2ZXIgZnJvbSBsb2FkaW5nIGFuZCBwb3NzaWJseQotICogaW50ZXJmZXJpbmcgd2l0aCB0aGUgY2xpZW50J3MgZG9jdW1lbnQgbG9hZGluZy4KLSAqLwotcHVibGljIGNsYXNzIERPTU9ic2VydmVyQWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JcHJpdmF0ZSBET01PYnNlcnZlciBmT2JzZXJ2ZXIgPSBudWxsOwotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSBET01PYnNlcnZlckFkYXB0ZXIuY2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBUaGUgRE9NT2JzZXJ2ZXIgaXMgdGhlIG9uZSB0aGF0IGFkZHMgdGhlIGFkYXB0ZXIgdG8gdGhlIGRvY3VtZW50IG5vZGUsCi0JICogc28gaXQnbGwgc2V0IGl0c2VsZiB1cCBoZXJlIGFzIHdlbGwuCi0JICogCi0JICogQHBhcmFtIG9ic2VydmVyCi0JICovCi0Jdm9pZCBzZXRET01PYnNlcnZlcihET01PYnNlcnZlciBvYnNlcnZlcikgewotCQlmT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKLQl9Ci0KLQkvKioKLQkgKiBEaXNhYmxlIHRoZSBET01PYnNlcnZlciB0byBwcmV2ZW50IGl0IGZyb20gZnV0dXJlIGNvbnRlbnQgbW9kZWwgbG9hZGluZwotCSAqIGZvciB0aGlzIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBkaXNhYmxlCi0JICogICAgICAgICAgICB0cnVlIGlmIGNhbGxlciB3YW50cyBET01PYnNlcnZlciBkaXNhYmxlZC4gZmFsc2UgaWYgY2FsbGVyCi0JICogICAgICAgICAgICB3YW50cyBET01PYnNlcnZlciBlbmFibGVkLgotCSAqIEBwYXJhbSBmb3JjZQotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgRE9NT2JzZXJ2ZXIgd2lsbCBmb3JjaWJseSBiZSBkaXNhYmxlZCAoaWYgdGhlCi0JICogICAgICAgICAgICBET01PYnNlcnZlciBtb2RlbCBsb2FkaW5nIGpvYiBpcyBzY2hlZHVsZWQsIGl0IHdpbGwgYmUKLQkgKiAgICAgICAgICAgIGNhbmNlbGxlZCkKLQkgKiBAcmV0dXJuIHRydWUgaWYgRE9NT2JzZXJ2ZXIgd2FzIHN1Y2Nlc3NmdWxseSBkaXNhYmxlZC4gZmFsc2UgaWYKLQkgKiAgICAgICAgIERPTU9ic2VydmVyIHdhcyBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGxvYWRpbmcgYW5kIHdhcwotCSAqICAgICAgICAgdW5hYmxlIHRvIHN0b3AKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlT2JzZXJ2ZXIoYm9vbGVhbiBkaXNhYmxlLCBib29sZWFuIGZvcmNlKSB7Ci0JCXJldHVybiBmT2JzZXJ2ZXIuc2V0RGlzYWJsZWQoZGlzYWJsZSwgZm9yY2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBvciBub3QgRE9NT2JzZXJ2ZXIgaXMgY3VycmVudGx5IGF0dGVtcHRpbmcgdG8gbG9hZCB0aGUKLQkgKiBjb250ZW50IG1vZGVsLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBET01PYnNlcnZlciBpcyBjdXJyZW50bHkgaW4gdGhlIHByb2Nlc3Mgb2YgbG9hZGluZyB0aGUKLQkgKiAgICAgICAgIGNvbnRlbnQgbW9kZWxzLiBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPYnNlcnZlckxvYWRpbmcoKSB7Ci0JCXJldHVybiBmT2JzZXJ2ZXIuaXNMb2FkaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL0lQcm9kdWN0Q29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvSVByb2R1Y3RDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2NmJlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvSVByb2R1Y3RDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbDsKLQotcHVibGljIGludGVyZmFjZSBJUHJvZHVjdENvbnN0YW50cyB7Ci0JLyoqCi0JICogVGhlIGV4cGxvcmVyIHZpZXcgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIFhNTCBwZXJzcGVjdGl2ZQotCSAqLwotCVN0cmluZyBQRVJTUEVDVElWRV9FWFBMT1JFUl9WSUVXID0gImlkUGVyc3BlY3RpdmVIaWVyYXJjaHlWaWV3IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOThlN2FiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLAotCSAqICAgICAgICAgICAgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKChsZXZlbCA9PSBPS19ERUJVRykgfHwgKGxldmVsID09IElORk9fREVCVUcpIHx8IChsZXZlbCA9PSBXQVJOSU5HX0RFQlVHKSB8fCAobGV2ZWwgPT0gRVJST1JfREVCVUcpKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvUHJvZHVjdFByb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9Qcm9kdWN0UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Zjg4YmU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9Qcm9kdWN0UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotCi1wdWJsaWMgY2xhc3MgUHJvZHVjdFByb3BlcnRpZXMgewotCS8qKgotCSAqIERlZmF1bHQgdmFsdWVzIGZvciBXVFAgbGV2ZWwgcHJvZHVjdAotCSAqLwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSURfUEVSU1BFQ1RJVkVfRVhQTE9SRVJfVklFVyA9IElQYWdlTGF5b3V0LklEX1BST0pFQ1RfRVhQTE9SRVI7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgYXNzb2NpYXRlZCBrZXkgZnJvbSB0aGUgUGxhdGZvcm0gUHJvZHVjdCByZWdpc3RyeSBvciByZXR1cm4gdGhlCi0JICogV1RQIGRlZmF1bHQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4gU3RyaW5nIHZhbHVlIG9mIHByb2R1Y3QncyBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKLQkJaWYgKGtleSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCWlmIChQbGF0Zm9ybS5nZXRQcm9kdWN0KCkhPW51bGwpCi0JCQl2YWx1ZSA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXRQcm9wZXJ0eShrZXkpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJaWYgKGtleS5lcXVhbHMoSVByb2R1Y3RDb25zdGFudHMuUEVSU1BFQ1RJVkVfRVhQTE9SRVJfVklFVykpCi0JCQkJcmV0dXJuIElEX1BFUlNQRUNUSVZFX0VYUExPUkVSX1ZJRVc7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxGb3JtYXR0aW5nU3RyYXRlZ3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxGb3JtYXR0aW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0MzJlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvWE1MRm9ybWF0dGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlR5cGVkUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JRm9ybWF0dGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdTdHJhdGVneUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmZvcm1hdHRlci5EZWZhdWx0WE1MUGFydGl0aW9uRm9ybWF0dGVyOwotCi1wdWJsaWMgY2xhc3MgWE1MRm9ybWF0dGluZ1N0cmF0ZWd5IGV4dGVuZHMgQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSUZvcm1hdHRpbmdTdHJhdGVneUV4dGVuc2lvbiB7Ci0KLQkvKiogRG9jdW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBieSB0aGlzIHN0cmF0ZWd5ICovCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZEb2N1bWVudHMgPSBuZXcgTGlua2VkTGlzdCgpOwotCS8qKiBQYXJ0aXRpb25zIHRvIGJlIGZvcm1hdHRlZCBieSB0aGlzIHN0cmF0ZWd5ICovCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZQYXJ0aXRpb25zID0gbmV3IExpbmtlZExpc3QoKTsKLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQlwcml2YXRlIERlZmF1bHRYTUxQYXJ0aXRpb25Gb3JtYXR0ZXIgZm9ybWF0dGVyID0gbmV3IERlZmF1bHRYTUxQYXJ0aXRpb25Gb3JtYXR0ZXIoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBmb3JtYXRQcm9jZXNzb3IKLQkgKi8KLQlwdWJsaWMgWE1MRm9ybWF0dGluZ1N0cmF0ZWd5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kjZm9ybWF0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXQoKSB7Ci0JCXN1cGVyLmZvcm1hdCgpOwotCi0JCWZpbmFsIElEb2N1bWVudCBkb2N1bWVudCA9IChJRG9jdW1lbnQpIGZEb2N1bWVudHMucmVtb3ZlRmlyc3QoKTsKLQkJZmluYWwgVHlwZWRQb3NpdGlvbiBwYXJ0aXRpb24gPSAoVHlwZWRQb3NpdGlvbikgZlBhcnRpdGlvbnMucmVtb3ZlRmlyc3QoKTsKLQotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBwYXJ0aXRpb24gIT0gbnVsbCAmJiBmUmVnaW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KTsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJVGV4dEVkaXQgZWRpdCA9IGZvcm1hdHRlci5mb3JtYXQobW9kZWwsIGZSZWdpb24uZ2V0T2Zmc2V0KCksIGZSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCQkJCQkJZWRpdC5hcHBseShkb2N1bWVudCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kjZm9ybWF0dGVyU3RhcnRzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXR0ZXJTdGFydHMoZmluYWwgSUZvcm1hdHRpbmdDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIuZm9ybWF0dGVyU3RhcnRzKGNvbnRleHQpOwotCi0JCWZQYXJ0aXRpb25zLmFkZExhc3QoY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9QQVJUSVRJT04pKTsKLQkJZkRvY3VtZW50cy5hZGRMYXN0KGNvbnRleHQuZ2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfTUVESVVNKSk7Ci0JCWZSZWdpb24gPSAoSVJlZ2lvbikgY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9SRUdJT04pOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kjZm9ybWF0dGVyU3RvcHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdHRlclN0b3BzKCkgewotCQlzdXBlci5mb3JtYXR0ZXJTdG9wcygpOwotCi0JCWZQYXJ0aXRpb25zLmNsZWFyKCk7Ci0JCWZEb2N1bWVudHMuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvWE1MVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL1hNTFVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlhNDVkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvWE1MVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogQmVuamFtaW4gTXVza2FsbGEsIGIubXVza2FsbGFAZ214Lm5ldCAtIFsxNTg2NjBdIGNoYXJhY3RlciBlbnRpdGllcyBzaG91bGQgaGF2ZSB0aGVpciBvd24gc3ludGF4IGhpZ2hsaWdodGluZyBwcmVmZXJlbmNlCi0gKiBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gWzIwNTk4OV0gLSBbdmFsaWRhdGlvbl0gdmFsaWRhdGUgWE1MIGFmdGVyIFhJbmNsdWRlIHJlc29sdXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBYTUwgVUkKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhbXBsZV9YTUxfZG9jOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1lbnRfRGVsaW1pdGVyc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWVudF9Db250ZW50X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfRGVsaW1pdGVyc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX05hbWVzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfTmFtZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV9FcXVhbHNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV9WYWx1ZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlY2xhcmF0aW9uX0RlbGltaXRlcnNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENEQVRBX0RlbGltaXRlcnNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENEQVRBX0NvbnRlbnRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NpbmdfSW5zdHJ1Y3Rpb25fRGVsX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzaW5nX0luc3RydWN0aW9uX0Nvbl9VSV9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPQ1RZUEVfTmFtZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9DVFlQRV9TWVNURU1fUFVCTElDX0tleXdfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPQ1RZUEVfUHVibGljX1JlZmVyZW5jZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9DVFlQRV9TeXN0ZW1fUmVmZXJlbmNlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlfUmVmZXJlbmNlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERUxFVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX1BST0NFU1NJTkdfSU5TVFJVQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX0FGVEVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9BVFRSSUJVVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX0JFRk9SRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9BRERfQ0hJTEQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfUkVNT1ZFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1JFUExBQ0VfV0lUSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9FRElUX0RPQ1RZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1VORE9fUkVQTEFDRV9ERVNDUklQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRURJVF9ET0NUWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JTkZPX0VYUEFORF9BTEw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lORk9fQ09MTEFQU0VfQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9EVERfSU5GT1JNQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX1NDSEVNQV9JTkZPUk1BVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9FRElUX1BST0NFU1NJTkdfSU5TVFJVQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfRURJVF9OQU1FU1BBQ0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9EVERfSU5GT1JNQVRJT05fVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfRURJVF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0VESVRfU0NIRU1BX0lORk9STUFUSU9OX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX05FV19BVFRSSUJVVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfTkVXX0FUVFJJQlVURV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9FRElUX0FUVFJJQlVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9FRElUX0FUVFJJQlVURV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9ORVdfRUxFTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9ORVdfRUxFTUVOVF9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9SRU5BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfUkVOQU1FX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTEVNRU5UX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX0NPTU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX1BST0NFU1NJTkdfSU5TVFJVQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX0NEQVRBX1NFQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX1BDREFUQTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9DT01NRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1BST0NFU1NJTkdfSU5TVFJVQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQ0RBVEFfU0VDVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9QQ0RBVEE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DT01NRU5UX1ZBTFVFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QSV9UQVJHRVRfVkFMVUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BJX0RBVEFfVkFMVUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1JPT1RfRUxFTUVOVF9WQUxVRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfVEFSR0VUX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9EQVRBX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ST09UX0VMRU1FTlRfTkFNRV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUFVCTElDX0lEX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TWVNURU1fSURfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0JST1dTRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQlJPV1NFXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NFTEVDVF9YTUxfQ0FUQUxPR19FTlRSWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU1BFQ0lGWV9TWVNURU1fSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NFTEVDVF9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9LRVk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1VSSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfWE1MX0NBVEFMT0dfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BTUVTUEFDRV9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9MT0NBVElPTl9ISU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QUkVGSVg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BTUVTUEFDRV9OQU1FX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9MT0NBVElPTl9ISU5UX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QUkVGSVhfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX05PX05BTUVTUEFDRV9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9OT19QUkVGSVg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1hNTF9TQ0hFTUFfSU5GT1JNQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BTUVfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1ZBTFVFX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fTkVXOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fRURJVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkVXX05BTUVTUEFDRV9JTkZPUk1BVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkFESU9fQlVUVE9OX1NFTEVDVF9GUk9NX1dPUktTUEFDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkFESU9fQlVUVE9OX1NFTEVDVF9GUk9NX0NBVEFMT0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIT1VUX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIT1VUX1BSRUZJWDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhfUFJFRklYOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX1NDSEVNQV9DQU5fTk9UX0JFX0xPQ0FURUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTE9DQVRJT05fSElOVF9OT1RfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX05BTUVTUEFDRV9OQU1FX05PVF9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfUFJFRklYX05PVF9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfUk9PVF9FTEVNRU5UX01VU1RfQkVfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX1NZU1RFTV9JRF9NVVNUX0JFX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSU5WQUxJRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FTlRFUl9SRVFfUFJFRklYX0FORF9OQU1FU1BBQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NFTEVDVF9SRUdJU1RFUkVEX05BTUVTUEFDRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NQRUNJRllfTkVXX05BTUVTUEFDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU0VMRUNUX05BTUVTUEFDRV9UT19BREQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FERF9OQU1FU1BBQ0VfREVDTEFSQVRJT05TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9OQU1FU1BBQ0VfREVDTEFSQVRJT05TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9UQVJHRVRfTkFNRVNQQUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9YTUxfQVRUUklCVVRFX0FMUkVBRFlfRVhJU1RTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9YTUxfQVRUUklCVVRFX0lTX0lOVkFMSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfbWVzc2FnZV9nb2VzX2hlcmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWxfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWxfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zZXJ0UmVxdWlyZWRBdHRyc1F1aWNrQXNzaXN0UHJvcG9zYWxfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuY29kaW5nU2V0dGluZ3NfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmNvZGluZ1NldHRpbmdzXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHJhZ05vZGVDb21tYW5kXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHJhZ05vZGVDb21tYW5kXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2dfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKRmFjZU5vZGVBZGFwdGVyXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF8xMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF8xMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF8xMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF8xMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF8xNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF8xNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hEZWZhdWx0RW5jb2RpbmdTZXR0aW5nc18wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZnJlc2hvdXRsaW5lXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfZmlsZXNfZW5jb2Rpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kX3RhZ19oYXNfYXR0cmlidXRlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfX2lzX21pc3NpbmdfYV92YWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfX2hhc19ub192YWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaXNzaW5nX2VuZF90YWdfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3Npbmdfc3RhcnRfdGFnXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVjb25jaWxlU3RlcEZvck1hcmt1cF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVjb25jaWxlU3RlcEZvck1hcmt1cF80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kX3dpdGhfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFVkVSRV9pbnRlcm5hbF9lcnJvcl9vY2N1X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb19rbm93bl9hdHRyaWJ1dGVfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50X0Fzc2lzdF9ub3RfYXZhaWxhYl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudF9faXNfdW5rbm93bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tZW50X187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xvc2Vfd2l0aF9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZF93aXRoX187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xvc2Vfd2l0aF9fXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbG9zZV93aXRoX19fXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfSGFzX25vX2F2YWlsYWJsZV9jaGlsZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb19rbm93bl9jaGlsZF90YWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX19IYXNfbm9fa25vd25fY2hpbGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fa25vd25fY2hpbGRfdGFnX25hbWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRoZV9kb2N1bWVudF9lbGVtZW50X187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fZGVmaW5pdGlvbl9mb3JfaW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fZGVmaW5pdGlvbl9mb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fY29udGVudF9tb2RlbF9mb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fY29udGVudF9tb2RlbF9mb3VuZF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcHJlc3NfZW1wdHlfZWxlbWVudF90YWdzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnNlcnRfcmVxdWlyZWRfYXR0cmlidXRlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zZXJ0X21pc3NpbmdfdGFnc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVvdGVfYXR0cmlidXRlX3ZhbHVlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0X3NvdXJjZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udmVydF9FT0xfY29kZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc2VydF9YTUxfZGVjbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFT0xfV2luZG93c19VSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFT0xfVW5peF9VSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFT0xfTWFjX1VJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0aW5nX2ZpbGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuY29kaW5nX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5jb2Rpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfb3Jfc2F2aW5nX2ZpbGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZF9vZl9saW5lX2NvZGVfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmRfb2ZfbGluZV9jb2RlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9XaW5kb3dzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9Vbml4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9NYWM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU9MX05vVHJhbnNsYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MRmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTENvbnRlbnRBc3Npc3RQcmVmZXJlbmNlUGFnZV9BdXRvX0FjdGl2YXRpb25fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTENvbnRlbnRBc3Npc3RQcmVmZXJlbmNlUGFnZV9DeWNsaW5nX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNhbGx5X21ha2Vfc3VnZ2VzdF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvbXB0X3doZW5fdGhlc2VfY2hhcmFjdGVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdHRpbmdfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExpbmVfd2lkdGhfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTcGxpdF9tdWx0aXBsZV9hdHRyaWJ1dGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFsaWduX2ZpbmFsX2JyYWNrZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlc2VydmVfUENEQVRBX0NvbnRlbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3BhY2VfYmVmb3JlX2VtcHR5X2Nsb3NlX3RhZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRlbnRfdXNpbmdfdGFiczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRlbnRfdXNpbmdfc3BhY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZGVudGF0aW9uX3NpemU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kZW50YXRpb25fc2l6ZV90aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYXJfYWxsX2JsYW5rX2xpbmVzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRfY29tbWVudHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0X2NvbW1lbnRzX2pvaW5fbGluZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR3JhbW1hcl9Db25zdHJhaW50czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VfaW5mZXJyZWRfZ3JhbW1hcl9pbl9hYnNlbmNlX29mOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN1Z2dlc3Rpb25fU3RyYXRlZ3k7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3VnZ2VzdGlvbl9TdHJhdGVneV9MYXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3VnZ2VzdGlvbl9TdHJhdGVneV9TdHJpY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudF9fX18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRfTW9kZWxfX19fMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfX19fMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhX1R5cGVfX19fNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnVtZXJhdGVkX1ZhbHVlc19fX181OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRfVmFsdWVfX19fNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb2N1bWVudGF0aW9uX3ZpZXdfZGVmYXVsdF9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU291cmNlTWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tZW50X2xhYmVsOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tZW50X3Rvb2x0aXA7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1lbnRfZGVzY3JpcHRpb247IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuY29tbWVudF9sYWJlbDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5jb21tZW50X3Rvb2x0aXA7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuY29tbWVudF9kZXNjcmlwdGlvbjsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9sYWJlbDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF90b29sdGlwOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfbGFiZWw7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF90b29sdGlwOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb247IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXA7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2xhYmVsOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfdG9vbHRpcDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaW5kT2NjdXJyZW5jZXNfbGFiZWw7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5GaWxlRnJvbVNvdXJjZV9sYWJlbDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkZpbGVGcm9tU291cmNlX3Rvb2x0aXA7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5GaWxlRnJvbVNvdXJjZV9kZXNjcmlwdGlvbjsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVHlwaW5nX0F1dG9fQ29tcGxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVHlwaW5nX0F1dG9fUmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFR5cGluZ19Db21wbGV0ZV9Db21tZW50czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUeXBpbmdfQ2xvc2VfU3RyaW5nczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUeXBpbmdfQ2xvc2VfQnJhY2tldHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVHlwaW5nX0NvbXBsZXRlX0VuZF9UYWdzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFR5cGluZ19Db21wbGV0ZV9FbGVtZW50czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUeXBpbmdfUmVtb3ZlX0VuZF9UYWdzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFR5cGluZ19TdGFydF9UYWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVHlwaW5nX0VuZF9UYWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3ROZXh0X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9YTUxfVkFMSURBVElPTl9NRVNTQUdFX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRpY2F0ZV9ub19ncmFtbWFyX3NwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRpY2F0ZV9ub19ncmFtbWFyX3NwZWNpZmllZF9zZXZlcml0aWVzX2Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZGljYXRlX25vX2dyYW1tYXJfc3BlY2lmaWVkX3NldmVyaXRpZXNfd2FybmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRpY2F0ZV9ub19ncmFtbWFyX3NwZWNpZmllZF9zZXZlcml0aWVzX2lnbm9yZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW5nX2ZpbGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVtcHR5RmlsZVByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NUUlVDVFVSRURfVEVYVF9FRElUT1JfUFJFRlNfTElOSzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnb3RvTWF0Y2hpbmdUYWdfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ290b01hdGNoaW5nVGFnX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdvdG9NYXRjaGluZ1RhZ19zdGFydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnb3RvTWF0Y2hpbmdUYWdfZW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5leHRTaWJsaW5nX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5leHRTaWJsaW5nX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXZpb3VzU2libGluZ19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV2aW91c1NpYmxpbmdfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlX1hJbmNsdWRlOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEhvbm91cl9hbGxfc2NoZW1hX2xvY2F0aW9uczsgICAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fU09SVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXJrdXBWYWxpZGF0aW9uX2ZpbGVzX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcmt1cFZhbGlkYXRpb25fZmlsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2V2ZXJpdHlfZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2V2ZXJpdHlfd2FybmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXZlcml0eV9pZ25vcmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW1wdHlfZWxlbWVudF90YWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kX3RhZ193aXRoX2F0dHJpYnV0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF93aGl0ZXNwYWNlX2JlZm9yZV90YWduYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdfY2xvc2luZ19icmFja2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdfY2xvc2luZ19xdW90ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaXNzaW5nX2VuZF90YWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ19zdGFydF90YWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ19xdW90ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmFtZXNwYWNlX2luX3BpX3RhcmdldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfbmFtZV9taXNzaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdoaXRlc3BhY2VfYXRfc3RhcnQ7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgWE1MVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBYTUxVSU1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZlJlc291cmNlQnVuZGxlID09IG51bGwpIHsKLQkJCQlmUmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJZlJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZlJlc291cmNlQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL1hNTFVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOGYxNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL1hNTFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFhNTFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgWE1MVUlQbHVnaW4gaW5zdGFuY2UgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBYTUxVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWE1MVUlQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgeG1sIGVkaXRvci4KLQkgKi8KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSB4bWwgZWRpdG9yLgotCSAqIAotCSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQotCXB1YmxpYyBYTUxVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGdldEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSB4bWwgZWRpdG9yIHRlbXBsYXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIHhtbCBlZGl0b3IgdGVtcGxhdGVzCi0JICovCi0JcHVibGljIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJaWYgKGZUZW1wbGF0ZVN0b3JlID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVN0b3JlID0gbmV3IENvbnRyaWJ1dGlvblRlbXBsYXRlU3RvcmUoZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSwgZ2V0UHJlZmVyZW5jZVN0b3JlKCksIFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRFTVBMQVRFU19LRVkpOwotCi0JCQl0cnkgewotCQkJCWZUZW1wbGF0ZVN0b3JlLmxvYWQoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlU3RvcmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgeG1sIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSB4bWwgcGx1Z2luCi0JICovCi0JcHVibGljIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSB7Ci0JCWlmIChmQ29udGV4dFR5cGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IENvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkoKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuQUxMKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuTkVXKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuVEFHKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuQVRUUklCVVRFKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuQVRUUklCVVRFX1ZBTFVFKTsKLQotCQkJZkNvbnRleHRUeXBlUmVnaXN0cnkgPSByZWdpc3RyeTsKLQkJfQotCi0JCXJldHVybiBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYW4gaW1hZ2UgZnJvbSB0aGUgcmVnaXN0cnkuCi0JICogCi0JICogKlRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIHJlZmVyZW5jaW5nZmlsZSBkaWFsb2cgYW5kIHNob3VsZCBiZQotCSAqIHJlbW92ZWQgd2hlbiB0aGUgZGlhbG9nIGlzIG1vdmVkIHRvIGFub3RoZXJjb21wb25lbnQuCi0JICogCi0JICogQHBhcmFtIGltYWdlTmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGltYWdlLgotCSAqIEByZXR1cm4gVGhlIGltYWdlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBuYW1lLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgaW1hZ2VOYW1lKSB7Ci0JCXJldHVybiBnZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShpbWFnZU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL1hNTFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYWFjZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL1hNTFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICBCZW5qYW1pbiBNdXNrYWxsYSwgYi5tdXNrYWxsYUBnbXgubmV0IC0gWzE1ODY2MF0gY2hhcmFjdGVyIGVudGl0aWVzIHNob3VsZCBoYXZlIHRoZWlyIG93biBzeW50YXggaGlnaGxpZ2h0aW5nIHByZWZlcmVuY2UKLSMgICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBbMjA1OTg5XSAtIFt2YWxpZGF0aW9uXSB2YWxpZGF0ZSBYTUwgYWZ0ZXIgWEluY2x1ZGUgcmVzb2x1dGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMgVGhlIGZvbGxvd2luZyBsaW5lIGlzIGEgc2FtcGxlIFhNTCBkb2N1bWVudC4gIFBsZWFzZSB0cmFuc2xhdGUgb25seSB0aGUgZm9sbG93aW5nIHBhcnRzOgotIyMgYmVnaW4gY29sb3IgZGVmaW5pdGlvbnMKLSMjIE5vcm1hbCB0ZXh0IGNvbnRlbnQuCi1TYW1wbGVfWE1MX2RvYz08P3htbCB2ZXJzaW9uPVwiMS4wXCI/PlxuPD9jdXN0b21Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25cblx0WE1MIHByb2Nlc3NvciBzcGVjaWZpY1xuXHRjb250ZW50ID8+XG48IURPQ1RZUEUgY29sb3JzXG5cdFBVQkxJQyBcIi8vSUJNL1hNTC9DT0xPUlMvXCIgXCJjb2xvcnMuZHRkXCI+XG48Y29sb3JzPlxuXHQ8IS0tIGJlZ2luIGNvbG9yIGRlZmluaXRpb25zIC0tPlxuXHQ8Y29sb3IgbmFtZT1cInBsYWludGV4dFwiIGZvcmVncm91bmQ9XCIjMDAwMDAwXCJcblx0XHRiYWNrZ3JvdW5kPVwiI0Q0RDBDOFwiIC8+XG5cdDxjb2xvciBuYW1lPVwiYm9sZFwiIGZvcmVncm91bmQ9XCIjMDAwMDAwXCJcblx0XHRiYWNrZ3JvdW5kPVwiI0IzQUNBMFwiIC8+XG5cdDwhW0NEQVRBWzwxMjM0NTY3ODk+XV0+XG5cdE5vcm1hbCB0ZXh0IGNvbnRlbnQuXG5cdD09PSZndDtsb29rIGF0IG1lISZsdDs9PT1cblx0PGNvbG9yIG5hbWU9XCJpbnZlcnNlXCIgZm9yZWdyb3VuZD1cIiNGMEYwRjBcIlxuXHRcdGJhY2tncm91bmQ9XCIjRDREMEM4XCIgLz5cblxuPC9jb2xvcnM+XG4KLUNvbW1lbnRfRGVsaW1pdGVyc19VSV89Q29tbWVudCBEZWxpbWl0ZXJzCi1Db21tZW50X0NvbnRlbnRfVUlfPUNvbW1lbnQgQ29udGVudAotVGFnX0RlbGltaXRlcnNfVUlfPVRhZyBEZWxpbWl0ZXJzCi1UYWdfTmFtZXNfVUlfPVRhZyBOYW1lcwotQXR0cmlidXRlX05hbWVzX1VJXz1BdHRyaWJ1dGUgTmFtZXMKLUF0dHJpYnV0ZV9FcXVhbHNfVUlfPUF0dHJpYnV0ZSBFcXVhbCBTaWducwotQXR0cmlidXRlX1ZhbHVlc19VSV89QXR0cmlidXRlIFZhbHVlcwotRGVjbGFyYXRpb25fRGVsaW1pdGVyc19VSV89RGVjbGFyYXRpb24gRGVsaW1pdGVycwotQ29udGVudF9VSV89Q29udGVudAotRW50aXR5X1JlZmVyZW5jZV9VSV89RW50aXR5IFJlZmVyZW5jZXMKLSMjIG9uIHRoZSBmb2xsb3dpbmcgMiBsaW5lcywgZG8gbm90IHRyYW5zbGF0ZSBDREFUQQotQ0RBVEFfRGVsaW1pdGVyc19VSV89Q0RBVEEgRGVsaW1pdGVycwotQ0RBVEFfQ29udGVudF9VSV89Q0RBVEEgQ29udGVudAotUHJvY2Vzc2luZ19JbnN0cnVjdGlvbl9EZWxfVUlfPVByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24gRGVsaW1pdGVycwotUHJvY2Vzc2luZ19JbnN0cnVjdGlvbl9Db25fVUlfX1VJXz1Qcm9jZXNzaW5nIEluc3RydWN0aW9uIENvbnRlbnQKLSMjIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBzb2xlbHkgdHJhbnNsYXRlOiAgTmFtZQotRE9DVFlQRV9OYW1lX1VJXz1ET0NUWVBFIE5hbWUKLSMjIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBzb2xlbHkgdHJhbnNsYXRlOiAgS2V5d29yZAotRE9DVFlQRV9TWVNURU1fUFVCTElDX0tleXdfVUlfPURPQ1RZUEUgU1lTVEVNL1BVQkxJQyBLZXl3b3JkCi0jIyBvbiB0aGUgZm9sbG93aW5nIGxpbmUgc29sZWx5IHRyYW5zbGF0ZTogIFB1YmxpYyBSZWZlcmVuY2UKLURPQ1RZUEVfUHVibGljX1JlZmVyZW5jZV9VSV89RE9DVFlQRSBQdWJsaWMgUmVmZXJlbmNlCi0jIyBvbiB0aGUgZm9sbG93aW5nIGxpbmUgc29sZWx5IHRyYW5zbGF0ZTogIFN5c3RlbSBSZWZlcmVuY2UKLURPQ1RZUEVfU3lzdGVtX1JlZmVyZW5jZV9VSV89RE9DVFlQRSBTeXN0ZW0gUmVmZXJlbmNlCi0jIFhNTCBDb21tb24gVUkKLSMgQ29uc3RhbnRzIGZvciBzdHJpbmdzCi0KLURFTEVURT1SZW1vdmUKLUFERF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OPUFkZCBQcm9jZXNzaW5nIEluc3RydWN0aW9uCi0KLV9VSV9NRU5VX0FERF9BRlRFUj1BZGQgJkFmdGVyCi1fVUlfTUVOVV9BRERfQVRUUklCVVRFPUFkZCBBJnR0cmlidXRlCi1fVUlfTUVOVV9BRERfQkVGT1JFPUFkZCAmQmVmb3JlCi1fVUlfTUVOVV9BRERfQ0hJTEQ9QWRkICZDaGlsZAotX1VJX01FTlVfUkVNT1ZFPVJlJm1vdmUKLV9VSV9NRU5VX1JFUExBQ0VfV0lUSD1SZSZwbGFjZSBXaXRoCi1fVUlfTUVOVV9FRElUX0RPQ1RZUEU9RWRpdCBET0NUWVBFLi4uCi1fVUlfTEFCRUxfVU5ET19SRVBMQUNFX0RFU0NSSVBUSU9OPVJlcGxhY2UKLV9VSV9MQUJFTF9FRElUX0RPQ1RZUEU9RWRpdCBET0NUWVBFCi1fVUlfSU5GT19FWFBBTkRfQUxMPUV4cGFuZCBBbGwKLV9VSV9JTkZPX0NPTExBUFNFX0FMTD1Db2xsYXBzZSBBbGwKLQotX1VJX01FTlVfQUREX0RURF9JTkZPUk1BVElPTj1BZGQgRFREIEluZm9ybWF0aW9uLi4uCi1fVUlfTUVOVV9BRERfU0NIRU1BX0lORk9STUFUSU9OPUFkZCBTY2hlbWEgSW5mb3JtYXRpb24uLi4KLV9VSV9NRU5VX0VESVRfUFJPQ0VTU0lOR19JTlNUUlVDVElPTj1FZGl0IFByb2Nlc3MmaW5nIEluc3RydWN0aW9uLi4uCi1fVUlfTUVOVV9FRElUX05BTUVTUEFDRVM9RWRpdCAmTmFtZXNwYWNlcy4uLgotCi1fVUlfTUVOVV9BRERfRFREX0lORk9STUFUSU9OX1RJVExFPUFkZCBEVEQgSW5mb3JtYXRpb24KLV9VSV9NRU5VX0VESVRfUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9USVRMRT1FZGl0IFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24KLV9VSV9NRU5VX0VESVRfU0NIRU1BX0lORk9STUFUSU9OX1RJVExFPUVkaXQgU2NoZW1hIEluZm9ybWF0aW9uCi0KLV9VSV9NRU5VX05FV19BVFRSSUJVVEU9Jk5ldyBBdHRyaWJ1dGUuLi4KLV9VSV9NRU5VX05FV19BVFRSSUJVVEVfVElUTEU9TmV3IEF0dHJpYnV0ZQotX1VJX01FTlVfRURJVF9BVFRSSUJVVEU9RWRpdCBBdHRyaWJ1dGUuLi4KLV9VSV9NRU5VX0VESVRfQVRUUklCVVRFX1RJVExFPUVkaXQgQXR0cmlidXRlCi1fVUlfTUVOVV9ORVdfRUxFTUVOVD1OZXcgJkVsZW1lbnQuLi4KLV9VSV9NRU5VX05FV19FTEVNRU5UX1RJVExFPU5ldyBFbGVtZW50Ci1fVUlfTUVOVV9SRU5BTUU9UiZlbmFtZQotX1VJX01FTlVfUkVOQU1FX1RJVExFPVJlbmFtZQotX1VJX0xBQkVMX0VMRU1FTlRfTkFNRT1FbGVtZW50IG5hbWU6Ci0KLV9VSV9NRU5VX0FERF9DT01NRU5UPUFkZCBDb21tZW50Ci1fVUlfTUVOVV9BRERfUFJPQ0VTU0lOR19JTlNUUlVDVElPTj1BZGQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbgotX1VJX01FTlVfQUREX0NEQVRBX1NFQ1RJT049QWRkIENEQVRBIFNlY3Rpb24KLV9VSV9NRU5VX0FERF9QQ0RBVEE9QWRkICNQQ0RBVEE7Ci0KLV9VSV9NRU5VX0NPTU1FTlQ9QyZvbW1lbnQKLV9VSV9NRU5VX1BST0NFU1NJTkdfSU5TVFJVQ1RJT049UCZyb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24KLV9VSV9NRU5VX0NEQVRBX1NFQ1RJT049Q0RBVEEgU2VjdGlvbgotX1VJX01FTlVfUENEQVRBPSNQQyZEQVRBOwotCi1fVUlfTUVOVV9BREQ9QWRkCi0KLV9VSV9DT01NRU5UX1ZBTFVFPWNvbW1lbnQKLV9VSV9QSV9UQVJHRVRfVkFMVUU9dGFyZ2V0Ci1fVUlfUElfREFUQV9WQUxVRT1kYXRhCi1fVUlfTEFCRUxfUk9PVF9FTEVNRU5UX1ZBTFVFPVJvb3RFbGVtZW50Ci0KLV9VSV9MQUJFTF9UQVJHRVRfQ09MT049VGFyZ2V0OgotX1VJX0xBQkVMX0RBVEFfQ09MT049RGF0YToKLV9VSV9MQUJFTF9ST09UX0VMRU1FTlRfTkFNRV9DT0xPTj1Sb290ICZlbGVtZW50IG5hbWU6Ci1fVUlfTEFCRUxfUFVCTElDX0lEX0NPTE9OPSZQdWJsaWMgSUQ6Ci1fVUlfTEFCRUxfU1lTVEVNX0lEX0NPTE9OPSZTeXN0ZW0gSUQ6Ci1fVUlfTEFCRUxfQlJPV1NFPSZCcm93c2UuLi4KLV9VSV9MQUJFTF9CUk9XU0VfMT1CJnJvd3NlLi4uCi1fVUlfTEFCRUxfU0VMRUNUX1hNTF9DQVRBTE9HX0VOVFJZPVNlbGVjdCBYTUwgQ2F0YWxvZyBFbnRyeQotX1VJX0xBQkVMX1NQRUNJRllfU1lTVEVNX0lEPVNwZWNpZnkgU3lzdGVtIElECi1fVUlfTEFCRUxfU0VMRUNUX0ZJTEU9U2VsZWN0IEZpbGUKLQotX1VJX0xBQkVMX0tFWT1LZXkKLV9VSV9MQUJFTF9VUkk9VVJJOgotX1VJX0xBQkVMX1hNTF9DQVRBTE9HX0NPTE9OPVhNTCAmQ2F0YWxvZwotX1VJX0xBQkVMX05BTUVTUEFDRV9OQU1FPU5hbWVzcGFjZSBOYW1lCi1fVUlfTEFCRUxfTE9DQVRJT05fSElOVD1Mb2NhdGlvbiBIaW50Ci1fVUlfTEFCRUxfUFJFRklYPVByZWZpeAotX1VJX0xBQkVMX05BTUVTUEFDRV9OQU1FX0NPTE9OPSZOYW1lc3BhY2UgTmFtZToKLV9VSV9MQUJFTF9MT0NBVElPTl9ISU5UX0NPTE9OPSZMb2NhdGlvbiBIaW50OgotX1VJX0xBQkVMX1BSRUZJWF9DT0xPTj0mUHJlZml4OgotX1VJX05PX05BTUVTUEFDRV9OQU1FPTxubyBuYW1lc3BhY2UgbmFtZT4KLV9VSV9OT19QUkVGSVg9PG5vIHByZWZpeD4KLQotX1VJX0xBQkVMX1hNTF9TQ0hFTUFfSU5GT1JNQVRJT049WE1MIFNjaGVtYSBJbmZvcm1hdGlvbgotCi1fVUlfTEFCRUxfTkFNRV9DT0xPTj1OYW1lOgotX1VJX0xBQkVMX1ZBTFVFX0NPTE9OPVZhbHVlOgotCi1fVUlfQlVUVE9OX0RFTEVURT0mRGVsZXRlCi1fVUlfQlVUVE9OX05FVz1OZXcuLi4KLV9VSV9CVVRUT05fRURJVD0mRWRpdC4uLgotCi1fVUlfTEFCRUxfTkVXX05BTUVTUEFDRV9JTkZPUk1BVElPTj1OZXcgTmFtZXNwYWNlIEluZm9ybWF0aW9uCi0KLSMgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwuamF2YQotCi1fVUlfUkFESU9fQlVUVE9OX1NFTEVDVF9GUk9NX1dPUktTUEFDRT1TZWxlY3QgZmlsZSBmcm9tICZXb3Jrc3BhY2UKLV9VSV9SQURJT19CVVRUT05fU0VMRUNUX0ZST01fQ0FUQUxPRz1TZWxlY3QgJlhNTCBDYXRhbG9nIGVudHJ5Ci0KLV9VSV9XQVJOSU5HX01PUkVfVEhBTl9PTkVfTlNfV0lUSF9OQU1FPU1vcmUgdGhhbiBvbmUgbmFtZXNwYWNlIGhhcyBiZWVuIHNwZWNpZmllZCB3aXRoIHRoZSBuYW1lc3BhY2UgbmFtZSA6Ci1fVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhPVVRfTkFNRT1Nb3JlIHRoYW4gb25lIHNjaGVtYSBoYXMgYmVlbiBzcGVjaWZpZWQgd2l0aG91dCBhIG5hbWVzcGFjZSBuYW1lCi1fVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhPVVRfUFJFRklYPU1vcmUgdGhhbiBvbmUgbmFtZXNwYWNlIGhhcyBiZWVuIHNwZWNpZmljZWQgd2l0aG91dCBhIHByZWZpeAotX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIX1BSRUZJWD1Nb3JlIHRoYW4gb25lIG5hbWVzcGFjZSBoYXMgYmVlbiBzcGVjaWZpZWQgd2l0aCB0aGUgcHJlZml4IDoKLV9VSV9XQVJOSU5HX1NDSEVNQV9DQU5fTk9UX0JFX0xPQ0FURUQ9VGhlIHNwZWNpZmllZCBzY2hlbWEgY2FuIG5vdCBiZSBsb2NhdGVkIDoKLV9VSV9XQVJOSU5HX0xPQ0FUSU9OX0hJTlRfTk9UX1NQRUNJRklFRD1BIGxvY2F0aW9uIGhpbnQgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCBmb3IgdGhlIG5hbWVzcGFjZSB3aXRoIG5hbWUKLV9VSV9XQVJOSU5HX05BTUVTUEFDRV9OQU1FX05PVF9TUEVDSUZJRUQ9QSBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIGZvciB0aGUgbmFtZXNwYWNlIHdpdGggcHJlZml4IDoKLV9VSV9XQVJOSU5HX1BSRUZJWF9OT1RfU1BFQ0lGSUVEPUEgcHJlZml4IG11c3QgYmUgc3BlY2lmaWVkIGZvciB0aGUgbmFtZXNwYWNlIG5hbWVkIDoKLV9VSV9XQVJOSU5HX1JPT1RfRUxFTUVOVF9NVVNUX0JFX1NQRUNJRklFRD1BIHJvb3QgZWxlbWVudCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLgotX1VJX1dBUk5JTkdfU1lTVEVNX0lEX01VU1RfQkVfU1BFQ0lGSUVEPUEgc3lzdGVtIElEIG11c3QgYmUgc3BlY2lmaWVkLgotCi1fVUlfSU5WQUxJRF9OQU1FPUludmFsaWQgbmFtZQotCi0jIFN0cmluZyB1c2VkIGZvciBlZGl0aW5nIG5hbWVzcGFjZXMgKG9yZy5lY2xpcHNlLndzdC54bWwudWkubnNlZGl0KQotX1VJX0VOVEVSX1JFUV9QUkVGSVhfQU5EX05BTUVTUEFDRT1FbnRlciB0aGUgcmVxdWlyZWQgcHJlZml4IGFuZCBuYW1lc3BhY2UgVVJJIGZvciB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uLgotX1VJX1NFTEVDVF9SRUdJU1RFUkVEX05BTUVTUEFDRVM9U2VsZWN0IEZyb20gJlJlZ2lzdGVyZWQgTmFtZXNwYWNlcwotX1VJX1NQRUNJRllfTkVXX05BTUVTUEFDRT1TcGVjaWZ5IE5ldyBOYSZtZXNwYWNlCi1fVUlfU0VMRUNUX05BTUVTUEFDRV9UT19BREQ9JlNlbGVjdCB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyB0byBhZGQuCi1fVUlfQUREX05BTUVTUEFDRV9ERUNMQVJBVElPTlM9QWRkIE5hbWVzcGFjZSBEZWNsYXJhdGlvbnMKLV9VSV9OQU1FU1BBQ0VfREVDTEFSQVRJT05TPSZOYW1lc3BhY2UgRGVjbGFyYXRpb25zCi1fVUlfVEFSR0VUX05BTUVTUEFDRT1UYXJnZXQgTmFtZXNwYWNlCi0KLV9FUlJPUl9YTUxfQVRUUklCVVRFX0FMUkVBRFlfRVhJU1RTPVRoZSBlbGVtZW50IGFscmVhZHkgaGFzIGFuIGF0dHJpYnV0ZSB3aXRoIHRoaXMgbmFtZS4KLQotIwotZXJyb3JfbWVzc2FnZV9nb2VzX2hlcmU9ZXJyb3IgbWVzc2FnZSBnb2VzIGhlcmUKLVN1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsXzA9U3Vycm91bmQgd2l0aCBuZXcgZWxlbWVudAotU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWxfMT1TdXJyb3VuZCB3aXRoIG5ldyBlbGVtZW50Ci1SZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsXzA9TGluayBhbGwgcmVmZXJlbmNlcyBmb3IgYSByZW5hbWUgaW4gZmlsZSAoZG9lcyBub3QgY2hhbmdlIHJlZmVyZW5jZXMgaW4gb3RoZXIgZmlsZXMpCi1SZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsXzE9UmVuYW1lIGluIGZpbGUKLUluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsXzA9SW5zZXJ0IHJlcXVpcmVkIGF0dHJpYnV0ZXMKLUluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsXzE9SW5zZXJ0IHJlcXVpcmVkIGF0dHJpYnV0ZXMKLUVuY29kaW5nU2V0dGluZ3NfMD1JQU5BOgotRW5jb2RpbmdTZXR0aW5nc18xPUVuY29kaW5nOgotRHJhZ05vZGVDb21tYW5kXzA9TW92ZQotRHJhZ05vZGVDb21tYW5kXzE9Q29weQotQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2dfMD0mQWRkLi4uCi1KRmFjZU5vZGVBZGFwdGVyXzE9UmVmcmVzaCBQcm9wZXJ0eSBTaGVldAotUXVpY2tGaXhQcm9jZXNzb3JYTUxfMD1SZW1vdmUgZW1wdHkgdGFnCi1RdWlja0ZpeFByb2Nlc3NvclhNTF8xPUNoYW5nZSB0byBlbXB0eS1lbGVtZW50IHRhZwotUXVpY2tGaXhQcm9jZXNzb3JYTUxfMj1SZW1vdmUgdGhpcyB0YWcKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzM9SW5zZXJ0IGVuZCB0YWcgYmVmb3JlIGZpcnN0IGNoaWxkIGVsZW1lbnQKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzQ9SW5zZXJ0IGVuZCB0YWcgYXQgZW5kIG9mIGVsZW1lbnQKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzU9UmVtb3ZlIGF0dHJpYnV0ZXMgaW4gZW5kIHRhZwotUXVpY2tGaXhQcm9jZXNzb3JYTUxfNj1JbnNlcnQgZGVmYXVsdCBhdHRyaWJ1dGUgdmFsdWUKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzc9UmVtb3ZlIHRoaXMgYXR0cmlidXRlCi1RdWlja0ZpeFByb2Nlc3NvclhNTF84PVJlbW92ZSBzcGFjZXMgYmVmb3JlIHRhZyBuYW1lCi1RdWlja0ZpeFByb2Nlc3NvclhNTF85PVJlbW92ZSBzcGFjZXMgYmVmb3JlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KLVF1aWNrRml4UHJvY2Vzc29yWE1MXzEwPVJlbW92ZSBuYW1lc3BhY2UgaW4gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgotUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTE9UmVtb3ZlIHRoaXMgZWxlbWVudAotUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTI9UmVtb3ZlIHRoaXMgYXR0cmlidXRlIHZhbHVlCi1RdWlja0ZpeFByb2Nlc3NvclhNTF8xMz1JbnNlcnQgcmVxdWlyZWQgYXR0cmlidXRlCi1RdWlja0ZpeFByb2Nlc3NvclhNTF8xND1RdW90ZSBhdHRyaWJ1dGUgdmFsdWUKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzE1PUluc2VydCBjbG9zaW5nIGJyYWNrZXQKLVhNTFByb3BlcnR5U291cmNlQWRhcHRlcl8wPUF0dHJpYnV0ZXMKLQotV29ya2JlbmNoRGVmYXVsdEVuY29kaW5nU2V0dGluZ3NfMD1Vc2Ugd29ya3NwYWNlIGVuY29kaW5nCi1yZWZyZXNob3V0bGluZV8wPVJlZnJlc2hpbmcgT3V0bGluZQotQ3JlYXRpbmdfZmlsZXNfZW5jb2Rpbmc9Q3JlYXRpbmcgZmlsZXMgZW5jb2RpbmcgcHJlZmVyZW5jZQotIyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwCi1FbmRfdGFnX2hhc19hdHRyaWJ1dGVzPUVuZCB0YWcgaGFzIGF0dHJpYnV0ZXMKLUF0dHJpYnV0ZV9faXNfbWlzc2luZ19hX3ZhbHVlPUF0dHJpYnV0ZSBcInswfVwiIGlzIG1pc3NpbmcgYSB2YWx1ZQotQXR0cmlidXRlX19oYXNfbm9fdmFsdWU9QXR0cmlidXRlIFwiezB9XCIgIGhhcyBubyB2YWx1ZQotTWlzc2luZ19zdGFydF90YWdfPU1pc3Npbmcgc3RhcnQgdGFnIFwiezB9XCIKLU1pc3NpbmdfZW5kX3RhZ189TWlzc2luZyBlbmQgdGFnIFwiezB9XCIKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMD1NaXNzaW5nIGNsb3NpbmcgcXVvdGUKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMT1NaXNzaW5nIHF1b3RlcyBmb3IgYXR0cmlidXRlIHZhbHVlCi1SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzI9QSB0YWduYW1lIGNhbm5vdCBzdGFydCB3aXRoIGEgc3BhY2UKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMz1FbXB0eSB0YWdzIGFyZSBub3QgYWxsb3dlZAotUmVjb25jaWxlU3RlcEZvck1hcmt1cF80PU5hbWVzcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIGEgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbiB0YXJnZXQKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNT1TcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGJlZm9yZSBhIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24KLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNj1UYWcgbWlzc2luZyBjbG9zaW5nIGJyYWNrZXQgJz4nCi0jIENvbnRlbnQgQXNzaXN0Ci1FbmRfd2l0aF89RW5kIHdpdGggezB9PgotU0VWRVJFX2ludGVybmFsX2Vycm9yX29jY3VfVUlfPVNFVkVSRSBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZAotTm9fa25vd25fYXR0cmlidXRlX19VSV89Tm8ga25vd24gYXR0cmlidXRlCi1Db250ZW50X0Fzc2lzdF9ub3RfYXZhaWxhYl9VSV89Q29udGVudCBBc3Npc3Qgbm90IGF2YWlsYWJsZSBhdCB0aGUgY3VycmVudCBsb2NhdGlvbgotRWxlbWVudF9faXNfdW5rbm93bj1FbGVtZW50IDx7MH0+IGlzIHVua25vd24uCi1Db21tZW50X189Y29tbWVudCB7MH0KLUNsb3NlX3dpdGhfXz1DbG9zZSB3aXRoIHswfQotRW5kX3dpdGhfXz1FbmQgd2l0aCBcIjwvezB9PlwiCi1DbG9zZV93aXRoX19fPUNsb3NlIHdpdGggXCJ7MH1cIgotQ2xvc2Vfd2l0aF9fX189Q2xvc2Ugd2l0aCBcIj48L3swfT5cIgotX0hhc19ub19hdmFpbGFibGVfY2hpbGQ9ezB9IGhhcyBubyBhdmFpbGFibGUgY2hpbGQgdGFncy4KLU5vX2tub3duX2NoaWxkX3RhZz1ObyBrbm93biBjaGlsZCB0YWcgbmFtZXMgb2YgPHswfT4gYmVnaW4gd2l0aCBcInsxfVwiLgotX19IYXNfbm9fa25vd25fY2hpbGQ9PHswfT4gaGFzIG5vIGtub3duIGNoaWxkIHRhZ3MuCi1Ob19rbm93bl9jaGlsZF90YWdfbmFtZXM9Tm8ga25vd24gY2hpbGQgdGFnIG5hbWVzIG9mIDx7MH0+IGJlZ2luIHdpdGggXCJ7MX1cIgotVGhlX2RvY3VtZW50X2VsZW1lbnRfXz1UaGUgZG9jdW1lbnQgZWxlbWVudCA8ezB9PiBpcyBhbHJlYWR5IHByZXNlbnQuCi1Ob19kZWZpbml0aW9uX2Zvcl9pbj1ObyBkZWZpbml0aW9uIHdhcyBmb3VuZCBmb3IgZWxlbWVudCA8ezB9PiBpbiB7MX0KLU5vX2RlZmluaXRpb25fZm9yPU5vIGRlZmluaXRpb24gd2FzIGZvdW5kIGZvciBlbGVtZW50IDx7MH0+Ci1Ob19jb250ZW50X21vZGVsX2Zvcj1ObyBjb250ZW50IG1vZGVsIGZvdW5kIGZvciB7MH0uCi1Ob19jb250ZW50X21vZGVsX2ZvdW5kX1VJXz1ObyBjb250ZW50IG1vZGVsIGZvdW5kCi0jIyBUaGUgZm9sbG93aW5nIHN0cmluZ3MgYXJlIGZvciB0aGUgWE1MIENsZWFudXAgZGlhbG9nCi1DbGVhbnVwX1VJXz1DbGVhbnVwCi1Db21wcmVzc19lbXB0eV9lbGVtZW50X3RhZ3NfVUlfPSZDb21wcmVzcyBlbXB0eSBlbGVtZW50IHRhZ3MKLUluc2VydF9yZXF1aXJlZF9hdHRyaWJ1dGVzX1VJXz1JbnNlcnQgJnJlcXVpcmVkIGF0dHJpYnV0ZXMKLUluc2VydF9taXNzaW5nX3RhZ3NfVUlfPSZJbnNlcnQgbWlzc2luZyB0YWdzCi1RdW90ZV9hdHRyaWJ1dGVfdmFsdWVzX1VJXz0mUXVvdGUgYXR0cmlidXRlIHZhbHVlcwotRm9ybWF0X3NvdXJjZV9VSV89JkZvcm1hdCBzb3VyY2UKLUNvbnZlcnRfRU9MX2NvZGVzX1VJXz1Db252ZXJ0IGxpbmUgJmRlbGltaXRlcnMgdG8KLUluc2VydF9YTUxfZGVjbD1GaXggWE1MIGRlY2xhcmF0aW9uCi1FT0xfV2luZG93c19VST0mV2luZG93cwotRU9MX1VuaXhfVUk9VSZOSVgKLUVPTF9NYWNfVUk9Jk1hYwotIyMgWE1MIEZpbGVzIHByZWZlcmVuY2UgcGFnZQotQ3JlYXRpbmdfZmlsZXM9Q3JlYXRpbmcgZmlsZXMKLUVuY29kaW5nX2Rlc2M9VGhlIGZvbGxvd2luZyBlbmNvZGluZyB3aWxsIGFwcGx5OgotRW5jb2Rpbmc9RW4mY29kaW5nOgotQ3JlYXRpbmdfb3Jfc2F2aW5nX2ZpbGVzPUNyZWF0aW5nIG9yIHNhdmluZyBmaWxlcwotRW5kX29mX2xpbmVfY29kZV9kZXNjPVRoZSBmb2xsb3dpbmcgbGluZSBkZWxpbWl0ZXIgd2lsbCBhcHBseToKLUVuZF9vZl9saW5lX2NvZGU9JkxpbmUgZGVsaW1pdGVyOgotRU9MX1dpbmRvd3M9V2luZG93cwotRU9MX1VuaXg9VU5JWAotRU9MX01hYz1NYWMKLUVPTF9Ob1RyYW5zbGF0aW9uPU5vIHRyYW5zbGF0aW9uCi1WYWxpZGF0aW5nX2ZpbGVzPVZhbGlkYXRpbmcgZmlsZXMKLUluZGljYXRlX25vX2dyYW1tYXJfc3BlY2lmaWVkPUluZGljYXRlIHdoZW4gbm8gJmdyYW1tYXIgaXMgc3BlY2lmaWVkOgotSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWRfc2V2ZXJpdGllc19lcnJvcj1FcnJvcgotSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWRfc2V2ZXJpdGllc193YXJuaW5nPVdhcm5pbmcKLUluZGljYXRlX25vX2dyYW1tYXJfc3BlY2lmaWVkX3NldmVyaXRpZXNfaWdub3JlPUlnbm9yZQotWE1MRmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25MYWJlbD1BZGQgdGhpcyAmc3VmZml4IChpZiBub3Qgc3BlY2lmaWVkKToKLVhNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uRXJyb3I9U3VmZml4IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgezB9LgotIyMgWE1MIFNvdXJjZSBwcmVmZXJlbmNlIHBhZ2UKLVhNTENvbnRlbnRBc3Npc3RQcmVmZXJlbmNlUGFnZV9BdXRvX0FjdGl2YXRpb25fVUlfPUF1dG8gQWN0aXZhdGlvbgotWE1MQ29udGVudEFzc2lzdFByZWZlcmVuY2VQYWdlX0N5Y2xpbmdfVUlfPUN5Y2xpbmcKLUF1dG9tYXRpY2FsbHlfbWFrZV9zdWdnZXN0X1VJXz1BdXRvbWF0aWNhbGx5IG1hJmtlIHN1Z2dlc3Rpb25zCi1Qcm9tcHRfd2hlbl90aGVzZV9jaGFyYWN0ZV9VSV89UCZyb21wdCB3aGVuIHRoZXNlIGNoYXJhY3RlcnMgYXJlIGluc2VydGVkOgotRm9ybWF0dGluZ19VSV89Rm9ybWF0dGluZwotTGluZV93aWR0aF9fVUlfPUxpbmUgJndpZHRoOgotU3BsaXRfbXVsdGlwbGVfYXR0cmlidXRlcz1TcGxpdCAmbXVsdGlwbGUgYXR0cmlidXRlcyBlYWNoIG9uIGEgbmV3IGxpbmUKLUFsaWduX2ZpbmFsX2JyYWNrZXQ9JkFsaWduIGZpbmFsIGJyYWNrZXQgaW4gbXVsdGktbGluZSBlbGVtZW50IHRhZ3MKLVByZXNlcnZlX1BDREFUQV9Db250ZW50PSZQcmVzZXJ2ZSB3aGl0ZXNwYWNlIGluIHRhZ3Mgd2l0aCBQQ0RBVEEgY29udGVudAotU3BhY2VfYmVmb3JlX2VtcHR5X2Nsb3NlX3RhZz1JbnMmZXJ0IHdoaXRlc3BhY2UgYmVmb3JlIGNsb3NpbmcgZW1wdHkgZW5kLXRhZ3MKLUluZGVudF91c2luZ190YWJzPSZJbmRlbnQgdXNpbmcgdGFicwotSW5kZW50X3VzaW5nX3NwYWNlcz1JJm5kZW50IHVzaW5nIHNwYWNlcwotSW5kZW50YXRpb25fc2l6ZT1JbiZkZW50YXRpb24gc2l6ZToKLUluZGVudGF0aW9uX3NpemVfdGlwPUluZGVudGF0aW9uIHNpemUKLUNsZWFyX2FsbF9ibGFua19saW5lc19VSV89Q2xlYXIgYWxsICZibGFuayBsaW5lcwotRm9ybWF0X2NvbW1lbnRzPSZGb3JtYXQgY29tbWVudHMKLUZvcm1hdF9jb21tZW50c19qb2luX2xpbmVzPSZKb2luIGxpbmVzCi1HcmFtbWFyX0NvbnN0cmFpbnRzPUdyYW1tYXIgQ29uc3RyYWludHMKLVVzZV9pbmZlcnJlZF9ncmFtbWFyX2luX2Fic2VuY2Vfb2Y9JlVzZSBpbmZlcnJlZCBncmFtbWFyIGluIGFic2VuY2Ugb2YgRFREL1NjaGVtYQotU3VnZ2VzdGlvbl9TdHJhdGVneT0mU3VnZ2VzdGlvbiBzdHJhdGVneToKLVN1Z2dlc3Rpb25fU3RyYXRlZ3lfTGF4PUxheAotU3VnZ2VzdGlvbl9TdHJhdGVneV9TdHJpY3Q9U3RyaWN0Ci0jIyB0YWcgaW5mbwotRWxlbWVudF9fX18xPUVsZW1lbnQgOgotQ29udGVudF9Nb2RlbF9fX18yPUNvbnRlbnQgTW9kZWwgOgotQXR0cmlidXRlX19fXzM9QXR0cmlidXRlIDoKLURhdGFfVHlwZV9fX180PURhdGEgVHlwZSA6Ci1FbnVtZXJhdGVkX1ZhbHVlc19fX181PUVudW1lcmF0ZWQgVmFsdWVzIDoKLURlZmF1bHRfVmFsdWVfX19fNj1EZWZhdWx0IFZhbHVlIDoKLURvY3VtZW50YXRpb25fdmlld19kZWZhdWx0X21zZz08cD5TZWxlY3QgYSBub2RlIGluIHRoZSBlZGl0b3IgdG8gZGlzcGxheSBYTUwgRG9jdW1lbnRhdGlvbiBpZiBhbnkgaXMgYXZhaWxhYmxlLjwvcD4KLSMjIGNvcGllZCBmcm9tIHNzZS51aQotU291cmNlTWVudV9sYWJlbD0mU291cmNlCi1Db21tZW50X2xhYmVsPUNvJm1tZW50Ci1Db21tZW50X3Rvb2x0aXA9Q29tbWVudAotQ29tbWVudF9kZXNjcmlwdGlvbj1Db21tZW50Ci1VbmNvbW1lbnRfbGFiZWw9JlVuY29tbWVudAotVW5jb21tZW50X3Rvb2x0aXA9VW5jb21tZW50Ci1VbmNvbW1lbnRfZGVzY3JpcHRpb249VW5jb21tZW50Ci1Ub2dnbGVDb21tZW50X2xhYmVsPVRvZ2dsZSBDb21tZW50Ci1Ub2dnbGVDb21tZW50X3Rvb2x0aXA9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfZGVzY3JpcHRpb249VG9nZ2xlIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF9sYWJlbD1BZGQgQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X3Rvb2x0aXA9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbj1BZGQgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcD1SZW1vdmUgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uPVJlbW92ZSBCbG9jayBDb21tZW50Ci1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uPUNsZWFudXAgRG9jdW1lbnQKLUZpbmRPY2N1cnJlbmNlc19sYWJlbD1PY2N1cnJlbmNlcyBpbiBGaWxlCi1PcGVuRmlsZUZyb21Tb3VyY2VfbGFiZWw9T3AmZW4gU2VsZWN0aW9uCi1PcGVuRmlsZUZyb21Tb3VyY2VfdG9vbHRpcD1PcGVuIGFuIGVkaXRvciBvbiB0aGUgc2VsZWN0ZWQgbGluawotT3BlbkZpbGVGcm9tU291cmNlX2Rlc2NyaXB0aW9uPU9wZW4gYW4gZWRpdG9yIG9uIHRoZSBzZWxlY3RlZCBsaW5rCi1YTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb25fMD0mU2hvdyBBdHRyaWJ1dGVzCi1YTUxUeXBpbmdfQXV0b19Db21wbGV0ZT1BdXRvbWF0aWNhbGx5IGNsb3NlCi1YTUxUeXBpbmdfQXV0b19SZW1vdmU9QXV0b21hdGljYWxseSByZW1vdmUKLVhNTFR5cGluZ19Db21wbGV0ZV9Db21tZW50cz0mQ29tbWVudHMKLVhNTFR5cGluZ19DbG9zZV9TdHJpbmdzPUEmdHRyaWJ1dGUgdmFsdWVzCi1YTUxUeXBpbmdfQ2xvc2VfQnJhY2tldHM9KFBhcmVudGhlc2VzKSBhbmQgW3NxdWFyZV0gYnJhYyZrZXRzCi1YTUxUeXBpbmdfQ29tcGxldGVfRW5kX1RhZ3M9JkF1dG9tYXRpY2FsbHkgY2xvc2UgdGhlIHRhZwotWE1MVHlwaW5nX0NvbXBsZXRlX0VsZW1lbnRzPSZJbnNlcnQgYSBtYXRjaGluZyBlbmQgdGFnCi1YTUxUeXBpbmdfUmVtb3ZlX0VuZF9UYWdzPUUmbmQgdGFncyB3aGVuIGNyZWF0aW5nIGVtcHR5IHNlbGYtY2xvc2luZyB0YWdzCi1YTUxUeXBpbmdfU3RhcnRfVGFnPVdoZW4gdHlwaW5nIGEgc3RhcnQgdGFnCi1YTUxUeXBpbmdfRW5kX1RhZz1XaGVuIHR5cGluZyBhbiBlbmQgdGFnCi1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWw9RW5jbG9zaW5nIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBlbmNsb3NpbmcgZWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2Rlc2NyaXB0aW9uPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBlbmNsb3NpbmcgZWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbD1OZXh0IEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgbmV4dCBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2Rlc2NyaXB0aW9uPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsPVByZXZpb3VzIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2Rlc2NyaXB0aW9uPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBwcmV2aW91cyBzaWJsaW5nCi1NRVNTQUdFX1hNTF9WQUxJREFUSU9OX01FU1NBR0VfVUlfPVhNTCBWYWxpZGF0b3IgdmFsaWRhdGluZyB7MH0KLVN5bnRheENvbG9yaW5nUGFnZV8wPVN5bnRheCBFbGVtZW50OgotU3ludGF4Q29sb3JpbmdQYWdlXzI9RW5hYmxlCi1TeW50YXhDb2xvcmluZ1BhZ2VfMz0mQm9sZAotU3ludGF4Q29sb3JpbmdQYWdlXzQ9Jkl0YWxpYwotU3ludGF4Q29sb3JpbmdQYWdlXzU9JlN0cmlrZXRocm91Z2gKLVN5bnRheENvbG9yaW5nUGFnZV82PSZVbmRlcmxpbmUKLUVtcHR5RmlsZVByZWZlcmVuY2VQYWdlXzA9RXhwYW5kIHRoZSB0cmVlIHRvIGVkaXQgcHJlZmVyZW5jZXMgZm9yIGEgc3BlY2lmaWMgZmVhdHVyZS4KLV9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTks9WE1MIGVkaXRpbmcgcHJlZmVyZW5jZXMuICBOb3RlIHRoYXQgc29tZSBwcmVmZXJlbmNlcyBtYXkgYmUgc2V0IG9uIHRoZSA8YT57MH08L2E+IHByZWZlcmVuY2UgcGFnZS4KLVVzZV9YSW5jbHVkZT1Qcm9jZXNzIFhNTCAmSW5jbHVzaW9ucwotSG9ub3VyX2FsbF9zY2hlbWFfbG9jYXRpb25zPSZIb25vdXIgYWxsIFhNTCBzY2hlbWEgbG9jYXRpb25zCi1uZXh0U2libGluZ19sYWJlbD1OZXh0IFNpYmxpbmcKLW5leHRTaWJsaW5nX2Rlc2NyaXB0aW9uPUdvIHRvIE5leHQgU2libGluZwotcHJldmlvdXNTaWJsaW5nX2xhYmVsPVByZXZpb3VzIFNpYmxpbmcKLXByZXZpb3VzU2libGluZ19kZXNjcmlwdGlvbj1HbyB0byBQcmV2aW91cyBTaWJsaW5nCi1nb3RvTWF0Y2hpbmdUYWdfbGFiZWw9TWF0Y2hpbmcgVGFnCi1nb3RvTWF0Y2hpbmdUYWdfZGVzY3JpcHRpb249R28gVG8gTWF0Y2hpbmcgVGFnCi1nb3RvTWF0Y2hpbmdUYWdfc3RhcnQ9U3RhcnQgdGFnIG9mIGVsZW1lbnQgPHswfT4KLWdvdG9NYXRjaGluZ1RhZ19lbmQ9RW5kIHRhZyBvZiBlbGVtZW50IDx7MH0+Ci1PcGVuPU9wZW4gJyd7MH0nJwotX1VJX0JVVFRPTl9TT1JUPVNvcnQKLVZhbGlkYXRpbmdfZmlsZXM9VmFsaWRhdGluZyBmaWxlcwotSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWQ9SW5kaWNhdGUgd2hlbiBubyAmZ3JhbW1hciBpcyBzcGVjaWZpZWQ6Ci1JbmRpY2F0ZV9ub19ncmFtbWFyX3NwZWNpZmllZF9zZXZlcml0aWVzX2Vycm9yPUVycm9yCi1JbmRpY2F0ZV9ub19ncmFtbWFyX3NwZWNpZmllZF9zZXZlcml0aWVzX3dhcm5pbmc9V2FybmluZwotSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWRfc2V2ZXJpdGllc19pZ25vcmU9SWdub3JlCi1NYXJrdXBWYWxpZGF0aW9uX2ZpbGVzX2xhYmVsPUVycm9ycy9XYXJuaW5ncwotTWFya3VwVmFsaWRhdGlvbl9maWxlcz0mRW5hYmxlIG1hcmt1cCB2YWxpZGF0aW9uCi1TZXZlcml0eV9lcnJvcj1FcnJvcgotU2V2ZXJpdHlfd2FybmluZz1XYXJuaW5nCi1TZXZlcml0eV9pZ25vcmU9SWdub3JlCi1FbXB0eV9lbGVtZW50X3RhZz1JbnZhbGlkIGUmbXB0eSBlbGVtZW50IHRhZzoKLUVuZF90YWdfd2l0aF9hdHRyaWJ1dGVzPUludmFsaWQgZW5kICZ0YWcgd2l0aCBhdHRyaWJ1dGVzOgotSW52YWxpZF93aGl0ZXNwYWNlX2JlZm9yZV90YWduYW1lPUludmFsaWQgJndoaXRlIHNwYWNlIGJlZm9yZSB0YWcgbmFtZToKLU1pc3NpbmdfY2xvc2luZ19icmFja2V0PU1pc3NpbmcgJmNsb3NpbmcgYnJhY2tldDoKLU1pc3NpbmdfY2xvc2luZ19xdW90ZT1NaXNzaW5nIGNsb3NpbmcgJnF1b3RlOgotTWlzc2luZ19lbmRfdGFnPU1pc3NpbmcgZSZuZCB0YWc6Ci1NaXNzaW5nX3N0YXJ0X3RhZz1NaXNzaW5nICZzdGFydCB0YWc6Ci1NaXNzaW5nX3F1b3Rlcz1NaXNzaW5nIHEmdW90ZXM6Ci1OYW1lc3BhY2VfaW5fcGlfdGFyZ2V0PUluJnZhbGlkIG5hbWUgc3BhY2UgaW4gUEk6Ci1UYWdfbmFtZV9taXNzaW5nPU1pc3NpbmcgdGFnIG4mYW1lOgotV2hpdGVzcGFjZV9hdF9zdGFydD1JbnZhJmxpZCB3aGl0ZSBzcGFjZSBhdCBzdGFydDoKLV9FUlJPUl9YTUxfQVRUUklCVVRFX0lTX0lOVkFMSUQ9XCJ7MH1cIiBpcyBub3QgYSB2YWxpZCBhdHRyaWJ1dGUgbmFtZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0Q29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdENvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDBiMjlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0Q29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBBYnN0cmFjdCBjb21tZW50IGFjdGlvbiBkZWxlZ2F0ZSBmb3IgWE1MIGVkaXRvcnMKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0Q29tbWVudEFjdGlvblhNTERlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENMT1NFX0NPTU1FTlQgPSAiLS0+IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9DT01NRU5UID0gIjwhLS0iOyAvLyROT04tTkxTLTEkCi0KLQlJRWRpdG9yUGFydCBmRWRpdG9yOwotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJZkVkaXRvciA9IHRhcmdldEVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBudWxsaW5nIG91dCBqdXN0IGluIGNhc2UKLQkJZkVkaXRvciA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZkVkaXRvcjsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCS8vIGdldCBjdXJyZW50IHRleHQgc2VsZWN0aW9uCi0JCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IGdldEN1cnJlbnRTZWxlY3Rpb24oKTsKLQkJCQlpZiAodGV4dFNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCXByb2Nlc3NBY3Rpb24oZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByaXZhdGUgSVRleHRTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbigpIHsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gKChJVGV4dEVkaXRvcikgZkVkaXRvcikuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBwcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQkJcmV0dXJuIChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gVGV4dFNlbGVjdGlvbi5lbXB0eVNlbGVjdGlvbigpOwotCX0KLQotCWFic3RyYWN0IHZvaWQgcHJvY2Vzc0FjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pOwotCi0Jdm9pZCByZW1vdmVPcGVuQ2xvc2VDb21tZW50cyhJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJdHJ5IHsKLQkJCWludCBhZGp1c3RlZF9sZW5ndGggPSBsZW5ndGg7Ci0KLQkJCS8vIHJlbW92ZSBvcGVuIGNvbW1lbnRzCi0JCQlTdHJpbmcgc3RyaW5nID0gZG9jdW1lbnQuZ2V0KG9mZnNldCwgbGVuZ3RoKTsKLQkJCWludCBpbmRleCA9IHN0cmluZy5sYXN0SW5kZXhPZihPUEVOX0NPTU1FTlQpOwotCQkJd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0JCQkJZG9jdW1lbnQucmVwbGFjZShvZmZzZXQgKyBpbmRleCwgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmRleCA9IHN0cmluZy5sYXN0SW5kZXhPZihPUEVOX0NPTU1FTlQsIGluZGV4IC0gMSk7Ci0JCQkJYWRqdXN0ZWRfbGVuZ3RoIC09IE9QRU5fQ09NTUVOVC5sZW5ndGgoKTsKLQkJCX0KLQotCQkJLy8gcmVtb3ZlIGNsb3NlIGNvbW1lbnRzCi0JCQlzdHJpbmcgPSBkb2N1bWVudC5nZXQob2Zmc2V0LCBhZGp1c3RlZF9sZW5ndGgpOwotCQkJaW5kZXggPSBzdHJpbmcubGFzdEluZGV4T2YoQ0xPU0VfQ09NTUVOVCk7Ci0JCQl3aGlsZSAoaW5kZXggIT0gLTEpIHsKLQkJCQlkb2N1bWVudC5yZXBsYWNlKG9mZnNldCArIGluZGV4LCBDTE9TRV9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmRleCA9IHN0cmluZy5sYXN0SW5kZXhPZihDTE9TRV9DT01NRU5ULCBpbmRleCAtIDEpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlN2UyMDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURlc2NyaXB0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NQ29udGVudEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTUNvbnRlbnRCdWlsZGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLkNNSW1hZ2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBleHRlbmRzIEJhc2VOb2RlQWN0aW9uTWFuYWdlciB7Ci0KLQotCS8qKgotCSAqIEFkZE5vZGVBY3Rpb24KLQkgKi8KLQlwdWJsaWMgY2xhc3MgQWRkTm9kZUFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCQlwcm90ZWN0ZWQgQ01Ob2RlIGNtbm9kZTsKLQkJcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbjsKLQkJcHJvdGVjdGVkIGludCBpbmRleDsKLQkJcHJvdGVjdGVkIGludCBub2RlVHlwZTsKLQkJcHJvdGVjdGVkIE5vZGUgcGFyZW50OwotCQlwcm90ZWN0ZWQgU3RyaW5nIHVuZG9EZXNjcmlwdGlvbjsKLQotCi0JCXB1YmxpYyBBZGROb2RlQWN0aW9uKENNTm9kZSBjbW5vZGUsIE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpIHsKLQkJCXRoaXMuY21ub2RlID0gY21ub2RlOwotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0KLQkJCVN0cmluZyB0ZXh0ID0gZ2V0TGFiZWwocGFyZW50LCBjbW5vZGUpOwotCQkJc2V0VGV4dCh0ZXh0KTsKLQkJCWRlc2NyaXB0aW9uID0gdGV4dDsKLQkJCXVuZG9EZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREICsgIiAiICsgdGV4dDsgLy8kTk9OLU5MUy0xJCAKLQkJCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2VEZXNjcmlwdG9yKGNtbm9kZSk7Ci0JCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkJZGVzY3JpcHRvciA9IGltYWdlRGVzY3JpcHRvckNhY2hlLmdldEltYWdlRGVzY3JpcHRvcihjbW5vZGUpOwotCQkJfQotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCQl9Ci0KLQotCQlwdWJsaWMgQWRkTm9kZUFjdGlvbihpbnQgbm9kZVR5cGUsIE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpIHsKLQkJCXRoaXMubm9kZVR5cGUgPSBub2RlVHlwZTsKLQkJCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCi0JCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQkJZGVzY3JpcHRpb24gPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0NPTU1FTlQ7Ci0JCQkJCXVuZG9EZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX0NPTU1FTlQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogewotCQkJCQlkZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfUFJPQ0VTU0lOR19JTlNUUlVDVElPTjsKLQkJCQkJdW5kb0Rlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BRERfUFJPQ0VTU0lOR19JTlNUUlVDVElPTjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOiB7Ci0JCQkJCWRlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9DREFUQV9TRUNUSU9OOwotCQkJCQl1bmRvRGVzY3JpcHRpb24gPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9DREFUQV9TRUNUSU9OOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQkJZGVzY3JpcHRpb24gPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX1BDREFUQTsKLQkJCQkJdW5kb0Rlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BRERfUENEQVRBOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlzZXRUZXh0KGRlc2NyaXB0aW9uKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3JDYWNoZS5nZXRJbWFnZURlc2NyaXB0b3IobmV3IEludGVnZXIobm9kZVR5cGUpKSk7Ci0JCX0KLQotCi0JCXByb3RlY3RlZCB2b2lkIGFkZE5vZGVGb3JDTU5vZGUoKSB7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlpbnNlcnQocGFyZW50LCBjbW5vZGUsIGluZGV4KTsKLQkJCX0KLQkJfQotCi0KLQkJcHJvdGVjdGVkIHZvaWQgYWRkTm9kZUZvck5vZGVUeXBlKCkgewotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUgPyAoRG9jdW1lbnQpIHBhcmVudCA6IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlOb2RlIG5ld0NoaWxkTm9kZSA9IG51bGw7Ci0JCQlib29sZWFuIGZvcm1hdCA9IHRydWU7Ci0JCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQkJbmV3Q2hpbGROb2RlID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChYTUxVSU1lc3NhZ2VzLl9VSV9DT01NRU5UX1ZBTFVFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJCW5ld0NoaWxkTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihYTUxVSU1lc3NhZ2VzLl9VSV9QSV9UQVJHRVRfVkFMVUUsIFhNTFVJTWVzc2FnZXMuX1VJX1BJX0RBVEFfVkFMVUUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6IHsKLQkJCQkJbmV3Q2hpbGROb2RlID0gZG9jdW1lbnQuY3JlYXRlQ0RBVEFTZWN0aW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQkJZm9ybWF0ID0gZmFsc2U7Ci0JCQkJCW5ld0NoaWxkTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBhcmVudC5nZXROb2RlTmFtZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobmV3Q2hpbGROb2RlICE9IG51bGwpIHsKLQkJCQlMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKDEpOwotCQkJCWxpc3QuYWRkKG5ld0NoaWxkTm9kZSk7Ci0JCQkJaW5zZXJ0Tm9kZXNBdEluZGV4KHBhcmVudCwgbGlzdCwgaW5kZXgsIGZvcm1hdCk7Ci0JCQl9Ci0JCX0KLQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIHVuZG9EZXNjcmlwdGlvbjsKLQkJfQotCi0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKHZhbGlkYXRlRWRpdChnZXRNb2RlbCgpLCBnZXRXb3JrYmVuY2hXaW5kb3dTaGVsbCgpKSkgewotCQkJCWJlZ2luTm9kZUFjdGlvbih0aGlzKTsKLQkJCQlpZiAoY21ub2RlICE9IG51bGwpIHsKLQkJCQkJYWRkTm9kZUZvckNNTm9kZSgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYWRkTm9kZUZvck5vZGVUeXBlKCk7Ci0JCQkJfQotCQkJCWVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIERlbGV0ZUFjdGlvbgotCSAqLwotCXB1YmxpYyBjbGFzcyBEZWxldGVBY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uIHsKLQkJcHJvdGVjdGVkIExpc3QgbGlzdDsKLQotCQlwdWJsaWMgRGVsZXRlQWN0aW9uKExpc3QgbGlzdCkgewotCQkJc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX1JFTU9WRSk7Ci0JCQl0aGlzLmxpc3QgPSBsaXN0OwotCQl9Ci0KLQkJcHVibGljIERlbGV0ZUFjdGlvbihOb2RlIG5vZGUpIHsKLQkJCXNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9SRU1PVkUpOwotCQkJbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJCWxpc3QuYWRkKG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5ERUxFVEU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAodmFsaWRhdGVFZGl0KGdldE1vZGVsKCksIGdldFdvcmtiZW5jaFdpbmRvd1NoZWxsKCkpKSB7Ci0JCQkJYmVnaW5Ob2RlQWN0aW9uKHRoaXMpOwotCQotCQkJCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpLm5leHQoKTsKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgbm9kZTsKLQkJCQkJCWF0dHIuZ2V0T3duZXJFbGVtZW50KCkucmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJCQlOb2RlIHByZXZpb3VzU2libGluZyA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJCQkJaWYgKChwcmV2aW91c1NpYmxpbmcgIT0gbnVsbCkgJiYgaXNXaGl0ZXNwYWNlVGV4dE5vZGUocHJldmlvdXNTaWJsaW5nKSkgewotCQkJCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQocHJldmlvdXNTaWJsaW5nKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJZW5kTm9kZUFjdGlvbih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JY2xhc3MgSW1hZ2VEZXNjcmlwdG9yQ2FjaGUgewotCQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGF0dHJpYnV0ZUltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQVRUUklCVVRFKTsKLQkJcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBhdHRyaWJ1dGVSZXFJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVF9SRVFfT0JKKTsKLQkJcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBjZGF0YVNlY3Rpb25JbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NEQVRBU0VDVElPTik7Ci0JCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgY29tbWVudEltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ09NTUVOVCk7Ci0JCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZWxlbWVudEltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRUxFTUVOVCk7Ci0JCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgcGlJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1BST0NFU1NJTkdJTlNUUlVDVElPTik7Ci0JCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgdGV4dEltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVFhURVhUKTsKLQotCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDTU5vZGUpIHsKLQkJCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgb2JqZWN0OwotCQkJCXN3aXRjaCAoY21ub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCQkJY2FzZSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OIDogewotCQkJCQkJcmVzdWx0ID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2VEZXNjcmlwdG9yKGNtbm9kZSk7Ci0JCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJCQlpZiAoKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGUpLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCQkJCQlyZXN1bHQgPSBhdHRyaWJ1dGVSZXFJbWFnZTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXJlc3VsdCA9IGF0dHJpYnV0ZUltYWdlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgQ01Ob2RlLkRBVEFfVFlQRSA6IHsKLQkJCQkJCXJlc3VsdCA9IHRleHRJbWFnZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04gOiB7Ci0JCQkJCQlyZXN1bHQgPSBDTUltYWdlVXRpbC5nZXRJbWFnZURlc2NyaXB0b3IoY21ub2RlKTsKLQkJCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQkJCXJlc3VsdCA9IGVsZW1lbnRJbWFnZTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgQ01Ob2RlLkdST1VQIDogewotCQkJCQkJcmVzdWx0ID0gZWxlbWVudEltYWdlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQkJSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpIG9iamVjdDsKLQkJCQlzd2l0Y2ggKGludGVnZXIuaW50VmFsdWUoKSkgewotCQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQkJcmVzdWx0ID0gY29tbWVudEltYWdlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQkJCXJlc3VsdCA9IHBpSW1hZ2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCQkJcmVzdWx0ID0gY2RhdGFTZWN0aW9uSW1hZ2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQkJcmVzdWx0ID0gdGV4dEltYWdlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JLy8gVE9ETy4uLiByZW1vdmUgdGhpcyBjbGFzcy4gSSdtIHByZXR0eSBzdXJlIGl0IGlzIG5vIGxvbmdlciB1c2VkIGJ5Ci0JLy8gYW55b25lLgotCS8qKgotCSAqIEBkZXByYWNhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEluc2VydEFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOwotCQlwcm90ZWN0ZWQgaW50IGluZGV4OwotCQlwcm90ZWN0ZWQgaW50IG5vZGVUeXBlOwotCQlwcm90ZWN0ZWQgTm9kZSBwYXJlbnQ7Ci0KLQkJcHVibGljIEluc2VydEFjdGlvbihpbnQgbm9kZVR5cGUsIE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpIHsKLQkJCXRoaXMubm9kZVR5cGUgPSBub2RlVHlwZTsKLQkJCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOiB7Ci0JCQkJCWRlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9DT01NRU5UOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQkJZGVzY3JpcHRpb24gPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX1BST0NFU1NJTkdfSU5TVFJVQ1RJT047Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCQlkZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQ0RBVEFfU0VDVElPTjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJCWRlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9QQ0RBVEE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXNldFRleHQoZGVzY3JpcHRpb24pOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvckNhY2hlLmdldEltYWdlRGVzY3JpcHRvcihuZXcgSW50ZWdlcihub2RlVHlwZSkpKTsKLQkJfQotCi0JCXB1YmxpYyBJbnNlcnRBY3Rpb24oaW50IG5vZGVUeXBlLCBOb2RlIHBhcmVudCwgaW50IGluZGV4LCBTdHJpbmcgdGl0bGUpIHsKLQkJCXRoaXMubm9kZVR5cGUgPSBub2RlVHlwZTsKLQkJCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJZGVzY3JpcHRpb24gPSB0aXRsZTsKLQkJCXNldFRleHQoZGVzY3JpcHRpb24pOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvckNhY2hlLmdldEltYWdlRGVzY3JpcHRvcihuZXcgSW50ZWdlcihub2RlVHlwZSkpKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREICsgIiAiICsgZGVzY3JpcHRpb247IC8vJE5PTi1OTFMtMSQgCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAodmFsaWRhdGVFZGl0KGdldE1vZGVsKCksIGdldFdvcmtiZW5jaFdpbmRvd1NoZWxsKCkpKSB7Ci0JCQkJYmVnaW5Ob2RlQWN0aW9uKHRoaXMpOwotCQotCQkJCURvY3VtZW50IGRvY3VtZW50ID0gcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFID8gKERvY3VtZW50KSBwYXJlbnQgOiBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJCU5vZGUgbmV3Q2hpbGROb2RlID0gbnVsbDsKLQkJCQlib29sZWFuIGZvcm1hdCA9IHRydWU7Ci0JCQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQkJbmV3Q2hpbGROb2RlID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChYTUxVSU1lc3NhZ2VzLl9VSV9DT01NRU5UX1ZBTFVFKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJCQluZXdDaGlsZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oWE1MVUlNZXNzYWdlcy5fVUlfUElfVEFSR0VUX1ZBTFVFLCBYTUxVSU1lc3NhZ2VzLl9VSV9QSV9EQVRBX1ZBTFVFKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOiB7Ci0JCQkJCQluZXdDaGlsZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVDREFUQVNlY3Rpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQkJZm9ybWF0ID0gZmFsc2U7Ci0JCQkJCQluZXdDaGlsZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwYXJlbnQuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkKLQkJCQlpZiAobmV3Q2hpbGROb2RlICE9IG51bGwpIHsKLQkJCQkJTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigxKTsKLQkJCQkJbGlzdC5hZGQobmV3Q2hpbGROb2RlKTsKLQkJCQkJaW5zZXJ0Tm9kZXNBdEluZGV4KHBhcmVudCwgbGlzdCwgaW5kZXgsIGZvcm1hdCk7Ci0JCQkJfQotCQotCQkJCWVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFJlcGxhY2VOb2RlQWN0aW9uCi0JICovCi0JcHVibGljIGNsYXNzIFJlcGxhY2VOb2RlQWN0aW9uIGV4dGVuZHMgTm9kZUFjdGlvbiB7Ci0JCXByb3RlY3RlZCBDTU5vZGUgY21ub2RlOwotCQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOwotCQlwcm90ZWN0ZWQgaW50IGVuZEluZGV4OwotCQlwcm90ZWN0ZWQgTm9kZSBwYXJlbnQ7Ci0JCXByb3RlY3RlZCBpbnQgc3RhcnRJbmRleDsKLQotCi0JCXB1YmxpYyBSZXBsYWNlTm9kZUFjdGlvbihOb2RlIHBhcmVudCwgQ01Ob2RlIGNtbm9kZSwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLmNtbm9kZSA9IGNtbm9kZTsKLQkJCXRoaXMuc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXg7Ci0JCQl0aGlzLmVuZEluZGV4ID0gZW5kSW5kZXg7Ci0KLQkJCXNldFRleHQoZ2V0TGFiZWwocGFyZW50LCBjbW5vZGUpKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3JDYWNoZS5nZXRJbWFnZURlc2NyaXB0b3IoY21ub2RlKSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkJCVN0cmluZyByZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9VTkRPX1JFUExBQ0VfREVTQ1JJUFRJT047Ci0JCQlyZXN1bHQgKz0gIiAiICsgZ2V0TGFiZWwocGFyZW50LCBjbW5vZGUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKHZhbGlkYXRlRWRpdChnZXRNb2RlbCgpLCBnZXRXb3JrYmVuY2hXaW5kb3dTaGVsbCgpKSkgewotCQkJCWJlZ2luTm9kZUFjdGlvbih0aGlzKTsKLQkKLQkJCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAoY21ub2RlICE9IG51bGwpKSB7Ci0JCQkJCXJlbW92ZShwYXJlbnQsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKLQkJCQkJaW5zZXJ0KHBhcmVudCwgY21ub2RlLCBzdGFydEluZGV4KTsKLQkJCQl9Ci0JCQkJZW5kTm9kZUFjdGlvbih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3JDYWNoZSBpbWFnZURlc2NyaXB0b3JDYWNoZSA9IG5ldyBJbWFnZURlc2NyaXB0b3JDYWNoZSgpOwotCXByb3RlY3RlZCBWaWV3ZXIgZlZpZXdlcjsKLQotCXB1YmxpYyBBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIE1vZGVsUXVlcnkgbW9kZWxRdWVyeSwgVmlld2VyIHZpZXdlcikgewotCQlzdXBlcihtb2RlbCwgbW9kZWxRdWVyeSk7Ci0JCXRoaXMuZlZpZXdlciA9IHZpZXdlcjsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGJlZ2luTm9kZUFjdGlvbihOb2RlQWN0aW9uIGFjdGlvbikgewotCQlmTW9kZWwuYmVnaW5SZWNvcmRpbmcoYWN0aW9uLCBhY3Rpb24uZ2V0VW5kb0Rlc2NyaXB0aW9uKCkpOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRBdHRyaWJ1dGVBY3Rpb24oRWxlbWVudCBwYXJlbnQsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG51bGw7Ci0JCWlmIChhZCA9PSBudWxsKSB7Ci0JCQlhY3Rpb24gPSBuZXcgRWRpdEF0dHJpYnV0ZUFjdGlvbih0aGlzLCBwYXJlbnQsIG51bGwsIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfTkVXX0FUVFJJQlVURSwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9ORVdfQVRUUklCVVRFX1RJVExFKTsKLQkJfQotCQllbHNlIHsKLQkJCWFjdGlvbiA9IG5ldyBBZGROb2RlQWN0aW9uKGFkLCBwYXJlbnQsIC0xKTsKLQkJfQotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRDRGF0YVNlY3Rpb25BY3Rpb24oTm9kZSBwYXJlbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IEFkZE5vZGVBY3Rpb24oTm9kZS5DREFUQV9TRUNUSU9OX05PREUsIHBhcmVudCwgaW5kZXgpOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRDb21tZW50QWN0aW9uKE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBBZGROb2RlQWN0aW9uKE5vZGUuQ09NTUVOVF9OT0RFLCBwYXJlbnQsIGluZGV4KTsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkRG9jdHlwZUFjdGlvbihEb2N1bWVudCBkb2N1bWVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgRWRpdERvY3R5cGVBY3Rpb24oZk1vZGVsLCBkb2N1bWVudCwgZk1vZGVsLmdldEJhc2VMb2NhdGlvbigpLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9EVERfSU5GT1JNQVRJT04pOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRFbGVtZW50QWN0aW9uKE5vZGUgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluZGV4KSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBudWxsOwotCQlpZiAoZWQgPT0gbnVsbCkgewotCQkJYWN0aW9uID0gbmV3IEVkaXRFbGVtZW50QWN0aW9uKHRoaXMsIHBhcmVudCwgaW5kZXgsIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfTkVXX0VMRU1FTlQsIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfTkVXX0VMRU1FTlRfVElUTEUpOwotCQl9Ci0JCWVsc2UgewotCQkJYWN0aW9uID0gbmV3IEFkZE5vZGVBY3Rpb24oZWQsIHBhcmVudCwgaW5kZXgpOwotCQl9Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZFBDRGF0YUFjdGlvbihOb2RlIHBhcmVudCwgQ01EYXRhVHlwZSBkYXRhVHlwZSwgaW50IGluZGV4KSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBudWxsOwotCQlpZiAoZGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYWN0aW9uID0gbmV3IEFkZE5vZGVBY3Rpb24oTm9kZS5URVhUX05PREUsIHBhcmVudCwgaW5kZXgpOwotCQl9Ci0JCWVsc2UgewotCQkJYWN0aW9uID0gbmV3IEFkZE5vZGVBY3Rpb24oZGF0YVR5cGUsIHBhcmVudCwgaW5kZXgpOwotCQl9Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbihOb2RlIHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCU5vZGUgcmVmQ2hpbGQgPSBnZXRSZWZDaGlsZE5vZGVBdEluZGV4KHBhcmVudCwgaW5kZXgpOwotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24odGhpcywgcGFyZW50LCByZWZDaGlsZCwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BRERfUFJPQ0VTU0lOR19JTlNUUlVDVElPTiwgWE1MVUlNZXNzYWdlcy5BRERfUFJPQ0VTU0lOR19JTlNUUlVDVElPTik7Ci0JCWFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yQ2FjaGUuZ2V0SW1hZ2VEZXNjcmlwdG9yKG5ldyBJbnRlZ2VyKE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSkpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRTY2hlbWFJbmZvQWN0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gbmV3IEVkaXRTY2hlbWFJbmZvQWN0aW9uKHRoaXMsIGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLCBmTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCksIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX1NDSEVNQV9JTkZPUk1BVElPTik7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZURlbGV0ZUFjdGlvbihMaXN0IHNlbGVjdGlvbikgewotCQlEZWxldGVBY3Rpb24gZGVsZXRlQWN0aW9uID0gbmV3IERlbGV0ZUFjdGlvbihzZWxlY3Rpb24pOwotCQlkZWxldGVBY3Rpb24uc2V0RW5hYmxlZChzZWxlY3Rpb24uc2l6ZSgpID4gMCk7Ci0JCXJldHVybiBkZWxldGVBY3Rpb247Ci0JfQotCi0KLQlwdWJsaWMgRE9NQ29udGVudEJ1aWxkZXIgY3JlYXRlRE9NQ29udGVudEJ1aWxkZXIoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRE9NQ29udGVudEJ1aWxkZXJJbXBsIGJ1aWxkZXIgPSBuZXcgRE9NQ29udGVudEJ1aWxkZXJJbXBsKGRvY3VtZW50KTsKLQkJcmV0dXJuIGJ1aWxkZXI7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUVkaXRBdHRyaWJ1dGVBY3Rpb24oQXR0ciBhdHRyLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKSB7Ci0JCXJldHVybiBuZXcgRWRpdEF0dHJpYnV0ZUFjdGlvbih0aGlzLCBhdHRyLmdldE93bmVyRWxlbWVudCgpLCBhdHRyLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0VESVRfQVRUUklCVVRFLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0VESVRfQVRUUklCVVRFX1RJVExFKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlRWRpdERvY3R5cGVBY3Rpb24oRG9jdW1lbnRUeXBlIGRvY3R5cGUpIHsKLQkJcmV0dXJuIG5ldyBFZGl0RG9jdHlwZUFjdGlvbihmTW9kZWwsIGRvY3R5cGUsIGZNb2RlbC5nZXRCYXNlTG9jYXRpb24oKSwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9FRElUX0RPQ1RZUEUpOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSkgewotCQlyZXR1cm4gbmV3IEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24odGhpcywgcGksIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfRURJVF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0VESVRfUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9USVRMRSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUVkaXRTY2hlbWFJbmZvQWN0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gbmV3IEVkaXRTY2hlbWFJbmZvQWN0aW9uKHRoaXMsIGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLCBmTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCksIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfRURJVF9OQU1FU1BBQ0VTKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlUmVuYW1lQWN0aW9uKE5vZGUgbm9kZSkgewotCQlBY3Rpb24gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlyZXN1bHQgPSBuZXcgRWRpdEVsZW1lbnRBY3Rpb24odGhpcywgKEVsZW1lbnQpIG5vZGUsIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfUkVOQU1FLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX1JFTkFNRV9USVRMRSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlUmVwbGFjZUFjdGlvbihOb2RlIHBhcmVudCwgQ01Ob2RlIGNtbm9kZSwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgewotCQlyZXR1cm4gbmV3IFJlcGxhY2VOb2RlQWN0aW9uKHBhcmVudCwgY21ub2RlLCBzdGFydEluZGV4LCBlbmRJbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kTm9kZUFjdGlvbihOb2RlQWN0aW9uIGFjdGlvbikgewotCQlmTW9kZWwuZW5kUmVjb3JkaW5nKGFjdGlvbik7Ci0JfQotCi0KLQotCXB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlMaXN0IHNlbGVjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBlcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCXNlbGVjdGlvbkxpc3QuYWRkQWxsKGVzLnRvTGlzdCgpKTsKLQkJCX0KLQotCQkJY29udHJpYnV0ZUFjdGlvbnMobWVudU1hbmFnZXIsIHNlbGVjdGlvbkxpc3QpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoTm9kZSBwYXJlbnQsIENNTm9kZSBjbW5vZGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICI/IiArIGNtbm9kZSArICI/IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChjbW5vZGUgIT0gbnVsbCkgewotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTgwMAotCQkJcmVzdWx0ID0gY21ub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQlpZihyZXN1bHQgPT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IChTdHJpbmcpIGNtbm9kZS5nZXRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5HUk9VUCkgewotCQkJCQlDTURlc2NyaXB0aW9uQnVpbGRlciBkZXNjcmlwdGlvbkJ1aWxkZXIgPSBuZXcgQ01EZXNjcmlwdGlvbkJ1aWxkZXIoKTsKLQkJCQkJcmVzdWx0ID0gZGVzY3JpcHRpb25CdWlsZGVyLmJ1aWxkRGVzY3JpcHRpb24oY21ub2RlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShjbW5vZGUsIHBhcmVudCwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIGZNb2RlbDsKLQl9Ci0KLQotCXB1YmxpYyBTaGVsbCBnZXRXb3JrYmVuY2hXaW5kb3dTaGVsbCgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGluc2VydChOb2RlIHBhcmVudCwgQ01Ob2RlIGNtbm9kZSwgaW50IGluZGV4KSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFID8gKERvY3VtZW50KSBwYXJlbnQgOiBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlET01Db250ZW50QnVpbGRlciBidWlsZGVyID0gY3JlYXRlRE9NQ29udGVudEJ1aWxkZXIoZG9jdW1lbnQpOwotCQlidWlsZGVyLnNldEJ1aWxkUG9saWN5KERPTUNvbnRlbnRCdWlsZGVyLkJVSUxEX09OTFlfUkVRVUlSRURfQ09OVEVOVCk7Ci0JCWJ1aWxkZXIuYnVpbGQocGFyZW50LCBjbW5vZGUpOwotCQlpbnNlcnROb2Rlc0F0SW5kZXgocGFyZW50LCBidWlsZGVyLmdldFJlc3VsdCgpLCBpbmRleCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBpbnNlcnROb2Rlc0F0SW5kZXgoTm9kZSBwYXJlbnQsIExpc3QgbGlzdCwgaW50IGluZGV4KSB7Ci0JCWluc2VydE5vZGVzQXRJbmRleChwYXJlbnQsIGxpc3QsIGluZGV4LCB0cnVlKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGluc2VydE5vZGVzQXRJbmRleChOb2RlIHBhcmVudCwgTGlzdCBsaXN0LCBpbnQgaW5kZXgsIGJvb2xlYW4gZm9ybWF0KSB7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlpbmRleCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQl9Ci0JCU5vZGUgcmVmQ2hpbGQgPSAoaW5kZXggPCBub2RlTGlzdC5nZXRMZW5ndGgoKSkgPyBub2RlTGlzdC5pdGVtKGluZGV4KSA6IG51bGw7Ci0KLQkJLy8gaGVyZSB3ZSBjb25zaWRlciB0aGUgY2FzZSB3aGVyZSB0aGUgcHJldmlvdXMgbm9kZSBpcyBhICd3aGl0ZQotCQkvLyBzcGFjZScgVGV4dCBub2RlCi0JCS8vIHdlIHNob3VsZCByZWFsbHkgZG8gdGhlIGluc2VydCBiZWZvcmUgdGhpcyBub2RlCi0JCS8vCi0JCWludCBwcmV2SW5kZXggPSBpbmRleCAtIDE7Ci0JCU5vZGUgcHJldkNoaWxkID0gKHByZXZJbmRleCA8IG5vZGVMaXN0LmdldExlbmd0aCgpKSA/IG5vZGVMaXN0Lml0ZW0ocHJldkluZGV4KSA6IG51bGw7Ci0JCWlmIChpc1doaXRlc3BhY2VUZXh0Tm9kZShwcmV2Q2hpbGQpKSB7Ci0JCQlyZWZDaGlsZCA9IHByZXZDaGlsZDsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5ld05vZGUgPSAoTm9kZSkgaS5uZXh0KCk7Ci0KLQkJCWlmIChuZXdOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnQ7Ci0JCQkJcGFyZW50RWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKChBdHRyKSBuZXdOb2RlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmQ2hpbGQpOwotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiBmb3JtYXREZWVwID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5ld05vZGUgPSAoTm9kZSkgaS5uZXh0KCk7Ci0JCQlpZiAobmV3Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJZm9ybWF0RGVlcCA9IHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChmb3JtYXQpIHsKLQkJCQlyZWZvcm1hdChuZXdOb2RlLCBmb3JtYXREZWVwKTsKLQkJCX0KLQkJfQotCi0JCXNldFZpZXdlclNlbGVjdGlvbihsaXN0KTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGFic3RyYWN0IHNpbmNlIGN1cnJlbnRseSwgdGhlIHNlZCBlZGl0b3IgaXMgcmVxdWlyZWQgdG8KLQkgKiBwZXJmb3JtIGZvcm1hdGluZyBhbmQgd2UgZG9uJ3Qgd2FudCB0byBjcmVhdGUgYSBkZXBlbmRlbmN5IG9uIHRoZSBzZWQKLQkgKiBlZGl0b3IuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVmb3JtYXQoTm9kZSBwYXJlbnQsIGJvb2xlYW4gZGVlcCk7Ci0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZShOb2RlIHBhcmVudCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgewotCQlOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSBlbmRJbmRleDsgaSA+PSBzdGFydEluZGV4OyBpLS0pIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJTZWxlY3Rpb24oTGlzdCBsaXN0KSB7Ci0JCWlmIChmVmlld2VyICE9IG51bGwpIHsKLQkJCWZWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGxpc3QpLCB0cnVlKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU2VsZWN0aW9uKE5vZGUgbm9kZSkgewotCQlpZiAoZlZpZXdlciAhPSBudWxsKSB7Ci0JCQlmVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihub2RlKSwgdHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3Rpb25Db250cmlidXRvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQWN0aW9uQ29udHJpYnV0b3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmODI4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3Rpb25Db250cmlidXRvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLlN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBYTUxFZGl0b3JBY3Rpb25Db250cmlidXRvcgotICogCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgdXNlZCBpbnNpZGUgbXVsdGkgcGFnZSBlZGl0b3IncwotICogQWN0aW9uQmFyQ29udHJpYnV0b3IsIHNpbmNlIGNhc2NhZGVkIGluaXQoKSBjYWxsIGZyb20gdGhlCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciB3aWxsIGNhdXNlcyBleGNlcHRpb24gYW5kIGl0IGxlYWRzIHRvIGxvc2Ugd2hvbGUKLSAqIHRvb2xiYXJzLgotICogCi0gKiBJbnN0ZWFkLCB1c2UgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yIGZvciBzb3VyY2UgcGFnZSBjb250cmlidXRvciBvZgotICogbXVsdGkgcGFnZSBlZGl0b3IuCi0gKiAKLSAqIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIHN0aWxsIHZhbGlkIGZvciBzaW5nbGUgcGFnZSBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Db250cmlidXRvclhNTCBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFRElUT1JfSURTID0geyJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZSIsICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZTIiLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHT19UT19NQVRDSElOR19UQUdfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5nb3RvTWF0Y2hpbmdUYWciOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmQ2xlYW51cERvY3VtZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZDb21tZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZDb250ZW50QXNzaXN0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZGaW5kT2NjdXJyZW5jZXMgPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkZvcm1hdEFjdGl2ZUVsZW1lbnRzID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZGb3JtYXREb2N1bWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmT3BlbkZpbGVBY3Rpb24gPSBudWxsOyAvLyBvcGVuIGZpbGUKLQotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlVuY29tbWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBHb1RvTWF0Y2hpbmdUYWdBY3Rpb24gZkdvVG9NYXRjaGluZ1RhZ0FjdGlvbjsKLQotCXB1YmxpYyBBY3Rpb25Db250cmlidXRvclhNTCgpIHsKLQkJc3VwZXIoKTsKLQotCQlSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IFhNTFVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQotCQlmQ29udGVudEFzc2lzdCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlmQ29udGVudEFzc2lzdC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLkNPTlRFTlRfQVNTSVNUX1BST1BPU0FMUyk7Ci0KLQkJLy8gc291cmNlIGNvbW1hbmRzCi0JCWZDbGVhbnVwRG9jdW1lbnQgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZkNsZWFudXBEb2N1bWVudC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5DTEVBTlVQX0RPQ1VNRU5UKTsKLQotCQlmRm9ybWF0RG9jdW1lbnQgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZkZvcm1hdERvY3VtZW50LnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLkZPUk1BVF9ET0NVTUVOVCk7Ci0KLQkJZkZvcm1hdEFjdGl2ZUVsZW1lbnRzID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWZGb3JtYXRBY3RpdmVFbGVtZW50cy5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5GT1JNQVRfQUNUSVZFX0VMRU1FTlRTKTsKLQotCQkvLyBuYXZpZ2F0ZSBjb21tYW5kcwotCQlmT3BlbkZpbGVBY3Rpb24gPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZk9wZW5GaWxlQWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLk9QRU5fRklMRSk7Ci0KLQkJZkZpbmRPY2N1cnJlbmNlcyA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlmRmluZE9jY3VycmVuY2VzLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLkZJTkRfT0NDVVJSRU5DRVMpOwotCi0JCWZHb1RvTWF0Y2hpbmdUYWdBY3Rpb24gPSBuZXcgR29Ub01hdGNoaW5nVGFnQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiZ290b01hdGNoaW5nVGFnXyIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWZHb1RvTWF0Y2hpbmdUYWdBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKEdPX1RPX01BVENISU5HX1RBR19JRCk7Ci0JCWZHb1RvTWF0Y2hpbmdUYWdBY3Rpb24uc2V0SWQoR09fVE9fTUFUQ0hJTkdfVEFHX0lEKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJLy8gbmF2aWdhdGUgY29tbWFuZHMKLQkJSU1lbnVNYW5hZ2VyIG5hdmlnYXRlTWVudSA9IG1lbnUuZmluZE1lbnVVc2luZ1BhdGgoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX05BVklHQVRFKTsKLQkJaWYgKG5hdmlnYXRlTWVudSAhPSBudWxsKSB7Ci0JCQluYXZpZ2F0ZU1lbnUuYXBwZW5kVG9Hcm91cChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk9QRU5fRVhULCBmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJbmF2aWdhdGVNZW51LmFwcGVuZFRvR3JvdXAoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5PUEVOX0VYVCwgZk9wZW5GaWxlQWN0aW9uKTsKLQotCQkJSU1lbnVNYW5hZ2VyIGdvdG9Hcm91cCA9IG5hdmlnYXRlTWVudS5maW5kTWVudVVzaW5nUGF0aChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkdPX1RPKTsKLQkJCWlmIChnb3RvR3JvdXAgIT0gbnVsbCkgewotCQkJCWdvdG9Hcm91cC5hcHBlbmRUb0dyb3VwKCJtYXRjaGluZ0JlZ2luIiwgZkdvVG9NYXRjaGluZ1RhZ0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlzdXBlci5jb250cmlidXRlVG9NZW51KG1lbnUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotLyoKLQkJLy8gZWRpdCBjb21tYW5kcwotCQlJTWVudU1hbmFnZXIgZWRpdE1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElUKTsKLQkJaWYgKGVkaXRNZW51ICE9IG51bGwpIHsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZUb2dnbGVJbnNlcnRNb2RlQWN0aW9uKTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZFeHBhbmRTZWxlY3Rpb25Ub01lbnUpOwotCQkJZWRpdE1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQllZGl0TWVudS5hZGQoZkNvbnRlbnRBc3Npc3QpOwotCQkJZWRpdE1lbnUuYWRkKGZNZW51QWRkaXRpb25zR3JvdXBNYXJrZXIpOwotCQl9Ci0KLQkJLy8gc291cmNlIGNvbW1hbmRzCi0JCVN0cmluZyBzb3VyY2VNZW51TGFiZWwgPSBYTUxVSU1lc3NhZ2VzLlNvdXJjZU1lbnVfbGFiZWw7Ci0JCVN0cmluZyBzb3VyY2VNZW51SWQgPSAic291cmNlTWVudUlkIjsgLy8kTk9OLU5MUy0xJAotCQlJTWVudU1hbmFnZXIgc291cmNlTWVudSA9IG5ldyBNZW51TWFuYWdlcihzb3VyY2VNZW51TGFiZWwsIHNvdXJjZU1lbnVJZCk7Ci0JCW1lbnUuaW5zZXJ0QWZ0ZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0VESVQsIHNvdXJjZU1lbnUpOwotCQlpZiAoc291cmNlTWVudSAhPSBudWxsKSB7Ci0JCQlzb3VyY2VNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJc291cmNlTWVudS5hZGQoZlRvZ2dsZUNvbW1lbnQpOwotCQkJc291cmNlTWVudS5hZGQoZkFkZEJsb2NrQ29tbWVudCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmUmVtb3ZlQmxvY2tDb21tZW50KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZTaGlmdFJpZ2h0KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZTaGlmdExlZnQpOwotCQkJc291cmNlTWVudS5hZGQoZkNsZWFudXBEb2N1bWVudCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmRm9ybWF0RG9jdW1lbnQpOwotCQkJc291cmNlTWVudS5hZGQoZkZvcm1hdEFjdGl2ZUVsZW1lbnRzKTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQlzb3VyY2VNZW51LmFkZChmRmluZE9jY3VycmVuY2VzKTsKLQkJfQotCi0JCS8vIG5hdmlnYXRlIGNvbW1hbmRzCi0JCUlNZW51TWFuYWdlciBuYXZpZ2F0ZU1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9OQVZJR0FURSk7Ci0JCWlmIChuYXZpZ2F0ZU1lbnUgIT0gbnVsbCkgewotCQkJbmF2aWdhdGVNZW51LmFwcGVuZFRvR3JvdXAoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5PUEVOX0VYVCwgZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCW5hdmlnYXRlTWVudS5hcHBlbmRUb0dyb3VwKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuT1BFTl9FWFQsIGZPcGVuRmlsZUFjdGlvbik7Ci0KLQkJCUlNZW51TWFuYWdlciBnb3RvR3JvdXAgPSBuYXZpZ2F0ZU1lbnUuZmluZE1lbnVVc2luZ1BhdGgoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5HT19UTyk7Ci0JCQlpZiAoZ290b0dyb3VwICE9IG51bGwpIHsKLQkJCQlnb3RvR3JvdXAuYWRkKGZHb3RvTWF0Y2hpbmdCcmFja2V0QWN0aW9uKTsKLQkJCQlnb3RvR3JvdXAuYWRkKGZHb1RvTWF0Y2hpbmdUYWdBY3Rpb24pOwotCQkJCWdvdG9Hcm91cC5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCX0KLQkJfQotKi8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51dGlsLkFjdGlvbkNvbnRyaWJ1dG9yI2dldEV4dGVuc2lvbklEcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEV4dGVuc2lvbklEcygpIHsKLQkJcmV0dXJuIEVESVRPUl9JRFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3Ijc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJaWYgKGdldEFjdGl2ZUVkaXRvclBhcnQoKSA9PSBhY3RpdmVFZGl0b3IpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQotCQlJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gZ2V0QWN0aW9uQmFycygpOwotCQlpZiAoYWN0aW9uQmFycyAhPSBudWxsKSB7Ci0JCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIgPSBhY3Rpb25CYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0JCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgewotCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UobnVsbCk7Ci0JCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJfQotCQl9Ci0KLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IGdldFRleHRFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQotCQlmQ29udGVudEFzc2lzdC5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NPTlRFTlRBU1NJU1RfUFJPUE9TQUxTKSk7Ci0KLQkJZkNsZWFudXBEb2N1bWVudC5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NMRUFOVVBfRE9DVU1FTlQpKTsKLQkJZkZvcm1hdERvY3VtZW50LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0RPQ1VNRU5UKSk7Ci0JCWZGb3JtYXRBY3RpdmVFbGVtZW50cy5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9BQ1RJVkVfRUxFTUVOVFMpKTsKLQkJZkNsZWFudXBEb2N1bWVudC5zZXRFbmFibGVkKCh0ZXh0RWRpdG9yICE9IG51bGwpICYmIHRleHRFZGl0b3IuaXNFZGl0YWJsZSgpKTsKLQkJZkZvcm1hdERvY3VtZW50LnNldEVuYWJsZWQoKHRleHRFZGl0b3IgIT0gbnVsbCkgJiYgdGV4dEVkaXRvci5pc0VkaXRhYmxlKCkpOwotCQlmRm9ybWF0QWN0aXZlRWxlbWVudHMuc2V0RW5hYmxlZCgodGV4dEVkaXRvciAhPSBudWxsKSAmJiB0ZXh0RWRpdG9yLmlzRWRpdGFibGUoKSk7Ci0KLQkJZk9wZW5GaWxlQWN0aW9uLnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfT1BFTl9GSUxFKSk7Ci0KLQkJZkZpbmRPY2N1cnJlbmNlcy5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZJTkRfT0NDVVJSRU5DRVMpKTsKLQotCQlmR29Ub01hdGNoaW5nVGFnQWN0aW9uLnNldEVkaXRvcih0ZXh0RWRpdG9yKTsKLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJdGV4dEVkaXRvci5zZXRBY3Rpb24oR09fVE9fTUFUQ0hJTkdfVEFHX0lELCBmR29Ub01hdGNoaW5nVGFnQWN0aW9uKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Ijc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJZkNvbnRlbnRBc3Npc3Quc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJLy8gY2xlYW51cCBhbmQgZm9ybWF0IGRvY3VtZW50IGFjdGlvbnMgZG8gbm90IHJlbHkgb24gc291cmNlIHZpZXdlcgotCQkvLyBiZWluZyBlbmFibGVkCi0JCS8vIGZDbGVhbnVwRG9jdW1lbnQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJLy8gZkZvcm1hdERvY3VtZW50LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJZkZvcm1hdEFjdGl2ZUVsZW1lbnRzLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZPcGVuRmlsZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmRmluZE9jY3VycmVuY2VzLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJZkdvVG9NYXRjaGluZ1RhZ0FjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmR290b01hdGNoaW5nQnJhY2tldEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDM4Mzc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNvbW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBBZGQgYmxvY2sgY29tbWVudCBhY3Rpb24gZGVsZWdhdGUgZm9yIFhNTCBlZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIEFkZEJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlIGV4dGVuZHMgQWJzdHJhY3RDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUgewotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuQWRkQmxvY2tDb21tZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLkFkZEJsb2NrQ29tbWVudF90b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihYTUxVSU1lc3NhZ2VzLkFkZEJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLQl2b2lkIHByb2Nlc3NBY3Rpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCUluZGV4ZWRSZWdpb24gc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCi0JCQkJaWYgKHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKChzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uID09IG51bGwpICYmICh0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpID4gMCkpIHsKLQkJCQkJc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJCQl9Ci0JCQkJaWYgKHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24gPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaW50IG9wZW5Db21tZW50T2Zmc2V0ID0gc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGNsb3NlQ29tbWVudE9mZnNldCA9IHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCk7Ci0KLQotCQkJCWlmICgodGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSA9PSAwKSAmJiAoc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgQ29tbWVudEltcGwpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBYTUxVSU1lc3NhZ2VzLkFkZEJsb2NrQ29tbWVudF90b29sdGlwKTsKLQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCXRyeSB7Ci0JCQkJCWRvY3VtZW50LnJlcGxhY2Uob3BlbkNvbW1lbnRPZmZzZXQsIDAsIE9QRU5fQ09NTUVOVCk7Ci0JCQkJCWRvY3VtZW50LnJlcGxhY2UoY2xvc2VDb21tZW50T2Zmc2V0LCAwLCBDTE9TRV9DT01NRU5UKTsKLQkJCQkJcmVtb3ZlT3BlbkNsb3NlQ29tbWVudHMoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0ICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCBjbG9zZUNvbW1lbnRPZmZzZXQgLSBvcGVuQ29tbWVudE9mZnNldCAtIENMT1NFX0NPTU1FTlQubGVuZ3RoKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQmFzZU5vZGVBY3Rpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9CYXNlTm9kZUFjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ2NTE1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9CYXNlTm9kZUFjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VOb2RlQWN0aW9uTWFuYWdlciB7Ci0KLQotCS8qKgotCSAqIE15TWVudU1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE15TWVudU1hbmFnZXIgZXh0ZW5kcyBNZW51TWFuYWdlciB7Ci0JCXByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0KLQkJcHVibGljIE15TWVudU1hbmFnZXIoU3RyaW5nIHMpIHsKLQkJCXN1cGVyKHMpOwotCQkJdGl0bGUgPSBzOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJcmV0dXJuICFpc0VtcHR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRpdGxlOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudFR5cGUgZ2V0RG9jdHlwZShOb2RlIG5vZGUpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgPyAoRG9jdW1lbnQpIG5vZGUgOiBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJcmV0dXJuIGRvY3VtZW50LmdldERvY3R5cGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWVudUJ1aWxkZXIgbWVudUJ1aWxkZXIgPSBuZXcgTWVudUJ1aWxkZXIoKTsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBmTW9kZWw7Ci0JcHJvdGVjdGVkIE1vZGVsUXVlcnkgbW9kZWxRdWVyeTsKLQotCXByb3RlY3RlZCBCYXNlTm9kZUFjdGlvbk1hbmFnZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5KSB7Ci0JCXRoaXMuZk1vZGVsID0gbW9kZWw7Ci0JCXRoaXMubW9kZWxRdWVyeSA9IG1vZGVsUXVlcnk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpb25IZWxwZXIoSU1lbnVNYW5hZ2VyIG1lbnUsIExpc3QgbW9kZWxRdWVyeUFjdGlvbkxpc3QpIHsKLQkJTGlzdCBhY3Rpb25MaXN0ID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBtb2RlbFF1ZXJ5QWN0aW9uTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU1vZGVsUXVlcnlBY3Rpb24gYWN0aW9uID0gKE1vZGVsUXVlcnlBY3Rpb24pIGkubmV4dCgpOwotCQkJaWYgKGFjdGlvbi5nZXRDTU5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJaW50IGNtTm9kZVR5cGUgPSBhY3Rpb24uZ2V0Q01Ob2RlKCkuZ2V0Tm9kZVR5cGUoKTsKLQkJCQlpZiAoYWN0aW9uLmdldEtpbmQoKSA9PSBNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCkgewotCQkJCQlzd2l0Y2ggKGNtTm9kZVR5cGUpIHsKLQkJCQkJCWNhc2UgQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTiA6IHsKLQkJCQkJCQlhY3Rpb25MaXN0LmFkZChjcmVhdGVBZGRBdHRyaWJ1dGVBY3Rpb24oKEVsZW1lbnQpIGFjdGlvbi5nZXRQYXJlbnQoKSwgKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGFjdGlvbi5nZXRDTU5vZGUoKSkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6IHsKLQkJCQkJCQlhY3Rpb25MaXN0LmFkZChjcmVhdGVBZGRFbGVtZW50QWN0aW9uKGFjdGlvbi5nZXRQYXJlbnQoKSwgKENNRWxlbWVudERlY2xhcmF0aW9uKSBhY3Rpb24uZ2V0Q01Ob2RlKCksIGFjdGlvbi5nZXRTdGFydEluZGV4KCkpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChhY3Rpb24uZ2V0S2luZCgpID09IE1vZGVsUXVlcnlBY3Rpb24uUkVQTEFDRSkgewotCQkJCQlpZiAoKGFjdGlvbi5nZXRQYXJlbnQoKSAhPSBudWxsKSAmJiAoYWN0aW9uLmdldENNTm9kZSgpICE9IG51bGwpKSB7Ci0JCQkJCQlhY3Rpb25MaXN0LmFkZChjcmVhdGVSZXBsYWNlQWN0aW9uKGFjdGlvbi5nZXRQYXJlbnQoKSwgYWN0aW9uLmdldENNTm9kZSgpLCBhY3Rpb24uZ2V0U3RhcnRJbmRleCgpLCBhY3Rpb24uZ2V0RW5kSW5kZXgoKSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCW1lbnVCdWlsZGVyLnBvcHVsYXRlTWVudShtZW51LCBhY3Rpb25MaXN0LCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZUFjdGlvbihJTWVudU1hbmFnZXIgbWVudSwgQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCW1lbnUuYWRkKGFjdGlvbik7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBMaXN0IHNlbGVjdGlvbikgewotCQlpbnQgZWRpdE1vZGUgPSBtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCk7Ci0JCWludCBpYyA9IE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUzsKLQkJaW50IHZjID0gKGVkaXRNb2RlID09IE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCkgPyBNb2RlbFF1ZXJ5LlZBTElESVRZX1NUUklDVCA6IE1vZGVsUXVlcnkuVkFMSURJVFlfTk9ORTsKLQotCQlMaXN0IGltcGxpY2l0bHlTZWxlY3RlZE5vZGVMaXN0ID0gbnVsbDsKLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCWltcGxpY2l0bHlTZWxlY3RlZE5vZGVMaXN0ID0gZ2V0U2VsZWN0ZWROb2RlcyhzZWxlY3Rpb24sIHRydWUpOwotCi0JCQkvLyBjb250cmlidXRlIGRlbGV0ZSBhY3Rpb25zCi0JCQljb250cmlidXRlRGVsZXRlQWN0aW9ucyhtZW51LCBpbXBsaWNpdGx5U2VsZWN0ZWROb2RlTGlzdCwgaWMsIHZjKTsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBzZWxlY3Rpb24uZ2V0KDApOwotCi0JCQkvLyBjb250cmlidXRlIGVkaXQgYWN0aW9ucwotCQkJY29udHJpYnV0ZUVkaXRBY3Rpb25zKG1lbnUsIG5vZGUpOwotCi0JCQkvLyBjb250cmlidXRlIGFkZCBjaGlsZCBhY3Rpb25zCi0JCQljb250cmlidXRlQWRkQ2hpbGRBY3Rpb25zKG1lbnUsIG5vZGUsIGljLCB2Yyk7Ci0KLQkJCS8vIGNvbnRyaWJ1dGUgYWRkIGJlZm9yZSBhY3Rpb25zCi0JCQljb250cmlidXRlQWRkU2libGluZ0FjdGlvbnMobWVudSwgbm9kZSwgaWMsIHZjKTsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJLy8gY29udHJpYnV0ZSByZXBsYWNlIGFjdGlvbnMKLQkJCWNvbnRyaWJ1dGVSZXBsYWNlQWN0aW9ucyhtZW51LCBpbXBsaWNpdGx5U2VsZWN0ZWROb2RlTGlzdCwgaWMsIHZjKTsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDApIHsKLQkJCURvY3VtZW50IGRvY3VtZW50ID0gKChJRE9NTW9kZWwpIGZNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCWNvbnRyaWJ1dGVBZGREb2N1bWVudENoaWxkQWN0aW9ucyhtZW51LCBkb2N1bWVudCwgaWMsIHZjKTsKLQkJCWNvbnRyaWJ1dGVFZGl0R3JhbW1hckluZm9ybWF0aW9uQWN0aW9ucyhtZW51LCBkb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5Db250cmlidXRlQ2hpbGRBY3Rpb25zKE5vZGUgbm9kZSl7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVBZGRDaGlsZEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIE5vZGUgbm9kZSwgaW50IGljLCBpbnQgdmMpIHsKLQkJaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCi0JCWlmIChub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBjYW5Db250cmlidXRlQ2hpbGRBY3Rpb25zKG5vZGUpKSB7Ci0JCQkvLyAnQWRkIENoaWxkLi4uJyBhbmQgJ0FkZCBBdHRyaWJ1dGUuLi4nIGFjdGlvbnMKLQkJCS8vCi0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQotCQkJSU1lbnVNYW5hZ2VyIGFkZEF0dHJpYnV0ZU1lbnUgPSBuZXcgTXlNZW51TWFuYWdlcihYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9BVFRSSUJVVEUpOwotCQkJSU1lbnVNYW5hZ2VyIGFkZENoaWxkTWVudSA9IG5ldyBNeU1lbnVNYW5hZ2VyKFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX0NISUxEKTsKLQkJCW1lbnUuYWRkKGFkZEF0dHJpYnV0ZU1lbnUpOwotCQkJbWVudS5hZGQoYWRkQ2hpbGRNZW51KTsKLQkJCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJCS8vIGFkZCBpbnNlcnQgYXR0cmlidXRlIGFjdGlvbnMKLQkJCQkvLwotCQkJCUxpc3QgbW9kZWxRdWVyeUFjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW9kZWxRdWVyeS5nZXRJbnNlcnRBY3Rpb25zKGVsZW1lbnQsIGVkLCAtMSwgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMsIHZjLCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0JCQkJYWRkQWN0aW9uSGVscGVyKGFkZEF0dHJpYnV0ZU1lbnUsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQkJCQkvLyBhZGQgaW5zZXJ0IGNoaWxkIG5vZGUgYWN0aW9ucwotCQkJCS8vCi0JCQkJbW9kZWxRdWVyeUFjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW9kZWxRdWVyeS5nZXRJbnNlcnRBY3Rpb25zKGVsZW1lbnQsIGVkLCAtMSwgaWMsIHZjLCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0JCQkJYWRkQWN0aW9uSGVscGVyKGFkZENoaWxkTWVudSwgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCQkJfQotCi0JCQkvLyBhZGQgUEkgYW5kIENPTU1FTlQKLQkJCWNvbnRyaWJ1dGVQSUFuZENvbW1lbnRBY3Rpb25zKGFkZENoaWxkTWVudSwgZWxlbWVudCwgZWQsIC0xKTsKLQotCQkJLy8gYWRkIFBDREFUQSwgQ0RBVEFfU0VDVElPTgotCQkJY29udHJpYnV0ZVRleHROb2RlQWN0aW9ucyhhZGRDaGlsZE1lbnUsIGVsZW1lbnQsIGVkLCAtMSk7Ci0KLQkJCS8vIGFkZCBORVcgRUxFTUVOVAotCQkJY29udHJpYnV0ZVVuY29uc3RyYWluZWRBZGRFbGVtZW50QWN0aW9uKGFkZENoaWxkTWVudSwgZWxlbWVudCwgZWQsIC0xKTsKLQotCQkJLy8gYWRkIEFUVFJJQlVURQotCQkJY29udHJpYnV0ZVVuY29uc3RyYWluZWRBdHRyaWJ1dGVBY3Rpb25zKGFkZEF0dHJpYnV0ZU1lbnUsIGVsZW1lbnQsIGVkKTsKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZUFkZERvY3VtZW50Q2hpbGRBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBEb2N1bWVudCBkb2N1bWVudCwgaW50IGljLCBpbnQgdmMpIHsKLQkJSU1lbnVNYW5hZ2VyIGFkZENoaWxkTWVudSA9IG5ldyBNeU1lbnVNYW5hZ2VyKFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX0NISUxEKTsKLQkJbWVudS5hZGQoYWRkQ2hpbGRNZW51KTsKLQotCQkvLyBhZGQgUEkgYW5kIENPTU1FTlQKLQkJY29udHJpYnV0ZVBJQW5kQ29tbWVudEFjdGlvbnMoYWRkQ2hpbGRNZW51LCBkb2N1bWVudCwgLTEpOwotCi0JCS8vIGFkZCBORVcgRUxFTUVOVAotCQljb250cmlidXRlVW5jb25zdHJhaW5lZEFkZEVsZW1lbnRBY3Rpb24oYWRkQ2hpbGRNZW51LCBkb2N1bWVudCwgLTEpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZUFkZFNpYmxpbmdBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBOb2RlIG5vZGUsIGludCBpYywgaW50IHZjKSB7Ci0JCUlNZW51TWFuYWdlciBhZGRCZWZvcmVNZW51ID0gbmV3IE15TWVudU1hbmFnZXIoWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BRERfQkVGT1JFKTsKLQkJSU1lbnVNYW5hZ2VyIGFkZEFmdGVyTWVudSA9IG5ldyBNeU1lbnVNYW5hZ2VyKFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX0FGVEVSKTsKLQkJbWVudS5hZGQoYWRkQmVmb3JlTWVudSk7Ci0JCW1lbnUuYWRkKGFkZEFmdGVyTWVudSk7Ci0KLQkJTm9kZSBwYXJlbnROb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnROb2RlICE9IG51bGwpIHsKLQkJCWludCBpbmRleCA9IGdldEluZGV4KHBhcmVudE5vZGUsIG5vZGUpOwotCQkJaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnROb2RlOwotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVEID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnRFbGVtZW50KTsKLQkJCQlpZiAocGFyZW50RUQgIT0gbnVsbCkgewotCQkJCQkvLyAnQWRkIEJlZm9yZS4uLicgYW5kICdBZGQgQWZ0ZXIuLi4nIGFjdGlvbnMKLQkJCQkJLy8KLQkJCQkJTGlzdCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJbW9kZWxRdWVyeS5nZXRJbnNlcnRBY3Rpb25zKHBhcmVudEVsZW1lbnQsIHBhcmVudEVELCBpbmRleCwgaWMsIHZjLCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0JCQkJCWFkZEFjdGlvbkhlbHBlcihhZGRCZWZvcmVNZW51LCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0KLQkJCQkJbW9kZWxRdWVyeUFjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCW1vZGVsUXVlcnkuZ2V0SW5zZXJ0QWN0aW9ucyhwYXJlbnRFbGVtZW50LCBwYXJlbnRFRCwgaW5kZXggKyAxLCBpYywgdmMsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQkJCQkJYWRkQWN0aW9uSGVscGVyKGFkZEFmdGVyTWVudSwgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCQkJCX0KLQotCQkJCS8vIGFkZCBDT01NRU5UIGFuZCBQSSBiZWZvcmUgYW5kIGFmdGVyCi0JCQkJY29udHJpYnV0ZVBJQW5kQ29tbWVudEFjdGlvbnMoYWRkQmVmb3JlTWVudSwgcGFyZW50RWxlbWVudCwgcGFyZW50RUQsIGluZGV4KTsKLQkJCQljb250cmlidXRlUElBbmRDb21tZW50QWN0aW9ucyhhZGRBZnRlck1lbnUsIHBhcmVudEVsZW1lbnQsIHBhcmVudEVELCBpbmRleCArIDEpOwotCi0JCQkJLy8gYWRkIFBDREFUQSwgQ0RBVEFfU0VDVElPTiBiZWZvcmUgYW5kIGFmdGVyCi0JCQkJY29udHJpYnV0ZVRleHROb2RlQWN0aW9ucyhhZGRCZWZvcmVNZW51LCBwYXJlbnRFbGVtZW50LCBwYXJlbnRFRCwgaW5kZXgpOwotCQkJCWNvbnRyaWJ1dGVUZXh0Tm9kZUFjdGlvbnMoYWRkQWZ0ZXJNZW51LCBwYXJlbnRFbGVtZW50LCBwYXJlbnRFRCwgaW5kZXggKyAxKTsKLQotCQkJCS8vIGFkZCBORVcgRUxFTUVOVCBiZWZvcmUgYW5kIGFmdGVyCi0JCQkJY29udHJpYnV0ZVVuY29uc3RyYWluZWRBZGRFbGVtZW50QWN0aW9uKGFkZEJlZm9yZU1lbnUsIHBhcmVudEVsZW1lbnQsIHBhcmVudEVELCBpbmRleCk7Ci0JCQkJY29udHJpYnV0ZVVuY29uc3RyYWluZWRBZGRFbGVtZW50QWN0aW9uKGFkZEFmdGVyTWVudSwgcGFyZW50RWxlbWVudCwgcGFyZW50RUQsIGluZGV4ICsgMSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSAoRG9jdW1lbnQpIHBhcmVudE5vZGU7Ci0JCQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gbW9kZWxRdWVyeS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChwYXJlbnROb2RlKTsKLQkJCQlpZiAoY21Eb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCS8vIGFkZCBwb3NzaWJsZSByb290IGVsZW1lbnQgaW5zZXJ0aW9ucwotCQkJCQkvLyAgICAgICAgCi0JCQkJCUxpc3QgbW9kZWxRdWVyeUFjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCW1vZGVsUXVlcnkuZ2V0SW5zZXJ0QWN0aW9ucyhkb2N1bWVudCwgY21Eb2N1bWVudCwgaW5kZXgsIGljLCB2YywgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCQkJCQlhZGRBY3Rpb25IZWxwZXIoYWRkQWZ0ZXJNZW51LCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0KLQkJCQkJbW9kZWxRdWVyeUFjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCW1vZGVsUXVlcnkuZ2V0SW5zZXJ0QWN0aW9ucyhkb2N1bWVudCwgY21Eb2N1bWVudCwgaW5kZXggKyAxLCBpYywgdmMsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQkJCQkJYWRkQWN0aW9uSGVscGVyKGFkZEFmdGVyTWVudSwgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCQkJCX0KLQotCQkJCS8vIGFkZCBDT01NRU5UIGFuZCBQSSBiZWZvcmUgYW5kIGFmdGVyCi0JCQkJY29udHJpYnV0ZVBJQW5kQ29tbWVudEFjdGlvbnMoYWRkQmVmb3JlTWVudSwgZG9jdW1lbnQsIGluZGV4KTsKLQkJCQljb250cmlidXRlUElBbmRDb21tZW50QWN0aW9ucyhhZGRBZnRlck1lbnUsIGRvY3VtZW50LCBpbmRleCArIDEpOwotCi0JCQkJLy8gYWRkIEVMRU1FTlQgYmVmb3JlIGFuZCBhZnRlcgotCQkJCWNvbnRyaWJ1dGVVbmNvbnN0cmFpbmVkQWRkRWxlbWVudEFjdGlvbihhZGRCZWZvcmVNZW51LCBkb2N1bWVudCwgaW5kZXgpOwotCQkJCWNvbnRyaWJ1dGVVbmNvbnN0cmFpbmVkQWRkRWxlbWVudEFjdGlvbihhZGRBZnRlck1lbnUsIGRvY3VtZW50LCBpbmRleCArIDEpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZURlbGV0ZUFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIExpc3QgbGlzdCwgaW50IGljLCBpbnQgdmMpIHsKLQkJYm9vbGVhbiBjYW5SZW1vdmUgPSBtb2RlbFF1ZXJ5LmNhblJlbW92ZShsaXN0LCB2Yyk7Ci0KLQotCQkvLyBhIGRlbGV0ZSBhY3Rpb24gd2l0aCBhbiBlbXB0eSBsaXN0IHdpbGwgcHJvZHVjZSBhIGRpc2FibGVkIG1lbnUKLQkJLy8gaXRlbQotCQkvLwotCQlMaXN0IHJlc3VsdExpc3QgPSBjYW5SZW1vdmUgPyBsaXN0IDogQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVEZWxldGVBY3Rpb24ocmVzdWx0TGlzdCkpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZUVkaXRBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBOb2RlIG5vZGUpIHsKLQkJY29udHJpYnV0ZUVkaXRHcmFtbWFySW5mb3JtYXRpb25BY3Rpb25zKG1lbnUsIG5vZGUpOwotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpIHsKLQkJCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbigoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlKSk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlRWRpdEF0dHJpYnV0ZUFjdGlvbigoQXR0cikgbm9kZSwgbnVsbCkpOwotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlRWRpdEdyYW1tYXJJbmZvcm1hdGlvbkFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIE5vZGUgbm9kZSkgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUgPyAoRG9jdW1lbnQpIG5vZGUgOiBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQotCQlEb2N1bWVudFR5cGUgZG9jdHlwZSA9IGdldERvY3R5cGUobm9kZSk7Ci0JCWlmIChkb2N0eXBlID09IG51bGwpIHsKLQkJCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlQWRkRG9jdHlwZUFjdGlvbihkb2N1bWVudCwgLTEpKTsKLQkJfQotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlRWRpdERvY3R5cGVBY3Rpb24oKERvY3VtZW50VHlwZSkgbm9kZSkpOwotCQl9Ci0KLQkJaWYgKChkb2N0eXBlID09IG51bGwpICYmIChnZXRSb290RWxlbWVudChkb2N1bWVudCkgIT0gbnVsbCkpIHsKLQkJCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlRWRpdFNjaGVtYUluZm9BY3Rpb24oZ2V0Um9vdEVsZW1lbnQoZG9jdW1lbnQpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlUElBbmRDb21tZW50QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgRG9jdW1lbnQgZG9jdW1lbnQsIGludCBpbmRleCkgewotCQkvLyB0ZXN0IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBpbmRleCBpc24ndCBiZWZvcmUgdGhlIFhNTCBkZWNsYXJhdGlvbgotCQkvLyAKLQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGRDb21tZW50QWN0aW9uKGRvY3VtZW50LCBpbmRleCkpOwotCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUFkZFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbihkb2N1bWVudCwgaW5kZXgpKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVQSUFuZENvbW1lbnRBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBFbGVtZW50IHBhcmVudEVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkLCBpbnQgaW5kZXgpIHsKLQkJaWYgKChwYXJlbnRFZCA9PSBudWxsKSB8fCBpc0NvbW1lbnRBbGxvd2VkKHBhcmVudEVkKSkgewotCQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGRDb21tZW50QWN0aW9uKHBhcmVudEVsZW1lbnQsIGluZGV4KSk7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUFkZFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbihwYXJlbnRFbGVtZW50LCBpbmRleCkpOwotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlUmVwbGFjZUFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIExpc3Qgc2VsZWN0ZWROb2RlTGlzdCwgaW50IGljLCBpbnQgdmMpIHsKLQkJLy8gJ1JlcGxhY2UgV2l0aC4uLicgYWN0aW9ucwotCQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJSU1lbnVNYW5hZ2VyIHJlcGxhY2VXaXRoTWVudSA9IG5ldyBNeU1lbnVNYW5hZ2VyKFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfUkVQTEFDRV9XSVRIKTsKLQkJbWVudS5hZGQocmVwbGFjZVdpdGhNZW51KTsKLQotCQlpZiAoKG1vZGVsUXVlcnkuZ2V0RWRpdE1vZGUoKSA9PSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpICYmIChzZWxlY3RlZE5vZGVMaXN0LnNpemUoKSA+IDApKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgc2VsZWN0ZWROb2RlTGlzdC5nZXQoMCk7Ci0JCQlOb2RlIHBhcmVudE5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmICgocGFyZW50Tm9kZSAhPSBudWxsKSAmJiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSkgewotCQkJCUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnROb2RlOwotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVEID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnRFbGVtZW50KTsKLQkJCQlpZiAocGFyZW50RUQgIT0gbnVsbCkgewotCQkJCQlMaXN0IHJlcGxhY2VBY3Rpb25MaXN0ID0gbmV3IFZlY3RvcigpOwotCQkJCQltb2RlbFF1ZXJ5LmdldFJlcGxhY2VBY3Rpb25zKHBhcmVudEVsZW1lbnQsIHBhcmVudEVELCBzZWxlY3RlZE5vZGVMaXN0LCBpYywgdmMsIHJlcGxhY2VBY3Rpb25MaXN0KTsKLQkJCQkJYWRkQWN0aW9uSGVscGVyKHJlcGxhY2VXaXRoTWVudSwgcmVwbGFjZUFjdGlvbkxpc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVUZXh0Tm9kZUFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIEVsZW1lbnQgcGFyZW50RWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RWQsIGludCBpbmRleCkgewotCQlpZiAoKHBhcmVudEVkID09IG51bGwpIHx8IGlzVGV4dEFsbG93ZWQocGFyZW50RWQpKSB7Ci0JCQlDTURhdGFUeXBlIGRhdGFUeXBlID0gcGFyZW50RWQgIT0gbnVsbCA/IHBhcmVudEVkLmdldERhdGFUeXBlKCkgOiBudWxsOwotCQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGRQQ0RhdGFBY3Rpb24ocGFyZW50RWxlbWVudCwgZGF0YVR5cGUsIGluZGV4KSk7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUFkZENEYXRhU2VjdGlvbkFjdGlvbihwYXJlbnRFbGVtZW50LCBpbmRleCkpOwotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVW5jb25zdHJhaW5lZEFkZEVsZW1lbnRBY3Rpb24oSU1lbnVNYW5hZ2VyIG1lbnUsIERvY3VtZW50IGRvY3VtZW50LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGlzVW5jb25zdHJhaW5lZEFjdGlvbkFsbG93ZWQoKSkgewotCQkJaWYgKGdldFJvb3RFbGVtZW50KGRvY3VtZW50KSA9PSBudWxsKSB7Ci0JCQkJaW50IHhtbERlY2xhcmF0aW9uSW5kZXggPSAtMTsKLQkJCQlpbnQgZG9jdHlwZUluZGV4ID0gLTE7Ci0JCQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQkJCWludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQkJCQlkb2N0eXBlSW5kZXggPSBpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpIHsKLQkJCQkJCVByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIG5vZGU7Ci0JCQkJCQlpZiAocGkuZ2V0VGFyZ2V0KCkuZXF1YWxzSWdub3JlQ2FzZSgieG1sIikgJiYgKHhtbERlY2xhcmF0aW9uSW5kZXggPT0gLTEpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl4bWxEZWNsYXJhdGlvbkluZGV4ID0gaTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICgoKHhtbERlY2xhcmF0aW9uSW5kZXggPT0gLTEpIHx8IChpbmRleCA+IHhtbERlY2xhcmF0aW9uSW5kZXgpKSAmJiAoKGRvY3R5cGVJbmRleCA9PSAtMSkgfHwgKGluZGV4ID4gZG9jdHlwZUluZGV4KSkpIHsKLQkJCQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGRFbGVtZW50QWN0aW9uKGRvY3VtZW50LCBudWxsLCBpbmRleCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVVuY29uc3RyYWluZWRBZGRFbGVtZW50QWN0aW9uKElNZW51TWFuYWdlciBtZW51LCBFbGVtZW50IHBhcmVudEVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkLCBpbnQgaW5kZXgpIHsKLQkJaWYgKGlzVW5jb25zdHJhaW5lZEFjdGlvbkFsbG93ZWQoKSkgewotCQkJaWYgKChwYXJlbnRFZCA9PSBudWxsKSB8fCAocGFyZW50RWQuZ2V0UHJvcGVydHkoImlzSW5mZXJyZWQiKSA9PSBCb29sZWFuLlRSVUUpIHx8ICgobW9kZWxRdWVyeS5nZXRFZGl0TW9kZSgpICE9IE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCkgJiYgaXNFbGVtZW50QWxsb3dlZChwYXJlbnRFZCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUFkZEVsZW1lbnRBY3Rpb24ocGFyZW50RWxlbWVudCwgbnVsbCwgaW5kZXgpKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVVuY29uc3RyYWluZWRBdHRyaWJ1dGVBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBFbGVtZW50IHBhcmVudEVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkKSB7Ci0JCWlmIChpc1VuY29uc3RyYWluZWRBY3Rpb25BbGxvd2VkKCkpIHsKLQkJCWlmICgocGFyZW50RWQgPT0gbnVsbCkgfHwgKHBhcmVudEVkLmdldFByb3BlcnR5KCJpc0luZmVycmVkIikgPT0gQm9vbGVhbi5UUlVFKSB8fCAobW9kZWxRdWVyeS5nZXRFZGl0TW9kZSgpICE9IE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlQWRkQXR0cmlidXRlQWN0aW9uKHBhcmVudEVsZW1lbnQsIG51bGwpKTsKLQkJCX0KLQkJfQotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkQXR0cmlidXRlQWN0aW9uKEVsZW1lbnQgcGFyZW50LCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkQ0RhdGFTZWN0aW9uQWN0aW9uKE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRDb21tZW50QWN0aW9uKE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGREb2N0eXBlQWN0aW9uKERvY3VtZW50IHBhcmVudCwgaW50IGluZGV4KTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkRWxlbWVudEFjdGlvbihOb2RlIHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmRleCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZFBDRGF0YUFjdGlvbihOb2RlIHBhcmVudCwgQ01EYXRhVHlwZSBkYXRhVHlwZSwgaW50IGluZGV4KTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkUHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uKE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRTY2hlbWFJbmZvQWN0aW9uKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZURlbGV0ZUFjdGlvbihMaXN0IHNlbGVjdGlvbik7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUVkaXRBdHRyaWJ1dGVBY3Rpb24oQXR0ciBhdHRyaWJ1dGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVFZGl0RG9jdHlwZUFjdGlvbihEb2N1bWVudFR5cGUgZG9jdHlwZSk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24oUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpKTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlRWRpdFNjaGVtYUluZm9BY3Rpb24oRWxlbWVudCBlbGVtZW50KTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlUmVuYW1lQWN0aW9uKE5vZGUgbm9kZSk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZVJlcGxhY2VBY3Rpb24oTm9kZSBwYXJlbnQsIENNTm9kZSBjbW5vZGUsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpOwotCi0KLQlwdWJsaWMgaW50IGdldEluZGV4KE5vZGUgcGFyZW50Tm9kZSwgTm9kZSBjaGlsZCkgewotCQlOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgaW5kZXggPSAtMTsKLQkJaW50IHNpemUgPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChub2RlTGlzdC5pdGVtKGkpID09IGNoaWxkKSB7Ci0JCQkJaW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQotCXB1YmxpYyBOb2RlIGdldFJlZkNoaWxkTm9kZUF0SW5kZXgoTm9kZSBwYXJlbnQsIGludCBpbmRleCkgewotCQlOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCU5vZGUgcmVmQ2hpbGQgPSAoKGluZGV4ID49IDApICYmIChpbmRleCA8IG5vZGVMaXN0LmdldExlbmd0aCgpKSkgPyBub2RlTGlzdC5pdGVtKGluZGV4KSA6IG51bGw7Ci0JCXJldHVybiByZWZDaGlsZDsKLQl9Ci0KLQotCXByb3RlY3RlZCBFbGVtZW50IGdldFJvb3RFbGVtZW50KERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUVsZW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJcmVzdWx0ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByb3RlY3RlZCBMaXN0IGdldFNlbGVjdGVkTm9kZXMoTGlzdCBsaXN0LCBib29sZWFuIGluY2x1ZGVUZXh0Tm9kZXMpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDApOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGkubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJaWYgKGluY2x1ZGVUZXh0Tm9kZXMpIHsKLQkJCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0LmFkZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQ29tbWVudEFsbG93ZWQoQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RWQpIHsKLQkJaW50IGNvbnRlbnRUeXBlID0gcGFyZW50RWQuZ2V0Q29udGVudFR5cGUoKTsKLQkJcmV0dXJuIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UKSB8fCAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQpIHx8IChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEpIHx8IChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkpOwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbGVtZW50QWxsb3dlZChDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCkgewotCQlpbnQgY29udGVudFR5cGUgPSBwYXJlbnRFZC5nZXRDb250ZW50VHlwZSgpOwotCQlyZXR1cm4gKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQpIHx8IChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCkgfHwgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkFOWSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RleHRBbGxvd2VkKENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkKSB7Ci0JCWludCBjb250ZW50VHlwZSA9IHBhcmVudEVkLmdldENvbnRlbnRUeXBlKCk7Ci0JCXJldHVybiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQpIHx8IChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEpIHx8IChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkpOwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNVbmNvbnN0cmFpbmVkQWN0aW9uQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1doaXRlc3BhY2VUZXh0Tm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9DbGVhbnVwQWN0aW9uWE1MRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0NsZWFudXBBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTFhODE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0NsZWFudXBBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DbGVhbnVwUHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBDbGVhbnVwIGFjdGlvbiBkZWxlZ2F0ZSBmb3IgQ1NTIGVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ2xlYW51cEFjdGlvblhNTERlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZkNsZWFudXBQcm9jZXNzb3I7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCQlmRWRpdG9yID0gbnVsbDsKLQkJZkNsZWFudXBQcm9jZXNzb3IgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkNsZWFudXBEb2N1bWVudF9sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoWE1MVUlNZXNzYWdlcy5DbGVhbnVwRG9jdW1lbnRfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oWE1MVUlNZXNzYWdlcy5DbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJZmluYWwgSVRleHRFZGl0b3IgZWRpdG9yID0gKElUZXh0RWRpdG9yKSBmRWRpdG9yOwotCQkJRGlhbG9nIGNsZWFudXBEaWFsb2cgPSBuZXcgQ2xlYW51cERpYWxvZ1hNTChlZGl0b3IuZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJaWYgKGNsZWFudXBEaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCS8vIHNldHVwIHJ1bm5hYmxlCi0JCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBjbGVhbnVwUHJvY2Vzc29yID0gZ2V0Q2xlYW51cFByb2Nlc3NvcigpOwotCQkJCQkJaWYgKGNsZWFudXBQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKSk7Ci0JCQkJCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkJCQljbGVhbnVwUHJvY2Vzc29yLmNsZWFudXBNb2RlbChtb2RlbCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0KLQkJCQkvLyBUT0RPOiBtYWtlIGluZGVwZW5kZW50IG9mICdtb2RlbCcuCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vIGJlZ2luIHJlY29yZGluZwotCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQotCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gbWFrZSBhIGJpZwotCQkJCQkJLy8gbW9kZWwgY2hhbmdlCi0JCQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCQkJLy8gcnVuCi0JCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgcnVubmFibGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcKLQkJCQkJCS8vIG1vZGVsCi0JCQkJCQkvLyBjaGFuZ2UKLQkJCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCi0JCQkJCQkvLyBlbmQgcmVjb3JkaW5nCi0JCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMsIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUlTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBnZXRDbGVhbnVwUHJvY2Vzc29yKCkgewotCQlpZiAoZkNsZWFudXBQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZkNsZWFudXBQcm9jZXNzb3IgPSBuZXcgQ2xlYW51cFByb2Nlc3NvclhNTCgpOwotCQl9Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJvY2Vzc29yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0NsZWFudXBEaWFsb2dYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0NsZWFudXBEaWFsb2dYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk5ZWFjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9DbGVhbnVwRGlhbG9nWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwRGlhbG9nWE1MIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94Q29udmVydEVPTENvZGVzOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94Rm9ybWF0U291cmNlOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3M7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94SW5zZXJ0WE1MRGVjbGFyYXRpb247Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgZk1vZGVsID0gbnVsbDsKLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZlByZWZlcmVuY2VzID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUFzaXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZVVwcGVyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYzsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4OwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3M7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyOwotCi0JcHVibGljIENsZWFudXBEaWFsb2dYTUwoU2hlbGwgc2hlbGwpIHsKLQotCQlzdXBlcihzaGVsbCk7Ci0JfQotCi0JcHVibGljIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuQ2xlYW51cF9VSV8pOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY3JlYXRlRGlhbG9nQXJlYUluQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCWluaXRpYWxpemVPcHRpb25zKCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGlhbG9nQXJlYUluQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLkNMRUFOVVBfWE1MX0hFTFBJRCk7IC8vIHVzZQotCQkvLyBYTUwKLQkJLy8gc3BlY2lmaWMKLQkJLy8gaGVscAotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIENvbXByZXNzIGVtcHR5IGVsZW1lbnQgdGFncwotCQlmQ2hlY2tCb3hDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzLnNldFRleHQoWE1MVUlNZXNzYWdlcy5Db21wcmVzc19lbXB0eV9lbGVtZW50X3RhZ3NfVUlfKTsKLQkJZkNoZWNrQm94Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIEluc2VydCBtaXNzaW5nIHJlcXVpcmVkIGF0dHJzCi0JCWZDaGVja0JveEluc2VydFJlcXVpcmVkQXR0cnMgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycy5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuSW5zZXJ0X3JlcXVpcmVkX2F0dHJpYnV0ZXNfVUlfKTsKLQkJZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBJbnNlcnQgbWlzc2luZyBiZWdpbi9lbmQgdGFncwotCQlmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncy5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuSW5zZXJ0X21pc3NpbmdfdGFnc19VSV8pOwotCQlmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBRdW90ZSBhdHRyaWJ1dGUgdmFsdWVzCi0JCWZDaGVja0JveFF1b3RlQXR0clZhbHVlcyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLlF1b3RlX2F0dHJpYnV0ZV92YWx1ZXNfVUlfKTsKLQkJZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIEZvcm1hdCBzb3VyY2UKLQkJZkNoZWNrQm94Rm9ybWF0U291cmNlID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveEZvcm1hdFNvdXJjZS5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuRm9ybWF0X3NvdXJjZV9VSV8pOwotCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJZkNoZWNrQm94SW5zZXJ0WE1MRGVjbGFyYXRpb24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94SW5zZXJ0WE1MRGVjbGFyYXRpb24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkluc2VydF9YTUxfZGVjbCk7Ci0JCWZDaGVja0JveEluc2VydFhNTERlY2xhcmF0aW9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIENvbnZlcnQgRU9MIGNvZGUKLQkJZkNoZWNrQm94Q29udmVydEVPTENvZGVzID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuQ29udmVydF9FT0xfY29kZXNfVUlfKTsKLQkJZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlDb21wb3NpdGUgRU9MQ29kZXMgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGhMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQloTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlFT0xDb2Rlcy5zZXRMYXlvdXQoaExheW91dCk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzID0gbmV3IEJ1dHRvbihFT0xDb2RlcywgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3Muc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkVPTF9XaW5kb3dzX1VJKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3MuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4ID0gbmV3IEJ1dHRvbihFT0xDb2RlcywgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkVPTF9Vbml4X1VJKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMgPSBuZXcgQnV0dG9uKEVPTENvZGVzLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLnNldFRleHQoWE1MVUlNZXNzYWdlcy5FT0xfTWFjX1VJKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVFT0xDb2RlUmFkaW9zKGJvb2xlYW4gZW5hYmxlKSB7Ci0KLQkJaWYgKChmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cyAhPSBudWxsKSAmJiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXggIT0gbnVsbCkgJiYgKGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMgIT0gbnVsbCkpIHsKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuc2V0RW5hYmxlZChlbmFibGUpOwotCQkJaWYgKCFmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5nZXRTZWxlY3Rpb24oKSAmJiAhZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguZ2V0U2VsZWN0aW9uKCkgJiYgIWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9wdGlvbnMoKSB7Ci0KLQkJZkNoZWNrQm94Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUykpOwotCQlmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUykpOwotCQlmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKSk7Ci0JCWZDaGVja0JveFF1b3RlQXR0clZhbHVlcy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUykpOwotCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2Uuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSkpOwotCQlmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpKTsKLQkJZkNoZWNrQm94SW5zZXJ0WE1MRGVjbGFyYXRpb24uc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuRklYX1hNTF9ERUNMQVJBVElPTikpOwotCQlTdHJpbmcgRU9MQ29kZSA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFKTsKLQkJaWYgKEVPTENvZGUuY29tcGFyZVRvKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkxGKSA9PSAwKSB7Ci0JCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoRU9MQ29kZS5jb21wYXJlVG8oQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1IpID09IDApIHsKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCWVsc2UgewotCQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3Muc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCWVuYWJsZUVPTENvZGVSYWRpb3MoZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0KLQkJc3RvcmVPcHRpb25zKCk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQotCQlmTW9kZWwgPSBtb2RlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZU9wdGlvbnMoKSB7Ci0KLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTLCBmQ2hlY2tCb3hDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMsIGZDaGVja0JveEluc2VydFJlcXVpcmVkQXR0cnMuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTLCBmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTLCBmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFLCBmQ2hlY2tCb3hGb3JtYXRTb3VyY2UuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT05WRVJUX0VPTF9DT0RFUywgZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuRklYX1hNTF9ERUNMQVJBVElPTiwgZkNoZWNrQm94SW5zZXJ0WE1MRGVjbGFyYXRpb24uZ2V0U2VsZWN0aW9uKCkpOwotCQlpZiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkxGKTsKLQkJfQotCQllbHNlIGlmIChmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUkxGKTsKLQkJfQotCQkvLyBleHBsaWNpdGx5IHNhdmUgcGx1Z2luIHByZWZlcmVuY2VzIHNvIHZhbHVlcyBhcmUgc3RvcmVkCi0JCVhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0KLQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZCgoKGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIgIT0gbnVsbCkgJiYgKGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkgfHwgZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkpIAotCQkJCXx8ICgoZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlTG93ZXIgIT0gbnVsbCkgJiYgKGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpIHx8IGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZVVwcGVyLmdldFNlbGVjdGlvbigpKSkKLQkJCQl8fCBmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncy5nZXRTZWxlY3Rpb24oKQotCQkJCXx8IGZDaGVja0JveFF1b3RlQXR0clZhbHVlcy5nZXRTZWxlY3Rpb24oKSAKLQkJCQl8fCBmQ2hlY2tCb3hGb3JtYXRTb3VyY2UuZ2V0U2VsZWN0aW9uKCkgCi0JCQkJfHwgZkNoZWNrQm94SW5zZXJ0WE1MRGVjbGFyYXRpb24uZ2V0U2VsZWN0aW9uKCkKLQkJCQl8fCBmQ2hlY2tCb3hDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MuZ2V0U2VsZWN0aW9uKCkKLQkJCQl8fCBmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzLmdldFNlbGVjdGlvbigpCi0JCQkJfHwgKCggZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmdldFNlbGVjdGlvbigpICYmIGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4ICE9IG51bGwgKSAmJiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguZ2V0U2VsZWN0aW9uKCkgfHwgZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5nZXRTZWxlY3Rpb24oKQotCQkJCQkJfHwgZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3MuZ2V0U2VsZWN0aW9uKCkpKSk7Ci0JCWlmIChlLndpZGdldCA9PSBmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMpIHsKLQkJCWVuYWJsZUVPTENvZGVSYWRpb3MoZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXRBdHRyaWJ1dGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXRBdHRyaWJ1dGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNkYzc3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0QXR0cmlidXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuRWRpdEF0dHJpYnV0ZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgRWRpdEF0dHJpYnV0ZUFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvcjsKLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZUltYWdlRGVzY3JpcHRvcigpIHsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIEF0dHIgYXR0cjsKLQlwcm90ZWN0ZWQgQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBtYW5hZ2VyOwotCXByb3RlY3RlZCBFbGVtZW50IG93bmVyRWxlbWVudDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCi0JcHVibGljIEVkaXRBdHRyaWJ1dGVBY3Rpb24oQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBtYW5hZ2VyLCBFbGVtZW50IG93bmVyRWxlbWVudCwgQXR0ciBhdHRyLCBTdHJpbmcgYWN0aW9uTGFiZWwsIFN0cmluZyB0aXRsZSkgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCQl0aGlzLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDsKLQkJdGhpcy5hdHRyID0gYXR0cjsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQlzZXRUZXh0KGFjdGlvbkxhYmVsKTsKLQkJLy8gYXNzdW1lIGlmIGF0dHIgaXMgbnVsbCB0aGVuIHRoaXMgaXMgYW4gJ0FkZCcgdGhhdCByZXF1aXJlcyBhY3Rpb24KLQkJLy8gYW4gaWNvbnMuLi4gb3RoZXJ3aXNlIHRoaXMgaXMgYW4gZWRpdAotCQlpZiAoYXR0ciA9PSBudWxsKSB7Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVNoZWxsIHNoZWxsID0gWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQlpZiAodmFsaWRhdGVFZGl0KG1hbmFnZXIuZ2V0TW9kZWwoKSwgc2hlbGwpKSB7Ci0JCQltYW5hZ2VyLmJlZ2luTm9kZUFjdGlvbih0aGlzKTsKLQkJCUVkaXRBdHRyaWJ1dGVEaWFsb2cgZGlhbG9nID0gbmV3IEVkaXRBdHRyaWJ1dGVEaWFsb2coc2hlbGwsIG93bmVyRWxlbWVudCwgYXR0cik7Ci0JCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCi0JCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCW93bmVyRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJCX0KLQkJCQlEb2N1bWVudCBkb2N1bWVudCA9IG93bmVyRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJQXR0ciBuZXdBdHRyaWJ1dGUgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoZGlhbG9nLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQkJbmV3QXR0cmlidXRlLnNldFZhbHVlKGRpYWxvZy5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLQkJCQlvd25lckVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShuZXdBdHRyaWJ1dGUpOwotCQkJCW1hbmFnZXIuc2V0Vmlld2VyU2VsZWN0aW9uKG5ld0F0dHJpYnV0ZSk7Ci0JCQl9Ci0JCQltYW5hZ2VyLmVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0RG9jdHlwZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdERvY3R5cGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlNTE1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0RG9jdHlwZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5FZGl0RG9jdHlwZURpYWxvZzsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEVkaXREb2N0eXBlQWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0RG9jdHlwZUFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCXByb3RlY3RlZCBEb2N1bWVudFR5cGUgZG9jdHlwZTsKLQlwcm90ZWN0ZWQgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWw7Ci0JcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uOwotCXByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IGRvY3R5cGUuCi0JICovCi0JcHVibGljIEVkaXREb2N0eXBlQWN0aW9uKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbiwgU3RyaW5nIHRpdGxlKSB7Ci0JCXNldFRleHQodGl0bGUpOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byBlZGl0IGFuIGV4aXNpdG5nIGRvY3R5cGUuCi0JICovCi0JcHVibGljIEVkaXREb2N0eXBlQWN0aW9uKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIERvY3VtZW50VHlwZSBkb2N0eXBlLCBTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbiwgU3RyaW5nIHRpdGxlKSB7Ci0JCXNldFRleHQodGl0bGUpOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXRoaXMuZG9jdHlwZSA9IGRvY3R5cGU7Ci0JCXRoaXMucmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQl9Ci0KLQotCXByb3RlY3RlZCBEb2N1bWVudFR5cGUgY3JlYXRlRG9jdHlwZShFZGl0RG9jdHlwZURpYWxvZyBkaWFsb2csIERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCURvY3VtZW50VHlwZSByZXN1bHQgPSBudWxsOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBEb2N1bWVudEltcGwpIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudEltcGwgPSAoSURPTURvY3VtZW50KSBkb2N1bWVudDsKLQkJCUlET01Eb2N1bWVudFR5cGUgZG9jdHlwZUltcGwgPSAoSURPTURvY3VtZW50VHlwZSkgZG9jdW1lbnRJbXBsLmNyZWF0ZURvY3R5cGUoZGlhbG9nLmdldE5hbWUoKSk7Ci0JCQlkb2N0eXBlSW1wbC5zZXRQdWJsaWNJZChkaWFsb2cuZ2V0UHVibGljSWQoKSk7Ci0JCQlkb2N0eXBlSW1wbC5zZXRTeXN0ZW1JZChkaWFsb2cuZ2V0U3lzdGVtSWQoKSk7Ci0JCQlyZXN1bHQgPSBkb2N0eXBlSW1wbDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgRGlzcGxheSBnZXREaXNwbGF5KCkgewotCi0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Um9vdEVsZW1lbnROYW1lKERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUVsZW1lbnQgcm9vdEVsZW1lbnQgPSBudWxsOwotCQlOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3RMZW5ndGg7IGkrKykgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotCQkJaWYgKGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJcm9vdEVsZW1lbnQgPSAoRWxlbWVudCkgY2hpbGROb2RlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByb290RWxlbWVudCAhPSBudWxsID8gcm9vdEVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSA6IFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1JPT1RfRUxFTUVOVF9WQUxVRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0RG9jdHlwZShEb2N1bWVudFR5cGUgZG9jdHlwZSwgRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJTm9kZSByZWZDaGlsZCA9IG51bGw7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQlpZiAoKGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB8fCAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpKSB7Ci0JCQkJLy8gY29udGludWUgb24gdG8gdGhlIG5leHROb2RlCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZWZDaGlsZCA9IGNoaWxkTm9kZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWRvY3VtZW50Lmluc2VydEJlZm9yZShkb2N0eXBlLCByZWZDaGlsZCk7Ci0JCS8vIG1hbmFnZXIucmVmb3JtYXQoZG9jdHlwZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJU2hlbGwgc2hlbGwgPSBnZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJaWYgKHZhbGlkYXRlRWRpdChtb2RlbCwgc2hlbGwpKSB7Ci0JCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBnZXRVbmRvRGVzY3JpcHRpb24oKSk7Ci0JCQkvLyBTaGVsbCBzaGVsbCA9Ci0JCQkvLyBYTUxDb21tb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCQlFZGl0RG9jdHlwZURpYWxvZyBkaWFsb2cgPSBzaG93RWRpdERvY3R5cGVEaWFsb2coc2hlbGwpOwotCQotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJaWYgKGRvY3R5cGUgIT0gbnVsbCkgewotCQkJCQl1cGRhdGVEb2N0eXBlKGRpYWxvZywgZG9jdHlwZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJRG9jdW1lbnRUeXBlIGRvY3R5cGUgPSBjcmVhdGVEb2N0eXBlKGRpYWxvZywgZG9jdW1lbnQpOwotCQkJCQlpZiAoZG9jdHlwZSAhPSBudWxsKSB7Ci0JCQkJCQlpbnNlcnREb2N0eXBlKGRvY3R5cGUsIGRvY3VtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCW1vZGVsLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBFZGl0RG9jdHlwZURpYWxvZyBzaG93RWRpdERvY3R5cGVEaWFsb2coU2hlbGwgc2hlbGwpIHsKLQkJRWRpdERvY3R5cGVEaWFsb2cgZGlhbG9nID0gbnVsbDsKLQotCQlpZiAoZG9jdHlwZSAhPSBudWxsKSB7Ci0JCQlkaWFsb2cgPSBuZXcgRWRpdERvY3R5cGVEaWFsb2coc2hlbGwsIGRvY3R5cGUpOwotCQkJaWYgKHRpdGxlID09IG51bGwpIHsKLQkJCQl0aXRsZSA9IFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0VESVRfRE9DVFlQRTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcm9vdEVsZW1lbnROYW1lID0gZ2V0Um9vdEVsZW1lbnROYW1lKGRvY3VtZW50KTsKLQkJCWRpYWxvZyA9IG5ldyBFZGl0RG9jdHlwZURpYWxvZyhzaGVsbCwgcm9vdEVsZW1lbnROYW1lLCAiIiwgcm9vdEVsZW1lbnROYW1lICsgIi5kdGQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAodGl0bGUgPT0gbnVsbCkgewotCQkJCXRpdGxlID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BRERfRFREX0lORk9STUFUSU9OX1RJVExFOwotCQkJfQotCQl9Ci0KLQkJZGlhbG9nLnNldENvbXB1dGVTeXN0ZW1JZCgoZG9jdHlwZSA9PSBudWxsKSB8fCAoZG9jdHlwZS5nZXRTeXN0ZW1JZCgpID09IG51bGwpIHx8IChkb2N0eXBlLmdldFN5c3RlbUlkKCkudHJpbSgpLmxlbmd0aCgpID09IDApKTsKLQotCQlkaWFsb2cuc2V0RXJyb3JDaGVja2luZyhmYWxzZSk7Ly8gIW1vZGVsLmdldFR5cGUoKS5lcXVhbHMoSVN0cnVjdHVyZWRNb2RlbC5IVE1MKSk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLnNldFJlc291cmNlTG9jYXRpb24obmV3IFBhdGgocmVzb3VyY2VMb2NhdGlvbikpOwotCQlkaWFsb2cub3BlbigpOwotCi0JCXJldHVybiBkaWFsb2c7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEb2N0eXBlKEVkaXREb2N0eXBlRGlhbG9nIGRpYWxvZywgRG9jdW1lbnRUeXBlIGRvY3R5cGUpIHsKLQkJaWYgKGRvY3R5cGUgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnRUeXBlKSB7Ci0JCQlJRE9NRG9jdW1lbnRUeXBlIGRvY3R5cGVJbXBsID0gKElET01Eb2N1bWVudFR5cGUpIGRvY3R5cGU7Ci0JCQlpZiAoZG9jdHlwZUltcGwuZ2V0TmFtZSgpLmVxdWFscyhkaWFsb2cuZ2V0TmFtZSgpKSkgewotCQkJCWRvY3R5cGVJbXBsLnNldFB1YmxpY0lkKGRpYWxvZy5nZXRQdWJsaWNJZCgpKTsKLQkJCQlkb2N0eXBlSW1wbC5zZXRTeXN0ZW1JZChkaWFsb2cuZ2V0U3lzdGVtSWQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBvbmUgYW5kIHJlbW92ZSB0aGUgb2xkCi0JCQkJLy8gICAgICAgICAgICAgICAgICAKLQkJCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvY3R5cGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJCURvY3VtZW50VHlwZSBuZXdEb2N0eXBlID0gY3JlYXRlRG9jdHlwZShkaWFsb2csIGRvY3VtZW50KTsKLQkJCQlkb2N1bWVudC5pbnNlcnRCZWZvcmUobmV3RG9jdHlwZSwgZG9jdHlwZSk7Ci0JCQkJZG9jdW1lbnQucmVtb3ZlQ2hpbGQoZG9jdHlwZSk7Ci0JCQkJLy8gbWFuYWdlci5yZWZvcm1hdChuZXdEb2N0eXBlLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0RWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdEVsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiNTVmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0RWxlbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLkVkaXRFbGVtZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0RWxlbWVudEFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0VMRU1FTlQpOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIEVsZW1lbnQgZWxlbWVudDsKLQlwcm90ZWN0ZWQgaW50IGluc2VydGlvbkluZGV4ID0gLTE7Ci0JcHJvdGVjdGVkIEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlcjsKLQlwcm90ZWN0ZWQgTm9kZSBwYXJlbnQ7Ci0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQotCXB1YmxpYyBFZGl0RWxlbWVudEFjdGlvbihBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXIsIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGFjdGlvbkxhYmVsLCBTdHJpbmcgZGlhbG9nVGl0bGUpIHsKLQkJdGhpcyhtYW5hZ2VyLCBlbGVtZW50LmdldFBhcmVudE5vZGUoKSwgLTEsIGVsZW1lbnQsIGFjdGlvbkxhYmVsLCBkaWFsb2dUaXRsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRFbGVtZW50QWN0aW9uKEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlciwgTm9kZSBwYXJlbnQsIGludCBpbmRleCwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYWN0aW9uTGFiZWwsIFN0cmluZyB0aXRsZSkgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy5pbnNlcnRpb25JbmRleCA9IGluZGV4OwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXNldFRleHQoYWN0aW9uTGFiZWwpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIEVkaXRFbGVtZW50QWN0aW9uKEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlciwgTm9kZSBwYXJlbnQsIGludCBpbmRleCwgU3RyaW5nIGFjdGlvbkxhYmVsLCBTdHJpbmcgdGl0bGUpIHsKLQkJdGhpcyhtYW5hZ2VyLCBwYXJlbnQsIGluZGV4LCBudWxsLCBhY3Rpb25MYWJlbCwgdGl0bGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlTaGVsbCBzaGVsbCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJaWYgKHZhbGlkYXRlRWRpdChtYW5hZ2VyLmdldE1vZGVsKCksIHNoZWxsKSkgewotCQkJbWFuYWdlci5iZWdpbk5vZGVBY3Rpb24odGhpcyk7Ci0JCQlFZGl0RWxlbWVudERpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdEVsZW1lbnREaWFsb2coc2hlbGwsIGVsZW1lbnQpOwotCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0JCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUgPyAoRG9jdW1lbnQpIHBhcmVudCA6IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkvLyBoZXJlIHdlIG5lZWQgdG8gZG8gYSByZW5hbWUuLi4gd2hpY2ggc2VlbXMgdG8gYmUgcXVpdGUgaGFyZAotCQkJCQkvLyB0byBkbyA6LSgKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkgewotCQkJCQkJSURPTUVsZW1lbnQgZWxlbWVudEltcGwgPSAoSURPTUVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJCQlJRE9NTW9kZWwgbW9kZWwgPSBlbGVtZW50SW1wbC5nZXRNb2RlbCgpOwotCQkJCQkJU3RyaW5nIG9sZE5hbWUgPSBlbGVtZW50SW1wbC5nZXROb2RlTmFtZSgpOwotCQkJCQkJU3RyaW5nIG5ld05hbWUgPSBkaWFsb2cuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVsZW1lbnROYW1lKG1vZGVsLCBlbGVtZW50SW1wbC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCBvbGROYW1lLCBuZXdOYW1lKTsKLQkJCQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVsZW1lbnROYW1lKG1vZGVsLCBlbGVtZW50SW1wbC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUVsZW1lbnQgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZGlhbG9nLmdldEVsZW1lbnROYW1lKCkpOwotCQkJCQlOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJCWludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQkJCQlOb2RlIHJlZkNoaWxkID0gKGluc2VydGlvbkluZGV4IDwgbm9kZUxpc3RMZW5ndGgpICYmIChpbnNlcnRpb25JbmRleCA+PSAwKSA/IG5vZGVMaXN0Lml0ZW0oaW5zZXJ0aW9uSW5kZXgpIDogbnVsbDsKLQkJCQkJcGFyZW50Lmluc2VydEJlZm9yZShuZXdFbGVtZW50LCByZWZDaGlsZCk7Ci0JCQkJCW1hbmFnZXIucmVmb3JtYXQobmV3RWxlbWVudCwgZmFsc2UpOwotCQkJCQltYW5hZ2VyLnNldFZpZXdlclNlbGVjdGlvbihuZXdFbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQltYW5hZ2VyLmVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbGVtZW50TmFtZShJRE9NTW9kZWwgbW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHN0cmluZyA9IGZsYXROb2RlLmdldFRleHQoKTsKLQkJCWludCBpbmRleCA9IHN0cmluZy5pbmRleE9mKG9sZE5hbWUpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJaW5kZXggKz0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJCQltb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBpbmRleCwgb2xkTmFtZS5sZW5ndGgoKSwgbmV3TmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NzhjZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLkVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci0KLS8qKgotICogRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCXByb3RlY3RlZCBOb2RlIGNoaWxkUmVmOwotCXByb3RlY3RlZCBBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXI7Ci0JcHJvdGVjdGVkIE5vZGUgcGFyZW50OwotCXByb3RlY3RlZCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGk7Ci0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byBhZGQgYSBuZXcgUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0JICovCi0JcHVibGljIEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24oQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBtYW5hZ2VyLCBOb2RlIHBhcmVudCwgTm9kZSBjaGlsZFJlZiwgU3RyaW5nIGFjdGlvbkxhYmVsLCBTdHJpbmcgdGl0bGUpIHsKLQkJc2V0VGV4dChhY3Rpb25MYWJlbCk7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLmNoaWxkUmVmID0gY2hpbGRSZWY7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gZWRpdCBhIFByb2Nlc3NpbmdJbnN0cnVjdGlvbgotCSAqLwotCXB1YmxpYyBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uKEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlciwgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpLCBTdHJpbmcgYWN0aW9uTGFiZWwsIFN0cmluZyB0aXRsZSkgewotCQlzZXRUZXh0KGFjdGlvbkxhYmVsKTsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJdGhpcy5waSA9IHBpOwotCQl0aGlzLnBhcmVudCA9IHBpLmdldFBhcmVudE5vZGUoKTsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlTaGVsbCBzaGVsbCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJaWYgKHZhbGlkYXRlRWRpdChtYW5hZ2VyLmdldE1vZGVsKCksIHNoZWxsKSkgewotCQkJbWFuYWdlci5iZWdpbk5vZGVBY3Rpb24odGhpcyk7Ci0JCQkKLQkKLQkJCUVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EaWFsb2cgZGlhbG9nID0gbnVsbDsKLQkJCWlmIChwaSAhPSBudWxsKSB7Ci0JCQkJZGlhbG9nID0gbmV3IEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EaWFsb2coc2hlbGwsIHBpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWRpYWxvZyA9IG5ldyBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uRGlhbG9nKHNoZWxsLCBYTUxVSU1lc3NhZ2VzLl9VSV9QSV9UQVJHRVRfVkFMVUUsIFhNTFVJTWVzc2FnZXMuX1VJX1BJX0RBVEFfVkFMVUUpOwotCQkJfQotCQotCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0JCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJaWYgKHBpICE9IG51bGwpIHsKLQkJCQkJY2hpbGRSZWYgPSBwaTsKLQkJCQl9Ci0JCi0JCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUgPyAoRG9jdW1lbnQpIHBhcmVudCA6IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJTm9kZSBuZXdOb2RlID0gZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKGRpYWxvZy5nZXRUYXJnZXQoKSwgZGlhbG9nLmdldERhdGEoKSk7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShuZXdOb2RlLCBjaGlsZFJlZik7Ci0JCi0JCQkJaWYgKHBpICE9IG51bGwpIHsKLQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKHBpKTsKLQkJCQl9Ci0JCi0JCQkJbWFuYWdlci5yZWZvcm1hdChuZXdOb2RlLCBmYWxzZSk7Ci0JCQkJbWFuYWdlci5zZXRWaWV3ZXJTZWxlY3Rpb24obmV3Tm9kZSk7Ci0JCQl9Ci0JCQltYW5hZ2VyLmVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0U2NoZW1hSW5mb0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdFNjaGVtYUluZm9BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3NTU3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0U2NoZW1hSW5mb0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSW5mb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLkVkaXRTY2hlbWFJbmZvRGlhbG9nOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBFZGl0RG9jdHlwZUFjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRWRpdFNjaGVtYUluZm9BY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uIHsKLQlwcm90ZWN0ZWQgQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBtYW5hZ2VyOwotCXByb3RlY3RlZCBET01OYW1lc3BhY2VJbmZvTWFuYWdlciBuYW1lc3BhY2VJbmZvTWFuYWdlciA9IG5ldyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcigpOwotCXByb3RlY3RlZCBOb2RlIG5vZGU7Ci0JcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uOwotCXByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0KLQlwdWJsaWMgRWRpdFNjaGVtYUluZm9BY3Rpb24oQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBtYW5hZ2VyLCBOb2RlIG5vZGUsIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgdGl0bGUpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJdGhpcy5ub2RlID0gbm9kZTsKLQkJc2V0VGV4dCh0aXRsZSk7Ci0JCXRoaXMucmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGNyZWF0ZVByZWZpeE1hcHBpbmcoTGlzdCBvbGRMaXN0LCBMaXN0IG5ld0xpc3QpIHsKLQkJTWFwIG1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQotCQlIYXNodGFibGUgb2xkVVJJVG9QcmVmaXhUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gb2xkTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU5hbWVzcGFjZUluZm8gb2xkSW5mbyA9IChOYW1lc3BhY2VJbmZvKSBpLm5leHQoKTsKLQkJCW9sZFVSSVRvUHJlZml4VGFibGUucHV0KG9sZEluZm8udXJpLCBvbGRJbmZvKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaSA9IG5ld0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOYW1lc3BhY2VJbmZvIG5ld0luZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQlOYW1lc3BhY2VJbmZvIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbykgb2xkVVJJVG9QcmVmaXhUYWJsZS5nZXQobmV3SW5mby51cmkgIT0gbnVsbCA/IG5ld0luZm8udXJpIDogIiIpOyAvLyROT04tTkxTLTEkCi0KLQotCQkJLy8gaWYgb2xkSW5mbyBpcyBub24gbnVsbCAuLi4gdGhlcmUncyBhIG1hdGNoaW5nIFVSSSBpbiB0aGUgb2xkCi0JCQkvLyBzZXQKLQkJCS8vIHdlIGNhbiB1c2UgaXRzIHByZWZpeCB0byBkZXRlbWluZSBvdXQgbWFwcGluZwotCQkJLy8KLQkJCS8vIGlmIG9sZEluZm8gaXMgbnVsbCAuLi4gd2UgdXNlIHRoZSAnb2xkQ29weScgd2Ugc3Rhc2hlZCBhd2F5Ci0JCQkvLyBhc3N1bWluZyB0aGF0IHRoZSB1c2VyIGNoYW5nZWQgdGhlIFVSSSBhbmQgdGhlIHByZWZpeAotCQkJaWYgKG9sZEluZm8gPT0gbnVsbCkgewotCQkJCW9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbykgbmV3SW5mby5nZXRQcm9wZXJ0eSgib2xkQ29weSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmIChvbGRJbmZvICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmV3UHJlZml4ID0gbmV3SW5mby5wcmVmaXggIT0gbnVsbCA/IG5ld0luZm8ucHJlZml4IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgb2xkUHJlZml4ID0gb2xkSW5mby5wcmVmaXggIT0gbnVsbCA/IG9sZEluZm8ucHJlZml4IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIW9sZFByZWZpeC5lcXVhbHMobmV3UHJlZml4KSkgewotCQkJCQltYXAucHV0KG9sZFByZWZpeCwgbmV3UHJlZml4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KE5vZGUgbm9kZSkgewotCQlFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCXJlc3VsdCA9IChFbGVtZW50KSBub2RlOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCXJlc3VsdCA9IGdldFJvb3RFbGVtZW50KChEb2N1bWVudCkgbm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBFbGVtZW50IGdldFJvb3RFbGVtZW50KERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUVsZW1lbnQgcm9vdEVsZW1lbnQgPSBudWxsOwotCQlOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3RMZW5ndGg7IGkrKykgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotCQkJaWYgKGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJcm9vdEVsZW1lbnQgPSAoRWxlbWVudCkgY2hpbGROb2RlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByb290RWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJU2hlbGwgc2hlbGwgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCWlmICh2YWxpZGF0ZUVkaXQobWFuYWdlci5nZXRNb2RlbCgpLCBzaGVsbCkpIHsKLQkJCW1hbmFnZXIuYmVnaW5Ob2RlQWN0aW9uKHRoaXMpOwotCQotCQkJLy8gdG9kby4uLiBjaGFuZ2UgY29uc3RydWN0b3IgdG8gdGFrZSBhbiBlbGVtZW50Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KG5vZGUpOwotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCUVkaXRTY2hlbWFJbmZvRGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0U2NoZW1hSW5mb0RpYWxvZyhzaGVsbCwgbmV3IFBhdGgocmVzb3VyY2VMb2NhdGlvbikpOwotCQotCQkJCUxpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvTWFuYWdlci5nZXROYW1lc3BhY2VJbmZvTGlzdChlbGVtZW50KTsKLQkJCQlMaXN0IG9sZE5hbWVzcGFjZUluZm9MaXN0ID0gTmFtZXNwYWNlSW5mby5jbG9uZU5hbWVzcGFjZUluZm9MaXN0KG5hbWVzcGFjZUluZm9MaXN0KTsKLQkKLQkJCQkvLyBoZXJlIHdlIHN0b3JlIGEgY29weSBvZiB0aGUgb2xkIGluZm8gZm9yIGVhY2ggTmFtZXNwYWNlSW5mbwotCQkJCS8vIHRoaXMgaW5mbyB3aWxsIGJlIHVzZWQgaW4gY3JlYXRlUHJlZml4TWFwcGluZygpIHRvIGZpZ3VyZSBvdXQKLQkJCQkvLyBob3cgdG8gdXBkYXRlIHRoZSBkb2N1bWVudAotCQkJCS8vIGluIHJlc3BvbnNlIHRvIHRoZXNlIGNoYW5nZXMKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBuYW1lc3BhY2VJbmZvTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJCQlOYW1lc3BhY2VJbmZvIG9sZENvcHkgPSBuZXcgTmFtZXNwYWNlSW5mbyhpbmZvKTsKLQkJCQkJaW5mby5zZXRQcm9wZXJ0eSgib2xkQ29weSIsIG9sZENvcHkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQotCQkJCWRpYWxvZy5zZXROYW1lc3BhY2VJbmZvTGlzdChuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJCS8vIGRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoNTAwLCAzMDApOwotCQkJCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9FRElUX1NDSEVNQV9JTkZPUk1BVElPTl9USVRMRSk7Ci0JCQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCi0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJCUxpc3QgbmV3SW5mb0xpc3QgPSBkaWFsb2cuZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKTsKLQkJCQkJbmFtZXNwYWNlSW5mb01hbmFnZXIucmVtb3ZlTmFtZXNwYWNlSW5mbyhlbGVtZW50KTsKLQkJCQkJbmFtZXNwYWNlSW5mb01hbmFnZXIuYWRkTmFtZXNwYWNlSW5mbyhlbGVtZW50LCBuZXdJbmZvTGlzdCwgZmFsc2UpOwotCQotCQkJCQkvLyBzZWUgaWYgd2UgbmVlZCB0byByZW5hbWUgYW55IHByZWZpeGVzCi0JCQkJCU1hcCBwcmVmaXhNYXBwaW5nID0gY3JlYXRlUHJlZml4TWFwcGluZyhvbGROYW1lc3BhY2VJbmZvTGlzdCwgbmFtZXNwYWNlSW5mb0xpc3QpOwotCQkJCQlpZiAocHJlZml4TWFwcGluZy5zaXplKCkgPiAwKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW1hbmFnZXIuZ2V0TW9kZWwoKS5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCQkJCQlSZXBsYWNlUHJlZml4QWN0aW9uIHJlcGxhY2VQcmVmaXhBY3Rpb24gPSBuZXcgUmVwbGFjZVByZWZpeEFjdGlvbihtYW5hZ2VyLCBlbGVtZW50LCBwcmVmaXhNYXBwaW5nKTsKLQkJCQkJCQlyZXBsYWNlUHJlZml4QWN0aW9uLnJ1bigpOwotCQkJCQkJfQotCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJbWFuYWdlci5nZXRNb2RlbCgpLmNoYW5nZWRNb2RlbCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJbWFuYWdlci5lbmROb2RlQWN0aW9uKHRoaXMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvR29Ub01hdGNoaW5nVGFnQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Hb1RvTWF0Y2hpbmdUYWdBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3ZTdhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Hb1RvTWF0Y2hpbmdUYWdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZXh0RWRpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgZW5kIHRhZyBpZiBpdCBpcyBpbiBhIHN0YXJ0IHRhZywgYW5kIHZpY2UgdmVyc2EuCi0gKiBBbHNvIHVwZGF0ZXMgdGhlIG1hdGNoaW5nIHRhZyBhbm5vdGF0aW9uIGluIHRoZSBhY3RpdmUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIG5pdGluCi0gKiAKLSAqLwotY2xhc3MgR29Ub01hdGNoaW5nVGFnQWN0aW9uIGV4dGVuZHMgVGV4dEVkaXRvckFjdGlvbiB7Ci0KLQlwcml2YXRlIGNsYXNzIFVwZGF0ZUxpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQl1cGRhdGVGb3IoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05fVFlQRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnVpLm1hdGNoaW5nLnRhZyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZlVwZGF0ZUxpc3RlbmVyID0gbnVsbDsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0JLyoqCi0JICogQHBhcmFtIGJ1bmRsZQotCSAqIEBwYXJhbSBwcmVmaXgKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JR29Ub01hdGNoaW5nVGFnQWN0aW9uKFJlc291cmNlQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIHByZWZpeCwgSVRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGJ1bmRsZSwgcHJlZml4LCBlZGl0b3IpOwotCQlmVXBkYXRlTGlzdGVuZXIgPSBuZXcgVXBkYXRlTGlzdGVuZXIoKTsKLQl9Ci0KLQl2b2lkIHJlbW92ZUFubm90YXRpb24oYm9vbGVhbiBhbGxNYXRjaGluZykgewotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gZ2V0VGV4dEVkaXRvcigpOwotCQlpZiAodGV4dEVkaXRvciA9PSBudWxsKSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vIGVkaXRvciIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSURvY3VtZW50UHJvdmlkZXIgZG9jdW1lbnRQcm92aWRlciA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQlpZiAoZG9jdW1lbnRQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vIGRvY3VtZW50IHByb3ZpZGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlJQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCA9IGRvY3VtZW50UHJvdmlkZXIuZ2V0QW5ub3RhdGlvbk1vZGVsKHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCWlmIChhbm5vdGF0aW9uTW9kZWwgPT0gbnVsbCkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJubyBhbm5vdGF0aW9uIG1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCUl0ZXJhdG9yIGFubm90YXRpb25JdGVyYXRvciA9IGFubm90YXRpb25Nb2RlbC5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoKTsKLQkJTGlzdCBvbGRBbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGFubm90YXRpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKSBhbm5vdGF0aW9uSXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKEFOTk9UQVRJT05fVFlQRS5lcXVhbHMoYW5ub3RhdGlvbi5nZXRUeXBlKCkpKSB7Ci0JCQkJYW5ub3RhdGlvbi5tYXJrRGVsZXRlZCh0cnVlKTsKLQkJCQkvKioKLQkJCQkgKiBTb21ldGltZXMgaXQgaXMgc3VwcG9ydGVkLCBzb21ldGltZSdzIGl0IGlzIG5vdC4gQ29uZnVzaW5nLgotCQkJCSAqLwotCQkJCXRyeSB7Ci0JCQkJCWFubm90YXRpb25JdGVyYXRvci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJb2xkQW5ub3RhdGlvbnMuYWRkKGFubm90YXRpb24pOwotCQkJCX0KLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZW1vdmVkICIgKyBhbm5vdGF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoIWFsbE1hdGNoaW5nKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoIW9sZEFubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJaW50IHNpemUgPSBvbGRBbm5vdGF0aW9ucy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWFubm90YXRpb25Nb2RlbC5yZW1vdmVBbm5vdGF0aW9uKChBbm5vdGF0aW9uKSBvbGRBbm5vdGF0aW9ucy5nZXQoaSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bldpdGhFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIucnVuV2l0aEV2ZW50KGV2ZW50KTsKLQkJaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCWludCBvZmZzZXQgPSAoKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldE9mZnNldCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWF0Y2hSZWdpb24gPSBudWxsOwotCQkJCWlmICgoKE5vZGUpIG8pLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCQlvID0gKChBdHRyKSBvKS5nZXRPd25lckVsZW1lbnQoKTsKLQkJCQl9Ci0KLQkJCQlpbnQgdGFyZ2V0T2Zmc2V0ID0gLTE7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBvOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQkJCQltYXRjaFJlZ2lvbiA9ICgoSURPTU5vZGUpIG8pLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQkJaWYgKG1hdGNoUmVnaW9uICE9IG51bGwpCi0JCQkJCQkJdGFyZ2V0T2Zmc2V0ID0gbWF0Y2hSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSArIDI7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCQkJCQltYXRjaFJlZ2lvbiA9ICgoSURPTU5vZGUpIG8pLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQkJaWYgKG1hdGNoUmVnaW9uICE9IG51bGwpCi0JCQkJCQkJCXRhcmdldE9mZnNldCA9IG1hdGNoUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgKyAxOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHRhcmdldE9mZnNldCA+PSAwKSB7Ci0JCQkJCWdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihuZXcgVGV4dFNlbGVjdGlvbih0YXJnZXRPZmZzZXQsIDApKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGV4dEVkaXRvckFjdGlvbiNzZXRFZGl0b3Iob3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0b3IoSVRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBnZXRUZXh0RWRpdG9yKCk7Ci0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCXJlbW92ZUFubm90YXRpb24odHJ1ZSk7Ci0KLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCWlmIChzZWxlY3Rpb25Qcm92aWRlciBpbnN0YW5jZW9mIElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIHsKLQkJCQkoKElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIHNlbGVjdGlvblByb3ZpZGVyKS5yZW1vdmVQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZVcGRhdGVMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuc2V0RWRpdG9yKGVkaXRvcik7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgaW5zdGFuY2VvZiBJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSB7Ci0JCQkJKChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSBzZWxlY3Rpb25Qcm92aWRlcikuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmVXBkYXRlTGlzdGVuZXIpOwotCQkJfQotCi0JCQl1cGRhdGVGb3Ioc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzZXRFbmFibGVkKHRydWUpOwotCi0JfQotCi0Jdm9pZCB1cGRhdGVGb3IoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IGdldFRleHRFZGl0b3IoKTsKLQkJaWYgKHRleHRFZGl0b3IgPT0gbnVsbCkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJubyBlZGl0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCUlEb2N1bWVudFByb3ZpZGVyIGRvY3VtZW50UHJvdmlkZXIgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJaWYgKGRvY3VtZW50UHJvdmlkZXIgPT0gbnVsbCkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJubyBkb2N1bWVudCBwcm92aWRlciIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUFubm90YXRpb25Nb2RlbCBhbm5vdGF0aW9uTW9kZWwgPSBkb2N1bWVudFByb3ZpZGVyLmdldEFubm90YXRpb25Nb2RlbCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQlpZiAoYW5ub3RhdGlvbk1vZGVsID09IG51bGwgfHwgIShhbm5vdGF0aW9uTW9kZWwgaW5zdGFuY2VvZiBJQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uKSkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJubyBhbm5vdGF0aW9uIG1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3Qgb2xkQW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KDIpOwotCQlJdGVyYXRvciBhbm5vdGF0aW9uSXRlcmF0b3IgPSBhbm5vdGF0aW9uTW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChhbm5vdGF0aW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQW5ub3RhdGlvbikgYW5ub3RhdGlvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChBTk5PVEFUSU9OX1RZUEUuZXF1YWxzKGFubm90YXRpb24uZ2V0VHlwZSgpKSkgewotCQkJCWFubm90YXRpb24ubWFya0RlbGV0ZWQodHJ1ZSk7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVtb3ZpbmcgIiArIGFubm90YXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCW9sZEFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uKTsKLQkJCX0KLQkJfQotCi0JCU1hcCBuZXdBbm5vdGF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCWludCBvZmZzZXQgPSAoKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldE9mZnNldCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWF0Y2hSZWdpb24gPSBudWxsOwotCQkJCWlmICgoKE5vZGUpIG8pLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCQlvID0gKChBdHRyKSBvKS5nZXRPd25lckVsZW1lbnQoKTsKLQkJCQl9Ci0KLQkJCQlQb3NpdGlvbiBwU3RhcnQgPSBudWxsOwotCQkJCVBvc2l0aW9uIHBFbmQgPSBudWxsOwotCQkJCVN0cmluZyB0YWcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChvIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgbzsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldE51bWJlck9mUmVnaW9ucygpID4gMSkgewotCQkJCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJCQkJCXBTdGFydCA9IG5ldyBQb3NpdGlvbihzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgbmFtZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQkJCXRhZyA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQobmFtZVJlZ2lvbik7Ci0JCQkJCQl9Ci0JCQkJCQltYXRjaFJlZ2lvbiA9ICgoSURPTU5vZGUpIG8pLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQkJaWYgKG1hdGNoUmVnaW9uICE9IG51bGwgJiYgbWF0Y2hSZWdpb24uZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiAxKSB7Ci0JCQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG1hdGNoUmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJCQkJcEVuZCA9IG5ldyBQb3NpdGlvbihtYXRjaFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgbmFtZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsICYmIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQkJCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDEpIHsKLQkJCQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJCQkJCQlwRW5kID0gbmV3IFBvc2l0aW9uKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgbmFtZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQkJCQl0YWcgPSBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChuYW1lUmVnaW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbWF0Y2hSZWdpb24gPSAoKElET01Ob2RlKSBvKS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQkJCWlmIChtYXRjaFJlZ2lvbiAhPSBudWxsICYmIG1hdGNoUmVnaW9uLmdldE51bWJlck9mUmVnaW9ucygpID4gMSkgewotCQkJCQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gbWF0Y2hSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCQkJCQkJcFN0YXJ0ID0gbmV3IFBvc2l0aW9uKG1hdGNoUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pLCBuYW1lUmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChwU3RhcnQgIT0gbnVsbCAmJiBwRW5kICE9IG51bGwpIHsKLQkJCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb24oQU5OT1RBVElPTl9UWVBFLCBmYWxzZSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5nb3RvTWF0Y2hpbmdUYWdfc3RhcnQsIHRhZykpOwotCQkJCQluZXdBbm5vdGF0aW9ucy5wdXQoYW5ub3RhdGlvbiwgcFN0YXJ0KTsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyAiICsgYW5ub3RhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlhbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb24oQU5OT1RBVElPTl9UWVBFLCBmYWxzZSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5nb3RvTWF0Y2hpbmdUYWdfZW5kLCB0YWcpKTsKLQkJCQkJbmV3QW5ub3RhdGlvbnMucHV0KGFubm90YXRpb24sIHBFbmQpOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkaW5nICIgKyBhbm5vdGF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCSgoSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbikgYW5ub3RhdGlvbk1vZGVsKS5yZXBsYWNlQW5ub3RhdGlvbnMoKEFubm90YXRpb25bXSkgb2xkQW5ub3RhdGlvbnMudG9BcnJheShuZXcgQW5ub3RhdGlvbltvbGRBbm5vdGF0aW9ucy5zaXplKCldKSwgbmV3QW5ub3RhdGlvbnMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL01lbnVCdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9NZW51QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGYzY2ViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL01lbnVCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBNZW51QnVpbGRlciB7Ci0KLQotCXByb3RlY3RlZCBDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZ2V0U29ydEtleShvMSksIGdldFNvcnRLZXkobzIpKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0U29ydEtleShPYmplY3QgbykgewotCQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobyBpbnN0YW5jZW9mIElBY3Rpb24pIHsKLQkJCQlJQWN0aW9uIGFjdGlvbiA9IChJQWN0aW9uKSBvOwotCQkJCXJlc3VsdCA9IGFjdGlvbi5nZXRUZXh0KCk7Ci0JCQl9Ci0JCQkvLyBlbHNlIGlmIChvIGluc3RhbmNlb2YgTWVudURhdGEpCi0JCQkvLyB7Ci0JCQkvLyByZXN1bHQgPSAieiIgKyAoKE1lbnVEYXRhKW8pLm5hbWU7Ci0JCQkvLyB9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfTsKLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWxwaGViZXRpY2FsR3JvdXBpbmcoSU1lbnVNYW5hZ2VyIG1lbnUsIExpc3QgYWN0aW9uTGlzdCkgewotCQlPYmplY3RbXSBhcnJheSA9IGFjdGlvbkxpc3QudG9BcnJheSgpOwotCQlpZiAoYXJyYXkubGVuZ3RoID4gMCkgewotCQkJQXJyYXlzLnNvcnQoYXJyYXksIGNvbXBhcmF0b3IpOwotCQl9Ci0KLQkJaW50IGdyb3VwU2l6ZSA9IDE1OwotCQlpbnQgbWluR3JvdXBTaXplID0gNTsKLQkJaW50IG51bWJlck9mR3JvdXBzID0gKGFycmF5Lmxlbmd0aCAvIGdyb3VwU2l6ZSkgKyAoKGFycmF5Lmxlbmd0aCAlIGdyb3VwU2l6ZSA+IG1pbkdyb3VwU2l6ZSkgPyAxIDogMCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZkdyb3VwczsgaSsrKSB7Ci0JCQlib29sZWFuIGlzTGFzdEdyb3VwID0gKGkgPT0gKG51bWJlck9mR3JvdXBzIC0gMSkpOwotCQkJaW50IGZpcnN0SW5kZXggPSBpICogZ3JvdXBTaXplOwotCQkJaW50IGxhc3RJbmRleCA9IGlzTGFzdEdyb3VwID8gYXJyYXkubGVuZ3RoIC0gMSA6IGkgKiBncm91cFNpemUgKyBncm91cFNpemUgLSAxOwotCQkJQWN0aW9uIGZpcnN0QWN0aW9uID0gKEFjdGlvbikgYXJyYXlbZmlyc3RJbmRleF07Ci0JCQlBY3Rpb24gbGFzdEFjdGlvbiA9IChBY3Rpb24pIGFycmF5W2xhc3RJbmRleF07Ci0JCQlNZW51TWFuYWdlciBzdWJtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKGZpcnN0QWN0aW9uLmdldFRleHQoKSArICIgLSAiICsgbGFzdEFjdGlvbi5nZXRUZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCQltZW51LmFkZChzdWJtZW51KTsKLQkJCWZvciAoaW50IGogPSBmaXJzdEluZGV4OyBqIDw9IGxhc3RJbmRleDsgaisrKSB7Ci0JCQkJc3VibWVudS5hZGQoKEFjdGlvbikgYXJyYXlbal0pOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZU1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUsIExpc3QgYWN0aW9uTGlzdCwgYm9vbGVhbiBjcmVhdGVUaWVyZWQpIHsKLQkJLy8gc29ydCB0aGUgYWN0aW9ucwotCQlpZiAoYWN0aW9uTGlzdC5zaXplKCkgPCAyNSkgewotCQkJT2JqZWN0W10gYXJyYXkgPSBhY3Rpb25MaXN0LnRvQXJyYXkoKTsKLQkJCWlmIChhcnJheS5sZW5ndGggPiAwKSB7Ci0JCQkJQXJyYXlzLnNvcnQoYXJyYXksIGNvbXBhcmF0b3IpOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJCW1lbnUuYWRkKChBY3Rpb24pIGFycmF5W2ldKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWNyZWF0ZUFscGhlYmV0aWNhbEdyb3VwaW5nKG1lbnUsIGFjdGlvbkxpc3QpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9wZXJ0eUdyb3VwaW5nKElNZW51TWFuYWdlciBtZW51LCBMaXN0Ci0JICogYWN0aW9uTGlzdCkgeyBNZW51RGF0YVRhYmxlIG1lbnVEYXRhVGFibGUgPSBuZXcgTWVudURhdGFUYWJsZSgpOwotCSAqIAotCSAqIGZvciAoSXRlcmF0b3IgaSA9IGFjdGlvbkxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeyBTdHJpbmcKLQkgKiBncm91cE5hbWUgPSBudWxsOyBBY3Rpb24gYWN0aW9uID0gKEFjdGlvbilpLm5leHQoKTsgaWYgKGFjdGlvbgotCSAqIGluc3RhbmNlb2YgTm9kZUFjdGlvbikgeyBncm91cE5hbWUgPQotCSAqICgoTm9kZUFjdGlvbilhY3Rpb24pLmdldEdyb3VwTmFtZSgpOyB9IGlmIChncm91cE5hbWUgPT0gbnVsbCkgewotCSAqIGdyb3VwTmFtZSA9ICIiOyB9IE1lbnVEYXRhIG1lbnVEYXRhID0KLQkgKiBtZW51RGF0YVRhYmxlLmxvb2t1cE9yQ3JlYXRlKGdyb3VwTmFtZSwgIiIpOwotCSAqIG1lbnVEYXRhLmNoaWxkTGlzdC5hZGQoYWN0aW9uKTsgfSBwb3B1bGF0ZU1lbnUobWVudSwKLQkgKiBtZW51RGF0YVRhYmxlLmdldFJvb3QoKSk7IH0KLQkgKiAKLQkgKiAKLQkgKiBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU1lbnUoTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIE1lbnVEYXRhIG1lbnVEYXRhKSB7Ci0JICogZm9yIChJdGVyYXRvciBpID0gbWVudURhdGEuY2hpbGRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkgKiBPYmplY3QgbyA9IGkubmV4dCgpOyBpZiAobyBpbnN0YW5jZW9mIEFjdGlvbikgewotCSAqIG1lbnVNYW5hZ2VyLmFkZCgoQWN0aW9uKW8pOyB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBNZW51RGF0YSkgewotCSAqIE1lbnVEYXRhIGNoaWxkTWVudURhdGEgPSAoTWVudURhdGEpbzsgTWVudU1hbmFnZXIgY2hpbGRNZW51TWFuYWdlciA9Ci0JICogbmV3IE1lbnVNYW5hZ2VyKGNoaWxkTWVudURhdGEubmFtZSk7IG1lbnVNYW5hZ2VyLmFkZChjaGlsZE1lbnVNYW5hZ2VyKTsKLQkgKiBwb3B1bGF0ZU1lbnUoY2hpbGRNZW51TWFuYWdlciwgY2hpbGRNZW51RGF0YSk7IH0gfSB9Ci0JICogCi0JICogCi0JICogcHVibGljIE1lbnVEYXRhVGFibGUgeyBwcm90ZWN0ZWQgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCSAqIHByb3RlY3RlZCBNZW51RGF0YSByb290OwotCSAqIAotCSAqIHB1YmxpYyBNZW51RGF0YVRhYmxlKCkgeyByb290ID0gbG9va3VwT3JDcmVhdGVNZW51RGF0YShudWxsLCBudWxsKTsgfQotCSAqIAotCSAqIHByb3RlY3RlZCBNZW51RGF0YSBsb29rdXBNZW51RGF0YShTdHJpbmcgbmFtZSkgeyBTdHJpbmcga2V5ID0gbmFtZSAhPQotCSAqIG51bGwgPyBuYW1lIDogIiI7IHJldHVybiAoTWVudURhdGEpbWVudURhdGFUYWJsZS5nZXQoa2V5KTsgfQotCSAqIAotCSAqIHByb3RlY3RlZCBNZW51RGF0YSBsb29rdXBPckNyZWF0ZU1lbnVEYXRhKFN0cmluZyBuYW1lLCBTdHJpbmcKLQkgKiBwYXJlbnROYW1lKSB7IFN0cmluZyBrZXkgPSBuYW1lICE9IG51bGwgPyBuYW1lIDogIiI7IE1lbnVEYXRhIG1lbnVEYXRhID0KLQkgKiAoTWVudURhdGEpbWVudURhdGFUYWJsZS5nZXQoa2V5KTsgaWYgKG1lbnVEYXRhID09IG51bGwpIHsgbWVudURhdGEgPQotCSAqIG5ldyBNZW51RGF0YShuYW1lLCBwYXJlbnROYW1lKTsgbWVudURhdGFUYWJsZS5wdXQoa2V5LCBtZW51RGF0YSk7IH0KLQkgKiByZXR1cm4gbWVudURhdGE7IH0KLQkgKiAKLQkgKiBwdWJsaWMgTWVudURhdGEgZ2V0Um9vdCgpIHsgcmV0dXJuIHJvb3Q7IH0gfQotCSAqIAotCSAqIAotCSAqIHByb3RlY3RlZCBjbGFzcyBNZW51RGF0YSB7IHB1YmxpYyBTdHJpbmcgbmFtZTsgcHVibGljIFN0cmluZwotCSAqIHBhcmVudE5hbWU7IHB1YmxpYyBMaXN0IGNoaWxkTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkgKiAKLQkgKiBNZW51RGF0YShTdHJpbmcgbmFtZSwgU3RyaW5nIHBhcmVudE5hbWUpIHsgdGhpcy5uYW1lID0gbmFtZTsKLQkgKiB0aGlzLnBhcmVudE5hbWUgPSBwYXJlbnROYW1lOyB9Ci0JICogCi0JICogcHJvdGVjdGVkIHZvaWQgc29ydCgpIHsgT2JqZWN0W10gYXJyYXkgPSBjaGlsZExpc3QudG9BcnJheSgpOyBpZgotCSAqIChhcnJheS5sZW5ndGggPiAwICkgeyBBcnJheXMuc29ydChhcnJheSwgY29tcGFyYXRvcik7IH0gY2hpbGRMaXN0ID0KLQkgKiBBcnJheXMuYXNMaXN0KGFycmF5KTsKLQkgKiAKLQkgKiBmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeyBPYmplY3QgbyA9Ci0JICogaS5uZXh0KCk7IGlmIChvIGluc3RhbmNlb2YgTWVudURhdGEpIHsgKChNZW51RGF0YSlvKS5zb3J0KCk7IH0gfSB9IH0KLQkgKi8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL05vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL05vZGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlNzY0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Ob2RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNvcnRLZXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0aGF0IHRoZSByZXNvdXJjZSBiYWNraW5nIHRoZSBtb2RlbCBpcyB3cml0ZWFibGUgdXRpbGl6aW5nIDxjb2RlPnZhbGlkYXRlRWRpdDwvY29kZT4KLQkgKiBvbiBhIGdpdmVuIDx0dD5JV29ya3NwYWNlPC90dD4uCi0JICogCi0JICogQHBhcmFtIG1vZGVsIHRoZSBtb2RlbCB0byBiZSBjaGVja2VkCi0JICogQHBhcmFtIGNvbnRleHQgdGhlIHNoZWxsIGNvbnRleHQgZm9yIHdoaWNoIDxjb2RlPnZhbGlkYXRlRWRpdDwvY29kZT4gd2lsbCBiZSBydW4KLQkgKiBAcmV0dXJuIGJvb2xlYW4gcmVzdWx0IG9mIGNoZWNraW5nIDxjb2RlPnZhbGlkYXRlRWRpdDwvY29kZT4uIElmIHRoZSByZXNvdXJjZSBpcyB1bndyaXRlYWJsZSwgPGNvZGU+c3RhdHVzLmlzT0soKTwvY29kZT4KLQkgKiB3aWxsIHJldHVybiB0cnVlOyBvdGhlcndpc2UsIGZhbHNlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHZhbGlkYXRlRWRpdChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBTaGVsbCBjb250ZXh0KSB7Ci0JCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldEJhc2VMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpKTsKLQkJCXJldHVybiAhZmlsZS5pc0FjY2Vzc2libGUoKSB8fCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KG5ldyBJRmlsZVtdIHtmaWxlfSwgY29udGV4dCkuaXNPSygpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvUmVtb3ZlQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczZTVmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Db21tZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLS8qKgotICogUmVtb3ZlIGJsb2NrIGNvbW1lbnQgYWN0aW9uIGRlbGVnYXRlIGZvciBYTUwgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSBleHRlbmRzIEFic3RyYWN0Q29tbWVudEFjdGlvblhNTERlbGVnYXRlIHsKLQotCXZvaWQgcHJvY2Vzc0FjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJbmRleGVkUmVnaW9uIHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0KLQkJCQlpZiAoKHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiA9PSBudWxsKSB8fCAoc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiA9PSBudWxsKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaW50IG9wZW5Db21tZW50T2Zmc2V0ID0gc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGNsb3NlQ29tbWVudE9mZnNldCA9IHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBPUEVOX0NPTU1FTlQubGVuZ3RoKCkgLSBDTE9TRV9DT01NRU5ULmxlbmd0aCgpOwotCi0JCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgWE1MVUlNZXNzYWdlcy5SZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcCk7Ci0JCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQl0cnkgewotCQkJCQlpZiAodGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgQ29tbWVudEltcGwpIHsKLQkJCQkJCQlkb2N1bWVudC5yZXBsYWNlKG9wZW5Db21tZW50T2Zmc2V0LCBPUEVOX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWRvY3VtZW50LnJlcGxhY2UoY2xvc2VDb21tZW50T2Zmc2V0LCBDTE9TRV9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBDb21tZW50SW1wbCkgewotCQkJCQkJCWRvY3VtZW50LnJlcGxhY2Uob3BlbkNvbW1lbnRPZmZzZXQsIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0KLQkJCQkJCWlmIChzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgQ29tbWVudEltcGwpIHsKLQkJCQkJCQlkb2N1bWVudC5yZXBsYWNlKGNsb3NlQ29tbWVudE9mZnNldCwgQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmVtb3ZlT3BlbkNsb3NlQ29tbWVudHMoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0ICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCBjbG9zZUNvbW1lbnRPZmZzZXQgLSBvcGVuQ29tbWVudE9mZnNldCAtIENMT1NFX0NPTU1FTlQubGVuZ3RoKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLlJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihYTUxVSU1lc3NhZ2VzLlJlbW92ZUJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZXBsYWNlUHJlZml4QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZXBsYWNlUHJlZml4QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NTk5YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvUmVwbGFjZVByZWZpeEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZXBsYWNlUHJlZml4QWN0aW9uIGV4dGVuZHMgTm9kZUFjdGlvbiB7Ci0KLQljbGFzcyBOb2RlQ29sbGVjdGluZ0RPTVZpc2l0b3IgZXh0ZW5kcyBET01WaXNpdG9yIHsKLQkJcHVibGljIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ByZWZpeENoYW5nZWROZWVkZWQoTm9kZSBub2RlKSB7Ci0JCQlTdHJpbmcga2V5ID0gbm9kZS5nZXRQcmVmaXgoKSAhPSBudWxsID8gbm9kZS5nZXRQcmVmaXgoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcHJlZml4TWFwcGluZy5nZXQoa2V5KSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdmlzaXRBdHRyKEF0dHIgYXR0cikgewotCQkJLyoKLQkJCSAqIGlmIChpc1ByZWZpeENoYW5nZWROZWVkZWQoZWxlbWVudCkpIHsgbGlzdC5hZGQoYXR0cik7IH0KLQkJCSAqLwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQkJc3VwZXIudmlzaXRFbGVtZW50KGVsZW1lbnQpOwotCQkJaWYgKGlzUHJlZml4Q2hhbmdlZE5lZWRlZChlbGVtZW50KSkgewotCQkJCWxpc3QuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yOwotCXByb3RlY3RlZCBFbGVtZW50IGVsZW1lbnQ7Ci0JcHJvdGVjdGVkIEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlcjsKLQlwcm90ZWN0ZWQgTWFwIHByZWZpeE1hcHBpbmc7Ci0KLQlwdWJsaWMgUmVwbGFjZVByZWZpeEFjdGlvbihBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXIsIEVsZW1lbnQgZWxlbWVudCwgTWFwIHByZWZpeE1hcHBpbmcpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5wcmVmaXhNYXBwaW5nID0gcHJlZml4TWFwcGluZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlTaGVsbCBzaGVsbCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJaWYgKHZhbGlkYXRlRWRpdChtYW5hZ2VyLmdldE1vZGVsKCksIHNoZWxsKSkgewotCQkJTm9kZUNvbGxlY3RpbmdET01WaXNpdG9yIHZpc2l0b3IgPSBuZXcgTm9kZUNvbGxlY3RpbmdET01WaXNpdG9yKCk7Ci0JCQl2aXNpdG9yLnZpc2l0Tm9kZShlbGVtZW50KTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHZpc2l0b3IubGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaS5uZXh0KCk7Ci0JCQkJU3RyaW5nIGtleSA9IG5vZGUuZ2V0UHJlZml4KCkgIT0gbnVsbCA/IG5vZGUuZ2V0UHJlZml4KCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBuZXdQcmVmaXggPSAoU3RyaW5nKSBwcmVmaXhNYXBwaW5nLmdldChrZXkpOwotCQkJCWlmIChuZXdQcmVmaXggIT0gbnVsbCkgewotCQkJCQlub2RlLnNldFByZWZpeChuZXdQcmVmaXgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL1NpYmxpbmdOYXZpZ2F0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TaWJsaW5nTmF2aWdhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDhiNDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL1NpYmxpbmdOYXZpZ2F0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGV4dEVkaXRvckFjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogUHJvdmlkZXMgbmF2aWdhdGlvbiB0byBuZXh0L3ByZXZpb3VzIERPTSBzaWJsaW5nIE5vZGVzCi0gKiAKLSAqIEBhdXRob3Igbml0aW4KLSAqIAotICovCi1jbGFzcyBTaWJsaW5nTmF2aWdhdGlvbkFjdGlvbiBleHRlbmRzIFRleHRFZGl0b3JBY3Rpb24gewotCi0JcHJpdmF0ZSBib29sZWFuIGZGb3J3YXJkOwotCi0JLyoqCi0JICogQHBhcmFtIGJ1bmRsZQotCSAqIEBwYXJhbSBwcmVmaXgKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICovCi0JU2libGluZ05hdmlnYXRpb25BY3Rpb24oUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBTdHJpbmcgcHJlZml4LCBJVGV4dEVkaXRvciBlZGl0b3IsIGJvb2xlYW4gZm9yd2FyZCkgewotCQlzdXBlcihidW5kbGUsIHByZWZpeCwgZWRpdG9yKTsKLQkJZkZvcndhcmQgPSBmb3J3YXJkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW5XaXRoRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLnJ1bldpdGhFdmVudChldmVudCk7Ci0JCWlmIChnZXRUZXh0RWRpdG9yKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCU5vZGUgc2libGluZyA9IG51bGw7Ci0KLQkJCQlpZiAoKChOb2RlKSBvKS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQkJbyA9ICgoQXR0cikgbykuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkJfQotCQkJCWlmIChmRm9yd2FyZCkgewotCQkJCQlzaWJsaW5nID0gKChOb2RlKSBvKS5nZXROZXh0U2libGluZygpOwotCQkJCQl3aGlsZSAoc2libGluZyAhPSBudWxsICYmIHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBzaWJsaW5nLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlzaWJsaW5nID0gc2libGluZy5nZXROZXh0U2libGluZygpOwotCQkJCQl9Ci0JCQkJCWlmIChzaWJsaW5nID09IG51bGwpIHsKLQkJCQkJCXNpYmxpbmcgPSAoKE5vZGUpIG8pLmdldFBhcmVudE5vZGUoKS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCQl3aGlsZSAoc2libGluZyAhPSBudWxsICYmIHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBzaWJsaW5nLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJc2libGluZyA9IHNpYmxpbmcuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2libGluZyA9ICgoTm9kZSkgbykuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJCXdoaWxlIChzaWJsaW5nICE9IG51bGwgJiYgc2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIHNpYmxpbmcuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXNpYmxpbmcgPSBzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCQl9Ci0JCQkJCWlmIChzaWJsaW5nID09IG51bGwpIHsKLQkJCQkJCXNpYmxpbmcgPSAoKE5vZGUpIG8pLmdldFBhcmVudE5vZGUoKS5nZXRMYXN0Q2hpbGQoKTsKLQkJCQkJCXdoaWxlIChzaWJsaW5nICE9IG51bGwgJiYgc2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIHNpYmxpbmcuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQlzaWJsaW5nID0gc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIFRoZSBvbmx5IGNoaWxkIGlzIGEgVGV4dCBOb2RlLCBnbyB0byB0aGUgcGFyZW50IE5vZGUKLQkJCQlpZiAoKChOb2RlKSBvKS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIG8uZXF1YWxzKHNpYmxpbmcpKSB7Ci0JCQkJCXNpYmxpbmcgPSAoKE5vZGUpIG8pLmdldFBhcmVudE5vZGUoKTsKLQkJCQl9Ci0KLQotCQkJCWlmIChzaWJsaW5nICE9IG51bGwpIHsKLQkJCQkJZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNpYmxpbmcpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGV4dEVkaXRvckFjdGlvbiN1cGRhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL1RvZ2dsZUNvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvVG9nZ2xlQ29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZDgxZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvVG9nZ2xlQ29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBUb2dnbGUgY29tbWVudCBhY3Rpb24gZGVsZWdhdGUgZm9yIFhNTCBlZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIFRvZ2dsZUNvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSBleHRlbmRzIEFic3RyYWN0Q29tbWVudEFjdGlvblhNTERlbGVnYXRlIHsKLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5Ub2dnbGVDb21tZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLlRvZ2dsZUNvbW1lbnRfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oWE1MVUlNZXNzYWdlcy5Ub2dnbGVDb21tZW50X2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotCXZvaWQgcHJvY2Vzc0FjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJLy8gZ2V0IHRleHQgc2VsZWN0aW9uIGxpbmVzIGluZm8KLQkJaW50IHNlbGVjdGlvblN0YXJ0TGluZSA9IHRleHRTZWxlY3Rpb24uZ2V0U3RhcnRMaW5lKCk7Ci0JCWludCBzZWxlY3Rpb25FbmRMaW5lID0gdGV4dFNlbGVjdGlvbi5nZXRFbmRMaW5lKCk7Ci0JCXRyeSB7Ci0JCQlpbnQgc2VsZWN0aW9uRW5kTGluZU9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoc2VsZWN0aW9uRW5kTGluZSk7Ci0JCQlpbnQgc2VsZWN0aW9uRW5kT2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0KLQkJCS8vIGFkanVzdCBzZWxlY3Rpb24gZW5kIGxpbmUKLQkJCWlmICgoc2VsZWN0aW9uRW5kTGluZSA+IHNlbGVjdGlvblN0YXJ0TGluZSkgJiYgKHNlbGVjdGlvbkVuZExpbmVPZmZzZXQgPT0gc2VsZWN0aW9uRW5kT2Zmc2V0KSkgewotCQkJCXNlbGVjdGlvbkVuZExpbmUtLTsKLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQotCQkvLyBzYXZlIHRoZSBzZWxlY3Rpb24gcG9zaXRpb24gc2luY2UgaXQgd2lsbCBiZSBjaGFuZ2luZwotCQlQb3NpdGlvbiBzZWxlY3Rpb25Qb3NpdGlvbiA9IG51bGw7Ci0JCWJvb2xlYW4gdXBkYXRlU3RhcnRPZmZzZXQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXNlbGVjdGlvblBvc2l0aW9uID0gbmV3IFBvc2l0aW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJZG9jdW1lbnQuYWRkUG9zaXRpb24oc2VsZWN0aW9uUG9zaXRpb24pOwotCi0JCQkvLyBleHRyYSBjaGVjayBpZiBjb21tZW50aW5nIGZyb20gYmVnaW5uaW5nIG9mIGxpbmUKLQkJCWludCBzZWxlY3Rpb25TdGFydExpbmVPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KHNlbGVjdGlvblN0YXJ0TGluZSk7Ci0JCQlpZiAoKHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgPiAwKSAmJiAoc2VsZWN0aW9uU3RhcnRMaW5lT2Zmc2V0ID09IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpICYmICFpc0NvbW1lbnRMaW5lKGRvY3VtZW50LCBzZWxlY3Rpb25TdGFydExpbmUpKSB7Ci0JCQkJdXBkYXRlU3RhcnRPZmZzZXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQotCQlwcm9jZXNzQWN0aW9uKGRvY3VtZW50LCBzZWxlY3Rpb25TdGFydExpbmUsIHNlbGVjdGlvbkVuZExpbmUpOwotCi0JCXVwZGF0ZUN1cnJlbnRTZWxlY3Rpb24oc2VsZWN0aW9uUG9zaXRpb24sIGRvY3VtZW50LCB1cGRhdGVTdGFydE9mZnNldCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NBY3Rpb24oSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc2VsZWN0aW9uU3RhcnRMaW5lLCBpbnQgc2VsZWN0aW9uRW5kTGluZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFhNTFVJTWVzc2FnZXMuVG9nZ2xlQ29tbWVudF90b29sdGlwKTsKLQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCWZvciAoaW50IGkgPSBzZWxlY3Rpb25TdGFydExpbmU7IGkgPD0gc2VsZWN0aW9uRW5kTGluZTsgaSsrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoZG9jdW1lbnQuZ2V0TGluZUxlbmd0aChpKSA+IDApIHsKLQkJCQkJCQlpZiAoaXNDb21tZW50TGluZShkb2N1bWVudCwgaSkpIHsKLQkJCQkJCQkJaW50IGxpbmVPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGkpOwotCQkJCQkJCQlJUmVnaW9uIHJlZ2lvbiA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihpKTsKLQkJCQkJCQkJU3RyaW5nIHN0cmluZyA9IGRvY3VtZW50LmdldChyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQkJCWludCBvcGVuQ29tbWVudE9mZnNldCA9IGxpbmVPZmZzZXQgKyBzdHJpbmcuaW5kZXhPZihPUEVOX0NPTU1FTlQpOwotCQkJCQkJCQlpbnQgY2xvc2VDb21tZW50T2Zmc2V0ID0gbGluZU9mZnNldCArIHN0cmluZy5pbmRleE9mKENMT1NFX0NPTU1FTlQpIC0gT1BFTl9DT01NRU5ULmxlbmd0aCgpOwotCQkJCQkJCQl1bmNvbW1lbnQoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0LCBjbG9zZUNvbW1lbnRPZmZzZXQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJaW50IG9wZW5Db21tZW50T2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChpKTsKLQkJCQkJCQkJaW50IGxpbmVEZWxpbWl0ZXJMZW5ndGggPSBkb2N1bWVudC5nZXRMaW5lRGVsaW1pdGVyKGkpID09IG51bGwgPyAwIDogZG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcihpKS5sZW5ndGgoKTsKLQkJCQkJCQkJaW50IGNsb3NlQ29tbWVudE9mZnNldCA9IG9wZW5Db21tZW50T2Zmc2V0ICsgZG9jdW1lbnQuZ2V0TGluZUxlbmd0aChpKSAtIGxpbmVEZWxpbWl0ZXJMZW5ndGggKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCk7Ci0JCQkJCQkJCWNvbW1lbnQoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0LCBjbG9zZUNvbW1lbnRPZmZzZXQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudExpbmUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgbGluZSkgewotCQlib29sZWFuIGlzQ29tbWVudCA9IGZhbHNlOwotCi0JCXRyeSB7Ci0JCQlJUmVnaW9uIHJlZ2lvbiA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihsaW5lKTsKLQkJCVN0cmluZyBzdHJpbmcgPSBkb2N1bWVudC5nZXQocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCkpLnRyaW0oKTsKLQkJCWlzQ29tbWVudCA9IChzdHJpbmcubGVuZ3RoKCkgPj0gT1BFTl9DT01NRU5ULmxlbmd0aCgpICsgQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSkgJiYgc3RyaW5nLnN0YXJ0c1dpdGgoT1BFTl9DT01NRU5UKSAmJiBzdHJpbmcuZW5kc1dpdGgoQ0xPU0VfQ09NTUVOVCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCQlyZXR1cm4gaXNDb21tZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21tZW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9wZW5Db21tZW50T2Zmc2V0LCBpbnQgY2xvc2VDb21tZW50T2Zmc2V0KSB7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudC5yZXBsYWNlKG9wZW5Db21tZW50T2Zmc2V0LCAwLCBPUEVOX0NPTU1FTlQpOwotCQkJZG9jdW1lbnQucmVwbGFjZShjbG9zZUNvbW1lbnRPZmZzZXQsIDAsIENMT1NFX0NPTU1FTlQpOwotCQkJcmVtb3ZlT3BlbkNsb3NlQ29tbWVudHMoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0ICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCBjbG9zZUNvbW1lbnRPZmZzZXQgLSBvcGVuQ29tbWVudE9mZnNldCAtIENMT1NFX0NPTU1FTlQubGVuZ3RoKCkpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5jb21tZW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9wZW5Db21tZW50T2Zmc2V0LCBpbnQgY2xvc2VDb21tZW50T2Zmc2V0KSB7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudC5yZXBsYWNlKG9wZW5Db21tZW50T2Zmc2V0LCBPUEVOX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZG9jdW1lbnQucmVwbGFjZShjbG9zZUNvbW1lbnRPZmZzZXQsIENMT1NFX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ3VycmVudFNlbGVjdGlvbihQb3NpdGlvbiBzZWxlY3Rpb25Qb3NpdGlvbiwgSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIHVwZGF0ZVN0YXJ0T2Zmc2V0KSB7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCS8vIHVwZGF0ZSB0aGUgc2VsZWN0aW9uIGlmIHRleHQgc2VsZWN0aW9uIGNoYW5nZWQKLQkJCWlmIChzZWxlY3Rpb25Qb3NpdGlvbiAhPSBudWxsKSB7Ci0JCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbnVsbDsKLQkJCQlpZiAodXBkYXRlU3RhcnRPZmZzZXQpIHsKLQkJCQkJc2VsZWN0aW9uID0gbmV3IFRleHRTZWxlY3Rpb24oZG9jdW1lbnQsIHNlbGVjdGlvblBvc2l0aW9uLmdldE9mZnNldCgpIC0gT1BFTl9DT01NRU5ULmxlbmd0aCgpLCBzZWxlY3Rpb25Qb3NpdGlvbi5nZXRMZW5ndGgoKSArIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzZWxlY3Rpb24gPSBuZXcgVGV4dFNlbGVjdGlvbihkb2N1bWVudCwgc2VsZWN0aW9uUG9zaXRpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvblBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gKChJVGV4dEVkaXRvcikgZkVkaXRvcikuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQlwcm92aWRlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQl9Ci0JCQkJZG9jdW1lbnQucmVtb3ZlUG9zaXRpb24oc2VsZWN0aW9uUG9zaXRpb24pOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0MTZjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hdXRvZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQ29uZmlndXJhYmxlTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklMaW5lVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIEF1dG9FZGl0U3RyYXRlZ3kgdG8gaGFuZGxlIGNoYXJhY3RlcnMgaW5zZXJ0ZWQgd2hlbiBUYWIga2V5IGlzIHByZXNzZWQKLSAqLwotcHVibGljIGNsYXNzIEF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzIGltcGxlbWVudHMgSUF1dG9FZGl0U3RyYXRlZ3kgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFRBQl9DSEFSQUNURVIgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgdm9pZCBjdXN0b21pemVEb2N1bWVudENvbW1hbmQoSURvY3VtZW50IGRvY3VtZW50LCBEb2N1bWVudENvbW1hbmQgY29tbWFuZCkgewotCQkvLyBpZiBub3QgaW4gc21hcnQgaW5zZXJ0IG1vZGUganVzdCBpZ25vcmUKLQkJaWYgKCFpc1NtYXJ0SW5zZXJ0TW9kZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBzcGFjZXMgZm9yIHRhYiBjaGFyYWN0ZXIKLQkJaWYgKChjb21tYW5kLmxlbmd0aCA9PSAwKSAmJiAoY29tbWFuZC50ZXh0ICE9IG51bGwpICYmIChjb21tYW5kLnRleHQubGVuZ3RoKCkgPiAwKSAmJiAoY29tbWFuZC50ZXh0LmluZGV4T2YoVEFCX0NIQVJBQ1RFUikgIT0gLTEpKSB7Ci0JCQlzbWFydEluc2VydEZvclRhYihjb21tYW5kLCBkb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgc3BhY2VzIGZvciB0YWJzCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JUYWIoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyB0YWIga2V5IHdhcyBwcmVzc2VkLiBub3cgY2hlY2sgcHJlZmVyZW5jZXMgdG8gc2VlIGlmIG5lZWQgdG8gaW5zZXJ0Ci0JCS8vIHNwYWNlcyBpbnN0ZWFkIG9mIHRhYgotCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IGdldEluZGVudGF0aW9uV2lkdGgoKTsKLQkJaWYgKGluZGVudGF0aW9uV2lkdGggPiAtMSkgewotCQkJU3RyaW5nIG9yaWdpbmFsVGV4dCA9IGNvbW1hbmQudGV4dDsKLQkJCVN0cmluZ0J1ZmZlciBuZXdUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcihvcmlnaW5hbFRleHQpOwotCi0JCQkvLyBkZXRlcm1pbmUgd2hlcmUgaW4gbGluZSB0aGlzIGNvbW1hbmQgYmVnaW5zCi0JCQlpbnQgbGluZU9mZnNldCA9IC0xOwotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIGxpbmVJbmZvID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoY29tbWFuZC5vZmZzZXQpOwotCQkJCWxpbmVPZmZzZXQgPSBjb21tYW5kLm9mZnNldCAtIGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0KLQkJCUlMaW5lVHJhY2tlciBsaW5lVHJhY2tlciA9IGdldExpbmVUcmFja2VyKGRvY3VtZW50LCBvcmlnaW5hbFRleHQpOwotCi0JCQlpbnQgc3RhcnRJbmRleCA9IDA7Ci0JCQlpbnQgaW5kZXggPSBuZXdUZXh0LmluZGV4T2YoVEFCX0NIQVJBQ1RFUik7Ci0JCQl3aGlsZSAoaW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgaW5kZW50ID0gZ2V0SW5kZW50U3RyaW5nKGluZGVudGF0aW9uV2lkdGgsIGxpbmVPZmZzZXQsIGxpbmVUcmFja2VyLCBpbmRleCk7Ci0KLQkJCQkvLyByZXBsYWNlIFx0IGNoYXJhY3RlciB3aXRoIHNwYWNlcwotCQkJCW5ld1RleHQucmVwbGFjZShpbmRleCwgaW5kZXggKyAxLCBpbmRlbnQpOwotCQkJCWlmIChsaW5lVHJhY2tlciAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsaW5lVHJhY2tlci5yZXBsYWNlKGluZGV4LCAxLCBpbmRlbnQpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIHJlcGxhY2luZyB0ZXh0LCBqdXN0Ci0JCQkJCQkvLyByZXNldCB0byBjdXJyZW50IHN0cmluZwotCQkJCQkJbGluZVRyYWNrZXIuc2V0KG5ld1RleHQudG9TdHJpbmcoKSk7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlzdGFydEluZGV4ID0gaW5kZXggKyBpbmRlbnQubGVuZ3RoKCk7Ci0JCQkJaW5kZXggPSBuZXdUZXh0LmluZGV4T2YoVEFCX0NIQVJBQ1RFUiwgc3RhcnRJbmRleCk7Ci0JCQl9Ci0JCQljb21tYW5kLnRleHQgPSBuZXdUZXh0LnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgbnVtYmVyIG9mIHNwYWNlcyBmb3IgbmV4dCB0YWIgc3RvcAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEluZGVudFN0cmluZyhpbnQgaW5kZW50YXRpb25XaWR0aCwgaW50IGxpbmVPZmZzZXQsIElMaW5lVHJhY2tlciBsaW5lVHJhY2tlciwgaW50IGluZGV4KSB7Ci0JCWludCBpbmRlbnRTaXplID0gaW5kZW50YXRpb25XaWR0aDsKLQkJaW50IG9mZnNldEluTGluZSA9IC0xOwotCQlpZiAobGluZVRyYWNrZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIGxpbmVJbmZvID0gbGluZVRyYWNrZXIuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoaW5kZXgpOwotCQkJCWlmICgobGluZUluZm8uZ2V0T2Zmc2V0KCkgPT0gMCkgJiYgKGxpbmVPZmZzZXQgPiAtMSkpIHsKLQkJCQkJb2Zmc2V0SW5MaW5lID0gbGluZU9mZnNldCArIGluZGV4OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJb2Zmc2V0SW5MaW5lID0gaW5kZXggLSBsaW5lSW5mby5nZXRPZmZzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChsaW5lT2Zmc2V0ID4gLTEpIHsKLQkJCQlvZmZzZXRJbkxpbmUgPSBsaW5lT2Zmc2V0ICsgaW5kZXg7Ci0JCQl9Ci0JCX0KLQkJaWYgKChvZmZzZXRJbkxpbmUgPiAtMSkgJiYgKGluZGVudGF0aW9uV2lkdGggPiAwKSkgewotCQkJaW50IHJlbWFpbmRlciA9IG9mZnNldEluTGluZSAlIGluZGVudGF0aW9uV2lkdGg7Ci0JCQlpbmRlbnRTaXplID0gaW5kZW50YXRpb25XaWR0aCAtIHJlbWFpbmRlcjsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50U2l6ZTsgaSsrKSB7Ci0JCQlpbmRlbnQuYXBwZW5kKCcgJyk7Ci0JCX0KLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFNldCB1cCBhIGxpbmUgdHJhY2tlciBmb3IgdGV4dCB3aXRoaW4gY29tbWFuZCBpZiB0ZXh0IGlzIG11bHRpLWxpbmUKLQkgKi8KLQlwcml2YXRlIElMaW5lVHJhY2tlciBnZXRMaW5lVHJhY2tlcihJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBvcmlnaW5hbFRleHQpIHsKLQkJQ29uZmlndXJhYmxlTGluZVRyYWNrZXIgbGluZVRyYWNrZXIgPSBudWxsOwotCQlpbnRbXSBkZWxpbXMgPSBUZXh0VXRpbGl0aWVzLmluZGV4T2YoZG9jdW1lbnQuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpLCBvcmlnaW5hbFRleHQsIDApOwotCQlpZiAoKGRlbGltc1swXSAhPSAtMSkgfHwgKGRlbGltc1sxXSAhPSAtMSkpIHsKLQkJCWxpbmVUcmFja2VyID0gbmV3IENvbmZpZ3VyYWJsZUxpbmVUcmFja2VyKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSk7Ci0JCQlsaW5lVHJhY2tlci5zZXQob3JpZ2luYWxUZXh0KTsKLQkJfQotCQlyZXR1cm4gbGluZVRyYWNrZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYWN0aXZlIGVkaXRvciBpcyBpbiBzbWFydCBpbnNlcnQgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzU21hcnRJbnNlcnRNb2RlKCkgewotCQlib29sZWFuIGlzU21hcnRJbnNlcnRNb2RlID0gZmFsc2U7Ci0KLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvcjsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvci5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGlmIHNtYXJ0IGluc2VydCBtb2RlCi0JCWlmICgodGV4dEVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgJiYgKCgoSVRleHRFZGl0b3JFeHRlbnNpb24zKSB0ZXh0RWRpdG9yKS5nZXRJbnNlcnRNb2RlKCkgPT0gSVRleHRFZGl0b3JFeHRlbnNpb24zLlNNQVJUX0lOU0VSVCkpIHsKLQkJCWlzU21hcnRJbnNlcnRNb2RlID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gaXNTbWFydEluc2VydE1vZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpbmRlbnRhdGlvbiB3aWR0aCBpZiB1c2luZyBzcGFjZXMgZm9yIGluZGVudGF0aW9uLCAtMSBvdGhlcndpc2UKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXByaXZhdGUgaW50IGdldEluZGVudGF0aW9uV2lkdGgoKSB7Ci0JCWludCB3aWR0aCA9IC0xOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UuZXF1YWxzKHByZWZlcmVuY2VzLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpKSkgewotCQkJd2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQkJfQotCi0JCXJldHVybiB3aWR0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneVhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGMxMGJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneVhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmF1dG9lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEF1dG9tYXRpY2FsbHkgaW5zZXJ0cyBjbG9zaW5nIGNvbW1lbnQgdGFnIG9yIGVuZCB0YWcgd2hlbiBhcHByb3ByaWF0ZS4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5WE1MIGltcGxlbWVudHMgSUF1dG9FZGl0U3RyYXRlZ3kgewotCS8qCi0JICogTk9URTogY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3RzIGluCi0JICogb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hdXRvZWRpdAotCSAqIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmF1dG9lZGl0Ci0JICovCi0JcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJT2JqZWN0IHRleHRFZGl0b3IgPSBnZXRBY3RpdmVUZXh0RWRpdG9yKCk7Ci0JCWlmICghKCh0ZXh0RWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3JFeHRlbnNpb24zKSAmJiAoKChJVGV4dEVkaXRvckV4dGVuc2lvbjMpIHRleHRFZGl0b3IpLmdldEluc2VydE1vZGUoKSA9PSBJVGV4dEVkaXRvckV4dGVuc2lvbjMuU01BUlRfSU5TRVJUKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNvbW1hbmQudGV4dCAhPSBudWxsKSB7Ci0JCQkJCXNtYXJ0SW5zZXJ0Q2xvc2VFbGVtZW50KGNvbW1hbmQsIGRvY3VtZW50LCBtb2RlbCk7Ci0JCQkJCXNtYXJ0SW5zZXJ0Rm9yQ29tbWVudChjb21tYW5kLCBkb2N1bWVudCwgbW9kZWwpOwotCQkJCQlzbWFydEluc2VydEZvckVuZFRhZyhjb21tYW5kLCBkb2N1bWVudCwgbW9kZWwpOwotCQkJCQlzbWFydFJlbW92ZUVuZFRhZyhjb21tYW5kLCBkb2N1bWVudCwgbW9kZWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNQcmVmZXJlbmNlRW5hYmxlZChTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoa2V5ICE9IG51bGwgJiYgWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oa2V5KSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudE5vZGUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKChub2RlICE9IG51bGwpICYmIChub2RlIGluc3RhbmNlb2YgSURPTUVsZW1lbnQpICYmICgoSURPTUVsZW1lbnQpIG5vZGUpLmlzQ29tbWVudFRhZygpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEb2N1bWVudE5vZGUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSk7Ci0JfQotCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gY2xlYW4gdXAgYW4gZW5kLXRhZyBpZiBhIHN0YXJ0LXRhZyBpcyBjb252ZXJ0ZWQgaW50byBhbiBlbXB0eS1lbGVtZW50Ci0JICogdGFnIChlLmcuLCA8bm9kZSAvPikgYW5kIHRoZSBvcmlnaW5hbCBlbGVtZW50IHdhcyBlbXB0eS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZCB0aGUgZG9jdW1lbnQgY29tbWFuZCBkZXNjcmliaW5nIHRoZSBjaGFuZ2UKLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IHRoYXQgd2lsbCBiZSBjaGFuZ2VkCi0JICogQHBhcmFtIG1vZGVsIHRoZSBtb2RlbCBiYXNlZCBvbiB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc21hcnRSZW1vdmVFbmRUYWcoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl0cnkgewotCQkJLy8gQW4gb3BlbmluZyB0YWcgaXMgbm93IGEgc2VsZi10ZXJtaW5hdGVkIGVuZC10YWcKLQkJCWlmICgiLyIuZXF1YWxzKGNvbW1hbmQudGV4dCkgJiYgIj4iLmVxdWFscyhkb2N1bWVudC5nZXQoY29tbWFuZC5vZmZzZXQsIDEpKSAmJiBjb21tYW5kLmxlbmd0aCA9PSAwICYmIGlzUHJlZmVyZW5jZUVuYWJsZWQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX1JFTU9WRV9FTkRfVEFHUykpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihjb21tYW5kLm9mZnNldCk7Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCAmJiAhbm9kZS5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWlmKHJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiAmJiBjb21tYW5kLm9mZnNldCA8PSByZWdpb24uZ2V0RW5kKCkpIHsKLQkJCQkJCQotCQkJCQkJLyogaWYgdGhlIHJlZ2lvbiBiZWZvcmUgdGhlIGNvbW1hbmQgb2Zmc2V0IGlzIGEgYW4gYXR0cmlidXRlIHZhbHVlIHJlZ2lvbgotCQkJCQkJICogY2hlY2sgdG8gc2VlIGlmIGl0IGhhcyBib3RoIGFuZCBvcGVuaW5nIGFuZCBjbG9zaW5nIHF1b3RlCi0JCQkJCQkgKi8KLQkJCQkJCUlUZXh0UmVnaW9uIHByZXZUZXh0UmVnaW9uID0gcmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGNvbW1hbmQub2Zmc2V0LTEpOwotCQkJCQkJYm9vbGVhbiBpblVuY2xvc2VkQXR0VmFsdWVSZWdpb24gPSBmYWxzZTsKLQkJCQkJCWlmKHByZXZUZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQkJLy9nZXQgdGhlIHRleHQgb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSByZWdpb24KLQkJCQkJCQlTdHJpbmcgcHJldlRleHQgPSByZWdpb24uZ2V0VGV4dChwcmV2VGV4dFJlZ2lvbik7Ci0JCQkJCQkJaW5VbmNsb3NlZEF0dFZhbHVlUmVnaW9uID0gKHByZXZUZXh0LnN0YXJ0c1dpdGgoIiciKSAmJiAoKHByZXZUZXh0Lmxlbmd0aCgpID09IDEpIHx8ICFwcmV2VGV4dC5lbmRzV2l0aCgiJyIpKSkgfHwKLQkJCQkJCQkJKHByZXZUZXh0LnN0YXJ0c1dpdGgoIlwiIikgJiYgKChwcmV2VGV4dC5sZW5ndGgoKSA9PSAxKSB8fCAhcHJldlRleHQuZW5kc1dpdGgoIlwiIikpKTsKLQkJCQkJCX0gCi0JCQkJCQkvL2lmIGNvbW1hbmQgb2Zmc2V0IGlzIGluIGFuIHVuY2xvc2VkIGF0dHJpYnV0ZSB2YWx1ZSByZWdpb24gdGhlbiBkb25lIHJlbW92ZSB0aGUgZW5kIHRhZwotCQkJCQkJaWYoIWluVW5jbG9zZWRBdHRWYWx1ZVJlZ2lvbikgewotCQkJCQkJCXJlZ2lvbiA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5pc0VuZGVkKCkpIHsKLQkJCQkJCQkJZG9jdW1lbnQucmVwbGFjZShyZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JDb21tZW50KERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJdHJ5IHsKLQkJCWlmIChjb21tYW5kLnRleHQuZXF1YWxzKCItIikgJiYgKGRvY3VtZW50LmdldExlbmd0aCgpID49IDMpICYmIGRvY3VtZW50LmdldChjb21tYW5kLm9mZnNldCAtIDMsIDMpLmVxdWFscygiPCEtIikgJiYgaXNQcmVmZXJlbmNlRW5hYmxlZChYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfQ09NTUVOVFMpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWNvbW1hbmQudGV4dCArPSAiICAtLT4iOyAvLyROT04tTkxTLTEkCi0JCQkJY29tbWFuZC5zaGlmdHNDYXJldCA9IGZhbHNlOwotCQkJCWNvbW1hbmQuY2FyZXRPZmZzZXQgPSBjb21tYW5kLm9mZnNldCArIDI7Ci0JCQkJY29tbWFuZC5kb2l0ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0cyB0byBpbnNlcnQgdGhlIGVuZCB0YWcgd2hlbiBjb21wbGV0aW5nIGEgc3RhcnQtdGFnIHdpdGggdGhlICcmZ3Q7JyBjaGFyYWN0ZXIuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRDbG9zZUVsZW1lbnQoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl0cnkgewotCQkJLy8gQ2hlY2sgdGVybWluYXRpbmcgc3RhcnQgdGFnLCBidXQgaWdub3JlIGVtcHR5LWVsZW1lbnQgdGFncwotCQkJaWYgKGNvbW1hbmQudGV4dC5lcXVhbHMoIj4iKSAmJiBkb2N1bWVudC5nZXRMZW5ndGgoKSA+IDAgJiYgZG9jdW1lbnQuZ2V0Q2hhcihjb21tYW5kLm9mZnNldCAtIDEpICE9ICcvJyAmJiBpc1ByZWZlcmVuY2VFbmFibGVkKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9FTEVNRU5UUykpIHsgLy8kTk9OLU5MUy0xJAotCQkJCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIG1vZGVsLmdldEluZGV4ZWRSZWdpb24oY29tbWFuZC5vZmZzZXQgLSAxKTsKLQkJCQlib29sZWFuIGlzQ2xvc2VkQnlQYXJlbnQgPSBmYWxzZTsKLQkJCQkvLyBPbmx5IGluc2VydCBhbiBlbmQtdGFnIGlmIG5lY2Vzc2FyeS4gQmVjYXVzZSBvZiB0aGUgd2F5IHRoZSBkb2N1bWVudCBpcyBwYXJzZWQsIGl0IGlzIHBvc3NpYmxlIGZvciBhIGNoaWxkIHRhZyB3aXRoIHRoZSBzYW1lCi0JCQkJLy8gbmFtZSBhcyBhbiBhbmNlc3RvciB0byBiZSBwYWlyZWQgd2l0aCB0aGUgZW5kLXRhZyBvZiBhbiBhbmNlc3Rvciwgc28gdGhlIGFuY2VzdG9ycyBtdXN0IGJlIGNoZWNrZWQgZm9yIGFuIHVuY2xvc2VkIHRhZy4KLQkJCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiAoIW5vZGUuaXNDbG9zZWQoKSB8fCAoaXNDbG9zZWRCeVBhcmVudCA9IGhhc1VuY2xvc2VkQW5jZXN0b3Iobm9kZSkpKSkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWlmIChyZWdpb24gIT0gbnVsbCAmJiByZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA+IDAgJiYgcmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTiAmJiAhaXNDbG9zZWRCeVBhcmVudCkKLQkJCQkJCXJldHVybjsKLQkJCQkJY29tbWFuZC50ZXh0ICs9ICI8LyIgKyBnZXRFbGVtZW50TmFtZShub2RlLCBjb21tYW5kLm9mZnNldCkgKyAiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQljb21tYW5kLnNoaWZ0c0NhcmV0ID0gZmFsc2U7Ci0JCQkJCWNvbW1hbmQuY2FyZXRPZmZzZXQgPSBjb21tYW5kLm9mZnNldCArIDE7Ci0JCQkJfQotCQkJCQotCQkJfQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBlbGVtZW50IG5hbWUgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgYnkgY2xvc2luZyB0aGUgc3RhcnQgdGFnLiBEZWZhdWx0cwotCSAqIHRvIHRoZSBub2RlJ3Mgbm9kZU5hbWUuCi0JICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdGhhdCBpcyBiZWluZyBlZGl0ZWQKLQkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW4gdGhlIGRvY3VtZW50IHdoZXJlIHRoZSBzdGFydCB0YWcgaXMgY2xvc2VkCi0JICogQHJldHVybiBUaGUgZWxlbWVudCBuYW1lIG9mIHRoZSB0YWcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRFbGVtZW50TmFtZShJRE9NTm9kZSBub2RlLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gcmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCWlmICh0ZXh0UmVnaW9uICE9IG51bGwgJiYgdGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCWludCBuYW1lU3RhcnQgPSByZWdpb24uZ2V0U3RhcnRPZmZzZXQodGV4dFJlZ2lvbik7Ci0JCQlTdHJpbmcgcmVnaW9uVGV4dCA9IHJlZ2lvbi5nZXRUZXh0KHRleHRSZWdpb24pOwotCQkJaW50IGxlbmd0aCA9IG9mZnNldCAtIG5hbWVTdGFydDsKLQkJCWlmIChsZW5ndGggPD0gcmVnaW9uVGV4dC5sZW5ndGgoKSkKLQkJCQluYW1lID0gcmVnaW9uVGV4dC5zdWJzdHJpbmcoMCwgbGVuZ3RoKTsKLQkJfQotCQkKLQkJLy8gRGVmYXVsdCB0byB0aGUgbm9kZSBuYW1lCi0JCWlmIChuYW1lID09IG51bGwpCi0JCQluYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JFbmRUYWcoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl0cnkgewotCQkJaWYgKGNvbW1hbmQudGV4dC5lcXVhbHMoIi8iKSAmJiAoZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPj0gMSkgJiYgZG9jdW1lbnQuZ2V0KGNvbW1hbmQub2Zmc2V0IC0gMSwgMSkuZXF1YWxzKCI8IikgJiYgaXNQcmVmZXJlbmNlRW5hYmxlZChYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRU5EX1RBR1MpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUlET01Ob2RlIHBhcmVudE5vZGUgPSAoSURPTU5vZGUpICgoSURPTU5vZGUpIG1vZGVsLmdldEluZGV4ZWRSZWdpb24oY29tbWFuZC5vZmZzZXQgLSAxKSkuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChpc0NvbW1lbnROb2RlKHBhcmVudE5vZGUpKSB7Ci0JCQkJCS8vIGxvb3AgYW5kIGZpbmQgbm9uIGNvbW1lbnQgbm9kZSBwYXJlbnQKLQkJCQkJd2hpbGUgKChwYXJlbnROb2RlICE9IG51bGwpICYmIGlzQ29tbWVudE5vZGUocGFyZW50Tm9kZSkpIHsKLQkJCQkJCXBhcmVudE5vZGUgPSAoSURPTU5vZGUpIHBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCFpc0RvY3VtZW50Tm9kZShwYXJlbnROb2RlKSkgewotCQkJCQkvLyBvbmx5IGFkZCBlbmQgdGFnIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IG9yIGlmCi0JCQkJCS8vIGFkZCAnLycgZG9lcyBub3QgY3JlYXRlIG9uZSBhbHJlYWR5Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gcGFyZW50Tm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJSURPTU5vZGUgYW5jZXN0b3IgPSBwYXJlbnROb2RlOwotCQkJCQlib29sZWFuIHNtYXJ0SW5zZXJ0Rm9yRW5kID0gZmFsc2U7Ci0JCQkJCWlmKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkvLyBMb29rIGZvciBhbmNlc3RvcnMgYnkgdGhlIHNhbWUgbmFtZSB0aGF0IGFyZSBtaXNzaW5nIGVuZCB0YWdzCi0JCQkJCQl3aGlsZSgoYW5jZXN0b3IgPSAoSURPTU5vZGUpIGFuY2VzdG9yLmdldFBhcmVudE5vZGUoKSkgIT0gbnVsbCkgewotCQkJCQkJCWlmKGFuY2VzdG9yLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwgJiYgcGFyZW50Tm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscyhhbmNlc3Rvci5nZXROb2RlTmFtZSgpKSkgewotCQkJCQkJCQlzbWFydEluc2VydEZvckVuZCA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwgfHwgc21hcnRJbnNlcnRGb3JFbmQpIHsKLQkJCQkJCVN0cmluZ0J1ZmZlciB0b0FkZCA9IG5ldyBTdHJpbmdCdWZmZXIocGFyZW50Tm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCQkJCWlmICh0b0FkZC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQl0b0FkZC5hcHBlbmQoIj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBzdWZmaXggPSB0b0FkZC50b1N0cmluZygpOwotCQkJCQkJCWlmICgoZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPCBjb21tYW5kLm9mZnNldCArIHN1ZmZpeC5sZW5ndGgoKSkgfHwgKCFzdWZmaXguZXF1YWxzKGRvY3VtZW50LmdldChjb21tYW5kLm9mZnNldCwgc3VmZml4Lmxlbmd0aCgpKSkpKSB7Ci0JCQkJCQkJCWNvbW1hbmQudGV4dCArPSBzdWZmaXg7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiA8Y29kZT5ub2RlPC9jb2RlPiBoYXMgYW4gdW5jbG9zZWQgYW5jZXN0b3IgYnkgdGhlIHNhbWUgbmFtZQotCSAqIAotCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIGNoZWNrCi0JICogQHJldHVybiB0cnVlIGlmIDxjb2RlPm5vZGU8L2NvZGU+IGhhcyBhbiB1bmNsb3NlZCBwYXJlbnQgd2l0aCB0aGUgc2FtZSBub2RlIG5hbWUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzVW5jbG9zZWRBbmNlc3RvcihJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIHBhcmVudCA9IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUgJiYgcGFyZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCWlmICghcGFyZW50LmlzQ2xvc2VkKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlwYXJlbnQgPSAoSURPTU5vZGUpIHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWN0aXZlIHRleHQgZWRpdG9yIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgdGhlIGFjdGl2ZSBlZGl0b3IKLQkgKiBwYXJ0LgotCSAqIAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0QWN0aXZlVGV4dEVkaXRvcigpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJCQkJcmV0dXJuIGVkaXRvcjsKLQkJCQkJfQotCQkJCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiB0ZXh0RWRpdG9yOwotCQkJCQl9Ci0JCQkJCXJldHVybiBlZGl0b3I7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0Fic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMDNmYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRW50aXR5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01OYW1lZE5vZGVNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkF0dHJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuQ01JbWFnZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvLk1hcmt1cFRhZ0luZm9Qcm92aWRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFRoaXMgY2xhc3MgaXMgbm8gbG9uZ2VyIHVzZWQgbG9jYWxseSBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCi0gKiBJbXBsZW1lbnRlcnMgb2YgdGhpcyBjbGFzcyBzaG91bGQgbm93IHVzZSB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21wbGV0aW9uUHJvcG9zYWw8L2NvZGU+Ci0gKiBleHRlbnNpb24gcG9pbnQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUge0BsaW5rIElDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcn0gaW50ZXJmYWNlLgotICogCi0gKiBAc2VlIFN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yCi0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgaW1wbGVtZW50cyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciwgSVJlbGVhc2FibGUgewotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NMT1NFID0gIkpTUF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DT01NRU5UX0NMT1NFID0gIkpTUF9DT01NRU5UX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9PUEVOID0gIkpTUF9DT01NRU5UX09QRU4iOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfREVDTEFSQVRJT05fT1BFTiA9ICJKU1BfREVDTEFSQVRJT05fT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ESVJFQ1RJVkVfQ0xPU0UgPSAiSlNQX0RJUkVDVElWRV9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ESVJFQ1RJVkVfTkFNRSA9ICJKU1BfRElSRUNUSVZFX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ESVJFQ1RJVkVfT1BFTiA9ICJKU1BfRElSRUNUSVZFX09QRU4iOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRVhQUkVTU0lPTl9PUEVOID0gIkpTUF9FWFBSRVNTSU9OX09QRU4iOyAvLyROT04tTkxTLTEkCi0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ST09UX1RBR19OQU1FID0gIkpTUF9ST09UX1RBR19OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfU0NSSVBUTEVUX09QRU4gPSAiSlNQX1NDUklQVExFVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJOQUxFUlJPUiA9IFhNTFVJTWVzc2FnZXMuU0VWRVJFX2ludGVybmFsX2Vycm9yX29jY3VfVUlfOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV05fQVRUUiA9IFhNTFVJTWVzc2FnZXMuTm9fa25vd25fYXR0cmlidXRlX19VSV87Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTl9DT05URVhUID0gWE1MVUlNZXNzYWdlcy5Db250ZW50X0Fzc2lzdF9ub3RfYXZhaWxhYl9VSV87Ci0JcHJvdGVjdGVkIGNoYXIgY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzW10gPSBudWxsOwotCXByb3RlY3RlZCBjaGFyIGNvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyc1tdID0gbnVsbDsKLQlwcml2YXRlIEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciBmQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZkVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJvdGVjdGVkIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvciBmR2VuZXJhdG9yOwotCS8vIHByb3RlY3RlZCBJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCXByb3RlY3RlZCBNYXJrdXBUYWdJbmZvUHJvdmlkZXIgZkluZm9Qcm92aWRlciA9IG51bGw7Ci0JcHJvdGVjdGVkIElUZXh0Vmlld2VyIGZUZXh0Vmlld2VyID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBzaG93VmFsdWVzID0gdHJ1ZTsKLQotCXB1YmxpYyBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCS8vIHJldHJpZXZlIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihub2RlKTsKLQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCUNNTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50RGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkKLQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyaWJ1dGVzKTsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlMaXN0IG5vZGVzID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudCgoRWxlbWVudCkgbm9kZSwgZWxlbWVudERlY2wsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoayk7Ci0JCQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYXR0cmlidXRlcyA9IGFsbEF0dHJpYnV0ZXM7Ci0KLQkJCVN0cmluZyBtYXRjaFN0cmluZyA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCk7Ci0KLQkJCS8vIGNoZWNrIHdoZXRoZXIgYW4gYXR0cmlidXRlIHJlYWxseSBleGlzdHMgZm9yIHRoZSByZXBsYWNlbWVudAotCQkJLy8gb2Zmc2V0cyBBTkQgaWYgaXQgcG9zc2Vzc2VzIGEgdmFsdWUKLQkJCWJvb2xlYW4gYXR0ckF0TG9jYXRpb25IYXNWYWx1ZSA9IGZhbHNlOwotCQkJTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlBdHRySW1wbCBleGlzdGluZ0F0dHIgPSAoQXR0ckltcGwpIGF0dHJzLml0ZW0oaSk7Ci0JCQkJSVRleHRSZWdpb24gbmFtZSA9IGV4aXN0aW5nQXR0ci5nZXROYW1lUmVnaW9uKCk7Ci0KLQkJCQlpZiAoKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWUpIDw9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpKSAmJiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZSkgKyBuYW1lLmdldExlbmd0aCgpID49IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpICsgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSkgJiYgKGV4aXN0aW5nQXR0ci5nZXRWYWx1ZVJlZ2lvbigpICE9IG51bGwpKSB7Ci0JCQkJCWF0dHJBdExvY2F0aW9uSGFzVmFsdWUgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG9ubHkgYWRkIHByb3Bvc2FscyBmb3IgdGhlIGF0dHJpYnV0ZXMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aAotCQkJLy8gdGhlIG1hdGNoc3RyaW5nCi0JCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0KLQkJCQkJaW50IGlzUmVxdWlyZWQgPSAwOwotCQkJCQlpZiAoYXR0ckRlY2wuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQkJCQlpc1JlcXVpcmVkID0gWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfUkVRVUlSRUQ7Ci0JCQkJCX0KLQotCQkJCQlib29sZWFuIHNob3dBdHRyaWJ1dGUgPSB0cnVlOwotCQkJCQlzaG93QXR0cmlidXRlID0gc2hvd0F0dHJpYnV0ZSAmJiBiZWdpbnNXaXRoKGdldFJlcXVpcmVkTmFtZShub2RlLCBhdHRyRGVjbCksIG1hdGNoU3RyaW5nLnRyaW0oKSk7Ci0JCQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShnZXRSZXF1aXJlZE5hbWUobm9kZSwgYXR0ckRlY2wpKTsKLQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGF0dHIgIT0gbnVsbCA/IGF0dHIuZ2V0TmFtZVJlZ2lvbigpIDogbnVsbDsKLQkJCQkJLy8gbmFtZVJlZ2lvbi5nZXRFbmRPZmZzZXQoKSArIDEgaXMgcmVxdWlyZWQgdG8gYWxsb3cgZm9yCi0JCQkJCS8vIG1hdGNoZXMgYWdhaW5zdCB0aGUgZnVsbCBuYW1lIG9mIGFuIGV4aXN0aW5nIEF0dHIKLQkJCQkJc2hvd0F0dHJpYnV0ZSA9IHNob3dBdHRyaWJ1dGUgJiYgKChhdHRyID09IG51bGwpIHx8ICgobmFtZVJlZ2lvbiAhPSBudWxsKSAmJiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZVJlZ2lvbikgPD0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkpICYmIChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSArIG5hbWVSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgKyBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpKSkpOwotCQkJCQlpZiAoc2hvd0F0dHJpYnV0ZSkgewotCQkJCQkJSW1hZ2UgYXR0ckltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoYXR0ckRlY2wpOwotCQkJCQkJaWYgKGF0dHJJbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQkJaWYgKGlzUmVxdWlyZWQgPiAwKSB7Ci0JCQkJCQkJCWF0dHJJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQVRUX1JFUV9PQkopOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJYXR0ckltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9IG51bGw7Ci0JCQkJCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8oZWxlbWVudERlY2wsIGF0dHJEZWNsKTsKLQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG51bGw7Ci0JCQkJCQkvLyBhdHRyaWJ1dGUgaXMgYXQgdGhpcyBsb2NhdGlvbiBhbmQgYWxyZWFkeSBleGlzdHMKLQkJCQkJCWlmIChhdHRyQXRMb2NhdGlvbkhhc1ZhbHVlKSB7Ci0JCQkJCQkJLy8gb25seSBwcm9wb3NlIHRoZSBuYW1lCi0JCQkJCQkJcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGF0dHJEZWNsKTsKLQkJCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgcHJvcG9zZWRUZXh0Lmxlbmd0aCgpLCBhdHRySW1hZ2UsIHByb3Bvc2VkVGV4dCwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX05BTUUgKyBpc1JlcXVpcmVkLCB0cnVlKTsKLQkJCQkJCX0KLQkJCQkJCS8vIG5vIGF0dHJpYnV0ZSBleGlzdHMgb3IgaXMgZWxzZXdoZXJlLCBnZW5lcmF0ZQotCQkJCQkJLy8gbWluaW1hbGx5Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlBdHRyIGV4aXN0aW5nQXR0ck5vZGUgPSAoQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGdldFJlcXVpcmVkTmFtZShub2RlLCBhdHRyRGVjbCkpOwotCQkJCQkJCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCQkJCQkJaWYgKGV4aXN0aW5nQXR0ck5vZGUgIT0gbnVsbCkgewotCQkJCQkJCQl2YWx1ZSA9IGV4aXN0aW5nQXR0ck5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYgKHZhbHVlLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCQkJcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGF0dHJEZWNsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXByb3Bvc2VkVGV4dCA9IGdldFJlcXVpcmVkVGV4dChub2RlLCBhdHRyRGVjbCk7Ci0JCQkJCQkJfQotCQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBhdHRyRGVjbC5nZXROb2RlTmFtZSgpLmxlbmd0aCgpICsgMiwgYXR0ckltYWdlLAotCQkJCQkJCS8vIGlmIHRoZSB2YWx1ZSBpc24ndCBlbXB0eSAobm8gZW1wdHkgc2V0IG9mCi0JCQkJCQkJCQkJLy8gcXVvdGVzKSwgc2hvdyBpdAotCQkJCQkJCS8vIEJVRyAyMDM0OTQsIGNvbnRlbnQgc3RyaW5ncyBtYXkgaGF2ZSAiIiwgYnV0IG5vdCBiZSBlbXB0eQotCQkJCQkJCS8vIEFuIGVtcHR5IHN0cmluZyBpcyB3aGVuIHRoZXJlJ3Mgbm8gY29udGVudCBiZXR3ZWVuIGRvdWJsZSBxdW90ZXMKLQkJCQkJCQkvLyBhbmQgdGhlcmUgaXMgbm8gc2luZ2xlIHF1b3RlIHRoYXQgbWF5IGJlIGVuY2FzaW5nIGEgZG91YmxlIHF1b3RlCi0JCQkJCQkJCQkJKHNob3dWYWx1ZXMgJiYgKHByb3Bvc2VkVGV4dC5sYXN0SW5kZXhPZignXCInKSAtIHByb3Bvc2VkVGV4dC5pbmRleE9mKCdcIicpID09ICAxICYmIHByb3Bvc2VkVGV4dC5pbmRleE9mKCdcJycpID09IC0xKSkgPyBnZXRSZXF1aXJlZE5hbWUobm9kZSwgYXR0ckRlY2wpIDogcHJvcG9zZWRUZXh0LAotCQkJCQkJCQkJCW51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0FUVFJJQlVURV9OQU1FICsgaXNSZXF1aXJlZCk7Ci0JCQkJCQl9Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbGVtZW50X19pc191bmtub3duLCAobmV3IE9iamVjdFtde25vZGUuZ2V0Tm9kZU5hbWUoKX0pKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCi0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKTsKLQotCQkvLyBGaW5kIHRoZSBhdHRyaWJ1dGUgcmVnaW9uIGFuZCBuYW1lIGZvciB3aGljaCB0aGlzIHBvc2l0aW9uIHNob3VsZAotCQkvLyBoYXZlIGEgdmFsdWUgcHJvcG9zZWQKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvcGVuID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3Qgb3BlblJlZ2lvbnMgPSBvcGVuLmdldFJlZ2lvbnMoKTsKLQkJaW50IGkgPSBvcGVuUmVnaW9ucy5pbmRleE9mKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpKTsKLQkJaWYgKGkgPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpID49IDApIHsKLQkJCW5hbWVSZWdpb24gPSBvcGVuUmVnaW9ucy5nZXQoaS0tKTsKLQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vIHRoZSBuYW1lIHJlZ2lvbiBpcyBSRVFVSVJFRCB0byBkbyBhbnl0aGluZyB1c2VmdWwKLQkJaWYgKG5hbWVSZWdpb24gIT0gbnVsbCkgewotCQkJLy8gUmV0cmlldmUgdGhlIGRlY2xhcmF0aW9uCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKG5vZGUpOwotCi0JCQkvLyBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG5hbWVSZWdpb24uZ2V0VGV4dCgpOwotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBvcGVuLmdldFRleHQobmFtZVJlZ2lvbik7Ci0KLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSBudWxsOwotCi0JCQkvLyBObyBDTUVsZW1lbnREZWNsYXJhdGlvbiBtZWFucyBubyBhdHRyaWJ1dGUgbWV0YWRhdGEsIGJ1dAotCQkJLy8gcmV0cmlldmUgdGhlCi0JCQkvLyBkZWNsYXJhdGlvbiBmb3IgdGhlIGF0dHJpYnV0ZSBvdGhlcndpc2UKLQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJQ01OYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyaWJ1dGVzKSB7Ci0JCQkJCXByaXZhdGUgTWFwIGNhc2VJbnNlbnNpdGl2ZTsKLQkJCQkJCi0JCQkJCXByaXZhdGUgTWFwIGdldENhc2VJbnNlbnNpdGl2ZU1hcCgpIHsKLQkJCQkJCWlmKGNhc2VJbnNlbnNpdGl2ZSA9PSBudWxsKQotCQkJCQkJCWNhc2VJbnNlbnNpdGl2ZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCQlyZXR1cm4gY2FzZUluc2Vuc2l0aXZlOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJCQkJCUNNTm9kZSBub2RlID0gc3VwZXIuZ2V0TmFtZWRJdGVtKG5hbWUpOwotCQkJCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCQkJCW5vZGUgPSAoQ01Ob2RlKSBnZXRDYXNlSW5zZW5zaXRpdmVNYXAoKS5nZXQobmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBub2RlOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgcHV0KENNTm9kZSBjbU5vZGUpIHsKLQkJCQkJCXN1cGVyLnB1dChjbU5vZGUpOwotCQkJCQkJZ2V0Q2FzZUluc2Vuc2l0aXZlTWFwKCkucHV0KGNtTm9kZS5nZXROb2RlTmFtZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5VUyksIGNtTm9kZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJTGlzdCBub2RlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIG5vZGUsIGVsZW1lbnREZWNsLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQkJCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoayk7Ci0JCQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQkJCWFsbEF0dHJpYnV0ZXMucHV0KGNtbm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYXR0cmlidXRlcyA9IGFsbEF0dHJpYnV0ZXM7Ci0KLQkJCQlTdHJpbmcgbm9wcmVmaXhOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dHJpYnV0ZU5hbWUpOwotCQkJCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0obm9wcmVmaXhOYW1lKTsKLQkJCQkJaWYgKGF0dHJEZWNsID09IG51bGwpIHsKLQkJCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChhdHRyRGVjbCA9PSBudWxsKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShVTktOT1dOX0FUVFIsIGF0dHJpYnV0ZU5hbWUpOwotCQkJCX0KLQkJCX0KLQotCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKS5nZXROb2RlVmFsdWUoKTsKLQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSBudWxsOwotCQkJSW1hZ2UgaW1hZ2UgPSBDTUltYWdlVXRpbC5nZXRJbWFnZShhdHRyRGVjbCk7Ci0JCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCWlmICgoYXR0ckRlY2wgIT0gbnVsbCkgJiYgKGF0dHJEZWNsLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkpIHsKLQkJCQkJaW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVF9SRVFfT0JKKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKChhdHRyRGVjbCAhPSBudWxsKSAmJiAoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKSAhPSBudWxsKSkgewotCQkJCS8vIGF0dHJpYnV0ZSBpcyBrbm93biwgcHJvbXB0IHdpdGggdmFsdWVzIGZyb20gdGhlIGRlY2xhcmF0aW9uCi0JCQkJcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8oZWxlbWVudERlY2wsIGF0dHJEZWNsKTsKLQkJCQlMaXN0IHBvc3NpYmxlVmFsdWVzID0gZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhub2RlLCBhdHRyRGVjbCk7Ci0JCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JCQkJaWYgKHBvc3NpYmxlVmFsdWVzLnNpemUoKSA+IDAgfHwgZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCQkJLy8gRU5VTUVSQVRFRCBWQUxVRVMKLQkJCQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKTsKLQkJCQkJaWYgKG1hdGNoU3RyaW5nID09IG51bGwpIHsKLQkJCQkJCW1hdGNoU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAoKG1hdGNoU3RyaW5nLmxlbmd0aCgpID4gMCkgJiYgKG1hdGNoU3RyaW5nLnN0YXJ0c1dpdGgoIlwiIikgfHwgbWF0Y2hTdHJpbmcuc3RhcnRzV2l0aCgiJyIpKSkgewotCQkJCQkJbWF0Y2hTdHJpbmcgPSBtYXRjaFN0cmluZy5zdWJzdHJpbmcoMSk7Ci0JCQkJCX0KLQkJCQkJYm9vbGVhbiBjdXJyZW50VmFsaWQgPSBmYWxzZTsKLQotCQkJCQkvLyBkMjEwODU4LCBpZiB0aGUgcmVnaW9uJ3MgYSBjb250YWluZXIsIGRvbid0IHN1Z2dlc3QgdGhlCi0JCQkJCS8vIGVudW1lcmF0ZWQgdmFsdWVzIGFzIHRoZXkgcHJvYmFibHkgd29uJ3QgaGVscAotCQkJCQlib29sZWFuIGV4aXN0aW5nQ29tcGxpY2F0ZWRWYWx1ZSA9IChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSAhPSBudWxsKSAmJiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcik7Ci0JCQkJCWlmICghZXhpc3RpbmdDb21wbGljYXRlZFZhbHVlKSB7Ci0JCQkJCQlpbnQgck9mZnNldCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpOwotCQkJCQkJaW50IHJMZW5ndGggPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBqID0gcG9zc2libGVWYWx1ZXMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJU3RyaW5nIHBvc3NpYmxlVmFsdWUgPSAoU3RyaW5nKSBqLm5leHQoKTsKLQkJCQkJCQlpZighcG9zc2libGVWYWx1ZS5lcXVhbHMoZGVmYXVsdFZhbHVlKSkgewotCQkJCQkJCQljdXJyZW50VmFsaWQgPSBjdXJyZW50VmFsaWQgfHwgcG9zc2libGVWYWx1ZS5lcXVhbHMoY3VycmVudFZhbHVlKTsKLQkJCQkJCQkJaWYgKChtYXRjaFN0cmluZy5sZW5ndGgoKSA9PSAwKSB8fCBwb3NzaWJsZVZhbHVlLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcpKSB7Ci0JCQkJCQkJCQlTdHJpbmcgclN0cmluZyA9ICJcIiIgKyBwb3NzaWJsZVZhbHVlICsgIlwiIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoclN0cmluZywgck9mZnNldCwgckxlbmd0aCwgcG9zc2libGVWYWx1ZS5sZW5ndGgoKSArIDEsIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRU5VTSksIHJTdHJpbmcsIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZihkZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiAoKG1hdGNoU3RyaW5nLmxlbmd0aCgpID09IDApIHx8IGRlZmF1bHRWYWx1ZS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nKSkpIHsKLQkJCQkJCQlTdHJpbmcgclN0cmluZyA9ICJcIiIgKyBkZWZhdWx0VmFsdWUgKyAiXCIiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoclN0cmluZywgck9mZnNldCwgckxlbmd0aCwgZGVmYXVsdFZhbHVlLmxlbmd0aCgpICsgMSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9ERUZBVUxUKSwgclN0cmluZywgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKChhdHRyRGVjbC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uRklYRUQpIHx8IChhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldEltcGxpZWRWYWx1ZUtpbmQoKSA9PSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfRklYRUQpKSAmJiAoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKS5nZXRJbXBsaWVkVmFsdWUoKSAhPSBudWxsKSkgewotCQkJCQkvLyBGSVhFRCB2YWx1ZXMKLQkJCQkJU3RyaW5nIHZhbHVlID0gYXR0ckRlY2wuZ2V0QXR0clR5cGUoKS5nZXRJbXBsaWVkVmFsdWUoKTsKLQkJCQkJaWYgKCh2YWx1ZSAhPSBudWxsKSAmJiAodmFsdWUubGVuZ3RoKCkgPiAwKSkgewotCQkJCQkJU3RyaW5nIHJWYWx1ZSA9ICJcIiIgKyB2YWx1ZSArICJcIiI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoclZhbHVlLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgclZhbHVlLmxlbmd0aCgpICsgMSwgaW1hZ2UsIHJWYWx1ZSwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCWlmICgoY3VycmVudFZhbHVlLmxlbmd0aCgpID4gMCkgJiYgIXZhbHVlLmVxdWFscyhjdXJyZW50VmFsdWUpKSB7Ci0JCQkJCQkJclZhbHVlID0gIlwiIiArIGN1cnJlbnRWYWx1ZSArICJcIiI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQkJcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHJWYWx1ZSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIHJWYWx1ZS5sZW5ndGgoKSArIDEsIGltYWdlLCByVmFsdWUsIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdW5rbm93biBhdHRyaWJ1dGUsIHNvIHN1cHBseSBuaWNlIGVtcHR5IHZhbHVlcwotCQkJCXByb3Bvc2VkSW5mbyA9IGdldEFkZGl0aW9uYWxJbmZvKG51bGwsIGVsZW1lbnREZWNsKTsKLQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBudWxsOwotCQkJCWlmICgoY3VycmVudFZhbHVlICE9IG51bGwpICYmIChjdXJyZW50VmFsdWUubGVuZ3RoKCkgPiAwKSkgewotCQkJCQlTdHJpbmcgclZhbHVlID0gIlwiIiArIGN1cnJlbnRWYWx1ZSArICJcIiI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChyVmFsdWUsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCAxLCBpbWFnZSwgclZhbHVlLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1hNTF9BVFRSSUJVVEVfVkFMVUUpOwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJc2V0RXJyb3JNZXNzYWdlKFVOS05PV05fQ09OVEVYVCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb21tZW50UHJvcG9zYWwoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwobmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiPCEtLSAgLS0+IiwgLy8kTk9OLU5MUy0xJAotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgNSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DT01NRU5UKSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5Db21tZW50X18sIChuZXcgT2JqZWN0W117IiA8IS0tICAtLT4ifSkpLCAvLyROT04tTkxTLTEkCi0JCQkJCW51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NPTU1FTlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIG9mIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBpbnQgdGhlIENNQ29udGVudCBvYmplY3QgaW50byBvbmUKLQkgKiBiaWcgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50KExpc3QgY29udGVudExpc3QsIENNQ29udGVudCBjb250ZW50KSB7Ci0JCWlmIChjb250ZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIENNR3JvdXApIHsKLQkJCUNNTm9kZUxpc3QgY2hpbGRyZW4gPSAoKENNR3JvdXApIGNvbnRlbnQpLmdldENoaWxkTm9kZXMoKTsKLQkJCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJQ01Ob2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikgewotCQkJCQljb250ZW50TGlzdC5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkdST1VQKSB7Ci0JCQkJCQlhZGRDb250ZW50KGNvbnRlbnRMaXN0LCAoQ01Db250ZW50KSBjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGNvbnRlbnQgY2hpbGQ6ICIgKyBjaGlsZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWNvbnRlbnRMaXN0LmFkZChjb250ZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERvY1R5cGVQcm9wb3NhbChDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQkvLyBpZiBhIERvY3VtZW50RWxlbWVudCBleGlzdHMsIHVzZSB0aGF0IGZvciB0aGUgcm9vdCBFbGVtZW50IG5hbWUKLQkJU3RyaW5nIHJvb3RuYW1lID0gInVuc3BlY2lmaWVkIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpLmdldE93bmVyRG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlyb290bmFtZSA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKS5nZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Tm9kZU5hbWUoKTsKLQkJfQotCi0JCVN0cmluZyBwcm9wb3NlZFRleHQgPSAiPCFET0NUWVBFICIgKyByb290bmFtZSArICIgUFVCTElDIFwiLy9VTktOT1dOL1wiIFwidW5rbm93bi5kdGRcIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgMTAsIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRE9DVFlQRSksICI8IURPQ1RZUEUgLi4uID4iLCAvLyROT04tTkxTLTEkCi0JCQkJCW51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0RPQ1RZUEUpOwotCQkvLyBUT0RPIHByb3ZpZGUgc3BlY2lhbCBkb2N1bWVudGF0aW9uIG9uIGRvYyB0eXBlCi0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHByb3Bvc2FscyBmb3IgYSBjb21wbGV0ZWx5IGVtcHR5IGRvY3VtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW1wdHlEb2N1bWVudFByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQkvLyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBwcm9wb3NhbHMgZm9yIHRoZSBuYW1lIGluIGFuIGVuZCB0YWcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRUYWdOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0KLQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFN0YXJ0T2Zmc2V0KCkgKyBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKS5nZXRUZXh0TGVuZ3RoKCkgPCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSkgewotCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCAxLCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDKSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5DbG9zZV93aXRoX18sIChuZXcgT2JqZWN0W117IiAnPicifSkpLCAvLyROT04tTkxTLTEkCi0JCQkJCQludWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9FTkRfVEFHX05BTUUpOwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQl9Ci0JCWVsc2UgewotCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQlOb2RlIGFOb2RlID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKTsKLQkJCWlmIChtYXRjaFN0cmluZy5zdGFydHNXaXRoKCI8LyIpKSB7Ci0JCQkJbWF0Y2hTdHJpbmcgPSBtYXRjaFN0cmluZy5zdWJzdHJpbmcoMik7Ci0JCQl9Ci0JCQl3aGlsZSAoYU5vZGUgIT0gbnVsbCkgewotCQkJCWlmIChhTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCWlmIChhTm9kZS5nZXROb2RlTmFtZSgpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcpKSB7Ci0JCQkJCQlJRE9NTm9kZSBhWE1MTm9kZSA9IChJRE9NTm9kZSkgYU5vZGU7Ci0JCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIGFOb2RlKTsKLQkJCQkJCWlmICgoYVhNTE5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgJiYgKChlZCA9PSBudWxsKSB8fCAoZWQuZ2V0Q29udGVudFR5cGUoKSAhPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkpKSB7Ci0JCQkJCQkJU3RyaW5nIHJlcGxhY2VtZW50VGV4dCA9IGFOb2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkJCQkJU3RyaW5nIGRpc3BsYXlUZXh0ID0gcmVwbGFjZW1lbnRUZXh0OwotCQkJCQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSAoZWQgIT0gbnVsbCkgPyBnZXRBZGRpdGlvbmFsSW5mbyhudWxsLCBlZCkgOiBudWxsOwotCQkJCQkJCWlmKCFjb250ZW50QXNzaXN0UmVxdWVzdC5nZXREb2N1bWVudFJlZ2lvbigpLmlzRW5kZWQoKSkgewotCQkJCQkJCQlyZXBsYWNlbWVudFRleHQgKz0gIj4iOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG51bGw7Ci0JCQkJCQkJLy8gZG91YmxlIGNoZWNrIHRvIHNlZSBpZiB0aGUgcmVnaW9uIGFjdGVkIHVwb24gaXMKLQkJCQkJCQkvLyBhIHRhZyBuYW1lOyByZXBsYWNlIGl0IGlmIHNvCi0JCQkJCQkJSW1hZ2UgaW1hZ2UgPSBDTUltYWdlVXRpbC5nZXRJbWFnZShlZCk7Ci0JCQkJCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJCQkJaW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocmVwbGFjZW1lbnRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRTdGFydE9mZnNldCgpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKS5nZXRUZXh0TGVuZ3RoKCksIHJlcGxhY2VtZW50VGV4dC5sZW5ndGgoKSwgaW1hZ2UsIGRpc3BsYXlUZXh0LCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0VORF9UQUdfTkFNRSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocmVwbGFjZW1lbnRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgcmVwbGFjZW1lbnRUZXh0Lmxlbmd0aCgpLCBpbWFnZSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5DbG9zZV93aXRoX18sIChuZXcgT2JqZWN0W117IiciICsgZGlzcGxheVRleHQgKyAiJyJ9KSksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQludWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0VORF9UQUdfTkFNRSk7Ci0JCQkJCQkJfQotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlhTm9kZSA9IGFOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFByb21wdCBmb3IgZW5kIHRhZ3MgdG8gYSBub24tZW1wdHkgTm9kZSB0aGF0IGhhc24ndCBlbmRlZCBIYW5kbGVzIHRoZXNlCi0JICogY2FzZXM6IDxicj4KLQkgKiA8dGFnT3Blbj58IDxicj4KLQkgKiA8dGFnT3Blbj48IHw8YnI+Ci0JICogPHRhZ09wZW4+PC8gfAotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVuZFRhZ1Byb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRQYXJlbnQoKTsKLQotCQlpZiAoaXNDb21tZW50Tm9kZShub2RlKSkgewotCQkJLy8gbG9vcCBhbmQgZmluZCBub24gY29tbWVudCBub2RlIHBhcmVudAotCQkJd2hpbGUgKChub2RlICE9IG51bGwpICYmIGlzQ29tbWVudE5vZGUobm9kZSkpIHsKLQkJCQlub2RlID0gKElET01Ob2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJfQotCi0JCS8vIG5vZGUgaXMgYWxyZWFkeSBjbG9zZWQKLQkJaWYgKG5vZGUuaXNDbG9zZWQoKSkgewotCQkJLy8gbG9vcCBhbmQgZmluZCBub24gY29tbWVudCB1bmNsb3NlIG5vZGUgcGFyZW50Ci0JCQl3aGlsZSAoKG5vZGUgIT0gbnVsbCkgJiYgbm9kZS5pc0Nsb3NlZCgpKSB7Ci0JCQkJbm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJLy8gdGhlcmUgd2VyZSBubyB1bmNsb3NlZCB0YWdzCi0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGRhdGEgdG8gY3JlYXRlIGEgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsCi0JCVN0cmluZyByZXBsYWNlVGV4dCA9IG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI+IjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgcmVwbGFjZUJlZ2luID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCk7Ci0JCWludCByZXBsYWNlTGVuZ3RoID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKTsKLQkJaW50IGN1cnNvck9mZnNldCA9IG5vZGUuZ2V0Tm9kZU5hbWUoKS5sZW5ndGgoKSArIDE7Ci0JCVN0cmluZyBkaXNwbGF5U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUltYWdlIGltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyk7Ci0KLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQlib29sZWFuIGFkZFByb3Bvc2FsID0gZmFsc2U7Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHNEb2MgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZlRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24geG1sRW5kVGFnT3BlbiA9IHNEb2MuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkpOwotCQkJLy8gc2tpcCBiYWNrd2FyZCB0byAiPCIsICI8LyIsIG9yIHRoZSAodW5jbG9zZWQpIHN0YXJ0IHRhZywgbnVsbAotCQkJLy8gaWYgbm90IGZvdW5kCi0JCQlTdHJpbmcgdHlwZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAoKHhtbEVuZFRhZ09wZW4gIT0gbnVsbCkgJiYgKCh0eXBlID0geG1sRW5kVGFnT3Blbi5nZXRUeXBlKCkpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgJiYgKHR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSAmJiAhbmVlZHNFbmRUYWcoeG1sRW5kVGFnT3BlbikgJiYgKHR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pKSB7Ci0JCQkJeG1sRW5kVGFnT3BlbiA9IHhtbEVuZFRhZ09wZW4uZ2V0UHJldmlvdXMoKTsKLQkJCX0KLQotCQkJaWYgKHhtbEVuZFRhZ09wZW4gPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJbm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oeG1sRW5kVGFnT3Blbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCW5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQlpZiAoaXNTdGFydFRhZyh4bWxFbmRUYWdPcGVuKSkgewotCQkJCS8vIHRoaXMgaXMgdGhlIGNhc2UgZm9yIGEgc3RhcnQgdGFnIHcvb3V0IGVuZCB0YWcKLQkJCQkvLyBlZzoKLQkJCQkvLyA8cD4KLQkJCQkvLyA8JSBTdHJpbmcgdGVzdCA9ICJ0ZXN0IjsgJT4KLQkJCQkvLyB8Ci0JCQkJaWYgKG5lZWRzRW5kVGFnKHhtbEVuZFRhZ09wZW4pKSB7Ci0JCQkJCVN0cmluZyB0YWdOYW1lID0gZ2V0VGFnTmFtZSh4bWxFbmRUYWdPcGVuKTsKLQkJCQkJeG1sRW5kVGFnT3Blbi5nZXRUZXh0RW5kT2Zmc2V0KCk7Ci0JCQkJCXJlcGxhY2VMZW5ndGggPSAwOwotCQkJCQlyZXBsYWNlVGV4dCA9ICI8LyIgKyB0YWdOYW1lICsgIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgJE5PTi1OTFMtMiQKLQkJCQkJLy8gcmVwbGFjZVRleHQgPSAiPC8iICsgbm9kZS5nZXROb2RlTmFtZSgpICsgIj4iOwotCQkJCQkvLyAvLyROT04tTkxTLTEkICROT04tTkxTLTIkCi0JCQkJCWN1cnNvck9mZnNldCA9IHRhZ05hbWUubGVuZ3RoKCkgKyAzOwotCQkJCQlkaXNwbGF5U3RyaW5nID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbmRfd2l0aF9fLCAobmV3IE9iamVjdFtde3RhZ05hbWV9KSk7Ci0JCQkJCWFkZFByb3Bvc2FsID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJCS8vIHRoaXMgaXMgdGhlIGNhc2UgZm9yOiA8dGFnPiA8LyB8Ci0JCQkJLy8gcG9zc2libHkgPHRhZz4gPC8gfDxhbm90aGVyVGFnPgotCQkJCS8vIHNob3VsZCBvbmx5IGJlIHJlcGxhY2luZyB3aGl0ZSBzcGFjZS4uLgotCQkJCXJlcGxhY2VMZW5ndGggPSAocmVwbGFjZUJlZ2luID4geG1sRW5kVGFnT3Blbi5nZXRUZXh0RW5kT2Zmc2V0KCkpID8gcmVwbGFjZUJlZ2luIC0geG1sRW5kVGFnT3Blbi5nZXRUZXh0RW5kT2Zmc2V0KCkgOiAwOwotCQkJCXJlcGxhY2VUZXh0ID0gbm9kZS5nZXROb2RlTmFtZSgpICsgIj4iOyAvLyROT04tTkxTLTEkCi0JCQkJY3Vyc29yT2Zmc2V0ID0gcmVwbGFjZVRleHQubGVuZ3RoKCk7Ci0JCQkJcmVwbGFjZUJlZ2luID0geG1sRW5kVGFnT3Blbi5nZXRUZXh0RW5kT2Zmc2V0KCk7Ci0JCQkJZGlzcGxheVN0cmluZyA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuRW5kX3dpdGhfLCAobmV3IE9iamVjdFtde25vZGUuZ2V0Tm9kZU5hbWUoKX0pKTsKLQkJCQlhZGRQcm9wb3NhbCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQkJLy8gdGhpcyBpcyB0aGUgY2FzZSBmb3I6IDx0YWc+IDwgfAotCQkJCXJlcGxhY2VUZXh0ID0gIi8iICsgbm9kZS5nZXROb2RlTmFtZSgpICsgIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgJE5PTi1OTFMtMiQKLQkJCQljdXJzb3JPZmZzZXQgPSByZXBsYWNlVGV4dC5sZW5ndGgoKTsKLQkJCQkvLyByZXBsYWNlVGV4dCA9ICIvIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI+IjsgLy8kTk9OLU5MUy0xJAotCQkJCS8vICROT04tTkxTLTIkCi0JCQkJLy8gc2hvdWxkIG9ubHkgYmUgcmVwbGFjaW5nIHdoaXRlIHNwYWNlLi4uCi0JCQkJcmVwbGFjZUxlbmd0aCA9IChyZXBsYWNlQmVnaW4gPiB4bWxFbmRUYWdPcGVuLmdldFRleHRFbmRPZmZzZXQoKSkgPyByZXBsYWNlQmVnaW4gLSB4bWxFbmRUYWdPcGVuLmdldFRleHRFbmRPZmZzZXQoKSA6IDA7Ci0JCQkJcmVwbGFjZUJlZ2luID0geG1sRW5kVGFnT3Blbi5nZXRUZXh0RW5kT2Zmc2V0KCk7Ci0JCQkJZGlzcGxheVN0cmluZyA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuRW5kX3dpdGhfLCAobmV3IE9iamVjdFtdeyIvIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFkZFByb3Bvc2FsID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJLy8gc29tZXRpbWVzIHRoZSBub2RlIGlzIG5vdCBudWxsLCBidXQKLQkJLy8gZ2V0Tm9kZVZhbHVlKCkgaXMgbnVsbCwgcHV0IGluIGEgbnVsbCBjaGVjawotCQllbHNlIGlmICgobm9kZS5nZXROb2RlVmFsdWUoKSAhPSBudWxsKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS5pbmRleE9mKCI8LyIpICE9IC0xKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyB0aGUgY2FzZSB3aGVyZSAiPC8iIGlzIHN0YXJ0ZWQsIGJ1dCB0aGUgbm9kZXMgY29tZXMgaW4gYXMgYQotCQkJLy8gdGV4dCBub2RlIChpbnN0ZWFkIG9mIGVsZW1lbnQpCi0JCQkvLyBsaWtlIHRoaXM6IDx0YWc+IDwvfAotCQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpKSB7Ci0JCQkJcmVwbGFjZVRleHQgPSBwYXJlbnQuZ2V0Tm9kZU5hbWUoKSArICI+IjsgLy8kTk9OLU5MUy0xJAotCQkJCWN1cnNvck9mZnNldCA9IHJlcGxhY2VUZXh0Lmxlbmd0aCgpOwotCQkJCWRpc3BsYXlTdHJpbmcgPSBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkVuZF93aXRoX18sIChuZXcgT2JqZWN0W117cGFyZW50LmdldE5vZGVOYW1lKCl9KSk7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCWFkZFByb3Bvc2FsID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKFVOS05PV05fQ09OVEVYVCk7Ci0JCX0KLQkJaWYgKGFkZFByb3Bvc2FsID09IHRydWUpIHsKLQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocmVwbGFjZVRleHQsIHJlcGxhY2VCZWdpbiwgcmVwbGFjZUxlbmd0aCwgY3Vyc29yT2Zmc2V0LCBpbWFnZSwgZGlzcGxheVN0cmluZywgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9FTkRfVEFHKTsKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVudGl0eVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGRvY3VtZW50UG9zaXRpb24sIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlKSB7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBlcHMgPSBjb21wdXRlRW50aXR5UmVmZXJlbmNlUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlKTsKLQkJZm9yIChpbnQgaSA9IDA7IChlcHMgIT0gbnVsbCkgJiYgKGkgPCBlcHMubGVuZ3RoKTsgaSsrKSB7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChlcHNbaV0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW50aXR5UHJvcG9zYWxzKFZlY3RvciBwcm9wb3NhbHMsIFByb3BlcnRpZXMgbWFwLCBTdHJpbmcga2V5LCBpbnQgbm9kZU9mZnNldCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbikgewotCQlpZiAobWFwID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgZW50aXR5TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBlbnRpdHlWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUltYWdlIGVudGl0eUljb24gPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0VOVElUWV9SRUZFUkVOQ0UpOwotCQlTdHJpbmcgcmVwbGFjZW1lbnRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlFbnVtZXJhdGlvbiBrZXlzID0gbWFwLmtleXMoKTsKLQotCQl3aGlsZSAoKGtleXMgIT0gbnVsbCkgJiYga2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJZW50aXR5TmFtZSA9IChTdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKTsKLQkJCWVudGl0eVZhbHVlID0gbWFwLmdldFByb3BlcnR5KGVudGl0eU5hbWUpOwotCQkJLy8gZmlsdGVyIGJhc2VkIG9uIHBhcnRpYWwgZW50aXR5IHN0cmluZy4uLgotCQkJaWYgKGVudGl0eU5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGtleS50b0xvd2VyQ2FzZSgpKSB8fCBrZXkudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQkvLyBmaWd1cmUgb3V0IHNlbGVjdGlvbi4uLmlmIHRleHQgaXMgc2VsZWN0ZWQsIGFkZCBpdCB0bwotCQkJCS8vIHNlbGVjdGlvbiBsZW5ndGgKLQkJCQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gbm9kZU9mZnNldDsKLQkJCQlpZiAoZlRleHRWaWV3ZXIgIT0gbnVsbCkgewotCQkJCQlzZWxlY3Rpb25MZW5ndGggKz0gZlRleHRWaWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpLnk7Ci0JCQkJfQotCQkJCS8vIGNyZWF0ZSBhIG5ldyBwcm9wb3NhbCBmb3IgZW50aXR5IHN0cmluZy4uLgotCQkJCXJlcGxhY2VtZW50VGV4dCA9ICImIiArIGVudGl0eU5hbWUgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQlkaXNwbGF5U3RyaW5nID0gIiYiICsgZW50aXR5TmFtZSArICI7ICgiICsgZW50aXR5VmFsdWUgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBjcCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocmVwbGFjZW1lbnRUZXh0LCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSwgc2VsZWN0aW9uTGVuZ3RoLCByZXBsYWNlbWVudFRleHQubGVuZ3RoKCksIGVudGl0eUljb24sIGRpc3BsYXlTdHJpbmcsIG51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0VOVElUWSk7Ci0JCQkJaWYgKGNwICE9IG51bGwpIHsKLQkJCQkJcHJvcG9zYWxzLmFkZChjcCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUENEQVRBUHJvcG9zYWwoU3RyaW5nIG5vZGVOYW1lLCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCI8IVtDREFUQVtdXT4iLCAvLyROT04tTkxTLTEkCi0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCA5LCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NEQVRBU0VDVElPTiksICJDREFUQSBTZWN0aW9uIiwgLy8kTk9OLU5MUy0xJAotCQkJCQludWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DREFUQSk7Ci0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQotCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwobm9kZU5hbWUsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBub2RlTmFtZS5sZW5ndGgoKSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UWFRFWFQpLCAiI1BDREFUQSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfQ0RBVEEpOwotCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3RhcnREb2N1bWVudFByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlOb2RlIGFOb2RlID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCQlib29sZWFuIHhtbHBpRm91bmQgPSBmYWxzZTsKLQkJRG9jdW1lbnQgb3duaW5nRG9jdW1lbnQgPSBhTm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCS8vID09PiAvLyBpbnQgeG1scGlOb2RlUG9zaXRpb24gPSAtMTsKLQotCQkvLyBtYWtlIHN1cmUgeG1scGkgaXMgcm9vdCBlbGVtZW50Ci0JCS8vIGRvbid0IHdhbnQgZG9jdHlwZSBwcm9wb3NhbCBpZiBYTUxQSSBpc24ndCBmaXJzdCBlbGVtZW50Li4uCi0JCU5vZGUgZmlyc3QgPSBvd25pbmdEb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCWJvb2xlYW4geG1scGlJc0ZpcnN0RWxlbWVudCA9ICgoZmlyc3QgIT0gbnVsbCkgJiYgKGZpcnN0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpKTsKLQkJYm9vbGVhbiBpbnNlcnREb2N0eXBlID0geG1scGlJc0ZpcnN0RWxlbWVudDsKLQotCQlmb3IgKE5vZGUgY2hpbGQgPSBvd25pbmdEb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJYm9vbGVhbiB4bWxwaSA9ICgoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInhtbCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJeG1scGlGb3VuZCA9IHhtbHBpRm91bmQgfHwgeG1scGk7Ci0JCQlpZiAoeG1scGlGb3VuZCkgewotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJCS8vID09PiAvLyBpbnQgeG1scGlOb2RlUG9zaXRpb24gPQotCQkJCQkvLyAoKFhNTE5vZGUpY2hpbGQpLmdldEVuZE9mZnNldCgpOwotCQkJCX0KLQkJCQkvLyBza2lwIHdoaXRlIHNwYWNlIGFuZCB0ZXh0Ci0JCQkJd2hpbGUgKCgoY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSAhPSBudWxsKSAmJiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkpIHsKLQkJCQkJLy8ganVzdCBza2lwcGluZwotCQkJCX0KLQkJCQkvLyBjaGVjayBpZiB0aGVyZXMgYSBub2RlIGluYmV0d2VlbiBYTUxQSSBhbmQgY3Vyc29yIHBvc2l0aW9uCi0JCQkJaWYgKChjaGlsZCAhPSBudWxsKSAmJiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkpIHsKLQkJCQkJaWYgKChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSA+PSAoKElET01Ob2RlKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCkpIHx8ICF4bWxwaUlzRmlyc3RFbGVtZW50KSB7Ci0JCQkJCQlpbnNlcnREb2N0eXBlID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoeG1scGlGb3VuZCAmJiAob3duaW5nRG9jdW1lbnQuZ2V0RG9jdHlwZSgpID09IG51bGwpICYmIGlzQ3Vyc29yQWZ0ZXJYTUxQSShjb250ZW50QXNzaXN0UmVxdWVzdCkgJiYgaW5zZXJ0RG9jdHlwZSkgewotCQkJYWRkRG9jVHlwZVByb3Bvc2FsKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENsb3NlIGFuIHVuY2xvc2VkIHN0YXJ0IHRhZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ0Nsb3NlUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFBhcmVudCgpOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0KLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24obm9kZSk7Ci0JCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gKGVsZW1lbnREZWNsICE9IG51bGwpID8gZ2V0QWRkaXRpb25hbEluZm8obnVsbCwgZWxlbWVudERlY2wpIDogbnVsbDsKLQkJCWludCBjb250ZW50VHlwZSA9IChlbGVtZW50RGVjbCAhPSBudWxsKSA/IGVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgOiBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlk7Ci0JCQkvLyBpZiBpdCdzIFhNTCBhbmQgY29udGVudCBkb2Vzbid0IEhBVkUgdG8gYmUgZWxlbWVudCwgYWRkICIvPiIKLQkJCS8vIHByb3Bvc2FsLgotCQkJYm9vbGVhbiBlbmRXaXRoU2xhc2hCcmFja2V0ID0gKGdldFhNTChub2RlKSAmJiAoY29udGVudFR5cGUgIT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCkpOwotCi0JCQlJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGVsZW1lbnREZWNsKTsKLQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJaW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDKTsKLQkJCX0KLQotCQkJLy8gaXMgdGhlIHN0YXJ0IHRhZyBlbmRlZCBwcm9wZXJseT8KLQkJCWlmICgoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0RG9jdW1lbnRSZWdpb24oKSA9PSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpICYmICEobm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKS5pc0VuZGVkKCkpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJLy8gSXMgdGhpcyBzdXBwb3NlZCB0byBiZSBhbiBlbXB0eSB0YWc/IE5vdGUgdGhhdCBpZiB3ZSBjYW4ndAotCQkJCS8vIHRlbGwsIHdlIGFzc3VtZSBpdCdzIG5vdC4KLQkJCQlpZiAoKGVsZW1lbnREZWNsICE9IG51bGwpICYmIChlbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKSkgewotCQkJCQkvLyBwcm9tcHQgd2l0aCBhIHNlbGYtY2xvc2luZyBlbmQgY2hhcmFjdGVyIGlmIG5lZWRlZAotCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKGdldENvbnRlbnRHZW5lcmF0b3IoKS5nZXRTdGFydFRhZ0Nsb3NlKG5vZGUsIGVsZW1lbnREZWNsKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksCi0JCQkJCS8vIHRoaXMgaXMgb25lIG9mIHRoZSBmZXcgdGltZXMgdG8gaWdub3JlIHRoZSBsZW5ndGggLS0KLQkJCQkJCQkJLy8gYWx3YXlzIGluc2VydAotCQkJCQkJCQkvLyBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLAotCQkJCQkJCQkwLCBnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0U3RhcnRUYWdDbG9zZShub2RlLCBlbGVtZW50RGVjbCkubGVuZ3RoKCksIGltYWdlLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkNsb3NlX3dpdGhfX18sIChuZXcgT2JqZWN0W117Z2V0Q29udGVudEdlbmVyYXRvcigpLmdldFN0YXJ0VGFnQ2xvc2Uobm9kZSwgZWxlbWVudERlY2wpfSkpLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NMT1NFX1RBRyk7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHByb21wdCB3aXRoIGEgY2xvc2UgZm9yIHRoZSBzdGFydCB0YWcKLQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksCi0JCQkJCQkJCS8vIHRoaXMgaXMgb25lIG9mIHRoZSBmZXcgdGltZXMgdG8gaWdub3JlIHRoZQotCQkJCQkJCQkvLyBsZW5ndGggLS0gYWx3YXlzIGluc2VydAotCQkJCQkJCQkvLyBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLAotCQkJCQkJCQkwLCAxLCBpbWFnZSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5DbG9zZV93aXRoX18sIChuZXcgT2JqZWN0W117IiAnPicifSkpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCW51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfQ0xPU0VfVEFHKTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCi0JCQkJCS8vIHByb21wdCB3aXRoIHRoZSBjbG9zZXIgZm9yIHRoZSBzdGFydCB0YWcgYW5kIGFuIGVuZCB0YWcKLQkJCQkJLy8gaWYgb25lIGlzIG5vdCBwcmVzZW50Ci0JCQkJCWlmIChub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpIHsKLQkJCQkJCS8vIG1ha2Ugc3VyZSB0YWcgbmFtZSBpcyBhY3R1YWxseSB3aGF0IGl0IHRoaW5rcyBpdAotCQkJCQkJLy8gaXMuLi4oZWcuIDwlQCB2cy4gPGpzcDpkaXJlY3RpdmUpCi0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkciA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQlTdHJpbmcgb3BlbmluZ1RhZ1RleHQgPSAoc2RyICE9IG51bGwpID8gc2RyLmdldEZ1bGxUZXh0KCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKChvcGVuaW5nVGFnVGV4dCAhPSBudWxsKSAmJiAob3BlbmluZ1RhZ1RleHQuaW5kZXhPZihub2RlLmdldE5vZGVOYW1lKCkpICE9IC0xKSkgewotCQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiPjwvIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI+IiwgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwKLQkJCQkJCQkJCQkvLyB0aGlzIGlzIG9uZSBvZiB0aGUgZmV3IHRpbWVzIHRvCi0JCQkJCQkJCQkJLy8gaWdub3JlIHRoZSBsZW5ndGggLS0gYWx3YXlzIGluc2VydAotCQkJCQkJCQkJCS8vIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksCi0JCQkJCQkJCQkJMCwgMSwgaW1hZ2UsIE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuQ2xvc2Vfd2l0aF9fX18sIChuZXcgT2JqZWN0W117bm9kZS5nZXROb2RlTmFtZSgpfSkpLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NMT1NFX1RBRyk7Ci0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIHByb21wdCB3aXRoIHNsYXNoIGJyYWNrZXQgIi8+IiBpbmNhc2UgaWYgaXQncyBhIHNlbGYKLQkJCQkJLy8gZW5kaW5nIHRhZwotCQkJCQlpZiAoZW5kV2l0aFNsYXNoQnJhY2tldCkgewotCQkJCQkJcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCIvPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLAotCQkJCQkJCQkJLy8gdGhpcyBpcyBvbmUgb2YgdGhlIGZldyB0aW1lcyB0byBpZ25vcmUKLQkJCQkJCQkJCS8vIHRoZSBsZW5ndGggLS0gYWx3YXlzIGluc2VydAotCQkJCQkJCQkJLy8gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwKLQkJCQkJCQkJCTAsIDIsIGltYWdlLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkNsb3NlX3dpdGhfXywgKG5ldyBPYmplY3RbXXsiIFwiLz5cIiJ9KSksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCW51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfQ0xPU0VfVEFHICsgMSk7IC8vICsxCi0JCQkJCQkvLyB0bwotCQkJCQkJLy8gYnJpbmcKLQkJCQkJCS8vIHRvCi0JCQkJCQkvLyB0b3AKLQkJCQkJCS8vIG9mCi0JCQkJCQkvLyBsaXN0Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICgoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0RG9jdW1lbnRSZWdpb24oKSA9PSBub2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSkgJiYgIW5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmlzRW5kZWQoKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQkvLyBwcm9tcHQgd2l0aCBhIGNsb3NpbmcgZW5kIGNoYXJhY3RlciBmb3IgdGhlIGVuZCB0YWcKLQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCI+IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLAotCQkJCQkJCS8vIHRoaXMgaXMgb25lIG9mIHRoZSBmZXcgdGltZXMgdG8gaWdub3JlIHRoZQotCQkJCQkJCS8vIGxlbmd0aCAtLSBhbHdheXMgaW5zZXJ0Ci0JCQkJCQkJLy8gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwKLQkJCQkJCQkwLCAxLCBpbWFnZSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5DbG9zZV93aXRoX18sIChuZXcgT2JqZWN0W117IiAnPicifSkpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DTE9TRV9UQUcpOwotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoVU5LTk9XTl9DT05URVhUKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ0luc2VydGlvblByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGNoaWxkUG9zaXRpb24pIHsKLQkJTGlzdCBjbW5vZGVzID0gbnVsbDsKLQkJTm9kZSBwYXJlbnQgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRQYXJlbnQoKTsKLQkJU3RyaW5nIGVycm9yID0gbnVsbDsKLQotCQkvLyAobnNkKSBUaGlzIGlzIG9ubHkgdmFsaWQgYXQgdGhlIGRvY3VtZW50IGVsZW1lbnQgbGV2ZWwKLQkJLy8gb25seSB2YWxpZCBpZiBpdCdzIFhNTCAoY2hlY2sgYWRkZWQgMi8xNy8yMDA0KQotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAoKElET01Eb2N1bWVudCkgcGFyZW50KS5pc1hNTFR5cGUoKSAmJiAhaXNDdXJzb3JBZnRlclhNTFBJKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIG9ubHkgd2FudCBwcm9wb3NhbHMgaWYgY3Vyc29yIGlzIGFmdGVyIGRvY3R5cGUuLi4KLQkJaWYgKCFpc0N1cnNvckFmdGVyRG9jdHlwZShjb250ZW50QXNzaXN0UmVxdWVzdCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGZpeCBmb3IgbWV0YS1pbmZvIGNvbW1lbnQgbm9kZXMuLiB0aGV5IGN1cnJlbnRseSAiaGlkZSIgb3RoZXIKLQkJLy8gcHJvcG9zYWxzIGJlY2F1c2UgdGhlIGRvbid0Ci0JCS8vIGhhdmUgYSBjb250ZW50IG1vZGVsIChzbyBjYW4ndCBwcm9wb3NlIGFueSBjaGlsZHJlbi4uKQotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgSURPTU5vZGUpICYmIGlzQ29tbWVudE5vZGUoKElET01Ob2RlKSBwYXJlbnQpKSB7Ci0JCQkvLyBsb29wIGFuZCBmaW5kIG5vbiBjb21tZW50IG5vZGU/Ci0JCQl3aGlsZSAoKHBhcmVudCAhPSBudWxsKSAmJiBpc0NvbW1lbnROb2RlKChJRE9NTm9kZSkgcGFyZW50KSkgewotCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudERlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnQpOwotCQkJaWYgKHBhcmVudERlY2wgIT0gbnVsbCkgewotCQkJCS8vIFhTRC1zcGVjaWZpYyBhYmlsaXR5IC0gbm8gZmlsdGVyaW5nCi0JCQkJQ01EYXRhVHlwZSBjaGlsZFR5cGUgPSBwYXJlbnREZWNsLmdldERhdGFUeXBlKCk7Ci0JCQkJaWYgKGNoaWxkVHlwZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZ1tdIGNoaWxkU3RyaW5ncyA9IGNoaWxkVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0JCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBjaGlsZFR5cGUuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JCQkJCWlmIChjaGlsZFN0cmluZ3MgIT0gbnVsbCB8fCBkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJLy8gdGhlIGNvbnRlbnQgc3RyaW5nIGlzIHRoZSBzb2xlIHZhbGlkIGNoaWxkLi4uc28KLQkJCQkJCS8vIHJlcGxhY2UgdGhlIHJlc3QKLQkJCQkJCWludCBiZWdpbiA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpOwotCQkJCQkJaW50IGxlbmd0aCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCk7Ci0JCQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQkJCQlpZiAoKChJRE9NTm9kZSkgcGFyZW50KS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gKChJRE9NTm9kZSkgcGFyZW50KS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKSB7Ci0JCQkJCQkJCWJlZ2luID0gKChJRE9NTm9kZSkgcGFyZW50KS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCgpOwotCQkJCQkJCQlsZW5ndGggPSAoKElET01Ob2RlKSBwYXJlbnQpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpIC0gYmVnaW47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IGdldEFkZGl0aW9uYWxJbmZvKHBhcmVudERlY2wsIGNoaWxkVHlwZSk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkU3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWlmKCFjaGlsZFN0cmluZ3NbaV0uZXF1YWxzKGRlZmF1bHRWYWx1ZSkpCi0JCQkJCQkJewotCQkJCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgdGV4dFByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChjaGlsZFN0cmluZ3NbaV0sIGJlZ2luLCBsZW5ndGgsIGNoaWxkU3RyaW5nc1tpXS5sZW5ndGgoKSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTlVNKSwgY2hpbGRTdHJpbmdzW2ldLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1RBR19JTlNFUlRJT04pOwotCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbCh0ZXh0UHJvcG9zYWwpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHRleHRQcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoZGVmYXVsdFZhbHVlLCBiZWdpbiwgbGVuZ3RoLCBkZWZhdWx0VmFsdWUubGVuZ3RoKCksIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfREVGQVVMVCksIGRlZmF1bHRWYWx1ZSwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9UQUdfSU5TRVJUSU9OKTsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbCh0ZXh0UHJvcG9zYWwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKChwYXJlbnREZWNsICE9IG51bGwpICYmIChwYXJlbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBKSkgewotCQkJCWFkZFBDREFUQVByb3Bvc2FsKHBhcmVudERlY2wuZ2V0Tm9kZU5hbWUoKSwgY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gcmV0cmlldmUgdGhlIGxpc3Qgb2YgYWxsIHBvc3NpYmxlIGNoaWxkcmVuIHdpdGhpbiB0aGlzCi0JCQkJLy8gcGFyZW50IGNvbnRleHQKLQkJCQljbW5vZGVzID0gZ2V0QXZhaWxhYmxlQ2hpbGRFbGVtZW50RGVjbGFyYXRpb25zKChFbGVtZW50KSBwYXJlbnQsIGNoaWxkUG9zaXRpb24sIE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJUKTsKLQotCQkJCS8vIHJldHJpZXZlIHRoZSBsaXN0IG9mIHRoZSBwb3NzaWJsZSBjaGlsZHJlbiB3aXRoaW4gdGhpcwotCQkJCS8vIHBhcmVudCBjb250ZXh0IGFuZCBhdCB0aGlzIGluZGV4Ci0JCQkJTGlzdCBzdHJpY3RDTU5vZGVTdWdnZXN0aW9ucyA9IG51bGw7Ci0JCQkJaWYgKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1lfVkFMVUVfU1RSSUNULmVxdWFscyhYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZKSkpIHsKLQkJCQkJc3RyaWN0Q01Ob2RlU3VnZ2VzdGlvbnMgPSBnZXRWYWxpZENoaWxkRWxlbWVudERlY2xhcmF0aW9ucygoRWxlbWVudCkgcGFyZW50LCBjaGlsZFBvc2l0aW9uLCBNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCk7Ci0JCQkJfQotCQkJCUl0ZXJhdG9yIG5vZGVJdGVyYXRvciA9IGNtbm9kZXMuaXRlcmF0b3IoKTsKLQkJCQlpZiAoIW5vZGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJaWYgKGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudCkgIT0gbnVsbCkgewotCQkJCQkJZXJyb3IgPSBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLl9IYXNfbm9fYXZhaWxhYmxlX2NoaWxkLCAobmV3IE9iamVjdFtde3BhcmVudC5nZXROb2RlTmFtZSgpfSkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZXJyb3IgPSBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkVsZW1lbnRfX2lzX3Vua25vd24sIChuZXcgT2JqZWN0W117cGFyZW50LmdldE5vZGVOYW1lKCl9KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKTsKLQkJCQkvLyBjaG9wIG9mZiBhbnkgbGVhZGluZyA8J3MgYW5kIHdoaXRlc3BhY2UgZnJvbSB0aGUKLQkJCQkvLyBtYXRjaHN0cmluZwotCQkJCXdoaWxlICgobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPiAwKSAmJiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShtYXRjaFN0cmluZy5jaGFyQXQoMCkpIHx8IGJlZ2luc1dpdGgobWF0Y2hTdHJpbmcsICI8IikpKSB7Ci0JCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJbWF0Y2hTdHJpbmcgPSBtYXRjaFN0cmluZy5zdWJzdHJpbmcoMSk7Ci0JCQkJfQotCQkJCXdoaWxlIChub2RlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBvID0gbm9kZUl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIG87Ci0JCQkJCQkvLyBvbmx5IGFkZCBwcm9wb3NhbHMgZm9yIHRoZSBjaGlsZCBlbGVtZW50J3MgdGhhdAotCQkJCQkJLy8gYmVnaW4gd2l0aCB0aGUgbWF0Y2hzdHJpbmcKLQkJCQkJCVN0cmluZyB0YWduYW1lID0gZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWxlbWVudERlY2wpOwotCQkJCQkJYm9vbGVhbiBpc1N0cmljdENNTm9kZVN1Z2dlc3Rpb24gPSBzdHJpY3RDTU5vZGVTdWdnZXN0aW9ucyAhPSBudWxsID8gc3RyaWN0Q01Ob2RlU3VnZ2VzdGlvbnMuY29udGFpbnMoZWxlbWVudERlY2wpIDogZmFsc2U7Ci0KLQkJCQkJCUltYWdlIGltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoZWxlbWVudERlY2wpOwotCi0JCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJCWlmIChzdHJpY3RDTU5vZGVTdWdnZXN0aW9ucyAhPSBudWxsKSB7Ci0JCQkJCQkJCWltYWdlID0gaXNTdHJpY3RDTU5vZGVTdWdnZXN0aW9uID8gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQ19FTVBIQVNJWkVEKSA6IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUNfREVFTVBIQVNJWkVEKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyk7Ci0JCQkJCQkJfQotCi0JCQkJCQl9Ci0KLQkJCQkJCS8vIGludCBtYXJrdXBBZGp1c3RtZW50ID0KLQkJCQkJCS8vIGdldENvbnRlbnRHZW5lcmF0b3IoKS5nZXRNaW5pbWFsU3RhcnRUYWdMZW5ndGgocGFyZW50LAotCQkJCQkJLy8gZWxlbWVudERlY2wpOwotCQkJCQkJaWYgKGJlZ2luc1dpdGgodGFnbmFtZSwgbWF0Y2hTdHJpbmcpKSB7Ci0JCQkJCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9IGdldFJlcXVpcmVkVGV4dChwYXJlbnQsIGVsZW1lbnREZWNsKTsKLQotCQkJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04OTgxMQotCQkJCQkJCS8vIHBsYWNlIGN1cnNvciBpbiBmaXJzdCBlbXB0eSBxdW90ZXMKLQkJCQkJCQlpbnQgbWFya3VwQWRqdXN0bWVudCA9IGdldEN1cnNvclBvc2l0aW9uRm9yUHJvcG9zZWRUZXh0KHByb3Bvc2VkVGV4dCk7Ci0KLQkJCQkJCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8ocGFyZW50RGVjbCwgZWxlbWVudERlY2wpOwotCQkJCQkJCWludCByZWxldmFuY2UgPSBpc1N0cmljdENNTm9kZVN1Z2dlc3Rpb24gPyBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9TVFJJQ1RMWV9WQUxJRF9UQUdfSU5TRVJUSU9OIDogWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfVEFHX0lOU0VSVElPTjsKLQkJCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2VkVGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIG1hcmt1cEFkanVzdG1lbnQsIGltYWdlLCB0YWduYW1lLCBudWxsLCBwcm9wb3NlZEluZm8sIHJlbGV2YW5jZSk7Ci0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRQcm9wb3NhbHMoKS5zaXplKCkgPT0gMCkgewotCQkJCQlpZiAoZXJyb3IgIT0gbnVsbCkgewotCQkJCQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICgoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKSAhPSBudWxsKSAmJiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5Ob19rbm93bl9jaGlsZF90YWcsIChuZXcgT2JqZWN0W117cGFyZW50LmdldE5vZGVOYW1lKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCl9KSkpOwotCQkJCQkJLy8kTk9OLU5MUy0xJCA9ICJObyBrbm93biBjaGlsZCB0YWcgbmFtZXMgb2YgPHswfT4gYmVnaW4gd2l0aCBcInsxfVwiLiIKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxVSU1lc3NhZ2VzLl9fSGFzX25vX2tub3duX2NoaWxkLCAobmV3IE9iamVjdFtde3BhcmVudC5nZXROb2RlTmFtZSgpfSkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCS8vIENhbiBvbmx5IHByb21wdCB3aXRoIGVsZW1lbnRzIGlmIHRoZSBjdXJzb3IgcG9zaXRpb24gaXMgcGFzdAotCQkJLy8gdGhlIFhNTCBwcm9jZXNzaW5nCi0JCQkvLyBpbnN0cnVjdGlvbiBhbmQgRE9DVFlQRSBkZWNsYXJhdGlvbgotCQkJYm9vbGVhbiB4bWxwaUZvdW5kID0gZmFsc2U7Ci0JCQlib29sZWFuIGRvY3R5cGVGb3VuZCA9IGZhbHNlOwotCQkJaW50IG1pbmltdW1PZmZzZXQgPSAtMTsKLQotCQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0KLQkJCQlib29sZWFuIHhtbHBpID0gKChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSAmJiBjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscygieG1sIikpOyAvLyROT04tTkxTLTEkCi0JCQkJYm9vbGVhbiBkb2N0eXBlID0gY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERTsKLQkJCQlpZiAoeG1scGkgfHwgKGRvY3R5cGUgJiYgKG1pbmltdW1PZmZzZXQgPCAwKSkpIHsKLQkJCQkJbWluaW11bU9mZnNldCA9ICgoSURPTU5vZGUpIGNoaWxkKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCkgKyAoKElET01Ob2RlKSBjaGlsZCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJfQotCQkJCXhtbHBpRm91bmQgPSB4bWxwaUZvdW5kIHx8IHhtbHBpOwotCQkJCWRvY3R5cGVGb3VuZCA9IGRvY3R5cGVGb3VuZCB8fCBkb2N0eXBlOwotCQkJfQotCi0JCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgPj0gbWluaW11bU9mZnNldCkgewotCQkJCUxpc3QgY2hpbGREZWNscyA9IGdldEF2YWlsYWJsZVJvb3RDaGlsZHJlbigoRG9jdW1lbnQpIHBhcmVudCwgY2hpbGRQb3NpdGlvbik7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZERlY2xzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBjaGlsZERlY2xzLmdldChpKTsKLQkJCQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCQkJCUltYWdlIGltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoZWQpOwotCQkJCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJCQlpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9IGdldFJlcXVpcmVkVGV4dChwYXJlbnQsIGVkKTsKLQkJCQkJCVN0cmluZyB0YWduYW1lID0gZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWQpOwotCQkJCQkJLy8gYWNjb3VudCBmb3IgdGhlICZsdDsgYW5kICZndDsKLQkJCQkJCWludCBtYXJrdXBBZGp1c3RtZW50ID0gZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldE1pbmltYWxTdGFydFRhZ0xlbmd0aChwYXJlbnQsIGVkKTsKLQkJCQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSBnZXRBZGRpdGlvbmFsSW5mbyhudWxsLCBlZCk7Ci0JCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2VkVGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIG1hcmt1cEFkanVzdG1lbnQsIGltYWdlLCB0YWduYW1lLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1RBR19JTlNFUlRJT04pOwotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnTmFtZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGNoaWxkUG9zaXRpb24pIHsKLQkJTGlzdCBjbW5vZGVzID0gbnVsbDsKLQkJTm9kZSBwYXJlbnQgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRQYXJlbnQoKTsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCQlTdHJpbmcgZXJyb3IgPSBudWxsOwotCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpOwotCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCS8vIHJldHJpZXZlIHRoZSBsaXN0IG9mIGNoaWxkcmVuCi0JCQkvLyB2YWxpZEFjdGlvbnMgPSBnZXRBdmFpbGFibGVDaGlsZHJlbkF0SW5kZXgoKEVsZW1lbnQpIHBhcmVudCwKLQkJCS8vIGNoaWxkUG9zaXRpb24pOwotCQkJY21ub2RlcyA9IGdldEF2YWlsYWJsZUNoaWxkRWxlbWVudERlY2xhcmF0aW9ucygoRWxlbWVudCkgcGFyZW50LCBjaGlsZFBvc2l0aW9uLCBNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCk7Ci0JCQlJdGVyYXRvciBub2RlSXRlcmF0b3IgPSBjbW5vZGVzLml0ZXJhdG9yKCk7Ci0JCQkvLyBjaG9wIG9mZiBhbnkgbGVhZGluZyA8J3MgYW5kIHdoaXRlc3BhY2UgZnJvbSB0aGUgbWF0Y2hzdHJpbmcKLQkJCXdoaWxlICgobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPiAwKSAmJiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShtYXRjaFN0cmluZy5jaGFyQXQoMCkpIHx8IGJlZ2luc1dpdGgobWF0Y2hTdHJpbmcsICI8IikpKSB7Ci0JCQkJLy8kTk9OLU5MUy0xJAotCQkJCW1hdGNoU3RyaW5nID0gbWF0Y2hTdHJpbmcuc3Vic3RyaW5nKDEpOwotCQkJfQotCQkJaWYgKCFub2RlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJZXJyb3IgPSBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLl9fSGFzX25vX2tub3duX2NoaWxkLCAobmV3IE9iamVjdFtde3BhcmVudC5nZXROb2RlTmFtZSgpfSkpOwotCQkJfQotCQkJd2hpbGUgKG5vZGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlDTU5vZGUgZWxlbWVudERlY2wgPSAoQ01Ob2RlKSBub2RlSXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJCS8vIG9ubHkgYWRkIHByb3Bvc2FscyBmb3IgdGhlIGNoaWxkIGVsZW1lbnQncyB0aGF0IGJlZ2luCi0JCQkJCS8vIHdpdGggdGhlIG1hdGNoc3RyaW5nCi0JCQkJCVN0cmluZyBwcm9wb3NlZFRleHQgPSBudWxsOwotCQkJCQlpbnQgY3Vyc29yQWRqdXN0bWVudCA9IDA7Ci0KLQkJCQkJLy8gZG8gYSBjaGVjayB0byBzZWUgaWYgcGFydGlhbCBhdHRyaWJ1dGVzIG9mIHBhcnRpYWwgdGFnCi0JCQkJCS8vIG5hbWVzIGFyZSBpbiBsaXN0Ci0JCQkJCWlmICgoKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0QXR0cmlidXRlcygpICE9IG51bGwpICYmIChub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXRMZW5ndGgoKSA+IDApICYmIGF0dHJpYnV0ZUluTGlzdChub2RlLCBwYXJlbnQsIGVsZW1lbnREZWNsKSkgfHwgKChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpICYmIG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5pc0VuZGVkKCkpKSB7Ci0KLQkJCQkJCXByb3Bvc2VkVGV4dCA9IGdldFJlcXVpcmVkTmFtZShwYXJlbnQsIGVsZW1lbnREZWNsKTsKLQkJCQkJCWN1cnNvckFkanVzdG1lbnQgPSBwcm9wb3NlZFRleHQubGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlwcm9wb3NlZFRleHQgPSBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlbGVtZW50RGVjbCk7Ci0JCQkJCQljdXJzb3JBZGp1c3RtZW50ID0gcHJvcG9zZWRUZXh0Lmxlbmd0aCgpOwotCQkJCQkJaWYgKGVsZW1lbnREZWNsIGluc3RhbmNlb2YgQ01FbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudERlY2w7Ci0JCQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg5ODExCi0JCQkJCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJCWdldENvbnRlbnRHZW5lcmF0b3IoKS5nZW5lcmF0ZVRhZyhwYXJlbnQsIGVkLCBzYik7Ci0JCQkJCQkJLy8gc2luY2UgaXQncyBhIG5hbWUgcHJvcG9zYWwsIGFzc3VtZSAnPCcgaXMKLQkJCQkJCQkvLyBhbHJlYWR5IHRoZXJlCi0JCQkJCQkJLy8gb25seSByZXR1cm4gdGhlIHJlc3Qgb2YgdGhlIHRhZwotCQkJCQkJCXByb3Bvc2VkVGV4dCA9IHNiLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpOwotCQkJCQkJCWN1cnNvckFkanVzdG1lbnQgPSBnZXRDdXJzb3JQb3NpdGlvbkZvclByb3Bvc2VkVGV4dChwcm9wb3NlZFRleHQpOwotCi0JCQkJCQkJLy8gY3Vyc29yQWRqdXN0bWVudCA9IHByb3Bvc2VkVGV4dC5sZW5ndGgoKSArCi0JCQkJCQkJLy8gMTsKLQkJCQkJCQkvLyBwcm9wb3NlZFRleHQgKz0gIj48LyIgKwotCQkJCQkJCS8vIGdldFJlcXVpcmVkTmFtZShwYXJlbnQsIGVsZW1lbnREZWNsKSArICI+IjsKLQkJCQkJCQkvLyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChiZWdpbnNXaXRoKHByb3Bvc2VkVGV4dCwgbWF0Y2hTdHJpbmcpKSB7Ci0JCQkJCQlJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGVsZW1lbnREZWNsKTsKLQkJCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQkJaW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDKTsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSBnZXRBZGRpdGlvbmFsSW5mbyhnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnQpLCBlbGVtZW50RGVjbCk7Ci0JCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2VkVGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIGN1cnNvckFkanVzdG1lbnQsIGltYWdlLCBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlbGVtZW50RGVjbCksIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfVEFHX05BTUUpOwotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFByb3Bvc2FscygpLnNpemUoKSA9PSAwKSB7Ci0JCQkJaWYgKGVycm9yICE9IG51bGwpIHsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkgIT0gbnVsbCkgJiYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5Ob19rbm93bl9jaGlsZF90YWdfbmFtZXMsIChuZXcgT2JqZWN0W117cGFyZW50LmdldE5vZGVOYW1lKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCl9KSkpOwotCQkJCQkvLyROT04tTkxTLTEkID0gIk5vIGtub3duIGNoaWxkIHRhZyBuYW1lcyBvZiA8ezB9PiBiZWdpbiB3aXRoIFwiezF9XCIiCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5fX0hhc19ub19rbm93bl9jaGlsZCwgKG5ldyBPYmplY3RbXXtwYXJlbnQuZ2V0Tm9kZU5hbWUoKX0pKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJTGlzdCBjaGlsZEVsZW1lbnRzID0gZ2V0QXZhaWxhYmxlUm9vdENoaWxkcmVuKChEb2N1bWVudCkgcGFyZW50LCBjaGlsZFBvc2l0aW9uKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCUNNTm9kZSBlZCA9IChDTU5vZGUpIGNoaWxkRWxlbWVudHMuZ2V0KGkpOwotCQkJCWlmIChlZCA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gbnVsbDsKLQkJCQlpbnQgY3Vyc29yQWRqdXN0bWVudCA9IDA7Ci0JCQkJaWYgKGVkIGluc3RhbmNlb2YgQ01FbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQkJLy8gcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWQpOwotCQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCWdldENvbnRlbnRHZW5lcmF0b3IoKS5nZW5lcmF0ZVRhZyhwYXJlbnQsIChDTUVsZW1lbnREZWNsYXJhdGlvbikgZWQsIHNiKTsKLQkJCQkJLy8gdGFnIHN0YXJ0cyB3LyAnPCcsIGJ1dCB3ZSB3YW50IHRvIGNvbXBhcmUgdG8gbmFtZQotCQkJCQlwcm9wb3NlZFRleHQgPSBzYi50b1N0cmluZygpLnN1YnN0cmluZygxKTsKLQotCQkJCQlpZiAoIWJlZ2luc1dpdGgocHJvcG9zZWRUZXh0LCBtYXRjaFN0cmluZykpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJY3Vyc29yQWRqdXN0bWVudCA9IGdldEN1cnNvclBvc2l0aW9uRm9yUHJvcG9zZWRUZXh0KHByb3Bvc2VkVGV4dCk7Ci0KLQkJCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IGdldEFkZGl0aW9uYWxJbmZvKG51bGwsIGVkKTsKLQkJCQkJSW1hZ2UgaW1hZ2UgPSBDTUltYWdlVXRpbC5nZXRJbWFnZShlZCk7Ci0JCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQlpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpOwotCQkJCQl9Ci0JCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgY3Vyc29yQWRqdXN0bWVudCwgaW1hZ2UsIGdldFJlcXVpcmVkTmFtZShwYXJlbnQsIGVkKSwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9UQUdfTkFNRSk7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0aGlzIGlzIHRoZSBwb3NpdGlvbiB0aGUgY3Vyc29yIHNob3VsZCBiZSBpbiBhZnRlciB0aGUgcHJvcG9zYWwgaXMKLQkgKiBhcHBsaWVkCi0JICogCi0JICogQHBhcmFtIHByb3Bvc2VkVGV4dAotCSAqIEByZXR1cm4gdGhlIHBvc2l0aW9uIHRoZSBjdXJzb3Igc2hvdWxkIGJlIGluIGFmdGVyIHRoZSBwcm9wb3NhbCBpcwotCSAqICAgICAgICAgYXBwbGllZAotCSAqLwotCXByaXZhdGUgaW50IGdldEN1cnNvclBvc2l0aW9uRm9yUHJvcG9zZWRUZXh0KFN0cmluZyBwcm9wb3NlZFRleHQpIHsKLQkJaW50IGN1cnNvckFkanVzdG1lbnQ7Ci0JCWN1cnNvckFkanVzdG1lbnQgPSBwcm9wb3NlZFRleHQuaW5kZXhPZigiXCJcIiIpICsgMTsgLy8kTk9OLU5MUy0xJAotCQkvLyBvdGhlcndpc2UsIGFmdGVyIHRoZSBmaXJzdCB0YWcKLQkJaWYgKGN1cnNvckFkanVzdG1lbnQgPT0gMCkgewotCQkJY3Vyc29yQWRqdXN0bWVudCA9IHByb3Bvc2VkVGV4dC5pbmRleE9mKCc+JykgKyAxOwotCQl9Ci0JCWlmIChjdXJzb3JBZGp1c3RtZW50ID09IDApIHsKLQkJCWN1cnNvckFkanVzdG1lbnQgPSBwcm9wb3NlZFRleHQubGVuZ3RoKCkgKyAxOwotCQl9Ci0KLQkJcmV0dXJuIGN1cnNvckFkanVzdG1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgWE1MIHByb3Bvc2FsIGlzIGFkZGVkIHZpYSB4bWwgZGVjbGFyYXRpb24gdGVtcGxhdGUgaW5zdGVhZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFhNTFByb3Bvc2FsKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCVN0cmluZyBwcm9wb3NlZFRleHQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIiArIENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5nZXRVc2VyUHJlZmVycmVkQ2hhcnNldE5hbWUoQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTCkgKyAiXCI/PiI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCUlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2VkVGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIHByb3Bvc2VkVGV4dC5sZW5ndGgoKSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9QUk9DRVNTSU5HSU5TVFJVQ1RJT04pLCBwcm9wb3NlZFRleHQsIG51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1hNTF9ERUNMQVJBVElPTik7Ci0JCS8vIFRPRE8gYWRkIHNwZWNpYWwgWE1MIHByb3Bvc2FsIGluZm8KLQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRldGVybWluZXMgaWYgYW55IG9mIHRoZSBhdHRyaWJ1dGVzIGluIHRoZSBwcm9wb3NlZCBYTUxOb2RlCi0JICogbm9kZSwgYXJlIHBvc3NpYmxlIHZhbHVlcyBvZiBhdHRyaWJ1dGVzIGZyb20gcG9zc2libGUgRWxlbWVudHMgYXQgdGhpcwotCSAqIHBvaW50IGluIHRoZSBkb2N1bWVudCBhY2NvcmRpbmcgdG8gdGhlIENvbnRlbnQgTW9kZWwuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IHdpdGggYXR0cmlidXRlcyB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHRlc3QgaWYKLQkgKiAgICAgICAgICAgIGFyZSBwb3NzaWJsZSBmb3IgcG9zc2libGUgRWxlbWVudHMgYXQgdGhpcyBwb2ludAotCSAqIEBwYXJhbSBjbW5vZGUKLQkgKiAgICAgICAgICAgIHBvc3NpYmxlIGVsZW1lbnQgYXQgdGhpcyBwb2ludCBpbiB0aGUgZG9jdW1lbnQgKGRlcGVuZGluZyBvbgotCSAqICAgICAgICAgICAgd2hhdCAnbm9kZScgaXMpIHRydWUgaWYgYW55IGF0dHJpYnV0ZXMgb2YgJ25vZGUnIG1hdGNoIGFueQotCSAqICAgICAgICAgICAgcG9zc2libGUgYXR0cmlidXRlcyBmcm9tICdjbW5vZGVzJyBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF0dHJpYnV0ZUluTGlzdChJRE9NTm9kZSBub2RlLCBOb2RlIHBhcmVudCwgQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAoKG5vZGUgPT0gbnVsbCkgfHwgKHBhcmVudCA9PSBudWxsKSB8fCAoY21ub2RlID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGVsZW1lbnRNYXRjaFN0cmluZyA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJU3RyaW5nIGNtbm9kZU5hbWUgPSBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBjbW5vZGUpOy8vIGNtbm9kZS5nZXROb2RlTmFtZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCU5hbWVkTm9kZU1hcCBtYXAgPSAoKEVsZW1lbnQpIG5vZGUpLmdldEF0dHJpYnV0ZXMoKTsKLQkJCVN0cmluZyBhdHRyTWF0Y2hTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJQ01OYW1lZE5vZGVNYXAgY21hdHRyTWFwID0gbnVsbDsKLQkJCS8vIGl0ZXJhdGUgYXR0cmlidXRlIHBvc3NpYmlsaXRpZXMgZm9yIHBhcnRpYWxseSBzdGFydGVkIG5vZGUKLQkJCWZvciAoaW50IGkgPSAwOyAobWFwICE9IG51bGwpICYmIChpIDwgbWFwLmdldExlbmd0aCgpKTsgaSsrKSB7Ci0JCQkJYXR0ck1hdGNoU3RyaW5nID0gbWFwLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkvLyBmaWx0ZXIgb24gd2hhdGV2ZXIgdXNlciB0eXBlZCBmb3IgZWxlbWVudCBuYW1lIGFscmVhZHkKLQkJCQlpZiAoYmVnaW5zV2l0aChjbW5vZGVOYW1lLCBlbGVtZW50TWF0Y2hTdHJpbmcpKSB7Ci0JCQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikgewotCQkJCQkJY21hdHRyTWFwID0gKChDTUVsZW1lbnREZWNsYXJhdGlvbikgY21ub2RlKS5nZXRBdHRyaWJ1dGVzKCk7Ci0KLQkJCQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChjbWF0dHJNYXApOwotCQkJCQkJTGlzdCBub2RlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIG5vZGUsIChDTUVsZW1lbnREZWNsYXJhdGlvbikgY21ub2RlLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQkJCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJCQkJQ01Ob2RlIGFkbm9kZSA9IChDTU5vZGUpIG5vZGVzLmdldChrKTsKLQkJCQkJCQlpZiAoYWRub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChhZG5vZGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNtYXR0ck1hcCA9IGFsbEF0dHJpYnV0ZXM7Ci0JCQkJCQkKLQkJCQkJCS8vIGl0ZXJhdGUgcG9zc2libGUgYXR0cmlidXRlcyBmcm9tIGEgY21ub2RlIGluCi0JCQkJCQkvLyBwcm9wb3NhbCBsaXN0Ci0JCQkJCQlmb3IgKGludCBrID0gMDsgKGNtYXR0ck1hcCAhPSBudWxsKSAmJiAoayA8IGNtYXR0ck1hcC5nZXRMZW5ndGgoKSk7IGsrKykgewotCQkJCQkJCS8vIGNoZWNrIGlmIG5hbWUgbWF0Y2hlcwotCQkJCQkJCWlmIChjbWF0dHJNYXAuaXRlbShrKS5nZXROb2RlTmFtZSgpLmVxdWFscyhhdHRyTWF0Y2hTdHJpbmcpKSB7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYmVnaW5zV2l0aChTdHJpbmcgYVN0cmluZywgU3RyaW5nIHByZWZpeCkgewotCQlpZiAoKGFTdHJpbmcgPT0gbnVsbCkgfHwgKHByZWZpeCA9PSBudWxsKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gKHBhKSBtYXRjaGluZyBpbmRlcGVuZGVudCBvZiBjYXNlIHRvIGJlIGNvbnNpc3RhbnQgd2l0aCBKYXZhCi0JCS8vIGVkaXRvciBDQQotCQlyZXR1cm4gYVN0cmluZy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocHJlZml4LnRvTG93ZXJDYXNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQXR0cmlidXRlUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmIChkb2N1bWVudFBvc2l0aW9uIDwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpIHsKLQkJCS8vIHNldHVwIHRvIGluc2VydCBuZXcgYXR0cmlidXRlcwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBTZXR1cCB0byByZXBsYWNlIGFuIGV4aXN0aW5nIGF0dHJpYnV0ZSBuYW1lCi0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pLCBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQl9Ci0JCWFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQljb250ZW50QXNzaXN0UmVxdWVzdC5zZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LnNldFJlcGxhY2VtZW50TGVuZ3RoKDApOwotCQlpZiAoKG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSAmJiAoIW5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5pc0VuZGVkKCkpKSB7Ci0JCQlhZGRUYWdDbG9zZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKChkb2N1bWVudFBvc2l0aW9uID4gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSkgJiYgKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pICsgY29tcGxldGlvblJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgIT0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldExlbmd0aCgpKSkgewotCQkJLy8gc2V0dXAgdG8gYWRkIGEgbmV3IGF0dHJpYnV0ZSBhdCB0aGUgZG9jdW1lbnRQb3NpdGlvbgotCQkJSURPTU5vZGUgYWN0dWFsTm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpOwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQlpZiAoKGFjdHVhbE5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSAmJiAhYWN0dWFsTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmlzRW5kZWQoKSkgewotCQkJCWFkZFRhZ0Nsb3NlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIHNldHVwIHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHZhbHVlCi0JCQlpZiAoIW5vZGVBdE9mZnNldC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmlzRW5kZWQoKSAmJiAoZG9jdW1lbnRQb3NpdGlvbiA8IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKSkgewotCQkJCS8vIGlmIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzbid0IGNsb3NlZCBhbmQgdGhlCi0JCQkJLy8gY3Vyc29yIGlzIGluIGZyb250IG9mIHRoZSB2YWx1ZSwgYWRkCi0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pLCBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQkJCWFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlLCBJRE9NTm9kZSB4bWxub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQotCQkvLyBIYW5kbGUgdGhlIG1vc3QgY29tbW9uIGFuZCBiZXN0IHN1cHBvcnRlZCBjYXNlcwotCQlpZiAoKHhtbG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgfHwgKHhtbG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpKSB7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gY29tcHV0ZVRhZ09wZW5Qcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVUYWdOYW1lUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gY29tcHV0ZUF0dHJpYnV0ZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gY29tcHV0ZUVxdWFsc1Byb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAoKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgJiYgKGRvY3VtZW50UG9zaXRpb24gPT0gc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldCgpKSAmJiAoc2RSZWdpb24uZ2V0VGV4dChjb21wbGV0aW9uUmVnaW9uKS5lbmRzV2l0aCgiXCIiKSB8fCBzZFJlZ2lvbi5nZXRUZXh0KGNvbXBsZXRpb25SZWdpb24pLmVuZHNXaXRoKCJcJyIpKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl7Ci0JCQkJLy8gdGhpcyBpcyBmb3Igd2hlbiB0aGUgY3Vyc29yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGNsb3NpbmcKLQkJCQkvLyBxdW90ZSBmb3IgYW4gYXR0cmlidXRlLi4KLQkJCQlJRE9NTm9kZSBhY3R1YWxOb2RlID0gKElET01Ob2RlKSB4bWxub2RlLmdldE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbihzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSk7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCWFkZFRhZ0Nsb3NlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gY29tcHV0ZUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmICgocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgfHwgKHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RJUkVDVElWRV9DTE9TRSkpKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlVGFnQ2xvc2VQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlRW5kVGFnT3BlblByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAoKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UpIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BFX1JFRkVSRU5DRSkpIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVDb250ZW50UHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCQl9Ci0KLQkJCS8vIFRoZXNlIElUZXh0UmVnaW9uIHR5cGVzIGJlZ2luIERPTSBFbGVtZW50cyBhcyB3ZWxsIGFuZCBhbHRob3VnaAotCQkJLy8gaW50ZXJuYWxseSBoYXJkZXIgdG8gYXNzaXN0LAotCQkJLy8gdGV4dCBpbnNlcnRpb25zIGRpcmVjdGx5IGJlZm9yZSB0aGVtIGNhbiBiZSBtYWRlCi0JCQllbHNlIGlmICgoZG9jdW1lbnRQb3NpdGlvbiA9PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgJiYgKHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0NPTU1FTlRfT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfREVDTEFSQVRJT05fT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRElSRUNUSVZFX09QRU4pIHx8IHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0VYUFJFU1NJT05fT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfU0NSSVBUTEVUX09QRU4pIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTikgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTikpKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdCh0cmVlTm9kZSwgeG1sbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KHRyZWVOb2RlKSk7Ci0JCQkJYWRkU3RhcnREb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQl9Ci0JCX0KLQkJLy8gTm90IGEgRG9jdW1lbnQgb3IgRWxlbWVudD8gKG9kZCBjYXNlcyBnbyBoZXJlIGZvciBub3cpCi0JCWVsc2UgaWYgKGlzQ2xvc2VSZWdpb24oY29tcGxldGlvblJlZ2lvbikpIHsKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QodHJlZU5vZGUsIHhtbG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldExlbmd0aCgpLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQlhZGRTdGFydERvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID49IHNkUmVnaW9uLmdldFRleHRFbmRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpIHsKLQkJCQlhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkodHJlZU5vZGUpICsgMSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoKGRvY3VtZW50UG9zaXRpb24gPT0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpICYmIChyZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9DT01NRU5UX09QRU4pIHx8IHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHx8IHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RJUkVDVElWRV9PUEVOKSB8fCByZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9FWFBSRVNTSU9OX09QRU4pIHx8IHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX1NDUklQVExFVF9PUEVOKSB8fCAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOKSB8fCAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOKSB8fCAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4pIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4pKSkgewotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdCh0cmVlTm9kZSwgeG1sbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQlhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkodHJlZU5vZGUpKTsKLQkJCWFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQl9Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQkvKioKLQkgKiBDT05URU5UIEFTU0lTVCBTVEFSVFMgSEVSRQotCSAqIAotCSAqIFJldHVybiBhIGxpc3Qgb2YgcHJvcG9zZWQgY29kZSBjb21wbGV0aW9ucyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0JICogbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dC1lZGl0b3IgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dFZpZXdlcgotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uIC0KLQkgKiAgICAgICAgICAgIHRoZSBjdXJzb3IgbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudAotCSAqIAotCSAqIGFuIGFycmF5IG9mIElDb21wbGV0aW9uUHJvcG9zYWxzCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCi0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQotCQlmVGV4dFZpZXdlciA9IHRleHRWaWV3ZXI7Ci0KLQkJSW5kZXhlZFJlZ2lvbiB0cmVlTm9kZSA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJTm9kZSBub2RlID0gKE5vZGUpIHRyZWVOb2RlOwotCQl3aGlsZSAoKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpKSB7Ci0JCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJSURPTU5vZGUgeG1sbm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiA9IGdldENvbXBsZXRpb25SZWdpb24oZG9jdW1lbnRQb3NpdGlvbiwgbm9kZSk7Ci0KLQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gZ2V0TWF0Y2hTdHJpbmcoc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24pOwotCi0JCS8vIEhhbmRsZSBlbXB0eSBEb2N1bWVudHMKLQkJaWYgKGNvbXBsZXRpb25SZWdpb24gPT0gbnVsbCkgewotCQkJaWYgKCgodHJlZU5vZGUgPT0gbnVsbCkgfHwgKCgoTm9kZSkgdHJlZU5vZGUpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgJiYgKGNvbXBsZXRpb25SZWdpb24gPT0gbnVsbCkgJiYgKCh4bWxub2RlID09IG51bGwpIHx8ICh4bWxub2RlLmdldENoaWxkTm9kZXMoKSA9PSBudWxsKSB8fCAoeG1sbm9kZS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPT0gMCkpKSB7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQlJRE9NRG9jdW1lbnQgZG9jTm9kZSA9ICgoSURPTU1vZGVsKSBzTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGRvY05vZGUsIGRvY05vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBudWxsKTsKLQkJCQkJCWFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QgPT0gbnVsbCkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInByb2JsZW0gZ2V0dGluZyBtb2RlbCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCQkJfQotCQkJCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JCQl9Ci0JCQkvLyBNQVNTSVZFIEVSUk9SIENPTkRJVElPTgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb21wbGV0aW9uIHJlZ2lvbiB3YXMgbnVsbCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJc2V0RXJyb3JNZXNzYWdlKElOVEVSTkFMRVJST1IpOwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdCgoTm9kZSkgdHJlZU5vZGUsIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Q29tcGxldGlvblByb3Bvc2FscygpOwotCQl9Ci0KLQotCQkvLyBjYXRjaCBkb2N1bWVudHMgd2hlcmUgbm8gcmVnaW9uIGNhbiBiZSBkZXRlcm1pbmVkCi0JCWlmICgoeG1sbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKChjb21wbGV0aW9uUmVnaW9uID09IG51bGwpIHx8ICh4bWxub2RlLmdldENoaWxkTm9kZXMoKSA9PSBudWxsKSB8fCAoeG1sbm9kZS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPT0gMCkpKSB7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVTdGFydERvY3VtZW50UHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCAoSURPTU5vZGUpIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JCX0KLQotCQkvLyBjb21wdXRlIG5vcm1hbCBwcm9wb3NhbHMKLQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgKElET01Ob2RlKSB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdCA9PSBudWxsKSB7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KChOb2RlKSB0cmVlTm9kZSwgbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVU5LTk9XTl9DT05URVhUICsgIiAiICsgY29tcGxldGlvblJlZ2lvbi5nZXRUeXBlKCkgKyAiQCIgKyBkb2N1bWVudFBvc2l0aW9uKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXNldEVycm9yTWVzc2FnZShVTktOT1dOX0NPTlRFWFQpOwotCQl9Ci0KLQkJLyogCi0JCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjM4OTIKLQkJICogT25seSBzZXQgdGhpcyBlcnJvciBtZXNzYWdlIGlmIG5vdGhpbmcgZWxzZSB3YXMgYWxyZWFkeSBzZXQgCi0JCSAqKi8KLQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFByb3Bvc2FscygpLnNpemUoKSA9PSAwICYmIGdldEVycm9yTWVzc2FnZSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShVTktOT1dOX0NPTlRFWFQpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUNvbnRlbnRQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQotCQkvLyBzZXR1cCB0byBhZGQgY2hpbGRyZW4gYXQgdGhlIGNvbnRlbnQgbm9kZSdzIHBvc2l0aW9uCi0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbiksIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAoKChEb2N1bWVudCkgbm9kZSkuZ2V0RG9jdHlwZSgpID09IG51bGwpKSB7Ci0JCQlhZGRTdGFydERvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJfQotCQlhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkobm9kZUF0T2Zmc2V0KSk7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlhZGRFbmRUYWdQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQl9Ci0JCS8vIGVudGl0aWVzPwotCQlhZGRFbnRpdHlQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGRvY3VtZW50UG9zaXRpb24sIGNvbXBsZXRpb25SZWdpb24sIG5vZGUpOwotCQkvLyBhZGRFbnRpdHlQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBwb3NzaWJsZSBjb250ZXh0cyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0JICogbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlciB3aG9zZSBkb2N1bWVudCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIHBvc3NpYmxlCi0JICogICAgICAgICAgICBjb250ZXh0cyBhbiBhcnJheSBvZiBjb250ZXh0IGluZm9ybWF0aW9uIG9iamVjdHMgb3IKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGNvbnRleHQgY291bGQgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbltdIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJcmV0dXJuIG5ldyBJQ29udGV4dEluZm9ybWF0aW9uWzBdOwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlRW5kVGFnT3BlblByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQlpbnQgY29tcGxldGlvblJlZ2lvblN0YXJ0ID0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbik7Ci0JCWludCBjb21wbGV0aW9uUmVnaW9uTGVuZ3RoID0gY29tcGxldGlvblJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbkF0Q29tcGxldGlvbk9mZnNldCA9IG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoY29tcGxldGlvblJlZ2lvblN0YXJ0ICsgY29tcGxldGlvblJlZ2lvbkxlbmd0aCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbkF0RW5kT2ZDb21wbGV0aW9uID0gc2RSZWdpb25BdENvbXBsZXRpb25PZmZzZXQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoY29tcGxldGlvblJlZ2lvblN0YXJ0ICsgY29tcGxldGlvblJlZ2lvbkxlbmd0aCk7Ci0KLQkJaWYgKChkb2N1bWVudFBvc2l0aW9uICE9IGNvbXBsZXRpb25SZWdpb25TdGFydCkgJiYgKHJlZ2lvbkF0RW5kT2ZDb21wbGV0aW9uICE9IG51bGwpICYmIChyZWdpb25BdEVuZE9mQ29tcGxldGlvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gcmVnaW9uQXRFbmRPZkNvbXBsZXRpb247Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZUF0T2Zmc2V0LmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pLCBuYW1lUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKG5vZGVBdE9mZnNldC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IHNkUmVnaW9uKSB7Ci0JCQkJLy8gYWJub3JtYWwgY2FzZSwgdGhpcyB1bm1hdGNoZWQgZW5kIHRhZyB3aWxsIGJlIGEgc2libGluZwotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlQXRPZmZzZXQuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gbm9ybWFsIGNhc2UsIHRoaXMgZW5kIHRhZyBpcyB0aGUgcGFyZW50Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGVBdE9mZnNldCwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCX0KLQkJfQotCQkvLyBpZiAoZG9jdW1lbnRQb3NpdGlvbiA+PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArCi0JCS8vIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpKQotCQlhZGRFbmRUYWdQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkvLyBlbHNlCi0JCWlmIChjb21wbGV0aW9uUmVnaW9uU3RhcnQgPT0gZG9jdW1lbnRQb3NpdGlvbikgewotCQkJLy8gcG9zaXRpb25lZCBhdCBzdGFydCBvZiBlbmQgdGFnCi0JCQlhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIG5vZGUuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpKTsKLQkJfQotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIGFsbCBwb3NzaWJsZSBFbnRpdHlSZWZlcmVuY2VQcm9wb3NhbHMgKGFjY29yZGluZyB0byBjdXJyZW50Ci0JICogcG9zaXRpb24gaW4gZG9jKQotCSAqLwotCXByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUVudGl0eVJlZmVyZW5jZVByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgdHJlZU5vZGUpIHsKLQkJLy8gb25seSBoYW5kbGUgWE1MIGNvbnRlbnQgZm9yIG5vdwotCQlWZWN0b3IgcHJvcG9zYWxzID0gbmV3IFZlY3RvcigpOyAvLyBJQ29tcGxldGlvblByb3Bvc2FscwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQlpZiAoKGNvbXBsZXRpb25SZWdpb24gIT0gbnVsbCkgJiYgKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpKSB7Ci0JCQlpbnQgbm9kZU9mZnNldCA9IGRvY3VtZW50UG9zaXRpb24gLSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKTsKLQkJCVN0cmluZyByZWdpb25UZXh0ID0gc2RSZWdpb24uZ2V0RnVsbFRleHQoY29tcGxldGlvblJlZ2lvbik7Ci0KLQkJCS8vIGlmIGRpcmVjdGx5IHRvIHRoZSByaWdodCBvZiBhICYsIHJlZ2lvbiB3aWxsIGJlIG51bGwsIG5lZWQgdG8KLQkJCS8vIG1vdmUgdG8KLQkJCS8vIHRoZSBwcmV2aW91cyByZWdpb24uLi50aGVyZSBtaWdodCBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcwotCQkJaWYgKChyZWdpb25UZXh0ICE9IG51bGwpICYmIHJlZ2lvblRleHQudHJpbSgpLmVxdWFscygiIikgJiYgKGRvY3VtZW50UG9zaXRpb24gPiAwKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2ID0gdHJlZU5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbiAtIDEpOwotCQkJCWlmICgocHJldiAhPSBudWxsKSAmJiBwcmV2LmdldFRleHQoKS5lcXVhbHMoIiYiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDY2ODAKLQkJCQkJLy8gZXhhbWluZSBwcmV2aW91cyByZWdpb24KLQkJCQkJc2RSZWdpb24gPSBwcmV2OwotCQkJCQljb21wbGV0aW9uUmVnaW9uID0gcHJldi5nZXRMYXN0UmVnaW9uKCk7Ci0JCQkJCXJlZ2lvblRleHQgPSBwcmV2LmdldEZ1bGxUZXh0KCk7Ci0JCQkJCW5vZGVPZmZzZXQgPSAxOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gc3RyaW5nIG11c3Qgc3RhcnQgdy8gJgotCQkJaWYgKChyZWdpb25UZXh0ICE9IG51bGwpICYmIHJlZ2lvblRleHQuc3RhcnRzV2l0aCgiJiIpKSB7IC8vJE5PTi1OTFMtMSQJCQkJCQkgCQkKLQkJCQlTdHJpbmcga2V5ID0gKG5vZGVPZmZzZXQgPiAwKSA/IHJlZ2lvblRleHQuc3Vic3RyaW5nKDEsIG5vZGVPZmZzZXQpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkJCS8vIGdldCBlbnRpdHkgcHJvcG9zYWxzLCBwYXNzaW5nIGluIHRoZSBhcHByb3ByaWF0ZSBzdGFydAotCQkJCS8vIHN0cmluZwotCQkJCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KCgoTm9kZSkgdHJlZU5vZGUpLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCQkJQ01Eb2N1bWVudCB4bWxEb2MgPSBtcS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudCh0cmVlTm9kZSk7Ci0JCQkJCUNNTmFtZWROb2RlTWFwIGNtbWFwID0gbnVsbDsKLQkJCQkJUHJvcGVydGllcyBlbnRpdGllcyA9IG51bGw7Ci0JCQkJCWlmICh4bWxEb2MgIT0gbnVsbCkgewotCQkJCQkJY21tYXAgPSB4bWxEb2MuZ2V0RW50aXRpZXMoKTsKLQkJCQkJfQotCQkJCQlpZiAoY21tYXAgIT0gbnVsbCkgewotCQkJCQkJZW50aXRpZXMgPSBtYXBUb1Byb3BlcnRpZXMoY21tYXApOwotCQkJCQl9Ci0JCQkJCWVsc2UgLy8gMjI0Nzg3IGluIGFic2VuY2Ugb2YgY29udGVudCBtb2RlbCwganVzdCB1c2UKLQkJCQkJLy8gbWluaW1hbCA1IGVudGl0aWVzCi0JCQkJCXsKLQkJCQkJCWVudGl0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCQkJCWVudGl0aWVzLnB1dCgicXVvdCIsICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWVudGl0aWVzLnB1dCgiYXBvcyIsICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJZW50aXRpZXMucHV0KCJhbXAiLCAiJiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWVudGl0aWVzLnB1dCgibHQiLCAiPCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWVudGl0aWVzLnB1dCgiZ3QiLCAiPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCi0JCQkJCQllbnRpdGllcy5wdXQoIm5ic3AiLCAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCQkJCQkKLQkJCQkJfQotCQkJCQlhZGRFbnRpdHlQcm9wb3NhbHMocHJvcG9zYWxzLCBlbnRpdGllcywga2V5LCBub2RlT2Zmc2V0LCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSAoKHByb3Bvc2Fscy5zaXplKCkgPiAwKSA/IHByb3Bvc2Fscy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Byb3Bvc2Fscy5zaXplKCldKSA6IG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlRXF1YWxzUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pICsgY29tcGxldGlvblJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCWlmICgodmFsdWVSZWdpb24gIT0gbnVsbCkgJiYgKHZhbHVlUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSAmJiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pIDw9IGRvY3VtZW50UG9zaXRpb24pKSB7Ci0JCQkvLyByZXBsYWNlIHRoZSBhZGphY2VudCBhdHRyaWJ1dGUgdmFsdWUKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgdmFsdWVSZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKSwgdmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBhcHBlbmQgYW4gYXR0cmlidXRlIHZhbHVlIGFmdGVyIHRoZSAnPScKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQl9Ci0JCWFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlU3RhcnREb2N1bWVudFByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJLy8gc2V0dXAgZm9yIGEgbm9uLWVtcHR5IGRvY3VtZW50LCBidXQgb25lIHRoYXQgaGFzbid0IGJlZW4gZm9ybWFsbHkKLQkJLy8gc3RhcnRlZAotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbiksIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJYWRkU3RhcnREb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVRhZ0Nsb3NlUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJaWYgKChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB8fCAoZG9jdW1lbnRQb3NpdGlvbiA+PSBzZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSkpIHsKLQkJCS8vIHRoaXMgaXMgYSBjb250ZW50IHJlcXVlc3QgYXMgdGhlIGRvY3VtZW50UG9zaXRpb24gaXMgQUZURVIgdGhlCi0JCQkvLyBlbmQgb2YgdGhlIGNsb3NpbmcgcmVnaW9uCi0JCQlpZiAoKG5vZGUgPT0gbm9kZUF0T2Zmc2V0KSAmJiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkpIHsKLQkJCQlub2RlID0gKElET01Ob2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KG5vZGVBdE9mZnNldCkpOwotCQkJaWYgKChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAobm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSkgewotCQkJCWFkZEVuZFRhZ1Byb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBhdCB0aGUgc3RhcnQgb2YgdGhlIHRhZydzIGNsb3NlIG9yIHdpdGhpbiBpdAotCQkJSVRleHRSZWdpb24gY2xvc2VSZWdpb24gPSBzZFJlZ2lvbi5nZXRMYXN0UmVnaW9uKCk7Ci0JCQlib29sZWFuIGluc2lkZVRhZyA9ICFzZFJlZ2lvbi5pc0VuZGVkKCkgfHwgKGRvY3VtZW50UG9zaXRpb24gPD0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY2xvc2VSZWdpb24pKTsKLQkJCWlmIChpbnNpZGVUYWcpIHsKLQkJCQkvLyB0aGlzIGlzIGEgcmVxdWVzdCBmb3IgY29tcGxldGlvbnMgd2l0aGluIGEgdGFnCi0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJaWYgKChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAobm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSkgewotCQkJCQlhZGRUYWdDbG9zZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJfQotCQkJCWlmIChzZFJlZ2lvbiA9PSBub2RlQXRPZmZzZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSkgewotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5zZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LnNldFJlcGxhY2VtZW50TGVuZ3RoKDApOwotCQkJCQlhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlVGFnTmFtZVByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCi0JCWlmIChzZFJlZ2lvbiAhPSBub2RlQXRPZmZzZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSkgewotCQkJLy8gY29tcGxldGluZyB0aGUgKmZpcnN0KiB0YWcgaW4gIjx0YWduYW1lMSB8PHRhZ25hbWUyIgotCQkJSURPTU5vZGUgYWN0dWFsTm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpOwotCQkJaWYgKGFjdHVhbE5vZGUgIT0gbnVsbCkgewotCQkJCWlmIChhY3R1YWxOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gc2RSZWdpb24pIHsKLQkJCQkJLy8gc3RhcnQgdGFnCi0JCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID4gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJCQkvLyBpdCdzIGF0dHJpYnV0ZXMKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QoYWN0dWFsTm9kZSwgYWN0dWFsTm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24gLSBtYXRjaFN0cmluZy5sZW5ndGgoKSwgbWF0Y2hTdHJpbmcubGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJCQkJCWlmIChub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pIC0gMSkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgLSAxKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCQkJCQlhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQkJCX0KLQkJCQkJCWFkZFRhZ0Nsb3NlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGl0J3MgbmFtZQotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24gLSBtYXRjaFN0cmluZy5sZW5ndGgoKSwgbWF0Y2hTdHJpbmcubGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJCQkJCWFkZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkoYWN0dWFsTm9kZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQkJCS8vIGluc2VydCBuYW1lCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gcmVwbGFjZSBuYW1lCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbiksIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJCX0KLQkJCQkJYWRkRW5kVGFnTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPiBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpKSB7Ci0JCQkJLy8gdW5jbG9zZWQgdGFnIHdpdGggb25seSBhIG5hbWU7IHNob3VsZCBwcm9tcHQgZm9yIGF0dHJpYnV0ZXMKLQkJCQkvLyBhbmQgYSBjbG9zZSBpbnN0ZWFkCi0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uIC0gbWF0Y2hTdHJpbmcubGVuZ3RoKCksIG1hdGNoU3RyaW5nLmxlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJYWRkVGFnQ2xvc2VQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMCkuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJCQlpbnQgcmVwbGFjZUxlbmd0aCA9IGRvY3VtZW50UG9zaXRpb24gLSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlLCBub2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pLCByZXBsYWNlTGVuZ3RoLCBtYXRjaFN0cmluZyk7Ci0JCQkJCWFkZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkobm9kZUF0T2Zmc2V0KSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJRE9NTm9kZSBhY3R1YWxOb2RlID0gKElET01Ob2RlKSBub2RlLmdldE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQkJaWYgKGFjdHVhbE5vZGUgIT0gbnVsbCkgewotCQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPj0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSkgewotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QoYWN0dWFsTm9kZSwgYWN0dWFsTm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbiksIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJCQl9Ci0JCQkJCQlhZGRFbmRUYWdOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVUYWdPcGVuUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmIChzZFJlZ2lvbiAhPSBub2RlQXRPZmZzZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB8fCBzZFJlZ2lvbi5nZXRQcmV2aW91cygpICE9IG51bGwgJiYgc2RSZWdpb24uZ2V0UHJldmlvdXMoKS5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQkvLyBjb21wbGV0aW5nIHRoZSAqZmlyc3QqIFhNTF9UQUdfT1BFTiBpbiAiPDx0YWduYW1lIgotCQkJSURPTU5vZGUgYWN0dWFsTm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpOwotCQkJaWYgKGFjdHVhbE5vZGUgIT0gbnVsbCkgewotCQkJCWlmKHNkUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJCWlmKGFjdHVhbE5vZGUuaGFzQ2hpbGROb2RlcygpKQotCQkJCQkJYWRkVGFnTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uRm9yTW9kZWxRdWVyeShhY3R1YWxOb2RlLmdldExhc3RDaGlsZCgpKSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWFkZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIDApOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQkJYWRkVGFnTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uRm9yTW9kZWxRdWVyeShhY3R1YWxOb2RlKSk7Ci0JCQkJfQotCQkJCWFkZEVuZFRhZ1Byb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7IC8vIChwYSkgMjIwODUwCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA9PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgewotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJLy8gYXQgdGhlIHN0YXJ0IG9mIGFuIGV4aXN0aW5nIHRhZywgcmlnaHQgYmVmb3JlIHRoZSAnPCcKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCQlhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkobm9kZUF0T2Zmc2V0KSk7Ci0JCQkJCWFkZEVuZFRhZ1Byb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQkJLy8gYXQgdGhlIG9wZW5pbmcgb2YgdGhlIFZFUlkgZmlyc3QgdGFnIHdpdGggYSAnPCcKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbiksIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJCWFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdpdGhpbiB0aGUgd2hpdGUgc3BhY2UKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lID0gZ2V0TmFtZVJlZ2lvbihub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJCS8vIChwYSkgSVRleHRSZWdpb24gcmVmYWN0b3IKLQkJCQkvLyBpZiAobmFtZSAhPSBudWxsICYmIG5hbWUuY29udGFpbnNPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbikpCi0JCQkJLy8gewotCQkJCWlmICgobmFtZSAhPSBudWxsKSAmJiAoKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWUpIDw9IGRvY3VtZW50UG9zaXRpb24pICYmIChzZFJlZ2lvbi5nZXRFbmRPZmZzZXQobmFtZSkgPj0gZG9jdW1lbnRQb3NpdGlvbikpICYmIChzZFJlZ2lvbi5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSB8fCBzZFJlZ2lvbi5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkpeyAKLQkJCQkJLy8gcmVwbGFjZSB0aGUgZXhpc3RpbmcgbmFtZQotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGUsIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZSksIG5hbWUuZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBpbnNlcnQgYSB2YWxpZCBuZXcgbmFtZSwgb3IgcG9zc2libHkgYW4gZW5kIHRhZwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgKChOb2RlKSBub2RlQXRPZmZzZXQpLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQkJYWRkRW5kVGFnUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3Quc2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5zZXRSZXBsYWNlbWVudExlbmd0aCgwKTsKLQkJCQl9Ci0JCQkJYWRkVGFnTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uRm9yTW9kZWxRdWVyeShub2RlQXRPZmZzZXQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0cmVpdmVzIGNtbm9kZSdzIGRvY3VtZW50YXRpb24gdG8gZGlzcGxheSBpbiB0aGUgY29tcGxldGlvbgotCSAqIHByb3Bvc2FsJ3MgYWRkaXRpb25hbCBpbmZvLiBJZiBubyBkb2N1bWVudGF0aW9uIGV4aXN0cyBmb3IgY21ub2RlLCB0cnkKLQkgKiBkaXNwbGF5aW5nIHBhcmVudE9yT3duZXIncyBkb2N1bWVudGF0aW9uCi0JICogCi0JICogU3RyaW5nIGFueSBkb2N1bWVudGF0aW9uIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkgZm9yIGNtbm9kZS4KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGRpc3BsYXkuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBZGRpdGlvbmFsSW5mbyhDTU5vZGUgcGFyZW50T3JPd25lciwgQ01Ob2RlIGNtbm9kZSkgewotCQlTdHJpbmcgYWRkbEluZm8gPSBudWxsOwotCi0JCWlmIChjbW5vZGUgPT0gbnVsbCkgewotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwgZGVjbGFyYXRpb24hIikucHJpbnRTdGFja1RyYWNlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJYWRkbEluZm8gPSBnZXRJbmZvUHJvdmlkZXIoKS5nZXRJbmZvKGNtbm9kZSk7Ci0JCWlmICgoYWRkbEluZm8gPT0gbnVsbCkgJiYgKHBhcmVudE9yT3duZXIgIT0gbnVsbCkpIHsKLQkJCWFkZGxJbmZvID0gZ2V0SW5mb1Byb3ZpZGVyKCkuZ2V0SW5mbyhwYXJlbnRPck93bmVyKTsKLQkJfQotCQlyZXR1cm4gYWRkbEluZm87Ci0JfQotCi0JLy8gcmV0dXJucyBhIGxpc3Qgb2YgTW9kZWxRdWVyeUFjdGlvbnMKLQlwcm90ZWN0ZWQgTGlzdCBnZXRBdmFpbGFibGVDaGlsZHJlbkF0SW5kZXgoRWxlbWVudCBwYXJlbnQsIGludCBpbmRleCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnREZWNsID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50KTsKLQkJaWYgKHBhcmVudERlY2wgIT0gbnVsbCkgewotCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCS8vIHRha2VuIGZyb20gQWN0aW9uTWFuYWdlcnMKLQkJCS8vIGludCBlZGl0TW9kZSA9IG1vZGVsUXVlcnkuZ2V0RWRpdE1vZGUoKTsKLQkJCWludCBlZGl0TW9kZSA9IE1vZGVsUXVlcnkuRURJVF9NT0RFX1VOQ09OU1RSQUlORUQ7Ci0JCQlpbnQgaWMgPSAoZWRpdE1vZGUgPT0gTW9kZWxRdWVyeS5FRElUX01PREVfQ09OU1RSQUlORURfU1RSSUNUKSA/IE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUyB8IE1vZGVsUXVlcnkuSU5DTFVERV9TRVFVRU5DRV9HUk9VUFMgOiBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVM7Ci0JCQltb2RlbFF1ZXJ5LmdldEluc2VydEFjdGlvbnMocGFyZW50LCBwYXJlbnREZWNsLCBpbmRleCwgaWMsIHZhbGlkaXR5Q2hlY2tpbmcsIGxpc3QpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8vIHJldHVybnMgYSBsaXN0IG9mIENNRWxlbWVudERlY2xhcmF0aW9ucwotCXByb3RlY3RlZCBMaXN0IGdldEF2YWlsYWJsZVJvb3RDaGlsZHJlbihEb2N1bWVudCBkb2N1bWVudCwgaW50IGNoaWxkSW5kZXgpIHsKLQkJTGlzdCBsaXN0ID0gbnVsbDsKLQotCQkvLyBleHRyYWN0IHRoZSB2YWxpZCAncm9vdCcgbm9kZSBuYW1lIGZyb20gdGhlIERvY3VtZW50VHlwZSBOb2RlCi0JCURvY3VtZW50VHlwZSBkb2NUeXBlID0gZG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotCQlTdHJpbmcgcm9vdE5hbWUgPSBudWxsOwotCQlpZiAoZG9jVHlwZSAhPSBudWxsKSB7Ci0JCQlyb290TmFtZSA9IGRvY1R5cGUuZ2V0Tm9kZU5hbWUoKTsKLQkJfQotCQlpZiAocm9vdE5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoMCk7Ci0JCX0KLQotCQlmb3IgKE5vZGUgY2hpbGQgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJLy8gbWFrZSBzdXJlIHRoZSAicm9vdCIgRWxlbWVudCBpc24ndCBhbHJlYWR5IHByZXNlbnQKLQkJCS8vIGlzIGl0IHJlcXVpcmVkIHRvIGJlIGFuIEVsZW1lbnQ/Ci0JCQlpZiAoKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpICYmIHN0cmluZ3NFcXVhbChjaGlsZC5nZXROb2RlTmFtZSgpLCByb290TmFtZSkpIHsKLQkJCQkvLyBpZiB0aGUgbm9kZSBpcyBtaXNzaW5nIGVpdGhlciB0aGUgc3RhcnQgb3IgZW5kIHRhZywgZG9uJ3QKLQkJCQkvLyBjb3VudCBpdCBhcyBwcmVzZW50Ci0JCQkJaWYgKChjaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKSAmJiAoKCgoSURPTU5vZGUpIGNoaWxkKS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpIHx8ICgoKElET01Ob2RlKSBjaGlsZCkuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoRGVidWcuZGlzcGxheUluZm8pIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHJvb3ROYW1lICsgIiBhbHJlYWR5IHByZXNlbnQhIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuVGhlX2RvY3VtZW50X2VsZW1lbnRfXywgKG5ldyBPYmplY3RbXXtyb290TmFtZX0pKSk7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoMCk7Ci0JCQl9Ci0JCX0KLQotCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2N1bWVudCk7Ci0JCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCUNNRG9jdW1lbnQgY21kb2MgPSBtb2RlbFF1ZXJ5LmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KGRvY3VtZW50KTsKLQkJCWlmIChjbWRvYyAhPSBudWxsKSB7Ci0JCQkJaWYgKHJvb3ROYW1lICE9IG51bGwpIHsKLQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdERlY2wgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNtZG9jLmdldEVsZW1lbnRzKCkuZ2V0TmFtZWRJdGVtKHJvb3ROYW1lKTsKLQkJCQkJaWYgKHJvb3REZWNsICE9IG51bGwpIHsKLQkJCQkJCWxpc3QuYWRkKHJvb3REZWNsKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIHN1cHBseSB0aGUgZ2l2ZW4gZG9jdW1lbnQgbmFtZSBhbnl3YXksIGV2ZW4gaWYgaXQKLQkJCQkJCS8vIGlzIGFuIGVycm9yCi0JCQkJCQlsaXN0LmFkZChuZXcgU2ltcGxlQ01FbGVtZW50RGVjbGFyYXRpb24ocm9vdE5hbWUpKTsKLQkJCQkJCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbyB8fCBEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGRlZmluaXRpb24gZm91bmQgZm9yICIgKyByb290TmFtZSArICIgaW4gIiArIGRvY1R5cGUuZ2V0UHVibGljSWQoKSArICIvIiArIGRvY1R5cGUuZ2V0U3lzdGVtSWQoKSk7IC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gIiIgKyAoZG9jVHlwZS5nZXRQdWJsaWNJZCgpICE9IG51bGwgPyBkb2NUeXBlLmdldFB1YmxpY0lkKCkgKyAiLyIgOiAiIikgKyAoZG9jVHlwZS5nZXRTeXN0ZW1JZCgpICE9IG51bGwgPyBkb2NUeXBlLmdldFN5c3RlbUlkKCkgOiAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJCS8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChsb2NhdGlvbi5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5Ob19kZWZpbml0aW9uX2Zvcl9pbiwgKG5ldyBPYmplY3RbXXtyb290TmFtZSwgbG9jYXRpb259KSkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuTm9fZGVmaW5pdGlvbl9mb3IsIChuZXcgT2JqZWN0W117cm9vdE5hbWV9KSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvIHx8IERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGNvbnRlbnQgbW9kZWwgZm91bmQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJLy8kTk9OLU5MUy0xJAotCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbG9jYXRpb24gPSAiIiArIChkb2NUeXBlLmdldFB1YmxpY0lkKCkgIT0gbnVsbCA/IGRvY1R5cGUuZ2V0UHVibGljSWQoKSArICIvIiA6ICIiKSArIChkb2NUeXBlLmdldFN5c3RlbUlkKCkgIT0gbnVsbCA/IGRvY1R5cGUuZ2V0U3lzdGVtSWQoKSA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCS8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJaWYgKGxvY2F0aW9uLmxlbmd0aCgpID4gMCkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5Ob19jb250ZW50X21vZGVsX2ZvciwgKG5ldyBPYmplY3RbXXtsb2NhdGlvbn0pKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoWE1MVUlNZXNzYWdlcy5Ob19jb250ZW50X21vZGVsX2ZvdW5kX1VJXyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKE5vZGUgbm9kZSkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zLgotCSAqIAotCSAqIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyBmb3IgY29tcGxldGlvbiBwcm9wb3NhbCBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGF1dG8gYWN0aXZhdGlvbiBpcyBkZXNpcmVkCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBjb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnM7Ci0JfQotCi0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIGdldENvbXBsZXRpb25SZWdpb24oaW50IG9mZnNldCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBzZFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPT0gb2Zmc2V0KSB7Ci0JCQkvLyBUaGUgb2Zmc2V0IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlZ2lvbgotCQkJaWYgKChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pID09IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpICYmIChzZFJlZ2lvbi5nZXRQcmV2aW91cygpICE9IG51bGwpICYmICghc2RSZWdpb24uZ2V0UHJldmlvdXMoKS5pc0VuZGVkKCkpKSB7Ci0JCQkJLy8gSXMgdGhlIHJlZ2lvbiBhbHNvIHRoZSBzdGFydCBvZiB0aGUgbm9kZT8gSWYgc28sIHRoZQotCQkJCS8vIHByZXZpb3VzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMKLQkJCQkvLyB3aGVyZSB0byBsb29rIGZvciBhIHVzZWZ1bCByZWdpb24uCi0JCQkJcmVnaW9uID0gc2RSZWdpb24uZ2V0UHJldmlvdXMoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQgLSAxKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIElzIHRoZXJlIG5vIHNlcGFyYXRpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSBwcmV2aW91cyByZWdpb24/Ci0JCQkJLy8gSWYgbm90LAotCQkJCS8vIHRoZW4gdGhhdCByZWdpb24gaXMgdGhlIGltcG9ydGFudCBvbmUKLQkJCQlJVGV4dFJlZ2lvbiBwcmV2aW91c1JlZ2lvbiA9IHNkUmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCAtIDEpOwotCQkJCWlmICgocHJldmlvdXNSZWdpb24gIT0gbnVsbCkgJiYgKHByZXZpb3VzUmVnaW9uICE9IHJlZ2lvbikgJiYgKHByZXZpb3VzUmVnaW9uLmdldFRleHRMZW5ndGgoKSA9PSBwcmV2aW91c1JlZ2lvbi5nZXRMZW5ndGgoKSkpIHsKLQkJCQkJcmVnaW9uID0gcHJldmlvdXNSZWdpb247Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gVGhlIG9mZnNldCBpcyBOT1QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVnaW9uCi0JCQlpZiAob2Zmc2V0ID4gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSArIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpIHsKLQkJCQkvLyBJcyB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgd2hpdGVzcGFjZSBhZnRlciB0aGUgdGV4dCBpbiB0aGlzCi0JCQkJLy8gcmVnaW9uPwotCQkJCS8vIElmIHNvLCB1c2UgdGhlIG5leHQgcmVnaW9uCi0JCQkJSVRleHRSZWdpb24gbmV4dFJlZ2lvbiA9IHNkUmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgKyByZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWlmIChuZXh0UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJcmVnaW9uID0gbmV4dFJlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBJcyB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgaW1wb3J0YW50IHRleHQgZm9yIHRoaXMgcmVnaW9uPwotCQkJCS8vIElmIHNvLCB0aGVuIHdlJ3ZlIGFscmVhZHkgZ290IHRoZSByaWdodCBvbmUuCi0JCQl9Ci0JCX0KLQotCQkvLyB2YWxpZCBXSElURV9TUEFDRSByZWdpb24gaGFuZGxlciAoIzE3OTkyNCkKLQkJaWYgKChyZWdpb24gIT0gbnVsbCkgJiYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRSkpIHsKLQkJCUlUZXh0UmVnaW9uIHByZXZpb3VzUmVnaW9uID0gc2RSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSAtIDEpOwotCQkJaWYgKHByZXZpb3VzUmVnaW9uICE9IG51bGwpIHsKLQkJCQlyZWdpb24gPSBwcmV2aW91c1JlZ2lvbjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWdpb24gd2hvc2UgY29udGVudCdzIHJlcXVpcmUgY29tcGxldGlvbi4gVGhpcyBpcyBzb21ldGhpbmcKLQkgKiBvZiBhIG1pc25vbWVyIGFzIHNvbWV0aW1lcyB0aGUgdXNlciB3YW50cyB0byBiZSBwcm9tcHRlZCBmb3IgY29udGVudHMKLQkgKiBvZiBhIG5vbi1leGlzdGFudCBJVGV4dFJlZ2lvbiwgc3VjaCBhcyBmb3IgZW51bWVyYXRlZCBhdHRyaWJ1dGUgdmFsdWVzCi0JICogZm9sbG93aW5nIGFuICc9JyBzaWduLgotCSAqLwotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBnZXRDb21wbGV0aW9uUmVnaW9uKGludCBkb2N1bWVudFBvc2l0aW9uLCBOb2RlIGRvbW5vZGUpIHsKLQkJaWYgKGRvbW5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlpbnQgb2Zmc2V0ID0gZG9jdW1lbnRQb3NpdGlvbjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGRvbW5vZGU7Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCWlmIChub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpID09IDApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCUlUZXh0UmVnaW9uIHJlc3VsdCA9IG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJd2hpbGUgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJb2Zmc2V0LS07Ci0JCQkJcmVzdWx0ID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZyA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWcgPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCS8vIERldGVybWluZSBpZiB0aGUgb2Zmc2V0IGlzIHdpdGhpbiB0aGUgc3RhcnQKLQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZW5kIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIG9yCi0JCS8vIHNvbWV3aGVyZSB3aXRoaW4gdGhlIE5vZGUncyBYTUwgY29udGVudC4KLQkJaWYgKChzdGFydFRhZyAhPSBudWxsKSAmJiAoc3RhcnRUYWcuZ2V0U3RhcnRPZmZzZXQoKSA8PSBvZmZzZXQpICYmIChvZmZzZXQgPCBzdGFydFRhZy5nZXRTdGFydE9mZnNldCgpICsgc3RhcnRUYWcuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQlmbGF0Tm9kZSA9IHN0YXJ0VGFnOwotCQl9Ci0JCWVsc2UgaWYgKChlbmRUYWcgIT0gbnVsbCkgJiYgKGVuZFRhZy5nZXRTdGFydE9mZnNldCgpIDw9IG9mZnNldCkgJiYgKG9mZnNldCA8IGVuZFRhZy5nZXRTdGFydE9mZnNldCgpICsgZW5kVGFnLmdldExlbmd0aCgpKSkgewotCQkJZmxhdE5vZGUgPSBlbmRUYWc7Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJLy8gdGhlIG9mZnNldCBpcyBkZWZpbml0ZWx5IHdpdGhpbiB0aGUgc3RhcnQgb3IgZW5kIHRhZywgY29udGludWUKLQkJCS8vIG9uIGFuZCBmaW5kIHRoZSByZWdpb24KLQkJCXJlZ2lvbiA9IGdldENvbXBsZXRpb25SZWdpb24ob2Zmc2V0LCBmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB0aGUgZG9jUG9zaXRpb24gaXMgbmVpdGhlciB3aXRoaW4gdGhlIHN0YXJ0IG5vciB0aGUgZW5kLCBzbyBpdAotCQkJLy8gbXVzdCBiZSBjb250ZW50Ci0JCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCS8vIChwYSkgSVRleHRSZWdpb24gcmVmYWN0b3IKLQkJCS8vIGlmIChmbGF0Tm9kZS5jb250YWlucyhkb2N1bWVudFBvc2l0aW9uKSkgewotCQkJaWYgKChmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpIDw9IGRvY3VtZW50UG9zaXRpb24pICYmIChmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKSA+PSBkb2N1bWVudFBvc2l0aW9uKSkgewotCQkJCS8vIHdlJ3JlIGludGVyZXN0aW5nIGluIGNvbXBsZXRpbmcvZXh0ZW5kaW5nIHRoZSBwcmV2aW91cwotCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaWYgdGhlIGN1cnJlbnQKLQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzbid0IHBsYWluIGNvbnRlbnQgb3IgaWYgaXQncwotCQkJCS8vIHByZWNlZGVkIGJ5IGFuIG9ycGhhbiAnPCcKLQkJCQlpZiAoKG9mZnNldCA9PSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpKSAmJiAoZmxhdE5vZGUuZ2V0UHJldmlvdXMoKSAhPSBudWxsKSAmJiAoKChmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uKSAhPSBudWxsKSAmJiAoZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbikuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpKSB8fCAoZmxhdE5vZGUuZ2V0UHJldmlvdXMoKS5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB8fCAoZmxhdE5vZGUuZ2V0UHJldmlvdXMoKS5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikpKSB7Ci0JCQkJCS8vIElzIHRoZSByZWdpb24gYWxzbyB0aGUgc3RhcnQgb2YgdGhlIG5vZGU/IElmIHNvLCB0aGUKLQkJCQkJLy8gcHJldmlvdXMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcwotCQkJCQkvLyB3aGVyZSB0byBsb29rIGZvciBhIHVzZWZ1bCByZWdpb24uCi0JCQkJCXJlZ2lvbiA9IGZsYXROb2RlLmdldFByZXZpb3VzKCkuZ2V0TGFzdFJlZ2lvbigpOwotCQkJCX0KLQkJCQllbHNlIGlmIChmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKSA9PSBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCQkJCXJlZ2lvbiA9IGZsYXROb2RlLmdldExhc3RSZWdpb24oKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlZ2lvbiA9IGZsYXROb2RlLmdldEZpcnN0UmVnaW9uKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gY2F0Y2ggZW5kIG9mIGRvY3VtZW50IHBvc2l0aW9ucyB3aGVyZSB0aGUgZG9jUG9zaXRpb24gaXNuJ3QKLQkJCQkvLyBpbiBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQlyZWdpb24gPSBmbGF0Tm9kZS5nZXRMYXN0UmVnaW9uKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVkIGJ5IGRlZmF1bHQuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHdpdGggdGhlaXIgb3duCi0JICogaW1wbGVtZW50YXRpb25zLgotCSAqIAotCSAqIEBzZWUgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbnRlbnRHZW5lcmF0b3IoKQotCSAqLwotCXB1YmxpYyBYTUxDb250ZW50TW9kZWxHZW5lcmF0b3IgZ2V0Q29udGVudEdlbmVyYXRvcigpIHsKLQkJaWYgKGZHZW5lcmF0b3IgPT0gbnVsbCkgewotCQkJZkdlbmVyYXRvciA9IG5ldyBYTUxDb250ZW50TW9kZWxHZW5lcmF0b3IoKTsKLQkJfQotCQlyZXR1cm4gZkdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gZW50ZXJlZCBieSB0aGUgdXNlciBzaG91bGQKLQkgKiBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgdGhlIHByZXNlbnRhdGlvbiBvZiBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyBmb3IgcHJlc2VudGluZyBjb250ZXh0IGluZm9ybWF0aW9uIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXV0byBhY3RpdmF0aW9uIGlzIGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIGNvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgdmFsaWRhdG9yIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gZGlzcGxheWVkIGNvbnRleHQKLQkgKiBpbmZvcm1hdGlvbiBzaG91bGQgYmUgZGlzbWlzc2VkLiBNYXkgb25seSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGUgcHJvY2Vzc29yIGlzIGluY2FwYWJsZSBvZiBjb21wdXRpbmcgY29udGV4dCBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBhIGNvbnRleHQgaW5mb3JtYXRpb24gdmFsaWRhdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQlpZiAoZkNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciA9PSBudWxsKSB7Ci0JCQlmQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyID0gbmV3IEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlcigpOwotCQl9Ci0JCXJldHVybiBmQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0RWxlbWVudFBvc2l0aW9uKE5vZGUgY2hpbGQpIHsKLQkJTm9kZSBwYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpbnQgY291bnQgPSAwOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKGNoaWxkcmVuLml0ZW0oaSkgPT0gY2hpbGQpIHsKLQkJCQlyZXR1cm4gY291bnQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBpZiAoY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCWNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0RWxlbWVudFBvc2l0aW9uRm9yTW9kZWxRdWVyeShOb2RlIGNoaWxkKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50UG9zaXRpb24oY2hpbGQpOwotCQkvLyByZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWFzb24gd2h5IGNvbXB1dGVQcm9wb3NhbHMgd2FzIG5vdCBhYmxlIHRvIGZpbmQgYW55Ci0JICogY29tcGxldGlvbnMuCi0JICogCi0JICogYW4gZXJyb3IgbWVzc2FnZSBvciBudWxsIGlmIG5vIGVycm9yIG9jY3VycmVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBmRXJyb3JNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpUmVzb3VyY2UKLQkgKi8KLQkvLyBwdWJsaWMgdm9pZCBpbml0aWFsaXplKElSZXNvdXJjZSBpUmVzb3VyY2UpIHsKLQkvLyB0aGlzLnJlc291cmNlID0gaVJlc291cmNlOwotCS8vIH0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbmZvUHJvdmlkZXIuCi0JICogCi0JICogZkluZm9Qcm92aWRlciBhbmQgaWYgZkluZm9Qcm92aWRlciB3YXMgPGNvZGU+bnVsbDwvY29kZT4gY3JlYXRlIGEgbmV3Ci0JICogaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgTWFya3VwVGFnSW5mb1Byb3ZpZGVyIGdldEluZm9Qcm92aWRlcigpIHsKLQkJaWYgKGZJbmZvUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkluZm9Qcm92aWRlciA9IG5ldyBNYXJrdXBUYWdJbmZvUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZkluZm9Qcm92aWRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hdGNoU3RyaW5nKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBJVGV4dFJlZ2lvbiBhUmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICgoYVJlZ2lvbiA9PSBudWxsKSB8fCBpc0Nsb3NlUmVnaW9uKGFSZWdpb24pKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBudWxsOwotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IGFSZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAoKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB8fCAob2Zmc2V0ID4gcGFyZW50LmdldFN0YXJ0T2Zmc2V0KGFSZWdpb24pICsgYVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpKSB7Ci0JCQltYXRjaFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB7Ci0JCQltYXRjaFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoKHBhcmVudC5nZXRUZXh0KGFSZWdpb24pLmxlbmd0aCgpID4gMCkgJiYgKHBhcmVudC5nZXRTdGFydE9mZnNldChhUmVnaW9uKSA8IG9mZnNldCkpIHsKLQkJCQltYXRjaFN0cmluZyA9IHBhcmVudC5nZXRUZXh0KGFSZWdpb24pLnN1YnN0cmluZygwLCBvZmZzZXQgLSBwYXJlbnQuZ2V0U3RhcnRPZmZzZXQoYVJlZ2lvbikpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWF0Y2hTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBtYXRjaFN0cmluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0TmFtZVJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJdGVyYXRvciByZWdpb25MaXN0ID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChyZWdpb25MaXN0Lmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25MaXN0Lm5leHQoKTsKLQkJCWlmIChpc05hbWVSZWdpb24ocmVnaW9uKSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIGFsbCBvZiB0aGUgcG9zc2libGUgdmFsaWQgdmFsdWVzIGZvciB0aGlzIGF0dHJpYnV0ZQotCSAqIGRlY2xhcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhOb2RlIG5vZGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpIHsKLQkJTGlzdCBsaXN0ID0gbnVsbDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQlTdHJpbmdbXSBkYXRhVHlwZVZhbHVlcyA9IG51bGw7Ci0JCQkvLyBUaGUgTW9kZWxRdWVyeSBtYXkgbm90IGJlIGF2YWlsYWJsZSBpZiB0aGUgY29ycmVzcG9uZGluZwotCQkJLy8gYWRhcHRlcgotCQkJLy8gaXMgYWJzZW50Ci0JCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlkYXRhVHlwZVZhbHVlcyA9IG1vZGVsUXVlcnkuZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhlbGVtZW50LCBhZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoYWQuZ2V0QXR0clR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJCWRhdGFUeXBlVmFsdWVzID0gYWQuZ2V0QXR0clR5cGUoKS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRhdGFUeXBlVmFsdWVzICE9IG51bGwpIHsKLQkJCQlsaXN0ID0gbmV3IEFycmF5TGlzdChkYXRhVHlwZVZhbHVlcy5sZW5ndGgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YVR5cGVWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJbGlzdC5hZGQoZGF0YVR5cGVWYWx1ZXNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlcXVpcmVkTmFtZShOb2RlIHBhcmVudE9yT3duZXIsIENNTm9kZSBjbW5vZGUpIHsKLQkJaWYgKChjbW5vZGUgPT0gbnVsbCkgfHwgKHBhcmVudE9yT3duZXIgPT0gbnVsbCkpIHsKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdWxsIGRlY2xhcmF0aW9uISIpLnByaW50U3RhY2tUcmFjZSgpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldFJlcXVpcmVkTmFtZShwYXJlbnRPck93bmVyLCBjbW5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVxdWlyZWRUZXh0KE5vZGUgcGFyZW50T3JPd25lciwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCkgewotCQlpZiAoYXR0ckRlY2wgPT0gbnVsbCkgewotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwgYXR0cmlidXRlIGRlY2xhcmF0aW9uISIpLnByaW50U3RhY2tUcmFjZSgpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZ2V0Q29udGVudEdlbmVyYXRvcigpLmdlbmVyYXRlUmVxdWlyZWRBdHRyaWJ1dGUocGFyZW50T3JPd25lciwgYXR0ckRlY2wsIGJ1ZmYpOwotCQlyZXR1cm4gYnVmZi50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVxdWlyZWRUZXh0KE5vZGUgcGFyZW50T3JPd25lciwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpIHsKLQkJaWYgKGVsZW1lbnREZWNsID09IG51bGwpIHsKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiEiKS5wcmludFN0YWNrVHJhY2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWdldENvbnRlbnRHZW5lcmF0b3IoKS5nZW5lcmF0ZVRhZyhwYXJlbnRPck93bmVyLCBlbGVtZW50RGVjbCwgYnVmZik7Ci0JCXJldHVybiBidWZmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRWaWV3ZXIgbXVzdCBiZSBzZXQgYmVmb3JlIHVzaW5nIHRoaXMuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGludCBwb3MpIHsKLQkJLy8gKHBhKSBJVGV4dFJlZ2lvbiByZWZhY3RvciBkZWZlY3QgMjQ1MTkwCi0JCS8vIHJldHVybgotCQkvLyAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbilDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KChTdHJ1Y3R1cmVkVGV4dFZpZXdlcilmVGV4dFZpZXdlciwKLQkJLy8gcG9zKTsKLQkJcmV0dXJuIENvbnRlbnRBc3Npc3RVdGlscy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZlRleHRWaWV3ZXIsIHBvcyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFnTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCW5hbWUgPSBzZFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLy8gcmV0dXJucyBhIGxpc3Qgb2YgQ01Ob2RlcyB0aGF0IGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgcGFyZW50IGNvbnRleHQKLQkvLyBHaXZlbiB0aGUgZ3JhbW1hciBzaG93biBiZWxvdyBhbmQgYSBzbmlwcGV0IG9mIFhNTCBjb2RlICh3aGVyZSB0aGUgJ3wnCi0JLy8gaW5kaWNhdGVkIHRoZSBjdXJzb3IgcG9zaXRpb24pCi0JLy8gdGhlIGxpc3Qgd291bGQgcmV0dXJuIGFsbCBvZiB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgdGhhdCBhcmUKLQkvLyBwb3RlbnRpYWwgY2hpbGQgZWxlbWVudHMgb2YgRm9vLgotCS8vCi0JLy8gZ3JhbW1hciA6IEZvbyAtPiAoQSwgQiwgQykKLQkvLyBzbmlwcGV0IDogPEZvbz48QT58Ci0JLy8gcmVzdWx0IDoge0EsIEIsIEN9Ci0JLy8gCi0JLy8gVE9ETyBjcy4uLiBkbyB3ZSBuZWVkIHRvIHBhc3MgaW4gdGhlICdraW5kT2ZBY3Rpb24nPyBTZWVtcyB0byBtZSB3ZQotCS8vIGNvdWxkIGFzc3VtZSBpdCdzIGFsd2F5cyBhbiBpbnNlcnQuCi0JcHJvdGVjdGVkIExpc3QgZ2V0QXZhaWxhYmxlQ2hpbGRFbGVtZW50RGVjbGFyYXRpb25zKEVsZW1lbnQgcGFyZW50LCBpbnQgY2hpbGRQb3NpdGlvbiwgaW50IGtpbmRPZkFjdGlvbikgewotCQlMaXN0IG1vZGVsUXVlcnlBY3Rpb25zID0gZ2V0QXZhaWxhYmxlQ2hpbGRyZW5BdEluZGV4KHBhcmVudCwgY2hpbGRQb3NpdGlvbiwgTW9kZWxRdWVyeS5WQUxJRElUWV9OT05FKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2RlbFF1ZXJ5QWN0aW9ucy5pdGVyYXRvcigpOwotCQlMaXN0IGNtbm9kZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1vZGVsUXVlcnlBY3Rpb24gYWN0aW9uID0gKE1vZGVsUXVlcnlBY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICgoY2hpbGRQb3NpdGlvbiA8IDApIHx8ICgoKGFjdGlvbi5nZXRTdGFydEluZGV4KCkgPD0gY2hpbGRQb3NpdGlvbikgJiYgKGNoaWxkUG9zaXRpb24gPD0gYWN0aW9uLmdldEVuZEluZGV4KCkpKSAmJiAoYWN0aW9uLmdldEtpbmQoKSA9PSBraW5kT2ZBY3Rpb24pKSkgewotCQkJCUNNTm9kZSBhY3Rpb25DTU5vZGUgPSBhY3Rpb24uZ2V0Q01Ob2RlKCk7Ci0JCQkJaWYgKChhY3Rpb25DTU5vZGUgIT0gbnVsbCkgJiYgIWNtbm9kZXMuY29udGFpbnMoYWN0aW9uQ01Ob2RlKSkgewotCQkJCQljbW5vZGVzLmFkZChhY3Rpb25DTU5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY21ub2RlczsKLQl9Ci0KLQkvLyByZXR1cm5zIGEgbGlzdCBvZiBDTU5vZGVzIHRoYXQgY2FuIGJlIHZhbGlkbHkgaW5zZXJ0ZWQgYXQgdGhpcwotCS8vIGNoaWxkUG9zaXRpb24KLQkvLyBHaXZlbiB0aGUgZ3JhbW1hciBzaG93biBiZWxvdyBhbmQgYSBzbmlwcGV0IG9mIFhNTCBjb2RlICh3aGVyZSB0aGUgJ3wnCi0JLy8gaW5kaWNhdGVkIHRoZSBjdXJzb3IgcG9zaXRpb24pCi0JLy8gdGhlIGxpc3Qgd291bGQgcmV0dXJuIG9ubHkgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGNhbiBiZSBpbnNlcnRlZAotCS8vIHdoaWxlIG1haW50YWluZyB2YWxpZGl0eSBvZiB0aGUgY29udGVudC4KLQkvLwotCS8vIGdyYW1tYXIgOiBGb28gLT4gKEEsIEIsIEMpCi0JLy8gc25pcHBldCA6IDxGb28+PEE+fAotCS8vIHJlc3VsdCA6IHtCfQotCS8vICAgIAotCXByb3RlY3RlZCBMaXN0IGdldFZhbGlkQ2hpbGRFbGVtZW50RGVjbGFyYXRpb25zKEVsZW1lbnQgcGFyZW50LCBpbnQgY2hpbGRQb3NpdGlvbiwgaW50IGtpbmRPZkFjdGlvbikgewotCQlMaXN0IG1vZGVsUXVlcnlBY3Rpb25zID0gZ2V0QXZhaWxhYmxlQ2hpbGRyZW5BdEluZGV4KHBhcmVudCwgY2hpbGRQb3NpdGlvbiwgTW9kZWxRdWVyeS5WQUxJRElUWV9TVFJJQ1QpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZGVsUXVlcnlBY3Rpb25zLml0ZXJhdG9yKCk7Ci0JCUxpc3QgY21ub2RlcyA9IG5ldyBWZWN0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTW9kZWxRdWVyeUFjdGlvbiBhY3Rpb24gPSAoTW9kZWxRdWVyeUFjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKChjaGlsZFBvc2l0aW9uIDwgMCkgfHwgKCgoYWN0aW9uLmdldFN0YXJ0SW5kZXgoKSA8PSBjaGlsZFBvc2l0aW9uKSAmJiAoY2hpbGRQb3NpdGlvbiA8PSBhY3Rpb24uZ2V0RW5kSW5kZXgoKSkpICYmIChhY3Rpb24uZ2V0S2luZCgpID09IGtpbmRPZkFjdGlvbikpKSB7Ci0JCQkJQ01Ob2RlIGFjdGlvbkNNTm9kZSA9IGFjdGlvbi5nZXRDTU5vZGUoKTsKLQkJCQlpZiAoKGFjdGlvbkNNTm9kZSAhPSBudWxsKSAmJiAhY21ub2Rlcy5jb250YWlucyhhY3Rpb25DTU5vZGUpKSB7Ci0JCQkJCWNtbm9kZXMuYWRkKGFjdGlvbkNNTm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjbW5vZGVzOwotCX0KLQotCS8qKgotCSAqIFNpbWlsYXIgdG8gdGhlIGNhbGwgaW4gSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuIFBhc3MgaW4gYSBub2RlLCBpdAotCSAqIHRlbGxzIHlvdSBpZiB0aGUgZG9jdW1lbnQgaXMgWE1MIHR5cGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRYTUwoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCWRvYyA9IChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSA/IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpIDogKChEb2N1bWVudCkgbm9kZSk7Ci0KLQkJcmV0dXJuIChkb2MgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnQpICYmICgoSURPTURvY3VtZW50KSBkb2MpLmlzWE1MVHlwZSgpOwotCX0KLQotCS8vIEluaXRpYWxpemUgbG9jYWwgc2V0dGluZ3MKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkvLyBpbXBsZW1lbnQgaW4gc3ViY2xhc3NlcwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQ2xvc2VSZWdpb24oSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJcmV0dXJuICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9BVFRMSVNUX0RFQ0xfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VMRU1FTlRfREVDTF9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTl9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfQ0xPU0UpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0NPTU1FTlRfQ0xPU0UpIHx8ICh0eXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9ESVJFQ1RJVkVfQ0xPU0UpKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9DTE9TRSkpOwotCX0KLQotCS8qCi0JICogVGhpcyBpcyB0byBkZXRlcm1pbmUgaWYgYSB0YWcgaXMgYSBzcGVjaWFsIG1ldGEtaW5mbyBjb21tZW50IHRhZyB0aGF0Ci0JICogc2hvd3MgdXAgYXMgYW4gRUxFTUVOVAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NvbW1lbnROb2RlKElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuICgobm9kZSAhPSBudWxsKSAmJiAobm9kZSBpbnN0YW5jZW9mIElET01FbGVtZW50KSAmJiAoKElET01FbGVtZW50KSBub2RlKS5pc0NvbW1lbnRUYWcoKSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGN1cnNvciBwb3NpdGlvbiBpcyBhZnRlciBkb2N0eXBlIHRhZy4uLgotCSAqIAotCSAqIEBwYXJhbSBjYXIKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0N1cnNvckFmdGVyRG9jdHlwZShDb250ZW50QXNzaXN0UmVxdWVzdCBjYXIpIHsKLQkJTm9kZSBhTm9kZSA9IGNhci5nZXROb2RlKCk7Ci0JCURvY3VtZW50IHBhcmVudCA9IGFOb2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaW50IHhtbGRvY3R5cGVOb2RlUG9zaXRpb24gPSAtMTsKLQkJYm9vbGVhbiBpc0FmdGVyRG9jdHlwZSA9IHRydWU7Ci0KLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsgLy8gYmxhbmsgZG9jdW1lbnQgY2FzZQotCQl9Ci0KLQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQkJCXhtbGRvY3R5cGVOb2RlUG9zaXRpb24gPSAoKElET01Ob2RlKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCWlzQWZ0ZXJEb2N0eXBlID0gKGNhci5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSA+PSB4bWxkb2N0eXBlTm9kZVBvc2l0aW9uKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpc0FmdGVyRG9jdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gY2hlY2sgaWYgdGhlIGN1cnNvciBpcyBhZnRlciB0aGUgWE1MUEkKLQkgKiAKLQkgKiBAcGFyYW0gY2FyCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDdXJzb3JBZnRlclhNTFBJKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNhcikgewotCQlOb2RlIGFOb2RlID0gY2FyLmdldE5vZGUoKTsKLQkJYm9vbGVhbiB4bWxwaUZvdW5kID0gZmFsc2U7Ci0JCURvY3VtZW50IHBhcmVudCA9IGFOb2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaW50IHhtbHBpTm9kZVBvc2l0aW9uID0gLTE7Ci0JCWJvb2xlYW4gaXNBZnRlclhNTFBJID0gZmFsc2U7Ci0KLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsgLy8gYmxhbmsgZG9jdW1lbnQgY2FzZQotCQl9Ci0KLQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlib29sZWFuIHhtbHBpID0gKChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSAmJiBjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscygieG1sIikpOyAvLyROT04tTkxTLTEkCi0JCQl4bWxwaUZvdW5kID0geG1scGlGb3VuZCB8fCB4bWxwaTsKLQkJCWlmICh4bWxwaUZvdW5kKSB7Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQkJeG1scGlOb2RlUG9zaXRpb24gPSAoKElET01Ob2RlKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCWlzQWZ0ZXJYTUxQSSA9IChjYXIuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgPj0geG1scGlOb2RlUG9zaXRpb24pOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNBZnRlclhNTFBJOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmFtZVJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlyZXR1cm4gKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9ESVJFQ1RJVkVfTkFNRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMX05BTUUpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfTkFNRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQVRUTElTVF9ERUNMX05BTUUpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX1JPT1RfVEFHX05BTUUpIHx8IHR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RJUkVDVElWRV9OQU1FKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNRdW90ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZyB0cmltbWVkID0gc3RyaW5nLnRyaW0oKTsKLQkJaWYgKHRyaW1tZWQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXR1cm4gKHRyaW1tZWQuY2hhckF0KDApID09ICdcJycpIHx8ICh0cmltbWVkLmNoYXJBdCgwKSA9PSAnIicpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTZWxmQ2xvc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWcpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdGFydFRhZy5nZXRSZWdpb25zKCk7Ci0JCXJldHVybiByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzU3RhcnRUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoc2RSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA+IDApIHsKLQkJCUlUZXh0UmVnaW9uIHIgPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDApOwotCQkJcmVzdWx0ID0gKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSAmJiBzZFJlZ2lvbi5pc0VuZGVkKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydGllcyBtYXBUb1Byb3BlcnRpZXMoQ01OYW1lZE5vZGVNYXAgbWFwKSB7Ci0JCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUNNRW50aXR5RGVjbGFyYXRpb24gZGVjbCA9IChDTUVudGl0eURlY2xhcmF0aW9uKSBtYXAuaXRlbShpKTsKLQkJCXAucHV0KGRlY2wuZ2V0TmFtZSgpLCBkZWNsLmdldFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiBwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MTm9kZSwgYW5kIGNoZWNrcyBpZiBpdCdzIGNsb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnRUYWcKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbmVlZHNFbmRUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZykgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZlRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCXRyeSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlJRE9NTm9kZSB4bWxOb2RlID0gKElET01Ob2RlKSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZy5nZXRTdGFydCgpKTsKLQkJCQlpZiAoIWlzU3RhcnRUYWcoc3RhcnRUYWcpKSB7Ci0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIGlmIChpc1NlbGZDbG9zZWQoc3RhcnRUYWcpKSB7Ci0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIGlmICgheG1sTm9kZS5pc0NvbnRhaW5lcigpKSB7Ci0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0geG1sTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChOb2RlIG5vZGUsIE5vZGUgcG9zc2libGVQYXJlbnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIGludCBiZWdpbiwgaW50IGxlbmd0aCwgU3RyaW5nIGZpbHRlcikgewotCQlyZXR1cm4gbmV3IENvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGUsIHBvc3NpYmxlUGFyZW50LCBkb2N1bWVudFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgYmVnaW4sIGxlbmd0aCwgZmlsdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlmR2VuZXJhdG9yID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHJlYXNvbiB3aHkgY29tcHV0ZVByb3Bvc2FscyB3YXMgbm90IGFibGUgdG8gZmluZCBhbnkKLQkgKiBjb21wbGV0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQlmRXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcmVhc29uIHdoeSBjb21wdXRlUHJvcG9zYWxzIHdhcyBub3QgYWJsZSB0byBmaW5kIGFueQotCSAqIGNvbXBsZXRpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlLCBTdHJpbmcgYXBwZW5kKSB7Ci0JCXNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UgKyBhcHBlbmQpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcmVhc29uIHdoeSBjb21wdXRlUHJvcG9zYWxzIHdhcyBub3QgYWJsZSB0byBmaW5kIGFueQotCSAqIGNvbXBsZXRpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlLCBTdHJpbmcgcHJlcGVuZCwgU3RyaW5nIGFwcGVuZCkgewotCQlzZXRFcnJvck1lc3NhZ2UocHJlcGVuZCArIGVycm9yTWVzc2FnZSArIGFwcGVuZCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3RyaW5nc0VxdWFsKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQkvLyAocGEpIDIyMTE5MCBtYXRjaGluZyBpbmRlcGVuZGVudCBvZiBjYXNlIHRvIGJlIGNvbnNpc3RhbnQgd2l0aCBKYXZhCi0JCS8vIGVkaXRvciBDQQotCQlyZXR1cm4gYS5lcXVhbHNJZ25vcmVDYXNlKGIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0Fic3RyYWN0Q29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BYnN0cmFjdENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODg0NDgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0Fic3RyYWN0Q29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29udGVudE1vZGVsR2VuZXJhdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZW5lcmF0ZUNoaWxkcmVuID0gZmFsc2U7Ci0KLQlwdWJsaWMgQWJzdHJhY3RDb250ZW50TW9kZWxHZW5lcmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZ2VuZXJhdGVBdHRyaWJ1dGUoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcik7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUF0dHJpYnV0ZXMoQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJQ01OYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlnZW5lcmF0ZUF0dHJpYnV0ZSgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5pdGVtKGkpLCBidWZmZXIpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZUVuZFRhZyhTdHJpbmcgdGFnTmFtZSwgTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcik7Ci0KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZVJlcXVpcmVkQ2hpbGRyZW4oTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlpZiAoZ2VuZXJhdGVDaGlsZHJlbikgewotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZVN0YXJ0VGFnKFN0cmluZyB0YWdOYW1lLCBOb2RlIHBhcmVudE5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKTsKLQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlVGFnKE5vZGUgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlpZiAoKGVsZW1lbnREZWNsID09IG51bGwpIHx8IChidWZmZXIgPT0gbnVsbCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyB0YWdOYW1lID0gZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWxlbWVudERlY2wpOwotCi0JCWdlbmVyYXRlU3RhcnRUYWcodGFnTmFtZSwgcGFyZW50LCBlbGVtZW50RGVjbCwgYnVmZmVyKTsKLQkJZ2VuZXJhdGVSZXF1aXJlZENoaWxkcmVuKHBhcmVudCwgZWxlbWVudERlY2wsIGJ1ZmZlcik7Ci0JCWdlbmVyYXRlRW5kVGFnKHRhZ05hbWUsIHBhcmVudCwgZWxlbWVudERlY2wsIGJ1ZmZlcik7Ci0JCXJldHVybjsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldE1pbmltYWxTdGFydFRhZ0xlbmd0aChOb2RlIG5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWlyZWROYW1lKE5vZGUgb3duZXJOb2RlLCBDTU5vZGUgY21ub2RlKSB7Ci0JCWlmIChvd25lck5vZGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShjbW5vZGUsIG93bmVyTm9kZSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIGNtbm9kZS5nZXROb2RlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U3RhcnRUYWdDbG9zZShOb2RlIHBhcmVudE5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsKTsKLQotCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVzQXR0cmlidXRlcyhDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkgewotCQlDTU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWQuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmICgoKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJpYnV0ZXMuaXRlbShpKSkuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0Fic3RyYWN0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0Fic3RyYWN0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQyMWExOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BYnN0cmFjdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogPHA+SW1wbGVtZW50cyB0aGUgZnJhbWV3b3JrIGZvciBtYWtpbmcgcHJvcG9zYWxzIGluIFhNTCB0eXBlIGRvY3VtZW50cy4gIERlYWxzIHdpdGgKLSAqIGFsbCB0aGUgbmFzdGluZXNzIG5lZWRlZCB0byBmaWd1cmUgb3V0IHdoZXJlIGluIGFuIFhNTCB0eXBlIGRvY3VtZW50IHRoZSBjb250ZW50Ci0gKiBhc3Npc3Qgd2FzIGludm9rZWQgYW5kIHRoZW4gY2FsbHMgb25lIG9mIG1hbnkgYWJzdHJhY3QgbWV0aG9kcyBkZXBlbmRpbmcgb24gdGhlCi0gKiBhcmVhIHRoZSBjb250ZW50IGFzc2lzdCB3YXMgaW52b2tlZC4gIEluIHRoaXMgd2F5IGltcGxlbWVudGVycyBvbmx5IGhhdmUgdG8gd29ycnkgYWJvdXQKLSAqIGltcGxlbWVudGluZyB3aGF0IHRvIGRvIGluIGVhY2ggc2l0dWF0aW9uIHdoaWxlIG5vdCBoYXZpbmcgdG8gZGVhbCB3aXRoIGZpZ3VyaW5nIG91dAotICogd2hpY2ggc2l0dWF0aW9uIHRoZSBjb250ZW50IGFzc2lzdCB3YXMgaW52b2tlZCBpbi48L3A+Ci0gKiAKLSAqIEBiYXNlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IKLSAqIEBzZWUgRGVmYXVsdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIGltcGxlbWVudHMgSUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIHsKLQkvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DTE9TRSA9ICJKU1BfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9DTE9TRSA9ICJKU1BfQ09NTUVOVF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfT1BFTiA9ICJKU1BfQ09NTUVOVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RFQ0xBUkFUSU9OX09QRU4gPSAiSlNQX0RFQ0xBUkFUSU9OX09QRU4iOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX0NMT1NFID0gIkpTUF9ESVJFQ1RJVkVfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX05BTUUgPSAiSlNQX0RJUkVDVElWRV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX09QRU4gPSAiSlNQX0RJUkVDVElWRV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VYUFJFU1NJT05fT1BFTiA9ICJKU1BfRVhQUkVTU0lPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUk9PVF9UQUdfTkFNRSA9ICJKU1BfUk9PVF9UQUdfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1NDUklQVExFVF9PUEVOID0gIkpTUF9TQ1JJUFRMRVRfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmRXJyb3JNZXNzYWdlOwotCXByaXZhdGUgSVRleHRWaWV3ZXIgZlRleHRWaWV3ZXI7Ci0KLQlwdWJsaWMgQWJzdHJhY3RYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcigpIHsKLQkJZkVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCWZUZXh0Vmlld2VyID0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogPHA+UmV0dXJuIGEgbGlzdCBvZiBwcm9wb3NlZCBjb2RlIGNvbXBsZXRpb25zIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQKLQkgKiBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgY3Vyc29yCi0JICogcG9zaXRpb24gd2l0aGluIHRoZSB0ZXh0LWVkaXRvciBjb250cm9sLjwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscygKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCUlUZXh0Vmlld2VyIHRleHRWaWV3ZXIgPSBjb250ZXh0LmdldFZpZXdlcigpOwotCQlpbnQgZG9jdW1lbnRQb3NpdGlvbiA9IGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpOwotCi0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQotCQlmVGV4dFZpZXdlciA9IHRleHRWaWV3ZXI7Ci0KLQkJSW5kZXhlZFJlZ2lvbiB0cmVlTm9kZSA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJTm9kZSBub2RlID0gKE5vZGUpIHRyZWVOb2RlOwotCQl3aGlsZSAoKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpKSB7Ci0JCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJSURPTU5vZGUgeG1sbm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiA9IGdldENvbXBsZXRpb25SZWdpb24oZG9jdW1lbnRQb3NpdGlvbiwgbm9kZSk7Ci0KLQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gZ2V0TWF0Y2hTdHJpbmcoc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24pOwotCi0JCS8vIEhhbmRsZSBlbXB0eSBEb2N1bWVudHMKLQkJaWYgKGNvbXBsZXRpb25SZWdpb24gPT0gbnVsbCkgewotCQkJaWYgKCgodHJlZU5vZGUgPT0gbnVsbCkgfHwgKCgoTm9kZSkgdHJlZU5vZGUpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgJiYgKGNvbXBsZXRpb25SZWdpb24gPT0gbnVsbCkgJiYKLQkJCQkJKCh4bWxub2RlID09IG51bGwpIHx8ICh4bWxub2RlLmdldENoaWxkTm9kZXMoKSA9PSBudWxsKSB8fCAoeG1sbm9kZS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPT0gMCkpKSB7Ci0JCQkJCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWlmKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKChJU3RydWN0dXJlZERvY3VtZW50KXRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQlJRE9NRG9jdW1lbnQgZG9jTm9kZSA9ICgoSURPTU1vZGVsKSBzTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ldyBDb250ZW50QXNzaXN0UmVxdWVzdChkb2NOb2RlLCBkb2NOb2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbnVsbCk7Ci0JCQkJCQlhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwcm9ibGVtIGdldHRpbmcgbW9kZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoMCk7Ci0JCQkJfQotCQkJCQotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wcyA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQkJCQlyZXR1cm4gKHByb3BzICE9IG51bGwpID8gQXJyYXlzLmFzTGlzdChwcm9wcykgOiBuZXcgQXJyYXlMaXN0KDApOwotCQkJfQotCQkJLy8gTUFTU0lWRSBFUlJPUiBDT05ESVRJT04KLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY29tcGxldGlvbiByZWdpb24gd2FzIG51bGwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXNldEVycm9yTWVzc2FnZShYTUxVSU1lc3NhZ2VzLlNFVkVSRV9pbnRlcm5hbF9lcnJvcl9vY2N1X1VJXyk7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ldyBDb250ZW50QXNzaXN0UmVxdWVzdCgoTm9kZSkgdHJlZU5vZGUsIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcHMgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JCQlyZXR1cm4gKHByb3BzICE9IG51bGwpID8gQXJyYXlzLmFzTGlzdChwcm9wcykgOiBuZXcgQXJyYXlMaXN0KDApOwotCQl9Ci0KLQotCQkvLyBjYXRjaCBkb2N1bWVudHMgd2hlcmUgbm8gcmVnaW9uIGNhbiBiZSBkZXRlcm1pbmVkCi0JCWlmICgoeG1sbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKChjb21wbGV0aW9uUmVnaW9uID09IG51bGwpIHx8Ci0JCQkJKHhtbG5vZGUuZ2V0Q2hpbGROb2RlcygpID09IG51bGwpIHx8ICh4bWxub2RlLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA9PSAwKSkpIHsKLQkJCQotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlU3RhcnREb2N1bWVudFByb3Bvc2FscyhtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwKLQkJCQkJKElET01Ob2RlKSB0cmVlTm9kZSx4bWxub2RlLCBjb250ZXh0KTsKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wcyA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQkJCXJldHVybiAocHJvcHMgIT0gbnVsbCkgPyBBcnJheXMuYXNMaXN0KHByb3BzKSA6IG5ldyBBcnJheUxpc3QoMCk7Ci0JCX0KLQotCQkvLyBjb21wdXRlIG5vcm1hbCBwcm9wb3NhbHMKLQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgKElET01Ob2RlKSB0cmVlTm9kZSwgeG1sbm9kZSwgY29udGV4dCk7Ci0JCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdCA9PSBudWxsKSB7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ldyBDb250ZW50QXNzaXN0UmVxdWVzdCgoTm9kZSkgdHJlZU5vZGUsIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQlzZXRFcnJvck1lc3NhZ2UoWE1MVUlNZXNzYWdlcy5Db250ZW50X0Fzc2lzdF9ub3RfYXZhaWxhYl9VSV8pOwotCQl9Ci0KLQkJLyogCi0JCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjM4OTIKLQkJICogT25seSBzZXQgdGhpcyBlcnJvciBtZXNzYWdlIGlmIG5vdGhpbmcgZWxzZSB3YXMgYWxyZWFkeSBzZXQgCi0JCSAqKi8KLQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFByb3Bvc2FscygpLnNpemUoKSA9PSAwICYmIGdldEVycm9yTWVzc2FnZSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShYTUxVSU1lc3NhZ2VzLkNvbnRlbnRfQXNzaXN0X25vdF9hdmFpbGFiX1VJXyk7Ci0JCX0KLQotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcHMgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JCXJldHVybiAocHJvcHMgIT0gbnVsbCkgPyBBcnJheXMuYXNMaXN0KHByb3BzKSA6IG5ldyBBcnJheUxpc3QoMCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPlJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgcG9zc2libGUgY29udGV4dHMgYmFzZWQgb24gdGhlIHNwZWNpZmllZAotCSAqIGxvY2F0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBjdXJzb3IKLQkgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIHRleHQgdmlld2VyLjwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBMaXN0IGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQkvL25vIGRlZmF1bHQgY29udGV4dCBpbmZvCi0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjZ2V0RXJyb3JNZXNzYWdlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGZFcnJvck1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogQWRkIHByb3Bvc2FscyBmb3IgYXR0cmlidXRlIG5hbWVzCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRBc3Npc3RSZXF1ZXN0Ci0JICogQHBhcmFtIGNvbnRleHQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0KLQkvKioKLQkgKiBBZGQgcHJvcG9zYWxzIGZvciBhdHRyaWJ1dGUgdmFsdWVzCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRBc3Npc3RSZXF1ZXN0Ci0JICogQHBhcmFtIGNvbnRleHQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpOwotCi0JLyoqCi0JICogQWRkIGNvbW1lbnQgcHJvcG9zYWxzCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRBc3Npc3RSZXF1ZXN0Ci0JICogQHBhcmFtIGNvbnRleHQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRDb21tZW50UHJvcG9zYWwoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KTsKLQotCS8qKgotCSAqIEFkZCB0aGUgcHJvcG9zYWxzIGZvciBhIGNvbXBsZXRlbHkgZW1wdHkgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KTsKLQkKLQkvKioKLQkgKiBBZGQgdGhlIHByb3Bvc2FscyBmb3IgdGhlIG5hbWUgaW4gYW4gZW5kIHRhZwotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkRW5kVGFnTmFtZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpOwotCQotCS8qKgotCSAqIFByb21wdCBmb3IgZW5kIHRhZ3MgdG8gYSBub24tZW1wdHkgTm9kZSB0aGF0IGhhc24ndCBlbmRlZCBIYW5kbGVzIHRoZXNlCi0JICogY2FzZXM6IDxicj4KLQkgKiA8dGFnT3Blbj58IDxicj4KLQkgKiA8dGFnT3Blbj48IHw8YnI+Ci0JICogPHRhZ09wZW4+PC8gfAotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkRW5kVGFnUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0JCi0JLyoqCi0JICogQWRkIGVudGl0eSBwcm9wb3NhbHMKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gY29tcGxldGlvblJlZ2lvbgotCSAqIEBwYXJhbSB0cmVlTm9kZQotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkRW50aXR5UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LAotCQkJSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgdHJlZU5vZGUsIENvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpOwotCi0JLyoqCi0JICogYWRkIGVudGl0eSBwcm9wb3NhbHMKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcG9zYWxzCi0JICogQHBhcmFtIG1hcAotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcGFyYW0gbm9kZU9mZnNldAotCSAqIEBwYXJhbSBzZFJlZ2lvbgotCSAqIEBwYXJhbSBjb21wbGV0aW9uUmVnaW9uCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRFbnRpdHlQcm9wb3NhbHMoVmVjdG9yIHByb3Bvc2FscywgUHJvcGVydGllcyBtYXAsIFN0cmluZyBrZXksCi0JCQlpbnQgbm9kZU9mZnNldCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpOwotCi0JLyoqCi0JICogQWRkIFBDRGF0YSBwcm9wb3NhbHMKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZU5hbWUKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZFBDREFUQVByb3Bvc2FsKFN0cmluZyBub2RlTmFtZSwgQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KTsKLQotCS8qKgotCSAqIEFkZCBzdGFydCBkb2N1bWVudCBwcm9wb3NhbHMKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KTsKLQotCS8qKgotCSAqIENsb3NlIGFuIHVuY2xvc2VkIHN0YXJ0IHRhZwotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkVGFnQ2xvc2VQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KTsKLQotCS8qKgotCSAqIEFkZCB0YWcgaW5zZXJ0aW9uIHByb3Bvc2FscwotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjaGlsZFBvc2l0aW9uCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlpbnQgY2hpbGRQb3NpdGlvbiwgQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0KLQkvKioKLQkgKiBBZGQgdGFnIG5hbWUgcHJvcG9zYWxzCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRBc3Npc3RSZXF1ZXN0Ci0JICogQHBhcmFtIGNoaWxkUG9zaXRpb24KLQkgKiBAcGFyYW0gY29udGV4dAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZFRhZ05hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlpbnQgY2hpbGRQb3NpdGlvbiwgQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGVycm9yTWVzc2FnZSB0aGUgcmVhc29uIHdoeSBjb21wdXRlUHJvcG9zYWxzIHdhcyBub3QgYWJsZSB0byBmaW5kIGFueQotCSAqIGNvbXBsZXRpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0JCWZFcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7Ci0JfQotCQotCS8qKgotCSAqIDxwPlRoaXMgZG9lcyBhbGwgdGhlIG1hZ2ljIG9mIGZpZ3VyaW5nIG91dCB3aGVyZSBpbiB0aGUgWE1MIHR5cGUgZG9jdW1lbnQKLQkgKiB0aGUgY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQgYW5kIHRoZW4gY2FsbGluZyB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QKLQkgKiB0byBhZGQgdGhlIGNvcnJlY3QgcHJvcG9zYWxzPC9wPgotCSAqIAotCSAqIDxwPjxiPk5PVEU6IDwvYj5pZiBvdmVycmlkaW5nIGJlIHN1cmUgdG8gbWFrZSBzdXBlciBjYWxsIGJhY2sgdG8gdGhpcyBtZXRob2Qgb3RoZXJ3aXNlCi0JICogeW91IHdpbGwgbG9vc2UgYWxsIG9mIHRoZSBwcm9wb3NhbHMgZ2VuZXJhdGVkIGJ5IHRoaXMgbWV0aG9kPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtYXRjaFN0cmluZwotCSAqIEBwYXJhbSBjb21wbGV0aW9uUmVnaW9uCi0JICogQHBhcmFtIHRyZWVOb2RlCi0JICogQHBhcmFtIHhtbG5vZGUKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIAotCSAqIEByZXR1cm4ge0BsaW5rIENvbnRlbnRBc3Npc3RSZXF1ZXN0fSB0aGF0IG5vdyBoYXMgYWxsIHRoZSBwcm9wb3NhbHMgaW4gaXQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLAotCQkJSURPTU5vZGUgdHJlZU5vZGUsIElET01Ob2RlIHhtbG5vZGUsIENvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJCi0JCWludCBkb2N1bWVudFBvc2l0aW9uID0gY29udGV4dC5nZXRJbnZvY2F0aW9uT2Zmc2V0KCk7Ci0JCQotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0JCVN0cmluZyByZWdpb25UeXBlID0gY29tcGxldGlvblJlZ2lvbi5nZXRUeXBlKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJLy8gSGFuZGxlIHRoZSBtb3N0IGNvbW1vbiBhbmQgYmVzdCBzdXBwb3J0ZWQgY2FzZXMKLQkJaWYgKCh4bWxub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHx8ICh4bWxub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgewotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVUYWdPcGVuUHJvcG9zYWxzKG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSwgY29udGV4dCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlVGFnTmFtZVByb3Bvc2FscyhtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwKLQkJCQkJCXRyZWVOb2RlLCB4bWxub2RlLCBjb250ZXh0KTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlQXR0cmlidXRlUHJvcG9zYWxzKG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSwgY29udGV4dCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlRXF1YWxzUHJvcG9zYWxzKG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLAotCQkJCQkJdHJlZU5vZGUsIHhtbG5vZGUsIGNvbnRleHQpOwotCQkJfQotCQkJZWxzZSBpZiAoKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgJiYgKGRvY3VtZW50UG9zaXRpb24gPT0gc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldCgpKSAmJgotCQkJCQkoc2RSZWdpb24uZ2V0VGV4dChjb21wbGV0aW9uUmVnaW9uKS5lbmRzV2l0aCgiXCIiKSB8fCBzZFJlZ2lvbi5nZXRUZXh0KGNvbXBsZXRpb25SZWdpb24pLmVuZHNXaXRoKCJcJyIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJLy8gdGhpcyBpcyBmb3Igd2hlbiB0aGUgY3Vyc29yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGNsb3NpbmcKLQkJCQkvLyBxdW90ZSBmb3IgYW4gYXR0cmlidXRlLi4KLQkJCQlJRE9NTm9kZSBhY3R1YWxOb2RlID0gKElET01Ob2RlKSB4bWxub2RlLmdldE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbihzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSk7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXcgQ29udGVudEFzc2lzdFJlcXVlc3QoYWN0dWFsTm9kZSwgYWN0dWFsTm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQlhZGRUYWdDbG9zZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY29udGV4dCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUsIGNvbnRleHQpOwotCQkJfQotCQkJZWxzZSBpZiAoKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB8fCAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHx8Ci0JCQkJCShyZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9ESVJFQ1RJVkVfQ0xPU0UpKSkgewotCQkJCQotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gY29tcHV0ZVRhZ0Nsb3NlUHJvcG9zYWxzKG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSwgY29udGV4dCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gY29tcHV0ZUVuZFRhZ09wZW5Qcm9wb3NhbHMobWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sCi0JCQkJCQl0cmVlTm9kZSwgeG1sbm9kZSwgY29udGV4dCk7Ci0JCQl9Ci0JCQllbHNlIGlmICgocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB8fCAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSkgfHwKLQkJCQkJKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSkgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUEVfUkVGRVJFTkNFKSkgewotCQkJCQotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gY29tcHV0ZUNvbnRlbnRQcm9wb3NhbHMobWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sCi0JCQkJCQl0cmVlTm9kZSwgeG1sbm9kZSwgY29udGV4dCk7Ci0JCQl9Ci0KLQkJCS8vIFRoZXNlIElUZXh0UmVnaW9uIHR5cGVzIGJlZ2luIERPTSBFbGVtZW50cyBhcyB3ZWxsIGFuZCBhbHRob3VnaAotCQkJLy8gaW50ZXJuYWxseSBoYXJkZXIgdG8gYXNzaXN0LAotCQkJLy8gdGV4dCBpbnNlcnRpb25zIGRpcmVjdGx5IGJlZm9yZSB0aGVtIGNhbiBiZSBtYWRlCi0JCQllbHNlIGlmICgoZG9jdW1lbnRQb3NpdGlvbiA9PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgJiYKLQkJCQkJKHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0NPTU1FTlRfT1BFTikgfHwKLQkJCQkJCQlyZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9ERUNMQVJBVElPTl9PUEVOKSB8fAotCQkJCQkJCXJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RJUkVDVElWRV9PUEVOKSB8fAotCQkJCQkJCXJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0VYUFJFU1NJT05fT1BFTikgfHwKLQkJCQkJCQlyZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9TQ1JJUFRMRVRfT1BFTikgfHwKLQkJCQkJCQkocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOKSB8fAotCQkJCQkJCShyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pIHx8Ci0JCQkJCQkJKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOKSB8fAotCQkJCQkJCShyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4pKSkgewotCQkJCQotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3IENvbnRlbnRBc3Npc3RSZXF1ZXN0KHRyZWVOb2RlLCB4bWxub2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQlhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbih0cmVlTm9kZSksIGNvbnRleHQpOwotCQkJCWFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNvbnRleHQpOwotCQkJfQotCQl9Ci0JCS8vIE5vdCBhIERvY3VtZW50IG9yIEVsZW1lbnQ/IChvZGQgY2FzZXMgZ28gaGVyZSBmb3Igbm93KQotCQllbHNlIGlmIChpc0Nsb3NlUmVnaW9uKGNvbXBsZXRpb25SZWdpb24pKSB7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ldyBDb250ZW50QXNzaXN0UmVxdWVzdCh0cmVlTm9kZSwgeG1sbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0TGVuZ3RoKCksIDAsIG1hdGNoU3RyaW5nKTsKLQkJCWFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNvbnRleHQpOwotCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPj0gc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgewotCQkJCWFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uKHRyZWVOb2RlKSArIDEsIGNvbnRleHQpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKChkb2N1bWVudFBvc2l0aW9uID09IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKSAmJgotCQkJCShyZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9DT01NRU5UX09QRU4pIHx8Ci0JCQkJCQlyZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9ERUNMQVJBVElPTl9PUEVOKSB8fAotCQkJCQkJcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRElSRUNUSVZFX09QRU4pIHx8Ci0JCQkJCQlyZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9FWFBSRVNTSU9OX09QRU4pIHx8Ci0JCQkJCQlyZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9TQ1JJUFRMRVRfT1BFTikgfHwKLQkJCQkJCShyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pIHx8Ci0JCQkJCQkocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOKSB8fAotCQkJCQkJKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOKSB8fAotCQkJCQkJKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTikpKSB7Ci0JCQkKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3IENvbnRlbnRBc3Npc3RSZXF1ZXN0KHRyZWVOb2RlLCB4bWxub2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCWFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uKHRyZWVOb2RlKSwgY29udGV4dCk7Ci0JCQlhZGRTdGFydERvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0KTsKLQkJfQotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCQotCS8qKgotCSAqIDxwPlNpbWlsYXIgdG8ge0BsaW5rICNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCwgSVByb2dyZXNzTW9uaXRvcil9IG9ubHkgc3BlY2lmaWNseSBmb3IKLQkgKiBhdHRyaWJ1dGUgcHJvcG9zYWxzPC9wPgotCSAqIAotCSAqIDxwPkltcGxlbWVudGVycyBzaG91bGQgbm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBpdCBpcyBtYWRlIGF2YWlsYWJsZSB0byBpbXBsZW1lbnRlcnMgc28gdGhhdCBpZiB0aGV5IG92ZXJyaWRlCi0JICoge0BsaW5rICNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhTdHJpbmcsIElUZXh0UmVnaW9uLCBJRE9NTm9kZSwgSURPTU5vZGUsIENvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0KX0KLQkgKiB0aGV5IGNhbiBjYWxsIHRoaXMgbWV0aG9kIGlmIG5lZWRlZDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbWF0Y2hTdHJpbmcKLQkgKiBAcGFyYW0gY29tcGxldGlvblJlZ2lvbgotCSAqIEBwYXJhbSBub2RlQXRPZmZzZXQKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQXR0cmlidXRlUHJvcG9zYWxzKFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwKLQkJCUlET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSwgQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkKLQkJaW50IGRvY3VtZW50UG9zaXRpb24gPSBjb250ZXh0LmdldEludm9jYXRpb25PZmZzZXQoKTsKLQkJSVRleHRWaWV3ZXIgdmlld2VyID0gY29udGV4dC5nZXRWaWV3ZXIoKTsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQkvLyBpZiB0aGUgYXR0cmlidXRlIG5hbWUgaXMgc2VsZWN0ZWQsIHJlcGxhY2UgaXQgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBhdHRyaWJ1dGUKLQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPD0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgJiYgKHZpZXdlciAhPSBudWxsICYmIHZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCkueSAhPSAoc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pIC0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpKSkgewotCQkJLy8gc2V0dXAgdG8gaW5zZXJ0IG5ldyBhdHRyaWJ1dGVzCi0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ldyBDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBTZXR1cCB0byByZXBsYWNlIGFuIGV4aXN0aW5nIGF0dHJpYnV0ZSBuYW1lCi0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ldyBDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSwgY29tcGxldGlvblJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJfQotCQlhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0KTsKLQkJY29udGVudEFzc2lzdFJlcXVlc3Quc2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQljb250ZW50QXNzaXN0UmVxdWVzdC5zZXRSZXBsYWNlbWVudExlbmd0aCgwKTsKLQkJaWYgKChub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgJiYgKCFub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuaXNFbmRlZCgpKSkgewotCQkJYWRkVGFnQ2xvc2VQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNvbnRleHQpOwotCQl9Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0JCi0JLyoqCi0JICogPHA+dGhpcyBpcyB0aGUgcG9zaXRpb24gdGhlIGN1cnNvciBzaG91bGQgYmUgaW4gYWZ0ZXIgdGhlIHByb3Bvc2FsIGlzCi0JICogYXBwbGllZDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcG9zZWRUZXh0Ci0JICogQHJldHVybiB0aGUgcG9zaXRpb24gdGhlIGN1cnNvciBzaG91bGQgYmUgaW4gYWZ0ZXIgdGhlIHByb3Bvc2FsIGlzCi0JICogICAgICAgICBhcHBsaWVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0Q3Vyc29yUG9zaXRpb25Gb3JQcm9wb3NlZFRleHQoU3RyaW5nIHByb3Bvc2VkVGV4dCkgewotCQlpbnQgY3Vyc29yQWRqdXN0bWVudDsKLQkJY3Vyc29yQWRqdXN0bWVudCA9IHByb3Bvc2VkVGV4dC5pbmRleE9mKCJcIlwiIikgKyAxOyAvLyROT04tTkxTLTEkCi0JCS8vIG90aGVyd2lzZSwgYWZ0ZXIgdGhlIGZpcnN0IHRhZwotCQlpZiAoY3Vyc29yQWRqdXN0bWVudCA9PSAwKSB7Ci0JCQljdXJzb3JBZGp1c3RtZW50ID0gcHJvcG9zZWRUZXh0LmluZGV4T2YoJz4nKSArIDE7Ci0JCX0KLQkJaWYgKGN1cnNvckFkanVzdG1lbnQgPT0gMCkgewotCQkJY3Vyc29yQWRqdXN0bWVudCA9IHByb3Bvc2VkVGV4dC5sZW5ndGgoKSArIDE7Ci0JCX0KLQotCQlyZXR1cm4gY3Vyc29yQWRqdXN0bWVudDsKLQl9Ci0JCi0JLyoqCi0JICogPHA+aGVscGZ1bCB1dGlsaXR5IG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgaWYgb25lIHN0cmluZyBzdGFydHMgd2l0aCBhbm90aGVyIG9uZS4KLQkgKiBUaGlzIGlzIGNhc2UgaW5zZW5zaXRpdmUuIElmIGVpdGhlciBhcmUgbnVsbCB0aGVuIHJlc3VsdCBpcyA8Y29kZT50cnVlPC9jb2RlPjwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYVN0cmluZyB0aGUgc3RyaW5nIHRvIGNoZWNrIHRvIHNlZSBpZiBpdCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4Ci0JICogQHBhcmFtIHByZWZpeCBjaGVjayB0aGF0IHRoZSBnaXZlbiBzdHJpbmcgc3RhcnRzIHdpdGggdGhpcyBwcmVmaXgKLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeCwKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGJlZ2luc1dpdGgoU3RyaW5nIGFTdHJpbmcsIFN0cmluZyBwcmVmaXgpIHsKLQkJaWYgKChhU3RyaW5nID09IG51bGwpIHx8IChwcmVmaXggPT0gbnVsbCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBhU3RyaW5nLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChwcmVmaXgudG9Mb3dlckNhc2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLAotCQkJSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlLCBDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCQotCQlpbnQgZG9jdW1lbnRQb3NpdGlvbiA9IGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpOwotCQkKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQlpZiAoKGRvY3VtZW50UG9zaXRpb24gPiBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpKSAmJiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSAhPSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0TGVuZ3RoKCkpKSB7Ci0JCQkvLyBzZXR1cCB0byBhZGQgYSBuZXcgYXR0cmlidXRlIGF0IHRoZSBkb2N1bWVudFBvc2l0aW9uCi0JCQlJRE9NTm9kZSBhY3R1YWxOb2RlID0gKElET01Ob2RlKSBub2RlLmdldE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbihzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSk7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ldyBDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY29udGV4dCk7Ci0JCQlpZiAoKGFjdHVhbE5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSAmJiAhYWN0dWFsTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmlzRW5kZWQoKSkgewotCQkJCWFkZFRhZ0Nsb3NlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIHNldHVwIHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHZhbHVlCi0JCQlpZiAoIW5vZGVBdE9mZnNldC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmlzRW5kZWQoKSAmJiAoZG9jdW1lbnRQb3NpdGlvbiA8IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKSkgewotCQkJCS8vIGlmIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzbid0IGNsb3NlZCBhbmQgdGhlCi0JCQkJLy8gY3Vyc29yIGlzIGluIGZyb250IG9mIHRoZSB2YWx1ZSwgYWRkCi0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXcgQ29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCWFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNvbnRleHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IHJlcGxhY2VMZW5ndGggPSBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkKLQkJCQkvL2lmIGNvbnRhaW5lciByZWdpb24sIGJlIHN1cmUgcmVwbGFjZSBsZW5ndGggaXMgb25seSB0aGUgYXR0cmlidXRlIHZhbHVlIHJlZ2lvbiBub3QgdGhlIGVudGlyZSBjb250YWluZXIKLQkJCQlpZihjb21wbGV0aW9uUmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpewotCQkJCQlJVGV4dFJlZ2lvbiBvcGVuUmVnaW9uID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgY29tcGxldGlvblJlZ2lvbikuZ2V0Rmlyc3RSZWdpb24oKTsKLQkJCQkJSVRleHRSZWdpb24gY2xvc2VSZWdpb24gPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBjb21wbGV0aW9uUmVnaW9uKS5nZXRMYXN0UmVnaW9uKCk7Ci0JCQkJCQotCQkJCQkvKgotCQkJCQkgKiBjaGVjayB0byBzZWUgaWYgdGhlIGNvbnRhaW5lciBpcyBvcGVuZWQgdGhlIHNhbWUgd2F5IGl0cyBjbG9zZWQuCi0JCQkJCSAqIFN1Y2ggYXM6Ci0JCQkJCSAqIDxpbWcgc3JjPScgJwotCQkJCQkgKiBCdXQgbm90OgotCQkJCQkgKiA8aW1nIHNyYz0nCi0JCQkJCSAqIAotCQkJCQkgKiA8L2JvZHk+Ci0JCQkJCSAqIDwvaHRtbD4KLQkJCQkJICogSW4gdGhlIGxhdHRlciBjYXNlIHdlIG9ubHkgd2FudCB0byByZXBsYWNlIHRoZSBvcGVuaW5nIHRleHQgb2YgdGhlIGNvbnRhaW5lcgotCQkJCQkgKiBBZG1pdHRlZGx5IGNydWRlIHRlc3QsIGJ1dCBlZmZlY3RpdmUuCi0JCQkJCSAqLwotCQkJCQlpZihvcGVuUmVnaW9uLmdldFR5cGUoKSAhPSBjbG9zZVJlZ2lvbi5nZXRUeXBlKCkpIHsKLQkJCQkJCXJlcGxhY2VMZW5ndGggPSBvcGVuUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJfQotCQkJCX0gCi0JCQkJCi0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXcgQ29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwKLQkJCQkJCWNvbXBsZXRpb25SZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pLAotCQkJCQkJcmVwbGFjZUxlbmd0aCwgbWF0Y2hTdHJpbmcpOwotCQkJCQotCQkJCWFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQ29udGVudFByb3Bvc2FscyhTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sCi0JCQlJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUsIENvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJCi0JCWludCBkb2N1bWVudFBvc2l0aW9uID0gY29udGV4dC5nZXRJbnZvY2F0aW9uT2Zmc2V0KCk7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQotCQkvLyBzZXR1cCB0byBhZGQgY2hpbGRyZW4gYXQgdGhlIGNvbnRlbnQgbm9kZSdzIHBvc2l0aW9uCi0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3IENvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKCgoRG9jdW1lbnQpIG5vZGUpLmdldERvY3R5cGUoKSA9PSBudWxsKSkgewotCQkJYWRkU3RhcnREb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY29udGV4dCk7Ci0JCX0KLQkJYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBnZXRFbGVtZW50UG9zaXRpb24obm9kZUF0T2Zmc2V0KSwgY29udGV4dCk7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlhZGRFbmRUYWdQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNvbnRleHQpOwotCQl9Ci0JCS8vIGVudGl0aWVzPwotCQlhZGRFbnRpdHlQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNvbXBsZXRpb25SZWdpb24sIG5vZGUsIGNvbnRleHQpOwotCQkvLyBhZGRFbnRpdHlQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlRW5kVGFnT3BlblByb3Bvc2FscyhTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sCi0JCQlJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUsIENvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJCi0JCWludCBkb2N1bWVudFBvc2l0aW9uID0gY29udGV4dC5nZXRJbnZvY2F0aW9uT2Zmc2V0KCk7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJaW50IGNvbXBsZXRpb25SZWdpb25TdGFydCA9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pOwotCQlpbnQgY29tcGxldGlvblJlZ2lvbkxlbmd0aCA9IGNvbXBsZXRpb25SZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb25BdENvbXBsZXRpb25PZmZzZXQgPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGNvbXBsZXRpb25SZWdpb25TdGFydCArIGNvbXBsZXRpb25SZWdpb25MZW5ndGgpOwotCQlJVGV4dFJlZ2lvbiByZWdpb25BdEVuZE9mQ29tcGxldGlvbiA9IHNkUmVnaW9uQXRDb21wbGV0aW9uT2Zmc2V0LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGNvbXBsZXRpb25SZWdpb25TdGFydCArIGNvbXBsZXRpb25SZWdpb25MZW5ndGgpOwotCi0JCWlmICgoZG9jdW1lbnRQb3NpdGlvbiAhPSBjb21wbGV0aW9uUmVnaW9uU3RhcnQpICYmIChyZWdpb25BdEVuZE9mQ29tcGxldGlvbiAhPSBudWxsKSAmJiAocmVnaW9uQXRFbmRPZkNvbXBsZXRpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSkgewotCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IHJlZ2lvbkF0RW5kT2ZDb21wbGV0aW9uOwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXcgQ29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlQXRPZmZzZXQuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZVJlZ2lvbiksIG5hbWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobm9kZUF0T2Zmc2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gc2RSZWdpb24pIHsKLQkJCQkvLyBhYm5vcm1hbCBjYXNlLCB0aGlzIHVubWF0Y2hlZCBlbmQgdGFnIHdpbGwgYmUgYSBzaWJsaW5nCi0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXcgQ29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlQXRPZmZzZXQuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gbm9ybWFsIGNhc2UsIHRoaXMgZW5kIHRhZyBpcyB0aGUgcGFyZW50Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXcgQ29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlQXRPZmZzZXQsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgKGRvY3VtZW50UG9zaXRpb24gPj0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKwotCQkvLyBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSkKLQkJYWRkRW5kVGFnUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0KTsKLQkJLy8gZWxzZQotCQlpZiAoY29tcGxldGlvblJlZ2lvblN0YXJ0ID09IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJCS8vIHBvc2l0aW9uZWQgYXQgc3RhcnQgb2YgZW5kIHRhZwotCQkJYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBub2RlLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSwgY29udGV4dCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCi0JcHJpdmF0ZSBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlRXF1YWxzUHJvcG9zYWxzKFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwKLQkJCUlET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSwgQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkKLQkJaW50IGRvY3VtZW50UG9zaXRpb24gPSBjb250ZXh0LmdldEludm9jYXRpb25PZmZzZXQoKTsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQlpZiAoKHZhbHVlUmVnaW9uICE9IG51bGwpICYmICh2YWx1ZVJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgJiYgKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKSA8PSBkb2N1bWVudFBvc2l0aW9uKSkgewotCQkJLy8gcmVwbGFjZSB0aGUgYWRqYWNlbnQgYXR0cmlidXRlIHZhbHVlCi0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ldyBDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIHNkUmVnaW9uLCB2YWx1ZVJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pLCB2YWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGFwcGVuZCBhbiBhdHRyaWJ1dGUgdmFsdWUgYWZ0ZXIgdGhlICc9JwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXcgQ29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQl9Ci0JCWFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0KTsKLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCXByaXZhdGUgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLAotCQkJSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlLCBDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCQotCQlpbnQgZG9jdW1lbnRQb3NpdGlvbiA9IGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpOwotCQkKLQkJLy8gc2V0dXAgZm9yIGEgbm9uLWVtcHR5IGRvY3VtZW50LCBidXQgb25lIHRoYXQgaGFzbid0IGJlZW4gZm9ybWFsbHkKLQkJLy8gc3RhcnRlZAotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3IENvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwKLQkJCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbiksIGNvbXBsZXRpb25SZWdpb24sCi0JCQkJZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQlhZGRTdGFydERvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0KTsKLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCXByaXZhdGUgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVRhZ0Nsb3NlUHJvcG9zYWxzKFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwKLQkJCUlET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSwgQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkKLQkJaW50IGRvY3VtZW50UG9zaXRpb24gPSBjb250ZXh0LmdldEludm9jYXRpb25PZmZzZXQoKTsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCi0JCWlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgfHwgKGRvY3VtZW50UG9zaXRpb24gPj0gc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KCkpKSB7Ci0JCQkvLyB0aGlzIGlzIGEgY29udGVudCByZXF1ZXN0IGFzIHRoZSBkb2N1bWVudFBvc2l0aW9uIGlzIEFGVEVSIHRoZQotCQkJLy8gZW5kIG9mIHRoZSBjbG9zaW5nIHJlZ2lvbgotCQkJaWYgKChub2RlID09IG5vZGVBdE9mZnNldCkgJiYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpKSB7Ci0JCQkJbm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ldyBDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQlhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbihub2RlQXRPZmZzZXQpLCBjb250ZXh0KTsKLQkJCWlmICgobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkpIHsKLQkJCQlhZGRFbmRUYWdQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNvbnRleHQpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gYXQgdGhlIHN0YXJ0IG9mIHRoZSB0YWcncyBjbG9zZSBvciB3aXRoaW4gaXQKLQkJCUlUZXh0UmVnaW9uIGNsb3NlUmVnaW9uID0gc2RSZWdpb24uZ2V0TGFzdFJlZ2lvbigpOwotCQkJYm9vbGVhbiBpbnNpZGVUYWcgPSAhc2RSZWdpb24uaXNFbmRlZCgpIHx8IChkb2N1bWVudFBvc2l0aW9uIDw9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNsb3NlUmVnaW9uKSk7Ci0JCQlpZiAoaW5zaWRlVGFnKSB7Ci0JCQkJLy8gdGhpcyBpcyBhIHJlcXVlc3QgZm9yIGNvbXBsZXRpb25zIHdpdGhpbiBhIHRhZwotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3IENvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQlpZiAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpICYmIChub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpKSB7Ci0JCQkJCWFkZFRhZ0Nsb3NlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0KTsKLQkJCQl9Ci0JCQkJaWYgKHNkUmVnaW9uID09IG5vZGVBdE9mZnNldC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKSB7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LnNldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3Quc2V0UmVwbGFjZW1lbnRMZW5ndGgoMCk7Ci0JCQkJCWFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNvbnRleHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlVGFnTmFtZVByb3Bvc2FscyhTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sCi0JCQlJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUsIENvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJCi0JCWludCBkb2N1bWVudFBvc2l0aW9uID0gY29udGV4dC5nZXRJbnZvY2F0aW9uT2Zmc2V0KCk7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQotCQlpZiAoc2RSZWdpb24gIT0gbm9kZUF0T2Zmc2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCS8vIGNvbXBsZXRpbmcgdGhlICpmaXJzdCogdGFnIGluICI8dGFnbmFtZTEgfDx0YWduYW1lMiIKLQkJCUlET01Ob2RlIGFjdHVhbE5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKTsKLQkJCWlmIChhY3R1YWxOb2RlICE9IG51bGwpIHsKLQkJCQlpZiAoYWN0dWFsTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IHNkUmVnaW9uKSB7Ci0JCQkJCS8vIHN0YXJ0IHRhZwotCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pICsgY29tcGxldGlvblJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJCQkJLy8gaXQncyBhdHRyaWJ1dGVzCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ldyBDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiAtIG1hdGNoU3RyaW5nLmxlbmd0aCgpLCBtYXRjaFN0cmluZy5sZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQkJCQkJaWYgKG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgLSAxKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSAtIDEpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJCQkJCWFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNvbnRleHQpOwotCQkJCQkJfQotCQkJCQkJYWRkVGFnQ2xvc2VQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNvbnRleHQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gaXQncyBuYW1lCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ldyBDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLmdldFBhcmVudE5vZGUoKSwKLQkJCQkJCQkJc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24gLSBtYXRjaFN0cmluZy5sZW5ndGgoKSwKLQkJCQkJCQkJbWF0Y2hTdHJpbmcubGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJCQkJCWFkZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbihhY3R1YWxOb2RlKSwKLQkJCQkJCQkJY29udGV4dCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID49IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pICsgY29tcGxldGlvblJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJCQkJLy8gaW5zZXJ0IG5hbWUKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3IENvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUuZ2V0UGFyZW50Tm9kZSgpLAotCQkJCQkJCQlzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gcmVwbGFjZSBuYW1lCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ldyBDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLmdldFBhcmVudE5vZGUoKSwKLQkJCQkJCQkJc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pLAotCQkJCQkJCQljb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQkJCQl9Ci0JCQkJCWFkZEVuZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNvbnRleHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID4gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSkgewotCQkJCS8vIHVuY2xvc2VkIHRhZyB3aXRoIG9ubHkgYSBuYW1lOyBzaG91bGQgcHJvbXB0IGZvciBhdHRyaWJ1dGVzCi0JCQkJLy8gYW5kIGEgY2xvc2UgaW5zdGVhZAotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3IENvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sCi0JCQkJCQlkb2N1bWVudFBvc2l0aW9uIC0gbWF0Y2hTdHJpbmcubGVuZ3RoKCksIG1hdGNoU3RyaW5nLmxlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY29udGV4dCk7Ci0JCQkJYWRkVGFnQ2xvc2VQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNvbnRleHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMCkuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJCQlpbnQgcmVwbGFjZUxlbmd0aCA9IGRvY3VtZW50UG9zaXRpb24gLSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXcgQ29udGVudEFzc2lzdFJlcXVlc3Qobm9kZSwgbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLAotCQkJCQkJCWNvbXBsZXRpb25SZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pLCByZXBsYWNlTGVuZ3RoLCBtYXRjaFN0cmluZyk7Ci0JCQkJCWFkZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbihub2RlQXRPZmZzZXQpLCBjb250ZXh0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUlET01Ob2RlIGFjdHVhbE5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQlpZiAoYWN0dWFsTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpKSB7Ci0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXcgQ29udGVudEFzc2lzdFJlcXVlc3QoYWN0dWFsTm9kZSwgYWN0dWFsTm9kZS5nZXRQYXJlbnROb2RlKCksCi0JCQkJCQkJCQlzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXcgQ29udGVudEFzc2lzdFJlcXVlc3QoYWN0dWFsTm9kZSwgYWN0dWFsTm9kZS5nZXRQYXJlbnROb2RlKCksCi0JCQkJCQkJCQlzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbiksCi0JCQkJCQkJCQljb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQkJCQkJfQotCQkJCQkJYWRkRW5kVGFnTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY29udGV4dCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCXByaXZhdGUgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVRhZ09wZW5Qcm9wb3NhbHMoU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLAotCQkJSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlLCBDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCQotCQlpbnQgZG9jdW1lbnRQb3NpdGlvbiA9IGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpOwotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmIChzZFJlZ2lvbiAhPSBub2RlQXRPZmZzZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB8fCBzZFJlZ2lvbi5nZXRQcmV2aW91cygpICE9IG51bGwgJiYgc2RSZWdpb24uZ2V0UHJldmlvdXMoKS5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQkvLyBjb21wbGV0aW5nIHRoZSAqZmlyc3QqIFhNTF9UQUdfT1BFTiBpbiAiPDx0YWduYW1lIgotCQkJSURPTU5vZGUgYWN0dWFsTm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpOwotCQkJaWYgKGFjdHVhbE5vZGUgIT0gbnVsbCkgewotCQkJCWlmKHNkUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ldyBDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCQlpZihhY3R1YWxOb2RlLmhhc0NoaWxkTm9kZXMoKSkKLQkJCQkJCWFkZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQkJCQkJCWdldEVsZW1lbnRQb3NpdGlvbihhY3R1YWxOb2RlLmdldExhc3RDaGlsZCgpKSwgY29udGV4dCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWFkZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIDAsIGNvbnRleHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXcgQ29udGVudEFzc2lzdFJlcXVlc3QoYWN0dWFsTm9kZSwgYWN0dWFsTm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJCWFkZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbihhY3R1YWxOb2RlKSwgY29udGV4dCk7Ci0JCQkJfQotCQkJCWFkZEVuZFRhZ1Byb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY29udGV4dCk7IC8vIChwYSkgMjIwODUwCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA9PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgewotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJLy8gYXQgdGhlIHN0YXJ0IG9mIGFuIGV4aXN0aW5nIHRhZywgcmlnaHQgYmVmb3JlIHRoZSAnPCcKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXcgQ29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sCi0JCQkJCQkJY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCQlhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbihub2RlQXRPZmZzZXQpLCBjb250ZXh0KTsKLQkJCQkJYWRkRW5kVGFnUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCQkvLyBhdCB0aGUgb3BlbmluZyBvZiB0aGUgVkVSWSBmaXJzdCB0YWcgd2l0aCBhICc8JwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ldyBDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwKLQkJCQkJCQljb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSwgY29tcGxldGlvblJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJCQkJYWRkU3RhcnREb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY29udGV4dCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gd2l0aGluIHRoZSB3aGl0ZSBzcGFjZQotCQkJCUlUZXh0UmVnaW9uIG5hbWUgPSBnZXROYW1lUmVnaW9uKG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJLy8gKHBhKSBJVGV4dFJlZ2lvbiByZWZhY3RvcgotCQkJCS8vIGlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5jb250YWluc09mZnNldChkb2N1bWVudFBvc2l0aW9uKSkKLQkJCQkvLyB7Ci0JCQkJaWYgKChuYW1lICE9IG51bGwpICYmCi0JCQkJCQkoKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWUpIDw9IGRvY3VtZW50UG9zaXRpb24pICYmIChzZFJlZ2lvbi5nZXRFbmRPZmZzZXQobmFtZSkgPj0gZG9jdW1lbnRQb3NpdGlvbikpICYmCi0JCQkJCQkoc2RSZWdpb24uZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UgfHwgc2RSZWdpb24uZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpKXsgCi0JCQkJCQotCQkJCQkvLyByZXBsYWNlIHRoZSBleGlzdGluZyBuYW1lCi0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3IENvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGUsIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZSksIG5hbWUuZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBpbnNlcnQgYSB2YWxpZCBuZXcgbmFtZSwgb3IgcG9zc2libHkgYW4gZW5kIHRhZwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ldyBDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsICgoTm9kZSkgbm9kZUF0T2Zmc2V0KS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJCWFkZEVuZFRhZ1Byb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY29udGV4dCk7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LnNldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3Quc2V0UmVwbGFjZW1lbnRMZW5ndGgoMCk7Ci0JCQkJfQotCQkJCWFkZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbihub2RlQXRPZmZzZXQpLCBjb250ZXh0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCi0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBnZXRDb21wbGV0aW9uUmVnaW9uKGludCBvZmZzZXQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gc2RSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pID09IG9mZnNldCkgewotCQkJLy8gVGhlIG9mZnNldCBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZWdpb24KLQkJCWlmICgoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA9PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKSAmJiAoc2RSZWdpb24uZ2V0UHJldmlvdXMoKSAhPSBudWxsKSAmJiAoIXNkUmVnaW9uLmdldFByZXZpb3VzKCkuaXNFbmRlZCgpKSkgewotCQkJCS8vIElzIHRoZSByZWdpb24gYWxzbyB0aGUgc3RhcnQgb2YgdGhlIG5vZGU/IElmIHNvLCB0aGUKLQkJCQkvLyBwcmV2aW91cyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzCi0JCQkJLy8gd2hlcmUgdG8gbG9vayBmb3IgYSB1c2VmdWwgcmVnaW9uLgotCQkJCXJlZ2lvbiA9IHNkUmVnaW9uLmdldFByZXZpb3VzKCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0IC0gMSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBJcyB0aGVyZSBubyBzZXBhcmF0aW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgcHJldmlvdXMgcmVnaW9uPwotCQkJCS8vIElmIG5vdCwKLQkJCQkvLyB0aGVuIHRoYXQgcmVnaW9uIGlzIHRoZSBpbXBvcnRhbnQgb25lCi0JCQkJSVRleHRSZWdpb24gcHJldmlvdXNSZWdpb24gPSBzZFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQgLSAxKTsKLQkJCQlpZiAoKHByZXZpb3VzUmVnaW9uICE9IG51bGwpICYmIChwcmV2aW91c1JlZ2lvbiAhPSByZWdpb24pICYmIChwcmV2aW91c1JlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgPT0gcHJldmlvdXNSZWdpb24uZ2V0TGVuZ3RoKCkpKSB7Ci0JCQkJCXJlZ2lvbiA9IHByZXZpb3VzUmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIFRoZSBvZmZzZXQgaXMgTk9UIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlZ2lvbgotCQkJaWYgKG9mZnNldCA+IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgKyByZWdpb24uZ2V0VGV4dExlbmd0aCgpKSB7Ci0JCQkJLy8gSXMgdGhlIG9mZnNldCB3aXRoaW4gdGhlIHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIHRleHQgaW4gdGhpcwotCQkJCS8vIHJlZ2lvbj8KLQkJCQkvLyBJZiBzbywgdXNlIHRoZSBuZXh0IHJlZ2lvbgotCQkJCUlUZXh0UmVnaW9uIG5leHRSZWdpb24gPSBzZFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pICsgcmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQlpZiAobmV4dFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCXJlZ2lvbiA9IG5leHRSZWdpb247Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gSXMgdGhlIG9mZnNldCB3aXRoaW4gdGhlIGltcG9ydGFudCB0ZXh0IGZvciB0aGlzIHJlZ2lvbj8KLQkJCQkvLyBJZiBzbywgdGhlbiB3ZSd2ZSBhbHJlYWR5IGdvdCB0aGUgcmlnaHQgb25lLgotCQkJfQotCQl9Ci0KLQkJLy8gdmFsaWQgV0hJVEVfU1BBQ0UgcmVnaW9uIGhhbmRsZXIgKCMxNzk5MjQpCi0JCWlmICgocmVnaW9uICE9IG51bGwpICYmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0UpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBwcmV2aW91c1JlZ2lvbiA9IHNkUmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgLSAxKTsKLQkJCWlmIChwcmV2aW91c1JlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJcmVnaW9uID0gcHJldmlvdXNSZWdpb247Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVnaW9uIHdob3NlIGNvbnRlbnQncyByZXF1aXJlIGNvbXBsZXRpb24uIFRoaXMgaXMgc29tZXRoaW5nCi0JICogb2YgYSBtaXNub21lciBhcyBzb21ldGltZXMgdGhlIHVzZXIgd2FudHMgdG8gYmUgcHJvbXB0ZWQgZm9yIGNvbnRlbnRzCi0JICogb2YgYSBub24tZXhpc3RhbnQgSVRleHRSZWdpb24sIHN1Y2ggYXMgZm9yIGVudW1lcmF0ZWQgYXR0cmlidXRlIHZhbHVlcwotCSAqIGZvbGxvd2luZyBhbiAnPScgc2lnbi4KLQkgKi8KLQlwcml2YXRlIElUZXh0UmVnaW9uIGdldENvbXBsZXRpb25SZWdpb24oaW50IGRvY3VtZW50UG9zaXRpb24sIE5vZGUgZG9tbm9kZSkgewotCQlpZiAoZG9tbm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCWludCBvZmZzZXQgPSBkb2N1bWVudFBvc2l0aW9uOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgZG9tbm9kZTsKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJaWYgKG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJSVRleHRSZWdpb24gcmVzdWx0ID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQl3aGlsZSAocmVzdWx0ID09IG51bGwpIHsKLQkJCQlvZmZzZXQtLTsKLQkJCQlyZXN1bHQgPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZyA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJLy8gRGV0ZXJtaW5lIGlmIHRoZSBvZmZzZXQgaXMgd2l0aGluIHRoZSBzdGFydAotCQkvLyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBlbmQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgb3IKLQkJLy8gc29tZXdoZXJlIHdpdGhpbiB0aGUgTm9kZSdzIFhNTCBjb250ZW50LgotCQlpZiAoKHN0YXJ0VGFnICE9IG51bGwpICYmIChzdGFydFRhZy5nZXRTdGFydE9mZnNldCgpIDw9IG9mZnNldCkgJiYgKG9mZnNldCA8IHN0YXJ0VGFnLmdldFN0YXJ0T2Zmc2V0KCkgKyBzdGFydFRhZy5nZXRMZW5ndGgoKSkpIHsKLQkJCWZsYXROb2RlID0gc3RhcnRUYWc7Ci0JCX0KLQkJZWxzZSBpZiAoKGVuZFRhZyAhPSBudWxsKSAmJiAoZW5kVGFnLmdldFN0YXJ0T2Zmc2V0KCkgPD0gb2Zmc2V0KSAmJiAob2Zmc2V0IDwgZW5kVGFnLmdldFN0YXJ0T2Zmc2V0KCkgKyBlbmRUYWcuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQlmbGF0Tm9kZSA9IGVuZFRhZzsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkvLyB0aGUgb2Zmc2V0IGlzIGRlZmluaXRlbHkgd2l0aGluIHRoZSBzdGFydCBvciBlbmQgdGFnLCBjb250aW51ZQotCQkJLy8gb24gYW5kIGZpbmQgdGhlIHJlZ2lvbgotCQkJcmVnaW9uID0gZ2V0Q29tcGxldGlvblJlZ2lvbihvZmZzZXQsIGZsYXROb2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHRoZSBkb2NQb3NpdGlvbiBpcyBuZWl0aGVyIHdpdGhpbiB0aGUgc3RhcnQgbm9yIHRoZSBlbmQsIHNvIGl0Ci0JCQkvLyBtdXN0IGJlIGNvbnRlbnQKLQkJCWZsYXROb2RlID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJLy8gKHBhKSBJVGV4dFJlZ2lvbiByZWZhY3RvcgotCQkJLy8gaWYgKGZsYXROb2RlLmNvbnRhaW5zKGRvY3VtZW50UG9zaXRpb24pKSB7Ci0JCQlpZiAoKGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPD0gZG9jdW1lbnRQb3NpdGlvbikgJiYgKGZsYXROb2RlLmdldEVuZE9mZnNldCgpID49IGRvY3VtZW50UG9zaXRpb24pKSB7Ci0JCQkJLy8gd2UncmUgaW50ZXJlc3RpbmcgaW4gY29tcGxldGluZy9leHRlbmRpbmcgdGhlIHByZXZpb3VzCi0JCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpZiB0aGUgY3VycmVudAotCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXNuJ3QgcGxhaW4gY29udGVudCBvciBpZiBpdCdzCi0JCQkJLy8gcHJlY2VkZWQgYnkgYW4gb3JwaGFuICc8JwotCQkJCWlmICgob2Zmc2V0ID09IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpICYmCi0JCQkJCQkoZmxhdE5vZGUuZ2V0UHJldmlvdXMoKSAhPSBudWxsKSAmJgotCQkJCQkJKCgoZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbikgIT0gbnVsbCkgJiYKLQkJCQkJCQkJKGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSkgfHwKLQkJCQkJCQkJKGZsYXROb2RlLmdldFByZXZpb3VzKCkuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgfHwKLQkJCQkJCQkJKGZsYXROb2RlLmdldFByZXZpb3VzKCkuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pKSkgewotCQkJCQkKLQkJCQkJLy8gSXMgdGhlIHJlZ2lvbiBhbHNvIHRoZSBzdGFydCBvZiB0aGUgbm9kZT8gSWYgc28sIHRoZQotCQkJCQkvLyBwcmV2aW91cyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzCi0JCQkJCS8vIHdoZXJlIHRvIGxvb2sgZm9yIGEgdXNlZnVsIHJlZ2lvbi4KLQkJCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UHJldmlvdXMoKS5nZXRMYXN0UmVnaW9uKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGZsYXROb2RlLmdldEVuZE9mZnNldCgpID09IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0TGFzdFJlZ2lvbigpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0Rmlyc3RSZWdpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBjYXRjaCBlbmQgb2YgZG9jdW1lbnQgcG9zaXRpb25zIHdoZXJlIHRoZSBkb2NQb3NpdGlvbiBpc24ndAotCQkJCS8vIGluIGEgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCXJlZ2lvbiA9IGZsYXROb2RlLmdldExhc3RSZWdpb24oKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZWdpb247Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0RWxlbWVudFBvc2l0aW9uKE5vZGUgY2hpbGQpIHsKLQkJTm9kZSBwYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpbnQgY291bnQgPSAwOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKGNoaWxkcmVuLml0ZW0oaSkgPT0gY2hpbGQpIHsKLQkJCQlyZXR1cm4gY291bnQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBpZiAoY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCWNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWF0Y2hTdHJpbmcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIElUZXh0UmVnaW9uIGFSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJaWYgKChhUmVnaW9uID09IG51bGwpIHx8IGlzQ2xvc2VSZWdpb24oYVJlZ2lvbikpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyBtYXRjaFN0cmluZyA9IG51bGw7Ci0JCVN0cmluZyByZWdpb25UeXBlID0gYVJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICgocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHx8IChvZmZzZXQgPiBwYXJlbnQuZ2V0U3RhcnRPZmZzZXQoYVJlZ2lvbikgKyBhUmVnaW9uLmdldFRleHRMZW5ndGgoKSkpIHsKLQkJCW1hdGNoU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHsKLQkJCW1hdGNoU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCWlmICgocGFyZW50LmdldFRleHQoYVJlZ2lvbikubGVuZ3RoKCkgPiAwKSAmJiAocGFyZW50LmdldFN0YXJ0T2Zmc2V0KGFSZWdpb24pIDwgb2Zmc2V0KSkgewotCQkJCW1hdGNoU3RyaW5nID0gcGFyZW50LmdldFRleHQoYVJlZ2lvbikuc3Vic3RyaW5nKDAsIG9mZnNldCAtIHBhcmVudC5nZXRTdGFydE9mZnNldChhUmVnaW9uKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltYXRjaFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1hdGNoU3RyaW5nOwotCX0KLQotCXByaXZhdGUgSVRleHRSZWdpb24gZ2V0TmFtZVJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJdGVyYXRvciByZWdpb25MaXN0ID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChyZWdpb25MaXN0Lmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25MaXN0Lm5leHQoKTsKLQkJCWlmIChpc05hbWVSZWdpb24ocmVnaW9uKSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ2xvc2VSZWdpb24oSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJcmV0dXJuICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSkgfHwKLQkJCQkodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHx8Ci0JCQkJKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB8fAotCQkJCSh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFKSB8fAotCQkJCSh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UpIHx8Ci0JCQkJKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQVRUTElTVF9ERUNMX0NMT1NFKSB8fAotCQkJCSh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VMRU1FTlRfREVDTF9DTE9TRSkgfHwKLQkJCQkodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OX0NMT1NFKSB8fAotCQkJCSh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0NMT1NFKSB8fAotCQkJCSh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0NPTU1FTlRfQ0xPU0UpIHx8Ci0JCQkJKHR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RJUkVDVElWRV9DTE9TRSkpIHx8Ci0JCQkJKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNOYW1lUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCXJldHVybiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHx8Ci0JCQkJKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRElSRUNUSVZFX05BTUUpIHx8Ci0JCQkJKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMX05BTUUpIHx8Ci0JCQkJKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9OQU1FKSB8fAotCQkJCSh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0FUVExJU1RfREVDTF9OQU1FKSB8fAotCQkJCSh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX1JPT1RfVEFHX05BTUUpIHx8Ci0JCQkJdHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRElSRUNUSVZFX05BTUUpKTsKLQl9Ci0JCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRWaWV3ZXIgbXVzdCBiZSBzZXQgYmVmb3JlIHVzaW5nIHRoaXMuCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbnQgcG9zKSB7Ci0JCXJldHVybiBDb250ZW50QXNzaXN0VXRpbHMuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZUZXh0Vmlld2VyLCBwb3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0Fic3RyYWN0WE1MTW9kZWxRdWVyeUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BYnN0cmFjdFhNTE1vZGVsUXVlcnlDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWFiOTY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0Fic3RyYWN0WE1MTW9kZWxRdWVyeUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVudGl0eURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5hbWVkTm9kZU1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQXR0ckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuQ01JbWFnZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvLk1hcmt1cFRhZ0luZm9Qcm92aWRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogPHA+SW1wbGVtZW50YXRpb24gb2YgYW4ge0BsaW5rIEFic3RyYWN0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJ9IHRoYXQgdXNlcyB7QGxpbmsgTW9kZWxRdWVyeX1zCi0gKiB0byBtYWtlIGl0cyBwcm9wb3NhbHMuPC9wPgotICogCi0gKiBAYmFzZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhNTE1vZGVsUXVlcnlDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciBleHRlbmRzIEFic3RyYWN0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgewotCQotCXByaXZhdGUgc3RhdGljIE1hcmt1cFRhZ0luZm9Qcm92aWRlciBpbmZvUHJvdmlkZXIgPSBuZXcgTWFya3VwVGFnSW5mb1Byb3ZpZGVyKCk7Ci0JCi0JLyoqCi0JICogPHA+RGVmYXVsdCBjb25zdHJ1Y3RvcjwvcD4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RYTUxNb2RlbFF1ZXJ5Q29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIoKSB7Ci0JfQotCQotCS8qKgotCSAqIDxwPmRlZmF1bHQgaXMgdG8gZG8gbm90aGluZzwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjc2Vzc2lvbkVuZGVkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXNzaW9uRW5kZWQoKSB7Ci0JCS8vZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogPHA+ZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNzZXNzaW9uU3RhcnRlZCgpCi0JICovCi0JcHVibGljIHZvaWQgc2Vzc2lvblN0YXJ0ZWQoKSB7Ci0JCS8vZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0JfQotCQotCS8qKgotCSAqIEByZXR1cm4ge0BsaW5rIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvcn0gdXNlZCB0byBnZW5lcmF0ZSBwcm9wb3NhbHMKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yIGdldENvbnRlbnRHZW5lcmF0b3IoKTsKLQkKLQkvKioKLQkgKiA8cD5HaXZlbiBhIHtAbGluayBDTU5vZGV9IGdlbmVyYXRlZCBieSBhIG1vZGVsIHF1ZXJ5IHNob3VsZCBkZWNpZGUgaWYgdGhlCi0JICogYWN0aW9uIGlzIHZhbGlkIGZvciB0aGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBxdWVyeSBwcm9wb3NhbCBjb21wdXRlcjwvcD4KLQkgKiAKLQkgKiA8cD5UaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHtAbGluayBNb2RlbFF1ZXJ5fXMgcmV0dXJuIGEgbG90IG9mIHtAbGluayBDTU5vZGV9cyB0aGF0Ci0JICogY2FuIGNvbWUgZnJvbSBtdWx0aXBsZSBzb3VyY2VzIGFuZCBhIHBhcnRpY3VsYXIgY29tcHV0ZXIgbWF5IG5vdCB3YW50IHRvIHByb3Bvc2UKLQkgKiBhbGwgb2YgdGhlIGFjdGlvbnMgYXMgY29udGVudCBhc3Npc3QgcHJvcG9zYWxzPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb24ge0BsaW5rIENNTm9kZX0gdG8gZGVjaWRlIGlmIGl0IGlzIHZhbGlkIGFzIGEgcmVzdWx0Ci0JICogZm9yIHRoaXMgbW9kZWwgcXVlcnkgcHJvcG9zYWwgY29tcHV0ZXIKLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiB7QGxpbmsgQ01Ob2RlfSBpcyB2YWxpZCBmb3IgdGhpcwotCSAqIGNvbXB1dGVyLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gdmFsaWRNb2RlbFF1ZXJ5Tm9kZShDTU5vZGUgbm9kZSk7Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlTmFtZVByb3Bvc2FscygKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0RG9jdW1lbnRSZWdpb24oKTsKLQkJLy8gcmV0cmlldmUgdGhlIGxpc3Qgb2YgYXR0cmlidXRlcwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKG5vZGUpOwotCQlpZiAoZWxlbWVudERlY2wgIT0gbnVsbCkgewotCQkJQ01OYW1lZE5vZGVNYXBJbXBsIGF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKSk7Ci0JCQlhZGRNb2RlbFF1ZXJ5QXR0cmlidXRlRGVjbGFyYXRpb25zKG5vZGUsIGVsZW1lbnREZWNsLGF0dHJpYnV0ZXMpOwotCi0JCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpOwotCQkJaW50IGN1cnNvck9mZnNldCA9IGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpOwotCQkJLy8gY2hlY2sgd2hldGhlciBhbiBhdHRyaWJ1dGUgcmVhbGx5IGV4aXN0cyBmb3IgdGhlIHJlcGxhY2VtZW50Ci0JCQkvLyBvZmZzZXRzIEFORCBpZiBpdCBwb3NzZXNzZXMgYSB2YWx1ZQotCQkJYm9vbGVhbiBhdHRyQXRMb2NhdGlvbkhhc1ZhbHVlID0gZmFsc2U7Ci0JCQlib29sZWFuIHByb3Bvc2FsTmVlZHNTcGFjZSA9IGZhbHNlOwotCQkJTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlBdHRySW1wbCBleGlzdGluZ0F0dHIgPSAoQXR0ckltcGwpIGF0dHJzLml0ZW0oaSk7Ci0JCQkJSVRleHRSZWdpb24gbmFtZSA9IGV4aXN0aW5nQXR0ci5nZXROYW1lUmVnaW9uKCk7Ci0JCQkJCi0JCQkJaWYgKChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lKSA8PSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSkgJiYKLQkJCQkJCShzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lKSArIG5hbWUuZ2V0TGVuZ3RoKCkgPj0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgKyBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpKSAmJgotCQkJCQkJKGV4aXN0aW5nQXR0ci5nZXRWYWx1ZVJlZ2lvbigpICE9IG51bGwpKSB7Ci0JCQkJCS8vIHNlbGVjdGVkIHJlZ2lvbiBpcyBhdHRyaWJ1dGUgbmFtZQotCQkJCQlpZiAoY3Vyc29yT2Zmc2V0ID49IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWUpICYmIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCkgIT0gMCkKLQkJCQkJCWF0dHJBdExvY2F0aW9uSGFzVmFsdWUgPSB0cnVlOwotCQkJCQkvLyBwcm9wb3NlIG5ldyBhdHRyaWJ1dGUsIGN1cnNvciBpcyBhdCB0aGUgc3RhcnQgb2YgYW5vdGhlciBhdHRyaWJ1dGUgbmFtZQotCQkJCQllbHNlIGlmIChjdXJzb3JPZmZzZXQgPT0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZSkpCi0JCQkJCQlwcm9wb3NhbE5lZWRzU3BhY2UgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG9ubHkgYWRkIHByb3Bvc2FscyBmb3IgdGhlIGF0dHJpYnV0ZXMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCB0aGUgbWF0Y2hzdHJpbmcKLQkJCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQotCQkJCQlpZih2YWxpZE1vZGVsUXVlcnlOb2RlKGF0dHJEZWNsKSkgewotCQkJCQkJaW50IGlzUmVxdWlyZWQgPSAwOwotCQkJCQkJaWYgKGF0dHJEZWNsLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCQkJCWlzUmVxdWlyZWQgPSBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9SRVFVSVJFRDsKLQkJCQkJCX0KLQkKLQkJCQkJCWJvb2xlYW4gc2hvd0F0dHJpYnV0ZSA9IHRydWU7Ci0JCQkJCQlzaG93QXR0cmlidXRlID0gc2hvd0F0dHJpYnV0ZSAmJiBiZWdpbnNXaXRoKGdldFJlcXVpcmVkTmFtZShub2RlLCBhdHRyRGVjbCksIG1hdGNoU3RyaW5nLnRyaW0oKSk7Ci0JCQkJCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGF0dHJEZWNsKSk7Ci0JCQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gYXR0ciAhPSBudWxsID8gYXR0ci5nZXROYW1lUmVnaW9uKCkgOiBudWxsOwotCQkJCQkJLy8gbmFtZVJlZ2lvbi5nZXRFbmRPZmZzZXQoKSArIDEgaXMgcmVxdWlyZWQgdG8gYWxsb3cgZm9yCi0JCQkJCQkvLyBtYXRjaGVzIGFnYWluc3QgdGhlIGZ1bGwgbmFtZSBvZiBhbiBleGlzdGluZyBBdHRyCi0JCQkJCQlzaG93QXR0cmlidXRlID0gc2hvd0F0dHJpYnV0ZSAmJiAoKGF0dHIgPT0gbnVsbCkgfHwKLQkJCQkJCQkJKChuYW1lUmVnaW9uICE9IG51bGwpICYmCi0JCQkJCQkJCQkJKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pIDwKLQkJCQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkpICYmCi0JCQkJCQkJCQkJKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pICsgbmFtZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PQotCQkJCQkJCQkJCQkoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgKwotCQkJCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpKSApKSk7Ci0JCQkJCQlpZiAoc2hvd0F0dHJpYnV0ZSkgewotCQkJCQkJCS8vZ2V0IHRoZSBwcm9wb3NhbCBpbWFnZQotCQkJCQkJCUltYWdlIGF0dHJJbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGF0dHJEZWNsKTsKLQkJCQkJCQlpZiAoYXR0ckltYWdlID09IG51bGwpIHsKLQkJCQkJCQkJaWYgKGlzUmVxdWlyZWQgPiAwKSB7Ci0JCQkJCQkJCQlhdHRySW1hZ2UgPSB0aGlzLmdldFJlcXVpcmVkQXR0cmlidXRlSW1hZ2UoKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWF0dHJJbWFnZSA9IHRoaXMuZ2V0Tm90UmVxdWlyZWRBdHRyaWJ1dGVJbWFnZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQotCQkJCQkJCVN0cmluZyBwcm9wb3NlZFRleHQgPSBudWxsOwotCQkJCQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSBnZXRBZGRpdGlvbmFsSW5mbyhlbGVtZW50RGVjbCwgYXR0ckRlY2wpOwotCQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG51bGw7Ci0JCQkJCQkJLy8gYXR0cmlidXRlIGlzIGF0IHRoaXMgbG9jYXRpb24gYW5kIGFscmVhZHkgZXhpc3RzCi0JCQkJCQkJaWYgKGF0dHJBdExvY2F0aW9uSGFzVmFsdWUpIHsKLQkJCQkJCQkJLy8gb25seSBwcm9wb3NlIHRoZSBuYW1lCi0JCQkJCQkJCXByb3Bvc2VkVGV4dCA9IGdldFJlcXVpcmVkTmFtZShub2RlLCBhdHRyRGVjbCk7Ci0JCQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQkJCQkJCQlwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLAotCQkJCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIHByb3Bvc2VkVGV4dC5sZW5ndGgoKSwKLQkJCQkJCQkJCQlhdHRySW1hZ2UsIHByb3Bvc2VkVGV4dCwgbnVsbCwgcHJvcG9zZWRJbmZvLAotCQkJCQkJCQkJCVhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1hNTF9BVFRSSUJVVEVfTkFNRSArIGlzUmVxdWlyZWQsIHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCQkvLyBubyBhdHRyaWJ1dGUgZXhpc3RzIG9yIGlzIGVsc2V3aGVyZSwgZ2VuZXJhdGUKLQkJCQkJCQkvLyBtaW5pbWFsbHkKLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJQXR0ciBleGlzdGluZ0F0dHJOb2RlID0gKEF0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShnZXRSZXF1aXJlZE5hbWUobm9kZSwgYXR0ckRlY2wpKTsKLQkJCQkJCQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJCQkJCQkJaWYgKGV4aXN0aW5nQXR0ck5vZGUgIT0gbnVsbCkgewotCQkJCQkJCQkJdmFsdWUgPSBleGlzdGluZ0F0dHJOb2RlLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYgKHZhbHVlLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCQkJCXByb3Bvc2VkVGV4dCA9IGdldFJlcXVpcmVkTmFtZShub2RlLCBhdHRyRGVjbCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQlwcm9wb3NlZFRleHQgPSBnZXRSZXF1aXJlZFRleHQobm9kZSwgYXR0ckRlY2wpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChwcm9wb3NhbE5lZWRzU3BhY2UpCi0JCQkJCQkJCQlwcm9wb3NlZFRleHQgKz0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsCi0JCQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksCi0JCQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwKLQkJCQkJCQkJCQlhdHRyRGVjbC5nZXROb2RlTmFtZSgpLmxlbmd0aCgpICsgMiwgYXR0ckltYWdlLAotCQkJCQkJCQkvLyBpZiB0aGUgdmFsdWUgaXNuJ3QgZW1wdHkgKG5vIGVtcHR5IHNldCBvZiBxdW90ZXMpLCBzaG93IGl0Ci0JCQkJCQkJCS8vIEJVRyAyMDM0OTQsIGNvbnRlbnQgc3RyaW5ncyBtYXkgaGF2ZSAiIiwgYnV0IG5vdCBiZSBlbXB0eQotCQkJCQkJCQkvLyBBbiBlbXB0eSBzdHJpbmcgaXMgd2hlbiB0aGVyZSdzIG5vIGNvbnRlbnQgYmV0d2VlbiBkb3VibGUgcXVvdGVzCi0JCQkJCQkJCS8vIGFuZCB0aGVyZSBpcyBubyBzaW5nbGUgcXVvdGUgdGhhdCBtYXkgYmUgZW5jYXNpbmcgYSBkb3VibGUgcXVvdGUKLQkJCQkJCQkJCQkoKHByb3Bvc2VkVGV4dC5sYXN0SW5kZXhPZignXCInKSAtIHByb3Bvc2VkVGV4dC5pbmRleE9mKCdcIicpID09ICAxICYmCi0JCQkJCQkJCQkJCQlwcm9wb3NlZFRleHQuaW5kZXhPZignXCcnKSA9PSAtMSkpID8gZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGF0dHJEZWNsKSA6IHByb3Bvc2VkVGV4dCwKLQkJCQkJCQkJCQludWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1hNTF9BVFRSSUJVVEVfTkFNRSArIGlzUmVxdWlyZWQpOwotCQkJCQkJCX0KLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbGVtZW50X19pc191bmtub3duLCAobmV3IE9iamVjdFtde25vZGUuZ2V0Tm9kZU5hbWUoKX0pKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoCi0JCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJCi0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKTsKLQotCQkvLyBGaW5kIHRoZSBhdHRyaWJ1dGUgcmVnaW9uIGFuZCBuYW1lIGZvciB3aGljaCB0aGlzIHBvc2l0aW9uIHNob3VsZAotCQkvLyBoYXZlIGEgdmFsdWUgcHJvcG9zZWQKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvcGVuID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3Qgb3BlblJlZ2lvbnMgPSBvcGVuLmdldFJlZ2lvbnMoKTsKLQkJaW50IGkgPSBvcGVuUmVnaW9ucy5pbmRleE9mKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpKTsKLQkJaWYgKGkgPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpID49IDApIHsKLQkJCW5hbWVSZWdpb24gPSBvcGVuUmVnaW9ucy5nZXQoaS0tKTsKLQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vIHRoZSBuYW1lIHJlZ2lvbiBpcyBSRVFVSVJFRCB0byBkbyBhbnl0aGluZyB1c2VmdWwKLQkJaWYgKG5hbWVSZWdpb24gIT0gbnVsbCkgewotCQkJLy8gUmV0cmlldmUgdGhlIGRlY2xhcmF0aW9uCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKG5vZGUpOwotCi0JCQkvLyBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG5hbWVSZWdpb24uZ2V0VGV4dCgpOwotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBvcGVuLmdldFRleHQobmFtZVJlZ2lvbik7Ci0KLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSBudWxsOwotCi0JCQkvLyBObyBDTUVsZW1lbnREZWNsYXJhdGlvbiBtZWFucyBubyBhdHRyaWJ1dGUgbWV0YWRhdGEsIGJ1dCByZXRyaWV2ZSB0aGUKLQkJCS8vIGRlY2xhcmF0aW9uIGZvciB0aGUgYXR0cmlidXRlIG90aGVyd2lzZQotCQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCQlDTU5hbWVkTm9kZU1hcEltcGwgYWxsQXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoZWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQkJCXByaXZhdGUgTWFwIGNhc2VJbnNlbnNpdGl2ZTsKLQkJCQkJCi0JCQkJCXByaXZhdGUgTWFwIGdldENhc2VJbnNlbnNpdGl2ZU1hcCgpIHsKLQkJCQkJCWlmKGNhc2VJbnNlbnNpdGl2ZSA9PSBudWxsKQotCQkJCQkJCWNhc2VJbnNlbnNpdGl2ZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCQlyZXR1cm4gY2FzZUluc2Vuc2l0aXZlOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJCQkJCUNNTm9kZSBub2RlID0gc3VwZXIuZ2V0TmFtZWRJdGVtKG5hbWUpOwotCQkJCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCQkJCW5vZGUgPSAoQ01Ob2RlKSBnZXRDYXNlSW5zZW5zaXRpdmVNYXAoKS5nZXQobmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBub2RlOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgcHV0KENNTm9kZSBjbU5vZGUpIHsKLQkJCQkJCXN1cGVyLnB1dChjbU5vZGUpOwotCQkJCQkJZ2V0Q2FzZUluc2Vuc2l0aXZlTWFwKCkucHV0KGNtTm9kZS5nZXROb2RlTmFtZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5VUyksIGNtTm9kZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXRoaXMuYWRkTW9kZWxRdWVyeUF0dHJpYnV0ZURlY2xhcmF0aW9ucyhub2RlLCBlbGVtZW50RGVjbCwgYWxsQXR0cmlidXRlcyk7Ci0KLQkJCQlTdHJpbmcgbm9wcmVmaXhOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dHJpYnV0ZU5hbWUpOwotCQkJCWlmIChhbGxBdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYWxsQXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0cmlidXRlTmFtZSk7Ci0JCQkJCWlmIChhdHRyRGVjbCA9PSBudWxsKSB7Ci0JCQkJCQlhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhbGxBdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShub3ByZWZpeE5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChhdHRyRGVjbCA9PSBudWxsKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShYTUxVSU1lc3NhZ2VzLk5vX2tub3duX2F0dHJpYnV0ZV9fVUlfICsgYXR0cmlidXRlTmFtZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlTdHJpbmcgY3VycmVudFZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpLmdldE5vZGVWYWx1ZSgpOwotCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IG51bGw7Ci0JCQkvL2dldCBwcm9wb3NhbCBpbWFnZQotCQkJSW1hZ2UgaW1hZ2UgPSBDTUltYWdlVXRpbC5nZXRJbWFnZShhdHRyRGVjbCk7Ci0JCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCWlmICgoYXR0ckRlY2wgIT0gbnVsbCkgJiYgKGF0dHJEZWNsLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkpIHsKLQkJCQkJaW1hZ2UgPSB0aGlzLmdldFJlcXVpcmVkQXR0cmlidXRlSW1hZ2UoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpbWFnZSA9IHRoaXMuZ2V0Tm90UmVxdWlyZWRBdHRyaWJ1dGVJbWFnZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKChhdHRyRGVjbCAhPSBudWxsKSAmJiAoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKSAhPSBudWxsKSkgewotCQkJCS8vIGF0dHJpYnV0ZSBpcyBrbm93biwgcHJvbXB0IHdpdGggdmFsdWVzIGZyb20gdGhlIGRlY2xhcmF0aW9uCi0JCQkJcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8oZWxlbWVudERlY2wsIGF0dHJEZWNsKTsKLQkJCQlMaXN0IHBvc3NpYmxlVmFsdWVzID0gZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhub2RlLCBhdHRyRGVjbCk7Ci0JCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JCQkJaWYgKHBvc3NpYmxlVmFsdWVzLnNpemUoKSA+IDAgfHwgZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCQkJLy8gRU5VTUVSQVRFRCBWQUxVRVMKLQkJCQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKTsKLQkJCQkJaWYgKG1hdGNoU3RyaW5nID09IG51bGwpIHsKLQkJCQkJCW1hdGNoU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAoKG1hdGNoU3RyaW5nLmxlbmd0aCgpID4gMCkgJiYgKG1hdGNoU3RyaW5nLnN0YXJ0c1dpdGgoIlwiIikgfHwgbWF0Y2hTdHJpbmcuc3RhcnRzV2l0aCgiJyIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCW1hdGNoU3RyaW5nID0gbWF0Y2hTdHJpbmcuc3Vic3RyaW5nKDEpOwotCQkJCQl9Ci0JCQkJCWJvb2xlYW4gY3VycmVudFZhbGlkID0gZmFsc2U7Ci0KLQkJCQkJLy9jcmVhdGUgc3VnZ2VzdGlvbnMgZm9yIGVudW1lcmF0ZWQgdmFsdWVzCi0JCQkJCWludCByT2Zmc2V0ID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCk7Ci0JCQkJCWludCByTGVuZ3RoID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBqID0gcG9zc2libGVWYWx1ZXMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlTdHJpbmcgcG9zc2libGVWYWx1ZSA9IChTdHJpbmcpIGoubmV4dCgpOwotCQkJCQkJaWYoIXBvc3NpYmxlVmFsdWUuZXF1YWxzKGRlZmF1bHRWYWx1ZSkpIHsKLQkJCQkJCQljdXJyZW50VmFsaWQgPSBjdXJyZW50VmFsaWQgfHwgcG9zc2libGVWYWx1ZS5lcXVhbHMoY3VycmVudFZhbHVlKTsKLQkJCQkJCQlpZiAoKG1hdGNoU3RyaW5nLmxlbmd0aCgpID09IDApIHx8IHBvc3NpYmxlVmFsdWUuc3RhcnRzV2l0aChtYXRjaFN0cmluZykpIHsKLQkJCQkJCQkJU3RyaW5nIHJTdHJpbmcgPSAiXCIiICsgcG9zc2libGVWYWx1ZSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKAotCQkJCQkJCQkJCXJTdHJpbmcsIHJPZmZzZXQsIHJMZW5ndGgsIHBvc3NpYmxlVmFsdWUubGVuZ3RoKCkgKyAxLAotCQkJCQkJCQkJCVhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRU5VTSksCi0JCQkJCQkJCQkJclN0cmluZywgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZihkZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiAoKG1hdGNoU3RyaW5nLmxlbmd0aCgpID09IDApIHx8IGRlZmF1bHRWYWx1ZS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nKSkpIHsKLQkJCQkJCVN0cmluZyByU3RyaW5nID0gIlwiIiArIGRlZmF1bHRWYWx1ZSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQkJCQkJclN0cmluZywgck9mZnNldCwgckxlbmd0aCwgZGVmYXVsdFZhbHVlLmxlbmd0aCgpICsgMSwKLQkJCQkJCQkJWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9ERUZBVUxUKSwKLQkJCQkJCQkJclN0cmluZywgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICgoKGF0dHJEZWNsLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5GSVhFRCkgfHwKLQkJCQkJCShhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldEltcGxpZWRWYWx1ZUtpbmQoKSA9PSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfRklYRUQpKSAmJgotCQkJCQkJKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0SW1wbGllZFZhbHVlKCkgIT0gbnVsbCkpIHsKLQkJCQkJCi0JCQkJCS8vIEZJWEVEIHZhbHVlcwotCQkJCQlTdHJpbmcgdmFsdWUgPSBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldEltcGxpZWRWYWx1ZSgpOwotCQkJCQlpZiAoKHZhbHVlICE9IG51bGwpICYmICh2YWx1ZS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJCQlTdHJpbmcgclZhbHVlID0gIlwiIiArIHZhbHVlICsgIlwiIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQkJCQkJclZhbHVlLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwKLQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgclZhbHVlLmxlbmd0aCgpICsgMSwKLQkJCQkJCQkJaW1hZ2UsIHJWYWx1ZSwgbnVsbCwgcHJvcG9zZWRJbmZvLAotCQkJCQkJCQlYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCWlmICgoY3VycmVudFZhbHVlLmxlbmd0aCgpID4gMCkgJiYgIXZhbHVlLmVxdWFscyhjdXJyZW50VmFsdWUpKSB7Ci0JCQkJCQkJclZhbHVlID0gIlwiIiArIGN1cnJlbnRWYWx1ZSArICJcIiI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQkJcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHJWYWx1ZSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIHJWYWx1ZS5sZW5ndGgoKSArIDEsIGltYWdlLCByVmFsdWUsIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdW5rbm93biBhdHRyaWJ1dGUsIHNvIHN1cHBseSBuaWNlIGVtcHR5IHZhbHVlcwotCQkJCXByb3Bvc2VkSW5mbyA9IGdldEFkZGl0aW9uYWxJbmZvKG51bGwsIGVsZW1lbnREZWNsKTsKLQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBudWxsOwotCQkJCWlmICgoY3VycmVudFZhbHVlICE9IG51bGwpICYmIChjdXJyZW50VmFsdWUubGVuZ3RoKCkgPiAwKSkgewotCQkJCQlTdHJpbmcgclZhbHVlID0gIlwiIiArIGN1cnJlbnRWYWx1ZSArICJcIiI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChyVmFsdWUsCi0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksCi0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgMSwgaW1hZ2UsCi0JCQkJCQkJclZhbHVlLCBudWxsLCBwcm9wb3NlZEluZm8sCi0JCQkJCQkJWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoWE1MVUlNZXNzYWdlcy5Db250ZW50X0Fzc2lzdF9ub3RfYXZhaWxhYl9VSV8pOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZENvbW1lbnRQcm9wb3NhbCgKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkKLQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwobmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiPCEtLSAgLS0+IiwgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLAotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIDUsCi0JCQkJWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DT01NRU5UKSwKLQkJCQlOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkNvbW1lbnRfXywgKG5ldyBPYmplY3RbXXsiIDwhLS0gIC0tPiJ9KSksIC8vJE5PTi1OTFMtMSQKLQkJCQludWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DT01NRU5UKSk7Ci0JfQotCQotCQotCi0JLyoqCi0JICogQWRkIHRoZSBwcm9wb3NhbHMgZm9yIHRoZSBuYW1lIGluIGFuIGVuZCB0YWcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRUYWdOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCi0JCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRTdGFydE9mZnNldCgpICsgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkuZ2V0VGV4dExlbmd0aCgpIDwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkpIHsKLQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIj4iLCAvLyROT04tTkxTLTEkCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgMSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyksIE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuQ2xvc2Vfd2l0aF9fLCAobmV3IE9iamVjdFtdeyIgJz4nIn0pKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfRU5EX1RBR19OQU1FKTsKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJfQotCQllbHNlIHsKLQkJCU5vZGUgYU5vZGUgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0JCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpOwotCQkJaWYgKG1hdGNoU3RyaW5nLnN0YXJ0c1dpdGgoIjwvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW1hdGNoU3RyaW5nID0gbWF0Y2hTdHJpbmcuc3Vic3RyaW5nKDIpOwotCQkJfQotCQkJd2hpbGUgKGFOb2RlICE9IG51bGwpIHsKLQkJCQlpZiAoYU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlpZiAoYU5vZGUuZ2V0Tm9kZU5hbWUoKS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nKSkgewotCQkJCQkJSURPTU5vZGUgYVhNTE5vZGUgPSAoSURPTU5vZGUpIGFOb2RlOwotCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihhTm9kZSk7Ci0JCQkJCQkvL2RlY2xhcmF0aW9uIG11c3QgYmUgdmFsaWQgZm9yIHRoaXMgY29tcHV0ZXIgdG8gbWFrZSBwcm9wb3NhbAotCQkJCQkJaWYgKChhWE1MTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSAmJiAoZWQgPT0gbnVsbCB8fCAodmFsaWRNb2RlbFF1ZXJ5Tm9kZShlZCkgJiYgZWQuZ2V0Q29udGVudFR5cGUoKSAhPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkpKSB7Ci0JCQkJCQkJU3RyaW5nIHJlcGxhY2VtZW50VGV4dCA9IGFOb2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkJCQkJU3RyaW5nIGRpc3BsYXlUZXh0ID0gcmVwbGFjZW1lbnRUZXh0OwotCQkJCQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSAoZWQgIT0gbnVsbCkgPyBnZXRBZGRpdGlvbmFsSW5mbyhudWxsLCBlZCkgOiBudWxsOwotCQkJCQkJCWlmKCFjb250ZW50QXNzaXN0UmVxdWVzdC5nZXREb2N1bWVudFJlZ2lvbigpLmlzRW5kZWQoKSkgewotCQkJCQkJCQlyZXBsYWNlbWVudFRleHQgKz0gIj4iOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG51bGw7Ci0JCQkJCQkJLy8gZG91YmxlIGNoZWNrIHRvIHNlZSBpZiB0aGUgcmVnaW9uIGFjdGVkIHVwb24gaXMKLQkJCQkJCQkvLyBhIHRhZyBuYW1lOyByZXBsYWNlIGl0IGlmIHNvCi0JCQkJCQkJSW1hZ2UgaW1hZ2UgPSBDTUltYWdlVXRpbC5nZXRJbWFnZShlZCk7Ci0JCQkJCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJCQkJaW1hZ2UgPSB0aGlzLmdldEdlbmVyaWNUYWdJbWFnZSgpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQkJCQkJCQlyZXBsYWNlbWVudFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFN0YXJ0T2Zmc2V0KCksCi0JCQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkuZ2V0VGV4dExlbmd0aCgpLAotCQkJCQkJCQkJCXJlcGxhY2VtZW50VGV4dC5sZW5ndGgoKSwgaW1hZ2UsIGRpc3BsYXlUZXh0LCBudWxsLAotCQkJCQkJCQkJCXByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfRU5EX1RBR19OQU1FKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQkJCQkJCQlyZXBsYWNlbWVudFRleHQsCi0JCQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksCi0JCQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwKLQkJCQkJCQkJCQlyZXBsYWNlbWVudFRleHQubGVuZ3RoKCksIGltYWdlLAotCQkJCQkJCQkJCU5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuQ2xvc2Vfd2l0aF9fLAotCQkJCQkJCQkJCQkJKG5ldyBPYmplY3RbXXsiJyIgKyBkaXNwbGF5VGV4dCArICInIn0pKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9FTkRfVEFHX05BTUUpOwotCQkJCQkJCX0KLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYU5vZGUgPSBhTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHQgZm9yIGVuZCB0YWdzIHRvIGEgbm9uLWVtcHR5IE5vZGUgdGhhdCBoYXNuJ3QgZW5kZWQgSGFuZGxlcyB0aGVzZQotCSAqIGNhc2VzOiA8YnI+Ci0JICogPHRhZ09wZW4+fCA8YnI+Ci0JICogPHRhZ09wZW4+PCB8PGJyPgotCSAqIDx0YWdPcGVuPjwvIHwKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRUYWdQcm9wb3NhbHMoCi0JCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJCi0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFBhcmVudCgpOwotCi0JCWlmIChpc0NvbW1lbnROb2RlKG5vZGUpKSB7Ci0JCQkvLyBsb29wIGFuZCBmaW5kIG5vbiBjb21tZW50IG5vZGUgcGFyZW50Ci0JCQl3aGlsZSAoKG5vZGUgIT0gbnVsbCkgJiYgaXNDb21tZW50Tm9kZShub2RlKSkgewotCQkJCW5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0KLQkJLy8gbm9kZSBpcyBhbHJlYWR5IGNsb3NlZAotCQlpZiAobm9kZS5pc0Nsb3NlZCgpKSB7Ci0JCQkvLyBsb29wIGFuZCBmaW5kIG5vbiBjb21tZW50IHVuY2xvc2Ugbm9kZSBwYXJlbnQKLQkJCXdoaWxlICgobm9kZSAhPSBudWxsKSAmJiBub2RlLmlzQ2xvc2VkKCkpIHsKLQkJCQlub2RlID0gKElET01Ob2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJfQotCQkvLyB0aGVyZSB3ZXJlIG5vIHVuY2xvc2VkIHRhZ3MKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZGF0YSB0byBjcmVhdGUgYSBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwKLQkJU3RyaW5nIHJlcGxhY2VUZXh0ID0gbm9kZS5nZXROb2RlTmFtZSgpICsgIj4iOyAvLyROT04tTkxTLTEkCi0JCWludCByZXBsYWNlQmVnaW4gPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKTsKLQkJaW50IHJlcGxhY2VMZW5ndGggPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpOwotCQlpbnQgY3Vyc29yT2Zmc2V0ID0gbm9kZS5nZXROb2RlTmFtZSgpLmxlbmd0aCgpICsgMTsKLQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJSW1hZ2UgaW1hZ2UgPSB0aGlzLmdldEdlbmVyaWNUYWdJbWFnZSgpOwotCi0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJYm9vbGVhbiBhZGRQcm9wb3NhbCA9IGZhbHNlOwotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzRG9jID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGNvbnRleHQuZ2V0RG9jdW1lbnQoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24geG1sRW5kVGFnT3BlbiA9IHNEb2MuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkpOwotCQkJLy8gc2tpcCBiYWNrd2FyZCB0byAiPCIsICI8LyIsIG9yIHRoZSAodW5jbG9zZWQpIHN0YXJ0IHRhZywgbnVsbCBpZiBub3QgZm91bmQKLQkJCVN0cmluZyB0eXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICgoeG1sRW5kVGFnT3BlbiAhPSBudWxsKSAmJgotCQkJCQkoKHR5cGUgPSB4bWxFbmRUYWdPcGVuLmdldFR5cGUoKSkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSAmJgotCQkJCQkodHlwZSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpICYmICFuZWVkc0VuZFRhZyh4bWxFbmRUYWdPcGVuLCBjb250ZXh0KSAmJgotCQkJCQkodHlwZSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikpIHsKLQkJCQkKLQkJCQl4bWxFbmRUYWdPcGVuID0geG1sRW5kVGFnT3Blbi5nZXRQcmV2aW91cygpOwotCQkJfQotCi0JCQlpZiAoeG1sRW5kVGFnT3BlbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlub2RlID0gKElET01Ob2RlKSBub2RlLmdldE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbih4bWxFbmRUYWdPcGVuLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJbm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCWlmIChpc1N0YXJ0VGFnKHhtbEVuZFRhZ09wZW4pKSB7Ci0JCQkJLy8gdGhpcyBpcyB0aGUgY2FzZSBmb3IgYSBzdGFydCB0YWcgdy9vdXQgZW5kIHRhZwotCQkJCS8vIGVnOgotCQkJCS8vIDxwPgotCQkJCS8vIDwlIFN0cmluZyB0ZXN0ID0gInRlc3QiOyAlPgotCQkJCS8vIHwKLQkJCQlpZiAobmVlZHNFbmRUYWcoeG1sRW5kVGFnT3BlbiwgY29udGV4dCkpIHsKLQkJCQkJU3RyaW5nIHRhZ05hbWUgPSBnZXRUYWdOYW1lKHhtbEVuZFRhZ09wZW4pOwotCQkJCQl4bWxFbmRUYWdPcGVuLmdldFRleHRFbmRPZmZzZXQoKTsKLQkJCQkJcmVwbGFjZUxlbmd0aCA9IDA7Ci0JCQkJCXJlcGxhY2VUZXh0ID0gIjwvIiArIHRhZ05hbWUgKyAiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAkTk9OLU5MUy0yJAotCQkJCQljdXJzb3JPZmZzZXQgPSB0YWdOYW1lLmxlbmd0aCgpICsgMzsKLQkJCQkJZGlzcGxheVN0cmluZyA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuRW5kX3dpdGhfXywgKG5ldyBPYmplY3RbXXt0YWdOYW1lfSkpOwotCQkJCQlhZGRQcm9wb3NhbCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBjYXNlIGZvcjogPHRhZz4gPC8gfAotCQkJCS8vIHBvc3NpYmx5IDx0YWc+IDwvIHw8YW5vdGhlclRhZz4KLQkJCQkvLyBzaG91bGQgb25seSBiZSByZXBsYWNpbmcgd2hpdGUgc3BhY2UuLi4KLQkJCQlyZXBsYWNlTGVuZ3RoID0gKHJlcGxhY2VCZWdpbiA+IHhtbEVuZFRhZ09wZW4uZ2V0VGV4dEVuZE9mZnNldCgpKSA/IHJlcGxhY2VCZWdpbiAtIHhtbEVuZFRhZ09wZW4uZ2V0VGV4dEVuZE9mZnNldCgpIDogMDsKLQkJCQlyZXBsYWNlVGV4dCA9IG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI+IjsgLy8kTk9OLU5MUy0xJAotCQkJCWN1cnNvck9mZnNldCA9IHJlcGxhY2VUZXh0Lmxlbmd0aCgpOwotCQkJCXJlcGxhY2VCZWdpbiA9IHhtbEVuZFRhZ09wZW4uZ2V0VGV4dEVuZE9mZnNldCgpOwotCQkJCWRpc3BsYXlTdHJpbmcgPSBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkVuZF93aXRoXywgKG5ldyBPYmplY3RbXXtub2RlLmdldE5vZGVOYW1lKCl9KSk7Ci0JCQkJYWRkUHJvcG9zYWwgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJCS8vIHRoaXMgaXMgdGhlIGNhc2UgZm9yOiA8dGFnPiA8IHwKLQkJCQlyZXBsYWNlVGV4dCA9ICIvIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkICROT04tTkxTLTIkCi0JCQkJY3Vyc29yT2Zmc2V0ID0gcmVwbGFjZVRleHQubGVuZ3RoKCk7Ci0KLQkJCQkvLyBzaG91bGQgb25seSBiZSByZXBsYWNpbmcgd2hpdGUgc3BhY2UuLi4KLQkJCQlyZXBsYWNlTGVuZ3RoID0gKHJlcGxhY2VCZWdpbiA+IHhtbEVuZFRhZ09wZW4uZ2V0VGV4dEVuZE9mZnNldCgpKSA/IHJlcGxhY2VCZWdpbiAtIHhtbEVuZFRhZ09wZW4uZ2V0VGV4dEVuZE9mZnNldCgpIDogMDsKLQkJCQlyZXBsYWNlQmVnaW4gPSB4bWxFbmRUYWdPcGVuLmdldFRleHRFbmRPZmZzZXQoKTsKLQkJCQlkaXNwbGF5U3RyaW5nID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbmRfd2l0aF8sIChuZXcgT2JqZWN0W117Ii8iICsgbm9kZS5nZXROb2RlTmFtZSgpfSkpOyAvLyROT04tTkxTLTEkCi0JCQkJYWRkUHJvcG9zYWwgPSB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvLyBzb21ldGltZXMgdGhlIG5vZGUgaXMgbm90IG51bGwsIGJ1dAotCQkvLyBnZXROb2RlVmFsdWUoKSBpcyBudWxsLCBwdXQgaW4gYSBudWxsIGNoZWNrCi0JCWVsc2UgaWYgKChub2RlLmdldE5vZGVWYWx1ZSgpICE9IG51bGwpICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLmluZGV4T2YoIjwvIikgIT0gLTEpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHRoZSBjYXNlIHdoZXJlICI8LyIgaXMgc3RhcnRlZCwgYnV0IHRoZSBub2RlcyBjb21lcyBpbiBhcyBhCi0JCQkvLyB0ZXh0IG5vZGUgKGluc3RlYWQgb2YgZWxlbWVudCkKLQkJCS8vIGxpa2UgdGhpczogPHRhZz4gPC98Ci0JCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkpIHsKLQkJCQlyZXBsYWNlVGV4dCA9IHBhcmVudC5nZXROb2RlTmFtZSgpICsgIj4iOyAvLyROT04tTkxTLTEkCi0JCQkJY3Vyc29yT2Zmc2V0ID0gcmVwbGFjZVRleHQubGVuZ3RoKCk7Ci0JCQkJZGlzcGxheVN0cmluZyA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuRW5kX3dpdGhfXywgKG5ldyBPYmplY3RbXXtwYXJlbnQuZ2V0Tm9kZU5hbWUoKX0pKTsKLQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJYWRkUHJvcG9zYWwgPSB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoWE1MVUlNZXNzYWdlcy5Db250ZW50X0Fzc2lzdF9ub3RfYXZhaWxhYl9VSV8pOwotCQl9Ci0JCWlmIChhZGRQcm9wb3NhbCA9PSB0cnVlKSB7Ci0JCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHJlcGxhY2VUZXh0LCByZXBsYWNlQmVnaW4sIHJlcGxhY2VMZW5ndGgsIGN1cnNvck9mZnNldCwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfRU5EX1RBRyk7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW50aXR5UHJvcG9zYWxzKAotCQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSB0cmVlTm9kZSwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJCi0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBlcHMgPSBjb21wdXRlRW50aXR5UmVmZXJlbmNlUHJvcG9zYWxzKGNvbXBsZXRpb25SZWdpb24sCi0JCQkJdHJlZU5vZGUsIGNvbnRleHQpOwotCQlmb3IgKGludCBpID0gMDsgKGVwcyAhPSBudWxsKSAmJiAoaSA8IGVwcy5sZW5ndGgpOyBpKyspIHsKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKGVwc1tpXSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW50aXR5UHJvcG9zYWxzKFZlY3RvciBwcm9wb3NhbHMsIFByb3BlcnRpZXMgbWFwLAotCQkJU3RyaW5nIGtleSwgaW50IG5vZGVPZmZzZXQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24sCi0JCQlJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkKLQkJaWYgKG1hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIGVudGl0eU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZW50aXR5VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJbWFnZSBlbnRpdHlJY29uID0gdGhpcy5nZXRFbnRpdHlSZWZlcmVuY2VJbWFnZSgpOwotCQlTdHJpbmcgcmVwbGFjZW1lbnRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlFbnVtZXJhdGlvbiBrZXlzID0gbWFwLmtleXMoKTsKLQotCQl3aGlsZSAoKGtleXMgIT0gbnVsbCkgJiYga2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJZW50aXR5TmFtZSA9IChTdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKTsKLQkJCWVudGl0eVZhbHVlID0gbWFwLmdldFByb3BlcnR5KGVudGl0eU5hbWUpOwotCQkJLy8gZmlsdGVyIGJhc2VkIG9uIHBhcnRpYWwgZW50aXR5IHN0cmluZy4uLgotCQkJaWYgKGVudGl0eU5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGtleS50b0xvd2VyQ2FzZSgpKSB8fCBrZXkudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQkvLyBmaWd1cmUgb3V0IHNlbGVjdGlvbi4uLmlmIHRleHQgaXMgc2VsZWN0ZWQsIGFkZCBpdCB0bwotCQkJCS8vIHNlbGVjdGlvbiBsZW5ndGgKLQkJCQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gbm9kZU9mZnNldDsKLQkJCQlpZiAoY29udGV4dC5nZXRWaWV3ZXIoKSAhPSBudWxsKSB7Ci0JCQkJCXNlbGVjdGlvbkxlbmd0aCArPSBjb250ZXh0LmdldFZpZXdlcigpLmdldFNlbGVjdGVkUmFuZ2UoKS55OwotCQkJCX0KLQkJCQkvLyBjcmVhdGUgYSBuZXcgcHJvcG9zYWwgZm9yIGVudGl0eSBzdHJpbmcuLi4KLQkJCQlyZXBsYWNlbWVudFRleHQgPSAiJiIgKyBlbnRpdHlOYW1lICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJZGlzcGxheVN0cmluZyA9ICImIiArIGVudGl0eU5hbWUgKyAiOyAoIiArIGVudGl0eVZhbHVlICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWwgY3AgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHJlcGxhY2VtZW50VGV4dCwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbiksIHNlbGVjdGlvbkxlbmd0aCwgcmVwbGFjZW1lbnRUZXh0Lmxlbmd0aCgpLCBlbnRpdHlJY29uLCBkaXNwbGF5U3RyaW5nLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9FTlRJVFkpOwotCQkJCWlmIChjcCAhPSBudWxsKSB7Ci0JCQkJCXByb3Bvc2Fscy5hZGQoY3ApOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQQ0RBVEFQcm9wb3NhbChTdHJpbmcgbm9kZU5hbWUsCi0JCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJCi0JCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIjwhW0NEQVRBW11dPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIDksIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0RBVEFTRUNUSU9OKSwgIkNEQVRBIFNlY3Rpb24iLCAvLyROT04tTkxTLTEkCi0JCQkJCW51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NEQVRBKTsKLQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCi0JCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChub2RlTmFtZSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIG5vZGVOYW1lLmxlbmd0aCgpLCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RYVEVYVCksICIjUENEQVRBIiwgLy8kTk9OLU5MUy0xJAotCQkJCQludWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DREFUQSk7Ci0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3RhcnREb2N1bWVudFByb3Bvc2FscygKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkKLQkJLy9kZXRlcm1pbmUgaWYgWE1MUEkgaXMgZmlyc3QgZWxlbWVudAotCQlOb2RlIGFOb2RlID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCQlEb2N1bWVudCBvd25pbmdEb2N1bWVudCA9IGFOb2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJTm9kZSBmaXJzdCA9IG93bmluZ0RvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJYm9vbGVhbiB4bWxwaUlzRmlyc3RFbGVtZW50ID0gKChmaXJzdCAhPSBudWxsKSAmJiAoZmlyc3QuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkpOwotCQkKLQkJLy8gbWFrZSBzdXJlIHhtbHBpIGlzIHJvb3QgZWxlbWVudCBkb24ndCB3YW50IGRvY3R5cGUgcHJvcG9zYWwgaWYgWE1MUEkgaXNuJ3QgZmlyc3QgZWxlbWVudC4uLgotCQlpZiAoeG1scGlJc0ZpcnN0RWxlbWVudCAmJiAob3duaW5nRG9jdW1lbnQuZ2V0RG9jdHlwZSgpID09IG51bGwpICYmCi0JCQkJaXNDdXJzb3JBZnRlclhNTFBJKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSkgewotCQkJCi0JCQlhZGREb2NUeXBlUHJvcG9zYWwoY29udGVudEFzc2lzdFJlcXVlc3QsIGNvbnRleHQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENsb3NlIGFuIHVuY2xvc2VkIHN0YXJ0IHRhZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ0Nsb3NlUHJvcG9zYWxzKAotCQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCQotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRQYXJlbnQoKTsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKG5vZGUpOwotCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IChlbGVtZW50RGVjbCAhPSBudWxsKSA/IGdldEFkZGl0aW9uYWxJbmZvKG51bGwsIGVsZW1lbnREZWNsKSA6IG51bGw7Ci0JCQlpbnQgY29udGVudFR5cGUgPSAoZWxlbWVudERlY2wgIT0gbnVsbCkgPyBlbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpIDogQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZOwotCQkJLy8gaWYgaXQncyBYTUwgYW5kIGNvbnRlbnQgZG9lc24ndCBIQVZFIHRvIGJlIGVsZW1lbnQsIGFkZCAiLz4iIHByb3Bvc2FsLgotCQkJYm9vbGVhbiBlbmRXaXRoU2xhc2hCcmFja2V0ID0gKGlzWE1MTm9kZShub2RlKSAmJiAoY29udGVudFR5cGUgIT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCkpOwotCi0JCQkvL2dldCB0aGUgaW1hZ2UKLQkJCUltYWdlIGltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoZWxlbWVudERlY2wpOwotCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQlpbWFnZSA9IHRoaXMuZ2V0R2VuZXJpY1RhZ0ltYWdlKCk7Ci0JCQl9Ci0KLQkJCS8vIGlzIHRoZSBzdGFydCB0YWcgZW5kZWQgcHJvcGVybHk/Ci0JCQlpZiAoKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCkgPT0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKSAmJiAhKG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSkuaXNFbmRlZCgpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCS8vIElzIHRoaXMgc3VwcG9zZWQgdG8gYmUgYW4gZW1wdHkgdGFnPyBOb3RlIHRoYXQgaWYgd2UgY2FuJ3QKLQkJCQkvLyB0ZWxsLCB3ZSBhc3N1bWUgaXQncyBub3QuCi0JCQkJaWYgKChlbGVtZW50RGVjbCAhPSBudWxsKSAmJiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkpIHsKLQkJCQkJLy8gcHJvbXB0IHdpdGggYSBzZWxmLWNsb3NpbmcgZW5kIGNoYXJhY3RlciBpZiBuZWVkZWQKLQkJCQkJLy8gdGhpcyBpcyBvbmUgb2YgdGhlIGZldyB0aW1lcyB0byBpZ25vcmUgdGhlIGxlbmd0aCAtLSBhbHdheXMgaW5zZXJ0Ci0JCQkJCS8vIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCkKLQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQkJCQlnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0U3RhcnRUYWdDbG9zZShub2RlLCBlbGVtZW50RGVjbCksCi0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIDAsCi0JCQkJCQkJZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldFN0YXJ0VGFnQ2xvc2Uobm9kZSwgZWxlbWVudERlY2wpLmxlbmd0aCgpLCBpbWFnZSwKLQkJCQkJCQlOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkNsb3NlX3dpdGhfX18sKG5ldyBPYmplY3RbXXtnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0U3RhcnRUYWdDbG9zZShub2RlLCBlbGVtZW50RGVjbCl9KSksCi0JCQkJCQkJbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DTE9TRV9UQUcpOwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBwcm9tcHQgd2l0aCBhIGNsb3NlIGZvciB0aGUgc3RhcnQgdGFnCi0JCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIj4iLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLAotCQkJCQkJCQkvLyB0aGlzIGlzIG9uZSBvZiB0aGUgZmV3IHRpbWVzIHRvIGlnbm9yZSB0aGUKLQkJCQkJCQkJLy8gbGVuZ3RoIC0tIGFsd2F5cyBpbnNlcnQKLQkJCQkJCQkJLy8gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwKLQkJCQkJCQkJMCwgMSwgaW1hZ2UsIE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuQ2xvc2Vfd2l0aF9fLCAobmV3IE9iamVjdFtdeyIgJz4nIn0pKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQludWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NMT1NFX1RBRyk7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQotCQkJCQkvLyBwcm9tcHQgd2l0aCB0aGUgY2xvc2VyIGZvciB0aGUgc3RhcnQgdGFnIGFuZCBhbiBlbmQgdGFnIGlmIG9uZSBpcyBub3QgcHJlc2VudAotCQkJCQlpZiAobm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBtYWtlIHN1cmUgdGFnIG5hbWUgaXMgYWN0dWFsbHkgd2hhdCBpdCB0aGlua3MgaXQKLQkJCQkJCS8vIGlzLi4uKGVnLiA8JUAgdnMuIDxqc3A6ZGlyZWN0aXZlKQotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZHIgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXREb2N1bWVudFJlZ2lvbigpOwotCQkJCQkJU3RyaW5nIG9wZW5pbmdUYWdUZXh0ID0gKHNkciAhPSBudWxsKSA/IHNkci5nZXRGdWxsVGV4dCgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmICgob3BlbmluZ1RhZ1RleHQgIT0gbnVsbCkgJiYgKG9wZW5pbmdUYWdUZXh0LmluZGV4T2Yobm9kZS5nZXROb2RlTmFtZSgpKSAhPSAtMSkpIHsKLQkJCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIj48LyIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiPiIsIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksCi0JCQkJCQkJCQkJLy8gdGhpcyBpcyBvbmUgb2YgdGhlIGZldyB0aW1lcyB0bwotCQkJCQkJCQkJCS8vIGlnbm9yZSB0aGUgbGVuZ3RoIC0tIGFsd2F5cyBpbnNlcnQKLQkJCQkJCQkJCQkvLyBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLAotCQkJCQkJCQkJCTAsIDEsIGltYWdlLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkNsb3NlX3dpdGhfX19fLCAobmV3IE9iamVjdFtde25vZGUuZ2V0Tm9kZU5hbWUoKX0pKSwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DTE9TRV9UQUcpOwotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBwcm9tcHQgd2l0aCBzbGFzaCBicmFja2V0ICIvPiIgaW5jYXNlIGlmIGl0J3MgYSBzZWxmIGVuZGluZyB0YWcKLQkJCQkJaWYgKGVuZFdpdGhTbGFzaEJyYWNrZXQpIHsKLQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiLz4iLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwKLQkJCQkJCQkJCS8vIHRoaXMgaXMgb25lIG9mIHRoZSBmZXcgdGltZXMgdG8gaWdub3JlCi0JCQkJCQkJCQkvLyB0aGUgbGVuZ3RoIC0tIGFsd2F5cyBpbnNlcnQKLQkJCQkJCQkJCS8vIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksCi0JCQkJCQkJCQkwLCAyLCBpbWFnZSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5DbG9zZV93aXRoX18sIChuZXcgT2JqZWN0W117IiBcIi8+XCIifSkpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQludWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NMT1NFX1RBRyArIDEpOyAvLyArMQotCQkJCQkJLy8gdG8gYnJpbmcgdG8gdG9wIG9mIGxpc3QKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXREb2N1bWVudFJlZ2lvbigpID09IG5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKSAmJiAhbm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuaXNFbmRlZCgpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCS8vIHByb21wdCB3aXRoIGEgY2xvc2luZyBlbmQgY2hhcmFjdGVyIGZvciB0aGUgZW5kIHRhZwotCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIj4iLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksCi0JCQkJCQkJLy8gdGhpcyBpcyBvbmUgb2YgdGhlIGZldyB0aW1lcyB0byBpZ25vcmUgdGhlIGxlbmd0aCAtLSBhbHdheXMgaW5zZXJ0Ci0JCQkJCQkJLy8gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwKLQkJCQkJCQkwLCAxLCBpbWFnZSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5DbG9zZV93aXRoX18sIChuZXcgT2JqZWN0W117IiAnPicifSkpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DTE9TRV9UQUcpOwotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoWE1MVUlNZXNzYWdlcy5Db250ZW50X0Fzc2lzdF9ub3RfYXZhaWxhYl9VSV8pOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ0luc2VydGlvblByb3Bvc2FscygKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgY2hpbGRQb3NpdGlvbiwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJCi0JCUxpc3QgY21ub2RlcyA9IG51bGw7Ci0JCU5vZGUgcGFyZW50ID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UGFyZW50KCk7Ci0JCVN0cmluZyBlcnJvciA9IG51bGw7Ci0KLQkJLy8gKG5zZCkgVGhpcyBpcyBvbmx5IHZhbGlkIGF0IHRoZSBkb2N1bWVudCBlbGVtZW50IGxldmVsCi0JCS8vIG9ubHkgdmFsaWQgaWYgaXQncyBYTUwgKGNoZWNrIGFkZGVkIDIvMTcvMjAwNCkKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYKLQkJCQkoKElET01Eb2N1bWVudCkgcGFyZW50KS5pc1hNTFR5cGUoKSAmJiAhaXNDdXJzb3JBZnRlclhNTFBJKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIG9ubHkgd2FudCBwcm9wb3NhbHMgaWYgY3Vyc29yIGlzIGFmdGVyIGRvY3R5cGUuLi4KLQkJaWYgKCFpc0N1cnNvckFmdGVyRG9jdHlwZShjb250ZW50QXNzaXN0UmVxdWVzdCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGZpeCBmb3IgbWV0YS1pbmZvIGNvbW1lbnQgbm9kZXMuLiB0aGV5IGN1cnJlbnRseSAiaGlkZSIgb3RoZXIKLQkJLy8gcHJvcG9zYWxzIGJlY2F1c2UgdGhlIGRvbid0Ci0JCS8vIGhhdmUgYSBjb250ZW50IG1vZGVsIChzbyBjYW4ndCBwcm9wb3NlIGFueSBjaGlsZHJlbi4uKQotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgSURPTU5vZGUpICYmIGlzQ29tbWVudE5vZGUoKElET01Ob2RlKSBwYXJlbnQpKSB7Ci0JCQkvLyBsb29wIGFuZCBmaW5kIG5vbiBjb21tZW50IG5vZGU/Ci0JCQl3aGlsZSAoKHBhcmVudCAhPSBudWxsKSAmJiBpc0NvbW1lbnROb2RlKChJRE9NTm9kZSkgcGFyZW50KSkgewotCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudERlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnQpOwotCQkJaWYgKHBhcmVudERlY2wgIT0gbnVsbCkgewotCQkJCS8vIFhTRC1zcGVjaWZpYyBhYmlsaXR5IC0gbm8gZmlsdGVyaW5nCi0JCQkJQ01EYXRhVHlwZSBjaGlsZFR5cGUgPSBwYXJlbnREZWNsLmdldERhdGFUeXBlKCk7Ci0JCQkJaWYgKGNoaWxkVHlwZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZ1tdIGNoaWxkU3RyaW5ncyA9IGNoaWxkVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0JCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBjaGlsZFR5cGUuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JCQkJCWlmIChjaGlsZFN0cmluZ3MgIT0gbnVsbCB8fCBkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJLy8gdGhlIGNvbnRlbnQgc3RyaW5nIGlzIHRoZSBzb2xlIHZhbGlkIGNoaWxkLi4uc28gcmVwbGFjZSB0aGUgcmVzdAotCQkJCQkJaW50IGJlZ2luID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCk7Ci0JCQkJCQlpbnQgbGVuZ3RoID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKTsKLQkJCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQkJCWlmICgoKElET01Ob2RlKSBwYXJlbnQpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSAoKElET01Ob2RlKSBwYXJlbnQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCQkJCQkJYmVnaW4gPSAoKElET01Ob2RlKSBwYXJlbnQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQkJCWxlbmd0aCA9ICgoSURPTU5vZGUpIHBhcmVudCkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCkgLSBiZWdpbjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8ocGFyZW50RGVjbCwgY2hpbGRUeXBlKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaWYoIWNoaWxkU3RyaW5nc1tpXS5lcXVhbHMoZGVmYXVsdFZhbHVlKSkgewotCQkJCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgdGV4dFByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQkJCQkJCQljaGlsZFN0cmluZ3NbaV0sYmVnaW4sIGxlbmd0aCwgY2hpbGRTdHJpbmdzW2ldLmxlbmd0aCgpLAotCQkJCQkJCQkJCVhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRU5VTSksCi0JCQkJCQkJCQkJY2hpbGRTdHJpbmdzW2ldLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1RBR19JTlNFUlRJT04pOwotCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbCh0ZXh0UHJvcG9zYWwpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHRleHRQcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoCi0JCQkJCQkJCQlkZWZhdWx0VmFsdWUsIGJlZ2luLCBsZW5ndGgsIGRlZmF1bHRWYWx1ZS5sZW5ndGgoKSwKLQkJCQkJCQkJCVhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfREVGQVVMVCksCi0JCQkJCQkJCQlkZWZhdWx0VmFsdWUsIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfVEFHX0lOU0VSVElPTik7Ci0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwodGV4dFByb3Bvc2FsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICgocGFyZW50RGVjbCAhPSBudWxsKSAmJiAocGFyZW50RGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSkpIHsKLQkJCQlhZGRQQ0RBVEFQcm9wb3NhbChwYXJlbnREZWNsLmdldE5vZGVOYW1lKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHJldHJpZXZlIHRoZSBsaXN0IG9mIGFsbCBwb3NzaWJsZSBjaGlsZHJlbiB3aXRoaW4gdGhpcyBwYXJlbnQgY29udGV4dAotCQkJCWNtbm9kZXMgPSBnZXRBdmFpbGFibGVDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMoKEVsZW1lbnQpIHBhcmVudCwgY2hpbGRQb3NpdGlvbixNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCk7Ci0KLQkJCQkvLyByZXRyaWV2ZSB0aGUgbGlzdCBvZiB0aGUgcG9zc2libGUgY2hpbGRyZW4gd2l0aGluIHRoaXMKLQkJCQkvLyBwYXJlbnQgY29udGV4dCBhbmQgYXQgdGhpcyBpbmRleAotCQkJCUxpc3Qgc3RyaWN0Q01Ob2RlU3VnZ2VzdGlvbnMgPSBudWxsOwotCQkJCWlmIChYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZX1ZBTFVFX1NUUklDVC5lcXVhbHMoWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuU1VHR0VTVElPTl9TVFJBVEVHWSkpKSB7Ci0JCQkJCXN0cmljdENNTm9kZVN1Z2dlc3Rpb25zID0gZ2V0VmFsaWRDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMoKEVsZW1lbnQpIHBhcmVudCwgY2hpbGRQb3NpdGlvbiwgTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQpOwotCQkJCX0KLQkJCQlJdGVyYXRvciBub2RlSXRlcmF0b3IgPSBjbW5vZGVzLml0ZXJhdG9yKCk7Ci0JCQkJaWYgKCFub2RlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCWlmIChnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnQpICE9IG51bGwpIHsKLQkJCQkJCWVycm9yID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5fSGFzX25vX2F2YWlsYWJsZV9jaGlsZCwgKG5ldyBPYmplY3RbXXtwYXJlbnQuZ2V0Tm9kZU5hbWUoKX0pKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWVycm9yID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbGVtZW50X19pc191bmtub3duLCAobmV3IE9iamVjdFtde3BhcmVudC5nZXROb2RlTmFtZSgpfSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCVN0cmluZyBtYXRjaFN0cmluZyA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCk7Ci0JCQkJLy8gY2hvcCBvZmYgYW55IGxlYWRpbmcgPCdzIGFuZCB3aGl0ZXNwYWNlIGZyb20gdGhlIG1hdGNoc3RyaW5nCi0JCQkJd2hpbGUgKChtYXRjaFN0cmluZy5sZW5ndGgoKSA+IDApICYmCi0JCQkJCQkoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShtYXRjaFN0cmluZy5jaGFyQXQoMCkpIHx8IGJlZ2luc1dpdGgobWF0Y2hTdHJpbmcsICI8IikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCi0JCQkJCW1hdGNoU3RyaW5nID0gbWF0Y2hTdHJpbmcuc3Vic3RyaW5nKDEpOwotCQkJCX0KLQkJCQl3aGlsZSAobm9kZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgbyA9IG5vZGVJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgQ01FbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0oQ01FbGVtZW50RGVjbGFyYXRpb24pIG87Ci0JCQkJCQkvLyBvbmx5IGFkZCBwcm9wb3NhbHMgZm9yIHRoZSBjaGlsZCBlbGVtZW50J3MgdGhhdAotCQkJCQkJLy8gYmVnaW4gd2l0aCB0aGUgbWF0Y2hzdHJpbmcKLQkJCQkJCVN0cmluZyB0YWduYW1lID0gZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWxlbWVudERlY2wpOwotCQkJCQkJYm9vbGVhbiBpc1N0cmljdENNTm9kZVN1Z2dlc3Rpb24gPQotCQkJCQkJCXN0cmljdENNTm9kZVN1Z2dlc3Rpb25zICE9IG51bGwgPyBzdHJpY3RDTU5vZGVTdWdnZXN0aW9ucy5jb250YWlucyhlbGVtZW50RGVjbCkgOiBmYWxzZTsKLQotCQkJCQkJLy9nZXQgdGhlIHByb3Bvc2FsIGltYWdlCi0JCQkJCQlJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGVsZW1lbnREZWNsKTsKLQkJCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQkJaWYgKHN0cmljdENNTm9kZVN1Z2dlc3Rpb25zICE9IG51bGwpIHsKLQkJCQkJCQkJaW1hZ2UgPSBpc1N0cmljdENNTm9kZVN1Z2dlc3Rpb24gPyB0aGlzLmdldEVtcGhhc2l6ZWRUYWdJbWFnZSgpIDogdGhpcy5nZXREZWVtcGhhc2l6ZWRUYWdJbWFnZSgpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWltYWdlID0gdGhpcy5nZXRHZW5lcmljVGFnSW1hZ2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChiZWdpbnNXaXRoKHRhZ25hbWUsIG1hdGNoU3RyaW5nKSkgewotCQkJCQkJCVN0cmluZyBwcm9wb3NlZFRleHQgPSBnZXRSZXF1aXJlZFRleHQocGFyZW50LCBlbGVtZW50RGVjbCk7Ci0KLQkJCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODk4MTEKLQkJCQkJCQkvLyBwbGFjZSBjdXJzb3IgaW4gZmlyc3QgZW1wdHkgcXVvdGVzCi0JCQkJCQkJaW50IG1hcmt1cEFkanVzdG1lbnQgPSBnZXRDdXJzb3JQb3NpdGlvbkZvclByb3Bvc2VkVGV4dChwcm9wb3NlZFRleHQpOwotCi0JCQkJCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IGdldEFkZGl0aW9uYWxJbmZvKHBhcmVudERlY2wsIGVsZW1lbnREZWNsKTsKLQkJCQkJCQlpbnQgcmVsZXZhbmNlID0gaXNTdHJpY3RDTU5vZGVTdWdnZXN0aW9uID8gWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfU1RSSUNUTFlfVkFMSURfVEFHX0lOU0VSVElPTiA6IFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1RBR19JTlNFUlRJT047Ci0JCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQkJCQkJCXByb3Bvc2VkVGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksCi0JCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBtYXJrdXBBZGp1c3RtZW50LAotCQkJCQkJCQkJaW1hZ2UsIHRhZ25hbWUsIG51bGwsIHByb3Bvc2VkSW5mbywgcmVsZXZhbmNlKTsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFByb3Bvc2FscygpLnNpemUoKSA9PSAwKSB7Ci0JCQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoZXJyb3IpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpICE9IG51bGwpICYmCi0JCQkJCQkJKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSkgewotCQkJCQkJCi0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoCi0JCQkJCQkJCVhNTFVJTWVzc2FnZXMuTm9fa25vd25fY2hpbGRfdGFnLAotCQkJCQkJCQkobmV3IE9iamVjdFtde3BhcmVudC5nZXROb2RlTmFtZSgpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpfSkpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZCgKLQkJCQkJCQkJWE1MVUlNZXNzYWdlcy5fX0hhc19ub19rbm93bl9jaGlsZCwKLQkJCQkJCQkJKG5ldyBPYmplY3RbXXtwYXJlbnQuZ2V0Tm9kZU5hbWUoKX0pKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkvLyBDYW4gb25seSBwcm9tcHQgd2l0aCBlbGVtZW50cyBpZiB0aGUgY3Vyc29yIHBvc2l0aW9uIGlzIHBhc3QKLQkJCS8vIHRoZSBYTUwgcHJvY2Vzc2luZwotCQkJLy8gaW5zdHJ1Y3Rpb24gYW5kIERPQ1RZUEUgZGVjbGFyYXRpb24KLQkJCWJvb2xlYW4geG1scGlGb3VuZCA9IGZhbHNlOwotCQkJYm9vbGVhbiBkb2N0eXBlRm91bmQgPSBmYWxzZTsKLQkJCWludCBtaW5pbXVtT2Zmc2V0ID0gLTE7Ci0KLQkJCWZvciAoTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCi0JCQkJYm9vbGVhbiB4bWxwaSA9ICgoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInhtbCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJvb2xlYW4gZG9jdHlwZSA9IGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREU7Ci0JCQkJaWYgKHhtbHBpIHx8IChkb2N0eXBlICYmIChtaW5pbXVtT2Zmc2V0IDwgMCkpKSB7Ci0JCQkJCW1pbmltdW1PZmZzZXQgPSAoKElET01Ob2RlKSBjaGlsZCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpICsgKChJRE9NTm9kZSkgY2hpbGQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dExlbmd0aCgpOwotCQkJCX0KLQkJCQl4bWxwaUZvdW5kID0geG1scGlGb3VuZCB8fCB4bWxwaTsKLQkJCQlkb2N0eXBlRm91bmQgPSBkb2N0eXBlRm91bmQgfHwgZG9jdHlwZTsKLQkJCX0KLQotCQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpID49IG1pbmltdW1PZmZzZXQpIHsKLQkJCQlMaXN0IGNoaWxkRGVjbHMgPSBnZXRBdmFpbGFibGVSb290Q2hpbGRyZW4oKERvY3VtZW50KSBwYXJlbnQsIGNoaWxkUG9zaXRpb24pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGREZWNscy5zaXplKCk7IGkrKykgewotCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgY2hpbGREZWNscy5nZXQoaSk7Ci0JCQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJCQlJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGVkKTsKLQkJCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQkJaW1hZ2UgPSB0aGlzLmdldEdlbmVyaWNUYWdJbWFnZSgpOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9IGdldFJlcXVpcmVkVGV4dChwYXJlbnQsIGVkKTsKLQkJCQkJCVN0cmluZyB0YWduYW1lID0gZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWQpOwotCQkJCQkJLy8gYWNjb3VudCBmb3IgdGhlICZsdDsgYW5kICZndDsKLQkJCQkJCWludCBtYXJrdXBBZGp1c3RtZW50ID0gZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldE1pbmltYWxTdGFydFRhZ0xlbmd0aChwYXJlbnQsIGVkKTsKLQkJCQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSBnZXRBZGRpdGlvbmFsSW5mbyhudWxsLCBlZCk7Ci0JCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKAotCQkJCQkJCQlwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLAotCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBtYXJrdXBBZGp1c3RtZW50LCBpbWFnZSwKLQkJCQkJCQkJdGFnbmFtZSwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9UQUdfSU5TRVJUSU9OKTsKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ05hbWVQcm9wb3NhbHMoCi0JCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGNoaWxkUG9zaXRpb24sCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCQotCQlMaXN0IGNtbm9kZXMgPSBudWxsOwotCQlOb2RlIHBhcmVudCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFBhcmVudCgpOwotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0JCVN0cmluZyBlcnJvciA9IG51bGw7Ci0JCVN0cmluZyBtYXRjaFN0cmluZyA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCk7Ci0JCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJLy8gcmV0cmlldmUgdGhlIGxpc3Qgb2YgY2hpbGRyZW4KLQkJCS8vIHZhbGlkQWN0aW9ucyA9IGdldEF2YWlsYWJsZUNoaWxkcmVuQXRJbmRleCgoRWxlbWVudCkgcGFyZW50LAotCQkJLy8gY2hpbGRQb3NpdGlvbik7Ci0JCQljbW5vZGVzID0gZ2V0QXZhaWxhYmxlQ2hpbGRFbGVtZW50RGVjbGFyYXRpb25zKChFbGVtZW50KSBwYXJlbnQsIGNoaWxkUG9zaXRpb24sIE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJUKTsKLQkJCUxpc3Qgc3RyaWN0Q01Ob2RlU3VnZ2VzdGlvbnMgPSBudWxsOwotCQkJaWYgKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1lfVkFMVUVfU1RSSUNULmVxdWFscyhYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZKSkpIHsKLQkJCQlzdHJpY3RDTU5vZGVTdWdnZXN0aW9ucyA9IGdldFZhbGlkQ2hpbGRFbGVtZW50RGVjbGFyYXRpb25zKChFbGVtZW50KSBwYXJlbnQsIGNoaWxkUG9zaXRpb24sIE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJUKTsKLQkJCX0KLQkJCQotCQkJSXRlcmF0b3Igbm9kZUl0ZXJhdG9yID0gY21ub2Rlcy5pdGVyYXRvcigpOwotCQkJLy8gY2hvcCBvZmYgYW55IGxlYWRpbmcgPCdzIGFuZCB3aGl0ZXNwYWNlIGZyb20gdGhlIG1hdGNoc3RyaW5nCi0JCQl3aGlsZSAoKG1hdGNoU3RyaW5nLmxlbmd0aCgpID4gMCkgJiYKLQkJCQkJKENoYXJhY3Rlci5pc1doaXRlc3BhY2UobWF0Y2hTdHJpbmcuY2hhckF0KDApKSB8fCBiZWdpbnNXaXRoKG1hdGNoU3RyaW5nLCAiPCIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCQkJbWF0Y2hTdHJpbmcgPSBtYXRjaFN0cmluZy5zdWJzdHJpbmcoMSk7Ci0JCQl9Ci0JCQlpZiAoIW5vZGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQllcnJvciA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuX19IYXNfbm9fa25vd25fY2hpbGQsIChuZXcgT2JqZWN0W117cGFyZW50LmdldE5vZGVOYW1lKCl9KSk7Ci0JCQl9Ci0JCQl3aGlsZSAobm9kZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUNNTm9kZSBlbGVtZW50RGVjbCA9IChDTU5vZGUpIG5vZGVJdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCQkJLy8gb25seSBhZGQgcHJvcG9zYWxzIGZvciB0aGUgY2hpbGQgZWxlbWVudCdzIHRoYXQgYmVnaW4gd2l0aCB0aGUgbWF0Y2hzdHJpbmcKLQkJCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9IG51bGw7Ci0JCQkJCWludCBjdXJzb3JBZGp1c3RtZW50ID0gMDsKLQkJCQkJCi0JCQkJCS8vZGV0ZXJtaW5lIGlmIHN0cmljdCBzdWdnZXN0aW9uCi0JCQkJCWJvb2xlYW4gaXNTdHJpY3RDTU5vZGVTdWdnZXN0aW9uID0KLQkJCQkJCXN0cmljdENNTm9kZVN1Z2dlc3Rpb25zICE9IG51bGwgPyBzdHJpY3RDTU5vZGVTdWdnZXN0aW9ucy5jb250YWlucyhlbGVtZW50RGVjbCkgOiBmYWxzZTsKLQotCQkJCQkvLyBkbyBhIGNoZWNrIHRvIHNlZSBpZiBwYXJ0aWFsIGF0dHJpYnV0ZXMgb2YgcGFydGlhbCB0YWcgbmFtZXMgYXJlIGluIGxpc3QKLQkJCQkJaWYgKCgobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXRBdHRyaWJ1dGVzKCkgIT0gbnVsbCkgJiYKLQkJCQkJCQkobm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TGVuZ3RoKCkgPiAwKSAmJgotCQkJCQkJCWF0dHJpYnV0ZUluTGlzdChub2RlLCBwYXJlbnQsIGVsZW1lbnREZWNsKSkgfHwKLQkJCQkJCQkoKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkgJiYKLQkJCQkJCQkJCW5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5pc0VuZGVkKCkpKSB7Ci0KLQkJCQkJCXByb3Bvc2VkVGV4dCA9IGdldFJlcXVpcmVkTmFtZShwYXJlbnQsIGVsZW1lbnREZWNsKTsKLQkJCQkJCWN1cnNvckFkanVzdG1lbnQgPSBwcm9wb3NlZFRleHQubGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlwcm9wb3NlZFRleHQgPSBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlbGVtZW50RGVjbCk7Ci0JCQkJCQkKLQkJCQkJCWN1cnNvckFkanVzdG1lbnQgPSBwcm9wb3NlZFRleHQubGVuZ3RoKCk7Ci0JCQkJCQlpZiAoZWxlbWVudERlY2wgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50RGVjbDsKLQkJCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODk4MTEKLQkJCQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQkJZ2V0Q29udGVudEdlbmVyYXRvcigpLmdlbmVyYXRlVGFnKHBhcmVudCwgZWQsIHNiKTsKLQkJCQkJCQkvLyBzaW5jZSBpdCdzIGEgbmFtZSBwcm9wb3NhbCwgYXNzdW1lICc8JyBpcyBhbHJlYWR5IHRoZXJlCi0JCQkJCQkJLy8gb25seSByZXR1cm4gdGhlIHJlc3Qgb2YgdGhlIHRhZwotCQkJCQkJCXByb3Bvc2VkVGV4dCA9IHNiLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpOwotCQkJCQkJCWN1cnNvckFkanVzdG1lbnQgPSBnZXRDdXJzb3JQb3NpdGlvbkZvclByb3Bvc2VkVGV4dChwcm9wb3NlZFRleHQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChiZWdpbnNXaXRoKHByb3Bvc2VkVGV4dCwgbWF0Y2hTdHJpbmcpKSB7Ci0JCQkJCQkvL2dldCB0aGUgcHJvcG9zYWwgaW1hZ2UKLQkJCQkJCUltYWdlIGltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoZWxlbWVudERlY2wpOwotCQkJCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJCQlpZiAoc3RyaWN0Q01Ob2RlU3VnZ2VzdGlvbnMgIT0gbnVsbCkgewotCQkJCQkJCQlpbWFnZSA9IGlzU3RyaWN0Q01Ob2RlU3VnZ2VzdGlvbiA/IHRoaXMuZ2V0RW1waGFzaXplZFRhZ0ltYWdlKCkgOiB0aGlzLmdldERlZW1waGFzaXplZFRhZ0ltYWdlKCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaW1hZ2UgPSB0aGlzLmdldEdlbmVyaWNUYWdJbWFnZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWludCByZWxldmFuY2UgPSBpc1N0cmljdENNTm9kZVN1Z2dlc3Rpb24gPyBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9TVFJJQ1RMWV9WQUxJRF9UQUdfTkFNRSA6IFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1RBR19OQU1FOwotCQkJCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IGdldEFkZGl0aW9uYWxJbmZvKGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudCksIGVsZW1lbnREZWNsKTsKLQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoCi0JCQkJCQkJCXByb3Bvc2VkVGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksCi0JCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIGN1cnNvckFkanVzdG1lbnQsIGltYWdlLAotCQkJCQkJCQlnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlbGVtZW50RGVjbCksIG51bGwsIHByb3Bvc2VkSW5mbywKLQkJCQkJCQkJcmVsZXZhbmNlKTsKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRQcm9wb3NhbHMoKS5zaXplKCkgPT0gMCkgewotCQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShlcnJvcik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpICE9IG51bGwpICYmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKAotCQkJCQkJCVhNTFVJTWVzc2FnZXMuTm9fa25vd25fY2hpbGRfdGFnX25hbWVzLAotCQkJCQkJCShuZXcgT2JqZWN0W117cGFyZW50LmdldE5vZGVOYW1lKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCl9KSkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKAotCQkJCQkJCVhNTFVJTWVzc2FnZXMuX19IYXNfbm9fa25vd25fY2hpbGQsCi0JCQkJCQkJKG5ldyBPYmplY3RbXXtwYXJlbnQuZ2V0Tm9kZU5hbWUoKX0pKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJTGlzdCBjaGlsZEVsZW1lbnRzID0gZ2V0QXZhaWxhYmxlUm9vdENoaWxkcmVuKChEb2N1bWVudCkgcGFyZW50LCBjaGlsZFBvc2l0aW9uKTsKLQkJCWlmICggY2hpbGRFbGVtZW50cy5zaXplKCkgPT0gMCkgewotCQkJCS8vTm8gZG9jdHlwZSBhdmFpbGFibGUgLCB0cmVhdCBpdCBhcyBlbXB0eSBkb2N1bWVudAotCQkJCWFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNvbnRleHQpOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQ01Ob2RlIGVkID0gKENNTm9kZSkgY2hpbGRFbGVtZW50cy5nZXQoaSk7Ci0JCQkJaWYgKGVkID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCVN0cmluZyBwcm9wb3NlZFRleHQgPSBudWxsOwotCQkJCWludCBjdXJzb3JBZGp1c3RtZW50ID0gMDsKLQkJCQlpZiAoZWQgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCQkvLyBwcm9wb3NlZFRleHQgPSBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlZCk7Ci0JCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJZ2V0Q29udGVudEdlbmVyYXRvcigpLmdlbmVyYXRlVGFnKHBhcmVudCwgKENNRWxlbWVudERlY2xhcmF0aW9uKSBlZCwgc2IpOwotCQkJCQkvLyB0YWcgc3RhcnRzIHcvICc8JywgYnV0IHdlIHdhbnQgdG8gY29tcGFyZSB0byBuYW1lCi0JCQkJCXByb3Bvc2VkVGV4dCA9IHNiLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpOwotCi0JCQkJCWlmICghYmVnaW5zV2l0aChwcm9wb3NlZFRleHQsIG1hdGNoU3RyaW5nKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQljdXJzb3JBZGp1c3RtZW50ID0gZ2V0Q3Vyc29yUG9zaXRpb25Gb3JQcm9wb3NlZFRleHQocHJvcG9zZWRUZXh0KTsKLQotCQkJCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8obnVsbCwgZWQpOwotCQkJCQlJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGVkKTsKLQkJCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJCWltYWdlID0gdGhpcy5nZXRHZW5lcmljVGFnSW1hZ2UoKTsKLQkJCQkJfQotCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKAotCQkJCQkJCXByb3Bvc2VkVGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksCi0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgY3Vyc29yQWRqdXN0bWVudCwgaW1hZ2UsCi0JCQkJCQkJZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWQpLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1RBR19OQU1FKTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKAotCQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCQotCQkvL2J5IGRlZmF1bHQgZG8gbm90aGluZwotCX0KLQkKLQkvKioKLQkgKiA8cD5JbXBsZW1lbnRlcnMgYXJlIGFsbG93ZWQgdG8gb3ZlcnJpZGU8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgcHJvcG9zYWwgaW1hZ2UgdG8gZGlzcGxheSBmb3IgZ2VuZXJpYyB0YWcgcHJvcG9zYWxzCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldEdlbmVyaWNUYWdJbWFnZSgpIHsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpOwotCX0KLQkKLQkvKioKLQkgKiA8cD5JbXBsZW1lbnRlcnMgYXJlIGFsbG93ZWQgdG8gb3ZlcnJpZGU8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgcHJvcG9zYWwgaW1hZ2UgdG8gZGlzcGxheSBmb3IgZW1waGFzaXplZCB0YWcgcHJvcG9zYWxzCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldEVtcGhhc2l6ZWRUYWdJbWFnZSgpIHsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUNfRU1QSEFTSVpFRCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPkltcGxlbWVudGVycyBhcmUgYWxsb3dlZCB0byBvdmVycmlkZTwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9wb3NhbCBpbWFnZSB0byBkaXNwbGF5IGZvciBkZS1lbXBoYXNpemVkIHRhZyBwcm9wb3NhbHMKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGVlbXBoYXNpemVkVGFnSW1hZ2UoKSB7Ci0JCXJldHVybiBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDX0RFRU1QSEFTSVpFRCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPkltcGxlbWVudGVycyBhcmUgYWxsb3dlZCB0byBvdmVycmlkZTwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9wb3NhbCBpbWFnZSB0byBkaXNwbGF5IGZvciBlbnRpdHkgcmVmZXJlbmNlIHByb3Bvc2FscwotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRFbnRpdHlSZWZlcmVuY2VJbWFnZSgpIHsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRU5USVRZX1JFRkVSRU5DRSk7Ci0JfQotCQotCS8qKgotCSAqIDxwPkltcGxlbWVudGVycyBhcmUgYWxsb3dlZCB0byBvdmVycmlkZTwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9wb3NhbCBpbWFnZSB0byBkaXNwbGF5IGZvciBub3QgcmVxdWlyZWQgYXR0cmlidXRlcwotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXROb3RSZXF1aXJlZEF0dHJpYnV0ZUltYWdlKCkgewotCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCX0KLQkKLQkvKioKLQkgKiA8cD5JbXBsZW1lbnRlcnMgYXJlIGFsbG93ZWQgdG8gb3ZlcnJpZGU8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgcHJvcG9zYWwgaW1hZ2UgdG8gZGlzcGxheSBmb3IgcmVxdWlyZWQgYXR0cmlidXRlcwotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRSZXF1aXJlZEF0dHJpYnV0ZUltYWdlKCkgewotCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRfUkVRX09CSik7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiBjaGVjayBpZiB0aGUgY3Vyc29yIGlzIGFmdGVyIHRoZSBYTUxQSQotCSAqIAotCSAqIEBwYXJhbSBjYXIKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0N1cnNvckFmdGVyWE1MUEkoQ29udGVudEFzc2lzdFJlcXVlc3QgY2FyKSB7Ci0JCU5vZGUgYU5vZGUgPSBjYXIuZ2V0Tm9kZSgpOwotCQlib29sZWFuIHhtbHBpRm91bmQgPSBmYWxzZTsKLQkJRG9jdW1lbnQgcGFyZW50ID0gYU5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpbnQgeG1scGlOb2RlUG9zaXRpb24gPSAtMTsKLQkJYm9vbGVhbiBpc0FmdGVyWE1MUEkgPSBmYWxzZTsKLQotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOyAvLyBibGFuayBkb2N1bWVudCBjYXNlCi0JCX0KLQotCQlmb3IgKE5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWJvb2xlYW4geG1scGkgPSAoKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpICYmIGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJ4bWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXhtbHBpRm91bmQgPSB4bWxwaUZvdW5kIHx8IHhtbHBpOwotCQkJaWYgKHhtbHBpRm91bmQpIHsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQl4bWxwaU5vZGVQb3NpdGlvbiA9ICgoSURPTU5vZGUpIGNoaWxkKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJaXNBZnRlclhNTFBJID0gKGNhci5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSA+PSB4bWxwaU5vZGVQb3NpdGlvbik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBpc0FmdGVyWE1MUEk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVxdWlyZWROYW1lKE5vZGUgcGFyZW50T3JPd25lciwgQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAoKGNtbm9kZSA9PSBudWxsKSB8fCAocGFyZW50T3JPd25lciA9PSBudWxsKSkgewotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwgZGVjbGFyYXRpb24hIikucHJpbnRTdGFja1RyYWNlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0UmVxdWlyZWROYW1lKHBhcmVudE9yT3duZXIsIGNtbm9kZSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFJlcXVpcmVkVGV4dChOb2RlIHBhcmVudE9yT3duZXIsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wpIHsKLQkJaWYgKGF0dHJEZWNsID09IG51bGwpIHsKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiEiKS5wcmludFN0YWNrVHJhY2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWdldENvbnRlbnRHZW5lcmF0b3IoKS5nZW5lcmF0ZVJlcXVpcmVkQXR0cmlidXRlKHBhcmVudE9yT3duZXIsIGF0dHJEZWNsLCBidWZmKTsKLQkJcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXF1aXJlZFRleHQoTm9kZSBwYXJlbnRPck93bmVyLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCkgewotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCkgewotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwgYXR0cmlidXRlIGRlY2xhcmF0aW9uISIpLnByaW50U3RhY2tUcmFjZSgpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZ2V0Q29udGVudEdlbmVyYXRvcigpLmdlbmVyYXRlVGFnKHBhcmVudE9yT3duZXIsIGVsZW1lbnREZWNsLCBidWZmKTsKLQkJcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0cmlldmVzIGFsbCBvZiB0aGUgcG9zc2libGUgdmFsaWQgdmFsdWVzIGZvciB0aGlzIGF0dHJpYnV0ZQotCSAqIGRlY2xhcmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMoTm9kZSBub2RlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKSB7Ci0JCUxpc3QgbGlzdCA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJU3RyaW5nW10gZGF0YVR5cGVWYWx1ZXMgPSBudWxsOwotCQkJLy8gVGhlIE1vZGVsUXVlcnkgbWF5IG5vdCBiZSBhdmFpbGFibGUgaWYgdGhlIGNvcnJlc3BvbmRpbmcKLQkJCS8vIGFkYXB0ZXIKLQkJCS8vIGlzIGFic2VudAotCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQkJZGF0YVR5cGVWYWx1ZXMgPSBtb2RlbFF1ZXJ5LmdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMoZWxlbWVudCwgYWQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGFkLmdldEF0dHJUeXBlKCkgIT0gbnVsbCkgewotCQkJCQlkYXRhVHlwZVZhbHVlcyA9IGFkLmdldEF0dHJUeXBlKCkuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkYXRhVHlwZVZhbHVlcyAhPSBudWxsKSB7Ci0JCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoZGF0YVR5cGVWYWx1ZXMubGVuZ3RoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGFUeXBlVmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWxpc3QuYWRkKGRhdGFUeXBlVmFsdWVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaXMgdG8gZGV0ZXJtaW5lIGlmIGEgdGFnIGlzIGEgc3BlY2lhbCBtZXRhLWluZm8gY29tbWVudCB0YWcgdGhhdAotCSAqIHNob3dzIHVwIGFzIGFuIEVMRU1FTlQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDb21tZW50Tm9kZShJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiAoKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkgJiYgKChJRE9NRWxlbWVudCkgbm9kZSkuaXNDb21tZW50VGFnKCkpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNTdGFydFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChzZFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpID4gMCkgewotCQkJSVRleHRSZWdpb24gciA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMCk7Ci0JCQlyZXN1bHQgPSAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pICYmIHNkUmVnaW9uLmlzRW5kZWQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBjb3JyZXNwb25kaW5nIFhNTE5vZGUsIGFuZCBjaGVja3MgaWYgaXQncyBjbG9zZWQuCi0JICogCi0JICogQHBhcmFtIHN0YXJ0VGFnCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRzRW5kVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWcsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9Ci0JCQlTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGNvbnRleHQuZ2V0RG9jdW1lbnQoKSk7Ci0JCXRyeSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlJRE9NTm9kZSB4bWxOb2RlID0gKElET01Ob2RlKSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZy5nZXRTdGFydCgpKTsKLQkJCQlpZiAoIWlzU3RhcnRUYWcoc3RhcnRUYWcpKSB7Ci0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIGlmIChpc1NlbGZDbG9zZWQoc3RhcnRUYWcpKSB7Ci0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIGlmICgheG1sTm9kZS5pc0NvbnRhaW5lcigpKSB7Ci0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0geG1sTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNTZWxmQ2xvc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWcpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdGFydFRhZy5nZXRSZWdpb25zKCk7Ci0JCXJldHVybiByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0U7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFRhZ05hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQluYW1lID0gc2RSZWdpb24uZ2V0VGV4dChyZWdpb24pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQkvKioKLQkgKiByZXR1cm4gYWxsIHBvc3NpYmxlIEVudGl0eVJlZmVyZW5jZVByb3Bvc2FscyAoYWNjb3JkaW5nIHRvIGN1cnJlbnQKLQkgKiBwb3NpdGlvbiBpbiBkb2MpCi0JICovCi0JcHJpdmF0ZSBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUVudGl0eVJlZmVyZW5jZVByb3Bvc2FscyhJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLAotCQkJSURPTU5vZGUgdHJlZU5vZGUsQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkKLQkJLy8gb25seSBoYW5kbGUgWE1MIGNvbnRlbnQgZm9yIG5vdwotCQlpbnQgZG9jdW1lbnRQb3NpdGlvbiA9IGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpOwotCQlWZWN0b3IgcHJvcG9zYWxzID0gbmV3IFZlY3RvcigpOyAvLyBJQ29tcGxldGlvblByb3Bvc2FscwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0KLQkJCUNvbnRlbnRBc3Npc3RVdGlscy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGV4dC5nZXRWaWV3ZXIoKSwgY29udGV4dC5nZXRJbnZvY2F0aW9uT2Zmc2V0KCkpOwotCQlpZiAoKGNvbXBsZXRpb25SZWdpb24gIT0gbnVsbCkgJiYgKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpKSB7Ci0JCQlpbnQgbm9kZU9mZnNldCA9IGRvY3VtZW50UG9zaXRpb24gLSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKTsKLQkJCVN0cmluZyByZWdpb25UZXh0ID0gc2RSZWdpb24uZ2V0RnVsbFRleHQoY29tcGxldGlvblJlZ2lvbik7Ci0KLQkJCS8vIGlmIGRpcmVjdGx5IHRvIHRoZSByaWdodCBvZiBhICYsIHJlZ2lvbiB3aWxsIGJlIG51bGwsIG5lZWQgdG8KLQkJCS8vIG1vdmUgdG8KLQkJCS8vIHRoZSBwcmV2aW91cyByZWdpb24uLi50aGVyZSBtaWdodCBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcwotCQkJaWYgKChyZWdpb25UZXh0ICE9IG51bGwpICYmIHJlZ2lvblRleHQudHJpbSgpLmVxdWFscygiIikgJiYgKGRvY3VtZW50UG9zaXRpb24gPiAwKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2ID0gdHJlZU5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbiAtIDEpOwotCQkJCWlmICgocHJldiAhPSBudWxsKSAmJiBwcmV2LmdldFRleHQoKS5lcXVhbHMoIiYiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDY2ODAKLQkJCQkJLy8gZXhhbWluZSBwcmV2aW91cyByZWdpb24KLQkJCQkJc2RSZWdpb24gPSBwcmV2OwotCQkJCQljb21wbGV0aW9uUmVnaW9uID0gcHJldi5nZXRMYXN0UmVnaW9uKCk7Ci0JCQkJCXJlZ2lvblRleHQgPSBwcmV2LmdldEZ1bGxUZXh0KCk7Ci0JCQkJCW5vZGVPZmZzZXQgPSAxOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gc3RyaW5nIG11c3Qgc3RhcnQgdy8gJgotCQkJaWYgKChyZWdpb25UZXh0ICE9IG51bGwpICYmIHJlZ2lvblRleHQuc3RhcnRzV2l0aCgiJiIpKSB7IC8vJE5PTi1OTFMtMSQJCQkJCQkgCQkKLQkJCQlTdHJpbmcga2V5ID0gKG5vZGVPZmZzZXQgPiAwKSA/IHJlZ2lvblRleHQuc3Vic3RyaW5nKDEsIG5vZGVPZmZzZXQpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkJCS8vIGdldCBlbnRpdHkgcHJvcG9zYWxzLCBwYXNzaW5nIGluIHRoZSBhcHByb3ByaWF0ZSBzdGFydAotCQkJCS8vIHN0cmluZwotCQkJCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KCgoTm9kZSkgdHJlZU5vZGUpLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCQkJQ01Eb2N1bWVudCB4bWxEb2MgPSBtcS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudCh0cmVlTm9kZSk7Ci0JCQkJCUNNTmFtZWROb2RlTWFwIGNtbWFwID0gbnVsbDsKLQkJCQkJUHJvcGVydGllcyBlbnRpdGllcyA9IG51bGw7Ci0JCQkJCWlmICh4bWxEb2MgIT0gbnVsbCkgewotCQkJCQkJY21tYXAgPSB4bWxEb2MuZ2V0RW50aXRpZXMoKTsKLQkJCQkJfQotCQkJCQlpZiAoY21tYXAgIT0gbnVsbCkgewotCQkJCQkJZW50aXRpZXMgPSBtYXBUb1Byb3BlcnRpZXMoY21tYXApOwotCQkJCQl9Ci0JCQkJCWVsc2UgLy8gMjI0Nzg3IGluIGFic2VuY2Ugb2YgY29udGVudCBtb2RlbCwganVzdCB1c2UKLQkJCQkJLy8gbWluaW1hbCA1IGVudGl0aWVzCi0JCQkJCXsKLQkJCQkJCWVudGl0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCQkJCWVudGl0aWVzLnB1dCgicXVvdCIsICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWVudGl0aWVzLnB1dCgiYXBvcyIsICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJZW50aXRpZXMucHV0KCJhbXAiLCAiJiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWVudGl0aWVzLnB1dCgibHQiLCAiPCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWVudGl0aWVzLnB1dCgiZ3QiLCAiPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCi0JCQkJCQllbnRpdGllcy5wdXQoIm5ic3AiLCAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCQkJCQkKLQkJCQkJfQotCQkJCQlhZGRFbnRpdHlQcm9wb3NhbHMocHJvcG9zYWxzLCBlbnRpdGllcywga2V5LAotCQkJCQkJCW5vZGVPZmZzZXQsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBjb250ZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pICgocHJvcG9zYWxzLnNpemUoKSA+IDApID8gcHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLnNpemUoKV0pIDogbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFNpbWlsYXIgdG8gdGhlIGNhbGwgaW4gSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuIFBhc3MgaW4gYSBub2RlLCBpdAotCSAqIHRlbGxzIHlvdSBpZiB0aGUgZG9jdW1lbnQgaXMgWE1MIHR5cGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxOb2RlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlEb2N1bWVudCBkb2MgPSBudWxsOwotCQlkb2MgPSAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgPyBub2RlLmdldE93bmVyRG9jdW1lbnQoKSA6ICgoRG9jdW1lbnQpIG5vZGUpOwotCi0JCXJldHVybiAoZG9jIGluc3RhbmNlb2YgSURPTURvY3VtZW50KSAmJiAoKElET01Eb2N1bWVudCkgZG9jKS5pc1hNTFR5cGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIGN1cnNvciBwb3NpdGlvbiBpcyBhZnRlciBkb2N0eXBlIHRhZy4uLgotCSAqIAotCSAqIEBwYXJhbSBjYXIKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDdXJzb3JBZnRlckRvY3R5cGUoQ29udGVudEFzc2lzdFJlcXVlc3QgY2FyKSB7Ci0JCU5vZGUgYU5vZGUgPSBjYXIuZ2V0Tm9kZSgpOwotCQlEb2N1bWVudCBwYXJlbnQgPSBhTm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWludCB4bWxkb2N0eXBlTm9kZVBvc2l0aW9uID0gLTE7Ci0JCWJvb2xlYW4gaXNBZnRlckRvY3R5cGUgPSB0cnVlOwotCi0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7IC8vIGJsYW5rIGRvY3VtZW50IGNhc2UKLQkJfQotCi0JCWZvciAoTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJCQl4bWxkb2N0eXBlTm9kZVBvc2l0aW9uID0gKChJRE9NTm9kZSkgY2hpbGQpLmdldEVuZE9mZnNldCgpOwotCQkJCQlpc0FmdGVyRG9jdHlwZSA9IChjYXIuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgPj0geG1sZG9jdHlwZU5vZGVQb3NpdGlvbik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNBZnRlckRvY3R5cGU7Ci0JfQotCQotCS8qKgotCSAqIHJldHVybnMgYSBsaXN0IG9mIENNRWxlbWVudERlY2xhcmF0aW9ucwotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEBwYXJhbSBjaGlsZEluZGV4Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRBdmFpbGFibGVSb290Q2hpbGRyZW4oRG9jdW1lbnQgZG9jdW1lbnQsIGludCBjaGlsZEluZGV4KSB7Ci0JCUxpc3QgbGlzdCA9IG51bGw7Ci0KLQkJLy8gZXh0cmFjdCB0aGUgdmFsaWQgJ3Jvb3QnIG5vZGUgbmFtZSBmcm9tIHRoZSBEb2N1bWVudFR5cGUgTm9kZQotCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGRvY3VtZW50LmdldERvY3R5cGUoKTsKLQkJU3RyaW5nIHJvb3ROYW1lID0gbnVsbDsKLQkJaWYgKGRvY1R5cGUgIT0gbnVsbCkgewotCQkJcm9vdE5hbWUgPSBkb2NUeXBlLmdldE5vZGVOYW1lKCk7Ci0JCX0KLQkJaWYgKHJvb3ROYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KDApOwotCQl9Ci0KLQkJZm9yIChOb2RlIGNoaWxkID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCS8vIG1ha2Ugc3VyZSB0aGUgInJvb3QiIEVsZW1lbnQgaXNuJ3QgYWxyZWFkeSBwcmVzZW50Ci0JCQkvLyBpcyBpdCByZXF1aXJlZCB0byBiZSBhbiBFbGVtZW50PwotCQkJaWYgKChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSAmJiBjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2Uocm9vdE5hbWUpKSB7Ci0JCQkJLy8gaWYgdGhlIG5vZGUgaXMgbWlzc2luZyBlaXRoZXIgdGhlIHN0YXJ0IG9yIGVuZCB0YWcsIGRvbid0Ci0JCQkJLy8gY291bnQgaXQgYXMgcHJlc2VudAotCQkJCWlmICgoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgJiYgKCgoKElET01Ob2RlKSBjaGlsZCkuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSB8fCAoKChJRE9NTm9kZSkgY2hpbGQpLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihyb290TmFtZSArICIgYWxyZWFkeSBwcmVzZW50ISIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxVSU1lc3NhZ2VzLlRoZV9kb2N1bWVudF9lbGVtZW50X18sIChuZXcgT2JqZWN0W117cm9vdE5hbWV9KSkpOwotCQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KDApOwotCQkJfQotCQl9Ci0KLQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jdW1lbnQpOwotCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQlDTURvY3VtZW50IGNtZG9jID0gbW9kZWxRdWVyeS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChkb2N1bWVudCk7Ci0JCQlpZiAoY21kb2MgIT0gbnVsbCkgewotCQkJCWlmIChyb290TmFtZSAhPSBudWxsKSB7Ci0JCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIHJvb3REZWNsID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBjbWRvYy5nZXRFbGVtZW50cygpLmdldE5hbWVkSXRlbShyb290TmFtZSk7Ci0JCQkJCWlmIChyb290RGVjbCAhPSBudWxsKSB7Ci0JCQkJCQlsaXN0LmFkZChyb290RGVjbCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBzdXBwbHkgdGhlIGdpdmVuIGRvY3VtZW50IG5hbWUgYW55d2F5LCBldmVuIGlmIGl0Ci0JCQkJCQkvLyBpcyBhbiBlcnJvcgotCQkJCQkJbGlzdC5hZGQobmV3IFNpbXBsZUNNRWxlbWVudERlY2xhcmF0aW9uKHJvb3ROYW1lKSk7Ci0KLQkJCQkJCVN0cmluZyBsb2NhdGlvbiA9ICIiICsgKGRvY1R5cGUuZ2V0UHVibGljSWQoKSAhPSBudWxsID8gZG9jVHlwZS5nZXRQdWJsaWNJZCgpICsgIi8iIDogIiIpICsgKGRvY1R5cGUuZ2V0U3lzdGVtSWQoKSAhPSBudWxsID8gZG9jVHlwZS5nZXRTeXN0ZW1JZCgpIDogIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJCQlpZiAobG9jYXRpb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKAotCQkJCQkJCQkJWE1MVUlNZXNzYWdlcy5Ob19kZWZpbml0aW9uX2Zvcl9pbiwKLQkJCQkJCQkJCShuZXcgT2JqZWN0W117cm9vdE5hbWUsIGxvY2F0aW9ufSkpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZCgKLQkJCQkJCQkJCVhNTFVJTWVzc2FnZXMuTm9fZGVmaW5pdGlvbl9mb3IsCi0JCQkJCQkJCQkobmV3IE9iamVjdFtde3Jvb3ROYW1lfSkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCVN0cmluZyBsb2NhdGlvbiA9ICIiICsgKGRvY1R5cGUuZ2V0UHVibGljSWQoKSAhPSBudWxsID8gZG9jVHlwZS5nZXRQdWJsaWNJZCgpICsgIi8iIDogIiIpICsgKGRvY1R5cGUuZ2V0U3lzdGVtSWQoKSAhPSBudWxsID8gZG9jVHlwZS5nZXRTeXN0ZW1JZCgpIDogIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJaWYgKGxvY2F0aW9uLmxlbmd0aCgpID4gMCkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoCi0JCQkJCQkJWE1MVUlNZXNzYWdlcy5Ob19jb250ZW50X21vZGVsX2ZvciwKLQkJCQkJCQkobmV3IE9iamVjdFtde2xvY2F0aW9ufSkpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShYTUxVSU1lc3NhZ2VzLk5vX2NvbnRlbnRfbW9kZWxfZm91bmRfVUlfKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyBpZiBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMgaW4gdGhlIHByb3Bvc2VkIFhNTE5vZGUKLQkgKiBub2RlLCBhcmUgcG9zc2libGUgdmFsdWVzIG9mIGF0dHJpYnV0ZXMgZnJvbSBwb3NzaWJsZSBFbGVtZW50cyBhdCB0aGlzCi0JICogcG9pbnQgaW4gdGhlIGRvY3VtZW50IGFjY29yZGluZyB0byB0aGUgQ29udGVudCBNb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgd2l0aCBhdHRyaWJ1dGVzIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gdGVzdCBpZgotCSAqICAgICAgICAgICAgYXJlIHBvc3NpYmxlIGZvciBwb3NzaWJsZSBFbGVtZW50cyBhdCB0aGlzIHBvaW50Ci0JICogQHBhcmFtIGNtbm9kZQotCSAqICAgICAgICAgICAgcG9zc2libGUgZWxlbWVudCBhdCB0aGlzIHBvaW50IGluIHRoZSBkb2N1bWVudCAoZGVwZW5kaW5nIG9uCi0JICogICAgICAgICAgICB3aGF0ICdub2RlJyBpcykgdHJ1ZSBpZiBhbnkgYXR0cmlidXRlcyBvZiAnbm9kZScgbWF0Y2ggYW55Ci0JICogICAgICAgICAgICBwb3NzaWJsZSBhdHRyaWJ1dGVzIGZyb20gJ2Ntbm9kZXMnIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGF0dHJpYnV0ZUluTGlzdChJRE9NTm9kZSBub2RlLCBOb2RlIHBhcmVudCwgQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAoKG5vZGUgPT0gbnVsbCkgfHwgKHBhcmVudCA9PSBudWxsKSB8fCAoY21ub2RlID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGVsZW1lbnRNYXRjaFN0cmluZyA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJU3RyaW5nIGNtbm9kZU5hbWUgPSBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBjbW5vZGUpOy8vIGNtbm9kZS5nZXROb2RlTmFtZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCU5hbWVkTm9kZU1hcCBtYXAgPSAoKEVsZW1lbnQpIG5vZGUpLmdldEF0dHJpYnV0ZXMoKTsKLQkJCVN0cmluZyBhdHRyTWF0Y2hTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJLy8gaXRlcmF0ZSBhdHRyaWJ1dGUgcG9zc2liaWxpdGllcyBmb3IgcGFydGlhbGx5IHN0YXJ0ZWQgbm9kZQotCQkJZm9yIChpbnQgaSA9IDA7IChtYXAgIT0gbnVsbCkgJiYgKGkgPCBtYXAuZ2V0TGVuZ3RoKCkpOyBpKyspIHsKLQkJCQlhdHRyTWF0Y2hTdHJpbmcgPSBtYXAuaXRlbShpKS5nZXROb2RlTmFtZSgpOwotCQkJCS8vIGZpbHRlciBvbiB3aGF0ZXZlciB1c2VyIHR5cGVkIGZvciBlbGVtZW50IG5hbWUgYWxyZWFkeQotCQkJCWlmIChiZWdpbnNXaXRoKGNtbm9kZU5hbWUsIGVsZW1lbnRNYXRjaFN0cmluZykpIHsKLQkJCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCQlDTU5hbWVkTm9kZU1hcEltcGwgYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKChDTUVsZW1lbnREZWNsYXJhdGlvbikgY21ub2RlKS5nZXRBdHRyaWJ1dGVzKCkpOwotCQkJCQkJdGhpcy5hZGRNb2RlbFF1ZXJ5QXR0cmlidXRlRGVjbGFyYXRpb25zKAotCQkJCQkJCQlub2RlLCgoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNtbm9kZSksYXR0cmlidXRlcyk7Ci0JCi0JCQkJCQkvLyBpdGVyYXRlIHBvc3NpYmxlIGF0dHJpYnV0ZXMgZnJvbSBhIGNtbm9kZSBpbgotCQkJCQkJLy8gcHJvcG9zYWwgbGlzdAotCQkJCQkJZm9yIChpbnQgayA9IDA7IChhdHRyaWJ1dGVzICE9IG51bGwpICYmIChrIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKSk7IGsrKykgewotCQkJCQkJCS8vIGNoZWNrIGlmIG5hbWUgbWF0Y2hlcwotCQkJCQkJCWlmIChhdHRyaWJ1dGVzLml0ZW0oaykuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoYXR0ck1hdGNoU3RyaW5nKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnRpZXMgbWFwVG9Qcm9wZXJ0aWVzKENNTmFtZWROb2RlTWFwIG1hcCkgewotCQlQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlDTUVudGl0eURlY2xhcmF0aW9uIGRlY2wgPSAoQ01FbnRpdHlEZWNsYXJhdGlvbikgbWFwLml0ZW0oaSk7Ci0JCQlwLnB1dChkZWNsLmdldE5hbWUoKSwgZGVjbC5nZXRWYWx1ZSgpKTsKLQkJfQotCQlyZXR1cm4gcDsKLQl9Ci0JCi0JLyoqCi0JICogPHA+QWRkcyBtb2RlbCBxdWVyeSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24gcHJvcG9zYWxzPC9wPgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGVsZW1lbnREZWNsCi0JICogQHBhcmFtIGFsbEF0dHJpYnV0ZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTW9kZWxRdWVyeUF0dHJpYnV0ZURlY2xhcmF0aW9ucyhJRE9NTm9kZSBub2RlLAotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wsIENNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzKSB7Ci0JCQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlMaXN0IG5vZGVzID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudCgoRWxlbWVudCkgbm9kZSwgZWxlbWVudERlY2wsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCW5vZGVzID0gZmlsdGVyQXZhaWxhYmxlTW9kZWxRdWVyeUNNTm9kZXMobm9kZXMpOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBub2Rlcy5zaXplKCk7IGsrKykgewotCQkJCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoayk7Ci0JCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQkJYWxsQXR0cmlidXRlcy5wdXQoY21ub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogcmV0dXJucyBhIGxpc3Qgb2YgQ01Ob2RlcyB0aGF0IGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgcGFyZW50IGNvbnRleHQKLQkgKiBHaXZlbiB0aGUgZ3JhbW1hciBzaG93biBiZWxvdyBhbmQgYSBzbmlwcGV0IG9mIFhNTCBjb2RlICh3aGVyZSB0aGUgJ3wnCi0JICogaW5kaWNhdGVkIHRoZSBjdXJzb3IgcG9zaXRpb24pCi0JICogdGhlIGxpc3Qgd291bGQgcmV0dXJuIGFsbCBvZiB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgdGhhdCBhcmUKLQkgKiBwb3RlbnRpYWwgY2hpbGQgZWxlbWVudHMgb2YgRm9vLgotCSAqCi0JICogZ3JhbW1hciA6IEZvbyAtPiAoQSwgQiwgQykKLQkgKiBzbmlwcGV0IDogPEZvbz48QT58Ci0JICogcmVzdWx0IDoge0EsIEIsIEN9Ci0JICogCi0JICogVE9ETyBjcy4uLiBkbyB3ZSBuZWVkIHRvIHBhc3MgaW4gdGhlICdraW5kT2ZBY3Rpb24nPyBTZWVtcyB0byBtZSB3ZQotCSAqIGNvdWxkIGFzc3VtZSBpdCdzIGFsd2F5cyBhbiBpbnNlcnQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGNoaWxkUG9zaXRpb24KLQkgKiBAcGFyYW0ga2luZE9mQWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRBdmFpbGFibGVDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMoRWxlbWVudCBwYXJlbnQsIGludCBjaGlsZFBvc2l0aW9uLCBpbnQga2luZE9mQWN0aW9uKSB7Ci0JCUxpc3QgbW9kZWxRdWVyeUFjdGlvbnMgPSBnZXRBdmFpbGFibGVNb2RlbFF1ZXJ5QWN0aW9uc0F0SW5kZXgocGFyZW50LCBjaGlsZFBvc2l0aW9uLCBNb2RlbFF1ZXJ5LlZBTElESVRZX05PTkUpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZGVsUXVlcnlBY3Rpb25zLml0ZXJhdG9yKCk7Ci0JCUxpc3QgY21ub2RlcyA9IG5ldyBWZWN0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTW9kZWxRdWVyeUFjdGlvbiBhY3Rpb24gPSAoTW9kZWxRdWVyeUFjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKChjaGlsZFBvc2l0aW9uIDwgMCkgfHwgKCgoYWN0aW9uLmdldFN0YXJ0SW5kZXgoKSA8PSBjaGlsZFBvc2l0aW9uKSAmJiAoY2hpbGRQb3NpdGlvbiA8PSBhY3Rpb24uZ2V0RW5kSW5kZXgoKSkpICYmIChhY3Rpb24uZ2V0S2luZCgpID09IGtpbmRPZkFjdGlvbikpKSB7Ci0JCQkJQ01Ob2RlIGFjdGlvbkNNTm9kZSA9IGFjdGlvbi5nZXRDTU5vZGUoKTsKLQkJCQlpZiAoKGFjdGlvbkNNTm9kZSAhPSBudWxsKSAmJiAhY21ub2Rlcy5jb250YWlucyhhY3Rpb25DTU5vZGUpKSB7Ci0JCQkJCWNtbm9kZXMuYWRkKGFjdGlvbkNNTm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjbW5vZGVzOwotCX0KLQkKLQkvKioKLQkgKiByZXR1cm5zIGEgbGlzdCBvZiBDTU5vZGVzIHRoYXQgY2FuIGJlIHZhbGlkbHkgaW5zZXJ0ZWQgYXQgdGhpcwotCSAqIGNoaWxkUG9zaXRpb24KLQkgKiBHaXZlbiB0aGUgZ3JhbW1hciBzaG93biBiZWxvdyBhbmQgYSBzbmlwcGV0IG9mIFhNTCBjb2RlICh3aGVyZSB0aGUgJ3wnCi0JICogaW5kaWNhdGVkIHRoZSBjdXJzb3IgcG9zaXRpb24pCi0JICogdGhlIGxpc3Qgd291bGQgcmV0dXJuIG9ubHkgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGNhbiBiZSBpbnNlcnRlZAotCSAqIHdoaWxlIG1haW50YWluZyB2YWxpZGl0eSBvZiB0aGUgY29udGVudC4KLQkgKgotCSAqIGdyYW1tYXIgOiBGb28gLT4gKEEsIEIsIEMpCi0JICogc25pcHBldCA6IDxGb28+PEE+fAotCSAqIHJlc3VsdCA6IHtCfQotCSAqICAgIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gY2hpbGRQb3NpdGlvbgotCSAqIEBwYXJhbSBraW5kT2ZBY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFZhbGlkQ2hpbGRFbGVtZW50RGVjbGFyYXRpb25zKEVsZW1lbnQgcGFyZW50LCBpbnQgY2hpbGRQb3NpdGlvbiwgaW50IGtpbmRPZkFjdGlvbikgewotCQlMaXN0IG1vZGVsUXVlcnlBY3Rpb25zID0gZ2V0QXZhaWxhYmxlTW9kZWxRdWVyeUFjdGlvbnNBdEluZGV4KHBhcmVudCwgY2hpbGRQb3NpdGlvbiwgTW9kZWxRdWVyeS5WQUxJRElUWV9TVFJJQ1QpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZGVsUXVlcnlBY3Rpb25zLml0ZXJhdG9yKCk7Ci0JCUxpc3QgY21ub2RlcyA9IG5ldyBWZWN0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTW9kZWxRdWVyeUFjdGlvbiBhY3Rpb24gPSAoTW9kZWxRdWVyeUFjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKChjaGlsZFBvc2l0aW9uIDwgMCkgfHwgKCgoYWN0aW9uLmdldFN0YXJ0SW5kZXgoKSA8PSBjaGlsZFBvc2l0aW9uKSAmJiAoY2hpbGRQb3NpdGlvbiA8PSBhY3Rpb24uZ2V0RW5kSW5kZXgoKSkpICYmIChhY3Rpb24uZ2V0S2luZCgpID09IGtpbmRPZkFjdGlvbikpKSB7Ci0JCQkJQ01Ob2RlIGFjdGlvbkNNTm9kZSA9IGFjdGlvbi5nZXRDTU5vZGUoKTsKLQkJCQlpZiAoKGFjdGlvbkNNTm9kZSAhPSBudWxsKSAmJiAhY21ub2Rlcy5jb250YWlucyhhY3Rpb25DTU5vZGUpKSB7Ci0JCQkJCWNtbm9kZXMuYWRkKGFjdGlvbkNNTm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjbW5vZGVzOwotCX0KLQkKLQkvKioKLQkgKiByZXR1cm5zIGEgbGlzdCBvZiBNb2RlbFF1ZXJ5QWN0aW9ucwotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gdmFsaWRpdHlDaGVja2luZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0QXZhaWxhYmxlTW9kZWxRdWVyeUFjdGlvbnNBdEluZGV4KEVsZW1lbnQgcGFyZW50LCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RGVjbCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudCk7Ci0JCWlmIChwYXJlbnREZWNsICE9IG51bGwpIHsKLQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkocGFyZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQkvLyB0YWtlbiBmcm9tIEFjdGlvbk1hbmFnZXJzCi0JCQkvLyBpbnQgZWRpdE1vZGUgPSBtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCk7Ci0JCQlpbnQgZWRpdE1vZGUgPSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9VTkNPTlNUUkFJTkVEOwotCQkJaW50IGljID0gKGVkaXRNb2RlID09IE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCkgPyBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVMgfCBNb2RlbFF1ZXJ5LklOQ0xVREVfU0VRVUVOQ0VfR1JPVVBTIDogTW9kZWxRdWVyeS5JTkNMVURFX0NISUxEX05PREVTOwotCQkJbW9kZWxRdWVyeS5nZXRJbnNlcnRBY3Rpb25zKHBhcmVudCwgcGFyZW50RGVjbCwgaW5kZXgsIGljLCB2YWxpZGl0eUNoZWNraW5nLCBsaXN0KTsKLQkJfQotCQkKLQkJbGlzdCA9IGZpbHRlckF2YWlsYWJsZU1vZGVsUXVlcnlBY3Rpb25zKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogPHA+RmlsdGVycyBvdXQgYW55IG1vZGVsIHF1ZXJ5IGFjdGlvbnMgdGhhdCBhcmUgbm90IHZhbGlkIGZvciB0aGlzCi0JICogaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIHF1ZXJ5IGNvbXB1dGVyIGJhc2VkIG9uIHRoZSB7QGxpbmsgQ01Ob2RlfQotCSAqIG9mIHRoZSBhY3Rpb24uPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbFF1ZXJ5QWN0aW9ucwotCSAqIEByZXR1cm4gdGhlIGZpbHRlcmVkIGxpc3Qgb2Yge0BsaW5rIE1vZGVsUXVlcnlBY3Rpb259cwotCSAqLwotCXByaXZhdGUgTGlzdCBmaWx0ZXJBdmFpbGFibGVNb2RlbFF1ZXJ5QWN0aW9ucyhMaXN0IG1vZGVsUXVlcnlBY3Rpb25zKSB7Ci0JCUxpc3QgZmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0KG1vZGVsUXVlcnlBY3Rpb25zLnNpemUoKSk7Ci0JCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kZWxRdWVyeUFjdGlvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTW9kZWxRdWVyeUFjdGlvbiBhY3Rpb24gPSAoTW9kZWxRdWVyeUFjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYodmFsaWRNb2RlbFF1ZXJ5Tm9kZShhY3Rpb24uZ2V0Q01Ob2RlKCkpKSB7Ci0JCQkJZmlsdGVyZWQuYWRkKGFjdGlvbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmaWx0ZXJlZDsKLQl9Ci0JCi0JLyoqCi0JICogPHA+RmlsdGVycyBvdXQgYW55IG1vZGVsIHF1ZXJ5IHtAbGluayBDTU5vZGV9cyB0aGF0IGFyZSBub3QgdmFsaWQgZm9yIHRoaXMKLQkgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgcXVlcnkgY29tcHV0ZXI8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZGVsUXVlcnlOb2RlcwotCSAqIEByZXR1cm4gdGhlIGZpbHRlcmVkIGxpc3Qgb2Yge0BsaW5rIENNTm9kZX1zCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZpbHRlckF2YWlsYWJsZU1vZGVsUXVlcnlDTU5vZGVzKExpc3QgbW9kZWxRdWVyeU5vZGVzKSB7Ci0JCUxpc3QgZmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0KG1vZGVsUXVlcnlOb2Rlcy5zaXplKCkpOwotCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZGVsUXVlcnlOb2Rlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlDTU5vZGUgbm9kZSA9IChDTU5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKHZhbGlkTW9kZWxRdWVyeU5vZGUobm9kZSkpIHsKLQkJCQlmaWx0ZXJlZC5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmaWx0ZXJlZDsKLQl9Ci0JCi0JLyoqCi0JICogPHA+QWRkcyBhIGdlbmVyaWMgZG9jIHR5cGUgcHJvcG9zYWw8L3A+Ci0JICogCi0JICogQHBhcmFtIGNvbnRlbnRBc3Npc3RSZXF1ZXN0Ci0JICogQHBhcmFtIGNvbnRleHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRG9jVHlwZVByb3Bvc2FsKAotCQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCQotCQkvLyBpZiBhIERvY3VtZW50RWxlbWVudCBleGlzdHMsIHVzZSB0aGF0IGZvciB0aGUgcm9vdCBFbGVtZW50IG5hbWUKLQkJU3RyaW5nIHJvb3RuYW1lID0gInVuc3BlY2lmaWVkIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpLmdldE93bmVyRG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlyb290bmFtZSA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKS5nZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Tm9kZU5hbWUoKTsKLQkJfQotCi0JCVN0cmluZyBwcm9wb3NlZFRleHQgPSAiPCFET0NUWVBFICIgKyByb290bmFtZSArICIgUFVCTElDIFwiLy9VTktOT1dOL1wiIFwidW5rbm93bi5kdGRcIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoCi0JCQkJcHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCAxMCwKLQkJCQlYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0RPQ1RZUEUpLAotCQkJCSI8IURPQ1RZUEUgLi4uID4iLCAvLyROT04tTkxTLTEkCi0JCQkJbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfRE9DVFlQRSk7Ci0JCS8vIFRPRE8gcHJvdmlkZSBzcGVjaWFsIGRvY3VtZW50YXRpb24gb24gZG9jIHR5cGUKLQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKE5vZGUgbm9kZSkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBSZXRyaWV2ZXMgY21ub2RlJ3MgZG9jdW1lbnRhdGlvbiB0byBkaXNwbGF5IGluIHRoZSBjb21wbGV0aW9uCi0JICogcHJvcG9zYWwncyBhZGRpdGlvbmFsIGluZm8uIElmIG5vIGRvY3VtZW50YXRpb24gZXhpc3RzIGZvciBjbW5vZGUsIHRyeQotCSAqIGRpc3BsYXlpbmcgcGFyZW50T3JPd25lcidzIGRvY3VtZW50YXRpb24KLQkgKiAKLQkgKiBTdHJpbmcgYW55IGRvY3VtZW50YXRpb24gaW5mb3JtYXRpb24gdG8gZGlzcGxheSBmb3IgY21ub2RlLgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gZGlzcGxheS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBZGRpdGlvbmFsSW5mbyhDTU5vZGUgcGFyZW50T3JPd25lciwgQ01Ob2RlIGNtbm9kZSkgewotCQlTdHJpbmcgYWRkbEluZm8gPSBudWxsOwotCi0JCWlmIChjbW5vZGUgPT0gbnVsbCkgewotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwgZGVjbGFyYXRpb24hIikucHJpbnRTdGFja1RyYWNlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJYWRkbEluZm8gPSBpbmZvUHJvdmlkZXIuZ2V0SW5mbyhjbW5vZGUpOwotCQlpZiAoKGFkZGxJbmZvID09IG51bGwpICYmIChwYXJlbnRPck93bmVyICE9IG51bGwpKSB7Ci0JCQlhZGRsSW5mbyA9IGluZm9Qcm92aWRlci5nZXRJbmZvKHBhcmVudE9yT3duZXIpOwotCQl9Ci0JCXJldHVybiBhZGRsSW5mbzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmU1MTRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuQXNzZXJ0OwotCi0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgSUNvbnRleHRJbmZvcm1hdGlvbi4gQWRkcyBrbm93bGVkZ2UgYWJvdXQgdGhlIGluZm9ybWF0aW9uCi0gKiBkaXNwbGF5IHN0cmluZyBzdWNoIGFzIHJlcXVpcmVkIGF0dHJpYnV0ZXMgZm9yIHRoaXMgY29udGV4dC4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIElDb250ZXh0SW5mb3JtYXRpb24sIElDb250ZXh0SW5mb3JtYXRpb25FeHRlbnNpb24gewotCXByaXZhdGUgSGFzaE1hcCBmQXR0cjJSYW5nZU1hcDsKLQkvKiogVGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgKi8KLQlwcml2YXRlIFN0cmluZyBmQ29udGV4dERpc3BsYXlTdHJpbmc7Ci0JLyoqIFRoZSBpbWFnZSB0byBiZSBkaXNwbGF5ZWQgKi8KLQlwcml2YXRlIEltYWdlIGZJbWFnZTsKLQkvKiogVGhlIGluZm9ybWF0aW9uIHRvIGJlIGRpc3BsYXllZCAqLwotCXByaXZhdGUgU3RyaW5nIGZJbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmc7Ci0JcHJpdmF0ZSBpbnQgZlBvc2l0aW9uID0gLTE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgaW5mb3JtYXRpb24gd2l0aCBhbiBpbWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byBkaXNwbGF5IHdoZW4gcHJlc2VudGluZyB0aGUgY29udGV4dCBpbmZvcm1hdGlvbgotCSAqIEBwYXJhbSBjb250ZXh0RGlzcGxheVN0cmluZwotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSB1c2VkIHdoZW4gcHJlc2VudGluZyB0aGUgY29udGV4dAotCSAqIEBwYXJhbSBpbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkIHdoZW4gcHJlc2VudGluZyB0aGUgY29udGV4dAotCSAqICAgICAgICAgICAgaW5mb3JtYXRpb24sIG1heSBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uKEltYWdlIGltYWdlLCBTdHJpbmcgY29udGV4dERpc3BsYXlTdHJpbmcsIFN0cmluZyBpbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcsIEhhc2hNYXAgYXR0cjJSYW5nZU1hcCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGluZm9ybWF0aW9uRGlzcGxheVN0cmluZywgImlsbGVnYWwgYXJndW1lbnQ6IGluZm9ybWF0aW9uRGlzcGxheVN0cmluZyBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZJbWFnZSA9IGltYWdlOwotCQlmQ29udGV4dERpc3BsYXlTdHJpbmcgPSBjb250ZXh0RGlzcGxheVN0cmluZzsKLQkJZkluZm9ybWF0aW9uRGlzcGxheVN0cmluZyA9IGluZm9ybWF0aW9uRGlzcGxheVN0cmluZzsKLQkJZkF0dHIyUmFuZ2VNYXAgPSBhdHRyMlJhbmdlTWFwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGV4dCBpbmZvcm1hdGlvbiB3aXRob3V0IGFuIGltYWdlLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0RGlzcGxheVN0cmluZwotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSB1c2VkIHdoZW4gcHJlc2VudGluZyB0aGUgY29udGV4dAotCSAqIEBwYXJhbSBpbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkIHdoZW4gcHJlc2VudGluZyB0aGUgY29udGV4dAotCSAqICAgICAgICAgICAgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uKFN0cmluZyBjb250ZXh0RGlzcGxheVN0cmluZywgU3RyaW5nIGluZm9ybWF0aW9uRGlzcGxheVN0cmluZywgSGFzaE1hcCBhdHRyMlJhbmdlTWFwKSB7Ci0JCXRoaXMobnVsbCwgY29udGV4dERpc3BsYXlTdHJpbmcsIGluZm9ybWF0aW9uRGlzcGxheVN0cmluZywgYXR0cjJSYW5nZU1hcCk7Ci0JfQotCi0JLyoqCi0JICogTWFwcyAoU3RyaW5nIC0+IFBvc2l0aW9uKS4gVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIHRoZSBUZXh0IHBvc2l0aW9uLgotCSAqIAotCSAqIAotCSAqLwotCXB1YmxpYyBIYXNoTWFwIGdldEF0dHIyUmFuZ2VNYXAoKSB7Ci0JCXJldHVybiBmQXR0cjJSYW5nZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uI2dldENvbnRleHREaXNwbGF5U3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHREaXNwbGF5U3RyaW5nKCkgewotCQlpZiAoZkNvbnRleHREaXNwbGF5U3RyaW5nICE9IG51bGwpIHsKLQkJCXJldHVybiBmQ29udGV4dERpc3BsYXlTdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIGZJbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbkV4dGVuc2lvbiNnZXRDb250ZXh0SW5mb3JtYXRpb25Qb3NpdGlvbigpCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZXh0SW5mb3JtYXRpb25Qb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBmSW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbiNnZXRJbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gZkluZm9ybWF0aW9uRGlzcGxheVN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0SW5mb3JtYXRpb25Qb3NpdGlvbihpbnQgcG9zaXRpb24pIHsKLQkJZlBvc2l0aW9uID0gcG9zaXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3MWM3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqIFJlc3BvbnNpYmxlIGZvciB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBjb250ZXh0IGluZm8gcG9wdXAuIFRoaXMgaW5jbHVkZXMKLSAqIHRleHQgc3R5bGUsIGFuZCB3aGVuIHRoZSB3aW5kb3cgc2hvdWxkIGNsb3NlLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyIGV4dGVuZHMgQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGltcGxlbWVudHMgSUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciB7Ci0KLQlwcml2YXRlIElDb250ZXh0SW5mb3JtYXRpb24gZkluZm8gPSBudWxsOwotCXByaXZhdGUgQ29udGV4dEluZm9Nb2RlbFV0aWwgZk1vZGVsVXRpbCA9IG51bGw7Ci0KLQlwdWJsaWMgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IjaW5zdGFsbChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbiwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGwoSUNvbnRleHRJbmZvcm1hdGlvbiBpbmZvLCBJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCXN1cGVyLmluc3RhbGwoaW5mbywgdmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJdGhpcy5mSW5mbyA9IGluZm87Ci0JCXRoaXMuZk1vZGVsVXRpbCA9IG5ldyBDb250ZXh0SW5mb01vZGVsVXRpbCgoSVN0cnVjdHVyZWREb2N1bWVudCkgdmlld2VyLmdldERvY3VtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIjdXBkYXRlUHJlc2VudGF0aW9uKGludCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFByZXNlbnRhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVQcmVzZW50YXRpb24oaW50IGRvY3VtZW50UG9zaXRpb24sIFRleHRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uKSB7Ci0JCXByZXNlbnRhdGlvbi5jbGVhcigpOwotCi0JCWlmICghKGZJbmZvIGluc3RhbmNlb2YgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gaXRlcmF0ZSBleGlzdGluZyBhdHRyaWJ1dGVzIGZyb20gY3VycmVudCBub2RlCi0JCUlET01Ob2RlIHhtbE5vZGUgPSBmTW9kZWxVdGlsLmdldFhNTE5vZGUoZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmICh4bWxOb2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0geG1sTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCVN0cmluZyBhdHRyTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCU9iamVjdCB0ZW1wID0gbnVsbDsKLQkJUG9zaXRpb24gcCA9IG51bGw7Ci0JCUhhc2hNYXAgbWFwID0gKChBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb24pIGZJbmZvKS5nZXRBdHRyMlJhbmdlTWFwKCk7Ci0KLQkJLy8gc28gd2UgY2FuIGFkZCByYW5nZXMgaW4gb3JkZXIKLQkJU3R5bGVSYW5nZVtdIHNvcnRlZCA9IG5ldyBTdHlsZVJhbmdlW2ZJbmZvLmdldEluZm9ybWF0aW9uRGlzcGxheVN0cmluZygpLmxlbmd0aCgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJYXR0ck5hbWUgPSBzZFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCXRlbXAgPSBtYXAuZ2V0KGF0dHJOYW1lKTsKLQkJCQlpZiAodGVtcCAhPSBudWxsKSB7Ci0JCQkJCXAgPSAoUG9zaXRpb24pIHRlbXA7Ci0JCQkJCXNvcnRlZFtwLm9mZnNldF0gPSBuZXcgU3R5bGVSYW5nZShwLm9mZnNldCwgcC5sZW5ndGgsIG51bGwsIG51bGwsIFNXVC5CT0xEKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gc3R5bGUgcmFuZ2VzIG5lZWQgdG8gYmUgYWRkZWQgaW4gb3JkZXIKLQkJU3R5bGVSYW5nZSBzciA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc29ydGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlzciA9IHNvcnRlZFtpXTsKLQkJCWlmIChzciAhPSBudWxsKSB7Ci0JCQkJcHJlc2VudGF0aW9uLmFkZFN0eWxlUmFuZ2Uoc3IpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMThkN2M4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01OYW1lZE5vZGVNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIENhbGN1bGF0ZXMgYXR0cmlidXRlIGNvbnRleHQgaW5mb3JtYXRpb24gYmFzZWQgb24gYSBTdHJ1Y3R1ZWREb2N1bWVudCBhbmQKLSAqIGRvY3VtZW50IHBvc2l0aW9uLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJvdmlkZXIgewotCXByaXZhdGUgZmluYWwgSUNvbnRleHRJbmZvcm1hdGlvbltdIEVNUFRZX0NPTlRFWFRfSU5GTyA9IG5ldyBJQ29udGV4dEluZm9ybWF0aW9uWzBdOwotCXByaXZhdGUgQ29tcGFyYXRvciBmQ29tcGFyYXRvcjsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgQ29udGV4dEluZm9Nb2RlbFV0aWwgZk1vZGVsVXRpbCA9IG51bGw7Ci0KLQlwdWJsaWMgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJvdmlkZXIoSVN0cnVjdHVyZWREb2N1bWVudCBkb2MsIEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciBwcmVzZW50ZXIpIHsKLQkJZkRvY3VtZW50ID0gZG9jOwotCQlmTW9kZWxVdGlsID0gbmV3IENvbnRleHRJbmZvTW9kZWxVdGlsKGZEb2N1bWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNkUmVnaW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhblByb3Bvc2VJbmZvKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJaWYgKChzZFJlZ2lvbiAhPSBudWxsKSAmJiBpc0VuZFRhZyhzZFJlZ2lvbikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBnZXRBdHRyaWJ1dGVJbmZvcm1hdGlvbihpbnQgb2Zmc2V0KSB7Ci0JCS8qCi0JCSAqIG5lZWQgdG8gdGFrZSBjYXJlIG9mIHNwZWNpYWwgY2FzZXMgdy8gYW1iaWd1b3VzIHJlZ2lvbnMgPHRhZz58Ci0JCSAqIDwvdGFnPiBhbHNvIGVuZCB0YWdzLi4KLQkJICovCi0JCUlDb250ZXh0SW5mb3JtYXRpb25bXSByZXN1bHRzID0gRU1QVFlfQ09OVEVYVF9JTkZPOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBmTW9kZWxVdGlsLmdldERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJaWYgKCFjYW5Qcm9wb3NlSW5mbyhzZFJlZ2lvbikpIHsKLQkJCXJldHVybiBFTVBUWV9DT05URVhUX0lORk87Ci0JCX0KLQotCQlJRE9NTm9kZSBub2RlID0gZk1vZGVsVXRpbC5nZXRYTUxOb2RlKG9mZnNldCk7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQkJCXJlc3VsdHMgPSBnZXRJbmZvRm9yRWxlbWVudChub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJLy8gZnV0dXJlLi4uCi0JCQkJLy8gY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0JCQkJLy8gcmVzdWx0cyA9IGdldEluZm9Gb3JUZXh0KG5vZGUpOwotCQkJCS8vIGJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21wYXJhdG9yIHRoYXQgY29tcGFyZXMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBuYW1lcy4KLQkgKiAKLQkgKiB0aGUgY29tcGFyYXRvcgotCSAqLwotCXByaXZhdGUgQ29tcGFyYXRvciBnZXRDTUF0dHJpYnV0ZUNvbXBhcmF0b3IoKSB7Ci0JCWlmIChmQ29tcGFyYXRvciA9PSBudWxsKSB7Ci0JCQlmQ29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCQlyZXR1cm4gKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBvMSkuZ2V0QXR0ck5hbWUoKS5jb21wYXJlVG8oKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBvMikuZ2V0QXR0ck5hbWUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gZkNvbXBhcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5vZGUKLQkgKiAKLQkgKi8KLQlwcml2YXRlIElDb250ZXh0SW5mb3JtYXRpb25bXSBnZXRJbmZvRm9yRWxlbWVudChJRE9NTm9kZSBub2RlKSB7Ci0JCUlDb250ZXh0SW5mb3JtYXRpb25bXSByZXN1bHRzID0gRU1QVFlfQ09OVEVYVF9JTkZPOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZk1vZGVsVXRpbC5nZXRNb2RlbFF1ZXJ5KCkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIG5vZGUpOwotCQlpZiAoZGVjbCAhPSBudWxsKSB7Ci0JCQlDTU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0KLQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyaWJ1dGVzKTsKLQkJCUxpc3Qgbm9kZXMgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBdmFpbGFibGVDb250ZW50KChFbGVtZW50KSBub2RlLCBkZWNsLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJQ01Ob2RlIGNtbm9kZSA9IChDTU5vZGUpIG5vZGVzLmdldChrKTsKLQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWF0dHJpYnV0ZXMgPSBhbGxBdHRyaWJ1dGVzOwotCQkJCi0JCQlTdHJpbmcgYXR0ckNvbnRleHRTdHJpbmcgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQlTdHJpbmdCdWZmZXIgYXR0ckluZm8gPSBuZXcgU3RyaW5nQnVmZmVyKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCUhhc2hNYXAgYXR0clBvc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlpbnQgcG9zID0gMDsKLQkJCWludCBsZW5ndGggPSAwOwotCQkJaW50IG51bVBlckxpbmUgPSA4OwotCi0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uW10gc29ydGVkQXR0cnMgPSBnZXRTb3J0ZWRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNvcnRlZEF0dHJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbmFtZSA9IHNvcnRlZEF0dHJzW2ldLmdldEF0dHJOYW1lKCk7Ci0JCQkJbGVuZ3RoID0gbmFtZS5sZW5ndGgoKTsKLQkJCQlwb3MgPSBhdHRySW5mby5sZW5ndGgoKTsKLQotCQkJCWF0dHJJbmZvLmFwcGVuZChuYW1lKTsKLQotCQkJCWlmIChzb3J0ZWRBdHRyc1tpXS5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpIHsKLQkJCQkJYXR0ckluZm8uYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbGVuZ3RoKys7Ci0JCQkJfQotCQkJCWlmIChpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKSAtIDEpIHsKLQkJCQkJYXR0ckluZm8uYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKChpICE9IDApICYmIChpICUgbnVtUGVyTGluZSA9PSAwKSkgewotCQkJCQkJYXR0ckluZm8uYXBwZW5kKCJcbiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCWF0dHJQb3NNYXAucHV0KG5hbWUsIG5ldyBQb3NpdGlvbihwb3MsIGxlbmd0aCkpOwotCQkJfQotCQkJaWYgKCFhdHRySW5mby50b1N0cmluZygpLnRyaW0oKS5lcXVhbHMoIiIpKSB7Ci0JCQkJcmV0dXJuIG5ldyBJQ29udGV4dEluZm9ybWF0aW9uW117bmV3IEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvbihhdHRyQ29udGV4dFN0cmluZywgYXR0ckluZm8udG9TdHJpbmcoKSwgYXR0clBvc01hcCl9OwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JICogCi0JICovCi0JSUNvbnRleHRJbmZvcm1hdGlvbltdIGdldEluZm9Gb3JUZXh0KElET01Ob2RlIG5vZGUpIHsKLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJU3RyaW5nIGNvbnRleHRTdHJpbmcgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCVN0cmluZ0J1ZmZlciBpbmZvID0gbmV3IFN0cmluZ0J1ZmZlcigiICIpOyAvLyROT04tTkxTLTEkCi0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBmTW9kZWxVdGlsLmdldE1vZGVsUXVlcnkoKS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgcGFyZW50KTsKLQkJCUNNQ29udGVudCBjb250ZW50ID0gZGVjbC5nZXRDb250ZW50KCk7Ci0JCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIENNR3JvdXApIHsKLQkJCQlDTUdyb3VwIGNtR3JvdXAgPSAoQ01Hcm91cCkgY29udGVudDsKLQkJCQlDTU5vZGVMaXN0IGNoaWxkcmVuID0gY21Hcm91cC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJQ01Ob2RlIGNtTm9kZSA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCWNtTm9kZSA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJCWNvbnRleHRTdHJpbmcgPSBjbU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJaWYgKGNvbnRleHRTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJaW5mby5hcHBlbmQoIjwiICsgY21Ob2RlLmdldE5vZGVOYW1lKCkgKyAiPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWlmIChpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCkgLSAxKSB7Ci0JCQkJCQkJaW5mby5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghaW5mby50b1N0cmluZygpLnRyaW0oKS5lcXVhbHMoIiIpKSB7Ci0JCQlyZXR1cm4gbmV3IElDb250ZXh0SW5mb3JtYXRpb25bXXtuZXcgQ29udGV4dEluZm9ybWF0aW9uKGNvbnRleHRTdHJpbmcsIGluZm8udG9TdHJpbmcoKSl9OwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIEVNUFRZX0NPTlRFWFRfSU5GTzsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc29ydGVkIGFycmF5IG9mIENNQXR0cmlidXRlRGVjbGFyYXRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCi0JICogCi0JICovCi0JcHJpdmF0ZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uW10gZ2V0U29ydGVkQXR0cmlidXRlcyhDTU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzKSB7Ci0JCUxpc3Qgc29ydGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJc29ydGVkLmFkZChhdHRyaWJ1dGVzLml0ZW0oaSkpOwotCQl9Ci0JCUNvbGxlY3Rpb25zLnNvcnQoc29ydGVkLCBnZXRDTUF0dHJpYnV0ZUNvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbltdKSBzb3J0ZWQudG9BcnJheShuZXcgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbltzb3J0ZWQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNkUmVnaW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5kVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCXJldHVybiByZWdpb25zLmdldCgwKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRlbnRBc3Npc3RSZXF1ZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db250ZW50QXNzaXN0UmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTFkM2FmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRlbnRBc3Npc3RSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBDb250ZW50QXNzaXN0UmVxdWVzdCB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBudWxsOwotCXByb3RlY3RlZCBMaXN0IG1hY3JvcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG1hdGNoU3RyaW5nOwotCXByb3RlY3RlZCBOb2RlIG5vZGUgPSBudWxsOwotCXByb3RlY3RlZCBOb2RlIHBhcmVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIExpc3QgcHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCXByb3RlY3RlZCBpbnQgcmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uOwotCXByb3RlY3RlZCBpbnQgcmVwbGFjZW1lbnRMZW5ndGg7Ci0KLQkvLyBwcml2YXRlIEJvb2xlYW4gc2VwYXJhdGUgPSBudWxsOyAvLyAocGEpIG5vdCB1c2VkCi0JLy8gcHJpdmF0ZSBCb29sZWFuIHNvcnQgPSBudWxsOyAvLyAocGEpIG5vdCB1c2VkCi0JLyoqCi0JICogWE1MQ29udGVudEFzc2lzdFJlcXVlc3QgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ29udGVudEFzc2lzdFJlcXVlc3QoTm9kZSBub2RlLCBOb2RlIHBhcmVudCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgaW50IGJlZ2luLCBpbnQgbGVuZ3RoLCBTdHJpbmcgZmlsdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldE5vZGUobm9kZSk7Ci0JCXNldFBhcmVudChwYXJlbnQpOwotCQlzZXREb2N1bWVudFJlZ2lvbihkb2N1bWVudFJlZ2lvbik7Ci0JCXNldFJlZ2lvbihjb21wbGV0aW9uUmVnaW9uKTsKLQkJc2V0TWF0Y2hTdHJpbmcoZmlsdGVyKTsKLQkJc2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKGJlZ2luKTsKLQkJc2V0UmVwbGFjZW1lbnRMZW5ndGgobGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNYWNybyhJQ29tcGxldGlvblByb3Bvc2FsIG5ld1Byb3Bvc2FsKSB7Ci0JCW1hY3Jvcy5hZGQobmV3UHJvcG9zYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFByb3Bvc2FsKElDb21wbGV0aW9uUHJvcG9zYWwgbmV3UHJvcG9zYWwpIHsKLQkJcHJvcG9zYWxzLmFkZChuZXdQcm9wb3NhbCk7Ci0JfQotCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxzKCkgewotCQlJQ29tcGxldGlvblByb3Bvc2FsIHJlc3VsdHNbXSA9IG51bGw7Ci0JCWlmICgoZ2V0UHJvcG9zYWxzKCkuc2l6ZSgpID4gMCkgfHwgKGdldE1hY3JvcygpLnNpemUoKSA+IDApKSB7Ci0JCQlMaXN0IGFsbFByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmICghc2hvdWxkU2VwYXJhdGUoKSkgewotCQkJCWFsbFByb3Bvc2Fscy5hZGRBbGwoZ2V0UHJvcG9zYWxzKCkpOwotCQkJCS8vIHNob3VsZCBiZSBlbXB0eSwgYXMgYWxsIG1hY3JvcyBzaG91bGQgaGF2ZSBnb25lIGludG8gdGhlCi0JCQkJLy8gcHJvcG9zYWwgbGlzdAotCQkJCWFsbFByb3Bvc2Fscy5hZGRBbGwoZ2V0TWFjcm9zKCkpOwotCQkJCWFsbFByb3Bvc2FscyA9IHNvcnRQcm9wb3NhbHMoYWxsUHJvcG9zYWxzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFsbFByb3Bvc2Fscy5hZGRBbGwoc29ydFByb3Bvc2FscyhnZXRQcm9wb3NhbHMoKSkpOwotCQkJCWFsbFByb3Bvc2Fscy5hZGRBbGwoc29ydFByb3Bvc2FscyhnZXRNYWNyb3MoKSkpOwotCQkJfQotCi0JCQlyZXN1bHRzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbYWxsUHJvcG9zYWxzLnNpemUoKV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFByb3Bvc2Fscy5zaXplKCk7IGkrKykgewotCQkJCXJlc3VsdHNbaV0gPSAoSUNvbXBsZXRpb25Qcm9wb3NhbCkgYWxsUHJvcG9zYWxzLmdldChpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZG9jdW1lbnRSZWdpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRNYWNyb3MoKSB7Ci0JCXJldHVybiBtYWNyb3M7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TWF0Y2hTdHJpbmcoKSB7Ci0JCXJldHVybiBtYXRjaFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uTm9kZSBnZXROb2RlKCkgewotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRQcm9wb3NhbHMoKSB7Ci0JCXJldHVybiBwcm9wb3NhbHM7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFJlZ2lvbigpIHsKLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgewotCQlyZXR1cm4gcmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRSZXBsYWNlbWVudExlbmd0aCgpIHsKLQkJcmV0dXJuIHJlcGxhY2VtZW50TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCWlmICgoZ2V0RG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSAmJiAoZ2V0UmVnaW9uKCkgIT0gbnVsbCkpIHsKLQkJCXJldHVybiAoKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgZ2V0RG9jdW1lbnRSZWdpb24oKSkuZ2V0U3RhcnRPZmZzZXQoZ2V0UmVnaW9uKCkpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCWlmICgoZ2V0RG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSAmJiAoZ2V0UmVnaW9uKCkgIT0gbnVsbCkpIHsKLQkJCXJldHVybiAoKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgZ2V0RG9jdW1lbnRSZWdpb24oKSkuZ2V0VGV4dChnZXRSZWdpb24oKSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KCkgewotCQlpZiAoKGdldERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgJiYgKGdldFJlZ2lvbigpICE9IG51bGwpKSB7Ci0JCQlyZXR1cm4gKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIGdldERvY3VtZW50UmVnaW9uKCkpLmdldFRleHRFbmRPZmZzZXQoZ2V0UmVnaW9uKCkpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJZG9jdW1lbnRSZWdpb24gPSByZWdpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld01hdGNoU3RyaW5nCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWF0Y2hTdHJpbmcoamF2YS5sYW5nLlN0cmluZyBuZXdNYXRjaFN0cmluZykgewotCQltYXRjaFN0cmluZyA9IG5ld01hdGNoU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZShvcmcudzNjLmRvbS5Ob2RlIG5ld05vZGUpIHsKLQkJbm9kZSA9IG5ld05vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1BhcmVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChvcmcudzNjLmRvbS5Ob2RlIG5ld1BhcmVudCkgewotCQlwYXJlbnQgPSBuZXdQYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1JlZ2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ2lvbihJVGV4dFJlZ2lvbiBuZXdSZWdpb24pIHsKLQkJcmVnaW9uID0gbmV3UmVnaW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24KLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbihpbnQgbmV3UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKSB7Ci0JCXJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbiA9IG5ld1JlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbjsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFJlcGxhY2VtZW50TGVuZ3RoKGludCBuZXdSZXBsYWNlbWVudExlbmd0aCkgewotCQlyZXBsYWNlbWVudExlbmd0aCA9IG5ld1JlcGxhY2VtZW50TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFNlcGFyYXRlKCkgewotCQkvKgotCQkgKiBpZiAoc2VwYXJhdGUgPT0gbnVsbCkgeyBQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyID0KLQkJICogZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKTsgaWYobWFuYWdlciA9PSBudWxsKSB7IHNlcGFyYXRlID0KLQkJICogQm9vbGVhbi5GQUxTRTsgfSBlbHNlIHsgRWxlbWVudCBjYVNldHRpbmdzID0KLQkJICogbWFuYWdlci5nZXRFbGVtZW50KFByZWZlcmVuY2VOYW1lcy5DT05URU5UX0FTU0lTVCk7IHNlcGFyYXRlID0gbmV3Ci0JCSAqIEJvb2xlYW4oY2FTZXR0aW5ncy5nZXRBdHRyaWJ1dGUoUHJlZmVyZW5jZU5hbWVzLlNFUEFSQVRFKS5lcXVhbHMoUHJlZmVyZW5jZU5hbWVzLlRSVUUpKTsgfSB9Ci0JCSAqIHJldHVybiBzZXBhcmF0ZS5ib29sZWFuVmFsdWUoKTsKLQkJICovCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBzb3J0UHJvcG9zYWxzKExpc3QgcHJvcG9zYWxzSW4pIHsKLQkJQ29sbGVjdGlvbnMuc29ydChwcm9wb3NhbHNJbiwgbmV3IFByb3Bvc2FsQ29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIHByb3Bvc2Fsc0luOwotCi0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiTm9kZTogIiArIGdldE5vZGUoKSAvLyROT04tTkxTLTEkCi0JCQkJCSsgIlxuUGFyZW50OiAiICsgZ2V0UGFyZW50KCkgLy8kTk9OLU5MUy0xJAotCQkJCQkrICJcblN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjogIiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXREb2N1bWVudFJlZ2lvbigpLnRvU3RyaW5nKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiXG5SZWdpb246ICIgKyBnZXRSZWdpb24oKSAvLyROT04tTkxTLTEkCi0JCQkJCSsgIlxuTWF0Y2ggc3RyaW5nOiAnIiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRNYXRjaFN0cmluZygpKSArICInIiAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkrICJcbk9mZnNldHM6IFsiICsgZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgKyAiLSIgKyAoZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgKyBnZXRSZXBsYWNlbWVudExlbmd0aCgpKSArICJdXG4iOyAvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRleHRJbmZvTW9kZWxVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db250ZXh0SW5mb01vZGVsVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGMxYzgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRleHRJbmZvTW9kZWxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgQ29udGV4dEluZm9Nb2RlbFV0aWwgewotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQotCUNvbnRleHRJbmZvTW9kZWxVdGlsKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jKSB7Ci0JCWZEb2N1bWVudCA9IGRvYzsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgTW9kZWxRdWVyeSBnZXRNb2RlbFF1ZXJ5KCkgewotCQlNb2RlbFF1ZXJ5IG1xID0gbnVsbDsKLQotCQlJU3RydWN0dXJlZE1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhtbE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJCW1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSh4bWxNb2RlbCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtcTsKLQl9Ci0KLQlwdWJsaWMgSURPTU5vZGUgZ2V0WE1MTm9kZShpbnQgb2Zmc2V0KSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQlJRE9NTm9kZSB4bWxOb2RlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhtbE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTm9kZSA9IChJRE9NTm9kZSkgeG1sTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIHhtbE5vZGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTlkZDkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbDsKLQotLyoqCi0gKiBQdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gbWFrZSB0aGUgYWRkaXRpb25hbCBwcm9wb3NhbCBpbmZvIGludG8gY29udGVudAotICogZml0IGZvciBhbiBIVE1MIHZpZXdlciAoYnkgZXNjYXBpbmcgY2hhcmFjdGVycykKLSAqLwotY2xhc3MgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbCBleHRlbmRzIFRlbXBsYXRlUHJvcG9zYWwgaW1wbGVtZW50cyBJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Ci0KLQlwdWJsaWMgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbChUZW1wbGF0ZSB0ZW1wbGF0ZSwgVGVtcGxhdGVDb250ZXh0IGNvbnRleHQsIElSZWdpb24gcmVnaW9uLCBJbWFnZSBpbWFnZSwgaW50IHJlbGV2YW5jZSkgewotCQlzdXBlcih0ZW1wbGF0ZSwgY29udGV4dCwgcmVnaW9uLCBpbWFnZSwgcmVsZXZhbmNlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCVN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IHN1cGVyLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJcmV0dXJuIFN0cmluZ1V0aWxzLmNvbnZlcnRUb0hUTUxDb250ZW50KGFkZGl0aW9uYWxJbmZvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9EZWZhdWx0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0RlZmF1bHRYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjQwMjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0RlZmF1bHRYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiA8cD5EZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgQWJzdHJhY3RYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcn0sIGRlZmF1bHRzIGFyZSB0byBkbyBub3RoaW5nPC9wPgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIGV4dGVuZHMKLQkJQWJzdHJhY3RYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGRvIHRvIG5vdGhpbmcuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI3Nlc3Npb25FbmRlZCgpCi0JICovCi0JcHVibGljIHZvaWQgc2Vzc2lvbkVuZGVkKCkgewotCQkvL2RlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgYmVoYXZpb3IgaXMgZG8gdG8gbm90aGluZy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjc2Vzc2lvblN0YXJ0ZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlc3Npb25TdGFydGVkKCkgewotCQkvL2RlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZG8gbm90aGluZwotCX0KLQkKLQkvKioKLQkgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGRvIHRvIG5vdGhpbmcuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoCi0JCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJLy9kZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGRvIHRvIG5vdGhpbmcuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3QsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscygKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkvL2RlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgYmVoYXZpb3IgaXMgZG8gdG8gbm90aGluZy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2FkZENvbW1lbnRQcm9wb3NhbChvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3QsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb21tZW50UHJvcG9zYWwoCi0JCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJLy9kZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGRvIHRvIG5vdGhpbmcuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNhZGREb2NUeXBlUHJvcG9zYWwob3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRG9jVHlwZVByb3Bvc2FsKAotCQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vZGVmYXVsdCBiZWhhdmlvciBpcyB0byBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBiZWhhdmlvciBpcyBkbyB0byBub3RoaW5nLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjYWRkRW1wdHlEb2N1bWVudFByb3Bvc2FscyhvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3QsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKAotCQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vZGVmYXVsdCBiZWhhdmlvciBpcyB0byBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBiZWhhdmlvciBpcyBkbyB0byBub3RoaW5nLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjYWRkRW5kVGFnTmFtZVByb3Bvc2FscyhvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3QsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRUYWdOYW1lUHJvcG9zYWxzKAotCQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQlDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vZGVmYXVsdCBiZWhhdmlvciBpcyB0byBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBiZWhhdmlvciBpcyBkbyB0byBub3RoaW5nLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjYWRkRW5kVGFnUHJvcG9zYWxzKG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVuZFRhZ1Byb3Bvc2FscygKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkvL2RlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgYmVoYXZpb3IgaXMgZG8gdG8gbm90aGluZy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2FkZEVudGl0eVByb3Bvc2FscyhvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3QsIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGUsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbnRpdHlQcm9wb3NhbHMoCi0JCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwKLQkJCUlUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlLAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkvL2RlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgYmVoYXZpb3IgaXMgZG8gdG8gbm90aGluZy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2FkZEVudGl0eVByb3Bvc2FscyhqYXZhLnV0aWwuVmVjdG9yLCBqYXZhLnV0aWwuUHJvcGVydGllcywgamF2YS5sYW5nLlN0cmluZywgaW50LCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbiwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVudGl0eVByb3Bvc2FscyhWZWN0b3IgcHJvcG9zYWxzLCBQcm9wZXJ0aWVzIG1hcCwKLQkJCVN0cmluZyBrZXksIGludCBub2RlT2Zmc2V0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLAotCQkJSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJLy9kZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGRvIHRvIG5vdGhpbmcuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNhZGRQQ0RBVEFQcm9wb3NhbChqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3QsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQQ0RBVEFQcm9wb3NhbChTdHJpbmcgbm9kZU5hbWUsCi0JCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJLy9kZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGRvIHRvIG5vdGhpbmcuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNhZGRTdGFydERvY3VtZW50UHJvcG9zYWxzKG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoCi0JCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJLy9kZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGRvIHRvIG5vdGhpbmcuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNhZGRUYWdDbG9zZVByb3Bvc2FscyhvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3QsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdDbG9zZVByb3Bvc2FscygKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkvL2RlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgYmVoYXZpb3IgaXMgZG8gdG8gbm90aGluZy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2FkZFRhZ0luc2VydGlvblByb3Bvc2FscyhvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3QsIGludCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ0luc2VydGlvblByb3Bvc2FscygKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgY2hpbGRQb3NpdGlvbiwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJLy9kZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGRvIHRvIG5vdGhpbmcuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNhZGRUYWdOYW1lUHJvcG9zYWxzKG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdCwgaW50LCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnTmFtZVByb3Bvc2FscygKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgY2hpbGRQb3NpdGlvbiwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJLy9kZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzEzYTIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci0KLQotLyoqCi0gKiBDb250ZW50QXNzaXN0UHJvY2Vzc29yIHRvIGhhbmRsZSBzcGVjaWFsIGNhc2VzIGluIGNvbnRlbnQgYXNzaXN0IHdoZXJlIHRoZQotICogcGFydGl0aW9uZXIgY2Fubm90IGRldGVybWluZSBhIHBhcnRpdGlvbiB0eXBlIGF0IHRoZSBjdXJyZW50IGN1cnNvcgotICogcG9zaXRpb24gKHVzdWFsbHkgYXQgRU9GKS4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqIEBkZXByZWNhdGVkIFRoaXMgY2xhc3MgaXMgbm8gbG9uZ2VyIHVzZWQgbG9jYWxseSBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUKLSAqLwotcHVibGljIGNsYXNzIE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElDb250ZW50QXNzaXN0UHJvY2Vzc29yLCBJUmVsZWFzYWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGNoYXIgY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzW10gPSBudWxsOwotCXByb3RlY3RlZCBjaGFyIGNvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyc1tdID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIEVNUFRZX1BST1BPU0FMX1NFVCA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCXByb3RlY3RlZCBTdHJpbmcgZkVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZOYW1lVG9Qcm9jZXNzb3JNYXAgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAgPSBudWxsOwotCi0JcHVibGljIE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoU3RyaW5nIGtleSwgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0JCWFkZFByb2Nlc3NvcihnZXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpLCBrZXksIHByb2Nlc3Nvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZVByb2Nlc3NvcihTdHJpbmcga2V5LCBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IpIHsKLQkJYWRkUHJvY2Vzc29yKGdldE5hbWVUb1Byb2Nlc3Nvck1hcCgpLCBrZXksIHByb2Nlc3Nvcik7Ci0JfQotCi0JcHJvdGVjdGVkIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldFBhcnRpdGlvblByb2Nlc3NvcihTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGdldFBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCkuZ2V0KGtleSk7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlcyByZWxlYXNlIGlmIGl0J3MgYSBkdXBsaWNhdGUgcGFydGl0aW9uIHR5cGUuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcGFyYW0gcHJvY2Vzc29yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFByb2Nlc3NvcihIYXNoTWFwIG1hcCwgU3RyaW5nIGtleSwgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0JCU9iamVjdCBvID0gbWFwLnJlbW92ZShrZXkpOwotCQlpZiAobyAhPSBudWxsKSB7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElSZWxlYXNhYmxlKSB7Ci0JCQkJKChJUmVsZWFzYWJsZSkgbykucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JCW1hcC5wdXQoa2V5LCBwcm9jZXNzb3IpOwotCX0KLQotCS8qKgotCSAqIEZpZ3VyZXMgb3V0IHdoYXQgdGhlIGNvcnJlY3QgSUNvbXBsZXRpb25Qcm9wb3NhbFByb2Nlc3NvciBpcyBhbmQKLQkgKiBjb21wdXRlc0NvbXBsZXRpb25Qcm9wb3NhbHMgb24gdGhhdC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IG51bGw7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXN1bHRzID0gRU1QVFlfUFJPUE9TQUxfU0VUOwotCi0JCXAgPSBndWVzc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3Iodmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCXJlc3VsdHMgPSBwLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRPZmZzZXQpOwotCQl9Ci0KLQkJcmV0dXJuIChyZXN1bHRzICE9IG51bGwpID8gcmVzdWx0cyA6IEVNUFRZX1BST1BPU0FMX1NFVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCS8vIGdldCBjb250ZXh0IGluZm8gZnJvbSBwcm9jZXNzb3IgdGhhdCB3ZSBlbmQgdXAgdXNpbmcuLi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIGNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKQotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gY29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQkvLyByZXR1cm4gdGhlIHZhbGlkYXRvciBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvciB0aGF0IHdlCi0JCS8vIHVzZWQuLi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0RXJyb3JNZXNzYWdlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGZFcnJvck1lc3NhZ2U7Ci0JfQotCQotCXByaXZhdGUgSGFzaE1hcCBnZXROYW1lVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCWlmIChmTmFtZVRvUHJvY2Vzc29yTWFwID09IG51bGwpIHsKLQkJCWZOYW1lVG9Qcm9jZXNzb3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJaW5pdE5hbWVUb1Byb2Nlc3Nvck1hcCgpOwotCQl9Ci0JCXJldHVybiBmTmFtZVRvUHJvY2Vzc29yTWFwOwotCX0KLQkKLQlwcml2YXRlIEhhc2hNYXAgZ2V0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCWlmIChmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAgPT0gbnVsbCkgewotCQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWluaXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpOwotCQl9Ci0JCXJldHVybiBmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXA7Ci0JfQotCi0JLyoqCi0JICogR2l2ZXMgeW91IHRoZSBkb2N1bWVudCBwYXJ0aXRpb24gdHlwZSAoU3RyaW5nKSBmb3IgdGhlIGdpdmVuCi0JICogU3RydWN0dXJlZFRleHRWaWV3ZXIgYW5kIGRvY3VtZW50UG9zaXRpb24uCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJU3RyaW5nIHBhcnRpdGlvblR5cGUgPSBudWxsOwotCQlJVHlwZWRSZWdpb24gcGFydGl0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhcnRpdGlvbiA9IGRvY3VtZW50LmdldFBhcnRpdGlvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJCXBhcnRpdGlvblR5cGUgPSBwYXJ0aXRpb24uZ2V0VHlwZSgpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlwYXJ0aXRpb25UeXBlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcGFydGl0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHdWVzc2VzIGEgQ29udGVudEFzc2lzdFByb2Nlc3NvciBiYXNlZCBvbiB0aGUgVGV4dFZpZXdlciBhbmQKLQkgKiBkb2N1bWVudE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50T2Zmc2V0Ci0JICovCi0JcHJvdGVjdGVkIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGd1ZXNzQ29udGVudEFzc2lzdFByb2Nlc3NvcihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQkvLyBtYXBwaW5nIGxvZ2ljIGhlcmUuLi4KLQkJLy8gbG9vayBAIHByZXZpb3VzIHJlZ2lvbgotCQkvLyBsb29rIEAgcHJldmlvdXMgZG9jIHBhcnRpdGlvbiB0eXBlCi0JCS8vIGxvb2sgQCBwYWdlIGxhbmd1YWdlCi0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gQ29udGVudEFzc2lzdFV0aWxzLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQkJaWYgKHNkUmVnaW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyBjdXJyZW50UmVnaW9uVHlwZSA9IHNkUmVnaW9uLmdldFR5cGUoKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY3VycmVudCByZWdpb24gdHlwZSBpcyA+PiAiICsKLQkJCS8vIGN1cnJlbnRSZWdpb25UeXBlKTsKLQkJCWlmIChjdXJyZW50UmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RQcmV2ID0gc2RSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCQlpZiAoc2RQcmV2ICE9IG51bGwpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTdHJpbmcgcHJldlJlZ2lvblR5cGUgPSBzZFByZXYuZ2V0VHlwZSgpOwotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJwcmV2aW91cyByZWdpb24gdHlwZSBpcyA+PiAiICsgcHJldlJlZ2lvblR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gd29ya2luZyB3LyB2aWV3ZXIgJiBkb2N1bWVudCBwYXJ0aXRpb24KLQkJaWYgKChwID09IG51bGwpICYmICh2aWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKSA+IDApKSB7Ci0JCQlTdHJpbmcgcHJldlBhcnRpdGlvblR5cGUgPSBnZXRQYXJ0aXRpb25UeXBlKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyLCBkb2N1bWVudE9mZnNldCAtIDEpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJwcmV2aW91cyBwYXJ0aXRpb24gdHlwZSBpcyA+ICIgKwotCQkJLy8gcHJldlBhcnRpdGlvblR5cGUpOwotCQkJcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgZ2V0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKS5nZXQocHJldlBhcnRpdGlvblR5cGUpOwotCQl9Ci0JCXJldHVybiBwOwotCX0KLQotCS8qKgotCSAqIEluaXRzIG1hcCBmb3IgZXh0cmEgQ29udGVudEFzc2lzdFByb2Nlc3NvcnMgKHVzZUJlYW4sIGdldC9zZXRQcm9wZXJ0eSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0TmFtZVRvUHJvY2Vzc29yTWFwKCkgewotCQkvLyBub3RoaW5nIHRvIGRvIGluIHRoaXMgY2FzZQotCX0KLQotCS8qKgotCSAqIEFkZHMgYWxsIHJlbGV2ZW50IENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzIHRvIHRoZSBwYXJ0aXRpb24gdG8gcHJvY2Vzc29yCi0JICogbWFwIChqdXN0IFhNTCBoZXJlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpIHsKLQkJWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvciB4bWxQcm9jZXNzb3IgPSBuZXcgWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlhZGRQcm9jZXNzb3IoZ2V0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKSwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQsIHhtbFByb2Nlc3Nvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJcmVsZWFzZVBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCk7Ci0JCXJlbGVhc2VOYW1lVG9Qcm9jZXNzb3JNYXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlTWFwKEhhc2hNYXAgbWFwKSB7Ci0JCWlmICgobWFwICE9IG51bGwpICYmICFtYXAuaXNFbXB0eSgpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJT2JqZWN0IGtleSA9IG51bGw7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJa2V5ID0gaXQubmV4dCgpOwotCQkJCWlmIChtYXAuZ2V0KGtleSkgaW5zdGFuY2VvZiBJUmVsZWFzYWJsZSkgewotCQkJCQkoKElSZWxlYXNhYmxlKSBtYXAuZ2V0KGtleSkpLnJlbGVhc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQltYXAuY2xlYXIoKTsKLQkJCW1hcCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlTmFtZVRvUHJvY2Vzc29yTWFwKCkgewotCQlyZWxlYXNlTWFwKGZOYW1lVG9Qcm9jZXNzb3JNYXApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpIHsKLQkJcmVsZWFzZU1hcChmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob25WYWxpZGF0aW5nTW9kZWxRdWVyeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGEzOTdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIE5vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBY3Rpb24gewotCi0JcHJvdGVjdGVkIENNTm9kZSBjbW5vZGUgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZW5kSW5kZXggPSAwOwotCXByb3RlY3RlZCBpbnQga2luZCA9IElOU0VSVDsKLQlwcm90ZWN0ZWQgaW50IHN0YXJ0SW5kZXggPSAwOwotCXByb3RlY3RlZCBPYmplY3QgdXNlckRhdGEgPSBudWxsOwotCi0JLyoqCi0JICogTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb24oQ01Ob2RlIG5ld0NoaWxkLCBpbnQgbmV3S2luZCwgaW50IG5ld1N0YXJ0LCBpbnQgbmV3RW5kLCBPYmplY3QgbmV3VXNlckRhdGEpIHsKLQkJc3VwZXIoKTsKLQkJY21ub2RlID0gbmV3Q2hpbGQ7Ci0JCWtpbmQgPSBuZXdLaW5kOwotCQlzdGFydEluZGV4ID0gbmV3U3RhcnQ7Ci0JCWVuZEluZGV4ID0gbmV3RW5kOwotCQl1c2VyRGF0YSA9IG5ld1VzZXJEYXRhOwotCX0KLQotCS8qKgotCSAqIGdldENNTm9kZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUgZ2V0Q01Ob2RlKCkgewotCQlyZXR1cm4gY21ub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFbmRJbmRleCgpIHsKLQkJcmV0dXJuIGVuZEluZGV4OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQYXJlbnQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLk5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRJbmRleCgpIHsKLQkJcmV0dXJuIHN0YXJ0SW5kZXg7Ci0JfQotCi0JLyoqCi0JICogZ2V0VXNlckRhdGEgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRVc2VyRGF0YSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcGVyZm9ybUFjdGlvbiBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIHNldENNTm9kZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDTU5vZGUob3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUgbmV3Tm9kZSkgewotCQljbW5vZGUgPSBuZXdOb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdFbmRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5kSW5kZXgoaW50IG5ld0VuZEluZGV4KSB7Ci0JCWVuZEluZGV4ID0gbmV3RW5kSW5kZXg7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0tpbmQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEtpbmQoaW50IG5ld0tpbmQpIHsKLQkJa2luZCA9IG5ld0tpbmQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1N0YXJ0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFN0YXJ0SW5kZXgoaW50IG5ld1N0YXJ0SW5kZXgpIHsKLQkJc3RhcnRJbmRleCA9IG5ld1N0YXJ0SW5kZXg7Ci0JfQotCi0JLyoqCi0JICogc2V0VXNlckRhdGEgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlckRhdGEoT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBhY3Rpb25OYW1lID0gbnVsbDsKLQkJc3dpdGNoIChraW5kKSB7Ci0JCQljYXNlIElOU0VSVCA6Ci0JCQkJYWN0aW9uTmFtZSA9ICJJTlNFUlQiOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVNT1ZFIDoKLQkJCQlhY3Rpb25OYW1lID0gIlJFTU9WRSI7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBSRVBMQUNFIDoKLQkJCQlhY3Rpb25OYW1lID0gIlJFUExBQ0UiOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWFjdGlvbk5hbWUgPSAiVU5LTk9XTiBBQ1RJT04gIjsvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nIG5vZGVOYW1lID0gKGNtbm9kZSAhPSBudWxsKSA/IGdldENNTm9kZSgpLmdldE5vZGVOYW1lKCkgOiAiKHVua25vd24pIjsvLyROT04tTkxTLTEkCi0JCXJldHVybiBhY3Rpb25OYW1lICsgIj0iICsgbm9kZU5hbWUgKyAiKCIgKyBzdGFydEluZGV4ICsgIi4uLiIgKyBlbmRJbmRleCArICIpIjsvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUHJvcG9zYWxDb21wYXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Qcm9wb3NhbENvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2ZThlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Qcm9wb3NhbENvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbDsKLQotCi1wdWJsaWMgY2xhc3MgUHJvcG9zYWxDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLQotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQlpbnQgcmVsZXZhbmNlID0gMDsKLQkJaWYgKChvMSBpbnN0YW5jZW9mIElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwpICYmIChvMiBpbnN0YW5jZW9mIElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwpKSB7Ci0JCQkvLyBzb3J0IGJhc2VkIG9uIHJlbGV2YW5jZQotCQkJSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCBjcDEgPSAoSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCkgbzE7Ci0JCQlJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsIGNwMiA9IChJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsKSBvMjsKLQotCQkJcmVsZXZhbmNlID0gY3AyLmdldFJlbGV2YW5jZSgpIC0gY3AxLmdldFJlbGV2YW5jZSgpOwotCi0JCQkvLyBpZiBzYW1lIHJlbGV2YW5jZSwgc2Vjb25kYXJ5IHNvcnQgKGxleGlncmFwaGljYWxseSkKLQkJCWlmICgocmVsZXZhbmNlID09IDApICYmIChvMSBpbnN0YW5jZW9mIElDb21wbGV0aW9uUHJvcG9zYWwpICYmIChvMiBpbnN0YW5jZW9mIElDb21wbGV0aW9uUHJvcG9zYWwpKSB7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcxID0gKChJQ29tcGxldGlvblByb3Bvc2FsKSBvMSkuZ2V0RGlzcGxheVN0cmluZygpOwotCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMiA9ICgoSUNvbXBsZXRpb25Qcm9wb3NhbCkgbzIpLmdldERpc3BsYXlTdHJpbmcoKTsKLQkJCQlpZiAoKGRpc3BsYXlTdHJpbmcxICE9IG51bGwpICYmIChkaXNwbGF5U3RyaW5nMiAhPSBudWxsKSkgewotCQkJCQkvLyByZWxldmFuY2UgPSBkaXNwbGF5U3RyaW5nMS5jb21wYXJlVG8oZGlzcGxheVN0cmluZzIpOwotCQkJCQkvLyAvLyB0aGlzIGRpZG4ndCBtaXggY2FwcyB3LyBsb3dlcmNhc2UKLQkJCQkJcmVsZXZhbmNlID0gY29tLmlibS5pY3UudGV4dC5Db2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZGlzcGxheVN0cmluZzEsIGRpc3BsYXlTdHJpbmcyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gb3RoZXJ3aXNlIGlmIGl0J3Mgbm90IElTRURSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwsIGRvbid0IHNvcnQKLQkJcmV0dXJuIHJlbGV2YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9SZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVmYjhhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9SZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkRvY3VtZW50VGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVWYXJpYWJsZTsKLQotLyoqCi0gKiBKdXN0IGxpa2UgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQgZXhjZXB0IGlmIGFuIGluc2VydCBvZmZzZXQgaXMgcGFzc2VkIGluLAotICogZHVyaW5nIGV2YWx1YXRpb24sIHRoZSAicHJlZml4IiBiZWZvcmUgdGhlIHRlbXBsYXRlIHdpbGwgYmUgY2hlY2tlZCB0byBzZWUKLSAqIGlmIGl0IG1hdGNoZXMgdGhlIHRlbXBsYXRlIG5hbWUuIElmIHNvLCBvdmVyd3JpdGUgdGhlIHRlbXBsYXRlIG5hbWUuCi0gKiBPdGhlcndpc2UsIGp1c3QgaW5zZXJ0IHRoZSB0ZW1wbGF0ZSBhdCB0aGUgaW5zZXJ0IG9mZnNldCBsb2NhdGlvbiAoYnkgbm90Ci0gKiBvdmVyd3JpdGluZyB0aGUgcHJlZml4IHRleHQpCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dCBleHRlbmRzIERvY3VtZW50VGVtcGxhdGVDb250ZXh0IHsKLQlwcml2YXRlIGludCBmSW5zZXJ0T2Zmc2V0ID0gLTE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZG9jdW1lbnQgdGVtcGxhdGUgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdHlwZQotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRoaXMgY29udGV4dCBhcHBsaWVzIHRvCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICovCi0JcHVibGljIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0KFRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSwgSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXModHlwZSwgZG9jdW1lbnQsIG5ldyBQb3NpdGlvbihvZmZzZXQsIGxlbmd0aCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb2N1bWVudCB0ZW1wbGF0ZSBjb250ZXh0LiBUaGUgc3VwcGxpZWQgPGNvZGU+UG9zaXRpb248L2NvZGU+Ci0JICogd2lsbCBiZSBxdWVyaWVkIHRvIGNvbXB1dGUgdGhlIDxjb2RlPmdldFN0YXJ0PC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5nZXRFbmQ8L2NvZGU+IG1ldGhvZHMsIHdoaWNoIHdpbGwgdGhlcmVmb3JlIGFuc3dlciB1cGRhdGVkCi0JICogcG9zaXRpb24gZGF0YSBpZiBpdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0eXBlCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdGhpcyBjb250ZXh0IGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBkZXNjcmliaW5nIHRoZSBhcmVhIG9mIHRoZSBkb2N1bWVudCB3aGljaCBmb3JtcwotCSAqICAgICAgICAgICAgdGhlIHRlbXBsYXRlIGNvbnRleHQKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0KFRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSwgSURvY3VtZW50IGRvY3VtZW50LCBQb3NpdGlvbiBwb3NpdGlvbikgewotCQlzdXBlcih0eXBlLCBkb2N1bWVudCwgcG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb2N1bWVudCB0ZW1wbGF0ZSBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0eXBlCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdGhpcyBjb250ZXh0IGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKiBAcGFyYW0gaW5zZXJ0T2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkb2N1bWVudCByZWdpb24gd2hlcmUgaW5zZXJ0IHdhcwotCSAqICAgICAgICAgICAgb3JpZ2luYWxseSByZXF1ZXN0ZWQKLQkgKi8KLQlwdWJsaWMgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlLCBJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBpbnNlcnRPZmZzZXQpIHsKLQkJdGhpcyh0eXBlLCBkb2N1bWVudCwgbmV3IFBvc2l0aW9uKG9mZnNldCwgbGVuZ3RoKSk7Ci0JCWZJbnNlcnRPZmZzZXQgPSBpbnNlcnRPZmZzZXQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dCNldmFsdWF0ZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZSkKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGVCdWZmZXIgZXZhbHVhdGUoVGVtcGxhdGUgdGVtcGxhdGUpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgVGVtcGxhdGVFeGNlcHRpb24gewotCQlUZW1wbGF0ZUJ1ZmZlciBidWZmZXIgPSBzdXBlci5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJaWYgKChmSW5zZXJ0T2Zmc2V0ID4gLTEpICYmIChmSW5zZXJ0T2Zmc2V0ID4gZ2V0U3RhcnQoKSkpIHsKLQkJCQlTdHJpbmcgcHJlZml4ID0gZ2V0RG9jdW1lbnQoKS5nZXQoZ2V0U3RhcnQoKSwgZkluc2VydE9mZnNldCAtIGdldFN0YXJ0KCkpOwotCQkJCWlmICghdGVtcGxhdGUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgocHJlZml4KSkgewotCQkJCQkvLyBnZW5lcmF0ZSBhIG5ldyBidWZmZXIgdGhhdCBhY3R1YWxseSBjb250YWlucyB0aGUKLQkJCQkJLy8gdGV4dCB0aGF0IHdhcyBnb2luZyB0byBiZSBvdmVyd3JpdHRlbgotCQkJCQlpbnQgcHJlZml4U2l6ZSA9IHByZWZpeC5sZW5ndGgoKTsKLQkJCQkJVGVtcGxhdGVWYXJpYWJsZVtdIG5ld1RlbXBsYXRlVmFyID0gYnVmZmVyLmdldFZhcmlhYmxlcygpOwotCQkJCQlmb3IgKGludCBpID0wOyBpIDwgbmV3VGVtcGxhdGVWYXIubGVuZ3RoOyBpKysgKXsKLQkJCQkJCWludFtdIG9mZnNldHMgPSBuZXdUZW1wbGF0ZVZhcltpXS5nZXRPZmZzZXRzKCk7Ci0JCQkJCQlmb3IgKGludCBqPTA7IGo8b2Zmc2V0cy5sZW5ndGggO2orKyl7Ci0JCQkJCQkJb2Zmc2V0c1tqXSArPSBwcmVmaXhTaXplOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJ1ZmZlciA9IG5ldyBUZW1wbGF0ZUJ1ZmZlcihwcmVmaXggKyBidWZmZXIuZ2V0U3RyaW5nKCksIG5ld1RlbXBsYXRlVmFyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9TaW1wbGVDTUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvU2ltcGxlQ01FbGVtZW50RGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhNjA3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9TaW1wbGVDTUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ01FbGVtZW50RGVjbGFyYXRpb24gaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uIHsKLQotCVN0cmluZyBmTm9kZU5hbWU7Ci0KLQkvKioKLQkgKiBTaW1wbGVDTUVMZW1lbnREZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTaW1wbGVDTUVsZW1lbnREZWNsYXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlQ01FbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldE5vZGVOYW1lKG5vZGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyaWJ1dGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKiAKLQkgKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEF0dHJpYnV0ZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q01Db250ZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01Db250ZW50Ci0JICogCi0JICogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoaXMgZWxlbWVudCdzIGNvbnRlbnQgbW9kZWwuIFRoaXMgY2FuIGJlIGFuCi0JICogQ01FbGVtZW50RGVjbGFyYXRpb24gb3IgYSBDTUdyb3VwCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldENvbnRlbnRUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogCi0JICogUmV0dXJucyBvbmUgb2YgOiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlIGdldERhdGFUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbGVtZW50TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMb2NhbEVsZW1lbnRzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKiAKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBsb2NhbGx5IGRlZmluZWQgZWxlbWVudHMuCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWF4T2NjdXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiAKLQkgKiBJZiAtMSwgaXQncyBVTkJPVU5ERUQuCi0JICovCi0JcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWluT2NjdXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiAKLQkgKiBJZiAwLCBpdCdzIE9QVElPTkFMLiBJZiAxLCBpdCdzIFJFUVVJUkVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gZk5vZGVOYW1lOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIGdldFByb3BlcnR5IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqIAotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjaXBlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICogCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdOb2RlTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVOYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3Tm9kZU5hbWUpIHsKLQkJZk5vZGVOYW1lID0gbmV3Tm9kZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Tb3VyY2VFZGl0b3JJbWFnZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvU291cmNlRWRpdG9ySW1hZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxNjc3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Tb3VyY2VFZGl0b3JJbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIHVzZSBpbnRlcm5hbCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBvciBleHRlcm5hbAotICogICAgICAgICAgICAgU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgaW5zdGVhZAotICovCi1wdWJsaWMgY2xhc3MgU291cmNlRWRpdG9ySW1hZ2VIZWxwZXIgewotCi0JcHVibGljIFNvdXJjZUVkaXRvckltYWdlSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBjcmVhdGVJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oWE1MVUlQbHVnaW4uSUQsIHJlc291cmNlKTsKLQkJSW1hZ2UgaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCUpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKS5wdXQocmVzb3VyY2UsIGltYWdlKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGQ0NDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUw7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyBpcyBubyBsb25nZXIgdXNlZCBsb2NhbGx5IGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZQotICogQHNlZSBYTUxTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvcgotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGZQcmVmZXJlbmNlU3RvcmUgPSBudWxsOwotCXByb3RlY3RlZCBJUmVzb3VyY2UgZlJlc291cmNlID0gbnVsbDsKLQlwcml2YXRlIFhNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBmVGVtcGxhdGVQcm9jZXNzb3IgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmVGVtcGxhdGVDb250ZXh0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBYTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLkFUVFJJQlVURSk7Ci0JCXN1cGVyLmFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5BVFRSSUJVVEVfVkFMVUUpOwotCQlzdXBlci5hZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW1wdHlEb2N1bWVudFByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuTkVXKTsKLQkJc3VwZXIuYWRkRW1wdHlEb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgY2hpbGRQb3NpdGlvbikgewotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuVEFHKTsKLQkJc3VwZXIuYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjaGlsZFBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRlbXBsYXRlcyB0byB0aGUgbGlzdCBvZiBwcm9wb3NhbHMKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUZW1wbGF0ZXMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIFN0cmluZyBjb250ZXh0KSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY29udGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGVtcGxhdGVzIHRvIHRoZSBsaXN0IG9mIHByb3Bvc2FscwotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRlbXBsYXRlcyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgU3RyaW5nIGNvbnRleHQsIGludCBzdGFydE9mZnNldCkgewotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gaWYgYWxyZWFkeSBhZGRpbmcgdGVtcGxhdGUgcHJvcG9zYWxzIGZvciBhIGNlcnRhaW4gY29udGV4dCB0eXBlLCBkbwotCQkvLyBub3QgYWRkIGFnYWluCi0JCWlmICghZlRlbXBsYXRlQ29udGV4dHMuY29udGFpbnMoY29udGV4dCkpIHsKLQkJCWZUZW1wbGF0ZUNvbnRleHRzLmFkZChjb250ZXh0KTsKLQkJCWJvb2xlYW4gdXNlUHJvcG9zYWxMaXN0ID0gIWNvbnRlbnRBc3Npc3RSZXF1ZXN0LnNob3VsZFNlcGFyYXRlKCk7Ci0KLQkJCWlmIChnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKSAhPSBudWxsKSB7Ci0JCQkJZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuc2V0Q29udGV4dFR5cGUoY29udGV4dCk7Ci0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGZUZXh0Vmlld2VyLCBzdGFydE9mZnNldCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wb3NhbHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJaWYgKHVzZVByb3Bvc2FsTGlzdCkgewotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWxzW2ldKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZE1hY3JvKHByb3Bvc2Fsc1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgdHJlZU5vZGUsIElET01Ob2RlIHhtbG5vZGUpIHsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgcmVxdWVzdCA9IHN1cGVyLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCS8vIGJ1ZzExNTkyNyB1c2Ugb3JpZ2luYWwgZG9jdW1lbnQgcG9zaXRpb24gZm9yIGFsbC9hbnkgcmVnaW9uCi0JCS8vIHRlbXBsYXRlcwotCQlhZGRUZW1wbGF0ZXMocmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5BTEwsIGRvY3VtZW50UG9zaXRpb24pOwotCQlyZXR1cm4gcmVxdWVzdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuY29udGVudGFzc2lzdC5BYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCWZUZW1wbGF0ZUNvbnRleHRzLmNsZWFyKCk7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh0ZXh0Vmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCWlmIChmUHJlZmVyZW5jZVN0b3JlID09IG51bGwpIHsKLQkJCWZQcmVmZXJlbmNlU3RvcmUgPSBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCX0KLQkJcmV0dXJuIGZQcmVmZXJlbmNlU3RvcmU7Ci0JfQotCi0JcHJpdmF0ZSBYTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZlRlbXBsYXRlUHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVByb2Nlc3NvciA9IG5ldyBYTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlUHJvY2Vzc29yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXJlaW5pdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHByb3BlcnR5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQotCQlpZiAoKHByb3BlcnR5LmNvbXBhcmVUbyhYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UpID09IDApIHx8IChwcm9wZXJ0eS5jb21wYXJlVG8oWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREUpID09IDApKSB7Ci0JCQlyZWluaXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlaW5pdCgpIHsKLQkJU3RyaW5nIGtleSA9IFhNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRTsKLQkJYm9vbGVhbiBkb0F1dG8gPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKGtleSk7Ci0JCWlmIChkb0F1dG8pIHsKLQkJCWtleSA9IFhNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFOwotCQkJY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKGtleSkudG9DaGFyQXJyYXkoKTsKLQkJfQotCQllbHNlIHsKLQkJCWNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycyA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlzdXBlci5yZWxlYXNlKCk7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWE0YjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlNjcmlwdExhbmd1YWdlS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcyBleHRlbmRzIENvbnRlbnRBc3Npc3RVdGlscyB7Ci0KLQkvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DTE9TRSA9ICJKU1BfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfREVDTEFSQVRJT05fT1BFTiA9ICJKU1BfREVDTEFSQVRJT05fT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9TQ1JJUFRMRVRfT1BFTiA9ICJKU1BfU0NSSVBUTEVUX09QRU4iOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRVhQUkVTU0lPTl9PUEVOID0gIkpTUF9FWFBSRVNTSU9OX09QRU4iOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlQgPSAiQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1NDUklQVF9UWVBFID0gIkNvbnRlbnQtU2NyaXB0LVR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBRCA9ICJIRUFEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUwgPSAiSFRNTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0VRVUlWID0gIkhUVFAtRVFVSVYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQSA9ICJNRVRBIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgdGhlIGNsb3NpbmcgcHJvcG9zYWwgZ2l2ZW4gdGhlCi0JICogY29udGVudHMgKEluZGV4ZWRSZWdpb24pIG9mIGEgdGFnIHRoYXQgaXMgc3RhcnRlZCwgYnV0IHBvc3NpYmx5IG5vdAotCSAqIGVuZGVkCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHRleHQgdmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBjdXJzb3IgcG9zaXRpb24gaW4gdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBpbmRleGVkTm9kZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnRzIG9mIHRoZSB0YWcgdGhhdCBpcyBzdGFydGVkIGJ1dCBwb3NzaWJseSBub3QKLQkgKiAgICAgICAgICAgIGVuZGVkCi0JICogQHBhcmFtIHBhcmVudFRhZ05hbWUKLQkgKiAgICAgICAgICAgIHRoZSB0YWcgb24gd2hpY2ggeW91IGFyZSBjaGVja2luIGZvciBhbiBlbmRpbmcgdGFnCi0JICogQHBhcmFtIGltYWdlUGF0aAotCSAqICAgICAgICAgICAgY29udGVudCBhc3Npc3QgaW1hZ2UgcmVsYXRpdmUgcGF0aAotCSAqIEByZXR1cm4gSUNvbXBsZXRpb25Qcm9wb3NhbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNvbXBsZXRpb25Qcm9wb3NhbCBjb21wdXRlSlNQRW5kVGFnUHJvcG9zYWwoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbiwgSW5kZXhlZFJlZ2lvbiBpbmRleGVkTm9kZSwgU3RyaW5nIHBhcmVudFRhZ05hbWUsIFN0cmluZyBpbWFnZVBhdGgpIHsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBwID0gbnVsbDsKLQotCQkvLyBjaGVjayBpZiB0YWcgaXMgY2xvc2VkCi0JCWJvb2xlYW4gaGFzRW5kVGFnID0gdHJ1ZTsKLQkJYm9vbGVhbiBpc0pTUFRhZyA9IGZhbHNlOwotCQlJRE9NTm9kZSB4bm9kZSA9IG51bGw7Ci0JCVN0cmluZyB0YWdOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZGV4ZWROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCXhub2RlID0gKChJRE9NTm9kZSkgaW5kZXhlZE5vZGUpOwotCQkJLy8gaXQncyBlbmRlZCBhbHJlYWR5Li4uCi0JCQlpZiAoeG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJSURPTU5vZGUgb3Blbk5vZGUgPSBudWxsOwotCQkJaWYgKCF4bm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UocGFyZW50VGFnTmFtZSkpIHsKLQkJCQlvcGVuTm9kZSA9IChJRE9NTm9kZSkgeG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQkJaWYgKG9wZW5Ob2RlICE9IG51bGwpIHsKLQkJCQlpZiAob3Blbk5vZGUgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkgewotCQkJCQlpc0pTUFRhZyA9ICgoSURPTUVsZW1lbnQpIG9wZW5Ob2RlKS5pc0pTUFRhZygpOwotCQkJCX0KLQkJCQl0YWdOYW1lID0gb3Blbk5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCQloYXNFbmRUYWcgPSAob3Blbk5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpdCdzIGNsb3NlZCwgZG9uJ3QgYWRkIGNsb3NlIHRhZyBwcm9wb3NhbAotCQlpZiAoIWhhc0VuZFRhZyAmJiAhaXNKU1BUYWcpIHsKLQotCQkJLy8gY3JlYXRlIGFwcHJvcHJpYXRlIGNsb3NlIHRhZyB0ZXh0Ci0JCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gIjwvIiArIHRhZ05hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB2aWV3ZXJUZXh0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRUZXh0KCk7Ci0JCQlpZiAoKHZpZXdlclRleHQubGVuZ3RoKCkgPj0gZG9jdW1lbnRQb3NpdGlvbikgJiYgKHZpZXdlclRleHQubGVuZ3RoKCkgPj0gMikgJiYgKGRvY3VtZW50UG9zaXRpb24gPj0gMikpIHsKLQkJCQlTdHJpbmcgbGFzdDJjaGFycyA9IHZpZXdlclRleHQuc3Vic3RyaW5nKGRvY3VtZW50UG9zaXRpb24gLSAyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQlpZiAobGFzdDJjaGFycy5lbmRzV2l0aCgiPC8iKSkgewotCQkJCQlwcm9wb3NlZFRleHQgPSB0YWdOYW1lOwotCQkJCX0KLQkJCQllbHNlIGlmIChsYXN0MmNoYXJzLmVuZHNXaXRoKCI8IikpIHsKLQkJCQkJcHJvcG9zZWRUZXh0ID0gIi8iICsgdGFnTmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJLy8gY3JlYXRlIHByb3Bvc2FsCi0JCQlwID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQgKyAiPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWRvY3VtZW50UG9zaXRpb24sIDAsIHByb3Bvc2VkVGV4dC5sZW5ndGgoKSArIDEsIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoaW1hZ2VQYXRoKSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbmRfd2l0aF8sIChuZXcgT2JqZWN0W117cHJvcG9zZWRUZXh0fSkpLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9FTkRfVEFHKTsKLQkJfQotCQllbHNlIGlmICghaGFzRW5kVGFnICYmIGlzSlNQVGFnKSB7Ci0KLQkJCS8vIGNyZWF0ZSBhcHByb3ByaWF0ZSBjbG9zZSB0YWcgdGV4dAotCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9ICIlIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHZpZXdlclRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldFRleHQoKTsKLQotCQkJLy8gVE9ETyAocGEpIG1ha2UgaXQgc21hcnRlciB0byBhZGQgIiU+IiBvciBqdXN0ICI+IiBpZiAlIGlzCi0JCQkvLyBhbHJlYWR5IHRoZXJlLi4uCi0JCQlpZiAoKHZpZXdlclRleHQubGVuZ3RoKCkgPj0gZG9jdW1lbnRQb3NpdGlvbikgJiYgKHZpZXdlclRleHQubGVuZ3RoKCkgPj0gMikpIHsKLQkJCQlTdHJpbmcgbGFzdDJjaGFycyA9IHZpZXdlclRleHQuc3Vic3RyaW5nKGRvY3VtZW50UG9zaXRpb24gLSAyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQlTdHJpbmcgbGFzdGNoYXIgPSB2aWV3ZXJUZXh0LnN1YnN0cmluZyhkb2N1bWVudFBvc2l0aW9uIC0gMSwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJaWYgKGxhc3RjaGFyLmVxdWFscygiJSIpKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQlpZiAobGFzdDJjaGFycy5lbmRzV2l0aCgiPCUiKSkgewotCQkJCQkJcHJvcG9zZWRUZXh0ID0gIiUiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlwcm9wb3NlZFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBjcmVhdGUgcHJvcG9zYWwKLQkJCXAgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2VkVGV4dCArICI+IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZG9jdW1lbnRQb3NpdGlvbiwgMCwgcHJvcG9zZWRUZXh0Lmxlbmd0aCgpICsgMSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpbWFnZVBhdGgpLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkVuZF93aXRoXywgKG5ldyBPYmplY3RbXXtwcm9wb3NlZFRleHR9KSksIG51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0VORF9UQUcpOwotCQl9Ci0KLQkJcmV0dXJuIHA7Ci0JfQotCi0KLQkvKioKLQkgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgY2xvc2luZyBwcm9wb3NhbCBnaXZlbiB0aGUKLQkgKiBjb250ZW50cyAoSW5kZXhlZFJlZ2lvbikgb2YgYSB0YWcgdGhhdCBpcyBzdGFydGVkLCBidXQgcG9zc2libHkgbm90Ci0JICogZW5kZWQKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdGV4dCB2aWV3ZXIKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgdmlld2VyCi0JICogQHBhcmFtIGluZGV4ZWROb2RlCi0JICogICAgICAgICAgICB0aGUgY29udGVudHMgb2YgdGhlIHRhZyB0aGF0IGlzIHN0YXJ0ZWQgYnV0IHBvc3NpYmx5IG5vdAotCSAqICAgICAgICAgICAgZW5kZWQKLQkgKiBAcGFyYW0gcGFyZW50VGFnTmFtZQotCSAqICAgICAgICAgICAgdGhlIHRhZyBvbiB3aGljaCB5b3UgYXJlIGNoZWNraW4gZm9yIGFuIGVuZGluZyB0YWcKLQkgKiBAcGFyYW0gaW1hZ2VQYXRoCi0JICogICAgICAgICAgICBjb250ZW50IGFzc2lzdCByZWxhdGl2ZSBpbWFnZSBwYXRoCi0JICogQHJldHVybiBJQ29tcGxldGlvblByb3Bvc2FsCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29tcGxldGlvblByb3Bvc2FsIGNvbXB1dGVYTUxFbmRUYWdQcm9wb3NhbChJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uLCBJbmRleGVkUmVnaW9uIGluZGV4ZWROb2RlLCBTdHJpbmcgcGFyZW50VGFnTmFtZSwgU3RyaW5nIGltYWdlUGF0aCkgewotCQlJQ29tcGxldGlvblByb3Bvc2FsIHAgPSBudWxsOwotCi0JCS8vIGNoZWNrIGlmIHRhZyBpcyBjbG9zZWQKLQkJYm9vbGVhbiBoYXNFbmRUYWcgPSB0cnVlOwotCQlJRE9NTm9kZSB4bm9kZSA9IG51bGw7Ci0JCVN0cmluZyB0YWdOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZGV4ZWROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCXhub2RlID0gKChJRE9NTm9kZSkgaW5kZXhlZE5vZGUpOwotCQkJLy8gaXQncyBlbmRlZCBhbHJlYWR5Li4uCi0JCQlpZiAoeG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJSURPTU5vZGUgc3R5bGVOb2RlID0gbnVsbDsKLQkJCWlmICgheG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHBhcmVudFRhZ05hbWUpKSB7Ci0JCQkJc3R5bGVOb2RlID0gKElET01Ob2RlKSB4bm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQlpZiAoc3R5bGVOb2RlICE9IG51bGwpIHsKLQkJCQl0YWdOYW1lID0gc3R5bGVOb2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkJaGFzRW5kVGFnID0gKHN0eWxlTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKTsKLQkJCX0KLQkJfQotCi0JCS8vIGl0J3MgY2xvc2VkLCBkb24ndCBhZGQgY2xvc2UgdGFnIHByb3Bvc2FsCi0JCWlmICghaGFzRW5kVGFnKSB7Ci0KLQkJCS8vIGNyZWF0ZSBhcHByb3ByaWF0ZSBjbG9zZSB0YWcgdGV4dAotCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9ICI8LyIgKyB0YWdOYW1lOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmlld2VyVGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0VGV4dCgpOwotCQkJaWYgKCh2aWV3ZXJUZXh0Lmxlbmd0aCgpID49IGRvY3VtZW50UG9zaXRpb24pICYmICh2aWV3ZXJUZXh0Lmxlbmd0aCgpID49IDIpICYmIChkb2N1bWVudFBvc2l0aW9uID49IDIpKSB7Ci0JCQkJU3RyaW5nIGxhc3QyY2hhcnMgPSB2aWV3ZXJUZXh0LnN1YnN0cmluZyhkb2N1bWVudFBvc2l0aW9uIC0gMiwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJaWYgKGxhc3QyY2hhcnMuZW5kc1dpdGgoIjwvIikpIHsKLQkJCQkJcHJvcG9zZWRUZXh0ID0gdGFnTmFtZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobGFzdDJjaGFycy5lbmRzV2l0aCgiPCIpKSB7Ci0JCQkJCXByb3Bvc2VkVGV4dCA9ICIvIiArIHRhZ05hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNyZWF0ZSBwcm9wb3NhbAotCQkJcCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0ICsgIj4iLCAvLyROT04tTkxTLTEkCi0JCQkJCQlkb2N1bWVudFBvc2l0aW9uLCAwLCBwcm9wb3NlZFRleHQubGVuZ3RoKCkgKyAxLCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGltYWdlUGF0aCksIE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuRW5kX3dpdGhfLCAobmV3IE9iamVjdFtde3Byb3Bvc2VkVGV4dH0pKSwgbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfRU5EX1RBRyk7Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE1ldGFTY3JpcHRUeXBlKERvY3VtZW50IGRvYykgewotCQkvLyBDYW4gbm90IGp1c3QgZG8gYSBEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcpIGFzIHRoaXMKLQkJLy8gbmVlZHMKLQkJLy8gdG8gYmUgcmVsYXRpdmVseSBmYXN0LgotCQlMaXN0IG1ldGFzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBjaGVjayBmb3IgTUVUQSB0YWdzIHVuZGVyIHRoZSBEb2N1bWVudAotCQlOb2RlIGh0bWwgPSBudWxsOwotCQlOb2RlIGhlYWQgPSBudWxsOwotCQlOb2RlIGNoaWxkID0gbnVsbDsKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAocGEpIDIwMDIxMjE3Ci0JCS8vIGNtdmMgZGVmZWN0IDIzNTU1NAotCQkvLyBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudDogdXNpbmcgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSByYXRoZXIgdGhhbgotCQkvLyBub2RlTGlzdChpdGVtKSBmb3IgTyhuKSB2cy4gTyhuKm4pCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCQlmb3IgKGNoaWxkID0gZG9jLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShNRVRBKSkgewotCQkJCW1ldGFzLmFkZChjaGlsZCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSFRNTCkpIHsKLQkJCQlodG1sID0gY2hpbGQ7Ci0JCQl9Ci0JCX0KLQkJLy8gTm9kZUxpc3QgY2hpbGRyZW4gPSBkb2MuZ2V0Q2hpbGROb2RlcygpOwotCQkvLyBmb3IoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkvLyBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCS8vIGlmKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCS8vIGNvbnRpbnVlOwotCQkvLyBpZihjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoTUVUQSkpCi0JCS8vIG1ldGFzLmFkZChjaGlsZCk7Ci0JCS8vIGVsc2UgaWYoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKEhUTUwpKQotCQkvLyBodG1sID0gY2hpbGQ7Ci0JCS8vIH0KLQotCQkvLyBjaGVjayBmb3IgTUVUQSB0YWdzIHVuZGVyIEhFQUQKLQkJaWYgKGh0bWwgIT0gbnVsbCkgewotCQkJZm9yIChjaGlsZCA9IGh0bWwuZ2V0Rmlyc3RDaGlsZCgpOyAoY2hpbGQgIT0gbnVsbCkgJiYgKGhlYWQgPT0gbnVsbCk7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKEhFQUQpKSB7Ci0JCQkJCWhlYWQgPSBjaGlsZDsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjaGlsZHJlbiA9IGh0bWwuZ2V0Q2hpbGROb2RlcygpOwotCQkJLy8gZm9yKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpICYmIGhlYWQgPT0gbnVsbDsgaSsrKSB7Ci0JCQkvLyBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkvLyBpZihjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJLy8gY29udGludWU7Ci0JCQkvLyBpZihjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSEVBRCkpCi0JCQkvLyBoZWFkID0gY2hpbGQ7Ci0JCQkvLyB9Ci0JCX0KLQotCQlpZiAoaGVhZCAhPSBudWxsKSB7Ci0JCQlmb3IgKGhlYWQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShNRVRBKSkgewotCQkJCQltZXRhcy5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNoaWxkcmVuID0gaGVhZC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkvLyBmb3IoaW50IGkgPSAwIDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCS8vIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCS8vIGlmKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkvLyBjb250aW51ZTsKLQkJCS8vIGlmKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShNRVRBKSkKLQkJCS8vIG1ldGFzLmFkZChjaGlsZCk7Ci0JCQkvLyB9Ci0JCX0KLQotCQlyZXR1cm4gZ2V0TWV0YVNjcmlwdFR5cGUobWV0YXMpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRNZXRhU2NyaXB0VHlwZShMaXN0IG1ldGFOb2RlTGlzdCkgewotCQlOb2RlIG1ldGEgPSBudWxsOwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG51bGw7Ci0JCWJvb2xlYW4gaHR0cEVxdWl2ID0gZmFsc2U7Ci0JCVN0cmluZyBjb250ZW50U2NyaXB0VHlwZSA9IG51bGw7Ci0KLQkJZm9yIChpbnQgaSA9IG1ldGFOb2RlTGlzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJbWV0YSA9IChOb2RlKSBtZXRhTm9kZUxpc3QuZ2V0KGkpOwotCQkJYXR0cmlidXRlcyA9IG1ldGEuZ2V0QXR0cmlidXRlcygpOwotCQkJaHR0cEVxdWl2ID0gZmFsc2U7Ci0JCQljb250ZW50U2NyaXB0VHlwZSA9IG51bGw7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCWlmIChhdHRyaWJ1dGVzLml0ZW0oaikuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKEhUVFBfRVFVSVYpKSB7Ci0JCQkJCWh0dHBFcXVpdiA9IGF0dHJpYnV0ZXMuaXRlbShqKS5nZXROb2RlVmFsdWUoKS5lcXVhbHNJZ25vcmVDYXNlKENPTlRFTlRfU0NSSVBUX1RZUEUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChhdHRyaWJ1dGVzLml0ZW0oaikuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKENPTlRFTlQpKSB7Ci0JCQkJCWNvbnRlbnRTY3JpcHRUeXBlID0gYXR0cmlidXRlcy5pdGVtKGopLmdldE5vZGVWYWx1ZSgpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChodHRwRXF1aXYgJiYgKGNvbnRlbnRTY3JpcHRUeXBlICE9IG51bGwpKSB7Ci0JCQkJcmV0dXJuIGNvbnRlbnRTY3JpcHRUeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNjcmlwdGluZyBsYW5ndWFnZSB0aGUgc2NyaXB0Tm9kZSBpcyBpbiBDdXJyZW50bHkgcmV0dXJucwotCSAqIGphdmFzY3JpcHQgdW5sZXNzIHNvbWUgdW5rbm93biB0eXBlIG9yIGxhbmd1YWdlIGlzIHNwZWNpZmllZC4gVGhlbiB0aGUKLQkgKiB1bmtub3duIHR5cGUvbGFuZ3VhZ2UgaXMgcmV0dXJuZWQKLQkgKiAKLQkgKiBAcGFyYW0gc2NyaXB0Tm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNjcmlwdExhbmd1YWdlKE5vZGUgc2NyaXB0Tm9kZSkgewotCQlOb2RlIGF0dHIgPSBudWxsOwotCi0JCWJvb2xlYW4gc3BlY2lmaWVkID0gZmFsc2U7Ci0JCS8vIHRyeSB0byBmaW5kIGEgc2NyaXB0aW5nIGFkYXB0ZXIgZm9yICd0eXBlJwotCQlpZiAoKHNjcmlwdE5vZGUgPT0gbnVsbCkgfHwgKHNjcmlwdE5vZGUuZ2V0QXR0cmlidXRlcygpID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWF0dHIgPSBzY3JpcHROb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oInR5cGUiKTsvLyROT04tTkxTLTEkCi0JCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCXNwZWNpZmllZCA9IHRydWU7Ci0JCQlTdHJpbmcgdHlwZSA9IGF0dHIuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQlyZXR1cm4gbG9va3VwU2NyaXB0VHlwZSh0eXBlKTsKLQkJfQotCQkvLyBub3cgdHJ5IHRvIGZpbmQgYSBzY3JpcHRpbmcgYWRhcHRlciBmb3IgJ2xhbmd1YWdlJyAoZGVwcmVjYXRlZCBieQotCQkvLyBIVE1MIHNwZWNpZmljYXRpb25zKQotCQlhdHRyID0gc2NyaXB0Tm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJsYW5ndWFnZSIpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJc3BlY2lmaWVkID0gdHJ1ZTsKLQkJCVN0cmluZyBsYW5ndWFnZSA9IGF0dHIuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQlyZXR1cm4gbG9va3VwU2NyaXB0TGFuZ3VhZ2UobGFuZ3VhZ2UpOwotCQl9Ci0JCS8vIGNoZWNrIGlmIG9uZSBpcyBzcGVjaWZpZWQgYnkgYSBNRVRBIHRhZyBhdCB0aGUgcm9vdCBsZXZlbCBvciBpbnNpZGUKLQkJLy8gb2YgSEVBRAotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCWlmICghc3BlY2lmaWVkKSB7Ci0JCQl0eXBlID0gZ2V0TWV0YVNjcmlwdFR5cGUoc2NyaXB0Tm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQl9Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCXNwZWNpZmllZCA9IHRydWU7Ci0JCQlyZXR1cm4gbG9va3VwU2NyaXB0VHlwZSh0eXBlKTsKLQkJfQotCQkvLyByZXR1cm4gZGVmYXVsdAotCQlpZiAoIXNwZWNpZmllZCkgewotCQkJcmV0dXJuIFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRlbGxzIHlvdSBpZiB0aGUgZmxhdG5vZGUgaXMgdGhlICU+IGRlbGltaXRlcgotCSAqIAotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKU1BDbG9zZURlbGltaXRlcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZuKSB7Ci0JCWlmIChmbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGlzSlNQQ2xvc2VEZWxpbWl0ZXIoZm4uZ2V0VHlwZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSlNQQ2xvc2VEZWxpbWl0ZXIoU3RyaW5nIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiAodHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfQ0xPU0UpIHx8IHR5cGUuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkpOwotCX0KLQotCS8qKgotCSAqIFRlbGxzIHlvdSBpZiB0aGUgZmxhdG5vZGUgaXMgdGhlIEpTUCByZWdpb24gPCUlPiwgPCU9JT4sIDwlISU+Ci0JICogCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pTUERlbGltaXRlcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZuKSB7Ci0JCWJvb2xlYW4gaXNEZWxpbWl0ZXIgPSBmYWxzZTsKLQkJU3RyaW5nIHR5cGUgPSBmbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCWlzRGVsaW1pdGVyID0gaXNKU1BEZWxpbWl0ZXIodHlwZSk7Ci0JCX0KLQkJcmV0dXJuIGlzRGVsaW1pdGVyOwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKU1BEZWxpbWl0ZXIoU3RyaW5nIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiAoaXNKU1BPcGVuRGVsaW1pdGVyKHR5cGUpIHx8IGlzSlNQQ2xvc2VEZWxpbWl0ZXIodHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFRlbGxzIHlvdSBpZiB0aGUgZmxhdG5vZGUgaXMgPCUsIDwlPSwgb3IgPCUhIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mCi0JICogaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcyB3YXkgZm9yIGV4cGVkZW5jeS4KLQkgKiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKU1BPcGVuRGVsaW1pdGVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm4pIHsKLQkJaWYgKGZuID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gaXNKU1BPcGVuRGVsaW1pdGVyKGZuLmdldFR5cGUoKSk7Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pTUE9wZW5EZWxpbWl0ZXIoU3RyaW5nIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiAodHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfU0NSSVBUTEVUX09QRU4pIHx8IHR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHx8IHR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0VYUFJFU1NJT05fT1BFTikpOwotCX0KLQotCS8qKgotCSAqIFRlbGxzIHlvdSBpZiB0aGUgZmxhdG5vZGUgaXMgdGhlIDxqc3A6c2NyaXB0bGV0PiwgPGpzcDpleHByZXNzaW9uPiwgb3IKLQkgKiA8anNwOmRlY2xhcmF0aW9uPnRhZwotCSAqIAotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNYTUxKU1BEZWxpbWl0ZXIoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbikgewotCQlib29sZWFuIGlzRGVsaW1pdGVyID0gZmFsc2U7Ci0JCWlmICgoZm4gIT0gbnVsbCkgJiYgKGZuIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpKSB7Ci0JCQlPYmplY3RbXSByZWdpb25zID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgZm4pLmdldFJlZ2lvbnMoKS50b0FycmF5KCk7Ci0JCQlJVGV4dFJlZ2lvbiB0ZW1wID0gbnVsbDsKLQkJCVN0cmluZyByZWdpb25UZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCXRlbXAgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnNbaV07Ci0JCQkJaWYgKHRlbXAuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJCXJlZ2lvblRleHQgPSBmbi5nZXRUZXh0KHRlbXApOwotCQkJCQlpZiAocmVnaW9uVGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6c2NyaXB0bGV0IikgfHwgcmVnaW9uVGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZXhwcmVzc2lvbiIpIHx8IHJlZ2lvblRleHQuZXF1YWxzSWdub3JlQ2FzZSgianNwOmRlY2xhcmF0aW9uIikpIHsKLQkJCQkJCWlzRGVsaW1pdGVyID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNEZWxpbWl0ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyAiamF2YXNjcmlwdCIgaWYgbGFuZ3VhZ2UgYXR0cmlidXRlIGlzIHNvbWUgZm9ybSBvZiBqYXZhc2NyaXB0LAotCSAqICJqYXZhIiBpZiBsYW5ndWFnZSBhdHRyaWJ1dGUgaXMgc29tZSBmb3JtIG9mIGphdmEuIE90aGVyd2lzZSwganVzdAotCSAqIHJldHVybnMgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGFuZ3VhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb29rdXBTY3JpcHRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkFTQ1JJUFRfTEFOR1VBR0VfS0VZU1tpXS5lcXVhbHNJZ25vcmVDYXNlKGxhbmd1YWdlKSkgewotCQkJCXJldHVybiBTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVDsKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBX0xBTkdVQUdFX0tFWVMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChTY3JpcHRMYW5ndWFnZUtleXMuSkFWQV9MQU5HVUFHRV9LRVlTW2ldLmVxdWFsc0lnbm9yZUNhc2UobGFuZ3VhZ2UpKSB7Ci0JCQkJcmV0dXJuIFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBOwotCQkJfQotCQl9Ci0JCXJldHVybiBsYW5ndWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zICJqYXZhc2NyaXB0IiBpZiB0eXBlICh1c2VkIGluIDxzY3JpcHQgdHlwZT0ieHh4Ij4gaXMgYWN0dWFsbHkKLQkgKiBqYXZhc2NyaXB0IHR5cGUuIE90aGVyd2lzZSwganVzdCByZXR1cm5zIHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvb2t1cFNjcmlwdFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVF9NSU1FX1RZUEVfS0VZUy5sZW5ndGg7IGkrKykgewotCQkJaWYgKFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUX01JTUVfVFlQRV9LRVlTW2ldLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKLQkJCQlyZXR1cm4gU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkFTQ1JJUFQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5NjQzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBYTUxDb250ZW50TW9kZWxHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdENvbnRlbnRNb2RlbEdlbmVyYXRvciB7Ci0KLQkvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ESVJFQ1RJVkVfT1BFTiA9ICJKU1BfRElSRUNUSVZFX09QRU4iOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZUF0dHJpYnV0ZShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWlmICgoYXR0ckRlY2wgPT0gbnVsbCkgfHwgKGJ1ZmZlciA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCB1c2FnZSA9IGF0dHJEZWNsLmdldFVzYWdlKCk7Ci0JCWlmICh1c2FnZSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCWdlbmVyYXRlUmVxdWlyZWRBdHRyaWJ1dGUobnVsbCwgYXR0ckRlY2wsIGJ1ZmZlcik7IC8vIHRvZG8gcGFzcwotCQkJLy8gb3duZXJOb2RlIGFzCi0JCQkvLyAxc3QgcGFyYW0KLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVFbmRUYWcoU3RyaW5nIHRhZ05hbWUsIE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJaWYgKGVsZW1lbnREZWNsID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSAhPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkgewotCQkJYnVmZmVyLmFwcGVuZCgiPC8iICsgdGFnTmFtZSArICI+Iik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVSZXF1aXJlZEF0dHJpYnV0ZShOb2RlIG93bmVyTm9kZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlpZiAoKGF0dHJEZWNsID09IG51bGwpIHx8IChidWZmZXIgPT0gbnVsbCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGF0dHJpYnV0ZSBuYW1lCi0JCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gZ2V0UmVxdWlyZWROYW1lKG93bmVyTm9kZSwgYXR0ckRlY2wpOwotCQlDTURhdGFUeXBlIGF0dHJUeXBlID0gYXR0ckRlY2wuZ2V0QXR0clR5cGUoKTsKLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IG51bGw7Ci0JCS8vID0gc2lnbgotCQlidWZmZXIuYXBwZW5kKGF0dHJpYnV0ZU5hbWUgKyAiPSIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGF0dHJpYnV0ZSB2YWx1ZQotCQlpZiAoYXR0clR5cGUgIT0gbnVsbCkgewotCQkJLy8gaW5zZXJ0IGFueSB2YWx1ZSB0aGF0IGlzIGltcGxpZWQKLQkJCWlmICgoYXR0clR5cGUuZ2V0SW1wbGllZFZhbHVlS2luZCgpICE9IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9OT05FKSAmJiAoYXR0clR5cGUuZ2V0SW1wbGllZFZhbHVlKCkgIT0gbnVsbCkpIHsKLQkJCQlkZWZhdWx0VmFsdWUgPSBhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWUoKTsKLQkJCX0KLQkJCS8vIG90aGVyd2lzZSwgaWYgYW4gZW51bWVyYXRlZCBsaXN0IG9mIHZhbHVlcyBleGlzdHMsIHVzZSB0aGUKLQkJCS8vIGZpcnN0IHZhbHVlCi0JCQllbHNlIGlmICgoYXR0clR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpICE9IG51bGwpICYmIChhdHRyVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkubGVuZ3RoID4gMCkpIHsKLQkJCQlkZWZhdWx0VmFsdWUgPSBhdHRyVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKClbMF07Ci0JCQl9Ci0JCX0KLQkJCi0JCWNoYXIgYXR0clF1b3RlID0gJ1wiJzsKLQkJLy8gRm91bmQgYSBkb3VibGUgcXVvdGUsIHdyYXAgdGhlIGF0dHJpYnV0ZSBpbiBzaW5nbGUgcXVvdGVzCi0JCWlmKGRlZmF1bHRWYWx1ZSAhPSBudWxsICYmIGRlZmF1bHRWYWx1ZS5pbmRleE9mKGF0dHJRdW90ZSkgPj0gMCkgewotCQkJYXR0clF1b3RlID0gJ1wnJzsKLQkJfQotCQkKLQkJYnVmZmVyLmFwcGVuZChhdHRyUXVvdGUpOwotCQlidWZmZXIuYXBwZW5kKCgoZGVmYXVsdFZhbHVlICE9IG51bGwpID8gZGVmYXVsdFZhbHVlIDogIiIpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGF0dHJRdW90ZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVN0YXJ0VGFnKFN0cmluZyB0YWdOYW1lLCBOb2RlIHBhcmVudE5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWlmICgoZWxlbWVudERlY2wgPT0gbnVsbCkgfHwgKGJ1ZmZlciA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoIjwiICsgdGFnTmFtZSk7Ly8kTk9OLU5MUy0xJAotCQlnZW5lcmF0ZUF0dHJpYnV0ZXMoZWxlbWVudERlY2wsIGJ1ZmZlcik7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0U3RhcnRUYWdDbG9zZShwYXJlbnROb2RlLCBlbGVtZW50RGVjbCkpOwotCQlyZXR1cm47Ci0JfQotCi0JcHVibGljIGludCBnZXRNaW5pbWFsU3RhcnRUYWdMZW5ndGgoTm9kZSBub2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCkgewotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKHJlcXVpcmVzQXR0cmlidXRlcyhlbGVtZW50RGVjbCkpIHsKLQkJCXJldHVybiBnZXRSZXF1aXJlZE5hbWUobm9kZSwgZWxlbWVudERlY2wpLmxlbmd0aCgpICsgMjsgLy8gPCArCi0JCQkvLyBuYW1lICsKLQkJCS8vIHNwYWNlCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gMSArIGdldFJlcXVpcmVkTmFtZShub2RlLCBlbGVtZW50RGVjbCkubGVuZ3RoKCkgKyBnZXRTdGFydFRhZ0Nsb3NlKG5vZGUsIGVsZW1lbnREZWNsKS5sZW5ndGgoKTsgLy8gPCArCi0JCQkvLyBuYW1lCi0JCQkvLyArCi0JCQkvLyBhcHByb3ByaWF0ZQotCQkJLy8gY2xvc2UKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0T3RoZXJDbG9zZShOb2RlIG5vdEFUYWdOb2RlKSB7Ci0JCWlmIChub3RBVGFnTm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSAoKElET01Ob2RlKSBub3RBVGFnTm9kZSkuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmICgobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDEpICYmIG5vZGUuZ2V0UmVnaW9ucygpLmdldCgwKS5nZXRUeXBlKCkuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RJUkVDVElWRV9PUEVOKSkgewotCQkJCXJldHVybiAiJT4iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGFydFRhZ0Nsb3NlKE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpIHsKLQkJU3RyaW5nIG90aGVyID0gZ2V0T3RoZXJDbG9zZShwYXJlbnROb2RlKTsKLQkJaWYgKG90aGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBvdGhlcjsKLQkJfQotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCkgewotCQkJcmV0dXJuICI+IjsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpIHsKLQkJCXJldHVybiAiLz4iOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTFJlbGV2YW5jZUNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MUmVsZXZhbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzE0NTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MUmVsZXZhbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb25zdGFudHM7Ci0KLQotCi0vKioKLSAqIHNvbWUgcmVsZXZhbmNlIGNvbnN0YW50cyBmb3IgY29udGVudCBhc3Npc3QgaGlnaGVyIHJlbGV2YW5jZSBtZWFucyBpdCBzaG93cwotICogdXAgaGlnaGVyIG9uIHRoZSBsaXN0Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWE1MUmVsZXZhbmNlQ29uc3RhbnRzIGV4dGVuZHMgSVJlbGV2YW5jZUNvbnN0YW50cyB7Ci0KLQlpbnQgUl9DREFUQSA9IDQwMDsKLQlpbnQgUl9DTE9TRV9UQUcgPSAxNTAwOwotCi0JaW50IFJfQ09NTUVOVCA9IDEwMDsKLQotCS8vIG1vdmVkIHRoaXMgYWJvdmUgbWFjcm9zCi0JaW50IFJfRE9DVFlQRSA9IDYwMDsKLQlpbnQgUl9FTkRfVEFHID0gMTQwMDsKLQlpbnQgUl9FTkRfVEFHX05BTUUgPSAxMTAwOwotCWludCBSX0VOVElUWSA9IDEwMDA7Ci0JaW50IFJfSlNQID0gNTAwOwotCi0JaW50IFJfSlNQX0FUVFJJQlVURV9WQUxVRSA9IDcwMDsKLQotCS8vIChwYSkgbWFrZSB0aGVzZSB0aGUgc2FtZSByZWxldmFuY2Ugc28gcHJvcG9zYWxzIGFyZSBzYW1lIG9yZGVyIGZvciBWNTAxCi0JaW50IFJfTUFDUk8gPSA1MDA7Ci0KLQkvLyBhZGQgdGhpcyBvbnRvICJyZXF1aXJlZCIgYXR0cnMsIGVsZW1lbnRzLCBldGMgdG8gYnViYmxlIHRoZW0gdXAgb24KLQkvLyBzb3J0aW5nLi4uCi0JLy8gQ01WQyAyNDY2MTgKLQlpbnQgUl9SRVFVSVJFRCA9IDEwOwotCWludCBSX1RBR19JTlNFUlRJT04gPSA1MDA7Ci0JaW50IFJfU1RSSUNUTFlfVkFMSURfVEFHX0lOU0VSVElPTiA9IDYwMDsKLQlpbnQgUl9UQUdfTkFNRSA9IDEyMDA7Ci0JaW50IFJfU1RSSUNUTFlfVkFMSURfVEFHX05BTUUgPSAxMjUwOwotCWludCBSX1hNTF9BVFRSSUJVVEVfTkFNRSA9IDkwMDsKLQlpbnQgUl9YTUxfQVRUUklCVVRFX1ZBTFVFID0gODAwOwotCWludCBSX1hNTF9ERUNMQVJBVElPTiA9IDEzMDA7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNiMWEzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5TdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci0KLS8qKgotICogPHA+SW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yfSBmb3IgWE1MIGRvY3VtZW50czwvcD4KLSAqIAotICogPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIHJlYWN0IHRvIHVzZXIgcHJlZmVyZW5jZSBjaGFuZ2VzIGZvciBhdXRvIGFjdGl2YXRpb24KLSAqIGNoYXJhY3RlcnMgZm9yIFhNTCBwYWdlczwvcD4KLSAqIAotICogQHNlZSBTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvcgotICovCi1wdWJsaWMgY2xhc3MgWE1MU3RydWN0dXJlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZXh0ZW5kcyBTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0JLyoqIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyBmb3IgdGhpcyBwcm9jZXNzb3IsIHNldCBieSB1c2VyIHByZWZlcmVuY2UgKi8KLQlwcml2YXRlIGNoYXJbXSBmQ29tcGxldGlvblByb3BvYXNsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzOwotCQotCS8qKiB0aGUgY29udGV4dCBpbmZvcm1hdGlvbiB2YWxpZGF0b3IgZm9yIHRoaXMgcHJvY2Vzc29yICovCi0JcHJpdmF0ZSBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGZDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci0JCi0JLyoqCi0JICogPHA+Q29uc3RydWN0b3I8L3A+Ci0JICogCi0JICogQHBhcmFtIGFzc2lzdGFudCB7QGxpbmsgQ29udGVudEFzc2lzdGFudH0gdG8gdXNlCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGVJRCB0aGUgcGFydGl0aW9uIHR5cGUgdGhpcyBwcm9jZXNzb3IgaXMgZm9yCi0JICogQHBhcmFtIHZpZXdlciB7QGxpbmsgSVRleHRWaWV3ZXJ9IHRoaXMgcHJvY2Vzc29yIGlzIGFjdGluZyBpbgotCSAqLwotCXB1YmxpYyBYTUxTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdFByb2Nlc3NvcihDb250ZW50QXNzaXN0YW50IGFzc2lzdGFudCwKLQkJCVN0cmluZyBwYXJ0aXRpb25UeXBlSUQsIElUZXh0Vmlld2VyIHZpZXdlcikgewotCQkKLQkJc3VwZXIoYXNzaXN0YW50LCBwYXJ0aXRpb25UeXBlSUQsIHZpZXdlciwgWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJZ2V0QXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJQcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LlN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQlpZiAodGhpcy5mQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXRoaXMuZkNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciA9IG5ldyBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5mQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LlN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiB0aGlzLmZDb21wbGV0aW9uUHJvcG9hc2xBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LlN0cnVjdHVyZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yI3Byb3BlcnR5Q2hhbmdlKAotCSAqIAlvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZihldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UpIHx8Ci0JCQkJZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREUpKSB7Ci0JCQlnZXRBdXRvQWN0aXZhdGlvbkNoYXJhY3RlclByZWZlcmVuY2VzKCk7Ci0JCX0KLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBnZXRBdXRvQWN0aXZhdGlvbkNoYXJhY3RlclByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcga2V5ID0gWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFOwotCQlib29sZWFuIGRvQXV0byA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oa2V5KTsKLQkJaWYgKGRvQXV0bykgewotCQkJa2V5ID0gWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREU7Ci0JCQlmQ29tcGxldGlvblByb3BvYXNsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKGtleSkudG9DaGFyQXJyYXkoKTsKLQkJfQotCQllbHNlIHsKLQkJCWZDb21wbGV0aW9uUHJvcG9hc2xBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MVGFnc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxUYWdzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4Mjk1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxUYWdzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIDxwPntAbGluayBBYnN0cmFjdFhNTE1vZGVsUXVlcnlDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcn0gdXNlZCB0bwotICogZ2VuZXJhdGUgWE1MIHRhZyBjb250ZW50IGFzc2lzdCBwcm9wb3NhbHM8L3A+Ci0gKiAKLSAqIDxwPjxiPk5PVEU6PC9iPiBDdXJyZW50bHkgdGhpcyBjb21wdXRlciBkb2VzIG5vdCBmaWx0ZXIgb3V0IGFueSBvZiB0aGUgCi0gKiBtb2RlbCBxdWVyeSByZXN1bHRzIHNvIGl0IHdpbGwgcmV0dXJuIGFsbCBwcm9wb3NhbHMgZnJvbSB0aGUgbW9kZWwgcXVlcnkKLSAqIGZvciB0aGUgY3VycmVudCBjb250ZW50IHR5cGUuICBJbiB0aGUgZnV0dXJlIHRoaXMgbWF5IG5lZWQgdG8gY2hhbmdlLjwvcD4KLSAqLwotcHVibGljIGNsYXNzIFhNTFRhZ3NDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciBleHRlbmRzCi0JCUFic3RyYWN0WE1MTW9kZWxRdWVyeUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIHsKLQotCS8qKiB0aGUgZ2VuZXJhdGVkIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHByb3Bvc2FscyAqLwotCXByb3RlY3RlZCBYTUxDb250ZW50TW9kZWxHZW5lcmF0b3IgZkdlbmVyYXRvcjsKLQkKLQkvKiogdGhlIGNvbnRleHQgaW5mb3JtYXRpb24gdmFsaWRhdG9yIGZvciB0aGlzIGNvbXB1dGVyICovCi0JcHJpdmF0ZSBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGZDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci0JCi0JLyoqCi0JICogVE9ETzogSUFOOiBDb21tZW50IG1lCi0JICovCi0JcHVibGljIFhNTFRhZ3NDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcigpIHsKLQkJdGhpcy5mQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yID0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RYTUxNb2RlbFF1ZXJ5Q29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjZ2V0Q29udGVudEdlbmVyYXRvcigpCi0JICovCi0JcHJvdGVjdGVkIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvciBnZXRDb250ZW50R2VuZXJhdG9yKCkgewotCQlpZiAoZkdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQlmR2VuZXJhdG9yID0gbmV3IFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvcigpOwotCQl9Ci0JCXJldHVybiBmR2VuZXJhdG9yOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkKLQkJQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJvdmlkZXIgYXR0cmlidXRlSW5mb1Byb3ZpZGVyID0KLQkJCW5ldyBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25Qcm92aWRlcigoSVN0cnVjdHVyZWREb2N1bWVudCljb250ZXh0LmdldERvY3VtZW50KCksCi0JCQkJCShBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIpIGdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpKTsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QoYXR0cmlidXRlSW5mb1Byb3ZpZGVyLmdldEF0dHJpYnV0ZUluZm9ybWF0aW9uKGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpKSk7Ci0JfQotCQotCS8qKgotCSAqIDxwPkZpbHRlcnMgb3V0IGFueSBtb2RlbCBxdWVyeSBhY3Rpb25zIHRoYXQgYXJlIG5vdCBzcGVjaWZpYyB0byBYTUw8L3A+Ci0JICogPHA+PGI+Tk9URTo8L2I+IEN1cnJlbnRseSBub3RoaW5nIGlzIGZpbHRlcmVkIHNvIHRoaXMgY29tcHV0ZXIgcmV0dXJucyBhbGwKLQkgKiByZXN1bHRzIGZyb20gdGhlIG1vZGVsIHF1ZXJ5IGZvciB0aGUgY3VycmVudCBjb250ZW50IHR5cGU8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RYTUxNb2RlbFF1ZXJ5Q29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjdmFsaWRNb2RlbFF1ZXJ5Tm9kZShvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZE1vZGVsUXVlcnlOb2RlKENNTm9kZSBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgdmFsaWRhdG9yIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gZGlzcGxheWVkIGNvbnRleHQKLQkgKiBpbmZvcm1hdGlvbiBzaG91bGQgYmUgZGlzbWlzc2VkLiBNYXkgb25seSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGUgcHJvY2Vzc29yIGlzIGluY2FwYWJsZSBvZiBjb21wdXRpbmcgY29udGV4dCBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBhIGNvbnRleHQgaW5mb3JtYXRpb24gdmFsaWRhdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uCi0JICovCi0JcHJpdmF0ZSBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpIHsKLQkJaWYgKGZDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgPT0gbnVsbCkgewotCQkJZkNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciA9IG5ldyBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIoKTsKLQkJfQotCQlyZXR1cm4gZkNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGJiODNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVQcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLQotCi0vKioKLSAqIDxwPkNvbXBsZXRpb24gY29tcHV0ZXIgZm9yIFhNTCB0ZW1wbGF0ZXM8L3A+Ci0gKi8KLWNsYXNzIFhNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBleHRlbmRzIFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUHJvcG9zYWxDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJcmV0dXJuICgoVGVtcGxhdGVQcm9wb3NhbCkgbzIpLmdldFJlbGV2YW5jZSgpIC0gKChUZW1wbGF0ZVByb3Bvc2FsKSBvMSkuZ2V0UmVsZXZhbmNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIGZnUHJvcG9zYWxDb21wYXJhdG9yID0gbmV3IFByb3Bvc2FsQ29tcGFyYXRvcigpOwotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0VHlwZUlkID0gbnVsbDsKLQotCS8qCi0JICogQ29waWVkIGZyb20gc3VwZXIgY2xhc3MgZXhjZXB0IGluc3RlYWQgb2YgY2FsbGluZyBjcmVhdGVDb250ZXh0KHZpZXdlciwKLQkgKiByZWdpb24pIGNhbGwgY3JlYXRlQ29udGV4dCh2aWV3ZXIsIHJlZ2lvbiwgb2Zmc2V0KSBpbnN0ZWFkCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQotCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCi0JCS8vIGFkanVzdCBvZmZzZXQgdG8gZW5kIG9mIG5vcm1hbGl6ZWQgc2VsZWN0aW9uCi0JCWlmIChzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgPT0gb2Zmc2V0KSB7Ci0JCQlvZmZzZXQgPSBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0JCX0KLQotCQlTdHJpbmcgcHJlZml4ID0gZXh0cmFjdFByZWZpeCh2aWV3ZXIsIG9mZnNldCk7Ci0JCVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKG9mZnNldCAtIHByZWZpeC5sZW5ndGgoKSwgcHJlZml4Lmxlbmd0aCgpKTsKLQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBjcmVhdGVDb250ZXh0KHZpZXdlciwgcmVnaW9uLCBvZmZzZXQpOwotCQlpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCX0KLQotCQkvLyBuYW1lIG9mIHRoZSBzZWxlY3Rpb24gdmFyaWFibGVzIHtsaW5lLCB3b3JkfV9zZWxlY3Rpb24KLQkJY29udGV4dC5zZXRWYXJpYWJsZSgic2VsZWN0aW9uIiwgc2VsZWN0aW9uLmdldFRleHQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlUZW1wbGF0ZVtdIHRlbXBsYXRlcyA9IGdldFRlbXBsYXRlcyhjb250ZXh0LmdldENvbnRleHRUeXBlKCkuZ2V0SWQoKSk7Ci0KLQkJTGlzdCBtYXRjaGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRlbXBsYXRlcy5sZW5ndGg7IGkrKykgewotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSB0ZW1wbGF0ZXNbaV07Ci0JCQl0cnkgewotCQkJCWNvbnRleHQuZ2V0Q29udGV4dFR5cGUoKS52YWxpZGF0ZSh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQkJfQotCQkJY2F0Y2ggKFRlbXBsYXRlRXhjZXB0aW9uIGUpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh0ZW1wbGF0ZS5tYXRjaGVzKHByZWZpeCwgY29udGV4dC5nZXRDb250ZXh0VHlwZSgpLmdldElkKCkpKSB7Ci0JCQkJbWF0Y2hlcy5hZGQoY3JlYXRlUHJvcG9zYWwodGVtcGxhdGUsIGNvbnRleHQsIChJUmVnaW9uKSByZWdpb24sIGdldFJlbGV2YW5jZSh0ZW1wbGF0ZSwgcHJlZml4KSkpOwotCQkJfQotCQl9Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChtYXRjaGVzLCBmZ1Byb3Bvc2FsQ29tcGFyYXRvcik7Ci0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIG1hdGNoZXMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFttYXRjaGVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb25jcmV0ZSB0ZW1wbGF0ZSBjb250ZXh0IGZvciB0aGUgZ2l2ZW4gcmVnaW9uIGluIHRoZQotCSAqIGRvY3VtZW50LiBUaGlzIGludm9sdmVzIGZpbmRpbmcgb3V0IHdoaWNoIGNvbnRleHQgdHlwZSBpcyB2YWxpZCBhdCB0aGUKLQkgKiBnaXZlbiBsb2NhdGlvbiwgYW5kIHRoZW4gY3JlYXRpbmcgYSBjb250ZXh0IG9mIHRoaXMgdHlwZS4gVGhlIGRlZmF1bHQKLQkgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGEgPGNvZGU+U21hcnRSZXBsYWNlVGVtcGxhdGVDb250ZXh0PC9jb2RlPiBmb3IKLQkgKiB0aGUgY29udGV4dCB0eXBlIGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4gVGhpcyB0YWtlcyB0aGUgb2Zmc2V0IGF0IHdoaWNoCi0JICogY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQgaW50byBjb25zaWRlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgZm9yIHdoaWNoIHRoZSBjb250ZXh0IGlzIGNyZWF0ZWQKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogICAgICAgICAgICB0aGUgcmVnaW9uIGludG8gPGNvZGU+ZG9jdW1lbnQ8L2NvZGU+IGZvciB3aGljaCB0aGUKLQkgKiAgICAgICAgICAgIGNvbnRleHQgaXMgY3JlYXRlZAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBvZmZzZXQgd2hlcmUgY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQKLQkgKiBAcmV0dXJuIGEgdGVtcGxhdGUgY29udGV4dCB0aGF0IGNhbiBoYW5kbGUgdGVtcGxhdGUgaW5zZXJ0aW9uIGF0IHRoZQotCSAqICAgICAgICAgZ2l2ZW4gbG9jYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZUNvbnRleHQgY3JlYXRlQ29udGV4dChJVGV4dFZpZXdlciB2aWV3ZXIsIElSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIHByZXR0eSBtdWNoIHNhbWUgY29kZSBhcyBzdXBlci5jcmVhdGVDb250ZXh0IGV4Y2VwdCBjcmVhdGUKLQkJLy8gU21hcnRSZXBsYWNlVGVtcGxhdGVDb250ZXh0Ci0JCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBnZXRDb250ZXh0VHlwZSh2aWV3ZXIsIHJlZ2lvbik7Ci0JCWlmIChjb250ZXh0VHlwZSAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCXJldHVybiBuZXcgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSwgb2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVQcm9wb3NhbChUZW1wbGF0ZSB0ZW1wbGF0ZSwgVGVtcGxhdGVDb250ZXh0IGNvbnRleHQsIElSZWdpb24gcmVnaW9uLCBpbnQgcmVsZXZhbmNlKSB7Ci0JCXJldHVybiBuZXcgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbCh0ZW1wbGF0ZSwgY29udGV4dCwgcmVnaW9uLCBnZXRJbWFnZSh0ZW1wbGF0ZSksIHJlbGV2YW5jZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbXBsYXRlQ29udGV4dFR5cGUgZ2V0Q29udGV4dFR5cGUoSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIHJlZ2lvbikgewotCQlUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUgPSBudWxsOwotCi0JCUNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpOwotCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkgewotCQkJdHlwZSA9IHJlZ2lzdHJ5LmdldENvbnRleHRUeXBlKGZDb250ZXh0VHlwZUlkKTsKLQkJfQotCi0JCXJldHVybiB0eXBlOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZShUZW1wbGF0ZSB0ZW1wbGF0ZSkgewotCQkvLyBqdXN0IHJldHVybiB0aGUgc2FtZSBpbWFnZSBmb3Igbm93Ci0JCXJldHVybiBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19NQUNSTyk7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZXh0VHlwZVJlZ2lzdHJ5IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbXBsYXRlW10gZ2V0VGVtcGxhdGVzKFN0cmluZyBjb250ZXh0VHlwZUlkKSB7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlc1tdID0gbnVsbDsKLQotCQlUZW1wbGF0ZVN0b3JlIHN0b3JlID0gZ2V0VGVtcGxhdGVTdG9yZSgpOwotCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotCQkJdGVtcGxhdGVzID0gc3RvcmUuZ2V0VGVtcGxhdGVzKGNvbnRleHRUeXBlSWQpOwotCQl9Ci0KLQkJcmV0dXJuIHRlbXBsYXRlczsKLQl9Ci0KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JfQotCi0Jdm9pZCBzZXRDb250ZXh0VHlwZShTdHJpbmcgY29udGV4dFR5cGVJZCkgewotCQlmQ29udGV4dFR5cGVJZCA9IGNvbnRleHRUeXBlSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MVGVtcGxhdGVzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTFRlbXBsYXRlc0NvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4N2JhYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MVGVtcGxhdGVzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTDsKLQotLyoqCi0gKiA8cD5Qcm9wb3NhbCBjb21wdXRlciB1c2VkIHRvIGNvbXB1dGVyIFhNTCB0ZW1wbGF0ZSBjb250ZW50IGFzc2lzdAotICogcHJvcG9zYWxzPC9wPgotICovCi1wdWJsaWMgY2xhc3MgWE1MVGVtcGxhdGVzQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgZXh0ZW5kcwotCQlEZWZhdWx0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgewotCi0JLyoqIDxwPlRoZSB0ZW1wbGF0ZSBwcm9jZXNzb3IgdXNlZCB0byBjcmVhdGUgdGhlIHByb3Bvc2FsczwvcD4gKi8KLQlwcml2YXRlIFhNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBmVGVtcGxhdGVQcm9jZXNzb3IgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBjb21wdXRlcgotCSAqLwotCXB1YmxpYyBYTUxUZW1wbGF0ZXNDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcigpIHsKLQkJc3VwZXIoKTsKLQkJZlRlbXBsYXRlUHJvY2Vzc29yID0gbmV3IFhNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkRlZmF1bHRYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoCi0JCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJCi0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5BVFRSSUJVVEUsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkRlZmF1bHRYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3QsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscygKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLkFUVFJJQlVURV9WQUxVRSwgY29udGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkRlZmF1bHRYTUxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciNhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoCi0JCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJCi0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5ORVcsIGNvbnRleHQpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5EZWZhdWx0WE1MQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIjYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdCwgaW50LCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKAotCQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBjaGlsZFBvc2l0aW9uLAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLlRBRywgY29udGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPkFkZHMgdGVtcGxhdGVzIHRvIHRoZSBsaXN0IG9mIHByb3Bvc2FsczwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gdGVtcGxhdGVDb250ZXh0Ci0JICogQHBhcmFtIGNvbnRleHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVGVtcGxhdGVzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBTdHJpbmcgdGVtcGxhdGVDb250ZXh0LAotCQkJQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkKLQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0ICE9IG51bGwpIHsKLQotCQkJYm9vbGVhbiB1c2VQcm9wb3NhbExpc3QgPSAhY29udGVudEFzc2lzdFJlcXVlc3Quc2hvdWxkU2VwYXJhdGUoKTsKLQkKLQkJCWlmIChmVGVtcGxhdGVQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJCWZUZW1wbGF0ZVByb2Nlc3Nvci5zZXRDb250ZXh0VHlwZSh0ZW1wbGF0ZUNvbnRleHQpOwotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPQotCQkJCQlmVGVtcGxhdGVQcm9jZXNzb3IuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoCi0JCQkJCQkJY29udGV4dC5nZXRWaWV3ZXIoKSwgY29udGV4dC5nZXRJbnZvY2F0aW9uT2Zmc2V0KCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcG9zYWxzLmxlbmd0aDsgKytpKSB7Ci0JCQkJCWlmICh1c2VQcm9wb3NhbExpc3QpIHsKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2Fsc1tpXSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRNYWNybyhwcm9wb3NhbHNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIExpc3QgY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoY29udGV4dCwgbW9uaXRvcikpOwotCi0JCWlmIChmVGVtcGxhdGVQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJZlRlbXBsYXRlUHJvY2Vzc29yLnNldENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuQUxMKTsKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBmVGVtcGxhdGVQcm9jZXNzb3IuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoY29udGV4dC5nZXRWaWV3ZXIoKSwgY29udGV4dC5nZXRJbnZvY2F0aW9uT2Zmc2V0KCkpOwotCQkJaWYgKHByb3Bvc2FscyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wb3NhbHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJbGlzdC5hZGQocHJvcG9zYWxzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYTM1NzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5DTUltYWdlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBBZGFwdHMgYSBET00gbm9kZSB0byBhIEpGYWNlIHZpZXdlci4KLSAqLwotcHVibGljIGNsYXNzIEpGYWNlTm9kZUFkYXB0ZXIgaW1wbGVtZW50cyBJSkZhY2VOb2RlQWRhcHRlciB7Ci0KLQlmaW5hbCBzdGF0aWMgQ2xhc3MgQURBUFRFUl9LRVkgPSBJSkZhY2VOb2RlQWRhcHRlci5jbGFzczsKLQotCS8qKgotCSAqIGRlYnVnIC5vcHRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZ2V0RGVidWdWYWx1ZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBnZXREZWJ1Z1ZhbHVlKCkgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9vdXRsaW5lIik7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiByZXN1bHQgPSAodmFsdWUgIT0gbnVsbCkgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZkFkYXB0ZXJGYWN0b3J5OwotCVJlZnJlc2hTdHJ1Y3R1cmVKb2IgZlJlZnJlc2hKb2IgPSBudWxsOwotCi0JcHVibGljIEpGYWNlTm9kZUFkYXB0ZXIoSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mQWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgY3JlYXRlSW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCWltYWdlID0gY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0VMRU1FTlQpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDogewotCQkJCWltYWdlID0gY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVFJJQlVURSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogeyAvLyBhY3R1YWxseSwgVEVYVCBzaG91bGQgbmV2ZXIgYmUgc2VlbiBpbgotCQkJCS8vIHRoZSB0cmVlCi0JCQkJaW1hZ2UgPSBjcmVhdGVYTUxJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVFhURVhUKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOiB7Ci0JCQkJaW1hZ2UgPSBjcmVhdGVYTUxJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0RBVEFTRUNUSU9OKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOgotCQkJY2FzZSBOb2RlLkVOVElUWV9OT0RFIDogewotCQkJCWltYWdlID0gY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0VOVElUWSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogewotCQkJCWltYWdlID0gY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1BST0NFU1NJTkdJTlNUUlVDVElPTik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCWltYWdlID0gY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NPTU1FTlQpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9ET0NUWVBFKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5OT1RBVElPTl9OT0RFIDogewotCQkJCWltYWdlID0gY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX05PVEFUSU9OKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJaW1hZ2UgPSBjcmVhdGVYTUxJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVFhURVhUKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihTdHJpbmcgaW1hZ2VSZXNvdXJjZU5hbWUpIHsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoaW1hZ2VSZXNvdXJjZU5hbWUpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJLy8gKHBhKSAyMDAyMTIxNwotCQkvLyBjbXZjIGRlZmVjdCAyMzU1NTQKLQkJLy8gcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnQ6IHVzaW5nIGNoaWxkLmdldE5leHRTaWJsaW5nKCkgcmF0aGVyIHRoYW4KLQkJLy8gbm9kZUxpc3QoaXRlbSkgZm9yIE8obikgdnMuIE8obipuKQotCQkvLwotCQlBcnJheUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCQlmb3IgKE5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJTm9kZSBuID0gY2hpbGQ7Ci0JCQkJaWYgKG4uZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQl2LmFkZChuKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHYudG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gd2l0aCB0aGUgZWxlbWVudHMgYmVsb25naW5nIHRvIHRoZSBwYXNzZWQKLQkgKiBlbGVtZW50LiBUaGVzZSBhcmUgdGhlIHRvcCBsZXZlbCBpdGVtcyBpbiBhIGxpc3QsIHRyZWUsIHRhYmxlLCBldGMuLi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG5vZGUpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIEZldGNoZXMgdGhlIGxhYmVsIGltYWdlIHNwZWNpZmljIHRvIHRoaXMgb2JqZWN0IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRMYWJlbEltYWdlKE9iamVjdCBub2RlKSB7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkvLyBjaGVjayBmb3IgYW4gaW1hZ2UgZnJvbSB0aGUgY29udGVudCBtb2RlbAotCQkJaW1hZ2UgPSBDTUltYWdlVXRpbC5nZXRJbWFnZShDTUltYWdlVXRpbC5nZXREZWNsYXJhdGlvbigoTm9kZSkgbm9kZSkpOwotCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkvKgotCQkJCSAqIENyZWF0ZS9nZXQgaW1hZ2UgYmFzZWQgb24gTm9kZSB0eXBlLiBJbWFnZXMgYXJlIGNhY2hlZAotCQkJCSAqIHRyYW5zcGFyZW50bHkgaW4gdGhpcyBjbGFzcywgc3ViY2xhc3NlcyBtdXN0IGRvIHRoaXMgZm9yCi0JCQkJICogdGhlbXNlbHZlcyBpZiB0aGV5J3JlIGdvaW5nIHRvIHJldHVybiB0aGVpciBvd24gcmVzdWx0cy4KLQkJCQkgKi8KLQkJCQlpbWFnZSA9IGNyZWF0ZUltYWdlKG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBGZXRjaGVzIHRoZSBsYWJlbCB0ZXh0IHNwZWNpZmljIHRvIHRoaXMgb2JqZWN0IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxUZXh0KE9iamVjdCBub2RlKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZShub2RlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXROb2RlTmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZ0J1ZmZlciBub2RlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCQlub2RlTmFtZS5hcHBlbmQobm9kZS5nZXROb2RlTmFtZSgpKTsKLQotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJCW5vZGVOYW1lLmluc2VydCgwLCAiRE9DVFlQRToiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQkJcmV0dXJuIG5vZGVOYW1lLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQkJcmV0dXJuIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIFJlZnJlc2hTdHJ1Y3R1cmVKb2IgZ2V0UmVmcmVzaEpvYigpIHsKLQkJaWYgKGZSZWZyZXNoSm9iID09IG51bGwpIHsKLQkJCWZSZWZyZXNoSm9iID0gbmV3IFJlZnJlc2hTdHJ1Y3R1cmVKb2IoKTsKLQkJfQotCQlyZXR1cm4gZlJlZnJlc2hKb2I7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIChwYSkgMjAwMjEyMTcKLQkJLy8gY212YyBkZWZlY3QgMjM1NTU0ID4gdXNlIGNoaWxkLmdldE5leHRTaWJsaW5nKCkgaW5zdGVhZCBvZgotCQkvLyBub2RlTGlzdChpdGVtKSBmb3IgTyhuKSB2cy4gTyhuKm4pCi0JCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZSBhbGxvd3MgaXQKLQkgKiB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHR5cGUuZXF1YWxzKEFEQVBURVJfS0VZKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYnkgdGhlIG9iamVjdCBiZWluZyBhZGFwdGVyICh0aGUgbm90aWZpZXIpIHdoZW4gc29tZXRoaW5nIGhhcwotCSAqIGNoYW5nZWQuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIGZ1dHVyZV9UT0RPOiB0aGUgJ3Vpam9icycgdXNlZCBpbiB0aGlzIG1ldGhvZCB3ZXJlIGFkZGVkIHRvIHNvbHZlCi0JCS8vIHRocmVhZGluZyBwcm9ibGVtcyB3aGVuIHRoZSBkb20KLQkJLy8gaXMgdXBkYXRlZCBpbiB0aGUgYmFja2dyb3VuZCB3aGlsZSB0aGUgZWRpdG9yIGlzIG9wZW4uIFRoZXkgbWF5IGJlCi0JCS8vIGEgYml0IG92ZXJraWxsIGFuZCBub3QgdGhhdCB1c2VmdWwuCi0JCS8vIChUaGF0IGlzLCBtYXkgYmUgYmUgd29ydGh5IG9mIGpvYiBtYW5hZ2VyIG1hbmFnZW1lbnQpLiBJZiB0aGV5IGFyZQotCQkvLyBmb3VuZCB0byBiZSBpbXBvcnRhbnQgZW5vdWdoIHRvIGxlYXZlIGluLAotCQkvLyB0aGVyZSdzIHByb2JhYmx5IHNvbWUgb3B0aW1pemF0aW9uIHRoYXQgY2FuIGJlIGRvbmUuCi0JCWlmIChub3RpZmllciBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCUNvbGxlY3Rpb24gbGlzdGVuZXJzID0gZkFkYXB0ZXJGYWN0b3J5LmdldExpc3RlbmVycygpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBsaXN0ZW5lciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTA2MzcKLQkJCQkvLyBpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBOb2RlICYmIChsaXN0ZW5lciBpbnN0YW5jZW9mCi0JCQkJLy8gU3RydWN0dXJlZFZpZXdlcikgJiYgKGV2ZW50VHlwZSA9PQotCQkJCS8vIElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQgfHwgKGV2ZW50VHlwZSA9PQotCQkJCS8vIElOb2RlTm90aWZpZXIuQ0hBTkdFICYmIGNoYW5nZWRGZWF0dXJlID09IG51bGwpKSkgewotCQkJCWlmICgobGlzdGVuZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKSAmJiAoKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEKSB8fCAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEKSB8fCAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ0hBTkdFKSkpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpGYWNlTm9kZUFkYXB0ZXIgbm90aWZpZWQgb24gZXZlbnQgdHlwZSA+ICIgKyBldmVudFR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQotCQkJCQkvLyByZWZyZXNoIG9uIHN0cnVjdHVyYWwgYW5kICJ1bmtub3duIiBjaGFuZ2VzCi0JCQkJCVN0cnVjdHVyZWRWaWV3ZXIgc3RydWN0dXJlZFZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBsaXN0ZW5lcjsKLQkJCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUyMzAKLQkJCQkJaWYgKHN0cnVjdHVyZWRWaWV3ZXIuZ2V0Q29udHJvbCgpICE9IG51bGwpIHsKLQkJCQkJCWdldFJlZnJlc2hKb2IoKS5yZWZyZXNoKHN0cnVjdHVyZWRWaWV3ZXIsIChOb2RlKSBub3RpZmllcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTQzNDAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0KLS8qKgotICogQW4gYWRhcHRlciBmYWN0b3J5IHRvIGNyZWF0ZSBKRmFjZU5vZGVBZGFwdGVycy4gVXNlIHRoaXMgYWRhcHRlciBmYWN0b3J5Ci0gKiB3aXRoIGEgSkZhY2VBZGFwdGVyQ29udGVudFByb3ZpZGVyIHRvIGRpc3BsYXkgRE9NIG5vZGVzIGluIGEgdHJlZS4KLSAqLwotcHVibGljIGNsYXNzIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0JcHVibGljIGNsYXNzIENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXJJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVUERBVEVfREVMQVkgPSAyMDA7Ci0KLQkJcHVibGljIHZvaWQgY2FjaGVDbGVhcmVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSkgewotCQkJLy8gbm90aGluZyB0byBkbwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2FjaGVVcGRhdGVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgZmluYWwgU3RyaW5nIHVyaSwgaW50IG9sZFN0YXR1cywgaW50IG5ld1N0YXR1cywgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCQlpZiAoKG5ld1N0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0xPQURFRCkgfHwgKG5ld1N0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0VSUk9SKSkgewotCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoQ01Eb2N1bWVudE1hbmFnZXIgY21Eb2N1bWVudE1hbmFnZXIsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCWlmIChjbURvY3VtZW50TWFuYWdlci5nZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVVUT19MT0FEKSkgewotCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVmcmVzaFZpZXdlcnMoKSB7Ci0JCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnMoKS50b0FycmF5KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChsaXN0ZW5lcnNbaV0gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKSB7Ci0JCQkJCWZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIGxpc3RlbmVyc1tpXTsKLQkJCQkJSm9iIHJlZnJlc2ggPSBuZXcgVUlKb2IoWE1MVUlNZXNzYWdlcy5yZWZyZXNob3V0bGluZV8wKSB7Ci0JCQkJCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJCUNvbnRyb2wgcmVmcmVzaENvbnRyb2wgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQkJCQkJCWlmICgocmVmcmVzaENvbnRyb2wgIT0gbnVsbCkgJiYgIXJlZnJlc2hDb250cm9sLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQl2aWV3ZXIucmVmcmVzaCh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCXJlZnJlc2guc2V0U3lzdGVtKHRydWUpOwotCQkJCQlyZWZyZXNoLnNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCQkJCXJlZnJlc2guc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobGlzdGVuZXJzW2ldIGluc3RhbmNlb2YgVmlld2VyKSB7Ci0JCQkJCWZpbmFsIFZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSBsaXN0ZW5lcnNbaV07Ci0JCQkJCUpvYiByZWZyZXNoID0gbmV3IFVJSm9iKFhNTFVJTWVzc2FnZXMucmVmcmVzaG91dGxpbmVfMCkgewotCQkJCQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJCQlDb250cm9sIHJlZnJlc2hDb250cm9sID0gdmlld2VyLmdldENvbnRyb2woKTsKLQkJCQkJCQlpZiAoKHJlZnJlc2hDb250cm9sICE9IG51bGwpICYmICFyZWZyZXNoQ29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCXJlZnJlc2guc2V0U3lzdGVtKHRydWUpOwotCQkJCQlyZWZyZXNoLnNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCQkJCXJlZnJlc2guc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENNRG9jdW1lbnRNYW5hZ2VyIGNtRG9jdW1lbnRNYW5hZ2VyOwotCXByaXZhdGUgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lckltcGwgZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgPSBudWxsOwotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBTZXQgZkxpc3RlbmVycyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIHNpbmdsZXRvbkFkYXB0ZXI7Ci0KLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXRoaXMoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCXB1YmxpYyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIpIHsKLQkJZkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgSkZhY2UgYWRhcHRlciBmb3IgdGhlIERPTSBub2RlIHBhc3NlZCBpbgotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIG5vZGUpIHsKLQkJaWYgKHNpbmdsZXRvbkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIHRoZSBKRmFjZU5vZGVBZGFwdGVyCi0JCQlzaW5nbGV0b25BZGFwdGVyID0gbmV3IEpGYWNlTm9kZUFkYXB0ZXIodGhpcyk7Ci0JCQlpbml0QWRhcHRlcihzaW5nbGV0b25BZGFwdGVyLCBub2RlKTsKLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uQWRhcHRlcjsKLQl9Ci0KLQotCS8qKgotCSAqIHJldHVybnMgImNvcHkiIHNvIG5vIG9uZSBjYW4gbW9kaWZ5IG91ciBsaXN0LiBJdCBpcyBhIHNoYWxsb3cgY29weS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIENvbGxlY3Rpb24gZ2V0TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdChmTGlzdGVuZXJzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0QWRhcHRlcihJTm9kZUFkYXB0ZXIgYWRhcHRlciwgSU5vZGVOb3RpZmllciBub2RlKSB7Ci0JCUFzc2VydC5pc1RydWUoY21Eb2N1bWVudE1hbmFnZXIgPT0gbnVsbCk7Ci0JCUFzc2VydC5pc1RydWUoZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgPT0gbnVsbCk7Ci0KLQkJLy8gcmVnaXN0ZXIgZm9yIENNRG9jdW1lbnRNYW5hZ2VyIGV2ZW50cwotCQlNb2RlbFF1ZXJ5QWRhcHRlciBtcWFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpIG5vZGUuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCWlmIChtcWFkYXB0ZXIgIT0gbnVsbCkgewotCQkJTW9kZWxRdWVyeSBtcXVlcnkgPSBtcWFkYXB0ZXIuZ2V0TW9kZWxRdWVyeSgpOwotCQkJaWYgKChtcXVlcnkgIT0gbnVsbCkgJiYgKG1xdWVyeS5nZXRDTURvY3VtZW50TWFuYWdlcigpICE9IG51bGwpKSB7Ci0JCQkJY21Eb2N1bWVudE1hbmFnZXIgPSBtcXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKTsKLQkJCQlmQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciA9IG5ldyBDTURvY3VtZW50TWFuYWdlckxpc3RlbmVySW1wbCgpOwotCQkJCWNtRG9jdW1lbnRNYW5hZ2VyLmFkZExpc3RlbmVyKGZDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIGRlcmVnaXN0ZXIgZnJvbSBDTURvY3VtZW50TWFuYWdlciBldmVudHMKLQkJaWYgKChjbURvY3VtZW50TWFuYWdlciAhPSBudWxsKSAmJiAoZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgIT0gbnVsbCkpIHsKLQkJCWNtRG9jdW1lbnRNYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGZDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyKTsKLQkJfQotCQlmTGlzdGVuZXJzLmNsZWFyKCk7Ci0JCWlmIChzaW5nbGV0b25BZGFwdGVyICE9IG51bGwgJiYgc2luZ2xldG9uQWRhcHRlciBpbnN0YW5jZW9mIEpGYWNlTm9kZUFkYXB0ZXIpIHsKLQkJCVJlZnJlc2hTdHJ1Y3R1cmVKb2IgcmVmcmVzaEpvYiA9ICgoSkZhY2VOb2RlQWRhcHRlcikgc2luZ2xldG9uQWRhcHRlcikuZlJlZnJlc2hKb2I7Ci0JCQlpZiAocmVmcmVzaEpvYiAhPSBudWxsKSB7Ci0JCQkJcmVmcmVzaEpvYi5jYW5jZWwoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIpIHsKLQkJZkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjNTQ1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0KLS8qKgotICogQW4gSVRyZWVDb250ZW50UHJvdmlkZXIgZm9yIGEgVHJlZVZpZXdlcnMgdXNlZCB0byBkaXNwbGF5IERPTSBub2Rlcy4gVGhpcwotICogY29udGVudCBwcm92aWRlciB0YWtlcyBhbiBhZGFwdGVyIGZhY3RvcnkgdG8gY3JlYXRlIEpGYWNlIGFkYXB0ZXJzIGZvciB0aGUKLSAqIG5vZGVzIGluIHRoZSB0cmVlLgotICovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JcHVibGljIEpGYWNlTm9kZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdmlzdWFsIHBhcnQgdGhhdCBpcyB1c2luZyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgaXMgYWJvdXQgdG8gYmUKLQkgKiBkaXNwb3NlZC4gRGVhbGxvY2F0ZSBhbGwgYWxsb2NhdGVkIFNXVCByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKRmFjZSBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRhYmxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBhZGFwdGVyIGZvcgotCSAqLwotCXByb3RlY3RlZCBJSkZhY2VOb2RlQWRhcHRlciBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGUpIHsKLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKChJTm9kZU5vdGlmaWVyKSBhZGFwdGFibGUpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJSkZhY2VOb2RlQWRhcHRlcikgewotCQkJCXJldHVybiAoSUpGYWNlTm9kZUFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqZWN0KTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVGhlIHJvb3QgaXMgdXN1YWxseSBhbiBpbnN0YW5jZSBvZiBhbiBYTUxTdHJ1Y3R1cmVkTW9kZWwgaW4KLQkJLy8gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGV4dHJhY3QgdGhlIGRvY3VtZW50LgotCQlPYmplY3QgdG9wTm9kZSA9IG9iamVjdDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJdG9wTm9kZSA9ICgoSURPTU1vZGVsKSBvYmplY3QpLmdldERvY3VtZW50KCk7Ci0JCX0KLQotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcih0b3BOb2RlKTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRFbGVtZW50cyh0b3BOb2RlKTsKLQkJfQotCi0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqZWN0KTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqZWN0KTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5oYXNDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAoKG9sZElucHV0ICE9IG51bGwpICYmIChvbGRJbnB1dCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkTW9kZWwpKSB7Ci0JCQlJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkpICgoSVN0cnVjdHVyZWRNb2RlbCkgb2xkSW5wdXQpLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkucmVtb3ZlTGlzdGVuZXIodmlld2VyKTsKLQkJCX0KLQkJfQotCQlpZiAoKG5ld0lucHV0ICE9IG51bGwpICYmIChuZXdJbnB1dCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkTW9kZWwpKSB7Ci0JCQlJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkpICgoSVN0cnVjdHVyZWRNb2RlbCkgbmV3SW5wdXQpLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkuYWRkTGlzdGVuZXIodmlld2VyKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTY4ZGRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotCi0vKioKLSAqIEEgKGNvbHVtbikgbGFiZWwgcHJvdmlkZXIgYmFja2VkIGJ5IEpGYWNlTm9kZUFkYXB0ZXJzLgotICovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlTGFiZWxQcm92aWRlciBleHRlbmRzIENvbHVtbkxhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSkZhY2VOb2RlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKRmFjZSBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRhYmxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBhZGFwdGVyIGZvcgotCSAqLwotCXByb3RlY3RlZCBJSkZhY2VOb2RlQWRhcHRlciBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGUpIHsKLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKChJTm9kZU5vdGlmaWVyKSBhZGFwdGFibGUpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJSkZhY2VOb2RlQWRhcHRlcikgewotCQkJCXJldHVybiAoSUpGYWNlTm9kZUFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKGVsZW1lbnQpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0TGFiZWxJbWFnZShlbGVtZW50KTsKLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKGVsZW1lbnQpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0TGFiZWxUZXh0KGVsZW1lbnQpOwotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1JlZnJlc2hTdHJ1Y3R1cmVKb2IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9SZWZyZXNoU3RydWN0dXJlSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YzkzOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1JlZnJlc2hTdHJ1Y3R1cmVKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhpcyBqb2IgaG9sZHMgYSBxdWV1ZSBvZiB1cGRhdGVzIChhZmZlY3RlZCBub2RlcykgZm9yIG11bHRpcGxlIHN0cnVjdHVyZWQKLSAqIHZpZXdlcnMuIFdoZW4gYSBuZXcgcmVxdWVzdCBjb21lcyBpbiwgdGhlIGN1cnJlbnQgcnVuIGlzIGNhbmNlbGxlZCwgdGhlIG5ldwotICogcmVxdWVzdCBpcyBhZGRlZCB0byB0aGUgcXVldWUsIHRoZW4gdGhlIGpvYiBpcyByZS1zY2hlZHVsZWQuIFN1cHBvcnQgZm9yCi0gKiBtdWx0aXBsZSBzdHJ1Y3R1cmVkIHZpZXdlcnMgaXMgcmVxdWlyZWQgYmVjYXVzZSByZWZyZXNoIHVwZGF0ZXMgYXJlIHVzdWFsbHkKLSAqIHRyaWdnZXJlZCBieSBtb2RlbCBjaGFuZ2VzLCBhbmQgdGhlIG1vZGVsIG1heSBiZSB2aXNpYmxlIGluIG1vcmUgdGhhbiBvbmUKLSAqIHZpZXdlci4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotY2xhc3MgUmVmcmVzaFN0cnVjdHVyZUpvYiBleHRlbmRzIEpvYiB7Ci0KLQkvKiogZGVidWcgZmxhZyAqLwotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVBEQVRFX0RFTEFZID0gMzAwOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2RlYnVnL3JlZnJlc2hTdHJ1Y3R1cmUiKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRyA9ICh2YWx1ZSAhPSBudWxsKSAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyoqIExpc3Qgb2YgcmVmcmVzaCByZXF1ZXN0cyAoTm9kZXMpICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0IGZSZWZyZXNoZXM7Ci0JLyoqIExpc3Qgb2YgdXBkYXRlIHJlcXVlc3RzIChOb2RlcykgKi8KLQlwcml2YXRlIGZpbmFsIExpc3QgZlVwZGF0ZXM7Ci0JLyoqIExpc3Qgb2YgdXBkYXRlIHJlcXVlc3RzIChOb2RlcykgKi8KLQlwcml2YXRlIGZpbmFsIExpc3QgZlVwZGF0ZVByb3BlcnRpZXM7Ci0JLyoqIHRoZSBzdHJ1Y3R1cmVkIHZpZXdlcnMgKi8KLQlTZXQgZlJlZnJlc2hWaWV3ZXJzID0gbmV3IEhhc2hTZXQoMyk7Ci0JU2V0IGZVcGRhdGVWaWV3ZXJzID0gbmV3IEhhc2hTZXQoMyk7Ci0KLQlwdWJsaWMgUmVmcmVzaFN0cnVjdHVyZUpvYigpIHsKLQkJc3VwZXIoWE1MVUlNZXNzYWdlcy5yZWZyZXNob3V0bGluZV8wKTsKLQkJc2V0UHJpb3JpdHkoSm9iLkxPTkcpOwotCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCWZSZWZyZXNoZXMgPSBuZXcgQXJyYXlMaXN0KDUpOwotCQlmVXBkYXRlcyA9IG5ldyBBcnJheUxpc3QoNSk7Ci0JCWZVcGRhdGVQcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdCg1KTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZFVwZGF0ZVJlcXVlc3QoTm9kZSBuZXdOb2RlUmVxdWVzdCwgU3RyaW5nW10gdXBkYXRlUHJvcGVydGllcykgewotCQkvKgotCQkgKiBJZiB3ZSBnZXQgdG8gaGVyZSwgZWl0aGVyIGZyb20gZXhpc3RpbmcgcmVxdWVzdCBsaXN0IGJlaW5nIHplcm8KLQkJICogbGVuZ3RoLCBvciBubyBleGlzaXRuZyByZXF1ZXN0cyAibWF0Y2hlZCIgbmV3IHJlcXVlc3QsIHRoZW4gYWRkIHRoZQotCQkgKiBuZXcgcmVxdWVzdC4KLQkJICovCi0JCWZVcGRhdGVzLmFkZChuZXdOb2RlUmVxdWVzdCk7Ci0JCWZVcGRhdGVQcm9wZXJ0aWVzLmFkZCh1cGRhdGVQcm9wZXJ0aWVzKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZFVwZGF0ZVZpZXdlcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotCQlmVXBkYXRlVmlld2Vycy5hZGQodmlld2VyKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZFJlZnJlc2hSZXF1ZXN0KE5vZGUgbmV3Tm9kZVJlcXVlc3QpIHsKLQkJLyoKLQkJICogbm90ZTogdGhlIGNhbGxlciBtdXN0IE5PVCBwYXNzIGluIG51bGwgbm9kZSByZXF1ZXN0ICh3aGljaCwgc2luY2UKLQkJICogcHJpdmF0ZSBtZXRob2QsIHdlIGRvIG5vdCBuZWVkIHRvIGdhdXJkIGFnYWluc3QgaGVyZSwgYXMgbG9uZyBhcyB3ZQotCQkgKiBnYXVyZCBhZ2FpbnN0IGl0IGluIGNhbGxpbmcgbWV0aG9kLgotCQkgKi8KLQkJaW50IHNpemUgPSBmUmVmcmVzaGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU5vZGUgZXhpc3RpbmdOb2RlUmVxdWVzdCA9IChOb2RlKSBmUmVmcmVzaGVzLmdldChpKTsKLQkJCS8qCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3NDI3IElmIHdlCi0JCQkgKiBhbHJlYWR5IGhhdmUgYSByZXF1ZXN0IHdoaWNoIGVxdWFscyB0aGUgbmV3IHJlcXVlc3QsIGRpc2NhcmQKLQkJCSAqIHRoZSBuZXcgcmVxdWVzdAotCQkJICovCi0JCQlpZiAoZXhpc3RpbmdOb2RlUmVxdWVzdC5lcXVhbHMobmV3Tm9kZVJlcXVlc3QpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLyoKLQkJCSAqIElmIHdlIGFscmVhZHkgaGF2ZSBhIHJlcXVlc3Qgd2hpY2ggY29udGFpbnMgdGhlIG5ldyByZXF1ZXN0LAotCQkJICogZGlzY2FyZCB0aGUgbmV3IHJlcXVlc3QKLQkJCSAqLwotCQkJaWYgKGNvbnRhaW5zKGV4aXN0aW5nTm9kZVJlcXVlc3QsIG5ld05vZGVSZXF1ZXN0KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8qCi0JCQkgKiBJZiBuZXcgcmVxdWVzdCBjb250YWlucyBhbnkgZXhpc3RpbmcgcmVxdWVzdHMsIHJlcGxhY2UgaXQgd2l0aAotCQkJICogbmV3IHJlcXVlc3QuIElTU1VFOiB0ZWNobmljYWxseSwgd2Ugc2hvdWxkIHJlcGxhY2UgQUxMCi0JCQkgKiBjb250YWluZWQsIGV4aXN0aW5nIHJlcXVlc3RzIChzdWNoIGFzIGlmIG1hbnkgc2libGluZ3MgYWxyZWFkeQotCQkJICogcXVlJ2QgdXAgd2hlbiB0aGVpciBjb21tb24gcGFyZW50IGlzIHRoZW4gcmVxdWVzdGVkLCBidXQsIEknbQotCQkJICogbm90IHN1cmUgaWYgdGhhdCBvY2N1cnMgbXVjaCwgaW4gcHJhY3RpY2UsIG9yIGlmIHRoZXJlJ3MgYW4KLQkJCSAqIGFsZ29yaXRobSB0byBxdWlja2x5IGZpbmQgdGhlbSBhbGwuIEFjdHVhbGx5LCBJIGd1ZXNzIHdlIGNvdWxkCi0JCQkgKiBqdXN0IGdvIHRocm91Z2ggdGhlIF9yZXN0XyBvZiB0aGUgbGlzdCAoaSsxIHRvIHNpemUpIGFuZCByZW1vdmUKLQkJCSAqIGFueSB0aGF0IGFyZSBjb250YWluZWQgYnkgbmV3IHJlcXVlc3QgLi4uIGluIGZ1dHVyZSA6KSAuCi0JCQkgKi8KLQkJCWlmIChjb250YWlucyhuZXdOb2RlUmVxdWVzdCwgZXhpc3RpbmdOb2RlUmVxdWVzdCkpIHsKLQkJCQlmUmVmcmVzaGVzLnNldChpLCBuZXdOb2RlUmVxdWVzdCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCS8qCi0JCSAqIElmIHdlIGdldCB0byBoZXJlLCBlaXRoZXIgZnJvbSBleGlzdGluZyByZXF1ZXN0IGxpc3QgYmVpbmcgemVybwotCQkgKiBsZW5ndGgsIG9yIG5vIGV4aXNpdG5nIHJlcXVlc3RzICJtYXRjaGVkIiBuZXcgcmVxdWVzdCwgdGhlbiBhZGQgdGhlCi0JCSAqIG5ldyByZXF1ZXN0LgotCQkgKi8KLQkJZlJlZnJlc2hlcy5hZGQobmV3Tm9kZVJlcXVlc3QpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkUmVmcmVzaFZpZXdlcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotCQlmUmVmcmVzaFZpZXdlcnMuYWRkKHZpZXdlcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNjYW5jZWxpbmcoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNhbmNlbGluZygpIHsKLQkJZlVwZGF0ZXMuY2xlYXIoKTsKLQkJZlVwZGF0ZVZpZXdlcnMuY2xlYXIoKTsKLQkJc3VwZXIuY2FuY2VsaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogU2ltcGxlIGhpZXJhcmNoaWNhbCBjb250YWlubWVudCByZWxhdGlvbnNoaXAuIE5vdGUsIHRoaXMgbWV0aG9kIHJldHVybnMKLQkgKiAiZmFsc2UiIGlmIHRoZSB0d28gbm9kZXMgYXJlIGVxdWFsIQotCSAqIAotCSAqIEBwYXJhbSByb290Ci0JICogQHBhcmFtIHBvc3NpYmxlCi0JICogQHJldHVybiBpZiB0aGUgcm9vdCBpcyBwYXJlbnQgb2YgcG9zc2libGUsIHJldHVybiB0cnVlLCBvdGhlcndpc2UKLQkgKiAgICAgICAgIHJldHVybiBmYWxzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjb250YWlucyhOb2RlIHJvb3QsIE5vZGUgcG9zc2libGUpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVjdXJzaXZlIGNhbGwgdy8gcm9vdDogIiArIHJvb3QuZ2V0Tm9kZU5hbWUoKSArICIgYW5kIHBvc3NpYmxlOiAiICsgcG9zc2libGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gdGhlIGZvbGxvd2luZyBjaGVja3MgYXJlIGltcG9ydGFudAotCQkvLyAjZG9jdW1lbnQgbm9kZSB3aWxsIGJyZWFrIHRoZSBhbGdvcml0aG0gb3RoZXJ3aXNlCi0KLQkJLy8gY2FuJ3QgY29udGFpbiB0aGUgY2hpbGQgaWYgaXQncyBudWxsCi0JCWlmIChyb290ID09IG51bGwpIHsKLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmV0dXJuaW5nIGZhbHNlOiByb290IGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIG5vdGhpbmcgY2FuIGJlIHBhcmVudCBvZiBEb2N1bWVudCBub2RlCi0JCWlmIChwb3NzaWJsZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJldHVybmluZyBmYWxzZTogcG9zc2libGUgaXMgRG9jdW1lbnQgbm9kZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gZG9jdW1lbnQgY29udGFpbnMgZXZlcnl0aGluZwotCQlpZiAocm9vdCBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJldHVybmluZyB0cnVlOiByb290IGlzIERvY3VtZW50IG5vZGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyBjaGVjayBwYXJlbnRhZ2UKLQkJTm9kZSBjdXJyZW50ID0gcG9zc2libGU7Ci0JCS8vIGxvb3AgcGFyZW50cwotCQl3aGlsZSAoKGN1cnJlbnQgIT0gbnVsbCkgJiYgKGN1cnJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpKSB7Ci0JCQkvLyBmb3VuZCBpdAotCQkJaWYgKHJvb3QuZXF1YWxzKGN1cnJlbnQpKSB7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgISEhIGZvdW5kOiAiICsgcG9zc2libGUuZ2V0Tm9kZU5hbWUoKSArICIgaW4gc3ViZWxlbWVudCBvZjogIiArIHJvb3QuZ2V0Tm9kZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWN1cnJlbnQgPSBjdXJyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQkvLyBuZXZlciBmb3VuZCBpdAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCBtdXN0IGJlIG9uIFVJIHRocmVhZCBiZWNhdXNlIGl0J3Mgb24gYSBTV1Qgd2lkZ2V0LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvUmVmcmVzaChmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXJbXSB2aWV3ZXJzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVmcmVzaCBvbjogWyIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZpZXdlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCF2aWV3ZXJzW2ldLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCQkJdmlld2Vyc1tpXS5yZWZyZXNoKHRydWUpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJdmlld2Vyc1tpXS5yZWZyZXNoKG5vZGUsIHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAhISEgc2tpcHBlZCByZWZyZXNoaW5nIGRpc3Bvc2VkIHZpZXdlcjogIiArIHZpZXdlcnNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBtdXN0IGJlIG9uIFVJIHRocmVhZCBiZWNhdXNlIGl0J3Mgb24gYSBTV1Qgd2lkZ2V0LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvVXBkYXRlKGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXJbXSB2aWV3ZXJzLCBmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIFN0cmluZ1tdIHByb3BlcnRpZXMpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCk7Ci0JCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWZyZXNoIG9uOiBbIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmlld2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIXZpZXdlcnNbaV0uZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJdmlld2Vyc1tpXS51cGRhdGUobm9kZSwgcHJvcGVydGllcyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICEhISBza2lwcGVkIHJlZnJlc2hpbmcgZGlzcG9zZWQgdmlld2VyOiAiICsgdmlld2Vyc1tpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWxzbyBzeW5jaHJvbml6ZWQgYmVjYXVzZSBpdCBhY2Nlc3NlcyB0aGUgZlJlZnJlc2hlcyBxdWV1ZQotCSAqIGFuZCBmUmVmcmVzaFZpZXdlcnMgbGlzdAotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhbmQgYXJyYXkgb2YgdGhlIGN1cnJlbnRseSByZXF1ZXN0ZWQgTm9kZXMKLQkgKiAgICAgICAgIHRvIHJlZnJlc2ggYW5kIHRoZSB2aWV3ZXJzIGluIHdoaWNoIHRvIHJlZnJlc2ggdGhlbQotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIE9iamVjdFtdIGdldFJlZnJlc2hSZXF1ZXN0cygpIHsKLQkJTm9kZVtdIHRvUmVmcmVzaCA9IChOb2RlW10pIGZSZWZyZXNoZXMudG9BcnJheShuZXcgTm9kZVtmUmVmcmVzaGVzLnNpemUoKV0pOwotCQlmUmVmcmVzaGVzLmNsZWFyKCk7Ci0KLQkJU3RydWN0dXJlZFZpZXdlcltdIHZpZXdlcnMgPSAoU3RydWN0dXJlZFZpZXdlcltdKSBmUmVmcmVzaFZpZXdlcnMudG9BcnJheShuZXcgU3RydWN0dXJlZFZpZXdlcltmUmVmcmVzaFZpZXdlcnMuc2l6ZSgpXSk7Ci0JCWZSZWZyZXNoVmlld2Vycy5jbGVhcigpOwotCi0JCXJldHVybiBuZXcgT2JqZWN0W117dG9SZWZyZXNoLCB2aWV3ZXJzfTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhbHNvIHN5bmNocm9uaXplZCBiZWNhdXNlIGl0IGFjY2Vzc2VzIHRoZSBmVXBkYXRlcyBxdWV1ZQotCSAqIGFuZCBmVXBkYXRlVmlld2VycyBsaXN0Ci0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGFuZCBhcnJheSBvZiB0aGUgY3VycmVudGx5IHJlcXVlc3RlZCBOb2RlcwotCSAqICAgICAgICAgdG8gcmVmcmVzaCBhbmQgdGhlIHZpZXdlcnMgaW4gd2hpY2ggdG8gcmVmcmVzaCB0aGVtCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgT2JqZWN0W10gZ2V0VXBkYXRlUmVxdWVzdHMoKSB7Ci0JCU5vZGVbXSB0b1VwZGF0ZSA9IChOb2RlW10pIGZVcGRhdGVzLnRvQXJyYXkobmV3IE5vZGVbZlVwZGF0ZXMuc2l6ZSgpXSk7Ci0JCWZVcGRhdGVzLmNsZWFyKCk7Ci0KLQkJU3RydWN0dXJlZFZpZXdlcltdIHZpZXdlcnMgPSAoU3RydWN0dXJlZFZpZXdlcltdKSBmVXBkYXRlVmlld2Vycy50b0FycmF5KG5ldyBTdHJ1Y3R1cmVkVmlld2VyW2ZVcGRhdGVWaWV3ZXJzLnNpemUoKV0pOwotCQlmVXBkYXRlVmlld2Vycy5jbGVhcigpOwotCi0JCVN0cmluZ1tdW10gcHJvcGVydGllcyA9IChTdHJpbmdbXVtdKSBmVXBkYXRlUHJvcGVydGllcy50b0FycmF5KG5ldyBTdHJpbmdbZlVwZGF0ZVByb3BlcnRpZXMuc2l6ZSgpXVtdKTsKLQkJZlVwZGF0ZVByb3BlcnRpZXMuY2xlYXIoKTsKLQotCQlyZXR1cm4gbmV3IE9iamVjdFtde3RvVXBkYXRlLCB2aWV3ZXJzLCBwcm9wZXJ0aWVzfTsKLQl9Ci0KLQkvKioKLQkgKiBJbnZva2UgYSByZWZyZXNoIG9uIHRoZSB2aWV3ZXIgb24gdGhlIGdpdmVuIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyLCBOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYWRkUmVmcmVzaFZpZXdlcih2aWV3ZXIpOwotCQlhZGRSZWZyZXNoUmVxdWVzdChub2RlKTsKLQkJc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnZva2UgYSByZWZyZXNoIG9uIHRoZSB2aWV3ZXIgb24gdGhlIGdpdmVuIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIsIE5vZGUgbm9kZSwgU3RyaW5nW10gcHJvcGVydGllcykgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlhZGRVcGRhdGVWaWV3ZXIodmlld2VyKTsKLQkJYWRkVXBkYXRlUmVxdWVzdChub2RlLCBwcm9wZXJ0aWVzKTsKLQkJc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJdHJ5IHsKLQkJCXBlcmZvcm1VcGRhdGVzKCk7Ci0JCQkKLQkJCXBlcmZvcm1SZWZyZXNoZXMobW9uaXRvcik7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtUmVmcmVzaGVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBSZXRyaWV2ZSBCT1RIIHZpZXdlcnMgYW5kIE5vZGVzIG9uIG9uZSBibG9jawotCQlPYmplY3RbXSByZXF1ZXN0cyA9IGdldFJlZnJlc2hSZXF1ZXN0cygpOwotCQlOb2RlW10gbm9kZXMgPSAoTm9kZVtdKSByZXF1ZXN0c1swXTsKLQkJU3RydWN0dXJlZFZpZXdlcltdIHZpZXdlcnMgPSAoU3RydWN0dXJlZFZpZXdlcltdKSByZXF1ZXN0c1sxXTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWRvUmVmcmVzaChub2Rlc1tpXSwgdmlld2Vycyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybVVwZGF0ZXMoKSB7Ci0JCS8vIFJldHJpZXZlIEJPVEggdmlld2VycyBhbmQgTm9kZXMgb24gb25lIGJsb2NrCi0JCU9iamVjdFtdIHJlcXVlc3RzID0gZ2V0VXBkYXRlUmVxdWVzdHMoKTsKLQkJTm9kZVtdIG5vZGVzID0gKE5vZGVbXSkgcmVxdWVzdHNbMF07Ci0JCVN0cnVjdHVyZWRWaWV3ZXJbXSB2aWV3ZXJzID0gKFN0cnVjdHVyZWRWaWV3ZXJbXSkgcmVxdWVzdHNbMV07Ci0JCVN0cmluZ1tdW10gcHJvcGVydGllcyA9IChTdHJpbmdbXVtdKSByZXF1ZXN0c1syXTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlkb1VwZGF0ZSh2aWV3ZXJzLCBub2Rlc1tpXSwgcHJvcGVydGllc1tpXSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9YTUxOb2RlQWN0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1hNTE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NTgwNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1hNTE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgWE1MTm9kZUFjdGlvbk1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIHsKLQlwdWJsaWMgWE1MTm9kZUFjdGlvbk1hbmFnZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgVmlld2VyIHZpZXdlcikgewotCQlzdXBlcihtb2RlbCwgTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShtb2RlbCksIHZpZXdlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmb3JtYXQoTm9kZSBuZXdFbGVtZW50LCBib29sZWFuIGRlZXApIHsKLQkJdHJ5IHsKLQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcgbW9kZWwgY2hhbmdlCi0JCQlmTW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCS8vIGZvcm1hdCBzZWxlY3RlZCBub2RlCi0JCQlJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0JCQlmb3JtYXRQcm9jZXNzb3IuZm9ybWF0Tm9kZShuZXdFbGVtZW50KTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnIG1vZGVsIGNoYW5nZQotCQkJZk1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCQlmTW9kZWwgPSBuZXdNb2RlbDsKLQkJc2V0TW9kZWxRdWVyeShNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5ld01vZGVsKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kZWxRdWVyeShNb2RlbFF1ZXJ5IG5ld01vZGVsUXVlcnkpIHsKLQkJbW9kZWxRdWVyeSA9IG5ld01vZGVsUXVlcnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVyWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXJYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxMTA0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXJYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uLkNvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLQotLyoqCi0gKiBDb3JyZWN0aW9uIGFzc2lzdGFudCBmb3IgWE1MCi0gKiAKLSAqIEBkZXByZWNhdGVkIHNpbmNlIDIuMCBSQzAgVXNlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLSAqLwotcHVibGljIGNsYXNzIENvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlclhNTCBleHRlbmRzIENvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlciB7Ci0KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RhbnQgZ2V0Q29ycmVjdGlvbkFzc2lzdGFudChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlJQ29udGVudEFzc2lzdGFudCBjYSA9IG51bGw7Ci0KLQkJaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQlDb250ZW50QXNzaXN0YW50IGFzc2lzdGFudCA9IG5ldyBDb250ZW50QXNzaXN0YW50KCk7Ci0KLQkJCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGNvcnJlY3Rpb25Qcm9jZXNzb3IgPSBuZXcgQ29ycmVjdGlvblByb2Nlc3NvclhNTChzb3VyY2VWaWV3ZXIpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEEpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLlhNTF9DT01NRU5UKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5YTUxfREVDTEFSQVRJT04pOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLlhNTF9QSSk7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29ycmVjdGlvblByb2Nlc3NvciwgSVhNTFBhcnRpdGlvbnMuRFREX1NVQlNFVCk7Ci0JCQl9Ci0JCQljYSA9IGFzc2lzdGFudDsKLQkJfQotCi0JCXJldHVybiBjYTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvcnJlY3Rpb25Qcm9jZXNzb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvcnJlY3Rpb25Qcm9jZXNzb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdlNzNlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uUHJvY2Vzc29yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb24uSVF1aWNrQXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5JUXVpY2tGaXhQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uLlN0cnVjdHVyZWRDb3JyZWN0aW9uUHJvY2Vzc29yOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHNpbmNlIDIuMCBSQzAgVXNlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLSAqLwotcHVibGljIGNsYXNzIENvcnJlY3Rpb25Qcm9jZXNzb3JYTUwgZXh0ZW5kcyBTdHJ1Y3R1cmVkQ29ycmVjdGlvblByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIElRdWlja0Fzc2lzdFByb2Nlc3NvciBmUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci0JcHJvdGVjdGVkIElRdWlja0ZpeFByb2Nlc3NvciBmUXVpY2tGaXhQcm9jZXNzb3I7Ci0KLQlwdWJsaWMgQ29ycmVjdGlvblByb2Nlc3NvclhNTChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlzdXBlcihzb3VyY2VWaWV3ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJUXVpY2tBc3Npc3RQcm9jZXNzb3IgZ2V0UXVpY2tBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCWlmIChmUXVpY2tBc3Npc3RQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZlF1aWNrQXNzaXN0UHJvY2Vzc29yID0gbmV3IFF1aWNrQXNzaXN0UHJvY2Vzc29yWE1MKCk7Ci0JCX0KLQotCQlyZXR1cm4gZlF1aWNrQXNzaXN0UHJvY2Vzc29yOwotCX0KLQotCXByb3RlY3RlZCBJUXVpY2tGaXhQcm9jZXNzb3IgZ2V0UXVpY2tGaXhQcm9jZXNzb3IoKSB7Ci0JCWlmIChmUXVpY2tGaXhQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZlF1aWNrRml4UHJvY2Vzc29yID0gbmV3IFF1aWNrRml4UHJvY2Vzc29yWE1MKCk7Ci0JCX0KLQotCQlyZXR1cm4gZlF1aWNrRml4UHJvY2Vzc29yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0luc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9JbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDk0N2VkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0luc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLQotcHVibGljIGNsYXNzIEluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsIGltcGxlbWVudHMgSUNvbXBsZXRpb25Qcm9wb3NhbCwgSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIgewotCXByaXZhdGUgZmluYWwgTGlzdCBmUmVxdWlyZWRBdHRyczsKLQotCS8qKgotCSAqIEBwYXJhbSByZXF1aXJlZEF0dHJzCi0JICovCi0JcHVibGljIEluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsKExpc3QgcmVxdWlyZWRBdHRycykgewotCQlmUmVxdWlyZWRBdHRycyA9IHJlcXVpcmVkQXR0cnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNhcHBseShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseShJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gbm90IGltcGxlbWVudGVkPwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI2FwcGx5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBjaGFyLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseShJVGV4dFZpZXdlciB2aWV3ZXIsIGNoYXIgdHJpZ2dlciwgaW50IHN0YXRlTWFzaywgaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaW50IGluZGV4ID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMYXN0UmVnaW9uKCk7Ci0JCWlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCWluZGV4LS07Ci0JCQlsYXN0UmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXggLSAxKTsKLQkJfQotCQllbHNlIGlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCWluZGV4ID0gaW5kZXggLSAyOwotCQkJbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4IC0gMSk7Ci0JCX0KLQkJTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlJlcXVpcmVkQXR0cnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGZSZXF1aXJlZEF0dHJzLmdldChpKTsKLQkJCQlTdHJpbmcgcmVxdWlyZWRBdHRyaWJ1dGVOYW1lID0gYXR0ckRlY2wuZ2V0QXR0ck5hbWUoKTsKLQkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gYXR0ckRlY2wuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQkJaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCWRlZmF1bHRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCVN0cmluZyBuYW1lQW5kRGVmYXVsdFZhbHVlID0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKChpID09IDApICYmIChsYXN0UmVnaW9uLmdldExlbmd0aCgpID4gbGFzdFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpKSB7Ci0JCQkJCW5hbWVBbmREZWZhdWx0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQluYW1lQW5kRGVmYXVsdFZhbHVlICs9IHJlcXVpcmVkQXR0cmlidXRlTmFtZSArICI9XCIiICsgZGVmYXVsdFZhbHVlICsgIlwiIjsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCQltdWx0aVRleHRFZGl0LmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KGluZGV4LCBuYW1lQW5kRGVmYXVsdFZhbHVlKSk7Ci0JCQkJLy8gQlVHMzM4MTogTXVsdGlUZXh0RWRpdCBhcHBsaWVzIGFsbCBjaGlsZCBUZXh0RWRpdCdzIGJhc2luZwotCQkJCS8vIG9uIG9mZnNldHMKLQkJCQkvLyBpbiB0aGUgZG9jdW1lbnQgYmVmb3JlIHRoZSBmaXJzdCBUZXh0RWRpdCwgbm90IGFmdGVyIGVhY2gKLQkJCQkvLyBjaGlsZCBUZXh0RWRpdC4gVGhlcmVmb3JlLCBkbyBub3QgbmVlZCB0byBhZHZhbmNlIHRoZQotCQkJCS8vIGluZGV4LgotCQkJCS8vIGluZGV4ICs9IG5hbWVBbmREZWZhdWx0VmFsdWUubGVuZ3RoKCk7Ci0JCQl9Ci0JCQltdWx0aVRleHRFZGl0LmFwcGx5KHZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nLCBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCB0aGVyZSdzIHJlYXNvbnMgd2h5IHdlIGdldCBzb21lCi0JCQkvLyBoZXJlLgotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCXJldHVybiBYTUxVSU1lc3NhZ2VzLkluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsXzA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRDb250ZXh0SW5mb3JtYXRpb24oKQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uIGdldENvbnRleHRJbmZvcm1hdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXREaXNwbGF5U3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBYTUxVSU1lc3NhZ2VzLkluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsXzE7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQkvLyByZXR1cm4gSmF2YVBsdWdpbkltYWdlcy5nZXQoSmF2YVBsdWdpbkltYWdlcy5JTUdfQ09SUkVDVElPTl9MT0NBTCk7Ci0JCXJldHVybiBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FERF9DT1JSRUNUSU9OKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiNzZWxlY3RlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3RlZChJVGV4dFZpZXdlciB2aWV3ZXIsIGJvb2xlYW4gc21hcnRUb2dnbGUpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiN1bnNlbGVjdGVkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIpCi0JICovCi0JcHVibGljIHZvaWQgdW5zZWxlY3RlZChJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiN2YWxpZGF0ZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIGludCwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUHJvYmxlbUlEc1hNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUHJvYmxlbUlEc1hNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmViYmE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1Byb2JsZW1JRHNYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFByb2JsZW1JRHNYTUwgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5Qcm9ibGVtSURzWE1MIHsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1F1aWNrQXNzaXN0UHJvY2Vzc29yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9RdWlja0Fzc2lzdFByb2Nlc3NvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODZjNmM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1F1aWNrQXNzaXN0UHJvY2Vzc29yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uLklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01OYW1lZE5vZGVNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgc2luY2UgMi4wIFJDMCBVc2UKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucXVpY2thc3Npc3QuSVF1aWNrQXNzaXN0UHJvY2Vzc29yIGFuZCBYTUxRdWlja0Fzc2lzdFByb2Nlc3NvcgotICovCi1wdWJsaWMgY2xhc3MgUXVpY2tBc3Npc3RQcm9jZXNzb3JYTUwgaW1wbGVtZW50cyBJUXVpY2tBc3Npc3RQcm9jZXNzb3IgewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb3JyZWN0aW9uLklRdWlja0Fzc2lzdFByb2Nlc3NvciNjYW5Bc3Npc3Qob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5Bc3Npc3QoU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9wb3NhbHMKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIG9mZnNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdldEluc2VydFJlcXVpcmVkQXR0cnMoQXJyYXlMaXN0IHByb3Bvc2FscywgU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodmlld2VyLCBvZmZzZXQpOwotCQlpZiAoKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpICYmIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCQlJRE9NTm9kZSBjdXJzb3JOb2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJCQlMaXN0IHJlcXVpcmVkQXR0cnMgPSBnZXRSZXF1aXJlZEF0dHJzKGN1cnNvck5vZGUpOwotCQkJCWlmIChyZXF1aXJlZEF0dHJzLnNpemUoKSA+IDApIHsKLQkJCQkJTmFtZWROb2RlTWFwIGN1cnJlbnRBdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCQlMaXN0IGluc2VydEF0dHJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpZiAoY3VycmVudEF0dHJzLmdldExlbmd0aCgpID09IDApIHsKLQkJCQkJCWluc2VydEF0dHJzLmFkZEFsbChyZXF1aXJlZEF0dHJzKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWlyZWRBdHRycy5zaXplKCk7IGkrKykgewotCQkJCQkJCVN0cmluZyByZXF1aXJlZEF0dHJOYW1lID0gKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSByZXF1aXJlZEF0dHJzLmdldChpKSkuZ2V0QXR0ck5hbWUoKTsKLQkJCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjdXJyZW50QXR0cnMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJCQlTdHJpbmcgY3VycmVudEF0dHJOYW1lID0gY3VycmVudEF0dHJzLml0ZW0oaikuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJCQkJaWYgKHJlcXVpcmVkQXR0ck5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShjdXJyZW50QXR0ck5hbWUpID09IDApIHsKLQkJCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghZm91bmQpIHsKLQkJCQkJCQkJaW5zZXJ0QXR0cnMuYWRkKHJlcXVpcmVkQXR0cnMuZ2V0KGkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGluc2VydEF0dHJzLnNpemUoKSA+IDApIHsKLQkJCQkJCXByb3Bvc2Fscy5hZGQobmV3IEluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsKGluc2VydEF0dHJzKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvcG9zYWxzCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZXRMb2NhbFJlbmFtZVF1aWNrQXNzaXN0UHJvcG9zYWwoQXJyYXlMaXN0IHByb3Bvc2FscywgU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodmlld2VyLCBvZmZzZXQpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZSA9PSBudWxsID8gbnVsbCA6IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlID09IG51bGwgPyBudWxsIDogbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlpbnQgcmVnaW9uVGV4dEVuZE9mZnNldCA9IDA7Ci0JCWlmICgoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgJiYgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJcmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCXJlZ2lvblRleHRFbmRPZmZzZXQgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAoKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSAmJiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJcmVnaW9uID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlyZWdpb25UZXh0RW5kT2Zmc2V0ID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKTsKLQkJfQotCi0JCWlmICgocmVnaW9uICE9IG51bGwpICYmICgocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgfHwgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSkgJiYgKG9mZnNldCA8PSByZWdpb25UZXh0RW5kT2Zmc2V0KSkgewotCQkJcHJvcG9zYWxzLmFkZChuZXcgUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbCgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlyZXR1cm4gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoRG9jdW1lbnQpIG5vZGUpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvcnJlY3Rpb24uSVF1aWNrQXNzaXN0UHJvY2Vzc29yI2dldFByb3Bvc2FscyhvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0UHJvcG9zYWxzKFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBcnJheUxpc3QgcHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWdldExvY2FsUmVuYW1lUXVpY2tBc3Npc3RQcm9wb3NhbChwcm9wb3NhbHMsIHZpZXdlciwgb2Zmc2V0KTsKLQkJZ2V0U3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWwocHJvcG9zYWxzLCB2aWV3ZXIsIG9mZnNldCk7Ci0JCWdldEluc2VydFJlcXVpcmVkQXR0cnMocHJvcG9zYWxzLCB2aWV3ZXIsIG9mZnNldCk7Ci0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIHByb3Bvc2Fscy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Byb3Bvc2Fscy5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRSZXF1aXJlZEF0dHJzKE5vZGUgbm9kZSkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBnZXRNb2RlbFF1ZXJ5KG5vZGUpOwotCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIG5vZGUpOwotCQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCQlDTU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gZWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpOwotCi0JCQkJQ01OYW1lZE5vZGVNYXBJbXBsIGFsbEF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKGF0dHJNYXApOwotCQkJCUxpc3Qgbm9kZXMgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBdmFpbGFibGVDb250ZW50KChFbGVtZW50KW5vZGUsIGVsZW1lbnREZWNsLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBub2Rlcy5zaXplKCk7IGsrKykgewotCQkJCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgbm9kZXMuZ2V0KGspOwotCQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQkJYWxsQXR0cmlidXRlcy5wdXQoY21ub2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlhdHRyTWFwID0gYWxsQXR0cmlidXRlczsKLQkJCQkKLQkJCQlJdGVyYXRvciBpdCA9IGF0dHJNYXAuaXRlcmF0b3IoKTsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBudWxsOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJYXR0ciA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChhdHRyLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCQkJcmVzdWx0LmFkZChhdHRyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb3Bvc2FscwotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2V0U3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWwoQXJyYXlMaXN0IHByb3Bvc2FscywgU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodmlld2VyLCBvZmZzZXQpOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlwcm9wb3NhbHMuYWRkKG5ldyBTdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbCgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1F1aWNrRml4UHJvY2Vzc29yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9RdWlja0ZpeFByb2Nlc3NvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDA4MjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1F1aWNrRml4UHJvY2Vzc29yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5JUXVpY2tGaXhQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuVGVtcG9yYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5Qcm9ibGVtSURzWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgc2luY2UgMi4wIFJDMCBVc2UKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucXVpY2thc3Npc3QuSVF1aWNrQXNzaXN0UHJvY2Vzc29yOwotICovCi1wdWJsaWMgY2xhc3MgUXVpY2tGaXhQcm9jZXNzb3JYTUwgaW1wbGVtZW50cyBJUXVpY2tGaXhQcm9jZXNzb3IgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvcnJlY3Rpb24uSVF1aWNrRml4UHJvY2Vzc29yI2NhbkZpeChpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRml4KEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgVGVtcG9yYXJ5QW5ub3RhdGlvbikgewotCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiB0ZW1wQW5ub3RhdGlvbiA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSBhbm5vdGF0aW9uOwotCQkJaW50IHByb2JsZW1JRCA9IHRlbXBBbm5vdGF0aW9uLmdldFByb2JsZW1JRCgpOwotCQkJc3dpdGNoIChwcm9ibGVtSUQpIHsKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuRW1wdHlUYWcgOgotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5NaXNzaW5nRW5kVGFnIDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuQXR0cnNJbkVuZFRhZyA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdBdHRyVmFsdWUgOgotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5Ob0F0dHJWYWx1ZSA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVRhZ05hbWUgOgotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5TcGFjZXNCZWZvcmVQSSA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk5hbWVzcGFjZUluUEkgOgotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5Vbmtub3duRWxlbWVudCA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlVua25vd25BdHRyIDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuSW52YWxpZEF0dHJWYWx1ZSA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdSZXF1aXJlZEF0dHIgOgotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5BdHRyVmFsdWVOb3RRdW90ZWQgOgotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5NaXNzaW5nQ2xvc2luZ0JyYWNrZXQgOgotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCS8vIHJldHVybgotCQkvLyBKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19DT1JSRUNUSU9OX0NIQU5HRSk7Ci0JCXJldHVybiBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NPUlJFQ1RJT05fQ0hBTkdFKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29ycmVjdGlvbi5JUXVpY2tGaXhQcm9jZXNzb3IjZ2V0UHJvcG9zYWxzKG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlRlbXBvcmFyeUFubm90YXRpb24pCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRQcm9wb3NhbHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFycmF5TGlzdCBwcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBUZW1wb3JhcnlBbm5vdGF0aW9uKSB7Ci0JCQlUZW1wb3JhcnlBbm5vdGF0aW9uIHRlbXBBbm5vdGF0aW9uID0gKFRlbXBvcmFyeUFubm90YXRpb24pIGFubm90YXRpb247Ci0JCQlpbnQgcHJvYmxlbUlEID0gdGVtcEFubm90YXRpb24uZ2V0UHJvYmxlbUlEKCk7Ci0JCQlzd2l0Y2ggKHByb2JsZW1JRCkgewotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5FbXB0eVRhZyA6Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8wLCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5NaXNzaW5nRW5kVGFnIDoKLQkJCQkJU3RyaW5nIHRhZ05hbWUgPSAoU3RyaW5nKSAoKE9iamVjdFtdKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpKVswXTsKLQkJCQkJU3RyaW5nIHRhZ0Nsb3NlID0gKFN0cmluZykgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbMV07Ci0JCQkJCWludCB0YWdDbG9zZU9mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbMl0pLmludFZhbHVlKCk7Ci0JCQkJCWludCBzdGFydFRhZ0VuZE9mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbM10pLmludFZhbHVlKCk7Ci0JCQkJCWludCBmaXJzdENoaWxkU3RhcnRPZmZzZXQgPSAoKEludGVnZXIpICgoT2JqZWN0W10pIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCkpWzRdKS5pbnRWYWx1ZSgpOwotCQkJCQlpbnQgZW5kT2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpKVs1XSkuaW50VmFsdWUoKTsKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKHRhZ0Nsb3NlLCB0YWdDbG9zZU9mZnNldCwgMCwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8xLCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIAotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCksIHN0YXJ0VGFnRW5kT2Zmc2V0IC0gdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8yLCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiPC8iICsgdGFnTmFtZSArICI+IiwgZmlyc3RDaGlsZFN0YXJ0T2Zmc2V0LCAwLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzMsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIjwvIiArIHRhZ05hbWUgKyAiPiIsIGVuZE9mZnNldCwgMCwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF80LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLkF0dHJzSW5FbmRUYWcgOgotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCksIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfNSwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCQlicmVhazsKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuTWlzc2luZ0F0dHJWYWx1ZSA6Ci0JCQkJCVN0cmluZyBkZWZhdWx0QXR0clZhbHVlID0gKFN0cmluZykgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbMF07Ci0JCQkJCWludCBpbnNlcnRPZmZzZXQgPSAoKEludGVnZXIpICgoT2JqZWN0W10pIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCkpWzFdKS5pbnRWYWx1ZSgpOwotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIlwiIiArIGRlZmF1bHRBdHRyVmFsdWUgKyAiXCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpICsgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSArIGluc2VydE9mZnNldCwgMCwgZGVmYXVsdEF0dHJWYWx1ZS5sZW5ndGgoKSArIDIsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfNiwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCi0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF83LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5Ob0F0dHJWYWx1ZSA6Ci0JCQkJCWRlZmF1bHRBdHRyVmFsdWUgPSAoU3RyaW5nKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpOwotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIj1cIiIgKyBkZWZhdWx0QXR0clZhbHVlICsgIlwiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSArIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIDAsIGRlZmF1bHRBdHRyVmFsdWUubGVuZ3RoKCkgKyAzLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzYsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCksIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfNywgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCQlicmVhazsKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuU3BhY2VzQmVmb3JlVGFnTmFtZSA6Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF84LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5TcGFjZXNCZWZvcmVQSSA6Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF85LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5OYW1lc3BhY2VJblBJIDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzEwLCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5Vbmtub3duRWxlbWVudCA6Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IFJlbW92ZVVua25vd25FbGVtZW50UXVpY2tGaXhQcm9wb3NhbCh0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzExKSk7Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IFJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWwoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5Vbmtub3duQXR0ciA6Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF83LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IFJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWwoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5JbnZhbGlkQXR0clZhbHVlIDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzEyLCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5NaXNzaW5nUmVxdWlyZWRBdHRyIDoKLQkJCQkJU3RyaW5nIHJlcXVpcmVkQXR0ciA9IChTdHJpbmcpICgoT2JqZWN0W10pIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCkpWzBdOwotCQkJCQlpbnNlcnRPZmZzZXQgPSAoKEludGVnZXIpICgoT2JqZWN0W10pIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCkpWzFdKS5pbnRWYWx1ZSgpOwotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwocmVxdWlyZWRBdHRyLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpICsgaW5zZXJ0T2Zmc2V0LCAwLCByZXF1aXJlZEF0dHIubGVuZ3RoKCksIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTMsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5BdHRyVmFsdWVOb3RRdW90ZWQgOgotCQkJCQlTdHJpbmcgYXR0clZhbHVlID0gKFN0cmluZykgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKTsKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCJcIiIgKyBhdHRyVmFsdWUgKyAiXCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCBhdHRyVmFsdWUubGVuZ3RoKCkgKyAyLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzE0LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdDbG9zaW5nQnJhY2tldCA6Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiPiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCkgKyB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCAxLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzE1LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIHByb3Bvc2Fscy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Byb3Bvc2Fscy5zaXplKCldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9SZW1vdmVVbmtub3duRWxlbWVudFF1aWNrRml4UHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1JlbW92ZVVua25vd25FbGVtZW50UXVpY2tGaXhQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODdhMmM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1JlbW92ZVVua25vd25FbGVtZW50UXVpY2tGaXhQcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuRGVsZXRlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFJlbW92ZVVua25vd25FbGVtZW50UXVpY2tGaXhQcm9wb3NhbCBpbXBsZW1lbnRzIElDb21wbGV0aW9uUHJvcG9zYWwsIElDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yIHsKLQlwcml2YXRlIE9iamVjdCBmQWRkaXRpb25hbEZpeEluZm8gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZEaXNwbGF5U3RyaW5nOwotCXByaXZhdGUgSW1hZ2UgZkltYWdlOwotCXByaXZhdGUgUG9pbnQgZlNlbGVjdGlvbjsgLy8gaW5pdGlhbGl6ZWQgYnkgYXBwbHkoKQotCi0JcHVibGljIFJlbW92ZVVua25vd25FbGVtZW50UXVpY2tGaXhQcm9wb3NhbChPYmplY3QgYWRkaXRpb25hbEZpeEluZm8sIEltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZykgewotCQlmQWRkaXRpb25hbEZpeEluZm8gPSBhZGRpdGlvbmFsRml4SW5mbzsKLQkJZkltYWdlID0gaW1hZ2U7Ci0JCWZEaXNwbGF5U3RyaW5nID0gZGlzcGxheVN0cmluZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2FwcGx5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBub3QgaW1wbGVtZW50ZWQ/Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGNoYXIsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCWludCBzdGFydFRhZ09mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgZkFkZGl0aW9uYWxGaXhJbmZvKVswXSkuaW50VmFsdWUoKTsKLQkJaW50IHN0YXJ0VGFnTGVuZ3RoID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzFdKS5pbnRWYWx1ZSgpOwotCQlpbnQgZW5kVGFnT2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzJdKS5pbnRWYWx1ZSgpOwotCQlpbnQgZW5kVGFnTGVuZ3RoID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzNdKS5pbnRWYWx1ZSgpOwotCi0JCU11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCWlmIChlbmRUYWdPZmZzZXQgIT0gLTEpIHsKLQkJCW11bHRpVGV4dEVkaXQuYWRkQ2hpbGQobmV3IERlbGV0ZUVkaXQoZW5kVGFnT2Zmc2V0LCBlbmRUYWdMZW5ndGgpKTsKLQkJCWZTZWxlY3Rpb24gPSBuZXcgUG9pbnQoZW5kVGFnT2Zmc2V0LCAwKTsKLQkJfQotCQlpZiAoc3RhcnRUYWdPZmZzZXQgIT0gLTEpIHsKLQkJCW11bHRpVGV4dEVkaXQuYWRkQ2hpbGQobmV3IERlbGV0ZUVkaXQoc3RhcnRUYWdPZmZzZXQsIHN0YXJ0VGFnTGVuZ3RoKSk7Ci0JCQlmU2VsZWN0aW9uID0gbmV3IFBvaW50KHN0YXJ0VGFnT2Zmc2V0LCAwKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQltdWx0aVRleHRFZGl0LmFwcGx5KHZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIGZpbmQgcmVhc29ucyBub3QgdG8uCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3MgZmluZCByZWFzb25zIG5vdCB0by4KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldENvbnRleHRJbmZvcm1hdGlvbigpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb24gZ2V0Q29udGV4dEluZm9ybWF0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldERpc3BsYXlTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZygpIHsKLQkJaWYgKGZEaXNwbGF5U3RyaW5nID09IG51bGwpIHsKLQkJCWZEaXNwbGF5U3RyaW5nID0gWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8xMTsKLQkJfQotCi0JCXJldHVybiBmRGlzcGxheVN0cmluZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBmSW1hZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIFBvaW50IGdldFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJcmV0dXJuIGZTZWxlY3Rpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjc2VsZWN0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0ZWQoSVRleHRWaWV3ZXIgdmlld2VyLCBib29sZWFuIHNtYXJ0VG9nZ2xlKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjdW5zZWxlY3RlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2VsZWN0ZWQoSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjdmFsaWRhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBpbnQsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjk5ZjI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1JlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5MaW5rZWRQb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkUG9zaXRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IubGluay5FZGl0b3JMaW5rZWRNb2RlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLXB1YmxpYyBjbGFzcyBSZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsIGltcGxlbWVudHMgSUNvbXBsZXRpb25Qcm9wb3NhbCwgSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIgewotCXByb3RlY3RlZCBJUmVnaW9uIGZTZWxlY3RlZFJlZ2lvbjsgLy8gaW5pdGlhbGl6ZWQgYnkgYXBwbHkoKQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNhcHBseShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseShJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiNhcHBseShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgY2hhciwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSVRleHRWaWV3ZXIgdmlld2VyLCBjaGFyIHRyaWdnZXIsIGludCBzdGF0ZU1hc2ssIGludCBvZmZzZXQpIHsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCUxpbmtlZFBvc2l0aW9uR3JvdXAgZ3JvdXAgPSBuZXcgTGlua2VkUG9zaXRpb25Hcm91cCgpOwotCQl0cnkgewotCQkJCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodmlld2VyLCBvZmZzZXQpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpID8gbnVsbCA6IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWdyb3VwLmFkZFBvc2l0aW9uKG5ldyBMaW5rZWRQb3NpdGlvbihkb2N1bWVudCwgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRTdGFydCgpLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpLCAwKSk7Ci0KLQkJCQkJaWYgKChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSAmJiAobm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSkgewotCQkJCQkJcmVnaW9uID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJZ3JvdXAuYWRkUG9zaXRpb24obmV3IExpbmtlZFBvc2l0aW9uKGRvY3VtZW50LCBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCkgKyByZWdpb24uZ2V0U3RhcnQoKSwgcmVnaW9uLmdldFRleHRMZW5ndGgoKSwgMSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCXJlZ2lvbiA9IChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgPyBudWxsIDogZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQkJaWYgKChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSAmJiAobm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpKSB7Ci0JCQkJCQkJSVRleHRSZWdpb24gc3RhcnRUYWdOYW1lUmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCWdyb3VwLmFkZFBvc2l0aW9uKG5ldyBMaW5rZWRQb3NpdGlvbihkb2N1bWVudCwgbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCkgKyBzdGFydFRhZ05hbWVSZWdpb24uZ2V0U3RhcnQoKSwgc3RhcnRUYWdOYW1lUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgMCkpOwotCQkJCQkJCQlncm91cC5hZGRQb3NpdGlvbihuZXcgTGlua2VkUG9zaXRpb24oZG9jdW1lbnQsIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFN0YXJ0KCksIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIDEpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlncm91cC5hZGRQb3NpdGlvbihuZXcgTGlua2VkUG9zaXRpb24oZG9jdW1lbnQsIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFN0YXJ0KCksIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIDApKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIFRPRE8gQ29tcGxldGlvblByb3Bvc2FsUG9wdXAjaW5zZXJ0UHJvcG9zYWwoKSBjYWxscwotCQkJCS8vIElSZXdyaXRlVGFyZ2V0LmJlZ2luQ29tcG91bmRDaGFuZ2UoKQotCQkJCS8vIHdoaWNoIGRpc2FibGVzIHJlZHJhdyBpbiBJVGV4dFZpZXdlci4gV29ya2Fyb3VuZCBmb3Igbm93LgotCQkJCWlmKHZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uKQotCQkJCQkoKElUZXh0Vmlld2VyRXh0ZW5zaW9uKSB2aWV3ZXIpLnNldFJlZHJhdyh0cnVlKTsKLQotCQkJTGlua2VkTW9kZU1vZGVsIGxpbmtlZE1vZGVNb2RlbCA9IG5ldyBMaW5rZWRNb2RlTW9kZWwoKTsKLQkJCWxpbmtlZE1vZGVNb2RlbC5hZGRHcm91cChncm91cCk7Ci0JCQlsaW5rZWRNb2RlTW9kZWwuZm9yY2VJbnN0YWxsKCk7Ci0KLQkJCUxpbmtlZE1vZGVVSSB1aSA9IG5ldyBFZGl0b3JMaW5rZWRNb2RlVUkobGlua2VkTW9kZU1vZGVsLCB2aWV3ZXIpOwotCQkJdWkuc2V0RXhpdFBvc2l0aW9uKHZpZXdlciwgb2Zmc2V0LCAwLCBMaW5rZWRQb3NpdGlvbkdyb3VwLk5PX1NUT1ApOwotCQkJdWkuZW50ZXIoKTsKLQotCQkJZlNlbGVjdGVkUmVnaW9uID0gdWkuZ2V0U2VsZWN0ZWRSZWdpb24oKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5SZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsXzA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRDb250ZXh0SW5mb3JtYXRpb24oKQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uIGdldENvbnRleHRJbmZvcm1hdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXREaXNwbGF5U3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBYTUxVSU1lc3NhZ2VzLlJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWxfMTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCS8vIHJldHVybiBKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19DT1JSRUNUSU9OX0xPQ0FMKTsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfTE9DQUxfVkFSSUFCTEUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXJldHVybiBuZXcgUG9pbnQoZlNlbGVjdGVkUmVnaW9uLmdldE9mZnNldCgpLCBmU2VsZWN0ZWRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3NlbGVjdGVkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGVkKElUZXh0Vmlld2VyIHZpZXdlciwgYm9vbGVhbiBzbWFydFRvZ2dsZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3Vuc2VsZWN0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNlbGVjdGVkKElUZXh0Vmlld2VyIHZpZXdlcikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgaW50LCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1N1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9TdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTg0NTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1N1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5MaW5rZWRQb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkUG9zaXRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5JbnNlcnRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5saW5rLkVkaXRvckxpbmtlZE1vZGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFN1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsIGV4dGVuZHMgUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTkFNRSA9ICJlbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI2FwcGx5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBjaGFyLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseShJVGV4dFZpZXdlciB2aWV3ZXIsIGNoYXIgdHJpZ2dlciwgaW50IHN0YXRlTWFzaywgaW50IG9mZnNldCkgewotCQl0cnkgewotCQkJaW50IHN0YXJ0VGFnT2Zmc2V0ID0gb2Zmc2V0OwotCQkJaW50IGVuZFRhZ09mZnNldCA9IG9mZnNldCArIHZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCkueTsKLQotCQkJLy8gc3Vycm91bmQgdGhlIG5vZGUgaWYgbm8gc2VsZWN0aW9uCi0JCQlpZiAoc3RhcnRUYWdPZmZzZXQgPT0gZW5kVGFnT2Zmc2V0KSB7Ci0JCQkJSURPTU5vZGUgY3Vyc29yTm9kZSA9IChJRE9NTm9kZSkgQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdCh2aWV3ZXIsIG9mZnNldCk7Ci0JCQkJLy8gdXNlIHBhcmVudCBub2RlIGlmIHRleHQgbm9kZSBpcyBlbXB0eQotCQkJCWlmICgoY3Vyc29yTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAoY3Vyc29yTm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQkJY3Vyc29yTm9kZSA9IChJRE9NTm9kZSkgY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJfQotCi0JCQkJc3RhcnRUYWdPZmZzZXQgPSBjdXJzb3JOb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJZW5kVGFnT2Zmc2V0ID0gY3Vyc29yTm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCX0KLQotCQkJLy8gaW5zZXJ0IG5ldyBlbGVtZW50Ci0JCQlNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQkJLy8gZWxlbWVudCB0YWcgbmFtZSBjYW5ub3QgYmUgREJDUywgZG8gbm90IHRyYW5zbGF0ZSAiPGVsZW1lbnQ+IgotCQkJLy8gYW5kICI8L2VsZW1lbnQ+IgotCQkJZmluYWwgU3RyaW5nIHN0YXJ0RWxlbWVudCA9ICI8IiArIEVMRU1FTlRfTkFNRSArICI+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQltdWx0aVRleHRFZGl0LmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KHN0YXJ0VGFnT2Zmc2V0LCBzdGFydEVsZW1lbnQpKTsKLQkJCW11bHRpVGV4dEVkaXQuYWRkQ2hpbGQobmV3IEluc2VydEVkaXQoZW5kVGFnT2Zmc2V0LCAiPC8iK0VMRU1FTlRfTkFNRSArIj4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbXVsdGlUZXh0RWRpdC5hcHBseSh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlQb3NpdGlvbiBzdGFydCA9IG5ldyBQb3NpdGlvbihzdGFydFRhZ09mZnNldCk7Ci0JCQlQb3NpdGlvbiBlbmQgPSBuZXcgUG9zaXRpb24oZW5kVGFnT2Zmc2V0ICsgc3RhcnRFbGVtZW50Lmxlbmd0aCgpKTsKLQotCQkJdHJ5IHsKLQkJCQl2aWV3ZXIuZ2V0RG9jdW1lbnQoKS5hZGRQb3NpdGlvbihzdGFydCk7Ci0JCQkJdmlld2VyLmdldERvY3VtZW50KCkuYWRkUG9zaXRpb24oZW5kKTsKLQotCQkJCS8vIGdldCBuZXcgZWxlbWVudCBub2RlCi0JCQkJSURPTU5vZGUgbmV3RWxlbWVudE5vZGUgPSAoSURPTU5vZGUpIENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodmlld2VyLCBzdGFydFRhZ09mZnNldCk7Ci0JCQkJSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotCQkJCWZvcm1hdFByb2Nlc3Nvci5mb3JtYXROb2RlKG5ld0VsZW1lbnROb2RlKTsKLQotCQkJCS8vIHJlbmFtZSBuZXcgZWxlbWVudAotCQkJCWFwcGx5KHZpZXdlciwgdHJpZ2dlciwgc3RhdGVNYXNrLCBzdGFydCwgZW5kLCBFTEVNRU5UX05BTUUubGVuZ3RoKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl2aWV3ZXIuZ2V0RG9jdW1lbnQoKS5yZW1vdmVQb3NpdGlvbihzdGFydCk7Ci0JCQkJdmlld2VyLmdldERvY3VtZW50KCkucmVtb3ZlUG9zaXRpb24oZW5kKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9IAotCX0KLQotCXByaXZhdGUgdm9pZCBhcHBseShJVGV4dFZpZXdlciB2aWV3ZXIsIGNoYXIgdHJpZ2dlciwgaW50IHN0YXRlTWFzaywgUG9zaXRpb24gc3RhcnQsIFBvc2l0aW9uIGVuZCwgaW50IGxlbmd0aCkgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJTGlua2VkUG9zaXRpb25Hcm91cCBncm91cCA9IG5ldyBMaW5rZWRQb3NpdGlvbkdyb3VwKCk7Ci0JCXRyeSB7Ci0JCQkJZ3JvdXAuYWRkUG9zaXRpb24obmV3IExpbmtlZFBvc2l0aW9uKGRvY3VtZW50LCBzdGFydC5vZmZzZXQgKyAxLCBsZW5ndGgsIDApKTsgLy8gb2Zmc2V0IGJ5IDEgZm9yIDwKLQkJCQlncm91cC5hZGRQb3NpdGlvbihuZXcgTGlua2VkUG9zaXRpb24oZG9jdW1lbnQsIGVuZC5vZmZzZXQgKyAyLCBsZW5ndGgsIDEpKTsgLy8gb2Zmc2V0IGJ5IDIgZm9yIDwvCi0JCQkKLQkJCWlmKHZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uKQotCQkJCSgoSVRleHRWaWV3ZXJFeHRlbnNpb24pIHZpZXdlcikuc2V0UmVkcmF3KHRydWUpOwotCi0JCQlMaW5rZWRNb2RlTW9kZWwgbGlua2VkTW9kZU1vZGVsID0gbmV3IExpbmtlZE1vZGVNb2RlbCgpOwotCQkJbGlua2VkTW9kZU1vZGVsLmFkZEdyb3VwKGdyb3VwKTsKLQkJCWxpbmtlZE1vZGVNb2RlbC5mb3JjZUluc3RhbGwoKTsKLQkKLQkJCUxpbmtlZE1vZGVVSSB1aSA9IG5ldyBFZGl0b3JMaW5rZWRNb2RlVUkobGlua2VkTW9kZU1vZGVsLCB2aWV3ZXIpOwotCQkJdWkuc2V0RXhpdFBvc2l0aW9uKHZpZXdlciwgc3RhcnQub2Zmc2V0LCAwLCBMaW5rZWRQb3NpdGlvbkdyb3VwLk5PX1NUT1ApOwotCQkJdWkuZW50ZXIoKTsKLQkKLQkJCWZTZWxlY3RlZFJlZ2lvbiA9IHVpLmdldFNlbGVjdGVkUmVnaW9uKCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3MgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJcmV0dXJuIFhNTFVJTWVzc2FnZXMuU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWxfMDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldERpc3BsYXlTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIFhNTFVJTWVzc2FnZXMuU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWxfMTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCS8vIHJldHVybiBKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19DT1JSRUNUSU9OX0xPQ0FMKTsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQUREX0NPUlJFQ1RJT04pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1hNTFF1aWNrQXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9YTUxRdWlja0Fzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjQ5ZTk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1hNTFF1aWNrQXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01OYW1lZE5vZGVNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBYTUxRdWlja0Fzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElRdWlja0Fzc2lzdFByb2Nlc3NvciB7Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5Bc3Npc3QoSVF1aWNrQXNzaXN0SW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRml4KEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlUXVpY2tBc3Npc3RQcm9wb3NhbHMoSVF1aWNrQXNzaXN0SW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQpIHsKLQkJTGlzdCBwcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZ2V0TG9jYWxSZW5hbWVRdWlja0Fzc2lzdFByb3Bvc2FsKHByb3Bvc2FscywgaW52b2NhdGlvbkNvbnRleHQuZ2V0U291cmNlVmlld2VyKCksIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpKTsKLQkJZ2V0U3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWwocHJvcG9zYWxzLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRTb3VyY2VWaWV3ZXIoKSwgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCkpOwotCQlnZXRJbnNlcnRSZXF1aXJlZEF0dHJzKHByb3Bvc2FscywgaW52b2NhdGlvbkNvbnRleHQuZ2V0U291cmNlVmlld2VyKCksIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpKTsKLQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgcHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0SW5zZXJ0UmVxdWlyZWRBdHRycyhMaXN0IHByb3Bvc2FscywgSVNvdXJjZVZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSAmJiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQkJSURPTU5vZGUgY3Vyc29yTm9kZSA9IChJRE9NTm9kZSkgZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJCQlMaXN0IHJlcXVpcmVkQXR0cnMgPSBnZXRSZXF1aXJlZEF0dHJzKGN1cnNvck5vZGUpOwotCQkJCWlmIChyZXF1aXJlZEF0dHJzLnNpemUoKSA+IDApIHsKLQkJCQkJTmFtZWROb2RlTWFwIGN1cnJlbnRBdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCQlMaXN0IGluc2VydEF0dHJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpZiAoY3VycmVudEF0dHJzLmdldExlbmd0aCgpID09IDApIHsKLQkJCQkJCWluc2VydEF0dHJzLmFkZEFsbChyZXF1aXJlZEF0dHJzKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWlyZWRBdHRycy5zaXplKCk7IGkrKykgewotCQkJCQkJCVN0cmluZyByZXF1aXJlZEF0dHJOYW1lID0gKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSByZXF1aXJlZEF0dHJzLmdldChpKSkuZ2V0QXR0ck5hbWUoKTsKLQkJCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjdXJyZW50QXR0cnMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJCQlTdHJpbmcgY3VycmVudEF0dHJOYW1lID0gY3VycmVudEF0dHJzLml0ZW0oaikuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJCQkJaWYgKHJlcXVpcmVkQXR0ck5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShjdXJyZW50QXR0ck5hbWUpID09IDApIHsKLQkJCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghZm91bmQpIHsKLQkJCQkJCQkJaW5zZXJ0QXR0cnMuYWRkKHJlcXVpcmVkQXR0cnMuZ2V0KGkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGluc2VydEF0dHJzLnNpemUoKSA+IDApIHsKLQkJCQkJCXByb3Bvc2Fscy5hZGQobmV3IEluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsKGluc2VydEF0dHJzKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0TG9jYWxSZW5hbWVRdWlja0Fzc2lzdFByb3Bvc2FsKExpc3QgcHJvcG9zYWxzLCBJU291cmNlVmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBnZXROb2RlQXQodmlld2VyLCBvZmZzZXQpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZSA9PSBudWxsID8gbnVsbCA6IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlID09IG51bGwgPyBudWxsIDogbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlpbnQgcmVnaW9uVGV4dEVuZE9mZnNldCA9IDA7Ci0JCWlmICgoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgJiYgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJcmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCXJlZ2lvblRleHRFbmRPZmZzZXQgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAoKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSAmJiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJcmVnaW9uID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlyZWdpb25UZXh0RW5kT2Zmc2V0ID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKTsKLQkJfQotCi0JCWlmICgocmVnaW9uICE9IG51bGwpICYmICgocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgfHwgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSkgJiYgKG9mZnNldCA8PSByZWdpb25UZXh0RW5kT2Zmc2V0KSkgewotCQkJcHJvcG9zYWxzLmFkZChuZXcgUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTW9kZWxRdWVyeSBnZXRNb2RlbFF1ZXJ5KE5vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJcmV0dXJuIE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoKERvY3VtZW50KSBub2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRSZXF1aXJlZEF0dHJzKE5vZGUgbm9kZSkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBnZXRNb2RlbFF1ZXJ5KG5vZGUpOwotCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIG5vZGUpOwotCQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCQlDTU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gZWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpOwotCi0JCQkJQ01OYW1lZE5vZGVNYXBJbXBsIGFsbEF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKGF0dHJNYXApOwotCQkJCUxpc3Qgbm9kZXMgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBdmFpbGFibGVDb250ZW50KChFbGVtZW50KSBub2RlLCBlbGVtZW50RGVjbCwgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMpOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQkJQ01Ob2RlIGNtbm9kZSA9IChDTU5vZGUpIG5vZGVzLmdldChrKTsKLQkJCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQkJCWFsbEF0dHJpYnV0ZXMucHV0KGNtbm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYXR0ck1hcCA9IGFsbEF0dHJpYnV0ZXM7Ci0JCQkJCi0JCQkJSXRlcmF0b3IgaXQgPSBhdHRyTWFwLml0ZXJhdG9yKCk7Ci0JCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gbnVsbDsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCWF0dHIgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgaXQubmV4dCgpOwotCQkJCQlpZiAoYXR0ci5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpIHsKLQkJCQkJCXJlc3VsdC5hZGQoYXR0cik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRTdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbChMaXN0IHByb3Bvc2FscywgSVNvdXJjZVZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJcHJvcG9zYWxzLmFkZChuZXcgU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWwoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjbG9zZXN0IEluZGV4ZWRSZWdpb24gZm9yIHRoZSBvZmZzZXQgYW5kIHZpZXdlciBhbGxvd2luZwotCSAqIGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHZpZXdlciBvZmZzZXRzIGFuZCBtb2RlbCBwb3NpdGlvbnMuIG5vdGU6IHRoaXMKLQkgKiBtZXRob2QgcmV0dXJucyBhbiBJbmRleGVkUmVnaW9uIGZvciByZWFkIG9ubHkKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyIHdob3NlIGRvY3VtZW50IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgcHJvcG9zYWxzCi0JICogQHBhcmFtIGRvY3VtZW50T2Zmc2V0Ci0JICogICAgICAgICAgICBhbiBvZmZzZXQgd2l0aGluIHRoZSBkb2N1bWVudCBmb3Igd2hpY2ggY29tcGxldGlvbnMgc2hvdWxkCi0JICogICAgICAgICAgICBiZSBjb21wdXRlZAotCSAqIEByZXR1cm4gYW4gSW5kZXhlZFJlZ2lvbgotCSAqLwotCXByaXZhdGUgSW5kZXhlZFJlZ2lvbiBnZXROb2RlQXQoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJLy8gY29waWVkIGZyb20gQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdCgpCi0JCWlmICh2aWV3ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUluZGV4ZWRSZWdpb24gbm9kZSA9IG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbW0gPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJaWYgKG1tICE9IG51bGwpCi0JCQltb2RlbCA9IG1tLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJdHJ5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJaW50IGxhc3RPZmZzZXQgPSBkb2N1bWVudE9mZnNldDsKLQkJCQlub2RlID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudE9mZnNldCk7Ci0JCQkJd2hpbGUgKG5vZGUgPT0gbnVsbCAmJiBsYXN0T2Zmc2V0ID49IDApIHsKLQkJCQkJbGFzdE9mZnNldC0tOwotCQkJCQlub2RlID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihsYXN0T2Zmc2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0QXR0cmlidXRlRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0QXR0cmlidXRlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZGJjNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdEF0dHJpYnV0ZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSlNQVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5OYW1lVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlhNTENvbW1vblVJQ29udGV4dElkczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0QXR0cmlidXRlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCXByb3RlY3RlZCBBdHRyIGF0dHJpYnV0ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZU5hbWU7Ci0JcHJvdGVjdGVkIFRleHQgYXR0cmlidXRlTmFtZUZpZWxkOwotCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0JcHJvdGVjdGVkIFRleHQgYXR0cmlidXRlVmFsdWVGaWVsZDsKLQlwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlSWNvbjsKLQlwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQlwcm90ZWN0ZWQgRWxlbWVudCBvd25lckVsZW1lbnQ7Ci0KLQlwdWJsaWMgRWRpdEF0dHJpYnV0ZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgRWxlbWVudCBvd25lckVsZW1lbnQsIEF0dHIgYXR0cmlidXRlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7Ci0JCXRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlhdHRyaWJ1dGVOYW1lID0gZ2V0TW9kZWxWYWx1ZShhdHRyaWJ1dGVOYW1lRmllbGQuZ2V0VGV4dCgpKTsKLQkJCWF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlVmFsdWVGaWVsZC5nZXRUZXh0KCk7Ci0JCX0KLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJYXR0cmlidXRlTmFtZUZpZWxkLmZvcmNlRm9jdXMoKTsKLQkJYXR0cmlidXRlTmFtZUZpZWxkLnNlbGVjdEFsbCgpOwotCQl1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nQXJlYSwgWE1MQ29tbW9uVUlDb250ZXh0SWRzLlhDVUlfQVRUUklCVVRFX0RJQUxPRyk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vCi0JCS8vIFN0eWxlIGNvbnZlbmllbmNlIGNvbnN0YW50cwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJTGFiZWwgYXR0cmlidXRlTmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlhdHRyaWJ1dGVOYW1lTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FX0NPTE9OKTsKLQotCQlhdHRyaWJ1dGVOYW1lRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMzAwOwotCQlhdHRyaWJ1dGVOYW1lRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWF0dHJpYnV0ZU5hbWVGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShhdHRyaWJ1dGUgIT0gbnVsbCA/IGF0dHJpYnV0ZS5nZXROYW1lKCkgOiAiIikpOyAvLyROT04tTkxTLTEkCi0JCWF0dHJpYnV0ZU5hbWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQotCQlMYWJlbCBhdHRyaWJ1dGVWYWx1ZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlhdHRyaWJ1dGVWYWx1ZUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfVkFMVUVfQ09MT04pOwotCi0JCVN0cmluZyB2YWx1ZSA9IGF0dHJpYnV0ZSAhPSBudWxsID8gYXR0cmlidXRlLmdldFZhbHVlKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgc3R5bGUgPSBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUjsKLQkJaWYgKHZhbHVlLmluZGV4T2YoIlxuIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJc3R5bGUgPSBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMOwotCQl9Ci0KLQkJYXR0cmlidXRlVmFsdWVGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgc3R5bGUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAzMDA7Ci0JCWF0dHJpYnV0ZVZhbHVlRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWF0dHJpYnV0ZVZhbHVlRmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoYXR0cmlidXRlICE9IG51bGwgPyBhdHRyaWJ1dGUuZ2V0VmFsdWUoKSA6ICIiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBFcnJvciBtZXNzYWdlCi0JCUNvbXBvc2l0ZSBtZXNzYWdlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQltZXNzYWdlLnNldExheW91dChsYXlvdXQpOwotCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJbWVzc2FnZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQllcnJvck1lc3NhZ2VJY29uID0gbmV3IExhYmVsKG1lc3NhZ2UsIFNXVC5OT05FKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlnZC52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCWVycm9yTWVzc2FnZUljb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWVycm9yTWVzc2FnZUljb24uc2V0SW1hZ2UobnVsbCk7Ci0KLQkJZXJyb3JNZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwobWVzc2FnZSwgU1dULldSQVApOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuZXJyb3JfbWVzc2FnZV9nb2VzX2hlcmUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAyMDA7Ci0JCWdkLmhlaWdodEhpbnQgPSBNYXRoLm1heCgzMCwgZXJyb3JNZXNzYWdlTGFiZWwuY29tcHV0ZVNpemUoMCwgMCwgZmFsc2UpLnkgKiAyKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlnZC52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0JCXJldHVybiBkaWFsb2dBcmVhOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZU5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZSgpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZVZhbHVlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlzcGxheVZhbHVlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZyAhPSBudWxsID8gc3RyaW5nIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZGVsVmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKChzdHJpbmcgIT0gbnVsbCkgJiYgKHN0cmluZy50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotCQkJcmVzdWx0ID0gc3RyaW5nOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCXVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZSgpIHsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVOYW1lRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJaWYgKG5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlBdHRyIG1hdGNoaW5nQXR0cmlidXRlID0gb3duZXJFbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUobmFtZSk7Ci0JCQlpZiAoKG1hdGNoaW5nQXR0cmlidXRlICE9IG51bGwpICYmIChtYXRjaGluZ0F0dHJpYnV0ZSAhPSBhdHRyaWJ1dGUpKSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gWE1MVUlNZXNzYWdlcy5fRVJST1JfWE1MX0FUVFJJQlVURV9BTFJFQURZX0VYSVNUUzsKLQkJCQlpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRVJST1JfT0JKKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghaXNWYWxpZE5hbWUobmFtZSkpewotCQkJCQllcnJvck1lc3NhZ2UgPSBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLl9FUlJPUl9YTUxfQVRUUklCVVRFX0lTX0lOVkFMSUQsIG5hbWUpOwotCQkJCQlpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRVJST1JfT0JKKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQllcnJvck1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UgIT0gbnVsbCA/IGVycm9yTWVzc2FnZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQllcnJvck1lc3NhZ2VJY29uLnNldEltYWdlKGltYWdlKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuZ2V0UGFyZW50KCkubGF5b3V0KCk7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQoZXJyb3JNZXNzYWdlID09IG51bGwpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKE5hbWVWYWxpZGF0b3IuaXNWYWxpZChuYW1lKSkKLQkJCXJldHVybiB0cnVlOwotCQkvLyBzcGVjaWFsIGZvciBKU1AgdGFnIGluIHRhZyBuYW1lCi0JCWlmIChuYW1lLnN0YXJ0c1dpdGgoSlNQVGFnLlRBR19PUEVOKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdERvY3R5cGVEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXREb2N0eXBlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMGIzMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdERvY3R5cGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoJICAgRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWwuWE1MQ29tbW9uVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLQotcHVibGljIGNsYXNzIEVkaXREb2N0eXBlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb21wdXRlU3lzdGVtSWQ7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGRvY3R5cGVEYXRhOwotCXByb3RlY3RlZCBib29sZWFuIGVycm9yQ2hlY2tpbmc7Ci0JcHJvdGVjdGVkIExhYmVsIGVycm9yTWVzc2FnZUxhYmVsOwotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaWNJZEJyb3dzZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgVGV4dCBwdWJsaWNJZEZpZWxkOwotCXByb3RlY3RlZCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uOwotCXByb3RlY3RlZCBUZXh0IHJvb3RFbGVtZW50TmFtZUZpZWxkOwotCXByb3RlY3RlZCBCdXR0b24gc3lzdGVtSWRCcm93c2VCdXR0b247Ci0JcHJvdGVjdGVkIFRleHQgc3lzdGVtSWRGaWVsZDsKLQotCXB1YmxpYyBFZGl0RG9jdHlwZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgRG9jdW1lbnRUeXBlIGRvY3R5cGUpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgZG9jdHlwZS5nZXROYW1lKCksIGRvY3R5cGUuZ2V0UHVibGljSWQoKSwgZG9jdHlwZS5nZXRTeXN0ZW1JZCgpKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdERvY3R5cGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCWRvY3R5cGVEYXRhID0gbmV3IFN0cmluZ1szXTsKLQkJZG9jdHlwZURhdGFbMF0gPSBuYW1lOwotCQlkb2N0eXBlRGF0YVsxXSA9IHB1YmxpY0lkOwotCQlkb2N0eXBlRGF0YVsyXSA9IHN5c3RlbUlkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWRvY3R5cGVEYXRhWzBdID0gZ2V0TW9kZWxWYWx1ZShyb290RWxlbWVudE5hbWVGaWVsZC5nZXRUZXh0KCkpOwotCQlkb2N0eXBlRGF0YVsxXSA9IGdldE1vZGVsVmFsdWUocHVibGljSWRGaWVsZC5nZXRUZXh0KCkpOwotCQlkb2N0eXBlRGF0YVsyXSA9IGdldE1vZGVsVmFsdWUoc3lzdGVtSWRGaWVsZC5nZXRUZXh0KCkpOwotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCXVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0NvbnRyb2wgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nQ29udHJvbCwgWE1MQ29tbW9uVUlDb250ZXh0SWRzLlhDVUlfRE9DVFlQRV9ESUFMT0cpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0NvbnRyb2wsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0KLQkJTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgPT0gc3lzdGVtSWRGaWVsZCkgewotCQkJCQljb21wdXRlU3lzdGVtSWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gcm93IDEKLQkJLy8KLQkJTGFiZWwgcm9vdEVsZW1lbnROYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXJvb3RFbGVtZW50TmFtZUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfUk9PVF9FTEVNRU5UX05BTUVfQ09MT04pOwotCi0JCXJvb3RFbGVtZW50TmFtZUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocm9vdEVsZW1lbnROYW1lRmllbGQsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX0RPQ1RZUEVfUk9PVCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLndpZHRoSGludCA9IDIwMDsKLQkJcm9vdEVsZW1lbnROYW1lRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJvb3RFbGVtZW50TmFtZUZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGRvY3R5cGVEYXRhWzBdKSk7Ci0JCXJvb3RFbGVtZW50TmFtZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQlMYWJlbCBwbGFjZUhvbGRlciA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcGxhY2VIb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJLy8gcm93IDIKLQkJLy8KLQkJTGFiZWwgcHVibGljSWRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcHVibGljSWRMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1BVQkxJQ19JRF9DT0xPTik7Ci0KLQkJcHVibGljSWRGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHB1YmxpY0lkRmllbGQsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX0RPQ1RZUEVfUFVCTElDKTsKLQkJcHVibGljSWRGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcHVibGljSWRGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShkb2N0eXBlRGF0YVsxXSkpOwotCi0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJRWRpdEVudGl0eUhlbHBlciBoZWxwZXIgPSBuZXcgRWRpdEVudGl0eUhlbHBlcigpOwotCQkJCWlmIChlLndpZGdldCA9PSBwdWJsaWNJZEJyb3dzZUJ1dHRvbikgewotCQkJCQloZWxwZXIucGVyZm9ybUJyb3dzZUZvclB1YmxpY0lkKGdldFNoZWxsKCksIHB1YmxpY0lkRmllbGQsIGNvbXB1dGVTeXN0ZW1JZCA/IHN5c3RlbUlkRmllbGQgOiBudWxsKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZS53aWRnZXQgPT0gc3lzdGVtSWRCcm93c2VCdXR0b24pIHsKLQkJCQkJaGVscGVyLnBlcmZvcm1Ccm93c2VGb3JTeXN0ZW1JZChnZXRTaGVsbCgpLCBzeXN0ZW1JZEZpZWxkLCByZXNvdXJjZUxvY2F0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJcHVibGljSWRCcm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwdWJsaWNJZEJyb3dzZUJ1dHRvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0JST1dTRSk7Ci0JCXB1YmxpY0lkQnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQkvLyByb3cgMwotCQlMYWJlbCBzeXN0ZW1JZExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzeXN0ZW1JZExhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfU1lTVEVNX0lEX0NPTE9OKTsKLQotCQlzeXN0ZW1JZEZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc3lzdGVtSWRGaWVsZCwgWE1MQ29tbW9uVUlDb250ZXh0SWRzLlhDVUlfRE9DVFlQRV9TWVNURU0pOwotCQlzeXN0ZW1JZEZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzeXN0ZW1JZEZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGRvY3R5cGVEYXRhWzJdKSk7Ci0JCXN5c3RlbUlkRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0KLQkJc3lzdGVtSWRCcm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzeXN0ZW1JZEJyb3dzZUJ1dHRvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0JST1dTRV8xKTsKLQkJc3lzdGVtSWRCcm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCS8vIGVycm9yIG1lc3NhZ2UKLQkJZXJyb3JNZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQ29udHJvbCwgU1dULk5PTkUpOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZXJyb3JNZXNzYWdlTGFiZWwuZ2V0RGlzcGxheSgpLCAyMDAsIDAsIDApOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBkaWFsb2dDb250cm9sOwotCX0KLQotCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZU1lc3NhZ2VBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCS8vIGxhYmVsLnNldFRleHQobWVzc2FnZSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlzcGxheVZhbHVlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZyAhPSBudWxsID8gc3RyaW5nIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRFcnJvckNoZWNraW5nKCkgewotCQlyZXR1cm4gZXJyb3JDaGVja2luZzsKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kZWxWYWx1ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoKHN0cmluZyAhPSBudWxsKSAmJiAoc3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0JCQlyZXN1bHQgPSBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBkb2N0eXBlRGF0YVswXTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgewotCQlyZXR1cm4gZG9jdHlwZURhdGFbMV07Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIGRvY3R5cGVEYXRhWzJdOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbXB1dGVTeXN0ZW1JZChib29sZWFuIGNvbXB1dGVTeXN0ZW1JZCkgewotCQl0aGlzLmNvbXB1dGVTeXN0ZW1JZCA9IGNvbXB1dGVTeXN0ZW1JZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvckNoZWNraW5nKGJvb2xlYW4gZXJyb3JDaGVja2luZykgewotCQl0aGlzLmVycm9yQ2hlY2tpbmcgPSBlcnJvckNoZWNraW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlTG9jYXRpb24oSVBhdGggcGF0aCkgewotCQlyZXNvdXJjZUxvY2F0aW9uID0gcGF0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVFcnJvck1lc3NhZ2UoKSB7Ci0JCWlmIChlcnJvckNoZWNraW5nKSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJCWlmIChnZXRNb2RlbFZhbHVlKHN5c3RlbUlkRmllbGQuZ2V0VGV4dCgpKSA9PSBudWxsKSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gWE1MVUlNZXNzYWdlcy5fVUlfV0FSTklOR19TWVNURU1fSURfTVVTVF9CRV9TUEVDSUZJRUQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChnZXRNb2RlbFZhbHVlKHJvb3RFbGVtZW50TmFtZUZpZWxkLmdldFRleHQoKSkgPT0gbnVsbCkgewotCQkJCWVycm9yTWVzc2FnZSA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfUk9PVF9FTEVNRU5UX01VU1RfQkVfU1BFQ0lGSUVEOwotCQkJfQotCi0JCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSAhPSBudWxsID8gZXJyb3JNZXNzYWdlIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCQlva0J1dHRvbi5zZXRFbmFibGVkKGVycm9yTWVzc2FnZSA9PSBudWxsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRFbGVtZW50RGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0RWxlbWVudERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGFkMzgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRFbGVtZW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTmFtZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlhNTENvbW1vblVJQ29udGV4dElkczsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgRWRpdEVsZW1lbnREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIEVsZW1lbnQgZWxlbWVudDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnROYW1lOwotCXByb3RlY3RlZCBUZXh0IGVsZW1lbnROYW1lRmllbGQ7Ci0JcHJvdGVjdGVkIExhYmVsIGVycm9yTWVzc2FnZUxhYmVsOwotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0KLQlwdWJsaWMgRWRpdEVsZW1lbnREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCWVsZW1lbnROYW1lID0gZ2V0TW9kZWxWYWx1ZShlbGVtZW50TmFtZUZpZWxkLmdldFRleHQoKSk7Ci0JCX0KLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQllbGVtZW50TmFtZUZpZWxkLmZvcmNlRm9jdXMoKTsKLQkJZWxlbWVudE5hbWVGaWVsZC5zZWxlY3RBbGwoKTsKLQkJdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpYWxvZ0FyZWEsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX0VMRU1FTlRfRElBTE9HKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlMYWJlbCBlbGVtZW50TmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQllbGVtZW50TmFtZUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfRUxFTUVOVF9OQU1FKTsKLQotCQllbGVtZW50TmFtZUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLndpZHRoSGludCA9IDIwMDsKLQkJZWxlbWVudE5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZWxlbWVudE5hbWVGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50LmdldE5vZGVOYW1lKCkgOiAiIikpOyAvLyROT04tTkxTLTEkCi0JCWVsZW1lbnROYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gZXJyb3IgbWVzc2FnZQotCQllcnJvck1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLmVycm9yX21lc3NhZ2VfZ29lc19oZXJlKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZXJyb3JNZXNzYWdlTGFiZWwuZ2V0RGlzcGxheSgpLCAyMDAsIDAsIDApOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpc3BsYXlWYWx1ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmcgIT0gbnVsbCA/IHN0cmluZyA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnROYW1lOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kZWxWYWx1ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoKHN0cmluZyAhPSBudWxsKSAmJiAoc3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0JCQlyZXN1bHQgPSBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkgewotCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50TmFtZUZpZWxkLmdldFRleHQoKTsKLQkJLy8gU3RyaW5nIG5hbWUgPSBlbGVtZW50TmFtZUZpZWxkLmdldFRleHQoKS50cmltKCk7Ci0JCWlmIChuYW1lLmxlbmd0aCgpID4gMCkgewotCQkJLy8gVE9ETyB1c2UgY2hlY2tOYW1lIGZyb20gbW9kZWwgbGV2ZWwKLQkJCS8vIGVycm9yTWVzc2FnZSA9IFZhbGlkYXRlSGVscGVyLmNoZWNrWE1MTmFtZShuYW1lKTsKLQkJCWlmICghTmFtZVZhbGlkYXRvci5pc1ZhbGlkKG5hbWUpKSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gWE1MVUlNZXNzYWdlcy5fVUlfSU5WQUxJRF9OQU1FOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJZXJyb3JNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoZXJyb3JNZXNzYWdlICE9IG51bGwgPyBlcnJvck1lc3NhZ2UgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdEVudGl0eUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdEVudGl0eUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWViNjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRFbnRpdHlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0RW50aXR5SGVscGVyIHsKLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1Ccm93c2VGb3JQdWJsaWNJZChTaGVsbCBwYXJlbnRTaGVsbCwgVGV4dCBwdWJsaWNJZEZpZWxkKSB7Ci0JCXBlcmZvcm1Ccm93c2VGb3JQdWJsaWNJZChwYXJlbnRTaGVsbCwgcHVibGljSWRGaWVsZCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUJyb3dzZUZvclB1YmxpY0lkKFNoZWxsIHBhcmVudFNoZWxsLCBUZXh0IHB1YmxpY0lkRmllbGQsIFRleHQgc3lzdGVtSWRGaWVsZCkgewotCQlTdHJpbmdbXSBleHRlbnNpb25zID0geyJkdGQiLCAidHh0In07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTZWxlY3RYTUxDYXRhbG9nSWREaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdFhNTENhdGFsb2dJZERpYWxvZyhwYXJlbnRTaGVsbCwgZXh0ZW5zaW9ucyk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9TRUxFQ1RfWE1MX0NBVEFMT0dfRU5UUlkpOwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJU3RyaW5nIGlkID0gZGlhbG9nLmdldElkKCk7Ci0JCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJCXB1YmxpY0lkRmllbGQuc2V0VGV4dChpZCk7Ci0JCQkJaWYgKChzeXN0ZW1JZEZpZWxkICE9IG51bGwpICYmIChkaWFsb2cuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKSkgewotCQkJCQlzeXN0ZW1JZEZpZWxkLnNldFRleHQoZGlhbG9nLmdldFN5c3RlbUlkKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1Ccm93c2VGb3JTeXN0ZW1JZChTaGVsbCBwYXJlbnRTaGVsbCwgVGV4dCBzeXN0ZW1JZEZpZWxkLCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uKSB7Ci0JCVN0cmluZ1tdIGV4dGVuc2lvbnMgPSB7ImR0ZCJ9OyAvLyROT04tTkxTLTEkCi0JCVNlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nKHBhcmVudFNoZWxsLCBleHRlbnNpb25zLCBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1NQRUNJRllfU1lTVEVNX0lEKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCVN0cmluZyBpZCA9IGRpYWxvZy5nZXRJZCgpOwotCQkJSUZpbGUgZmlsZSA9IGRpYWxvZy5nZXRGaWxlKCk7Ci0JCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJCXN5c3RlbUlkRmllbGQuc2V0VGV4dChpZCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdXJpID0gbnVsbDsKLQkJCQlpZiAocmVzb3VyY2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXVyaSA9IFVSSUhlbHBlci5nZXRSZWxhdGl2ZVVSSShmaWxlLmdldExvY2F0aW9uKCksIHJlc291cmNlTG9jYXRpb24pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdXJpID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCQl9Ci0JCQkJc3lzdGVtSWRGaWVsZC5zZXRUZXh0KHVyaSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0TmFtZXNwYWNlSW5mb0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0YWM2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0TmFtZXNwYWNlSW5mb0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ29udGVudE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlhNTENvbW1vblVJQ29udGV4dElkczsKLQotcHVibGljIGNsYXNzIEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCXB1YmxpYyBzdGF0aWMgRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cgaW52b2tlRGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgdGl0bGUsIE5hbWVzcGFjZUluZm8gaW5mbywgSVBhdGggcmVzb3VyY2VMb2NhdGlvbikgewotCQlFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdE5hbWVzcGFjZUluZm9EaWFsb2coc2hlbGwsIGluZm8pOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRpYWxvZy5zZXRSZXNvdXJjZUxvY2F0aW9uKHJlc291cmNlTG9jYXRpb24pOwotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm4gZGlhbG9nOwotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCXByb3RlY3RlZCBTdHJpbmcgZXJyb3JNZXNzYWdlOwotCi0JcHJvdGVjdGVkIExhYmVsIGVycm9yTWVzc2FnZUxhYmVsOwotCXByb3RlY3RlZCBOYW1lc3BhY2VJbmZvIGZJbmZvOwotCXByb3RlY3RlZCBUZXh0IGxvY2F0aW9uSGludEZpZWxkOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQlwcm90ZWN0ZWQgVGV4dCBwcmVmaXhGaWVsZDsKLQlwcm90ZWN0ZWQgSVBhdGggcmVzb3VyY2VMb2NhdGlvbjsKLQlwcm90ZWN0ZWQgVGV4dCB1cmlGaWVsZDsKLQotCXB1YmxpYyBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgTmFtZXNwYWNlSW5mbyBpbmZvKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy5mSW5mbyA9IGluZm87Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCWZJbmZvLnVyaSA9IHVyaUZpZWxkLmdldFRleHQoKTsKLQkJCWZJbmZvLnByZWZpeCA9IHByZWZpeEZpZWxkLmdldFRleHQoKTsKLQkJCWZJbmZvLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSGludEZpZWxkLmdldFRleHQoKTsKLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb21wdXRlRXJyb3JNZXNzYWdlKCkgewotCQllcnJvck1lc3NhZ2UgPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JCXVwZGF0ZVdpZGdldHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ3N1YkFyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nc3ViQXJlYSwgWE1MQ29tbW9uVUlDb250ZXh0SWRzLlhDVUlfTkFNRVNQQUNFX0RJQUxPRyk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nc3ViQXJlYSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLndpZHRoSGludCA9IDM1MDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0JCU1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdXBkYXRlV2lkZ2V0cygpOwotCQkJfQotCQl9OwotCi0KLQkJLy8gcm93IDEKLQkJLy8KLQkJTGFiZWwgdXJpTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXVyaUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRVNQQUNFX05BTUVfQ09MT04pOwotCi0JCXVyaUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl1cmlGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdXJpRmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoZkluZm8udXJpKSk7Ci0JCXVyaUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJdXJpRmllbGQuc2V0RW5hYmxlZChmSW5mby5nZXRQcm9wZXJ0eSgidXJpLXJlYWRPbmx5IikgPT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBuZXZlciByZWFkCi0JCUxhYmVsIHBsYWNlSG9sZGVyMSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcGxhY2VIb2xkZXIxLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gcm93IDIKLQkJLy8KLQkJTGFiZWwgcHJlZml4TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXByZWZpeExhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfUFJFRklYX0NPTE9OKTsKLQotCQlwcmVmaXhGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJcHJlZml4RmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXByZWZpeEZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGZJbmZvLnByZWZpeCkpOwotCQlwcmVmaXhGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCXByZWZpeEZpZWxkLnNldEVuYWJsZWQoZkluZm8uZ2V0UHJvcGVydHkoInByZWZpeC1yZWFkT25seSIpID09IG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gbmV2ZXIgcmVhZAotCQlMYWJlbCBwbGFjZUhvbGRlcjIgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXBsYWNlSG9sZGVyMi5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHJvdyAzCi0JCS8vCi0JCUxhYmVsIGxvY2F0aW9uSGludExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsb2NhdGlvbkhpbnRMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0xPQ0FUSU9OX0hJTlRfQ09MT04pOwotCi0JCWxvY2F0aW9uSGludEZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlsb2NhdGlvbkhpbnRGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJbG9jYXRpb25IaW50RmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoZkluZm8ubG9jYXRpb25IaW50KSk7Ci0JCWxvY2F0aW9uSGludEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJbG9jYXRpb25IaW50RmllbGQuc2V0RW5hYmxlZChmSW5mby5nZXRQcm9wZXJ0eSgibG9jYXRpb25IaW50LXJlYWRPbmx5IikgPT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXBlcmZvcm1Ccm93c2UoKTsKLQkJCX0KLQkJfTsKLQotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9CUk9XU0UpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChsb2NhdGlvbkhpbnRGaWVsZC5nZXRFbmFibGVkKCkpOwotCi0JCS8vIGVycm9yIG1lc3NhZ2UKLQkJZXJyb3JNZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nc3ViQXJlYSwgU1dULk5PTkUpOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuZXJyb3JfbWVzc2FnZV9nb2VzX2hlcmUpOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZXJyb3JNZXNzYWdlTGFiZWwuZ2V0RGlzcGxheSgpLCAyMDAsIDAsIDApOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQotCQlyZXR1cm4gZGlhbG9nc3ViQXJlYTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpc3BsYXlWYWx1ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmcgIT0gbnVsbCA/IHN0cmluZyA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUJyb3dzZSgpIHsKLQkJU3RyaW5nW10gZXh0ZW5zaW9ucyA9IHsiLnhzZCJ9OyAvLyROT04tTkxTLTEkCi0JCVNlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nKGdldFNoZWxsKCksIGV4dGVuc2lvbnMpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfU0VMRUNUX0ZJTEUpOwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0KLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlTdHJpbmcgZ3JhbW1hclVSSSA9IG51bGw7Ci0JCQlJRmlsZSBmaWxlID0gZGlhbG9nLmdldEZpbGUoKTsKLQkJCVN0cmluZyBpZCA9IGRpYWxvZy5nZXRJZCgpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyB1cmkgPSBudWxsOwotCQkJCWlmIChyZXNvdXJjZUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHJlc291cmNlTG9jYXRpb24pOwotCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJSVBhdGggbG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotCQkJCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCQl1cmkgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoZmlsZS5nZXRMb2NhdGlvbigpLCBsb2NhdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCSAgdXJpID0gVVJJSGVscGVyLmdldFJlbGF0aXZlVVJJKGZpbGUuZ2V0TG9jYXRpb24oKSwgcmVzb3VyY2VMb2NhdGlvbik7Ci0JCQkJCX0KLQkJCQkJZ3JhbW1hclVSSSA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl1cmkgPSBmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQkJCQlncmFtbWFyVVJJID0gdXJpOwotCQkJCX0KLQkJCQlsb2NhdGlvbkhpbnRGaWVsZC5zZXRUZXh0KHVyaSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChpZCAhPSBudWxsKSB7Ci0JCQkJbG9jYXRpb25IaW50RmllbGQuc2V0VGV4dChpZCk7Ci0JCQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOwotCQkJCWdyYW1tYXJVUkkgPSByZXNvbHZlci5yZXNvbHZlKG51bGwsIGlkLCBpZCk7Ci0JCQl9Ci0KLQotCQkJQ01Eb2N1bWVudCBkb2N1bWVudCA9IENvbnRlbnRNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDTURvY3VtZW50KFVSSUhlbHBlci5nZXRVUklGb3JGaWxlUGF0aChncmFtbWFyVVJJKSwgInhzZCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZihkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IChMaXN0KSBkb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25hbWVzcGFjZUluZm8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKG5hbWVzcGFjZUluZm9MaXN0ICE9IG51bGwpIHsKLQkJCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIG5hbWVzcGFjZUluZm9MaXN0LmdldCgwKTsKLQkJCQkJaWYoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoKHVyaUZpZWxkLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgJiYgKGluZm8udXJpICE9IG51bGwpKSB7Ci0JCQkJCQkJdXJpRmllbGQuc2V0VGV4dChpbmZvLnVyaSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoKHByZWZpeEZpZWxkLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgJiYgKGluZm8ucHJlZml4ICE9IG51bGwpKSB7Ci0JCQkJCQkJcHJlZml4RmllbGQuc2V0VGV4dChpbmZvLnByZWZpeCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUxvY2F0aW9uKElQYXRoIHBhdGgpIHsKLQkJcmVzb3VyY2VMb2NhdGlvbiA9IHBhdGg7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlTGFiZWwoKSB7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoZXJyb3JNZXNzYWdlICE9IG51bGwgPyBlcnJvck1lc3NhZ2UgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPS0J1dHRvblN0YXRlKCkgewotCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJaWYgKCh1cmlGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApICYmIChwcmVmaXhGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApICYmIChsb2NhdGlvbkhpbnRGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKGVycm9yTWVzc2FnZSA9PSBudWxsKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldHMoKSB7Ci0JCWNvbXB1dGVFcnJvck1lc3NhZ2UoKTsKLQkJdXBkYXRlRXJyb3JNZXNzYWdlTGFiZWwoKTsKLQkJdXBkYXRlT0tCdXR0b25TdGF0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0Mjg1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlhNTENvbW1vblVJQ29udGV4dElkczsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGE7Ci0JcHJvdGVjdGVkIFRleHQgZGF0YUZpZWxkOwotCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0OwotCXByb3RlY3RlZCBUZXh0IHRhcmdldEZpZWxkOwotCi0JcHVibGljIEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSkgewotCQl0aGlzKHBhcmVudFNoZWxsLCBwaS5nZXRUYXJnZXQoKSwgcGkuZ2V0RGF0YSgpKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQl0YXJnZXQgPSBnZXRNb2RlbFZhbHVlKHRhcmdldEZpZWxkLmdldFRleHQoKSk7Ci0JCWRhdGEgPSBnZXRNb2RlbFZhbHVlKGRhdGFGaWVsZC5nZXRUZXh0KCkpOwotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYTEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nQXJlYTEsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX1BST0NFU1NJTkdfRElBTE9HKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhMSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAyNTA7Ci0KLQkJTGFiZWwgdGFyZ2V0TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXRhcmdldExhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfVEFSR0VUX0NPTE9OKTsKLQotCQl0YXJnZXRGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQl0YXJnZXRGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGFyZ2V0RmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUodGFyZ2V0KSk7Ci0KLQkJTGFiZWwgZGF0YUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlkYXRhTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9EQVRBX0NPTE9OKTsKLQotCQlkYXRhRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJZGF0YUZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlkYXRhRmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoZGF0YSkpOwotCi0JCXJldHVybiBkaWFsb2dBcmVhMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlTWVzc2FnZUFyZWEoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJLy8gbGFiZWwuc2V0VGV4dChtZXNzYWdlKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHsKLQkJcmV0dXJuIGRhdGE7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXNwbGF5VmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nICE9IG51bGwgPyBzdHJpbmcgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kZWxWYWx1ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoKHN0cmluZyAhPSBudWxsKSAmJiAoc3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0JCQlyZXN1bHQgPSBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gdGFyZ2V0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRTY2hlbWFJbmZvRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0U2NoZW1hSW5mb0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDQ1ODA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRTY2hlbWFJbmZvRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5uc2VkaXQuQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlhNTENvbW1vblVJQ29udGV4dElkczsKLQotcHVibGljIGNsYXNzIEVkaXRTY2hlbWFJbmZvRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgVXBkYXRlTGlzdGVuZXIgewotCS8vIHByb3RlY3RlZCBOYW1lc3BhY2VJbmZvVGFibGUgbmFtZXNwYWNlSW5mb1RhYmxlOwotCXByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLQlwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdDsKLQlwcm90ZWN0ZWQgSVBhdGggcmVzb3VyY2VMb2NhdGlvbjsKLQotCXB1YmxpYyBFZGl0U2NoZW1hSW5mb0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVBhdGggcmVzb3VyY2VMb2NhdGlvbikgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMucmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nQXJlYSwgWE1MQ29tbW9uVUlDb250ZXh0SWRzLlhDVUlfU0NIRU1BX0lORk9fRElBTE9HKTsKLQotCQlDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyBlZGl0TmFtZXNwYWNlc0NvbnRyb2wgPSBuZXcgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2coZGlhbG9nQXJlYSwgcmVzb3VyY2VMb2NhdGlvbiwgWE1MVUlNZXNzYWdlcy5fVUlfTkFNRVNQQUNFX0RFQ0xBUkFUSU9OUywgZmFsc2UsIHRydWUpOwotCQllZGl0TmFtZXNwYWNlc0NvbnRyb2wuc2V0TmFtZXNwYWNlSW5mb0xpc3QobmFtZXNwYWNlSW5mb0xpc3QpOwotCi0JCWVkaXROYW1lc3BhY2VzQ29udHJvbC51cGRhdGVFcnJvck1lc3NhZ2UobmFtZXNwYWNlSW5mb0xpc3QpOwotCi0JCXJldHVybiBkaWFsb2dBcmVhOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGdldERpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZUluZm9MaXN0KCkgewotCQlyZXR1cm4gbmFtZXNwYWNlSW5mb0xpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlSW5mb0xpc3QoTGlzdCBsaXN0KSB7Ci0JCW5hbWVzcGFjZUluZm9MaXN0ID0gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVFcnJvck1lc3NhZ2UoTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCkgewotCQlOYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXIgaGVscGVyID0gbmV3IE5hbWVzcGFjZUluZm9FcnJvckhlbHBlcigpOwotCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gaGVscGVyLmNvbXB1dGVFcnJvck1lc3NhZ2UobmFtZXNwYWNlSW5mb0xpc3QsIG51bGwpOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSAhPSBudWxsID8gZXJyb3JNZXNzYWdlIDogIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlT2NjdXJlZChPYmplY3Qgb2JqZWN0LCBPYmplY3QgYXJnKSB7Ci0JCXVwZGF0ZUVycm9yTWVzc2FnZSgoTGlzdCkgYXJnKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9OYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL05hbWVzcGFjZUluZm9FcnJvckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDBkZjkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL05hbWVzcGFjZUluZm9FcnJvckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSW5mb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyIHsKLQotCXByb3RlY3RlZCBMaXN0IGVycm9yTGlzdDsKLQotCXB1YmxpYyBOYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXIoKSB7Ci0JfQotCi0JcHVibGljIFN0cmluZyBjb21wdXRlRXJyb3JNZXNzYWdlKExpc3QgbmFtZXNwYWNlSW5mb0xpc3QsIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCUhhc2h0YWJsZSBwcmVmaXhUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQkJSGFzaHRhYmxlIHVyaVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbmFtZXNwYWNlSW5mb0xpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJTmFtZXNwYWNlSW5mbyBuc0luZm8gPSAoTmFtZXNwYWNlSW5mbykgaXRlcmF0b3IubmV4dCgpOwotCQkJbnNJbmZvLm5vcm1hbGl6ZSgpOwotCi0JCQlTdHJpbmcgdXJpa2V5ID0gbnNJbmZvLnVyaSAhPSBudWxsID8gbnNJbmZvLnVyaSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQlOYW1lc3BhY2VJbmZvIG5zSW5mbzIgPSBudWxsOwotCQkJaWYgKChuc0luZm8yID0gKE5hbWVzcGFjZUluZm8pIHVyaVRhYmxlLmdldCh1cmlrZXkpKSAhPSBudWxsKSB7Ci0JCQkJaWYgKChuc0luZm8udXJpICE9IG51bGwpICYmIG5zSW5mby51cmkuZXF1YWxzKG5zSW5mbzIudXJpKSkgewotCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9XQVJOSU5HX01PUkVfVEhBTl9PTkVfTlNfV0lUSF9OQU1FICsgIiciICsgbnNJbmZvLnVyaSArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhPVVRfTkFNRTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl1cmlUYWJsZS5wdXQodXJpa2V5LCBuc0luZm8pOwotCQkJfQotCi0JCQlpZiAobnNJbmZvLnVyaSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGtleSA9IG5zSW5mby5wcmVmaXggIT0gbnVsbCA/IG5zSW5mby5wcmVmaXggOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwcmVmaXhUYWJsZS5nZXQoa2V5KSAhPSBudWxsKSB7Ci0JCQkJCWlmIChuc0luZm8ucHJlZml4ICE9IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIX1BSRUZJWCArICInIiArIG5zSW5mby5wcmVmaXggKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhPVVRfUFJFRklYOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXByZWZpeFRhYmxlLnB1dChrZXksIG5zSW5mbyk7Ci0JCQkJfQotCi0JCQkJaWYgKChuc0luZm8ubG9jYXRpb25IaW50ICE9IG51bGwpICYmIChpZFJlc29sdmVyICE9IG51bGwpKSB7Ci0JCQkJCVN0cmluZyBncmFtbWFyVVJJID0gaWRSZXNvbHZlci5yZXNvbHZlKG51bGwsIG5zSW5mby5sb2NhdGlvbkhpbnQsIG5zSW5mby5sb2NhdGlvbkhpbnQpOwotCQkJCQlpZiAoIVVSSUhlbHBlci5pc1JlYWRhYmxlVVJJKGdyYW1tYXJVUkksIGZhbHNlKSkgewotCQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfV0FSTklOR19TQ0hFTUFfQ0FOX05PVF9CRV9MT0NBVEVEICsgIiAnIiArIG5zSW5mby5sb2NhdGlvbkhpbnQgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICgoaWRSZXNvbHZlciAhPSBudWxsKSAmJiAobnNJbmZvLmxvY2F0aW9uSGludCA9PSBudWxsKSAmJiAhbnNJbmZvLnVyaS5lcXVhbHMoRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIuWFNJX1VSSSkpIHsKLQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfV0FSTklOR19MT0NBVElPTl9ISU5UX05PVF9TUEVDSUZJRUQgKyAiICciICsgbnNJbmZvLnVyaSArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobnNJbmZvLnByZWZpeCAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfTkFNRVNQQUNFX05BTUVfTk9UX1NQRUNJRklFRCArICIgJyIgKyBuc0luZm8ucHJlZml4ICsgIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBhZGRpdGlvbmFsIHRlc3RzCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5hbWVzcGFjZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlOYW1lc3BhY2VJbmZvIG5zSW5mbyA9IChOYW1lc3BhY2VJbmZvKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJbnNJbmZvLm5vcm1hbGl6ZSgpOwotCQkJCWlmICgobnNJbmZvLnVyaSAhPSBudWxsKSAmJiBuc0luZm8uaXNQcmVmaXhSZXF1aXJlZCAmJiAobnNJbmZvLnByZWZpeCA9PSBudWxsKSkgewotCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9XQVJOSU5HX1BSRUZJWF9OT1RfU1BFQ0lGSUVEICsgIiAnIiArIG5zSW5mby51cmkgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9OYW1lc3BhY2VJbmZvVGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL05hbWVzcGFjZUluZm9UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTQzOGRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL05hbWVzcGFjZUluZm9UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VJbmZvVGFibGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCi0JLyoqCi0JICogTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBOYW1lc3BhY2VJbmZvVGFibGVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciwgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0JCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uKSB7Ci0JCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgb2JqZWN0OwotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCQlzd2l0Y2ggKGNvbHVtbikgewotCQkJCWNhc2UgMCA6IHsKLQkJCQkJcmVzdWx0ID0gaW5mby51cmk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDEgOiB7Ci0JCQkJCXJlc3VsdCA9IGluZm8ucHJlZml4OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAyIDogewotCQkJCQlyZXN1bHQgPSBpbmZvLmxvY2F0aW9uSGludDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcmVzdWx0ID0gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHJlc3VsdC5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlzd2l0Y2ggKGNvbHVtbikgewotCQkJCQljYXNlIDAgOiB7Ci0JCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9OT19OQU1FU1BBQ0VfTkFNRTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgMSA6IHsKLQkJCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX05PX1BSRUZJWDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCVN0cmluZyBnZXREZWZhdWx0UHJlZml4KCkgewotCQkJU3RyaW5nIGRlZmF1bHRQcmVmaXggPSAicCI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChuYW1lc3BhY2VJbmZvTGlzdCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRQcmVmaXg7Ci0JCQl9Ci0JCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXNwYWNlSW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlOYW1lc3BhY2VJbmZvIG5zaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBuYW1lc3BhY2VJbmZvTGlzdC5nZXQoaSk7Ci0JCQkJaWYgKG5zaW5mby5wcmVmaXggIT0gbnVsbCkgewotCQkJCQl2LmFkZEVsZW1lbnQobnNpbmZvLnByZWZpeCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHYuY29udGFpbnMoZGVmYXVsdFByZWZpeCkpIHsKLQkJCQlTdHJpbmcgcyA9IGRlZmF1bHRQcmVmaXg7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IHYuY29udGFpbnMocyk7IGorKykgewotCQkJCQlzID0gZGVmYXVsdFByZWZpeCArIEludGVnZXIudG9TdHJpbmcoaik7Ci0JCQkJfQotCQkJCXJldHVybiBzOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRQcmVmaXg7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJcmV0dXJuIG5hbWVzcGFjZUluZm9MaXN0LnRvQXJyYXkoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fSElOVCA9IFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0xPQ0FUSU9OX0hJTlQ7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VSSSA9IFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX05BTUVTUEFDRV9OQU1FOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1BSRUZJWDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRlbGV0ZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkdW1teVJvd3NSZW1vdmVkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBlZGl0QnV0dG9uOwotCXByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0gbmV3IFZlY3RvcigpOwotCXByb3RlY3RlZCBCdXR0b24gbmV3QnV0dG9uOwotCXByb3RlY3RlZCBOYW1lc3BhY2VJbmZvVGFibGVMYWJlbFByb3ZpZGVyIHByb3ZpZGVyOwotCXByb3RlY3RlZCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uOwotCXByb3RlY3RlZCBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQlwcm90ZWN0ZWQgVXBkYXRlTGlzdGVuZXIgdXBkYXRlTGlzdGVuZXI7Ci0JcHJvdGVjdGVkIGludCB2aXNpYmxlUm93cyA9IC0xOwotCi0JcHVibGljIE5hbWVzcGFjZUluZm9UYWJsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMocGFyZW50LCAtMSwgLTEsIC0xKTsKLQl9Ci0KLQlwdWJsaWMgTmFtZXNwYWNlSW5mb1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCB2aXNpYmxlUm93cykgewotCQl0aGlzKHBhcmVudCwgLTEsIC0xLCB2aXNpYmxlUm93cyk7Ci0JfQotCi0JcHVibGljIE5hbWVzcGFjZUluZm9UYWJsZShDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCkgewotCQl0aGlzKHBhcmVudCwgd2lkdGhIaW50LCBoZWlnaHRIaW50LCAtMSk7Ci0JfQotCi0JcHVibGljIE5hbWVzcGFjZUluZm9UYWJsZShDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCwgaW50IHZpc2libGVSb3dzKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQlzZXRMYXlvdXQoY3JlYXRlR3JpZExheW91dCgpKTsKLQkJc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUdyb3VwIG5hbWVzcGFjZUluZm9Hcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuTk9ORSk7Ci0JCW5hbWVzcGFjZUluZm9Hcm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1hNTF9TQ0hFTUFfSU5GT1JNQVRJT04pOwotCQluYW1lc3BhY2VJbmZvR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlpZiAod2lkdGhIaW50ICE9IC0xKSB7Ci0JCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCX0KLQkJaWYgKGhlaWdodEhpbnQgIT0gLTEpIHsKLQkJCWdkLmhlaWdodEhpbnQgPSBoZWlnaHRIaW50OwotCQl9Ci0JCW5hbWVzcGFjZUluZm9Hcm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKG5hbWVzcGFjZUluZm9Hcm91cCwgbmV3Ci0JCS8vIENvbnRyb2xDb250ZXh0Q29tcHV0ZXIobmFtZXNwYWNlSW5mb0dyb3VwLAotCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxDX05BTUVTUEFDRV9HUk9VUCkpOwotCQlTdHJpbmdbXSB0aXRsZUFycmF5ID0ge05BTUVTUEFDRV9VUkksIFBSRUZJWCwgTE9DQVRJT05fSElOVH07Ci0JCXRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKG5hbWVzcGFjZUluZm9Hcm91cCwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJcHJvdmlkZXIgPSBuZXcgTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlcigpOwotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIocHJvdmlkZXIpOwotCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyh0aXRsZUFycmF5KTsKLQkJVGFibGUgdGFibGUgPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJaW50W10gd2lkdGhBcnJheSA9IHs1MCwgMjAsIDMwfTsKLQkJVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGl0bGVBcnJheS5sZW5ndGg7IGkrKykgewotCQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBpKTsKLQkJCWNvbHVtbi5zZXRUZXh0KHRpdGxlQXJyYXlbaV0pOwotCQkJY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSh3aWR0aEFycmF5W2ldLCB0cnVlKSk7Ci0JCX0KLQkJdGhpcy52aXNpYmxlUm93cyA9IHZpc2libGVSb3dzOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZpc2libGVSb3dzOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KCIjIyMjIyMjIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbdGl0bGVBcnJheS5sZW5ndGhdOwotCQljZWxsRWRpdG9yc1sxXSA9IG5ldyBUZXh0Q2VsbEVkaXRvcih0YWJsZSk7Ci0JCWNlbGxFZGl0b3JzWzJdID0gbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotCQlNb3VzZUFkYXB0ZXIgbW91c2VBZGFwdGVyID0gbmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JCQkJaWYgKHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKSAhPSBudWxsKSB7Ci0JCQkJCXBlcmZvcm1FZGl0KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0YWJsZS5hZGRNb3VzZUxpc3RlbmVyKG1vdXNlQWRhcHRlcik7Ci0JCWNyZWF0ZUJ1dHRvbnMobmFtZXNwYWNlSW5mb0dyb3VwKTsKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQnV0dG9uRW5hYmxlZFN0YXRlKCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlCdXR0b24gaGlkZGVuQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJaGlkZGVuQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQloaWRkZW5CdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWhpZGRlbkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgPT0gbmV3QnV0dG9uKSB7Ci0JCQkJCXBlcmZvcm1OZXcoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZS53aWRnZXQgPT0gZWRpdEJ1dHRvbikgewotCQkJCQlwZXJmb3JtRWRpdCgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChlLndpZGdldCA9PSBkZWxldGVCdXR0b24pIHsKLQkJCQkJcGVyZm9ybURlbGV0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJLy8gY3JlYXRlIGEgY29tcG9zaXRlIHRvIGhvbGQgdGhlIHRocmVlIGJ1dHRvbnMKLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJR3JpZExheW91dCBidXR0b25HcmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJYnV0dG9uR3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJYnV0dG9uR3JpZExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGJ1dHRvbkdyaWRMYXlvdXQpOwotCQkvLyBhZGQgdGhlIE5ldyBidXR0b24KLQkJLy8KLQkJbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbmV3QnV0dG9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfQlVUVE9OX05FVyk7Ci0JCW5ld0J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbmV3QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJLy8gYWRkIHRoZSBFZGl0IGJ1dHRvbgotCQkvLwotCQllZGl0QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZWRpdEJ1dHRvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0JVVFRPTl9FRElUKTsKLQkJZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCS8vIGFkZCB0aGUgRGVsZXRlIGJ1dHRvbgotCQkvLwotCQlkZWxldGVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlkZWxldGVCdXR0b24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9CVVRUT05fREVMRVRFKTsKLQkJZGVsZXRlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlkZWxldGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBHcmlkTGF5b3V0IGNyZWF0ZUdyaWRMYXlvdXQoKSB7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlncmlkTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJcmV0dXJuIGdyaWRMYXlvdXQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2VJbmZvTGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTmFtZXNwYWNlSW5mbyBnZXRUYXJnZXROYW1lc3BhY2VJbmZvKCkgewotCQlyZXR1cm4gKChuYW1lc3BhY2VJbmZvTGlzdCAhPSBudWxsKSAmJiAobmFtZXNwYWNlSW5mb0xpc3Quc2l6ZSgpID4gMCkpID8gKE5hbWVzcGFjZUluZm8pIG5hbWVzcGFjZUluZm9MaXN0LmdldCgwKSA6IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGludm9rZURpYWxvZyhTdHJpbmcgdGl0bGUsIE5hbWVzcGFjZUluZm8gaW5mbykgewotCQlTaGVsbCBzaGVsbCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cgZGlhbG9nID0gbmV3IEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nKHNoZWxsLCBpbmZvKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cuc2V0UmVzb3VyY2VMb2NhdGlvbihyZXNvdXJjZUxvY2F0aW9uKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuIGRpYWxvZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVsYXllZFVwZGF0ZSgpIHsKLQkJUnVubmFibGUgZGVsYXllZFVwZGF0ZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl1cGRhdGUoKTsKLQkJCX0KLQkJfTsKLQkJZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhkZWxheWVkVXBkYXRlKTsKLQkJaWYgKHVwZGF0ZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCXVwZGF0ZUxpc3RlbmVyLnVwZGF0ZU9jY3VyZWQodGhpcywgbmFtZXNwYWNlSW5mb0xpc3QpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybURlbGV0ZSgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgIT0gbnVsbCkgewotCQkJbmFtZXNwYWNlSW5mb0xpc3QucmVtb3ZlKHNlbGVjdGVkT2JqZWN0KTsKLQkJCXBlcmZvcm1EZWxheWVkVXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRWRpdCgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBOYW1lc3BhY2VJbmZvKSB7Ci0JCQlpbnZva2VEaWFsb2coWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTkVXX05BTUVTUEFDRV9JTkZPUk1BVElPTiwgKE5hbWVzcGFjZUluZm8pIHNlbGVjdGVkT2JqZWN0KTsKLQkJCXBlcmZvcm1EZWxheWVkVXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtTmV3KCkgewotCQlOYW1lc3BhY2VJbmZvIGluZm8gPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotCQlFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBkaWFsb2cgPSBpbnZva2VEaWFsb2coWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTkVXX05BTUVTUEFDRV9JTkZPUk1BVElPTiwgaW5mbyk7Ci0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJbmFtZXNwYWNlSW5mb0xpc3QuYWRkKGluZm8pOwotCQkJcGVyZm9ybURlbGF5ZWRVcGRhdGUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZUluZm9MaXN0KExpc3QgbmFtZXNwYWNlSW5mb0xpc3QpIHsKLQkJdGhpcy5uYW1lc3BhY2VJbmZvTGlzdCA9IG5hbWVzcGFjZUluZm9MaXN0OwotCQl1cGRhdGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUxvY2F0aW9uKElQYXRoIHJlc291cmNlTG9jYXRpb24pIHsKLQkJdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVMaXN0ZW5lcihVcGRhdGVMaXN0ZW5lciB1cGRhdGVMaXN0ZW5lcikgewotCQl0aGlzLnVwZGF0ZUxpc3RlbmVyID0gdXBkYXRlTGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQl1cGRhdGVIZWxwZXIobmFtZXNwYWNlSW5mb0xpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUJ1dHRvbkVuYWJsZWRTdGF0ZSgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgc2VsZWN0ZWRPYmplY3Q7Ci0JCWVkaXRCdXR0b24uc2V0RW5hYmxlZChpbmZvICE9IG51bGwpOwotCQlkZWxldGVCdXR0b24uc2V0RW5hYmxlZCgoaW5mbyAhPSBudWxsKSAmJiAoaW5mby5nZXRQcm9wZXJ0eSgidW5yZW1vdmFibGUiKSA9PSBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVIZWxwZXIoTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCkgewotCQlpZiAoKHZpc2libGVSb3dzICE9IC0xKSAmJiAhZHVtbXlSb3dzUmVtb3ZlZCkgewotCQkJZHVtbXlSb3dzUmVtb3ZlZCA9IHRydWU7Ci0JCQl0YWJsZVZpZXdlci5nZXRUYWJsZSgpLnJlbW92ZUFsbCgpOwotCQl9Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCWlmIChuYW1lc3BhY2VJbmZvTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5hbWVzcGFjZUluZm9MaXN0LmdldCgwKSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzZjZjdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi1wdWJsaWMgY2xhc3MgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgaW50IGNhdGFsb2dFbnRyeVR5cGU7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGV4dGVuc2lvbnM7Ci0JcHJvdGVjdGVkIElGaWxlIGZpbGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCXByb3RlY3RlZCBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbCBwYW5lbDsKLQotCXB1YmxpYyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZ1tdIGV4dGVuc2lvbnMpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgZXh0ZW5zaW9ucywgMCk7Ci0JfQotCi0JcHVibGljIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nW10gZXh0ZW5zaW9ucywgaW50IGNhdGFsb2dFbnRyeVR5cGUpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zOwotCQl0aGlzLmNhdGFsb2dFbnRyeVR5cGUgPSBjYXRhbG9nRW50cnlUeXBlOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCWZpbGUgPSBwYW5lbC5nZXRGaWxlKCk7Ci0JCQlpZCA9IHBhbmVsLmdldFhNTENhdGFsb2dJZCgpOwotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCXBhbmVsID0gbmV3IFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsKGRpYWxvZ0FyZWEpOwotCQlwYW5lbC5zZXRDYXRhbG9nRW50cnlUeXBlKGNhdGFsb2dFbnRyeVR5cGUpOwotCQlwYW5lbC5zZXRGaWx0ZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQlwYW5lbC5zZXRWaXNpYmxlSGVscGVyKHRydWUpOwotCQlTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRpb25TdGF0ZUNoYW5nZWQoKSB7Ci0JCQkJdXBkYXRlQnV0dG9uU3RhdGUoKTsKLQkJCX0KLQkJfTsKLQkJcGFuZWwuc2V0TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXJldHVybiBkaWFsb2dBcmVhOwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9uU3RhdGUoKSB7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQoKHBhbmVsLmdldEZpbGUoKSAhPSBudWxsKSB8fCAocGFuZWwuZ2V0WE1MQ2F0YWxvZ0lkKCkgIT0gbnVsbCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTg3YjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqCSAgIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBbMTQyNTAwXSBXVFAgcHJvcGVydGllcyBwYWdlcyBmb250cyBkb24ndCBmb2xsb3cgRWNsaXBzZSBwcmVmZXJlbmNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuU2VsZWN0U2luZ2xlRmlsZVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLQotcHVibGljIGNsYXNzIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCi0JLyoqCi0JICogVE9ETzogQ2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgaW50ZXJmYWNlOyAiTGlzdGVuZXIiIGlzIHVzZWQgYnkgU1dULgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGlzdGVuZXIgewotCQl2b2lkIGNvbXBsZXRpb25TdGF0ZUNoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgTXlTZWxlY3RTaW5nbGVGaWxlVmlldyBleHRlbmRzIFNlbGVjdFNpbmdsZUZpbGVWaWV3IGltcGxlbWVudHMgU2VsZWN0U2luZ2xlRmlsZVZpZXcuTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgQ29udHJvbCBjb250cm9sOwotCi0JCXB1YmxpYyBNeVNlbGVjdFNpbmdsZUZpbGVWaWV3KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKG51bGwsIHRydWUpOwotCQkJLy8gU3RyaW5nW10gZXh0ID0geyIuZHRkIn07Ci0JCQkvLyBhZGRGaWx0ZXJFeHRlbnNpb25zKGV4dCk7Ci0JCQljb250cm9sID0gY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQkJY29udHJvbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCU15U2VsZWN0U2luZ2xlRmlsZVZpZXcudGhpcy5zZXRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCQlyZXR1cm4gY29udHJvbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldENvbnRyb2xDb21wbGV0ZShib29sZWFuIGlzQ29tcGxldGUpIHsKLQkJCXVwZGF0ZUNvbXBsZXRpb25TdGF0ZUNoYW5nZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VmlzaWJsZUhlbHBlcihib29sZWFuIGlzVmlzaWJsZSkgewotCQkJc3VwZXIuc2V0VmlzaWJsZUhlbHBlcihpc1Zpc2libGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RlbmVyIGxpc3RlbmVyOwotCXByb3RlY3RlZCBQYWdlQm9vayBwYWdlQm9vazsKLQotCXByb3RlY3RlZCBCdXR0b25bXSByYWRpb0J1dHRvbjsKLQlwcm90ZWN0ZWQgTXlTZWxlY3RTaW5nbGVGaWxlVmlldyBzZWxlY3RTaW5nbGVGaWxlVmlldzsKLQlwcm90ZWN0ZWQgU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwgc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWw7Ci0KLQlwdWJsaWMgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQotCQkvLyBjb250YWluZXIgZ3JvdXAKLQkJc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5oZWlnaHRIaW50ID0gNDAwOwotCQlnZC53aWR0aEhpbnQgPSA0MDA7Ci0JCXNldExheW91dERhdGEoZ2QpOwotCi0JCXJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvblsyXTsKLQkJcmFkaW9CdXR0b25bMF0gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5SQURJTyk7Ci0JCXJhZGlvQnV0dG9uWzBdLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfUkFESU9fQlVUVE9OX1NFTEVDVF9GUk9NX1dPUktTUEFDRSk7Ci0JCXJhZGlvQnV0dG9uWzBdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyYWRpb0J1dHRvblswXS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXJhZGlvQnV0dG9uWzBdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCXJhZGlvQnV0dG9uWzFdID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuUkFESU8pOwotCQlyYWRpb0J1dHRvblsxXS5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX1JBRElPX0JVVFRPTl9TRUxFQ1RfRlJPTV9DQVRBTE9HKTsKLQkJcmFkaW9CdXR0b25bMV0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJhZGlvQnV0dG9uWzFdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCXBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHRoaXMsIFNXVC5OT05FKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcgPSBuZXcgTXlTZWxlY3RTaW5nbGVGaWxlVmlldyhwYWdlQm9vayk7Ci0KLQkJSUNhdGFsb2cgeG1sQ2F0YWxvZyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0JCXNlbGVjdFhNTENhdGFsb2dJZFBhbmVsID0gbmV3IFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsKHBhZ2VCb29rLCB4bWxDYXRhbG9nKTsKLQkJc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuZ2V0VGFibGVWaWV3ZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZUNvbXBsZXRpb25TdGF0ZUNoYW5nZSgpOwotCQkJfQotCQl9KTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlwYWdlQm9vay5zaG93UGFnZShzZWxlY3RTaW5nbGVGaWxlVmlldy5nZXRDb250cm9sKCkpOwotCi0JfQotCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCUlGaWxlIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyYWRpb0J1dHRvblswXS5nZXRTZWxlY3Rpb24oKSkgewotCQkJcmVzdWx0ID0gc2VsZWN0U2luZ2xlRmlsZVZpZXcuZ2V0RmlsZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElDYXRhbG9nRW50cnkgZ2V0WE1MQ2F0YWxvZ0VudHJ5KCkgewotCQlJQ2F0YWxvZ0VudHJ5IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyYWRpb0J1dHRvblsxXS5nZXRTZWxlY3Rpb24oKSkgewotCQkJcmVzdWx0ID0gc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuZ2V0WE1MQ2F0YWxvZ0VudHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFhNTENhdGFsb2dJZCgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyYWRpb0J1dHRvblsxXS5nZXRTZWxlY3Rpb24oKSkgewotCQkJcmVzdWx0ID0gc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0WE1MQ2F0YWxvZ1VSSSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyYWRpb0J1dHRvblsxXS5nZXRTZWxlY3Rpb24oKSkgewotCQkJcmVzdWx0ID0gc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuZ2V0VVJJKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nRW50cnlUeXBlKGludCBjYXRhbG9nRW50cnlUeXBlKSB7Ci0JCXNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLnNldENhdGFsb2dFbnRyeVR5cGUoY2F0YWxvZ0VudHJ5VHlwZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zKSB7Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3LnJlc2V0RmlsdGVycygpOwotCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5hZGRGaWx0ZXJFeHRlbnNpb25zKGZpbHRlckV4dGVuc2lvbnMpOwotCi0JCXNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmdldFRhYmxlVmlld2VyKCkuc2V0RmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZUhlbHBlcihib29sZWFuIGlzVmlzaWJsZSkgewotCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5zZXRWaXNpYmxlSGVscGVyKGlzVmlzaWJsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlQ29tcGxldGlvblN0YXRlQ2hhbmdlKCkgewotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotCQkJbGlzdGVuZXIuY29tcGxldGlvblN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSByYWRpb0J1dHRvblswXSkgewotCQkJcGFnZUJvb2suc2hvd1BhZ2Uoc2VsZWN0U2luZ2xlRmlsZVZpZXcuZ2V0Q29udHJvbCgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXBhZ2VCb29rLnNob3dQYWdlKHNlbGVjdFhNTENhdGFsb2dJZFBhbmVsKTsKLQkJfQotCQl1cGRhdGVDb21wbGV0aW9uU3RhdGVDaGFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RYTUxDYXRhbG9nSWREaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFhNTENhdGFsb2dJZERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjRjOTZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFhNTENhdGFsb2dJZERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlhNTENvbW1vblVJQ29udGV4dElkczsKLQotCi0KLXB1YmxpYyBjbGFzcyBTZWxlY3RYTUxDYXRhbG9nSWREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBTdHJpbmdbXSBleHRlbnNpb25zOwotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0JcHJvdGVjdGVkIFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsIHBhbmVsOwotCXByb3RlY3RlZCBTdHJpbmcgcHVibGljSWQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JZDsKLQotCXB1YmxpYyBTZWxlY3RYTUxDYXRhbG9nSWREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZ1tdIGV4dGVuc2lvbnMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gcGFuZWwuZ2V0VGFibGVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQotCQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCUlDYXRhbG9nRW50cnkgbWFwcGluZ0luZm8gPSAoSUNhdGFsb2dFbnRyeSkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQkJcHVibGljSWQgPSBtYXBwaW5nSW5mby5nZXRLZXkoKTsKLQkJCQlzeXN0ZW1JZCA9IGNvbXB1dGVEZWZhdWx0U3lzdGVtSWQobWFwcGluZ0luZm8pOwotCQkJfQotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZURlZmF1bHRTeXN0ZW1JZChJQ2F0YWxvZ0VudHJ5IG1hcHBpbmdJbmZvKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBtYXBwaW5nSW5mby5nZXRBdHRyaWJ1dGVWYWx1ZShJQ2F0YWxvZ0VudHJ5LkFUVFJfV0VCX1VSTCk7Ci0JCWlmICgocmVzdWx0ID09IG51bGwpICYmIChtYXBwaW5nSW5mby5nZXRVUkkoKSAhPSBudWxsKSkgewotCQkJaW50IGluZGV4ID0gbWFwcGluZ0luZm8uZ2V0VVJJKCkubGFzdEluZGV4T2YoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGxhc3RTZWdtZW50ID0gaW5kZXggIT0gLTEgPyBtYXBwaW5nSW5mby5nZXRVUkkoKS5zdWJzdHJpbmcoaW5kZXggKyAxKSA6IG1hcHBpbmdJbmZvLmdldFVSSSgpOwotCQkJcmVzdWx0ID0gbGFzdFNlZ21lbnQ7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkaWFsb2dBcmVhLCBYTUxDb21tb25VSUNvbnRleHRJZHMuWENVSV9DQVRBTE9HX0RJQUxPRyk7Ci0KLQkJSUNhdGFsb2cgeG1sQ2F0YWxvZyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0JCXBhbmVsID0gbmV3IFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsKGRpYWxvZ0FyZWEsIHhtbENhdGFsb2cpOwotCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQnV0dG9uU3RhdGUoKTsKLQkJCX0KLQkJfTsKLQkJcGFuZWwuZ2V0VGFibGVWaWV3ZXIoKS5zZXRGaWx0ZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQlwYW5lbC5nZXRUYWJsZVZpZXdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXJldHVybiBkaWFsb2dBcmVhOwotCX0KLQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gcHVibGljSWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHN5c3RlbUlkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvblN0YXRlKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHBhbmVsLmdldFRhYmxlVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQoIXNlbGVjdGlvbi5pc0VtcHR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWQ1MTE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLQotcHVibGljIGNsYXNzIFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgaW50IGNhdGFsb2dFbnRyeVR5cGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZG9UYWJsZVNpemVIYWNrID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCXByb3RlY3RlZCBJQ2F0YWxvZyBmWG1sQ2F0YWxvZzsKLQotCXB1YmxpYyBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbChDb21wb3NpdGUgcGFyZW50LCBJQ2F0YWxvZyB4bWxDYXRhbG9nKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLmZYbWxDYXRhbG9nID0geG1sQ2F0YWxvZzsKLQotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQl0aGlzLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDIwMDsKLQkJZ2Qud2lkdGhIaW50ID0gNzAwOwotCQl0aGlzLnNldExheW91dERhdGEoZ2QpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9YTUxfQ0FUQUxPR19DT0xPTik7Ci0KLQkJdGFibGVWaWV3ZXIgPSBjcmVhdGVUYWJsZVZpZXdlcih0aGlzKTsKLQkJdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dCgiZHVtbXkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBYTUxDYXRhbG9nVGFibGVWaWV3ZXIgY3JlYXRlVGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTdHJpbmcgaGVhZGluZ3NbXSA9IG5ldyBTdHJpbmdbMl07Ci0JCWhlYWRpbmdzWzBdID0gWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfS0VZOwotCQloZWFkaW5nc1sxXSA9IFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1VSSTsKLQotCQlYTUxDYXRhbG9nVGFibGVWaWV3ZXIgdGhlVGFibGVWaWV3ZXIgPSBuZXcgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyKHBhcmVudCwgaGVhZGluZ3MpIHsKLQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkWE1MQ2F0YWxvZ0VudHJpZXMoTGlzdCBsaXN0LCBJQ2F0YWxvZ0VudHJ5W10gZW50cmllcykgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCQkJaWYgKGNhdGFsb2dFbnRyeVR5cGUgPT0gMCkgewotCQkJCQkJbGlzdC5hZGQoZW50cnkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNhdGFsb2dFbnRyeVR5cGUgPT0gZW50cnkuZ2V0RW50cnlUeXBlKCkpIHsKLQkJCQkJCWxpc3QuYWRkKGVudHJ5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIENvbGxlY3Rpb24gZ2V0WE1MQ2F0YWxvZ0VudHJpZXMoKSB7Ci0JCQkJTGlzdCByZXN1bHQgPSBudWxsOwotCi0JCQkJaWYgKChmWG1sQ2F0YWxvZyA9PSBudWxsKSB8fCBkb1RhYmxlU2l6ZUhhY2spIHsKLQkJCQkJLy8gdGhpcyBsZXRzIHVzIGNyZWF0ZSBhIHRhYmxlIHdpdGggYW4gaW5pdGlhbCBoZWlnaHQgb2YKLQkJCQkJLy8gMTAgcm93cwotCQkJCQkvLyBvdGhlcndpc2Ugd2UgZ2V0IHN0dWNrIHdpdGggMCByb3cgaGVpZ2ggdGFibGUuLi4gdGhhdCdzCi0JCQkJCS8vIHRvbyBzbWFsbAotCQkJCQlkb1RhYmxlU2l6ZUhhY2sgPSBmYWxzZTsKLQkJCQkJcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewotCQkJCQkJcmVzdWx0LmFkZCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotCQkJCQlJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBmWG1sQ2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0Q2F0YWxvZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlOZXh0Q2F0YWxvZyBjYXRhbG9nID0gbmV4dENhdGFsb2dzW2ldOwotCQkJCQkJSUNhdGFsb2cgcmVmZXJlbmNlZENhdGFsb2cgPSBjYXRhbG9nLmdldFJlZmVyZW5jZWRDYXRhbG9nKCk7Ci0JCQkJCQlpZiAocmVmZXJlbmNlZENhdGFsb2cgIT0gbnVsbCkgewotCQkJCQkJCWlmIChYTUxDb3JlUGx1Z2luLlNZU1RFTV9DQVRBTE9HX0lELmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkgewotCQkJCQkJCQlJQ2F0YWxvZyBzeXN0ZW1DYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0JCQkJCQkJCWFkZFhNTENhdGFsb2dFbnRyaWVzKHJlc3VsdCwgc3lzdGVtQ2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpKTsKLQotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChYTUxDb3JlUGx1Z2luLlVTRVJfQ0FUQUxPR19JRC5lcXVhbHMocmVmZXJlbmNlZENhdGFsb2cuZ2V0SWQoKSkpIHsKLQkJCQkJCQkJSUNhdGFsb2cgdXNlckNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLQkJCQkJCQkJYWRkWE1MQ2F0YWxvZ0VudHJpZXMocmVzdWx0LCB1c2VyQ2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpKTsKLQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9OwotCQlyZXR1cm4gdGhlVGFibGVWaWV3ZXI7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gZ2V0WE1MQ2F0YWxvZ0VudHJ5KCk7Ci0JCXJldHVybiBlbnRyeSAhPSBudWxsID8gZW50cnkuZ2V0S2V5KCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBYTUxDYXRhbG9nVGFibGVWaWV3ZXIgZ2V0VGFibGVWaWV3ZXIoKSB7Ci0JCXJldHVybiB0YWJsZVZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGdldFhNTENhdGFsb2dFbnRyeSgpOwotCQlyZXR1cm4gZW50cnkgIT0gbnVsbCA/IGVudHJ5LmdldFVSSSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2dFbnRyeSBnZXRYTUxDYXRhbG9nRW50cnkoKSB7Ci0JCUlDYXRhbG9nRW50cnkgcmVzdWx0ID0gbnVsbDsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQlyZXN1bHQgPSAoSUNhdGFsb2dFbnRyeSkgc2VsZWN0ZWRPYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nRW50cnlUeXBlKGludCBjYXRhbG9nRW50cnlUeXBlKSB7Ci0JCXRoaXMuY2F0YWxvZ0VudHJ5VHlwZSA9IGNhdGFsb2dFbnRyeVR5cGU7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9VcGRhdGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvVXBkYXRlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA3MjcwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9VcGRhdGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVXBkYXRlTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgdXBkYXRlT2NjdXJlZChPYmplY3Qgb2JqZWN0LCBPYmplY3QgYXJnKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1hNTENhdGFsb2dUYWJsZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvWE1MQ2F0YWxvZ1RhYmxlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNzc2YjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvWE1MQ2F0YWxvZ1RhYmxlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLQotcHVibGljIGNsYXNzIFhNTENhdGFsb2dUYWJsZVZpZXdlciBleHRlbmRzIFRhYmxlVmlld2VyIHsKLQotCi0JcHVibGljIGNsYXNzIENhdGFsb2dFbnRyeUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlPYmplY3RbXSBhcnJheSA9IGdldFhNTENhdGFsb2dFbnRyaWVzKCkudG9BcnJheSgpOwotCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJCWludCByZXN1bHQgPSAwOwotCQkJCQlpZiAoKG8xIGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgJiYgKG8yIGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkpIHsKLQkJCQkJCUlDYXRhbG9nRW50cnkgbWFwcGluZ0luZm8xID0gKElDYXRhbG9nRW50cnkpIG8xOwotCQkJCQkJSUNhdGFsb2dFbnRyeSBtYXBwaW5nSW5mbzIgPSAoSUNhdGFsb2dFbnRyeSkgbzI7Ci0JCQkJCQlyZXN1bHQgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUobWFwcGluZ0luZm8xLmdldEtleSgpLCBtYXBwaW5nSW5mbzIuZ2V0S2V5KCkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJfTsKLQkJCUFycmF5cy5zb3J0KGFycmF5LCBjb21wYXJhdG9yKTsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkLCBPYmplY3QgbmV3b2JqKSB7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIENhdGFsb2dFbnRyeUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJSW1hZ2UgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQkJSW1hZ2UgYmFzZSA9IG51bGw7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpIHsKLQkJCQkJSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgb2JqZWN0OwotCQkJCQlTdHJpbmcgdXJpID0gY2F0YWxvZ0VudHJ5LmdldFVSSSgpOwotCQkJCQlpZiAodXJpLmVuZHNXaXRoKCJkdGQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQliYXNlID0gZHRkRmlsZUltYWdlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHVyaS5lbmRzV2l0aCgieHNkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYmFzZSA9IHhzZEZpbGVJbWFnZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWJhc2UgPSB1bmtub3duRmlsZUltYWdlOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCQkJaWYgKFVSSUhlbHBlci5pc1JlYWRhYmxlVVJJKHVyaSwgZmFsc2UpKSB7Ci0JCQkJCQkJcmVzdWx0ID0gYmFzZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIFRPRE8uLi4gU1NFIHBvcnQKLQkJCQkJCQlyZXN1bHQgPSBiYXNlOy8vIGltYWdlRmFjdG9yeS5jcmVhdGVDb21wb3NpdGVJbWFnZShiYXNlLAotCQkJCQkJCS8vIGVycm9ySW1hZ2UsCi0JCQkJCQkJLy8gSW1hZ2VGYWN0b3J5LkJPVFRPTV9MRUZUKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgb2JqZWN0OwotCQkJCXJlc3VsdCA9IGNvbHVtbkluZGV4ID09IDAgPyBjYXRhbG9nRW50cnkuZ2V0S2V5KCkgOiBjYXRhbG9nRW50cnkuZ2V0VVJJKCk7Ci0JCQkJcmVzdWx0ID0gVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChyZXN1bHQpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCi0JY2xhc3MgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQkJcHJvdGVjdGVkIFN0cmluZ1tdIGV4dGVuc2lvbnM7Ci0KLQkJcHVibGljIFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlcihTdHJpbmdbXSBleHRlbnNpb25zKSB7Ci0JCQl0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNGaWx0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgT2JqZWN0IHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpIHsKLQkJCQlJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBlbGVtZW50OwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoY2F0YWxvZ0VudHJ5LmdldFVSSSgpLmVuZHNXaXRoKGV4dGVuc2lvbnNbaV0pKSB7Ci0JCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBkdGRGaWxlSW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0RUREZJTEUpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgRVJST1JfU1RBVEVfS0VZID0gImVycm9yc3RhdGVrZXkiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBlcnJvckltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09WUl9FUlJPUik7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIHVua25vd25GaWxlSW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RYVEVYVCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSB4c2RGaWxlSW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1hTREZJTEUpOwotCi0JLy8gcHJvdGVjdGVkIEltYWdlRmFjdG9yeSBpbWFnZUZhY3RvcnkgPSBuZXcgSW1hZ2VGYWN0b3J5KCk7Ci0KLQlwdWJsaWMgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXMpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSKTsKLQotCQlUYWJsZSB0YWJsZSA9IGdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgaSk7Ci0JCQljb2x1bW4uc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLQkJCWNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQkJfQotCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQotCQlzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCi0JCXNldENvbnRlbnRQcm92aWRlcihuZXcgQ2F0YWxvZ0VudHJ5Q29udGVudFByb3ZpZGVyKCkpOwotCQlzZXRMYWJlbFByb3ZpZGVyKG5ldyBDYXRhbG9nRW50cnlMYWJlbFByb3ZpZGVyKCkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFhNTENhdGFsb2dFbnRyaWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImhlbGxvIikgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJydW4hIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQkJbWVudU1hbmFnZXIuYWRkKGFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBleHRlbnNpb25zKSB7Ci0JCXJlc2V0RmlsdGVycygpOwotCQlhZGRGaWx0ZXIobmV3IFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlcihleHRlbnNpb25zKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RuZC9EcmFnTm9kZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kbmQvRHJhZ05vZGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNmZjNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RuZC9EcmFnTm9kZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIERyYWdOb2RlQ29tbWFuZCBleHRlbmRzIERlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQgewotCXByaXZhdGUgTGlzdCBmU2VsZWN0aW9uczsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgZlRyZWVWaWV3ZXI7Ci0KLQlwdWJsaWMgRHJhZ05vZGVDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2VzLCBUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJc3VwZXIodGFyZ2V0LCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2VzKTsKLQkJZlRyZWVWaWV3ZXIgPSB0cmVlVmlld2VyOwotCQlmU2VsZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYmVnaW5Nb2RlbENoYW5nZShOb2RlIG5vZGUsIGJvb2xlYW4gYmF0Y2hVcGRhdGUpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBnZXRTdHJ1Y3R1cmVkTW9kZWwobm9kZSk7Ci0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIHVuZG9EZXNjID0gbmV3IFN0cmluZygpOwotCQkJaWYgKGdldE9wZXJhdGlvbigpID09IERORC5EUk9QX01PVkUpIHsKLQkJCQl1bmRvRGVzYyA9IFhNTFVJTWVzc2FnZXMuRHJhZ05vZGVDb21tYW5kXzA7Ci0JCQl9Ci0JCQllbHNlIGlmIChnZXRPcGVyYXRpb24oKSA9PSBETkQuRFJPUF9DT1BZKSB7Ci0JCQkJdW5kb0Rlc2MgPSBYTUxVSU1lc3NhZ2VzLkRyYWdOb2RlQ29tbWFuZF8xOwotCQkJfQotCi0JCQlzdHJ1Y3R1cmVkTW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgdW5kb0Rlc2MpOwotCQkJaWYgKGJhdGNoVXBkYXRlKSB7Ci0JCQkJLy8gc3RydWN0dXJlZE1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIGV4ZWN1dGVIZWxwZXIodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGRvTW9kaWZ5KE5vZGUgc291cmNlLCBOb2RlIHBhcmVudE5vZGUsIE5vZGUgcmVmQ2hpbGQsIGJvb2xlYW4gdGVzdE9ubHkpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKHNvdXJjZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCUF0dHIgc291cmNlQXR0cmlidXRlID0gKEF0dHIpIHNvdXJjZTsKLQkJCUVsZW1lbnQgc291cmNlQXR0cmlidXRlT3duZXJFbGVtZW50ID0gc291cmNlQXR0cmlidXRlLmdldE93bmVyRWxlbWVudCgpOwotCQkJaWYgKChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpICYmIChzb3VyY2VBdHRyaWJ1dGVPd25lckVsZW1lbnQgIT0gcGFyZW50Tm9kZSkpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCWlmICghdGVzdE9ubHkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChnZXRPcGVyYXRpb24oKSA9PSBETkQuRFJPUF9NT1ZFKSB7Ci0JCQkJCQkJRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gKEVsZW1lbnQpIHBhcmVudE5vZGU7Ci0JCQkJCQkJc291cmNlQXR0cmlidXRlT3duZXJFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoc291cmNlQXR0cmlidXRlKTsKLQkJCQkJCQl0YXJnZXRFbGVtZW50LmdldEF0dHJpYnV0ZXMoKS5zZXROYW1lZEl0ZW0oc291cmNlQXR0cmlidXRlKTsKLQkJCQkJCQlmU2VsZWN0aW9ucy5hZGQoc291cmNlQXR0cmlidXRlKTsKLQkJCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChnZXRPcGVyYXRpb24oKSA9PSBETkQuRFJPUF9DT1BZKSB7Ci0JCQkJCQkJQXR0ciBjbG9uZUF0dHJpYnV0ZSA9IChBdHRyKSBzb3VyY2VBdHRyaWJ1dGUuY2xvbmVOb2RlKGZhbHNlKTsKLQkJCQkJCQlFbGVtZW50IHRhcmdldEVsZW1lbnQgPSAoRWxlbWVudCkgcGFyZW50Tm9kZTsKLQkJCQkJCQl0YXJnZXRFbGVtZW50LmdldEF0dHJpYnV0ZXMoKS5zZXROYW1lZEl0ZW0oY2xvbmVBdHRyaWJ1dGUpOwotCQkJCQkJCWZTZWxlY3Rpb25zLmFkZChjbG9uZUF0dHJpYnV0ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoKChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHx8IChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgJiYgIShyZWZDaGlsZCBpbnN0YW5jZW9mIEF0dHIpKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQotCQkJCWlmICghdGVzdE9ubHkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChpc0FuY2VzdG9yKHNvdXJjZSwgcGFyZW50Tm9kZSkpIHsKLQkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNhbiBub3QgcGVyZm9ybSB0aGlzIGRyYWcgZHJvcAotCQkJCQkJCS8vIG9wZXJhdGlvbi4uLi4gdG9kby4uLiBwb3AgdXAgZGlhbG9nIik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBkZWZlY3QgMjIxMDU1IHRoaXMgdGVzdCBpcyByZXF1aXJlZCBvciBlbHNlIHRoZQotCQkJCQkJCS8vIG5vZGUgd2lsbAotCQkJCQkJCS8vIGJlIHJlbW92ZWQgZnJvbSB0aGUgdHJlZSBhbmQgdGhlIGluc2VydCB3aWxsIGZhaWwKLQkJCQkJCQlpZiAoc291cmNlICE9IHJlZkNoaWxkKSB7Ci0JCQkJCQkJCWlmIChnZXRPcGVyYXRpb24oKSA9PSBETkQuRFJPUF9NT1ZFKSB7Ci0JCQkJCQkJCQlOb2RlIG9sZFBhcmVudCA9IHNvdXJjZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQkJCQlOb2RlIG9sZFNpYmxpbmcgPSBzb3VyY2UuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQkJCW9sZFBhcmVudC5yZW1vdmVDaGlsZChzb3VyY2UpOwotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlwYXJlbnROb2RlLmluc2VydEJlZm9yZShzb3VyY2UsIHJlZkNoaWxkKTsKLQkJCQkJCQkJCX0gY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJLy8gYnVnMTUxNjkyIC0gaWYgdW5hYmxlIHRvIG1vdmUgbm9kZSB0byBuZXcgbG9jYXRpb24sIHJlaW5zZXJ0IGJhY2sgdG8gb2xkIGxvY2F0aW9uCi0JCQkJCQkJCQkJb2xkUGFyZW50Lmluc2VydEJlZm9yZShzb3VyY2UsIG9sZFNpYmxpbmcpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZlNlbGVjdGlvbnMuYWRkKHNvdXJjZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZiAoZ2V0T3BlcmF0aW9uKCkgPT0gRE5ELkRST1BfQ09QWSkgewotCQkJCQkJCQkJTm9kZSBub2RlQ2xvbmUgPSBzb3VyY2UuY2xvbmVOb2RlKHRydWUpOwotCQkJCQkJCQkJcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZUNsb25lLCByZWZDaGlsZCk7Ci0JCQkJCQkJCQlmU2VsZWN0aW9ucy5hZGQobm9kZUNsb25lKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBlbmRNb2RlbENoYW5nZShOb2RlIG5vZGUsIGJvb2xlYW4gYmF0Y2hVcGRhdGUpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBnZXRTdHJ1Y3R1cmVkTW9kZWwobm9kZSk7Ci0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJc3RydWN0dXJlZE1vZGVsLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCWlmIChiYXRjaFVwZGF0ZSkgewotCQkJCS8vIHN0cnVjdHVyZWRNb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWV4ZWN1dGVIZWxwZXIoZmFsc2UpOwotCi0JCS8vIE1ha2Ugb3VyIHNlbGVjdGlvbiBpZiB0aGUgdHJlZVZpZXdlciAhPSBudWxsCi0JCWlmIChmVHJlZVZpZXdlciAhPSBudWxsKSB7Ci0JCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmU2VsZWN0aW9ucyk7Ci0JCQlmVHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXhlY3V0ZUhlbHBlcihib29sZWFuIHRlc3RPbmx5KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgdGFyZ2V0Tm9kZSA9IChOb2RlKSB0YXJnZXQ7Ci0JCQlpZiAoIXRlc3RPbmx5ICYmIGZUcmVlVmlld2VyICE9IG51bGwgJiYgIXZhbGlkYXRlRWRpdChnZXRTdHJ1Y3R1cmVkTW9kZWwodGFyZ2V0Tm9kZSksIGZUcmVlVmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCU5vZGUgcGFyZW50Tm9kZSA9IGdldFBhcmVudEZvckRyb3BQb3NpdGlvbih0YXJnZXROb2RlKTsKLQkJCU5vZGUgcmVmQ2hpbGQgPSBnZXRSZWZDaGlsZCh0YXJnZXROb2RlKTsKLQotCQkJVmVjdG9yIHNvdXJjZXNMaXN0ID0gbmV3IFZlY3RvcigpOwotCQkJc291cmNlc0xpc3QuYWRkQWxsKHNvdXJjZXMpOwotCi0JCQlyZW1vdmVNZW1iZXJEZXNjZW5kYW50cyhzb3VyY2VzTGlzdCk7Ci0JCQlib29sZWFuIHBlcmZvcm1CYXRjaFVwZGF0ZSA9IHNvdXJjZXNMaXN0LnNpemUoKSA+IDU7Ci0KLQkJCWlmICghdGVzdE9ubHkpIHsKLQkJCQliZWdpbk1vZGVsQ2hhbmdlKHRhcmdldE5vZGUsIHBlcmZvcm1CYXRjaFVwZGF0ZSk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBzb3VyY2VzTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgc291cmNlID0gaS5uZXh0KCk7Ci0JCQkJaWYgKHNvdXJjZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJaWYgKCEoKHJlZkNoaWxkID09IG51bGwpICYmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgQXR0cikpICYmIChwYXJlbnROb2RlICE9IG51bGwpKSB7Ci0JCQkJCQlyZXN1bHQgPSBkb01vZGlmeSgoTm9kZSkgc291cmNlLCBwYXJlbnROb2RlLCByZWZDaGlsZCwgdGVzdE9ubHkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCF0ZXN0T25seSkgewotCQkJCWVuZE1vZGVsQ2hhbmdlKHRhcmdldE5vZGUsIHBlcmZvcm1CYXRjaFVwZGF0ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0aGF0IHRoZSByZXNvdXJjZSBiYWNraW5nIHRoZSBtb2RlbCBpcyB3cml0ZWFibGUgdXRpbGl6aW5nIDxjb2RlPnZhbGlkYXRlRWRpdDwvY29kZT4KLQkgKiBvbiBhIGdpdmVuIDx0dD5JV29ya3NwYWNlPC90dD4uCi0JICogCi0JICogQHBhcmFtIG1vZGVsIHRoZSBtb2RlbCB0byBiZSBjaGVja2VkCi0JICogQHBhcmFtIGNvbnRleHQgdGhlIHNoZWxsIGNvbnRleHQgZm9yIHdoaWNoIDxjb2RlPnZhbGlkYXRlRWRpdDwvY29kZT4gd2lsbCBiZSBydW4KLQkgKiBAcmV0dXJuIGJvb2xlYW4gcmVzdWx0IG9mIGNoZWNraW5nIDxjb2RlPnZhbGlkYXRlRWRpdDwvY29kZT4uIElmIHRoZSByZXNvdXJjZSBpcyB1bndyaXRlYWJsZSwgPGNvZGU+c3RhdHVzLmlzT0soKTwvY29kZT4KLQkgKiB3aWxsIHJldHVybiB0cnVlOyBvdGhlcndpc2UsIGZhbHNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZUVkaXQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgU2hlbGwgY29udGV4dCkgewotCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpKSk7Ci0JCQlyZXR1cm4gIWZpbGUuaXNBY2Nlc3NpYmxlKCkgfHwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChuZXcgSUZpbGVbXSB7ZmlsZX0sIGNvbnRleHQpLmlzT0soKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEZlZWRiYWNrKCkgewotCQlpbnQgcmVzdWx0ID0gRE5ELkZFRURCQUNLX1NFTEVDVDsKLQkJaWYgKGxvY2F0aW9uID4gMC43NSkgewotCQkJcmVzdWx0ID0gRE5ELkZFRURCQUNLX0lOU0VSVF9BRlRFUjsKLQkJfQotCQllbHNlIGlmIChsb2NhdGlvbiA8IDAuMjUpIHsKLQkJCXJlc3VsdCA9IERORC5GRUVEQkFDS19JTlNFUlRfQkVGT1JFOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBOb2RlIGdldFBhcmVudEZvckRyb3BQb3NpdGlvbihOb2RlIG5vZGUpIHsKLQkJTm9kZSByZXN1bHQgPSBudWxsOwotCi0JCWludCBmZWVkYmFjayA9IGdldEZlZWRiYWNrKCk7Ci0JCWlmIChmZWVkYmFjayA9PSBETkQuRkVFREJBQ0tfU0VMRUNUKSB7Ci0JCQlyZXN1bHQgPSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gZ2V0UGFyZW50T3JPd25lcihub2RlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJpdmF0ZSBOb2RlIGdldFBhcmVudE9yT3duZXIoTm9kZSBub2RlKSB7Ci0JCXJldHVybiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpID8gKChBdHRyKSBub2RlKS5nZXRPd25lckVsZW1lbnQoKSA6IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCX0KLQotCi0JcHJpdmF0ZSBOb2RlIGdldFJlZkNoaWxkKE5vZGUgbm9kZSkgewotCQlOb2RlIHJlc3VsdCA9IG51bGw7Ci0KLQkJaW50IGZlZWRiYWNrID0gZ2V0RmVlZGJhY2soKTsKLQotCQlpZiAoZmVlZGJhY2sgPT0gRE5ELkZFRURCQUNLX0lOU0VSVF9CRUZPUkUpIHsKLQkJCXJlc3VsdCA9IG5vZGU7Ci0JCX0KLQkJZWxzZSBpZiAoZmVlZGJhY2sgPT0gRE5ELkZFRURCQUNLX0lOU0VSVF9BRlRFUikgewotCQkJcmVzdWx0ID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldFN0cnVjdHVyZWRNb2RlbChOb2RlIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlyZXN1bHQgPSAoKElET01Ob2RlKSBub2RlKS5nZXRNb2RlbCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gcmV0dXJucyB0cnVlIGlmIGEgaXMgYW4gYW5jZXN0b3JlIG9mIGIKLQkvLwotCXByaXZhdGUgYm9vbGVhbiBpc0FuY2VzdG9yKE5vZGUgYSwgTm9kZSBiKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWZvciAoTm9kZSBwYXJlbnQgPSBiOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKHBhcmVudCA9PSBhKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmVtb3ZlcyBtZW1iZXJzIG9mIHRoZSBsaXN0IHRoYXQgaGF2ZSBhbmNlc3RvcnMgdGhhdCBhcmUKLQkgKiBhbHNvIG1lbWJlcnMgb2YgdGhlIGxpc3QuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU1lbWJlckRlc2NlbmRhbnRzKExpc3QgbGlzdCkgewotCQlIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgbm9kZSA9IGkubmV4dCgpOwotCQkJdGFibGUucHV0KG5vZGUsIG5vZGUpOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IGxpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCU9iamVjdCBub2RlID0gIGxpc3QuZ2V0KGkpOyAKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgTm9kZSl7Ci0JCQkJZm9yIChOb2RlIHBhcmVudCA9IGdldFBhcmVudE9yT3duZXIoKE5vZGUpbm9kZSk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBnZXRQYXJlbnRPck93bmVyKHBhcmVudCkpIHsKLQkJCQkJaWYgKHRhYmxlLmdldChwYXJlbnQpICE9IG51bGwpIHsKLQkJCQkJCWxpc3QucmVtb3ZlKGkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZG5kL1hNTERyYWdBbmREcm9wTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RuZC9YTUxEcmFnQW5kRHJvcE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgwOTdhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZG5kL1hNTERyYWdBbmREcm9wTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLkRyYWdBbmREcm9wTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5PYmplY3RUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5WaWV3ZXJEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWE1MRHJhZ0FuZERyb3BNYW5hZ2VyIGltcGxlbWVudHMgRHJhZ0FuZERyb3BNYW5hZ2VyIHsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgZlZpZXdlcjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGREcmFnQW5kRHJvcFN1cHBvcnQoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTks7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW117T2JqZWN0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX07Ci0JCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKLQkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyb3BBZGFwdGVyKHZpZXdlciwgbmV3IFhNTERyYWdBbmREcm9wTWFuYWdlcih2aWV3ZXIpKSk7Ci0JfQotCi0JcHVibGljIFhNTERyYWdBbmREcm9wTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgWE1MRHJhZ0FuZERyb3BNYW5hZ2VyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWZWaWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCi0JcHVibGljIERyYWdBbmREcm9wQ29tbWFuZCBjcmVhdGVDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2UpIHsKLQkJRHJhZ0FuZERyb3BDb21tYW5kIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXN1bHQgPSBuZXcgRHJhZ05vZGVDb21tYW5kKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlLCBmVmlld2VyKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kb3VibGVjbGljay9YTUxEb3VibGVDbGlja1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZG91YmxlY2xpY2svWE1MRG91YmxlQ2xpY2tTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDM1ZDg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kb3VibGVjbGljay9YTUxEb3VibGVDbGlja1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZG91YmxlY2xpY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRUZXh0RG91YmxlQ2xpY2tTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgWE1MRG91YmxlQ2xpY2tTdHJhdGVneSBleHRlbmRzIERlZmF1bHRUZXh0RG91YmxlQ2xpY2tTdHJhdGVneSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9RVU9URSA9ICdcIic7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIFNJTkdMRV9RVU9URSA9ICdcJyc7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIFNQQUNFID0gJyAnOwotCXByb3RlY3RlZCBpbnQgZkNhcmV0UG9zaXRpb24gPSAtMTsKLQlwcm90ZWN0ZWQgaW50IGZEb3VibGVDbGlja0NvdW50ID0gMDsKLQlwcm90ZWN0ZWQgTm9kZSBmTm9kZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgZlN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JcHJvdGVjdGVkIElUZXh0Vmlld2VyIGZUZXh0Vmlld2VyOwotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBmVGV4dFJlZ2lvbiA9IG51bGw7Ci0KLQlwdWJsaWMgdm9pZCBkb3VibGVDbGlja2VkKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJCWZUZXh0Vmlld2VyID0gdGV4dFZpZXdlcjsKLQkJCXRyeSB7Ci0JCQkJZlN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZlRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0KLQkJCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCWludCBjYXJldFBvc2l0aW9uID0gdGV4dFZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCkueDsKLQkJCQkJaWYgKGNhcmV0UG9zaXRpb24gPCAwKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQlmTm9kZSA9IChOb2RlKSBmU3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oY2FyZXRQb3NpdGlvbik7Ci0JCQkJCWlmIChmTm9kZSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQl1cGRhdGVEb3VibGVDbGlja0NvdW50KGNhcmV0UG9zaXRpb24pOwotCQkJCQl1cGRhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJdXBkYXRlVGV4dFJlZ2lvbigpOwotCi0JCQkJCWlmIChmTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCQlwcm9jZXNzVGV4dERvdWJsZUNsaWNrZWQoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXByb2Nlc3NFbGVtZW50RG91YmxlQ2xpY2tlZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJCQlmU3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0V29yZChTdHJpbmcgc3RyaW5nLCBpbnQgY3Vyc29yKSB7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpbnQgd29yZFN0YXJ0ID0gMDsKLQkJaW50IHdvcmRFbmQgPSBzdHJpbmcubGVuZ3RoKCk7Ci0KLQkJd29yZFN0YXJ0ID0gc3RyaW5nLmxhc3RJbmRleE9mKFNQQUNFLCBjdXJzb3IgLSAxKTsKLQkJaW50IHRlbXAgPSBzdHJpbmcubGFzdEluZGV4T2YoU0lOR0xFX1FVT1RFLCBjdXJzb3IgLSAxKTsKLQkJd29yZFN0YXJ0ID0gTWF0aC5tYXgod29yZFN0YXJ0LCB0ZW1wKTsKLQkJdGVtcCA9IHN0cmluZy5sYXN0SW5kZXhPZihET1VCTEVfUVVPVEUsIGN1cnNvciAtIDEpOwotCQl3b3JkU3RhcnQgPSBNYXRoLm1heCh3b3JkU3RhcnQsIHRlbXApOwotCQlpZiAod29yZFN0YXJ0ID09IC0xKSB7Ci0JCQl3b3JkU3RhcnQgPSBjdXJzb3I7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl3b3JkU3RhcnQrKzsKLQkJfQotCi0JCXdvcmRFbmQgPSBzdHJpbmcuaW5kZXhPZihTUEFDRSwgY3Vyc29yKTsKLQkJaWYgKHdvcmRFbmQgPT0gLTEpIHsKLQkJCXdvcmRFbmQgPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCX0KLQkJdGVtcCA9IHN0cmluZy5pbmRleE9mKFNJTkdMRV9RVU9URSwgY3Vyc29yKTsKLQkJaWYgKHRlbXAgPT0gLTEpIHsKLQkJCXRlbXAgPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCX0KLQkJd29yZEVuZCA9IE1hdGgubWluKHdvcmRFbmQsIHRlbXApOwotCQl0ZW1wID0gc3RyaW5nLmluZGV4T2YoRE9VQkxFX1FVT1RFLCBjdXJzb3IpOwotCQlpZiAodGVtcCA9PSAtMSkgewotCQkJdGVtcCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJfQotCQl3b3JkRW5kID0gTWF0aC5taW4od29yZEVuZCwgdGVtcCk7Ci0JCWlmICh3b3JkRW5kID09IHN0cmluZy5sZW5ndGgoKSkgewotCQkJd29yZEVuZCA9IGN1cnNvcjsKLQkJfQotCi0JCWlmICgod29yZFN0YXJ0ID09IHdvcmRFbmQpICYmICFpc1F1b3RlZChzdHJpbmcpKSB7Ci0JCQl3b3JkU3RhcnQgPSAwOwotCQkJd29yZEVuZCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJfQotCi0JCXJldHVybiBuZXcgUG9pbnQod29yZFN0YXJ0LCB3b3JkRW5kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1F1b3RlZChTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmICgoc3RyaW5nID09IG51bGwpIHx8IChzdHJpbmcubGVuZ3RoKCkgPCAyKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaW50IGxhc3RJbmRleCA9IHN0cmluZy5sZW5ndGgoKSAtIDE7Ci0JCWNoYXIgZmlyc3RDaGFyID0gc3RyaW5nLmNoYXJBdCgwKTsKLQkJY2hhciBsYXN0Q2hhciA9IHN0cmluZy5jaGFyQXQobGFzdEluZGV4KTsKLQotCQlyZXR1cm4gKCgoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URSkgJiYgKGxhc3RDaGFyID09IFNJTkdMRV9RVU9URSkpIHx8ICgoZmlyc3RDaGFyID09IERPVUJMRV9RVU9URSkgJiYgKGxhc3RDaGFyID09IERPVUJMRV9RVU9URSkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudEF0dHJFcXVhbHNEb3VibGVDbGlja2VkMlRpbWVzKCkgewotCQlpbnQgcHJldlJlZ2lvbk9mZnNldCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pIC0gMTsKLQkJSVRleHRSZWdpb24gcHJldlJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocHJldlJlZ2lvbk9mZnNldCk7Ci0JCWludCBuZXh0UmVnaW9uT2Zmc2V0ID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoZlRleHRSZWdpb24pOwotCQlJVGV4dFJlZ2lvbiBuZXh0UmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuZXh0UmVnaW9uT2Zmc2V0KTsKLQotCQlpZiAoKHByZXZSZWdpb24gIT0gbnVsbCkgJiYgKHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgJiYgKG5leHRSZWdpb24gIT0gbnVsbCkgJiYgKG5leHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpKSB7Ci0JCQlmVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocHJldlJlZ2lvbiksIG5leHRSZWdpb24uZ2V0VGV4dEVuZCgpIC0gcHJldlJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50QXR0ck5hbWVEb3VibGVDbGlja2VkMlRpbWVzKCkgewotCQlpbnQgbmV4dFJlZ2lvbk9mZnNldCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KGZUZXh0UmVnaW9uKTsKLQkJSVRleHRSZWdpb24gbmV4dFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV4dFJlZ2lvbk9mZnNldCk7Ci0KLQkJaWYgKG5leHRSZWdpb24gIT0gbnVsbCkgewotCQkJbmV4dFJlZ2lvbk9mZnNldCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KG5leHRSZWdpb24pOwotCQkJbmV4dFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV4dFJlZ2lvbk9mZnNldCk7Ci0JCQlpZiAoKG5leHRSZWdpb24gIT0gbnVsbCkgJiYgKG5leHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpKSB7Ci0JCQkJZlRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSwgbmV4dFJlZ2lvbi5nZXRUZXh0RW5kKCkgLSBmVGV4dFJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGF0dHJpYnV0ZSBoYXMgbm8gdmFsdWUKLQkJCQlmVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSwgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAwOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnRBdHRyVmFsdWVEb3VibGVDbGlja2VkKCkgewotCQlTdHJpbmcgcmVnaW9uVGV4dCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChmVGV4dFJlZ2lvbik7Ci0KLQkJaWYgKGZEb3VibGVDbGlja0NvdW50ID09IDEpIHsKLQkJCVBvaW50IHdvcmQgPSBnZXRXb3JkKHJlZ2lvblRleHQsIGZDYXJldFBvc2l0aW9uIC0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbikpOwotCQkJaWYgKHdvcmQueCA9PSB3b3JkLnkpIHsgLy8gbm8gd29yZCBmb3VuZDsgc2VsZWN0IHdob2xlIHJlZ2lvbgotCQkJCWZUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbiksIHJlZ2lvblRleHQubGVuZ3RoKCkpOwotCQkJCWZEb3VibGVDbGlja0NvdW50Kys7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pICsgd29yZC54LCB3b3JkLnkgLSB3b3JkLngpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGZEb3VibGVDbGlja0NvdW50ID09IDIpIHsKLQkJCWlmIChpc1F1b3RlZChyZWdpb25UZXh0KSkgewotCQkJCS8vID09PiAvLyBQb2ludCB3b3JkID0gZ2V0V29yZChyZWdpb25UZXh0LCBmQ2FyZXRQb3NpdGlvbiAtCi0JCQkJLy8gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbikpOwotCQkJCWZUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbiksIHJlZ2lvblRleHQubGVuZ3RoKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcHJvY2Vzc0VsZW1lbnRBdHRyVmFsdWVEb3VibGVDbGlja2VkMlRpbWVzKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZkRvdWJsZUNsaWNrQ291bnQgPT0gMykgewotCQkJaWYgKGlzUXVvdGVkKHJlZ2lvblRleHQpKSB7Ci0JCQkJcHJvY2Vzc0VsZW1lbnRBdHRyVmFsdWVEb3VibGVDbGlja2VkMlRpbWVzKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSwgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAwOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBmRG91YmxlQ2xpY2tDb3VudCA9PSA0Ci0JCQlmVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSwgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQlmRG91YmxlQ2xpY2tDb3VudCA9IDA7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudEF0dHJWYWx1ZURvdWJsZUNsaWNrZWQyVGltZXMoKSB7Ci0JCWludCBwcmV2UmVnaW9uT2Zmc2V0ID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbikgLSAxOwotCQlJVGV4dFJlZ2lvbiBwcmV2UmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwcmV2UmVnaW9uT2Zmc2V0KTsKLQotCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlwcmV2UmVnaW9uT2Zmc2V0ID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChwcmV2UmVnaW9uKSAtIDE7Ci0JCQlwcmV2UmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwcmV2UmVnaW9uT2Zmc2V0KTsKLQkJCWlmICgocHJldlJlZ2lvbiAhPSBudWxsKSAmJiAocHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSkgewotCQkJCWZUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChwcmV2UmVnaW9uKSwgZlRleHRSZWdpb24uZ2V0VGV4dEVuZCgpIC0gcHJldlJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50RG91YmxlQ2xpY2tlZCgpIHsKLQkJaWYgKGZUZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlwcm9jZXNzRWxlbWVudEF0dHJWYWx1ZURvdWJsZUNsaWNrZWQoKTsgLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IKLQkJfQotCQllbHNlIHsKLQkJCWlmIChmRG91YmxlQ2xpY2tDb3VudCA9PSAxKSB7Ci0JCQkJZlRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCkgKyBmVGV4dFJlZ2lvbi5nZXRTdGFydCgpLCBmVGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJfQotCQkJZWxzZSBpZiAoZkRvdWJsZUNsaWNrQ291bnQgPT0gMikgewotCQkJCWlmIChmVGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCXByb2Nlc3NFbGVtZW50QXR0ck5hbWVEb3VibGVDbGlja2VkMlRpbWVzKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGZUZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCQlwcm9jZXNzRWxlbWVudEF0dHJFcXVhbHNEb3VibGVDbGlja2VkMlRpbWVzKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSwgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCWZEb3VibGVDbGlja0NvdW50ID0gMDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsgLy8gZkRvdWJsZUNsaWNrQ291bnQgPT0gMwotCQkJCWZUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpLCBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQlmRG91YmxlQ2xpY2tDb3VudCA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVGV4dERvdWJsZUNsaWNrZWQoKSB7Ci0JCWlmIChmRG91YmxlQ2xpY2tDb3VudCA9PSAxKSB7Ci0JCQlzdXBlci5kb3VibGVDbGlja2VkKGZUZXh0Vmlld2VyKTsKLQotCQkJUG9pbnQgc2VsZWN0ZWRSYW5nZSA9IGZUZXh0Vmlld2VyLmdldFNlbGVjdGVkUmFuZ2UoKTsKLQkJCWlmICgoc2VsZWN0ZWRSYW5nZS54ID09IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pKSAmJiAoc2VsZWN0ZWRSYW5nZS55ID09IGZUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSkpIHsKLQkJCQkvLyBvbmx5IG9uZSB3b3JkIGluIHJlZ2lvbiwgc2tpcCBvbmUgbGV2ZWwgb2YgZG91YmxlIGNsaWNrCi0JCQkJLy8gc2VsZWN0aW9uCi0JCQkJZkRvdWJsZUNsaWNrQ291bnQrKzsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChmRG91YmxlQ2xpY2tDb3VudCA9PSAyKSB7Ci0JCQlpZiAoZlRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEKSB7Ci0JCQkJZlRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCksIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWZEb3VibGVDbGlja0NvdW50ID0gMDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChpc1F1b3RlZChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KGZUZXh0UmVnaW9uKSkpIHsKLQkJCQkJZlRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSArIDEsIGZUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSAtIDIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZlRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSwgZlRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoKGZEb3VibGVDbGlja0NvdW50ID09IDMpICYmIGlzUXVvdGVkKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RnVsbFRleHQoZlRleHRSZWdpb24pKSkgewotCQkJCWZUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbiksIGZUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoKGZEb3VibGVDbGlja0NvdW50ID09IDMpICYmIGlzUXVvdGVkKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UZXh0KSkgewotCQkJCQlmVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSArIDEsIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkgLSAyKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpLCBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAwOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWZTdHJ1Y3R1cmVkTW9kZWwgPSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRG91YmxlQ2xpY2tDb3VudChpbnQgY2FyZXRQb3NpdGlvbikgewotCQlpZiAoZkNhcmV0UG9zaXRpb24gPT0gY2FyZXRQb3NpdGlvbikgewotCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCWZEb3VibGVDbGlja0NvdW50Kys7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmRG91YmxlQ2xpY2tDb3VudCA9IDE7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmQ2FyZXRQb3NpdGlvbiA9IGNhcmV0UG9zaXRpb247Ci0JCQlmRG91YmxlQ2xpY2tDb3VudCA9IDE7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBmU3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGZDYXJldFBvc2l0aW9uKTsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblRleHQgPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQoKTsKLQkJfQotCQllbHNlIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRleHRSZWdpb24oKSB7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCWZUZXh0UmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmQ2FyZXRQb3NpdGlvbik7Ci0JCQkvLyBpZiBmVGV4dFJlZ2lvbiBpcyBudWxsLCBpdCBtZWFucyB3ZSBhcmUgYXQganVzdCBwYXN0IHRoZSBsYXN0Ci0JCQkvLyBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLAotCQkJLy8gYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBkb2N1bWVudCwgc28gd2UnbGwgdXNlIHRoZSBsYXN0IHRleHQKLQkJCS8vIHJlZ2lvbiBpbiB0aGUgZG9jdW1lbnQKLQkJCWlmIChmVGV4dFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJZlRleHRSZWdpb24gPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGZDYXJldFBvc2l0aW9uIC0gMSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmVGV4dFJlZ2lvbiA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0NNSW1hZ2VVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0NNSW1hZ2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYjRkZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9DTUltYWdlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5KYXJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIG5zZAotICovCi1wdWJsaWMgY2xhc3MgQ01JbWFnZVV0aWwgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU01BTExfSUNPTl9VUkwgPSAic21hbGwtaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgQ01Ob2RlIGdldERlY2xhcmF0aW9uKE5vZGUgbm9kZSkgewotCQlDTU5vZGUgZGVjbCA9IG51bGw7Ci0JCU1vZGVsUXVlcnkgbXEgPSBudWxsOwotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDogewotCQkJCW1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoKEF0dHIpIG5vZGUpLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQkJZGVjbCA9IG1xLmdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oKEF0dHIpIG5vZGUpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQltcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJCWRlY2wgPSBtcS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgbm9kZSk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGRlY2w7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShDTU5vZGUgY21ub2RlKSB7Ci0JCWlmIChjbW5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQkvLyBjYWNoZSBDTS1zcGVjaWZpZWQgaW1hZ2VzIHdpdGggdGhlIFhNTCBVSSBwbHVnaW4KLQkJU3RyaW5nIGltYWdlVVJMU3RyaW5nID0gKFN0cmluZykgY21ub2RlLmdldFByb3BlcnR5KFNNQUxMX0lDT05fVVJMKTsKLQkJaWYgKChpbWFnZVVSTFN0cmluZyAhPSBudWxsKSAmJiAoaW1hZ2VVUkxTdHJpbmcubGVuZ3RoKCkgPiAwKSkgewotCQkJLyogRmlyc3QgZW5zdXJlIHRoYXQgdGhlIGRlc2NyaXB0b3IgaXRzZWxmIGlzIGNhY2hlZCAqLwotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihpbWFnZVVSTFN0cmluZyk7Ci0JCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkvKgotCQkJCSAqIFRoZW4gb2J0YWluIHRoZSBpbWFnZSBmcm9tIHRoZSByZWdpc3RyeSBzbyB0aGF0IGl0IGlzIGJvdGgKLQkJCQkgKiBjYWNoZWQgYW5kIHByb3Blcmx5IGRpc3Bvc2VkIG9mIGxhdGVyCi0JCQkJICovCi0JCQkJaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGltYWdlVVJMU3RyaW5nKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKENNTm9kZSBjbW5vZGUpIHsKLQkJaWYgKGNtbm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvLyBjYWNoZSBDTS1zcGVjaWZpZWQgaW1hZ2VzIHdpdGggdGhlIFhNTCBVSSBwbHVnaW4KLQkJU3RyaW5nIGltYWdlVVJMU3RyaW5nID0gKFN0cmluZykgY21ub2RlLmdldFByb3BlcnR5KFNNQUxMX0lDT05fVVJMKTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBudWxsOwotCQlpZiAoKGltYWdlVVJMU3RyaW5nICE9IG51bGwpICYmIChpbWFnZVVSTFN0cmluZy5sZW5ndGgoKSA+IDApKSB7Ci0JCQlkZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlVVJMU3RyaW5nKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpbWFnZVVSTFN0cmluZykgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXREZXNjcmlwdG9yKGltYWdlVVJMU3RyaW5nKTsKLQkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlVUkwgaW1hZ2VVUkwgPSBuZXcgVVJMKGltYWdlVVJMU3RyaW5nKTsKLQkJCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IEphclV0aWxpdGllcy5nZXRJbnB1dFN0cmVhbShpbWFnZVVSTCk7Ci0JCQkJdHJ5IHsKLQkJCQkJSW1hZ2VEYXRhIGRhdGEgPSBuZXcgSW1hZ2VEYXRhKGlucHV0U3RyZWFtKTsKLQkJCQkJZGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tSW1hZ2VEYXRhKGRhdGEpOwotCQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGltYWdlVVJMU3RyaW5nLCBkZXNjcmlwdG9yKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIFRoZXJlIHdhcyBhIHByb2JsZW0gbG9hZGluZyBpbWFnZSBmcm9tIHN0cmVhbQotCQkJCQkgKiAoY29ycnVwdCwgbWlzc2luZywgZXRjLikKLQkJCQkJICovCi0JCQkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKQotCQkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlkZXNjcmlwdG9yID0gbnVsbDsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZGVzY3JpcHRvciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDTUltYWdlVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0RPTVNlbGVjdGlvbkNvbnZlcnRvckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvRE9NU2VsZWN0aW9uQ29udmVydG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjA5ODhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvRE9NU2VsZWN0aW9uQ29udmVydG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5TZWxlY3Rpb25Db252ZXJ0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOw0KLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBuaXRpbg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBET01TZWxlY3Rpb25Db252ZXJ0b3JGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBREFQVEVSX0xJU1QgPSBuZXcgQ2xhc3NbXXtTZWxlY3Rpb25Db252ZXJ0b3IuY2xhc3N9Ow0KLQ0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBYTUxTZWxlY3Rpb25Db252ZXJ0b3IgZXh0ZW5kcyBTZWxlY3Rpb25Db252ZXJ0b3Igew0KLQkJLyogKG5vbi1KYXZhZG9jKQ0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5TZWxlY3Rpb25Db252ZXJ0b3IjZ2V0RWxlbWVudHMob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWwsIGludCwgaW50KQ0KLQkJICovDQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7DQotCQkJT2JqZWN0W10gb2JqZWN0cyA9IHN1cGVyLmdldEVsZW1lbnRzKG1vZGVsLCBzdGFydCwgZW5kKTsNCi0JCQkvLyBuYXJyb3cgc2luZ2xlIHNlbGVjdGVkIEVsZW1lbnRzIGludG8gQXR0cnMgaWYgcG9zc2libGUNCi0JCQlpZiAob2JqZWN0cy5sZW5ndGggPT0gMSkgew0KLQkJCQlpZiAob2JqZWN0c1swXSBpbnN0YW5jZW9mIElET01Ob2RlKSB7DQotCQkJCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBvYmplY3RzWzBdOw0KLQkJCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsNCi0JCQkJCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsNCi0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgew0KLQkJCQkJCQlJRE9NQXR0ciBhdHRyaWJ1dGUgPSAoSURPTUF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsNCi0JCQkJCQkJaWYgKGF0dHJpYnV0ZS5jb250YWlucyhzdGFydCkgJiYgYXR0cmlidXRlLmNvbnRhaW5zKGVuZCkpIHsNCi0JCQkJCQkJCW9iamVjdHNbMF0gPSBhdHRyaWJ1dGU7DQotCQkJCQkJCQlicmVhazsNCi0JCQkJCQkJfQ0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCQlyZXR1cm4gb2JqZWN0czsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3Qgc2VsZWN0aW9uQ29udmVydG9yID0gbmV3IFhNTFNlbGVjdGlvbkNvbnZlcnRvcigpOw0KLQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgRE9NU2VsZWN0aW9uQ29udmVydG9yRmFjdG9yeSgpIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlDQotCSAqIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LA0KLQkgKiBqYXZhLmxhbmcuQ2xhc3MpDQotCSAqLw0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsNCi0JCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJRE9NTW9kZWwgJiYgU2VsZWN0aW9uQ29udmVydG9yLmNsYXNzLmVxdWFscyhhZGFwdGVyVHlwZSkpDQotCQkJcmV0dXJuIHNlbGVjdGlvbkNvbnZlcnRvcjsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyTGlzdCgpDQotCSAqLw0KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsNCi0JCXJldHVybiBBREFQVEVSX0xJU1Q7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NTQyZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIFhNTCBTb3VyY2UgRWRpdG9yLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBjb250YWlucyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlCi0gKiBpbXBsZW1lbnRlZC4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIZWxwQ29udGV4dElkcyB7Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBYTUxVSVBsdWdpbi5JRCArICIuIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gZmlndXJlZCBvdXQgb24gdGhlIGZseQotCS8vIC8vIFhNTCBTb3VyY2UgcGFnZSBlZGl0b3IKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfU09VUkNFVklFV19IRUxQSUQgPQotCS8vIENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwgKyJfc291cmNlX0hlbHBJZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFhNTCBGaWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfUFJFRldFQlhfRklMRVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDYwIjsgLy8kTk9OLU5MUy0xJAotCS8vIFhNTCBTb3VyY2UgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1BSRUZXRUJYX1NPVVJDRV9IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwNjEiOyAvLyROT04tTkxTLTEkCi0JLy8gWE1MIFN0eWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDA2MiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBYTUwgVGVtcGxhdGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QUkVGV0VCWF9URU1QTEFURVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDYzIjsgLy8kTk9OLU5MUy0xJAotICAgIC8vIFhNTCBWYWxpZGF0b3IgUHJlZmVyZW5jZSBwYWdlCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1BSRUZXRUJYX1ZBTElEQVRPUl9IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwNjQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBYTUwgQ2xlYW51cCBkaWFsb2cKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX1hNTF9IRUxQSUQgPSBQUkVGSVggKyAieG1sbTEyMDAiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBYTUwgTmV3IEZpbGUgV2l6YXJkIC0gVGVtcGxhdGUgUGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEID0gUFJFRklYICsgInhtbHcwMDEwIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2I2NzM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBpbWFnZXMgcHJvdmlkZWQgYnkgdGhpcyBwbHVnLWluLgotICogCi0gKiBOT1RFOiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEZvciBpbWFnZXMgdXNlZCBleHRlcm5hbGx5LCBwbGVhc2UgdXNlIHRoZQotICogU2hhcmVkKioqSW1hZ2VIZWxwZXIgY2xhc3MgaW5zdGVhZC4KLSAqIAotICogQGF1dGhvciBhbXl3dQotICovCi1wdWJsaWMgY2xhc3MgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgewotCXByaXZhdGUgc3RhdGljIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyIGluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIEdldHMgdGhlIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvLyBzYXZlIGEgZGVzY3JpcHRvciBmb3IgZWFjaCBpbWFnZQotCXByaXZhdGUgSGFzaE1hcCBmSW1hZ2VEZXNjUmVnaXN0cnkgPSBudWxsOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBMVUdJTklEID0gWE1MVUlQbHVnaW4uSUQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGZyb20gdGhlIGdpdmVuIHJlc291cmNlIGFuZCBhZGRzIHRoZSBpbWFnZSB0byB0aGUKLQkgKiBpbWFnZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIEltYWdlCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBjcmVhdGVJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBnZXRJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQkvLyBkb250IGFkZCB0aGUgbWlzc2luZyBpbWFnZSBkZXNjcmlwdG9yIGltYWdlIHRvIHRoZSBpbWFnZQotCQkJLy8gcmVnaXN0cnkKLQkJCWlmICghZGVzYy5lcXVhbHMoSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKSkpIHsKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBpbWFnZUZpbGVQYXRoIGFuZCBhZGRzIHRoZQotCSAqIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIGFuIGltYWdlCi0JICogZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBpcyByZXR1cm5lZCBidXQgbm90IGFkZGVkIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgZGVzY3JpcHRvciBmb3IgaW1hZ2VGaWxlUGF0aCBvciBkZWZhdWx0Ci0JICogICAgICAgICAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRmlsZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIElmIHRoZSBpbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGF0Ci0JICogdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2UgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGFuIGltYWdlCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZQotCSAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQsCi0JICogYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQKLQkgKiBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NhdGVkIHdpdGggcmVzb3VyY2Ugb3IKLQkgKiAgICAgICAgIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIG9uZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlPYmplY3QgbyA9IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGEgZGVzY3JpcHRvcgotCQkJaW1hZ2VEZXNjcmlwdG9yID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IChJbWFnZURlc2NyaXB0b3IpIG87Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEhhc2hNYXAgLSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlmSW1hZ2VEZXNjUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJldHVybiBmSW1hZ2VEZXNjUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSW1hZ2VSZWdpc3RyeSAtIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL1hNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9YTUxFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyYzRiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL1hNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvcjsKLQotLyoqCi0gKiBCdW5kbGUgb2YgbW9zdCBpbWFnZXMgdXNlZCBieSB0aGUgWE1MIFNvdXJjZSBFZGl0b3IgcGx1Zy1pbi4KLSAqLwotcHVibGljIGNsYXNzIFhNTEVkaXRvclBsdWdpbkltYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQ09OU1RSQUlOT0ZGID0gImljb25zL2Z1bGwvZHRvb2wxNi9jb25zdHJhaW5vZmYuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9DT05TVFJBSU5PTiA9ICJpY29ucy9mdWxsL2R0b29sMTYvY29uc3RyYWlub24uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9STERHUk1SID0gImljb25zL2Z1bGwvZHRvb2wxNi9ybGRncm1yLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfVkFMSURBVEUgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L3ZhbGlkYXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfQ09OU1RSQUlOT0ZGID0gImljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vZmYuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9DT05TVFJBSU5PTiA9ICJpY29ucy9mdWxsL2V0b29sMTYvY29uc3RyYWlub24uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9STERHUk1SID0gImljb25zL2Z1bGwvZXRvb2wxNi9ybGRncm1yLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfVkFMSURBVEUgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L3ZhbGlkYXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0FERF9DT1JSRUNUSU9OID0gImljb25zL2Z1bGwvb2JqMTYvYWRkX2NvcnJlY3Rpb24uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQVRUX1JFUV9PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9hdHRfcmVxX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0FUVFJJQlVURSA9ICJpY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZV9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0RBVEFTRUNUSU9OID0gImljb25zL2Z1bGwvb2JqMTYvY2RhdGFzZWN0aW9uLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NPTU1FTlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50X29iai5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DT1JSRUNUSU9OX0NIQU5HRSA9ICJpY29ucy9mdWxsL29iajE2L2NvcnJlY3Rpb25fY2hhbmdlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0RPQ1RZUEUgPSAiaWNvbnMvZnVsbC9vYmoxNi9kb2N0eXBlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0RUREZJTEUgPSAiaWNvbnMvZnVsbC9vYmoxNi9kdGRmaWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9FTEVNRU5UID0gImljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRU5USVRZID0gImljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0VOVElUWV9SRUZFUkVOQ0UgPSAiaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHlfcmVmZXJlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0VOVU0gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbnVtLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0xPQ0FMX1ZBUklBQkxFID0gImljb25zL2Z1bGwvb2JqMTYvbG9jYWx2YXJpYWJsZV9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfTk9UQVRJT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9ub3RhdGlvbi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9QUk9DRVNTSU5HSU5TVFJVQ1RJT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9wcm9pbnN0X29iai5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9TT1JUID0gImljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfR0VORVJJQyA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19HRU5FUklDX0RFRU1QSEFTSVpFRCA9ICJpY29ucy9mdWxsL29iajE2L3RhZ19nZW5lcmljX2RlZW1waGFzaXplZF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJCAgICAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19HRU5FUklDX0VNUEhBU0laRUQgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWdfZ2VuZXJpY19lbXBoYXNpemVkX29iai5naWYiOyAvLyROT04tTkxTLTEkICAgICAgICAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19NQUNSTyA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1tYWNyby5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UWFRFWFQgPSAiaWNvbnMvZnVsbC9vYmoxNi90ZXh0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1dBUk5JTkdfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvd2FybmluZ19vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRVJST1JfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvZXJyb3Jfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1hTREZJTEUgPSAiaWNvbnMvZnVsbC9vYmoxNi9YU0RGaWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PVlJfRVJST1IgPSAiaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PVlJfU1RBTEVfRVJST1IgPSAiaWNvbnMvZnVsbC9vdnIxNi9zdGFsZV9lcnJvcl9vdnIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PVlJfV0FSTiA9ICJpY29ucy9mdWxsL292cjE2L3dhcm5fb3ZyLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XSVpCQU5fR0VORVJBVEVYTUwgPSAiaWNvbnMvZnVsbC93aXpiYW4vZ2VuZXJhdGV4bWxfd2l6LnBuZyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0RFRkFVTFQgPSAiaWNvbnMvZnVsbC9vYmoxNi9kZWZhdWx0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9BYnN0cmFjdFNpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0Fic3RyYWN0U2libGluZ05hdmlnYXRpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMDU2NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0Fic3RyYWN0U2libGluZ05hdmlnYXRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBQcm92aWRlcyBuYXZpZ2F0aW9uIHRvIG5leHQvcHJldmlvdXMgRE9NIHNpYmxpbmcgTm9kZXMKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0U2libGluZ05hdmlnYXRpb25IYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZUVkaXRvcihldmVudCk7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCWVsc2UgewotCQkJT2JqZWN0IG8gPSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQlpZiAobyAhPSBudWxsKQotCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIG87Ci0JCX0KLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCi0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJTm9kZSBzaWJsaW5nID0gbnVsbDsKLQotCQkJCQlpZiAoKChOb2RlKSBvKS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQkJCW8gPSAoKEF0dHIpIG8pLmdldE93bmVyRWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJCWlmIChtb3ZlRm9yd2FyZCgpKSB7Ci0JCQkJCQlzaWJsaW5nID0gKChOb2RlKSBvKS5nZXROZXh0U2libGluZygpOwotCQkJCQkJd2hpbGUgKHNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgc2libGluZy5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXNpYmxpbmcgPSBzaWJsaW5nLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoc2libGluZyA9PSBudWxsKSB7Ci0JCQkJCQkJc2libGluZyA9ICgoTm9kZSkgbykuZ2V0UGFyZW50Tm9kZSgpLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJCQl3aGlsZSAoc2libGluZyAhPSBudWxsICYmIHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBzaWJsaW5nLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJCXNpYmxpbmcgPSBzaWJsaW5nLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc2libGluZyA9ICgoTm9kZSkgbykuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJCQl3aGlsZSAoc2libGluZyAhPSBudWxsICYmIHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBzaWJsaW5nLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJc2libGluZyA9IHNpYmxpbmcuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoc2libGluZyA9PSBudWxsKSB7Ci0JCQkJCQkJc2libGluZyA9ICgoTm9kZSkgbykuZ2V0UGFyZW50Tm9kZSgpLmdldExhc3RDaGlsZCgpOwotCQkJCQkJCXdoaWxlIChzaWJsaW5nICE9IG51bGwgJiYgc2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIHNpYmxpbmcuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQkJc2libGluZyA9IHNpYmxpbmcuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gVGhlIG9ubHkgY2hpbGQgaXMgYSBUZXh0IE5vZGUsIGdvIHRvIHRoZSBwYXJlbnQgTm9kZQotCQkJCQlpZiAoKChOb2RlKSBvKS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIG8uZXF1YWxzKHNpYmxpbmcpKSB7Ci0JCQkJCQlzaWJsaW5nID0gKChOb2RlKSBvKS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCX0KLQotCi0JCQkJCWlmIChzaWJsaW5nICE9IG51bGwpIHsKLQkJCQkJCXRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2libGluZykpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBib29sZWFuIG1vdmVGb3J3YXJkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQWRkQmxvY2tDb21tZW50SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0FkZEJsb2NrQ29tbWVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1ZjM3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQWRkQmxvY2tDb21tZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiwgYnVnIDIxMjMzMAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Db21tZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRCbG9ja0NvbW1lbnRIYW5kbGVyIGV4dGVuZHMgQ29tbWVudEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7Ci0KLQlwdWJsaWMgQWRkQmxvY2tDb21tZW50SGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQl2b2lkIHByb2Nlc3NBY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvciwgSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCUluZGV4ZWRSZWdpb24gc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCi0JCQkJaWYgKHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKChzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uID09IG51bGwpICYmICh0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpID4gMCkpIHsKLQkJCQkJc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJCQl9Ci0JCQkJaWYgKHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24gPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaW50IG9wZW5Db21tZW50T2Zmc2V0ID0gc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGNsb3NlQ29tbWVudE9mZnNldCA9IHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCk7Ci0KLQkJCQlpZiAoKHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgPT0gMCkgJiYgKHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIENvbW1lbnRJbXBsKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgWE1MVUlNZXNzYWdlcy5BZGRCbG9ja0NvbW1lbnRfdG9vbHRpcCk7Ci0JCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQl0cnkgewotCQkJCQlkb2N1bWVudC5yZXBsYWNlKG9wZW5Db21tZW50T2Zmc2V0LCAwLCBPUEVOX0NPTU1FTlQpOwotCQkJCQlkb2N1bWVudC5yZXBsYWNlKGNsb3NlQ29tbWVudE9mZnNldCwgMCwgQ0xPU0VfQ09NTUVOVCk7Ci0JCQkJCXN1cGVyLnJlbW92ZU9wZW5DbG9zZUNvbW1lbnRzKGRvY3VtZW50LCBvcGVuQ29tbWVudE9mZnNldCArIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgY2xvc2VDb21tZW50T2Zmc2V0IC0gb3BlbkNvbW1lbnRPZmZzZXQgLSBDTE9TRV9DT01NRU5ULmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCW1vZGVsLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9DbGVhbnVwZG9jdW1lbnRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQ2xlYW51cGRvY3VtZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDQ2YTBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9DbGVhbnVwZG9jdW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAtIGJ1ZyAyMTIzMzAgLQotICogICAgICAgICAgICAgICAgICAgIEJhc2VkIG9mZiBDbGVhbnVwQWN0aW9uWE1MRGVsZWdhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNsZWFudXAuQ2xlYW51cFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQ2xlYW51cERpYWxvZ1hNTDsKLQotcHVibGljIGNsYXNzIENsZWFudXBkb2N1bWVudEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZkNsZWFudXBQcm9jZXNzb3I7Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBudWxsaW5nIG91dCBqdXN0IGluIGNhc2UKLQkJZkNsZWFudXBQcm9jZXNzb3IgPSBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZUVkaXRvcihldmVudCk7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCWVsc2UgewotCQkJT2JqZWN0IG8gPSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQlpZiAobyAhPSBudWxsKQotCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIG87Ci0JCX0KLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJZmluYWwgSVRleHRFZGl0b3IgZmluYWxUZXh0RWRpdG9yID0gdGV4dEVkaXRvcjsKLQkJCURpYWxvZyBjbGVhbnVwRGlhbG9nID0gbmV3IENsZWFudXBEaWFsb2dYTUwoZWRpdG9yLmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCWlmIChjbGVhbnVwRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQkvLyBzZXR1cCBydW5uYWJsZQotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgY2xlYW51cFByb2Nlc3NvciA9IGdldENsZWFudXBQcm9jZXNzb3IoKTsKLQkJCQkJCWlmIChjbGVhbnVwUHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZmluYWxUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChmaW5hbFRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkpOwotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJCQkJY2xlYW51cFByb2Nlc3Nvci5jbGVhbnVwTW9kZWwobW9kZWwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCi0JCQkJLy8gVE9ETzogbWFrZSBpbmRlcGVuZGVudCBvZiAnbW9kZWwnLgotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdCh0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vIGJlZ2luIHJlY29yZGluZwotCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBTU0VVSU1lc3NhZ2VzLkNsZWFudXBfRG9jdW1lbnRfVUlfLCBTU0VVSU1lc3NhZ2VzLkNsZWFudXBfRG9jdW1lbnRfVUlfLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0KLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcKLQkJCQkJCS8vIG1vZGVsIGNoYW5nZQotCQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQkJCS8vIHJ1bgotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUodGV4dEVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIHJ1bm5hYmxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnCi0JCQkJCQkvLyBtb2RlbAotCQkJCQkJLy8gY2hhbmdlCi0JCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQotCQkJCQkJLy8gZW5kIHJlY29yZGluZwotCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQltb2RlbC5lbmRSZWNvcmRpbmcodGhpcywgc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZ2V0Q2xlYW51cFByb2Nlc3NvcigpIHsKLQkJaWYgKGZDbGVhbnVwUHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZDbGVhbnVwUHJvY2Vzc29yID0gbmV3IENsZWFudXBQcm9jZXNzb3JYTUwoKTsKLQkJfQotCi0JCXJldHVybiBmQ2xlYW51cFByb2Nlc3NvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQ29sbGFwc2VBbGxIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQ29sbGFwc2VBbGxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYzY0NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0NvbGxhcHNlQWxsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiwgYnVnIDIxMjMzMAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLQotcHVibGljIGNsYXNzIENvbGxhcHNlQWxsSGFuZGxlciBleHRlbmRzIEV4cGFuZENvbGxhcHNlQWxsSGFuZGxlciBpbXBsZW1lbnRzIElIYW5kbGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb2xsYXBzZUFsbEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXIjZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQkKLQkJdmlld2VyID0gZ2V0VGFibGVUcmVlVmlld2VyRm9yRWRpdG9yUGFydChlZGl0b3JQYXJ0KTsKLQkJCi0JCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJLy8gdGVtcG9yYXJpbHkgc2V0IHRoZSB2aXNpYmlsaXR5IHRvIGZhbHNlCi0JCQkvLyB0aGlzIGhhcyBhIEhVR0UgcGVyZm9ybWFuY2UgYmVuZWZpdAotCQkJYm9vbGVhbiBpc1Zpc2libGUgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpLmdldFZpc2libGUoKTsKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQl2aWV3ZXIuY29sbGFwc2VBbGwoKTsKLQotCQkJLy8gcmVzdG9yZSB0aGUgcHJldmlvdXMgdmlzaWJpbGl0eSBzdGF0ZQotCQkJLy8gCi0JCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldFZpc2libGUoaXNWaXNpYmxlKTsKLQkJfQkJCi0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQ29tbWVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9Db21tZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjk0YWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9Db21tZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24sIGJ1ZyAyMTIzMzAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLQotcHVibGljIGNsYXNzIENvbW1lbnRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU0VfQ09NTUVOVCA9ICItLT4iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0NPTU1FTlQgPSAiPCEtLSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBDb21tZW50SGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIHsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwgJiYgdmFsaWRhdGVFZGl0b3JJbnB1dCh0ZXh0RWRpdG9yKSkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24KLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gZ2V0Q3VycmVudFNlbGVjdGlvbih0ZXh0RWRpdG9yKTsKLQkJCQlpZiAodGV4dFNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHJvY2Vzc0FjdGlvbih0ZXh0RWRpdG9yLCBkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUVkaXRvcklucHV0KElUZXh0RWRpdG9yIHRleHRFZGl0b3IpIHsKLQkJaWYgKHRleHRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvckV4dGVuc2lvbjIpCi0JCQlyZXR1cm4gKChJVGV4dEVkaXRvckV4dGVuc2lvbjIpdGV4dEVkaXRvcikudmFsaWRhdGVFZGl0b3JJbnB1dFN0YXRlKCk7Ci0JCWVsc2UgaWYgKHRleHRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvckV4dGVuc2lvbikKLQkJCXJldHVybiAoKElUZXh0RWRpdG9yRXh0ZW5zaW9uKXRleHRFZGl0b3IpLmlzRWRpdG9ySW5wdXRSZWFkT25seSgpOwotCQllbHNlIGlmICh0ZXh0RWRpdG9yICE9IG51bGwpCi0JCQlyZXR1cm4gdGV4dEVkaXRvci5pc0VkaXRhYmxlKCk7Ci0JCXJldHVybiB0cnVlOwotCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yKSB7Ci0JCUlTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gcHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQlyZXR1cm4gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFRleHRTZWxlY3Rpb24uZW1wdHlTZWxlY3Rpb24oKTsKLQl9Ci0KLQl2b2lkIHByb2Nlc3NBY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvciwgSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCS8vIEltcGxlbWVudGF0aW9ucyB0byBvdmVyIHJpZGUuCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlT3BlbkNsb3NlQ29tbWVudHMoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXRyeSB7Ci0JCQlpbnQgYWRqdXN0ZWRfbGVuZ3RoID0gbGVuZ3RoOwotCi0JCQkvLyByZW1vdmUgb3BlbiBjb21tZW50cwotCQkJU3RyaW5nIHN0cmluZyA9IGRvY3VtZW50LmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JCQlpbnQgaW5kZXggPSBzdHJpbmcubGFzdEluZGV4T2YoT1BFTl9DT01NRU5UKTsKLQkJCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQkJCWRvY3VtZW50LnJlcGxhY2Uob2Zmc2V0ICsgaW5kZXgsIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5kZXggPSBzdHJpbmcubGFzdEluZGV4T2YoT1BFTl9DT01NRU5ULCBpbmRleCAtIDEpOwotCQkJCWFkanVzdGVkX2xlbmd0aCAtPSBPUEVOX0NPTU1FTlQubGVuZ3RoKCk7Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSBjbG9zZSBjb21tZW50cwotCQkJc3RyaW5nID0gZG9jdW1lbnQuZ2V0KG9mZnNldCwgYWRqdXN0ZWRfbGVuZ3RoKTsKLQkJCWluZGV4ID0gc3RyaW5nLmxhc3RJbmRleE9mKENMT1NFX0NPTU1FTlQpOwotCQkJd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0JCQkJZG9jdW1lbnQucmVwbGFjZShvZmZzZXQgKyBpbmRleCwgQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5kZXggPSBzdHJpbmcubGFzdEluZGV4T2YoQ0xPU0VfQ09NTUVOVCwgaW5kZXggLSAxKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0NvbnRlbnRNb2RlbFN5bmNoV2l0aEVkaXRvckhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9Db250ZW50TW9kZWxTeW5jaFdpdGhFZGl0b3JIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMDE3ZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0NvbnRlbnRNb2RlbFN5bmNoV2l0aEVkaXRvckhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLQotcHVibGljIGNsYXNzIENvbnRlbnRNb2RlbFN5bmNoV2l0aEVkaXRvckhhbmRsZXIgZXh0ZW5kcwotCQlBYnN0cmFjdEhhbmRsZXIgIHsKLQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JICAgICBDb21tYW5kIGNvbW1hbmQgPSBldmVudC5nZXRDb21tYW5kKCk7Ci0JICAgICBIYW5kbGVyVXRpbC50b2dnbGVDb21tYW5kU3RhdGUoY29tbWFuZCk7Ci0JICAgICByZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvRXhwYW5kQWxsSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0V4cGFuZEFsbEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA5MTM5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvRXhwYW5kQWxsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiwgYnVnIDIxMjMzMAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTFRhYmxlVHJlZVZpZXdlcjsKLQotcHVibGljIGNsYXNzIEV4cGFuZEFsbEhhbmRsZXIgZXh0ZW5kcyBFeHBhbmRDb2xsYXBzZUFsbEhhbmRsZXIgewotCi0JcHJvdGVjdGVkIFhNTFRhYmxlVHJlZVZpZXdlciB2aWV3ZXIgPSBudWxsOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEV4cGFuZEFsbEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXIjZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQotCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gSGFuZGxlclV0aWwuZ2V0QWN0aXZlRWRpdG9yKGV2ZW50KTsKLQkJCi0JCXZpZXdlciA9IGdldFRhYmxlVHJlZVZpZXdlckZvckVkaXRvclBhcnQoZWRpdG9yUGFydCk7Ci0JCQotCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCS8vIHRlbXBvcmFyaWx5IHNldCB0aGUgdmlzaWJpbGl0eSB0byBmYWxzZQotCQkJLy8gdGhpcyBoYXMgYSBIVUdFIHBlcmZvcm1hbmNlIGJlbmVmaXQKLQkJCWJvb2xlYW4gaXNWaXNpYmxlID0gdmlld2VyLmdldENvbnRyb2woKS5nZXRWaXNpYmxlKCk7Ci0JCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldFZpc2libGUoZmFsc2UpOwotCQkJdmlld2VyLmV4cGFuZEFsbCgpOwotCi0JCQkvLyByZXN0b3JlIHRoZSBwcmV2aW91cyB2aXNpYmlsaXR5IHN0YXRlCi0JCQkvLyAKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZShpc1Zpc2libGUpOwotCQl9CQkKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9FeHBhbmRDb2xsYXBzZUFsbEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9FeHBhbmRDb2xsYXBzZUFsbEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJkNDBmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvRXhwYW5kQ29sbGFwc2VBbGxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uLCBidWcgMjEyMzMwCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLklFbGVtZW50VXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tZW51cy5VSUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuSURlc2lnblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5YTUxUYWJsZVRyZWVWaWV3ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFeHBhbmRDb2xsYXBzZUFsbEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBJRWxlbWVudFVwZGF0ZXIgewotCi0JcHJvdGVjdGVkIFhNTFRhYmxlVHJlZVZpZXdlciB2aWV3ZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ29tbWFuZCBoYW5kbGVyIGZvciBoYW5kbGluZyBFeHBhbmQgYW5kIENvbGxhcHNlIGZvciBUcmVlIFZpZXdlciAKLQkgKi8KLQlwdWJsaWMgRXhwYW5kQ29sbGFwc2VBbGxIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkvLyBJbXBsZW1lbnRvcnMgdG8gcHV0IHRoZWlyIGNvZGUgaGVyZS4KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgWE1MVGFibGVUcmVlVmlld2VyIGdldFRhYmxlVHJlZVZpZXdlckZvckVkaXRvclBhcnQoSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCVhNTFRhYmxlVHJlZVZpZXdlciByZXN1bHQgPSBudWxsOwotCQlPYmplY3Qgb2JqZWN0ID0gdGFyZ2V0RWRpdG9yLmdldEFkYXB0ZXIoSURlc2lnblZpZXdlci5jbGFzcyk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBYTUxUYWJsZVRyZWVWaWV3ZXIpIHsKLQkJCXJlc3VsdCA9IChYTUxUYWJsZVRyZWVWaWV3ZXIpIG9iamVjdDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGVFbGVtZW50KFVJRWxlbWVudCBlbGVtZW50LCBNYXAgcGFyYW1ldGVycykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9OZXh0U2libGluZ05hdmlnYXRpb25IYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvTmV4dFNpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjU5NTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9OZXh0U2libGluZ05hdmlnYXRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLXB1YmxpYyBjbGFzcyBOZXh0U2libGluZ05hdmlnYXRpb25IYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RTaWJsaW5nTmF2aWdhdGlvbkhhbmRsZXIgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZUZvcndhcmQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1ByZXZpb3VzU2libGluZ05hdmlnYXRpb25IYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvUHJldmlvdXNTaWJsaW5nTmF2aWdhdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ0MmE4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvUHJldmlvdXNTaWJsaW5nTmF2aWdhdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotcHVibGljIGNsYXNzIFByZXZpb3VzU2libGluZ05hdmlnYXRpb25IYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RTaWJsaW5nTmF2aWdhdGlvbkhhbmRsZXIgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZUZvcndhcmQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9SZWxvYWREZXBlbmRlbmNpZXNIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvUmVsb2FkRGVwZW5kZW5jaWVzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzcxYTE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9SZWxvYWREZXBlbmRlbmNpZXNIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uLCBidWcgMjEyMzMwCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuQ01Eb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLkluZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgUmVsb2FkRGVwZW5kZW5jaWVzSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIElIYW5kbGVyIHsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBSZWxvYWREZXBlbmRlbmNpZXNIYW5kbGVyKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIHsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobW9kZWwpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJCURvY3VtZW50IGRvbURvY3VtZW50ID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCWlmICgobW9kZWxRdWVyeSAhPSBudWxsKSAmJiAobW9kZWxRdWVyeS5nZXRDTURvY3VtZW50TWFuYWdlcigpICE9IG51bGwpKSB7Ci0JCQkJCW1vZGVsUXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKS5nZXRDTURvY3VtZW50Q2FjaGUoKS5jbGVhcigpOwotCQkJCQkvLyBUT0RPLi4uIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gYWNjZXNzIHRoZQotCQkJCQkvLyBET01PYnNlcnZlciB2aWEgTW9kZWxRdWVyeQotCQkJCQkvLyAuLi53aHk/Ci0JCQkJCUNNRG9jdW1lbnRMb2FkZXIgbG9hZGVyID0gbmV3IEluZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlcihkb21Eb2N1bWVudCwgbW9kZWxRdWVyeSk7Ci0JCQkJCWxvYWRlci5sb2FkQ01Eb2N1bWVudHMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1JlbW92ZUJsb2NrQ29tbWVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9SZW1vdmVCbG9ja0NvbW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MDgwYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1JlbW92ZUJsb2NrQ29tbWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24sIGJ1ZyAyMTIzMzAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ29tbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKioKLSAqIEBhdXRob3IgZGNhcnZlcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVCbG9ja0NvbW1lbnRIYW5kbGVyIGV4dGVuZHMgQ29tbWVudEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7Ci0KLQlwdWJsaWMgUmVtb3ZlQmxvY2tDb21tZW50SGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQl2b2lkIHByb2Nlc3NBY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvciwgSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCUluZGV4ZWRSZWdpb24gc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCi0JCQkJaWYgKChzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24gPT0gbnVsbCkgfHwgKHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24gPT0gbnVsbCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWludCBvcGVuQ29tbWVudE9mZnNldCA9IHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCWludCBjbG9zZUNvbW1lbnRPZmZzZXQgPSBzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gT1BFTl9DT01NRU5ULmxlbmd0aCgpIC0gQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKTsKLQotCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFhNTFVJTWVzc2FnZXMuUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXApOwotCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQkJdHJ5IHsKLQkJCQkJaWYgKHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJaWYgKHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIENvbW1lbnRJbXBsKSB7Ci0JCQkJCQkJZG9jdW1lbnQucmVwbGFjZShvcGVuQ29tbWVudE9mZnNldCwgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlkb2N1bWVudC5yZXBsYWNlKGNsb3NlQ29tbWVudE9mZnNldCwgQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgQ29tbWVudEltcGwpIHsKLQkJCQkJCQlkb2N1bWVudC5yZXBsYWNlKG9wZW5Db21tZW50T2Zmc2V0LCBPUEVOX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCi0JCQkJCQlpZiAoc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIENvbW1lbnRJbXBsKSB7Ci0JCQkJCQkJZG9jdW1lbnQucmVwbGFjZShjbG9zZUNvbW1lbnRPZmZzZXQsIENMT1NFX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJlbW92ZU9wZW5DbG9zZUNvbW1lbnRzKGRvY3VtZW50LCBvcGVuQ29tbWVudE9mZnNldCArIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgY2xvc2VDb21tZW50T2Zmc2V0IC0gb3BlbkNvbW1lbnRPZmZzZXQgLSBDTE9TRV9DT01NRU5ULmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCW1vZGVsLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nWE1MSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdYTUxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNDNiNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdYTUxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuaGFuZGxlcnMuQWJzdHJhY3RTdHJ1Y3R1cmVkU2VsZWN0SGFuZGxlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRTZWxlY3RIYW5kbGVyIHsKLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCi0JCWluZGV4ZWRSZWdpb24gPSBnZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQotCQlyZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbihJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24sIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJUmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0JCWlmIChpbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBjdXJzb3JOb2RlID0gKE5vZGUpIGluZGV4ZWRSZWdpb247Ci0KLQkJCS8vIHVzZSBwYXJlbnQgbm9kZSBmb3IgZW1wdHkgdGV4dCBub2RlCi0JCQlpZiAoKGN1cnNvck5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKGN1cnNvck5vZGUuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJY3Vyc29yTm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJaWYgKGN1cnNvck5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCWluZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgY3Vyc29yTm9kZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCVJlZ2lvbiBjdXJzb3JOb2RlUmVnaW9uID0gbmV3IFJlZ2lvbihpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCi0JCQlpZiAoKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPj0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSkgJiYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPD0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPD0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpKSB7Ci0JCQkJTm9kZSBuZXdOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluZXdSZWdpb24gPSBjdXJzb3JOb2RlUmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3ROZXh0WE1MSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3ROZXh0WE1MSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjY3ODlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuaGFuZGxlcnMuQWJzdHJhY3RTdHJ1Y3R1cmVkU2VsZWN0SGFuZGxlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFNlbGVjdE5leHRYTUxIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkU2VsZWN0SGFuZGxlciB7Ci0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlpbnQgb2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgLSAxOwotCQlpZiAob2Zmc2V0IDwgMCkgewotCQkJb2Zmc2V0ID0gMDsKLQkJfQotCi0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW5kZXhlZFJlZ2lvbiA9IGdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnQsIG9mZnNldCk7Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgY3Vyc29yTm9kZSA9IChOb2RlKSBpbmRleGVkUmVnaW9uOwotCi0JCQkvLyB1c2UgcGFyZW50IG5vZGUgZm9yIGVtcHR5IHRleHQgbm9kZQotCQkJaWYgKChjdXJzb3JOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChjdXJzb3JOb2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCWN1cnNvck5vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCWlmIChjdXJzb3JOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQlpbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIGN1cnNvck5vZGU7Ci0JCQkJfQotCQkJfQotCi0JCQlSZWdpb24gY3Vyc29yTm9kZVJlZ2lvbiA9IG5ldyBSZWdpb24oaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBpbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCWludCBjdXJyZW50T2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKTsKLQkJCWludCBjdXJyZW50RW5kT2Zmc2V0ID0gY3VycmVudE9mZnNldCArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPj0gY3VycmVudE9mZnNldCkgJiYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPD0gY3VycmVudEVuZE9mZnNldCkgJiYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IGN1cnJlbnRPZmZzZXQpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA8PSBjdXJyZW50RW5kT2Zmc2V0KSkgewotCQkJCW5ld1JlZ2lvbiA9IGdldE5ld1NlbGVjdGlvblJlZ2lvbjIoaW5kZXhlZFJlZ2lvbiwgdGV4dFNlbGVjdGlvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluZXdSZWdpb24gPSBjdXJzb3JOb2RlUmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2FzIHNlcGFyYXRlZCBvdXQgZnJvbSBnZXROZXdTZWxlY3Rpb25SZWdpb24yIGJlY2F1c2UgdGhlCi0JICogY29kZSBpbiBoZXJlIGlzIGFsbG93ZWQgdG8gYmUgY2FsbGVkIHJlY3Vyc2l2ZWx5LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleGVkUmVnaW9uCi0JICogQHBhcmFtIHRleHRTZWxlY3Rpb24KLQkgKiBAcmV0dXJuIG5ldyByZWdpb24gdG8gc2VsZWN0IG9yIG51bGwgaWYgbm9uZQotCSAqLwotCXByaXZhdGUgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbjIoSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpbmRleGVkUmVnaW9uOwotCQkJTm9kZSBuZXdOb2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQkJaWYgKG5ld05vZGUgPT0gbnVsbCkgewotCQkJCW5ld05vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIG5ld0luZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0KLQkJCQkJaWYgKG5ld05vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJbmV3UmVnaW9uID0gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uMihuZXdJbmRleGVkUmVnaW9uLCBuZXcgVGV4dFNlbGVjdGlvbihuZXdSZWdpb24uZ2V0T2Zmc2V0KCksIG5ld1JlZ2lvbi5nZXRMZW5ndGgoKSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3RQcmV2aW91c1hNTEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNYTUxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNTc0NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3RQcmV2aW91c1hNTEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuaGFuZGxlcnMuQWJzdHJhY3RTdHJ1Y3R1cmVkU2VsZWN0SGFuZGxlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MSGFuZGxlciBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZFNlbGVjdEhhbmRsZXIgewotCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbmRleGVkUmVnaW9uID0gZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgY3Vyc29yTm9kZSA9IChOb2RlKSBpbmRleGVkUmVnaW9uOwotCi0JCQkvLyB1c2UgcGFyZW50IG5vZGUgZm9yIGVtcHR5IHRleHQgbm9kZQotCQkJaWYgKChjdXJzb3JOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChjdXJzb3JOb2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCWN1cnNvck5vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCWlmIChjdXJzb3JOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQlpbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIGN1cnNvck5vZGU7Ci0JCQkJfQotCQkJfQotCi0JCQlSZWdpb24gY3Vyc29yTm9kZVJlZ2lvbiA9IG5ldyBSZWdpb24oaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBpbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQotCQkJaWYgKChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpIDw9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSkgJiYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKSkgewotCQkJCU5vZGUgbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJaWYgKG5ld05vZGUgPT0gbnVsbCkgewotCQkJCQluZXdOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0KLQkJCQkJCWlmIChuZXdOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJCQluZXdSZWdpb24gPSBnZXROZXdTZWxlY3Rpb25SZWdpb24obmV3SW5kZXhlZFJlZ2lvbiwgbmV3IFRleHRTZWxlY3Rpb24obmV3UmVnaW9uLmdldE9mZnNldCgpLCBuZXdSZWdpb24uZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9Ub2dnbGVDb21tZW50SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1RvZ2dsZUNvbW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNzE4MzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1RvZ2dsZUNvbW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiwgYnVnIDIxMjMzMAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFRvZ2dsZUNvbW1lbnRIYW5kbGVyIGV4dGVuZHMgQ29tbWVudEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7Ci0JcHVibGljIFRvZ2dsZUNvbW1lbnRIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZUVkaXRvcihldmVudCk7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCWVsc2UgewotCQkJT2JqZWN0IG8gPSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQlpZiAobyAhPSBudWxsKQotCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIG87Ci0JCX0KLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCAmJiB2YWxpZGF0ZUVkaXRvcklucHV0KHRleHRFZGl0b3IpKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkvLyBnZXQgY3VycmVudCB0ZXh0IHNlbGVjdGlvbgotCQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSBnZXRDdXJyZW50U2VsZWN0aW9uKHRleHRFZGl0b3IpOwotCQkJCWlmICh0ZXh0U2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwcm9jZXNzQWN0aW9uKHRleHRFZGl0b3IsIGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQl2b2lkIHByb2Nlc3NBY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvciwgSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCS8vIGdldCB0ZXh0IHNlbGVjdGlvbiBsaW5lcyBpbmZvCi0JCWludCBzZWxlY3Rpb25TdGFydExpbmUgPSB0ZXh0U2VsZWN0aW9uLmdldFN0YXJ0TGluZSgpOwotCQlpbnQgc2VsZWN0aW9uRW5kTGluZSA9IHRleHRTZWxlY3Rpb24uZ2V0RW5kTGluZSgpOwotCQl0cnkgewotCQkJaW50IHNlbGVjdGlvbkVuZExpbmVPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KHNlbGVjdGlvbkVuZExpbmUpOwotCQkJaW50IHNlbGVjdGlvbkVuZE9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpOwotCi0JCQkvLyBhZGp1c3Qgc2VsZWN0aW9uIGVuZCBsaW5lCi0JCQlpZiAoKHNlbGVjdGlvbkVuZExpbmUgPiBzZWxlY3Rpb25TdGFydExpbmUpICYmIChzZWxlY3Rpb25FbmRMaW5lT2Zmc2V0ID09IHNlbGVjdGlvbkVuZE9mZnNldCkpIHsKLQkJCQlzZWxlY3Rpb25FbmRMaW5lLS07Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0KLQkJLy8gc2F2ZSB0aGUgc2VsZWN0aW9uIHBvc2l0aW9uIHNpbmNlIGl0IHdpbGwgYmUgY2hhbmdpbmcKLQkJUG9zaXRpb24gc2VsZWN0aW9uUG9zaXRpb24gPSBudWxsOwotCQlib29sZWFuIHVwZGF0ZVN0YXJ0T2Zmc2V0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzZWxlY3Rpb25Qb3NpdGlvbiA9IG5ldyBQb3NpdGlvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCWRvY3VtZW50LmFkZFBvc2l0aW9uKHNlbGVjdGlvblBvc2l0aW9uKTsKLQotCQkJLy8gZXh0cmEgY2hlY2sgaWYgY29tbWVudGluZyBmcm9tIGJlZ2lubmluZyBvZiBsaW5lCi0JCQlpbnQgc2VsZWN0aW9uU3RhcnRMaW5lT2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChzZWxlY3Rpb25TdGFydExpbmUpOwotCQkJaWYgKCh0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpID4gMCkgJiYgKHNlbGVjdGlvblN0YXJ0TGluZU9mZnNldCA9PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKSAmJiAhaXNDb21tZW50TGluZShkb2N1bWVudCwgc2VsZWN0aW9uU3RhcnRMaW5lKSkgewotCQkJCXVwZGF0ZVN0YXJ0T2Zmc2V0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0KLQkJcHJvY2Vzc0FjdGlvbihkb2N1bWVudCwgc2VsZWN0aW9uU3RhcnRMaW5lLCBzZWxlY3Rpb25FbmRMaW5lKTsKLQotCQl1cGRhdGVDdXJyZW50U2VsZWN0aW9uKHRleHRFZGl0b3IsIHNlbGVjdGlvblBvc2l0aW9uLCBkb2N1bWVudCwgdXBkYXRlU3RhcnRPZmZzZXQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzQWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgaW50IHNlbGVjdGlvblN0YXJ0TGluZSwgaW50IHNlbGVjdGlvbkVuZExpbmUpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBYTUxVSU1lc3NhZ2VzLlRvZ2dsZUNvbW1lbnRfdG9vbHRpcCk7Ci0JCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQlmb3IgKGludCBpID0gc2VsZWN0aW9uU3RhcnRMaW5lOyBpIDw9IHNlbGVjdGlvbkVuZExpbmU7IGkrKykgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKGRvY3VtZW50LmdldExpbmVMZW5ndGgoaSkgPiAwKSB7Ci0JCQkJCQkJaWYgKGlzQ29tbWVudExpbmUoZG9jdW1lbnQsIGkpKSB7Ci0JCQkJCQkJCWludCBsaW5lT2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChpKTsKLQkJCQkJCQkJSVJlZ2lvbiByZWdpb24gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24oaSk7Ci0JCQkJCQkJCVN0cmluZyBzdHJpbmcgPSBkb2N1bWVudC5nZXQocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCQlpbnQgb3BlbkNvbW1lbnRPZmZzZXQgPSBsaW5lT2Zmc2V0ICsgc3RyaW5nLmluZGV4T2YoT1BFTl9DT01NRU5UKTsKLQkJCQkJCQkJaW50IGNsb3NlQ29tbWVudE9mZnNldCA9IGxpbmVPZmZzZXQgKyBzdHJpbmcuaW5kZXhPZihDTE9TRV9DT01NRU5UKSAtIE9QRU5fQ09NTUVOVC5sZW5ndGgoKTsKLQkJCQkJCQkJdW5jb21tZW50KGRvY3VtZW50LCBvcGVuQ29tbWVudE9mZnNldCwgY2xvc2VDb21tZW50T2Zmc2V0KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWludCBvcGVuQ29tbWVudE9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoaSk7Ci0JCQkJCQkJCWludCBsaW5lRGVsaW1pdGVyTGVuZ3RoID0gZG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcihpKSA9PSBudWxsID8gMCA6IGRvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoaSkubGVuZ3RoKCk7Ci0JCQkJCQkJCWludCBjbG9zZUNvbW1lbnRPZmZzZXQgPSBvcGVuQ29tbWVudE9mZnNldCArIGRvY3VtZW50LmdldExpbmVMZW5ndGgoaSkgLSBsaW5lRGVsaW1pdGVyTGVuZ3RoICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpOwotCQkJCQkJCQljb21tZW50KGRvY3VtZW50LCBvcGVuQ29tbWVudE9mZnNldCwgY2xvc2VDb21tZW50T2Zmc2V0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCW1vZGVsLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0NvbW1lbnRMaW5lKElEb2N1bWVudCBkb2N1bWVudCwgaW50IGxpbmUpIHsKLQkJYm9vbGVhbiBpc0NvbW1lbnQgPSBmYWxzZTsKLQotCQl0cnkgewotCQkJSVJlZ2lvbiByZWdpb24gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24obGluZSk7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZG9jdW1lbnQuZ2V0KHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpKS50cmltKCk7Ci0JCQlpc0NvbW1lbnQgPSAoc3RyaW5nLmxlbmd0aCgpID49IE9QRU5fQ09NTUVOVC5sZW5ndGgoKSArIENMT1NFX0NPTU1FTlQubGVuZ3RoKCkpICYmIHN0cmluZy5zdGFydHNXaXRoKE9QRU5fQ09NTUVOVCkgJiYgc3RyaW5nLmVuZHNXaXRoKENMT1NFX0NPTU1FTlQpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIGlzQ29tbWVudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tbWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvcGVuQ29tbWVudE9mZnNldCwgaW50IGNsb3NlQ29tbWVudE9mZnNldCkgewotCQl0cnkgewotCQkJZG9jdW1lbnQucmVwbGFjZShvcGVuQ29tbWVudE9mZnNldCwgMCwgT1BFTl9DT01NRU5UKTsKLQkJCWRvY3VtZW50LnJlcGxhY2UoY2xvc2VDb21tZW50T2Zmc2V0LCAwLCBDTE9TRV9DT01NRU5UKTsKLQkJCXJlbW92ZU9wZW5DbG9zZUNvbW1lbnRzKGRvY3VtZW50LCBvcGVuQ29tbWVudE9mZnNldCArIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgY2xvc2VDb21tZW50T2Zmc2V0IC0gb3BlbkNvbW1lbnRPZmZzZXQgLSBDTE9TRV9DT01NRU5ULmxlbmd0aCgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVuY29tbWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvcGVuQ29tbWVudE9mZnNldCwgaW50IGNsb3NlQ29tbWVudE9mZnNldCkgewotCQl0cnkgewotCQkJZG9jdW1lbnQucmVwbGFjZShvcGVuQ29tbWVudE9mZnNldCwgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWRvY3VtZW50LnJlcGxhY2UoY2xvc2VDb21tZW50T2Zmc2V0LCBDTE9TRV9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUN1cnJlbnRTZWxlY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvciwgUG9zaXRpb24gc2VsZWN0aW9uUG9zaXRpb24sIElEb2N1bWVudCBkb2N1bWVudCwgYm9vbGVhbiB1cGRhdGVTdGFydE9mZnNldCkgewotCQkvLyB1cGRhdGUgdGhlIHNlbGVjdGlvbiBpZiB0ZXh0IHNlbGVjdGlvbiBjaGFuZ2VkCi0JCWlmIChzZWxlY3Rpb25Qb3NpdGlvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCQkJaWYgKHVwZGF0ZVN0YXJ0T2Zmc2V0KSB7Ci0JCQkJc2VsZWN0aW9uID0gbmV3IFRleHRTZWxlY3Rpb24oZG9jdW1lbnQsIHNlbGVjdGlvblBvc2l0aW9uLmdldE9mZnNldCgpIC0gT1BFTl9DT01NRU5ULmxlbmd0aCgpLCBzZWxlY3Rpb25Qb3NpdGlvbi5nZXRMZW5ndGgoKSArIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZWxlY3Rpb24gPSBuZXcgVGV4dFNlbGVjdGlvbihkb2N1bWVudCwgc2VsZWN0aW9uUG9zaXRpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvblBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJcHJvdmlkZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCQlkb2N1bWVudC5yZW1vdmVQb3NpdGlvbihzZWxlY3Rpb25Qb3NpdGlvbik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvVG9nZ2xlRWRpdE1vZGVIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvVG9nZ2xlRWRpdE1vZGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNjY3M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1RvZ2dsZUVkaXRNb2RlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24sIGJ1ZyAyMTIzMzAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLklDb21tYW5kU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5JRWxlbWVudFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubWVudXMuVUlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnNlcnZpY2VzLklTZXJ2aWNlU2NvcGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5YTUxFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWwuU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBUb2dnbGVFZGl0TW9kZUhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBJRWxlbWVudFVwZGF0ZXIgewotCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3Igb25JbWFnZSA9IFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlRGVzY3JpcHRvcihTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfRVRPT0xfQ09OU1RSQUlOT04pOwotCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3Igb2ZmSW1hZ2UgPSBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZURlc2NyaXB0b3IoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX0VUT09MX0NPTlNUUkFJTk9GRik7Ci0KLQlwdWJsaWMgVG9nZ2xlRWRpdE1vZGVIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZUVkaXRvcihldmVudCk7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCWVsc2UgewotCQkJT2JqZWN0IG8gPSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQlpZiAobyAhPSBudWxsKQotCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIG87Ci0JCX0KLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5OwotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQkJCWludCBuZXdTdGF0ZSA9IGdldE5leHRTdGF0ZShtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCkpOwotCQkJCQltb2RlbFF1ZXJ5LnNldEVkaXRNb2RlKG5ld1N0YXRlKTsKLQotCQkJCQkvLyBGb3JjZSBhIFJlZnJlc2ggb24gdGhpcyBjb21tYW5kIHNvIHRoYXQgdGhlIGltYWdlIGNhbgotCQkJCQkvLyBiZQotCQkJCQkvLyB1cGRhdGVkLgotCQkJCQlJQ29tbWFuZFNlcnZpY2UgY29tbWFuZFNlcnZpY2UgPSAoSUNvbW1hbmRTZXJ2aWNlKSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coZXZlbnQpLmdldFNlcnZpY2UoSUNvbW1hbmRTZXJ2aWNlLmNsYXNzKTsKLQkJCQkJTWFwIGZpbHRlciA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCWZpbHRlci5wdXQoSVNlcnZpY2VTY29wZXMuV0lORE9XX1NDT1BFLCBIYW5kbGVyVXRpbC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coZXZlbnQpKTsKLQkJCQkJY29tbWFuZFNlcnZpY2UucmVmcmVzaEVsZW1lbnRzKGV2ZW50LmdldENvbW1hbmQoKS5nZXRJZCgpLCBmaWx0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TmV4dFN0YXRlKGludCBlZGl0TW9kZSkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWlmIChlZGl0TW9kZSA9PSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpIHsKLQkJCXJlc3VsdCA9IE1vZGVsUXVlcnkuRURJVF9NT0RFX1VOQ09OU1RSQUlORUQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1Q7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vIEhhbmRsZXJzIHRoYXQgbmVlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSB1aSB0aGF0IHRoZSBjb21tYW5kIGNhbWUgZnJvbQotCS8vIG5lZWQgdG8gdXNlIGltcGxlbWVudCB0aGlzIG1ldGhvZC4KLQlwdWJsaWMgdm9pZCB1cGRhdGVFbGVtZW50KFVJRWxlbWVudCBlbGVtZW50LCBNYXAgcGFyYW1ldGVycykgewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIGlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJT2JqZWN0IG8gPSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQlpZiAobyAhPSBudWxsKQotCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIG87Ci0JCX0KLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkgICAgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5OwotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQkJCXNldEFwcGVhcmFuY2VGb3JFZGl0TW9kZShtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCksIGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFwcGVhcmFuY2VGb3JFZGl0TW9kZShpbnQgZWRpdE1vZGUsIFVJRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlZGl0TW9kZSA9PSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpIHsKLQkJCWVsZW1lbnQuc2V0VG9vbHRpcChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8zKTsKLQkJCWVsZW1lbnQuc2V0VGV4dChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8zKTsKLQkJCWVsZW1lbnQuc2V0SWNvbihvbkltYWdlKTsKLQkJfQotCQllbHNlIHsKLQkJCWVsZW1lbnQuc2V0VG9vbHRpcChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl81KTsKLQkJCWVsZW1lbnQuc2V0VGV4dChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl81KTsKLQkJCWVsZW1lbnQuc2V0SWNvbihvZmZJbWFnZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvWE1MRmluZE9jY3VyZW5jZXNIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvWE1MRmluZE9jY3VyZW5jZXNIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MWU1ZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1hNTEZpbmRPY2N1cmVuY2VzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gLSBidWcgMjEyMzMwIC0KLSAqICAgICAgICAgICAgICAgICAgICBCYXNlZCBvZmYgQ2xlYW51cEFjdGlvblhNTERlbGVnYXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlYXJjaC5YTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3I7Ci0KLXB1YmxpYyBjbGFzcyBYTUxGaW5kT2NjdXJlbmNlc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7Ci0JcHJpdmF0ZSBMaXN0IGZQcm9jZXNzb3JzOwotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJYm9vbGVhbiBva2F5ID0gZmFsc2U7Ci0KLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIHsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0KLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IGdldFRleHRTZWxlY3Rpb24odGV4dEVkaXRvcik7Ci0JCQkJRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGZpbmRPY2N1cnJlbmNlUHJvY2Vzc29yID0gZ2V0UHJvY2Vzc29yRm9yQ3VycmVudFNlbGVjdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCQkJaWYgKGZpbmRPY2N1cnJlbmNlUHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCQkJaWYgKHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCQkJCUlGaWxlIGZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpIHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpOwotCQkJCQkJb2theSA9IGZpbmRPY2N1cnJlbmNlUHJvY2Vzc29yLmZpbmRPY2N1cnJlbmNlcyhkb2N1bWVudCwgdGV4dFNlbGVjdGlvbiwgZmlsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG9rYXkpIHsKLQkJCS8vIGNsZWFyIHN0YXR1cyBtZXNzYWdlCi0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmNsZWFyU3RhdHVzTGluZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFNTRVVJTWVzc2FnZXMuRmluZE9jY3VycmVuY2VzQWN0aW9uUHJvdmlkZXJfMDsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHRleHRFZGl0b3IgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dEVkaXRvcikgewotCQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuZGlzcGxheVRlbXBvcmFyeUVycm9yTWVzc2FnZSgoKFN0cnVjdHVyZWRUZXh0RWRpdG9yKSB0ZXh0RWRpdG9yKS5nZXRUZXh0Vmlld2VyKCksIGVycm9yTWVzc2FnZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGFwcHJvcHJpYXRlIGZpbmQgb2NjdXJyZW5jZXMgcHJvY2Vzc29yCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbm90IG51bGwKLQkgKiBAcGFyYW0gdGV4dFNlbGVjdGlvbgotCSAqIEByZXR1cm4gRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yCi0JICovCi0JcHJpdmF0ZSBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yRm9yQ3VycmVudFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJLy8gY2hlY2sgaWYgd2UgaGF2ZSBhbiBhY3Rpb24gdGhhdCdzIGVuYWJsZWQgb24gdGhlIGN1cnJlbnQgcGFydGl0aW9uCi0JCUlUeXBlZFJlZ2lvbiB0ciA9IGdldFBhcnRpdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCVN0cmluZyBwYXJ0aXRpb24gPSB0ciAhPSBudWxsID8gdHIuZ2V0VHlwZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlJdGVyYXRvciBpdCA9IGdldFByb2Nlc3NvcnMoKS5pdGVyYXRvcigpOwotCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgcHJvY2Vzc29yID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJcHJvY2Vzc29yID0gKEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJLy8gd2UganVzdCBjaG9vc2UgdGhlIGZpcnN0IGFjdGlvbiB0aGF0IGNhbiBoYW5kbGUgdGhlIHBhcnRpdGlvbgotCQkJaWYgKHByb2Nlc3Nvci5lbmFibGVkRm9yUGFyaXRpdGlvbihwYXJ0aXRpb24pKQotCQkJCXJldHVybiBwcm9jZXNzb3I7Ci0JCX0KLQotCQlMaXN0IGV4dGVuZGVkRmluZE9jY3VycmVuY2VzUHJvY2Vzc29ycyA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9ucyhGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpLCBwYXJ0aXRpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZGVkRmluZE9jY3VycmVuY2VzUHJvY2Vzc29ycy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG8gPSBleHRlbmRlZEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcnMuZ2V0KGkpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IpIHsKLQkJCQkvKgotCQkJCSAqIFdlIGp1c3QgY2hvb3NlIHRoZSBmaXJzdCByZWdpc3RlcmVkIHByb2Nlc3NvciB0aGF0Ci0JCQkJICogZXhwbGljaXRseSBzYXlzIGl0IGNhbiBoYW5kbGUgdGhlIHBhcnRpdGlvbgotCQkJCSAqLwotCQkJCXByb2Nlc3NvciA9IChGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IpIG87Ci0JCQkJaWYgKHByb2Nlc3Nvci5lbmFibGVkRm9yUGFyaXRpdGlvbihwYXJ0aXRpb24pKQotCQkJCQlyZXR1cm4gcHJvY2Vzc29yOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSVR5cGVkUmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCWlmICh0ZXh0U2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmVnaW9uID0gZG9jdW1lbnQuZ2V0UGFydGl0aW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZWdpb24gPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi0JcHJpdmF0ZSBJVGV4dFNlbGVjdGlvbiBnZXRUZXh0U2VsZWN0aW9uKElUZXh0RWRpdG9yIHRleHRFZGl0b3IpIHsKLQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IG51bGw7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24gJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJfQotCQlyZXR1cm4gdGV4dFNlbGVjdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRQcm9jZXNzb3JzKCkgewotCQlpZiAoZlByb2Nlc3NvcnMgPT0gbnVsbCkgewotCQkJZlByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlYTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgaHRtbFByb2Nlc3NvciA9IG5ldyBYTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IoKTsKLQkJCWZQcm9jZXNzb3JzLmFkZChodG1sUHJvY2Vzc29yKTsKLQkJfQotCQlyZXR1cm4gZlByb2Nlc3NvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9DYXRhbG9nRW50cnlIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvQ2F0YWxvZ0VudHJ5SHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZjI5ODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9DYXRhbG9nRW50cnlIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotY2xhc3MgQ2F0YWxvZ0VudHJ5SHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0KLQlwcml2YXRlIElSZWdpb24gZkh5cGVybGlua1JlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJQ2F0YWxvZ0VudHJ5IGZFbnRyeSA9IG51bGw7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaHlwZXJsaW5rUmVnaW9uCi0JICogQHBhcmFtIGVudHJ5Ci0JICovCi0JQ2F0YWxvZ0VudHJ5SHlwZXJsaW5rKElSZWdpb24gaHlwZXJsaW5rUmVnaW9uLCBJQ2F0YWxvZ0VudHJ5IGVudHJ5KSB7Ci0JCXN1cGVyKCk7Ci0JCWZIeXBlcmxpbmtSZWdpb24gPSBoeXBlcmxpbmtSZWdpb247Ci0JCWZFbnRyeSA9IGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElIeXBlcmxpbmsgZ2V0SHlwZXJsaW5rKCkgewotCQlpZiAoZkVudHJ5LmdldFVSSSgpLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBFeHRlcm5hbEZpbGVIeXBlcmxpbmsoZkh5cGVybGlua1JlZ2lvbiwgbmV3IEZpbGUoZkVudHJ5LmdldFVSSSgpLnN1YnN0cmluZyg1KSkpOwotCQl9Ci0JCWVsc2UgaWYgKGZFbnRyeS5nZXRVUkkoKS5zdGFydHNXaXRoKCJwbGF0Zm9ybTovcmVzb3VyY2UvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGZFbnRyeS5nZXRVUkkoKS5zdWJzdHJpbmcoMjApKTsKLQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkKLQkJCQlyZXR1cm4gbmV3IFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoZkh5cGVybGlua1JlZ2lvbiwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpKTsKLQkJfQotCQllbHNlIHsKLQkJCS8qCi0JCQkgKiB0aGUgVVJMIGRldGVjdG9yIHdpbGwgYWxyZWFkeSB3b3JrIG9uIHRoZSBsaXRlcmFsIHRleHQsIHNvCi0JCQkgKiBvZmZlciB0byBvcGVuIHRoZSBjb250ZW50cyBpbiBhbiBlZGl0b3IKLQkJCSAqLwotCQkJdHJ5IHsKLQkJCQlpZiAoZkVudHJ5LmdldFVSSSgpLnN0YXJ0c1dpdGgoImphcjpmaWxlOiIpKQotCQkJCQlyZXR1cm4gbmV3IFVSTFN0b3JhZ2VIeXBlcmxpbmsoZkh5cGVybGlua1JlZ2lvbiwgbmV3IFVSTChmRW50cnkuZ2V0VVJJKCkpKSB7Ci0JCQkJCQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCQkJCQkJcmV0dXJuIE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuT3BlbiwgZkVudHJ5LmdldEtleSgpKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCS8vIG5vdCB2YWxpZD8KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rUmVnaW9uKCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmSHlwZXJsaW5rUmVnaW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCUlIeXBlcmxpbmsgbGluayA9IGdldEh5cGVybGluaygpOwotCQlpZiAobGluayAhPSBudWxsKQotCQkJcmV0dXJuIGxpbmsuZ2V0SHlwZXJsaW5rVGV4dCgpOwotCQlyZXR1cm4gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5PcGVuLCBmRW50cnkuZ2V0S2V5KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRUeXBlTGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgewotCQlJSHlwZXJsaW5rIGxpbmsgPSBnZXRIeXBlcmxpbmsoKTsKLQkJaWYgKGxpbmsgIT0gbnVsbCkKLQkJCXJldHVybiBsaW5rLmdldFR5cGVMYWJlbCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjb3BlbigpCi0JICovCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJSUh5cGVybGluayBsaW5rID0gZ2V0SHlwZXJsaW5rKCk7Ci0JCWlmIChsaW5rICE9IG51bGwpCi0JCQlsaW5rLm9wZW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYxMDQ1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLkVGUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciBleHRlcm5hbCBmaWxlcy4KLSAqLwotY2xhc3MgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCi0JcHJpdmF0ZSBJUmVnaW9uIGZIeXBlcmxpbmtSZWdpb247Ci0JcHJpdmF0ZSBGaWxlIGZIeXBlcmxpbmtGaWxlOwotCi0JcHVibGljIEV4dGVybmFsRmlsZUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgRmlsZSBmaWxlKSB7Ci0JCWZIeXBlcmxpbmtGaWxlID0gZmlsZTsKLQkJZkh5cGVybGlua1JlZ2lvbiA9IHJlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmSHlwZXJsaW5rUmVnaW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCVN0cmluZyBwYXRoID0gZkh5cGVybGlua0ZpbGUuZ2V0UGF0aCgpOwotCQlpZiAocGF0aC5sZW5ndGgoKSA+IDYwKSB7Ci0JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgMjUpICsgIi4uLiIgKyBwYXRoLnN1YnN0cmluZyhwYXRoLmxlbmd0aCgpIC0gMjUsIHBhdGgubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLk9wZW4sIHBhdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCWlmIChmSHlwZXJsaW5rRmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlJRmlsZVN0b3JlIHN0b3JlID0gRUZTLmdldExvY2FsRmlsZVN5c3RlbSgpLmdldFN0b3JlKGZIeXBlcmxpbmtGaWxlLnRvVVJJKCkpOwotCQkJCUlERS5vcGVuRWRpdG9yT25GaWxlU3RvcmUocGFnZSwgc3RvcmUpIDsKLQkJCX0KLQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9VUkxTdG9yYWdlSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1VSTFN0b3JhZ2VIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0YjAzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1VSTFN0b3JhZ2VIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuVVJMSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0b3JhZ2VFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuSmFyVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciBVUkxzIChvcGVucyBpbiByZWFkLW9ubHkgbW9kZSkKLSAqLwotY2xhc3MgVVJMU3RvcmFnZUh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQotCXN0YXRpYyBjbGFzcyBTdG9yYWdlRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJU3RvcmFnZUVkaXRvcklucHV0IHsKLQkJSVN0b3JhZ2UgZlN0b3JhZ2UgPSBudWxsOwotCi0JCVN0b3JhZ2VFZGl0b3JJbnB1dChJU3RvcmFnZSBzdG9yYWdlKSB7Ci0JCQlmU3RvcmFnZSA9IHN0b3JhZ2U7Ci0JCX0KLQotCQlwdWJsaWMgSVN0b3JhZ2UgZ2V0U3RvcmFnZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCXJldHVybiBmU3RvcmFnZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJCXJldHVybiBmU3RvcmFnZSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQkJCQlyZXR1cm4gZlN0b3JhZ2UuZXF1YWxzKCgoU3RvcmFnZUVkaXRvcklucHV0KSBvYmopLmZTdG9yYWdlKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gZlN0b3JhZ2UuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCQlyZXR1cm4gZlN0b3JhZ2UuZ2V0RnVsbFBhdGgoKSAhPSBudWxsID8gZlN0b3JhZ2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpIDogZlN0b3JhZ2UuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFVSTFN0b3JhZ2UgaW1wbGVtZW50cyBJU3RvcmFnZSB7Ci0JCVVSTCBmVVJMID0gbnVsbDsKLQotCQlVUkxTdG9yYWdlKFVSTCB1cmwpIHsKLQkJCWZVUkwgPSB1cmw7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFVSTFN0b3JhZ2UpIHsKLQkJCQlyZXR1cm4gZlVSTC5lcXVhbHMoKChVUkxTdG9yYWdlKSBvYmopLmZVUkwpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotCQl9Ci0KLQkJcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZVUkwudG9TdHJpbmcoKS5zdGFydHNXaXRoKCJqYXI6ZmlsZSIpKQotCQkJCQlzdHJlYW0gPSBKYXJVdGlsaXRpZXMuZ2V0SW5wdXRTdHJlYW0oZlVSTCk7Ci0JCQkJZWxzZQotCQkJCQlzdHJlYW0gPSBmVVJMLm9wZW5TdHJlYW0oKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCBmVVJMLnRvU3RyaW5nKCksIGUpKTsKLQkJCX0KLQkJCXJldHVybiBzdHJlYW07Ci0JCX0KLQotCQlwdWJsaWMgSVBhdGggZ2V0RnVsbFBhdGgoKSB7Ci0JCQlyZXR1cm4gbmV3IFBhdGgoZlVSTC50b1N0cmluZygpKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuZXcgUGF0aChmVVJMLmdldEZpbGUoKSkubGFzdFNlZ21lbnQoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0JcHJpdmF0ZSBVUkwgZlVSTDsKLQotCXB1YmxpYyBVUkxTdG9yYWdlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBVUkwgdXJsKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZVUkwgPSB1cmw7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZlJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuT3BlbiwgZlVSTC50b1N0cmluZygpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjb3BlbigpCi0JICovCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJaWYgKGZVUkwgIT0gbnVsbCkgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IFN0b3JhZ2VFZGl0b3JJbnB1dChuZXcgVVJMU3RvcmFnZShmVVJMKSk7Ci0JCQlJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCQkJdHJ5IHsKLQkJCQlkZXNjcmlwdG9yID0gSURFLmdldEVkaXRvckRlc2NyaXB0b3IoaW5wdXQuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgaW5wdXQsIGRlc2NyaXB0b3IuZ2V0SWQoKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJbmV3IFVSTEh5cGVybGluayhmUmVnaW9uLCBmVVJMLnRvU3RyaW5nKCkpLm9wZW4oKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvV29ya3NwYWNlRmlsZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMTk5NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBIeXBlcmxpbmsgZm9yIGZpbGVzIHdpdGhpbiB0aGUgd29ya3NwYWNlLiAoQXMgbG9uZyBhcyB0aGVyZSBpcyBhbiBJRmlsZSwKLSAqIHRoaXMgY2FuIGJlIHVzZWQpIE9wZW5zIHRoZSBkZWZhdWx0IGVkaXRvciBmb3IgdGhlIGZpbGUuCi0gKi8KLWNsYXNzIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0KLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQlwcml2YXRlIElGaWxlIGZGaWxlOwotCXByaXZhdGUgSVJlZ2lvbiBmSGlnaGxpZ2h0UmFuZ2U7Ci0KLQlwdWJsaWMgV29ya3NwYWNlRmlsZUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgSUZpbGUgZmlsZSkgewotCQlmUmVnaW9uID0gcmVnaW9uOwotCQlmRmlsZSA9IGZpbGU7Ci0JfQotCi0JcHVibGljIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElGaWxlIGZpbGUsIElSZWdpb24gcmFuZ2UpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZkZpbGUgPSBmaWxlOwotCQlmSGlnaGxpZ2h0UmFuZ2UgPSByYW5nZTsKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmUmVnaW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRUeXBlTGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQlTdHJpbmcgcGF0aCA9IGZGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJaWYgKHBhdGgubGVuZ3RoKCkgPiA2MCkgewotCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIDI1KSArICIuLi4iICsgcGF0aC5zdWJzdHJpbmcocGF0aC5sZW5ndGgoKSAtIDI1LCBwYXRoLmxlbmd0aCgpKTsKLQkJfQotCQlyZXR1cm4gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5PcGVuLCBwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlpZiAoKGZGaWxlICE9IG51bGwpICYmIGZGaWxlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBJREUub3BlbkVkaXRvcihwYWdlLCBmRmlsZSwgdHJ1ZSk7Ci0JCQkJLy8gaGlnaGxpZ2h0IHJhbmdlIGluIGVkaXRvciBpZiBwb3NzaWJsZQotCQkJCWlmICgoZkhpZ2hsaWdodFJhbmdlICE9IG51bGwpICYmIChlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikpIHsKLQkJCQkJKChJVGV4dEVkaXRvcikgZWRpdG9yKS5zZXRIaWdobGlnaHRSYW5nZShmSGlnaGxpZ2h0UmFuZ2UuZ2V0T2Zmc2V0KCksIGZIaWdobGlnaHRSYW5nZS5nZXRMZW5ndGgoKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIHBpZS5nZXRNZXNzYWdlKCksIHBpZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvWE1MSHlwZXJsaW5rRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvWE1MSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlhYmRjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1hNTEh5cGVybGlua0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuQWJzdHJhY3RIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01OYW1lZE5vZGVNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogRGV0ZWN0cyBoeXBlcmxpbmtzIGluIFhNTCB0YWdzLiBJbmNsdWRlcyBkZXRlY3Rpb24gaW4gRE9DVFlQRSBhbmQgYXR0cmlidXRlCi0gKiB2YWx1ZXMuIFJlc29sdmVzIHJlZmVyZW5jZXMgdG8gc2NoZW1hcywgZHRkcywgZXRjIHVzaW5nIHRoZSBDb21tb24gVVJJCi0gKiBSZXNvbHZlci4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWE1MSHlwZXJsaW5rRGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdEh5cGVybGlua0RldGVjdG9yIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBOT19OQU1FU1BBQ0VfU0NIRU1BX0xPQ0FUSU9OID0gIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gInNjaGVtYUxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFhTSV9OQU1FU1BBQ0VfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBoeXBlcmxpbmsKLQkgKiAKLQkgKiBAcGFyYW0gdXJpU3RyaW5nCi0JICogQHBhcmFtIGh5cGVybGlua1JlZ2lvbgotCSAqIEByZXR1cm4gSUh5cGVybGluawotCSAqLwotCXByaXZhdGUgSUh5cGVybGluayBjcmVhdGVIeXBlcmxpbmsoU3RyaW5nIHVyaVN0cmluZywgSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24sIElEb2N1bWVudCBkb2N1bWVudCwgTm9kZSBub2RlKSB7Ci0JCUlIeXBlcmxpbmsgbGluayA9IG51bGw7Ci0KLQkJSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGdldENhdGFsb2dFbnRyeSh1cmlTdHJpbmcpOwotCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJbGluayA9IG5ldyBDYXRhbG9nRW50cnlIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCBlbnRyeSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB0cnkgdG8gbG9jYXRlIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2UKLQkJCUZpbGUgc3lzdGVtRmlsZSA9IGdldEZpbGVGcm9tVXJpU3RyaW5nKHVyaVN0cmluZyk7Ci0JCQlpZiAoc3lzdGVtRmlsZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHN5c3RlbVBhdGggPSBzeXN0ZW1GaWxlLmdldFBhdGgoKTsKLQkJCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShzeXN0ZW1QYXRoKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCS8vIHRoaXMgaXMgYSBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rIHNpbmNlIGZpbGUgZXhpc3RzIGluCi0JCQkJCS8vIHdvcmtzcGFjZQotCQkJCQlsaW5rID0gbmV3IFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCBmaWxlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRoaXMgaXMgYW4gRXh0ZXJuYWxGaWxlSHlwZXJsaW5rIHNpbmNlIGZpbGUgZG9lcyBub3QKLQkJCQkJLy8gZXhpc3QgaW4gd29ya3NwYWNlCi0JCQkJCWxpbmsgPSBuZXcgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgc3lzdGVtRmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCXB1YmxpYyBJSHlwZXJsaW5rW10gZGV0ZWN0SHlwZXJsaW5rcyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgYm9vbGVhbiBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKSB7Ci0JCS8vIGZvciBub3csIG9ubHkgY2FwYWJsZSBvZiBjcmVhdGluZyAxIGh5cGVybGluawotCQlMaXN0IGh5cGVybGlua3MgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCWlmICgocmVnaW9uICE9IG51bGwpICYmICh0ZXh0Vmlld2VyICE9IG51bGwpKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQlOb2RlIGN1cnJlbnROb2RlID0gZ2V0Q3VycmVudE5vZGUoZG9jdW1lbnQsIHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyB1cmlTdHJpbmcgPSBudWxsOwotCQkJCWlmIChjdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQkJCS8vIGRvY3R5cGUgbm9kZXMKLQkJCQkJdXJpU3RyaW5nID0gZ2V0VVJJU3RyaW5nKGN1cnJlbnROb2RlLCBkb2N1bWVudCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJLy8gZWxlbWVudCBub2RlcwotCQkJCQlBdHRyIGN1cnJlbnRBdHRyID0gZ2V0Q3VycmVudEF0dHJOb2RlKGN1cnJlbnROb2RlLCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCQlpZiAoY3VycmVudEF0dHIgIT0gbnVsbCkgewotCQkJCQkJLy8gdHJ5IHRvIGZpbmQgbGluayBmb3IgY3VycmVudCBhdHRyaWJ1dGUKLQkJCQkJCS8vIHJlc29sdmUgYXR0cmlidXRlIHZhbHVlCi0JCQkJCQl1cmlTdHJpbmcgPSBnZXRVUklTdHJpbmcoY3VycmVudEF0dHIsIGRvY3VtZW50KTsKLQkJCQkJCS8vIHZlcmlmeSB2YWxpZGl0eSBvZiB1cmkgc3RyaW5nCi0JCQkJCQlpZiAoKHVyaVN0cmluZyA9PSBudWxsKSB8fCAhaXNWYWxpZFVSSSh1cmlTdHJpbmcpKSB7Ci0JCQkJCQkJLy8gcmVzZXQgY3VycmVudCBhdHRyaWJ1dGUKLQkJCQkJCQljdXJyZW50QXR0ciA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGN1cnJlbnRBdHRyID09IG51bGwpIHsKLQkJCQkJCS8vIHRyeSB0byBmaW5kIGEgbGlua2FibGUgYXR0cmlidXRlIHdpdGhpbiBlbGVtZW50Ci0JCQkJCQljdXJyZW50QXR0ciA9IGdldExpbmthYmxlQXR0cigoRWxlbWVudCkgY3VycmVudE5vZGUpOwotCQkJCQkJaWYgKGN1cnJlbnRBdHRyICE9IG51bGwpIHsKLQkJCQkJCQl1cmlTdHJpbmcgPSBnZXRVUklTdHJpbmcoY3VycmVudEF0dHIsIGRvY3VtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljdXJyZW50Tm9kZSA9IGN1cnJlbnRBdHRyOwotCQkJCX0KLQkJCQkvLyB0cnkgdG8gY3JlYXRlIGh5cGVybGluayBmcm9tIGluZm9ybWF0aW9uIGdhdGhlcmVkCi0JCQkJaWYgKCh1cmlTdHJpbmcgIT0gbnVsbCkgJiYgKGN1cnJlbnROb2RlICE9IG51bGwpICYmIGlzVmFsaWRVUkkodXJpU3RyaW5nKSkgewotCQkJCQlJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IGdldEh5cGVybGlua1JlZ2lvbihjdXJyZW50Tm9kZSk7Ci0JCQkJCUlIeXBlcmxpbmsgaHlwZXJsaW5rID0gY3JlYXRlSHlwZXJsaW5rKHVyaVN0cmluZywgaHlwZXJsaW5rUmVnaW9uLCBkb2N1bWVudCwgY3VycmVudE5vZGUpOwotCQkJCQlpZiAoaHlwZXJsaW5rICE9IG51bGwpIHsKLQkJCQkJCWh5cGVybGlua3MuYWRkKGh5cGVybGluayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGh5cGVybGlua3Muc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSUh5cGVybGlua1tdKSBoeXBlcmxpbmtzLnRvQXJyYXkobmV3IElIeXBlcmxpbmtbMF0pOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYmFzZSBsb2NhdGlvbiBmcm9tIHRoZSBjdXJyZW50IG1vZGVsIChsb2NhbCBmaWxlIHN5c3RlbSkKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRCYXNlTG9jYXRpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCi0JCS8vIGdldCB0aGUgYmFzZSBsb2NhdGlvbiBmcm9tIHRoZSBjdXJyZW50IG1vZGVsCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gc01vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCQotCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChyZXN1bHQpOwotCQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JCQkJCQlpZiAoZmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJCQliYXNlTG9jYXRpb24gPSBmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChiYXNlTG9jYXRpb24gPT0gbnVsbCAmJiBmaWxlLmdldExvY2F0aW9uVVJJKCkgIT0gbnVsbCkgewotCQkJCQkJCWJhc2VMb2NhdGlvbiA9IGZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQkJaWYgKGJhc2VMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQkJYmFzZUxvY2F0aW9uID0gZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXN1bHQgPSBiYXNlTG9jYXRpb247Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIENNRWxlbWVudERlY2xhcmF0aW9uIGZvciBhbiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBudWxsOwotCi0JCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCWVkID0gbXEuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBub2RlIHdpdGhpbiBub2RlIGF0IG9mZnNldAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4gQXR0cgotCSAqLwotCXByaXZhdGUgQXR0ciBnZXRDdXJyZW50QXR0ck5vZGUoTm9kZSBub2RlLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICgobm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuY29udGFpbnMob2Zmc2V0KSAmJiAobm9kZS5oYXNBdHRyaWJ1dGVzKCkpKSB7Ci0JCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCS8vIGdvIHRocm91Z2ggZWFjaCBhdHRyaWJ1dGUgaW4gbm9kZSBhbmQgaWYgYXR0cmlidXRlIGNvbnRhaW5zCi0JCQkvLyBvZmZzZXQsIHJldHVybiB0aGF0IGF0dHJpYnV0ZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgKytpKSB7Ci0JCQkJLy8gYXNzdW1wdGlvbiB0aGF0IGlmIHBhcmVudCBub2RlIGlzIG9mIHR5cGUgSW5kZXhlZFJlZ2lvbiwKLQkJCQkvLyB0aGVuIGl0cyBhdHRyaWJ1dGVzIHdpbGwgYWxzbyBiZSBvZiB0eXBlIEluZGV4ZWRSZWdpb24KLQkJCQlJbmRleGVkUmVnaW9uIGF0dFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBhdHRycy5pdGVtKGkpOwotCQkJCWlmIChhdHRSZWdpb24uY29udGFpbnMob2Zmc2V0KSkgewotCQkJCQlyZXR1cm4gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vZGUgdGhlIGN1cnNvciBpcyBjdXJyZW50bHkgb24gaW4gdGhlIGRvY3VtZW50LiBudWxsIGlmIG5vCi0JICogbm9kZSBpcyBzZWxlY3RlZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIE5vZGUgZWl0aGVyIGVsZW1lbnQsIGRvY3R5cGUsIHRleHQsIG9yIG51bGwKLQkgKi8KLQlwcml2YXRlIE5vZGUgZ2V0Q3VycmVudE5vZGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIGdldCB0aGUgY3VycmVudCBub2RlIGF0IHRoZSBvZmZzZXQgKHJldHVybnMgZWl0aGVyOiBlbGVtZW50LAotCQkvLyBkb2N0eXBlLCB0ZXh0KQotCQlJbmRleGVkUmVnaW9uIGlub2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCk7Ci0JCQkJaWYgKGlub2RlID09IG51bGwpIHsKLQkJCQkJaW5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQgLSAxKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaW5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gKE5vZGUpIGlub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gSUZpbGUgZnJvbSB0aGUgZ2l2ZW4gdXJpIGlmIHBvc3NpYmxlLCBudWxsIGlmIGNhbm5vdCBmaW5kCi0JICogZmlsZSBmcm9tIHVyaS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVN0cmluZwotCSAqICAgICAgICAgICAgZmlsZSBzeXN0ZW0gcGF0aAotCSAqIEByZXR1cm4gcmV0dXJucyBJRmlsZSBpZiBmaWxlU3RyaW5nIGV4aXN0cyBpbiB0aGUgd29ya3NwYWNlCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKFN0cmluZyBmaWxlU3RyaW5nKSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCi0JCWlmIChmaWxlU3RyaW5nICE9IG51bGwpIHsKLQkJCVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChmaWxlU3RyaW5nKTsKLQkJCWlmIChmaWxlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEgJiYgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZpbGVQYXRoKS5leGlzdHMoKSkgewotCQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpOwotCQkJfQotCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24oZmlsZVBhdGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IChpIDwgZmlsZXMubGVuZ3RoKSAmJiAoZmlsZSA9PSBudWxsKTsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVzW2ldLmV4aXN0cygpKSB7Ci0JCQkJCWZpbGUgPSBmaWxlc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBmaWxlIGZyb20gdGhlIGdpdmVuIHVyaSBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gdXJpU3RyaW5nIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgdXJpU3RyaW5nIGlzIG5vdCBodHRwOi8vCi0JICogQHJldHVybiBGaWxlIGNyZWF0ZWQgZnJvbSB1cmlTdHJpbmcgaWYgcG9zc2libGUsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBGaWxlIGdldEZpbGVGcm9tVXJpU3RyaW5nKFN0cmluZyB1cmlTdHJpbmcpIHsKLQkJRmlsZSBmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGZpcnN0IGp1c3QgdHJ5IHRvIGNyZWF0ZSBhIGZpbGUgZGlyZWN0bHkgZnJvbSB1cmlTdHJpbmcgYXMKLQkJCS8vIGRlZmF1bHQgaW4gY2FzZSBjcmVhdGUgZmlsZSBmcm9tIHVyaSBkb2VzIG5vdCB3b3JrCi0JCQlmaWxlID0gbmV3IEZpbGUodXJpU3RyaW5nKTsKLQotCQkJLy8gdHJ5IHRvIGNyZWF0ZSBmaWxlIGZyb20gdXJpCi0JCQlVUkkgdXJpID0gbmV3IFVSSSh1cmlTdHJpbmcpOwotCQkJZmlsZSA9IG5ldyBGaWxlKHVyaSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZiBleGNlcHRpb24gaXMgdGhyb3duIHdoaWxlIHRyeWluZyB0byBjcmVhdGUgRmlsZSBqdXN0IGlnbm9yZQotCQkJLy8gYW5kIGZpbGUgd2lsbCBiZSBudWxsCi0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHJpdmF0ZSBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbihOb2RlIG5vZGUpIHsKLQkJSVJlZ2lvbiBoeXBlclJlZ2lvbiA9IG51bGw7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCQkvLyBoYW5kbGUgZG9jIHR5cGUgbm9kZQotCQkJCUlET01Ob2RlIGRvY05vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0JCQkJaHlwZXJSZWdpb24gPSBuZXcgUmVnaW9uKGRvY05vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgZG9jTm9kZS5nZXRFbmRPZmZzZXQoKSAtIGRvY05vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJLy8gaGFuZGxlIGF0dHJpYnV0ZSBub2RlcwotCQkJCUlET01BdHRyIGF0dCA9IChJRE9NQXR0cikgbm9kZTsKLQkJCQkvLyBkbyBub3QgaW5jbHVkZSBxdW90ZXMgaW4gYXR0cmlidXRlIHZhbHVlIHJlZ2lvbgotCQkJCWludCByZWdPZmZzZXQgPSBhdHQuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gYXR0LmdldFZhbHVlUmVnaW9uKCk7Ci0JCQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaW50IHJlZ0xlbmd0aCA9IHZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJU3RyaW5nIGF0dFZhbHVlID0gYXR0LmdldFZhbHVlUmVnaW9uVGV4dCgpOwotCQkJCQlpZiAoU3RyaW5nVXRpbHMuaXNRdW90ZWQoYXR0VmFsdWUpKSB7Ci0JCQkJCQkrK3JlZ09mZnNldDsKLQkJCQkJCXJlZ0xlbmd0aCA9IHJlZ0xlbmd0aCAtIDI7Ci0JCQkJCX0KLQkJCQkJaHlwZXJSZWdpb24gPSBuZXcgUmVnaW9uKHJlZ09mZnNldCwgcmVnTGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGh5cGVyUmVnaW9uOwotCX0KLQotCS8qKgotCSAqIEF0dGVtcHRzIHRvIGZpbmQgYW4gYXR0cmlidXRlIHdpdGhpbiBlbGVtZW50IHRoYXQgaXMgb3BlbmFibGUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgLQotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKiBAcmV0dXJuIEF0dHIgYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG9wZW4gb24sIG51bGwgaWYgbm8KLQkgKiAgICAgICAgIGF0dHJpYnV0ZSBjb3VsZCBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgQXR0ciBnZXRMaW5rYWJsZUF0dHIoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCS8vIGdldCB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGlzIG5vZGUKLQkJTmFtZWROb2RlTWFwIGF0dHJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7ICsraSkgewotCQkJLy8gY2hlY2sgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgIm9wZW5Pbi1hYmxlIgotCQkJQXR0ciBhdHQgPSAoQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCWlmIChpc0xpbmthYmxlQXR0cihhdHQsIGVkKSkgewotCQkJCXJldHVybiBhdHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRmluZCB0aGUgbG9jYXRpb24gaGludCBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVVSSSBpZiBpdCBleGlzdHMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudE5vZGUgLQotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIC0KLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsCi0JICogQHJldHVybiBsb2NhdGlvbiBoaW50IChzeXN0ZW1JZCkgaWYgaXQgd2FzIGZvdW5kLCBudWxsIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExvY2F0aW9uSGludChFbGVtZW50IGVsZW1lbnROb2RlLCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCUF0dHIgc2NoZW1hTG9jTm9kZSA9IGVsZW1lbnROb2RlLmdldEF0dHJpYnV0ZU5vZGVOUyhYU0lfTkFNRVNQQUNFX1VSSSwgU0NIRU1BX0xPQ0FUSU9OKTsKLQkJaWYgKHNjaGVtYUxvY05vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzY2hlbWFMb2NOb2RlLmdldFZhbHVlKCkpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBwdWJsaWNJZCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsKLQkJCQlTdHJpbmcgc3lzdGVtSWQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0JCQkJLy8gZm91bmQgbG9jYXRpb24gaGludAotCQkJCWlmIChuYW1lc3BhY2VVUkkuZXF1YWxzSWdub3JlQ2FzZShwdWJsaWNJZCkpIHsKLQkJCQkJcmV0dXJuIHN5c3RlbUlkOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkkgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIG5vZGUgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyBub3QgbnVsbAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFVSSVN0cmluZyhOb2RlIG5vZGUsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQlTdHJpbmcgcmVzb2x2ZWRVUkkgPSBudWxsOwotCQkvLyBuZWVkIHRoZSBiYXNlIGxvY2F0aW9uLCBwdWJsaWNJZCwgYW5kIHN5c3RlbUlkIGZvciBVUklSZXNvbHZlcgotCQlTdHJpbmcgYmFzZUxvYyA9IG51bGw7Ci0JCVN0cmluZyBwdWJsaWNJZCA9IG51bGw7Ci0JCVN0cmluZyBzeXN0ZW1JZCA9IG51bGw7Ci0KLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCS8vIGhhbmRsZSBkb2MgdHlwZSBub2RlCi0JCWlmIChub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJYmFzZUxvYyA9IGdldEJhc2VMb2NhdGlvbihkb2N1bWVudCk7Ci0JCQlwdWJsaWNJZCA9ICgoRG9jdW1lbnRUeXBlKSBub2RlKS5nZXRQdWJsaWNJZCgpOwotCQkJc3lzdGVtSWQgPSAoKERvY3VtZW50VHlwZSkgbm9kZSkuZ2V0U3lzdGVtSWQoKTsKLQkJfQotCQllbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkvLyBoYW5kbGUgYXR0cmlidXRlIG5vZGUKLQkJCUF0dHIgYXR0ck5vZGUgPSAoQXR0cikgbm9kZTsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IGF0dHJOb2RlLmdldE5hbWUoKTsKLQkJCVN0cmluZyBhdHRyVmFsdWUgPSBhdHRyTm9kZS5nZXRWYWx1ZSgpOwotCQkJYXR0clZhbHVlID0gU3RyaW5nVXRpbHMuc3RyaXAoYXR0clZhbHVlKTsKLQkJCWlmICgoYXR0clZhbHVlICE9IG51bGwpICYmIChhdHRyVmFsdWUubGVuZ3RoKCkgPiAwKSkgewotCQkJCWJhc2VMb2MgPSBnZXRCYXNlTG9jYXRpb24oZG9jdW1lbnQpOwotCi0JCQkJLy8gaGFuZGxlIHNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZQotCQkJCVN0cmluZyBwcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KGF0dHJOYW1lKTsKLQkJCQlTdHJpbmcgdW5wcmVmaXhlZE5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VW5wcmVmaXhlZE5hbWUoYXR0ck5hbWUpOwotCQkJCWlmICgoWE1MTlMuZXF1YWxzKHByZWZpeCkpIHx8IChYTUxOUy5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkgewotCQkJCQlwdWJsaWNJZCA9IGF0dHJWYWx1ZTsKLQkJCQkJc3lzdGVtSWQgPSBnZXRMb2NhdGlvbkhpbnQoYXR0ck5vZGUuZ2V0T3duZXJFbGVtZW50KCksIHB1YmxpY0lkKTsKLQkJCQkJaWYgKHN5c3RlbUlkID09IG51bGwpIHsKLQkJCQkJCXN5c3RlbUlkID0gYXR0clZhbHVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChYU0lfTkFNRVNQQUNFX1VSSS5lcXVhbHMoRE9NTmFtZXNwYWNlSGVscGVyLmdldE5hbWVzcGFjZVVSSShhdHRyTm9kZSkpKSAmJiAoU0NIRU1BX0xPQ0FUSU9OLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKSB7Ci0JCQkJCS8vIGZvciBub3cganVzdCB1c2UgdGhlIGZpcnN0IHBhaXIKLQkJCQkJLy8gbmVlZCB0byBsb29rIGludG8gYmVpbmcgbW9yZSBwcmVjaXNlCi0JCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0clZhbHVlKTsKLQkJCQkJcHVibGljSWQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0JCQkJCXN5c3RlbUlkID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotCQkJCQkvLyBlbHNlIGNoZWNrIGlmIHhtbG5zIHB1YmxpY0lkID0gdmFsdWUKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXN5c3RlbUlkID0gYXR0clZhbHVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJlc29sdmVkVVJJID0gcmVzb2x2ZVVSSShiYXNlTG9jLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQlyZXR1cm4gcmVzb2x2ZWRVUkk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIGlzIG9wZW5hYmxlLiBBdHRyaWJ1dGUgaXMgb3BlbmFibGUKLQkgKiBpZiBpdCBpcyBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBhdHRyaWJ1dGUgb3IgaWYgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcwotCSAqIG9mIHR5cGUgVVJJLgotCSAqIAotCSAqIEBwYXJhbSBhdHRyCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqIEBwYXJhbSBjbUVsZW1lbnQKLQkgKiAgICAgICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXR0cmlidXRlIChjYW4gYmUKLQkgKiAgICAgICAgICAgIG51bGwpCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgYXR0cmlidXRlIGlzICJvcGVuT24tYWJsZSIgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTGlua2FibGVBdHRyKEF0dHIgYXR0ciwgQ01FbGVtZW50RGVjbGFyYXRpb24gY21FbGVtZW50KSB7Ci0JCVN0cmluZyBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQlTdHJpbmcgcHJlZml4ID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFByZWZpeChhdHRyTmFtZSk7Ci0JCVN0cmluZyB1bnByZWZpeGVkTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyTmFtZSk7Ci0JCS8vIGRldGVybWluZSBpZiBhdHRyaWJ1dGUgaXMgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0JCWlmICgoWE1MTlMuZXF1YWxzKHByZWZpeCkpIHx8IChYTUxOUy5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyBkZXRlcm1pbmUgaWYgYXR0cmlidXRlIGNvbnRhaW5zIHNjaGVtYSBsb2NhdGlvbgotCQlpZiAoKFhTSV9OQU1FU1BBQ0VfVVJJLmVxdWFscyhET01OYW1lc3BhY2VIZWxwZXIuZ2V0TmFtZXNwYWNlVVJJKGF0dHIpKSkgJiYgKChTQ0hFTUFfTE9DQVRJT04uZXF1YWxzKHVucHJlZml4ZWROYW1lKSkgfHwgKE5PX05BTUVTUEFDRV9TQ0hFTUFfTE9DQVRJT04uZXF1YWxzKHVucHJlZml4ZWROYW1lKSkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIGRldGVybWluZSBpZiBhdHRyaWJ1dGUgdmFsdWUgaXMgb2YgdHlwZSBVUkkKLQkJaWYgKGNtRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlDTU5hbWVkTm9kZU1hcCBhdHRyRGVjbHMgPSBjbUVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQkJQ01OYW1lZE5vZGVNYXBJbXBsIGFsbEF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKGF0dHJEZWNscyk7Ci0JCQlMaXN0IG5vZGVzID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShhdHRyLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudChhdHRyLmdldE93bmVyRWxlbWVudCgpLCBjbUVsZW1lbnQsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgbm9kZXMuZ2V0KGspOwotCQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCWFsbEF0dHJpYnV0ZXMucHV0KGNtbm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJYXR0ckRlY2xzID0gYWxsQXR0cmlidXRlczsKLQotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyRGVjbHMuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJCWlmICgoYXR0ckRlY2wgIT0gbnVsbCkgJiYgKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkgIT0gbnVsbCkgJiYgKENNRGF0YVR5cGUuVVJJLmVxdWFscyhhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldERhdGFUeXBlTmFtZSgpKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHVyaVN0cmluZyBpcyByZWFsbHkgcG9pbnRpbmcgdG8gYSBmaWxlCi0JICogCi0JICogQHBhcmFtIHVyaVN0cmluZwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkVVJJKFN0cmluZyB1cmlTdHJpbmcpIHsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7Ci0KLQkJaWYgKGdldENhdGFsb2dFbnRyeSh1cmlTdHJpbmcpICE9IG51bGwpIHsKLQkJCWlzVmFsaWQgPSB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJRmlsZSBmaWxlID0gZ2V0RmlsZUZyb21VcmlTdHJpbmcodXJpU3RyaW5nKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlpc1ZhbGlkID0gZmlsZS5pc0ZpbGUoKTsKLQkJCX0KLQkJCWlmKCFpc1ZhbGlkKSB7Ci0JCQl9Ci0JCQkKLQkJfQotCQlyZXR1cm4gaXNWYWxpZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXJpU3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSUNhdGFsb2dFbnRyeSBnZXRDYXRhbG9nRW50cnkoU3RyaW5nIHVyaVN0cmluZykgewotCQlJQ2F0YWxvZyBkZWZhdWx0Q2F0YWxvZyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0JCWlmIChkZWZhdWx0Q2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkvLyBQcm9jZXNzIGRlZmF1bHQgY2F0YWxvZwotCQkJSUNhdGFsb2dFbnRyeVtdIGVudHJpZXMgPSBkZWZhdWx0Q2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpOwotCQkJZm9yIChpbnQgZW50cnkgPSAwOyBlbnRyeSA8IGVudHJpZXMubGVuZ3RoOyBlbnRyeSsrKSB7Ci0JCQkJaWYgKHVyaVN0cmluZy5lcXVhbHMoZW50cmllc1tlbnRyeV0uZ2V0S2V5KCkpfHx1cmlTdHJpbmcuZXF1YWxzKGVudHJpZXNbZW50cnldLmdldFVSSSgpKSkgewotCQkJCQlyZXR1cm4gZW50cmllc1tlbnRyeV07Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBQcm9jZXNzIGRlY2xhcmVkIE9BU0lTIG5leHRDYXRhbG9ncyBjYXRhbG9nCi0JCQlJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBkZWZhdWx0Q2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLQkJCWZvciAoaW50IG5leHRDYXRhbG9nID0gMDsgbmV4dENhdGFsb2cgPCBuZXh0Q2F0YWxvZ3MubGVuZ3RoOyBuZXh0Q2F0YWxvZysrKSB7Ci0JCQkJSUNhdGFsb2cgY2F0YWxvZyA9IG5leHRDYXRhbG9nc1tuZXh0Q2F0YWxvZ10uZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQkJCQlJQ2F0YWxvZ0VudHJ5W10gZW50cmllczIgPSBjYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCk7Ci0JCQkJZm9yIChpbnQgZW50cnkgPSAwOyBlbnRyeSA8IGVudHJpZXMyLmxlbmd0aDsgZW50cnkrKykgewotCQkJCQlpZiAodXJpU3RyaW5nLmVxdWFscyhlbnRyaWVzMltlbnRyeV0uZ2V0S2V5KCkpfHx1cmlTdHJpbmcuZXF1YWxzKGVudHJpZXMyW2VudHJ5XS5nZXRVUkkoKSkpCi0JCQkJCQlyZXR1cm4gZW50cmllczJbZW50cnldOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gVVJJIGluZm9ybWF0aW9uCi0JICogCi0JICogQHBhcmFtIGJhc2VMb2NhdGlvbgotCSAqIEBwYXJhbSBwdWJsaWNJZAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqIEByZXR1cm4gU3RyaW5nIHJlc29sdmVkIHVyaS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyByZXNvbHZlVVJJKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCS8vIGRvbnQgcmVzb2x2ZSBpZiB0aGVyZSdzIG5vdGhpbmcgdG8gcmVzb2x2ZQotCQlpZiAoKGJhc2VMb2NhdGlvbiA9PSBudWxsKSAmJiAocHVibGljSWQgPT0gbnVsbCkgJiYgKHN5c3RlbUlkID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkFkZE5hbWVzcGFjZXNDb250cm9sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkFkZE5hbWVzcGFjZXNDb250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMmQ4M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25BZGROYW1lc3BhY2VzQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLm5zZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nOwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uQWRkTmFtZXNwYWNlc0NvbnRyb2wgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0KLQljbGFzcyBFZGl0TmFtZXNwYWNlQ29udHJvbCBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCQlUZXh0IGxvY2F0aW9uSGludEZpZWxkOwotCQlUZXh0IHByZWZpeEZpZWxkOwotCQlUZXh0IHVyaUZpZWxkOwotCi0JCS8vIHByb3RlY3RlZCBOYW1lc3BhY2VJbmZvIGluZm87Ci0KLQkJcHVibGljIEVkaXROYW1lc3BhY2VDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOyAvLyBCT1JERVIpOwotCQkJc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfRU5URVJfUkVRX1BSRUZJWF9BTkRfTkFNRVNQQUNFKTsKLQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxOwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2Qud2lkdGhIaW50ID0gMzUwOwotCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0JCQkvLyByb3cgMQotCQkJLy8KLQkJCUxhYmVsIHByZWZpeExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJcHJlZml4TGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9QUkVGSVhfQ09MT04pOwotCi0JCQlwcmVmaXhGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJcHJlZml4RmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkvLyBwcmVmaXhGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShpbmZvLnByZWZpeCkpOwotCQkJLy8gcHJlZml4RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJLy8gcHJlZml4RmllbGQuc2V0RW5hYmxlZChpbmZvLmdldFByb3BlcnR5KCJwcmVmaXgtcmVhZE9ubHkiKSA9PQotCQkJLy8gbnVsbCk7Ci0JCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJCS8vIHJvdyAyCi0JCQkvLwotCQkJTGFiZWwgdXJpTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQl1cmlMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX05BTUVTUEFDRV9OQU1FX0NPTE9OKTsKLQotCQkJdXJpRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCXVyaUZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJLy8gdXJpRmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoaW5mby51cmkpKTsKLQkJCS8vIHVyaUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJCS8vIHVyaUZpZWxkLnNldEVuYWJsZWQoaW5mby5nZXRQcm9wZXJ0eSgidXJpLXJlYWRPbmx5IikgPT0gbnVsbCk7Ci0KLQkJCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQkJLy8gcm93IDMKLQkJCS8vCi0JCQlMYWJlbCBsb2NhdGlvbkhpbnRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWxvY2F0aW9uSGludExhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTE9DQVRJT05fSElOVF9DT0xPTik7Ci0KLQkJCWxvY2F0aW9uSGludEZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlsb2NhdGlvbkhpbnRGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCS8vIGxvY2F0aW9uSGludEZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGluZm8ubG9jYXRpb25IaW50KSk7Ci0JCQkvLyBsb2NhdGlvbkhpbnRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCQkvLyBsb2NhdGlvbkhpbnRGaWVsZC5zZXRFbmFibGVkKGluZm8uZ2V0UHJvcGVydHkoImxvY2F0aW9uSGludC1yZWFkT25seSIpCi0JCQkvLyA9PSBudWxsKTsKLQotCQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXBlcmZvcm1Ccm93c2UoKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJYnJvd3NlQnV0dG9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfQlJPV1NFKTsKLQkJCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChsb2NhdGlvbkhpbnRGaWVsZC5nZXRFbmFibGVkKCkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUJyb3dzZSgpIHsKLQkJCVN0cmluZ1tdIGV4dGVuc2lvbnMgPSB7Ii54c2QifTsgLy8kTk9OLU5MUy0xJAotCQkJU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2coZ2V0U2hlbGwoKSwgZXh0ZW5zaW9ucyk7Ci0JCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1NFTEVDVF9GSUxFKTsKLQkJCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0KLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJCS8vIFN0cmluZyBncmFtbWFyVVJJID0gbnVsbDsKLQkJCQlJRmlsZSBmaWxlID0gZGlhbG9nLmdldEZpbGUoKTsKLQkJCQlTdHJpbmcgaWQgPSBkaWFsb2cuZ2V0SWQoKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB1cmkgPSBudWxsOwotCQkJCQlpZiAocmVzb3VyY2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIocmVzb3VyY2VMb2NhdGlvbik7Ci0JCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCUlQYXRoIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQkJCQl1cmkgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoZmlsZS5nZXRMb2NhdGlvbigpLCBsb2NhdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0JICAgICAgICAgICAgICAgICAgICAgIHVyaSA9IFVSSUhlbHBlci5nZXRSZWxhdGl2ZVVSSShmaWxlLmdldExvY2F0aW9uKCksIHJlc291cmNlTG9jYXRpb24pOwotCSAgICAgICAgICAgICAgICAgICAgfQotCQkJCQkJLy8gZ3JhbW1hclVSSSA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl1cmkgPSBmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQkJCQkJLy8gZ3JhbW1hclVSSSA9IHVyaTsKLQkJCQkJfQotCQkJCQlsb2NhdGlvbkhpbnRGaWVsZC5zZXRUZXh0KHVyaSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGlkICE9IG51bGwpIHsKLQkJCQkJbG9jYXRpb25IaW50RmllbGQuc2V0VGV4dChpZCk7Ci0JCQkJCS8vIFVSSVJlc29sdmVyIHJlc29sdmVyID0KLQkJCQkJVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKTsKLQkJCQkJLy8gZ3JhbW1hclVSSSA9IHJlc29sdmVyLnJlc29sdmUobnVsbCwgaWQsIGlkKTsKLQkJCQl9Ci0KLQkJCQl0cnkgewotCQkJCQkvLyBUT0RPIENNRG9jdW1lbnQgZG9jdW1lbnQgPQotCQkJCQkvLyBDTURvY3VtZW50QnVpbGRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuYnVpbGRDTURvY3VtZW50KGdyYW1tYXJVUkkpOwotCQkJCQkvLyBMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0KLQkJCQkJLy8gKExpc3QpZG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uYW1lc3BhY2VJbmZvIik7Ci0JCQkJCS8vIE5hbWVzcGFjZUluZm8gaW5mbyA9Ci0JCQkJCS8vIChOYW1lc3BhY2VJbmZvKW5hbWVzcGFjZUluZm9MaXN0LmdldCgwKTsKLQkJCQkJLy8gaWYgKHVyaUZpZWxkLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCAmJiBpbmZvLnVyaQotCQkJCQkvLyAhPSBudWxsKQotCQkJCQkvLyB7Ci0JCQkJCS8vIHVyaUZpZWxkLnNldFRleHQoaW5mby51cmkpOwotCQkJCQkvLyB9Ci0JCQkJCS8vIGlmIChwcmVmaXhGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDAgJiYKLQkJCQkJLy8gaW5mby5wcmVmaXggIT0gbnVsbCkKLQkJCQkJLy8gewotCQkJCQkvLyBwcmVmaXhGaWVsZC5zZXRUZXh0KGluZm8ucHJlZml4KTsKLQkJCQkJLy8gfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGRlbGV0ZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGVkaXRCdXR0b247Ci0JcHJvdGVjdGVkIEVkaXROYW1lc3BhY2VDb250cm9sIGVkaXROYW1lc3BhY2VDb250cm9sOwotCXByb3RlY3RlZCBpbnQgaGVpZ2h0SGludCA9IDI1MDsKLQlwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgQnV0dG9uIG5ld0J1dHRvbjsKLQlwcm90ZWN0ZWQgUGFnZUJvb2sgcGFnZUJvb2s7Ci0JcHJvdGVjdGVkIEJ1dHRvbiByYWRpbzE7Ci0JcHJvdGVjdGVkIEJ1dHRvbiByYWRpbzI7Ci0JcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSB0YWJsZVNlY3Rpb247Ci0JcHJvdGVjdGVkIENvbW1vbk5hbWVzcGFjZUluZm9UYWJsZSB0YWJsZVZpZXdlcjsKLQlwcm90ZWN0ZWQgaW50IHdpZHRoSGludCA9IDUwMDsKLQotCi0JcHVibGljIENvbW1vbkFkZE5hbWVzcGFjZXNDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgSVBhdGggcmVzb3VyY2VMb2NhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJaWYgKHdpZHRoSGludCAhPSAtMSkgewotCQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQl9Ci0JCWlmIChoZWlnaHRIaW50ICE9IC0xKSB7Ci0JCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJfQotCQlzZXRMYXlvdXREYXRhKGdkKTsKLQkJc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXJhZGlvMSA9IG5ldyBCdXR0b24odGhpcywgU1dULlJBRElPKTsKLQkJcmFkaW8xLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfU0VMRUNUX1JFR0lTVEVSRURfTkFNRVNQQUNFUyk7Ci0JCXJhZGlvMS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXJhZGlvMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlyYWRpbzIgPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5SQURJTyk7Ci0JCXJhZGlvMi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX1NQRUNJRllfTkVXX05BTUVTUEFDRSk7Ci0JCXJhZGlvMi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwodGhpcywgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJc2VwYXJhdG9yLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkvLyBHcm91cCBuYW1lc3BhY2VJbmZvR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULk5PTkUpOwotCQkvLyBuYW1lc3BhY2VJbmZvR3JvdXAuc2V0VGV4dCgiTmFtZXNwYWNlIERlY2xhcmF0aW9ucyIpOwotCQkvLyAvL1hNTENvbW1vblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfVUlfTEFCRUxfWE1MX1NDSEVNQV9JTkZPUk1BVElPTiIpKTsKLQkJLy8gbmFtZXNwYWNlSW5mb0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkvLyBuYW1lc3BhY2VJbmZvR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHRoaXMsIFNXVC5OT05FKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJdGFibGVTZWN0aW9uID0gbmV3IENvbXBvc2l0ZShwYWdlQm9vaywgU1dULk5PTkUpOwotCQl0YWJsZVNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0YWJsZVNlY3Rpb24sIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9TRUxFQ1RfTkFNRVNQQUNFX1RPX0FERCk7Ci0KLQkJdGFibGVWaWV3ZXIgPSBuZXcgQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlKHRhYmxlU2VjdGlvbiwgU1dULkNIRUNLLCA2KTsKLQkJZWRpdE5hbWVzcGFjZUNvbnRyb2wgPSBuZXcgRWRpdE5hbWVzcGFjZUNvbnRyb2wocGFnZUJvb2spOwotCQlwYWdlQm9vay5zaG93UGFnZSh0YWJsZVNlY3Rpb24pOwotCi0JCXRhYmxlVmlld2VyLnNldElucHV0KG5hbWVzcGFjZUluZm9MaXN0KTsKLQl9Ci0KLQotCi0JcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHJhZGlvMS5nZXRTZWxlY3Rpb24oKSkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCQlpZiAoaXRlbS5nZXRDaGVja2VkKCkpIHsKLQkJCQkJbGlzdC5hZGQoaXRlbS5nZXREYXRhKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0JCQlpbmZvLnByZWZpeCA9IGVkaXROYW1lc3BhY2VDb250cm9sLnByZWZpeEZpZWxkLmdldFRleHQoKTsKLQkJCWluZm8udXJpID0gZWRpdE5hbWVzcGFjZUNvbnRyb2wudXJpRmllbGQuZ2V0VGV4dCgpOwotCQkJaW5mby5sb2NhdGlvbkhpbnQgPSBlZGl0TmFtZXNwYWNlQ29udHJvbC5sb2NhdGlvbkhpbnRGaWVsZC5nZXRUZXh0KCk7Ci0JCQlsaXN0LmFkZChpbmZvKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VJbmZvTGlzdChMaXN0IGxpc3QpIHsKLQkJbmFtZXNwYWNlSW5mb0xpc3QgPSBsaXN0OwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSByYWRpbzEpIHsKLQkJCXBhZ2VCb29rLnNob3dQYWdlKHRhYmxlU2VjdGlvbik7Ci0JCX0KLQkJZWxzZSBpZiAoZS53aWRnZXQgPT0gcmFkaW8yKSB7Ci0JCQlwYWdlQm9vay5zaG93UGFnZShlZGl0TmFtZXNwYWNlQ29udHJvbCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkFkZE5hbWVzcGFjZXNEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uQWRkTmFtZXNwYWNlc0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjkxMTNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uQWRkTmFtZXNwYWNlc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLm5zZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotCi0KLQotcHVibGljIGNsYXNzIENvbW1vbkFkZE5hbWVzcGFjZXNEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBDb21tb25BZGROYW1lc3BhY2VzQ29udHJvbCBhZGROYW1lc3BhY2VzQ29udHJvbDsKLQlwcm90ZWN0ZWQgTGlzdCBleGlzdGluZ05hbWVzcGFjZXM7Ci0JcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3Q7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQlwcm90ZWN0ZWQgSGFzaE1hcCBwcmVmZXJyZWRQcmVmaXhUYWJsZSA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247Ci0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQotCXB1YmxpYyBDb21tb25BZGROYW1lc3BhY2VzRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgdGl0bGUsIElQYXRoIHJlc291cmNlTG9jYXRpb24sIExpc3QgZXhpc3RpbmdOYW1lc3BhY2VzKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLmV4aXN0aW5nTmFtZXNwYWNlcyA9IGV4aXN0aW5nTmFtZXNwYWNlczsKLQkJcHJlZmVycmVkUHJlZml4VGFibGUucHV0KCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIsICJ3c2RsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcmVmZXJyZWRQcmVmaXhUYWJsZS5wdXQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLCAic29hcCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJlZmVycmVkUHJlZml4VGFibGUucHV0KCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiwgImh0dHAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByZWZlcnJlZFByZWZpeFRhYmxlLnB1dCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIsICJtaW1lIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcmVmZXJyZWRQcmVmaXhUYWJsZS5wdXQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiwgInNvYXBlbmMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByZWZlcnJlZFByZWZpeFRhYmxlLnB1dCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iLCAic29hcGVudiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJlZmVycmVkUHJlZml4VGFibGUucHV0KCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ4c2kiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByZWZlcnJlZFByZWZpeFRhYmxlLnB1dCgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAieHNkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEJ1aWx0SW5OYW1lc3BhY2VzKExpc3QgbGlzdCkgewotCQlTdHJpbmcgeHNpTmFtZXNwYWNlID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgeHNkTmFtZXNwYWNlID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIWlzQWxyZWFkeURlY2xhcmVkKHhzaU5hbWVzcGFjZSkpIHsKLQkJCWxpc3QuYWRkKG5ldyBOYW1lc3BhY2VJbmZvKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ4c2kiLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmICghaXNBbHJlYWR5RGVjbGFyZWQoeHNkTmFtZXNwYWNlKSkgewotCQkJbGlzdC5hZGQobmV3IE5hbWVzcGFjZUluZm8oImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgInhzZCIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDYXRhbG9nTWFwVG9MaXN0KElDYXRhbG9nIGNhdGFsb2csIExpc3QgbGlzdCkgewotCQlJQ2F0YWxvZ0VudHJ5W10gZW50cmllcyA9IGNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCWlmICgoZW50cnkuZ2V0RW50cnlUeXBlKCkgPT0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQykgJiYgZW50cnkuZ2V0VVJJKCkuZW5kc1dpdGgoIi54c2QiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCFpc0FscmVhZHlEZWNsYXJlZChlbnRyeS5nZXRLZXkoKSkpIHsKLQkJCQkJTmFtZXNwYWNlSW5mbyBuYW1lc3BhY2VJbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oZW50cnkuZ2V0S2V5KCksICJ4eCIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJCWxpc3QuYWRkKG5hbWVzcGFjZUluZm8pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQluYW1lc3BhY2VJbmZvTGlzdCA9IGFkZE5hbWVzcGFjZXNDb250cm9sLmdldE5hbWVzcGFjZUluZm9MaXN0KCk7Ci0JCX0KLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29tcHV0ZUFkZGFibGVQcmVmaXhlcyhMaXN0IGFkZGFibGVMaXN0LCBMaXN0IGV4aXNpdGluZ0xpc3QpIHsKLQkJSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBleGlzaXRpbmdMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJaWYgKGluZm8ucHJlZml4ICE9IG51bGwpIHsKLQkJCQltYXAucHV0KGluZm8ucHJlZml4LCBpbmZvKTsKLQkJCX0KLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGkgPSBhZGRhYmxlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBpLm5leHQoKTsKLQkJCWlmIChpbmZvLnVyaSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIHByZWZlcnJlZFByZWZpeFRhYmxlLmdldChpbmZvLnVyaSk7Ci0JCQkJaW5mby5wcmVmaXggPSBnZXRVbmlxdWVQcmVmaXgobWFwLCBwcmVmaXgsIGluZm8udXJpKTsKLQkJCQltYXAucHV0KGluZm8ucHJlZml4LCBpbmZvKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgY3JlYXRlQW5kT3BlbigpIHsKLQkJY3JlYXRlKCk7Ci0JCWdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0JCVJlY3RhbmdsZSByID0gZ2V0U2hlbGwoKS5nZXRCb3VuZHMoKTsKLQkJZ2V0U2hlbGwoKS5zZXRCb3VuZHMoci54ICsgODAsIHIueSArIDgwLCByLndpZHRoLCByLmhlaWdodCk7Ci0JCXNldEJsb2NrT25PcGVuKHRydWUpOwotCQlyZXR1cm4gb3BlbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWFkZE5hbWVzcGFjZXNDb250cm9sID0gbmV3IENvbW1vbkFkZE5hbWVzcGFjZXNDb250cm9sKGRpYWxvZ0FyZWEsIFNXVC5OT05FLCByZXNvdXJjZUxvY2F0aW9uKTsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWFkZEJ1aWx0SW5OYW1lc3BhY2VzKGxpc3QpOwotCQlJQ2F0YWxvZyBkZWZhdWx0Q2F0YWxvZyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0JCUlOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGRlZmF1bHRDYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5leHRDYXRhbG9ncy5sZW5ndGg7IGkrKykgewotCQkJSU5leHRDYXRhbG9nIGNhdGFsb2cgPSBuZXh0Q2F0YWxvZ3NbaV07Ci0JCQlJQ2F0YWxvZyByZWZlcmVuY2VkQ2F0YWxvZyA9IGNhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQkJCWlmIChyZWZlcmVuY2VkQ2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkJaWYgKFhNTENvcmVQbHVnaW4uVVNFUl9DQVRBTE9HX0lELmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkgewotCQkJCQlJQ2F0YWxvZyB1c2VyQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotCQkJCQlhZGRDYXRhbG9nTWFwVG9MaXN0KHVzZXJDYXRhbG9nLCBsaXN0KTsKLQotCQkJCX0KLQkJCQllbHNlIGlmIChYTUxDb3JlUGx1Z2luLlNZU1RFTV9DQVRBTE9HX0lELmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkgewotCQkJCQlJQ2F0YWxvZyBzeXN0ZW1DYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0JCQkJCWFkZENhdGFsb2dNYXBUb0xpc3Qoc3lzdGVtQ2F0YWxvZywgbGlzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJY29tcHV0ZUFkZGFibGVQcmVmaXhlcyhsaXN0LCBleGlzdGluZ05hbWVzcGFjZXMpOwotCi0JCWFkZE5hbWVzcGFjZXNDb250cm9sLnNldE5hbWVzcGFjZUluZm9MaXN0KGxpc3QpOwotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VJbmZvTGlzdCgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZUluZm9MaXN0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVycmVkUHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHByZWZlcnJlZFByZWZpeFRhYmxlLmdldChuYW1lc3BhY2VVUkkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFVuaXF1ZVByZWZpeChIYXNoTWFwIHByZWZpeE1hcCwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgewotCQlpZiAocHJlZml4ID09IG51bGwpIHsKLQkJCWludCBsYXN0SW5kZXggPSB1cmkubGFzdEluZGV4T2YoJy8nKTsKLQkJCWlmIChsYXN0SW5kZXggPT0gdXJpLmxlbmd0aCgpIC0gMSkgewotCQkJCXVyaSA9IHVyaS5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KTsKLQkJCQlsYXN0SW5kZXggPSB1cmkubGFzdEluZGV4T2YoJy8nKTsKLQkJCX0KLQkJCXByZWZpeCA9IHVyaS5zdWJzdHJpbmcobGFzdEluZGV4ICsgMSk7Ci0JCQlpZiAoKHByZWZpeC5sZW5ndGgoKSA+IDIwKSB8fCAocHJlZml4LmluZGV4T2YoJzonKSAhPSAtMSkpIHsKLQkJCQlwcmVmaXggPSBudWxsOwotCQkJfQotCQl9Ci0JCWlmIChwcmVmaXggPT0gbnVsbCkgewotCQkJcHJlZml4ID0gInAiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHByZWZpeE1hcC5nZXQocHJlZml4KSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgYmFzZSA9IHByZWZpeDsKLQkJCWZvciAoaW50IGNvdW50ID0gMDsgcHJlZml4TWFwLmdldChwcmVmaXgpICE9IG51bGw7IGNvdW50KyspIHsKLQkJCQlwcmVmaXggPSBiYXNlICsgY291bnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZWZpeDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FscmVhZHlEZWNsYXJlZChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGV4aXN0aW5nTmFtZXNwYWNlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU5hbWVzcGFjZUluZm8gbmFtZXNwYWNlSW5mbyA9IChOYW1lc3BhY2VJbmZvKSBpLm5leHQoKTsKLQkJCWlmIChuYW1lc3BhY2VVUkkuZXF1YWxzKG5hbWVzcGFjZUluZm8udXJpKSkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMzU4Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLm5zZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuRWRpdE5hbWVzcGFjZUluZm9EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLk5hbWVzcGFjZUluZm9FcnJvckhlbHBlcjsKLQotcHVibGljIGNsYXNzIENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nIHsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbW1vbkNvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRlbGV0ZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGVkaXRCdXR0b247Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0JcHJvdGVjdGVkIGludCBoZWlnaHRIaW50ID0gMjUwOwotCXByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBuZXdCdXR0b247Ci0JcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvd0xvY2F0aW9uVGV4dCA9IGZhbHNlOwotCXByb3RlY3RlZCBTdHJpbmcgdGFibGVMYWJlbCA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIENvbW1vbk5hbWVzcGFjZUluZm9UYWJsZSB0YWJsZVZpZXdlcjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgdG9wQ29tcG9zaXRlOwotCXByb3RlY3RlZCBib29sZWFuIHVzZUdyb3VwOwotCXByb3RlY3RlZCBpbnQgd2lkdGhIaW50ID0gNTAwOwotCi0JcHVibGljIENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nKENvbXBvc2l0ZSBwYXJlbnQsIElQYXRoIHJlc291cmNlTG9jYXRpb24sIFN0cmluZyBzdHJpbmdUYWJsZUxhYmVsKSB7Ci0JCXRoaXMocGFyZW50LCByZXNvdXJjZUxvY2F0aW9uLCBzdHJpbmdUYWJsZUxhYmVsLCBmYWxzZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyhDb21wb3NpdGUgcGFyZW50LCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgc3RyaW5nVGFibGVMYWJlbCwgYm9vbGVhbiB1c2VHcm91cCwgYm9vbGVhbiBzaG93TG9jVGV4dCkgewotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQl0YWJsZUxhYmVsID0gc3RyaW5nVGFibGVMYWJlbDsKLQkJdGhpcy51c2VHcm91cCA9IHVzZUdyb3VwOwotCQlzaG93TG9jYXRpb25UZXh0ID0gc2hvd0xvY1RleHQ7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJaWYgKHdpZHRoSGludCAhPSAtMSkgewotCQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQl9Ci0JCWlmIChoZWlnaHRIaW50ICE9IC0xKSB7Ci0JCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJfQotCi0JCS8vIFNldCBHcmlkRGF0YSBhbmQgR3JpZExheW91dCBmb3IgdGhlIHBhcmVudCBDb21wb3NpdGUKLQkJcGFyZW50LnNldExheW91dERhdGEoZ2QpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCS8vIENyZWF0ZSB0aGUgdG9wIENvbXBvc2l0ZQotCQl0b3BDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSB0b3BEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXRvcERhdGEuaGVpZ2h0SGludCA9IDA7Ci0JCXRvcENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKHRvcERhdGEpOwotCQl0b3BDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCS8vIENyZWF0ZSB0aGUgJ2NvbW1vbicvbWlkZGxlIENvbXBvc2l0ZQotCQlpZiAodXNlR3JvdXApIHsKLQkJCWNvbW1vbkNvbXBvc2l0ZSA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJfQotCQllbHNlIHsKLQkJCWNvbW1vbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCX0KLQkJY29tbW9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21tb25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLQkJLy8gQWRkIHRoZSBlcnJvciBNZXNzYWdlIExhYmVsCi0JCWVycm9yTWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGNyZWF0ZUhvcml6b250YWxGaWxsKCkpOwotCQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihlcnJvck1lc3NhZ2VMYWJlbC5nZXREaXNwbGF5KCksIDIwMCwgMCwgMCk7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldEZvcmVncm91bmQoY29sb3IpOwotCi0JCWNyZWF0ZUNvbnRyb2xBcmVhKCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgPT0gbmV3QnV0dG9uKSB7Ci0JCQkJCXBlcmZvcm1OZXcoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZS53aWRnZXQgPT0gZWRpdEJ1dHRvbikgewotCQkJCQlwZXJmb3JtRWRpdCgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChlLndpZGdldCA9PSBkZWxldGVCdXR0b24pIHsKLQkJCQkJcGVyZm9ybURlbGV0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQkvLyBjcmVhdGUgYSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgdGhyZWUgYnV0dG9ucwotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoY3JlYXRlSG9yaXpvbnRhbEZpbGwoKSk7Ci0JCUdyaWRMYXlvdXQgYnV0dG9uR3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCS8vIGJ1dHRvbkdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCS8vIGJ1dHRvbkdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChidXR0b25HcmlkTGF5b3V0KTsKLQotCQkvLyBhZGQgdGhlIE5ldyBidXR0b24KLQkJLy8KLQkJbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJLy8gbmV3QnV0dG9uLnNldFRleHQoIiAiICsKLQkJLy8gWE1MQ29tbW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9VSV9CVVRUT05fTkVXIikgKyAiICIpOwotCQluZXdCdXR0b24uc2V0VGV4dCgiICAgIiArIFhNTFVJTWVzc2FnZXMuQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2dfMCArICIgICAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQluZXdCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7IC8vIFZpZXdVdGlsaXR5LmNyZWF0ZUhvcml6b250YWxGaWxsKCkpOwotCQluZXdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCS8vIGFkZCB0aGUgRWRpdCBidXR0b24KLQkJLy8KLQkJLy8gZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJLy8gZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IGdkLkZJTEw7Ci0JCS8vIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCi0JCWVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQllZGl0QnV0dG9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfQlVUVE9OX0VESVQpOwotCQllZGl0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOyAvLyBWaWV3VXRpbGl0eS5jcmVhdGVIb3Jpem9udGFsRmlsbCgpKTsKLQkJZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJLy8gYWRkIHRoZSBEZWxldGUgYnV0dG9uCi0JCS8vCi0JCS8vIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCS8vIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBnZC5GSUxMOwotCQkvLyBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQotCQlkZWxldGVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlkZWxldGVCdXR0b24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9CVVRUT05fREVMRVRFKTsKLQkJZGVsZXRlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOyAvLyBWaWV3VXRpbGl0eS5jcmVhdGVIb3Jpem9udGFsRmlsbCgpKTsKLQkJZGVsZXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udHJvbEFyZWEoKSB7Ci0JCWlmICh1c2VHcm91cCkgewotCQkJKChHcm91cCkgY29tbW9uQ29tcG9zaXRlKS5zZXRUZXh0KHRhYmxlTGFiZWwpOwotCQl9Ci0JCWVsc2UgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tbW9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KHRhYmxlTGFiZWwpOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShjcmVhdGVHcmlkRGF0YShmYWxzZSwgMykpOwotCQl9Ci0KLQkJdGFibGVWaWV3ZXIgPSBuZXcgQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlKGNvbW1vbkNvbXBvc2l0ZSwgNiwgc2hvd0xvY2F0aW9uVGV4dCk7Ci0JCXRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGNyZWF0ZUdyaWREYXRhKHRydWUsIDIpKTsKLQkJY3JlYXRlQnV0dG9ucyhjb21tb25Db21wb3NpdGUpOwotCi0JCXRhYmxlVmlld2VyLnNldElucHV0KG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJdXBkYXRlQnV0dG9uRW5hYmxlZFN0YXRlKCk7Ci0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZUJ1dHRvbkVuYWJsZWRTdGF0ZSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgR3JpZERhdGEgY3JlYXRlR3JpZERhdGEoYm9vbGVhbiBib3RoLCBpbnQgc3BhbikgewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShib3RoID8gR3JpZERhdGEuRklMTF9CT1RIIDogR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlyZXR1cm4gZ2Q7Ci0JfQotCi0JcHJpdmF0ZSBHcmlkRGF0YSBjcmVhdGVIb3Jpem9udGFsRmlsbCgpIHsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlyZXR1cm4gZ2Q7Ci0JfQotCi0KLQotCXB1YmxpYyBOYW1lc3BhY2VJbmZvIGdldE5hbWVzcGFjZUluZm8oU3RyaW5nIG5hbWVzcGFjZSkgewotCQlOYW1lc3BhY2VJbmZvIHJlc3VsdCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG5hbWVzcGFjZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJaWYgKChpbmZvLnVyaSAhPSBudWxsKSAmJiBpbmZvLnVyaS5lcXVhbHMobmFtZXNwYWNlKSkgewotCQkJCXJlc3VsdCA9IGluZm87Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCi0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGVzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlJdGVyYXRvciBpID0gZXMuaXRlcmF0b3IoKTsKLQkJCWlmIChpLmhhc05leHQoKSkgewotCQkJCXJlc3VsdCA9IGkubmV4dCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBVc2UgdGhlIHJldHVybmVkIENvbXBvc2l0ZSB0byBhZGQgY29udGVudCBhYm92ZSB0aGUgJ2NvbW1vbiBjb250ZW50cycuCi0JICogTm90ZTogVGhlIEdyaWREYXRhIGZvciB0aGUgcmV0dXJuZWQgQ29tcG9zaXRlIGhhcyBhIGhlaWdodEhpbnQgPSAwLgotCSAqIFRoaXMgbWVhbnMgd2hlbiB1c2luZyB0aGUgcmV0dXJuZWQgQ29tcG9zaXRlLCB0aGUgR3JpZERhdGEgbXVzdCBiZQotCSAqIHJlc2V0LCBlbHNlIHRoZSBDb21wb3NpdGUgYW5kIGl0J3MgY29udGVudHMgd2lsbCBub3QgYXBwZWFyLgotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgZ2V0VG9wQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gdG9wQ29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBpbnZva2VEaWFsb2coU3RyaW5nIHRpdGxlLCBOYW1lc3BhY2VJbmZvIGluZm8pIHsKLQkJU2hlbGwgc2hlbGwgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCUVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyhzaGVsbCwgaW5mbyk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLnNldFJlc291cmNlTG9jYXRpb24ocmVzb3VyY2VMb2NhdGlvbik7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybiBkaWFsb2c7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlbGF5ZWRVcGRhdGUoKSB7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJLyoKLQkJICogUnVubmFibGUgZGVsYXllZFVwZGF0ZSA9IG5ldyBSdW5uYWJsZSgpIHsgcHVibGljIHZvaWQgcnVuKCkgewotCQkgKiB0YWJsZVZpZXdlci5yZWZyZXNoKCk7IH0gfTsKLQkJICogRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKGRlbGF5ZWRVcGRhdGUpOwotCQkgKi8KLQkJLy8gaWYgKHVwZGF0ZUxpc3RlbmVyICE9IG51bGwpCi0JCS8vIHsKLQkJLy8gdXBkYXRlTGlzdGVuZXIudXBkYXRlT2NjdXJlZCh0aGlzLCBuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCS8vIH0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVsZXRlKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCW5hbWVzcGFjZUluZm9MaXN0LnJlbW92ZUFsbChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCXVwZGF0ZUVycm9yTWVzc2FnZShuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQlwZXJmb3JtRGVsYXllZFVwZGF0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUVkaXQoKSB7Ci0JCU9iamVjdCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24odGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCWludm9rZURpYWxvZyhYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9ORVdfTkFNRVNQQUNFX0lORk9STUFUSU9OLCAoTmFtZXNwYWNlSW5mbykgc2VsZWN0aW9uKTsKLQkJCXVwZGF0ZUVycm9yTWVzc2FnZShuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQlwZXJmb3JtRGVsYXllZFVwZGF0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybU5ldygpIHsKLQkJU2hlbGwgc2hlbGwgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCUNvbW1vbkFkZE5hbWVzcGFjZXNEaWFsb2cgZGlhbG9nID0gbmV3IENvbW1vbkFkZE5hbWVzcGFjZXNEaWFsb2coc2hlbGwsIFhNTFVJTWVzc2FnZXMuX1VJX0FERF9OQU1FU1BBQ0VfREVDTEFSQVRJT05TLCByZXNvdXJjZUxvY2F0aW9uLCBuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCWRpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJbmFtZXNwYWNlSW5mb0xpc3QuYWRkQWxsKGRpYWxvZy5nZXROYW1lc3BhY2VJbmZvTGlzdCgpKTsKLQkJCXVwZGF0ZUVycm9yTWVzc2FnZShuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQlwZXJmb3JtRGVsYXllZFVwZGF0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlSW5mb0xpc3QoTGlzdCBsaXN0KSB7Ci0JCW5hbWVzcGFjZUluZm9MaXN0ID0gbGlzdDsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQobmFtZXNwYWNlSW5mb0xpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUJ1dHRvbkVuYWJsZWRTdGF0ZSgpIHsKLQkJT2JqZWN0IHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbih0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBzZWxlY3Rpb247Ci0JCWVkaXRCdXR0b24uc2V0RW5hYmxlZChpbmZvICE9IG51bGwpOwotCQlkZWxldGVCdXR0b24uc2V0RW5hYmxlZCgoaW5mbyAhPSBudWxsKSAmJiAoaW5mby5nZXRQcm9wZXJ0eSgidW5yZW1vdmFibGUiKSA9PSBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVFcnJvck1lc3NhZ2UoTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCkgewotCQlOYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXIgaGVscGVyID0gbmV3IE5hbWVzcGFjZUluZm9FcnJvckhlbHBlcigpOwotCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gaGVscGVyLmNvbXB1dGVFcnJvck1lc3NhZ2UobmFtZXNwYWNlSW5mb0xpc3QsIG51bGwpOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSAhPSBudWxsID8gZXJyb3JNZXNzYWdlIDogIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlUGF0aChJUGF0aCBwYXRoKSB7Ci0JICByZXNvdXJjZUxvY2F0aW9uID0gcGF0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkVkaXROYW1lc3BhY2VzVGFyZ2V0RmllbGREaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjZkODVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLm5zZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoKLSAqIFRoaXMgY2xhc3MgaXMgYW4gZXh0ZW5zaW9uIG9mIENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nLiBUaGlzIGNsYXNzIGFkZHMKLSAqIHRoZSB0YXJnZXQgbmFtZXNwYWNlcyBkaWFsb2cgZmllbGQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nIGV4dGVuZHMgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cgewotCi0JY2xhc3MgVGFyZ2V0TmFtZXNwYWNlTW9kaWZ5TGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJU3RyaW5nIG9sZFRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLQkJCXRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZUZpZWxkLmdldFRleHQoKTsKLQkJCXVwZGF0ZVRhcmdldE5hbWVzcGFjZUFuZE5hbWVzcGFjZUluZm8ob2xkVGFyZ2V0TmFtZXNwYWNlLCB0YXJnZXROYW1lc3BhY2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0JcHJvdGVjdGVkIFRleHQgdGFyZ2V0TmFtZXNwYWNlRmllbGQ7Ci0KLQlwdWJsaWMgQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZyhDb21wb3NpdGUgcGFyZW50LCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uMSkgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTG9jYXRpb24xLCBYTUxVSU1lc3NhZ2VzLl9VSV9OQU1FU1BBQ0VfREVDTEFSQVRJT05TKTsKLQotCQlDb21wb3NpdGUgdGFyZ2V0Q29tcCA9IGdldFRvcENvbXBvc2l0ZSgpOwotCQl0YXJnZXRDb21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCUxhYmVsIHRhcmdldE5hbWVzcGFjZUxhYmVsID0gbmV3IExhYmVsKHRhcmdldENvbXAsIFNXVC5OT05FKTsKLQkJdGFyZ2V0TmFtZXNwYWNlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXRhcmdldE5hbWVzcGFjZUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfVEFSR0VUX05BTUVTUEFDRSk7Ci0KLQkJdGFyZ2V0TmFtZXNwYWNlRmllbGQgPSBuZXcgVGV4dCh0YXJnZXRDb21wLCBTV1QuQk9SREVSKTsKLQkJdGFyZ2V0TmFtZXNwYWNlRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXRhcmdldE5hbWVzcGFjZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBUYXJnZXROYW1lc3BhY2VNb2RpZnlMaXN0ZW5lcigpKTsKLQotCQkvLyBjcmVhdGVDb250cm9sQXJlYSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1FZGl0KCkgewotCQlPYmplY3Qgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGVkaXRUYXJnZXROYW1lc3BhY2UgPSBmYWxzZTsKLQkJCU5hbWVzcGFjZUluZm8gbnNJbmZvID0gKE5hbWVzcGFjZUluZm8pIHNlbGVjdGlvbjsKLQkJCWlmIChnZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMobnNJbmZvLnVyaSkpIHsKLQkJCQllZGl0VGFyZ2V0TmFtZXNwYWNlID0gdHJ1ZTsKLQkJCX0KLQotCQkJaW52b2tlRGlhbG9nKFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX05FV19OQU1FU1BBQ0VfSU5GT1JNQVRJT04sIG5zSW5mbyk7Ci0JCQl1cGRhdGVFcnJvck1lc3NhZ2UobmFtZXNwYWNlSW5mb0xpc3QpOwotCQkJcGVyZm9ybURlbGF5ZWRVcGRhdGUoKTsKLQotCQkJaWYgKGVkaXRUYXJnZXROYW1lc3BhY2UpIHsKLQkJCQl0YXJnZXROYW1lc3BhY2VGaWVsZC5zZXRUZXh0KG5zSW5mby51cmkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0aGVUYXJnZXROYW1lc3BhY2UpIHsKLQkJdGFyZ2V0TmFtZXNwYWNlID0gdGhlVGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgPyB0aGVUYXJnZXROYW1lc3BhY2UgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQl0YXJnZXROYW1lc3BhY2VGaWVsZC5zZXRUZXh0KHRhcmdldE5hbWVzcGFjZSk7Ci0JCS8vIHVwZGF0ZVRhcmdldE5hbWVzcGFjZUFuZE5hbWVzcGFjZUluZm8odGFyZ2V0TmFtZXNwYWNlKTsKLQl9Ci0KLQl2b2lkIHVwZGF0ZVRhcmdldE5hbWVzcGFjZUFuZE5hbWVzcGFjZUluZm8oU3RyaW5nIG9sZFRhcmdldE5hbWVzcGFjZSwgU3RyaW5nIG5ld1RhcmdldE5hbWVzcGFjZSkgewotCQlOYW1lc3BhY2VJbmZvIGluZm8gPSBnZXROYW1lc3BhY2VJbmZvKG5ld1RhcmdldE5hbWVzcGFjZSk7Ci0JCWlmIChpbmZvID09IG51bGwpIHsKLQkJCWluZm8gPSBnZXROYW1lc3BhY2VJbmZvKG9sZFRhcmdldE5hbWVzcGFjZSk7Ci0JCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKG5ld1RhcmdldE5hbWVzcGFjZSwgInRucyIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJbmFtZXNwYWNlSW5mb0xpc3QuYWRkKGluZm8pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW5mby51cmkgPSB0YXJnZXROYW1lc3BhY2U7Ci0JCQl9Ci0JCX0KLQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbk5hbWVzcGFjZUluZm9UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDE2MmU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIENvbW1vbk5hbWVzcGFjZUluZm9UYWJsZSBleHRlbmRzIFRhYmxlVmlld2VyIHsKLQotCS8qKgotCSAqIE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciwgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQlWaWV3ZXIgdmlld2VyOwotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCUltYWdlIHJlc3VsdCA9IG51bGw7Ci0JCQlpbnQgY29sdW1uQ29kZSA9IGdldENvbHVtbkNvZGUoY29sdW1uSW5kZXgpOwotCQkJaWYgKGNvbHVtbkNvZGUgPT0gQ09MVU1OX0xPQ0FUSU9OX0hJTlQpIHsKLQkJCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgb2JqZWN0OwotCQkJCWlmICgoaW5mby5sb2NhdGlvbkhpbnQgPT0gbnVsbCkgfHwgaW5mby5sb2NhdGlvbkhpbnQudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyBDb21tZW50IHRoaXMgb3V0IHVudGlsIHdlIHNvbHZlIHRoZSBhbGlnbm1lbnQvKHNwYWNlCi0JCQkJCS8vIGZvciBpbWFnZSBiZWluZyBhbGxvY2F0ZWQKLQkJCQkJLy8gdG8gcHJlZml4IGNvbHVtbikgLi4uLi4uCi0JCQkJCS8vIHJlc3VsdCA9Ci0JCQkJCS8vIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfV0FSTklOR19PQkopOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uKSB7Ci0JCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgb2JqZWN0OwotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCQlpbnQgY29sdW1uQ29kZSA9IGdldENvbHVtbkNvZGUoY29sdW1uKTsKLQkJCXN3aXRjaCAoY29sdW1uQ29kZSkgewotCQkJCWNhc2UgQ09MVU1OX1BSRUZJWCA6IHsKLQkJCQkJcmVzdWx0ID0gaW5mby5wcmVmaXg7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIENPTFVNTl9OQU1FU1BBQ0VfVVJJIDogewotCQkJCQlyZXN1bHQgPSBpbmZvLnVyaTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgQ09MVU1OX0NIRUNLQk9YIDogewotCQkJCQlyZXN1bHQgPSAiIjsgLy8gaW5mby5sb2NhdGlvbkhpbnQ7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgQ09MVU1OX0xPQ0FUSU9OX0hJTlQgOiB7Ci0JCQkJCXJlc3VsdCA9IGluZm8ubG9jYXRpb25IaW50OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXN1bHQgPSByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocmVzdWx0LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXN3aXRjaCAoY29sdW1uQ29kZSkgewotCQkJCQljYXNlIENPTFVNTl9QUkVGSVggOiB7Ci0JCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9OT19QUkVGSVg7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIENPTFVNTl9OQU1FU1BBQ0VfVVJJIDogewotCQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfTk9fTkFNRVNQQUNFX05BTUU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJTGlzdCBsaXN0ID0gKExpc3QpIHZpZXdlci5nZXRJbnB1dCgpOwotCQkJcmV0dXJuIGxpc3QgIT0gbnVsbCA/IGxpc3QudG9BcnJheSgpIDogbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JCX0KLQl9Ci0KLQljbGFzcyBUYWJsZUl0ZW1DaGVja2VyIGV4dGVuZHMgTW91c2VBZGFwdGVyIHsKLQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSBnZXRUYWJsZSgpLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSk7Ci0JCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZW0uZ2V0RGF0YSgpOwotCQkJCWlmIChvYmogIT0gbnVsbCkgewotCQkJCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgb2JqOwotCQkJCQlUYWJsZUNvbHVtbiBjb2wgPSBnZXRUYWJsZSgpLmdldENvbHVtbigwKTsKLQkJCQkJaWYgKGUueCA8IGNvbC5nZXRXaWR0aCgpKSAvLyBpZiB0aGUgcG9pbnQgZmFsbHMgd2l0aGluCi0JCQkJCQkJCQkJCQkvLyB0aGUKLQkJCQkJLy8gU2VsZWN0IGNvbHVtbiB0aGVuIHBlcmZvcm0KLQkJCQkJLy8gY2hlY2svdW5jaGVjawotCQkJCQl7Ci0JCQkJCQlTdHJpbmcgY3VycmVudFN0YXRlID0gKFN0cmluZykgaW5mby5nZXRQcm9wZXJ0eSgiY2hlY2tlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImN1cnJlbnRTdGF0ZSIgKyBjdXJyZW50U3RhdGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoKGN1cnJlbnRTdGF0ZSA9PSBudWxsKSB8fCBjdXJyZW50U3RhdGUuZXF1YWxzKCJmYWxzZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl7Ci0JCQkJCQkJaW5mby5zZXRQcm9wZXJ0eSgiY2hlY2tlZCIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJaW5mby5zZXRQcm9wZXJ0eSgiY2hlY2tlZCIsICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0KLQkJCQkJCXJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9DSEVDS0JPWCA9IDE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0xPQ0FUSU9OX0hJTlQgPSA0OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9OQU1FU1BBQ0VfVVJJID0gMjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fUFJFRklYID0gMzsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX0NIRUNLQk9YID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9MT0NBVElPTl9ISU5UID0gWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTE9DQVRJT05fSElOVDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9OQU1FU1BBQ0VfVVJJID0gWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRVNQQUNFX05BTUU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfUFJFRklYID0gWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfUFJFRklYOwotCXByb3RlY3RlZCBMaXN0IGNoZWNrZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIGludFtdIGNvbHVtbkluZGV4TWFwOwotCXByb3RlY3RlZCBib29sZWFuIHNob3dDaGVja0JveGVzID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gc2hvd0xvY2F0aW9uVGV4dCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQlwcm90ZWN0ZWQgaW50IHZpc2libGVSb3dzID0gLTE7Ci0KLQlwdWJsaWMgQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCB2aXNpYmxlUm93cykgewotCQl0aGlzKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiwgdmlzaWJsZVJvd3MsIGZhbHNlKTsKLQl9Ci0KLQkvLyBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKGludCBjb2x1bW4pCi0JLy8gewotCS8vIHJldHVybiAoY29sdW1uID09IENPTFVNTl9DSEVDS0JPWCkgPyBjaGVja0JveENlbGxFZGl0b3IgOgotCS8vIHRleHRDZWxsRWRpdG9yOwotCS8vIH0KLQotCXB1YmxpYyBDb21tb25OYW1lc3BhY2VJbmZvVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHZpc2libGVSb3dzLCBib29sZWFuIHNob3dMb2NhdGlvblRleHQpIHsKLQkJdGhpcyhwYXJlbnQsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIsIHZpc2libGVSb3dzLCBzaG93TG9jYXRpb25UZXh0KTsKLQl9Ci0KLQlwdWJsaWMgQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgaW50IHZpc2libGVSb3dzKSB7Ci0JCXRoaXMocGFyZW50LCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgc3R5bGUsIHZpc2libGVSb3dzLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIENvbW1vbk5hbWVzcGFjZUluZm9UYWJsZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIGludCB2aXNpYmxlUm93cywgYm9vbGVhbiBzaG93TG9jYXRpb25UZXh0KSB7Ci0JCXN1cGVyKG5ldyBUYWJsZShwYXJlbnQsIHN0eWxlKSk7Ci0JCWdldFRhYmxlKCkuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl0aGlzLnNob3dDaGVja0JveGVzID0gKHN0eWxlICYgU1dULkNIRUNLKSAhPSAwOwotCQljb2x1bW5JbmRleE1hcCA9IGNyZWF0ZUNvbHVtbkluZGV4TWFwKCk7Ci0JCXRoaXMuc2hvd0xvY2F0aW9uVGV4dCA9IHNob3dMb2NhdGlvblRleHQ7Ci0KLQkJUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIoKTsKLQkJc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJc2V0TGFiZWxQcm92aWRlcihwcm92aWRlcik7Ci0KLQkJU3RyaW5nW10gY29sdW1uUHJvcGVydGllc0FycmF5ID0gY3JlYXRlQ29sdW1uUHJvcGVydGllc0FycmF5KCk7Ci0JCXNldENvbHVtblByb3BlcnRpZXMoY29sdW1uUHJvcGVydGllc0FycmF5KTsKLQotCQl0YWJsZSA9IGdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uUHJvcGVydGllc0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIGkpOwotCQkJaWYgKChjb2x1bW5Qcm9wZXJ0aWVzQXJyYXlbaV0pLmVxdWFscyhMQUJFTF9MT0NBVElPTl9ISU5UKSkgewotCQkJCWlmIChzaG93TG9jYXRpb25UZXh0KSB7Ci0JCQkJCWNvbHVtbi5zZXRUZXh0KGNvbHVtblByb3BlcnRpZXNBcnJheVtpXSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBDb21tZW50IHRoaXMgb3V0IHVudGlsIHdlIHNvbHZlIHRoZSBhbGlnbm1lbnQvKHNwYWNlCi0JCQkJCS8vIGZvciBpbWFnZSBiZWluZyBhbGxvY2F0ZWQKLQkJCQkJLy8gdG8gcHJlZml4IGNvbHVtbikgLi4uLi4uCi0JCQkJCS8vIGNvbHVtbi5zZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RYVEVYVCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWNvbHVtbi5zZXRUZXh0KGNvbHVtblByb3BlcnRpZXNBcnJheVtpXSk7Ci0JCQl9Ci0JCQljb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKGdldENvbHVtbldpZHRoKGkpLCB0cnVlKSk7Ci0JCX0KLQkJdGFibGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJdGhpcy52aXNpYmxlUm93cyA9IHZpc2libGVSb3dzOwotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IHZpc2libGVSb3dzOyBpKyspCi0JCS8vIHsKLQkJLy8gVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCS8vIGl0ZW0uc2V0VGV4dCgiIyMjIyMjIyIpOwotCQkvLyB9Ci0JCS8vIGNoZWNrQm94Q2VsbEVkaXRvciA9IG5ldyBOYW1lc3BhY2VJbmZvQ2hlY2tib3hDZWxsRWRpdG9yKHRhYmxlKTsKLQkJLy8gdGV4dENlbGxFZGl0b3IgPSBuZXcgVGV4dENlbGxFZGl0b3IodGFibGUpOwotCi0JCS8qCi0JCSAqIENlbGxFZGl0b3JbXSBjZWxsRWRpdG9ycyA9IG5ldwotCQkgKiBDZWxsRWRpdG9yW2NvbHVtblByb3BlcnRpZXNBcnJheS5sZW5ndGhdOyBmb3IgKGludCBpID0gMDsgaSA8Ci0JCSAqIGNvbHVtblByb3BlcnRpZXNBcnJheS5sZW5ndGg7IGkrKykgeyBjZWxsRWRpdG9yc1tpXSA9Ci0JCSAqIGdldENlbGxFZGl0b3IoaSk7IH0gc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotCQkgKi8KLQkJLy8gaWYgKHNob3dDaGVja0JveGVzKQotCQkvLyB7Ci0JCS8vIGdldFRhYmxlKCkuYWRkTW91c2VMaXN0ZW5lcihuZXcgVGFibGVJdGVtQ2hlY2tlcigpKTsKLQkJLy8gfQotCX0KLQotCS8vIHByb3RlY3RlZCBDZWxsRWRpdG9yIGNoZWNrQm94Q2VsbEVkaXRvcjsKLQkvLyBwcm90ZWN0ZWQgQ2VsbEVkaXRvciB0ZXh0Q2VsbEVkaXRvcjsKLQotCXByb3RlY3RlZCBpbnRbXSBjcmVhdGVDb2x1bW5JbmRleE1hcCgpIHsKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtzaG93Q2hlY2tCb3hlcyA/IDQgOiAzXTsKLQkJaW50IGkgPSAwOwotCQlpZiAoc2hvd0NoZWNrQm94ZXMpIHsKLQkJCXJlc3VsdFtpKytdID0gQ09MVU1OX0NIRUNLQk9YOwotCQl9Ci0JCXJlc3VsdFtpKytdID0gQ09MVU1OX1BSRUZJWDsKLQkJcmVzdWx0W2krK10gPSBDT0xVTU5fTkFNRVNQQUNFX1VSSTsKLQkJaWYgKCFzaG93Q2hlY2tCb3hlcykgewotCQkJcmVzdWx0W2krK10gPSBDT0xVTU5fTE9DQVRJT05fSElOVDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBjcmVhdGVDb2x1bW5Qcm9wZXJ0aWVzQXJyYXkoKSB7Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbM107Ci0JCWludCBpID0gMDsKLQkJaWYgKHNob3dDaGVja0JveGVzKSB7Ci0JCQlyZXN1bHRbaSsrXSA9IExBQkVMX0NIRUNLQk9YOwotCQl9Ci0JCXJlc3VsdFtpKytdID0gTEFCRUxfUFJFRklYOwotCQlyZXN1bHRbaSsrXSA9IExBQkVMX05BTUVTUEFDRV9VUkk7Ci0JCWlmICghc2hvd0NoZWNrQm94ZXMpIHsKLQkJCXJlc3VsdFtpKytdID0gTEFCRUxfTE9DQVRJT05fSElOVDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0Q29sdW1uQ29kZShpbnQgY29sdW1uKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlpZiAoY29sdW1uIDwgY29sdW1uSW5kZXhNYXAubGVuZ3RoKSB7Ci0JCQlyZXN1bHQgPSBjb2x1bW5JbmRleE1hcFtjb2x1bW5dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRDb2x1bW5XaWR0aChpbnQgY29sdW1uKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlzd2l0Y2ggKGdldENvbHVtbkNvZGUoY29sdW1uKSkgewotCQkJY2FzZSBDT0xVTU5fUFJFRklYIDogewotCQkJCXJlc3VsdCA9IDU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIENPTFVNTl9OQU1FU1BBQ0VfVVJJIDogewotCQkJCS8vIFNpemUgY29sdW1ucyBkaWZmZXJlbnRseSB3aGVuIGxvY2F0aW9uIGhpbnQgdGV4dCBsYWJlbCBpcwotCQkJCS8vIGRpc3BsYXllZAotCQkJCWlmIChzaG93TG9jYXRpb25UZXh0KSB7Ci0JCQkJCXJlc3VsdCA9IDEwOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gMjA7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBDT0xVTU5fQ0hFQ0tCT1ggOiB7Ci0JCQkJcmVzdWx0ID0gMTsgLy8gaW5mby5sb2NhdGlvbkhpbnQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIENPTFVNTl9MT0NBVElPTl9ISU5UIDogewotCQkJCS8vIFNpemUgY29sdW1ucyBkaWZmZXJlbnRseSB3aGVuIGxvY2F0aW9uIGhpbnQgdGV4dCBsYWJlbCBpcwotCQkJCS8vIGRpc3BsYXllZAotCQkJCWlmIChzaG93TG9jYXRpb25UZXh0KSB7Ci0JCQkJCXJlc3VsdCA9IDEwOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gMjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoKLQkgKiBwcm90ZWN0ZWQgY2xhc3MgTmFtZXNwYWNlSW5mb0NlbGxNb2RpZmllciBpbXBsZW1lbnRzIElDZWxsTW9kaWZpZXIgewotCSAqIHB1YmxpYyBOYW1lc3BhY2VJbmZvQ2VsbE1vZGlmaWVyKCkgeyB9Ci0JICogCi0JICogcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsgaWYKLQkgKiAocHJvcGVydHkuZXF1YWxzKExBQkVMX0NIRUNLQk9YKSkgeyByZXR1cm4gdHJ1ZTsgfSBlbHNlIGlmCi0JICogKHByb3BlcnR5LmVxdWFscyhMQUJFTF9QUkVGSVgpKSB7IHJldHVybiB0cnVlOyB9IHJldHVybiBmYWxzZTsgfQotCSAqIAotCSAqIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgeyBpbnQgY29sdW1uID0KLQkgKiAwOyBpZiAocHJvcGVydHkuZXF1YWxzKExBQkVMX0NIRUNLQk9YKSkgeyBjb2x1bW4gPSAwOyB9IGVsc2UgaWYKLQkgKiAocHJvcGVydHkuZXF1YWxzKExBQkVMX1BSRUZJWCkpIHsgY29sdW1uID0gMTsgfSBlbHNlIGlmCi0JICogKHByb3BlcnR5LmVxdWFscyhMQUJFTF9OQU1FU1BBQ0VfVVJJKSkgeyBjb2x1bW4gPSAyOyB9Ci0JICogCi0JICogLy9pZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhYmxlRWxlbWVudCkgLy97IC8vIHJldHVybgotCSAqIHByb3ZpZGVyLmdldENvbHVtblRleHQoZWxlbWVudCwgY29sdW1uKTsgLy99IC8vZWxzZSAvL3sgLy8gcmV0dXJuIG51bGw7IC8vIH0KLQkgKiByZXR1cm4gImhlbGxvIjsgfQotCSAqIAotCSAqIHB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsgfSB9Ci0JICogCi0JICogcHJvdGVjdGVkIGNsYXNzIE5hbWVzcGFjZUluZm9DaGVja2JveENlbGxFZGl0b3IgZXh0ZW5kcwotCSAqIENoZWNrYm94Q2VsbEVkaXRvciBpbXBsZW1lbnRzIE1vdXNlTGlzdGVuZXIgeyBwdWJsaWMKLQkgKiBOYW1lc3BhY2VJbmZvQ2hlY2tib3hDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsgc3VwZXIocGFyZW50KTsgfQotCSAqIAotCSAqIHByb3RlY3RlZCB2b2lkIGRvU2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7IH0KLQkgKiAKLQkgKiBwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsgc3VwZXIuYWN0aXZhdGUoKTsgZGVhY3RpdmF0ZSgpOwotCSAqIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEZvY3VzQ29udHJvbCgpLnJlZHJhdygpOyB9Ci0JICogCi0JICogcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgeyBpZiAoZ2V0VGFibGUoKS5nZXRJdGVtKG5ldwotCSAqIFBvaW50KGUueCwgZS55KSkgIT0gbnVsbCkgeyB9IH0gcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50Ci0JICogZSkgeyB9IHB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7IH0gfQotCSAqLwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3BlcnNwZWN0aXZlL1hNTFBlcnNwZWN0aXZlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3BlcnNwZWN0aXZlL1hNTFBlcnNwZWN0aXZlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2Y1NzljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wZXJzcGVjdGl2ZS9YTUxQZXJzcGVjdGl2ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBidWcgMjEzODgzIC0gaW5pdGlhbCBhcGkgCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gYnVnIDI3MTYxOSAtIE1vdmUgYW5kIHJlbmFtZSBYTUwgcGVyc3BlY3RpdmUgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGb2xkZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuSVByb2R1Y3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Qcm9kdWN0UHJvcGVydGllczsKLQotCi0vKioKLSAqIEBhdXRob3IgZGNhcnZlcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxQZXJzcGVjdGl2ZUZhY3RvcnkgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLQotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSF9WSUVXX0lEID0gIm9yZy5lY2xpcHNlLnNlYXJjaC51aS52aWV3cy5TZWFyY2hWaWV3IjsgLy8kTk9OLU5MUy0xJAotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhQQVRIX1ZJRVdfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC52aWV3cy5YUGF0aFZpZXciOyAvLyROT04tTkxTLTEkCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU05JUFBFVFNfVklFV19JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnNuaXBwZXRzLmludGVybmFsLnVpLlNuaXBwZXRzVmlldyI7IC8vJE5PTi1OTFMtMSQKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhURURJVE9SX1RFTVBMQVRFU19WSUVXX0lEID0gIm9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGVtcGxhdGVzVmlldyI7IC8vJE5PTi1OTFMtMSQKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9DT05TT0xFX1ZJRVcgPSAib3JnLmVjbGlwc2UudWkuY29uc29sZS5Db25zb2xlVmlldyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBISUVSQVJDSFlfVklFV19JRCA9ICJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFhNTFBlcnNwZWN0aXZlRmFjdG9yeSgpIHsKLQkJU3RyaW5nIHZpZXdlcklEID0gUHJvZHVjdFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuUEVSU1BFQ1RJVkVfRVhQTE9SRVJfVklFVyk7Ci0JCWlmICh2aWV3ZXJJRCAhPSBudWxsKSB7Ci0JCQkvLyB2ZXJpZnkgdGhhdCB0aGUgdmlldyBhY3R1YWxseSBleGlzdHMKLQkJCWlmIChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFZpZXdSZWdpc3RyeSgpLmZpbmQodmlld2VySUQpICE9IG51bGwpewotCQkJCUhJRVJBUkNIWV9WSUVXX0lEID0gdmlld2VySUQ7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgaW5pdGlhbCBsYXlvdXQuIFRoaXMgaXMgd2hhdCB0aGUgbGF5b3V0IGlzIHJlc2V0IHRvIHdoZW4KLQkgKiB0aGUgUmVzZXQgUGVyc3BlY3RpdmUgaXMgc2VsZWN0ZWQuIEl0IHRha2VzIGFzIGlucHV0IGEgSVBhZ2VMYXlvdXQKLQkgKiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGxheW91dAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCS8vIEdldCB0aGUgRWRpdG9yIEFyZWEKLS8vCQlTdHJpbmcgZWRpdG9yQXJlYSA9IGxheW91dC5nZXRFZGl0b3JBcmVhKCk7Ci0KLQkJLy8gVHVybiBvbiB0aGUgRWRpdG9yIEFyZWEKLQkJbGF5b3V0LnNldEVkaXRvckFyZWFWaXNpYmxlKHRydWUpOwotCQlsYXlvdXQuc2V0Rml4ZWQoZmFsc2UpOwotCi0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KEhJRVJBUkNIWV9WSUVXX0lEKTsKLQotCQlJRm9sZGVyTGF5b3V0IHRvcExlZnQgPSBsYXlvdXQuY3JlYXRlRm9sZGVyKCJ0b3BMZWZ0IiwgSVBhZ2VMYXlvdXQuTEVGVCwgMC4yM2YsIGxheW91dC5nZXRFZGl0b3JBcmVhKCkpOy8vJE5PTi1OTFMtMSQKLQkJdG9wTGVmdC5hZGRWaWV3KEhJRVJBUkNIWV9WSUVXX0lEKTsKLQotCQkvLyBDcmVhdGUgdGhlIGFyZWFzIG9mIHRoZSBsYXlvdXQgd2l0aCB0aGVpciBpbml0aWFsIHZpZXdzCi0vLwkJSUZvbGRlckxheW91dCBsZWZ0ID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigibGVmdCIsIElQYWdlTGF5b3V0LkxFRlQsIChmbG9hdCkgMC4yMywgZWRpdG9yQXJlYSk7IC8vJE5PTi1OTFMtMSQKLS8vCQlsZWZ0LmFkZFZpZXcoSVBhZ2VMYXlvdXQuSURfUFJPSkVDVF9FWFBMT1JFUik7Ci0vLwotLy8JCUlGb2xkZXJMYXlvdXQgYm90dG9tTGVmdCA9IGxheW91dC5jcmVhdGVGb2xkZXIoImJvdHRvbS1sZWZ0IiwgSVBhZ2VMYXlvdXQuQk9UVE9NLCAoZmxvYXQpIDAuNTAsICJsZWZ0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotLy8JCWJvdHRvbUxlZnQuYWRkVmlldyhYUEFUSF9WSUVXX0lEKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQlJRm9sZGVyTGF5b3V0IHJpZ2h0ID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigicmlnaHQiLCBJUGFnZUxheW91dC5SSUdIVCwgKGZsb2F0KSAwLjcwLCBlZGl0b3JBcmVhKTsgLy8kTk9OLU5MUy0xJAotLy8JCXJpZ2h0LmFkZFZpZXcoSVBhZ2VMYXlvdXQuSURfT1VUTElORSk7Ci0vLwkJCi0vLwkJSUZvbGRlckxheW91dCBib3R0b21SaWdodCA9IGxheW91dC5jcmVhdGVGb2xkZXIoImJvdHRvbS1yaWdodCIsIElQYWdlTGF5b3V0LkJPVFRPTSwgKGZsb2F0KSAwLjYwLCAicmlnaHQiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLS8vCQlib3R0b21SaWdodC5hZGRWaWV3KFRFWFRFRElUT1JfVEVNUExBVEVTX1ZJRVdfSUQpOwotLy8KLS8vCQlJRm9sZGVyTGF5b3V0IGJvdHRvbSA9IGxheW91dC5jcmVhdGVGb2xkZXIoImJvdHRvbSIsIElQYWdlTGF5b3V0LkJPVFRPTSwgKGZsb2F0KSAwLjc1LCBlZGl0b3JBcmVhKTsgLy8kTk9OLU5MUy0xJAotLy8JCWJvdHRvbS5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0vLwkJYm90dG9tLmFkZFZpZXcoSVBhZ2VMYXlvdXQuSURfUFJPUF9TSEVFVCk7Ci0vLwkJYm90dG9tLmFkZFZpZXcoSURfQ09OU09MRV9WSUVXKTsKLS8vCQlib3R0b20uYWRkVmlldyhTTklQUEVUU19WSUVXX0lEKTsKLS8vCi0vLwkJYm90dG9tLmFkZFBsYWNlaG9sZGVyKFNFQVJDSF9WSUVXX0lEKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODcwNjMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEVtcHR5RmlsZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZVNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZV8wOyAKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLQkJLy8gc29tZSB0aGVtZXMgb24gR1RLIGhhdmUgZGlmZmVyZW50IGJhY2tncm91bmQgY29sb3JzIGZvciBUZXh0IGFuZCBMYWJlbHMKLQkJdGV4dC5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXRCYWNrZ3JvdW5kKCkpOwotCQl0ZXh0LnNldFRleHQoZGVzY3JpcHRpb24pOwotCi0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVTY3JvbGxlZENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBzY3JvbGxiYXJzIGZvciB0aGlzIHBhcmVudCB3aGVuIG5lZWRlZAotCQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlzYzEuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUoc2MxLCAxKTsKLQkJc2MxLnNldENvbnRlbnQoY29tcG9zaXRlKTsKLQotCQkvLyBub3QgY2FsbGluZyBzZXRTaXplIGZvciBjb21wb3NpdGUgd2lsbCByZXN1bHQgaW4gYSBibGFuayBjb21wb3NpdGUsCi0JCS8vIHNvIGNhbGxpbmcgaXQgaGVyZSBpbml0aWFsbHkKLQkJLy8gc2V0U2l6ZSBhY3R1YWxseSBuZWVkcyB0byBiZSBjYWxsZWQgYWZ0ZXIgYWxsIGNvbnRyb2xzIGFyZSBjcmVhdGVkLAotCQkvLyBzbyBzY3JvbGxlZENvbXBvc2l0ZQotCQkvLyBoYXMgY29ycmVjdCBtaW5TaXplCi0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpZiAoY29tcG9zaXRlICE9IG51bGwpIHsKLQkJCS8vIE5vdGU6IFRoZSBmb250IGlzIHNldCBoZXJlIGluIGFudGljaXBhdGlvbiB0aGF0IHRoZSBjbGFzcyBpbmhlcml0aW5nCi0JCQkvLyAgICAgICB0aGlzIGJhc2UgY2xhc3MgbWF5IGFkZCB3aWRnZXRzIHRvIHRoZSBkaWFsb2cuICAgc2V0U2l6ZQotCQkJLy8gICAgICAgaXMgYXNzdW1lZCB0byBiZSBjYWxsZWQganVzdCBiZWZvcmUgd2UgZ28gbGl2ZS4KLQkJCWFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQkJUG9pbnQgbWluU2l6ZSA9IGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJY29tcG9zaXRlLnNldFNpemUobWluU2l6ZSk7Ci0JCQkvLyBzZXQgc2Nyb2xsYmFyIGNvbXBvc2l0ZSdzIG1pbiBzaXplIHNvIHBhZ2UgaXMgZXhwYW5kYWJsZSBidXQKLQkJCS8vIGhhcyBzY3JvbGxiYXJzIHdoZW4gbmVlZGVkCi0JCQlpZiAoY29tcG9zaXRlLmdldFBhcmVudCgpIGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpIHsKLQkJCQlTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSAoU2Nyb2xsZWRDb21wb3NpdGUpIGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLQkJCQlzYzEuc2V0TWluU2l6ZShtaW5TaXplKTsKLQkJCQlzYzEuc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQkJCQlzYzEuc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRW5jb2RpbmdTZXR0aW5ncy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0VuY29kaW5nU2V0dGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmYTEzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRW5jb2RpbmdTZXR0aW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25DaGFyc2V0TmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKioKLSAqIEVuY29kaW5nU2V0dGluZ3MgaXMgYSBjb21wb3NpdGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBzZXQgb2YKLSAqIGVuY29kaW5nIHZhbHVlcyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIHVzZXIuIFRoZSBsaXN0IG9mIGVuY29kaW5nIHZhbHVlcwotICogaXMgYmFzZWQgb2ZmIHRoZSBTdXBwb3J0ZWRKYXZhRW5jb2RpbmcgY2xhc3MuIEFzIHRoZSB1c2VyIHNlbGVjdHMgYW4KLSAqIGVuY29kaW5nIGZyb20gdGhlIGNvbWJvIGJveCwgdGhlIHJlYWRvbmx5IGZpZWxkIGJlbG93IGl0IGNoYW5nZXMgdG8gc2hvdwotICogdGhlIElBTkEgdGFnIGZvciB0aGF0IHBhcnRpY3VsYXIgZW5jb2RpbmcgZGVzY3JpcHRpb24uIFRoZSBsYWJlbHMgZm9yIHRoZQotICogd2lkZ2V0cyBhcmUgY29uZmlndXJhYmxlIGFuZCB0aGUgaW5pdGlhbCB2YWx1ZSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyIGNhbgotICogYmUgc2V0IHVzaW5nIHRoZSBzZXRJQU5BVGFnKCkuIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZW50cnkncyBJQU5BIHRhZyBjYW4KLSAqIGJlIHJldHJpZXZlZCB3aXRoIGdldElBTkFUYWcoKS4gRW50cmllcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgY2FuIGJlIGFkZGVkCi0gKiBhbmQgcmVtb3ZlZC4KLSAqLwotcHVibGljIGNsYXNzIEVuY29kaW5nU2V0dGluZ3MgZXh0ZW5kcyBDb21wb3NpdGUgewotCi0JcHJpdmF0ZSBjbGFzcyBDb21ib0xpc3RlbmVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWludCBpID0gZW5jb2RpbmdDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJaWYgKChpID49IDApICYmIChpIDwgaWFuYVZlY3Rvci5zaXplKCkpKSB7Ci0JCQkJaWFuYVRleHQuc2V0VGV4dCgoU3RyaW5nKSAoaWFuYVZlY3Rvci5lbGVtZW50QXQoZW5jb2RpbmdDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEVOQ09ESU5HX0xBQkVMID0gWE1MVUlNZXNzYWdlcy5FbmNvZGluZ1NldHRpbmdzXzE7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSUFOQV9MQUJFTCA9IFhNTFVJTWVzc2FnZXMuRW5jb2RpbmdTZXR0aW5nc18wOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBjb21ib0xpc3RlbmVyID0gbmV3IENvbWJvTGlzdGVuZXIoKTsKLQlwcm90ZWN0ZWQgQ29tYm8gZW5jb2RpbmdDb21ibzsKLQlwcm90ZWN0ZWQgTGFiZWwgZW5jb2RpbmdMYWJlbCwgaWFuYUxhYmVsOwotCXByb3RlY3RlZCBUZXh0IGlhbmFUZXh0OwotCXByb3RlY3RlZCBWZWN0b3IgaWFuYVZlY3RvcjsKLQotCS8qKgotCSAqIE1ldGhvZCBFbmNvZGluZ1NldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgRW5jb2RpbmdTZXR0aW5ncyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQlpbml0KElBTkFfTEFCRUwsIEVOQ09ESU5HX0xBQkVMKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgRW5jb2RpbmdTZXR0aW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGVuY29kaW5nTGFiZWwgLQotCSAqICAgICAgICAgICAgdGV4dCBsYWJlbCB0byB1c2UgYmVzaWRlIHRoZSBsb2NhbGUgc2Vuc2l0aXZlIGRlc2NyaXB0aW9uIG9mCi0JICogICAgICAgICAgICB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVuY29kaW5nCi0JICovCi0JcHVibGljIEVuY29kaW5nU2V0dGluZ3MoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGVuY29kaW5nTGFiZWwpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWluaXQoSUFOQV9MQUJFTCwgZW5jb2RpbmdMYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIEVuY29kaW5nU2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBpYW5hTGFiZWwgPQotCSAqICAgICAgICAgICAgdGV4dCBsYWJlbCB0byB1c2UgYmVzaWRlIHRoZSBkaXNwbGF5IG9ubHkgSUFOQSBmaWVsZAotCSAqIEBwYXJhbSBlbmNvZGluZ0xhYmVsIC0KLQkgKiAgICAgICAgICAgIHRleHQgbGFiZWwgdG8gdXNlIGJlc2lkZSB0aGUgbG9jYWxlIHNlbnNpdGl2ZSBkZXNjcmlwdGlvbiBvZgotCSAqICAgICAgICAgICAgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbmNvZGluZwotCSAqLwotCXB1YmxpYyBFbmNvZGluZ1NldHRpbmdzKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBpYW5hTGFiZWwsIFN0cmluZyBlbmNvZGluZ0xhYmVsKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQlpbml0KGlhbmFMYWJlbCwgZW5jb2RpbmdMYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGFkZEVudHJ5LiBBZGQgYW4gZW50cnkgdG8gdGhlIGVuZCBvZiB0aGUgRW5jb2RpbmcgQ29tYm9ib3gKLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gLQotCSAqICAgICAgICAgICAgZW5jb2RpbmcgZGVzY3JpcHRpb24gdG8gZGlzcGxheQotCSAqIEBwYXJhbSBpYW5hVGFnIC0KLQkgKiAgICAgICAgICAgIElBTkEgdGFnIGZvciB0aGUgZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbnRyeShTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyBpYW5hVGFnKSB7Ci0JCWVuY29kaW5nQ29tYm8uYWRkKGRlc2NyaXB0aW9uKTsKLQkJaWFuYVZlY3Rvci5hZGQoaWFuYVRhZyk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGFkZEVudHJ5LiBBZGQgYW4gZW50cnkgdG8gdGhlIEVuY29kaW5nIENvbWJvYm94IGF0IGluZGV4IGluZGV4Ci0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIC0KLQkgKiAgICAgICAgICAgIGVuY29kaW5nIGRlc2NyaXB0aW9uIHRvIGRpc3BsYXkKLQkgKiBAcGFyYW0gaWFuYVRhZyAtCi0JICogICAgICAgICAgICBJQU5BIHRhZyBmb3IgdGhlIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGluZGV4IC0KLQkgKiAgICAgICAgICAgIGluZGV4IGludG8gdGhlIGNvbWJvIHRvIGFkZCB0bwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVudHJ5KFN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nIGlhbmFUYWcsIGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPT0gaWFuYVZlY3Rvci5zaXplKCkpIHsKLQkJCS8vIGp1c3QgYWRkIHRvIHRoZSBlbmQKLQkJCWFkZEVudHJ5KGRlc2NyaXB0aW9uLCBpYW5hVGFnKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICgoMCA8PSBpbmRleCkgJiYgKGluZGV4IDwgaWFuYVZlY3Rvci5zaXplKCkpKSB7Ci0JCQllbmNvZGluZ0NvbWJvLmFkZChkZXNjcmlwdGlvbiwgaW5kZXgpOwotCQkJaWFuYVZlY3Rvci5hZGQoaW5kZXgsIGlhbmFUYWcpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZUNvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gaXNSZWFkT25seSkgewotCQlpbnQgc3R5bGUgPSBpc1JlYWRPbmx5ID09IHRydWUgPyBTV1QuUkVBRF9PTkxZIDogU1dULkRST1BfRE9XTjsKLQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIHN0eWxlKTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIGZvciBjcmVhdGluZyBsYWJlbHMuCi0JICovCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGgpIHsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJdGV4dC5zZXRCYWNrZ3JvdW5kKHRleHQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCkpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQllbmNvZGluZ0NvbWJvLnJlbW92ZU1vZGlmeUxpc3RlbmVyKGNvbWJvTGlzdGVuZXIpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbGxDb21ibygpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZ1tdIGlhbmFUYWdzID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldENvbW1vbkNoYXJzZXROYW1lcygpOwotCQkJaW50IHRvdGFsTnVtID0gaWFuYVRhZ3MubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbE51bTsgaSsrKSB7Ci0JCQkJU3RyaW5nIGlhbmEgPSBpYW5hVGFnc1tpXTsKLQkJCQlTdHJpbmcgZW5jID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldERpc3BsYXlTdHJpbmcoaWFuYSk7Ci0KLQkJCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCQkJZW5jb2RpbmdDb21iby5hZGQoZW5jKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJDb21tb25DaGFyc2V0TmFtZXMuZ2V0RGlzcGxheVN0cmluZygiICsgaWFuYSArICIpIHJldHVybmVkIG51bGwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWVuY29kaW5nQ29tYm8uYWRkKGlhbmEpOwotCQkJCX0KLQkJCQlpYW5hVmVjdG9yLmFkZChpYW5hKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkvLyBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCAiUmVzb3VyY2UgZXhjZXB0aW9uIiwKLQkJCS8vICJVbmFibGUgdG8gb2J0YWluIGVuY29kaW5nIHN0cmluZ3MuIENoZWNrIHJlc291cmNlIGZpbGUiKTsKLQkJCS8vIFhNTEVuY29kaW5nUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKGUudG9TdHJpbmcoKSk7Ci0JCQkvLyBYTUxFbmNvZGluZ1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZUN1cnJlbnRUaHJlYWQoKTsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiRXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIDxjb2RlPmdldEVuY29kaW5nPC9jb2RlPiBHZXQgdGhlIGRlc2NyaXB0aXZlIGVuY29kaW5nIG5hbWUgdGhhdCB3YXMKLQkgKiBzZWxlY3RlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBlbmNvZGluZ0NvbWJvLmdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0RW5jb2RpbmdDb21iby4gUmV0dXJucyB0aGUgY29tYm8gdXNlZCB0byBkaXNwbGF5IHRoZSBlbmNvZGluZwotCSAqIGRlc2NyaXB0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIENvbWJvCi0JICovCi0JcHVibGljIENvbWJvIGdldEVuY29kaW5nQ29tYm8oKSB7Ci0JCXJldHVybiBlbmNvZGluZ0NvbWJvOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmdldElBTkFUYWc8L2NvZGU+IEdldCB0aGUgSUFOQSB0YWcgZXF1aXZhbGVudCBvZiB0aGUgc2VsZWN0ZWQKLQkgKiBkZXNjcmlwdGl2ZSBlbmNvZGluZyBuYW1lCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElBTkFUYWcoKSB7Ci0JCWludCBpID0gZW5jb2RpbmdDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaSA+PSAwKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgKGlhbmFWZWN0b3IuZWxlbWVudEF0KGkpKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KFN0cmluZyBpYW5hTGFiZWxTdHIsIFN0cmluZyBlbmNvZGluZ0xhYmVsU3RyKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQllbmNvZGluZ0xhYmVsID0gY3JlYXRlTGFiZWwodGhpcywgZW5jb2RpbmdMYWJlbFN0cik7Ci0JCWVuY29kaW5nQ29tYm8gPSBjcmVhdGVDb21ib0JveCh0aGlzLCB0cnVlKTsKLQkJaWFuYUxhYmVsID0gY3JlYXRlTGFiZWwodGhpcywgaWFuYUxhYmVsU3RyKTsKLQkJaWFuYVRleHQgPSBjcmVhdGVUZXh0RmllbGQodGhpcywgMjApOwotCQlpYW5hVmVjdG9yID0gbmV3IFZlY3RvcigpOwotCi0JCWZpbGxDb21ibygpOwotCQlyZXNldFRvRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWVuY29kaW5nQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoY29tYm9MaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+aXNFbmNvZGluZ0luTGlzdDwvY29kZT4gQ2hlY2tzIHdoZXRoZXIgdGhlIGVuY29kaW5nIG5hbWUgaXMgaW4KLQkgKiB0aGUgY29tYm8KLQkgKiAKLQkgKiBAcGFyYW0gZW5jCi0JICogICAgICAgICAgICBhIDxjb2RlPnN0cmluZzwvY29kZT4gdmFsdWUuIFRoZSBlbmNvZGluZyBuYW1lLgotCSAqIEByZXR1cm4gYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4gVFJVRSBpZiBlbmNvZGluZyBpcyBpbiBsaXN0LgotCSAqICAgICAgICAgRkFMU0UgaWYgZW5jb2RpbmcgaXMgbm90IGluIGxpc3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmNvZGluZ0luTGlzdChTdHJpbmcgZW5jKSB7Ci0JCWludCBpID0gZW5jb2RpbmdDb21iby5pbmRleE9mKGVuYyk7Ci0JCWlmIChpID49IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5pc0lBTkFUYWdJbkxpc3Q8L2NvZGU+IENoZWNrcyB3aGV0aGVyIHRoZSBJQU5BIHRhZyBpcyBpbiB0aGUKLQkgKiBjb21ibwotCSAqIAotCSAqIEBwYXJhbSBpYW5hVGFnCi0JICogICAgICAgICAgICBhIDxjb2RlPnN0cmluZzwvY29kZT4gdmFsdWUuIFRoZSBJQU5BIHRhZy4KLQkgKiBAcmV0dXJuIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuIFRSVUUgaWYgdGFnIGlzIGluIGxpc3QuIEZBTFNFCi0JICogICAgICAgICBpZiB0YWcgaXMgbm90IGluIGxpc3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJQU5BVGFnSW5MaXN0KFN0cmluZyBpYW5hVGFnKSB7Ci0JCWludCBpID0gaWFuYVZlY3Rvci5pbmRleE9mKGlhbmFUYWcpOwotCQlpZiAoaSA+PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHJlbW92ZUVudHJ5LiBSZW1vdmVzIGJvdGggdGhlIGRlc2NyaXB0aW9uIGFuZCB0aGUgSUFOQSB0YWcgYXQKLQkgKiB0aGUgc3BlY2lmaWVkIGluZGV4Ci0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRW50cnkoaW50IGluZGV4KSB7Ci0JCWlmICgoMCA8PSBpbmRleCkgJiYgKGluZGV4IDwgaWFuYVZlY3Rvci5zaXplKCkpKSB7Ci0JCQllbmNvZGluZ0NvbWJvLnJlbW92ZShpbmRleCk7Ci0JCQlpYW5hVmVjdG9yLnJlbW92ZShpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgcmVzZXRUb0RlZmF1bHRFbmNvZGluZy4gUmVzZXQgdGhlIGNvbnRyb2wgdG8gdGhlIGRlZmF1bHQKLQkgKiBlbmNvZGluZy4gQ3VycmVudGx5IFVURi04Ci0JICovCi0JcHVibGljIHZvaWQgcmVzZXRUb0RlZmF1bHRFbmNvZGluZygpIHsKLQkJU3RyaW5nIGRlZmF1bHRJQU5BVGFnID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlpYW5hVGV4dC5zZXRUZXh0KGRlZmF1bHRJQU5BVGFnKTsKLQkJc2V0SUFOQVRhZyhkZWZhdWx0SUFOQVRhZyk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHNldEVuYWJsZWQuIEVuYWJsZS9kaXNhYmxlIHRoZSBFbmNvZGluZ1NldHRpbmdzIGNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWVuY29kaW5nQ29tYm8uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZW5jb2RpbmdMYWJlbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlpYW5hTGFiZWwuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJaWFuYVRleHQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5zZXRFbmNvZGluZzwvY29kZT4gU2V0IHRoZSBzZWxlY3Rpb24gaW4gdGhlIGNvbWJvIHRvIHRoZQotCSAqIGRlc2NyaXB0aXZlIGVuY29kaW5nIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGVuYwotCSAqICAgICAgICAgICAgYSA8Y29kZT5zdHJpbmc8L2NvZGU+IHZhbHVlLiBOb3RlIHRoaXMgaXMgbm90IHRoZSBJQU5BCi0JICogICAgICAgICAgICB0YWcuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuYykgewotCQllbmNvZGluZ0NvbWJvLnNldFRleHQoZW5jKTsKLQkJZW5jb2RpbmdDb21iby5zZWxlY3QoZW5jb2RpbmdDb21iby5pbmRleE9mKGVuYykpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPnNldElBTkFUYWc8L2NvZGU+IFNldCB0aGUgSUFOQSB0YWcgZm9yIHRoZSBjb21ibwotCSAqIAotCSAqIEBwYXJhbSBpYW5hVGFnCi0JICogICAgICAgICAgICBhIDxjb2RlPnN0cmluZzwvY29kZT4gdmFsdWUuIFRoZSBJQU5BIHRhZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJQU5BVGFnKFN0cmluZyBpYW5hVGFnKSB7Ci0JCWludCBpID0gaWFuYVZlY3Rvci5pbmRleE9mKGlhbmFUYWcpOwotCQlpZiAoaSA+PSAwKSB7Ci0JCQllbmNvZGluZ0NvbWJvLnNlbGVjdChpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1dvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvV29ya2JlbmNoRGVmYXVsdEVuY29kaW5nU2V0dGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc5MzBlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvV29ya2JlbmNoRGVmYXVsdEVuY29kaW5nU2V0dGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkNoYXJzZXROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLS8qKgotICogV29ya2JlbmNoRGVmYXVsdEVuY29kaW5nU2V0dGluZ3MgaXMgYW4gZXh0ZW5zaW9uIG9mIEVuY29kaW5nU2V0dGluZ3MuIFRoaXMKLSAqIGNvbXBvc2l0ZSBjb250YWlucyBFbmNvZGluZ1NldHRpbmdzIGZvciB1c2VycyB0byBzZWxlY3QgdGhlIGVuY29kaW5nIHRoZXkKLSAqIGRlc2lyZSBhcyB3ZWxsIGFzIGEgY2hlY2tib3ggZm9yIHVzZXJzIHRvIHNlbGVjdCB0byB1c2UgdGhlIGRlZmF1bHQKLSAqIHdvcmtiZW5jaCBlbmNvZGluZyBpbnN0ZWFkLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRW5jb2RpbmdTZXR0aW5ncwotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoRGVmYXVsdEVuY29kaW5nU2V0dGluZ3MgZXh0ZW5kcyBDb21wb3NpdGUgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOREVOVCA9IDE1OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLQkVOQ0hfREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBFbmNvZGluZ1NldHRpbmdzIGZFbmNvZGluZ1NldHRpbmdzOwotCXByaXZhdGUgU3RyaW5nIGZOb25EZWZhdWx0SUFOQSA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gZlVzZURlZmF1bHRCdXR0b247Ci0KLQlwdWJsaWMgV29ya2JlbmNoRGVmYXVsdEVuY29kaW5nU2V0dGluZ3MoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJY3JlYXRlQ29udHJvbHMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udHJvbHMoKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlDb21wb3NpdGUgZGVmYXVsdEVuY29kaW5nQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRlZmF1bHRFbmNvZGluZ0NvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZGVmYXVsdEVuY29kaW5nQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZlVzZURlZmF1bHRCdXR0b24gPSBuZXcgQnV0dG9uKGRlZmF1bHRFbmNvZGluZ0NvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZlVzZURlZmF1bHRCdXR0b24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLldvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzXzApOwotCi0JCWZVc2VEZWZhdWx0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVVzZURlZmF1bHRCdXR0b25TZWxlY3RlZCgpOwotCQkJfQotCQl9KTsKLQotCQlmRW5jb2RpbmdTZXR0aW5ncyA9IG5ldyBFbmNvZGluZ1NldHRpbmdzKHRoaXMpOwotCQkoKEdyaWRMYXlvdXQpIGZFbmNvZGluZ1NldHRpbmdzLmdldExheW91dCgpKS5tYXJnaW5XaWR0aCA9IDA7Ci0JCSgoR3JpZERhdGEpIGZFbmNvZGluZ1NldHRpbmdzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEluZGVudCA9IElOREVOVDsKLQotCX0KLQotCXByaXZhdGUgQ29tYm8gZ2V0RW5jb2RpbmdDb21ibygpIHsKLQkJcmV0dXJuIGZFbmNvZGluZ1NldHRpbmdzLmdldEVuY29kaW5nQ29tYm8oKTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5nZXRJQU5BVGFnPC9jb2RlPiBHZXQgdGhlIElBTkEgdGFnIGVxdWl2YWxlbnQgb2YgdGhlIHNlbGVjdGVkCi0JICogZGVzY3JpcHRpdmUgZW5jb2RpbmcgbmFtZS4gUmV0dXJucyBlbXB0eSBzdHJpbmcgaWYgdXNpbmcgd29ya2JlbmNoCi0JICogZW5jb2RpbmcuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElBTkFUYWcoKSB7Ci0JCWlmICghaXNEZWZhdWx0KCkpIHsKLQkJCXJldHVybiBmRW5jb2RpbmdTZXR0aW5ncy5nZXRJQU5BVGFnKCk7Ci0JCX0KLQkJcmV0dXJuIFdPUktCRU5DSF9ERUZBVUxUOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFdvcmtiZW5jaEVuY29kaW5nKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCk7Ci0JfQotCi0Jdm9pZCBoYW5kbGVVc2VEZWZhdWx0QnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCWlmIChmVXNlRGVmYXVsdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJZk5vbkRlZmF1bHRJQU5BID0gZkVuY29kaW5nU2V0dGluZ3MuZ2V0SUFOQVRhZygpOwotCQkJU3RyaW5nIHdvcmtiZW5jaFZhbHVlID0gZ2V0V29ya2JlbmNoRW5jb2RpbmcoKTsKLQkJCXdvcmtiZW5jaFZhbHVlID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldElhbmFQcmVmZXJyZWRDaGFyc2V0TmFtZSh3b3JrYmVuY2hWYWx1ZSk7Ci0JCQlmRW5jb2RpbmdTZXR0aW5ncy5zZXRJQU5BVGFnKHdvcmtiZW5jaFZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChmTm9uRGVmYXVsdElBTkEgIT0gbnVsbCkgewotCQkJZkVuY29kaW5nU2V0dGluZ3Muc2V0SUFOQVRhZyhmTm9uRGVmYXVsdElBTkEpOwotCQl9Ci0JCWdldEVuY29kaW5nQ29tYm8oKS5zZXRFbmFibGVkKCFmVXNlRGVmYXVsdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCWZFbmNvZGluZ1NldHRpbmdzLnNldEVuYWJsZWQoIWZVc2VEZWZhdWx0QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gZlVzZURlZmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+c2V0RW5jb2Rpbmc8L2NvZGU+IFNldCB0aGUgc2VsZWN0aW9uIGluIHRoZSBjb21ibyB0byB0aGUKLQkgKiBkZXNjcmlwdGl2ZSBlbmNvZGluZyBuYW1lLiBTZWxlY3RzIHVzZSB3b3JrYmVuY2ggZW5jb2RpbmcgaWYgaWFuYVRhZyBpcwotCSAqIG51bGwgb3IgZW1wdHkgc3RyaW5nLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElBTkFUYWcoU3RyaW5nIGlhbmFUYWcpIHsKLQkJaWYgKChpYW5hVGFnID09IG51bGwpIHx8IGlhbmFUYWcuZXF1YWxzKFdPUktCRU5DSF9ERUZBVUxUKSkgewotCQkJZlVzZURlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJaGFuZGxlVXNlRGVmYXVsdEJ1dHRvblNlbGVjdGVkKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmVXNlRGVmYXVsdEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJaGFuZGxlVXNlRGVmYXVsdEJ1dHRvblNlbGVjdGVkKCk7Ci0JCQlpZiAoIWlzRGVmYXVsdCgpKSB7Ci0JCQkJZkVuY29kaW5nU2V0dGluZ3Muc2V0SUFOQVRhZyhpYW5hVGFnKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxDb2xvclBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxDb2xvclBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYyOWQ3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29sb3JQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBCZW5qYW1pbiBNdXNrYWxsYSwgYi5tdXNrYWxsYUBnbXgubmV0IC0gWzE1ODY2MF0gY2hhcmFjdGVyIGVudGl0aWVzIHNob3VsZCBoYXZlIHRoZWlyIG93biBzeW50YXggaGlnaGxpZ2h0aW5nIHByZWZlcmVuY2UgCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RDb2xvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5TdHlsZWRUZXh0Q29sb3JQaWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhNTENvbG9yUGFnZSBleHRlbmRzIEFic3RyYWN0Q29sb3JQYWdlIHsKLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhZ2VDb21wb25lbnQgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQkJKChHcmlkRGF0YSkgcGFnZUNvbXBvbmVudC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEw7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udGVudHMocGFnZUNvbXBvbmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLlhNTF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQkJcmV0dXJuIHBhZ2VDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHVwIGFsbCB0aGUgc3R5bGUgcHJlZmVyZW5jZSBrZXlzIGluIHRoZSBvdmVybGF5IHN0b3JlCi0JICovCi0JcHJvdGVjdGVkIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlBcnJheUxpc3Qgb3ZlcmxheUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCQlJdGVyYXRvciBpID0gc3R5bGVMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIChTdHJpbmcpIGkubmV4dCgpKSk7Ci0JCX0KLQotCQlPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBrZXlzID0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtvdmVybGF5S2V5cy5zaXplKCldOwotCQlvdmVybGF5S2V5cy50b0FycmF5KGtleXMpOwotCQlyZXR1cm4ga2V5czsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBYTUxVSU1lc3NhZ2VzLlNhbXBsZV9YTUxfZG9jOyAvLyA9ICI8P3htbAotCQkvLyB2ZXJzaW9uPVwiMS4wXCI/PlxuPD9jdXN0b21Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25cblx0WE1MCi0JCS8vIHByb2Nlc3NvcgotCQkvLyBzcGVjaWZpY1xuXHRjb250ZW50Ci0JCS8vID8+XG48IURPQ1RZUEUKLQkJLy8gY29sb3JzXG5cdFBVQkxJQwotCQkvLyBcIi8vSUJNL1hNTC9DT0xPUlMvXCIKLQkJLy8gXCJjb2xvcnMuZHRkXCI+XG48Y29sb3JzPlxuXHQ8IS0tCi0JCS8vIGJlZ2luIGNvbG9yIGRlZmluaXRpb25zCi0JCS8vIC0tPlxuXHQ8Y29sb3IKLQkJLy8gbmFtZT1cInBsYWludGV4dFwiCi0JCS8vIGZvcmVncm91bmQ9XCIjMDAwMDAwXCJcblx0XHRiYWNrZ3JvdW5kPVwiI0Q0RDBDOFwiLz5cblx0PGNvbG9yCi0JCS8vIG5hbWU9XCJib2xkXCIKLQkJLy8gZm9yZWdyb3VuZD1cIiMwMDAwMDBcIlxuXHRcdGJhY2tncm91bmQ9XCIjQjNBQ0EwXCI+XG5cdDwhW0NEQVRBWzwxMjM0NTY3ODk+XV0+XG5cdE5vcm1hbAotCQkvLyB0ZXh0IGNvbnRlbnQuXG5cdDxjb2xvcgotCQkvLyBuYW1lPVwiaW52ZXJzZVwiCi0JCS8vIGZvcmVncm91bmQ9XCIjRjBGMEYwXCJcblx0XHRiYWNrZ3JvdW5kPVwiI0Q0RDBDOFwiLz5cblxuPC9jb2xvcnM+XG4iOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb21tb25Db250ZXh0U3R5bGVNYXAoRGljdGlvbmFyeSBjb250ZXh0U3R5bGVNYXApIHsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VMRU1FTlRfREVDTF9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFLCBJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1BFX1JFRkVSRU5DRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29tbW9uRGVzY3JpcHRpb25zKERpY3Rpb25hcnkgZGVzY3JpcHRpb25zKSB7Ci0KLQkJLy8gY3JlYXRlIGRlc2NyaXB0aW9ucyBmb3IgaGlsaWdodGluZyB0eXBlcwotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5Db21tZW50X0RlbGltaXRlcnNfVUlfKTsgLy8gPQotCQkvLyAiQ29tbWVudAotCQkvLyBEZWxpbWl0ZXJzIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQsIFhNTFVJTWVzc2FnZXMuQ29tbWVudF9Db250ZW50X1VJXyk7IC8vID0KLQkJLy8gIkNvbW1lbnQKLQkJLy8gQ29udGVudCIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5UYWdfRGVsaW1pdGVyc19VSV8pOyAvLyA9Ci0JCS8vICJUYWcKLQkJLy8gRGVsaW1pdGVycyIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUsIFhNTFVJTWVzc2FnZXMuVGFnX05hbWVzX1VJXyk7IC8vID0KLQkJLy8gIlRhZwotCQkvLyBOYW1lcyIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLCBYTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9OYW1lc19VSV8pOyAvLyA9Ci0JCS8vICJBdHRyaWJ1dGUKLQkJLy8gTmFtZXMiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUsIFhNTFVJTWVzc2FnZXMuQXR0cmlidXRlX1ZhbHVlc19VSV8pOyAvLyA9Ci0JCS8vICJBdHRyaWJ1dGUKLQkJLy8gVmFsdWVzIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5EZWNsYXJhdGlvbl9EZWxpbWl0ZXJzX1VJXyk7IC8vID0KLQkJLy8gIkRlY2xhcmF0aW9uCi0JCS8vIERlbGltaXRlcnMiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5ULCBYTUxVSU1lc3NhZ2VzLkNvbnRlbnRfVUlfKTsgLy8gPQotCQkvLyAiQ29udGVudCIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRSwgWE1MVUlNZXNzYWdlcy5FbnRpdHlfUmVmZXJlbmNlX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiRW50aXR5IFJlZmVyZW5jZXMiCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbW1vblN0eWxlTGlzdChBcnJheUxpc3QgbGlzdCkgewotCi0JCS8vIGxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotCQkvLyBsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCS8vIGxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIpOwotCQkvLyBsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCk7Ci0KLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZXh0U3R5bGVNYXAoRGljdGlvbmFyeSBjb250ZXh0U3R5bGVNYXApIHsKLQotCQlpbml0Q29tbW9uQ29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0JCWluaXREb2NUeXBlQ29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCwgSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NPTlRFTlQsIElTdHlsZUNvbnN0YW50c1hNTC5QSV9DT05URU5UKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUik7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RGVzY3JpcHRpb25zKERpY3Rpb25hcnkgZGVzY3JpcHRpb25zKSB7Ci0KLQkJaW5pdENvbW1vbkRlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCQlpbml0RG9jVHlwZURlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIsIFhNTFVJTWVzc2FnZXMuQ0RBVEFfRGVsaW1pdGVyc19VSV8pOyAvLyA9Ci0JCS8vICJDREFUQQotCQkvLyBEZWxpbWl0ZXJzIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhULCBYTUxVSU1lc3NhZ2VzLkNEQVRBX0NvbnRlbnRfVUlfKTsgLy8gPQotCQkvLyAiQ0RBVEEKLQkJLy8gQ29udGVudCIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLlByb2Nlc3NpbmdfSW5zdHJ1Y3Rpb25fRGVsX1VJXyk7IC8vID0KLQkJLy8gIlByb2Nlc3NpbmcKLQkJLy8gSW5zdHJ1Y3Rpb24KLQkJLy8gRGVsaW1pdGVycyIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCwgWE1MVUlNZXNzYWdlcy5Qcm9jZXNzaW5nX0luc3RydWN0aW9uX0Nvbl9VSV9fVUlfKTsgLy8gPQotCQkvLyAiUHJvY2Vzc2luZwotCQkvLyBJbnN0cnVjdGlvbgotCQkvLyBDb250ZW50IgotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXREb2NUeXBlQ29udGV4dFN0eWxlTWFwKERpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwKSB7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQywgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYsIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERvY1R5cGVEZXNjcmlwdGlvbnMoRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMpIHsKLQotCQkvLyBjcmVhdGUgZGVzY3JpcHRpb25zIGZvciBoaWxpZ2h0aW5nIHR5cGVzIGZvciBET0NUWVBFIHJlbGF0ZWQgaXRlbXMKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FLCBYTUxVSU1lc3NhZ2VzLkRPQ1RZUEVfTmFtZV9VSV8pOyAvLyA9Ci0JCS8vICJET0NUWVBFCi0JCS8vIE5hbWUiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQsIFhNTFVJTWVzc2FnZXMuRE9DVFlQRV9TWVNURU1fUFVCTElDX0tleXdfVUlfKTsgLy8gPQotCQkvLyAiRE9DVFlQRQotCQkvLyBTWVNURU0vUFVCTElDCi0JCS8vIEtleXdvcmQiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLCBYTUxVSU1lc3NhZ2VzLkRPQ1RZUEVfUHVibGljX1JlZmVyZW5jZV9VSV8pOyAvLyA9Ci0JCS8vICJET0NUWVBFCi0JCS8vIFB1YmxpYwotCQkvLyBSZWZlcmVuY2UiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGLCBYTUxVSU1lc3NhZ2VzLkRPQ1RZUEVfU3lzdGVtX1JlZmVyZW5jZV9VSV8pOyAvLyA9Ci0JCS8vICJET0NUWVBFCi0JCS8vIFN5c3RlbQotCQkvLyBSZWZlcmVuY2UiCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERvY1R5cGVTdHlsZUxpc3QoQXJyYXlMaXN0IGxpc3QpIHsKLQotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRTdHlsZUxpc3QoQXJyYXlMaXN0IGxpc3QpIHsKLQkJaW5pdENvbW1vblN0eWxlTGlzdChsaXN0KTsKLQkJaW5pdERvY1R5cGVTdHlsZUxpc3QobGlzdCk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQkvLyByZXF1aXJlZCBzaW5jZSB0aGUgc3VwZXJjbGFzcyAqcmVtb3ZlcyogZXhpc3RpbmcgcHJlZmVyZW5jZXMgYmVmb3JlCi0JCS8vIHNhdmluZyBpdHMgb3duCi0JCXN1cGVyLnBlcmZvcm1PaygpOwotCi0JCVNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBQaWNrZXIoU3R5bGVkVGV4dENvbG9yUGlja2VyIHBpY2tlcikgewotCQlJTW9kZWxNYW5hZ2VyIG1tYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJcGlja2VyLnNldFBhcnNlcihtbWFuYWdlci5jcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTCkuZ2V0UGFyc2VyKCkpOwotCi0JCURpY3Rpb25hcnkgZGVzY3JpcHRpb25zID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0RGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0KLQkJRGljdGlvbmFyeSBjb250ZXh0U3R5bGVNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWluaXRDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQotCQlBcnJheUxpc3Qgc3R5bGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbml0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0KLQkJcGlja2VyLnNldENvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCQlwaWNrZXIuc2V0RGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0JCXBpY2tlci5zZXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RDb2xvclBhZ2Ujc2F2ZVByZWZlcmVuY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7Ci0JCVhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmE3Y2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi0vKioKLSAqIDxwPlRoZSByZWFkYWJsZSBhbmQgd3JpdGFibGUgY29tcGxldGlvbiBwcm9wb3NhbCBjYXRlZ29yaWVzIGNvbmZpZ3VyYXRpb24KLSAqIGZvciB0aGUgWE1MIGNvbnRlbnQgdHlwZTwvcD4KLSAqLwotcHVibGljIGNsYXNzIFhNTENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbiB7Ci0KLQkvKiogdGhlIElEIG9mIHRoZSBwcmVmZXJlbmNlIHBhZ2Ugd2hlcmUgdXNlcnMgY2FuIGNoYW5nZSB0aGUgcHJlZmVyZW5jZXMgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRVNfUEFHRV9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC5jb250ZW50YXNzaXN0IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIDxwPkNyZWF0ZXMgdGhlIGNvbmZpZ3VyYXRpb248L3A+Ci0JICovCi0JcHVibGljIFhNTENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uKCkgewotCQkvL25vdGhpbmcgdG8gZG8uCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLkFic3RyYWN0Q29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24jZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5JQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25Xcml0ZXIjaGFzQXNzb2NpYXRlZFByb3BlcnRpZXNQYWdlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBc3NvY2lhdGVkUHJvcGVydGllc1BhZ2UoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5JQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25Xcml0ZXIjZ2V0UHJvcGVydGllc1BhZ2VJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0aWVzUGFnZUlEKCkgewotCQlyZXR1cm4gUFJFRkVSRU5DRVNfUEFHRV9JRDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbiNnZXRTaG91bGROb3REaXNwbGF5T25EZWZhdWx0UGFnZVByZWZLZXkoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2hvdWxkTm90RGlzcGxheU9uRGVmYXVsdFBhZ2VQcmVmS2V5KCkgewotCQlyZXR1cm4gWE1MVUlQcmVmZXJlbmNlTmFtZXMuQ09OVEVOVF9BU1NJU1RfRE9fTk9UX0RJU1BMQVlfT05fREVGQVVMVF9QQUdFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5BYnN0cmFjdENvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uI2dldFNob3VsZE5vdERpc3BsYXlPbk93blBhZ2VQcmVmS2V5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNob3VsZE5vdERpc3BsYXlPbk93blBhZ2VQcmVmS2V5KCkgewotCQlyZXR1cm4gWE1MVUlQcmVmZXJlbmNlTmFtZXMuQ09OVEVOVF9BU1NJU1RfRE9fTk9UX0RJU1BMQVlfT05fT1dOX1BBR0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLkFic3RyYWN0Q29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb24jZ2V0UGFnZVNvcnRPcmRlclByZWZLZXkoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFnZVNvcnRPcmRlclByZWZLZXkoKSB7Ci0JCXJldHVybiBYTUxVSVByZWZlcmVuY2VOYW1lcy5DT05URU5UX0FTU0lTVF9PV05fUEFHRV9TT1JUX09SREVSOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RDb21wbGV0aW9uUHJvcG9zYWxDYXRlZ29yaWVzQ29uZmlndXJhdGlvbiNnZXREZWZhdWx0UGFnZVNvcnRPcmRlclByZWZLZXkoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFBhZ2VTb3J0T3JkZXJQcmVmS2V5KCkgewotCQlyZXR1cm4gWE1MVUlQcmVmZXJlbmNlTmFtZXMuQ09OVEVOVF9BU1NJU1RfREVGQVVMVF9QQUdFX1NPUlRfT1JERVI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvbnRlbnRBc3Npc3RQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvbnRlbnRBc3Npc3RQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTllYzI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxDb250ZW50QXNzaXN0UHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NvYWxDYXRpZ29yaWVzQ29uZmlndXJhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLkNvZGVBc3Npc3RDeWNsaW5nQ29uZmlndXJhdGlvbkJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi0vKioKLSAqIDxwPkRlZmluZXMgdGhlIHByZWZlcmVuY2UgcGFnZSBmb3IgYWxsb3dpbmcgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSBjb250ZW50Ci0gKiBhc3Npc3QgcHJlZmVyZW5jZXM8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb250ZW50QXNzaXN0UHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ09OVEVOVF9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gQXV0byBBY3RpdmF0aW9uCi0JcHJpdmF0ZSBCdXR0b24gZkF1dG9Qcm9wb3NlOwotCXByaXZhdGUgTGFiZWwgZkF1dG9Qcm9wb3NlTGFiZWw7Ci0JcHJpdmF0ZSBUZXh0IGZBdXRvUHJvcG9zZVRleHQ7Ci0JcHJpdmF0ZSBDb21ibyBmU3VnZ2VzdGlvblN0cmF0ZWd5Q29tYm87Ci0JcHJpdmF0ZSBWZWN0b3IgZlN1Z2dlc3Rpb25TdHJhdGVnaWVzID0gbnVsbDsKLQkKLQkvKiogY29uZmlndXJhdGlvbiBibG9jayBmb3IgY2hhbmdpbmcgcHJlZmVyZW5jZSBoYXZpbmcgdG8gZG8gd2l0aCB0aGUgY29udGVudCBhc3Npc3QgY2F0ZWdvcmllcyAqLwotCXByaXZhdGUgQ29kZUFzc2lzdEN5Y2xpbmdDb25maWd1cmF0aW9uQmxvY2sgZkNvbmZpZ3VyYXRpb25CbG9jazsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCQotCQljcmVhdGVDb250ZW50c0ZvckF1dG9BY3RpdmF0aW9uR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlQ29udGVudHNGb3JDeWNsaW5nR3JvdXAoY29tcG9zaXRlKTsKLQkJCi0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJcGVyZm9ybURlZmF1bHRzRm9yQXV0b0FjdGl2YXRpb25Hcm91cCgpOwotCQlwZXJmb3JtRGVmYXVsdHNGb3JDeWNsaW5nR3JvdXAoKTsKLQotCQl2YWxpZGF0ZVZhbHVlcygpOwotCQllbmFibGVWYWx1ZXMoKTsKLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2UjaW5pdGlhbGl6ZVZhbHVlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckF1dG9BY3RpdmF0aW9uR3JvdXAoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckN5Y2xpbmdHcm91cCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSNzdG9yZVZhbHVlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCXN0b3JlVmFsdWVzRm9yQXV0b0FjdGl2YXRpb25Hcm91cCgpOwotCQlzdG9yZVZhbHVlc0ZvckN5Y2xpbmdHcm91cCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSNlbmFibGVWYWx1ZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVZhbHVlcygpIHsKLQkJaWYgKGZBdXRvUHJvcG9zZSAhPSBudWxsKSB7Ci0JCQlpZiAoZkF1dG9Qcm9wb3NlLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZkF1dG9Qcm9wb3NlTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlmQXV0b1Byb3Bvc2VUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmQXV0b1Byb3Bvc2VMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlmQXV0b1Byb3Bvc2VUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Q3JlYXRlIGNvbnRlbnRzIGZvciB0aGUgYXV0byBhY3RpdmF0aW9uIHByZWZlcmVuY2UgZ3JvdXA8L3A+Ci0JICogQHBhcmFtIHBhcmVudCB7QGxpbmsgQ29tcG9zaXRlfSBwYXJlbnQgb2YgdGhlIGdyb3VwCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yQXV0b0FjdGl2YXRpb25Hcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGNvbnRlbnRBc3Npc3RHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCWNvbnRlbnRBc3Npc3RHcm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuWE1MQ29udGVudEFzc2lzdFByZWZlcmVuY2VQYWdlX0F1dG9fQWN0aXZhdGlvbl9VSV8pOwotCi0JCWZBdXRvUHJvcG9zZSA9IGNyZWF0ZUNoZWNrQm94KGNvbnRlbnRBc3Npc3RHcm91cCwgWE1MVUlNZXNzYWdlcy5BdXRvbWF0aWNhbGx5X21ha2Vfc3VnZ2VzdF9VSV8pOwotCQkoKEdyaWREYXRhKSBmQXV0b1Byb3Bvc2UuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZBdXRvUHJvcG9zZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlmQXV0b1Byb3Bvc2VMYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbnRlbnRBc3Npc3RHcm91cCwgWE1MVUlNZXNzYWdlcy5Qcm9tcHRfd2hlbl90aGVzZV9jaGFyYWN0ZV9VSV8pOwotCQlmQXV0b1Byb3Bvc2VUZXh0ID0gY3JlYXRlVGV4dEZpZWxkKGNvbnRlbnRBc3Npc3RHcm91cCk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGVudEFzc2lzdEdyb3VwLCBYTUxVSU1lc3NhZ2VzLlN1Z2dlc3Rpb25fU3RyYXRlZ3kpOwotCQlmU3VnZ2VzdGlvblN0cmF0ZWd5Q29tYm8gPSBuZXcgQ29tYm8oY29udGVudEFzc2lzdEdyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJZlN1Z2dlc3Rpb25TdHJhdGVnaWVzID0gbmV3IFZlY3RvcigpOwotCQlmU3VnZ2VzdGlvblN0cmF0ZWd5Q29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWZTdWdnZXN0aW9uU3RyYXRlZ3lDb21iby5hZGQoWE1MVUlNZXNzYWdlcy5TdWdnZXN0aW9uX1N0cmF0ZWd5X0xheCk7Ci0JCWZTdWdnZXN0aW9uU3RyYXRlZ2llcy5hZGQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuU1VHR0VTVElPTl9TVFJBVEVHWV9WQUxVRV9MQVgpOwotCQlmU3VnZ2VzdGlvblN0cmF0ZWd5Q29tYm8uYWRkKFhNTFVJTWVzc2FnZXMuU3VnZ2VzdGlvbl9TdHJhdGVneV9TdHJpY3QpOwotCQlmU3VnZ2VzdGlvblN0cmF0ZWdpZXMuYWRkKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1lfVkFMVUVfU1RSSUNUKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Q3JlYXRlIHRoZSBjb250ZW50cyBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IGN5Y2xpbmcgcHJlZmVyZW5jZSBncm91cDwvcD4KLQkgKiBAcGFyYW0gcGFyZW50IHtAbGluayBDb21wb3NpdGV9IHBhcmVudCBvZiB0aGUgZ3JvdXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHNGb3JDeWNsaW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlJQ29tcGxldGlvblByb3Bvc2FsQ2F0ZWdvcmllc0NvbmZpZ3VyYXRpb25Xcml0ZXIgY29uZmlndXJhdGlvbldyaXRlciA9IENvbXBsZXRpb25Qcm9wb3NvYWxDYXRpZ29yaWVzQ29uZmlndXJhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRXcml0YWJsZUNvbmZpZ3VyYXRpb24oWE1MX0NPTlRFTlRfVFlQRV9JRCk7Ci0JCQotCQlpZihjb25maWd1cmF0aW9uV3JpdGVyICE9IG51bGwpIHsKLQkJCWZDb25maWd1cmF0aW9uQmxvY2sgPSBuZXcgQ29kZUFzc2lzdEN5Y2xpbmdDb25maWd1cmF0aW9uQmxvY2soWE1MX0NPTlRFTlRfVFlQRV9JRCwgY29uZmlndXJhdGlvbldyaXRlcik7Ci0JCQlmQ29uZmlndXJhdGlvbkJsb2NrLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCwgWE1MVUlNZXNzYWdlcy5YTUxDb250ZW50QXNzaXN0UHJlZmVyZW5jZVBhZ2VfQ3ljbGluZ19VSV8pOwotCQl9IGVsc2UgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJUaGVyZSBzaG91bGQgYmUgYW4gSUNvbXBsZXRpb25Qcm9wb3NhbENhdGVnb3JpZXNDb25maWd1cmF0aW9uV3JpdGVyIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJIiBzcGVjaWZpZWQgZm9yIHRoZSBYTUwgY29udGVudCB0eXBlLCBidXQgY2FuJ3QgZmluZSBpdCwgdGh1cyBjYW4ndCBjcmVhdGUgdXNlciIgKyAvLyROT04tTkxTLTEkCi0JCQkJCSIgcHJlZmVyZW5jZSBibG9jayBmb3IgZWRpdGluZyBwcm9wb3NhbCBjYXRlZ29yaWVzIHByZWZlcmVuY2VzLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+U3RvcmUgdGhlIHZhbHVlcyBmb3IgdGhlIGF1dG8gYWN0aXZhdGlvbiBncm91cDwvcD4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXNGb3JBdXRvQWN0aXZhdGlvbkdyb3VwKCkgewotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UsIGZBdXRvUHJvcG9zZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFLCBmQXV0b1Byb3Bvc2VUZXh0LmdldFRleHQoKSk7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1ksIGdldEN1cnJlbnRBdXRvQWN0aXZhdGlvblN1Z2dlc3Rpb25TdHJhdGVneSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+U3RvcmUgdGhlIHZhbHVlcyBmb3IgdGhlIGN5Y2xpbmcgZ3JvdXA8L3A+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzRm9yQ3ljbGluZ0dyb3VwKCkgewotCQlpZiAoZkNvbmZpZ3VyYXRpb25CbG9jayAhPSBudWxsKSB7Ci0JCQlmQ29uZmlndXJhdGlvbkJsb2NrLnN0b3JlVmFsdWVzKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+SW5pdGlhbGl6ZSB0aGUgdmFsdWVzIGZvciB0aGUgYXV0byBhY3RpdmF0aW9uIGdyb3VwPC9wPgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yQXV0b0FjdGl2YXRpb25Hcm91cCgpIHsKLQkJZkF1dG9Qcm9wb3NlLnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKFhNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRSkpOwotCQlmQXV0b1Byb3Bvc2VUZXh0LnNldFRleHQoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFhNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFKSk7Ci0JCVN0cmluZyBzdWdnZXN0aW9uU3RyYXRlZ3kgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuU1VHR0VTVElPTl9TVFJBVEVHWSk7Ci0JCWlmIChzdWdnZXN0aW9uU3RyYXRlZ3kubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzZXRDdXJyZW50QXV0b0FjdGl2YXRpb25TdWdnZXN0aW9uU3RyYXRlZ3koc3VnZ2VzdGlvblN0cmF0ZWd5KTsKLQkJfQotCQllbHNlIHsKLQkJCXNldEN1cnJlbnRBdXRvQWN0aXZhdGlvblN1Z2dlc3Rpb25TdHJhdGVneShYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZX1ZBTFVFX0xBWCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+SW5pdGlhbGl6ZSB0aGUgdmFsdWVzIGZvciB0aGUgY3ljbGluZyBncm91cDwvcD4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckN5Y2xpbmdHcm91cCgpIHsKLQkJaWYoZkNvbmZpZ3VyYXRpb25CbG9jayAhPSBudWxsKSB7Ci0JCQlmQ29uZmlndXJhdGlvbkJsb2NrLmluaXRpYWxpemVWYWx1ZXMoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8cD5Mb2FkIHRoZSBkZWZhdWx0cyBmb3IgdGhlIGF1dG8gYWN0aXZhdGlvbiBncm91cDwvcD4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURlZmF1bHRzRm9yQXV0b0FjdGl2YXRpb25Hcm91cCgpIHsKLQkJZkF1dG9Qcm9wb3NlLnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0Qm9vbGVhbihYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UpKTsKLQkJZkF1dG9Qcm9wb3NlVGV4dC5zZXRUZXh0KGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREUpKTsKLQkJU3RyaW5nIHN1Z2dlc3Rpb25TdHJhdGVneSA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuU1VHR0VTVElPTl9TVFJBVEVHWSk7Ci0JCWlmIChzdWdnZXN0aW9uU3RyYXRlZ3kubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzZXRDdXJyZW50QXV0b0FjdGl2YXRpb25TdWdnZXN0aW9uU3RyYXRlZ3koc3VnZ2VzdGlvblN0cmF0ZWd5KTsKLQkJfQotCQllbHNlIHsKLQkJCXNldEN1cnJlbnRBdXRvQWN0aXZhdGlvblN1Z2dlc3Rpb25TdHJhdGVneShYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZX1ZBTFVFX0xBWCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+TG9hZCB0aGUgZGVmYXVsdHMgb2YgdGhlIGN5Y2xpbmcgZ3JvdXA8L3A+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckN5Y2xpbmdHcm91cCgpIHsKLQkJaWYoZkNvbmZpZ3VyYXRpb25CbG9jayAhPSBudWxsKSB7Ci0JCQlmQ29uZmlndXJhdGlvbkJsb2NrLnBlcmZvcm1EZWZhdWx0cygpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgcHJlZmVyZW5jZQotCSAqIAotCSAqIEByZXR1cm4gYSBzdWdnZXN0aW9uIHN0cmF0ZWd5IGNvbnN0YW50IGZyb20gWE1MVUlQcmVmZXJlbmNlTmFtZXMKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDdXJyZW50QXV0b0FjdGl2YXRpb25TdWdnZXN0aW9uU3RyYXRlZ3koKSB7Ci0JCWludCBpID0gZlN1Z2dlc3Rpb25TdHJhdGVneUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpID49IDApIHsKLQkJCXJldHVybiAoU3RyaW5nKSAoZlN1Z2dlc3Rpb25TdHJhdGVnaWVzLmVsZW1lbnRBdChpKSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIFNldCBhIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaW4gc3VnZ2VzdGlvbiBzdHJhdGVneSBjb21ibyBib3gKLQkgKiAKLQkgKiBAcGFyYW0gc3RyYXRlZ3kKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0Q3VycmVudEF1dG9BY3RpdmF0aW9uU3VnZ2VzdGlvblN0cmF0ZWd5KFN0cmluZyBzdHJhdGVneSkgewotCQkvLyBDbGVhciB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0JCWZTdWdnZXN0aW9uU3RyYXRlZ3lDb21iby5jbGVhclNlbGVjdGlvbigpOwotCQlmU3VnZ2VzdGlvblN0cmF0ZWd5Q29tYm8uZGVzZWxlY3RBbGwoKTsKLQotCQlpbnQgaSA9IGZTdWdnZXN0aW9uU3RyYXRlZ2llcy5pbmRleE9mKHN0cmF0ZWd5KTsKLQkJaWYgKGkgPj0gMCkgewotCQkJZlN1Z2dlc3Rpb25TdHJhdGVneUNvbWJvLnNlbGVjdChpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MRmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTE5ZmNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLQotcHVibGljIGNsYXNzIFhNTEZpbGVzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VQYWdlIHsKLQlwcm90ZWN0ZWQgRW5jb2RpbmdTZXR0aW5ncyBmRW5jb2RpbmdTZXR0aW5ncyA9IG51bGw7Ci0KLQlwcml2YXRlIENvbWJvIGZEZWZhdWx0U3VmZml4OwotCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zOwotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIElIZWxwQ29udGV4dElkcy5YTUxfUFJFRldFQlhfRklMRVNfSEVMUElEKTsKLQkJY3JlYXRlQ29udGVudHNGb3JDcmVhdGluZ0dyb3VwKGNvbXBvc2l0ZSk7Ci0KLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yQ3JlYXRpbmdHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGNyZWF0aW5nR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDIpOwotCQljcmVhdGluZ0dyb3VwLnNldFRleHQoWE1MVUlNZXNzYWdlcy5DcmVhdGluZ19maWxlcyk7Ci0KLQkJLy8gRGVmYXVsdCBleHRlbnNpb24gZm9yIE5ldyBmaWxlIFdpemFyZAotCQljcmVhdGVMYWJlbChjcmVhdGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLlhNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uTGFiZWwpOwotCQlmRGVmYXVsdFN1ZmZpeCA9IGNyZWF0ZURyb3BEb3duQm94KGNyZWF0aW5nR3JvdXApOwotCQlTdHJpbmdbXSB2YWxpZEV4dGVuc2lvbnMgPSAoU3RyaW5nW10pIGdldFZhbGlkRXh0ZW5zaW9ucygpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCUFycmF5cy5zb3J0KHZhbGlkRXh0ZW5zaW9ucyk7Ci0JCWZEZWZhdWx0U3VmZml4LnNldEl0ZW1zKHZhbGlkRXh0ZW5zaW9ucyk7Ci0JCWZEZWZhdWx0U3VmZml4LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCUxhYmVsIGxhYmVsID0gY3JlYXRlTGFiZWwoY3JlYXRpbmdHcm91cCwgWE1MVUlNZXNzYWdlcy5FbmNvZGluZ19kZXNjKTsKLQkJKChHcmlkRGF0YSkgbGFiZWwuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZFbmNvZGluZ1NldHRpbmdzID0gbmV3IEVuY29kaW5nU2V0dGluZ3MoY3JlYXRpbmdHcm91cCwgWE1MVUlNZXNzYWdlcy5FbmNvZGluZyk7Ci0JCSgoR3JpZERhdGEpIGZFbmNvZGluZ1NldHRpbmdzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZEZWZhdWx0U3VmZml4LnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCkgewotCQlYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29udGVudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldyBmaWxlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gSUNvbnRlbnRUeXBlCi0JICovCi0JcHJvdGVjdGVkIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwpOwotCX0KLQotCS8qKgotCSAqIEdldCBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VmFsaWRFeHRlbnNpb25zKCkgewotCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQl9Ci0JCXJldHVybiBmVmFsaWRFeHRlbnNpb25zOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlI2dldE1vZGVsUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlpbml0aWFsaXplVmFsdWVzRm9yQ3JlYXRpbmdHcm91cCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXNGb3JDcmVhdGluZ0dyb3VwKCkgewotCQlTdHJpbmcgc3VmZml4ID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQkJZkRlZmF1bHRTdWZmaXguc2V0VGV4dChzdWZmaXgpOwotCi0JCVN0cmluZyBlbmNvZGluZyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCi0JCWZFbmNvZGluZ1NldHRpbmdzLnNldElBTkFUYWcoZW5jb2RpbmcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJcGVyZm9ybURlZmF1bHRzRm9yQ3JlYXRpbmdHcm91cCgpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckNyZWF0aW5nR3JvdXAoKSB7Ci0JCVN0cmluZyBzdWZmaXggPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQkJZkRlZmF1bHRTdWZmaXguc2V0VGV4dChzdWZmaXgpOwotCi0JCVN0cmluZyBlbmNvZGluZyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQotCQlmRW5jb2RpbmdTZXR0aW5ncy5zZXRJQU5BVGFnKGVuY29kaW5nKTsKLQkJLy8gZkVuY29kaW5nU2V0dGluZ3MucmVzZXRUb0RlZmF1bHRFbmNvZGluZygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQotCQlkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlzdG9yZVZhbHVlc0ZvckNyZWF0aW5nR3JvdXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlc0ZvckNyZWF0aW5nR3JvdXAoKSB7Ci0JCVN0cmluZyBzdWZmaXggPSBmRGVmYXVsdFN1ZmZpeC5nZXRUZXh0KCk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCBzdWZmaXgpOwotCi0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCwgZkVuY29kaW5nU2V0dGluZ3MuZ2V0SUFOQVRhZygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVZhbHVlcygpIHsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRWYWxpZEV4dGVuc2lvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkgJiYgIWlzVmFsaWQpIHsKLQkJCVN0cmluZyBleHRlbnNpb24gPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCWlzVmFsaWQgPSBleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZShmRGVmYXVsdFN1ZmZpeC5nZXRUZXh0KCkpOwotCQl9Ci0KLQkJaWYgKCFpc1ZhbGlkKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5YTUxGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkVycm9yLCBnZXRWYWxpZEV4dGVuc2lvbnMoKS50b1N0cmluZygpKSk7Ci0JCQlzZXRWYWxpZChmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlzZXRWYWxpZCh0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NDU2ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5HcmlkRGF0YUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlTGlua0FyZWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLQotcHVibGljIGNsYXNzIFhNTFNvdXJjZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyLCBTZWxlY3Rpb25MaXN0ZW5lciwgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlwcml2YXRlIGZpbmFsIGludCBNSU5fSU5ERU5UQVRJT05fU0laRSA9IDA7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX0lOREVOVEFUSU9OX1NJWkUgPSAxNjsKLQotCS8vIEZvcm1hdHRpbmcKLQlwcm90ZWN0ZWQgTGFiZWwgZkxpbmVXaWR0aExhYmVsOwotCXByb3RlY3RlZCBUZXh0IGZMaW5lV2lkdGhUZXh0OwotCXByb3RlY3RlZCBCdXR0b24gZlNwbGl0TXVsdGlBdHRyczsKLQlwcml2YXRlIEJ1dHRvbiBmSW5kZW50VXNpbmdUYWJzOwotCXByaXZhdGUgQnV0dG9uIGZJbmRlbnRVc2luZ1NwYWNlczsKLQlwcml2YXRlIFNwaW5uZXIgZkluZGVudGF0aW9uU2l6ZTsKLQlwcml2YXRlIEJ1dHRvbiBmUHJlc2VydmVQQ0RBVEFDb250ZW50OwotCXByaXZhdGUgQnV0dG9uIGZBbGlnbkVuZEJyYWNrZXQ7Ci0JcHJpdmF0ZSBCdXR0b24gZkZvcm1hdENvbW1lbnRzOwotCXByaXZhdGUgQnV0dG9uIGZGb3JtYXRDb21tZW50c0pvaW5MaW5lczsKLQkvLyBCVUcxOTUyNjQgLSBTdXBwb3J0IGZvciByZW1vdmluZy9hZGRpbmcgYSBzcGFjZSBiZWZvcmUgZW1wdHkgY2xvc2UgdGFncwotCXByaXZhdGUgQnV0dG9uIGZTcGFjZUJlZm9yZUVtcHR5Q2xvc2VUYWc7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2xlYXJBbGxCbGFua0xpbmVzOwotCi0JLy8gZ3JhbW1hciBjb25zdHJhaW50cwotCXByb3RlY3RlZCBCdXR0b24gZlVzZUluZmVycmVkR3JhbW1hcjsKLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHN1cGVyLmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLlhNTF9QUkVGV0VCWF9TT1VSQ0VfSEVMUElEKTsKLQotCQluZXcgUHJlZmVyZW5jZUxpbmtBcmVhKGNvbXBvc2l0ZSwgU1dULldSQVAgfCBTV1QuTVVMVEksICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmVkaXRvciIsIFhNTFVJTWVzc2FnZXMuX1VJX1NUUlVDVFVSRURfVEVYVF9FRElUT1JfUFJFRlNfTElOSywvLyROT04tTkxTLTEkCi0JCQkJCShJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcikgZ2V0Q29udGFpbmVyKCksIG51bGwpLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5oaW50KDE1MCwgU1dULkRFRkFVTFQpLmNyZWF0ZSgpKTsKLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LnN3dERlZmF1bHRzKCkuY3JlYXRlKCkpOwotCi0JCWNyZWF0ZUNvbnRlbnRzRm9yRm9ybWF0dGluZ0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUNvbnRlbnRzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoY29tcG9zaXRlKTsKLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yRm9ybWF0dGluZ0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZm9ybWF0dGluZ0dyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQkJZm9ybWF0dGluZ0dyb3VwLnNldFRleHQoWE1MVUlNZXNzYWdlcy5Gb3JtYXR0aW5nX1VJXyk7Ci0KLQkJZkxpbmVXaWR0aExhYmVsID0gY3JlYXRlTGFiZWwoZm9ybWF0dGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLkxpbmVfd2lkdGhfX1VJXyk7Ci0JCWZMaW5lV2lkdGhUZXh0ID0gbmV3IFRleHQoZm9ybWF0dGluZ0dyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJZ0RhdGEud2lkdGhIaW50ID0gMjU7Ci0JCWZMaW5lV2lkdGhUZXh0LnNldExheW91dERhdGEoZ0RhdGEpOwotCQlmTGluZVdpZHRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQotCQlmU3BsaXRNdWx0aUF0dHJzID0gY3JlYXRlQ2hlY2tCb3goZm9ybWF0dGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLlNwbGl0X211bHRpcGxlX2F0dHJpYnV0ZXMpOwotCQkoKEdyaWREYXRhKSBmU3BsaXRNdWx0aUF0dHJzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmQWxpZ25FbmRCcmFja2V0ID0gY3JlYXRlQ2hlY2tCb3goZm9ybWF0dGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLkFsaWduX2ZpbmFsX2JyYWNrZXQpOwotCQkoKEdyaWREYXRhKSBmQWxpZ25FbmRCcmFja2V0LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmUHJlc2VydmVQQ0RBVEFDb250ZW50ID0gY3JlYXRlQ2hlY2tCb3goZm9ybWF0dGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLlByZXNlcnZlX1BDREFUQV9Db250ZW50KTsKLQkJKChHcmlkRGF0YSkgZlByZXNlcnZlUENEQVRBQ29udGVudC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkNsZWFyQWxsQmxhbmtMaW5lcyA9IGNyZWF0ZUNoZWNrQm94KGZvcm1hdHRpbmdHcm91cCwgWE1MVUlNZXNzYWdlcy5DbGVhcl9hbGxfYmxhbmtfbGluZXNfVUlfKTsKLQkJKChHcmlkRGF0YSkgZkNsZWFyQWxsQmxhbmtMaW5lcy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJLy8gZm9ybWF0dGluZyBjb21tZW50cwotCQlmRm9ybWF0Q29tbWVudHMgPSBjcmVhdGVDaGVja0JveChmb3JtYXR0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuRm9ybWF0X2NvbW1lbnRzKTsKLQkJKChHcmlkRGF0YSkgZkZvcm1hdENvbW1lbnRzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmRm9ybWF0Q29tbWVudHMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZGb3JtYXRDb21tZW50c0pvaW5MaW5lcyA9IGNyZWF0ZUNoZWNrQm94KGZvcm1hdHRpbmdHcm91cCwgWE1MVUlNZXNzYWdlcy5Gb3JtYXRfY29tbWVudHNfam9pbl9saW5lcyk7Ci0JCSgoR3JpZERhdGEpIGZGb3JtYXRDb21tZW50c0pvaW5MaW5lcy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJKChHcmlkRGF0YSkgZkZvcm1hdENvbW1lbnRzSm9pbkxpbmVzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQkvLyBlbmQgZm9ybWF0dGluZyBjb21tZW50cwotCQlmU3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnID0gY3JlYXRlQ2hlY2tCb3goZm9ybWF0dGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLlNwYWNlX2JlZm9yZV9lbXB0eV9jbG9zZV90YWcpOwotCQkoKEdyaWREYXRhKSBmU3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0JCS8vIFsyNjkyMjRdIC0gUGxhY2UgdGhlIGluZGVudCBjb250cm9scyBpbiB0aGVpciBvd24gY29tcG9zaXRlIGZvciBwcm9wZXIgdGFiIG9yZGVyaW5nCi0JCUNvbXBvc2l0ZSBpbmRlbnRDb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUoZm9ybWF0dGluZ0dyb3VwLCAxKTsKLQkJKChHcmlkRGF0YSkgaW5kZW50Q29tcG9zaXRlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkoKEdyaWRMYXlvdXQpIGluZGVudENvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubWFyZ2luV2lkdGggPSAwOwotCQkoKEdyaWRMYXlvdXQpIGluZGVudENvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubWFyZ2luSGVpZ2h0ID0gMDsKLQotCQlmSW5kZW50VXNpbmdUYWJzID0gY3JlYXRlUmFkaW9CdXR0b24oaW5kZW50Q29tcG9zaXRlLCBYTUxVSU1lc3NhZ2VzLkluZGVudF91c2luZ190YWJzKTsKLQkJKChHcmlkRGF0YSkgZkluZGVudFVzaW5nVGFicy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMTsKLQotCQlmSW5kZW50VXNpbmdTcGFjZXMgPSBjcmVhdGVSYWRpb0J1dHRvbihpbmRlbnRDb21wb3NpdGUsIFhNTFVJTWVzc2FnZXMuSW5kZW50X3VzaW5nX3NwYWNlcyk7Ci0JCSgoR3JpZERhdGEpIGZJbmRlbnRVc2luZ1NwYWNlcy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMTsKLQotCQljcmVhdGVMYWJlbChmb3JtYXR0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuSW5kZW50YXRpb25fc2l6ZSk7Ci0JCWZJbmRlbnRhdGlvblNpemUgPSBuZXcgU3Bpbm5lcihmb3JtYXR0aW5nR3JvdXAsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlmSW5kZW50YXRpb25TaXplLnNldExheW91dERhdGEoZ2QpOwotCQlmSW5kZW50YXRpb25TaXplLnNldFRvb2xUaXBUZXh0KFhNTFVJTWVzc2FnZXMuSW5kZW50YXRpb25fc2l6ZV90aXApOwotCQlmSW5kZW50YXRpb25TaXplLnNldE1pbmltdW0oTUlOX0lOREVOVEFUSU9OX1NJWkUpOwotCQlmSW5kZW50YXRpb25TaXplLnNldE1heGltdW0oTUFYX0lOREVOVEFUSU9OX1NJWkUpOwotCQlmSW5kZW50YXRpb25TaXplLnNldEluY3JlbWVudCgxKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRQYWdlSW5jcmVtZW50KDQpOwotCQlmSW5kZW50YXRpb25TaXplLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncmFtbWFyQ29uc3RyYWludHNHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMSk7Ci0JCWdyYW1tYXJDb25zdHJhaW50c0dyb3VwLnNldFRleHQoWE1MVUlNZXNzYWdlcy5HcmFtbWFyX0NvbnN0cmFpbnRzKTsKLQkJZ3JhbW1hckNvbnN0cmFpbnRzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0KLQkJZlVzZUluZmVycmVkR3JhbW1hciA9IGNyZWF0ZUNoZWNrQm94KGdyYW1tYXJDb25zdHJhaW50c0dyb3VwLCBYTUxVSU1lc3NhZ2VzLlVzZV9pbmZlcnJlZF9ncmFtbWFyX2luX2Fic2VuY2Vfb2YpOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOyAvLyBlZGl0b3IKLQkJWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7IC8vIG1vZGVsCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlVmFsdWVzKCkgewotCQlpZiAoZkZvcm1hdENvbW1lbnRzICE9IG51bGwgJiYgZkZvcm1hdENvbW1lbnRzSm9pbkxpbmVzICE9IG51bGwpIHsKLQkJCWZGb3JtYXRDb21tZW50c0pvaW5MaW5lcy5zZXRFbmFibGVkKGZGb3JtYXRDb21tZW50cy5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckZvcm1hdHRpbmdHcm91cCgpOwotCQlpbml0aWFsaXplVmFsdWVzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yRm9ybWF0dGluZ0dyb3VwKCkgewotCQkvLyBGb3JtYXR0aW5nCi0JCWZMaW5lV2lkdGhUZXh0LnNldFRleHQoZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKTsKLQkJZlNwbGl0TXVsdGlBdHRycy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQlmQWxpZ25FbmRCcmFja2V0LnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFMSUdOX0VORF9CUkFDS0VUKSk7Ci0JCWZDbGVhckFsbEJsYW5rTGluZXMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTKSk7Ci0JCWZQcmVzZXJ2ZVBDREFUQUNvbnRlbnQuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUFJFU0VSVkVfQ0RBVEFDT05URU5UKSk7Ci0JCWZTcGFjZUJlZm9yZUVtcHR5Q2xvc2VUYWcuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0VfQkVGT1JFX0VNUFRZX0NMT1NFX1RBRykpOwotCQlmRm9ybWF0Q29tbWVudHMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX0NPTU1FTlRfVEVYVCkpOwotCQlmRm9ybWF0Q29tbWVudHNKb2luTGluZXMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX0NPTU1FTlRfSk9JTl9MSU5FUykpOwotCi0JCWlmIChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpKSkgewotCQkJZkluZGVudFVzaW5nVGFicy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmSW5kZW50VXNpbmdTcGFjZXMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZJbmRlbnRVc2luZ1NwYWNlcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmSW5kZW50VXNpbmdUYWJzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQotCQlmSW5kZW50YXRpb25TaXplLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXNGb3JHcmFtbWFyQ29uc3RyYWludHNHcm91cCgpIHsKLQkJZlVzZUluZmVycmVkR3JhbW1hci5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihYTUxVSVByZWZlcmVuY2VOYW1lcy5VU0VfSU5GRVJSRURfR1JBTU1BUikpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJcGVyZm9ybURlZmF1bHRzRm9yRm9ybWF0dGluZ0dyb3VwKCk7Ci0JCXBlcmZvcm1EZWZhdWx0c0ZvckdyYW1tYXJDb25zdHJhaW50c0dyb3VwKCk7Ci0KLQkJdmFsaWRhdGVWYWx1ZXMoKTsKLQkJZW5hYmxlVmFsdWVzKCk7Ci0KLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzRm9yRm9ybWF0dGluZ0dyb3VwKCkgewotCQkvLyBGb3JtYXR0aW5nCi0JCWZMaW5lV2lkdGhUZXh0LnNldFRleHQoZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCWZTcGxpdE11bHRpQXR0cnMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCWZBbGlnbkVuZEJyYWNrZXQuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFMSUdOX0VORF9CUkFDS0VUKSk7Ci0JCWZDbGVhckFsbEJsYW5rTGluZXMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCQlmUHJlc2VydmVQQ0RBVEFDb250ZW50LnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5QUkVTRVJWRV9DREFUQUNPTlRFTlQpKTsKLQkJLy8gQlVHMTk1MjY0IC0gU3VwcG9ydCBmb3IgcmVtb3ZpbmcvYWRkaW5nIGEgc3BhY2UgYmVmb3JlIGVtcHR5IGNsb3NlIHRhZ3MKLQkJZlNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0VfQkVGT1JFX0VNUFRZX0NMT1NFX1RBRykpOwotCQlmRm9ybWF0Q29tbWVudHMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9DT01NRU5UX1RFWFQpKTsKLQkJZkZvcm1hdENvbW1lbnRzSm9pbkxpbmVzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfQ09NTUVOVF9KT0lOX0xJTkVTKSk7Ci0KLQkJaWYgKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpKSkgewotCQkJZkluZGVudFVzaW5nVGFicy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmSW5kZW50VXNpbmdTcGFjZXMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZJbmRlbnRVc2luZ1NwYWNlcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmSW5kZW50VXNpbmdUYWJzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoKSB7Ci0JCWZVc2VJbmZlcnJlZEdyYW1tYXIuc2V0U2VsZWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRCb29sZWFuKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlVTRV9JTkZFUlJFRF9HUkFNTUFSKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLnBlcmZvcm1PaygpOwotCi0JCWRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCXN0b3JlVmFsdWVzRm9yRm9ybWF0dGluZ0dyb3VwKCk7Ci0JCXN0b3JlVmFsdWVzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlc0ZvckZvcm1hdHRpbmdHcm91cCgpIHsKLQkJLy8gRm9ybWF0dGluZwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRILCBmTGluZVdpZHRoVGV4dC5nZXRUZXh0KCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUywgZlNwbGl0TXVsdGlBdHRycy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFMSUdOX0VORF9CUkFDS0VULCBmQWxpZ25FbmRCcmFja2V0LmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTLCBmQ2xlYXJBbGxCbGFua0xpbmVzLmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUFJFU0VSVkVfQ0RBVEFDT05URU5ULCBmUHJlc2VydmVQQ0RBVEFDb250ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJLy8gQlVHMTk1MjY0IC0gU3VwcG9ydCBmb3IgcmVtb3ZpbmcvYWRkaW5nIGEgc3BhY2UgYmVmb3JlIGVtcHR5IGNsb3NlIHRhZ3MKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0VfQkVGT1JFX0VNUFRZX0NMT1NFX1RBRywgZlNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9DT01NRU5UX1RFWFQsIGZGb3JtYXRDb21tZW50cy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9DT01NRU5UX0pPSU5fTElORVMsIGZGb3JtYXRDb21tZW50c0pvaW5MaW5lcy5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJaWYgKGZJbmRlbnRVc2luZ1RhYnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCKTsKLQkJfQotCQllbHNlIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UpOwotCQl9Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUsIGZJbmRlbnRhdGlvblNpemUuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoKSB7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlVTRV9JTkZFUlJFRF9HUkFNTUFSLCBmVXNlSW5mZXJyZWRHcmFtbWFyLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVZhbHVlcygpIHsKLQkJYm9vbGVhbiBpc0Vycm9yID0gZmFsc2U7Ci0JCVN0cmluZyB3aWR0aFRleHQgPSBudWxsOwotCi0JCWlmIChmTGluZVdpZHRoVGV4dCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXdpZHRoVGV4dCA9IGZMaW5lV2lkdGhUZXh0LmdldFRleHQoKTsKLQkJCQlpbnQgZm9ybWF0dGluZ0xpbmVXaWR0aCA9IEludGVnZXIucGFyc2VJbnQod2lkdGhUZXh0KTsKLQkJCQlpZiAoKGZvcm1hdHRpbmdMaW5lV2lkdGggPCBXSURUSF9WQUxJREFUSU9OX0xPV0VSX0xJTUlUKSB8fCAoZm9ybWF0dGluZ0xpbmVXaWR0aCA+IFdJRFRIX1ZBTElEQVRJT05fVVBQRVJfTElNSVQpKSB7Ci0JCQkJCXRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZXhjKSB7Ci0JCQkJc2V0SW52YWxpZElucHV0TWVzc2FnZSh3aWR0aFRleHQpOwotCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCQlpc0Vycm9yID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWludCBpbmRlbnRTaXplID0gMDsKLQkJaWYgKGZJbmRlbnRhdGlvblNpemUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpbmRlbnRTaXplID0gZkluZGVudGF0aW9uU2l6ZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoKGluZGVudFNpemUgPCBNSU5fSU5ERU5UQVRJT05fU0laRSkgfHwgKGluZGVudFNpemUgPiBNQVhfSU5ERU5UQVRJT05fU0laRSkpIHsKLQkJCQkJdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZleGMpIHsKLQkJCQlzZXRJbnZhbGlkSW5wdXRNZXNzYWdlKEludGVnZXIudG9TdHJpbmcoaW5kZW50U2l6ZSkpOwotCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCQlpc0Vycm9yID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWlmICghaXNFcnJvcikgewotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJc2V0VmFsaWQodHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MU3ludGF4Q29sb3JpbmdQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MU3ludGF4Q29sb3JpbmdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NWYwYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFN5bnRheENvbG9yaW5nUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkNvbG9yU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotLyoqCi0gKiBBIHByZWZlcmVuY2UgcGFnZSB0byBjb25maWd1cmUgb3VyIFhNTCBzeW50YXggY29sb3IuIEl0IHJlc2VtYmxlcyB0aGUgSkRUCi0gKiBhbmQgQ0RUIHBhZ2VzIGZhciBtb3JlIHRoYW4gb3VyIG9yaWdpbmFsIGNvbG9yIHBhZ2Ugd2hpbGUgcmV0YWluaW5nIHRoZQotICogZXh0cmEgImNsaWNrLXRvLWZpbmQiIGZ1bmN0aW9uYWxpdHkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxTeW50YXhDb2xvcmluZ1BhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmQm9sZDsKLQlwcml2YXRlIExhYmVsIGZGb3JlZ3JvdW5kTGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCBmQmFja2dyb3VuZExhYmVsOwotCXByaXZhdGUgQnV0dG9uIGZDbGVhclN0eWxlOwotCXByaXZhdGUgTWFwIGZDb250ZXh0VG9TdHlsZU1hcDsKLQlwcml2YXRlIENvbG9yIGZEZWZhdWx0Rm9yZWdyb3VuZCA9IG51bGw7Ci0JcHJpdmF0ZSBDb2xvciBmRGVmYXVsdEJhY2tncm91bmQgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBCdXR0b24gZkl0YWxpYzsKLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZk92ZXJsYXlTdG9yZTsKLQlwcml2YXRlIEJ1dHRvbiBmU3RyaWtlOwotCXByaXZhdGUgQ29sbGVjdGlvbiBmU3R5bGVQcmVmZXJlbmNlS2V5czsKLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgZlN0eWxlc1ZpZXdlciA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZlN0eWxlVG9EZXNjcmlwdGlvbk1hcDsKLQlwcml2YXRlIFN0eWxlZFRleHQgZlRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gZlVuZGVybGluZTsKLQotCS8vIGFjdGl2YXRlIGNvbnRyb2xzIGJhc2VkIG9uIHRoZSBnaXZlbiBsb2NhbCBjb2xvciB0eXBlCi0JcHJpdmF0ZSB2b2lkIGFjdGl2YXRlKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCUNvbG9yIGZvcmVncm91bmQgPSBmRGVmYXVsdEZvcmVncm91bmQ7Ci0JCUNvbG9yIGJhY2tncm91bmQgPSBmRGVmYXVsdEJhY2tncm91bmQ7Ci0JCWlmIChuYW1lZFN0eWxlID09IG51bGwpIHsKLQkJCWZDbGVhclN0eWxlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZlN0cmlrZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZVbmRlcmxpbmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZJdGFsaWMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZTdHJpa2Uuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZVbmRlcmxpbmUuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCVRleHRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlRm9yKG5hbWVkU3R5bGUpOwotCQkJZkNsZWFyU3R5bGUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCb2xkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmU3RyaWtlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQm9sZC5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOwotCQkJZkl0YWxpYy5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7Ci0JCQlmU3RyaWtlLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0gpICE9IDApOwotCQkJZlVuZGVybGluZS5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkUpICE9IDApOwotCQkJaWYgKGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWZvcmVncm91bmQgPSBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJfQotCQkJaWYgKGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWJhY2tncm91bmQgPSBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpOwotCQkJfQotCQl9Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRDb2xvclZhbHVlKGZvcmVncm91bmQuZ2V0UkdCKCkpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldENvbG9yVmFsdWUoYmFja2dyb3VuZC5nZXRSR0IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29sb3IgdGhlIHRleHQgaW4gdGhlIHNhbXBsZSBhcmVhIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwcmVmZXJlbmNlcwotCSAqLwotCXZvaWQgYXBwbHlTdHlsZXMoKSB7Ci0JCWlmIChmVGV4dCA9PSBudWxsIHx8IGZUZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJLy8gbG9va3VwIHRoZSBsb2NhbCBjb2xvcmluZyB0eXBlIGFuZCBhcHBseSBpdAotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZkNvbnRleHRUb1N0eWxlTWFwLmdldChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSk7Ci0JCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVGb3IobmFtZWRTdHlsZSk7Ci0JCQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY3VycmVudFJlZ2lvbiksIGN1cnJlbnRSZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0U3R5bGUoKSk7Ci0JCQkJc3R5bGUuc3RyaWtlb3V0ID0gKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwOwotCQkJCXN0eWxlLnVuZGVybGluZSA9IChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwOwotCQkJCWZUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCQkJfQotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQl9Ci0KLQlCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tcG9zaXRlIGNvbnRyb2wgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCWZEZWZhdWx0Rm9yZWdyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCk7Ci0JCWZEZWZhdWx0QmFja2dyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLlhNTF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhwYWdlQ29tcG9uZW50LCBTV1QuV1JBUCk7Ci0JCWxpbmsuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nX0xpbmspOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24ocGFyZW50LmdldFNoZWxsKCksIGUudGV4dCwgbnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyaWREYXRhIGxpbmtEYXRhPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGlua0RhdGEud2lkdGhIaW50PSAxNTA7IC8vIG9ubHkgZXhwYW5kIGZ1cnRoZXIgaWYgYW55b25lIGVsc2UgcmVxdWlyZXMgaXQKLQkJbGluay5zZXRMYXlvdXREYXRhKGxpbmtEYXRhKTsKLQotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCVNhc2hGb3JtIGVkaXRvciA9IG5ldyBTYXNoRm9ybShwYWdlQ29tcG9uZW50LCBTV1QuVkVSVElDQUwpOwotCQlHcmlkRGF0YSBncmlkRGF0YTIgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEyLmhvcml6b250YWxTcGFuID0gMjsKLQkJZWRpdG9yLnNldExheW91dERhdGEoZ3JpZERhdGEyKTsKLQkJU2FzaEZvcm0gdG9wID0gbmV3IFNhc2hGb3JtKGVkaXRvciwgU1dULkhPUklaT05UQUwpOwotCQlDb21wb3NpdGUgc3R5bGVFZGl0b3IgPSBjcmVhdGVDb21wb3NpdGUodG9wLCAxKTsKLQkJKChHcmlkTGF5b3V0KSBzdHlsZUVkaXRvci5nZXRMYXlvdXQoKSkubWFyZ2luUmlnaHQgPSA1OwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gMDsKLQkJY3JlYXRlTGFiZWwoc3R5bGVFZGl0b3IsIFhNTFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzApOwotCQlmU3R5bGVzVmlld2VyID0gY3JlYXRlU3R5bGVzVmlld2VyKHN0eWxlRWRpdG9yKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBNYXRoLm1heChncmlkRGF0YS53aWR0aEhpbnQsIGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhpdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKS5sZW5ndGgoKSkpOwotCQl9Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQlmU3R5bGVzVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlDb21wb3NpdGUgZWRpdGluZ0NvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b3AsIDEpOwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gNTsKLQkJY3JlYXRlTGFiZWwoZWRpdGluZ0NvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1dHRvbiBlbmFibGVyID0gY3JlYXRlQ2hlY2tib3goZWRpdGluZ0NvbXBvc2l0ZSwgWE1MVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMik7Ci0JCWVuYWJsZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVuYWJsZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQlDb21wb3NpdGUgZWRpdENvbnRyb2xzID0gY3JlYXRlQ29tcG9zaXRlKGVkaXRpbmdDb21wb3NpdGUsIDIpOwotCQkoKEdyaWRMYXlvdXQpIGVkaXRDb250cm9scy5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDIwOwotCi0JCWZGb3JlZ3JvdW5kTGFiZWwgPSBjcmVhdGVMYWJlbChlZGl0Q29udHJvbHMsIFNTRVVJTWVzc2FnZXMuRm9yZWdyb3VuZF9VSV8pOwotCQkoKEdyaWREYXRhKSBmRm9yZWdyb3VuZExhYmVsLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JTZWxlY3RvcihlZGl0Q29udHJvbHMpOwotCQlCdXR0b24gZkZvcmVncm91bmRDb2xvciA9IGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlmRm9yZWdyb3VuZENvbG9yLnNldExheW91dERhdGEoZ2QpOwotCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCYWNrZ3JvdW5kTGFiZWwgPSBjcmVhdGVMYWJlbChlZGl0Q29udHJvbHMsIFNTRVVJTWVzc2FnZXMuQmFja2dyb3VuZF9VSV8pOwotCQkoKEdyaWREYXRhKSBmQmFja2dyb3VuZExhYmVsLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JTZWxlY3RvcihlZGl0Q29udHJvbHMpOwotCQlCdXR0b24gZkJhY2tncm91bmRDb2xvciA9IGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlmQmFja2dyb3VuZENvbG9yLnNldExheW91dERhdGEoZ2QpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCb2xkID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBYTUxVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV8zKTsKLQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZCb2xkLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmSXRhbGljID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBYTUxVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV80KTsKLQkJZkl0YWxpYy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJKChHcmlkRGF0YSkgZkl0YWxpYy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlN0cmlrZSA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgWE1MVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfNSk7Ci0JCWZTdHJpa2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZTdHJpa2UuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZVbmRlcmxpbmUgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIFhNTFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzYpOwotCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmVW5kZXJsaW5lLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmQ2xlYXJTdHlsZSA9IG5ldyBCdXR0b24oZWRpdGluZ0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlmQ2xlYXJTdHlsZS5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuUmVzdG9yZV9EZWZhdWx0X1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiUmVzdG9yZSBEZWZhdWx0IgotCQlmQ2xlYXJTdHlsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HKSk7Ci0JCSgoR3JpZERhdGEpIGZDbGVhclN0eWxlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlDb21wb3NpdGUgc2FtcGxlQXJlYSA9IGNyZWF0ZUNvbXBvc2l0ZShlZGl0b3IsIDEpOwotCi0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDU7Ci0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luVG9wID0gNTsKLQkJY3JlYXRlTGFiZWwoc2FtcGxlQXJlYSwgU1NFVUlNZXNzYWdlcy5TYW1wbGVfdGV4dF9fVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICImU2FtcGxlIHRleHQ6IgotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFNvdXJjZVZpZXdlcihzYW1wbGVBcmVhLCBudWxsLCBTV1QuQk9SREVSIHwgU1dULkxFRlRfVE9fUklHSFQgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZlRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlHcmlkRGF0YSBncmlkRGF0YTMgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEzLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyMCk7Ci0JCWdyaWREYXRhMy5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJZ3JpZERhdGEzLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YTMpOwotCQlmVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWZUZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlmVGV4dC5hZGRLZXlMaXN0ZW5lcihnZXRUZXh0S2V5TGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkTW91c2VMaXN0ZW5lcihnZXRUZXh0TW91c2VMaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkVHJhdmVyc2VMaXN0ZW5lcihnZXRUcmF2ZXJzZUxpc3RlbmVyKCkpOwotCQlzZXRBY2Nlc3NpYmxlKGZUZXh0LCBTU0VVSU1lc3NhZ2VzLlNhbXBsZV90ZXh0X19VSV8pOwotCQlmRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKTsKLQkJZkRvY3VtZW50LnNldChnZXRFeGFtcGxlVGV4dCgpKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGZEb2N1bWVudCk7Ci0KLQkJdG9wLnNldFdlaWdodHMobmV3IGludFtdezEsIDF9KTsKLQkJZWRpdG9yLnNldFdlaWdodHMobmV3IGludFtdezEsIDF9KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYWdlQ29tcG9uZW50LCBJSGVscENvbnRleHRJZHMuWE1MX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCi0JCWZTdHlsZXNWaWV3ZXIuc2V0SW5wdXQoZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpKTsKLQotCQlhcHBseVN0eWxlcygpOwotCi0JCWZTdHlsZXNWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIWV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgewotCQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJCQlpZiAobmFtZWRTdHlsZSA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1swXTsKLQkJCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0Q29sb3JWYWx1ZSgpKTsKLQotCQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQkJc3R5bGVQcmVmc1swXSA9IG5ld1ZhbHVlOwotCQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1sxXTsKLQkJCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0Q29sb3JWYWx1ZSgpKTsKLQotCQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQkJc3R5bGVQcmVmc1sxXSA9IG5ld1ZhbHVlOwotCQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJvbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1syXTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZkJvbGQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbMl0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkl0YWxpYy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzNdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmSXRhbGljLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzNdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZTdHJpa2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1s0XTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZlN0cmlrZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1s0XSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmVW5kZXJsaW5lLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbNV07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZVbmRlcmxpbmUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbNV0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkNsZWFyU3R5bGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm47Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKS50b1N0cmluZygpOwotCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFRvRGVmYXVsdChuYW1lZFN0eWxlKTsKLQkJCQlhcHBseVN0eWxlcygpOwotCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gcGFnZUNvbXBvbmVudDsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGFiZWwuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8vIHByb3RlY3RlZCBMYWJlbCBjcmVhdGVEZXNjcmlwdGlvbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYWxsIHRoZSBzdHlsZSBwcmVmZXJlbmNlIGtleXMgaW4gdGhlIG92ZXJsYXkgc3RvcmUKLQkgKi8KLQlwcml2YXRlIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUl0ZXJhdG9yIGkgPSBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgKFN0cmluZykgaS5uZXh0KCkpKTsKLQkJfQotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIExpc3Qgdmlld2VyIHdoZXJlIHdlIHNlZSB0aGUgdmFyaW91cyBzeW50YXggZWxlbWVudCBkaXNwbGF5Ci0JICogbmFtZXMtLXdvdWxkIGl0IGV2ZXIgYmUgYSBUcmVlIGxpa2UgSkRUJ3M/Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgY3JlYXRlU3R5bGVzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RydWN0dXJlZFZpZXdlciBzdHlsZXNWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVzVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKSkpOwotCQlzdHlsZXNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCU9iamVjdCBkZXNjcmlwdGlvbiA9IGZTdHlsZVRvRGVzY3JpcHRpb25NYXAuZ2V0KGVsZW1lbnQpOwotCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJCQlyZXR1cm4gZGVzY3JpcHRpb24udG9TdHJpbmcoKTsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXN0eWxlc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKS50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHN0eWxlc1ZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQlmT3ZlcmxheVN0b3JlLnN0b3AoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihTdHJpbmcgbmFtZWRTdHlsZSkgewotCQlUZXh0QXR0cmlidXRlIHRhID0gbmV3IFRleHRBdHRyaWJ1dGUoZkRlZmF1bHRGb3JlZ3JvdW5kLCBmRGVmYXVsdEJhY2tncm91bmQsIFNXVC5OT1JNQUwpOwotCi0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwgJiYgZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQkvLyBub3RlOiAibmFtZWRTdHlsZSIgKmlzKiB0aGUgcHJlZmVyZW5jZSBrZXkKLQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCi0JCQkJaW50IGZvbnRNb2RpZmllciA9IFNXVC5OT1JNQUw7Ci0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAyKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAzKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1szXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDQpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzRdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiA1KSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1s1XSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXRhID0gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgZm9udE1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGE7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RXhhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBYTUxVSU1lc3NhZ2VzLlNhbXBsZV9YTUxfZG9jOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5hbWVkU3R5bGVBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCS8vIGVuc3VyZSB0aGUgb2Zmc2V0IGlzIGNsZWFuCi0JCWlmIChvZmZzZXQgPj0gZkRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJcmV0dXJuIGdldE5hbWVkU3R5bGVBdE9mZnNldChmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJZWxzZSBpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybiBnZXROYW1lZFN0eWxlQXRPZmZzZXQoMCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBmRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJd2hpbGUgKGRvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgIWRvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCWRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQl9Ci0JCWlmIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBmaW5kIHRoZSBJVGV4dFJlZ2lvbidzIENvbnRleHQgYXQgdGhpcyBvZmZzZXQKLQkJCUlUZXh0UmVnaW9uIGludGVyZXN0ID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChpbnRlcmVzdCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKG9mZnNldCA+IGRvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQoaW50ZXJlc3QpKQotCQkJCXJldHVybiBudWxsOwotCQkJU3RyaW5nIHJlZ2lvbkNvbnRleHQgPSBpbnRlcmVzdC5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uQ29udGV4dCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJLy8gZmluZCB0aGUgbmFtZWQgc3R5bGUgKGludGVybmFsL3NlbGVjdGFibGUgbmFtZSkgZm9yIHRoYXQKLQkJCS8vIGNvbnRleHQKLQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZkNvbnRleHRUb1N0eWxlTWFwLmdldChyZWdpb25Db250ZXh0KTsKLQkJCWlmIChuYW1lZFN0eWxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmFtZWRTdHlsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZ2V0T3ZlcmxheVN0b3JlKCkgewotCQlyZXR1cm4gZk92ZXJsYXlTdG9yZTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpIHsKLQkJaWYgKGZTdHlsZVByZWZlcmVuY2VLZXlzID09IG51bGwpIHsKLQkJCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9FUVVBTFMpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRSk7Ci0JCQlmU3R5bGVQcmVmZXJlbmNlS2V5cyA9IHN0eWxlczsKLQkJfQotCQlyZXR1cm4gZlN0eWxlUHJlZmVyZW5jZUtleXM7Ci0JfQotCi0JcHJpdmF0ZSBLZXlMaXN0ZW5lciBnZXRUZXh0S2V5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb3VzZUxpc3RlbmVyIGdldFRleHRNb3VzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZ2V0VGV4dFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmF2ZXJzZUxpc3RlbmVyIGdldFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXIja2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWlmICgoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUKSB8fCAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykpCi0JCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCXNldERlc2NyaXB0aW9uKFNTRVVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdfRGVzY3JpcHRpb24pOwotCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCWluaXRTdHlsZVRvRGVzY3JpcHRpb25NYXAoKTsKLQkJaW5pdFJlZ2lvbkNvbnRleHRUb1N0eWxlTWFwKCk7Ci0KLQkJZk92ZXJsYXlTdG9yZSA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlKGdldFByZWZlcmVuY2VTdG9yZSgpLCBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkpOwotCQlmT3ZlcmxheVN0b3JlLmxvYWQoKTsKLQkJZk92ZXJsYXlTdG9yZS5zdGFydCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UmVnaW9uQ29udGV4dFRvU3R5bGVNYXAoKSB7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUywgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfRVFVQUxTKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VMRU1FTlRfREVDTEFSQVRJT04sIElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhULCBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQywgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYsIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRik7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UsIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9QRV9SRUZFUkVOQ0UsIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFN0eWxlVG9EZXNjcmlwdGlvbk1hcCgpIHsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5DREFUQV9EZWxpbWl0ZXJzX1VJXyk7Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhULCBYTUxVSU1lc3NhZ2VzLkNEQVRBX0NvbnRlbnRfVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5Qcm9jZXNzaW5nX0luc3RydWN0aW9uX0RlbF9VSV8pOwotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCwgWE1MVUlNZXNzYWdlcy5Qcm9jZXNzaW5nX0luc3RydWN0aW9uX0Nvbl9VSV9fVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLkNvbW1lbnRfRGVsaW1pdGVyc19VSV8pOwotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhULCBYTUxVSU1lc3NhZ2VzLkNvbW1lbnRfQ29udGVudF9VSV8pOwotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5UYWdfRGVsaW1pdGVyc19VSV8pOwotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUsIFhNTFVJTWVzc2FnZXMuVGFnX05hbWVzX1VJXyk7Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUsIFhNTFVJTWVzc2FnZXMuQXR0cmlidXRlX05hbWVzX1VJXyk7Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUywgWE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfRXF1YWxzX1VJXyk7Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCBYTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9WYWx1ZXNfVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLkRlY2xhcmF0aW9uX0RlbGltaXRlcnNfVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5ULCBYTUxVSU1lc3NhZ2VzLkNvbnRlbnRfVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX05hbWVfVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQsIFhNTFVJTWVzc2FnZXMuRE9DVFlQRV9TWVNURU1fUFVCTElDX0tleXdfVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLCBYTUxVSU1lc3NhZ2VzLkRPQ1RZUEVfUHVibGljX1JlZmVyZW5jZV9VSV8pOwotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYsIFhNTFVJTWVzc2FnZXMuRE9DVFlQRV9TeXN0ZW1fUmVmZXJlbmNlX1VJXyk7Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFLCBYTUxVSU1lc3NhZ2VzLkVudGl0eV9SZWZlcmVuY2VfVUlfKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlnZXRPdmVybGF5U3RvcmUoKS5sb2FkRGVmYXVsdHMoKTsKLQkJYXBwbHlTdHlsZXMoKTsKLQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCWFjdGl2YXRlKG51bGwpOwotCQlmVGV4dC5yZWRyYXcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWdldE92ZXJsYXlTdG9yZSgpLnByb3BhZ2F0ZSgpOwotCi0JCVhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0Q29sb3JBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyBuYW1lZFN0eWxlID0gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KG9mZnNldCk7Ci0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwpIHsKLQkJCWZTdHlsZXNWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5hbWVkU3R5bGUpKTsKLQkJCWZTdHlsZXNWaWV3ZXIucmV2ZWFsKG5hbWVkU3R5bGUpOwotCQl9Ci0JCWVsc2UgewotCQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCX0KLQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lmaWNhbGx5IHNldCB0aGUgcmVwb3J0aW5nIG5hbWUgb2YgYSBjb250cm9sIGZvciBhY2Nlc3NpYmlsaXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFjY2Vzc2libGUoQ29udHJvbCBjb250cm9sLCBTdHJpbmcgbmFtZSkgewotCQlpZiAoY29udHJvbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmaW5hbCBTdHJpbmcgbiA9IG5hbWU7Ci0JCWNvbnRyb2wuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKQotCQkJCQllLnJlc3VsdCA9IG47Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDZkZWE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotCi0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBYTUwgdGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSB7Ci0KLQljbGFzcyBYTUxFZGl0VGVtcGxhdGVEaWFsb2cgZXh0ZW5kcyBFZGl0VGVtcGxhdGVEaWFsb2cgewotCQlwdWJsaWMgWE1MRWRpdFRlbXBsYXRlRGlhbG9nKFNoZWxsIHBhcmVudCwgVGVtcGxhdGUgdGVtcGxhdGUsIGJvb2xlYW4gZWRpdCwgYm9vbGVhbiBpc05hbWVNb2RpZmlhYmxlLCBDb250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlzdXBlcihwYXJlbnQsIHRlbXBsYXRlLCBlZGl0LCBpc05hbWVNb2RpZmlhYmxlLCByZWdpc3RyeSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwoKTsKLQotCQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQkJfQotCi0JCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIElDb250ZW50QXNzaXN0YW50IGdldENvbnRlbnRBc3Npc3RhbnQoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQkJQ29udGVudEFzc2lzdGFudCBhc3Npc3RhbnQgPSBuZXcgQ29udGVudEFzc2lzdGFudCgpOwotCQkJCQlhc3Npc3RhbnQuZW5hYmxlQXV0b0FjdGl2YXRpb24odHJ1ZSk7Ci0JCQkJCWFzc2lzdGFudC5lbmFibGVBdXRvSW5zZXJ0KHRydWUpOwotCQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihnZXRUZW1wbGF0ZVByb2Nlc3NvcigpLCBJRG9jdW1lbnQuREVGQVVMVF9DT05URU5UX1RZUEUpOwotCQkJCQlyZXR1cm4gYXNzaXN0YW50OwotCQkJCX0KLQkJCX07Ci0JCQlyZXR1cm4gZG9DcmVhdGVWaWV3ZXIocGFyZW50LCBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyBYTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlKCkgewotCQlYTUxVSVBsdWdpbiB4bWxFZGl0b3JQbHVnaW4gPSBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQkJc2V0UHJlZmVyZW5jZVN0b3JlKHhtbEVkaXRvclBsdWdpbi5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCXNldFRlbXBsYXRlU3RvcmUoeG1sRWRpdG9yUGx1Z2luLmdldFRlbXBsYXRlU3RvcmUoKSk7Ci0JCXNldENvbnRleHRUeXBlUmVnaXN0cnkoeG1sRWRpdG9yUGx1Z2luLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGFuY2VzdG9yKSB7Ci0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKGFuY2VzdG9yKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjLCBJSGVscENvbnRleHRJZHMuWE1MX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjY3JlYXRlVmlld2VyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGRvQ3JlYXRlVmlld2VyKHBhcmVudCwgc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JfQotCi0JU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gdmlld2VyQ29uZmlndXJhdGlvbikgewotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlSUQgPSBDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MOwotCQl2aWV3ZXIgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXIocGFyZW50LCBudWxsLCBudWxsLCBmYWxzZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCXZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250KCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IikpOyAvLyROT04tTkxTLTEkCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc2NyYXRjaE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoY29udGVudFR5cGVJRCk7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHNjcmF0Y2hNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJdmlld2VyLmNvbmZpZ3VyZSh2aWV3ZXJDb25maWd1cmF0aW9uKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBlZGl0IGRpYWxvZy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZQotCSAqIGEgY3VzdG9tIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gdGVtcGxhdGUKLQkgKiAgICAgICAgICAgIHRoZSB0ZW1wbGF0ZSBiZWluZyBlZGl0ZWQKLQkgKiBAcGFyYW0gZWRpdAotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgZGlhbG9nIHNob3VsZCBiZSBlZGl0YWJsZQotCSAqIEBwYXJhbSBpc05hbWVNb2RpZmlhYmxlCi0JICogICAgICAgICAgICB3aGV0aGVyIHRoZSB0ZW1wbGF0ZSBuYW1lIG1heSBiZSBtb2RpZmllZAotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgb3IgbW9kaWZpZWQgdGVtcGxhdGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqICAgICAgICAgZWRpdGlvbiBmYWlsZWQKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIFRlbXBsYXRlIGVkaXRUZW1wbGF0ZShUZW1wbGF0ZSB0ZW1wbGF0ZSwgYm9vbGVhbiBlZGl0LCBib29sZWFuIGlzTmFtZU1vZGlmaWFibGUpIHsKLQkJRWRpdFRlbXBsYXRlRGlhbG9nIGRpYWxvZyA9IG5ldyBYTUxFZGl0VGVtcGxhdGVEaWFsb2coZ2V0U2hlbGwoKSwgdGVtcGxhdGUsIGVkaXQsIGlzTmFtZU1vZGlmaWFibGUsIGdldENvbnRleHRUeXBlUmVnaXN0cnkoKSk7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJcmV0dXJuIGRpYWxvZy5nZXRUZW1wbGF0ZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSNpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkgewotCQkvLyB0ZW1wbGF0ZSBmb3JtYXR0aW5nIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnBlcmZvcm1PaygpOwotCQlYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBvazsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVHlwaW5nUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxUeXBpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDg3YWIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxUeXBpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLSAKLXB1YmxpYyBjbGFzcyBYTUxUeXBpbmdQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBCdXR0b24gZkNsb3NlQ29tbWVudDsKLQlwcml2YXRlIEJ1dHRvbiBmQ2xvc2VFbmRUYWc7Ci0JcHJpdmF0ZSBCdXR0b24gZlJlbW92ZUVuZFRhZzsKLQlwcml2YXRlIEJ1dHRvbiBmQ2xvc2VFbGVtZW50OwotCXByaXZhdGUgQnV0dG9uIGZDbG9zZVN0cmluZ3M7Ci0JcHJpdmF0ZSBCdXR0b24gZkNsb3NlQnJhY2tldHM7Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIElIZWxwQ29udGV4dElkcy5YTUxfUFJFRldFQlhfRklMRVNfSEVMUElEKTsKLQotCQljcmVhdGVTdGFydFRhZ0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUVuZFRhZ0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUF1dG9Db21wbGV0ZShjb21wb3NpdGUpOwotCQljcmVhdGVBdXRvUmVtb3ZlKGNvbXBvc2l0ZSk7Ci0JCQotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCWxvYWRQcmVmZXJlbmNlcygpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVN0YXJ0VGFnR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0KLQkJZ3JvdXAuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLlhNTFR5cGluZ19TdGFydF9UYWcpOwotCi0JCWZDbG9zZUVsZW1lbnQgPSBjcmVhdGVDaGVja0JveChncm91cCwgWE1MVUlNZXNzYWdlcy5YTUxUeXBpbmdfQ29tcGxldGVfRWxlbWVudHMpOwotCQkoKEdyaWREYXRhKSBmQ2xvc2VFbGVtZW50LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW5kVGFnR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0KLQkJZ3JvdXAuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLlhNTFR5cGluZ19FbmRfVGFnKTsKLQotCQlmQ2xvc2VFbmRUYWcgPSBjcmVhdGVDaGVja0JveChncm91cCwgWE1MVUlNZXNzYWdlcy5YTUxUeXBpbmdfQ29tcGxldGVfRW5kX1RhZ3MpOwotCQkoKEdyaWREYXRhKSBmQ2xvc2VFbmRUYWcuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVBdXRvQ29tcGxldGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCQotCQlncm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuWE1MVHlwaW5nX0F1dG9fQ29tcGxldGUpOwotCQkKLQkJZkNsb3NlQ29tbWVudCA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBYTUxVSU1lc3NhZ2VzLlhNTFR5cGluZ19Db21wbGV0ZV9Db21tZW50cyk7Ci0JCSgoR3JpZERhdGEpIGZDbG9zZUNvbW1lbnQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJZkNsb3NlU3RyaW5ncyA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBYTUxVSU1lc3NhZ2VzLlhNTFR5cGluZ19DbG9zZV9TdHJpbmdzKTsKLQkJKChHcmlkRGF0YSkgZkNsb3NlU3RyaW5ncy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQlmQ2xvc2VCcmFja2V0cyA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBYTUxVSU1lc3NhZ2VzLlhNTFR5cGluZ19DbG9zZV9CcmFja2V0cyk7Ci0JCSgoR3JpZERhdGEpIGZDbG9zZUJyYWNrZXRzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQXV0b1JlbW92ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQkJCi0JCWdyb3VwLnNldFRleHQoWE1MVUlNZXNzYWdlcy5YTUxUeXBpbmdfQXV0b19SZW1vdmUpOwotCQkKLQkJZlJlbW92ZUVuZFRhZyA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBYTUxVSU1lc3NhZ2VzLlhNTFR5cGluZ19SZW1vdmVfRW5kX1RhZ3MpOwotCQkoKEdyaWREYXRhKSBmUmVtb3ZlRW5kVGFnLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0JCQotCQlYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlpbml0Q2hlY2tib3goZkNsb3NlQ29tbWVudCwgWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0NPTU1FTlRTKTsKLQkJaW5pdENoZWNrYm94KGZDbG9zZUVuZFRhZywgWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0VORF9UQUdTKTsKLQkJaW5pdENoZWNrYm94KGZDbG9zZUVsZW1lbnQsIFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9FTEVNRU5UUyk7Ci0JCWluaXRDaGVja2JveChmUmVtb3ZlRW5kVGFnLCBYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfUkVNT1ZFX0VORF9UQUdTKTsKLQkJaW5pdENoZWNrYm94KGZDbG9zZVN0cmluZ3MsIFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DTE9TRV9TVFJJTkdTKTsKLQkJaW5pdENoZWNrYm94KGZDbG9zZUJyYWNrZXRzLCBYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ0xPU0VfQlJBQ0tFVFMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWRlZmF1bHRDaGVja2JveChmQ2xvc2VDb21tZW50LCBYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfQ09NTUVOVFMpOwotCQlkZWZhdWx0Q2hlY2tib3goZkNsb3NlRW5kVGFnLCBYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRU5EX1RBR1MpOwotCQlkZWZhdWx0Q2hlY2tib3goZkNsb3NlRWxlbWVudCwgWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0VMRU1FTlRTKTsKLQkJZGVmYXVsdENoZWNrYm94KGZSZW1vdmVFbmRUYWcsIFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19SRU1PVkVfRU5EX1RBR1MpOwotCQlkZWZhdWx0Q2hlY2tib3goZkNsb3NlU3RyaW5ncywgWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NMT1NFX1NUUklOR1MpOwotCQlkZWZhdWx0Q2hlY2tib3goZkNsb3NlQnJhY2tldHMsIFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DTE9TRV9CUkFDS0VUUyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfQ09NTUVOVFMsIChmQ2xvc2VDb21tZW50ICE9IG51bGwpID8gZkNsb3NlQ29tbWVudC5nZXRTZWxlY3Rpb24oKSA6IGZhbHNlKTsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0VORF9UQUdTLCAoZkNsb3NlRW5kVGFnICE9IG51bGwpID8gZkNsb3NlRW5kVGFnLmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRUxFTUVOVFMsIChmQ2xvc2VFbGVtZW50ICE9IG51bGwpID8gZkNsb3NlRWxlbWVudC5nZXRTZWxlY3Rpb24oKSA6IGZhbHNlKTsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX1JFTU9WRV9FTkRfVEFHUywgKGZSZW1vdmVFbmRUYWcgIT0gbnVsbCkgPyBmUmVtb3ZlRW5kVGFnLmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ0xPU0VfU1RSSU5HUywgKGZDbG9zZVN0cmluZ3MgIT0gbnVsbCkgPyBmQ2xvc2VTdHJpbmdzLmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ0xPU0VfQlJBQ0tFVFMsIChmQ2xvc2VCcmFja2V0cyAhPSBudWxsKSA/IGZDbG9zZUJyYWNrZXRzLmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjMyZTZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQmVuamFtaW4gTXVza2FsbGEsIGIubXVza2FsbGFAZ214Lm5ldCAtIFsxNTg2NjBdIGNoYXJhY3RlciBlbnRpdGllcyBzaG91bGQgaGF2ZSB0aGVpciBvd24gc3ludGF4IGhpZ2hsaWdodGluZyBwcmVmZXJlbmNlIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgWE1MIFVJIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxVSVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCUNvbG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFRoZW1lTWFuYWdlcigpLmdldEN1cnJlbnRUaGVtZSgpLmdldENvbG9yUmVnaXN0cnkoKTsKLQotCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRSwgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREUsICI8PToiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwOTQ2Ci0JCXN0b3JlLnNldERlZmF1bHQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuU1VHR0VTVElPTl9TVFJBVEVHWSwgWE1MVUlQcmVmZXJlbmNlTmFtZXMuU1VHR0VTVElPTl9TVFJBVEVHWV9WQUxVRV9TVFJJQ1QpOwotCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLlVTRV9JTkZFUlJFRF9HUkFNTUFSLCB0cnVlKTsKLQotCQkvLyBYTUwgU3R5bGUgUHJlZmVyZW5jZXMKLQkJU3RyaW5nIE5PQkFDS0dST1VOREJPTEQgPSAiIHwgbnVsbCB8IGZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgSlVTVElUQUxJQyA9ICIgfCBudWxsIHwgZmFsc2UgfCB0cnVlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUsIDEyNywgMCwgMTI3KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCA0MiwgMCwgMjU1KSArIEpVU1RJVEFMSUM7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSAibnVsbCIgKyBOT0JBQ0tHUk9VTkRCT0xEOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfRVFVQUxTLCBzdHlsZVZhbHVlKTsgLy8gc3BlY2lmaWVkCi0JCS8vIHZhbHVlIGlzIGJsYWNrOyBsZWF2aW5nIGFzIHdpZGdldCBkZWZhdWx0Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUiwgNjMsIDk1LCAxOTEpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIsIHN0eWxlVmFsdWUpOwotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCwgNjMsIDk1LCAxOTEpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhULCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSLCAwLCAxMjgsIDEyOCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUsIDAsIDAsIDEyOCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUsIHN0eWxlVmFsdWUpOwotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLCAwLCAwLCAxMjgpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCwgMTI4LCAxMjgsIDEyOCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lELCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGLCA2MywgMTI3LCA5NSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9ICJudWxsIiArIE5PQkFDS0dST1VOREJPTEQ7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQsIHN0eWxlVmFsdWUpOyAvLyBzcGVjaWZpZWQKLQkJLy8gdmFsdWUgaXMgYmxhY2s7IGxlYXZpbmcgYXMgd2lkZ2V0IGRlZmF1bHQKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIDAsIDEyOCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUsIDYzLCAxMjcsIDEyNykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIsIDAsIDEyOCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9ICJudWxsIiArIE5PQkFDS0dST1VOREJPTEQ7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCwgc3R5bGVWYWx1ZSk7IC8vIHNwZWNpZmllZAotCQkvLyB2YWx1ZSBpcyBibGFjazsgbGVhdmluZyBhcyB3aWRnZXQgZGVmYXVsdAotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSLCAwLCAxMjgsIDEyOCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCwgMCwgMCwgMCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhULCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UsIDQyLCAwLCAyNTUpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRSwgc3R5bGVWYWx1ZSk7Ci0JCQotCQkvLyBzZXQgZGVmYXVsdCBuZXcgeG1sIGZpbGUgdGVtcGxhdGUgdG8gdXNlIGluIG5ldyBmaWxlIHdpemFyZAotCQkvKgotCQkgKiBOZWVkIHRvIGZpbmQgdGVtcGxhdGUgbmFtZSB0aGF0IGdvZXMgd2l0aCBkZWZhdWx0IHRlbXBsYXRlIGlkIChuYW1lCi0JCSAqIG1heSBjaGFuZ2UgZm9yIGRpZmZlcmVudCBsYW5ndWFnZSkKLQkJICovCi0JCXN0b3JlLnNldERlZmF1bHQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfSUQsICJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy54bWxkZWNsYXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyBEZWZhdWx0cyBmb3IgdGhlIFR5cGluZyBwcmVmZXJlbmNlIHBhZ2UKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfQ09NTUVOVFMsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9FTkRfVEFHUywgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0VMRU1FTlRTLCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfUkVNT1ZFX0VORF9UQUdTLCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ0xPU0VfU1RSSU5HUywgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NMT1NFX0JSQUNLRVRTLCB0cnVlKTsKLQkJCi0JCS8vIERlZmF1bHRzIGZvciBDb250ZW50IEFzc2lzdCBwcmVmZXJlbmNlIHBhZ2UKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5DT05URU5UX0FTU0lTVF9ET19OT1RfRElTUExBWV9PTl9ERUZBVUxUX1BBR0UsICIiKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5DT05URU5UX0FTU0lTVF9ET19OT1RfRElTUExBWV9PTl9PV05fUEFHRSwgIiIpOwotCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLkNPTlRFTlRfQVNTSVNUX0RFRkFVTFRfUEFHRV9TT1JUX09SREVSLAotCQkJCSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnByb3Bvc2FsQ2F0ZWdvcnkueG1sVGFnc1wwIiArCi0JCQkJIm9yZy5lY2xpcHNlLndzdC54bWwudWkucHJvcG9zYWxDYXRlZ29yeS54bWxUZW1wbGF0ZXMiKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5DT05URU5UX0FTU0lTVF9PV05fUEFHRV9TT1JUX09SREVSLAotCQkJCSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnByb3Bvc2FsQ2F0ZWdvcnkueG1sVGVtcGxhdGVzXDAiKyAKLQkJCQkib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcm9wb3NhbENhdGVnb3J5LnhtbFRhZ3MiKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxVSVByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFVJUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MzczNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFVJUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBrZXlzIGZvciBYTUwgVUkKLSAqLwotcHVibGljIGNsYXNzIFhNTFVJUHJlZmVyZW5jZU5hbWVzIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNVR0dFU1RJT05fU1RSQVRFR1lfVkFMVUVfTEFYID0gIkxheCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVUdHRVNUSU9OX1NUUkFURUdZX1ZBTFVFX1NUUklDVCA9ICJTdHJpY3QiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgY29udHJvbHMgaWYgY29kZSBhc3Npc3QgZ2V0cyBhdXRvIGFjdGl2YXRlZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX1BST1BPU0UgPSBnZXRBdXRvUHJvcG9zZUtleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF1dG9Qcm9wb3NlS2V5KCkgewotCQlyZXR1cm4gImF1dG9Qcm9wb3NlIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgaG9sZHMgdGhlIGNoYXJhY3RlcnMgdGhhdCBhdXRvIGFjdGl2YXRlIGNvZGUKLQkgKiBhc3Npc3QuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LiBBbGwgY2hhcmFjdGVycyB0aGF0IHRyaWdnZXIKLQkgKiBhdXRvIGNvZGUgYXNzaXN0LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX1BST1BPU0VfQ09ERSA9IGdldEF1dG9Qcm9wb3NlQ29kZUtleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF1dG9Qcm9wb3NlQ29kZUtleSgpIHsKLQkJcmV0dXJuICJhdXRvUHJvcG9zZUNvZGUiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIGN1c3RvbWl6ZWQgdGVtcGxhdGVzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVTX0tFWSA9IGdldFRlbXBsYXRlc0tleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRlbXBsYXRlc0tleSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmN1c3RvbV90ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgY29udHJvbHMgd2hldGhlciBvciBncmFtbWFyIHNob3VsZCBiZSBpbmZlcnJlZAotCSAqIG9yIG5vdC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfSU5GRVJSRURfR1JBTU1BUiA9IGdldFVzZUluZmVycmVkR3JhbW1hcktleSgpOwotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBPVVRMSU5FX0JFSEFWSU9SIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9OT0RFID0gIm91dGxpbmUtYmVoYXZpb3IuZWxlbWVudC1ub2RlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTk9ERSA9ICJvdXRsaW5lLWJlaGF2aW9yLmF0dHJpYnV0ZS1ub2RlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX05PREUgPSAib3V0bGluZS1iZWhhdmlvci50ZXh0LW5vZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX1NFQ1RJT05fTk9ERSA9ICJvdXRsaW5lLWJlaGF2aW9yLmNkYXRhLXNlY3Rpb24tbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1JFRkVSRU5DRV9OT0RFID0gIm91dGxpbmUtYmVoYXZpb3IuZW50aXR5LXJlZmVyZW5jZS1ub2RlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfTk9ERSA9ICJvdXRsaW5lLWJlaGF2aW9yLmVudGl0eS1ub2RlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgPSAib3V0bGluZS1iZWhhdmlvci5pbnN0cnVjdGlvbi1ub2RlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX05PREUgPSAib3V0bGluZS1iZWhhdmlvci5jb21tZW50LW5vZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX05PREUgPSAib3V0bGluZS1iZWhhdmlvci5kb2N1bWVudC1ub2RlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVF9UWVBFX05PREUgPSAib3V0bGluZS1iZWhhdmlvci5kb2N1bWVudC10eXBlLW5vZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgPSAib3V0bGluZS1iZWhhdmlvci5kb2N1bWVudC1mcmFnbWVudC1ub2RlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTl9OT0RFID0gIm91dGxpbmUtYmVoYXZpb3Iubm90YXRpb24tbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFVzZUluZmVycmVkR3JhbW1hcktleSgpIHsKLQkJcmV0dXJuICJ1c2VJbmZlcnJlZEdyYW1tYXIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgaG9sZHMgdGhlIGNoYXJhY3RlcnMgdGhhdCBhdXRvIGFjdGl2YXRlIGNvZGUKLQkgKiBhc3Npc3QuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LiBBbGwgY2hhcmFjdGVycyB0aGF0IHRyaWdnZXIKLQkgKiBhdXRvIGNvZGUgYXNzaXN0LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUdHRVNUSU9OX1NUUkFURUdZID0gZ2V0U3VnZ2VzdGlvblN0cmF0ZWdleUtleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN1Z2dlc3Rpb25TdHJhdGVnZXlLZXkoKSB7Ci0JCXJldHVybiAic3VnZ2VzdGlvblN0cmF0ZWd5IjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgbGFzdCB0ZW1wbGF0ZSBuYW1lIHVzZWQgaW4gbmV3IERURCBmaWxlIHdpemFyZC4KLQkgKiBUZW1wbGF0ZSBuYW1lIGlzIHN0b3JlZCBpbnN0ZWFkIG9mIHRlbXBsYXRlIGlkIGJlY2F1c2UgdXNlci1jcmVhdGVkCi0JICogdGVtcGxhdGVzIGRvIG5vdCBoYXZlIHRlbXBsYXRlIGlkcy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19GSUxFX1RFTVBMQVRFX05BTUUgPSAibmV3RmlsZVRlbXBsYXRlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBpbml0aWFsIHRlbXBsYXRlIElEIHRvIGJlIHVzZWQgaW4gdGhlIG5ldyBYTUwgZmlsZSB3aXphcmQuIEluIHRoZSBhYnNlbmNlCi0JICogb2Yge0BsaW5rIE5FV19GSUxFX1RFTVBMQVRFX05BTUV9LCB0aGlzIElEIGlzIHVzZWQgdG8gZmluZCBhIHRlbXBsYXRlIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRklMRV9URU1QTEFURV9JRCA9ICJuZXdGaWxlVGVtcGxhdGVJZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIG9wdGlvbiBmb3IgYXV0by1jb21wbGV0aW5nIGNvbW1lbnRzIHdoaWxlCi0JICogdHlwaW5nLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUElOR19DT01QTEVURV9DT01NRU5UUyA9ICJjb21wbGV0ZUNvbW1lbnRzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIG9wdGlvbiBmb3IgYXV0by1jb21wbGV0aW5nIGVuZC10YWdzIGFmdGVyIGVudGVyaW5nCi0JICogPGNvZGU+Jmx0Oy88L2NvZGU+Ci0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQSU5HX0NPTVBMRVRFX0VORF9UQUdTID0gImNvbXBsZXRlRW5kVGFncyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBvcHRpb24gZm9yIGF1dG8tY29tcGxldGluZyB0aGUgZWxlbWVudCBhZnRlciBlbnRlcmluZwotCSAqIDxjb2RlPiZndDs8L2NvZGU+Ci0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQSU5HX0NPTVBMRVRFX0VMRU1FTlRTID0gImNvbXBsZXRlRWxlbWVudHMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgb3B0aW9uIGZvciByZW1vdmluZyBhbiBlbmQtdGFnIGlmIHRoZSBzdGFydCB0YWcgaXMKLQkgKiBjb252ZXJ0ZWQgdG8gYW4gZW1wdHktdGFnLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUElOR19SRU1PVkVfRU5EX1RBR1MgPSAicmVtb3ZlRW5kVGFncyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIG9wdGlvbiBmb3IgYXV0by1jb21wbGV0aW5nIHN0cmluZ3MgKCIgYW5kICcpIHdoaWxlCi0JICogdHlwaW5nLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUElOR19DTE9TRV9TVFJJTkdTID0gImNsb3NlU3RyaW5ncyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIG9wdGlvbiBmb3IgYXV0by1jb21wbGV0aW5nIGJyYWNrZXRzIChbIGFuZCAoKSB3aGlsZQotCSAqIHR5cGluZy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBJTkdfQ0xPU0VfQlJBQ0tFVFMgPSAiY2xvc2VCcmFja2V0cyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiA8cD5wcmVmZXJlbmNlIGtleSB1c2VkIGZvciBzYXZpbmcgd2hpY2ggY2F0ZWdvcmllcyBzaG91bGQgbm90IGRpc3BsYXkgb24gdGhlIGRlZmF1bHQgcGFnZTwvcD4KLQkgKiAKLQkgKiA8cD5WYWx1ZSBpcyBvZiB0eXBlIHtAbGluayBTdHJpbmd9IGNvbnNpc3Rpbmcgb2YKLQkgKiA8dHQ+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21wbGV0aW9uUHJvcG9zYWwvcHJvcG9zYWxDYXRlZ29yeS9AaWQ8L3R0PnMgc2VwYXJhdGVkIGJ5IHRoZSBudWxsCi0JICogY2hhcmFjdGVyICg8dHQ+XDA8L3R0PiksIG9yZGVyZWQgaXMgaWdub3JlZDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0FTU0lTVF9ET19OT1RfRElTUExBWV9PTl9ERUZBVUxUX1BBR0UgPSAieG1sX2NvbnRlbnRfYXNzaXN0X2Rpc3BsYXlfb25fZGVmYXVsdF9wYWdlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIDxwPnByZWZlcmVuY2Uga2V5IHVzZWQgZm9yIHNhdmluZyB3aGljaCBjYXRlZ29yaWVzIHNob3VsZCBub3QgZGlzcGxheSBvbiB0aGVpciBvd24gcGFnZTwvcD4KLQkgKiAKLQkgKiA8cD5WYWx1ZSBpcyBvZiB0eXBlIHtAbGluayBTdHJpbmd9IGNvbnNpc3Rpbmcgb2YKLQkgKiA8dHQ+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21wbGV0aW9uUHJvcG9zYWwvcHJvcG9zYWxDYXRlZ29yeS9AaWQ8L3R0PnMgc2VwYXJhdGVkIGJ5IHRoZSBudWxsCi0JICogY2hhcmFjdGVyICg8dHQ+XDA8L3R0PiksIG9yZGVyIGlzIGlnbm9yZWQ8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9BU1NJU1RfRE9fTk9UX0RJU1BMQVlfT05fT1dOX1BBR0UgPSAieG1sX2NvbnRlbnRfYXNzaXN0X2Rpc3BsYXlfb25fb3duX3BhZ2UiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogPHA+cHJlZmVyZW5jZSBrZXkgZm9yIHNhdmluZyB0aGUgc29ydCBvcmRlciBvZiB0aGUgY2F0ZWdvcmllcyB3aGVuIGRpc3BsYXlpbmcgdGhlbSBvbiB0aGVpciBvd24gcGFnZTwvcD4KLQkgKiAKLQkgKiA8cD5WYWx1ZSBpcyBvZiB0eXBlIHtAbGluayBTdHJpbmd9IGNvbnNpc3Rpbmcgb2YKLQkgKiA8dHQ+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21wbGV0aW9uUHJvcG9zYWwvcHJvcG9zYWxDYXRlZ29yeS9AaWQ8L3R0PnMgc2VwYXJhdGVkIGJ5IHRoZSBudWxsCi0JICogY2hhcmFjdGVyICg8dHQ+XDA8L3R0PikgaW4gdGhlIGRlc2lyZWQgc29ydCBvcmRlci48L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9BU1NJU1RfT1dOX1BBR0VfU09SVF9PUkRFUj0gInhtbF9jb250ZW50X2Fzc2lzdF9vd25fcGFnZV9zb3J0X29yZGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIDxwPnByZWZlcmVuY2Uga2V5IGZvciBzYXZpbmcgdGhlIHNvcnQgb3JkZXIgb2YgdGhlIGNhdGVnb3JpZXMgd2hlbiBkaXNwbGF5aW5nIHRoZW0gb24gdGhlIGRlZmF1bHQgcGFnZTwvcD4KLQkgKiAKLQkgKiA8cD5WYWx1ZSBpcyBvZiB0eXBlIHtAbGluayBTdHJpbmd9IGNvbnNpc3Rpbmcgb2YKLQkgKiA8dHQ+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21wbGV0aW9uUHJvcG9zYWwvcHJvcG9zYWxDYXRlZ29yeS9AaWQ8L3R0PnMgc2VwYXJhdGVkIGJ5IHRoZSBudWxsCi0JICogY2hhcmFjdGVyICg8dHQ+XDA8L3R0PikgaW4gdGhlIGRlc2lyZWQgc29ydCBvcmRlci48L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9BU1NJU1RfREVGQVVMVF9QQUdFX1NPUlRfT1JERVI9ICJ4bWxfY29udGVudF9hc3Npc3RfZGVmYXVsdF9wYWdlX3NvcnRfb3JkZXIiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVmFsaWRhdG9yUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxWYWxpZGF0b3JQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTViZGFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxWYWxpZGF0b3JQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIFsyMDU5ODldIC0gW3ZhbGlkYXRpb25dIHZhbGlkYXRlIFhNTCBhZnRlciBYSW5jbHVkZSByZXNvbHV0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Db250cm9sRW5hYmxlU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci0KLQotcHVibGljIGNsYXNzIFhNTFZhbGlkYXRvclByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSB7Ci0gIHByaXZhdGUgQ29tYm8gZkluZGljYXRlTm9HcmFtbWFyOwotICAKLSAgcHJpdmF0ZSBCdXR0b24gZkhvbm91ckFsbFNjaGVtYUxvY2F0aW9uczsKLQotICBwcml2YXRlIEJ1dHRvbiBmVXNlWGluY2x1ZGU7Ci0gIAotICBwcml2YXRlIEJ1dHRvbiBmRXh0ZW5kZWRNYXJrdXBWYWxpZGF0aW9uOwotICAKLSAgcHJpdmF0ZSBDb21ibyBmRW1wdHlFbGVtZW50VGFnOwotICAKLSAgcHJpdmF0ZSBDb21ibyBmRW5kVGFnV2l0aEF0dHJpYnV0ZXM7Ci0gIAotICBwcml2YXRlIENvbWJvIGZJbnZhbGlkV2hpdGVzcGFjZUJlZm9yZVRhZ25hbWU7Ci0gIAotICBwcml2YXRlIENvbWJvIGZNaXNzaW5nQ2xvc2luZ0JyYWNrZXQ7Ci0gIAotICBwcml2YXRlIENvbWJvIGZNaXNzaW5nQ2xvc2luZ1F1b3RlOwotICAKLSAgcHJpdmF0ZSBDb21ibyBmTWlzc2luZ0VuZFRhZzsKLSAgCi0gIHByaXZhdGUgQ29tYm8gZk1pc3NpbmdTdGFydFRhZzsKLSAgCi0gIHByaXZhdGUgQ29tYm8gZk1pc3NpbmdRdW90ZXM7Ci0gIAotICBwcml2YXRlIENvbWJvIGZJbnZhbGlkTmFtZXNwYWNlSW5QSTsKLSAgCi0gIHByaXZhdGUgQ29tYm8gZk1pc3NpbmdUYWdOYW1lOwotICAKLSAgcHJpdmF0ZSBDb21ibyBmSW52YWxpZFdoaXRlc3BhY2VBdFN0YXJ0OwotCi0gIHByaXZhdGUgR3JvdXAgZk1hcmt1cFZhbGlkYXRpb25Hcm91cDsKLSAgcHJpdmF0ZSBDb250cm9sRW5hYmxlU3RhdGUgZk1hcmt1cFN0YXRlOwotIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTRVZFUklUSUVTID0ge1hNTFVJTWVzc2FnZXMuSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWRfc2V2ZXJpdGllc19lcnJvciwgWE1MVUlNZXNzYWdlcy5JbmRpY2F0ZV9ub19ncmFtbWFyX3NwZWNpZmllZF9zZXZlcml0aWVzX3dhcm5pbmcsIFhNTFVJTWVzc2FnZXMuSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWRfc2V2ZXJpdGllc19pZ25vcmV9OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNQVJLVVBfU0VWRVJJVElFUyA9IHtYTUxVSU1lc3NhZ2VzLlNldmVyaXR5X2Vycm9yLCBYTUxVSU1lc3NhZ2VzLlNldmVyaXR5X3dhcm5pbmcsIFhNTFVJTWVzc2FnZXMuU2V2ZXJpdHlfaWdub3JlfTsKLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLlhNTF9QUkVGV0VCWF9WQUxJREFUT1JfSEVMUElEKTsKLSAgICBjcmVhdGVDb250ZW50c0ZvclZhbGlkYXRpbmdHcm91cChjb21wb3NpdGUpOwotICAgIGNyZWF0ZUNvbnRlbnRzRm9yTWFya3VwVmFsaWRhdGlvbkdyb3VwKGNvbXBvc2l0ZSk7Ci0gICAgc2V0U2l6ZShjb21wb3NpdGUpOwotICAgIGxvYWRQcmVmZXJlbmNlcygpOwotCi0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yVmFsaWRhdGluZ0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICBHcm91cCB2YWxpZGF0aW5nR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDIpOwotICAgICgoR3JpZExheW91dCl2YWxpZGF0aW5nR3JvdXAuZ2V0TGF5b3V0KCkpLm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGZhbHNlOwotICAgIHZhbGlkYXRpbmdHcm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuVmFsaWRhdGluZ19maWxlcyk7Ci0KLSAgICBpZiAoZkluZGljYXRlTm9HcmFtbWFyID09IG51bGwpIHsKLSAgICAgIGNyZWF0ZUxhYmVsKHZhbGlkYXRpbmdHcm91cCwgWE1MVUlNZXNzYWdlcy5JbmRpY2F0ZV9ub19ncmFtbWFyX3NwZWNpZmllZCk7Ci0gICAgICBmSW5kaWNhdGVOb0dyYW1tYXIgPSBjcmVhdGVDb21ibyh2YWxpZGF0aW5nR3JvdXAsIFNFVkVSSVRJRVMpOwotICAgIH0KLSAgICBpZiAoZlVzZVhpbmNsdWRlID09IG51bGwpIHsKLSAgICAgIGZVc2VYaW5jbHVkZSA9IGNyZWF0ZUNoZWNrQm94KHZhbGlkYXRpbmdHcm91cCwgWE1MVUlNZXNzYWdlcy5Vc2VfWEluY2x1ZGUpOwotICAgICAgKChHcmlkRGF0YSlmVXNlWGluY2x1ZGUuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgfQotICAgIGlmIChmSG9ub3VyQWxsU2NoZW1hTG9jYXRpb25zID09IG51bGwpIHsKLSAgICAgIGZIb25vdXJBbGxTY2hlbWFMb2NhdGlvbnMgPSBjcmVhdGVDaGVja0JveCh2YWxpZGF0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuSG9ub3VyX2FsbF9zY2hlbWFfbG9jYXRpb25zKTsKLSAgICAgICgoR3JpZERhdGEpZkhvbm91ckFsbFNjaGVtYUxvY2F0aW9ucy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLSAgICB9Ci0gIH0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZU1hcmt1cFNldmVyaXR5U2VsZWN0aW9uKGJvb2xlYW4gc2VsZWN0aW9uKXsKLQkgIGlmIChzZWxlY3Rpb24pIHsKLQkJICBmTWFya3VwU3RhdGUucmVzdG9yZSgpOwotCSAgfQotCSAgZWxzZSB7Ci0JCSAgZk1hcmt1cFN0YXRlID0gQ29udHJvbEVuYWJsZVN0YXRlLmRpc2FibGUoZk1hcmt1cFZhbGlkYXRpb25Hcm91cCk7Ci0JICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0Zvck1hcmt1cFZhbGlkYXRpb25Hcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JICAgCi0JICAgIGlmIChmRXh0ZW5kZWRNYXJrdXBWYWxpZGF0aW9uID09IG51bGwpIHsKLQkJICAgIGZFeHRlbmRlZE1hcmt1cFZhbGlkYXRpb24gPSBjcmVhdGVDaGVja0JveChwYXJlbnQsIFhNTFVJTWVzc2FnZXMuTWFya3VwVmFsaWRhdGlvbl9maWxlcyk7Ci0JCSAgICAoKEdyaWREYXRhKWZFeHRlbmRlZE1hcmt1cFZhbGlkYXRpb24uZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCSAgICBmRXh0ZW5kZWRNYXJrdXBWYWxpZGF0aW9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaGFuZGxlTWFya3VwU2V2ZXJpdHlTZWxlY3Rpb24oZkV4dGVuZGVkTWFya3VwVmFsaWRhdGlvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkgICAgZk1hcmt1cFZhbGlkYXRpb25Hcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMyk7Ci0JICAgICgoR3JpZExheW91dClmTWFya3VwVmFsaWRhdGlvbkdyb3VwLmdldExheW91dCgpKS5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLQkgICAgZk1hcmt1cFZhbGlkYXRpb25Hcm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuTWFya3VwVmFsaWRhdGlvbl9maWxlc19sYWJlbCk7Ci0KLQkgICAgaWYgKGZNaXNzaW5nU3RhcnRUYWcgPT0gbnVsbCkgewotCSAgICAgICAgZk1pc3NpbmdTdGFydFRhZyA9IGNyZWF0ZU1hcmt1cENvbWJvKGZNYXJrdXBWYWxpZGF0aW9uR3JvdXAsIFhNTFVJTWVzc2FnZXMuTWlzc2luZ19zdGFydF90YWcsIE1BUktVUF9TRVZFUklUSUVTKTsKLQkgICAgfQotCSAgICBpZiAoZk1pc3NpbmdFbmRUYWcgPT0gbnVsbCkgewotCSAgICAgICAgZk1pc3NpbmdFbmRUYWcgPSBjcmVhdGVNYXJrdXBDb21ibyhmTWFya3VwVmFsaWRhdGlvbkdyb3VwLCBYTUxVSU1lc3NhZ2VzLk1pc3NpbmdfZW5kX3RhZywgTUFSS1VQX1NFVkVSSVRJRVMpOwotCSAgICB9Ci0JICAgIGlmIChmTWlzc2luZ1RhZ05hbWUgPT0gbnVsbCkgewotCSAgICAgICAgZk1pc3NpbmdUYWdOYW1lID0gY3JlYXRlTWFya3VwQ29tYm8oZk1hcmt1cFZhbGlkYXRpb25Hcm91cCwgWE1MVUlNZXNzYWdlcy5UYWdfbmFtZV9taXNzaW5nLCBNQVJLVVBfU0VWRVJJVElFUyk7Ci0JICAgIH0KLQkgICAgaWYgKGZNaXNzaW5nUXVvdGVzID09IG51bGwpIHsKLQkgICAgICAgIGZNaXNzaW5nUXVvdGVzID0gY3JlYXRlTWFya3VwQ29tYm8oZk1hcmt1cFZhbGlkYXRpb25Hcm91cCwgWE1MVUlNZXNzYWdlcy5NaXNzaW5nX3F1b3RlcywgTUFSS1VQX1NFVkVSSVRJRVMpOwotCSAgICB9Ci0JICAgIGlmIChmTWlzc2luZ0Nsb3NpbmdCcmFja2V0ID09IG51bGwpIHsKLQkgICAgICAgIGZNaXNzaW5nQ2xvc2luZ0JyYWNrZXQgPSBjcmVhdGVNYXJrdXBDb21ibyhmTWFya3VwVmFsaWRhdGlvbkdyb3VwLCBYTUxVSU1lc3NhZ2VzLk1pc3NpbmdfY2xvc2luZ19icmFja2V0LCBNQVJLVVBfU0VWRVJJVElFUyk7Ci0JICAgIH0KLQkgICAgaWYgKGZNaXNzaW5nQ2xvc2luZ1F1b3RlID09IG51bGwpIHsKLQkgICAgICAgIGZNaXNzaW5nQ2xvc2luZ1F1b3RlID0gY3JlYXRlTWFya3VwQ29tYm8oZk1hcmt1cFZhbGlkYXRpb25Hcm91cCwgWE1MVUlNZXNzYWdlcy5NaXNzaW5nX2Nsb3NpbmdfcXVvdGUsIE1BUktVUF9TRVZFUklUSUVTKTsKLQkgICAgfQotCSAgICBpZiAoZkVtcHR5RWxlbWVudFRhZyA9PSBudWxsKSB7Ci0JICAgICAgICBmRW1wdHlFbGVtZW50VGFnID0gY3JlYXRlTWFya3VwQ29tYm8oZk1hcmt1cFZhbGlkYXRpb25Hcm91cCwgWE1MVUlNZXNzYWdlcy5FbXB0eV9lbGVtZW50X3RhZywgTUFSS1VQX1NFVkVSSVRJRVMpOwotCSAgICB9Ci0JICAgIGlmIChmRW5kVGFnV2l0aEF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCSAgICAgICAgZkVuZFRhZ1dpdGhBdHRyaWJ1dGVzID0gY3JlYXRlTWFya3VwQ29tYm8oZk1hcmt1cFZhbGlkYXRpb25Hcm91cCwgWE1MVUlNZXNzYWdlcy5FbmRfdGFnX3dpdGhfYXR0cmlidXRlcywgTUFSS1VQX1NFVkVSSVRJRVMpOwotCSAgICB9Ci0JICAgIGlmIChmSW52YWxpZFdoaXRlc3BhY2VCZWZvcmVUYWduYW1lID09IG51bGwpIHsKLQkgICAgICAgIGZJbnZhbGlkV2hpdGVzcGFjZUJlZm9yZVRhZ25hbWUgPSBjcmVhdGVNYXJrdXBDb21ibyhmTWFya3VwVmFsaWRhdGlvbkdyb3VwLCBYTUxVSU1lc3NhZ2VzLkludmFsaWRfd2hpdGVzcGFjZV9iZWZvcmVfdGFnbmFtZSwgTUFSS1VQX1NFVkVSSVRJRVMpOwotCSAgICB9Ci0JICAgIGlmIChmSW52YWxpZE5hbWVzcGFjZUluUEkgPT0gbnVsbCkgewotCSAgICAgICAgZkludmFsaWROYW1lc3BhY2VJblBJID0gY3JlYXRlTWFya3VwQ29tYm8oZk1hcmt1cFZhbGlkYXRpb25Hcm91cCwgWE1MVUlNZXNzYWdlcy5OYW1lc3BhY2VfaW5fcGlfdGFyZ2V0LCBNQVJLVVBfU0VWRVJJVElFUyk7Ci0JICAgIH0KLQkgICAgaWYgKGZJbnZhbGlkV2hpdGVzcGFjZUF0U3RhcnQgPT0gbnVsbCkgewotCSAgICAgICAgZkludmFsaWRXaGl0ZXNwYWNlQXRTdGFydCA9IGNyZWF0ZU1hcmt1cENvbWJvKGZNYXJrdXBWYWxpZGF0aW9uR3JvdXAsIFhNTFVJTWVzc2FnZXMuV2hpdGVzcGFjZV9hdF9zdGFydCwgTUFSS1VQX1NFVkVSSVRJRVMpOwotCSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gcGFyZW50IAotICAgKiBAcmV0dXJuCi0gICAqLwotICBwcml2YXRlIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0gICAgQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0gICAgY29tYm8uc2V0SXRlbXMoaXRlbXMpOwotCi0gICAgLy9HcmlkRGF0YQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIHRydWUpOwotICAgIGNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICByZXR1cm4gY29tYm87Ci0gIH0KLQotICBwcml2YXRlIENvbWJvIGNyZWF0ZU1hcmt1cENvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBTdHJpbmdbXSBpdGVtcykgewotCSAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGFiZWwuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCSAgQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JICAgIGNvbWJvLnNldEl0ZW1zKGl0ZW1zKTsKLQotCSAgICAvL0dyaWREYXRhCi0JICAgLy8gR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIHRydWUpOwotCSAgICBjb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCSAgICByZXR1cm4gY29tYm87Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLSAgICBpbml0aWFsaXplVmFsdWVzRm9yVmFsaWRhdGluZ0dyb3VwKCk7Ci0gICAgaW5pdGlhbGl6ZVZhbHVlc0Zvck1hcmt1cFZhbGlkYXRpb25Hcm91cCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvclZhbGlkYXRpbmdHcm91cCgpIHsKLSAgICBQcmVmZXJlbmNlcyBtb2RlbFByZWZlcmVuY2VzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotICAgIGludCBpbmRpY2F0ZU5vR3JhbW1hckJ1dHRvblNlbGVjdGVkID0gbW9kZWxQcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRJQ0FURV9OT19HUkFNTUFSKTsKLSAgICBib29sZWFuIHVzZVhJbmNsdWRlQnV0dG9uU2VsZWN0ZWQgPSBtb2RlbFByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VU0VfWElOQ0xVREUpOwotCi0gICAgaWYgKGZJbmRpY2F0ZU5vR3JhbW1hciAhPSBudWxsKSB7Ci0gICAgICBmSW5kaWNhdGVOb0dyYW1tYXIuc2VsZWN0KDIgLSBpbmRpY2F0ZU5vR3JhbW1hckJ1dHRvblNlbGVjdGVkKTsKLSAgICAgIGZJbmRpY2F0ZU5vR3JhbW1hci5zZXRUZXh0KFNFVkVSSVRJRVNbMiAtIGluZGljYXRlTm9HcmFtbWFyQnV0dG9uU2VsZWN0ZWRdKTsKLSAgICB9Ci0gICAgaWYgKGZVc2VYaW5jbHVkZSAhPSBudWxsKSB7Ci0gICAgICBmVXNlWGluY2x1ZGUuc2V0U2VsZWN0aW9uKHVzZVhJbmNsdWRlQnV0dG9uU2VsZWN0ZWQpOwotICAgIH0KLQotICAgIGJvb2xlYW4gaG9ub3VyQWxsU2VsZWN0ZWQgPSBtb2RlbFByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMpOwotICAgIGlmIChmSG9ub3VyQWxsU2NoZW1hTG9jYXRpb25zICE9IG51bGwpIHsKLSAgICAgIGZIb25vdXJBbGxTY2hlbWFMb2NhdGlvbnMuc2V0U2VsZWN0aW9uKGhvbm91ckFsbFNlbGVjdGVkKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXNGb3JNYXJrdXBWYWxpZGF0aW9uR3JvdXAoKSB7Ci0JICAgIFByZWZlcmVuY2VzIG1vZGVsUHJlZmVyZW5jZXMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JICAgIGJvb2xlYW4gdXNlRXh0ZW5kZWRNYXJrdXBWYWxpZGF0aW9uID0gbW9kZWxQcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTUFSS1VQX1ZBTElEQVRJT04pOwotCi0JICAgIAotCSAgICBpZiAoZkV4dGVuZGVkTWFya3VwVmFsaWRhdGlvbiAhPSBudWxsKSB7Ci0JICAgIAlmRXh0ZW5kZWRNYXJrdXBWYWxpZGF0aW9uLnNldFNlbGVjdGlvbih1c2VFeHRlbmRlZE1hcmt1cFZhbGlkYXRpb24pOwotCSAgICB9Ci0JICAgIGludCBlbXB0eUVsZW1lbnRUYWcgPSBtb2RlbFByZWZlcmVuY2VzLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9IQVNfTk9fVkFMVUUpOwotCSAgICAKLQkgICAgaWYgKGZFbXB0eUVsZW1lbnRUYWcgIT0gbnVsbCkgewotCSAgICAJZkVtcHR5RWxlbWVudFRhZy5zZWxlY3QoMiAtIGVtcHR5RWxlbWVudFRhZyk7Ci0JICAgIAlmRW1wdHlFbGVtZW50VGFnLnNldFRleHQoTUFSS1VQX1NFVkVSSVRJRVNbMiAtIGVtcHR5RWxlbWVudFRhZ10pOwotCQl9Ci0JICAgIAotCSAgICBpbnQgZW5kVGFnV2l0aEF0dHJpYnV0ZXMgID0gbW9kZWxQcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTkRfVEFHX1dJVEhfQVRUUklCVVRFUyk7Ci0JICAgIAotCSAgICBpZiAoZkVuZFRhZ1dpdGhBdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkgICAgCWZFbmRUYWdXaXRoQXR0cmlidXRlcy5zZWxlY3QoMiAtIGVuZFRhZ1dpdGhBdHRyaWJ1dGVzKTsKLQkgICAgCWZFbmRUYWdXaXRoQXR0cmlidXRlcy5zZXRUZXh0KE1BUktVUF9TRVZFUklUSUVTWzIgLSBlbmRUYWdXaXRoQXR0cmlidXRlc10pOwotCQl9Ci0JICAgIAotCSAgICBpbnQgaW52YWxpZFdoaXRlc3BhY2VCZWZvcmVUYWduYW1lICA9IG1vZGVsUHJlZmVyZW5jZXMuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuV0hJVEVTUEFDRV9CRUZPUkVfVEFHTkFNRSk7Ci0JICAgIAotCSAgICBpZiAoZkludmFsaWRXaGl0ZXNwYWNlQmVmb3JlVGFnbmFtZSAhPSBudWxsKSB7Ci0JICAgIAlmSW52YWxpZFdoaXRlc3BhY2VCZWZvcmVUYWduYW1lLnNlbGVjdCgyIC0gaW52YWxpZFdoaXRlc3BhY2VCZWZvcmVUYWduYW1lKTsKLQkgICAgCWZJbnZhbGlkV2hpdGVzcGFjZUJlZm9yZVRhZ25hbWUuc2V0VGV4dChNQVJLVVBfU0VWRVJJVElFU1syIC0gaW52YWxpZFdoaXRlc3BhY2VCZWZvcmVUYWduYW1lXSk7Ci0JCX0KLQkgICAgCi0JICAgIGludCBtaXNzaW5nQ2xvc2luZ0JyYWNrZXQgID0gbW9kZWxQcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX0NMT1NJTkdfQlJBQ0tFVCk7Ci0JICAgIAotCSAgICBpZiAoZk1pc3NpbmdDbG9zaW5nQnJhY2tldCAhPSBudWxsKSB7Ci0JICAgIAlmTWlzc2luZ0Nsb3NpbmdCcmFja2V0LnNlbGVjdCgyIC0gbWlzc2luZ0Nsb3NpbmdCcmFja2V0KTsKLQkgICAgCWZNaXNzaW5nQ2xvc2luZ0JyYWNrZXQuc2V0VGV4dChNQVJLVVBfU0VWRVJJVElFU1syIC0gbWlzc2luZ0Nsb3NpbmdCcmFja2V0XSk7Ci0JCX0KLQkgICAgCi0JICAgIGludCBtaXNzaW5nQ2xvc2luZ1F1b3RlICA9IG1vZGVsUHJlZmVyZW5jZXMuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTUlTU0lOR19DTE9TSU5HX1FVT1RFKTsKLQkgICAgCi0JICAgIGlmIChmTWlzc2luZ0Nsb3NpbmdRdW90ZSAhPSBudWxsKSB7Ci0JICAgIAlmTWlzc2luZ0Nsb3NpbmdRdW90ZS5zZWxlY3QoMiAtIG1pc3NpbmdDbG9zaW5nUXVvdGUpOwotCSAgICAJZk1pc3NpbmdDbG9zaW5nUXVvdGUuc2V0VGV4dChNQVJLVVBfU0VWRVJJVElFU1syIC0gbWlzc2luZ0Nsb3NpbmdRdW90ZV0pOwotCQl9Ci0JICAgIAotCSAgICBpbnQgbWlzc2luZ0VuZFRhZyAgPSBtb2RlbFByZWZlcmVuY2VzLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLk1JU1NJTkdfRU5EX1RBRyk7Ci0JICAgIAotCSAgICBpZiAoZk1pc3NpbmdFbmRUYWcgIT0gbnVsbCkgewotCSAgICAJZk1pc3NpbmdFbmRUYWcuc2VsZWN0KDIgLSBtaXNzaW5nRW5kVGFnKTsKLQkgICAgCWZNaXNzaW5nRW5kVGFnLnNldFRleHQoTUFSS1VQX1NFVkVSSVRJRVNbMiAtIG1pc3NpbmdFbmRUYWddKTsKLQkJfQotCSAgICAKLQkgICAgaW50IG1pc3NpbmdTdGFydFRhZyAgPSBtb2RlbFByZWZlcmVuY2VzLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLk1JU1NJTkdfU1RBUlRfVEFHKTsKLQkgICAgCi0JICAgIGlmIChmTWlzc2luZ1N0YXJ0VGFnICE9IG51bGwpIHsKLQkgICAgCWZNaXNzaW5nU3RhcnRUYWcuc2VsZWN0KDIgLSBtaXNzaW5nU3RhcnRUYWcpOwotCSAgICAJZk1pc3NpbmdTdGFydFRhZy5zZXRUZXh0KE1BUktVUF9TRVZFUklUSUVTWzIgLSBtaXNzaW5nU3RhcnRUYWddKTsKLQkJfQotCSAgICAKLQkgICAgaW50IG1pc3NpbmdRdW90ZXMgID0gbW9kZWxQcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX1FVT1RFUyk7Ci0JICAgIAotCSAgICBpZiAoZk1pc3NpbmdRdW90ZXMgIT0gbnVsbCkgewotCSAgICAJZk1pc3NpbmdRdW90ZXMuc2VsZWN0KDIgLSBtaXNzaW5nUXVvdGVzKTsKLQkgICAgCWZNaXNzaW5nUXVvdGVzLnNldFRleHQoTUFSS1VQX1NFVkVSSVRJRVNbMiAtIG1pc3NpbmdRdW90ZXNdKTsKLQkJfQotCSAgICAKLQkgICAgaW50IGludmFsaWROYW1lc3BhY2VJblBJICA9IG1vZGVsUHJlZmVyZW5jZXMuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTkFNRVNQQUNFX0lOX1BJX1RBUkdFVCk7Ci0JICAgIAotCSAgICBpZiAoZkludmFsaWROYW1lc3BhY2VJblBJICE9IG51bGwpIHsKLQkgICAgCWZJbnZhbGlkTmFtZXNwYWNlSW5QSS5zZWxlY3QoMiAtIGludmFsaWROYW1lc3BhY2VJblBJKTsKLQkgICAgCWZJbnZhbGlkTmFtZXNwYWNlSW5QSS5zZXRUZXh0KE1BUktVUF9TRVZFUklUSUVTWzIgLSBpbnZhbGlkTmFtZXNwYWNlSW5QSV0pOwotCQl9Ci0JICAgIAotCSAgICBpbnQgdGFnTmFtZU1pc3NpbmcgID0gbW9kZWxQcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX1RBR19OQU1FKTsKLQkgICAgCi0JICAgIGlmIChmTWlzc2luZ1RhZ05hbWUgIT0gbnVsbCkgewotCSAgICAJZk1pc3NpbmdUYWdOYW1lLnNlbGVjdCgyIC0gdGFnTmFtZU1pc3NpbmcpOwotCSAgICAJZk1pc3NpbmdUYWdOYW1lLnNldFRleHQoTUFSS1VQX1NFVkVSSVRJRVNbMiAtIHRhZ05hbWVNaXNzaW5nXSk7Ci0JCX0KLQkgICAgCi0JICAgIGludCBpbnZhbGlkV2hpdGVzcGFjZUF0U3RhcnQgID0gbW9kZWxQcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5XSElURVNQQUNFX0FUX1NUQVJUKTsKLQkgICAgCi0JICAgIGlmIChmSW52YWxpZFdoaXRlc3BhY2VBdFN0YXJ0ICE9IG51bGwpIHsKLQkgICAgCWZJbnZhbGlkV2hpdGVzcGFjZUF0U3RhcnQuc2VsZWN0KDIgLSBpbnZhbGlkV2hpdGVzcGFjZUF0U3RhcnQpOwotCSAgICAJZkludmFsaWRXaGl0ZXNwYWNlQXRTdGFydC5zZXRUZXh0KE1BUktVUF9TRVZFUklUSUVTWzIgLSBpbnZhbGlkV2hpdGVzcGFjZUF0U3RhcnRdKTsKLQkJfQotCi0JICAgIGlmICghdXNlRXh0ZW5kZWRNYXJrdXBWYWxpZGF0aW9uKQotCSAgICAJZk1hcmt1cFN0YXRlID0gQ29udHJvbEVuYWJsZVN0YXRlLmRpc2FibGUoZk1hcmt1cFZhbGlkYXRpb25Hcm91cCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHNGb3JWYWxpZGF0aW5nR3JvdXAoKSB7Ci0gICAgUHJlZmVyZW5jZXMgbW9kZWxQcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLSAgICBpbnQgaW5kaWNhdGVOb0dyYW1tYXJCdXR0b25TZWxlY3RlZCA9IG1vZGVsUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklORElDQVRFX05PX0dSQU1NQVIpOwotICAgIGJvb2xlYW4gdXNlWEluY2x1ZGVCdXR0b25TZWxlY3RlZCA9IG1vZGVsUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VU0VfWElOQ0xVREUpOwotCi0gICAgaWYgKGZJbmRpY2F0ZU5vR3JhbW1hciAhPSBudWxsKSB7Ci0gICAgICBmSW5kaWNhdGVOb0dyYW1tYXIuc2V0U2VsZWN0aW9uKG5ldyBQb2ludChpbmRpY2F0ZU5vR3JhbW1hckJ1dHRvblNlbGVjdGVkLCAyIC0gaW5kaWNhdGVOb0dyYW1tYXJCdXR0b25TZWxlY3RlZCkpOwotICAgICAgZkluZGljYXRlTm9HcmFtbWFyLnNldFRleHQoU0VWRVJJVElFU1tpbmRpY2F0ZU5vR3JhbW1hckJ1dHRvblNlbGVjdGVkXSk7Ci0gICAgfQotICAgIGlmIChmVXNlWGluY2x1ZGUgIT0gbnVsbCkgewotICAgICAgZlVzZVhpbmNsdWRlLnNldFNlbGVjdGlvbih1c2VYSW5jbHVkZUJ1dHRvblNlbGVjdGVkKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGhvbm91ckFsbEJ1dHRvblNlbGVjdGVkID0gbW9kZWxQcmVmZXJlbmNlcy5nZXREZWZhdWx0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUyk7Ci0gICAgaWYgKGZIb25vdXJBbGxTY2hlbWFMb2NhdGlvbnMgIT0gbnVsbCkgewotICAgICAgZkhvbm91ckFsbFNjaGVtYUxvY2F0aW9ucy5zZXRTZWxlY3Rpb24oaG9ub3VyQWxsQnV0dG9uU2VsZWN0ZWQpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzRm9yTWFya3VwVmFsaWRhdGlvbkdyb3VwKCkgewotCSAgUHJlZmVyZW5jZXMgbW9kZWxQcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkgICAgYm9vbGVhbiB1c2VFeHRlbmRlZE1hcmt1cFZhbGlkYXRpb24gPSBtb2RlbFByZWZlcmVuY2VzLmdldERlZmF1bHRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTUFSS1VQX1ZBTElEQVRJT04pOwotCi0JICAgIAotCSAgICBpZiAoZkV4dGVuZGVkTWFya3VwVmFsaWRhdGlvbiAhPSBudWxsKSB7Ci0JICAgIAlpZiAoZkV4dGVuZGVkTWFya3VwVmFsaWRhdGlvbi5nZXRTZWxlY3Rpb24oKSAhPSB1c2VFeHRlbmRlZE1hcmt1cFZhbGlkYXRpb24pIHsKLQkgICAgCQloYW5kbGVNYXJrdXBTZXZlcml0eVNlbGVjdGlvbih1c2VFeHRlbmRlZE1hcmt1cFZhbGlkYXRpb24pOwotCSAgICAJfQotCSAgICAJZkV4dGVuZGVkTWFya3VwVmFsaWRhdGlvbi5zZXRTZWxlY3Rpb24odXNlRXh0ZW5kZWRNYXJrdXBWYWxpZGF0aW9uKTsKLQkgICAgCQotCSAgICB9Ci0JICAgIGludCBlbXB0eUVsZW1lbnRUYWcgPSBtb2RlbFByZWZlcmVuY2VzLmdldERlZmF1bHRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfSEFTX05PX1ZBTFVFKTsKLQkgICAgCi0JICAgIGlmIChmRW1wdHlFbGVtZW50VGFnICE9IG51bGwpIHsKLQkgICAgCWZFbXB0eUVsZW1lbnRUYWcuc2V0U2VsZWN0aW9uKG5ldyBQb2ludChlbXB0eUVsZW1lbnRUYWcsMiAtIGVtcHR5RWxlbWVudFRhZykpOwotCSAgICAJZkVtcHR5RWxlbWVudFRhZy5zZXRUZXh0KE1BUktVUF9TRVZFUklUSUVTWzIgLSBlbXB0eUVsZW1lbnRUYWddKTsKLQkJfQotCSAgICAKLQkgICAgaW50IGVuZFRhZ1dpdGhBdHRyaWJ1dGVzICA9IG1vZGVsUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVORF9UQUdfV0lUSF9BVFRSSUJVVEVTKTsKLQkgICAgCi0JICAgIGlmIChmRW5kVGFnV2l0aEF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCSAgICAJZkVuZFRhZ1dpdGhBdHRyaWJ1dGVzLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoZW5kVGFnV2l0aEF0dHJpYnV0ZXMsMiAtIGVuZFRhZ1dpdGhBdHRyaWJ1dGVzKSk7Ci0JICAgIAlmRW5kVGFnV2l0aEF0dHJpYnV0ZXMuc2V0VGV4dChNQVJLVVBfU0VWRVJJVElFU1syIC0gZW5kVGFnV2l0aEF0dHJpYnV0ZXNdKTsKLQkJfQotCSAgICAKLQkgICAgaW50IGludmFsaWRXaGl0ZXNwYWNlQmVmb3JlVGFnbmFtZSAgPSBtb2RlbFByZWZlcmVuY2VzLmdldERlZmF1bHRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5XSElURVNQQUNFX0JFRk9SRV9UQUdOQU1FKTsKLQkgICAgCi0JICAgIGlmIChmSW52YWxpZFdoaXRlc3BhY2VCZWZvcmVUYWduYW1lICE9IG51bGwpIHsKLQkgICAgCWZJbnZhbGlkV2hpdGVzcGFjZUJlZm9yZVRhZ25hbWUuc2V0U2VsZWN0aW9uKG5ldyBQb2ludChpbnZhbGlkV2hpdGVzcGFjZUJlZm9yZVRhZ25hbWUsMiAtIGludmFsaWRXaGl0ZXNwYWNlQmVmb3JlVGFnbmFtZSkpOwotCSAgICAJZkludmFsaWRXaGl0ZXNwYWNlQmVmb3JlVGFnbmFtZS5zZXRUZXh0KE1BUktVUF9TRVZFUklUSUVTWzIgLSBpbnZhbGlkV2hpdGVzcGFjZUJlZm9yZVRhZ25hbWVdKTsKLQkJfQotCSAgICAKLQkgICAgaW50IG1pc3NpbmdDbG9zaW5nQnJhY2tldCAgPSBtb2RlbFByZWZlcmVuY2VzLmdldERlZmF1bHRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX0NMT1NJTkdfQlJBQ0tFVCk7Ci0JICAgIAotCSAgICBpZiAoZk1pc3NpbmdDbG9zaW5nQnJhY2tldCAhPSBudWxsKSB7Ci0JICAgIAlmTWlzc2luZ0Nsb3NpbmdCcmFja2V0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQobWlzc2luZ0Nsb3NpbmdCcmFja2V0LDIgLSBtaXNzaW5nQ2xvc2luZ0JyYWNrZXQpKTsKLQkgICAgCWZNaXNzaW5nQ2xvc2luZ0JyYWNrZXQuc2V0VGV4dChNQVJLVVBfU0VWRVJJVElFU1syIC0gbWlzc2luZ0Nsb3NpbmdCcmFja2V0XSk7Ci0JCX0KLQkgICAgCi0JICAgIGludCBtaXNzaW5nQ2xvc2luZ1F1b3RlICA9IG1vZGVsUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLk1JU1NJTkdfQ0xPU0lOR19RVU9URSk7Ci0JICAgIAotCSAgICBpZiAoZk1pc3NpbmdDbG9zaW5nUXVvdGUgIT0gbnVsbCkgewotCSAgICAJZk1pc3NpbmdDbG9zaW5nUXVvdGUuc2V0U2VsZWN0aW9uKG5ldyBQb2ludChtaXNzaW5nQ2xvc2luZ1F1b3RlLDIgLSBtaXNzaW5nQ2xvc2luZ1F1b3RlKSk7Ci0JICAgIAlmTWlzc2luZ0Nsb3NpbmdRdW90ZS5zZXRUZXh0KE1BUktVUF9TRVZFUklUSUVTWzIgLSBtaXNzaW5nQ2xvc2luZ1F1b3RlXSk7Ci0JCX0KLQkgICAgCi0JICAgIGludCBtaXNzaW5nRW5kVGFnICA9IG1vZGVsUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLk1JU1NJTkdfRU5EX1RBRyk7Ci0JICAgIAotCSAgICBpZiAoZk1pc3NpbmdFbmRUYWcgIT0gbnVsbCkgewotCSAgICAJZk1pc3NpbmdFbmRUYWcuc2V0U2VsZWN0aW9uKG5ldyBQb2ludChtaXNzaW5nRW5kVGFnLDIgLSBtaXNzaW5nRW5kVGFnKSk7Ci0JICAgIAlmTWlzc2luZ0VuZFRhZy5zZXRUZXh0KE1BUktVUF9TRVZFUklUSUVTWzIgLSBtaXNzaW5nRW5kVGFnXSk7Ci0JCX0KLQkgICAgCi0JICAgIGludCBtaXNzaW5nU3RhcnRUYWcgID0gbW9kZWxQcmVmZXJlbmNlcy5nZXREZWZhdWx0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTUlTU0lOR19TVEFSVF9UQUcpOwotCSAgICAKLQkgICAgaWYgKGZNaXNzaW5nU3RhcnRUYWcgIT0gbnVsbCkgewotCSAgICAJZk1pc3NpbmdTdGFydFRhZy5zZXRTZWxlY3Rpb24obmV3IFBvaW50KG1pc3NpbmdTdGFydFRhZywyIC0gbWlzc2luZ1N0YXJ0VGFnKSk7Ci0JICAgIAlmTWlzc2luZ1N0YXJ0VGFnLnNldFRleHQoTUFSS1VQX1NFVkVSSVRJRVNbMiAtIG1pc3NpbmdTdGFydFRhZ10pOwotCQl9Ci0JICAgIAotCSAgICBpbnQgbWlzc2luZ1F1b3RlcyAgPSBtb2RlbFByZWZlcmVuY2VzLmdldERlZmF1bHRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX1FVT1RFUyk7Ci0JICAgIAotCSAgICBpZiAoZk1pc3NpbmdRdW90ZXMgIT0gbnVsbCkgewotCSAgICAJZk1pc3NpbmdRdW90ZXMuc2V0U2VsZWN0aW9uKG5ldyBQb2ludChtaXNzaW5nUXVvdGVzLDIgLSBtaXNzaW5nUXVvdGVzKSk7Ci0JICAgIAlmTWlzc2luZ1F1b3Rlcy5zZXRUZXh0KE1BUktVUF9TRVZFUklUSUVTWzIgLSBtaXNzaW5nUXVvdGVzXSk7Ci0JCX0KLQkgICAgCi0JICAgIGludCBpbnZhbGlkTmFtZXNwYWNlSW5QSSAgPSBtb2RlbFByZWZlcmVuY2VzLmdldERlZmF1bHRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5OQU1FU1BBQ0VfSU5fUElfVEFSR0VUKTsKLQkgICAgCi0JICAgIGlmIChmSW52YWxpZE5hbWVzcGFjZUluUEkgIT0gbnVsbCkgewotCSAgICAJZkludmFsaWROYW1lc3BhY2VJblBJLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoaW52YWxpZE5hbWVzcGFjZUluUEksMiAtIGludmFsaWROYW1lc3BhY2VJblBJKSk7Ci0JICAgIAlmSW52YWxpZE5hbWVzcGFjZUluUEkuc2V0VGV4dChNQVJLVVBfU0VWRVJJVElFU1syIC0gaW52YWxpZE5hbWVzcGFjZUluUEldKTsKLQkJfQotCSAgICAKLQkgICAgaW50IHRhZ05hbWVNaXNzaW5nICA9IG1vZGVsUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLk1JU1NJTkdfVEFHX05BTUUpOwotCSAgICAKLQkgICAgaWYgKGZNaXNzaW5nVGFnTmFtZSAhPSBudWxsKSB7Ci0JICAgIAlmTWlzc2luZ1RhZ05hbWUuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCh0YWdOYW1lTWlzc2luZywyIC0gdGFnTmFtZU1pc3NpbmcpKTsKLQkgICAgCWZNaXNzaW5nVGFnTmFtZS5zZXRUZXh0KE1BUktVUF9TRVZFUklUSUVTWzIgLSB0YWdOYW1lTWlzc2luZ10pOwotCQl9Ci0JICAgIAotCSAgICBpbnQgaW52YWxpZFdoaXRlc3BhY2VBdFN0YXJ0ICA9IG1vZGVsUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLldISVRFU1BBQ0VfQVRfU1RBUlQpOwotCSAgICAKLQkgICAgaWYgKGZJbnZhbGlkV2hpdGVzcGFjZUF0U3RhcnQgIT0gbnVsbCkgewotCSAgICAJZkludmFsaWRXaGl0ZXNwYWNlQXRTdGFydC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KGludmFsaWRXaGl0ZXNwYWNlQXRTdGFydCwyIC0gaW52YWxpZFdoaXRlc3BhY2VBdFN0YXJ0KSk7Ci0JICAgIAlmSW52YWxpZFdoaXRlc3BhY2VBdFN0YXJ0LnNldFRleHQoTUFSS1VQX1NFVkVSSVRJRVNbMiAtIGludmFsaWRXaGl0ZXNwYWNlQXRTdGFydF0pOwotCQl9Ci0JICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXNGb3JWYWxpZGF0aW5nR3JvdXAoKQotICB7Ci0gICAgUHJlZmVyZW5jZXMgbW9kZWxQcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLSAgICBpZiAoZkluZGljYXRlTm9HcmFtbWFyICE9IG51bGwpIHsKLSAgICAgIGludCB3YXJuTm9HcmFtbWFyQnV0dG9uU2VsZWN0ZWQgPSAyIC0gZkluZGljYXRlTm9HcmFtbWFyLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICBtb2RlbFByZWZlcmVuY2VzLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ESUNBVEVfTk9fR1JBTU1BUiwgd2Fybk5vR3JhbW1hckJ1dHRvblNlbGVjdGVkKTsKLSAgICB9Ci0gICAgaWYgKGZVc2VYaW5jbHVkZSAhPSBudWxsKSB7Ci0gICAgICBib29sZWFuIHVzZVhJbmNsdWRlQnV0dG9uU2VsZWN0ZWQgPSBmVXNlWGluY2x1ZGUuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBtb2RlbFByZWZlcmVuY2VzLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVNFX1hJTkNMVURFLCB1c2VYSW5jbHVkZUJ1dHRvblNlbGVjdGVkKTsKLSAgICB9Ci0gICAgaWYgKGZIb25vdXJBbGxTY2hlbWFMb2NhdGlvbnMgIT0gbnVsbCkgewotICAgICAgYm9vbGVhbiBob25vdXJBbGxCdXR0b25TZWxlY3RlZCA9IGZIb25vdXJBbGxTY2hlbWFMb2NhdGlvbnMuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBtb2RlbFByZWZlcmVuY2VzLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TLCBob25vdXJBbGxCdXR0b25TZWxlY3RlZCk7Ci0gICAgfQotICB9Ci0gIHByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzRm9yTWFya3VwVmFsaWRhdGlvbkdyb3VwKCkKLSAgewotICAgIFByZWZlcmVuY2VzIG1vZGVsUHJlZmVyZW5jZXMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0gICAgaWYgKGZFeHRlbmRlZE1hcmt1cFZhbGlkYXRpb24gIT0gbnVsbCkgewotICAgICAgICBib29sZWFuIGV4dGVuZGVkTWFya3VwVmFsaWRhdGlvbiA9IGZFeHRlbmRlZE1hcmt1cFZhbGlkYXRpb24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIG1vZGVsUHJlZmVyZW5jZXMuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NQVJLVVBfVkFMSURBVElPTiwgZXh0ZW5kZWRNYXJrdXBWYWxpZGF0aW9uKTsKLSAgICB9Ci0gICAgaWYgKGZFbXB0eUVsZW1lbnRUYWcgIT0gbnVsbCkgewotICAgICAgaW50IGVtcHR5RWxlbWVudFRhZyA9IDIgLSBmRW1wdHlFbGVtZW50VGFnLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICBtb2RlbFByZWZlcmVuY2VzLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX0hBU19OT19WQUxVRSwgZW1wdHlFbGVtZW50VGFnKTsKLSAgICB9Ci0gICAgaWYgKGZFbmRUYWdXaXRoQXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgIGludCBlbmRUYWdXaXRoQXR0cmlidXRlcyA9IDIgLSBmRW5kVGFnV2l0aEF0dHJpYnV0ZXMuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgbW9kZWxQcmVmZXJlbmNlcy5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVORF9UQUdfV0lUSF9BVFRSSUJVVEVTLCBlbmRUYWdXaXRoQXR0cmlidXRlcyk7Ci0gICAgfQotICAgIGlmIChmSW52YWxpZFdoaXRlc3BhY2VCZWZvcmVUYWduYW1lICE9IG51bGwpIHsKLSAgICAgICAgaW50IGludmFsaWRXaGl0ZXNwYWNlQmVmb3JlVGFnbmFtZSA9IDIgLSBmSW52YWxpZFdoaXRlc3BhY2VCZWZvcmVUYWduYW1lLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgIG1vZGVsUHJlZmVyZW5jZXMuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5XSElURVNQQUNFX0JFRk9SRV9UQUdOQU1FLCBpbnZhbGlkV2hpdGVzcGFjZUJlZm9yZVRhZ25hbWUpOwotICAgIH0KLSAgICBpZiAoZk1pc3NpbmdDbG9zaW5nQnJhY2tldCAhPSBudWxsKSB7Ci0gICAgICAgICAgaW50IG1pc3NpbmdDbG9zaW5nQnJhY2tldCA9IDIgLSBmTWlzc2luZ0Nsb3NpbmdCcmFja2V0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgICAgbW9kZWxQcmVmZXJlbmNlcy5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLk1JU1NJTkdfQ0xPU0lOR19CUkFDS0VULCBtaXNzaW5nQ2xvc2luZ0JyYWNrZXQpOwotICAgIH0KLSAgICBpZiAoZk1pc3NpbmdDbG9zaW5nUXVvdGUgIT0gbnVsbCkgewotICAgICAgICBpbnQgbWlzc2luZ0Nsb3NpbmdRdW90ZSA9IDIgLSBmTWlzc2luZ0Nsb3NpbmdRdW90ZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICBtb2RlbFByZWZlcmVuY2VzLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTUlTU0lOR19DTE9TSU5HX0JSQUNLRVQsIG1pc3NpbmdDbG9zaW5nUXVvdGUpOwotICAgIH0KLSAgICBpZiAoZk1pc3NpbmdFbmRUYWcgIT0gbnVsbCkgewotICAgICAgICBpbnQgbWlzc2luZ0VuZFRhZyA9IDIgLSBmTWlzc2luZ0VuZFRhZy5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICBtb2RlbFByZWZlcmVuY2VzLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTUlTU0lOR19FTkRfVEFHLCBtaXNzaW5nRW5kVGFnKTsKLSAgICAgICAgbW9kZWxQcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX0VORF9UQUcpOwotICAgIH0KLQlpZiAoZk1pc3NpbmdTdGFydFRhZyAhPSBudWxsKSB7Ci0gICAgICAgIGludCBtaXNzaW5nU3RhcnRUYWcgPSAyIC0gZk1pc3NpbmdTdGFydFRhZy5nZXRTZWxlY3Rpb25JbmRleCgpOwotCSAgICBtb2RlbFByZWZlcmVuY2VzLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTUlTU0lOR19TVEFSVF9UQUcsIG1pc3NpbmdTdGFydFRhZyk7Ci0JfQotCWlmIChmTWlzc2luZ1F1b3RlcyAhPSBudWxsKSB7Ci0gICAgICAgIGludCBtaXNzaW5nUXVvdGVzID0gMiAtIGZNaXNzaW5nUXVvdGVzLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JICAgIG1vZGVsUHJlZmVyZW5jZXMuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX1FVT1RFUywgbWlzc2luZ1F1b3Rlcyk7Ci0JfQotCWlmIChmSW52YWxpZE5hbWVzcGFjZUluUEkgIT0gbnVsbCkgewotICAgICAgICBpbnQgaW52YWxpZE5hbWVzcGFjZUluUEkgPSAyIC0gZkludmFsaWROYW1lc3BhY2VJblBJLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JICAgIG1vZGVsUHJlZmVyZW5jZXMuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5OQU1FU1BBQ0VfSU5fUElfVEFSR0VULCBpbnZhbGlkTmFtZXNwYWNlSW5QSSk7Ci0JfQotCWlmIChmTWlzc2luZ1RhZ05hbWUgIT0gbnVsbCkgewotICAgICAgICBpbnQgbWlzc2luZ1RhZ05hbWUgPSAyIC0gZk1pc3NpbmdUYWdOYW1lLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JICAgIG1vZGVsUHJlZmVyZW5jZXMuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5NSVNTSU5HX1RBR19OQU1FLCBtaXNzaW5nVGFnTmFtZSk7Ci0JfQotCWlmIChmSW52YWxpZFdoaXRlc3BhY2VBdFN0YXJ0ICE9IG51bGwpIHsKLSAgICAgICAgaW50IGludmFsaWRXaGl0ZXNwYWNlQXRTdGFydCA9IDIgLSBmSW52YWxpZFdoaXRlc3BhY2VBdFN0YXJ0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JICAgIG1vZGVsUHJlZmVyZW5jZXMuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5XSElURVNQQUNFX0FUX1NUQVJULCBpbnZhbGlkV2hpdGVzcGFjZUF0U3RhcnQpOwotCX0KLSAgICAKLSAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0gICAgc3RvcmVWYWx1ZXNGb3JWYWxpZGF0aW5nR3JvdXAoKTsKLSAgICBzdG9yZVZhbHVlc0Zvck1hcmt1cFZhbGlkYXRpb25Hcm91cCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotICAgIHBlcmZvcm1EZWZhdWx0c0ZvclZhbGlkYXRpbmdHcm91cCgpOwotICAgIHBlcmZvcm1EZWZhdWx0c0Zvck1hcmt1cFZhbGlkYXRpb25Hcm91cCgpOwotICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLSAgICByZXR1cm4gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLSAgfSAgCi0gIAotICBwcm90ZWN0ZWQgdm9pZCBkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKSB7Ci0gICAgICBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IHN1cGVyLnBlcmZvcm1PaygpOwotCi0gICAgZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9YTUxDb21tZW50Rm9sZGluZ1Bvc2l0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9YTUxDb21tZW50Rm9sZGluZ1Bvc2l0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NzQwZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vWE1MQ29tbWVudEZvbGRpbmdQb3NpdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5BYnN0cmFjdFN0cnVjdHVyZWRDb21tZW50Rm9sZGluZ1Bvc2l0aW9uOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb21tZW50Rm9sZGluZ1Bvc2l0aW9uIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkQ29tbWVudEZvbGRpbmdQb3NpdGlvbiB7Ci0KLQkvKioKLQkgKiBUaGUgcmVnaW9uIGNvdmVyaW5nIGFuIFhNTCBjb21tZW50Ci0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZSZWdpb247Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZm9sZGluZyBwb3NpdGlvbiB0byBjb3ZlciBhIFhNTCBjb21tZW50IHJlZ2lvbgotCSAqIAotCSAqIEBwYXJhbSByZWdpb24KLQkgKi8KLQlwdWJsaWMgWE1MQ29tbWVudEZvbGRpbmdQb3NpdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQkvL2Nhbid0IHVzZSByZWdpb24uZ2V0TGVuZ3RoIGhlcmUgYmVjYXVzZSBkb2Vzbid0IHdvcmsgaW4gRFREIGRvY3MgZm9yIHNvbWUgcmVhc29uCi0JCXN1cGVyKHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCByZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSByZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCXRoaXMuZlJlZ2lvbiA9IHJlZ2lvbjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uQWJzdHJhY3RTdHJ1Y3R1cmVkQ29tbWVudEZvbGRpbmdQb3NpdGlvbiNnZXRFbmRPZmZzZXQoKQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZlJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5BYnN0cmFjdFN0cnVjdHVyZWRDb21tZW50Rm9sZGluZ1Bvc2l0aW9uI2dldFN0YXJ0T2Zmc2V0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gZlJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vWE1MRWxlbWVudEZvbGRpbmdQb3NpdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vWE1MRWxlbWVudEZvbGRpbmdQb3NpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzNlMzAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1hNTEVsZW1lbnRGb2xkaW5nUG9zaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uQWJzdHJhY3RTdHJ1Y3R1cmVkRm9sZGluZ1Bvc2l0aW9uOwotCi0vKioKLSAqIEZvbGRzIGFuIFhNTCBlbGVtZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFbGVtZW50Rm9sZGluZ1Bvc2l0aW9uIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkRm9sZGluZ1Bvc2l0aW9uIHsKLQotCS8qKgotCSAqIFRoZSByZWdpb24gcmVwcmVzZW50aW5nIHRoZSBzdGFydCBvZiB0aGUgZm9sZGluZyByZWdpb24KLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZlN0YXJ0UmVnaW9uOwotCQotCS8qKgotCSAqIFRoZSByZWdpb24gcmVwcmVzZW50aW5nIHRoZSBlbmQgb2YgdGhlIGZvbGRpbmcgcmVnaW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIHRoZSBlbnRpcmUgZm9sZGluZyByZWdpb24gaXMgcmVwcmVzZW50ZWQgYnkgPGNvZGU+ZlN0YXJ0UmVnaW9uPC9jb2RlPgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmRW5kUmVnaW9uOwotCQotCS8qKgotCSAqIDxwPlVzZWQgdG8gcmVwcmVzZW50IGEgZm9sZGluZyBwb3NpdGlvbiB0aGF0IGNvdmVycyBhIHNpbmdsZQotCSAqIHtAbGluayBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9ufS48L3A+Ci0JICogCi0JICogQHBhcmFtIHJlZ2lvbiB0aGUgcmVnaW9uIHRoYXQgY292ZXJzIHRoZSBlbnRpcmUgcG9zaXRpb24gb2YgdGhlIGZvbGRpbmcgcmVnaW9uCi0JICovCi0JcHVibGljIFhNTEVsZW1lbnRGb2xkaW5nUG9zaXRpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJc3VwZXIocmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIHJlZ2lvbi5nZXRFbmRPZmZzZXQoKS1yZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCXRoaXMuZlN0YXJ0UmVnaW9uID0gcmVnaW9uOwotCQl0aGlzLmZFbmRSZWdpb24gPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiA8cD5Vc2VkIHRvIHJlcHJlc2VudCBhIGZvbGRpbmcgcG9zaXRpb24gdGhhdCBjb3ZlcnMgbW9yZSB0aGVuIG9uZQotCSAqIHtAbGluayBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9ufS48L3A+Ci0JICogCi0JICogQHBhcmFtIHN0YXJ0UmVnaW9uIHRoZSBmaXJzdCByZWdpb24gY292ZXJlZCBieSB0aGlzIHBvc2l0aW9uCi0JICogQHBhcmFtIGVuZFJlZ2lvbiB0aGUgbGFzdCByZWdpb24gY292ZXJlZCBieSB0aGlzIHBvc2l0aW9uCi0JICovCi0JcHVibGljIFhNTEVsZW1lbnRGb2xkaW5nUG9zaXRpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRSZWdpb24pIHsKLQkJc3VwZXIoc3RhcnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgZW5kUmVnaW9uLmdldEVuZE9mZnNldCgpLXN0YXJ0UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQl0aGlzLmZTdGFydFJlZ2lvbiA9IHN0YXJ0UmVnaW9uOwotCQl0aGlzLmZFbmRSZWdpb24gPSBlbmRSZWdpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uQWJzdHJhY3RTdHJ1Y3R1cmVkRm9sZGluZ1Bvc2l0aW9uI2dldFN0YXJ0T2Zmc2V0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gZlN0YXJ0UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLkFic3RyYWN0U3RydWN0dXJlZEZvbGRpbmdQb3NpdGlvbiNnZXRFbmRPZmZzZXQoKQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlpbnQgZW5kT2Zmc2V0OwotCQlpZihmRW5kUmVnaW9uICE9IG51bGwpIHsKLQkJCWVuZE9mZnNldCA9IGZFbmRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCX0gZWxzZSB7Ci0JCQllbmRPZmZzZXQgPSBmU3RhcnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGVuZE9mZnNldDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vWE1MRm9sZGluZ1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9YTUxGb2xkaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3ZjlkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9YTUxGb2xkaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5BYnN0cmFjdFN0cnVjdHVyZWRGb2xkaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNvbW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTVRleHQ7Ci0KLQotLyoqCi0gKiBBIGZvbGRpbmcgc3RyYXRlZ3kgZm9yIFhNTCB0eXBlIHN0cnVjdHVyZWQgZG9jdW1lbnRzLgotICogU2VlIEFic3RyYWN0U3RydWN0dXJlZEZvbGRpbmdTdHJhdGVneSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi1wdWJsaWMgY2xhc3MgWE1MRm9sZGluZ1N0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkRm9sZGluZ1N0cmF0ZWd5IHsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZm9sZGluZyBzdHJhdGVneS4KLQkgKiBCZSBzdXJlIHRvIHNldCB0aGUgdmlld2VyIGFuZCBkb2N1bWVudCBhZnRlciBjcmVhdGlvbi4KLQkgKi8KLQlwdWJsaWMgWE1MRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLkFic3RyYWN0Rm9sZGluZ1N0cmF0ZWd5I2NhbGNOZXdGb2xkUG9zaXRpb24ob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb24pCi0JICovCi0JcHJvdGVjdGVkIFBvc2l0aW9uIGNhbGNOZXdGb2xkUG9zaXRpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uKSB7Ci0JCVBvc2l0aW9uIHJldFBvcyA9IG51bGw7Ci0JCQotCQkvL29ubHkgd2FudCB0byBmb2xkIHJlZ2lvbnMgb2YgdGhlIHZhbGlkIHR5cGUgYW5kIHdpdGggYSB2YWxpZCByYW5nZQotCQlpZihpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgPj0gMCAmJiBpbmRleGVkUmVnaW9uLmdldExlbmd0aCgpID49IDApIHsKLQkJCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpaW5kZXhlZFJlZ2lvbjsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFJlZ2lvbiA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkKLQkJCS8vaWYgdGhlIG5vZGUgaGFzIGFuIGVuZFJlZ2lvbiAoZW5kIHRhZykgdGhlbiBmb2xkaW5nIHJlZ2lvbiBpcwotCQkJLy8JYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCB0YWcKLQkJCS8vZWxzZSBpZiB0aGUgcmVnaW9uIGlzIGEgY29tbWVudAotCQkJLy9lbHNlIGlmIHRoZSByZWdpb24gaXMgb25seSBhbiBvcGVuIHRhZyBvciBhbiBvcGVuL2Nsb3NlIHRhZyB0aGVuIGRvbid0IGZvbGQgaXQKLQkJCWlmKHN0YXJ0UmVnaW9uICE9IG51bGwgJiYgZW5kUmVnaW9uICE9IG51bGwpIHsKLQkJCQlyZXRQb3MgPSBuZXcgWE1MRWxlbWVudEZvbGRpbmdQb3NpdGlvbihzdGFydFJlZ2lvbiwgZW5kUmVnaW9uKTsKLQkJCX0gZWxzZSBpZihzdGFydFJlZ2lvbiAhPSBudWxsICYmIGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBDb21tZW50SW1wbCkgewotCQkJCXJldFBvcyA9IG5ldyBYTUxDb21tZW50Rm9sZGluZ1Bvc2l0aW9uKHN0YXJ0UmVnaW9uKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHJldFBvczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5BYnN0cmFjdEZvbGRpbmdTdHJhdGVneSNpbmRleGVkUmVnaW9uVmFsaWRUeXBlKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluZGV4ZWRSZWdpb25WYWxpZFR5cGUoSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uKSB7Ci0JCXJldHVybiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIElET01Ob2RlKSAmJiAhKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBJRE9NVGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGJkOWY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0VudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBzaG91bGQgYmUgdXNlZCBmb3IgcHJvcGVydGllcyB3aGljaCByZXF1aXJlIGEgY29tYm8gYm94IGNlbGwKLSAqIGVkaXRvciBhbmQgd2hvc2UgdmFsdWVzIGNvbnNpc3Qgb2YgYSBsaXN0IG9mIGVudW1lcmF0ZWQgc3RyaW5ncy4KLSAqLwotcHVibGljIGNsYXNzIEVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IgZXh0ZW5kcyBQcm9wZXJ0eURlc2NyaXB0b3IgewotCXByb3RlY3RlZCBTdHJpbmdDb21ib0JveENlbGxFZGl0b3IgZkVkaXRvcjsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGZQYXJlbnQ7Ci0KLQkvKioKLQkgKiBUaGUgZW51bWVyYXRlZCBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBkZXNjcmliZWQgcHJvcGVydHkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZWYWx1ZXNbXSA9IG51bGw7Ci0KLQlwdWJsaWMgRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3QgaWQsIFN0cmluZyBuZXdEaXNwbGF5TmFtZSwgU3RyaW5nW10gdmFsdWVzQXJyYXkpIHsKLQkJc3VwZXIoaWQsIG5ld0Rpc3BsYXlOYW1lKTsKLQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZykgaWQpOwotCQlmVmFsdWVzID0gdmFsdWVzQXJyYXk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBjZWxsIGVkaXRvciBmb3IgZWRpdGluZyB0aGlzIHByb3BlcnR5LgotCSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBlZGl0YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHdpZGdldCBmb3IgdGhlIGNlbGwgZWRpdG9yCi0JICogQHJldHVybiB0aGUgY2VsbCBlZGl0b3IgZm9yIHRoaXMgcHJvcGVydHksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICAgICAgICB0aGlzIHByb3BlcnR5IGNhbm5vdCBiZSBlZGl0ZWQKLQkgKi8KLQlwdWJsaWMgQ2VsbEVkaXRvciBjcmVhdGVQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBDZWxsIEVkaXRvciB3aXRoIGEgdmFsaWQgQ29udHJvbAotCQkvLyB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50LgotCQkvLyBJZiBhbnkgb2YgdGhhdCdzIG5vdCB0cnVlLCBjcmVhdGUgYW5kIHJldHVybiBhIG5ldyBDZWxsIEVkaXRvcgotCQlpZiAoKGZFZGl0b3IgPT0gbnVsbCkgfHwgKGZFZGl0b3IuZ2V0Q29udHJvbCgpID09IG51bGwpIHx8IGZFZGl0b3IuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSB8fCAocGFyZW50ICE9IGZQYXJlbnQpKSB7Ci0JCQlmRWRpdG9yID0gbmV3IFN0cmluZ0NvbWJvQm94Q2VsbEVkaXRvcihwYXJlbnQsIGZWYWx1ZXMpOwotCQl9Ci0JCWZQYXJlbnQgPSBwYXJlbnQ7Ci0JCXJldHVybiBmRWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZVZhbHVlcyhTdHJpbmcgbmV3VmFsdWVzW10pIHsKLQkJaWYgKEFycmF5cy5lcXVhbHMoZlZhbHVlcywgbmV3VmFsdWVzKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZWYWx1ZXMgPSBuZXdWYWx1ZXM7Ci0JCWlmIChmRWRpdG9yICE9IG51bGwpIHsKLQkJCWZFZGl0b3Iuc2V0SXRlbXMobmV3VmFsdWVzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1N0cmluZ0NvbWJvQm94Q2VsbEVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NTM2YmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotLyoqCi0gKiBBbiBleHRlbmRlZCBDb21ib0JveENlbGxFZGl0b3IgdGhhdCBzZWxlY3RzIGFuZCByZXR1cm5zIFN0cmluZ3MKLSAqLwotCi1wdWJsaWMgY2xhc3MgU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yIGV4dGVuZHMgQ29tYm9Cb3hDZWxsRWRpdG9yIHsKLQlwcml2YXRlIGJvb2xlYW4gZlNldHRpbmdWYWx1ZSA9IGZhbHNlOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0NvbWJvQm94Q2VsbEVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGl0ZW1zCi0JICovCi0JcHVibGljIFN0cmluZ0NvbWJvQm94Q2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmdbXSBpdGVtcykgewotCQlzdXBlcihwYXJlbnQsIGl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGl0ZW1zCi0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIFN0cmluZ0NvbWJvQm94Q2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmdbXSBpdGVtcywgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgaXRlbXMsIHN0eWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvR2V0VmFsdWUoKSB7Ci0JCS8vIG90aGVyd2lzZSBsaW1pdHMgdG8gc2V0IG9mIHZhbGlkIHZhbHVlcwotCQlPYmplY3QgaW5kZXggPSBzdXBlci5kb0dldFZhbHVlKCk7Ci0JCWludCBzZWxlY3Rpb24gPSAtMTsKLQkJaWYgKGluZGV4IGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJc2VsZWN0aW9uID0gKChJbnRlZ2VyKSBpbmRleCkuaW50VmFsdWUoKTsKLQkJfQotCQlpZiAoc2VsZWN0aW9uID49IDApIHsKLQkJCXJldHVybiBnZXRJdGVtcygpW3NlbGVjdGlvbl07Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0Q29udHJvbCgpIGluc3RhbmNlb2YgQ0NvbWJvKSB7Ci0JCQkvLyByZXRyaWV2ZSB0aGUgYWN0dWFsIHRleHQgYXMgdGhlIGxpc3Qgb2YgdmFsaWQgaXRlbXMgZG9lc24ndAotCQkJLy8gY29udGFpbiB0aGUgdmFsdWUKLQkJCXJldHVybiAoKENDb21ibykgZ2V0Q29udHJvbCgpKS5nZXRUZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9TZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJaWYgKGZTZXR0aW5nVmFsdWUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmU2V0dGluZ1ZhbHVlID0gdHJ1ZTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJc3VwZXIuZG9TZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSB2YWx1ZS50b1N0cmluZygpOwotCQkJaW50IHNlbGVjdGlvbiA9IC0xOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRJdGVtcygpLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGdldEl0ZW1zKClbaV0uZXF1YWxzKHN0cmluZ1ZhbHVlKSkgewotCQkJCQlzZWxlY3Rpb24gPSBpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzZWxlY3Rpb24gPj0gMCkgewotCQkJCXN1cGVyLmRvU2V0VmFsdWUobmV3IEludGVnZXIoc2VsZWN0aW9uKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdXBlci5kb1NldFZhbHVlKG5ldyBJbnRlZ2VyKC0xKSk7Ci0JCQkJaWYgKChnZXRDb250cm9sKCkgaW5zdGFuY2VvZiBDQ29tYm8pICYmICFzdHJpbmdWYWx1ZS5lcXVhbHMoKChDQ29tYm8pIGdldENvbnRyb2woKSkuZ2V0VGV4dCgpKSkgewotCQkJCQkvLyB1cGRhdGUgdGhlIFRleHQgd2lkZ2V0Ci0JCQkJCSgoQ0NvbWJvKSBnZXRDb250cm9sKCkpLnNldFRleHQoc3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmU2V0dGluZ1ZhbHVlID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXRlbXMoU3RyaW5nW10gbmV3SXRlbXMpIHsKLQkJaWYgKChnZXRDb250cm9sKCkgPT0gbnVsbCkgfHwgZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJBdHRlbXB0ZWQgdG8gdXBkYXRlIGl0ZW0gbGlzdCBmb3IgZGlzcG9zZWQgY2VsbCBlZGl0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8ga2VlcCBzZWxlY3Rpb24gaWYgcG9zc2libGUKLQkJT2JqZWN0IHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSA9IGdldFZhbHVlKCk7Ci0JCXN1cGVyLnNldEl0ZW1zKG5ld0l0ZW1zKTsKLQkJaWYgKChwcmV2aW91c1NlbGVjdGVkVmFsdWUgIT0gbnVsbCkgJiYgKGdldENvbnRyb2woKSBpbnN0YW5jZW9mIENDb21ibykpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3SXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAobmV3SXRlbXNbaV0uZXF1YWxzKHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSkpIHsKLQkJCQkJc2V0VmFsdWUocHJldmlvdXNTZWxlY3RlZFZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9YTUxQcm9wZXJ0eVNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvWE1MUHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDljMmVkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9YTUxQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01OYW1lZE5vZGVNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEFuIElQcm9wZXJ0eVNvdXJjZSBpbXBsZW1lbnRhdGlvbiBmb3IgYSBKRmFjZSB2aWV3ZXIgdXNlZCB0byBkaXNwbGF5Ci0gKiBwcm9wZXJ0aWVzIG9mIERPTSBub2Rlcy4KLSAqLwotcHVibGljIGNsYXNzIFhNTFByb3BlcnR5U291cmNlIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlLCBJUHJvcGVydHlTb3VyY2VFeHRlbnNpb24sIElQcm9wZXJ0eVNvdXJjZTIgewotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX0FUVFJJQlVURVMgPSBYTUxVSU1lc3NhZ2VzLlhNTFByb3BlcnR5U291cmNlQWRhcHRlcl8wOwotCi0JLyoqCi0JICogQ29udHJvbHMgd2hldGhlciBvcHRpb25hbCBhdHRyaWJ1dGVzIGFyZSBtYXJrZWQgYXMgZm9yICJleHBlcnRzIgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZlNldEV4cGVydEZpbHRlciA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29udHJvbHMgd2hldGhlciB0byBkZXJpdmUgY2F0ZWdvcmllcyBmcm9tIENNRGF0YVR5cGVzOyBkaXNhYmxlZCBieQotCSAqIGRlZmF1bHQgdW50aWwgZGlzcGxheSBzdHJpbmdzIGNhbiBiZSBwbGFubmVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZTaG91bGREZXJpdmVDYXRlZ29yaWVzID0gZmFsc2U7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGZTb3J0RW51bWVyYXRlZFZhbHVlcyA9IHRydWU7Ci0KLQkvKioKLQkgKiBOb3RlOiB3ZSB3YW50IHRoZSBkZWZhdWx0IGZDYXNlU2Vuc2l0aXZlIHRvIGJlIHRydWUsIGJ1dCwgdG8gYXZvaWQKLQkgKiBtZWFuaW5nbGVzcyBkb3VibGUgaW5pdGlhbGl6YXRpb24sIHdlIGxlYXZlIGRlZmF1bHQgaGVyZSwgYW5kIHNldCBpbgotCSAqIGNvbnN0cnVjdG9yIG9ubHkuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZDYXNlU2Vuc2l0aXZlOwotCXByaXZhdGUgSVByb3BlcnR5RGVzY3JpcHRvcltdIGZEZXNjcmlwdG9ycyA9IG51bGw7Ci0JcHJpdmF0ZSBOb2RlIGZOb2RlID0gbnVsbDsKLQotCXByaXZhdGUgU3RhY2sgZlZhbHVlc0JlaW5nU2V0ID0gbmV3IFN0YWNrKCk7Ci0KLQlwdWJsaWMgWE1MUHJvcGVydHlTb3VyY2UoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJZk5vZGUgPSBpbml0Tm9kZSh0YXJnZXQpOwotCQlmQ2FzZVNlbnNpdGl2ZSA9IGluaXRDYXNlU2Vuc2l0aXZlKGZOb2RlKTsKLQl9Ci0KLQlwdWJsaWMgWE1MUHJvcGVydHlTb3VyY2UoTm9kZSB0YXJnZXQsIGJvb2xlYW4gdXNlQ2F0ZWdvcmllcykgewotCQlzdXBlcigpOwotCQlpbml0Tm9kZSh0YXJnZXQpOwotCQlmTm9kZSA9IHRhcmdldDsKLQkJZkNhc2VTZW5zaXRpdmUgPSBpbml0Q2FzZVNlbnNpdGl2ZShmTm9kZSk7Ci0JCWZTaG91bGREZXJpdmVDYXRlZ29yaWVzID0gdXNlQ2F0ZWdvcmllczsKLQl9Ci0KLQkvKiogU2VwYXJhdGUgbWV0aG9kIGp1c3QgdG8gaXNvbGF0ZSBlcnJvciBwcm9jZXNzaW5nICovCi0JcHJpdmF0ZSBzdGF0aWMgSU5vZGVOb3RpZmllciBpbml0Tm9kZShOb2RlIHRhcmdldCkgewotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJcmV0dXJuIChJTm9kZU5vdGlmaWVyKSB0YXJnZXQ7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiWE1MUHJvcGVydHlTb3VyY2UgaXMgb25seSBmb3IgSU5vZGVOb3RpZmllcnMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKiBTZXBhcmF0ZSBtZXRob2QganVzdCB0byBpc29sYXRlIGVycm9yIHByb2Nlc3NpbmcgKi8KLQlwcml2YXRlIHN0YXRpYyBOb2RlIGluaXROb2RlKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gKE5vZGUpIHRhcmdldDsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJYTUxQcm9wZXJ0eVNvdXJjZSBpcyBvbmx5IGZvciBXM0MgRE9NIE5vZGVzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5pdENhc2VTZW5zaXRpdmUoTm9kZSBub2RlKSB7Ci0JCS8vIGFsbW9zdCBhbGwgdGFncyBhcmUgY2FzZSBzZW5zaXRpdmUsIGV4Y2VwdCB0aGF0IG9sZCBIVE1MCi0JCWJvb2xlYW4gY2FzZVNlbnNpdGl2ZSA9IHRydWU7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IGdldERvY1R5cGVGcm9tRE9NTm9kZShub2RlKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQljYXNlU2Vuc2l0aXZlID0gKGFkYXB0ZXIuZ2V0VGFnTmFtZUNhc2UoKSA9PSBEb2N1bWVudFR5cGVBZGFwdGVyLlNUUklDVF9DQVNFKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2FzZVNlbnNpdGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBieSAiaW50ZXJuYWwgc3BlYyIgdGhlIERPQ1RZUEUgYWRhcHRlciBpcyBvbmx5IGF2YWlsYWJsZSBmcm9tIERvY3VtZW50Ci0JICogTm9kZQotCSAqIAotCSAqIEByZXR1cm4ge0BsaW5rIERvY3VtZW50VHlwZUFkYXB0ZXJ9Ci0JICovCi0JcHJpdmF0ZSBEb2N1bWVudFR5cGVBZGFwdGVyIGdldERvY1R5cGVGcm9tRE9NTm9kZShOb2RlIG5vZGUpIHsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQkJRG9jdW1lbnQgb3duZXJEb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAob3duZXJEb2N1bWVudCA9PSBudWxsKSB7Ci0JCQkvLyBpZiBvd25lckRvY3VtZW50IGlzIG51bGwsIHRoZW4gZk5vZGUgbXVzdCBiZSB0aGUgRG9jdW1lbnQgTm9kZQotCQkJLy8gW29sZCwgb2xkIGNvbW1lbnRdCi0JCQkvLyBobW1tbSwgZ3Vlc3Mgbm90LiBTZWUKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzAyMzMKLQkJCS8vIGd1ZXNzIHRoaXMgaXMgdXNlZCBmb3IgbWFueSBJTm9kZU5vdGlmaWVycywgbm90IGp1c3QgWE1MLgotCQkJLy8gKGFuZCBEVEQncyB1c2UgSURPTU5vZGU/IC4uLiB0aGF0IGRvZXNuJ3Qgc291bmQgcXVpdGUgcmlnaHQKLQkJCS8vIC4uLiBidXQsIG1heWJlIGEgc2VwYXJhdGUgaXNzdWUpLgotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJCW93bmVyRG9jdW1lbnQgPSAoRG9jdW1lbnQpIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKG93bmVyRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIG93bmVyRG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCX0KLQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIF9nZXRWYWxpZEZpeGVkU3RyaW5ncyhDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBDTURhdGFUeXBlIGhlbHBlcikgewotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhdHRyRGVjbCwgZk5vZGUsIG51bGwpOwotCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCVN0cmluZyBpbXBsaWVkVmFsdWUgPSBoZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JCWlmIChpbXBsaWVkVmFsdWUgIT0gbnVsbCkgewotCQkJdmFsdWVzLmFkZChpbXBsaWVkVmFsdWUpOwotCQl9Ci0JCWJvb2xlYW4gY2hlY2tJZkN1cnJlbnRWYWx1ZUlzSW5jbHVkZWQgPSAoKGZOb2RlLmdldEF0dHJpYnV0ZXMoKSAhPSBudWxsKSAmJiAoZk5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKSAhPSBudWxsKSAmJiAoZk5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKS5nZXROb2RlVmFsdWUoKSAhPSBudWxsKSk7Ci0JCWlmIChjaGVja0lmQ3VycmVudFZhbHVlSXNJbmNsdWRlZCkgewotCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IG51bGw7Ci0JCQljdXJyZW50VmFsdWUgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpLmdldE5vZGVWYWx1ZSgpOwotCQkJaWYgKCFjdXJyZW50VmFsdWUuZXF1YWxzKGltcGxpZWRWYWx1ZSkpIHsKLQkJCQl2YWx1ZXMuYWRkKGN1cnJlbnRWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nW10gdmFsaWRTdHJpbmdzID0gbmV3IFN0cmluZ1t2YWx1ZXMuc2l6ZSgpXTsKLQkJdmFsaWRTdHJpbmdzID0gKFN0cmluZ1tdKSB2YWx1ZXMudG9BcnJheSh2YWxpZFN0cmluZ3MpOwotCQlyZXR1cm4gdmFsaWRTdHJpbmdzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gX2dldFZhbGlkU3RyaW5ncyhDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBDTURhdGFUeXBlIHZhbHVlc0hlbHBlcikgewotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhdHRyRGVjbCwgZk5vZGUsIG51bGwpOwotCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCWJvb2xlYW4gY3VycmVudFZhbHVlS25vd24gPSBmYWxzZTsKLQkJYm9vbGVhbiBjaGVja0lmQ3VycmVudFZhbHVlSXNLbm93biA9ICgoZk5vZGUuZ2V0QXR0cmlidXRlcygpICE9IG51bGwpICYmIChmTm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpICE9IG51bGwpICYmIChmTm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpLmdldE5vZGVWYWx1ZSgpICE9IG51bGwpKTsKLQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IG51bGw7Ci0JCWlmIChjaGVja0lmQ3VycmVudFZhbHVlSXNLbm93bikgewotCQkJY3VycmVudFZhbHVlID0gZk5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKS5nZXROb2RlVmFsdWUoKTsKLQkJfQotCi0JCWlmICgodmFsdWVzSGVscGVyLmdldEltcGxpZWRWYWx1ZUtpbmQoKSA9PSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfRklYRUQpICYmICh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkgIT0gbnVsbCkpIHsKLQkJCS8vIEZJWEVEIHZhbHVlCi0JCQljdXJyZW50VmFsdWVLbm93biA9IChjdXJyZW50VmFsdWUgIT0gbnVsbCkgJiYgdmFsdWVzSGVscGVyLmdldEltcGxpZWRWYWx1ZSgpLmVxdWFscyhjdXJyZW50VmFsdWUpOwotCQkJdmFsdWVzLmFkZCh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gRU5VTUVSQVRFRCB2YWx1ZXMKLQkJCVN0cmluZ1tdIHZhbHVlU3RyaW5ncyA9IG51bGw7Ci0JCQkvLyB2YWx1ZVN0cmluZ3MgPSB2YWx1ZXNIZWxwZXIuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShmTm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJaWYgKChtb2RlbFF1ZXJ5ICE9IG51bGwpICYmIChmTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSkgewotCQkJCXZhbHVlU3RyaW5ncyA9IG1vZGVsUXVlcnkuZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcygoRWxlbWVudCkgZk5vZGUsIGF0dHJEZWNsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZhbHVlU3RyaW5ncyA9IGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQkJfQotCQkJaWYgKHZhbHVlU3RyaW5ncyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZVN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGNoZWNrSWZDdXJyZW50VmFsdWVJc0tub3duICYmIHZhbHVlU3RyaW5nc1tpXS5lcXVhbHMoY3VycmVudFZhbHVlKSkgewotCQkJCQkJY3VycmVudFZhbHVlS25vd24gPSB0cnVlOwotCQkJCQl9Ci0JCQkJCXZhbHVlcy5hZGQodmFsdWVTdHJpbmdzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlS2luZCgpICE9IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9OT05FKSAmJiAodmFsdWVzSGVscGVyLmdldEltcGxpZWRWYWx1ZSgpICE9IG51bGwpKSB7Ci0JCQlpZiAoIXZhbHVlcy5jb250YWlucyh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkpKSB7Ci0JCQkJdmFsdWVzLmFkZCh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNoZWNrSWZDdXJyZW50VmFsdWVJc0tub3duICYmICFjdXJyZW50VmFsdWVLbm93biAmJiAoY3VycmVudFZhbHVlICE9IG51bGwpICYmIChjdXJyZW50VmFsdWUubGVuZ3RoKCkgPiAwKSkgewotCQkJdmFsdWVzLmFkZChjdXJyZW50VmFsdWUpOwotCQl9Ci0JCVN0cmluZ1tdIHZhbGlkU3RyaW5ncyA9IG5ldyBTdHJpbmdbdmFsdWVzLnNpemUoKV07Ci0JCXZhbGlkU3RyaW5ncyA9IChTdHJpbmdbXSkgdmFsdWVzLnRvQXJyYXkodmFsaWRTdHJpbmdzKTsKLQkJcmV0dXJuIHZhbGlkU3RyaW5nczsKLQl9Ci0KLQlwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihhdHRyaWJ1dGVOYW1lLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGJvb2xlYW4gaGlkZU9uRmlsdGVyKSB7Ci0JCS8vIFRoZSBkZXNjcmlwdG9yIGNsYXNzIHVzZWQgaGVyZSBpcyBhbHNvIHVzZWQgaW4KLQkJLy8gdXBkYXRlUHJvcGVydHlEZXNjcmlwdG9ycygpCi0JCVRleHRQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWUpOwotCQlkZXNjcmlwdG9yLnNldENhdGVnb3J5KGdldENhdGVnb3J5KG51bGwsIG51bGwpKTsKLQkJZGVzY3JpcHRvci5zZXREZXNjcmlwdGlvbihhdHRyaWJ1dGVOYW1lKTsKLQkJaWYgKGhpZGVPbkZpbHRlciAmJiBmU2V0RXhwZXJ0RmlsdGVyKSB7Ci0JCQlkZXNjcmlwdG9yLnNldEZpbHRlckZsYWdzKG5ldyBTdHJpbmdbXXtJUHJvcGVydHlTaGVldEVudHJ5LkZJTFRFUl9JRF9FWFBFUlR9KTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgYW4gYXR0cmlidXRlIHdpdGggRU5VTUVSQVRFRCB2YWx1ZXMgLQotCSAqIGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCBleGlzdCwgYW4gZWRpdGFibGUgY29tYm8gYm94IGlzIHJldHVybmVkIC0gaWYgdGhlCi0JICogdmFsdWUgZXhpc3RzIGJ1dCBpcyBub3Qgb25lIGluIHRoZSBlbnVtZXJhdGVkIGxpc3Qgb2YgdmFsdWUsIGEgY29tYm8KLQkgKiBib3ggZmVhdHVyaW5nIHRoZSBjdXJyZW50IGFuZCBjb3JyZWN0IHZhbHVlcyBpcyByZXR1cm5lZCAtIGlmIHRoZSB2YWx1ZQotCSAqIGV4aXN0cyBhbmQgaXQgaXMgYSB2YWxpZCB2YWx1ZSwgYSBjb21ibyBib3ggZmVhdHVyaW5nIHRoZSBjb3JyZWN0Ci0JICogdmFsdWVzIHdpdGggdGhlIGN1cnJlbnQgb25lIHZpc2libGUgaXMgcmV0dXJuZWQKLQkgKi8KLQlwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRW51bWVyYXRlZFByb3BlcnR5RGVzY3JpcHRvcihDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBDTURhdGFUeXBlIHZhbHVlc0hlbHBlciwgQXR0ciBhdHRyKSB7Ci0JCS8vIHRoZSBkaXNwbGF5TmFtZSBNVVNUIGJlIHNldAotCQlTdHJpbmcgYXR0ck5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuY29tcHV0ZU5hbWUoYXR0ckRlY2wsIGZOb2RlLCBudWxsKTsKLQkJRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IEVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ck5hbWUsIGF0dHJOYW1lLCBfZ2V0VmFsaWRTdHJpbmdzKGF0dHJEZWNsLCB2YWx1ZXNIZWxwZXIpKTsKLQkJZGVzY3JpcHRvci5zZXRDYXRlZ29yeShnZXRDYXRlZ29yeShhdHRyRGVjbCwgYXR0cikpOwotCQlkZXNjcmlwdG9yLnNldERlc2NyaXB0aW9uKGF0dHJOYW1lKTsKLQkJaWYgKChhdHRyRGVjbC5nZXRVc2FnZSgpICE9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpICYmIGZTZXRFeHBlcnRGaWx0ZXIpIHsKLQkJCWRlc2NyaXB0b3Iuc2V0RmlsdGVyRmxhZ3MobmV3IFN0cmluZ1tde0lQcm9wZXJ0eVNoZWV0RW50cnkuRklMVEVSX0lEX0VYUEVSVH0pOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciBhbiBhdHRyaWJ1dGUgd2l0aCBhIEZJWEVEIHZhbHVlIC0gaWYKLQkgKiB0aGUgdmFsdWUgZG9lcyBub3QgZXhpc3QsIGFuIGVkaXRhYmxlIGNvbWJvIGJveCBpcyByZXR1cm5lZCAtIGlmIHRoZQotCSAqIHZhbHVlIGV4aXN0cyBidXQgaXMgbm90IHRoZSBmaXhlZC9kZWZhdWx0IHZhbHVlLCBhIGNvbWJvIGJveCBmZWF0dXJpbmcKLQkgKiB0aGUgY3VycmVudCBhbmQgY29ycmVjdCB2YWx1ZSBpcyByZXR1cm5lZCAtIGlmIHRoZSB2YWx1ZSBleGlzdHMgYW5kIGl0Ci0JICogaXMgdGhlIGZpeGVkL2RlZmF1bHQgdmFsdWUsIG5vIGNlbGwgZWRpdG9yIGlzIHByb3ZpZGVkICJsb2NraW5nIiB0aGUKLQkgKiB2YWx1ZSBpbgotCSAqLwotCXByaXZhdGUgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVGaXhlZFByb3BlcnR5RGVzY3JpcHRvcihDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBDTURhdGFUeXBlIGhlbHBlciwgQXR0ciBhdHRyKSB7Ci0JCS8vIHRoZSBkaXNwbGF5TmFtZSBNVVNUIGJlIHNldAotCQlTdHJpbmcgYXR0ck5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuY29tcHV0ZU5hbWUoYXR0ckRlY2wsIGZOb2RlLCBudWxsKTsKLQkJRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IEVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ck5hbWUsIGF0dHJOYW1lLCBfZ2V0VmFsaWRGaXhlZFN0cmluZ3MoYXR0ckRlY2wsIGhlbHBlcikpOwotCQlkZXNjcmlwdG9yLnNldENhdGVnb3J5KGdldENhdGVnb3J5KGF0dHJEZWNsLCBhdHRyKSk7Ci0JCWRlc2NyaXB0b3Iuc2V0RGVzY3JpcHRpb24oRE9NTmFtZXNwYWNlSGVscGVyLmNvbXB1dGVOYW1lKGF0dHJEZWNsLCBmTm9kZSwgbnVsbCkpOwotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCwgQXR0ciBhdHRyKSB7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG51bGw7Ci0JCUNNRGF0YVR5cGUgYXR0clR5cGUgPSBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpOwotCi0JCWlmIChhdHRyVHlwZSAhPSBudWxsKSB7Ci0JCQkvLyBoYW5kbGUgZGVjbGFyYXRpb25zIHRoYXQgcHJvdmlkZSBGSVhFRC9FTlVNRVJBVEVEIHZhbHVlcwotCQkJaWYgKChhdHRyVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkgIT0gbnVsbCkgJiYgKGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKS5sZW5ndGggPiAwKSkgewotCQkJCWRlc2NyaXB0b3IgPSBjcmVhdGVFbnVtZXJhdGVkUHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsLCBhdHRyVHlwZSwgYXR0cik7Ci0JCQl9Ci0JCQllbHNlIGlmICgoKGF0dHJEZWNsLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5GSVhFRCkgfHwgKGF0dHJUeXBlLmdldEltcGxpZWRWYWx1ZUtpbmQoKSA9PSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfRklYRUQpKSAmJiAoYXR0clR5cGUuZ2V0SW1wbGllZFZhbHVlKCkgIT0gbnVsbCkpIHsKLQkJCQlkZXNjcmlwdG9yID0gY3JlYXRlRml4ZWRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wsIGF0dHJUeXBlLCBhdHRyKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHBsYWluIHRleHQKLQkJCQlkZXNjcmlwdG9yID0gY3JlYXRlVGV4dFByb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbCwgYXR0cik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBubyBleHRyYSBpbmZvcm1hdGlvbiBnaXZlbgotCQkJZGVzY3JpcHRvciA9IGNyZWF0ZVRleHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wsIGF0dHIpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29sbGVjdGlvbiBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCB2YWxpZCBkZXNjcmlwdG9ycy4KLQkgKi8KLQlwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQlDTU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gbnVsbDsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXREZWNsYXJhdGlvbigpOwotCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJYXR0ck1hcCA9IGVkLmdldEF0dHJpYnV0ZXMoKTsKLQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyTWFwKTsKLQkJCUxpc3Qgbm9kZXMgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGZOb2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudCgoRWxlbWVudCkgZk5vZGUsIGVkLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJQ01Ob2RlIGNtbm9kZSA9IChDTU5vZGUpIG5vZGVzLmdldChrKTsKLQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWF0dHJNYXAgPSBhbGxBdHRyaWJ1dGVzOwotCQl9Ci0KLQkJTGlzdCBkZXNjcmlwdG9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSBudWxsOwotCi0JCS8vIGFkZCBkZXNjcmlwdG9ycyBmb3IgZXhpc3RpbmcgYXR0cmlidXRlcwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGZOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCS8vIGlmIG1ldGFpbmZvIGlzIHByZXNlbnQgZm9yIHRoaXMgYXR0cmlidXRlLCB1c2UgdGhlCi0JCQkJLy8gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiB0byBkZXJpdmUgYSBkZXNjcmlwdG9yCi0JCQkJaWYgKGF0dHJNYXAgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJCQkJaWYgKGZDYXNlU2Vuc2l0aXZlKSB7Ci0JCQkJCQlhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyTWFwLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlhdHRyRGVjbCA9IG51bGw7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGF0dHJNYXAuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJCWlmICghZkNhc2VTZW5zaXRpdmUgJiYgYXR0ck1hcC5pdGVtKGopLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpIHsKLQkJCQkJCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0ck1hcC5pdGVtKGopOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gYmUgY29uc2lzdGVudDogaWYgdGhlcmUncyBtZXRhaW5mbywgdXNlICp0aGF0KiBhcyB0aGUKLQkJCQkvLyBkZXNjcmlwdG9yIElECi0JCQkJZGVzY3JpcHRvciA9IG51bGw7Ci0JCQkJaWYgKGF0dHJEZWNsICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGF0dHJOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmNvbXB1dGVOYW1lKGF0dHJEZWNsLCBmTm9kZSwgbnVsbCk7Ci0JCQkJCWlmICghbmFtZXMuY29udGFpbnMoYXR0ck5hbWUpKSB7Ci0JCQkJCQlkZXNjcmlwdG9yID0gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsLCBhdHRyKTsKLQkJCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpCi0JCQkJCQkJbmFtZXMuYWRkKGF0dHJOYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKCFuYW1lcy5jb250YWlucyhhdHRyLmdldE5hbWUoKSkpIHsKLQkJCQkJCWRlc2NyaXB0b3IgPSBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHIuZ2V0TmFtZSgpKTsKLQkJCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpCi0JCQkJCQkJbmFtZXMuYWRkKGF0dHIuZ2V0TmFtZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCWRlc2NyaXB0b3JMaXN0LmFkZChkZXNjcmlwdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgZGVzY3JpcHRvcnMgZnJvbSB0aGUgbWV0YWluZm8gdGhhdCBhcmUgbm90IHlldCBsaXN0ZWQKLQkJaWYgKGF0dHJNYXAgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyTWFwLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyTWFwLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIGF0dHJOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmNvbXB1dGVOYW1lKGF0dHJEZWNsLCBmTm9kZSwgbnVsbCk7Ci0JCQkJaWYgKCFuYW1lcy5jb250YWlucyhhdHRyTmFtZSkpIHsKLQkJCQkJSVByb3BlcnR5RGVzY3JpcHRvciBob2xkRGVzY3JpcHRvciA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbCwgbnVsbCk7Ci0JCQkJCWlmIChob2xkRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCQluYW1lcy5hZGQoYXR0ck5hbWUpOwotCQkJCQkJZGVzY3JpcHRvckxpc3QuYWRkKGhvbGREZXNjcmlwdG9yKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGFkZCBNUUUtYmFzZWQgZGVzY3JpcHRvcnMKLQkJaWYgKGVkICE9IG51bGwgJiYgZk5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJTGlzdCBub2RlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZk5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBdmFpbGFibGVDb250ZW50KChFbGVtZW50KSBmTm9kZSwgZWQsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlDTU5vZGUgbm9kZSA9IChDTU5vZGUpIG5vZGVzLmdldChpKTsKLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgbm9kZTsKLQkJCQkJU3RyaW5nIGF0dHJOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmNvbXB1dGVOYW1lKGF0dHJEZWNsLCBmTm9kZSwgbnVsbCk7Ci0JCQkJCWlmICghbmFtZXMuY29udGFpbnMoYXR0ck5hbWUpKSB7Ci0JCQkJCQlJUHJvcGVydHlEZXNjcmlwdG9yIGhvbGREZXNjcmlwdG9yID0gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsLCBudWxsKTsKLQkJCQkJCWlmIChob2xkRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCQkJbmFtZXMuYWRkKGF0dHJOYW1lKTsKLQkJCQkJCQlkZXNjcmlwdG9yTGlzdC5hZGQoaG9sZERlc2NyaXB0b3IpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQotCQlJUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltkZXNjcmlwdG9yTGlzdC5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlkZXNjcmlwdG9yc1tpXSA9IChJUHJvcGVydHlEZXNjcmlwdG9yKSBkZXNjcmlwdG9yTGlzdC5nZXQoaSk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCX0KLQotCXByaXZhdGUgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVUZXh0UHJvcGVydHlEZXNjcmlwdG9yKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wsIEF0dHIgYXR0cikgewotCQlTdHJpbmcgYXR0ck5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuY29tcHV0ZU5hbWUoYXR0ckRlY2wsIGZOb2RlLCBudWxsKTsKLQkJVGV4dFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ck5hbWUsIGF0dHJOYW1lKTsKLQkJZGVzY3JpcHRvci5zZXRDYXRlZ29yeShnZXRDYXRlZ29yeShhdHRyRGVjbCwgYXR0cikpOwotCQlkZXNjcmlwdG9yLnNldERlc2NyaXB0aW9uKGF0dHJOYW1lKTsKLQkJaWYgKChhdHRyRGVjbC5nZXRVc2FnZSgpICE9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpICYmIGZTZXRFeHBlcnRGaWx0ZXIpIHsKLQkJCWRlc2NyaXB0b3Iuc2V0RmlsdGVyRmxhZ3MobmV3IFN0cmluZ1tde0lQcm9wZXJ0eVNoZWV0RW50cnkuRklMVEVSX0lEX0VYUEVSVH0pOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldENhdGVnb3J5KENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wsIEF0dHIgYXR0cikgewotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZXNwYWNlVVJJID0gYXR0ci5nZXROYW1lc3BhY2VVUkkoKTsKLQkJCWlmIChuYW1lc3BhY2VVUkkgPT0gbnVsbCkKLQkJCQluYW1lc3BhY2VVUkkgPSBhdHRyLmdldE93bmVyRWxlbWVudCgpLmdldE5hbWVzcGFjZVVSSSgpOwotCQkJaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKQotCQkJCXJldHVybiBuYW1lc3BhY2VVUkk7Ci0JCX0KLQkJaWYgKGF0dHJEZWNsICE9IG51bGwpIHsKLQkJCWlmIChhdHRyRGVjbC5zdXBwb3J0cygiY2F0ZWdvcnkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIChTdHJpbmcpIGF0dHJEZWNsLmdldFByb3BlcnR5KCJjYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZlNob3VsZERlcml2ZUNhdGVnb3JpZXMgJiYgKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkgIT0gbnVsbCkgJiYgKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0RGF0YVR5cGVOYW1lKCkgIT0gbnVsbCkgJiYgKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0RGF0YVR5cGVOYW1lKCkubGVuZ3RoKCkgPiAwKSkgewotCQkJCXJldHVybiBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldERhdGFUeXBlTmFtZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBDQVRFR09SWV9BVFRSSUJVVEVTOwotCX0KLQotCXByaXZhdGUgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCWlmICgoZk5vZGUgPT0gbnVsbCkgfHwgKGZOb2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGZOb2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCXJldHVybiBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBmTm9kZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0KLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB2YWx1ZSBmb3IgdGhpcyBOb2RlIHRoYXQgY2FuIGJlIGVkaXR0ZWQgaW4gYSBwcm9wZXJ0eSBzaGVldC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgdmFsdWUgdGhhdCBjYW4gYmUgZWRpdHRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBjb2xsZWN0aW9uIG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzLgotCSAqIAotCSAqIEByZXR1cm4gYWxsIHZhbGlkIGRlc2NyaXB0b3JzLgotCSAqLwotCXB1YmxpYyBmaW5hbCBJUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpIHsKLQkJaWYgKChmRGVzY3JpcHRvcnMgPT0gbnVsbCkgfHwgKGZEZXNjcmlwdG9ycy5sZW5ndGggPT0gMCkpIHsKLQkJCWZEZXNjcmlwdG9ycyA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJfQotCQllbHNlIHsKLQkJCXVwZGF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJfQotCQlyZXR1cm4gZkRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBuYW1lZCBwcm9wZXJ0eS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IG5hbWVPYmplY3QpIHsKLQkJU3RyaW5nIG5hbWUgPSBuYW1lT2JqZWN0LnRvU3RyaW5nKCk7Ci0JCVN0cmluZyByZXR1cm5lZFZhbHVlID0gbnVsbDsKLQkJTmFtZWROb2RlTWFwIGF0dHJNYXAgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyTWFwICE9IG51bGwpIHsKLQkJCU5vZGUgYXR0cmlidXRlID0gYXR0ck1hcC5nZXROYW1lZEl0ZW0obmFtZSk7Ci0JCQlpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQlpZiAoYXR0cmlidXRlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQkJcmV0dXJuZWRWYWx1ZSA9ICgoSURPTU5vZGUpIGF0dHJpYnV0ZSkuZ2V0VmFsdWVTb3VyY2UoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybmVkVmFsdWUgPSBhdHRyaWJ1dGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXR1cm5lZFZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybmVkVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXR1cm5lZFZhbHVlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0VmFsaWRWYWx1ZXMoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCkgewotCQlpZiAoYXR0ckRlY2wgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCX0KLQotCQlTdHJpbmdbXSB2YWxpZFZhbHVlcyA9IG51bGw7Ci0JCUNNRGF0YVR5cGUgYXR0clR5cGUgPSBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpOwotCQlpZiAoYXR0clR5cGUgIT0gbnVsbCkgewotCQkJdmFsaWRWYWx1ZXMgPSBfZ2V0VmFsaWRTdHJpbmdzKGF0dHJEZWNsLCBhdHRyVHlwZSk7Ci0JCQlpZiAoZlNvcnRFbnVtZXJhdGVkVmFsdWVzKSB7Ci0JCQkJQXJyYXlzLnNvcnQodmFsaWRWYWx1ZXMpOwotCQkJfQotCQl9Ci0JCWlmICh2YWxpZFZhbHVlcyA9PSBudWxsKSB7Ci0JCQl2YWxpZFZhbHVlcyA9IG5ldyBTdHJpbmdbMF07Ci0JCX0KLQkJcmV0dXJuIHZhbGlkVmFsdWVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlSZW1vdmFibGUoT2JqZWN0IGlkKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlSZXNldHRhYmxlKE9iamVjdCBpZCkgewotCQlyZXR1cm4gZk5vZGUgIT0gbnVsbCAmJiBmTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgcHJvcGVydHkgdmFsdWUgaGFzIGNoYW5nZWQgZnJvbSB0aGUgZGVmYXVsdC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGhhcwotCSAqICAgICAgICAgY2hhbmdlZCBmcm9tIGl0cyBvcmlnaW5hbCBkZWZhdWx0IHZhbHVlOyA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBwcm9wZXJ0eU9iamVjdCkgewotCQlTdHJpbmcgcHJvcGVydHkgPSBwcm9wZXJ0eU9iamVjdC50b1N0cmluZygpOwotCi0JCU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gZk5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0ck1hcCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYXR0ck1hcC5nZXROYW1lZEl0ZW0ocHJvcGVydHkpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZ2l2ZW4gYXR0cmlidXRlIGZyb20gdGhlIE5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShPYmplY3QgcHJvcGVydHlPYmplY3QpIHsKLQkJTmFtZWROb2RlTWFwIGF0dHJNYXAgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyTWFwICE9IG51bGwpIHsKLQkJCU5vZGUgYXR0cmlidXRlID0gYXR0ck1hcC5nZXROYW1lZEl0ZW0ocHJvcGVydHlPYmplY3QudG9TdHJpbmcoKSk7Ci0JCQlpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlhdHRyTWFwLnJlbW92ZU5hbWVkSXRlbShwcm9wZXJ0eU9iamVjdC50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChlLmNvZGUgIT0gRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUikgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc2V0cyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5J3MgdmFsdWUgdG8gaXRzIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBwcm9wZXJ0eU9iamVjdCkgewotCQlTdHJpbmcgcHJvcGVydHkgPSBwcm9wZXJ0eU9iamVjdC50b1N0cmluZygpOwotCQlDTU5hbWVkTm9kZU1hcCBhdHRyRGVjbHMgPSBudWxsOwotCi0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0RGVjbGFyYXRpb24oKTsKLQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCWF0dHJEZWNscyA9IGVkLmdldEF0dHJpYnV0ZXMoKTsKLQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyRGVjbHMpOwotCQkJTGlzdCBub2RlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZk5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBdmFpbGFibGVDb250ZW50KChFbGVtZW50KSBmTm9kZSwgZWQsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgbm9kZXMuZ2V0KGspOwotCQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCWFsbEF0dHJpYnV0ZXMucHV0KGNtbm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJYXR0ckRlY2xzID0gYWxsQXR0cmlidXRlczsKLQkJfQotCi0JCU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gZk5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0ckRlY2xzICE9IG51bGwpIHsKLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0ckRlY2xzLmdldE5hbWVkSXRlbShwcm9wZXJ0eSk7Ci0JCQlTdHJpbmcgZGVmVmFsdWUgPSBudWxsOwotCQkJaWYgKGF0dHJEZWNsICE9IG51bGwpIHsKLQkJCQlpZiAoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJCUNNRGF0YVR5cGUgaGVscGVyID0gYXR0ckRlY2wuZ2V0QXR0clR5cGUoKTsKLQkJCQkJaWYgKChoZWxwZXIuZ2V0SW1wbGllZFZhbHVlS2luZCgpICE9IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9OT05FKSAmJiAoaGVscGVyLmdldEltcGxpZWRWYWx1ZSgpICE9IG51bGwpKSB7Ci0JCQkJCQlkZWZWYWx1ZSA9IGhlbHBlci5nZXRJbXBsaWVkVmFsdWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICgoZGVmVmFsdWUgIT0gbnVsbCkgJiYgKGRlZlZhbHVlLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkoKEF0dHIpIGF0dHJNYXAuZ2V0TmFtZWRJdGVtKHByb3BlcnR5KSkuc2V0VmFsdWUoZGVmVmFsdWUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gcmVtZW1iZXIsIHRoaXMgbWV0aG9kIGlzIGZvciByZXNldCwgbm90IHJlbW92ZQotCQkJCSgoQXR0cikgYXR0ck1hcC5nZXROYW1lZEl0ZW0ocHJvcGVydHkpKS5zZXRWYWx1ZSgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIHJlbWVtYmVyLCB0aGlzIG1ldGhvZCBpcyBmb3IgcmVzZXQsIG5vdCByZW1vdmUKLQkJCSgoQXR0cikgYXR0ck1hcC5nZXROYW1lZEl0ZW0ocHJvcGVydHkpKS5zZXRWYWx1ZSgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWVkIHByb3BlcnR5IHRvIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBuYW1lT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKLQkJLy8gQXZvaWQgY3ljbGluZyAtIGNhbiBoYXBwZW4gaWYgYSBjbG9zaW5nIGNlbGwgZWRpdG9yIGNhdXNlcyBhCi0JCS8vIHJlZnJlc2gKLQkJLy8gb24gdGhlIFByb3BlcnR5U2hlZXQgcGFnZSBhbmQgdGhlIHNldElucHV0IGFnYWluIGFza3MgdGhlIGVkaXRvciB0bwotCQkvLyBjbG9zZTsgYmVzaWRlcywgd2h5IGFwcGx5IHRoZSBzYW1lIHZhbHVlIHR3aWNlPwotCQlpZiAoIWZWYWx1ZXNCZWluZ1NldC5pc0VtcHR5KCkgJiYgKGZWYWx1ZXNCZWluZ1NldC5wZWVrKCkgPT0gbmFtZU9iamVjdCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmVmFsdWVzQmVpbmdTZXQucHVzaChuYW1lT2JqZWN0KTsKLQkJU3RyaW5nIG5hbWUgPSBuYW1lT2JqZWN0LnRvU3RyaW5nKCk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQl2YWx1ZVN0cmluZyA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0JCX0KLQkJTmFtZWROb2RlTWFwIGF0dHJNYXAgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoYXR0ck1hcCAhPSBudWxsKSB7Ci0JCQkJQXR0ciBhdHRyID0gKEF0dHIpIGF0dHJNYXAuZ2V0TmFtZWRJdGVtKG5hbWUpOwotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJLy8gRVhJU1RJTkcgVkFMVUUKLQkJCQkJLy8gcG90ZW50aWFsIG91dCBvZiBjb250cm9sIGxvb3AgaWYgdXBkYXRpbmcgdGhlIHZhbHVlCi0JCQkJCS8vIHRyaWdnZXJzIGEgdmlld2VyIHVwZGF0ZSwgZm9yY2luZyB0aGUKLQkJCQkJLy8gYWN0aXZlIGNlbGwgZWRpdG9yIHRvIHNhdmUgaXRzIHZhbHVlIGFuZCBjYXVzaW5nIHRoZQotCQkJCQkvLyBsb29wIHRvIGNvbnRpbnVlCi0JCQkJCWlmICgoYXR0ci5nZXRWYWx1ZSgpID09IG51bGwpIHx8ICFhdHRyLmdldFZhbHVlKCkuZXF1YWxzKHZhbHVlU3RyaW5nKSkgewotCQkJCQkJaWYgKGF0dHIgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQkJCSgoSURPTU5vZGUpIGF0dHIpLnNldFZhbHVlU291cmNlKHZhbHVlU3RyaW5nKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWF0dHIuc2V0VmFsdWUodmFsdWVTdHJpbmcpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBORVcoPykgdmFsdWUKLQkJCQkJQXR0ciBuZXdBdHRyID0gZk5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUF0dHJpYnV0ZShuYW1lKTsKLQkJCQkJaWYgKG5ld0F0dHIgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQkJKChJRE9NTm9kZSkgbmV3QXR0cikuc2V0VmFsdWVTb3VyY2UodmFsdWVTdHJpbmcpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbmV3QXR0ci5zZXRWYWx1ZSh2YWx1ZVN0cmluZyk7Ci0JCQkJCX0KLQkJCQkJYXR0ck1hcC5zZXROYW1lZEl0ZW0obmV3QXR0cik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGZOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCQkoKEVsZW1lbnQpIGZOb2RlKS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWVTdHJpbmcpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoRE9NRXhjZXB0aW9uIGUpIHsKLQkJCURpc3BsYXkgZCA9IGdldERpc3BsYXkoKTsKLQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQlkLmJlZXAoKTsKLQkJCX0KLQkJfQotCQlmVmFsdWVzQmVpbmdTZXQucG9wKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvcGVydHlEZXNjcmlwdG9ycygpIHsKLQkJaWYgKChmRGVzY3JpcHRvcnMgPT0gbnVsbCkgfHwgKGZEZXNjcmlwdG9ycy5sZW5ndGggPT0gMCkpIHsKLQkJCS8vIE5vdGhpbmcgdG8gdXBkYXRlCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBMaXN0IG9mIGFsbCBuYW1lcyBlbmNvdW50ZXJlZCBpbiB0aGUgdGFnIGFuZCBkZWZpbmVkIGJ5IHRoZSBlbGVtZW50Ci0JCUxpc3QgZGVjbGFyZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gTmV3IGRlc2NyaXB0b3IgbGlzdCB0aGF0IHdpbGwgYmVjb21lIGZEZXNjcmlwdG9ycyBhZnRlciBhbGwKLQkJLy8gcHJvY2Vzc2luZyBpcyBkb25lCi0JCUxpc3QgZGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIE5hbWVzIG9mIHRoZSBkZXNjcmlwdG9ycyBpbiB0aGUgYWJvdmUgTGlzdAotCQlMaXN0IGRlc2NyaXB0b3JOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBVcGRhdGUgYW55IGRlc2NyaXB0b3JzIGRlcml2ZWQgZnJvbSB0aGUgbWV0YWluZm8KLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXREZWNsYXJhdGlvbigpOwotCQlDTU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gbnVsbDsKLQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCWF0dHJNYXAgPSBlZC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlDTU5hbWVkTm9kZU1hcEltcGwgYWxsQXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoYXR0ck1hcCk7Ci0JCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGZOb2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQlpZihtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCUxpc3Qgbm9kZXMgPSBtb2RlbFF1ZXJ5LmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIGZOb2RlLCBlZCwgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMpOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQkJQ01Ob2RlIGNtbm9kZSA9IChDTU5vZGUpIG5vZGVzLmdldChrKTsKLQkJCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQkJCWFsbEF0dHJpYnV0ZXMucHV0KGNtbm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlhdHRyTWFwID0gYWxsQXR0cmlidXRlczsKLQkJfQotCQkvLyBVcGRhdGUgZXhpdGluZyBkZXNjcmlwdG9yczsgbm90IGFkZGVkIHRvIHRoZSBmaW5hbCBsaXN0IGhlcmUKLQkJaWYgKGF0dHJNYXAgIT0gbnVsbCkgewotCQkJLy8gVXBkYXRlIGV4aXN0aW5nIGRlc2NyaXB0b3IgdHlwZXMgYmFzZWQgb24gbWV0YWluZm8KLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyTWFwLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyTWFwLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIGF0dHJOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmNvbXB1dGVOYW1lKGF0dHJEZWNsLCBmTm9kZSwgbnVsbCk7Ci0JCQkJaWYgKCFkZWNsYXJlZE5hbWVzLmNvbnRhaW5zKGF0dHJOYW1lKSkgewotCQkJCQlkZWNsYXJlZE5hbWVzLmFkZChhdHRyTmFtZSk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZkRlc2NyaXB0b3JzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWJvb2xlYW4gc2FtZU5hbWUgPSAoZkNhc2VTZW5zaXRpdmUgJiYgZkRlc2NyaXB0b3JzW2pdLmdldElkKCkuZXF1YWxzKGF0dHJEZWNsLmdldE5vZGVOYW1lKCkpKSB8fCAoIWZDYXNlU2Vuc2l0aXZlICYmIGF0dHJEZWNsLmdldE5vZGVOYW1lKCkuZXF1YWxzKGZEZXNjcmlwdG9yc1tqXS5nZXRJZCgpLnRvU3RyaW5nKCkpKTsKLQkJCQkJaWYgKHNhbWVOYW1lKSB7Ci0JCQkJCQlTdHJpbmdbXSB2YWxpZFZhbHVlcyA9IGdldFZhbGlkVmFsdWVzKGF0dHJEZWNsKTsKLQkJCQkJCS8vIFVwZGF0ZSB0aGUgZGVzY3JpcHRvciBmb3IgdGhpcwotCQkJCQkJLy8gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiAob25seSBlbnVtZXJhdGVkIHZhbHVlcyBnZXQKLQkJCQkJCS8vIHVwZGF0ZWQgZm9yIG5vdykKLQkJCQkJCWlmIChmRGVzY3JpcHRvcnNbal0gaW5zdGFuY2VvZiBFbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJKChFbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yKSBmRGVzY3JpcHRvcnNbal0pLnVwZGF0ZVZhbHVlcyh2YWxpZFZhbHVlcyk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBSZXBsYWNlIHdpdGggYmV0dGVyIGRlc2NyaXB0b3IKLQkJCQkJCWVsc2UgaWYgKCh2YWxpZFZhbHVlcyAhPSBudWxsKSAmJiAodmFsaWRWYWx1ZXMubGVuZ3RoID4gMCkpIHsKLQkJCQkJCQlmRGVzY3JpcHRvcnNbal0gPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wsIG51bGwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gVXBkYXRlIGV4aXN0aW5nIGRlc2NyaXB0b3JzIGJhc2VkIG9uIG5vdCBoYXZpbmcgYW55IG1ldGFpbmZvCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGZEZXNjcmlwdG9ycy5sZW5ndGg7IGorKykgewotCQkJCS8vIFJlcGxhY2Ugd2l0aCBiYXNpYyBkZXNjcmlwdG9yCi0JCQkJaWYgKCEoZkRlc2NyaXB0b3JzW2pdIGluc3RhbmNlb2YgVGV4dFByb3BlcnR5RGVzY3JpcHRvcikpIHsKLQkJCQkJZkRlc2NyaXB0b3JzW2pdID0gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcigoU3RyaW5nKSBmRGVzY3JpcHRvcnNbal0uZ2V0SWQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0KLQkJLy8gUmVtb3ZlIGRlc2NyaXB0b3JzIGZvciBhdHRyaWJ1dGVzIHRoYXQgYXJlbid0IHByZXNlbnQgQU5EIGFyZW4ndAotCQkvLyBrbm93biB0aHJvdWdoIG1ldGFpbmZvLAotCQkvLyBkbyB0aGlzIGJ5IG9ubHkgcmV1c2luZyBleGlzdGluZyBkZXNjcmlwdG9ycyBmb3IgYXR0cmlidXRlcyB0aGF0Ci0JCS8vIGFyZSBwcmVzZW50IG9yIGRlY2xhcmVkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZkRlc2NyaXB0b3JzW2ldICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZGVzY3JpcHRvck5hbWUgPSBmRGVzY3JpcHRvcnNbaV0uZ2V0SWQoKS50b1N0cmluZygpOwotCQkJCWlmICgoZGVjbGFyZWROYW1lcy5jb250YWlucyhkZXNjcmlwdG9yTmFtZSkgfHwgKGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGRlc2NyaXB0b3JOYW1lKSAhPSBudWxsKSkgJiYgIWRlc2NyaXB0b3JOYW1lcy5jb250YWlucyhkZXNjcmlwdG9yTmFtZSkpIHsKLQkJCQkJZGVzY3JpcHRvck5hbWVzLmFkZChkZXNjcmlwdG9yTmFtZSk7Ci0JCQkJCWRlc2NyaXB0b3JzLmFkZChmRGVzY3JpcHRvcnNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIEFkZCBkZXNjcmlwdG9ycyBmb3IgZGVjbGFyZWQgYXR0cmlidXRlcyB0aGF0IGRvbid0IGFscmVhZHkgaGF2ZSBvbmUKLQkJaWYgKGF0dHJNYXAgIT0gbnVsbCkgewotCQkJLy8gVXBkYXRlIGV4aXN0aW5nIGRlc2NyaXB0b3IgdHlwZXMgYmFzZWQgb24gbWV0YWluZm8KLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyTWFwLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyTWFwLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIGF0dHJOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmNvbXB1dGVOYW1lKGF0dHJEZWNsLCBmTm9kZSwgbnVsbCk7Ci0JCQkJaWYgKGZDYXNlU2Vuc2l0aXZlKSB7Ci0JCQkJCWlmICghZGVzY3JpcHRvck5hbWVzLmNvbnRhaW5zKGF0dHJOYW1lKSkgewotCQkJCQkJSVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsLCBudWxsKTsKLQkJCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJCQlkZXNjcmlwdG9yTmFtZXMuYWRkKGF0dHJOYW1lKTsKLQkJCQkJCQlkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJvb2xlYW4gZXhpc3RzID0gZmFsc2U7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvck5hbWVzLnNpemUoKTsgaisrKSB7Ci0JCQkJCQlleGlzdHMgPSAoZGVzY3JpcHRvck5hbWVzLmdldChqKS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB8fCBleGlzdHM7Ci0JCQkJCX0KLQkJCQkJaWYgKCFleGlzdHMpIHsKLQkJCQkJCWRlc2NyaXB0b3JOYW1lcy5hZGQoYXR0ck5hbWUpOwotCQkJCQkJSVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsLCBudWxsKTsKLQkJCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJCQlkZXNjcmlwdG9yTmFtZXMuYWRkKGF0dHJOYW1lKTsKLQkJCQkJCQlkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBBZGQgZGVzY3JpcHRvcnMgZm9yIGV4aXN0aW5nIGF0dHJpYnV0ZXMgdGhhdCBkb24ndCBhbHJlYWR5IGhhdmUgb25lCi0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJQXR0ciBhdHRyID0gKEF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJCQlpZiAoZkNhc2VTZW5zaXRpdmUpIHsKLQkJCQkJaWYgKCFkZXNjcmlwdG9yTmFtZXMuY29udGFpbnMoYXR0ck5hbWUpKSB7Ci0JCQkJCQlkZXNjcmlwdG9yTmFtZXMuYWRkKGF0dHJOYW1lKTsKLQkJCQkJCWRlc2NyaXB0b3JzLmFkZChjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJOYW1lKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJvb2xlYW4gZXhpc3RzID0gZmFsc2U7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvck5hbWVzLnNpemUoKTsgaisrKSB7Ci0JCQkJCQlleGlzdHMgPSAoZGVzY3JpcHRvck5hbWVzLmdldChqKS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB8fCBleGlzdHM7Ci0JCQkJCX0KLQkJCQkJaWYgKCFleGlzdHMpIHsKLQkJCQkJCWRlc2NyaXB0b3JOYW1lcy5hZGQoYXR0ck5hbWUpOwotCQkJCQkJZGVzY3JpcHRvcnMuYWRkKGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ck5hbWUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIFVwZGF0ZSBmRGVzY3JpcHRvcnMKLQkJSVByb3BlcnR5RGVzY3JpcHRvcltdIG5ld0Rlc2NyaXB0b3JzID0gbmV3IElQcm9wZXJ0eURlc2NyaXB0b3JbZGVzY3JpcHRvcnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJbmV3RGVzY3JpcHRvcnNbaV0gPSAoSVByb3BlcnR5RGVzY3JpcHRvcikgZGVzY3JpcHRvcnMuZ2V0KGkpOwotCQl9Ci0JCWZEZXNjcmlwdG9ycyA9IG5ld0Rlc2NyaXB0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9JRE9NU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMThiMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5JU291cmNlRWRpdGluZ1RleHRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludC5Ob2RlTG9jYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGludGVyZmFjZSBJRE9NU291cmNlRWRpdGluZ1RleHRUb29scyBleHRlbmRzIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIHsKLQkvKioKLQkgKiBSZXR1cm5zIGEgVzNDIERPTSBkb2N1bWVudAotCSAqIAotCSAqIEByZXR1cm4gRG9jdW1lbnQgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGNvcnJlc3BvbmRpbmcKLQkgKiAgICAgICAgIGRvY3VtZW50IGRvZXMgbm90IGV4aXN0Ci0JICovCi0JRG9jdW1lbnQgZ2V0RE9NRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFczQyBET00gTm9kZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0Ci0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCB3aXRoaW4gdGhlIElEb2N1bWVudAotCSAqIEByZXR1cm4gYSBOb2RlIGF0IHRoYXQgbG9jYXRpb24sIGlmIG9uZSBpcyBwcmVzZW50Ci0JICogCi0JICogQHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGZvciBpbnZhbGlkIG9mZnNldHMKLQkgKi8KLQlOb2RlIGdldE5vZGUoaW50IG9mZnNldCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyBhIE5vZGVMb2NhdGlvbiBvYmplY3QgZGVzY3JpYmluZyB0aGUgcG9zaXRpb24gaW5mb3JtYXRpb24gb2YKLQkgKiB0aGUgTm9kZSdzIHN0YXJ0IGFuZCBlbmQgdGFncy4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gVGhlIE5vZGVMb2NhdGlvbiBmb3IgdGhpcyBOb2RlLCBudWxsIGZvciB1bnN1cHBvcnRlZCBOb2RlCi0JICogICAgICAgICBpbnN0YW5jZXMuCi0JICovCi0JTm9kZUxvY2F0aW9uIGdldE5vZGVMb2NhdGlvbihOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBzZXJ2ZXItc2lkZSBwYWdlIGxhbmd1YWdlIGZvciB0aGUgRG9jdW1lbnQgb2YgdGhlCi0JICogZ2l2ZW4gTm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzZXJ2ZXItc2lkZSBwYWdlIGxhbmd1YWdlIGZvciB0aGlzIG5vZGVtIG51bGwgZm9yIE5vZGVzCi0JICogICAgICAgICB3aXRoaW4gdW5zdXBwb3J0ZWQgRG9jdW1lbnRzLgotCSAqLwotCVN0cmluZyBnZXRQYWdlTGFuZ3VhZ2UoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIFJldHVybnMgc3RhcnQgb2Zmc2V0IG9mIGdpdmVuIE5vZGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIHczYyA8Y29kZT5Ob2RlPC9jb2RlPiBvYmplY3QgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRoZSBzdGFydCBvZmZzZXQgb3IgLTEgZm9yIHVuc3VwcG9ydGVkIE5vZGVzCi0JICovCi0JaW50IGdldFN0YXJ0T2Zmc2V0KE5vZGUgbm9kZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvWE1MU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL1hNTFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNhMzM3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvWE1MU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50Lk5vZGVMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogSW1wbGVtZW50cyBJU291cmNlRWRpdGluZ1RleHRUb29scyBpbnRlcmZhY2UKLSAqLwotcHVibGljIGNsYXNzIFhNTFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgaW1wbGVtZW50cyBJRE9NU291cmNlRWRpdGluZ1RleHRUb29scywgSU5vZGVBZGFwdGVyIHsKLQotCXByb3RlY3RlZCBjbGFzcyBOb2RlTG9jYXRpb25JbXBsIGltcGxlbWVudHMgTm9kZUxvY2F0aW9uIHsKLQkJcHJpdmF0ZSBJRE9NTm9kZSBub2RlOwotCi0JCXB1YmxpYyBOb2RlTG9jYXRpb25JbXBsKElET01Ob2RlIHhtbG5vZGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQlub2RlID0geG1sbm9kZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RW5kVGFnRW5kT2Zmc2V0KCkgewotCQkJaWYgKG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCgpOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRFbmRUYWdTdGFydE9mZnNldCgpIHsKLQkJCWlmIChub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRTdGFydFRhZ0VuZE9mZnNldCgpIHsKLQkJCWlmIChub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFN0YXJ0VGFnU3RhcnRPZmZzZXQoKSB7Ci0JCQlpZiAobm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlTdHJ1Y3R1cmVkVGV4dEVkaXRvciBmVGV4dEVkaXRvciA9IG51bGw7Ci0KLQlwdWJsaWMgaW50IGdldENhcmV0T2Zmc2V0KCkgewotCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlciBzdHYgPSBmVGV4dEVkaXRvci5nZXRUZXh0Vmlld2VyKCk7Ci0JCWlmICgoc3R2ICE9IG51bGwpICYmIChzdHYuZ2V0VGV4dFdpZGdldCgpICE9IG51bGwpICYmICFzdHYuZ2V0VGV4dFdpZGdldCgpLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuIHN0di53aWRnZXRPZmZzZXQyTW9kZWxPZmZzZXQoc3R2LmdldFRleHRXaWRnZXQoKS5nZXRDYXJldE9mZnNldCgpKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCX0KLQotCXB1YmxpYyBEb2N1bWVudCBnZXRET01Eb2N1bWVudCgpIHsKLQkJcmV0dXJuIChEb2N1bWVudCkgZlRleHRFZGl0b3IuZ2V0TW9kZWwoKS5nZXRBZGFwdGVyKERvY3VtZW50LmNsYXNzKTsKLQl9Ci0KLQkvKgotCSAqIElmIHNpbWlsYXIgZnVuY3Rpb24gaXMgbmVlZGVkLCBjb21wb3NpdGUgaXQgYXJvdW5kIHRoZSB0ZXh0IGVkaXRvcidzCi0JICogaW5zdGFuY2UuIFJlbW92ZWQgYWxzbyBiZWNhdXNlIGl0IHJldHVybnMgYW4gYWxyZWFkLXJlbGVhc2VkIG1vZGVsCi0JICogCi0JICogcHVibGljIERvY3VtZW50IGdldERPTURvY3VtZW50KElNYXJrZXIgbWFya2VyKSB7IGlmIChtYXJrZXIgPT0gbnVsbCkKLQkgKiByZXR1cm4gbnVsbDsKLQkgKiAKLQkgKiBJUmVzb3VyY2UgcmVzID0gbWFya2VyLmdldFJlc291cmNlKCk7IGlmIChyZXMgPT0gbnVsbCB8fCAhKHJlcwotCSAqIGluc3RhbmNlb2YgSUZpbGUpKSByZXR1cm4gbnVsbDsKLQkgKiAKLQkgKiBJTW9kZWxNYW5hZ2VyIG1tID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkgKiBJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsgdHJ5IHsgbW9kZWwgPQotCSAqIG1tLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKChJRmlsZSkgcmVzKTsgaWYgKG1vZGVsID09IG51bGwgfHwgIShtb2RlbAotCSAqIGluc3RhbmNlb2YgSURPTU1vZGVsKSkgcmV0dXJuIG51bGw7Ci0JICogCi0JICogcmV0dXJuICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsgfSBmaW5hbGx5IHsgaWYgKG1vZGVsICE9Ci0JICogbnVsbCkgbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7IH0gfQotCSAqLwotCi0JcHVibGljIElFZGl0b3JQYXJ0IGdldEVkaXRvclBhcnQoKSB7Ci0JCXJldHVybiBmVGV4dEVkaXRvci5nZXRFZGl0b3JQYXJ0KCk7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0Tm9kZShpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlOb2RlIG5vZGUgPSBudWxsOwotCQlpZiAoKDAgPD0gb2Zmc2V0KSAmJiAob2Zmc2V0IDw9IGdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQlub2RlID0gKE5vZGUpIGZUZXh0RWRpdG9yLmdldE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IEJhZExvY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbnMuU291cmNlRWRpdGluZ1RleHRUb29scyNnZXROb2RlTG9jYXRpb24ob3JnLnczYy5kb20uTm9kZSkKLQkgKi8KLQlwdWJsaWMgTm9kZUxvY2F0aW9uIGdldE5vZGVMb2NhdGlvbihOb2RlIG5vZGUpIHsKLQkJaWYgKChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpICYmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpKSB7Ci0JCQlyZXR1cm4gbmV3IE5vZGVMb2NhdGlvbkltcGwoKElET01Ob2RlKSBub2RlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VMYW5ndWFnZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0U2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIChJVGV4dFNlbGVjdGlvbikgZlRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBJRXh0ZW5kZWRNYXJrdXBFZGl0b3IgbWV0aG9kCi0JICovCi0JLy8gcHVibGljIExpc3QgZ2V0U2VsZWN0ZWROb2RlcygpIHsKLQkvLyBWaWV3ZXJTZWxlY3Rpb25NYW5hZ2VyIHZzbSA9IGdldFZpZXdlclNlbGVjdGlvbk1hbmFnZXIoKTsKLQkvLyByZXR1cm4gKHZzbSAhPSBudWxsKSA/IHZzbS5nZXRTZWxlY3RlZE5vZGVzKCkgOiBudWxsOwotCS8vIH0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KE5vZGUgbm9kZSkgewotCQlpZiAoKG5vZGUgPT0gbnVsbCkgfHwgIShub2RlIGluc3RhbmNlb2YgSURPTVRleHQpKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZub2RlID0gKChJRE9NVGV4dCkgbm9kZSkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJcmV0dXJuIGZub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY29yZS5JTm9kZUFkYXB0ZXIjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmNsYXNzLmVxdWFscyh0eXBlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jb3JlLklOb2RlQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jb3JlLklOb2RlTm90aWZpZXIsCi0JICogICAgICBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0RWRpdG9yKFN0cnVjdHVyZWRUZXh0RWRpdG9yIGVkaXRvcikgewotCQlmVGV4dEVkaXRvciA9IGVkaXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcXVpY2tvdXRsaW5lL1hNTENvbnRlbnRTZWxlY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3F1aWNrb3V0bGluZS9YTUxDb250ZW50U2VsZWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjOWM3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcXVpY2tvdXRsaW5lL1hNTENvbnRlbnRTZWxlY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnF1aWNrb3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5JQ29udGVudFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFhNTENvbnRlbnRTZWxlY3Rpb25Qcm92aWRlciBpbXBsZW1lbnRzIElDb250ZW50U2VsZWN0aW9uUHJvdmlkZXIgewotCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKFRyZWVWaWV3ZXIgdmlld2VyLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJU2VsZWN0aW9uIGZpbHRlcmVkU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdFtdIGZpbHRlcmVkTm9kZXMgPSBnZXRGaWx0ZXJlZE5vZGVzKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikudG9BcnJheSgpKTsKLQkJCWZpbHRlcmVkU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmlsdGVyZWROb2Rlcyk7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlcmVkU2VsZWN0aW9uOwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gZ2V0RmlsdGVyZWROb2RlcyhPYmplY3RbXSBmaWx0ZXJlZE5vZGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVyZWROb2Rlcy5sZW5ndGg7IGkrKykgewotCQkJZmlsdGVyZWROb2Rlc1tpXSA9IGdldEZpbHRlcmVkTm9kZShmaWx0ZXJlZE5vZGVzW2ldKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyZWROb2RlczsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRGaWx0ZXJlZE5vZGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJLy8gcmVwbGFjZSBhdHRyaWJ1dGUgbm9kZSBpbiBzZWxlY3Rpb24gd2l0aCBpdHMgcGFyZW50Ci0JCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCW5vZGUgPSAoKEF0dHIpIG5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCQkJfQotCQkJLy8gYW55dGhpbmcgZWxzZSBub3QgdmlzaWJsZSwgcmVwbGFjZSB3aXRoIHBhcmVudCBub2RlCi0JCQllbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcXVpY2tvdXRsaW5lL1hNTFF1aWNrT3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9xdWlja291dGxpbmUvWE1MUXVpY2tPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmQyMWExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9xdWlja291dGxpbmUvWE1MUXVpY2tPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucXVpY2tvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuSUNvbnRlbnRTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnF1aWNrb3V0bGluZS5BYnN0cmFjdFF1aWNrT3V0bGluZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVMYWJlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgWE1MUXVpY2tPdXRsaW5lQ29uZmlndXJhdGlvbiBleHRlbmRzIEFic3RyYWN0UXVpY2tPdXRsaW5lQ29uZmlndXJhdGlvbiB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLklPdXRsaW5lQ29udGVudE1hbmFnZXIjZ2V0Q29udGVudFByb3ZpZGVyKCkKLQkgKi8KLQlwdWJsaWMgSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEpGYWNlTm9kZUNvbnRlbnRQcm92aWRlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuSU91dGxpbmVDb250ZW50TWFuYWdlciNnZXRDb250ZW50U2VsZWN0aW9uUHJvdmlkZXIoKQotCSAqLwotCXB1YmxpYyBJQ29udGVudFNlbGVjdGlvblByb3ZpZGVyIGdldENvbnRlbnRTZWxlY3Rpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxDb250ZW50U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLklPdXRsaW5lQ29udGVudE1hbmFnZXIjZ2V0TGFiZWxQcm92aWRlcigpCi0JICovCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSkZhY2VOb2RlTGFiZWxQcm92aWRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OTRhMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkRPTU9ic2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTFVJUHJlZmVyZW5jZU5hbWVzOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlQcm92aWRlckZvclhNTCBpbXBsZW1lbnRzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgewotCi0JLyoKLQkgKiBAc2VlIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIjYWRkQWRhcHRlckZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFkYXB0ZXJGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCQkvLyBhZGQgdGhlIG5vcm1hbCBjb250ZW50IGJhc2VkIGZhY3RvcmllcyB0byBtb2RlbCdzIHJlZ2lzdHJ5Ci0JCWFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhzdHJ1Y3R1cmVkTW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gc3RydWN0dXJlZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZhY3RvcnlSZWdpc3RyeSwgIlByb2dyYW0gRXJyb3I6IGNsaWVudCBjYWxsZXIgbXVzdCBlbnN1cmUgbW9kZWwgaGFzIGZhY3RvcnkgcmVnaXN0cnkiKTsgLy8kTk9OLU5MUy0xJAotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCi0JCWZhY3RvcnkgPSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3RvcnkgPSBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkoKTsKLQkJCWZhY3RvcnlSZWdpc3RyeS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0KLQkJLy8gY3MuLi4gYWRkZWQgZm9yIGluZmVycmVkIGdyYW1tYXIgc3VwcG9ydAotCQkvLwotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoc3RydWN0dXJlZE1vZGVsKTsKLQkJCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlDTURvY3VtZW50TWFuYWdlciBkb2N1bWVudE1hbmFnZXIgPSBtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCQkJaWYgKGRvY3VtZW50TWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQkJCWJvb2xlYW4gdXNlSW5mZXJyZWRHcmFtbWFyID0gKHN0b3JlICE9IG51bGwpID8gc3RvcmUuZ2V0Qm9vbGVhbihYTUxVSVByZWZlcmVuY2VOYW1lcy5VU0VfSU5GRVJSRURfR1JBTU1BUikgOiB0cnVlOwotCi0JCQkJCWRvY3VtZW50TWFuYWdlci5zZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVNZTkNfTE9BRCwgdHJ1ZSk7Ci0JCQkJCWRvY3VtZW50TWFuYWdlci5zZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVVUT19MT0FELCBmYWxzZSk7Ci0JCQkJCWRvY3VtZW50TWFuYWdlci5zZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfVVNFX0NBQ0hFRF9SRVNPTFZFRF9VUkksIHRydWUpOwotCQkJCQlET01PYnNlcnZlciBkb21PYnNlcnZlciA9IG5ldyBET01PYnNlcnZlcihzdHJ1Y3R1cmVkTW9kZWwpOwotCQkJCQlkb21PYnNlcnZlci5zZXRHcmFtbWFySW5mZXJlbmNlRW5hYmxlZCh1c2VJbmZlcnJlZEdyYW1tYXIpOwotCQkJCQlkb21PYnNlcnZlci5pbml0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIjaXNGb3Iob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXIpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSURvY3VtZW50VHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbikgewotCQlyZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JYTUwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZUZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBub3RoaW5nIHRvIGRvLCBzaW5jZSBubyBlbWJlZGRlZCB0eXBlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlYXJjaC9YTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlYXJjaC9YTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGYyZWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWFyY2gvWE1MRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5GaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBTZXRzIHVwIEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIGZvciB4bWwgZmluZCBvY2N1cnJlbmNlcyBwcm9jZXNzb3JzCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIExpc3QgZlByb2Nlc3NvcnM7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRQcm9jZXNzb3JzKCkgewotCQlpZiAoZlByb2Nlc3NvcnMgPT0gbnVsbCkgewotCQkJZlByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlYTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgaHRtbFByb2Nlc3NvciA9IG5ldyBYTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IoKTsKLQkJCWZQcm9jZXNzb3JzLmFkZChodG1sUHJvY2Vzc29yKTsKLQkJfQotCQlyZXR1cm4gZlByb2Nlc3NvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlYXJjaC9YTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWFyY2gvWE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMTJmZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlYXJjaC9YTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci0KLS8qKgotICogQ29uZmlndXJlcyBhIEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciB3aXRoIFhNTCBwYXJ0aXRpb25zIGFuZCByZWdpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZXh0ZW5kcyBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgewotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFBhcnRpdGlvblR5cGVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UmVnaW9uVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117RE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUsIERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSwgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nWE1MQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OGJlNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nWE1MQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nWE1MQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBTdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbmRleGVkUmVnaW9uID0gZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgY3Vyc29yTm9kZSA9IChOb2RlKSBpbmRleGVkUmVnaW9uOwotCi0JCQkvLyB1c2UgcGFyZW50IG5vZGUgZm9yIGVtcHR5IHRleHQgbm9kZQotCQkJaWYgKChjdXJzb3JOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChjdXJzb3JOb2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCWN1cnNvck5vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCWlmIChjdXJzb3JOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQlpbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIGN1cnNvck5vZGU7Ci0JCQkJfQotCQkJfQotCi0JCQlSZWdpb24gY3Vyc29yTm9kZVJlZ2lvbiA9IG5ldyBSZWdpb24oaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBpbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQotCQkJaWYgKChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpIDw9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSkgJiYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKSkgewotCQkJCU5vZGUgbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCUluZGV4ZWRSZWdpb24gbmV3SW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBuZXdOb2RlOwotCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoWE1MVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oWE1MVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3ROZXh0WE1MQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwODhjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3ROZXh0WE1MQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3ROZXh0WE1MQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBTdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJaW50IG9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpIC0gMTsKLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCW9mZnNldCA9IDA7Ci0JCX0KLQotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCi0JCWluZGV4ZWRSZWdpb24gPSBnZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50LCBvZmZzZXQpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIGN1cnNvck5vZGUgPSAoTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQotCQkJLy8gdXNlIHBhcmVudCBub2RlIGZvciBlbXB0eSB0ZXh0IG5vZGUKLQkJCWlmICgoY3Vyc29yTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAoY3Vyc29yTm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQljdXJzb3JOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAoY3Vyc29yTm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJaW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBjdXJzb3JOb2RlOwotCQkJCX0KLQkJCX0KLQotCQkJUmVnaW9uIGN1cnNvck5vZGVSZWdpb24gPSBuZXcgUmVnaW9uKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgaW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpbnQgY3VycmVudE9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgY3VycmVudEVuZE9mZnNldCA9IGN1cnJlbnRPZmZzZXQgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpOwotCQkJaWYgKChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IGN1cnJlbnRPZmZzZXQpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PSBjdXJyZW50T2Zmc2V0KSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPD0gY3VycmVudEVuZE9mZnNldCkpIHsKLQkJCQluZXdSZWdpb24gPSBnZXROZXdTZWxlY3Rpb25SZWdpb24yKGluZGV4ZWRSZWdpb24sIHRleHRTZWxlY3Rpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KFhNTFVJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihYTUxVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdE5leHRfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2FzIHNlcGFyYXRlZCBvdXQgZnJvbSBnZXROZXdTZWxlY3Rpb25SZWdpb24yIGJlY2F1c2UgdGhlCi0JICogY29kZSBpbiBoZXJlIGlzIGFsbG93ZWQgdG8gYmUgY2FsbGVkIHJlY3Vyc2l2ZWx5LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleGVkUmVnaW9uCi0JICogQHBhcmFtIHRleHRTZWxlY3Rpb24KLQkgKiBAcmV0dXJuIG5ldyByZWdpb24gdG8gc2VsZWN0IG9yIG51bGwgaWYgbm9uZQotCSAqLwotCXByaXZhdGUgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbjIoSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpbmRleGVkUmVnaW9uOwotCQkJTm9kZSBuZXdOb2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQkJaWYgKG5ld05vZGUgPT0gbnVsbCkgewotCQkJCW5ld05vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIG5ld0luZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0KLQkJCQkJaWYgKG5ld05vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJbmV3UmVnaW9uID0gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uMihuZXdJbmRleGVkUmVnaW9uLCBuZXcgVGV4dFNlbGVjdGlvbihuZXdSZWdpb24uZ2V0T2Zmc2V0KCksIG5ld1JlZ2lvbi5nZXRMZW5ndGgoKSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNYTUxBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNYTUxBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTM5YzMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBTdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbmRleGVkUmVnaW9uID0gZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgY3Vyc29yTm9kZSA9IChOb2RlKSBpbmRleGVkUmVnaW9uOwotCi0JCQkvLyB1c2UgcGFyZW50IG5vZGUgZm9yIGVtcHR5IHRleHQgbm9kZQotCQkJaWYgKChjdXJzb3JOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChjdXJzb3JOb2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCWN1cnNvck5vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCWlmIChjdXJzb3JOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQlpbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIGN1cnNvck5vZGU7Ci0JCQkJfQotCQkJfQotCi0JCQlSZWdpb24gY3Vyc29yTm9kZVJlZ2lvbiA9IG5ldyBSZWdpb24oaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBpbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQotCQkJaWYgKChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpIDw9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSkgJiYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKSkgewotCQkJCU5vZGUgbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJaWYgKG5ld05vZGUgPT0gbnVsbCkgewotCQkJCQluZXdOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0KLQkJCQkJCWlmIChuZXdOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJCQluZXdSZWdpb24gPSBnZXROZXdTZWxlY3Rpb25SZWdpb24obmV3SW5kZXhlZFJlZ2lvbiwgbmV3IFRleHRTZWxlY3Rpb24obmV3UmVnaW9uLmdldE9mZnNldCgpLCBuZXdSZWdpb24uZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKFhNTFVJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc3BlbGxpbmcvU3BlbGxjaGVja0RlbGVnYXRlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zcGVsbGluZy9TcGVsbGNoZWNrRGVsZWdhdGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTQxZWI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zcGVsbGluZy9TcGVsbGNoZWNrRGVsZWdhdGVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNwZWxsaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNwZWxsaW5nLklTcGVsbGNoZWNrRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8qKgotICogQW4gPGNvZGU+SUFkYXB0ZXJGYWN0b3J5PC9jb2RlPiB0byBhZGFwdCBhbiA8Y29kZT5JRE9NTW9kZWw8L2NvZGU+IHRvIGEKLSAqIDxjb2RlPklTcGVsbGNoZWNrRGVsZWdhdGU8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgU3BlbGxjaGVja0RlbGVnYXRlQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCS8qKgotCSAqIFRoaXMgbGlzdCBvZiBjbGFzc2VzIHRoaXMgZmFjdG9yeSBhZGFwdHMgdG8uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBREFQVEVSX0xJU1QgPSBuZXcgQ2xhc3NbXXtJU3BlbGxjaGVja0RlbGVnYXRlLmNsYXNzfTsKLQkKLQkvKioKLQkgKiBUaGUgPGNvZGU+SVNwZWxsY2hlY2tEZWxlZ2F0ZTwvY29kZT4gdGhpcyBmYWN0b3J5IGFkYXB0cyB0bwotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElTcGVsbGNoZWNrRGVsZWdhdGUgREVMRUdBVEUgPSBuZXcgWE1MU3BlbGxjaGVja0RlbGVnYXRlKCk7Ci0JCi0JLyoqCi0JICogSW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SVNwZWxsY2hlY2tEZWxlZ2F0ZTwvY29kZT4gZm9yIFhNTCB0eXBlIGRvY3VtZW50cy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBYTUxTcGVsbGNoZWNrRGVsZWdhdGUgaW1wbGVtZW50cyBJU3BlbGxjaGVja0RlbGVnYXRlIHsKLQkJCi0JCS8qKgotCQkgKiBJZiB0aGUgcmVnaW9uIGluIHRoZSBnaXZlbiA8Y29kZT5tb2RlbDwvY29kZT4gYXQgdGhlIGdpdmVuIDxjb2RlPm9mZnNldDwvY29kZT4gaXMgYQotCQkgKiA8Y29kZT5Db21tZW50PC9jb2RlPiByZWdpb24gdGhlbiBpdCBzaG91bGQgYmUgc3BlbGwgY2hlY2tlZCwgb3RoZXJ3aXNlIGl0IHNob3VsZCBub3QuCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc3BlbGxpbmcuSVNwZWxsY2hlY2tEZWxlZ2F0ZSNzaG91bGRTcGVsbGNoZWNrKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gc2hvdWxkU3BlbGxjaGVjayhpbnQgb2Zmc2V0LCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQlib29sZWFuIHNob3VsZFNwZWxsY2hlY2sgPSB0cnVlOwotCQkJCi0JCQlJbmRleGVkUmVnaW9uIHJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0KTsKLQkJCWlmKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJc2hvdWxkU3BlbGxjaGVjayA9IChyZWdpb24gaW5zdGFuY2VvZiBDb21tZW50IHx8IHJlZ2lvbiBpbnN0YW5jZW9mIFRleHQpOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gc2hvdWxkU3BlbGxjaGVjazsKLQkJfQotCQkKLQl9Ci0JCi0JLyoqIAotCSAqIEFkYXB0cyA8Y29kZT5JRE9NTW9kZWw8L2NvZGU+IHRvIDxjb2RlPklTcGVsbGNoZWNrRGVsZWdhdGU8L2NvZGU+LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJSVNwZWxsY2hlY2tEZWxlZ2F0ZSBkZWNpc2lvbiA9IG51bGw7Ci0JCQotCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSURPTU1vZGVsICYmIElTcGVsbGNoZWNrRGVsZWdhdGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXJUeXBlKSkgewotCQkJZGVjaXNpb24gPSBERUxFR0FURTsKLQkJfQotCQkKLQkJcmV0dXJuIGRlY2lzaW9uOwotCX0KLQotCS8qKgotCSAqICBUaGlzIGFkYXB0ZXIgb25seSBhZGFwdHMgdG8gPGNvZGU+SVNwZWxsY2hlY2tEZWxlZ2F0ZTwvY29kZT4KLQkgKiAgCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIEFEQVBURVJfTElTVDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwNTViNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEJlbmphbWluIE11c2thbGxhLCBiLm11c2thbGxhQGdteC5uZXQgLSBbMTU4NjYwXSBjaGFyYWN0ZXIgZW50aXRpZXMgc2hvdWxkIGhhdmUgdGhlaXIgb3duIHN5bnRheCBoaWdobGlnaHRpbmcgcHJlZmVyZW5jZSAgICAgIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIHN5bWJvbGljIG5hbWUgb2Ygc3R5bGVzIHVzZWQgYnkgTGluZVN0eWxlUHJvdmlkZXIsCi0gKiBDb2xvck1hbmFnZXIsIGFuZCBhbnkgb3RoZXJzIHdobyBtYXkgYmUgaW50ZXJlc3RlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZUNvbnN0YW50c1hNTCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS0dST1VORCA9ICJiYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX0JPUkRFUiA9ICJjZGF0YUJvcmRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX1RFWFQgPSAiY2RhdGFUZXh0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9CT1JERVIgPSAiY29tbWVudEJvcmRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfVEVYVCA9ICJjb21tZW50VGV4dCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ0xfQk9SREVSID0gImRlY2xCb2RlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1RZUEVfRVhURVJOQUxfSUQgPSAiZG9jdHlwZUV4dGVybmFsSWQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiA9ICJkb2N0eXBlRXh0ZXJuYWxQdWJyZWYiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiA9ICJkb2N0eXBlRXh0cmVuYWxTeXNyZWYiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NUWVBFX05BTUUgPSAiZG9jdHlwZU5hbWUiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkQgPSAiZm9yZWdyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9CT1JERVIgPSAicGlCb3JkZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9DT05URU5UID0gInBpQ29udGVudCI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJJQlVURV9FUVVBTFMgPSAidGFnQXR0cmlidXRlRXF1YWxzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVFRSSUJVVEVfTkFNRSA9ICJ0YWdBdHRyaWJ1dGVOYW1lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJJQlVURV9WQUxVRSA9ICJ0YWdBdHRyaWJ1dGVWYWx1ZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19CT1JERVIgPSAidGFnQm9yZGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAidGFnTmFtZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DT05URU5UID0gInhtbENvbnRlbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfUkVGRVJFTkNFID0gImVudGl0eVJlZmVyZW5jZSI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0MTIwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEJlbmphbWluIE11c2thbGxhLCBiLm11c2thbGxhQGdteC5uZXQgLSBbMTU4NjYwXSBjaGFyYWN0ZXIgZW50aXRpZXMgc2hvdWxkIGhhdmUgdGhlaXIgb3duIHN5bnRheCBoaWdobGlnaHRpbmcgcHJlZmVyZW5jZSAgICAgCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9yWE1MIGV4dGVuZHMgQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyIHsKLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQkvKioKLQkJICogYSBtZXRob2QgdG8gY2VudHJhbGl6ZSBhbGwgdGhlICJmb3JtYXQgcnVsZXMiIGZvciByZWdpb25zCi0JCSAqIHNwZWNpZmljYWxseSBhc3NvY2lhdGVkIGZvciBob3cgdG8gIm9wZW4iIHRoZSByZWdpb24uCi0JCSAqLwotCQkvLyBub3Qgc3VyZSB3aHkgdGhpcyBpcyBjb21pbmcgdGhyb3VnaCBudWxsLCBidXQganVzdCB0byBjYXRjaCBpdAotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQl9Ci0JCQotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVCkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCX0KLQkJaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCX0KLQkJaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFKSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLQkJfQotCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJfQotCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSk7Ci0JCX0KLQkJaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTikgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQl9Ci0JCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCX0KLQkJaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJfQotCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9FUVVBTFMpOwotCQl9Ci0JCWlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCX0KLQkJaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQl9Ci0JCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfTkFNRSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJfQotCQlpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BFX1JFRkVSRU5DRSkpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCQl9Ci0JCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NPTlRFTlQpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCQl9Ci0JCWlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSkpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUik7Ci0JCX0KLQkJaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQl9Ci0JCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRik7Ci0JCX0KLQkJaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGKTsKLQkJfQotCQlpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUMpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNKSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JCX0KLQkJaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRSkgewotCQkJLyoKLQkJCSAqIFdoaXRlIHNwYWNlIGlzIG5vcm1hbGx5IG5vdCBvbiBpdHMgb3duIC4uLiBidXQgd2hlbiBpdCBpcywKLQkJCSAqIHdlJ2xsIHRyZWF0IGFzIGNvbnRlbnQKLQkJCSAqLwotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOwotCQl9Ci0JCS8qCi0JCSAqIGRlZmF1bHQsIHJldHVybiBudWxsIHRvIHNpZ25hbCAibm90IGhhbmRsZWQiIGluIHdoaWNoIGNhc2UsIG90aGVyCi0JCSAqIHByb3ZpZGVycyBzaG91bGQgYmUgdHJpZWQKLQkJICovCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCi0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkvLyBjaGVjayBpZiBwcmVmZXJlbmNlIGNoYW5nZWQgaXMgYSBzdHlsZSBwcmVmZXJlbmNlCi0JCQlpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUy5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUzsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lELmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5QSV9DT05URU5ULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVDsKLQkJCX0KLQkJfQotCi0JCWlmIChzdHlsZUtleSAhPSBudWxsKSB7Ci0JCQkvLyBvdmVyd3JpdGUgc3R5bGUgcHJlZmVyZW5jZSB3aXRoIG5ldyB2YWx1ZQotCQkJYWRkVGV4dEF0dHJpYnV0ZShzdHlsZUtleSk7Ci0JCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0ZXh0IGF0dHJpYnV0ZXMgaW50byBtYXAuIE1ha2Ugc3VyZSBtYXAgaXMgY2xlYXJlZCBiZWZvcmUgY2FsbGluZwotCSAqIHRoaXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZENvbG9ycygpIHsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfRVFVQUxTKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWdpbmZvL01hcmt1cFRhZ0luZm9Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhZ2luZm8vTWFya3VwVGFnSW5mb1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MTVhZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhZ2luZm8vTWFya3VwVGFnSW5mb1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURlc2NyaXB0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLS8qKgotICogUHJvdmlkZXMgYmFzaWMgdGFnIGluZm9ybWF0aW9uIHN1Y2ggYXMgZWxlbWVudC9hdHRyaWJ1dGUgbmFtZSwgZGF0YSB0eXBlLAotICogYW5kIHRhZyBpbmZvL2RvY3VtZW50YXRpb24gZm9yIENNTm9kZXMuIFVzZXMgSFRNTCB0byBlbmhhbmNlIHByZXNlbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE1hcmt1cFRhZ0luZm9Qcm92aWRlciB7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQk9MRF9FTkQgPSAiPC9iPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBCT0xEX1NUQVJUID0gIjxiPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBIRUFESU5HX0VORCA9ICI8L2g1PiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBIRUFESU5HX1NUQVJUID0gIjxoNT4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgTElTVF9CRUdJTiA9ICI8dWw+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIExJU1RfRUxFTUVOVCA9ICI8bGk+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE5FV19MSU5FID0gIjxkbD4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSQUdSQVBIX0VORCA9ICI8L3A+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkFHUkFQSF9TVEFSVCA9ICI8cD4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1BBQ0UgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgYmFzaWMgdGFnIGluZm9ybWF0aW9uIGZvciBkaXNwbGF5IGdpdmVuIGEgQ01Ob2RlCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluZm8oQ01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkvLyB3ZSBhc3N1bWUgdGhhdCBpZiB0aGVyZSBpcyB0YWdJbmZvIHByZXNlbnQsIG9ubHkgZGlzcGxheSB0YWdJbmZvCi0JCXByaW50VGFnSW5mbyhzYiwgbm9kZSk7Ci0KLQkJLy8gbm8gdGFnSW5mbyBwcmVzZW50LCBzbyB0cnkgdG8gZGlzcGxheSB0YWcgZGVzY3JpcHRpb24KLQkJaWYgKHNiLmxlbmd0aCgpID09IDApIHsKLQkJCXByaW50RGVzY3JpcHRpb24oc2IsIG5vZGUpOwotCQl9Ci0KLQkJLy8gbm8gdGFnIGRlc2NyaXB0aW9uIHByZXNlbnQgZWl0aGVyLCBzbyBkaXNwbGF5IGRlZmF1bHQgaW5mbwotCQlpZiAoc2IubGVuZ3RoKCkgPT0gMCkgewotCQkJcHJpbnREZWZhdWx0SW5mbyhub2RlLCBzYik7Ci0JCX0KLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGRhdGFUeXBlJ3MgZGF0YSB0eXBlIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgZW51bWVyYXRlZCB0eXBlIHZhbHVlcwotCSAqIHRvIHN0cmluZyBidWZmZXIsIHNiCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbnREYXRhVHlwZUluZm8oU3RyaW5nQnVmZmVyIHNiLCBDTURhdGFUeXBlIGRhdGFUeXBlKSB7Ci0JCVN0cmluZyBkYXRhVHlwZU5hbWUgPSBkYXRhVHlwZS5nZXROb2RlTmFtZSgpOwotCQlpZiAoKGRhdGFUeXBlTmFtZSAhPSBudWxsKSAmJiAoZGF0YVR5cGVOYW1lLmxlbmd0aCgpID4gMCkpIHsKLQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyBCT0xEX1NUQVJUICsgWE1MVUlNZXNzYWdlcy5EYXRhX1R5cGVfX19fNCArIFNQQUNFICsgQk9MRF9FTkQpOwotCQkJc2IuYXBwZW5kKGRhdGFUeXBlTmFtZSk7Ci0JCQlzYi5hcHBlbmQoUEFSQUdSQVBIX0VORCk7Ci0JCX0KLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGRhdGFUeXBlLmdldEltcGxpZWRWYWx1ZSgpOwotCQlpZihkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9TVEFSVCArIEJPTERfU1RBUlQgKyBYTUxVSU1lc3NhZ2VzLkRlZmF1bHRfVmFsdWVfX19fNiArIFNQQUNFICsgQk9MRF9FTkQpOwotCQkJc2IuYXBwZW5kKGRlZmF1bHRWYWx1ZSk7Ci0JCQlzYi5hcHBlbmQoUEFSQUdSQVBIX0VORCk7Ci0JCX0KLQkJU3RyaW5nW10gZW51bWVyYXRlZFZhbHVlID0gZGF0YVR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQlpZiAoKGVudW1lcmF0ZWRWYWx1ZSAhPSBudWxsKSAmJiAoZW51bWVyYXRlZFZhbHVlLmxlbmd0aCA+IDApKSB7Ci0JCQlzYi5hcHBlbmQoUEFSQUdSQVBIX1NUQVJUICsgQk9MRF9TVEFSVCArIFhNTFVJTWVzc2FnZXMuRW51bWVyYXRlZF9WYWx1ZXNfX19fNSArIFNQQUNFICsgQk9MRF9FTkQpOwotCQkJc2IuYXBwZW5kKExJU1RfQkVHSU4pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtZXJhdGVkVmFsdWUubGVuZ3RoOyBpKyspIHsKLQkJCQlzYi5hcHBlbmQoTElTVF9FTEVNRU5UICsgZW51bWVyYXRlZFZhbHVlW2ldKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfRU5EKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGRlZmF1bHQgaW5mbyAoZWxlbWVudCBuYW1lLCBjb250ZW50IG1vZGVsLCBkYXRhIHR5cGUpIG9mCi0JICogQ01Ob2RlIHRvIHRoZSBzdHJpbmcgYnVmZmVyLCBzYgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50RGVmYXVsdEluZm8oQ01Ob2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzYikgewotCQl7Ci0KLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pIHsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgbm9kZTsKLQkJCQlzYi5hcHBlbmQoUEFSQUdSQVBIX1NUQVJUICsgQk9MRF9TVEFSVCArIFhNTFVJTWVzc2FnZXMuRWxlbWVudF9fX18xICsgU1BBQ0UgKyBCT0xEX0VORCk7Ci0JCQkJc2IuYXBwZW5kKG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9FTkQpOwotCQkJCXByaW50RG9jdW1lbnRhdGlvbihzYiwgbm9kZSk7Ci0JCQkJaWYgKGVkLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBKSB7Ci0JCQkJCUNNRGF0YVR5cGUgZGF0YVR5cGUgPSBlZC5nZXREYXRhVHlwZSgpOwotCQkJCQlpZiAoZGF0YVR5cGUgIT0gbnVsbCkgewotCQkJCQkJcHJpbnREYXRhVHlwZUluZm8oc2IsIGRhdGFUeXBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJQ01EZXNjcmlwdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBDTURlc2NyaXB0aW9uQnVpbGRlcigpOwotCQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBidWlsZGVyLmJ1aWxkRGVzY3JpcHRpb24obm9kZSk7Ci0JCQkJCWlmICgoZGVzY3JpcHRpb24gIT0gbnVsbCkgJiYgKGRlc2NyaXB0aW9uLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyBCT0xEX1NUQVJUICsgWE1MVUlNZXNzYWdlcy5Db250ZW50X01vZGVsX19fXzIgKyBTUEFDRSArIEJPTERfRU5EKTsKLQkJCQkJCXNiLmFwcGVuZChkZXNjcmlwdGlvbiArIFBBUkFHUkFQSF9FTkQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIG5vZGU7Ci0JCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9TVEFSVCArIEJPTERfU1RBUlQgKyBYTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9fX18zICsgU1BBQ0UgKyBCT0xEX0VORCk7Ci0JCQkJc2IuYXBwZW5kKG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9FTkQpOwotCQkJCXByaW50RG9jdW1lbnRhdGlvbihzYiwgbm9kZSk7Ci0JCQkJQ01EYXRhVHlwZSBkYXRhVHlwZSA9IGFkLmdldEF0dHJUeXBlKCk7Ci0JCQkJaWYgKGRhdGFUeXBlICE9IG51bGwpIHsKLQkJCQkJcHJpbnREYXRhVHlwZUluZm8oc2IsIGRhdGFUeXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkRBVEFfVFlQRSkgewotCQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyBCT0xEX1NUQVJUICsgWE1MVUlNZXNzYWdlcy5EYXRhX1R5cGVfX19fNCArIFNQQUNFICsgQk9MRF9FTkQpOwotCQkJCXNiLmFwcGVuZChub2RlLmdldE5vZGVOYW1lKCkpOwotCQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfRU5EKTsKLQkJCQlwcmludERvY3VtZW50YXRpb24oc2IsIG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkgb2YgdGhlIENNTm9kZSB0byB0aGUgc3RyaW5nIGJ1ZmZlciwgc2IKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludERlc2NyaXB0aW9uKFN0cmluZ0J1ZmZlciBzYiwgQ01Ob2RlIG5vZGUpIHsKLQkJU3RyaW5nIHRhZ0luZm8gPSAoU3RyaW5nKSBub2RlLmdldFByb3BlcnR5KCJkZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh0YWdJbmZvICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyB0YWdJbmZvLnRyaW0oKSArIFBBUkFHUkFQSF9FTkQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgdGFnIGRvY3VtZW50YXRpb24gcHJvcGVydHkgb2YgdGhlIENNTm9kZSB0byB0aGUgc3RyaW5nIGJ1ZmZlciwKLQkgKiBzYgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50RG9jdW1lbnRhdGlvbihTdHJpbmdCdWZmZXIgc2IsIENNTm9kZSBub2RlKSB7Ci0JCUNNTm9kZUxpc3Qgbm9kZUxpc3QgPSAoQ01Ob2RlTGlzdCkgbm9kZS5nZXRQcm9wZXJ0eSgiZG9jdW1lbnRhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICgobm9kZUxpc3QgIT0gbnVsbCkgJiYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUNNRG9jdW1lbnRhdGlvbiBkb2N1bWVudGF0aW9uID0gKENNRG9jdW1lbnRhdGlvbikgbm9kZUxpc3QuaXRlbShpKTsKLQkJCQlTdHJpbmcgZG9jID0gZG9jdW1lbnRhdGlvbi5nZXRWYWx1ZSgpOwotCQkJCWlmIChkb2MgIT0gbnVsbCkgewotCQkJCQlzYi5hcHBlbmQoUEFSQUdSQVBIX1NUQVJUICsgZG9jLnRyaW0oKSArIFBBUkFHUkFQSF9FTkQpOwotCQkJCX0KLQkJCX0KLQkJCXNiLmFwcGVuZChORVdfTElORSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSB0YWcgaW5mbyBwcm9wZXJ0eSBvZiB0aGUgQ01Ob2RlIHRvIHRoZSBzdHJpbmcgYnVmZmVyLCBzYgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50VGFnSW5mbyhTdHJpbmdCdWZmZXIgc2IsIENNTm9kZSBub2RlKSB7Ci0JCVN0cmluZyB0YWdJbmZvID0gKFN0cmluZykgbm9kZS5nZXRQcm9wZXJ0eSgidGFnSW5mbyIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh0YWdJbmZvICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyB0YWdJbmZvLnRyaW0oKSArIFBBUkFHUkFQSF9FTkQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhZ2luZm8vWE1MSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhZ2luZm8vWE1MSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTc2YTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWdpbmZvL1hNTEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi0vKioKLSAqIFByb3ZpZGVzIGNvbnRleHQgaW5mb3JtYXRpb24gZm9yIFhNTCB0YWdzIChTaG93cyB0b29sdGlwIGRlc2NyaXB0aW9uKQotICogCi0gKiBAZGVwcmVjYXRlZCBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gY3JlYXRlcyB0aGUgYXBwcm9wcmlhdGUKLSAqICAgICAgICAgICAgIGluZm9ybWF0aW9uIHByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxJbmZvcm1hdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSUluZm9ybWF0aW9uUHJvdmlkZXIsIElJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uIHsKLQotCXByaXZhdGUgSVRleHRIb3ZlciBmVGV4dEhvdmVyID0gbnVsbDsKLQotCXB1YmxpYyBYTUxJbmZvcm1hdGlvblByb3ZpZGVyKCkgewotCQlmVGV4dEhvdmVyID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRleHRIb3Zlck1hbmFnZXIoKS5jcmVhdGVCZXN0TWF0Y2hIb3ZlcihuZXcgWE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlciNnZXRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRJbmZvcm1hdGlvbjIodGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uI2dldEluZm9ybWF0aW9uMihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24yKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlckluZm8odGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyI2dldFN1YmplY3Qob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRTdWJqZWN0KElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIGZUZXh0SG92ZXIuZ2V0SG92ZXJSZWdpb24odGV4dFZpZXdlciwgb2Zmc2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9YTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWdpbmZvL1hNTFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzI3NmZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWdpbmZvL1hNTFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvLkFic3RyYWN0SG92ZXJQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTmFtZWROb2RlTWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIFByb3ZpZGVzIGhvdmVyIGhlbHAgZG9jdW1lbnRhdGlvbiBmb3IgeG1sIHRhZ3MKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIKLSAqLwotcHVibGljIGNsYXNzIFhNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0SG92ZXJQcm9jZXNzb3IgewotCXByb3RlY3RlZCBNYXJrdXBUYWdJbmZvUHJvdmlkZXIgZkluZm9Qcm92aWRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgWE1MVGV4dEhvdmVyUHJvY2Vzc29yLgotCSAqLwotCXB1YmxpYyBYTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IoKSB7Ci0JCS8vIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXRyZWl2ZXMgZG9jdW1lbnRhdGlvbiB0byBkaXNwbGF5IGluIHRoZSBob3ZlciBoZWxwIHBvcHVwLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIGFueSBkb2N1bWVudGF0aW9uIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gZGlzcGxheS4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVIb3ZlckhlbHAoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLQkJSW5kZXhlZFJlZ2lvbiB0cmVlTm9kZSA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmICh0cmVlTm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlOb2RlIG5vZGUgPSAoTm9kZSkgdHJlZU5vZGU7Ci0KLQkJd2hpbGUgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSkgewotCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCUlET01Ob2RlIHBhcmVudE5vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgdGV4dFZpZXdlci5nZXREb2N1bWVudCgpKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gY29tcHV0ZVJlZ2lvbkhlbHAodHJlZU5vZGUsIHBhcmVudE5vZGUsIGZsYXROb2RlLCByZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgaG92ZXJoZWxwIGJhc2VkIG9uIHJlZ2lvbgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIGhvdmVyaGVscAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZVJlZ2lvbkhlbHAoSW5kZXhlZFJlZ2lvbiB0cmVlTm9kZSwgSURPTU5vZGUgcGFyZW50Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCXJlc3VsdCA9IGNvbXB1dGVUYWdOYW1lSGVscCgoSURPTU5vZGUpIHRyZWVOb2RlLCBwYXJlbnROb2RlLCBmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJcmVzdWx0ID0gY29tcHV0ZVRhZ0F0dE5hbWVIZWxwKChJRE9NTm9kZSkgdHJlZU5vZGUsIHBhcmVudE5vZGUsIGZsYXROb2RlLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJcmVzdWx0ID0gY29tcHV0ZVRhZ0F0dFZhbHVlSGVscCgoSURPTU5vZGUpIHRyZWVOb2RlLCBwYXJlbnROb2RlLCBmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBob3ZlciBoZWxwIGZvciB0aGUgYXR0cmlidXRlIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVUYWdBdHROYW1lSGVscChJRE9NTm9kZSB4bWxub2RlLCBJRE9NTm9kZSBwYXJlbnROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbih4bWxub2RlKTsKLQkJU3RyaW5nIGF0dE5hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0RGVjbCA9IGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oeG1sbm9kZSwgZWxlbWVudERlY2wsIGF0dE5hbWUpOwotCQlyZXR1cm4gZ2V0QWRkaXRpb25hbEluZm8oZWxlbWVudERlY2wsIGF0dERlY2wpOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBob3ZlciBoZWxwIGZvciB0aGUgYXR0cmlidXRlIHZhbHVlICh0aGlzIGlzIHRoZSBzYW1lIGFzCi0JICogdGhlIGF0dHJpYnV0ZSBuYW1lJ3MgaGVscCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVUYWdBdHRWYWx1ZUhlbHAoSURPTU5vZGUgeG1sbm9kZSwgSURPTU5vZGUgcGFyZW50Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oeG1sbm9kZSk7Ci0JCUlUZXh0UmVnaW9uIGF0dHJOYW1lUmVnaW9uID0gZ2V0QXR0ck5hbWVSZWdpb24oeG1sbm9kZSwgcmVnaW9uKTsKLQotCQlTdHJpbmcgYXR0TmFtZSA9IGZsYXROb2RlLmdldFRleHQoYXR0ck5hbWVSZWdpb24pOwotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dERlY2wgPSBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKHhtbG5vZGUsIGVsZW1lbnREZWNsLCBhdHROYW1lKTsKLQkJcmV0dXJuIGdldEFkZGl0aW9uYWxJbmZvKGVsZW1lbnREZWNsLCBhdHREZWNsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgaG92ZXIgaGVscCBmb3IgdGhlIHRhZyBuYW1lCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlVGFnTmFtZUhlbHAoSURPTU5vZGUgeG1sbm9kZSwgSURPTU5vZGUgcGFyZW50Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oeG1sbm9kZSk7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHBlbGVtZW50RGVjbCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudE5vZGUpOwotCQlyZXR1cm4gZ2V0QWRkaXRpb25hbEluZm8ocGVsZW1lbnREZWNsLCBlbGVtZW50RGVjbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmVpdmVzIGNtbm9kZSdzIGRvY3VtZW50YXRpb24gdG8gZGlzcGxheSBpbiB0aGUgaG92ZXIgaGVscCBwb3B1cC4gSWYKLQkgKiBubyBkb2N1bWVudGF0aW9uIGV4aXN0cyBmb3IgY21ub2RlLCB0cnkgZGlzcGxheWluZyBwYXJlbnRPck93bmVyJ3MKLQkgKiBkb2N1bWVudGF0aW9uCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgYW55IGRvY3VtZW50YXRpb24gaW5mb3JtYXRpb24gdG8gZGlzcGxheSBmb3IgY21ub2RlLgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm90aGluZyB0byBkaXNwbGF5LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QWRkaXRpb25hbEluZm8oQ01Ob2RlIHBhcmVudE9yT3duZXIsIENNTm9kZSBjbW5vZGUpIHsKLQkJU3RyaW5nIGFkZGxJbmZvID0gbnVsbDsKLQotCQlpZiAoY21ub2RlID09IG51bGwpIHsKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdWxsIGRlY2xhcmF0aW9uISIpLnByaW50U3RhY2tUcmFjZSgpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWFkZGxJbmZvID0gZ2V0SW5mb1Byb3ZpZGVyKCkuZ2V0SW5mbyhjbW5vZGUpOwotCQlpZiAoKGFkZGxJbmZvID09IG51bGwpICYmIChwYXJlbnRPck93bmVyICE9IG51bGwpKSB7Ci0JCQlhZGRsSW5mbyA9IGdldEluZm9Qcm92aWRlcigpLmdldEluZm8ocGFyZW50T3JPd25lcik7Ci0JCX0KLQkJcmV0dXJuIGFkZGxJbmZvOwotCX0KLQotCS8qKgotCSAqIEZpbmQgdGhlIHJlZ2lvbiBvZiB0aGUgYXR0cmlidXRlIG5hbWUgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdmFsdWUKLQkgKiByZWdpb24KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0QXR0ck5hbWVSZWdpb24oSURPTU5vZGUgbm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIEZpbmQgdGhlIGF0dHJpYnV0ZSBuYW1lIGZvciB3aGljaCB0aGlzIHBvc2l0aW9uIHNob3VsZCBoYXZlIGEgdmFsdWUKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvcGVuID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3Qgb3BlblJlZ2lvbnMgPSBvcGVuLmdldFJlZ2lvbnMoKTsKLQkJaW50IGkgPSBvcGVuUmVnaW9ucy5pbmRleE9mKHJlZ2lvbik7Ci0JCWlmIChpIDwgMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpID49IDApIHsKLQkJCW5hbWVSZWdpb24gPSBvcGVuUmVnaW9ucy5nZXQoaS0tKTsKLQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZVJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyZWl2ZXMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBpbmRpY2F0ZWQgYnkgYXR0cmlidXRlIG5hbWUgd2l0aGluCi0JICogZWxlbWVudERlY2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKElET01Ob2RlIG5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBTdHJpbmcgYXR0TmFtZSkgewotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gbnVsbDsKLQotCQlpZiAoZWxlbWVudERlY2wgIT0gbnVsbCkgewotCQkJQ01OYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQotCQkJQ01OYW1lZE5vZGVNYXBJbXBsIGFsbEF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKGF0dHJpYnV0ZXMpOwotCQkJTGlzdCBub2RlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIG5vZGUsIGVsZW1lbnREZWNsLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJQ01Ob2RlIGNtbm9kZSA9IChDTU5vZGUpIG5vZGVzLmdldChrKTsKLQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWF0dHJpYnV0ZXMgPSBhbGxBdHRyaWJ1dGVzOwotCi0JCQlTdHJpbmcgbm9wcmVmaXhOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dE5hbWUpOwotCQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKG5vcHJlZml4TmFtZSk7Ci0JCQkJaWYgKGF0dHJEZWNsID09IG51bGwpIHsKLQkJCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0TmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRyRGVjbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyZWl2ZXMgQ01FbGVtZW50RGVjbGFyYXRpb24gZm9yIGdpdmVuIG5vZGUKLQkgKiAKLQkgKiBAcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uIC0gQ01FbGVtZW50RGVjbGFyYXRpb24gb2Ygbm9kZSBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHBvc3NpYmxlCi0JICovCi0JcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKE5vZGUgbm9kZSkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVySW5mbyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG92ZXJJbmZvKElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiBob3ZlclJlZ2lvbikgewotCQlpZiAoKGhvdmVyUmVnaW9uID09IG51bGwpIHx8ICh2aWV3ZXIgPT0gbnVsbCkgfHwgKHZpZXdlci5nZXREb2N1bWVudCgpID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBkaXNwbGF5VGV4dCA9IG51bGw7Ci0JCWludCBkb2N1bWVudE9mZnNldCA9IGhvdmVyUmVnaW9uLmdldE9mZnNldCgpOwotCQlkaXNwbGF5VGV4dCA9IGNvbXB1dGVIb3ZlckhlbHAodmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0KLQkJcmV0dXJuIGRpc3BsYXlUZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZ2lvbiB0byBob3ZlciB0aGUgdGV4dCBvdmVyIGJhc2VkIG9uIHRoZSBvZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHRleHRWaWV3ZXIKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogCi0JICogQHJldHVybiBJUmVnaW9uIHJlZ2lvbiB0byBob3ZlciBvdmVyIGlmIG9mZnNldCBpcyB3aXRoaW4gdGFnIG5hbWUsCi0JICogICAgICAgICBhdHRyaWJ1dGUgbmFtZSwgb3IgYXR0cmlidXRlIHZhbHVlIGFuZCBpZiBvZmZzZXQgaXMgbm90IG92ZXIKLQkgKiAgICAgICAgIGludmFsaWQgd2hpdGVzcGFjZS4gb3RoZXJ3aXNlLCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIjZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIsIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIb3ZlclJlZ2lvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICgodGV4dFZpZXdlciA9PSBudWxsKSB8fCAodGV4dFZpZXdlci5nZXREb2N1bWVudCgpID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJfQotCi0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJLy8gb25seSBzdXBwbHkgaG92ZXJoZWxwIGZvciB0YWcgbmFtZSwgYXR0cmlidXRlIG5hbWUsIG9yCi0JCQkvLyBhdHRyaWJ1dGUgdmFsdWUKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICgocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB8fCAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIGNoZWNrIGlmIHdlIGFyZSBhdCB3aGl0ZXNwYWNlIGJlZm9yZSBvciBhZnRlciBsaW5lCi0JCQkJCUlSZWdpb24gbGluZSA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChvZmZzZXQpOwotCQkJCQlpZiAoKG9mZnNldCA+IChsaW5lLmdldE9mZnNldCgpKSkgJiYgKG9mZnNldCA8IChsaW5lLmdldE9mZnNldCgpICsgbGluZS5nZXRMZW5ndGgoKSkpKSB7Ci0JCQkJCQkvLyBjaGVjayBpZiB3ZSBhcmUgaW4gcmVnaW9uJ3MgdHJhaWxpbmcgd2hpdGVzcGFjZQotCQkJCQkJLy8gKHdoaXRlc3BhY2UgYWZ0ZXIgcmVsZXZhbnQgaW5mbykKLQkJCQkJCWlmIChvZmZzZXQgPCBmbGF0Tm9kZS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbikpIHsKLQkJCQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBpZiBlbmFibGVkIGZsYWcgaXMgZmFsc2UsIGRvbnQgY2FsbCBnZXRIb3ZlclJlZ2lvbiBpbiB0aGUKLQkgKiAgICAgICAgICAgICBmaXJzdCBwbGFjZSBpZiB0cnVlLCB1c2UgZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIsIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIb3ZlclJlZ2lvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0LCBib29sZWFuIGVuYWJsZWQpIHsKLQkJaWYgKCghZW5hYmxlZCkgfHwgKHRleHRWaWV3ZXIgPT0gbnVsbCkgfHwgKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSA9PSBudWxsKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKChJU3RydWN0dXJlZERvY3VtZW50KSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCkpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0KLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCXJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCX0KLQotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIG9ubHkgc3VwcGx5IGhvdmVyaGVscCBmb3IgdGFnIG5hbWUsIGF0dHJpYnV0ZSBuYW1lLCBvcgotCQkJLy8gYXR0cmlidXRlIHZhbHVlCi0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAoKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBjaGVjayBpZiB3ZSBhcmUgYXQgd2hpdGVzcGFjZSBiZWZvcmUgb3IgYWZ0ZXIgbGluZQotCQkJCQlJUmVnaW9uIGxpbmUgPSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCkuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQob2Zmc2V0KTsKLQkJCQkJaWYgKChvZmZzZXQgPiAobGluZS5nZXRPZmZzZXQoKSkpICYmIChvZmZzZXQgPCAobGluZS5nZXRPZmZzZXQoKSArIGxpbmUuZ2V0TGVuZ3RoKCkpKSkgewotCQkJCQkJLy8gY2hlY2sgaWYgd2UgYXJlIGluIHJlZ2lvbidzIHRyYWlsaW5nIHdoaXRlc3BhY2UKLQkJCQkJCS8vICh3aGl0ZXNwYWNlIGFmdGVyIHJlbGV2YW50IGluZm8pCi0JCQkJCQlpZiAob2Zmc2V0IDwgZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pKSB7Ci0JCQkJCQkJcmV0dXJuIG5ldyBSZWdpb24oZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwgcmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5mb1Byb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBmSW5mb1Byb3ZpZGVyIGFuZCBpZiBmSW5mb1Byb3ZpZGVyIHdhcwotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gc2V0IGZJbmZvUHJvdmlkZXIgdG8gRGVmYXVsdEluZm9Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBNYXJrdXBUYWdJbmZvUHJvdmlkZXIgZ2V0SW5mb1Byb3ZpZGVyKCkgewotCQlpZiAoZkluZm9Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmSW5mb1Byb3ZpZGVyID0gbmV3IE1hcmt1cFRhZ0luZm9Qcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5mb1Byb3ZpZGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5YjA0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuU2ltcGxlVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhNTCBleHRlbmRzIFNpbXBsZVRlbXBsYXRlVmFyaWFibGVSZXNvbHZlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX1RZUEUgPSBnZXRFbmNvZGluZ1R5cGUoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFbmNvZGluZ1R5cGUoKSB7Ci0JCXJldHVybiAiZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlbmNvZGluZyB2YXJpYWJsZQotCSAqLwotCXB1YmxpYyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhNTCgpIHsKLQkJc3VwZXIoRU5DT0RJTkdfVFlQRSwgWE1MVUlNZXNzYWdlcy5DcmVhdGluZ19maWxlc19lbmNvZGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlKFRlbXBsYXRlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc5OTNlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMID0gZ2V0QWxsKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEUgPSBnZXRBdHRyaWJ1dGUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQUxVRSA9IGdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVcgPSBnZXROZXcoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IGdldFRhZygpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEFsbCgpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9hbGwiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9hdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX2F0dHJpYnV0ZV92YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV3KCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX25ldyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gInhtbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGFnKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX3RhZyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZVhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2NjZjIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZVhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkdsb2JhbFRlbXBsYXRlVmFyaWFibGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgWE1MIHRlbXBsYXRlIGNvbnRleHQgdHlwZXMuIFRlbXBsYXRlcyBvZiB0aGlzIGNvbnRleHQgdHlwZQotICogYXBwbHkgdG8gYW55IHBsYWNlIHdpdGhpbiBYTUwgY29udGVudCB0eXBlLgotICovCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVDb250ZXh0VHlwZVhNTCBleHRlbmRzIFRlbXBsYXRlQ29udGV4dFR5cGUgewotCi0JcHVibGljIFRlbXBsYXRlQ29udGV4dFR5cGVYTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5DdXJzb3IoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5EYXRlKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuRG9sbGFyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuTGluZVNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlRpbWUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Vc2VyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuV29yZFNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlllYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhNTCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGV4dC9DaGFyYWN0ZXJQYWlySW5zZXJ0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZXh0L0NoYXJhY3RlclBhaXJJbnNlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjYxMzI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZXh0L0NoYXJhY3RlclBhaXJJbnNlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZXh0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudHlwaW5nLkFic3RyYWN0Q2hhcmFjdGVyUGFpckluc2VydGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTFVJUHJlZmVyZW5jZU5hbWVzOw0KLQ0KLXB1YmxpYyBjbGFzcyBDaGFyYWN0ZXJQYWlySW5zZXJ0ZXIgZXh0ZW5kcyBBYnN0cmFjdENoYXJhY3RlclBhaXJJbnNlcnRlciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsNCi0NCi0JLy8gcHJlZmVyZW5jZXMNCi0JcHJpdmF0ZSBib29sZWFuIGZDbG9zZVN0cmluZ3MgPSB0cnVlOw0KLQlwcml2YXRlIGJvb2xlYW4gZkNsb3NlQnJhY2tldHMgPSB0cnVlOw0KLQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRQYWlyKElTb3VyY2VWaWV3ZXIgdmlld2VyLCBjaGFyIGMpIHsNCi0JCXN3aXRjaCAoYykgew0KLQkJCWNhc2UgJ1wnJzoNCi0JCQljYXNlICciJzoNCi0JCQkJcmV0dXJuIGZDbG9zZVN0cmluZ3MgPyBjaGVja1JlZ2lvbih2aWV3ZXIpIDogZmFsc2U7DQotCQkJZGVmYXVsdDoNCi0JCQkJcmV0dXJuIGZDbG9zZUJyYWNrZXRzOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3MgaWYgdGhlIHJlZ2lvbiBzaG91bGQgc3VwcG9ydCBwYWlyZWQgcXVvdGVzDQotCSAqIEBwYXJhbSB2aWV3ZXIgdGhlIHZpZXdlcg0KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlZ2lvbiBpcyBub3QgaW4gYW4gWE1MIGF0dHJpYnV0ZSB2YWx1ZQ0KLQkgKi8NCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrUmVnaW9uKElTb3VyY2VWaWV3ZXIgdmlld2VyKSB7DQotCQlJRG9jdW1lbnQgZG9jID0gdmlld2VyLmdldERvY3VtZW50KCk7DQotCQlmaW5hbCBQb2ludCBzZWxlY3Rpb249IHZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCk7DQotCQlmaW5hbCBpbnQgb2Zmc2V0PSBzZWxlY3Rpb24ueDsNCi0NCi0JCWlmIChkb2MgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7DQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIHJlZ2lvbnMgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvYykuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhvZmZzZXQsIDApOw0KLQkJCWlmIChyZWdpb25zICE9IG51bGwgJiYgcmVnaW9ucy5sZW5ndGggPiAwKSB7DQotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnNbMF0uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsNCi0JCQkJcmV0dXJuIHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQYWlyKGNoYXIgYykgew0KLQkJc3dpdGNoIChjKSB7DQotCQkJY2FzZSAnIic6DQotCQkJY2FzZSAnXCcnOg0KLQkJCWNhc2UgJ1snOg0KLQkJCWNhc2UgJygnOg0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQlkZWZhdWx0Og0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCX0NCi0NCi0JcHJvdGVjdGVkIGNoYXIgZ2V0UGFpcihjaGFyIGMpIHsNCi0JCXN3aXRjaCAoYykgew0KLQkJCWNhc2UgJ1wnJzoNCi0JCQljYXNlICciJzoNCi0JCQkJcmV0dXJuIGM7DQotCQkJY2FzZSAnKCc6DQotCQkJCXJldHVybiAnKSc7DQotCQkJY2FzZSAnWyc6DQotCQkJCXJldHVybiAnXSc7DQotCQkJZGVmYXVsdDoNCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7DQotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCi0JCWZDbG9zZVN0cmluZ3MgPSBzdG9yZS5nZXRCb29sZWFuKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DTE9TRV9TVFJJTkdTKTsNCi0JCWZDbG9zZUJyYWNrZXRzID0gc3RvcmUuZ2V0Qm9vbGVhbihYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ0xPU0VfQlJBQ0tFVFMpOw0KLQkJc3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KLQkJWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsNCi0JCWlmIChYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ0xPU0VfQlJBQ0tFVFMuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpKQ0KLQkJCWZDbG9zZUJyYWNrZXRzID0gKChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKTsNCi0JCWVsc2UgaWYgKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DTE9TRV9TVFJJTkdTLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKSkNCi0JCQlmQ2xvc2VTdHJpbmdzID0gKChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGV4dC9YTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGV4dC9YTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOWZkOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RleHQvWE1MRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkRlZmF1bHRDaGFyYWN0ZXJQYWlyTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRleHQuRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIGV4dGVuZHMgRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gUEFJUlMgPSB7J3snLCAnfScsICcoJywgJyknLCAnWycsICddJywnIicsJyInLCdcJycsJ1wnJ307Ci0KLQlwdWJsaWMgWE1MRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcigpIHsKLQkJc3VwZXIobmV3IFN0cmluZ1tde0RPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLCBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQsIERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQsIERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4sIERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NPTlRFTlR9LCBuZXcgRGVmYXVsdENoYXJhY3RlclBhaXJNYXRjaGVyKFBBSVJTKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC91dGlsL1NoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ODEyNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLQotCi1wdWJsaWMgY2xhc3MgU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9DT05TVFJBSU5PRkYgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0NPTlNUUkFJTk9GRjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQ09OU1RSQUlOT04gPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0NPTlNUUkFJTk9OOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9STERHUk1SID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19EVE9PTF9STERHUk1SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9WQUxJREFURSA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfVkFMSURBVEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0NPTlNUUkFJTk9GRiA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQ09OU1RSQUlOT0ZGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9DT05TVFJBSU5PTiA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQ09OU1RSQUlOT047Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX1JMREdSTVIgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VUT09MX1JMREdSTVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX1ZBTElEQVRFID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9WQUxJREFURTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0FUVFJJQlVURSA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVFJJQlVURTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NEQVRBU0VDVElPTiA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NEQVRBU0VDVElPTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NPTU1FTlQgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DT01NRU5UOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRE9DVFlQRSA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0RPQ1RZUEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9FTEVNRU5UID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRUxFTUVOVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0VOVElUWSA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0VOVElUWV9SRUZFUkVOQ0UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTlRJVFlfUkVGRVJFTkNFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfTk9UQVRJT04gPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9OT1RBVElPTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1BST0NFU1NJTkdJTlNUUlVDVElPTiA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1BST0NFU1NJTkdJTlNUUlVDVElPTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19HRU5FUklDID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfTUFDUk8gPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfTUFDUk87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UWFRFWFQgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UWFRFWFQ7Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHNwZWNpZmllZCBpbWFnZSBmcm9tIHRoZSB4bWwgc291cmNlIGVkaXRvciBwbHVnaW4ncyBpbWFnZQotCSAqIHJlZ2lzdHJ5LiBOb3RlOiBUaGUgcmV0dXJuZWQgPGNvZGU+SW1hZ2U8L2NvZGU+IGlzIG1hbmFnZWQgYnkgdGhlCi0JICogd29ya2JlbmNoOyBjbGllbnRzIG11c3QgPGI+bm90IDwvYj4gZGlzcG9zZSBvZiB0aGUgcmV0dXJuZWQgaW1hZ2UuCi0JICogCi0JICogQHBhcmFtIHN5bWJvbGljTmFtZQotCSAqICAgICAgICAgICAgdGhlIHN5bWJvbGljIG5hbWUgb2YgdGhlIGltYWdlOyB0aGVyZSBhcmUgY29uc3RhbnRzIGRlY2xhcmVkCi0JICogICAgICAgICAgICBpbiB0aGlzIGNsYXNzIGZvciBidWlsZC1pbiBpbWFnZXMgdGhhdCBjb21lIHdpdGggdGhlIHhtbAotCSAqICAgICAgICAgICAgc291cmNlIGVkaXRvcgotCSAqIEByZXR1cm4gdGhlIGltYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2Uoc3ltYm9saWNOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGRlc2NyaXB0b3IgZm9yIHNwZWNpZmllZCBpbWFnZSBmcm9tIHRoZSB4bWwgc291cmNlCi0JICogZWRpdG9yIHBsdWdpbidzIGltYWdlIHJlZ2lzdHJ5LiBVbmxpa2UgPGNvZGU+SW1hZ2U8L2NvZGU+cywgaW1hZ2UKLQkgKiBkZXNjcmlwdG9ycyB0aGVtc2VsdmVzIGRvIG5vdCBuZWVkIHRvIGJlIGRpc3Bvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBzeW1ib2xpY05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHRoZSBpbWFnZTsgdGhlcmUgYXJlIGNvbnN0YW50cyBkZWNsYXJlZAotCSAqICAgICAgICAgICAgaW4gdGhpcyBpbnRlcmZhY2UgZm9yIGJ1aWxkLWluIGltYWdlcyB0aGF0IGNvbWUgd2l0aCB0aGUgeG1sCi0JICogICAgICAgICAgICBzb3VyY2UgZWRpdG9yCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKHN5bWJvbGljTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvWE1MQ29tbW9uUmVzb3VyY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdXRpbC9YTUxDb21tb25SZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiYTBiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdXRpbC9YTUxDb21tb25SZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgdXNlIFhNTFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCkgaW5zdGVhZAotICovCi0vKioKLSAqIFRoaXMgY2xhc3MgZXhpc3RzIHRlbXBvcmFyaWx5IHVudGlsIHRoZSBwcm9wZXJ0aWVzIGZpbGVzIGNhbiBiZQotICogcmUtb3JnYW5pemVkIGFuZCB0aGUgdmFyaW91cyByZXNvdXJjZSByZWZlcmVuY2VzIGNhbiBiZSB1cGRhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb21tb25SZXNvdXJjZXMgewotCXByb3RlY3RlZCBzdGF0aWMgWE1MQ29tbW9uUmVzb3VyY2VzIGluc3RhbmNlOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWE1MQ29tbW9uUmVzb3VyY2VzIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgWE1MQ29tbW9uUmVzb3VyY2VzKFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKSk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgWE1MVUlQbHVnaW4gZWRpdG9yUGx1Z2luOwotCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotCXB1YmxpYyBYTUxDb21tb25SZXNvdXJjZXMoWE1MVUlQbHVnaW4gZWRpdG9yUGx1Z2luKSB7Ci0JCWluc3RhbmNlID0gdGhpczsKLQkJdGhpcy5lZGl0b3JQbHVnaW4gPSBlZGl0b3JQbHVnaW47Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpblJlc291cmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIFRPRE8uLi4gbG9nIGFuIGVycm9yIG1lc3NhZ2UKLQkJCS8vIEIyQlV0aWxQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoQjJCVXRpbFBsdWdpbi5nZXRHVUlTdHJpbmcoIl9XQVJOX1BMVUdJTl9QUk9QRVJUSUVTX01JU1NJTkciKQotCQkJLy8gKyBkZXNjcmlwdG9yLmdldExhYmVsKCkpOwotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JSW1hZ2VEZXNjcmlwdG9yIF9nZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGljb25OYW1lKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oWE1MVUlQbHVnaW4uSUQsIGljb25OYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2V0cyB0aGUgc3RyaW5nIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgYW5kIGRvZXMgb25lIHN1YnN0aXR1dGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBuZXcgT2JqZWN0W117czF9KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGdldHMgdGhlIHN0cmluZyByZXNvdXJjZSBhbmQgZG9lcyB0d28gc3Vic3RpdHV0aW9ucy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEsIE9iamVjdCBzMikgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXXtzMSwgczJ9KTsKLQl9Ci0KLQlwdWJsaWMgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7Ci0JCXJldHVybiBlZGl0b3JQbHVnaW4uZ2V0V29ya2JlbmNoKCk7Ci0JfQotCS8qCi0JICogcHVibGljIEltYWdlRmFjdG9yeSBnZXRJbWFnZUZhY3RvcnkoKSB7IHJldHVybiBpbWFnZUZhY3Rvcnk7IH0KLQkgKi8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC91dGlsL1hNTENvbW1vblVJQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvWE1MQ29tbW9uVUlDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2M2Q1MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvWE1MQ29tbW9uVUlDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbDsKLQotLyoqCi0gKiBDb250ZXh0IGhlbHAgaWQgY29uc3RhbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhNTENvbW1vblVJQ29udGV4dElkcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIENPTlRFWFRfSUQgeGN1aTA1MDAgZm9yIEVkaXQgQXR0cmlidXRlIEluc3RydWN0aW9uIERpYWxvZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhDVUlfQVRUUklCVVRFX0RJQUxPRyA9IFBMVUdJTl9OQU1FICsgIi54Y3VpMDUwMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIENPTlRFWFRfSUQgeGN1aTA0MDAgZm9yIFNlbGVjdCBYTUwgQ2F0YWxvZyBJRCBEaWFsb2cgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX0NBVEFMT0dfRElBTE9HID0gUExVR0lOX05BTUUgKyAiLnhjdWkwNDAwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogQ09OVEVYVF9JRHMgZm9yIFhNTCBDb21tb24gVUkgdXNlIHhjdWl4eHggY29udGV4dCBJRHMgKi8KLQotCS8qIENPTlRFWFRfSUQgeGN1aTAwMTAgZm9yIEVkaXQgRG9jdHlwZSBEaWFsb2cgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX0RPQ1RZUEVfRElBTE9HID0gUExVR0lOX05BTUUgKyAiLnhjdWkwMDEwIjsgLy8kTk9OLU5MUy0xJAotCS8qIENPTlRFWFRfSUQgeGN1aTAwMzAgZm9yIFB1YmxpYyBJRCBUZXh0IEVkaXQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX0RPQ1RZUEVfUFVCTElDID0gUExVR0lOX05BTUUgKyAiLnhjdWkwMDMwIjsgLy8kTk9OLU5MUy0xJAotCS8qIENPTlRFWFRfSUQgeGN1aTAwMjAgZm9yIFJvb3QgRWxlbWVudCBOYW1lIFRleHQgRWRpdCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhDVUlfRE9DVFlQRV9ST09UID0gUExVR0lOX05BTUUgKyAiLnhjdWkwMDIwIjsgLy8kTk9OLU5MUy0xJAotCS8qIENPTlRFWFRfSUQgeGN1aTAwNDAgZm9yIFN5c3RlbSBJRCBUZXh0IEVkaXQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX0RPQ1RZUEVfU1lTVEVNID0gUExVR0lOX05BTUUgKyAiLnhjdWkwMDUwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogQ09OVEVYVF9JRCB4Y3VpMDMwMCBmb3IgRWRpdCBFbGVtZW50IEluc3RydWN0aW9uIERpYWxvZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhDVUlfRUxFTUVOVF9ESUFMT0cgPSBQTFVHSU5fTkFNRSArICIueGN1aTA2MDAiOyAvLyROT04tTkxTLTEkCi0KLQkvKiBDT05URVhUX0lEIHhjdWkwMjAwIGZvciBFZGl0IE5hbWVzcGFjZSBEaWFsb2cgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX05BTUVTUEFDRV9ESUFMT0cgPSBQTFVHSU5fTkFNRSArICIueGN1aTAyMDAiOyAvLyROT04tTkxTLTEkCi0KLQkvKiBDT05URVhUX0lEIHhjdWkwMzAwIGZvciBFZGl0IFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24gRGlhbG9nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWENVSV9QUk9DRVNTSU5HX0RJQUxPRyA9IFBMVUdJTl9OQU1FICsgIi54Y3VpMDMwMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIENPTlRFWFRfSUQgeGN1aTAxMDAgZm9yIEVkaXQgU2NoZW1hIEluZm9ybWF0aW9uIERpYWxvZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhDVUlfU0NIRU1BX0lORk9fRElBTE9HID0gUExVR0lOX05BTUUgKyAiLnhjdWkwMTAwIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTJjMDcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucXVpY2thc3Npc3QuSVF1aWNrQXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5Bbm5vdGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuSW5jcmVtZW50YWxSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLklNZXNzYWdlQWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uQW5ub3RhdGlvbk1zZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBBIERlbGVnYXRpbmdSZWNvbmNpbGVWYWxpZGF0b3IgY2FsbHMgaXRzIGRlbGVnYXRlIHZhbGlkYXRvciB0byBnZXQgYSBsaXN0Ci0gKiBvZiB2YWxpZGF0aW9uIGVycm9yIElNZXNzYWdlcy4gVXNpbmcgaW5mb3JtYXRpb24gaW4gdGhpcyBJTWVzc2FnZSB0aGUKLSAqIERlbGVnYXRpbmdSZWNvbmNpbGVWYWxpZGF0b3IgdXBkYXRlcyB0aGUgSU1lc3NhZ2Ugd2l0aCBhbiBvZmZzZXQgYW5kIGxlbmd0aAotICogdG8gZ2l2ZSBhIGdvb2QgcmFuZ2UgdG8gYmUgInNxdWlnZ2xlZCIgYW5kIGFkZHMgdGhlIG1lc3NhZ2VzIHRvIHRoZQotICogSVJlcG9ydGVyCi0gKiAKLSAqIEBhdXRob3IgTWFyayBIdXRjaGluc29uCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLQkvLyB0aGUgc2VsZWN0aW9uIHN0cmF0ZWdpZXM6Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMX0FUVFJJQlVURVMgPSAiQUxMX0FUVFJJQlVURVMiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSAiQVRUUklCVVRFX05BTUUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1ZBTFVFID0gIkFUVFJJQlVURV9WQUxVRSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9UQUcgPSAiU1RBUlRfVEFHIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAiVEVYVCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSVJTVF9OT05fV0hJVEVTUEFDRV9URVhUID0gIkZJUlNUX05PTl9XSElURVNQQUNFX1RFWFQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FTlRJVFlfUkVGRVJFTkNFID0gIlRFWFRfRU5USVRZX1JFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9PRl9BVFRSSUJVVEVfV0lUSF9HSVZFTl9WQUxVRSA9ICJWQUxVRV9PRl9BVFRSSUJVVEVfV0lUSF9HSVZFTl9WQUxVRSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfVEFHID0gIkVORF9UQUciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVSUNLQVNTSVNUUFJPQ0VTU09SID0gSVF1aWNrQXNzaXN0UHJvY2Vzc29yLmNsYXNzLmdldE5hbWUoKTsKLQkKLQotCi0JLyoqCi0JICogVGhpcyBjb25zdGFudCBzcGVjaWZpZXMgdGhlIGF0dHJpYnV0ZSBuYW1lIHRoYXQgc3BlY2lmaWVzIHRoZSBzaWRlIG9mCi0JICogdGhlICdzdGFydCB0YWcnIHRoYXQgdGhlIHZhbGlkYXRvciBoYXMgdXNlZCB0byByZXBvcnQgYW4gZXJyb3IuIEEKLQkgKiB2YWxpZGF0b3IgbWF5IGNob29zZSB0byByZXBvcnQgYSBtZXNzYWdlIGF0IHRoZSBsZWZ0ICh0aGUgc3RhcnQgb2YgdGhlCi0JICogc3RhcnQgdGFnKW9yIGF0IHRoZSByaWdodCAodGhlIGVuZCBvZiB0aGUgc3RhcnQgdGFnKS4gV2hlbiB0aGlzCi0JICogYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQgZXJyb3IgRVJST1JfU0lERV9MRUZUIGlzIHRoZSBkZWZhdWx0LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1NJREUgPSAiRVJST1JfU0lERSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFdoZW4gdGhlIEVSUk9SX1NJREUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgRVJST1JfU0lERV9MRUZUIHZhbHVlIGl0IGlzCi0JICogYXNzdW1lZCB0aGF0IHRoZSBtZXNzYWdlIHNwZWNpZmllcyBhIGxvY2F0aW9uIHRvIHRoZSBsZWZ0IG9mIHRoZSBzdGFydAotCSAqIHRhZwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1NJREVfTEVGVCA9ICJFUlJPUl9TSURFX0xFRlQiOyAvLyROT04tTkxTLTEkCQotCi0JLyoqCi0JICogV2hlbiB0aGUgRVJST1JfU0lERSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBFUlJPUl9TSURFX1JJR0hUIHZhbHVlIGl0Ci0JICogaXMgYXNzdW1lZCB0aGF0IHRoZSBtZXNzYWdlIHNwZWNpZmllcyBhIGxvY2F0aW9uIHRvIHRoZSByaWdodCBvZiB0aGUKLQkgKiBzdGFydCB0YWcKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9TSURFX1JJR0hUID0gIkVSUk9SX1NJREVfUklHSFQiOyAvLyROT04tTkxTLTEkCQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05VTUJFUl9BVFRSSUJVVEUgPSAiY29sdW1uTnVtYmVyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNRVUlHR0xFX1NFTEVDVElPTl9TVFJBVEVHWV9BVFRSSUJVVEUgPSAic3F1aWdnbGVTZWxlY3Rpb25TdHJhdGVneSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUVVJR0dMRV9OQU1FX09SX1ZBTFVFX0FUVFJJQlVURSA9ICJzcXVpZ2dsZU5hbWVPclZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7IC8vIGNvbnN0cnVjdG9yCi0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgYXJnMCkgeyAvLyBkb24ndCBuZWVkIHRvIGltcGxlbWVudAotCX0KLQotCS8vIE15IEltcGxlbWVudGF0aW9uIG9mIElIZWxwZXIKLQljbGFzcyBNeUhlbHBlciBpbXBsZW1lbnRzIElQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQgewotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbTsKLQotCQlJRmlsZSBmaWxlOwotCi0JCXB1YmxpYyBNeUhlbHBlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgSUZpbGUgZmlsZSkgewotCQkJdGhpcy5pbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCQkJdGhpcy5maWxlID0gZmlsZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0QnVpbGRLaW5kKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGxvYWRNb2RlbChTdHJpbmcgc3ltYm9saWNOYW1lLCBPYmplY3RbXSBwYXJtcykgewotCQkJaWYgKHN5bWJvbGljTmFtZS5lcXVhbHMoImdldEZpbGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZpbGU7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJCWlmIChzeW1ib2xpY05hbWUuZXF1YWxzKCJpbnB1dFN0cmVhbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gaW5wdXRTdHJlYW07Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmdbXSBnZXRVUklzKCkgewotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgU3RyaW5nW117ZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCl9OwotCQkJfQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCX0KLQotCQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8vIE15IEltcGxlbWVudGF0aW9uIG9mIElSZXBvcnRlcgotCWNsYXNzIE15UmVwb3J0ZXIgaW1wbGVtZW50cyBJUmVwb3J0ZXIgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIE15UmVwb3J0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkTWVzc2FnZShJVmFsaWRhdG9yIG9yaWdpbiwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQkJbGlzdC5hZGQobWVzc2FnZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwbGF5U3VidGFzayhJVmFsaWRhdG9yIHZhbGlkYXRvciwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQkJLyogZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50ICovCi0JCX0KLQotCQlwdWJsaWMgSU1lc3NhZ2VBY2Nlc3MgZ2V0TWVzc2FnZUFjY2VzcygpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIG9yaWdpbiwgT2JqZWN0IG9iamVjdCkgeyAvLyBkbwotCQkJLyogZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50ICovCi0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIG9yaWdpbikgewotCQkJLyogZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50ICovCi0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlU3Vic2V0KElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3Qgb2JqLCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ly8gZG8KLQkJCS8qIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCAqLwotCQl9Ci0KLQkJcHVibGljIExpc3QgZ2V0TWVzc2FnZXMoKSB7Ci0JCQlyZXR1cm4gbGlzdDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJVmFsaWRhdG9yIGdldERlbGVnYXRlVmFsaWRhdG9yKCk7Ci0KLQkvKioKLQkgKiBDYWxscyBhIGRlbGVnYXRlIHZhbGlkYXRvciBnZXR0aW5nIGFuZCB1cGRhdGVzIGl0J3MgbGlzdCBvZgotCSAqIFZhbGlkYXRpb25NZXNzYWdlcyB3aXRoIGEgZ29vZCBzcXVpZ2dsZSBvZmZzZXQgYW5kIGxlbmd0aC4KLQkgKiAKLQkgKiBAcGFyYW0gaGVscGVyCi0JICogICAgICAgICAgICBsb2FkcyBhbiBvYmplY3QuCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICogICAgICAgICAgICBJcyBhbiBpbnN0YW5jZSBvZiBhbiBJUmVwb3J0ZXIgaW50ZXJmYWNlLCB3aGljaCBpcyB1c2VkIGZvcgotCSAqICAgICAgICAgICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgdXNlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10gZGVsdGEgPSBoZWxwZXIuZ2V0VVJJcygpOwotCQlpZiAoZGVsdGEubGVuZ3RoID4gMCkgewotCQkJLy8gZ2V0IHRoZSBmaWxlLCBtb2RlbCBhbmQgZG9jdW1lbnQ6Ci0JCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShkZWx0YVswXSk7Ci0JCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCQl4bWxNb2RlbCA9IGdldE1vZGVsRm9yUmVzb3VyY2UoZmlsZSk7Ci0JCQkvLyBzb21lIHByb2JsZW0gb2NjdXJyZWQsIGFib3J0Ci0JCQlpZiAoeG1sTW9kZWwgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQkJCS8vIHN0b3JlIHRoZSB0ZXh0IGluIGEgYnl0ZSBhcnJheTsgbWFrZSBhIGZ1bGwgY29weSB0byBlYXNlCi0JCQkJLy8gYW55IHRocmVhZGluZyBwcm9ibGVtcwotCQkJCWJ5dGVbXSBieXRlQXJyYXk7Ci0JCQkJdHJ5IHsKLQkJCQkJYnl0ZUFycmF5ID0geG1sTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KCkuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0JCQkJfQotCQkJCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gTm90IGxpa2VseSB0byBoYXBwZW4KLQkJCQkJYnl0ZUFycmF5ID0geG1sTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KCkuZ2V0Qnl0ZXMoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaXNEZWxlZ2F0ZVZhbGlkYXRvckVuYWJsZWQoZmlsZSkpIHsKLQkJCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXREZWxlZ2F0ZVZhbGlkYXRvcigpOwotCQkJCQlpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKLQkJCQkJCS8vIFZhbGlkYXRlIHRoZSBmaWxlOgotCQkJCQkJSVZhbGlkYXRpb25Db250ZXh0IHZIZWxwZXIgPSBuZXcgTXlIZWxwZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVBcnJheSksIGZpbGUpOwotCQkJCQkJTXlSZXBvcnRlciB2UmVwb3J0ZXIgPSBuZXcgTXlSZXBvcnRlcigpOwotCQkJCQkJaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIElWYWxpZGF0b3JKb2IpIHsKLQkJCQkJCQkoKElWYWxpZGF0b3JKb2IpIHZhbGlkYXRvcikudmFsaWRhdGVJbkpvYih2SGVscGVyLCB2UmVwb3J0ZXIpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJdmFsaWRhdG9yLnZhbGlkYXRlKHZIZWxwZXIsIHZSZXBvcnRlcik7Ci0JCQkJCQl9Ci0JCQkJCQlMaXN0IG1lc3NhZ2VzID0gdlJlcG9ydGVyLmxpc3Q7Ci0KLQkJCQkJCS8vIHNldCB0aGUgb2Zmc2V0IGFuZCBsZW5ndGgKLQkJCQkJCXVwZGF0ZVZhbGlkYXRpb25NZXNzYWdlcyhtZXNzYWdlcywgZG9jdW1lbnQsIHJlcG9ydGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCi0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpdGVyYXRlcyB0aHJvdWdoIHRoZSBtZXNzYWdlcyBhbmQgY2FsY3VsYXRlcyBhICJiZXR0ZXIiIG9mZnNldCBhbmQKLQkgKiBsZW5ndGgKLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZXMgLQotCSAqICAgICAgICAgICAgYSBMaXN0IG9mIElNZXNzYWdlcwotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQKLQkgKiBAcGFyYW0gcmVwb3J0ZXIgLQotCSAqICAgICAgICAgICAgdGhlIHJlcG9ydGVyIHRoZSBtZXNzYWdlcyBhcmUgdG8gYmUgYWRkZWQgdG8KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVWYWxpZGF0aW9uTWVzc2FnZXMoTGlzdCBtZXNzYWdlcywgSURPTURvY3VtZW50IGRvY3VtZW50LCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlcy5zaXplKCk7IGkrKykgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IChJTWVzc2FnZSkgbWVzc2FnZXMuZ2V0KGkpOwotCQkJdHJ5IHsKLQkJCQlpZiAobWVzc2FnZS5nZXRBdHRyaWJ1dGUoQ09MVU1OX05VTUJFUl9BVFRSSUJVVEUpICE9IG51bGwpIHsKLQkJCQkJaW50IGNvbHVtbiA9ICgoSW50ZWdlcikgbWVzc2FnZS5nZXRBdHRyaWJ1dGUoQ09MVU1OX05VTUJFUl9BVFRSSUJVVEUpKS5pbnRWYWx1ZSgpOwotCQkJCQlpZiAobWVzc2FnZS5nZXRBdHRyaWJ1dGUoQW5ub3RhdGlvbk1zZy5QUk9CTUxFTV9JRCkgIT0gbnVsbCAmJiByZXBvcnRlciBpbnN0YW5jZW9mIEluY3JlbWVudGFsUmVwb3J0ZXIpewotCQkJCQkJSW50ZWdlciBwcm9ibGVtSWQgPSAoSW50ZWdlciltZXNzYWdlLmdldEF0dHJpYnV0ZShBbm5vdGF0aW9uTXNnLlBST0JNTEVNX0lEKTsKLQkJCQkJCU1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvcigpOwotCQkJCQkJcHJvY2Vzc29yLnNldFByb2JsZW1JZChwcm9ibGVtSWQuaW50VmFsdWUoKSk7Ci0JCQkJCQltZXNzYWdlLnNldE9mZnNldChjb2x1bW4pOwotCQkJCQkJSW50ZWdlciBsZW5ndGggPSAoSW50ZWdlcikgbWVzc2FnZS5nZXRBdHRyaWJ1dGUoQW5ub3RhdGlvbk1zZy5MRU5HVEgpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgoIGxlbmd0aC5pbnRWYWx1ZSgpKTsKLQkJCQkJCU9iamVjdCBhdHRyVmFsdWUgPSBtZXNzYWdlLmdldEF0dHJpYnV0ZShBbm5vdGF0aW9uTXNnLkFUVFJWQUxVRVRFWFQpOwotCQkJCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsKQotCQkJCQkJCXByb2Nlc3Nvci5zZXRBZGRpdGlvbmFsRml4SW5mbyhhdHRyVmFsdWUpOwotCQkJCQkJZWxzZXsKLQkJCQkJCQlPYmplY3QgYXR0clZhbHVlTm8gPSBtZXNzYWdlLmdldEF0dHJpYnV0ZShBbm5vdGF0aW9uTXNnLkFUVFJWQUxVRU5PKTsKLQkJCQkJCQlpZiAoYXR0clZhbHVlTm8gIT0gbnVsbCl7Ci0JCQkJCQkJCWludCBsZW4gPSAoKEludGVnZXIpYXR0clZhbHVlTm8pLmludFZhbHVlKCk7Ci0JCQkJCQkJCU9iamVjdFtdIG9iakFycmF5ID0gbmV3IE9iamVjdFtsZW5dOwotCQkJCQkJCQlmb3IgKCBpbnQgaj0wOyBqPGxlbjsgaisrKXsKLQkJCQkJCQkJCW9iakFycmF5W2pdID0gbWVzc2FnZS5nZXRBdHRyaWJ1dGUoQW5ub3RhdGlvbk1zZy5BVFRSTk8gKyBqKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlwcm9jZXNzb3Iuc2V0QWRkaXRpb25hbEZpeEluZm8ob2JqQXJyYXkpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKFFVSUNLQVNTSVNUUFJPQ0VTU09SLCBwcm9jZXNzb3IpOwotCQkJCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlKTsKLQkJCQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcikgcmVwb3J0ZXIpLmFkZEFubm90YXRpb25JbmZvKHRoaXMsIGluZm8pOwotCQkJCQl9Ci0JCQkJCWVsc2UgIHsKLQkJCQkJCVN0cmluZyBzZWxlY3Rpb25TdHJhdGVneSA9IChTdHJpbmcpIG1lc3NhZ2UuZ2V0QXR0cmlidXRlKFNRVUlHR0xFX1NFTEVDVElPTl9TVFJBVEVHWV9BVFRSSUJVVEUpOwotCQkJCQkJU3RyaW5nIG5hbWVPclZhbHVlID0gKFN0cmluZykgbWVzc2FnZS5nZXRBdHRyaWJ1dGUoU1FVSUdHTEVfTkFNRV9PUl9WQUxVRV9BVFRSSUJVVEUpOwotCi0JCQkJCQkvLyBjb252ZXJ0IHRoZSBsaW5lIGFuZCBDb2x1bW4gbnVtYmVycyB0byBhbiBvZmZzZXQ6Ci0JCQkJCQlpbnQgc3RhcnQgPSBkb2N1bWVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KG1lc3NhZ2UuZ2V0TGluZU51bWJlcigpIC0gMSkgKyBjb2x1bW4gLSAxOwotCQkJCQkJaW50W10gcmVzdWx0ID0gY29tcHV0ZVN0YXJ0QW5kRW5kTG9jYXRpb24oc3RhcnQsIHNlbGVjdGlvblN0cmF0ZWd5LCBnZXRFcnJvclNpZGUobWVzc2FnZSksIG5hbWVPclZhbHVlLCBkb2N1bWVudCk7Ci0JCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQkJCQltZXNzYWdlLnNldE9mZnNldChyZXN1bHRbMF0pOwotCQkJCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKHJlc3VsdFsxXSAtIHJlc3VsdFswXSk7Ci0JCQkJCQkKLQkJCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCX0KLQkJCQkKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7IC8vIHRoaXMgZXhjZXB0aW9uIHNob3VsZCBub3QKLQkJCQkvLyBvY2N1ciAtIGl0IGlzIHRocm93biBpZgotCQkJCS8vIHRyeWluZyB0byBjb252ZXJ0IGFuCi0JCQkJLy8gaW52YWxpZCBsaW5lIG51bWJlciB0byBhbmQKLQkJCQkvLyBvZmZzZXQKLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlbHRhCi0JICogICAgICAgICAgICB0aGUgSUZpbGVEZWx0YSBjb250YWluaW5nIHRoZSBmaWxlIG5hbWUgdG8gZ2V0Ci0JICogQHJldHVybiB0aGUgSUZpbGUKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZShTdHJpbmcgZGVsdGEpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGRlbHRhKTsKLQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCSAgSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJICBpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpCi0JCSAgICByZXR1cm4gZmlsZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gZ2V0IHRoZSBtb2RlbCBmb3IKLQkgKiBAcmV0dXJuIHRoZSBmaWxlJ3MgWE1MTW9kZWwgb3IgbnVsbAotCSAqLwotCXByb3RlY3RlZCBJRE9NTW9kZWwgZ2V0TW9kZWxGb3JSZXNvdXJjZShJRmlsZSBmaWxlKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCi0JCXRyeSB7Ci0JCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCQkJLy8gVE9ETy4uIEhUTUwgdmFsaWRhdG9yIHRyaWVzIGFnYWluIHRvIGdldCBhIG1vZGVsIGEgMm5kIHdheQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBlKTsKLQkJfQotCi0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkKLQkJCXJldHVybiAoSURPTU1vZGVsKSBtb2RlbDsKLQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGNvbXB1dGVTdGFydEVuZExvY2F0aW9uKGludCBzdGFydE9mZnNldCwgU3RyaW5nCi0JICogICAgICAgICAgICAgZXJyb3JNZXNzYWdlLCBTdHJpbmcgc2VsZWN0aW9uU3RyYXRlZ3ksIGJvb2xlYW4gbGVmdEVycm9yLAotCSAqICAgICAgICAgICAgIFN0cmluZyBuYW1lT3JWYWx1ZSwgSURPTURvY3VtZW50IGRvY3VtZW50KSB7Ci0JICogCi0JICovCi0JcHJvdGVjdGVkIGludFtdIGNvbXB1dGVTdGFydEVuZExvY2F0aW9uKGludCBzdGFydE9mZnNldCwgU3RyaW5nIGVycm9yTWVzc2FnZSwgU3RyaW5nIHNlbGVjdGlvblN0cmF0ZWd5LCBTdHJpbmcgbmFtZU9yVmFsdWUsIElET01Eb2N1bWVudCBkb2N1bWVudCkgewotCQlyZXR1cm4gY29tcHV0ZVN0YXJ0QW5kRW5kTG9jYXRpb24oc3RhcnRPZmZzZXQsIHNlbGVjdGlvblN0cmF0ZWd5LCBFUlJPUl9TSURFX1JJR0hULCBuYW1lT3JWYWx1ZSwgZG9jdW1lbnQpOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZXMgdGhlICJiZXR0ZXIiIG9mZnNldHMuCi0JICogCi0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0IC0KLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgZ2l2ZW4gYnkgWGVyY2VzCi0JICogQHBhcmFtIGVycm9yTWVzc2FnZSAtCi0JICogICAgICAgICAgICB0aGUgWGVyY2VzIGVycm9yIE1lc3NhZ2UKLQkgKiBAcGFyYW0gc2VsZWN0aW9uU3RyYXRlZ3kgLQotCSAqICAgICAgICAgICAgdGhlIHNlbGVjdGlvblN0cmF0ZWd5Ci0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudAotCSAqIEByZXR1cm4gaW50W10gLSBwb3NpdGlvbiAwIGhhcyB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBzcXVpZ2dsZSByYW5nZSwKLQkgKiAgICAgICAgIHBvc2l0aW9uIDEgaGFzIHRoZSBlbmRPZmZzZXQKLQkgKi8KLQkvKgotCSAqIFRoZSB3YXkgdGhlIG9mZnNldHMgaXMgY2FsY3VsYXRlZCBpczogLSBmaW5kIHRoZSBpbmRleGVkIHJlZ2lvbgotCSAqIChlbGVtZW50KSBjbG9zZXN0IHRvIHRoZSBnaXZlbiBvZmZzZXQgLSBpZiB3ZSBhcmUgYmV0d2VlbiB0d28gZWxlbWVudHMsCi0JICogY2hvb3NpbmcgbGVmdCBvciByaWdodCBlbGVtZW50IHdpbGwgZGVwZW5kIG9uIHBhcmFtZXRlciAnZXJyb3JTaWRlJyAtCi0JICogYmFzZWQgb24gdGhlIHNlbGVjdGlvblN0cmF0ZWd5IGNob29zZSB0aGUgdW5kZXJsaW5pbmcgc3RyYXRlZ3kgKGVnCi0JICogU1RBUlRfVEFHIG1lYW5zIHVuZGVybGluZSB0aGUgc3RhcnQgdGFnIG9mIHRoYXQgZWxlbWVudCkgLSB1c2UKLQkgKiBpbmZvcm1hdGlvbiBmcm9tIG5hbWVPclZhbHVlIGFuZCB0aGUgRE9NIHRvIGdldCBiZXR0ZXIgb2Zmc2V0cwotCSAqIAotCSAqLwotCXByb3RlY3RlZCBpbnRbXSBjb21wdXRlU3RhcnRBbmRFbmRMb2NhdGlvbihpbnQgc3RhcnRPZmZzZXQsIFN0cmluZyBzZWxlY3Rpb25TdHJhdGVneSwgU3RyaW5nIGVycm9yU2lkZSwgU3RyaW5nIG5hbWVPclZhbHVlLCBJRE9NRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdHJ5IHsKLQkJCWludCBzdGFydEVuZFBvc2l0aW9uc1tdID0gbmV3IGludFsyXTsKLQotCQkJSW5kZXhlZFJlZ2lvbiByZWdpb24gPSBkb2N1bWVudC5nZXRNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oc3RhcnRPZmZzZXQpOwotCQkJSW5kZXhlZFJlZ2lvbiBwcmV2UmVnaW9uID0gZG9jdW1lbnQuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0T2Zmc2V0IC0gMSk7Ci0KLQkJCWlmIChwcmV2UmVnaW9uICE9IHJlZ2lvbikgewotCQkJCS8vIGlmIGJldHdlZW4gdHdvIHJlZ2lvbnMgd2UgdXNlIHRoZSAnZXJyb3JTaWRlJyB0byB1bmRlcnN0YW5kCi0JCQkJLy8gd2hpY2gKLQkJCQkvLyBlbGVtZW50IGlzIGFwcGxpY2FibGUuIGlmIHdlIGtub3cgdGhlIGVycm9yIGhhcyBiZWVuCi0JCQkJLy8gcmVwb3J0ZWQgdG8gdGhlCi0JCQkJLy8gcmlnaHQgb2YgdGhlIHRhZywgdGhlbiB3ZSBjYW4gYXNzdW1lIHdlIG5lZWQgdG8gc3RlcCBiYWNrCi0JCQkJLy8gdG8gdGhlIHByZXZpb3VzCi0JCQkJLy8gcmVnaW9uIHRvIGxhbmQgYXQgdGhlICdjb3JyZWN0IGxvY2F0aW9uLiBPdGhlcndpc2UgYXNzdW1lCi0JCQkJLy8gd2UncmUKLQkJCQkvLyBleGFjdGx5IHdoZXJlIHdlIG5lZWQgdG8gYmUuCi0JCQkJaWYgKEVSUk9SX1NJREVfTEVGVC5lcXVhbHMoZXJyb3JTaWRlKSkgewotCQkJCQlyZWdpb24gPSBwcmV2UmVnaW9uOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaW5pdGlhbGl6ZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyB0byBiZSB0aGUgc3RhcnQgcG9zaXRpb25zCi0JCQkvLyB0aGlzIG1lYW5zIGlmIHRoZQotCQkJLy8gc3BlY2lhbCBjYXNlIGlzIG5vdCB0YWtlbiBjYXJlIG9mIGJlbG93IHRoZSBzdGFydCBhbmQgZW5kCi0JCQkvLyBvZmZzZXQgYXJlIHNldCB0byBiZQotCQkJLy8gdGhlIHN0YXJ0IG9mIHRoZSByZWdpb24gd2hlcmUgdGhlIGVycm9yIHdhcwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSByZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IHN0YXJ0RW5kUG9zaXRpb25zWzBdOwotCQkJfQotCQkJZWxzZSB7IC8vIHRoaXMgd2lsbCBtZXNzYWdlIHdpbGwgbm90IGdldCBhZGRlZCB0byB0aGUgSVJlcG9ydGVyCi0JCQkJLy8gc2luY2UgdGhlIGxlbmd0aCBpcyAwCi0JCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSAwOwotCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzFdID0gMDsKLQkJCX0KLQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIHJlZ2lvbjsKLQotCQkJCWlmIChTVEFSVF9UQUcuZXF1YWxzKHNlbGVjdGlvblN0cmF0ZWd5KSkgey8vIHRoZW4gd2Ugd2FudCB0bwotCQkJCQkvLyB1bmRlcmxpbmUgdGhlIG9wZW5pbmcgdGFnCi0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IGVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKSArIDE7Ci0JCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IHN0YXJ0RW5kUG9zaXRpb25zWzBdICsgZWxlbWVudC5nZXRUYWdOYW1lKCkubGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoRU5EX1RBRy5lcXVhbHMoc2VsZWN0aW9uU3RyYXRlZ3kpKSB7Ly8gdGhlbiB3ZSB3YW50IHRvCi0JCQkJCS8vIHVuZGVybGluZSB0aGUgZW5kIHRhZwotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSBlbGVtZW50LmdldEVuZFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IGVsZW1lbnQuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoQVRUUklCVVRFX05BTUUuZXF1YWxzKHNlbGVjdGlvblN0cmF0ZWd5KSkgeyAvLyBpbgotCQkJCQkvLyB1bmRlcmxpbmUgdGhlIGF0dHJpYnV0ZSdzIG5hbWUKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJCQkJCUlET01Ob2RlIGF0dHJpYnV0ZU5vZGUgPSAoSURPTU5vZGUpIChlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUobmFtZU9yVmFsdWUpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVOb2RlICE9IG51bGwpIHsKLQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IGF0dHJpYnV0ZU5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IGF0dHJpYnV0ZU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArIG5hbWVPclZhbHVlLmxlbmd0aCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKEFUVFJJQlVURV9WQUxVRS5lcXVhbHMoc2VsZWN0aW9uU3RyYXRlZ3kpKSB7Ci0JCQkJCS8vIHVuZGVybGluZSB0aGUgYXR0cmlidXRlJ3MgdmFsdWUKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJCQkJCUlET01BdHRyIGF0dHJpYnV0ZU5vZGUgPSAoSURPTUF0dHIpIChlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUobmFtZU9yVmFsdWUpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVOb2RlICE9IG51bGwpIHsKLQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IGF0dHJpYnV0ZU5vZGUuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCQkJCVN0cmluZyB2YWx1ZVJlZ2lvblRleHQgPSBhdHRyaWJ1dGVOb2RlLmdldFZhbHVlUmVnaW9uVGV4dCgpOwotCQkJCQkJCWludCB2YWx1ZVJlZ2lvbkxlbmd0aCA9IHZhbHVlUmVnaW9uVGV4dCA9PSBudWxsID8gMCA6IHZhbHVlUmVnaW9uVGV4dC5sZW5ndGgoKTsgCi0JCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSBzdGFydEVuZFBvc2l0aW9uc1swXSArIHZhbHVlUmVnaW9uTGVuZ3RoOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKEFMTF9BVFRSSUJVVEVTLmVxdWFscyhzZWxlY3Rpb25TdHJhdGVneSkpIHsKLQkJCQkJLy8gdW5kZXJsaW5lIGFsbCBhdHRyaWJ1dGVzCi0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCQkJCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJCQkJCUlET01Ob2RlIGZpcnN0ID0gKElET01Ob2RlKSBhdHRyaWJ1dGVzLml0ZW0oMCk7Ci0JCQkJCQkJSURPTU5vZGUgbGFzdCA9IChJRE9NTm9kZSkgYXR0cmlidXRlcy5pdGVtKGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJCQkJCQlpZiAoKGZpcnN0ICE9IG51bGwpICYmIChsYXN0ICE9IG51bGwpKSB7Ci0JCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzBdID0gZmlyc3QuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSBsYXN0LmdldEVuZE9mZnNldCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChURVhULmVxdWFscyhzZWxlY3Rpb25TdHJhdGVneSkpIHsKLQkJCQkJLy8gdW5kZXJsaW5lIHRoZSB0ZXh0IGJldHdlZW4gdGhlIHRhZ3MKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJSURPTVRleHQgdGV4dE5vZGUgPSAoSURPTVRleHQpIG5vZGU7Ci0JCQkJCQlpbnQgc3RhcnQgPSB0ZXh0Tm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJU3RyaW5nIHZhbHVlID0gdGV4dE5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQkJY2hhciBjdXJDaGFyID0gdmFsdWUuY2hhckF0KGluZGV4KTsKLQkJCQkJCS8vIGhlcmUgd2UgYXJlIGZpbmRpbmcgc3RhcnQgb2Zmc2V0IGJ5IHNraXBwaW5nIG92ZXIKLQkJCQkJCS8vIHdoaXRlc3BhY2U6Ci0JCQkJCQl3aGlsZSAoKGN1ckNoYXIgPT0gJ1xuJykgfHwgKGN1ckNoYXIgPT0gJ1x0JykgfHwgKGN1ckNoYXIgPT0gJ1xyJykgfHwgKGN1ckNoYXIgPT0gJyAnKSkgewotCQkJCQkJCWN1ckNoYXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpOwotCQkJCQkJCWluZGV4Kys7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQkJCQkJaW5kZXgtLTsKLQotCQkJCQkJfQotCQkJCQkJc3RhcnQgPSBzdGFydCArIGluZGV4OwotCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSBzdGFydDsKLQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzFdID0gc3RhcnQgKyB2YWx1ZS50cmltKCkubGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQkJCQkJTm9kZSBjaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQkJCQlJRE9NTm9kZSB4bWxDaGlsZCA9ICgoSURPTU5vZGUpIGNoaWxkKTsKLQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IHhtbENoaWxkLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSB4bWxDaGlsZC5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChGSVJTVF9OT05fV0hJVEVTUEFDRV9URVhULmVxdWFscyhzZWxlY3Rpb25TdHJhdGVneSkpIHsKLQkJCQkJLy8gc2VhcmNoIHRocm91Z2ggYWxsIGNoaWxkIG5vZGVzIGFuZCByZXR1cm4gcmFuZ2Ugb2YKLQkJCQkJLy8gZmlyc3Qgbm9uLXdoaXRlc3BhY2UKLQkJCQkJLy8gdGV4dCBub2RlCi0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCU5vZGVMaXN0IG5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJCQlOb2RlIGN1cnJlbnROb2RlID0gbm9kZXMuaXRlbShpKTsKLQkJCQkJCQlpZiAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJCQkvLyBUT0RPIChUcnVuZykgSSBkb24ndCB0aGluayB3ZSBzaG91bGQgY2FsbAotCQkJCQkJCQkvLyBnZXROb2RlVmFsdWUoKSwgdHJpbSgpLCBsZW5ndGgoKQotCQkJCQkJCQkvLyByZXBlYXRlZGx5LgotCQkJCQkJCQkvLyBUaGlzIGlzIGluZWZmaWNpZW50LCB0byBpbXByb3ZlIHVzZSBsb2NhbAotCQkJCQkJCQkvLyB2YXJpYWJsZXMgdG8gc3RvcmUgdmFsdWVzLgotCQkJCQkJCQlJRE9NVGV4dCB0ZXh0Tm9kZSA9IChJRE9NVGV4dCkgY3VycmVudE5vZGU7Ci0JCQkJCQkJCWlmICh0ZXh0Tm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCQlTdHJpbmcgdmFsdWUgPSB0ZXh0Tm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQkJCQlpbnQgc3RhcnQgPSB0ZXh0Tm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJCQkJY2hhciBjdXJDaGFyID0gdmFsdWUuY2hhckF0KGluZGV4KTsKLQkJCQkJCQkJCS8vIGhlcmUgd2UgYXJlIGZpbmRpbmcgc3RhcnQgb2Zmc2V0IGJ5Ci0JCQkJCQkJCQkvLyBza2lwcGluZyBvdmVyIHdoaXRlc3BhY2U6Ci0JCQkJCQkJCQl3aGlsZSAoKGN1ckNoYXIgPT0gJ1xuJykgfHwgKGN1ckNoYXIgPT0gJ1x0JykgfHwgKGN1ckNoYXIgPT0gJ1xyJykgfHwgKGN1ckNoYXIgPT0gJyAnKSkgewotCQkJCQkJCQkJCWN1ckNoYXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpOwotCQkJCQkJCQkJCWluZGV4Kys7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQkJCQkJCQkJaW5kZXgtLTsKLQotCQkJCQkJCQkJfQotCQkJCQkJCQkJc3RhcnQgPSBzdGFydCArIGluZGV4OwotCQkJCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSBzdGFydDsKLQkJCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzFdID0gc3RhcnQgKyB2YWx1ZS50cmltKCkubGVuZ3RoKCk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJZWxzZSBpZiAoVEVYVF9FTlRJVFlfUkVGRVJFTkNFLmVxdWFscyhzZWxlY3Rpb25TdHJhdGVneSkpIHsKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkgewotCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSByZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzFdID0gcmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJLyoKLQkJCQkJCSAqIEluIHRoaXMgY2FzZSB0aGUgdW5kZWNsYXJlZCBlbnRpdHkgbWlnaHQgYmUgaW4gb25lCi0JCQkJCQkgKiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlcy4gU2VhcmNoIHRocm91Z2ggdGhlCi0JCQkJCQkgKiBhdHRyaWJ1dGVzIHRvIGZpbmQgdGhlIHJhbmdlIG9mIHRoZSB1bmRlY2xhcmVkCi0JCQkJCQkgKiBlbnRpdHkuCi0JCQkJCQkgKi8KLQkJCQkJCVN0cmluZyBlbnRpdHkgPSAiJiIgKyBuYW1lT3JWYWx1ZSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJCQlJRE9NQXR0ciBhdHRyID0gKElET01BdHRyKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQkJCQkJU3RyaW5nIG5vZGVWYWx1ZSA9IGF0dHIuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJaW50IGluZGV4ID0gbm9kZVZhbHVlLmluZGV4T2YoZW50aXR5KTsKLQkJCQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSBhdHRyLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKSArIGluZGV4ICsgMTsKLQkJCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSBzdGFydEVuZFBvc2l0aW9uc1swXSArIGVudGl0eS5sZW5ndGgoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0KLQkJCQllbHNlIGlmIChWQUxVRV9PRl9BVFRSSUJVVEVfV0lUSF9HSVZFTl9WQUxVRS5lcXVhbHMoc2VsZWN0aW9uU3RyYXRlZ3kpKSB7Ci0JCQkJCS8vIFRPRE8gKFRydW5nKSBkbyB3ZSByZWFsbHkgbmVlZCB0aGlzIHN0cmF0ZWd5ID8KLQkJCQkJLy8gSWYgd2Uga25vdyB0aGUgbmFtZSBvZiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLCB3ZQotCQkJCQkvLyBjYW4gcmV0cmlldmUgaXRzIHZhbHVlLgotCQkJCQkvLyBIZW5jZSwgd2UgY2FuIGluY29wZXJhdGUgdGhpcyBzdHJhdGVneSB3aXRoCi0JCQkJCS8vIEFUVFJJQlVURV9WQUxVRSA/Ci0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCS8vIGhlcmUgd2Ugd2lsbCBzZWFyY2ggdGhyb3VnaCBhbGwgYXR0cmlidXRlcyBmb3IgdGhlCi0JCQkJCQkvLyBvbmUgd2l0aCB0aGUKLQkJCQkJCS8vIHdpdGggdGhlIHZhbHVlIHdlIHdhbnQ6Ci0JCQkJCQkvLyBUT0RPIChUcnVuZykgSSBzZWUgYSBwb3RlbnRpYWwgcHJvYmxlbSBoZXJlLgotCQkJCQkJLy8gV2hhdCBoYXBwZW5zIHdoZW4gdGhlcmUgaXMgYW5vdGhlciBhdHRyaWJ1dGUgaGF2aW5nCi0JCQkJCQkvLyB0aGUgc2FtZSB2YWx1ZQotCQkJCQkJLy8gd2l0aCB0aGlzIGF0dHJpYnV0ZSdzIGJ1Z2d5IHZhbHVlID8KLQkJCQkJCS8vIE5lZWQgdG8gc29sdmUgd2hlbiB0aW1lIHBlcm1pdHMuCi0JCQkJCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJCQlJRE9NQXR0ciBhdHRyID0gKElET01BdHRyKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQkJCQkJU3RyaW5nIG5vZGVWYWx1ZSA9IGF0dHIuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpOwotCQkJCQkJCWlmIChub2RlVmFsdWUuZXF1YWxzKG5hbWVPclZhbHVlKSkgewotCQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IGF0dHIuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsKLQkJCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSBzdGFydEVuZFBvc2l0aW9uc1swXSArIG5vZGVWYWx1ZS5sZW5ndGgoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN0YXJ0RW5kUG9zaXRpb25zOwotCQl9Ci0JCS8vIGNhdGNoIChFeGNlcHRpb24gZSkgeyAvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkvLyB9Ci0JCWZpbmFsbHkgewotCQl9Ci0JCS8vIHJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBkZWxlZ2F0ZSB2YWxpZGF0b3IgaXMgZW5hYmxlZCBiYXNlZCBvbiBWYWxpZGF0aW9uCi0JICogcHJlZmVyZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgZGVsZWdhdGUgdmFsaWRhdG9yIGlzIG5vdCBlbmFibGVkIGJhc2VkIG9uIFZhbGlkYXRvaW4KLQkgKiAgICAgICAgIHByZWZlcmVuY2VzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRGVsZWdhdGVWYWxpZGF0b3JFbmFibGVkKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvclNpZGUoSU1lc3NhZ2UgbWVzc2FnZSkgewotCQkvLyBub3RlIHRoYXQgaWYgdGhlIEVSUk9SX1NJREUgaXMgdW5zcGVjaWZpZWQgd2UgcmV0dXJuIHRoZSBkZWZhdWx0Ci0JCS8vIHZhbHVlIEVSUk9SX1NJREVfTEVGVAotCQlPYmplY3QgdmFsdWUgPSBtZXNzYWdlLmdldEF0dHJpYnV0ZShFUlJPUl9TSURFKTsKLQkJcmV0dXJuIEVSUk9SX1NJREVfUklHSFQuZXF1YWxzKHZhbHVlKSA/IEVSUk9SX1NJREVfUklHSFQgOiBFUlJPUl9TSURFX0xFRlQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTRhODViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIHBlcmZvcm1zIGFzIHlvdSB0eXBlIHZhbGlkYXRpb24gZm9yIFhNTCBmaWxlcwotICovCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTCBleHRlbmRzIERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3IKLXsKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIElkID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWwiOyAvLyROT04tTkxTLTEkCi0KLSAgcHJpdmF0ZSBWYWxpZGF0b3IgX3ZhbGlkYXRvcjsKLQotICBwdWJsaWMgRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTCgpCi0gIHsKLSAgfQotCi0gIHByaXZhdGUgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpCi0gIHsKLSAgICBpZiAoX3ZhbGlkYXRvciA9PSBudWxsKQotICAgICAgX3ZhbGlkYXRvciA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmdldFZhbGlkYXRvcihJZCk7Ci0gICAgcmV0dXJuIF92YWxpZGF0b3I7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSVZhbGlkYXRvciBnZXREZWxlZ2F0ZVZhbGlkYXRvcigpCi0gIHsKLSAgICBWYWxpZGF0b3IgdiA9IGdldFZhbGlkYXRvcigpOwotICAgIGlmICh2ID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICByZXR1cm4gdi5hc0lWYWxpZGF0b3IoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzRGVsZWdhdGVWYWxpZGF0b3JFbmFibGVkKElGaWxlIGZpbGUpCi0gIHsKLSAgICBWYWxpZGF0b3IgdiA9IGdldFZhbGlkYXRvcigpOwotICAgIGlmICh2ID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCF2LnNob3VsZFZhbGlkYXRlKGZpbGUsIGZhbHNlLCBmYWxzZSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHYuaXNCdWlsZFZhbGlkYXRpb24oKSB8fCB2LmlzTWFudWFsVmFsaWRhdGlvbigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9NYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViYjI5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9NYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5Qcm9ibGVtSURzWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb24uUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5SZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLQotLyoqCi0gKiBRdWljayBhc3Npc3QgcHJvY2Vzc29yIGZvciBwcm9ibGVtcyBmb3VuZCBieSB0aGUgbWFya3VwIHZhbGlkYXRvcgotICovCi1jbGFzcyBNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElRdWlja0Fzc2lzdFByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBpbnQgZlByb2JsZW1JZDsKLQlwcml2YXRlIE9iamVjdCBmQWRkaXRpb25hbEZpeEluZm8gPSBudWxsOwotCi0JcHVibGljIGJvb2xlYW4gY2FuQXNzaXN0KElRdWlja0Fzc2lzdEludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaXgoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJc3dpdGNoIChmUHJvYmxlbUlkKSB7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuRW1wdHlUYWcgOgotCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdFbmRUYWcgOgotCQkJY2FzZSBQcm9ibGVtSURzWE1MLkF0dHJzSW5FbmRUYWcgOgotCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdBdHRyVmFsdWUgOgotCQkJY2FzZSBQcm9ibGVtSURzWE1MLk5vQXR0clZhbHVlIDoKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5TcGFjZXNCZWZvcmVUYWdOYW1lIDoKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5TcGFjZXNCZWZvcmVQSSA6Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuTmFtZXNwYWNlSW5QSSA6Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuVW5rbm93bkVsZW1lbnQgOgotCQkJY2FzZSBQcm9ibGVtSURzWE1MLlVua25vd25BdHRyIDoKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5JbnZhbGlkQXR0clZhbHVlIDoKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5NaXNzaW5nUmVxdWlyZWRBdHRyIDoKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5BdHRyVmFsdWVOb3RRdW90ZWQgOgotCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdDbG9zaW5nQnJhY2tldCA6Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlUXVpY2tBc3Npc3RQcm9wb3NhbHMoSVF1aWNrQXNzaXN0SW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQpIHsKLQkJQXJyYXlMaXN0IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlzd2l0Y2ggKGZQcm9ibGVtSWQpIHsKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5FbXB0eVRhZyA6Ci0JCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRPZmZzZXQoKSwgaW52b2NhdGlvbkNvbnRleHQuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMCwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCWJyZWFrOwotCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdFbmRUYWcgOgotCQkJCVN0cmluZyB0YWdOYW1lID0gKFN0cmluZykgKChPYmplY3RbXSkgZkFkZGl0aW9uYWxGaXhJbmZvKVswXTsKLQkJCQlTdHJpbmcgdGFnQ2xvc2UgPSAoU3RyaW5nKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzFdOwotCQkJCWludCB0YWdDbG9zZU9mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgZkFkZGl0aW9uYWxGaXhJbmZvKVsyXSkuaW50VmFsdWUoKTsKLQkJCQlpbnQgc3RhcnRUYWdFbmRPZmZzZXQgPSAoKEludGVnZXIpICgoT2JqZWN0W10pIGZBZGRpdGlvbmFsRml4SW5mbylbM10pLmludFZhbHVlKCk7Ci0JCQkJaW50IGZpcnN0Q2hpbGRTdGFydE9mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgZkFkZGl0aW9uYWxGaXhJbmZvKVs0XSkuaW50VmFsdWUoKTsKLQkJCQlpbnQgZW5kT2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzVdKS5pbnRWYWx1ZSgpOwotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCh0YWdDbG9zZSwgdGFnQ2xvc2VPZmZzZXQsIDAsIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMSwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpLCBzdGFydFRhZ0VuZE9mZnNldCAtIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzIsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIjwvIiArIHRhZ05hbWUgKyAiPiIsIGZpcnN0Q2hpbGRTdGFydE9mZnNldCwgMCwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8zLCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIjwvIiArIHRhZ05hbWUgKyAiPiIsIGVuZE9mZnNldCwgMCwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF80LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCQlicmVhazsKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5BdHRyc0luRW5kVGFnIDoKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF81LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuTWlzc2luZ0F0dHJWYWx1ZSA6Ci0JCQkJU3RyaW5nIGRlZmF1bHRBdHRyVmFsdWUgPSAoU3RyaW5nKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzBdOwotCQkJCWludCBpbnNlcnRPZmZzZXQgPSAoKEludGVnZXIpICgoT2JqZWN0W10pIGZBZGRpdGlvbmFsRml4SW5mbylbMV0pLmludFZhbHVlKCk7Ci0JCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCJcIiIgKyBkZWZhdWx0QXR0clZhbHVlICsgIlwiIiwgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCkgKyBpbnZvY2F0aW9uQ29udGV4dC5nZXRMZW5ndGgoKSArIGluc2VydE9mZnNldCwgMCwgZGVmYXVsdEF0dHJWYWx1ZS5sZW5ndGgoKSArIDIsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfNiwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCi0JCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRPZmZzZXQoKSwgaW52b2NhdGlvbkNvbnRleHQuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfNywgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCWJyZWFrOwotCQkJY2FzZSBQcm9ibGVtSURzWE1MLk5vQXR0clZhbHVlIDoKLQkJCQlkZWZhdWx0QXR0clZhbHVlID0gKFN0cmluZykgZkFkZGl0aW9uYWxGaXhJbmZvOwotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiPVwiIiArIGRlZmF1bHRBdHRyVmFsdWUgKyAiXCIiLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRPZmZzZXQoKSArIGludm9jYXRpb25Db250ZXh0LmdldExlbmd0aCgpLCAwLCBkZWZhdWx0QXR0clZhbHVlLmxlbmd0aCgpICsgMywgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF82LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF83LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuU3BhY2VzQmVmb3JlVGFnTmFtZSA6Ci0JCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRPZmZzZXQoKSwgaW52b2NhdGlvbkNvbnRleHQuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfOCwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCWJyZWFrOwotCQkJY2FzZSBQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVBJIDoKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF85LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuTmFtZXNwYWNlSW5QSSA6Ci0JCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRPZmZzZXQoKSwgaW52b2NhdGlvbkNvbnRleHQuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTAsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQlicmVhazsKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5Vbmtub3duRWxlbWVudCA6Ci0JCQkJcHJvcG9zYWxzLmFkZChuZXcgUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsKGZBZGRpdGlvbmFsRml4SW5mbywgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8xMSkpOwotCQkJCXByb3Bvc2Fscy5hZGQobmV3IFJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWwoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuVW5rbm93bkF0dHIgOgotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCksIGludm9jYXRpb25Db250ZXh0LmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzcsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBSZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQcm9ibGVtSURzWE1MLkludmFsaWRBdHRyVmFsdWUgOgotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCksIGludm9jYXRpb25Db250ZXh0LmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzEyLCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuTWlzc2luZ1JlcXVpcmVkQXR0ciA6Ci0JCQkJU3RyaW5nIHJlcXVpcmVkQXR0ciA9IChTdHJpbmcpICgoT2JqZWN0W10pIGZBZGRpdGlvbmFsRml4SW5mbylbMF07Ci0JCQkJaW5zZXJ0T2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzFdKS5pbnRWYWx1ZSgpOwotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbChyZXF1aXJlZEF0dHIsIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpICsgaW5zZXJ0T2Zmc2V0LCAwLCByZXF1aXJlZEF0dHIubGVuZ3RoKCksIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTMsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuQXR0clZhbHVlTm90UXVvdGVkIDoKLQkJCQlTdHJpbmcgYXR0clZhbHVlID0gKFN0cmluZykgZkFkZGl0aW9uYWxGaXhJbmZvOwotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiXCIiICsgYXR0clZhbHVlICsgIlwiIiwgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCksIGludm9jYXRpb25Db250ZXh0LmdldExlbmd0aCgpLCBhdHRyVmFsdWUubGVuZ3RoKCkgKyAyLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzE0LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCQlicmVhazsKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5NaXNzaW5nQ2xvc2luZ0JyYWNrZXQgOgotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiPiIsIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpICsgaW52b2NhdGlvbkNvbnRleHQuZ2V0TGVuZ3RoKCksIDAsIDEsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTUsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgcHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DT1JSRUNUSU9OX0NIQU5HRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvYmxlbUlkKGludCBwcm9ibGVtSWQpIHsKLQkJZlByb2JsZW1JZCA9IHByb2JsZW1JZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsRml4SW5mbyhPYmplY3QgZml4SW5mbykgewotCQlmQWRkaXRpb25hbEZpeEluZm8gPSBmaXhJbmZvOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL01hcmt1cFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vTWFya3VwVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMjg2OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vTWFya3VwVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuUmVjb25jaWxlQW5ub3RhdGlvbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuQW5ub3RhdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLklTb3VyY2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLkluY3JlbWVudGFsUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuTG9jYWxpemVkTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5Qcm9ibGVtSURzWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEJhc2ljIFhNTCBzeW50YXggY2hlY2tpbmcgc3RlcC4KLSAqIEBkZXByZWNhdGVkIE5vIGxvbmdlciB1c2VkIGFzIHRoZSBzb3VyY2UgdmFsaWRhdG9yIGZvciBYTUwgZG9jdW1lbnRzLiBJbnN0ZWFkIHtAbGluayBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWE1MfQotICogaXMgdGhlIHNvdXJjZSB2YWxpZGF0b3IsIGFuZCB0aGUgbWFya3VwIHZhbGlkYXRpb24gaXMgZG9uZSBhcyBhIHN0ZXAgaW4ge0BsaW5rIFhNTFZhbGlkYXRvcn0gYnkge0BsaW5rIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLk1hcmt1cFZhbGlkYXRvcn0uCi0gKiAKLSAqICBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLk1hcmt1cFZhbGlkYXRvcgotICogIEBzZWUgRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTAotICogIEBzZWUgWE1MVmFsaWRhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJrdXBWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IsIElTb3VyY2VWYWxpZGF0b3IgewotCXByaXZhdGUgU3RyaW5nIERRVU9URSA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBTUVVPVEUgPSAiJyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBRVUlDS0FTU0lTVFBST0NFU1NPUiA9IElRdWlja0Fzc2lzdFByb2Nlc3Nvci5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0KLQlwcml2YXRlIElDb250ZW50VHlwZSBmUm9vdENvbnRlbnRUeXBlID0gbnVsbDsKLQotICAgIHByaXZhdGUgaW50IFNFVkVSSVRZX0FUVFJJQlVURV9IQVNfTk9fVkFMVUUgPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCXByaXZhdGUgaW50IFNFVkVSSVRZX0VORF9UQUdfV0lUSF9BVFRSSUJVVEVTID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQlwcml2YXRlIGludCBTRVZFUklUWV9JTlZBTElEX1dISVRFU1BBQ0VfQkVGT1JFX1RBR05BTUUgPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCXByaXZhdGUgaW50IFNFVkVSSVRZX01JU1NJTkdfQ0xPU0lOR19CUkFDS0VUID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQlwcml2YXRlIGludCBTRVZFUklUWV9NSVNTSU5HX0NMT1NJTkdfUVVPVEUgPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCXByaXZhdGUgaW50IFNFVkVSSVRZX01JU1NJTkdfRU5EX1RBRyA9IElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JcHJpdmF0ZSBpbnQgU0VWRVJJVFlfTUlTU0lOR19TVEFSVF9UQUcgPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCXByaXZhdGUgaW50IFNFVkVSSVRZX01JU1NJTkdfUVVPVEVTID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQlwcml2YXRlIGludCBTRVZFUklUWV9OQU1FU1BBQ0VfSU5fUElfVEFSR0VUID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQlwcml2YXRlIGludCBTRVZFUklUWV9UQUdfTkFNRV9NSVNTSU5HID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQlwcml2YXRlIGludCBTRVZFUklUWV9XSElURVNQQUNFX0FUX1NUQVJUID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLSAgICAgICAgCi0JcHJpdmF0ZSB2b2lkIGFkZEF0dHJpYnV0ZUVycm9yKFN0cmluZyBtZXNzYWdlVGV4dCwgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlVGV4dCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLCBpbnQgcHJvYmxlbUlkLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIGludCBtZXNzYWdlU2V2ZXJpdHkpIHsKLQotCQlpZiAoc2RSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBsaW5lTm8gPSBnZXRMaW5lTnVtYmVyKHN0YXJ0KTsKLQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UobWVzc2FnZVNldmVyaXR5LCBtZXNzYWdlVGV4dCk7Ci0JCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLQotCi0JCWlmIChyZXBvcnRlciBpbnN0YW5jZW9mIEluY3JlbWVudGFsUmVwb3J0ZXIpIHsKLQkJCU1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvcigpOwotCQkJcHJvY2Vzc29yLnNldFByb2JsZW1JZChwcm9ibGVtSWQpOwotCQkJcHJvY2Vzc29yLnNldEFkZGl0aW9uYWxGaXhJbmZvKGF0dHJpYnV0ZVZhbHVlVGV4dCk7Ci0JCQltZXNzYWdlLnNldEF0dHJpYnV0ZShRVUlDS0FTU0lTVFBST0NFU1NPUiwgcHJvY2Vzc29yKTsKLQkJCUFubm90YXRpb25JbmZvIGluZm8gPSBuZXcgQW5ub3RhdGlvbkluZm8obWVzc2FnZSk7Ci0JCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpIHJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tBdHRyaWJ1dGVzSW5FbmRUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotCi0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlUZXh0UmVnaW9uTGlzdCB0ZXh0UmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWludCBlcnJvckNvdW50ID0gMDsKLQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQlpbnQgZW5kID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQlmb3IgKGludCBpID0gMDsgKGkgPCB0ZXh0UmVnaW9ucy5zaXplKCkpICYmIChlcnJvckNvdW50IDwgQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kuRUxFTUVOVF9FUlJPUl9MSU1JVCkgJiYgIXN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKCh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHx8ICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgfHwgKHRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpKSB7Ci0JCQkJaWYgKHN0YXJ0ID4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHRleHRSZWdpb24pKSB7Ci0JCQkJCXN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHRleHRSZWdpb24pOwotCQkJCX0KLQkJCQllbmQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KHRleHRSZWdpb24pOwotCQkJCWVycm9yQ291bnQrKzsKLQkJCX0KLQkJfQotCQkvLyBjcmVhdGUgb25lIGVycm9yIGZvciBhbGwgYXR0cmlidXRlcyBpbiB0aGUgZW5kIHRhZwotCQlpZiAoZXJyb3JDb3VudCA+IDApIHsKLQkJCS8vIFBvc2l0aW9uIHAgPSBuZXcgUG9zaXRpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IFhNTFVJTWVzc2FnZXMuRW5kX3RhZ19oYXNfYXR0cmlidXRlczsKLQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKFNFVkVSSVRZX0VORF9UQUdfV0lUSF9BVFRSSUJVVEVTLCBtZXNzYWdlVGV4dCk7Ci0JCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQltZXNzYWdlLnNldExlbmd0aChlbmQgLSBzdGFydCk7Ci0JCQltZXNzYWdlLnNldExpbmVObyhnZXRMaW5lTnVtYmVyKHN0YXJ0KSk7Ci0KLQkJCWlmIChyZXBvcnRlciBpbnN0YW5jZW9mIEluY3JlbWVudGFsUmVwb3J0ZXIpIHsKLQkJCQlNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IoKTsKLQkJCQlwcm9jZXNzb3Iuc2V0UHJvYmxlbUlkKFByb2JsZW1JRHNYTUwuQXR0cnNJbkVuZFRhZyk7Ci0JCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoUVVJQ0tBU1NJU1RQUk9DRVNTT1IsIHByb2Nlc3Nvcik7Ci0KLQkJCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UpOwotCQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcikgcmVwb3J0ZXIpLmFkZEFubm90YXRpb25JbmZvKHRoaXMsIGluZm8pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ2xvc2luZ0JyYWNrZXQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotCi0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCWJvb2xlYW4gY2xvc2VkID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyAoaSA8IHJlZ2lvbnMuc2l6ZSgpKSAmJiAhc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpOyBpKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmICgoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB8fCAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSkgewotCQkJCWNsb3NlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFjbG9zZWQpIHsKLQotCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gWE1MVUlNZXNzYWdlcy5SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzY7Ci0KLQkJCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGxlbmd0aCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpOwotCQkJaW50IGxpbmVObyA9IGdldExpbmVOdW1iZXIoc3RhcnQpOwotCi0JCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShTRVZFUklUWV9NSVNTSU5HX0NMT1NJTkdfQlJBQ0tFVCAsIG1lc3NhZ2VUZXh0KTsKLQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCi0JCQlpZiAocmVwb3J0ZXIgaW5zdGFuY2VvZiBJbmNyZW1lbnRhbFJlcG9ydGVyKSB7Ci0JCQkJTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IE1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yKCk7Ci0JCQkJcHJvY2Vzc29yLnNldFByb2JsZW1JZChQcm9ibGVtSURzWE1MLk1pc3NpbmdDbG9zaW5nQnJhY2tldCk7Ci0JCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoUVVJQ0tBU1NJU1RQUk9DRVNTT1IsIHByb2Nlc3Nvcik7Ci0KLQkJCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UpOwotCQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcikgcmVwb3J0ZXIpLmFkZEFubm90YXRpb25JbmZvKHRoaXMsIGluZm8pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0VtcHR5VGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBuYXZpZ2F0ZSB0byBuYW1lCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMuc2l6ZSgpID09IDIpIHsKLQkJCS8vIG1pc3NpbmcgbmFtZSByZWdpb24KLQkJCWlmICgocmVnaW9ucy5nZXQoMCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSAmJiAocmVnaW9ucy5nZXQoMSkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkpIHsKLQkJCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBYTUxVSU1lc3NhZ2VzLlJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMzsKLQkJCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgbGVuZ3RoID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpOwotCQkJCWludCBsaW5lTm8gPSBnZXRMaW5lTnVtYmVyKHN0YXJ0KTsKLQotCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKFNFVkVSSVRZX1RBR19OQU1FX01JU1NJTkcgLCBtZXNzYWdlVGV4dCk7Ci0JCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLQotCQkJCWlmIChyZXBvcnRlciBpbnN0YW5jZW9mIEluY3JlbWVudGFsUmVwb3J0ZXIpIHsKLQkJCQkJTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IE1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yKCk7Ci0JCQkJCXByb2Nlc3Nvci5zZXRQcm9ibGVtSWQoUHJvYmxlbUlEc1hNTC5FbXB0eVRhZyk7Ci0JCQkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKFFVSUNLQVNTSVNUUFJPQ0VTU09SLCBwcm9jZXNzb3IpOwotCi0JCQkJCUFubm90YXRpb25JbmZvIGluZm8gPSBuZXcgQW5ub3RhdGlvbkluZm8obWVzc2FnZSk7Ci0JCQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcikgcmVwb3J0ZXIpLmFkZEFubm90YXRpb25JbmZvKHRoaXMsIGluZm8pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBnZXRMaW5lTnVtYmVyKGludCBzdGFydCkgewotCQlpbnQgbGluZU5vID0gLTE7Ci0JCXRyeSB7Ci0JCQlsaW5lTm8gPSBnZXREb2N1bWVudCgpLmdldExpbmVPZk9mZnNldChzdGFydCkgKyAxOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBsaW5lTm87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRm9yQXR0cmlidXRlVmFsdWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBjaGVjayBmb3IgYXR0cmlidXRlcyB3aXRob3V0IGEgdmFsdWUKLQkJLy8gdHJhY2sgdGhlIGF0dHJpYnV0ZS9lcXVhbHMvdmFsdWUgc2VxdWVuY2UgdXNpbmcgYSBzdGF0ZSBvZiAwLCAxICwyCi0JCS8vIHJlcHJlc2VudGluZyB0aGUgbmFtZSwgPSwgYW5kIHZhbHVlLCByZXNwZWN0aXZlbHkKLQkJaW50IGF0dHJTdGF0ZSA9IDA7Ci0JCUlUZXh0UmVnaW9uTGlzdCB0ZXh0UmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCS8vIFJlY29uY2lsZUFubm90YXRpb25LZXkga2V5ID0gY3JlYXRlS2V5KHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwKLQkJLy8gZ2V0U2NvcGUoKSk7Ci0KLQkJaW50IGVycm9yQ291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgKGkgPCB0ZXh0UmVnaW9ucy5zaXplKCkpICYmIChlcnJvckNvdW50IDwgQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kuRUxFTUVOVF9FUlJPUl9MSU1JVCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChpKTsKLQkJCWlmICgodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB8fCBpc1RhZ0Nsb3NlVGV4dFJlZ2lvbih0ZXh0UmVnaW9uKSkgewotCQkJCS8vIGRhbmdsaW5nIG5hbWUgYW5kICc9JwotCQkJCWlmICgoYXR0clN0YXRlID09IDIpICYmIChpID49IDIpKSB7Ci0JCQkJCS8vIGNyZWF0ZSBhbm5vdGF0aW9uCi0JCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoaSAtIDIpOwotCQkJCQlpZiAoIShuYW1lUmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpKSB7Ci0JCQkJCQlPYmplY3RbXSBhcmdzID0ge3N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KG5hbWVSZWdpb24pfTsKLQkJCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuQXR0cmlidXRlX19pc19taXNzaW5nX2FfdmFsdWUsIGFyZ3MpOwotCi0JCQkJCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZVJlZ2lvbik7Ci0JCQkJCQlpbnQgZW5kID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQkJCQkJaW50IGxpbmVObyA9IGdldExpbmVOdW1iZXIoc3RhcnQpOwotCQkJCQkJaW50IHRleHRMZW5ndGggPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChuYW1lUmVnaW9uKS50cmltKCkubGVuZ3RoKCk7Ci0KLQkJCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKFNFVkVSSVRZX0FUVFJJQlVURV9IQVNfTk9fVkFMVUUgLCBtZXNzYWdlVGV4dCk7Ci0JCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCQltZXNzYWdlLnNldExlbmd0aCh0ZXh0TGVuZ3RoKTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0KLQkJCQkJCS8vIHF1aWNrIGZpeCBpbmZvCi0JCQkJCQlJVGV4dFJlZ2lvbiBlcXVhbHNSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoaSAtIDIgKyAxKTsKLQkJCQkJCWludCBpbnNlcnRPZmZzZXQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChlcXVhbHNSZWdpb24pIC0gZW5kOwotCQkJCQkJT2JqZWN0W10gYWRkaXRpb25hbEZpeEluZm8gPSB7c3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQobmFtZVJlZ2lvbiksIG5ldyBJbnRlZ2VyKGluc2VydE9mZnNldCl9OwotCi0JCQkJCQlpZiAocmVwb3J0ZXIgaW5zdGFuY2VvZiBJbmNyZW1lbnRhbFJlcG9ydGVyKSB7Ci0JCQkJCQkJTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IE1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yKCk7Ci0JCQkJCQkJcHJvY2Vzc29yLnNldFByb2JsZW1JZChQcm9ibGVtSURzWE1MLk1pc3NpbmdBdHRyVmFsdWUpOwotCQkJCQkJCXByb2Nlc3Nvci5zZXRBZGRpdGlvbmFsRml4SW5mbyhhZGRpdGlvbmFsRml4SW5mbyk7Ci0JCQkJCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoUVVJQ0tBU1NJU1RQUk9DRVNTT1IsIHByb2Nlc3Nvcik7Ci0KLQkJCQkJCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UpOwotCQkJCQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcikgcmVwb3J0ZXIpLmFkZEFubm90YXRpb25JbmZvKHRoaXMsIGluZm8pOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkJCQkJCX0KLQkJCQkJCWVycm9yQ291bnQrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBuYW1lIGJ1dCBubyAnPScgKFhNTCBvbmx5KQotCQkJCWVsc2UgaWYgKChhdHRyU3RhdGUgPT0gMSkgJiYgKGkgPj0gMSkpIHsKLQkJCQkJLy8gY3JlYXRlIGFubm90YXRpb24KLQkJCQkJSVRleHRSZWdpb24gcHJldmlvdXNSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoaSAtIDEpOwotCQkJCQlpZiAoIShwcmV2aW91c1JlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSkgewotCQkJCQkJT2JqZWN0W10gYXJncyA9IHtzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChwcmV2aW91c1JlZ2lvbil9OwotCQkJCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfX2hhc19ub192YWx1ZSwgYXJncyk7Ci0JCQkJCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocHJldmlvdXNSZWdpb24pOwotCQkJCQkJaW50IHRleHRMZW5ndGggPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChwcmV2aW91c1JlZ2lvbikudHJpbSgpLmxlbmd0aCgpOwotCQkJCQkJaW50IGxpbmVObyA9IGdldExpbmVOdW1iZXIoc3RhcnQpOwotCi0JCQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShTRVZFUklUWV9BVFRSSUJVVEVfSEFTX05PX1ZBTFVFLCBtZXNzYWdlVGV4dCk7Ci0JCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCQltZXNzYWdlLnNldExlbmd0aCh0ZXh0TGVuZ3RoKTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0KLQkJCQkJCWlmIChyZXBvcnRlciBpbnN0YW5jZW9mIEluY3JlbWVudGFsUmVwb3J0ZXIpIHsKLQkJCQkJCQlNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IoKTsKLQkJCQkJCQlwcm9jZXNzb3Iuc2V0UHJvYmxlbUlkKFByb2JsZW1JRHNYTUwuTm9BdHRyVmFsdWUpOwotCQkJCQkJCXByb2Nlc3Nvci5zZXRBZGRpdGlvbmFsRml4SW5mbyhzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChwcmV2aW91c1JlZ2lvbikpOwotCQkJCQkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKFFVSUNLQVNTSVNUUFJPQ0VTU09SLCBwcm9jZXNzb3IpOwotCi0JCQkJCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlKTsKLQkJCQkJCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpIHJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWVycm9yQ291bnQrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQlhdHRyU3RhdGUgPSAxOwotCQkJfQotCQkJZWxzZSBpZiAodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQlhdHRyU3RhdGUgPSAyOwotCQkJfQotCQkJZWxzZSBpZiAodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWF0dHJTdGF0ZSA9IDA7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0ZvclNwYWNlQmVmb3JlTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0KLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIHNkUmVnaW9uVGV4dCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQlpZiAoc2RSZWdpb25UZXh0LnN0YXJ0c1dpdGgoIiAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXYgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCQkvLyB0aGlzIGlzIHBvc3NpYmx5IHRoZSBjYXNlIG9mICI8IHRhZyIKLQkJCQlpZiAoKHByZXYuZ2V0UmVnaW9ucygpLnNpemUoKSA9PSAxKSAmJiBpc1N0YXJ0VGFnKHByZXYpKSB7Ci0JCQkJCS8vIGFkZCB0aGUgZXJyb3IgZm9yIHByZWNlZGluZyBzcGFjZSBpbiB0YWcgbmFtZQotCQkJCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBYTUxVSU1lc3NhZ2VzLlJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMjsKLQkJCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCS8vIGZpbmQgbGVuZ3RoIG9mIHdoaXRlc3BhY2UKLQkJCQkJaW50IGxlbmd0aCA9IHNkUmVnaW9uVGV4dC50cmltKCkuZXF1YWxzKCIiKSA/IHNkUmVnaW9uVGV4dC5sZW5ndGgoKSA6IHNkUmVnaW9uVGV4dC5pbmRleE9mKHNkUmVnaW9uVGV4dC50cmltKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoU0VWRVJJVFlfSU5WQUxJRF9XSElURVNQQUNFX0JFRk9SRV9UQUdOQU1FICwgbWVzc2FnZVRleHQpOwotCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGdldExpbmVOdW1iZXIoc3RhcnQpKTsKLQotCQkJCQlpZiAocmVwb3J0ZXIgaW5zdGFuY2VvZiBJbmNyZW1lbnRhbFJlcG9ydGVyKSB7Ci0JCQkJCQlNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IoKTsKLQkJCQkJCXByb2Nlc3Nvci5zZXRQcm9ibGVtSWQoUHJvYmxlbUlEc1hNTC5TcGFjZXNCZWZvcmVUYWdOYW1lKTsKLQkJCQkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKFFVSUNLQVNTSVNUUFJPQ0VTU09SLCBwcm9jZXNzb3IpOwotCi0JCQkJCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UpOwotCQkJCQkJKChJbmNyZW1lbnRhbFJlcG9ydGVyKSByZXBvcnRlcikuYWRkQW5ub3RhdGlvbkluZm8odGhpcywgaW5mbyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTm9OYW1lc3BhY2VJblBJKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBuYXZpZ2F0ZSB0byBuYW1lCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCWludCBlcnJvckNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IChpIDwgcmVnaW9ucy5zaXplKCkpICYmIChlcnJvckNvdW50IDwgQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kuRUxFTUVOVF9FUlJPUl9MSU1JVCkgJiYgIXN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKTsgaSsrKSB7Ci0JCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQlTdHJpbmcgcGlUZXh0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQocik7Ci0JCQkJaW50IGluZGV4ID0gcGlUZXh0LmluZGV4T2YoIjoiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBYTUxVSU1lc3NhZ2VzLlJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNDsKLQkJCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpICsgaW5kZXg7Ci0JCQkJCWludCBsZW5ndGggPSBwaVRleHQudHJpbSgpLmxlbmd0aCgpIC0gaW5kZXg7Ci0KLQkJCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoU0VWRVJJVFlfTkFNRVNQQUNFX0lOX1BJX1RBUkdFVCAsIG1lc3NhZ2VUZXh0KTsKLQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQkJCQltZXNzYWdlLnNldExpbmVObyhnZXRMaW5lTnVtYmVyKHN0YXJ0KSk7Ci0KLQkJCQkJaWYgKHJlcG9ydGVyIGluc3RhbmNlb2YgSW5jcmVtZW50YWxSZXBvcnRlcikgewotCQkJCQkJTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IE1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yKCk7Ci0JCQkJCQlwcm9jZXNzb3Iuc2V0UHJvYmxlbUlkKFByb2JsZW1JRHNYTUwuTmFtZXNwYWNlSW5QSSk7Ci0JCQkJCQltZXNzYWdlLnNldEF0dHJpYnV0ZShRVUlDS0FTU0lTVFBST0NFU1NPUiwgcHJvY2Vzc29yKTsKLQotCQkJCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlKTsKLQkJCQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcikgcmVwb3J0ZXIpLmFkZEFubm90YXRpb25JbmZvKHRoaXMsIGluZm8pOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkJCQkJfQotCi0JCQkJCWVycm9yQ291bnQrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tRdW90ZXNGb3JBdHRyaWJ1dGVWYWx1ZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlTdHJpbmcgYXR0clZhbHVlVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBlcnJvckNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IChpIDwgcmVnaW9ucy5zaXplKCkpICYmIChlcnJvckNvdW50IDwgQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kuRUxFTUVOVF9FUlJPUl9MSU1JVCk7IGkrKykgewotCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHIuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJYXR0clZhbHVlVGV4dCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJLy8gYXR0cmlidXRlIHZhbHVlIGluY2x1ZGVzIHF1b3RlcyBpbiB0aGUgc3RyaW5nCi0JCQkvLyBzcGxpdCB1cCBhdHRyaWJ1dGUgdmFsdWUgb24gcXVvdGVzCi0JCQkvKgotCQkJICogV09SS0FST1VORCB0aWxsCi0JCQkgKiBodHRwOi8vZGV2LmljdS1wcm9qZWN0Lm9yZy9jZ2ktYmluL2ljdS1idWdzL2luY29taW5nP2ZpbmRpZD01MjA3Ci0JCQkgKiBpcyBmaXhlZC4gKEFsc28gc2VlIEJVRzE0MzYyOCkKLQkJCSAqLwotCi0JCQlqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIoYXR0clZhbHVlVGV4dCwgIlwiJyIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgc2l6ZSA9IHN0LmNvdW50VG9rZW5zKCk7Ci0JCQkvLyBnZXQgdGhlIHBpZWNlcyBvZiB0aGUgYXR0cmlidXRlIHZhbHVlCi0JCQlTdHJpbmcgb25lID0gIiIsIHR3byA9ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChzaXplID4gMCkgewotCQkJCW9uZSA9IHN0Lm5leHRUb2tlbigpOwotCQkJfQotCQkJaWYgKHNpemUgPiAxKSB7Ci0JCQkJdHdvID0gc3QubmV4dFRva2VuKCk7Ci0JCQl9Ci0JCQlpZiAoc2l6ZSA+IDIpIHsKLQkJCQkvLyBzaG91bGQgYmUgaGFuZGxlZCBieSBwYXJzaW5nLi4uCi0JCQkJLy8gYXMgaW4gd2UgY2FuJ3QgaGF2ZSBhbiBhdHRyaWJ1dGUgdmFsdWUgbGlrZTogPGVsZW1lbnQKLQkJCQkvLyBhdHRyPSJhImIiYyIvPgotCQkJCS8vIGFuZCA8ZWxlbWVudCBhdHRyPSdhImIiYycgLz4gaXMgbGVnYWwKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCi0JCQlpZiAoc2l6ZSA9PSAxKSB7Ci0JCQkJaWYgKG9uZS5lcXVhbHMoRFFVT1RFKSB8fCBvbmUuZXF1YWxzKFNRVU9URSkpIHsKLQkJCQkJLy8gbWlzc2luZyBjbG9zaW5nIHF1b3RlCi0JCQkJCVN0cmluZyBtZXNzYWdlID0gWE1MVUlNZXNzYWdlcy5SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzA7Ci0JCQkJCWFkZEF0dHJpYnV0ZUVycm9yKG1lc3NhZ2UsIGF0dHJWYWx1ZVRleHQsIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSwgYXR0clZhbHVlVGV4dC50cmltKCkubGVuZ3RoKCksIFByb2JsZW1JRHNYTUwuVW5jbGFzc2lmaWVkLCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyLCBTRVZFUklUWV9NSVNTSU5HX0NMT1NJTkdfUVVPVEUpOwotCQkJCQllcnJvckNvdW50Kys7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBtaXNzaW5nIGJvdGgKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBYTUxVSU1lc3NhZ2VzLlJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMTsKLQkJCQkJYWRkQXR0cmlidXRlRXJyb3IobWVzc2FnZSwgYXR0clZhbHVlVGV4dCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpLCBhdHRyVmFsdWVUZXh0LnRyaW0oKS5sZW5ndGgoKSwgUHJvYmxlbUlEc1hNTC5BdHRyVmFsdWVOb3RRdW90ZWQsIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIsIFNFVkVSSVRZX01JU1NJTkdfUVVPVEVTKTsKLQkJCQkJZXJyb3JDb3VudCsrOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHNpemUgPT0gMikgewotCQkJCWlmICgob25lLmVxdWFscyhTUVVPVEUpICYmICF0d28uZXF1YWxzKFNRVU9URSkpIHx8IChvbmUuZXF1YWxzKERRVU9URSkgJiYgIXR3by5lcXVhbHMoRFFVT1RFKSkpIHsKLQkJCQkJLy8gbWlzc2luZyBjbG9zaW5nIHF1b3RlCi0JCQkJCVN0cmluZyBtZXNzYWdlID0gWE1MVUlNZXNzYWdlcy5SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzA7Ci0JCQkJCWFkZEF0dHJpYnV0ZUVycm9yKG1lc3NhZ2UsIGF0dHJWYWx1ZVRleHQsIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSwgYXR0clZhbHVlVGV4dC50cmltKCkubGVuZ3RoKCksIFByb2JsZW1JRHNYTUwuVW5jbGFzc2lmaWVkLCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyLCBTRVZFUklUWV9NSVNTSU5HX0NMT1NJTkdfUVVPVEUpOwotCQkJCQllcnJvckNvdW50Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGVuZCBvZiByZWdpb24gZm9yIGxvb3AKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tTdGFydEVuZFRhZ1BhaXJzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotCi0JCWlmIChzZFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gY2hlY2sgc3RhcnQvZW5kIHRhZyBwYWlycwotCQlJRE9NTm9kZSB4bWxOb2RlID0gZ2V0WE1MTm9kZShzZFJlZ2lvbik7Ci0KLQkJaWYgKHhtbE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiBzZWxmQ2xvc2VkID0gZmFsc2U7Ci0JCVN0cmluZyB0YWdOYW1lID0gbnVsbDsKLQotCQkvKioKLQkJICogRm9yIHRhZ3MgdGhhdCBhcmVuJ3QgbWVhbnQgdG8gYmUgRU1QVFksIG1ha2Ugc3VyZSBpdCdzIGVtcHR5IG9yIGhhcyBhbiBlbmQgdGFnCi0JCSAqLwotCQlpZiAoeG1sTm9kZS5pc0NvbnRhaW5lcigpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFJlZ2lvbiA9IHhtbE5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZW5kUmVnaW9uID09IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0UmVnaW9uID0geG1sTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChzdGFydFJlZ2lvbiAhPSBudWxsICYmICFzdGFydFJlZ2lvbi5pc0RlbGV0ZWQoKSAmJiBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTi5lcXVhbHMoc3RhcnRSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkpKSB7Ci0JCQkJCS8vIGFuYWx5emUgdGhlIHRhZyAoY2hlY2sgc2VsZiBjbG9zaW5nKQotCQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCQkJCWludCBzdGFydCA9IHNkUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJCWludCBsZW5ndGggPSBzZFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJCQkJdGFnTmFtZSA9IHNkUmVnaW9uLmdldFRleHQocik7Ci0JCQkJCQkJc3RhcnQgPSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChyKTsKLQkJCQkJCQlsZW5ndGggPSByLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCQkJCXNlbGZDbG9zZWQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0KLQotCQkJCQlpZiAoIXNlbGZDbG9zZWQgJiYgKHRhZ05hbWUgIT0gbnVsbCkpIHsKLQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7dGFnTmFtZX07Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLk1pc3NpbmdfZW5kX3RhZ18sIGFyZ3MpOwotCi0JCQkJCQlpbnQgbGluZU51bWJlciA9IGdldExpbmVOdW1iZXIoc3RhcnQpOwotCi0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoU0VWRVJJVFlfTUlTU0lOR19FTkRfVEFHICwgbWVzc2FnZVRleHQpOwotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVOdW1iZXIpOwotCi0JCQkJCQlpZiAocmVwb3J0ZXIgaW5zdGFuY2VvZiBJbmNyZW1lbnRhbFJlcG9ydGVyKSB7Ci0JCQkJCQkJT2JqZWN0W10gYWRkaXRpb25hbEZpeEluZm8gPSBnZXRTdGFydEVuZEZpeEluZm8oeG1sTm9kZSwgdGFnTmFtZSwgcik7Ci0KLQkJCQkJCQlNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IoKTsKLQkJCQkJCQlwcm9jZXNzb3Iuc2V0UHJvYmxlbUlkKFByb2JsZW1JRHNYTUwuTWlzc2luZ0VuZFRhZyk7Ci0JCQkJCQkJcHJvY2Vzc29yLnNldEFkZGl0aW9uYWxGaXhJbmZvKGFkZGl0aW9uYWxGaXhJbmZvKTsKLQkJCQkJCQltZXNzYWdlLnNldEF0dHJpYnV0ZShRVUlDS0FTU0lTVFBST0NFU1NPUiwgcHJvY2Vzc29yKTsKLQotCQkJCQkJCUFubm90YXRpb25JbmZvIGluZm8gPSBuZXcgQW5ub3RhdGlvbkluZm8obWVzc2FnZSk7Ci0KLQkJCQkJCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpIHJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0UmVnaW9uID0geG1sTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChzdGFydFJlZ2lvbiA9PSBudWxsIHx8IHN0YXJ0UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQkJCS8vIGFuYWx5emUgdGhlIHRhZyAoY2hlY2sgc2VsZiBjbG9zaW5nKQotCQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGVuZFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQkJCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQkJCQlpbnQgc3RhcnQgPSBzZFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCQlpbnQgbGVuZ3RoID0gc2RSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCQkJCXRhZ05hbWUgPSBzZFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCQkJCXN0YXJ0ID0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQocik7Ci0JCQkJCQkJbGVuZ3RoID0gci5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlPYmplY3RbXSBhcmdzID0ge3RhZ05hbWV9OwotCQkJCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5NaXNzaW5nX3N0YXJ0X3RhZ18sIGFyZ3MpOwotCi0JCQkJCQlpbnQgbGluZU51bWJlciA9IGdldExpbmVOdW1iZXIoc3RhcnQpOwotCi0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoU0VWRVJJVFlfTUlTU0lOR19TVEFSVF9UQUcsIG1lc3NhZ2VUZXh0KTsKLQkJCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTnVtYmVyKTsKLQotCQkJCQkJaWYgKHJlcG9ydGVyIGluc3RhbmNlb2YgSW5jcmVtZW50YWxSZXBvcnRlcikgewotCQkJCQkJCU9iamVjdFtdIGFkZGl0aW9uYWxGaXhJbmZvID0gZ2V0U3RhcnRFbmRGaXhJbmZvKHhtbE5vZGUsIHRhZ05hbWUsIHIpOwotCi0JCQkJCQkJTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IE1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yKCk7Ci0JCQkJCQkJcHJvY2Vzc29yLnNldFByb2JsZW1JZChQcm9ibGVtSURzWE1MLk1pc3NpbmdTdGFydFRhZyk7Ci0JCQkJCQkJcHJvY2Vzc29yLnNldEFkZGl0aW9uYWxGaXhJbmZvKGFkZGl0aW9uYWxGaXhJbmZvKTsKLQkJCQkJCQltZXNzYWdlLnNldEF0dHJpYnV0ZShRVUlDS0FTU0lTVFBST0NFU1NPUiwgcHJvY2Vzc29yKTsKLQotCQkJCQkJCUFubm90YXRpb25JbmZvIGluZm8gPSBuZXcgQW5ub3RhdGlvbkluZm8obWVzc2FnZSk7Ci0KLQkJCQkJCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpIHJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQkvKgotCQkgKiBDaGVjayBmb3IgYW4gZW5kIHRhZyB0aGF0IGhhcyBubyBzdGFydCB0YWcKLQkJICovCi0JCWVsc2UgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFJlZ2lvbiA9IHhtbE5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChzdGFydFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRSZWdpb24gPSB4bWxOb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmICghZW5kUmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQkJCS8vIGdldCBuYW1lCi0JCQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZW5kUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJCQkJdGFnTmFtZSA9IHNkUmVnaW9uLmdldFRleHQocik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAoIXNlbGZDbG9zZWQgJiYgKHRhZ05hbWUgIT0gbnVsbCkpIHsKLQkJCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IFhNTFVJTWVzc2FnZXMuSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWRfc2V2ZXJpdGllc19lcnJvcjsKLQotCQkJCQkJaW50IHN0YXJ0ID0gc2RSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJCWludCBsaW5lTnVtYmVyID0gZ2V0TGluZU51bWJlcihzdGFydCk7Ci0KLQkJCQkJCS8vIFNFVkVSSVRZX1NUUlVDVFVSRSA9PSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZCi0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbWVzc2FnZVRleHQpOwotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgoc2RSZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVOdW1iZXIpOwotCi0JCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBnZXRTdGFydEVuZEZpeEluZm8oSURPTU5vZGUgeG1sTm9kZSwgU3RyaW5nIHRhZ05hbWUsIElUZXh0UmVnaW9uIHIpIHsKLQkJLy8gcXVpY2sgZml4IGluZm8KLQkJU3RyaW5nIHRhZ0Nsb3NlID0gIi8+IjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgdGFnQ2xvc2VPZmZzZXQgPSB4bWxOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmICgociAhPSBudWxsKSAmJiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSkgewotCQkJdGFnQ2xvc2UgPSAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJCXRhZ0Nsb3NlT2Zmc2V0LS07Ci0JCX0KLQkJSURPTU5vZGUgZmlyc3RDaGlsZCA9IChJRE9NTm9kZSkgeG1sTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlICgoZmlyc3RDaGlsZCAhPSBudWxsKSAmJiAoZmlyc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSkgewotCQkJZmlyc3RDaGlsZCA9IChJRE9NTm9kZSkgZmlyc3RDaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCWludCBlbmRPZmZzZXQgPSB4bWxOb2RlLmdldEVuZE9mZnNldCgpOwotCQlpbnQgZmlyc3RDaGlsZFN0YXJ0T2Zmc2V0ID0gZmlyc3RDaGlsZCA9PSBudWxsID8gZW5kT2Zmc2V0IDogZmlyc3RDaGlsZC5nZXRTdGFydE9mZnNldCgpOwotCQlPYmplY3RbXSBhZGRpdGlvbmFsRml4SW5mbyA9IHt0YWdOYW1lLCB0YWdDbG9zZSwgbmV3IEludGVnZXIodGFnQ2xvc2VPZmZzZXQpLCBuZXcgSW50ZWdlcih4bWxOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCkpLCAvLyBzdGFydFRhZ0VuZE9mZnNldAotCQkJCQluZXcgSW50ZWdlcihmaXJzdENoaWxkU3RhcnRPZmZzZXQpLCAvLyBmaXJzdENoaWxkU3RhcnRPZmZzZXQKLQkJCQkJbmV3IEludGVnZXIoZW5kT2Zmc2V0KX07IC8vIGVuZE9mZnNldAotCQlyZXR1cm4gYWRkaXRpb25hbEZpeEluZm87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU3RhcnRpbmdTcGFjZUZvclBJKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXYgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJaWYgKChwcmV2ICE9IG51bGwpICYmIHByZXYuZ2V0U3RhcnRPZmZzZXQoKSA9PSAwKSB7Ci0JCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgewotCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IFhNTFVJTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF81OwotCQkJCWludCBzdGFydCA9IHByZXYuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgbGVuZ3RoID0gcHJldi5nZXRMZW5ndGgoKTsKLQotCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKFNFVkVSSVRZX1dISVRFU1BBQ0VfQVRfU1RBUlQgLCBtZXNzYWdlVGV4dCk7Ci0JCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCQkJbWVzc2FnZS5zZXRMaW5lTm8oZ2V0TGluZU51bWJlcihzdGFydCkpOwotCi0JCQkJaWYgKHJlcG9ydGVyIGluc3RhbmNlb2YgSW5jcmVtZW50YWxSZXBvcnRlcikgewotCQkJCQlNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IoKTsKLQkJCQkJcHJvY2Vzc29yLnNldFByb2JsZW1JZChQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVBJKTsKLQkJCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoUVVJQ0tBU1NJU1RQUk9DRVNTT1IsIHByb2Nlc3Nvcik7Ci0JCi0JCQkJCUFubm90YXRpb25JbmZvIGluZm8gPSBuZXcgQW5ub3RhdGlvbkluZm8obWVzc2FnZSk7Ci0JCQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcikgcmVwb3J0ZXIpLmFkZEFubm90YXRpb25JbmZvKHRoaXMsIGluZm8pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJLy8gUG9zaXRpb24gcCA9IG5ldyBQb3NpdGlvbihzdGFydCwgbGVuZ3RoKTsKLQkJCQkvLwkJCQkKLQkJCQkvLyBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IGtleSA9Ci0JCQkJLy8gY3JlYXRlS2V5KHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZ2V0U2NvcGUoKSk7Ci0JCQkJLy8gVGVtcG9yYXJ5QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbmV3IFRlbXBvcmFyeUFubm90YXRpb24ocCwKLQkJCQkvLyBTRVZFUklUWV9TWU5UQVhfRVJST1IsIG1lc3NhZ2UsIGtleSwKLQkJCQkvLyBQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVBJKTsKLQkJCQkvLyByZXN1bHRzLmFkZChhbm5vdGF0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2NvcGUoKSB7Ci0JCXJldHVybiBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlBBUlRJQUw7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBnZXRYTUxOb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQotCQlpZiAoc2RSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIHhNb2RlbCA9IG51bGw7Ci0JCUlET01Ob2RlIHhtbE5vZGUgPSBudWxsOwotCQkvLyBnZXQvcmVsZWFzZSBtb2RlbHMgc2hvdWxkIGFsd2F5cyBiZSBpbiBhIHRyeS9maW5hbGx5IGJsb2NrCi0JCXRyeSB7Ci0JCQl4TW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotCQkJLy8geE1vZGVsIGlzIHNvbWV0aW1lIG51bGwsIHdoZW4gY2xvc2luZyBlZGl0b3IsIGZvciBleGFtcGxlCi0JCQlpZiAoeE1vZGVsICE9IG51bGwpIHsKLQkJCQl4bWxOb2RlID0gKElET01Ob2RlKSB4TW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzZFJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmICh4TW9kZWwgIT0gbnVsbCkgewotCQkJCXhNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4geG1sTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgYSBYTUwgImVuZCB0YWciCi0JICogc2luY2UgdGhleSdyZSBub3QgYWxsb3dlZCB0byBoYXZlIGF0dHJpYnV0ZSBJVGV4dFJlZ2lvbnMKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5kVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmICgoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHx8IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgYW4gWE1MIFByb2Nlc3NpbmcKLQkgKiBJbnN0cnVjdGlvbgotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNQSShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAoKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB8fCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU47Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIGEgWE1MICJzdGFydCB0YWciCi0JICogc2luY2UgdGhleSBuZWVkIHRvIGJlIGNoZWNrZWQgZm9yIHByb3BlciBYTUwgYXR0cmlidXRlIHJlZ2lvbiBzZXF1ZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzU3RhcnRUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgfHwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTjsKLQl9Ci0KLQkvLyBCZWNhdXNlIHdlIGNoZWNrIHRoZSAicHJvcGVyIiBjbG9zaW5nIHNlcGFyYXRlbHkgZnJvbSBhdHRyaWJ1dGUKLQkvLyBzZXF1ZW5jaW5nLCB3ZSBuZWVkIHRvIGtub3cgd2hhdCdzCi0JLy8gYW4gYXBwcm9wcmlhdGUgY2xvc2UuCi0JcHJpdmF0ZSBib29sZWFuIGlzVGFnQ2xvc2VUZXh0UmVnaW9uKElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJcmV0dXJuICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHx8ICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgWE1MIENvbnRlbnQKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzWE1MQ29udGVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAoKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB8fCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2MpIHsKLQkJZkRvY3VtZW50ID0gZG9jOwotCX0KLQotCXByaXZhdGUgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXNldERvY3VtZW50KGRvY3VtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlzZXREb2N1bWVudChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJUmVnaW9uIGRpcnR5UmVnaW9uLCBJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKGdldERvY3VtZW50KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghKHJlcG9ydGVyIGluc3RhbmNlb2YgSW5jcmVtZW50YWxSZXBvcnRlcikpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIShnZXREb2N1bWVudCgpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHJlbW92ZSBvbGQgbWVzc2FnZXMKLQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcyk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIHJlZ2lvbnMgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudCkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhkaXJ0eVJlZ2lvbi5nZXRPZmZzZXQoKSwgZGlydHlSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCXZhbGlkYXRlKHJlZ2lvbnNbaV0sIHJlcG9ydGVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChpc1N0YXJ0VGFnKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCS8vIGNoZWNrIGZvciBhdHRyaWJ1dGVzIHdpdGhvdXQgYSB2YWx1ZQotCQkJY2hlY2tGb3JBdHRyaWJ1dGVWYWx1ZShzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJCS8vIGNoZWNrIGlmIHN0YXJ0ZWQgdGFnIGlzIGVuZGVkCi0JCQljaGVja1N0YXJ0RW5kVGFnUGFpcnMoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQkvLyBjaGVjayBlbXB0eSB0YWcgPD4KLQkJCWNoZWNrRW1wdHlUYWcoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQkvLyBjaGVjayB0aGF0IGVhY2ggYXR0cmlidXRlIGhhcyBxdW90ZXMKLQkJCWNoZWNrUXVvdGVzRm9yQXR0cmlidXRlVmFsdWVzKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJLy8gY2hlY2sgdGhhdCB0aGUgY2xvc2luZyAnPicgaXMgdGhlcmUKLQkJCWNoZWNrQ2xvc2luZ0JyYWNrZXQoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoaXNFbmRUYWcoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSkgewotCQkJLy8gY2hlY2sgaWYgZW5kaW5nIHRhZyB3YXMgc3RhcnRlZAotCQkJY2hlY2tTdGFydEVuZFRhZ1BhaXJzKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJLy8gY2hlY2sgZm9yIGF0dHJpYnV0ZXMgaW4gYW4gZW5kIHRhZwotCQkJY2hlY2tBdHRyaWJ1dGVzSW5FbmRUYWcoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQkvLyBjaGVjayB0aGF0IHRoZSBjbG9zaW5nICc+JyBpcyB0aGVyZQotCQkJY2hlY2tDbG9zaW5nQnJhY2tldChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJfQotCQllbHNlIGlmIChpc1BJKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCS8vIGNoZWNrIHZhbGlkaXR5IG9mIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KLQkJCWNoZWNrU3RhcnRpbmdTcGFjZUZvclBJKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJY2hlY2tOb05hbWVzcGFjZUluUEkoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoaXNYTUxDb250ZW50KHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCWNoZWNrRm9yU3BhY2VCZWZvcmVOYW1lKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQl9Ci0JCWVsc2UgaWYgKGlzWE1MRG9jdHlwZURlY2xhcmF0aW9uKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCWNoZWNrRG9jdW1lbnRUeXBlUmVmZXJlbmNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tEb2N1bWVudFR5cGVSZWZlcmVuY2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1hNTERvY3R5cGVEZWNsYXJhdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAoKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB8fCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4gJiYgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTik7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJZkRvY3VtZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10gdXJpcyA9IGhlbHBlci5nZXRVUklzKCk7Ci0JCUlXb3Jrc3BhY2VSb290IHdzUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCWlmICh1cmlzLmxlbmd0aCA+IDApIHsKLQkJCUlGaWxlIGN1cnJlbnRGaWxlID0gbnVsbDsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLmxlbmd0aCAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKTsgaSsrKSB7Ci0JCQkJLy8gbWlnaHQgYmUgY2FsbGVkIHdpdGgganVzdCBwcm9qZWN0IHBhdGg/Ci0JCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHVyaXNbaV0pOwotCQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCQljdXJyZW50RmlsZSA9IHdzUm9vdC5nZXRGaWxlKHBhdGgpOwotCQkJCQlpZiAoc2hvdWxkVmFsaWRhdGUoY3VycmVudEZpbGUsIHRydWUpKSB7Ci0JCQkJCQl2YWxpZGF0ZVYxRmlsZShjdXJyZW50RmlsZSwgcmVwb3J0ZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHVyaXMubGVuZ3RoID09IDEpIHsKLQkJCQkJdmFsaWRhdGVWMVByb2plY3QoaGVscGVyLCByZXBvcnRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXZhbGlkYXRlVjFQcm9qZWN0KGhlbHBlciwgcmVwb3J0ZXIpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSVJlc291cmNlUHJveHkgcHJveHkpIHsKLQkJaWYocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IHByb3h5LmdldE5hbWUoKTsKLQkJCWlmKG5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLlVTKS5lbmRzV2l0aCgiLnhtbCIpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNob3VsZFZhbGlkYXRlKHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLCBmYWxzZSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZShJUmVzb3VyY2UgZmlsZSwgYm9vbGVhbiBjaGVja0V4dGVuc2lvbikgewotCQlpZiAoZmlsZSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpIHx8IGZpbGUuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY2hlY2tFeHRlbnNpb24pIHsKLQkJCVN0cmluZyBleHRlbnNpb24gPSBmaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCAmJiAieG1sIi5lbmRzV2l0aChleHRlbnNpb24udG9Mb3dlckNhc2UoTG9jYWxlLlVTKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb250ZW50RGVzY3JpcHRpb24gPSAoKElGaWxlKSBmaWxlKS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpOwotCQkJCXJldHVybiBjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCAmJiBjb250ZW50VHlwZS5pc0tpbmRPZihnZXRYTUxDb250ZW50VHlwZSgpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaGVscGVyCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVjFQcm9qZWN0KElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIGZpbmFsIElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBpZiB1cmlzW10gbGVuZ3RoIDAgLT4gdmFsaWRhdGUoKSBnZXRzIGNhbGxlZCBmb3IgZWFjaCBwcm9qZWN0Ci0JCWlmIChoZWxwZXIgaW5zdGFuY2VvZiBJV29ya2JlbmNoQ29udGV4dCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9ICgoSVdvcmtiZW5jaENvbnRleHQpIGhlbHBlcikuZ2V0UHJvamVjdCgpOwotCQkJSVJlc291cmNlUHJveHlWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVJlc291cmNlUHJveHlWaXNpdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCWlmIChzaG91bGRWYWxpZGF0ZShwcm94eSkpIHsKLQkJCQkJCXZhbGlkYXRlVjFGaWxlKChJRmlsZSkgcHJveHkucmVxdWVzdFJlc291cmNlKCksIHJlcG9ydGVyKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9OwotCQkJdHJ5IHsKLQkJCQkvLyBjb2xsZWN0IGFsbCBqc3AgZmlsZXMgZm9yIHRoZSBwcm9qZWN0Ci0JCQkJcHJvamVjdC5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogQHBhcmFtIGN1cnJlbnRGaWxlCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVjFGaWxlKElGaWxlIGN1cnJlbnRGaWxlLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBjdXJyZW50RmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpKTsKLQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2soTWFya3VwVmFsaWRhdG9yLnRoaXMsIG1lc3NhZ2UpOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChjdXJyZW50RmlsZSk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJZG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQljb25uZWN0KGRvY3VtZW50KTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHZhbGlkYXRpb25SZWdpb24gPSBkb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCXdoaWxlICh2YWxpZGF0aW9uUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJdmFsaWRhdGUodmFsaWRhdGlvblJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJCQl2YWxpZGF0aW9uUmVnaW9uID0gdmFsaWRhdGlvblJlZ2lvbi5nZXROZXh0KCk7Ci0JCQkJfQotCQkJCWRpc2Nvbm5lY3QoZG9jdW1lbnQpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZ2V0WE1MQ29udGVudFR5cGUoKSB7Ci0JCWlmIChmUm9vdENvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWZSb290Q29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZSgib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIpOwotCQl9Ci0JCXJldHVybiBmUm9vdENvbnRlbnRUeXBlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSwgaW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvblJlc3VsdCgpOwotCQlJUmVwb3J0ZXIgcmVwb3J0ZXIgPSByZXN1bHQuZ2V0UmVwb3J0ZXIobW9uaXRvcik7Ci0JCXZhbGlkYXRlVjFGaWxlKChJRmlsZSkgcmVzb3VyY2UsIHJlcG9ydGVyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmlld3MvYW5ub3RhdGlvbnMvWE1MQW5ub3RhdGlvbnNWaWV3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmlld3MvYW5ub3RhdGlvbnMvWE1MQW5ub3RhdGlvbnNWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOWI0NzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZpZXdzL2Fubm90YXRpb25zL1hNTEFubm90YXRpb25zVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgKFNUQVIpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIChJbnRhbGlvKSAtIGdlbmVyYWxpemUgdGhlIGltcGxlbWVudGF0aW9uIGZvciBjb250cmlidXRpb24gdG8gZWNsaXBzZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmlld3MuYW5ub3RhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC50ZXh0Lmh0bWwuSFRNTFRleHRQcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhZ2luZm8uTWFya3VwVGFnSW5mb1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFByb3ZpZGVzIGEgdmlldyBzaW1pbGFyIHRvIHRoZSBKYXZhRG9jIHZpZXcgdGhhdCB3aWxsIGRpc3BsYXkgYW55IGRvY3VtZW50YXRpb24gdGhhdCByZXNpZGVzIGluCi0gKiB0aGUgY29udGVudCBtb2RlbCBmb3IgYW4gWE1MIGRvY3VtZW50LgotICogCi0gKiBAYXV0aG9yIGRjYXJ2ZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxBbm5vdGF0aW9uc1ZpZXcgZXh0ZW5kcyBWaWV3UGFydCBpbXBsZW1lbnRzIElTZWxlY3Rpb25MaXN0ZW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXcuYW5ub3RhdGlvbnMuWE1MQW5ub3RhdGlvbnNWaWV3IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHlsZWRUZXh0IHN0eWxlZHRleHQ7Ci0KLQlwcml2YXRlIFN0cmluZyB4bWxEb2MgPSBYTUxVSU1lc3NhZ2VzLkRvY3VtZW50YXRpb25fdmlld19kZWZhdWx0X21zZzsKLQotCXByaXZhdGUgSFRNTFRleHRQcmVzZW50ZXIgcHJlc2VudGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbiA9IG5ldyBUZXh0UHJlc2VudGF0aW9uKCk7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb247Ci0JcHJpdmF0ZSBDTU5vZGUgY21Ob2RlOwotCi0JcHVibGljIFhNTEFubm90YXRpb25zVmlldygpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3U2l0ZSBzaXRlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzdXBlci5pbml0KHNpdGUpOwotCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmFkZFBvc3RTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgY29udGVudHMgb2YgdGhlIHZpZXcgcGFydC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJcHJlc2VudGVyID0gbmV3IEhUTUxUZXh0UHJlc2VudGVyKGZhbHNlKTsKLQkJY3JlYXRlU3R5bGVkVGV4dFdpZGdldChjb250YWluZXIpOwotCQlkb1N0eWxlZFRleHRJbnB1dCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVTdHlsZWRUZXh0V2lkZ2V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJc3R5bGVkdGV4dCA9IG5ldyBTdHlsZWRUZXh0KGNvbnRhaW5lciwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJc3R5bGVkdGV4dC5zZXRCYWNrZ3JvdW5kKGdldENvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKLQkJc3R5bGVkdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCXN0eWxlZHRleHQuc2V0Qm91bmRzKGNvbnRhaW5lci5nZXRCb3VuZHMoKSk7Ci0JCXN0eWxlZHRleHQuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCS8qCi0JCQkgKiBAc2VlCi0JCQkgKiBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyI2NvbnRyb2xSZXNpemVkKG9yZy5lY2xpcHNlCi0JCQkgKiAuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJZG9TdHlsZWRUZXh0SW5wdXQoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvU3R5bGVkVGV4dElucHV0KCkgewotCQlwcmVzZW50YXRpb24uY2xlYXIoKTsKLQkJUmVjdGFuZ2xlIHNpemUgPSBzdHlsZWR0ZXh0LmdldENsaWVudEFyZWEoKTsKLQkJaW50IHdpZHRoID0gc2l6ZS53aWR0aDsKLQkJaW50IGhlaWdodCA9IHNpemUuaGVpZ2h0OwotCQlpZiAod2lkdGggPT0gMCkgewotCQkJd2lkdGggPSAyMDA7Ci0JCX0KLQkJCi0JCWlmIChoZWlnaHQgPT0gMCkgewotCQkJaGVpZ2h0ID0gNDAwOwotCQl9Ci0KLQkJU3RyaW5nIG1zZyA9IHByZXNlbnRlci51cGRhdGVQcmVzZW50YXRpb24oc3R5bGVkdGV4dCwgeG1sRG9jLCBwcmVzZW50YXRpb24sIHdpZHRoLCBoZWlnaHQpOwotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCXN0eWxlZHRleHQuc2V0VGV4dChtc2cpOwotCQkJVGV4dFByZXNlbnRhdGlvbi5hcHBseVRleHRQcmVzZW50YXRpb24ocHJlc2VudGF0aW9uLCBzdHlsZWR0ZXh0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQkKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN0eWxlZHRleHQgPSBudWxsOwotCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBvc3RTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJY21Ob2RlID0gbnVsbDsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQotCQlJRWRpdG9yUGFydCBlZFBhcnQgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQlpZiAocGFydC5lcXVhbHMoZWRQYXJ0KSkgewotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJY3VycmVudFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKQotCQkJCQkJJiYgKGN1cnJlbnRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBOb2RlKSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgY3VycmVudFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJCQlpZiAobXEgIT0gbnVsbCkgewotCQkJCQkJY21Ob2RlID0gbXEuZ2V0Q01Ob2RlKG5vZGUpOwotCQkJCQkJTWFya3VwVGFnSW5mb1Byb3ZpZGVyIHRhZ0luZm8gPSBuZXcgTWFya3VwVGFnSW5mb1Byb3ZpZGVyKCk7Ci0JCQkJCQl4bWxEb2MgPSB0YWdJbmZvLmdldEluZm8oY21Ob2RlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXhtbERvYyA9IFhNTFVJTWVzc2FnZXMuRG9jdW1lbnRhdGlvbl92aWV3X2RlZmF1bHRfbXNnOwotCQkJCQl9Ci0JCQkJCWRvU3R5bGVkVGV4dElucHV0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgQ29sb3IgZ2V0Q29sb3IoaW50IGNvbG9ySUQpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCXJldHVybiBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKGNvbG9ySUQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50bW9kZWwvQ01MaXN0V29ya2JlbmNoQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRtb2RlbC9DTUxpc3RXb3JrYmVuY2hBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZDRmZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRtb2RlbC9DTUxpc3RXb3JrYmVuY2hBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLXB1YmxpYyBjbGFzcyBDTUxpc3RXb3JrYmVuY2hBZGFwdGVyIGV4dGVuZHMgQ01WaXNpdG9yIGltcGxlbWVudHMgSVdvcmtiZW5jaEFkYXB0ZXIgewotCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBmRGVjbGFyYXRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBpbWFnZTsKLQlwcml2YXRlIEdyb3VwU3RhY2sgZkdyb3VwU3RhY2s7Ci0JcHJpdmF0ZSBDTURlc2NyaWJlciBmUm9vdDsKLQotCXB1YmxpYyBDTUxpc3RXb3JrYmVuY2hBZGFwdGVyKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJdGV4dCA9IGdldEZvcm1hdHRlZExhYmVsKGRlY2wuZ2V0Tm9kZU5hbWUoKSwgZGVjbC5nZXRNaW5PY2N1cigpLCBkZWNsLmdldE1heE9jY3VyKCksIGRlY2wuZ2V0RGF0YVR5cGUoKSk7Ci0JCWZEZWNsYXJhdGlvbiA9IGRlY2w7Ci0JCWltYWdlID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFhNTFVJUGx1Z2luLklELCBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTEVNRU5UKTsKLQotCQlmR3JvdXBTdGFjayA9IG5ldyBHcm91cFN0YWNrKCk7Ci0JCWZSb290ID0gbmV3IENNRGVzY3JpYmVyKGRlY2wpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQkvKiBUT0RPIFVzZSB0aGUgQ01FbGVtZW50RGVjbGFyYXRpb24gYW5kIE1vZGVsUXVlcnkgdG8gZ2V0IHRoZSBhdmFpbGFibGUgY2hpbGRyZW4gb2YgdGhlIHJvb3QgZWxlbWVudCAqLwotCQlyZXR1cm4gZlJvb3QuZ2V0Q2hpbGRyZW4obyk7Ci0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgewotCQlyZXR1cm4gZkRlY2xhcmF0aW9uOwotCX0KLQotCS8qKgotCSAqIEZvcm1hdHMgdGhlIGxhYmVsIGZvciBhbiBlbGVtZW50IGRlY2xhcmF0aW9uLiBUaGUgZm9ybWF0IHdpbGwgYmU6IDxiPm5hbWU8L2I+IFs8aT5taW48L2k+Li48aT5tYXg8L2k+XSwgd2hlcmUgPGk+bWF4PC9pPiB3aGVuIHVuYm91bmRlZCBpcyByZXByZXNlbnRlZCBieSA8Yj4qPC9iPgotCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uCi0JICogQHBhcmFtIG1pbiBUaGUgbWluaW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gbWF4IFRoZSBtYXhpbXVtIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBsYWJlbCBTdHJpbmcKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldEZvcm1hdHRlZExhYmVsKFN0cmluZyBuYW1lLCBpbnQgbWluLCBpbnQgbWF4LCBDTURhdGFUeXBlIGRhdGFUeXBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUpOwotCQlidWZmZXIuYXBwZW5kKCdbJyk7Ci0JCWJ1ZmZlci5hcHBlbmQobWluKTsKLQkJYnVmZmVyLmFwcGVuZCgiLi4iKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKChtYXggPj0gMCA/IEludGVnZXIudG9TdHJpbmcobWF4KSA6ICIqIikpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoJ10nKTsKLQkJaWYgKGRhdGFUeXBlICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIiB7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQoZGF0YVR5cGUuZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQkJYnVmZmVyLmFwcGVuZCgnfScpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBXb3JrYmVuY2ggYWRhcHRlciB0aGF0IGRlc2NyaWJlcyBpdHMgQ01Ob2RlLiBJdCBjYWxjdWxhdGVzIGl0cyBjaGlsZHJlbiBsYXppbHkgdXNpbmcgdGhlIENNVmlzaXRvcgotCSAqIHRvIGlkZW50aWZ5IGltbWVkaWF0ZSBjaGlsZHJlbiAoaS5lLiwgdGhlIGNvbnRlbnQgb2YgY2hpbGQgbm9kZXMgaXMgbm90IHZpc2l0ZWQpLgotCSAqIAotCSAqLwotCXByaXZhdGUgY2xhc3MgQ01EZXNjcmliZXIgZXh0ZW5kcyBDTVZpc2l0b3IgaW1wbGVtZW50cyBJV29ya2JlbmNoQWRhcHRlciB7Ci0KLQkJTGlzdCBmQ2hpbGRyZW4gPSBudWxsOwotCQlJbWFnZURlc2NyaXB0b3IgZkltYWdlOwotCQlTdHJpbmcgbGFiZWw7Ci0JCUNNTm9kZSByb290OwotCi0JCXB1YmxpYyBDTURlc2NyaWJlcihDTU5vZGUgbm9kZSkgewotCQkJcm9vdCA9IG5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLQkJCWlmIChmQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWZDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAocm9vdC5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSByb290OwotCQkJCQlDTU5hbWVkTm9kZU1hcCBub2RlTWFwID0gZWQuZ2V0QXR0cmlidXRlcygpOwotCQkJCQlpbnQgc2l6ZSA9IG5vZGVNYXAuZ2V0TGVuZ3RoKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQl7Ci0JCQkJCQl2aXNpdENNTm9kZShub2RlTWFwLml0ZW0oaSkpOwotCQkJCQl9Ci0JCQkJCXZpc2l0Q01Ob2RlKGVkLmdldENvbnRlbnQoKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZDaGlsZHJlbi50b0FycmF5KCk7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gZkltYWdlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0SW1hZ2UoU3RyaW5nIHBhdGgpIHsKLQkJCWZJbWFnZSA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihYTUxVSVBsdWdpbi5JRCwgcGF0aCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgewotCQkJcmV0dXJuIGxhYmVsOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pIHsKLQkJCXJldHVybiByb290OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdmlzaXRDTUdyb3VwKENNR3JvdXAgZSkgeyAKLQkJCWZHcm91cFN0YWNrLnB1c2goZS5nZXRNYXhPY2N1cigpKTsKLQkJCXN1cGVyLnZpc2l0Q01Hcm91cChlKTsKLQkJCWZHcm91cFN0YWNrLnBvcCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdmlzaXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpIHsKLQkJCUNNRGVzY3JpYmVyIGRlc2NyaWJlciA9IG5ldyBDTURlc2NyaWJlcihhZCk7Ci0JCQlkZXNjcmliZXIubGFiZWwgPSBhZC5nZXROb2RlTmFtZSgpOwotCQkJZGVzY3JpYmVyLnNldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVFJJQlVURSk7Ci0JCQlmQ2hpbGRyZW4uYWRkKGRlc2NyaWJlcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKSB7Ci0JCQlDTURlc2NyaWJlciBkZXNjcmliZXIgPSBuZXcgQ01EZXNjcmliZXIoZWQpOwotCi0JCQkvLyBJZiB0aGUgcGFyZW50IGdyb3VwIHN0YWNrIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50IGRlY2xhcmF0aW9uIGlzIHVuYm91bmRlZCwgdGhlIGVsZW1lbnQgd2l0aGluIGlzIHVuYm91bmRlZCBhcyB3ZWxsCi0JCQlkZXNjcmliZXIubGFiZWwgPSBnZXRGb3JtYXR0ZWRMYWJlbChlZC5nZXROb2RlTmFtZSgpLCBlZC5nZXRNaW5PY2N1cigpLCAoIWZHcm91cFN0YWNrLmlzRW1wdHkoKSAmJiBmR3JvdXBTdGFjay5wZWVrKCkgPCAwKSA/IC0xIDogZWQuZ2V0TWF4T2NjdXIoKSwgZWQuZ2V0RGF0YVR5cGUoKSk7Ci0JCQlkZXNjcmliZXIuc2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRUxFTUVOVCk7Ci0JCQlmQ2hpbGRyZW4uYWRkKGRlc2NyaWJlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIHN0YWNrIG9mIGludGVnZXJzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgdW5ib3VuZGVkCi0JICoKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBHcm91cFN0YWNrIHsKLQkJaW50W10gc3RhY2s7Ci0JCWludCBzaXplOwotCi0JCXB1YmxpYyBHcm91cFN0YWNrKCkgewotCQkJc3RhY2sgPSBuZXcgaW50WzVdOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHVzaChpbnQgaSkgewotCQkJaWYgKHNpemUgPj0gc3RhY2subGVuZ3RoKSB7Ci0JCQkJaW50W10gdG1wID0gc3RhY2s7Ci0JCQkJc3RhY2sgPSBuZXcgaW50W3N0YWNrLmxlbmd0aCAqIDJdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkodG1wLCAwLCBzdGFjaywgMCwgdG1wLmxlbmd0aCk7Ci0JCQl9Ci0JCQlzdGFja1tzaXplKytdID0gaTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgcG9wKCkgewotCQkJaWYgKGlzRW1wdHkoKSkKLQkJCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQkJcmV0dXJuIHN0YWNrWy0tc2l6ZV07Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQkJcmV0dXJuIHNpemUgPT0gMDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgcGVlaygpIHsKLQkJCWlmIChpc0VtcHR5KCkpCi0JCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJCXJldHVybiBzdGFja1tzaXplIC0gMV07Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZGFkNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRtb2RlbC9Db250ZW50TW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudE1vZGVsQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIENsYXNzW10gQURBUFRPUkxJU1QgPSBuZXcgQ2xhc3NbXSB7IElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzIH07Ci0JcHJpdmF0ZSBJV29ya2JlbmNoQWRhcHRlciBhZGFwdGVyID0gbmV3IENvbnRlbnRNb2RlbFdvcmtiZW5jaEFkYXB0ZXIoKTsKLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MuZXF1YWxzKGFkYXB0ZXJUeXBlKSkKLQkJCXJldHVybiBhZGFwdGVyOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIEFEQVBUT1JMSVNUOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRtb2RlbC9Db250ZW50TW9kZWxWaWV3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5ZTBlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmlld3MuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLklDb21tYW5kU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5CYXNlV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIAotICoKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRNb2RlbFZpZXcgZXh0ZW5kcyBWaWV3UGFydCBpbXBsZW1lbnRzIElTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JcHJpdmF0ZSBUcmVlVmlld2VyIHR2OwotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1NpdGUgc2l0ZSwgSU1lbWVudG8gbWVtZW50bykgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBtZW1lbnRvKTsKLQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5hZGRQb3N0U2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQb3N0U2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyZWUgdHJlZSA9IG5ldyBUcmVlKHBhcmVudCwgU1dULk5PTkUpOwotCQl0diA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOwotCQl0di5zZXRDb250ZW50UHJvdmlkZXIobmV3IEJhc2VXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXR2LnNldExhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0KLQl9Ci0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQotCQlJRWRpdG9yUGFydCBlZFBhcnQgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQlpZiAocGFydC5lcXVhbHMoZWRQYXJ0KSkgewotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJY3VycmVudFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKQotCQkJCQkJJiYgKGN1cnJlbnRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBFbGVtZW50KSkgewotCQkJCQlpZiAoaXNMaW5rZWRXaXRoRWRpdG9yKCkpIHsKLQkJCQkJCXR2LnNldElucHV0KGN1cnJlbnRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCQl9IAotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTGlua2VkV2l0aEVkaXRvcigpIHsKLQkJSUNvbW1hbmRTZXJ2aWNlIHNlcnZpY2UgPSAoSUNvbW1hbmRTZXJ2aWNlKSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldFNlcnZpY2UoSUNvbW1hbmRTZXJ2aWNlLmNsYXNzKTsKLQkJQ29tbWFuZCBjb21tYW5kID0gc2VydmljZS5nZXRDb21tYW5kKCJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmNtbmQuY29udGVudG1vZGVsLnN5Y2giKTsgLy8kTk9OLU5MUy0xJAotCQlTdGF0ZSBzdGF0ZSA9IGNvbW1hbmQuZ2V0U3RhdGUoIm9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLnRvZ2dsZVN0YXRlIik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gKChCb29sZWFuKSBzdGF0ZS5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50bW9kZWwvQ29udGVudE1vZGVsV29ya2JlbmNoQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRtb2RlbC9Db250ZW50TW9kZWxXb3JrYmVuY2hBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZWMxYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRtb2RlbC9Db250ZW50TW9kZWxXb3JrYmVuY2hBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWNsYXNzIENvbnRlbnRNb2RlbFdvcmtiZW5jaEFkYXB0ZXIgaW1wbGVtZW50cyBJV29ya2JlbmNoQWRhcHRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBFTVBUWSA9IG5ldyBPYmplY3RbMF07Ci0JcHJpdmF0ZSBPYmplY3QgcGFyZW50ID0gbnVsbDsKLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBvOwotCQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gbXEuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24obm9kZSk7Ci0JCQkJQ01MaXN0V29ya2JlbmNoQWRhcHRlciBhZGFwdGVyID0gbmV3IENNTGlzdFdvcmtiZW5jaEFkYXB0ZXIoZGVjbCk7Ci0JCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGFkYXB0ZXIgfTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRU1QVFk7Ci0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0Fic3RyYWN0WE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvdmlld3MvY29udGVudG91dGxpbmUvQWJzdHJhY3RYTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiMmNmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvdmlld3MvY29udGVudG91dGxpbmUvQWJzdHJhY3RYTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Mb2NhbFNlbGVjdGlvblRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5YTUxOb2RlQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRuZC5EcmFnTm9kZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEJhc2ljIE91dGxpbmUgQ29uZmlndXJhdGlvbiBmb3IgZ2VuZXJpYyBYTUwgc3VwcG9ydC4gIEV4cGVjdHMgdGhhdCB0aGUgdmlld2VyJ3MKLSAqIGlucHV0IHdpbGwgYmUgdGhlIERPTSBNb2RlbCwgYW5kIHByb3ZpZGVzIGJhc2ljIGxhYmVsIGFuZCBjb250ZW50IHByb3ZpZGVycy4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gewotCXByaXZhdGUgY2xhc3MgQWN0aW9uTWFuYWdlck1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIsIElSZWxlYXNhYmxlIHsKLQkJcHJpdmF0ZSBYTUxOb2RlQWN0aW9uTWFuYWdlciBmQWN0aW9uTWFuYWdlcjsKLQkJcHJpdmF0ZSBUcmVlVmlld2VyIGZUcmVlVmlld2VyOwotCi0JCXB1YmxpYyBBY3Rpb25NYW5hZ2VyTWVudUxpc3RlbmVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCQlmVHJlZVZpZXdlciA9IHZpZXdlcjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXIjbWVudUFib3V0VG9TaG93KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCWlmIChmQWN0aW9uTWFuYWdlciA9PSBudWxsKSB7Ci0JCQkJZkFjdGlvbk1hbmFnZXIgPSBjcmVhdGVOb2RlQWN0aW9uTWFuYWdlcihmVHJlZVZpZXdlcik7Ci0JCQl9Ci0JCQlpZiAoZkFjdGlvbk1hbmFnZXIgIT0gbnVsbCkgewotCQkJCWZBY3Rpb25NYW5hZ2VyLmZpbGxDb250ZXh0TWVudShtYW5hZ2VyLCBmVHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGUjcmVsZWFzZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkJZlRyZWVWaWV3ZXIgPSBudWxsOwotCQkJaWYgKGZBY3Rpb25NYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlmQWN0aW9uTWFuYWdlci5zZXRNb2RlbChudWxsKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdGF0dXNMaW5lTGFiZWxQcm92aWRlciBleHRlbmRzIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTm9kZSkpIHsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQotCQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgZWxlbWVudDsKLQkJCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCQlzLmluc2VydCgwLCBzdXBlci5nZXRUZXh0KG5vZGUpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotCQkJCQlub2RlID0gKChBdHRyKSBub2RlKS5nZXRPd25lckVsZW1lbnQoKTsKLQkJCQllbHNlCi0JCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQotCQkJCWlmIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCQlzLmluc2VydCgwLCBJUGF0aC5TRVBBUkFUT1IpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgZkNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0KLQlwcml2YXRlIEFjdGlvbk1hbmFnZXJNZW51TGlzdGVuZXIgZkNvbnRleHRNZW51RmlsbGVyID0gbnVsbDsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXIgPSBudWxsOwotCi0JYm9vbGVhbiBmU2hvd0F0dHJpYnV0ZXMgPSBmYWxzZTsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgZlNpbXBsZUxhYmVsUHJvdmlkZXI7Ci0JcHJpdmF0ZSBUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcltdIGZUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnM7Ci0KLQlwcml2YXRlIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyW10gZlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyczsKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIEFic3RyYWN0WE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIE5vZGVBY3Rpb25NYW5hZ2VyIHRvIHVzZSBmb3IgdGhlIGdpdmVuIHRyZWVWaWV3ZXIuCi0JICogPHA+Ci0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHRyZWVWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgbm9kZSBhY3Rpb24gbWFuYWdlciBmb3IgdXNlIHdpdGggdGhpcyB0cmVlIHZpZXdlcgotCSAqLwotCXByb3RlY3RlZCBYTUxOb2RlQWN0aW9uTWFuYWdlciBjcmVhdGVOb2RlQWN0aW9uTWFuYWdlcihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJcmV0dXJuIG5ldyBYTUxOb2RlQWN0aW9uTWFuYWdlcigoSVN0cnVjdHVyZWRNb2RlbCkgdHJlZVZpZXdlci5nZXRJbnB1dCgpLCB0cmVlVmlld2VyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldENvbnRlbnRQcm92aWRlcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmQ29udGVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZDb250ZW50UHJvdmlkZXIgPSBuZXcgSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZDb250ZW50UHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRMYWJlbFByb3ZpZGVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZkxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkxhYmVsUHJvdmlkZXIgPSBuZXcgSkZhY2VOb2RlTGFiZWxQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmTGFiZWxQcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldE1lbnVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIElNZW51TGlzdGVuZXIgZ2V0TWVudUxpc3RlbmVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmQ29udGV4dE1lbnVGaWxsZXIgPT0gbnVsbCkgewotCQkJZkNvbnRleHRNZW51RmlsbGVyID0gbmV3IEFjdGlvbk1hbmFnZXJNZW51TGlzdGVuZXIodmlld2VyKTsKLQkJfQotCQlyZXR1cm4gZkNvbnRleHRNZW51RmlsbGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlpZiAoZlNpbXBsZUxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZlNpbXBsZUxhYmVsUHJvdmlkZXIgPSBuZXcgU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZlNpbXBsZUxhYmVsUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyBUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcltdIGdldFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVycyhmaW5hbCBUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJaWYgKGZUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJZlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVycyA9IG5ldyBUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcltde25ldyBUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcigpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLnNldFNlbGVjdGlvbihudWxsKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCUxvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5zZXRTZWxlY3Rpb24odHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIFRyYW5zZmVyIGdldFRyYW5zZmVyKCkgewotCQkJCQlyZXR1cm4gTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpOwotCQkJCX0KLQkJCX19OwotCQl9Ci0KLQkJcmV0dXJuIGZUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnMob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcltdIGdldFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyhmaW5hbCBUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJaWYgKGZUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJZlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyA9IG5ldyBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcltde25ldyBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZHJhZ0xlYXZlKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCQlldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0JCQkJCWZsb2F0IGZlZWRiYWNrRmxvYXQgPSBnZXRIZWlnaHRJbkl0ZW0oZXZlbnQpOwotCQkJCQlpZiAoZmVlZGJhY2tGbG9hdCA+IDAuNzUpIHsKLQkJCQkJCWV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX0lOU0VSVF9BRlRFUjsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChmZWVkYmFja0Zsb2F0IDwgMC4yNSkgewotCQkJCQkJZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfSU5TRVJUX0JFRk9SRTsKLQkJCQkJfQotCQkJCQlldmVudC5mZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfRVhQQU5EIHwgRE5ELkZFRURCQUNLX1NDUk9MTDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCQlpZiAoZXZlbnQub3BlcmF0aW9ucyAhPSBETkQuRFJPUF9OT05FICYmIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5nZXRTZWxlY3Rpb24oKSAhPSBudWxsICYmICFMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBldmVudC5pdGVtICE9IG51bGwgJiYgZXZlbnQuaXRlbS5nZXREYXRhKCkgIT0gbnVsbCkgewotCQkJCQkJCS8qCi0JCQkJCQkJICogdGhlIGNvbW1hbmQgdXNlcyB0aGVzZSBudW1iZXJzIGluc3RlYWQgb2YgdGhlCi0JCQkJCQkJICogZmVlZGJhY2sgY29uc3RhbnRzIChldmVuIHRob3VnaCBpdCBjb252ZXJ0cyBpbgotCQkJCQkJCSAqIHRoZSBvdGhlciBkaXJlY3Rpb24gYXMgd2VsbCkKLQkJCQkJCQkgKi8KLQkJCQkJCQlmbG9hdCBmZWVkYmFja0Zsb2F0ID0gZ2V0SGVpZ2h0SW5JdGVtKGV2ZW50KTsKLQotCQkJCQkJCWZpbmFsIERyYWdOb2RlQ29tbWFuZCBjb21tYW5kID0gbmV3IERyYWdOb2RlQ29tbWFuZChldmVudC5pdGVtLmdldERhdGEoKSwgZmVlZGJhY2tGbG9hdCwgZXZlbnQub3BlcmF0aW9ucywgZXZlbnQuZGV0YWlsLCBzZWxlY3Rpb24udG9MaXN0KCksIHRyZWVWaWV3ZXIpOwotCQkJCQkJCWlmIChjb21tYW5kICE9IG51bGwgJiYgY29tbWFuZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQkJCQkJU2FmZVJ1bm5hYmxlLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQkJCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyb3BBY2NlcHQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJfQotCi0JCQkJcHJpdmF0ZSBmbG9hdCBnZXRIZWlnaHRJbkl0ZW0oRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChldmVudC5pdGVtID09IG51bGwpCi0JCQkJCQlyZXR1cm4gLjVmOwotCQkJCQlpZiAoZXZlbnQuaXRlbSBpbnN0YW5jZW9mIFRyZWVJdGVtKSB7Ci0JCQkJCQlUcmVlSXRlbSB0cmVlSXRlbSA9IChUcmVlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCQkJCUNvbnRyb2wgY29udHJvbCA9IHRyZWVJdGVtLmdldFBhcmVudCgpOwotCQkJCQkJUG9pbnQgcG9pbnQgPSBjb250cm9sLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygpOwotCQkJCQkJcmV0dXJuIChmbG9hdCkgKHBvaW50LnkgLSBib3VuZHMueSkgLyAoZmxvYXQpIGJvdW5kcy5oZWlnaHQ7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZXZlbnQuaXRlbSBpbnN0YW5jZW9mIFRhYmxlSXRlbSkgewotCQkJCQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IChUYWJsZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJCQlDb250cm9sIGNvbnRyb2wgPSB0YWJsZUl0ZW0uZ2V0UGFyZW50KCk7Ci0JCQkJCQlQb2ludCBwb2ludCA9IGNvbnRyb2wudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQkJCQkJCXJldHVybiAoZmxvYXQpIChwb2ludC55IC0gYm91bmRzLnkpIC8gKGZsb2F0KSBib3VuZHMuaGVpZ2h0OwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmV0dXJuIDAuMEY7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwdWJsaWMgVHJhbnNmZXIgZ2V0VHJhbnNmZXIoKSB7Ci0JCQkJCXJldHVybiBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCQlyZXR1cm4gZ2V0VHJhbnNmZXIoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKTsKLQkJCQl9Ci0JCQl9fTsKLQkJfQotCQlyZXR1cm4gZlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI3VuY29uZmlndXJlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmNvbmZpZ3VyZShUcmVlVmlld2VyIHZpZXdlcikgewotCQlzdXBlci51bmNvbmZpZ3VyZSh2aWV3ZXIpOwotCQlmVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzID0gbnVsbDsKLQkJZlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyA9IG51bGw7Ci0JCWlmIChmQ29udGV4dE1lbnVGaWxsZXIgIT0gbnVsbCkgewotCQkJZkNvbnRleHRNZW51RmlsbGVyLnJlbGVhc2UoKTsKLQkJCWZDb250ZXh0TWVudUZpbGxlciA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvdmlld3MvY29udGVudG91dGxpbmUvWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvdmlld3MvY29udGVudG91dGxpbmUvWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjM2YxNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL1hNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTmFtZWROb2RlTWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIE1vcmUgYWR2YW5jZWQgT3V0bGluZSBDb25maWd1cmF0aW9uIGZvciBYTUwgc3VwcG9ydC4gIEV4cGVjdHMgdGhhdCB0aGUgdmlld2VyJ3MKLSAqIGlucHV0IHdpbGwgYmUgdGhlIERPTSBNb2RlbC4KLSAqIAotICogQHNlZSBBYnN0cmFjdFhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RYTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JRCA9ICJpZCI7Ci0KLQlwcml2YXRlIGNsYXNzIEF0dHJpYnV0ZVNob3dpbmdMYWJlbFByb3ZpZGVyIGV4dGVuZHMgSkZhY2VOb2RlTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG8pIHsKLQkJCVN0cmluZ0J1ZmZlciB0ZXh0ID0gbnVsbDsKLQkJCWlmIChvIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvOwotCQkJCWlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSAmJiBmU2hvd0F0dHJpYnV0ZXMpIHsKLQkJCQkJdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIuZ2V0VGV4dChvKSk7Ci0JCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04ODQ0NAotCQkJCQlpZiAobm9kZS5oYXNBdHRyaWJ1dGVzKCkpIHsKLQkJCQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJCU5vZGUgaWRUeXBlZEF0dHJpYnV0ZSA9IG51bGw7Ci0JCQkJCQlOb2RlIHJlcXVpcmVkQXR0cmlidXRlID0gbnVsbDsKLQkJCQkJCWJvb2xlYW4gaGFzSWQgPSBmYWxzZTsKLQkJCQkJCWJvb2xlYW4gaGFzTmFtZSA9IGZhbHNlOwotCQkJCQkJTm9kZSBzaG93bkF0dHJpYnV0ZSA9IG51bGw7Ci0KLQkJCQkJCS8vIHRyeSB0byBnZXQgY29udGVudCBtb2RlbCBlbGVtZW50Ci0JCQkJCQkvLyBkZWNsYXJhdGlvbgotCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBudWxsOwotCQkJCQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJCQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCQkJCQllbGVtZW50RGVjbCA9IG1xLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQkJLy8gZmluZCBhbiBhdHRyaWJ1dGUgb2YgdHlwZSAob3IganVzdCBuYW1lZCkKLQkJCQkJCS8vIElECi0JCQkJCQlpZiAoZWxlbWVudERlY2wgIT0gbnVsbCkgewotCQkJCQkJCWludCBpID0gMDsKLQkJCQkJCQl3aGlsZSAoKGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpKSAmJiAoaWRUeXBlZEF0dHJpYnV0ZSA9PSBudWxsKSkgewotCQkJCQkJCQlOb2RlIGF0dHIgPSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQkJCQkJCVN0cmluZyBhdHRyTmFtZSA9IGF0dHIuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJCQkJQ01OYW1lZE5vZGVNYXAgYXR0cmlidXRlRGVjbGFyYXRpb25NYXAgPSBlbGVtZW50RGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQkJCQotCQkJCQkJCQlDTU5hbWVkTm9kZU1hcEltcGwgYWxsQXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoYXR0cmlidXRlRGVjbGFyYXRpb25NYXApOwotCQkJCQkJCQlMaXN0IG5vZGVzID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudChlbGVtZW50LCBlbGVtZW50RGVjbCwgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMpOwotCQkJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJCQkJCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgbm9kZXMuZ2V0KGspOwotCQkJCQkJCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQkJCQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWF0dHJpYnV0ZURlY2xhcmF0aW9uTWFwID0gYWxsQXR0cmlidXRlczsKLQotCQkJCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJpYnV0ZURlY2xhcmF0aW9uTWFwLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCQkJCQkJCWlmIChhdHRyRGVjbCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAoKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkgIT0gbnVsbCkgJiYgKENNRGF0YVR5cGUuSUQuZXF1YWxzKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0RGF0YVR5cGVOYW1lKCkpKSkgewotCQkJCQkJCQkJCWlkVHlwZWRBdHRyaWJ1dGUgPSBhdHRyOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoKGF0dHJEZWNsLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgJiYgKHJlcXVpcmVkQXR0cmlidXRlID09IG51bGwpKSB7Ci0JCQkJCQkJCQkJLy8gYXMgYSBiYWNrdXAsIGtlZXAgdGFicyBvbgotCQkJCQkJCQkJCS8vIGFueSByZXF1aXJlZAotCQkJCQkJCQkJCS8vIGF0dHJpYnV0ZXMKLQkJCQkJCQkJCQlyZXF1aXJlZEF0dHJpYnV0ZSA9IGF0dHI7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQloYXNJZCA9IGhhc0lkIHx8IGF0dHJOYW1lLmVxdWFscyhBVFRSX0lEKTsKLQkJCQkJCQkJCQloYXNOYW1lID0gaGFzTmFtZSB8fCBhdHRyTmFtZS5lcXVhbHMoQVRUUl9OQU1FKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQkrK2k7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQkvKgotCQkJCQkJICogSWYgbm8gc3VpdGFibGUgYXR0cmlidXRlIHdhcyBmb3VuZCwgdHJ5IHVzaW5nIGEKLQkJCQkJCSAqIHJlcXVpcmVkIGF0dHJpYnV0ZSwgaWYgbm9uZSwgdGhlbiBwcmVmZXIgImlkIiBvcgotCQkJCQkJICogIm5hbWUiLCBvdGhlcndpc2UganVzdCB1c2UgZmlyc3QgYXR0cmlidXRlCi0JCQkJCQkgKi8KLQkJCQkJCWlmIChpZFR5cGVkQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQkJCQlzaG93bkF0dHJpYnV0ZSA9IGlkVHlwZWRBdHRyaWJ1dGU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChyZXF1aXJlZEF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJCQkJc2hvd25BdHRyaWJ1dGUgPSByZXF1aXJlZEF0dHJpYnV0ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGhhc0lkKSB7Ci0JCQkJCQkJc2hvd25BdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShBVFRSX0lEKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGhhc05hbWUpIHsKLQkJCQkJCQlzaG93bkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKEFUVFJfTkFNRSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoc2hvd25BdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJCQkJCXNob3duQXR0cmlidXRlID0gYXR0cmlidXRlcy5pdGVtKDApOwotCQkJCQkJfQotCi0JCQkJCQkvLyBkaXNwbGF5IHRoZSBhdHRyaWJ1dGUgYW5kIHZhbHVlICh3aXRob3V0IHF1b3RlcykKLQkJCQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gc2hvd25BdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJCWlmICgoYXR0cmlidXRlTmFtZSAhPSBudWxsKSAmJiAoYXR0cmlidXRlTmFtZS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJCQkJdGV4dC5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXRleHQuYXBwZW5kKGF0dHJpYnV0ZU5hbWUpOwotCQkJCQkJCVN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IHNob3duQXR0cmlidXRlLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJCWlmICgoYXR0cmlidXRlVmFsdWUgIT0gbnVsbCkgJiYgKGF0dHJpYnV0ZVZhbHVlLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCQkJdGV4dC5hcHBlbmQoIj0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl0ZXh0LmFwcGVuZChTdHJpbmdVdGlscy5zdHJpcChhdHRyaWJ1dGVWYWx1ZSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIuZ2V0VGV4dChvKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGV4dC50b1N0cmluZygpOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbExhYmVsUHJvdmlkZXIjZ2V0VG9vbFRpcFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTm9kZSkgewotCQkJCXN3aXRjaCAoKChOb2RlKSBlbGVtZW50KS5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLQkJCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0JCQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJCQlTdHJpbmcgbm9kZVZhbHVlID0gKChOb2RlKSBlbGVtZW50KS5nZXROb2RlVmFsdWUoKS50cmltKCk7Ci0JCQkJCQlyZXR1cm4gcHJlcGFyZVRleHQobm9kZVZhbHVlKTsKLQkJCQkJfQotCQkJCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCQkJLy8gc2hvdyB0aGUgcHJlY2VkaW5nIGNvbW1lbnQncyB0b29sdGlwIGluZm9ybWF0aW9uCi0JCQkJCQlOb2RlIHByZXZpb3VzID0gKChOb2RlKSBlbGVtZW50KS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCQkJCWlmIChwcmV2aW91cyAhPSBudWxsICYmIHByZXZpb3VzLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQkJcHJldmlvdXMgPSBwcmV2aW91cy5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCQkJCWlmIChwcmV2aW91cyAhPSBudWxsICYmIHByZXZpb3VzLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpCi0JCQkJCQkJcmV0dXJuIGdldFRvb2xUaXBUZXh0KHByZXZpb3VzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRUb29sVGlwVGV4dChlbGVtZW50KTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZW1vdmUgbGVhZGluZyBpbmRlbnRhdGlvbiBmcm9tIGVhY2ggbGluZSBpbiB0aGUgZ2l2ZSBzdHJpbmcuCi0JCSAqIEBwYXJhbSB0ZXh0Ci0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIHByZXBhcmVUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCQlTdHJpbmdCdWZmZXIgbm9kZVRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgewotCQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KGkpOwotCQkJCWlmIChjICE9ICdccicgJiYgYyAhPSAnXG4nKSB7Ci0JCQkJCW5vZGVUZXh0LmFwcGVuZChjKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykgewotCQkJCQlub2RlVGV4dC5hcHBlbmQoJ1xuJyk7Ci0JCQkJCXdoaWxlIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpICYmIGkgPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljID0gdGV4dC5jaGFyQXQoaSk7Ci0JCQkJCX0KLQkJCQkJbm9kZVRleHQuYXBwZW5kKGMpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBub2RlVGV4dC50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVG9nZ2xlIGFjdGlvbiBmb3Igd2hldGhlciBvciBub3QgdG8gZGlzcGxheSBlbGVtZW50J3MgZmlyc3QgYXR0cmlidXRlCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUb2dnbGVTaG93QXR0cmlidXRlQWN0aW9uIGV4dGVuZHMgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb24gewotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg0NDQKLQkJcHJpdmF0ZSBUcmVlVmlld2VyIGZUcmVlVmlld2VyOwotCi0JCXB1YmxpYyBUb2dnbGVTaG93QXR0cmlidXRlQWN0aW9uKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBwcmVmZXJlbmNlLCBUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJCXN1cGVyKFhNTFVJTWVzc2FnZXMuWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uXzAsIHN0b3JlLCBwcmVmZXJlbmNlLCB0cnVlKTsKLQkJCXNldFRvb2xUaXBUZXh0KGdldFRleHQoKSk7Ci0JCQkvLyBpbWFnZXMgbmVlZGVkCi0JCQkvLyBzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihTWU5DRURfRCk7Ci0JCQkvLyAobnNkKSB0ZW1wb3JhcmlseSByZS11c2UgUHJvcGVydGllcyB2aWV3IGltYWdlCi0JCQlzZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUFJPUF9QUykpOwotCQkJZlRyZWVWaWV3ZXIgPSB0cmVlVmlld2VyOwotCQkJdXBkYXRlKCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZSN1cGRhdGUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQkJc3VwZXIudXBkYXRlKCk7Ci0JCQlmU2hvd0F0dHJpYnV0ZXMgPSBpc0NoZWNrZWQoKTsKLQotCQkJLy8gbm90aWZ5IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBjaGFuZ2UKLQkJCWVuYWJsZVNob3dBdHRyaWJ1dGVzKGZTaG93QXR0cmlidXRlcywgZlRyZWVWaWV3ZXIpOwotCi0JCQkvLyByZWZyZXNoIHRoZSBvdXRsaW5lIHZpZXcKLQkJCWZUcmVlVmlld2VyLnJlZnJlc2godHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBmQXR0cmlidXRlU2hvd2luZ0xhYmVsUHJvdmlkZXI7Ci0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGZDb250ZW50UHJvdmlkZXIgPSBudWxsOwotCi0JYm9vbGVhbiBmU2hvd0F0dHJpYnV0ZXMgPSBmYWxzZTsKLQotCS8qCi0JICogUHJlZmVyZW5jZSBrZXkgZm9yIFNob3cgQXR0cmlidXRlcwotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9VVExJTkVfU0hPV19BVFRSSUJVVEVfUFJFRiA9ICJvdXRsaW5lLXNob3ctYXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBYTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCi0JCS8qKgotCQkgKiBTZXQgdXAgb3VyIHByZWZlcmVuY2Ugc3RvcmUgaGVyZS4gVGhpcyBpcyBkb25lIHNvIHRoYXQgc3ViY2xhc3NlcwotCQkgKiBhcmVuJ3QgcmVxdWlyZWQgdG8gc2V0IHRoZWlyIG93biB2YWx1ZXMsIGFsdGhvdWdoIGlmIHRoZXkgaGF2ZSwKLQkJICogdGhvc2Ugd2lsbCBiZSB1c2VkIGluc3RlYWQuCi0JCSAqLwotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWlmIChzdG9yZS5nZXREZWZhdWx0U3RyaW5nKFhNTFVJUHJlZmVyZW5jZU5hbWVzLk9VVExJTkVfQkVIQVZJT1IuRE9DVU1FTlRfTk9ERSkubGVuZ3RoKCkgPT0gMCkKLQkJCXN0b3JlLnNldERlZmF1bHQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuT1VUTElORV9CRUhBVklPUi5ET0NVTUVOVF9OT0RFLCAiMSwgdHJ1ZSIpOwotCQlpZiAoc3RvcmUuZ2V0RGVmYXVsdFN0cmluZyhYTUxVSVByZWZlcmVuY2VOYW1lcy5PVVRMSU5FX0JFSEFWSU9SLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkubGVuZ3RoKCkgPT0gMCkKLQkJCXN0b3JlLnNldERlZmF1bHQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuT1VUTElORV9CRUhBVklPUi5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUsICIyLCB0cnVlIik7Ci0JCWlmIChzdG9yZS5nZXREZWZhdWx0U3RyaW5nKFhNTFVJUHJlZmVyZW5jZU5hbWVzLk9VVExJTkVfQkVIQVZJT1IuRE9DVU1FTlRfVFlQRV9OT0RFKS5sZW5ndGgoKSA9PSAwKQotCQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5PVVRMSU5FX0JFSEFWSU9SLkRPQ1VNRU5UX1RZUEVfTk9ERSwgIjMsIHRydWUiKTsKLQkJaWYgKHN0b3JlLmdldERlZmF1bHRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuT1VUTElORV9CRUhBVklPUi5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKS5sZW5ndGgoKSA9PSAwKQotCQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5PVVRMSU5FX0JFSEFWSU9SLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUsICI0LCB0cnVlIik7Ci0JCWlmIChzdG9yZS5nZXREZWZhdWx0U3RyaW5nKFhNTFVJUHJlZmVyZW5jZU5hbWVzLk9VVExJTkVfQkVIQVZJT1IuQ09NTUVOVF9OT0RFKS5sZW5ndGgoKSA9PSAwKQotCQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5PVVRMSU5FX0JFSEFWSU9SLkNPTU1FTlRfTk9ERSwgIjUsIHRydWUiKTsKLQkJaWYgKHN0b3JlLmdldERlZmF1bHRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuT1VUTElORV9CRUhBVklPUi5BVFRSSUJVVEVfTk9ERSkubGVuZ3RoKCkgPT0gMCkKLQkJCXN0b3JlLnNldERlZmF1bHQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuT1VUTElORV9CRUhBVklPUi5BVFRSSUJVVEVfTk9ERSwgIjYsIGZhbHNlIik7Ci0JCWlmIChzdG9yZS5nZXREZWZhdWx0U3RyaW5nKFhNTFVJUHJlZmVyZW5jZU5hbWVzLk9VVExJTkVfQkVIQVZJT1IuRUxFTUVOVF9OT0RFKS5sZW5ndGgoKSA9PSAwKQotCQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5PVVRMSU5FX0JFSEFWSU9SLkVMRU1FTlRfTk9ERSwgIjcsIHRydWUiKTsKLQkJaWYgKHN0b3JlLmdldERlZmF1bHRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuT1VUTElORV9CRUhBVklPUi5FTlRJVFlfUkVGRVJFTkNFX05PREUpLmxlbmd0aCgpID09IDApCi0JCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLk9VVExJTkVfQkVIQVZJT1IuRU5USVRZX1JFRkVSRU5DRV9OT0RFLCAiOCwgdHJ1ZSIpOwotCQlpZiAoc3RvcmUuZ2V0RGVmYXVsdFN0cmluZyhYTUxVSVByZWZlcmVuY2VOYW1lcy5PVVRMSU5FX0JFSEFWSU9SLkNEQVRBX1NFQ1RJT05fTk9ERSkubGVuZ3RoKCkgPT0gMCkKLQkJCXN0b3JlLnNldERlZmF1bHQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuT1VUTElORV9CRUhBVklPUi5DREFUQV9TRUNUSU9OX05PREUsICI5LCB0cnVlIik7Ci0JCWlmIChzdG9yZS5nZXREZWZhdWx0U3RyaW5nKFhNTFVJUHJlZmVyZW5jZU5hbWVzLk9VVExJTkVfQkVIQVZJT1IuRU5USVRZX05PREUpLmxlbmd0aCgpID09IDApCi0JCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLk9VVExJTkVfQkVIQVZJT1IuRU5USVRZX05PREUsICIxMCwgdHJ1ZSIpOwotCQlpZiAoc3RvcmUuZ2V0RGVmYXVsdFN0cmluZyhYTUxVSVByZWZlcmVuY2VOYW1lcy5PVVRMSU5FX0JFSEFWSU9SLk5PVEFUSU9OX05PREUpLmxlbmd0aCgpID09IDApCi0JCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLk9VVExJTkVfQkVIQVZJT1IuTk9UQVRJT05fTk9ERSwgIjExLCB0cnVlIik7Ci0JCWlmIChzdG9yZS5nZXREZWZhdWx0U3RyaW5nKFhNTFVJUHJlZmVyZW5jZU5hbWVzLk9VVExJTkVfQkVIQVZJT1IuVEVYVF9OT0RFKS5sZW5ndGgoKSA9PSAwKQotCQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5PVVRMSU5FX0JFSEFWSU9SLlRFWFRfTk9ERSwgIjEyLCBmYWxzZSIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jY3JlYXRlTWVudUNvbnRyaWJ1dGlvbnMob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXByb3RlY3RlZCBJQ29udHJpYnV0aW9uSXRlbVtdIGNyZWF0ZU1lbnVDb250cmlidXRpb25zKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCUlDb250cmlidXRpb25JdGVtW10gaXRlbXM7Ci0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04ODQ0NAotCQlJQ29udHJpYnV0aW9uSXRlbSBzaG93QXR0cmlidXRlSXRlbSA9IG5ldyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0obmV3IFRvZ2dsZVNob3dBdHRyaWJ1dGVBY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCksIE9VVExJTkVfU0hPV19BVFRSSUJVVEVfUFJFRiwgdmlld2VyKSk7Ci0KLQkJaXRlbXMgPSBzdXBlci5jcmVhdGVNZW51Q29udHJpYnV0aW9ucyh2aWV3ZXIpOwotCQlpZiAoaXRlbXMgPT0gbnVsbCkgewotCQkJaXRlbXMgPSBuZXcgSUNvbnRyaWJ1dGlvbkl0ZW1bXXtzaG93QXR0cmlidXRlSXRlbX07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJQ29udHJpYnV0aW9uSXRlbVtdIGNvbWJpbmVkSXRlbXMgPSBuZXcgSUNvbnRyaWJ1dGlvbkl0ZW1baXRlbXMubGVuZ3RoICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGl0ZW1zLCAwLCBjb21iaW5lZEl0ZW1zLCAwLCBpdGVtcy5sZW5ndGgpOwotCQkJY29tYmluZWRJdGVtc1tpdGVtcy5sZW5ndGhdID0gc2hvd0F0dHJpYnV0ZUl0ZW07Ci0JCQlpdGVtcyA9IGNvbWJpbmVkSXRlbXM7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgY29uZmlndXJhdGlvbiB0aGF0IHRoZSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90Ci0JICogdG8gc2hvdyBhdHRyaWJ1dGUgdmFsdWVzIGluIHRoZSB0cmVlIHZpZXdlciBoYXMgY2hhbmdlZC4gVGhlIHRyZWUKLQkgKiB2aWV3ZXIgaXMgYXV0b21hdGljYWxseSByZWZyZXNoZWQgYWZ0ZXJ3YXJkcyB0byB1cGRhdGUgdGhlIGxhYmVscy4KLQkgKiAKLQkgKiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZCwgYnV0IHJhdGhlciBzaG91bGQgcmVhY3QgdG8gaXQuCi0JICogCi0JICogQHBhcmFtIHNob3dBdHRyaWJ1dGVzCi0JICogICAgICAgICAgICBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdG8gc2hvdyBhdHRyaWJ1dGUgdmFsdWVzIGluCi0JICogICAgICAgICAgICB0aGUgdHJlZSB2aWV3ZXIKLQkgKiBAcGFyYW0gdHJlZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVNob3dBdHRyaWJ1dGVzKGJvb2xlYW4gc2hvd0F0dHJpYnV0ZXMsIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQkvLyBub3RoaW5nIGJ5IGRlZmF1bHQKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRDb250ZW50UHJvdmlkZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyBJQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZkNvbnRlbnRQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmQ29udGVudFByb3ZpZGVyID0gbmV3IEpGYWNlTm9kZUNvbnRlbnRQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmQ29udGVudFByb3ZpZGVyOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldEZpbHRlcmVkTm9kZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQkvLyByZXBsYWNlIGF0dHJpYnV0ZSBub2RlIGluIHNlbGVjdGlvbiB3aXRoIGl0cyBwYXJlbnQKLQkJCWlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJbm9kZSA9ICgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQl9Ci0JCQkvLyBhbnl0aGluZyBlbHNlIG5vdCB2aXNpYmxlLCByZXBsYWNlIHdpdGggcGFyZW50IG5vZGUKLQkJCWVsc2UgaWYgKG5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGdldEZpbHRlcmVkTm9kZXMoT2JqZWN0W10gZmlsdGVyZWROb2RlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcmVkTm9kZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbHRlcmVkTm9kZXNbaV0gPSBnZXRGaWx0ZXJlZE5vZGUoZmlsdGVyZWROb2Rlc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlcmVkTm9kZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRMYWJlbFByb3ZpZGVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZkF0dHJpYnV0ZVNob3dpbmdMYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZBdHRyaWJ1dGVTaG93aW5nTGFiZWxQcm92aWRlciA9IG5ldyBBdHRyaWJ1dGVTaG93aW5nTGFiZWxQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmQXR0cmlidXRlU2hvd2luZ0xhYmVsUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbihUcmVlVmlld2VyIHZpZXdlciwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVNlbGVjdGlvbiBmaWx0ZXJlZFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3RbXSBmaWx0ZXJlZE5vZGVzID0gZ2V0RmlsdGVyZWROb2RlcygoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKSk7Ci0JCQlmaWx0ZXJlZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbHRlcmVkTm9kZXMpOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJlZFNlbGVjdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvdmlld3MvcHJvcGVydGllcy9YTUxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL3ZpZXdzL3Byb3BlcnRpZXMvWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmM2E0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvdmlld3MvcHJvcGVydGllcy9YTUxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3BlcnRpZXMuWE1MUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQ29uZmlndXJhdGlvbiBmb3IgcHJvcGVydHkgc2hlZXQgcGFnZSB3aGljaCBzaG93cyBYTUwgY29udGVudC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIGV4dGVuZHMgUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gewotCXByaXZhdGUgY2xhc3MgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lckltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgY2FjaGVDbGVhcmVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSkgewotCQkJLy8gbm90aGluZyB0byBkbwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2FjaGVVcGRhdGVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgZmluYWwgU3RyaW5nIHVyaSwgaW50IG9sZFN0YXR1cywgaW50IG5ld1N0YXR1cywgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCQlpZiAoKG5ld1N0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0xPQURFRCkgfHwgKG5ld1N0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0VSUk9SKSkgewotCQkJCXJlZnJlc2hQYWdlcygpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKENNRG9jdW1lbnRNYW5hZ2VyIGNtRG9jdW1lbnRNYW5hZ2VyLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlpZiAoY21Eb2N1bWVudE1hbmFnZXIuZ2V0UHJvcGVydHlFbmFibGVkKENNRG9jdW1lbnRNYW5hZ2VyLlBST1BFUlRZX0FVVE9fTE9BRCkpIHsKLQkJCQlyZWZyZXNoUGFnZXMoKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCByZWZyZXNoUGFnZXMoKSB7Ci0JCQlnZXRQcm9wZXJ0aWVzUmVmcmVzaEpvYigpLmFkZFByb3BlcnR5U2hlZXRQYWdlKGZQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCQlnZXRQcm9wZXJ0aWVzUmVmcmVzaEpvYigpLnNjaGVkdWxlKFByb3BlcnRpZXNSZWZyZXNoSm9iLlVQREFURV9ERUxBWSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFByb3BlcnRpZXNSZWZyZXNoSm9iIGV4dGVuZHMgVUlKb2IgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUERBVEVfREVMQVkgPSAyMDA7Ci0KLQkJU2V0IHByb3BlcnR5U2hlZXRQYWdlcyA9IG51bGw7Ci0KLQkJcHVibGljIFByb3BlcnRpZXNSZWZyZXNoSm9iKCkgewotCQkJc3VwZXIoWE1MVUlNZXNzYWdlcy5KRmFjZU5vZGVBZGFwdGVyXzEpOwotCQkJc2V0U3lzdGVtKHRydWUpOwotCQkJc2V0UHJpb3JpdHkoSm9iLlNIT1JUKTsKLQkJCXByb3BlcnR5U2hlZXRQYWdlcyA9IG5ldyBIYXNoU2V0KDEpOwotCQl9Ci0KLQkJdm9pZCBhZGRQcm9wZXJ0eVNoZWV0UGFnZShJUHJvcGVydHlTaGVldFBhZ2UgcGFnZSkgewotCQkJaWYgKHBhZ2UgIT0gbnVsbCAmJiBwcm9wZXJ0eVNoZWV0UGFnZXMgIT0gbnVsbCkgewotCQkJCXByb3BlcnR5U2hlZXRQYWdlcy5hZGQocGFnZSk7Ci0JCQkJc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQkJCX0KLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNjYW5jZWxpbmcoKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgY2FuY2VsaW5nKCkgewotCQkJcHJvcGVydHlTaGVldFBhZ2VzLmNsZWFyKCk7Ci0JCQlzdXBlci5jYW5jZWxpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlPYmplY3RbXSBwYWdlcyA9IHByb3BlcnR5U2hlZXRQYWdlcy50b0FycmF5KCk7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZXMuY2xlYXIoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UgPSAoUHJvcGVydHlTaGVldFBhZ2UpIHBhZ2VzW2ldOwotCQkJCWlmICgocGFnZSAhPSBudWxsKSAmJiAocGFnZS5nZXRDb250cm9sKCkgIT0gbnVsbCkgJiYgIXBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQlwYWdlLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBYTUxQcm9wZXJ0eVNoZWV0UmVmcmVzaEFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIgewotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJCWlmIChmUHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCkgewotCQkJCWdldFByb3BlcnRpZXNSZWZyZXNoSm9iKCkuYWRkUHJvcGVydHlTaGVldFBhZ2UoZlByb3BlcnR5U2hlZXRQYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgWE1MUHJvcGVydHlTb3VyY2VQcm92aWRlciBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBJUHJvcGVydHlTb3VyY2UgZlByb3BlcnR5U291cmNlID0gbnVsbDsKLQkJcHJpdmF0ZSBJTm9kZU5vdGlmaWVyIGZTb3VyY2UgPSBudWxsOwotCi0JCXB1YmxpYyBJUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKChmU291cmNlICE9IG51bGwpICYmIG9iamVjdC5lcXVhbHMoZlNvdXJjZSkpIHsKLQkJCQlyZXR1cm4gZlByb3BlcnR5U291cmNlOwotCQkJfQotCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQlmU291cmNlID0gKElOb2RlTm90aWZpZXIpIG9iamVjdDsKLQkJCQlmUHJvcGVydHlTb3VyY2UgPSAoSVByb3BlcnR5U291cmNlKSBmU291cmNlLmdldEFkYXB0ZXJGb3IoSVByb3BlcnR5U291cmNlLmNsYXNzKTsKLQkJCQlpZiAoZlByb3BlcnR5U291cmNlID09IG51bGwpIHsKLQkJCQkJZlByb3BlcnR5U291cmNlID0gbmV3IFhNTFByb3BlcnR5U291cmNlKChJTm9kZU5vdGlmaWVyKSBvYmplY3QpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG5hbWVPYmplY3QsIE9iamVjdCB2YWx1ZSkgewotCQkJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTg5NzkKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZTZWxlY3RlZE5vdGlmaWVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlmU2VsZWN0ZWROb3RpZmllcnNbaV0ucmVtb3ZlQWRhcHRlcihmUmVmcmVzaEFkYXB0ZXIpOwotCQkJCQkJCX0KLQkJCQkJCQlzdXBlci5zZXRQcm9wZXJ0eVZhbHVlKG5hbWVPYmplY3QsIHZhbHVlKTsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZTZWxlY3RlZE5vdGlmaWVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlmU2VsZWN0ZWROb3RpZmllcnNbaV0uYWRkQWRhcHRlcihmUmVmcmVzaEFkYXB0ZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmU291cmNlID0gbnVsbDsKLQkJCQlmUHJvcGVydHlTb3VyY2UgPSBudWxsOwotCQkJfQotCQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lckltcGwgZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgPSBuZXcgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lckltcGwoKTsKLQlwcml2YXRlIFByb3BlcnRpZXNSZWZyZXNoSm9iIGZQcm9wZXJ0aWVzUmVmcmVzaEpvYiA9IG51bGw7Ci0JSVByb3BlcnR5U2hlZXRQYWdlIGZQcm9wZXJ0eVNoZWV0UGFnZSA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvcGVydHlTb3VyY2VQcm92aWRlciBmUHJvcGVydHlTb3VyY2VQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJTm9kZUFkYXB0ZXIgZlJlZnJlc2hBZGFwdGVyID0gbmV3IFhNTFByb3BlcnR5U2hlZXRSZWZyZXNoQWRhcHRlcigpOwotCXByaXZhdGUgQ01Eb2N1bWVudE1hbmFnZXJbXSBmU2VsZWN0ZWRDTURvY3VtZW50TWFuYWdlcnMgPSBuZXcgQ01Eb2N1bWVudE1hbmFnZXJbMF07Ci0JcHJpdmF0ZSBJTm9kZU5vdGlmaWVyW10gZlNlbGVjdGVkTm90aWZpZXJzID0gbmV3IElOb2RlTm90aWZpZXJbMF07Ci0KLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0SW5wdXRTZWxlY3Rpb24oSVdvcmtiZW5jaFBhcnQgc2VsZWN0aW5nUGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGZTZWxlY3RlZE5vdGlmaWVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZTZWxlY3RlZE5vdGlmaWVycy5sZW5ndGg7IGkrKykgewotCQkJCWZTZWxlY3RlZE5vdGlmaWVyc1tpXS5yZW1vdmVBZGFwdGVyKGZSZWZyZXNoQWRhcHRlcik7Ci0JCQl9Ci0JCQlmU2VsZWN0ZWROb3RpZmllcnMgPSBudWxsOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlNlbGVjdGVkQ01Eb2N1bWVudE1hbmFnZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmU2VsZWN0ZWRDTURvY3VtZW50TWFuYWdlcnNbaV0ucmVtb3ZlTGlzdGVuZXIoZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIpOwotCQl9Ci0KLQkJSVNlbGVjdGlvbiBwcmVmZXJyZWRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCi0JCQkvKgotCQkJICogT24gQXR0ciBub2Rlcywgc2VsZWN0IHRoZSBvd25lciBFbGVtZW50LiBPbiBUZXh0IG5vZGVzLCBzZWxlY3QKLQkJCSAqIHRoZSBwYXJlbnQgRWxlbWVudC4KLQkJCSAqLwotCQkJT2JqZWN0W10gc2VsZWN0ZWRPYmplY3RzID0gbmV3IE9iamVjdFtzdHJ1Y3R1cmVkU2VsLnNpemUoKV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cnVjdHVyZWRTZWwudG9BcnJheSgpLCAwLCBzZWxlY3RlZE9iamVjdHMsIDAsIHNlbGVjdGVkT2JqZWN0cy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3QgaW5vZGUgPSBzZWxlY3RlZE9iamVjdHNbaV07Ci0JCQkJaWYgKGlub2RlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaW5vZGU7Ci0JCQkJCS8vIHJlcGxhY2UgQXR0cmlidXRlIE5vZGUgd2l0aCBpdHMgb3duZXIKLQkJCQkJTm9kZSBwYXJlbnROb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCQkJRWxlbWVudCBvd25lckVsZW1lbnQgPSAoKEF0dHIpIG5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCQkJCQkJc2VsZWN0ZWRPYmplY3RzW2ldID0gb3duZXJFbGVtZW50OwotCQkJCQl9Ci0JCQkJCS8vIHJlcGxhY2UgVGV4dCBOb2RlIHdpdGggaXRzIHBhcmVudAotCQkJCQllbHNlIGlmICgoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgfHwgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSkpICYmIChwYXJlbnROb2RlICE9IG51bGwpKSB7Ci0JCQkJCQlzZWxlY3RlZE9iamVjdHNbaV0gPSBwYXJlbnROb2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCA+IDApIHsKLQkJCQlTZXQgbWFuYWdlcnMgPSBuZXcgSGFzaFNldCgxKTsKLQkJCQlTZXQgc2VsZWN0ZWROb3RpZmllcnMgPSBuZXcgSGFzaFNldCgxKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChzZWxlY3RlZE9iamVjdHNbaV0gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlNb2RlbFF1ZXJ5IHF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoKE5vZGUpIHNlbGVjdGVkT2JqZWN0c1tpXSkuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCQkJCWlmIChxdWVyeSAhPSBudWxsKSB7Ci0JCQkJCQkJQ01Eb2N1bWVudE1hbmFnZXIgbWdyID0gcXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKTsKLQkJCQkJCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCQkJCQkJbWFuYWdlcnMuYWRkKG1ncik7Ci0JCQkJCQkJCW1nci5hZGRMaXN0ZW5lcihmQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIEFkZCBVSSByZWZyZXNoIGFkYXB0ZXJzIGFuZCByZW1lbWJlciBub3RpZmllcnMgZm9yCi0JCQkJCSAqIGxhdGVyIHJlbW92YWwKLQkJCQkJICovCi0JCQkJCWlmIChzZWxlY3RlZE9iamVjdHNbaV0gaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkJCQlzZWxlY3RlZE5vdGlmaWVycy5hZGQoc2VsZWN0ZWRPYmplY3RzW2ldKTsKLQkJCQkJCSgoSU5vZGVOb3RpZmllcikgc2VsZWN0ZWRPYmplY3RzW2ldKS5hZGRBZGFwdGVyKGZSZWZyZXNoQWRhcHRlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZlNlbGVjdGVkQ01Eb2N1bWVudE1hbmFnZXJzID0gKENNRG9jdW1lbnRNYW5hZ2VyW10pIG1hbmFnZXJzLnRvQXJyYXkobmV3IENNRG9jdW1lbnRNYW5hZ2VyW21hbmFnZXJzLnNpemUoKV0pOwotCQkJCWZTZWxlY3RlZE5vdGlmaWVycyA9IChJTm9kZU5vdGlmaWVyW10pIHNlbGVjdGVkTm90aWZpZXJzLnRvQXJyYXkobmV3IElOb2RlTm90aWZpZXJbc2VsZWN0ZWROb3RpZmllcnMuc2l6ZSgpXSk7Ci0JCQl9Ci0KLQotCQkJcHJlZmVycmVkU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWRPYmplY3RzKTsKLQkJfQotCQlyZXR1cm4gcHJlZmVycmVkU2VsZWN0aW9uOwotCX0KLQotCVByb3BlcnRpZXNSZWZyZXNoSm9iIGdldFByb3BlcnRpZXNSZWZyZXNoSm9iKCkgewotCQlpZiAoZlByb3BlcnRpZXNSZWZyZXNoSm9iID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0aWVzUmVmcmVzaEpvYiA9IG5ldyBQcm9wZXJ0aWVzUmVmcmVzaEpvYigpOwotCQl9Ci0JCXJldHVybiBmUHJvcGVydGllc1JlZnJlc2hKb2I7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGdldFByb3BlcnR5U291cmNlUHJvdmlkZXIoSVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJaWYgKGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0eVNoZWV0UGFnZSA9IHBhZ2U7Ci0JCQlmUHJvcGVydHlTb3VyY2VQcm92aWRlciA9IG5ldyBYTUxQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotCX0KLQotCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmUoKSB7Ci0JCXN1cGVyLnVuY29uZmlndXJlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlNlbGVjdGVkQ01Eb2N1bWVudE1hbmFnZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmU2VsZWN0ZWRDTURvY3VtZW50TWFuYWdlcnNbaV0ucmVtb3ZlTGlzdGVuZXIoZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIpOwotCQl9Ci0JCWlmKGZQcm9wZXJ0aWVzUmVmcmVzaEpvYiAhPSBudWxsKSB7Ci0JCQlmUHJvcGVydGllc1JlZnJlc2hKb2IuY2FuY2VsKCk7Ci0JCQlmUHJvcGVydGllc1JlZnJlc2hKb2IucHJvcGVydHlTaGVldFBhZ2VzID0gbnVsbDsKLQkJfQotCQlmUHJvcGVydHlTaGVldFBhZ2UgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS90ZW1wbGF0ZXMveG1sZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS90ZW1wbGF0ZXMveG1sZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1MTc3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvdGVtcGxhdGVzL3htbGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVGVtcGxhdGVzLmNvbW1lbnQubmFtZT1jb21tZW50Ci1UZW1wbGF0ZXMuY29tbWVudC5kZXNjPXhtbCBjb21tZW50Ci1UZW1wbGF0ZXMueG1sZGVjbGFyYXRpb24ubmFtZT14bWwgZGVjbGFyYXRpb24KLVRlbXBsYXRlcy54bWxkZWNsYXJhdGlvbi5kZXNjPXhtbCBkZWNsYXJhdGlvbgotVGVtcGxhdGVzLnhzbHBpLm5hbWU9WFNMIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KLVRlbXBsYXRlcy54c2xwaS5kZXNjPVhTTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uCi1UZW1wbGF0ZXMueHNpbnNwLm5hbWU9eHNpbnNwCi1UZW1wbGF0ZXMueHNpbnNwLmRlc2M9WE1MIFNjaGVtYSBuYW1lIHNwYWNlCi1UZW1wbGF0ZXMuc2NoZW1hTG9jLm5hbWU9c2NoZW1hTG9jCi1UZW1wbGF0ZXMuc2NoZW1hTG9jLmRlc2M9WE1MIFNjaGVtYSBsb2NhdGlvbiBhdHRyaWJ1dGUKLVRlbXBsYXRlcy5ub3NjaGVtYUxvYy5uYW1lPW5vc2NoZW1hTG9jCi1UZW1wbGF0ZXMubm9zY2hlbWFMb2MuZGVzYz1ObyBOYW1lc3BhY2UgU2NoZW1hIExvY2F0aW9uCi1UZW1wbGF0ZXMuZGVmYXVsdG5zcC5uYW1lPWRlZmF1bHQgbmFtZXNwYWNlCi1UZW1wbGF0ZXMuZGVmYXVsdG5zcC5kZXNjPURlZmF1bHQgTmFtZXNwYWNlIEF0dHJpYnV0ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3RlbXBsYXRlcy94bWxkZWZhdWx0LXRlbXBsYXRlcy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvdGVtcGxhdGVzL3htbGRlZmF1bHQtdGVtcGxhdGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhZDQ5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvdGVtcGxhdGVzL3htbGRlZmF1bHQtdGVtcGxhdGVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAtIGFkZGVkIHRlbXBsYXRlcyBmb3IgeHNpIG5hbWVzcGFjZSwgc2NoZW1hTG9jYXRpb24sIGFuZAotICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgbmFtZXNwYWNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAtLT4KLTx0ZW1wbGF0ZXM+Ci0gIDx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy54bWxkZWNsYXJhdGlvbiIgY29udGV4dD0ieG1sX25ldyIgZW5hYmxlZD0idHJ1ZSI+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJHtlbmNvZGluZ30iPyZndDs8L3RlbXBsYXRlPgotICA8dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5jb21tZW50Lm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmNvbW1lbnQuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLmNvbW1lbnQiIGNvbnRleHQ9InhtbF90YWciIGVuYWJsZWQ9InRydWUiPiZsdDshLS0gJHtjdXJzb3J9IC0tJmd0OzwvdGVtcGxhdGU+Ci0gIDx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnhzbHBpLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnhzbHBpLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy54c2xwaSIgY29udGV4dD0ieG1sX3RhZyIgZW5hYmxlZD0idHJ1ZSI+Jmx0Oz94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iJHtjdXJzb3J9Ij8mZ3Q7PC90ZW1wbGF0ZT4KLSAgPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMueHNpbnNwLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnhzaW5zcC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMueHNpbnNwIiBjb250ZXh0PSJ4bWxfYXR0cmlidXRlIiBlbmFibGVkPSJ0cnVlIj54bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjwvdGVtcGxhdGU+Ci0gIDx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnNjaGVtYUxvYy5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5zY2hlbWFMb2MuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLnNjaGVtYUxvYyIgY29udGV4dD0ieG1sX2F0dHJpYnV0ZSIgZW5hYmxlZD0idHJ1ZSI+eHNpOnNjaGVtYUxvY2F0aW9uPSJ7bmFtZXNwYWNlfSB7bG9jYXRpb259IjwvdGVtcGxhdGU+Ci0gIDx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLm5vc2NoZW1hTG9jLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLm5vc2NoZW1hTG9jLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5ub3NjaGVtYUxvYyIgY29udGV4dD0ieG1sX2F0dHJpYnV0ZSIgZW5hYmxlZD0idHJ1ZSI+eHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249Intsb2NhdGlvbn0iPC90ZW1wbGF0ZT4KLSAgPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuZGVmYXVsdG5zcC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5kZWZhdWx0bnNwLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5kZWZhdWx0bnNwIiBjb250ZXh0PSJ4bWxfYXR0cmlidXRlIiBlbmFibGVkPSJ0cnVlIj54bWxucz0iZGVmYXVsdCBuYW1lc3BhY2UiPC90ZW1wbGF0ZT4KLTwvdGVtcGxhdGVzPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MTBjNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1jb250ZW50bW9kZWwiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXZhbGlkYXRpb24iIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iCi0JCXBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL2ltcGwvQ29uc3RhbnRzIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy9wYXJzZXJzL1hNTEdyYW1tYXJQcmVwYXJzZXIiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3V0aWwvWE1MR3JhbW1hclBvb2xJbXBsIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvWE1MUmVzb3VyY2VJZGVudGlmaWVyIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvWE5JRXhjZXB0aW9uIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvZ3JhbW1hcnMvWE1MR3JhbW1hckRlc2NyaXB0aW9uIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvcGFyc2VyL1hNTEVudGl0eVJlc29sdmVyIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvcGFyc2VyL1hNTEVycm9ySGFuZGxlciIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMveG5pL3BhcnNlci9YTUxJbnB1dFNvdXJjZSIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMveG5pL3BhcnNlci9YTUxQYXJzZUV4Y2VwdGlvbiIgLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iCi0JCXBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZSIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvZGVsZWdhdGVzL0RlbGVnYXRpbmdWYWxpZGF0b3IiIC8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iIC8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2RkN2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1ZjhlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2QuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI1NTU4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jU2F0IE1hciAyNCAwMjoxOToxMiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzA5ODVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jV2VkIE5vdiAxNSAwMjoxMzoxMCBFU1QgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODIzZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlX1VJX1BMVUdJTl9OQU1FCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS42MDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwuWFNEQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlO3gtaW50ZXJuYWw6PXRydWUgCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS54c2Q7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODQ2MzFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSBzcmMtY29udGVudG1vZGVsLyxcCi0gICAgICAgICAgIHNyYy12YWxpZGF0aW9uLyxcCi0gICAgICAgICAgIHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYmE1NTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotISBQcm9wZXJ0aWVzIGZpbGUgZm9yIGNvbXBvbmVudDogWE1MIFNjaGVtYSBWYWxpZGF0b3IKLQotIQotISBQbHVnaW4KLSEKLV9VSV9QTFVHSU5fTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gWFNEIENvcmUgUGx1Z2luCi1YU0RfQ29udGVudF9UeXBlPVhTRAotCi1fVUlfWE1MX1NDSEVNQV9WQUxJREFUT1IgICAgICAgICAgICAgICAgICA9IFhNTCBTY2hlbWEgVmFsaWRhdG9yCi1fVUlfWEVSQ0VTX1ZBTElEQVRPUl9ERUxFR0FURSAgICAgICAJICA9IFhlcmNlcy1iYXNlZCBYTUwgU2NoZW1hIFZhbGlkYXRvcgotCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMmM1MzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZS5jb250ZW50VHlwZXMiPgotCQk8Y29udGVudC10eXBlCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVYU0RfQ29udGVudF9UeXBlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0JCQlkZWZhdWx0LWNoYXJzZXQ9IlVURi04IgotCQkJZmlsZS1leHRlbnNpb25zPSJ4c2QiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnRGYWN0b3JpZXMiPgotCQk8ZmFjdG9yeQotCQkJdHlwZT0ieHNkIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsLkNNRG9jdW1lbnRGYWN0b3J5WFNEIj4KLQkJPC9mYWN0b3J5PgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gUmVnaXN0ZXIgdGhlIFhTRCB2YWxpZGF0b3Igd2l0aCB0aGUgdmFsaWRhdGlvbiAJCS0tPgotCTwhLS0gZnJhbWV3b3JrLiAJCQkJCQkJCQkJICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0KLQk8ZXh0ZW5zaW9uCi0JCWlkPSJ4c2RWYWxpZGF0b3IiCi0JCW5hbWU9IiVfVUlfWE1MX1NDSEVNQV9WQUxJREFUT1IiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3IiPgotCQk8dmFsaWRhdG9yPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQljYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLQkJCQluYW1lRmlsdGVyPSIqLnhzZCI+Ci0JCQk8L2ZpbHRlcj4KLQkJCQotCQkJPGhlbHBlcgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkhlbHBlciI+Ci0JCQk8L2hlbHBlcj4KLQkJCQotCQkJPHJ1bgotICAgICAgICAgYXN5bmM9InRydWUiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZS5YU0REZWxlZ2F0aW5nVmFsaWRhdG9yIgotICAgICAgICAgZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgIGZ1bGxCdWlsZD0idHJ1ZSIKLSAgICAgICAgIGluY3JlbWVudGFsPSJ0cnVlIj4KLQkJCTwvcnVuPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQktLT4KLQkKLSAgIDxleHRlbnNpb24gaWQ9InhzZCIgbmFtZT0iJV9VSV9YTUxfU0NIRU1BX1ZBTElEQVRPUiIgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIj4KLSAgICAgIDx2YWxpZGF0b3IKLSAgICAgICAgICAgIGJ1aWxkPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuWFNERGVsZWdhdGluZ1ZhbGlkYXRvciIKLSAgICAgICAgICAgIG1hbnVhbD0idHJ1ZSIKLSAgICAgICAgICAgIHNvdXJjZWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTRCIKLSAgICAgICAgICAgIHZlcnNpb249IjIiCi0gICAgICAgICAgICBtYXJrZXJJZD0ib3JnLmVjbGlwc2UueHNkLmRpYWdub3N0aWMiPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dCBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIgZXh0PSJ4c2QiPjwvZmlsZWV4dD4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JEZWxlZ2F0ZXMiPgotICAgIAk8ZGVsZWdhdGUKLSAgICAgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvciIKLQkJCW5hbWU9IiVfVUlfWEVSQ0VTX1ZBTElEQVRPUl9ERUxFR0FURSIKLSAgICAgICAgCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZS5YU0REZWxlZ2F0aW5nVmFsaWRhdG9yIi8+Ci0JIDwvZXh0ZW5zaW9uPgotIAkgCi0JIDwhLS0gaW5pdGlhbGl6ZSB4bWwgY29yZSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWFNEQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gQWRkIHNjaGVtYXMgdG8gWE1MIENhdGFsb2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jYXRhbG9nQ29udHJpYnV0aW9ucyI+Ci0JCTxjYXRhbG9nQ29udHJpYnV0aW9uIGlkPSJkZWZhdWx0Ij4KLQkJCTx1cmkKLQkJCQluYW1lPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkJCQl1cmk9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UueHNkL2NhY2hlL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEueHNkIiAvPgotCQkJPHN5c3RlbQotCQkJCXN5c3RlbUlkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiCi0JCQkJdXJpPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnhzZC9jYWNoZS93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvPgkJCQkKLQkJPC9jYXRhbG9nQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvQ01Eb2N1bWVudEZhY3RvcnlYU0QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvQ01Eb2N1bWVudEZhY3RvcnlYU0QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMyNjA4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL0NNRG9jdW1lbnRGYWN0b3J5WFNELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeS5DTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RQYWNrYWdlSW1wbDsKLQotLyoqCi0gKiAgVGhpcyBidWlsZGVyIGhhbmRsZXMgYnVpbGRpbmcgLmR0ZCAvIC54c2QgZ3JhbW1hciBmaWxlcwotICovCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEZhY3RvcnlYU0QgaW1wbGVtZW50cyBDTURvY3VtZW50RmFjdG9yeQotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RfRklMRV9UWVBFID0gIlhTRCI7Ci0KLSAgcHVibGljIENNRG9jdW1lbnRGYWN0b3J5WFNEKCkgCi0gIHsgIAotICAgIC8vIGhlcmUgd2UgY2FsbCBpbml0IG9uIHRoZSBYU0QgYW5kIERURCBwYWNrYWdlcyB0byBhdm9pZCBzdHJhbmdlIGluaXRpYWxpemF0aW9uIGJ1Z3MKLSAgICAvLwotICAgIFhTRFBhY2thZ2VJbXBsLmluaXQoKTsKLSAgICBYU0RQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RGYWN0b3J5KCk7ICAKLSAgfQotCi0gCi0gIHB1YmxpYyBDTURvY3VtZW50IGNyZWF0ZUNNRG9jdW1lbnQoU3RyaW5nIHVyaSkKLSAgeyAgICAgICAgICAgICAgICAgIAkKLSAgICBDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IFhTREltcGwuYnVpbGRDTURvY3VtZW50KHVyaSk7ICAgICAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsgIAotICB9IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9DTU5vZGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL0NNTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZjYTU3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL0NNTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ01Ob2RlSW1wbCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQ01Ob2RlCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RPQ1VNRU5UQVRJT04gPSAiZG9jdW1lbnRhdGlvbiI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RPQ1VNRU5UQVRJT05fU09VUkNFID0gImRvY3VtZW50YXRpb25Tb3VyY2UiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OX0xBTkdVQUdFID0gImRvY3VtZW50YXRpb25MYW5ndWFnZSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX01PRl9OT1RJRklFUiA9ICJrZXkiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERUZJTklUSU9OX0lORk8gPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL2RlZmluaXRpb25JbmZvIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVGSU5JVElPTiA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZGVmaW5pdGlvbiI7Ci0KLSAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRLZXkoKTsKLQotICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgcmV0dXJuIHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfTU9GX05PVElGSUVSKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9iamVjdCkKLSAgewotCSAgLy9ubyBwcm9wZXJ0eWVzIHN1cHBvcnRlZD8gCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNEQ01NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRENNTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDYxYTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNEQ01NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLQotcHVibGljIGNsYXNzIFhTRENNTWFuYWdlciBleHRlbmRzIFBsdWdpbiAKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgWFNEQ01NYW5hZ2VyIGluc3RhbmNlOwotICAKLSAgcHVibGljIFhTRENNTWFuYWdlcigpIAotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBYU0RDTU1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpIHsKLSAgICAgIGluc3RhbmNlID0gbmV3IFhTRENNTWFuYWdlcigpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLSAgewotICAgIFhTRFR5cGVVdGlsLmluaXRpYWxpemUoKTsKLSAgICAvL0NvbnRlbnRNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zZXRJbmZlcnJlZEdyYW1tYXJGYWN0b3J5KG5ldyBJbmZlcnJlZEdyYW1tYXJGYWN0b3J5SW1wbCgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTREltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFiZGMyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTREltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gYnVnIDE1NzI1NCAtIHJlZmVyZW5jZWQgQXR0cmlidXRlcyBhbmQgRWxlbWVudHMKLSAqICAgICAgICB3ZXJlIG5vdCBiZWluZyBjaGVja2VkIHRvIHNlZSBpZiB0aGV5IGhhZCB0aGUgYW5ub3RhdGlvbnMgaWYKLSAqICAgICAgICBub25lIHdlcmUgZGVmaW5lZCBsb2NhbGx5LiAoSW5pdGlhbCBmaXggbW9kaWZpZWQgLSBzZWUgYnVnKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BbnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNRGF0YVR5cGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTUVudGl0eURlY2xhcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNR3JvdXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01OYW1lZE5vZGVNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01Ob2RlTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRGVzY3JpcHRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsLnV0aWwuWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29udGVudFR5cGVDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbnVtZXJhdGlvbkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVmFyaWV0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEU2NoZW1hSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFN3aXRjaDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGJ1aWxkIGNtbm9kZXMgZnJvbSBYTUwgU2NoZW1hIG5vZGVzLiBUaGUgWE1MIFNjaGVtYSBtb2RlbCBpcwotICogZm91bmQgaW4gdGhlIG9yZy5lY2xpcHNlLnhzZCBwbHVnaW4uCi0gKiAKLSAqIFRPRE86IGdldE5hbWVzcGFjZVVSSSgpY3VycmVudGx5IGFsd2F5cyByZXR1cm5zICcjI2FueScuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RJbXBsCi17Ci0gIC8qCi0gICAqIHByb3BlcnRpZXMgY29tbW9uIHRvIGFsbCBjbW5vZGVzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBkZWZpbmVkIGluCi0gICAqIENNTm9kZUltcGwgY2xhc3M6IFBST1BFUlRZX0RPQ1VNRU5UQVRJT04gUFJPUEVSVFlfRE9DVU1FTlRBVElPTl9TT1VSQ0UKLSAgICogUFJPUEVSVFlfRE9DVU1FTlRBVElPTl9MQU5HVUFHRSBQUk9QRVJUWV9NT0ZfTk9USUZJRVIKLSAgICogUFJPUEVSVFlfREVGSU5JVElPTl9JTkZPIFBST1BFUlRZX0RFRklOSVRJT04KLSAgICogCi0gICAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBkZWZpbmVkIGluIHRoaXMgY2xhc3MsIFhTREltcGw6Ci0gICAqIFBST1BFUlRZX0NNRE9DVU1FTlQgUFJPUEVSVFlfVVNFU19MT0NBTF9FTEVNRU5UX0RFQ0xBUkFUSU9OUwotICAgKiBQUk9QRVJUWV9JU19OQU1FX1NQQUNFX0FXQVJFIFBST1BFUlRZX05TX1BSRUZJWF9RVUFMSUZJQ0FUSU9OCi0gICAqIFBST1BFUlRZX05JTExBQkxFIFBST1BFUlRZX1NQRUMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0NNRE9DVU1FTlQgPSAiQ01Eb2N1bWVudCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1VTRVNfTE9DQUxfRUxFTUVOVF9ERUNMQVJBVElPTlMgPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3VzZXNMb2NhbEVsZW1lbnREZWNsYXJhdGlvbnMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9JU19OQU1FX1NQQUNFX0FXQVJFID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9pc05hbWVTcGFjZUF3YXJlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTlNfUFJFRklYX1FVQUxJRklDQVRJT04gPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25zUHJlZml4UXVhbGlmaWNhdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05JTExBQkxFID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uaWxsYWJsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1NQRUMgPSAic3BlYyI7Ci0gIC8qCi0gICAqIHByb3BlcnRpZXMgY29tbW9uIHRvIGFsbCBDTURvY3VtZW50IG5vZGVzOiBQUk9QRVJUWV9UQVJHRVRfTkFNRVNQQUNFX1VSSQotICAgKiBQUk9QRVJUWV9JTVBPUlRFRF9OQU1FU1BBQ0VfSU5GTyBQUk9QRVJUWV9OQU1FU1BBQ0VfSU5GTwotICAgKiBQUk9QRVJUWV9FTEVNRU5UX0ZPUk1fREVGQVVMVCBQUk9QRVJUWV9BTk5PVEFUSU9OX01BUAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVEFSR0VUX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0lNUE9SVEVEX05BTUVTUEFDRV9JTkZPID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9pbXBvcnRlZE5hbWVzcGFjZUluZm8iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FU1BBQ0VfSU5GTyA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvbmFtZXNwYWNlSW5mbyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0VMRU1FTlRfRk9STV9ERUZBVUxUID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9lbGVtZW50Rm9ybURlZmF1bHQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9BTk5PVEFUSU9OX01BUCA9ICJhbm5vdGF0aW9uTWFwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ09NUExFVEVfTkFNRVNQQUNFX0lORk8gPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL2NvbXBsZXRlTmFtZXNwYWNlSW5mbyI7Ci0gIC8qCi0gICAqIHByb3BlcnRpZXMgY29tbW9uIHRvIGFsbCBDTUVsZW1lbnREZWNsYXJhdGlvbiBub2RlczogUFJPUEVSVFlfWFNJVFlQRVMKLSAgICogUFJPUEVSVFlfREVSSVZFRF9FTEVNRU5UX0RFQ0xBUkFUSU9OIFBST1BFUlRZX1NVQlNUSVRVVElPTl9HUk9VUAotICAgKiBQUk9QRVJUWV9BQlNUUkFDVAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWFNJVFlQRVMgPSAiWFNJVHlwZXMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERVJJVkVEX0VMRU1FTlRfREVDTEFSQVRJT04gPSAiRGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1NVQlNUSVRVVElPTl9HUk9VUCA9ICJTdWJzdGl0dXRpb25Hcm91cCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1NVQlNUSVRVVElPTl9HUk9VUF9WQUxVRSA9ICJTdWJzdGl0dXRpb25Hcm91cFZhbHVlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQUJTVFJBQ1QgPSAiQWJzdHJhY3QiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9XSElURVNQQUNFX0ZBQ0VUID0gIm9yZy5lY2xpcHNlLndzdC54c2QuY20ucHJvcGVydGllcy93aGl0ZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotICAvKioKLSAgICogRGVmaW5pdGlvbiBpbmZvIGZvciBlbGVtZW50IGRlY2xhcmF0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRklOSVRJT05fSU5GT19HTE9CQUwgPSAiZ2xvYmFsIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGSU5JVElPTl9JTkZPX0xPQ0FMID0gImxvY2FsIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0xBTkdfQVRUUklCVVRFID0gInhtbDpsYW5nIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fUFJPVE9DT0wgPSAicGxhdGZvcm06IjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBYU0RBZGFwdGVyRmFjdG9yeUltcGwgeHNkQWRhcHRlckZhY3RvcnlJbXBsID0gbmV3IFhTREFkYXB0ZXJGYWN0b3J5SW1wbCgpOwotICBwcm90ZWN0ZWQgc3RhdGljIFhTSURvY3VtZW50IHhzaURvY3VtZW50ID0gbmV3IFhTSURvY3VtZW50KCk7Ci0KLSAgLyoqCi0gICAqIEdpdmVuIHVyaSBmb3IgYW4gWE1MIFNjaGVtYSBkb2N1bWVudCwgcGFyc2UgdGhlIGRvY3VtZW50IGFuZCBidWlsZAotICAgKiBjb3JyZXNwb25kaW5nIENNRG9jdW1lbnQgbm9kZS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgLQotICAgKiAgICAgICAgICB0aGUgdXJpIGZvciBhbiBYTUwgU2NoZW1hIGRvY3VtZW50Ci0gICAqIEBwYXJhbSBncmFtbWFyRXJyb3JDaGVja2luZyAtCi0gICAqICAgICAgICAgIGdyYW1tYXIgZXJyb3IgY2hlY2tpbmcgZmxhZwotICAgKiBAcGFyYW0gZXJyb3JMaXN0IC0KLSAgICogICAgICAgICAgdGhlIHJlc3VsdGluZyBlcnJvciBsaXN0Ci0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgQ01Eb2N1bWVudCBub2RlLgotICAgKiBAZGVwcmVjYXRlZCAtLSB1c2UgYnVpbGRDTURvY3VtZW50KFN0cmluZyB1cmkpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50KFN0cmluZyB1cmksIGludCBncmFtbWFyRXJyb3JDaGVja2luZywgTGlzdCBlcnJvckxpc3QpCi0gIHsKLSAgICByZXR1cm4gYnVpbGRDTURvY3VtZW50KHVyaSk7Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gdXJpIGZvciBhbiBYTUwgU2NoZW1hIGRvY3VtZW50LCBwYXJzZSB0aGUgZG9jdW1lbnQgYW5kIGJ1aWxkCi0gICAqIGNvcnJlc3BvbmRpbmcgQ01Eb2N1bWVudCBub2RlLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSAtCi0gICAqICAgICAgICAgIHRoZSB1cmkgZm9yIGFuIFhNTCBTY2hlbWEgZG9jdW1lbnQKLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBDTURvY3VtZW50IG5vZGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50KFN0cmluZyB1cmkpCi0gIHsKLSAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBudWxsOwotICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBidWlsZFhTRE1vZGVsKHVyaSk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCkgZ2V0QWRhcHRlcih4c2RTY2hlbWEpOwotICAgIH0KLSAgICByZXR1cm4gY21Eb2N1bWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBHaXZlbiB1cmkgZm9yIGFuIFhNTCBTY2hlbWEgZG9jdW1lbnQsIHBhcnNlIHRoZSBkb2N1bWVudCBhbmQgYnVpbGQKLSAgICogY29ycmVzcG9uZGluZyBDTURvY3VtZW50IG5vZGUuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIC0KLSAgICogICAgICAgICAgdGhlIHVyaSBmb3IgYW4gWE1MIFNjaGVtYSBkb2N1bWVudAotICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIENNRG9jdW1lbnQgbm9kZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgWFNEU2NoZW1hIGJ1aWxkWFNETW9kZWwoU3RyaW5nIHVyaVN0cmluZykKLSAgewotICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBudWxsOwotIAotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIGlmIFhNTCBTY2hlbWEgZm9yIFNjaGVtYSBpcyByZXF1ZXN0ZWQsIGdldCBpdCB0aHJvdWdoIHNjaGVtYSBtb2RlbCAKLSAgICAgIGlmICh1cmlTdHJpbmcuZW5kc1dpdGgoIjIwMDEvWE1MU2NoZW1hLnhzZCIpKQotICAgICAgewotICAgICAgCXhzZFNjaGVtYSA9IFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7CQkJCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7IAkKLSAgICAgICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0gICAgICAgIC8vcmVzb3VyY2VTZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZChuZXcgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckFkYXB0ZXJGYWN0b3J5KCkpOwotICAgICAgICByZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBYU0RTY2hlbWFMb2NhdG9yQWRhcHRlckZhY3RvcnkoKSk7Ci0gICAgICAgICAgCi0gICAgICAgIFVSSSB1cmkgPSBjcmVhdGVVUkkodXJpU3RyaW5nKTsgICAKLSAgICAgICAgCi0gICAgICAgIC8vIENTIDogYnVnIDExMzUzNyBlbnN1cmUgd2UgcGVyZm9ybSBwaHlzaWNhbCByZXNvbHV0aW9uIGJlZm9yZSBvcGVuaW5nIGEgc3RyZWFtIGZvciB0aGUgcmVzb3VyY2UKLSAgICAgICAgLy8KLSAgICAgICAgU3RyaW5nIHBoeXNpY2FsTG9jYXRpb24gPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmVQaHlzaWNhbExvY2F0aW9uKCIiLCAiIiwgdXJpU3RyaW5nKTsgICAgICAgCi0gICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gcmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0oVVJJLmNyZWF0ZVVSSShwaHlzaWNhbExvY2F0aW9uKSk7Ci0gICAgICAgIFhTRFJlc291cmNlSW1wbCByZXNvdXJjZSA9IChYU0RSZXNvdXJjZUltcGwpcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiKi54c2QiKSk7Ci0gICAgICAgIHJlc291cmNlLnNldFVSSSh1cmkpOwotICAgICAgICByZXNvdXJjZS5sb2FkKGlucHV0U3RyZWFtLCBudWxsKTsgICAgICAgICAKLSAgICAgICAgeHNkU2NoZW1hID0gcmVzb3VyY2UuZ2V0U2NoZW1hKCk7ICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiB4c2RTY2hlbWE7Ci0gIH0KLSAgCi0gIC8vIFRPRE8gLi4uIGxvb2tzIGxpa2Ugd2UgY2FuIHJlbW92ZSB0aGlzIGNsYXNzPwotICAvLwotICBzdGF0aWMgY2xhc3MgSW50ZXJuYWxVUklDb252ZXJ0ZXIgZXh0ZW5kcyBVUklDb252ZXJ0ZXJJbXBsCi0gIHsKLSAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gY3JlYXRlVVJMSW5wdXRTdHJlYW0oVVJJIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgaWYgKCJodHRwIi5lcXVhbHModXJpLnNjaGVtZSgpKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHRoZVVSSSA9IHVyaS50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgbWFwcGVkID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKHRoZVVSSSwgdGhlVVJJLCB0aGVVUkkpOwotICAgICAgICBpZiAobWFwcGVkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB1cmkgPSBjcmVhdGVVUkkobWFwcGVkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZVVSTElucHV0U3RyZWFtKHVyaSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gYXBwcm9wcmlhdGUgVVJJIGJhc2VkIG9uIGEgdXJpIHN0cmluZy4KLSAgICogCi0gICAqIEBwYXJhbSB1cmlTdHJpbmcgLQotICAgKiAgICAgICAgICBhIHVyaSBzdHJpbmcuCi0gICAqIEByZXR1cm4gYW4gYXBwcm9wcmlhdGUgVVJJIGJhc2VkIG9uIGEgdXJpIHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVVSSShTdHJpbmcgdXJpU3RyaW5nKQotICB7Ci0gICAgaWYgKGhhc1Byb3RvY29sKHVyaVN0cmluZykpCi0gICAgICByZXR1cm4gVVJJLmNyZWF0ZVVSSSh1cmlTdHJpbmcpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBVUkkuY3JlYXRlRmlsZVVSSSh1cmlTdHJpbmcpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNQcm90b2NvbChTdHJpbmcgdXJpKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gdXJpLmluZGV4T2YoIjoiKTsKLSAgICAgIGlmIChpbmRleCAhPSAtMSAmJiBpbmRleCA+IDIpIC8vIGFzc3VtZSBwcm90b2NvbCB3aXRoIGJlIGxlbmd0aCAzIHNvIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSdDJyBpbiAnQzovJyBpcyBub3QgaW50ZXJwcmV0ZWQgYXMgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdG9jb2wKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgc3RyaW5nIGJlZ2lucyB3aXRoIHBsYXRmb3JtIHByb3RvY29sLgotICAgKiAKLSAgICogQHBhcmFtIHVyaVN0cmluZyAtCi0gICAqICAgICAgICAgIGEgdXJpIHN0cmluZy4KLSAgICogQHJldHVybiB0cnVlIGlmIHN0cmluZyBiZWdpbnMgd2l0aCBwbGF0Zm9ybSBwcm90b2NvbC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3aXRoUGxhdGZvcm1Qcm90b2NvbChTdHJpbmcgdXJpU3RyaW5nKQotICB7Ci0gICAgcmV0dXJuIHVyaVN0cmluZy5zdGFydHNXaXRoKFBMQVRGT1JNX1BST1RPQ09MKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ01pbiBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgIjEiLgotICAgKiAKLSAgICogQHBhcmFtIGNvbXBvbmVudCAtCi0gICAqICAgICAgICAgIGEgY29uY3JldGUgY29tcG9uZW50LgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ01pbiBPY2N1cnMnIGF0dHJpYnV0ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldE1pbk9jY3VycyhYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBpbnQgbWluT2NjdXIgPSAxOwotICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGNvbXBvbmVudC5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICB7Ci0gICAgICAgIGlmICgoKFhTRFBhcnRpY2xlKSBvKS5pc1NldE1pbk9jY3VycygpKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgbWluT2NjdXIgPSAoKFhTRFBhcnRpY2xlKSBvKS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1pbk9jY3VyID0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1pbk9jY3VyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiMSIuCi0gICAqIAotICAgKiBAcGFyYW0gY29tcG9uZW50IC0KLSAgICogICAgICAgICAgYSBjb25jcmV0ZSBjb21wb25lbnQuCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TWF4T2NjdXJzKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIGludCBtYXhPY2N1ciA9IDE7Ci0gICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gY29tcG9uZW50LmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoWFNEUGFydGljbGUpIG8pLmlzU2V0TWF4T2NjdXJzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXhPY2N1ciA9ICgoWFNEUGFydGljbGUpIG8pLmdldE1heE9jY3VycygpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWF4T2NjdXIgPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWF4T2NjdXI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZW51bWVyYXRlZCB2YWx1ZXMgZm9yIHRoZSBnaXZlbiB0eXBlLgotICAgKiAKLSAgICogQHBhcmFtIHR5cGUgLQotICAgKiAgICAgICAgICBhIHR5cGUgZGVmaW5pdGlvbi4KLSAgICogQHJldHVybiB0aGUgZW51bWVyYXRlZCB2YWx1ZXMgZm9yIHRoZSBnaXZlbiB0eXBlLgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRZUEVfTkFNRV9CT09MRUFOID0gImJvb2xlYW4iOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUWVBFX1ZBTFVFX1RSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRZUEVfVkFMVUVfRkFMU0U9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQgIAotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFbnVtZXJhdGVkVmFsdWVzRm9yVHlwZShYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgLy8gU2VlIGJ1ZyAyMTQ4MDQgLSBDb250ZW50IGFzc2lzdCBub3Qgc2hvd2luZyB2YWxpZCB2YWx1ZXMgd2hlbiBpdCdzIGEgY29tcGxleAotICAgIC8vIHR5cGUgd2l0aCBzaW1wbGUgY29udGVudAotICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHR5cGUgPSAoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbil0eXBlKS5nZXRTaW1wbGVUeXBlKCk7Ci0gICAgfQotICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgeyAgICAgICAgIAotICAgICAgaWYgKFRZUEVfTkFNRV9CT09MRUFOLmVxdWFscyh0eXBlLmdldE5hbWUoKSkgJiYgdHlwZS5nZXRTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWEoKSA9PSB0eXBlLmdldFNjaGVtYSgpKQotICAgICAgewotICAgICAgICByZXN1bHQuYWRkKFRZUEVfVkFMVUVfVFJVRSk7Ci0gICAgICAgIHJlc3VsdC5hZGQoVFlQRV9WQUxVRV9GQUxTRSk7Ci0gICAgICB9IAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBTaW1wbGUgdHlwZXMgY2FuIGJlIG9uZSBvZjogYXRvbWljLCBsaXN0IG9yIHVuaW9uLgotICAgICAgICBpbnQgdmFyaWV0eVR5cGUgPSAoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB0eXBlKS5nZXRWYXJpZXR5KCkuZ2V0VmFsdWUoKTsKLQotICAgICAgICBzd2l0Y2ggKHZhcmlldHlUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBYU0RWYXJpZXR5LkFUT01JQzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGUgPSB0eXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsICYmICEodHlwZS5nZXRTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWEoKSA9PSBiYXNlVHlwZS5nZXRTY2hlbWEoKSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXRFbnVtZXJhdGVkVmFsdWVzRm9yU2ltcGxlVHlwZShiYXNlVHlwZSwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXRFbnVtZXJhdGVkVmFsdWVzRm9yU2ltcGxlVHlwZSh0eXBlLCByZXN1bHQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFhTRFZhcmlldHkuTElTVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gaXRlbVR5cGVEZWZpbml0aW9uID0gKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdHlwZSkuZ2V0SXRlbVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IGdldEVudW1lcmF0ZWRWYWx1ZXNGb3JUeXBlKGl0ZW1UeXBlRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdmFsdWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAJICBpZihyZXN1bHQuaW5kZXhPZih2YWx1ZXNbal0pID09IC0xKSB7Ci0gICAgICAgICAgICAJCSAgcmVzdWx0LmFkZCh2YWx1ZXNbal0pOwotICAgICAgICAgICAgCSAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFhTRFZhcmlldHkuVU5JT046Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIExpc3QgbWVtYmVyVHlwZXMgPSAoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB0eXBlKS5nZXRNZW1iZXJUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICAgICAgICAgICAgaWYgKG1lbWJlclR5cGVzICE9IG51bGwgJiYgbWVtYmVyVHlwZXMuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBtZW1iZXJUeXBlcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IGdldEVudW1lcmF0ZWRWYWx1ZXNGb3JUeXBlKHNpbXBsZVR5cGUpOwotICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAJICBpZihyZXN1bHQuaW5kZXhPZih2YWx1ZXNbal0pID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgCQkgIHJlc3VsdC5hZGQodmFsdWVzW2pdKTsKLSAgICAgICAgICAgICAgICAJICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gIAotICAgIFN0cmluZ1tdIGFycmF5ID0gbmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXTsKLSAgICByZXN1bHQudG9BcnJheShhcnJheSk7Ci0gICAgcmV0dXJuIGFycmF5OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRFbnVtZXJhdGVkVmFsdWVzRm9yU2ltcGxlVHlwZShYU0RUeXBlRGVmaW5pdGlvbiB0eXBlLCBMaXN0IHJlc3VsdCkKLSAgewotICAgIExpc3QgZW51bWVyYXRpb25GYWNldHMgPSAoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB0eXBlKS5nZXRFbnVtZXJhdGlvbkZhY2V0cygpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGVudW1lcmF0aW9uRmFjZXRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBpLm5leHQoKTsKLSAgICAgIExpc3QgdmFsdWVzID0gZW51bUZhY2V0LmdldFZhbHVlKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSB2YWx1ZXMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGoubmV4dCgpOwotICAgICAgICBpZiAobyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFyZXN1bHQuY29udGFpbnMobykpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFkZChvLnRvU3RyaW5nKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMgZnJvbSB0aGUgZ2l2ZW4gYW5ub3RhdGlvbi4gV29ya2luZwotICAgKiB3aXRoIGRvY3VtZW50YXRpb24gZWxlbWVudHMgcmVxdWlyZXMgZHJvcHBpbmcgZG93biBpbnRvIHRoZSBET00gbW9kZWwuCi0gICAqIAotICAgKiBAcGFyYW0gYW5ub3RhdGlvbiAtCi0gICAqICAgICAgICAgIGFuIFhTREFubm90YXRpb24gbm9kZS4KLSAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9ucyhYU0RBbm5vdGF0aW9uIGFubm90YXRpb24pCi0gIHsKLSAgICBDTU5vZGVMaXN0SW1wbCBkb2N1bWVudGF0aW9ucyA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBkb2N1bWVudGF0aW9uc0VsZW1lbnRzID0gYW5ub3RhdGlvbi5nZXRVc2VySW5mb3JtYXRpb24oKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGRvY3VtZW50YXRpb25zRWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBkb2N1bWVudGF0aW9ucy5nZXRMaXN0KCkuYWRkKG5ldyBEb2N1bWVudGF0aW9uSW1wbCgoRWxlbWVudCkgaS5uZXh0KCkpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRvY3VtZW50YXRpb25zOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkYXB0ZWQgZnJvbSBwdWJsaWMgc3RhdGljIExpc3QgZmluZFR5cGVzRGVyaXZlZEZyb20oWFNEU2NoZW1hIHNjaGVtYSwKLSAgICogU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkgaW4gY2xhc3MgWFNEU2NoZW1hUXVlcnlUb29scyBmb3VuZCBpbgotICAgKiBvcmcuZWNsaXBzZS54c2QgcGx1Z2luLgotICAgKiAKLSAgICogRmluZCB0eXBlRGVmaW5pdGlvbnMgdGhhdCBkZXJpdmUgZnJvbSBhIGdpdmVuIHR5cGUuCi0gICAqIAotICAgKiBAcGFyYW0gdHlwZQotICAgKiAgICAgICAgICB0aGUgdHlwZSBkZXJpdmVkIGZyb20KLSAgICogQHJldHVybiBMaXN0IG9mIGFueSBYU0RUeXBlRGVmaW5pdGlvbnMgZm91bmQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBmaW5kVHlwZXNEZXJpdmVkRnJvbShYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgQXJyYXlMaXN0IHR5cGVzRGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gdHlwZS5nZXRTY2hlbWEoKTsKLSAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSB0eXBlLmdldE5hbWUoKTsKLSAgICAgIGlmICgobnVsbCAhPSBzY2hlbWEpICYmIChudWxsICE9IGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIC8vIEEgaGFuZHkgY29udmVuaWVuY2UgbWV0aG9kIHF1aWNrbHkgZ2V0cyBhbGwKLSAgICAgICAgLy8gdHlwZURlZmluaXRpb25zIHdpdGhpbiBvdXIgc2NoZW1hOyBub3RlIHRoYXQKLSAgICAgICAgLy8gd2hldGhlciBvciBub3QgdGhpcyByZXR1cm5zIHR5cGVzIGluIGluY2x1ZGVkLAotICAgICAgICAvLyBpbXBvcnRlZCwgb3IgcmVkZWZpbmVkIHNjaGVtYXMgaXMgc3ViamVjdCB0byBjaGFuZ2UKLSAgICAgICAgTGlzdCB0eXBlZGVmcyA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWRlZnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZWRlZiA9IChYU0RUeXBlRGVmaW5pdGlvbikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgaWYgKHR5cGVkZWYgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gV2FsayB0aGUgYmFzZVR5cGVzIGZyb20gdGhpcyB0eXBlZGVmIHNlZWluZyBpZiBhbnkKLSAgICAgICAgICAgIC8vIG9mIHRoZW0gbWF0Y2ggdGhlIHJlcXVlc3RlZCBvbmUKLSAgICAgICAgICAgIGlmIChpc1R5cGVEZXJpdmVkRnJvbSh0eXBlZGVmLCBuYW1lc3BhY2UsIGxvY2FsTmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIFdlIGZvdW5kIGl0LCByZXR1cm4gdGhlIG9yaWdpbmFsIG9uZSBhbmQgY29udGludWUKLSAgICAgICAgICAgICAgdHlwZXNEZXJpdmVkRnJvbS5hZGQodHlwZWRlZik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHlwZXNEZXJpdmVkRnJvbTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGFwdGVkIGZyb20gcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzVHlwZURlcml2ZWRGcm9tKFhTRFR5cGVEZWZpbml0aW9uCi0gICAqIHR5cGVkZWYsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpIGluIGNsYXNzIFhTRFNjaGVtYVF1ZXJ5VG9vbHMKLSAgICogZm91bmQgaW4gb3JnLmVjbGlwc2UueHNkIHBsdWdpbi4KLSAgICogCi0gICAqIFJlY3Vyc2l2ZSB3b3JrZXIgbWV0aG9kIHRvIGZpbmQgdHlwZURlZmluaXRpb25zIHRoYXQgZGVyaXZlIGZyb20gYSBuYW1lZAotICAgKiB0eXBlLgotICAgKiAKLSAgICogQHNlZSAjZmluZFR5cGVzRGVyaXZlZEZyb20oWFNEU2NoZW1hLCBTdHJpbmcsIFN0cmluZykKLSAgICogQHBhcmFtIHR5cGVEZWYKLSAgICogICAgICAgICAgdG8gc2VlIGlmIGl0J3MgZGVyaXZlZCBmcm9tCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICogICAgICAgICAgZm9yIHRoZSB0eXBlIGRlcml2ZWQgZnJvbQotICAgKiBAcGFyYW0gbG9jYWxOYW1lCi0gICAqICAgICAgICAgIGZvciB0aGUgdHlwZSBkZXJpdmVkIGZyb20KLSAgICogQHJldHVybiB0cnVlIGlmIGl0IGlzOyBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1R5cGVEZXJpdmVkRnJvbShYU0RUeXBlRGVmaW5pdGlvbiB0eXBlZGVmLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgLy8gV2FsayB0aGUgYmFzZVR5cGVzIGZyb20gdGhpcyB0eXBlZGVmIHNlZWluZyBpZiBhbnkKLSAgICAvLyBvZiB0aGVtIG1hdGNoIHRoZSByZXF1ZXN0ZWQgb25lCi0gICAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGUgPSB0eXBlZGVmLmdldEJhc2VUeXBlKCk7Ci0gICAgaWYgKGJhc2VUeXBlID09IG51bGwpCi0gICAJewotICAgICAgLy8gdHlwZWRlZiBpcyBhIHJvb3QgdHlwZSBsaWtlIHhzZDphbnlUeXBlLCBzbyBpdCBoYXMgbm8gYmFzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvLyBBcyB0aGlzIGNvbnZlbmllbmNlIG1ldGhvZCBpZiBvdXIgcGFyYW1ldGVycyBtYXRjaAotICAgIGlmIChiYXNlVHlwZS5oYXNOYW1lQW5kVGFyZ2V0TmFtZXNwYWNlKGxvY2FsTmFtZSwgbmFtZXNwYWNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgWFNEVHlwZURlZmluaXRpb24gcm9vdFR5cGUgPSB0eXBlZGVmLmdldFJvb3RUeXBlKCk7Ci0KLSAgICBpZiAocm9vdFR5cGUgPT0gYmFzZVR5cGUpCi0gICAgewotICAgICAgLy8gSWYgd2UndmUgaGl0IHRoZSByb290LCB3ZSBhcmVuJ3QgZGVyaXZlZCBmcm9tIGl0Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIHRoZSBiYXNlIHR5cGUgaXMgcmVkZWZpbmVkL2NpcmN1bGFyCi0gICAgICAvLyBvdGhlcndpc2UgdGhpcyB3aWxsIGJlIGFuIGVuZGxlc3MgcmVjdXJzaXZlIGNhbGwuCi0gICAgICAvLyBNb3ZlZC4gIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEzNTQzCi0gICAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCAgICAgWFNEQ29uc3RhbnRzLmlzT3JJc0Rlcml2ZWRGcm9tKGJhc2VUeXBlLCBsb2NhbE5hbWUsIG5hbWVzcGFjZSk7Ci0gICAgICBpZiAocm9vdFR5cGUuaXNDaXJjdWxhcigpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIC8vIE90aGVyd2lzZSBjb250aW51ZSB0byB0cmF2ZXJzZSB1cHdhcmRzCi0gICAgICByZXR1cm4gaXNUeXBlRGVyaXZlZEZyb20oYmFzZVR5cGUsIG5hbWVzcGFjZSwgbG9jYWxOYW1lKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBjbW5vZGUgb2YgdGhlIHNwZWNpZmllZCBYTUwgU2NoZW1hIG5vZGUuCi0gICAqIAotICAgKiBAcGFyYW0gdGFyZ2V0IC0KLSAgICogICAgICAgICAgYW4gWE1MIFNjaGVtYSBub2RlCi0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgY21ub2RlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDTU5vZGUgZ2V0QWRhcHRlcihOb3RpZmllciBvKQotICB7Ci0gICAgcmV0dXJuIChDTU5vZGUpIHhzZEFkYXB0ZXJGYWN0b3J5SW1wbC5hZGFwdChvKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGFwdGVkIGZyb20gcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5zLCBib29sZWFuIHdpdGhDb2xvbikgaW4gY2xhc3MKLSAgICogVHlwZXNIZWxwZXIgZm91bmQgaW4gb3JnLmVjbGlwc2Uud3N0LnhzZC5lZGl0b3IgcGx1Z2luLgotICAgKiAKLSAgICogQHBhcmFtIHNjaGVtYSAtCi0gICAqICAgICAgICAgIHRoZSByZWxldmFudCBzY2hlbWEKLSAgICogQHBhcmFtIG5zIC0KLSAgICogICAgICAgICAgdGhlIHJlbGV2YW50IG5hbWVzcGFjZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZml4KFhTRFNjaGVtYSBzY2hlbWEsIFN0cmluZyBucykKLSAgewotICAgIFN0cmluZyBrZXkgPSAiIjsKLSAgICBpZiAoKHNjaGVtYSAhPSBudWxsKSAmJiAobnMgIT0gbnVsbCkpCi0gICAgewotICAgICAgTWFwIG1hcCA9IHNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICBJdGVyYXRvciBpdGVyID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBrZXlPYmogPSBpdGVyLm5leHQoKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbWFwLmdldChrZXlPYmopOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS50b1N0cmluZygpLmVxdWFscyhucykpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoa2V5T2JqICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAga2V5ID0ga2V5T2JqLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBrZXkgPSAiIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGtleTsKLSAgfQotICAvKioKLSAgICogVGhlIEZhY3RvcnkgZm9yIHRoZSBYU0QgYWRhcHRlciBtb2RlbC4gSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoCi0gICAqIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTREFkYXB0ZXJGYWN0b3J5SW1wbCBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotICB7Ci0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpCi0gICAgewotICAgICAgWFNEU3dpdGNoIHhzZFN3aXRjaCA9IG5ldyBYU0RTd2l0Y2goKQotICAgICAgewotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RXaWxkY2FyZChYU0RXaWxkY2FyZCBvYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV3IFhTRFdpbGRjYXJkQWRhcHRlcihvYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNETW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIob2JqZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZVVzZShYU0RBdHRyaWJ1dGVVc2Ugb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyKG9iamVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcihvYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNETW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWFNETW9kZWxHcm91cEFkYXB0ZXIob2JqZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFNjaGVtYShYU0RTY2hlbWEgb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RTY2hlbWFBZGFwdGVyKG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgICBPYmplY3QgbyA9IHhzZFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCkgdGFyZ2V0KTsKLSAgICAgIEFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKEFkYXB0ZXIpIG87Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFRocmVhZC5kdW1wU3RhY2soKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0KQotICAgIHsKLSAgICAgIHJldHVybiBhZGFwdCh0YXJnZXQsIHRoaXMpOwotICAgIH0KLSAgfQotICAvKioKLSAgICogWFNEQmFzZUFkYXB0ZXIgLS0gYW4gYWJzdHJhY3QgYmFzZSBub2RlIGluIHRoZSBtb2RlbC4gQWxsIG90aGVyIG1vZGVsIG5vZGVzCi0gICAqIGFyZSBkZXJpdmVkIGZyb20gaXQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFhTREJhc2VBZGFwdGVyIGV4dGVuZHMgQ01Ob2RlSW1wbAotICB7Ci0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3RJbXBsIGRvY3VtZW50YXRpb24gPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5vZGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4KLSAgICAgKiBBbGwgZGVyaXZlZCBjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3Qgd2FudCB0aGUKLSAgICAgKiBkZWZhdWx0IHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBvZiB0aGUgZ2l2ZW4gZmFjdG9yeSBpcyB0aGUgZmFjdG9yeSBmb3IgdGhpcyBYU0QgYWRhcHRlcgotICAgICAqIG1vZGVsLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0eXBlIC0KLSAgICAgKiAgICAgICAgICBhIGZhY3RvcnkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgaXMgdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhpcyBtb2RlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IHhzZEFkYXB0ZXJGYWN0b3J5SW1wbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZCBmb3IgdGhpcyBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX05TX1BSRUZJWF9RVUFMSUZJQ0FUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX05JTExBQkxFKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1VTRVNfTE9DQUxfRUxFTUVOVF9ERUNMQVJBVElPTlMpCi0gICAgICAgICAgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ET0NVTUVOVEFUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RPQ1VNRU5UQVRJT05fU09VUkNFKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RPQ1VNRU5UQVRJT05fTEFOR1VBR0UpCi0gICAgICAgICAgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9NT0ZfTk9USUZJRVIpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfREVGSU5JVElPTl9JTkZPKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFRklOSVRJT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfQ01ET0NVTUVOVCkKLSAgICAgICAgICB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0lTX05BTUVfU1BBQ0VfQVdBUkUpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfU1BFQykgfHwgc3VwZXIuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ05pbGxhYmxlJyBhdHRyaWJ1dGUuIFRoaXMgcmVwcmVzZW50cyB0aGUKLSAgICAgKiBuaWxsYWJsZSBpbmZvc2V0IHByb3BlcnR5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4gQWxsIGRlcml2ZWQKLSAgICAgKiBjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3Qgd2FudCB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ05pbGxhYmxlJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNOaWxsYWJsZSgpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNtZG9jdW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2YgdGhpcyBjbW5vZGUuIFRoZSBkZWZhdWx0Ci0gICAgICogdmFsdWUgaXMgbnVsbDsgQWxsIGRlcml2ZWQgY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgZG8KLSAgICAgKiBub3Qgd2FudCB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbWRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbiBlbXB0eQotICAgICAqIENNTm9kZUxpc3Q7IEFsbCBkZXJpdmVkIGNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGRvIG5vdAotICAgICAqIHdhbnQgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZG9jdW1lbnRhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG5hbWUuIFJldHVybnMgbnVsbCBpZiB0aGUKLSAgICAgKiBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9DTURPQ1VNRU5UKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01Eb2N1bWVudCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ET0NVTUVOVEFUSU9OKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0RG9jdW1lbnRhdGlvbigpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9VU0VTX0xPQ0FMX0VMRU1FTlRfREVDTEFSQVRJT05TKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQm9vbGVhbi5UUlVFOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9JU19OQU1FX1NQQUNFX0FXQVJFKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQm9vbGVhbi5UUlVFOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9OU19QUkVGSVhfUVVBTElGSUNBVElPTikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldE5TUHJlZml4UXVhbGlmaWNhdGlvbigpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9OSUxMQUJMRSkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGlzTmlsbGFibGUoKSA/IHhzaURvY3VtZW50Lm5pbEF0dHJpYnV0ZSA6IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX01PRl9OT1RJRklFUikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldEtleSgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9TUEVDKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0U3BlYygpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgICAgICB7Ci0gICAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudCgpOwotICAgICAgICAgIGlmIChjbURvY3VtZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hQWRhcHRlcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uTWFwIG1hcCA9ICgoWFNEU2NoZW1hQWRhcHRlcikgY21Eb2N1bWVudCkuYW5ub3RhdGlvbk1hcDsKLSAgICAgICAgICAgIGlmIChtYXAgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIHNwZWMgPSBnZXRTcGVjKCk7Ci0gICAgICAgICAgICAgIGlmIChzcGVjICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBtYXAuZ2V0UHJvcGVydHkoZ2V0U3BlYygpLCBwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAgICAKLQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZm9ybSBbYXR0cmlidXRlXSB3aGljaCBhZmZlY3RzIHRoZSB0YXJnZXQKLSAgICAgKiBuYW1lc3BhY2Ugb2YgbG9jYWxseSBzY29wZWQgZmVhdHVyZXMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG51bGwuIEFsbAotICAgICAqIGRlcml2ZWQgY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgZG8gbm90IHdhbnQgdGhlIGRlZmF1bHQKLSAgICAgKiB2YWx1ZS4gQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZvcm0gW2F0dHJpYnV0ZV0uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXROU1ByZWZpeFF1YWxpZmljYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBnZW5lcmFsIFhQYXRoIGV4cHJlc3Npb24gZm9yIHRoZSBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBnZW5lcmFsIFhQYXRoIGV4cHJlc3Npb24gZm9yIHRoZSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3BlYygpCi0gICAgewotICAgICAgcmV0dXJuICIvLyIgKyBnZXROb2RlTmFtZSgpOwotICAgIH0KLSAgfQotICAvKioKLSAgICogWFNEU2NoZW1hQWRhcHRlciBpbXBsZW1lbnRzIENNRG9jdW1lbnQuIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsCi0gICAqIG9iamVjdCAnU2NoZW1hJy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNEU2NoZW1hQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01Eb2N1bWVudAotICB7Ci0gICAgcHJvdGVjdGVkIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gICAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBuYW1lZE5vZGVNYXA7Ci0gICAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBlbnRpdHlOb2RlTWFwOwotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uTWFwIGFubm90YXRpb25NYXAgPSBuZXcgQW5ub3RhdGlvbk1hcCgpOwotICAgIHByb3RlY3RlZCBIYXNodGFibGUgc3Vic3RpdHV0aW9uR3JvdXBUYWJsZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSB4c2RTY2hlbWEgLQotICAgICAqICAgICAgICAgIHRoZSBzY2hlbWEgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgWFNEU2NoZW1hQWRhcHRlcihYU0RTY2hlbWEgeHNkU2NoZW1hKQotICAgIHsKLSAgICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUgd2hpY2ggaXMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYQotICAgICAqIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGZvciB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWxlbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmaWxlbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICAvLyBTZWUgYnVpbGRDTURvY3VtZW50KCkgYWJvdmUuCi0gICAgICByZXR1cm4geHNkU2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgY2xhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9UQVJHRVRfTkFNRVNQQUNFX1VSSSkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9JTVBPUlRFRF9OQU1FU1BBQ0VfSU5GTykgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9OQU1FU1BBQ0VfSU5GTykKLSAgICAgICAgICB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0VMRU1FTlRfRk9STV9ERUZBVUxUKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0FOTk9UQVRJT05fTUFQKSB8fCBzdXBlci5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhIHByZWZpeCBpcyBnbG9iYWxseSByZXF1aXJlZCBmb3IgZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHhzZFNjaGVtYSAtCi0gICAgICogICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgc2NoZW1hIG5vZGUuCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgcHJlZml4IGlzIGdsb2JhbGx5IHJlcXVpcmVkIGZvciBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ByZWZpeFJlcXVpcmVkKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gICAgewotICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgICAgaWYgKHhzZFNjaGVtYS5pc1NldEVsZW1lbnRGb3JtRGVmYXVsdCgpKQotICAgICAgICByZXN1bHQgPSAhKHhzZFNjaGVtYS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKS5nZXRWYWx1ZSgpID09IFhTREZvcm0uUVVBTElGSUVEKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLiBSZXR1cm5zIG51bGwgaWYgdGhlCi0gICAgICogcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfVEFSR0VUX05BTUVTUEFDRV9VUkkpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0lNUE9SVEVEX05BTUVTUEFDRV9JTkZPKSkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBnZXRJbXBvcnRlZE5hbWVzcGFjZUluZm8oeHNkU2NoZW1hLCBsaXN0KTsKLSAgICAgICAgcmVzdWx0ID0gbGlzdDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfTkFNRVNQQUNFX0lORk8pKQotICAgICAgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgICAgIGluZm8udXJpID0geHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpbmZvLnByZWZpeCA9IGdldFByZWZpeCh4c2RTY2hlbWEsIGluZm8udXJpKTsKLSAgICAgICAgaW5mby5sb2NhdGlvbkhpbnQgPSBudWxsOyAvLyBub3RlIHRoYXQgdGhpcyBsb2NhdGlvbkhpbnQgaW5mbyBpcyBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSByb290IHhzZCBmaWxlCi0gICAgICAgIGluZm8uaXNQcmVmaXhSZXF1aXJlZCA9IGlzUHJlZml4UmVxdWlyZWQoeHNkU2NoZW1hKTsKLSAgICAgICAgbGlzdC5hZGQoaW5mbyk7Ci0gICAgICAgIGdldEltcG9ydGVkTmFtZXNwYWNlSW5mbyh4c2RTY2hlbWEsIGxpc3QpOwotICAgICAgICByZXN1bHQgPSBsaXN0OwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9DT01QTEVURV9OQU1FU1BBQ0VfSU5GTykpCi0gICAgICB7Ci0gICAgCSAgcmVzdWx0ID0gZ2V0QWxsTmFtZXNwYWNlSW5mbygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9FTEVNRU5UX0ZPUk1fREVGQVVMVCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHhzZFNjaGVtYS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKS5nZXROYW1lKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0FOTk9UQVRJT05fTUFQKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gYW5ub3RhdGlvbk1hcDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImFsbEVsZW1lbnRzIikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldEFsbEVsZW1lbnRzKCk7Ci0gICAgICB9ICAKLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKCJnZXRFbGVtZW50Rm9yVHlwZSMiKSkKLSAgICAgIHsKLSAgICAgICAgaW50IGluZGV4ID0gcHJvcGVydHlOYW1lLmluZGV4T2YoIiMiKTsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZyhpbmRleCArIDEsIHByb3BlcnR5TmFtZS5sZW5ndGgoKSk7Ci0gICAgICAgIC8vCi0gICAgICAgIC8vCi0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0geHNkU2NoZW1hLnJlc29sdmVUeXBlRGVmaW5pdGlvbih0eXBlTmFtZSk7Ci0gICAgICAgIGlmICh0ZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgTG9jYWxFbGVtZW50VmlzaXRvciBsb2NhbEVsZW1lbnRWaXNpdG9yID0gbmV3IExvY2FsRWxlbWVudFZpc2l0b3IoKTsKLSAgICAgICAgICBsb2NhbEVsZW1lbnRWaXNpdG9yLnZpc2l0VHlwZURlZmluaXRpb24odGQpOwotICAgICAgICAgIHJlc3VsdCA9IGxvY2FsRWxlbWVudFZpc2l0b3IuZ2V0Q01OYW1lZE5vZGVNYXAoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHYXRoZXIgaW5mb3JtYXRpb24gb24gbmFtZXNwYWNlcyB1c2VkIGluIGV4dGVybmFsIHJlZmVyZW5jZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRoZVhTRFNjaGVtYSAtCi0gICAgICogICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgc2NoZW1hIG5vZGUKLSAgICAgKiBAcGFyYW0gbGlzdCAtCi0gICAgICogICAgICAgICAgdGhlIGxpc3Qgb2YgaW1wb3J0ZWQgbmFtZXNwYWNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZXRJbXBvcnRlZE5hbWVzcGFjZUluZm8oWFNEU2NoZW1hIHRoZVhTRFNjaGVtYSwgTGlzdCBsaXN0KQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGVYU0RTY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBYU0RTY2hlbWFDb250ZW50IGNvbnRlbnQgPSAoWFNEU2NoZW1hQ29udGVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTREltcG9ydCkKLSAgICAgICAgewotICAgICAgICAgIFhTREltcG9ydCB4SW1wb3J0ID0gKFhTREltcG9ydCkgY29udGVudDsKLSAgICAgICAgICBYU0RTY2hlbWEgaW1wb3J0ZWRYU0RTY2hlbWEgPSB4SW1wb3J0LmdldFJlc29sdmVkU2NoZW1hKCk7Ci0gICAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLSAgICAgICAgICBpbmZvLnVyaSA9IHhJbXBvcnQuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgaW5mby5wcmVmaXggPSBnZXRQcmVmaXgoaW1wb3J0ZWRYU0RTY2hlbWEsIGluZm8udXJpKTsKLSAgICAgICAgICBpbmZvLmxvY2F0aW9uSGludCA9IHhJbXBvcnQuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICAgICAgICBpZiAoaW1wb3J0ZWRYU0RTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbmZvLmlzUHJlZml4UmVxdWlyZWQgPSBpc1ByZWZpeFJlcXVpcmVkKGltcG9ydGVkWFNEU2NoZW1hKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbGlzdC5hZGQoaW5mbyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHNldCBvZiBuYW1lZCAodG9wLWxldmVsKSBlbGVtZW50IGRlY2xhcmF0aW9ucyBmb3IgdGhpcyBzY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzZXQgb2YgbmFtZWQgKHRvcC1sZXZlbCkgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkKLSAgICB7Ci0gICAgICBpZiAobmFtZWROb2RlTWFwID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5hbWVkTm9kZU1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vdGUgdGhhdCBpZiB3ZSBjYWxsIHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkKLSAgICAgICAgLy8gd2UgZ2V0ICdtb3JlJyBlbGVtZW50cyB0aGFuIHdlIHJlYWxseSB3YW50IHNpbmNlIHdlIGFsc28KLSAgICAgICAgLy8gZ2V0ICdpbXBvcnRlZCcgZWxlbWVudHMuICBCZWxvdyB3ZSB0ZXN0IHRvIGVuc3VyZSB0aGUgZWxlbWVudHMKLSAgICAgICAgLy8gYWN0dWFsbHkgaGF2ZSB0aGUgc2FtZSB0YXJnZXQgbmFtZXNwYWNlIGFzIHRoZSBzY2hlbWEuCi0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVkID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsID8gdGFyZ2V0TmFtZXNwYWNlLmVxdWFscyhlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSkgOiBlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKSBnZXRBZGFwdGVyKGVkKTsKLSAgICAgICAgICAgIG5hbWVkTm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoYWRhcHRlci5nZXROb2RlTmFtZSgpLCBhZGFwdGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBuYW1lZE5vZGVNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYnVpbHQtaW4gZW50aXR5IGRlY2xhcmF0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBidWlsdC1pbiBlbnRpdHkgZGVjbGFyYXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpCi0gICAgewotICAgICAgaWYgKGVudGl0eU5vZGVNYXAgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZW50aXR5Tm9kZU1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICAgICAgLy8gYWRkIHRoZSBidWlsdCBpbiBlbnRpdHkgZGVjbGFyYXRpb25zCi0gICAgICAgIGVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJhbXAiLCBuZXcgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwoImFtcCIsICImIikpOwotICAgICAgICBlbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgibHQiLCBuZXcgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwoImx0IiwgIjwiKSk7Ci0gICAgICAgIGVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJndCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgiZ3QiLCAiPiIpKTsKLSAgICAgICAgZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoInF1b3QiLCBuZXcgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwoInF1b3QiLCAiXCIiKSk7Ci0gICAgICAgIGVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJhcG9zIiwgbmV3IENNRW50aXR5RGVjbGFyYXRpb25JbXBsKCJhcG9zIiwgIiciKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZW50aXR5Tm9kZU1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICogRUxFTUVOVF9ERUNMQVJBVElPTiwgRU5USVRZX0RFQ0xBUkFUSU9OLCBHUk9VUCwgTkFNRV9TUEFDRSBvcgotICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiBET0NVTUVOVDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybnMgbnVsbC4gISEhIFdoeSBhcmUgd2Ugbm90IGltcGxlbWVudGluZyB0aGlzPz8/PyBAcmV0dXJuIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldEFsbEVsZW1lbnRzKCkKLSAgICB7Ci0gICAgICBDTU5hbWVkTm9kZU1hcEltcGwgbWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbilpLm5leHQoKTsKLSAgICAgICAgbWFwLnB1dChlZCk7ICAgICAgICAgICAKLSAgICAgICAgYWRkTG9jYWxFbGVtZW50RGVmaW5pdGlvbnMobWFwLCBlZCk7ICAgICAgICAgICAgICAKLSAgICAgIH0gICAgIAotICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkTG9jYWxFbGVtZW50RGVmaW5pdGlvbnMoQ01OYW1lZE5vZGVNYXBJbXBsIG1hcCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIENNTmFtZWROb2RlTWFwIGxvY2FsRWxlbWVudE1hcCA9IHBhcmVudEVsZW1lbnREZWNsYXJhdGlvbi5nZXRMb2NhbEVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsb2NhbEVsZW1lbnRNYXAuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24paS5uZXh0KCk7Ci0gICAgICAgIGlmIChtYXAuZ2V0TmFtZWRJdGVtKGVkLmdldE5vZGVOYW1lKCkpID09IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIG1hcC5wdXQoZWQpOyAgICAgICAgCi0gICAgICAgICAgYWRkTG9jYWxFbGVtZW50RGVmaW5pdGlvbnMobWFwLCBlZCk7Ci0gICAgICAgIH0gIAotICAgICAgfSAgICAgICAgICAgICAgIAotICAgIH0gCi0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGEgTGlzdCBvZiBOYW1lc3BhY2VJbmZvIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgZ2l2ZW4gc2NoZW1hIAotICAgICAqIGFuZCB0aGUgdGFyZ2V0IG5hbWVzcGFjZXMgb2YgYWxsIGl0cyByZWN1cnNpdmVseSBpbXBvcnRlZC9pbmNsdWRlZCByZWZlcmVuY2VkIHNjaGVtYXMuIEFsbCBuYW1lc3BhY2UKLSAgICAgKiBwcmVmaXhlcyBpbiB0aGUgbGlzdCBhcmUgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUuIFByZWZpeCBjb2xsaXRpb25zIGFyZSByZXNvbHZlZCBieSBjb25jYXRlbmF0aW5nCi0gICAgICogaW50ZWdlciBudW1iZXJzIHRvIGVhY2ggcmVwZWF0ZWQgcHJlZml4IGZvdW5kIGkuZS4gdG5zLCB0bnMxLCB0bnMyLi4uCi0gICAgICogQWxsIHNjaGVtYSBsb2NhdGlvbnMgaW4gdGhlIGxpc3QgYXJlIGZvcm1hdGVkIGFzIGVuY29kZWQgVVJJcyByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gc2NoZW1hLgotICAgICAqIFNjaGVtYXMgdGhhdCBhcmUgaW1wb3J0ZWQvaW5jbHVkZWQgYnV0IG5vdCByZWZlcmVuY2VkIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgbGlzdC4KLSAgICAgKiBAcmV0dXJuIExpc3Qgb2YgTmFtZXNwYWNlSW5mbyBvYmplY3RzCi0gICAgICogCi0gICAgICovCi0JcHVibGljIExpc3QgZ2V0QWxsTmFtZXNwYWNlSW5mbygpIHsKLQkJTGlzdCBuYW1lc3BhY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHJlc291cmNlcyAgPSB4c2RTY2hlbWEuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKTsKLQkJSXRlcmF0b3IgaSA9IHJlc291cmNlcy5pdGVyYXRvcigpOwotCQl3aGlsZShpLmhhc05leHQoKSkgewotCQkJWFNEUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKFhTRFJlc291cmNlSW1wbCkgaS5uZXh0KCk7Ci0JCQlpZihyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJWFNEU2NoZW1hIHNjaGVtYSA9IHJlc291cmNlLmdldFNjaGVtYSgpOwotCQkJCWlmKCFpc0RhdGFJbk5hbWVzcGFjZUxpc3QobmFtZXNwYWNlTGlzdCwgMCwgc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKSkgewotCQkJCQlOYW1lc3BhY2VJbmZvIGluZm8gPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotCQkJCQlpbmZvLnVyaSA9IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQkJCQkJaW5mby5pc1ByZWZpeFJlcXVpcmVkID0gaXNQcmVmaXhSZXF1aXJlZChzY2hlbWEpOwotCQkJCQlpbmZvLnByZWZpeCA9IGdldFByZWZpeChzY2hlbWEsc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJCQkJaWYoImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIuZXF1YWxzKGluZm8udXJpKSkgewotICAgIAkJCQkJaW5mby5wcmVmaXggPSAieG1sIjsKLSAgICAJCQkJfSBlbHNlIGlmKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zIi5lcXVhbHMoaW5mby51cmkpKSB7Ci0gICAgCQkJCQlpbmZvLnByZWZpeCA9ICJ4bWxucyI7Ci0gICAgCQkJCX0gZWxzZSB7Ci0gICAgCQkJCQlpZihpbmZvLnVyaSAhPSBudWxsICYmIGluZm8udXJpICE9ICIiKSB7Ci0JICAgIAkJCQkJaW50IG4gPSAxOwotCSAgICAJICAgIAkJCWlmKGluZm8ucHJlZml4ID09IG51bGwgfHwgaW5mby5wcmVmaXguZXF1YWxzKCIiKSkgewotCSAgICAJICAgIAkJCQlpbmZvLnByZWZpeCA9ICJwIjsKLQkgICAgCSAgICAJCQl9Ci0JICAgIAkgICAgCQkJU3RyaW5nIHByZWZpeCA9IGluZm8ucHJlZml4OwotCSAgICAJICAgIAkJCXdoaWxlKGlzRGF0YUluTmFtZXNwYWNlTGlzdChuYW1lc3BhY2VMaXN0LCAxLCBpbmZvLnByZWZpeCkpIHsKLQkgICAgCSAgICAJCQkJaW5mby5wcmVmaXggPSBwcmVmaXggKyBuKys7Ci0JICAgIAkgICAgCQkJfQotICAgIAkJCQkJfQotICAgIAkJCQl9Ci0JICAgIAkJCVVSSSByZWxhdGl2ZSA9IFVSSS5jcmVhdGVVUkkoeHNkU2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCksIHRydWUpOwotCQkJCQlVUkkgYWJzb2x1dGUgPSBVUkkuY3JlYXRlVVJJKHNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpLCB0cnVlKTsKLQkJCQkJVVJJIHJlc29sdmVkUmVsYXRpdmUgPSBhYnNvbHV0ZS5kZXJlc29sdmUocmVsYXRpdmUpOwotCQkJCQlpbmZvLmxvY2F0aW9uSGludCA9IHJlc29sdmVkUmVsYXRpdmUudG9TdHJpbmcoKTsKLQkgICAgCQkJbmFtZXNwYWNlTGlzdC5hZGQoaW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lc3BhY2VMaXN0OwkKLQl9Ci0KLQotICAgIC8qKgotICAgICAqIFNlYXJjaGVzIGZvciBhIGdpdmVuIHZhbHVlIGluIGEgbGlzdCBvZiBuYW1lc3BhY2VzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VMaXN0OglMaXN0IG9mIE5hbWVzcGFjZUluZm8gb2JqZWN0cwotICAgICAqIEBwYXJhbSBkYXRhOgkJCQlpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgZGF0YSBpbiB0aGUgbmFtZXNwYWNlIGFzIGZvbGxvd3M6Ci0gICAgICogCQkJCQkJCQkwOgl1cmkKLSAgICAgKiAJCQkJCQkJCTE6CXByZWZpeAotICAgICAqIAkJCQkJCQkJMjoJbG9jYXRpb25IaW50Ci0gICAgICogQHBhcmFtIHZhbHVlCQkJCVN0cmluZyBjb250YWluaW5nIHRoZSB2YWx1ZSBmb3Igc2VhcmNoCi0gICAgICogQHJldHVybgkJCQkJdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgZm91bmQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RhdGFJbk5hbWVzcGFjZUxpc3QoTGlzdCBuYW1lc3BhY2VMaXN0LCBpbnQgZGF0YSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChuYW1lc3BhY2VMaXN0ICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGkgPSBuYW1lc3BhY2VMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlOYW1lc3BhY2VJbmZvIG5hbWVzcGFjZUluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQkJc3dpdGNoKGRhdGEpIHsKLQkJCQkJY2FzZSAwOglpZiAobmFtZXNwYWNlSW5mby51cmkgIT0gbnVsbCAmJiBuYW1lc3BhY2VJbmZvLnVyaS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQljYXNlIDE6CWlmIChuYW1lc3BhY2VJbmZvLnByZWZpeCAhPSBudWxsICYmIG5hbWVzcGFjZUluZm8ucHJlZml4LmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJCWNhc2UgMjoJaWYgKG5hbWVzcGFjZUluZm8ubG9jYXRpb25IaW50ICE9IG51bGwgJiYgbmFtZXNwYWNlSW5mby5sb2NhdGlvbkhpbnQuZXF1YWxzKHZhbHVlKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLSAgICAJcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICAvKioKLSAgICogWFNEQXR0cmlidXRlVXNlQWRhcHRlciBpbXBsZW1lbnRzIENNQXR0cmlidXRlRGVjbGFyYXRpb24uIEEgcmVwcmVzZW50YXRpb24KLSAgICogb2YgdGhlIG1vZGVsIG9iamVjdCAnQXR0cmlidXRlIFVzZScuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNQXR0cmlidXRlRGVjbGFyYXRpb24KLSAgewotICAgIC8vIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgWE1MIFNjaGVtYSBub2RlCi0gICAgcHJvdGVjdGVkIFhTREF0dHJpYnV0ZVVzZSB4c2RBdHRyaWJ1dGVVc2U7Ci0gICAgLy8gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICBwcm90ZWN0ZWQgQ01EYXRhVHlwZSBkYXRhVHlwZSA9IG5ldyBEYXRhVHlwZUltcGwoKTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSB4c2RBdHRyaWJ1dGVVc2UgLQotICAgICAqICAgICAgICAgIHRoZSBYTUwgU2NoZW1hIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIoWFNEQXR0cmlidXRlVXNlIHhzZEF0dHJpYnV0ZVVzZSkKLSAgICB7Ci0gICAgICB0aGlzLnhzZEF0dHJpYnV0ZVVzZSA9IHhzZEF0dHJpYnV0ZVVzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RBdHRyaWJ1dGVVc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGdlbmVyYWwgWFBhdGggZXhwcmVzc2lvbiBmb3IgdGhlIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGdlbmVyYWwgWFBhdGggZXhwcmVzc2lvbiBmb3IgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTcGVjKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIi8vQCIgKyBnZXRBdHRyTmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5vZGUuIFRoZSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBDTU5vZGUgY2xhc3MKLSAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICogRE9DVU1FTlRBVElPTikuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIEFUVFJJQlVURV9ERUNMQVJBVElPTjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBub2RlLiBTaW1pbGFyIHRvIGdldEF0dHJOYW1lKCkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0QXR0ck5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXRFbnVtQXR0ciBtZXRob2QKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEudXRpbC5FbnVtZXJhdGlvbgotICAgICAqIEBkZXByZWNhdGVkIC0tIHRvIGJlIHJlcGxhY2VkIGluIGZ1dHVyZSB3aXRoIGFkZGl0aW9uYWwgQ01EYXRhVHlwZQotICAgICAqICAgICAgICAgICAgIG1ldGhvZHMgKGN1cnJlbnRseSBmb3VuZCBvbiBDTURhdGFUeXBlSGVscGVyKQotICAgICAqLwotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbnVtQXR0cigpCi0gICAgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBhdHRyaWJ1dGUuIFNpbWlsYXIgdG8gZ2V0Tm9kZU5hbWUoKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0ck5hbWUoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RBdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIGRhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBkZWZhdWx0IG9yIGZpeGVkIGNvbnN0cmFpbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgb3IgZml4ZWQgY29uc3RyYWludC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpCi0gICAgewotICAgICAgcmV0dXJuIGRhdGFUeXBlLmdldEltcGxpZWRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHVzYWdlIGNvbnN0cmFpbnQgZm9yIHRoaXMgYXR0cmlidXRlLiBUaGUgdXNhZ2VzIGFyZSBkZWZpbmVkCi0gICAgICogaW4gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBjbGFzcyAoT1BUSU9OQUwsIFJFUVVJUkVELCBGSVhFRCBvcgotICAgICAqIFBST0hJQklURUQpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHVzYWdlIGNvbnN0cmFpbnQgZm9yIHRoaXMgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VXNhZ2UoKQotICAgIHsKLSAgICAgIGludCB1c2VLaW5kID0gT1BUSU9OQUw7Ci0gICAgICBzd2l0Y2ggKHhzZEF0dHJpYnV0ZVVzZS5nZXRVc2UoKS5nZXRWYWx1ZSgpKQotICAgICAgewotICAgICAgICBjYXNlIFhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5Lk9QVElPTkFMIDogewotICAgICAgICAgIHVzZUtpbmQgPSBPUFRJT05BTDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5LlBST0hJQklURUQgOiB7Ci0gICAgICAgICAgdXNlS2luZCA9IFBST0hJQklURUQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeS5SRVFVSVJFRCA6IHsKLSAgICAgICAgICB1c2VLaW5kID0gUkVRVUlSRUQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB1c2VLaW5kOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZvcm0gW2F0dHJpYnV0ZV0gd2hpY2ggYWZmZWN0cyB0aGUgdGFyZ2V0Ci0gICAgICogbmFtZXNwYWNlIG9mIGxvY2FsbHkgc2NvcGVkIGZlYXR1cmVzLiBJZiB0aGUgZm9ybSBpcyBub3Qgc2V0IG9uIHRoaXMKLSAgICAgKiBhdHRyaWJ1dGUsIHRoZW4gc2VlIGlmIHRoZXJlIGlzIGEgZ2xvYmFsbHkgZGVmaW5lZCBkZWZhdWx0LiBAcmV0dXJuIHRoZQotICAgICAqIHZhbHVlIG9mIHRoZSBmb3JtIFthdHRyaWJ1dGVdLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0TlNQcmVmaXhRdWFsaWZpY2F0aW9uKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgZm9ybSA9IG51bGw7Ci0gICAgICBpZiAoeHNkQXR0cmlidXRlVXNlLmdldENvbnRlbnQoKSAhPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKSkKLSAgICAgIHsKLSAgICAgIAlmb3JtID0gICJxdWFsaWZpZWQiOwotICAgICAgfQkKLSAgICAgIGVsc2UgaWYgKHhzZEF0dHJpYnV0ZVVzZS5nZXRDb250ZW50KCkuaXNTZXRGb3JtKCkpCi0gICAgICB7Ci0gICAgICAgIGZvcm0gPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0Q29udGVudCgpLmdldEZvcm0oKS5nZXROYW1lKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICBmb3JtID0gc2NoZW1hLmdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkuZ2V0TmFtZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIGZvcm07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3QgZ2V0RG9jdW1lbnRhdGlvbigpCi0gICAgewotICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYW4gYXR0cmlidXRlIHJlZmVyZW5jZSBmaXJzdAotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24geHNkQXR0cmlidXRlUmVmID0geHNkQXR0cmlidXRlVXNlLmdldENvbnRlbnQoKTsKLSAgICAgIGlmICh4c2RBdHRyaWJ1dGVSZWYgIT0gbnVsbCAmJiB4c2RBdHRyaWJ1dGVSZWYuaXNBdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgewotICAgICAgICAvLyBEZXRlcm1pbmUgaWYgaXQgaGFzIGFubm90YXRpb25zCi0gICAgICAgIGJvb2xlYW4gcmVmSGFzRG9jdW1lbnRhdGlvbiA9IGZhbHNlOwotICAgICAgICBYU0RBbm5vdGF0aW9uIHJlZkFubm90YXRpb24gPSB4c2RBdHRyaWJ1dGVSZWYuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgICBpZiAocmVmQW5ub3RhdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGRvY3VtZW50YXRpb24KLSAgICAgICAgICBpZiAoIXJlZkFubm90YXRpb24uZ2V0VXNlckluZm9ybWF0aW9uKCkuaXNFbXB0eSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlZkhhc0RvY3VtZW50YXRpb24gPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmVmSGFzRG9jdW1lbnRhdGlvbikKLSAgICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbnMocmVmQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIE90aGVyd2lzZSBwcm9jZWVkIHdpdGggZ2V0dGluZyB0aGUgZG9jdW1lbnRhdGlvbiBhcyB1c3VhbAotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24geHNkQXR0cmlidXRlRGVjbGFyYXRpb24gPSAgeHNkQXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7ICAgICAgCi0gICAgICBYU0RBbm5vdGF0aW9uIGFubm90YXRpb24gPSB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICAKLSAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9ucyhhbm5vdGF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbWRvY3VtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHRoaXMgY21ub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNtZG9jdW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoeHNkQXR0cmlidXRlVXNlLmdldFNjaGVtYSgpKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogWFNEQXR0cmlidXRlVXNlQWRhcHRlci5EYXRhVHlwZUltcGwgQW4gaW5uZXIgY2xhc3MgdG8gaG9sZCB0eXBlCi0gICAgICogaW5mb3JtYXRpb24gZm9yIHRoaXMgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBEYXRhVHlwZUltcGwgaW1wbGVtZW50cyBDTURhdGFUeXBlCi0gICAgewotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgICAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEVOVElUWV9ERUNMQVJBVElPTiwgR1JPVVAsIE5BTUVfU1BBQ0Ugb3IKLSAgICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgbm9kZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBDTU5vZGUuREFUQV9UWVBFOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlLiBTYW1lIGFzIGdldERhdGFUeXBlTmFtZSgpLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBnZXREYXRhVHlwZU5hbWUoKTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZCBmb3IgdGhpcyBjbGFzcy4KLSAgICAgICAqIAotICAgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkLgotICAgICAgICovCi0gICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgICAgewotICAgIAkgIHJldHVybiAoUFJPUEVSVFlfV0hJVEVTUEFDRV9GQUNFVC5lcXVhbHMocHJvcGVydHlOYW1lKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLiBSZXR1cm5zIG51bGwgaWYgdGhlCi0gICAgICAgKiBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAgICogCi0gICAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAgICovCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgICB7Ci0gICAgCSAgaWYoUFJPUEVSVFlfV0hJVEVTUEFDRV9GQUNFVC5lcXVhbHMocHJvcGVydHlOYW1lKSkKLQkJICAJcmV0dXJuIGdldFdoaXRlU3BhY2VGYWNldFZhbHVlKCk7Ci0gICAgCSAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHR5cGUuIFNhbWUgYXMgZ2V0Tm9kZU5hbWUoKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHR5cGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKCkKLSAgICAgIHsKLSAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2MgPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBzYy5nZXROYW1lKCk7Ci0gICAgICAgIHJldHVybiB0eXBlTmFtZSAhPSBudWxsID8gdHlwZU5hbWUgOiAic3RyaW5nIjsgIC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBraW5kIG9mIGNvbnN0cmFpbnQ6IG5vbmUsIGRlZmF1bHQgb3IgZml4ZWQuIFRoZSBraW5kcyBhcmUKLSAgICAgICAqIGRlZmluZWQgaW4gQ01EYXRhVHlwZSBjbGFzcyAoSU1QTElFRF9WQUxVRV9OT05FLCBJTVBMSUVEX1ZBTFVFX0ZJWEVEIG9yCi0gICAgICAgKiBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQpLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSBraW5kIG9mIGNvbnN0cmFpbnQ6IG5vbmUsIGRlZmF1bHQgb3IgZml4ZWQuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBpbnQgZ2V0SW1wbGllZFZhbHVlS2luZCgpCi0gICAgICB7Ci0gICAgICAgIGludCByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0gICAgICAgIGlmICh4c2RBdHRyaWJ1dGVVc2UuaXNTZXRDb25zdHJhaW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoeHNkQXR0cmlidXRlVXNlLmdldENvbnN0cmFpbnQoKS5nZXRWYWx1ZSgpID09IFhTRENvbnN0cmFpbnQuREVGQVVMVCkKLSAgICAgICAgICAgIHJlc3VsdCA9IElNUExJRURfVkFMVUVfREVGQVVMVDsKLSAgICAgICAgICBlbHNlIGlmICh4c2RBdHRyaWJ1dGVVc2UuZ2V0Q29uc3RyYWludCgpLmdldFZhbHVlKCkgPT0gWFNEQ29uc3RyYWludC5GSVhFRCkKLSAgICAgICAgICAgIHJlc3VsdCA9IElNUExJRURfVkFMVUVfRklYRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBvciBmaXhlZCBjb25zdHJhaW50LgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBvciBmaXhlZCBjb25zdHJhaW50LgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nIGdldEltcGxpZWRWYWx1ZSgpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAoeHNkQXR0cmlidXRlVXNlLmlzU2V0Q29uc3RyYWludCgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0geHNkQXR0cmlidXRlVXNlLmdldExleGljYWxWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgZW51bWVyYXRlZCB2YWx1ZXMgZm9yIHRoZSBhdHRyaWJ1dGUgdHlwZS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgZW51bWVyYXRlZCB2YWx1ZXMgZm9yIHRoZSBhdHRyaWJ1dGUgdHlwZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZ1tdIGdldEVudW1lcmF0ZWRWYWx1ZXMoKQotICAgICAgewotICAgICAgICByZXR1cm4gZ2V0RW51bWVyYXRlZFZhbHVlc0ZvclR5cGUoZ2V0WFNEVHlwZSgpKTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBHZW5lcmF0ZSBhIHZhbGlkIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIGJhc2VkIG9uIGl0cyB0eXBlLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIGEgdmFsaWQgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgYmFzZWQgb24gaXRzIHR5cGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IHhzZEF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgICAgICByZXR1cm4gWFNEVHlwZVV0aWwuZ2V0SW5zdGFuY2VWYWx1ZShhdHRyLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpKTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgdHlwZSBkZWZpbml0aW9uLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgdHlwZSBkZWZpbml0aW9uLgotICAgICAgICovCi0gICAgICBwcm90ZWN0ZWQgWFNEVHlwZURlZmluaXRpb24gZ2V0WFNEVHlwZSgpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICAgICAgcmV0dXJuIGF0dHIuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qKgotICAgICAgICogT2J0YWlucyB0aGUgd2hpdGVzcGFjZSBmYWNldCBvZiB0aGUgWFNEIHNpbXBsZSB0eXBlLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIFRoZSB3aGl0ZXNwYWNlIGZhY2V0IGZvciB0aGUgWFNEIHR5cGUuIElmIG5vbmUgaXMKLSAgICAgICAqIGRlZmluZWQsIG9yIGl0IGlzIGEgY29tcGxleCB0eXBlLCBudWxsLgotICAgICAgICovCi0gICAgICBwcml2YXRlIFN0cmluZyBnZXRXaGl0ZVNwYWNlRmFjZXRWYWx1ZSgpCi0gICAgICB7Ci0gICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGRlZiA9IGdldFhTRFR5cGUoKS5nZXRTaW1wbGVUeXBlKCk7Ci0gICAgICAgIHJldHVybiAoZGVmICE9IG51bGwgJiYgZGVmLmdldEVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCgpICE9IG51bGwpID8gZGVmLmdldEVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCgpLmdldExleGljYWxWYWx1ZSgpIDogbnVsbCA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBFbGVtZW50RGVjbGFyYXRpb25CYXNlSW1wbCBpbXBsZW1lbnRzIENNRWxlbWVudERlY2xhcmF0aW9uLiBUaGlzIGlzIHRoZQotICAgKiBiYXNlIGNsYXNzIGZvciBYU0RFbGVtZW50RGVjbGFyYXRpb24gYW5kIERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25JbXBsLgotICAgKiAKLSAgICogQWJzdHJhY3QgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGFyZTogcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRLZXkoKTsgcHVibGljCi0gICAqIGFic3RyYWN0IE9iamVjdCBnZXROU1ByZWZpeFF1YWxpZmljYXRpb24oKTsgcHVibGljIGFic3RyYWN0Ci0gICAqIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsgcHVibGljIGFic3RyYWN0Ci0gICAqIFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGUoKTsgcHVibGljIGFic3RyYWN0IExpc3QgZ2V0WFNJVHlwZXMoKTsgcHVibGljCi0gICAqIGFic3RyYWN0IENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nCi0gICAqIHVyaVF1YWxpZmllZFR5cGVOYW1lKTsgcHVibGljIGFic3RyYWN0IENNTm9kZSBnZXREZWZpbml0aW9uKCk7IHB1YmxpYwotICAgKiBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmaW5pdGlvbkluZm8oKTsgcHVibGljIGFic3RyYWN0IENNTm9kZUxpc3RJbXBsCi0gICAqIGdldFN1YnN0aXR1dGlvbkdyb3VwKCk7Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEVsZW1lbnREZWNsYXJhdGlvbkJhc2VJbXBsIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbgotICB7Ci0gICAgcHJvdGVjdGVkIENNRGF0YVR5cGUgZGF0YVR5cGUgPSBuZXcgRGF0YVR5cGVJbXBsKCk7Ci0gICAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwIG5hbWVkTm9kZU1hcDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgWFNERWxlbWVudERlY2xhcmF0aW9uIGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0UmVzb2x2ZWRYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5vZGUuIFRoZSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBDTU5vZGUgY2xhc3MKLSAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICogRE9DVU1FTlRBVElPTikuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIEVMRU1FTlRfREVDTEFSQVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbm9kZS4gVGhlIHNhbWUgYXMgZ2V0RWxlbWVudE5hbWUoKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRFbGVtZW50TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBlbGVtZW50LiBUaGUgc2FtZSBhcyBnZXROb2RlTmFtZSgpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKQotICAgIHsKLSAgICAgIFN0cmluZyByZXN1bHQgPSBnZXRSZXNvbHZlZFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldE5hbWUoKTsKLSAgICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6ICIiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkIGZvciB0aGlzIGNsYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfWFNJVFlQRVMpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfREVSSVZFRF9FTEVNRU5UX0RFQ0xBUkFUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1NVQlNUSVRVVElPTl9HUk9VUCkKLSAgICAgICAgICB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0FCU1RSQUNUKSB8fCBzdXBlci5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUgd2hpY2ggaXMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYQotICAgICAqIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGZvciB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldEtleSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMgZGVmaW5lZCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBhdHRyaWJ1dGVzIGRlZmluZWQgZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpCi0gICAgewotICAgICAgQ01OYW1lZE5vZGVNYXBJbXBsIG1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZ2V0WFNEVHlwZSgpOwotICAgICAgZ2V0QXR0cmlidXRlcyhtYXAsIHRkKTsKLSAgICAgIGFkZFhTSVR5cGVBdHRyaWJ1dGUobWFwKTsKLSAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2F0aGVyIHRoZSBzZXQgb2YgYXR0cmlidXRlcyBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAtCi0gICAgICogICAgICAgICAgdXNlZCBmb3IgcmV0dXJuaW5nIHRoZSBzZXQgb2YgYXR0cmlidXRlcy4KLSAgICAgKiBAcGFyYW0geHNkVHlwZURlZmluaXRpb24gLQotICAgICAqICAgICAgICAgIHRoZSB0eXBlIGRlZmluaXRpb24gZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZXRBdHRyaWJ1dGVzKENNTmFtZWROb2RlTWFwSW1wbCBtYXAsIFhTRFR5cGVEZWZpbml0aW9uIHhzZFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGlmICh4c2RUeXBlRGVmaW5pdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ZCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHhzZFR5cGVEZWZpbml0aW9uOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjdGQuZ2V0QXR0cmlidXRlVXNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZSB4c2RBdHRyaWJ1dGVVc2UgPSAoWFNEQXR0cmlidXRlVXNlKSBpLm5leHQoKTsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQXR0cmlidXRlVXNlQWRhcHRlcikgZ2V0QWRhcHRlcih4c2RBdHRyaWJ1dGVVc2UpOwotICAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5nZXROb2RlTmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWFwLmdldEhhc2h0YWJsZSgpLnB1dChhZGFwdGVyLmdldE5vZGVOYW1lKCksIGFkYXB0ZXIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkKLSAgICB7Ci0gICAgICBDTUNvbnRlbnQgcmVzdWx0ID0gbnVsbDsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZ2V0WFNEVHlwZSgpOwotICAgICAgaWYgKHRkIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBEZXJpdmVkQ2hpbGRWaXNpdG9yIGRjdiA9IG5ldyBEZXJpdmVkQ2hpbGRWaXNpdG9yKHRkKTsKLSAgICAgICAgZGN2LnZpc2l0VHlwZURlZmluaXRpb24odGQpOwotICAgICAgICBDTU5vZGVMaXN0IG5vZGVMaXN0ID0gZGN2LmdldENoaWxkTm9kZUxpc3QoKTsKLSAgICAgICAgaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IG5ldyBDTUdyb3VwSW1wbChub2RlTGlzdCwgQ01Hcm91cC5TRVFVRU5DRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gKENNQ29udGVudCkgbm9kZUxpc3QuaXRlbSgwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IHR5cGUgb2YgdGhpcyBlbGVtZW50LiBUaGUgY29udGVudCB0eXBlIGlzIGRlZmluZWQgaW4KLSAgICAgKiBDTUVsZW1lbnREZWNsYXJhdGlvbiAoQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSBvciBDREFUQSkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCB0eXBlIG9mIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkKLSAgICB7Ci0gICAgICBpbnQgY29udGVudFR5cGUgPSBFTVBUWTsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZ2V0WFNEVHlwZSgpOwotICAgICAgaWYgKHRkIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IHRkLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKHR5cGVOYW1lICE9IG51bGwgJiYgdHlwZU5hbWUuZXF1YWxzKCJhbnlUeXBlIikpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250ZW50VHlwZSA9IEFOWTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBjb250ZW50VHlwZSA9IFBDREFUQTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAodGQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgdGQpLmdldENvbnRlbnRUeXBlQ2F0ZWdvcnkoKTsKLSAgICAgICAgaWYgKGNhdGVnb3J5ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzd2l0Y2ggKGNhdGVnb3J5LmdldFZhbHVlKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBYU0RDb250ZW50VHlwZUNhdGVnb3J5LkVMRU1FTlRfT05MWSA6Ci0gICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gRUxFTUVOVDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkuRU1QVFkgOgotICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IEVNUFRZOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgWFNEQ29udGVudFR5cGVDYXRlZ29yeS5NSVhFRCA6Ci0gICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gTUlYRUQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBYU0RDb250ZW50VHlwZUNhdGVnb3J5LlNJTVBMRSA6Ci0gICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gUENEQVRBOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBjb250ZW50VHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBDTURhdGFUeXBlIGdldERhdGFUeXBlKCkKLSAgICB7Ci0gICAgICBDTURhdGFUeXBlIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpbnQgY29udGVudFR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotICAgICAgYm9vbGVhbiBoYXNEYXRhVHlwZSA9IGNvbnRlbnRUeXBlID09IFBDREFUQSB8fCBjb250ZW50VHlwZSA9PSBNSVhFRDsKLSAgICAgIGlmIChoYXNEYXRhVHlwZSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZGF0YVR5cGU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzICIxIi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ01pbiBPY2N1cnMnIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0TWluT2NjdXJzKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKLSAgICAgKiAiMSIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNYXhPY2N1cigpCi0gICAgewotICAgICAgcmV0dXJuIGdldE1heE9jY3VycyhnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBlbGVtZW50IGRlY2xhcmF0aW9uIGlmIHRoaXMgaXMgYW4gZWxlbWVudAotICAgICAqIHJlZmVyZW5jZS4gT3RoZXJ3aXNlIGl0IHJldHVybnMgaXRzZWxmLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ01Ob2RlIGdldERlZmluaXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGlzIGdsb2JhbCBvcgotICAgICAqIGxvY2FsLiBSZXR1cm5zIG51bGwgaWYgdGhpcyBpcyBhbiBlbGVtZW50IHJlZmVyZW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBnbG9iYWwgb3IKLSAgICAgKiAgICAgICAgIGxvY2FsLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmaW5pdGlvbkluZm8oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnRzIGxvY2FsIHRvIHRoaXMgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50cyBsb2NhbCB0byB0aGlzIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKQotICAgIHsKLSAgICAgIGlmIChuYW1lZE5vZGVNYXAgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTG9jYWxFbGVtZW50VmlzaXRvciBsb2NhbEVsZW1lbnRWaXNpdG9yID0gbmV3IExvY2FsRWxlbWVudFZpc2l0b3IoKTsKLSAgICAgICAgbG9jYWxFbGVtZW50VmlzaXRvci52aXNpdFR5cGVEZWZpbml0aW9uKGdldFhTRFR5cGUoKSk7Ci0gICAgICAgIG5hbWVkTm9kZU1hcCA9IGxvY2FsRWxlbWVudFZpc2l0b3IuZ2V0Q01OYW1lZE5vZGVNYXAoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuYW1lZE5vZGVNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLiBSZXR1cm5zIG51bGwgaWYgdGhlCi0gICAgICogcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfREVGSU5JVElPTl9JTkZPKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0RGVmaW5pdGlvbkluZm8oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfREVGSU5JVElPTikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldERlZmluaXRpb24oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfWFNJVFlQRVMpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXRYU0lUeXBlcygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoUFJPUEVSVFlfREVSSVZFRF9FTEVNRU5UX0RFQ0xBUkFUSU9OKSkKLSAgICAgIHsKLSAgICAgICAgaW50IGluZGV4ID0gcHJvcGVydHlOYW1lLmluZGV4T2YoIj0iKTsKLSAgICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHVyaVF1YWxpZmllZFR5cGVOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICAgIHJlc3VsdCA9IGdldERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb24odXJpUXVhbGlmaWVkVHlwZU5hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1NVQlNUSVRVVElPTl9HUk9VUCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBnZXRTdWJzdGl0dXRpb25Hcm91cCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9TVUJTVElUVVRJT05fR1JPVVBfVkFMVUUpKQotICAgICAgewotICAgICAgICByZXR1cm4gZ2V0U3Vic3RpdHV0aW9uR3JvdXBWYWx1ZSgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9BQlNUUkFDVCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBnZXRBYnN0cmFjdCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ05pbGxhYmxlJyBhdHRyaWJ1dGUuIFRoaXMgcmVwcmVzZW50cyB0aGUKLSAgICAgKiBuaWxsYWJsZSBpbmZvc2V0IHByb3BlcnR5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ05pbGxhYmxlJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNOaWxsYWJsZSgpCi0gICAgewotICAgICAgaWYgKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmlzU2V0TmlsbGFibGUoKSkKLSAgICAgICAgcmV0dXJuIGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmlzTmlsbGFibGUoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzdWJzdGl0dXRpb25Hcm91cCBhdHRyaWJ1dGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB2YWx1ZSBvZiB0aGUgc3Vic3RpdHV0aW9uR3JvdXAgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdWJzdGl0dXRpb25Hcm91cFZhbHVlKCkKLSAgICB7Ci0gICAgCVhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24gPSBnZXRSZXNvbHZlZFhTREVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgIAlpZih4c2RFbGVtZW50RGVjbGFyYXRpb24gIT0gbnVsbCkKLSAgICAJewotICAgIAkJRWxlbWVudCBlbGVtZW50ID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldEVsZW1lbnQoKTsKLSAgICAJCWlmKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAJCXsKLSAgICAJCQlpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURSkpCi0gICAgCQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuU1VCU1RJVFVUSU9OR1JPVVBfQVRUUklCVVRFKTsKLSAgICAJCQllbHNlIHJldHVybiBudWxsOwotICAgIAkJfQotICAgIAl9Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZWxlbWVudCBpcyAnQWJzdHJhY3QnLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyAnQWJzdHJhY3QnLgotICAgICAqLwotICAgIHB1YmxpYyBCb29sZWFuIGdldEFic3RyYWN0KCkKLSAgICB7Ci0gICAgICBib29sZWFuIHJlc3VsdCA9IGdldFJlc29sdmVkWFNERWxlbWVudERlY2xhcmF0aW9uKCkuaXNBYnN0cmFjdCgpOwotICAgICAgLy8gVE9ETy4uLiBob3cgZG8gd2UgaGFuZGxlIGVsZW1lbnRzIHdpdGggYWJzdHJhY3QgdHlwZSdzID8KLSAgICAgIHJldHVybiByZXN1bHQgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9uKCkKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uID0gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgICBYU0RBbm5vdGF0aW9uIGFubm90YXRpb24gPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbigpOwotICAgICAgCi0gICAgICAvLyBOZWVkIHRvIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IGRvY3VtZW50YXRpb24gZWxlbWVudHMuICBKdXN0IGJlY2F1c2UKLSAgICAgIC8vIHRoZXJlIGlzIGFuIGFubm90YXRpb24gZWxlbWVudCBkb2Vzbid0IG1lYW4gdGhhdCB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50IGlzCi0gICAgICAvLyBhbHNvIHRoZXJlLCBhcyBpdCBjb3VsZCBjb250YWluIGp1c3QgYXBwaW5mbyBlbGVtZW50cy4KLSAgICAgIAotICAgICAgYm9vbGVhbiBoYXNEb2N1bWVudGF0aW9uID0gZmFsc2U7Ci0gICAgICAKLSAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAJICBpZiAoIWFubm90YXRpb24uZ2V0VXNlckluZm9ybWF0aW9uKCkuaXNFbXB0eSgpKSB7Ci0gICAgCQkgIGhhc0RvY3VtZW50YXRpb24gPSB0cnVlOwotICAgIAkgIH0KLSAgICAgIH0KLQotICAgICAgLy8gVGhlIGVsZW1lbnQgbWF5IG5vdCBoYXZlIGFubm90YXRpb24gYW5kIGlmIGl0IGlzIHJlZmVyZW5jZWQKLSAgICAgIC8vIGNoZWNrIHRoZSByZWZlcmVuY2VkIGF0dHJpYnV0ZSBmb3IgdGhlIGFubm90YXRpb25zLgotICAgICAgaWYgKGhhc0RvY3VtZW50YXRpb24gPT0gZmFsc2UpIHsKLSAgICAgICAgICBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgCSAgYW5ub3RhdGlvbiA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldEFubm90YXRpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9ucyhhbm5vdGF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgdHlwZSBkZWZpbml0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHR5cGUgbmFtZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgdHlwZSBuYW1lcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdCBnZXRYU0lUeXBlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHVyaSBxdWFsaWZpZWQKLSAgICAgKiB0eXBlIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaVF1YWxpZmllZFR5cGVOYW1lIC0KLSAgICAgKiAgICAgICAgICBhIHVyaSBxdWFsaWZpZWQgdHlwZSBuYW1lCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIHVyaVF1YWxpZmllZFR5cGVOYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRYU0lUeXBlQXR0cmlidXRlKENNTmFtZWROb2RlTWFwSW1wbCBtYXApCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gZ2V0WFNJVHlwZXMoKTsKLSAgICAgIGludCBsaXN0U2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgICAgaWYgKGxpc3RTaXplID4gMSkKLSAgICAgIHsKLSAgICAgICAgQ01EYXRhVHlwZSBkYXRhVHlwZSA9IG5ldyBDTURhdGFUeXBlSW1wbCgidHlwZU5hbWVzIiwgKFN0cmluZykgbnVsbCk7Ci0gICAgICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsIGF0dHJpYnV0ZSA9IG5ldyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCgidHlwZSIsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwsIGRhdGFUeXBlKTsKLSAgICAgICAgYXR0cmlidXRlLnNldENNRG9jdW1lbnQoeHNpRG9jdW1lbnQpOwotICAgICAgICBhdHRyaWJ1dGUuc2V0UHJlZml4UXVhbGlmaWNhdGlvbih0cnVlKTsKLSAgICAgICAgYXR0cmlidXRlLnNldFhTSVR5cGVzKGxpc3QpOwotCi0gICAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI1NDQ3Ci0gICAgICAgIC8vIEZvciBub3csIGRvbid0IGNsb2JiZXIgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBzYW1lICd0eXBlJyBuYW1lIGRlZmluZWQgaW4gdGhlIGdyYW1tYXIKLSAgICAgICAgLy8gd2l0aCB0aGUgeHNpOnR5cGUgYXR0cmlidXRlLiAgVGhlIGltcGFjdCBvZiB0aGlzIGNoYW5nZSB3aWxsIGJlIHRoYXQgZm9yIGNvbnRlbnQgYXNzaXN0LCB0aGUgbm9uLXhzaQotICAgICAgICAvLyB0eXBlIGF0dHJpYnV0ZSB3aWxsIGJlIHByZXNlbnRlZDsgdGhlIGdlbmVyYXRlZCBYTUwgZnJvbSBYU0Qgd2lsbCBoYXZlIHRoaXMgYXR0cmlidXRlIGNyZWF0ZWQsIGFuZAotICAgICAgICAvLyBub3QgdGhlIHhzaTp0eXBlIGF0dHJpYnV0ZS4KLSAgICAgICAgSGFzaHRhYmxlIGhhc2hUYWJsZSA9IG1hcC5nZXRIYXNodGFibGUoKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgaWYgKCFoYXNoVGFibGUuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgaGFzaFRhYmxlLnB1dChuYW1lLCBhdHRyaWJ1dGUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNtZG9jdW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2YgdGhpcyBjbW5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY21kb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKQotICAgIHsgICAgICAKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBnZXRSZXNvbHZlZFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpOwotICAgICAgaWYgKHNjaGVtYSA9PSBudWxsKQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIGVsc2UgIAotICAgICAgICByZXR1cm4gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoc2NoZW1hKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIHRoaXMgZWxlbWVudC4gVGhlIGdyb3VwIGNvbnNpc3RzIG9mOgotICAgICAqIDEuIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGl0c2VsZiAyLiBhbmQgYW55IGVsZW1lbnQgZGVjbGFyYXRpb24gdGhhdCBoYXMKLSAgICAgKiBhIHtzdWJzdGl0dXRpb24gZ3JvdXAgYWZmaWxpYXRpb259IGluIHRoZSBncm91cAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN1YnN0aXR1dGlvbiBncm91cCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBDTU5vZGVMaXN0SW1wbCBnZXRTdWJzdGl0dXRpb25Hcm91cCgpOwotICAgIC8qCi0gICAgICogWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5EYXRhVHlwZUltcGwgQW4gaW5uZXIgY2xhc3MgdG8gaG9sZCB0eXBlCi0gICAgICogaW5mb3JtYXRpb24gZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgRGF0YVR5cGVJbXBsIGltcGxlbWVudHMgQ01EYXRhVHlwZQotICAgIHsKLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIGluIENNTm9kZSBjbGFzcwotICAgICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICAgKiBET0NVTUVOVEFUSU9OKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgICAgewotICAgICAgICByZXR1cm4gQ01Ob2RlLkRBVEFfVFlQRTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUuIFNhbWUgYXMgZ2V0RGF0YVR5cGVOYW1lKCkuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBnZXREYXRhVHlwZU5hbWUoKTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZCBmb3IgdGhpcyBjbGFzcy4KLSAgICAgICAqIAotICAgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkLgotICAgICAgICovCi0gICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgICAgewotICAgICAgICByZXR1cm4gKFBST1BFUlRZX1dISVRFU1BBQ0VfRkFDRVQuZXF1YWxzKHByb3BlcnR5TmFtZSkpOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgcHJvcGVydHkgbmFtZS4gUmV0dXJucyBudWxsIGlmIHRoZQotICAgICAgICogcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgICAqIAotICAgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgICAgewotICAgICAgICBpZihQUk9QRVJUWV9XSElURVNQQUNFX0ZBQ0VULmVxdWFscyhwcm9wZXJ0eU5hbWUpKQotICAgICAgICAJcmV0dXJuIGdldFdoaXRlU3BhY2VGYWNldFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZS4gU2FtZSBhcyBnZXROb2RlTmFtZSgpLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gbnVsbDsKLSAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3RkID0gZ2V0WFNEVHlwZSgpLmdldFNpbXBsZVR5cGUoKTsKLSAgICAgICAgaWYgKHN0ZCAhPSBudWxsKQotICAgICAgICAgIHR5cGVOYW1lID0gc3RkLmdldE5hbWUoKTsKLSAgICAgICAgcmV0dXJuIHR5cGVOYW1lICE9IG51bGwgPyB0eXBlTmFtZSA6ICJzdHJpbmciOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUga2luZCBvZiBjb25zdHJhaW50OiBub25lLCBkZWZhdWx0IG9yIGZpeGVkLiBUaGUga2luZHMgYXJlCi0gICAgICAgKiBkZWZpbmVkIGluIENNRGF0YVR5cGUgY2xhc3MgKElNUExJRURfVkFMVUVfTk9ORSwgSU1QTElFRF9WQUxVRV9GSVhFRCBvcgotICAgICAgICogSU1QTElFRF9WQUxVRV9ERUZBVUxUKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUga2luZCBvZiBjb25zdHJhaW50OiBub25lLCBkZWZhdWx0IG9yIGZpeGVkLgotICAgICAgICovCi0gICAgICBwdWJsaWMgaW50IGdldEltcGxpZWRWYWx1ZUtpbmQoKQotICAgICAgewotICAgICAgICBpbnQgcmVzdWx0ID0gSU1QTElFRF9WQUxVRV9OT05FOwotICAgICAgICBpZiAoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuaXNTZXRDb25zdHJhaW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0Q29uc3RyYWludCgpLmdldFZhbHVlKCkgPT0gWFNEQ29uc3RyYWludC5ERUZBVUxUKQotICAgICAgICAgICAgcmVzdWx0ID0gSU1QTElFRF9WQUxVRV9ERUZBVUxUOwotICAgICAgICAgIGVsc2UgaWYgKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldENvbnN0cmFpbnQoKS5nZXRWYWx1ZSgpID09IFhTRENvbnN0cmFpbnQuRklYRUQpCi0gICAgICAgICAgICByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX0ZJWEVEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgb3IgZml4ZWQgY29uc3RyYWludC4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgb3IgZml4ZWQgY29uc3RyYWludC4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKQotICAgICAgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmlzU2V0Q29uc3RyYWludCgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyBmb3IgdGhlIGF0dHJpYnV0ZSB0eXBlLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyBmb3IgdGhlIGF0dHJpYnV0ZSB0eXBlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBnZXRFbnVtZXJhdGVkVmFsdWVzRm9yVHlwZShnZXRYU0RUeXBlKCkpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSW5zdGFuY2VWYWx1ZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBYU0RUeXBlVXRpbC5nZXRJbnN0YW5jZVZhbHVlKGdldFhTRFR5cGUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgY21kb2N1bWVudCB0aGF0IGlzIHRoZSBvd25lciBvZiB0aGlzIGNtbm9kZS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgY21kb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY21ub2RlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIChDTURvY3VtZW50KSBnZXRBZGFwdGVyKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLyoqCi0gICAgICAgKiBPYnRhaW5zIHRoZSB3aGl0ZXNwYWNlIGZhY2V0IG9mIHRoZSBYU0Qgc2ltcGxlIHR5cGUuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gVGhlIHdoaXRlc3BhY2UgZmFjZXQgZm9yIHRoZSBYU0QgdHlwZS4gSWYgbm9uZSBpcwotICAgICAgICogZGVmaW5lZCwgb3IgaXQgaXMgYSBjb21wbGV4IHR5cGUsIG51bGwuCi0gICAgICAgKi8KLSAgICAgIHByaXZhdGUgU3RyaW5nIGdldFdoaXRlU3BhY2VGYWNldFZhbHVlKCkKLSAgICAgIHsKLSAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gZGVmID0gZ2V0WFNEVHlwZSgpLmdldFNpbXBsZVR5cGUoKTsKLSAgICAgICAgcmV0dXJuIChkZWYgIT0gbnVsbCAmJiBkZWYuZ2V0RWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0KCkgIT0gbnVsbCkgPyBkZWYuZ2V0RWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0KCkuZ2V0TGV4aWNhbFZhbHVlKCkgOiBudWxsIDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbi4gQQotICAgKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICdFbGVtZW50IERlY2xhcmF0aW9uJy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBleHRlbmRzIEVsZW1lbnREZWNsYXJhdGlvbkJhc2VJbXBsCi0gIHsKLSAgICBwcm90ZWN0ZWQgTGlzdCBkZXJpdmVkRWxlbWVudERlY2xhcmF0aW9ucyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIExpc3QgeHNpVHlwZXMgPSBudWxsOwotICAgIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uOwotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0SW1wbCBzdWJzdGl0dXRpb25Hcm91cDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSB4c2RFbGVtZW50RGVjbGFyYXRpb24gLQotICAgICAqICAgICAgICAgIHRoZSBYTUwgU2NoZW1hIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIoWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICB0aGlzLnhzZEVsZW1lbnREZWNsYXJhdGlvbiA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RFbGVtZW50RGVjbGFyYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0UmVzb2x2ZWRYU0RFbGVtZW50RGVjbGFyYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RFbGVtZW50RGVjbGFyYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBlbGVtZW50IGRlY2xhcmF0aW9uIGlmIHRoaXMgaXMgYW4gZWxlbWVudAotICAgICAqIHJlZmVyZW5jZS4gT3RoZXJ3aXNlIGl0IHJldHVybnMgaXRzZWxmLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Ob2RlIGdldERlZmluaXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRBZGFwdGVyKHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBnbG9iYWwgb3IKLSAgICAgKiBsb2NhbC4gUmV0dXJucyBudWxsIGlmIHRoaXMgaXMgYW4gZWxlbWVudCByZWZlcmVuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgZ2xvYmFsIG9yCi0gICAgICogICAgICAgICBsb2NhbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCkKLSAgICB7Ci0gICAgICBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgZWxzZSBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uLmlzR2xvYmFsKCkpCi0gICAgICAgIHJldHVybiBERUZJTklUSU9OX0lORk9fR0xPQkFMOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gREVGSU5JVElPTl9JTkZPX0xPQ0FMOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0TlNQcmVmaXhRdWFsaWZpY2F0aW9uKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgZm9ybSA9IG51bGw7Ci0gICAgICBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICB7Ci0gICAgICAgIGZvcm0gPSAicXVhbGlmaWVkIjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc1NldEZvcm0oKSkKLSAgICAgICAgewotICAgICAgICAgIGZvcm0gPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0Rm9ybSgpLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFNjaGVtYSgpOwotICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICAgIGZvcm0gPSBzY2hlbWEuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZm9ybTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgdHlwZSBkZWZpbml0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHR5cGUgbmFtZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgdHlwZSBuYW1lcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRYU0lUeXBlcygpCi0gICAgewotICAgICAgaWYgKHhzaVR5cGVzID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbXB1dGVEZXJpdmVkVHlwZUluZm8oKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB4c2lUeXBlczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlRGVyaXZlZFR5cGVJbmZvKCkKLSAgICB7Ci0gICAgICB4c2lUeXBlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGRlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25zID0gbmV3IFZlY3RvcigpOwotICAgICAgY29tcHV0ZURlcml2ZWRUeXBlSW5mb0hlbHBlcihnZXRYU0RUeXBlKCksIHhzaVR5cGVzLCBkZXJpdmVkRWxlbWVudERlY2xhcmF0aW9ucyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZURlcml2ZWRUeXBlSW5mb0hlbHBlcihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlLCBMaXN0IHR5cGVOYW1lTGlzdCwgTGlzdCBlZExpc3QpCi0gICAgewotICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIExpc3QgZGVyaXZlZFR5cGVzID0gZmluZFR5cGVzRGVyaXZlZEZyb20odHlwZSk7Ci0gICAgICAgIEFycmF5TGlzdCBpbmNsdXNpdmVEZXJpdmVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGluY2x1c2l2ZURlcml2ZWRUeXBlcy5hZGQodHlwZSk7Ci0gICAgICAgIGlmICgoZGVyaXZlZFR5cGVzICE9IG51bGwpICYmIChkZXJpdmVkVHlwZXMuc2l6ZSgpID4gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbmNsdXNpdmVEZXJpdmVkVHlwZXMuYWRkQWxsKGRlcml2ZWRUeXBlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gaW5jbHVzaXZlRGVyaXZlZFR5cGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGRlcml2ZWRUeXBlID0gKFhTRFR5cGVEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gZGVyaXZlZFR5cGUuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGRlcml2ZWRUeXBlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG5hbWUgPSB1cmkgIT0gbnVsbCA/ICgiWyIgKyB1cmkgKyAiXSIgKyBuYW1lKSA6IG5hbWU7Ci0gICAgICAgICAgICAgIHR5cGVOYW1lTGlzdC5hZGQobmFtZSk7Ci0gICAgICAgICAgICAgIERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25JbXBsIGVkID0gbmV3IERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25JbXBsKHRoaXMsIGRlcml2ZWRUeXBlLCBuYW1lKTsKLSAgICAgICAgICAgICAgZWRMaXN0LmFkZChlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHVyaSBxdWFsaWZpZWQKLSAgICAgKiB0eXBlIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaVF1YWxpZmllZFR5cGVOYW1lIC0KLSAgICAgKiAgICAgICAgICBhIHVyaSBxdWFsaWZpZWQgdHlwZSBuYW1lCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIHVyaVF1YWxpZmllZFR5cGVOYW1lKQotICAgIHsKLSAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAoZGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbnMgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29tcHV0ZURlcml2ZWRUeXBlSW5mbygpOwotICAgICAgfQotICAgICAgZm9yIChJdGVyYXRvciBpID0gZGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IChEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uSW1wbCkgaS5uZXh0KCk7Ci0gICAgICAgIGlmICgoZWQgIT0gbnVsbCkgJiYgKGVkLnVyaVF1YWxpZmllZFR5cGVOYW1lICE9IG51bGwpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGVkLnVyaVF1YWxpZmllZFR5cGVOYW1lLmVxdWFscyh1cmlRdWFsaWZpZWRUeXBlTmFtZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gZWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3Vic3RpdHV0aW9uIGdyb3VwIGZvciB0aGlzIGVsZW1lbnQuIFRoZSBncm91cCBjb25zaXN0cyBvZjoKLSAgICAgKiAxLiB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpdHNlbGYgMi4gYW5kIGFueSBlbGVtZW50IGRlY2xhcmF0aW9uIHRoYXQgaGFzCi0gICAgICogYSB7c3Vic3RpdHV0aW9uIGdyb3VwIGFmZmlsaWF0aW9ufSBpbiB0aGUgZ3JvdXAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdEltcGwgZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKQotICAgIHsKLSAgICAgIGlmIChzdWJzdGl0dXRpb25Hcm91cCA9PSBudWxsKQotICAgICAgewotICAgICAgICBzdWJzdGl0dXRpb25Hcm91cCA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotICAgICAgICBMaXN0IHNncm91cCA9IGdldFJlc29sdmVkWFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc2dyb3VwLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGkubmV4dCgpOyAgCi0gICAgICAgICAgc3Vic3RpdHV0aW9uR3JvdXAuYWRkKGdldEFkYXB0ZXIoZWQpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHN1YnN0aXR1dGlvbkdyb3VwOwotICAgIH0KLSAgfQotICAvKioKLSAgICogRGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbkltcGwgZXh0ZW5kcyBFbGVtZW50RGVjbGFyYXRpb25CYXNlSW1wbAotICAgKiAgCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25JbXBsIGV4dGVuZHMgRWxlbWVudERlY2xhcmF0aW9uQmFzZUltcGwKLSAgewotICAgIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIG93bmVyOwotICAgIHByb3RlY3RlZCBYU0RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlOwotICAgIHB1YmxpYyBTdHJpbmcgdXJpUXVhbGlmaWVkVHlwZU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3duZXIgLQotICAgICAqIEBwYXJhbSB4c2RUeXBlIC0KLSAgICAgKiBAcGFyYW0gdXJpUXVhbGlmaWVkVHlwZU5hbWUgLQotICAgICAqLwotICAgIHB1YmxpYyBEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uSW1wbChYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIG93bmVyLCBYU0RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlLCBTdHJpbmcgdXJpUXVhbGlmaWVkVHlwZU5hbWUpCi0gICAgewotICAgICAgdGhpcy5vd25lciA9IG93bmVyOwotICAgICAgdGhpcy54c2RUeXBlID0geHNkVHlwZTsKLSAgICAgIHRoaXMudXJpUXVhbGlmaWVkVHlwZU5hbWUgPSB1cmlRdWFsaWZpZWRUeXBlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBvd25lci5nZXRLZXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRSZXNvbHZlZFhTREVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBvd25lci5nZXRLZXkoKSkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKQotICAgIHsKLSAgICAgIHJldHVybiBvd25lci5nZXRLZXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgdHlwZSBkZWZpbml0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHR5cGUgbmFtZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgdHlwZSBuYW1lcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRYU0lUeXBlcygpCi0gICAgewotICAgICAgcmV0dXJuIG93bmVyLmdldFhTSVR5cGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHVyaSBxdWFsaWZpZWQKLSAgICAgKiB0eXBlIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaVF1YWxpZmllZFR5cGVOYW1lIC0KLSAgICAgKiAgICAgICAgICBhIHVyaSBxdWFsaWZpZWQgdHlwZSBuYW1lCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIHVyaVF1YWxpZmllZFR5cGVOYW1lKQotICAgIHsKLSAgICAgIHJldHVybiBvd25lci5nZXREZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uKHVyaVF1YWxpZmllZFR5cGVOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgZGVjbGFyYXRpb24gaWYgdGhpcyBpcyBhbiBlbGVtZW50Ci0gICAgICogcmVmZXJlbmNlLiBPdGhlcndpc2UgaXQgcmV0dXJucyBpdHNlbGYuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTU5vZGUgZ2V0RGVmaW5pdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgZ2xvYmFsIG9yCi0gICAgICogbG9jYWwuIFJldHVybnMgbnVsbCBpZiB0aGlzIGlzIGFuIGVsZW1lbnQgcmVmZXJlbmNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGlzIGdsb2JhbCBvcgotICAgICAqICAgICAgICAgbG9jYWwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWZpbml0aW9uSW5mbygpCi0gICAgewotICAgICAgcmV0dXJuIG93bmVyLmdldERlZmluaXRpb25JbmZvKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZm9ybSBbYXR0cmlidXRlXSB3aGljaCBhZmZlY3RzIHRoZSB0YXJnZXQKLSAgICAgKiBuYW1lc3BhY2Ugb2YgbG9jYWxseSBzY29wZWQgZmVhdHVyZXMuIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmb3JtCi0gICAgICogW2F0dHJpYnV0ZV0uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXROU1ByZWZpeFF1YWxpZmljYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiBvd25lci5nZXROU1ByZWZpeFF1YWxpZmljYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIHRoaXMgZWxlbWVudC4gVGhlIGdyb3VwIGNvbnNpc3RzIG9mOgotICAgICAqIDEuIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGl0c2VsZiAyLiBhbmQgYW55IGVsZW1lbnQgZGVjbGFyYXRpb24gdGhhdCBoYXMKLSAgICAgKiBhIHtzdWJzdGl0dXRpb24gZ3JvdXAgYWZmaWxpYXRpb259IGluIHRoZSBncm91cAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN1YnN0aXR1dGlvbiBncm91cCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0SW1wbCBnZXRTdWJzdGl0dXRpb25Hcm91cCgpCi0gICAgewotICAgICAgcmV0dXJuIG93bmVyLmdldFN1YnN0aXR1dGlvbkdyb3VwKCk7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBYU0RXaWxkY2FyZEFkYXB0ZXIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNEV2lsZGNhcmRBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUFueUVsZW1lbnQKLSAgewotICAgIHByb3RlY3RlZCBYU0RXaWxkY2FyZCB4c2RXaWxkY2FyZDsKLQotICAgIHB1YmxpYyBYU0RXaWxkY2FyZEFkYXB0ZXIoWFNEV2lsZGNhcmQgeHNkV2lsZGNhcmQpCi0gICAgewotICAgICAgdGhpcy54c2RXaWxkY2FyZCA9IHhzZFdpbGRjYXJkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUgd2hpY2ggaXMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYQotICAgICAqIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGZvciB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZFdpbGRjYXJkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5vZGUuIFRoZSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBDTU5vZGUgY2xhc3MKLSAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICogRE9DVU1FTlRBVElPTikuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIEFOWV9FTEVNRU5UOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5vZGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4KLSAgICAgKiBBbGwgZGVyaXZlZCBjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3Qgd2FudCB0aGUKLSAgICAgKiBkZWZhdWx0IHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuICJhbnkiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICB7Ci0gICAgCWlmICh4c2RXaWxkY2FyZC5nZXRFbGVtZW50KCkuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFKSkKLSAgICAJewotICAgIAkJcmV0dXJuIHhzZFdpbGRjYXJkLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEUpOwotICAgIAl9Ci0gICAgCWVsc2UgCi0gICAgCQlyZXR1cm4gIiMjYW55IjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiAnTWluIE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiMSIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNaW5PY2N1cigpCi0gICAgewotICAgICAgcmV0dXJuIGdldE1pbk9jY3Vycyh4c2RXaWxkY2FyZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0gICAgICogIjEiLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRNYXhPY2N1cnMoeHNkV2lsZGNhcmQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNtZG9jdW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2YgdGhpcyBjbW5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY21kb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKQotICAgIHsKLSAgICAgIHJldHVybiAoQ01Eb2N1bWVudCkgZ2V0QWRhcHRlcih4c2RXaWxkY2FyZC5nZXRTY2hlbWEoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0IGdldERvY3VtZW50YXRpb24oKQotICAgIHsKLSAgICAgIFhTREFubm90YXRpb24gYW5ub3RhdGlvbiA9IHhzZFdpbGRjYXJkLmdldEFubm90YXRpb24oKTsKLSAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9ucyhhbm5vdGF0aW9uKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFhTRE1vZGVsR3JvdXBBZGFwdGVyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTRE1vZGVsR3JvdXBBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUdyb3VwCi0gIHsKLSAgICBwcm90ZWN0ZWQgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwOwotCi0gICAgcHVibGljIFhTRE1vZGVsR3JvdXBBZGFwdGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFhTRE1vZGVsR3JvdXBBZGFwdGVyKFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICB0aGlzLnhzZE1vZGVsR3JvdXAgPSB4c2RNb2RlbEdyb3VwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5vZGUuIFRoZSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBDTU5vZGUgY2xhc3MKLSAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICogRE9DVU1FTlRBVElPTikuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIEdST1VQOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUgd2hpY2ggaXMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYQotICAgICAqIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGZvciB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZE1vZGVsR3JvdXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIGNoaWxkcmVuIG9mIHRoaXMgZ3JvdXAuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgdGhlIGNoaWxkcmVuIG9mIHRoaXMgZ3JvdXAuCi0gICAgICovCi0gICAgcHVibGljIENNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpCi0gICAgewotICAgICAgQ01Ob2RlTGlzdEltcGwgbm9kZUxpc3QgPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLSAgICAgIGlmICh4c2RNb2RlbEdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzZE1vZGVsR3JvdXAuZ2V0UGFydGljbGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpIGkubmV4dCgpOwotICAgICAgICAgIFhTRFBhcnRpY2xlQ29udGVudCBjb250ZW50ID0gcGFydGljbGUuZ2V0Q29udGVudCgpOwotICAgICAgICAgIENNTm9kZSBhZGFwdGVyID0gZ2V0QWRhcHRlcihjb250ZW50KTsKLSAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5vZGVMaXN0LmdldExpc3QoKS5hZGQoYWRhcHRlcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbm9kZUxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbm9kZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYW4gZW1wdHkgc3RyaW5nIHZhbHVlLgotICAgICAqIEFsbCBkZXJpdmVkIGNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGRvIG5vdCB3YW50IHRoZQotICAgICAqIGRlZmF1bHQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICBDTURlc2NyaXB0aW9uQnVpbGRlciBkZXNjcmlwdGlvbkJ1aWxkZXIgPSBuZXcgQ01EZXNjcmlwdGlvbkJ1aWxkZXIoKTsKLSAgICAgIHJldHVybiBkZXNjcmlwdGlvbkJ1aWxkZXIuYnVpbGREZXNjcmlwdGlvbih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiAnTWluIE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiMSIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNaW5PY2N1cigpCi0gICAgewotICAgICAgcmV0dXJuIGdldE1pbk9jY3Vycyh4c2RNb2RlbEdyb3VwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKLSAgICAgKiAiMSIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNYXhPY2N1cigpCi0gICAgewotICAgICAgcmV0dXJuIGdldE1heE9jY3Vycyh4c2RNb2RlbEdyb3VwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gb3BlcmF0b3Igb2YgdGhpcyBncm91cCAtLSBDSE9JQ0UsIFNFUVVFTkNFIG9yIEFMTCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvcGVyYXRvciBvZiB0aGlzIGdyb3VwLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0T3BlcmF0b3IoKQotICAgIHsKLSAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgLy90b2RvLi4uIGhhbmRsZSBBTE9ORSBjYXNlIGJ5IGNoZWNraWcgaWYgY2hpbGQgY291bnQgPT0gMQotICAgICAgaWYgKHhzZE1vZGVsR3JvdXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc3dpdGNoICh4c2RNb2RlbEdyb3VwLmdldENvbXBvc2l0b3IoKS5nZXRWYWx1ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBYU0RDb21wb3NpdG9yLkNIT0lDRSA6IHsKLSAgICAgICAgICAgIHJlc3VsdCA9IENIT0lDRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIFhTRENvbXBvc2l0b3IuU0VRVUVOQ0UgOiB7Ci0gICAgICAgICAgICByZXN1bHQgPSBTRVFVRU5DRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIFhTRENvbXBvc2l0b3IuQUxMIDogewotICAgICAgICAgICAgcmVzdWx0ID0gQUxMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9uKCkKLSAgICB7Ci0gICAgICBYU0RBbm5vdGF0aW9uIGFubm90YXRpb24gPSB4c2RNb2RlbEdyb3VwLmdldEFubm90YXRpb24oKTsKLSAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9ucyhhbm5vdGF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbWRvY3VtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHRoaXMgY21ub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNtZG9jdW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoeHNkTW9kZWxHcm91cC5nZXRTY2hlbWEoKSk7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUdyb3VwCi0gIHsKLSAgICBwcm90ZWN0ZWQgWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZmluaXRpb247Ci0KLSAgICBwdWJsaWMgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHRoaXMueHNkTW9kZWxHcm91cERlZmluaXRpb24gPSB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICogRUxFTUVOVF9ERUNMQVJBVElPTiwgRU5USVRZX0RFQ0xBUkFUSU9OLCBHUk9VUCwgTkFNRV9TUEFDRSBvcgotICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiBHUk9VUDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBncm91cC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBncm91cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Ob2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkKLSAgICB7Ci0gICAgICBDTU5vZGVMaXN0SW1wbCBub2RlTGlzdCA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotICAgICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0geHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE1vZGVsR3JvdXAoKTsKLSAgICAgIGlmIChtb2RlbEdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBhZGFwdGVyID0gZ2V0QWRhcHRlcihtb2RlbEdyb3VwKTsKLSAgICAgICAgbm9kZUxpc3QuYWRkKGFkYXB0ZXIpOwotICAgICAgfQotICAgICAgcmV0dXJuIG5vZGVMaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5vZGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4KLSAgICAgKiBBbGwgZGVyaXZlZCBjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3Qgd2FudCB0aGUKLSAgICAgKiBkZWZhdWx0IHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgewotICAgICAgQ01EZXNjcmlwdGlvbkJ1aWxkZXIgZGVzY3JpcHRpb25CdWlsZGVyID0gbmV3IENNRGVzY3JpcHRpb25CdWlsZGVyKCk7Ci0gICAgICByZXR1cm4gZGVzY3JpcHRpb25CdWlsZGVyLmJ1aWxkRGVzY3JpcHRpb24odGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgJ01pbiBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgIjEiLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWluIE9jY3VycycgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRNaW5PY2N1cnMoeHNkTW9kZWxHcm91cERlZmluaXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcwotICAgICAqICIxIi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1heE9jY3VyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0TWF4T2NjdXJzKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gb3BlcmF0b3Igb2YgdGhpcyBncm91cCAtLSBDSE9JQ0UsIFNFUVVFTkNFIG9yIEFMTCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvcGVyYXRvciBvZiB0aGlzIGdyb3VwLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0T3BlcmF0b3IoKQotICAgIHsKLSAgICAgIHJldHVybiBYU0RDb21wb3NpdG9yLlNFUVVFTkNFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9uKCkKLSAgICB7Ci0gICAgICBYU0RBbm5vdGF0aW9uIGFubm90YXRpb24gPSB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbnMoYW5ub3RhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY21kb2N1bWVudCB0aGF0IGlzIHRoZSBvd25lciBvZiB0aGlzIGNtbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbWRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpCi0gICAgewotICAgICAgcmV0dXJuIChDTURvY3VtZW50KSBnZXRBZGFwdGVyKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFNjaGVtYSgpKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIERvY3VtZW50YXRpb25JbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudGF0aW9uLiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICAgKiBkb2N1bWVudGF0aW9uIGVsZW1lbnQgcGFydCBvZiB0aGUgJ1VzZXIgSW5mb3JtYXRpb24nIGZlYXR1cmUuIFdvcmtpbmcgd2l0aAotICAgKiB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50IHJlcXVpcmVzIGRyb3BwaW5nIGRvd24gaW50byB0aGUgRE9NIG1vZGVsLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBEb2N1bWVudGF0aW9uSW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnRhdGlvbgotICB7Ci0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZG9jdW1lbnRhdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkb2N1bWVudGF0aW9uIC0KLSAgICAgKiAgICAgICAgICBhIGRvY3VtZW50YXRpb24gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRhdGlvbkltcGwoRWxlbWVudCBkb2N1bWVudGF0aW9uKQotICAgIHsKLSAgICAgIHRoaXMuZG9jdW1lbnRhdGlvbiA9IGRvY3VtZW50YXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIGluIENNTm9kZSBjbGFzcwotICAgICAqIChBTllfRUxFTUVOVCwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBEQVRBX1RZUEUsIERPQ1VNRU5ULAotICAgICAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEVOVElUWV9ERUNMQVJBVElPTiwgR1JPVVAsIE5BTUVfU1BBQ0Ugb3IKLSAgICAgKiBET0NVTUVOVEFUSU9OKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gRE9DVU1FTlRBVElPTjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBmYWxzZS4gVGhpcyBjbGFzcyBkb2VzIG5vdCBzdXBwb3J0IGFueSBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gZmFsc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBudWxsLiBUaGlzIGNsYXNzIGRvZXMgbm90IHN1cHBvcnQgYW55IHByb3BlcnRpZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICogQHJldHVybiBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICAgIHsKLSAgICAgIFN0cmluZyBjb250ZW50ID0gIiI7Ci0gICAgICBib29sZWFuIGNvbnRlbnRGb3VuZCA9IGZhbHNlOwotICAgICAgTm9kZUxpc3Qgbm9kZXMgPSBkb2N1bWVudGF0aW9uLmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBUZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgY29udGVudEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICBjb250ZW50ICs9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBjb250ZW50Rm91bmQgPyBjb250ZW50IDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgdmFsdWUgb2YgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgdmFsdWUgb2YgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZG9jdW1lbnRhdGlvbi5oYXNBdHRyaWJ1dGVOUyhYU0RDb25zdGFudHMuWE1MX05BTUVTUEFDRV9VUklfMTk5OCwgWE1MX0xBTkdfQVRUUklCVVRFKSA/IGRvY3VtZW50YXRpb24uZ2V0QXR0cmlidXRlTlMoWFNEQ29uc3RhbnRzLlhNTF9OQU1FU1BBQ0VfVVJJXzE5OTgsIFhNTF9MQU5HX0FUVFJJQlVURSkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNvdXJjZSBhdHRyaWJ1dGUgdmFsdWUgb2YgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2UgYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKQotICAgIHsKLSAgICAgIHJldHVybiBkb2N1bWVudGF0aW9uLmhhc0F0dHJpYnV0ZU5TKG51bGwsIFhTRENvbnN0YW50cy5TT1VSQ0VfQVRUUklCVVRFKSA/IGRvY3VtZW50YXRpb24uZ2V0QXR0cmlidXRlTlMobnVsbCwgWFNEQ29uc3RhbnRzLlNPVVJDRV9BVFRSSUJVVEUpIDogbnVsbDsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFhTSURvY3VtZW50IGV4dGVuZHMgQ01Eb2N1bWVudEltcGwuIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBob2xkIHRob3NlCi0gICAqIGF0dHJpYnV0ZXMgdGhhdCBhcmUgZm9yIGRpcmVjdCB1c2UgaW4gYW55IFhNTCBkb2N1bWVudHMuIFRoZXNlIGF0dHJpYnV0ZXMKLSAgICogYXJlIGluIGEgZGlmZmVyZW50IG5hbWVzcGFjZSwgd2hpY2ggaGFzIHRoZSBuYW1lc3BhY2UgbmFtZQotICAgKiBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZS4gQXR0cmlidXRlcyBpbiB0aGlzIG5hbWVzcGFjZQotICAgKiBpbmNsdWRlOiB4c2k6dHlwZSB4c2k6bmlsIHhzaTpzY2hlbWFMb2NhdGlvbiB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0lEb2N1bWVudCBleHRlbmRzIENNRG9jdW1lbnRJbXBsCi0gIHsKLSAgICBwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwgbmlsQXR0cmlidXRlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuIENyZWF0ZXMgdGhlICd4c2k6bmlsJwotICAgICAqLwotICAgIHB1YmxpYyBYU0lEb2N1bWVudCgpCi0gICAgewotICAgICAgc3VwZXIoWFNEQ29uc3RhbnRzLlNDSEVNQV9JTlNUQU5DRV9VUklfMjAwMSk7Ci0gICAgICAvLyBjcmVhdGUgdGhlICduaWxsJyBhdHRyaWJ1dGUKLSAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IHsiZmFsc2UiLCAidHJ1ZSJ9OwotICAgICAgbmlsQXR0cmlidXRlID0gbmV3IENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsKCJuaWwiLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVELCBuZXcgQ01EYXRhVHlwZUltcGwoImJvb2xlYW4iLCB2YWx1ZXMpKTsKLSAgICAgIG5pbEF0dHJpYnV0ZS5zZXRQcmVmaXhRdWFsaWZpY2F0aW9uKHRydWUpOwotICAgICAgbmlsQXR0cmlidXRlLnNldENNRG9jdW1lbnQodGhpcyk7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBOb3RlIHRoaXMgWFNEIG1vZGVsIHZpc2l0b3IgZGlmZmVycyBmcm9tIHRoZSBYU0QgbW9kZWwgdmlzaXRvciBpbgotICAgKiBvcmcuZWNsaXBzZS53c3QueHNkLmVkaXRvciBwbHVnaW4uIEluIHZpc2l0TW9kZWxHcm91cCBtZXRob2Qgd2UgY2FsbAotICAgKiBnZXRQYXJ0aWNsZXMoKSBpbnN0ZWFkIG9mIGdldENvbnRlbnRzKCkuIFRoaXMgZ2F0aGVycyBhbGwgb2YgdGhlIGNvbnRlbnQgb2YKLSAgICogYSBkZXJpdmVkIHR5cGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTRENNVmlzaXRvciBleHRlbmRzIFhTRFZpc2l0b3IKLSAgewotICAgIHB1YmxpYyB2b2lkIHZpc2l0U2ltcGxlVHlwZURlZmluaXRpb24oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZSkKLSAgICB7Ci0gICAgICBYU0RQYXJ0aWNsZSBjdGQgPSB0eXBlLmdldENvbXBsZXhUeXBlKCk7Ci0gICAgICBpZiAoY3RkICE9IG51bGwpCi0gICAgICAgIHZpc2l0UGFydGljbGUoY3RkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIGlmIChtb2RlbEdyb3VwLmdldFBhcnRpY2xlcygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2RlbEdyb3VwLmdldFBhcnRpY2xlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgIHZpc2l0UGFydGljbGUocGFydGljbGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IG1vZGVsR3JvdXBEZWYuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE1vZGVsR3JvdXAoKTsKLSAgICAgIGlmIChtb2RlbEdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZpc2l0TW9kZWxHcm91cChtb2RlbEdyb3VwKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIEEgdmlzaXRvciBjbGFzcyB0aGF0IHdhbGtzIHRoZSB4c2QgbW9kZWwgYW5kIGNvbXB1dGVzIHRoZSBsaXN0IG9mIGNoaWxkcmVuCi0gICAqIHRoYXQgYmVsb25nIHRvIHRoZSBpbml0aWFsbHkgdmlzaXRlZCBlbGVtZW50IHR5cGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIERlcml2ZWRDaGlsZFZpc2l0b3IgZXh0ZW5kcyBYU0RDTVZpc2l0b3IKLSAgewotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0SW1wbCBjaGlsZE5vZGVMaXN0ID0gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0gICAgcHJvdGVjdGVkIExpc3QgYmFzZVR5cGVMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgIE9iamVjdCByb290OwotCi0gICAgRGVyaXZlZENoaWxkVmlzaXRvcihPYmplY3Qgcm9vdCkKLSAgICB7Ci0gICAgICB0aGlzLnJvb3QgPSByb290OwotICAgIH0KLQotICAgIHB1YmxpYyBDTU5vZGVMaXN0SW1wbCBnZXRDaGlsZE5vZGVMaXN0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gY2hpbGROb2RlTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFdpbGRjYXJkKFhTRFdpbGRjYXJkIHdpbGRjYXJkKQotICAgIHsKLSAgICAgIGNoaWxkTm9kZUxpc3QuZ2V0TGlzdCgpLmFkZChnZXRBZGFwdGVyKHdpbGRjYXJkKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gICAgewotICAgICAgY2hpbGROb2RlTGlzdC5nZXRMaXN0KCkuYWRkKGdldEFkYXB0ZXIoZWxlbWVudCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXApCi0gICAgewotICAgICAgY2hpbGROb2RlTGlzdC5nZXRMaXN0KCkuYWRkKGdldEFkYXB0ZXIobW9kZWxHcm91cCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgY2hpbGROb2RlTGlzdC5nZXRMaXN0KCkuYWRkKGdldEFkYXB0ZXIobW9kZWxHcm91cERlZmluaXRpb24pKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIEEgdmlzaXRvciBjbGFzcyB0aGF0IGdhdGhlcnMgYWxsIG9mIHRoZSBlbGVtZW50cyB3aXRoaW4gYSB0eXBlIGRlZmluaXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIExvY2FsRWxlbWVudFZpc2l0b3IgZXh0ZW5kcyBYU0RDTVZpc2l0b3IKLSAgewotICAgIHByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgbmFtZWROb2RlTWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICAgIHByb3RlY3RlZCBMaXN0IGJhc2VUeXBlTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKSBnZXRBZGFwdGVyKGVsZW1lbnQpOwotICAgICAgbmFtZWROb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dChhZGFwdGVyLmdldE5vZGVOYW1lKCksIGFkYXB0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRDTU5hbWVkTm9kZU1hcCgpCi0gICAgewotICAgICAgcmV0dXJuIG5hbWVkTm9kZU1hcDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNEVHlwZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNEVHlwZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiNjllZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRFR5cGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBnZW5lcmF0ZSB2YWxpZCB2YWx1ZXMgZm9yIGJ1aWx0LWluIHNpbXBsZSB0eXBlcy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgWFNEVHlwZVV0aWwKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBNYXAgZGVmYXVsdFZhbHVlID0gbmV3IEhhc2hNYXAoKTsKLQotICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZSgpCi0gIHsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJhbnlTaW1wbGVUeXBlIiwgbnVsbCk7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiYW55VHlwZSIsIG51bGwpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImFueVVSSSIsICJodHRwOi8vdGVtcHVyaS5vcmciKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJiYXNlNjRCaW5hcnkiLCAiTUE9PSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImJvb2xlYW4iLCAidHJ1ZSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImJ5dGUiLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImRhdGUiLCAiMjAwMS0wMS0wMSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImRhdGVUaW1lIiwgIjIwMDEtMTItMzFUMTI6MDA6MDAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJkZWNpbWFsIiwgIjAuMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImRvdWJsZSIsICIwLjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJkdXJhdGlvbiIsICJQMUQiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJFTlRJVFkiLCAiZW50aXR5Iik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiRU5USVRJRVMiLCAiZW50aXRpZXMiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJmbG9hdCIsICIwLjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJnRGF5IiwgIi0tLTAxIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZ01vbnRoIiwgIi0tMDEtLSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImdNb250aERheSIsICItLTAxLTAxIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZ1llYXIiLCAiMjAwMSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImdZZWFyTW9udGgiLCAiMjAwMS0wMSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImhleEJpbmFyeSIsICIwRjAwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiSUQiLCBudWxsKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJJRFJFRiIsIG51bGwpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIklEUkVGUyIsIG51bGwpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImludCIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiaW50ZWdlciIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgibGFuZ3VhZ2UiLCAiRU4iKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJsb25nIiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJOYW1lIiwgIk5hbWUiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJOQ05hbWUiLCAiTkNOYW1lIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgibmVnYXRpdmVJbnRlZ2VyIiwgIi0xIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiTk1UT0tFTiIsICJOTVRPS0VOIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiTk1UT0tFTlMiLCAiTk1UT0tFTlMiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJub25OZWdhdGl2ZUludGVnZXIiLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIm5vblBvc2l0aXZlSW50ZWdlciIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgibm9ybWFsaXplZFN0cmluZyIsIG51bGwpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIk5PVEFUSU9OIiwgIk5PVEFUSU9OIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgicG9zaXRpdmVJbnRlZ2VyIiwgIjEiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJRTmFtZSIsICJRTmFtZSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoInNob3J0IiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJzdHJpbmciLCBudWxsKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJ0aW1lIiwgIjEyOjAwOjAwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgidG9rZW4iLCAidG9rZW4iKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJ1bnNpZ25lZEJ5dGUiLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoInVuc2lnbmVkSW50IiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJ1bnNpZ25lZExvbmciLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoInVuc2lnbmVkU2hvcnQiLCAiMCIpOwotICB9Ci0KLQotICAvKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgaXMgYnVpbHQtaW4uCi0gICAqIEBwYXJhbSB0eXBlIC0gYW4gWFNEVHlwZURlZmluaXRpb24gb2JqZWN0LgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgaXMgYnVpbHQtaW4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCdWlsdEluKFhTRFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsgCi0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFN0cmluZyBuYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm4gIGRlZmF1bHRWYWx1ZS5jb250YWluc0tleShuYW1lKTsgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgdmFsaWQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHNpbXBsZSB0eXBlLgotICAgKiBAcGFyYW0gdHlwZSAtIGEgc2ltcGxlIGJ1aWx0LWluIHR5cGUuCi0gICAqIEByZXR1cm4gYSB2YWxpZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc2ltcGxlIHR5cGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbnN0YW5jZVZhbHVlKFhTRFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChpc0J1aWx0SW4odHlwZSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lSUQgPSB0eXBlLmdldE5hbWUoKTsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpZGVmYXVsdFZhbHVlLmdldChuYW1lSUQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiBiYXNldHlwZSA9IHR5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgaWYgKGJhc2V0eXBlICE9IHR5cGUpIHJldHVybiBnZXRJbnN0YW5jZVZhbHVlKGJhc2V0eXBlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmNTgzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETm90YXRpb25EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotCi1wdWJsaWMgY2xhc3MgWFNEVmlzaXRvcgotewotICBwdWJsaWMgWFNEVmlzaXRvcigpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSBzY2hlbWE7Ci0gIHByb3RlY3RlZCBTdGFjayBwYXJ0aWNsZVN0YWNrID0gbmV3IFN0YWNrKCk7Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gKFhTRFR5cGVEZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdFR5cGVEZWZpbml0aW9uKHR5cGUpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0SWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24gaWRlbnRpdHlDb25zdHJhaW50ID0gKFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0SWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbihpZGVudGl0eUNvbnN0cmFpbnQpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldE1vZGVsR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihtb2RlbEdyb3VwKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihhdHRyaWJ1dGVHcm91cCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0Tm90YXRpb25EZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRE5vdGF0aW9uRGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0ROb3RhdGlvbkRlY2xhcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdE5vdGF0aW9uRGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRUeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbil0eXBlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbigoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXR5cGUpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgdmlzaXRUeXBlRGVmaW5pdGlvbihlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24gaWRlbnRpdHlDb25zdHJhaW50KQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cERlZikKLSAgewotICAgIGlmICghbW9kZWxHcm91cERlZi5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgaWYgKG1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZpc2l0TW9kZWxHcm91cChtb2RlbEdyb3VwRGVmLmdldE1vZGVsR3JvdXAoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXApCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXROb3RhdGlvbkRlY2xhcmF0aW9uKFhTRE5vdGF0aW9uRGVjbGFyYXRpb24gbm90YXRpb24pCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbihYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCBjb21wbGV4Q29udGVudCA9IHR5cGUuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgIGlmIChjb21wbGV4Q29udGVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiljb21wbGV4Q29udGVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjb21wbGV4Q29udGVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICB2aXNpdFBhcnRpY2xlKChYU0RQYXJ0aWNsZSkgY29tcGxleENvbnRlbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRQYXJ0aWNsZShYU0RQYXJ0aWNsZSBwYXJ0aWNsZSkKLSAgewotICAgIHZpc2l0UGFydGljbGVDb250ZW50KHBhcnRpY2xlLmdldENvbnRlbnQoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UGFydGljbGVDb250ZW50KFhTRFBhcnRpY2xlQ29udGVudCBwYXJ0aWNsZUNvbnRlbnQpCi0gIHsKLSAgICBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cERlZiA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgcGFydGljbGVDb250ZW50OwotCi0gICAgICBpZiAocGFydGljbGVTdGFjay5jb250YWlucyhtb2RlbEdyb3VwRGVmKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgICAKLSAgICAgIHBhcnRpY2xlU3RhY2sucHVzaChtb2RlbEdyb3VwRGVmKTsKLSAgICAgIAotICAgICAgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihtb2RlbEdyb3VwRGVmKTsKLSAgICAgIAotICAgICAgcGFydGljbGVTdGFjay5wb3AoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICB2aXNpdE1vZGVsR3JvdXAoKFhTRE1vZGVsR3JvdXApcGFydGljbGVDb250ZW50KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKChYU0RFbGVtZW50RGVjbGFyYXRpb24pcGFydGljbGVDb250ZW50KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpCi0gICAgewotICAgICAgdmlzaXRXaWxkY2FyZCgoWFNEV2lsZGNhcmQpcGFydGljbGVDb250ZW50KTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXApCi0gIHsKLSAgICBpZiAobW9kZWxHcm91cC5nZXRDb250ZW50cygpICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICB2aXNpdFBhcnRpY2xlKHBhcnRpY2xlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0V2lsZGNhcmQoWFNEV2lsZGNhcmQgd2lsZGNhcmQpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDMwOWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9yQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRvcjsKLQotcHVibGljIGNsYXNzIFhTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotewotICAgIHByb3RlY3RlZCBYU0RTY2hlbWFMb2NhdG9ySW1wbCBzY2hlbWFMb2NhdG9yID0gbmV3IFhTRFNjaGVtYUxvY2F0b3JJbXBsKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IFhTRFNjaGVtYUxvY2F0b3IuY2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIEFkYXB0ZXIgYWRhcHROZXcoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gc2NoZW1hTG9jYXRvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmYwMTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdG9yOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hTG9jYXRvckltcGwgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIFhTRFNjaGVtYUxvY2F0b3IKLXsKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0b3IjbG9jYXRlU2NoZW1hKG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWEsCi0gICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBYU0RTY2hlbWEgbG9jYXRlU2NoZW1hKFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyByYXdTY2hlbWFMb2NhdGlvblVSSSwgU3RyaW5nIHJlc29sdmVkU2NoZW1hTG9jYXRpb25VUkkpCi0gICAgewotICAgICAgWFNEU2NoZW1hIHJlc3VsdCA9IG51bGw7Ci0gICAgICBTdHJpbmcgYmFzZUxvY2F0aW9uID0geHNkU2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCk7ICAgICAgCi0gICAgICBTdHJpbmcgcmVzb2x2ZWRVUkkgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBuYW1lc3BhY2VVUkksIHJhd1NjaGVtYUxvY2F0aW9uVVJJKTsgCi0gICAgICBpZiAocmVzb2x2ZWRVUkkgPT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHJlc29sdmVkVVJJID0gcmVzb2x2ZWRTY2hlbWFMb2NhdGlvblVSSTsgICAgICAgCi0gICAgICB9Ci0gICAgICB0cnkKLSAgICAgIHsgICAgICAgIAotICAgICAgICBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHhzZFNjaGVtYS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotICAgICAgICBVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShyZXNvbHZlZFVSSSk7Ci0gICAgICAgIFJlc291cmNlIHIgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh1cmksIGZhbHNlKTsgCi0gICAgICAgIFhTRFJlc291cmNlSW1wbCByZXNvbHZlZFJlc291cmNlID0gbnVsbDsKLSAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBYU0RSZXNvdXJjZUltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXNvbHZlZFJlc291cmNlID0gKFhTRFJlc291cmNlSW1wbClyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgICAgICAgIAotICAgICAgICB7ICAKLSAgICAgICAgICBTdHJpbmcgcGh5c2ljYWxMb2NhdGlvbiA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oYmFzZUxvY2F0aW9uLCBuYW1lc3BhY2VVUkksIHJlc29sdmVkVVJJKTsgICAgIAotICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gcmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0oVVJJLmNyZWF0ZVVSSShwaHlzaWNhbExvY2F0aW9uKSk7Ci0gICAgICAgICAgcmVzb2x2ZWRSZXNvdXJjZSA9IChYU0RSZXNvdXJjZUltcGwpcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiKi54c2QiKSk7Ci0gICAgICAgICAgcmVzb2x2ZWRSZXNvdXJjZS5zZXRVUkkodXJpKTsKLSAgICAgICAgICByZXNvbHZlZFJlc291cmNlLmxvYWQoaW5wdXRTdHJlYW0sIG51bGwpOyAgICAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQgPSByZXNvbHZlZFJlc291cmNlLmdldFNjaGVtYSgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAgICAgLy8gSXQgaXMgZ2VuZXJhbGx5IG5vdCBhbiBlcnJvciB0byBmYWlsIHRvIHJlc29sdmUuCi0gICAgICAgIC8vIElmIGEgcmVzb3VyY2UgaXMgYWN0dWFsbHkgY3JlYXRlZCwgCi0gICAgICAgIC8vIHdoaWNoIGhhcHBlbnMgb25seSB3aGVuIHdlIGNhbiBjcmVhdGUgYW4gaW5wdXQgc3RyZWFtLAotICAgICAgICAvLyB0aGVuIGl0J3MgYW4gZXJyb3IgaWYgaXQncyBub3QgYSBnb29kIHNjaGVtYQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXRwZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IFhTRFNjaGVtYUxvY2F0b3IuY2xhc3M7Ci0gICAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE1N2Y5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIsIFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCwgYnVnIDExNDcwMzMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotLyoqCi0gKiBBbiBYU0QgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIGFsbG93cyBzZXR0aW5nIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24KLSAqIGluZm9ybWF0aW9uIGZvciBhIFdUUCBYU0QgdmFsaWRhdGlvbiBydW4uIEFueSBmZWF0dXJlcyBhbmQgcHJvcGVydGllcwotICogc2V0IG9uIHRoaXMgY29uZmlndXJhdGlvbiBzaG91bGQgbm90IGJlIGNvbmZ1c2VkIHdpdGggdGhvc2UgZnJvbQotICogcGFyc2VycyBzdWNoIGFzIFhlcmNlcy4gKFRoaXMgb2JqZWN0IGRvZXMgbm90IGJ5IGRlZmF1bHQgd3JhcCBmZWF0dXJlcwotICogYW5kIHByb3BlcnRpZXMgZnJvbSBzcGVjaWZpYyBwYXJzZXJzLikKLSAqLwotcHVibGljIGNsYXNzIFhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uIAotewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBIT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMgPSAiSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBGVUxMX1NDSEVNQV9DT05GT1JNQU5DRSA9ICJGVUxMX1NDSEVNQV9DT05GT1JNQU5DRSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBib29sZWFuIGhvbm91cl9hbGxfc2NoZW1hX2xvY2F0aW9ucyA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gZnVsbFNjaGVtYUNvbmZvcm1hbmNlID0gdHJ1ZTsKLSAgCi0gIC8qKgotICAgKiBTZXQgYSBmZWF0dXJlIG9mIHRoaXMgY29uZmlndXJhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmZWF0dXJlCi0gICAqIAkJVGhlIGZlYXR1cmUgdG8gc2V0LgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogCQlUaGUgdmFsdWUgdG8gc2V0IGZvciB0aGUgZmVhdHVyZS4KLSAgICogQHRocm93cyAKLSAgICogCQlBbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCByZWNvZ25pemVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0JaWYoSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TLmVxdWFscyhmZWF0dXJlKSkKLQkgIGhvbm91cl9hbGxfc2NoZW1hX2xvY2F0aW9ucyA9IHZhbHVlOwotCWVsc2UgaWYgKEZVTExfU0NIRU1BX0NPTkZPUk1BTkNFLmVxdWFscyhmZWF0dXJlKSkKLQkJZnVsbFNjaGVtYUNvbmZvcm1hbmNlID0gdmFsdWU7Ci0JZWxzZQotCSAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmVhdHVyZSBub3QgcmVjb2duaXplZC4iKTsgLy8kTk9OLU5MUy0xJAotCQotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gZmVhdHVyZS4gSWYgdGhlIGZlYXR1cmUgaXMgbm90IGRlZmluZWQKLSAgICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gZmVhdHVyZQotICAgKiAJCVRoZSBmZWF0dXJlIGZvciB3aGljaCB0byByZXRyaWV2ZSB0aGUgdmFsdWUuCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgZmVhdHVyZSdzIHZhbHVlLCB0cnVlIG9yIGZhbHNlLgotICAgKiBAdGhyb3dzIAotICAgKiAJCUFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHJlY29nbml6ZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLQlpZihIT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMuZXF1YWxzKGZlYXR1cmUpKQotCSAgcmV0dXJuIGhvbm91cl9hbGxfc2NoZW1hX2xvY2F0aW9uczsKLQllbHNlIGlmIChGVUxMX1NDSEVNQV9DT05GT1JNQU5DRS5lcXVhbHMoZmVhdHVyZSkpCi0gICAgICByZXR1cm4gZnVsbFNjaGVtYUNvbmZvcm1hbmNlOwotCQotCXRocm93IG5ldyBFeGNlcHRpb24oIkZlYXR1cmUgbm90IHJlY29nbml6ZWQuIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0RWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTRFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTZiNWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTRFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyLCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwsIGJ1ZyAxMTQ3MDMzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlhNTEdyYW1tYXJQcmVwYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxHcmFtbWFyUG9vbEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5ncmFtbWFycy5YTUxHcmFtbWFyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5YTUxWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXJyb3I7Ci0KLS8qKgotICogVGhlIFhTRFZhbGlkYXRvciB3aWxsIHZhbGlkYXRlIFhTRCBmaWxlcy4KLSAqLwotcHVibGljIGNsYXNzIFhTRFZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgVVJJUmVzb2x2ZXIgdXJpcmVzb2x2ZXIgPSBudWxsOwotCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmkpCi0gIHsKLSAgICByZXR1cm4gdmFsaWRhdGUodXJpLCBudWxsKTsKLSAgfQotICAKLSAgcHVibGljIFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gIHsKLQlyZXR1cm4gdmFsaWRhdGUodXJpLCBudWxsLCBudWxsKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBYU0QgZmlsZSBzcGVjaWZpZWQgYnkgdGhlIFVSSS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogCQlUaGUgVVJJIG9mIHRoZSBYU0QgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGlucHV0U3RyZWFtIAotICAgKiAJCUFuIGlucHV0IHN0cmVhbSByZXByZXNlbnRpbmcgdGhlIFhTRCBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotICAgKiAJCUEgY29uZmlndXJhdGlvbiBmb3IgdGhpcyB2YWxpZGF0aW9uIHJ1bi4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotICB7Ci0JaWYoY29uZmlndXJhdGlvbiA9PSBudWxsKQotCXsKLQkgIGNvbmZpZ3VyYXRpb24gPSBuZXcgWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oKTsKLQl9Ci0JVmFsaWRhdGlvbkluZm8gdmFsaW5mbyA9IG5ldyBWYWxpZGF0aW9uSW5mbyh1cmkpOwotCVhTREVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIgPSBuZXcgWFNERXJyb3JIYW5kbGVyKHZhbGluZm8pOwotCXRyeQotCXsKLQkgIFhNTEdyYW1tYXJQcmVwYXJzZXIgZ3JhbW1hclByZXBhcnNlciA9IG5ldyBYTUxHcmFtbWFyUHJlcGFyc2VyKCk7Ci0JICBncmFtbWFyUHJlcGFyc2VyLnJlZ2lzdGVyUHJlcGFyc2VyKFhNTEdyYW1tYXJEZXNjcmlwdGlvbi5YTUxfU0NIRU1BLG51bGwvKnNjaGVtYUxvYWRlciovKTsKLQkJICAKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0UHJvcGVydHkoQ29uc3RhbnRzLlhFUkNFU19QUk9QRVJUWV9QUkVGSVggKyBDb25zdGFudHMuWE1MR1JBTU1BUl9QT09MX1BST1BFUlRZLCBuZXcgWE1MR3JhbW1hclBvb2xJbXBsKCkpOwotCSAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuQ09OVElOVUVfQUZURVJfRkFUQUxfRVJST1JfRkVBVFVSRSwgZmFsc2UpOwotICAgICAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuTkFNRVNQQUNFU19GRUFUVVJFLCB0cnVlKTsKLSAgICAgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLk5BTUVTUEFDRV9QUkVGSVhFU19GRUFUVVJFLCB0cnVlKTsKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLlZBTElEQVRJT05fRkVBVFVSRSwgdHJ1ZSk7Ci0JICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5TQ0hFTUFfVkFMSURBVElPTl9GRUFUVVJFLCB0cnVlKTsKLQotCSAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuRVhURVJOQUxfR0VORVJBTF9FTlRJVElFU19GRUFUVVJFLCB0cnVlKTsKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLkVYVEVSTkFMX1BBUkFNRVRFUl9FTlRJVElFU19GRUFUVVJFLCB0cnVlKTsKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLldBUk5fT05fRFVQTElDQVRFX0FUVERFRl9GRUFUVVJFLCB0cnVlKTsKLQkgICAgIAotCSAgaWYoY29uZmlndXJhdGlvbi5nZXRGZWF0dXJlKFhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uLkhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUykpCi0JICB7Ci0JICAgIHRyeQotCSAgICB7Ci0JICAgICAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyAiaG9ub3VyLWFsbC1zY2hlbWFMb2NhdGlvbnMiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCSAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkgICAgewotCSAgICAgIC8vIGNhdGNoIHRoZSBleGNlcHRpb24gYW5kIGlnbm9yZQotCSAgICB9Ci0JICB9Ci0JICAKLQkgIGlmKGNvbmZpZ3VyYXRpb24uZ2V0RmVhdHVyZShYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5GVUxMX1NDSEVNQV9DT05GT1JNQU5DRSkpIHsKLQkJdHJ5Ci0JCXsKLQkJICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5TQ0hFTUFfRlVMTF9DSEVDS0lORywgdHJ1ZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQkvLyBpZ25vcmUgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBzZXQgaXQgb3IgY2FuJ3QuCi0JCX0KLQkJCi0JICB9Ci0JICAgICAgCi0JICBncmFtbWFyUHJlcGFyc2VyLnNldEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXIpOwotCSAgaWYgKHVyaXJlc29sdmVyICE9IG51bGwpCi0JICB7Ci0JICAgIFhTREVudGl0eVJlc29sdmVyIHJlc29sdmVyID0gbmV3IFhTREVudGl0eVJlc29sdmVyKHVyaXJlc29sdmVyLCB1cmkpOwotCSAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkKLQkgICAgewotCSAgICAgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIocmVzb2x2ZXIpOwotCSAgICB9Ci0JICB9Ci0KLQkgIHRyeQotCSAgewotCSAgCVhNTElucHV0U291cmNlIGlzID0gbmV3IFhNTElucHV0U291cmNlKG51bGwsIHVyaSwgdXJpLCBpbnB1dFN0cmVhbSwgbnVsbCk7Ci0JICAgIGdyYW1tYXJQcmVwYXJzZXIuZ2V0TG9hZGVyKFhNTEdyYW1tYXJEZXNjcmlwdGlvbi5YTUxfU0NIRU1BKTsKLQkJZ3JhbW1hclByZXBhcnNlci5wcmVwYXJzZUdyYW1tYXIoWE1MR3JhbW1hckRlc2NyaXB0aW9uLlhNTF9TQ0hFTUEsaXMpOwotCSAgfQotCSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCSAgewotCSAgICAvL3BhcnNlciB3aWxsIHJldHVybiBudWxsIHBvaW50ZXIgZXhjZXB0aW9uIGlmIHRoZSBkb2N1bWVudCBpcyBzdHJ1Y3R1cmFsbHkgaW52YWxpZAotCQkvL1RPRE86IGxvZyBlcnJvciBtZXNzYWdlCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgfQotCX0KLQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JewotICAgICAgLy8gVE9ETzogbG9nIGVycm9yLgotCSAgLy9TeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JfQotCXJldHVybiB2YWxpbmZvOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgVVJJIHJlc29sdmVyIHRvIHVzZSB3aXRoIFhTRCB2YWxpZGF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIHVyaXJlc29sdmVyCi0gICAqICAgICAgICAgIFRoZSBVUkkgcmVzb2x2ZXIgdG8gdXNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VVJJUmVzb2x2ZXIoVVJJUmVzb2x2ZXIgdXJpcmVzb2x2ZXIpCi0gIHsKLSAgICB0aGlzLnVyaXJlc29sdmVyID0gdXJpcmVzb2x2ZXI7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIFhTREVycm9ySGFuZGxlciBoYW5kbGUgWGVyY2VzIHBhcnNpbmcgZXJyb3JzIGFuZCBwdXRzIHRoZSBlcnJvcnMKLSAgICogaW50byB0aGUgZ2l2ZW4gVmFsaWRhdGlvbkluZm8gb2JqZWN0LgotICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIFhTREVycm9ySGFuZGxlciBpbXBsZW1lbnRzIFhNTEVycm9ySGFuZGxlcgotICB7Ci0JICAKLSAgICBwcml2YXRlIGZpbmFsIFZhbGlkYXRpb25JbmZvIHZhbGluZm87Ci0KLSAgICBwdWJsaWMgWFNERXJyb3JIYW5kbGVyKFZhbGlkYXRpb25JbmZvIHZhbGluZm8pCi0gICAgewotICAgICAgdGhpcy52YWxpbmZvID0gdmFsaW5mbzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBlcnJvcktleSBUaGUgWGVyY2VzIGVycm9yIGtleS4KLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdGhhdCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKFN0cmluZyBlcnJvcktleSwgWE1MUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uLCBpbnQgc2V2ZXJpdHkpCi0gICAgeyAKLSAgICAgIFN0cmluZyBzeXN0ZW1JZCA9IGV4Y2VwdGlvbi5nZXRFeHBhbmRlZFN5c3RlbUlkKCk7Ci0gICAgICBpZiAoc3lzdGVtSWQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHNldmVyaXR5ID09IERPTUVycm9yLlNFVkVSSVRZX1dBUk5JTkcpCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpbmZvLmFkZFdhcm5pbmcoZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKSwgZXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpLCBzeXN0ZW1JZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdmFsaW5mby5hZGRFcnJvcihleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24uZ2V0TGluZU51bWJlcigpLCBleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCksIHN5c3RlbUlkLCBlcnJvcktleSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVycm9ySGFuZGxlciN3YXJuaW5nKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MUGFyc2VFeGNlcHRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2FybmluZyhTdHJpbmcgZG9tYWluLCBTdHJpbmcga2V5LCBYTUxQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBYTklFeGNlcHRpb24KLQl7Ci0gICAgCWFkZFZhbGlkYXRpb25NZXNzYWdlKGtleSwgZXhjZXB0aW9uLCBET01FcnJvci5TRVZFUklUWV9XQVJOSU5HKTsKLQl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVycm9ySGFuZGxlciNlcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVycm9yKFN0cmluZyBkb21haW4sIFN0cmluZyBrZXksIFhNTFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFhOSUV4Y2VwdGlvbgotICAgIHsKLSAgICAJYWRkVmFsaWRhdGlvbk1lc3NhZ2Uoa2V5LCBleGNlcHRpb24sIERPTUVycm9yLlNFVkVSSVRZX0VSUk9SKTsKLQl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVycm9ySGFuZGxlciNmYXRhbEVycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MUGFyc2VFeGNlcHRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTdHJpbmcgZG9tYWluLCBTdHJpbmcga2V5LCBYTUxQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBYTklFeGNlcHRpb24KLQl7Ci0gICAgCWFkZFZhbGlkYXRpb25NZXNzYWdlKGtleSwgZXhjZXB0aW9uLCBET01FcnJvci5TRVZFUklUWV9GQVRBTF9FUlJPUik7Ci0JfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBYU0RFbnRpdHlSZXNvbHZlciB3cmFwcyBhbiBpZHJlc29sdmVyIHRvIHByb3ZpZGUgZW50aXR5IHJlc29sdXRpb24gdG8KLSAgICogdGhlIFhTRCB2YWxpZGF0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgWFNERW50aXR5UmVzb2x2ZXIgaW1wbGVtZW50cyBYTUxFbnRpdHlSZXNvbHZlcgotICB7Ci0gICAgcHJpdmF0ZSBVUklSZXNvbHZlciB1cmlyZXNvbHZlciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWRyZXNvbHZlcgotICAgICAqICAgICAgICAgIFRoZSBpZHJlc29sdmVyIHRoaXMgZW50aXR5IHJlc29sdmVyIHdyYXBzLgotICAgICAqIEBwYXJhbSBiYXNlbG9jYXRpb24gVGhlIGJhc2UgbG9jYXRpb24gdG8gcmVzb2x2ZSB3aXRoLgotICAgICAqLwotICAgIHB1YmxpYyBYU0RFbnRpdHlSZXNvbHZlcihVUklSZXNvbHZlciB1cmlyZXNvbHZlciwgU3RyaW5nIGJhc2Vsb2NhdGlvbikKLSAgICB7Ci0gICAgICB0aGlzLnVyaXJlc29sdmVyID0gdXJpcmVzb2x2ZXI7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyKQotICAgICAqLwotICAgIHB1YmxpYyBYTUxJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFhNTFJlc291cmNlSWRlbnRpZmllciByZXNvdXJjZUlkZW50aWZpZXIpIHRocm93cyBYTklFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgU3RyaW5nIGxpdGVyYWxTeXN0ZW1JZCA9IHJlc291cmNlSWRlbnRpZmllci5nZXRMaXRlcmFsU3lzdGVtSWQoKTsKLSAgICAgIGlmKGxpdGVyYWxTeXN0ZW1JZCAhPSBudWxsKQotICAgICAgewotICAgIAlyZXNvdXJjZUlkZW50aWZpZXIuc2V0TGl0ZXJhbFN5c3RlbUlkKGxpdGVyYWxTeXN0ZW1JZC5yZXBsYWNlKCdcXCcsJy8nKSk7Ci0gICAgICB9Ci0gICAgICAgIC8vIFRPRE8gY3M6IEluIHJldmlzaW9uIDEuMSB3ZSBleHBsaWNpdGx5IG9wZW5lZCBhIHN0cmVhbSB0byBlbnN1cmUKLSAgICAgICAgLy8gZmlsZSBJL08gcHJvYmxlbXMgcHJvZHVjZWQgbWVzc2FnZXMuIEkndmUgcmVtb3ZlIHRoaXMgZnVkZ2UgZm9yIG5vdwotICAgICAgICAvLyBzaW5jZSBJIGNhbid0IHNlZW0gdG8gcmVwcm9kdWNlIHRoZSBwcm9ibGVtIGl0IHdhcyBpbnRlbmRlZCB0byBmaXguCi0gICAgICAgIC8vIEknbSBob3BpbmcgdGhlIG5ld2VyIFhlcmNlcyBjb2RlIGJhc2UgaGFzIGZpeGVkIHRoaXMgcHJvYmxlbSBhbmQgdGhlIGZ1ZGdlIGlzIGRlZnVuY3QuCi0gICAgICAgIHJldHVybiBYTUxWYWxpZGF0b3IuX2ludGVybmFsUmVzb2x2ZUVudGl0eSh1cmlyZXNvbHZlciwgcmVzb3VyY2VJZGVudGlmaWVyKTsKLSAgICAgIAotICAgIH0KLSAgfSAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYTAzMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciwgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsLCBidWcgMTE0NzAzMwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5YU0RDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0RDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IKLXsKLSAgcHJvdGVjdGVkIEhhc2hNYXAgeHNkQ29uZmlndXJhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3Ijc2V0dXBWYWxpZGF0aW9uKG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldHVwVmFsaWRhdGlvbihOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIAotICB7Ci0JWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbigpOwotCWJvb2xlYW4gaG9ub3VyQWxsU2NoZW1hTG9jYXRpb25zID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TKTsKLQlib29sZWFuIGZ1bGxTY2hlbWFDb25mb3JtYW5jZSA9IFhTRENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYU0RDb3JlUHJlZmVyZW5jZU5hbWVzLkZVTExfU0NIRU1BX0NPTkZPUk1BTkNFKTsKLQl0cnkKLQl7Ci0JICBjb25maWd1cmF0aW9uLnNldEZlYXR1cmUoWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TLCBob25vdXJBbGxTY2hlbWFMb2NhdGlvbnMpOwotCSAgY29uZmlndXJhdGlvbi5zZXRGZWF0dXJlKFhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uLkZVTExfU0NIRU1BX0NPTkZPUk1BTkNFLCBmdWxsU2NoZW1hQ29uZm9ybWFuY2UpOwotCX0KLQljYXRjaChFeGNlcHRpb24gZSkKLQl7Ci0JICAvLyBVbmFibGUgdG8gc2V0IHRoZSBob25vdXIgYWxsIHNjaGVtYSBsb2NhdGlvbnMgb3B0aW9uLiBEbyBub3RoaW5nLgotCX0KLQl4c2RDb25maWd1cmF0aW9ucy5wdXQoY29udGV4dCwgY29uZmlndXJhdGlvbik7Ci0JCi0Jc3VwZXIuc2V0dXBWYWxpZGF0aW9uKGNvbnRleHQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IjdGVhcmRvd25WYWxpZGF0aW9uKG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHRlYXJkb3duVmFsaWRhdGlvbihOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIAotICB7Ci0JeHNkQ29uZmlndXJhdGlvbnMucmVtb3ZlKGNvbnRleHQpOwotCQotCXN1cGVyLnRlYXJkb3duVmFsaWRhdGlvbihjb250ZXh0KTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5TdHJpbmcsIGphdmEuaW8uSW5wdXRTdHJlYW0sIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpCi0gIHsgIAotCVhTRFZhbGlkYXRvciB2YWxpZGF0b3IgPSBYU0RWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkKLQlYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gKFhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uKXhzZENvbmZpZ3VyYXRpb25zLmdldChjb250ZXh0KTsKLQotCVZhbGlkYXRpb25SZXBvcnQgdmFscmVwb3J0ID0gbnVsbDsKLQkKLQl2YWxyZXBvcnQgPSB2YWxpZGF0b3IudmFsaWRhdGUodXJpLCBpbnB1dHN0cmVhbSwgY29uZmlndXJhdGlvbik7Ci0JCSAgICAgICAgCi0JcmV0dXJuIHZhbHJlcG9ydDsKLSAgfQotCSAgCi0gIC8qKgotICAgKiBTdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBtZXNzYWdlIHBhcmFtZXRlcnMuIEZvciBYU0QgdmFsaWRhdGlvbiB0aGVyZQotICAgKiBhcmUgdGhyZWUgYWRkaXRpb25hbCBwaWVjZXMgb2YgaW5mb3JtYXRpb24gdG8gc3RvcmU6Ci0gICAqIHBhcmFtWzBdID0gdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGVycm9yCi0gICAqIHBhcmFtWzFdID0gdGhlICdzcXVpZ2dsZSBzZWxlY3Rpb24gc3RyYXRlZ3knIGZvciB3aGljaCBET00gcGFydCB0byBzcXVpZ2dsZQotICAgKiBwYXJhbVsyXSA9IHRoZSBuYW1lIG9yIHZhbHVlIG9mIHdoYXQgaXMgdG8gYmUgc3F1aWdnbGVkCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IjYWRkSW5mb1RvTWVzc2FnZShvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25NZXNzYWdlLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYWRkSW5mb1RvTWVzc2FnZShWYWxpZGF0aW9uTWVzc2FnZSB2YWxpZGF0aW9uTWVzc2FnZSwgSU1lc3NhZ2UgbWVzc2FnZSkKLSAgeyAKLQlTdHJpbmcga2V5ID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0S2V5KCk7Ci0JaWYoa2V5ICE9IG51bGwpCi0JewotCSAgWFNETWVzc2FnZUluZm9IZWxwZXIgbWVzc2FnZUluZm9IZWxwZXIgPSBuZXcgWFNETWVzc2FnZUluZm9IZWxwZXIoKTsKLQkgIFN0cmluZ1tdIG1lc3NhZ2VJbmZvID0gbWVzc2FnZUluZm9IZWxwZXIuY3JlYXRlTWVzc2FnZUluZm8oa2V5LCB2YWxpZGF0aW9uTWVzc2FnZS5nZXRNZXNzYWdlKCkpOwotCi0JICBtZXNzYWdlLnNldEF0dHJpYnV0ZShDT0xVTU5fTlVNQkVSX0FUVFJJQlVURSwgbmV3IEludGVnZXIodmFsaWRhdGlvbk1lc3NhZ2UuZ2V0Q29sdW1uTnVtYmVyKCkpKTsKLQkgIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKFNRVUlHR0xFX1NFTEVDVElPTl9TVFJBVEVHWV9BVFRSSUJVVEUsIG1lc3NhZ2VJbmZvWzBdKTsKLQkgIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKFNRVUlHR0xFX05BTUVfT1JfVkFMVUVfQVRUUklCVVRFLCBtZXNzYWdlSW5mb1sxXSk7Ci0JfQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IjZ2V0VmFsaWRhdG9ySUQoKQotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0b3JJRCgpCi0gIHsKLSAgICAvLyBCZWNhdXNlIHRoaXMgY2xhc3MgaXMgdXNlZCBhcyBhIGRlbGVnYXRlLCByZXR1cm4gdGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IKLSAgICAvLyB3aGljaCBkZWxlZ2F0ZXMgdG8gdGhpcyBjbGFzcy4KLQotICAgIHJldHVybiBYU0REZWxlZ2F0aW5nVmFsaWRhdG9yLmNsYXNzLmdldE5hbWUoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YU0REZWxlZ2F0aW5nVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hTRERlbGVnYXRpbmdWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2MTViYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hTRERlbGVnYXRpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlcy5EZWxlZ2F0aW5nVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB1bmlxdWUgbmFtZSAoY2xhc3MgbmFtZSkgd2hpY2ggdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrCi0gKiB3aWxsIHVzZSB0byBpZGVudGlmeSB0aGUgWFNEIHZhbGlkYXRvci4gVGhlIGFjdHVhbCBkZWxlZ2F0aW5nIHZhbGlkYXRvcgotICogZnVuY3Rpb25hbGl0eSBpcyBwcm92aWRlZCBieSB0aGUgYmFzZSBjbGFzcy4gVGhlIGFjdHVhbCB2YWxpZGF0aW9uCi0gKiBmdW5jdGlvbmFsaXR5IGlzIHByb3ZpZGVkIGJ5IHRoZSBkZWxlZ2F0ZXMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgY2xhc3MgYXMKLSAqIHRoZWlyIHRhcmdldC4KLSAqLwotcHVibGljIGNsYXNzIFhTRERlbGVnYXRpbmdWYWxpZGF0b3IgZXh0ZW5kcyBEZWxlZ2F0aW5nVmFsaWRhdG9yCi17Ci0gIC8qKgotICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFhTRERlbGVnYXRpbmdWYWxpZGF0b3IoKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWFNETWVzc2FnZUluZm9IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWFNETWVzc2FnZUluZm9IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRlMzI5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hTRE1lc3NhZ2VJbmZvSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlOwotCi0KLS8qKgotICogVGhlIFhTRE1lc3NhZ2VJbmZvSGVscGVyIGNyZWF0ZXMgYSBzdHJpbmcgd2l0aCB0aGUKLSAqLwotcHVibGljIGNsYXNzIFhTRE1lc3NhZ2VJbmZvSGVscGVyCi17Ci0gIHB1YmxpYyBYU0RNZXNzYWdlSW5mb0hlbHBlcigpCi0gIHsgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBjcmVhdGVNZXNzYWdlSW5mbyhTdHJpbmcgZXJyb3JLZXksIFN0cmluZyBlcnJvck1lc3NhZ2UpCi0gIHsgCi0gICAgLy9Ob3cgbWFwIHRoZSBlcnJvciBrZXkgdG8gd2hhdCB3ZSB3b3VsZCB3YW50IHRvIHVuZGVybGluZToKLSAgICBTdHJpbmcgbmFtZU9yVmFsdWUgPSAiIjsKLSAgICBTdHJpbmcgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiIjsKLSAgICBpZihlcnJvcktleSAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlcnJvcktleS5lcXVhbHMoInM0cy1lbHQtaW52YWxpZC1jb250ZW50LjEiKSB8fCBlcnJvcktleS5lcXVhbHMoInM0cy1lbHQtbXVzdC1tYXRjaC4xIikgfHwgCi0gICAgCQkgIGVycm9yS2V5LmVxdWFscygiczRzLWF0dC1tdXN0LWFwcGVhciIpIHx8IGVycm9yS2V5LmVxdWFscygiczRzLWVsdC1pbnZhbGlkLWNvbnRlbnQuMiIpKSAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJCAgLy8kTk9OLU5MUy0zJCAgLy8kTk9OLU5MUy00JAotICAgICAgeyAKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3kgPSAiU1RBUlRfVEFHIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJzNHMtYXR0LW5vdC1hbGxvd2VkIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsgCi0gICAgCXNlbGVjdGlvblN0cmF0ZWd5ID0gIkFUVFJJQlVURV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBuYW1lT3JWYWx1ZSA9IGdldEZpcnN0U3RyaW5nQmV0d2VlblNpbmdsZVF1b3RlcyhlcnJvck1lc3NhZ2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJzNHMtYXR0LWludmFsaWQtdmFsdWUiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgeyAKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3kgPSAiQVRUUklCVVRFX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBuYW1lT3JWYWx1ZSA9IGdldEZpcnN0U3RyaW5nQmV0d2VlblNpbmdsZVF1b3RlcyhlcnJvck1lc3NhZ2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJzNHMtZWx0LWNoYXJhY3RlciIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7IAotICAgIAlzZWxlY3Rpb25TdHJhdGVneSA9ICJURVhUIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJzcmMtcmVzb2x2ZS40LjIiKSB8fCBlcnJvcktleS5lcXVhbHMoInNyYy1yZXNvbHZlIikpICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0gICAgICB7IAotICAgIAlzZWxlY3Rpb25TdHJhdGVneSA9ICJWQUxVRV9PRl9BVFRSSUJVVEVfV0lUSF9HSVZFTl9WQUxVRSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbmFtZU9yVmFsdWUgPSBnZXRGaXJzdFN0cmluZ0JldHdlZW5TaW5nbGVRdW90ZXMoZXJyb3JNZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiRXFSZXF1aXJlZEluQXR0cmlidXRlIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJPcGVuUXVvdGVFeHBlY3RlZCIpIHx8IAotICAgIAkJICBlcnJvcktleS5lcXVhbHMoIkxlc3N0aGFuSW5BdHRWYWx1ZSIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgewotICAgICAgCXNlbGVjdGlvblN0cmF0ZWd5ID0gIkFUVFJJQlVURV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBuYW1lT3JWYWx1ZSA9IGdldEZpcnN0U3RyaW5nQmV0d2VlblF1b3RlcyhlcnJvck1lc3NhZ2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJFbGVtZW50VW50ZXJtaW5hdGVkIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiRU5USVJFX0VMRU1FTlQiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoIkVUYWdVbnRlcm1pbmF0ZWQiKSB8fCBlcnJvcktleS5lcXVhbHMoIkVUYWdSZXF1aXJlZCIpKSAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvblN0cmF0ZWd5ID0gIkVORF9UQUciOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIFN0cmluZyBtZXNzYWdlSW5mb1tdID0gbmV3IFN0cmluZ1syXTsKLSAgICBtZXNzYWdlSW5mb1swXSA9IHNlbGVjdGlvblN0cmF0ZWd5OwotICAgIG1lc3NhZ2VJbmZvWzFdID0gbmFtZU9yVmFsdWU7Ci0gICAgcmV0dXJuIG1lc3NhZ2VJbmZvOyAgICAKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgdmFsdWUgYmV0d2VlbiB0aGUgZmlyc3QgcGFpciBvZiBzaW5nbGUgcXVvdGVzCi0gICAqIEl0IGlzIHVzZWQgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBlcnJvciBNZXNzYWdlIChmb3IgZXhhbXBsZQotICAgKiBhbiBhdHRyaWJ1dGUgbmFtZSkKLSAgICogCi0gICAqIEBwYXJhbSBzCi0gICAqIAkJVGhlIHN0cmluZyB0byBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRGaXJzdFN0cmluZ0JldHdlZW5TaW5nbGVRdW90ZXMoU3RyaW5nIHMpCi0gIHsKLSAgICByZXR1cm4gZ2V0Rmlyc3RTdHJpbmdCZXR3ZWVuRGVsaW1pdGVycyhzLCAnXCcnKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgdmFsdWUgYmV0d2VlbiB0aGUgZmlyc3QgcGFpciBvZiBxdW90ZXMKLSAgICogSXQgaXMgdXNlZCB0byBleHRyYWN0IGluZm9ybWF0aW9uIGZyb20gdGhlIGVycm9yIE1lc3NhZ2UgKGZvciBleGFtcGxlCi0gICAqIGFuIGF0dHJpYnV0ZSBuYW1lKQotICAgKiAKLSAgICogQHBhcmFtIHMKLSAgICogCQlUaGUgc3RyaW5nIHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20uCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpcnN0U3RyaW5nQmV0d2VlblF1b3RlcyhTdHJpbmcgcykKLSAgewotICAgIHJldHVybiBnZXRGaXJzdFN0cmluZ0JldHdlZW5EZWxpbWl0ZXJzKHMsICdcIicpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSB2YWx1ZSBiZXR3ZWVuIHRoZSBmaXJzdCBzdGFydCBhbmQgZW5kIG9jY3VycmVuY2VzIG9mIHRoZSBnaXZlbiBkZWxpbWl0ZXIgY2hhcmFjdGVyLgotICAgKiAKLSAgICogQHBhcmFtIHMKLSAgICogCQlUaGUgc3RyaW5nIHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20uCi0gICAqIEBwYXJhbSBkZWxpbWl0ZXIgCi0gICAqIAkJVGhlIHN0YXJ0IGFuZCBlbmQgY2hhcmFjdGVyCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpcnN0U3RyaW5nQmV0d2VlbkRlbGltaXRlcnMoU3RyaW5nIHMsIGNoYXIgZGVsaW1pdGVyKQotICB7Ci0gICAgaW50IGZpcnN0ID0gcy5pbmRleE9mKGRlbGltaXRlcik7Ci0gICAgaW50IHNlY29uZCA9IHMuaW5kZXhPZihkZWxpbWl0ZXIsIGZpcnN0ICsgMSk7Ci0gICAgU3RyaW5nIHN0cmluZ0JldHdlZW5EZWxpbWl0ZXJzID0gbnVsbDsKLSAgICBpZiAoZmlyc3QgIT0gLTEgJiYgc2Vjb25kICE9IC0xKQotICAgIHsgCi0gICAgICBzdHJpbmdCZXR3ZWVuRGVsaW1pdGVycyA9IHMuc3Vic3RyaW5nKGZpcnN0ICsgMSwgc2Vjb25kKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0cmluZ0JldHdlZW5EZWxpbWl0ZXJzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hTRFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YU0RWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJlMWEwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hTRFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotCi0KLS8qKgotICogQW4gWFNEIHZhbGlkYXRvciBzcGVjaWZpYyB0byBFY2xpcHNlLiBUaGlzIHZhbGlkYXRvciB3aWxsIHdyYXAgdGhlIGludGVybmFsCi0gKiBYU0QgdmFsaWRhdG9yIGFuIHByb3ZpZGUgYXV0b21hdGljIFVSSSByZXNvbHV0aW9uIHN1cHBvcnQuCi0gKiBVc2luZyB0aGlzIGNsYXNzIGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcgdGhlIGludGVybmFsIFhTRCB2YWxpZGF0b3IgYW5kIHJlZ2lzdGVyaW5nCi0gKiB0aGUgVVJJIHJlc29sdmVyIGZyb20gdGhlIFVSSSByZXNvbHV0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIFhTRFZhbGlkYXRvciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhTRFZhbGlkYXRvcgotewotICBwcml2YXRlIHN0YXRpYyBYU0RWYWxpZGF0b3IgaW5zdGFuY2UgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBYU0QgdmFsaWRhdG9yLiBUaGUgdmFsaWRhdG9yCi0gICAqIGNhbiBiZSByZXVzZWQgYW5kIGNhbm5vdCBiZSBjdXN0b21pemVkIHNvIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBpbnN0YW5jZSBvZiBpdC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgWFNEIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgWFNEVmFsaWRhdG9yIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmKGluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2UgPSBuZXcgWFNEVmFsaWRhdG9yKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotICAvKioKLSAgICogQ29uc3RydWN0b3IuIENyZWF0ZSB0aGUgWFNEIHZhbGlkYXRvciBhbmQgc2V0IHRoZSBVUkkgcmVzb2x2ZXIuCi0gICAqLwotICBwcm90ZWN0ZWQgWFNEVmFsaWRhdG9yKCkKLSAgewotICAgIHRoaXMuc2V0VVJJUmVzb2x2ZXIoVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvWFNEQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC9YU0RDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMzBmMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC9YU0RDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWwuWFNEQ01NYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgWFNEQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFhTRENvcmVQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgWFNEQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICBYU0RDTU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zdGFydHVwKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBYU0RDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MWYyNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5YU0RDb3JlUGx1Z2luOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIFhTRCBDb3JlIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoWFNEQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkKLQkJLy8gSW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgYmVzdCBjb21wYXRpYmlsaXR5IGFuZCBjb25mb3JtYW5jZSB0byB0aGUgWE1MIFNjaGVtYQotCQkvLyBzcGVjaWZpY2F0aW9uIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhpcyBiZSBkZWZhdWx0ZWQgdG8gdHJ1ZS4KLQkJbm9kZS5wdXRCb29sZWFuKFhTRENvcmVQcmVmZXJlbmNlTmFtZXMuRlVMTF9TQ0hFTUFfQ09ORk9STUFOQ0UsIHRydWUpOwotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmZjNzRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBDb21tb24gcHJlZmVyZW5jZSBrZXlzIHVzZWQgYnkgWFNEIGNvcmUKLSAqLwotcHVibGljIGNsYXNzIFhTRENvcmVQcmVmZXJlbmNlTmFtZXMgewotCXByaXZhdGUgWFNEQ29yZVByZWZlcmVuY2VOYW1lcygpIHsKLQkJLy8gZW1wdHkgcHJpdmF0ZSBjb25zdHJ1Y3RvciBzbyB1c2VycyBjYW5ub3QgaW5zdGFudGlhdGUgY2xhc3MKLQl9Ci0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGFsbCBzY2hlbWEgbG9jYXRpb25zIHNob3VsZCBiZSBob25vdXJlZAotCSAqIGR1cmluZyBYU0QgdmFsaWRhdGlvbi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge1RSVUUsIEZBTFNFfQotCSAqIDwvcD4KLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUyA9ICJob25vdXJBbGxTY2hlbWFMb2NhdGlvbnMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMX1NDSEVNQV9DT05GT1JNQU5DRSA9ICJmdWxsU2NoZW1hQ29uZm9ybWFuY2UiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MmI1MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtcmVmYWN0b3IiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtYWR0Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWFkdC14c2QiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtY29tbW9uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWFkdC14c2QtdHlwZXZpeiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1zZWFyY2giLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ij4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwMGU0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi14c2RlZGl0b3IuamFyCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3QueHNkLnVpXzEuMC4wLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWIzODI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2QudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjODgyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotI1R1ZSBKYW4gMTYgMTc6NDg6MzAgRVNUIDIwMDcNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4NCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDANCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE3ODJlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1R1ZSBKYW4gMTYgMTc6MDQ6MTMgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9dXNlcgotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MWNkNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNg0KLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MA0KLWNvbXBpbGVycy5wLmJ1aWxkPTANCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTENCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wDQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTANCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wDQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MA0KLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wDQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wDQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTANCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlDQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YjE0NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJV9VSV9QTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhzZC51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjMwMy5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5wcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpejt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5sYXlvdXRzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMucHJvdmlkZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b207eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmxheW91dHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3M7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLmljb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uYXZpZ2F0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uc2VkaXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuaGFuZGxlcnMsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnN0cnVjdHVyZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2g7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudmFsaWRhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2lkZ2V0czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkczt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQ7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuNDAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZ2VmO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnhzZC5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5zZWFyY2g7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIKLUltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS51dGlsO3ZlcnNpb249IjMuOC4xIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5MTI3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy1zZWFyY2gvLFwKLSAgICAgICAgICAgc3JjLXJlZmFjdG9yLyxcCi0gICAgICAgICAgIHNyYy1hZHQvLFwKLSAgICAgICAgICAgc3JjLWFkdC14c2QvLFwKLSAgICAgICAgICAgc3JjLWFkdC14c2QtdHlwZXZpei8sXAotICAgICAgICAgICBzcmMtY29tbW9uLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbAotb3V0cHV0Li4gPSBiaW4vCi1qYXZhY1NvdXJjZT0xLjQKLWphdmFjVGFyZ2V0PTEuNAotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTQ0NDNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIgotCW5hbWU9Im9yZy5lY2xpcHNlLndzdC54c2QiPgotCTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci0JPHBsdWdpbglpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4JaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL1hTREZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL1hTREZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTAwZjFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9YU0RGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ibGFuay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvYmxhbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTM2ZTIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ibGFuay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9icm93c2VidXR0b24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2RhZTU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9icm93c2VidXR0b24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2NvbGxhcHNlX2F0dHIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2NvbGxhcHNlX2F0dHIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODcyYmVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9jb2xsYXBzZV9hdHRyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9jdG9vbDE2L05ld1hTRC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvY3Rvb2wxNi9OZXdYU0QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmVmZGQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9jdG9vbDE2L05ld1hTRC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZGVsZXRlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZGVsZXRlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OTIyYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2RlbGV0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2RsY2wxNi9zY2hlbWF2aWV3X2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kbGNsMTYvc2NoZW1hdmlld19jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNjc5NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2RsY2wxNi9zY2hlbWF2aWV3X2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kbGNsMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kbGNsMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0ZmYxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZGxjbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZHRvb2wxNi9jYXB0dXJlc2NyZWVuLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kdG9vbDE2L2NhcHR1cmVzY3JlZW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTcwYzkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kdG9vbDE2L2NhcHR1cmVzY3JlZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2R0b29sMTYvaGVscF9jb250ZW50cy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZHRvb2wxNi9oZWxwX2NvbnRlbnRzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRiZjYxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZHRvb2wxNi9oZWxwX2NvbnRlbnRzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kdG9vbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZHRvb2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTRmZjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kdG9vbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZWxjbDE2L3NjaGVtYXZpZXdfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2VsY2wxNi9zY2hlbWF2aWV3X2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJkN2YxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZWxjbDE2L3NjaGVtYXZpZXdfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2VsY2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2VsY2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGMxOWEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9lbGNsMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L2NhcHR1cmVzY3JlZW4uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvY2FwdHVyZXNjcmVlbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NjgzMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvY2FwdHVyZXNjcmVlbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi9oZWxwX2NvbnRlbnRzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L2hlbHBfY29udGVudHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDcwMzAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L2hlbHBfY29udGVudHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYzE5YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L3pvb21taW51cy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi96b29tbWludXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDJjOTJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L3pvb21taW51cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi96b29tcGx1cy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi96b29tcGx1cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NmQ3NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvem9vbXBsdXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V4cGFuZF9hdHRyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9leHBhbmRfYXR0ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMjg3ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V4cGFuZF9hdHRyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9maWx0ZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2ZpbHRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZTZmMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2ZpbHRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQW55QXR0cmlidXRlZGlzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBbnlBdHRyaWJ1dGVkaXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDQwYTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBbnlBdHRyaWJ1dGVkaXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREFueWRpcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQW55ZGlzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkYTc1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQW55ZGlzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVHcm91cC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlR3JvdXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YThkZjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVHcm91cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZUdyb3VwUmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjMWRiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZUdyb3VwUmVmZGlzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVHcm91cFJlZmRpcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZGM1OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZUdyb3VwUmVmZGlzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVHcm91cGRpcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlR3JvdXBkaXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTgxNjc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVHcm91cGRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlUmVmZGlzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVSZWZkaXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODBhZjUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVSZWZkaXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZWRpcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlZGlzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIxZDE5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlZGlzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RDb21wbGV4Q29udGVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQ29tcGxleENvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTBjMTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RDb21wbGV4Q29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQ29tcGxleFR5cGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTRENvbXBsZXhUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc4Yjk0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQ29tcGxleFR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTRENvbXBsZXhUeXBlZGlzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RDb21wbGV4VHlwZWRpcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZDFiM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTRENvbXBsZXhUeXBlZGlzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RFbGVtZW50UmVmZGlzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RFbGVtZW50UmVmZGlzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBiZDNhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNERWxlbWVudFJlZmRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNERWxlbWVudGRpcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNERWxlbWVudGRpcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNTY4NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREVsZW1lbnRkaXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREdyb3VwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RHcm91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MmMyZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RHcm91cFJlZi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNER3JvdXBSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjg5ODdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RHcm91cFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNER3JvdXBSZWZkaXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREdyb3VwUmVmZGlzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxN2U5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNER3JvdXBSZWZkaXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREdyb3VwZGlzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RHcm91cGRpcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZGY3ZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREdyb3VwZGlzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RTaW1wbGVDb250ZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RTaW1wbGVDb250ZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlODEyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEU2ltcGxlQ29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYWxsX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYWxsX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMzdmYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2FsbF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2FsbGRpc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2FsbGRpc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjU0ODRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hbGxkaXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hbm5vdGF0aW9uc2hlYWRlci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYW5ub3RhdGlvbnNoZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmZiNjgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hbm5vdGF0aW9uc2hlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYXR0cmlidXRlZ3JvdXBzaGVhZGVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hdHRyaWJ1dGVncm91cHNoZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODA5MmZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hdHRyaWJ1dGVncm91cHNoZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2F0dHJpYnV0ZXNoZWFkZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2F0dHJpYnV0ZXNoZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjU0ODc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hdHRyaWJ1dGVzaGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9jaG9pY2Vfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9jaG9pY2Vfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFmNTgzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvY2hvaWNlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvY2hvaWNlZGlzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvY2hvaWNlZGlzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlY2M0ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Nob2ljZWRpc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2RpcmVjdGl2ZXNoZWFkZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2RpcmVjdGl2ZXNoZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDAwY2I4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9kaXJlY3RpdmVzaGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9lbGVtZW50c2hlYWRlci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZWxlbWVudHNoZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmY3MjA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9lbGVtZW50c2hlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZXJyb3JfbWFya2VyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9lcnJvcl9tYXJrZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWUxZTI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9lcnJvcl9tYXJrZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Vycm9yX3Rzay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZXJyb3JfdHNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwNDhkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZXJyb3JfdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9leHRuc25fb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9leHRuc25fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0YTk1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZXh0bnNuX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZXh0bnNuZGlzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZXh0bnNuZGlzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0M2NkMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2V4dG5zbmRpc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2dyb3Vwc2hlYWRlci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZ3JvdXBzaGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhMTFjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZ3JvdXBzaGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9pbmRleC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvaW5kZXguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmY5YWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9pbmRleC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvbm90YXRpb25zaGVhZGVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9ub3RhdGlvbnNoZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDVjNjQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9ub3RhdGlvbnNoZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NlcXVlbmNlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc2VxdWVuY2Vfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiODYxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc2VxdWVuY2Vfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zZXF1ZW5jZWRpc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NlcXVlbmNlZGlzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOTcyZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NlcXVlbmNlZGlzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc2ltcGxldHlwZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NpbXBsZXR5cGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3NDQzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc2ltcGxldHlwZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NpbXBsZXR5cGVkaXNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zaW1wbGV0eXBlZGlzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMDk3M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NpbXBsZXR5cGVkaXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX2xpc3Rfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX2xpc3Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI1MThjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9saXN0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9saXN0ZGlzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9saXN0ZGlzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MzgyNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfbGlzdGRpc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfcmVzdHJpY3Rfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX3Jlc3RyaWN0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YTlhZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfcmVzdHJpY3Rfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX3Jlc3RyaWN0ZGlzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9yZXN0cmljdGRpc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjY3NjYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX3Jlc3RyaWN0ZGlzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF91bmlvbl9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfdW5pb25fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxMzE0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF91bmlvbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfdW5pb25kaXNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX3VuaW9uZGlzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNzIwM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfdW5pb25kaXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi90eXBlc2hlYWRlci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvdHlwZXNoZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjY3NTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi90eXBlc2hlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvYXR0cmlidXRlb3ZlcmxheS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvYXR0cmlidXRlb3ZlcmxheS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MzFmOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2F0dHJpYnV0ZW92ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2Vycm9yX292ci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvZXJyb3Jfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZGNjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvZXJyb3Jfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi9leHRuc25fb3ZyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi9leHRuc25fb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0NDIwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvZXh0bnNuX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvZXh0bnNuZGlzX292ci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvZXh0bnNuZGlzX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZWI3NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2V4dG5zbmRpc19vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L3RleHRvdmVybGF5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi90ZXh0b3ZlcmxheS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NTVjMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L3RleHRvdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRmYmFmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4NTAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEgUHJvcGVydGllcyBmaWxlIGZvciBjb21wb25lbnQ6IFhNU0NIIC0gWE1MIFRvb2xzIC0gIFhNTCBTY2hlbWEgRWRpdG9yCi0hIFBhY2thZ2VkIGZvciB0cmFuc2xhdGlvbiBpbjogIHhtbC56aXAKLQotIQotISBQbHVnaW4KLSEKLV9VSV9QTFVHSU5fTkFNRSAgICAgICAgICAgICA9IFhNTCBTY2hlbWEgRWRpdG9yCi1fVUlfRURJVE9SX05BTUUgICAgICAgICAgICAgPSBYTUwgU2NoZW1hIEVkaXRvcgotCi1fVUlfQUNUSU9OX0VYVF9HRU5FUkFURSAgICAgID0gJkdlbmVyYXRlCi1fVUlfQUNUSU9OX0VYVF9HRU5FUkFURV9EREwgID0gJkRETC4uLgotX1VJX0FDVElPTl9FWFRfR0VORVJBVEVfRFREICA9IEQmVEQuLi4KLV9VSV9BQ1RJT05fRVhUX0dFTkVSQVRFX0pBVkEgPSAmSmF2YSBCZWFucy4uLgotCi1fVUlfQUNUSU9OX0VYVF9HRU5FUkFURV9YU0QgPSAmR2VuZXJhdGUgWE1MIFNjaGVtYQotX1VJX1dJWkFSRF9OQU1FX05FV19YU0QgICAgID0gWE1MIFNjaGVtYQotCi1fVUlfWE1MX1RPT0xTX1BSRUZFUkVOQ0VfUEFHRSAgPSBYTUwKLV9VSV9YTUxfU0NIRU1BX1BSRUZFUkVOQ0UgICAgICA9IFhNTCBTY2hlbWEgRmlsZXMKLV9VSV9YTUxfU0NIRU1BX0VESVRPUl9QUkVGRVJFTkNFID0gRWRpdG9yCi1fVUlfWE1MX1NDSEVNQV9WQUxJREFUT1JfUFJFRkVSRU5DRSA9IFZhbGlkYXRpb24KLQotX1VJX1dJWkFSRF9ORVdfWFNEICAgICAgICAgICAgID0gWE1MIFNjaGVtYQotX1VJX0NSRUFURV9BX05FV19TQ0hFTUEgICAgICAgID0gQ3JlYXRlIGEgbmV3IFhNTCBzY2hlbWEgZmlsZQotCi0hIE5ldyBwcm9wZXJ0eSB0YWJzCi1fVUlfTEFCRUxfR0VORVJBTCAgICAgICAgICA9IEdlbmVyYWwKLV9VSV9MQUJFTF9BVFRSSUJVVEVTICAgICAgID0gQXR0cmlidXRlcwotX1VJX0xBQkVMX0RPQ1VNRU5UQVRJT04gICAgPSBEb2N1bWVudGF0aW9uCi1fVUlfTEFCRUxfVFlQRV9DT05TVFJBSU5UUyA9IENvbnN0cmFpbnRzCi1fVUlfTEFCRUxfQVBQTElDQVRJT05fSU5GTyA9IEFwcGxpY2F0aW9uIEluZm8KLV9VSV9MQUJFTF9FWFRFTlNJT05TICAgICAgID0gRXh0ZW5zaW9ucwotX1VJX0xBQkVMX0ZBQ0VUUyAgICAgICAgICAgPSBGYWNldHMKLV9VSV9MQUJFTF9FTlVNRVJBVElPTlMgICAgID0gRW51bWVyYXRpb25zCi1fVUlfTEFCRUxfQURWQU5DRUQgICAgICAgICA9IEFkdmFuY2VkCi0KLV9VSV9MQUJFTF9SRUFEX09OTFkgICAgID0gcmVhZC1vbmx5Ci1fVUlfTEFCRUxfS0lORCAgICAgICAgICA9IEtpbmQ6Ci1fVUlfTEFCRUxfVkFSSUVUWSAgICAgICA9ICZWYXJpZXR5OgotCi1fVUlfTEFCRUxfQVBQX0lORk8gICAgICA9IEFwcCBJbmZvCi0KLSEKLSEgU2NoZW1hIEZpbGUgV2luZG93Ci0hCi1fVUlfTEFCRUxfRklMRV9OQU1FICAgICAgICAgICAgICA9IEZpbGUgbmFtZToKLV9VSV9MQUJFTF9WRVJTSU9OICAgICAgICAgICAgICAgID0gVmVyc2lvbjoKLV9VSV9UT09MVElQX1ZFUlNJT04gICAgICAgICAgICAgID0gQ29udmVuaWVudCBhdHRyaWJ1dGUgdG8gc3RvcmUgdmVyc2lvbiBudW1iZXIKLV9VSV9MQUJFTF9MQU5HVUFHRSAgICAgICAgICAgICAgID0gTGFuZ3VhZ2U6Ci1fVUlfVE9PTFRJUF9MQU5HVUFHRSAgICAgICAgICAgICA9IFJlcHJlc2VudHMgbmF0dXJhbCBsYW5ndWFnZSBpZGVudGlmaWVycwotX1VJX0dST1VQX05BTUVTUEFDRSAgICAgICAgICAgICAgPSBOYW1lc3BhY2UKLV9VSV9MQUJFTF9TQ0hFTUFfUFJFRklYICAgICAgICAgID0gJlByZWZpeDoKLV9VSV9UT09MVElQX1NDSEVNQV9QUkVGSVggICAgICAgID0gVGhlIHByZWZpeCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgbmFtZXNwYWNlLgotX1VJX0xBQkVMX1RBUkdFVF9OQU1FX1NQQUNFICAgICAgPSAmVGFyZ2V0IG5hbWVzcGFjZToKLV9VSV9UT09MVElQX1RBUkdFVF9OQU1FX1NQQUNFICAgID0gVGhlIG5hbWVzcGFjZSBmb3IgdGhpcyBzY2hlbWEuCi1fVUlfQlVUVE9OX0FQUExZICAgICAgICAgICAgICAgICA9IEFwcGx5Ci1fVUlfTEFCRUxfQVRUUklCVVRFX0ZPUk1fREVGQVVMVCA9IEF0dHJpYnV0ZSBmb3JtIGRlZmF1bHQ6Ci1fVUlfVE9PTFRJUF9BVFRSSUJVVEVfRk9STSAgICAgICA9IEluZGljYXRlcyBpZiBhbGwgYXR0cmlidXRlcyBpbiBhIHNjaGVtYSBtdXN0IGJlIHF1YWxpZmllZCBvciBub3QgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50Ci1fVUlfTEFCRUxfRUxFTUVOVF9GT1JNX0RFRkFVTFQgICA9IEVsZW1lbnQgZm9ybSBkZWZhdWx0OgotX1VJX1RPT0xUSVBfRUxFTUVOVF9GT1JNX0RFRkFVTFQgPSBJbmRpY2F0ZXMgaWYgYWxsIGVsZW1lbnRzIGluIGEgc2NoZW1hIG11c3QgYmUgcXVhbGlmaWVkIG9yIG5vdCBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQKLV9VSV9MQUJFTF9CTE9DS19ERUZBVUxUICAgICAgICAgID0gQmxvY2sgZGVmYXVsdDoKLV9VSV9UT09MVElQX0JMT0NLX0RFRkFVTFQgICAgICAgID0gQ29udHJvbCBkZXJpdmF0aW9ucyBmb3IgZXZlcnkgdHlwZSBhbmQgZWxlbWVudCBpbiB0aGUgc2NoZW1hCi1fVUlfTEFCRUxfRklOQUxfREVGQVVMVCAgICAgICAgICA9IEZpbmFsIGRlZmF1bHQ6Ci1fVUlfVE9PTFRJUF9GSU5BTF9ERUZBVUxUICAgICAgICA9IENvbnRyb2wgZGVyaXZhdGlvbnMgZm9yIGV2ZXJ5IHR5cGUgYW5kIGVsZW1lbnQgaW4gdGhlIHNjaGVtYQotX1VJX0FDVElPTl9ERUxFVEVfSU5DTFVERSAgICAgICAgPSBEZWxldGUKLV9VSV9BQ1RJT05fREVMRVRFX05PREVTICAgICAgICAgID0gRGVsZXRlIE5vZGVzCi0hIE5vdGUgdG8gdHJhbnNsYXRvcnM6IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGFjcm9ueW0gZm9yIFVuaWZvcm0gUmVzb3VyY2UgSW5kaWNhdG9yCi1fVUlfTEFCRUxfVVJJICAgICAgICAgICAgICAgICAgICA9IFVSSToKLQotCi1fVUlfTEFCRUxfQUREICAgICAgICAgICAgICA9IEFkZC4uLgotX1VJX0xBQkVMX0VESVQgICAgICAgICAgICAgPSBFZGl0Li4uCi1fVUlfTEFCRUxfUEFUVEVSTlMgICAgICAgICA9IFBhdHRlcm5zCi1fRVJST1JfRklMRV9BTFJFQURZX0VYSVNUUyA9IFRoZSBmaWxlIG5hbWUgYWxyZWFkeSBleGlzdHM6IHswfQotCi0hCi0hIEFueSBTZWN0aW9uCi0hCi0hIE5vdGUgdG8gdHJhbnNsYXRvcnMgLSB0cmFuc2xhdGUgb25seSB0aGUgd29yZCBhbmQKLV9VSV9MQUJFTF9OQU1FU1BBQ0VfQU5EX1BST0NFU1NfQ09OVEVOVFMgPSBuYW1lc3BhY2UgYW5kIHByb2Nlc3NDb250ZW50cwotCi0hCi0hIG1pbk9jY3VycyBhbmQgbWF4T2NjdXJzIHNlY3Rpb24KLSEKLSEgTm90ZSB0byB0cmFuc2xhdG9ycyAtIHRyYW5zbGF0ZSBvbmx5IHRoZSB3b3JkIGFuZAotX1VJX0xBQkVMX01JTk9DQ1VSU19BTkRfTUFYT0NDVVJTID0gbWluT2NjdXJzIGFuZCBtYXhPY2N1cnMKLQotIQotISBWYWx1ZSBJbmZvcm1hdGlvbiBTZWN0aW9uCi0hCi1fVUlfTEFCRUxfVkFMVUVfSU5GT1JNQVRJT04gICA9IFZhbHVlIEluZm9ybWF0aW9uCi0KLSEKLSEgTm90YXRpb24gd2luZG93Ci0hCi1fVUlfTk9UQVRJT05fTkFNRSAgICAgICAgICAgICAgICA9IE5hbWU6Ci1fVUlfTk9UQVRJT05fUFVCTElDICAgICAgICAgICAgICA9IFB1YmxpYzoKLV9VSV9OT1RBVElPTl9TWVNURU0gICAgICAgICAgICAgID0gU3lzdGVtOgotX1VJX1RPT0xUSVBfUFVCTElDICAgICAgICAgICAgICAgPSBBbiBvcHRpb25hbCBwdWJsaWMgaWRlbnRpZmllcgotX1VJX1RPT0xUSVBfU1lTVEVNICAgICAgICAgICAgICAgPSBBbiBvcHRpb25hbCBVUkkgcmVmZXJlbmNlCi0KLSEKLSEgQ29tcGxleCBUeXBlIFdpbmRvdwotIQotX1VJX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgPSBOYW1lOgotX1VJX0FCU1RSQUNUICAgICAgICAgICAgICAgICAgICAgPSBBYnN0cmFjdDoKLV9VSV9NSVhFRCAgICAgICAgICAgICAgICAgICAgICAgID0gTWl4ZWQ6Ci1fVUlfQkxPQ0sgICAgICAgICAgICAgICAgICAgICAgICA9IEJsb2NrOgotX1VJX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgPSBGaW5hbDoKLQotX1VJX0NUX1RPT0xUSVBfTUlYRUQgICAgICAgICAgICAgPSBJbmRpY2F0ZXMgaWYgdHlwZSBtYXkgY29udGFpbiBtaXhlZCBjb250ZW50Ci1fVUlfQ1RfVE9PTFRJUF9BQlNUUkFDVCAgICAgICAgICA9IFdoZW4gYSBjb21wbGV4IHR5cGUgaXMgZGVjbGFyZWQgYWJzdHJhY3QsIGl0IGNhbm5vdCBiZSB1c2VkIGluIGFuIGluc3RhbmNlIGRvY3VtZW50Ci1fVUlfQ1RfVE9PTFRJUF9GSU5BTCAgICAgICAgICAgICA9IFlvdSBjYW4gdXNlIHRoaXMgdG8gcHJldmVudCBmdXJ0aGVyIGRlcml2YXRpb25zCi1fVUlfQ1RfVE9PTFRJUF9CTE9DSyAgICAgICAgICAgICA9IFlvdSBjYW4gdXNlIHRoaXMgdG8gYmxvY2sgYW55IGRlcml2YXRpb25zCi0KLSEKLSEgU2ltcGxlQ29udGVudCBhbmQgQ29tcGxleENvbnRlbnQgV2luZG93Ci0hIAotX1VJX0xBQkVMX0RFUklWRURfQlkgICAgICAgICAgICA9IERlcml2ZWQgYnk6Ci1fVUlfVE9PTFRJUF9ERVJJVkVEX0JZICAgICAgICAgID0gRGVyaXZlIGJ5IGV4dGVuc2lvbiB0byBpbmhlcml0IGZyb20gYSBiYXNlIHR5cGUgY29udGVudCBtb2RlbCBhbmQgYWRkIHRvIGl0LiBEZXJpdmUgYnkgcmVzdHJpY3Rpb24gdG8gcmVzdHJpY3QgdGhlIGNvbnRlbnQgbW9kZWwgb2YgYW4gZXhpc3RpbmcgdHlwZS4KLQotIQotISBFbGVtZW50ICYgRWxlbWVudCBSZWYgV2luZG93Ci0hCi1fVUlfRUxFTUVOVF9OQU1FICAgICAgICAgICAgICAgICA9IE5hbWU6Ci1fVUlfQ0hFQ0tCT1hfTklMTEFCTEUgICAgICAgICAgICA9IE5pbGxhYmxlCi1fVUlfQ0hFQ0tCT1hfQUJTVFJBQ1QgICAgICAgICAgICA9IEFic3RyYWN0Ci1fVUlfU1VCU1RJVFVUSU9OICAgICAgICAgICAgICAgICA9IFN1YnN0aXR1dGlvbiBncm91cDoKLV9VSV9NSU5JTVVNICAgICAgICAgICAgICAgICAgICAgID0gTWluaW11bToKLV9VSV9NQVhJTVVNICAgICAgICAgICAgICAgICAgICAgID0gTWF4aW11bToKLV9VSV9SRUZFUkVOQ0VfTkFNRSAgICAgICAgICAgICAgID0gUmVmZXJlbmNlIG5hbWU6Ci0KLV9VSV9UT09MVElQX0VMRU1FTlRfTUlOSU1VTSAgICAgID0gQSBub24tbmVnYXRpdmUgaW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUgbWluaW11bSBudW1iZXIgb2YgdGltZXMgYW4gZWxlbWVudCBjYW4gb2NjdXIuCi1fVUlfVE9PTFRJUF9FTEVNRU5UX01BWElNVU0gICAgICA9IEEgbm9uLW5lZ2F0aXZlIGludGVnZXIgb3IgdW5ib3VuZGVkIGlmIHRoZXJlIGlzIG5vIHVwcGVyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGVsZW1lbnQgY2FuIG9jY3VyLgotX1VJX1RPT0xUSVBfRUxFTUVOVF9BQlNUUkFDVCAgICAgPSBXaGVuIGFuIGVsZW1lbnQgaXMgZGVjbGFyZWQgYWJzdHJhY3QsIGEgbWVtYmVyIG9mIGl0cyBlcXVpdmFsZW50IGNsYXNzIG11c3QgYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCwKLV9VSV9UT09MVElQX0VMRU1FTlRfTklMICAgICAgICAgID0gSWYgc2VsZWN0ZWQsIGFuIGF0dHJpYnV0ZSBjYW4gYmUgaW5jbHVkZWQgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IHRvIGluZGljYXRlIHRoYXQgdGhlIGVsZW1lbnQgaGFzIGEgbmlsIHZhbHVlLgotX1VJX1RPT0xUSVBfRUxFTUVOVF9TVUJTVElUVVRJT04gPSBTZWxlY3QgdGhlIGVsZW1lbnQgdGhhdCBjYW4gYmUgc3Vic3RpdHV0ZWQgYnkgdGhpcyBlbGVtZW50Ci1fVUlfVE9PTFRJUF9FTEVNRU5UX0ZPUk0gICAgICAgICA9IEluZGljYXRlcyBpZiB0aGUgZWxlbWVudCBpcyBxdWFsaWZlZCBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQKLV9VSV9UT09MVElQX0VMRU1FTlRfVkFMVUUgICAgICAgID0gUHJvdmlkZXMgYSBkZWZhdWx0IG9yIGZpeGVkIHZhbHVlIGZvciB0aGUgZWxlbWVudC4KLQotCi0hCi0hIEF0dHJpYnV0ZSBXaW5kb3cKLSEgICAgX1VJX0NPTUJPX0JPWCBzdHJpbmdzIGFyZSB1c2VkIGluIGNvZGUgZ2VuZXJhdGlvbi4gCi0hICAgIFByb2JhYmx5IGRvbid0IG5lZWQgdG8gYmUgdHJhbnNsYXRlZAotIQotX1VJX0NPTUJPX0JPWF9SRVFVSVJFRCAgICAgICAgICAgPSByZXF1aXJlZAotX1VJX0NPTUJPX0JPWF9PUFRJT05BTCAgICAgICAgICAgPSBvcHRpb25hbAotX1VJX0NPTUJPX0JPWF9QUk9ISUJJVEVEICAgICAgICAgPSBwcm9oaWJpdGVkCi0KLV9VSV9GSVhFRCAgICAgICAgICAgICAgICAgICAgICAgID0gRml4ZWQKLV9VSV9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgID0gRGVmYXVsdAotX1VJX0FUVFJJQlVURV9OQU1FICAgICAgICAgICAgICAgPSBBdHRyaWJ1dGUgbmFtZToKLV9VSV9VU0FHRSAgICAgICAgICAgICAgICAgICAgICAgID0gJlVzYWdlOgotX1VJX0ZPUk0gICAgICAgICAgICAgICAgICAgICAgICAgPSAmRm9ybSBxdWFsaWZpY2F0aW9uOgotCi1fVUlfTEFCRUxfT1RIRVJfQVRUUklCVVRFUyAgICAgICA9IE90aGVyIEF0dHJpYnV0ZXMKLQotX1VJX1RPT0xUSVBfQVRUUklCVVRFX1VTRSAgICAgICAgPSBJbmRpY2F0ZXMgaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCwgb3B0aW9uYWwsIG9yIHByb2hpYml0ZWQKLV9VSV9UT09MVElQX0FUVFJJQlVURV9WQUxVRSAgICAgID0gUHJvdmlkZXMgZGVmYXVsdCBvciBmaXhlZCB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZS4gRGVmYXVsdCB2YWx1ZSBvbmx5IHZhbGlkIGlmIFVzYWdlIHZhbHVlIGlzIHNldCB0byBvcHRpb25hbC4KLQotX1VJX1BST0NFU1NfQ09OVEVOVFMgICAgICAgICAgICAgPSBQcm9jZXNzIGNvbnRlbnRzOgotCi0hCi0hIEFubm90YXRpb24gLSBEb2MgJiBBcHBJbmZvIFdpbmRvdwotIQotX1VJX0NPTU1FTlQgICAgICAgICAgICAgICAgICAgICAgPSBDb21tZW50Ci1fVUlfVE9PTFRJUF9DT01NRU5UICAgICAgICAgICAgICA9IEluZm9ybWF0aW9uIHVzZWZ1bCB0byB0aGUgdXNlciBvciBhcHBsaWNhdGlvbgotX1VJX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgPSBTb3VyY2U6Ci1fVUlfVE9PTFRJUF9TT1VSQ0UgICAgICAgICAgICAgICA9IEFuIG9wdGlvbmFsIFVSSSByZWZlcmVuY2UgdG8gc3VwcGxlbWVudCB0aGUgbG9jYWwgaW5mb3JtYXRpb24KLV9VSV9MQU5HVUFHRSAgICAgICAgICAgICAgICAgICAgID0gTGFuZ3VhZ2U6Ci1fVUlfVE9PTFRJUF9MQU5HVUFHRV9BTk5PVEFUSU9OICA9IEluZGljYXRlIHRoZSBsYW5ndWFnZSBpbiB3aGljaCB0aGUgYW5ub3RhdGlvbiBpcyBleHByZXNzZWQKLQotIQotISBHcm91cAotISAKLV9VSV9DT05URU5UX01PREVMICAgICAgICAgICAgICAgPSBDb250ZW50IG1vZGVsCi1fVUlfU0VRVUVOQ0UgICAgICAgICAgICAgICAgICAgID0gU2VxdWVuY2UKLV9VSV9DSE9JQ0UgICAgICAgICAgICAgICAgICAgICAgPSBDaG9pY2UKLV9VSV9BTEwgICAgICAgICAgICAgICAgICAgICAgICAgPSBBbGwKLQotCi0hCi0hIFNpbXBsZSBUeXBlIFJlbGF0ZWQgRmFjZXRzICAtIGFwcGVhciBhcyBlbnRyaWVzIGluIGEgdGFibGUgLSByZXN0cmljdGlvbiBvbiBzaW1wbGUgdHlwZQotIQotX1VJX0dST1VQX0ZBQ0VUUyAgICAgICAgICAgICAgICA9IEZhY2V0cwotX1VJX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICA9IExlbmd0aAotX1VJX01JTklNVU1fTEVOR1RIICAgICAgICAgICAgICA9IE1pbmltdW0gTGVuZ3RoCi1fVUlfTUFYSU1VTV9MRU5HVEggICAgICAgICAgICAgID0gTWF4aW11bSBMZW5ndGgKLV9VSV9NSU5JTVVNX0lOQ0xVU0lWRSAgICAgICAgICAgPSBNaW5pbXVtIEluY2x1c2l2ZQotX1VJX01BWElNVU1fSU5DTFVTSVZFICAgICAgICAgICA9IE1heGltdW0gSW5jbHVzaXZlCi1fVUlfTUlOSU1VTV9FWENMVVNJVkUgICAgICAgICAgID0gTWluaW11bSBFeGNsdXNpdmUKLV9VSV9NQVhJTVVNX0VYQ0xVU0lWRSAgICAgICAgICAgPSBNYXhpbXVtIEV4Y2x1c2l2ZQotX1VJX1RPVEFMX0RJR0lUUyAgICAgICAgICAgICAgICA9IFRvdGFsIERpZ2l0cwotX1VJX0ZSQUNUSU9OX0RJR0lUUyAgICAgICAgICAgICA9IEZyYWN0aW9uIERpZ2l0cwotX1VJX1dISVRFX1NQQUNFICAgICAgICAgICAgICAgICA9IFdoaXRlIFNwYWNlCi1fVUlfRkFDRVRfTkFNRSAgICAgICAgICAgICAgICAgID0gTmFtZQotX1VJX0ZBQ0VUX1ZBTFVFICAgICAgICAgICAgICAgICA9IFZhbHVlCi1fVUlfRkFDRVRfRklYRUQgICAgICAgICAgICAgICAgID0gRml4ZWQKLQotX1VJX1RPT0xUSVBfTEVOR1RIICAgICAgICAgICAgICA9IFRoZSBudW1iZXIgb2YgdW5pdHMgb2YgbGVuZ3RoLiBNdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuCi1fVUlfVE9PTFRJUF9NSU5fTEVOICAgICAgICAgICAgID0gVGhlIG1pbmltdW0gbnVtYmVyIG9mIHVuaXRzIG9mIGxlbmd0aC4gTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLgotX1VJX1RPT0xUSVBfTUFYX0xFTiAgICAgICAgICAgICA9IFRoZSBtYXhpbXVtIG51bWJlciBvZiB1bml0cyBvZiBsZW5ndGguIE11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4KLV9VSV9UT09MVElQX01BWF9JTkNMVVNJVkUgICAgICAgPSBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHZhbHVlIHNwYWNlLiBUaGUgdmFsdWUgaXMgaXRzZWxmIGluY2x1ZGVkLgotX1VJX1RPT0xUSVBfTUFYX0VYQ0xVU0lWRSAgICAgICA9IFRoZSB1cHBlciBib3VuZCBvZiB0aGUgdmFsdWUgc3BhY2UuIFRoZSB2YWx1ZSBpcyBpdHNlbGYgZXhjbHVkZWQuCi1fVUlfVE9PTFRJUF9NSU5fSU5DTFVTSVZFICAgICAgID0gVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSB2YWx1ZSBzcGFjZS4gVGhlIHZhbHVlIGlzIGl0c2VsZiBpbmNsdWRlZC4KLV9VSV9UT09MVElQX01JTl9FWENMVVNJVkUgICAgICAgPSBUaGUgbG93ZXIgYm91bmQgb2YgdGhlIHZhbHVlIHNwYWNlLiBUaGUgdmFsdWUgaXMgaXRzZWxmIGV4Y2x1ZGVkLgotX1VJX1RPT0xUSVBfVE9UQUxfRElHSVRTICAgICAgICA9IFRoZSBtYXhpbXVtIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cy4gTXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuCi1fVUlfVE9PTFRJUF9GUkFDVElPTl9ESUdJVFMgICAgID0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIGluIHRoZSBmcmFjdGlvbmFsIHBhcnQuIE11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4KLV9VSV9UT09MVElQX1dISVRFX1NQQUNFICAgICAgICAgPSBJbmRpY2F0ZXMgaWYgd2hpdGUgc3BhY2Ugc2hvdWxkIGJlIHByZXNlcnZlZCwgcmVwbGFjZWQgb3IgY29sbGFwc2VkLiAKLQotX1VJX1RPT0xUSVBfUEFUVEVSTiAgICAgICAgICAgICA9IENvbnN0cmFpbnMgdGhlIHZhbHVlIHRvIG1hdGNoIGEgc3BlY2lmaWMgcGF0dGVybi4gVGhlIHBhdHRlcm4gbXVzdCBiZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gCi1fVUlfVE9PTFRJUF9FTlVNICAgICAgICAgICAgICAgID0gQ29uc3RyYWlucyB0aGUgdmFsdWUgdG8gYSBzcGVjaWZpZWQgc2V0IG9mIHZhbHVlcy4gCi0KLSEKLSEgU2ltcGxlL0NvbXBsZXggVHlwZSBTZWxlY3Rpb24gCi0hCi1fVUlfTEFCRUxfVFlQRV9JTkZPUk1BVElPTiAgICAgICAgICA9IFR5cGUgaW5mb3JtYXRpb24KLV9VSV9MQUJFTF9CQVNFX1RZUEUgICAgICAgICAgICAgICAgID0gQmFzZSB0eXBlCi1fVUlfTEFCRUxfQkFTRV9UWVBFX1dJVEhfQ09MT04gICAgICA9ICZCYXNlIHR5cGU6Ci1fVUlfTEFCRUxfU0VUX0JBU0VfVFlQRSAgICAgICAgICAgICA9IFNldCBCYXNlIFR5cGUKLV9VSV9BQ1RJT05fU0VUX0JBU0VfVFlQRSAgICAgICAgICAgID0gU2V0IEJhc2UgVHlwZS4uLgotX1VJX1JBRElPX05PTkUgICAgICAgICAgICAgICAgICAgICAgPSBOb25lCi1fVUlfUkFESU9fQlVJTFRfSU5fU0lNUExFX1RZUEUgICAgICA9IEJ1aWx0LWluIHNpbXBsZSB0eXBlCi1fVUlfUkFESU9fVVNFUl9ERUZJTkVEX1NJTVBMRV9UWVBFICA9IFVzZXItZGVmaW5lZCBzaW1wbGUgdHlwZQotX1VJX1JBRElPX1VTRVJfREVGSU5FRF9DT01QTEVYX1RZUEUgPSBVc2VyLWRlZmluZWQgY29tcGxleCB0eXBlCi1fVUlfTEFCRUxfTkVXX0NPTVBMRVhfVFlQRSAgICAgICAgICA9IE5ldyBDb21wbGV4IFR5cGUKLV9VSV9MQUJFTF9ORVdfU0lNUExFX1RZUEUgICAgICAgICAgID0gTmV3IFNpbXBsZSBUeXBlCi1fVUlfTEFCRUxfU0VUX1RZUEUJCQkJICAgID0gU2V0IFR5cGUKLV9VSV9MQUJFTF9TRVRfRVhJU1RJTkdfVFlQRSAJCT0gU2V0IEV4aXN0aW5nIFR5cGUuLi4KLV9VSV9OT19UWVBFICAgICAgICAgICAgICAgICAgICAgICAgID0gKipub25lKioKLV9VSV9MQUJFTF9DT01QT05FTlRTCQkJCT0gQ29tcG9uZW50czoKLV9VSV9MQUJFTF9RVUFMSUZJRVIJCQkJCT0gUXVhbGlmaWVyOgotCi1fVUlfTEFCRUxfQ09NUE9ORU5UX05BTUUJCQkgICA9IENvbXBvbmVudCBOYW1lOgotX1VJX0xBQkVMX01BVENISU5HX0NPTVBPTkVOVFMJCSAgID0gTWF0Y2hpbmcgQ29tcG9uZW50czoKLV9VSV9MQUJFTF9NQVRDSElOR19UWVBFUwkJICAgCSAgID0gTWF0Y2hpbmcgVHlwZXM6Ci1fVUlfTEFCRUxfVFlQRV9OQU1FCQkJCQkgICA9IFR5cGUgTmFtZToKLV9VSV9MQUJFTF9TUEVDSUZJRURfRklMRQkJCSAgID0gU3BlY2lmaWVkIEZpbGUKLV9VSV9MQUJFTF9FTkNMT1NJTkdfUFJPSkVDVAkJCSAgID0gRW5jbG9zaW5nIFByb2plY3QKLV9VSV9MQUJFTF9XT1JLU1BBQ0UJCQkJCSAgID0gV29ya3NwYWNlCi1fVUlfTEFCRUxfQ1VSUkVOVF9SRVNPVVJDRQkJCSAgID0gQ3VycmVudCBSZXNvdXJjZQotX1VJX0xBQkVMX1NFQVJDSF9TQ09QRQkJCQkgICA9IFNlYXJjaCBTY29wZQotX1VJX0xBQkVMX05BUlJPV19TRUFSQ0hfU0NPUEVfUkVTT1VSQ0UgPSBVc2UgcmVzb3VyY2UgdmlldyB0byBuYXJyb3cgc2VhcmNoIHNjb3BlCi1fVUlfTEFCRUxfQVZBSUxBQkxFX1RZUEVTCQkJICAgPSBBdmFpbGFibGUgVHlwZXMKLQotCi0hCi0hIENvbWJvLWJveCB2YWx1ZSAKLSEgTk9URSBUTyBUUkFOU0xBVE9SOiBEbyBub3QgdHJhbnNsYXRlIGZvbGxvd2luZyBsaW5lCi1fVUlfREVGQVVMVF9BTk9OWU1PVVMgICAgICAgICAgICAgICA9ICoqYW5vbnltb3VzKioKLQotIQotISBVbmlxdWUsIEtleSBhbmQgS2V5UmVmIHdpbmRvdwotIQotX1VJX1JFRkVSRU5DRV9LRVkgICAgICAgICAgICAgICAgICAgPSBSZWZlcmVuY2Uga2V5Ci1fVUlfU0VMRUNUT1IgICAgICAgICAgICAgICAgICAgICAgICA9IFNlbGVjdG9yCi1fVUlfRklFTERTICAgICAgICAgICAgICAgICAgICAgICAgICA9IEZpZWxkcwotCi1fVUlfVE9PTFRJUF9TRUxFQ1RPUl9URVhUICAgICAgICAgICA9IFNwZWNpZmllcyBhbiBYUGF0aCBleHByZXNzaW9uIHJlbGF0aXZlIHRvIGluc3RhbmNlcyBvZiB0aGUgY3VycmVudCBlbGVtZW50Ci1fVUlfVE9PTFRJUF9GSUVMRF9URVhUICAgICAgICAgICAgICA9IFNwZWNpZmllcyBhbiBYUGF0aCBleHByZXNzaW9uIHJlbGF0aXZlIHRvIGVhY2ggZWxlbWVudCBzZWxlY3RlZCBieSB0aGUgc2VsZWN0b3IKLQotX1VJX0FERF9CVVRUT04gICAgICAgICAgICAgICAgICAgICAgPSBBZGQ+PgotX1VJX1JFTU9WRV9CVVRUT04gICAgICAgICAgICAgICAgICAgPSA8PFJlbW92ZQotCi0hCi0hIEluY2x1ZGUgJiBJbXBvcnRzCi0hCi1fVUlfTEFCRUxfUFJFRklYICAgICAgICAgICAgICAgID0gJlByZWZpeDoKLV9VSV9MQUJFTF9OQU1FU1BBQ0UgICAgICAgICAgICAgPSAmTmFtZXNwYWNlOgotCi1fVUlfU0NIRU1BX0lOQ0xVREVfREVTQyAgICAgICAgID0gU2VsZWN0IGEgc2NoZW1hIGZpbGUgc28gdGhhdCB0aGUgZGVmaW5pdGlvbnMgaW4gdGhlIHNjaGVtYSBmaWxlIHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IHNjaGVtYS4gVGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIGluY2x1ZGVkIHNjaGVtYSBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBjdXJyZW50IHNjaGVtYS4KLV9VSV9MQUJFTF9TQ0hFTUFfSU1QT1JUX0RFU0MgICAgPSBTZWxlY3QgYSBzY2hlbWEgZmlsZSBmcm9tIGEgZGlmZmVyZW50IG5hbWVzcGFjZSBzbyB0aGF0IGl0cyBkZWZpbml0aW9ucyBjYW4gYmUgcmVmZXJlbmNlZCBieSB0aGUgY3VycmVudCBzY2hlbWEuIFlvdSBtdXN0IGFzc29jaWF0ZSBhIHByZWZpeCB3aXRoIHRoZSBuZXcgbmFtZXNwYWNlIGZvciB1c2UgaW4gdGhlIGN1cnJlbnQgc2NoZW1hLgotCi1fVUlfTEFCRUxfU0NIRU1BX0xPQ0FUSU9OICAgICAgICA9ICZTY2hlbWEgbG9jYXRpb246Ci1fVUlfQlVUVE9OX1NFTEVDVCAgICAgICAgICAgICAgICA9IFNlbGVjdAotX1VJX0ZJTEVESUFMT0dfU0VMRUNUX1hNTF9TQ0hFTUEgPSBTZWxlY3QgWE1MIHNjaGVtYSBmaWxlCi1fVUlfRklMRURJQUxPR19TRUxFQ1RfWE1MX0RFU0MgICA9IFNlbGVjdCBhbiBYTUwgc2NoZW1hIGZpbGUgZnJvbSB0aGUgV29ya2JlbmNoIHByb2plY3RzCi1fVUlfRklMRURJQUxPR19TRUxFQ1RfWE1MX1VSTCAgICA9IFNlbGVjdCBhbiBYTUwgc2NoZW1hIGZpbGUgZnJvbSBIVFRQCi0KLV9VSV9MQUJFTF9MT0FESU5HX1hNTF9TQ0hFTUEgICAgID0gTG9hZGluZyBYTUwgU2NoZW1hCi1fVUlfTEFCRUxfRklOSVNIX0xPQURJTkcgICAgICAgICA9IEZpbmlzaCBMb2FkaW5nCi1fVUlfTEFCRUxfTk9fTE9DQVRJT05fU1BFQ0lGSUVEICA9IE5vIExvY2F0aW9uIFNwZWNpZmllZAotCi0hCi0hIFhTRCBFZGl0b3IKLSEKLV9VSV9UQUJfU09VUkNFICAgICAgICAgICAgICAgICAgPSBTb3VyY2UKLV9VSV9UQUJfREVTSUdOICAgICAgICAgICAgICAgICAgPSBEZXNpZ24KLSEgIE5vdGUgdG8gdHJhbnNsYXRvcnM6IEdyYXBoIGlzIHRoZSBncmFwaGljIHZpZXcgb2YgdGhlIFhNTCBzY2hlbWEKLV9VSV9UQUJfR1JBUEggICAgICAgICAgICAgICAgICAgPSBHcmFwaAotX1VJX01FTlVfVU5ETyAgICAgICAgICAgICAgICAgICA9ICZVbmRvIEBDdHJsK1oKLV9VSV9NRU5VX1JFRE8gICAgICAgICAgICAgICAgICAgPSAmUmVkbyBAQ3RybCtZCi0KLSEKLSEgVGFzayBMaXN0IFJlbGF0ZWQgTWVzc2FnZQotIQotX1VJX1JFRl9GSUxFX0VSUk9SX0RFU0NSSVBUSU9OICAgICAgPSBUaGUgZXJyb3JzIGJlbG93IHdlcmUgZGV0ZWN0ZWQgd2hlbiB2YWxpZGF0aW5nIHRoZSBmaWxlICJ7MH0iIHZpYSB0aGUgZmlsZSAiezF9Ii4gIEluIG1vc3QgY2FzZXMgdGhlc2UgZXJyb3JzIGNhbiBiZSBkZXRlY3RlZCBieSB2YWxpZGF0aW5nICJ7Mn0iIGRpcmVjdGx5LiAgSG93ZXZlciBpdCBpcyBwb3NzaWJsZSB0aGF0IGVycm9ycyB3aWxsIG9ubHkgb2NjdXIgd2hlbiB7Mn0gaXMgdmFsaWRhdGVkIGluIHRoZSBjb250ZXh0IG9mIHszfS4KLV9VSV9SRUZfRklMRV9FUlJPUl9QVVNIX0hFTFAgICAgICAgID0gUHVzaCB0aGUgaGVscCBidXR0b24gYmVsb3cgdG8gcmVhZCBtb3JlLgotX1VJX1JFRl9GSUxFX0VSUk9SX01FU1NBR0UgICAgICAgICAgPSBSZWZlcmVuY2VkIGZpbGUgY29udGFpbnMgZXJyb3JzICh7MH0pLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJpZ2h0IGNsaWNrIG9uIHRoZSBtZXNzYWdlIGFuZCBzZWxlY3QgIlNob3cgRGV0YWlscy4uLiIKLV9VSV9SRUZfRklMRV9TSE9XX0RFVEFJTFMgICAgICAgICAgID0gU2hvdyBEZXRhaWxzLi4uCi0KLQotIQotISBYU0RFZGl0b3IgTWVudSBiYXIgY29udHJpYnV0b3IKLSEKLV9VSV9NRU5VX0dFTkVSQVRFX0pBVkEgICAgICAgICAgICAgID0gR2VuZXJhdGUgJkphdmEgQmVhbnMuLi4KLV9VSV9NRU5VX0dFTkVSQVRFX0RURCAgICAgICAgICAgICAgID0gR2VuZXJhdGUgJkRURC4uLgotX1VJX01FTlVfR0VORVJBVEVfU0FNUExFX1hNTCAgICAgICAgPSBHZW5lcmF0ZSBYTSZMLi4uCi1fVUlfTUVOVV9YU0RfRURJVE9SICAgICAgICAgICAgICAgICA9ICZYU0QKLV9VSV9NRU5VX1ZBTElEQVRFX1hNTCAgICAgICAgICAgICAgID0gJlZhbGlkYXRlIFhNTCBTY2hlbWEKLV9VSV9NRU5VX1ZBTElEQVRFX1hNTF9UT09MVElQICAgICAgID0gVmFsaWRhdGUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFhNTCBTY2hlbWEKLV9VSV9NRU5VX0dFTkVSQVRFX0pBVkFfVE9PTFRJUCAgICAgID0gR2VuZXJhdGUgSmF2YSBiZWFucyBmb3IgdGhlIFhNTCBTY2hlbWEKLV9VSV9NRU5VX0dFTkVSQVRFX0RURF9UT09MVElQICAgICAgID0gR2VuZXJhdGUgYSBEVEQgZnJvbSB0aGUgWE1MIFNjaGVtYQotX1VJX01FTlVfR0VORVJBVEVfU0FNUExFX1hNTF9UT09MVElQID0gR2VuZXJhdGUgYW4gWE1MIGZyb20gdGhlIFhNTCBTY2hlbWEKLV9VSV9NRU5VX1JFTE9BRF9ERVBFTkRFTkNJRVNfVE9PTFRJUCA9IFJlbG9hZCBEZXBlbmRlbmNpZXMKLV9VSV9NRU5VX1JFTE9BRF9ERVBFTkRFTkNJRVMgPSAmUmVsb2FkIERlcGVuZGVuY2llcwotCi0hCi0hIFByZWZlcmVuY2UgUGFnZQotIQotX1VJX1RFWFRfSU5ERU5UX0xBQkVMICAgICAgICAgICAgICAgICA9IEluZGVudGF0aW9uCi1fVUlfVEVYVF9JTkRFTlRfU1BBQ0VTX0xBQkVMICAgICAgICAgID0gJk51bWJlciBvZiBzcGFjZXM6IAotX1VJX1RFWFRfWFNEX05BTUVTUEFDRV9QUkVGSVggICAgICAgICA9IFhNTCBzY2hlbWEgbGFuZ3VhZ2UKLV9VSV9URVhUX1hTRF9ERUZBVUxUX1BSRUZJWCAgICAgICAgICAgPSBYTUwgc2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgJnByZWZpeDoKLV9VSV9RVUFMSUZZX1hTRCAgICAgICAgICAgICAgICAgICAgICAgPSAmUXVhbGlmeSBYTUwgc2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMKLV9VSV9TRVBBUkFURV9ERVNJR05fQU5EX1NPVVJDRV9WSUVXICAgPSBTZXBhcmF0ZSBTb3VyY2UsIERlc2lnbiBhbmQgR3JhcGggdmlldwotX1VJX0NPTUJJTkVEX0RFU0lHTl9BTkRfU09VUkNFX1ZJRVcgICA9IENvbWJpbmVkIFNvdXJjZSBvciBHcmFwaCB2aWV3IHdpdGggRGVzaWduIHZpZXcgCi1fVUlfTEFCRUxfRURJVE9SX0xBWU9VVCAgICAgICAgICAgICAgID0gRWRpdG9yIExheW91dAotX1VJX1BSRUZfREVTSUdOX1ZJRVdfTEFZT1VUICAgICAgICAgICA9IERlc2lnbiBWaWV3IExvY2F0aW9uCi1fVUlfUFJFRl9ERVNJR05fQk9UVE9NICAgICAgICAgICAgICAgID0gQmVsb3cKLV9VSV9QUkVGX0RFU0lHTl9SSUdIVCAgICAgICAgICAgICAgICAgPSBSaWdodAotX1VJX1RFWFRfWFNEX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSA9IERlZmF1bHQgVGFyZ2V0IE5hbWVzcGFjZToKLQotIQotISBDb250ZW50IE91dGxpbmUgVmlldyBhY3Rpb24KLSEgTk9URSBUTyBUUkFOU0xBVE9SOiBEbyBub3QgdHJhbnNsYXRlIHRoZSB3b3JkKHMpIGZvbGxvd2luZyAiQWRkIiBvbiBlYWNoIGxpbmUgaW4KLSEgICB0aGlzIHNlY3Rpb24gaS5lLiBBbm5vdGF0aW9uLCBEb2N1bWVudGF0aW9uLCBBcHBJbmZvICBUaGVzZSB3b3JkcyBhcmUgWE1MIFNjaGVtYSBrZXl3b3Jkcy4KLV9VSV9BQ1RJT05fREVMRVRFICAgICAgICAgICAgICAgICAgPSBEJmVsZXRlCi1fVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OICAgICAgICAgID0gQWRkICZBbm5vdGF0aW9uCi1fVUlfQUNUSU9OX0FERF9ET0MgICAgICAgICAgICAgICAgID0gQWRkICZEb2N1bWVudGF0aW9uCi1fVUlfQUNUSU9OX0FERF9BUFBfSU5GTyAgICAgICAgICAgID0gQWRkIEEmcHBJbmZvCi1fVUlfQUNUSU9OX0FERF9HTE9CQUxfRUxFTUVOVCAgICAgID0gQWRkIEdsb2ImYWwgRWxlbWVudAotX1VJX0FDVElPTl9BRERfS0VZICAgICAgICAgICAgICAgICA9IEFkZCAmS2V5Ci1fVUlfQUNUSU9OX0FERF9LRVlfUkVGICAgICAgICAgICAgID0gQWRkIEtleSBSZSZmCi1fVUlfQUNUSU9OX0FERF9VTklRVUUgICAgICAgICAgICAgID0gQWRkIFVuaSZxdWUKLV9VSV9BQ1RJT05fQUREX0dST1VQICAgICAgICAgICAgICAgPSBBZGQgRyZyb3VwCi1fVUlfQUREX0dST1VQX1JFRiAgICAgICAgICAgICAgICAgID0gQWRkIEdyJm91cCBSZWYKLV9VSV9BQ1RJT05fQUREX0NPTlRFTlRfTU9ERUwgICAgICAgPSBBZGQgQ29udGVudCAmTW9kZWwKLV9VSV9BQ1RJT05fQUREX0VMRU1FTlQgICAgICAgICAgICAgPSBBZGQgJkVsZW1lbnQKLV9VSV9BQ1RJT05fQUREX0VMRU1FTlRfUkVGICAgICAgICAgPSBBZGQgRSZsZW1lbnQgUmVmCi1fVUlfQUNUSU9OX0FERF9TSU1QTEVfVFlQRSAgICAgICAgID0gQWRkICZTaW1wbGUgVHlwZQotX1VJX0FDVElPTl9BRERfUEFUVEVSTiAgICAgICAgICAgICA9IEFkZCAmUGF0dGVybgotX1VJX0FDVElPTl9BRERfRU5VTSAgICAgICAgICAgICAgICA9IEFkZCBFbiZ1bWVyYXRpb24KLV9VSV9BQ1RJT05fQUREX0VOVU1TICAgICAgICAgICAgICAgPSBBZGQgRW51Jm1lcmF0aW9ucy4uLgotX1VJX0FDVElPTl9BRERfQ09NUExFWF9UWVBFICAgICAgICA9IEFkZCBDb21wbGV4ICZUeXBlCi1fVUlfQUNUSU9OX0FERF9DT01QTEVYX0NPTlRFTlQgICAgID0gQWRkIENvbXBsZSZ4IENvbnRlbnQKLV9VSV9BQ1RJT05fQUREX1NJTVBMRV9DT05URU5UICAgICAgPSBBZGQgU2ltcGxlICZDb250ZW50Ci1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUgICAgICAgICAgID0gQWRkIEF0dHJpJmJ1dGUKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUCAgICAgPSBBZGQgQXR0ciZpYnV0ZSBHcm91cAotX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQX1JFRiA9IEFkZCBBJnR0cmlidXRlIEdyb3VwIFJlZgotX1VJX0FDVElPTl9BRERfSU5DTFVERSAgICAgICAgICAgICA9IEFkZCBJbiZjbHVkZQotX1VJX0FDVElPTl9BRERfSU1QT1JUICAgICAgICAgICAgICA9IEFkZCAmSW1wb3J0Ci1fVUlfQUNUSU9OX0FERF9SRURFRklORSAgICAgICAgICAgID0gQWRkIFJlJmRlZmluZQotX1VJX0FDVElPTl9BRERfTk9UQVRJT04gICAgICAgICAgICA9IEFkZCAmTm90YXRpb24KLV9VSV9BQ1RJT05fQUREX0FOWV9FTEVNRU5UICAgICAgICAgPSBBZGQgQW4meQotX1VJX0FDVElPTl9BRERfQU5ZX0FUVFJJQlVURSAgICAgICA9IEFkZCAmQW55IEF0dHJpYnV0ZQotX1VJX0FDVElPTl9BRERfR0xPQkFMX0FUVFJJQlVURSAgICA9IEFkZCAmR2xvYmFsIEF0dHJpYnV0ZQotX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX1JFRkVSRU5DRSA9IEFkZCBBdHRyaWImdXRlIFJlZgotX1VJX0FDVElPTl9BRERfUkVTVFJJQ1RJT04gICAgICAgICA9IEFkZCBSZSZzdHJpY3Rpb24KLV9VSV9BQ1RJT05fQUREX1VOSU9OICAgICAgICAgICAgICAgPSBBZGQgVSZuaW9uCi1fVUlfQUNUSU9OX0FERF9MSVNUICAgICAgICAgICAgICAgID0gQWRkICZMaXN0Ci1fVUlfQUNUSU9OX0RFTEVURV9HUk9VUF9TQ09QRSAgICAgID0gRCZlbGV0ZQotX1VJX0FDVElPTl9BRERfQ0hPSUNFICAgICAgICAgICAgICA9IEFkZCAmQ2hvaWNlCi1fVUlfQUNUSU9OX0FERF9TRVFVRU5DRSAgICAgICAgICAgID0gQWRkIFNlJnF1ZW5jZQotX1VJX0FDVElPTl9BRERfQUxMICAgICAgICAgICAgICAgICA9IEFkZCAmQWxsCi1fVUlfQUNUSU9OX0FERF9FWFRFTlNJT04gICAgICAgICAgID0gQWRkIEUmeHRlbnNpb24KLV9VSV9BQ1RJT05fQUREX1NFTEVDVE9SICAgICAgICAgICAgPSBBZGQgJlNlbGVjdG9yCi1fVUlfQUNUSU9OX0FERF9GSUVMRCAgICAgICAgICAgICAgID0gQWRkICZGaWVsZAotISBOT1RFIFRPIFRSQU5TTEFUT1I6IFRyYW5zbGF0ZSBBZGQgYW5kIE5vZGUKLV9VSV9BQ1RJT05fQUREX1NDSEVNQV9OT0RFICAgICAgICAgPSBBZGQgJlNjaGVtYSBOb2RlCi0hIE5PVEUgVE8gVFJBTlNMQVRPUjogVFJBTlNMQVRFIEFkZCBhbmQgTG9jYWwKLV9VSV9BQ1RJT05fQUREX0xPQ0FMX1NJTVBMRV9UWVBFICAgPSBBZGQgTG9jYWwgJlNpbXBsZSBUeXBlCi1fVUlfQUNUSU9OX0FERF9MT0NBTF9DT01QTEVYX1RZUEUgID0gQWRkIExvY2FsICZDb21wbGV4IFR5cGUKLV9VSV9BQ1RJT05fQkFDS19UT19TQ0hFTUFfVklFVyAgICAgPSBCYWNrIFRvIFNjaGVtYQotX1VJX0hPVkVSX0JBQ0tfVE9fU0NIRU1BX1ZJRVcgICAgID0gQmFjayB0byBzY2hlbWEKLQotX1VJX0FDVElPTl9NQUtFX0FOT05ZTU9VU19UWVBFX0dMT0JBTCA9IE1ha2UgQW5vbnltb3VzIFR5cGUgR2xvYmFsCi1fVUlfQUNUSU9OX09QRU5fU0NIRU1BICAgICAgICAgICAgICAgID0gT3BlbiBTY2hlbWEKLQotX1VJX0FDVElPTl9JTlNFUlRfQkVGT1JFICAgICAgICAgICA9IEluc2VydCBCZWZvcmUKLV9VSV9BQ1RJT05fSU5TRVJUX0FGVEVSICAgICAgICAgICAgPSBJbnNlcnQgQWZ0ZXIKLQotX1VJX09VVExJTkVfU09SVCAgICAgICAgICAgICAgICAgICA9IFNvcnQgYWxwaGFiZXRpY2FsbHkKLV9VSV9PVVRMSU5FX0RPX05PVF9TT1JUICAgICAgICAgICAgPSBEbyBub3Qgc29ydCBhbHBoYWJldGljYWxseQotCi1fVUlfT1VUTElORV9TSE9XX0NPTVBMRVhfVFlQRSAgICAgID0gU2hvdyBDb21wbGV4IFR5cGVzIE9ubHkKLV9VSV9PVVRMSU5FX1NIT1dfU0lNUExFX1RZUEUgICAgICAgPSBTaG93IFNpbXBsZSBUeXBlcyBPbmx5Ci1fVUlfT1VUTElORV9TSE9XX0FUVFJJQlVURV9HUk9VUCAgID0gU2hvdyBBdHRyaWJ1dGUgR3JvdXBzIE9ubHkKLV9VSV9PVVRMSU5FX1NIT1dfR1JPVVAgICAgICAgICAgICAgPSBTaG93IEdyb3VwcyBPbmx5Ci1fVUlfT1VUTElORV9TSE9XX0dMT0JBTF9FTEVNRU5UICAgID0gU2hvdyBHbG9iYWwgRWxlbWVudHMgT25seQotX1VJX09VVExJTkVfU0hPV19SRUZFUkVOQ0VTICAgICAgICA9IFNob3cgUmVmZXJlbmNlIENvbnRlbnQKLV9VSV9PVVRMSU5FX1NIT1dfSU5IRVJJVEVEICAgICAgICAgPSBTaG93IEluaGVyaXRlZCBDb250ZW50Ci0KLV9VSV9BQ1RJT05fU0VUX01VTFRJUExJQ0lUWQkJICAgPSBTZXQgTXVsdGlwbGljaXR5Ci0KLSEKLSEgTmV3IFhNTCBTY2hlbWEgV2l6YXJkCi0hCi1fVUlfV0laQVJEX0NSRUFURV9YU0RfTU9ERUxfVElUTEUgICAgPSBDcmVhdGUgWE1MIFNjaGVtYQotCi0hIE5PVEUgVE8gVFJBTlNMQVRPUjogRG8gbm90IHRyYW5zbGF0ZSBmb2xsb3dpbmcgbGluZQotX1VJX0NSRUFURVhTRCAgICAgICAgICAgICAgICAgICAgICAgID0gY3JlYXRlWFNECi1fVUlfTkVXX1hNTF9TQ0hFTUFfVElUTEUgICAgICAgICAgICAgPSBOZXcgWE1MIFNjaGVtYQotX1VJX0NSRUFURV9BX05FV19YTUxfU0NIRU1BX0RFU0MgICAgID0gQ3JlYXRlIGEgbmV3IFhNTCBzY2hlbWEuCi0KLSEgTk9URSBUTyBUUkFOU0xBVE9SOiBEbyBub3QgdHJhbnNsYXRlIGZvbGxvd2luZyBsaW5lCi1fVUlfTkVXX1hNTF9TQ0hFTUFfRklMRU5BTUUgICAgICAgICAgPSBOZXdYTUxTY2hlbWEueHNkCi0KLSEKLSEgWFNEIEZyb20gUkRCIFNjaGVtYSBXaXphcmQKLSEKLV9VSV9XSVpBUkRfQ1JFQVRFX1hTRF9GUk9NX1JEQl9USVRMRSA9IENyZWF0ZSBYU0QgZnJvbSBSREIgVGFibGUKLQotCi0hCi0hIFJlZ3VsYXIgRXhwcmVzc2lvbiBXaXphcmQKLSEKLV9VSV9SRUdFWF9XSVpBUkRfQ1JFQVRFX0JVVFRPTiA9IENyZWF0ZSBSZWd1bGFyIEV4cHJlc3Npb24uLi4KLV9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9CVVRUT04gPSBMYXVuY2ggdGhlIFJlZ3VsYXIgRXhwcmVzc2lvbiBXaXphcmQKLV9VSV9SRUdFWF9XSVpBUkRfVElUTEUgPSBSZWd1bGFyIEV4cHJlc3Npb24gV2l6YXJkCi1fVUlfUkVHRVhfV0laQVJEX0NPTVBPU0lUSU9OX1BBR0VfVElUTEUgPSBDb21wb3NlIFJlZ3VsYXIgRXhwcmVzc2lvbgotX1VJX1JFR0VYX1dJWkFSRF9DT01QT1NJVElPTl9QQUdFX0RFU0NSSVBUSU9OID0gVG8gYWRkIGEgdG9rZW4sIHNwZWNpZnkgaXRzIGNvbnRlbnRzIGFuZCBvY2N1cnJlbmNlLCB0aGVuIGNsaWNrIEFkZC4KLV9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9SRUdFWF9FUlJPUl9QUkVGSVggPSBUaGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbm90IHZhbGlkLiAgUmVhc29uOiAgCi1fVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfVE9LRU5fRVJST1JfUFJFRklYID0gVGhlIGN1cnJlbnQgdG9rZW4gaXMgbm90IHZhbGlkLiAgUmVhc29uOiAgCi1fVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfUkVHRVhfRVJST1IgPSBUaGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbm90IHZhbGlkLgotX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1RPS0VOX0VSUk9SID0gVGhlIGN1cnJlbnQgdG9rZW4gaXMgbm90IHZhbGlkLgotX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX01JTl9FUlJPUl9TVUZGSVggPSBJbnZhbGlkIG1pbmltdW0gcmFuZ2UgdmFsdWUuICBUaGUgdmFsdWUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgbGVzcyB0aGFuIHRoZSBtYXhpbXVtIHZhbHVlLgotX1VJX1JFR0VYX1dJWkFSRF9NSVNTSU5HX01JTl9FUlJPUl9TVUZGSVggPSBJbnZhbGlkIG1pbmltdW0gcmFuZ2UgdmFsdWUuICBBIG1pbmltdW0gcmFuZ2UgbXVzdCBiZSBzcGVjaWZpZWQgaWYgYSBtYXhpbXVtIHJhbmdlIGlzIHNwZWNpZmllZC4KLV9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9NQVhfRVJST1JfU1VGRklYID0gSW52YWxpZCBtYXhpbXVtIHJhbmdlIHZhbHVlLiAgVGhlIHZhbHVlIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiB0aGUgbWluaW11bSB2YWx1ZS4KLV9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9SRVBFQVRfRVJST1JfU1VGRklYID0gSW52YWxpZCByZXBlYXQgdmFsdWUuICBUaGUgdmFsdWUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuCi1fVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfU0VMRUNUSU9OX0VSUk9SID0gTm90aGluZyBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuICBFaXRoZXIgbWFrZSBhIHNlbGVjdGlvbiBvciBjaG9vc2UgYSBkaWZmZXJlbnQgdG9rZW4uIAotX1VJX1JFR0VYX1dJWkFSRF9UT0tFTl9MQUJFTCA9ICZUb2tlbiBjb250ZW50czoKLV9VSV9SRUdFWF9XSVpBUkRfQVVUT19FU0NBUEVfQ0hFQ0tCT1hfTEFCRUwgPSBBdXRvICZlc2NhcGUKLV9VSV9SRUdFWF9XSVpBUkRfT0NDVVJFTkNFX0xBQkVMID0gT2NjdXJyZW5jZQotISBJbnN0cnVjdGlvbnMgZm9yIHRyYW5zbGF0b3JzOiBUaGUgZm9sbG93aW5nIGxhYmVsIGlzIHVzZWQgaW4gYSBwaHJhc2UgdG8gaWRlbnRpZnkgYSByYW5nZSBvZiB2YWx1ZXMuCi0hIEZvciBleGFtcGxlOiAgNSB0byAxMC4KLSEgVGhlIHZhbHVlcyBhcmUgdGV4dCBmaWVsZHMgdGhhdCBhcmUgaW5pdGlhbGx5IGJsYW5rIHNvIHRoZSB1c2VyIGhhcyB0byBlbnRlciBpbiB2YWx1ZXMKLSEgRm9yIGV4YW1wbGU6ICAgX19fX19fXyB0byBfX19fX19fXwotX1VJX1JFR0VYX1dJWkFSRF9UT19MQUJFTCA9IHRvCi1fVUlfUkVHRVhfV0laQVJEX0FERF9CVVRUT05fTEFCRUwgPSAmQWRkIAotX1VJX1JFR0VYX1dJWkFSRF9DVVJSRU5UX1JFR0VYX0xBQkVMID0gJkN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uOgotX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX1RFUk1TID0gQ29udGVudCBvZiBuZXcgdG9rZW4KLV9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9BVVRPX0VTQ0FQRV9DSEVDS0JPWCA9IEluc2VydCBlc2NhcGUgY2hhcmFjdGVycyB0byBtYXRjaCBtZXRhY2hhcmFjdGVyIGxpdGVyYWxzIChlLmcuIGNvbnZlcnRzIFwiKlwiIHRvIFwiXFwqXCIpCi1fVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfQUREX0JVVFRPTiA9IEFkZCB0aGlzIHRva2VuIHRvIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KLV9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9DVVJSRU5UX1JFR0VYID0gVGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uCi1fVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfUkVQRUFUID0gVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSB0b2tlbiBtdXN0IG9jY3VyLgotX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX01JTiA9IFRoZSBtaW5pbXVtIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSB0b2tlbiBjYW4gb2NjdXIuCi1fVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfTUFYID0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhlIHRva2VuIGNhbiBvY2N1ci4KLV9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9DQVJFVF9MQUJFTCA9IFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgbmV3IHRva2VuIHdpbGwgYmUgaW5zZXJ0ZWQuCi1fVUlfUkVHRVhfV0laQVJEX1RFU1RJTkdfUEFHRV9USVRMRSA9IFRlc3QgUmVndWxhciBFeHByZXNzaW9uCi1fVUlfUkVHRVhfV0laQVJEX1RFU1RJTkdfUEFHRV9ERVNDUklQVElPTiA9IFRvIHRlc3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgZW50ZXIgc2FtcGxlIHRleHQgdGhhdCB5b3Ugd2lzaCB0byBtYXRjaC4gIFRoZSBzdWNjZXNzIG9mIHRoZSBtYXRjaCB3aWxsIGJlIGluZGljYXRlZCBhYm92ZS4KLV9VSV9SRUdFWF9XSVpBUkRfUkVHRVhfTEFCRUwgPSBSZWd1bGFyIGV4cHJlc3Npb246IAotX1VJX1JFR0VYX1dJWkFSRF9TQU1QTEVfVEVYVCA9ICBTYW1wbGUgdGV4dDogCi1fVUlfUkVHRVhfV0laQVJEX01BVENIRVMgPSBUaGUgdGV4dCBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCi1fVUlfUkVHRVhfV0laQVJEX0RPRVNfTk9UX01BVENIID0gVGhlIHRleHQgZG9lcyBub3QgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLV9VSV9SRUdFWF9XSVpBUkRfVEVSTV9BTllfQ0hBUiA9IEFueSBjaGFyYWN0ZXIKLV9VSV9SRUdFWF9XSVpBUkRfVEVSTV9BTFBIQU5VTUVSSUNfQ0hBUiA9IEFscGhhbnVtZXJpYyBjaGFyYWN0ZXIKLV9VSV9SRUdFWF9XSVpBUkRfVEVSTV9XSElURVNQQUNFID0gV2hpdGVzcGFjZQotX1VJX1JFR0VYX1dJWkFSRF9URVJNX0RJR0lUID0gRGlnaXQKLV9VSV9SRUdFWF9XSVpBUkRfVEVSTV9VUFBFUiA9IFVwcGVyIGNhc2UKLV9VSV9SRUdFWF9XSVpBUkRfVEVSTV9MT1dFUiA9IExvd2VyIGNhc2UKLV9VSV9SRUdFWF9XSVpBUkRfVEVSTV9TRUxFQ1RJT04gPSBDdXJyZW50IHNlbGVjdGlvbgotX1VJX1JFR0VYX1dJWkFSRF9RVUFOVElGSUVSX1NJTkdMRSA9ICZKdXN0IG9uY2UKLV9VSV9SRUdFWF9XSVpBUkRfUVVBTlRJRklFUl9TVEFSID0gJlplcm8gb3IgbW9yZQotX1VJX1JFR0VYX1dJWkFSRF9RVUFOVElGSUVSX1BMVVMgPSAmT25lIG9yIG1vcmUKLV9VSV9SRUdFWF9XSVpBUkRfUVVBTlRJRklFUl9PUFRJT05BTCA9IE8mcHRpb25hbAotX1VJX1JFR0VYX1dJWkFSRF9RVUFOVElGSUVSX1JFUEVBVCA9ICZSZXBlYXQKLV9VSV9SRUdFWF9XSVpBUkRfUVVBTlRJRklFUl9SQU5HRSA9IFJhbiZnZQotCi0hCi0hIFNlbGVjdCBJbmNsdWRlIEZpbGUgV2l6YXJkCi1fVUlfTEFCRUxfSU5DTFVERV9VUkxfRklMRSAgICA9IFNlbGVjdCBzY2hlbWEgZnJvbToKLV9VSV9SQURJT19VUkwgICAgICAgICAgICAgICAgID0gJkhUVFAKLV9VSV9SQURJT19GSUxFICAgICAgICAgICAgICAgID0gJldvcmtiZW5jaCBwcm9qZWN0cwotX1VJX1dJWkFSRF9JTkNMVURFX0ZJTEVfVElUTEUgPSBTZWxlY3QgYSBzY2hlbWEKLV9VSV9XSVpBUkRfSU5DTFVERV9GSUxFX0RFU0MgID0gU2VsZWN0IGFub3RoZXIgc2NoZW1hIGZyb20gd29ya2JlbmNoIHByb2plY3RzIG9yIGZyb20gSFRUUC4KLV9VSV9MQUJFTF9VUkwgICAgICAgICAgICAgICAgID0gVVJMOgotX1VJX1VSTF9TVEFSVF9XSVRIICAgICAgICAgICAgPSBUaGUgVVJMIG11c3Qgc3RhcnQgd2l0aCBodHRwOi8vCi1fVUlfU1BFQ0lGWV9VUkwgICAgICAgICAgICAgICA9IFBsZWFzZSBzcGVjaWZ5IGEgVVJMCi0KLSEKLSEgRW51bWVyYXRpb25zIERpYWxvZwotX1VJX0VOVU1FUkFUSU9OU19ESUFMT0dfVElUTEUgPSBBZGQgRW51bWVyYXRpb25zCi1fVUlfTEFCRUxfREVMSU1JVEVSX0NIQVIgICAgICA9ICZEZWxpbWl0ZXIgY2hhcmFjdGVyczoKLV9VSV9MQUJFTF9QUkVTRVJWRV9XSElURVNQQUNFID0gJlByZXNlcnZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UKLQotX1VJX0FDVElPTl9ERUxFVEVfRU5VTUVSQVRJT04gPSBEZWxldGUgRW51bWVyYXRpb24KLQotIQotISBWYWxpZGF0ZSBTY2hlbWEgCi0hCi1fVUlfRElBTE9HX1hNTF9TQ0hFTUFfSU5WQUxJRF9USVRMRSAgICAgICA9IFZhbGlkYXRpb24gRmFpbGVkCi1fVUlfRElBTE9HX1hNTF9TQ0hFTUFfVkFMSURfVElUTEUgICAgICAgICA9IFZhbGlkYXRpb24gU3VjY2VlZGVkCi1fVUlfRElBTE9HX1hNTF9TQ0hFTUFfVkFMSURfVEVYVCAgICAgICAgICA9IFRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgdmFsaWQuCi1fVUlfRElBTE9HX1hNTF9TQ0hFTUFfVkFMSURfV0lUSF9XQVJOSU5HUyA9IFRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgdmFsaWQgaG93ZXZlciB3YXJuaW5ncyBoYXZlIGJlZW4gaXNzdWVkLiBTZWUgdGhlIFByb2JsZW1zIHZpZXcgZm9yIHRoZSB3YXJuaW5nIG1lc3NhZ2VzLgotX1VJX0RJQUxPR19YTUxfU0NIRU1BX0lOVkFMSURfVEVYVCAgICAgICAgPSBUaGUgWE1MIHNjaGVtYSBmaWxlIGlzIG5vdCB2YWxpZC4gU2VlIHRoZSBQcm9ibGVtcyB2aWV3IGZvciB0aGUgZXJyb3IgbWVzc2FnZXMuCi0KLSEKLSEgQ29tYm8tYm94IGNob2ljZXMgCi0hCi0hIE5PVEUgVE8gVFJBTlNMQVRPUjogRG8gbm90IHRyYW5zbGF0ZSBmb2xsb3dpbmcgMTAgbGluZXMKLV9VSV9DT01CT19RVUFMSUZJRUQgICAgICAgICAgICAgPSBxdWFsaWZpZWQKLV9VSV9DT01CT19VTlFVQUxJRklFRCAgICAgICAgICAgPSB1bnF1YWxpZmllZAotX1VJX0NPTUJPX0VYVEVOU0lPTiAgICAgICAgICAgICA9IGV4dGVuc2lvbgotX1VJX0NPTUJPX1JFU1RSSUNUSU9OICAgICAgICAgICA9IHJlc3RyaWN0aW9uCi1fVUlfQ09NQk9fQUxMICAgICAgICAgICAgICAgICAgID0gYWxsCi1fVUlfQ09NQk9fVFJVRSAgICAgICAgICAgICAgICAgID0gdHJ1ZQotX1VJX0NPTUJPX0ZBTFNFICAgICAgICAgICAgICAgICA9IGZhbHNlCi1fVUlfQ09NQk9fTEFYICAgICAgICAgICAgICAgICAgID0gbGF4Ci1fVUlfQ09NQk9fU0tJUCAgICAgICAgICAgICAgICAgID0gc2tpcAotX1VJX0NPTUJPX1NUUklDVCAgICAgICAgICAgICAgICA9IHN0cmljdAotCi0hIEdlbmVyYXRlIERURCAtIHBhc3MgYXMgdGl0bGUgYW5kIGRlc2NyaXB0aW9uIGZvciB3aXphcmQgcGFnZQotX1VJX0dFTkVSQVRFX0RURF9USVRMRSAgICAgICAgICA9IEdlbmVyYXRlIERURAotX1VJX0dFTkVSQVRFX0RURF9ERVNDUklQVElPTiAgICA9IEdlbmVyYXRlIGEgRFREIGZyb20gdGhlIHNlbGVjdGVkIFhNTCBzY2hlbWEgZmlsZS4KLQotISBHZW5lcmF0ZSBEREwgLSBwYXNzIGFzIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiBmb3Igd2l6YXJkIHBhZ2UKLV9VSV9HRU5FUkFURV9ERExfVElUTEUgICAgICAgICAgPSBHZW5lcmF0ZSBEREwKLV9VSV9HRU5FUkFURV9ERExfREVTQ1JJUFRJT04gICAgPSBHZW5lcmF0ZSBEREwgZnJvbSB0aGUgc2VsZWN0ZWQgWE1MIHNjaGVtYSBmaWxlLgotCi1fVUlfWE1MX1NDSEVNQV9WQUxJREFUT1IgICAgICAgICAgICA9IFhNTCBTY2hlbWEgVmFsaWRhdG9yCi0KLSEgR2VuZXJhdGlvbiBmcm9tIHRoZSBTY2hlbWEgbW9kZWwgLSBwcmUtY29uZGl0aW9uIGNoZWNrCi1fVUlfRElBTE9HX1RJVExFX0dSQU1NQVJfRVJST1IgICAgICA9IEludmFsaWQgR3JhbW1hcgotX1VJX0RJQUxPR19JTkZPX1NDSEVNQV9JTlZBTElEICAgICAgPSBUaGUgc2NoZW1hIGZpbGUgY29udGFpbnMgZXJyb3JzLiBPcGVuIGl0IGluIHRoZSBYTUwgU2NoZW1hIGVkaXRvciBhbmQgdmFsaWRhdGUgaXQgZm9yIGRldGFpbHMuCi1fVUlfRElBTE9HX1RJVExFX05PX0dMT0JBTF9FTEVNRU5UUyA9IE5vIEdsb2JhbCBFbGVtZW50cwotX1VJX0RJQUxPR19JTkZPX05PX0dMT0JBTF9FTEVNRU5UUyAgPSBUaGUgc2VsZWN0ZWQgc2NoZW1hIGhhcyBubyBnbG9iYWwgZWxlbWVudHMuIEdsb2JhbCBlbGVtZW50cyBhcmUgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgYW55dGhpbmcgZnJvbSBhbiBYTUwgc2NoZW1hLgotCi0hIFNlY3Rpb24gdGl0bGUgZm9yIG90aGVyIGF0dHJpYnV0ZXMKLV9VSV9TRUNUSU9OX0FEVkFOQ0VEX0FUVFJJQlVURVMgICA9IEFkdmFuY2VkCi0KLSEgRm9yIHVuZG8gYWN0aW9uIG1lbnVzCi0hIE5vdGUgdG8gVHJhbnNsYXRvcnM6IEZvciB0aGUgZm9sbG93aW5nICJDaGFuZ2UiIHBocmFzZXMsCi0hIG1heE9jY3VycywgbWluT2NjdXJzLCBsYW5nLCB4cGF0aCBhcmUga2V5d29yZHMgc28gcGxlYXNlCi0hIGRvIG5vIHRyYW5zbGF0ZSB0aGVtLiAgVGhlc2UgYXJlIGZvciB0aGUgdW5kbyBhY3Rpb24gbWVudXMuCi0hIEZvciBleGFtcGxlLCBpZiB0aGUgdXNlciBtYWtlcyBhIGNoYW5nZSBpbiB0aGUgbmFtZSBvZiBhbgotISBlbGVtZW50LCB0aGVuIHRoZSB1bmRvIGFjdGlvbiB3b3VsZCBiZSBVbmRvIEVsZW1lbnQgTmFtZSBDaGFuZ2UKLV9VSV9OQU1FU1BBQ0VfQ0hBTkdFICAgICAgICAgICA9IE5hbWVzcGFjZSBDaGFuZ2UKLV9VSV9QUk9DRVNTQ09OVEVOVFNfQ0hBTkdFICAgICA9IFByb2Nlc3MgQ29udGVudHMgQ2hhbmdlCi1fVUlfTUFYT0NDVVJTX0NIQU5HRSAgICAgICAgICAgPSBtYXhPY2N1cnMgQ2hhbmdlCi1fVUlfTUlOT0NDVVJTX0NIQU5HRSAgICAgICAgICAgPSBtaW5PY2N1cnMgQ2hhbmdlCi1fVUlfU09VUkNFX0FUVFJJQlVURV9DSEFOR0UgICAgPSBTb3VyY2UgQ2hhbmdlCi1fVUlfQ09NTUVOVF9DSEFOR0UgICAgICAgICAgICAgPSBDb21tZW50IENoYW5nZQotX1VJX1BSRUZJWF9DSEFOR0UgICAgICAgICAgICAgID0gUHJlZml4IENoYW5nZQotX1VJX0FUVFJJQlVURUdST1VQX1JFRl9DSEFOR0UgID0gQXR0cmlidXRlIEdyb3VwIFJlZmVyZW5jZSBDaGFuZ2UKLV9VSV9BVFRSSUJVVEVHUk9VUF9OQU1FX0NIQU5HRSA9IEF0dHJpYnV0ZSBHcm91cCBOYW1lIENoYW5nZQotX1VJX0FUVFJJQlVURV9GSVhFRF9DSEFOR0UgICAgID0gQXR0cmlidXRlIEZpeGVkIENoYW5nZQotX1VJX0FUVFJJQlVURV9ERUZBVUxUX0NIQU5HRSAgID0gQXR0cmlidXRlIERlZmF1bHQgQ2hhbmdlCi1fVUlfQVRUUklCVVRFX05BTUVfQ0hBTkdFICAgICAgPSBBdHRyaWJ1dGUgTmFtZSBDaGFuZ2UKLV9VSV9BVFRSSUJVVEVfVkFMVUVfQ0hBTkdFICAgICA9IEF0dHJpYnV0ZSBWYWx1ZSBDaGFuZ2UKLV9VSV9BVFRSSUJVVEVfVVNFX0NIQU5HRSAgICAgICA9IEF0dHJpYnV0ZSBVc2UgQ2hhbmdlCi1fVUlfQVRUUklCVVRFX0ZPUk1fQ0hBTkdFICAgICAgPSBBdHRyaWJ1dGUgRm9ybSBDaGFuZ2UKLV9VSV9DT01QTEVYVFlQRV9OQU1FX0NIQU5HRSAgICA9IENvbXBsZXggVHlwZSBOYW1lIENoYW5nZQotX1VJX0NPTVBMRVhUWVBFX0FCU1RSQUNUX0NIQU5HRSA9IENvbXBsZXggVHlwZSBBYnN0cmFjdCBDaGFuZ2UKLV9VSV9DT01QTEVYVFlQRV9NSVhFRF9DSEFOR0UgICA9IENvbXBsZXggVHlwZSBNaXhlZCBDaGFuZ2UKLV9VSV9DT01QTEVYVFlQRV9CTE9DS19DSEFOR0UgICA9IENvbXBsZXggVHlwZSBCbG9jayBDaGFuZ2UKLV9VSV9DT01QTEVYVFlQRV9GSU5BTF9DSEFOR0UgICA9IENvbXBsZXggVHlwZSBGaW5hbCBDaGFuZ2UKLV9VSV9ET0NVTUVOVEFUSU9OX1NPVVJDRV9DSEFOR0UgPSBEb2N1bWVudGF0aW9uIFNvdXJjZSBDaGFuZ2UKLV9VSV9ET0NVTUVOVEFUSU9OX0xBTkdfQ0hBTkdFICAgPSBEb2N1bWVudGF0aW9uIGxhbmcgQ2hhbmdlCi1fVUlfRE9DVU1FTlRBVElPTl9DT01NRU5UX0NIQU5HRSA9IERvY3VtZW50YXRpb24gQ29tbWVudCBDaGFuZ2UKLV9VSV9FTEVNRU5UX05BTUVfQ0hBTkdFICAgICAgICAgID0gRWxlbWVudCBOYW1lIENoYW5nZQotX1VJX0VMRU1FTlRfVkFMVUVfQ0hBTkdFICAgICAgICAgPSBFbGVtZW50IFZhbHVlIENoYW5nZQotX1VJX0VMRU1FTlRfVFlQRV9DSEFOR0UgICAgICAgICAgPSBFbGVtZW50IFR5cGUgQ2hhbmdlCi1fVUlfRU5VTV9WQUxVRV9DSEFOR0UgICAgICAgICAgICA9IEVudW0gVmFsdWUgQ2hhbmdlCi1fVUlfRklFTERfWFBBVEhfQ0hBTkdFICAgICAgICAgICA9IEZpZWxkIHhwYXRoIENoYW5nZQotX1VJX0dST1VQX1JFRl9DSEFOR0UgICAgICAgICAgICAgPSBHcm91cCBSZWZlcmVuY2UgQ2hhbmdlCi1fVUlfR1JPVVBfU0NPUEVfQ0hBTkdFICAgICAgICAgICA9IENvbnRlbnQgTW9kZWwgQ2hhbmdlCi1fVUlfR1JPVVBfTkFNRV9DSEFOR0UgICAgICAgICAgICA9IEdyb3VwIE5hbWUgQ2hhbmdlCi1fVUlfSU1QT1JUX0NIQU5HRSAgICAgICAgICAgICAgICA9IEltcG9ydCBDaGFuZ2UKLV9VSV9LRVlfTkFNRV9DSEFOR0UgICAgICAgICAgICAgID0gS2V5IE5hbWUgQ2hhbmdlCi1fVUlfS0VZUkVGX05BTUVfQ0hBTkdFICAgICAgICAgICA9IEtleSBSZWZlcmVuY2UgTmFtZSBDaGFuZ2UKLSEgTm90ZSB0byB0cmFuc2xhdG9ycwotISBGb3IgdGhlIGZvbGxvd2luZyBpdGVtLCBSZWZlciBpcyB0aGUga2V5cmVmIGF0dHJpYnV0ZSB0byByZWZlciB0byBzb21lIG90aGVyIGtleQotX1VJX0tFWVJFRl9SRUZFUl9DSEFOR0UgICAgICAgICAgPSBLZXkgUmVmZXJlbmNlIFJlZmVyIENoYW5nZQotX1VJX05PVEFUSU9OX05BTUVfQ0hBTkdFICAgICAgICAgPSBOb3RhdGlvbiBOYW1lIENoYW5nZQotX1VJX05PVEFUSU9OX1BVQkxJQ19DSEFOR0UgICAgICAgPSBOb3RhdGlvbiBQdWJsaWMgQ2hhbmdlCi1fVUlfTk9UQVRJT05fU1lTVEVNX0NIQU5HRSAgICAgICA9IE5vdGF0aW9uIFN5c3RlbSBDaGFuZ2UKLV9VSV9QQVRURVJOX1ZBTFVFX0NIQU5HRSAgICAgICAgID0gUGF0dGVybiBWYWx1ZSBDaGFuZ2UKLV9VSV9TQ0hFTUFfVkVSU0lPTl9DSEFOR0UgICAgICAgID0gU2NoZW1hIFZlcnNpb24gQ2hhbmdlCi1fVUlfU0NIRU1BX0xBTkdfQ0hBTkdFICAgICAgICAgICA9IFNjaGVtYSBsYW5nIENoYW5nZQotX1VJX1NFTEVDVE9SX1hQQVRIX0NIQU5HRSAgICAgICAgPSBTZWxlY3RvciB4cGF0aCBDaGFuZ2UKLV9VSV9UWVBFX0NIQU5HRSAgICAgICAgICAgICAgICAgID0gVHlwZSBDaGFuZ2UKLV9VSV9ERVJJVkVEQllfQ0hBTkdFICAgICAgICAgICAgID0gRGVyaXZhdGlvbiBDaGFuZ2UKLV9VSV9GQUNFVF9DSEFOR0UgICAgICAgICAgICAgICAgID0gRmFjZXQgQ2hhbmdlCi1fVUlfU0lNUExFVFlQRV9OQU1FX0NIQU5HRSAgICAgICA9IFNpbXBsZVR5cGUgTmFtZSBDaGFuZ2UKLV9VSV9VTklRVUVfTkFNRV9DSEFOR0UgICAgICAgICAgID0gVW5pcXVlIE5hbWUgQ2hhbmdlCi1fVUlfU0NIRU1BX0FUVFJJQlVURUZPUk1ERUZBVUxUX0NIQU5HRSA9IEF0dHJpYnV0ZSBGb3JtIERlZmF1bHQgQ2hhbmdlCi1fVUlfU0NIRU1BX0VMRU1FTlRGT1JNREVGQVVMVF9DSEFOR0UgPSBFbGVtZW50IEZvcm0gRGVmYXVsdCBDaGFuZ2UKLV9VSV9TQ0hFTUFfQkxPQ0tERUZBVUxUX0NIQU5HRSAgID0gQmxvY2sgRGVmYXVsdCBDaGFuZ2UKLV9VSV9TQ0hFTUFfRklOQUxERUZBVUxUX0NIQU5HRSAgID0gRmluYWwgRGVmYXVsdCBDaGFuZ2UKLV9VSV9FTEVNRU5UX1NVQlNUSVRVVElPTkdST1VQX0NIQU5HRSA9IFN1YnN0aXR1dGlvbiBHcm91cCBDaGFuZ2UKLV9VSV9FTEVNRU5UX0ZPUk1fQ0hBTkdFICAgICAgICAgID0gRm9ybSBDaGFuZ2UKLV9VSV9FTEVNRU5UX0JMT0NLX0NIQU5HRSAgICAgICAgID0gQmxvY2sgQ2hhbmdlCi1fVUlfRUxFTUVOVF9GSU5BTF9DSEFOR0UgICAgICAgICA9IEZpbmFsIENoYW5nZQotX1VJX0VMRU1FTlRfQUJTVFJBQ1RfQ0hBTkdFICAgICAgPSBBYnN0cmFjdCBDaGFuZ2UKLV9VSV9FTEVNRU5UX05JTExBQkxFX0NIQU5HRSAgICAgID0gTmlsbGFibGUgQ2hhbmdlCi1fVUlfVEFSR0VUTkFNRVNQQUNFX0NIQU5HRSAgICAgICA9IFRhcmdldCBOYW1lc3BhY2UgQ2hhbmdlCi0KLSEgV2luZG93IEhlYWRpbmdzIGZvciBGbGF0IFZpZXcKLV9VSV9QQUdFX0hFQURJTkdfQU5ZQVRUUklCVVRFID0gQW55IEF0dHJpYnV0ZQotX1VJX1BBR0VfSEVBRElOR19BTllFTEVNRU5UICAgPSBBbnkgRWxlbWVudAotX1VJX1BBR0VfSEVBRElOR19BUFBJTkZPICAgICAgICAgICAgPSBBcHBJbmZvCi1fVUlfUEFHRV9IRUFESU5HX0FUVFJJQlVURUdST1VQX1JFRiA9IEF0dHJpYnV0ZSBHcm91cCBSZWZlcmVuY2UKLV9VSV9QQUdFX0hFQURJTkdfQVRUUklCVVRFR1JPVVAgICAgID0gQXR0cmlidXRlIEdyb3VwCi1fVUlfUEFHRV9IRUFESU5HX0FUVFJJQlVURV9SRUYgICAgICA9IEF0dHJpYnV0ZSBSZWZlcmVuY2UKLV9VSV9QQUdFX0hFQURJTkdfQVRUUklCVVRFICAgICAgICAgID0gQXR0cmlidXRlCi1fVUlfUEFHRV9IRUFESU5HX0NPTVBMRVhUWVBFICAgICAgICA9IENvbXBsZXggVHlwZQotX1VJX1BBR0VfSEVBRElOR19ET0NVTUVOVEFUSU9OICAgICAgPSBEb2N1bWVudGF0aW9uCi1fVUlfUEFHRV9IRUFESU5HX0VMRU1FTlQgICAgID0gRWxlbWVudAotX1VJX1BBR0VfSEVBRElOR19FTEVNRU5UX1JFRiA9IEVsZW1lbnQgUmVmZXJlbmNlCi1fVUlfUEFHRV9IRUFESU5HX0VOVU0gICAgICAgID0gRW51bWVyYXRpb24KLV9VSV9QQUdFX0hFQURJTkdfRklFTEQgICAgICAgPSBGaWVsZAotX1VJX1BBR0VfSEVBRElOR19HUk9VUF9SRUYgICA9IEdyb3VwIFJlZmVyZW5jZQotX1VJX1BBR0VfSEVBRElOR19DT05URU5UTU9ERUwgID0gQ29udGVudCBNb2RlbAotX1VJX1BBR0VfSEVBRElOR19HUk9VUCAgICAgICAgID0gR3JvdXAKLV9VSV9QQUdFX0hFQURJTkdfSU1QT1JUICAgICAgICA9IEltcG9ydAotX1VJX1BBR0VfSEVBRElOR19JTkNMVURFICAgICAgID0gSW5jbHVkZQotX1VJX1BBR0VfSEVBRElOR19LRVlSRUYgICAgICAgID0gS2V5IFJlZmVyZW5jZQotX1VJX1BBR0VfSEVBRElOR19LRVkgICAgICAgICAgID0gS2V5Ci1fVUlfUEFHRV9IRUFESU5HX05PVEFUSU9OICAgICAgPSBOb3RhdGlvbgotX1VJX1BBR0VfSEVBRElOR19QQVRURVJOICAgICAgID0gUGF0dGVybgotX1VJX1BBR0VfSEVBRElOR19SRURFRklORSAgICAgID0gUmVkZWZpbmUKLV9VSV9QQUdFX0hFQURJTkdfU0NIRU1BICAgICAgICA9IFNjaGVtYQotX1VJX1BBR0VfSEVBRElOR19TRUxFQ1RPUiAgICAgID0gU2VsZWN0b3IKLV9VSV9QQUdFX0hFQURJTkdfTElTVCAgICAgICAgICA9IExpc3QKLV9VSV9QQUdFX0hFQURJTkdfVU5JT04gICAgICAgICA9IFVuaW9uCi1fVUlfUEFHRV9IRUFESU5HX1NJTVBMRUNPTlRFTlQgPSBTaW1wbGUgQ29udGVudAotX1VJX1BBR0VfSEVBRElOR19DT01QTEVYQ09OVEVOVCA9IENvbXBsZXggQ29udGVudAotX1VJX1BBR0VfSEVBRElOR19SRVNUUklDVElPTiAgID0gUmVzdHJpY3Rpb24KLV9VSV9QQUdFX0hFQURJTkdfRVhURU5TSU9OICAgICA9IEV4dGVuc2lvbgotX1VJX1BBR0VfSEVBRElOR19TSU1QTEVUWVBFICAgID0gU2ltcGxlIFR5cGUKLV9VSV9QQUdFX0hFQURJTkdfVU5JUVVFICAgICAgICA9IFVuaXF1ZQotX1VJX1BBR0VfSEVBRElOR19SRUZFUkVOQ0UgICAgID0gcmVmZXJlbmNlCi0KLSEKLSEgR3JhcGggcGFnZQotIQotX1VJX0dSQVBIX1NJTVBMRV9UWVBFUyAgICAgICAgID0gU2ltcGxlIFR5cGVzCi1fVUlfR1JBUEhfQ09NUExFWF9UWVBFUyAgICAgICAgPSBDb21wbGV4IFR5cGVzCi1fVUlfR1JBUEhfR1JPVVBTICAgICAgICAgICAgICAgPSBHcm91cHMKLV9VSV9HUkFQSF9HTE9CQUxfQVRUUklCVVRFUyAgICA9IEdsb2JhbCBBdHRyaWJ1dGVzCi1fVUlfR1JBUEhfR0xPQkFMX0VMRU1FTlRTICAgICAgPSBHbG9iYWwgRWxlbWVudHMKLV9VSV9HUkFQSF9YU0RTQ0hFTUEgICAgICAgICAgICA9IFNjaGVtYQotX1VJX0dSQVBIX1hTRFNDSEVNQV9OT19OQU1FU1BBQ0UgPSAobm8gdGFyZ2V0IG5hbWVzcGFjZSBzcGVjaWZpZWQpCi1fVUlfR1JBUEhfWFNEQ09NUExFWFRZUEVERUZJTklUSU9OID0gWFNEIENvbXBsZXggVHlwZSBEZWZpbml0aW9uOgotX1VJX0dSQVBIX1hTRE1PREVMR1JPVVAgICAgICAgID0gWFNEIE1vZGVsIEdyb3VwCi1fVUlfR1JBUEhfWFNEUEFSVElDTEUgICAgICAgICAgPSBYU0QgUGFydGljbGUKLV9VSV9HUkFQSF9WSUVXX05PVF9BVkFJTEFCTEUgICA9IFZpZXcgaXMgbm90IGF2YWlsYWJsZSBmb3Igc2VsZWN0ZWQgb2JqZWN0LgotX1VJX0dSQVBIX1VOS05PV05fT0JKRUNUICAgICAgID0gVW5rbm93biBvYmplY3QKLQotISBBZGRpdGlvbmFsIENhdGVnb3JpZXMKLV9VSV9HUkFQSF9UWVBFUyAgICAgICAgICAgICAgICA9IFR5cGVzCi1fVUlfR1JBUEhfRUxFTUVOVFMgICAgICAgICAgICAgPSBFbGVtZW50cwotX1VJX0dSQVBIX0FUVFJJQlVURVMgICAgICAgICAgID0gQXR0cmlidXRlcwotX1VJX0dSQVBIX0FUVFJJQlVURV9HUk9VUFMgICAgID0gQXR0cmlidXRlIEdyb3VwcwotX1VJX0dSQVBIX05PVEFUSU9OUyAgICAgICAgICAgID0gTm90YXRpb25zCi1fVUlfR1JBUEhfSURFTlRJVFlfQ09OU1RSQUlOVFMgPSBJZGVudGl0eSBDb25zdHJhaW50cwotX1VJX0dSQVBIX0FOTk9UQVRJT05TICAgICAgICAgID0gQW5ub3RhdGlvbnMKLV9VSV9HUkFQSF9ESVJFQ1RJVkVTICAgICAgICAgICA9IERpcmVjdGl2ZXMKLQotISBGb3IgVW5pb24gTWVtYmVyVHlwZXMgRGlhbG9nCi1fVUlfTEFCRUxfU0VMRUNUX01FTUJFUlRZUEVTICAgPSBTZWxlY3QgZnJvbSB0aGUgYXZhaWxhYmxlIHR5cGVzIGFuZCBhZGQgdG8gdGhlIG1lbWJlclR5cGVzIGxpc3QKLV9VSV9MQUJFTF9NRU1CRVJUWVBFU19DSEFOR0UgICA9IE1lbWJlciBUeXBlcyBDaGFuZ2UKLV9VSV9MQUJFTF9NRU1CRVJUWVBFU19WQUxVRSAgICA9IE1lbWJlciBUeXBlcyBWYWx1ZToKLV9VSV9MQUJFTF9NRU1CRVJUWVBFUyAgICAgICAgICA9IE1lbWJlciB0eXBlczoKLQotX1VJX0xBQkVMX1ZBUklFVFlfQ0hBTkdFICAgICAgID0gVmFyaWV0eSBDaGFuZ2UKLQotX1VJX0xBQkVMX0ZJWEVET1JERUZBVUxUX1ZBTFVFID0gRml4ZWQvRGVmYXVsdCBWYWx1ZQotCi1fVUlfTEFCRUxfSVRFTV9UWVBFX0NIQU5HRSAgICAgPSBJdGVtIFR5cGUgQ2hhbmdlCi0KLV9VSV9MQUJFTF9JTkNMVURFX0NIQU5HRSAgICAgICA9IEluY2x1ZGUgQ2hhbmdlCi0KLV9VSV9MQUJFTF9JVEVNX1RZUEUgICAgICAgICAgICA9IEl0ZW0gdHlwZToKLV9VSV9MQUJFTF9UWVBFICAgICAgICAgICAgICAgICA9IFR5cGUKLV9VSV9MQUJFTF9NT0RFTF9HUk9VUCAgICAgICAgICA9IE1vZGVsIEdyb3VwCi0KLV9VSV9MQUJFTF9BQlNFTlQgICAgICAgICAgICAgICA9IGFic2VudAotCi1fVUlfV0FSTklOR19SRVNFVF9BVFRSR1JQX1JFRiAgPSBSZXNldCBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlIDx7MH0+Ci1fVUlfV0FSTklOR19SRU1PVkVfQVRUUkdSUF9SRUYgPSBSZW1vdmUgYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSA8ezB9PgotX1VJX1dBUk5JTkdfUkVTRVRfQVRUUl9SRUYgICAgID0gUmVzZXQgYXR0cmlidXRlIHJlZmVyZW5jZSA8ezB9PgotX1VJX1dBUk5JTkdfUkVNT1ZFX0FUVFJfUkVGICAgID0gUmVtb3ZlIGF0dHJpYnV0ZSByZWZlcmVuY2UgPHswfT4KLQotIT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0hCi0hIEhlcmUgaXMgdGhlIGxpc3Qgb2YgRXJyb3Igc3RyaW5nIHRoYXQgaGF2ZSBtZXNzYWdlIElEcyAtIG1ha2Ugc3VyZSB0aGV5IGFyZSB1bmlxdWUKLQotIQotIT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0hIFRoZXNlIHRocmVlIGVycm9ycyBhcHBlYXIgaW4gdGhlIHNlbGVjdCBpbmNsdWRlIHdpemFyZAotISBUaGUgbmFtZSBvZiB0aGUgZmlsZSB3aWxsIGJlIHN1YnN0aXR1dGVkIGluCi1fVUlfRElGRkVSRU5UX05BTUVfU1BBQ0UgID0gezB9IGlzIGluIGEgZGlmZmVyZW50IG5hbWVzcGFjZSAKLV9VSV9TQU1FX05BTUVfU1BBQ0UgICAgICAgPSB7MH0gaXMgaW4gdGhlIHNhbWUgbmFtZXNwYWNlCi1fVUlfSU5DT1JSRUNUX1hNTF9TQ0hFTUEgID0gezB9IGlzIGFuIGludmFsaWQgWE1MIHNjaGVtYSBmaWxlCi0KLV9FUlJPUl9TQ0hFTUFfTk9UX0VYSVNUICAgICAgICAgPSBEb2VzIG5vdCBleGlzdC4KLV9FUlJPUl9MQUJFTF9JTlZBTElEX1BSRUZJWCAgICAgPSBJbnZhbGlkIHByZWZpeC4gQSBwcmVmaXggbXVzdCBub3QgYmUgZW1wdHkgb3IgY29udGFpbiBhbnkgc3BhY2UuCi0KLSEgVGhlIG5hbWUgb2YgdGhlIGZpbGUgd2lsbCBiZSBzdWJzdGl0dXRlZCBpbgotX0VSUk9SX1NDSEVNQV9OQU1FX1RIRV9TQU1FICA9IHswfSBpcyB0aGUgY3VycmVudCBzY2hlbWEuIEEgc2NoZW1hIGNhbm5vdCBpbmNsdWRlIGl0c2VsZi4gUmVzZXQgdG8gdGhlIGxhc3QgdmFsaWQgc2NoZW1hLgotCi1fRVJST1JfWFNEX0dFTkVSQVRJT04gICAgICAgICAgICAgICAgPSBFcnJvciBnZW5lcmF0aW5nIFhNTCBzY2hlbWEKLV9FUlJPUl9OT19DT05UQUlORVIgICAgICAgICAgICAgICAgICA9IE5vIGZvbGRlciBzZWxlY3RlZAotX0VSUk9SX05PX0ZJTEVfTkFNRSAgICAgICAgICAgICAgICAgID0gTm8gZmlsZSBuYW1lIHByb3ZpZGVkCi1fRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfWFNEICAgICAgICAgPSBUaGUgZmlsZSBuYW1lIG11c3QgZW5kIGluIC54c2QKLQotCi0hCi0hIEZvciBzY2hlbWEgdGhhdCBoYXMgdG9vIG1hbnkgZXJyb3JzLCBhbiBleHRlbmRlZCBtZXNzYWdlLiAKLSEKLV9FUlJPUl9ESUFMT0dfWE1MX1NDSEVNQV9JTlZBTElEX1RFWFQgID0gVGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBub3QgdmFsaWQuICAKLV9FUlJPUl9NT1JFX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgPSBUaGVyZSBhcmUgbW9yZSBlcnJvcnMgaW4gdGhlIHNjaGVtYSB0aGFuIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIFRhc2tzIHZpZXcuICBDb3JyZWN0IHRoZSBmaXJzdCB7MH0gZXJyb3JzIGFuZCByZS12YWxpZGF0ZSB0aGUgc2NoZW1hIGZpbGUuCi0KLSEgRERMIEdlbmVyYXRpb24gRmFpbGVkIERpYWxvZwotX1VJX0RJQUxPR19ERExfR0VOX0ZBSUxFRF9USVRMRSAgICAgPSBEREwgR2VuZXJhdGlvbiBGYWlsZWQKLV9FUlJPUl9ESUFMT0dfRERMX05PVF9HRU5FUkVBVEVEICAgID0gRERMIGhhcyBub3QgYmVlbiBnZW5lcmF0ZWQKLV9VSV9ESUFMT0dfRERMX0dFTl9GQUlMRURfUkVBU09OICAgID0gVGhlIHNlbGVjdGVkIHNjaGVtYSBoYXMgbm8gZ2xvYmFsIGVsZW1lbnRzCi1fVUlfRElBTE9HX0RETF9HRU5fRkFJTEVEX1JFQVNPTjIgICA9IE5vbmUgb2YgdGhlIGdsb2JhbCBlbGVtZW50cyBpbiB0aGUgc2NoZW1hIGhhdmUgYSBjb21wbGV4IHR5cGUgb3IgdGhleSByZWZlcmVuY2UgY29tcGxleCB0eXBlcyB0aGF0IGNhbm5vdCBiZSBmb3VuZC4KLQotX0VYQ19PUEVOX1hTRCA9IENhbm5vdCBvcGVuIFhNTCBTY2hlbWEgZWRpdG9yCi0KLV9FUlJPUl9MQUJFTF9QUkVGSVhfRVhJU1RTICAgICA9IFByZWZpeCBhbHJlYWR5IGV4aXN0cwotCi1fRVJST1JfUkVNT1ZFX0xPQ0FMX1NJTVBMRVRZUEUgID0gUmVtb3ZlIGxvY2FsIHNpbXBsZSB0eXBlIGZyb20gZXh0ZW5zaW9uCi0KLV9XQVJOX0lOVkFMSURfVEFSR0VUX05BTUVTUEFDRSA9IFRoZSB0YXJnZXQgbmFtZXNwYWNlIGlzIG5vdCB3ZWxsLWZvcm1lZAotCi1fRVJST1JfVEFSR0VUX05BTUVTUEFDRV9BTkRfUFJFRklYID0gQSB0YXJnZXQgbmFtZXNwYWNlIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcHJlZml4Ci0KLQotX1VJX0NPTlRBSU5NRU5UID0gQ29udGFpbm1lbnQKLV9VSV9JTkhFUklUQU5DRSA9IEluaGVyaXRhbmNlCi1fVUlfU1VCU1RJVFVUSU9OX0dST1VQUyA9IFN1YnN0aXR1dGlvbiBHcm91cHMKLV9VSV9BTk9OWU1PVVMgPSAqKmFub255bW91cyoqCi1fVUlfVkFMVUUgPSBWYWx1ZQotX1VJX0FOWV9FTEVNRU5UID0gQW55IEVsZW1lbnQKLV9VSV9TT1JUID0gU29ydAotCi1fVUlfQUNUSU9OX0VESVRfTkFNRVNQQUNFUyA9IEVkaXQgJk5hbWVzcGFjZXMuLi4KLQotCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQotX1VJX0NyZWF0ZUNoaWxkX3RleHQyID0gezF9IHswfQotX1VJX0NyZWF0ZUNoaWxkX3Rvb2x0aXAgPSBDcmVhdGUgTmV3IHswfSBVbmRlciB7MX0gRmVhdHVyZQotX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IGNoaWxkIG9mIHR5cGUgezB9IGZvciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlIHNlbGVjdGVkIHsyfS4KLV9VSV9DcmVhdGVTaWJsaW5nX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IHNpYmxpbmcgb2YgdHlwZSB7MH0gZm9yIHRoZSBzZWxlY3RlZCB7Mn0sIHVuZGVyIHRoZSB7MX0gZmVhdHVyZSBvZiB0aGVpciBwYXJlbnQuCi0KLSE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIQotISBVc2VkIGJ5IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5TZWxlY3RTaW5nbGVGaWxlVmlldwotIQotIT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1fVUlfTEFCRUxfU09VUkNFX0ZJTEVTICAgPSBXb3JrYmVuY2ggRmlsZXMKLV9VSV9MQUJFTF9TRUxFQ1RFRF9GSUxFUyA9IFNlbGVjdGVkIEZpbGVzCi0KLV9VSV9JTVBPUlRfQlVUVE9OICAgICAgICAgID0gSW1wb3J0IEZpbGVzLi4uCi1fVUlfSU1QT1JUX0JVVFRPTl9UT09MX1RJUCA9IEltcG9ydCBmaWxlcyBmcm9tIGZpbGUgc3lzdGVtCi0KLQotIT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0hCi0hIHJlZmFjdG9yaW5nCi0hCi0hPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXJlZmFjdG9yaW5nQWN0aW9uU2V0LmxhYmVsPVJlZmFjJnRvcgotcmVmYWN0b3JpbmdBY3Rpb25TZXQuZGVzY3JpcHRpb249WFNEIEVkaXRvciByZWZhY3RvcmluZyBhY3Rpb25zCi1yZWZhY3RvcmluZy5tZW51LmxhYmVsPVJlZmFjJnRvcgotcmVmYWN0b3JpbmcucmVuYW1lQWN0aW9uLmxhYmVsPVJlJm5hbWUuLi4KLWNvbnRleHQudGV4dC5lZGl0b3IueHNkLm5hbWU9RWRpdGluZyBYU0QgY29udGV4dAotY29tbWFuZC54c2QucmVmYWN0b3IucmVuYW1lLmVsZW1lbnQubmFtZT0mUmVuYW1lIFhTRCBlbGVtZW50Ci1jb21tYW5kLnhzZC5yZWZhY3Rvci5yZW5hbWUuZWxlbWVudC5kZXNjcmlwdGlvbj1SZW5hbWUgWFNEIGVsZW1lbnQKLWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VFbGVtZW50R2xvYmFsLmVsZW1lbnQubmFtZT1NYWtlIExvY2FsIEVsZW1lbnQgJkdsb2JhbAotY29tbWFuZC54c2QucmVmYWN0b3IubWFrZUVsZW1lbnRHbG9iYWwuZWxlbWVudC5kZXNjcmlwdGlvbj1Qcm9tb3RlcyBsb2NhbCBlbGVtZW50IHRvIGdsb2JhbCBsZXZlbCBhbmQgcmVwbGFjZXMgaXRzIHJlZmVyZW5jZXMKLWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VUeXBlR2xvYmFsLmVsZW1lbnQubmFtZT1NYWtlICZBbm9ueW1vdXMgVHlwZSBHbG9iYWwKLWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VUeXBlR2xvYmFsLmVsZW1lbnQuZGVzY3JpcHRpb249UHJvbW90ZXMgYW5vbnltb3VzIHR5cGUgdG8gZ2xvYmFsIGxldmVsIGFuZCByZXBsYWNlcyBpdHMgcmVmZXJlbmNlcwotY29tbWFuZC54c2QucmVmYWN0b3IucmVuYW1lVGFyZ2V0TmFtZXNwYWNlLm5hbWU9UmVuYW1lIFRhcmdldCBOYW1lc3BhY2UKLWNvbW1hbmQueHNkLnJlZmFjdG9yLnJlbmFtZVRhcmdldE5hbWVzcGFjZS5kZXNjcmlwdGlvbj1DaGFuZ2VzIHRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEKLXhzZC5yZXNvdXJjZS5yZW5hbWUucGFydGljaXBhbnQubmFtZT1SZW5hbWUgWFNEIENvbXBvbmVudAotRXh0ZW5zaW9uc1NjaGVtYXNEZXNjcmlwdGlvbj1UaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBkZXByZWNhdGVkLCB1c2UgZXh0ZW5zaW9uQ2F0ZWdvcmllcwotRXh0ZW5zaW9uQ2F0ZWdvcmllc0Rlc2NyaXB0aW9uPUV4dGVuc2lvbiBwb2ludCBmb3IgY29udHJpYnV0aW5nIHRvIHRoZSAnYnVpbHQgaW4nIGNhdGVnb3JpZXMgb2YgZXh0ZW5zaW9uIGVsZW1lbnRzIGZvciBYTUwgU2NoZW1hCi1YU0RFZGl0b3JFeHRlbnNpb25Db25maWd1cmF0aW9uPVRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGRlcHJlY2F0ZWQsIHVzZSBpbnRlcm5hbEVkaXRvckNvbmZpZ3VyYXRpb24KLUludGVybmFsRWRpdG9yQ29uZmlndXJhdGlvbj1FeHRlbnNpb24gcG9pbnQgZm9yIGV4dGVuZGluZyB0aGUgWE1MIFNjaGVtYSBFZGl0b3IKLQotISBDb3BpZWQgZnJvbSBzc2UKLTIzY29uY2F0X0VYQ189UmVzb3VyY2UgezB9IGRvZXMgbm90IGV4aXN0LgotMzJjb25jYXRfRVhDXz1FZGl0b3IgY291bGQgbm90IGJlIG9wZW4gb24gezB9Ci1Bbl9lcnJvcl9oYXNfb2NjdXJyZWRfd2hlbjFfRVJST1JfPUFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGVuIGluaXRpYWxpemluZyB0aGUgaW5wdXQgZm9yIHRoZSB0aGUgZWRpdG9yJ3Mgc291cmNlIHBhZ2UuCi1PcGVuRmlsZUZyb21Tb3VyY2UubGFiZWw9T3AmZW4gU2VsZWN0aW9uCi1PcGVuRmlsZUZyb21Tb3VyY2UudG9vbHRpcD1PcGVuIGFuIGVkaXRvciBvbiB0aGUgc2VsZWN0ZWQgbGluawotT3BlbkZpbGVGcm9tU291cmNlLmltYWdlPQotT3BlbkZpbGVGcm9tU291cmNlLmRlc2NyaXB0aW9uPU9wZW4gYW4gZWRpdG9yIG9uIHRoZSBzZWxlY3RlZCBsaW5rCi0KLUFkZFRhc2subGFiZWw9QWRkICZUYXNrLi4uCi1BZGRUYXNrLnRvb2x0aXA9QWRkIFRhc2suLi4KLUFkZEJvb2ttYXJrLmxhYmVsPUFkZCBCb28ma21hcmsuLi4KLUFkZEJvb2ttYXJrLnRvb2x0aXA9QWRkIEJvb2ttYXJrLi4uCi1TZWxlY3RSdWxlci5sYWJlbD1TZWxlY3QgUnVsZXIKLQotX1pFUk9fT1JfTU9SRSA9IFplcm8gb3IgTW9yZQotX1pFUk9fT1JfT05FICA9IFplcm8gb3IgT25lCi1fT05FX09SX01PUkUgID0gT25lIG9yIE1vcmUKLQotIyBGb3IgdHJhbnNsYXRvcnMsIGFzIGluIHN0cnVjdHVyZWQgRE9NIHRyZWUKLV9VSV9MQUJFTF9TVFJVQ1RVUkVEICAgICAgICAgICA9IFN0cnVjdHVyZWQKLQotX1VJX0xBQkVMX01PVkUgICAJCQkJICAgICAgID0gTW92ZQotX1VJX0xBQkVMX1JFTkFNRSAJCQkJICAgICAgID0gUmVuYW1lCi1fVUlfTEFCRUxfVEFSR0VUTkFNRVNQQUNFX0NIQU5HRSAgICAgICA9IFRhcmdldCBOYW1lc3BhY2UgQ2hhbmdlCi1fSU5GT19SRVNFVF9BVFRSSUJVVEVfR1JPVVBfUkVGRVJFTkNFICA9IFJlc2V0IGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UKLV9JTkZPX1JFTU9WRV9BVFRSSUJVVEVfR1JPVVBfUkVGRVJFTkNFID0gUmVtb3ZlIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UKLQotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLXNlYXJjaC5kZWNsYXJhdGlvbnMubGFiZWwgPSBEZWNsYXJhdGlvbnMKLXNlYXJjaC5yZWZlcmVuY2VzLmxhYmVsID0gUmUmZmVyZW5jZXMKLQotISBleHRlbnNpb24gcG9pbnRzIAotRXh0ZW5zaW9uTm9kZUN1c3RvbWl6YXRpb25zRGVzY3JpcHRpb24gPSBFeHRlbnNpb24gTm9kZSBDdXN0b21pemF0aW9ucwotWE1MU2NoZW1hRWRpdG9yTW9kZXMgPSBYTUwgU2NoZW1hIEVkaXRvciBNb2RlcwotIyMKLVhTRF9Tb3VyY2VfdGFyZ2V0X25hbWU9WE1MIFNjaGVtYSBTb3VyY2UKLVhTRF9oeXBlcmxpbms9WE1MIFNjaGVtYSBDb250ZW50Ci0KLQotWFNEX0RFU0lHTl9WSUVXX0RFU0NSSVBUSU9OPVhTRCBFZGl0b3IgRGVzaWduIFZpZXcKLVhTRF9ERVNJR05fVklFVz1YU0QgRWRpdG9yIERlc2lnbiBWaWV3Ci1YU0RfU09VUkNFX1ZJRVdfREVTQ1JJUFRJT049WFNEIEVkaXRvciBTb3VyY2UgVmlldwotWFNEX1NPVVJDRV9WSUVXPVhTRCBFZGl0b3IgU291cmNlIFZpZXcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGYyMWUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjk1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0JCTxlZGl0b3IKLQkJCW5hbWU9IiVfVUlfRURJVE9SX05BTUUiCi0JCQlpY29uPSJpY29ucy9YU0RGaWxlLmdpZiIKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTRE11bHRpUGFnZUVkaXRvckNvbnRyaWJ1dG9yIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIj4KLSAgICAgICAgICAgIDxjb250ZW50VHlwZUJpbmRpbmcKLSAgICAgICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlIiAvPgotCQk8L2VkaXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotICAgICAgICA8ZWRpdG9yQ29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZHNvdXJjZS5ydWxlci5hY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlU2VsZWN0UnVsZXIubGFiZWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iLz4KLSAgICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLQkJPHdpemFyZAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdYU0RXaXphcmQiCi0JCQluYW1lPSIlX1VJX1dJWkFSRF9ORVdfWFNEIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdYU0RXaXphcmQiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LlhNTENhdGVnb3J5IgotCQkJaWNvbj0iaWNvbnMvY3Rvb2wxNi9OZXdYU0QuZ2lmIj4KLQkJCTxkZXNjcmlwdGlvbj4lX1VJX0NSRUFURV9BX05FV19TQ0hFTUE8L2Rlc2NyaXB0aW9uPgotCQkJPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPgotCQk8L3dpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JCTxwYWdlCi0JCQluYW1lPSIlX1VJX1hNTF9TQ0hFTUFfUFJFRkVSRU5DRSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnByZWZlcmVuY2VzLnhtbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhTRFByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWFNEUHJlZmVyZW5jZVBhZ2UiPgotCQk8L3BhZ2U+Ci0gICAgPHBhZ2UKLSAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0RQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0RFZGl0b3JQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0RFZGl0b3JQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBuYW1lPSIlX1VJX1hNTF9TQ0hFTUFfRURJVE9SX1BSRUZFUkVOQ0UiPgotICAgIDwvcGFnZT4KLSAgICA8cGFnZQotICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhTRFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhTRFZhbGlkYXRvclByZWZlcmVuY2VQYWdlIgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhTRFZhbGlkYXRvclByZWZlcmVuY2VQYWdlIgotICAgICAgICAgIG5hbWU9IiVfVUlfWE1MX1NDSEVNQV9WQUxJREFUT1JfUFJFRkVSRU5DRSI+Ci0gICAgPC9wYWdlPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9InByZWZlcmVuY2VwYWdlcyIKLQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhTRFByZWZlcmVuY2VQYWdlIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlIiAvPgotICAgCQk8c291cmNlVmlld2VyQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTRCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZHNvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN1cHBvcnQgaGVscCBvbiB0aGUgdGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gICA8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb25GaWxlcyI+Ci0JCTxhbm5vdGF0aW9uRmlsZQotCQlsb2NhdGlvbj0iL3czYy9zY2hlbWFGb3JDb2RlQXNzaXN0LWFubm90YXRpb25zLnhtbCIKLQkJcHVibGljSWQ9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLQkJPC9hbm5vdGF0aW9uRmlsZT4KLQkJPC9leHRlbnNpb24+Ci0JLS0+Ci0JCi0JCi0gICA8ZXh0ZW5zaW9uIAotICAgCQlwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQucHJvcGVydHlDb250cmlidXRvciI+Ci0gICAgIDxwcm9wZXJ0eUNvbnRyaWJ1dG9yCi0gICAgICAgICAgIGNvbnRyaWJ1dG9ySWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yIgotICAgICAgICAgICBsYWJlbFByb3ZpZGVyPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnByb3ZpZGVycy5YU0RTZWN0aW9uTGFiZWxQcm92aWRlciI+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeSBjYXRlZ29yeT0iR2VuZXJhbCIvPgotICAgCQkgPHByb3BlcnR5Q2F0ZWdvcnkgY2F0ZWdvcnk9IkRvY3VtZW50YXRpb24iLz4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5IGNhdGVnb3J5PSJBZHZhbmNlZCIvPgotICAgICA8L3Byb3BlcnR5Q29udHJpYnV0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiAKLSAgICAJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnByb3BlcnR5VGFicyI+Ci0gICAgICA8cHJvcGVydHlUYWJzIAotICAgICAgICAgICAgY29udHJpYnV0b3JJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IiPgotCQkJPHByb3BlcnR5VGFiCi0JCQkJbGFiZWw9IiVfVUlfTEFCRUxfR0VORVJBTCIKLQkJCQljYXRlZ29yeT0iR2VuZXJhbCIKLQkJCQlpZD0icHJvcGVydHkudGFiLmdlbmVyYWwiPgotCQkJPC9wcm9wZXJ0eVRhYj4KLQkJCTxwcm9wZXJ0eVRhYgotCQkJCWxhYmVsPSIlX1VJX0xBQkVMX1RZUEVfQ09OU1RSQUlOVFMiCi0JCQkJY2F0ZWdvcnk9IkdlbmVyYWwiCi0JCQkJYWZ0ZXJUYWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIgotCQkJCWlkPSJwcm9wZXJ0eS50YWIudHlwZWNvbnN0cmFpbnRzIj4KLQkJCTwvcHJvcGVydHlUYWI+Ci0JCQk8cHJvcGVydHlUYWIKLQkJCQlsYWJlbD0iJV9VSV9MQUJFTF9FTlVNRVJBVElPTlMiCi0JCQkJY2F0ZWdvcnk9IkdlbmVyYWwiCi0JCQkJYWZ0ZXJUYWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIgotCQkJCWlkPSJwcm9wZXJ0eS50YWIuZW51bWVyYXRpb25zIj4KLQkJCTwvcHJvcGVydHlUYWI+Ci0JCQk8cHJvcGVydHlUYWIKLQkJCQlsYWJlbD0iJV9VSV9MQUJFTF9BRFZBTkNFRCIKLQkJCQljYXRlZ29yeT0iQWR2YW5jZWQiCi0JCQkJYWZ0ZXJUYWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIgotCQkJCWlkPSJwcm9wZXJ0eS50YWIuYWR2YW5jZWQiPgotCQkJPC9wcm9wZXJ0eVRhYj4JCQkKLQkJCTxwcm9wZXJ0eVRhYgotCQkJCWxhYmVsPSIlX1VJX0xBQkVMX0RPQ1VNRU5UQVRJT04iCi0JCQkJY2F0ZWdvcnk9IkRvY3VtZW50YXRpb24iCi0JCQkJYWZ0ZXJUYWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIgotCQkJCWlkPSJwcm9wZXJ0eS50YWIuZG9jdW1lbnRhdGlvbiI+Ci0JCQk8L3Byb3BlcnR5VGFiPgotCQkJPHByb3BlcnR5VGFiCi0JCQkJbGFiZWw9IiVfVUlfTEFCRUxfRVhURU5TSU9OUyIKLQkJCQljYXRlZ29yeT0iRG9jdW1lbnRhdGlvbiIKLQkJCQlhZnRlclRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiCi0JCQkJaWQ9InByb3BlcnR5LnRhYi5leHRlbnNpb25zIj4KLQkJCTwvcHJvcGVydHlUYWI+Ci0gICAgPC9wcm9wZXJ0eVRhYnM+Ci0gPC9leHRlbnNpb24+Ci0KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQucHJvcGVydHlTZWN0aW9ucyI+Ci0gICA8cHJvcGVydHlTZWN0aW9ucyBjb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvciI+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTRFNjaGVtYVNlY3Rpb24iICAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uWFNEU2NoZW1hU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuYWR2YW5jZWQiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RTY2hlbWFBZHZhbmNlZFNlY3Rpb24iICAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uWFNEU2NoZW1hU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlNjaGVtYUxvY2F0aW9uU2VjdGlvbiIgCi0JIAlpZD0icHJvcC5zZWN0aW9uLlNjaGVtYUxvY2F0aW9uU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hQ29tcG9zaXRvciI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RDb21wbGV4VHlwZVNlY3Rpb24iICAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uWFNEQ29tcGxleFR5cGVTZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb24iPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5hZHZhbmNlZCIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTRENvbXBsZXhUeXBlQWR2YW5jZWRTZWN0aW9uIiAgCi0JIAlpZD0icHJvcC5zZWN0aW9uLlhTRENvbXBsZXhUeXBlQWR2YW5jZWRTZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb24iPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4JCSAKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNERWxlbWVudERlY2xhcmF0aW9uU2VjdGlvbiIgIAotCSAJaWQ9InByb3Auc2VjdGlvbi5YU0RFbGVtZW50RGVjbGFyYXRpb25TZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb24iPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5hZHZhbmNlZCIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTREVsZW1lbnREZWNsYXJhdGlvbkFkdmFuY2VkU2VjdGlvbiIgIAotCSAJaWQ9InByb3Auc2VjdGlvbi5YU0RFbGVtZW50RGVjbGFyYXRpb25BZHZhbmNlZFNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbiI+Ci0JICAgIDwvaW5wdXQ+ICAgCi0JIDwvcHJvcGVydHlTZWN0aW9uPiAKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNEQXR0cmlidXRlRGVjbGFyYXRpb25TZWN0aW9uIgotCSAJaWQ9InByb3Auc2VjdGlvbi5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvblNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblNlY3Rpb24iICAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+CQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RNb2RlbEdyb3VwU2VjdGlvbiIgIAotCSAJaWQ9InByb3Auc2VjdGlvbi5YU0RNb2RlbEdyb3VwU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cCI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvblNlY3Rpb24iICAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uWFNETW9kZWxHcm91cERlZmluaXRpb25TZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RTaW1wbGVUeXBlU2VjdGlvbiIKLQkgCWlkPSJwcm9wLnNlY3Rpb24uWFNEU2ltcGxlVHlwZVNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuYWR2YW5jZWQiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RTaW1wbGVUeXBlQWR2YW5jZWRTZWN0aW9uIiAgCi0JIAlpZD0icHJvcC5zZWN0aW9uLlhTRFNpbXBsZVR5cGVBZHZhbmNlZFNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIudHlwZWNvbnN0cmFpbnRzIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNERmFjZXRTZWN0aW9uIgotICAgICAgICBmaWx0ZXI9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNERmFjZXRTZWN0aW9uRmlsdGVyIgotCSAJaWQ9InByb3Auc2VjdGlvbi5YU0RGYWNldFNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50Ij4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuZG9jdW1lbnRhdGlvbiIgCi0JIAljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5Bbm5vdGF0aW9uU2VjdGlvbiIgCi0JIAlpZD0icHJvcC5zZWN0aW9uLkFubm90YXRpb25TZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudCI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmV4dGVuc2lvbnMiIAotCSAJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuRXh0ZW5zaW9uc1NlY3Rpb24iIAotCSAJaWQ9InByb3Auc2VjdGlvbi5FeHRlbnNpb25zU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQiPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIiAKLQkgCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTREFueUVsZW1lbnRDb250ZW50c1NlY3Rpb24iIAotCSAJaWQ9InByb3Auc2VjdGlvbi5nZW5lcmFsIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZCI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiIAotCSAJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNESW1wb3J0U2VjdGlvbiIgCi0JIAlpZD0icHJvcC5zZWN0aW9uLmdlbmVyYWwiPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTREltcG9ydCI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiIAotCSAJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNERW51bWVyYXRpb25GYWNldFNlY3Rpb24iIAotCSAJaWQ9InByb3Auc2VjdGlvbi5nZW5lcmFsIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RFbnVtZXJhdGlvbkZhY2V0Ij4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+CSAKLSAgPC9wcm9wZXJ0eVNlY3Rpb25zPgotPC9leHRlbnNpb24+Ci0KLSAgPCEtLSB0aGlzIGV4dGVuc2lvbiBwb2ludCBpcyBkZXByZWNhdGVkLCB1c2UgZXh0ZW5zaW9uQ2F0ZWdvcmllcyAtLT4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iRXh0ZW5zaW9uc1NjaGVtYXNEZXNjcmlwdGlvbiIgbmFtZT0iJUV4dGVuc2lvbnNTY2hlbWFzRGVzY3JpcHRpb24iLz4gIAotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJleHRlbnNpb25DYXRlZ29yaWVzIiBuYW1lPSIlRXh0ZW5zaW9uQ2F0ZWdvcmllc0Rlc2NyaXB0aW9uIi8+Ci0KLSAgPCEtLSB0aGlzIGV4dGVuc2lvbiBwb2ludCBpcyBkZXByZWNhdGVkLCB1c2UgaW50ZXJuYWxFZGl0b3JDb25maWd1cmF0aW9uIC0tPiAgCi0gIDxleHRlbnNpb24tcG9pbnQgaWQ9IlhTREVkaXRvckV4dGVuc2lvbkNvbmZpZ3VyYXRpb24iIG5hbWU9IiVYU0RFZGl0b3JFeHRlbnNpb25Db25maWd1cmF0aW9uIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImludGVybmFsRWRpdG9yQ29uZmlndXJhdGlvbiIgbmFtZT0iJUludGVybmFsRWRpdG9yQ29uZmlndXJhdGlvbiIvPgotICAKLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXh0ZW5zaWJpbGl0eU5vZGVDdXN0b21pemF0aW9ucyIgbmFtZT0iJUV4dGVuc2lvbk5vZGVDdXN0b21pemF0aW9uc0Rlc2NyaXB0aW9uIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVkaXRvck1vZGVzIiBuYW1lPSIlWE1MU2NoZW1hRWRpdG9yTW9kZXMiLz4KLQotCTwhLS0gaW50aWFsaXplIHhzZCByZWNvbmNpbGUgdmFsaWRhdG9yIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJ0b3RhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTRCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTRCI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cyI+Ci0JCTxjb250ZXh0Ci0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS50ZXh0LmVkaXRvci5jb250ZXh0IgotCQkJbmFtZT0iJWNvbnRleHQudGV4dC5lZGl0b3IueHNkLm5hbWUiCi0JCQlwYXJlbnRJZD0ib3JnLmVjbGlwc2UudWkudGV4dEVkaXRvclNjb3BlIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSB0aGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGF1Z21lbnQgdGhlIE1vZGVsUXVlcnkgdG8gcHJvdmlkZSBzY2hlbWEgc3BlY2lmaWMgZ3VpZGVkIGVkaXRpbmcgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVsUXVlcnlFeHRlbnNpb25zIj4KLQkJPG1vZGVsUXVlcnlFeHRlbnNpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnRleHQuWFNETW9kZWxRdWVyeUV4dGVuc2lvbiIKLQkJCWNvbnRlbnRUeXBlPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlIj4KLQkJPC9tb2RlbFF1ZXJ5RXh0ZW5zaW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBSZWdpc3RlciB0aGUgWFNEU2VhcmNoUGFydGljcGFudCBhZ2FpbnN0IGZvciBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJucyAJCS0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgkKLQkgPGV4dGVuc2lvbiAgIAotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaFBhcnRpY2lwYW50cyI+Ci0JCTxzZWFyY2hQYXJ0aWNpcGFudAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2Quc2VhcmNoLlhTRFNlYXJjaFBhcnRpY2lwYW50IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLlhTRFNlYXJjaFBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJICAgPG9yPgotCQkJICAgICAgPHdpdGggdmFyaWFibGU9InBhdHRlcm4iPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuIi8+CQkJICAgCi0JCQkJICA8L3dpdGg+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9zZWFyY2hQYXJ0aWNpcGFudD4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgkgCi0gICAgPCEtLSBSZWdpc3RlciBhICdyZW5hbWUnIHBhcnRpY2lwYW50IHRoaXMgZW5hYmxlcyB1cyB0byBwcm92aWRlIHJlZmFjdG9yaW5nIGZvciAgICAgLS0+IAotICAgIDwhLS0gcmVuYW1lZCBYTUwgU2NoZW1hIGNvbXBvbmVudHMgKGUuZy4gZWxlbWVudHMsIHR5cGVzIGV0Yy4pICAgICAgICAgICAgICAgICAgICAgIC0tPiAKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4JIAotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnJlbmFtZVBhcnRpY2lwYW50cyI+Ci0JCTxyZW5hbWVQYXJ0aWNpcGFudAotCQkJbmFtZT0iJXhzZC5yZXNvdXJjZS5yZW5hbWUucGFydGljaXBhbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZS5YU0RDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnJlZmFjdG9yaW5nLlhTRENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJlbGVtZW50Ij4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQiPgotCQkJCQk8L2luc3RhbmNlb2Y+Ci0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3JlbmFtZVBhcnRpY2lwYW50PgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4JIAotICAgIDwhLS0gUmVnaXN0ZXIgYSAncmVuYW1lJyBwYXJ0aWNpcGFudCB0aGlzIGVuYWJsZXMgdXMgdG8gcHJvdmlkZSByZWZhY3RvcmluZyBmb3IgICAgIC0tPiAKLSAgICA8IS0tIHJlbmFtZWQgcmVzb3VyY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4gCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CSAKLTwhLS0KLSAgICA8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5yZW5hbWVQYXJ0aWNpcGFudHMiPgotCQk8cmVuYW1lUGFydGljaXBhbnQKLQkJCW5hbWU9IiV4c2QucmVzb3VyY2UucmVuYW1lLnBhcnRpY2lwYW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnJlZmFjdG9yaW5nLlhTRFJlc291cmNlUmVuYW1lUGFydGljaXBhbnQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIi8+Ci0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3JlbmFtZVBhcnRpY2lwYW50PgotCTwvZXh0ZW5zaW9uPgotCS0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFJlZ2lzdGVyIHRoZSAgJ1JlZmFjdG9yJywgJ1JlZmVyZW5jZXMnIGFuZCAnRGVjbGFyYXRpb25zJyBpdGVtcyB0byB0aGUgZGVzaWduIHZpZXcJICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgkgICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4gCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uIAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3JpbmcubWVudS5vYmplY3RDb250cmliIiAKLSAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyIj4gIAotICAgICAgICAgPCEtLSAKLSAgICAgICAgIGNzIDogZGVjbGFyYXRpb24gc2VhcmNoIGlzbid0IGZ1bGx5IGltcGxlbWVudGVkIHlldCwgcmVtb3ZpbmcgdGhpcyBtZW51IGFjdGlvbiBmb3Igbm93Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5zZWFyY2guZGVjbGFyYXRpb25zLmFjdGlvbiIgCi0gICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgc3R5bGU9InB1bGxkb3duIgotICAgICAgICAgICAgbWVudWJhclBhdGg9InNlYXJjaC1zbG90IgotICAgICAgICAgICAgbGFiZWw9IiVzZWFyY2guZGVjbGFyYXRpb25zLmxhYmVsIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnMuWFNEU2VhcmNoRGVjbGFyYXRpb25zR3JvdXBBY3Rpb25EZWxlZ2F0ZSI+IAotICAgICAgICAgPC9hY3Rpb24+ICAgICAgICAgIAotICAgICAgICAgLS0+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5zZWFyY2gucmVmZXJlbmNlcy5hY3Rpb24iIAotICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgIHN0eWxlPSJwdWxsZG93biIKLSAgICAgICAgICAgIG1lbnViYXJQYXRoPSJzZWFyY2gtc2xvdCIKLSAgICAgICAgICAgIGxhYmVsPSIlc2VhcmNoLnJlZmVyZW5jZXMubGFiZWwiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9ucy5YU0RTZWFyY2hSZWZlcmVuY2VzR3JvdXBBY3Rpb25EZWxlZ2F0ZSI+IAotICAgICAgICAgPC9hY3Rpb24+Ci0gIAotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgICAgICAgCi0gICAgCi0gICAgIDwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLnJlbmFtZS5lbGVtZW50Lm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLnJlbmFtZS5lbGVtZW50LmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLnJlbmFtZS5lbGVtZW50Ij4KLQkJPC9jb21tYW5kPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VFbGVtZW50R2xvYmFsLmVsZW1lbnQubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC54c2QucmVmYWN0b3IubWFrZUVsZW1lbnRHbG9iYWwuZWxlbWVudC5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5tYWtlRWxlbWVudEdsb2JhbCI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLnhzZC5yZWZhY3Rvci5tYWtlVHlwZUdsb2JhbC5lbGVtZW50Lm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VUeXBlR2xvYmFsLmVsZW1lbnQuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IubWFrZVR5cGVHbG9iYWwiPgotCQk8L2NvbW1hbmQ+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlY29tbWFuZC54c2QucmVmYWN0b3IucmVuYW1lVGFyZ2V0TmFtZXNwYWNlLm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLnJlbmFtZVRhcmdldE5hbWVzcGFjZS5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5yZW5hbWVUYXJnZXROYW1lc3BhY2UiPgotCQk8L2NvbW1hbmQ+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IuaHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzIj4KLQkJPHRhcmdldAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiCi0JCQluYW1lPSIlWFNEX1NvdXJjZV90YXJnZXRfbmFtZSI+Ci0JCTwvdGFyZ2V0PgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmh5cGVybGlua0RldGVjdG9ycyI+Ci0JCTxoeXBlcmxpbmtEZXRlY3RvcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREh5cGVybGlua0RldGVjdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREh5cGVybGlua0RldGVjdG9yIgotCQkJbmFtZT0iJVhTRF9oeXBlcmxpbmsiCi0JCQl0YXJnZXRJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZHNvdXJjZSI+Ci0JCTwvaHlwZXJsaW5rRGV0ZWN0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQotIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLQk8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0idG9vbGJhcjpvcmcuZWNsaXBzZS53c3QueG1sLnVpLnBlcnNwZWN0aXZlLk5ld0ZpbGVUb29sQmFyIj4KLSAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmQiCi0gICAgICAgICAgICAgIGljb249Imljb25zL2N0b29sMTYvTmV3WFNELmdpZiIKLSAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkubmV3WFNERmlsZSIKLSAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgIHRvb2x0aXA9IiVfVUlfTkVXX1hNTF9TQ0hFTUFfVElUTEUiPgotICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibmV3V2l6YXJkSWQiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHMuTmV3WFNEV2l6YXJkIi8+Ci0gICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZVdvcmtiZW5jaFdpbmRvdy5hY3RpdmVQZXJzcGVjdGl2ZSI+Ci0JCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wZXJzcGVjdGl2ZSIvPgotCQkJPC93aXRoPgotICAgICAgICAgICA8L3Zpc2libGVXaGVuPiAgICAgICAgIAotICAgICAgICA8L2NvbW1hbmQ+ICAgICAgICAKLSAgICAgPC9tZW51Q29udHJpYnV0aW9uPgotICAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0icG9wdXA6cmVmYWN0b3JQb3B1cE1lbnVJZCI+Ci0gICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5yZW5hbWUuZWxlbWVudCIKLSAgICAgICAgICAgICAgbGFiZWw9IiVyZWZhY3RvcmluZy5yZW5hbWVBY3Rpb24ubGFiZWwiPgotICAgICAgICAgICA8dmlzaWJsZVdoZW4KLSAgICAgICAgICAgICAgICAgY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAJPHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgIAlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuZWRpdG9yLmFjdGl2ZS5zb3VyY2VWaWV3LmRlZmluaXRpb24iPgotICAgICAgICAgICAgICAgCTwvcmVmZXJlbmNlPgotICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgPC9tZW51Q29udHJpYnV0aW9uPgotICAgIDxtZW51Q29udHJpYnV0aW9uCi0gICAgICAgICAgbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3JNZW51SWQiPgotICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLnJlbmFtZS5lbGVtZW50IgotICAgICAgICAgICAgICAgIGxhYmVsPSIlcmVmYWN0b3JpbmcucmVuYW1lQWN0aW9uLmxhYmVsIj4KLSAgICAgICAgICAgICA8dmlzaWJsZVdoZW4KLSAgICAgICAgICAgICAgICAgICBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLSAgICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgPC9tZW51Q29udHJpYnV0aW9uPgotCTxtZW51Q29udHJpYnV0aW9uCi0gICAgICAgICAgbG9jYXRpb25VUkk9Im1lbnU6cmVmYWN0b3JNZW51SWQiPgotICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLnJlbmFtZS5lbGVtZW50IgotICAgICAgICAgICAgIGxhYmVsPSIlcmVmYWN0b3JpbmcucmVuYW1lQWN0aW9uLmxhYmVsIj4KLSAgICAgICAgICA8dmlzaWJsZVdoZW4KLSAgICAgICAgICAgICAgICBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICA8b3I+Ci0JICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKLQkgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmVkaXRvci5hY3RpdmUuZGVzaWduVmlldy5kZWZpbml0aW9uIj4KLQkgICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+Ci0JICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKLQkgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmVkaXRvci5hY3RpdmUuc291cmNlVmlldy5kZWZpbml0aW9uIj4KLQkgICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+Ci0gICAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICAgIAotICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgPC9tZW51Q29udHJpYnV0aW9uPgotICAgIDxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJwb3B1cDpyZWZhY3RvclBvcHVwTWVudUlkIj4KLSAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLm1ha2VFbGVtZW50R2xvYmFsIgotICAgICAgICAgICAgICBsYWJlbD0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VFbGVtZW50R2xvYmFsLmVsZW1lbnQubmFtZSI+Ci0gICAgICAgICAgIDx2aXNpYmxlV2hlbgotICAgICAgICAgICAgICAgICBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLSAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmVkaXRvci5hY3RpdmUuc291cmNlVmlldy5kZWZpbml0aW9uIj4KLSAgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgotICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgPC9tZW51Q29udHJpYnV0aW9uPgotICAgIDxtZW51Q29udHJpYnV0aW9uCi0gICAgICAgICAgbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3JNZW51SWQiPgotICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLm1ha2VFbGVtZW50R2xvYmFsIgotICAgICAgICAgICAgICAgIGxhYmVsPSIlY29tbWFuZC54c2QucmVmYWN0b3IubWFrZUVsZW1lbnRHbG9iYWwuZWxlbWVudC5uYW1lIj4KLSAgICAgICAgICAgICA8dmlzaWJsZVdoZW4KLSAgICAgICAgICAgICAgICAgICBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLSAgICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgPC9tZW51Q29udHJpYnV0aW9uPgotCTxtZW51Q29udHJpYnV0aW9uCi0gICAgICAgICAgbG9jYXRpb25VUkk9Im1lbnU6cmVmYWN0b3JNZW51SWQiPgotICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLm1ha2VFbGVtZW50R2xvYmFsIgotICAgICAgICAgICAgIGxhYmVsPSIlY29tbWFuZC54c2QucmVmYWN0b3IubWFrZUVsZW1lbnRHbG9iYWwuZWxlbWVudC5uYW1lIj4KLSAgICAgICAgICA8dmlzaWJsZVdoZW4KLSAgICAgICAgICAgICAgICBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICA8b3I+Ci0JICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKLQkgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmVkaXRvci5hY3RpdmUuZGVzaWduVmlldy5kZWZpbml0aW9uIj4KLQkgICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+Ci0JICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKLQkgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmVkaXRvci5hY3RpdmUuc291cmNlVmlldy5kZWZpbml0aW9uIj4KLQkgICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+Ci0gICAgICAgICAgICAgICAgPC9vcj4KLSAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICAgIAotICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgPC9tZW51Q29udHJpYnV0aW9uPgotICAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0icG9wdXA6cmVmYWN0b3JQb3B1cE1lbnVJZCI+Ci0gICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5tYWtlVHlwZUdsb2JhbCIKLSAgICAgICAgICAgICAgbGFiZWw9IiVjb21tYW5kLnhzZC5yZWZhY3Rvci5tYWtlVHlwZUdsb2JhbC5lbGVtZW50Lm5hbWUiPgotICAgICAgICAgICA8dmlzaWJsZVdoZW4KLSAgICAgICAgICAgICAgICAgY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICA8cmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuZWRpdG9yLmFjdGl2ZS5zb3VyY2VWaWV3LmRlZmluaXRpb24iPgotICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+Ci0gICAgICAgICAgIDwvdmlzaWJsZVdoZW4+Ci0gICAgICAgIDwvY29tbWFuZD4KLSAgICA8L21lbnVDb250cmlidXRpb24+Ci0gICAgPG1lbnVDb250cmlidXRpb24KLSAgICAgICAgICBsb2NhdGlvblVSST0icG9wdXA6b3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvck1lbnVJZCI+Ci0gICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IubWFrZVR5cGVHbG9iYWwiCi0gICAgICAgICAgICAgICAgbGFiZWw9IiVjb21tYW5kLnhzZC5yZWZhY3Rvci5tYWtlVHlwZUdsb2JhbC5lbGVtZW50Lm5hbWUiPgotICAgICAgICAgICAgIDx2aXNpYmxlV2hlbgotICAgICAgICAgICAgICAgICAgIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotICAgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+Ci0gICAgICAgIDwvY29tbWFuZD4KLSAgICA8L21lbnVDb250cmlidXRpb24+Ci0JPG1lbnVDb250cmlidXRpb24KLSAgICAgICAgICBsb2NhdGlvblVSST0ibWVudTpyZWZhY3Rvck1lbnVJZCI+Ci0gICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IubWFrZVR5cGVHbG9iYWwiCi0gICAgICAgICAgICAgbGFiZWw9IiVjb21tYW5kLnhzZC5yZWZhY3Rvci5tYWtlVHlwZUdsb2JhbC5lbGVtZW50Lm5hbWUiPgotICAgICAgICAgIDx2aXNpYmxlV2hlbgotICAgICAgICAgICAgICAgIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotICAgICAgICAgICAgICAgIDxvcj4KLQkgICAgICAgICAgICAgICAgPHJlZmVyZW5jZQotCSAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuZWRpdG9yLmFjdGl2ZS5kZXNpZ25WaWV3LmRlZmluaXRpb24iPgotCSAgICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KLQkgICAgICAgICAgICAgICAgPHJlZmVyZW5jZQotCSAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuZWRpdG9yLmFjdGl2ZS5zb3VyY2VWaWV3LmRlZmluaXRpb24iPgotCSAgICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KLSAgICAgICAgICAgICAgICA8L29yPgotICAgICAgICAgIDwvdmlzaWJsZVdoZW4+Ci0gICAgICAgICAgCi0gICAgICAgIDwvY29tbWFuZD4KLSAgICA8L21lbnVDb250cmlidXRpb24+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLm5hdmlnYXRvckNvbnRlbnQiPgotCTxjb21tb25XaXphcmQgdHlwZT0ibmV3IiB3aXphcmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hTRFdpemFyZCIgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwubmV3Lm1lbnVHcm91cCI+Ci0JCTxlbmFibGVtZW50PgotCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIvPgotCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZVdvcmtiZW5jaFdpbmRvdy5hY3RpdmVQZXJzcGVjdGl2ZSI+Ci0JCQkgICA8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnBlcnNwZWN0aXZlIi8+Ci0JCQk8L3dpdGg+Ci0JCTwvZW5hYmxlbWVudD4KLQk8L2NvbW1vbldpemFyZD4KLSA8L2V4dGVuc2lvbj4KLSA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgotICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmhhbmRsZXJzLlJlbmFtZUhhbmRsZXIiCi0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IucmVuYW1lLmVsZW1lbnQiPgotICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICAgIDx3aXRoCi0JICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5yZW5hbWVFbmFibGVkIj4KLSAgICAgICAgICAgICAgICAgPC90ZXN0PgotCSAgICAgICAgICAgICAgICAKLQkgICAgICAgICAgICAgPC93aXRoPiAgICAgICAgICAgICAKLQkJPC9lbmFibGVkV2hlbj4KLSAgICAgIDwvaGFuZGxlcj4KLSAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmhhbmRsZXJzLk1ha2VMb2NhbEVsZW1lbnRHbG9iYWxIYW5kbGVyIgotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLm1ha2VFbGVtZW50R2xvYmFsIj4KLSAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgICA8d2l0aAotCSAgICAgICAgICAgICAgICAgICB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IubWFrZUxvY2FsRWxlbWVudEdsb2JhbEVuYWJsZWQiPgotICAgICAgICAgICAgICAgICA8L3Rlc3Q+Ci0JICAgICAgICAgICAgICAgIAotCSAgICAgICAgICAgICA8L3dpdGg+ICAgICAgICAgICAgIAotCQk8L2VuYWJsZWRXaGVuPgotICAgICAgPC9oYW5kbGVyPgotICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmhhbmRsZXJzLk1ha2VBbm9ueW1vdXNUeXBlR29iYWxIYW5kbGVyIgotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLm1ha2VUeXBlR2xvYmFsIj4KLSAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgICA8d2l0aAotCSAgICAgICAgICAgICAgICAgICB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IubWFrZUFub255bW91c1R5cGVHbG9iYWxFbmFibGVkIj4KLSAgICAgICAgICAgICAgICAgPC90ZXN0PgotCSAgICAgICAgICAgICAgICAKLQkgICAgICAgICAgICAgPC93aXRoPiAgICAgICAgICAgICAKLQkJPC9lbmFibGVkV2hlbj4KLSAgICAgIDwvaGFuZGxlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMucHJvcGVydHlUZXN0ZXJzIj4KLSAgICAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVuYW1lRW5hYmxlbWVudFRlc3RlciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLnJlbmFtZS5lbmFibGVtZW50IgotICAgICAgICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yIgotICAgICAgICAgICAgcHJvcGVydGllcz0icmVuYW1lRW5hYmxlZCIKLSAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbiI+Ci0gICAgICA8L3Byb3BlcnR5VGVzdGVyPgotICAgICAgPHByb3BlcnR5VGVzdGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5NYWtlTG9jYWxFbGVtZW50R2xvYmFsRW5hYmxlbWVudFRlc3RlciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLm1ha2VMb2NhbEVsZW1lbnRHbG9iYWxFbmFibGVkIgotICAgICAgICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yIgotICAgICAgICAgICAgcHJvcGVydGllcz0ibWFrZUxvY2FsRWxlbWVudEdsb2JhbEVuYWJsZWQiCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24iPgotICAgICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLSAgICAgICA8cHJvcGVydHlUZXN0ZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLk1ha2VBbm9ueW1vdXNUeXBzR2xvYmFsRW5hYmxlbWVudFRlc3RlciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLm1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsRW5hYmxlZCIKLSAgICAgICAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3RvciIKLSAgICAgICAgICAgIHByb3BlcnRpZXM9Im1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsRW5hYmxlZCIKLSAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbiI+Ci0gICAgICA8L3Byb3BlcnR5VGVzdGVyPgotICAgICAgCi0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cyI+Ci0gICAgICA8Y29udGV4dAotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVYU0RfREVTSUdOX1ZJRVdfREVTQ1JJUFRJT04iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5lZGl0b3IuZGVzaWduVmlldyIKLSAgICAgICAgICAgIG5hbWU9IiVYU0RfREVTSUdOX1ZJRVciPgotICAgICAgPC9jb250ZXh0PgotICAgICAgICAgICAgPGNvbnRleHQKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlWFNEX1NPVVJDRV9WSUVXX0RFU0NSSVBUSU9OIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuZWRpdG9yLnNvdXJjZVZpZXciCi0gICAgICAgICAgICBuYW1lPSIlWFNEX1NPVVJDRV9WSUVXIj4KLSAgICAgIDwvY29udGV4dD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotICAgICAgPGRlZmluaXRpb24KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmVkaXRvci5hY3RpdmUuZGVzaWduVmlldy5kZWZpbml0aW9uIj4KLSAgICAgICAgIDx3aXRoCi0gICAgICAgICAgICAgICB2YXJpYWJsZT0iYWN0aXZlQ29udGV4dHMiPgotICAgICAgICAgICAgPGl0ZXJhdGUKLSAgICAgICAgICAgICAgICAgIG9wZXJhdG9yPSJvciI+Ci0gICAgICAgICAgICAgICA8ZXF1YWxzCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5lZGl0b3IuZGVzaWduVmlldyI+Ci0gICAgICAgICAgICAgICA8L2VxdWFscz4KLSAgICAgICAgICAgIDwvaXRlcmF0ZT4KLSAgICAgICAgIDwvd2l0aD4KLSAgICAgIDwvZGVmaW5pdGlvbj4KLSAgICAgIDxkZWZpbml0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5lZGl0b3IuYWN0aXZlLnNvdXJjZVZpZXcuZGVmaW5pdGlvbiI+Ci0gICAgICAgICA8d2l0aAotICAgICAgICAgICAgICAgdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLSAgICAgICAgICAgIDxpdGVyYXRlCi0gICAgICAgICAgICAgICAgICBvcGVyYXRvcj0ib3IiPgotICAgICAgICAgICAgICAgPGVxdWFscwotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuZWRpdG9yLnNvdXJjZVZpZXciPgotICAgICAgICAgICAgICAgPC9lcXVhbHM+Ci0gICAgICAgICAgICA8L2l0ZXJhdGU+Ci0gICAgICAgICA8L3dpdGg+Ci0gICAgICA8L2RlZmluaXRpb24+Ci0gICA8L2V4dGVuc2lvbj4gIAotICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovVHlwZVZpekVkaXRvck1vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovVHlwZVZpekVkaXRvck1vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ4ZDEyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L1R5cGVWaXpFZGl0b3JNb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXo7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuRWRpdG9yTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLkFEVENvbnRlbnRPdXRsaW5lUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5UeXBlVml6RmlndXJlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuWFNERWRpdFBhcnRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgVHlwZVZpekVkaXRvck1vZGUgZXh0ZW5kcyBFZGl0b3JNb2RlCi17Ci0gIHByaXZhdGUgRWRpdFBhcnRGYWN0b3J5IGVkaXRQYXJ0RmFjdG9yeTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS50eXBldml6IjsKLSAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkKLSAgewotICAgIHJldHVybiAiQWR2YW5jZWQiOwotICB9Ci0KLSAgcHVibGljIEVkaXRQYXJ0RmFjdG9yeSBnZXRFZGl0UGFydEZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGVkaXRQYXJ0RmFjdG9yeSA9PSBudWxsKQotICAgIHsKLSAgICAgIGVkaXRQYXJ0RmFjdG9yeSA9IG5ldyBYU0RFZGl0UGFydEZhY3RvcnkobmV3IFR5cGVWaXpGaWd1cmVGYWN0b3J5KCkpOwotICAgIH0gIAotICAgIHJldHVybiBlZGl0UGFydEZhY3Rvcnk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiBJRDsKLSAgfQotCi0gIHB1YmxpYyBJQ29udGVudFByb3ZpZGVyIGdldE91dGxpbmVQcm92aWRlcigpCi0gIHsKLSAgICByZXR1cm4gbmV3IEFEVENvbnRlbnRPdXRsaW5lUHJvdmlkZXIoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9Cb3hGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvQm94RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YTkwNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9Cb3hGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5sYXlvdXRzLkNvbHVtbkRhdGE7Ci0KLXB1YmxpYyBjbGFzcyBCb3hGaWd1cmUgZXh0ZW5kcyBGaWd1cmUKLXsKLSAgcHJvdGVjdGVkIENvbHVtbkRhdGEgY29sdW1uRGF0YSA9IG5ldyBDb2x1bW5EYXRhKCk7ICAKLSAgcHVibGljIEhlYWRpbmdGaWd1cmUgaGVhZGluZ0ZpZ3VyZTsKLSAgcHJvdGVjdGVkIEZpZ3VyZSBjb250ZW50UGFuZTsKLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQgPSBmYWxzZTsKLQotICBwdWJsaWMgQm94RmlndXJlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gCi0gICAgYm9vbGVhbiBoaWdoQ29udHJhc3QgPSBmYWxzZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBoaWdoQ29udHJhc3QgPSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRIaWdoQ29udHJhc3QoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgaWYgKCFoaWdoQ29udHJhc3QpCi0gICAgewotICAgICAgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLSAgICB9Ci0gICAgCi0gICAgaGVhZGluZ0ZpZ3VyZSA9IG5ldyBIZWFkaW5nRmlndXJlKCk7ICAgCi0gICAgYWRkKGhlYWRpbmdGaWd1cmUpOwotCi0gICAgY29udGVudFBhbmUgPSBuZXcgRmlndXJlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBncmFwaGljcykKLSAgICAgIHsKLSAgICAgICAgZ3JhcGhpY3MuZmlsbFJlY3RhbmdsZShnZXRCb3VuZHMoKSk7Ci0gICAgICAgIHN1cGVyLnBhaW50KGdyYXBoaWNzKTsKLSAgICAgICAgYm9vbGVhbiBpc0ZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgRmlndXJlIGZpZ3VyZSA9IChGaWd1cmUpIGkubmV4dCgpOwotICAgICAgICAgIGlmIChpc0ZpcnN0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFJlY3RhbmdsZSByID0gZmlndXJlLmdldEJvdW5kcygpOwotICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0xpbmUoci54LCByLnkgKyAxLCByLnggKyByLndpZHRoLCByLnkgKyAxKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICAgIGNvbnRlbnRQYW5lLnNldExheW91dE1hbmFnZXIobmV3IFRvb2xiYXJMYXlvdXQoKSk7Ci0gICAgYWRkKGNvbnRlbnRQYW5lKTsKLSAgICBoZWFkaW5nRmlndXJlLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7IAotICB9Ci0KLSAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gIHsKLSAgICBzdXBlci5wYWludChncmFwaGljcyk7Ci0gICAgLyoKLSAgICAvLyBGaWxsIGZvciB0aGUgaGVhZGVyIHNlY3Rpb24KLSAgICAvLwotICAgIFJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgIGdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5kYXJrR3JheSk7Ci0gICAgQ29sb3IgZ3JhZGllbnQxID0gQ29sb3JDb25zdGFudHMubGlnaHRHcmF5OwotICAgIGlmIChpc1NlbGVjdGVkKQotICAgIHsKLSAgICAgIGdyYWRpZW50MSA9IENvbG9yQ29uc3RhbnRzLmxpZ2h0Qmx1ZTsKLSAgICB9Ci0gICAgQ29sb3IgZ3JhZGllbnQyID0gQ29sb3JDb25zdGFudHMud2hpdGU7Ci0gICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKGdyYWRpZW50MSk7Ci0gICAgZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKGdyYWRpZW50Mik7Ci0gICAgZ3JhcGhpY3MuZmlsbEdyYWRpZW50KHIueCArIDEsIHIueSArIDEsIHIud2lkdGggLSAyLCBub2RlTmFtZUxhYmVsLmdldEJvdW5kcygpLmhlaWdodCAtIDEsIHRydWUpOwotICAgIG5vZGVOYW1lTGFiZWwucGFpbnQoZ3JhcGhpY3MpOwotICAgICovCi0gIH0KLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gY29udGVudFBhbmU7Ci0gIH0KLQotICBwdWJsaWMgTGFiZWwgZ2V0TmFtZUxhYmVsKCkKLSAgewotICAgIHJldHVybiBoZWFkaW5nRmlndXJlLmdldExhYmVsKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBIZWFkaW5nRmlndXJlIGdldEhlYWRpbmdGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGhlYWRpbmdGaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDb2x1bW5EYXRhIGdldENvbHVtbkRhdGEoKQotICB7Ci0gICAgcmV0dXJuIGNvbHVtbkRhdGE7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9Db21wYXJ0bWVudEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9Db21wYXJ0bWVudEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDE5YWRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvQ29tcGFydG1lbnRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkRlc2lnblZpZXdlckdyYXBoaWNDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5TdHJ1Y3R1cmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JQ29tcGFydG1lbnRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSVN0cnVjdHVyZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5sYXlvdXRzLlJvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkdlbmVyaWNHcm91cEZpZ3VyZTsKLQotcHVibGljIGNsYXNzIENvbXBhcnRtZW50RmlndXJlIGV4dGVuZHMgRmlndXJlIGltcGxlbWVudHMgSUNvbXBhcnRtZW50RmlndXJlCi17Ci0gIHB1YmxpYyBMYWJlbCBub2RlTmFtZUxhYmVsOwotICBwcm90ZWN0ZWQgRmlndXJlIGNvbnRlbnRQYW5lOwotICBwcm90ZWN0ZWQgRmlndXJlIGFubm90YXRpb25BcmVhOwotICBwdWJsaWMgRmlndXJlIHJvd0ZpZ3VyZTsKLQotICBwdWJsaWMgQ29tcGFydG1lbnRGaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoKTsKLQotICAgIHJvd0ZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBhZGQocm93RmlndXJlKTsKLQotICAgIGFubm90YXRpb25BcmVhID0gbmV3IEZpZ3VyZSgpIHsKLSAgICAgIAotICAgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gICAgICB7Ci0gICAgICAgIHN1cGVyLnBhaW50KGdyYXBoaWNzKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBncmFwaGljcy5wdXNoU3RhdGUoKTsgIAotICAgICAgICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibHVlKTsKLSAgICAgICAgICBncmFwaGljcy5zZXRGb250KERlc2lnblZpZXdlckdyYXBoaWNDb25zdGFudHMuc21hbGxGb250KTsKLSAgICAgICAgICBMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZpZ3VyZSBvYmplY3QgPSAoRmlndXJlKWkubmV4dCgpOwotICAgICAgICAgICAgdHJhdmVyc2Uob2JqZWN0LCBncmFwaGljcyk7ICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICBncmFwaGljcy5wb3BTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHByaXZhdGUgdm9pZCB0cmF2ZXJzZShGaWd1cmUgZmlndXJlLCBHcmFwaGljcyBncmFwaGljcykKLSAgICAgIHsKLSAgICAgICAgTGlzdCBjaGlsZHJlbiA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgRmlndXJlIG9iamVjdCA9IChGaWd1cmUpaS5uZXh0KCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEdlbmVyaWNHcm91cEZpZ3VyZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBHZW5lcmljR3JvdXBGaWd1cmUgZmlnID0gKEdlbmVyaWNHcm91cEZpZ3VyZSkgb2JqZWN0OwotICAgICAgICAgICAgaWYgKGZpZy5oYXNUZXh0KCkpCi0gICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdUZXh0KGZpZy5nZXRUZXh0KCksIGZpZy5nZXRUZXh0Q29vcmRpbmF0ZXMoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHRyYXZlcnNlKG9iamVjdCwgZ3JhcGhpY3MpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotICAgICAgCi0gICAgfTsKLSAgICBUb29sYmFyTGF5b3V0IGFubm90YXRpb25MYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgYW5ub3RhdGlvbkxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIGFubm90YXRpb25BcmVhLnNldExheW91dE1hbmFnZXIoYW5ub3RhdGlvbkxheW91dCk7Ci0KLSAgICAvLyBOZWVkIHRoaXMgdG8gc2hvdyBjb250ZW50IG1vZGVsIHN0cnVjdHVyZSBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBmaWd1cmUKLSAgICByb3dGaWd1cmUuYWRkKGFubm90YXRpb25BcmVhKTsKLQotICAgIGNvbnRlbnRQYW5lID0gbmV3IEZpZ3VyZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gICAgICB7Ci0gICAgICAgIHN1cGVyLnBhaW50KGdyYXBoaWNzKTsKLSAgICAgICAgZ3JhcGhpY3MucHVzaFN0YXRlKCk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgYm9vbGVhbiBpc0ZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICBDb2xvciBvbGRDb2xvciA9IGdyYXBoaWNzLmdldEZvcmVncm91bmRDb2xvcigpOwotICAgICAgICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5saWdodEdyYXkpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZpZ3VyZSBmaWd1cmUgPSAoRmlndXJlKSBpLm5leHQoKTsKLSAgICAgICAgICAgIFJlY3RhbmdsZSByID0gZmlndXJlLmdldEJvdW5kcygpOwotLy8gICAgICAgICAgICBpZiAoZmlndXJlIGluc3RhbmNlb2YgRmllbGRGaWd1cmUpCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHJDaGlsZCA9ICgoRmllbGRGaWd1cmUpZmlndXJlKS5nZXROYW1lRmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0vLyAgICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKHJDaGlsZC5yaWdodCgpLCByQ2hpbGQueSwgckNoaWxkLnJpZ2h0KCksIHJDaGlsZC5ib3R0b20oKSk7Ci0vLyAgICAgICAgICAgICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5kYXJrR3JheSk7Ci0vLyAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpc0ZpcnN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7Ci0vLyAgICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKHIueCwgci55LCByLngsIHIueSArIHIuaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLSAgICAgICAgICAgICAgZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgZ3JhcGhpY3MuZmlsbEdyYWRpZW50KHIueCwgci55LCByLndpZHRoLCAxLCBmYWxzZSk7ICAgIAotLy8gICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKHIueCwgci55LCByLnggKyByLndpZHRoLCByLnkpOwotLy8gICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZShyLngsIHIueSwgci54LCByLnkgKyByLmhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihvbGRDb2xvcik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgZ3JhcGhpY3MucG9wU3RhdGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgY29udGVudFBhbmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgVG9vbGJhckxheW91dCgpKTsKLSAgICByb3dGaWd1cmUuYWRkKGNvbnRlbnRQYW5lKTsKLQotICAgIFJvd0xheW91dCByb3dMYXlvdXQgPSBuZXcgUm93TGF5b3V0KCk7Ci0gICAgcm93RmlndXJlLnNldExheW91dE1hbmFnZXIocm93TGF5b3V0KTsKLSAgICByb3dMYXlvdXQuc2V0Q29uc3RyYWludChhbm5vdGF0aW9uQXJlYSwgImFubm90YXRpb24iKTsKLSAgICByb3dMYXlvdXQuc2V0Q29uc3RyYWludChjb250ZW50UGFuZSwgImNvbnRlbnRQYW5lIik7Ci0gIH0KLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gY29udGVudFBhbmU7Ci0gIH0KLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRBbm5vdGF0aW9uUGFuZSgpCi0gIHsKLSAgICByZXR1cm4gYW5ub3RhdGlvbkFyZWE7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGVkaXRQYXJ0QXR0YWNoZWQoRWRpdFBhcnQgb3duZXIpCi0gIHsgICAKLSAgICBTdHJ1Y3R1cmVFZGl0UGFydCBzdHJ1Y3R1cmVFZGl0UGFydCA9IG51bGw7Ci0gICAgZm9yIChFZGl0UGFydCBwYXJlbnQgPSBvd25lci5nZXRQYXJlbnQoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKSkKLSAgICB7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgU3RydWN0dXJlRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIHN0cnVjdHVyZUVkaXRQYXJ0ID0gKFN0cnVjdHVyZUVkaXRQYXJ0KSBwYXJlbnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBSb3dMYXlvdXQgcm93TGF5b3V0ID0gKFJvd0xheW91dClyb3dGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpOwotICAgIElTdHJ1Y3R1cmVGaWd1cmUgdHlwZUZpZ3VyZSA9IHN0cnVjdHVyZUVkaXRQYXJ0LmdldFN0cnVjdHVyZUZpZ3VyZSgpOyAgICAKLSAgICBBc3NlcnQuaXNUcnVlKHR5cGVGaWd1cmUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVGaWd1cmUsICJFeHBlY3RlZCBvYmplY3Qgb2YgdHlwZSBTdHJ1Y3R1cmVGaWd1cmUiKTsgICAgCi0gICAgcm93TGF5b3V0LnNldENvbHVtbkRhdGEoKChTdHJ1Y3R1cmVGaWd1cmUpdHlwZUZpZ3VyZSkuZ2V0Q29sdW1uRGF0YSgpKTsgICAgICAgICAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkZlZWRiYWNrKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uRmVlZGJhY2soKQotICB7Ci0gIH0gICAKLSAgCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hWaXN1YWxzKE9iamVjdCBtb2RlbCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9GaWVsZEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9GaWVsZEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWQ4N2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvRmllbGRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5TdHJ1Y3R1cmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JRmllbGRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSVN0cnVjdHVyZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5sYXlvdXRzLlJvd0xheW91dDsKLQotcHVibGljIGNsYXNzIEZpZWxkRmlndXJlIGV4dGVuZHMgRmlndXJlIGltcGxlbWVudHMgSUZpZWxkRmlndXJlCi17Ci0gIC8vIFRPRE86IHB1dCB0aGlzIGNvbG9yIGlzIHNvbWUgY29tbW9uIGNsYXNzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgY2VsbENvbG9yID0gbmV3IENvbG9yKG51bGwsIDIyNCwgMjMzLCAyNDYpOwotCi0vLyBGb3IgZml4IHRvIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjE5NDAKLS8vICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIGxlZnRPdXRlckJvcmRlckNvbG9yID0gbmV3IENvbG9yKG51bGwsIDI1MywgMTk2LCA4OCk7Ci0vLyAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBsZWZ0SW5uZXJCb3JkZXJDb2xvciA9IG5ldyBDb2xvcihudWxsLCAyNTMsIDIyNiwgMTcyKTsKLS8vICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIHJpZ2h0T3V0ZXJCb3JkZXJDb2xvciA9IG5ldyBDb2xvcihudWxsLCAxNTAsIDE3OSwgMjI0KTsKLS8vICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIHJpZ2h0SW5uZXJCb3JkZXJDb2xvciA9IG5ldyBDb2xvcihudWxsLCA0OSwgMTA2LCAxOTcpOwotICAKLSAgLy8gRm9ybWF0dGluZyBjb25zdHJhaW50cwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1BfTUFSR0lOID0gMjsgLy8gcGl4ZWxzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPVFRPTV9NQVJHSU4gPSBUT1BfTUFSR0lOICsgMTsgLy8gZXh0cmEgcGl4ZWwgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvb3RlciBsaW5lCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlRfTUFSR0lOID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfTUFSR0lOID0gTEVGVF9NQVJHSU47Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUX1NJREVfUEFERElORyA9IDY7Ci0KLSAgLy8gU3RhdGVzIHJlcXVpcmluZyBkZWNvcmF0b3JzLCBhbmQgdGhlaXIgaWNvbnMKLSAgLy8gcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbWFnZSBlcnJvckljb24gPSBJQ09OX0VSUk9SOwotCi0gIC8vIExhYmVscyB3aGljaCBoYW5kbGUgcHJlc2VudGF0aW9uIG9mIG5hbWUgYW5kIHR5cGUKLSAgcHVibGljIEZpZ3VyZSByb3dGaWd1cmU7Ci0gIHByb3RlY3RlZCBMYWJlbCBuYW1lTGFiZWw7Ci0gIHByb3RlY3RlZCBMYWJlbCBuYW1lQW5ub3RhdGlvbkxhYmVsOyAgLy8gZm9yIG9jY3VycmVuY2UgdGV4dCwgb3IgZXJyb3IgaWNvbnMKLSAgcHJvdGVjdGVkIExhYmVsIHR5cGVMYWJlbDsKLSAgcHJvdGVjdGVkIExhYmVsIHR5cGVBbm5vdGF0aW9uTGFiZWw7ICAvLyBmb3Igb2NjdXJyZW5jZSB0ZXh0LCBvciBlcnJvciBpY29ucwotICBwcm90ZWN0ZWQgTGFiZWwgdG9vbFRpcExhYmVsOwotICAKLSAgcHVibGljIGJvb2xlYW4gaGFzRm9jdXMgPSBmYWxzZTsKLSAgCi0gIHB1YmxpYyBGaWVsZEZpZ3VyZSgpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHNldExheW91dE1hbmFnZXIobmV3IFRvb2xiYXJMYXlvdXQoKSk7Ci0gICAgcm93RmlndXJlID0gbmV3IEZpZ3VyZSgpOwotICAgIFJvd0xheW91dCByb3dMYXlvdXQgPSBuZXcgUm93TGF5b3V0KCk7Ci0gICAgcm93RmlndXJlLnNldExheW91dE1hbmFnZXIocm93TGF5b3V0KTsKLQotICAgIGFkZChyb3dGaWd1cmUpOwotCi0gICAgbmFtZUxhYmVsID0gbmV3IExhYmVsKCk7Ci0gICAgbmFtZUxhYmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDMsIDUsIDMsIDUpKTsKLSAgICBuYW1lTGFiZWwuc2V0TGFiZWxBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuTEVGVCk7Ci0gICAgbmFtZUxhYmVsLnNldE9wYXF1ZSh0cnVlKTsKLSAgICByb3dGaWd1cmUuYWRkKG5hbWVMYWJlbCk7Ci0gICAgCi0gICAgbmFtZUFubm90YXRpb25MYWJlbCA9IG5ldyBMYWJlbCgpOwotICAgIG5hbWVBbm5vdGF0aW9uTGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMywgNSwgMywgNSkpOwotICAgIG5hbWVBbm5vdGF0aW9uTGFiZWwuc2V0TGFiZWxBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuTEVGVCk7Ci0gICAgbmFtZUFubm90YXRpb25MYWJlbC5zZXRPcGFxdWUodHJ1ZSk7Ci0gICAgcm93RmlndXJlLmFkZChuYW1lQW5ub3RhdGlvbkxhYmVsKTsKLSAgICAKLSAgICB0b29sVGlwTGFiZWwgPSBuZXcgTGFiZWwoKTsKLS8vICBEb24ndCBzaG93IHRvb2x0aXAgZm9yIG5vdy4gIEFubm95aW5nIHZlcnRpY2FsIGxpbmUgc2hvd3MgdXAuICBTYWZlIGZpeC4KLS8vICAgIG5hbWVMYWJlbC5zZXRUb29sVGlwKHRvb2xUaXBMYWJlbCk7Ci0gICAgdHlwZUxhYmVsID0gbmV3IExhYmVsKCk7Ci0gICAgCi0gICAgLy8gY3MgOiB3ZSBuZWVkIHRvIGFkZCBzb21lIGFkZGl0aW9uYWwgcGFkZGluZyB0byB0aGUgcmlnaHQKLSAgICAvLyBzbyB0aGF0IHdoZW4gd2UgZWRpdCB0aGUgZmllbGQgdGhlcmUncyByb29tIGZvciB0aGUgY29tYm9ib3gncyBhcnJvdwotICAgIC8vIGFuZCB0aGUgdHlwZSBuYW1lIHdvbid0IGJlIHBhcnRpYWxseSBvYnNjdXJlZAotICAgIC8vCi0gICAgdHlwZUxhYmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDMsIDUsIDMsIDIwKSk7Ci0gICAgdHlwZUxhYmVsLnNldExhYmVsQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLkxFRlQpOwotICAgIHR5cGVMYWJlbC5zZXRPcGFxdWUodHJ1ZSk7Ci0gICAgcm93RmlndXJlLmFkZCh0eXBlTGFiZWwpOwotCi0gICAgdHlwZUFubm90YXRpb25MYWJlbCA9IG5ldyBMYWJlbCgpIHsKLSAgICAgIAotICAgICAgcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCB3SGludCwgaW50IGhIaW50KQotICAgICAgewotICAgICAgICBpZiAoZ2V0VGV4dCgpID09IG51bGwgfHwgZ2V0VGV4dCgpLmVxdWFscygiIikpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbigwLCAwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UHJlZmVycmVkU2l6ZSh3SGludCwgaEhpbnQpOwotICAgICAgfQotICAgIH07Ci0gICAgdHlwZUFubm90YXRpb25MYWJlbC5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigzLCA1LCAzLCA1KSk7Ci0gICAgdHlwZUFubm90YXRpb25MYWJlbC5zZXRMYWJlbEFsaWdubWVudChQb3NpdGlvbkNvbnN0YW50cy5MRUZUKTsKLSAgICB0eXBlQW5ub3RhdGlvbkxhYmVsLnNldE9wYXF1ZSh0cnVlKTsKLSAgICByb3dGaWd1cmUuYWRkKHR5cGVBbm5vdGF0aW9uTGFiZWwpOwotLy8gRG9uJ3Qgc2hvdyB0b29sdGlwIGZvciBub3cuICBBbm5veWluZyB2ZXJ0aWNhbCBsaW5lIHNob3dzIHVwLiAgU2FmZSBmaXguCi0vLyAgICB0eXBlQW5ub3RhdGlvbkxhYmVsLnNldFRvb2xUaXAodG9vbFRpcExhYmVsKTsKLSAgICAKLSAgICByb3dMYXlvdXQuc2V0Q29uc3RyYWludChuYW1lTGFiZWwsICJuYW1lIik7Ci0gICAgcm93TGF5b3V0LnNldENvbnN0cmFpbnQobmFtZUFubm90YXRpb25MYWJlbCwgIm5hbWVBbm5vdGF0aW9uIik7Ci0gICAgcm93TGF5b3V0LnNldENvbnN0cmFpbnQodHlwZUxhYmVsLCAidHlwZSIpOwotICAgIHJvd0xheW91dC5zZXRDb25zdHJhaW50KHR5cGVBbm5vdGF0aW9uTGFiZWwsICJ0eXBlQW5ub3RhdGlvbiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgIm5hbWUiIHN0cmluZyB1c2VkIGJ5IHRoaXMgZmlndXJlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lTGFiZWwuZ2V0VGV4dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmlndXJlIHJlcHJlc2VudGluZyB0aGUgYXR0cmlidXRlIG5hbWUKLSAgICovCi0gIHB1YmxpYyBMYWJlbCBnZXROYW1lTGFiZWwoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVMYWJlbDsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlICJ0eXBlIiBzdHJpbmcgdXNlZCBieSB0aGlzIGZpZ3VyZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gdHlwZUxhYmVsLmdldFRleHQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZpZ3VyZSByZXByZXNlbnRpbmcgdGhlIGF0dHJpYnV0ZSdzIHR5cGUKLSAgICovCi0gIHB1YmxpYyBMYWJlbCBnZXRUeXBlTGFiZWwoKQotICB7Ci0gICAgcmV0dXJuIHR5cGVMYWJlbDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gbmFtZQotICAgKiAgICAgICAgICBTZXQgdGhlICJuYW1lIiBzdHJpbmcgdXNlZCBieSB0aGlzIGZpZ3VyZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBuYW1lTGFiZWwuc2V0VGV4dChuYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gdHlwZQotICAgKiAgICAgICAgICBTZXQgdGhlICJ0eXBlIiBzdHJpbmcgdXNlZCBieSB0aGlzIGZpZ3VyZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpCi0gIHsKLSAgICB0eXBlTGFiZWwuc2V0VGV4dCh0eXBlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VHlwZVRvb2xUaXBUZXh0KFN0cmluZyB0b29sVGlwKQotICB7Ci0gICAgc2V0TmFtZVRvb2xUaXBUZXh0KHRvb2xUaXApOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZVRvb2xUaXBUZXh0KFN0cmluZyB0b29sVGlwKQotICB7Ci0gICAgaWYgKHRvb2xUaXAubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIG5hbWVMYWJlbC5zZXRUb29sVGlwKHRvb2xUaXBMYWJlbCk7Ci0gICAgICB0b29sVGlwTGFiZWwuc2V0VGV4dCh0b29sVGlwKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG5hbWVMYWJlbC5zZXRUb29sVGlwKG51bGwpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZUFubm90YXRpb25MYWJlbChTdHJpbmcgdGV4dCkKLSAgewotICAgIG5hbWVBbm5vdGF0aW9uTGFiZWwuc2V0VGV4dCh0ZXh0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWVBbm5vdGF0aW9uTGFiZWxJY29uKEltYWdlIGljb24pCi0gIHsKLSAgICBuYW1lQW5ub3RhdGlvbkxhYmVsLnNldEljb24oaWNvbik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMYWJlbCBnZXROYW1lQW5ub3RhdGlvbkxhYmVsKCkKLSAgewotICAgIHJldHVybiBuYW1lQW5ub3RhdGlvbkxhYmVsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRUeXBlQW5ub3RhdGlvbkxhYmVsKFN0cmluZyB0ZXh0KQotICB7Ci0gICAgdHlwZUFubm90YXRpb25MYWJlbC5zZXRUZXh0KHRleHQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VHlwZUFubm90YXRpb25MYWJlbEljb24oSW1hZ2UgaWNvbikKLSAgewotICAgIHR5cGVBbm5vdGF0aW9uTGFiZWwuc2V0SWNvbihpY29uKTsKLSAgfQotCi0gIHB1YmxpYyBMYWJlbCBnZXRUeXBlQW5ub3RhdGlvbkxhYmVsKCkKLSAgewotICAgIHJldHVybiB0eXBlQW5ub3RhdGlvbkxhYmVsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWNvbXB1dGVMYXlvdXQoKQotICB7Ci0gICAgUm93TGF5b3V0IGxheW91dCA9IChSb3dMYXlvdXQpcm93RmlndXJlLmdldExheW91dE1hbmFnZXIoKTsKLSAgICBpZiAobGF5b3V0ICE9IG51bGwgJiYgbGF5b3V0LmdldENvbHVtbkRhdGEoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGxheW91dC5nZXRDb2x1bW5EYXRhKCkuY2xlYXJDb2x1bW5XaWR0aHMoKTsKLSAgICB9ICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBlZGl0UGFydEF0dGFjaGVkKEVkaXRQYXJ0IG93bmVyKQotICB7Ci0gICAgU3RydWN0dXJlRWRpdFBhcnQgc3RydWN0dXJlRWRpdFBhcnQgPSBudWxsOwotICAgIGZvciAoRWRpdFBhcnQgcGFyZW50ID0gb3duZXIuZ2V0UGFyZW50KCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCkpCi0gICAgewotICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBzdHJ1Y3R1cmVFZGl0UGFydCA9IChTdHJ1Y3R1cmVFZGl0UGFydCkgcGFyZW50OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgUm93TGF5b3V0IHJvd0xheW91dCA9IChSb3dMYXlvdXQpcm93RmlndXJlLmdldExheW91dE1hbmFnZXIoKTsKLSAgICBJU3RydWN0dXJlRmlndXJlIHR5cGVGaWd1cmUgPSBzdHJ1Y3R1cmVFZGl0UGFydC5nZXRTdHJ1Y3R1cmVGaWd1cmUoKTsgICAgCi0gICAgQXNzZXJ0LmlzVHJ1ZSh0eXBlRmlndXJlIGluc3RhbmNlb2YgU3RydWN0dXJlRmlndXJlLCAiRXhwZWN0ZWQgb2JqZWN0IG9mIHR5cGUgU3RydWN0dXJlRmlndXJlIik7ICAgIAotICAgIHJvd0xheW91dC5zZXRDb2x1bW5EYXRhKCgoU3RydWN0dXJlRmlndXJlKXR5cGVGaWd1cmUpLmdldENvbHVtbkRhdGEoKSk7ICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkZlZWRiYWNrKCkKLSAgewotICAgIGJvb2xlYW4gaGlnaENvbnRyYXN0ID0gZmFsc2U7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaGlnaENvbnRyYXN0ID0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0SGlnaENvbnRyYXN0KCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGlmIChoaWdoQ29udHJhc3QpCi0gICAgewotICAgICAgcm93RmlndXJlLnNldEZvcmVncm91bmRDb2xvcihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpKTsKLSAgICAgIHJvd0ZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByb3dGaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKGNlbGxDb2xvcik7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25GZWVkYmFjaygpCi0gIHsKLSAgICBib29sZWFuIGhpZ2hDb250cmFzdCA9IGZhbHNlOwotICAgIHRyeQotICAgIHsKLSAgICAgIGhpZ2hDb250cmFzdCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEhpZ2hDb250cmFzdCgpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBpZiAoaGlnaENvbnRyYXN0KQotICAgIHsKLSAgICAgIHJvd0ZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EKSk7Ci0gICAgICByb3dGaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcm93RmlndXJlLnNldEJhY2tncm91bmRDb2xvcihnZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWZyZXNoVmlzdWFscyhPYmplY3QgbW9kZWwpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gIHsKLSAgICBzdXBlci5wYWludChncmFwaGljcyk7Ci0gICAgaWYgKGhhc0ZvY3VzKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBncmFwaGljcy5wdXNoU3RhdGUoKTsKLSAgICAgICAgUmVjdGFuZ2xlIHIgPSBnZXRCb3VuZHMoKTsKLSAgICAgICAgZ3JhcGhpY3Muc2V0WE9STW9kZSh0cnVlKTsKLSAgICAgICAgZ3JhcGhpY3MuZHJhd0ZvY3VzKHIueCwgci55ICsgMSwgci53aWR0aCAtIDEsIHIuaGVpZ2h0IC0gMik7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIGdyYXBoaWNzLnBvcFN0YXRlKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL0hlYWRpbmdGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvSGVhZGluZ0ZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzI3NWQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvSGVhZGluZ0ZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLXB1YmxpYyBjbGFzcyBIZWFkaW5nRmlndXJlIGV4dGVuZHMgRmlndXJlCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgaGVhZGVyQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgMjI0LCAyMzMsIDI0Nik7Ci0gIExhYmVsIGxhYmVsOwotICBDb2xvcltdIGdyYWRpZW50Q29sb3IgPSB7Q29sb3JDb25zdGFudHMud2hpdGUsICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yQ29uc3RhbnRzLmxpZ2h0Qmx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yQ29uc3RhbnRzLmdyYXl9OwotICBib29sZWFuIGlzU2VsZWN0ZWQgPSBmYWxzZTsKLSAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgSGVhZGluZ0ZpZ3VyZSgpCi0gIHsKLSAgICBsYWJlbCA9IG5ldyBMYWJlbCgpOwotICAgIGxhYmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDIpKTsKLSAgICBUb29sYmFyTGF5b3V0IHRvb2xiYXJMYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgdG9vbGJhckxheW91dC5zZXRNaW5vckFsaWdubWVudChUb29sYmFyTGF5b3V0LkFMSUdOX0NFTlRFUik7Ci0gICAgc2V0TGF5b3V0TWFuYWdlcih0b29sYmFyTGF5b3V0KTsKLSAgICBhZGQobGFiZWwpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRHcmFkaWVudENvbG9ycyhDb2xvcltdIGNvbG9ycykKLSAgewotICAgIHRoaXMuZ3JhZGllbnRDb2xvciA9IGNvbG9yczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBpc1NlbGVjdGVkKQotICB7Ci0gICAgdGhpcy5pc1NlbGVjdGVkID0gaXNTZWxlY3RlZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElzUmVhZE9ubHkoYm9vbGVhbiBpc1JlYWRPbmx5KQotICB7Ci0gICAgdGhpcy5pc1JlYWRPbmx5ID0gaXNSZWFkT25seTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gIHsKLSAgICBzdXBlci5wYWludChncmFwaGljcyk7Ci0gICAgCi0gICAgZ3JhcGhpY3MucHVzaFN0YXRlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gRmlsbCBmb3IgdGhlIGhlYWRlciBzZWN0aW9uCi0gICAgICAvLwotICAgICAgUmVjdGFuZ2xlIHIgPSBnZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0gICAgICBncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubGlnaHRHcmF5KTsKLSAgCi0gICAgICBDb2xvciBncmFkaWVudDEgPSBpc1JlYWRPbmx5ID8gZ3JhZGllbnRDb2xvclsxXSA6IGhlYWRlckNvbG9yOwotICAgICAgaWYgKGlzU2VsZWN0ZWQgJiYgaXNSZWFkT25seSkgZ3JhZGllbnQxID0gZ3JhZGllbnRDb2xvclszXTsKLSAgICAgIGVsc2UgaWYgKGlzU2VsZWN0ZWQgJiYgIWlzUmVhZE9ubHkpIGdyYWRpZW50MSA9IGdyYWRpZW50Q29sb3JbMl07Ci0gICAgICBDb2xvciBncmFkaWVudDIgPSBncmFkaWVudENvbG9yWzBdOwotICAgICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKGdyYWRpZW50MSk7Ci0gICAgICBncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoZ3JhZGllbnQyKTsKLSAgICAgIFJlY3RhbmdsZSBsYWJlbEJvdW5kcyA9IGxhYmVsLmdldEJvdW5kcygpOwotICAgICAgZ3JhcGhpY3MuZmlsbEdyYWRpZW50KHIueCsxLCByLnkrMSwgci53aWR0aC0yLCBsYWJlbEJvdW5kcy5oZWlnaHQgLSAyLCB0cnVlKTsgICAgCi0gICAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuZGFya0dyYXkpOwotICAgICAgbGFiZWwucGFpbnQoZ3JhcGhpY3MpOyAgICAKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGdyYXBoaWNzLnBvcFN0YXRlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIExhYmVsIGdldExhYmVsKCkKLSAgewotICAgIHJldHVybiBsYWJlbDsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL1JvdW5kZWRMaW5lQm9yZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL1JvdW5kZWRMaW5lQm9yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZTgwZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9Sb3VuZGVkTGluZUJvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5JbnNldHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi1wdWJsaWMgY2xhc3MgUm91bmRlZExpbmVCb3JkZXIgZXh0ZW5kcyBMaW5lQm9yZGVyCi17Ci0gIHByb3RlY3RlZCBpbnQgYXJjTGVuZ3RoOyAgIAotICBwcm90ZWN0ZWQgaW50IGxpbmVTdHlsZSA9IEdyYXBoaWNzLkxJTkVfU09MSUQ7Ci0KLSAgcHVibGljIFJvdW5kZWRMaW5lQm9yZGVyKENvbG9yIGMsIGludCB3aWR0aCwgaW50IGFyY0xlbmd0aCkKLSAgewotICAgIHN1cGVyKGMsIHdpZHRoKTsgICAgIAotICAgIHRoaXMuYXJjTGVuZ3RoID0gYXJjTGVuZ3RoOwotICB9Ci0KLSAgcHVibGljIFJvdW5kZWRMaW5lQm9yZGVyKGludCB3aWR0aCwgaW50IGFyY0xlbmd0aCkKLSAgewotICAgIHN1cGVyKHdpZHRoKTsgICAgIAotICAgIHRoaXMuYXJjTGVuZ3RoID0gYXJjTGVuZ3RoOwotICB9Ci0gIAotICBwdWJsaWMgUm91bmRlZExpbmVCb3JkZXIoQ29sb3IgYywgaW50IHdpZHRoLCBpbnQgYXJjTGVuZ3RoLCBpbnQgbGluZVN0eWxlKQotICB7Ci0gICAgc3VwZXIoYywgd2lkdGgpOwotICAgIHRoaXMuYXJjTGVuZ3RoID0gYXJjTGVuZ3RoOwotICAgIHRoaXMubGluZVN0eWxlID0gbGluZVN0eWxlOwotICB9Ci0KLSAgcHVibGljIFJvdW5kZWRMaW5lQm9yZGVyKGludCB3aWR0aCwgaW50IGFyY0xlbmd0aCwgaW50IGxpbmVTdHlsZSkKLSAgewotICAgIHN1cGVyKHdpZHRoKTsKLSAgICB0aGlzLmFyY0xlbmd0aCA9IGFyY0xlbmd0aDsKLSAgICB0aGlzLmxpbmVTdHlsZSA9IGxpbmVTdHlsZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBhaW50KElGaWd1cmUgZmlndXJlLCBHcmFwaGljcyBncmFwaGljcywgSW5zZXRzIGluc2V0cykKLSAgewotICAgIGludCBybGJXaWR0aCA9IGdldFdpZHRoKCk7Ci0gICAgdGVtcFJlY3Quc2V0Qm91bmRzKGdldFBhaW50UmVjdGFuZ2xlKGZpZ3VyZSwgaW5zZXRzKSk7Ci0gICAgaWYgKHJsYldpZHRoJTIgPT0gMSkKLSAgICB7Ci0gICAgICB0ZW1wUmVjdC53aWR0aC0tOwotICAgICAgdGVtcFJlY3QuaGVpZ2h0LS07Ci0gICAgfQotICAgIHRlbXBSZWN0LnNocmluayhybGJXaWR0aC8yLHJsYldpZHRoLzIpOwotICAgIGdyYXBoaWNzLnNldExpbmVXaWR0aChybGJXaWR0aCk7Ci0gICAgZ3JhcGhpY3Muc2V0TGluZVN0eWxlKGxpbmVTdHlsZSk7Ci0gICAgaWYgKGdldENvbG9yKCkgIT0gbnVsbCkKLSAgICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihnZXRDb2xvcigpKTsKLSAgICBncmFwaGljcy5kcmF3Um91bmRSZWN0YW5nbGUodGVtcFJlY3QsIGFyY0xlbmd0aCwgYXJjTGVuZ3RoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9TdHJ1Y3R1cmVGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvU3RydWN0dXJlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MGY2NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9TdHJ1Y3R1cmVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklTdHJ1Y3R1cmVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci0KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZUZpZ3VyZSBleHRlbmRzIEJveEZpZ3VyZSBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVGaWd1cmUKLXsKLSAgcHVibGljIHZvaWQgZWRpdFBhcnRBdHRhY2hlZChFZGl0UGFydCBvd25lcikKLSAgewotICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZSA6LSkKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkZlZWRiYWNrKCkKLSAgewotICAgIExpbmVCb3JkZXIgYm94RmlndXJlTGluZUJvcmRlciA9IChMaW5lQm9yZGVyKWdldEJvcmRlcigpOwotICAgIGJveEZpZ3VyZUxpbmVCb3JkZXIuc2V0V2lkdGgoMik7Ci0gICAgLy8gVE9ETyAoY3MpIG5lZWQgdG8gZml4IHRoaXMKLSAgICAvL2JveEZpZ3VyZUxpbmVCb3JkZXIuc2V0Q29sb3IoZ2V0Q29tcGxleFR5cGUoKS5pc1JlYWRPbmx5KCkgPyBDb2xvckNvbnN0YW50cy5kYXJrR3JheSA6IENvbG9yQ29uc3RhbnRzLmRhcmtCbHVlKTsgIAotICAgIGdldEhlYWRpbmdGaWd1cmUoKS5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICByZXBhaW50KCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25GZWVkYmFjaygpCi0gIHsKLSAgICBMaW5lQm9yZGVyIGJveEZpZ3VyZUxpbmVCb3JkZXIgPSAoTGluZUJvcmRlcilnZXRCb3JkZXIoKTsKLSAgICBib3hGaWd1cmVMaW5lQm9yZGVyLnNldFdpZHRoKDEpOwotICAgIGdldEhlYWRpbmdGaWd1cmUoKS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0gICAgcmVwYWludCgpOwotICB9ICAKLSAgCi0gIHB1YmxpYyBib29sZWFuIGhpdFRlc3RIZWFkZXIoUG9pbnQgbG9jYXRpb24pCi0gIHsKLSAgICBJRmlndXJlIHRhcmdldCA9IGdldEhlYWRpbmdGaWd1cmUoKTsKLSAgICBSZWN0YW5nbGUgYiA9IHRhcmdldC5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0gICAgdGFyZ2V0LnRyYW5zbGF0ZVRvQWJzb2x1dGUoYik7ICAKLSAgICByZXR1cm4gYi5jb250YWlucyhsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hWaXN1YWxzKE9iamVjdCBtb2RlbCkKLSAgewotICAgIElTdHJ1Y3R1cmUgc3RydWN0dXJlID0gKElTdHJ1Y3R1cmUpbW9kZWw7Ci0gICAgZ2V0TmFtZUxhYmVsKCkuc2V0VGV4dChzdHJ1Y3R1cmUuZ2V0TmFtZSgpKTsKLSAgICBnZXRIZWFkaW5nRmlndXJlKCkuc2V0SXNSZWFkT25seShzdHJ1Y3R1cmUuaXNSZWFkT25seSgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9UeXBlVml6RmlndXJlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9UeXBlVml6RmlndXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODI2MGZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvVHlwZVZpekZpZ3VyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JQ29tcGFydG1lbnRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSUZpZWxkRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklTdHJ1Y3R1cmVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5JRXh0ZW5kZWRGaWd1cmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuSU1vZGVsR3JvdXBGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5Nb2RlbEdyb3VwRmlndXJlOwotCi1wdWJsaWMgY2xhc3MgVHlwZVZpekZpZ3VyZUZhY3RvcnkgaW1wbGVtZW50cyBJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5Ci17ICAKLSAgcHVibGljIElTdHJ1Y3R1cmVGaWd1cmUgY3JlYXRlU3RydWN0dXJlRmlndXJlKE9iamVjdCBtb2RlbCkKLSAgewotICAgIFN0cnVjdHVyZUZpZ3VyZSBmaWd1cmUgPSBuZXcgU3RydWN0dXJlRmlndXJlKCk7Ci0gICAgZmlndXJlLnNldEJvcmRlcihuZXcgTGluZUJvcmRlcigxKSk7ICAgIAotICAgIFRvb2xiYXJMYXlvdXQgdG9vbGJhckxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KCk7Ci0gICAgdG9vbGJhckxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIGZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKHRvb2xiYXJMYXlvdXQpOwotCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSVRyZWVFbGVtZW50KQotICAgIHsKLSAgICAgIGZpZ3VyZS5nZXROYW1lTGFiZWwoKS5zZXRJY29uKCgoSVRyZWVFbGVtZW50KW1vZGVsKS5nZXRJbWFnZSgpKTsKLSAgICB9ICAgIAotICAgIC8vZmlndXJlLmdldEhlYWRpbmdGaWd1cmUoKS5zZXRJc1JlYWRPbmx5KGdldENvbXBsZXhUeXBlKCkuaXNSZWFkT25seSgpKTsKLSAgICAvLyB3ZSBzaG91bGQgb3JnYW5pemUgSVRyZWVFbGVtZW50IGFuZCBpbnRlZ3JhdGUgaXQgd2l0aCB0aGUgZmFjYWRlICAgIAotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLQotICBwdWJsaWMgSUZpZWxkRmlndXJlIGNyZWF0ZUZpZWxkRmlndXJlKE9iamVjdCBtb2RlbCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbmV3IEZpZWxkRmlndXJlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJQ29tcGFydG1lbnRGaWd1cmUgY3JlYXRlQ29tcGFydG1lbnRGaWd1cmUoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgQ29tcGFydG1lbnRGaWd1cmUgZmlndXJlID0gbmV3IENvbXBhcnRtZW50RmlndXJlKCk7Ci0gICAgZmlndXJlLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDEpKTsKLSAgICBUb29sYmFyTGF5b3V0IHRvb2xiYXJMYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgdG9vbGJhckxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIGZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKHRvb2xiYXJMYXlvdXQpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0gIAotICAKLSAgcHVibGljIElNb2RlbEdyb3VwRmlndXJlIGNyZWF0ZU1vZGVsR3JvdXBGaWd1cmUoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBuZXcgTW9kZWxHcm91cEZpZ3VyZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9sYXlvdXRzL0NvbHVtbkRhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2xheW91dHMvQ29sdW1uRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGU5ZGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2xheW91dHMvQ29sdW1uRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmxheW91dHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDb2x1bW5EYXRhCi17Ci0gIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgCi0gIGNsYXNzIEVudHJ5Ci0gIHsKLSAgICBpbnQgd2lkdGggPSAwOwotICAgIGludCB3ZWlnaHQgPSAxOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjbGVhckNvbHVtbldpZHRocygpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KWkubmV4dCgpOwotICAgICAgZW50cnkud2lkdGggPSAwOwotICAgIH0gIAotICB9ICAKLSAgCi0gIHByaXZhdGUgRW50cnkgbG9va3VwT3JDcmVhdGVDb2x1bW5FbnRyeShTdHJpbmcgaWRlbnRpZmllcikKLSAgewotICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KW1hcC5nZXQoaWRlbnRpZmllcik7Ci0gICAgaWYgKGVudHJ5ID09IG51bGwpCi0gICAgewotICAgICAgZW50cnkgPSBuZXcgRW50cnkoKTsKLSAgICAgIG1hcC5wdXQoaWRlbnRpZmllciwgZW50cnkpOwotICAgIH0gIAotICAgcmV0dXJuIGVudHJ5OyAKLSAgfSAgCi0gIAotICB2b2lkIHN0cmV0Y2hDb2x1bW5XaWR0aElmTmVlZGVkKFN0cmluZyBpZGVudGlmaWVyLCBpbnQgd2lkdGgpCi0gIHsKLSAgICBFbnRyeSBlbnRyeSA9IGxvb2t1cE9yQ3JlYXRlQ29sdW1uRW50cnkoaWRlbnRpZmllcik7Ci0gICAgZW50cnkud2lkdGggPSBNYXRoLm1heChlbnRyeS53aWR0aCwgd2lkdGgpOwotICB9Ci0gIAotICBpbnQgZ2V0Q29sdW1uV2lkdGgoU3RyaW5nIGlkZW50aWZpZXIpCi0gIHsKLSAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSltYXAuZ2V0KGlkZW50aWZpZXIpOwotICAgIGlmIChlbnRyeSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBlbnRyeS53aWR0aDsKLSAgICB9ICAKLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIDA7Ly9obW0gc2hvdWxkIHdlIHJldHVybiAtMSA/Ci0gICAgfSAgCi0gIH0KLSAgCi0gIGludCBnZXRDb2x1bW5XZWlnaHQoU3RyaW5nIGlkZW50aWZpZXIpCi0gIHsKLSAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSltYXAuZ2V0KGlkZW50aWZpZXIpOwotICAgIGlmIChlbnRyeSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBlbnRyeS53ZWlnaHQ7Ci0gICAgfSAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0gIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5XZWlnaHQoU3RyaW5nIGlkZW50aWZpZXIsIGludCB3ZWlnaHQpCi0gIHsKLSAgICBFbnRyeSBlbnRyeSA9IGxvb2t1cE9yQ3JlYXRlQ29sdW1uRW50cnkoaWRlbnRpZmllcik7Ci0gICAgZW50cnkud2VpZ2h0ID0gd2VpZ2h0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vbGF5b3V0cy9Sb3dMYXlvdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2xheW91dHMvUm93TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOTA2NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vbGF5b3V0cy9Sb3dMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24ubGF5b3V0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLXB1YmxpYyBjbGFzcyBSb3dMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdExheW91dAotewotICAvLyBsYXlvdXQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFyZW50IGNvbnRleHQKLSAgLy8gYW55IGxheW91dCBtYW5hZ2VyIHVuZGVyIHRoZSBwYXJlbnQgY29udGV4dCBpcyBjb25uZWN0ZWQKLSAgLy8gY29sdW1uIHJvd3MgYXJlIG1haW50YWluZWQgYWNjcm9zcyBjb250YWluZXIgYm91bmRhcmllcyAgCi0gIHByb3RlY3RlZCBDb2x1bW5EYXRhIGNvbHVtbkRhdGE7Ci0gIHByb3RlY3RlZCBIYXNoTWFwIGZpZ3VyZVRvQ29udHN0cmFpbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAKLSAgcHVibGljIFJvd0xheW91dCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotCi0gIC8vIHRoaXMgbWV0aG9kIGNvbXB1dGVzIHRoZSBtaW5pbXVtIHNpemUgcmVxdWlyZWQgdG8gZGlzcGxheSB0aGUgZmlndXJlcwotICAvLwotICBwcml2YXRlIERpbWVuc2lvbiBjYWxjdWxhdGVDaGlsZHJlblNpemUoSUZpZ3VyZSBjb250YWluZXIsIExpc3QgY2hpbGRyZW4sIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIHByZWZlcnJlZCkKLSAgewotICAgIERpbWVuc2lvbiBjaGlsZFNpemU7Ci0gICAgSUZpZ3VyZSBjaGlsZDsKLSAgICBpbnQgaGVpZ2h0ID0gMDsKLSAgICBpbnQgd2lkdGggPSAwOwotICAgIAotICAgIC8vSVJvd0ZpZ3VyZSBmaWd1cmUgPSAoSVJvd0ZpZ3VyZSljb250YWluZXI7Ci0gICAgCi0gICAgLy8gZm9yIGVhY2ggY2VsbCBpbiB0aGUgcm93Ci0gICAgLy8KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIGNoaWxkID0gKElGaWd1cmUpIGNoaWxkcmVuLmdldChpKTsKLSAgICAgIFN0cmluZyBjb2x1bW5JZGVuaWZpZXIgPSAoU3RyaW5nKWdldENvbnN0cmFpbnQoY2hpbGQpOwotICAgICAgICAgICAgIAotICAgICAgLy8gZmlyc3Qgd2UgY29tcHV0ZSB0aGUgY2hpbGQgc2l6ZSB3aXRob3V0IHJlZ2FyZCBmb3IgY29sdW1uRGF0YQotICAgICAgLy8KLSAgICAgIGNoaWxkU2l6ZSA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUod0hpbnQsIGhIaW50KTsvLyA6IGNoaWxkLmdldE1pbmltdW1TaXplKHdIaW50LCBoSGludCk7Ci0gICAgICAgIAotICAgICAgLy8gbm93IHRoYXQgdGhlIGNvbHVtbkRhdGEgaGFzIGJlZW4gcG9wdWxhdGVkIHdlIGNhbiBjb25zaWRlciBpZiB0aGUgcm93IG5lZWRzIHRvIGJlIGxhcmdlcgotICAgICAgLy8KLSAgICAgIGludCBlZmZlY3RpdmVXaWR0aCA9IGNoaWxkU2l6ZS53aWR0aDsKLSAgICAgIGlmIChjb2x1bW5JZGVuaWZpZXIgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBjb2x1bW5EYXRhLnN0cmV0Y2hDb2x1bW5XaWR0aElmTmVlZGVkKGNvbHVtbklkZW5pZmllciwgY2hpbGRTaXplLndpZHRoKTsKLSAgICAgICAgZWZmZWN0aXZlV2lkdGggPSBjb2x1bW5EYXRhLmdldENvbHVtbldpZHRoKGNvbHVtbklkZW5pZmllcik7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGhlaWdodCA9IE1hdGgubWF4KGNoaWxkU2l6ZS5oZWlnaHQsIGhlaWdodCk7Ci0gICAgICB3aWR0aCArPSBlZmZlY3RpdmVXaWR0aDsKLSAgICB9ICAKLSAgICByZXR1cm4gbmV3IERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KTsKLSAgfQotICAKLSAgCi0gIAotICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBjb250YWluZXIsIGludCB3SGludCwgaW50IGhIaW50KQotICB7ICAgIAotICAgIExpc3QgY2hpbGRyZW4gPSBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKTsKLSAgICBEaW1lbnNpb24gcHJlZlNpemUgPSBjYWxjdWxhdGVDaGlsZHJlblNpemUoY29udGFpbmVyLCBjaGlsZHJlbiwgd0hpbnQsIGhIaW50LCB0cnVlKTsKLSAgICByZXR1cm4gcHJlZlNpemU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBsYXlvdXQoSUZpZ3VyZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBsYXlvdXQgYSB0YWJsZSB3aXRoIHRoZSBjb2x1bW5zIGFsaWduZWQgICAgICAKLSAgICAvL0lSb3dGaWd1cmUgcm93RmlndXJlID0gKElSb3dGaWd1cmUpcGFyZW50OyAgICAKLSAgICBSZWN0YW5nbGUgY2xpZW50QXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7ICAgCi0gICAgTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOwotICAgIFJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZSgpOwotICAgIHIueCA9IGNsaWVudEFyZWEueDsKLSAgICByLnkgPSBjbGllbnRBcmVhLnk7Ci0gICAgci5oZWlnaHQgPSBjbGllbnRBcmVhLmhlaWdodDsKLSAgICAKLSAgICBpbnQgY2hpbGRyZW5TaXplID0gY2hpbGRyZW4uc2l6ZSgpOwotICAgIFJlY3RhbmdsZVtdIGJvdW5kcyA9IG5ldyBSZWN0YW5nbGVbY2hpbGRyZW5TaXplXTsKLSAgICAKLSAgICAvLyBmb3IgZWFjaCBjZWxsIGluIHRoZSByb3cKLSAgICAvLwotICAgIGludCByZXF1aXJlZFdpZHRoID0gMDsKLSAgICBpbnQgdG90YWxDb2x1bW5XZWlnaHQgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW5TaXplOyBpKyspCi0gICAgewotICAgICAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKSBjaGlsZHJlbi5nZXQoaSk7Ci0gICAgICAvL1N0cmluZyBjb2x1bW5JZGVuaWZpZXIgPSBmaWd1cmUuZ2V0Q29sdW1uSWRlbnRpZmllcihjaGlsZCk7ICAgICAgICAgICAgIAotICAgICAgLy8gZmlyc3Qgd2UgY29tcHV0ZSB0aGUgY2hpbGQgc2l6ZSB3aXRob3V0IHJlZ2FyZCBmb3IgY29sdW1uRGF0YQotICAgICAgLy8KLSAgICAgIERpbWVuc2lvbiBjaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKC0xLCAtMSk7Ci0gICAgICAKLSAgICAgIGludCBjb2x1bW5XaWR0aCA9IC0xOwotICAgICAgLy9TdHJpbmcgY29sdW1uSWRlbnRpZmllciA9IHJvd0ZpZ3VyZS5nZXRDb2x1bW5JZGVudGlmaWVyKGNoaWxkKTsKLSAgICAgIFN0cmluZyBjb2x1bW5JZGVudGlmaWVyID0gKFN0cmluZylnZXRDb25zdHJhaW50KGNoaWxkKTsKLSAgICAgIGlmIChjb2x1bW5JZGVudGlmaWVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vY29sdW1uRGF0YS5zdHJldGNoQ29sdW1uV2lkdGhJZk5lZWRlZChjb2x1bW5JZGVudGlmaWVyLCBjaGlsZFNpemUud2lkdGgpOyAgICAgICAgCi0gICAgICAgIGNvbHVtbldpZHRoID0gY29sdW1uRGF0YS5nZXRDb2x1bW5XaWR0aChjb2x1bW5JZGVudGlmaWVyKTsKLSAgICAgICAgdG90YWxDb2x1bW5XZWlnaHQgKz0gY29sdW1uRGF0YS5nZXRDb2x1bW5XZWlnaHQoY29sdW1uSWRlbnRpZmllcik7Ci0gICAgICB9ICAKLSAgICAgIHIud2lkdGggPSBNYXRoLm1heChjaGlsZFNpemUud2lkdGgsIGNvbHVtbldpZHRoKTsKLSAgICAgIHJlcXVpcmVkV2lkdGggKz0gci53aWR0aDsKLSAgICAgIGJvdW5kc1tpXSA9IG5ldyBSZWN0YW5nbGUocik7ICAgICAgCi0gICAgICByLnggKz0gci53aWR0aDsKLSAgICB9ICAgICAgICAgIAotICAgIGlmICh0b3RhbENvbHVtbldlaWdodCA8IDEpCi0gICAgewotICAgICAgdG90YWxDb2x1bW5XZWlnaHQgPSAxOwotICAgIH0KLSAgICBpbnQgZXh0cmFXaWR0aCA9IE1hdGgubWF4KGNsaWVudEFyZWEud2lkdGggLSByZXF1aXJlZFdpZHRoLCAwKTsgICAgCi0gICAgaW50IGV4dHJhV2lkdGhBbGxvY2F0ZWQgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW5TaXplOyBpKyspCi0gICAgewotICAgICAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKSBjaGlsZHJlbi5nZXQoaSk7ICAgICAgCi0gICAgICBSZWN0YW5nbGUgYiA9IGJvdW5kc1tpXTsgICAgCi0gICAgICBpZiAoZXh0cmFXaWR0aCA+IDApCi0gICAgICB7ICAKLSAgICAgICAgU3RyaW5nIGNvbHVtbklkZW50aWZpZXIgPSAoU3RyaW5nKWdldENvbnN0cmFpbnQoY2hpbGQpOwotICAgICAgICBpZiAoY29sdW1uSWRlbnRpZmllciAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAKLSAgICAgICAgICBpbnQgd2VpZ2h0ID0gY29sdW1uRGF0YS5nZXRDb2x1bW5XZWlnaHQoY29sdW1uSWRlbnRpZmllcik7Ci0gICAgICAgICAgZmxvYXQgZnJhY3Rpb24gPSAoZmxvYXQpd2VpZ2h0IC8gKGZsb2F0KXRvdGFsQ29sdW1uV2VpZ2h0OwotICAgICAgICAgIGludCBleHRyYVdpZHRoRm9yQ2hpbGQgPSAoaW50KShleHRyYVdpZHRoICogZnJhY3Rpb24pOwotICAgICAgIAotICAgICAgICAgIGIud2lkdGggKz0gZXh0cmFXaWR0aEZvckNoaWxkOyAgICAgICAgCi0gICAgICAgICAgYi54ICs9IGV4dHJhV2lkdGhBbGxvY2F0ZWQ7Ci0gICAgICAgICAgZXh0cmFXaWR0aEFsbG9jYXRlZCArPSBleHRyYVdpZHRoRm9yQ2hpbGQ7Ci0gICAgICAgIH0gIAotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBiLnggKz0gZXh0cmFXaWR0aEFsbG9jYXRlZDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2hpbGQuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoYikpOyAgCi0gICAgfSAgCi0gIH0KLQotICBwdWJsaWMgQ29sdW1uRGF0YSBnZXRDb2x1bW5EYXRhKCkKLSAgewotICAgIHJldHVybiBjb2x1bW5EYXRhOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q29sdW1uRGF0YShDb2x1bW5EYXRhIGNvbHVtbkRhdGEpCi0gIHsKLSAgICB0aGlzLmNvbHVtbkRhdGEgPSBjb2x1bW5EYXRhOwotICB9ICAgIAotICAKLSAgcHVibGljIE9iamVjdCBnZXRDb25zdHJhaW50KElGaWd1cmUgY2hpbGQpCi0gIHsKLSAgICByZXR1cm4gZmlndXJlVG9Db250c3RyYWludE1hcC5nZXQoY2hpbGQpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50KElGaWd1cmUgY2hpbGQsIE9iamVjdCBjb25zdHJhaW50KQotICB7Ci0gICAgZmlndXJlVG9Db250c3RyYWludE1hcC5wdXQoY2hpbGQsIGNvbnN0cmFpbnQpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkKLSAgewotICAgIC8vZmlndXJlVG9Db250c3RyYWludE1hcC5jbGVhcigpOwotICAgIC8vdGhpcy5jb2x1bW5EYXRhLmNsZWFyQ29sdW1uV2lkdGhzKCk7Ci0gICAgc3VwZXIuaW52YWxpZGF0ZSgpOwotICAgCi0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9DcmVhdGVFbGVtZW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0NyZWF0ZUVsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmM2I3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0NyZWF0ZUVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5BYnN0cmFjdEVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vLyBpc3N1ZSAoY3MpIGNhbiB3ZSByZW1vdmUgdGhpcz8KLS8vCi1wdWJsaWMgY2xhc3MgQ3JlYXRlRWxlbWVudEFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOwotICBwcm90ZWN0ZWQgRWxlbWVudCBwYXJlbnROb2RlOwotCi0gIHByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWEgeHNkU2NoZW1hOwotCi0gIHByb3RlY3RlZCBPYmplY3Qgc291cmNlQ29udGV4dDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIENyZWF0ZUVsZW1lbnRBY3Rpb24uCi0gICAqLwotICBwdWJsaWMgQ3JlYXRlRWxlbWVudEFjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQ3JlYXRlRWxlbWVudEFjdGlvbi4KLSAgICogQHBhcmFtIHRleHQKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVFbGVtZW50QWN0aW9uKFN0cmluZyB0ZXh0KQotICB7Ci0gICAgc3VwZXIodGV4dCk7Ci0gIH0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBDcmVhdGVFbGVtZW50QWN0aW9uLgotICAgKiBAcGFyYW0gdGV4dAotICAgKiBAcGFyYW0gaW1hZ2UKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVFbGVtZW50QWN0aW9uKFN0cmluZyB0ZXh0LCBJbWFnZURlc2NyaXB0b3IgaW1hZ2UpCi0gIHsKLSAgICBzdXBlcih0ZXh0LCBpbWFnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRYU0RTY2hlbWEoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Qcm92aWRlcihJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLnNlbGVjdGlvblByb3ZpZGVyID0gc2VsZWN0aW9uUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VDb250ZXh0KE9iamVjdCBzb3VyY2VDb250ZXh0KQotICB7Ci0gICAgdGhpcy5zb3VyY2VDb250ZXh0ID0gc291cmNlQ29udGV4dDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldHMgdGhlIHBhcmVudE5vZGUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBFbGVtZW50IGdldFBhcmVudE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIHBhcmVudE5vZGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcGFyZW50Tm9kZS4KLSAgICogQHBhcmFtIHBhcmVudE5vZGUgVGhlIHBhcmVudE5vZGUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJlbnROb2RlKEVsZW1lbnQgcGFyZW50Tm9kZSkKLSAgewotICAgIHRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7Ci0gIH0KLQotICBib29sZWFuIGlzR2xvYmFsID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJc0dsb2JhbChib29sZWFuIGlzR2xvYmFsKQotICB7Ci0gICAgdGhpcy5pc0dsb2JhbCA9IGlzR2xvYmFsOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRJc0dsb2JhbCgpCi0gIHsKLSAgICByZXR1cm4gaXNHbG9iYWw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTm9kZSByZWxhdGl2ZU5vZGU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZWxlbWVudFRhZzsKLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudFRhZyhTdHJpbmcgZWxlbWVudFRhZykKLSAgewotICAgIHRoaXMuZWxlbWVudFRhZyA9IGVsZW1lbnRUYWc7Ci0gIH0KLSAgCi0gIHB1YmxpYyBEb2N1bWVudEltcGwgZ2V0RG9jdW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIChEb2N1bWVudEltcGwpIGdldFBhcmVudE5vZGUoKS5nZXRPd25lckRvY3VtZW50KCk7Ci0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgZ2V0RG9jdW1lbnQoKS5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIGRlc2NyaXB0aW9uKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKCkKLSAgewotICAgIERvY3VtZW50SW1wbCBkb2MgPSBnZXREb2N1bWVudCgpOwotICAgIAotICAgIGRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUFuZEFkZE5ld0NoaWxkRWxlbWVudCgpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gcGFyZW50Tm9kZS5nZXRQcmVmaXgoKTsKLSAgICBwcmVmaXggPSAocHJlZml4ID09IG51bGwpID8gIiIgOiAocHJlZml4ICsgIjoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgRWxlbWVudCBjaGlsZE5vZGUgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnROUyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsIHByZWZpeCArIGVsZW1lbnRUYWcpOwotICAgIGlmIChnZXRBdHRyaWJ1dGVzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IGF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIERPTUF0dHJpYnV0ZSBhdHRyID0gKERPTUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0gICAgICAgIGNoaWxkTm9kZS5zZXRBdHRyaWJ1dGUoYXR0ci5nZXROYW1lKCksIGF0dHIuZ2V0VmFsdWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChnZXRSZWxhdGl2ZU5vZGUoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoY2hpbGROb2RlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkTm9kZSxnZXRSZWxhdGl2ZU5vZGUoKSk7Ci0gICAgfQotICAgIAotICAgIGlmIChpc0dsb2JhbCAmJiBnZXRSZWxhdGl2ZU5vZGUoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIFRleHQgdGV4dE5vZGUgPSBnZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCJcblxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOwotICAgIH0KLSAgICBlbHNlIGlmIChpc0dsb2JhbCAmJiBnZXRSZWxhdGl2ZU5vZGUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFRleHQgdGV4dE5vZGUgPSBnZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCJcblxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRleHROb2RlLCBnZXRSZWxhdGl2ZU5vZGUoKSk7Ci0gICAgfQotCi0gICAgZm9ybWF0Q2hpbGQoY2hpbGROb2RlKTsKLSAgICAKLSAgICByZXR1cm4gY2hpbGROb2RlOwotICB9ICAgIAotICAgIAotICBwcm90ZWN0ZWQgdm9pZCBmb3JtYXRDaGlsZChFbGVtZW50IGNoaWxkKQotICB7Ci0gICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgSURPTU1vZGVsIG1vZGVsID0gKChJRE9NTm9kZSljaGlsZCkuZ2V0TW9kZWwoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICBtb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLSAgICAgICAgCi0JICAgICAgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotCQkgICAgZm9ybWF0UHJvY2Vzc29yLmZvcm1hdE5vZGUoY2hpbGQpOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZyBtb2RlbCBjaGFuZ2UKLSAgICAgICAgbW9kZWwuY2hhbmdlZE1vZGVsKCk7IAotICAgICAgfQotICAgIH0KLSAgfQotICAvKgotICAgKiBAc2VlIElBY3Rpb24jcnVuKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBiZWdpblJlY29yZGluZyhnZXREZXNjcmlwdGlvbigpKTsKLSAgICBmaW5hbCBFbGVtZW50IGNoaWxkID0gY3JlYXRlQW5kQWRkTmV3Q2hpbGRFbGVtZW50KCk7Ci0gICAgZW5kUmVjb3JkaW5nKCk7Ci0KLSAgICBpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmaW5hbCBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoY2hpbGQpOwotLy8gICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29tcCkpOwotICAgICAgCi0gICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiljb21wKS5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbXAuZ2V0Q29udGFpbmVyKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNvbXAuZ2V0Q29udGFpbmVyKCkuZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoY2hpbGQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIHRydWUpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbXAuZ2V0Q29udGFpbmVyKCkpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29tcCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb21wKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29tcCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29tcCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoc291cmNlQ29udGV4dCBpbnN0YW5jZW9mIEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIpCi0gICAgICAgICAgewotLy8gICAgICAgICAgICBBYnN0cmFjdEVkaXRQYXJ0Vmlld2VyIHZpZXdlciA9IChBYnN0cmFjdEVkaXRQYXJ0Vmlld2VyKXNvdXJjZUNvbnRleHQ7Ci0gICAgICAgICAgCi0vLyAgICAgICAgICAgIE9iamVjdCBvYmogPSB2aWV3ZXIuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5nZXQoMCk7Ci0gICAgICAgICAgICAKLS8vICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEVsZW1lbnREZWNsYXJhdGlvbkVkaXRQYXJ0KQotLy8gICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtID0gKChFbGVtZW50RGVjbGFyYXRpb25FZGl0UGFydClvYmopLmdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpOwotLy8gICAgICAgICAgICAgICAgaWYgKCFlbGVtLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0vLyAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICgoRWxlbWVudERlY2xhcmF0aW9uRWRpdFBhcnQpb2JqKS5kb0VkaXROYW1lKCk7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1vZGVsR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZ3JvdXAgPSAoKE1vZGVsR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpb2JqKS5nZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotLy8gICAgICAgICAgICAgICAgaWYgKCFncm91cC5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0vLyAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICgoTW9kZWxHcm91cERlZmluaXRpb25FZGl0UGFydClvYmopLmRvRWRpdE5hbWUoKTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQ29tcGxleFR5cGVEZWZpbml0aW9uRWRpdFBhcnQpCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ID0gKChDb21wbGV4VHlwZURlZmluaXRpb25FZGl0UGFydClvYmopLmdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotLy8gICAgICAgICAgICAgICAgaWYgKGN0LmdldE5hbWUoKSAhPSBudWxsKQotLy8gICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAoKENvbXBsZXhUeXBlRGVmaW5pdGlvbkVkaXRQYXJ0KW9iaikuZG9FZGl0TmFtZSgpOwotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0KQotLy8gICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICgoVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydClvYmopLmRvRWRpdE5hbWUoKTsKLS8vICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0KLQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgRGlzcGxheS5nZXREZWZhdWx0KCkudGltZXJFeGVjKDUwLHJ1bm5hYmxlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgcmVsYXRpdmVOb2RlLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBFbGVtZW50Ci0gICAqLwotICBwdWJsaWMgTm9kZSBnZXRSZWxhdGl2ZU5vZGUoKQotICB7Ci0gICAgcmV0dXJuIHJlbGF0aXZlTm9kZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByZWxhdGl2ZU5vZGUuCi0gICAqIEBwYXJhbSByZWxhdGl2ZU5vZGUgVGhlIHJlbGF0aXZlTm9kZSB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlbGF0aXZlTm9kZShOb2RlIHJlbGF0aXZlTm9kZSkKLSAgewotICAgIHRoaXMucmVsYXRpdmVOb2RlID0gcmVsYXRpdmVOb2RlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGRlc2NyaXB0aW9uLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICB7Ci0gICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGdldFRleHQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIHRvIHNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgYXR0cmlidXRlczsKLSAgLyoqCi0gICAqIEdldHMgdGhlIG5hbWVBdHRyaWJ1dGUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0QXR0cmlidXRlcygpCi0gIHsKLSAgICByZXR1cm4gYXR0cmlidXRlczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGVzLgotICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgYXR0cmlidXRlcyB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoTGlzdCBhdHRyaWJ1dGVzKQotICB7Ci0gICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9ET01BdHRyaWJ1dGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvRE9NQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNGYzNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9ET01BdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi0vLyBpc3N1ZSAoY3MpIHJlbW92ZSB0aGlzCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIERPTUF0dHJpYnV0ZQotewotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIERPTUF0dHJpYnV0ZS4KLSAgICovCi0gIHB1YmxpYyBET01BdHRyaWJ1dGUoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBET01BdHRyaWJ1dGUuCi0gICAqLwotICBwdWJsaWMgRE9NQXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUsIHZhbHVlOwotICAvKioKLSAgICogR2V0cyB0aGUgdmFsdWUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmFtZS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbmFtZS4KLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0lYU0RUb29sYmFyQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0lYU0RUb29sYmFyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMTk5ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9JWFNEVG9vbGJhckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElYU0RUb29sYmFyQWN0aW9uIGV4dGVuZHMgSUFjdGlvbgotewotICBwdWJsaWMgdm9pZCBzZXRFZGl0b3JQYXJ0KElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9Nb3ZlWFNEQXR0cmlidXRlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL01vdmVYU0RBdHRyaWJ1dGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY5YTJmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL01vdmVYU0RBdHRyaWJ1dGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBNb3ZlWFNEQXR0cmlidXRlQWN0aW9uIGV4dGVuZHMgTW92ZVhTREJhc2VBY3Rpb24KLXsKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IElOU0VSVF9CRUZPUkUgPSAwOwotICBwcml2YXRlIHN0YXRpYyBpbnQgSU5TRVJUX0FGVEVSID0gMTsKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IElOU0VSVF9ESVJFQ1QgPSAyOwotICBwcm90ZWN0ZWQgTGlzdCBzZWxlY3RlZE5vZGVzOwotICBwcm90ZWN0ZWQgTm9kZSBwYXJlbnROb2RlOwotICBwcm90ZWN0ZWQgTm9kZSBwcmV2aW91c1JlZkNoaWxkLCBuZXh0UmVmQ2hpbGQ7Ci0gIGludCBpbnNlcnRUeXBlOwotCi0gIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudENvbXBvbmVudDsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgc2VsZWN0ZWQsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50OwotICBib29sZWFuIGluc2VydEF0RW5kID0gdHJ1ZTsKLSAgCi0gIHB1YmxpYyBNb3ZlWFNEQXR0cmlidXRlQWN0aW9uKFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudENvbXBvbmVudCwgWFNEQ29uY3JldGVDb21wb25lbnQgc2VsZWN0ZWQsIFhTRENvbmNyZXRlQ29tcG9uZW50IHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQsIFhTRENvbmNyZXRlQ29tcG9uZW50IG5leHRSZWZDaGlsZENvbXBvbmVudCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5wYXJlbnRDb21wb25lbnQgPSBwYXJlbnRDb21wb25lbnQ7Ci0gICAgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkOwotICAgIHRoaXMucHJldmlvdXNSZWZDb21wb25lbnQgPSBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50OwotICAgIHRoaXMubmV4dFJlZkNvbXBvbmVudCA9IG5leHRSZWZDaGlsZENvbXBvbmVudDsKLQotICAgIGlmIChwYXJlbnRDb21wb25lbnQgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBwYXJlbnROb2RlID0gcGFyZW50Q29tcG9uZW50LmdldEVsZW1lbnQoKTsKLSAgICBuZXh0UmVmQ2hpbGQgPSBuZXh0UmVmQ2hpbGRDb21wb25lbnQgIT0gbnVsbCA/IG5leHRSZWZDaGlsZENvbXBvbmVudC5nZXRFbGVtZW50KCkgOiBudWxsOwotICAgIHByZXZpb3VzUmVmQ2hpbGQgPSBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50ICE9IG51bGwgPyBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50LmdldEVsZW1lbnQoKSA6IG51bGw7Ci0KLSAgICBpZiAobmV4dFJlZkNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChuZXh0UmVmQ29tcG9uZW50LmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpID09IHBhcmVudENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgaW5zZXJ0VHlwZSA9IElOU0VSVF9CRUZPUkU7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChwcmV2aW91c1JlZkNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChwcmV2aW91c1JlZkNvbXBvbmVudC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKSA9PSBwYXJlbnRDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIGluc2VydFR5cGUgPSBJTlNFUlRfQUZURVI7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChuZXh0UmVmQ2hpbGRDb21wb25lbnQgPT0gbnVsbCAmJiBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50ID09IG51bGwpCi0gICAgewotICAgICAgaW5zZXJ0VHlwZSA9IElOU0VSVF9ESVJFQ1Q7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgTW92ZVhTREF0dHJpYnV0ZUFjdGlvbihYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnRDb21wb25lbnQsIFhTRENvbmNyZXRlQ29tcG9uZW50IHNlbGVjdGVkLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50LCBYU0RDb25jcmV0ZUNvbXBvbmVudCBuZXh0UmVmQ2hpbGRDb21wb25lbnQsIGJvb2xlYW4gaW5zZXJ0QXRFbmQpCi0gIHsKLSAgICB0aGlzKHBhcmVudENvbXBvbmVudCwgc2VsZWN0ZWQsIHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQsIG5leHRSZWZDaGlsZENvbXBvbmVudCk7Ci0gICAgdGhpcy5pbnNlcnRBdEVuZCA9IGluc2VydEF0RW5kOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBjYW5Nb3ZlKCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgIAotICAgIGlmIChuZXh0UmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uIHx8IHByZXZpb3VzUmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uIHx8IHBhcmVudENvbXBvbmVudCA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgSUFjdGlvbiNydW4oKQotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGlmIChwYXJlbnRDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgbW92ZVVuZGVyWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHBhcmVudENvbXBvbmVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcmVudENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBtb3ZlVW5kZXJYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgcGFyZW50Q29tcG9uZW50KTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBtb3ZlVW5kZXJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIHBhcmVudEdyb3VwKQotICB7Ci0gICAgaW50IG9yaWdpbmFsSW5kZXggPSAwOwotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwYXJlbnRHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJpYnV0ZUdyb3VwQ29udGVudCA9IChYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGlmIChhdHRyaWJ1dGVHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSA9ICgoWFNEQXR0cmlidXRlVXNlKSBhdHRyaWJ1dGVHcm91cENvbnRlbnQpLmdldENvbnRlbnQoKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBzZWxlY3RlZCkKLSAgICAgICAgewotICAgICAgICAgIHBhcmVudEdyb3VwLmdldENvbnRlbnRzKCkucmVtb3ZlKGF0dHJpYnV0ZS5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG9yaWdpbmFsSW5kZXgrKzsKLSAgICB9Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBib29sZWFuIGFkZGVkQmFjayA9IGZhbHNlOwotICAgIGlmIChpbnNlcnRUeXBlID09IElOU0VSVF9ESVJFQ1QpCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29udGFpbmVyID0gc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChpbnNlcnRBdEVuZCkKLSAgICAgICAgICAoKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgcGFyZW50Q29tcG9uZW50KS5nZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpLmdldENvbnRlbnRzKCkuYWRkKGNvbnRhaW5lcik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAoKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgcGFyZW50Q29tcG9uZW50KS5nZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpLmdldENvbnRlbnRzKCkuYWRkKDAsIGNvbnRhaW5lcik7Ci0gICAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTGlzdCBhdHRyaWJ1dGVHcm91cENvbnRlbnRzID0gcGFyZW50R3JvdXAuZ2V0Q29udGVudHMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXR0cmlidXRlR3JvdXBDb250ZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCBhdHRyaWJ1dGVHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBpZiAoYXR0cmlidXRlR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGUgPSAoKFhTREF0dHJpYnV0ZVVzZSkgYXR0cmlidXRlR3JvdXBDb250ZW50KS5nZXRDb250ZW50KCk7Ci0gICAgICAgIGlmIChpbnNlcnRUeXBlID09IElOU0VSVF9CRUZPUkUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYXR0cmlidXRlID09IG5leHRSZWZDb21wb25lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFyZW50R3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoaW5kZXgsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHNlbGVjdGVkID09IG5leHRSZWZDb21wb25lbnQgJiYgb3JpZ2luYWxJbmRleCA9PSBpbmRleCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXJlbnRHcm91cC5nZXRDb250ZW50cygpLmFkZChpbmRleCwgc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpbnNlcnRUeXBlID09IElOU0VSVF9BRlRFUikKLSAgICAgICAgewotICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT0gcHJldmlvdXNSZWZDb21wb25lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFyZW50R3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoaW5kZXggKyAxLCBzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChzZWxlY3RlZCA9PSBwcmV2aW91c1JlZkNvbXBvbmVudCAmJiBvcmlnaW5hbEluZGV4ID09IGluZGV4KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBhcmVudEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGluZGV4LCBzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRleCsrOwotICAgIH0KLSAgICBpZiAoYXR0cmlidXRlR3JvdXBDb250ZW50cy5zaXplKCkgPT0gMCkKLSAgICB7Ci0gICAgICBwYXJlbnRHcm91cC5nZXRDb250ZW50cygpLmFkZChzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgIH0KLQotICAgIGlmICghYWRkZWRCYWNrKQotICAgIHsKLSAgICAgIHBhcmVudEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKG9yaWdpbmFsSW5kZXgsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBtb3ZlVW5kZXJYU0RDb21wbGV4VHlwZURlZmluaXRpb24oWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlKQotICB7Ci0gICAgaW50IG9yaWdpbmFsSW5kZXggPSAwOwotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb21wbGV4VHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJpYnV0ZUdyb3VwQ29udGVudCA9IChYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGlmIChhdHRyaWJ1dGVHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSA9ICgoWFNEQXR0cmlidXRlVXNlKSBhdHRyaWJ1dGVHcm91cENvbnRlbnQpLmdldENvbnRlbnQoKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBzZWxlY3RlZCkKLSAgICAgICAgewotICAgICAgICAgIGNvbXBsZXhUeXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkucmVtb3ZlKGF0dHJpYnV0ZS5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG9yaWdpbmFsSW5kZXgrKzsKLSAgICB9Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBib29sZWFuIGFkZGVkQmFjayA9IGZhbHNlOwotICAgIExpc3QgYXR0cmlidXRlR3JvdXBDb250ZW50cyA9IGNvbXBsZXhUeXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGF0dHJpYnV0ZUdyb3VwQ29udGVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQgYXR0cmlidXRlR3JvdXBDb250ZW50ID0gKFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgaWYgKGF0dHJpYnV0ZUdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlID0gKChYU0RBdHRyaWJ1dGVVc2UpIGF0dHJpYnV0ZUdyb3VwQ29udGVudCkuZ2V0Q29udGVudCgpOwotICAgICAgICBpZiAoaW5zZXJ0VHlwZSA9PSBJTlNFUlRfQUZURVIpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYXR0cmlidXRlID09IHByZXZpb3VzUmVmQ29tcG9uZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbXBsZXhUeXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuYWRkKGluZGV4ICsgMSwgc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpbnNlcnRUeXBlID09IElOU0VSVF9CRUZPUkUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYXR0cmlidXRlID09IG5leHRSZWZDb21wb25lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgY29tcGxleFR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5hZGQoaW5kZXgsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGluZGV4Kys7Ci0gICAgfQotICAgIGlmIChhdHRyaWJ1dGVHcm91cENvbnRlbnRzLnNpemUoKSA9PSAwKQotICAgIHsKLSAgICAgIGNvbXBsZXhUeXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuYWRkKHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKCFhZGRlZEJhY2spCi0gICAgewotICAgICAgY29tcGxleFR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5hZGQob3JpZ2luYWxJbmRleCwgc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL01vdmVYU0RCYXNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL01vdmVYU0RCYXNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZDk5MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9Nb3ZlWFNEQmFzZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgTW92ZVhTREJhc2VBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLQotICBwdWJsaWMgTW92ZVhTREJhc2VBY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGNhbk1vdmUoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9Nb3ZlWFNERWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9Nb3ZlWFNERWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTczZmY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvTW92ZVhTREVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIE1vdmVYU0RFbGVtZW50QWN0aW9uIGV4dGVuZHMgTW92ZVhTREJhc2VBY3Rpb24KLXsKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IElOU0VSVF9CRUZPUkUgPSAwOwotICBwcml2YXRlIHN0YXRpYyBpbnQgSU5TRVJUX0FGVEVSID0gMTsKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IElOU0VSVF9ESVJFQ1QgPSAyOwotICBwcm90ZWN0ZWQgTGlzdCBzZWxlY3RlZE5vZGVzOwotICBwcm90ZWN0ZWQgTm9kZSBwYXJlbnROb2RlOwotICBwcm90ZWN0ZWQgTm9kZSBwcmV2aW91c1JlZkNoaWxkLCBuZXh0UmVmQ2hpbGQ7Ci0gIGludCBpbnNlcnRUeXBlOwotCi0gIFhTRE1vZGVsR3JvdXAgcGFyZW50TW9kZWxHcm91cDsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgc2VsZWN0ZWQsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50OwotICBib29sZWFuIGluc2VydEF0RW5kID0gdHJ1ZTsKLQotICBwdWJsaWMgTW92ZVhTREVsZW1lbnRBY3Rpb24oWFNETW9kZWxHcm91cCBwYXJlbnRDb21wb25lbnQsIFhTRENvbmNyZXRlQ29tcG9uZW50IHNlbGVjdGVkLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50LCBYU0RDb25jcmV0ZUNvbXBvbmVudCBuZXh0UmVmQ2hpbGRDb21wb25lbnQpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMucGFyZW50TW9kZWxHcm91cCA9IHBhcmVudENvbXBvbmVudDsKLSAgICB0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWQ7Ci0gICAgdGhpcy5wcmV2aW91c1JlZkNvbXBvbmVudCA9IHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQ7Ci0gICAgdGhpcy5uZXh0UmVmQ29tcG9uZW50ID0gbmV4dFJlZkNoaWxkQ29tcG9uZW50OwotCi0gICAgaWYgKHBhcmVudENvbXBvbmVudCA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIHBhcmVudE5vZGUgPSBwYXJlbnRDb21wb25lbnQuZ2V0RWxlbWVudCgpOwotICAgIG5leHRSZWZDaGlsZCA9IG5leHRSZWZDaGlsZENvbXBvbmVudCAhPSBudWxsID8gbmV4dFJlZkNoaWxkQ29tcG9uZW50LmdldEVsZW1lbnQoKSA6IG51bGw7Ci0gICAgcHJldmlvdXNSZWZDaGlsZCA9IHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQgIT0gbnVsbCA/IHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQuZ2V0RWxlbWVudCgpIDogbnVsbDsKLQotICAgIGlmIChuZXh0UmVmQ29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKG5leHRSZWZDb21wb25lbnQuZ2V0Q29udGFpbmVyKCkuZ2V0Q29udGFpbmVyKCkgPT0gcGFyZW50TW9kZWxHcm91cCkKLSAgICAgIHsKLSAgICAgICAgaW5zZXJ0VHlwZSA9IElOU0VSVF9CRUZPUkU7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChwcmV2aW91c1JlZkNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChwcmV2aW91c1JlZkNvbXBvbmVudC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKSA9PSBwYXJlbnRNb2RlbEdyb3VwKQotICAgICAgewotICAgICAgICBpbnNlcnRUeXBlID0gSU5TRVJUX0FGVEVSOwotICAgICAgfQotICAgIH0KLSAgICBpZiAobmV4dFJlZkNoaWxkQ29tcG9uZW50ID09IG51bGwgJiYgcHJldmlvdXNSZWZDaGlsZENvbXBvbmVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc2VydFR5cGUgPSBJTlNFUlRfRElSRUNUOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBNb3ZlWFNERWxlbWVudEFjdGlvbihYU0RNb2RlbEdyb3VwIHBhcmVudENvbXBvbmVudCwgWFNEQ29uY3JldGVDb21wb25lbnQgc2VsZWN0ZWQsIFhTRENvbmNyZXRlQ29tcG9uZW50IHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQsIFhTRENvbmNyZXRlQ29tcG9uZW50IG5leHRSZWZDaGlsZENvbXBvbmVudCwgYm9vbGVhbiBpbnNlcnRBdEVuZCkKLSAgewotICAgIHRoaXMocGFyZW50Q29tcG9uZW50LCBzZWxlY3RlZCwgcHJldmlvdXNSZWZDaGlsZENvbXBvbmVudCwgbmV4dFJlZkNoaWxkQ29tcG9uZW50KTsKLSAgICB0aGlzLmluc2VydEF0RW5kID0gaW5zZXJ0QXRFbmQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGNhbk1vdmUoKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgCi0gICAgaWYgKG5leHRSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB8fCBwcmV2aW91c1JlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHx8IHBhcmVudE1vZGVsR3JvdXAgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIElBY3Rpb24jcnVuKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBpbnQgb3JpZ2luYWxJbmRleCA9IDA7Ci0gICAgZm9yIChJdGVyYXRvciBwYXJ0aWNsZXMgPSBwYXJlbnRNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgcGFydGljbGVzLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpIHBhcnRpY2xlcy5uZXh0KCk7Ci0gICAgICBYU0RQYXJ0aWNsZUNvbnRlbnQgcGFydGljbGVDb250ZW50ID0gcGFydGljbGUuZ2V0Q29udGVudCgpOwotICAgICAgaWYgKHBhcnRpY2xlQ29udGVudCA9PSBzZWxlY3RlZCkKLSAgICAgIHsKLSAgICAgICAgcGFyZW50TW9kZWxHcm91cC5nZXRDb250ZW50cygpLnJlbW92ZShwYXJ0aWNsZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgb3JpZ2luYWxJbmRleCsrOwotICAgIH0KLSAgICBpbnQgaW5kZXggPSAwOwotICAgIGJvb2xlYW4gYWRkZWRCYWNrID0gZmFsc2U7Ci0gICAgaWYgKGluc2VydFR5cGUgPT0gSU5TRVJUX0RJUkVDVCkKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb250YWluZXIgPSBzZWxlY3RlZC5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29udGFpbmVyMiA9IGNvbnRhaW5lci5nZXRDb250YWluZXIoKTsKLSAgICAgICAgaWYgKGNvbnRhaW5lcjIgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgICB7Ci0gICAgICAgICAgKChYU0RNb2RlbEdyb3VwKSBjb250YWluZXIyKS5nZXRDb250ZW50cygpLnJlbW92ZShjb250YWluZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnNlcnRBdEVuZCkKLSAgICAgICAgICBwYXJlbnRNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGNvbnRhaW5lcik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwYXJlbnRNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKDAsIGNvbnRhaW5lcik7Ci0gICAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTGlzdCBwYXJ0aWNsZXMgPSBwYXJlbnRNb2RlbEdyb3VwLmdldENvbnRlbnRzKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBhcnRpY2xlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBYU0RQYXJ0aWNsZUNvbnRlbnQgcGFydGljbGVDb250ZW50ID0gcGFydGljbGUuZ2V0Q29udGVudCgpOwotICAgICAgaWYgKGluc2VydFR5cGUgPT0gSU5TRVJUX0JFRk9SRSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHBhcnRpY2xlQ29udGVudCA9PSBuZXh0UmVmQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgcGFyZW50TW9kZWxHcm91cC5nZXRDb250ZW50cygpLmFkZChpbmRleCwgc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlbGVjdGVkID09IG5leHRSZWZDb21wb25lbnQgJiYgb3JpZ2luYWxJbmRleCA9PSBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgIHBhcmVudE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoaW5kZXgsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnNlcnRUeXBlID09IElOU0VSVF9BRlRFUikKLSAgICAgIHsKLSAgICAgICAgaWYgKHBhcnRpY2xlQ29udGVudCA9PSBwcmV2aW91c1JlZkNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgIHBhcmVudE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoaW5kZXggKyAxLCBzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0ZWQgPT0gcHJldmlvdXNSZWZDb21wb25lbnQgJiYgb3JpZ2luYWxJbmRleCA9PSBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgIHBhcmVudE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoaW5kZXgsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRleCsrOwotICAgIH0KLSAgICBpZiAocGFydGljbGVzLnNpemUoKSA9PSAwKQotICAgIHsKLSAgICAgIHBhcmVudE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoIWFkZGVkQmFjaykKLSAgICB7Ci0gICAgICBwYXJlbnRNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKG9yaWdpbmFsSW5kZXgsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvWFNERWRpdE5hbWVzcGFjZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvWFNERWRpdE5hbWVzcGFjZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE1NzNiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL1hTREVkaXROYW1lc3BhY2VzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VJbmZvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25SZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlTmFtZXNwYWNlSW5mb3JtYXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubnNlZGl0LlNjaGVtYVByZWZpeENoYW5nZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uc2VkaXQuVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpZGdldHMuWFNERWRpdFNjaGVtYUluZm9EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0TmFtZXNwYWNlc0FjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLSAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbjsKLSAgcHJpdmF0ZSBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBwcml2YXRlIERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyIG5hbWVzcGFjZUluZm9NYW5hZ2VyID0gbmV3IERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyKCk7Ci0KLSAgcHVibGljIFhTREVkaXROYW1lc3BhY2VzQWN0aW9uKFN0cmluZyBsYWJlbCwgRWxlbWVudCBlbGVtZW50LCBOb2RlIG5vZGUpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHNldFRleHQobGFiZWwpOwotCi0gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vIFRoaXMgbmVlZHMgdG8gYmUgY2hhbmdlZC4uLi4KLSAgICB0aGlzLnJlc291cmNlTG9jYXRpb24gPSAiZHVtbXkiOwotICB9Ci0KLSAgcHVibGljIFhTREVkaXROYW1lc3BhY2VzQWN0aW9uKFN0cmluZyBsYWJlbCwgRWxlbWVudCBlbGVtZW50LCBOb2RlIG5vZGUsIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICB0aGlzKGxhYmVsLCBlbGVtZW50LCBub2RlKTsKLSAgICB4c2RTY2hlbWEgPSBzY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTaGVsbCBzaGVsbCA9IFhNTENvbW1vblJlc291cmNlcy5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0gICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gbnVsbDsKLSAgICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0geHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgfQotICAgICAgWFNERWRpdFNjaGVtYUluZm9EaWFsb2cgZGlhbG9nID0gbmV3IFhTREVkaXRTY2hlbWFJbmZvRGlhbG9nKHNoZWxsLCBuZXcgUGF0aChyZXNvdXJjZUxvY2F0aW9uKSwgdGFyZ2V0TmFtZXNwYWNlKTsKLQotICAgICAgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IG5hbWVzcGFjZUluZm9NYW5hZ2VyLmdldE5hbWVzcGFjZUluZm9MaXN0KGVsZW1lbnQpOwotICAgICAgTGlzdCBvbGROYW1lc3BhY2VJbmZvTGlzdCA9IE5hbWVzcGFjZUluZm8uY2xvbmVOYW1lc3BhY2VJbmZvTGlzdChuYW1lc3BhY2VJbmZvTGlzdCk7Ci0KLSAgICAgIC8vIGhlcmUgd2Ugc3RvcmUgYSBjb3B5IG9mIHRoZSBvbGQgaW5mbyBmb3IgZWFjaCBOYW1lc3BhY2VJbmZvCi0gICAgICAvLyB0aGlzIGluZm8gd2lsbCBiZSB1c2VkIGluIGNyZWF0ZVByZWZpeE1hcHBpbmcoKSB0byBmaWd1cmUgb3V0IGhvdyB0bwotICAgICAgLy8gdXBkYXRlIHRoZSBkb2N1bWVudCBpbiByZXNwb25zZSB0byB0aGVzZSBjaGFuZ2VzCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuYW1lc3BhY2VJbmZvTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBpLm5leHQoKTsKLSAgICAgICAgTmFtZXNwYWNlSW5mbyBvbGRDb3B5ID0gbmV3IE5hbWVzcGFjZUluZm8oaW5mbyk7Ci0gICAgICAgIGluZm8uc2V0UHJvcGVydHkoIm9sZENvcHkiLCBvbGRDb3B5KTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotCi0gICAgICBkaWFsb2cuc2V0TmFtZXNwYWNlSW5mb0xpc3QobmFtZXNwYWNlSW5mb0xpc3QpOwotICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSg1MDAsIDQwMCk7Ci0gICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTENvbW1vblJlc291cmNlcy5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1VJX01FTlVfRURJVF9TQ0hFTUFfSU5GT1JNQVRJT05fVElUTEUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgIGRpYWxvZy5vcGVuKCk7Ci0KLSAgICAgIFN0cmluZyB4c2RQcmVmaXggPSBudWxsOyAvLyROT04tTkxTLTEkCi0gICAgICBTdHJpbmcgb3JpZ1hTRFByZWZpeCA9IHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCgpOwotICAgICAgU3RyaW5nIG5ld1ROU1ByZWZpeCA9ICIiOwotCi0gICAgICBpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgeHNkU2NoZW1hRWxlbWVudCA9IHhzZFNjaGVtYS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIERvY3VtZW50SW1wbCBkb2MgPSAoRG9jdW1lbnRJbXBsKSB4c2RTY2hlbWFFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQotICAgICAgICBMaXN0IG5ld0luZm9MaXN0ID0gZGlhbG9nLmdldE5hbWVzcGFjZUluZm9MaXN0KCk7Ci0KLSAgICAgICAgLy8gc2VlIGlmIHdlIG5lZWQgdG8gcmVuYW1lIGFueSBwcmVmaXhlcwotICAgICAgICBNYXAgcHJlZml4TWFwcGluZyA9IGNyZWF0ZVByZWZpeE1hcHBpbmcob2xkTmFtZXNwYWNlSW5mb0xpc3QsIG5hbWVzcGFjZUluZm9MaXN0KTsKLQotICAgICAgICBTdHJpbmcgb3JpZ1ROU1ByZWZpeCA9IG51bGw7Ci0gICAgICAgIE1hcCBvcmlnUHJlZml4TWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gb3JpZ1ByZWZpeE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgU3RyaW5nIG5zID0gKFN0cmluZykgb3JpZ1ByZWZpeE1hcC5nZXQoa2V5KTsKLSAgICAgICAgICBpZiAoKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsICYmIG5zID09IG51bGwpIHx8IHRhcmdldE5hbWVzcGFjZSAhPSBudWxsICYmIHRhcmdldE5hbWVzcGFjZS5lcXVhbHMobnMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG9yaWdUTlNQcmVmaXggPSBrZXk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgTWFwIG1hcDIgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0luZm9MaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE5hbWVzcGFjZUluZm8gbmkgPSAoTmFtZXNwYWNlSW5mbykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgU3RyaW5nIHByZWYgPSBuaS5wcmVmaXg7Ci0gICAgICAgICAgU3RyaW5nIHVyaSA9IG5pLnVyaTsKLSAgICAgICAgICBpZiAocHJlZiA9PSBudWxsKQotICAgICAgICAgICAgcHJlZiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgICAgICAgdXJpID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAoWFNEQ29uc3RhbnRzLmlzU2NoZW1hRm9yU2NoZW1hTmFtZXNwYWNlKHVyaSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgeHNkUHJlZml4ID0gcHJlZjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHVyaS5lcXVhbHMoZGlhbG9nLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuZXdUTlNQcmVmaXggPSBwcmVmOwotICAgICAgICAgIH0KLSAgICAgICAgICBtYXAyLnB1dChwcmVmLCB1cmkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1hcDIuc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLQotICAgICAgICAgICAgZG9jLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX05BTUVTUEFDRV9DSEFOR0UiKSk7Ci0gICAgICAgICAgICBib29sZWFuIHRhcmdldE5hbWVzcGFjZUNoYW5nZWQgPSAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgJiYgIXRhcmdldE5hbWVzcGFjZS5lcXVhbHMoZGlhbG9nLmdldFRhcmdldE5hbWVzcGFjZSgpKSB8fCB0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCAmJiBkaWFsb2cuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCk7Ci0gICAgICAgICAgICBib29sZWFuIHRuc1ByZWZpeENoYW5nZWQgPSAhbmV3VE5TUHJlZml4LmVxdWFscyhvcmlnVE5TUHJlZml4KTsKLSAgICAgICAgICAgIGJvb2xlYW4geHNkUHJlZml4Q2hhbmdlZCA9ICghKG9yaWdYU0RQcmVmaXggPT0gbnVsbCAmJiB4c2RQcmVmaXguZXF1YWxzKCIiKSkgfHwgKG9yaWdYU0RQcmVmaXggIT0gbnVsbCAmJiAhb3JpZ1hTRFByZWZpeC5lcXVhbHMoeHNkUHJlZml4KSkpOwotCi0gICAgICAgICAgICB4c2RTY2hlbWEuc2V0SW5jcmVtZW50YWxVcGRhdGUoZmFsc2UpOwotCi0gICAgICAgICAgICAvLyBGaXJzdCBoYW5kbGUgdGhlIHByZWZpeCBjaGFuZ2UgZm9yIHRoZSB0YXJnZXQgbmFtZXNwYWNlCi0gICAgICAgICAgICBpZiAodG5zUHJlZml4Q2hhbmdlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHJlZml4TWFwcGluZy5yZW1vdmUob3JpZ1ROU1ByZWZpeCk7Ci0gICAgICAgICAgICAgIFVwZGF0ZU5hbWVzcGFjZUluZm9ybWF0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZU5hbWVzcGFjZUluZm9ybWF0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX05BTUVTUEFDRV9JTkZPUk1BVElPTl9DSEFOR0UsIHhzZFNjaGVtYSwgbmV3VE5TUHJlZml4LCB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgICAgeHNkU2NoZW1hLnVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gU2Vjb25kLCBoYW5kbGUgdGhlIHRhcmdldCBuYW1lc3BhY2UgY2hhbmdlCi0gICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlQ2hhbmdlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gc2V0IHRoZSB0YXJnZXROYW1lc3BhY2UgYXR0cmlidXRlCi0gICAgICAgICAgICAgIHhzZFNjaGVtYS5zZXRUYXJnZXROYW1lc3BhY2UoZGlhbG9nLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQotICAgICAgICAgICAgICBUYXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyIHRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIgPSBuZXcgVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlcih4c2RTY2hlbWEsIHRhcmdldE5hbWVzcGFjZSwgZGlhbG9nLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlci5yZXNvbHZlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTm93IGhhbmRsZSB0aGUgb3RoZXIgY2hhbmdlcy4gUHJlZml4TWFwcGluZyBzaXplIHNob3VsZCBiZQotICAgICAgICAgICAgLy8gZ3JlYXRlciB0aGFuIDAgZm9yIGFueSByZW1haW5pbmcgcHJlZml4IGNoYW5nZXMKLQotICAgICAgICAgICAgaWYgKHByZWZpeE1hcHBpbmcuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcHJlZml4TWFwcGluZy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb2xkUHJlZml4ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld1ByZWZpeCA9IChTdHJpbmcpIHByZWZpeE1hcHBpbmcuZ2V0KG9sZFByZWZpeCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3cgdXBkYXRlIGFueSByZWZlcmVuY2VzIHRvIHRoaXMgb2xkIHByZWZpeCBpbiB0aGUgc2NoZW1hCi0gICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgdmFsdWUgb2YgdGhlIG5ldyBwcmVmaXgKLSAgICAgICAgICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKSBvcmlnUHJlZml4TWFwLmdldChvbGRQcmVmaXgpOwotICAgICAgICAgICAgICAgIFNjaGVtYVByZWZpeENoYW5nZUhhbmRsZXIgc3BjaCA9IG5ldyBTY2hlbWFQcmVmaXhDaGFuZ2VIYW5kbGVyKHhzZFNjaGVtYSwgbmV3UHJlZml4LCBucyAhPSBudWxsPyBucyA6ICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHNwY2gucmVzb2x2ZSgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuYW1lc3BhY2VJbmZvTWFuYWdlci5yZW1vdmVOYW1lc3BhY2VJbmZvKGVsZW1lbnQpOwotICAgICAgICAgICAgbmFtZXNwYWNlSW5mb01hbmFnZXIuYWRkTmFtZXNwYWNlSW5mbyhlbGVtZW50LCBuZXdJbmZvTGlzdCwgZmFsc2UpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUaGlyZCwgaGFuZGxlIHRoZSBzY2hlbWEgZm9yIHNjaGVtYSBwcmVmaXggY2hhbmdlCi0gICAgICAgICAgICBpZiAoeHNkUHJlZml4Q2hhbmdlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHhzZFByZWZpeCAhPSBudWxsICYmIHhzZFByZWZpeC5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeHNkU2NoZW1hLnNldFNjaGVtYUZvclNjaGVtYVFOYW1lUHJlZml4KG51bGwpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhzZFNjaGVtYS5zZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCh4c2RQcmVmaXgpOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgbmFtZXNwYWNlSW5mb01hbmFnZXIucmVtb3ZlTmFtZXNwYWNlSW5mbyhlbGVtZW50KTsKLSAgICAgICAgICAgICAgbmFtZXNwYWNlSW5mb01hbmFnZXIuYWRkTmFtZXNwYWNlSW5mbyhlbGVtZW50LCBuZXdJbmZvTGlzdCwgZmFsc2UpOwotICAgICAgICAgICAgICB4c2RTY2hlbWEuc2V0SW5jcmVtZW50YWxVcGRhdGUodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgLy8gTm93IGNoYW5nZSB0aGUgcmVmZXJlbmNlcyB0byBhbnkgc2NoZW1hIHR5cGVzL2NvbXBvbmVudHMgaWUuIHN0cmluZyAtLT4geHM6c3RyaW5nCi0gICAgICAgICAgICAgIFNjaGVtYVByZWZpeENoYW5nZUhhbmRsZXIgc3BjaCA9IG5ldyBTY2hlbWFQcmVmaXhDaGFuZ2VIYW5kbGVyKHhzZFNjaGVtYSwgeHNkUHJlZml4KTsKLSAgICAgICAgICAgICAgc3BjaC5yZXNvbHZlKCk7Ci0KLSAgICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBwcmVmaXggZm9yIGFsbCBzY2hlbWEgY29tcG9uZW50cwotICAgICAgICAgICAgICB1cGRhdGVBbGxOb2RlcyhlbGVtZW50LCB4c2RQcmVmaXgpOwotCi0gICAgICAgICAgICAgIHByZWZpeE1hcHBpbmcucmVtb3ZlKG9yaWdYU0RQcmVmaXggIT0gbnVsbD8gb3JpZ1hTRFByZWZpeCA6ICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgeHNkU2NoZW1hLnNldEluY3JlbWVudGFsVXBkYXRlKHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgewotICAgICAgICAgICAgeHNkU2NoZW1hLnVwZGF0ZSgpOwotICAgICAgICAgICAgZG9jLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBNYXAgY3JlYXRlUHJlZml4TWFwcGluZyhMaXN0IG9sZExpc3QsIExpc3QgbmV3TGlzdCkKLSAgewotICAgIE1hcCBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICBIYXNodGFibGUgb2xkVVJJVG9QcmVmaXhUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvbGRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBOYW1lc3BhY2VJbmZvIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0gICAgICBvbGRVUklUb1ByZWZpeFRhYmxlLnB1dChvbGRJbmZvLnVyaSwgb2xkSW5mbyk7Ci0gICAgfQotCi0gICAgZm9yIChJdGVyYXRvciBpID0gbmV3TGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgTmFtZXNwYWNlSW5mbyBuZXdJbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotICAgICAgTmFtZXNwYWNlSW5mbyBvbGRJbmZvID0gKE5hbWVzcGFjZUluZm8pIG9sZFVSSVRvUHJlZml4VGFibGUuZ2V0KG5ld0luZm8udXJpICE9IG51bGwgPyBuZXdJbmZvLnVyaSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAvLyBpZiBvbGRJbmZvIGlzIG5vbiBudWxsIC4uLiB0aGVyZSdzIGEgbWF0Y2hpbmcgVVJJIGluIHRoZSBvbGQgc2V0Ci0gICAgICAvLyB3ZSBjYW4gdXNlIGl0cyBwcmVmaXggdG8gZGV0ZW1pbmUgb3V0IG1hcHBpbmcKLSAgICAgIC8vCi0gICAgICAvLyBpZiBvbGRJbmZvIGlzIG51bGwgLi4uIHdlIHVzZSB0aGUgJ29sZENvcHknIHdlIHN0YXNoZWQgYXdheQotICAgICAgLy8gYXNzdW1pbmcgdGhhdCB0aGUgdXNlciBjaGFuZ2VkIHRoZSBVUkkgYW5kIHRoZSBwcmVmaXgKLSAgICAgIGlmIChvbGRJbmZvID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbykgbmV3SW5mby5nZXRQcm9wZXJ0eSgib2xkQ29weSIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIGlmIChvbGRJbmZvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuZXdQcmVmaXggPSBuZXdJbmZvLnByZWZpeCAhPSBudWxsID8gbmV3SW5mby5wcmVmaXggOiAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgb2xkUHJlZml4ID0gb2xkSW5mby5wcmVmaXggIT0gbnVsbCA/IG9sZEluZm8ucHJlZml4IDogIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKCFvbGRQcmVmaXguZXF1YWxzKG5ld1ByZWZpeCkpCi0gICAgICAgIHsKLSAgICAgICAgICBtYXAucHV0KG9sZFByZWZpeCwgbmV3UHJlZml4KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUFsbE5vZGVzKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHByZWZpeCkKLSAgewotICAgIGVsZW1lbnQuc2V0UHJlZml4KHByZWZpeCk7Ci0gICAgTm9kZUxpc3QgbGlzdCA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIGlmIChsaXN0ICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgY2hpbGQgPSBsaXN0Lml0ZW0oaSk7Ci0gICAgICAgIGlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGNoaWxkLnNldFByZWZpeChwcmVmaXgpOwotICAgICAgICAgIGlmIChjaGlsZC5oYXNDaGlsZE5vZGVzKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlQWxsTm9kZXMoKEVsZW1lbnQpIGNoaWxkLCBwcmVmaXgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9DYXRlZ29yeUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL0NhdGVnb3J5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDk5NWVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL0NhdGVnb3J5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JTW9kZWxQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeUFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIElNb2RlbFByb3h5LCBJQWN0aW9uUHJvdmlkZXIsIElBRFRPYmplY3RMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgU3RyaW5nIHRleHQ7Ci0gIHByb3RlY3RlZCBJbWFnZSBpbWFnZTsKLSAgcHJvdGVjdGVkIE9iamVjdCBwYXJlbnQ7Ci0gIHByb3RlY3RlZCBpbnQgZ3JvdXBUeXBlOwotICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjaGlsZHJlbiwgYWxsQ2hpbGRyZW47ICAvLyBjaGlsZHJlbiBmcm9tIGN1cnJlbnQgc2NoZW1hLCBjaGlsZHJlbiBmcm9tIGN1cnJlbnQgc2NoZW1hIGFuZCBpbmNsdWRlcwotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotCi0gIHB1YmxpYyBDYXRlZ29yeUFkYXB0ZXIoU3RyaW5nIGxhYmVsLCBJbWFnZSBpbWFnZSwgQ29sbGVjdGlvbiBjaGlsZHJlbiwgWFNEU2NoZW1hIHhzZFNjaGVtYSwgaW50IGdyb3VwVHlwZSkKLSAgewotICAgIHRoaXMudGV4dCA9IGxhYmVsOwotICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTsKLSAgICB0aGlzLnBhcmVudCA9IHhzZFNjaGVtYTsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgICB0aGlzLnRhcmdldCA9IHhzZFNjaGVtYTsKLSAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47Ci0gICAgdGhpcy5ncm91cFR5cGUgPSBncm91cFR5cGU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBBVFRSSUJVVEVTID0gMTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRUxFTUVOVFMgPSAyOwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUWVBFUyA9IDM7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEdST1VQUyA9IDU7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERJUkVDVElWRVMgPSA2OwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBOT1RBVElPTlMgPSA3OwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBBVFRSSUJVVEVfR1JPVVBTID0gODsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSURFTlRJVFlfQ09OU1RSQUlOVFMgPSA5OwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBBTk5PVEFUSU9OUyA9IDEwOwotCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0WFNEU2NoZW1hKCkKLSAgewotICAgIHJldHVybiB4c2RTY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEdyb3VwVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZ3JvdXBUeXBlOwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgewotICAgIHJldHVybiBpbWFnZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICByZXR1cm4gdGV4dDsKLSAgfQotCi0gIHB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICByZXR1cm4gKElUcmVlRWxlbWVudFtdKSBjaGlsZHJlbi50b0FycmF5KG5ldyBJVHJlZUVsZW1lbnRbMF0pOwotICB9Ci0gIAotICBwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0QWxsQ2hpbGRyZW4oKQotICB7Ci0gICAgcmV0dXJuIChJVHJlZUVsZW1lbnRbXSkgYWxsQ2hpbGRyZW4udG9BcnJheShuZXcgSVRyZWVFbGVtZW50WzBdKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENoaWxkcmVuKENvbGxlY3Rpb24gbGlzdCkKLSAgewotICAgIGNoaWxkcmVuID0gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFsbENoaWxkcmVuKENvbGxlY3Rpb24gbGlzdCkKLSAgewotICAgIGFsbENoaWxkcmVuID0gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gIHsKLQotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgeyAgICAKLSAgICBDb2xsZWN0aW9uIGFjdGlvbklEcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAKLSAgICBzd2l0Y2ggKGdyb3VwVHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIFRZUEVTIDogewotICAgICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFjdGlvbi5JRCk7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25BY3Rpb24uSUQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgRUxFTUVOVFMgOiB7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNERWxlbWVudEFjdGlvbi5JRCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBHUk9VUFMgOiB7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb24uTU9ERUxHUk9VUERFRklOSVRJT05fSUQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQVRUUklCVVRFUyA6IHsKLSAgICAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbi5JRCk7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uLklEKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEFUVFJJQlVURV9HUk9VUFMgOiB7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uLklEKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIERJUkVDVElWRVMgOiB7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uLklOQ0xVREVfSUQpOwotICAgICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbi5JTVBPUlRfSUQpOwotICAgICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbi5SRURFRklORV9JRCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBhY3Rpb25JRHMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBhY3Rpb25JRHMuYWRkKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5JRCk7Ci0gICAgcmV0dXJuIChTdHJpbmcgW10pYWN0aW9uSURzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBpZiAoZ2V0VGV4dCgpLmVxdWFscyhwcm9wZXJ0eSkpCi0gICAgICBub3RpZnlMaXN0ZW5lcnModGhpcywgcHJvcGVydHkpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0VHlwZXMoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIHJldHVybiAoSU1vZGVsKVhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoeHNkU2NoZW1hKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvUmVkZWZpbmVDYXRlZ29yeUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1JlZGVmaW5lQ2F0ZWdvcnlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZThjOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvUmVkZWZpbmVDYXRlZ29yeUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEUmVkZWZpbmVkQXR0cmlidXRlR3JvdXBBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RSZWRlZmluZWRDb21wbGV4VHlwZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTRFJlZGVmaW5lZE1vZGVsR3JvdXBBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RSZWRlZmluZWRTaW1wbGVUeXBlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLQotCi1wdWJsaWMgY2xhc3MgUmVkZWZpbmVDYXRlZ29yeUFkYXB0ZXIgZXh0ZW5kcyBDYXRlZ29yeUFkYXB0ZXIKLXsKLSAgcHJvdGVjdGVkIFhTRFJlZGVmaW5lIHhzZFJlZGVmaW5lOwotICBwcml2YXRlIFhTRFJlZGVmaW5lQWRhcHRlciB4c2RSZWRlZmluZUFkYXB0ZXI7Ci0KLSAgcHVibGljIFJlZGVmaW5lQ2F0ZWdvcnlBZGFwdGVyKFN0cmluZyBsYWJlbCwgSW1hZ2UgaW1hZ2UsIENvbGxlY3Rpb24gY2hpbGRyZW4sIFhTRFJlZGVmaW5lIHhzZFJlZGVmaW5lLCBYU0RSZWRlZmluZUFkYXB0ZXIgeHNkUmVkZWZpbmVBZGFwdGVyLCBpbnQgZ3JvdXBUeXBlKQotICB7Ci0gICAgc3VwZXIobGFiZWwsIGltYWdlLCBjaGlsZHJlbiwgeHNkUmVkZWZpbmUuZ2V0U2NoZW1hKCksIGdyb3VwVHlwZSk7Ci0gICAgdGhpcy54c2RSZWRlZmluZSA9IHhzZFJlZGVmaW5lOwotICAgIHRoaXMudGFyZ2V0ID0geHNkUmVkZWZpbmU7Ci0gICAgdGhpcy54c2RSZWRlZmluZUFkYXB0ZXIgPSB4c2RSZWRlZmluZUFkYXB0ZXI7Ci0gIH0KLQotICBwdWJsaWMgWFNEUmVkZWZpbmUgZ2V0WFNEUmVkZWZpbmUoKQotICB7Ci0gICAgcmV0dXJuIHhzZFJlZGVmaW5lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIENvbGxlY3Rpb24gYWN0aW9uSURzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgc3dpdGNoIChncm91cFR5cGUpCi0gICAgewotICAgICAgY2FzZSBUWVBFUzoKLSAgICAgIHsKLSAgICAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RSZWRlZmluZWRDb21wbGV4VHlwZUFjdGlvbi5JRCk7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNEUmVkZWZpbmVkU2ltcGxlVHlwZUFjdGlvbi5JRCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBHUk9VUFM6Ci0gICAgICB7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNEUmVkZWZpbmVkTW9kZWxHcm91cEFjdGlvbi5JRCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBBVFRSSUJVVEVTOgotICAgICAgY2FzZSBBVFRSSUJVVEVfR1JPVVBTOgotICAgICAgewotICAgICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRFJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwQWN0aW9uLklEKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGFjdGlvbklEcy5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGFjdGlvbklEcy5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLSAgICByZXR1cm4gKFN0cmluZ1tdKWFjdGlvbklEcy50b0FycmF5KG5ldyBTdHJpbmcgWzBdKTsKLSAgfQotCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgcmV0dXJuIChJTW9kZWwpWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh4c2RSZWRlZmluZS5nZXRTY2hlbWEoKSk7Ci0gIH0KLQotCi0gIHB1YmxpYyBYU0RSZWRlZmluZUFkYXB0ZXIgZ2V0WHNkUmVkZWZpbmVBZGFwdGVyKCkgewotCXJldHVybiB4c2RSZWRlZmluZUFkYXB0ZXI7Ci0gIH0KLSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNWNlMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbnVtZXJhdGlvbkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFN3aXRjaDsKLQotcHVibGljIGNsYXNzIFhTREFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgWFNEQWRhcHRlckZhY3RvcnkgaW5zdGFuY2U7Ci0gIAotICBwdWJsaWMgc3RhdGljIFhTREFkYXB0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIGZpcnN0IHVzZSB0aGUgb25lIGRlZmluZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgIGluc3RhbmNlID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFhTREVkaXRvckNvbmZpZ3VyYXRpb24oKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotICAgICAgLy8gaWYgdGhlcmUgaXNuJ3Qgb25lLCB0aGVuIHVzZSB0aGUgZGVmYXVsdAotICAgICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgICAgIGluc3RhbmNlID0gbmV3IFhTREFkYXB0ZXJGYWN0b3J5KCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotICAKLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpCi0gIHsKLSAgICBYU0RTd2l0Y2ggeHNkU3dpdGNoID0gbmV3IFhTRFN3aXRjaCgpCi0gICAgewotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEU2NoZW1hRGlyZWN0aXZlKFhTRFNjaGVtYURpcmVjdGl2ZSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlcigpOwotICAgICAgfQotICAgICAgCi0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RXaWxkY2FyZChYU0RXaWxkY2FyZCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWFNEV2lsZGNhcmRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNETW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcigpOwotICAgICAgfQotICAgICAgCi0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZVVzZShYU0RBdHRyaWJ1dGVVc2Ugb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEUGFydGljbGUoWFNEUGFydGljbGUgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFhTRFBhcnRpY2xlQWRhcHRlcigpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIC8vIHdlIGRvbid0IGxpa2UgZXhwb3NpbmcgdGhlICdhbnlUeXBlJyB0eXBlIGFzIGEgdmlzaWJsZSBjb21wbGV4IHR5cGUKLSAgICAgICAgLy8gc28gd2UgYWRhcHQgaXQgaW4gYSBzcGVjaWFsaXplZCB3YXkgc28gdGhhdCBpdCdzIHRyZWF0ZWQgYXMgc2ltcGxlIHR5cGUKLSAgICAgICAgLy8gdGhhdCB3YXkgaXQgZG9lc24ndCBzaG93IHVwIGFzIGEgcmVmZXJlbmNlIGZyb20gYSBmaWVsZAotICAgICAgICAvLwotICAgICAgICBpZiAoImFueVR5cGUiLmVxdWFscyhvYmplY3QuZ2V0TmFtZSgpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RBbnlUeXBlRGVmaW5pdGlvbkFkYXB0ZXIoKTsgCi0gICAgICAgIH0gIAotICAgICAgICBlbHNlCi0gICAgICAgIHsgICAgICAgICAgICAgCi0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyKCk7Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgICAgCi0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFhTRE1vZGVsR3JvdXBBZGFwdGVyKCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFNjaGVtYShYU0RTY2hlbWEgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFhTRFNjaGVtYUFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNERW51bWVyYXRpb25GYWNldChYU0RFbnVtZXJhdGlvbkZhY2V0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RFbnVtZXJhdGlvbkZhY2V0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgCi0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RSZWRlZmluZShYU0RSZWRlZmluZSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWFNEUmVkZWZpbmVBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBPYmplY3QgbyA9IHhzZFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCkgdGFyZ2V0KTsKLSAgICBBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG8gaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChBZGFwdGVyKSBvOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotLy8gICAgICBUaHJlYWQuZHVtcFN0YWNrKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQpCi0gIHsKLSAgICByZXR1cm4gYWRhcHQodGFyZ2V0LCB0aGlzKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREFueVR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQW55VHlwZURlZmluaXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOGRjNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQW55VHlwZURlZmluaXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RBbnlUeXBlRGVmaW5pdGlvbkFkYXB0ZXIgZXh0ZW5kcyBYU0RUeXBlRGVmaW5pdGlvbkFkYXB0ZXIKLXsKLSAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV4VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQWxsb3dlZCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KQotICB7Ci0JcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0Fub255bW91cygpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KCgoWFNEQ29uY3JldGVDb21wb25lbnQpdGFyZ2V0KS5nZXRTY2hlbWEoKSk7Ci0gICAgcmV0dXJuIChJTW9kZWwpYWRhcHRlcjsKLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZDZiNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUF0dHJpYnV0ZUFkYXB0ZXIgaW1wbGVtZW50cyBJQWN0aW9uUHJvdmlkZXIKLXsKLSAgcHJvdGVjdGVkIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkKLSAgewotICAgIHJldHVybiAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pdGFyZ2V0OwotICB9Ci0gCi0gIHByb3RlY3RlZCBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRSZXNvbHZlZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkKLSAgewotICAgIHJldHVybiBnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQotICB7Ci0gICAgcmV0dXJuIGdldFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKS5pc0F0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlKCk7Ci0gIH0KLQotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZ2V0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRTY2hlbWEoKSk7Ci0gICAgcmV0dXJuIChJTW9kZWwpYWRhcHRlcjsKLSAgfQotCi0gIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTEwMDgKLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgeyAgICAKLSAgICBpZighaXNHbG9iYWwoKSkKLSAgICB7ICAgIAkgICAgCQotICAgIAlMaXN0IGRlZmF1bHRBY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAlkZWZhdWx0QWN0aW9ucyA9IEFycmF5cy5hc0xpc3Qoc3VwZXIuZ2V0QWN0aW9ucyhvYmplY3QpKTsKLSAgICAJCi0gICAgCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAlsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfU1RBUlRfSUQgKyBNZXNzYWdlcy5fVUlfQUNUSU9OX0lOU0VSVF9BVFRSSUJVVEUpOwotICAgIAlsaXN0LmFkZChBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbi5CRUZPUkVfU0VMRUNURURfSUQpOwotICAgIAlsaXN0LmFkZChBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbi5BRlRFUl9TRUxFQ1RFRF9JRCk7Ci0gICAgCWxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9FTkRfSUQpOwotICAgIAkKLSAgICAJaW50IGxlbiA9IGRlZmF1bHRBY3Rpb25zLnNpemUoKTsKLSAgICAJZm9yKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQotICAgIAl7Ci0gICAgCQlpZiAoZGVmYXVsdEFjdGlvbnMuZ2V0KGkpLmVxdWFscyhBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbi5JRCkpCi0gICAgCQl7Ci0gICAgCQkgIGNvbnRpbnVlOwotICAgIAkJfQotICAgIAkJbGlzdC5hZGQoZGVmYXVsdEFjdGlvbnMuZ2V0KGkpKTsKLSAgICAJfQotICAgICAgcmV0dXJuIChTdHJpbmcgW10pbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIAlyZXR1cm4gc3VwZXIuZ2V0QWN0aW9ucyhvYmplY3QpOwotICAgIH0gICAgCi0gIH0gIAotICAKLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzRm9jdXNBbGxvd2VkKCkKLSAgewotICAgIHJldHVybiBpc0dsb2JhbCgpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lUXVhbGlmaWVyKCkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSBnZXRSZXNvbHZlZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgaWYgKCFpc0dsb2JhbCgpKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRHbG9iYWxYU0RDb250YWluZXIoZ2V0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gICAgfQotICAgIHJldHVybiB0aGlzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlY2ViZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklHcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlLCBJQWN0aW9uUHJvdmlkZXIsIElHcmFwaEVsZW1lbnQsIElBRFRPYmplY3RMaXN0ZW5lcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIEFUVFJJQlVURV9HUk9VUF9SRUZfSUNPTl9JTUFHRSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBBVFRSSUJVVEVfR1JPVVBfUkVGX0RJU0FCTEVEX0lDT05fSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNEQXR0cmlidXRlR3JvdXBSZWZkaXMuZ2lmIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQVRUUklCVVRFX0dST1VQX0lDT05fSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNEQXR0cmlidXRlR3JvdXAuZ2lmIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQVRUUklCVVRFX0dST1VQX0RJU0FCTEVEX0lDT05fSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNEQXR0cmlidXRlR3JvdXBkaXMuZ2lmIik7Ci0JICAKLSAgcHJvdGVjdGVkIExpc3QgZmllbGRzID0gbnVsbDsKLSAgcHJvdGVjdGVkIExpc3Qgb3RoZXJUaGluZ3NUb0xpc3RlblRvID0gbnVsbDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZE9ubHk7Ci0gIHByb3RlY3RlZCBib29sZWFuIGNoYW5nZVJlYWRPbmx5RmllbGQgPWZhbHNlOwotICBwcm90ZWN0ZWQgSGFzaE1hcCBkZWxldGVkVHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGdldFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgdGFyZ2V0OwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgewotICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSB0YXJnZXQ7Ci0gICAgaWYgKHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5pc0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIHJldHVybiBpc1JlYWRPbmx5KCkgPyBBVFRSSUJVVEVfR1JPVVBfUkVGX0RJU0FCTEVEX0lDT05fSU1BR0UgOiBBVFRSSUJVVEVfR1JPVVBfUkVGX0lDT05fSU1BR0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gaXNSZWFkT25seSgpID8gQVRUUklCVVRFX0dST1VQX0RJU0FCTEVEX0lDT05fSU1BR0UgOiBBVFRSSUJVVEVfR1JPVVBfSUNPTl9JTUFHRTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHRhcmdldDsKLSAgICBTdHJpbmcgcmVzdWx0ID0geHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmlzQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkgPyB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24uZ2V0UU5hbWUoKSA6IHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5nZXROYW1lKCk7Ci0gICAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gTWVzc2FnZXMuX1VJX0xBQkVMX0FCU0VOVCA6IHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24geHNkQXR0cmlidXRlR3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSB0YXJnZXQ7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0geHNkQXR0cmlidXRlR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyAgICAKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAJT2JqZWN0IG8gPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgCWlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgIAl7Ci0gICAgCQlsaXN0LmFkZCgoKFhTREF0dHJpYnV0ZVVzZSlvKS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICAJfQotICAgIAllbHNlCi0gICAgCXsKLSAgICAJCWxpc3QuYWRkKG8pOwotICAgIAl9Ci0gICAgfQotICAgIFhTRFdpbGRjYXJkIHdpbGRjYXJkID0geHNkQXR0cmlidXRlR3JvdXAuZ2V0QXR0cmlidXRlV2lsZGNhcmRDb250ZW50KCk7Ci0gICAgaWYgKHdpbGRjYXJkICE9IG51bGwpCi0gICAgewotICAgIAlsaXN0LmFkZCh3aWxkY2FyZCk7Ci0gICAgfQotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdChsaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIChJVHJlZUVsZW1lbnRbXSkgYWRhcHRlckxpc3QudG9BcnJheShuZXcgSVRyZWVFbGVtZW50WzBdKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbi5JRCk7Ci0gICAgbGlzdC5hZGQoQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uLklEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoRGVsZXRlQWN0aW9uLklEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgT2JqZWN0IHNjaGVtYSA9IGdldEVkaXRvclNjaGVtYSgpOwotICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSBnZXRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKTsKLSAgICBpZiAoYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmdldFNjaGVtYSgpID09IHNjaGVtYSkKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb250YWluZXIgPSBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24uZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAoY29udGFpbmVyID09IHNjaGVtYSB8fCBjb250YWluZXIgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoU2V0SW5wdXRUb0dyYXBoVmlldy5JRCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsaXN0LmFkZChPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgIH0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLSAgICByZXR1cm4gKFN0cmluZyBbXSlsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRBZGROZXdGaWVsZENvbW1hbmQoU3RyaW5nIGZpZWxkS2luZCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IERlbGV0ZUNvbW1hbmQoZ2V0WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0RmllbGRzKCkKLSAgewotICAgIGlmIChmaWVsZHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBmaWVsZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBvdGhlclRoaW5nc1RvTGlzdGVuVG8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBYU0RWaXNpdG9yRm9yRmllbGRzIHZpc2l0b3IgPSBuZXcgWFNEVmlzaXRvckZvckZpZWxkcygpOwotICAgICAgdmlzaXRvci52aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihnZXRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKSk7Ci0gICAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KHZpc2l0b3IuY29uY3JldGVDb21wb25lbnRMaXN0LCBmaWVsZHMpOwotICAgICAgcG9wdWxhdGVBZGFwdGVyTGlzdCh2aXNpdG9yLnRoaW5nc1dlTmVlZFRvTGlzdGVuVG8sIG90aGVyVGhpbmdzVG9MaXN0ZW5Ubyk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvdGhlclRoaW5nc1RvTGlzdGVuVG8uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgaS5uZXh0KCk7Ci0gICAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUFEVE9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIElBRFRPYmplY3QgYWR0T2JqZWN0ID0gKElBRFRPYmplY3QpIGFkYXB0ZXI7Ci0gICAgICAgICAgYWR0T2JqZWN0LnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZpZWxkczsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNsZWFyRmllbGRzKCkKLSAgewotICAgIGlmIChvdGhlclRoaW5nc1RvTGlzdGVuVG8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvdGhlclRoaW5nc1RvTGlzdGVuVG8uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgaS5uZXh0KCk7Ci0gICAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUFEVE9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIElBRFRPYmplY3QgYWR0T2JqZWN0ID0gKElBRFRPYmplY3QpIGFkYXB0ZXI7Ci0gICAgICAgICAgYWR0T2JqZWN0LnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBmaWVsZHMgPSBudWxsOwotICAgIG90aGVyVGhpbmdzVG9MaXN0ZW5UbyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZ2V0WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkuZ2V0U2NoZW1hKCkpOwotICAgIHJldHVybiAoSU1vZGVsKWFkYXB0ZXI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgLy8gVE9ETyAoY3MpIC4uLiByZXZpZXcgdGhpcwotICAgIHJldHVybiBnZXRUZXh0KCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQWxsb3dlZCgpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24geHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgdGFyZ2V0OwotICAgIGlmICh4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24uaXNBdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIElBRFRPYmplY3QgZ2V0VG9wQ29udGFpbmVyKCkKLSAgewotICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyR3JvdXBEZWYgPSBnZXRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKTsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb250YWluZXIgPSBhdHRyR3JvdXBEZWYuZ2V0Q29udGFpbmVyKCk7Ci0gICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFhTRFNjaGVtYSB8fCBjb250YWluZXIgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICAgIHJldHVybiB0aGlzOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBnZXRHbG9iYWxYU0RDb250YWluZXIoYXR0ckdyb3VwRGVmKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykKLSAgewotICAgIGNsZWFyRmllbGRzKCk7Ci0gICAgc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgY2xlYXJGaWVsZHMoKTsKLSAgICBub3RpZnlMaXN0ZW5lcnModGhpcywgbnVsbCk7Ci0gIH0KLSAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0gIHsKLQkgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSB0YXJnZXQ7Ci0JICBpZiAoaGFzU2V0UmVhZE9ubHlGaWVsZCgpKQotCSAgewotCQkgIGRlbGV0ZWRUeXBlcy5wdXQoeHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmdldE5hbWUoKSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkgIGNoYW5nZVJlYWRPbmx5RmllbGQgPSBmYWxzZTsKLQkJICByZXR1cm4gcmVhZE9ubHk7Ci0JICB9Ci0JICBlbHNlCi0JICB7Ci0JCSAgaWYgKGRlbGV0ZWRUeXBlcyE9IG51bGwgKQotCQkgIHsKLQkJCSAgQm9vbGVhbiBkZWxldGVkID0gKChCb29sZWFuKWRlbGV0ZWRUeXBlcy5nZXQoeHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmdldE5hbWUoKSkpOwotCQkJICBpZiAoZGVsZXRlZCAhPSBudWxsICYmIGRlbGV0ZWQuYm9vbGVhblZhbHVlKCkpCi0JCQkgIHsKLQkJCQkgIHJldHVybiB0cnVlOwotCQkJICB9Ci0JCQkgIGVsc2UKLQkJCSAgewotCQkJCSAgcmV0dXJuIHN1cGVyLmlzUmVhZE9ubHkoKTsKLQkJCSAgfQotCQkgIH0KLQkJICBlbHNlCi0JCSAgewotCQkJICByZXR1cm4gc3VwZXIuaXNSZWFkT25seSgpOwotCQkgIH0KLQkgIH0KLSAgfQotCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSkgewotCQl0aGlzLnJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzU2V0UmVhZE9ubHlGaWVsZCgpIHsKLQkJcmV0dXJuIGNoYW5nZVJlYWRPbmx5RmllbGQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlUmVhZE9ubHlGaWVsZChib29sZWFuIHNldFJlYWRPbmx5RmllbGQpIHsKLQkJdGhpcy5jaGFuZ2VSZWFkT25seUZpZWxkID0gc2V0UmVhZE9ubHlGaWVsZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVEZWxldGVkTWFwKFN0cmluZyBhZGRDb21wb25lbnQpIHsKLQkJaWYgKGRlbGV0ZWRUeXBlcy5nZXQoYWRkQ29tcG9uZW50KSAhPSBudWxsKQotCQl7Ci0JCQlkZWxldGVkVHlwZXMuY2xlYXIoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREF0dHJpYnV0ZVVzZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREF0dHJpYnV0ZVVzZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4MzY1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBdHRyaWJ1dGVVc2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgWFNEQXR0cmlidXRlVXNlQWRhcHRlciBleHRlbmRzIFhTREJhc2VBdHRyaWJ1dGVBZGFwdGVyIGltcGxlbWVudHMgSUFjdGlvblByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0WFNEQXR0cmlidXRlVXNlKCkuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgfQotCi0gIHByb3RlY3RlZCBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRSZXNvbHZlZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkKLSAgewotICAgIHJldHVybiBnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFhTREF0dHJpYnV0ZVVzZSBnZXRYU0RBdHRyaWJ1dGVVc2UoKQotICB7Ci0gICAgcmV0dXJuIChYU0RBdHRyaWJ1dGVVc2UpdGFyZ2V0OwotICB9Ci0KLSAgcHVibGljIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VGV4dEZvckF0dHJpYnV0ZVVzZShnZXRYU0RBdHRyaWJ1dGVVc2UoKSwgdHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHRGb3JBdHRyaWJ1dGVVc2UoWFNEQXR0cmlidXRlVXNlIGF0dHJpYnV0ZVVzZSwgYm9vbGVhbiBzaG93VHlwZSkKLSAgewotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gYXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgICAKLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ICA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICByZXN1bHQuYXBwZW5kKGdldFRleHRGb3JBdHRyaWJ1dGUoYWQsIHNob3dUeXBlKSk7Ci0gICAgLyoKLSAgICBpZiAoeHNkQXR0cmlidXRlVXNlLmlzU2V0Q29uc3RyYWludCgpKQotICAgIHsKLSAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAiKTsKLSAgICAgIH0KLSAgICAgIHJlc3VsdC5hcHBlbmQoJzwnKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoeHNkQXR0cmlidXRlVXNlLmdldENvbnN0cmFpbnQoKSk7Ci0gICAgICByZXN1bHQuYXBwZW5kKCI9XCIiKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoeHNkQXR0cmlidXRlVXNlLmdldExleGljYWxWYWx1ZSgpKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoIlwiPiIpOwotICAgIH0KLSAgICAqLwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGdldFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0U2NoZW1hKCkpOwotICAgIHJldHVybiAoSU1vZGVsKWFkYXB0ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWVRdWFsaWZpZXIoKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IGdldFJlc29sdmVkWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldFRvcENvbnRhaW5lcigpCi0gIHsKLSAgICByZXR1cm4gZ2V0R2xvYmFsWFNEQ29udGFpbmVyKGdldFhTREF0dHJpYnV0ZVVzZSgpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlKCkKLSAgewotICAgIHJldHVybiBnZXRYU0RBdHRyaWJ1dGVVc2UoKS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREJhc2VBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RCYXNlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGIyNThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREJhc2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RCYXNlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSUFEVE9iamVjdCwgSVRyZWVFbGVtZW50Ci17ICAKLSAgcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAKLSAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgewotICAgIHJldHVybiB0eXBlID09IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHBvcHVsYXRlQWRhcHRlckxpc3QoTGlzdCBub3RpZmllckxpc3QsIExpc3QgYWRhcHRlckxpc3QpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBub3RpZmllckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudClvYmo7Ci0gICAgICAgIGFkYXB0ZXJMaXN0LmFkZChYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGNvbXBvbmVudCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBhZGFwdGVyTGlzdC5hZGQob2JqKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gIAotICAKLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBpZiAoIWxpc3RlbmVyTGlzdC5jb250YWlucyhsaXN0ZW5lcikpCi0gICAgewotICAgICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykKLSAgewotICAgIHN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLSAgICBub3RpZnlMaXN0ZW5lcnModGhpcywgbnVsbCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhPYmplY3QgY2hhbmdlZE9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgTGlzdCBjbG9uZWRMaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgY2xvbmVkTGlzdGVuZXJMaXN0LmFkZEFsbChsaXN0ZW5lckxpc3QpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGNsb25lZExpc3RlbmVyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lciA9IChJQURUT2JqZWN0TGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICBsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQodGhpcywgcHJvcGVydHkpOwotICAgIH0gICAgICAKLSAgfQotICAgIAotICBwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICBwdWJsaWMgSVRyZWVFbGVtZW50IGdldFBhcmVudCgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKQotICB7Ci0gICAgaWYgKGdldENoaWxkcmVuKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0KLSAgLyoqCi0gICAqIEltcGxlbWVudHMgSUZpZWxkIGdldENvbnRhaW5lclR5cGUuICBHZXQgcGFyZW50IENvbXBsZXggVHlwZSBjb250YWluaW5nIHRoZSBmaWVsZAotICAgKiBAcmV0dXJuIElDb21wbGV4VHlwZQotICAgKi8KLSAgcHVibGljIElDb21wbGV4VHlwZSBnZXRDb250YWluZXJUeXBlKCkKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSB0YXJnZXQ7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gbnVsbDsKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QgPSBudWxsOwotICAgIGZvciAocGFyZW50ID0geHNkQ29uY3JldGVDb21wb25lbnQuZ2V0Q29udGFpbmVyKCk7IHBhcmVudCAhPSBudWxsOyApCi0gICAgewotICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgY3QgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXBhcmVudDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgfQotICAgIGlmIChjdCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiAoSUNvbXBsZXhUeXBlKVhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoY3QpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0gIHsKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gbnVsbDsKLSAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgIGlmICh3aW5kb3cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBlZGl0b3JQYXJ0ID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgewotICAgICAgICB4c2RTY2hlbWEgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KXRhcmdldCkuZ2V0U2NoZW1hKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZWRpdG9yUGFydCA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsbEJhY2tDaGVja0lzUmVhZE9ubHkoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgWFNEU2NoZW1hIGVkaXRvclNjaGVtYSA9IChYU0RTY2hlbWEpZWRpdG9yUGFydC5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcyk7Ci0gICAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwgJiYgeHNkU2NoZW1hID09IGVkaXRvclNjaGVtYSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsbEJhY2tDaGVja0lzUmVhZE9ubHkoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgewotCi0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gZmFsbEJhY2tDaGVja0lzUmVhZE9ubHkoKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCl0YXJnZXQpLmdldEVsZW1lbnQoKTsKLSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElET01Ob2RlCi0gICAgICAgIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkKLSAgICB7Ci0gICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCBPYmplY3QgZ2V0RWRpdG9yU2NoZW1hKCkKLSAgewotICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICByZXR1cm4gZWRpdG9yUGFydC5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcyk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJQURUT2JqZWN0IGdldEdsb2JhbFhTRENvbnRhaW5lcihYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjID0gY29tcG9uZW50LmdldENvbnRhaW5lcigpOwotICAgIC8vIFdlIHdhbnQgdGhlIHRvcCBtb3N0IHN0cnVjdHVyYWwgY29tcG9uZW50Ci0gICAgd2hpbGUgKGMgIT0gbnVsbCAmJiAKLSAgICAgICAgICAgIShjLmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hKSAmJiAKLSAgICAgICAgICAgIShjIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSAmJgotICAgICAgICAgICAhKGMgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgJiYKLSAgICAgICAgICAgIShjIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pICYmCi0gICAgICAgICAgICEoYyBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikpCi0gICAgewotICAgICAgYyA9IGMuZ2V0Q29udGFpbmVyKCk7Ci0gICAgfQotICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYyk7Ci0gICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgICAgcmV0dXJuIChJQURUT2JqZWN0KWFkYXB0ZXI7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogSW5kaWNhdGVzIHRoZSBwcmVzZW5jZSBvZiBhbiBhYnN0cmFjdCBhdHRyaWJ1dGUKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21wb25lbnQncyBhYnN0cmFjdCBhdHRyaWJ1dGUgaXMgdHJ1ZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREJhc2VBdHRyaWJ1dGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RCYXNlQXR0cmlidXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTg0MDc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREJhc2VBdHRyaWJ1dGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklHcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuT3BlbkluTmV3RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlTmFtZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi0vLyBhIGJhc2UgYWRhcHRlciBmb3IgcmV1c2UgYnkgYW4gQXR0cmlidXRlVXNlIGFuZCBBdHRyaWJ1dGVEZWNsYXJhdGlvbgotLy8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYU0RCYXNlQXR0cmlidXRlQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgSUZpZWxkLCBJR3JhcGhFbGVtZW50Ci17Ci0gIHByb3RlY3RlZCBhYnN0cmFjdCBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0UmVzb2x2ZWRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotCi0gIHB1YmxpYyBYU0RCYXNlQXR0cmlidXRlQWRhcHRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoIWlzR2xvYmFsKCkpCi0gICAgewotICAgICAgbGlzdC5hZGQoQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uSUQpOwotICAgICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIH0KLSAgICBsaXN0LmFkZChEZWxldGVBY3Rpb24uSUQpOwotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBPYmplY3Qgc2NoZW1hID0gZ2V0RWRpdG9yU2NoZW1hKCk7Ci0gICAgaWYgKGdldFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0U2NoZW1hKCkgPT0gc2NoZW1hKQotICAgIHsKLSAgICAgIGlmIChnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldENvbnRhaW5lcigpID09IHNjaGVtYSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoU2V0SW5wdXRUb0dyYXBoVmlldy5JRCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsaXN0LmFkZChPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgIH0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLSAgICByZXR1cm4gKFN0cmluZ1tdKSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotICAgIHJldHVybiBuZXcgRGVsZXRlQ29tbWFuZChnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0S2luZCgpCi0gIHsKLSAgICByZXR1cm4gWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRzsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXJzKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gLTM7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1pbk9jY3VycygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIC0zOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24gPSBnZXRSZXNvbHZlZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSByZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldE5hbWUoKTsKLSAgICByZXR1cm4gKG5hbWUgPT0gbnVsbCkgPyAiIiA6IG5hbWU7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBJVHlwZSBnZXRUeXBlKCkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZ2V0UmVzb2x2ZWRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgcmV0dXJuICh0ZCAhPSBudWxsKSA/IChJVHlwZSkgWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh0ZCkgOiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpCi0gIHsKLSAgICBJVHlwZSB0eXBlID0gZ2V0VHlwZSgpOwotICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgeyAgCi0gICAgICByZXR1cm4gdHlwZS5nZXROYW1lKCk7Ci0gICAgfQotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWVRdWFsaWZpZXIoKQotICB7Ci0gICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IGdldFJlc29sdmVkWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICBpZiAoYXR0ciAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChhdHRyLmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGF0dHIuZ2V0VHlwZURlZmluaXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU1heE9jY3Vyc0NvbW1hbmQoaW50IG1heE9jY3VycykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQoaW50IG1pbk9jY3VycykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU5hbWVDb21tYW5kKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuIG5ldyBVcGRhdGVOYW1lQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9OQU1FLCBnZXRSZXNvbHZlZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCksIG5hbWUpOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlVHlwZU5hbWVDb21tYW5kKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHF1YWlsaWZpZXIpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50I2dldEltYWdlKCkKLSAgICovCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbiA9IGdldFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7ICAvLyBkb24ndCB3YW50IHRoZSByZXNvbHZlZCBhdHRyaWJ1dGUKLSAgICBpZiAoeHNkQXR0cmlidXRlRGVjbGFyYXRpb24uaXNBdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIGlmIChpc1JlYWRPbmx5KCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNEQXR0cmlidXRlUmVmZGlzLmdpZiIpOwotICAgICAgfQotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEQXR0cmlidXRlUmVmLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREF0dHJpYnV0ZWRpcy5naWYiKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREF0dHJpYnV0ZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQjZ2V0VGV4dCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgcmV0dXJuIGdldFRleHRGb3JBdHRyaWJ1dGUoZ2V0UmVzb2x2ZWRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLCB0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dEZvckF0dHJpYnV0ZShYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCwgYm9vbGVhbiBzaG93VHlwZSkKLSAgewotICAgIGFkID0gYWQuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgIFN0cmluZyBuYW1lID0gYWQuZ2V0TmFtZSgpOwotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCIgIiArIE1lc3NhZ2VzLl9VSV9MQUJFTF9BQlNFTlQgKyAiICIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQuYXBwZW5kKG5hbWUpOwotICAgIH0KLSAgICBpZiAoYWQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSA9PSBudWxsICYmIGFkLmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCIgOiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgLy8gcmVzdWx0LmFwcGVuZChyZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0UU5hbWUoeHNkQXR0cmlidXRlRGVjbGFyYXRpb24pKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoYWQuZ2V0VHlwZURlZmluaXRpb24oKS5nZXROYW1lKCkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGdldFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0U2NoZW1hKCkpOwotICAgIHJldHVybiAoSU1vZGVsKWFkYXB0ZXI7Ci0gIH0gIAotCi0gIHB1YmxpYyBib29sZWFuIGlzRm9jdXNBbGxvd2VkKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RDaGlsZFV0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRENoaWxkVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTExMTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRENoaWxkVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2g7Ci0gICAgICAgICAgICAgIAotCi1wdWJsaWMgY2xhc3MgWFNEQ2hpbGRVdGlsaXR5Ci17ICAgICAgICAgICAgICAKLSAgc3RhdGljIHB1YmxpYyBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgWFNEQ2hpbGRWaXNpdG9yIHZpc2l0b3IgPSBuZXcgWFNEQ2hpbGRWaXNpdG9yKG1vZGVsKTsKLSAgICB2aXNpdG9yLnZpc2l0WFNET2JqZWN0KG1vZGVsKTsKLSAgICByZXR1cm4gdmlzaXRvci5saXN0OwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBMaXN0IGdldEltbWVkaWF0ZURlcml2ZWRUeXBlcyhYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUpCi0gIHsKLSAgICBBcnJheUxpc3QgdHlwZXNEZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8vIEEgaGFuZHkgY29udmVuaWVuY2UgbWV0aG9kIHF1aWNrbHkgZ2V0cyBhbGwgCi0gICAgLy8gdHlwZURlZmluaXRpb25zIHdpdGhpbiBvdXIgc2NoZW1hOyBub3RlIHRoYXQgCi0gICAgLy8gd2hldGhlciBvciBub3QgdGhpcyByZXR1cm5zIHR5cGVzIGluIGluY2x1ZGVkLCAKLSAgICAvLyBpbXBvcnRlZCwgb3IgcmVkZWZpbmVkIHNjaGVtYXMgaXMgc3ViamVjdCB0byBjaGFuZ2UKLSAgICBMaXN0IHR5cGVkZWZzID0gY29tcGxleFR5cGUuZ2V0U2NoZW1hKCkuZ2V0VHlwZURlZmluaXRpb25zKCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZGVmcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVkZWYgPSAoWFNEVHlwZURlZmluaXRpb24paXRlci5uZXh0KCk7Ci0gICAgICAvLyBXYWxrIHRoZSBiYXNlVHlwZXMgZnJvbSB0aGlzIHR5cGVkZWYgc2VlaW5nIGlmIGFueSAKLSAgICAgIC8vIG9mIHRoZW0gbWF0Y2ggdGhlIHJlcXVlc3RlZCBvbmUKLSAgICAgIGlmIChjb21wbGV4VHlwZS5lcXVhbHModHlwZWRlZi5nZXRCYXNlVHlwZSgpKSkKLSAgICAgIHsKLSAgICAgICAgLy8gV2UgZm91bmQgaXQsIHJldHVybiB0aGUgb3JpZ2luYWwgb25lIGFuZCBjb250aW51ZQotICAgICAgICB0eXBlc0Rlcml2ZWRGcm9tLmFkZCh0eXBlZGVmKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVzRGVyaXZlZEZyb207Ci0gIH0KLSAgLy8gVE9ETy4uLiB1c2UgdGhlIFhTRFZpc2l0b3IgZGVmaW5lZCBpbiB4c2RlZGl0b3IudXRpbCBpbnN0ZWFkCi0gIC8vICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTRENoaWxkVmlzaXRvciBleHRlbmRzIFhTRFZpc2l0b3IKLSAgewotICAgIE9iamVjdCByb290OwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHB1YmxpYyBYU0RDaGlsZFZpc2l0b3IoT2JqZWN0IHJvb3QpCi0gICAgewotICAgICAgdGhpcy5yb290ID0gcm9vdDsKLSAgICB9ICAgICAgICAgICAgICAgICAgCi0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTRE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIGlmICh4c2RNb2RlbEdyb3VwICE9IHJvb3QpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKHhzZE1vZGVsR3JvdXApOyAKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHN1cGVyLnZpc2l0WFNETW9kZWxHcm91cCh4c2RNb2RlbEdyb3VwKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGlmICh4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbiAhPSByb290KQotICAgICAgewotICAgICAgICBsaXN0LmFkZCh4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbik7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzdXBlci52aXNpdFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTREVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIGlmICh4c2RFbGVtZW50RGVjbGFyYXRpb24gIT0gcm9vdCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoeHNkRWxlbWVudERlY2xhcmF0aW9uKTsKLSAgICAgICAgCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzdXBlci52aXNpdFhTREVsZW1lbnREZWNsYXJhdGlvbih4c2RFbGVtZW50RGVjbGFyYXRpb24pOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgaWYgKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiAhPSByb290KQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSAhPSBudWxsIHx8IGdldE1vZGVsQ2hpbGRyZW4oeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKS5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3VwZXIudmlzaXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKTsKLSAgICAgIH0KLSAgICB9ICAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RXaWxkY2FyZChYU0RXaWxkY2FyZCB4c2RXaWxkQ2FyZCkKLSAgICB7Ci0gICAgICBpZiAoeHNkV2lsZENhcmQgIT0gcm9vdCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgbGlzdC5hZGQoeHNkV2lsZENhcmQpOyAgICAgICAgCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzdXBlci52aXNpdFhTRFdpbGRjYXJkKHhzZFdpbGRDYXJkKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNEVmlzaXRvcgotICB7IAotICAgIGludCBpbmRlbnQgPSAwOwotICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTRE9iamVjdChPYmplY3Qgb2JqZWN0KQotICAgIHsgICAgICAgICAgIAotICAgICAgaWYgKG9iamVjdCA9PSBudWxsKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIFhTRFN3aXRjaCB0aGVTd2l0Y2ggPSBuZXcgWFNEU3dpdGNoKCkKLSAgICAgIHsgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBvYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbihvYmplY3QpOwotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IAotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZVVzZShYU0RBdHRyaWJ1dGVVc2Ugb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYU0RBdHRyaWJ1dGVVc2Uob2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTREVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYU0RFbGVtZW50RGVjbGFyYXRpb24ob2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0WFNETW9kZWxHcm91cERlZmluaXRpb24ob2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gc3VwZXIuY2FzZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKG9iamVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYU0RNb2RlbEdyb3VwKG9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHN1cGVyLmNhc2VYU0RNb2RlbEdyb3VwKG9iamVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RQYXJ0aWNsZShYU0RQYXJ0aWNsZSBvYmplY3QpCi0gICAgICAgIHsgCi0gICAgICAgICAgdmlzaXRYU0RQYXJ0aWNsZShvYmplY3QpOwotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IAotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFNjaGVtYShYU0RTY2hlbWEgb2JqZWN0KQotICAgICAgICB7IAotICAgICAgICAgIHZpc2l0WFNEU2NoZW1hKG9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEV2lsZGNhcmQoWFNEV2lsZGNhcmQgb2JqZWN0KQotICAgICAgICB7IAotICAgICAgICAgIHZpc2l0WFNEV2lsZGNhcmQob2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAKLSAgICAgIH07Ci0gICAgICB0aGVTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3Qpb2JqZWN0KTsKLSAgICB9Ci0gICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTREF0dHJpYnV0ZVVzZShYU0RBdHRyaWJ1dGVVc2UgeHNkQXR0cmlidXRlVXNlKQotICAgIHsgIAotLy8gICAgICBwcmludEluZGVudGVkKCJAIiArIHhzZEF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RTY2hlbWEoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgICB7ICAgICAgICAgCi0gICAgICBpbmRlbnQgKz0gMjsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICB2aXNpdFhTRE9iamVjdChpdGVyYXRvci5uZXh0KCkpOwotICAgICAgfQotICAgICAgaW5kZW50IC09IDI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7ICAgICAgCi0gICAgICBpbmRlbnQgKz0gMjsgICAgICAgICAKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAodGQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGQgPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgdmlzaXRYU0RPYmplY3QodGQpOwotICAgICAgaW5kZW50IC09IDI7Ci0gICAgfQotICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBpbmRlbnQgKz0gMjsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGVVc2VzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsgICAgICAgIAotICAgICAgICB2aXNpdFhTRE9iamVjdChpLm5leHQoKSk7Ci0gICAgICB9Ci0gICAgICB2aXNpdFhTRE9iamVjdCh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0Q29udGVudCgpKTsKLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNETW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXApCi0gICAgewotICAgICAgaW5kZW50ICs9IDI7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0geHNkTW9kZWxHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICB2aXNpdFhTRE9iamVjdChpdGVyYXRvci5uZXh0KCkpOwotICAgICAgfSAKLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0gICAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBpbmRlbnQgKz0gMjsKLSAgICAgIHZpc2l0WFNET2JqZWN0KHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRNb2RlbEdyb3VwKCkpOwotICAgICAgaW5kZW50IC09IDI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RQYXJ0aWNsZShYU0RQYXJ0aWNsZSB4c2RQYXJ0aWNsZSkKLSAgICB7Ci0gICAgICBpbmRlbnQgKz0gMjsgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKHhzZFBhcnRpY2xlLmdldENvbnRlbnQoKSAhPSBudWxsKQotICAgICAgICB2aXNpdFhTRE9iamVjdCh4c2RQYXJ0aWNsZS5nZXRDb250ZW50KCkpOwotICAgICAgaW5kZW50IC09IDI7Ci0gICAgfSAKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNEV2lsZGNhcmQoWFNEV2lsZGNhcmQgb2JqZWN0KQotICAgIHsgCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmludEluZGVudGVkKFN0cmluZyBzdHJpbmcpCi0gICAgeyAKLSAgICAgIC8vU3RyaW5nIHNwYWNlcyA9ICIiOwotICAgICAgLy9mb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKQotICAgICAgLy97Ci0gICAgICAvLyAgc3BhY2VzICs9ICIgIjsKLSAgICAgIC8vfSAgICAgICAgICAgICAgIAotICAgICAKLSAgICB9Ci0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZDdlOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBbnlBdHRyaWJ1dGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBbnlFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERW51bWVyYXRpb25GYWNldEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTRE1vZGVsR3JvdXBBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5TZXRCYXNlVHlwZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5TcGFjZUZpbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMubW9kZWwuVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0REZXJpdmF0aW9uTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbnVtZXJhdGlvbkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEVHlwZURlZmluaXRpb25BZGFwdGVyIGltcGxlbWVudHMgSUNvbXBsZXhUeXBlLCBJQURUT2JqZWN0TGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIExpc3QgZmllbGRzID0gbnVsbDsKLSAgcHJvdGVjdGVkIExpc3Qgb3RoZXJUaGluZ3NUb0xpc3RlblRvID0gbnVsbDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZE9ubHk7Ci0gIHByb3RlY3RlZCBib29sZWFuIGNoYW5nZVJlYWRPbmx5RmllbGQgPWZhbHNlOwotICBwcm90ZWN0ZWQgSGFzaE1hcCBkZWxldGVkVHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gIHB1YmxpYyBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gZ2V0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB0YXJnZXQ7Ci0gIH0KLQotICBwdWJsaWMgSVR5cGUgZ2V0U3VwZXJUeXBlKCkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZ2V0WFNEVHlwZURlZmluaXRpb24oKS5nZXRCYXNlVHlwZSgpOwotCi0gICAgLy8gdGVzdCB0byBmaWx0ZXIgb3V0IHRoZSAnYW55VHlwZScgdHlwZSAuLi4gZG9uJ3Qgd2FudCB0byBzZWUgdGhhdAotICAgIC8vCi0gICAgaWYgKHRkICE9IG51bGwgJiYgIXRkLmdldE5hbWUoKS5lcXVhbHMoImFueVR5cGUiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJldHVybiAoSVR5cGUpIFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQodGQpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNsZWFyRmllbGRzKCkKLSAgewotICAgIGlmIChvdGhlclRoaW5nc1RvTGlzdGVuVG8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvdGhlclRoaW5nc1RvTGlzdGVuVG8uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgaS5uZXh0KCk7Ci0gICAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUFEVE9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIElBRFRPYmplY3QgYWR0T2JqZWN0ID0gKElBRFRPYmplY3QpIGFkYXB0ZXI7Ci0gICAgICAgICAgYWR0T2JqZWN0LnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBmaWVsZHMgPSBudWxsOwotICAgIG90aGVyVGhpbmdzVG9MaXN0ZW5UbyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRGaWVsZHMoKQotICB7Ci0gICAgaWYgKGZpZWxkcyA9PSBudWxsKQotICAgIHsKLSAgICAgIGZpZWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIG90aGVyVGhpbmdzVG9MaXN0ZW5UbyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgWFNEVmlzaXRvckZvckZpZWxkcyB2aXNpdG9yID0gbmV3IFhTRFZpc2l0b3JGb3JGaWVsZHNXaXRoU3BhY2VGaWxsZXJzKCk7Ci0gICAgICB2aXNpdG9yLnZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpKTsKLSAgICAgIHBvcHVsYXRlQWRhcHRlckxpc3QodmlzaXRvci5jb25jcmV0ZUNvbXBvbmVudExpc3QsIGZpZWxkcyk7Ci0gICAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KHZpc2l0b3IudGhpbmdzV2VOZWVkVG9MaXN0ZW5Ubywgb3RoZXJUaGluZ3NUb0xpc3RlblRvKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG90aGVyVGhpbmdzVG9MaXN0ZW5Uby5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgSUFEVE9iamVjdCBhZHRPYmplY3QgPSAoSUFEVE9iamVjdCkgYWRhcHRlcjsKLSAgICAgICAgICBhZHRPYmplY3QucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmllbGRzOwotICB9Ci0KLSAgY2xhc3MgWFNEVmlzaXRvckZvckZpZWxkc1dpdGhTcGFjZUZpbGxlcnMgZXh0ZW5kcyBYU0RWaXNpdG9yRm9yRmllbGRzCi0gIHsKLSAgICBwdWJsaWMgWFNEVmlzaXRvckZvckZpZWxkc1dpdGhTcGFjZUZpbGxlcnMoKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyaWJ1dGVVc2UgPSAoWFNEQXR0cmlidXRlVXNlKSBvOwotICAgICAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQoYXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotICAgICAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKGF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJHcm91cCA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIG87Ci0gICAgICAgICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQoYXR0ckdyb3VwKTsKLSAgICAgICAgICBpZiAoYXR0ckdyb3VwLmlzQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgYXR0ckdyb3VwID0gYXR0ckdyb3VwLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoYXR0ckdyb3VwLmdldENvbnRlbnRzKCkuc2l6ZSgpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQobmV3IFNwYWNlRmlsbGVyKCJhdHRyaWJ1dGUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKGF0dHJHcm91cCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICBpbnQgbnVtT2ZDaGlsZHJlbiA9IG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5zaXplKCk7Ci0gICAgICBpZiAobnVtT2ZDaGlsZHJlbiA9PSAwKQotICAgICAgewotICAgICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKG5ldyBTcGFjZUZpbGxlcigiZWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgc3VwZXIudmlzaXRNb2RlbEdyb3VwKG1vZGVsR3JvdXApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWYpCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gcmVzb2x2ZWRNb2RlbEdyb3VwRGVmID0gbW9kZWxHcm91cERlZi5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAodmlzaXRlZEdyb3Vwcy5jb250YWlucyhyZXNvbHZlZE1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpKSkKLSAgICAgIHsKLSAgICAgICAgY29uY3JldGVDb21wb25lbnRMaXN0LmFkZChuZXcgU3BhY2VGaWxsZXIoImVsZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIHN1cGVyLnZpc2l0TW9kZWxHcm91cERlZmluaXRpb24obW9kZWxHcm91cERlZik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0TW9kZWxHcm91cHMoKQotICB7Ci0gICAgTGlzdCBncm91cHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZ3JvdXBzLmFkZEFsbChYU0RDaGlsZFV0aWxpdHkuZ2V0TW9kZWxDaGlsZHJlbihnZXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKSkpOwotICAgIHJldHVybiBncm91cHM7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVHcm91cENvbnRlbnQoKQotICB7Ci0gICAgRUxpc3QgYXR0ckNvbnRlbnQgPSBnZXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKS5nZXRBdHRyaWJ1dGVDb250ZW50cygpOwotICAgIExpc3QgYXR0clVzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgZm9yIChJdGVyYXRvciBpdCA9IGF0dHJDb250ZW50Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KSBpdC5uZXh0KCk7Ci0KLSAgICAgIGlmIChhdHRyR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgYXR0ckdyb3VwQ29udGVudDsKLSAgICAgICAgbGlzdC5hZGQoWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChhdHRyaWJ1dGVHcm91cERlZmluaXRpb24pKTsKLSAgICAgICAgZ2V0QXR0cmlidXRlVXNlcyhhdHRyaWJ1dGVHcm91cERlZmluaXRpb24sIGF0dHJVc2VzKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYXR0clVzZXMuYWRkKGF0dHJHcm91cENvbnRlbnQpOwotICAgICAgICBsaXN0LmFkZChuZXcgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyKHRoaXMpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXhUeXBlKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKQotICB7Ci0gICAgY2xlYXJGaWVsZHMoKTsKLSAgICBzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVOYW1lQ29tbWFuZChTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIHJldHVybiBuZXcgVXBkYXRlTmFtZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfTkFNRSwgZ2V0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCksIG5ld05hbWUpOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0QWRkTmV3RmllbGRDb21tYW5kKFN0cmluZyBmaWVsZEtpbmQpCi0gIHsKLSAgICByZXR1cm4gbmV3IEFkZFhTREVsZW1lbnRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0ZJRUxELCBnZXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKSk7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotICAgIHJldHVybiBuZXcgRGVsZXRlQ29tbWFuZChnZXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgQWRkTmV3RmllbGRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZAotICB7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TmFtZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkS2luZDsKLQotICAgIEFkZE5ld0ZpZWxkQ29tbWFuZChTdHJpbmcgZGVmYXVsdE5hbWUsIFN0cmluZyBmaWVsZEtpbmQpCi0gICAgewotICAgICAgdGhpcy5kZWZhdWx0TmFtZSA9IGRlZmF1bHROYW1lOwotICAgICAgdGhpcy5maWVsZEtpbmQgPSBmaWVsZEtpbmQ7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBPYmplY3Qgc2NoZW1hID0gZ2V0RWRpdG9yU2NoZW1hKCk7Ci0gICAgCi0gICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlID0gZ2V0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgT2JqZWN0IGNvbnRlbnRUeXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLSAgICBYU0REZXJpdmF0aW9uTWV0aG9kIGRlcml2YXRpb24gPSBjb21wbGV4VHlwZS5nZXREZXJpdmF0aW9uTWV0aG9kKCk7Ci0gICAgaWYgKGNvbnRlbnRUeXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgTGlzdCBmaWVsZHMgPSBnZXRGaWVsZHMoKTsKLSAgICAgIGJvb2xlYW4gaGFzU2ltcGxlQ29udGVudEF0dHJpYnV0ZXMgPSBmYWxzZTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBmaWVsZHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBmaWVsZCA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgLy8gV2UgaGF2ZSBhdHRyaWJ1dGVzLCBzbyB3ZSBuZWVkIHRvIGFkZCB0aGUgY29tcGFydG1lbnQgZm9yIGhvdXNpbmcgdGhlIGF0dHJpYnV0ZXMKLSAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyKQotICAgICAgICB7Ci0gICAgICAgICAgaGFzU2ltcGxlQ29udGVudEF0dHJpYnV0ZXMgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChoYXNTaW1wbGVDb250ZW50QXR0cmlidXRlcyB8fCBYU0REZXJpdmF0aW9uTWV0aG9kLkVYVEVOU0lPTl9MSVRFUkFMLmVxdWFscyhkZXJpdmF0aW9uKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uSUQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoWFNERGVyaXZhdGlvbk1ldGhvZC5SRVNUUklDVElPTl9MSVRFUkFMLmVxdWFscyhkZXJpdmF0aW9uKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoQWRkWFNERW51bWVyYXRpb25GYWNldEFjdGlvbi5JRCk7Ci0gICAgICB9Ci0gICAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgICBsaXN0LmFkZChTZXRCYXNlVHlwZUFjdGlvbi5JRCk7Ci0gICAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgICBsaXN0LmFkZChEZWxldGVBY3Rpb24uSUQpOwotICAgICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGlzdC5hZGQoQWRkWFNERWxlbWVudEFjdGlvbi5JRCk7Ci0gICAgICBsaXN0LmFkZChBZGRYU0RFbGVtZW50QWN0aW9uLlJFRl9JRCk7Ci0gICAgICBsaXN0LmFkZChBZGRYU0RBbnlFbGVtZW50QWN0aW9uLklEKTsKLSAgICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICAgIGxpc3QuYWRkKEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLklEKTsKLSAgICAgIGxpc3QuYWRkKEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLlJFRl9JRCk7Ci0gICAgICBsaXN0LmFkZChBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb24uUkVGX0lEKTsKLSAgICAgIGxpc3QuYWRkKEFkZFhTREFueUF0dHJpYnV0ZUFjdGlvbi5JRCk7Ci0gICAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgICBsaXN0LmFkZChBZGRYU0RNb2RlbEdyb3VwQWN0aW9uLlNFUVVFTkNFX0lEKTsKLSAgICAgIGxpc3QuYWRkKEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24uQ0hPSUNFX0lEKTsKLSAgICAgIGxpc3QuYWRkKEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24uQUxMX0lEKTsKLSAgICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICAgIGxpc3QuYWRkKERlbGV0ZUFjdGlvbi5JRCk7Ci0gICAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgICBsaXN0LmFkZChTZXRCYXNlVHlwZUFjdGlvbi5JRCk7Ci0gICAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgfQotICAgIGlmIChjb21wbGV4VHlwZS5nZXRTY2hlbWEoKSA9PSBzY2hlbWEpCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29udGFpbmVyID0gY29tcGxleFR5cGUuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAoY29udGFpbmVyID09IHNjaGVtYSB8fCBjb250YWluZXIgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoU2V0SW5wdXRUb0dyYXBoVmlldy5JRCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsaXN0LmFkZChPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgIH0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIGNsZWFyRmllbGRzKCk7Ci0gICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIG51bGwpOwotICB9Ci0KLSAgY2xhc3MgQm9ndXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLSAgewotICAgIEJvZ3VzQWN0aW9uKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgc3VwZXIucnVuKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIElUcmVlRWxlbWVudFtdIGdldENoaWxkcmVuKCkKLSAgewotICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24gPSBnZXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgLy8gQWRkIGF0dHJpYnV0ZXMKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0QXR0cmlidXRlQ29udGVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoKChYU0RBdHRyaWJ1dGVVc2Upb2JqKS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgZ2V0QXR0cmlidXRlVXNlcygoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBvYmosIGxpc3QpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBBZGQgZW51bWVyYXRpb25zICAgICAKLSAgICBib29sZWFuIGNhbkhhdmVFbnVtZXJhdGlvbnMgPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0Q29udGVudFR5cGUoKSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uICYmCQotICAgIAkJWFNERGVyaXZhdGlvbk1ldGhvZC5SRVNUUklDVElPTl9MSVRFUkFMLmVxdWFscyh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0RGVyaXZhdGlvbk1ldGhvZCgpKTsKLSAgICBpZiAoY2FuSGF2ZUVudW1lcmF0aW9ucykKLSAgICB7Ci0gICAgCU9iamVjdCBjb250ZW50VHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0gICAgCWlmIChjb250ZW50VHlwZSAhPSBudWxsKQotICAgIAl7Ci0gICAgCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiljb250ZW50VHlwZSkuZ2V0RW51bWVyYXRpb25GYWNldHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIAkJewotICAgIAkJCVhTREVudW1lcmF0aW9uRmFjZXQgZW51bWVyYXRpb25GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAJCQlsaXN0LmFkZChlbnVtZXJhdGlvbkZhY2V0KTsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLSAgICBYU0RXaWxkY2FyZCBhbnlBdHRyID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEF0dHJpYnV0ZVdpbGRjYXJkKCk7Ci0gICAgaWYgKGFueUF0dHIgIT0gbnVsbCkKLSAgICAgIGxpc3QuYWRkKGFueUF0dHIpOwotICAgIC8vIGdldCBpbW1lZGlhdGUgWFNEIE1vZGVsIEdyb3VwIG9mIHRoaXMgY29tcGxleCB0eXBlCi0gICAgaWYgKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRDb250ZW50KCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgeHNkQ29tcGxleFR5cGVDb250ZW50ID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldENvbnRlbnQoKTsKLSAgICAgIGlmICh4c2RDb21wbGV4VHlwZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgWFNEUGFydGljbGVDb250ZW50IHBhcnRpY2xlQ29udGVudCA9ICgoWFNEUGFydGljbGUpIHhzZENvbXBsZXhUeXBlQ29udGVudCkuZ2V0Q29udGVudCgpOwotICAgICAgICBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKHBhcnRpY2xlQ29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gZ2V0IGluaGVyaXRlZCBYU0QgTW9kZWwgR3JvdXAgb2YgdGhpcyBjb21wbGV4IHR5cGUKLSAgICBib29sZWFuIHNob3dJbmhlcml0ZWRDb250ZW50ID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFNob3dJbmhlcml0ZWRDb250ZW50KCk7Ci0gICAgaWYgKHNob3dJbmhlcml0ZWRDb250ZW50KQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAodHlwZURlZiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGJhc2VDVCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHR5cGVEZWY7Ci0gICAgICAgIGlmIChiYXNlQ1QuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCAmJiAhYmFzZUNULmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGJhc2VDVC5nZXRDb250ZW50KCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgeHNkQ29tcGxleFR5cGVDb250ZW50ID0gYmFzZUNULmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIGlmICh4c2RDb21wbGV4VHlwZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNEUGFydGljbGVDb250ZW50IHBhcnRpY2xlQ29udGVudCA9ICgoWFNEUGFydGljbGUpIHhzZENvbXBsZXhUeXBlQ29udGVudCkuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgICBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKHBhcnRpY2xlQ29udGVudCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KGxpc3QsIGFkYXB0ZXJMaXN0KTsKLSAgICByZXR1cm4gKElUcmVlRWxlbWVudFtdKSBhZGFwdGVyTGlzdC50b0FycmF5KG5ldyBJVHJlZUVsZW1lbnRbMF0pOwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgewotICAgIGlmIChpc1JlYWRPbmx5KCkpCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RDb21wbGV4VHlwZWRpcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTRENvbXBsZXhUeXBlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHRhcmdldDsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICByZXN1bHQuYXBwZW5kKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkgPT0gbnVsbCA/ICJsb2NhbCB0eXBlIiA6IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICBYU0RUeXBlRGVmaW5pdGlvbiBiYXNlVHlwZURlZmluaXRpb24gPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgaWYgKGJhc2VUeXBlRGVmaW5pdGlvbiAhPSBudWxsICYmIGJhc2VUeXBlRGVmaW5pdGlvbiAhPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0Q29udGVudCgpICYmIGJhc2VUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkgIT0gbnVsbCAmJiAhWFNEQ29uc3RhbnRzLmlzVVJUeXBlKGJhc2VUeXBlRGVmaW5pdGlvbikpCi0gICAgewotICAgIAkKLSAgIAl0cnl7Ci0gICAgCQlTdHJpbmcgcU5hbWUgPSBiYXNlVHlwZURlZmluaXRpb24uZ2V0UU5hbWUoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKTsKLSAgICAJCXJlc3VsdC5hcHBlbmQoIiA6ICIpOyAvLyROT04tTkxTLTEkCi0gICAgCSAgICByZXN1bHQuYXBwZW5kKHFOYW1lKTsKLSAgICAJfQotICAgIAljYXRjaCAoRXhjZXB0aW9uIGUpICAgIAkKLSAgICAJeyAgICAJCQotICAgIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIAl9Ci0gICAgCi0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2V0QXR0cmlidXRlVXNlcyhYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLCBMaXN0IGxpc3QpCi0gIHsKLSAgICBJdGVyYXRvciBpID0gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotCi0gICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCBhdHRyR3JvdXBDb250ZW50ID0gKFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCkgaS5uZXh0KCk7Ci0KLSAgICAgIGlmIChhdHRyR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBnZXRBdHRyaWJ1dGVVc2VzKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIGF0dHJHcm91cENvbnRlbnQsIGxpc3QpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBsaXN0LmFkZChYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGF0dHJHcm91cENvbnRlbnQpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZ2V0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCkuZ2V0U2NoZW1hKCkpOwotICAgIHJldHVybiAoSU1vZGVsKWFkYXB0ZXI7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQWxsb3dlZCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQW5vbnltb3VzKCkKLSAgewotICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24gPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB0YXJnZXQ7Ci0gICAgcmV0dXJuICEoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSB8fAotICAgICAgICAgICAgIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSk7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKQotICB7Ci0gICAgcmV0dXJuIGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpLmlzQWJzdHJhY3QoKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0Q29udGVudFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpLmdldENvbnRlbnQoKTsKLSAgfQotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLSAgewotCSAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHRhcmdldDsKLQkgIGlmIChoYXNTZXRSZWFkT25seUZpZWxkKCkpCi0JICB7Ci0JCSAgZGVsZXRlZFR5cGVzLnB1dCh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0TmFtZSgpLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCSAgY2hhbmdlUmVhZE9ubHlGaWVsZCA9IGZhbHNlOwotCQkgIHJldHVybiByZWFkT25seTsKLQkgIH0KLQkgIGVsc2UKLQkgIHsKLQkJICBpZiAoZGVsZXRlZFR5cGVzIT0gbnVsbCApCi0JCSAgewotCQkJICBCb29sZWFuIGRlbGV0ZWQgPSAoKEJvb2xlYW4pZGVsZXRlZFR5cGVzLmdldCh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKSk7Ci0JCQkgIGlmIChkZWxldGVkICE9IG51bGwgJiYgZGVsZXRlZC5ib29sZWFuVmFsdWUoKSkKLQkJCQkgIHJldHVybiB0cnVlOwotCQkJICBlbHNlIHJldHVybiBzdXBlci5pc1JlYWRPbmx5KCk7Ci0JCSAgfQotCQkgIGVsc2UKLQkJCSAgcmV0dXJuIHN1cGVyLmlzUmVhZE9ubHkoKTsKLQkgIH0KLSAgfQotCi1wdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7Ci0JdGhpcy5yZWFkT25seSA9IHJlYWRPbmx5OwotfQotCi1wdWJsaWMgYm9vbGVhbiBoYXNTZXRSZWFkT25seUZpZWxkKCkgewotCXJldHVybiBjaGFuZ2VSZWFkT25seUZpZWxkOwotfQotCi1wdWJsaWMgdm9pZCBzZXRDaGFuZ2VSZWFkT25seUZpZWxkKGJvb2xlYW4gc2V0UmVhZE9ubHlGaWVsZCkgewotCXRoaXMuY2hhbmdlUmVhZE9ubHlGaWVsZCA9IHNldFJlYWRPbmx5RmllbGQ7Ci19Ci0KLXB1YmxpYyB2b2lkIHVwZGF0ZURlbGV0ZWRNYXAoU3RyaW5nIGFkZENvbXBvbmVudCkKLXsKLQlpZiAoZGVsZXRlZFR5cGVzLmdldChhZGRDb21wb25lbnQpICE9IG51bGwpCi0JewotCQlkZWxldGVkVHlwZXMuY2xlYXIoKTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNTAxZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLlRleHRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLklBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuT3BlbkluTmV3RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0TXVsdGlwbGljaXR5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0VHlwZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBleHRlbmRzIFhTRFBhcnRpY2xlQWRhcHRlciBpbXBsZW1lbnRzIElGaWVsZCwgSUFjdGlvblByb3ZpZGVyLCBJQW5ub3RhdGlvblByb3ZpZGVyLCBJR3JhcGhFbGVtZW50Ci17Ci0gIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkKLSAgewotICAgIHJldHVybiAoWFNERWxlbWVudERlY2xhcmF0aW9uKSB0YXJnZXQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldE5hbWUoKTsKLSAgICByZXR1cm4gKG5hbWUgPT0gbnVsbCkgPyAiIiA6IG5hbWU7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKQotICB7Ci0gICAgSVR5cGUgdHlwZSA9IGdldFR5cGUoKTsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsgIAotICAgICAgcmV0dXJuIHR5cGUuZ2V0TmFtZSgpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWVRdWFsaWZpZXIoKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICBwdWJsaWMgSVR5cGUgZ2V0VHlwZSgpCi0gIHsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAvL2lmICh0ZCAhPSBudWxsICYmCi0gICAgLy8gICAgdGQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCAmJiB0ZC5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKSkgcmV0dXJuIG51bGw7Ci0gICAgcmV0dXJuICh0ZCAhPSBudWxsKSA/IChJVHlwZSkgWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh0ZCkgOiBudWxsOwotICB9Ci0gCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgdGFyZ2V0OwotICAgIAotICAgIGlmICgheHNkRWxlbWVudERlY2xhcmF0aW9uLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgaWYgKGlzUmVhZE9ubHkoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RFbGVtZW50ZGlzLmdpZiIpOwotICAgICAgfQotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNERWxlbWVudC5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKGlzUmVhZE9ubHkoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RFbGVtZW50UmVmZGlzLmdpZiIpOwotICAgICAgfSAgICAgICAgCi0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RFbGVtZW50UmVmLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSB0YXJnZXQ7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgLy9TdHJpbmcgbmFtZSA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbiAhPSByZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiA/IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRRTmFtZSgpIDogeHNkRWxlbWVudERlY2xhcmF0aW9uLmdldE5hbWUoKTsKLSAgICBTdHJpbmcgbmFtZSA9IHJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uLmdldE5hbWUoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQuYXBwZW5kKE1lc3NhZ2VzLl9VSV9MQUJFTF9BQlNFTlQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICB9Ci0KLSAgICBpZiAoIXhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc0dsb2JhbCgpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRFbGVtZW50KCk7Ci0gICAgICBib29sZWFuIGhhc01pbk9jY3VycyA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFKTsKLSAgICAgIGJvb2xlYW4gaGFzTWF4T2NjdXJzID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1BWE9DQ1VSU19BVFRSSUJVVEUpOwotCi0gICAgICBpZiAoaGFzTWluT2NjdXJzIHx8IGhhc01heE9jY3VycykKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIFsiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoaGFzTWluT2NjdXJzKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IG1pbiA9ICgoWFNEUGFydGljbGUpIHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRDb250YWluZXIoKSkuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgaWYgKG1pbiA9PSBYU0RQYXJ0aWNsZS5VTkJPVU5ERUQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1pbikpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIC8vIHByaW50IGRlZmF1bHQKLSAgICAgICAgewotICAgICAgICAgIGludCBtaW4gPSAoKFhTRFBhcnRpY2xlKSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGFpbmVyKCkpLmdldE1pbk9jY3VycygpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWluKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhhc01heE9jY3VycykKLSAgICAgICAgewotICAgICAgICAgIGludCBtYXggPSAoKFhTRFBhcnRpY2xlKSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGFpbmVyKCkpLmdldE1heE9jY3VycygpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi4uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAobWF4ID09IFhTRFBhcnRpY2xlLlVOQk9VTkRFRCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWF4KSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgLy8gcHJpbnQgZGVmYXVsdAotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGludCBtYXggPSAoKFhTRFBhcnRpY2xlKSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGFpbmVyKCkpLmdldE1heE9jY3VycygpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWF4KSk7Ci0KLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24uZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSA9PSBudWxsICYmIHJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uLmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCIgOiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgLy8gcmVzdWx0LmFwcGVuZChyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRUeXBlRGVmaW5pdGlvbigpLmdldFFOYW1lKHhzZEVsZW1lbnREZWNsYXJhdGlvbikpOwotICAgICAgcmVzdWx0LmFwcGVuZChyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRUeXBlRGVmaW5pdGlvbigpLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgU3RyaW5nIHRleHQgPSByZXN1bHQudG9TdHJpbmcoKTsKLSAgICBTdHJpbmcgcHJvY2Vzc2VkU3RyaW5nID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKHRleHQsICI6Iik7Ci0gICAgcmV0dXJuIHByb2Nlc3NlZFN0cmluZzsKLQotICB9Ci0KLSAgcHVibGljIElUcmVlRWxlbWVudFtdIGdldENoaWxkcmVuKCkKLSAgewotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSB0YXJnZXQ7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSBudWxsOwotICAgIGlmICh4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICB0eXBlID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHR5cGUgPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKTsKLSAgICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHR5cGUgPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiAmJiB0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwgJiYgIXR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSkpCi0gICAgewotICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHR5cGU7Ci0gICAgICBpZiAoY3RUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICh4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNHbG9iYWwoKSkKLSAgICAgICAgICBsaXN0LmFkZChjdFR5cGUpOwotICAgICAgfQotICAgIH0KLQotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdChsaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIChJVHJlZUVsZW1lbnRbXSkgYWRhcHRlckxpc3QudG9BcnJheShuZXcgSVRyZWVFbGVtZW50WzBdKTsKLQotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEtpbmQoKQotICB7Ci0gICAgcmV0dXJuICJlbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZSgpCi0gIHsKLQkgIHJldHVybiAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgdGFyZ2V0KS5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTWF4T2NjdXJzQ29tbWFuZChpbnQgbWF4T2NjdXJzKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTWluT2NjdXJzQ29tbWFuZChpbnQgbWluT2NjdXJzKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTmFtZUNvbW1hbmQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gbmV3IFVwZGF0ZU5hbWVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX05BTUUsIGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCksIG5hbWUpOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlVHlwZU5hbWVDb21tYW5kKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHF1YWlsaWZpZXIpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbmV3IERlbGV0ZUNvbW1hbmQoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgaWYgKCFpc0dsb2JhbCgpKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9TVEFSVF9JRCArIE1lc3NhZ2VzLl9VSV9BQ1RJT05fSU5TRVJUX0VMRU1FTlQpOwotICAgICAgbGlzdC5hZGQoQWRkWFNERWxlbWVudEFjdGlvbi5CRUZPUkVfU0VMRUNURURfSUQpOwotICAgICAgbGlzdC5hZGQoQWRkWFNERWxlbWVudEFjdGlvbi5BRlRFUl9TRUxFQ1RFRF9JRCk7Ci0gICAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfRU5EX0lEKTsKLSAgICB9Ci0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfU1RBUlRfSUQgKyBNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9UWVBFKTsKLSAgICBsaXN0LmFkZChTZXRUeXBlQWN0aW9uLlNFVF9ORVdfVFlQRV9JRCk7Ci0gICAgbGlzdC5hZGQoU2V0VHlwZUFjdGlvbi5TRUxFQ1RfRVhJU1RJTkdfVFlQRV9JRCk7Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX0VORF9JRCk7Ci0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfU1RBUlRfSUQgKyBNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9NVUxUSVBMSUNJVFkpOwotICAgIGxpc3QuYWRkKFNldE11bHRpcGxpY2l0eUFjdGlvbi5SRVFVSVJFRF9JRCk7Ci0gICAgbGlzdC5hZGQoU2V0TXVsdGlwbGljaXR5QWN0aW9uLlpFUk9fT1JfT05FX0lEKTsKLSAgICBsaXN0LmFkZChTZXRNdWx0aXBsaWNpdHlBY3Rpb24uWkVST19PUl9NT1JFX0lEKTsKLSAgICBsaXN0LmFkZChTZXRNdWx0aXBsaWNpdHlBY3Rpb24uT05FX09SX01PUkVfSUQpOyAgICAKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfRU5EX0lEKTsKLQotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBsaXN0LmFkZChEZWxldGVBY3Rpb24uSUQpOwotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBPYmplY3Qgc2NoZW1hID0gZ2V0RWRpdG9yU2NoZW1hKCk7Ci0gICAgaWYgKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpID09IHNjaGVtYSkKLSAgICB7Ci0gICAgICBpZiAoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0Q29udGFpbmVyKCkgPT0gc2NoZW1hKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChTZXRJbnB1dFRvR3JhcGhWaWV3LklEKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxpc3QuYWRkKE9wZW5Jbk5ld0VkaXRvci5JRCk7Ci0gICAgfQotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBsaXN0LmFkZChTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uSUQpOwotICAgIHJldHVybiAoU3RyaW5nIFtdKWxpc3QudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotICAKLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgcmV0dXJuIGlzR2xvYmFsKCk7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgaWYgKCFpc0dsb2JhbCgpKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRHbG9iYWxYU0RDb250YWluZXIoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgIH0KLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuaXNBYnN0cmFjdCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RFbXB0eUZpZWxkQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNERW1wdHlGaWVsZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5YjhmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RFbXB0eUZpZWxkQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JVHlwZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBub3QgdXNlZAotICovCi1wdWJsaWMgY2xhc3MgWFNERW1wdHlGaWVsZEFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIElGaWVsZAotewotICBTdHJpbmcga2luZDsKLSAgcHVibGljIFhTREVtcHR5RmllbGRBZGFwdGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEtpbmQoKQotICB7Ci0gICAgcmV0dXJuIGtpbmQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEtpbmQoU3RyaW5nIGtpbmQpCi0gIHsKLSAgICB0aGlzLmtpbmQgPSBraW5kOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lUXVhbGlmaWVyKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBJVHlwZSBnZXRUeXBlKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TWluT2NjdXJzKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXJzKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gMDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTWluT2NjdXJzQ29tbWFuZChpbnQgbWluT2NjdXJzKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTWF4T2NjdXJzQ29tbWFuZChpbnQgbWF4T2NjdXJzKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlVHlwZU5hbWVDb21tYW5kKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHF1YWlsaWZpZXIpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVOYW1lQ29tbWFuZChTdHJpbmcgbmFtZSkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZSgpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RFbnVtZXJhdGlvbkZhY2V0QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNERW51bWVyYXRpb25GYWNldEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZkZmJlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RFbnVtZXJhdGlvbkZhY2V0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERW51bWVyYXRpb25GYWNldEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbnVtZXJhdGlvbkZhY2V0OwotCi1wdWJsaWMgY2xhc3MgWFNERW51bWVyYXRpb25GYWNldEFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIElBY3Rpb25Qcm92aWRlciwgSUdyYXBoRWxlbWVudAotewotICBwdWJsaWMgWFNERW51bWVyYXRpb25GYWNldCBnZXRYU0RFbnVtZXJhdGlvbkZhY2V0KCkKLSAgewotICAgIHJldHVybiAoWFNERW51bWVyYXRpb25GYWNldCl0YXJnZXQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBYU0RFbnVtZXJhdGlvbkZhY2V0QWRhcHRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfU1RBUlRfSUQgKyBNZXNzYWdlcy5fVUlfQUNUSU9OX0lOU0VSVF9FTlVNRVJBVElPTik7Ci0gICAgbGlzdC5hZGQoQWRkWFNERW51bWVyYXRpb25GYWNldEFjdGlvbi5CRUZPUkVfU0VMRUNURURfSUQpOwotICAgIGxpc3QuYWRkKEFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb24uQUZURVJfU0VMRUNURURfSUQpOwotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9FTkRfSUQpOwotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBsaXN0LmFkZChEZWxldGVBY3Rpb24uSUQpOwotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBsaXN0LmFkZChTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uSUQpOwotICAgIHJldHVybiAoU3RyaW5nIFtdKWxpc3QudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotICAKLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgewotICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFNpbXBsZUVudW0uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBEZWxldGVDb21tYW5kKGdldFhTREVudW1lcmF0aW9uRmFjZXQoKSk7Ci0gIH0KLQotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZ2V0WFNERW51bWVyYXRpb25GYWNldCgpLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIElBRFRPYmplY3QgZ2V0VG9wQ29udGFpbmVyKCkKLSAgewotICAgIHJldHVybiBnZXRHbG9iYWxYU0RDb250YWluZXIoZ2V0WFNERW51bWVyYXRpb25GYWNldCgpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRm9jdXNBbGxvd2VkKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIHJldHVybiBnZXRYU0RFbnVtZXJhdGlvbkZhY2V0KCkuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNETW9kZWxHcm91cEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRE1vZGVsR3JvdXBBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNGFjZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNETW9kZWxHcm91cEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQW55RWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RNb2RlbEdyb3VwQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5TZXRNdWx0aXBsaWNpdHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLk1vZGVsR3JvdXBGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNETW9kZWxHcm91cEFkYXB0ZXIgZXh0ZW5kcyBYU0RQYXJ0aWNsZUFkYXB0ZXIgaW1wbGVtZW50cyBJQWN0aW9uUHJvdmlkZXIsIElHcmFwaEVsZW1lbnQKLXsKLSAgWFNETW9kZWxHcm91cCBnZXRYU0RNb2RlbEdyb3VwKCkKLSAgewotICAgIHJldHVybiAoWFNETW9kZWxHcm91cCkgdGFyZ2V0OwotICB9Ci0KLSAgcHVibGljIFhTRE1vZGVsR3JvdXBBZGFwdGVyKCkKLSAgewotCi0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50I2dldEltYWdlKCkKLSAgICovCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAgPSBnZXRYU0RNb2RlbEdyb3VwKCk7Ci0gICAgaWYgKFhTRENvbXBvc2l0b3IuQ0hPSUNFX0xJVEVSQUwgPT0geHNkTW9kZWxHcm91cC5nZXRDb21wb3NpdG9yKCkpCi0gICAgewotICAgICAgcmV0dXJuIE1vZGVsR3JvdXBGaWd1cmUuQ0hPSUNFX0lDT05fSU1BR0U7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRENvbXBvc2l0b3IuQUxMX0xJVEVSQUwgPT0geHNkTW9kZWxHcm91cC5nZXRDb21wb3NpdG9yKCkpCi0gICAgewotICAgICAgcmV0dXJuIE1vZGVsR3JvdXBGaWd1cmUuQUxMX0lDT05fSU1BR0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gTW9kZWxHcm91cEZpZ3VyZS5TRVFVRU5DRV9JQ09OX0lNQUdFOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQjZ2V0VGV4dCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwID0gZ2V0WFNETW9kZWxHcm91cCgpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBTdHJpbmcgbmFtZSA9IHhzZE1vZGVsR3JvdXAuZ2V0Q29tcG9zaXRvcigpLmdldE5hbWUoKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQobmFtZSk7Ci0gICAgfQotCi0gICAgRWxlbWVudCBlbGVtZW50ID0geHNkTW9kZWxHcm91cC5nZXRFbGVtZW50KCk7Ci0KLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGJvb2xlYW4gaGFzTWluT2NjdXJzID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUpOwotICAgICAgYm9vbGVhbiBoYXNNYXhPY2N1cnMgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURSk7Ci0KLSAgICAgIGlmIChoYXNNaW5PY2N1cnMgfHwgaGFzTWF4T2NjdXJzKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIgWyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChoYXNNaW5PY2N1cnMpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgbWluID0gKChYU0RQYXJ0aWNsZSkgeHNkTW9kZWxHcm91cC5nZXRDb250YWluZXIoKSkuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgaWYgKG1pbiA9PSBYU0RQYXJ0aWNsZS5VTkJPVU5ERUQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1pbikpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIC8vIHByaW50IGRlZmF1bHQKLSAgICAgICAgewotICAgICAgICAgIGludCBtaW4gPSAoKFhTRFBhcnRpY2xlKSB4c2RNb2RlbEdyb3VwLmdldENvbnRhaW5lcigpKS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1pbikpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoYXNNYXhPY2N1cnMpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgbWF4ID0gKChYU0RQYXJ0aWNsZSkgeHNkTW9kZWxHcm91cC5nZXRDb250YWluZXIoKSkuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChtYXggPT0gWFNEUGFydGljbGUuVU5CT1VOREVEKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcudmFsdWVPZihtYXgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAvLyBwcmludCBkZWZhdWx0Ci0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKCIuLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaW50IG1heCA9ICgoWFNEUGFydGljbGUpIHhzZE1vZGVsR3JvdXAuZ2V0Q29udGFpbmVyKCkpLmdldE1heE9jY3VycygpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWF4KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAgPSBnZXRYU0RNb2RlbEdyb3VwKCk7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzZE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgICBPYmplY3Qgb2JqZWN0ID0gaS5uZXh0KCk7Ci0gICAgICAgWFNEUGFydGljbGVDb250ZW50IHBhcnRpY2xlID0gKChYU0RQYXJ0aWNsZSlvYmplY3QpLmdldENvbnRlbnQoKTsKLSAgICAgICBpZiAocGFydGljbGUgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICAgewotICAgICAgICAgbGlzdC5hZGQocGFydGljbGUpOwotICAgICAgIH0KLSAgICAgICBlbHNlIGlmIChwYXJ0aWNsZSBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgICAgIHsKLSAgICAgICAgIGxpc3QuYWRkKHBhcnRpY2xlKTsKLSAgICAgICB9Ci0gICAgICAgZWxzZSBpZiAocGFydGljbGUgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgIHsKLSAgICAgICAgIGxpc3QuYWRkKHBhcnRpY2xlKTsKLSAgICAgICB9Ci0gICAgICAgZWxzZSBpZiAocGFydGljbGUgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgICB7IAotICAgIAkgLy9saXN0LmFkZCgoKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKXBhcnRpY2xlKS5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCkpOwotICAgIAkgbGlzdC5hZGQocGFydGljbGUpOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiAoSVRyZWVFbGVtZW50IFtdKSBhZGFwdGVyTGlzdC50b0FycmF5KG5ldyBJVHJlZUVsZW1lbnRbMF0pOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIFhTRE1vZGVsR3JvdXAgZWxlbWVudCA9IChYU0RNb2RlbEdyb3VwKSBvYmplY3Q7Ci0gICAgcmV0dXJuIGVsZW1lbnQuZ2V0Q29udGFpbmVyKCk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyI2dldEFjdGlvbnMoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgQ29sbGVjdGlvbiBhY3Rpb25JRHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoQWRkWFNERWxlbWVudEFjdGlvbi5JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoQWRkWFNERWxlbWVudEFjdGlvbi5SRUZfSUQpOwotICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTREFueUVsZW1lbnRBY3Rpb24uSUQpOwotICAgICAvLyBBZGQgRWxlbWVudCBSZWYKLSAgICAgYWN0aW9uSURzLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoQWRkWFNETW9kZWxHcm91cEFjdGlvbi5TRVFVRU5DRV9JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoQWRkWFNETW9kZWxHcm91cEFjdGlvbi5DSE9JQ0VfSUQpOwotICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24uQUxMX0lEKTsKLSAgICAgYWN0aW9uSURzLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb24uTU9ERUxHUk9VUERFRklOSVRJT05SRUZfSUQpOwotLy8gICAgIGFjdGlvbklEcy5hZGQoQWRkRmllbGRBY3Rpb24uSUQpOwotICAgICBhY3Rpb25JRHMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICAgLy8gQWRkIEFueQotCi0gICAgIGFjdGlvbklEcy5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX1NUQVJUX0lEICsgTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfTVVMVElQTElDSVRZKTsKLSAgICAgYWN0aW9uSURzLmFkZChTZXRNdWx0aXBsaWNpdHlBY3Rpb24uUkVRVUlSRURfSUQpOwotICAgICBhY3Rpb25JRHMuYWRkKFNldE11bHRpcGxpY2l0eUFjdGlvbi5aRVJPX09SX09ORV9JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoU2V0TXVsdGlwbGljaXR5QWN0aW9uLlpFUk9fT1JfTU9SRV9JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoU2V0TXVsdGlwbGljaXR5QWN0aW9uLk9ORV9PUl9NT1JFX0lEKTsgICAgCi0gICAgIGFjdGlvbklEcy5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX0VORF9JRCk7Ci0gICAgCi0gICAgIGlmICghKGdldFBhcmVudCh0YXJnZXQpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pKQotICAgICB7Ci0gICAgICAgYWN0aW9uSURzLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgICAgYWN0aW9uSURzLmFkZChEZWxldGVBY3Rpb24uSUQpOwotICAgICB9ICAgIAotICAgICBhY3Rpb25JRHMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICAgYWN0aW9uSURzLmFkZChTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uSUQpOwotICAgICAgICAKLSAgICAgcmV0dXJuIChTdHJpbmcgW10pYWN0aW9uSURzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1heE9jY3VycygpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWF4T2NjdXJzKGdldFhTRE1vZGVsR3JvdXAoKSk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1pbk9jY3VycygpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWluT2NjdXJzKGdldFhTRE1vZGVsR3JvdXAoKSk7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwID0gZ2V0WFNETW9kZWxHcm91cCgpOwotICAgIHJldHVybiBnZXRHbG9iYWxYU0RDb250YWluZXIoeHNkTW9kZWxHcm91cCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQWxsb3dlZCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkgCi0gIHsKLSAgICByZXR1cm4gbmV3IERlbGV0ZUNvbW1hbmQoZ2V0WFNETW9kZWxHcm91cCgpKTsJCi0gIH0KLSAgCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChnZXRYU0RNb2RlbEdyb3VwKCkuZ2V0U2NoZW1hKCkpOwotICAgIHJldHVybiAoSU1vZGVsKWFkYXB0ZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmY2QxOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RNb2RlbEdyb3VwQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuT3BlbkluTmV3RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0TXVsdGlwbGljaXR5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLlNwYWNlRmlsbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEUGFydGljbGVBZGFwdGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZSwgSUFjdGlvblByb3ZpZGVyLCBJR3JhcGhFbGVtZW50LCBJQURUT2JqZWN0TGlzdGVuZXIKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBNT0RFTF9HUk9VUF9JQ09OID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREdyb3VwLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgTU9ERUxfR1JPVVBfRElTQUJMRURfSUNPTiA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RHcm91cGRpcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIE1PREVMX0dST1VQX1JFRl9JQ09OID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREdyb3VwUmVmLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgTU9ERUxfR1JPVVBfUkVGX0RJU0FCTEVEX0lDT04gPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNER3JvdXBSZWZkaXMuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotICBwcm90ZWN0ZWQgTGlzdCBmaWVsZHMgPSBudWxsOwotICBwcm90ZWN0ZWQgTGlzdCBvdGhlclRoaW5nc1RvTGlzdGVuVG8gPSBudWxsOwotICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkT25seTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2hhbmdlUmVhZE9ubHlGaWVsZCA9ZmFsc2U7Ci0gIHByb3RlY3RlZCBIYXNoTWFwIGRlbGV0ZWRUeXBlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gIAotICBwdWJsaWMgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgWFNETW9kZWxHcm91cERlZmluaXRpb24gZ2V0WFNETW9kZWxHcm91cERlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuIChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgdGFyZ2V0OwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgewotICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSB0YXJnZXQ7Ci0KLSAgICBpZiAoeHNkTW9kZWxHcm91cERlZmluaXRpb24uaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIGlmIChpc1JlYWRPbmx5KCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBNT0RFTF9HUk9VUF9SRUZfRElTQUJMRURfSUNPTjsKLSAgICAgIH0KLSAgICAgIHJldHVybiBNT0RFTF9HUk9VUF9SRUZfSUNPTjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpc1JlYWRPbmx5KCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBNT0RFTF9HUk9VUF9ESVNBQkxFRF9JQ09OOwotICAgICAgfQotICAgICAgcmV0dXJuIE1PREVMX0dST1VQX0lDT047Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSB0YXJnZXQ7Ci0gICAgaWYgKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRDb250YWluZXIoKSA9PSBudWxsICYmIHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldE5hbWUoKSA9PW51bGwpIHJldHVybiAiIjsgICAvLyBSZW1vdmVkCi0gICAgU3RyaW5nIHJlc3VsdCA9IHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSA/IHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFFOYW1lKCkgOiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXROYW1lKCk7Ci0gICAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gTWVzc2FnZXMuX1VJX0xBQkVMX0FCU0VOVCA6IHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBkZWYgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pdGFyZ2V0OwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAvLyBCdWcyNDYwMzYgLSBuZWVkIHRvIHN0b3Agc2hvd2luZyBlbGVtZW50IGNvbnRlbnQgaW4gYSBjeWNsZS4KLSAgICAvLyBBbmQsIHdlIHNob3VsZCBub3Qgc2hvdyBhbnkgZWxlbWVudCBjb250ZW50IGZvciByZWZlcmVuY2VzIG90aGVyd2lzZSB0aGVyZSB3aWxsIGJlIHR3bwotICAgIC8vIGVudHJpZXMgaW4gdGhlIHRyZWUgdmlld2VyIGZvciB0aGUgc2FtZSBpdGVtCi0gICAgaWYgKCFkZWYuaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCA9ICgoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHRhcmdldCkuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE1vZGVsR3JvdXAoKTsKLSAgICAgIGlmICh4c2RNb2RlbEdyb3VwICE9IG51bGwpCi0gICAgICAgIGxpc3QuYWRkKHhzZE1vZGVsR3JvdXApOwotICAgIH0KLQotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdChsaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIChJVHJlZUVsZW1lbnRbXSkgYWRhcHRlckxpc3QudG9BcnJheShuZXcgSVRyZWVFbGVtZW50WzBdKTsKLQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlciNnZXRBY3Rpb25zKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgQ29sbGVjdGlvbiBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cERlZmluaXRpb24gPSBnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotICAgIGJvb2xlYW4gaXNNb2RlbEdyb3VwUmVmZXJlbmNlID0gbW9kZWxHcm91cERlZmluaXRpb24uaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpOwotICAgIGlmICghaXNNb2RlbEdyb3VwUmVmZXJlbmNlKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKEFkZFhTREVsZW1lbnRBY3Rpb24uSUQpOwotICAgICAgbGlzdC5hZGQoQWRkWFNERWxlbWVudEFjdGlvbi5SRUZfSUQpOwotICAgICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgICAgbGlzdC5hZGQoQWRkWFNETW9kZWxHcm91cEFjdGlvbi5TRVFVRU5DRV9JRCk7Ci0gICAgICBsaXN0LmFkZChBZGRYU0RNb2RlbEdyb3VwQWN0aW9uLkNIT0lDRV9JRCk7Ci0gICAgICBsaXN0LmFkZChBZGRYU0RNb2RlbEdyb3VwQWN0aW9uLkFMTF9JRCk7Ci0gICAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgfQotICAgIAotICAgIGxpc3QuYWRkKERlbGV0ZUFjdGlvbi5JRCk7Ci0gICAgCi0gICAgaWYgKGlzTW9kZWxHcm91cFJlZmVyZW5jZSkKLSAgICB7Ci0gICAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfU1RBUlRfSUQgKyBNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9NVUxUSVBMSUNJVFkpOwotICAgICAgbGlzdC5hZGQoU2V0TXVsdGlwbGljaXR5QWN0aW9uLlJFUVVJUkVEX0lEKTsKLSAgICAgIGxpc3QuYWRkKFNldE11bHRpcGxpY2l0eUFjdGlvbi5aRVJPX09SX09ORV9JRCk7Ci0gICAgICBsaXN0LmFkZChTZXRNdWx0aXBsaWNpdHlBY3Rpb24uWkVST19PUl9NT1JFX0lEKTsKLSAgICAgIGxpc3QuYWRkKFNldE11bHRpcGxpY2l0eUFjdGlvbi5PTkVfT1JfTU9SRV9JRCk7ICAgIAotICAgICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX0VORF9JRCk7IAotICAgIH0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgT2JqZWN0IHNjaGVtYSA9IGdldEVkaXRvclNjaGVtYSgpOwotICAgIGlmIChtb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRTY2hlbWEoKSA9PSBzY2hlbWEpCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29udGFpbmVyID0gbW9kZWxHcm91cERlZmluaXRpb24uZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAoY29udGFpbmVyID09IHNjaGVtYSB8fCBjb250YWluZXIgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoU2V0SW5wdXRUb0dyYXBoVmlldy5JRCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsaXN0LmFkZChPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgIH0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLQotICAgIHJldHVybiAoU3RyaW5nIFtdKWxpc3QudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldEFkZE5ld0ZpZWxkQ29tbWFuZChTdHJpbmcgZmllbGRLaW5kKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotICAgIHJldHVybiBuZXcgRGVsZXRlQ29tbWFuZChnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpKTsKLSAgfQotCi0gIC8vIFRPRE8gQ29tbW9uIHRoaXMgdXAgd2l0aCBYU0RDb21wbGV4VHlwZSdzLiAgU2VlIGFsc28gZ2V0RmllbGRzIAotICBwcm90ZWN0ZWQgdm9pZCBjbGVhckZpZWxkcygpCi0gIHsKLSAgICBpZiAob3RoZXJUaGluZ3NUb0xpc3RlblRvICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3RoZXJUaGluZ3NUb0xpc3RlblRvLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGkubmV4dCgpOwotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICBJQURUT2JqZWN0IGFkdE9iamVjdCA9IChJQURUT2JqZWN0KSBhZGFwdGVyOwotICAgICAgICAgIGFkdE9iamVjdC51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZmllbGRzID0gbnVsbDsKLSAgICBvdGhlclRoaW5nc1RvTGlzdGVuVG8gPSBudWxsOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0RmllbGRzKCkKLSAgewotICAgIExpc3QgZmllbGRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIG90aGVyVGhpbmdzVG9MaXN0ZW5UbyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBYU0RWaXNpdG9yRm9yRmllbGRzIHZpc2l0b3IgPSBuZXcgWFNEVmlzaXRvckZvckdyb3VwRmllbGRzV2l0aFNwYWNlRmlsbGVycygpOwotICAgIHZpc2l0b3IudmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpKTsKLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KHZpc2l0b3IuY29uY3JldGVDb21wb25lbnRMaXN0LCBmaWVsZHMpOwotICAgIAotICAgIC8vIFRPRE8gKGNzKSBjb21tb24gYSBiYXNlIGNsYXNzIGZvciBhIHN0cnVjdHVyZSB0aGluZ2VlCi0gICAgLy8KLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KHZpc2l0b3IudGhpbmdzV2VOZWVkVG9MaXN0ZW5Ubywgb3RoZXJUaGluZ3NUb0xpc3RlblRvKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvdGhlclRoaW5nc1RvTGlzdGVuVG8uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBpLm5leHQoKTsKLSAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUFEVE9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgSUFEVE9iamVjdCBhZHRPYmplY3QgPSAoSUFEVE9iamVjdCkgYWRhcHRlcjsKLSAgICAgICAgYWR0T2JqZWN0LnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmaWVsZHM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgWFNEVmlzaXRvckZvckdyb3VwRmllbGRzV2l0aFNwYWNlRmlsbGVycyBleHRlbmRzIFhTRFZpc2l0b3JGb3JGaWVsZHMKLSAgewotICAgIHB1YmxpYyBYU0RWaXNpdG9yRm9yR3JvdXBGaWVsZHNXaXRoU3BhY2VGaWxsZXJzKCkKLSAgICB7Ci0gICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXApCi0gICAgewotICAgICAgaW50IG51bU9mQ2hpbGRyZW4gPSBtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuc2l6ZSgpOwotICAgICAgaWYgKG51bU9mQ2hpbGRyZW4gPT0gMCkKLSAgICAgIHsKLSAgICAgICAgY29uY3JldGVDb21wb25lbnRMaXN0LmFkZChuZXcgU3BhY2VGaWxsZXIoImVsZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIHN1cGVyLnZpc2l0TW9kZWxHcm91cChtb2RlbEdyb3VwKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHJlc29sdmVkTW9kZWxHcm91cERlZiA9IG1vZGVsR3JvdXBEZWYuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgaWYgKHZpc2l0ZWRHcm91cHMuY29udGFpbnMocmVzb2x2ZWRNb2RlbEdyb3VwRGVmLmdldE1vZGVsR3JvdXAoKSkpCi0gICAgICB7Ci0gICAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQobmV3IFNwYWNlRmlsbGVyKCJlbGVtZW50IikpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBzdXBlci52aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKG1vZGVsR3JvdXBEZWYpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VGV4dCgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZmluaXRpb24gPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHRhcmdldDsKLSAgICBpZiAoeHNkTW9kZWxHcm91cERlZmluaXRpb24uaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIGNsZWFyRmllbGRzKCk7Ci0gICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIG51bGwpOwotICB9Ci0gIAotICBwdWJsaWMgaW50IGdldE1heE9jY3VycygpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWF4T2NjdXJzKGdldFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCkpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRNaW5PY2N1cnMoKQotICB7Ci0gICAgcmV0dXJuIGdldE1pbk9jY3VycyhnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpKTsKLSAgfQotCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldFRvcENvbnRhaW5lcigpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBncm91cCA9IGdldFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29udGFpbmVyID0gZ3JvdXAuZ2V0Q29udGFpbmVyKCk7Ci0gICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFhTRFNjaGVtYSB8fCBjb250YWluZXIgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICAgIHJldHVybiB0aGlzOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBnZXRHbG9iYWxYU0RDb250YWluZXIoZ3JvdXApOwotICB9Ci0gIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotICB7Ci0JICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbiA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgdGFyZ2V0OwotCSAgaWYgKGhhc1NldFJlYWRPbmx5RmllbGQoKSkKLQkgIHsKLQkJICBkZWxldGVkVHlwZXMucHV0KHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldE5hbWUoKSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkgIGNoYW5nZVJlYWRPbmx5RmllbGQgPSBmYWxzZTsKLQkJICByZXR1cm4gcmVhZE9ubHk7Ci0JICB9Ci0JICBlbHNlCi0JICB7Ci0JCSAgaWYgKGRlbGV0ZWRUeXBlcyE9IG51bGwgKQotCQkgIHsKLQkJCSAgQm9vbGVhbiBkZWxldGVkID0gKChCb29sZWFuKWRlbGV0ZWRUeXBlcy5nZXQoeHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0TmFtZSgpKSk7Ci0JCQkgIGlmIChkZWxldGVkICE9IG51bGwgJiYgZGVsZXRlZC5ib29sZWFuVmFsdWUoKSkKLQkJCQkgIHJldHVybiB0cnVlOwotCQkJICBlbHNlIHJldHVybiBzdXBlci5pc1JlYWRPbmx5KCk7Ci0JCSAgfQotCQkgIGVsc2UKLQkJCSAgcmV0dXJuIHN1cGVyLmlzUmVhZE9ubHkoKTsKLQkgIH0KLQkKLQkgIAotICB9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7Ci0JCXRoaXMucmVhZE9ubHkgPSByZWFkT25seTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNTZXRSZWFkT25seUZpZWxkKCkgewotCQlyZXR1cm4gY2hhbmdlUmVhZE9ubHlGaWVsZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VSZWFkT25seUZpZWxkKGJvb2xlYW4gc2V0UmVhZE9ubHlGaWVsZCkgewotCQl0aGlzLmNoYW5nZVJlYWRPbmx5RmllbGQgPSBzZXRSZWFkT25seUZpZWxkOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZURlbGV0ZWRNYXAoU3RyaW5nIGFkZENvbXBvbmVudCkgewotCQlpZiAoZGVsZXRlZFR5cGVzLmdldChhZGRDb21wb25lbnQpICE9IG51bGwpCi0JCQlkZWxldGVkVHlwZXMuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RQYXJ0aWNsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFBhcnRpY2xlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjY2NDljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFBhcnRpY2xlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLklBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLQotcHVibGljIGNsYXNzIFhTRFBhcnRpY2xlQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgSUFubm90YXRpb25Qcm92aWRlcgotewotICBwdWJsaWMgWFNEUGFydGljbGVBZGFwdGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1heE9jY3VycygpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWF4T2NjdXJzKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgdGFyZ2V0KTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TWluT2NjdXJzKCkKLSAgewotICAgIHJldHVybiBnZXRNaW5PY2N1cnMoKFhTRENvbmNyZXRlQ29tcG9uZW50KSB0YXJnZXQpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TWluT2NjdXJzKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIGludCBtaW5PY2N1ciA9IC0yOwotICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGNvbXBvbmVudC5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICB7Ci0gICAgICAgIGlmICgoKFhTRFBhcnRpY2xlKSBvKS5pc1NldE1pbk9jY3VycygpKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgbWluT2NjdXIgPSAoKFhTRFBhcnRpY2xlKSBvKS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1pbk9jY3VyOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TWF4T2NjdXJzKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIGludCBtYXhPY2N1ciA9IC0yOwotICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGNvbXBvbmVudC5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICB7Ci0gICAgICAgIGlmICgoKFhTRFBhcnRpY2xlKSBvKS5pc1NldE1heE9jY3VycygpKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgbWF4T2NjdXIgPSAoKFhTRFBhcnRpY2xlKSBvKS5nZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1heE9jY3VyOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lQW5ub3RhdGlvblN0cmluZygpCi0gIHsKLSAgICByZXR1cm4gYnVpbGRBbm5vdGF0aW9uU3RyaW5nKHRydWUpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lQW5ub3RhdGlvblRvb2xUaXBTdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuIGJ1aWxkQW5ub3RhdGlvblN0cmluZyhmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVBbm5vdGF0aW9uU3RyaW5nKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlQW5ub3RhdGlvblRvb2xUaXBTdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkQW5ub3RhdGlvblN0cmluZyhib29sZWFuIGlzRm9yTGFiZWwpCi0gIHsKLSAgICBTdHJpbmcgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyB0b29sVGlwRGVzY3JpcHRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIC8vIFRPRE86IHNldCBpbnQgdmFsdWVzIGFzIGRlZmluZWQgY29uc3RhbnRzCi0gICAgLy8gLTIgbWVhbnMgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgKHNvIHRoZSBkZWZhdWx0IGlzIDEpCi0gICAgaW50IG1pbk9jY3VycyA9IGdldE1pbk9jY3VycygpOwotICAgIGludCBtYXhPY2N1cnMgPSBnZXRNYXhPY2N1cnMoKTsKLQotICAgIC8vIFRoaXMgaXMgZm9yIHRoZSBhdHRyaWJ1dGUgZmllbGQgY2FzZSwgd2hpY2ggaGFzIG5vCi0gICAgLy8gb2NjdXJyZW5jZSBhdHRyaWJ1dGVzCi0gICAgaWYgKG1pbk9jY3VycyA9PSAtMyAmJiBtYXhPY2N1cnMgPT0gLTMpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBlbHNlIGlmIChtaW5PY2N1cnMgPT0gMCAmJiAobWF4T2NjdXJzID09IC0yIHx8IG1heE9jY3VycyA9PSAxKSkKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9ICJbMC4uMV0iOyAvLyROT04tTkxTLTEkCi0gICAgICB0b29sVGlwRGVzY3JpcHRpb24gPSBNZXNzYWdlcy5fVUlfTEFCRUxfT1BUSU9OQUw7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1pbk9jY3VycyA9PSAwICYmIG1heE9jY3VycyA9PSAtMSkKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9ICJbMC4uKl0iOyAvLyROT04tTkxTLTEkCi0gICAgICB0b29sVGlwRGVzY3JpcHRpb24gPSBNZXNzYWdlcy5fVUlfTEFCRUxfWkVST19PUl9NT1JFOwotICAgIH0KLSAgICBlbHNlIGlmICgobWluT2NjdXJzID09IDEgJiYgbWF4T2NjdXJzID09IC0xKSB8fCAobWluT2NjdXJzID09IC0yICYmIG1heE9jY3VycyA9PSAtMSkpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSAiWzEuLipdIjsgLy8kTk9OLU5MUy0xJAotICAgICAgdG9vbFRpcERlc2NyaXB0aW9uID0gTWVzc2FnZXMuX1VJX0xBQkVMX09ORV9PUl9NT1JFOwotICAgIH0KLSAgICBlbHNlIGlmICgobWluT2NjdXJzID09IDEgJiYgbWF4T2NjdXJzID09IDEpIHx8IChtaW5PY2N1cnMgPT0gLTIgJiYgbWF4T2NjdXJzID09IDEpIHx8IChtaW5PY2N1cnMgPT0gMSAmJiBtYXhPY2N1cnMgPT0gLTIpKQotICAgIHsKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gIlsxLi4xXSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHRvb2xUaXBEZXNjcmlwdGlvbiA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9SRVFVSVJFRDsKLSAgICB9Ci0gICAgZWxzZSBpZiAobWluT2NjdXJzID09IC0yICYmIG1heE9jY3VycyA9PSAtMikKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAvLyBub25lIHNwZWNpZmllZCwgc28gZG9uJ3QgaGF2ZSBhbnkgdG9vbFRpcCBkZXNjcmlwdGlvbgotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKG1heE9jY3VycyA9PSAtMikKLSAgICAgICAgbWF4T2NjdXJzID0gMTsKLSAgICAgIFN0cmluZyBtYXhTeW1ib2wgPSBtYXhPY2N1cnMgPT0gLTEgPyAiKiIgOiAiIiArIG1heE9jY3VyczsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICBTdHJpbmcgbWluU3ltYm9sID0gbWluT2NjdXJzID09IC0yID8gIjEiIDogIiIgKyBtaW5PY2N1cnM7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSAiWyIgKyBtaW5TeW1ib2wgKyAiLi4iICsgbWF4U3ltYm9sICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgdG9vbFRpcERlc2NyaXB0aW9uID0gTWVzc2FnZXMuX1VJX0xBQkVMX0FSUkFZOwotICAgIH0KLQotICAgIGlmIChpc0ZvckxhYmVsKQotICAgIHsKLSAgICAgIHJldHVybiBvY2N1cmVuY2VEZXNjcmlwdGlvbjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiB0b29sVGlwRGVzY3JpcHRpb247Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFJlZGVmaW5lQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEUmVkZWZpbmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YmM2NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEUmVkZWZpbmVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TZXRJbnB1dFRvR3JhcGhWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgWFNEUmVkZWZpbmVBZGFwdGVyIGV4dGVuZHMgWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlcgotewotCi0gIHB1YmxpYyBYU0RSZWRlZmluZUFkYXB0ZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBYU0RSZWRlZmluZSB4c2RSZWRlZmluZSA9IChYU0RSZWRlZmluZSlnZXRUYXJnZXQoKTsKLQotICAgIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgaWYgKGF0dHJpYnV0ZXNDYXRlZ29yeSAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgYXR0cmlidXRlcyA9IGdldENhdGVnb3J5Q2hpbGRyZW4oQ2F0ZWdvcnlBZGFwdGVyLkFUVFJJQlVURVMpOwotICAgICAgTGlzdCBncm91cHMgPSBnZXRDYXRlZ29yeUNoaWxkcmVuKENhdGVnb3J5QWRhcHRlci5HUk9VUFMpOwotICAgICAgTGlzdCB0eXBlcyA9IGdldENhdGVnb3J5Q2hpbGRyZW4oQ2F0ZWdvcnlBZGFwdGVyLlRZUEVTKTsKLQotICAgICAgYXR0cmlidXRlc0NhdGVnb3J5LnNldENoaWxkcmVuKGF0dHJpYnV0ZXMpOwotICAgICAgYXR0cmlidXRlc0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKGF0dHJpYnV0ZXMpOwotICAgICAgdHlwZXNDYXRlZ29yeS5zZXRDaGlsZHJlbih0eXBlcyk7Ci0gICAgICB0eXBlc0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKHR5cGVzKTsKLSAgICAgIGdyb3Vwc0NhdGVnb3J5LnNldENoaWxkcmVuKGdyb3Vwcyk7Ci0gICAgICBncm91cHNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihncm91cHMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY3JlYXRlQ2F0ZWdvcnlBZGFwdGVycyh4c2RSZWRlZmluZSk7Ci0gICAgfQotCi0gICAgY2hpbGRyZW4uYWRkKGF0dHJpYnV0ZXNDYXRlZ29yeSk7Ci0gICAgY2hpbGRyZW4uYWRkKHR5cGVzQ2F0ZWdvcnkpOwotICAgIGNoaWxkcmVuLmFkZChncm91cHNDYXRlZ29yeSk7Ci0KLSAgICByZXR1cm4gKElUcmVlRWxlbWVudFtdKWNoaWxkcmVuLnRvQXJyYXkobmV3IElUcmVlRWxlbWVudCBbMF0pOwotICB9Ci0KLSAgcHVibGljIElBRFRPYmplY3QgZ2V0VG9wQ29udGFpbmVyKCkKLSAgewotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCB0eXBlcyA9IG51bGw7Ci0KLSAgcHJvdGVjdGVkIExpc3QgY2hpbGRyZW4sIGFsbENoaWxkcmVuOwotCi0gIHByb3RlY3RlZCBDYXRlZ29yeUFkYXB0ZXIgYXR0cmlidXRlc0NhdGVnb3J5OwotCi0gIHByb3RlY3RlZCBDYXRlZ29yeUFkYXB0ZXIgdHlwZXNDYXRlZ29yeTsKLQotICBwcm90ZWN0ZWQgQ2F0ZWdvcnlBZGFwdGVyIGdyb3Vwc0NhdGVnb3J5OwotCi0gIC8qKgotICAgKiBDcmVhdGUgYWxsIHRoZSBjYXRlZ29yeSBhZGFwdGVycwotICAgKiAKLSAgICogQHBhcmFtIHhzZFJlZGVmaW5lIHRoZSBwYXJlbnQgcmVkZWZpbmUgY29tcG9uZW50Ci0gICAqLwotICBwcml2YXRlIHZvaWQgY3JlYXRlQ2F0ZWdvcnlBZGFwdGVycyhYU0RSZWRlZmluZSB4c2RSZWRlZmluZSkKLSAgewotICAgIExpc3QgYXR0cmlidXRlcyA9IGdldENhdGVnb3J5Q2hpbGRyZW4oQ2F0ZWdvcnlBZGFwdGVyLkFUVFJJQlVURVMpOwotICAgIExpc3QgZ3JvdXBzID0gZ2V0Q2F0ZWdvcnlDaGlsZHJlbihDYXRlZ29yeUFkYXB0ZXIuR1JPVVBTKTsKLSAgICBMaXN0IHR5cGVzID0gZ2V0Q2F0ZWdvcnlDaGlsZHJlbihDYXRlZ29yeUFkYXB0ZXIuVFlQRVMpOwotCi0gICAgWFNERWRpdG9yUGx1Z2luIHhzZEVkaXRvclBsdWdpbiA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCk7Ci0gICAgYXR0cmlidXRlc0NhdGVnb3J5ID0gbmV3IFJlZGVmaW5lQ2F0ZWdvcnlBZGFwdGVyKAotICAgICAgTWVzc2FnZXMuX1VJX0dSQVBIX1JFREVGSU5FX0FUVFJJQlVURV9HUk9VUFMsCi0gICAgICB4c2RFZGl0b3JQbHVnaW4uZ2V0SWNvbkltYWdlKCJvYmoxNi9hdHRyaWJ1dGVzaGVhZGVyIiksIGF0dHJpYnV0ZXMsIHhzZFJlZGVmaW5lLCB0aGlzLCBDYXRlZ29yeUFkYXB0ZXIuQVRUUklCVVRFUyk7IC8vJE5PTi1OTFMtMSQKLSAgICBhdHRyaWJ1dGVzQ2F0ZWdvcnkuc2V0QWxsQ2hpbGRyZW4oYXR0cmlidXRlcyk7Ci0gICAgcmVnaXN0ZXJMaXN0ZW5lcihhdHRyaWJ1dGVzQ2F0ZWdvcnkpOwotCi0gICAgdHlwZXNDYXRlZ29yeSA9IG5ldyBSZWRlZmluZUNhdGVnb3J5QWRhcHRlcigKLSAgICAgIE1lc3NhZ2VzLl9VSV9HUkFQSF9SRURFRklORV9UWVBFUywKLSAgICAgIHhzZEVkaXRvclBsdWdpbi5nZXRJY29uSW1hZ2UoIm9iajE2L3R5cGVzaGVhZGVyIiksIHR5cGVzLCB4c2RSZWRlZmluZSwgdGhpcywgQ2F0ZWdvcnlBZGFwdGVyLlRZUEVTKTsgLy8kTk9OLU5MUy0xJAotICAgIHR5cGVzQ2F0ZWdvcnkuc2V0QWxsQ2hpbGRyZW4odHlwZXMpOwotICAgIHJlZ2lzdGVyTGlzdGVuZXIodHlwZXNDYXRlZ29yeSk7Ci0KLSAgICBncm91cHNDYXRlZ29yeSA9IG5ldyBSZWRlZmluZUNhdGVnb3J5QWRhcHRlcigKLSAgICAgIE1lc3NhZ2VzLl9VSV9HUkFQSF9SRURFRklORV9HUk9VUFMsCi0gICAgICB4c2RFZGl0b3JQbHVnaW4uZ2V0SWNvbkltYWdlKCJvYmoxNi9ncm91cHNoZWFkZXIiKSwgZ3JvdXBzLCB4c2RSZWRlZmluZSwgdGhpcywgQ2F0ZWdvcnlBZGFwdGVyLkdST1VQUyk7IC8vJE5PTi1OTFMtMSQKLSAgICBncm91cHNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihncm91cHMpOwotICAgIHJlZ2lzdGVyTGlzdGVuZXIoZ3JvdXBzQ2F0ZWdvcnkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKQotICB7Ci0gICAgY2xhc3MgQ2F0ZWdvcnlOb3RpZmljYXRpb24gZXh0ZW5kcyBOb3RpZmljYXRpb25JbXBsCi0gICAgewotICAgICAgcHJvdGVjdGVkIE9iamVjdCBjYXRlZ29yeTsKLQotICAgICAgcHVibGljIENhdGVnb3J5Tm90aWZpY2F0aW9uKE9iamVjdCBjYXRlZ29yeSkKLSAgICAgIHsKLSAgICAgICAgc3VwZXIobXNnLmdldEV2ZW50VHlwZSgpLCBtc2cuZ2V0T2xkVmFsdWUoKSwgbXNnLmdldE5ld1ZhbHVlKCksIG1zZy5nZXRQb3NpdGlvbigpKTsKLSAgICAgICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotICAgICAgfQotCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldE5vdGlmaWVyKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNhdGVnb3J5OwotICAgICAgfQotCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoKQotICAgICAgewotICAgICAgICByZXR1cm4gbXNnLmdldEZlYXR1cmUoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRDaGlsZHJlbigpOwotICAgIH0KLQotICAgIE9iamVjdCBuZXdWYWx1ZSA9IG1zZy5nZXROZXdWYWx1ZSgpOwotICAgIE9iamVjdCBvbGRWYWx1ZSA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotCi0gICAgaWYgKFhTRFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTRFJlZGVmaW5lX0NvbnRlbnRzKCkgPT0gbXNnLmdldEZlYXR1cmUoKSkKLSAgICB7Ci0gICAgICBpZiAoKG5ld1ZhbHVlIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSB8fCBvbGRWYWx1ZSBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGFkYXB0ZXIgPSBnZXRDYXRlZ29yeShDYXRlZ29yeUFkYXB0ZXIuQVRUUklCVVRFUyk7Ci0gICAgICAgIEFzc2VydC5pc1RydWUoYWRhcHRlciAhPSBudWxsKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gZ2V0Q2F0ZWdvcnlDaGlsZHJlbihDYXRlZ29yeUFkYXB0ZXIuQVRUUklCVVRFUyk7Ci0gICAgICAgIGFkYXB0ZXIuc2V0Q2hpbGRyZW4obGlzdCk7Ci0gICAgICAgIGFkYXB0ZXIuc2V0QWxsQ2hpbGRyZW4obGlzdCk7Ci0gICAgICAgCi0gICAgICAgIGlmIChhZGFwdGVyLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWFBZGFwdGVyKQotICAgICAgICB7Ci0gICAgICAgIAlYU0RTY2hlbWFBZGFwdGVyIHNjaGVtYUFkYXB0ZXIgPSAoWFNEU2NoZW1hQWRhcHRlcilhZGFwdGVyLmdldE1vZGVsKCk7Ci0gICAgICAgIAlzY2hlbWFBZGFwdGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLSAgICAgICAgfQotICAgICAgIAotICAgICAgICBub3RpZnlMaXN0ZW5lcnMobmV3IENhdGVnb3J5Tm90aWZpY2F0aW9uKGFkYXB0ZXIpLCBhZGFwdGVyLmdldFRleHQoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKChuZXdWYWx1ZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB8fCBuZXdWYWx1ZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB8fCAob2xkVmFsdWUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gfHwgb2xkVmFsdWUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikpCi0gICAgICB7Ci0gICAgICAgIENhdGVnb3J5QWRhcHRlciBhZGFwdGVyID0gZ2V0Q2F0ZWdvcnkoQ2F0ZWdvcnlBZGFwdGVyLlRZUEVTKTsKLSAgICAgICAgQXNzZXJ0LmlzVHJ1ZShhZGFwdGVyICE9IG51bGwpOwotICAgICAgICBMaXN0IHR5cGVzID0gZ2V0Q2F0ZWdvcnlDaGlsZHJlbihDYXRlZ29yeUFkYXB0ZXIuVFlQRVMpOwotICAgICAgICBhZGFwdGVyLnNldENoaWxkcmVuKHR5cGVzKTsKLSAgICAgICAgYWRhcHRlci5zZXRBbGxDaGlsZHJlbih0eXBlcyk7Ci0gICAgICAgIGlmIChhZGFwdGVyLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWFBZGFwdGVyKQotICAgICAgICB7Ci0gICAgICAgIAlYU0RTY2hlbWFBZGFwdGVyIHNjaGVtYUFkYXB0ZXIgPSAoWFNEU2NoZW1hQWRhcHRlcilhZGFwdGVyLmdldE1vZGVsKCk7Ci0gICAgICAgIAlzY2hlbWFBZGFwdGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlMaXN0ZW5lcnMobmV3IENhdGVnb3J5Tm90aWZpY2F0aW9uKGFkYXB0ZXIpLCBhZGFwdGVyLmdldFRleHQoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24gfHwgb2xkVmFsdWUgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGFkYXB0ZXIgPSBnZXRDYXRlZ29yeShDYXRlZ29yeUFkYXB0ZXIuR1JPVVBTKTsKLSAgICAgICAgQXNzZXJ0LmlzVHJ1ZShhZGFwdGVyICE9IG51bGwpOwotICAgICAgICBMaXN0IGxpc3QgPSBnZXRDYXRlZ29yeUNoaWxkcmVuKENhdGVnb3J5QWRhcHRlci5HUk9VUFMpOwotICAgICAgICBhZGFwdGVyLnNldENoaWxkcmVuKGxpc3QpOwotICAgICAgICBhZGFwdGVyLnNldEFsbENoaWxkcmVuKGxpc3QpOyAKLSAgICAgICAgaWYgKGFkYXB0ZXIuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYUFkYXB0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgCVhTRFNjaGVtYUFkYXB0ZXIgc2NoZW1hQWRhcHRlciA9IChYU0RTY2hlbWFBZGFwdGVyKWFkYXB0ZXIuZ2V0TW9kZWwoKTsKLSAgICAgICAgCXNjaGVtYUFkYXB0ZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVycyhuZXcgQ2F0ZWdvcnlOb3RpZmljYXRpb24oYWRhcHRlciksIGFkYXB0ZXIuZ2V0VGV4dCgpKTsgICAgICAgCi0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gWFNEUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNEU2NoZW1hX0Fubm90YXRpb25zKCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNhdGVnb3JpZXMoKQotICB7Ci0gICAgZ2V0Q2hpbGRyZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBDYXRlZ29yeUFkYXB0ZXIgZ2V0Q2F0ZWdvcnkoaW50IGNhdGVnb3J5KQotICB7Ci0gICAgaWYgKGNoaWxkcmVuID09IG51bGwpCi0gICAgewotICAgICAgdXBkYXRlQ2F0ZWdvcmllcygpOwotICAgIH0KLSAgICBpbnQgbGVuZ3RoID0gY2hpbGRyZW4uc2l6ZSgpOwotICAgIENhdGVnb3J5QWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLSAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGFkYXB0ZXIgPSAoQ2F0ZWdvcnlBZGFwdGVyKWNoaWxkcmVuLmdldChpbmRleCk7Ci0gICAgICBpZiAoYWRhcHRlci5nZXRHcm91cFR5cGUoKSA9PSBjYXRlZ29yeSkKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBhZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIENvbGxlY3Rpb24gYWN0aW9uSURzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgYWN0aW9uSURzLmFkZChEZWxldGVBY3Rpb24uSUQpOwotICAgIGFjdGlvbklEcy5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGFjdGlvbklEcy5hZGQoU2V0SW5wdXRUb0dyYXBoVmlldy5JRCk7Ci0gICAgYWN0aW9uSURzLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgYWN0aW9uSURzLmFkZChTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uSUQpOwotCi0gICAgcmV0dXJuIChTdHJpbmdbXSlhY3Rpb25JRHMudG9BcnJheShuZXcgU3RyaW5nIFswXSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgbm90aWZ5TGlzdGVuZXJzKG9iamVjdCwgcHJvcGVydHkpOwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgewotICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFJlZGVmaW5lLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwcml2YXRlIExpc3QgZ2V0Q2F0ZWdvcnlDaGlsZHJlbihpbnQgY2F0ZWdvcnkpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgWFNEUmVkZWZpbmUgcmVkZWZpbmUgPSAoWFNEUmVkZWZpbmUpdGFyZ2V0OwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVkZWZpbmUuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgWFNEUmVkZWZpbmVDb250ZW50IHJlZGVmaW5lQ29udGVudCA9IChYU0RSZWRlZmluZUNvbnRlbnQpaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICBpZiAocmVkZWZpbmVDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uICYmIGNhdGVnb3J5ID09IENhdGVnb3J5QWRhcHRlci5BVFRSSUJVVEVTKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChyZWRlZmluZUNvbnRlbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocmVkZWZpbmVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24gJiYgY2F0ZWdvcnkgPT0gQ2F0ZWdvcnlBZGFwdGVyLkdST1VQUykKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQocmVkZWZpbmVDb250ZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJlZGVmaW5lQ29udGVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiAmJiBjYXRlZ29yeSA9PSBDYXRlZ29yeUFkYXB0ZXIuVFlQRVMpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKHJlZGVmaW5lQ29udGVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChyZWRlZmluZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiAmJiBjYXRlZ29yeSA9PSBDYXRlZ29yeUFkYXB0ZXIuVFlQRVMpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKHJlZGVmaW5lQ29udGVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdChsaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIGFkYXB0ZXJMaXN0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEU2NoZW1hQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEU2NoZW1hQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTMwZTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFNjaGVtYUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgVGFkYSBUYWthdG9zaGkgLyBGdWppdHN1IC0gYnVnIDI0NTQ4MCAtIHByb3ZpZGVkIGluaXRpYWwgcGF0Y2gKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREluY2x1ZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgSUFjdGlvblByb3ZpZGVyLCBJTW9kZWwsIElBRFRPYmplY3RMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgTGlzdCB0eXBlcyA9IG51bGw7Ci0gIHByb3RlY3RlZCBMaXN0IGNoaWxkcmVuLCBhbGxDaGlsZHJlbjsKLQotICBwcm90ZWN0ZWQgQ2F0ZWdvcnlBZGFwdGVyIGZEaXJlY3RpdmVzQ2F0ZWdvcnk7Ci0gIHByb3RlY3RlZCBDYXRlZ29yeUFkYXB0ZXIgZkVsZW1lbnRzQ2F0ZWdvcnk7Ci0gIHByb3RlY3RlZCBDYXRlZ29yeUFkYXB0ZXIgZkF0dHJpYnV0ZXNDYXRlZ29yeTsKLSAgcHJvdGVjdGVkIENhdGVnb3J5QWRhcHRlciBmVHlwZXNDYXRlZ29yeTsKLSAgcHJvdGVjdGVkIENhdGVnb3J5QWRhcHRlciBmR3JvdXBzQ2F0ZWdvcnk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhbGwgdGhlIGNhdGVnb3J5IGFkYXB0ZXJzCi0gICAqIAotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDYXRlZ29yeUFkYXB0ZXJzKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBMaXN0IGRpcmVjdGl2ZXNMaXN0ID0gZ2V0RGlyZWN0aXZlcyh4c2RTY2hlbWEpOwotICAgIExpc3QgZWxlbWVudHNMaXN0ID0gZ2V0R2xvYmFsRWxlbWVudHMoeHNkU2NoZW1hKTsKLSAgICBMaXN0IGF0dHJpYnV0ZXNMaXN0ID0gZ2V0QXR0cmlidXRlTGlzdCh4c2RTY2hlbWEpOwotICAgIExpc3QgZ3JvdXBzID0gZ2V0R3JvdXBzKHhzZFNjaGVtYSk7Ci0gICAgTGlzdCB0eXBlcyA9IGdldENvbXBsZXhUeXBlcyh4c2RTY2hlbWEpOwotICAgIHR5cGVzLmFkZEFsbChnZXRTaW1wbGVUeXBlcyh4c2RTY2hlbWEpKTsKLQotICAgIGZEaXJlY3RpdmVzQ2F0ZWdvcnkgPSBuZXcgQ2F0ZWdvcnlBZGFwdGVyKE1lc3NhZ2VzLl9VSV9HUkFQSF9ESVJFQ1RJVkVTLCBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEljb25JbWFnZSgib2JqMTYvZGlyZWN0aXZlc2hlYWRlciIpLCBkaXJlY3RpdmVzTGlzdCwgeHNkU2NoZW1hLCBDYXRlZ29yeUFkYXB0ZXIuRElSRUNUSVZFUyk7IC8vJE5PTi1OTFMtMSQKLSAgICBmRGlyZWN0aXZlc0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKGRpcmVjdGl2ZXNMaXN0KTsKLSAgICByZWdpc3Rlckxpc3RlbmVyKGZEaXJlY3RpdmVzQ2F0ZWdvcnkpOwotCi0gICAgZkVsZW1lbnRzQ2F0ZWdvcnkgPSBuZXcgQ2F0ZWdvcnlBZGFwdGVyKE1lc3NhZ2VzLl9VSV9HUkFQSF9FTEVNRU5UUywgWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJY29uSW1hZ2UoIm9iajE2L2VsZW1lbnRzaGVhZGVyIiksIGVsZW1lbnRzTGlzdCwgeHNkU2NoZW1hLCBDYXRlZ29yeUFkYXB0ZXIuRUxFTUVOVFMpOyAgLy8kTk9OLU5MUy0xJAotICAgIGZFbGVtZW50c0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKGdldEdsb2JhbEVsZW1lbnRzKHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgIHJlZ2lzdGVyTGlzdGVuZXIoZkVsZW1lbnRzQ2F0ZWdvcnkpOwotCi0gICAgZkF0dHJpYnV0ZXNDYXRlZ29yeSA9IG5ldyBDYXRlZ29yeUFkYXB0ZXIoTWVzc2FnZXMuX1VJX0dSQVBIX0FUVFJJQlVURVMsIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWNvbkltYWdlKCJvYmoxNi9hdHRyaWJ1dGVzaGVhZGVyIiksIGF0dHJpYnV0ZXNMaXN0LCB4c2RTY2hlbWEsIENhdGVnb3J5QWRhcHRlci5BVFRSSUJVVEVTKTsgICAvLyROT04tTkxTLTEkCi0gICAgZkF0dHJpYnV0ZXNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihnZXRBdHRyaWJ1dGVMaXN0KHhzZFNjaGVtYSx0cnVlKSk7Ci0gICAgcmVnaXN0ZXJMaXN0ZW5lcihmQXR0cmlidXRlc0NhdGVnb3J5KTsKLQotICAgIGZUeXBlc0NhdGVnb3J5ID0gbmV3IENhdGVnb3J5QWRhcHRlcihNZXNzYWdlcy5fVUlfR1JBUEhfVFlQRVMsIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWNvbkltYWdlKCJvYmoxNi90eXBlc2hlYWRlciIpLCB0eXBlcywgeHNkU2NoZW1hLCBDYXRlZ29yeUFkYXB0ZXIuVFlQRVMpOyAgLy8kTk9OLU5MUy0xJAotICAgIGZUeXBlc0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKGdldFR5cGVzKHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgIHJlZ2lzdGVyTGlzdGVuZXIoZlR5cGVzQ2F0ZWdvcnkpOwotCi0gICAgZkdyb3Vwc0NhdGVnb3J5ID0gbmV3IENhdGVnb3J5QWRhcHRlcihNZXNzYWdlcy5fVUlfR1JBUEhfR1JPVVBTLCBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEljb25JbWFnZSgib2JqMTYvZ3JvdXBzaGVhZGVyIiksIGdyb3VwcywgeHNkU2NoZW1hLCBDYXRlZ29yeUFkYXB0ZXIuR1JPVVBTKTsgLy8kTk9OLU5MUy0xJAotICAgIGZHcm91cHNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihnZXRHcm91cHMoeHNkU2NoZW1hLHRydWUpKTsKLSAgICByZWdpc3Rlckxpc3RlbmVyKGZHcm91cHNDYXRlZ29yeSk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRUeXBlcygpCi0gIHsKLSAgICBpZiAodHlwZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKSB0YXJnZXQ7Ci0gICAgICBMaXN0IGNvbmNyZXRlQ29tcG9uZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSBpLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgY29uY3JldGVDb21wb25lbnRMaXN0LmFkZChjb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KGNvbmNyZXRlQ29tcG9uZW50TGlzdCwgdHlwZXMpOwotICAgIH0KLSAgICByZXR1cm4gdHlwZXM7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzU2FtZU5hbWVzcGFjZShTdHJpbmcgbnMxLCBTdHJpbmcgbnMyKQotICB7Ci0gICAgaWYgKG5zMSA9PSBudWxsKSBuczEgPSAiIjsKLSAgICBpZiAobnMyID09IG51bGwpIG5zMiA9ICIiOwotICAgIAotICAgIGlmIChuczEuZXF1YWxzKG5zMikpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQjZ2V0Q2hpbGRyZW4oKQotICAgKi8KLSAgcHVibGljIElUcmVlRWxlbWVudFtdIGdldENoaWxkcmVuKCkKLSAgewotICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSAoWFNEU2NoZW1hKSBnZXRUYXJnZXQoKTsKLQotICAgIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLy8ganVzdCBzZXQgY2F0ZWdvcnlhZGFwdGVycycgY2hpbGRyZW4gaWYgY2F0ZWdvcnkgYWRhcHRlcnMgYXJlCi0gICAgLy8gYWxyZWFkeSBjcmVhdGVkCi0gICAgaWYgKGZEaXJlY3RpdmVzQ2F0ZWdvcnkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IGRpcmVjdGl2ZXNMaXN0ID0gZ2V0RGlyZWN0aXZlcyh4c2RTY2hlbWEpOwotICAgICAgTGlzdCBlbGVtZW50c0xpc3QgPSBnZXRHbG9iYWxFbGVtZW50cyh4c2RTY2hlbWEpOwotICAgICAgTGlzdCBhdHRyaWJ1dGVzTGlzdCA9IGdldEF0dHJpYnV0ZUxpc3QoeHNkU2NoZW1hKTsKLSAgICAgIExpc3QgZ3JvdXBzID0gZ2V0R3JvdXBzKHhzZFNjaGVtYSk7Ci0gICAgICBMaXN0IHR5cGVzID0gZ2V0Q29tcGxleFR5cGVzKHhzZFNjaGVtYSk7Ci0gICAgICB0eXBlcy5hZGRBbGwoZ2V0U2ltcGxlVHlwZXMoeHNkU2NoZW1hKSk7Ci0KLSAgICAgIGZEaXJlY3RpdmVzQ2F0ZWdvcnkuc2V0Q2hpbGRyZW4oZGlyZWN0aXZlc0xpc3QpOwotICAgICAgZkRpcmVjdGl2ZXNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihkaXJlY3RpdmVzTGlzdCk7Ci0gICAgICBmRWxlbWVudHNDYXRlZ29yeS5zZXRDaGlsZHJlbihlbGVtZW50c0xpc3QpOwotICAgICAgZkVsZW1lbnRzQ2F0ZWdvcnkuc2V0QWxsQ2hpbGRyZW4oZ2V0R2xvYmFsRWxlbWVudHMoeHNkU2NoZW1hLCB0cnVlKSk7Ci0gICAgICBmQXR0cmlidXRlc0NhdGVnb3J5LnNldENoaWxkcmVuKGF0dHJpYnV0ZXNMaXN0KTsKLSAgICAgIGZBdHRyaWJ1dGVzQ2F0ZWdvcnkuc2V0QWxsQ2hpbGRyZW4oZ2V0QXR0cmlidXRlTGlzdCh4c2RTY2hlbWEsIHRydWUpKTsKLSAgICAgIGZUeXBlc0NhdGVnb3J5LnNldENoaWxkcmVuKHR5cGVzKTsKLSAgICAgIGZUeXBlc0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKGdldFR5cGVzKHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgICAgZkdyb3Vwc0NhdGVnb3J5LnNldENoaWxkcmVuKGdyb3Vwcyk7Ci0gICAgICBmR3JvdXBzQ2F0ZWdvcnkuc2V0QWxsQ2hpbGRyZW4oZ2V0R3JvdXBzKHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY3JlYXRlQ2F0ZWdvcnlBZGFwdGVycyh4c2RTY2hlbWEpOwotICAgIH0KLQotICAgIGNoaWxkcmVuLmFkZChmRGlyZWN0aXZlc0NhdGVnb3J5KTsKLSAgICBjaGlsZHJlbi5hZGQoZkVsZW1lbnRzQ2F0ZWdvcnkpOwotICAgIGNoaWxkcmVuLmFkZChmQXR0cmlidXRlc0NhdGVnb3J5KTsKLSAgICBjaGlsZHJlbi5hZGQoZlR5cGVzQ2F0ZWdvcnkpOwotICAgIGNoaWxkcmVuLmFkZChmR3JvdXBzQ2F0ZWdvcnkpOwotCi0gICAgcmV0dXJuIChJVHJlZUVsZW1lbnRbXSkgY2hpbGRyZW4udG9BcnJheShuZXcgSVRyZWVFbGVtZW50WzBdKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoZmluYWwgTm90aWZpY2F0aW9uIG1zZykKLSAgewotICAgIGNsYXNzIENhdGVnb3J5Tm90aWZpY2F0aW9uIGV4dGVuZHMgTm90aWZpY2F0aW9uSW1wbAotICAgIHsKLSAgICAgIHByb3RlY3RlZCBPYmplY3QgY2F0ZWdvcnk7Ci0KLSAgICAgIHB1YmxpYyBDYXRlZ29yeU5vdGlmaWNhdGlvbihPYmplY3QgY2F0ZWdvcnkpCi0gICAgICB7Ci0gICAgICAgIHN1cGVyKG1zZy5nZXRFdmVudFR5cGUoKSwgbXNnLmdldE9sZFZhbHVlKCksIG1zZy5nZXROZXdWYWx1ZSgpLCBtc2cuZ2V0UG9zaXRpb24oKSk7Ci0gICAgICAgIHRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIE9iamVjdCBnZXROb3RpZmllcigpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjYXRlZ29yeTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG1zZy5nZXRGZWF0dXJlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGNoaWxkcmVuID09IG51bGwpCi0gICAgewotICAgICAgZ2V0Q2hpbGRyZW4oKTsKLSAgICB9Ci0gICAgCi0gICAgT2JqZWN0IG5ld1ZhbHVlID0gbXNnLmdldE5ld1ZhbHVlKCk7Ci0gICAgCi0gICAgT2JqZWN0IG9sZFZhbHVlID0gbXNnLmdldE9sZFZhbHVlKCk7Ci0gICAgLy8gQnVnIDI0NTQ4MCAtIERlbGV0aW9uIG9mIEluY2x1ZGUsIEltcG9ydCBhbmQgUmVkZWZpbmUgaXMgbm90IHJlZmxlY3RlZCBpbiB0aGUgT3V0bGluZSB2aWV3Ci0gICAgLy8gV2Ugb25seSB3YW50IHRvIHJlZnJlc2ggdGhlIERpcmVjdGl2ZXMgZm9sZGVyIGZvciBhbnkgY2hhbmdlcyB0byBYU0REaXJlY3RpdmVzLiAgVGhlIGZpcnN0IGNhc2UgY292ZXJzCi0gICAgLy8gY2hhbmdlcyB0byBvbmUgZGlyZWN0aXZlLCB3aGVyZWFzIHRoZSBtaXNzaW5nIGNhc2UgYXMgcmVwb3J0ZWQgaW4gYnVnIDI0NTQ4MCBjb3ZlcnMgY2hhbmdlcyB0byBhIGxpc3QKLSAgICAvLyBvZiBkaXJlY3RpdmVzLgotICAgIGJvb2xlYW4gdXBkYXRlRGlyZWN0aXZlc0NhdGVnb3J5ID0gZmFsc2U7Ci0gICAgaWYgKG9sZFZhbHVlIGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlKQotICAgIHsKLSAgICAgIHVwZGF0ZURpcmVjdGl2ZXNDYXRlZ29yeSA9IHRydWU7Ci0gICAgfQotICAgIGVsc2UgaWYgKG9sZFZhbHVlIGluc3RhbmNlb2YgQ29sbGVjdGlvbikKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdGVyYXRvciA9ICgoQ29sbGVjdGlvbikgb2xkVmFsdWUpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gaWYgd2UgZmluZCBhdCBsZWFzdCBvbmUgZGlyZWN0aXZlLCB0aGVuIHdlIHNob3VsZCByZWZyZXNoIHRoZSBmb2xkZXIKLSAgICAgICAgICB1cGRhdGVEaXJlY3RpdmVzQ2F0ZWdvcnkgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIFhTREluY2x1ZGUgfHwgbmV3VmFsdWUgaW5zdGFuY2VvZiBYU0RJbXBvcnQgfHwgbmV3VmFsdWUgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSB8fAotICAgICAgICAobXNnLmdldEZlYXR1cmUoKSA9PSBYU0RQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RTY2hlbWFfQ29udGVudHMoKSAmJiB1cGRhdGVEaXJlY3RpdmVzQ2F0ZWdvcnkpIHx8IC8vIGhhbmRsZSB0aGUgY2FzZSBmb3IgZGVsZXRlIGRpcmVjdGl2ZQotICAgICAgICAgbXNnLmdldEZlYXR1cmUoKSA9PSBYU0RQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RTY2hlbWFfSW5jb3Jwb3JhdGVkVmVyc2lvbnMoKSkgLy8gdXBkYXRlcyB0byB0aGUgaW1wb3J0cy9pbmNsdWRlcwotICAgIHsKLSAgICAgIENhdGVnb3J5QWRhcHRlciBhZGFwdGVyID0gZ2V0Q2F0ZWdvcnkoQ2F0ZWdvcnlBZGFwdGVyLkRJUkVDVElWRVMpOwotICAgICAgQXNzZXJ0LmlzVHJ1ZShhZGFwdGVyICE9IG51bGwpOwotICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGFkYXB0ZXIuZ2V0WFNEU2NoZW1hKCk7Ci0gICAgICBhZGFwdGVyLnNldENoaWxkcmVuKGdldERpcmVjdGl2ZXMoeHNkU2NoZW1hKSk7Ci0gICAgICBhZGFwdGVyLnNldEFsbENoaWxkcmVuKGdldERpcmVjdGl2ZXMoeHNkU2NoZW1hKSk7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMobmV3IENhdGVnb3J5Tm90aWZpY2F0aW9uKGFkYXB0ZXIpLCBhZGFwdGVyLmdldFRleHQoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gWFNEUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNEU2NoZW1hX0VsZW1lbnREZWNsYXJhdGlvbnMoKSkKLSAgICB7Ci0gICAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IGdldENhdGVnb3J5KENhdGVnb3J5QWRhcHRlci5FTEVNRU5UUyk7Ci0gICAgICBBc3NlcnQuaXNUcnVlKGFkYXB0ZXIgIT0gbnVsbCk7Ci0gICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gYWRhcHRlci5nZXRYU0RTY2hlbWEoKTsKLSAgICAgIGFkYXB0ZXIuc2V0Q2hpbGRyZW4oZ2V0R2xvYmFsRWxlbWVudHMoeHNkU2NoZW1hKSk7Ci0gICAgICBhZGFwdGVyLnNldEFsbENoaWxkcmVuKGdldEdsb2JhbEVsZW1lbnRzKHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgICAgbm90aWZ5TGlzdGVuZXJzKG5ldyBDYXRlZ29yeU5vdGlmaWNhdGlvbihhZGFwdGVyKSwgYWRhcHRlci5nZXRUZXh0KCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFhTRFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTRFNjaGVtYV9BdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB8fAotICAgICAgICAgICAgIG1zZy5nZXRGZWF0dXJlKCkgPT0gWFNEUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNEU2NoZW1hX0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMoKSkKLSAgICB7Ci0gICAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IGdldENhdGVnb3J5KENhdGVnb3J5QWRhcHRlci5BVFRSSUJVVEVTKTsKLSAgICAgIEFzc2VydC5pc1RydWUoYWRhcHRlciAhPSBudWxsKTsKLSAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBhZGFwdGVyLmdldFhTRFNjaGVtYSgpOwotICAgICAgYWRhcHRlci5zZXRDaGlsZHJlbihnZXRBdHRyaWJ1dGVMaXN0KHhzZFNjaGVtYSkpOwotICAgICAgYWRhcHRlci5zZXRBbGxDaGlsZHJlbihnZXRBdHRyaWJ1dGVMaXN0KHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgICAgbm90aWZ5TGlzdGVuZXJzKG5ldyBDYXRlZ29yeU5vdGlmaWNhdGlvbihhZGFwdGVyKSwgYWRhcHRlci5nZXRUZXh0KCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFhTRFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTRFNjaGVtYV9UeXBlRGVmaW5pdGlvbnMoKSkKLSAgICB7Ci0gICAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IGdldENhdGVnb3J5KENhdGVnb3J5QWRhcHRlci5UWVBFUyk7Ci0gICAgICBBc3NlcnQuaXNUcnVlKGFkYXB0ZXIgIT0gbnVsbCk7Ci0gICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gYWRhcHRlci5nZXRYU0RTY2hlbWEoKTsKLSAgICAgIExpc3QgdHlwZXMgPSBnZXRDb21wbGV4VHlwZXMoeHNkU2NoZW1hKTsKLSAgICAgIHR5cGVzLmFkZEFsbChnZXRTaW1wbGVUeXBlcyh4c2RTY2hlbWEpKTsKLQotICAgICAgYWRhcHRlci5zZXRDaGlsZHJlbih0eXBlcyk7Ci0gICAgICBhZGFwdGVyLnNldEFsbENoaWxkcmVuKGdldFR5cGVzKHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgICAgbm90aWZ5TGlzdGVuZXJzKG5ldyBDYXRlZ29yeU5vdGlmaWNhdGlvbihhZGFwdGVyKSwgYWRhcHRlci5nZXRUZXh0KCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFhTRFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTRFNjaGVtYV9Nb2RlbEdyb3VwRGVmaW5pdGlvbnMoKSkKLSAgICB7Ci0gICAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IGdldENhdGVnb3J5KENhdGVnb3J5QWRhcHRlci5HUk9VUFMpOwotICAgICAgQXNzZXJ0LmlzVHJ1ZShhZGFwdGVyICE9IG51bGwpOwotICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGFkYXB0ZXIuZ2V0WFNEU2NoZW1hKCk7Ci0gICAgICBhZGFwdGVyLnNldENoaWxkcmVuKGdldEdyb3Vwcyh4c2RTY2hlbWEpKTsKLSAgICAgIGFkYXB0ZXIuc2V0QWxsQ2hpbGRyZW4oZ2V0R3JvdXBzKHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgICAgbm90aWZ5TGlzdGVuZXJzKG5ldyBDYXRlZ29yeU5vdGlmaWNhdGlvbihhZGFwdGVyKSwgYWRhcHRlci5nZXRUZXh0KCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFhTRFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTRFNjaGVtYV9Bbm5vdGF0aW9ucygpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBYU0RQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RTY2hlbWFfU2NoZW1hTG9jYXRpb24oKSkKLSAgICB7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMobXNnLCBudWxsKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgdHlwZXMgPSBudWxsOwotICAgIGdldFR5cGVzKCk7Ci0KLSAgICBzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHVwZGF0ZUNhdGVnb3JpZXMoKQotICB7Ci0gICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzCi0gICAgZ2V0Q2hpbGRyZW4oKTsKLSAgfQotICAKLSAgcHVibGljIENhdGVnb3J5QWRhcHRlciBnZXRDYXRlZ29yeShpbnQgY2F0ZWdvcnkpCi0gIHsKLSAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgdXBkYXRlQ2F0ZWdvcmllcygpOyAvLyBpbml0IGNhdGVnb3JpZXMKLSAgICBpbnQgbGVuZ3RoID0gY2hpbGRyZW4uc2l6ZSgpOwotICAgIENhdGVnb3J5QWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGFkYXB0ZXIgPSAoQ2F0ZWdvcnlBZGFwdGVyKSBjaGlsZHJlbi5nZXQoaSk7Ci0gICAgICBpZiAoYWRhcHRlci5nZXRHcm91cFR5cGUoKSA9PSAgY2F0ZWdvcnkpCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYWRhcHRlcjsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldERpcmVjdGl2ZXMoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChvKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KGxpc3QsIGFkYXB0ZXJMaXN0KTsKLSAgICByZXR1cm4gYWRhcHRlckxpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldEdsb2JhbEVsZW1lbnRzKFhTRFNjaGVtYSBzY2hlbWEsIGJvb2xlYW4gc2hvd0Zyb21JbmNsdWRlcykKLSAgewotICAgIExpc3QgZWxlbWVudHMgPSBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpOwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW0gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpLm5leHQoKTsKLSAgICAgIGlmIChzaG91bGRTaG93Q29tcG9uZW50KGVsZW0sIHNjaGVtYSwgc2hvd0Zyb21JbmNsdWRlcykpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGVsZW0pOwotICAgICAgfQotICAgIH0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiBhZGFwdGVyTGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEdsb2JhbEVsZW1lbnRzKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICByZXR1cm4gZ2V0R2xvYmFsRWxlbWVudHMoc2NoZW1hLCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRDb21wbGV4VHlwZXMoWFNEU2NoZW1hIHNjaGVtYSwgYm9vbGVhbiBzaG93RnJvbUluY2x1ZGVzKQotICB7Ci0gICAgTGlzdCBhbGxUeXBlcyA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gYWxsVHlwZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gKFhTRFR5cGVEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGlmICh0ZCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgdGQ7Ci0gICAgICAgIGlmIChzaG91bGRTaG93Q29tcG9uZW50KGN0LCBzY2hlbWEsIHNob3dGcm9tSW5jbHVkZXMpKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQoY3QpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdChsaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIGFkYXB0ZXJMaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0Q29tcGxleFR5cGVzKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q29tcGxleFR5cGVzKHNjaGVtYSwgZmFsc2UpOwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRUeXBlcyhYU0RTY2hlbWEgc2NoZW1hLCBib29sZWFuIHNob3dGcm9tSW5jbHVkZXMpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBnZXRDb21wbGV4VHlwZXMoc2NoZW1hLCBzaG93RnJvbUluY2x1ZGVzKTsKLSAgICBsaXN0LmFkZEFsbChnZXRTaW1wbGVUeXBlcyhzY2hlbWEsIHNob3dGcm9tSW5jbHVkZXMpKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0QXR0cmlidXRlR3JvdXBMaXN0KFhTRFNjaGVtYSB4c2RTY2hlbWEsIGJvb2xlYW4gc2hvd0Zyb21JbmNsdWRlcykKLSAgewotICAgIExpc3QgYXR0cmlidXRlR3JvdXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyR3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGlmIChzaG91bGRTaG93Q29tcG9uZW50KGF0dHJHcm91cCwgeHNkU2NoZW1hLCBzaG93RnJvbUluY2x1ZGVzKSkKLSAgICAgIHsKLSAgICAgICAgYXR0cmlidXRlR3JvdXBMaXN0LmFkZChhdHRyR3JvdXApOwotICAgICAgfQotICAgIH0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QoYXR0cmlidXRlR3JvdXBMaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIGFkYXB0ZXJMaXN0OwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVHcm91cExpc3QoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGVHcm91cExpc3QoeHNkU2NoZW1hLCBmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVMaXN0KFhTRFNjaGVtYSB4c2RTY2hlbWEsIGJvb2xlYW4gc2hvd0Zyb21JbmNsdWRlcykKLSAgewotICAgIExpc3QgYXR0cmlidXRlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyID0geHNkU2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgbzsKLSAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChhdHRyLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCEoYXR0ci5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9JTlNUQU5DRV9VUklfMjAwMSkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd0NvbXBvbmVudChhdHRyLCB4c2RTY2hlbWEsc2hvd0Zyb21JbmNsdWRlcykpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzTGlzdC5hZGQoYXR0cik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzaG91bGRTaG93Q29tcG9uZW50KGF0dHIsIHhzZFNjaGVtYSxzaG93RnJvbUluY2x1ZGVzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYXR0cmlidXRlc0xpc3QuYWRkKGF0dHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBhdHRyaWJ1dGVzTGlzdC5hZGRBbGwoZ2V0QXR0cmlidXRlR3JvdXBMaXN0KHhzZFNjaGVtYSwgc2hvd0Zyb21JbmNsdWRlcykpOwotICAgIAotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdChhdHRyaWJ1dGVzTGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiBhZGFwdGVyTGlzdDsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0QXR0cmlidXRlTGlzdChYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZUxpc3QoeHNkU2NoZW1hLCBmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRTaW1wbGVUeXBlcyhYU0RTY2hlbWEgc2NoZW1hLCBib29sZWFuIHNob3dGcm9tSW5jbHVkZXMpCi0gIHsKLSAgICBMaXN0IGFsbFR5cGVzID0gc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpOwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhbGxUeXBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgaWYgKHRkIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB0ZDsKLSAgICAgICAgaWYgKHNob3VsZFNob3dDb21wb25lbnQoc3QsIHNjaGVtYSwgc2hvd0Zyb21JbmNsdWRlcykpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChzdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KGxpc3QsIGFkYXB0ZXJMaXN0KTsKLSAgICByZXR1cm4gYWRhcHRlckxpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldFNpbXBsZVR5cGVzKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICByZXR1cm4gZ2V0U2ltcGxlVHlwZXMoc2NoZW1hLCBmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRHcm91cHMoWFNEU2NoZW1hIHNjaGVtYSwgYm9vbGVhbiBzaG93RnJvbUluY2x1ZGVzKQotICB7Ci0gICAgTGlzdCBncm91cHMgPSBzY2hlbWEuZ2V0TW9kZWxHcm91cERlZmluaXRpb25zKCk7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdyb3Vwcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZ3JvdXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgaWYgKHNob3VsZFNob3dDb21wb25lbnQoZ3JvdXAsIHNjaGVtYSwgc2hvd0Zyb21JbmNsdWRlcykpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGdyb3VwKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KGxpc3QsIGFkYXB0ZXJMaXN0KTsKLSAgICByZXR1cm4gYWRhcHRlckxpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldEdyb3VwcyhYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgcmV0dXJuIGdldEdyb3VwcyhzY2hlbWEsIGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgQ29sbGVjdGlvbiBhY3Rpb25JRHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoQWRkWFNERWxlbWVudEFjdGlvbi5JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWN0aW9uLklEKTsKLQotICAgICBhY3Rpb25JRHMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICAgYWN0aW9uSURzLmFkZChTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uSUQpOwotICAgICByZXR1cm4gKFN0cmluZyBbXSlhY3Rpb25JRHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBub3RpZnlMaXN0ZW5lcnMob2JqZWN0LCBwcm9wZXJ0eSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RGaWxlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTaG93Q29tcG9uZW50KFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCwgWFNEU2NoZW1hIHNjaGVtYSwgYm9vbGVhbiBzaG93RnJvbUluY2x1ZGVzKSAKLSAgewotCSAgcmV0dXJuIGlzU2FtZU5hbWVzcGFjZShjb21wb25lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkgJiYgKGNvbXBvbmVudC5nZXRSb290Q29udGFpbmVyKCkgPT0gc2NoZW1hIHx8IHNob3dGcm9tSW5jbHVkZXMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZTg5ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklHcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJQWN0aW9uUHJvdmlkZXIsIElHcmFwaEVsZW1lbnQKLXsKLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgewotICAgIFhTRFNjaGVtYURpcmVjdGl2ZSBvYmplY3QgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKSB0YXJnZXQ7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREltcG9ydCkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RJbXBvcnQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNESW5jbHVkZSkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RJbmNsdWRlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgIHsKLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFJlZGVmaW5lLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIFhTRFNjaGVtYURpcmVjdGl2ZSBkaXJlY3RpdmUgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKSB0YXJnZXQ7Ci0gICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gICAgU3RyaW5nIGxvY2F0aW9uID0gZGlyZWN0aXZlLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0gICAgaWYgKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24uZXF1YWxzKCIiKSApCi0gICAgewotICAgICAgcmVzdWx0ID0gIigiICsgTWVzc2FnZXMuX1VJX0xBQkVMX05PX0xPQ0FUSU9OX1NQRUNJRklFRCArICIpIjsgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBsb2NhdGlvbjsKLSAgICB9ICAKLQotICAgIC8vIG9ubHkgc2hvdyB0aGUgbmFtZXNwYWNlIHdoZW4gdGhlIGRpcmVjdGlhdmUgaXMgYW4gaW1wb3J0Ci0gICAgLy8gKG90aGVyd2lzZSB0aGUgbmFtZXNwYWNlIGlzIG9idmlvdXNseSB0aGUgc2FtZSBhcyB0aGUgY29udGFpbmluZyBzY2hlbWEncykKLSAgICBpZiAoZGlyZWN0aXZlIGluc3RhbmNlb2YgWFNESW1wb3J0KQotICAgIHsKLSAgICAgIFhTREltcG9ydCBpbXBvcnRPYmogPSAoWFNESW1wb3J0KSBkaXJlY3RpdmU7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gaW1wb3J0T2JqLmdldE5hbWVzcGFjZSgpOwotICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIHJlc3VsdCArPSAiICB7IiArIG5hbWVzcGFjZSArICJ9IjsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiAoSVRyZWVFbGVtZW50W10pIGFkYXB0ZXJMaXN0LnRvQXJyYXkobmV3IElUcmVlRWxlbWVudFswXSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoT3BlbkluTmV3RWRpdG9yLklEKTsKLSAgICBsaXN0LmFkZChEZWxldGVBY3Rpb24uSUQpOwotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBsaXN0LmFkZChTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uSUQpOwotICAgIAotICAgIHJldHVybiAoU3RyaW5nIFtdKWxpc3QudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKQotICB7Ci0gICAgWFNEU2NoZW1hRGlyZWN0aXZlIG9iamVjdCA9IChYU0RTY2hlbWFEaXJlY3RpdmUpIHRhcmdldDsKLSAgICByZXR1cm4gbmV3IERlbGV0ZUNvbW1hbmQob2JqZWN0KTsKLSAgfQotCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgWFNEU2NoZW1hIG9iamVjdCA9ICgoWFNEU2NoZW1hRGlyZWN0aXZlKSB0YXJnZXQpLmdldFNjaGVtYSgpOwotICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQob2JqZWN0KTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIElBRFRPYmplY3QgZ2V0VG9wQ29udGFpbmVyKCkKLSAgewotICAgIC8vIFRoZXJlIGlzIGN1cnJlbnRseSBubyBkcmlsbC1kb3duIGRldGFpbHMgdmlldyBvZiBkaXJlY3RpdmVzCi0gICAgLy8gVGhlIHRvcCBsZXZlbCBjb250YWluZXIgaXMgdGhlIHNjaGVtYQotICAgIHJldHVybiBnZXRNb2RlbCgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFNpbXBsZUNvbnRlbnRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RTaW1wbGVDb250ZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjZmNmE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFNpbXBsZUNvbnRlbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFhTRFNpbXBsZUNvbnRlbnRBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJQWN0aW9uUHJvdmlkZXIsIElHcmFwaEVsZW1lbnQKLXsKLQotICBwdWJsaWMgWFNEU2ltcGxlQ29udGVudEFkYXB0ZXIoKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBnZXRYU0RTaW1wbGVUeXBlQ29udGVudCgpCi0gIHsKLSAgICByZXR1cm4gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKXRhcmdldDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcmV0dXJuIChTdHJpbmcgW10pbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IERlbGV0ZUNvbW1hbmQoZ2V0WFNEU2ltcGxlVHlwZUNvbnRlbnQoKSk7Ci0gIH0KLQotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZ2V0WFNEU2ltcGxlVHlwZUNvbnRlbnQoKS5nZXRTY2hlbWEoKSk7Ci0gICAgcmV0dXJuIChJTW9kZWwpYWRhcHRlcjsKLSAgfQotCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldFRvcENvbnRhaW5lcigpCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjID0gZ2V0WFNEU2ltcGxlVHlwZUNvbnRlbnQoKS5nZXRDb250YWluZXIoKTsKLSAgICBpZiAoYyBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBjOwotICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChjdCk7Ci0gICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgICAgIHJldHVybiAoSUFEVE9iamVjdClhZGFwdGVyOwotICAgIH0KLSAKLSAgICByZXR1cm4gbnVsbDsgCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQWxsb3dlZCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBpZiAoaXNSZWFkT25seSgpKQotICAgIHsKLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNEU2ltcGxlQ29udGVudC5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTRFNpbXBsZUNvbnRlbnQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNWMzNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5TZXRCYXNlVHlwZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVmFyaWV0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIgZXh0ZW5kcyBYU0RUeXBlRGVmaW5pdGlvbkFkYXB0ZXIKLXsKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkT25seTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGFuZ2VSZWFkT25seUZpZWxkID1mYWxzZTsKLQlwcm90ZWN0ZWQgSGFzaE1hcCBkZWxldGVkVHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7Ci0gICAgaWYgKGlzUmVhZE9ubHkoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L3NpbXBsZXR5cGVkaXNfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvc2ltcGxldHlwZV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0TmFtZSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIHJldHVybiBnZXRUZXh0KHRydWUpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KGJvb2xlYW4gc2hvd1R5cGUpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdGFyZ2V0OwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIHJlc3VsdC5hcHBlbmQoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpID09IG51bGwgPyBNZXNzYWdlcy5fVUlfTEFCRUxfTE9DQUxfVFlQRSA6IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSk7Ci0KLSAgICBpZiAoc2hvd1R5cGUpCi0gICAgewotICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gYmFzZVR5cGVEZWZpbml0aW9uID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAoYmFzZVR5cGVEZWZpbml0aW9uICE9IG51bGwgJiYgWFNEVmFyaWV0eS5BVE9NSUNfTElURVJBTCA9PSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRWYXJpZXR5KCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChiYXNlVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpICE9IG51bGwgJiYgIXhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldENvbnRlbnRzKCkuY29udGFpbnMoYmFzZVR5cGVEZWZpbml0aW9uKSAmJiAhWFNEQ29uc3RhbnRzLmlzQW55U2ltcGxlVHlwZShiYXNlVHlwZURlZmluaXRpb24pKQotICAgICAgICB7Ci0gICAgICAgIAl0cnkgewotICAgICAgICAJCVN0cmluZyBxTmFtZSA9IGJhc2VUeXBlRGVmaW5pdGlvbi5nZXRRTmFtZSh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbik7Ci0gICAgICAgIAkJcmVzdWx0LmFwcGVuZCgiIDogIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHFOYW1lKTsKLSAgICAgICAgCX0KLSAgICAgICAgCWNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgCXsKLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBpdGVtVHlwZURlZmluaXRpb24gPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRJdGVtVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgaWYgKGl0ZW1UeXBlRGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGl0ZW1UeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgOiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpdGVtVHlwZURlZmluaXRpb24uZ2V0UU5hbWUoeHNkU2ltcGxlVHlwZURlZmluaXRpb24pKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdCBtZW1iZXJUeXBlRGVmaW5pdGlvbnMgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRNZW1iZXJUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICAgICAgICBpZiAoIW1lbWJlclR5cGVEZWZpbml0aW9ucy5pc0VtcHR5KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG1lbWJlcnMgPSBtZW1iZXJUeXBlRGVmaW5pdGlvbnMuaXRlcmF0b3IoKTsgbWVtYmVycy5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBtZW1iZXJUeXBlRGVmaW5pdGlvbiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgbWVtYmVycy5uZXh0KCk7Ci0gICAgICAgICAgICAgIGlmIChtZW1iZXJUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgOiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiB8ICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobWVtYmVyVHlwZURlZmluaXRpb24uZ2V0UU5hbWUoeHNkU2ltcGxlVHlwZURlZmluaXRpb24pKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChyZXN1bHQubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKE1lc3NhZ2VzLl9VSV9MQUJFTF9BQlNFTlQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXhUeXBlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRm9jdXNBbGxvd2VkKCkKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB0YXJnZXQ7Ci0gICAgaWYgKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMS5lcXVhbHMoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBpc0Fub255bW91cygpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChBZGRYU0RFbnVtZXJhdGlvbkZhY2V0QWN0aW9uLklEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoU2V0QmFzZVR5cGVBY3Rpb24uSUQpOwotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBsaXN0LmFkZChEZWxldGVBY3Rpb24uSUQpOwotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBPYmplY3Qgc2NoZW1hID0gZ2V0RWRpdG9yU2NoZW1hKCk7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gPSBnZXRYU0RUeXBlRGVmaW5pdGlvbigpOwotICAgIGlmICh0eXBlRGVmaW5pdGlvbi5nZXRTY2hlbWEoKSA9PSBzY2hlbWEpCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29udGFpbmVyID0gdHlwZURlZmluaXRpb24uZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAoY29udGFpbmVyID09IHNjaGVtYSB8fCBjb250YWluZXIgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoU2V0SW5wdXRUb0dyYXBoVmlldy5JRCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsaXN0LmFkZChPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgIH0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLSAgICAKLSAgICByZXR1cm4gKFN0cmluZyBbXSlsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0Fub255bW91cygpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdGFyZ2V0OwotICAgIEVPYmplY3QgZUNvbnRhaW5lciA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmVDb250YWluZXIoKTsKLSAgICByZXR1cm4gIShlQ29udGFpbmVyIGluc3RhbmNlb2YgWFNEU2NoZW1hIHx8Ci0gICAgICAgICAgICAgZUNvbnRhaW5lciBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKTsKLSAgfQotCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldFRvcENvbnRhaW5lcigpCi0gIHsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKSAKLSAgewotICAgIHJldHVybiBuZXcgRGVsZXRlQ29tbWFuZChnZXRYU0RUeXBlRGVmaW5pdGlvbigpKTsJCi0gIH0KLSAgCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChnZXRYU0RUeXBlRGVmaW5pdGlvbigpLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIElUcmVlRWxlbWVudFtdIGdldENoaWxkcmVuKCkKLSAgewotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZURlZmluaXRpb24gPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHRhcmdldDsKLSAgICBMaXN0IGxpc3QgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRFbnVtZXJhdGlvbkZhY2V0cygpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiAoSVRyZWVFbGVtZW50W10pIGFkYXB0ZXJMaXN0LnRvQXJyYXkobmV3IElUcmVlRWxlbWVudFswXSk7Ci0gIH0KLSAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0gIHsKLQkgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB0YXJnZXQ7Ci0JICBpZiAoaGFzU2V0UmVhZE9ubHlGaWVsZCgpKQotCSAgewotCQkgIGRlbGV0ZWRUeXBlcy5wdXQoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCSAgY2hhbmdlUmVhZE9ubHlGaWVsZCA9IGZhbHNlOwotCQkgIHJldHVybiByZWFkT25seTsKLQkgIH0KLQkgIGVsc2UKLQkgIHsKLQkJICBpZiAoZGVsZXRlZFR5cGVzIT0gbnVsbCApCi0JCSAgewotCQkJICBCb29sZWFuIGRlbGV0ZWQgPSAoKEJvb2xlYW4pZGVsZXRlZFR5cGVzLmdldCh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpKTsKLQkJCSAgaWYgKGRlbGV0ZWQgIT0gbnVsbCAmJiBkZWxldGVkLmJvb2xlYW5WYWx1ZSgpKQotCQkJCSAgcmV0dXJuIHRydWU7Ci0JCQkgIGVsc2UgcmV0dXJuIHN1cGVyLmlzUmVhZE9ubHkoKTsKLQkJICB9Ci0JCSAgZWxzZQotCQkJICByZXR1cm4gc3VwZXIuaXNSZWFkT25seSgpOwotCSAgfQotCQotCSAgCi0gIH0KLQotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJdGhpcy5yZWFkT25seSA9IHJlYWRPbmx5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1NldFJlYWRPbmx5RmllbGQoKSB7Ci0JCXJldHVybiBjaGFuZ2VSZWFkT25seUZpZWxkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoYW5nZVJlYWRPbmx5RmllbGQoYm9vbGVhbiBzZXRSZWFkT25seUZpZWxkKSB7Ci0JCXRoaXMuY2hhbmdlUmVhZE9ubHlGaWVsZCA9IHNldFJlYWRPbmx5RmllbGQ7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRGVsZXRlZE1hcChTdHJpbmcgYWRkQ29tcG9uZW50KSB7Ci0JCWlmIChkZWxldGVkVHlwZXMuZ2V0KGFkZENvbXBvbmVudCkgIT0gbnVsbCkKLQkJCWRlbGV0ZWRUeXBlcy5jbGVhcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEVHlwZURlZmluaXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlY2Q1NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEVHlwZURlZmluaXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhTRFR5cGVEZWZpbml0aW9uQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgSVR5cGUsIElBY3Rpb25Qcm92aWRlciwgSUdyYXBoRWxlbWVudAotewotICBwdWJsaWMgWFNEVHlwZURlZmluaXRpb24gZ2V0WFNEVHlwZURlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuIChYU0RUeXBlRGVmaW5pdGlvbil0YXJnZXQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgRU9iamVjdCBlQ29udGFpbmVyID0gZ2V0WFNEVHlwZURlZmluaXRpb24oKS5lQ29udGFpbmVyKCk7Ci0gICAgaWYgKGVDb250YWluZXIgaW5zdGFuY2VvZiBYU0RTY2hlbWEgfHwgZUNvbnRhaW5lciBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgIHsgIAotICAgICAgcmV0dXJuIGdldFhTRFR5cGVEZWZpbml0aW9uKCkuZ2V0TmFtZSgpOwotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIGlmIChlQ29udGFpbmVyIGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgICBYU0ROYW1lZENvbXBvbmVudCBlZCA9IChYU0ROYW1lZENvbXBvbmVudCllQ29udGFpbmVyOwotICAgICAgICAgcmV0dXJuICIoIiArIGVkLmdldE5hbWUoKSArICJUeXBlKSI7ICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVyKCkKLSAgewotICAgIHJldHVybiBnZXRYU0RUeXBlRGVmaW5pdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICB9Ci0KLSAgcHVibGljIElUeXBlIGdldFN1cGVyVHlwZSgpCi0gIHsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IGdldFhTRFR5cGVEZWZpbml0aW9uKCkuZ2V0QmFzZVR5cGUoKTsKLSAgICByZXR1cm4gdGQgIT0gbnVsbCA/IChJVHlwZSlYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KHRkKSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVOYW1lQ29tbWFuZChTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQ29tcGxleFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTJiNWMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETm90YXRpb25EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotcHVibGljIGNsYXNzIFhTRFZpc2l0b3IKLXsKLSAgcHVibGljIFhTRFZpc2l0b3IoKQotICB7Ci0gICAgY2lyY3VsYXJEZWZpbml0aW9uRm91bmQgPSBmYWxzZTsKLSAgICB2aXNpdGVkR3JvdXBzID0gbmV3IFN0YWNrKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGNpcmN1bGFyRGVmaW5pdGlvbkZvdW5kID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hOwotICBwcm90ZWN0ZWQgU3RhY2sgdmlzaXRlZEdyb3VwcyA9IG5ldyBTdGFjaygpOwotICAKLSAgcHVibGljIHZvaWQgdmlzaXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IChYU0RUeXBlRGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRUeXBlRGVmaW5pdGlvbih0eXBlKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIGlkZW50aXR5Q29uc3RyYWludCA9IChYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24oaWRlbnRpdHlDb25zdHJhaW50KTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24obW9kZWxHcm91cCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oYXR0cmlidXRlR3JvdXApOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldE5vdGF0aW9uRGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNETm90YXRpb25EZWNsYXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXROb3RhdGlvbkRlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0VHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pdHlwZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24oKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbil0eXBlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50LmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2aXNpdFR5cGVEZWZpbml0aW9uKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24oWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiBpZGVudGl0eUNvbnN0cmFpbnQpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmKQotICB7Ci0gICAgaWYgKCFtb2RlbEdyb3VwRGVmLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICBpZiAobW9kZWxHcm91cERlZi5nZXRNb2RlbEdyb3VwKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKCh2aXNpdGVkR3JvdXBzLmNvbnRhaW5zKG1vZGVsR3JvdXBEZWYuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE1vZGVsR3JvdXAoKSkpKQotICAgICAgICB7Ci0gICAgICAgICAgY2lyY3VsYXJEZWZpbml0aW9uRm91bmQgPSB0cnVlOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB2aXNpdGVkR3JvdXBzLnB1c2gobW9kZWxHcm91cERlZi5nZXRNb2RlbEdyb3VwKCkpOwotICAgICAgICB2aXNpdE1vZGVsR3JvdXAobW9kZWxHcm91cERlZi5nZXRNb2RlbEdyb3VwKCkpOwotICAgICAgICB2aXNpdGVkR3JvdXBzLnBvcCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gcmVzb2x2ZWRHcm91cERlZiA9IG1vZGVsR3JvdXBEZWYuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gcmVzb2x2ZWRHcm91cERlZi5nZXRNb2RlbEdyb3VwKCk7Ci0KLSAgICAgIGlmICgodmlzaXRlZEdyb3Vwcy5jb250YWlucyhtb2RlbEdyb3VwKSkpCi0gICAgICB7Ci0gICAgICAgIGNpcmN1bGFyRGVmaW5pdGlvbkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICB2aXNpdGVkR3JvdXBzLnB1c2gobW9kZWxHcm91cCk7Ci0gICAgICBpZiAobW9kZWxHcm91cCAhPSBudWxsKQotICAgICAgewotICAgICAgICB2aXNpdE1vZGVsR3JvdXAobW9kZWxHcm91cCk7Ci0gICAgICB9Ci0gICAgICB2aXNpdGVkR3JvdXBzLnBvcCgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyVXNlID0gKFhTREF0dHJpYnV0ZVVzZSlvOwotICAgICAgICB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHJVc2UuZ2V0Q29udGVudCgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyR3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKW87Ci0gICAgICAgIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKGF0dHJHcm91cC5nZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UmVkZWZpbmUoWFNEUmVkZWZpbmUgcmVkZWZpbmUpCi0gIHsKLQkgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE5vdGF0aW9uRGVjbGFyYXRpb24oWFNETm90YXRpb25EZWNsYXJhdGlvbiBub3RhdGlvbikKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRDb21wbGV4VHlwZUNvbnRlbnQoWFNEU2ltcGxlVHlwZURlZmluaXRpb24gY29udGVudCkKLSAgewotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlLmdldENvbnRlbnQoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCBjb21wbGV4Q29udGVudCA9IHR5cGUuZ2V0Q29udGVudCgpOwotICAgICAgaWYgKGNvbXBsZXhDb250ZW50IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIHZpc2l0Q29tcGxleFR5cGVDb250ZW50KChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiljb21wbGV4Q29udGVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjb21wbGV4Q29udGVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICB2aXNpdFBhcnRpY2xlKChYU0RQYXJ0aWNsZSkgY29tcGxleENvbnRlbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRQYXJ0aWNsZShYU0RQYXJ0aWNsZSBwYXJ0aWNsZSkKLSAgewotICAgIHZpc2l0UGFydGljbGVDb250ZW50KHBhcnRpY2xlLmdldENvbnRlbnQoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UGFydGljbGVDb250ZW50KFhTRFBhcnRpY2xlQ29udGVudCBwYXJ0aWNsZUNvbnRlbnQpCi0gIHsKLSAgICBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbigoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgewotICAgICAgdmlzaXRNb2RlbEdyb3VwKChYU0RNb2RlbEdyb3VwKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbigoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgIHsKLSAgICAgIHZpc2l0V2lsZGNhcmQoKFhTRFdpbGRjYXJkKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwKQotICB7Ci0gICAgaWYgKG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgdmlzaXRQYXJ0aWNsZShwYXJ0aWNsZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFdpbGRjYXJkKFhTRFdpbGRjYXJkIHdpbGRjYXJkKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFZpc2l0b3JGb3JGaWVsZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFZpc2l0b3JGb3JGaWVsZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhMGYzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RWaXNpdG9yRm9yRmllbGRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotCi1wdWJsaWMgY2xhc3MgWFNEVmlzaXRvckZvckZpZWxkcyBleHRlbmRzIFhTRFZpc2l0b3IKLXsKLSAgcHVibGljIFhTRFZpc2l0b3JGb3JGaWVsZHMoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGNvbmNyZXRlQ29tcG9uZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHVibGljIExpc3QgdGhpbmdzV2VOZWVkVG9MaXN0ZW5UbyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQgYXR0ckdyb3VwQ29udGVudCA9IChYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQpaXRlci5uZXh0KCk7Ci0gICAgICAgIGlmIChhdHRyR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlVXNlIGF0dHJVc2UgPSAoWFNEQXR0cmlidXRlVXNlKWF0dHJHcm91cENvbnRlbnQ7Ci0gICAgICAgICAgCi0gICAgICAgICAgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyVXNlLmdldENvbnRlbnQoKSk7Ci0KLS8vICAgICAgICAgIGlmIChhdHRyVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkgIT0gYXR0clVzZS5nZXRDb250ZW50KCkpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0clVzZS5nZXRDb250ZW50KCkpOwotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgZWxzZQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChhdHRyVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotLy8gICAgICAgICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKGF0dHJVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0vLyAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyR3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKWF0dHJHcm91cENvbnRlbnQ7Ci0gICAgICAgICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQoYXR0ckdyb3VwKTsKLSAgICAgICAgICBpZiAoYXR0ckdyb3VwLmlzQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgYXR0ckdyb3VwID0gYXR0ckdyb3VwLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihhdHRyR3JvdXApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAodHlwZS5nZXRBdHRyaWJ1dGVXaWxkY2FyZCgpICE9IG51bGwpCi0gICAgewotICAgICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQodHlwZS5nZXRBdHRyaWJ1dGVXaWxkY2FyZCgpKTsKLSAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQodHlwZS5nZXRBdHRyaWJ1dGVXaWxkY2FyZCgpKTsKLSAgICB9Ci0gICAgc3VwZXIudmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24odHlwZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q29tcGxleFR5cGVDb250ZW50KFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGNvbnRlbnQpCi0gIHsKLSAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChjb250ZW50KTsKLSAgICAKLSAgICBzdXBlci52aXNpdENvbXBsZXhUeXBlQ29udGVudChjb250ZW50KTsgICAKLSAgfQotCi0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWYpCi0gIHsKLSAgICAvLyBsaXN0ZW4gdG8gZGVmaW5pdGlvbiBpbiBjYXNlIGl0IGNoYW5nZXMKLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiByZXNvbHZlZE1vZGVsR3JvdXBEZWYgPSBtb2RlbEdyb3VwRGVmLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKTsKLSAgICBpZiAodmlzaXRlZEdyb3Vwcy5jb250YWlucyhyZXNvbHZlZE1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpKSkgcmV0dXJuOwotICAgCi0gICAgaWYgKG1vZGVsR3JvdXBEZWYuaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIC8vIGlmIGl0J3MgYSByZWZlcmVuY2Ugd2UgbmVlZCB0byBsaXN0ZW4gdG8gdGhlIHJlZmVyZW5jZSBpbmNhc2UgaXQgY2hhbmdlcwotICAgICAgaWYgKCF0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmNvbnRhaW5zKG1vZGVsR3JvdXBEZWYpKQotICAgICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChtb2RlbEdyb3VwRGVmKTsgICAgICAKLSAgICB9Ci0gICAgc3VwZXIudmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihtb2RlbEdyb3VwRGVmKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgewotICAgIHN1cGVyLnZpc2l0TW9kZWxHcm91cChtb2RlbEdyb3VwKTsKLSAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChtb2RlbEdyb3VwKTsgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyaWJ1dGVVc2UgPSAoWFNEQXR0cmlidXRlVXNlKW87Ci0gICAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQoYXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotICAgICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChhdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbilvOwotICAgICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChhdHRyR3JvdXApOwotICAgICAgICBpZiAoYXR0ckdyb3VwLmlzQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyR3JvdXAgPSBhdHRyR3JvdXAuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKTsKLSAgICAgICAgICB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihhdHRyR3JvdXApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIFhTRFdpbGRjYXJkIGFueUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZUdyb3VwLmdldEF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCgpOwotICAgIGlmIChhbnlBdHRyaWJ1dGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKGFueUF0dHJpYnV0ZSk7Ci0gICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChhbnlBdHRyaWJ1dGUpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRQYXJ0aWNsZShYU0RQYXJ0aWNsZSBwYXJ0aWNsZSkKLSAgewotICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKHBhcnRpY2xlKTsKLSAgICBzdXBlci52aXNpdFBhcnRpY2xlKHBhcnRpY2xlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRXaWxkY2FyZChYU0RXaWxkY2FyZCB3aWxkY2FyZCkKLSAgewotICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQod2lsZGNhcmQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKGVsZW1lbnQpOwotICAgICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQoZWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICAgIC8vIG5vdywgYWRkIHRoZSByZWZlcmVuY2UgYXMgYSBmaWVsZAotICAgICAgY29uY3JldGVDb21wb25lbnRMaXN0LmFkZChlbGVtZW50KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQoZWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICAgIC8vIG5vdGUuLi4gd2UgaW50ZW50aW9uYWxseSBvbW1pdCB0aGUgY2FsbCB0byBzdXBlci52aXNpdEVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAgICAvLyBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIGRlbHZlIGRvd24gZGVlcGVyIHRoYW4gdGhlIGVsZW1lbnQgICAgICAKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cikKLSAgewotICAgIGlmIChhdHRyLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChhdHRyKTsKLSAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKGF0dHIuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQoYXR0cik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKGF0dHIuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKGF0dHIuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RXaWxkY2FyZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFdpbGRjYXJkQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDljMTQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFdpbGRjYXJkQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTRFdpbGRjYXJkQWRhcHRlciBleHRlbmRzIFhTRFBhcnRpY2xlQWRhcHRlciBpbXBsZW1lbnRzIElGaWVsZCwgSUFjdGlvblByb3ZpZGVyLCBJR3JhcGhFbGVtZW50Ci17Ci0vLyAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBBTllFTEVNRU5UX0lDT04gPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNEQW55LmdpZiIpOyAvLyROT04tTkxTLTEkCi0vLyAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBBTllFTEVNRU5UX0RJU0FCTEVEX0lDT04gPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNEQW55LmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgWFNEV2lsZGNhcmRBZGFwdGVyKCkKLSAgewotCi0gIH0KLSAgCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBYU0RXaWxkY2FyZCB4c2RXaWxkY2FyZCA9IChYU0RXaWxkY2FyZCkgdGFyZ2V0OwotICAgIAotICAgIGlmICh4c2RXaWxkY2FyZC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICB7Ci0gICAgICBpZiAoaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREFueWRpcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEQW55LmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREFueUF0dHJpYnV0ZWRpcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEQW55QXR0cmlidXRlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIFhTRFdpbGRjYXJkIHhzZFdpbGRjYXJkID0gKFhTRFdpbGRjYXJkKSB0YXJnZXQ7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZFdpbGRjYXJkLmdldEVsZW1lbnQoKTsKLQotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZChlbGVtZW50LmdldE5vZGVOYW1lKCkpOwotICAgICAgYm9vbGVhbiBoYXNNaW5PY2N1cnMgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTUlOT0NDVVJTX0FUVFJJQlVURSk7Ci0gICAgICBib29sZWFuIGhhc01heE9jY3VycyA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5NQVhPQ0NVUlNfQVRUUklCVVRFKTsKLQotICAgICAgaWYgKGhhc01pbk9jY3VycyB8fCBoYXNNYXhPY2N1cnMpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiBbIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGhhc01pbk9jY3VycykKLSAgICAgICAgewotCi0gICAgICAgICAgaW50IG1pbiA9ICgoWFNEUGFydGljbGUpIHhzZFdpbGRjYXJkLmdldENvbnRhaW5lcigpKS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICBpZiAobWluID09IFhTRFBhcnRpY2xlLlVOQk9VTkRFRCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWluKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgLy8gcHJpbnQgZGVmYXVsdAotICAgICAgICB7Ci0gICAgICAgICAgaW50IG1pbiA9ICgoWFNEUGFydGljbGUpIHhzZFdpbGRjYXJkLmdldENvbnRhaW5lcigpKS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1pbikpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoYXNNYXhPY2N1cnMpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgbWF4ID0gKChYU0RQYXJ0aWNsZSkgeHNkV2lsZGNhcmQuZ2V0Q29udGFpbmVyKCkpLmdldE1heE9jY3VycygpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi4uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAobWF4ID09IFhTRFBhcnRpY2xlLlVOQk9VTkRFRCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWF4KSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgLy8gcHJpbnQgZGVmYXVsdAotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGludCBtYXggPSAoKFhTRFBhcnRpY2xlKSB4c2RXaWxkY2FyZC5nZXRDb250YWluZXIoKSkuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcudmFsdWVPZihtYXgpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgWFNEV2lsZGNhcmQgeHNkV2lsZGNhcmQgPSAoWFNEV2lsZGNhcmQpIHRhcmdldDsKLSAgICByZXR1cm4geHNkV2lsZGNhcmQuZ2V0Q29udGFpbmVyKCk7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotCSAgcmV0dXJuIG5ldyBEZWxldGVDb21tYW5kKChYU0RXaWxkY2FyZCkgdGFyZ2V0KTsJCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEtpbmQoKQotICB7Ci0gICAgWFNEV2lsZGNhcmQgeHNkV2lsZGNhcmQgPSAoWFNEV2lsZGNhcmQpIHRhcmdldDsKLSAgICBpZiAoeHNkV2lsZGNhcmQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgewotICAgICAgcmV0dXJuICJlbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gImF0dHJpYnV0ZSI7Ci0gIH0KLQotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIFhTRFdpbGRjYXJkIHhzZFdpbGRjYXJkID0gKFhTRFdpbGRjYXJkKSB0YXJnZXQ7Ci0gICAgaWYgKHhzZFdpbGRjYXJkLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgIHsKLSAgICAgIHJldHVybiAiYW55IjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gImFueUF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgcHVibGljIElUeXBlIGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkKLSAgewotICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZVF1YWxpZmllcigpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVNYXhPY2N1cnNDb21tYW5kKGludCBtYXhPY2N1cnMpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVNaW5PY2N1cnNDb21tYW5kKGludCBtaW5PY2N1cnMpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVOYW1lQ29tbWFuZChTdHJpbmcgbmFtZSkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZVR5cGVOYW1lQ29tbWFuZChTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBxdWFpbGlmaWVyKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2UoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIENvbGxlY3Rpb24gYWN0aW9uSURzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGFjdGlvbklEcy5hZGQoRGVsZXRlQWN0aW9uLklEKTsKLSAgICBhY3Rpb25JRHMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBhY3Rpb25JRHMuYWRkKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5JRCk7Ci0gICAgcmV0dXJuIChTdHJpbmcgW10pYWN0aW9uSURzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgcmV0dXJuIGdldEdsb2JhbFhTRENvbnRhaW5lcigoWFNEV2lsZGNhcmQpIHRhcmdldCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQWxsb3dlZCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL0Jhc2VEcmFnQW5kRHJvcENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL0Jhc2VEcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVkZjQ0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9CYXNlRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5TY2FsYWJsZVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuTW92ZVhTREJhc2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VGaWVsZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkJhc2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5Db25uZWN0YWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5UYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5YU0RCYXNlRmllbGRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkdlbmVyaWNHcm91cEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VEcmFnQW5kRHJvcENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBwcm90ZWN0ZWQgc3RhdGljIGludCBBQk9WRV9JU19DTE9TRVIgPSAwOwotICBwcm90ZWN0ZWQgc3RhdGljIGludCBCRUxPV19JU19DTE9TRVIgPSAxOwotICAKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0Vmlld2VyIHZpZXdlcjsgICAgCi0gIHByb3RlY3RlZCBDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3Q7Ci0gIHByb3RlY3RlZCBib29sZWFuIGNhbkV4ZWN1dGU7Ci0gIHByb3RlY3RlZCBHcmFwaGljYWxFZGl0UGFydCB0YXJnZXQ7Ci0gIAotICBwcm90ZWN0ZWQgR3JhcGhpY2FsRWRpdFBhcnQgbGVmdFNpYmxpbmdFZGl0UGFydDsKLSAgcHJvdGVjdGVkIEdyYXBoaWNhbEVkaXRQYXJ0IHJpZ2h0U2libGluZ0VkaXRQYXJ0OwotICBwcm90ZWN0ZWQgUG9pbnQgbG9jYXRpb247Ci0KLSAgcHJvdGVjdGVkIENvbm5lY3RhYmxlRWRpdFBhcnQgcGFyZW50RWRpdFBhcnQ7Ci0gIHByb3RlY3RlZCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwcmV2aW91c1JlZkNvbXBvbmVudCA9IG51bGwsIG5leHRSZWZDb21wb25lbnQgPSBudWxsLCB4c2RDb21wb25lbnRUb0RyYWc7Ci0gIHByb3RlY3RlZCBYU0RCYXNlRmllbGRFZGl0UGFydCBpdGVtVG9EcmFnOwotICBwcm90ZWN0ZWQgUmVjdGFuZ2xlIG9yaWdpbmFsTG9jYXRpb247Ci0gIHByb3RlY3RlZCBQb2x5bGluZSBwb2x5TGluZTsKLSAgCi0gIHByb3RlY3RlZCBNb3ZlWFNEQmFzZUFjdGlvbiBhY3Rpb247Ci0gIHByb3RlY3RlZCBMaXN0IHRhcmdldFNwYWNlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBpbnQgY2xvc2VyU2libGluZzsKLSAgCi0gIHB1YmxpYyBCYXNlRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRQYXJ0Vmlld2VyIHZpZXdlciwgQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7ICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXR1cCgpOwotIAotICAvKioKLSAgICogUHJvdmlkZXMgdGhlIERPTSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyZW50IFhTRCBjb21wb25lbnQuIAotICAgKiBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgdGhlIHVuZG8vcmVkbyBtZWNoYW5pc20uICAgCi0gICAqIEByZXR1cm4gdGhlIERPTSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyZW50IFhTRCBjb21wb25lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgRWxlbWVudCBnZXRFbGVtZW50KCk7Ci0gIAotICBwdWJsaWMgUG9pbnRMaXN0IGdldENvbm5lY3Rpb25Qb2ludHMoUmVjdGFuZ2xlIGRyYWdnZWRGaWd1cmVCb3VuZHMpCi0gIHsKLSAgICBQb2ludExpc3QgcG9pbnRMaXN0ID0gbnVsbDsKLSAgICBpZiAodGFyZ2V0ICE9IG51bGwgJiYgaXRlbVRvRHJhZyAhPSBudWxsICYmIHBhcmVudEVkaXRQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgcG9pbnRMaXN0ID0gZ2V0Q29ubmVjdGlvblBvaW50cyhwYXJlbnRFZGl0UGFydCwgaXRlbVRvRHJhZywgZHJhZ2dlZEZpZ3VyZUJvdW5kcyk7Ci0gICAgfQotICAgIHJldHVybiBwb2ludExpc3QgIT0gbnVsbCA/IHBvaW50TGlzdCA6IG5ldyBQb2ludExpc3QoKTsKLSAgfQotICAKLSAgLy8gVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIHByZXZpZXcgY29ubmVjdGlvbiBsaW5lIGZ1bmN0aW9uIHJlbGF0ZWQgdG8gZHJhZyBhbmQgZHJvcAotICAvLyAgICAgCi0gIHB1YmxpYyBQb2ludExpc3QgZ2V0Q29ubmVjdGlvblBvaW50cyhDb25uZWN0YWJsZUVkaXRQYXJ0IHBhcmVudEVkaXRQYXJ0LCBCYXNlRmllbGRFZGl0UGFydCBjaGlsZFJlZkVkaXRQYXJ0LCBSZWN0YW5nbGUgZHJhZ2dlZEZpZ3VyZUJvdW5kcykKLSAgeyAgICAgICAgICAgCi0gICAgUG9pbnRMaXN0IHBvaW50TGlzdCA9IG5ldyBQb2ludExpc3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50W10gZGF0YSA9IG5ldyBpbnRbMV07Ci0gICAgUG9pbnQgYSA9IGdldENvbm5lY3Rpb25Qb2ludChwYXJlbnRFZGl0UGFydCwgY2hpbGRSZWZFZGl0UGFydCwgZGF0YSk7Ci0gICAgaWYgKGEgIT0gbnVsbCkKLSAgICB7ICAgCi0gICAgICBpbnQgZHJhZ2dlZEZpZ3VyZUJvdW5kc1kgPSBkcmFnZ2VkRmlndXJlQm91bmRzLnkgKyBkcmFnZ2VkRmlndXJlQm91bmRzLmhlaWdodC8yOwotCi0gICAgICBwb2ludExpc3QuYWRkUG9pbnQoYSk7IAotICAgICAgCi0gICAgICBpZiAoZGF0YVswXSA9PSAwKSAvLyBpbnNlcnQgYmV0d2VlbiAyIGl0ZW1zCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaW50IHggPSBhLnggKyA1OwotICAgICAgICBwb2ludExpc3QuYWRkUG9pbnQobmV3IFBvaW50KHgsIGEueSkpOwotICAgICAgICBwb2ludExpc3QuYWRkUG9pbnQobmV3IFBvaW50KHgsIGRyYWdnZWRGaWd1cmVCb3VuZHNZKSk7ICAgICAgICAKLSAgICAgICAgcG9pbnRMaXN0LmFkZFBvaW50KG5ldyBQb2ludChkcmFnZ2VkRmlndXJlQm91bmRzLngsIGRyYWdnZWRGaWd1cmVCb3VuZHNZKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIC8vIGluc2VydCBhdCBmaXJzdCBvciBsYXN0IHBvc2l0aW9uCi0gICAgICB7Ci0gICAgICAgIHBvaW50TGlzdC5hZGRQb2ludChuZXcgUG9pbnQoYS54LCBkcmFnZ2VkRmlndXJlQm91bmRzWSkpOyAgIAotICAgICAgICBwb2ludExpc3QuYWRkUG9pbnQobmV3IFBvaW50KGRyYWdnZWRGaWd1cmVCb3VuZHMueCwgZHJhZ2dlZEZpZ3VyZUJvdW5kc1kpKTsKLSAgICAgIH0KLSAgICB9ICAgICAgIAotICAgIHJldHVybiBwb2ludExpc3Q7Ci0gIH0KLQotICAvLyBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0aGUgcHJldmlldyBjb25uZWN0aW9uIGxpbmUgZnVuY3Rpb24gcmVsYXRlZCB0byBkcmFnIGFuZCBkcm9wCi0gIC8vICAgICAKLSAgcHJvdGVjdGVkIFBvaW50IGdldENvbm5lY3Rpb25Qb2ludChDb25uZWN0YWJsZUVkaXRQYXJ0IHBhcmVudEVkaXRQYXJ0LCBCYXNlRmllbGRFZGl0UGFydCBjaGlsZFJlZkVkaXRQYXJ0LCBpbnRbXSBkYXRhKQotICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIFBvaW50IHBvaW50ID0gbnVsbDsgICAgIAotICAgIExpc3QgY2hpbGRMaXN0ID0gcGFyZW50RWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKTsgICAgICAgICAKLSAgICBpZiAocGFyZW50RWRpdFBhcnQuZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBHZW5lcmljR3JvdXBGaWd1cmUgJiYgY2hpbGRMaXN0LnNpemUoKSA+IDApCi0gICAgewotICAgICAgcG9pbnQgPSBuZXcgUG9pbnQoKTsKLQotICAgICAgUmVjdGFuZ2xlIHIgPSBnZXRDb25uZWN0ZWRFZGl0UGFydENvbm5lY3Rpb25Cb3VuZHMocGFyZW50RWRpdFBhcnQpOyAgCi0gICAgICBwb2ludC54ID0gci54ICsgci53aWR0aDsKLSAgICAgIHBvaW50LnkgPSByLnkgKyByLmhlaWdodC8yOwotICAgIH0gICAgCi0gICAgcmV0dXJuIHBvaW50OwotICB9Ci0KLSAgcHJvdGVjdGVkIFJlY3RhbmdsZSBnZXRDb25uZWN0ZWRFZGl0UGFydENvbm5lY3Rpb25Cb3VuZHMoQ29ubmVjdGFibGVFZGl0UGFydCBlZGl0UGFydCkKLSAgewotICAgIHJldHVybiBnZXRab29tZWRCb3VuZHMoKChHZW5lcmljR3JvdXBGaWd1cmUpZWRpdFBhcnQuZ2V0RmlndXJlKCkpLmdldEljb25GaWd1cmUoKS5nZXRCb3VuZHMoKSk7Ci0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgcmVkbygpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVuZG8oKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIGlmIChjYW5FeGVjdXRlKQotICAgIHsKLSAgICAJLy8gV3JhcCB0aGUgZHJhZyBhbmQgZHJvcCBvcGVyYXRpb24gZm9yIGVhc3kgdW5kbyBhbmQgcmVkby4KLSAgICAJYmVnaW5SZWNvcmRpbmcodGhpcy5nZXRFbGVtZW50KCkpOwotCQlhY3Rpb24ucnVuKCk7Ci0JCWVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpCi0gIHsKLSAgICByZXR1cm4gY2FuRXhlY3V0ZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY29tbW9uU2V0dXAoTGlzdCBzaWJsaW5ncywgR3JhcGhpY2FsRWRpdFBhcnQgbW92aW5nRWRpdFBhcnQpCi0gIHsKLSAgICBjbG9zZXJTaWJsaW5nID0gQUJPVkVfSVNfQ0xPU0VSOwotICAgIGludCBwb2ludGVyWUxvY2F0aW9uID0gbG9jYXRpb24ueTsKLSAgICBpbnQgaW5kZXg7Ci0gICAgCi0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc2libGluZ3Muc2l6ZSgpOyBpbmRleCsrKQotICAgIHsKLSAgICAgIEdyYXBoaWNhbEVkaXRQYXJ0IHNpYmxpbmcgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIHNpYmxpbmdzLmdldChpbmRleCk7Ci0gICAgICBpZiAoc2libGluZyBpbnN0YW5jZW9mIEJhc2VGaWVsZEVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBpbnQgc2libGluZ1lMb2NhdGlvbiA9IGdldFpvb21lZEJvdW5kcyhzaWJsaW5nLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpKS5nZXRDZW50ZXIoKS55OwotCi0gICAgICAgIGlmIChzaWJsaW5nWUxvY2F0aW9uID4gcG9pbnRlcllMb2NhdGlvbikKLSAgICAgICAgewotICAgICAgICAgIHJpZ2h0U2libGluZ0VkaXRQYXJ0ID0gc2libGluZzsKLSAgICAgICAgICBpZiAoaW5kZXggPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxlZnRTaWJsaW5nRWRpdFBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIHNpYmxpbmdzLmdldChpbmRleCAtIDEpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChsZWZ0U2libGluZ0VkaXRQYXJ0ICE9IG51bGwgJiYgTWF0aC5hYnMoZ2V0Wm9vbWVkQm91bmRzKGxlZnRTaWJsaW5nRWRpdFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkpLmdldENlbnRlcigpLnkgLSBwb2ludGVyWUxvY2F0aW9uKSA+IE1hdGguYWJzKHNpYmxpbmdZTG9jYXRpb24gLSBwb2ludGVyWUxvY2F0aW9uKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjbG9zZXJTaWJsaW5nID0gQkVMT1dfSVNfQ0xPU0VSOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gaXNIYW5kbGVkID0gaGFuZGxlRmlyc3RBbmRMYXN0RHJvcFRhcmdldHMoaW5kZXgsIHNpYmxpbmdzKTsKLSAgICBpZiAoIWlzSGFuZGxlZCkKLSAgICAgIGhhbmRsZU90aGVyVGFyZ2V0cyhpbmRleCk7Ci0KLSAgICBjYWxjdWxhdGVMZWZ0QW5kUmlnaHRYU0RDb21wb25lbnRzKCk7Ci0gICAgCi0gICAgeHNkQ29tcG9uZW50VG9EcmFnID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSAoKFhTREJhc2VBZGFwdGVyKSBpdGVtVG9EcmFnLmdldE1vZGVsKCkpLmdldFRhcmdldCgpOyAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY2FsY3VsYXRlTGVmdEFuZFJpZ2h0WFNEQ29tcG9uZW50cygpCi0gIHsKLSAgICBpZiAobGVmdFNpYmxpbmdFZGl0UGFydCBpbnN0YW5jZW9mIFhTREJhc2VGaWVsZEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIE9iamVjdCBsZWZ0TW9kZWwgPSAoKFhTREJhc2VGaWVsZEVkaXRQYXJ0KSBsZWZ0U2libGluZ0VkaXRQYXJ0KS5nZXRNb2RlbCgpOwotICAgICAgcHJldmlvdXNSZWZDb21wb25lbnQgPSBudWxsOwotICAgICAgaWYgKGxlZnRNb2RlbCBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgICAgewotICAgICAgICBYU0RCYXNlQWRhcHRlciBsZWZ0QWRhcHRlciA9IChYU0RCYXNlQWRhcHRlcikgbGVmdE1vZGVsOwotICAgICAgICBwcmV2aW91c1JlZkNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgbGVmdEFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHJpZ2h0U2libGluZ0VkaXRQYXJ0IGluc3RhbmNlb2YgWFNEQmFzZUZpZWxkRWRpdFBhcnQpCi0gICAgewotICAgICAgT2JqZWN0IHJpZ2h0TW9kZWwgPSAoKFhTREJhc2VGaWVsZEVkaXRQYXJ0KSByaWdodFNpYmxpbmdFZGl0UGFydCkuZ2V0TW9kZWwoKTsKLSAgICAgIG5leHRSZWZDb21wb25lbnQgPSBudWxsOwotICAgICAgaWYgKHJpZ2h0TW9kZWwgaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgWFNEQmFzZUFkYXB0ZXIgcmlnaHRBZGFwdGVyID0gKFhTREJhc2VBZGFwdGVyKSByaWdodE1vZGVsOwotICAgICAgICBuZXh0UmVmQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSByaWdodEFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVGaXJzdEFuZExhc3REcm9wVGFyZ2V0cyhpbnQgaW5kZXgsIExpc3Qgc2libGluZ3MpCi0gIHsKLSAgICAvLyBIYW5kbGUgY2FzZSB3aGVyZSB5b3UgZHJvcCB0byBmaXJzdCBwb3NpdGlvbgotICAgIGlmIChpbmRleCA9PSAwICYmIHNpYmxpbmdzLnNpemUoKSA+IDApCi0gICAgewotICAgICAgbGVmdFNpYmxpbmdFZGl0UGFydCA9IG51bGw7Ci0gICAgICByaWdodFNpYmxpbmdFZGl0UGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgc2libGluZ3MuZ2V0KDApOwotICAgICAgY2xvc2VyU2libGluZyA9IEJFTE9XX0lTX0NMT1NFUjsKLSAgICB9Ci0gICAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgeW91IGRyb3AgdG8gbGFzdCBwb3NpdGlvbgotICAgIGVsc2UgaWYgKGluZGV4ID4gMCAmJiBpbmRleCA9PSBzaWJsaW5ncy5zaXplKCkpCi0gICAgewotICAgICAgbGVmdFNpYmxpbmdFZGl0UGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgc2libGluZ3MuZ2V0KGluZGV4IC0gMSk7Ci0gICAgICByaWdodFNpYmxpbmdFZGl0UGFydCA9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZU90aGVyVGFyZ2V0cyhpbnQgaW5kZXgpCi0gIHsKLSAgICBpbnQgaW4gPSAwOwotICAgIENvbm5lY3RhYmxlRWRpdFBhcnQgcHJldmlvdXNNb2RlbEVkaXRQYXJ0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0YXJnZXRTcGFjZXNMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgcHJldmlvdXNNb2RlbEVkaXRQYXJ0ID0gcGFyZW50RWRpdFBhcnQ7Ci0gICAgICBUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0IHNwID0gKFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpIG87Ci0gICAgICBpZiAoc3AuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBDb25uZWN0YWJsZUVkaXRQYXJ0KQotICAgICAgICBwYXJlbnRFZGl0UGFydCA9IChDb25uZWN0YWJsZUVkaXRQYXJ0KXNwLmdldFBhcmVudCgpOwotICAgICAgZWxzZQotICAgICAgICBwYXJlbnRFZGl0UGFydCA9IG51bGw7Ci0gICAgICBpbisrOwotICAgICAgaWYgKGluID4gaW5kZXgpCi0gICAgICB7Ci0gICAgICAgIGlmIChjbG9zZXJTaWJsaW5nID09IEFCT1ZFX0lTX0NMT1NFUikKLSAgICAgICAgewotICAgICAgICAgIHBhcmVudEVkaXRQYXJ0ID0gcHJldmlvdXNNb2RlbEVkaXRQYXJ0OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBMaXN0IGNhbGN1bGF0ZUZpZWxkRWRpdFBhcnRzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IHRhcmdldC5nZXRQYXJlbnQoKS5nZXRDaGlsZHJlbigpOwotICAgIExpc3QgbGlzdE9mRmllbGRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIEJhc2VGaWVsZEVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBsaXN0T2ZGaWVsZHMuYWRkKG8pOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdE9mRmllbGRzOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgUG9pbnRMaXN0IGRyYXdMaW5lcyhQb2x5bGluZSBwb2x5TGluZSkKLSAgewotICAgIFBvaW50TGlzdCBwb2ludExpc3QgPSBuZXcgUG9pbnRMaXN0KCk7Ci0KLSAgICBpZiAobGVmdFNpYmxpbmdFZGl0UGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIFJlY3RhbmdsZSBsZWZ0UmVjdGFuZ2xlID0gZ2V0Wm9vbWVkQm91bmRzKGxlZnRTaWJsaW5nRWRpdFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkpOwotICAgICAgaW50IHhDb29yZCA9IGxlZnRSZWN0YW5nbGUueDsKLSAgICAgIGludCB5Q29vcmQgPSBsZWZ0UmVjdGFuZ2xlLnk7Ci0gICAgICBpbnQgaGVpZ2h0ID0gbGVmdFJlY3RhbmdsZS5oZWlnaHQ7Ci0gICAgICBpbnQgd2lkdGggPSBsZWZ0UmVjdGFuZ2xlLndpZHRoOwotCi0gICAgICAvLyBEcmF3IGxlZnQgZW5kIGxpbmUKLSAgICAgIGFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQsIHlDb29yZCArIGhlaWdodCArIDMsIHhDb29yZCwgeUNvb3JkICsgaGVpZ2h0IC0gMyk7Ci0gICAgICBhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkLCB5Q29vcmQgKyBoZWlnaHQgLSAzLCB4Q29vcmQsIHlDb29yZCArIGhlaWdodCk7Ci0KLSAgICAgIC8vIERyYXcgaG9yaXpvbnRhbCBsaW5lCi0gICAgICBhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkLCB5Q29vcmQgKyBoZWlnaHQsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgKyBoZWlnaHQpOwotCi0gICAgICAvLyBEcmF3IHJpZ2h0IGVuZCBsaW5lCi0gICAgICBhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkICsgd2lkdGgsIHlDb29yZCArIGhlaWdodCwgeENvb3JkICsgd2lkdGgsIHlDb29yZCArIGhlaWdodCAtIDMpOwotICAgICAgYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgKyBoZWlnaHQsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgKyBoZWlnaHQgKyAzKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocmlnaHRTaWJsaW5nRWRpdFBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBSZWN0YW5nbGUgcmlnaHRSZWN0YW5nbGUgPSBnZXRab29tZWRCb3VuZHMocmlnaHRTaWJsaW5nRWRpdFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkpOwotICAgICAgaW50IHhDb29yZCA9IHJpZ2h0UmVjdGFuZ2xlLng7Ci0gICAgICBpbnQgeUNvb3JkID0gcmlnaHRSZWN0YW5nbGUueTsKLSAgICAgIGludCB3aWR0aCA9IHJpZ2h0UmVjdGFuZ2xlLndpZHRoOwotCi0gICAgICAvLyBEcmF3IGxlZnQgZW5kIGxpbmUKLSAgICAgIGFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQsIHlDb29yZCArIDMsIHhDb29yZCwgeUNvb3JkIC0gMyk7Ci0gICAgICBhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkLCB5Q29vcmQgLSAzLCB4Q29vcmQsIHlDb29yZCk7Ci0KLSAgICAgIC8vIERyYXcgaG9yaXpvbnRhbCBsaW5lCi0gICAgICBhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkLCB5Q29vcmQsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQpOwotCi0gICAgICAvLyBEcmF3IHJpZ2h0IGVuZCBsaW5lCi0gICAgICBhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkICsgd2lkdGgsIHlDb29yZCwgeENvb3JkICsgd2lkdGgsIHlDb29yZCAtIDMpOwotICAgICAgYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgKyAzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcG9pbnRMaXN0OwotICB9Ci0KLSAgcHJvdGVjdGVkIFBvbHlsaW5lIGFkZExpbmVUb1BvbHlsaW5lKFBvbHlsaW5lIHBvbHlsaW5lLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpCi0gIHsKLSAgICBwb2x5bGluZS5hZGRQb2ludChuZXcgUG9pbnQoeDEsIHkxKSk7Ci0gICAgcG9seWxpbmUuYWRkUG9pbnQobmV3IFBvaW50KHgyLCB5MikpOwotCi0gICAgcmV0dXJuIHBvbHlsaW5lOwotICB9Ci0gIAotICBwdWJsaWMgSUZpZ3VyZSBnZXRGZWVkYmFja0ZpZ3VyZSgpCi0gIHsKLSAgICBGaWd1cmUgcGFuZWwgPSBuZXcgRmlndXJlKCk7Ci0gICAgcGFuZWwuc2V0TGF5b3V0TWFuYWdlcihuZXcgRnJlZWZvcm1MYXlvdXQoKSk7Ci0gICAgcGFuZWwuc2V0T3BhcXVlKGZhbHNlKTsKLQotICAgIFBvbHlsaW5lIGZlZWRiYWNrRmlndXJlID0gbmV3IFBvbHlsaW5lKCk7Ci0gICAgZmVlZGJhY2tGaWd1cmUuc2V0TGluZVdpZHRoKDIpOwotICAgIGRyYXdMaW5lcyhmZWVkYmFja0ZpZ3VyZSk7Ci0gICAgb3JpZ2luYWxMb2NhdGlvbiA9IG5ldyBSZWN0YW5nbGUoZmVlZGJhY2tGaWd1cmUuZ2V0Qm91bmRzKCkpOwotICAgIHBhbmVsLmFkZChmZWVkYmFja0ZpZ3VyZSk7Ci0KLSAgICBwb2x5TGluZSA9IG5ldyBQb2x5bGluZSgpOwotICAgIHBvbHlMaW5lLnNldExpbmVTdHlsZShHcmFwaGljcy5MSU5FX0RBU0hET1QpOwotICAgIHBvbHlMaW5lLnNldExpbmVXaWR0aCgxKTsKLSAgICBwYW5lbC5hZGQocG9seUxpbmUpOwotICAgIAotICAgIHBhbmVsLnNldEJvdW5kcyhvcmlnaW5hbExvY2F0aW9uKTsKLSAgICAKLSAgICBhZGRDb25uZWN0b3JUb1BhcmVudChwYW5lbCk7Ci0KLSAgICBpZiAocGFyZW50RWRpdFBhcnQgIT0gbnVsbCAmJiBwYXJlbnRFZGl0UGFydC5nZXRGaWd1cmUoKSBpbnN0YW5jZW9mIEdlbmVyaWNHcm91cEZpZ3VyZSkKLSAgICB7Ci0gICAgICBHZW5lcmljR3JvdXBGaWd1cmUgZmlnID0gKEdlbmVyaWNHcm91cEZpZ3VyZSlwYXJlbnRFZGl0UGFydC5nZXRGaWd1cmUoKTsKLSAgICAgIFJlY3RhbmdsZSBpY29uQm91bmRzID0gZ2V0Wm9vbWVkQm91bmRzKGZpZy5nZXRJY29uRmlndXJlKCkuZ2V0Qm91bmRzKCkpOwotICAgICAgUm91bmRlZFJlY3RhbmdsZSByb3VuZGVkUmVjdGFuZ2xlID0gbmV3IFJvdW5kZWRSZWN0YW5nbGUoKTsKLSAgICAgIHJvdW5kZWRSZWN0YW5nbGUuc2V0RmlsbChmYWxzZSk7Ci0gICAgICByb3VuZGVkUmVjdGFuZ2xlLnNldE9wYXF1ZSh0cnVlKTsKLS8vICAgICAgcm91bmRlZFJlY3RhbmdsZS5zZXRCb3VuZHMobmV3IFJlY3RhbmdsZShpY29uQm91bmRzLngsIGljb25Cb3VuZHMueSwgaWNvbkJvdW5kcy53aWR0aCAtIDEsIGljb25Cb3VuZHMuaGVpZ2h0IC0gMSkpOwotICAgICAgcm91bmRlZFJlY3RhbmdsZS5zZXRCb3VuZHMoaWNvbkJvdW5kcyk7Ci0gICAgICBwYW5lbC5hZGQocm91bmRlZFJlY3RhbmdsZSk7Ci0gICAgfQotICAgIHJldHVybiBwYW5lbDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgYWRkQ29ubmVjdG9yVG9QYXJlbnQoSUZpZ3VyZSBwKQotICB7Ci0gICAgUmVjdGFuZ2xlIHIgPSBvcmlnaW5hbExvY2F0aW9uLmdldENvcHkoKTsKLSAgICBSZWN0YW5nbGUgcEJvdW5kcyA9IHIuZ2V0Q29weSgpOwotICAgIFBvaW50TGlzdCBwb2ludExpc3QgPSBnZXRDb25uZWN0aW9uUG9pbnRzKHIpOwotCi0gICAgaWYgKHBvaW50TGlzdCAhPSBudWxsICYmIHBvaW50TGlzdC5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIHBvbHlMaW5lLnNldFBvaW50cyhwb2ludExpc3QpOwotICAgICAgUG9pbnQgZmlyc3RQb2ludCA9IHBvaW50TGlzdC5nZXRGaXJzdFBvaW50KCk7Ci0gICAgICBpZiAoZmlyc3RQb2ludCAhPSBudWxsKQotICAgICAgewotICAgICAgICBwQm91bmRzID0gcEJvdW5kcy5nZXRVbmlvbihuZXcgUmVjdGFuZ2xlKGZpcnN0UG9pbnQueCwgZmlyc3RQb2ludC55LCAxLCAxKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBhcmVudEVkaXRQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKHBhcmVudEVkaXRQYXJ0LmdldEZpZ3VyZSgpIGluc3RhbmNlb2YgR2VuZXJpY0dyb3VwRmlndXJlKQotICAgICAgewotICAgICAgICBHZW5lcmljR3JvdXBGaWd1cmUgZmlnID0gKEdlbmVyaWNHcm91cEZpZ3VyZSlwYXJlbnRFZGl0UGFydC5nZXRGaWd1cmUoKTsKLSAgICAgICAgUmVjdGFuZ2xlIGljb25Cb3VuZHMgPSBnZXRab29tZWRCb3VuZHMoZmlnLmdldEljb25GaWd1cmUoKS5nZXRCb3VuZHMoKSk7Ci0gICAgICAgIHBCb3VuZHMgPSBwQm91bmRzLmdldFVuaW9uKGljb25Cb3VuZHMpOwotICAgICAgfQotICAgIH0KLQotICAgIHAuc2V0Qm91bmRzKHBCb3VuZHMpOwotICAgIHAudmFsaWRhdGUoKTsKLSAgfQotICAKLSAgcHVibGljIFBvaW50IGdldFpvb21lZFBvaW50KFBvaW50IHApCi0gIHsKLSAgICBkb3VibGUgZmFjdG9yID0gKChTY2FsYWJsZVJvb3RFZGl0UGFydCl2aWV3ZXIuZ2V0Um9vdEVkaXRQYXJ0KCkpLmdldFpvb21NYW5hZ2VyKCkuZ2V0Wm9vbSgpOwotCi0gICAgaW50IHggPSAoaW50KU1hdGgucm91bmQocC54ICogZmFjdG9yKTsKLSAgICBpbnQgeSA9IChpbnQpTWF0aC5yb3VuZChwLnkgKiBmYWN0b3IpOwotCi0gICAgcmV0dXJuIG5ldyBQb2ludCh4LCB5KTsKLSAgfQotICAKLSAgcHVibGljIFJlY3RhbmdsZSBnZXRab29tZWRCb3VuZHMoUmVjdGFuZ2xlIHIpCi0gIHsKLSAgICBkb3VibGUgZmFjdG9yID0gKChTY2FsYWJsZVJvb3RFZGl0UGFydCl2aWV3ZXIuZ2V0Um9vdEVkaXRQYXJ0KCkpLmdldFpvb21NYW5hZ2VyKCkuZ2V0Wm9vbSgpOwotCi0gICAgaW50IHggPSAoaW50KU1hdGgucm91bmQoci54ICogZmFjdG9yKTsKLSAgICBpbnQgeSA9IChpbnQpTWF0aC5yb3VuZChyLnkgKiBmYWN0b3IpOwotICAgIGludCB3aWR0aCA9IChpbnQpTWF0aC5yb3VuZChyLndpZHRoICogZmFjdG9yKTsKLSAgICBpbnQgaGVpZ2h0ID0gKGludClNYXRoLnJvdW5kKHIuaGVpZ2h0ICogZmFjdG9yKTsKLQotICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlS2V5Ym9hcmREcmFnQW5kRHJvcChYU0RCYXNlRmllbGRFZGl0UGFydCBsZWZ0RmllbGQsIFhTREJhc2VGaWVsZEVkaXRQYXJ0IHJpZ2h0RmllbGQsIGludCBkaXJlY3Rpb24pCi0gIHsKLSAgICB0YXJnZXQgPSBsZWZ0RmllbGQ7Ci0gICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCkKLSAgICB7Ci0gICAgICBpZiAoaXRlbVRvRHJhZyA9PSB0YXJnZXQpCi0gICAgICAgIHJldHVybjsKLSAgICAgIHRhcmdldCA9IHJpZ2h0RmllbGQ7Ci0gICAgfQotICAgIHRoaXMubG9jYXRpb24gPSBudWxsOwotICAgIGlmICh0YXJnZXQgIT0gbnVsbCkKLSAgICAgIHRoaXMubG9jYXRpb24gPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL1hTREF0dHJpYnV0ZURyYWdBbmREcm9wQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvWFNEQXR0cmlidXRlRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMDllYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvWFNEQXR0cmlidXRlRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5Nb3ZlWFNEQXR0cmlidXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEV2lsZGNhcmRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQ29tcGxleFR5cGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLlRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLlhTREF0dHJpYnV0ZXNGb3JBbm5vdGF0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLlhTREJhc2VGaWVsZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuR2VuZXJpY0dyb3VwRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RBdHRyaWJ1dGVEcmFnQW5kRHJvcENvbW1hbmQgZXh0ZW5kcyBCYXNlRHJhZ0FuZERyb3BDb21tYW5kCi17Ci0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVEcmFnQW5kRHJvcENvbW1hbmQoRWRpdFBhcnRWaWV3ZXIgdmlld2VyLCBDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QsIEdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldCwgWFNEQmFzZUZpZWxkRWRpdFBhcnQgaXRlbVRvRHJhZywgUG9pbnQgbG9jYXRpb24pCi0gIHsKLSAgICBzdXBlcih2aWV3ZXIsIHJlcXVlc3QpOwotICAgIHNldExhYmVsKE1lc3NhZ2VzLl9VSV9BQ1RJT05fRFJBR19EUk9QX0FUVFJJQlVURSk7Ci0gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgdGhpcy5pdGVtVG9EcmFnID0gaXRlbVRvRHJhZzsKLSAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgc2V0dXAoKTsKLSAgfQotCi0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVEcmFnQW5kRHJvcENvbW1hbmQoWFNEQmFzZUZpZWxkRWRpdFBhcnQgaXRlbVRvRHJhZywgWFNEQmFzZUZpZWxkRWRpdFBhcnQgbGVmdEZpZWxkLCBYU0RCYXNlRmllbGRFZGl0UGFydCByaWdodEZpZWxkLCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgc3VwZXIoaXRlbVRvRHJhZy5nZXRWaWV3ZXIoKSwgbnVsbCk7IAotICAgIHNldExhYmVsKE1lc3NhZ2VzLl9VSV9BQ1RJT05fRFJBR19EUk9QX0FUVFJJQlVURSk7IAotICAgIHRoaXMuaXRlbVRvRHJhZyA9IGl0ZW1Ub0RyYWc7Ci0gICAgY2FuRXhlY3V0ZSA9IGZhbHNlOwotICAgIGhhbmRsZUtleWJvYXJkRHJhZ0FuZERyb3AobGVmdEZpZWxkLCByaWdodEZpZWxkLCBkaXJlY3Rpb24pOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVLZXlib2FyZERyYWdBbmREcm9wKFhTREJhc2VGaWVsZEVkaXRQYXJ0IGxlZnRGaWVsZCwgWFNEQmFzZUZpZWxkRWRpdFBhcnQgcmlnaHRGaWVsZCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIHN1cGVyLmhhbmRsZUtleWJvYXJkRHJhZ0FuZERyb3AobGVmdEZpZWxkLCByaWdodEZpZWxkLCBkaXJlY3Rpb24pOwotICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpCi0gICAgewotICAgICAgaWYgKHRhcmdldCA9PSBudWxsKQotICAgICAgewotICAgICAgICB0YXJnZXQgPSByaWdodEZpZWxkOwotICAgICAgICB0aGlzLmxvY2F0aW9uID0gdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldFRvcCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIShsZWZ0RmllbGQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlcikKLSAgICAgICAgICAgICAgICAgfHwgbGVmdEZpZWxkLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZEFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIHRhcmdldCA9IHJpZ2h0RmllbGQ7Ci0gICAgICAgIHRoaXMubG9jYXRpb24gPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0VG9wKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSByZXR1cm47Ci0gICAgc2V0dXAoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc2V0dXAoKQotICB7Ci0gICAgY2FuRXhlY3V0ZSA9IGZhbHNlOwotCi0gICAgLy8gRHJvcCB0YXJnZXQgaXMgYXR0cmlidXRlIGdyb3VwIHJlZgotICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCkKLSAgICB7Ci0gICAgICBwYXJlbnRFZGl0UGFydCA9IChBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCkgdGFyZ2V0OwotICAgICAgaWYgKCgoR2VuZXJpY0dyb3VwRmlndXJlKSBwYXJlbnRFZGl0UGFydC5nZXRGaWd1cmUoKSkuZ2V0SWNvbkZpZ3VyZSgpLmdldEJvdW5kcygpLmNvbnRhaW5zKGxvY2F0aW9uKSkKLSAgICAgIHsKLSAgICAgICAgeHNkQ29tcG9uZW50VG9EcmFnID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSAoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlcikgaXRlbVRvRHJhZy5nZXRNb2RlbCgpKS5nZXRUYXJnZXQoKTsKLSAgICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RBdHRyaWJ1dGVBY3Rpb24oKChBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCkgcGFyZW50RWRpdFBhcnQpLmdldFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpLCB4c2RDb21wb25lbnRUb0RyYWcsIG51bGwsIG51bGwpOwotICAgICAgICBjYW5FeGVjdXRlID0gYWN0aW9uLmNhbk1vdmUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQmFzZUZpZWxkRWRpdFBhcnQpCi0gICAgewotICAgICAgdGFyZ2V0U3BhY2VzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbGlzdCBvZiBhbGwgc2libGluZyBmaWVsZCBlZGl0IHBhcnRzOwotICAgICAgTGlzdCB0YXJnZXRFZGl0UGFydFNpYmxpbmdzID0gY2FsY3VsYXRlRmllbGRFZGl0UGFydHMoKTsKLSAgICAgIGNhbGN1bGF0ZUF0dHJpYnV0ZUdyb3VwTGlzdCgpOwotCi0gICAgICAvLyBHZXQgJ2xlZnQnIGFuZCAncmlnaHQnIHNpYmxpbmdzCi0gICAgICBkb0Ryb3AodGFyZ2V0RWRpdFBhcnRTaWJsaW5ncywgaXRlbVRvRHJhZyk7Ci0gICAgfQotICB9ICAKLSAgCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLkJhc2VEcmFnQW5kRHJvcENvbW1hbmQjZ2V0RWxlbWVudCgpCi0gICAqLwotICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRFbGVtZW50KCkKLSAgewotCSAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyKSBpdGVtVG9EcmFnLmdldE1vZGVsKCk7Ci0JICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB0YXJnZXQgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pYWRhcHRlci5nZXRUYXJnZXQoKTsKLQkgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCl0YXJnZXQuZUNvbnRhaW5lcigpOwotCSAgcmV0dXJuIHBhcmVudC5nZXRFbGVtZW50KCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBkb0Ryb3AoTGlzdCBzaWJsaW5ncywgR3JhcGhpY2FsRWRpdFBhcnQgbW92aW5nRWRpdFBhcnQpCi0gIHsKLSAgICBjb21tb25TZXR1cChzaWJsaW5ncywgbW92aW5nRWRpdFBhcnQpOwotCi0gICAgaWYgKChwcmV2aW91c1JlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHx8IHByZXZpb3VzUmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpIAotICAgICAgICAmJiAobmV4dFJlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHx8IG5leHRSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkpCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gcHJldmlvdXNSZWZDb21wb25lbnQuZ2V0Q29udGFpbmVyKCkuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAoY2xvc2VyU2libGluZyA9PSBCRUxPV19JU19DTE9TRVIpCi0gICAgICB7Ci0gICAgICAgIHBhcmVudCA9IG5leHRSZWZDb21wb25lbnQuZ2V0Q29udGFpbmVyKCkuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICB9Ci0gICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREF0dHJpYnV0ZUFjdGlvbihwYXJlbnQsIHhzZENvbXBvbmVudFRvRHJhZywgcHJldmlvdXNSZWZDb21wb25lbnQsIG5leHRSZWZDb21wb25lbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwcmV2aW91c1JlZkNvbXBvbmVudCA9PSBudWxsICYmIChuZXh0UmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gfHwgbmV4dFJlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKSkKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSBuZXh0UmVmQ29tcG9uZW50LmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKGNsb3NlclNpYmxpbmcgPT0gQUJPVkVfSVNfQ0xPU0VSKQotICAgICAgewotICAgICAgICBpZiAobGVmdFNpYmxpbmdFZGl0UGFydCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RBdHRyaWJ1dGVBY3Rpb24ocGFyZW50LCB4c2RDb21wb25lbnRUb0RyYWcsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnRFZGl0UGFydCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RBdHRyaWJ1dGVBY3Rpb24ocGFyZW50RWRpdFBhcnQuZ2V0WFNEQ29uY3JldGVDb21wb25lbnQoKSwgeHNkQ29tcG9uZW50VG9EcmFnLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RBdHRyaWJ1dGVBY3Rpb24ocGFyZW50LCB4c2RDb21wb25lbnRUb0RyYWcsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAocHJldmlvdXNSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiAmJiBuZXh0UmVmQ29tcG9uZW50ID09IG51bGwpCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gcHJldmlvdXNSZWZDb21wb25lbnQuZ2V0Q29udGFpbmVyKCkuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAoY2xvc2VyU2libGluZyA9PSBBQk9WRV9JU19DTE9TRVIpCi0gICAgICB7Ci0gICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNEQXR0cmlidXRlQWN0aW9uKHBhcmVudCwgeHNkQ29tcG9uZW50VG9EcmFnLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChyaWdodFNpYmxpbmdFZGl0UGFydCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RBdHRyaWJ1dGVBY3Rpb24ocGFyZW50LCB4c2RDb21wb25lbnRUb0RyYWcsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREF0dHJpYnV0ZUFjdGlvbihwYXJlbnQsIHhzZENvbXBvbmVudFRvRHJhZywgcHJldmlvdXNSZWZDb21wb25lbnQsIG5leHRSZWZDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGFjdGlvbiAhPSBudWxsKQotICAgICAgY2FuRXhlY3V0ZSA9IGFjdGlvbi5jYW5Nb3ZlKCk7Ci0gIH0KLQotICAKLSAgLy8gQXR0cmlidXRlIEdyb3VwIHJlbGF0ZWQgaGVscGVyIG1ldGhvZCAKLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNhbGN1bGF0ZUF0dHJpYnV0ZUdyb3VwTGlzdCgpCi0gIHsKLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IHRhcmdldDsKLSAgICB3aGlsZSAoZWRpdFBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb21wbGV4VHlwZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBMaXN0IGxpc3QgPSBlZGl0UGFydC5nZXRDaGlsZHJlbigpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBjaGlsZCA9IGkubmV4dCgpOwotICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIENvbXBhcnRtZW50RWRpdFBhcnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgTGlzdCBjb21wYXJ0bWVudExpc3QgPSAoKENvbXBhcnRtZW50RWRpdFBhcnQpIGNoaWxkKS5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNvbXBhcnRtZW50TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlc0ZvckFubm90YXRpb25FZGl0UGFydCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhTREF0dHJpYnV0ZXNGb3JBbm5vdGF0aW9uRWRpdFBhcnQgZ3JvdXBzID0gKFhTREF0dHJpYnV0ZXNGb3JBbm5vdGF0aW9uRWRpdFBhcnQpIG9iajsKLSAgICAgICAgICAgICAgICBMaXN0IGdyb3VwTGlzdCA9IGdyb3Vwcy5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdyb3VwTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgT2JqZWN0IGdyb3VwQ2hpbGQgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgIGlmIChncm91cENoaWxkIGluc3RhbmNlb2YgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U3BhY2VzTGlzdC5hZGQoZ3JvdXBDaGlsZCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChncm91cENoaWxkIGluc3RhbmNlb2YgQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGdldEF0dHJpYnV0ZUdyb3VwRWRpdFBhcnRzKChBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCkgZ3JvdXBDaGlsZCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlZGl0UGFydCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpOwotICAgIH0KLQotICB9Ci0KLSAgLy8gQXR0cmlidXRlIEdyb3VwIHJlbGF0ZWQgaGVscGVyIG1ldGhvZAotICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0QXR0cmlidXRlR3JvdXBFZGl0UGFydHMoQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQgYXR0cmlidXRlR3JvdXBFZGl0UGFydCkKLSAgewotICAgIExpc3QgZ3JvdXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIExpc3QgbGlzdCA9IGF0dHJpYnV0ZUdyb3VwRWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gaS5uZXh0KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0U3BhY2VzTGlzdC5hZGQob2JqZWN0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCBncm91cFJlZiA9IChBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCkgb2JqZWN0OwotICAgICAgICBMaXN0IGdyb3VwUmVmQ2hpbGRyZW4gPSBncm91cFJlZi5nZXRDaGlsZHJlbigpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZ3JvdXBSZWZDaGlsZHJlbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldFNwYWNlc0xpc3QuYWRkKG8pOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQgYUdyb3VwID0gKEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KSBvOwotICAgICAgICAgICAgZ3JvdXBMaXN0LmFkZChhR3JvdXApOwotICAgICAgICAgICAgZ3JvdXBMaXN0LmFkZEFsbChnZXRBdHRyaWJ1dGVHcm91cEVkaXRQYXJ0cyhhR3JvdXApKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGdyb3VwTGlzdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvWFNERWxlbWVudERyYWdBbmREcm9wQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvWFNERWxlbWVudERyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWY0NWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL1hTREVsZW1lbnREcmFnQW5kRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLk1vdmVYU0RFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFdpbGRjYXJkQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VGaWVsZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkNvbXBsZXhUeXBlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5TdHJ1Y3R1cmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2VFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuTW9kZWxHcm91cEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5UYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5YU0RCYXNlRmllbGRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuWFNER3JvdXBzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuR2VuZXJpY0dyb3VwRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBYU0RFbGVtZW50RHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgQmFzZURyYWdBbmREcm9wQ29tbWFuZAotewotICBwcm90ZWN0ZWQgTW9kZWxHcm91cEVkaXRQYXJ0IHRvcE1vc3RHcm91cDsKLQotICBwdWJsaWMgWFNERWxlbWVudERyYWdBbmREcm9wQ29tbWFuZChFZGl0UGFydFZpZXdlciB2aWV3ZXIsIENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCwgR3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0LCBYU0RCYXNlRmllbGRFZGl0UGFydCBpdGVtVG9EcmFnLCBQb2ludCBsb2NhdGlvbikKLSAgewotICAgIHN1cGVyKHZpZXdlciwgcmVxdWVzdCk7Ci0gICAgc2V0TGFiZWwoTWVzc2FnZXMuX1VJX0FDVElPTl9EUkFHX0RST1BfRUxFTUVOVCk7Ci0gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgdGhpcy5pdGVtVG9EcmFnID0gaXRlbVRvRHJhZzsKLSAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgc2V0dXAoKTsKLSAgfQotICAKLSAgcHVibGljIFhTREVsZW1lbnREcmFnQW5kRHJvcENvbW1hbmQoWFNEQmFzZUZpZWxkRWRpdFBhcnQgaXRlbVRvRHJhZywgWFNEQmFzZUZpZWxkRWRpdFBhcnQgbGVmdEZpZWxkLCBYU0RCYXNlRmllbGRFZGl0UGFydCByaWdodEZpZWxkLCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgc3VwZXIoaXRlbVRvRHJhZy5nZXRWaWV3ZXIoKSwgbnVsbCk7IAotICAgIHNldExhYmVsKE1lc3NhZ2VzLl9VSV9BQ1RJT05fRFJBR19EUk9QX0VMRU1FTlQpOyAKLSAgICB0aGlzLml0ZW1Ub0RyYWcgPSBpdGVtVG9EcmFnOwotICAgIGNhbkV4ZWN1dGUgPSBmYWxzZTsKLSAgICBoYW5kbGVLZXlib2FyZERyYWdBbmREcm9wKGxlZnRGaWVsZCwgcmlnaHRGaWVsZCwgZGlyZWN0aW9uKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlS2V5Ym9hcmREcmFnQW5kRHJvcChYU0RCYXNlRmllbGRFZGl0UGFydCBsZWZ0RmllbGQsIFhTREJhc2VGaWVsZEVkaXRQYXJ0IHJpZ2h0RmllbGQsIGludCBkaXJlY3Rpb24pCi0gIHsKLSAgICBzdXBlci5oYW5kbGVLZXlib2FyZERyYWdBbmREcm9wKGxlZnRGaWVsZCwgcmlnaHRGaWVsZCwgZGlyZWN0aW9uKTsKLSAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKQotICAgIHsKLSAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0ID0gcmlnaHRGaWVsZDsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IHRhcmdldC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRUb3AoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCEobGVmdEZpZWxkLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKQotICAgICAgICAgICAgICAgICB8fCBsZWZ0RmllbGQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0ID0gcmlnaHRGaWVsZDsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IHRhcmdldC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRUb3AoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGxvY2F0aW9uID09IG51bGwpIHJldHVybjsKLSAgICBzZXR1cCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0dXAoKQotICB7Ci0gICAgY2FuRXhlY3V0ZSA9IGZhbHNlOwotCi0gICAgLy8gRHJvcCB0YXJnZXQgaXMgbW9kZWwgZ3JvdXAKLSAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgTW9kZWxHcm91cEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIHBhcmVudEVkaXRQYXJ0ID0gKE1vZGVsR3JvdXBFZGl0UGFydCkgdGFyZ2V0OwotICAgICAgaWYgKCgoR2VuZXJpY0dyb3VwRmlndXJlKSBwYXJlbnRFZGl0UGFydC5nZXRGaWd1cmUoKSkuZ2V0SWNvbkZpZ3VyZSgpLmdldEJvdW5kcygpLmNvbnRhaW5zKGxvY2F0aW9uKSkKLSAgICAgIHsKLSAgICAgICAgeHNkQ29tcG9uZW50VG9EcmFnID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpIGl0ZW1Ub0RyYWcuZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNERWxlbWVudEFjdGlvbigoKE1vZGVsR3JvdXBFZGl0UGFydCkgdGFyZ2V0KS5nZXRYU0RNb2RlbEdyb3VwKCksIHhzZENvbXBvbmVudFRvRHJhZywgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGNhbkV4ZWN1dGUgPSBhY3Rpb24uY2FuTW92ZSgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBCYXNlRmllbGRFZGl0UGFydCkKLSAgICB7Ci0gICAgICB0YXJnZXRTcGFjZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBsaXN0IG9mIGFsbCBzaWJsaW5nIGZpZWxkIGVkaXQgcGFydHM7Ci0gICAgICBMaXN0IHRhcmdldEVkaXRQYXJ0U2libGluZ3MgPSBjYWxjdWxhdGVGaWVsZEVkaXRQYXJ0cygpOwotICAgICAgY2FsY3VsYXRlTW9kZWxHcm91cExpc3QoKTsKLQotICAgICAgZG9Ecm9wKHRhcmdldEVkaXRQYXJ0U2libGluZ3MsIGl0ZW1Ub0RyYWcpOwotICAgIH0KLSAgfQotICAKLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuQmFzZURyYWdBbmREcm9wQ29tbWFuZCNnZXRFbGVtZW50KCkKLSAgICovCi0gIHByb3RlY3RlZCBFbGVtZW50IGdldEVsZW1lbnQoKQotICB7Ci0JICBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcikgaXRlbVRvRHJhZy5nZXRNb2RlbCgpOwotCSAgWFNERWxlbWVudERlY2xhcmF0aW9uIHRhcmdldCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pYWRhcHRlci5nZXRUYXJnZXQoKTsKLQkgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCl0YXJnZXQuZUNvbnRhaW5lcigpOwkgIAotCSAgcmV0dXJuIHBhcmVudC5nZXRFbGVtZW50KCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGRvRHJvcChMaXN0IHNpYmxpbmdzLCBHcmFwaGljYWxFZGl0UGFydCBtb3ZpbmdFZGl0UGFydCkKLSAgewotICAgIGNvbW1vblNldHVwKHNpYmxpbmdzLCBtb3ZpbmdFZGl0UGFydCk7Ci0KLSAgICAvLyBDYW4gY29tbW9uIHRoaXMgY29kZSB1cCB3aXRoIFhTREF0dHJpYnV0ZURyYWdBbmREcm9wQ29tbWFuZC4uLiAKLSAgICBpZiAoKHByZXZpb3VzUmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uIHx8IHByZXZpb3VzUmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpCi0gICAgICAgICYmIChuZXh0UmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uIHx8IG5leHRSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkpIAotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwKSBwcmV2aW91c1JlZkNvbXBvbmVudC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChwYXJlbnRFZGl0UGFydCAhPSBudWxsKQotICAgICAgICBtb2RlbEdyb3VwID0gKChNb2RlbEdyb3VwRWRpdFBhcnQpIHBhcmVudEVkaXRQYXJ0KS5nZXRYU0RNb2RlbEdyb3VwKCk7Ci0gICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREVsZW1lbnRBY3Rpb24obW9kZWxHcm91cCwgeHNkQ29tcG9uZW50VG9EcmFnLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByZXZpb3VzUmVmQ29tcG9uZW50ID09IG51bGwgJiYgKG5leHRSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24gfHwgbmV4dFJlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKSkKLSAgICB7Ci0gICAgICBpZiAoY2xvc2VyU2libGluZyA9PSBBQk9WRV9JU19DTE9TRVIpCi0gICAgICB7Ci0gICAgICAgIGlmIChsZWZ0U2libGluZ0VkaXRQYXJ0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREVsZW1lbnRBY3Rpb24odG9wTW9zdEdyb3VwLmdldFhTRE1vZGVsR3JvdXAoKSwgeHNkQ29tcG9uZW50VG9EcmFnLCBudWxsLCBudWxsLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyZW50RWRpdFBhcnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNERWxlbWVudEFjdGlvbigoKE1vZGVsR3JvdXBFZGl0UGFydCkgcGFyZW50RWRpdFBhcnQpLmdldFhTRE1vZGVsR3JvdXAoKSwgeHNkQ29tcG9uZW50VG9EcmFnLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXApIG5leHRSZWZDb21wb25lbnQuZ2V0Q29udGFpbmVyKCkuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNERWxlbWVudEFjdGlvbihtb2RlbEdyb3VwLCB4c2RDb21wb25lbnRUb0RyYWcsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoKHByZXZpb3VzUmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uIHx8IHByZXZpb3VzUmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpICAKLSAgICAgICAgJiYgbmV4dFJlZkNvbXBvbmVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwKXByZXZpb3VzUmVmQ29tcG9uZW50LmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKHBhcmVudEVkaXRQYXJ0ICE9IG51bGwpCi0gICAgICAgIG1vZGVsR3JvdXAgPSAoKE1vZGVsR3JvdXBFZGl0UGFydCkgcGFyZW50RWRpdFBhcnQpLmdldFhTRE1vZGVsR3JvdXAoKTsKLSAgICAgIGlmIChjbG9zZXJTaWJsaW5nID09IEFCT1ZFX0lTX0NMT1NFUikKLSAgICAgIHsKLSAgICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RFbGVtZW50QWN0aW9uKG1vZGVsR3JvdXAsIHhzZENvbXBvbmVudFRvRHJhZywgcHJldmlvdXNSZWZDb21wb25lbnQsIG5leHRSZWZDb21wb25lbnQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAocmlnaHRTaWJsaW5nRWRpdFBhcnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNERWxlbWVudEFjdGlvbih0b3BNb3N0R3JvdXAuZ2V0WFNETW9kZWxHcm91cCgpLCB4c2RDb21wb25lbnRUb0RyYWcsIG51bGwsIG51bGwsIHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNERWxlbWVudEFjdGlvbihtb2RlbEdyb3VwLCB4c2RDb21wb25lbnRUb0RyYWcsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChhY3Rpb24gIT0gbnVsbCkKLSAgICAgIGNhbkV4ZWN1dGUgPSBhY3Rpb24uY2FuTW92ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIG92ZXJyaWRlcyBiYXNlCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVGaXJzdEFuZExhc3REcm9wVGFyZ2V0cyhpbnQgaW5kZXgsIExpc3Qgc2libGluZ3MpCi0gIHsKLSAgICAvLyBUaGlzIGJvb2xlYW4gaXMgdG8gaGFuZGxlIHRoZSBUb3AgYW5kIEJvdHRvbSBkcm9wIHRhcmdldHMgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZHJvcAotICAgIC8vIHRvIHRoZSB0b3AgbW9zdCBtb2RlbCBncm91cAotICAgIC8vIFRPRE86IEkgbmVlZCB0byByZWFycmFuZ2UgdGhpcyBjb2RlIGJldHRlcgotICAgIGJvb2xlYW4gaXNIYW5kbGVkID0gZmFsc2U7Ci0gICAgaW50IHBvaW50ZXJZTG9jYXRpb24gPSBsb2NhdGlvbi55OwotICAgIC8vIFdlIG5lZWQgdG8gZmluZCB0aGUgcGFyZW50IGVkaXRwYXJ0LCB3aGljaCBpcyB0aGUgbW9kZWwgZ3JvdXAKLSAgICAvLyBIYW5kbGUgY2FzZSB3aGVyZSB5b3UgZHJvcCB0byBmaXJzdCBwb3NpdGlvbgotICAgIGlmIChpbmRleCA9PSAwICYmIHNpYmxpbmdzLnNpemUoKSA+IDApCi0gICAgewotICAgICAgbGVmdFNpYmxpbmdFZGl0UGFydCA9IG51bGw7Ci0gICAgICByaWdodFNpYmxpbmdFZGl0UGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgc2libGluZ3MuZ2V0KDApOwotICAgICAgaW50IHNpYmxpbmdZTG9jYXRpb24gPSBnZXRab29tZWRCb3VuZHMocmlnaHRTaWJsaW5nRWRpdFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkpLmdldENlbnRlcigpLnk7Ci0gICAgICBjbG9zZXJTaWJsaW5nID0gQkVMT1dfSVNfQ0xPU0VSOwotICAgICAgaWYgKE1hdGguYWJzKHBvaW50ZXJZTG9jYXRpb24gLSBzaWJsaW5nWUxvY2F0aW9uKSA+IGdldFpvb21lZEJvdW5kcyhyaWdodFNpYmxpbmdFZGl0UGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKSkuaGVpZ2h0IC8gNCkKLSAgICAgIHsKLSAgICAgICAgaXNIYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgcGFyZW50RWRpdFBhcnQgPSB0b3BNb3N0R3JvdXA7Ci0gICAgICAgIGlmICh0b3BNb3N0R3JvdXAgIT0gbnVsbCkKLSAgICAgICAgICBjbG9zZXJTaWJsaW5nID0gQUJPVkVfSVNfQ0xPU0VSOwotICAgICAgfQotICAgIH0KLSAgICAvLyBIYW5kbGUgY2FzZSB3aGVyZSB5b3UgZHJvcCB0byBsYXN0IHBvc2l0aW9uCi0gICAgaWYgKGluZGV4ID4gMCAmJiBpbmRleCA9PSBzaWJsaW5ncy5zaXplKCkpCi0gICAgewotICAgICAgbGVmdFNpYmxpbmdFZGl0UGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgc2libGluZ3MuZ2V0KGluZGV4IC0gMSk7Ci0gICAgICBpbnQgc2libGluZ1lMb2NhdGlvbiA9IGdldFpvb21lZEJvdW5kcyhsZWZ0U2libGluZ0VkaXRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpKS5nZXRDZW50ZXIoKS55OwotICAgICAgaWYgKE1hdGguYWJzKHBvaW50ZXJZTG9jYXRpb24gLSBzaWJsaW5nWUxvY2F0aW9uKSA+IGdldFpvb21lZEJvdW5kcyhsZWZ0U2libGluZ0VkaXRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpKS5oZWlnaHQgLyA0KQotICAgICAgewotICAgICAgICBpc0hhbmRsZWQgPSB0cnVlOwotICAgICAgICBwYXJlbnRFZGl0UGFydCA9IHRvcE1vc3RHcm91cDsKLSAgICAgICAgaWYgKHRvcE1vc3RHcm91cCAhPSBudWxsKQotICAgICAgICAgIGNsb3NlclNpYmxpbmcgPSBCRUxPV19JU19DTE9TRVI7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpc0hhbmRsZWQ7Ci0gIH0KLQotICAvLyBNZXRob2RzIHNwZWNpZmljIHRvIGVsZW1lbnQgYXMgZHJhZyBzb3VyY2UKLSAgCi0gIC8vIE1vZGVsIEdyb3VwIHJlbGF0ZWQgaGVscGVyIG1ldGhvZAotICBwcm90ZWN0ZWQgdm9pZCBjYWxjdWxhdGVNb2RlbEdyb3VwTGlzdCgpCi0gIHsKLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IHRhcmdldDsKLSAgICB3aGlsZSAoZWRpdFBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBNb2RlbEdyb3VwRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIGdldE1vZGVsR3JvdXBFZGl0UGFydHMoKE1vZGVsR3JvdXBFZGl0UGFydCkgZWRpdFBhcnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb21wbGV4VHlwZUVkaXRQYXJ0IHx8IGVkaXRQYXJ0IGluc3RhbmNlb2YgU3RydWN0dXJlRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gZm91bmRUb3AgPSBmYWxzZTsKLSAgICAgICAgTGlzdCBsaXN0ID0gZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3QgY2hpbGQgPSBpLm5leHQoKTsKLSAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb21wYXJ0bWVudEVkaXRQYXJ0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIExpc3QgY29tcGFydG1lbnRMaXN0ID0gKChDb21wYXJ0bWVudEVkaXRQYXJ0KSBjaGlsZCkuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjb21wYXJ0bWVudExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTREdyb3Vwc0ZvckFubm90YXRpb25FZGl0UGFydCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhTREdyb3Vwc0ZvckFubm90YXRpb25FZGl0UGFydCBncm91cHMgPSAoWFNER3JvdXBzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0KSBvYmo7Ci0gICAgICAgICAgICAgICAgTGlzdCBncm91cExpc3QgPSBncm91cHMuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBncm91cExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIE9iamVjdCBncm91cENoaWxkID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBDaGlsZCBpbnN0YW5jZW9mIE1vZGVsR3JvdXBFZGl0UGFydCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZFRvcCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGZvdW5kVG9wID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICB0b3BNb3N0R3JvdXAgPSAoTW9kZWxHcm91cEVkaXRQYXJ0KSBncm91cENoaWxkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGdldE1vZGVsR3JvdXBFZGl0UGFydHMoKE1vZGVsR3JvdXBFZGl0UGFydCkgZ3JvdXBDaGlsZCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlZGl0UGFydCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpOwotICAgIH0KLSAgfQotCi0gIC8vIE1vZGVsIEdyb3VwIHJlbGF0ZWQgaGVscGVyIG1ldGhvZAotICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxHcm91cEVkaXRQYXJ0cyhNb2RlbEdyb3VwRWRpdFBhcnQgbW9kZWxHcm91cEVkaXRQYXJ0KQotICB7Ci0gICAgTGlzdCBtb2RlbEdyb3VwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBMaXN0IGxpc3QgPSBtb2RlbEdyb3VwRWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gaS5uZXh0KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0U3BhY2VzTGlzdC5hZGQob2JqZWN0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIE1vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlRWRpdFBhcnQgZ3JvdXBSZWYgPSAoTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2VFZGl0UGFydCkgb2JqZWN0OwotICAgICAgICBMaXN0IGdyb3VwUmVmQ2hpbGRyZW4gPSBncm91cFJlZi5nZXRDaGlsZHJlbigpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZ3JvdXBSZWZDaGlsZHJlbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBNb2RlbEdyb3VwRWRpdFBhcnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2V0TW9kZWxHcm91cEVkaXRQYXJ0cygoTW9kZWxHcm91cEVkaXRQYXJ0KSBvKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1vZGVsR3JvdXBFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgZ2V0TW9kZWxHcm91cEVkaXRQYXJ0cygoTW9kZWxHcm91cEVkaXRQYXJ0KSBvYmplY3QpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbW9kZWxHcm91cExpc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViYmQzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5DZW50ZXJlZENvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLlRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkdlbmVyaWNHcm91cEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCBleHRlbmRzIENvbm5lY3RhYmxlRWRpdFBhcnQKLXsKLQlSZWZlcmVuY2VDb25uZWN0aW9uIGZpZ3VyZTsKLQlHZW5lcmljR3JvdXBGaWd1cmUgZ3JvdXBGaWd1cmU7IAotICBwdWJsaWMgQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gZ2V0WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkKLSAgewotICAgIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcikKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcikgZ2V0TW9kZWwoKTsKLSAgICAgIHJldHVybiAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBhZGFwdGVyLmdldFRhcmdldCgpOwotICAgIH0KLS8vICAgIGVsc2UgaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0vLyAgICB7Ci0vLyAgICAgIHJldHVybiAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBnZXRNb2RlbCgpOwotLy8gICAgfQotICAgIHJldHVybiBudWxsOwotCi0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0JZ3JvdXBGaWd1cmUgPSBuZXcgR2VuZXJpY0dyb3VwRmlndXJlKCk7Ci0gICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpIGdldE1vZGVsKCk7Ci0gICAgZ3JvdXBGaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLmltYWdlID0gYWRhcHRlci5nZXRJbWFnZSgpOwotICAgIExhYmVsIHRvb2xUaXBzTGFiZWwgPSBuZXcgTGFiZWwoKTsKLSAgICB0b29sVGlwc0xhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1BBR0VfSEVBRElOR19BVFRSSUJVVEVHUk9VUF9SRUYiKSk7Ci0gICAgZ3JvdXBGaWd1cmUuc2V0VG9vbFRpcCh0b29sVGlwc0xhYmVsKTsKLSAgICByZXR1cm4gZ3JvdXBGaWd1cmU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAKLSAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcilnZXRNb2RlbCgpOwotICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSBhZGFwdGVyLmdldFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpOwotICAgIEl0ZXJhdG9yIGkgPSBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24uZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0KLSAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KSBpLm5leHQoKTsKLQotICAgICAgaWYgKGF0dHJHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYXR0ckdyb3VwQ29udGVudCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQobmV3IFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcigoWFNEQmFzZUFkYXB0ZXIpWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCgoKFhTREF0dHJpYnV0ZVVzZSlhdHRyR3JvdXBDb250ZW50KS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKSkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBsaXN0LmFkZChuZXcgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyKChYU0RCYXNlQWRhcHRlcilnZXRNb2RlbCgpKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChsaXN0LmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBsaXN0LmFkZChuZXcgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyKChYU0RCYXNlQWRhcHRlcilnZXRNb2RlbCgpKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotCi0gIHB1YmxpYyBSZWZlcmVuY2VDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoQmFzZUVkaXRQYXJ0IGNoaWxkKQotICB7Ci0gICAgUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmlndXJlID0gbmV3IFJlZmVyZW5jZUNvbm5lY3Rpb24oKTsKLQotICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0U291cmNlQW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoKChHZW5lcmljR3JvdXBGaWd1cmUpZ2V0RmlndXJlKCkpLmdldEljb25GaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLlJJR0hULCAwLCAwKSk7Ci0KLSAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCkKLSAgICB7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldFRhcmdldEFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKCgoQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpIGNoaWxkKS5nZXRUYXJnZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLkxFRlQsIDAsIDApKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KQotICAgIHsKLS8vICAgICAgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCBlbGVtID0gKFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpIGNoaWxkOwotICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRUYXJnZXRBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcigoKFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpIGNoaWxkKS5nZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLkxFRlQsIDAsIDApKTsKLSAgICB9Ci0KLSAgICBjb25uZWN0aW9uRmlndXJlLnNldEhpZ2hsaWdodChmYWxzZSk7Ci0gICAgZmlndXJlID0gY29ubmVjdGlvbkZpZ3VyZTsKLSAgICByZXR1cm4gY29ubmVjdGlvbkZpZ3VyZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRSZWFkZXJUZXh0KCkKLSAgewotCVN0cmluZyB0ZXh0ID0gKChMYWJlbCkgZ3JvdXBGaWd1cmUuZ2V0VG9vbFRpcCgpKS5nZXRUZXh0KCk7Ci0JcmV0dXJuIHRleHQ7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9DYXRlZ29yeUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL0NhdGVnb3J5RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM4MDA4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL0NhdGVnb3J5RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2Nyb2xsUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVmlld3BvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlZpZXdwb3J0TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5DYXRlZ29yeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5FZGl0UGFydE5hdmlnYXRpb25IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzLkhlYWRpbmdGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5Sb3VuZGVkTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmxheW91dHMuQ29udGFpbmVyTGF5b3V0OwotCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnlFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAotewotICBwcm90ZWN0ZWQgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotICBwcm90ZWN0ZWQgRmlndXJlIG91dGVyUGFuZTsKLSAgSGVhZGluZ0ZpZ3VyZSBoZWFkaW5nRmlndXJlOwotICBwcm90ZWN0ZWQgU2Nyb2xsUGFuZSBzY3JvbGxwYW5lOwotICBwcm90ZWN0ZWQgaW50IG1pbmltdW1IZWlnaHQgPSA0MDA7Ci0KLSAgcHVibGljIGludCBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiAoKENhdGVnb3J5QWRhcHRlcikgZ2V0TW9kZWwoKSkuZ2V0R3JvdXBUeXBlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgb3V0ZXJQYW5lID0gbmV3IEZpZ3VyZSgpOwotICAgIG91dGVyUGFuZS5zZXRCb3JkZXIobmV3IFJvdW5kZWRMaW5lQm9yZGVyKDEsIDYpKTsKLQotICAgIGNyZWF0ZUhlYWRpbmdGaWd1cmUoKTsKLQotICAgIGludCBtaW5IZWlnaHQgPSBTV1QuREVGQVVMVDsKLSAgICBzd2l0Y2ggKGdldFR5cGUoKSkKLSAgICB7Ci0gICAgY2FzZSBDYXRlZ29yeUFkYXB0ZXIuRElSRUNUSVZFUzoKLSAgICB7Ci0gICAgICBtaW5IZWlnaHQgPSA4MDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIENhdGVnb3J5QWRhcHRlci5BVFRSSUJVVEVTOgotICAgIGNhc2UgQ2F0ZWdvcnlBZGFwdGVyLkdST1VQUzoKLSAgICB7Ci0gICAgICBtaW5IZWlnaHQgPSAxMDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgfQotCi0gICAgZmluYWwgaW50IHRoZU1pbkhlaWdodCA9IG1pbkhlaWdodDsKLSAgICAgCi0gICAgVG9vbGJhckxheW91dCBvdXRlckxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KGZhbHNlKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShJRmlndXJlIHBhcmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotICAgICAgewotICAgICAgICBEaW1lbnNpb24gZCA9IHN1cGVyLmNhbGN1bGF0ZVByZWZlcnJlZFNpemUocGFyZW50LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgZC51bmlvbihuZXcgRGltZW5zaW9uKDI1MCwgdGhlTWluSGVpZ2h0KSk7Ci0gICAgICAgIHJldHVybiBkOwotICAgICAgfQotICAgIH07Ci0gICAgb3V0ZXJMYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyh0cnVlKTsKLSAgICBvdXRlclBhbmUuc2V0TGF5b3V0TWFuYWdlcihvdXRlckxheW91dCk7Ci0KLSAgICBSZWN0YW5nbGVGaWd1cmUgbGluZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKQotICAgIHsKLSAgICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0UHJlZmVycmVkU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCkKLSAgICAgIHsKLSAgICAgICAgRGltZW5zaW9uIGQgPSBzdXBlci5nZXRQcmVmZXJyZWRTaXplKHdIaW50LCBoSGludCk7Ci0gICAgICAgIGQud2lkdGggKz0gMjA7Ci0gICAgICAgIGQuaGVpZ2h0ID0gMTsKLSAgICAgICAgcmV0dXJuIGQ7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBUb29sYmFyTGF5b3V0IGxpbmVMYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgbGluZUxheW91dC5zZXRWZXJ0aWNhbCh0cnVlKTsKLSAgICBsaW5lTGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgbGluZS5zZXRMYXlvdXRNYW5hZ2VyKGxpbmVMYXlvdXQpOwotICAgIG91dGVyUGFuZS5hZGQobGluZSk7Ci0KLSAgICBzY3JvbGxwYW5lID0gbmV3IFNjcm9sbFBhbmUoKTsKLSAgICBzY3JvbGxwYW5lLnNldFZlcnRpY2FsU2Nyb2xsQmFyVmlzaWJpbGl0eShTY3JvbGxQYW5lLkFVVE9NQVRJQyk7IC8vIFNjcm9sbFBhbmUuQUxXQVlTKTsKLSAgICBvdXRlclBhbmUuYWRkKHNjcm9sbHBhbmUpOwotCi0gICAgRmlndXJlIHBhbmUgPSBuZXcgRmlndXJlKCk7Ci0gICAgcGFuZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcig1LCA4LCA1LCA4KSk7Ci0gICAgQ29udGFpbmVyTGF5b3V0IGxheW91dCA9IG5ldyBDb250YWluZXJMYXlvdXQoKTsKLSAgICBsYXlvdXQuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0gICAgbGF5b3V0LnNldFNwYWNpbmcoMCk7Ci0gICAgcGFuZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0KLSAgICBWaWV3cG9ydCB2aWV3cG9ydCA9IG5ldyBWaWV3cG9ydCgpOwotICAgIHZpZXdwb3J0LnNldENvbnRlbnRzVHJhY2tzSGVpZ2h0KHRydWUpOwotICAgIFZpZXdwb3J0TGF5b3V0IHZpZXdwb3J0TGF5b3V0ID0gbmV3IFZpZXdwb3J0TGF5b3V0KCkKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgICAgIHsKLSAgICAgICAgRGltZW5zaW9uIGQgPSBzdXBlci5jYWxjdWxhdGVQcmVmZXJyZWRTaXplKHBhcmVudCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGlmICh0aGVNaW5IZWlnaHQgPiAwKQotICAgICAgICAgIGQuaGVpZ2h0ID0gTWF0aC5taW4oZC5oZWlnaHQsIHRoZU1pbkhlaWdodCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGRvdWJsZSBmYWN0b3IgPSBnZXRab29tTWFuYWdlcigpLmdldFpvb20oKTsKLSAgICAgICAgICBpbnQgc2NhbGVkSGVpZ2h0ID0gKGludClNYXRoLnJvdW5kKChnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0IC0gbWluaW11bUhlaWdodCkgLyBmYWN0b3IpOyAvLyBhZGp1c3QgZm9yIG90aGVyIGNhdGVnb3JpZXMgYW5kIHNwYWNlcwotICAgICAgICAgIGQuaGVpZ2h0ID0gTWF0aC5tYXgoMjUwLCBzY2FsZWRIZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIGQud2lkdGggPSBNYXRoLm1pbihkLndpZHRoLCAzMDApOwotICAgICAgICByZXR1cm4gZDsKLSAgICAgIH0KLSAgICB9OwotICAgIHZpZXdwb3J0LnNldExheW91dE1hbmFnZXIodmlld3BvcnRMYXlvdXQpOwotCi0gICAgc2Nyb2xscGFuZS5zZXRWaWV3cG9ydCh2aWV3cG9ydCk7Ci0gICAgc2Nyb2xscGFuZS5zZXRDb250ZW50cyhwYW5lKTsKLQotICAgIHJldHVybiBvdXRlclBhbmU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVIZWFkaW5nRmlndXJlKCkKLSAgewotCSAgaGVhZGluZ0ZpZ3VyZSA9IG5ldyBIZWFkaW5nRmlndXJlKCk7Ci0JICBvdXRlclBhbmUuYWRkKGhlYWRpbmdGaWd1cmUpOwotCSAgaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpLnNldFRleHQoKChDYXRlZ29yeUFkYXB0ZXIpIGdldE1vZGVsKCkpLmdldFRleHQoKSk7Ci0JICBoZWFkaW5nRmlndXJlLmdldExhYmVsKCkuc2V0SWNvbigoKENhdGVnb3J5QWRhcHRlcikgZ2V0TW9kZWwoKSkuZ2V0SW1hZ2UoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCi0gICAgUm91bmRlZExpbmVCb3JkZXIgYm9yZGVyID0gKFJvdW5kZWRMaW5lQm9yZGVyKSBvdXRlclBhbmUuZ2V0Qm9yZGVyKCk7Ci0gICAgYm9yZGVyLnNldFdpZHRoKGlzU2VsZWN0ZWQgPyAyIDogMSk7Ci0gICAgaGVhZGluZ0ZpZ3VyZS5zZXRTZWxlY3RlZChpc1NlbGVjdGVkKTsKLSAgICBvdXRlclBhbmUucmVwYWludCgpOwotCi0gICAgaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpLnNldFRleHQoKChDYXRlZ29yeUFkYXB0ZXIpIGdldE1vZGVsKCkpLmdldFRleHQoKSk7Ci0gIH0KLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gc2Nyb2xscGFuZS5nZXRDb250ZW50cygpOwotICB9Ci0KLSAgcHVibGljIExhYmVsIGdldE5hbWVMYWJlbCgpCi0gIHsKLSAgICByZXR1cm4gaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpOwotICB9Ci0KLSAgcHVibGljIEhlYWRpbmdGaWd1cmUgZ2V0SGVhZGluZ0ZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gaGVhZGluZ0ZpZ3VyZTsKLSAgfQotCi0gIHByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVDaGlsZChPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IG5ldyBUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0KCk7Ci0gICAgZWRpdFBhcnQuc2V0TW9kZWwobW9kZWwpOwotICAgIGVkaXRQYXJ0LnNldFBhcmVudCh0aGlzKTsKLSAgICByZXR1cm4gZWRpdFBhcnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFZGl0UGFydCBkb0dldFJlbGF0aXZlRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQsIGludCBkaXJlY3Rpb24pCi0gIHsKLSAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOyAKLSAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuU09VVEgpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEVkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsLmdldE5leHRTaWJsaW5nKGVkaXRQYXJ0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuZ2V0UHJldlNpYmxpbmcoZWRpdFBhcnQpOwotICAgICAgfSAgICAgIAotICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBzY3JvbGxUbygoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCllZGl0UGFydCk7Ci0gICAgICB9ICAKLSAgICB9ICAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gKChCYXNlRWRpdFBhcnQpZ2V0UGFyZW50KCkpLmRvR2V0UmVsYXRpdmVFZGl0UGFydChlZGl0UGFydCwgZGlyZWN0aW9uKTsKLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotICAgIC8vIGNzIDogb2RkbHkgYXJyb3dpbmcgdXAgYW5kIGRvd24gdHJ1ZSBpdGVtcyBpbiB0aGUgbGlzdCBpcyBub3QgaGFuZGxlZCBuaWNlbHkKLSAgICAvLyBieSB0aGUgY2FubmVkIEdFRiBHcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyIHNvIHRoaXMgbmF2aWdhdGlvbiBwb2xpY3kgaXMgbmVlZCB0byBmaXggdGhhdCAgICAKLSAgICBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSA9IG5ldyBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwoKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIENhdGVnb3J5QWRhcHRlciBhZGFwdGVyID0gKENhdGVnb3J5QWRhcHRlcikgZ2V0TW9kZWwoKTsKLSAgICBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGFkYXB0ZXIuZ2V0QWxsQ2hpbGRyZW4oKSkpOwotICAgIHJldHVybiBjaGlsZHJlbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNjcm9sbFRvKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgdG9wTGV2ZWwpCi0gIHsKLSAgICBSZWN0YW5nbGUgdG9wTGV2ZWxCb3VuZHMgPSB0b3BMZXZlbC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLSAgICBSZWN0YW5nbGUgY2F0ZWdvcnlCb3VuZHMgPSBmaWd1cmUuZ2V0Qm91bmRzKCk7Ci0gICAgaW50IHNjcm9sbFZhbHVlID0gc2Nyb2xscGFuZS5nZXRWZXJ0aWNhbFNjcm9sbEJhcigpLmdldFZhbHVlKCk7Ci0gICAgaW50IGxvY2F0aW9uID0gdG9wTGV2ZWxCb3VuZHMueSArIHNjcm9sbFZhbHVlIC0gY2F0ZWdvcnlCb3VuZHMueTsKLSAgICBzY3JvbGxwYW5lLnNjcm9sbFZlcnRpY2FsVG8obG9jYXRpb24gLSBjYXRlZ29yeUJvdW5kcy5oZWlnaHQgLyAyKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TWluaW11bUhlaWdodChpbnQgbWluaW11bUhlaWdodCkKLSAgewotICAgIHRoaXMubWluaW11bUhlaWdodCA9IG1pbmltdW1IZWlnaHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZGVyVGV4dCgpCi0gIHsKLQkgIHJldHVybiBnZXROYW1lTGFiZWwoKS5nZXRUZXh0KCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9Db25uZWN0YWJsZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL0Nvbm5lY3RhYmxlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEzMjkzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL0Nvbm5lY3RhYmxlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VGaWVsZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLktleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5DZW50ZXJlZEljb25GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5HZW5lcmljR3JvdXBGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5JRXh0ZW5kZWRGaWd1cmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbm5lY3RhYmxlRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIEFycmF5TGlzdCBjb25uZWN0aW9uRmlndXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCi0gIHB1YmxpYyBJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5IGdldEV4dGVuZGVkRmlndXJlRmFjdG9yeSgpCi0gIHsKLSAgICBFZGl0UGFydEZhY3RvcnkgZmFjdG9yeSA9IGdldFZpZXdlcigpLmdldEVkaXRQYXJ0RmFjdG9yeSgpOwotICAgIEFzc2VydC5pc1RydWUoZmFjdG9yeSBpbnN0YW5jZW9mIElFeHRlbmRlZEZpZ3VyZUZhY3RvcnksICJFZGl0UGFydEZhY3RvcnkgbXVzdCBiZSBhbiBpbnN0YW5jZW9mIG9mIElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkiKTsgICAgIC8vJE5PTi1OTFMtMSQKLSAgICByZXR1cm4gKElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkpZmFjdG9yeTsgCi0gIH0KLSAgCi0gIHB1YmxpYyBDb25uZWN0YWJsZUVkaXRQYXJ0KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBHZW5lcmljR3JvdXBGaWd1cmUgZmlndXJlID0gbmV3IEdlbmVyaWNHcm91cEZpZ3VyZSgpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLQotICBwdWJsaWMgWFNEQ29uY3JldGVDb21wb25lbnQgZ2V0WFNEQ29uY3JldGVDb21wb25lbnQoKQotICB7Ci0gICAgcmV0dXJuIChYU0RDb25jcmV0ZUNvbXBvbmVudCkoKFhTREJhc2VBZGFwdGVyKWdldE1vZGVsKCkpLmdldFRhcmdldCgpOwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRDb25uZWN0aW9uRmlndXJlcygpCi0gIHsKLSAgICByZXR1cm4gY29ubmVjdGlvbkZpZ3VyZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBhYnN0cmFjdCBSZWZlcmVuY2VDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoQmFzZUVkaXRQYXJ0IGNoaWxkKTsKLSAgCi0gIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkKLSAgewotICAgIHN1cGVyLmFjdGl2YXRlKCk7Ci0gICAgYWN0aXZhdGVDb25uZWN0aW9uKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZUNvbm5lY3Rpb24oKQotICB7Ci0gICAgaWYgKGNvbm5lY3Rpb25GaWd1cmVzID09IG51bGwpCi0gICAgewotICAgICAgY29ubmVjdGlvbkZpZ3VyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIEJhc2VFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgQmFzZUVkaXRQYXJ0IGcgPSAoQmFzZUVkaXRQYXJ0KSBvOwotICAgICAgICBSZWZlcmVuY2VDb25uZWN0aW9uIGZpZ3VyZSA9IGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoZyk7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmVzLmFkZChmaWd1cmUpOwotICAgICAgICBmaWd1cmUuc2V0UG9pbnRzKGZpZ3VyZS5nZXRQb2ludHMoKSk7Ci0KLSAgICAgICAgZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuQ09OTkVDVElPTl9MQVlFUikuYWRkKGZpZ3VyZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgewotICAgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgICBkZWFjdGl2YXRlQ29ubmVjdGlvbigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZGVhY3RpdmF0ZUNvbm5lY3Rpb24oKQotICB7Ci0gICAgLy8gaWYgd2UgaGF2ZSBhIGNvbm5lY3Rpb24sIHJlbW92ZSBpdAotICAgIFJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZpZ3VyZTsKLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZXMgIT0gbnVsbCAmJiAhY29ubmVjdGlvbkZpZ3VyZXMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbm5lY3Rpb25GaWd1cmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZSA9IChSZWZlcmVuY2VDb25uZWN0aW9uKSBpLm5leHQoKTsKLQotICAgICAgICBpZiAoZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuQ09OTkVDVElPTl9MQVlFUikuZ2V0Q2hpbGRyZW4oKS5jb250YWlucyhjb25uZWN0aW9uRmlndXJlKSkKLSAgICAgICAgewotICAgICAgICAgIGdldExheWVyKExheWVyQ29uc3RhbnRzLkNPTk5FQ1RJT05fTEFZRVIpLnJlbW92ZShjb25uZWN0aW9uRmlndXJlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY29ubmVjdGlvbkZpZ3VyZXMgPSBudWxsOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotICAgIHJlZnJlc2hDb25uZWN0aW9uKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ29ubmVjdGlvbigpCi0gIHsKLSAgICBpZiAoIWlzQWN0aXZlKCkpCi0gICAgICByZXR1cm47Ci0KLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZXMgPT0gbnVsbCB8fCBjb25uZWN0aW9uRmlndXJlcy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgYWN0aXZhdGVDb25uZWN0aW9uKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBkZWFjdGl2YXRlQ29ubmVjdGlvbigpOwotICAgICAgYWN0aXZhdGVDb25uZWN0aW9uKCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsKLSAgICBSZWZlcmVuY2VDb25uZWN0aW9uIGNvbm5lY3Rpb25GaWd1cmU7Ci0gICAgaWYgKGNvbm5lY3Rpb25GaWd1cmVzICE9IG51bGwgJiYgIWNvbm5lY3Rpb25GaWd1cmVzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb25uZWN0aW9uRmlndXJlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUgPSAoUmVmZXJlbmNlQ29ubmVjdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0SGlnaGxpZ2h0KHRydWUpOwotICAgICAgfQotICAgIH0KLSAgICBHZW5lcmljR3JvdXBGaWd1cmUgZmlndXJlID0gKEdlbmVyaWNHcm91cEZpZ3VyZSlnZXRGaWd1cmUoKTsKLSAgICBmaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLnNldE1vZGUoQ2VudGVyZWRJY29uRmlndXJlLlNFTEVDVEVEKTsKLSAgICBmaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLnJlZnJlc2goKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKQotICB7Ci0gICAgUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmlndXJlOwotICAgIGlmIChjb25uZWN0aW9uRmlndXJlcyAhPSBudWxsICYmICFjb25uZWN0aW9uRmlndXJlcy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gY29ubmVjdGlvbkZpZ3VyZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBjb25uZWN0aW9uRmlndXJlID0gKFJlZmVyZW5jZUNvbm5lY3Rpb24pIGkubmV4dCgpOwotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldEhpZ2hsaWdodChmYWxzZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIEdlbmVyaWNHcm91cEZpZ3VyZSBmaWd1cmUgPSAoR2VuZXJpY0dyb3VwRmlndXJlKWdldEZpZ3VyZSgpOwotICAgIGZpZ3VyZS5nZXRJY29uRmlndXJlKCkuc2V0TW9kZShDZW50ZXJlZEljb25GaWd1cmUuTk9STUFMKTsKLSAgICBmaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLnJlZnJlc2goKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgICBHZW5lcmljR3JvdXBGaWd1cmUgZmlndXJlID0gKEdlbmVyaWNHcm91cEZpZ3VyZSlnZXRGaWd1cmUoKTsKLSAgICBmaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLnJlZnJlc2goKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBuZXcgQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5KCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KQotICB7Ci0gICAgSUZpZ3VyZSBjaGlsZCA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpOwotICAgIGdldENvbnRlbnRQYW5lKCkuYWRkKGNoaWxkLCBpbmRleCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KQotICB7Ci0gICAgSUZpZ3VyZSBjaGlsZCA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpOwotICAgIGdldENvbnRlbnRQYW5lKCkucmVtb3ZlKGNoaWxkKTsKLSAgfQotICAKLSAgcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICB7Ci0gICAgcmV0dXJuICgoR2VuZXJpY0dyb3VwRmlndXJlKWdldEZpZ3VyZSgpKS5nZXRDb250ZW50RmlndXJlKCk7Ci0gIH0KLQotICBwdWJsaWMgRmlndXJlIGdldFRhcmdldEZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gKChHZW5lcmljR3JvdXBGaWd1cmUpZ2V0RmlndXJlKCkpLmdldFRhcmdldEZpZ3VyZSgpOwotICB9Ci0gIAotICBwdWJsaWMgRWRpdFBhcnQgZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLldFU1QpCi0gICAgewotICAgICAgaWYgKGdldFBhcmVudCgpIGluc3RhbmNlb2YgQ29ubmVjdGFibGVFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0UGFyZW50KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHRoaXM7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5FQVNUKQotICAgIHsgICAgCi0gICAgICByZXN1bHQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0LmdldENoaWxkcmVuKCkuZ2V0KDApOwotICAgICAgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCB0YXJnZXQgPSBudWxsOwotICAgICAgYm9vbGVhbiBmb3VuZFNlbGVjdGFibGVHcm91cCA9IGZhbHNlOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBFZGl0UGFydCBjaGlsZCA9IChFZGl0UGFydClpLm5leHQoKTsKLSAgICAgICAgaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KSkKLSAgICAgICAgewotICAgICAgICAgIGZvdW5kU2VsZWN0YWJsZUdyb3VwID0gdHJ1ZTsKLSAgICAgICAgICByZXN1bHQgPSBjaGlsZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIHRhcmdldCA9IChUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KSByZXN1bHQ7Ci0gICAgICB9Ci0gICAgICBpZiAoIWZvdW5kU2VsZWN0YWJsZUdyb3VwICYmIHRhcmdldCAhPSBudWxsKQotICAgICAgewotICAgICAgICBFZGl0UGFydCBwYXJlbnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKTsKLSAgICAgICAgd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgQ29tcGFydG1lbnRFZGl0UGFydCkpCi0gICAgICAgIHsKLSAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSBicmVhazsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgRWRpdFBhcnQgY2hpbGQgPSAoRWRpdFBhcnQpIGkubmV4dCgpOwotICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIEJhc2VGaWVsZEVkaXRQYXJ0ICYmICEoY2hpbGQgaW5zdGFuY2VvZiBTcGFjZUZpbGxlckZvckZpZWxkRWRpdFBhcnQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEJhc2VGaWVsZEVkaXRQYXJ0IGZpZWxkID0gKEJhc2VGaWVsZEVkaXRQYXJ0KSBjaGlsZDsKLSAgICAgICAgICAgIGlmIChmaWVsZC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKS55IDwgdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmJvdHRvbSgpICYmCi0gICAgICAgICAgICAgICAgZmllbGQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCkueSA+IHRhcmdldC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gY2hpbGQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlZGl0UGFydDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuSU5fVE9fRklSU1RfQ0hJTEQpCi0gICAgewotICAgICAgcmVzdWx0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydC5nZXRDaGlsZHJlbigpLmdldCgwKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9Nb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGExZmY4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5UYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5HZW5lcmljR3JvdXBGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2VFZGl0UGFydCBleHRlbmRzIENvbm5lY3RhYmxlRWRpdFBhcnQKLXsKLSAgR2VuZXJpY0dyb3VwRmlndXJlIGZpZ3VyZTsKLSAgCi0gIHB1YmxpYyBNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgZmlndXJlID0gbmV3IEdlbmVyaWNHcm91cEZpZ3VyZSgpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0gICAgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKWdldE1vZGVsKCk7Ci0gICAgZmlndXJlLmdldEljb25GaWd1cmUoKS5pbWFnZSA9IGFkYXB0ZXIuZ2V0SW1hZ2UoKTsKLQotICAgIEdlbmVyaWNHcm91cEZpZ3VyZSBncm91cEZpZ3VyZSA9IChHZW5lcmljR3JvdXBGaWd1cmUpZ2V0RmlndXJlKCk7Ci0gICAgU3RyaW5nIG5vZGVOYW1lID0gIiI7Ci0gICAgCi0gICAgLy8gVE9ETzogY29tbW1vbiB0aGlzIHVwIHdpdGggTW9kZWxHcm91cEVkaXRQYXJ0LCBYU0RQYXJ0aWNsZUFkYXB0ZXIncyBjb2RlCi0gICAgCi0gICAgLy8gLTIgbWVhbnMgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgKHNvIHRoZSBkZWZhdWx0IGlzIDEpCi0gICAgaW50IG1pbk9jY3VycyA9IGFkYXB0ZXIuZ2V0TWluT2NjdXJzKCk7Ci0gICAgaW50IG1heE9jY3VycyA9IGFkYXB0ZXIuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgU3RyaW5nIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBpZiAobWluT2NjdXJzID09IC0zICYmIG1heE9jY3VycyA9PSAtMykKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9IG5vZGVOYW1lOwotICAgICAgZ3JvdXBGaWd1cmUuc2V0VGV4dChudWxsKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobWluT2NjdXJzID09IDAgJiYgKG1heE9jY3VycyA9PSAtMiB8fCBtYXhPY2N1cnMgPT0gMSkpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSBub2RlTmFtZSArICIgWzAuLjFdIjsgLy8kTk9OLU5MUy0xJAotICAgICAgZ3JvdXBGaWd1cmUuc2V0VGV4dCgiMC4uMSIpOwotICAgIH0KLSAgICBlbHNlIGlmICgobWluT2NjdXJzID09IDEgJiYgbWF4T2NjdXJzID09IDEpIHx8Ci0gICAgICAgICAgICAgKG1pbk9jY3VycyA9PSAtMiAmJiBtYXhPY2N1cnMgPT0gMSkgfHwKLSAgICAgICAgICAgICAobWluT2NjdXJzID09IDEgJiYgbWF4T2NjdXJzID09IC0yKSkKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9IG5vZGVOYW1lICsgIiBbMS4uMV0iOyAvLyROT04tTkxTLTEkCi0gICAgICBncm91cEZpZ3VyZS5zZXRUZXh0KCIxLi4xIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1pbk9jY3VycyA9PSAtMiAmJiBtYXhPY2N1cnMgPT0gLTIpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSBub2RlTmFtZTsKLSAgICAgIGdyb3VwRmlndXJlLnNldFRleHQobnVsbCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobWF4T2NjdXJzID09IC0yKSBtYXhPY2N1cnMgPSAxOwotICAgICAgU3RyaW5nIG1heFN5bWJvbCA9IG1heE9jY3VycyA9PSAtMSA/ICIqIiA6ICIiICsgbWF4T2NjdXJzOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIAotICAgICAgU3RyaW5nIG1pblN5bWJvbCA9IG1pbk9jY3VycyA9PSAtMiA/ICIxIiA6ICIiICsgbWluT2NjdXJzOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gbm9kZU5hbWUgKyAiIFsiICsgbWluU3ltYm9sICsgIi4uIiArIG1heFN5bWJvbCArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIGdyb3VwRmlndXJlLnNldFRleHQobWluU3ltYm9sICsgIi4uIiArIG1heFN5bWJvbCk7Ci0gICAgfQotCi0gICAgZ3JvdXBGaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLnNldFRvb2xUaXBUZXh0KG9jY3VyZW5jZURlc2NyaXB0aW9uKTsKLSAgICBncm91cEZpZ3VyZS5nZXRJY29uRmlndXJlKCkucmVwYWludCgpOwotCi0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcilnZXRNb2RlbCgpOwotICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGdyb3VwRGVmID0gKChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgYWRhcHRlci5nZXRUYXJnZXQoKSk7Ci0gICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gcmVzb2x2ZWRHcm91cERlZiA9IGdyb3VwRGVmLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKTsKLSAgICBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAgPSByZXNvbHZlZEdyb3VwRGVmLmdldE1vZGVsR3JvdXAoKTsKLSAgICAKLSAgICBBcnJheUxpc3QgbGlzdE9mVmlzaWJsZUdyb3VwUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEVkaXRQYXJ0IGVwID0gZ2V0UGFyZW50KCk7IGVwICE9IG51bGw7ICkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gZXAuZ2V0TW9kZWwoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBtb2RlbCA9ICgoWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKW9iamVjdCkuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdE9mVmlzaWJsZUdyb3VwUmVmcy5hZGQoKChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiltb2RlbCkuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpKTsgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVwID0gZXAuZ2V0UGFyZW50KCk7Ci0gICAgfQotICAgIAotICAgIGJvb2xlYW4gaXNDeWNsaWMgPSAobGlzdE9mVmlzaWJsZUdyb3VwUmVmcy5jb250YWlucyhyZXNvbHZlZEdyb3VwRGVmKSk7Ci0gICAgCi0gICAgaWYgKHhzZE1vZGVsR3JvdXAgIT0gbnVsbCAmJiAhaXNDeWNsaWMpCi0gICAgICBsaXN0LmFkZChYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KHhzZE1vZGVsR3JvdXApKTsKLSAgICAKLSAgICBpZiAoaXNDeWNsaWMpCi0gICAgICBsaXN0LmFkZChuZXcgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyKG51bGwpKTsKLQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIFJlZmVyZW5jZUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZShCYXNlRWRpdFBhcnQgY2hpbGQpCi0gIHsKLSAgICBSZWZlcmVuY2VDb25uZWN0aW9uIGNvbm5lY3Rpb25GaWd1cmUgPSBuZXcgUmVmZXJlbmNlQ29ubmVjdGlvbigpOwotCi0gICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRTb3VyY2VBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcigoKEdlbmVyaWNHcm91cEZpZ3VyZSlnZXRGaWd1cmUoKSkuZ2V0SWNvbkZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuUklHSFQsIDAsIDApKTsKLSAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBNb2RlbEdyb3VwRWRpdFBhcnQpCi0gICAgewotICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRUYXJnZXRBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcigoKE1vZGVsR3JvdXBFZGl0UGFydCkgY2hpbGQpLmdldFRhcmdldEZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuTEVGVCwgMCwgMCkpOwotICAgIH0KLSAgICBlbHNlIC8vIGZvciB0aGUgY3ljbGljIGdyb3VwIHJlZmVyZW5jZXMKLSAgICB7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldFRhcmdldEFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKCgoR2VuZXJpY0dyb3VwRmlndXJlKSBnZXRGaWd1cmUoKSkuZ2V0SWNvbkZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuUklHSFQsIDAsIDApKTsKLSAgICB9Ci0gICAgCi0gICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRIaWdobGlnaHQoZmFsc2UpOwotCi0gICAgcmV0dXJuIGNvbm5lY3Rpb25GaWd1cmU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvTW9kZWxHcm91cEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL01vZGVsR3JvdXBFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzU5Mzk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvTW9kZWxHcm91cEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNETW9kZWxHcm91cEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5DZW50ZXJlZENvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5UYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5HZW5lcmljR3JvdXBGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5Nb2RlbEdyb3VwRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIE1vZGVsR3JvdXBFZGl0UGFydCBleHRlbmRzIENvbm5lY3RhYmxlRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIHJldHVybiBnZXRFeHRlbmRlZEZpZ3VyZUZhY3RvcnkoKS5jcmVhdGVNb2RlbEdyb3VwRmlndXJlKGdldE1vZGVsKCkpOwotICB9Ci0gIAotICBwdWJsaWMgWFNEUGFydGljbGUgZ2V0WFNEUGFydGljbGUoKQotICB7Ci0gICAgT2JqZWN0IG8gPSBnZXRYU0RNb2RlbEdyb3VwKCkuZ2V0Q29udGFpbmVyKCk7Ci0gICAgcmV0dXJuIChvIGluc3RhbmNlb2YgWFNEUGFydGljbGUpID8gKFhTRFBhcnRpY2xlKSBvIDogbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBYU0RNb2RlbEdyb3VwIGdldFhTRE1vZGVsR3JvdXAoKQotICB7Ci0gICAgaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwQWRhcHRlcikKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwQWRhcHRlciBhZGFwdGVyID0gKFhTRE1vZGVsR3JvdXBBZGFwdGVyKSBnZXRNb2RlbCgpOwotICAgICAgcmV0dXJuIChYU0RNb2RlbEdyb3VwKSBhZGFwdGVyLmdldFRhcmdldCgpOwotICAgIH0KLS8vICAgIGVsc2UgaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotLy8gICAgewotLy8gICAgICByZXR1cm4gKFhTRE1vZGVsR3JvdXApIGdldE1vZGVsKCk7Ci0vLyAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0KLSAgfQotCi0gIAotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gZmFsc2U7Ci0gICAgR2VuZXJpY0dyb3VwRmlndXJlIG1vZGVsR3JvdXBGaWd1cmUgPSAoR2VuZXJpY0dyb3VwRmlndXJlKWdldEZpZ3VyZSgpOwotICAgIAotICAgIFhTRE1vZGVsR3JvdXBBZGFwdGVyIGFkYXB0ZXIgPSAoWFNETW9kZWxHcm91cEFkYXB0ZXIpIGdldE1vZGVsKCk7Ci0gICAgaXNSZWFkT25seSA9IGFkYXB0ZXIuaXNSZWFkT25seSgpOwotICAgIAotICAgIFN0cmluZyBub2RlTmFtZSA9ICIiOwotICAgIEltYWdlIGltYWdlOwotICAgIHN3aXRjaCAoZ2V0WFNETW9kZWxHcm91cCgpLmdldENvbXBvc2l0b3IoKS5nZXRWYWx1ZSgpKQotICAgIHsKLSAgICAgIGNhc2UgWFNEQ29tcG9zaXRvci5BTEw6Ci0gICAgICB7Ci0gICAgICAgIGltYWdlID0gaXNSZWFkT25seSA/IE1vZGVsR3JvdXBGaWd1cmUuQUxMX0lDT05fRElTQUJMRURfSU1BR0UgOk1vZGVsR3JvdXBGaWd1cmUuQUxMX0lDT05fSU1BR0U7Ci0gICAgICAgIG1vZGVsR3JvdXBGaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLmltYWdlID0gWFNEQ29tbW9uVUlVdGlscy5nZXRVcGRhdGVkSW1hZ2UoKFhTRENvbmNyZXRlQ29tcG9uZW50KWFkYXB0ZXIuZ2V0VGFyZ2V0KCksIGltYWdlLCBpc1JlYWRPbmx5KTsKLSAgICAgICAgbm9kZU5hbWUgPSBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgWFNEQ29tcG9zaXRvci5DSE9JQ0U6Ci0gICAgICB7Ci0gICAgICAgIGltYWdlID0gaXNSZWFkT25seSA/IE1vZGVsR3JvdXBGaWd1cmUuQ0hPSUNFX0lDT05fRElTQUJMRURfSU1BR0UgOiBNb2RlbEdyb3VwRmlndXJlLkNIT0lDRV9JQ09OX0lNQUdFOwotICAgICAgICBtb2RlbEdyb3VwRmlndXJlLmdldEljb25GaWd1cmUoKS5pbWFnZSA9IFhTRENvbW1vblVJVXRpbHMuZ2V0VXBkYXRlZEltYWdlKChYU0RDb25jcmV0ZUNvbXBvbmVudClhZGFwdGVyLmdldFRhcmdldCgpLCBpbWFnZSwgaXNSZWFkT25seSk7IAotICAgICAgICBub2RlTmFtZSA9IFhTRENvbnN0YW50cy5DSE9JQ0VfRUxFTUVOVF9UQUc7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBYU0RDb21wb3NpdG9yLlNFUVVFTkNFOgotICAgICAgewotICAgICAgICBpbWFnZSA9IGlzUmVhZE9ubHkgPyBNb2RlbEdyb3VwRmlndXJlLlNFUVVFTkNFX0lDT05fRElTQUJMRURfSU1BR0UgOiBNb2RlbEdyb3VwRmlndXJlLlNFUVVFTkNFX0lDT05fSU1BR0U7Ci0gICAgICAgIG1vZGVsR3JvdXBGaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLmltYWdlID0gWFNEQ29tbW9uVUlVdGlscy5nZXRVcGRhdGVkSW1hZ2UoKFhTRENvbmNyZXRlQ29tcG9uZW50KWFkYXB0ZXIuZ2V0VGFyZ2V0KCksIGltYWdlLCBpc1JlYWRPbmx5KTsgCi0gICAgICAgIG5vZGVOYW1lID0gWFNEQ29uc3RhbnRzLlNFUVVFTkNFX0VMRU1FTlRfVEFHOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0vLyAgICBTdHJpbmcgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSBhZGFwdGVyLmdldE5hbWVBbm5vdGF0aW9uVG9vbFRpcFN0cmluZygpOwotLy8gICAgbW9kZWxHcm91cEZpZ3VyZS5nZXRJY29uRmlndXJlKCkuc2V0VG9vbFRpcChvY2N1cmVuY2VEZXNjcmlwdGlvbik7Ci0KLSAgICAvLyBUT0RPOiBjb21tbW9uIHRoaXMgdXAgd2l0aCBYU0RQYXJ0aWNsZUFkYXB0ZXIncyBjb2RlCi0gICAgCi0gICAgLy8gLTIgbWVhbnMgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgKHNvIHRoZSBkZWZhdWx0IGlzIDEpCi0gICAgaW50IG1pbk9jY3VycyA9IGFkYXB0ZXIuZ2V0TWluT2NjdXJzKCk7Ci0gICAgaW50IG1heE9jY3VycyA9IGFkYXB0ZXIuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgU3RyaW5nIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBpZiAobWluT2NjdXJzID09IC0zICYmIG1heE9jY3VycyA9PSAtMykKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9IG5vZGVOYW1lOwotICAgICAgbW9kZWxHcm91cEZpZ3VyZS5zZXRUZXh0KG51bGwpOwotICAgIH0KLSAgICBlbHNlIGlmIChtaW5PY2N1cnMgPT0gMCAmJiAobWF4T2NjdXJzID09IC0yIHx8IG1heE9jY3VycyA9PSAxKSkKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9IG5vZGVOYW1lICsgIiBbMC4uMV0iOyAvLyROT04tTkxTLTEkCi0gICAgICBtb2RlbEdyb3VwRmlndXJlLnNldFRleHQoIjAuLjEiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKG1pbk9jY3VycyA9PSAxICYmIG1heE9jY3VycyA9PSAxKSB8fAotICAgICAgICAgICAgIChtaW5PY2N1cnMgPT0gLTIgJiYgbWF4T2NjdXJzID09IDEpIHx8Ci0gICAgICAgICAgICAgKG1pbk9jY3VycyA9PSAxICYmIG1heE9jY3VycyA9PSAtMikpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSBub2RlTmFtZSArICIgWzEuLjFdIjsgLy8kTk9OLU5MUy0xJAotICAgICAgbW9kZWxHcm91cEZpZ3VyZS5zZXRUZXh0KCIxLi4xIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1pbk9jY3VycyA9PSAtMiAmJiBtYXhPY2N1cnMgPT0gLTIpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSBub2RlTmFtZTsKLSAgICAgIG1vZGVsR3JvdXBGaWd1cmUuc2V0VGV4dChudWxsKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChtYXhPY2N1cnMgPT0gLTIpIG1heE9jY3VycyA9IDE7Ci0gICAgICBTdHJpbmcgbWF4U3ltYm9sID0gbWF4T2NjdXJzID09IC0xID8gIioiIDogIiIgKyBtYXhPY2N1cnM7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgCi0gICAgICBTdHJpbmcgbWluU3ltYm9sID0gbWluT2NjdXJzID09IC0yID8gIjEiIDogIiIgKyBtaW5PY2N1cnM7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSBub2RlTmFtZSArICIgWyIgKyBtaW5TeW1ib2wgKyAiLi4iICsgbWF4U3ltYm9sICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgbW9kZWxHcm91cEZpZ3VyZS5zZXRUZXh0KG1pblN5bWJvbCArICIuLiIgKyBtYXhTeW1ib2wpOwotICAgIH0KLQotICAgIG1vZGVsR3JvdXBGaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLnNldFRvb2xUaXBUZXh0KG9jY3VyZW5jZURlc2NyaXB0aW9uKTsKLSAgICBtb2RlbEdyb3VwRmlndXJlLmdldEljb25GaWd1cmUoKS5yZXBhaW50KCk7Ci0KLSAgICByZWZyZXNoQ29ubmVjdGlvbigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsKLS8vICAgIFhTRE1vZGVsR3JvdXBBZGFwdGVyIG1vZGVsR3JvdXBBZGFwdGVyID0gKFhTRE1vZGVsR3JvdXBBZGFwdGVyKWdldE1vZGVsKCk7Ci0vLyAgICBBcnJheUxpc3QgY2ggPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLyAgICBJVHJlZUVsZW1lbnQgW10gdHJlZSA9IG1vZGVsR3JvdXBBZGFwdGVyLmdldENoaWxkcmVuKCk7Ci0vLyAgICBpbnQgbGVuZ3RoID0gdHJlZS5sZW5ndGg7Ci0vLyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotLy8gICAgewotLy8gICAgICBjaC5hZGQodHJlZVtpXSk7Ci0vLyAgICB9Ci0KLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwID0gZ2V0WFNETW9kZWxHcm91cCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzZE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEUGFydGljbGUgbmV4dCA9IChYU0RQYXJ0aWNsZSkgaS5uZXh0KCk7Ci0gICAgICBpZiAobmV4dC5nZXRDb250ZW50KCkgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBuZXh0LmdldENvbnRlbnQoKTsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChlbGVtZW50RGVjbGFyYXRpb24pOwotICAgICAgICBsaXN0LmFkZChuZXcgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyKChYU0RCYXNlQWRhcHRlcilhZGFwdGVyKSk7Ci0gICAgICB9Ci0gICAgICBpZiAobmV4dC5nZXRDb250ZW50KCkgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZGVmID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBuZXh0LmdldENvbnRlbnQoKTsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChkZWYpOwotICAgICAgICBsaXN0LmFkZChhZGFwdGVyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG5leHQuZ2V0VGVybSgpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgIHsKLSAgICAgICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXApIG5leHQuZ2V0VGVybSgpOwotICAgICAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KG1vZGVsR3JvdXApOwotICAgICAgICBsaXN0LmFkZChhZGFwdGVyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG5leHQuZ2V0VGVybSgpIGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpCi0gICAgICB7Ci0gICAgICAgIFhTRFdpbGRjYXJkIHdpbGRDYXJkID0gKFhTRFdpbGRjYXJkKW5leHQuZ2V0VGVybSgpOwotICAgICAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KHdpbGRDYXJkKTsKLSAgICAgICAgbGlzdC5hZGQobmV3IFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcigoWFNEQmFzZUFkYXB0ZXIpYWRhcHRlcikpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChsaXN0LnNpemUoKSA9PSAwKQotICAgICAgbGlzdC5hZGQobmV3IFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcihudWxsKSk7Ci0KLSAgICByZXR1cm4gbGlzdDsKLS8vICAgIHJldHVybiBjaDsKLSAgfQotCi0gIHB1YmxpYyBSZWZlcmVuY2VDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoQmFzZUVkaXRQYXJ0IGNoaWxkKQotICB7Ci0gICAgUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmlndXJlID0gbmV3IFJlZmVyZW5jZUNvbm5lY3Rpb24oKTsKLSAgICBHZW5lcmljR3JvdXBGaWd1cmUgbW9kZWxHcm91cEZpZ3VyZSA9IChHZW5lcmljR3JvdXBGaWd1cmUpZ2V0RmlndXJlKCk7Ci0gIAotICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0U291cmNlQW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IobW9kZWxHcm91cEZpZ3VyZS5nZXRJY29uRmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5SSUdIVCwgMCwgMCkpOwotCi0gICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgTW9kZWxHcm91cEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0VGFyZ2V0QW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoKChNb2RlbEdyb3VwRWRpdFBhcnQpIGNoaWxkKS5nZXRUYXJnZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLkxFRlQsIDAsIDApKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KQotICAgIHsKLSAgICAgIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQgZWxlbSA9IChUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KSBjaGlsZDsKLSAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0VGFyZ2V0QW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoZWxlbS5nZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLkxFRlQsIDAsIDEpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0KQotICAgIHsKLSAgICAgIE1vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlRWRpdFBhcnQgZWxlbSA9IChNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0KSBjaGlsZDsKLSAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0VGFyZ2V0QW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoZWxlbS5nZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLkxFRlQsIDAsIDEpKTsKLSAgICB9Ci0gICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRIaWdobGlnaHQoZmFsc2UpOwotICAgIHJldHVybiBjb25uZWN0aW9uRmlndXJlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRlclRleHQoKQotICB7Ci0JICBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAgPSBnZXRYU0RNb2RlbEdyb3VwKCk7Ci0JICByZXR1cm4gIHhzZE1vZGVsR3JvdXAuZ2V0Q29tcG9zaXRvcigpLmdldE5hbWUoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9SZWZlcmVuY2VDb25uZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1JlZmVyZW5jZUNvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ2M2RiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1JlZmVyZW5jZUNvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25Sb3V0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlQ29ubmVjdGlvbiBleHRlbmRzIFBvbHlsaW5lQ29ubmVjdGlvbgotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBoaWdobGlnaHQgPSBmYWxzZTsKLQotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbG9yIGFjdGl2ZUNvbm5lY3Rpb24gPSBDb2xvckNvbnN0YW50cy5ibGFjazsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBpbmFjdGl2ZUNvbm5lY3Rpb24gPSBuZXcgQ29sb3IobnVsbCwgMTk4LCAxOTUsIDE5OCk7Ci0KLSAgcHVibGljIFJlZmVyZW5jZUNvbm5lY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZXRDb25uZWN0aW9uUm91dGVyKG5ldyBYU0RNb2RlbEdyb3VwUm91dGVyKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblJvdXRlcihDb25uZWN0aW9uUm91dGVyIGNyKQotICB7Ci0gICAgaWYgKGNyICE9IG51bGwgJiYgZ2V0Q29ubmVjdGlvblJvdXRlcigpICE9IG51bGwgJiYgIShnZXRDb25uZWN0aW9uUm91dGVyKCkgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwUm91dGVyKSkKLSAgICAgIHN1cGVyLnNldENvbm5lY3Rpb25Sb3V0ZXIoY3IpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNIaWdobGlnaHRlZCgpCi0gIHsKLSAgICByZXR1cm4gaGlnaGxpZ2h0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SGlnaGxpZ2h0KGJvb2xlYW4gaGlnaGxpZ2h0KQotICB7Ci0gICAgdGhpcy5oaWdobGlnaHQgPSBoaWdobGlnaHQ7Ci0gICAgCi0gICAgYm9vbGVhbiBoaWdoQ29udHJhc3QgPSBmYWxzZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBoaWdoQ29udHJhc3QgPSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRIaWdoQ29udHJhc3QoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgaWYgKGhpZ2hDb250cmFzdCkKLSAgICB7Ci0gICAgICBzZXRGb3JlZ3JvdW5kQ29sb3IoaGlnaGxpZ2h0ID8gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EKSA6IENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRGb3JlZ3JvdW5kQ29sb3IoaGlnaGxpZ2h0ID8gYWN0aXZlQ29ubmVjdGlvbiA6IGluYWN0aXZlQ29ubmVjdGlvbik7Ci0gICAgfQotICAgIHNldE9wYXF1ZShoaWdobGlnaHQpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvU3BhY2VGaWxsZXJGb3JGaWVsZEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1NwYWNlRmlsbGVyRm9yRmllbGRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGY0NGVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvU3BhY2VGaWxsZXJGb3JGaWVsZEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRmllbGRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBTcGFjZUZpbGxlckZvckZpZWxkRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRmllbGRFZGl0UGFydAotewotICBMYWJlbCBzcGFjZTsKLSAgcHVibGljIFNwYWNlRmlsbGVyRm9yRmllbGRFZGl0UGFydCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIHNwYWNlID0gbmV3IExhYmVsKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIHNwYWNlLnNldEljb24oWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9Eb3QuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgc3BhY2Uuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMywgMCwgMywgMCkpOwotICAgIHJldHVybiBzcGFjZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0YWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9UYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZDFhOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9UYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5TcGFjaW5nRmlndXJlOwotCi1wdWJsaWMgY2xhc3MgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAotewotICBwdWJsaWMgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgU3BhY2luZ0ZpZ3VyZSBmaWd1cmU7Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIGZpZ3VyZSA9IG5ldyBTcGFjaW5nRmlndXJlKCk7Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfQotCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbm5lY3Rpb25GaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGFibGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1RvcExldmVsQ29tcG9uZW50RWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDA0MmYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EcmFnVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuTG9jYXRpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5BYnN0cmFjdEVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5JQXV0b0RpcmVjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5JTmFtZWRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlJvb3RDb250ZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JRmVlZGJhY2tIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5JQURUVXBkYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLlNpbXBsZURpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5GaWVsZEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVOYW1lQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzLkdyYXBoTm9kZURyYWdUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzLlRvcExldmVsQ29tcG9uZW50TGFiZWxDZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cG9saWNpZXMuVG9wTGV2ZWxOYW1lRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5IeXBlckxpbmtMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5sYXlvdXRzLkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlscy5PcGVuT25TZWxlY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTREltcG9ydEltcGw7Ci0KLXB1YmxpYyBjbGFzcyBUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0IGltcGxlbWVudHMgSUZlZWRiYWNrSGFuZGxlciwgSU5hbWVkRWRpdFBhcnQsIElBdXRvRGlyZWN0RWRpdAotewotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0gIC8vIHByb3RlY3RlZCBMYWJlbCBhcnJvd0xhYmVsOwotICBwcm90ZWN0ZWQgRmlndXJlIGxhYmVsSG9sZGVyID0gbmV3IEZpZ3VyZSgpOwotICBwcm90ZWN0ZWQgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotICBwcm90ZWN0ZWQgQURURGlyZWN0RWRpdFBvbGljeSBhZHREaXJlY3RFZGl0UG9saWN5ID0gbmV3IEFEVERpcmVjdEVkaXRQb2xpY3koKTsKLSAgcHJvdGVjdGVkIFNpbXBsZURpcmVjdEVkaXRQb2xpY3kgc2ltcGxlRGlyZWN0RWRpdFBvbGljeSA9IG5ldyBTaW1wbGVEaXJlY3RFZGl0UG9saWN5KCk7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzUmVhZE9ubHk7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0ZWQ7Ci0gIHByaXZhdGUgRm9udCBpdGFsaWNGb250OwotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBGaWd1cmUgdHlwZUdyb3VwID0gbmV3IEZpZ3VyZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gICAgICB7Ci0gICAgICAgIHN1cGVyLnBhaW50KGdyYXBoaWNzKTsKLSAgICAgICAgaWYgKGhhc0ZvY3VzKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgZ3JhcGhpY3MucHVzaFN0YXRlKCk7Ci0gICAgICAgICAgICBSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpOwotICAgICAgICAgICAgZ3JhcGhpY3Muc2V0WE9STW9kZSh0cnVlKTsKLSAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdGb2N1cyhyLngsIHIueSArIDEsIHIud2lkdGggLSAxLCByLmhlaWdodCAtIDIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgewotICAgICAgICAgICAgZ3JhcGhpY3MucG9wU3RhdGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0gICAgfTsKLSAgICB0eXBlR3JvdXAuc2V0TGF5b3V0TWFuYWdlcihuZXcgVG9vbGJhckxheW91dCgpKTsKLQotICAgIGxhYmVsSG9sZGVyID0gbmV3IEZpZ3VyZSgpOwotICAgIEZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7Ci0gICAgbGFiZWxIb2xkZXIuc2V0TGF5b3V0TWFuYWdlcihmaWxsTGF5b3V0KTsKLSAgICB0eXBlR3JvdXAuYWRkKGxhYmVsSG9sZGVyKTsKLQotICAgIGxhYmVsID0gbmV3IEh5cGVyTGlua0xhYmVsKCk7Ci0gICAgbGFiZWwuc2V0T3BhcXVlKHRydWUpOwotICAgIGxhYmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDEsIDIsIDIsIDUpKTsKLSAgICBpZiAoIWlzSGlnaENvbnRyYXN0KQotICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLSAgICBsYWJlbEhvbGRlci5hZGQobGFiZWwpOwotCi0gICAgcmV0dXJuIHR5cGVHcm91cDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICB7Ci0gICAgaWYgKGl0YWxpY0ZvbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpdGFsaWNGb250LmRpc3Bvc2UoKTsKLSAgICAgIGl0YWxpY0ZvbnQgPSBudWxsOwotICAgIH0KLSAgICBzdXBlci5kZWFjdGl2YXRlKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBYU0RCYXNlQWRhcHRlciBhZGFwdGVyID0gKFhTREJhc2VBZGFwdGVyKSBnZXRNb2RlbCgpOwotICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgaXNSZWFkT25seSA9IGFkYXB0ZXIuaXNSZWFkT25seSgpOwotICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbXB1dGVMYWJlbENvbG9yKCkpOwotICAgICAgbGFiZWwuc2V0VGV4dChhZGFwdGVyLmdldFRleHQoKSk7Ci0gICAgICBJbWFnZSBpbWFnZSA9IGFkYXB0ZXIuZ2V0SW1hZ2UoKTsKLSAgICAgIGlmIChpbWFnZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBsYWJlbC5zZXRJY29uKFhTRENvbW1vblVJVXRpbHMuZ2V0VXBkYXRlZEltYWdlKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgYWRhcHRlci5nZXRUYXJnZXQoKSwgaW1hZ2UsIGlzUmVhZE9ubHkpKTsKLSAgICAgIH0KLSAgICAgIC8vIGFycm93TGFiZWwuc2V0VmlzaWJsZShCb29sZWFuLlRSVUUuZXF1YWxzKGFkYXB0ZXIuZ2V0UHJvcGVydHkoZ2V0TW9kZWwoKSwKLSAgICAgIC8vICJkcmlsbERvd24iKSkpOwotICAgICAgCi0gICAgICBpZiAoYWRhcHRlci5pc0Fic3RyYWN0KCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChpdGFsaWNGb250ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBGb250IGZvbnQgPSBsYWJlbC5nZXRGb250KCk7Ci0gICAgICAgICAgaXRhbGljRm9udCA9IGdldEl0YWxpY0ZvbnQoZm9udCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0YWxpY0ZvbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGxhYmVsLnNldEZvbnQoaXRhbGljRm9udCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbGFiZWwuc2V0Rm9udChsYWJlbC5nZXRQYXJlbnQoKS5nZXRGb250KCkpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfR1JBUEhfVU5LTk9XTl9PQkpFQ1QgKyBnZXRNb2RlbCgpLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgIC8vIGFycm93TGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgfQotCi0gICAgaWYgKHJlc2VsZWN0KQotICAgIHsKLSAgICAgIGdldFZpZXdlcigpLnNlbGVjdCh0aGlzKTsKLSAgICAgIHNldFJlc2VsZWN0KGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICB9Ci0gIAotICBwdWJsaWMgRWRpdFBhcnQgZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgcmV0dXJuICgoQmFzZUVkaXRQYXJ0KXRoaXMuZ2V0UGFyZW50KCkpLmRvR2V0UmVsYXRpdmVFZGl0UGFydChlZGl0UGFydCwgZGlyZWN0aW9uKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLSAgICAvLyBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBuZXcKLSAgICAvLyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkpOwotICAgIC8vIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5ID0gbmV3IFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCgpOwotICAgIC8vIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsCi0gICAgLy8gc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kpOwotCi0gICAgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHBvbGljeSA9IG5ldyBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwoKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBwb2xpY3kpOwotCi0gICAgU2VsZWN0aW9uRWRpdFBvbGljeSBmZWVkQmFja1NlbGVjdGlvbkVkaXRQb2xpY3kgPSBuZXcgU2VsZWN0aW9uRWRpdFBvbGljeSgpCi0gICAgewotICAgICAgcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpCi0gICAgICB7Ci0gICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0SG9zdCgpOwotICAgICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJRmVlZGJhY2tIYW5kbGVyKQotICAgICAgICB7Ci0gICAgICAgICAgKChJRmVlZGJhY2tIYW5kbGVyKSBlZGl0UGFydCkucmVtb3ZlRmVlZGJhY2soKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXRIb3N0KCk7Ci0gICAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElGZWVkYmFja0hhbmRsZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAoKElGZWVkYmFja0hhbmRsZXIpIGVkaXRQYXJ0KS5hZGRGZWVkYmFjaygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBmZWVkQmFja1NlbGVjdGlvbkVkaXRQb2xpY3kpOwotCi0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLCBhZHREaXJlY3RFZGl0UG9saWN5KTsKLSAgfQotCi0gIHB1YmxpYyBDb2xvciBjb21wdXRlTGFiZWxDb2xvcigpCi0gIHsKLSAgICBDb2xvciBjb2xvciA9IENvbG9yQ29uc3RhbnRzLmJsYWNrOwotICAgIGlmIChpc0hpZ2hDb250cmFzdCkKLSAgICB7IAotICAgICAgY29sb3IgPSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0ZPUkVHUk9VTkQpOwotICAgIH0KLQotICAgIGlmIChpc1NlbGVjdGVkKQotICAgIHsKLSAgICAgIGlmIChpc0hpZ2hDb250cmFzdCkKLSAgICAgIHsKLSAgICAgICAgY29sb3IgPSBDb2xvckNvbnN0YW50cy5saXN0QmFja2dyb3VuZDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAJICBpZiAoaXNSZWFkT25seSkKLSAgICAJICB7Ci0gICAgCQkgIGNvbG9yID0gQ29sb3JDb25zdGFudHMuZ3JheTsKLSAgICAJICB9Ci0gICAgCSAgZWxzZQotICAgIAkgIHsKLSAgICAJCSAgY29sb3IgPSBDb2xvckNvbnN0YW50cy5ibGFjazsKLSAgICAJICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlzUmVhZE9ubHkpCi0gICAgewotICAgICAgY29sb3IgPSBDb2xvckNvbnN0YW50cy5ncmF5OwotICAgIH0KLSAgICByZXR1cm4gY29sb3I7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsKLSAgICBpc1NlbGVjdGVkID0gdHJ1ZTsKLQotICAgIGlmIChpc0hpZ2hDb250cmFzdCkKLSAgICB7Ci0gICAgICBsYWJlbEhvbGRlci5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubGlzdEZvcmVncm91bmQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGFiZWxIb2xkZXIuc2V0QmFja2dyb3VuZENvbG9yKEZpZWxkRmlndXJlLmNlbGxDb2xvcik7Ci0gICAgfQotICAgIGxhYmVsLnNldEZvcmVncm91bmRDb2xvcihjb21wdXRlTGFiZWxDb2xvcigpKTsKLSAgICAvLyBsYWJlbEhvbGRlci5zZXRGaWxsKHRydWUpOwotCi0gICAgaWYgKGRvU2Nyb2xsKQotICAgIHsKLSAgICAgIENhdGVnb3J5RWRpdFBhcnQgY2F0ZWdvcnlFUCA9IChDYXRlZ29yeUVkaXRQYXJ0KSBnZXRQYXJlbnQoKTsKLSAgICAgIGNhdGVnb3J5RVAuc2Nyb2xsVG8odGhpcyk7Ci0gICAgICBzZXRTY3JvbGwoZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBkb1Njcm9sbCA9IGZhbHNlOwotCi0gIHB1YmxpYyB2b2lkIHNldFNjcm9sbChib29sZWFuIGRvU2Nyb2xsKQotICB7Ci0gICAgdGhpcy5kb1Njcm9sbCA9IGRvU2Nyb2xsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKQotICB7Ci0gICAgaXNTZWxlY3RlZCA9IGZhbHNlOwotICAgIGxhYmVsSG9sZGVyLnNldEJhY2tncm91bmRDb2xvcihudWxsKTsKLSAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoY29tcHV0ZUxhYmVsQ29sb3IoKSk7Ci0gICAgLy8gbGFiZWxIb2xkZXIuc2V0RmlsbChmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICAvLyBEbyBub3Qgb3BlbiBvbiBvciBzZXQgZm9jdXMgb24gZGlyZWN0IGVkaXQgdHlwZSAKLSAgICBpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfT1BFTikKLSAgICB7Ci0KLSAgICAgIE9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0gICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJR3JhcGhFbGVtZW50KQotICAgICAgewotICAgICAgICBpZiAoKChJR3JhcGhFbGVtZW50KW1vZGVsKS5pc0ZvY3VzQWxsb3dlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpCi0gICAgICAgICAgewotICAgICAgICAgICAgTG9jYXRpb25SZXF1ZXN0IGxvY2F0aW9uUmVxdWVzdCA9IChMb2NhdGlvblJlcXVlc3QpIHJlcXVlc3Q7Ci0gICAgICAgICAgICBQb2ludCBwID0gbG9jYXRpb25SZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0KLSAgICAgICAgICAgIGlmIChoaXRUZXN0KGxhYmVsSG9sZGVyLCBwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcGVyZm9ybURyaWxsRG93bkFjdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyKQotICAgICAgewotICAgICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkKLSAgICAgICAgewotICAgICAgICAgIExvY2F0aW9uUmVxdWVzdCBsb2NhdGlvblJlcXVlc3QgPSAoTG9jYXRpb25SZXF1ZXN0KSByZXF1ZXN0OwotICAgICAgICAgIFBvaW50IHAgPSBsb2NhdGlvblJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLQotICAgICAgICAgIGlmIChoaXRUZXN0KGxhYmVsSG9sZGVyLCBwKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RTY2hlbWFEaXJlY3RpdmUgZGlyID0gKFhTRFNjaGVtYURpcmVjdGl2ZSkoKFhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIpbW9kZWwpLmdldFRhcmdldCgpOwotICAgICAgICAgICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gIiI7Ci0gICAgICAgICAgICAvLyBmb3JjZSBsb2FkIG9mIGltcG9ydGVkIHNjaGVtYQotICAgICAgICAgICAgaWYgKGRpciBpbnN0YW5jZW9mIFhTREltcG9ydEltcGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICgoWFNESW1wb3J0SW1wbClkaXIpLmltcG9ydFNjaGVtYSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRpci5nZXRSZXNvbHZlZFNjaGVtYSgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uID0gVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChkaXIuZ2V0UmVzb2x2ZWRTY2hlbWEoKS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgaWYgKHNjaGVtYUxvY2F0aW9uICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPcGVuT25TZWxlY3Rpb25IZWxwZXIub3BlblhTREVkaXRvcihkaXIuZ2V0UmVzb2x2ZWRTY2hlbWEoKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGhpdFRlc3QoSUZpZ3VyZSB0YXJnZXQsIFBvaW50IGxvY2F0aW9uKQotICB7Ci0gICAgUmVjdGFuZ2xlIGIgPSB0YXJnZXQuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgIHRhcmdldC50cmFuc2xhdGVUb0Fic29sdXRlKGIpOwotICAgIHJldHVybiBiLmNvbnRhaW5zKGxvY2F0aW9uKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EcmlsbERvd25BY3Rpb24oKQotICB7Ci0gICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKChBYnN0cmFjdEVkaXRQYXJ0Vmlld2VyKSBnZXRWaWV3ZXIoKSkuZ2V0Um9vdEVkaXRQYXJ0KCkuZ2V0Q29udGVudHMoKTsKLSAgICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgUm9vdENvbnRlbnRFZGl0UGFydCkKLSAgICAgICAgewotICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBnZXRFZGl0b3JQYXJ0KCk7Ci0vLyAgICAgICAgICBBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IChBY3Rpb25SZWdpc3RyeSkgZWRpdG9yUGFydC5nZXRBZGFwdGVyKEFjdGlvblJlZ2lzdHJ5LmNsYXNzKTsKLS8vICAgICAgICAgIElBY3Rpb24gYWN0aW9uID0gcmVnaXN0cnkuZ2V0QWN0aW9uKFNldElucHV0VG9HcmFwaFZpZXcuSUQpOwotLy8gICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICAgIEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gKEFjdGlvblJlZ2lzdHJ5KSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoQWN0aW9uUmVnaXN0cnkuY2xhc3MpOwotICAgICAgICAgIGlmIChyZWdpc3RyeSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElBY3Rpb24gYWN0aW9uID0gcmVnaXN0cnkuZ2V0QWN0aW9uKE9wZW5Jbk5ld0VkaXRvci5JRCk7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkb0VkaXROYW1lKGJvb2xlYW4gYWRkRnJvbURlc2lnbikKLSAgewotICAgIGlmICghYWRkRnJvbURlc2lnbikgcmV0dXJuOwotICAgIAotLy8gICAgcmVtb3ZlRmVlZGJhY2soKTsKLQotICAgIE9iamVjdCBvYmplY3QgPSAoKFhTREJhc2VBZGFwdGVyKSBnZXRNb2RlbCgpKS5nZXRUYXJnZXQoKTsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgewotICAgICAgUG9pbnQgcCA9IGxhYmVsLmdldExvY2F0aW9uKCk7Ci0gICAgICBUb3BMZXZlbE5hbWVEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyID0gbmV3IFRvcExldmVsTmFtZURpcmVjdEVkaXRNYW5hZ2VyKFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQudGhpcywgbmV3IFRvcExldmVsQ29tcG9uZW50TGFiZWxDZWxsRWRpdG9yTG9jYXRvcihUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0LnRoaXMsIHApLCAoWFNETmFtZWRDb21wb25lbnQpIG9iamVjdCk7Ci0gICAgICBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIgd3JhcHBlciA9IG5ldyBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIoKTsKLSAgICAgIGFkdERpcmVjdEVkaXRQb2xpY3kuc2V0VXBkYXRlQ29tbWFuZCh3cmFwcGVyKTsKLSAgICAgIG1hbmFnZXIuc2hvdygpOwotICAgIH0KLSAgfQotICAKLSAgY2xhc3MgTmFtZVVwZGF0ZUNvbW1hbmRXcmFwcGVyIGV4dGVuZHMgQ29tbWFuZCBpbXBsZW1lbnRzIElBRFRVcGRhdGVDb21tYW5kCi0gIHsKLSAgICBDb21tYW5kIGNvbW1hbmQ7Ci0gICAgcHJvdGVjdGVkIERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3Q7Ci0gICAgCi0gICAgcHVibGljIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlcigpCi0gICAgewotICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfTkFNRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdChEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KQotICAgIHsKLSAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgIHsKLSAgICAgIFhTREJhc2VBZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQmFzZUFkYXB0ZXIpZ2V0TW9kZWwoKTsKLSAgICAgIE9iamVjdCBuZXdWYWx1ZSA9IHJlcXVlc3QuZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCk7Ci0gICAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgJiYgKChTdHJpbmcpbmV3VmFsdWUpLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgVXBkYXRlTmFtZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVOYW1lQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9OQU1FLCAoWFNETmFtZWRDb21wb25lbnQpYWRhcHRlci5nZXRUYXJnZXQoKSwgKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICB9Ci0gICAgIH0KLSAgfQotCi0gIHN0YXRpYyBib29sZWFuIHJlc2VsZWN0ID0gZmFsc2U7Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVzZWxlY3QoYm9vbGVhbiBzdGF0ZSkKLSAgewotICAgIHJlc2VsZWN0ID0gc3RhdGU7Ci0gIH0KLQotICBwdWJsaWMgTGFiZWwgZ2V0TmFtZUxhYmVsRmlndXJlKCkKLSAgewotICAgIHJldHVybiBsYWJlbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGN1cnNvckxvY2F0aW9uKQotICB7Ci0gICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoaW50IHZhbHVlKQotICB7Ci0gICAgLy8gaWYgaXQgaXMgc2VsZWN0ZWQsIHdlIHdhbnQgdG8gc2Nyb2xsIHRvIGl0Ci0gICAgaWYgKGRvU2Nyb2xsKQotICAgICAgc2V0U2Nyb2xsKHRydWUpOwotICAgIHN1cGVyLnNldFNlbGVjdGVkKHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZvY3VzKGJvb2xlYW4gYikKLSAgewotICAgIHN1cGVyLnNldEZvY3VzKGIpOwotICAgIGhhc0ZvY3VzID0gYjsKLSAgICBnZXRGaWd1cmUoKS5yZXBhaW50KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBEcmFnVHJhY2tlciBnZXREcmFnVHJhY2tlcihSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICByZXR1cm4gbmV3IEdyYXBoTm9kZURyYWdUcmFja2VyKHRoaXMpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkZXJUZXh0KCkKLSAgewotCSAgcmV0dXJuIGdldE5hbWVMYWJlbEZpZ3VyZSgpLmdldFRleHQoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREF0dHJpYnV0ZXNGb3JBbm5vdGF0aW9uRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEQXR0cmlidXRlc0ZvckFubm90YXRpb25FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2I0ZGQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEQXR0cmlidXRlc0ZvckFubm90YXRpb25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlNlY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklDb21wbGV4VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVN0cnVjdHVyZTsKLQotcHVibGljIGNsYXNzIFhTREF0dHJpYnV0ZXNGb3JBbm5vdGF0aW9uRWRpdFBhcnQgZXh0ZW5kcyBTZWN0aW9uRWRpdFBhcnQKLXsKLSAgcHVibGljIFhTREF0dHJpYnV0ZXNGb3JBbm5vdGF0aW9uRWRpdFBhcnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0gICAgSVN0cnVjdHVyZSBzdHJ1Y3R1cmUgPSAgKChBbm5vdGF0aW9uKWdldE1vZGVsKCkpLmdldE93bmVyKCk7Ci0gICAgaWYgKHN0cnVjdHVyZSBpbnN0YW5jZW9mIElDb21wbGV4VHlwZSkKLSAgICB7ICAKLSAgICAgIGNvbXBsZXhUeXBlID0gKElDb21wbGV4VHlwZSlzdHJ1Y3R1cmU7Ci0gICAgICBpZiAoY29tcGxleFR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyKQotICAgICAgewotICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcikgY29tcGxleFR5cGU7Ci0gICAgICAgIHJldHVybiBhZGFwdGVyLmdldEF0dHJpYnV0ZUdyb3VwQ29udGVudCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9YU0RCYXNlRmllbGRFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9YU0RCYXNlRmllbGRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWRhYzljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEQmFzZUZpZWxkRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5JQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0LkF0dHJpYnV0ZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0LkVsZW1lbnRSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5MYWJlbENlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0LkxhYmVsRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQuUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRmllbGRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JRmllbGRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzLkZpZWxkRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cG9saWNpZXMuRHJhZ0FuZERyb3BFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEQmFzZUZpZWxkRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRmllbGRFZGl0UGFydAotewotCi0gIHB1YmxpYyBYU0RCYXNlRmllbGRFZGl0UGFydCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0RWRpdFBhcnQjcmVmcmVzaFZpc3VhbHMoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgSUZpZWxkRmlndXJlIGZpZ3VyZSA9IGdldEZpZWxkRmlndXJlKCk7Ci0gICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZCkgZ2V0TW9kZWwoKTsKLSAgICAKLSAgICBmaWd1cmUuZ2V0TmFtZUxhYmVsKCkuc2V0VGV4dChmaWVsZC5nZXROYW1lKCkpOwotICAgIGZpZ3VyZS5nZXRUeXBlTGFiZWwoKS5zZXRUZXh0KGZpZWxkLmdldFR5cGVOYW1lKCkpOwotICAgIGZpZ3VyZS5yZWZyZXNoVmlzdWFscyhnZXRNb2RlbCgpKTsKLSAgICBpZiAoZmllbGQuaXNSZWFkT25seSgpKQotICAgIHsKLSAgICAgIGZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuZGFya0dyYXkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKGlzSGlnaENvbnRyYXN0KQotICAgICAgewotICAgICAgICBmaWd1cmUuc2V0Rm9yZWdyb3VuZENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfRk9SRUdST1VORCkpOwotICAgICAgICBmaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBmaWd1cmUuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsgICAgIAotICAgIH0KLQotICAgIFN0cmluZyBvY2N1cnJlbmNlRGVzY3JpcHRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIElBbm5vdGF0aW9uUHJvdmlkZXIpCi0gICAgewotICAgICAgb2NjdXJyZW5jZURlc2NyaXB0aW9uID0gKChJQW5ub3RhdGlvblByb3ZpZGVyKWZpZWxkKS5nZXROYW1lQW5ub3RhdGlvblN0cmluZygpOwotICAgIH0KLSAgICByZWZyZXNoSWNvbigpOwotICAgIGZpZ3VyZS5nZXROYW1lQW5ub3RhdGlvbkxhYmVsKCkuc2V0VGV4dChvY2N1cnJlbmNlRGVzY3JpcHRpb24pOwotICAgIAotICAgIGZpZ3VyZS5yZWNvbXB1dGVMYXlvdXQoKTsKLQotCi0gICAgaWYgKGdldFJvb3QoKSAhPSBudWxsKQotICAgICAgKChHcmFwaGljYWxFZGl0UGFydClnZXRSb290KCkpLmdldEZpZ3VyZSgpLmludmFsaWRhdGVUcmVlKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hJY29uKCkgIAotICB7Ci0gICAgSUZpZWxkRmlndXJlIGZpZ3VyZSA9IGdldEZpZWxkRmlndXJlKCk7ICAgCi0gICAgLy8gb3VyIG1vZGVsIGltcGxlbWVudHMgSVRyZWVFbGVtZW50Ci0gICAgaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBJbWFnZSBpbWFnZSA9ICgoWFNEQmFzZUFkYXB0ZXIpZ2V0TW9kZWwoKSkuZ2V0SW1hZ2UoKTsKLSAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICgoWFNEQmFzZUFkYXB0ZXIpZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpOwotICAgICAgZmlndXJlLmdldE5hbWVMYWJlbCgpLnNldEljb24oaW1hZ2UpOwotICAgICAgCi0gICAgICBpZiAoaW1hZ2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgKChYU0RCYXNlQWRhcHRlcilnZXRNb2RlbCgpKS5nZXRUYXJnZXQoKTsKLSAgICAgICAgZmlndXJlLmdldE5hbWVMYWJlbCgpLnNldEljb24oWFNEQ29tbW9uVUlVdGlscy5nZXRVcGRhdGVkSW1hZ2UoY29tcCwgaW1hZ2UsIGlzUmVhZE9ubHkpKTsKLSAgICAgIH0KLSAgICB9ICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkTm90aWZ5KCkKLSAgewotICAgIHN1cGVyLmFkZE5vdGlmeSgpOwotICAgIGdldEZpZWxkRmlndXJlKCkuZWRpdFBhcnRBdHRhY2hlZCh0aGlzKTsKLSAgfQotCi0gIHByb3RlY3RlZCBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kgPSBuZXcgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsKCk7Ci0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSk7Ci0gICAgaWYgKCFpc0ZpbGVSZWFkT25seSgpKQotICAgICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwgbmV3IERyYWdBbmREcm9wRWRpdFBvbGljeShnZXRWaWV3ZXIoKSwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZGlyZWN0RWRpdE5hbWVGaWVsZCgpCi0gIHsKLSAgICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgIElGaWVsZEZpZ3VyZSBmaWVsZEZpZ3VyZSA9IGdldEZpZWxkRmlndXJlKCk7Ci0gICAgaWYgKCBtb2RlbCBpbnN0YW5jZW9mIElGaWVsZCkgCi0gICAgewotICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZCkgbW9kZWw7Ci0gICAgICBpZiAoZmllbGQuaXNSZWZlcmVuY2UoKSkKLSAgICAgIHsKLSAgICAgICAgUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlciA9IG51bGw7Ci0gICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBtYW5hZ2VyID0gbmV3IEVsZW1lbnRSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcigoSUZpZWxkKSBtb2RlbCwgdGhpcywgZmllbGRGaWd1cmUuZ2V0TmFtZUxhYmVsKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGZpZWxkIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyKQotICAgICAgICB7Ci0gICAgICAgICAgbWFuYWdlciA9IG5ldyBBdHRyaWJ1dGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcigoSUZpZWxkKSBtb2RlbCwgdGhpcywgZmllbGRGaWd1cmUuZ2V0TmFtZUxhYmVsKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYW5hZ2VyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBSZWZlcmVuY2VVcGRhdGVDb21tYW5kIGVsZW1lbnRVcGRhdGVDb21tYW5kID0gbmV3IFJlZmVyZW5jZVVwZGF0ZUNvbW1hbmQoKTsKLSAgICAgICAgICBlbGVtZW50VXBkYXRlQ29tbWFuZC5zZXREZWxlZ2F0ZShtYW5hZ2VyKTsKLSAgICAgICAgICBhZHREaXJlY3RFZGl0UG9saWN5LnNldFVwZGF0ZUNvbW1hbmQoZWxlbWVudFVwZGF0ZUNvbW1hbmQpOwotICAgICAgICAgIG1hbmFnZXIuc2hvdygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIExhYmVsRWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBMYWJlbEVkaXRNYW5hZ2VyKHRoaXMsIG5ldyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKHRoaXMsIG51bGwpKTsKLSAgICAgICAgTmFtZVVwZGF0ZUNvbW1hbmRXcmFwcGVyIHdyYXBwZXIgPSBuZXcgTmFtZVVwZGF0ZUNvbW1hbmRXcmFwcGVyKCk7Ci0gICAgICAgIGFkdERpcmVjdEVkaXRQb2xpY3kuc2V0VXBkYXRlQ29tbWFuZCh3cmFwcGVyKTsKLSAgICAgICAgbWFuYWdlci5zaG93KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRGb2N1cyhib29sZWFuIGZvY3VzKQotICB7Ci0gICAgc3VwZXIuc2V0Rm9jdXMoZm9jdXMpOwotICAgIGhhc0ZvY3VzID0gZm9jdXM7Ci0gICAgKChGaWVsZEZpZ3VyZSlnZXRGaWd1cmUoKSkuaGFzRm9jdXMgPSBoYXNGb2N1czsKLSAgICBnZXRGaWd1cmUoKS5yZXBhaW50KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNERWRpdFBhcnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREVkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTFiNzg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNERWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLkNhdGVnb3J5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRE1vZGVsR3JvdXBBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEU2NoZW1hQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkFEVEVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkNvbHVtbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSUNvbXBhcnRtZW50RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklGaWVsZEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JU3RydWN0dXJlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5UeXBlVml6RmlndXJlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLlNwYWNlRmlsbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5UYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5JRXh0ZW5kZWRGaWd1cmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuSU1vZGVsR3JvdXBGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIFhTREVkaXRQYXJ0RmFjdG9yeSBleHRlbmRzIEFEVEVkaXRQYXJ0RmFjdG9yeSBpbXBsZW1lbnRzIElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkKLXsKLSAgcHJvdGVjdGVkIElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkgZGVsZWdhdGU7Ci0gIAotICBwdWJsaWMgWFNERWRpdFBhcnRGYWN0b3J5KCkKLSAgewotICAgIGRlbGVnYXRlID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFhTREVkaXRvckNvbmZpZ3VyYXRpb24oKS5nZXRGaWd1cmVGYWN0b3J5KCk7Ci0gICAgaWYgKGRlbGVnYXRlID09IG51bGwpCi0gICAgICBkZWxlZ2F0ZSA9IG5ldyBUeXBlVml6RmlndXJlRmFjdG9yeSgpOwotICB9Ci0gIAotICBwdWJsaWMgWFNERWRpdFBhcnRGYWN0b3J5KElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkgZmlndXJlRmFjdG9yeSkKLSAgewotICAgIGRlbGVnYXRlID0gZmlndXJlRmFjdG9yeTsKLSAgfQotICAKLQotICBwdWJsaWMgRWRpdFBhcnQgZG9DcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBFZGl0UGFydCBjaGlsZCA9IG51bGw7Ci0gICAgLy8gT3ZlcnJpZGUgZWRpdCBwYXJ0IHdoZXJlIGRlc2lyZWQKLSAgICAKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJRmllbGQpCi0gICAgewotICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgU3BhY2VGaWxsZXIpCi0gICAgICB7Ci0gICAgICAgIGNoaWxkID0gbmV3IFNwYWNlRmlsbGVyRm9yRmllbGRFZGl0UGFydCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29udGV4dCBpbnN0YW5jZW9mIENvbXBhcnRtZW50RWRpdFBhcnQpCi0gICAgICB7ICAKLSAgICAgICAgY2hpbGQgPSBuZXcgWFNEQmFzZUZpZWxkRWRpdFBhcnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RTY2hlbWFBZGFwdGVyKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IFhTRFNjaGVtYUVkaXRQYXJ0KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgQ2F0ZWdvcnlBZGFwdGVyKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IENhdGVnb3J5RWRpdFBhcnQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpCi0gICAgewotICAgICAgY2hpbGQgPSBuZXcgWFNEU2ltcGxlVHlwZUVkaXRQYXJ0KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cEFkYXB0ZXIpCi0gICAgewotICAgICAgY2hpbGQgPSBuZXcgTW9kZWxHcm91cEVkaXRQYXJ0KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgQW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQW5ub3RhdGlvbikgbW9kZWw7Ci0gICAgICBTdHJpbmcga2luZCA9IGFubm90YXRpb24uZ2V0Q29tcGFydG1lbnQoKS5nZXRLaW5kKCk7Ci0gICAgICBpZiAoa2luZC5lcXVhbHMoImVsZW1lbnQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBjaGlsZCA9IG5ldyBYU0RHcm91cHNGb3JBbm5vdGF0aW9uRWRpdFBhcnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGtpbmQuZXF1YWxzKCJhdHRyaWJ1dGUiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBjaGlsZCA9IG5ldyBYU0RBdHRyaWJ1dGVzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKCEoY29udGV4dCBpbnN0YW5jZW9mIENvbHVtbkVkaXRQYXJ0KSkKLSAgICB7ICAgCi0gICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBUYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIpCi0gICAgICB7Ci0gICAgICAgIGNoaWxkID0gbmV3IFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKQotICAgICAgewotICAgICAgICBjaGlsZCA9IG5ldyBNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIGNoaWxkID0gbmV3IEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYSBzcGVjaWFsemllZCBYU0QgZWRpdCBwYXJ0IHRvIGNyZWF0ZQotICAgIC8vIHRoZW4gd2Ugc2ltcGx5IGNhbGwgdGhlIHN1cGVyIGNsYXNzIHRvIGNyZWF0ZSBhIGdlbmVyaWMgQURUIGVkaXQgcGFydAotICAgIC8vCi0gICAgaWYgKGNoaWxkID09IG51bGwpCi0gICAgewotICAgICAgY2hpbGQgPSBzdXBlci5kb0NyZWF0ZUVkaXRQYXJ0KGNvbnRleHQsIG1vZGVsKTsKLSAgICB9Ci0KLSAgICAvLyBpZiBhdCB0aGlzIHRoaXMgcG9pbnQgd2UgaGF2ZSBub3QgY3JlYXRlZCBhbiBlZGl0IHBhcnQgd2Ugc2ltcGx5Ci0gICAgLy8gY3JlYXRlIGEgcGxhY2Vob2xkZXIgZWRpdCBwYXJ0IHRvIHByb3ZpZGUgdGhlIG1vc3Qgcm9idXN0IGJlaGF2aW91ciBwb3NzaWJsZQotICAgIC8vICAgIAotICAgIGlmIChjaGlsZCA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIFRPRE8gKGNzKSBsb2cgYW4gZXJyb3IgbWVzc2FnZSBoZXJlLCBzaW5jZSB3ZSBzaG91bGRuJ3QgcmVhbGx5IGdldCBoZXJlIAotICAgICAgY2hpbGQgPSBuZXcgU3BhY2VGaWxsZXJGb3JGaWVsZEVkaXRQYXJ0KCk7Ci0gICAgfSAgCi0gICAgcmV0dXJuIGNoaWxkOwotICB9Ci0KLSAgcHVibGljIElDb21wYXJ0bWVudEZpZ3VyZSBjcmVhdGVDb21wYXJ0bWVudEZpZ3VyZShPYmplY3QgbW9kZWwpCi0gIHsKLSAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlQ29tcGFydG1lbnRGaWd1cmUobW9kZWwpOwotICB9Ci0gIAotICBwdWJsaWMgSVN0cnVjdHVyZUZpZ3VyZSBjcmVhdGVTdHJ1Y3R1cmVGaWd1cmUoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgSVN0cnVjdHVyZUZpZ3VyZSBmaWd1cmUgPSBkZWxlZ2F0ZS5jcmVhdGVTdHJ1Y3R1cmVGaWd1cmUobW9kZWwpOwotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXAgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpICgoWFNEQmFzZUFkYXB0ZXIpbW9kZWwpLmdldFRhcmdldCgpOwotICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gKChYU0RCYXNlQWRhcHRlciltb2RlbCkuaXNSZWFkT25seSgpOwotICAgICAgZmlndXJlLmdldE5hbWVMYWJlbCgpLnNldEljb24oWFNEQ29tbW9uVUlVdGlscy5nZXRVcGRhdGVkSW1hZ2UoIGNvbXAsICgoWFNEQmFzZUFkYXB0ZXIpbW9kZWwpLmdldEltYWdlKCksIGlzUmVhZE9ubHkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfSAgCi0KLSAgcHVibGljIElGaWVsZEZpZ3VyZSBjcmVhdGVGaWVsZEZpZ3VyZShPYmplY3QgbW9kZWwpCi0gIHsKLSAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlRmllbGRGaWd1cmUobW9kZWwpOwotICB9Ci0gIAotICBwdWJsaWMgSU1vZGVsR3JvdXBGaWd1cmUgY3JlYXRlTW9kZWxHcm91cEZpZ3VyZShPYmplY3QgbW9kZWwpCi0gIHsKLSAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlTW9kZWxHcm91cEZpZ3VyZShtb2RlbCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNER3JvdXBzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREdyb3Vwc0ZvckFubm90YXRpb25FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDY1YjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNER3JvdXBzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlNlY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklDb21wbGV4VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0RHcm91cHNGb3JBbm5vdGF0aW9uRWRpdFBhcnQgZXh0ZW5kcyBTZWN0aW9uRWRpdFBhcnQKLXsKLSAgcHVibGljIFhTREdyb3Vwc0ZvckFubm90YXRpb25FZGl0UGFydCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsKLSAgICBMaXN0IHhzZE1vZGVsR3JvdXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgSVN0cnVjdHVyZSBzdHJ1Y3R1cmUgPSAgKChBbm5vdGF0aW9uKWdldE1vZGVsKCkpLmdldE93bmVyKCk7Ci0gICAgaWYgKHN0cnVjdHVyZSBpbnN0YW5jZW9mIElDb21wbGV4VHlwZSkKLSAgICB7ICAKLSAgICAgIGNvbXBsZXhUeXBlID0gKElDb21wbGV4VHlwZSlzdHJ1Y3R1cmU7Ci0gICAgICBpZiAoY29tcGxleFR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyKQotICAgICAgewotICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcikgY29tcGxleFR5cGU7Ci0gICAgICAgIHhzZE1vZGVsR3JvdXBMaXN0ID0gYWRhcHRlci5nZXRNb2RlbEdyb3VwcygpOwotICAgICAgfQotICAgICAgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RNb2RlbEdyb3VwTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgICB7Ci0gICAgICAgICAgYWRhcHRlckxpc3QuYWRkKFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoKFhTRE1vZGVsR3JvdXApb2JqKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBhZGFwdGVyTGlzdC5hZGQoWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCgoWFNETW9kZWxHcm91cERlZmluaXRpb24pb2JqKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RydWN0dXJlIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcikgc3RydWN0dXJlOwotICAgICAgWFNETW9kZWxHcm91cCBncm91cCA9IGFkYXB0ZXIuZ2V0WFNETW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRNb2RlbEdyb3VwKCk7Ci0gICAgICBpZiAoZ3JvdXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYWRhcHRlckxpc3QuYWRkKFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZ3JvdXApKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGFkYXB0ZXJMaXN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTRE1vZGVsR3JvdXBSb3V0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNETW9kZWxHcm91cFJvdXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk1NzgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNETW9kZWxHcm91cFJvdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RSb3V0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vLyBUT0RPIE1hbmhhdHRhbiBjb25uZWN0aW9uIHJvdXRlciBpcyBmaW5hbAotcHVibGljIGNsYXNzIFhTRE1vZGVsR3JvdXBSb3V0ZXIgZXh0ZW5kcyBBYnN0cmFjdFJvdXRlcgotewotICBwdWJsaWMgWFNETW9kZWxHcm91cFJvdXRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIHByaXZhdGUgTWFwIHJvd3NVc2VkID0gbmV3IEhhc2hNYXAoKTsKLSAgcHJpdmF0ZSBNYXAgY29sc1VzZWQgPSBuZXcgSGFzaE1hcCgpOwotCi0gIHByaXZhdGUgTWFwIHJlc2VydmVkSW5mbyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgcHJpdmF0ZSBjbGFzcyBSZXNlcnZlZEluZm8gewotICAgIHB1YmxpYyBMaXN0IHJlc2VydmVkUm93cyA9IG5ldyBBcnJheUxpc3QoMik7Ci0gICAgcHVibGljIExpc3QgcmVzZXJ2ZWRDb2xzID0gbmV3IEFycmF5TGlzdCgyKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFJheSAgVVAgICAgPSBuZXcgUmF5KDAsIC0xKSwKLSAgICAgICAgICAgICAgRE9XTiAgPSBuZXcgUmF5KDAsIDEpLAotICAgICAgICAgICAgICBMRUZUICA9IG5ldyBSYXkoLTEsIDApLAotICAgICAgICAgICAgICBSSUdIVCA9IG5ldyBSYXkoMSwgMCk7Ci0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvblJvdXRlciNpbnZhbGlkYXRlKENvbm5lY3Rpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgIHJlbW92ZVJlc2VydmVkTGluZXMoY29ubmVjdGlvbik7Ci0gIH0KLQotICBwcml2YXRlIGludCBnZXRDb2x1bW5OZWFyKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgaW50IHIsIGludCBuLCBpbnQgeCkgewotICAgIGludCBtaW4gPSBNYXRoLm1pbihuLCB4KSwKLSAgICAgIG1heCA9IE1hdGgubWF4KG4sIHgpOwotICAgIGlmIChtaW4gPiByKSB7Ci0gICAgICBtYXggPSBtaW47Ci0gICAgICBtaW4gPSByIC0gKG1pbiAtIHIpOwotICAgIH0KLSAgICBpZiAobWF4IDwgcikgewotICAgICAgbWluID0gbWF4OwotICAgICAgbWF4ID0gciArIChyIC0gbWF4KTsKLSAgICB9Ci0gICAgaW50IHByb3hpbWl0eSA9IDA7Ci0gICAgaW50IGRpcmVjdGlvbiA9IC0xOwotICAgIGlmIChyICUgMiA9PSAxKQotICAgICAgci0tOwotICAgIEludGVnZXIgaTsKLSAgICB3aGlsZSAocHJveGltaXR5IDwgcikgewotICAgICAgaSA9IG5ldyBJbnRlZ2VyKHIgKyBwcm94aW1pdHkgKiBkaXJlY3Rpb24pOwotICAgICAgaWYgKCFjb2xzVXNlZC5jb250YWluc0tleShpKSkgewotICAgICAgICBjb2xzVXNlZC5wdXQoaSwgaSk7Ci0gICAgICAgIHJlc2VydmVDb2x1bW4oY29ubmVjdGlvbiwgaSk7Ci0gICAgICAgIHJldHVybiBpLmludFZhbHVlKCk7Ci0gICAgICB9Ci0gICAgICBpbnQgaiA9IGkuaW50VmFsdWUoKTsKLSAgICAgIGlmIChqIDw9IG1pbikKLSAgICAgICAgcmV0dXJuIGogKyAyOwotICAgICAgaWYgKGogPj0gbWF4KQotICAgICAgICByZXR1cm4gaiAtIDI7Ci0gICAgICBpZiAoZGlyZWN0aW9uID09IDEpCi0gICAgICAgIGRpcmVjdGlvbiA9IC0xOwotICAgICAgZWxzZSB7Ci0gICAgICAgIGRpcmVjdGlvbiA9IDE7Ci0gICAgICAgIHByb3hpbWl0eSArPSAyOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBkaXJlY3Rpb24gdGhlIHBvaW50IDxpPnA8L2k+IGlzIGluIHJlbGF0aW9uIHRvIHRoZSBnaXZlbiByZWN0YW5nbGUuCi0gICAqIFBvc3NpYmxlIHZhbHVlcyBhcmUgTEVGVCAoLTEsMCksIFJJR0hUICgxLDApLCBVUCAoMCwtMSkgYW5kIERPV04gKDAsMSkuCi0gICAqIAotICAgKiBAcGFyYW0gciB0aGUgcmVjdGFuZ2xlCi0gICAqIEBwYXJhbSBwIHRoZSBwb2ludAotICAgKiBAcmV0dXJuIHRoZSBkaXJlY3Rpb24gZnJvbSA8aT5yPC9pPiB0byA8aT5wPC9pPgotICAgKi8KLSAgcHJvdGVjdGVkIFJheSBnZXREaXJlY3Rpb24oUmVjdGFuZ2xlIHIsIFBvaW50IHApIHsKLSAgICBpbnQgaSwgZGlzdGFuY2UgPSBNYXRoLmFicyhyLnggLSBwLngpOwotICAgIFJheSBkaXJlY3Rpb247Ci0gICAgCi0gICAgZGlyZWN0aW9uID0gTEVGVDsKLQotICAgIGkgPSBNYXRoLmFicyhyLnkgLSBwLnkpOwotICAgIGlmIChpIDw9IGRpc3RhbmNlKSB7Ci0gICAgICBkaXN0YW5jZSA9IGk7Ci0gICAgICBkaXJlY3Rpb24gPSBVUDsKLSAgICB9Ci0KLSAgICBpID0gTWF0aC5hYnMoci5ib3R0b20oKSAtIHAueSk7Ci0gICAgaWYgKGkgPD0gZGlzdGFuY2UpIHsKLSAgICAgIGRpc3RhbmNlID0gaTsKLSAgICAgIGRpcmVjdGlvbiA9IERPV047Ci0gICAgfQotCi0gICAgaSA9IE1hdGguYWJzKHIucmlnaHQoKSAtIHAueCk7Ci0gICAgaWYgKGkgPCBkaXN0YW5jZSkgewotICAgICAgZGlzdGFuY2UgPSBpOwotICAgICAgZGlyZWN0aW9uID0gUklHSFQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGRpcmVjdGlvbjsKLSAgfQotCi0gIHByb3RlY3RlZCBSYXkgZ2V0RW5kRGlyZWN0aW9uKENvbm5lY3Rpb24gY29ubikgewotICAgIENvbm5lY3Rpb25BbmNob3IgYW5jaG9yID0gY29ubi5nZXRUYXJnZXRBbmNob3IoKTsKLSAgICBQb2ludCBwID0gZ2V0RW5kUG9pbnQoY29ubik7Ci0gICAgUmVjdGFuZ2xlIHJlY3Q7Ci0gICAgaWYgKGFuY2hvci5nZXRPd25lcigpID09IG51bGwpCi0gICAgICByZWN0ID0gbmV3IFJlY3RhbmdsZShwLnggLSAxLCBwLnkgLSAxLCAyLCAyKTsKLSAgICBlbHNlIHsKLSAgICAgIHJlY3QgPSBjb25uLmdldFRhcmdldEFuY2hvcigpLmdldE93bmVyKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgICAgY29ubi5nZXRUYXJnZXRBbmNob3IoKS5nZXRPd25lcigpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0gICAgfQotICAgIHJldHVybiBnZXREaXJlY3Rpb24ocmVjdCwgcCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgaW50IGdldFJvd05lYXIoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBpbnQgciwgaW50IG4sIGludCB4KSB7Ci0gICAgaW50IG1pbiA9IE1hdGgubWluKG4sIHgpLAotICAgICAgbWF4ID0gTWF0aC5tYXgobiwgeCk7Ci0gICAgaWYgKG1pbiA+IHIpIHsKLSAgICAgIG1heCA9IG1pbjsKLSAgICAgIG1pbiA9IHIgLSAobWluIC0gcik7Ci0gICAgfQotICAgIGlmIChtYXggPCByKSB7Ci0gICAgICBtaW4gPSBtYXg7Ci0gICAgICBtYXggPSByICsgKHIgLSBtYXgpOwotICAgIH0KLQotICAgIGludCBwcm94aW1pdHkgPSAwOwotICAgIGludCBkaXJlY3Rpb24gPSAtMTsKLSAgICBpZiAociAlIDIgPT0gMSkKLSAgICAgIHItLTsKLSAgICBJbnRlZ2VyIGk7Ci0gICAgd2hpbGUgKHByb3hpbWl0eSA8IHIpIHsKLSAgICAgIGkgPSBuZXcgSW50ZWdlcihyICsgcHJveGltaXR5ICogZGlyZWN0aW9uKTsKLSAgICAgIGlmICghcm93c1VzZWQuY29udGFpbnNLZXkoaSkpIHsKLSAgICAgICAgcm93c1VzZWQucHV0KGksIGkpOwotICAgICAgICByZXNlcnZlUm93KGNvbm5lY3Rpb24sIGkpOwotICAgICAgICByZXR1cm4gaS5pbnRWYWx1ZSgpOwotICAgICAgfQotICAgICAgaW50IGogPSBpLmludFZhbHVlKCk7Ci0gICAgICBpZiAoaiA8PSBtaW4pCi0gICAgICAgIHJldHVybiBqICsgMjsKLSAgICAgIGlmIChqID49IG1heCkKLSAgICAgICAgcmV0dXJuIGogLSAyOwotICAgICAgaWYgKGRpcmVjdGlvbiA9PSAxKQotICAgICAgICBkaXJlY3Rpb24gPSAtMTsKLSAgICAgIGVsc2UgewotICAgICAgICBkaXJlY3Rpb24gPSAxOwotICAgICAgICBwcm94aW1pdHkgKz0gMjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgUmF5IGdldFN0YXJ0RGlyZWN0aW9uKENvbm5lY3Rpb24gY29ubikgewotICAgIENvbm5lY3Rpb25BbmNob3IgYW5jaG9yID0gY29ubi5nZXRTb3VyY2VBbmNob3IoKTsKLSAgICBQb2ludCBwID0gZ2V0U3RhcnRQb2ludChjb25uKTsKLSAgICBSZWN0YW5nbGUgcmVjdDsKLSAgICBpZiAoYW5jaG9yLmdldE93bmVyKCkgPT0gbnVsbCkKLSAgICAgIHJlY3QgPSBuZXcgUmVjdGFuZ2xlKHAueCAtIDEsIHAueSAtIDEsIDIsIDIpOwotICAgIGVsc2UgewotICAgICAgcmVjdCA9IGNvbm4uZ2V0U291cmNlQW5jaG9yKCkuZ2V0T3duZXIoKS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0gICAgICBjb25uLmdldFNvdXJjZUFuY2hvcigpLmdldE93bmVyKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldERpcmVjdGlvbihyZWN0LCBwKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NQb3NpdGlvbnMoUmF5IHN0YXJ0LCBSYXkgZW5kLCBMaXN0IHBvc2l0aW9ucywgCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaG9yaXpvbnRhbCwgQ29ubmVjdGlvbiBjb25uKSB7Ci0gICAgcmVtb3ZlUmVzZXJ2ZWRMaW5lcyhjb25uKTsKLQotICAgIGludCBwb3NbXSA9IG5ldyBpbnRbcG9zaXRpb25zLnNpemUoKSArIDJdOwotICAgIGlmIChob3Jpem9udGFsKQotICAgICAgcG9zWzBdID0gc3RhcnQueDsKLSAgICBlbHNlCi0gICAgICBwb3NbMF0gPSBzdGFydC55OwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBwb3NpdGlvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIHBvc1tpICsgMV0gPSAoKEludGVnZXIpcG9zaXRpb25zLmdldChpKSkuaW50VmFsdWUoKTsKLSAgICB9Ci0gICAgaWYgKGhvcml6b250YWwgPT0gKHBvc2l0aW9ucy5zaXplKCkgJSAyID09IDEpKQotICAgICAgcG9zWysraV0gPSBlbmQueDsKLSAgICBlbHNlCi0gICAgICBwb3NbKytpXSA9IGVuZC55OwotCi0gICAgUG9pbnRMaXN0IHBvaW50cyA9IG5ldyBQb2ludExpc3QoKTsKLSAgICBwb2ludHMuYWRkUG9pbnQobmV3IFBvaW50KHN0YXJ0LngsIHN0YXJ0LnkpKTsKLSAgICBQb2ludCBwOwotICAgIGludCBjdXJyZW50LCBwcmV2LCBtaW4sIG1heDsKLSAgICBib29sZWFuIGFkanVzdDsKLSAgICBmb3IgKGkgPSAyOyBpIDwgcG9zLmxlbmd0aCAtIDE7IGkrKykgewotICAgICAgaG9yaXpvbnRhbCA9ICFob3Jpem9udGFsOwotICAgICAgcHJldiA9IHBvc1tpIC0gMV07Ci0gICAgICBjdXJyZW50ID0gcG9zW2ldOwotCi0gICAgICBhZGp1c3QgPSAoaSAhPSBwb3MubGVuZ3RoIC0gMik7Ci0gICAgICBpZiAoaG9yaXpvbnRhbCkgewotICAgICAgICBpZiAoYWRqdXN0KSB7Ci0gICAgICAgICAgbWluID0gcG9zW2kgLSAyXTsKLSAgICAgICAgICBtYXggPSBwb3NbaSArIDJdOwotICAgICAgICAgIHBvc1tpXSA9IGN1cnJlbnQgPSBnZXRSb3dOZWFyKGNvbm4sIGN1cnJlbnQsIG1pbiwgbWF4KTsKLSAgICAgICAgfQotICAgICAgICBwID0gbmV3IFBvaW50KHByZXYsIGN1cnJlbnQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGFkanVzdCkgewotICAgICAgICAgIG1pbiA9IHBvc1tpIC0gMl07Ci0gICAgICAgICAgbWF4ID0gcG9zW2kgKyAyXTsKLSAgICAgICAgICBwb3NbaV0gPSBjdXJyZW50ID0gZ2V0Q29sdW1uTmVhcihjb25uLCBjdXJyZW50LCBtaW4sIG1heCk7Ci0gICAgICAgIH0KLSAgICAgICAgcCA9IG5ldyBQb2ludChjdXJyZW50LCBwcmV2KTsKLSAgICAgIH0KLSAgICAgIHBvaW50cy5hZGRQb2ludChwKTsKLSAgICB9Ci0gICAgcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChlbmQueCwgZW5kLnkpKTsKLSAgICBjb25uLnNldFBvaW50cyhwb2ludHMpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25Sb3V0ZXIjcmVtb3ZlKENvbm5lY3Rpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW1vdmUoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0gICAgcmVtb3ZlUmVzZXJ2ZWRMaW5lcyhjb25uZWN0aW9uKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc2VydmVkTGluZXMoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0gICAgUmVzZXJ2ZWRJbmZvIHJJbmZvID0gKFJlc2VydmVkSW5mbykgcmVzZXJ2ZWRJbmZvLmdldChjb25uZWN0aW9uKTsKLSAgICBpZiAockluZm8gPT0gbnVsbCkgCi0gICAgICByZXR1cm47Ci0gICAgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBySW5mby5yZXNlcnZlZFJvd3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgIHJvd3NVc2VkLnJlbW92ZShySW5mby5yZXNlcnZlZFJvd3MuZ2V0KGkpKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBySW5mby5yZXNlcnZlZENvbHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGNvbHNVc2VkLnJlbW92ZShySW5mby5yZXNlcnZlZENvbHMuZ2V0KGkpKTsKLSAgICB9Ci0gICAgcmVzZXJ2ZWRJbmZvLnJlbW92ZShjb25uZWN0aW9uKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlc2VydmVDb2x1bW4oQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBJbnRlZ2VyIGNvbHVtbikgewotICAgIFJlc2VydmVkSW5mbyBpbmZvID0gKFJlc2VydmVkSW5mbykgcmVzZXJ2ZWRJbmZvLmdldChjb25uZWN0aW9uKTsKLSAgICBpZiAoaW5mbyA9PSBudWxsKSB7Ci0gICAgICBpbmZvID0gbmV3IFJlc2VydmVkSW5mbygpOwotICAgICAgcmVzZXJ2ZWRJbmZvLnB1dChjb25uZWN0aW9uLCBpbmZvKTsKLSAgICB9Ci0gICAgaW5mby5yZXNlcnZlZENvbHMuYWRkKGNvbHVtbik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZXNlcnZlUm93KENvbm5lY3Rpb24gY29ubmVjdGlvbiwgSW50ZWdlciByb3cpIHsKLSAgICBSZXNlcnZlZEluZm8gaW5mbyA9IChSZXNlcnZlZEluZm8pIHJlc2VydmVkSW5mby5nZXQoY29ubmVjdGlvbik7Ci0gICAgaWYgKGluZm8gPT0gbnVsbCkgewotICAgICAgaW5mbyA9IG5ldyBSZXNlcnZlZEluZm8oKTsKLSAgICAgIHJlc2VydmVkSW5mby5wdXQoY29ubmVjdGlvbiwgaW5mbyk7Ci0gICAgfQotICAgIGluZm8ucmVzZXJ2ZWRSb3dzLmFkZChyb3cpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25Sb3V0ZXIjcm91dGUoQ29ubmVjdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJvdXRlKENvbm5lY3Rpb24gY29ubikgewotICAgIGlmICgoY29ubi5nZXRTb3VyY2VBbmNob3IoKSA9PSBudWxsKSB8fCAoY29ubi5nZXRUYXJnZXRBbmNob3IoKSA9PSBudWxsKSkgCi0gICAgICByZXR1cm47Ci0gICAgaW50IGk7Ci0gICAgUG9pbnQgc3RhcnRQb2ludCA9IGdldFN0YXJ0UG9pbnQoY29ubik7Ci0gICAgY29ubi50cmFuc2xhdGVUb1JlbGF0aXZlKHN0YXJ0UG9pbnQpOwotICAgIFBvaW50IGVuZFBvaW50ID0gZ2V0RW5kUG9pbnQoY29ubik7Ci0gICAgY29ubi50cmFuc2xhdGVUb1JlbGF0aXZlKGVuZFBvaW50KTsKLQotICAgIFJheSBzdGFydCA9IG5ldyBSYXkoc3RhcnRQb2ludCk7Ci0gICAgUmF5IGVuZCA9IG5ldyBSYXkoZW5kUG9pbnQpOwotICAgIFJheSBhdmVyYWdlID0gbmV3IFJheShzdGFydFBvaW50LnggKyA0LCBzdGFydFBvaW50LnkpOyAvLyBzdGFydC5nZXRBdmVyYWdlZChlbmQpOwotCi0gICAgUmF5IGRpcmVjdGlvbiA9IG5ldyBSYXkoc3RhcnQsIGVuZCk7Ci0gICAgUmF5IHN0YXJ0Tm9ybWFsID0gZ2V0U3RhcnREaXJlY3Rpb24oY29ubik7Ci0gICAgUmF5IGVuZE5vcm1hbCAgID0gZ2V0RW5kRGlyZWN0aW9uKGNvbm4pOwotCi0gICAgTGlzdCBwb3NpdGlvbnMgPSBuZXcgQXJyYXlMaXN0KDUpOwotICAgIGJvb2xlYW4gaG9yaXpvbnRhbCA9IHN0YXJ0Tm9ybWFsLmlzSG9yaXpvbnRhbCgpOwotICAgIGlmIChob3Jpem9udGFsKSAKLSAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIoc3RhcnQueSkpOwotICAgIGVsc2UKLSAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIoc3RhcnQueCkpOwotICAgIGhvcml6b250YWwgPSAhaG9yaXpvbnRhbDsKLQotICAgIGlmIChzdGFydE5vcm1hbC5kb3RQcm9kdWN0KGVuZE5vcm1hbCkgPT0gMCkgewotICAgICAgaWYgKChzdGFydE5vcm1hbC5kb3RQcm9kdWN0KGRpcmVjdGlvbikgPj0gMCkgCi0gICAgICAgICYmIChlbmROb3JtYWwuZG90UHJvZHVjdChkaXJlY3Rpb24pIDw9IDApKSB7Ci0gICAgICAgIC8vIDAKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIDIKLSAgICAgICAgaWYgKHN0YXJ0Tm9ybWFsLmRvdFByb2R1Y3QoZGlyZWN0aW9uKSA8IDApCi0gICAgICAgICAgaSA9IHN0YXJ0Tm9ybWFsLnNpbWlsYXJpdHkoc3RhcnQuZ2V0QWRkZWQoc3RhcnROb3JtYWwuZ2V0U2NhbGVkKDEwKSkpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBpZiAoaG9yaXpvbnRhbCkgCi0gICAgICAgICAgICBpID0gYXZlcmFnZS55OwotICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICBpID0gYXZlcmFnZS54OwotICAgICAgICB9Ci0gICAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIoaSkpOwotICAgICAgICBob3Jpem9udGFsID0gIWhvcml6b250YWw7Ci0KLSAgICAgICAgaWYgKGVuZE5vcm1hbC5kb3RQcm9kdWN0KGRpcmVjdGlvbikgPiAwKQotICAgICAgICAgIGkgPSBlbmROb3JtYWwuc2ltaWxhcml0eShlbmQuZ2V0QWRkZWQoZW5kTm9ybWFsLmdldFNjYWxlZCgxMCkpKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaWYgKGhvcml6b250YWwpIAotICAgICAgICAgICAgaSA9IGF2ZXJhZ2UueTsKLSAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgaSA9IGF2ZXJhZ2UueDsKLSAgICAgICAgfQotICAgICAgICBwb3NpdGlvbnMuYWRkKG5ldyBJbnRlZ2VyKGkpKTsKLSAgICAgICAgaG9yaXpvbnRhbCA9ICFob3Jpem9udGFsOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoc3RhcnROb3JtYWwuZG90UHJvZHVjdChlbmROb3JtYWwpID4gMCkgewotICAgICAgICAvLzEKLSAgICAgICAgaWYgKHN0YXJ0Tm9ybWFsLmRvdFByb2R1Y3QoZGlyZWN0aW9uKSA+PSAwKQotICAgICAgICAgIGkgPSBzdGFydE5vcm1hbC5zaW1pbGFyaXR5KHN0YXJ0LmdldEFkZGVkKHN0YXJ0Tm9ybWFsLmdldFNjYWxlZCgxMCkpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGkgPSBlbmROb3JtYWwuc2ltaWxhcml0eShlbmQuZ2V0QWRkZWQoZW5kTm9ybWFsLmdldFNjYWxlZCgxMCkpKTsKLSAgICAgICAgcG9zaXRpb25zLmFkZChuZXcgSW50ZWdlcihpKSk7Ci0gICAgICAgIGhvcml6b250YWwgPSAhaG9yaXpvbnRhbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vMyBvciAxCi0gICAgICAgIGlmIChzdGFydE5vcm1hbC5kb3RQcm9kdWN0KGRpcmVjdGlvbikgPCAwKSB7Ci0gICAgICAgICAgaSA9IHN0YXJ0Tm9ybWFsLnNpbWlsYXJpdHkoc3RhcnQuZ2V0QWRkZWQoc3RhcnROb3JtYWwuZ2V0U2NhbGVkKDEwKSkpOwotICAgICAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIoaSkpOwotICAgICAgICAgIGhvcml6b250YWwgPSAhaG9yaXpvbnRhbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChob3Jpem9udGFsKSAKLSAgICAgICAgICBpID0gYXZlcmFnZS55OwotICAgICAgICBlbHNlIAotICAgICAgICAgIGkgPSBhdmVyYWdlLng7Ci0gICAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIoaSkpOwotICAgICAgICBob3Jpem9udGFsID0gIWhvcml6b250YWw7Ci0KLSAgICAgICAgaWYgKHN0YXJ0Tm9ybWFsLmRvdFByb2R1Y3QoZGlyZWN0aW9uKSA8IDApIHsKLSAgICAgICAgICBpID0gZW5kTm9ybWFsLnNpbWlsYXJpdHkoZW5kLmdldEFkZGVkKGVuZE5vcm1hbC5nZXRTY2FsZWQoMTApKSk7Ci0gICAgICAgICAgcG9zaXRpb25zLmFkZChuZXcgSW50ZWdlcihpKSk7Ci0gICAgICAgICAgaG9yaXpvbnRhbCA9ICFob3Jpem9udGFsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChob3Jpem9udGFsKSAKLSAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIoZW5kLnkpKTsKLSAgICBlbHNlIAotICAgICAgcG9zaXRpb25zLmFkZChuZXcgSW50ZWdlcihlbmQueCkpOwotICAgIAotICAgIHByb2Nlc3NQb3NpdGlvbnMoc3RhcnQsIGVuZCwgcG9zaXRpb25zLCBzdGFydE5vcm1hbC5pc0hvcml6b250YWwoKSwgY29ubik7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9YU0RTY2hlbWFFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9YU0RTY2hlbWFFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjY5OGJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEU2NoZW1hRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5UZXh0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLkNhdGVnb3J5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFNjaGVtYUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5LZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuSGVhZGluZ0ZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5sYXlvdXRzLkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAotewotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0KLSAgcHJvdGVjdGVkIEZpZ3VyZSBvdXRlciwgY29udGVudEZpZ3VyZTsKLSAgcHJvdGVjdGVkIEhlYWRpbmdGaWd1cmUgaGVhZGluZ0ZpZ3VyZTsKLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gY29udGVudEZpZ3VyZTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBvdXRlciA9IG5ldyBGaWd1cmUoKTsKLSAgICBvdXRlci5zZXRCb3JkZXIobmV3IExpbmVCb3JkZXIoMSkpOwotCi0gICAgRmlsbExheW91dCBmaWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoNCk7Ci0gICAgb3V0ZXIuc2V0TGF5b3V0TWFuYWdlcihmaWxsTGF5b3V0KTsKLQotICAgIGhlYWRpbmdGaWd1cmUgPSBuZXcgSGVhZGluZ0ZpZ3VyZSgpOwotICAgIG91dGVyLmFkZChoZWFkaW5nRmlndXJlKTsKLQotICAgIFJlY3RhbmdsZUZpZ3VyZSBsaW5lID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpCi0gICAgewotICAgICAgcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCB3SGludCwgaW50IGhIaW50KQotICAgICAgewotICAgICAgICBEaW1lbnNpb24gZCA9IHN1cGVyLmdldFByZWZlcnJlZFNpemUod0hpbnQsIGhIaW50KTsKLSAgICAgICAgZC5oZWlnaHQgPSAxOwotICAgICAgICByZXR1cm4gZDsKLSAgICAgIH0KLSAgICB9OwotICAgIFRvb2xiYXJMYXlvdXQgbGluZUxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KGZhbHNlKTsKLSAgICBsaW5lTGF5b3V0LnNldFZlcnRpY2FsKHRydWUpOwotICAgIGxpbmVMYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyh0cnVlKTsKLSAgICBsaW5lLnNldExheW91dE1hbmFnZXIobGluZUxheW91dCk7Ci0gICAgb3V0ZXIuYWRkKGxpbmUpOwotCi0gICAgY29udGVudEZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBjb250ZW50RmlndXJlLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDQpKTsKLSAgICBmaWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoNCk7Ci0gICAgY29udGVudEZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKGZpbGxMYXlvdXQpOwotCi0gICAgb3V0ZXIuYWRkKGNvbnRlbnRGaWd1cmUpOwotICAgIHJldHVybiBvdXRlcjsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0gICAgWFNEU2NoZW1hQWRhcHRlciBzY2hlbWFBZGFwdGVyID0gKFhTRFNjaGVtYUFkYXB0ZXIpIGdldE1vZGVsKCk7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0vLyBCdWcgMTAzODcwOiB1bmRvIGJsYW5rcyBvdXQgc2NoZW1hIHZpZXcgICAgCi0vLyAgICBzY2hlbWFBZGFwdGVyLnVwZGF0ZUNhdGVnb3JpZXMoKTsKLQotICAgIExpc3QgdGVtcGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgdGVtcGxpc3QuYWRkKHNjaGVtYUFkYXB0ZXIuZ2V0Q2F0ZWdvcnkoQ2F0ZWdvcnlBZGFwdGVyLkRJUkVDVElWRVMpKTsKLSAgICBIb2xkZXIgaG9sZGVyID0gbmV3IEhvbGRlcih0ZW1wbGlzdCk7Ci0gICAgbGlzdC5hZGQoaG9sZGVyKTsKLQotICAgIHRlbXBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHRlbXBsaXN0LmFkZChzY2hlbWFBZGFwdGVyLmdldENhdGVnb3J5KENhdGVnb3J5QWRhcHRlci5FTEVNRU5UUykpOwotICAgIHRlbXBsaXN0LmFkZChzY2hlbWFBZGFwdGVyLmdldENhdGVnb3J5KENhdGVnb3J5QWRhcHRlci5UWVBFUykpOwotICAgIGhvbGRlciA9IG5ldyBIb2xkZXIodGVtcGxpc3QpOwotICAgIGxpc3QuYWRkKGhvbGRlcik7Ci0KLSAgICB0ZW1wbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB0ZW1wbGlzdC5hZGQoc2NoZW1hQWRhcHRlci5nZXRDYXRlZ29yeShDYXRlZ29yeUFkYXB0ZXIuQVRUUklCVVRFUykpOwotICAgIHRlbXBsaXN0LmFkZChzY2hlbWFBZGFwdGVyLmdldENhdGVnb3J5KENhdGVnb3J5QWRhcHRlci5HUk9VUFMpKTsKLSAgICBob2xkZXIgPSBuZXcgSG9sZGVyKHRlbXBsaXN0KTsKLSAgICBsaXN0LmFkZChob2xkZXIpOwotCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlQ2hpbGQoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgQ2F0ZWdvcnlSb3dFZGl0UGFydCByZXN1bHQgPSBuZXcgQ2F0ZWdvcnlSb3dFZGl0UGFydCgpOwotICAgIHJlc3VsdC5zZXRNb2RlbChtb2RlbCk7Ci0gICAgcmVzdWx0LnNldFBhcmVudCh0aGlzKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgICAKLSAgICBMaW5lQm9yZGVyIGJvcmRlciA9IChMaW5lQm9yZGVyKSBvdXRlci5nZXRCb3JkZXIoKTsKLSAgICBib3JkZXIuc2V0V2lkdGgoaXNTZWxlY3RlZCA/IDIgOiAxKTsKLSAgICBoZWFkaW5nRmlndXJlLnNldFNlbGVjdGVkKGlzU2VsZWN0ZWQpOwotCi0gICAgWFNEU2NoZW1hQWRhcHRlciBzY2hlbWFBZGFwdGVyID0gKFhTRFNjaGVtYUFkYXB0ZXIpIGdldE1vZGVsKCk7Ci0gICAgSW1hZ2UgaW1hZ2UgPSBzY2hlbWFBZGFwdGVyLmdldEltYWdlKCk7Ci0gICAgaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpLnNldEljb24oaW1hZ2UpOwotICAgIGlmIChpbWFnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGhlYWRpbmdGaWd1cmUuZ2V0TGFiZWwoKS5zZXRJY29uKFhTRENvbW1vblVJVXRpbHMuZ2V0VXBkYXRlZEltYWdlKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgc2NoZW1hQWRhcHRlci5nZXRUYXJnZXQoKSwgaW1hZ2UsIGZhbHNlKSk7Ci0gICAgfQotICAgIG91dGVyLnJlcGFpbnQoKTsKLSAgICAKLSAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlVmFsdWUgPSAoKFhTRFNjaGVtYSkgKChYU0RTY2hlbWFBZGFwdGVyKSBnZXRNb2RlbCgpKS5nZXRUYXJnZXQoKSkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgdGFyZ2V0TmFtZXNwYWNlVmFsdWUgPSBUZXh0UHJvY2Vzc29yLnByb2Nlc3ModGFyZ2V0TmFtZXNwYWNlVmFsdWUpOwotCi0gICAgaWYgKHRhcmdldE5hbWVzcGFjZVZhbHVlID09IG51bGwgfHwgdGFyZ2V0TmFtZXNwYWNlVmFsdWUubGVuZ3RoKCkgPT0gMCkKLSAgICB7Ci0gICAgICB0YXJnZXROYW1lc3BhY2VWYWx1ZSA9IE1lc3NhZ2VzLl9VSV9HUkFQSF9YU0RTQ0hFTUFfTk9fTkFNRVNQQUNFOwotICAgIH0KLSAgICBoZWFkaW5nRmlndXJlLmdldExhYmVsKCkuc2V0VGV4dChNZXNzYWdlcy5fVUlfR1JBUEhfWFNEU0NIRU1BICsgIiA6ICIgKyB0YXJnZXROYW1lc3BhY2VWYWx1ZSk7ICAvLyROT04tTkxTLTEkCi0gIH0KLSAgCi0gIHB1YmxpYyBFZGl0UGFydCBkb0dldFJlbGF0aXZlRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQsIGludCBkaXJlY3Rpb24pCi0gIHsKLSAgICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDYXRlZ29yeUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IChDYXRlZ29yeUFkYXB0ZXIpZWRpdFBhcnQuZ2V0TW9kZWwoKTsgICAgCi0gICAgICAgIHN3aXRjaCAoYWRhcHRlci5nZXRHcm91cFR5cGUoKSkKLSAgICAgICAgeyAKLSAgICAgICAgICBjYXNlIENhdGVnb3J5QWRhcHRlci5ESVJFQ1RJVkVTOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuU09VVEgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGdldENhdGVnb3J5RWRpdFBhcnQoQ2F0ZWdvcnlBZGFwdGVyLkVMRU1FTlRTKTsKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgQ2F0ZWdvcnlBZGFwdGVyLkVMRU1FTlRTOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuU09VVEgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGdldENhdGVnb3J5RWRpdFBhcnQoQ2F0ZWdvcnlBZGFwdGVyLkFUVFJJQlVURVMpOwotICAgICAgICAgICAgfSAgICAgICAgICAgCi0gICAgICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGdldENhdGVnb3J5RWRpdFBhcnQoQ2F0ZWdvcnlBZGFwdGVyLkRJUkVDVElWRVMpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIENhdGVnb3J5QWRhcHRlci5UWVBFUzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBnZXRDYXRlZ29yeUVkaXRQYXJ0KENhdGVnb3J5QWRhcHRlci5HUk9VUFMpOwotICAgICAgICAgICAgfSAgICAgICAgICAgCi0gICAgICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGdldENhdGVnb3J5RWRpdFBhcnQoQ2F0ZWdvcnlBZGFwdGVyLkRJUkVDVElWRVMpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgQ2F0ZWdvcnlBZGFwdGVyLkFUVFJJQlVURVM6ICAgICAgCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0Q2F0ZWdvcnlFZGl0UGFydChDYXRlZ29yeUFkYXB0ZXIuRUxFTUVOVFMpOwotICAgICAgICAgICAgfSAgICAKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gICAKLSAgICAgICAgICBjYXNlIENhdGVnb3J5QWRhcHRlci5HUk9VUFM6ICAgICAgCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0Q2F0ZWdvcnlFZGl0UGFydChDYXRlZ29yeUFkYXB0ZXIuVFlQRVMpOwotICAgICAgICAgICAgfSAgICAKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9IAotICAgICAgZWxzZSBpZiAoZWRpdFBhcnQgPT0gdGhpcykKLSAgICAgIHsgICAgICAgCi0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeS5JTl9UT19GSVJTVF9DSElMRCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9ICgoQ2F0ZWdvcnlSb3dFZGl0UGFydClnZXRDaGlsZHJlbigpLmdldCgwKSkuZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KGVkaXRQYXJ0LCBkaXJlY3Rpb24pOyAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAgCi0gICAgICB9ICAKLSAgICAgIHJldHVybiByZXN1bHQ7ICAgICAgICAgICAgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBFZGl0UGFydCBnZXRDYXRlZ29yeUVkaXRQYXJ0KGludCBraW5kKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBqID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKSAgICAgIAotICAgIHsgICAgCi0gICAgICBFZGl0UGFydCByb3cgPSAoRWRpdFBhcnQpai5uZXh0KCk7ICAgIAotICAgICAgZm9yIChJdGVyYXRvciBpID0gcm93LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpaS5uZXh0KCk7Ci0gICAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENhdGVnb3J5RWRpdFBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICBDYXRlZ29yeUVkaXRQYXJ0IGNhdGVnb3J5RWRpdFBhcnQgPSAoQ2F0ZWdvcnlFZGl0UGFydCllZGl0UGFydDsKLSAgICAgICAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IChDYXRlZ29yeUFkYXB0ZXIpY2F0ZWdvcnlFZGl0UGFydC5nZXRNb2RlbCgpOwotICAgICAgICAgIGlmIChhZGFwdGVyLmdldEdyb3VwVHlwZSgpID09IGtpbmQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGVkaXRQYXJ0OwotICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9ICAKLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbmV3IFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCgpKTsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZGVyVGV4dCgpCi0gIHsKLQkgIHJldHVybiBoZWFkaW5nRmlndXJlLmdldExhYmVsKCkuZ2V0U3ViU3RyaW5nVGV4dCgpOwotICB9Ci0KLQotICBwcm90ZWN0ZWQgY2xhc3MgSG9sZGVyCi0gIHsKLSAgICBMaXN0IGxpc3Q7Ci0KLSAgICBwdWJsaWMgSG9sZGVyKExpc3QgbGlzdCkKLSAgICB7Ci0gICAgICB0aGlzLmxpc3QgPSBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldExpc3QoKQotICAgIHsKLSAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBDYXRlZ29yeVJvd0VkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0Ci0gIHsKLSAgICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHNjaGVtYTsKLSAgICBwcm90ZWN0ZWQgRmlndXJlIGNvbnRlbnRQYW5lOwotCi0gICAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgICB7Ci0gICAgICBGaWd1cmUgY29udGFpbmVyRmlndXJlID0gbmV3IEZpZ3VyZSgpOwotICAgICAgY29udGFpbmVyRmlndXJlLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDQsIDQsIDQsIDQpKTsKLSAgICAgIC8vIGNvbnRhaW5lckZpZ3VyZS5zZXRCb3JkZXIobmV3IExpbmVCb3JkZXIoMSkpOwotICAgICAgLy8gY29udGFpbmVyRmlndXJlLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ncmVlbik7Ci0KLSAgICAgIEZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KDQpOwotICAgICAgZmlsbExheW91dC5zZXRIb3Jpem9udGFsKHRydWUpOwotICAgICAgY29udGFpbmVyRmlndXJlLnNldExheW91dE1hbmFnZXIoZmlsbExheW91dCk7Ci0gICAgICAKLSAgICAgIHJldHVybiBjb250YWluZXJGaWd1cmU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBFZGl0UGFydCBkb0dldFJlbGF0aXZlRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQsIGludCBkaXJlY3Rpb24pCi0gICAgewotICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ2F0ZWdvcnlFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5Lk9VVF9UT19QQVJFTlQpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCk7Ci0gICAgICAgIH0gIAotICAgICAgfSAgCi0gICAgICBlbHNlIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFhTRFNjaGVtYUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBpZiAoZGlyZWN0aW9uID09IEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuSU5fVE9fRklSU1RfQ0hJTEQpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gKEVkaXRQYXJ0KWdldENoaWxkcmVuKCkuZ2V0KDApOwotICAgICAgICB9ICAKLSAgICAgIH0gIAotICAgICAgcmV0dXJuICgoWFNEU2NoZW1hRWRpdFBhcnQpZ2V0UGFyZW50KCkpLmRvR2V0UmVsYXRpdmVFZGl0UGFydChlZGl0UGFydCwgZGlyZWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCNnZXRDb250ZW50UGFuZSgpCi0gICAgICovCi0gICAgcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICAgIHsKLSAgICAgIHJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgIEhvbGRlciBob2xkZXIgPSAoSG9sZGVyKSBnZXRNb2RlbCgpOwotICAgICAgcmV0dXJuIGhvbGRlci5nZXRMaXN0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgICB7Ci0gICAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RhYmxlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEU2ltcGxlVHlwZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTRFNpbXBsZVR5cGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjViODc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEU2ltcGxlVHlwZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFuaGF0dGFuQ29ubmVjdGlvblJvdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuTG9jYXRpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VUeXBlQ29ubmVjdGluZ0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQ29sdW1uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5UeXBlUmVmZXJlbmNlQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSVN0cnVjdHVyZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5IZWFkaW5nRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuUm91bmRlZExpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5TdHJ1Y3R1cmVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgWFNEU2ltcGxlVHlwZUVkaXRQYXJ0IGV4dGVuZHMgQmFzZVR5cGVDb25uZWN0aW5nRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIFN0cnVjdHVyZUZpZ3VyZSBmaWd1cmU7Ci0gIHByb3RlY3RlZCBBRFREaXJlY3RFZGl0UG9saWN5IGFkdERpcmVjdEVkaXRQb2xpY3kgPSBuZXcgQURURGlyZWN0RWRpdFBvbGljeSgpOwotICAKLSAgcHVibGljIFhTRFNpbXBsZVR5cGVFZGl0UGFydCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwdWJsaWMgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gZ2V0WFNEU2ltcGxlVHlwZURlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuIChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcilnZXRNb2RlbCgpKS5nZXRUYXJnZXQoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBmaWd1cmUgPSBuZXcgU3RydWN0dXJlRmlndXJlKCk7Ci0gICAgZmlndXJlLnNldEJvcmRlcihuZXcgUm91bmRlZExpbmVCb3JkZXIoMSwgMTApKTsgICAgCi0gICAgVG9vbGJhckxheW91dCB0b29sYmFyTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoKTsKLSAgICB0b29sYmFyTGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgZmlndXJlLnNldExheW91dE1hbmFnZXIodG9vbGJhckxheW91dCk7Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyKWdldE1vZGVsKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBhZGFwdGVyLmdldERpc3BsYXlOYW1lKCk7Ci0gICAgSGVhZGluZ0ZpZ3VyZSBoZWFkaW5nRmlndXJlID0gZmlndXJlLmdldEhlYWRpbmdGaWd1cmUoKTsKLSAgICBoZWFkaW5nRmlndXJlLnNldElzUmVhZE9ubHkoYWRhcHRlci5pc1JlYWRPbmx5KCkpOwotICAgIExhYmVsIGxhYmVsID0gaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpOwotICAgIGxhYmVsLnNldFRleHQobmFtZSk7Ci0gICAgbGFiZWwuc2V0SWNvbihYU0RDb21tb25VSVV0aWxzLmdldFVwZGF0ZWRJbWFnZShhZGFwdGVyLmdldFhTRFR5cGVEZWZpbml0aW9uKCksIGFkYXB0ZXIuZ2V0SW1hZ2UoKSwgYWRhcHRlci5pc1JlYWRPbmx5KCkpKTsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJU3RydWN0dXJlRmlndXJlIGdldFN0cnVjdHVyZUZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gKElTdHJ1Y3R1cmVGaWd1cmUpZ2V0RmlndXJlKCk7Ci0gIH0KLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0U3RydWN0dXJlRmlndXJlKCkuZ2V0Q29udGVudFBhbmUoKTsKLSAgfQotICAKLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBuZXcgQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5KCkpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwgYWR0RGlyZWN0RWRpdFBvbGljeSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsKLSAgICBnZXRTdHJ1Y3R1cmVGaWd1cmUoKS5hZGRTZWxlY3Rpb25GZWVkYmFjaygpOwotICAgIHN1cGVyLmFkZEZlZWRiYWNrKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkKLSAgewotICAgIGdldFN0cnVjdHVyZUZpZ3VyZSgpLnJlbW92ZVNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0gICAgc3VwZXIucmVtb3ZlRmVlZGJhY2soKTsgICAgCi0gIH0KLQotICBwdWJsaWMgUmVmZXJlbmNlQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKEJhc2VFZGl0UGFydCBjaGlsZCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKCkKLSAgewotICAgIFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uIGNvbm5lY3Rpb25GaWd1cmUgPSBudWxsOwotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcilnZXRNb2RlbCgpOwotICAgIElUeXBlIHN1cGVyVHlwZSA9IGFkYXB0ZXIuZ2V0U3VwZXJUeXBlKCk7Ci0KLSAgICBpZiAoc3VwZXJUeXBlICE9IG51bGwpCi0gICAgeyAgICAgIAotICAgICAgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCByZWZlcmVuY2VUeXBlUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KWdldFRhcmdldEVkaXRQYXJ0KHN1cGVyVHlwZSk7Ci0gICAgICAKLSAgICAgIGlmIChyZWZlcmVuY2VUeXBlUGFydCAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb25uZWN0aW9uRmlndXJlID0gbmV3IFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uKHRydWUpOwotICAgICAgICAvLyBkcmF3IGEgbGluZSBvdXQgZnJvbSB0aGUgdG9wICAgICAgICAgCi0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0U291cmNlQW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5UT1AsIDEpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRPRE8gKGNzKSBuZWVkIHRvIGRyYXcgdGhlIHRhcmdldCBhbmNob3IgdG8gbG9vayBsaWtlIGEgVU1MIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcAotICAgICAgICAvLyBhZGRpbmcgYSBsYWJlbCB0byB0aGUgY29ubmVjdGlvbiB3b3VsZCBoZWxwIHRvCi0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0VGFyZ2V0QW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IocmVmZXJlbmNlVHlwZVBhcnQuZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5CT1RUT00sIDAsIDApKTsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRDb25uZWN0aW9uUm91dGVyKG5ldyBNYW5oYXR0YW5Db25uZWN0aW9uUm91dGVyKCkpOwotICAgICAgICAoKENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvciljb25uZWN0aW9uRmlndXJlLmdldFNvdXJjZUFuY2hvcigpKS5zZXRPdGhlcigoQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKWNvbm5lY3Rpb25GaWd1cmUuZ2V0VGFyZ2V0QW5jaG9yKCkpOwotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldEhpZ2hsaWdodChmYWxzZSk7Ci0KLSAgICAgIH0KLSAgICB9ICAgIAotICAgIHJldHVybiBjb25uZWN0aW9uRmlndXJlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgRWRpdFBhcnQgZ2V0VGFyZ2V0RWRpdFBhcnQoSVR5cGUgdHlwZSkKLSAgewotICAgIENvbHVtbkVkaXRQYXJ0IGNvbHVtbkVkaXRQYXJ0ID0gbnVsbDsKLSAgICBmb3IgKEVkaXRQYXJ0IGVkaXRQYXJ0ID0gdGhpczsgZWRpdFBhcnQgIT0gbnVsbDsgZWRpdFBhcnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKSkKLSAgICB7Ci0gICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb2x1bW5FZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgY29sdW1uRWRpdFBhcnQgPSAoQ29sdW1uRWRpdFBhcnQpZWRpdFBhcnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgCi0gICAgfSAgICAgCi0gICAgaWYgKGNvbHVtbkVkaXRQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gY29sdW1uRWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBFZGl0UGFydCBjaGlsZCA9IChFZGl0UGFydClpLm5leHQoKTsKLSAgICAgICAgaWYgKGNoaWxkLmdldE1vZGVsKCkgPT0gdHlwZSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBjaGlsZDsKLSAgICAgICAgfSAgICAgICAgIAotICAgICAgfSAgCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KQotICB7ICAKLSAgICBpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfT1BFTikKLSAgICB7Ci0gICAgICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpCi0gICAgICB7Ci0gICAgICAgIExvY2F0aW9uUmVxdWVzdCBsb2NhdGlvblJlcXVlc3QgPSAoTG9jYXRpb25SZXF1ZXN0KXJlcXVlc3Q7Ci0gICAgICAgIFBvaW50IHAgPSBsb2NhdGlvblJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgIAotICAgICAgICBpZiAoZ2V0U3RydWN0dXJlRmlndXJlKCkuaGl0VGVzdEhlYWRlcihwKSkKLSAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICAvLyBUT0RPOiAhISEgVGhpcyBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIGFkdC14c2QgcGFja2FnZQotICAgICAgICAgIC8vIAotICAgICAgICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcikgICAgIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlciltb2RlbDsKLSAgICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgICAgT2JqZWN0IHNjaGVtYSA9IGVkaXRvclBhcnQuZ2V0QWRhcHRlcihYU0RTY2hlbWEuY2xhc3MpOwotICAgICAgICAgICAgQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRFZGl0b3JBY3Rpb25SZWdpc3RyeShlZGl0b3JQYXJ0KTsKLSAgICAgICAgICAgIGlmIChyZWdpc3RyeSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoc2NoZW1hID09IHN0LmdldFNjaGVtYSgpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSUFjdGlvbiBhY3Rpb24gPSByZWdpc3RyeS5nZXRBY3Rpb24oU2V0SW5wdXRUb0dyYXBoVmlldy5JRCk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElBY3Rpb24gYWN0aW9uID0gcmVnaXN0cnkuZ2V0QWN0aW9uKE9wZW5Jbk5ld0VkaXRvci5JRCk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIEFjdGlvblJlZ2lzdHJ5IGdldEVkaXRvckFjdGlvblJlZ2lzdHJ5KElFZGl0b3JQYXJ0IGVkaXRvcikKLSAgewotICAgIHJldHVybiAoQWN0aW9uUmVnaXN0cnkpIGVkaXRvci5nZXRBZGFwdGVyKEFjdGlvblJlZ2lzdHJ5LmNsYXNzKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3VsZERyYXdDb25uZWN0aW9uKCkKLSAgewotICAgIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgSVR5cGUpCi0gICAgewotICAgICAgaWYgKCgoSVR5cGUpZ2V0TW9kZWwoKSkuZ2V0U3VwZXJUeXBlKCkgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZGVyVGV4dCgpCi0gIHsKLQkgIEhlYWRpbmdGaWd1cmUgaGVhZGluZ0ZpZ3VyZSA9IGZpZ3VyZS5nZXRIZWFkaW5nRmlndXJlKCk7Ci0JICByZXR1cm4gaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpLmdldFRleHQoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1NwYWNlRmlsbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1NwYWNlRmlsbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYWI3OWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9TcGFjZUZpbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIER1bW15IGNsYXNzIHRvIGFkZCBzcGFjZSB0byBmaWVsZCBsaXN0Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgU3BhY2VGaWxsZXIgaW1wbGVtZW50cyBJRmllbGQKLXsKLSAgU3RyaW5nIGtpbmQ7Ci0gIHB1YmxpYyBTcGFjZUZpbGxlcihTdHJpbmcga2luZCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBpZiAoa2luZC5lcXVhbHMoImF0dHJpYnV0ZSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEQXR0cmlidXRlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RFbGVtZW50LmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEtpbmQoKQotICB7Ci0gICAgcmV0dXJuIGtpbmQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEtpbmQoU3RyaW5nIGtpbmQpCi0gIHsKLSAgICB0aGlzLmtpbmQgPSBraW5kOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgSUNvbXBsZXhUeXBlIGdldENvbnRhaW5lclR5cGUoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lUXVhbGlmaWVyKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBJVHlwZSBnZXRUeXBlKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TWluT2NjdXJzKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXJzKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQoaW50IG1pbk9jY3VycykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU1heE9jY3Vyc0NvbW1hbmQoaW50IG1heE9jY3VycykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZVR5cGVOYW1lQ29tbWFuZChTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBxdWFpbGlmaWVyKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTmFtZUNvbW1hbmQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgdW5yZWdpc3Rlckxpc3RlbmVyKElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2UoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1RhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2VhZTVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyIGltcGxlbWVudHMgSUFEVE9iamVjdAotewotICBwcml2YXRlIFhTREJhc2VBZGFwdGVyIGFkYXB0ZXI7Ci0gIAotICBwdWJsaWMgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyKFhTREJhc2VBZGFwdGVyIGFkYXB0ZXIpCi0gIHsKLSAgICB0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIFhTREJhc2VBZGFwdGVyIGdldEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIGFkYXB0ZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWdpc3Rlckxpc3RlbmVyKElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgdW5yZWdpc3Rlckxpc3RlbmVyKElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cG9saWNpZXMvRHJhZ0FuZERyb3BFZGl0UG9saWN5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL0RyYWdBbmREcm9wRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDJlM2Y2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cG9saWNpZXMvRHJhZ0FuZERyb3BFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZUNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBdHRyaWJ1dGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLkJhc2VEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5YU0RBdHRyaWJ1dGVEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5YU0RFbGVtZW50RHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5YU0RCYXNlRmllbGRFZGl0UGFydDsKLQotCi1wdWJsaWMgY2xhc3MgRHJhZ0FuZERyb3BFZGl0UG9saWN5IGV4dGVuZHMgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5HcmFwaGljYWxFZGl0UG9saWN5Ci17IAotICBwcm90ZWN0ZWQgRWRpdFBhcnRWaWV3ZXIgdmlld2VyOwotICBwcm90ZWN0ZWQgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotCi0gIHB1YmxpYyBEcmFnQW5kRHJvcEVkaXRQb2xpY3koRWRpdFBhcnRWaWV3ZXIgdmlld2VyLCBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kpCi0gIHsKLSAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgICB0aGlzLnNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5ID0gc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3k7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXEpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIAotICBwdWJsaWMgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsgICAgICAgICAgICAgCi0gICAgQmFzZURyYWdBbmREcm9wQ29tbWFuZCBjb21tYW5kID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBDaGFuZ2VCb3VuZHNSZXF1ZXN0KQotICAgIHsKLSAgICAgIENoYW5nZUJvdW5kc1JlcXVlc3QgY2hhbmdlQm91bmRzUmVxdWVzdCA9IChDaGFuZ2VCb3VuZHNSZXF1ZXN0KXJlcXVlc3Q7Ci0gICAgICBQb2ludCBsb2NhdGlvbiA9IGNoYW5nZUJvdW5kc1JlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLSAgICAgIAotICAgICAgR3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KXZpZXdlci5maW5kT2JqZWN0QXQobG9jYXRpb24pOwotICAgICAgbG9jYXRpb24gPSBnZXRQb2ludGVyTG9jYXRpb24oY2hhbmdlQm91bmRzUmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLSAgICAgICgoR3JhcGhpY2FsRWRpdFBhcnQpdmlld2VyLmdldFJvb3RFZGl0UGFydCgpKS5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvY2F0aW9uKTsKLQotICAgICAgTGlzdCBsaXN0ID0gY2hhbmdlQm91bmRzUmVxdWVzdC5nZXRFZGl0UGFydHMoKTsKLSAgICAgIC8vIGFsbG93IGRyYWcgYW5kIGRyb3Agb2Ygb25seSBvbmUgc2VsZWN0ZWQgb2JqZWN0Ci0gICAgICBpZiAobGlzdC5zaXplKCkgPT0gMSkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGl0ZW1Ub0RyYWcgPSBsaXN0LmdldCgwKTsKLSAgICAgICAgaWYgKGl0ZW1Ub0RyYWcgaW5zdGFuY2VvZiBYU0RCYXNlRmllbGRFZGl0UGFydCkKLSAgICAgICAgewotICAgICAgICAgIFhTREJhc2VGaWVsZEVkaXRQYXJ0IHNlbGVjdGVkID0gKFhTREJhc2VGaWVsZEVkaXRQYXJ0KSBpdGVtVG9EcmFnOwotICAgICAgICAgIGlmIChzZWxlY3RlZC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb21tYW5kID0gbmV3IFhTREVsZW1lbnREcmFnQW5kRHJvcENvbW1hbmQodmlld2VyLCAoQ2hhbmdlQm91bmRzUmVxdWVzdClyZXF1ZXN0LCB0YXJnZXQsIHNlbGVjdGVkLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeS5zZXREcmFnQW5kRHJvcENvbW1hbmQoY29tbWFuZCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHNlbGVjdGVkLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RCYXNlQXR0cmlidXRlQWRhcHRlcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb21tYW5kID0gbmV3IFhTREF0dHJpYnV0ZURyYWdBbmREcm9wQ29tbWFuZCh2aWV3ZXIsIChDaGFuZ2VCb3VuZHNSZXF1ZXN0KXJlcXVlc3QsIHRhcmdldCwgc2VsZWN0ZWQsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5LnNldERyYWdBbmREcm9wQ29tbWFuZChjb21tYW5kKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IAotICAgIHJldHVybiBjb21tYW5kOyAgICAgICAgICAgICAKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgCi0gIHByb3RlY3RlZCBQb2ludCBnZXRQb2ludGVyTG9jYXRpb24oUG9pbnQgb3JpZ1BvaW50ZXJMb2NhdGlvbikKLSAgewotICAgICBQb2ludCBjb21wZW5zYXRlZExvY2F0aW9uID0gb3JpZ1BvaW50ZXJMb2NhdGlvbjsKLSAgICAgRmlndXJlQ2FudmFzIGZpZ3VyZUNhbnZhcyA9IChGaWd1cmVDYW52YXMpIHZpZXdlci5nZXRDb250cm9sKCk7Ci0gICAgIGludCB5T2Zmc2V0ID0gZmlndXJlQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0VmVydGljYWxSYW5nZU1vZGVsKCkuZ2V0VmFsdWUoKTsKLSAgICAgaW50IHhPZmZzZXQgPSBmaWd1cmVDYW52YXMuZ2V0Vmlld3BvcnQoKS5nZXRIb3Jpem9udGFsUmFuZ2VNb2RlbCgpLmdldFZhbHVlKCk7Ci0gICAgIGNvbXBlbnNhdGVkTG9jYXRpb24ueSA9IGNvbXBlbnNhdGVkTG9jYXRpb24ueSArIHlPZmZzZXQ7Ci0gICAgIGNvbXBlbnNhdGVkTG9jYXRpb24ueCA9IGNvbXBlbnNhdGVkTG9jYXRpb24ueCArIHhPZmZzZXQ7Ci0gICAgIHJldHVybiBjb21wZW5zYXRlZExvY2F0aW9uOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL0dyYXBoTm9kZURyYWdUcmFja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL0dyYXBoTm9kZURyYWdUcmFja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YjIyOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9HcmFwaE5vZGVEcmFnVHJhY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cG9saWNpZXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EcmFnRWRpdFBhcnRzVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VFZGl0UGFydDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLXB1YmxpYyBjbGFzcyBHcmFwaE5vZGVEcmFnVHJhY2tlciBleHRlbmRzIERyYWdFZGl0UGFydHNUcmFja2VyIAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGVkaXRQYXJ0OyAKLSAgICAgICAgICAgCi0gIHB1YmxpYyBHcmFwaE5vZGVEcmFnVHJhY2tlcihFZGl0UGFydCBlZGl0UGFydCkKLSAgewotICAgIHN1cGVyKGVkaXRQYXJ0KTsKLSAgICB0aGlzLmVkaXRQYXJ0ID0gZWRpdFBhcnQ7Ci0gIH0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBDb21tYW5kIGdldENvbW1hbmQoKSAKLSAgeyAKLQkgIFJlcXVlc3QgcmVxdWVzdCA9IGdldFRhcmdldFJlcXVlc3QoKTsKLSAgICByZXR1cm4gZWRpdFBhcnQuZ2V0Q29tbWFuZChyZXF1ZXN0KTsgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1TZWxlY3Rpb24oKQotICB7Ci0gICAgcGVyZm9ybUFkZGl0aW9uYWxTZWxlY3Rpb24oKTsKLSAgICBzdXBlci5wZXJmb3JtU2VsZWN0aW9uKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BZGRpdGlvbmFsU2VsZWN0aW9uKCkKLSAgewotICAgIEVkaXRQYXJ0Vmlld2VyIHZpZXdlciA9IGdldEN1cnJlbnRWaWV3ZXIoKTsKLSAgICAvLyBUaGlzIGNvZGUgc2VsZWN0cyB0aGUgZmllbGRzIGluLWJldHdlZW4gdGhlIGxhc3Qgc2VsZWN0ZWQgZmllbGQgYW5kIHRoZSBuZXdseQotICAgIC8vIHNlbGVjdGVkIGZpZWxkLCBpZiB0aGUgc2hpZnQga2V5IGlzIGhlbGQgZG93bi4gIE5vdGUgdGhhdCB0aGUgc2VsZWN0aW9uIGxvZ2ljCi0gICAgLy8gY2FuIGJlIGltcHJvdmVkIHNvIHRoYXQgYWxyZWFkeSBzZWxlY3RlZCBidXQsIGEpIGluY29tcGF0aWJsZSBlZGl0IHBhcnQgZmlndXJlcywgb3IgYikKLSAgICAvLyBsaWtlLWVkaXQgcGFydCBmaWd1cmVzIGZyb20gb3RoZXIgcGFyZW50cywgc2hvdWxkIGJlIHVuc2VsZWN0ZWQuCi0gICAgaWYgKGdldEN1cnJlbnRJbnB1dCgpLmlzU2hpZnRLZXlEb3duKCkpCi0gICAgewotICAgICAgLy8gVGhpcyBsaXN0IGNvbnRhaW5zIHRoZSBmaWVsZHMKLSAgICAgIExpc3QgbGlzdCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpLmdldENoaWxkcmVuKCk7Ci0gICAgICAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbgotICAgICAgaW50IGN1cnJlbnRJbmRleCA9IGxpc3QuaW5kZXhPZihlZGl0UGFydCk7Ci0gICAgICAvLyBMaXN0IG9mIGFsbCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVkaXQgcGFydHMKLSAgICAgIExpc3QgY3VycmVudFNlbGVjdGVkID0gdmlld2VyLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0gICAgICBpbnQgc2l6ZSA9IGN1cnJlbnRTZWxlY3RlZC5zaXplKCk7Ci0gICAgICBpZiAoc2l6ZSA+IDApCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBsYXN0U2VsZWN0ZWQgPSBjdXJyZW50U2VsZWN0ZWQuZ2V0KHNpemUgLSAxKTsKLSAgICAgICAgaWYgKGxhc3RTZWxlY3RlZCBpbnN0YW5jZW9mIEJhc2VFZGl0UGFydCkKLSAgICAgICAgewotICAgICAgICAgIC8vIEhlcmUsIHdlIGRldGVybWluZSB0aGUgdXBwZXIgYW5kIGxvd2VyIGxpbWl0IG9mIHRoZSBpbmRpY2VzCi0gICAgICAgICAgaW50IGxvd2VySW5kZXggPSAtMSwgdXBwZXJJbmRleCA9IC0xOwotICAgICAgICAgIGludCBsYXN0U2VsZWN0ZWRJbmRleCA9IGxpc3QuaW5kZXhPZihsYXN0U2VsZWN0ZWQpOwotICAgICAgICAgIGlmIChsYXN0U2VsZWN0ZWRJbmRleCA+PSAwICYmIGxhc3RTZWxlY3RlZEluZGV4IDwgY3VycmVudEluZGV4KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxvd2VySW5kZXggPSBsYXN0U2VsZWN0ZWRJbmRleDsKLSAgICAgICAgICAgIHVwcGVySW5kZXggPSBjdXJyZW50SW5kZXg7Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIGlmIChsYXN0U2VsZWN0ZWRJbmRleCA+PSAwICYmIGxhc3RTZWxlY3RlZEluZGV4ID4gY3VycmVudEluZGV4KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxvd2VySW5kZXggPSBjdXJyZW50SW5kZXg7Ci0gICAgICAgICAgICB1cHBlckluZGV4ID0gbGFzdFNlbGVjdGVkSW5kZXg7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChsb3dlckluZGV4ID49IDAgJiYgdXBwZXJJbmRleCA+PSAwKQotICAgICAgICAgIHsgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGludCBpID0gbG93ZXJJbmRleDsgaSA8IHVwcGVySW5kZXg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdmlld2VyLmFwcGVuZFNlbGVjdGlvbigoRWRpdFBhcnQpIGxpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0gCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL1NlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdmMGIzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL1NlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLkJhc2VEcmFnQW5kRHJvcENvbW1hbmQ7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwJZXh0ZW5kcyBBRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3kKLXsKLSAgcHJvdGVjdGVkIElGaWd1cmUgZmVlZGJhY2s7Ci0gIHByb3RlY3RlZCBSZWN0YW5nbGUgb3JpZ2luYWxMb2NhdGlvbjsKLSAgcHJvdGVjdGVkIEJhc2VEcmFnQW5kRHJvcENvbW1hbmQgZHJhZ0FuZERyb3BDb21tYW5kOwotICBwcm90ZWN0ZWQgUG9seWxpbmUgcG9seUxpbmU7Ci0gIHByb3RlY3RlZCBSZWN0YW5nbGVGaWd1cmUgZ2hvc3RTaGFwZTsKLQotICBwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KQotICB7ICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLSAgICBpZiAoUkVRX01PVkUuZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSkKLSAgICB7ICAKLSAgICAgIHJlc3VsdCA9IGZhbHNlOyAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHN1cGVyLnVuZGVyc3RhbmRzUmVxdWVzdChyZXF1ZXN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLQotICBwdWJsaWMgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIG51bGw7ICAKLSAgfSAgIAotCi0gIHB1YmxpYyB2b2lkIHNldERyYWdBbmREcm9wQ29tbWFuZChCYXNlRHJhZ0FuZERyb3BDb21tYW5kIGRyYWdBbmREcm9wQ29tbWFuZCkKLSAgewotICAgIHRoaXMuZHJhZ0FuZERyb3BDb21tYW5kID0gZHJhZ0FuZERyb3BDb21tYW5kOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2hvd1NvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkKLSAgeyAgIAotICAgICAgZXJhc2VDaGFuZ2VCb3VuZHNGZWVkYmFjayhudWxsKTsKLSAgICAgIGlmIChkcmFnQW5kRHJvcENvbW1hbmQgIT0gbnVsbCAmJiBkcmFnQW5kRHJvcENvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7Ci0gICAgICAgIGlmIChSRVFfTU9WRS5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpIHx8IFJFUV9BREQuZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSkgewotICAgICAgICAgIGlmIChkcmFnQW5kRHJvcENvbW1hbmQgIT0gbnVsbCAmJiBkcmFnQW5kRHJvcENvbW1hbmQuZ2V0RmVlZGJhY2tGaWd1cmUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmZWVkYmFjayA9IGRyYWdBbmREcm9wQ29tbWFuZC5nZXRGZWVkYmFja0ZpZ3VyZSgpOwotICAgICAgICAgICAgYWRkRmVlZGJhY2soZmVlZGJhY2spOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gIHsKLQkgIGlmIChmZWVkYmFjayAhPSBudWxsKQotICAgIHsKLQkJICByZW1vdmVGZWVkYmFjayhmZWVkYmFjayk7Ci0JCSAgZmVlZGJhY2sgPSBudWxsOwotCSAgfQotCSAgaGlkZUZvY3VzKCk7Ci0JICBzdXBlci5kZWFjdGl2YXRlKCk7Ci0gIH0KLQotICAvKioKLSAgICogRXJhc2UgZmVlZGJhY2sgaW5kaWNhdGluZyB0aGF0IHRoZSByZWNlaXZlciBvYmplY3QgaXMgCi0gICAqIGJlaW5nIGRyYWdnZWQuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGRyYWcgaXMKLSAgICogY29tcGxldGVkIG9yIGNhbmNlbGxlZCBvbiB0aGUgcmVjZWl2ZXIgb2JqZWN0LgotICAgKiBAcGFyYW0gZHJhZ1RyYWNrZXIgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRyYWdUcmFja2VyIFRoZSBkcmFnIHRyYWNrZXIgb2YgdGhlIHRvb2wgcGVyZm9ybWluZyB0aGUgZHJhZy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGVyYXNlQ2hhbmdlQm91bmRzRmVlZGJhY2soQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KSAKLSAgewotCSAgaWYgKGZlZWRiYWNrICE9IG51bGwpIAotICAgIHsJCSAgICAgIAotCQkgIHJlbW92ZUZlZWRiYWNrKGZlZWRiYWNrKTsKLQkgIH0KLQkgIGZlZWRiYWNrID0gbnVsbDsKLQkgIG9yaWdpbmFsTG9jYXRpb24gPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEVyYXNlIGZlZWRiYWNrIGluZGljYXRpbmcgdGhhdCB0aGUgcmVjZWl2ZXIgb2JqZWN0IGlzIAotICAgKiBiZWluZyBkcmFnZ2VkLiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBkcmFnIGlzCi0gICAqIGNvbXBsZXRlZCBvciBjYW5jZWxsZWQgb24gdGhlIHJlY2VpdmVyIG9iamVjdC4KLSAgICogQHBhcmFtIGRyYWdUcmFja2VyIG9yZy5lY2xpcHNlLmdlZi50b29scy5EcmFnVHJhY2tlciBUaGUgZHJhZyB0cmFja2VyIG9mIHRoZSB0b29sIHBlcmZvcm1pbmcgdGhlIGRyYWcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcmFzZVNvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgCi0gIHsKLSAgICBpZiAoUkVRX01PVkUuZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSB8fCAgUkVRX0FERC5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpKQotICAgIHsKLQkJICBlcmFzZUNoYW5nZUJvdW5kc0ZlZWRiYWNrKChDaGFuZ2VCb3VuZHNSZXF1ZXN0KXJlcXVlc3QpOwotICAgIH0KLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cG9saWNpZXMvVG9wTGV2ZWxDb21wb25lbnRMYWJlbENlbGxFZGl0b3JMb2NhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL1RvcExldmVsQ29tcG9uZW50TGFiZWxDZWxsRWRpdG9yTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTk0YTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cG9saWNpZXMvVG9wTGV2ZWxDb21wb25lbnRMYWJlbENlbGxFZGl0b3JMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5MYWJlbENlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuSU5hbWVkRWRpdFBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBUb3BMZXZlbENvbXBvbmVudExhYmVsQ2VsbEVkaXRvckxvY2F0b3IgZXh0ZW5kcyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yCi17Ci0gIHB1YmxpYyBUb3BMZXZlbENvbXBvbmVudExhYmVsQ2VsbEVkaXRvckxvY2F0b3IoSU5hbWVkRWRpdFBhcnQgbmFtZWRFZGl0UGFydCwgUG9pbnQgY3Vyc29yTG9jYXRpb24pCi0gIHsKLSAgICBzdXBlcihuYW1lZEVkaXRQYXJ0LCBjdXJzb3JMb2NhdGlvbik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpCi0gIHsKLSAgICBUZXh0IHRleHQgPSAoVGV4dCkgY2VsbGVkaXRvci5nZXRDb250cm9sKCk7Ci0KLSAgICBMYWJlbCBsYWJlbCA9IG5hbWVkRWRpdFBhcnQuZ2V0TmFtZUxhYmVsRmlndXJlKCk7Ci0gICAgCi0gICAgaWYgKHRleHQuZ2V0Qm91bmRzKCkueCA8PSAwKQotICAgIHsKLSAgICAgIHN1cGVyLnJlbG9jYXRlKGNlbGxlZGl0b3IpOyAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQgc2VsID0gdGV4dC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludCBwcmVmID0gdGV4dC5jb21wdXRlU2l6ZSgtMSwgLTEpOwotICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBsYWJlbC5nZXRUZXh0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgICAgbGFiZWwudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLSAgICAgIHRleHQuc2V0Qm91bmRzKHJlY3QueCwgcmVjdC55LTEsIHJlY3Qud2lkdGgsIHByZWYueSsxKTsKLSAgICAgIHRleHQuc2V0U2VsZWN0aW9uKDApOwotICAgICAgdGV4dC5zZXRTZWxlY3Rpb24oc2VsKTsgCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL1RvcExldmVsTmFtZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL1RvcExldmVsTmFtZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOTI0MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9Ub3BMZXZlbE5hbWVEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5DZWxsRWRpdG9yQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5JTmFtZWRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBUb3BMZXZlbE5hbWVEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIERpcmVjdEVkaXRNYW5hZ2VyCi17Ci0gIHByb3RlY3RlZCBYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQ7Ci0gIHByaXZhdGUgSUFjdGlvbkJhcnMgYWN0aW9uQmFyczsKLSAgcHJpdmF0ZSBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlciBhY3Rpb25IYW5kbGVyOwotICBwcml2YXRlIElBY3Rpb24gY29weSwgY3V0LCBwYXN0ZSwgdW5kbywgcmVkbywgZmluZCwgc2VsZWN0QWxsLCBkZWxldGU7Ci0gIHByaXZhdGUgRm9udCBzY2FsZWRGb250OwotCi0gIHB1YmxpYyBUb3BMZXZlbE5hbWVEaXJlY3RFZGl0TWFuYWdlcihHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIENlbGxFZGl0b3JMb2NhdG9yIGxvY2F0b3IsIFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIHN1cGVyKHNvdXJjZSwgbnVsbCwgbG9jYXRvcik7Ci0gICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGJyaW5nRG93bigpCi0gIHsKLSAgICBpZiAoYWN0aW9uSGFuZGxlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGFjdGlvbkhhbmRsZXIuZGlzcG9zZSgpOwotICAgICAgYWN0aW9uSGFuZGxlciA9IG51bGw7Ci0gICAgfQotICAgIGlmIChhY3Rpb25CYXJzICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdG9yZVNhdmVkQWN0aW9ucyhhY3Rpb25CYXJzKTsKLSAgICAgIGFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotICAgICAgYWN0aW9uQmFycyA9IG51bGw7Ci0gICAgfQotCi0gICAgRm9udCBkaXNwb3NlRm9udCA9IHNjYWxlZEZvbnQ7Ci0gICAgc2NhbGVkRm9udCA9IG51bGw7Ci0gICAgc3VwZXIuYnJpbmdEb3duKCk7Ci0gICAgaWYgKGRpc3Bvc2VGb250ICE9IG51bGwpCi0gICAgICBkaXNwb3NlRm9udC5kaXNwb3NlKCk7Ci0KLSAgICBpZiAoZ2V0RWRpdFBhcnQoKSBpbnN0YW5jZW9mIFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQpCi0gICAgewotICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICB7Ci0gICAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgT2JqZWN0IGFkYXB0ZXIgPSBlZGl0b3IuZ2V0QWRhcHRlcihJU2VsZWN0aW9uUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElTZWxlY3Rpb25Qcm92aWRlciBzZWwgPSAoSVNlbGVjdGlvblByb3ZpZGVyKSBhZGFwdGVyOwotICAgICAgICAgICAgc2VsLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihnZXRFZGl0UGFydCgpLmdldE1vZGVsKCkpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNob3dGZWVkYmFjaygpCi0gIHsKLSAgICBzdXBlci5zaG93RmVlZGJhY2soKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDZWxsRWRpdG9yIGNyZWF0ZUNlbGxFZGl0b3JPbihDb21wb3NpdGUgY29tcG9zaXRlKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUZXh0Q2VsbEVkaXRvcihjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuV1JBUCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpCi0gIHsKLSAgICBUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLSAgICBMYWJlbCBsYWJlbCA9ICgoSU5hbWVkRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCkpLmdldE5hbWVMYWJlbEZpZ3VyZSgpOwotCi0gICAgaWYgKGxhYmVsICE9IG51bGwpCi0gICAgewotICAgICAgc2NhbGVkRm9udCA9IGxhYmVsLmdldEZvbnQoKTsKLQotICAgICAgQ29sb3IgY29sb3IgPSBsYWJlbC5nZXRCYWNrZ3JvdW5kQ29sb3IoKTsKLSAgICAgIHRleHQuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0KLSAgICAgIFN0cmluZyBpbml0aWFsTGFiZWxUZXh0ID0gY29tcG9uZW50LmdldE5hbWUoKTsKLSAgICAgIGdldENlbGxFZGl0b3IoKS5zZXRWYWx1ZShpbml0aWFsTGFiZWxUZXh0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNjYWxlZEZvbnQgPSBsYWJlbC5nZXRQYXJlbnQoKS5nZXRGb250KCk7Ci0gICAgICB0ZXh0LnNldEJhY2tncm91bmQobGFiZWwuZ2V0UGFyZW50KCkuZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotICAgIH0KLQotICAgIEZvbnREYXRhIGRhdGEgPSBzY2FsZWRGb250LmdldEZvbnREYXRhKClbMF07Ci0gICAgRGltZW5zaW9uIGZvbnRTaXplID0gbmV3IERpbWVuc2lvbigwLCBkYXRhLmdldEhlaWdodCgpKTsKLSAgICBsYWJlbC5nZXRQYXJlbnQoKS50cmFuc2xhdGVUb0Fic29sdXRlKGZvbnRTaXplKTsKLSAgICBkYXRhLnNldEhlaWdodChmb250U2l6ZS5oZWlnaHQpOwotICAgIHNjYWxlZEZvbnQgPSBuZXcgRm9udChudWxsLCBkYXRhKTsKLQotICAgIHRleHQuc2V0Rm9udChzY2FsZWRGb250KTsKLSAgICAvLyB0ZXh0LnNlbGVjdEFsbCgpOwotCi0gICAgLy8gSG9vayB0aGUgY2VsbCBlZGl0b3IncyBjb3B5L3Bhc3RlIGFjdGlvbnMgdG8gdGhlIGFjdGlvbkJhcnMgc28gdGhhdCB0aGV5Ci0gICAgLy8gY2FuCi0gICAgLy8gYmUgaW52b2tlZCB2aWEga2V5Ym9hcmQgc2hvcnRjdXRzLgotICAgIGFjdGlvbkJhcnMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotICAgIHNhdmVDdXJyZW50QWN0aW9ucyhhY3Rpb25CYXJzKTsKLSAgICBhY3Rpb25IYW5kbGVyID0gbmV3IENlbGxFZGl0b3JBY3Rpb25IYW5kbGVyKGFjdGlvbkJhcnMpOwotICAgIGFjdGlvbkhhbmRsZXIuYWRkQ2VsbEVkaXRvcihnZXRDZWxsRWRpdG9yKCkpOwotICAgIGFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVTYXZlZEFjdGlvbnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykKLSAgewotICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwgY29weSk7Ci0gICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSwgcGFzdGUpOwotICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTI1MDkKLSAgICAvLyBEZWxldGUgYWN0aW9uIChrZXkpIGRvZXNuJ3QgYWx3YXlzIHdvcmsuICBUaGUgc2F2ZWQgYWN0aW9uIGNvdWxkIGJlIHRoZSAKLSAgICAvLyBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlcidzIERlbGV0ZUFjdGlvbkhhbmRsZXIuLi5kdWUgdG8gdGltaW5nIGlzc3Vlcy4KLSAgICAvLyBXZSdsbCBvbmx5IHJlc3RvcmUgdGhlIGRlbGV0ZSBhY3Rpb24gaWYgaXQgaXMgaW5kZWVkIHRoZSBvbmUgZm9yIHRoZSBEZXNpZ24gdmlldy4KLSAgICAvLyBXZSBzaG91bGQgdXBkYXRlIHRoZSBvdGhlciBhY3Rpb25zIHRvbywgYnV0IGN1cnJlbnRseSwgbm9uZSBhcmUgYXBwbGljYWJsZS4KLSAgICBpZiAoZGVsZXRlIGluc3RhbmNlb2YgQmFzZVNlbGVjdGlvbkFjdGlvbikKLSAgICB7Ci0gICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwgZGVsZXRlKTsKLSAgICB9Ci0gICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpLCBzZWxlY3RBbGwpOwotICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpLCBjdXQpOwotICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkZJTkQuZ2V0SWQoKSwgZmluZCk7Ci0gICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLCB1bmRvKTsKLSAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksIHJlZG8pOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNhdmVDdXJyZW50QWN0aW9ucyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKQotICB7Ci0gICAgY29weSA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSk7Ci0gICAgcGFzdGUgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpKTsKLSAgICBJQWN0aW9uIGN1cnJlbnREZWxldGVBY3Rpb24gPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSk7Ci0gICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MjUwOQotICAgIC8vIERlbGV0ZSBhY3Rpb24gKGtleSkgZG9lc24ndCBhbHdheXMgd29yay4gIFRoZSBzYXZlZCBhY3Rpb24gY291bGQgYmUgdGhlIAotICAgIC8vIENlbGxFZGl0b3JBY3Rpb25IYW5kbGVyJ3MgRGVsZXRlQWN0aW9uSGFuZGxlci4uLmR1ZSB0byB0aW1pbmcgaXNzdWVzLgotICAgIC8vIFdlJ2xsIG9ubHkgcmVzdG9yZSB0aGUgZGVsZXRlIGFjdGlvbiBpZiBpdCBpcyBpbmRlZWQgdGhlIG9uZSBmb3IgdGhlIERlc2lnbiB2aWV3LgotICAgIC8vIFdlIHNob3VsZCB1cGRhdGUgdGhlIG90aGVyIGFjdGlvbnMgdG9vLCBidXQgY3VycmVudGx5LCBub25lIGFyZSBhcHBsaWNhYmxlLgotICAgIGlmIChjdXJyZW50RGVsZXRlQWN0aW9uIGluc3RhbmNlb2YgQmFzZVNlbGVjdGlvbkFjdGlvbikKLSAgICB7Ci0gICAgICBkZWxldGUgPSBjdXJyZW50RGVsZXRlQWN0aW9uOwotICAgIH0KLSAgICBzZWxlY3RBbGwgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5TRUxFQ1RfQUxMLmdldElkKCkpOwotICAgIGN1dCA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpKTsKLSAgICBmaW5kID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuRklORC5nZXRJZCgpKTsKLSAgICB1bmRvID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpKTsKLSAgICByZWRvID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpKTsKLSAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvQ2F0ZWdvcnlGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0NhdGVnb3J5RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMTI1MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvQ2F0ZWdvcnlGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2Nyb2xsUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVmlld3BvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlZpZXdwb3J0TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuSGVhZGluZ0ZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzLlJvdW5kZWRMaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmxheW91dHMuRmlsbExheW91dDsKLQotcHVibGljIGNsYXNzIENhdGVnb3J5RmlndXJlIGV4dGVuZHMgRmlndXJlCi17Ci0gIHByb3RlY3RlZCBTY3JvbGxQYW5lIHNjcm9sbHBhbmU7Ci0gIHByb3RlY3RlZCBGaWd1cmUgb3V0ZXJQYW5lOwotICBwdWJsaWMgSGVhZGluZ0ZpZ3VyZSBoZWFkaW5nRmlndXJlOwotICBGaWd1cmUgY29udGVudFBhbmU7Ci0KLSAgcHVibGljIENhdGVnb3J5RmlndXJlKGludCB0eXBlKQotICB7Ci0gICAgc3VwZXIoKTsKLQotICAgIG91dGVyUGFuZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBvdXRlclBhbmUuc2V0Qm9yZGVyKG5ldyBSb3VuZGVkTGluZUJvcmRlcigxLCA2KSk7Ci0KLSAgICBUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KGZhbHNlKTsKLSAgICBsYXlvdXQuc2V0VmVydGljYWwodHJ1ZSk7Ci0gICAgbGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgRmlsbExheW91dCBmaWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoMyk7Ci0gICAgZmlsbExheW91dC5zZXRIb3Jpem9udGFsKGZhbHNlKTsKLQotICAgIEZpbGxMYXlvdXQgb3V0ZXJMYXlvdXQgPSBuZXcgRmlsbExheW91dCgpOwotICAgIG91dGVyUGFuZS5zZXRMYXlvdXRNYW5hZ2VyKG91dGVyTGF5b3V0KTsKLQotICAgIGFkZChvdXRlclBhbmUpOwotCi0gICAgaGVhZGluZ0ZpZ3VyZSA9IG5ldyBIZWFkaW5nRmlndXJlKCk7Ci0gICAgb3V0ZXJQYW5lLmFkZChoZWFkaW5nRmlndXJlKTsKLQotICAgIEZpZ3VyZSBsaW5lID0gbmV3IEZpZ3VyZSgpOwotICAgIGxpbmUuc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKDEpKTsKLSAgICBUb29sYmFyTGF5b3V0IGxpbmVMYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgbGluZUxheW91dC5zZXRWZXJ0aWNhbCh0cnVlKTsKLSAgICBsaW5lTGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgbGluZS5zZXRMYXlvdXRNYW5hZ2VyKGxpbmVMYXlvdXQpOwotICAgIG91dGVyUGFuZS5hZGQobGluZSk7Ci0KLSAgICBzY3JvbGxwYW5lID0gbmV3IFNjcm9sbFBhbmUoKTsKLSAgICBzY3JvbGxwYW5lLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgc2Nyb2xscGFuZS5zZXRWZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHkoU2Nyb2xsUGFuZS5BVVRPTUFUSUMpOwotICAgIG91dGVyUGFuZS5hZGQoc2Nyb2xscGFuZSk7Ci0KLSAgICBGaWd1cmUgcGFuZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBwYW5lLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDUsIDgsIDUsIDgpKTsKLSAgICBUb29sYmFyTGF5b3V0IHRvb2xiYXJMYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgdG9vbGJhckxheW91dC5zZXRTcGFjaW5nKDMpOwotICAgIHBhbmUuc2V0TGF5b3V0TWFuYWdlcih0b29sYmFyTGF5b3V0KTsgLy8gZ29vZAotCi0gICAgVmlld3BvcnQgdmlld3BvcnQgPSBuZXcgVmlld3BvcnQoKTsKLSAgICB2aWV3cG9ydC5zZXRDb250ZW50c1RyYWNrc0hlaWdodCh0cnVlKTsKLSAgICBWaWV3cG9ydExheW91dCB2aWV3cG9ydExheW91dCA9IG5ldyBWaWV3cG9ydExheW91dCgpOwotICAgIHZpZXdwb3J0LnNldExheW91dE1hbmFnZXIodmlld3BvcnRMYXlvdXQpOwotCi0gICAgc2Nyb2xscGFuZS5zZXRWaWV3cG9ydCh2aWV3cG9ydCk7Ci0gICAgc2Nyb2xscGFuZS5zZXRDb250ZW50cyhwYW5lKTsKLSAgfQotCi0gIHB1YmxpYyBIZWFkaW5nRmlndXJlIGdldEhlYWRpbmdGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGhlYWRpbmdGaWd1cmU7Ci0gIH0KLQotICBwdWJsaWMgU2Nyb2xsUGFuZSBnZXRTY3JvbGxQYW5lKCkKLSAgewotICAgIHJldHVybiBzY3JvbGxwYW5lOwotICB9Ci0KLSAgcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICB7Ci0gICAgcmV0dXJuIHNjcm9sbHBhbmUuZ2V0Q29udGVudHMoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9DZW50ZXJlZEljb25GaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0NlbnRlcmVkSWNvbkZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTc3Mjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0NlbnRlcmVkSWNvbkZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzOwotICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLlJlZmVyZW5jZUNvbm5lY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBDZW50ZXJlZEljb25GaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlCi17ICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1JNQUwgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RFRCA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPVkVSID0gMjsKLSAgcHVibGljIEltYWdlIGltYWdlOwotICBwcm90ZWN0ZWQgTGFiZWwgdG9vbFRpcExhYmVsOwotICBwcm90ZWN0ZWQgaW50IG1vZGUgPSAwOwotICAKLSAgcHVibGljIENlbnRlcmVkSWNvbkZpZ3VyZSgpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHNldEZpbGwodHJ1ZSk7ICAgCi0gICAgdG9vbFRpcExhYmVsID0gbmV3IExhYmVsKCk7Ci0gICAgc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKDUsNSkpOwotICB9Ci0gIAotICBwdWJsaWMgQ2VudGVyZWRJY29uRmlndXJlKEltYWdlIGltZykKLSAgewotICAgIHRoaXMoKTsKLSAgICB0aGlzLmltYWdlID0gaW1nOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHJlcGFpbnQoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgb3V0bGluZVNoYXBlKEdyYXBoaWNzIGdyYXBoaWNzKQotICB7Ci0gICAgZ3JhcGhpY3MucHVzaFN0YXRlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKG1vZGUgPT0gTk9STUFMKQotICAgICAgeyAvLyBUT0RPOiBjb21tb24gdXAgYW5kIG9yZ2FuaXplIGNvbG9ycy4uLi4KLSAgICAgICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKFJlZmVyZW5jZUNvbm5lY3Rpb24uaW5hY3RpdmVDb25uZWN0aW9uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG1vZGUgPT0gU0VMRUNURUQpCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gaGlnaENvbnRyYXN0ID0gZmFsc2U7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgaGlnaENvbnRyYXN0ID0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0SGlnaENvbnRyYXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhpZ2hDb250cmFzdCkKLSAgICAgICAgewotICAgICAgICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0ZPUkVHUk9VTkQpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBzdXBlci5vdXRsaW5lU2hhcGUoZ3JhcGhpY3MpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZ3JhcGhpY3MucG9wU3RhdGUoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBmaWxsU2hhcGUoR3JhcGhpY3MgZykKLSAgeyAgICAKLSAgICBzdXBlci5maWxsU2hhcGUoZyk7Ci0gICAgaWYgKGltYWdlICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCk7Ci0gICAgICBEaW1lbnNpb24gaW1hZ2VTaXplID0gbmV3IERpbWVuc2lvbigxNSwgMTUpOwotICAgICAgZy5kcmF3SW1hZ2UoaW1hZ2UsIHIueCArIChyLndpZHRoIC0gaW1hZ2VTaXplLndpZHRoKS8yLCByLnkgKyAoci5oZWlnaHQgLSBpbWFnZVNpemUuaGVpZ2h0KS8yIC0gMSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIExhYmVsIGdldFRvb2xUaXBMYWJlbCgpCi0gIHsKLSAgICByZXR1cm4gdG9vbFRpcExhYmVsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNb2RlKGludCBtb2RlKQotICB7Ci0gICAgdGhpcy5tb2RlID0gbW9kZTsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRUb29sVGlwVGV4dChTdHJpbmcgdGV4dCkKLSAgewotICAgIGlmICh0ZXh0Lmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBzZXRUb29sVGlwKHRvb2xUaXBMYWJlbCk7Ci0gICAgICB0b29sVGlwTGFiZWwuc2V0VGV4dCh0ZXh0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldFRvb2xUaXAobnVsbCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9HZW5lcmljR3JvdXBGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0dlbmVyaWNHcm91cEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDExN2NlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0dlbmVyaWNHcm91cEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5sYXlvdXRzLk1vZGVsR3JvdXBMYXlvdXQ7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljR3JvdXBGaWd1cmUgZXh0ZW5kcyBGaWd1cmUKLXsKLSAgcHJvdGVjdGVkIENlbnRlcmVkSWNvbkZpZ3VyZSBjZW50ZXJlZEljb25GaWd1cmU7Ci0gIHByb3RlY3RlZCBGaWd1cmUgY29udGVudEZpZ3VyZTsKLSAgcHJvdGVjdGVkIFN0cmluZyB0ZXh0OwotICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNUZXh0ID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBMYWJlbCB0ZXh0RmlndXJlOwotICAKLSAgcHVibGljIEdlbmVyaWNHcm91cEZpZ3VyZSgpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHNldExheW91dE1hbmFnZXIobmV3IE1vZGVsR3JvdXBMYXlvdXQodHJ1ZSkpOwotICAgCi0gICAgY2VudGVyZWRJY29uRmlndXJlID0gbmV3IENlbnRlcmVkSWNvbkZpZ3VyZSgpOwotICAgIGNlbnRlcmVkSWNvbkZpZ3VyZS5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oMTUsIDE1KSk7Ci0KLSAgICBhZGQoY2VudGVyZWRJY29uRmlndXJlKTsKLSAgICBjb250ZW50RmlndXJlID0gbmV3IEZpZ3VyZSgpOwotICAgIGNvbnRlbnRGaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgTW9kZWxHcm91cExheW91dChmYWxzZSwgMCkpOwotICAgIGFkZChjb250ZW50RmlndXJlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkKLSAgewotICAgIHRoaXMudGV4dCA9IHRleHQ7Ci0gICAgaGFzVGV4dCA9IGZhbHNlOwotICAgIGlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgaGFzVGV4dCA9IHRydWU7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBoYXNUZXh0KCkKLSAgewotICAgIHJldHVybiBoYXNUZXh0OwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgcmV0dXJuIHRleHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBQb2ludCBnZXRUZXh0Q29vcmRpbmF0ZXMoKQotICB7Ci0gICAgUmVjdGFuZ2xlIHJlY3QgPSBjZW50ZXJlZEljb25GaWd1cmUuZ2V0Qm91bmRzKCk7Ci0gICAgcmV0dXJuIG5ldyBQb2ludChyZWN0LngsIHJlY3QueSArIDE0KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SWNvbkZpZ3VyZShJbWFnZSBpbWFnZSkKLSAgewotICAgIGNlbnRlcmVkSWNvbkZpZ3VyZS5pbWFnZSA9IGltYWdlOwotICB9Ci0KLSAgcHVibGljIENlbnRlcmVkSWNvbkZpZ3VyZSBnZXRUYXJnZXRGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGNlbnRlcmVkSWNvbkZpZ3VyZTsKLSAgfQotICAKLSAgcHVibGljIENlbnRlcmVkSWNvbkZpZ3VyZSBnZXRJY29uRmlndXJlKCkKLSAgewotICAgIHJldHVybiBjZW50ZXJlZEljb25GaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBGaWd1cmUgZ2V0Q29udGVudEZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gY29udGVudEZpZ3VyZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQoU3RyaW5nIHRleHQpCi0gIHsKLSAgICBjZW50ZXJlZEljb25GaWd1cmUuc2V0VG9vbFRpcFRleHQodGV4dCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0h5cGVyTGlua0xhYmVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9IeXBlckxpbmtMYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGVmMjlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0h5cGVyTGlua0xhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLQotcHVibGljIGNsYXNzIEh5cGVyTGlua0xhYmVsIGV4dGVuZHMgTGFiZWwKLXsKLSAgcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gIHsKLSAgICBzdXBlci5wYWludEZpZ3VyZShncmFwaGljcyk7ICAgCi0gICAgZ3JhcGhpY3Muc2V0Rm9udChnZXRGb250KCkpOwotICAgICAgICAKLSAgICAvLyBUT0RPIChjcykgdGhpcyBsb29rdXAgdG8gZmluZCAiIDoiIGlzIGEgaGFjawotICAgIC8vIHRoYXQncyBzcGVjaWFsaXplZCBmb3IgZWxlbWVudCBhbmQgdHlwZSBsYWJlbCB0ZXh0Ci0gICAgLy8gd2UgbmVlZCB0byBtYWtlIHRoZSBUb3BMZXZlbENvbXBvbmVudCB1c2UgdHdvIGxhYmVscyBpbiB0aGlzIGNhc2UKLSAgICAvLyAgICAKLSAgICBTdHJpbmcgc3RyaW5nID0gZ2V0VGV4dCgpOwotICAgIGludCBpbmRleCA9IHN0cmluZy5pbmRleE9mKCIgOiIpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICB9Ci0gICAgLy8gZW5kIGhhY2sKLSAgICAKLSAgICBQb2ludCBwID0gZ2V0VGV4dExvY2F0aW9uKCk7ICAgICAgCi0gICAgRGltZW5zaW9uIHRleHRTaXplID0gIEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyhzdHJpbmcsIGdldEZvbnQoKSk7Ci0gICAgaW50IHRleHRXaWR0aCA9IHRleHRTaXplLndpZHRoOwotICAgIGludCB0ZXh0SGVpZ2h0ID0gdGV4dFNpemUuaGVpZ2h0OwotICAgIGludCBkZXNjZW50ID0gZ3JhcGhpY3MuZ2V0Rm9udE1ldHJpY3MoKS5nZXREZXNjZW50KCk7Ci0gICAgaW50IGxpbmVZID0gYm91bmRzLnkgKyBwLnkgKyB0ZXh0SGVpZ2h0IC0gZGVzY2VudCArIDE7ICAgICAgCi0gICAgaW50IGxpbmVYID0gYm91bmRzLnggKyBwLng7Ci0gICAgZ3JhcGhpY3MuZHJhd0xpbmUobGluZVgsIGxpbmVZLCBsaW5lWCArIHRleHRXaWR0aCwgbGluZVkpOyAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvSUV4dGVuZGVkRmlndXJlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvSUV4dGVuZGVkRmlndXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTA3YjU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0lFeHRlbmRlZEZpZ3VyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSUZpZ3VyZUZhY3Rvcnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSBleHRlbmRzIElGaWd1cmVGYWN0b3J5Ci17Ci0gIElNb2RlbEdyb3VwRmlndXJlIGNyZWF0ZU1vZGVsR3JvdXBGaWd1cmUoT2JqZWN0IG1vZGVsKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0lNb2RlbEdyb3VwRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9JTW9kZWxHcm91cEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGZmNDIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0lNb2RlbEdyb3VwRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklBRFRGaWd1cmU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsR3JvdXBGaWd1cmUgZXh0ZW5kcyBJQURURmlndXJlCi17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9Nb2RlbEdyb3VwRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9Nb2RlbEdyb3VwRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMDk5MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvTW9kZWxHcm91cEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIE1vZGVsR3JvdXBGaWd1cmUgZXh0ZW5kcyBHZW5lcmljR3JvdXBGaWd1cmUgaW1wbGVtZW50cyBJTW9kZWxHcm91cEZpZ3VyZQotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFNFUVVFTkNFX0lDT05fSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvc2VxdWVuY2Vfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgU0VRVUVOQ0VfSUNPTl9ESVNBQkxFRF9JTUFHRSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9zZXF1ZW5jZWRpc19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBDSE9JQ0VfSUNPTl9JTUFHRSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9jaG9pY2Vfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQ0hPSUNFX0lDT05fRElTQUJMRURfSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvY2hvaWNlZGlzX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIEFMTF9JQ09OX0lNQUdFID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L2FsbF9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBBTExfSUNPTl9ESVNBQkxFRF9JTUFHRSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9hbGxkaXNfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgTW9kZWxHcm91cEZpZ3VyZSgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SWNvbkZpZ3VyZShJbWFnZSBpbWFnZSkKLSAgewotICAgIGNlbnRlcmVkSWNvbkZpZ3VyZS5pbWFnZSA9IGltYWdlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uRmVlZGJhY2soKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgZWRpdFBhcnRBdHRhY2hlZChFZGl0UGFydCBvd25lcikKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hWaXN1YWxzKE9iamVjdCBtb2RlbCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkZlZWRiYWNrKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIgICAKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL1NwYWNpbmdGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL1NwYWNpbmdGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE2YTU1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9TcGFjaW5nRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIFNwYWNpbmdGaWd1cmUgZXh0ZW5kcyBMYWJlbAotewotICBwdWJsaWMgU3BhY2luZ0ZpZ3VyZSgpCi0gIHsKLSAgICBzdXBlcigiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBzZXRJY29uKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvRG90LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIHNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDMsIDAsIDMsIDApKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2xheW91dHMvQ29udGFpbmVyTGF5b3V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vbGF5b3V0cy9Db250YWluZXJMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwOTgwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vbGF5b3V0cy9Db250YWluZXJMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24ubGF5b3V0czsKLSAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5TcGFjaW5nRmlndXJlOwotICAgICAgICAgICAgICAKLQotcHVibGljIGNsYXNzIENvbnRhaW5lckxheW91dCBleHRlbmRzIEFic3RyYWN0TGF5b3V0Ci17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNIb3Jpem9udGFsOwotICBwcm90ZWN0ZWQgaW50IHNwYWNpbmcgPSAwOwotICBwcm90ZWN0ZWQgaW50IGJvcmRlciA9IDA7IAotCi0gIHB1YmxpYyBDb250YWluZXJMYXlvdXQoKQotICB7IAotICAgIHRoaXModHJ1ZSwgMCk7IAotICB9ICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBDb250YWluZXJMYXlvdXQoYm9vbGVhbiBpc0hvcml6b250YWwsIGludCBzcGFjaW5nKQotICB7Ci0gICAgdGhpcy5pc0hvcml6b250YWwgPSBpc0hvcml6b250YWw7ICAgCi0gICAgdGhpcy5zcGFjaW5nID0gc3BhY2luZzsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgc2V0SG9yaXpvbnRhbChib29sZWFuIGlzSG9yaXpvbnRhbCkKLSAgewotICAgIHRoaXMuaXNIb3Jpem9udGFsID0gaXNIb3Jpem9udGFsOwotICB9ICAKLQotICBwdWJsaWMgdm9pZCBzZXRTcGFjaW5nKGludCBzcGFjaW5nKQotICB7Ci0gICAgdGhpcy5zcGFjaW5nID0gc3BhY2luZzsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgc2V0Qm9yZGVyKGludCBib3JkZXIpCi0gIHsKLSAgICB0aGlzLmJvcmRlciA9IGJvcmRlcjsKLSAgfSAgCi0KLSAgcHJvdGVjdGVkIGludCBhbGlnbkZpZ3VyZShJRmlndXJlIHBhcmVudCwgSUZpZ3VyZSBjaGlsZCkKLSAgeyAKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIGNvbnRhaW5lciAKLSAgICogZ2l2ZW4gYXMgaW5wdXQuCi0gICAqIAotICAgKiBAcGFyYW0gZmlndXJlICBGaWd1cmUgd2hvc2UgcHJlZmVycmVkIHNpemUgaXMgcmVxdWlyZWQuCi0gICAqIEByZXR1cm4gIFRoZSBwcmVmZXJyZWQgc2l6ZSBvZiB0aGUgcGFzc2VkIEZpZ3VyZS4KLSAgICogQHNpbmNlIDIuMAotICAgKi8KLSAgcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplSGVscGVyKElGaWd1cmUgcGFyZW50KQotICB7IAotICAgIERpbWVuc2lvbglwcmVmZXJyZWQgPSBuZXcgRGltZW5zaW9uKCk7Ci0gIAlMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgIGZvciAoaW50IGk9MDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKQotICAgIHsKLQkJICBJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpY2hpbGRyZW4uZ2V0KGkpOyAgICAgIAotICAgIAotICAgICAgRGltZW5zaW9uCWNoaWxkU2l6ZSA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUoKTsKLQkgIAotICAgICAgaWYgKGlzSG9yaXpvbnRhbCkKLSAgICAgIHsKLQkJICAgIHByZWZlcnJlZC53aWR0aCArPSBjaGlsZFNpemUud2lkdGg7Ci0JCSAgICBwcmVmZXJyZWQuaGVpZ2h0ID0gTWF0aC5tYXgocHJlZmVycmVkLmhlaWdodCwgY2hpbGRTaXplLmhlaWdodCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7ICAKLSAgICAgICAgcHJlZmVycmVkLmhlaWdodCArPSBjaGlsZFNpemUuaGVpZ2h0OwotICAgICAgICBwcmVmZXJyZWQud2lkdGggPSBNYXRoLm1heChwcmVmZXJyZWQud2lkdGgsIGNoaWxkU2l6ZS53aWR0aCk7Ci0gICAgICB9Ci0JICB9ICAgCi0KLSAgICBpbnQgY2hpbGRyZW5TaXplID0gY2hpbGRyZW4uc2l6ZSgpOwotICAgIGlmIChjaGlsZHJlblNpemUgPiAxKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpZiAoaXNIb3Jpem9udGFsKSAgICAKLSAgICAgIHsKLSAgICAgICAgcHJlZmVycmVkLndpZHRoICs9IHNwYWNpbmcgKiAoY2hpbGRyZW5TaXplIC0gMSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JCSAgICBwcmVmZXJyZWQuaGVpZ2h0ICs9IHNwYWNpbmcgKiAoY2hpbGRyZW5TaXplIC0gMSk7Ci0gICAgICB9IAotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJlZmVycmVkLndpZHRoICs9IGJvcmRlciAqIDI7Ci0gICAgcHJlZmVycmVkLmhlaWdodCArPSBib3JkZXIgKiAyOwotCSAgcHJlZmVycmVkLndpZHRoICs9IHBhcmVudC5nZXRJbnNldHMoKS5nZXRXaWR0aCgpOwotCSAgcHJlZmVycmVkLmhlaWdodCArPSBwYXJlbnQuZ2V0SW5zZXRzKCkuZ2V0SGVpZ2h0KCk7ICAgICAgIAotICAKLSAgCXJldHVybiBwcmVmZXJyZWQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgeyAgICAKLSAgICBEaW1lbnNpb24JcHJlZmVycmVkID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy8gSGVyZSB3ZSBlbnN1cmUgdGhhdCBhbiB1bmV4cGFuZGVkIGNvbnRhaW5lciBpcyBnaXZlbiBhIHNpemUgb2YgKDAsMCkKLSAgICAvLwotLy8gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIElFeHBhbmRhYmxlKQotLy8gICAgewotLy8gICAgICBJRXhwYW5kYWJsZSBleHBhbmRhYmxlRmlndXJlID0gKElFeHBhbmRhYmxlKXBhcmVudDsKLS8vICAgICAgaWYgKCFleHBhbmRhYmxlRmlndXJlLmlzRXhwYW5kZWQoKSkKLS8vICAgICAgewotLy8gICAgICAgIHByZWZlcnJlZCA9IG5ldyBEaW1lbnNpb24oKTsgCi0vLyAgICAgIH0KLS8vICAgIH0gICAKLSAgICAKLSAgICBpZiAocHJlZmVycmVkID09IG51bGwpCi0gICAgewotCSAgICBwcmVmZXJyZWQgPSBjYWxjdWxhdGVQcmVmZXJyZWRTaXplSGVscGVyKHBhcmVudCk7ICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcHJlZmVycmVkOwotICB9Ci0gICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIGFkanVzdExheW91dExvY2F0aW9uKElGaWd1cmUgcGFyZW50LCBEaW1lbnNpb24gZGltZW5zaW9uKQotICB7ICAgICAKLSAgfSAgIAotCi0gIHB1YmxpYyB2b2lkIGxheW91dChJRmlndXJlIHBhcmVudCkKLSAgeyAgICAgICAKLSAgCUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLSAKLSAgICBpbnQgcnggPSAwOwotICAgIERpbWVuc2lvbglkaW1lbnNpb24gPSBuZXcgRGltZW5zaW9uKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCSAgZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotCQkgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSljaGlsZHJlbi5nZXQoaSk7Ci0JCSAgRGltZW5zaW9uCWNoaWxkU2l6ZSA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUoKTsKLSAgICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgICB7ICAgCi0gICAgICAgIGRpbWVuc2lvbi5oZWlnaHQgPSBNYXRoLm1heChkaW1lbnNpb24uaGVpZ2h0LCBjaGlsZFNpemUuaGVpZ2h0KTsKLSAgICAgICAgcnggKz0gY2hpbGRTaXplLndpZHRoOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBkaW1lbnNpb24ud2lkdGggPSBNYXRoLm1heChkaW1lbnNpb24ud2lkdGgsIGNoaWxkU2l6ZS53aWR0aCk7Ci0gICAgICB9Ci0gICAgfQotCi0JICAvL2RpbWVuc2lvbi53aWR0aCArPSBwYXJlbnQuZ2V0SW5zZXRzKCkubGVmdDsKLSAgICAvL2RpbWVuc2lvbi5oZWlnaHQgKz0gcGFyZW50LmdldEluc2V0cygpLnRvcDsKLQotICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgewotICAgICAgZGltZW5zaW9uLmhlaWdodCArPSBib3JkZXIqMjsKLSAgICAJZGltZW5zaW9uLndpZHRoICs9IGJvcmRlcjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGRpbWVuc2lvbi53aWR0aCArPSBib3JkZXIqMjsKLSAgICAJZGltZW5zaW9uLmhlaWdodCArPSBib3JkZXI7Ci0gICAgfQotICAgIGFkanVzdExheW91dExvY2F0aW9uKHBhcmVudCwgZGltZW5zaW9uKTsgICAgCi0KLSAgICBmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpY2hpbGRyZW4uZ2V0KGkpOwotCSAgICBEaW1lbnNpb24JY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgpOwotICAgICAgICAKLSAgICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgICB7ICAgCi0gICAgICAgIGludCB5ID0gLTE7IAotICAgIAotICAgICAgICB5ID0gYWxpZ25GaWd1cmUocGFyZW50LCBjaGlsZCk7Ci0gICAgCi0gICAgICAgIGlmICh5ID09IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgIHkgPSAoZGltZW5zaW9uLmhlaWdodCAtIGNoaWxkU2l6ZS5oZWlnaHQpIC8gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFJlY3RhbmdsZSByZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlKGRpbWVuc2lvbi53aWR0aCwgeSwgY2hpbGRTaXplLndpZHRoLCBjaGlsZFNpemUuaGVpZ2h0KTsKLSAgICAgICAgcmVjdGFuZ2xlLnRyYW5zbGF0ZShwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpLmdldExvY2F0aW9uKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgY2hpbGQuc2V0Qm91bmRzKHJlY3RhbmdsZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgZGltZW5zaW9uLndpZHRoICs9IGNoaWxkU2l6ZS53aWR0aDsgCi0gICAgICAgIGRpbWVuc2lvbi53aWR0aCArPSBzcGFjaW5nOyAgICAgICAKLQotICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBTcGFjaW5nRmlndXJlKQotICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgIGludCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpLndpZHRoIC0gcng7Ci0gICAgICAgICAgZGltZW5zaW9uLndpZHRoICs9IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZTsKLSAgICAgICAgfSAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFJlY3RhbmdsZSByZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlKDAsIGRpbWVuc2lvbi5oZWlnaHQsIGNoaWxkU2l6ZS53aWR0aCwgY2hpbGRTaXplLmhlaWdodCk7Ci0JICAgICAgcmVjdGFuZ2xlLnRyYW5zbGF0ZShwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpLmdldExvY2F0aW9uKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0KLSAgICAgICAgY2hpbGQuc2V0Qm91bmRzKHJlY3RhbmdsZSk7ICAKLSAgICAgICAgZGltZW5zaW9uLmhlaWdodCArPSBjaGlsZFNpemUuaGVpZ2h0OwotICAgICAgICBkaW1lbnNpb24uaGVpZ2h0ICs9IHNwYWNpbmc7Ci0gICAgICB9Ci0JICB9CSAgICAgIAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9sYXlvdXRzL0ZpbGxMYXlvdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9sYXlvdXRzL0ZpbGxMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRmZThlNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2xheW91dHMvRmlsbExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24ubGF5b3V0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLXB1YmxpYyBjbGFzcyBGaWxsTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RMYXlvdXQKLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNIb3Jpem9udGFsID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBpbnQgc3BhY2luZyA9IDA7Ci0gIHB1YmxpYyBEaW1lbnNpb24gbWluOwotCi0gIHB1YmxpYyBGaWxsTGF5b3V0KCkKLSAgewotICB9Ci0KLSAgcHVibGljIEZpbGxMYXlvdXQoaW50IHNwYWNpbmcpCi0gIHsKLSAgICB0aGlzLnNwYWNpbmcgPSBzcGFjaW5nOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SG9yaXpvbnRhbChib29sZWFuIGlzSG9yaXpvbnRhbCkKLSAgewotICAgIHRoaXMuaXNIb3Jpem9udGFsID0gaXNIb3Jpem9udGFsOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIHByZWZlcnJlZCBzaXplIG9mIHRoZSBpbnB1dCBjb250YWluZXIuIFRoaXMgaXMKLSAgICogdGhlIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQgb2YgdGhlIGNvbnRhaW5lciwgYXMgYWxsIG90aGVyIGNoaWxkcmVuIGZpdAotICAgKiBpbnRvIHRoaXMgc2l6ZS4KLSAgICogCi0gICAqIEBwYXJhbSBmaWd1cmUKLSAgICogICAgICAgICAgQ29udGFpbmVyIGZpZ3VyZSBmb3Igd2hpY2ggcHJlZmVycmVkIHNpemUgaXMgcmVxdWlyZWQuCi0gICAqIEByZXR1cm4gVGhlIHByZWZlcnJlZCBzaXplIG9mIHRoZSBpbnB1dCBmaWd1cmUuCi0gICAqLwotCi0gIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShJRmlndXJlIGZpZ3VyZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotICB7Ci0gICAgRGltZW5zaW9uIGQgPSBjYWxjdWxhdGVQcmVmZXJyZWRDbGllbnRBcmVhU2l6ZShmaWd1cmUpOwotICAgIGQuZXhwYW5kKGZpZ3VyZS5nZXRJbnNldHMoKS5nZXRXaWR0aCgpLCBmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0SGVpZ2h0KCkpOwotICAgIGQudW5pb24oZ2V0Qm9yZGVyUHJlZmVycmVkU2l6ZShmaWd1cmUpKTsKLSAgICByZXR1cm4gZDsKLSAgfQotCi0gIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkQ2xpZW50QXJlYVNpemUoSUZpZ3VyZSBmaWd1cmUpCi0gIHsKLSAgICBEaW1lbnNpb24gZCA9IG5ldyBEaW1lbnNpb24oKTsKLSAgICBMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKSBpLm5leHQoKTsKLSAgICAgIERpbWVuc2lvbiBjaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0KLSAgICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgICB7Ci0gICAgICAgIGQud2lkdGggKz0gY2hpbGRTaXplLndpZHRoOwotICAgICAgICBkLmhlaWdodCA9IE1hdGgubWF4KGNoaWxkU2l6ZS5oZWlnaHQsIGQuaGVpZ2h0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZC5oZWlnaHQgKz0gY2hpbGRTaXplLmhlaWdodDsKLSAgICAgICAgZC53aWR0aCA9IE1hdGgubWF4KGNoaWxkU2l6ZS53aWR0aCwgZC53aWR0aCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaW50IGNoaWxkcmVuU2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsKLSAgICBpZiAoY2hpbGRyZW5TaXplID4gMCkKLSAgICB7Ci0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgewotICAgICAgICBkLndpZHRoICs9IHNwYWNpbmcgKiAoY2hpbGRyZW5TaXplIC0gMSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGQuaGVpZ2h0ICs9IHNwYWNpbmcgKiAoY2hpbGRyZW5TaXplIC0gMSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1pbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGQud2lkdGggPSBNYXRoLm1heChkLndpZHRoLCBtaW4ud2lkdGgpOwotICAgICAgZC5oZWlnaHQgPSBNYXRoLm1heChkLmhlaWdodCwgbWluLmhlaWdodCk7Ci0gICAgfQotICAgIHJldHVybiBkOwotICB9Ci0KLSAgLyoKLSAgICogUmV0dXJucyB0aGUgbWluaW11bSBzaXplIHJlcXVpcmVkIGJ5IHRoZSBpbnB1dCBjb250YWluZXIuIFRoaXMgaXMgdGhlIHNpemUKLSAgICogb2YgdGhlIGxhcmdlc3QgY2hpbGQgb2YgdGhlIGNvbnRhaW5lciwgYXMgYWxsIG90aGVyIGNoaWxkcmVuIGZpdCBpbnRvIHRoaXMKLSAgICogc2l6ZS4KLSAgICovCi0gIHB1YmxpYyBEaW1lbnNpb24gZ2V0TWluaW11bVNpemUoSUZpZ3VyZSBmaWd1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgewotICAgIERpbWVuc2lvbiBkID0gbmV3IERpbWVuc2lvbigpOwotICAgIExpc3QgY2hpbGRyZW4gPSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKTsKLSAgICBJRmlndXJlIGNoaWxkOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBjaGlsZCA9IChJRmlndXJlKSBjaGlsZHJlbi5nZXQoaSk7Ci0gICAgICBkLnVuaW9uKGNoaWxkLmdldE1pbmltdW1TaXplKCkpOwotICAgIH0KLSAgICBkLmV4cGFuZChmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKSwgZmlndXJlLmdldEluc2V0cygpLmdldEhlaWdodCgpKTsKLSAgICByZXR1cm4gZDsKLSAgfQotCi0gIHB1YmxpYyBEaW1lbnNpb24gZ2V0UHJlZmVycmVkU2l6ZShJRmlndXJlIGZpZ3VyZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotICB7Ci0gICAgcmV0dXJuIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoZmlndXJlLCB3aWR0aCwgaGVpZ2h0KTsKLSAgfQotCi0gIC8qCi0gICAqIExheXMgb3V0IHRoZSBjaGlsZHJlbiBvbiB0b3Agb2YgZWFjaCBvdGhlciB3aXRoIHRoZWlyIHNpemVzIGVxdWFsIHRvIHRoYXQKLSAgICogb2YgdGhlIGF2YWlsYWJsZSBwYWludGFibGUgYXJlYSBvZiB0aGUgaW5wdXQgY29udGFpbmVyIGZpZ3VyZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxheW91dChJRmlndXJlIGZpZ3VyZSkKLSAgewotICAgIERpbWVuc2lvbiBwcmVmZXJyZWRTaXplID0gY2FsY3VsYXRlUHJlZmVycmVkQ2xpZW50QXJlYVNpemUoZmlndXJlKTsKLSAgICBSZWN0YW5nbGUgciA9IGZpZ3VyZS5nZXRDbGllbnRBcmVhKCkuZ2V0Q29weSgpOwotICAgIExpc3QgY2hpbGRyZW4gPSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKTsKLQotICAgIGludCBuQ2hpbGRyZW4gPSBjaGlsZHJlbi5zaXplKCk7Ci0gICAgaW50IGV4dHJhSG9yaXpvbnRhbFNwYWNlID0gci53aWR0aCAtIHByZWZlcnJlZFNpemUud2lkdGg7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKSBpLm5leHQoKTsKLSAgICAgIERpbWVuc2lvbiBwcmVmZXJyZWRDaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0KLSAgICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgICB7Ci0gICAgICAgIGludCB3ID0gcHJlZmVycmVkQ2hpbGRTaXplLndpZHRoICsgKGV4dHJhSG9yaXpvbnRhbFNwYWNlIC8gbkNoaWxkcmVuKTsKLSAgICAgICAgY2hpbGQuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoci54LCByLnksIHcsIE1hdGgubWF4KHByZWZlcnJlZFNpemUuaGVpZ2h0LCByLmhlaWdodCkpKTsKLSAgICAgICAgci54ICs9IHcgKyBzcGFjaW5nOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjaGlsZC5zZXRCb3VuZHMobmV3IFJlY3RhbmdsZShyLngsIHIueSwgTWF0aC5tYXgocHJlZmVycmVkU2l6ZS53aWR0aCwgci53aWR0aCksIHByZWZlcnJlZENoaWxkU2l6ZS5oZWlnaHQpKTsKLSAgICAgICAgci55ICs9IHByZWZlcnJlZENoaWxkU2l6ZS5oZWlnaHQgKyBzcGFjaW5nOwotICAgICAgfQotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9sYXlvdXRzL01vZGVsR3JvdXBMYXlvdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9sYXlvdXRzL01vZGVsR3JvdXBMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlmN2I3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vbGF5b3V0cy9Nb2RlbEdyb3VwTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmxheW91dHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLk1vZGVsR3JvdXBGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5TcGFjaW5nRmlndXJlOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxHcm91cExheW91dCBleHRlbmRzIEFic3RyYWN0TGF5b3V0Ci17Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzSG9yaXpvbnRhbDsKLSAgcHJvdGVjdGVkIGludCBzcGFjaW5nID0gMTA7Ci0gIHByb3RlY3RlZCBpbnQgYm9yZGVyID0gMDsKLQotICBwdWJsaWMgTW9kZWxHcm91cExheW91dCgpCi0gIHsKLSAgICB0aGlzKDApOwotICB9Ci0KLSAgcHVibGljIE1vZGVsR3JvdXBMYXlvdXQoYm9vbGVhbiBpc0hvcml6b250YWwpCi0gIHsKLSAgICB0aGlzLmlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbDsKLSAgfQotCi0gIHB1YmxpYyBNb2RlbEdyb3VwTGF5b3V0KGJvb2xlYW4gaXNIb3Jpem9udGFsLCBpbnQgc3BhY2luZykKLSAgewotICAgIHRoaXMuaXNIb3Jpem9udGFsID0gaXNIb3Jpem9udGFsOwotICAgIHRoaXMuc3BhY2luZyA9IHNwYWNpbmc7Ci0gIH0KLQotICBwdWJsaWMgTW9kZWxHcm91cExheW91dChpbnQgc3BhY2luZykKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5zcGFjaW5nID0gc3BhY2luZzsKLSAgfQotCi0gIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShJRmlndXJlIGNvbnRhaW5lciwgaW50IHdIaW50LCBpbnQgaEhpbnQpCi0gIHsKLSAgICBEaW1lbnNpb24gcHJlZmVycmVkID0gbmV3IERpbWVuc2lvbigpOwotICAgIExpc3QgY2hpbGRyZW4gPSBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKSBjaGlsZHJlbi5nZXQoaSk7Ci0KLSAgICAgIERpbWVuc2lvbiBjaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0KLSAgICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgICB7Ci0gICAgICAgIHByZWZlcnJlZC53aWR0aCArPSBjaGlsZFNpemUud2lkdGg7Ci0gICAgICAgIHByZWZlcnJlZC5oZWlnaHQgPSBNYXRoLm1heChwcmVmZXJyZWQuaGVpZ2h0LCBjaGlsZFNpemUuaGVpZ2h0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcHJlZmVycmVkLmhlaWdodCArPSBjaGlsZFNpemUuaGVpZ2h0OwotICAgICAgICBwcmVmZXJyZWQud2lkdGggPSBNYXRoLm1heChwcmVmZXJyZWQud2lkdGgsIGNoaWxkU2l6ZS53aWR0aCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaW50IGNoaWxkcmVuU2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsKLSAgICBpZiAoY2hpbGRyZW5TaXplID4gMSkKLSAgICB7Ci0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgewotICAgICAgICBwcmVmZXJyZWQud2lkdGggKz0gc3BhY2luZyAqIChjaGlsZHJlblNpemUgLSAxKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcHJlZmVycmVkLmhlaWdodCArPSBzcGFjaW5nICogKGNoaWxkcmVuU2l6ZSAtIDEpOwotICAgICAgfQotICAgIH0KLQotICAgIHByZWZlcnJlZC53aWR0aCArPSBib3JkZXIgKiAyOwotICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gYm9yZGVyICogMjsKLSAgICBwcmVmZXJyZWQud2lkdGggKz0gY29udGFpbmVyLmdldEluc2V0cygpLmdldFdpZHRoKCk7Ci0gICAgcHJlZmVycmVkLmhlaWdodCArPSBjb250YWluZXIuZ2V0SW5zZXRzKCkuZ2V0SGVpZ2h0KCk7Ci0KLSAgICByZXR1cm4gcHJlZmVycmVkOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbGF5b3V0KElGaWd1cmUgY29udGFpbmVyKQotICB7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IGNvbnRhaW5lci5nZXRDaGlsZHJlbigpOwotCi0gICAgaW50IHJ4ID0gMDsKLSAgICBEaW1lbnNpb24gZGltZW5zaW9uID0gbmV3IERpbWVuc2lvbigpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpIGNoaWxkcmVuLmdldChpKTsKLSAgICAgIERpbWVuc2lvbiBjaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgewotICAgICAgICBkaW1lbnNpb24uaGVpZ2h0ID0gTWF0aC5tYXgoZGltZW5zaW9uLmhlaWdodCwgY2hpbGRTaXplLmhlaWdodCk7Ci0gICAgICAgIHJ4ICs9IGNoaWxkU2l6ZS53aWR0aDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZGltZW5zaW9uLndpZHRoID0gTWF0aC5tYXgoZGltZW5zaW9uLndpZHRoLCBjaGlsZFNpemUud2lkdGgpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgewotICAgICAgZGltZW5zaW9uLmhlaWdodCArPSBib3JkZXIgKiAyOwotICAgICAgZGltZW5zaW9uLndpZHRoICs9IGJvcmRlcjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGRpbWVuc2lvbi53aWR0aCArPSBib3JkZXIgKiAyOwotICAgICAgZGltZW5zaW9uLmhlaWdodCArPSBib3JkZXI7Ci0gICAgfQotCi0gICAgUmVjdGFuZ2xlIHIgPSBjb250YWluZXIuZ2V0Q2xpZW50QXJlYSgpOwotICAgIGRpbWVuc2lvbiA9IG5ldyBEaW1lbnNpb24oci53aWR0aCwgci5oZWlnaHQpOwotICAgIFBvaW50IHAgPSBuZXcgUG9pbnQoMCwgMCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKSBpLm5leHQoKTsKLSAgICAgIERpbWVuc2lvbiBjaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0KLSAgICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgICB7Ci0gICAgICAgIFJlY3RhbmdsZSByZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlKHAueCwgMCwgY2hpbGRTaXplLndpZHRoLCBjaGlsZFNpemUuaGVpZ2h0KTsKLQotICAgICAgICAvLyBsYXN0IGNoaWxkCi0gICAgICAgIGlmICghaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZWN0YW5nbGUud2lkdGggPSBkaW1lbnNpb24ud2lkdGggLSByZWN0YW5nbGUueDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwLnggPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlY3RhbmdsZS55ID0gci5oZWlnaHQgLyAyIC0gY2hpbGRTaXplLmhlaWdodCAvIDI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmVjdGFuZ2xlLnkgPSByLmhlaWdodCAvIDIgLSBjaGlsZFNpemUuaGVpZ2h0IC8gMjsKLSAgICAgICAgfQotCi0gICAgICAgIHJlY3RhbmdsZS50cmFuc2xhdGUoY29udGFpbmVyLmdldENsaWVudEFyZWEoKS5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgY2hpbGQuc2V0Qm91bmRzKHJlY3RhbmdsZSk7Ci0gICAgICAgIHAueCArPSBjaGlsZFNpemUud2lkdGg7Ci0gICAgICAgIHAueCArPSBzcGFjaW5nOwotCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFJlY3RhbmdsZSByZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlKDAsIHAueSwgY2hpbGRTaXplLndpZHRoLCBjaGlsZFNpemUuaGVpZ2h0KTsKLQotICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBTcGFjaW5nRmlndXJlKQotICAgICAgICB7Ci0gICAgICAgICAgcmVjdGFuZ2xlLnggPSBkaW1lbnNpb24ud2lkdGggKyA2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgTW9kZWxHcm91cEZpZ3VyZSkKLSAgICAgICAgewotICAgICAgICAgIHJlY3RhbmdsZS53aWR0aCA9IGRpbWVuc2lvbi53aWR0aCAtIHJlY3RhbmdsZS54OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlY3RhbmdsZS53aWR0aCA9IGRpbWVuc2lvbi53aWR0aCAtIHJlY3RhbmdsZS54OwotICAgICAgICB9Ci0KLSAgICAgICAgcmVjdGFuZ2xlLnRyYW5zbGF0ZShjb250YWluZXIuZ2V0Q2xpZW50QXJlYSgpLmdldExvY2F0aW9uKCkpOwotICAgICAgICBjaGlsZC5zZXRCb3VuZHMocmVjdGFuZ2xlKTsKLSAgICAgICAgcC55ICs9IGNoaWxkU2l6ZS5oZWlnaHQ7Ci0gICAgICAgIHAueSArPSBzcGFjaW5nOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNwYWNpbmcoaW50IHNwYWNpbmcpCi0gIHsKLSAgICB0aGlzLnNwYWNpbmcgPSBzcGFjaW5nOwotICB9Ci0KLSAgcHJvdGVjdGVkIGludCBhbGlnbkZpZ3VyZShJRmlndXJlIHBhcmVudCwgSUZpZ3VyZSBjaGlsZCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9CdWlsdEluVHlwZXNUcmVlVmlld2VyUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvQnVpbHRJblR5cGVzVHJlZVZpZXdlclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwY2VjYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9CdWlsdEluVHlwZXNUcmVlVmlld2VyUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIAotICogICAgIFRydW5nIGRlIElyZW5lIDx0cnVuZ2hhQGNhLmlibS5jb20+Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBjb250ZW50IGZvciBTZWxlY3RCdWlsdEluVHlwZXNGb3JGaWx0ZXJEaWFsb2cKLSAqIHJlYWRhYmlsaXR5IFdhcm5pbmc6IFNvbWUgc2ltcGxlIHRyaWNrcyB0byB0d2VhayBlZmZpY2llbmN5IGFyZSB1c2VkCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWlsdEluVHlwZXNUcmVlVmlld2VyUHJvdmlkZXIgewotCQotCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0JCi0JSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCQotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUX1BBUkVOVCA9ICJwYXJlbnQiOwotCQotCS8qKgotCSAqIEN1cnJlbnRseSB0aGVyZSBhcmUgMyBzdWJncm91cHM6IE51bWJlcnMsIERhdGEgYW5kIFRpbWUsIE90aGVyCi0JICogRm9sa3MgY2FuIGNob29zZSB0byBleHBhbmQgdG8gbW9yZSBzdWJncm91cHMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgQlVJTFRfSU5fVFlQRVNfU1VCX0dST1VQID0gMzsKLQkKLSAgICBzdGF0aWMgU3RyaW5nW10gbnVtYmVyVHlwZXMgPSAKLSAgICAJeyAiYmFzZTY0QmluYXJ5IiwgImJ5dGUiLCAiZGVjaW1hbCIsICJkb3VibGUiLCAiZmxvYXQiLCAiaGV4QmluYXJ5IiwKLSAgICAJICAiaW50IiwgImludGVnZXIiLCAibG9uZyIsICJuZWdhdGl2ZUludGVnZXIiLCAibm9uTmVnYXRpdmVJbnRlZ2VyIiwKLSAgICAJICAibm9uUG9zaXRpdmVJbnRlZ2VyIiwgInBvc2l0aXZlSW50ZWdlciIsICJzaG9ydCIsICJ1bnNpZ25lZEJ5dGUiLAotICAgIAkgICJ1bnNpZ25lZEludCIsICJ1bnNpZ25lZExvbmciLCAidW5zaWduZWRTaG9ydCJ9OwotICAgIAotICAgIHN0YXRpYyBTdHJpbmdbXSBkYXRlQW5kVGltZVR5cGVzID0KLSAgICAJeyAiZGF0ZSIsICJkYXRlVGltZSIsICJkdXJhdGlvbiIsICJnRGF5IiwKLSAgICAJICAiZ01vbnRoIiwgImdNb250aERheSIsICJnWWVhciIsICJnWWVhck1vbnRoIiwgInRpbWUifTsKLQkKLQkKLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsQnVpbHRJblR5cGVzKCkgewotICAgICAgICBMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAvL2ZvciAoaW50IGkgPSAwOyBpIDwgWFNERE9NSGVscGVyLmRhdGFUeXBlLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIC8vICBpdGVtcy5hZGQoWFNERE9NSGVscGVyLmRhdGFUeXBlW2ldWzBdKTsKLSAgICAgICAgLy99Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgbWFpbkNvbnRhaW5lciA9IG5ldyBBcnJheUxpc3QoQlVJTFRfSU5fVFlQRVNfU1VCX0dST1VQKTsKLSAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBoZWFkZXIgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbigiIiwgIlJvb3QiLCBudWxsKTsKLSAgICAgICAgbWFpbkNvbnRhaW5lci5hZGQoaGVhZGVyKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgbnVtYmVyc0dyb3VwID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBoZWFkZXIgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbigiIiwgIk51bWJlcnMiLCBudWxsKTsKLSAgICAgICAgbnVtYmVyc0dyb3VwLmFkZChoZWFkZXIpOwotICAgICAgICBtYWluQ29udGFpbmVyLmFkZChudW1iZXJzR3JvdXApOwotICAgICAgICAKLSAgICAgICAgTGlzdCBkYXRlQW5kVGltZUdyb3VwID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBoZWFkZXIgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbigiIiwgIkRhdGUgYW5kIFRpbWUiLCBudWxsKTsKLSAgICAgICAgZGF0ZUFuZFRpbWVHcm91cC5hZGQoaGVhZGVyKTsKLSAgICAgICAgbWFpbkNvbnRhaW5lci5hZGQoZGF0ZUFuZFRpbWVHcm91cCk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IG90aGVyR3JvdXAgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGhlYWRlciA9IG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKCIiLCAiT3RoZXIiLCBudWxsKTsKLSAgICAgICAgb3RoZXJHcm91cC5hZGQoaGVhZGVyKTsKLSAgICAgICAgbWFpbkNvbnRhaW5lci5hZGQob3RoZXJHcm91cCk7Ci0KLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAJT2JqZWN0IGl0ZW0gPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGl0ZW0udG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBidWlsdEluVHlwZUl0ZW0gPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihuYW1lLCBYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsIG51bGwpOwotICAgICAgICAgIAotICAgICAgICAgICAgLy8gaWYgdGhpcyBidWlsdC1JbiBUeXBlIGlzIGluIE51bWJlciBncm91cCAKLSAgICAgICAgICAgIGlmICggcGFydE9mKG5hbWUsIG51bWJlclR5cGVzKSApewotICAgICAgICAgICAgCS8vIFNldCBwYXJlbnQKLSAgICAgICAgICAgIAkvL2J1aWx0SW5UeXBlSXRlbS5hZGRBdHRyaWJ1dGVJbmZvKENPTlNUX1BBUkVOVCwgbnVtYmVyc0dyb3VwKTsKLSAgICAgICAgICAgIAkKLSAgICAgICAgICAgIAludW1iZXJzR3JvdXAuYWRkKGJ1aWx0SW5UeXBlSXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBpZiB0aGlzIGJ1aWx0LUluIFR5cGUgaXMgaW4gRGF0ZS1hbmQtVGltZSBncm91cCAKLSAgICAgICAgICAgIGVsc2UgaWYgKCBwYXJ0T2YobmFtZSwgZGF0ZUFuZFRpbWVUeXBlcykpewotICAgICAgICAgICAgCS8vYnVpbHRJblR5cGVJdGVtLmFkZEF0dHJpYnV0ZUluZm8oQ09OU1RfUEFSRU5ULCBkYXRlQW5kVGltZUdyb3VwKTsKLSAgICAgICAgICAgIAlkYXRlQW5kVGltZUdyb3VwLmFkZChidWlsdEluVHlwZUl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBwdXQgaW4gT3RoZXIgZ3JvdXAKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgCS8vYnVpbHRJblR5cGVJdGVtLmFkZEF0dHJpYnV0ZUluZm8oQ09OU1RfUEFSRU5ULCBvdGhlckdyb3VwKTsKLSAgICAgICAgICAgIAlvdGhlckdyb3VwLmFkZChidWlsdEluVHlwZUl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1haW5Db250YWluZXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCl7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKLQkJCi0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgQnVpbHRJblR5cGVMYWJlbFByb3ZpZGVyKCk7Ci0JCXJldHVybiBsYWJlbFByb3ZpZGVyOwotCX0KLQkKLQlwdWJsaWMgSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gY29udGVudFByb3ZpZGVyOwotCQkKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEJ1aWx0SW5UeXBlc1RyZWVDb250ZW50UHJvdmlkZXIoKTsKLQkJcmV0dXJuIGNvbnRlbnRQcm92aWRlcjsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGVxdWl2YWxlbnQgb2YgJ2l0ZW0nIGFwcGVhcnMgaW4gJ2FycmF5JwotCSAqIEBwYXJhbSBpdGVtCi0JICogQHBhcmFtIGFycmF5Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcGFydE9mKFN0cmluZyBpdGVtLCBTdHJpbmdbXSBhcnJheSl7Ci0JICAgIGZvcihpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKyApewotCSAgICAJaWYgKCBpdGVtLmVxdWFscyhhcnJheVtpXSkgKXsKLQkgICAgCQlyZXR1cm4gdHJ1ZTsKLQkgICAgCX0gICAgICAgICAgICAJCQotCSAgICB9Ci0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0JCi0JY2xhc3MgQnVpbHRJblR5cGVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXJ7Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewkJCQotCQkJaWYgKCBnZXRUZXh0KGVsZW1lbnQpLmVxdWFscygiTnVtYmVycyIpICkKLQkJCQlyZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0ROdW1iZXJUeXBlcy5naWYiKTsKLQkJCWlmICggZ2V0VGV4dChlbGVtZW50KS5lcXVhbHMoIkRhdGUgYW5kIFRpbWUiKSApCi0JCQkJcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNERGF0ZUFuZFRpbWVUeXBlcy5naWYiKTsKLQkJCWlmICggZ2V0VGV4dChlbGVtZW50KS5lcXVhbHMoIk90aGVyIikgKQotCQkJCXJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL2Jyb3dzZWJ1dHRvbi5naWYiKTsKLQkJCWlmICggZWxlbWVudCBpbnN0YW5jZW9mIENvbXBvbmVudFNwZWNpZmljYXRpb24gKXsKLQkJCQlyZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVUeXBlLmdpZiIpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCUNvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IG51bGw7Ci0JCQkKLQkJCS8qIGlmIG5vdCBub24tbGVhZiBub2RlLCB0aGUgZmlyc3QgZWxlbWVudCBoYXMgdGhlIG5hbWUgZm9yIAotCQkJICogdGhlIHdob2xlIGxpc3QgKi8KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlzdCl7Ci0JCQkJc3BlYyA9IChDb21wb25lbnRTcGVjaWZpY2F0aW9uKSAoKExpc3QpIGVsZW1lbnQpLmdldCgwKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wb25lbnRTcGVjaWZpY2F0aW9uICl7Ci0JCQkJc3BlYyA9IChDb21wb25lbnRTcGVjaWZpY2F0aW9uKSBlbGVtZW50OwotCQkJfQotCQkJcmV0dXJuIHNwZWMuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQotCQl9ICAKLQkJCi0JfQotCi0KLQljbGFzcyBCdWlsdEluVHlwZXNUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJTGlzdCBwYXJlbnRDb250ZW50ID0gKExpc3QpIHBhcmVudEVsZW1lbnQ7Ci0JCQkJCi0JCQkJLyoqIElnbm9yZSB0aGUgZmlyc3QgZWxlbWVudCAod2hpY2ggY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyBsaXN0Ci0JCQkJICogaWUuICdOdW1iZXJzJywgJ0RhdGUgYW5kIHRpbWUnLCAnT3RoZXInKSAqLwotCQkJCXJldHVybiBwYXJlbnRDb250ZW50LnN1Ykxpc3QoMSwgcGFyZW50Q29udGVudC5zaXplKCkpLnRvQXJyYXkoKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJICAgIHJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAxKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL0lPcGVuSW5OZXdFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvSU9wZW5Jbk5ld0VkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTJjNTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvSU9wZW5Jbk5ld0VkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotcHVibGljIGludGVyZmFjZSBJT3BlbkluTmV3RWRpdG9yCi17Ci0gIHB1YmxpYyB2b2lkIG9wZW5YU0RFZGl0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3QXR0cmlidXRlRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0F0dHJpYnV0ZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjAyOTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3QXR0cmlidXRlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guSVhTRFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIE5ld0F0dHJpYnV0ZURpYWxvZyBleHRlbmRzIE5ld0NvbXBvbmVudERpYWxvZyBpbXBsZW1lbnRzIElDb21wb25lbnREaWFsb2cKLXsKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSBzY2hlbWE7Ci0gIHByb3RlY3RlZCBPYmplY3Qgc2V0T2JqZWN0OwotICBwcm90ZWN0ZWQgaW50IHR5cGVLaW5kOwotICBwcm90ZWN0ZWQgT2JqZWN0IHNlbGVjdGlvbjsKLQotICBwdWJsaWMgTmV3QXR0cmlidXRlRGlhbG9nKCkKLSAgewotICAgIHN1cGVyKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIE1lc3NhZ2VzLl9VSV9MQUJFTF9ORVdfQVRUUklCVVRFLCAiTmV3QXR0cmlidXRlIik7ICAgICAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgTmV3QXR0cmlidXRlRGlhbG9nKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBzdXBlcihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBNZXNzYWdlcy5fVUlfTEFCRUxfTkVXX0FUVFJJQlVURSwgIk5ld0F0dHJpYnV0ZSIpOyAgICAgLy8kTk9OLU5MUy0xJAotICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0dXAoKSB7Ci0gICAgaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0gICAgICBMaXN0IHVzZWROYW1lcyA9IGdldFVzZWRFbGVtZW50TmFtZXMoKTsKLSAgICAgIHNldFVzZWROYW1lcyh1c2VkTmFtZXMpOwotICAgICAgc2V0RGVmYXVsdE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZSgiTmV3QXR0cmlidXRlIiwgc2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgaW50IGNyZWF0ZUFuZE9wZW4oKQotICB7Ci0gIHNldHVwKCk7Ci0gICAgaW50IHJldHVybkNvZGUgPSBzdXBlci5jcmVhdGVBbmRPcGVuKCk7Ci0gICAgaWYgKHJldHVybkNvZGUgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc2V0T2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICAgIHsgIAotICAgICAgICAvL0NvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kKGdldE5hbWUoKSwgc2NoZW1hKTsKLSAgICAgIH0gICAgICAgIAotICAgIH0gIAotICAgIHJldHVybiByZXR1cm5Db2RlOwotICB9Ci0KLSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0U2VsZWN0ZWRDb21wb25lbnQoKQotICB7Ci0gICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gIG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKG51bGwsIGdldE5hbWUoKSwgbnVsbCk7ICAgIAotICAgIGNvbXBvbmVudFNwZWNpZmljYXRpb24uc2V0TWV0YU5hbWUoSVhTRFNlYXJjaENvbnN0YW50cy5BVFRSSUJVVEVfTUVUQV9OQU1FKTsKLSAgICBjb21wb25lbnRTcGVjaWZpY2F0aW9uLnNldE5ldyh0cnVlKTsKLSAgICByZXR1cm4gY29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICB9Ci0gIAotICBwcml2YXRlIExpc3QgZ2V0VXNlZEVsZW1lbnROYW1lcygpIHsKLSAgICBMaXN0IHVzZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsgICAgIAotICAgIGlmIChzY2hlbWEgIT0gbnVsbCApIHsKLSAgICAgIExpc3QgZWxlbWVudHNMaXN0ID0gc2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOwotICAgICAgSXRlcmF0b3IgZWxlbWVudHMgPSBlbGVtZW50c0xpc3QuaXRlcmF0b3IoKTsgCi0gICAgICB3aGlsZSAoZWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgIHVzZWROYW1lcy5hZGQoKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgZWxlbWVudHMubmV4dCgpKS5nZXROYW1lKCkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdXNlZE5hbWVzOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3Q29tcG9uZW50RGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0NvbXBvbmVudERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTBjNDllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3Q29tcG9uZW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci0KLXB1YmxpYyBjbGFzcyBOZXdDb21wb25lbnREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgVGV4dCBuYW1lRmllbGQ7IAotICBwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLSAgcHJvdGVjdGVkIExhYmVsIGVycm9yTWVzc2FnZUxhYmVsOwotICBwcm90ZWN0ZWQgTGlzdCB1c2VkTmFtZXM7Ci0KLSAgcHVibGljIE5ld0NvbXBvbmVudERpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVmYXVsdE5hbWUpIAotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgIHNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0gICAgbmFtZSA9IGRlZmF1bHROYW1lOyAgICAgIAotICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKLSAgfQotICAKLSAgcHVibGljIE5ld0NvbXBvbmVudERpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVmYXVsdE5hbWUsIExpc3QgdXNlZE5hbWVzKSAKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICBzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotICAgIG5hbWUgPSBkZWZhdWx0TmFtZTsgICAgICAKLSAgICB0aGlzLnRpdGxlID0gdGl0bGU7Ci0gICAgdGhpcy51c2VkTmFtZXMgPSB1c2VkTmFtZXM7Ci0gIH0KLQotICBwdWJsaWMgaW50IGNyZWF0ZUFuZE9wZW4oKQotICB7Ci0gICAgY3JlYXRlKCk7Ci0gICAgZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLSAgICBzZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICByZXR1cm4gb3BlbigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgIAotICB7Ci0gICAgQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLSAgICBuYW1lRmllbGQuZm9yY2VGb2N1cygpOwotICAgIG5hbWVGaWVsZC5zZWxlY3RBbGwoKTsgIAotICAgIHVwZGF0ZUVycm9yTWVzc2FnZSgpOwotICAgIHJldHVybiBjb250cm9sOwotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0gICAgb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLSAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUhlYWRlckNvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeHRlbmRlZENvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSAKLSAgewotICAgIENvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgCi0gICAgY3JlYXRlSGVhZGVyQ29udGVudChkaWFsb2dBcmVhKTsKLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZ2RGaWxsPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZEZpbGwuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZEZpbGwuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICBnZEZpbGwudmVydGljYWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2RGaWxsLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSB0cnVlOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkRmlsbCk7Ci0KLSAgICBMYWJlbCBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgbmFtZUxhYmVsLnNldFRleHQoTWVzc2FnZXMuVUlfTEFCRUxfTkFNRSk7Ci0KLSAgICBuYW1lRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICBHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIGdkLndpZHRoSGludCA9IDIwMDsKLSAgICBuYW1lRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgbmFtZUZpZWxkLnNldFRleHQobmFtZSk7Ci0gICAgbmFtZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmFtZUZpZWxkLCBYU0RFZGl0b3JDU0hlbHBJZHMuTkVXVFlQRV9OQU1FKTsKLQotICAgIGNyZWF0ZUV4dGVuZGVkQ29udGVudChkaWFsb2dBcmVhKTsKLQotICAgIC8vIGVycm9yIG1lc3NhZ2UKLSAgICBlcnJvck1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0gICAgZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dCgiZXJyb3IgbWVzc2FnZSBnb2VzIGhlcmUiKTsKLSAgICBHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZDIuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZDIuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICBnZDIud2lkdGhIaW50ID0gMjAwOwotICAgIGVycm9yTWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZ2QyKTsgICAgICAgICAgCi0vLyAgICBDb2xvciBjb2xvciA9IG5ldyBDb2xvcihlcnJvck1lc3NhZ2VMYWJlbC5nZXREaXNwbGF5KCksIDIwMCwgMCwgMCk7Ci0vLyAgICBlcnJvck1lc3NhZ2VMYWJlbC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQotICAgIHJldHVybiBkaWFsb2dBcmVhOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0gIH0gICAgICAgIAotCi0gIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZShTdHJpbmcgbmFtZSkKLSAgewotICAJaWYgKHVzZWROYW1lcyA9PSBudWxsKQotICAJCXJldHVybiBudWxsOwotICAJCi0gIAlJdGVyYXRvciBpdGVyYXRvciA9IHVzZWROYW1lcy5pdGVyYXRvcigpOwotICAJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZykgaXRlcmF0b3IubmV4dCgpKSkgewotICAJCQlyZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfRVJST1JfTkFNRV9BTFJFQURZX1VTRUQ7IC8vJE5PTi1OTFMtMSQKLSAgCQl9Ci0gIAl9Ci0gIAkKLSAgCXJldHVybiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkKLSAgeyAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0gICAgU3RyaW5nIG5hbWUgPSBuYW1lRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICBpZiAobmFtZS5sZW5ndGgoKSA+IDApCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBlcnJvck1lc3NhZ2UgPSBjb21wdXRlRXJyb3JNZXNzYWdlKG5hbWUpOwotICAgIH0gICAKLSAgICBlbHNlCi0gICAgewotICAgICAgZXJyb3JNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9ICAKLSAgICBlcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSAhPSBudWxsID8gZXJyb3JNZXNzYWdlIDogIiIpOyAvLyROT04tTkxTLTEkCi0gICAgb2tCdXR0b24uc2V0RW5hYmxlZChlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIAotICB7Ci0gICAgaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0gICAgewotICAgICAgbmFtZSA9IG5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0gICAgfQotICAgIHN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRVc2VkTmFtZXMoTGlzdCB1c2VkTmFtZXMpIHsKLQkgIHRoaXMudXNlZE5hbWVzID0gdXNlZE5hbWVzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShTdHJpbmcgbmFtZSkgewotCSAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0VsZW1lbnRCdXR0b25IYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0VsZW1lbnRCdXR0b25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljODM1NzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdFbGVtZW50QnV0dG9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSU5ld0NvbXBvbmVudEhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBOZXdFbGVtZW50QnV0dG9uSGFuZGxlciBpbXBsZW1lbnRzIElOZXdDb21wb25lbnRIYW5kbGVyCi17Ci0gIHB1YmxpYyBOZXdFbGVtZW50QnV0dG9uSGFuZGxlcigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG9wZW5OZXdDb21wb25lbnREaWFsb2coKQotICB7Ci0gICAgTmV3RWxlbWVudERpYWxvZyBuZXdFbGVtZW50RGlhbG9nID0gbmV3IE5ld0VsZW1lbnREaWFsb2coKTsKLSAgICBuZXdFbGVtZW50RGlhbG9nLmNyZWF0ZUFuZE9wZW4oKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdFbGVtZW50RGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0VsZW1lbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwNjE5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0VsZW1lbnREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIE5ld0VsZW1lbnREaWFsb2cgZXh0ZW5kcyBOZXdDb21wb25lbnREaWFsb2cgaW1wbGVtZW50cyBJQ29tcG9uZW50RGlhbG9nCi17Ci0JICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHNjaGVtYTsKLQkgIHByb3RlY3RlZCBPYmplY3Qgc2V0T2JqZWN0OwotCSAgcHJvdGVjdGVkIGludCB0eXBlS2luZDsKLQkgIHByb3RlY3RlZCBPYmplY3Qgc2VsZWN0aW9uOwotCi0JICBwdWJsaWMgTmV3RWxlbWVudERpYWxvZygpCi0JICB7Ci0JICAgIHN1cGVyKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIE1lc3NhZ2VzLl9VSV9MQUJFTF9ORVdfRUxFTUVOVCwgIk5ld0VsZW1lbnQiKTsgICAgIC8vJE5PTi1OTFMtMSQKLQkgIH0KLQotCSAgcHVibGljIE5ld0VsZW1lbnREaWFsb2coWFNEU2NoZW1hIHNjaGVtYSkKLQkgIHsKLQkgICAgc3VwZXIoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgTWVzc2FnZXMuX1VJX0xBQkVMX05FV19FTEVNRU5ULCAiTmV3RWxlbWVudCIpOyAgICAgLy8kTk9OLU5MUy0xJAotCSAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLQkgIH0KLQkgIAotCSAgcHJpdmF0ZSB2b2lkIHNldHVwKCkgewotCQkgIGlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJICBMaXN0IHVzZWROYW1lcyA9IGdldFVzZWRFbGVtZW50TmFtZXMoKTsKLQkJCSAgc2V0VXNlZE5hbWVzKHVzZWROYW1lcyk7Ci0JCQkgIHNldERlZmF1bHROYW1lKFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoIk5ld0VsZW1lbnQiLCBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpKSk7Ci0JCSAgfQotCSAgfQotCSAgCi0JICBwdWJsaWMgaW50IGNyZWF0ZUFuZE9wZW4oKQotCSAgewotCQlzZXR1cCgpOwotCSAgICBpbnQgcmV0dXJuQ29kZSA9IHN1cGVyLmNyZWF0ZUFuZE9wZW4oKTsKLQkgICAgaWYgKHJldHVybkNvZGUgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChzZXRPYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyKQotCSAgICAgIHsgIAotCSAgICAgICAgLy9Db21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZChnZXROYW1lKCksIHNjaGVtYSk7Ci0JICAgICAgfSAgICAgICAgCi0JICAgIH0gIAotCSAgICByZXR1cm4gcmV0dXJuQ29kZTsKLQkgIH0KLQotCSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0U2VsZWN0ZWRDb21wb25lbnQoKQotCSAgewotCSAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSAgbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24obnVsbCwgZ2V0TmFtZSgpLCBudWxsKTsgICAgCi0JICAgIGNvbXBvbmVudFNwZWNpZmljYXRpb24uc2V0TWV0YU5hbWUoSVhTRFNlYXJjaENvbnN0YW50cy5FTEVNRU5UX01FVEFfTkFNRSk7Ci0JICAgIGNvbXBvbmVudFNwZWNpZmljYXRpb24uc2V0TmV3KHRydWUpOwotCSAgICByZXR1cm4gY29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLQkgIH0KLQotCSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24pCi0JICB7Ci0JICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkgIH0KLQkgIAotCSAgcHJpdmF0ZSBMaXN0IGdldFVzZWRFbGVtZW50TmFtZXMoKSB7Ci0JCSAgTGlzdCB1c2VkTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7CQkgIAotCQkgIGlmIChzY2hlbWEgIT0gbnVsbCApIHsKLQkJCSAgTGlzdCBlbGVtZW50c0xpc3QgPSBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpOwotCQkJICBJdGVyYXRvciBlbGVtZW50cyA9IGVsZW1lbnRzTGlzdC5pdGVyYXRvcigpOyAKLQkJCSAgd2hpbGUgKGVsZW1lbnRzLmhhc05leHQoKSkgewotCQkJCSAgdXNlZE5hbWVzLmFkZCgoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudHMubmV4dCgpKS5nZXROYW1lKCkpOwotCQkJICB9Ci0JCSAgfQotCQkgIAotCQkgIHJldHVybiB1c2VkTmFtZXM7Ci0JICB9Ci0JfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdUeXBlQnV0dG9uSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdUeXBlQnV0dG9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE1YTg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3VHlwZUJ1dHRvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklOZXdDb21wb25lbnRIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgTmV3VHlwZUJ1dHRvbkhhbmRsZXIgaW1wbGVtZW50cyBJTmV3Q29tcG9uZW50SGFuZGxlcgotewotICBwdWJsaWMgTmV3VHlwZUJ1dHRvbkhhbmRsZXIoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBvcGVuTmV3Q29tcG9uZW50RGlhbG9nKCkKLSAgewotICAgIE5ld1R5cGVEaWFsb2cgbmV3VHlwZURpYWxvZyA9IG5ldyBOZXdUeXBlRGlhbG9nKCk7Ci0gICAgbmV3VHlwZURpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld1R5cGVEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3VHlwZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWZlYzYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3VHlwZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLklYU0RTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBOZXdUeXBlRGlhbG9nIGV4dGVuZHMgTmV3Q29tcG9uZW50RGlhbG9nIGltcGxlbWVudHMgSUNvbXBvbmVudERpYWxvZwotewotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHNjaGVtYTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgU0lNUExFX1RZUEUgPSAwOwotICBwcm90ZWN0ZWQgc3RhdGljIGludCBDT01QTEVYX1RZUEUgPSAxOwotICBwcm90ZWN0ZWQgT2JqZWN0IHNldE9iamVjdDsKLSAgcHJvdGVjdGVkIGludCB0eXBlS2luZDsKLSAgcHJvdGVjdGVkIE9iamVjdCBzZWxlY3Rpb247Ci0gIHByb3RlY3RlZCBib29sZWFuIGFsbG93Q29tcGxleFR5cGUgPSB0cnVlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd0Fub255bW91c1R5cGUgPSB0cnVlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBhbm9ueW1vdXNUeXBlID0gZmFsc2U7Ci0gIHByaXZhdGUgQnV0dG9uIGNvbXBsZXhUeXBlQnV0dG9uOwotICBwcml2YXRlIEJ1dHRvbiBzaW1wbGVUeXBlQnV0dG9uOwotICBwcml2YXRlIEJ1dHRvbiBhbm9ueW1vdXNUeXBlQ2hlY2tCb3g7Ci0KLSAgcHVibGljIE5ld1R5cGVEaWFsb2coKQotICB7Ci0gICAgc3VwZXIoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgTWVzc2FnZXMuX1VJX0xBQkVMX05FV19UWVBFLCAiTmV3VHlwZSIpOyAgICAgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIE5ld1R5cGVEaWFsb2coWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHN1cGVyKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIE1lc3NhZ2VzLl9VSV9MQUJFTF9ORVdfVFlQRSwgIk5ld1R5cGUiKTsgICAgIC8vJE5PTi1OTFMtMSQKLSAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldHVwKCkgewotCSAgaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCSAgTGlzdCB1c2VkTmFtZXMgPSBnZXRVc2VkVHlwZU5hbWVzKCk7Ci0JCSAgc2V0VXNlZE5hbWVzKHVzZWROYW1lcyk7Ci0JCSAgc2V0RGVmYXVsdE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZShuYW1lLCBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkpKTsKLQkgIH0KLSAgfQotICAKLSAgcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkKLSAgewotCXNldHVwKCk7Ci0gICAgaW50IHJldHVybkNvZGUgPSBzdXBlci5jcmVhdGVBbmRPcGVuKCk7Ci0gICAgaWYgKHJldHVybkNvZGUgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc2V0T2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICAgIHsgIAotICAgICAgICAvL0NvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kKGdldE5hbWUoKSwgc2NoZW1hKTsKLSAgICAgIH0gICAgICAgIAotICAgIH0gIAotICAgIHJldHVybiByZXR1cm5Db2RlOwotICB9Ci0KLSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0U2VsZWN0ZWRDb21wb25lbnQoKQotICB7Ci0gICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uOwotICAgIGlmICggYW5vbnltb3VzVHlwZSApCi0gICAgCWNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihudWxsLCBudWxsLCBudWxsKTsKLSAgICBlbHNlCi0gICAgCWNvbXBvbmVudFNwZWNpZmljYXRpb24gPSAgbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24obnVsbCwgZ2V0TmFtZSgpLCBudWxsKTsgICAgCi0gICAgY29tcG9uZW50U3BlY2lmaWNhdGlvbi5zZXRNZXRhTmFtZSh0eXBlS2luZCA9PSBDT01QTEVYX1RZUEUgPyBJWFNEU2VhcmNoQ29uc3RhbnRzLkNPTVBMRVhfVFlQRV9NRVRBX05BTUUgOiBJWFNEU2VhcmNoQ29uc3RhbnRzLlNJTVBMRV9UWVBFX01FVEFfTkFNRSk7Ci0gICAgY29tcG9uZW50U3BlY2lmaWNhdGlvbi5zZXROZXcodHJ1ZSk7Ci0gICAgLy9jb21wb25lbnRTcGVjaWZpY2F0aW9uLgotICAgIHJldHVybiBjb21wb25lbnRTcGVjaWZpY2F0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24pCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVIZWFkZXJDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wbGV4VHlwZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotICAgIGNvbXBsZXhUeXBlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0NPTVBMRVhfVFlQRSk7Ci0gICAgY29tcGxleFR5cGVCdXR0b24uc2V0RW5hYmxlZChhbGxvd0NvbXBsZXhUeXBlKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBsZXhUeXBlQnV0dG9uLCBYU0RFZGl0b3JDU0hlbHBJZHMuTkVXVFlQRV9DT01QTEVYVFlQRSk7Ci0gICAgCi0gICAgc2ltcGxlVHlwZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotICAgIHNpbXBsZVR5cGVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfU0lNUExFX1RZUEUpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2ltcGxlVHlwZUJ1dHRvbiwgWFNERWRpdG9yQ1NIZWxwSWRzLk5FV1RZUEVfU0lNUExFVFlQRSk7Ci0gICAgCi0gICAgU2VsZWN0aW9uQWRhcHRlciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgewotICAgICAgICBpZiAoZS53aWRnZXQgPT0gc2ltcGxlVHlwZUJ1dHRvbikKLSAgICAgICAgewotICAgICAgICAgIHR5cGVLaW5kID0gU0lNUExFX1RZUEU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gY29tcGxleFR5cGVCdXR0b24pCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlS2luZCA9IENPTVBMRVhfVFlQRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhbGxvd0Fub255bW91c1R5cGUgJiYgZS53aWRnZXQgPT0gYW5vbnltb3VzVHlwZUNoZWNrQm94KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGFub255bW91c1R5cGVDaGVja0JveC5nZXRTZWxlY3Rpb24oKSA9PSB0cnVlKQotICAgICAgICAgIHsKLSAgICAgICAgCSAgbmFtZUZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAJICBhbm9ueW1vdXNUeXBlID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgCSAgbmFtZUZpZWxkLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIAkgIGFub255bW91c1R5cGUgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICAgIGlmIChhbGxvd0NvbXBsZXhUeXBlKQotICAgIHsKLSAgICAgIGNvbXBsZXhUeXBlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgIHR5cGVLaW5kID0gQ09NUExFWF9UWVBFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2ltcGxlVHlwZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICB0eXBlS2luZCA9IFNJTVBMRV9UWVBFOwotICAgIH0KLQotICAgIHNpbXBsZVR5cGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIGNvbXBsZXhUeXBlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAKLSAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgaWYgKGFsbG93QW5vbnltb3VzVHlwZSApCi0gICAgewotICAgICAgYW5vbnltb3VzVHlwZUNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICBhbm9ueW1vdXNUeXBlQ2hlY2tCb3guc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfQ1JFQVRFX0FOT05fVFlQRSk7Ci0gICAgfSAgICAKLQotICAgIGlmIChhbm9ueW1vdXNUeXBlQ2hlY2tCb3ggIT0gbnVsbCkKLSAgICAgIGFub255bW91c1R5cGVDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7ICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBXVFAgcmVsZWFzZS4KLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9ybWFsaXplZExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKLSAgICAgIFVSTCByZXNvbHZlZFVSTCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKLSAgICAgIGxvY2F0aW9uID0gcmVzb2x2ZWRVUkwuZ2V0UGF0aCgpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxvY2F0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWxsb3dDb21wbGV4VHlwZShib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdGhpcy5hbGxvd0NvbXBsZXhUeXBlPSB2YWx1ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWxsb3dBbm9ueW1vdXNUeXBlKGJvb2xlYW4gdmFsdWUpCi0gIHsKLQl0aGlzLmFsbG93QW5vbnltb3VzVHlwZSA9IHZhbHVlOwotICB9Ci0gIAotICBwcml2YXRlIExpc3QgZ2V0VXNlZFR5cGVOYW1lcygpIHsKLQkgIExpc3QgdXNlZE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JICBpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJICBMaXN0IHR5cGVzTGlzdCA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKTsKLQkJICBJdGVyYXRvciB0eXBlcyA9IHR5cGVzTGlzdC5pdGVyYXRvcigpOwotCQkgIHdoaWxlICh0eXBlcy5oYXNOZXh0KCkpIHsKLQkJCSAgdXNlZE5hbWVzLmFkZCgoKFhTRFR5cGVEZWZpbml0aW9uKSB0eXBlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCSAgfQotCSAgfQotCSAgCi0JICByZXR1cm4gdXNlZE5hbWVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdEJ1aWx0SW5UeXBlc0ZvckZpbHRlcmluZ0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RCdWlsdEluVHlwZXNGb3JGaWx0ZXJpbmdEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQzN2Q2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdEJ1aWx0SW5UeXBlc0ZvckZpbHRlcmluZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0gKiAgICAgVHJ1bmcgZGUgSXJlbmUgPHRydW5naGFAY2EuaWJtLmNvbT4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkNoZWNrZWRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLS8qKgotICogVGhlIEJ1aWx0SW5UeXBlc0ZpbHRlcmluZ0RpYWxvZyBpcyBhIFNlbGVjdGlvbkRpYWxvZyB0aGF0IGFsbG93cyB0aGUgdXNlciB0bwotICogIHNlbGVjdCBhIC4uLgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0QnVpbHRJblR5cGVzRm9yRmlsdGVyaW5nRGlhbG9nIGV4dGVuZHMgQ2hlY2tlZFRyZWVTZWxlY3Rpb25EaWFsb2cgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SID0gWFNERWRpdG9yUGx1Z2luLkNVU1RPTV9MSVNUX1NFUEFSQVRPUjsKLQotCXB1YmxpYyBTZWxlY3RCdWlsdEluVHlwZXNGb3JGaWx0ZXJpbmdEaWFsb2coU2hlbGwgcGFyZW50LCAKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIElUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQlzdXBlcihwYXJlbnQsIGxhYmVsUHJvdmlkZXIsIGNvbnRlbnRQcm92aWRlcik7Ci0KLQkJaW5pdCgpOwotCX0KLQkKLQlwdWJsaWMgQ2hlY2tib3hUcmVlVmlld2VyIGdldFRyZWVWaWV3ZXIoKXsKLQkJcmV0dXJuIHN1cGVyLmdldFRyZWVWaWV3ZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXQoKXsKLQkJLy8gZ3JleSBzdGF0ZSBlbmFibGUKLQkJc2V0Q29udGFpbmVyTW9kZSh0cnVlKTsKLQkJCi0JCXNldFRpdGxlKE1lc3NhZ2VzLl9VSV9MQUJFTF9TRVRfQ09NTU9OX0JVSUxUX0lOX1RZUEVTKTsKLQkJc2V0TWVzc2FnZShNZXNzYWdlcy5fVUlfTEFCRUxfU0VMRUNUX1RZUEVTX0ZJTFRFUl9PVVQpOwotCQkKLQkJLy9zdXBlci5jcmVhdGUoKTsKLQkJLy9zdXBlci5nZXRUcmVlVmlld2VyKCkuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiAgIFJldHVybnMgYSBTdHJpbmcgYWN0aW5nIGFzIGxpc3Qgb2YgYnVpbHQtaW4gdHlwZXMgc2VsZWN0ZWQgYnkgdGhlIHVzZXIKLQkgKiBpbiB0aGUgZmlsdGVyIGRpYWxvZyAod2hpdGUgc3BhY2UgYWN0cyBhcyB0aGUgaXRlbSBzZXBhcmF0b3IpLgotCSAqICAgU3VnZ2VzdCB1c2luZyBnZXRTZWxlY3RlZEJ1aWx0SW5UeXBlc0Zyb21TdHJpbmcKLQkgKiB0byBnZXQgYSBjb25jcmV0ZSBhcnJheSBvZiBzZWxlY3RlZCB0eXBlcy4KLQkgKiAgIFdlIGNhbiBvbmx5IHN0b3JlIFN0cmluZyBpbiB0aGUgcGx1Z2luIHByZWZlcmVuY2UncyBzdG9yYWdlIHNvIHdlIGhhdmUgCi0JICogdXNlIHRoaXMgbWV0aG9kIGZvciBjb252ZXJzaW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZXNMaXN0SW5TdHJpbmcoT2JqZWN0W10gY2hvc2VuVHlwZXMpIHsKLQkJU3RyaW5nIHJldHVybmluZ0xpc3QgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGNob3NlblR5cGVzLmxlbmd0aDsgaSsrKXsKLQkJCWlmICggY2hvc2VuVHlwZXNbaV0gaW5zdGFuY2VvZiBDb21wb25lbnRTcGVjaWZpY2F0aW9uKXsKLQkJCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIGFUeXBlID0gCi0JCQkJCShDb21wb25lbnRTcGVjaWZpY2F0aW9uKSBjaG9zZW5UeXBlc1tpXTsKLQotCQkJCXJldHVybmluZ0xpc3QgKz0gYVR5cGUuZ2V0TmFtZSgpICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SOwotCQkJfQotCQkJLyogZWxzZSBzZWxlY3RlZEJ1aWx0SW5UeXBlc1tpXSBpbnN0YW5jZW9mIExpc3QsIGllLiBhIHBhcmVudE5vZGUKLQkJCSAqIHdlIGlnbm9yZSBpdC4gKi8KLQkJfQotCQlyZXR1cm4gcmV0dXJuaW5nTGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogRmlsdGVycyBvdXQgYWxsIGJ1aWx0LUluIHR5cGUgbm90IHJlY29yZGVkIGluIHRoZSAnbGlzdFN0cmluZycgYW5kIAotCSAqIHJldHVybnMgdGhlIHJlc3VsdCBpbiBhIExpc3QKLQkgKiBXYXJuaW5nOiByZWN1cnNpdmUgbWV0aG9kCi0JICogQHBhcmFtIGxpc3RTdHJpbmcgCi0JICogQHBhcmFtIGFDb250YWluZXIgCi0JICogCQkJQ29udGFpbmluZyBhbGwgdHlwZXMKLQkgKiBAcmV0dXJuIGEgc3Vic2V0IG9mIHdoYXQgJ2FDb250YWluZXInIGhhcyBhcyBzcGVjaWZpZWQgYnkgJ2xpc3RTdHJpbmcnCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFNlbGVjdGVkQnVpbHRJblR5cGVzRnJvbVN0cmluZyhTdHJpbmcgbGlzdFN0cmluZywgCi0JCQlMaXN0IGFDb250YWluZXIpIHsKLQkJTGlzdCBzZWxlY3RlZFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIGlnbm9yZSB0aGUgJ2hlYWRlcicgaXRlbSBpbiB0aGUgY29udGFpbmVyLCBzdGFydGluZyBmcm9tIGkgPSAxCi0JCWZvciAoaW50IGkgPSAxOyBpIDwgYUNvbnRhaW5lci5zaXplKCk7IGkrKyl7Ci0JCQlPYmplY3QgbyA9IGFDb250YWluZXIuZ2V0KGkpOwotCQkJaWYgKCBvIGluc3RhbmNlb2YgQ29tcG9uZW50U3BlY2lmaWNhdGlvbil7Ci0JCQkJQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBhVHlwZSA9IChDb21wb25lbnRTcGVjaWZpY2F0aW9uKSBvOwotCQkJCVN0cmluZyB0eXBlTmFtZSA9IGFUeXBlLmdldE5hbWUoKTsKLQkJCQkvLyBpZiB0eXBlTmFtZSdzIG5hbWUgYXBwZWFycyBpbiAnbGlzdFN0cmluZycKLQkJCQlpZiAoIGxpc3RTdHJpbmcuaW5kZXhPZih0eXBlTmFtZSArIENVU1RPTV9MSVNUX1NFUEFSQVRPUikgIT0gLTEpCi0JCQkJCXNlbGVjdGVkVHlwZXMuYWRkKG8pOwotCQkJfQotCQkJZWxzZSBpZiAoIG8gaW5zdGFuY2VvZiBMaXN0KXsKLQkJCQlzZWxlY3RlZFR5cGVzLmFkZEFsbCggZ2V0U2VsZWN0ZWRCdWlsdEluVHlwZXNGcm9tU3RyaW5nKGxpc3RTdHJpbmcsIChMaXN0KSBvKSApOyAKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWRUeXBlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL1hTREVkaXRTY2hlbWFOUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9YU0RFZGl0U2NoZW1hTlMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNlNTIwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL1hTREVkaXRTY2hlbWFOUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuRWRpdFNjaGVtYUluZm9EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5uc2VkaXQuQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0U2NoZW1hTlMgZXh0ZW5kcyBFZGl0U2NoZW1hSW5mb0RpYWxvZwotewotICBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyBlZGl0TmFtZXNwYWNlc0NvbnRyb2w7Ci0KLSAgcHVibGljIFhTREVkaXRTY2hlbWFOUyhTaGVsbCBwYXJlbnRTaGVsbCwgSVBhdGggcmVzb3VyY2VMb2NhdGlvbikKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsLCByZXNvdXJjZUxvY2F0aW9uKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgIGVkaXROYW1lc3BhY2VzQ29udHJvbCA9IG5ldyBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyhjb21wb3NpdGUsIHJlc291cmNlTG9jYXRpb24sIFhNTFVJTWVzc2FnZXMuX1VJX05BTUVTUEFDRV9ERUNMQVJBVElPTlMpOwotCi0gICAgZWRpdE5hbWVzcGFjZXNDb250cm9sLnNldE5hbWVzcGFjZUluZm9MaXN0KG5hbWVzcGFjZUluZm9MaXN0KTsKLSAgICBlZGl0TmFtZXNwYWNlc0NvbnRyb2wudXBkYXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0KTsKLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvWFNER3JhcGhWaWV3ZXJEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvWFNER3JhcGhWaWV3ZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNhZGJkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL1hTREdyYXBoVmlld2VyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlBvcHVwRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSUh5cGVybGlua0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Sb290Q29udGVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuVHlwZVZpekZpZ3VyZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuWFNERWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTREdyYXBoVmlld2VyRGlhbG9nIGV4dGVuZHMgUG9wdXBEaWFsb2cKLXsKLSAgcHJvdGVjdGVkIE9iamVjdCBtb2RlbDsKLSAgcHJvdGVjdGVkIFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciB2aWV3ZXI7Ci0gIHByb3RlY3RlZCBJT3BlbkluTmV3RWRpdG9yIG9wZW5Jbk5ld0VkaXRvckhlbHBlcjsKLSAgcHJpdmF0ZSBPcGVuRWRpdG9yTGlua0xpc3RlbmVyIGxpbmtMaXN0ZW5lcjsKLSAgcHJpdmF0ZSBMYWJlbCBuc0luZm9MYWJlbDsKLSAgcHJpdmF0ZSBIeXBlcmxpbmsgbGluazsKLSAgcHJpdmF0ZSBTdHJpbmcgaW5mb1RleHQ7Ci0gIHByaXZhdGUgRm9udCBpbmZvRm9udDsKLSAgcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSUQ7Ci0gIHByaXZhdGUgUHJldmlld0NvbnRyb2xMaXN0ZW5lciBtb3ZlTGlzdGVuZXI7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWF9PUklHSU4gPSAiRElBTE9HX1hfT1JJR0lOIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWV9PUklHSU4gPSAiRElBTE9HX1lfT1JJR0lOIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGJvb2xlYW4gaXNIaWdoQ29udHJhc3QgPSBmYWxzZTsKLQotICBwdWJsaWMgWFNER3JhcGhWaWV3ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZVRleHQsIFN0cmluZyBpbmZvVGV4dCwgT2JqZWN0IG1vZGVsLCBTdHJpbmcgSUQpCi0gIHsKLSAgICAvLyBJTkZPUE9QVVBfU0hFTExTVFlMRSB3b3JrcyBwcm9wZXJseSBvbiBib3RoIFdpbmRvd3MgYW5kIExpbnV4LgotICAgIHN1cGVyKHBhcmVudFNoZWxsLCBJTkZPUE9QVVBfU0hFTExTVFlMRSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRpdGxlVGV4dCwgaW5mb1RleHQpOwotICAgIHNldE1vZGVsKG1vZGVsKTsKLSAgICBsaW5rTGlzdGVuZXIgPSBuZXcgT3BlbkVkaXRvckxpbmtMaXN0ZW5lcigpOwotICAgIHRoaXMuaW5mb1RleHQgPSBpbmZvVGV4dDsKLSAgICB0aGlzLnVuaXF1ZUlEID0gSUQ7Ci0gICAgQXNzZXJ0LmlzVHJ1ZShJRCAhPSBudWxsICYmIElELmxlbmd0aCgpID4gMCk7ICAgIAotICAgIG1vdmVMaXN0ZW5lciA9IG5ldyBQcmV2aWV3Q29udHJvbExpc3RlbmVyKCk7Ci0gICAgdHJ5IAotICAgIHsKLSAgICAgIGlzSGlnaENvbnRyYXN0ID0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0SGlnaENvbnRyYXN0KCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgLy8gaWdub3JlIAotICAgIH0KLSAgICBjcmVhdGUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE9wZW5FeHRlcm5hbEVkaXRvcihJT3BlbkluTmV3RWRpdG9yIGhlbHBlcikKLSAgewotICAgIHRoaXMub3BlbkluTmV3RWRpdG9ySGVscGVyID0gaGVscGVyOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBmaWxsRGlhbG9nTWVudShJTWVudU1hbmFnZXIgZGlhbG9nTWVudSkKLSAgewotICAgIHN1cGVyLmZpbGxEaWFsb2dNZW51KGRpYWxvZ01lbnUpOwotICAgIGRpYWxvZ01lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgZGlhbG9nTWVudS5hZGQobmV3IENsb3NlUG9wdXAoKSk7Ci0gICAgZGlhbG9nTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICBkaWFsb2dNZW51LmFkZChuZXcgU2V0T3BlbkluRWRpdG9yKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgdmlld2VyID0gbmV3IFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcigpOwotICAgIENvbXBvc2l0ZSBjID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLSAgICBpZiAoaXNIaWdoQ29udHJhc3QpCi0gICAgewotICAgICAgYy5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjLnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgIH0KLSAgICBjLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotICAgIFJvb3RFZGl0UGFydCByb290ID0gbmV3IFJvb3RFZGl0UGFydCgpOwotICAgIHZpZXdlci5zZXRSb290RWRpdFBhcnQocm9vdCk7Ci0KLSAgICB2aWV3ZXIuY3JlYXRlQ29udHJvbChjKTsKLQotICAgIC8vIFRoZSBncmFwaGljYWwgdmlld2VyIHRvb2wgdGlwIHByb2Nlc3NpbmcgY3JlYXRlcyBhbiBleHRyYSBzaGVsbCB3aGljaAotICAgIC8vIGludGVyZmVyZXMgd2l0aCB0aGUgUG9wdXBEaWFsb2cncyBkZWFjdGl2YXRpb24gbG9naWMuIAotICAgIHJlbW92ZU1vdXNlTGlzdGVuZXJzKHZpZXdlci5nZXRDb250cm9sKCkpOyAgICAKLQotICAgIGlmIChpc0hpZ2hDb250cmFzdCkKLSAgICB7Ci0gICAgICB2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldEJhY2tncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHZpZXdlci5nZXRDb250cm9sKCkuc2V0QmFja2dyb3VuZChDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0gICAgfQotICAgIEVkaXRQYXJ0RmFjdG9yeSBlZGl0UGFydEZhY3RvcnkgPSBuZXcgWFNERWRpdFBhcnRGYWN0b3J5KG5ldyBUeXBlVml6RmlndXJlRmFjdG9yeSgpKTsKLSAgICB2aWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGVkaXRQYXJ0RmFjdG9yeSk7Ci0KLSAgICBSb290Q29udGVudEVkaXRQYXJ0IHJvb3RDb250ZW50RWRpdFBhcnQgPSBuZXcgUm9vdENvbnRlbnRFZGl0UGFydCgpOwotICAgIHJvb3RDb250ZW50RWRpdFBhcnQuc2V0TW9kZWwobW9kZWwpOwotICAgIHZpZXdlci5zZXRDb250ZW50cyhyb290Q29udGVudEVkaXRQYXJ0KTsKLSAgICAKLSAgICBnZXRTaGVsbCgpLmFkZENvbnRyb2xMaXN0ZW5lcihtb3ZlTGlzdGVuZXIpOwotICAgIHJldHVybiBjOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlbW92ZU1vdXNlTGlzdGVuZXJzKENvbnRyb2wgY29udHJvbCkKLSAgewotICAgIExpc3RlbmVyW10gbGlzdGVuZXJzID0gY29udHJvbC5nZXRMaXN0ZW5lcnMoU1dULk1vdXNlRW50ZXIpOwotICAgIGNvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULk1vdXNlRW50ZXIsIGxpc3RlbmVyc1swXSk7Ci0gICAgCi0gICAgbGlzdGVuZXJzID0gY29udHJvbC5nZXRMaXN0ZW5lcnMoU1dULk1vdXNlRXhpdCk7Ci0gICAgY29udHJvbC5yZW1vdmVMaXN0ZW5lcihTV1QuTW91c2VFeGl0LCBsaXN0ZW5lcnNbMF0pOyAgICAKLQotICAgIGxpc3RlbmVycyA9IGNvbnRyb2wuZ2V0TGlzdGVuZXJzKFNXVC5Nb3VzZUhvdmVyKTsKLSAgICBjb250cm9sLnJlbW92ZUxpc3RlbmVyKFNXVC5Nb3VzZUhvdmVyLCBsaXN0ZW5lcnNbMF0pOyAgICAKLQotICAgIGxpc3RlbmVycyA9IGNvbnRyb2wuZ2V0TGlzdGVuZXJzKFNXVC5Nb3VzZU1vdmUpOwotICAgIGNvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULk1vdXNlTW92ZSwgbGlzdGVuZXJzWzBdKTsgICAgCi0KLSAgICBsaXN0ZW5lcnMgPSBjb250cm9sLmdldExpc3RlbmVycyhTV1QuTW91c2VEb3duKTsKLSAgICBjb250cm9sLnJlbW92ZUxpc3RlbmVyKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyc1swXSk7ICAgIAotCi0gICAgbGlzdGVuZXJzID0gY29udHJvbC5nZXRMaXN0ZW5lcnMoU1dULk1vdXNlVXApOwotICAgIGNvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULk1vdXNlVXAsIGxpc3RlbmVyc1swXSk7ICAgIAotICAgIAotICAgIGxpc3RlbmVycyA9IGNvbnRyb2wuZ2V0TGlzdGVuZXJzKFNXVC5Nb3VzZURvdWJsZUNsaWNrKTsKLSAgICBjb250cm9sLnJlbW92ZUxpc3RlbmVyKFNXVC5Nb3VzZURvdWJsZUNsaWNrLCBsaXN0ZW5lcnNbMF0pOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVJbmZvVGV4dEFyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBpbmZvQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIGluZm9Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgaW5mb0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIG5zSW5mb0xhYmVsID0gbmV3IExhYmVsKGluZm9Db21wb3NpdGUsIFNXVC5MRUZUKTsKLSAgICBuc0luZm9MYWJlbC5zZXRUZXh0KGluZm9UZXh0KTsKLQotICAgIEZvbnQgZm9udCA9IG5zSW5mb0xhYmVsLmdldEZvbnQoKTsKLSAgICBGb250RGF0YVtdIGZvbnREYXRhcyA9IGZvbnQuZ2V0Rm9udERhdGEoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvbnREYXRhcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBmb250RGF0YXNbaV0uc2V0SGVpZ2h0KGZvbnREYXRhc1tpXS5nZXRIZWlnaHQoKSAqIDkgLyAxMCk7Ci0gICAgfQotICAgIGluZm9Gb250ID0gbmV3IEZvbnQobnNJbmZvTGFiZWwuZ2V0RGlzcGxheSgpLCBmb250RGF0YXMpOwotICAgIG5zSW5mb0xhYmVsLnNldEZvbnQoaW5mb0ZvbnQpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICBuc0luZm9MYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBuc0luZm9MYWJlbC5zZXRGb3JlZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9EQVJLX1NIQURPVykpOwotCi0gICAgbGluayA9IG5ldyBIeXBlcmxpbmsoaW5mb0NvbXBvc2l0ZSwgU1dULlJJR0hUKTsKLSAgICAvLyBSZW1vdmUgbW5lbW9uaWMgYW1wZXJzYW5kLiBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBhIHNlcGFyYXRlIHN0cmluZyBpbiB0aGUgZnV0dXJlLgotICAgIFN0cmluZyBsYWJlbCA9IE1lc3NhZ2VzLl9VSV9BQ1RJT05fT1BFTl9JTl9ORVdfRURJVE9SLnJlcGxhY2VBbGwoIiYiLCAiIik7Ci0gICAgbGluay5zZXRUZXh0KGxhYmVsKTsKLSAgICBsaW5rLnNldEZvbnQoaW5mb0ZvbnQpOwotICAgIGxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobGlua0xpc3RlbmVyKTsKLSAgICByZXR1cm4gaW5mb0NvbXBvc2l0ZTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldE1vZGVsKE9iamVjdCBtb2RlbCkKLSAgewotICAgIEFzc2VydC5pc1RydWUobW9kZWwgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgdGhpcy5tb2RlbCA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBtb2RlbCk7Ci0gIH0KLSAgICAKLSAgcHJvdGVjdGVkIGNsYXNzIFNldE9wZW5JbkVkaXRvciBleHRlbmRzIEFjdGlvbgotICB7Ci0gICAgcHVibGljIFNldE9wZW5JbkVkaXRvcigpCi0gICAgewotICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9PUEVOX0lOX05FV19FRElUT1IpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgIGlmIChvcGVuSW5OZXdFZGl0b3JIZWxwZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBvcGVuSW5OZXdFZGl0b3JIZWxwZXIub3BlblhTREVkaXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIENsb3NlUG9wdXAgZXh0ZW5kcyBBY3Rpb24gewotICAgIHB1YmxpYyBDbG9zZVBvcHVwKCkKLSAgICB7Ci0gICAgICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX0NMT1NFX1NDSEVNQV9QUkVWSUVXX1BPUFVQKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgIGNsb3NlKCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkKLSAgewotICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncz0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpLmdldFNlY3Rpb24odW5pcXVlSUQpOwotICAgIGlmIChzZXR0aW5ncyA9PSBudWxsKQotICAgICAgc2V0dGluZ3M9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKS5hZGROZXdTZWN0aW9uKHVuaXF1ZUlEKTsKLQotICAgIHJldHVybiBzZXR0aW5nczsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFBvaW50IGdldEluaXRpYWxMb2NhdGlvbihQb2ludCBpbml0aWFsU2l6ZSkKLSAgewotICAgIFBvaW50IHJlc3VsdCA9IHN1cGVyLmdldEluaXRpYWxMb2NhdGlvbihpbml0aWFsU2l6ZSk7Ci0KLSAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgIGlmIChzZXR0aW5ncyAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSB1bmlxdWVJRCA9PSBudWxsID8gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgOiB1bmlxdWVJRDsKLSAgICAgICAgaW50IHggPSBzZXR0aW5ncy5nZXRJbnQocHJlZml4ICsgWF9PUklHSU4pOwotICAgICAgICBpbnQgeSA9IHNldHRpbmdzLmdldEludChwcmVmaXggKyBZX09SSUdJTik7Ci0gICAgICAgIHJlc3VsdCA9IG5ldyBQb2ludCh4LCB5KTsKLSAgICAgICAgU2hlbGwgcGFyZW50ID0gZ2V0UGFyZW50U2hlbGwoKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgUG9pbnQgcGFyZW50TG9jYXRpb24gPSBwYXJlbnQuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICByZXN1bHQueCArPSBwYXJlbnRMb2NhdGlvbi54OwotICAgICAgICAgIHJlc3VsdC55ICs9IHBhcmVudExvY2F0aW9uLnk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNhdmVEaWFsb2dCb3VuZHMoU2hlbGwgc2hlbGwpCi0gIHsKLSAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgIGlmIChzZXR0aW5ncyAhPSBudWxsKQotICAgIHsKLSAgICAgIFBvaW50IHNoZWxsTG9jYXRpb24gPSBzaGVsbC5nZXRMb2NhdGlvbigpOwotICAgICAgU2hlbGwgcGFyZW50ID0gZ2V0UGFyZW50U2hlbGwoKTsKLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgUG9pbnQgcGFyZW50TG9jYXRpb24gPSBwYXJlbnQuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgc2hlbGxMb2NhdGlvbi54IC09IHBhcmVudExvY2F0aW9uLng7Ci0gICAgICAgIHNoZWxsTG9jYXRpb24ueSAtPSBwYXJlbnRMb2NhdGlvbi55OwotICAgICAgfQotICAgICAgU3RyaW5nIHByZWZpeCA9IHVuaXF1ZUlEID09IG51bGwgPyBnZXRDbGFzcygpLmdldE5hbWUoKSA6IHVuaXF1ZUlEOwotICAgICAgc2V0dGluZ3MucHV0KHByZWZpeCArIFhfT1JJR0lOLCBzaGVsbExvY2F0aW9uLngpOwotICAgICAgc2V0dGluZ3MucHV0KHByZWZpeCArIFlfT1JJR0lOLCBzaGVsbExvY2F0aW9uLnkpOwotICAgIH0KLSAgfQotCi0gIAotICBwdWJsaWMgYm9vbGVhbiBjbG9zZSgpCi0gIHsKLSAgICBpZiAoZ2V0U2hlbGwoKSA9PSBudWxsIHx8IGdldFNoZWxsKCkuaXNEaXNwb3NlZCgpKSAKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgZ2V0U2hlbGwoKS5yZW1vdmVDb250cm9sTGlzdGVuZXIobW92ZUxpc3RlbmVyKTsKLSAgICBpZiAobGluayAhPSBudWxsKQotICAgICAgbGluay5yZW1vdmVIeXBlcmxpbmtMaXN0ZW5lcihsaW5rTGlzdGVuZXIpOwotICAgIGlmIChpbmZvRm9udCAhPSBudWxsKQotICAgICAgaW5mb0ZvbnQuZGlzcG9zZSgpOwotICAgIGluZm9Gb250ID0gbnVsbDsKLSAgICByZXR1cm4gc3VwZXIuY2xvc2UoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBPcGVuRWRpdG9yTGlua0xpc3RlbmVyIGltcGxlbWVudHMgSUh5cGVybGlua0xpc3RlbmVyCi0gIHsKLQotICAgIHB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkKLSAgICB7Ci0gICAgICBuZXcgU2V0T3BlbkluRWRpdG9yKCkucnVuKCk7Ci0gICAgICBjbG9zZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKEh5cGVybGlua0V2ZW50IGUpCi0gICAgewotICAgICAgbGluay5zZXRGb3JlZ3JvdW5kKENvbG9yQ29uc3RhbnRzLmxpZ2h0Qmx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbGlua0V4aXRlZChIeXBlcmxpbmtFdmVudCBlKQotICAgIHsKLSAgICAgIGxpbmsuc2V0Rm9yZWdyb3VuZChsaW5rLmdldFBhcmVudCgpLmdldEZvcmVncm91bmQoKSk7Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgY2xhc3MgUHJldmlld0NvbnRyb2xMaXN0ZW5lciBpbXBsZW1lbnRzIENvbnRyb2xMaXN0ZW5lcgotICB7Ci0KLSAgICBwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpCi0gICAgewotICAgICAgc2F2ZURpYWxvZ0JvdW5kcyhnZXRTaGVsbCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkKLSAgICB7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuMi4xMDEKLSAgICogQHBhcmFtIHhzZENvbXBvbmVudAotICAgKiBAcGFyYW0gc2NoZW1hCi0gICAqIEBwYXJhbSBlZGl0b3JOYW1lCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgb3Blbk5vblhTRFJlc291cmNlU2NoZW1hKFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXBvbmVudCwgWFNEU2NoZW1hIHNjaGVtYSwgU3RyaW5nIGVkaXRvck5hbWUpCi0gIHsKLSAgICBvcGVuSW5saW5lU2NoZW1hKGdldEN1cnJlbnRFZGl0b3JJbnB1dCgpLCB4c2RDb21wb25lbnQsIHNjaGVtYSwgZWRpdG9yTmFtZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuSW5saW5lU2NoZW1hKElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCwgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50LCBYU0RTY2hlbWEgc2NoZW1hLCBTdHJpbmcgZWRpdG9yTmFtZSkKLSAgewotICAgIE9wZW5Jbk5ld0VkaXRvci5vcGVuSW5saW5lU2NoZW1hKGVkaXRvcklucHV0LCB4c2RDb21wb25lbnQsIHNjaGVtYSwgZWRpdG9yTmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuWFNERWRpdG9yKFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXBvbmVudCkKLSAgewotICAgIG9wZW5YU0RFZGl0b3IoZ2V0Q3VycmVudEVkaXRvcklucHV0KCksIHhzZENvbXBvbmVudC5nZXRTY2hlbWEoKSwgeHNkQ29tcG9uZW50KTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuWFNERWRpdG9yKElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCwgWFNEU2NoZW1hIHNjaGVtYSwgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50KQotICB7Ci0gICAgT3BlbkluTmV3RWRpdG9yLm9wZW5YU0RFZGl0b3IoZWRpdG9ySW5wdXQsIHNjaGVtYSwgeHNkQ29tcG9uZW50KTsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgSUVkaXRvcklucHV0IGdldEN1cnJlbnRFZGl0b3JJbnB1dCgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gbnVsbDsKLSAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICBpZiAoZWRpdG9yUGFydCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlZGl0b3JQYXJ0LmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBDb250cm9sIGdldEZvY3VzQ29udHJvbCgpCi0gIHsKLSAgICByZXR1cm4gbGluazsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvQmFzZUh5cGVybGlua0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvQmFzZUh5cGVybGlua0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNDMxNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0Jhc2VIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5BYnN0cmFjdEh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgaHlwZXJsaW5rcyBkZXRlY3RvcnMuIFByb3ZpZGVzIGEgZnJhbWV3b3JrIGFuZCBjb21tb24gY29kZSBmb3IKLSAqIGh5cGVybGluayBkZXRlY3RvcnMuIFRPRE86IENhbiB3ZSBwdWxsIHRoaXMgY2xhc3MgZnVydGhlciB1cCB0aGUgaW5oZXJpdGFuY2UKLSAqIGhpZXJhcmNoeT8KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VIeXBlcmxpbmtEZXRlY3RvciBleHRlbmRzIEFic3RyYWN0SHlwZXJsaW5rRGV0ZWN0b3IKLXsKLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKi8KLSAgcHVibGljIElIeXBlcmxpbmtbXSBkZXRlY3RIeXBlcmxpbmtzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gcmVnaW9uLCBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MpCi0gIHsKLSAgICBpZiAocmVnaW9uID09IG51bGwgfHwgdGV4dFZpZXdlciA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIExpc3QgaHlwZXJsaW5rcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0gICAgSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpOwotICAgIGludCBvZmZzZXQgPSByZWdpb24uZ2V0T2Zmc2V0KCk7Ci0KLSAgICBJRE9NTm9kZSBub2RlID0gZ2V0Q3VycmVudE5vZGUoZG9jdW1lbnQsIG9mZnNldCk7Ci0KLSAgICAvLyBUaGlzIGNhbGwgYWxsb3dzIHVzIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGF0dHJpYnV0ZSBpcyBsaW5rYWJsZSwKLSAgICAvLyB3aXRob3V0IGluY3VycmluZyB0aGUgY29zdCBvZiBhc2tpbmcgZm9yIHRoZSB0YXJnZXQgY29tcG9uZW50LgotCi0gICAgaWYgKCFpc0xpbmthYmxlKG5vZGUpKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIElSZWdpb24gaHlwZXJsaW5rUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKG5vZGUpOwotCi0gICAgLy8gY3JlYXRlSHlwZXJsaW5rIGlzIGEgdGVtcGxhdGUgbWV0aG9kLiBEZXJpdmVkIGNsYXNzZXMsIHNob3VsZCBvdmVycmlkZS4KLQotICAgIElIeXBlcmxpbmsgaHlwZXJsaW5rID0gY3JlYXRlSHlwZXJsaW5rKGRvY3VtZW50LCBub2RlLCBoeXBlcmxpbmtSZWdpb24pOwotCi0gICAgaWYgKGh5cGVybGluayAhPSBudWxsKQotICAgIHsKLSAgICAgIGh5cGVybGlua3MuYWRkKGh5cGVybGluayk7Ci0gICAgfQotCi0gICAgaWYgKGh5cGVybGlua3Muc2l6ZSgpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcmV0dXJuIChJSHlwZXJsaW5rW10pIGh5cGVybGlua3MudG9BcnJheShuZXcgSUh5cGVybGlua1swXSk7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbm9kZSBpcyAibGlua2FibGUiIHRoYXQgaXMsIHRoZSBjb21wb25lbnQgaXQgcmVmZXJzIHRvCi0gICAqIGNhbiBiZSB0aGUgdGFyZ2V0IG9mIGEgImdvIHRvIGRlZmluaXRpb24iIG5hdmlnYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB0ZXN0LCBtdXN0IG5vdCBiZSBudWxsOwotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgaXMgbGlua2FibGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc0xpbmthYmxlKElET01Ob2RlIG5vZGUpCi0gIHsKLSAgICBpZiAobm9kZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQotICAgIGJvb2xlYW4gaXNMaW5rYWJsZSA9IGZhbHNlOwotCi0gICAgaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpCi0gICAgewotICAgICAgSURPTUF0dHIgYXR0ciA9IChJRE9NQXR0cikgbm9kZTsKLSAgICAgIFN0cmluZyBuYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0KLSAgICAgIC8vIGlzTGlua2FibGVBdHRyaWJ1dGUgaXMgYSB0ZW1wbGF0ZSBtZXRob2QuIERlcml2ZWQgY2xhc3NlcyBzaG91bGQKLSAgICAgIC8vIG92ZXJyaWRlLgotCi0gICAgICBpc0xpbmthYmxlID0gaXNMaW5rYWJsZUF0dHJpYnV0ZShuYW1lKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaXNMaW5rYWJsZTsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gYXR0cmlidXRlIGlzICJsaW5rYWJsZSIgdGhhdCBpcywgdGhlIGNvbXBvbmVudCBpdAotICAgKiBwb2ludHMgdG8gY2FuIGJlIHRoZSB0YXJnZXQgb2YgYSAiZ28gdG8gZGVmaW5pdGlvbiIgbmF2aWdhdGlvbi4gRGVyaXZlZAotICAgKiBjbGFzc2VzIHNob3VsZCBvdmVycmlkZS4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZS4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbGlua2FibGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzTGlua2FibGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgaHlwZXJsaW5rIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBub2RlLiBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkCi0gICAqIG92ZXJyaWRlLgotICAgKiAKLSAgICogQHBhcmFtIGRvY3VtZW50IHRoZSBzb3VyY2UgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHVuZGVyIHRoZSBjdXJzb3IuCi0gICAqIEBwYXJhbSByZWdpb24gdGhlIHRleHQgcmVnaW9uIHRvIHVzZSB0byBjcmVhdGUgdGhlIGh5cGVybGluay4KLSAgICogQHJldHVybiBhIG5ldyBJSHlwZXJsaW5rIGZvciB0aGUgbm9kZSBvciBudWxsIGlmIG9uZSBjYW5ub3QgYmUgY3JlYXRlZC4KLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBJSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhJRG9jdW1lbnQgZG9jdW1lbnQsIElET01Ob2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKTsKLQotICAvKioKLSAgICogTG9jYXRlcyB0aGUgYXR0cmlidXRlIG5vZGUgdW5kZXIgdGhlIGN1cnNvci4KLSAgICogCi0gICAqIEBwYXJhbSBvZmZzZXQgdGhlIGN1cnNvciBvZmZzZXQuCi0gICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBub2RlCi0gICAqIEByZXR1cm4gYW4gSURPTU5vZGUgcmVwcmVzZW50aW5nIHRoZSBhdHRyaWJ1dGUgaWYgb25lIGlzIGZvdW5kIGF0IHRoZQotICAgKiAgICAgICAgIG9mZnNldCBvciBudWxsIG90aGVyd2lzZS4KLSAgICovCi0gIHByb3RlY3RlZCBJRE9NTm9kZSBnZXRBdHRyaWJ1dGVOb2RlKGludCBvZmZzZXQsIElET01Ob2RlIHBhcmVudCkKLSAgewotICAgIElET01BdHRyIGF0dHJOb2RlID0gbnVsbDsKLSAgICBOYW1lZE5vZGVNYXAgbWFwID0gcGFyZW50LmdldEF0dHJpYnV0ZXMoKTsKLQotICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBtYXAuZ2V0TGVuZ3RoKCk7IGluZGV4KyspCi0gICAgewotICAgICAgYXR0ck5vZGUgPSAoSURPTUF0dHIpIG1hcC5pdGVtKGluZGV4KTsKLSAgICAgIGJvb2xlYW4gbG9jYXRlZCA9IGF0dHJOb2RlLmNvbnRhaW5zKG9mZnNldCk7Ci0gICAgICBpZiAobG9jYXRlZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGF0dHJOb2RlLmhhc05hbWVPbmx5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyTm9kZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGF0dHJOb2RlID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0gICAgcmV0dXJuIGF0dHJOb2RlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG5vZGUgdGhlIGN1cnNvciBpcyBjdXJyZW50bHkgb24gaW4gdGhlIGRvY3VtZW50IG9yIG51bGwgaWYgbm8KLSAgICogbm9kZSBpcyBzZWxlY3RlZAotICAgKiAKLSAgICogQHBhcmFtIG9mZnNldCB0aGUgY3VycmVudCBjdXJzb3Igb2Zmc2V0LgotICAgKiBAcmV0dXJuIElET01Ob2RlIGVpdGhlciBlbGVtZW50LCBkb2N0eXBlLCB0ZXh0LCBhdHRyaWJ1dGUgb3IgbnVsbAotICAgKi8KLSAgcHJpdmF0ZSBJRE9NTm9kZSBnZXRDdXJyZW50Tm9kZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpCi0gIHsKLSAgICBJbmRleGVkUmVnaW9uIGlub2RlID0gbnVsbDsKLSAgICBJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLSAgICAgIGlub2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0KTsKLSAgICAgIGlmIChpbm9kZSA9PSBudWxsKQotICAgICAgICBpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCAtIDEpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgaWYgKHNNb2RlbCAhPSBudWxsKQotICAgICAgICBzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0gICAgfQotCi0gICAgaWYgKGlub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgaW5vZGU7Ci0KLSAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZXMoKSkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IGdldEF0dHJpYnV0ZU5vZGUob2Zmc2V0LCBub2RlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBub2RlOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgdGV4dCByZWdpb24gY29ycmVzcG9uZGluZyB0byBhbiBJRE9NTm9kZS4KLSAgICogCi0gICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIGZvciB3aGljaCB3ZSB3YW50IHRoZSB0ZXh0IHJlZ2lvbi4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHJldHVybiBhbiBJUmVnaW9uIGZvciB0aGUgbm9kZSwgb3IgbnVsbCBpZiB0aGUgbm9kZSBpcyBub3QgcmVjb2duaXplZC4KLSAgICovCi0gIHByb3RlY3RlZCBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbihJRE9NTm9kZSBub2RlKQotICB7Ci0gICAgaWYgKG5vZGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBJUmVnaW9uIGh5cGVyUmVnaW9uID0gbnVsbDsKLSAgICBzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQotICAgIHN3aXRjaCAobm9kZVR5cGUpCi0gICAgewotICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IAotICAgICAgICB7Ci0gICAgICAgICAgaHlwZXJSZWdpb24gPSBuZXcgUmVnaW9uKG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgbm9kZS5nZXRFbmRPZmZzZXQoKSAtIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDogCi0gICAgICAgIHsKLSAgICAgICAgICBJRE9NQXR0ciBhdHQgPSAoSURPTUF0dHIpIG5vZGU7Ci0gIAotICAgICAgICAgIGludCByZWdPZmZzZXQgPSBhdHQuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotICAKLSAgICAgICAgICAvLyBJU1NVRTogV2UgYXJlIHVzaW5nIGEgZGVwcmVjYXRlZCBtZXRob2QgaGVyZS4gSXMgdGhlcmUKLSAgICAgICAgICAvLyBhIGJldHRlciB3YXkgdG8gZ2V0IHdoYXQgd2UgbmVlZD8KLSAgCi0gICAgICAgICAgSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBhdHQuZ2V0VmFsdWVSZWdpb24oKTsKLSAgICAgICAgICBpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcmVnTGVuZ3RoID0gdmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotICAgICAgICAgICAgU3RyaW5nIGF0dFZhbHVlID0gYXR0LmdldFZhbHVlUmVnaW9uVGV4dCgpOwotICAKLSAgICAgICAgICAgIC8vIERvIG5vdCBpbmNsdWRlIHF1b3RlcyBpbiBhdHRyaWJ1dGUgdmFsdWUgcmVnaW9uIGFuZCBvbmx5Ci0gICAgICAgICAgICAvLyB1bmRlcmxpbmUgdGhlIGFjdHVhbCB2YWx1ZSwgbm90IHRoZSBxdW90ZXMuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc1F1b3RlZChhdHRWYWx1ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlZ0xlbmd0aCA9IHJlZ0xlbmd0aCAtIDI7Ci0gICAgICAgICAgICAgIHJlZ09mZnNldCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaHlwZXJSZWdpb24gPSBuZXcgUmVnaW9uKHJlZ09mZnNldCwgcmVnTGVuZ3RoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotIAotICAgIHJldHVybiBoeXBlclJlZ2lvbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZWxlY3Rpb25NYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9JU2VsZWN0aW9uTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWMwZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZWxlY3Rpb25NYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJU2VsZWN0aW9uTWFwcGVyCi17Ci0gIElTZWxlY3Rpb24gbWFwU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0ZWRPYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0ludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM0M2U1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuS2V5U3Ryb2tlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuR0VGQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlByaW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5hdmlnYXRpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmF2aWdhdGlvbkxvY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuRmlsZVN0b3JlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5DYXRlZ29yeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5SZWRlZmluZUNhdGVnb3J5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RSZWRlZmluZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5BZGRGaWVsZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VEaXJlY3RFZGl0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlc2lnblNlbGVjdEFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkRlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLklLZXlib2FyZERyYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Sb290Q29udGVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5BRFRNdWx0aVBhZ2VFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkVkaXRvck1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkVkaXRvck1vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5JQURURWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLlByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLkFEVENvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LlR5cGVWaXpFZGl0b3JNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQW55RWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RNb2RlbEdyb3VwQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RSZWRlZmluZWRBdHRyaWJ1dGVHcm91cEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTRFJlZGVmaW5lZENvbXBsZXhUeXBlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEUmVkZWZpbmVkTW9kZWxHcm91cEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTRFJlZGVmaW5lZFNpbXBsZVR5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkRlbGV0ZVhTRENvbmNyZXRlQ29tcG9uZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0QmFzZVR5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5TZXRNdWx0aXBsaWNpdHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5TZXRUeXBlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uYXZpZ2F0aW9uLkRlc2lnblZpZXdOYXZpZ2F0aW9uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uYXZpZ2F0aW9uLk11bHRpUGFnZUVkaXRvclRleHRTZWxlY3Rpb25OYXZpZ2F0aW9uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC50ZXh0LlhTRE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWxzLk9wZW5PblNlbGVjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IgZXh0ZW5kcyBBRFRNdWx0aVBhZ2VFZGl0b3IgaW1wbGVtZW50cyBJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciwgSU5hdmlnYXRpb25Mb2NhdGlvblByb3ZpZGVyCi17Ci0gIC8vIElNb2RlbCBtb2RlbDsKLSAgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWw7Ci0gIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gIFhTRE1vZGVsQWRhcHRlciBzY2hlbWFOb2RlQWRhcHRlcjsKLSAgcHJpdmF0ZSBPdXRsaW5lVHJlZVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGZPdXRsaW5lTGlzdGVuZXI7Ci0gIHByaXZhdGUgU291cmNlRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIgZlNvdXJjZUVkaXRvclNlbGVjdGlvbkxpc3RlbmVyOwotICBwcml2YXRlIFhTRFNlbGVjdGlvbk1hbmFnZXJTZWxlY3Rpb25MaXN0ZW5lciBmWFNEU2VsZWN0aW9uTGlzdGVuZXI7Ci0gIHByaXZhdGUgSW50ZXJuYWxEb2N1bWVudENoYW5nZWROb3RpZmllciBpbnRlcm5hbERvY3VtZW50Q2hhbmdlZE5vdGlmaWVyID0gbmV3IEludGVybmFsRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXIoKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRF9FRElUT1JfTU9ERV9FWFRFTlNJT05fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5lZGl0b3JNb2RlcyI7IC8vJE5PTi1OTFMtTiQgCi0gIHByaXZhdGUgWFNEUHJlZmVyZW5jZVN0b3JlTGlzdGVuZXIgeHNkUHJlZmVyZW5jZVN0b3JlTGlzdGVuZXI7Ci0gIAotICBjbGFzcyBJbnRlcm5hbERvY3VtZW50Q2hhbmdlZE5vdGlmaWVyIGltcGxlbWVudHMgSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vZGVBZGFwdGVyIGFkYXB0ZXIpCi0gICAgewotICAgICAgbGlzdC5hZGQoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vZGVBZGFwdGVyIGFkYXB0ZXIpCi0gICAgewotICAgICAgbGlzdC5yZW1vdmUoYWRhcHRlcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyhJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKQotICAgIHsKLSAgICAgIExpc3QgY2xvbmUgPSBuZXcgQXJyYXlMaXN0KGxpc3Quc2l6ZSgpKTsgICAgIAotICAgICAgY2xvbmUuYWRkQWxsKGxpc3QpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gY2xvbmUuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKWkubmV4dCgpOwotICAgICAgICBhZGFwdGVyLm5vdGlmeUNoYW5nZWQobm90aWZpZXIsIGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNldElucHV0VG9HcmFwaGljYWxWaWV3ZXIoSURvY3VtZW50IG5ld0RvY3VtZW50KQotICB7Ci0gICAgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIG9ubHkgc2V0IGlucHV0IGlmIHN0cnVjdHVyZWQgbW9kZWwgYWxyZWFkeSBleGlzdHMKLSAgICAgIC8vIChtZWFuaW5nIHNvdXJjZSBlZGl0b3IgaXMgYWxyZWFkeSBtYW5hZ2luZyB0aGUgbW9kZWwpCi0gICAgICBzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKG5ld0RvY3VtZW50KTsKLSAgICAgIGlmICgoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpICYmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpKQotICAgICAgewotICAgICAgICBEb2N1bWVudCBkb2MgPSAoKElET01Nb2RlbCkgc3RydWN0dXJlZE1vZGVsKS5nZXREb2N1bWVudCgpOwotICAgICAgICBpZiAoZG9jICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyID0gWFNETW9kZWxBZGFwdGVyLmxvb2t1cE9yQ3JlYXRlTW9kZWxBZGFwdGVyKGRvYyk7Ci0gICAgICAgICAgaWYgKG1vZGVsQWRhcHRlciAhPSBudWxsKSAvLyBBc3NlcnQgc2hvdWxkIG5vdCBiZSBudWxsCi0gICAgICAgICAgewotICAgICAgICAgICAgbW9kZWxBZGFwdGVyLnNldFNjaGVtYSh4c2RTY2hlbWEpOwotICAgICAgICAgICAgeHNkU2NoZW1hID0gbW9kZWxBZGFwdGVyLnJlc2V0U2NoZW1hKGRvYyk7Ci0gICAgICAgICAgICBtb2RlbCA9IChJTW9kZWwpIFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoeHNkU2NoZW1hKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAKLSAgcHVibGljIElNb2RlbCBidWlsZE1vZGVsKCkKLSAgewotICAgIHRyeQotICAgIHsgICAgICAKLSAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0gICAgICAKLSAgICAgIC8vIElmIHRoZSBpbnB1dCBzY2hlbWEgaXMgZnJvbSB0aGUgV1NETCBFZGl0b3IsIHRoZW4gdXNlIHRoYXQgaW5saW5lIHNjaGVtYQotICAgICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUFEVEVkaXRvcklucHV0KQotICAgICAgewotICAgICAgICB4c2RTY2hlbWEgPSAoKElBRFRFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpLmdldFNjaGVtYSgpOwotICAgICAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgbW9kZWwgPSAoSU1vZGVsKSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KHhzZFNjaGVtYSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgIElEb2N1bWVudCBkb2MgPSBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICBpZiAoZG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkKLSAgICAgIHsKLSAgICAgICAgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgIC8vIFRPRE86IGZvciBTdG9yYWdlRWRpdG9ySW5wdXRzLCBzaG91bGQgYmUgZm9yUmVhZAotICAgICAgICAgIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2MpOwotICAgICAgICAgIGlmIChtb2RlbCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvYyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRvY3VtZW50ID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGlmIChtb2RlbCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgQXNzZXJ0LmlzTm90TnVsbChkb2N1bWVudCk7Ci0KLSAgICAgIGlmIChtb2RlbCAhPSBudWxsKQotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgICAKLSAgICAgIHhzZFNjaGVtYSA9IFhTRE1vZGVsQWRhcHRlci5sb29rdXBPckNyZWF0ZVNjaGVtYShkb2N1bWVudCk7Ci0gICAgICBtb2RlbCA9IChJTW9kZWwpIFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoeHNkU2NoZW1hKTsgICAgICAgICAgICAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotCi0gICAgfQotICAgIAotLy8gICAgdHJ5Ci0vLyAgICB7Ci0vLyAgICAgIEVQYWNrYWdlLlJlZ2lzdHJ5IHJlZyA9IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFOwotLy8gICAgICBYU0RQYWNrYWdlIHhzZFBhY2thZ2UgPSAoWFNEUGFja2FnZSkgcmVnLmdldEVQYWNrYWdlKFhTRFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyAgICAgIHhzZFNjaGVtYSA9IHhzZFBhY2thZ2UuZ2V0WFNERmFjdG9yeSgpLmNyZWF0ZVhTRFNjaGVtYSgpOwotLy8gICAgICByZXNvdXJjZVNldCA9IFhTRFNjaGVtYUltcGwuY3JlYXRlUmVzb3VyY2VTZXQoKTsKLS8vICAgICAgSUZpbGUgcmVzb3VyY2VGaWxlID0gZWRpdG9ySW5wdXQuZ2V0RmlsZSgpOwotLy8gICAgICBzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChyZXNvdXJjZUZpbGUpOwotLy8gICAgICAvLyBJZiB0aGUgcmVzb3VyY2UgaXMgaW4gdGhlIHdvcmtzcGFjZS4uLi4KLS8vICAgICAgLy8gb3RoZXJ3aXNlIHRoZSB1c2VyIGlzIHRyeWluZyB0byBvcGVuIGFuIGV4dGVybmFsIGZpbGUKLS8vICAgICAgaWYgKHJlc291cmNlRmlsZSAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgU3RyaW5nIHBhdGhOYW1lID0gcmVzb3VyY2VGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLS8vICAgICAgICB4c2RSZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHBhdGhOYW1lKSwgdHJ1ZSk7Ci0vLyAgICAgICAgcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKHhzZFJlc291cmNlKTsKLS8vICAgICAgICBPYmplY3Qgb2JqID0geHNkUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0vLyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICB4c2RTY2hlbWEgPSAoWFNEU2NoZW1hKSBvYmo7Ci0vLyAgICAgICAgICB4c2RTY2hlbWEuc2V0RWxlbWVudCgoKElET01Nb2RlbCkgc3RydWN0dXJlZE1vZGVsKS5nZXREb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpKTsKLS8vICAgICAgICAgIG1vZGVsID0gKElNb2RlbCkgWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh4c2RTY2hlbWEpOwotLy8gICAgICAgIH0KLS8vICAgICAgICAKLS8vICAgICAgICAvLyBJZiB0aGUgaW5wdXQgc2NoZW1hIGlzIGZyb20gdGhlIFdTREwgRWRpdG9yLCB0aGVuIHVzZSB0aGF0IGlubGluZSBzY2hlbWEKLS8vICAgICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBYU0RGaWxlRWRpdG9ySW5wdXQpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgeHNkU2NoZW1hID0gKChYU0RGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KS5nZXRTY2hlbWEoKTsKLS8vICAgICAgICAgIG1vZGVsID0gKElNb2RlbCkgWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh4c2RTY2hlbWEpOwotLy8gICAgICAgIH0KLS8vICAgICAgICBpZiAoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSAhPSBudWxsKQotLy8gICAgICAgICAgCi0vLyAgICAgICAgICAvLyBUT0RPIChjcykgLi4uIHdlIG5lZWQgdG8gbG9vayBpbnRvIHBlcmZvcm1hbmNlIGlzc3VlcyB3aGVuIHdlIGFkZCBlbGVtZW50cwotLy8gICAgICAgICAgLy8gc2VlbXMgdG8gYmUgdGhhdCBmb3JtYXR0aW5nIGlzIGNhdXNpZyBsb3RzIG9mIG5vdGlmaWNhdGlvbiBhbmQgdGhpbmdzIGdldCB0ZXJyaWJseSBzbG93Ci0vLyAgICAgICAgICAvLyBJJ20gc3BlY2lhbGl6aW5nIHRoZSBtZXRob2QgYmVsb3cgdG8gYWRkIGFuIGlzTW9kZWxTdGF0ZUNoYW5naW5nIGNoZWNrIHRoYXQgc2hvdWxkCi0vLyAgICAgICAgICAvLyBoZWxwIGhlcmUgLi4uIGJ1dCB3ZSBuZWVkIHRvIGludmVzdGlnYXRlIGZ1cnRoZXIKLS8vICAgICAgICAgIG5ldyBYU0RNb2RlbFJlY29uY2lsZUFkYXB0ZXIoeHNkU2NoZW1hLmdldEVsZW1lbnQoKS5nZXRPd25lckRvY3VtZW50KCksIHhzZFNjaGVtYSkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTm90aWZ5Q2hhbmdlKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgTm9kZUltcGwpCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgTm9kZUltcGwgbm9kZUltcGwgPSAoTm9kZUltcGwpbm90aWZpZXI7Ci0vLyAgICAgICAgICAgICAgICBpZiAoIW5vZGVJbXBsLmdldE1vZGVsKCkuaXNNb2RlbFN0YXRlQ2hhbmdpbmcoKSkKLS8vICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICAgICAgIHN1cGVyLmhhbmRsZU5vdGlmeUNoYW5nZShub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsKLS8vICAgICAgICAgICAgICAgICAgaW50ZXJuYWxEb2N1bWVudENoYW5nZWROb3RpZmllci5ub3RpZnlMaXN0ZW5lcnMobm90aWZpZXIsIGV2ZW50VHlwZSwgZmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7Ci0vLyAgICAgICAgICAgICAgICB9ICAKLS8vICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgIH07Ci0vLyAgICAgICAgeHNkUmVzb3VyY2Uuc2V0TW9kaWZpZWQoZmFsc2UpOwotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgICBjYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpCi0vLyAgICB7Ci0vLyAgICB9Ci0vLyAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotLy8gICAgewotLy8gICAgfQotICAgIHJldHVybiBtb2RlbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotICAgIFhTRE1vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSBudWxsOwotICAgIElET01Eb2N1bWVudCBkb2MgPSBudWxsOwotICAgIElEb2N1bWVudCBpZG9jID0gc3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpOwotICAgIGlmIChpZG9jICE9IG51bGwpCi0gICAgewotICAgICAgc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChpZG9jKTsKLSAgICAgIGlmICgoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpICYmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGlmICgoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpICYmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGRvYyA9ICgoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBpZiAoZG9jICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1vZGVsQWRhcHRlciA9IChYU0RNb2RlbEFkYXB0ZXIpIGRvYy5nZXRFeGlzdGluZ0FkYXB0ZXIoWFNETW9kZWxBZGFwdGVyLmNsYXNzKTsKLSAgICAgICAgICAgICAgaWYgKG1vZGVsQWRhcHRlciAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG9jLmdldE1vZGVsKCkucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKG1vZGVsQWRhcHRlci5nZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKSk7Ci0gICAgICAgICAgICAgICAgZG9jLnJlbW92ZUFkYXB0ZXIobW9kZWxBZGFwdGVyLmdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpKTsKLSAgICAgICAgICAgICAgICBkb2MucmVtb3ZlQWRhcHRlcihtb2RlbEFkYXB0ZXIpOwotICAgICAgICAgICAgICAgIG1vZGVsQWRhcHRlci5jbGVhcigpOwotICAgICAgICAgICAgICAgIG1vZGVsQWRhcHRlciA9IG51bGw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgCi0KLQotICAgIGlmIChmT3V0bGluZVBhZ2UgIT0gbnVsbCkKLSAgICB7Ci0vLyAgICAgIGlmIChmT3V0bGluZVBhZ2UgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UgJiYgZk91dGxpbmVMaXN0ZW5lciAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgKChDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UpIGZPdXRsaW5lUGFnZSkucmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihmT3V0bGluZUxpc3RlbmVyKTsKLS8vICAgICAgfQotICAgICAgaWYgKGZPdXRsaW5lTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZk91dGxpbmVQYWdlLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmT3V0bGluZUxpc3RlbmVyKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmWFNEU2VsZWN0aW9uTGlzdGVuZXIpOwotICAgIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih4c2RQcmVmZXJlbmNlU3RvcmVMaXN0ZW5lcik7Ci0gICAgeHNkUHJlZmVyZW5jZVN0b3JlTGlzdGVuZXIgPSBudWxsOwotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHcmFwaGljYWxWaWV3ZXIoKQotICB7Ci0gICAgUm9vdENvbnRlbnRFZGl0UGFydCByb290ID0gbmV3IFJvb3RDb250ZW50RWRpdFBhcnQoKTsKLSAgICBpZiAoIShnZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUFEVEVkaXRvcklucHV0KSkKLSAgICB7Ci0gICAgICByb290LnNldE1vZGVsKG1vZGVsKTsKLSAgICB9Ci0gICAgZ3JhcGhpY2FsVmlld2VyLnNldENvbnRlbnRzKHJvb3QpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKQotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCk7Ci0gICAgZ3JhcGhpY2FsVmlld2VyLmdldEtleUhhbmRsZXIoKS5wdXQoS2V5U3Ryb2tlLmdldFByZXNzZWQoU1dULkYyLCAwKSwgZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oR0VGQWN0aW9uQ29uc3RhbnRzLkRJUkVDVF9FRElUKSk7Ci0gICAgLy8gZ2V0IGVkaXQgcGFydCBmYWN0b3J5IGZyb20gZXh0ZW5zaW9uCi0gICAgRWRpdFBhcnRGYWN0b3J5IGVkaXRQYXJ0RmFjdG9yeSA9IGdldEVkaXRvck1vZGVNYW5hZ2VyKCkuZ2V0Q3VycmVudE1vZGUoKS5nZXRFZGl0UGFydEZhY3RvcnkoKTsKLSAgICBncmFwaGljYWxWaWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGVkaXRQYXJ0RmFjdG9yeSk7ICAgCi0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgdHlwZSkKLSAgewotICAgIGlmICh0eXBlID09IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzKQotICAgIHsKLSAgICAgIFhTRFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHBhZ2UgPSBuZXcgWFNEVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UodGhpcyk7Ci0gICAgICByZXR1cm4gcGFnZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZSA9PSBJU2VsZWN0aW9uUHJvdmlkZXIuY2xhc3MpCi0gICAgewotICAgICAgcmV0dXJuIGdldFNlbGVjdGlvbk1hbmFnZXIoKTsKLSAgICB9ICAKLSAgICBlbHNlIGlmICh0eXBlID09IFhTRFNjaGVtYS5jbGFzcykKLSAgICB7Ci0gICAgICByZXR1cm4geHNkU2NoZW1hOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlID09IElLZXlib2FyZERyYWcuY2xhc3MpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBLZXlib2FyZERyYWdJbXBsKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgPT0gSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcykKLSAgICB7Ci0gICAgICBPYmplY3QgYWRhcHRlciA9IHN1cGVyLmdldEFkYXB0ZXIodHlwZSk7Ci0gICAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBJQ29udGVudE91dGxpbmVQYWdlIHBhZ2UgPSAoSUNvbnRlbnRPdXRsaW5lUGFnZSkgYWRhcHRlcjsKLSAgICAgICAgZk91dGxpbmVMaXN0ZW5lciA9IG5ldyBPdXRsaW5lVHJlZVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgICAgIHBhZ2UuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZPdXRsaW5lTGlzdGVuZXIpOwotICAgICAgICAKLS8vICAgICAgICBpZiAocGFnZSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICAoKENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSkgcGFnZSkuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihmT3V0bGluZUxpc3RlbmVyKTsKLS8vICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYWdlOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlID09IFhTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKQotICAgIHsKLSAgICAJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkKLSAgICAJewotICAgIAkJSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQ7Ci0gICAgCQkvLyBUT0RPIChjcykgY3VycmVudGx5IHdlIGFzc3VtZSB0aGUgc2NoZW1hIGVkaXRvciB3aWxsIG9ubHkgZXZlciBlZGl0IGEKLSAgICAJCS8vIHNpbmdsZSBzY2hlbWEKLSAgICAJCS8vLyBidXQgaWYgd2Ugd2FudCB0byBlbmFibGUgdGhlIHNjaGVtYSBlZGl0b3IgdG8gZWRpdCB3c2RsIGZpbGVzIHdlCi0gICAgCQkvLyBzaG91bGQgcGFzcyBpbgotICAgIAkJLy8gYW4gYXJyYXkgb2Ygc2NoZW1hcwotICAgIAkJLy8gaG1tLi4gcGVyaGFwcyBqdXN0IHBhc3MgaW4gYSBSZXNvdXJjZVNldAotICAgIAkJWFNEU2NoZW1hW10gc2NoZW1hcyA9IHt4c2RTY2hlbWF9OwotICAgIAkJcmV0dXJuIG5ldyBYU0RBdHRyaWJ1dGVSZWZlcmVuY2VFZGl0TWFuYWdlcihmaWxlRWRpdG9ySW5wdXQuZ2V0RmlsZSgpLCBzY2hlbWFzKTsKLSAgICAJfQotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlID09IFhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcykKLSAgICB7Ci0gICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotICAgICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkKLSAgICAgIHsKLSAgICAgICAgSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQ7Ci0gICAgICAgIC8vIFRPRE8gKGNzKSBjdXJyZW50bHkgd2UgYXNzdW1lIHRoZSBzY2hlbWEgZWRpdG9yIHdpbGwgb25seSBldmVyIGVkaXQgYQotICAgICAgICAvLyBzaW5nbGUgc2NoZW1hCi0gICAgICAgIC8vLyBidXQgaWYgd2Ugd2FudCB0byBlbmFibGUgdGhlIHNjaGVtYSBlZGl0b3IgdG8gZWRpdCB3c2RsIGZpbGVzIHdlCi0gICAgICAgIC8vIHNob3VsZCBwYXNzIGluCi0gICAgICAgIC8vIGFuIGFycmF5IG9mIHNjaGVtYXMKLSAgICAgICAgLy8gaG1tLi4gcGVyaGFwcyBqdXN0IHBhc3MgaW4gYSBSZXNvdXJjZVNldAotICAgICAgICBYU0RTY2hlbWFbXSBzY2hlbWFzID0ge3hzZFNjaGVtYX07Ci0gICAgICAgIHJldHVybiBuZXcgWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCksIHNjaGVtYXMpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlID09IFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcykKLSAgICB7Ci0gICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotICAgICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkKLSAgICAgIHsKLSAgICAgICAgSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQ7Ci0gICAgICAgIC8vIFRPRE8gKGNzKSBjdXJyZW50bHkgd2UgYXNzdW1lIHRoZSBzY2hlbWEgZWRpdG9yIHdpbGwgb25seSBldmVyIGVkaXQgYQotICAgICAgICAvLyBzaW5nbGUgc2NoZW1hCi0gICAgICAgIC8vIGJ1dCBpZiB3ZSB3YW50IHRvIGVuYWJsZSB0aGUgc2NoZW1hIGVkaXRvciB0byBlZGl0IHdzZGwgZmlsZXMgd2UKLSAgICAgICAgLy8gc2hvdWxkIHBhc3MgaW4KLSAgICAgICAgLy8gYW4gYXJyYXkgb2Ygc2NoZW1hcwotICAgICAgICAvLyBobW0uLiBwZXJoYXBzIGp1c3QgcGFzcyBpbiBhIFJlc291cmNlU2V0Ci0gICAgICAgIFhTRFNjaGVtYVtdIHNjaGVtYXMgPSB7eHNkU2NoZW1hfTsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIoZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKSwgc2NoZW1hcyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgPT0gWFNEQ29tcGxleFR5cGVCYXNlVHlwZUVkaXRNYW5hZ2VyLmNsYXNzKQotICAgIHsKLSAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0gICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotICAgICAgewotICAgICAgICBJRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dDsKLSAgICAgICAgLy8gVE9ETyAoY3MpIGN1cnJlbnRseSB3ZSBhc3N1bWUgdGhlIHNjaGVtYSBlZGl0b3Igd2lsbCBvbmx5IGV2ZXIgZWRpdCBhCi0gICAgICAgIC8vIHNpbmdsZSBzY2hlbWEKLSAgICAgICAgLy8gYnV0IGlmIHdlIHdhbnQgdG8gZW5hYmxlIHRoZSBzY2hlbWEgZWRpdG9yIHRvIGVkaXQgd3NkbCBmaWxlcyB3ZQotICAgICAgICAvLyBzaG91bGQgcGFzcyBpbgotICAgICAgICAvLyBhbiBhcnJheSBvZiBzY2hlbWFzCi0gICAgICAgIC8vIGhtbS4uIHBlcmhhcHMganVzdCBwYXNzIGluIGEgUmVzb3VyY2VTZXQKLSAgICAgICAgWFNEU2NoZW1hW10gc2NoZW1hcyA9IHt4c2RTY2hlbWF9OwotICAgICAgICByZXR1cm4gbmV3IFhTRENvbXBsZXhUeXBlQmFzZVR5cGVFZGl0TWFuYWdlcihmaWxlRWRpdG9ySW5wdXQuZ2V0RmlsZSgpLCBzY2hlbWFzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZSA9PSBYU0RTdWJzdGl0dXRpb25Hcm91cEVkaXRNYW5hZ2VyLmNsYXNzKQotICAgIHsKLSAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0gICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotICAgICAgewotICAgICAgICBJRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dDsKLSAgICAgICAgWFNEU2NoZW1hW10gc2NoZW1hcyA9IHt4c2RTY2hlbWF9OwotICAgICAgICByZXR1cm4gbmV3IFhTRFN1YnN0aXR1dGlvbkdyb3VwRWRpdE1hbmFnZXIoZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKSwgc2NoZW1hcyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgPT0gSVRleHRFZGl0b3IuY2xhc3MpCi0gICAgewotICAgICAgcmV0dXJuIGdldFRleHRFZGl0b3IoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZSA9PSBJU2VsZWN0aW9uTWFwcGVyLmNsYXNzKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgWFNEU2VsZWN0aW9uTWFwcGVyKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgPT0gSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyLmNsYXNzKQotICAgIHsKLSAgICAgIHJldHVybiBpbnRlcm5hbERvY3VtZW50Q2hhbmdlZE5vdGlmaWVyOwotICAgIH0gIAotICAgIGVsc2UgaWYgKHR5cGUgPT0gUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5jbGFzcykKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIoKTsKLSAgICB9ICAKLSAgICByZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcih0eXBlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29udHJpYnV0b3JJZCgpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIFhTRFNjaGVtYSBnZXRYU0RTY2hlbWEoKQotICB7Ci0gICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2Qgb3Blbk9uR2xvYmFsUmVmZXJlbmNlLiBUaGUgY29tcCBhcmd1bWVudCBpcyBhIHJlc29sdmVkIHhzZCBzY2hlbWEKLSAgICogb2JqZWN0IGZyb20gYW5vdGhlciBmaWxlLiBUaGlzIGlzIGNyZWF0ZWQgYW5kIGNhbGxlZCBmcm9tIGFub3RoZXIgc2NoZW1hCi0gICAqIG1vZGVsIHRvIGFsbG93IEYzIG5hdmlnYXRpb24gdG8gb3BlbiBhIG5ldyBlZGl0b3IgYW5kIGNob29zZSB0aGUgcmVmZXJlbmNlZAotICAgKiBvYmplY3Qgd2l0aGluIHRoYXQgZWRpdG9yIGNvbnRleHQKLSAgICogCi0gICAqIEBwYXJhbSBjb21wCi0gICAqLwotICBwdWJsaWMgdm9pZCBvcGVuT25HbG9iYWxSZWZlcmVuY2UoWFNEQ29uY3JldGVDb21wb25lbnQgY29tcCkKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50ID0gb3Blbk9uU2VsZWN0aW9uSGVscGVyLm9wZW5Pbkdsb2JhbFJlZmVyZW5jZShjb21wKTsKLSAgICAKLSAgICBpZiAobmFtZWRDb21wb25lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lZENvbXBvbmVudCA9IGdldFhTRFNjaGVtYSgpOwotICAgIH0KLSAgICBYU0RCYXNlQWRhcHRlciBhZGFwdGVyID0gKFhTREJhc2VBZGFwdGVyKSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KG5hbWVkQ29tcG9uZW50KTsKLSAgICBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGFkYXB0ZXIpKTsKLSAgICBJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFNldElucHV0VG9HcmFwaFZpZXcuSUQpOwotICAgIGlmIChhY3Rpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgfQotCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBPcGVuT25TZWxlY3Rpb25IZWxwZXIgb3Blbk9uU2VsZWN0aW9uSGVscGVyOwotCi0gIHB1YmxpYyBPcGVuT25TZWxlY3Rpb25IZWxwZXIgZ2V0T3Blbk9uU2VsZWN0aW9uSGVscGVyKCkKLSAgewotICAgIHJldHVybiBvcGVuT25TZWxlY3Rpb25IZWxwZXI7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyB0aGUgcGFnZXMgb2YgdGhlIG11bHRpLXBhZ2UgZWRpdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUGFnZXMoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlUGFnZXMoKTsKLSAgICAKLS8vICAgIHNlbGVjdGlvblByb3ZpZGVyID0gZ2V0U2VsZWN0aW9uTWFuYWdlcigpOwotLy8gICAgZ2V0RWRpdG9yU2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKHNlbGVjdGlvblByb3ZpZGVyKTsKLS8vICAgIAotLy8gICAgc3RydWN0dXJlZFRleHRFZGl0b3IgPSBuZXcgU3RydWN0dXJlZFRleHRFZGl0b3IoKTsKLS8vICAgIG1vZGVsID0gYnVpbGRNb2RlbCgoSUZpbGVFZGl0b3JJbnB1dCkgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0vLyAgICBjcmVhdGVHcmFwaFBhZ2UoKTsKLS8vICAgIGNyZWF0ZVNvdXJjZVBhZ2UoKTsKLQotICAgIG9wZW5PblNlbGVjdGlvbkhlbHBlciA9IG5ldyBPcGVuT25TZWxlY3Rpb25IZWxwZXIoZ2V0VGV4dEVkaXRvcigpLCBnZXRYU0RTY2hlbWEoKSk7Ci0KLSAgICBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLSAgICBmU291cmNlRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU291cmNlRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIoKTsKLSAgICBpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBJUG9zdFNlbGVjdGlvblByb3ZpZGVyKQotICAgIHsKLSAgICAgICgoSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgcHJvdmlkZXIpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlNvdXJjZUVkaXRvclNlbGVjdGlvbkxpc3RlbmVyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmU291cmNlRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIpOwotICAgIH0KLSAgICBmWFNEU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgWFNEU2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0gICAgZ2V0U2VsZWN0aW9uTWFuYWdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmWFNEU2VsZWN0aW9uTGlzdGVuZXIpOwotICAgIAotICAgIHhzZFByZWZlcmVuY2VTdG9yZUxpc3RlbmVyID0gbmV3IFhTRFByZWZlcmVuY2VTdG9yZUxpc3RlbmVyKCk7Ci0gICAgWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHhzZFByZWZlcmVuY2VTdG9yZUxpc3RlbmVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBYU0RQcmVmZXJlbmNlU3RvcmVMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJvcGVydHkgPSBldnQuZ2V0UHJvcGVydHkoKTsKLSAgICAgIGlmIChYU0RFZGl0b3JQbHVnaW4uQ09OU1RfU0hPV19FWFRFUk5BTFMuZXF1YWxzKHByb3BlcnR5KSkKLSAgICAgIHsKLSAgICAgICAgKChHcmFwaGljYWxFZGl0UGFydCkgZ3JhcGhpY2FsVmlld2VyLmdldENvbnRlbnRzKCkpLmdldEZpZ3VyZSgpLmludmFsaWRhdGVUcmVlKCk7Ci0gICAgICAgIGdyYXBoaWNhbFZpZXdlci5nZXRDb250ZW50cygpLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLSAgewotICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0gICAgcmV0dXJuICEoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0IHx8IGVkaXRvcklucHV0IGluc3RhbmNlb2YgRmlsZVN0b3JlRWRpdG9ySW5wdXQpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLSAgICAKLSAgICBBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IGdldEFjdGlvblJlZ2lzdHJ5KCk7Ci0gICAgCi0gICAgLy8gYWRkIGFuIGlzUmVhZE9ubHkgbWV0aG9kIHRvIHRoZSBlZGl0b3JQYXJ0IGluc3RlYWQKLSAgICBpZiAoIWlzUmVhZE9ubHkoKSkKLSAgICB7Ci0gICAgQmFzZVNlbGVjdGlvbkFjdGlvbiBhY3Rpb24gPSBuZXcgQWRkRmllbGRBY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICBhY3Rpb24gPSBuZXcgRGVsZXRlQWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgCi0gICAgYWN0aW9uID0gbmV3IERlc2lnblNlbGVjdEFsbCh0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotICAgIAotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RSZWRlZmluZWRDb21wbGV4VHlwZUFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsIE1lc3NhZ2VzLl9VSV9JTUFHRV9DT01QTEVYX1RZUEUpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotICAgIAotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RSZWRlZmluZWRTaW1wbGVUeXBlQWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgTWVzc2FnZXMuX1VJX0lNQUdFX1NJTVBMRV9UWVBFKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEUmVkZWZpbmVkQXR0cmlidXRlR3JvdXBBY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCBNZXNzYWdlcy5fVUlfSU1BR0VfQVRUUklCVVRFX0dST1VQKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEUmVkZWZpbmVkTW9kZWxHcm91cEFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsIE1lc3NhZ2VzLl9VSV9JTUFHRV9NT0RFTF9HUk9VUCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgCi0gICAgYWN0aW9uID0gbmV3IFNldEJhc2VUeXBlQWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTREVsZW1lbnRBY3Rpb24odGhpcywgQWRkWFNERWxlbWVudEFjdGlvbi5JRCwgTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRUxFTUVOVCwgZmFsc2UpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREVsZW1lbnQuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNERWxlbWVudEFjdGlvbih0aGlzLCBBZGRYU0RFbGVtZW50QWN0aW9uLkJFRk9SRV9TRUxFQ1RFRF9JRCwgTWVzc2FnZXMuX1VJX0FDVElPTl9CRUZPUkUsIGZhbHNlKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RFbGVtZW50LmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOyAgICAgICAKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNERWxlbWVudEFjdGlvbih0aGlzLCBBZGRYU0RFbGVtZW50QWN0aW9uLkFGVEVSX1NFTEVDVEVEX0lELCBNZXNzYWdlcy5fVUlfQUNUSU9OX0FGVEVSLCBmYWxzZSk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNERWxlbWVudC5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsgICAgICAKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNERWxlbWVudEFjdGlvbih0aGlzLCBBZGRYU0RFbGVtZW50QWN0aW9uLlJFRl9JRCwgTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRUxFTUVOVF9SRUYsIHRydWUpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREVsZW1lbnRSZWYuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNETW9kZWxHcm91cEFjdGlvbih0aGlzLCBYU0RDb21wb3NpdG9yLlNFUVVFTkNFX0xJVEVSQUwsIEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24uU0VRVUVOQ0VfSUQpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTRFNlcXVlbmNlLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24odGhpcywgWFNEQ29tcG9zaXRvci5DSE9JQ0VfTElURVJBTCwgQWRkWFNETW9kZWxHcm91cEFjdGlvbi5DSE9JQ0VfSUQpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTRENob2ljZS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNETW9kZWxHcm91cEFjdGlvbih0aGlzLCBYU0RDb21wb3NpdG9yLkFMTF9MSVRFUkFMLCBBZGRYU0RNb2RlbEdyb3VwQWN0aW9uLkFMTF9JRCk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEQWxsLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uKHRoaXMsIGZhbHNlKTsKLSAgICBhY3Rpb24uc2V0SWQoQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb24uTU9ERUxHUk9VUERFRklOSVRJT05fSUQpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREdyb3VwLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uKHRoaXMsIHRydWUpOwotICAgIGFjdGlvbi5zZXRJZChBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbi5NT0RFTEdST1VQREVGSU5JVElPTlJFRl9JRCk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihYU0RFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9vYmoxNi9YU0RHcm91cFJlZi5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25BY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEQ29tcGxleFR5cGUuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25BY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RBdHRyaWJ1dGUuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24odGhpcywgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uQkVGT1JFX1NFTEVDVEVEX0lELCBNZXNzYWdlcy5fVUlfQUNUSU9OX0JFRk9SRSwgZmFsc2UpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREF0dHJpYnV0ZS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24odGhpcywgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uQUZURVJfU0VMRUNURURfSUQsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUZURVIsIGZhbHNlKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RBdHRyaWJ1dGUuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uKHRoaXMsIEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLlJFRl9JRCwgTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX1JFRiwgdHJ1ZSk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEQXR0cmlidXRlUmVmLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IE9wZW5Jbk5ld0VkaXRvcih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbih0aGlzKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RBdHRyaWJ1dGVHcm91cC5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb24odGhpcywgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uLlJFRl9JRCk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICBhY3Rpb24gPSBuZXcgRGVsZXRlWFNEQ29uY3JldGVDb21wb25lbnRBY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RBbnlFbGVtZW50QWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREFueS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREFueUF0dHJpYnV0ZS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uKHRoaXMsIEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbi5JTkNMVURFX0lELCBNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9JTkNMVURFKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RJbmNsdWRlLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEU2ltcGxlRW51bS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNERW51bWVyYXRpb25GYWNldEFjdGlvbih0aGlzLCBBZGRYU0RFbnVtZXJhdGlvbkZhY2V0QWN0aW9uLkJFRk9SRV9TRUxFQ1RFRF9JRCwgTWVzc2FnZXMuX1VJX0FDVElPTl9CRUZPUkUpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTRFNpbXBsZUVudW0uZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7ICAgICAgIAotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb24odGhpcywgQWRkWFNERW51bWVyYXRpb25GYWNldEFjdGlvbi5BRlRFUl9TRUxFQ1RFRF9JRCwgTWVzc2FnZXMuX1VJX0FDVElPTl9BRlRFUik7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEU2ltcGxlRW51bS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsgICAgICAgCi0KLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uKHRoaXMsIEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbi5JTVBPUlRfSUQsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0lNUE9SVCk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNESW1wb3J0LmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbih0aGlzLCBBZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb24uUkVERUZJTkVfSUQsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX1JFREVGSU5FKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RSZWRlZmluZS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBTZXRUeXBlQWN0aW9uIHNldE5ld0NvbXBsZXhUeXBlQWN0aW9uID0gbmV3IFNldFR5cGVBY3Rpb24oTWVzc2FnZXMuX1VJX0FDVElPTl9ORVcsIFNldFR5cGVBY3Rpb24uU0VUX05FV19UWVBFX0lELCB0aGlzKTsKLSAgICBzZXROZXdDb21wbGV4VHlwZUFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIAotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKHNldE5ld0NvbXBsZXhUeXBlQWN0aW9uKTsKLSAgICAgICAgCi0gICAgU2V0VHlwZUFjdGlvbiBzZXRFeGlzdGluZ1R5cGVBY3Rpb24gPSBuZXcgU2V0VHlwZUFjdGlvbihNZXNzYWdlcy5fVUlfQUNUSU9OX0JST1dTRSwgU2V0VHlwZUFjdGlvbi5TRUxFQ1RfRVhJU1RJTkdfVFlQRV9JRCwgdGhpcyk7Ci0gICAgc2V0RXhpc3RpbmdUeXBlQWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oc2V0RXhpc3RpbmdUeXBlQWN0aW9uKTsKLQotICAgIGFkZE11bHRpcGxpY2l0eU1lbnUocmVnaXN0cnkpOwotICAgIAotICAgIFByaW50QWN0aW9uIHByaW50QWN0aW9uID0gbmV3IFByaW50QWN0aW9uKHRoaXMpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKHByaW50QWN0aW9uKTsKLSAgICAKLSAgICBCYXNlRGlyZWN0RWRpdEFjdGlvbiBkaXJlY3RFZGl0QWN0aW9uID0gbmV3IEJhc2VEaXJlY3RFZGl0QWN0aW9uKHRoaXMpOwotICAgIGRpcmVjdEVkaXRBY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihkaXJlY3RFZGl0QWN0aW9uKTsKLSAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEJhc2VTZWxlY3Rpb25BY3Rpb24gYWN0aW9uID0gbmV3IE9wZW5Jbk5ld0VkaXRvcih0aGlzKTsKLSAgICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgICAgYWN0aW9uID0gbmV3IFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbih0aGlzKTsKLSAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgICAKLSAgICAgIFByaW50QWN0aW9uIHByaW50QWN0aW9uID0gbmV3IFByaW50QWN0aW9uKHRoaXMpOwotICAgICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24ocHJpbnRBY3Rpb24pOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgYWRkTXVsdGlwbGljaXR5TWVudShBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSkKLSAgewotICAgIFNldE11bHRpcGxpY2l0eUFjdGlvbiBvbmVNdWx0aXBsaWNpdHkgPSBuZXcgU2V0TXVsdGlwbGljaXR5QWN0aW9uKHRoaXMsICIxLi4xICgiICsgTWVzc2FnZXMuX1VJX0xBQkVMX1JFUVVJUkVEICsgIikiLCBTZXRNdWx0aXBsaWNpdHlBY3Rpb24uUkVRVUlSRURfSUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBvbmVNdWx0aXBsaWNpdHkuc2V0TWF4T2NjdXJzKDEpOwotICAgIG9uZU11bHRpcGxpY2l0eS5zZXRNaW5PY2N1cnMoMSk7Ci0gICAgb25lTXVsdGlwbGljaXR5LnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24ob25lTXVsdGlwbGljaXR5KTsKLQotICAgIFNldE11bHRpcGxpY2l0eUFjdGlvbiB6ZXJvT3JNb3JlTXVsdGlwbGljaXR5ID0gbmV3IFNldE11bHRpcGxpY2l0eUFjdGlvbih0aGlzLCAiMC4uKiAoIiArIE1lc3NhZ2VzLl9VSV9MQUJFTF9aRVJPX09SX01PUkUgKyAiKSIsIFNldE11bHRpcGxpY2l0eUFjdGlvbi5aRVJPX09SX01PUkVfSUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB6ZXJvT3JNb3JlTXVsdGlwbGljaXR5LnNldE1heE9jY3VycygtMSk7Ci0gICAgemVyb09yTW9yZU11bHRpcGxpY2l0eS5zZXRNaW5PY2N1cnMoMCk7Ci0gICAgemVyb09yTW9yZU11bHRpcGxpY2l0eS5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKHplcm9Pck1vcmVNdWx0aXBsaWNpdHkpOwotICAgIAotICAgIFNldE11bHRpcGxpY2l0eUFjdGlvbiB6ZXJvT3JPbmVNdWx0aXBsaWNpdHkgPSBuZXcgU2V0TXVsdGlwbGljaXR5QWN0aW9uKHRoaXMsICIwLi4xICgiICsgTWVzc2FnZXMuX1VJX0xBQkVMX09QVElPTkFMICsgIikiLCBTZXRNdWx0aXBsaWNpdHlBY3Rpb24uWkVST19PUl9PTkVfSUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB6ZXJvT3JPbmVNdWx0aXBsaWNpdHkuc2V0TWF4T2NjdXJzKDEpOwotICAgIHplcm9Pck9uZU11bHRpcGxpY2l0eS5zZXRNaW5PY2N1cnMoMCk7Ci0gICAgemVyb09yT25lTXVsdGlwbGljaXR5LnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oemVyb09yT25lTXVsdGlwbGljaXR5KTsKLQotICAgIFNldE11bHRpcGxpY2l0eUFjdGlvbiBvbmVPck1vcmVNdWx0aXBsaWNpdHkgPSBuZXcgU2V0TXVsdGlwbGljaXR5QWN0aW9uKHRoaXMsICIxLi4qICgiICsgTWVzc2FnZXMuX1VJX0xBQkVMX09ORV9PUl9NT1JFICsgIikiLCBTZXRNdWx0aXBsaWNpdHlBY3Rpb24uT05FX09SX01PUkVfSUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBvbmVPck1vcmVNdWx0aXBsaWNpdHkuc2V0TWF4T2NjdXJzKC0xKTsKLSAgICBvbmVPck1vcmVNdWx0aXBsaWNpdHkuc2V0TWluT2NjdXJzKDEpOwotICAgIG9uZU9yTW9yZU11bHRpcGxpY2l0eS5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKG9uZU9yTW9yZU11bHRpcGxpY2l0eSk7Ci0gICAgCi0gIH0KLQotICAvKioKLSAgICogTGlzdGVuZXIgb24gU1NFJ3Mgb3V0bGluZSBwYWdlJ3Mgc2VsZWN0aW9ucyB0aGF0IGNvbnZlcnRzIERPTSBzZWxlY3Rpb25zCi0gICAqIGludG8geHNkIHNlbGVjdGlvbnMgYW5kIG5vdGlmaWVzIFhTRCBzZWxlY3Rpb24gbWFuYWdlcgotICAgKi8KLSAgY2xhc3MgT3V0bGluZVRyZWVTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElEb3VibGVDbGlja0xpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgT3V0bGluZVRyZWVTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpCi0gICAgewotICAgIH0KLQotICAgIHByaXZhdGUgSVNlbGVjdGlvbiBnZXRYU0RTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gICAgewotICAgICAgSVNlbGVjdGlvbiBzZWwgPSBudWxsOwotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICAgIE9iamVjdCBvID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKG8gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG8pOwotICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICB9Ci0gICAgICByZXR1cm4gc2VsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgRE9NIG5vZGUgYmFzZWQgb24gb2JqZWN0ICh4c2Qgbm9kZSkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGdldE9iamVjdEZvck90aGVyTW9kZWwoT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSBudWxsOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5vZGUpCi0gICAgICB7Ci0gICAgICAgIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBub2RlID0gKChYU0RDb21wb25lbnQpIG9iamVjdCkuZ2V0RWxlbWVudCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgUmVkZWZpbmVDYXRlZ29yeUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIG5vZGUgPSAoKFJlZGVmaW5lQ2F0ZWdvcnlBZGFwdGVyKSBvYmplY3QpLmdldFhTRFJlZGVmaW5lKCkuZ2V0RWxlbWVudCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ2F0ZWdvcnlBZGFwdGVyKQotICAgICAgewotICAgICAgICBub2RlID0gKChDYXRlZ29yeUFkYXB0ZXIpIG9iamVjdCkuZ2V0WFNEU2NoZW1hKCkuZ2V0RWxlbWVudCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIGlmICgoKFhTREJhc2VBZGFwdGVyKSBvYmplY3QpLmdldFRhcmdldCgpIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBub2RlID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgKChYU0RCYXNlQWRhcHRlcikgb2JqZWN0KS5nZXRUYXJnZXQoKSkuZ2V0RWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyB0aGUgdGV4dCBlZGl0b3IgY2FuIG9ubHkgYWNjZXB0IHNlZCBub2RlcyEKLSAgICAgIC8vCi0gICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpKQotICAgICAgewotICAgICAgICBub2RlID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBub2RlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIFNlbGVjdGlvbiBpbiBvdXRsaW5lIHRyZWUgY2hhbmdlZCBzbyBzZXQgb3V0bGluZSB0cmVlJ3Mgc2VsZWN0aW9uIGludG8KLSAgICAgICAqIGVkaXRvcidzIHNlbGVjdGlvbiBhbmQgc2F5IGl0IGNhbWUgZnJvbSBvdXRsaW5lIHRyZWUKLSAgICAgICAqLwotICAgICAgaWYgKGdldFNlbGVjdGlvbk1hbmFnZXIoKSAhPSBudWxsICYmIGdldFNlbGVjdGlvbk1hbmFnZXIoKS5nZXRFbmFibGVOb3RpZnkoKSkKLSAgICAgIHsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRYU0RTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZk91dGxpbmVQYWdlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0VGV4dEVkaXRvcigpICE9IG51bGwgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgc3RhcnQgPSAtMTsKLSAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKLSAgICAgICAgICBPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgaWYgKG8gIT0gbnVsbCkKLSAgICAgICAgICAgIG8gPSBnZXRPYmplY3RGb3JPdGhlck1vZGVsKG8pOwotICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbykuZ2V0U3RhcnRPZmZzZXQoKTsKLSAgICAgICAgICAgIGxlbmd0aCA9ICgoSW5kZXhlZFJlZ2lvbikgbykuZ2V0RW5kT2Zmc2V0KCkgLSBzdGFydDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHN0YXJ0ID4gLTEpCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2V0VGV4dEVkaXRvcigpLnNlbGVjdEFuZFJldmVhbChzdGFydCwgbGVuZ3RoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogU2VsZWN0aW9uIGluIG91dGxpbmUgdHJlZSBjaGFuZ2VkIHNvIHNldCBvdXRsaW5lIHRyZWUncyBzZWxlY3Rpb24gaW50bwotICAgICAgICogZWRpdG9yJ3Mgc2VsZWN0aW9uIGFuZCBzYXkgaXQgY2FtZSBmcm9tIG91dGxpbmUgdHJlZQotICAgICAgICovCi0gICAgICBpZiAoZ2V0U2VsZWN0aW9uTWFuYWdlcigpICE9IG51bGwgJiYgZ2V0U2VsZWN0aW9uTWFuYWdlcigpLmdldEVuYWJsZU5vdGlmeSgpKQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFhTRFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGdldFNlbGVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmT3V0bGluZVBhZ2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotIAotICAvKioKLSAgICogTGlzdGVuZXIgb24gU1NFJ3Mgc291cmNlIGVkaXRvcidzIHNlbGVjdGlvbnMgdGhhdCBjb252ZXJ0cyBET00gc2VsZWN0aW9ucwotICAgKiBpbnRvIHhzZCBzZWxlY3Rpb25zIGFuZCBub3RpZmllcyBYU0Qgc2VsZWN0aW9uIG1hbmFnZXIKLSAgICovCi0gIHByaXZhdGUgY2xhc3MgU291cmNlRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gIHsKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIFhTRCBub2RlIGJhc2VkIG9uIG9iamVjdCAoRE9NIG5vZGUpCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCBnZXRYU0ROb2RlKE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgLy8gZ2V0IHRoZSBlbGVtZW50IG5vZGUKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLSAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgewotICAgICAgICAgICAgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlbGVtZW50ID0gKChBdHRyKSBub2RlKS5nZXRPd25lckVsZW1lbnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtb2RlbDsgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBPYmplY3QgbyA9IGVsZW1lbnQ7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBPYmplY3QgbW9kZWxPYmplY3QgPSBnZXRYU0RTY2hlbWEoKS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KGVsZW1lbnQpOwotICAgICAgICBpZiAobW9kZWxPYmplY3QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG8gPSBtb2RlbE9iamVjdDsKLSAgICAgICAgICBvID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCgoTm90aWZpZXIpIG1vZGVsT2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG87Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgaWYgKGdldFNlbGVjdGlvbk1hbmFnZXIoKS5nZXRFbmFibGVOb3RpZnkoKSAmJiBnZXRBY3RpdmVQYWdlKCkgPT0gMSkKLSAgICAgIHsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdCB4c2RTZWxlY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBkb21Ob2RlID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICBPYmplY3QgeHNkTm9kZSA9IGdldFhTRE5vZGUoZG9tTm9kZSk7Ci0gICAgICAgICAgICBpZiAoeHNkTm9kZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4c2RTZWxlY3Rpb25zLmFkZCh4c2ROb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh4c2ROb2RlIGluc3RhbmNlb2YgWFNEUmVkZWZpbmVBZGFwdGVyKQotICAgICAgICAgICAgCXJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCF4c2RTZWxlY3Rpb25zLmlzRW1wdHkoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHhzZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHhzZFNlbGVjdGlvbnMpOwotICAgICAgICAgICAgZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNldFNlbGVjdGlvbih4c2RTZWxlY3Rpb24sIGdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIExpc3RlbmVyIG9uIFhTRCdzIHNlbGVjdGlvbiBtYW5hZ2VyJ3Mgc2VsZWN0aW9ucyB0aGF0IGNvbnZlcnRzIFhTRAotICAgKiBzZWxlY3Rpb25zIGludG8gRE9NIHNlbGVjdGlvbnMgYW5kIG5vdGlmaWVzIFNTRSdzIHNlbGVjdGlvbiBwcm92aWRlcgotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBYU0RTZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gIHsKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIERPTSBub2RlIGJhc2VkIG9uIG9iamVjdCAoeHNkIG5vZGUpCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCBnZXRPYmplY3RGb3JPdGhlck1vZGVsKE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgTm9kZSBub2RlID0gbnVsbDsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKQotICAgICAgewotICAgICAgICBub2RlID0gKE5vZGUpIG9iamVjdDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9ICgoWFNEQ29tcG9uZW50KSBvYmplY3QpLmdldEVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJlZGVmaW5lQ2F0ZWdvcnlBZGFwdGVyKQotICAgICAgewotICAgICAgICBSZWRlZmluZUNhdGVnb3J5QWRhcHRlciBjYXRlZ29yeSA9IChSZWRlZmluZUNhdGVnb3J5QWRhcHRlcilvYmplY3Q7Ci0gICAgICAgIG5vZGUgPSBjYXRlZ29yeS5nZXRYU0RSZWRlZmluZSgpLmdldEVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENhdGVnb3J5QWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9ICgoQ2F0ZWdvcnlBZGFwdGVyKSBvYmplY3QpLmdldFhTRFNjaGVtYSgpLmdldEVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgICAgewotICAgICAgICBpZiAoKChYU0RCYXNlQWRhcHRlcikgb2JqZWN0KS5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgbm9kZSA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpICgoWFNEQmFzZUFkYXB0ZXIpIG9iamVjdCkuZ2V0VGFyZ2V0KCkpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgewotICAgICAgICAvLyBUaGlzIGNhc2Ugd2FzIGFkZGVkIHRvIG1ha2UgdGhlIEYzL2h5cGVybGluayBuYXZpZ2F0aW9uIHdvcmsgd2hlbiBhbgotICAgICAgICAvLyBpbmxpbmUgc2NoZW1hIGZyb20gYSBXU0RMIGRvY3VtZW50IGlzIG9wZW5lZCBpbiB0aGUgc2NoZW1hIGVkaXRvci4KLSAgICAgICAgLy8gVGhlIHN0cmluZyBpcyBleHBlY3RlZCB0byBiZSBhIFVSSSBmcmFnbWVudCB1c2VkIHRvIGlkZW50aWZ5IGFuIFhTRAotICAgICAgICAvLyBjb21wb25lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGVuY2xvc2luZyBXU0RMIHJlc291cmNlLgotCi0gICAgICAgIFN0cmluZyB1cmlGcmFnbWVudCA9IChTdHJpbmcpIG9iamVjdDsKLSAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSB4c2RTY2hlbWEuZVJlc291cmNlKCk7Ci0gICAgICAgIEVPYmplY3QgbW9kZWxPYmplY3QgPSByZXNvdXJjZS5nZXRFT2JqZWN0KHVyaUZyYWdtZW50KTsKLQotICAgICAgICBpZiAobW9kZWxPYmplY3QgIT0gbnVsbCAmJiBtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRENvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgIFhTRENvbXBvbmVudCBjb21wb25lbnQgPSAoWFNEQ29tcG9uZW50KSBtb2RlbE9iamVjdDsKLSAgICAgICAgICBub2RlID0gY29tcG9uZW50LmdldEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICAvLyB0aGUgdGV4dCBlZGl0b3IgY2FuIG9ubHkgYWNjZXB0IHNlZCBub2RlcyEKLSAgICAgIC8vCi0gICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpKQotICAgICAgewotICAgICAgICBub2RlID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBub2RlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgIHsKLQkJLy8gZG8gbm90IGZpcmUgc2VsZWN0aW9uIGluIHNvdXJjZSBlZGl0b3IgaWYgdGhlIGN1cnJlbnQgYWN0aXZlIHBhZ2UgaXMgdGhlIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIChzb3VyY2UpCi0JCS8vIFdlIG9ubHkgd2FudCB0byBtYWtlIHNvdXJjZSBzZWxlY3Rpb25zIGlmIHRoZSBhY3RpdmUgcGFnZSBpcyBlaXRoZXIgdGhlIG91dGxpbmUgb3IgcHJvcGVydGllcyAoYSBtb2RpZnkKLQkJLy8gaGFzIGJlZW4gZG9uZSB2aWEgdGhlIG91dGxpbmUgb3IgcHJvcGVydGllcyBhbmQgbm90IHRoZSBzb3VyY2UgdmlldykuICBXZSBkb24ndCB3YW50IHRvIGJlIHNlbGVjdGluZwotCQkvLyBhbmQgdW5zZWxlY3RpbmcgdGhpbmdzIGluIHRoZSBzb3VyY2Ugd2hlbiBlZGl0aW5nIGluIHRoZSBzb3VyY2UhIQotICAgIAlib29sZWFuIG1ha2VTZWxlY3Rpb24gPSB0cnVlOwotCQlpZiAoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UuZ2V0QWN0aXZlUGFydCgpIGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpIHsKLQkJCQlpZiAoZ2V0QWN0aXZlRWRpdG9yKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dEVkaXRvcikgewotCQkJCQltYWtlU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgCQotICAgICAgLy8gZG8gbm90IGZpcmUgc2VsZWN0aW9uIGluIHNvdXJjZSBlZGl0b3IgaWYgc2VsZWN0aW9uIGV2ZW50IGNhbWUKLSAgICAgIC8vIGZyb20gc291cmNlIGVkaXRvcgotICAgICAgaWYgKGV2ZW50LmdldFNvdXJjZSgpICE9IGdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpICYmIG1ha2VTZWxlY3Rpb24pCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgewotICAgICAgICAgIExpc3Qgb3RoZXJNb2RlbE9iamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1vZGVsT2JqZWN0ID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICBPYmplY3Qgb3RoZXJNb2RlbE9iamVjdCA9IGdldE9iamVjdEZvck90aGVyTW9kZWwobW9kZWxPYmplY3QpOwotICAgICAgICAgICAgaWYgKG90aGVyTW9kZWxPYmplY3QgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb3RoZXJNb2RlbE9iamVjdExpc3QuYWRkKG90aGVyTW9kZWxPYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoIW90aGVyTW9kZWxPYmplY3RMaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBoZXJlJ3MgYW4gdWdseSBoYWNrLi4uIGlmIHdlIGFsbG93IHRleHQgc2VsZWN0aW9ucyB0byBmaXJlIGR1cmluZwotICAgICAgICAgICAgLy8gU2V0SW5wdXRUb0dyYXBoVmlldyBhY3Rpb24gd2Ugc2NyZXcgdXAgdGhlIG5hdmlnYXRpb24gaGlzdG9yeSEKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgCi0gICAgICAgICAgICAvL1RPRE8gKGNzKSAuLi4gd2UgbmVlZCB0byBwcmV2ZW50IHRoZSBzb3VyY2UgZWRpdG9yIGZyb20gbWVzc2luZyB1cCB0aGUgbmF2aWdhdGlvbiBoaXN0b3J5Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaWYgKGdldEFjdGl2ZVBhZ2UoKSA9PSBTT1VSQ0VfUEFHRV9JTkRFWCkKLSAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5vZGVTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvdGhlck1vZGVsT2JqZWN0TGlzdCk7Ci0gICAgICAgICAgICAgIGdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihub2RlU2VsZWN0aW9uKTsKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkb1NldFNlbGVjdGlvbigpCi0gICAgewotICAgICAgSVNlbGVjdGlvbiBpU2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uTWFuYWdlcigpLmdldFNlbGVjdGlvbigpOwotICAgICAgaWYgKGlTZWxlY3Rpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGZpcnN0RWxlbWVudCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbilpU2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgT2JqZWN0IG90aGVyTW9kZWxPYmplY3QgPSBnZXRPYmplY3RGb3JPdGhlck1vZGVsKGZpcnN0RWxlbWVudCk7Ci0gICAgICAgIGlmIChvdGhlck1vZGVsT2JqZWN0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5vZGVTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvdGhlck1vZGVsT2JqZWN0KTsKLSAgICAgICAgICBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5zZXRTZWxlY3Rpb24obm9kZVNlbGVjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8vIEJ1ZyAxNDU1OTAuICBXb3JrYXJvdW5kIHRvIHVwZGF0ZSBzb3VyY2UgcG9zaXRpb24gd2hlbiBmbGlwcGluZyB0byB0aGUgc291cmNlIHBhZ2UuCi0gIC8vIFVuZm9ydHVuYXRlbHksIHRoaXMgd2lsbCBzdGlsbCBhZGQgYW4gZW50cnkgdG8gdGhlIG5hdmlnYXRpb24gaGlzdG9yeSwgYnV0IHRoaXMKLSAgLy8gYmVoYXZpb3VyIGlzIGFuIGltcHJvdmVtZW50IHRoYW4gd2l0aG91dCB0aGlzIGNoYW5nZQotICBib29sZWFuIGRvVXBkYXRlU291cmNlTG9jYXRpb24gPSBmYWxzZTsKLSAgcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgbmV3UGFnZUluZGV4KQotICB7Ci0gICAgc3VwZXIucGFnZUNoYW5nZShuZXdQYWdlSW5kZXgpOwotICAgIGRvVXBkYXRlU291cmNlTG9jYXRpb24gPSBuZXdQYWdlSW5kZXggPT0gU09VUkNFX1BBR0VfSU5ERVg7Ci0gICAgaWYgKGRvVXBkYXRlU291cmNlTG9jYXRpb24gJiYgZlhTRFNlbGVjdGlvbkxpc3RlbmVyICE9IG51bGwpCi0gICAgICBmWFNEU2VsZWN0aW9uTGlzdGVuZXIuZG9TZXRTZWxlY3Rpb24oKTsKLQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IHNvdXJjZSwgaW50IHByb3BJZCkKLSAgewotICAgIHN3aXRjaCAocHJvcElkKQotICAgIHsKLSAgICAgIC8vIHdoZW4gcmVmYWN0b3IgcmVuYW1lIHdoaWxlIGZpbGUgaXMgb3BlbiBpbiBlZGl0b3IsIG5lZWQgdG8gcmVzZXQKLSAgICAgIC8vIGVkaXRvciBjb250ZW50cyB0byByZWZsZWN0IG5ldyBkb2N1bWVudAotICAgICAgY2FzZSBJRWRpdG9yUGFydC5QUk9QX0lOUFVUOgotICAgICAgewotICAgICAgICBpZiAoc291cmNlID09IHN0cnVjdHVyZWRUZXh0RWRpdG9yICYmIHhzZFNjaGVtYSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIERvY3VtZW50IHNjaGVtYURvY3VtZW50ID0geHNkU2NoZW1hLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICAgIERvY3VtZW50IGRvbU1vZGVsRG9jdW1lbnQgPSAoKElET01Nb2RlbClzdHJ1Y3R1cmVkTW9kZWwpLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICAgIC8vIGlmIGRvbSBkb2N1bWVudHMgYXJlIG5vdCB0aGUgc2FtZSwgdGhleSBuZWVkIHRvIGJlIHJlc2V0Ci0gICAgICAgICAgICAgIGlmIChzY2hlbWFEb2N1bWVudCAhPSBkb21Nb2RlbERvY3VtZW50KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWFNETW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHNjaGVtYURvY3VtZW50IGluc3RhbmNlb2YgSURPTURvY3VtZW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8vIHNhdmUgdGhpcyBtb2RlbCBhZGFwdGVyIGZvciBjbGVhbnVwIGxhdGVyCi0gICAgICAgICAgICAgICAgICBtb2RlbEFkYXB0ZXIgPSAoWFNETW9kZWxBZGFwdGVyKSAoKElET01Eb2N1bWVudClzY2hlbWFEb2N1bWVudCkuZ2V0RXhpc3RpbmdBZGFwdGVyKFhTRE1vZGVsQWRhcHRlci5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBtdWx0aXBhZ2UgZWRpdG9yIHdpdGggbmV3IGVkaXRvciBpbnB1dAotICAgICAgICAgICAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgICAgICAgc2V0SW5wdXQoZWRpdG9ySW5wdXQpOwotICAgICAgICAgICAgICAgIHNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkubWFya1NhdmVMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdyBkbyB0aGUgY2xlYW4gdXAgbW9kZWwgYWRhcHRlcgotICAgICAgICAgICAgICAgIGlmIChtb2RlbEFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBtb2RlbEFkYXB0ZXIuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgIG1vZGVsQWRhcHRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0gICAgICAgICAgICAgIHN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLnByb3BlcnR5Q2hhbmdlZChzb3VyY2UsIHByb3BJZCk7Ci0gIH0KLQotICBwdWJsaWMgSU5hdmlnYXRpb25Mb2NhdGlvbiBjcmVhdGVFbXB0eU5hdmlnYXRpb25Mb2NhdGlvbigpCi0gIHsKLSAgICBpZiAoZ2V0QWN0aXZlUGFnZSgpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBEZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uKHRoaXMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBNdWx0aVBhZ2VFZGl0b3JUZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uKGdldFRleHRFZGl0b3IoKSwgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBJTmF2aWdhdGlvbkxvY2F0aW9uIGNyZWF0ZU5hdmlnYXRpb25Mb2NhdGlvbigpCi0gIHsKLSAgICBpZiAoZ2V0QWN0aXZlUGFnZSgpID09IERFU0lHTl9QQUdFX0lOREVYKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBSb290RWRpdFBhcnQgcm9vdEVkaXRQYXJ0ID0gZ3JhcGhpY2FsVmlld2VyLmdldFJvb3RFZGl0UGFydCgpOwotICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IHJvb3RFZGl0UGFydC5nZXRDb250ZW50cygpOwotICAgICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBSb290Q29udGVudEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgUm9vdENvbnRlbnRFZGl0UGFydCByb290Q29udGVudEVkaXRQYXJ0ID0gKFJvb3RDb250ZW50RWRpdFBhcnQpZWRpdFBhcnQ7Ci0gICAgICAgICAgT2JqZWN0IGlucHV0ID0gcm9vdENvbnRlbnRFZGl0UGFydC5nZXRJbnB1dCgpOyAgICAgIAotICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEFkYXB0ZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpKChBZGFwdGVyKWlucHV0KS5nZXRUYXJnZXQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpLmdldEFkYXB0ZXIoUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyID0gKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpb2JqZWN0OwotICAgICAgICAgICAgICBpZiAocHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuZ2V0TmF2aWdhdGlvbkxvY2F0aW9uKHRoaXMsIGNvbmNyZXRlQ29tcG9uZW50LCByb290Q29udGVudEVkaXRQYXJ0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uKHRoaXMsIGNvbmNyZXRlQ29tcG9uZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBNdWx0aVBhZ2VFZGl0b3JUZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uKGdldFRleHRFZGl0b3IoKSwgdHJ1ZSk7Ci0gICAgfQotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgZWRpdG9yTW9kZUNoYW5nZWQoRWRpdG9yTW9kZSBuZXdFZGl0b3JNb2RlKQotICB7Ci0gICAgLy9pZiAoaXNJbml0aWFsaXppbmcpCi0gICAgLy8gIHJldHVybjsKLSAgICAKLSAgICBFZGl0UGFydEZhY3RvcnkgZWRpdFBhcnRGYWN0b3J5ID0gbmV3RWRpdG9yTW9kZS5nZXRFZGl0UGFydEZhY3RvcnkoKTsKLSAgICBpZiAoZWRpdFBhcnRGYWN0b3J5ICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBncmFwaGljYWxWaWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGVkaXRQYXJ0RmFjdG9yeSk7Ci0gICAgICBpZiAoZ3JhcGhpY2FsVmlld2VyIGluc3RhbmNlb2YgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcikKLSAgICAgIHsgIAotICAgICAgICBEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyKWdyYXBoaWNhbFZpZXdlcjsgIAotICAgICAgICBJQURUT2JqZWN0IGlucHV0ID0gdmlld2VyLmdldElucHV0KCk7Ci0gICAgICAgIHZpZXdlci5zZXRJbnB1dChudWxsKTsKLSAgICAgICAgLy92aWV3ZXIuZ2V0Um9vdEVkaXRQYXJ0KCkucmVmcmVzaCgpOwotICAgICAgIC8vIHZpZXdlci5nZXRSb290RWRpdFBhcnQoKS5nZXRDb250ZW50cygpLnJlZnJlc2goKTsKLSAgICAgICAgdmlld2VyLnNldElucHV0KGlucHV0KTsKLSAgICAgICAgCi0gICAgICAgIGZsb2F0aW5nVG9vbGJhci5zZXRFZGl0UGFydEZhY3RvcnkoZWRpdFBhcnRGYWN0b3J5KTsKLSAgICAgICAgZmxvYXRpbmdUb29sYmFyLnNldE1vZGVsKGdldE1vZGVsKCkpOwotICAgICAgICBmbG9hdGluZ1Rvb2xiYXIucmVmcmVzaCghKGlucHV0IGluc3RhbmNlb2YgSU1vZGVsKSk7Ci0gICAgICAgIAotICAgICAgICBDb250cm9sIGNvbnRyb2wgPSBncmFwaGljYWxWaWV3ZXIuZ2V0Q29udHJvbCgpOwotICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkKLSAgICAgICAgewotICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQgPSAoKENvbXBvc2l0ZSljb250cm9sKS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICBwYXJlbnQubGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLSAgICBJQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3RWRpdG9yTW9kZS5nZXRPdXRsaW5lUHJvdmlkZXIoKTsKLSAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBBRFRDb250ZW50T3V0bGluZVBhZ2Ugb3V0bGluZSA9IChBRFRDb250ZW50T3V0bGluZVBhZ2UpZ2V0Q29udGVudE91dGxpbmVQYWdlKCk7Ci0gICAgICBpZiAob3V0bGluZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSBvdXRsaW5lLmdldFRyZWVWaWV3ZXIoKTsKLSAgICAgICAgaWYgKHRyZWVWaWV3ZXIgIT0gbnVsbCkKLSAgICAgICAgeyAgICAgIAotICAgICAgICAgIG91dGxpbmUuZ2V0VHJlZVZpZXdlcigpLnNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgb3V0bGluZS5nZXRUcmVlVmlld2VyKCkucmVmcmVzaCgpOwotICAgICAgICB9Ci0gICAgICB9ICAKLSAgICB9ICAKLSAgfSAgCi0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FRElUT1JfTU9ERV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmRlZmF1bHRFZGl0b3JNb2RlSWQiOyAvLyROT04tTkxTLTEkCi0gIC8vcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6aW5nID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBFZGl0b3JNb2RlTWFuYWdlciBjcmVhdGVFZGl0b3JNb2RlTWFuYWdlcigpCi0gIHsKLSAgICBmaW5hbCBQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgPSAoUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcilnZXRBZGFwdGVyKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuY2xhc3MpOwotICAgIEVkaXRvck1vZGVNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgRWRpdG9yTW9kZU1hbmFnZXIoWFNEX0VESVRPUl9NT0RFX0VYVEVOU0lPTl9JRCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBpbml0KCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgPT0gbnVsbCB8fCAKLSAgICAgICAgICAgIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuaXNFZGl0b3JNb2RlQXBwbGljYWJsZShUeXBlVml6RWRpdG9yTW9kZS5JRCkpCi0gICAgICAgIHsgIAotICAgICAgICAgIGFkZE1vZGUobmV3IFR5cGVWaXpFZGl0b3JNb2RlKCkpOwotICAgICAgICB9ICAKLSAgICAgICAgc3VwZXIuaW5pdCgpOyAgICAgICAgICAgICAgICAKLSAgICAgIH0gICAgICAgCi0gICAgICAKLSAgICAgIHByb3RlY3RlZCBFZGl0b3JNb2RlIGdldERlZmF1bHRNb2RlKCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGRlZmF1bHRNb2RlSWQgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKERFRkFVTFRfRURJVE9SX01PREVfSUQpOwotICAgICAgICBpZiAoZGVmYXVsdE1vZGVJZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgRWRpdG9yTW9kZSBlZGl0b3JNb2RlID0gZ2V0RWRpdG9yTW9kZShkZWZhdWx0TW9kZUlkKTsKLSAgICAgICAgICBpZiAoZWRpdG9yTW9kZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlZGl0b3JNb2RlOwotICAgICAgICAgIH0gIAotICAgICAgICB9ICAgICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiBzdXBlci5nZXREZWZhdWx0TW9kZSgpOwotICAgICAgfQotICAgIH07Ci0gICAgbWFuYWdlci5zZXRQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpOwotICAgIHJldHVybiBtYW5hZ2VyOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzdG9yZUN1cnJlbnRNb2RlUHJlZmVyZW5jZShTdHJpbmcgaWQpCi0gIHsKLSAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoREVGQVVMVF9FRElUT1JfTU9ERV9JRCwgaWQpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gIHsKLSAgICBYU0REaXJlY3RpdmVzTWFuYWdlci5yZW1vdmVVbnVzZWRYU0RJbXBvcnRzKCgoWFNEU2NoZW1hKWdldEFkYXB0ZXIoWFNEU2NoZW1hLmNsYXNzKSkpOwotICAgIHN1cGVyLmRvU2F2ZShtb25pdG9yKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjZG9TYXZlQXMoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZG9TYXZlQXMoKQotICB7Ci0gICAgLy8gV2hlbiBwZXJmb3JtaW5nIGEgc2F2ZSBhcywgdGhlIGRvY3VtZW50IGNoYW5nZXMuICAgT3VyIG1vZGVsIHN0YXRlIGxpc3RlbmVycyBzaG91bGQgbGlzdGVuCi0gICAgLy8gdG8gdGhlIG5ldyBkb2N1bWVudC4KLSAgICAKLSAgICAvLyBGaXJzdCBnZXQgdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAgICBJRG9jdW1lbnQgY3VycmVudERvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLSAgICBYU0RNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyID0gbnVsbDsKLSAgICBJRE9NRG9jdW1lbnQgZG9jID0gbnVsbDsKLSAgICBpZiAoY3VycmVudERvY3VtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGN1cnJlbnREb2N1bWVudCk7Ci0gICAgICBpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgJiYgKHN0cnVjdHVyZWRNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gR2V0IHRoZSBhc3NvY2lhdGVkIElET01Eb2N1bWVudCBtb2RlbAotICAgICAgICAgICAgZG9jID0gKChJRE9NTW9kZWwpIHN0cnVjdHVyZWRNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIC8vIGFuZCBub3cgZ2V0IG91ciBhZGFwdGVyIHRoYXQgbGlzdGVucyB0byBET00gY2hhbmdlcwotICAgICAgICAgICAgaWYgKGRvYyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtb2RlbEFkYXB0ZXIgPSAoWFNETW9kZWxBZGFwdGVyKSBkb2MuZ2V0RXhpc3RpbmdBZGFwdGVyKFhTRE1vZGVsQWRhcHRlci5jbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIHN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotICAgIC8vIHBlcmZvcm0gc2F2ZSBhcwotICAgIHN0cnVjdHVyZWRUZXh0RWRpdG9yLmRvU2F2ZUFzKCk7Ci0gICAgLy8gaWYgc2F2ZUFzIGNhbmNlbGxlZCB0aGVuIGRvbid0IHNldElucHV0IGJlY2F1c2UgdGhlIGlucHV0IGhhc24ndCBjaGFuZ2UKLSAgICAvLyBTZWUgQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yJ3MgcGVyZm9ybVNhdmVBcwotICAgIGlmIChlZGl0b3JJbnB1dCAhPSBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKQotICAgIHsKLSAgICAgIHNldElucHV0KHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotICAgICAgc2V0UGFydE5hbWUoc3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKS5nZXROYW1lKCkpOwotICAgIAotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkubWFya1NhdmVMb2NhdGlvbigpOwotICAgCi0gICAgICAvLyBOb3cgZG8gdGhlIGNsZWFuIHVwIG9uIHRoZSBvbGQgZG9jdW1lbnQKLSAgICAgIGlmIChtb2RlbEFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gY2xlYXIgb3V0IG1vZGVsIGFkYXB0ZXIKLSAgICAgICAgbW9kZWxBZGFwdGVyLmNsZWFyKCk7Ci0gICAgICAgIG1vZGVsQWRhcHRlciA9IG51bGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBkb1Bvc3RFZGl0b3JPcGVuVGFza3MoKSAKLSAgewotCQkvLyBCdWcgMjA0ODY4OiBkbyB0aGUgc2VsZWN0aW9uIGFmdGVyIHRoZSBlZGl0b3IgcGFydCBpcyBjcmVhdGVkLCBzbyB0aGF0IAotCQkvLyBBYnN0cmFjdFRleHRFZGl0b3IubWFya0luTmF2aWdhdGlvbkhpc3RvcnkoKSB3b24ndCBjYXVzZSB0aGUgY3JlYXRpb24gCi0gICAgICAgIC8vIG9mIGl0cyBvd24gZWRpdG9yIHBhcnQuCi0JCS8vIFNlbGVjdCB0aGUgc2NoZW1hIHRvIHNob3cgdGhlIHByb3BlcnRpZXMKLQkJZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihnZXRNb2RlbCgpKSk7Ci0gIH0KLX0gIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9LZXlib2FyZERyYWdJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvS2V5Ym9hcmREcmFnSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGZjOGUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9LZXlib2FyZERyYWdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uSUtleWJvYXJkRHJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLktleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5CYXNlRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuWFNEQXR0cmlidXRlRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuWFNERWxlbWVudERyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuWFNEQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotCi1wdWJsaWMgY2xhc3MgS2V5Ym9hcmREcmFnSW1wbCBpbXBsZW1lbnRzIElLZXlib2FyZERyYWcKLXsKLSAgcHVibGljIHZvaWQgcGVyZm9ybUtleWJvYXJkRHJhZyhHcmFwaGljYWxFZGl0UGFydCBtb3ZpbmdFbGVtZW50LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeSBwb2xpY3kgPSAoS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeSkgbW92aW5nRWxlbWVudC5nZXRFZGl0UG9saWN5KEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuS0VZKTsKLQotICAgIEVkaXRQYXJ0IHJpZ2h0RWxlbWVudCA9IHBvbGljeS5nZXRSZWxhdGl2ZUVkaXRQYXJ0KG1vdmluZ0VsZW1lbnQsIGRpcmVjdGlvbik7Ci0gICAgcG9saWN5ID0gKEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kpIHJpZ2h0RWxlbWVudC5nZXRFZGl0UG9saWN5KEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuS0VZKTsKLSAgICBFZGl0UGFydCBsZWZ0RWxlbWVudCA9IChwb2xpY3kgIT0gbnVsbCkgPyBwb2xpY3kuZ2V0UmVsYXRpdmVFZGl0UGFydChyaWdodEVsZW1lbnQsIGRpcmVjdGlvbikgOiBudWxsOwotCi0gICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIGV4dGVuZGVycwotICAgIGlmICghKG1vdmluZ0VsZW1lbnQgaW5zdGFuY2VvZiBYU0RCYXNlRmllbGRFZGl0UGFydCkpIHJldHVybjsKLSAgICAKLSAgICBYU0RCYXNlRmllbGRFZGl0UGFydCBtb3ZpbmdGaWVsZCA9IChYU0RCYXNlRmllbGRFZGl0UGFydCkgbW92aW5nRWxlbWVudDsKLSAgICBYU0RCYXNlRmllbGRFZGl0UGFydCBsZWZ0RmllbGQgPSAoWFNEQmFzZUZpZWxkRWRpdFBhcnQpIGxlZnRFbGVtZW50OwotICAgIFhTREJhc2VGaWVsZEVkaXRQYXJ0IHJpZ2h0RmllbGQgPSAoWFNEQmFzZUZpZWxkRWRpdFBhcnQpIHJpZ2h0RWxlbWVudDsKLSAgICAKLSAgICBPYmplY3QgbW92aW5nT2JqZWN0ID0gbW92aW5nRmllbGQuZ2V0TW9kZWwoKTsKLSAgICAKLSAgICBCYXNlRHJhZ0FuZERyb3BDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgIGlmIChtb3ZpbmdPYmplY3QgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIHx8IG1vdmluZ09iamVjdCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgWFNERWxlbWVudERyYWdBbmREcm9wQ29tbWFuZChtb3ZpbmdGaWVsZCwgbGVmdEZpZWxkLCByaWdodEZpZWxkLCBkaXJlY3Rpb24pOwotICAgIH0KLSAgICBlbHNlIGlmIChtb3ZpbmdPYmplY3QgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXIpCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBYU0RBdHRyaWJ1dGVEcmFnQW5kRHJvcENvbW1hbmQobW92aW5nRmllbGQsIGxlZnRGaWVsZCwgcmlnaHRGaWVsZCwgZGlyZWN0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNvbW1hbmQgIT0gbnVsbCAmJiBjb21tYW5kLmNhbkV4ZWN1dGUoKSkKLSAgICB7Ci0gICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgIC8vIFRoaXMgaXMgdG8gcmVzZWxlY3QgdGhlIG1vdmVkIGl0ZW0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgaWYgKGVkaXRvciAhPSBudWxsICYmIGVkaXRvci5nZXRBZGFwdGVyKElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcykgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IChJU2VsZWN0aW9uUHJvdmlkZXIpIGVkaXRvci5nZXRBZGFwdGVyKElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcyk7Ci0gICAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vdmluZ0VsZW1lbnQuZ2V0TW9kZWwoKSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotCi0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMjc0NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxM2Y3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyLCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwsIGJ1ZyAxMTQ3MDMzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMKLXsKLSAgc3RhdGljIAotICB7Ci0gICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcygib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IubWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBNZXNzYWdlcygpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9CQVNFX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RFUklWRURfQlk7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0lOSEVSSVRfRlJPTTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfSU5IRVJJVF9CWTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRE9DVU1FTlRBVElPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQVBQX0lORk87Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NFVF9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9OQU1FOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9LSU5EOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9NSU5PQ0NVUlM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX01BWE9DQ1VSUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTk9fVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfUEFHRV9IRUFESU5HX1JFRkVSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfUkVBRF9PTkxZOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9DT01QT05FTlRTOwotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9UWVBFUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dSQVBIX1JFREVGSU5FX1RZUEVTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfR1JBUEhfRUxFTUVOVFM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9BVFRSSUJVVEVTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfR1JBUEhfQVRUUklCVVRFX0dST1VQUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dSQVBIX1JFREVGSU5FX0FUVFJJQlVURV9HUk9VUFM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9OT1RBVElPTlM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9JREVOVElUWV9DT05TVFJBSU5UUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dSQVBIX0FOTk9UQVRJT05TOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfR1JBUEhfRElSRUNUSVZFUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dSQVBIX0dST1VQUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dSQVBIX1JFREVGSU5FX0dST1VQUzsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OT19MT0NBVElPTl9TUEVDSUZJRUQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9OT19UWVBFX0RFRklORUQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fVVBEQVRFX05BTUU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BQlNFTlQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0ZJRUxEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1NFVF9NVUxUSVBMSUNJVFk7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9PUFRJT05BTDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1pFUk9fT1JfTU9SRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX09ORV9PUl9NT1JFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUkVRVUlSRUQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BUlJBWTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9TRVRfVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0xPQ0FMX1RZUEU7Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfR1JBUEhfVU5LTk9XTl9PQkpFQ1Q7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9YU0RTQ0hFTUE7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9YU0RTQ0hFTUFfTk9fTkFNRVNQQUNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0VUX0NPTU1PTl9CVUlMVF9JTl9UWVBFUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NFTEVDVF9UWVBFU19GSUxURVJfT1VUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkVXX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9WQUxVRV9ORVdfVFlQRTsgIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ09NUExFWF9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0lNUExFX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ORVdfRUxFTUVOVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05FV19BVFRSSUJVVEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1hTRF9FRElUT1I7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TT1VSQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQkVGT1JFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FGVEVSOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9FTEVNRU5UOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0lOU0VSVF9FTEVNRU5UOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9FTEVNRU5UX1JFRjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ORVc7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQlJPV1NFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1VQREFURV9FTEVNRU5UX1JFRkVSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9VUERBVEVfQVRUUklCVVRFX1JFRkVSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1RBUkdFVF9OQU1FU1BBQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OT19OQU1FU1BBQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0NPTVBMRVhfVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OQU1FX1NFQVJDSF9GSUxURVJfVEVYVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VMRU1FTlRTX0NPTE9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUklCVVRFU19DT0xPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FUVFJJQlVURVNfUFJPQ0VTU0NPTlRFTlRTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUklCVVRFU19OQU1FU1BBQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TRVRfRUxFTUVOVF9SRUZFUkVOQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TRVRfQVRUUklCVVRFX1JFRkVSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1JFREVGSU5FX0NPTVBPTkVOVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1RZUEVTX0NPTE9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0VUX1RZUEU7Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RFWFRfSU5ERU5UX0xBQkVMOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVEVYVF9JTkRFTlRfU1BBQ0VTX0xBQkVMOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RFWFRfWFNEX05BTUVTUEFDRV9QUkVGSVg7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9URVhUX1hTRF9ERUZBVUxUX1BSRUZJWDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1FVQUxJRllfWFNEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVEVYVF9YU0RfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVkFMSURBVElOR19GSUxFUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZVTExfQ09ORk9STUFOQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9URVhUX0hPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUzsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9MQUJFTF9JTlZBTElEX1BSRUZJWDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfSU5DTFVERTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfSU1QT1JUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9SRURFRklORTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQVRUUklCVVRFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0lOU0VSVF9BVFRSSUJVVEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9SRUY7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fRFJBR19EUk9QX0VMRU1FTlQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fRFJBR19EUk9QX0FUVFJJQlVURTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9SRURFRklORV9DT01QTEVYX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fUkVERUZJTkVfU0lNUExFX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fUkVERUZJTkVfQVRUUklCVVRFX0dST1VQOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1JFREVGSU5FX01PREVMX0dST1VQOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1JFTkFNRTsgIAotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lNQUdFX0NPTVBMRVhfVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lNQUdFX1NJTVBMRV9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSU1BR0VfTU9ERUxfR1JPVVA7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JTUFHRV9BVFRSSUJVVEVfR1JPVVA7Ci0KLSAgLy8gVE9ETzogVE8gUkVNT1ZFCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTEVNRU5URk9STURFRkFVTFQ7Ci0gIC8vIFRPRE86IFRPIFJFTU9WRQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUklCVVRFRk9STURFRkFVTFQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DUkVBVEVfQU5PTl9UWVBFOyAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YTUxfVEVYVF9FRElUT1JfUFJFRlNfTElOSzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hNTF9WQUxJREFUT1JfUFJFRlNfTElOSzsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9URVhUX0VOQUJMRV9BVVRPX0lNUE9SVF9DTEVBTlVQOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVEVYVF9FTkFCTEVfQVVUT19PUEVOX1NDSEVNQV9ESUFMT0c7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9SRURFRklORV9TQ0hFTUE7Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NPTUJPX05FVzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NPTUJPX0JST1dTRTsKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfSU5WQUxJRF9OQU1FOyAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NWVkMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1NvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25Db250cmlidXRvclhNTDsKLQotCi0vKioKLSAqIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvcgotICogCi0gKiBUaGlzIGNsYXNzIGlzIGZvciBtdWx0aSBwYWdlIGVkaXRvcidzIHNvdXJjZSBwYWdlIGNvbnRyaWJ1dG9yLgotICoKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yIGV4dGVuZHMgQWN0aW9uQ29udHJpYnV0b3JYTUwgewotCi0JcHJpdmF0ZSBJQWN0aW9uQmFycyBmQmFyczsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbGxzOgotCSAqIDx1bD4KLQkgKiAgPGxpPjxjb2RlPmNvbnRyaWJ1dGVUb01lbnU8L2NvZGU+IHdpdGggPGNvZGU+YmFyczwvY29kZT4nIG1lbnUgbWFuYWdlcjwvbGk+Ci0JICogIDxsaT48Y29kZT5jb250cmlidXRlVG9Ub29sQmFyPC9jb2RlPiB3aXRoIDxjb2RlPmJhcnM8L2NvZGU+JyB0b29sIGJhcgotCSAqICAgIG1hbmFnZXI8L2xpPgotCSAqICA8bGk+PGNvZGU+Y29udHJpYnV0ZVRvU3RhdHVzTGluZTwvY29kZT4gd2l0aCA8Y29kZT5iYXJzPC9jb2RlPicgc3RhdHVzIGxpbmUKLQkgKiAgICBtYW5hZ2VyPC9saT4KLQkgKiA8L3VsPgotCSAqIFRoZSBnaXZlbiBhY3Rpb24gYmFycyBhcmUgYWxzbyByZW1lbWJlcmVkIGFuZCBtYWRlIGFjY2Vzc2libGUgdmlhIAotCSAqIDxjb2RlPmdldEFjdGlvbkJhcnM8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBiYXJzIHRoZSBhY3Rpb24gYmFycwotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycykgewotCQlmQmFycyA9IGJhcnM7Ci0JCWNvbnRyaWJ1dGVUb01lbnUoYmFycy5nZXRNZW51TWFuYWdlcigpKTsKLQkJY29udHJpYnV0ZVRvVG9vbEJhcihiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCQljb250cmlidXRlVG9TdGF0dXNMaW5lKGJhcnMuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIGNvbnRyaWJ1dG9yJ3MgYWN0aW9uIGJhcnMuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBhY3Rpb24gYmFycwotCSAqLwotCXB1YmxpYyBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgewotCQlyZXR1cm4gZkJhcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmFjNjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YU0QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTDsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBlZGl0aW5nIFhTRCBjb250ZW50IHR5cGUKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTRCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTCB7Ci0JcHJvdGVjdGVkIE1hcCBnZXRIeXBlcmxpbmtEZXRlY3RvclRhcmdldHMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJTWFwIHRhcmdldHMgPSBzdXBlci5nZXRIeXBlcmxpbmtEZXRlY3RvclRhcmdldHMoc291cmNlVmlld2VyKTsKLQkJdGFyZ2V0cy5wdXQoIm9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiLCBudWxsKTsgIC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHRhcmdldHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEQXR0cmlidXRlUmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0Y2FiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEQXR0cmlidXRlUmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRERpcmVjdGl2ZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy5OZXdBdHRyaWJ1dGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoLlhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyIGV4dGVuZHMgWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGltcGxlbWVudHMgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIKLXsKLSAgcHVibGljIFhTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgc3VwZXIoY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnREaWFsb2cgZ2V0QnJvd3NlRGlhbG9nKCkKLSAgewotICAgIFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZSBkaWFsb2dEZWxlZ2F0ZSA9IAotICAgICAgbmV3IFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZShYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUuQVRUUklCVVRFX01FVEFfTkFNRSwgY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICAgIHJldHVybiBkaWFsb2dEZWxlZ2F0ZTsKLSAgfQotCi0gIHB1YmxpYyBJQ29tcG9uZW50RGlhbG9nIGdldE5ld0RpYWxvZygpCi0gIHsKLSAgICBpZiAoc2NoZW1hcy5sZW5ndGggPiAwKSB7Ci0gICAgICByZXR1cm4gbmV3IE5ld0F0dHJpYnV0ZURpYWxvZyhzY2hlbWFzWzBdKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICByZXR1cm4gbmV3IE5ld0F0dHJpYnV0ZURpYWxvZygpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShPYmplY3QgcmVmZXJlbmNpbmdPYmplY3QsIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmVmZXJlbmNlZENvbXBvbmVudCkKLSAgewotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGNvbmNyZXRlQ29tcG9uZW50ID0gbnVsbDsKLSAgICBpZiAocmVmZXJlbmNpbmdPYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgIHsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKXJlZmVyZW5jaW5nT2JqZWN0OwotICAgICAgaWYgKGFkYXB0ZXIuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgY29uY3JldGVDb21wb25lbnQgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pYWRhcHRlci5nZXRUYXJnZXQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAocmVmZXJlbmNpbmdPYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBjb25jcmV0ZUNvbXBvbmVudCA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgcmVmZXJlbmNpbmdPYmplY3Q7Ci0gICAgfQotICAgIGlmIChjb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgICAgaWYgKHJlZmVyZW5jZWRDb21wb25lbnQuaXNOZXcoKSkKLSAgICAgICAgeyAgCi0gICAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlRGVjID0gbnVsbDsKLSAgICAgICAgICBpZiAocmVmZXJlbmNlZENvbXBvbmVudC5nZXRNZXRhTmFtZSgpID09IElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX01FVEFfTkFNRSkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUsIGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICAgIGNvbW1hbmQuc2V0TmFtZVRvQWRkKHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgICAgYXR0cmlidXRlRGVjID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChhdHRyaWJ1dGVEZWMgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9BVFRSSUJVVEVfUkVGRVJFTkNFLCBjb25jcmV0ZUNvbXBvbmVudCwgYXR0cmlidXRlRGVjKTsKLSAgICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBYU0REaXJlY3RpdmVzTWFuYWdlci5yZW1vdmVVbnVzZWRYU0RJbXBvcnRzKGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgICAgfSAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQoY29uY3JldGVDb21wb25lbnQsIHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0TmFtZSgpLCByZWZlcmVuY2VkQ29tcG9uZW50LmdldFF1YWxpZmllcigpLCByZWZlcmVuY2VkQ29tcG9uZW50LmdldEZpbGUoKSk7Ci0gICAgICAgICAgY29tbWFuZC5zZXRMYWJlbChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9BVFRSSUJVVEVfUkVGRVJFTkNFKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyYWE3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEQ29tcGxleFR5cGVCYXNlVHlwZUVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlNldEJhc2VUeXBlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlNldEJhc2VUeXBlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoLlhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFhTRENvbXBsZXhUeXBlQmFzZVR5cGVFZGl0TWFuYWdlciBleHRlbmRzIFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlcgotewotICBwdWJsaWMgWFNEQ29tcGxleFR5cGVCYXNlVHlwZUVkaXRNYW5hZ2VyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgc3VwZXIoY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICB9Ci0KLSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBnZXRRdWlja1BpY2tzKCkKLSAgewotICAgIHJldHVybiBzdXBlci5nZXRRdWlja1BpY2tzKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJQ29tcG9uZW50RGlhbG9nIGdldEJyb3dzZURpYWxvZygpCi0gIHsKLSAgICBYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUgZGlhbG9nRGVsZWdhdGUgPSBuZXcgWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlKFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZS5UWVBFX01FVEFfTkFNRSwgY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICAgIHJldHVybiBkaWFsb2dEZWxlZ2F0ZTsKLSAgfQotCi0gIC8vIFRPRE8gY29tbW9uIHRoaXMgdXAKLSAgcHVibGljIHZvaWQgbW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKE9iamVjdCByZWZlcmVuY2luZ09iamVjdCwgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnQpCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IG51bGw7Ci0gICAgaWYgKHJlZmVyZW5jaW5nT2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICB7Ci0gICAgICBBZGFwdGVyIGFkcGF0ZXIgPSAoQWRhcHRlcilyZWZlcmVuY2luZ09iamVjdDsKLSAgICAgIGlmIChhZHBhdGVyLmdldFRhcmdldCgpIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KWFkcGF0ZXIuZ2V0VGFyZ2V0KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHJlZmVyZW5jaW5nT2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgY29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpIHJlZmVyZW5jaW5nT2JqZWN0OwotICAgIH0KLSAgICAKLSAgICBpZiAoY29uY3JldGVDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudC5pc05ldygpKQotICAgICAgeyAgCi0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gbnVsbDsKLSAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRNZXRhTmFtZSgpID09IElYU0RTZWFyY2hDb25zdGFudHMuQ09NUExFWF9UWVBFX01FVEFfTkFNRSkKLSAgICAgICAgeyAgCi0gICAgICAgICAgQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQ09NUExFWF9UWVBFLCBjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgY29tbWFuZC5zZXROYW1lVG9BZGQoY29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgICAgdGQgPSBjb21tYW5kLmdldENyZWF0ZWRDb21wbGV4VHlwZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9TSU1QTEVfVFlQRSwgY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgIGNvbW1hbmQuc2V0TmFtZVRvQWRkKGNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgIHRkID0gY29tbWFuZC5nZXRDcmVhdGVkU2ltcGxlVHlwZSgpOwotICAgICAgICB9ICAKLSAgICAgICAgaWYgKHRkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBuZXcgU2V0QmFzZVR5cGVDb21tYW5kKGNvbmNyZXRlQ29tcG9uZW50LCB0ZCk7Ci0gICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgWFNERGlyZWN0aXZlc01hbmFnZXIucmVtb3ZlVW51c2VkWFNESW1wb3J0cyhjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICB9ICAKLSAgICAgIGVsc2UKLSAgICAgIHsgIAotICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBuZXcgU2V0QmFzZVR5cGVBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQoY29uY3JldGVDb21wb25lbnQsIGNvbXBvbmVudC5nZXROYW1lKCksIGNvbXBvbmVudC5nZXRRdWFsaWZpZXIoKSwgY29tcG9uZW50LmdldEZpbGUoKSk7Ci0gICAgICAgIGNvbW1hbmQuc2V0TGFiZWwoTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfQkFTRV9UWVBFKTsKLSAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudC5pc05ldygpKQotICAgICAgeyAgCi0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gbnVsbDsKLSAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRNZXRhTmFtZSgpID09IElYU0RTZWFyY2hDb25zdGFudHMuU0lNUExFX1RZUEVfTUVUQV9OQU1FKQotICAgICAgICB7ICAKLSAgICAgICAgICBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEUsIGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICBjb21tYW5kLnNldE5hbWVUb0FkZChjb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgICB0ZCA9IGNvbW1hbmQuZ2V0Q3JlYXRlZFNpbXBsZVR5cGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBTZXRCYXNlVHlwZUNvbW1hbmQoY29uY3JldGVDb21wb25lbnQsIHRkKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgICAgICBYU0REaXJlY3RpdmVzTWFuYWdlci5yZW1vdmVVbnVzZWRYU0RJbXBvcnRzKGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgIH0gIAotICAgICAgZWxzZQotICAgICAgeyAgCi0gICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBTZXRCYXNlVHlwZUFuZE1hbmFnZXJEaXJlY3RpdmVzQ29tbWFuZChjb25jcmV0ZUNvbXBvbmVudCwgY29tcG9uZW50LmdldE5hbWUoKSwgY29tcG9uZW50LmdldFF1YWxpZmllcigpLCBjb21wb25lbnQuZ2V0RmlsZSgpKTsKLSAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvckNTSGVscElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvckNTSGVscElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzJlMTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RFZGl0b3JDU0hlbHBJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLS8qKgotICogCi0gKiBDb250ZXh0IFNlbnNpdGl2ZSBIZWxwIElEcwotICoKLSAqLwotcHVibGljIGNsYXNzIFhTREVkaXRvckNTSGVscElkcwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX1dJWkFSRF9QQUdFID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDAxMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX1RPS0VOX0NPTlRFTlRTID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDAyMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX0pVU1RfT05DRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1dzAwMzAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9aRVJPX09SX01PUkUgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMDQwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfT05FX09SX01PUkUgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMDUwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfT1BUSU9OQUwgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMDYwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfUkVQRUFUX1JBRElPID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDA3MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX1JBTkdFX1JBRElPID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDA4MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX1JFUEVBVF9GSUVMRCA9IFBMVUdJTl9OQU1FICsgIi54c2R1dzAwOTAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9SQU5HRV9NSU5JTVVNX0ZJRUxEID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDEwMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX1JBTkdFX01BWElNVU1fRklFTEQgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMTEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfQUREX0JVVFRPTiA9IFBMVUdJTl9OQU1FICsgIi54c2R1dzAxMjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9DVVJSRU5UX1ZBTFVFID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDEzMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9URVNUX1BBR0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMjAwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfU0FNUExFX1RFWFQgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMjEwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTkFNRV9ORVdfTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1dzAzMDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU5BTUVfVVBEQVRFX1JFRkVSRU5DRVMgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMzEwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV1RZUEVfQ09NUExFWFRZUEUgPSBQTFVHSU5fTkFNRSArICIueHNkdWQwMDEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXVFlQRV9TSU1QTEVUWVBFID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDAyMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV1RZUEVfTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAwMzAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUVFlQRV9OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDA1MCI7IC8vIHRoZXNlIDMgYXJlIGluIGNvbW1vbi51aQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRUWVBFX1RZUEVTID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDA2MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFRZUEVfU0VBUkNIU0NPUEVTID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDA3MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfRU5VTUVSQVRJT05TX19OT19OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDA5MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9FTlVNRVJBVElPTlNfX0RFTElNSVRFUl9DSEFSUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAxMDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfRU5VTUVSQVRJT05TX19QUkVTRVJWRV9MRUFEX0FORF9UUkFJTF9XSElURVNQQUNFUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAxMTAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0VYVEVOU0lPTlNfQ09NUE9ORU5UU19fRVhURU5TSU9OX0NBVEVHT1JJRVMgPSBQTFVHSU5fTkFNRSArICIueHNkdWQwMTMwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0VYVEVOU0lPTlNfQ09NUE9ORU5UU19fQVZBSUxBQkxFX0NPTVBPTkVOVFNfVE9fQUREID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDE0MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9FWFRFTlNJT05TX0NPTVBPTkVOVFNfX0FERCA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAxNTAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfRVhURU5TSU9OU19DT01QT05FTlRTX19ERUxFVEUgPSBQTFVHSU5fTkFNRSArICIueHNkdWQwMTYwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0VYVEVOU0lPTlNfQ09NUE9ORU5UU19fRURJVCA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAxNzAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0NBVEVHT1JZX19OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDE5MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9DQVRFR09SWV9fU0NIRU1BID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDIwMCI7IC8vIGNhbid0IGludm9rZSBoZWxwLCB0aGlzIGlzIGEgQ0xhYmVsLCBub3QgdGV4dCBGaWVsZAotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NBVEFMT0dfRU5UUklFU19fRU5UUklFU19UUkVFTElTVCA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAyMjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ0FUQUxPR19FTlRSSUVTX19ERVRBSUxTID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDIzMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTQ0hFTUFGSUxFU19QUkVGRVJFTkNFU19fUVVBTElGWV9YTUxTQ0hFTUFfTEFOR1VBR0VfQ09OU1RSVUNUUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZjAwMTAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTQ0hFTUFGSUxFU19QUkVGRVJFTkNFU19fWE1MX1NDSEVNQV9MQU5HVUFHRV9DT05TVFJVQ1RTX1BSRUZJWCA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZjAwMjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTQ0hFTUFGSUxFU19QUkVGRVJFTkNFU19fREVGQVVMVF9UQVJHRVROQU1FU1BBQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdWYwMDMwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MU0NIRU1BRklMRVNfUFJFRkVSRU5DRVNfX0hPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZjAwNDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTQ0hFTUFGSUxFU19QUkVGRVJFTkNFU19fSU1QT1JUX0NMRUFOVVAgPSBQTFVHSU5fTkFNRSArICIueHNkdWYwMDUwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UQVRJT05fVEFCX19OT19MQUJFTCA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAwMTAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OU19UQUJfX0VYVEVOU0lPTlMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMDMwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OU19UQUJfX0FERCA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAwNDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05TX1RBQl9fREVMRVRFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDA1MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTlNfVEFCX19FWFRFTlNJT05TX0RFVEFJTFMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMDYwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUUkFJTlRTX1RBQl9fTUlOSU1VTV9MRU5HVEggPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMDgwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RSQUlOVFNfVEFCX19NQVhJTVVNX0xFTkdUSCA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAwOTAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVFJBSU5UU19UQUJfX0NPTExBUFNFX1dISVRFU1BBQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMTAwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RSQUlOVFNfVEFCX19FTlVNRVJBVElPTlMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMTEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RSQUlOVFNfVEFCX19QQVRURVJOUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAxMjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVFJBSU5UU19UQUJfX05PX0xBQkVMID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDEzMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fU0NIRU1BX19QUkVGSVggPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMjAwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX1NDSEVNQV9fVEFSR0VUTkFNRVNQQUNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDIxMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19TQ0hFTUFfX0FEVkFOQ0VEID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDIyMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRFZBTkNFX1RBQl9fU0NIRU1BX0VMRU1FTlRfRk9STV9ERUZBVUxUID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDQ1MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFEVkFOQ0VfVEFCX19TQ0hFTUFfQVRUUklCVVRFX0ZPUk1fREVGQVVMVCA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDA0NjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRFZBTkNFX1RBQl9fU0NIRU1BX0JMT0NLX0RFRkFVTFQgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwNDcwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURWQU5DRV9UQUJfX1NDSEVNQV9GSU5BTF9ERUZBVUxUID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDQ4MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fRUxFTUVOVF9fTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAyMzAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fRUxFTUVOVF9fVFlQRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAyNDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fRUxFTUVOVF9fUkVGRVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDI1MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19FTEVNRU5UX19NSU5fT0NDVVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDE4MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19FTEVNRU5UX19NQVhfT0NDVVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDE5MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQ09NUExFWF9UWVBFX19OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDI2MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19DT01QTEVYX1RZUEVfX0lOSEVSSVRfRlJPTSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAyNzAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQ09NUExFWF9UWVBFX19JTkhFUklUX0JZID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDI4MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fU0lNUExFX1RZUEVfX05BTUUgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMjkwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX1NJTVBMRV9UWVBFX19WQVJJRVRZID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDMwMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19TSU1QTEVfVFlQRV9fQkFTRV9UWVBFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDMxMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQVRUUklCVVRFX19OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDMyMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BVFRSSUJVVEVfX1RZUEUgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMzMwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BVFRSSUJVVEVHUk9VUF9fTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAzNDAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX01PREVMR1JPVVBfREVGSU5JVElPTl9fTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAzNTAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0lOQ0xVREVfUkVERUZJTkVfX1NDSEVNQUxPQ0FUSU9OID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDM2MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fSU1QT1JUX19TQ0hFTUFMT0NBVElPTiA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAzNzAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fSU1QT1JUX19OQU1FU1BBQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMzgwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0lNUE9SVF9fUFJFRklYID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDM5MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQU5ZRUxFTUVOVF9fTkFNRVNQQUNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDQwMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BTllFTEVNRU5UX19QUk9DRVNTQ09OVEVOVFMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwNDEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0FOWUVMRU1FTlRfX01JTl9PQ0NVUkVOQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMTgwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0FOWUVMRU1FTlRfX01BWF9PQ0NVUkVOQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMTkwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BTllBVFRSSUJVVEVfX05BTUVTUEFDRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDA0MDAiOyAgLy8gdGhlc2UgNCBhcmUgbm90IHVzZWQsIHNhbWUgYXMgYW55ZWxlbWVudCBhYm92ZQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQU5ZQVRUUklCVVRFX19QUk9DRVNTQ09OVEVOVFMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwNDEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0FOWUFUVFJJQlVURV9fTUlOX09DQ1VSRU5DRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAxODAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQU5ZQVRUUklCVVRFX19NQVhfT0NDVVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDE5MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9fS0lORCA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDA0MjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9fTUlOX09DQ1VSRU5DRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAxODAiOyAvL2Nhbid0IGludm9rZSBoZWxwCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19NT0RFTEdST1VQX19NQVhfT0NDVVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDE5MCI7IC8vIGNhbid0IGludm9rZSBoZWxwCi0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9SRUZTX19SRUYgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwNDMwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BVFRSSUJVVEVHUk9VUF9SRUZTX19SRUYgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwNDQwIjsKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllNTgwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuSVhTRFRvb2xiYXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLklFeHRlbmRlZEZpZ3VyZUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0b3JDb25maWd1cmF0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVESVRPUkNPTkZJR1VSQVRJT05FWFRFTlNJT05JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLlhTREVkaXRvckV4dGVuc2lvbkNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMRURJVE9SQ09ORklHVVJBVElPTl9FWFRFTlNJT05JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsRWRpdG9yQ29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSRkFDVE9SWSA9ICJhZGFwdGVyRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTEJBUkFDVElPTiA9ICJ0b29sYmFyQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUdVUkVGQUNUT1JZID0gImZpZ3VyZUZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRQQVJURkFDVE9SWSA9ICJlZGl0UGFydEZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLSAgTGlzdCBkZWZpbmVkRXh0ZW5zaW9uc0xpc3QgPSBudWxsOwotCi0gIHB1YmxpYyBYU0RFZGl0b3JDb25maWd1cmF0aW9uKCkKLSAgewotCi0gIH0KLQotICBwdWJsaWMgWFNEQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGRlZmluZWRFeHRlbnNpb25zTGlzdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlYWRYU0RDb25maWd1cmF0aW9uUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgaWYgKCFkZWZpbmVkRXh0ZW5zaW9uc0xpc3QuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJldHVybiAoKFhTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMpIGRlZmluZWRFeHRlbnNpb25zTGlzdC5nZXQoMCkpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIEVkaXRQYXJ0RmFjdG9yeSBnZXRFZGl0UGFydEZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGRlZmluZWRFeHRlbnNpb25zTGlzdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlYWRYU0RDb25maWd1cmF0aW9uUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgaWYgKCFkZWZpbmVkRXh0ZW5zaW9uc0xpc3QuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJldHVybiAoKFhTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMpIGRlZmluZWRFeHRlbnNpb25zTGlzdC5nZXQoMCkpLmdldEVkaXRQYXJ0RmFjdG9yeSgpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5IGdldEZpZ3VyZUZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGRlZmluZWRFeHRlbnNpb25zTGlzdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlYWRYU0RDb25maWd1cmF0aW9uUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgaWYgKCFkZWZpbmVkRXh0ZW5zaW9uc0xpc3QuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJldHVybiAoKFhTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMpIGRlZmluZWRFeHRlbnNpb25zTGlzdC5nZXQoMCkpLmdldEZpZ3VyZUZhY3RvcnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRUb29sYmFyQWN0aW9ucygpCi0gIHsKLSAgICBpZiAoZGVmaW5lZEV4dGVuc2lvbnNMaXN0ID09IG51bGwpCi0gICAgewotICAgICAgcmVhZFhTRENvbmZpZ3VyYXRpb25SZWdpc3RyeSgpOwotICAgIH0KLSAgICBpZiAoIWRlZmluZWRFeHRlbnNpb25zTGlzdC5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmV0dXJuICgoWFNERWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcykgZGVmaW5lZEV4dGVuc2lvbnNMaXN0LmdldCgwKSkuZ2V0QWN0aW9uTGlzdCgpOwotICAgIH0KLSAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgfQotCi0gIHByb3RlY3RlZCBPYmplY3QgbG9hZENsYXNzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgY2xhc3NTdHJpbmcpCi0gIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpLmxvYWRDbGFzcyhjbGFzc1N0cmluZyk7Ci0gICAgICBPYmplY3QgaW5zdGFuY2UgPSB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotCi0gICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWFkWFNEQ29uZmlndXJhdGlvblJlZ2lzdHJ5KCkKLSAgewotICAgIGRlZmluZWRFeHRlbnNpb25zTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB1cGRhdGVMaXN0KElOVEVSTkFMRURJVE9SQ09ORklHVVJBVElPTl9FWFRFTlNJT05JRCk7Ci0gICAgdXBkYXRlTGlzdChYU0RFRElUT1JDT05GSUdVUkFUSU9ORVhURU5TSU9OSUQpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgdXBkYXRlTGlzdChTdHJpbmcgSUQpCi0gIHsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB4c2RFZGl0b3JFeHRlbnNpb25MaXN0ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoSUQpOwotICAgIGJvb2xlYW4gZGVmaW5lZEV4dGVuc2lvbnNFeGlzdCA9ICh4c2RFZGl0b3JFeHRlbnNpb25MaXN0ICE9IG51bGwgJiYgeHNkRWRpdG9yRXh0ZW5zaW9uTGlzdC5sZW5ndGggPiAwKTsKLSAgICAKLSAgICBpZiAoZGVmaW5lZEV4dGVuc2lvbnNFeGlzdCkKLSAgICB7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgeHNkRWRpdG9yRXh0ZW5zaW9uTGlzdC5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgWFNERWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMoKTsKLSAgICAgICAgZGVmaW5lZEV4dGVuc2lvbnNMaXN0LmFkZChwcm9wZXJ0aWVzKTsKLSAgCi0gICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0geHNkRWRpdG9yRXh0ZW5zaW9uTGlzdFtpXTsKLSAgICAgICAgU3RyaW5nIGFkYXB0ZXJGYWN0b3J5Q2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBREFQVEVSRkFDVE9SWSk7Ci0gICAgICAgIGlmIChhZGFwdGVyRmFjdG9yeUNsYXNzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbG9hZENsYXNzKGVsZW1lbnQsIGFkYXB0ZXJGYWN0b3J5Q2xhc3MpOwotICAgICAgICAgIFhTREFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQWRhcHRlckZhY3RvcnkpCi0gICAgICAgICAgewotICAgICAgICAgICAgYWRhcHRlckZhY3RvcnkgPSAoWFNEQWRhcHRlckZhY3RvcnkpIG9iamVjdDsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAKLSAgICAgICAgU3RyaW5nIGZpZ3VyZUZhY3RvcnlDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEZJR1VSRUZBQ1RPUlkpOwotICAgICAgICBpZiAoZmlndXJlRmFjdG9yeUNsYXNzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbG9hZENsYXNzKGVsZW1lbnQsIGZpZ3VyZUZhY3RvcnlDbGFzcyk7Ci0gICAgICAgICAgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSBmaWd1cmVGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmaWd1cmVGYWN0b3J5ID0gKElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkpIG9iamVjdDsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0RmlndXJlRmFjdG9yeUxpc3QoZmlndXJlRmFjdG9yeSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gIAotICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB0b29sYmFyQWN0aW9ucyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVE9PTEJBUkFDVElPTik7Ci0gICAgICAgIExpc3QgYWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKHRvb2xiYXJBY3Rpb25zICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRvb2xiYXJBY3Rpb25zLmxlbmd0aDsgaisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBhY3Rpb25FbGVtZW50ID0gdG9vbGJhckFjdGlvbnNbal07Ci0gICAgICAgICAgICBTdHJpbmcgYWN0aW9uQ2xhc3MgPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShDTEFTU05BTUUpOwotICAgICAgICAgICAgSVhTRFRvb2xiYXJBY3Rpb24gYWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChhY3Rpb25DbGFzcyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbG9hZENsYXNzKGFjdGlvbkVsZW1lbnQsIGFjdGlvbkNsYXNzKTsKLSAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElYU0RUb29sYmFyQWN0aW9uKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uID0gKElYU0RUb29sYmFyQWN0aW9uKSBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgYWN0aW9uTGlzdC5hZGQoYWN0aW9uKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcm9wZXJ0aWVzLnNldEFjdGlvbkxpc3QoYWN0aW9uTGlzdCk7Ci0gIAotICAgICAgICBTdHJpbmcgZWRpdFBhcnRGYWN0b3J5Q2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShFRElUUEFSVEZBQ1RPUlkpOwotICAgICAgICBpZiAoZWRpdFBhcnRGYWN0b3J5Q2xhc3MgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBsb2FkQ2xhc3MoZWxlbWVudCwgZWRpdFBhcnRGYWN0b3J5Q2xhc3MpOwotICAgICAgICAgIEVkaXRQYXJ0RmFjdG9yeSBlZGl0UGFydEZhY3RvcnkgPSBudWxsOwotICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFZGl0UGFydEZhY3RvcnkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZWRpdFBhcnRGYWN0b3J5ID0gKEVkaXRQYXJ0RmFjdG9yeSkgb2JqZWN0OwotICAgICAgICAgICAgcHJvcGVydGllcy5zZXRFZGl0UGFydEZhY3RvcnlMaXN0KGVkaXRQYXJ0RmFjdG9yeSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvckNvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxYmM3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLS8qKgotICogQ29udGV4dCBoZWxwIGlkIGNvbnN0YW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBYU0RFZGl0b3JDb250ZXh0SWRzIAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsIjsKLQotICAvKiBDT05URVhUX0lEcyBOZXcgWFNEIFdpemFyZCB1c2VzIHRoZSBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIGZyb20gb3JnLmVjbGlwc2UudWkuZGlhbG9ncyAqLwotIAotICAvKiBDT05URVhUX0lEcyBmb3IgWFNERWRpdG9yIGZvbGxvdyB0aGUgeHNkZXh4eCBjb250ZXh0IElEcyAqLwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTAwMTAgZm9yIFhTRCBFZGl0b3IgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfREVTSUdOX1ZJRVcgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDAxMCI7Ci0gIC8qIG5vIENPTlRFWFRfSUQgZm9yIEZpbGUgTmFtZSBUZXh0IEVkaXQgKG5vdCBlZGl0YWJsZSkgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDAyMCBmb3IgVmVyc2lvbiBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfVkVSU0lPTiAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDAyMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAwMzAgZm9yIExhbmd1YWdlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NDSEVNQV9MQU5HVUFHRSAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwMDMwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDA0MCBmb3IgTmFtZXNwYWNlIEdyb3VwICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX05BTUVTUEFDRV9HUk9VUCAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAwNDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMDUwIGZvciBQcmVmaXggVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX1BSRUZJWCAgICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAwNTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMDYwIGZvciBUYXJnZXQgbmFtZXNwYWNlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NDSEVNQV9UQVJHRVRfTkFNRVNQQUNFID0gUExVR0lOX05BTUUgKyAiLnhzZGUwMDYwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDA3MCBmb3IgQXBwbHkgUHVzaCBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfQVBQTFkgICAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDA3MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAwODAgZm9yIEF0dHJpYnV0ZSBmb3JtIGRlZmF1bHQgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX0FUVFJJQlVURSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAwODAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMDkwIGZvciBFbGVtZW50IGZvcm0gZGVmYXVsdCBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfRUxFTUVOVCAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDA5MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAxMDAgZm9yIEJsb2NrIGRlZmF1bHQgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX0JMT0NLICAgICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAxMDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMTEwIGZvciBGaW5hbCBEZWZhdWx0IENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NDSEVNQV9GSU5BTCAgICAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwMTEwIjsKLQotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDIwMCBmb3IgQW5ub3RhdGlvbnMgQ29tbWVudCBHcm91cCAtIG9ubHkgdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIERvY3VtZW50YXRpb24gRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBBcHAgSW5mbyBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOTk9UQVRJT05fQ09NTUVOVF9HUk9VUCA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDIwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAyMTAgZm9yIEFubm90YXRpb25zIENvbW1lbnQgR3JvdXAgLSBvbmx5IHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBEb2N1bWVudGF0aW9uIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gQXBwIEluZm8gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BTk5PVEFUSU9OX0NPTU1FTlQgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAyMTAiOwotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDMwMCBmb3IgRG9jdW1lbnRhdGlvbiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0RPQ1VNRU5UQVRJT05fREVTSUdOX1ZJRVcgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDMwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAzMTAgZm9yIFNvdXJjZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9ET0NVTUVOVEFUSU9OX1NPVVJDRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAzMTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMzIwIGZvciBMYW5ndWFnZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9ET0NVTUVOVEFUSU9OX0xBTkdVQUdFICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAzMjAiOwotICAvKiBDT05URVhUX0lEIENvbW1lbnQgR3JvdXAgaXMgZnJvbSBBbm5vdGF0aW9ucyBXaW5kb3cgeHNkZTAyMDAgKi8KLSAgLyogQ09OVEVYVF9JRCBDb21tZW50IE11bHRpLWxpbmUgRWRpdCBpcyBmcm9tIEFubm90YXRpb25zIFdpbmRvdyB4c2QwMjEwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDQwMCBmb3IgQXBwIEluZm8gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BUFBfSU5GT19ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDQwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA0MTAgZm9yIEFwcCBJbmZvIFNvdXJjZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BUFBfSU5GT19TT1VSQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkZTA0MTAiOwotICAvKiBDT05URVhUX0lEIENvbW1lbnQgR3JvdXAgaXMgZnJvbSBBbm5vdGF0aW9ucyBXaW5kb3cgeHNkZTAyMDAgKi8KLSAgLyogQ09OVEVYVF9JRCBDb21tZW50IE11bHRpLWxpbmUgRWRpdCBpcyBmcm9tIEFubm90YXRpb25zIFdpbmRvdyB4c2QwMjEwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDUwMCBmb3IgQ29tcGxleCBUeXBlIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQ09NUExFWF9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDUwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA1MTAgZm9yIE5hbWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQ09NUExFWF9OQU1FICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDUxMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA1MjAgZm9yIEFic3RyYWN0IENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0NPTVBMRVhfQUJTVFJBQ1QgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA1MjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNTMwIGZvciBNaXhlZCBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9DT01QTEVYX01JWEVEICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNTMwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDU0MCBmb3IgQmxvY2sgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQ09NUExFWF9CTE9DSyAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDU0MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA1NTAgZm9yIEZpbmFsIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0NPTVBMRVhfRklOQUwgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA1NTAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTA2MDAgZm9yIFNpbXBsZSBUeXBlIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0lNUExFX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNjAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDYxMCBmb3IgTmFtZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TSU1QTEVfTkFNRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA2MTAiOwotCi0gIC8qIENPTlRFWFRfSUQgZm9yIEdsb2JhbCBFbGVtZW50IGFuZCBFbGVtZW50IERlc2lnbiBWaWV3cyBhcmUgdGhlIHNhbWUgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDcwMCBmb3IgRWxlbWVudCBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNzEwIGZvciBFbGVtZW50IE5hbWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9OQU1FICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3MTAiOwotICAvKiBDT05URVhUX0lEIFR5cGUgSW5mb3JtYXRpb24gR3JvdXAgaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkwMCAqLwotICAvKiBDT05URVhUX0lEIEJ1aWx0LWluIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTIwICovCi0gIC8qIENPTlRFWFRfSUQgVXNlci1kZWZpbmVkIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTMwICovCi0gIC8qIENPTlRFWFRfSUQgVXNlci1kZWZpbmVkIGNvbXBsZXggdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDk0MCAqLwotICAvKiBDT05URVhUX0lEIFR5cGUgaW5mb3JtYXRpb24gQ29tYm8gQm94IGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5NTAgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDcyMCBmb3IgQWJzdHJhY3QgQ2hlY2sgQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9BQlNUUkFDVCAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3MjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNzMwIGZvciBOaWxsYWJsZSBDaGVjayBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX05JTExBQkxFICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDczMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA3NDAgZm9yIFZhbHVlIEdyb3VwICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9WQUxVRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3NDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNzUwIGZvciBGaXhlZCBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX0ZJWEVEICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDc1MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA3NjAgZm9yIERlZmF1bHQgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9ERUZBVUxUICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3NjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNzcwIGZvciBWYWx1ZSBHcm91cCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfVkFMVUVfR1JPVVAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNzcwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDc4MCBmb3IgTWluaW11bSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX01JTklNVU0gICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDc4MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA3OTAgZm9yIE1heGltdW0gVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9NQVhJTVVNICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3OTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwODAwIGZvciBCbG9jayBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX0JMT0NLICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDgwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA4MTAgZm9yIEZpbmFsIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfRklOQUwgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwODEwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDgyMCBmb3IgU3Vic3RpdHV0aW9uIEdyb3VwIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfU1VCU1RJVFVUSU9OID0gUExVR0lOX05BTUUgKyAiLnhzZGUwODIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDgzMCBmb3IgRm9ybSBRdWFsaWZpY2F0aW9uIENvbWJvIEJveCAqLyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9GT1JNICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA4MzAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTA5MDAgZm9yIFR5cGUgSGVscGVyIEdyb3VwIC0gb25seSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gR2xvYmFsIEVsZW1lbnQgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBHbG9iYWwgQXR0cmlidXRlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gU2ltcGxlIENvbnRlbnQgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBSZXN0cmljdGlvbiBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIExpc3QgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlvbiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1RZUEVfSEVMUEVSX0dST1VQICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwOTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDkxMCBmb3IgTm9uZSBSYWRpbyBCdXR0b24gLSBvbmx5IHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFJlc3RyaWN0aW9uIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gTGlzdCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaW9uIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVFlQRV9IRUxQRVJfTk9ORSAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA5MTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwOTIwIGZvciBCdWlsdC1pbiBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gLSBvbmx5IHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBHbG9iYWwgRWxlbWVudCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEdsb2JhbCBBdHRyaWJ1dGUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFJlc3RyaWN0aW9uIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gTGlzdCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaW9uIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVFlQRV9IRUxQRVJfQlVJTFRfSU4gPSBQTFVHSU5fTkFNRSArICIueHNkZTA5MjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwOTMwIGZvciBVc2VyLWRlZmluZWQgc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIC0gb25seSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gR2xvYmFsIEVsZW1lbnQgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBHbG9iYWwgQXR0cmlidXRlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gU2ltcGxlIENvbnRlbnQgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBSZXN0cmljdGlvbiBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIExpc3QgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlvbiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1RZUEVfSEVMUEVSX1VTRVJfREVGSU5FRF9TSU1QTEUgPSBQTFVHSU5fTkFNRSArICIueHNkZTA5MzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwOTQwIGZvciBVc2VyLWRlZmluZWQgY29tcGxleCB0eXBlIFJhZGlvIEJ1dHRvbiAtIG9ubHkgdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEdsb2JhbCBFbGVtZW50IERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVFlQRV9IRUxQRVJfVVNFUl9ERUZJTkVEX0NPTVBMRVggPSBQTFVHSU5fTkFNRSArICIueHNkZTA5NDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwOTUwIGZvciBUeXBlIGluZm9ybWF0aW9uIENvbWJvIEJveCAtIG9ubHkgdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEdsb2JhbCBFbGVtZW50IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gR2xvYmFsIEF0dHJpYnV0ZSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFNpbXBsZSBDb250ZW50IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gUmVzdHJpY3Rpb24gRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBMaXN0IERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVFlQRV9IRUxQRVJfVFlQRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDk1MCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTAwMCBmb3IgQXR0cmlidXRlIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMDAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTAxMCBmb3IgQXR0cmlidXRlIE5hbWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX05BTUUgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMDEwIjsKLSAgLyogQ09OVEVYVF9JRCBUeXBlIEluZm9ybWF0aW9uIEdyb3VwIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MDAgKi8KLSAgLyogQ09OVEVYVF9JRCBCdWlsdC1pbiBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkyMCAqLwotICAvKiBDT05URVhUX0lEIFVzZXItZGVmaW5lZCBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkzMCAqLwotICAvKiBDT05URVhUX0lEIFR5cGUgaW5mb3JtYXRpb24gQ29tYm8gQm94IGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5NTAgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTAyMCBmb3IgVmFsdWUgR3JvdXAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfVkFMVUVfR1JPVVAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEwMjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMDMwIGZvciBGaXhlZCBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfRklYRUQgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEwMzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMDQwIGZvciBEZWZhdWx0IFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9ERUZBVUxUICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTA0MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTEwNTAgZm9yIFZhbHVlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9WQUxVRSAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTA1MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTEwNjAgZm9yIFVzYWdlIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9VU0FHRSAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTA2MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTEwNzAgZm9yIEZvcm0gcXVhbGlmaWNhaXRvbiBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfRk9STSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEwNzAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTExMDAgZm9yIEVsZW1lbnQgUmVmIFdpbmRvdyBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfUkVGX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTExMCBmb3IgUmVmZXJlbmNlIE5hbWUgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9SRUZfUkVGRVJFTkNFICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTExMTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMTIwIGZvciBNaW5pbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfUkVGX01JTklNVU0gICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMTIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTEzMCBmb3IgTWF4aW11bSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX1JFRl9NQVhJTVVNICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTEzMCI7Ci0gIAotICAvKiBDT05URVhUX0lEIHhzZGUxMjAwIGZvciBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAqLyAKLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBDb21wbGV4IENvbnRlbnQgRGVzaWduIFZpZXcgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NJTVBMRV9DT05URU5UX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMjAwIjsKLSAgLyogQ09OVEVYVF9JRCBCYXNlIFR5cGUgR3JvdXAgaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkwMCAqLwotICAvKiBDT05URVhUX0lEIE5vbmUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MTAgKi8KLSAgLyogQ09OVEVYVF9JRCBCdWlsdC1pbiBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkyMCAqLwotICAvKiBDT05URVhUX0lEIFVzZXItZGVmaW5lZCBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkzMCAqLwotICAvKiBDT05URVhUX0lEIFR5cGUgaW5mb3JtYXRpb24gQ29tYm8gQm94IGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5NTAgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTIxMCBmb3IgRGVyaXZlZCBieSBDb21ibyBCb3ggLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gU2ltcGxlIENvbnRlbnQgRGVzaWduIFZpZXcgKi8gCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gQ29tcGxleCBDb250ZW50IERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0lNUExFX0NPTlRFTlRfREVSSVZFRCA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTIxMCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTMwMCBmb3IgUmVzdHJpY3Rpb24gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9SRVNUUklDVElPTl9ERVNJR05fVklFVyAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEzMDAiOwotICAvKiBDT05URVhUX0lEIEJhc2UgVHlwZSBHcm91cCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTAwICovCi0gIC8qIENPTlRFWFRfSUQgTm9uZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkxMCAqLwotICAvKiBDT05URVhUX0lEIEJ1aWx0LWluIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTIwICovCi0gIC8qIENPTlRFWFRfSUQgVXNlci1kZWZpbmVkIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTMwICovCi0gIC8qIENPTlRFWFRfSUQgVHlwZSBpbmZvcm1hdGlvbiBDb21ibyBCb3ggaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDk1MCAqLwotICAvKiBDT05URVhUX0lEIHhzZGUxMzEwIGZvciBGYWNldHMgR3JvdXAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9SRVNUUklDVElPTl9GQUNFVFNfR1JPVVAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEzMTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMzIwIGZvciBGYWNldHMgVGFibGUgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9SRVNUUklDVElPTl9GQUNFVFMgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEzMjAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTE0MDAgZm9yIExpc3QgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9MSVNUX0RFU0lHTl9WSUVXICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTQwMCI7Ci0gIC8qIENPTlRFWFRfSUQgQmFzZSBUeXBlIEdyb3VwIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MDAgKi8KLSAgLyogQ09OVEVYVF9JRCBOb25lIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTEwICovCi0gIC8qIENPTlRFWFRfSUQgQnVpbHQtaW4gc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MjAgKi8KLSAgLyogQ09OVEVYVF9JRCBVc2VyLWRlZmluZWQgc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MzAgKi8KLSAgLyogQ09OVEVYVF9JRCBUeXBlIGluZm9ybWF0aW9uIENvbWJvIEJveCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTUwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTUwMCBmb3IgQXR0cmlidXRlIEdyb3VwIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX0dST1VQX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxNTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTUxMCBmb3IgTmFtZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfR1JPVVBfTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTUxMCI7Ci0KLSAgLyogQ09OVEVYVF9JRCBmb3IgR2xvYmFsIEF0dHJpYnV0ZSBhbmQgQXR0cmlidXRlIERlc2lnbiBWaWV3cyBhcmUgdGhlIHNhbWUgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTYwMCBmb3IgQXR0cmlidXRlIEdyb3VwIFJlZmVyZW5jZSBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9HUk9VUF9SRUZfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTE2MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxNjEwIGZvciBSZWZlcmVuY2UgTmFtZSBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfR1JPVVBfUkVGX05BTUUgPSBQTFVHSU5fTkFNRSArICIueHNkZTE2MTAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTE3MDAgZm9yIEF0dHJpYnV0ZSBSZWZlcmVuY2UgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfUkVGX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxNzAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTcxMCBmb3IgUmVmZXJlbmNlIE5hbWUgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX1JFRl9OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZGUxNzEwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUxODAwIGZvciBQYXR0ZXJuIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfUEFUVEVSTl9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTgwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTE4MTAgZm9yIFZhbHVlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1BBVFRFUk5fVkFMVUUgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTgxMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTE4MjAgZm9yIENyZWF0ZSBSZWd1bGFyIEV4cHJlc3Npb24gUHVzaCBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9QQVRURVJOX1JFR1VMQVIgPSBQTFVHSU5fTkFNRSArICIueHNkZTE4MjAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTE5MDAgZm9yIEVudW0gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTlVNX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxOTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTkxMCBmb3IgVmFsdWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRU5VTV9WQUxVRSAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTkxMCI7Ci0gIAotICAvKiBDT05URVhUX0lEIHhzZGUyMDAwIGZvciBJbmNsdWRlIERlc2lnbiBQYWdlICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfSU5DTFVERV9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjAwMCI7Ci0gIC8qIG5vIENPTlRFWFRfSUQgZm9yIFNjaGVtYSBMb2NhdGlvbiBUZXh0IEVkaXQgKG5vdCBlZGl0YWJsZSkgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3QgUHVzaCBCdXR0b24gaXMgZnJvbSBJbmNsdWRlIEhlbHBlciB4c2RlMjEwMCAqLyAKLSAgCi0gIC8qIENPTlRFWFRfSUQgeHNkZTIxMDAgZm9yIEluY2x1ZGUgSGVscGVyIFNlbGVjdCBQdXNoIEJ1dHRvbiAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBJbmNsdWRlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gSW1wb3J0IERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfSU5DTFVERV9IRUxQRVJfU0VMRUNUID0gUExVR0lOX05BTUUgKyAiLnhzZGUyMTAwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUyMjAwIGZvciBJbXBvcnQgRGVzaWduIFBhZ2UgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9JTVBPUlRfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTIyMDAiOwotICAvKiBubyBDT05URVhUX0lEIGZvciBTY2hlbWEgTG9jYXRpb24gVGV4dCBFZGl0IChub3QgZWRpdGFibGUpICovCi0gIC8qIENPTlRFWFRfSUQgU2VsZWN0IFB1c2ggQnV0dG9uIGlzIGZyb20gSW5jbHVkZSBIZWxwZXIgeHNkZTIxMDAgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMjIxMCBmb3IgUHJlZml4IFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0lNUE9SVF9QUkVGSVggICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjIxMCI7Ci0gIC8qIG5vIENPTlRFWFRfSUQgZm9yIE5hbWVzcGFjZSBUZXh0IEVkaXQgKG5vdCBlZGl0YWJsZSkgKi8KLQotICAvKiBDT05URVhUX0lEIHhzZGUyMzAwIGZvciBSZWRlZmluZSBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1JFREVGSU5FX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUyMzAwIjsKLSAgLyogbm8gQ09OVEVYVF9JRCBmb3IgU2NoZW1hIExvY2F0aW9uIFRleHQgRWRpdCAobm90IGVkaXRhYmxlKSAqLwotICAvKiBDT05URVhUX0lEIFNlbGVjdCBQdXNoIEJ1dHRvbiBpcyBmcm9tIEluY2x1ZGUgSGVscGVyIHhzZGUyMTAwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMjQwMCBmb3IgR3JvdXAgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjQwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI0MTAgZm9yIE5hbWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfTkFNRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI0MTAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTI1MDAgZm9yIEdyb3VwIFNjb3BlIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfU0NPUEVfREVTSUdOX1ZJRVcgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjUwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI1MTAgZm9yIENvbnRlbnQgbW9kZWwgR3JvdXAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9TQ09QRV9DT05URU5UX0dST1VQID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNTEwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjUyMCBmb3IgU2VxdWVuY2UgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfU0NPUEVfU0VRVUVOQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkZTI1MjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNTMwIGZvciBDaG9pY2UgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfU0NPUEVfQ0hPSUNFICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI1MzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNTQwIGZvciBBbGwgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfU0NPUEVfQUxMICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI1NDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNTUwIGZvciBNaW5pbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0dST1VQX1NDT1BFX01JTklNVU0gID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNTUwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjU2MCBmb3IgTWF4aW11bSBUZXh0IEVkaXQqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0dST1VQX1NDT1BFX01BWElNVU0gID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNTYwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUyNjAwIGZvciBHcm91cCBSZWYgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9SRUZfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTI2MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNjEwIGZvciBSZWZlcmVuY2UgbmFtZSBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9SRUZfUkVGRVJFTkNFICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI2MTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNjIwIGZvciBNaW5pbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0dST1VQX1JFRl9NSU5JTVVNICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjYyMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI2MzAgZm9yIE1heGltdW0gVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfUkVGX01BWElNVU0gICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNjMwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUyNzAwIGZvciBVbmlxdWUgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9VTklRVUVfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTI3MDAiOwotICAvKiBDT05URVhUX0lEIE5hbWUgVGV4dCBFZGl0IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MDAgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3RvciBHcm91cCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODEwICovCi0gIC8qIENPTlRFWFRfSUQgU2VsZWN0b3IgTXVsaXQtbGluZSBFZGl0IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MjAgKi8KLSAgLyogQ09OVEVYVF9JRCBGaWVsZHMgR3JvdXAgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjgzMCAqLwotICAvKiBDT05URVhUX0lEIFNvdXJjZSBUZXh0IEVkaXQgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg0MCAqLwotICAvKiBDT05URVhUX0lEIEFkZCBQdXNoIEJ1dHRvbiBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODUwICovCi0gIC8qIENPTlRFWFRfSUQgUmVtb3ZlIFB1c2ggQnV0dG9uIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4NjAgKi8KLSAgLyogQ09OVEVYVF9JRCBUYXJnZXQgTGlzdCBCb3ggaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg3MCAqLwotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjgwMCBmb3IgVW5pcXVlIEJhc2UgTmFtZSBUZXh0IEVkaXQgLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pcXVlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9CQVNFX05BTUUgPSBQTFVHSU5fTkFNRSArICIueHNkZTI4MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyODEwIGZvciBTZWxlY3RvciBHcm91cCAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlxdWUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgUmVmIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVU5JUVVFX0JBU0VfU0VMRUNUT1JfR1JPVVAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI4MTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyODIwIGZvciBTZWxlY3RvciBNdWx0aS1saW5lIEVkaXQgLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pcXVlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9CQVNFX1NFTEVDVE9SICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyODIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjgzMCBmb3IgRmllbGRzIEdyb3VwIC0gdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaXF1ZSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBSZWYgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9VTklRVUVfQkFTRV9GSUVMRFNfR1JPVVAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjgzMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI4NDAgZm9yIFNvdXJjZSBUZXh0IEVkaXQgLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pcXVlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9CQVNFX1NPVVJDRSAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyODQwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjg1MCBmb3IgQWRkIFB1c2ggQnV0dG9uIC0gdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaXF1ZSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBSZWYgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9VTklRVUVfQkFTRV9BREQgICAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjg1MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI4NjAgZm9yIFJlbW92ZSBQdXNoIEJ1dHRvbiAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlxdWUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgUmVmIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVU5JUVVFX0JBU0VfUkVNT1ZFICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI4NjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyODcwIGZvciBUYXJnZXQgTGlzdCBCb3ggLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pcXVlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9CQVNFX1RBUkdFVCAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyODcwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUyOTAwIGZvciBLZXkgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9LRVlfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTI5MDAiOwotICAvKiBDT05URVhUX0lEIE5hbWUgVGV4dCBFZGl0IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MDAgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3RvciBHcm91cCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODEwICovCi0gIC8qIENPTlRFWFRfSUQgU2VsZWN0b3IgTXVsaXQtbGluZSBFZGl0IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MjAgKi8KLSAgLyogQ09OVEVYVF9JRCBGaWVsZHMgR3JvdXAgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjgzMCAqLwotICAvKiBDT05URVhUX0lEIFNvdXJjZSBUZXh0IEVkaXQgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg0MCAqLwotICAvKiBDT05URVhUX0lEIEFkZCBQdXNoIEJ1dHRvbiBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODUwICovCi0gIC8qIENPTlRFWFRfSUQgUmVtb3ZlIFB1c2ggQnV0dG9uIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4NjAgKi8KLSAgLyogQ09OVEVYVF9JRCBUYXJnZXQgTGlzdCBCb3ggaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg3MCAqLwotICAvKiBDT05URVhUX0lEIHhzZGUyOTAwIGZvciBLZXkgRGVzaWduIFZpZXcgKi8KLSAgCi0gIC8qIENPTlRFWFRfSUQgeHNkZTI5NTAgZm9yIEtleSBSZWYgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9LRVlfUkVGX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUyOTUwIjsKLSAgLyogQ09OVEVYVF9JRCBOYW1lIFRleHQgRWRpdCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODAwICovCi0gIC8qIENPTlRFWFRfSUQgeHNkZTI5NjAgZm9yIFJlZmVyZW5jZSBLZXkgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfS0VZX1JFRl9SRUZFUkVOQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkZTI5NjAiOwotICAvKiBDT05URVhUX0lEIFNlbGVjdG9yIEdyb3VwIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MTAgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3RvciBNdWxpdC1saW5lIEVkaXQgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjgyMCAqLwotICAvKiBDT05URVhUX0lEIEZpZWxkcyBHcm91cCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODMwICovCi0gIC8qIENPTlRFWFRfSUQgU291cmNlIFRleHQgRWRpdCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODQwICovCi0gIC8qIENPTlRFWFRfSUQgQWRkIFB1c2ggQnV0dG9uIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4NTAgKi8KLSAgLyogQ09OVEVYVF9JRCBSZW1vdmUgUHVzaCBCdXR0b24gaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg2MCAqLwotICAvKiBDT05URVhUX0lEIFRhcmdldCBMaXN0IEJveCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODcwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMzAwMCBmb3IgQW55IEVsZW1lbnQgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BTllfRUxFTUVOVF9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUzMDAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMzAxMCBmb3IgTmFtZXNwYWNlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOWV9FTEVNRU5UX05BTUVTUEFDRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMzAxMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTMwMjAgZm9yIFByb2Nlc3MgQ29udGVudHMgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQU5ZX0VMRU1FTlRfUFJPQ0VTUyAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUzMDIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMzAzMCBmb3IgTWluaW11bSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BTllfRUxFTUVOVF9NSU5JTVVNICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTMwMzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUzMDQwIGZvciBNYXhpbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOWV9FTEVNRU5UX01BWElNVU0gICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMzA0MCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMzEwMCBmb3IgQW55IEF0dHJpYnV0ZSBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOWV9BVFRSSUJVVEVfVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMzEwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTMxMTAgZm9yIE5hbWVzcGFjZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BTllfQVRUUklCVVRFX05BTUVTUEFDRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMzExMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTMxMjAgZm9yIFByb2Nlc3MgQ29udGVudHMgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQU5ZX0FUVFJJQlVURV9QUk9DRVNTICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTMxMjAiOwotCi0gIC8qIG5vIENPTlRFWFRfSUQgZm9yIFVuaW9uIERlc2lnbiBWaWV3IC0gdXNlcyBhIGdlbmVyaWMgaW50ZXJmYWNlICovCi0gIC8qIENPTlRFWFRfSUQgVHlwZSBJbmZvcm1hdGlvbiBHcm91cCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTAwICovCi0gIC8qIENPTlRFWFRfSUQgQnVpbHQtaW4gc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MjAgKi8KLSAgLyogQ09OVEVYVF9JRCBVc2VyLWRlZmluZWQgc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MzAgKi8KLSAgLyogQ09OVEVYVF9JRCBUeXBlIGluZm9ybWF0aW9uIENvbWJvIEJveCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTUwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMzIwMCBmb3IgTm90YXRpb24gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9OT1RBVElPTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUzMjAwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGU0MDAwIGZvciBTb3VyY2UgVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NPVVJDRV9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGU0MDAwIjsKLQotICAvKiBDT05URVhUX0lEcyBmb3IgUmVndWxhciBFeHByZXNzaW9uIFdpemFyZCBmb2xsb3cgdGhlIHhzZHJ4eHggY29udGV4dCBJRHMgKi8KLSAgCi0gIC8qIENPTlRFWFRfSUQgeHNkcjAwMTAgZm9yIENvbXBvc2UgUmVndWxhciBFeHByZXNzaW9uIFBhZ2UgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9QQUdFICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAwMTAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMDE1IGZvciBUb2tlbiBDb250ZW50cyBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9UT0tFTiA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDAxNSI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwMjAgZm9yIE9jY3VycmVjZSBHcm91cCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX09DQ1VSUkVOQ0VfR1JPVVAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAwMjAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMDMwIGZvciBKdXN0IG9uY2UgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFJfQ09NUE9TSVRJT05fSlVTVF9PTkNFICAgID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMDMwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RyMDA0MCBmb3IgWmVybyBvciBtb3JlIFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX1pFUk9fT1JfTU9SRSA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDA0MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwNTAgZm9yIE9uZSBvciBtb3JlIFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX09ORV9PUl9NT1JFICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDA1MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwNjAgZm9yIE9wdGlvbmFsIFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX09QVElPTkFMICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDA2MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwNzAgZm9yIFJlcGVhdCBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9SRVBFQVQgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAwNzAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMDgwIGZvciBSYW5nZSBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9SQU5HRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAwODAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMDkwIGZvciBSZXBlYXQgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFJfQ09NUE9TSVRJT05fUkVQRUFUX1RFWFQgID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMDkwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RyMDEwMCBmb3IgUmFuZ2UgTWluaW11bSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9SQU5HRV9NSU4gICAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAxMDAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMTEwIGZvciBSYW5nZSBNYXhpbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX1JBTkdFX01BWCAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDExMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAxMjAgZm9yIEFkZCBQdXNoIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX0FERCAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDEyMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAxMzAgZm9yIEN1cnJlbnQgUmVndWxhciBFeHByZXNzaW9uIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX0NVUlJFTlQgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDEzMCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RyMDIwMCBmb3IgVGVzdCBSZWd1bGFyIEV4cHJlc3Npb24gUGFnZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX1RFU1RfUEFHRSAgID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMjAwIjsKLSAgLyogbm8gQ09OVEVYVF9JRCBmb3IgUmVndWxhciBFeHByZXNzaW9uIFRleHQgRWRpdCAobm90IGVkaXRhYmxlKSAqLwotICAvKiBDT05URVhUX0lEIHhzZHIwMjEwIGZvciBTYW1wbGUgVGV4dCBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9URVNUX1NBTVBMRSA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDIxMCI7Ci0KLSAgLyogQ09OVEVYVF9JRHMgZm9yIFByZWZlcmVuY2VzIFBhZ2UgZm9sbG93cyB0aGUgeHNkcHh4eCBjb250ZXh0IElEcyAqLwotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RwMDAxMCBmb3IgWE1MIFNjaGVtYSBQcmVmZXJlbmNlcyBQYWdlICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFBfUFJFRkVSRU5DRV9QQUdFID0gUExVR0lOX05BTUUgKyAiLnhzZHAwMDEwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RwMDAyMCBmb3IgWE1MIFNjaGVtYSBFZGl0b3IgUHJlZmVyZW5jZXMgUGFnZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RQX0VESVRPUl9QUkVGRVJFTkNFX1BBR0UgPSBQTFVHSU5fTkFNRSArICIueHNkcDAwMjAiOwotICAvKiBDT05URVhUX0lEIHhzZHAwMDMwIGZvciBYTUwgU2NoZW1hIFZhbGlkYXRvciBQcmVmZXJlbmNlcyBQYWdlICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFBfVkFMSURBVE9SX1BSRUZFUkVOQ0VfUEFHRSA9IFBMVUdJTl9OQU1FICsgIi54c2RwMDAzMCI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3MTM5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5JRXh0ZW5kZWRGaWd1cmVGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgWFNERWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcwotewotICBYU0RBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLSAgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSBmaWd1cmVGYWN0b3J5OwotICBFZGl0UGFydEZhY3RvcnkgZWRpdFBhcnRGYWN0b3J5OwotICBMaXN0IGFjdGlvbkxpc3Q7Ci0KLSAgcHVibGljIFhTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMoKQotICB7Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFjdGlvbkxpc3QoTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgdGhpcy5hY3Rpb25MaXN0ID0gYWN0aW9uTGlzdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXJGYWN0b3J5KFhTREFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KQotICB7Ci0gICAgdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWRpdFBhcnRGYWN0b3J5TGlzdChFZGl0UGFydEZhY3RvcnkgZWRpdFBhcnRGYWN0b3J5KQotICB7Ci0gICAgdGhpcy5lZGl0UGFydEZhY3RvcnkgPSBlZGl0UGFydEZhY3Rvcnk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGaWd1cmVGYWN0b3J5TGlzdChJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5IGZpZ3VyZUZhY3RvcnkpCi0gIHsKLSAgICB0aGlzLmZpZ3VyZUZhY3RvcnkgPSBmaWd1cmVGYWN0b3J5OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QWN0aW9uTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gYWN0aW9uTGlzdDsKLSAgfQotCi0gIHB1YmxpYyBYU0RBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0gIH0KLQotICBwdWJsaWMgRWRpdFBhcnRGYWN0b3J5IGdldEVkaXRQYXJ0RmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gZWRpdFBhcnRGYWN0b3J5OwotICB9Ci0KLSAgcHVibGljIElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkgZ2V0RmlndXJlRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gZmlndXJlRmFjdG9yeTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvclBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTBiNDE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RFZGl0b3JQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLlByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbS5Ob2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgWFNERWRpdG9yUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIjsgIC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RfWFNEX0RFRkFVTFRfUFJFRklYX1RFWFQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbHNjaGVtYS54c2REZWZhdWx0UHJlZml4VGV4dCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RfUFJFRkVSRURfQlVJTFRfSU5fVFlQRVMgPSAib3JnLmVjbGlwc2Uud3N0LnhtbHNjaGVtYS5wcmVmZXJlZEJ1aWx0SW5UeXBlcyI7ICAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9MSVNUX1NFUEFSQVRPUiA9ICJcbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OU19TQ0hFTUFTX0VYVEVOU0lPTklEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuZXh0ZW5zaW9uQ2F0ZWdvcmllcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFUFJFQ0FURURfRVhURU5TSU9OU19TQ0hFTUFTX0VYVEVOU0lPTklEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuRXh0ZW5zaW9uc1NjaGVtYXNEZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy5leGFtcGxlLm9yZyI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWFNEX0NPTlRFTlRfVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlIjsgLy8kTk9OLU5MUy0xJAotICAKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgWFNERWRpdG9yUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotICBwcml2YXRlIEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkgcmVnaXN0cnk7ICAKLSAgcHJpdmF0ZSBOb2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5IG5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnk7Ci0gIHByaXZhdGUgWFNERWRpdG9yQ29uZmlndXJhdGlvbiB4c2RFZGl0b3JDb25maWd1cmF0aW9uID0gbnVsbDsKLSAgcHJpdmF0ZSBzdGF0aWMgQnVuZGxlIGJ1bmRsZTsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUX1VTRV9TSU1QTEVfRURJVF9NT0RFID0gUExVR0lOX0lEICsgIi51c2VTaW1wbGVFZGl0TW9kZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RfU0hPV19JTkhFUklURURfQ09OVEVOVCA9IFBMVUdJTl9JRCArICIuc2hvd0luaGVyaXRlZENvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RfWFNEX0xBTkdVQUdFX1FVQUxJRlkgPSAib3JnLmVjbGlwc2Uud3N0LnhtbHNjaGVtYS54c2RRdWFsaWZ5IjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVF9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2Uud3N0LnhtbHNjaGVtYS5kZWZhdWx0VGFyZ2V0bmFtZXNwYWNlVGV4dCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RfU0hPV19FWFRFUk5BTFMgPSBQTFVHSU5fSUQgKyAiLnNob3dFeHRlcm5hbHMiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUX1hTRF9JTVBPUlRfQ0xFQU5VUCA9IFBMVUdJTl9JRCArICIuYXV0b0ltcG9ydENsZWFudXAiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUX1hTRF9BVVRPX09QRU5fU0NIRU1BX0xPQ0FUSU9OX0RJQUxPRyA9IFBMVUdJTl9JRCArICIuYXV0b09wZW5TY2hlbWFMb2NhdGlvbkRpYWxvZyI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfUEFHRSA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlZmF1bHRQYWdlIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVTSUdOX1BBR0UgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ25QYWdlIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgU09VUkNFX1BBR0UgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zb3VyY2VQYWdlIjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgWFNERWRpdG9yUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlidW5kbGUgPSBjb250ZXh0LmdldEJ1bmRsZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBYU0RFZGl0b3JQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBvKQotICB7Ci0gICAgICByZXR1cm4gZ2V0UmVzb3VyY2VTdHJpbmcoa2V5LCBuZXcgT2JqZWN0W10geyBvfSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBvYmplY3RzKQotICB7Ci0gICAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgb2JqZWN0cyk7Ci0gIH0KLQkKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IG8xLCBPYmplY3QgbzIpCi0gIHsKLSAgICAgIHJldHVybiBnZXRSZXNvdXJjZVN0cmluZyhrZXksIG5ldyBPYmplY3RbXSB7IG8xLCBvMn0pOwotICB9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJLy8gcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpblJlc291cmNlcyIpOwotICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKGdldEJ1bmRsZSgpKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigib3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsIHBhdGgpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgbmFtZSwgYm9vbGVhbiBnZXRCYXNlVVJMKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTCA9IGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgaW1hZ2VTdHJpbmcgPSBnZXRCYXNlVVJMID8gImljb25zLyIgKyBuYW1lIDogbmFtZTsgLy8kTk9OLU5MUy0xJAotCi0JCQlVUkwgaW1hZ2VVUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIGltYWdlU3RyaW5nKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJY29uKFN0cmluZyBuYW1lKQotCXsKLQkgIHRyeSB7Ci0JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGdldEltYWdlUmVnaXN0cnkoKTsKLQotCQlpZiAoaW1hZ2VSZWdpc3RyeS5nZXQobmFtZSkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KG5hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJVVJMIGluc3RhbGxVUkwgPSBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGltYWdlU3RyaW5nID0gImljb25zLyIgKyBuYW1lOyAvLyROT04tTkxTLTEkCi0KLQkJCVVSTCBpbWFnZVVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgaW1hZ2VTdHJpbmcpOwotCQkJaW1hZ2VSZWdpc3RyeS5wdXQobmFtZSwgSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpKTsKLQkJCXJldHVybiBpbWFnZVJlZ2lzdHJ5LmdldChuYW1lKTsKLQkJfQotCi0JICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gbnVsbDsKLQkgIH0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBYU0RFZGl0b3JQbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFhTRFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZVN0cmluZyhrZXkpOwotCX0KLQotICAvKioKLSAgICogVGhpcyBnZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgYW5kIGRvZXMgb25lIHN1YnN0aXR1dGlvbi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgewotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChQbGF0Zm9ybS5nZXRSZXNvdXJjZUJ1bmRsZShnZXRCdW5kbGUoKSkuZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXXtzMX0pOwotICB9Ci0gIAotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0WFNESW1hZ2UoU3RyaW5nIGljb25OYW1lKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0SW1hZ2UoaWNvbk5hbWUpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgaWNvbk5hbWUpIHsKLQkJSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCi0JCWlmIChpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlUmVnaXN0cnkucHV0KGljb25OYW1lLCBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoZ2V0Q2xhc3MoKSwgaWNvbk5hbWUpKTsKLQkJCXJldHVybiBpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFVSTCBnZXRCYXNlVVJMKCkgewotCQlyZXR1cm4gYnVuZGxlLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SWNvbkltYWdlKFN0cmluZyBvYmplY3QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShuZXcgVVJMKGdldEJhc2VVUkwoKSArICJpY29ucy8iICsgb2JqZWN0ICsgIi5naWYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd0luaGVyaXRlZENvbnRlbnQoKQotICB7Ci0gICAgcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oQ09OU1RfU0hPV19JTkhFUklURURfQ09OVEVOVCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkKLSAgewotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfU0hPV19JTkhFUklURURfQ09OVEVOVCwgZmFsc2UpOwotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfWFNEX0RFRkFVTFRfUFJFRklYX1RFWFQsICJ4c2QiKTsgLy8kTk9OLU5MUy0xJAotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfWFNEX0xBTkdVQUdFX1FVQUxJRlksIGZhbHNlKTsKLSAgICBzdG9yZS5zZXREZWZhdWx0KERFRkFVTFRfUEFHRSwgREVTSUdOX1BBR0UpOwotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFLCBERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfU0hPV19FWFRFUk5BTFMsIGZhbHNlKTsKLSAgICBzdG9yZS5zZXREZWZhdWx0KENPTlNUX1hTRF9JTVBPUlRfQ0xFQU5VUCwgZmFsc2UpOwotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfWFNEX0FVVE9fT1BFTl9TQ0hFTUFfTE9DQVRJT05fRElBTE9HLCB0cnVlKTsKLSAgICAKLSAgICAvL0V2ZW4gdGhlIGxhc3QgaXRlbSBpbiB0aGUgbGlzdCBtdXN0IGNvbnRhaW4gYSB0cmFpbGluZyBMaXN0IHNlcGFyYXRvcgotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfUFJFRkVSRURfQlVJTFRfSU5fVFlQRVMsICAgICAJCQotICAgIAkJImJvb2xlYW4iKyBDVVNUT01fTElTVF9TRVBBUkFUT1IgKyAvLyROT04tTkxTLTEkCi0gICAgCQkiZGF0ZSIgKyBDVVNUT01fTElTVF9TRVBBUkFUT1IgKyAvLyROT04tTkxTLTEkCi0gICAgCQkiZGF0ZVRpbWUiICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SICsgLy8kTk9OLU5MUy0xJAotICAgIAkJImRvdWJsZSIgKyBDVVNUT01fTElTVF9TRVBBUkFUT1IgKyAvLyROT04tTkxTLTEkCi0gICAgCQkiZmxvYXQiICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SICsgLy8kTk9OLU5MUy0xJAotICAgIAkJImhleEJpbmFyeSIgKyBDVVNUT01fTElTVF9TRVBBUkFUT1IgKyAvLyROT04tTkxTLTEkCi0gICAgCQkiaW50IiArIENVU1RPTV9MSVNUX1NFUEFSQVRPUiArIC8vJE5PTi1OTFMtMSQKLSAgICAJCSJzdHJpbmciICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SICsgLy8kTk9OLU5MUy0xJAotICAgIAkJInRpbWUiICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkgZ2V0RXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSgpCi0gIHsKLSAgICBpZiAocmVnaXN0cnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZWdpc3RyeSA9IG5ldyBFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5KEVYVEVOU0lPTlNfU0NIRU1BU19FWFRFTlNJT05JRCk7Ci0gICAgICByZWdpc3RyeS5fX2ludGVybmFsU2V0RGVwcmVjYXRlZEV4dGVuc2lvbklkKERFUFJFQ0FURURfRVhURU5TSU9OU19TQ0hFTUFTX0VYVEVOU0lPTklEKTsKLSAgICAgIHJlZ2lzdHJ5LnNldFByZWZTdG9yZShYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkgKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlZ2lzdHJ5OwotICB9Ci0KLSAKLSAgcHVibGljIFhTREVkaXRvckNvbmZpZ3VyYXRpb24gZ2V0WFNERWRpdG9yQ29uZmlndXJhdGlvbigpCi0gIHsKLSAgICBpZiAoeHNkRWRpdG9yQ29uZmlndXJhdGlvbiA9PSBudWxsKQotICAgIHsKLSAgICAgIHhzZEVkaXRvckNvbmZpZ3VyYXRpb24gPSBuZXcgWFNERWRpdG9yQ29uZmlndXJhdGlvbigpOwotICAgIH0KLSAgICByZXR1cm4geHNkRWRpdG9yQ29uZmlndXJhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHhtbCBzY2hlbWEgZGVmYXVsdCBuYW1lc3BhY2UgcHJlZml4Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFhNTFNjaGVtYVByZWZpeCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKENPTlNUX1hTRF9ERUZBVUxUX1BSRUZJWF9URVhUKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldFNob3dFeHRlcm5hbHMoKQotICB7Ci0gICAgcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oQ09OU1RfU0hPV19FWFRFUk5BTFMpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTaG93RXh0ZXJuYWxzKGJvb2xlYW4gZG9TaG93KQotICB7Ci0gICAgZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoQ09OU1RfU0hPV19FWFRFUk5BTFMsIGRvU2hvdyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFJlbW92ZUltcG9ydFNldHRpbmcoKQotICB7Ci0gICAgcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oQ09OU1RfWFNEX0lNUE9SVF9DTEVBTlVQKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEF1dG9tYXRpY2FsbHlPcGVuU2NoZW1hTG9jYXRpb25EaWFsb2dTZXR0aW5nKCkKLSAgewotICAgIHJldHVybiBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKENPTlNUX1hTRF9BVVRPX09QRU5fU0NIRU1BX0xPQ0FUSU9OX0RJQUxPRyk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHhtbCBzY2hlbWEgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFhNTFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKENPTlNUX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgaWYgKCF0YXJnZXROYW1lc3BhY2UuZW5kc1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICB0YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2UgKyAiLyI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHhtbCBzY2hlbWEgbGFuZ3VhZ2UgcXVhbGlmaWNhdGlvbgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNRdWFsaWZ5WE1MU2NoZW1hTGFuZ3VhZ2UoKSB7Ci0gICAgcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oQ09OU1RfWFNEX0xBTkdVQUdFX1FVQUxJRlkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTaGVsbCBnZXRTaGVsbCgpIHsKLSAgICByZXR1cm4gZ2V0UGx1Z2luKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U291cmNlUGFnZUFzRGVmYXVsdCgpCi0gIHsKLSAgICBnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShERUZBVUxUX1BBR0UsIFNPVVJDRV9QQUdFKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlc2lnblBhZ2VBc0RlZmF1bHQoKQotICB7Ci0gICAgZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoREVGQVVMVF9QQUdFLCBERVNJR05fUEFHRSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0RGVmYXVsdFBhZ2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZSBvZiB0aGUgc3RyaW5nIGNvbnN0YW50IHRoYXQgaXMgdGhlIGRlZmF1bHQgcGFnZQotICAgKiAgICAgICAgIHRoZSBlZGl0b3Igc2hvdWxkIHR1cm4gdG8gd2hlbiBmaXJzdCBvcGVuZWQuIENoYW5nZXMgdG8gdGhlCi0gICAqICAgICAgICAgbGFzdCB2aXNpYmxlIHBhZ2Ugd2hlbiB0aGUgZWRpdG9yIHdhcyBjbG9zZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhZ2UoKSB7Ci0gICAgcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhERUZBVUxUX1BBR0UpOwotICB9Ci0KLSAgcHVibGljIE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkgZ2V0Tm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSgpCi0gIHsKLSAgICBpZiAobm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSA9PSBudWxsKQotICAgIHsgIAotICAgICAgbm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSA9IG5ldyBOb2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5KCJmb28iKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX0NVU1RPTUlaQVRJT05fUFJPVklERVJfUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkucHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlclBsdWdpbklkIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9DVVNUT01JWkFUSU9OX1BST1ZJREVSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5wcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyQ2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHJpdmF0ZSBzdGF0aWMgUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyOwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXJJbml0aWFsaXplZCA9IGZhbHNlOwotICAKLSAgcHVibGljIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgZ2V0UHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcigpCi0gIHsKLSAgICBpZiAoIXByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXJJbml0aWFsaXplZCkKLSAgICB7Ci0gICAgICBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVySW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgICAgU3RyaW5nIHBsdWdpbk5hbWUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoUFJPRFVDVF9DVVNUT01JWkFUSU9OX1BST1ZJREVSX1BMVUdJTl9JRCk7Ci0gICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFBST0RVQ1RfQ1VTVE9NSVpBVElPTl9QUk9WSURFUl9DTEFTU19OQU1FKTsKLSAgICAgIGlmIChwbHVnaW5OYW1lICE9IG51bGwgJiYgcGx1Z2luTmFtZS5sZW5ndGgoKSA+IDAgJiYKLSAgICAgICAgICBjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luTmFtZSk7Ci0gICAgICAgICAgQ2xhc3MgY2xhenogPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciA9IChQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKWNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gICAgICAgICAgCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gIAotICAgIHJldHVybiBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyOwotICB9IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDAzYWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNERWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlRWxlbWVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZUVsZW1lbnRSZWZlcmVuY2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLk5ld0VsZW1lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoLlhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgaW1wbGVtZW50cyBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcgoteyAgCi0gIHByb3RlY3RlZCBJRmlsZSBjdXJyZW50RmlsZTsKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYVtdIHNjaGVtYXM7Ci0gIAotICBwdWJsaWMgWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgdGhpcy5jdXJyZW50RmlsZSA9IGN1cnJlbnRGaWxlOwotICAgIHRoaXMuc2NoZW1hcyA9IHNjaGVtYXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZFRvSGlzdG9yeShDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudCkKLSAgewotICAgIC8vIFRPRE8gKGNzKSBpbXBsZW1lbnQgbWUhICAgIAotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnREaWFsb2cgZ2V0QnJvd3NlRGlhbG9nKCkKLSAgewotICAgIC8vWFNEU2V0RXhpc3RpbmdUeXBlRGlhbG9nIGRpYWxvZyA9IG5ldyBYU0RTZXRFeGlzdGluZ1R5cGVEaWFsb2coY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICAgIC8vcmV0dXJuIGRpYWxvZzsKLSAgICBYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUgZGlhbG9nRGVsZWdhdGUgPSAKLSAgICAJbmV3IFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZShYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUuRUxFTUVOVF9NRVRBX05BTUUsIGN1cnJlbnRGaWxlLCBzY2hlbWFzKTsKLSAgICByZXR1cm4gZGlhbG9nRGVsZWdhdGU7Ci0gIH0KLQotICBwdWJsaWMgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZ2V0Q29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcigpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGdldEhpc3RvcnkoKQotICB7Ci0gICAgLy8gVE9ETyAoY3MpIGltcGxlbWVudCB0aGlzIHByb3Blcmx5IC0gc2hvdWxkIHRoaXMgaGlzdG9yeSBiZSBnbG9iYWwgb3IgbG9jYWwgdG8gZWFjaCBlZGl0b3I/Ci0gICAgLy8gVGhpcyBpcyBzb21ldGhpbmcgd2Ugc2hvdWxkIHBsYXkgYXJvdW5kIHdpdGggb3Vyc2VsdmVzIHRvIHNlZSB3aGF0IGZlZWxzIHJpZ2h0LgotICAgIC8vCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmVzdWx0W10gPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltsaXN0LnNpemUoKV07Ci0gICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBJQ29tcG9uZW50RGlhbG9nIGdldE5ld0RpYWxvZygpCi0gIHsKLQkgIGlmIChzY2hlbWFzLmxlbmd0aCA+IDApIHsKLQkJICByZXR1cm4gbmV3IE5ld0VsZW1lbnREaWFsb2coc2NoZW1hc1swXSk7Ci0JICB9Ci0JICBlbHNlIHsKLQkJICByZXR1cm4gbmV3IE5ld0VsZW1lbnREaWFsb2coKTsKLQkgIH0KLSAgfQotCi0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gZ2V0UXVpY2tQaWNrcygpCi0gIHsKLSAgICAvLyBUT0RPIChjcykgaW1wbGVtZW50IHRoaXMgcHJvcGVybHkgLSB3ZSBzaG91bGQgYmUgcHJvdmlkaW5nIGEgbGlzdCBvZiB0aGUgCi0gICAgLy8gbW9zdCAnY29tbW9uJyBidWlsdCBpbiBzY2hlbWEgdHlwZXMgaGVyZQotICAgIC8vIEkgYmVsaWV2ZSBUcnVuZyB3aWxsIGJlIHdvcmtpbmcgb24gYSBwZXJmZXJlbmNlIHBhZ2UgdG8gZ2l2ZSB1cyB0aGlzIGxpc3QKLSAgICAvLyBmb3Igbm93IGxldCdzIGhhcmQgY29kZSBzb21lIHZhbHVlcwotICAgIC8vCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmVzdWx0W10gPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltsaXN0LnNpemUoKV07Ci0gICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLS8vVE9ETyBub3QgY2hhbmdlZCB5ZXQKLSAgcHVibGljIHZvaWQgbW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKE9iamVjdCByZWZlcmVuY2luZ09iamVjdCwgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnQpCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gY29uY3JldGVDb21wb25lbnQgPSBudWxsOwotICAgIGlmIChyZWZlcmVuY2luZ09iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXIpCi0gICAgewotICAgICAgQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpcmVmZXJlbmNpbmdPYmplY3Q7Ci0gICAgICBpZiAoYWRhcHRlci5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgY29uY3JldGVDb21wb25lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHJlZmVyZW5jaW5nT2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgY29uY3JldGVDb21wb25lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSByZWZlcmVuY2luZ09iamVjdDsKLSAgICB9Ci0gICAgaWYgKGNvbmNyZXRlQ29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgICBpZiAoY29tcG9uZW50LmlzTmV3KCkpCi0gICAgICAgIHsgIAotICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjID0gbnVsbDsKLSAgICAgICAgICBpZiAoY29tcG9uZW50LmdldE1ldGFOYW1lKCkgPT0gSVhTRFNlYXJjaENvbnN0YW50cy5FTEVNRU5UX01FVEFfTkFNRSkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIEFkZFhTREVsZW1lbnRDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkWFNERWxlbWVudENvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRUxFTUVOVCwgY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgICAgY29tbWFuZC5zZXROYW1lVG9BZGQoY29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgIGVsZW1lbnREZWMgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChlbGVtZW50RGVjICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUVsZW1lbnRSZWZlcmVuY2VDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX0VMRU1FTlRfUkVGRVJFTkNFLCBjb25jcmV0ZUNvbXBvbmVudCwgZWxlbWVudERlYyk7Ci0gICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgWFNERGlyZWN0aXZlc01hbmFnZXIucmVtb3ZlVW51c2VkWFNESW1wb3J0cyhjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgIH0gIAotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlRWxlbWVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kKGNvbmNyZXRlQ29tcG9uZW50LCBjb21wb25lbnQuZ2V0TmFtZSgpLCBjb21wb25lbnQuZ2V0UXVhbGlmaWVyKCksIGNvbXBvbmVudC5nZXRGaWxlKCkpOwotICAgICAgICAgIGNvbW1hbmQuc2V0TGFiZWwoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfRUxFTUVOVF9SRUZFUkVOQ0UpOwotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREZpbGVFZGl0b3JJbnB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREZpbGVFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmYyODNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RGaWxlRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5JQURURWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTREZpbGVFZGl0b3JJbnB1dCBleHRlbmRzIEZpbGVFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElBRFRFZGl0b3JJbnB1dAotewotICBwcml2YXRlIElGaWxlIGZpbGU7Ci0gIHByaXZhdGUgWFNEU2NoZW1hIHNjaGVtYTsKLSAgcHJpdmF0ZSBTdHJpbmcgZWRpdG9yTmFtZTsKLQotICBwdWJsaWMgWFNERmlsZUVkaXRvcklucHV0KElGaWxlIGZpbGUsIFhTRFNjaGVtYSBzY2hlbWEpIHsKLSAgICBzdXBlcihmaWxlKTsKLSAgICBpZiAoZmlsZSA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gICAgZWRpdG9yTmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotICB9Ci0KLSAgcHVibGljIElGaWxlIGdldEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGZpbGU7Ci0gIH0KLQotICBwdWJsaWMgWFNEU2NoZW1hIGdldFNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGVkaXRvck5hbWUgPSBuYW1lOwotICB9Ci0gCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICBpZiAoZWRpdG9yTmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBlZGl0b3JOYW1lOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIuZ2V0TmFtZSgpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkKLSAgewotICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbnMgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICBpZiAobnMgIT0gbnVsbCAmJiBucy5sZW5ndGgoKSA+IDApCi0gICAgICAgIHJldHVybiBNZXNzYWdlcy5fVUlfTEFCRUxfVEFSR0VUX05BTUVTUEFDRSArIG5zOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gTWVzc2FnZXMuX1VJX0xBQkVMX05PX05BTUVTUEFDRTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmdldFRvb2xUaXBUZXh0KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiN2Y0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNESHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTW9sbGVyIC0gYWRkZWQgc3VwcG9ydCBmb3IgbG9va3VwcyBvdXQgb2Ygd29ya3NwYWNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi0vKioKLSAqIFhTREh5cGVybGluayBrbm93cyBob3cgdG8gb3BlbiBsaW5rcyBmcm9tIFhTRCBmaWxlcy4KLSAqIAotICogQHNlZSBYU0RIeXBlcmxpbmtEZXRlY3RvcgotICovCi1wdWJsaWMgY2xhc3MgWFNESHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluawotewotICBwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLSAgcHJpdmF0ZSBYU0RDb25jcmV0ZUNvbXBvbmVudCBmQ29tcG9uZW50OwotCi0gIHB1YmxpYyBYU0RIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIGZSZWdpb24gPSByZWdpb247Ci0gICAgZkNvbXBvbmVudCA9IGNvbXBvbmVudDsKLSAgfQotCi0gIHB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpCi0gIHsKLSAgICByZXR1cm4gZlJlZ2lvbjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkKLSAgewotICAgIHJldHVybiBOTFMuYmluZChNZXNzYWdlcy5fVUlfSFlQRVJMSU5LX1RFWFQsIGZDb21wb25lbnQuZ2V0RWxlbWVudCgpLmdldExvY2FsTmFtZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG9wZW4oKQotICB7Ci0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IGZDb21wb25lbnQuZ2V0U2NoZW1hKCk7Ci0KLSAgICBpZiAoc2NoZW1hID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IHNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOwotCi0JSUZpbGUgc2NoZW1hRmlsZSA9IG51bGw7Ci0gICAgVVJJIHNjaGVtYVVyaSA9IG51bGw7Ci0gICAgCi0JaWYgKFVSSUhlbHBlci5pc1BsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChzY2hlbWFMb2NhdGlvbikpCi0JewotICAgICAgSVBhdGggc2NoZW1hUGF0aCA9IG5ldyBQYXRoKFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woc2NoZW1hTG9jYXRpb24pKTsKLSAgICAgIHNjaGVtYUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoc2NoZW1hUGF0aCk7Ci0gICAgICBpZiAoISBzY2hlbWFGaWxlLmV4aXN0cygpKQotICAgICAgewotICAgIAlyZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCWVsc2UKLQl7Ci0JCXRyeSB7Ci0JCQlzY2hlbWFVcmkgPSBuZXcgVVJJKHNjaGVtYUxvY2F0aW9uKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikge30KLQl9Ci0JCi0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hQYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgCi0gICAgICB3b3JrYmVuY2hQYWdlLmdldE5hdmlnYXRpb25IaXN0b3J5KCkubWFya0xvY2F0aW9uKGVkaXRvclBhcnQpOwotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgIAlpZiAoc2NoZW1hRmlsZSAhPSBudWxsKQotICAgIAl7Ci0gICAgCQllZGl0b3JQYXJ0ID0gSURFLm9wZW5FZGl0b3Iod29ya2JlbmNoUGFnZSwgc2NoZW1hRmlsZSwgdHJ1ZSk7Ci0gICAgCX0KLSAgICAJZWxzZSBpZiAoc2NoZW1hVXJpICE9IG51bGwgJiYgImZpbGUiLmVxdWFscyhzY2hlbWFVcmkuZ2V0U2NoZW1lKCkpKSAvLyROT04tTkxTLTEkCi0gICAgCXsKLSAgICAJCWVkaXRvclBhcnQgPSBJREUub3BlbkVkaXRvcih3b3JrYmVuY2hQYWdlLCBzY2hlbWFVcmksIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQsIHRydWUpOwkKLSAgICAJfQotICAgIAllbHNlCi0gICAgCXsKLSAgICAJICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBBRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dChzY2hlbWFMb2NhdGlvbik7Ci0gICAgCSAgICBlZGl0b3JQYXJ0ID0gSURFLm9wZW5FZGl0b3Iod29ya2JlbmNoUGFnZSwgaW5wdXQsIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQsIHRydWUpOwotCQl9Ci0gICAgICAgIGlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgICAgIHsKLSAgICAgICAgICAoKEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKSBlZGl0b3JQYXJ0KS5vcGVuT25HbG9iYWxSZWZlcmVuY2UoZkNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0gICAgICB7Ci0gICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIHBpZS5nZXRNZXNzYWdlKCksIHBpZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNESHlwZXJsaW5rRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTI3ZjE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC50ZXh0LlhTRE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLQotLyoqCi0gKiBEZXRlY3RzIGh5cGVybGlua3MgZm9yIFhTRCBmaWxlcy4gVXNlZCBieSB0aGUgWFNEIHRleHQgZWRpdG9yIHRvIHByb3ZpZGUgYQotICogIkdvIHRvIGRlY2xhcmF0aW9uIiBmdW5jdGlvbmFsaXR5IHNpbWlsYXIgd2l0aCB0aGUgb25lIHByb3ZpZGVkIGJ5IHRoZSBKYXZhCi0gKiBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RIeXBlcmxpbmtEZXRlY3RvciBleHRlbmRzIEJhc2VIeXBlcmxpbmtEZXRlY3RvcgotewotICAvKioKLSAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGF0dHJpYnV0ZSBpcyAibGlua2FibGUiIHRoYXQgaXMsIHRoZSBjb21wb25lbnQgaXQKLSAgICogcG9pbnRzIHRvIGNhbiBiZSB0aGUgdGFyZ2V0IG9mIGEgImdvIHRvIGRlZmluaXRpb24iIG5hdmlnYXRpb24uIERlcml2ZWQKLSAgICogY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZSB0aGUgYXR0cmlidXRlIG5hbWUuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIGxpbmthYmxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xpbmthYmxlQXR0cmlidXRlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgYm9vbGVhbiBpc0xpbmthYmxlID0gbmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKSB8fAotICAgICAgbmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlJFRkVSX0FUVFJJQlVURSkgfHwgCi0gICAgICBuYW1lLmVxdWFscyhYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSkgfHwgCi0gICAgICBuYW1lLmVxdWFscyhYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUpIHx8IAotICAgICAgbmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQUxPQ0FUSU9OX0FUVFJJQlVURSkgfHwgCi0gICAgICBuYW1lLmVxdWFscyhYU0RDb25zdGFudHMuU1VCU1RJVFVUSU9OR1JPVVBfQVRUUklCVVRFKSB8fAotICAgICAgbmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLklURU1UWVBFX0FUVFJJQlVURSkgfHwKLSAgICAgIG5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUpCi0gICAgICA7Ci0KLSAgICByZXR1cm4gaXNMaW5rYWJsZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgaHlwZXJsaW5rIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBub2RlLiBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkCi0gICAqIG92ZXJyaWRlLgotICAgKiAKLSAgICogQHBhcmFtIGRvY3VtZW50IHRoZSBzb3VyY2UgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHVuZGVyIHRoZSBjdXJzb3IuCi0gICAqIEBwYXJhbSByZWdpb24gdGhlIHRleHQgcmVnaW9uIHRvIHVzZSB0byBjcmVhdGUgdGhlIGh5cGVybGluay4KLSAgICogQHJldHVybiBhIG5ldyBJSHlwZXJsaW5rIGZvciB0aGUgbm9kZSBvciBudWxsIGlmIG9uZSBjYW5ub3QgYmUgY3JlYXRlZC4KLSAgICovCi0gIHByb3RlY3RlZCBJSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhJRG9jdW1lbnQgZG9jdW1lbnQsIElET01Ob2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGdldFhTRFNjaGVtYShkb2N1bWVudCk7Ci0KLSAgICBpZiAoeHNkU2NoZW1hID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gZ2V0VGFyZ2V0WFNEQ29tcG9uZW50KHhzZFNjaGVtYSwgbm9kZSk7Ci0KLSAgICBpZiAodGFyZ2V0Q29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgSVJlZ2lvbiBub2RlUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKG5vZGUpOwotCi0gICAgICByZXR1cm4gbmV3IFhTREh5cGVybGluayhub2RlUmVnaW9uLCB0YXJnZXRDb21wb25lbnQpOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmRzIHRoZSBYU0QgY29tcG9uZW50IGZvciB0aGUgZ2l2ZW4gbm9kZS4KLSAgICogCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEgY2Fubm90IGJlIG51bGwKLSAgICogQHBhcmFtIG5vZGUgY2Fubm90IGJlIG51bGwKLSAgICogQHJldHVybiBYU0RDb25jcmV0ZUNvbXBvbmVudAotICAgKi8KLSAgcHJpdmF0ZSBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRUYXJnZXRYU0RDb21wb25lbnQoWFNEU2NoZW1hIHhzZFNjaGVtYSwgSURPTU5vZGUgbm9kZSkKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXBvbmVudCA9IHhzZFNjaGVtYS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUpOwotCi0gICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBudWxsOwotICAgIAotICAgIGlmIChub2RlIGluc3RhbmNlb2YgQXR0cikKLSAgICB7Ci0gICAgICBBdHRyIGF0dHJpYnV0ZSA9IChBdHRyKW5vZGU7Ci0gICAgICBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlICE9IG51bGwgPyBhdHRyaWJ1dGUuZ2V0TmFtZSgpOiBudWxsOwotICAgIH0KLSAgICAKLSAgICBYU0RIeXBlcmxpbmtUYXJnZXRMb2NhdG9yIHhzZEh5cGVybGlua1RhcmdldExvY2F0b3IgPSBuZXcgWFNESHlwZXJsaW5rVGFyZ2V0TG9jYXRvcigpOwotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IHhzZEh5cGVybGlua1RhcmdldExvY2F0b3IubG9jYXRlKHhzZENvbXBvbmVudCwgYXR0cmlidXRlTmFtZSk7IAotICAgIAotICAgIHJldHVybiBjb21wb25lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgeHNkIHNjaGVtYSBmcm9tIGRvY3VtZW50Ci0gICAqIAotICAgKiBAcGFyYW0gZG9jdW1lbnQKLSAgICogQHJldHVybiBYU0RTY2hlbWEgb3IgbnVsbCBvZiBvbmUgZG9lcyBub3QgZXhpc3QgeWV0IGZvciBkb2N1bWVudAotICAgKi8KLSAgcHJpdmF0ZSBYU0RTY2hlbWEgZ2V0WFNEU2NoZW1hKElEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBudWxsOwotICAgIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLSAgICBpZiAobW9kZWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKQotICAgICAgICB7Ci0gICAgICAgICAgSURPTURvY3VtZW50IGRvbURvYyA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICBpZiAoZG9tRG9jICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNETW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IChYU0RNb2RlbEFkYXB0ZXIpIGRvbURvYy5nZXRFeGlzdGluZ0FkYXB0ZXIoWFNETW9kZWxBZGFwdGVyLmNsYXNzKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBJU1NVRTogRGlkbid0IHdhbnQgdG8gZ28gdGhyb3VnaCBpbml0aWFsaXppbmcgc2NoZW1hIGlmIGl0IGRvZXMKLSAgICAgICAgICAgICAqIG5vdCBhbHJlYWR5IGV4aXN0LCBzbyBqdXN0IGF0dGVtcHRlZCB0byBnZXQgZXhpc3RpbmcgYWRhcHRlci4gSWYKLSAgICAgICAgICAgICAqIGRvZXNuJ3QgZXhpc3QsIGp1c3QgZG9uJ3QgYm90aGVyIHdvcmtpbmcuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChtb2RlbEFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgc2NoZW1hID0gbW9kZWxBZGFwdGVyLmdldFNjaGVtYSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICBtb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNjaGVtYTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREh5cGVybGlua1RhcmdldExvY2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RIeXBlcmxpbmtUYXJnZXRMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNGFlYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREh5cGVybGlua1RhcmdldExvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVmFyaWV0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoOwotCi0vKioKLSAqIEEgY3VzdG9tIFhTRFN3aXRjaCB1c2VkIHRvIGxvY2F0ZSB0aGUgInJlZmVyZW5jZWQiIGNvbXBvbmVudC4gVXNlZCBieSB0aGUKLSAqIGh5cGVybGluay9GMyBuYXZpZ2F0aW9uIG1lY2hhbmlzbS4gTWFkZSBhIHNlcGFyYXRlIGNsYXNzIGJlY2F1c2UgaXQgaXMgdXNlZAotICogZnJvbSB0aGUgV1NETCBlZGl0b3IgYXMgd2VsbC4KLSAqLwotcHVibGljIGNsYXNzIFhTREh5cGVybGlua1RhcmdldExvY2F0b3IgZXh0ZW5kcyBYU0RTd2l0Y2gKLXsKLSAgLyoqCi0gICAqIEhvbGRzIHRoZSBhdHRyaWJ1dGUgbmFtZSBpZiB0aGUgY3Vyc29yL21vdXNlIGlzIG92ZXIgYW4gYXR0cmlidXRlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlTmFtZTsKLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFN3aXRjaCNjYXNlWFNEQXR0cmlidXRlRGVjbGFyYXRpb24ob3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlRGVjbGFyYXRpb24pCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQgPSBudWxsOwotCi0gICAgaWYgKGF0dHJpYnV0ZURlY2xhcmF0aW9uLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBhdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBhdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRUeXBlRGVmaW5pdGlvbigpOwotCi0gICAgICAvLyBBdm9pZCBuYXZpZ2F0aW5nIHRvIGJ1aWx0IGluIGRhdGEgdHlwZXMuCi0KLSAgICAgIGlmIChpc0Zyb21TY2hlbWFGb3JTY2hlbWEodGFyZ2V0KSkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0ID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRhcmdldDsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoI2Nhc2VYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24ob3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgdGFyZ2V0ID0gbnVsbDsKLQotICAgIGlmIChhdHRyaWJ1dGVHcm91cERlZmluaXRpb24uaXNBdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24uZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGFyZ2V0OwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2gjY2FzZVhTREVsZW1lbnREZWNsYXJhdGlvbihvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNERWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24pCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQgPSBudWxsOwotCi0gICAgaWYgKGVsZW1lbnREZWNsYXJhdGlvbi5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIHRhcmdldCA9IGVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgdHlwZURlZmluaXRpb24gPSBudWxsOwotCi0gICAgICBpZiAoZWxlbWVudERlY2xhcmF0aW9uLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHlwZURlZmluaXRpb24gPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgIH0KLQotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgc3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiA9IGVsZW1lbnREZWNsYXJhdGlvbi5nZXRTdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uKCk7Ci0KLSAgICAgIGlmICh0eXBlRGVmaW5pdGlvbiAhPSBudWxsICYmIHN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gVGhlcmUgYXJlIDIgdGhpbmdzIHdlIGNhbiBuYXZpZ2F0ZSB0bzogaWYgdGhlIGN1cnNvciBpcyBhbnl3aGVyZSBvbgotICAgICAgICAvLyB0aGUKLSAgICAgICAgLy8gc3Vic3RpdHV0aW9uIGF0dHJpYnV0ZSB0aGVuIGp1bXAgdG8gdGhhdCwgb3RoZXJ3aXNlIGp1c3QgZ28gdG8gdGhlCi0gICAgICAgIC8vIGJhc2UgdHlwZS4KLQotICAgICAgICBpZiAoWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURS5lcXVhbHMoYXR0cmlidXRlTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICB0YXJnZXQgPSBzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHRhcmdldCA9IHR5cGVEZWZpbml0aW9uOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRhcmdldCA9IHR5cGVEZWZpbml0aW9uICE9IG51bGwgPyB0eXBlRGVmaW5pdGlvbiA6IHN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb247Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpc0Zyb21TY2hlbWFGb3JTY2hlbWEodGFyZ2V0KSkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0ID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdGFyZ2V0OwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2gjY2FzZVhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24ob3JnLmVjbGlwc2UueHNkLlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24pCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24gaWRDb25zdHJhaW50RGVmaW5pdGlvbikKLSAgewotICAgIE9iamVjdCB0YXJnZXQgPSBudWxsOwotCi0gICAgWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiByZWZlcmVuY2VkS2V5ID0gaWRDb25zdHJhaW50RGVmaW5pdGlvbi5nZXRSZWZlcmVuY2VkS2V5KCk7Ci0KLSAgICBpZiAocmVmZXJlbmNlZEtleSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRhcmdldCA9IHJlZmVyZW5jZWRLZXk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRhcmdldDsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoI2Nhc2VYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHRhcmdldCA9IG51bGw7Ci0KLSAgICBpZiAobW9kZWxHcm91cERlZmluaXRpb24uaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIHRhcmdldCA9IG1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGFyZ2V0OwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2gjY2FzZVhTRFNjaGVtYURpcmVjdGl2ZShvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEU2NoZW1hRGlyZWN0aXZlKFhTRFNjaGVtYURpcmVjdGl2ZSBkaXJlY3RpdmUpCi0gIHsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gZGlyZWN0aXZlLmdldFJlc29sdmVkU2NoZW1hKCk7Ci0KLSAgICByZXR1cm4gc2NoZW1hOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24pCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQgPSBudWxsOwotCi0gICAgLy8gU2ltcGxlIHR5cGVzIGNhbiBiZSBvbmUgb2Y6IGF0b21pYywgbGlzdCBvciB1bmlvbi4KLQotICAgIFhTRFZhcmlldHkgdmFyaWV0eSA9IHR5cGVEZWZpbml0aW9uLmdldFZhcmlldHkoKTsKLSAgICBpbnQgdmFyaWV0eVR5cGUgPSB2YXJpZXR5LmdldFZhbHVlKCk7Ci0KLSAgICBzd2l0Y2ggKHZhcmlldHlUeXBlKQotICAgIHsKLSAgICAgIGNhc2UgWFNEVmFyaWV0eS5BVE9NSUM6Ci0gICAgICAgIHsKLSAgICAgICAgICB0YXJnZXQgPSB0eXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWFNEVmFyaWV0eS5MSVNUOgotICAgICAgICB7Ci0gICAgICAgICAgdGFyZ2V0ID0gdHlwZURlZmluaXRpb24uZ2V0SXRlbVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhTRFZhcmlldHkuVU5JT046Ci0gICAgICAgIHsKLSAgICAgICAgICBMaXN0IG1lbWJlclR5cGVzID0gdHlwZURlZmluaXRpb24uZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCk7Ci0gICAgICAgICAgaWYgKG1lbWJlclR5cGVzICE9IG51bGwgJiYgbWVtYmVyVHlwZXMuc2l6ZSgpID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJU1NVRTogV2hhdCBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSB0eXBlPwotICAgICAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSBhIGNhc2UgZm9yIG11bHRpcGxlIGh5cGVybGlua3MgYXQgdGhlIHNhbWUKLSAgICAgICAgICAgIC8vIGxvY2F0aW9uLgotICAgICAgICAgICAgdGFyZ2V0ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSBtZW1iZXJUeXBlcy5nZXQoMCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIEF2b2lkIG5hdmlnYXRpbmcgdG8gYnVpbHQgaW4gZGF0YSB0eXBlcy4KLQotICAgIGlmIChpc0Zyb21TY2hlbWFGb3JTY2hlbWEodGFyZ2V0KSkKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBudWxsOwotICAgIH0KLQotICAgIHJldHVybiB0YXJnZXQ7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFN3aXRjaCNjYXNlWFNEVHlwZURlZmluaXRpb24ob3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEVHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24pCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQgPSBudWxsOwotCi0gICAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGUgPSB0eXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZSgpOwotCi0gICAgaWYgKGJhc2VUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgdGFyZ2V0ID0gYmFzZVR5cGU7Ci0gICAgfQotCi0gICAgLy8gQXZvaWQgbmF2aWdhdGluZyB0byBidWlsdCBpbiBkYXRhIHR5cGVzLgotCi0gICAgaWYgKGlzRnJvbVNjaGVtYUZvclNjaGVtYSh0YXJnZXQpKQotICAgIHsKLSAgICAgIHRhcmdldCA9IG51bGw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRhcmdldDsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlY3RzIGlmIGEgZ2l2ZW4gc2NoZW1hIGNvbXBvbmVudCBpcyBmcm9tIHRoZSBzY2hlbWEgZm9yIHNjaGVtYSAoYnVpbHQgaW4KLSAgICogZGF0YSB0eXBlcykuIFVzZWQgdG8gYXZvaWQgbmF2aWdhdGluZyB0byB0aGlzIHR5cGUgb2YgY29tcG9uZW50cyBhcyB0aGV5Ci0gICAqIGRvbid0IGhhdmUgYW4gYWNjZXNzaWJsZSBwaHlzaWNhbCBsb2NhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBjb21wb25lbnQgdGhlIGNvbXBvbmVudCB0byBjaGVjay4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21wb25lbnQgaXMgZnJvbSB0aGUgc2NoZW1hIGZvciBzY2hlbWEgbmFtZXNwYWNlLAotICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRnJvbVNjaGVtYUZvclNjaGVtYShYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBpZiAoY29tcG9uZW50ID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBjb21wb25lbnQuZ2V0U2NoZW1hKCk7Ci0KLSAgICBpZiAoc2NoZW1hICE9IG51bGwgJiYgc2NoZW1hLmVxdWFscyhzY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hKCkpKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBMb2NhdGVzIHRoZSB0YXJnZXQgY29tcG9uZW50IC0gZm9yIGV4YW1wbGUgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gcG9pbnRlZAotICAgKiB0byBieSBhbiBlbGVtZW50IHJlZmVyZW5jZSwgZXRjLgotICAgKiAKLSAgICogQHBhcmFtIGNvbXBvbmVudCB0aGUgY3VycmVudCBjb21wb25lbnQuCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZSBpZiB0aGUgY3Vyc29yL21vdXNlIGlzIG92ZXIgYW4KLSAgICogICAgICAgIGF0dHJpYnV0ZS4gVGhpcyBpcyB1c2VkIHRvIHByb3ZpZGUgZmluZSBncmFpbmVkIG5hdmlnYXRpb24gZm9yCi0gICAqICAgICAgICBjb21wb25lbnRzIHdpdGggbW9yZSB0aGFuIG9uZSAiYWN0aXZlIiBhdHRyaWJ1dGUuCi0gICAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZWQgWFNEIGNvbmNyZXRlIGNvbXBvbmVudCBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQuCi0gICAqLwotICBwdWJsaWMgWFNEQ29uY3JldGVDb21wb25lbnQgbG9jYXRlKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lOwotCi0gICAgcmV0dXJuIChYU0RDb25jcmV0ZUNvbXBvbmVudCkgZG9Td2l0Y2goY29tcG9uZW50KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRE11bHRpUGFnZUVkaXRvckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNETXVsdGlQYWdlRWRpdG9yQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ2MmFmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNETXVsdGlQYWdlRWRpdG9yQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuWm9vbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuR0VGQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuWm9vbUluUmV0YXJnZXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuWm9vbU91dFJldGFyZ2V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5SZXRhcmdldEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLklYU0RUb29sYmFyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQ2FwdHVyZVNjcmVlbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBpbnN0YWxsYXRpb24vZGVpbnN0YWxsYXRpb24gb2YgZ2xvYmFsIGFjdGlvbnMgZm9yIG11bHRpLXBhZ2UKLSAqIGVkaXRvcnMuIFJlc3BvbnNpYmxlIGZvciB0aGUgcmVkaXJlY3Rpb24gb2YgZ2xvYmFsIGFjdGlvbnMgdG8gdGhlIGFjdGl2ZQotICogZWRpdG9yLiBNdWx0aS1wYWdlIGNvbnRyaWJ1dG9yIHJlcGxhY2VzIHRoZSBjb250cmlidXRvcnMgZm9yIHRoZSBpbmRpdmlkdWFsCi0gKiBlZGl0b3JzIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLSAqLwotcHVibGljIGNsYXNzIFhTRE11bHRpUGFnZUVkaXRvckNvbnRyaWJ1dG9yIGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IKLXsKLSAgcHJpdmF0ZSBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3JQYXJ0OwotICBwcml2YXRlIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIHhzZEVkaXRvcjsKLSAgcHJvdGVjdGVkIElUZXh0RWRpdG9yIHRleHRFZGl0b3I7Ci0gIHByb3RlY3RlZCBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3Igc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgPSBudWxsOwotICBwcm90ZWN0ZWQgTGlzdCBmUGFydExpc3RlbmVycz0gbmV3IEFycmF5TGlzdCgpOwotICBab29tSW5SZXRhcmdldEFjdGlvbiB6b29tSW5SZXRhcmdldEFjdGlvbjsKLSAgWm9vbU91dFJldGFyZ2V0QWN0aW9uIHpvb21PdXRSZXRhcmdldEFjdGlvbjsKLSAgQWN0aW9uIGNhcHR1cmVTY3JlZW5BY3Rpb247Ci0gIFpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW0gem9vbUNvbWJvQ29udHJpYnV0aW9uSXRlbTsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBtdWx0aS1wYWdlIGNvbnRyaWJ1dG9yLgotICAgKi8KLSAgcHVibGljIFhTRE11bHRpUGFnZUVkaXRvckNvbnRyaWJ1dG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgPSBuZXcgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yKCk7Ci0gICAgem9vbUluUmV0YXJnZXRBY3Rpb24gPSBuZXcgWm9vbUluUmV0YXJnZXRBY3Rpb24oKTsKLSAgICB6b29tSW5SZXRhcmdldEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZXRvb2wxNi96b29tcGx1cy5naWYiKSk7Ci0gICAgem9vbU91dFJldGFyZ2V0QWN0aW9uID0gbmV3IFpvb21PdXRSZXRhcmdldEFjdGlvbigpOwotICAgIHpvb21PdXRSZXRhcmdldEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZXRvb2wxNi96b29tbWludXMuZ2lmIikpOwotICAgIGNhcHR1cmVTY3JlZW5BY3Rpb24gPSBuZXcgQ2FwdHVyZVNjcmVlbkFjdGlvbigpOwotICAgIGZQYXJ0TGlzdGVuZXJzLmFkZCh6b29tSW5SZXRhcmdldEFjdGlvbik7Ci0gICAgZlBhcnRMaXN0ZW5lcnMuYWRkKHpvb21PdXRSZXRhcmdldEFjdGlvbik7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgYWN0aW9uIHJlZ2lzdGVkIHdpdGggdGhlIGdpdmVuIHRleHQgZWRpdG9yLgotICAgKiAKLSAgICogQHJldHVybiBJQWN0aW9uIG9yIG51bGwgaWYgZWRpdG9yIGlzIG51bGwuCi0gICAqLwotICBwcm90ZWN0ZWQgSUFjdGlvbiBnZXRBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBTdHJpbmcgYWN0aW9uSUQpCi0gIHsKLSAgICByZXR1cm4gKGVkaXRvciA9PSBudWxsID8gbnVsbCA6IGVkaXRvci5nZXRBY3Rpb24oYWN0aW9uSUQpKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YURvYykgTWV0aG9kIGRlY2xhcmVkIGluCi0gICAqIEFic3RyYWN0TXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuCi0gICAqLwotCi0gIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgcGFydCkKLSAgewotICAgIGlmIChhY3RpdmVFZGl0b3JQYXJ0ID09IHBhcnQpCi0gICAgICByZXR1cm47Ci0KLSAgICBhY3RpdmVFZGl0b3JQYXJ0ID0gcGFydDsKLQotICAgIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRBY3Rpb25CYXJzKCk7Ci0gICAgYm9vbGVhbiBpc1NvdXJjZSA9IGZhbHNlOwotICAgIAotICAgIGlmIChhY3RpdmVFZGl0b3JQYXJ0ICE9IG51bGwgJiYgYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotICAgIHsKLSAgICAgIGlzU291cmNlID0gdHJ1ZTsKLSAgICAgIHpvb21JblJldGFyZ2V0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgem9vbU91dFJldGFyZ2V0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgY2FwdHVyZVNjcmVlbkFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIGFjdGl2YXRlU291cmNlUGFnZShhY3RpdmVFZGl0b3JQYXJ0LCB0cnVlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGFjdGl2YXRlU291cmNlUGFnZSh4c2RFZGl0b3IsIGZhbHNlKTsKLSAgICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgICB7Ci0gICAgICAgIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgcGFydDsKLSAgICAgIH0KLSAgICAgIGlmICh4c2RFZGl0b3IgIT0gbnVsbCkKLSAgICAgIHsgICAgCSAgCi0gICAgICAgIC8vIGNzOiBoZXJlJ3Mgd2UgZW5zdXJlIHRoZSBVTkRPIGFuZCBSRURPIGFjdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIAotICAgICAgICAvLyB0aGUgZGVzaWduIHZpZXcgaXMgYWN0aXZlCi0gICAgICAgIElXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlID0geHNkRWRpdG9yLmdldFNpdGUoKTsKLSAgICAgICAgaWYgKHNpdGUgaW5zdGFuY2VvZiBJRWRpdG9yU2l0ZSkgCi0gICAgICAgIHsKLSAgICAgICAgICBJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0geHNkRWRpdG9yLmdldFRleHRFZGl0b3IoKTsKLSAgICAgICAgICBJQWN0aW9uQmFycyBzaXRlQWN0aW9uQmFycyA9ICgoSUVkaXRvclNpdGUpIHNpdGUpLmdldEFjdGlvbkJhcnMoKTsKLSAgICAgICAgICBzaXRlQWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8sIGdldEFjdGlvbih0ZXh0RWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRPKSk7Ci0gICAgICAgICAgc2l0ZUFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5SRURPLCBnZXRBY3Rpb24odGV4dEVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVETykpOwotICAgICAgICAgIHNpdGVBY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsgICAgCQkJCQkKLSAgICAgICAgfQotCQkJCi0gICAgICAgIE9iamVjdCBhZGFwdGVyID0geHNkRWRpdG9yLmdldEFkYXB0ZXIoQWN0aW9uUmVnaXN0cnkuY2xhc3MpOwotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEFjdGlvblJlZ2lzdHJ5KQotICAgICAgICB7Ci0gICAgICAgICAgQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSAoQWN0aW9uUmVnaXN0cnkpIGFkYXB0ZXI7Ci0gICAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksIHJlZ2lzdHJ5LmdldEFjdGlvbihEZWxldGVBY3Rpb24uSUQpKTsKLSAgICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoR0VGQWN0aW9uQ29uc3RhbnRzLlpPT01fSU4sIHJlZ2lzdHJ5LmdldEFjdGlvbihHRUZBY3Rpb25Db25zdGFudHMuWk9PTV9JTikpOwotICAgICAgICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihHRUZBY3Rpb25Db25zdGFudHMuWk9PTV9PVVQsIHJlZ2lzdHJ5LmdldEFjdGlvbihHRUZBY3Rpb25Db25zdGFudHMuWk9PTV9PVVQpKTsKLSAgICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QUklOVC5nZXRJZCgpLCByZWdpc3RyeS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5QUklOVC5nZXRJZCgpKSk7Ci0gICAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpLCByZWdpc3RyeS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5TRUxFQ1RfQUxMLmdldElkKCkpKTsKLSAgICAgICAgICB6b29tSW5SZXRhcmdldEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIHpvb21PdXRSZXRhcmdldEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIGNhcHR1cmVTY3JlZW5BY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLSAgICAgIC8vIHVwZGF0ZSBtZW51IGJhciBhbmQgdG9vbCBiYXIKLSAgICAgIGFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotICAgIH0KLSAgICAKLSAgICBpZiAoem9vbUNvbWJvQ29udHJpYnV0aW9uSXRlbSAhPSBudWxsKQotICAgIHsKLSAgICAgIHpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW0uc2V0VmlzaWJsZSghaXNTb3VyY2UpOwotICAgICAgem9vbUNvbWJvQ29udHJpYnV0aW9uSXRlbS51cGRhdGUoKTsKLSAgICAgIC8vIEJ1ZyAyNTQ3NzIgLSBwYXJlbnQgY29udHJpYnV0aW9uIG1hbmFnZXIgc2hvdWxkIG5vdCBiZSBudWxsLiAgV2UgYWRkZWQgdGhpcyBpdGVtIGFscmVhZHkuCi0gICAgICAvLyBGb3JjZSB0aGUgVG9vbEJhck1hbmFnZXIgdG8gdXBkYXRlL3JlZHJhdyB0aGUgaXRlbXMKLSAgICAgIHpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW0uZ2V0UGFyZW50KCkudXBkYXRlKHRydWUpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVTb3VyY2VQYWdlKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvciwgYm9vbGVhbiBzdGF0ZSkKLSAgewotICAgIGlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsICYmIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKQotICAgIHsKLSAgICAgIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotICAgICAgKChJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKS5zZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKHN0YXRlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkKLSAgewotICAgIElFZGl0b3JQYXJ0IGFjdGl2ZU5lc3RlZEVkaXRvciA9IG51bGw7Ci0gICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBNdWx0aVBhZ2VFZGl0b3JQYXJ0KQotICAgIHsKLSAgICAgIGFjdGl2ZU5lc3RlZEVkaXRvciA9IHBhcnQ7Ci0gICAgfQotICAgIHNldEFjdGl2ZVBhZ2UoYWN0aXZlTmVzdGVkRWRpdG9yKTsKLSAgICAKLSAgICBpZiAocGFydCBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKQotICAgIHsKLSAgICAgIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgcGFydDsKLQotICAgICAgdGV4dEVkaXRvciA9IHhzZEVkaXRvci5nZXRUZXh0RWRpdG9yKCk7Ci0gICAgICBpZiAodGV4dEVkaXRvciAhPSBudWxsKQotICAgICAgeyAgICAgIAotLy8gICAgICAgIHVwZGF0ZUFjdGlvbnMoKTsgIAotICAgICAgICBnZXRBY3Rpb25CYXJzKCkudXBkYXRlQWN0aW9uQmFycygpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBMaXN0IGxpc3QgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0WFNERWRpdG9yQ29uZmlndXJhdGlvbigpLmdldFRvb2xiYXJBY3Rpb25zKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgICgoSVhTRFRvb2xiYXJBY3Rpb24paS5uZXh0KCkpLnNldEVkaXRvclBhcnQoYWN0aXZlTmVzdGVkRWRpdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHBhcnQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWFuYWdlcikKLSAgewotICAgIElNZW51TWFuYWdlciBtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKE1lc3NhZ2VzLl9VSV9NRU5VX1hTRF9FRElUT1IpOwotICAgIG1hbmFnZXIucHJlcGVuZFRvR3JvdXAoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIG1lbnUpOwotCi0gICAgLy8gQWRkIGV4dGVuc2lvbiBtZW51IGFjdGlvbnMKLSAgICBMaXN0IGxpc3QgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0WFNERWRpdG9yQ29uZmlndXJhdGlvbigpLmdldFRvb2xiYXJBY3Rpb25zKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIG1lbnUuYWRkKChJWFNEVG9vbGJhckFjdGlvbilpLm5leHQoKSk7Ci0gICAgfQotCi0gICAgbWVudS5hZGQoem9vbUluUmV0YXJnZXRBY3Rpb24pOwotICAgIG1lbnUuYWRkKHpvb21PdXRSZXRhcmdldEFjdGlvbik7Ci0gICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotICAgIG1lbnUuYWRkKGNhcHR1cmVTY3JlZW5BY3Rpb24pOwotCi0gICAgbWVudS51cGRhdGVBbGwodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciBtYW5hZ2VyKQotICB7Ci0gICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAvLyBBZGQgZXh0ZW5zaW9uIHRvb2xiYXIgYWN0aW9ucwotICAgIExpc3QgbGlzdCA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRYU0RFZGl0b3JDb25maWd1cmF0aW9uKCkuZ2V0VG9vbGJhckFjdGlvbnMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgbWFuYWdlci5hZGQoKElYU0RUb29sYmFyQWN0aW9uKWkubmV4dCgpKTsKLSAgICB9Ci0KLSAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgIFN0cmluZ1tdIHpvb21TdHJpbmdzID0gbmV3IFN0cmluZ1tdIHsgWm9vbU1hbmFnZXIuRklUX0FMTCwgWm9vbU1hbmFnZXIuRklUX0hFSUdIVCwgWm9vbU1hbmFnZXIuRklUX1dJRFRIIH07Ci0gICAgem9vbUNvbWJvQ29udHJpYnV0aW9uSXRlbSA9IG5ldyBab29tQ29tYm9Db250cmlidXRpb25JdGVtKGdldFBhZ2UoKSwgem9vbVN0cmluZ3MpOwotICAgIG1hbmFnZXIuYWRkKHpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW0pOwotICAgIG1hbmFnZXIuYWRkKGNhcHR1cmVTY3JlZW5BY3Rpb24pOwotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBiYXJzLCBJV29ya2JlbmNoUGFnZSBwYWdlKQotICB7Ci0gICAgSXRlcmF0b3IgZSA9IGZQYXJ0TGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGUuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIHBhZ2UuYWRkUGFydExpc3RlbmVyKChSZXRhcmdldEFjdGlvbikgZS5uZXh0KCkpOwotICAgIH0KLSAgICAKLSAgICBpbml0U291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IoYmFycyk7Ci0gICAgCi0gICAgc3VwZXIuaW5pdChiYXJzLCBwYWdlKTsKLSAgfQotCi0gIAotICBwcm90ZWN0ZWQgdm9pZCBpbml0U291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotICAgIGlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKQotICAgICAgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IuaW5pdChhY3Rpb25CYXJzLCBnZXRQYWdlKCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGZQYXJ0TGlzdGVuZXJzID0gbnVsbDsKLSAgICBpZiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCkKLSAgICAgIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLmRpc3Bvc2UoKTsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRFNlbGVjdGlvbk1hcHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRFNlbGVjdGlvbk1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTI3NTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RTZWxlY3Rpb25NYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgWFNEU2VsZWN0aW9uTWFwcGVyIGltcGxlbWVudHMgSVNlbGVjdGlvbk1hcHBlcgotewotICBwdWJsaWMgSVNlbGVjdGlvbiBtYXBTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsgIAotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKCgoQWRhcHRlcilvKS5nZXRUYXJnZXQoKSk7Ci0gICAgICAgIH0gIAotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChvKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGxpc3QpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEU3Vic3RpdHV0aW9uR3JvdXBFZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRFN1YnN0aXR1dGlvbkdyb3VwRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmMjUwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEU3Vic3RpdHV0aW9uR3JvdXBFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNERWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guSVhTRFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFhTRFN1YnN0aXR1dGlvbkdyb3VwRWRpdE1hbmFnZXIgZXh0ZW5kcyBYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIKLXsKLQotICBwdWJsaWMgWFNEU3Vic3RpdHV0aW9uR3JvdXBFZGl0TWFuYWdlcihJRmlsZSBjdXJyZW50RmlsZSwgWFNEU2NoZW1hW10gc2NoZW1hcykKLSAgewotICAgIHN1cGVyKGN1cnJlbnRGaWxlLCBzY2hlbWFzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShPYmplY3QgcmVmZXJlbmNpbmdPYmplY3QsIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50KQotICB7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGNvbmNyZXRlQ29tcG9uZW50ID0gbnVsbDsKLSAgICBpZiAocmVmZXJlbmNpbmdPYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgIHsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKXJlZmVyZW5jaW5nT2JqZWN0OwotICAgICAgaWYgKGFkYXB0ZXIuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilhZGFwdGVyLmdldFRhcmdldCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChyZWZlcmVuY2luZ09iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgcmVmZXJlbmNpbmdPYmplY3Q7Ci0gICAgfQotICAgIGlmIChjb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgICAgaWYgKGNvbXBvbmVudC5pc05ldygpKQotICAgICAgICB7ICAKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlYyA9IG51bGw7Ci0gICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRNZXRhTmFtZSgpID09IElYU0RTZWFyY2hDb25zdGFudHMuRUxFTUVOVF9NRVRBX05BTUUpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICBBZGRYU0RFbGVtZW50Q29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTREVsZW1lbnRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VMRU1FTlQsIGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICAgIGNvbW1hbmQuc2V0TmFtZVRvQWRkKGNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgICAgICBlbGVtZW50RGVjID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZWxlbWVudERlYyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoY29uY3JldGVDb21wb25lbnQuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuU1VCU1RJVFVUSU9OR1JPVVBfQVRUUklCVVRFLCBlbGVtZW50RGVjLmdldFFOYW1lKGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfU1VCU1RJVFVUSU9OX0dST1VQKTsKLSAgICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgIH0gIAotICAgICAgICB9ICAKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChjb25jcmV0ZUNvbXBvbmVudC5nZXRFbGVtZW50KCksIFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUsICgoWFNERWxlbWVudERlY2xhcmF0aW9uKWNvbXBvbmVudC5nZXRPYmplY3QoKSkuZ2V0UU5hbWUoY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9TVUJTVElUVVRJT05fR1JPVVApOwotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIFhTRERpcmVjdGl2ZXNNYW5hZ2VyLnJlbW92ZVVudXNlZFhTREltcG9ydHMoY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDM1OTE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBFdWdlbmUgT3N0cm91a2hvdiwgZXVnZW5lQGdlbnVpdGVjLmNvbSAtIFsyMDMyOTFdIFhTRCBFZGl0b3IgU291cmNlIFN0YXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgdXBkYXRlZCBpbiBPdXRsaW5lL0dyYXBoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQXR0cmlidXRlVXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFBhcnRpY2xlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudGV4dC5YU0RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgZXh0ZW5kcyBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBpbXBsZW1lbnRzIElBRFRPYmplY3RMaXN0ZW5lcgotewotICBYU0RCYXNlQWRhcHRlciBvbGRTZWxlY3Rpb247Ci0gIFhTRE1vZGVsQWRhcHRlciB4c2RNb2RlbEFkYXB0ZXI7Ci0gIHB1YmxpYyBYU0RUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZShJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKQotICB7Ci0gICAgc3VwZXIodGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcik7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCi0gICAgICBPYmplY3Qgc2VsZWN0ZWQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgICAgewotICAgICAgICBYU0RCYXNlQWRhcHRlciBhZGFwdGVyID0gKFhTREJhc2VBZGFwdGVyKXNlbGVjdGVkOwotICAgICAgICBpZiAob2xkU2VsZWN0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBvbGRTZWxlY3Rpb24udW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgIGlmIChvbGRTZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikoKFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpb2xkU2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICAgICAgICAgIGlmIChlbGVtLmdldENvbnRhaW5lcigpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcCA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZWxlbS5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgICAgIGlmIChhZGFwIGluc3RhbmNlb2YgWFNEUGFydGljbGVBZGFwdGVyKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWFNEUGFydGljbGVBZGFwdGVyIHBhcnRpY2xlQWRhcHRlciA9IChYU0RQYXJ0aWNsZUFkYXB0ZXIpYWRhcDsKLSAgICAgICAgICAgICAgICBwYXJ0aWNsZUFkYXB0ZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZWxlbS5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIHJlc29sdmVkRWxlbWVudEFkYXB0ZXIgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcilYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGVsZW0uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0gICAgICAgICAgICAgIHJlc29sdmVkRWxlbWVudEFkYXB0ZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbSA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pKChYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKWFkYXB0ZXIpLmdldFRhcmdldCgpOwotICAgICAgICAgIEFkYXB0ZXIgYWRhcCA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZWxlbS5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgaWYgKGFkYXAgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZUFkYXB0ZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEUGFydGljbGVBZGFwdGVyIHBhcnRpY2xlQWRhcHRlciA9IChYU0RQYXJ0aWNsZUFkYXB0ZXIpYWRhcDsKLSAgICAgICAgICAgIHBhcnRpY2xlQWRhcHRlci5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZWxlbS5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgcmVzb2x2ZWRFbGVtZW50QWRhcHRlciA9IChYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKVhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZWxlbS5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICAgICAgICAgIHJlc29sdmVkRWxlbWVudEFkYXB0ZXIucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyIGF0dHJpYnV0ZVVzZSA9IChYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyKSBhZGFwdGVyOwotICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZSB4c2RBdHRyVXNlID0gKFhTREF0dHJpYnV0ZVVzZSkgYXR0cmlidXRlVXNlLmdldFRhcmdldCgpOwotICAgICAgICAgIGFkYXB0ZXIgPSAoWFNEQmFzZUFkYXB0ZXIpIFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoeHNkQXR0clVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICBhZGFwdGVyLnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIG9sZFNlbGVjdGlvbiA9IGFkYXB0ZXI7Ci0gICAgICAgIE9iamVjdCBtb2RlbCA9IGFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0KLSAgICAgICAgaWYgKHhzZE1vZGVsQWRhcHRlciAhPSBudWxsICYmIHhzZE1vZGVsQWRhcHRlci5nZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgeHNkTW9kZWxBZGFwdGVyLmdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpLnJlbW92ZUxpc3RlbmVyKGludGVybmFsTm9kZUFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KWFkYXB0ZXIuZ2V0VGFyZ2V0KCkpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgIHhzZE1vZGVsQWRhcHRlciA9IFhTRE1vZGVsQWRhcHRlci5sb29rdXBPckNyZWF0ZU1vZGVsQWRhcHRlcihlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHhzZE1vZGVsQWRhcHRlciAhPSBudWxsICYmIHhzZE1vZGVsQWRhcHRlci5nZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgeHNkTW9kZWxBZGFwdGVyLmdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpLmFkZExpc3RlbmVyKGludGVybmFsTm9kZUFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vZGVsKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHBhcnQsIHNlbGVjdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHN1cGVyLnNlbGVjdGlvbkNoYW5nZWQocGFydCwgc2VsZWN0aW9uKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIGlmIChnZXRDdXJyZW50VGFiKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZWZyZXNoKCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmICh4c2RNb2RlbEFkYXB0ZXIgIT0gbnVsbCAmJiB4c2RNb2RlbEFkYXB0ZXIuZ2V0TW9kZWxSZWNvbmNpbGVBZGFwdGVyKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB4c2RNb2RlbEFkYXB0ZXIuZ2V0TW9kZWxSZWNvbmNpbGVBZGFwdGVyKCkucmVtb3ZlTGlzdGVuZXIoaW50ZXJuYWxOb2RlQWRhcHRlcik7Ci0gICAgICB4c2RNb2RlbEFkYXB0ZXIgPSBudWxsOwotICAgIH0KLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGludGVybmFsTm9kZUFkYXB0ZXIgPSBuZXcgSW50ZXJuYWxOb2RlQWRhcHRlcigpOwotICBjbGFzcyBJbnRlcm5hbE5vZGVBZGFwdGVyIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyCi0gIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpCi0gICAgewotICAgICAgcmVmcmVzaCgpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTFlMTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlVHlwZVJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZVR5cGVSZWZlcmVuY2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLk5ld1R5cGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoLlhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFCdWlsZGluZ1Rvb2xzOwotCi1wdWJsaWMgY2xhc3MgWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyIGltcGxlbWVudHMgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIsIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyMgoteyAgCi0gIHByb3RlY3RlZCBJRmlsZSBjdXJyZW50RmlsZTsKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYVtdIHNjaGVtYXM7Ci0gIHByaXZhdGUgc3RhdGljIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmVzdWx0W107Ci0gIHByaXZhdGUgSUFEVE9iamVjdCByZWZlcmVuY2VyOwotICAKLSAgcHVibGljIFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlcihJRmlsZSBjdXJyZW50RmlsZSwgWFNEU2NoZW1hW10gc2NoZW1hcykKLSAgewotICAgIHRoaXMuY3VycmVudEZpbGUgPSBjdXJyZW50RmlsZTsKLSAgICB0aGlzLnNjaGVtYXMgPSBzY2hlbWFzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBhZGRUb0hpc3RvcnkoQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnQpCi0gIHsKLSAgICAvLyBUT0RPIChjcykgaW1wbGVtZW50IG1lISAgICAKLSAgfQotICAKLSAgcHVibGljIElBRFRPYmplY3QgZ2V0UmVmZXJlbmNlcigpCi0gIHsKLSAgICByZXR1cm4gcmVmZXJlbmNlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlcihJQURUT2JqZWN0IHJlZmVyZW5jZXIpCi0gIHsKLSAgICB0aGlzLnJlZmVyZW5jZXIgPSByZWZlcmVuY2VyOwotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnREaWFsb2cgZ2V0QnJvd3NlRGlhbG9nKCkKLSAgewotICAgIC8vWFNEU2V0RXhpc3RpbmdUeXBlRGlhbG9nIGRpYWxvZyA9IG5ldyBYU0RTZXRFeGlzdGluZ1R5cGVEaWFsb2coY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICAgIC8vcmV0dXJuIGRpYWxvZzsKLSAgICBYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUgZGlhbG9nRGVsZWdhdGUgPSBuZXcgWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlKFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZS5UWVBFX01FVEFfTkFNRSwgY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICAgIHJldHVybiBkaWFsb2dEZWxlZ2F0ZTsKLSAgfQotCi0gIHB1YmxpYyBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBnZXRDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gZ2V0SGlzdG9yeSgpCi0gIHsKLSAgICAvLyBUT0RPIChjcykgaW1wbGVtZW50IHRoaXMgcHJvcGVybHkgLSBzaG91bGQgdGhpcyBoaXN0b3J5IGJlIGdsb2JhbCBvciBsb2NhbCB0byBlYWNoIGVkaXRvcj8KLSAgICAvLyBUaGlzIGlzIHNvbWV0aGluZyB3ZSBzaG91bGQgcGxheSBhcm91bmQgd2l0aCBvdXJzZWx2ZXMgdG8gc2VlIHdoYXQgZmVlbHMgcmlnaHQuCi0gICAgLy8KLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZXN1bHRbXSA9IG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnREaWFsb2cgZ2V0TmV3RGlhbG9nKCkKLSAgewotICAgIE5ld1R5cGVEaWFsb2cgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoc2NoZW1hcy5sZW5ndGggPiAwKSAKLSAgICB7Ci0gICAgICByZXN1bHQgPSBuZXcgTmV3VHlwZURpYWxvZyhzY2hlbWFzWzBdKTsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICByZXN1bHQgPSBuZXcgTmV3VHlwZURpYWxvZygpOwotICAgIH0KLSAgICBpZiAocmVmZXJlbmNlciBpbnN0YW5jZW9mIElGaWVsZCkKLSAgICB7Ci0gICAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKXJlZmVyZW5jZXI7Ci0gICAgICBpZiAoWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRy5lcXVhbHMoZmllbGQuZ2V0S2luZCgpKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFsbG93Q29tcGxleFR5cGUoZmFsc2UpOwotICAgICAgfQotICAgICAgU3RyaW5nIGZpZWxkTmFtZSA9IGZpZWxkLmdldE5hbWUoKTsKLSAgICAgIGlmIChmaWVsZE5hbWUgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBmaWVsZE5hbWUgPSBmaWVsZE5hbWUudHJpbSgpOwotICAgICAgICBpZiAoZmllbGROYW1lLmxlbmd0aCgpID4gMCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgcmVzdWx0LnNldERlZmF1bHROYW1lKE5MUy5iaW5kKE1lc3NhZ2VzLl9VSV9WQUxVRV9ORVdfVFlQRSwgZmllbGROYW1lKSk7Ci0gICAgICAgIH0gIAotICAgICAgfSAgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGdldFF1aWNrUGlja3MoKQotICB7Ci0gICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgIC8vIFRPRE8gKGNzKSBpbXBsZW1lbnQgdGhpcyBwcm9wZXJseSAtIHdlIHNob3VsZCBiZSBwcm92aWRpbmcgYSBsaXN0IG9mIHRoZSAKLSAgICAvLyBtb3N0ICdjb21tb24nIGJ1aWx0IGluIHNjaGVtYSB0eXBlcyBoZXJlCi0gICAgLy8gSSBiZWxpZXZlIFRydW5nIHdpbGwgYmUgd29ya2luZyBvbiBhIHBlcmZlcmVuY2UgcGFnZSB0byBnaXZlIHVzIHRoaXMgbGlzdAotICAgIC8vIGZvciBub3cgbGV0J3MgaGFyZCBjb2RlIHNvbWUgdmFsdWVzCi0gICAgLy8KLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQobmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24oWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAiYm9vbGVhbiIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJAotICAgIGxpc3QuYWRkKG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgImRhdGUiLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBsaXN0LmFkZChuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJkYXRlVGltZSIsIG51bGwpKTsgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBsaXN0LmFkZChuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJkb3VibGUiLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBsaXN0LmFkZChuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJmbG9hdCIsIG51bGwpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICBsaXN0LmFkZChuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJoZXhCaW5hcnkiLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBsaXN0LmFkZChuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJpbnQiLCBudWxsKSk7ICAgICAvLyROT04tTkxTLTEkCi0gICAgbGlzdC5hZGQobmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24oWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAic3RyaW5nIiwgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0gICAgbGlzdC5hZGQobmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24oWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAidGltZSIsIG51bGwpKTsgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICByZXN1bHQgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltsaXN0LnNpemUoKV07Ci0gICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLQotICBwdWJsaWMgdm9pZCBtb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoT2JqZWN0IHJlZmVyZW5jaW5nT2JqZWN0LCBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudCkKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gbnVsbDsKLSAgICBpZiAocmVmZXJlbmNpbmdPYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgIHsKLSAgICAgIEFkYXB0ZXIgYWRwYXRlciA9IChBZGFwdGVyKXJlZmVyZW5jaW5nT2JqZWN0OwotICAgICAgaWYgKGFkcGF0ZXIuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgY29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpYWRwYXRlci5nZXRUYXJnZXQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAocmVmZXJlbmNpbmdPYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBjb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgcmVmZXJlbmNpbmdPYmplY3Q7Ci0gICAgfQotICAgIAotICAgIGlmIChjb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChjb21wb25lbnQuaXNOZXcoKSkKLSAgICAgIHsgIAotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IG51bGw7Ci0gICAgICAgIGlmIChjb21wb25lbnQuZ2V0TmFtZSgpID09IG51bGwgLy8gVGhpcyBtZWFucyB3ZSBzZXQgdG8gYW5vbnltb3VzIHR5cGUKLSAgICAgICAgCQkmJiBjb25jcmV0ZUNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgICAgewotICAgICAgICAgIFhTREZhY3RvcnkgZmFjdG9yeSA9IFhTRFNjaGVtYUJ1aWxkaW5nVG9vbHMuZ2V0WFNERmFjdG9yeSgpOwotICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBjb25jcmV0ZUNvbXBvbmVudDsKLSAgICAgICAgICAvLyBUT0RPIChjcykgd2Ugc2hvdWxkIHVzZSBhY3Rpb25zIGhlcmUgc28gdGhhdCBVTkRPL1JFRE8gY2FuIHdvcmsgbmljZWx5Ci0gICAgICAgICAgLy8gd2l0aCB0aGUgcHJvcGVyIHVuZG8gZGVzY3JpcHRpb25zCi0gICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRNZXRhTmFtZSgpID09IElYU0RTZWFyY2hDb25zdGFudHMuQ09NUExFWF9UWVBFX01FVEFfTkFNRSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSBmYWN0b3J5LmNyZWF0ZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOyAgICAgICAgICAgIAotCSAgCSAgICAgIGVsZW1lbnREZWNsYXJhdGlvbi5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbihjb21wbGV4VHlwZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgIAkgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUgPSBmYWN0b3J5LmNyZWF0ZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIAkgIHNpbXBsZVR5cGUuc2V0QmFzZVR5cGVEZWZpbml0aW9uKAotICAgICAgICAJICAgIGVsZW1lbnREZWNsYXJhdGlvbi5nZXRTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAic3RyaW5nIikgKTsgLy8kTk9OLU5MUy0xJAotICAJICAJICAgIGVsZW1lbnREZWNsYXJhdGlvbi5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbihzaW1wbGVUeXBlKTsKLSAgICAgICAgICB9Ci0JCSAgICAgIGVsZW1lbnREZWNsYXJhdGlvbi5nZXRFbGVtZW50KCkucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIik7IC8vVE9ETyB1c2UgZXh0ZXJuYWwgbGl0ZXJhbCBzdHJpbmcKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb21wb25lbnQuZ2V0TWV0YU5hbWUoKSA9PSBJWFNEU2VhcmNoQ29uc3RhbnRzLkNPTVBMRVhfVFlQRV9NRVRBX05BTUUpCi0gICAgICAgIHsgIAotICAgICAgICAgIEFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0NPTVBMRVhfVFlQRSwgY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgIGNvbW1hbmQuc2V0TmFtZVRvQWRkKGNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgIHRkID0gY29tbWFuZC5nZXRDcmVhdGVkQ29tcGxleFR5cGUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEUsIGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICBjb21tYW5kLnNldE5hbWVUb0FkZChjb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgICB0ZCA9IGNvbW1hbmQuZ2V0Q3JlYXRlZFNpbXBsZVR5cGUoKTsKLSAgICAgICAgfSAgCi0gICAgICAgIGlmICh0ZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZVR5cGVSZWZlcmVuY2VDb21tYW5kKGNvbmNyZXRlQ29tcG9uZW50LCB0ZCk7Ci0gICAgICAgICAgY29tbWFuZC5zZXRMYWJlbChNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9UWVBFKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgICAgICBYU0REaXJlY3RpdmVzTWFuYWdlci5yZW1vdmVVbnVzZWRYU0RJbXBvcnRzKGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgIH0gIAotICAgICAgZWxzZQotICAgICAgeyAgCi0gICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVUeXBlUmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQoY29uY3JldGVDb21wb25lbnQsIGNvbXBvbmVudC5nZXROYW1lKCksIGNvbXBvbmVudC5nZXRRdWFsaWZpZXIoKSwgY29tcG9uZW50LmdldEZpbGUoKSk7Ci0gICAgICAgIGNvbW1hbmQuc2V0TGFiZWwoTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfVFlQRSk7Ci0gICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgfSAgCi0gICAgfSAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9Eb3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL0RvdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMGJiMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL0RvdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvR2VuZXJhdGVEdGQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL0dlbmVyYXRlRHRkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1OGMxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvR2VuZXJhdGVEdGQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL0dlbmVyYXRlSmF2YS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvR2VuZXJhdGVKYXZhLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3NWM2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvR2VuZXJhdGVKYXZhLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9HcmFwaFZpZXdFbGVtZW50UmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9HcmFwaFZpZXdFbGVtZW50UmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzNWRhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvR3JhcGhWaWV3RWxlbWVudFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvTmV3WFNELnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9OZXdYU0QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzRjYWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9OZXdYU0QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1JlZ2V4V2l6YXJkQXJyb3cuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1JlZ2V4V2l6YXJkQXJyb3cuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDU1MGEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9SZWdleFdpemFyZEFycm93LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9UcmlhbmdsZVRvb2xCYXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1RyaWFuZ2xlVG9vbEJhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzdlYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1RyaWFuZ2xlVG9vbEJhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvVmFsaWRhdGVYU0QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1ZhbGlkYXRlWFNELmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzNDdhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvVmFsaWRhdGVYU0QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREFsbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ3NGU4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBbm5vdGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQW5ub3RhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjEwOGMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBbm5vdGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQW55LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBbnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzlmOTNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBbnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREFueUF0dHJpYnV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQW55QXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4MGNjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQW55QXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBcHBJbmZvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBcHBJbmZvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRhMDAxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQXBwSW5mby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQXR0cmlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWQ0OWQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREF0dHJpYnV0ZUdyb3VwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGVHcm91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODQ2MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREF0dHJpYnV0ZUdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODlmYThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQXR0cmlidXRlUmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGVSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzY1YWYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGVSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRENob2ljZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQ2hvaWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliYTgyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQ2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RDb21wbGV4Q29udGVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQ29tcGxleENvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWM2OGRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RDb21wbGV4Q29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQ29tcGxleFR5cGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRENvbXBsZXhUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3Zjg1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQ29tcGxleFR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRERhdGVBbmRUaW1lVHlwZXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRERhdGVBbmRUaW1lVHlwZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmM4NGU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0REYXRlQW5kVGltZVR5cGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0REb2MuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRERvYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNDlhMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRERvYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERWxlbWVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDVmMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREVsZW1lbnRSZWYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREVsZW1lbnRSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDlhY2ZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RFbGVtZW50UmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RFeHRlbnNpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREV4dGVuc2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZmI4MDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREV4dGVuc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERmllbGQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREZpZWxkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4ZTQzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERmllbGQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTAwZjFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RHbG9iYWxBdHRyaWJ1dGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdsb2JhbEF0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDQ5ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdsb2JhbEF0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNER2xvYmFsRWxlbWVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNER2xvYmFsRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDVmMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdsb2JhbEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdyb3VwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RHcm91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NWVmNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RHcm91cFJlZi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNER3JvdXBSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGE3ZmIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RHcm91cFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNESW1wb3J0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RJbXBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTQ0Y2U1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RJbXBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREluY2x1ZGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREluY2x1ZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjZjNTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RJbmNsdWRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RLZXkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREtleS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDMyYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREtleS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNES2V5UmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RLZXlSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTU4MjlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RLZXlSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRE5vdGF0aW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0ROb3RhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOWRmOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRE5vdGF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0ROdW1iZXJUeXBlcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNETnVtYmVyVHlwZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTM0MjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0ROdW1iZXJUeXBlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEUmVkZWZpbmUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFJlZGVmaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5NjRjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEUmVkZWZpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNlbGVjdG9yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTZWxlY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOTlhNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNlbGVjdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTZXF1ZW5jZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2VxdWVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmYzZjk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTZXF1ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlQ29udGVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlQ29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZjM4ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZUNvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZUVudW0uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZUVudW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQ3OTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVFbnVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVMaXN0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVMaXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA4ZTc4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlTGlzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlUGF0dGVybi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlUGF0dGVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMTNjZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVJlc3RyaWN0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVSZXN0cmljdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YmMxMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVJlc3RyaWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVUeXBlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmMzNjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlVHlwZUZvckVkaXRQYXJ0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVUeXBlRm9yRWRpdFBhcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWVmZWIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVUeXBlRm9yRWRpdFBhcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVVuaW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVVbmlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MmFkYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVVuaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RVbmlxdWUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFVuaXF1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOGE2NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFVuaXF1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvYXBwaW5mb19icm93c2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2FwcGluZm9fYnJvd3NlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmOWJhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvYXBwaW5mb19icm93c2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2FwcGluZm9fY2F0ZWdvcnkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2FwcGluZm9fY2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTY2NWQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9hcHBpbmZvX2NhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9iYWNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9iYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkMWEyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvYmFjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9icm93c2VidXR0b24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2RhZTU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9icm93c2VidXR0b24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2Vycm9yX3N0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvZXJyb3Jfc3Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjNjA2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvZXJyb3Jfc3Rfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9mb3J3YXJkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9mb3J3YXJkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiNjk5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvZ2VuZXJhdGVfeG1sLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9nZW5lcmF0ZV94bWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmUzNjM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9nZW5lcmF0ZV94bWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3F1aWNrYXNzaXN0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9xdWlja2Fzc2lzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YWUyYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3F1aWNrYXNzaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9yZWd4X3dpei5wbmcgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvcmVneF93aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjE0NzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9yZWd4X3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvcmVsb2FkZ3JhbW1hci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvcmVsb2FkZ3JhbW1hci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MDVkYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3JlbG9hZGdyYW1tYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3NvcnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3NvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzY1ZGM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9zb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy94bWxjYXRhbG9nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMveG1sY2F0YWxvZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjE0NDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy94bWxjYXRhbG9nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjkwNzcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotVUlfTEFCRUxfQkFTRV9UWVBFID0gQmFzZSBUeXBlOgotVUlfTEFCRUxfREVSSVZFRF9CWSA9IERlcml2ZWQgQnk6Ci0KLVVJX0xBQkVMX0lOSEVSSVRfRlJPTSA9IEluaGVyaXQgJkZyb206Ci1VSV9MQUJFTF9JTkhFUklUX0JZID0gSW5oZXJpdCAmQnk6Ci0KLVVJX0xBQkVMX0RPQ1VNRU5UQVRJT04gPSBEb2N1bWVudGF0aW9uCi1VSV9MQUJFTF9BUFBfSU5GTyA9IEFwcCBJbmZvCi0KLVVJX0xBQkVMX1NFVF9UWVBFID0gU2V0IFR5cGUKLVVJX0xBQkVMX1RZUEUgPSAmVHlwZToKLQotVUlfTEFCRUxfTkFNRSA9ICZOYW1lOgotCi1VSV9MQUJFTF9LSU5EID0gS2luZDoKLQotVUlfTEFCRUxfTUlOT0NDVVJTID0gJk1pbmltdW0gT2NjdXJyZW5jZToKLVVJX0xBQkVMX01BWE9DQ1VSUyA9IE1hJnhpbXVtIE9jY3VycmVuY2U6Ci0KLVVJX1BBR0VfSEVBRElOR19SRUZFUkVOQ0UgPSBSZWZlcmVuY2UKLVVJX0xBQkVMX1JFQURfT05MWSA9IHJlYWQtb25seQotCi1VSV9OT19UWVBFID0gTm8gVHlwZQotCi1VSV9MQUJFTF9DT01QT05FTlRTCQkJCT0gQ29tcG9uZW50czoKLQotISBBZGRpdGlvbmFsIENhdGVnb3JpZXMKLV9VSV9HUkFQSF9UWVBFUyAgICAgICAgICAgICAgICA9IFR5cGVzCi1fVUlfR1JBUEhfRUxFTUVOVFMgICAgICAgICAgICAgPSBFbGVtZW50cwotX1VJX0dSQVBIX0FUVFJJQlVURVMgICAgICAgICAgID0gQXR0cmlidXRlcwotX1VJX0dSQVBIX0FUVFJJQlVURV9HUk9VUFMgICAgID0gQXR0cmlidXRlIEdyb3VwcwotX1VJX0dSQVBIX05PVEFUSU9OUyAgICAgICAgICAgID0gTm90YXRpb25zCi1fVUlfR1JBUEhfSURFTlRJVFlfQ09OU1RSQUlOVFMgPSBJZGVudGl0eSBDb25zdHJhaW50cwotX1VJX0dSQVBIX0FOTk9UQVRJT05TICAgICAgICAgID0gQW5ub3RhdGlvbnMKLV9VSV9HUkFQSF9ESVJFQ1RJVkVTICAgICAgICAgICA9IERpcmVjdGl2ZXMKLV9VSV9HUkFQSF9HUk9VUFMgICAgICAgICAgICAgICA9IEdyb3VwcwotX1VJX0dSQVBIX1JFREVGSU5FX1NDSEVNQSAgICAgID0gUmVkZWZpbmUgU2NoZW1hCi1fVUlfR1JBUEhfUkVERUZJTkVfVFlQRVMgICAgICAgPSBUeXBlcwotX1VJX0dSQVBIX1JFREVGSU5FX0FUVFJJQlVURV9HUk9VUFMgID0gQXR0cmlidXRlIEdyb3VwcwotX1VJX0dSQVBIX1JFREVGSU5FX0dST1VQUyAgICAgID0gR3JvdXBzCi0KLV9VSV9MQUJFTF9OT19MT0NBVElPTl9TUEVDSUZJRUQgID0gTm8gTG9jYXRpb24gU3BlY2lmaWVkCi1fVUlfQUNUSU9OX1NFVF9NVUxUSVBMSUNJVFkJCSA9IFNldCAmTXVsdGlwbGljaXR5Ci1fVUlfTEFCRUxfQUJTRU5UICAgICAgICAgICAgICAgPSBhYnNlbnQKLV9VSV9HUkFQSF9VTktOT1dOX09CSkVDVCAgICAgICA9IFVua25vd24gb2JqZWN0Ci1fVUlfR1JBUEhfWFNEU0NIRU1BX05PX05BTUVTUEFDRSA9IChubyB0YXJnZXQgbmFtZXNwYWNlIHNwZWNpZmllZCkKLV9VSV9HUkFQSF9YU0RTQ0hFTUEgICAgICAgICAgICA9IFNjaGVtYQotX1VJX01FTlVfWFNEX0VESVRPUiAgICAgICAgICAgICAgICAgPSAmWFNECi1fVUlfTEFCRUxfU0VUX1RZUEUJCQkJICAgID0gU2V0IFR5cGUKLQotIQotISBQcmVmZXJlbmNlIFBhZ2UKLSEKLV9VSV9URVhUX0lOREVOVF9MQUJFTCAgICAgICAgICAgICAgICAgPSBJbmRlbnRhdGlvbgotX1VJX1RFWFRfSU5ERU5UX1NQQUNFU19MQUJFTCAgICAgICAgICA9ICZOdW1iZXIgb2Ygc3BhY2VzOiAKLV9VSV9URVhUX1hTRF9OQU1FU1BBQ0VfUFJFRklYICAgICAgICAgPSBDcmVhdGluZyBmaWxlcwotX1VJX1hNTF9URVhUX0VESVRPUl9QUkVGU19MSU5LCQkgID0gWE1MIFNjaGVtYSBlZGl0aW5nIHByZWZlcmVuY2VzLiBOb3RlIHRoYXQgc29tZSBwcmVmZXJlbmNlcyBtYXkgYmUgc2V0IG9uIHRoZSBYTUwgPGE+ezB9PC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi1fVUlfWE1MX1ZBTElEQVRPUl9QUkVGU19MSU5LCQkgID0gTm90ZSB0aGF0IHNvbWUgcHJlZmVyZW5jZXMgbWF5IGJlIHNldCBvbiB0aGUgWE1MIDxhPnswfTwvYT4gcHJlZmVyZW5jZSBwYWdlLgotX1VJX1RFWFRfWFNEX0RFRkFVTFRfUFJFRklYICAgICAgICAgICA9IFhNTCBzY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyAmcHJlZml4OgotX1VJX1FVQUxJRllfWFNEICAgICAgICAgICAgICAgICAgICAgICA9ICZRdWFsaWZ5IFhNTCBzY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cwotX1VJX1RFWFRfWFNEX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSA9IERlZmF1bHQgJnRhcmdldCBuYW1lc3BhY2U6Ci1fVUlfVkFMSURBVElOR19GSUxFUyAgICAgICAgICAgICAgICAgID0gVmFsaWRhdGluZyBmaWxlcwotX1VJX1RFWFRfSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TICA9IEhvbm91ciBhbGwgc2NoZW1hIGxvY2F0aW9ucwotX1VJX0ZVTExfQ09ORk9STUFOQ0UgICAgICAgICAgICAgICAgICA9ICZDaGVjayBmdWxsIFhNTCBTY2hlbWEgY29uZm9ybWFuY2UKLV9VSV9URVhUX0VOQUJMRV9BVVRPX0lNUE9SVF9DTEVBTlVQICAgPSAmQXV0b21hdGljYWxseSByZW1vdmUgdW51c2VkIFhTRCBpbXBvcnRzIGFuZCBYTUwgTmFtZXNwYWNlIGVudHJpZXMKLV9VSV9URVhUX0VOQUJMRV9BVVRPX09QRU5fU0NIRU1BX0RJQUxPRyA9ICZQcm9tcHQgZm9yIHNjaGVtYSBsb2NhdGlvbiB3aGVuIGFkZGluZyBhIGRpcmVjdGl2ZQotCi1fRVJST1JfTEFCRUxfSU5WQUxJRF9QUkVGSVggICAgID0gSVdBWDEwMDRFIEludmFsaWQgcHJlZml4LiBBIHByZWZpeCBtdXN0IG5vdCBiZSBlbXB0eSBvciBjb250YWluIGFueSBzcGFjZS4KLQotX1VJX05PX1RZUEVfREVGSU5FRD0obm8gdHlwZSBkZWZpbmVkKQotX1VJX0FDVElPTl9VUERBVEVfTkFNRT1VcGRhdGUgTmFtZQotX1VJX0FDVElPTl9VUERBVEVfRUxFTUVOVF9SRUZFUkVOQ0U9VXBkYXRlIEVsZW1lbnQgcmVmZXJlbmNlCi1fVUlfQUNUSU9OX1VQREFURV9BVFRSSUJVVEVfUkVGRVJFTkNFPVVwZGF0ZSBBdHRyaWJ1dGUgcmVmZXJlbmNlCi1fVUlfQUNUSU9OX0FERF9GSUVMRD1BZGQgRmllbGQKLV9VSV9BQ1RJT05fQUREX0VMRU1FTlQ9QWRkICZFbGVtZW50Ci1fVUlfQUNUSU9OX0lOU0VSVF9FTEVNRU5UPUkmbnNlcnQgRWxlbWVudAotX1VJX0FDVElPTl9CRUZPUkU9JkJlZm9yZQotX1VJX0FDVElPTl9BRlRFUj0mQWZ0ZXIKLV9VSV9BQ1RJT05fQUREX0lOQ0xVREU9QWRkIEluJmNsdWRlCi1fVUlfQUNUSU9OX0FERF9JTVBPUlQ9QWRkIEkmbXBvcnQKLV9VSV9BQ1RJT05fQUREX1JFREVGSU5FPUFkZCAmUmVkZWZpbmUKLV9VSV9BQ1RJT05fQUREX0VMRU1FTlRfUkVGPUFkZCBFJmxlbWVudCBSZWYKLV9VSV9BQ1RJT05fQUREX0NPTVBMRVhfVFlQRT1BZGQgJkNvbXBsZXggVHlwZQotX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEU9QWRkICZTaW1wbGUgVHlwZQotX1VJX0FDVElPTl9TRVRfVFlQRT1TZXQgJlR5cGUKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURT1BZGQgJkF0dHJpYnV0ZQotX1VJX0FDVElPTl9JTlNFUlRfQVRUUklCVVRFPUkmbnNlcnQgQXR0cmlidXRlCi1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfUkVGPUFkZCBBdHRyaWJ1dGUgJlJlZgotX1VJX0FDVElPTl9ORVc9Jk5ldy4uLgotX1VJX0FDVElPTl9CUk9XU0U9JkJyb3dzZS4uLgotX1VJX0FDVElPTl9EUkFHX0RST1BfRUxFTUVOVD1SZW9yZGVyIEVsZW1lbnRzCi1fVUlfQUNUSU9OX0RSQUdfRFJPUF9BVFRSSUJVVEU9UmVvcmRlciBBdHRyaWJ1dGVzCi1fVUlfQUNUSU9OX1JFREVGSU5FX0NPTVBMRVhfVFlQRT1SZWRlZmluZSAmQ29tcGxleCBUeXBlCi1fVUlfQUNUSU9OX1JFREVGSU5FX1NJTVBMRV9UWVBFPVJlZGVmaW5lICZTaW1wbGUgVHlwZQotX1VJX0FDVElPTl9SRURFRklORV9BVFRSSUJVVEVfR1JPVVA9UmVkZWZpbmUgJkF0dHJpYnV0ZSBHcm91cAotX1VJX0FDVElPTl9SRURFRklORV9NT0RFTF9HUk9VUD1SZWRlZmluZSAmTW9kZWwgR3JvdXAKLV9VSV9BQ1RJT05fUkVOQU1FPVJlbmFtZQotCi1fVUlfTEFCRUxfT1BUSU9OQUw9T3B0aW9uYWwKLV9VSV9MQUJFTF9aRVJPX09SX01PUkU9WmVybyBvciBtb3JlCi1fVUlfTEFCRUxfT05FX09SX01PUkU9T25lIG9yIG1vcmUKLV9VSV9MQUJFTF9MT0NBTF9UWVBFPWxvY2FsIHR5cGUKLV9VSV9MQUJFTF9SRVFVSVJFRD1SZXF1aXJlZAotX1VJX0xBQkVMX0FSUkFZPWFycmF5Ci0KLV9VSV9MQUJFTF9TRVRfQ09NTU9OX0JVSUxUX0lOX1RZUEVTPVNldCBjb21tb24gQnVpbHQtSW4gdHlwZXMKLV9VSV9MQUJFTF9TRUxFQ1RfVFlQRVNfRklMVEVSX09VVD1TZWxlY3QgdGhlIHR5cGVzIHRoYXQgeW91IGRvIG5vdCB3YW50IHRvIGZpbHRlciBvdXQ6IAotX1VJX0xBQkVMX05BTUVfU0VBUkNIX0ZJTFRFUl9URVhUPU5hbWUgKD8gPSBhbnkgY2hhcmFjdGVyLCAqID0gYW55IHN0cmluZyk6Ci1fVUlfTEFCRUxfU0VUX0VMRU1FTlRfUkVGRVJFTkNFPVNldCBlbGVtZW50IHJlZmVyZW5jZQotX1VJX0xBQkVMX1NFVF9BVFRSSUJVVEVfUkVGRVJFTkNFPVNldCBhdHRyaWJ1dGUgcmVmZXJlbmNlCi1fVUlfTEFCRUxfUkVERUZJTkVfQ09NUE9ORU5UPVJlZGVmaW5lIGNvbXBvbmVudAotCi1fVUlfTEFCRUxfTkVXX1RZUEU9TmV3IFR5cGUKLV9VSV9WQUxVRV9ORVdfVFlQRT17MH1UeXBlCi1fVUlfTEFCRUxfTkVXX0VMRU1FTlQ9TmV3IEVsZW1lbnQKLV9VSV9MQUJFTF9ORVdfQVRUUklCVVRFPU5ldyBBdHRyaWJ1dGUKLV9VSV9MQUJFTF9DT01QTEVYX1RZUEU9JkNvbXBsZXggVHlwZQotX1VJX0xBQkVMX1RBUkdFVF9OQU1FU1BBQ0U9VGFyZ2V0IE5hbWVzcGFjZTogCi1fVUlfTEFCRUxfTk9fTkFNRVNQQUNFPU5vIE5hbWVzcGFjZQotX1VJX0xBQkVMX0VMRU1FTlRTX0NPTE9OPUVsZW1lbnRzOgotX1VJX0xBQkVMX0FUVFJJQlVURVNfQ09MT049QXR0cmlidXRlczoKLV9VSV9MQUJFTF9TSU1QTEVfVFlQRT0mU2ltcGxlIFR5cGUKLV9VSV9MQUJFTF9UWVBFU19DT0xPTj1UeXBlczoKLQotX1VJX0xBQkVMX1NPVVJDRT1Tb3VyY2UKLQotX1VJX0xBQkVMX0VMRU1FTlRGT1JNREVGQVVMVD1QcmVmaXggcXVhbGlmaWNhdGlvbiBvZiBsb2NhbCBlbGVtZW50czoKLV9VSV9MQUJFTF9BVFRSSUJVVEVGT1JNREVGQVVMVD1QcmVmaXggcXVhbGlmaWNhdGlvbiBvZiBhdHRyaWJ1dGVzOgotX1VJX0xBQkVMX0NSRUFURV9BTk9OX1RZUEU9Q3JlYXRlIGFzIGxvY2FsICZhbm9ueW1vdXMgdHlwZQotCi1fVUlfTEFCRUxfQVRUUklCVVRFU19QUk9DRVNTQ09OVEVOVFM9UHJvY2VzcyBDb250ZW50czoKLV9VSV9MQUJFTF9BVFRSSUJVVEVTX05BTUVTUEFDRT1OYW1lc3BhY2U6Ci0KLV9VSV9JTUFHRV9DT01QTEVYX1RZUEU9aWNvbnMvWFNEQ29tcGxleFR5cGUuZ2lmCi1fVUlfSU1BR0VfU0lNUExFX1RZUEU9aWNvbnMvWFNEU2ltcGxlVHlwZS5naWYKLV9VSV9JTUFHRV9NT0RFTF9HUk9VUD1pY29ucy9YU0RHcm91cC5naWYKLV9VSV9JTUFHRV9BVFRSSUJVVEVfR1JPVVA9aWNvbnMvWFNEQXR0cmlidXRlR3JvdXAuZ2lmCi0KLV9VSV9DT01CT19ORVc9TmV3Li4uCi1fVUlfQ09NQk9fQlJPV1NFPUJyb3dzZS4uLgotCi1fVUlfRVJST1JfSU5WQUxJRF9OQU1FPUludmFsaWQgbmFtZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvSVhTRFR5cGVzRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL0lYU0RUeXBlc0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTNjNjJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvSVhTRFR5cGVzRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoOwotCi1wdWJsaWMgaW50ZXJmYWNlIElYU0RUeXBlc0ZpbHRlciB7CQotCS8qKgotCSAqIEdpdmUgbWUgYW4gT2JqZWN0IG8sIGlmIEkga25vdyBpdCBhbmQgaXQgc2hvdWxkIGJlIGZpbHRlcmVkIG91dCwgSSB3aWxsIAotCSAqIHJldHVybiB0cnVlLiBPdGhlcndpc2UgSSdsbCByZXR1cm4gZmFsc2UsIGV2ZW4gaWYgSSBkb24ndCBrbm93IHRoZSBvYmplY3QgCi0JICogQHBhcmFtIG8KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkRmlsdGVyT3V0KE9iamVjdCBvKTsKLQkKLQlwdWJsaWMgdm9pZCB0dXJuT24oKTsKLQlwdWJsaWMgdm9pZCB0dXJuT2ZmKCk7Ci0JcHVibGljIGJvb2xlYW4gaXNPbigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RBdHRyaWJ1dGVTZWFyY2hMaXN0UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEQXR0cmlidXRlU2VhcmNoTGlzdFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NGZhMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RBdHRyaWJ1dGVTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBYU0RBdHRyaWJ1dGVTZWFyY2hMaXN0UHJvdmlkZXIgZXh0ZW5kcyBYU0RTZWFyY2hMaXN0UHJvdmlkZXIKLXsKLQotICBwdWJsaWMgWFNEQXR0cmlidXRlU2VhcmNoTGlzdFByb3ZpZGVyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgc3VwZXIoY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcG9wdWxhdGVDb21wb25lbnRMaXN0KElDb21wb25lbnRMaXN0IGxpc3QsIFNlYXJjaFNjb3BlIHNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yIHBtKQotICB7Ci0gICAgLy8gbm93IHdlIHRyYXZlcnNlIHRoZSB0eXBlcyBhbHJlYWR5IGRlZmluZWQgd2l0aGluIHRoZSB2aXNpYmxlIHNjaGVtYXMKLSAgICAvLyB3ZSBkbyB0aGlzIGluIGFkZGl0aW9uIHRvIHRoZSBjb21wb25lbnQgc2VhcmNoIHNpbmNlIHRoaXMgc2hvdWxkIGV4ZWN1dGUKLSAgICAvLyB2ZXJ5IHF1aWNrbHkgYW5kIHRoZXJlJ3MgYSBnb29kIGNoYW5jZSB0aGUgdXNlciB3YW50cyB0byBzZWxlY3QgYSB0aW1lIHRoYXQncyAKLSAgICAvLyBhbHJlYWR5IGltcG9ydGVkL2luY2x1ZGVkCi0gICAgLy8gVE9ETyAoY3MpIGVuc3VyZSB3ZSBkb24ndCBhZGQgZHVwbGljYXRlcyB3aGVuIHdlIHByb2NlZWQgdG8gdXNlIHRoZSBzZWFyY2ggbGlzdAotICAgIC8vCi0gICAgTGlzdCB2aXNpdGVkU2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IHNjaGVtYXNbaV07Ci0gICAgICBDb21wb25lbnRDb2xsZWN0aW5nWFNEVmlzaXRvciB2aXNpdG9yID0gbmV3IENvbXBvbmVudENvbGxlY3RpbmdYU0RWaXNpdG9yKGxpc3QsIElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX01FVEFfTkFNRSk7Ci0gICAgICB2aXNpdG9yLnZpc2l0U2NoZW1hKHNjaGVtYSwgdHJ1ZSk7Ci0gICAgICB2aXNpdGVkU2NoZW1hcy5hZGRBbGwodmlzaXRvci5nZXRWaXNpdGVkU2NoZW1hcygpKTsKLSAgICB9Ci0gICAgLy8gZmluYWxseSB3ZSBjYWxsIHRoZSBzZWFyY2ggQVBJJ3MgdG8gZG8gYSBwb3RlbnRpYWxseSBzbG93IHNlYXJjaAotICAgIGlmIChzY29wZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHBvcHVsYXRlQ29tcG9uZW50TGlzdFVzaW5nU2VhcmNoKGxpc3QsIHNjb3BlLCBwbSwgY3JlYXRlRmlsZU1hcCh2aXNpdGVkU2NoZW1hcykpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbXBvbmVudExpc3RVc2luZ1NlYXJjaChJQ29tcG9uZW50TGlzdCBsaXN0LCBTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBwbSwgSGFzaE1hcCBmaWxlcykKLSAgewotICAgIFNlYXJjaEVuZ2luZSBzZWFyY2hFbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0gICAgSW50ZXJuYWxTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IEludGVybmFsU2VhcmNoUmVxdWVzdG9yKGxpc3QsIGZpbGVzKTsKLSAgICBmaW5kTWF0Y2hlcyhzZWFyY2hFbmdpbmUsIHJlcXVlc3Rvciwgc2NvcGUsIElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX01FVEFfTkFNRSk7Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTRENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWNkMzI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLklYU0RTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgWFNEQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcgotewotICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGUoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIC8vIFRPRE8gKGNzKSBpZiB0aGlzIHByb3ZpZGVyIGlzIHVzZWQgaW4gYSBtdWx0aSBsYW5ndWFnZSBjb250ZXh0Ci0gICAgLy8gd2UnbGwgbmVlZCB0byBwcm92aWRlIHNvbWUgbG9naWMgaGVyZQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2UgU0lNUExFX1RZUEVfSU1BR0UgPSAgWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVUeXBlLmdpZiIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZSBDT01QTEVYX1RZUEVfSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRENvbXBsZXhUeXBlLmdpZiIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZSBFTEVNRU5UX0lNQUdFID0gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RFbGVtZW50LmdpZiIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZSBBVFRSSUJVVEVfSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREF0dHJpYnV0ZS5naWYiKTsKLSAgLy9wcml2YXRlIGZpbmFsIHN0YXRpYyBJbWFnZSBCVUlMVF9JTl9UWVBFKUlNQUdFID0gCi0gICAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVyKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgQ29tcG9uZW50U3BlY2lmaWNhdGlvbikKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKENvbXBvbmVudFNwZWNpZmljYXRpb24pY29tcG9uZW50KS5nZXRRdWFsaWZpZXIoKTsKLSAgICB9ICAKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKFhTRE5hbWVkQ29tcG9uZW50KWNvbXBvbmVudCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7IAotICAgIH0gIAotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFNlYXJjaE1hdGNoKQotICAgIHsKLSAgICAgIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IGdldFF1YWxpZmllZE5hbWVGb3JTZWFyY2hNYXRjaCgoU2VhcmNoTWF0Y2gpY29tcG9uZW50KTsKLSAgICAgIGlmIChxdWFsaWZpZWROYW1lICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gcXVhbGlmaWVkTmFtZS5nZXROYW1lc3BhY2UoKTsKLSAgICAgIH0gICAgCi0gICAgfSAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgLy8gVE9ETy4uLiB0aGlzIHdpbGwgYmUgbXVjaCBlYXNpZXIgd2l0aCBIaXJvc2hpJ3MgcHJvcG9zZWQgU2VhcmNoTWF0Y2ggY2hhbmdlcwotICAvLwotICBwcml2YXRlIFF1YWxpZmllZE5hbWUgZ2V0UXVhbGlmaWVkTmFtZUZvclNlYXJjaE1hdGNoKFNlYXJjaE1hdGNoIG1hdGNoKQotICB7Ci0gICAgUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gbnVsbDsKLSAgICBPYmplY3QgbyA9IG1hdGNoLm1hcC5nZXQoIm5hbWUiKTsKLSAgICBpZiAobyAhPSBudWxsICYmIG8gaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lKQotICAgIHsgIAotICAgICAgcXVhbGlmaWVkTmFtZSA9IChRdWFsaWZpZWROYW1lKW87Ci0gICAgfSAgICAgIAotICAgIHJldHVybiBxdWFsaWZpZWROYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgQ29tcG9uZW50U3BlY2lmaWNhdGlvbikKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKENvbXBvbmVudFNwZWNpZmljYXRpb24pY29tcG9uZW50KS5nZXROYW1lKCk7Ci0gICAgfSAgCi0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gKChYU0ROYW1lZENvbXBvbmVudCljb21wb25lbnQpLmdldE5hbWUoKTsgCi0gICAgfSAgCi0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgU2VhcmNoTWF0Y2gpCi0gICAgewotICAgICAgUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gZ2V0UXVhbGlmaWVkTmFtZUZvclNlYXJjaE1hdGNoKChTZWFyY2hNYXRjaCljb21wb25lbnQpOwotICAgICAgaWYgKHF1YWxpZmllZE5hbWUgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSBxdWFsaWZpZWROYW1lLmdldExvY2FsTmFtZSgpOwotICAgICAgfSAgICAKLSAgICB9ICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBJRmlsZSBnZXRGaWxlKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBJRmlsZSByZXN1bHQgPSBudWxsOwotICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBDb21wb25lbnRTcGVjaWZpY2F0aW9uKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICgoQ29tcG9uZW50U3BlY2lmaWNhdGlvbiljb21wb25lbnQpLmdldEZpbGUoKTsKLSAgICB9ICAKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBTZWFyY2hNYXRjaCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKFNlYXJjaE1hdGNoKWNvbXBvbmVudCkuZ2V0RmlsZSgpOwotICAgIH0gIAotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KWNvbXBvbmVudDsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKTsKLSAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gVE9ETyAoY3MpIHJldmlzaXQgYW5kIHRlc3QgbW9yZQotICAgICAgICAvLwotICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBzY2hlbWEuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIHBsYXRmb3JtUmVzb3VyY2UgPSAicGxhdGZvcm06L3Jlc291cmNlIjsKLSAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwgJiYgbG9jYXRpb24uc3RhcnRzV2l0aChwbGF0Zm9ybVJlc291cmNlKSkKLSAgICAgICAgewotICAgICAgICAgIFBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uLnN1YnN0cmluZyhwbGF0Zm9ybVJlc291cmNlLmxlbmd0aCgpKSk7Ci0gICAgICAgICAgcmVzdWx0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotICAgICAgICB9ICAKLSAgICAgIH0gIAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKQotICB7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSAiIjsKLSAgICBTdHJpbmcgbmFtZSA9IGdldE5hbWUoZWxlbWVudCk7Ci0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgKz0gbmFtZTsKLSAgICAgIC8qCi0gICAgICBTdHJpbmcgcXVhbGlmaWVyID0gZ2V0UXVhbGlmaWVyKGVsZW1lbnQpOwotICAgICAgaWYgKHF1YWxpZmllciAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgKz0gIiAtICIgKyBxdWFsaWZpZXI7Ci0gICAgICB9ICAKLSAgICAgIElGaWxlIGZpbGUgPSBnZXRGaWxlKGVsZW1lbnQpOwotICAgICAgaWYgKGZpbGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgICgiICsgZmlsZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgIikiOwotICAgICAgfSovIAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotICAKLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBJbWFnZSByZXN1bHQgPSBudWxsOyAKLSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgU2VhcmNoTWF0Y2gpCi0gICAgewotICAgICAgU2VhcmNoTWF0Y2ggc2VhcmNoTWF0Y2ggPSAoU2VhcmNoTWF0Y2gpY29tcG9uZW50OwotICAgICAgUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gKFF1YWxpZmllZE5hbWUpc2VhcmNoTWF0Y2gubWFwLmdldCgibWV0YU5hbWUiKTsKLSAgICAgIGlmICggcXVhbGlmaWVkTmFtZSAhPSBudWxsICl7Ci0gICAgCSAgaWYgKCBxdWFsaWZpZWROYW1lLmVxdWFscyhJWFNEU2VhcmNoQ29uc3RhbnRzLlNJTVBMRV9UWVBFX01FVEFfTkFNRSkpCi0gICAgCQkgIHJlc3VsdCA9IFNJTVBMRV9UWVBFX0lNQUdFOwotICAgIAkgIGVsc2UgaWYgKCBxdWFsaWZpZWROYW1lLmVxdWFscyhJWFNEU2VhcmNoQ29uc3RhbnRzLkNPTVBMRVhfVFlQRV9NRVRBX05BTUUpKQotICAgIAkJICByZXN1bHQgPSBDT01QTEVYX1RZUEVfSU1BR0U7Ci0gICAgCSAgZWxzZSBpZiAoIHF1YWxpZmllZE5hbWUuZXF1YWxzKElYU0RTZWFyY2hDb25zdGFudHMuRUxFTUVOVF9NRVRBX05BTUUpKQotICAgIAkJICByZXN1bHQgPSBFTEVNRU5UX0lNQUdFOwotICAgIAkgIGVsc2UgaWYgKCBxdWFsaWZpZWROYW1lLmVxdWFscyhJWFNEU2VhcmNoQ29uc3RhbnRzLkFUVFJJQlVURV9NRVRBX05BTUUpKQotICAgIAkgICAgcmVzdWx0ID0gQVRUUklCVVRFX0lNQUdFOwotICAgICAgfQotICAgIH0gICAgICAKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICByZXN1bHQgPSBDT01QTEVYX1RZUEVfSU1BR0U7ICAgICAgCi0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICByZXN1bHQgPSBTSU1QTEVfVFlQRV9JTUFHRTsKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICByZXN1bHQgPSBFTEVNRU5UX0lNQUdFOwotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgcmVzdWx0ID0gQVRUUklCVVRFX0lNQUdFOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgSW1hZ2UgZ2V0RmlsZUljb24oT2JqZWN0IGNvbXBvbmVudCkgewotCXJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREZpbGUuZ2lmIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNERWxlbWVudHNTZWFyY2hMaXN0UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNERWxlbWVudHNTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0MDQyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTREVsZW1lbnRzU2VhcmNoTGlzdFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLnNlYXJjaDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFbGVtZW50c1NlYXJjaExpc3RQcm92aWRlciBleHRlbmRzIFhTRFNlYXJjaExpc3RQcm92aWRlcgotewotICBwdWJsaWMgWFNERWxlbWVudHNTZWFyY2hMaXN0UHJvdmlkZXIoSUZpbGUgY3VycmVudEZpbGUsIFhTRFNjaGVtYVtdIHNjaGVtYXMpCi0gIHsKLSAgICBzdXBlcihjdXJyZW50RmlsZSwgc2NoZW1hcyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUNvbXBvbmVudExpc3QoSUNvbXBvbmVudExpc3QgbGlzdCwgU2VhcmNoU2NvcGUgc2NvcGUsIElQcm9ncmVzc01vbml0b3IgcG0pCi0gIHsKLSAgICAvLyBub3cgd2UgdHJhdmVyc2UgdGhlIHR5cGVzIGFscmVhZHkgZGVmaW5lZCB3aXRoaW4gdGhlIHZpc2libGUgc2NoZW1hcwotICAgIC8vIHdlIGRvIHRoaXMgaW4gYWRkaXRpb24gdG8gdGhlIGNvbXBvbmVudCBzZWFyY2ggc2luY2UgdGhpcyBzaG91bGQgZXhlY3V0ZQotICAgIC8vIHZlcnkgcXVpY2tseSBhbmQgdGhlcmUncyBhIGdvb2QgY2hhbmNlIHRoZSB1c2VyIHdhbnRzIHRvIHNlbGVjdCBhIHRpbWUgdGhhdCdzIAotICAgIC8vIGFscmVhZHkgaW1wb3J0ZWQvaW5jbHVkZWQKLSAgICAvLyBUT0RPIChjcykgZW5zdXJlIHdlIGRvbid0IGFkZCBkdXBsaWNhdGVzIHdoZW4gd2UgcHJvY2VlZCB0byB1c2UgdGhlIHNlYXJjaCBsaXN0Ci0gICAgLy8KLSAgICBMaXN0IHZpc2l0ZWRTY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gc2NoZW1hc1tpXTsKLSAgICAgIENvbXBvbmVudENvbGxlY3RpbmdYU0RWaXNpdG9yIHZpc2l0b3IgPSBuZXcgQ29tcG9uZW50Q29sbGVjdGluZ1hTRFZpc2l0b3IobGlzdCwgSVhTRFNlYXJjaENvbnN0YW50cy5FTEVNRU5UX01FVEFfTkFNRSk7Ci0gICAgICB2aXNpdG9yLnZpc2l0U2NoZW1hKHNjaGVtYSwgdHJ1ZSk7Ci0gICAgICB2aXNpdGVkU2NoZW1hcy5hZGRBbGwodmlzaXRvci5nZXRWaXNpdGVkU2NoZW1hcygpKTsKLSAgICB9Ci0gICAgLy8gZmluYWxseSB3ZSBjYWxsIHRoZSBzZWFyY2ggQVBJJ3MgdG8gZG8gYSBwb3RlbnRpYWxseSBzbG93IHNlYXJjaAotICAgIGlmIChzY29wZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHBvcHVsYXRlQ29tcG9uZW50TGlzdFVzaW5nU2VhcmNoKGxpc3QsIHNjb3BlLCBwbSwgY3JlYXRlRmlsZU1hcCh2aXNpdGVkU2NoZW1hcykpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbXBvbmVudExpc3RVc2luZ1NlYXJjaChJQ29tcG9uZW50TGlzdCBsaXN0LCBTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBwbSwgSGFzaE1hcCBmaWxlcykKLSAgewotICAgIFNlYXJjaEVuZ2luZSBzZWFyY2hFbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0gICAgSW50ZXJuYWxTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IEludGVybmFsU2VhcmNoUmVxdWVzdG9yKGxpc3QsIGZpbGVzKTsKLSAgICBmaW5kTWF0Y2hlcyhzZWFyY2hFbmdpbmUsIHJlcXVlc3Rvciwgc2NvcGUsIElYU0RTZWFyY2hDb25zdGFudHMuRUxFTUVOVF9NRVRBX05BTUUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2MmRhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuU2NvcGVkQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlIGltcGxlbWVudHMgSUNvbXBvbmVudERpYWxvZwotewotICBwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgVFlQRV9NRVRBX05BTUUgPSBuZXcgUXVhbGlmaWVkTmFtZShYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lIEVMRU1FTlRfTUVUQV9OQU1FID0gbmV3IFF1YWxpZmllZE5hbWUoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAiZWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBBVFRSSUJVVEVfTUVUQV9OQU1FID0gbmV3IFF1YWxpZmllZE5hbWUoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAiYXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLSAgLy8gcHJvdGVjdGVkIE9iamVjdCBzZXRPYmplY3Q7Ci0gIHByb3RlY3RlZCBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNlbGVjdGlvbjsKLSAgcHJvdGVjdGVkIElGaWxlIGN1cnJlbnRGaWxlOwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hW10gc2NoZW1hczsKLSAgcHJvdGVjdGVkIFF1YWxpZmllZE5hbWUgbWV0YU5hbWU7Ci0gIHByb3RlY3RlZCBib29sZWFuIHNob3dDb21wbGV4VHlwZXMgPSB0cnVlOwotCi0gIHB1YmxpYyBYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUoUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSwgSUZpbGUgY3VycmVudEZpbGUsIFhTRFNjaGVtYVtdIHNjaGVtYXMpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMubWV0YU5hbWUgPSBtZXRhTmFtZTsKLSAgICB0aGlzLmN1cnJlbnRGaWxlID0gY3VycmVudEZpbGU7Ci0gICAgdGhpcy5zY2hlbWFzID0gc2NoZW1hczsKLSAgfQotCi0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldFNlbGVjdGVkQ29tcG9uZW50KCkKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbikKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIgICAKLSAgfQotICAKLSAgLyoqIAotICAgKiBXaGV0aGVyIHRvIHNob3cgY29tcGxleCB0eXBlcyBpbiB0aGUgRGlhbG9nJ3MgTGlzdCwgaGFzIG5vIGVmZmVjdCBpZiB0aGUKLSAgICogZGlhbG9nIHBvcHVsYXRlcyBsaXN0IG9mIGVsZW1lbnRzIGluc3RlYWQgb2YgdHlwZQotICAgKiBAcGFyYW0gdmFsdWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNob3dDb21wbGV4VHlwZXMoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHNob3dDb21wbGV4VHlwZXMgPSB2YWx1ZTsKLSAgfQotICAKLSAgcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkKLSAgewotICAgIFNoZWxsIHNoZWxsID0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotICAgIGludCByZXR1cm5WYWx1ZSA9IFdpbmRvdy5DQU5DRUw7Ci0gICAgU2NvcGVkQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyBkaWFsb2cgPSBudWxsOwotICAgIAotICAgIC8vIFRPRE8gKGNzKSBsb3QncyBvZiBjb2RlIGlzIGNvbW1vbiB0byBib3RoIHRoZXNlIGJsb2Nrcy4gIENhbiB3ZSByZS1vcmcgaXQgYSBiaXQKLSAgICAvLyBzbyBpdCdzIGVhc2llciB0byBzZWUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBob3cgd2UgY29uZmlnIGZvciBhbiBlbGVtZW50IHZzIHR5cGU/Ci0gICAgaWYgKCBtZXRhTmFtZSA9PSBFTEVNRU5UX01FVEFfTkFNRSkKLSAgICB7Ci0gICAgCVhTRENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZGVzY3JpcHRpb25Qcm92aWRlciA9IG5ldyBYU0RDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyKCk7Ci0gICAgCWZpbmFsIFhTREVsZW1lbnRzU2VhcmNoTGlzdFByb3ZpZGVyIHNlYXJjaExpc3RQcm92aWRlciA9IG5ldyBYU0RFbGVtZW50c1NlYXJjaExpc3RQcm92aWRlcihjdXJyZW50RmlsZSwgc2NoZW1hcyk7Ci0gICAgCUNvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24oKTsKLSAgICAJCi0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RGVzY3JpcHRpb25Qcm92aWRlcihkZXNjcmlwdGlvblByb3ZpZGVyKTsKLSAgICAgICAgY29uZmlndXJhdGlvbi5zZXRTZWFyY2hMaXN0UHJvdmlkZXIoc2VhcmNoTGlzdFByb3ZpZGVyKTsKLSAgICAgICAgY29uZmlndXJhdGlvbi5zZXRGaWx0ZXJMYWJlbFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX05BTUVfU0VBUkNIX0ZJTFRFUl9URVhUKTsKLSAgICAgICAgY29uZmlndXJhdGlvbi5zZXRMaXN0TGFiZWxUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9FTEVNRU5UU19DT0xPTik7Ci0vLyAgICAgICAgY29uZmlndXJhdGlvbi5zZXROZXdDb21wb25lbnRIYW5kbGVyKG5ldyBOZXdFbGVtZW50QnV0dG9uSGFuZGxlcigpKTsKLSAgICAgICAgLy9UT0RPIGV4dGVybmFsaXplIHN0cmluZwotICAgICAgICBkaWFsb2cgPSBuZXcgU2NvcGVkQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyhzaGVsbCwgTWVzc2FnZXMuX1VJX0xBQkVMX1NFVF9FTEVNRU5UX1JFRkVSRU5DRSwgY29uZmlndXJhdGlvbik7ICAgICAKLSAgICB9Ci0gICAgZWxzZSBpZiAoIG1ldGFOYW1lID09IEFUVFJJQlVURV9NRVRBX05BTUUpCi0gICAgewotICAgICAgWFNEQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBkZXNjcmlwdGlvblByb3ZpZGVyID0gbmV3IFhTRENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIoKTsKLSAgICAgIGZpbmFsIFhTREF0dHJpYnV0ZVNlYXJjaExpc3RQcm92aWRlciBzZWFyY2hMaXN0UHJvdmlkZXIgPSBuZXcgWFNEQXR0cmlidXRlU2VhcmNoTGlzdFByb3ZpZGVyKGN1cnJlbnRGaWxlLCBzY2hlbWFzKTsKLSAgICAgIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgIAotICAgICAgICBjb25maWd1cmF0aW9uLnNldERlc2NyaXB0aW9uUHJvdmlkZXIoZGVzY3JpcHRpb25Qcm92aWRlcik7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0U2VhcmNoTGlzdFByb3ZpZGVyKHNlYXJjaExpc3RQcm92aWRlcik7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RmlsdGVyTGFiZWxUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FX1NFQVJDSF9GSUxURVJfVEVYVCk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0TGlzdExhYmVsVGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUklCVVRFU19DT0xPTik7Ci0gICAgICAgIGRpYWxvZyA9IG5ldyBTY29wZWRDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nKHNoZWxsLCBNZXNzYWdlcy5fVUlfTEFCRUxfU0VUX0FUVFJJQlVURV9SRUZFUkVOQ0UsIGNvbmZpZ3VyYXRpb24pOyAgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKG1ldGFOYW1lID09IFRZUEVfTUVUQV9OQU1FKQotICAgIHsKLSAgICAgIFhTRENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZGVzY3JpcHRpb25Qcm92aWRlciA9IG5ldyBYU0RDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyKCk7Ci0gICAgICBmaW5hbCBYU0RUeXBlc1NlYXJjaExpc3RQcm92aWRlciBzZWFyY2hMaXN0UHJvdmlkZXIgPSBuZXcgWFNEVHlwZXNTZWFyY2hMaXN0UHJvdmlkZXIoY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICAgICAgaWYgKCFzaG93Q29tcGxleFR5cGVzKQotICAgICAgICBzZWFyY2hMaXN0UHJvdmlkZXIuc2hvd0NvbXBsZXhUeXBlcyhmYWxzZSk7Ci0gICAgIAotICAgICAgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbigpOwotICAgICAgY29uZmlndXJhdGlvbi5zZXREZXNjcmlwdGlvblByb3ZpZGVyKGRlc2NyaXB0aW9uUHJvdmlkZXIpOwotICAgICAgY29uZmlndXJhdGlvbi5zZXRTZWFyY2hMaXN0UHJvdmlkZXIoc2VhcmNoTGlzdFByb3ZpZGVyKTsKLS8vICAgICAgY29uZmlndXJhdGlvbi5zZXROZXdDb21wb25lbnRIYW5kbGVyKG5ldyBOZXdUeXBlQnV0dG9uSGFuZGxlcigpKTsKLSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RmlsdGVyTGFiZWxUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FX1NFQVJDSF9GSUxURVJfVEVYVCk7Ci0gICAgICBjb25maWd1cmF0aW9uLnNldExpc3RMYWJlbFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX1RZUEVTX0NPTE9OKTsKLSAgICAgIGRpYWxvZyA9IG5ldyBTY29wZWRDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nKHNoZWxsLCBNZXNzYWdlcy5fVUlfTEFCRUxfU0VUX1RZUEUsIGNvbmZpZ3VyYXRpb24pOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIGlmIChkaWFsb2cgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkaWFsb2cuc2V0Q3VycmVudFJlc291cmNlKGN1cnJlbnRGaWxlKTsgICAgICAKLSAgICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgIHJldHVyblZhbHVlID0gZGlhbG9nLm9wZW4oKTsKLSAgICAgIGlmIChyZXR1cm5WYWx1ZSA9PSBXaW5kb3cuT0spCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbiA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbXBvbmVudCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gIH0KLQotLy8gIHByaXZhdGUgSUVkaXRvclBhcnQgZ2V0QWN0aXZlRWRpdG9yKCkKLS8vICB7Ci0vLyAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0vLyAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLS8vICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotLy8gICAgcmV0dXJuIGVkaXRvclBhcnQ7Ci0vLyAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RTZWFyY2hMaXN0UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEU2VhcmNoTGlzdFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNTNmOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLnNlYXJjaDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREluY2x1ZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYU0RTZWFyY2hMaXN0UHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWFbXSBzY2hlbWFzOwotICBwcm90ZWN0ZWQgSUZpbGUgY3VycmVudEZpbGU7Ci0gIC8vIFRPRE8gKGNzKSByZW1vdmUgdGhlc2UgYW5kIHVzZSBwcm9wZXIgc2VhcmNoIHNjb3BlcyEKLSAgLy8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DTE9TSU5HX1BST0pFQ1RfU0NPUEUgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJUkVfV09SS1NQQUNFX1NDT1BFID0gMTsKLQotICBwdWJsaWMgWFNEU2VhcmNoTGlzdFByb3ZpZGVyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgdGhpcy5zY2hlbWFzID0gc2NoZW1hczsKLSAgICB0aGlzLmN1cnJlbnRGaWxlID0gY3VycmVudEZpbGU7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVByb2plY3RbXSByZWZzID0gY3VycmVudEZpbGUuZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotICAgICAgICAgICAgCi0gICAgICBmb3IgKGludCBpPTA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRlcCAiICsgcmVmc1tpXS5nZXROYW1lKCkpOwotICAgICAgfSAgCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0gCi0gICAgCi0gIH0KLSAgIAotICAKLSAgY2xhc3MgQ29tcG9uZW50Q29sbGVjdGluZ1hTRFZpc2l0b3IKLSAgewotICAgIHByb3RlY3RlZCBMaXN0IHZpc2l0ZWRTY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIElDb21wb25lbnRMaXN0IGxpc3Q7Ci0gICAgUXVhbGlmaWVkTmFtZSBzZWFyY2hLaW5kOwotICAgIAotICAgIENvbXBvbmVudENvbGxlY3RpbmdYU0RWaXNpdG9yKElDb21wb25lbnRMaXN0IGxpc3QsIFF1YWxpZmllZE5hbWUgc2VhcmNoS2luZCkKLSAgICB7Ci0gICAgICB0aGlzLmxpc3QgPSBsaXN0OwotICAgICAgdGhpcy5zZWFyY2hLaW5kID0gc2VhcmNoS2luZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFNjaGVtYShmaW5hbCBYU0RTY2hlbWEgc2NoZW1hLCBib29sZWFuIHZpc2l0SW1wb3J0ZWRTY2hlbWEpCi0gICAgewotICAgICAgdmlzaXRlZFNjaGVtYXMuYWRkKHNjaGVtYSk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGNvbnRlbnRzID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgY29udGVudHMuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0gICAgICAgIHsKLSAgICAgICAgICBmaW5hbCBYU0RTY2hlbWFEaXJlY3RpdmUgc2NoZW1hRGlyZWN0aXZlID0gKFhTRFNjaGVtYURpcmVjdGl2ZSkgY29udGVudDsKLSAgICAgICAgICBYU0RTY2hlbWEgZXh0U2NoZW1hID0gc2NoZW1hRGlyZWN0aXZlLmdldFJlc29sdmVkU2NoZW1hKCk7Ci0gICAgICAgICAgaWYgKGV4dFNjaGVtYSA9PSBudWxsICYmIHNjaGVtYURpcmVjdGl2ZSBpbnN0YW5jZW9mIFhTREltcG9ydCAmJiB2aXNpdEltcG9ydGVkU2NoZW1hKSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBGb3JjZSB0aGUgaW1wb3J0IGRlY2xhcmF0aW9uIHRvIHJlc29sdmUuIFRoZSB3b3JrIG11c3QgYmUgZG9uZSBpbiB0aGUgVUkgdGhyZWFkCi0gICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXJlIGFyZSBVSSBjb21wb25lbnRzIGxpc3RlbmluZyB0byBjaGFuZ2VzIGluIHRoZSBzY2hlbWEgY29udGVudC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgVUlKb2IgbG9hZEltcG9ydEpvYiA9IG5ldyBVSUpvYihYU0RFZGl0b3JQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9MQUJFTF9MT0FESU5HX1hNTF9TQ0hFTUEiKSkgLy8kTk9OLU5MUy0xJCAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIAotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHNjaGVtYSBtb2RlbCB3aWxsIGxvYWQgdGhlIGltcG9ydCB3aGVuIHRyeWluZyB0byByZXNvbHZlIGFueSBjb21wb25lbnQgCi0gICAgICAgICAgICAgICAgLy8gaW4gdGhlIGltcG9ydGVkIHNjaGVtYSdzIG5hbWVzcGFjZS4KLQotICAgICAgICAgICAgICAgIFhTREltcG9ydCB4c2RJbXBvcnQgPSAoWFNESW1wb3J0KXNjaGVtYURpcmVjdGl2ZTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW1wb3J0TmFtZXNwYWNlID0geHNkSW1wb3J0LmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgIHNjaGVtYS5yZXNvbHZlQXR0cmlidXRlRGVjbGFyYXRpb24oaW1wb3J0TmFtZXNwYWNlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGxvYWRJbXBvcnRKb2Iuc2V0U3lzdGVtKHRydWUpOwotICAgICAgICAgICAgbG9hZEltcG9ydEpvYi5zY2hlZHVsZSgpOwotICAgICAgICAgICAgdHJ5IAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsb2FkSW1wb3J0Sm9iLmpvaW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbyBhYm91dCBpdC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4dFNjaGVtYSA9IHNjaGVtYURpcmVjdGl2ZS5nZXRSZXNvbHZlZFNjaGVtYSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoZXh0U2NoZW1hICE9IG51bGwgJiYgIXZpc2l0ZWRTY2hlbWFzLmNvbnRhaW5zKGV4dFNjaGVtYSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHNjaGVtYURpcmVjdGl2ZSBpbnN0YW5jZW9mIFhTREltcG9ydCAmJiB2aXNpdEltcG9ydGVkU2NoZW1hKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB2aXNpdFNjaGVtYShleHRTY2hlbWEsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHNjaGVtYURpcmVjdGl2ZSBpbnN0YW5jZW9mIFhTREluY2x1ZGUgfHwgc2NoZW1hRGlyZWN0aXZlIGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAJdmlzaXRTY2hlbWEoZXh0U2NoZW1hLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24gJiYgc2VhcmNoS2luZCA9PSBJWFNEU2VhcmNoQ29uc3RhbnRzLkVMRU1FTlRfTUVUQV9OQU1FKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQoY29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uICYmIHNlYXJjaEtpbmQgPT0gSVhTRFNlYXJjaENvbnN0YW50cy5BVFRSSUJVVEVfTUVUQV9OQU1FKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQoY29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uICYmIHNlYXJjaEtpbmQgPT0gSVhTRFNlYXJjaENvbnN0YW50cy5TSU1QTEVfVFlQRV9NRVRBX05BTUUpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugd2Ugb25seSB3YW50IHRvIHNob3cgc2ltcGxlIHR5cGVzCi0gICAgICAgICAgbGlzdC5hZGQoY29udGVudCk7ICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uICYmIHNlYXJjaEtpbmQgPT0gSVhTRFNlYXJjaENvbnN0YW50cy5UWVBFX01FVEFfTkFNRSkKLSAgICAgICAgeyAgICAgCi0gICAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gc2hvdyBhbGwgdHlwZXMKLSAgICAgICAgICBsaXN0LmFkZChjb250ZW50KTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0VmlzaXRlZFNjaGVtYXMoKQotICAgIHsKLSAgICAgIHJldHVybiB2aXNpdGVkU2NoZW1hczsKLSAgICB9Ci0gIH0KLSAgIAotICAKLSAgY2xhc3MgSW50ZXJuYWxTZWFyY2hSZXF1ZXN0b3IgZXh0ZW5kcyBTZWFyY2hSZXF1ZXN0b3IKLSAgewotICAgIElDb21wb25lbnRMaXN0IGNvbXBvbmVudExpc3Q7Ci0gICAgSGFzaE1hcCBmaWxlczsKLQotICAgIEludGVybmFsU2VhcmNoUmVxdWVzdG9yKElDb21wb25lbnRMaXN0IGNvbXBvbmVudExpc3QsIEhhc2hNYXAgZmlsZXMpCi0gICAgewotICAgICAgdGhpcy5jb21wb25lbnRMaXN0ID0gY29tcG9uZW50TGlzdDsKLSAgICAgIHRoaXMuZmlsZXMgPSBmaWxlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBtYXRjaCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAvLyB3ZSBmaWx0ZXIgb3V0IHRoZSBtYXRjaGVzIGZyb20gdGhlIGN1cnJlbnQgZmlsZSBzaW5jZSB3ZSBhc3N1bWUgdGhlCi0gICAgICAvLyBpbmZvIGRlcml2ZWQgZnJvbSBvdXIgc2NoZW1hIG1vZGVscyBpcyBtb3JlIHVwZGF0ZSB0byBkYXRlCi0gICAgICAvLyAoaW4gdGhlIGV2ZW50IHRoYXQgd2UgaGF2ZW4ndCBzYXZlZCBvdXIgbGF0ZXN0IG1vZGlmaWNhdGlvbnMpCi0gICAgICAvLwotICAgICAgaWYgKGZpbGVzLmdldChtYXRjaC5nZXRGaWxlKCkpID09IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgLy8gVE9ETy4uLiB0aGlzIHVnbHkgcXVhbGlmaWVkIG5hbWUgc3Rhc2hpbmcgd2lsbCBnbyBhd2F5IHNvb24KLSAgICAgICAgLy8KLSAgICAgICAgUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IG8gPSBtYXRjaC5tYXAuZ2V0KCJuYW1lIik7Ci0gICAgICAgIGlmIChvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWUpCi0gICAgICAgIHsgIAotICAgICAgICAgIHF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSlvOwotICAgICAgICB9IAotICAgICAgICBpZiAocXVhbGlmaWVkTmFtZSAhPSBudWxsICYmIHF1YWxpZmllZE5hbWUuZ2V0TG9jYWxOYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgY29tcG9uZW50TGlzdC5hZGQobWF0Y2gpOwotICAgICAgICB9Ci0gICAgICB9ICAKLSAgICB9Ci0gIH0gIAotCi0gIHByb3RlY3RlZCB2b2lkIGZpbmRNYXRjaGVzKFNlYXJjaEVuZ2luZSBzZWFyY2hFbmdpbmUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIFNlYXJjaFNjb3BlIHNjb3BlLCBRdWFsaWZpZWROYW1lIG1ldGFOYW1lKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuIHBhdHRlcm4gPSBuZXcgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKG5ldyBRdWFsaWZpZWROYW1lKCIqIiwgIioiKSwgbWV0YU5hbWUsIFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENIKTsKLSAgICAgIC8vIFRPRE8gKGNzKSByZXZpc3QgdGhpcy4uLiB3ZSBzaG91bGRuJ3QgYmUgbmVlZGluZyB0byBoYXJkLWNvZGUgcGFydGlwYW50IGlkJ3MKLSAgICAgIC8vIEFsbCB3ZSdyZSByZWFsbHkgZG9pbmcgaGVyZSBpcyB0cnlpbmcgdG8gYXZvaWQgZmluZGluZyBtYXRjaGVzIGluCi0gICAgICAvLyB3c2RsJ3Mgc2luY2Ugd2UgZG9uJ3QgIGV2ZXIgd2FudCB0byBpbXBvcnQvaW5jbHVkZSBhIHdzZGwgZnJvbSBhIHNjaGVtYSEgCi0gICAgICAvLyBNYXliZSB3ZSBzaG91bGQganVzdCBzY29wZSBvdXQgYW55IGZpbGUgdHlwZXMgdGhhdCBhcmVuJ3QgeHNkJ3MgdXNpbmcgYSAKLSAgICAgIC8vIGN1c3RvbSBTZWFyY2hTY29wZT8KLSAgICAgIC8vCi0gICAgICBTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNwYW50ID0gU2VhcmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTZWFyY2hQYXJ0aWNpcGFudCgib3JnLmVjbGlwc2Uud3N0LnhzZC5zZWFyY2guWFNEU2VhcmNoUGFydGljaXBhbnQiKTsKLSAgICAgIEFzc2VydC5pc05vdE51bGwocGFydGljcGFudCk7Ci0gICAgICBTZWFyY2hQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cyA9IHtwYXJ0aWNwYW50fTsKLSAgICAgIHNlYXJjaEVuZ2luZS5zZWFyY2gocGF0dGVybiwgcmVxdWVzdG9yLCBwYXJ0aWNpcGFudHMsIHNjb3BlLCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotICAKLSAgCi0gIHByb3RlY3RlZCBIYXNoTWFwIGNyZWF0ZUZpbGVNYXAoTGlzdCB2aXNpdGVkU2NoZW1hcykKLSAgewotICAgIEhhc2hNYXAgZmlsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gdmlzaXRlZFNjaGVtYXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgdGhlU2NoZW1hID0gKFhTRFNjaGVtYSlpLm5leHQoKTsKLSAgICAgIFN0cmluZyBsb2NhdGlvbiA9IHRoZVNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOyAgICAgICAKLSAgICAgIElGaWxlIGZpbGUgPSBjb21wdXRlRmlsZShsb2NhdGlvbik7Ci0gICAgICBpZiAoZmlsZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBmaWxlTWFwLnB1dChmaWxlLCBCb29sZWFuLlRSVUUpOwotICAgICAgfSAgICAgICAKLSAgICB9ICAgCi0gICAgcmV0dXJuIGZpbGVNYXA7Ci0gIH0KLSAgCi0gIHByaXZhdGUgSUZpbGUgY29tcHV0ZUZpbGUoU3RyaW5nIGJhc2VMb2NhdGlvbikKLSAgewotICAgIElGaWxlIGZpbGUgPSBudWxsOwotICAgIGlmIChiYXNlTG9jYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgZmlsZVNjaGVtZSA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIFN0cmluZyBwbGF0Zm9ybVJlc291cmNlU2NoZW1lID0gInBsYXRmb3JtOi9yZXNvdXJjZSI7Ci0gICAgICBpZiAoYmFzZUxvY2F0aW9uLnN0YXJ0c1dpdGgoZmlsZVNjaGVtZSkpCi0gICAgICB7Ci0gICAgICAgIGJhc2VMb2NhdGlvbiA9IGJhc2VMb2NhdGlvbi5zdWJzdHJpbmcoZmlsZVNjaGVtZS5sZW5ndGgoKSk7Ci0gICAgICAgIGJhc2VMb2NhdGlvbiA9IHJlbW92ZUxlYWRpbmcoYmFzZUxvY2F0aW9uLCAiLyIpOwotICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoYmFzZUxvY2F0aW9uKTsKLSAgICAgICAgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYmFzZUxvY2F0aW9uLnN0YXJ0c1dpdGgocGxhdGZvcm1SZXNvdXJjZVNjaGVtZSkpCi0gICAgICB7Ci0gICAgICAgIGJhc2VMb2NhdGlvbiA9IGJhc2VMb2NhdGlvbi5zdWJzdHJpbmcocGxhdGZvcm1SZXNvdXJjZVNjaGVtZS5sZW5ndGgoKSk7Ci0gICAgICAgIGJhc2VMb2NhdGlvbiA9IHJlbW92ZUxlYWRpbmcoYmFzZUxvY2F0aW9uLCAiLyIpOwotICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoYmFzZUxvY2F0aW9uKTsKLSAgICAgICAgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLSAgICAgIH0gICAgCi0gICAgfQotICAgIHJldHVybiBmaWxlOyAgICAKLSAgfSAgCi0gIAotICBwcml2YXRlIFN0cmluZyByZW1vdmVMZWFkaW5nKFN0cmluZyBwYXRoLCBTdHJpbmcgcGF0dGVybikKLSAgewotICAgIHdoaWxlIChwYXRoLnN0YXJ0c1dpdGgocGF0dGVybikpCi0gICAgewotICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKHBhdHRlcm4ubGVuZ3RoKCkpOwotICAgIH0gIAotICAgIHJldHVybiBwYXRoOwotICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RUeXBlc1NlYXJjaExpc3RQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RUeXBlc1NlYXJjaExpc3RQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDgwZmFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEVHlwZXNTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotcHVibGljIGNsYXNzIFhTRFR5cGVzU2VhcmNoTGlzdFByb3ZpZGVyIGV4dGVuZHMgWFNEU2VhcmNoTGlzdFByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBJWFNEVHlwZXNGaWx0ZXIgYnVpbHRJbkZpbHRlcjsKLSAgLyoqCi0gICAqIERldGVybWluZXMgaWYgd2Ugc2hvdWxkIHVzZSB0aGUgZmlsdGVyIFRoaXMgdXMgdXNlZCB0byB0dXJuIHRoZSBmaWx0ZXIgb24KLSAgICogYW5kIG9mZgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydEZpbHRlciA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBzaG93Q29tcGxleFR5cGVzID0gdHJ1ZTsKLQotICBwdWJsaWMgWFNEVHlwZXNTZWFyY2hMaXN0UHJvdmlkZXIoSUZpbGUgY3VycmVudEZpbGUsIFhTRFNjaGVtYVtdIHNjaGVtYXMpCi0gIHsKLSAgICBzdXBlcihjdXJyZW50RmlsZSwgc2NoZW1hcyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUNvbXBvbmVudExpc3QoSUNvbXBvbmVudExpc3QgbGlzdCwgU2VhcmNoU2NvcGUgc2NvcGUsIElQcm9ncmVzc01vbml0b3IgcG0pCi0gIHsKLSAgICAvLyBmaXJzdCB3ZSBhZGQgdGhlICdidWlsdCBpbicgdHlwZXMKLSAgICAvLwotICAgIFhTRFNjaGVtYSBzY2hlbWFGb3JTY2hlbWEgPSBYU0RTY2hlbWFJbXBsLmdldFNjaGVtYUZvclNjaGVtYShYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYUZvclNjaGVtYS5nZXRTaW1wbGVUeXBlSWRNYXAoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgaWYgKGJ1aWx0SW5GaWx0ZXIgPT0gbnVsbCB8fCAhYnVpbHRJbkZpbHRlci5zaG91bGRGaWx0ZXJPdXQodGQpKQotICAgICAgewotICAgICAgICBsaXN0LmFkZCh0ZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIG5vdyB3ZSB0cmF2ZXJzZSB0aGUgdHlwZXMgYWxyZWFkeSBkZWZpbmVkIHdpdGhpbiB0aGUgdmlzaWJsZSBzY2hlbWFzCi0gICAgLy8gd2UgZG8gdGhpcyBpbiBhZGRpdGlvbiB0byB0aGUgY29tcG9uZW50IHNlYXJjaCBzaW5jZSB0aGlzIHNob3VsZCBleGVjdXRlCi0gICAgLy8gdmVyeSBxdWlja2x5IGFuZCB0aGVyZSdzIGEgZ29vZCBjaGFuY2UgdGhlIHVzZXIgd2FudHMgdG8gc2VsZWN0IGEgdGltZQotICAgIC8vIHRoYXQncwotICAgIC8vIGFscmVhZHkgaW1wb3J0ZWQvaW5jbHVkZWQKLSAgICAvLyBUT0RPIChjcykgZW5zdXJlIHdlIGRvbid0IGFkZCBkdXBsaWNhdGVzIHdoZW4gd2UgcHJvY2VlZCB0byB1c2UgdGhlCi0gICAgLy8gc2VhcmNoIGxpc3QKLSAgICAvLwotICAgIExpc3QgdmlzaXRlZFNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBzY2hlbWFzW2ldOwotICAgICAgUXVhbGlmaWVkTmFtZSBraW5kID0gc2hvd0NvbXBsZXhUeXBlcyA/IElYU0RTZWFyY2hDb25zdGFudHMuVFlQRV9NRVRBX05BTUUgOiBJWFNEU2VhcmNoQ29uc3RhbnRzLlNJTVBMRV9UWVBFX01FVEFfTkFNRTsKLSAgICAgIENvbXBvbmVudENvbGxlY3RpbmdYU0RWaXNpdG9yIHZpc2l0b3IgPSBuZXcgQ29tcG9uZW50Q29sbGVjdGluZ1hTRFZpc2l0b3IobGlzdCwga2luZCk7Ci0gICAgICB2aXNpdG9yLnZpc2l0U2NoZW1hKHNjaGVtYSwgdHJ1ZSk7Ci0gICAgICB2aXNpdGVkU2NoZW1hcy5hZGRBbGwodmlzaXRvci5nZXRWaXNpdGVkU2NoZW1hcygpKTsKLSAgICB9Ci0gICAgLy8gZmluYWxseSB3ZSBjYWxsIHRoZSBzZWFyY2ggQVBJJ3MgdG8gZG8gYSBwb3RlbnRpYWxseSBzbG93IHNlYXJjaAotICAgIC8vICAgCi0gICAgaWYgKHNjb3BlICE9IG51bGwpCi0gICAgewotICAgICAgcG9wdWxhdGVDb21wb25lbnRMaXN0VXNpbmdTZWFyY2gobGlzdCwgc2NvcGUsIHBtLCBjcmVhdGVGaWxlTWFwKHZpc2l0ZWRTY2hlbWFzKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tcG9uZW50TGlzdFVzaW5nU2VhcmNoKElDb21wb25lbnRMaXN0IGxpc3QsIFNlYXJjaFNjb3BlIHNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yIHBtLCBIYXNoTWFwIGZpbGVzKQotICB7Ci0gICAgU2VhcmNoRW5naW5lIHNlYXJjaEVuZ2luZSA9IG5ldyBTZWFyY2hFbmdpbmUoKTsKLSAgICBJbnRlcm5hbFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSW50ZXJuYWxTZWFyY2hSZXF1ZXN0b3IobGlzdCwgZmlsZXMpOwotICAgIGlmIChzaG93Q29tcGxleFR5cGVzKQotICAgIHsKLSAgICAgIGZpbmRNYXRjaGVzKHNlYXJjaEVuZ2luZSwgcmVxdWVzdG9yLCBzY29wZSwgSVhTRFNlYXJjaENvbnN0YW50cy5DT01QTEVYX1RZUEVfTUVUQV9OQU1FKTsKLSAgICB9Ci0gICAgZmluZE1hdGNoZXMoc2VhcmNoRW5naW5lLCByZXF1ZXN0b3IsIHNjb3BlLCBJWFNEU2VhcmNoQ29uc3RhbnRzLlNJTVBMRV9UWVBFX01FVEFfTkFNRSk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIF9wb3B1bGF0ZUNvbXBvbmVudExpc3RRdWljayhJQ29tcG9uZW50TGlzdCBsaXN0LCBJUHJvZ3Jlc3NNb25pdG9yIHBtKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0dXJuQnVpbHRJbkZpbHRlck9uKGJvb2xlYW4gb3B0aW9uKQotICB7Ci0gICAgc3VwcG9ydEZpbHRlciA9IG9wdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEJ1aWx0SW5GaWx0ZXIoSVhTRFR5cGVzRmlsdGVyIGZpbHRlcikKLSAgewotICAgIHRoaXMuYnVpbHRJbkZpbHRlciA9IGZpbHRlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNob3dDb21wbGV4VHlwZXMoYm9vbGVhbiBzaG93KQotICB7Ci0gICAgc2hvd0NvbXBsZXhUeXBlcyA9IHNob3c7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25hdmlnYXRpb24vRGVzaWduVmlld05hdmlnYXRpb25Mb2NhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbmF2aWdhdGlvbi9EZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMjU2YTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbmF2aWdhdGlvbi9EZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubmF2aWdhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmF2aWdhdGlvbkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLk5hdmlnYXRpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBleGlzdHMgdG8gc3VwcG9ydCBuYXZpZ2F0aW9uIGluIGEgY29udGV4dCB3aGVyZSB0aGVyZSBpcyBubyB0ZXh0IAotICogZWRpdG9yIHBhZ2UuICBJbiB0aGVzZSBjYXNlcyB3ZSBjYW4ndCByZWx5IG9uIHRoZSBUZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9ucwotICogc28gd2UgdGhpcyBjbGFzcyB3aGljaCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGgganVzdCB0aGUgZGVzaWduIHZpZXcuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uIGV4dGVuZHMgTmF2aWdhdGlvbkxvY2F0aW9uCi17Ci0gIHByb3RlY3RlZCBQYXRoIHBhdGg7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfVEFHID0gInBhdGgiOyAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgRGVzaWduVmlld05hdmlnYXRpb25Mb2NhdGlvbihJRWRpdG9yUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgdGhpcy5wYXRoID0gbmV3IFBhdGgoKTsKLSAgfQotICAKLSAgcHVibGljIERlc2lnblZpZXdOYXZpZ2F0aW9uTG9jYXRpb24oSUVkaXRvclBhcnQgcGFydCwgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgc3VwZXIocGFydCk7ICAgCi0gICAgdGhpcy5wYXRoID0gUGF0aC5jb21wdXRlUGF0aChjb21wb25lbnQpOyAgCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBtZXJnZUludG8oSU5hdmlnYXRpb25Mb2NhdGlvbiBjdXJyZW50TG9jYXRpb24pCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGlmIChjdXJyZW50TG9jYXRpb24gaW5zdGFuY2VvZiBEZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uKQotICAgIHsKLSAgICAgIERlc2lnblZpZXdOYXZpZ2F0aW9uTG9jYXRpb24gbG9jID0gKERlc2lnblZpZXdOYXZpZ2F0aW9uTG9jYXRpb24pIGN1cnJlbnRMb2NhdGlvbjsKLSAgICAgIHJlc3VsdCA9IGxvYy5wYXRoLnRvU3RyaW5nKCkuZXF1YWxzKHBhdGgudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZXN0b3JlTG9jYXRpb24oKQotICB7Ci0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpIGdldEVkaXRvclBhcnQoKS5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcyk7Ci0gICAgT2JqZWN0IHZpZXdlciA9IGdldEVkaXRvclBhcnQoKS5nZXRBZGFwdGVyKEdyYXBoaWNhbFZpZXdlci5jbGFzcyk7Ci0gICAgaWYgKHZpZXdlciBpbnN0YW5jZW9mIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIpCi0gICAgewotICAgICAgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXIgPSAoRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcikgdmlld2VyOwotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0gUGF0aC5jb21wdXRlQ29tcG9uZW50KHNjaGVtYSwgcGF0aCk7Ci0gICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoY29tcG9uZW50KTsKLSAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgZ3JhcGhpY2FsVmlld2VyLnNldElucHV0KChJQURUT2JqZWN0KWFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwYXRoLnNlZ21lbnRzLmlzRW1wdHkoKSkKLSAgICAgIHsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChzY2hlbWEpOwotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICBncmFwaGljYWxWaWV3ZXIuc2V0SW5wdXQoKElBRFRPYmplY3QpYWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gbWVtZW50bykKLSAgewotICAgIFN0cmluZyBzdHJpbmcgPSBtZW1lbnRvLmdldFN0cmluZyhQQVRIX1RBRyk7Ci0gICAgcGF0aCA9IFBhdGguY3JlYXRlUGF0aChzdHJpbmcpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pCi0gIHsKLSAgICBtZW1lbnRvLnB1dFN0cmluZyhQQVRIX1RBRywgcGF0aC50b1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVwZGF0ZSgpCi0gIHsKLSAgICAvLyBUT0RPIChjcykgbm90IHN1cmUgd2hhdCBuZWVkcyB0byBiZSBkb25lIGhlcmUKLSAgfQotICBzdGF0aWMgY2xhc3MgUGF0aFNlZ21lbnQKLSAgewotICAgIGZpbmFsIHN0YXRpYyBpbnQgRUxFTUVOVCA9IDE7Ci0gICAgZmluYWwgc3RhdGljIGludCBUWVBFID0gMjsKLSAgICBmaW5hbCBzdGF0aWMgaW50IE1PREVMX0dST1VQID0gMzsKLSAgICBmaW5hbCBzdGF0aWMgaW50IEFUVFJJQlVURV9HUk9VUCA9IDQ7Ci0gICAgZmluYWwgc3RhdGljIGludCBSRURFRklORSA9IDU7Ci0gICAgaW50IGtpbmQ7Ci0gICAgU3RyaW5nIG5hbWU7Ci0KLSAgICBQYXRoU2VnbWVudCgpCi0gICAgewotICAgIH0KLQotICAgIFBhdGhTZWdtZW50KGludCBraW5kLCBTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICB0aGlzLmtpbmQgPSBraW5kOwotICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0gIH0KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBQYXRoCi0gIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVERUZJTkVfVE9LRU4gPSAicmVkZWZpbmUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMX0dST1VQX1RPS0VOID0gIm1vZGVsR3JvdXAiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9HUk9VUF9UT0tFTiA9ICJhdHRyaWJ1dGVHcm91cCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9UT0tFTiA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RPS0VOID0gImVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBMaXN0IHNlZ21lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHVibGljIHN0YXRpYyBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wdXRlQ29tcG9uZW50KFhTRFNjaGVtYSBzY2hlbWEsIFBhdGggcGF0aCkKLSAgICB7Ci0gICAgICBQYXRoUmVzb2x2aW5nWFNEVmlzaXRvciB2aXNpdG9yID0gbmV3IFBhdGhSZXNvbHZpbmdYU0RWaXNpdG9yKHBhdGgpOwotICAgICAgdmlzaXRvci52aXNpdFNjaGVtYShzY2hlbWEpOwotICAgICAgaWYgKHZpc2l0b3IuaXNEb25lKCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB2aXNpdG9yLnJlc3VsdDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHN0YXRpYyBQYXRoIGNyZWF0ZVBhdGgoU3RyaW5nIHBhdGhTdHJpbmcpCi0gICAgewotICAgICAgUGF0aCBwYXRoID0gbmV3IFBhdGgoKTsKLSAgICAgIFBhdGhTZWdtZW50IHNlZ21lbnQgPSBudWxsOwotICAgICAgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdGhTdHJpbmcsICIvIik7IHN0Lmhhc01vcmVUb2tlbnMoKTspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgICBpbnQga2luZCA9IC0xOwotICAgICAgICBpZiAodG9rZW4uc3RhcnRzV2l0aChFTEVNRU5UX1RPS0VOKSkKLSAgICAgICAgewotICAgICAgICAgIGtpbmQgPSBQYXRoU2VnbWVudC5FTEVNRU5UOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRva2VuLnN0YXJ0c1dpdGgoVFlQRV9UT0tFTikpCi0gICAgICAgIHsKLSAgICAgICAgICBraW5kID0gUGF0aFNlZ21lbnQuVFlQRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0b2tlbi5zdGFydHNXaXRoKEFUVFJJQlVURV9HUk9VUF9UT0tFTikpCi0gICAgICAgIHsKLSAgICAgICAgCWtpbmQgPSBQYXRoU2VnbWVudC5BVFRSSUJVVEVfR1JPVVA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aChNT0RFTF9HUk9VUF9UT0tFTikpCi0gICAgICAgIHsKLSAgICAgICAgCWtpbmQgPSBQYXRoU2VnbWVudC5NT0RFTF9HUk9VUDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0b2tlbi5zdGFydHNXaXRoKFJFREVGSU5FX1RPS0VOKSkKLSAgICAgICAgewotICAgICAgICAJa2luZCA9IFBhdGhTZWdtZW50LlJFREVGSU5FOwotICAgICAgICB9Ci0gICAgICAgIGlmIChraW5kICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgc2VnbWVudCA9IG5ldyBQYXRoU2VnbWVudCgpOwotICAgICAgICAgIHNlZ21lbnQua2luZCA9IGtpbmQ7Ci0gICAgICAgICAgcGF0aC5zZWdtZW50cy5hZGQoc2VnbWVudCk7Ci0gICAgICAgICAgU3RyaW5nIG5hbWVQYXR0ZXJuID0gIltAbmFtZT0nIjsKLSAgICAgICAgICBpbnQgc3RhcnRJbmRleCA9IHRva2VuLmluZGV4T2YobmFtZVBhdHRlcm4pOwotICAgICAgICAgIGlmIChzdGFydEluZGV4ICE9IC0xKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN0YXJ0SW5kZXggKz0gbmFtZVBhdHRlcm4ubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpbnQgZW5kSW5kZXggPSB0b2tlbi5pbmRleE9mKCInXSIpOwotICAgICAgICAgICAgaWYgKGVuZEluZGV4ICE9IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzZWdtZW50Lm5hbWUgPSB0b2tlbi5zdWJzdHJpbmcoc3RhcnRJbmRleCwgZW5kSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHBhdGg7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBQYXRoIGNvbXB1dGVQYXRoKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBQYXRoIHBhdGggPSBuZXcgUGF0aCgpOwotICAgICAgZm9yIChFT2JqZWN0IGMgPSBjb21wb25lbnQ7IGMgIT0gbnVsbDsgYyA9IGMuZUNvbnRhaW5lcigpKQotICAgICAgewotICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgUGF0aFNlZ21lbnQgc2VnbWVudCA9IGNvbXB1dGVQYXRoU2VnbWVudCgoWFNEQ29uY3JldGVDb21wb25lbnQpIGMpOwotICAgICAgICAgIGlmIChzZWdtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGF0aC5zZWdtZW50cy5hZGQoMCwgc2VnbWVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcGF0aDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgUGF0aFNlZ21lbnQgY29tcHV0ZVBhdGhTZWdtZW50KFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgCVBhdGhTZWdtZW50IHBhdGhTZWdtZW50ID0gbnVsbDsKLSAgICAJaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAJewotICAgIAkJWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGNvbXBvbmVudDsKLSAgICAJCXBhdGhTZWdtZW50ID0gbmV3IFBhdGhTZWdtZW50KFBhdGhTZWdtZW50LkVMRU1FTlQsIGVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7Ci0gICAgCX0KLSAgICAJZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgCXsKLSAgICAJCVhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gKFhTRFR5cGVEZWZpbml0aW9uKSBjb21wb25lbnQ7Ci0gICAgCQlwYXRoU2VnbWVudCA9IG5ldyBQYXRoU2VnbWVudChQYXRoU2VnbWVudC5UWVBFLCB0eXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpOwotICAgIAl9Ci0gICAgCWVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIAl7Ci0gICAgCQlYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmaW5pdGlvbiA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgY29tcG9uZW50OwotICAgIAkJcGF0aFNlZ21lbnQgPSBuZXcgUGF0aFNlZ21lbnQoUGF0aFNlZ21lbnQuTU9ERUxfR1JPVVAsIG1vZGVsR3JvdXBEZWZpbml0aW9uLmdldE5hbWUoKSk7Ci0gICAgCX0KLSAgICAJZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgIAl7Ci0gICAgCQlYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgY29tcG9uZW50OwotICAgIAkJcGF0aFNlZ21lbnQgPSBuZXcgUGF0aFNlZ21lbnQoUGF0aFNlZ21lbnQuQVRUUklCVVRFX0dST1VQLCBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24uZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKS5nZXROYW1lKCkpOwotICAgIAl9Ci0gICAgCWVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgIAl7Ci0gICAgCQlYU0RSZWRlZmluZSByZWRlZmluZSA9IChYU0RSZWRlZmluZSkgY29tcG9uZW50OwotICAgIAkJcGF0aFNlZ21lbnQgPSBuZXcgUGF0aFNlZ21lbnQoUGF0aFNlZ21lbnQuUkVERUZJTkUsIHJlZGVmaW5lLmdldFNjaGVtYUxvY2F0aW9uKCkpOwotICAgIAl9Ci0gICAgCXJldHVybiBwYXRoU2VnbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNlZ21lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgUGF0aFNlZ21lbnQgc2VnbWVudCA9IChQYXRoU2VnbWVudCkgaS5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBraW5kID0gIiI7Ci0gICAgICAgIGlmIChzZWdtZW50LmtpbmQgPT0gUGF0aFNlZ21lbnQuRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgIGtpbmQgPSBFTEVNRU5UX1RPS0VOOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNlZ21lbnQua2luZCA9PSBQYXRoU2VnbWVudC5UWVBFKQotICAgICAgICB7Ci0gICAgICAgICAga2luZCA9IFRZUEVfVE9LRU47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VnbWVudC5raW5kID09IFBhdGhTZWdtZW50Lk1PREVMX0dST1VQKQotICAgICAgICB7Ci0gICAgICAgIAlraW5kID0gTU9ERUxfR1JPVVBfVE9LRU47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VnbWVudC5raW5kID09IFBhdGhTZWdtZW50LkFUVFJJQlVURV9HUk9VUCkKLSAgICAgICAgewotICAgICAgICAJa2luZCA9IEFUVFJJQlVURV9HUk9VUF9UT0tFTjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzZWdtZW50LmtpbmQgPT0gUGF0aFNlZ21lbnQuUkVERUZJTkUpCi0gICAgICAgIHsKLSAgICAgICAgCWtpbmQgPSBSRURFRklORV9UT0tFTjsKLSAgICAgICAgfQotICAgICAgICBiLmFwcGVuZChraW5kKTsKLSAgICAgICAgaWYgKHNlZ21lbnQubmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYi5hcHBlbmQoIltAbmFtZT0nIiArIHNlZ21lbnQubmFtZSArICInXSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIGIuYXBwZW5kKCIvIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7Ci0gICAgfQotICB9Ci0gIAotICAKLSAgc3RhdGljIGNsYXNzIFBhdGhSZXNvbHZpbmdYU0RWaXNpdG9yIGV4dGVuZHMgWFNEVmlzaXRvcgotICB7Ci0gICAgUGF0aCBwYXRoOwotICAgIGludCBpbmRleCA9IC0xOwotICAgIFBhdGhTZWdtZW50IHNlZ21lbnQ7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgcmVzdWx0ID0gbnVsbDsKLQotICAgIFBhdGhSZXNvbHZpbmdYU0RWaXNpdG9yKFBhdGggcGF0aCkKLSAgICB7Ci0gICAgICB0aGlzLnBhdGggPSBwYXRoOwotICAgICAgaW5jcmVtZW50U2VnbWVudCgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNEb25lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gaW5kZXggPj0gcGF0aC5zZWdtZW50cy5zaXplKCk7Ci0gICAgfQotCi0gICAgdm9pZCBpbmNyZW1lbnRTZWdtZW50KCkKLSAgICB7Ci0gICAgICBpbmRleCsrOwotICAgICAgaWYgKGluZGV4IDwgcGF0aC5zZWdtZW50cy5zaXplKCkpCi0gICAgICB7Ci0gICAgICAgIHNlZ21lbnQgPSAoUGF0aFNlZ21lbnQpIHBhdGguc2VnbWVudHMuZ2V0KGluZGV4KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2VnbWVudCA9IG51bGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkKLSAgICB7Ci0gICAgICBpZiAoc2VnbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoc2VnbWVudC5raW5kID09IFBhdGhTZWdtZW50LkVMRU1FTlQpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uID0gc2NoZW1hLnJlc29sdmVFbGVtZW50RGVjbGFyYXRpb24oc2VnbWVudC5uYW1lKTsKLSAgICAgICAgICBpZiAoZWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudERlY2xhcmF0aW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VnbWVudC5raW5kID09IFBhdGhTZWdtZW50LlRZUEUpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IHNjaGVtYS5yZXNvbHZlVHlwZURlZmluaXRpb24oc2VnbWVudC5uYW1lKTsKLSAgICAgICAgICBpZiAodHlwZURlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2aXNpdFR5cGVEZWZpbml0aW9uKHR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VnbWVudC5raW5kID09IFBhdGhTZWdtZW50Lk1PREVMX0dST1VQKQotICAgICAgICB7Ci0gICAgICAgIAlYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmaW5pdGlvbiA9IHNjaGVtYS5yZXNvbHZlTW9kZWxHcm91cERlZmluaXRpb24oc2VnbWVudC5uYW1lKTsKLSAgICAgICAgCWlmIChtb2RlbEdyb3VwRGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgICAJewotICAgICAgICAJCXZpc2l0TW9kZWxHcm91cERlZmluaXRpb24obW9kZWxHcm91cERlZmluaXRpb24pOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNlZ21lbnQua2luZCA9PSBQYXRoU2VnbWVudC5BVFRSSUJVVEVfR1JPVVApCi0gICAgICAgIHsKLSAgICAgICAgCVhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSBzY2hlbWEucmVzb2x2ZUF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihzZWdtZW50Lm5hbWUpOwotICAgICAgICAJaWYgKGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgICAJewotICAgICAgICAJCXZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbik7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VnbWVudC5raW5kID09IFBhdGhTZWdtZW50LlJFREVGSU5FKQotICAgICAgICB7Ci0gICAgICAgIAlJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIAl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICAJewotICAgICAgICAJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIAkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgICAgICAJCXsgICAgICAgIAkJCQotICAgICAgICAJCQlYU0RSZWRlZmluZSByZWRlZmluZSA9IChYU0RSZWRlZmluZSlvYmplY3Q7Ci0gICAgICAgIAkJCXZpc2l0UmVkZWZpbmUocmVkZWZpbmUpOwotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChzZWdtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKHNlZ21lbnQua2luZCA9PSBQYXRoU2VnbWVudC5FTEVNRU5UICYmIGlzTWF0Y2goc2VnbWVudC5uYW1lLCBuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7Ci0gICAgICAgICAgaW5jcmVtZW50U2VnbWVudCgpOwotICAgICAgICAgIGlmICghaXNEb25lKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3VwZXIudmlzaXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRUeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKQotICAgIHsKLSAgICAgIGlmIChzZWdtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChzZWdtZW50LmtpbmQgPT0gUGF0aFNlZ21lbnQuVFlQRSAmJiBpc01hdGNoKHNlZ21lbnQubmFtZSwgbmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSB0eXBlOwotICAgICAgICAgIGluY3JlbWVudFNlZ21lbnQoKTsKLSAgICAgICAgICBpZiAoIWlzRG9uZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyLnZpc2l0VHlwZURlZmluaXRpb24odHlwZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cCkKLSAgICB7Ci0gICAgCWlmIChzZWdtZW50ICE9IG51bGwpCi0gICAgCXsKLSAgICAJCVN0cmluZyBuYW1lID0gbW9kZWxHcm91cC5nZXROYW1lKCk7Ci0gICAgCQlpZiAoc2VnbWVudC5raW5kID09IFBhdGhTZWdtZW50Lk1PREVMX0dST1VQICYmIGlzTWF0Y2goc2VnbWVudC5uYW1lLCBuYW1lKSkKLSAgICAJCXsKLSAgICAJCQlyZXN1bHQgPSBtb2RlbEdyb3VwOwotICAgIAkJCWluY3JlbWVudFNlZ21lbnQoKTsKLSAgICAJCQlpZiAoIWlzRG9uZSgpKQotICAgIAkJCXsKLSAgICAJCQkJc3VwZXIudmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihtb2RlbEdyb3VwKTsKLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXApCi0gICAgewotICAgIAlpZiAoc2VnbWVudCAhPSBudWxsKQotICAgIAl7Ci0gICAgCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZUdyb3VwLmdldE5hbWUoKTsKLSAgICAJCWlmIChzZWdtZW50LmtpbmQgPT0gUGF0aFNlZ21lbnQuQVRUUklCVVRFX0dST1VQICYmIGlzTWF0Y2goc2VnbWVudC5uYW1lLCBuYW1lKSkKLSAgICAJCXsKLSAgICAJCQlyZXN1bHQgPSBhdHRyaWJ1dGVHcm91cDsKLSAgICAJCQlpbmNyZW1lbnRTZWdtZW50KCk7Ci0gICAgCQkJaWYgKCFpc0RvbmUoKSkKLSAgICAJCQl7Ci0gICAgCQkJCXN1cGVyLnZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKGF0dHJpYnV0ZUdyb3VwKTsKLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRSZWRlZmluZShYU0RSZWRlZmluZSByZWRlZmluZSkKLSAgICB7Ci0gICAgCWlmIChzZWdtZW50ICE9IG51bGwpCi0gICAgCXsKLSAgICAJCVN0cmluZyBuYW1lID0gcmVkZWZpbmUuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICAJCWlmIChzZWdtZW50LmtpbmQgPT0gUGF0aFNlZ21lbnQuUkVERUZJTkUgJiYgaXNNYXRjaChzZWdtZW50Lm5hbWUsIG5hbWUpKQotICAgIAkJewotICAgIAkJCXJlc3VsdCA9IHJlZGVmaW5lOwotICAgIAkJCWluY3JlbWVudFNlZ21lbnQoKTsKLSAgICAJCQlpZiAoIWlzRG9uZSgpKQotICAgIAkJCXsKLSAgICAJCQkJdmlzaXRTY2hlbWEocmVkZWZpbmUuZ2V0U2NoZW1hKCkpOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJfQotICAgIAkKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNNYXRjaChTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikKLSAgICB7Ci0gICAgICByZXR1cm4gbmFtZTEgIT0gbnVsbCA/IG5hbWUxLmVxdWFscyhuYW1lMikgOiBuYW1lMSA9PSBuYW1lMjsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uYXZpZ2F0aW9uL011bHRpUGFnZUVkaXRvclRleHRTZWxlY3Rpb25OYXZpZ2F0aW9uTG9jYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25hdmlnYXRpb24vTXVsdGlQYWdlRWRpdG9yVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY2NTk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25hdmlnYXRpb24vTXVsdGlQYWdlRWRpdG9yVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubmF2aWdhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uOwotCi0vKioKLSAqIFRoZSBwbGF0Zm9ybSdzIG5hdmlnYXRpb24gaGlzdG9yeSBwbHVtYmluZyBkb2Vzbid0IGxpa2UgbXVsdGlwYWdlIHRleHQKLSAqIGVkaXRvcnMgdmVyeSBtdWNoIGFuZCB0ZW5kcyB0byBpZ25vcmUgdGV4dCBsb2NhdGlvbnMuICBUbyBmaXggdGhpcwotICogcHJvYmxlbSB3ZSBuZWVkIHRvIG92ZXJyaWRlIHRoZSBnZXRFZGl0UGFydCgpIG1ldGhvZCBvZiB0aGUgc3VwZXIgY2xhc3MKLSAqIGluIG9yZGVyIHRvIHJldHVybiB0aGUgYWN0dWFsIFRleHRFZGl0b3Igb2Ygb3VyIG11bHRpLXBhZ2UgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aVBhZ2VFZGl0b3JUZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uIGV4dGVuZHMgVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbgotewotICBwdWJsaWMgTXVsdGlQYWdlRWRpdG9yVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbihJVGV4dEVkaXRvciBwYXJ0LCBib29sZWFuIGluaXRpYWxpemUpCi0gIHsKLSAgICBzdXBlcihwYXJ0LCBpbml0aWFsaXplKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBnZXRFZGl0b3JQYXJ0KCkKLSAgewotICAgIElFZGl0b3JQYXJ0IHBhcnQgPSBzdXBlci5nZXRFZGl0b3JQYXJ0KCk7Ci0gICAgaWYgKHBhcnQgIT0gbnVsbCkKLSAgICAgIHJldHVybiAoSVRleHRFZGl0b3IpIHBhcnQuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgLy8gSVNTVUU6IGhvdyB0byBnZXQgdGl0bGU/Ci0gICAgLy8gSUVkaXRvclBhcnQgcGFydCA9IGdldEVkaXRvclBhcnQoKTsKLSAgICAvLyBpZiAocGFydCBpbnN0YW5jZW9mIFdTRExUZXh0RWRpdG9yKSB7Ci0gICAgLy8gcmV0dXJuICgoV1NETFRleHRFZGl0b3IpIHBhcnQpLmdldFdTRExFZGl0b3IoKS5nZXRUaXRsZSgpOwotICAgIC8vIH0KLSAgICAvLyBlbHNlIHsKLSAgICAvLyByZXR1cm4gc3VwZXIuZ2V0VGV4dCgpOwotICAgIC8vIH0KLSAgICByZXR1cm4gc3VwZXIuZ2V0VGV4dCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uc2VkaXQvU2NoZW1hUHJlZml4Q2hhbmdlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbnNlZGl0L1NjaGVtYVByZWZpeENoYW5nZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NlNzRhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uc2VkaXQvU2NoZW1hUHJlZml4Q2hhbmdlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uc2VkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgU2NoZW1hUHJlZml4Q2hhbmdlSGFuZGxlcgotewotICBTdHJpbmcgbmV3UHJlZml4OwotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBTdHJpbmcgbmFtZXNwYWNlOwotCi0gIHB1YmxpYyBTY2hlbWFQcmVmaXhDaGFuZ2VIYW5kbGVyKFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyBuZXdQcmVmaXgpCi0gIHsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgICB0aGlzLm5ld1ByZWZpeD0gbmV3UHJlZml4OwotICAgIG5hbWVzcGFjZSA9IFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMTsgCi0gIH0KLQotICBwdWJsaWMgU2NoZW1hUHJlZml4Q2hhbmdlSGFuZGxlcihYU0RTY2hlbWEgeHNkU2NoZW1hLCBTdHJpbmcgbmV3UHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gICAgdGhpcy5uZXdQcmVmaXg9IG5ld1ByZWZpeDsKLSAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVzb2x2ZSgpCi0gIHsKLSAgICBYU0RTY2hlbWFQcmVmaXhSZW5hbWVyIHhzZFNjaGVtYVByZWZpeFJlbmFtZXIgPSBuZXcgWFNEU2NoZW1hUHJlZml4UmVuYW1lcigpOwotICAgIHhzZFNjaGVtYVByZWZpeFJlbmFtZXIudmlzaXRTY2hlbWEoeHNkU2NoZW1hKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmV3UU5hbWUoWFNEVHlwZURlZmluaXRpb24gY29tcCwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgbmV3WFNEUHJlZml4KQotICB7Ci0gICAgU3RyaW5nIHFOYW1lID0gbnVsbDsKLSAgICBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBxTmFtZSA9IG5ld1hTRFByZWZpeDsKLSAgICAgIGlmIChxTmFtZSAhPSBudWxsICYmIHFOYW1lLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgcU5hbWUgKz0gIjoiICsgdmFsdWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHFOYW1lID0gdmFsdWU7IAotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcU5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHFOYW1lOwotICB9Ci0KLSAgCi0gIGNsYXNzIFhTRFNjaGVtYVByZWZpeFJlbmFtZXIgZXh0ZW5kcyBYU0RWaXNpdG9yCi0gIHsKLSAgICBwdWJsaWMgWFNEU2NoZW1hUHJlZml4UmVuYW1lcigpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gICAgewotICAgICAgc3VwZXIudmlzaXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gZWxlbWVudC5nZXRUeXBlKCk7Ci0gICAgICBpZiAodHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgbnMgPSB0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAobnMgPT0gbnVsbCkgbnMgPSAiIjsKLSAgICAgICAgaWYgKG5zLmVxdWFscyhuYW1lc3BhY2UpKSAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IGRvbUVsZW1lbnQgPSBlbGVtZW50LmdldEVsZW1lbnQoKTsKLSAgICAgICAgICBpZiAoZG9tRWxlbWVudCAhPSBudWxsICYmIGRvbUVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBdHRyIHR5cGVBdHRyID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICBpZiAodHlwZUF0dHIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZWxlbWVudC5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgZ2V0TmV3UU5hbWUodHlwZSwgdHlwZS5nZXROYW1lKCksIG5ld1ByZWZpeCkpOyAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUpCi0gICAgewotICAgICAgc3VwZXIudmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbihzaW1wbGVUeXBlKTsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlID0gc2ltcGxlVHlwZS5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICAgIAotICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBucyA9IGJhc2VUeXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAobnMgPT0gbnVsbCkgbnMgPSAiIjsKLSAgICAgICAgaWYgKG5zLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERE9NSGVscGVyIGRvbUhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICAgICAgICBFbGVtZW50IGRlcml2ZWRCeSA9IGRvbUhlbHBlci5nZXREZXJpdmVkQnlFbGVtZW50KHNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICBpZiAoZGVyaXZlZEJ5ICE9IG51bGwgJiYgZGVyaXZlZEJ5IGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgQXR0ciB0eXBlQXR0ciA9IGRlcml2ZWRCeS5nZXRBdHRyaWJ1dGVOb2RlKFhTRENvbnN0YW50cy5CQVNFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICBpZiAodHlwZUF0dHIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZGVyaXZlZEJ5LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUsIGdldE5ld1FOYW1lKGJhc2VUeXBlLCBiYXNlVHlwZS5nZXROYW1lKCksIG5ld1ByZWZpeCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBpdGVtVHlwZSA9IHNpbXBsZVR5cGUuZ2V0SXRlbVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAoaXRlbVR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5zID0gaXRlbVR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGlmIChucyA9PSBudWxsKSBucyA9ICIiOwotICAgICAgICBpZiAobnMuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RET01IZWxwZXIgZG9tSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgICAgICAgIE5vZGUgbGlzdE5vZGUgPSBkb21IZWxwZXIuZ2V0Q2hpbGROb2RlKHNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRyk7Ci0gICAgICAgICAgaWYgKGxpc3ROb2RlICE9IG51bGwgJiYgbGlzdE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoRWxlbWVudClsaXN0Tm9kZTsgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobGlzdEVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQXR0ciB0eXBlQXR0ciA9IGxpc3RFbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoWFNEQ29uc3RhbnRzLklURU1UWVBFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgIGlmICh0eXBlQXR0ciAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdEVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5JVEVNVFlQRV9BVFRSSUJVVEUsIGdldE5ld1FOYW1lKGl0ZW1UeXBlLCBpdGVtVHlwZS5nZXROYW1lKCksIG5ld1ByZWZpeCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIExpc3QgbWVtYmVyVHlwZXMgPSBzaW1wbGVUeXBlLmdldE1lbWJlclR5cGVEZWZpbml0aW9ucygpOwotICAgICAgaWYgKG1lbWJlclR5cGVzLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIFhTRERPTUhlbHBlciBkb21IZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gICAgICAgIE5vZGUgdW5pb25Ob2RlID0gZG9tSGVscGVyLmdldENoaWxkTm9kZShzaW1wbGVUeXBlLmdldEVsZW1lbnQoKSwgWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHKTsKLSAgICAgICAgaWYgKHVuaW9uTm9kZSAhPSBudWxsICYmIHVuaW9uTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IHVuaW9uRWxlbWVudCA9IChFbGVtZW50KXVuaW9uTm9kZTsgICAgICAgICAgCi0gICAgICAgICAgaWYgKHVuaW9uRWxlbWVudCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWVtYmVyVHlwZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24paS5uZXh0KCk7Ci0gICAgICAgICAgICAgIFN0cmluZyBucyA9IHN0LmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICBpZiAobnMgPT0gbnVsbCkgbnMgPSAiIjsKLSAgICAgICAgICAgICAgaWYgKG5zLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGdldE5ld1FOYW1lKHN0LCBzdC5nZXROYW1lKCksIG5ld1ByZWZpeCkpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc3QuZ2V0UU5hbWUoeHNkU2NoZW1hKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVuaW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSwgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyKQotICAgIHsKLSAgICAgIHN1cGVyLnZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gYXR0ci5nZXRUeXBlKCk7Ci0gICAgICBpZiAodHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgbnMgPSB0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAobnMgPT0gbnVsbCkgbnMgPSAiIjsKLSAgICAgICAgaWYgKG5zLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBkb21FbGVtZW50ID0gYXR0ci5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgaWYgKGRvbUVsZW1lbnQgIT0gbnVsbCAmJiBkb21FbGVtZW50IGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgQXR0ciB0eXBlQXR0ciA9IGRvbUVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpOwotICAgICAgICAgICAgaWYgKHR5cGVBdHRyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGF0dHIuZ2V0RWxlbWVudCgpLnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIGdldE5ld1FOYW1lKHR5cGUsIHR5cGUuZ2V0TmFtZSgpLCBuZXdQcmVmaXgpKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uc2VkaXQvVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbnNlZGl0L1RhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2YzlkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uc2VkaXQvVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uc2VkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotCi1wdWJsaWMgY2xhc3MgVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlcgotewotICBTdHJpbmcgbmV3TlM7Ci0gIFN0cmluZyBvbGROUzsKLSAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLQotICBwdWJsaWMgVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlcihYU0RTY2hlbWEgeHNkU2NoZW1hLCBTdHJpbmcgb2xkTlMsIFN0cmluZyBuZXdOUykKLSAgewotICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICAgIHRoaXMub2xkTlM9IG9sZE5TOwotICAgIHRoaXMubmV3TlM9IG5ld05TOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZXNvbHZlKCkKLSAgewotICAgIEVsZW1lbnRSZWZlcmVuY2VSZW5hbWVyIGVsZW1lbnRSZWZlcmVuY2VSZW5hbWVyID0gbmV3IEVsZW1lbnRSZWZlcmVuY2VSZW5hbWVyKCk7Ci0gICAgZWxlbWVudFJlZmVyZW5jZVJlbmFtZXIudmlzaXRTY2hlbWEoeHNkU2NoZW1hKTsKLSAgICBBdHRyaWJ1dGVSZWZlcmVuY2VSZW5hbWVyIGF0dHJpYnV0ZVJlZmVyZW5jZVJlbmFtZXIgPSBuZXcgQXR0cmlidXRlUmVmZXJlbmNlUmVuYW1lcigpOwotICAgIGF0dHJpYnV0ZVJlZmVyZW5jZVJlbmFtZXIudmlzaXRTY2hlbWEoeHNkU2NoZW1hKTsKLSAgfQotCi0gIGNsYXNzIEVsZW1lbnRSZWZlcmVuY2VSZW5hbWVyIGV4dGVuZHMgWFNEVmlzaXRvcgotICB7Ci0gICAgcHVibGljIEVsZW1lbnRSZWZlcmVuY2VSZW5hbWVyKCkKLSAgICB7Ci0gICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgICB7Ci0gICAgICBzdXBlci52aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgIGlmIChlbGVtZW50LmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICB7Ci0gICAgICAJaWYgKGVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgICAgCXsKLSAgICAgIAkgIGlmIChlbGVtZW50LmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKG9sZE5TKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBzZXQgdGhlIHJlc29sdmVkIGVsZW1lbnQncyBkZWNsYXJhdGlvbiB0byBuZXcgbnMKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgZGVmZWN0IDIzNzUxOCAtIHRhcmdldCBuYW1lc3BhY2UgcmVuYW1lIGNyZWF0ZXMgYSBuZXcgbmFtZXNwYWNlCi0gICAgICAgICAgICBlbGVtZW50LmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuc2V0VGFyZ2V0TmFtZXNwYWNlKG5ld05TKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgIAlpZiAob2xkTlMgPT0gbnVsbCB8fCAob2xkTlMgIT0gbnVsbCAmJiBvbGROUy5lcXVhbHMoIiIpKSkKLSAgICAgICAgCXsKLQkJCQkJCWVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5zZXRUYXJnZXROYW1lc3BhY2UobmV3TlMpOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvLyBTaW1pbGFyIHRvIGRlZmVjdCAyMzc1MTggYnV0IGZvciBhdHRyaWJ1dGVzCi0gIGNsYXNzIEF0dHJpYnV0ZVJlZmVyZW5jZVJlbmFtZXIgZXh0ZW5kcyBYU0RWaXNpdG9yCi0gIHsKLSAgICBwdWJsaWMgQXR0cmlidXRlUmVmZXJlbmNlUmVuYW1lcigpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24oWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gICAgewotICAgICAgc3VwZXIudmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24odHlwZSk7Ci0gICAgICBpZiAodHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpIGF0dHJHcm91cENvbnRlbnQ7Ci0gICAgICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IGF0dHJVc2UuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoYXR0ckRlY2wgIT0gbnVsbCAmJiBhdHRyRGVjbC5pc0F0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgICB7Ci0JCQkJCQkJaWYgKGF0dHJEZWNsLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotCQkJCQkJCXsKLSAgICAgICAgICAgICAgICBpZiAoYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhvbGROUykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLnNldFRhcmdldE5hbWVzcGFjZShuZXdOUyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotCQkJCQkJCQlpZiAob2xkTlMgPT0gbnVsbCB8fCAob2xkTlMgIT0gbnVsbCAmJiBvbGROUy5lcXVhbHMoIiIpKSkKLQkJCQkJCQkJewotCQkJCQkJCQkJYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLnNldFRhcmdldE5hbWVzcGFjZShuZXdOUyk7Ci0JCQkJCQkJCX0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwKQotICAgIHsKLSAgICAgIHN1cGVyLnZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKGF0dHJpYnV0ZUdyb3VwKTsKLSAgICAgIEVMaXN0IGxpc3QgPSBhdHRyaWJ1dGVHcm91cC5nZXRBdHRyaWJ1dGVVc2VzKCk7Ci0gICAgICBpZiAobGlzdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSBhdHRyVXNlLmdldENvbnRlbnQoKTsKLQotICAgICAgICAgIGlmIChhdHRyRGVjbCAhPSBudWxsICYmIGF0dHJEZWNsLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICB7Ci0JCQkJCQlpZiAoYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwpCi0JCQkJCQl7Ci0gICAgICAgICAgICAgIGlmIChhdHRyRGVjbC5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKG9sZE5TKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF0dHJEZWNsLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5zZXRUYXJnZXROYW1lc3BhY2UobmV3TlMpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0JCQkJCQkJaWYgKG9sZE5TID09IG51bGwgfHwgKG9sZE5TICE9IG51bGwgJiYgb2xkTlMuZXF1YWxzKCIiKSkpCi0JCQkJCQkJewotCQkJCQkJCQlhdHRyRGVjbC5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuc2V0VGFyZ2V0TmFtZXNwYWNlKG5ld05TKTsKLQkJCQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uc2VkaXQvWFNEVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbnNlZGl0L1hTRFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1NTExYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uc2VkaXQvWFNEVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uc2VkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETm90YXRpb25EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotCi1wdWJsaWMgY2xhc3MgWFNEVmlzaXRvcgotewotICBwdWJsaWMgWFNEVmlzaXRvcigpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSBzY2hlbWE7Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gKFhTRFR5cGVEZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdFR5cGVEZWZpbml0aW9uKHR5cGUpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0SWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24gaWRlbnRpdHlDb25zdHJhaW50ID0gKFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0SWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbihpZGVudGl0eUNvbnN0cmFpbnQpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldE1vZGVsR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihtb2RlbEdyb3VwKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihhdHRyaWJ1dGVHcm91cCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0Tm90YXRpb25EZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRE5vdGF0aW9uRGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0ROb3RhdGlvbkRlY2xhcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdE5vdGF0aW9uRGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRUeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbil0eXBlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbigoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXR5cGUpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgdmlzaXRUeXBlRGVmaW5pdGlvbihlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24gaWRlbnRpdHlDb25zdHJhaW50KQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cERlZikKLSAgewotICAgIGlmICghbW9kZWxHcm91cERlZi5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgaWYgKG1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZpc2l0TW9kZWxHcm91cChtb2RlbEdyb3VwRGVmLmdldE1vZGVsR3JvdXAoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXApCi0gIHsKLSAgICBpZiAoYXR0cmlidXRlR3JvdXAuZ2V0QXR0cmlidXRlVXNlcygpICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlR3JvdXAuZ2V0QXR0cmlidXRlVXNlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyVXNlID0gKFhTREF0dHJpYnV0ZVVzZSlpdGVyLm5leHQoKTsKLSAgICAgICAgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyVXNlLmdldENvbnRlbnQoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE5vdGF0aW9uRGVjbGFyYXRpb24oWFNETm90YXRpb25EZWNsYXJhdGlvbiBub3RhdGlvbikKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24oWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgY29tcGxleENvbnRlbnQgPSB0eXBlLmdldENvbnRlbnQoKTsKLSAgICBpZiAoY29tcGxleENvbnRlbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoY29tcGxleENvbnRlbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pY29tcGxleENvbnRlbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29tcGxleENvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRQYXJ0aWNsZSgoWFNEUGFydGljbGUpIGNvbXBsZXhDb250ZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQgYXR0ckdyb3VwQ29udGVudCA9IChYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQpaXRlci5uZXh0KCk7Ci0gICAgICAgIGlmIChhdHRyR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlVXNlIGF0dHJVc2UgPSAoWFNEQXR0cmlidXRlVXNlKWF0dHJHcm91cENvbnRlbnQ7Ci0gICAgICAgICAgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyVXNlLmdldENvbnRlbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pYXR0ckdyb3VwQ29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UGFydGljbGUoWFNEUGFydGljbGUgcGFydGljbGUpCi0gIHsKLSAgICB2aXNpdFBhcnRpY2xlQ29udGVudChwYXJ0aWNsZS5nZXRDb250ZW50KCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFBhcnRpY2xlQ29udGVudChYU0RQYXJ0aWNsZUNvbnRlbnQgcGFydGljbGVDb250ZW50KQotICB7Ci0gICAgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIHZpc2l0TW9kZWxHcm91cCgoWFNETW9kZWxHcm91cClwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICB7Ci0gICAgICB2aXNpdFdpbGRjYXJkKChYU0RXaWxkY2FyZClwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgewotICAgIGlmIChtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kZWxHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIHZpc2l0UGFydGljbGUocGFydGljbGUpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRXaWxkY2FyZChYU0RXaWxkY2FyZCB3aWxkY2FyZCkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RFZGl0b3JQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNERWRpdG9yUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2ZmZlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RFZGl0b3JQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlTGlua0FyZWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0b3JQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZVBhZ2UKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FRElUT1JfUFJFRkVSRU5DRV9QQUdFX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLnNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQotICBwcml2YXRlIEJ1dHRvbiByZW1vdmVVbnVzZWRJbXBvcnRzOwotCi0gIHByaXZhdGUgQnV0dG9uIGF1dG9tYXRpY2FsbHlPcGVuU2NoZW1hTG9jYXRpb25EaWFsb2c7Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLSAgICBJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHBhcmVudCwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RQX0VESVRPUl9QUkVGRVJFTkNFX1BBR0UpOwotCi0gICAgbmV3IFByZWZlcmVuY2VMaW5rQXJlYShjb21wb3NpdGUsIFNXVC5XUkFQIHwgU1dULk1VTFRJLCBYTUxfRURJVE9SX1BSRUZFUkVOQ0VfUEFHRV9JRCwgTWVzc2FnZXMuX1VJX1hNTF9URVhUX0VESVRPUl9QUkVGU19MSU5LLAotICAgICAgKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKWdldENvbnRhaW5lcigpLCBudWxsKS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuaGludCgxNTAsIFNXVC5ERUZBVUxUKS5jcmVhdGUoKSk7Ci0gICAgbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LnN3dERlZmF1bHRzKCkuY3JlYXRlKCkpOwotCi0gICAgY3JlYXRlQ29udGVudHNGb3JJbXBvcnRDbGVhbnVwKGNvbXBvc2l0ZSk7Ci0KLSAgICBzZXRTaXplKGNvbXBvc2l0ZSk7Ci0gICAgbG9hZFByZWZlcmVuY2VzKCk7Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGdldFJlbW92ZUltcG9ydFNldHRpbmcoKQotICB7Ci0gICAgcmV0dXJuIHJlbW92ZVVudXNlZEltcG9ydHMuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gZ2V0QXV0b21hdGljYWxseU9wZW5TY2hlbWFMb2NhdGlvbkRpYWxvZ1NldHRpbmcoKQotICB7Ci0gICAgcmV0dXJuIGF1dG9tYXRpY2FsbHlPcGVuU2NoZW1hTG9jYXRpb25EaWFsb2cuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkKLSAgewotICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICByZW1vdmVVbnVzZWRJbXBvcnRzLnNldFNlbGVjdGlvbihzdG9yZS5nZXRCb29sZWFuKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfSU1QT1JUX0NMRUFOVVApKTsKLSAgICBhdXRvbWF0aWNhbGx5T3BlblNjaGVtYUxvY2F0aW9uRGlhbG9nLnNldFNlbGVjdGlvbihzdG9yZS5nZXRCb29sZWFuKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfQVVUT19PUEVOX1NDSEVNQV9MT0NBVElPTl9ESUFMT0cpKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpCi0gIHsKLSAgICBJUHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2VTdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotICAgIHJlbW92ZVVudXNlZEltcG9ydHMuc2V0U2VsZWN0aW9uKHByZWZlcmVuY2VTdG9yZS5nZXREZWZhdWx0Qm9vbGVhbihYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0lNUE9SVF9DTEVBTlVQKSk7Ci0gICAgYXV0b21hdGljYWxseU9wZW5TY2hlbWFMb2NhdGlvbkRpYWxvZy5zZXRTZWxlY3Rpb24ocHJlZmVyZW5jZVN0b3JlLmdldERlZmF1bHRCb29sZWFuKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfQVVUT19PUEVOX1NDSEVNQV9MT0NBVElPTl9ESUFMT0cpKTsKLSAgICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkKLSAgewotICAgIHNhdmVWYWx1ZXNGb3JJbXBvcnRzQ2xlYW51cCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNhdmVWYWx1ZXNGb3JJbXBvcnRzQ2xlYW51cCgpCi0gIHsKLSAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLSAgICBzdG9yZS5zZXRWYWx1ZShYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0lNUE9SVF9DTEVBTlVQLCBnZXRSZW1vdmVJbXBvcnRTZXR0aW5nKCkpOwotICAgIHN0b3JlLnNldFZhbHVlKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfQVVUT19PUEVOX1NDSEVNQV9MT0NBVElPTl9ESUFMT0csIGdldEF1dG9tYXRpY2FsbHlPcGVuU2NoZW1hTG9jYXRpb25EaWFsb2dTZXR0aW5nKCkpOwotICB9Ci0KLSAgLyoqIAotICAgKiBUaGUgaW5kZW50IGlzIHN0b3JlZCBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZSBhc3NvY2lhdGVkIHdpdGggdGhlIFhNTCBTY2hlbWEgTW9kZWwKLSAgICovCi0gIHB1YmxpYyBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpCi0gIHsKLSAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9ySW1wb3J0Q2xlYW51cChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgR3JvdXAgdW51c2VkSW1wb3J0R3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDEpOwotICAgIHVudXNlZEltcG9ydEdyb3VwLnNldFRleHQoTWVzc2FnZXMuX1VJX0dSQVBIX0RJUkVDVElWRVMpOwotCi0gICAgLy9HcmlkRGF0YQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCi0gICAgaWYgKHJlbW92ZVVudXNlZEltcG9ydHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZW1vdmVVbnVzZWRJbXBvcnRzID0gbmV3IEJ1dHRvbih1bnVzZWRJbXBvcnRHcm91cCwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotICAgICAgcmVtb3ZlVW51c2VkSW1wb3J0cy5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9URVhUX0VOQUJMRV9BVVRPX0lNUE9SVF9DTEVBTlVQKTsKLSAgICAgIHJlbW92ZVVudXNlZEltcG9ydHMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZW1vdmVVbnVzZWRJbXBvcnRzLCBYU0RFZGl0b3JDU0hlbHBJZHMuWE1MU0NIRU1BRklMRVNfUFJFRkVSRU5DRVNfX0lNUE9SVF9DTEVBTlVQKTsKLQotICAgICAgYXV0b21hdGljYWxseU9wZW5TY2hlbWFMb2NhdGlvbkRpYWxvZyA9IG5ldyBCdXR0b24odW51c2VkSW1wb3J0R3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLSAgICAgIGF1dG9tYXRpY2FsbHlPcGVuU2NoZW1hTG9jYXRpb25EaWFsb2cuc2V0VGV4dChNZXNzYWdlcy5fVUlfVEVYVF9FTkFCTEVfQVVUT19PUEVOX1NDSEVNQV9ESUFMT0cpOwotICAgICAgYXV0b21hdGljYWxseU9wZW5TY2hlbWFMb2NhdGlvbkRpYWxvZy5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5jb3B5RGF0YShkYXRhKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCkKLSAgewotICAgIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7IC8vIG1vZGVsCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQotICAgIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzg0MTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotRGF2aWQgQ2FydmVyLCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwsIGJ1ZyAxMTQ3MDMzICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlZpZXdVdGlsaXR5OwotCi1wdWJsaWMgY2xhc3MgWFNEUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgTGlzdGVuZXIgCi17Ci0gIFRleHQgaW5kZW50VGV4dEZpZWxkOwotICBTdHJpbmcgaW5kZW50U3RyaW5nOwotICBUZXh0IHNjaGVtYU5zUHJlZml4RmllbGQ7Ci0gIFRleHQgZGVmYXVsdFRhcmdldE5hbWVzcGFjZVRleHQ7Ci0gIEJ1dHRvbiBxdWFsaWZ5WFNETGFuZ3VhZ2U7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgcHJlZmVyZW5jZSBwYWdlIGNvbnRyb2xzIG9uIGRlbWFuZC4KLSAgICogICBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IGZvciB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAqLwotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKHBhcmVudCwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RQX1BSRUZFUkVOQ0VfUEFHRSk7Ci0KLSAgICBHcm91cCBncm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7ICAgCi0gICAgZ3JvdXAuc2V0VGV4dChNZXNzYWdlcy5fVUlfVEVYVF9YU0RfTkFNRVNQQUNFX1BSRUZJWCk7Ci0KLSAgICBxdWFsaWZ5WFNETGFuZ3VhZ2UgPSBWaWV3VXRpbGl0eS5jcmVhdGVDaGVja0JveChncm91cCwgTWVzc2FnZXMuX1VJX1FVQUxJRllfWFNEKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHF1YWxpZnlYU0RMYW5ndWFnZSwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5YTUxTQ0hFTUFGSUxFU19QUkVGRVJFTkNFU19fUVVBTElGWV9YTUxTQ0hFTUFfTEFOR1VBR0VfQ09OU1RSVUNUUyk7IAotICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGdyb3VwLCAiICIpOwotCi0gICAgY3JlYXRlTGFiZWwoZ3JvdXAsIE1lc3NhZ2VzLl9VSV9URVhUX1hTRF9ERUZBVUxUX1BSRUZJWCk7Ci0gICAgc2NoZW1hTnNQcmVmaXhGaWVsZCA9IGNyZWF0ZVRleHRGaWVsZChncm91cCk7Ci0gICAgc2NoZW1hTnNQcmVmaXhGaWVsZC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKQotICAgICAgewotICAgICAgICBzZXRWYWxpZCh0cnVlKTsKLSAgICAgIH0gICAgICAKLSAgICB9KTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNjaGVtYU5zUHJlZml4RmllbGQsCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuWE1MU0NIRU1BRklMRVNfUFJFRkVSRU5DRVNfX1hNTF9TQ0hFTUFfTEFOR1VBR0VfQ09OU1RSVUNUU19QUkVGSVgpOyAKLSAgICAKLSAgICBjcmVhdGVMYWJlbChncm91cCwgTWVzc2FnZXMuX1VJX1RFWFRfWFNEX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgZGVmYXVsdFRhcmdldE5hbWVzcGFjZVRleHQgPSBjcmVhdGVUZXh0RmllbGQoZ3JvdXApOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGVmYXVsdFRhcmdldE5hbWVzcGFjZVRleHQsCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuWE1MU0NIRU1BRklMRVNfUFJFRkVSRU5DRVNfX0RFRkFVTFRfVEFSR0VUTkFNRVNQQUNFKTsgCi0gICAgCi0gICAgCi0gICAgaW5pdGlhbGl6ZVZhbHVlcygpOwotCi0gICAgYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0KLSAgICByZXR1cm4gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgfQotCi0gIHByaXZhdGUgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIAotICB7Ci0gICAgR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0KLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotICAgIGdyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIAotICAgIHJldHVybiBncm91cDsKLSAgfQotCi0gIHByaXZhdGUgVGV4dCBjcmVhdGVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLSAgICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICByZXR1cm4gdGV4dDsKLSAgfQotCi0gIHByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIAotICB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0gICAgbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLSAgICAKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgcmV0dXJuIGxhYmVsOwotICB9Ci0gIAotICAvKioKLSAgICogRG9lcyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgZGVmYXVsdCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIAotICB7Ci0gICAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0gICAgaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0gICAgY2hlY2tWYWx1ZXMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBEbyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgT0sgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAqICBAcmV0dXJuIHdoZXRoZXIgaXQgaXMgb2theSB0byBjbG9zZSB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSAKLSAgewotICAgIGlmIChjaGVja1ZhbHVlcygpKQotICAgIHsKLSAgICAgIHN0b3JlVmFsdWVzKCk7ICAgIAotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpCi0gIHsKLSAgICBpZiAoY2hlY2tWYWx1ZXMoKSkKLSAgICB7Ci0gICAgICBzdG9yZVZhbHVlcygpOyAgICAKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSGFuZGxlcyBldmVudHMgZ2VuZXJhdGVkIGJ5IGNvbnRyb2xzIG9uIHRoaXMgcGFnZS4KLSAgICogICBAcGFyYW0gZSAgdGhlIGV2ZW50IHRvIGhhbmRsZQotICAgKi8KLSAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkKLSAgeyAKLSAgfQotCi0gIC8qKiAKLSAgICogVGhlIGluZGVudCBpcyBzdG9yZWQgaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBYTUwgU2NoZW1hIE1vZGVsCi0gICAqLwotICBwdWJsaWMgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKQotICB7Ci0gICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIHVzaW5nIGRlZmF1bHQgdmFsdWVzCi0gICAqIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpIAotICB7Ci0gICAgc2NoZW1hTnNQcmVmaXhGaWVsZC5zZXRUZXh0KGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRTdHJpbmcoWFNERWRpdG9yUGx1Z2luLkNPTlNUX1hTRF9ERUZBVUxUX1BSRUZJWF9URVhUKSk7Ci0gICAgcXVhbGlmeVhTRExhbmd1YWdlLnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0Qm9vbGVhbihYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0xBTkdVQUdFX1FVQUxJRlkpKTsKLSAgICBkZWZhdWx0VGFyZ2V0TmFtZXNwYWNlVGV4dC5zZXRUZXh0KGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhYU0RFZGl0b3JQbHVnaW4uQ09OU1RfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFKSk7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSAKLSAgewotICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICBzY2hlbWFOc1ByZWZpeEZpZWxkLnNldFRleHQoc3RvcmUuZ2V0U3RyaW5nKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfREVGQVVMVF9QUkVGSVhfVEVYVCkpOwotICAgIHF1YWxpZnlYU0RMYW5ndWFnZS5zZXRTZWxlY3Rpb24oc3RvcmUuZ2V0Qm9vbGVhbihYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0xBTkdVQUdFX1FVQUxJRlkpKTsKLSAgICBkZWZhdWx0VGFyZ2V0TmFtZXNwYWNlVGV4dC5zZXRUZXh0KHN0b3JlLmdldFN0cmluZyhYU0RFZGl0b3JQbHVnaW4uQ09OU1RfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFKSk7Ci0gIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKSAKLSAgewotICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotICAgIHN0b3JlLnNldFZhbHVlKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfREVGQVVMVF9QUkVGSVhfVEVYVCwgZ2V0WE1MU2NoZW1hUHJlZml4KCkpOwotICAgIHN0b3JlLnNldFZhbHVlKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfTEFOR1VBR0VfUVVBTElGWSwgZ2V0UXVhbGlmeSgpKTsKLSAgICBzdG9yZS5zZXRWYWx1ZShYU0RFZGl0b3JQbHVnaW4uQ09OU1RfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFLCBnZXRYTUxTY2hlbWFUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAKLSAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFhNTFNjaGVtYVByZWZpeCgpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gc2NoZW1hTnNQcmVmaXhGaWVsZC5nZXRUZXh0KCk7Ci0gICAgaWYgKHByZWZpeCA9PSBudWxsIHx8IHByZWZpeC5lcXVhbHMoIiIpKSAKLSAgICB7Ci0gICAgICByZXR1cm4gInhzZCI7Ci0gICAgfQotICAgIHJldHVybiBwcmVmaXg7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRRdWFsaWZ5KCkKLSAgewotICAgIHJldHVybiBxdWFsaWZ5WFNETGFuZ3VhZ2UuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHhtbCBzY2hlbWEgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFhNTFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpCi0gIHsKLSAgCVN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBkZWZhdWx0VGFyZ2V0TmFtZXNwYWNlVGV4dC5nZXRUZXh0KCk7Ci0gICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsIHx8IHRhcmdldE5hbWVzcGFjZS5lcXVhbHMoIiIpKSAKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLkRFRkFVTFRfVEFSR0VUX05BTUVTUEFDRTsKLSAgICB9Ci0gICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gY2hlY2tWYWx1ZXMoKQotICB7Ci0vLyBLQ1BvcnQgVE9ETyAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gVmFsaWRhdGVIZWxwZXIuY2hlY2tYTUxOYW1lKHNjaGVtYU5zUHJlZml4RmllbGQuZ2V0VGV4dCgpKTsKLQkgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0KLSAgICBpZiAoZXJyb3JNZXNzYWdlID09IG51bGwgfHwgZXJyb3JNZXNzYWdlLmxlbmd0aCgpID09IDApCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgc2V0VmFsaWQodHJ1ZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5fRVJST1JfTEFCRUxfSU5WQUxJRF9QUkVGSVgpOwotICAgICAgc2V0VmFsaWQoZmFsc2UpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEVmFsaWRhdG9yUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRFZhbGlkYXRvclByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1N2FlMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEVmFsaWRhdG9yUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5HcmlkRGF0YUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZUxpbmtBcmVhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5YU0RDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0RDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNvbnRleHRJZHM7Ci0KLQotcHVibGljIGNsYXNzIFhTRFZhbGlkYXRvclByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZQotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1ZBTElEQVRPUl9QUkVGRVJFTkNFX1BBR0VfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwudmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICBwcml2YXRlIEJ1dHRvbiBmdWxsU2NoZW1hQ29uZm9ybWFuY2UgPSBudWxsOwotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0gICAgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCi0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHBhcmVudCwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RQX1ZBTElEQVRPUl9QUkVGRVJFTkNFX1BBR0UpOwotCi0gICAgbmV3IFByZWZlcmVuY2VMaW5rQXJlYShjb21wb3NpdGUsIFNXVC5XUkFQIHwgU1dULk1VTFRJLCBYTUxfVkFMSURBVE9SX1BSRUZFUkVOQ0VfUEFHRV9JRCwgTWVzc2FnZXMuX1VJX1hNTF9WQUxJREFUT1JfUFJFRlNfTElOSywKLSAgICAgIChJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcilnZXRDb250YWluZXIoKSwgbnVsbCkuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmhpbnQoMTUwLCBTV1QuREVGQVVMVCkuY3JlYXRlKCkpOwotICAgIG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5zd3REZWZhdWx0cygpLmNyZWF0ZSgpKTsKLQotICAgIGNyZWF0ZUNvbnRlbnRzRm9yVmFsaWRhdGluZ0dyb3VwKGNvbXBvc2l0ZSk7Ci0KLSAgICBzZXRTaXplKGNvbXBvc2l0ZSk7Ci0gICAgbG9hZFByZWZlcmVuY2VzKCk7Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yVmFsaWRhdGluZ0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBHcm91cCB2YWxpZGF0aW5nR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDEpOwotICAgIHZhbGlkYXRpbmdHcm91cC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9WQUxJREFUSU5HX0ZJTEVTKTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCi0gICAgaWYgKGZ1bGxTY2hlbWFDb25mb3JtYW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGZ1bGxTY2hlbWFDb25mb3JtYW5jZSA9IG5ldyBCdXR0b24odmFsaWRhdGluZ0dyb3VwLCBTV1QuQ0hFQ0sgfCBTV1QuTEVGVCk7Ci0gICAgICBmdWxsU2NoZW1hQ29uZm9ybWFuY2Uuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuY29weURhdGEoZGF0YSkpOwotICAgICAgZnVsbFNjaGVtYUNvbmZvcm1hbmNlLnNldFRleHQoTWVzc2FnZXMuX1VJX0ZVTExfQ09ORk9STUFOQ0UpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpCi0gIHsKLSAgICBmdWxsU2NoZW1hQ29uZm9ybWFuY2Uuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihYU0RDb3JlUHJlZmVyZW5jZU5hbWVzLkZVTExfU0NIRU1BX0NPTkZPUk1BTkNFKSk7Ci0gICAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkKLSAgewotICAgIGluaXRpYWxpemVWYWx1ZXNGb3JWYWxpZGF0aW5nR3JvdXAoKTsKLSAgICBzdXBlci5pbml0aWFsaXplVmFsdWVzKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yVmFsaWRhdGluZ0dyb3VwKCkKLSAgewotICAgIGZ1bGxTY2hlbWFDb25mb3JtYW5jZS5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5GVUxMX1NDSEVNQV9DT05GT1JNQU5DRSkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKQotICB7Ci0gICAgcmV0dXJuIFhTRENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlc0ZvclZhbGlkYXRpbmdHcm91cCgpCi0gIHsKLSAgICBpZiAoZnVsbFNjaGVtYUNvbmZvcm1hbmNlICE9IG51bGwpCi0gICAgewotICAgICAgYm9vbGVhbiBmdWxsU2NoZW1hQ29uZm9ybWFuY2VTZWxlY3RlZCA9IGZ1bGxTY2hlbWFDb25mb3JtYW5jZS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIGdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYU0RDb3JlUHJlZmVyZW5jZU5hbWVzLkZVTExfU0NIRU1BX0NPTkZPUk1BTkNFLCBmdWxsU2NoZW1hQ29uZm9ybWFuY2VTZWxlY3RlZCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKQotICB7Ci0gICAgc3RvcmVWYWx1ZXNGb3JWYWxpZGF0aW5nR3JvdXAoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpCi0gIHsKLSAgICBYU0RDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IHN1cGVyLnBlcmZvcm1PaygpOwotCi0gICAgZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC90ZXh0L1hTRE1vZGVsQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdGV4dC9YU0RNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IyNTBhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC90ZXh0L1hTRE1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE1vbGxlciAtIGJyb2FkZXIgcmVjb2duaXRpb24gb2YgVVJJcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5Nb2RlbFJlY29uY2lsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RNb2RlbEFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIKLXsKLSAgcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHNjaGVtYTsKLSAgcHJpdmF0ZSBNb2RlbFJlY29uY2lsZUFkYXB0ZXIgbW9kZWxSZWNvbmNpbGVBZGFwdGVyOwotCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0U2NoZW1hKCkKLSAgewotICAgIHJldHVybiBzY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjbGVhcigpCi0gIHsKLQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJRG9jdW1lbnQgZG9jID0gc2NoZW1hLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnQpIHsKLQkJCUlET01Eb2N1bWVudCBkb21Eb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpZG9jOwotCQkJZG9tRG9jdW1lbnQuZ2V0TW9kZWwoKS5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoZ2V0TW9kZWxSZWNvbmNpbGVBZGFwdGVyKCkpOwotCQkJZG9tRG9jdW1lbnQucmVtb3ZlQWRhcHRlcihnZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKSk7Ci0JCQlkb21Eb2N1bWVudC5yZW1vdmVBZGFwdGVyKHRoaXMpOwkJCi0JCX0KLQkgICAgc2NoZW1hID0gbnVsbDsKLQl9Ci0gICAgcmVzb3VyY2VTZXQgPSBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgewotICAgIHJldHVybiB0eXBlID09IFhTRE1vZGVsQWRhcHRlci5jbGFzczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykKLSAgewotICB9Ci0gIAotICBwdWJsaWMgTW9kZWxSZWNvbmNpbGVBZGFwdGVyIGdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxSZWNvbmNpbGVBZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIFhTRFNjaGVtYSBjcmVhdGVTY2hlbWEoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsgICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gKGNzKSBub3RlIHRoYXQgd2UgYWx3YXlzIHdhbnQgdG8gZW5zdXJlIHRoYXQgYSAKLSAgICAgIC8vIHNjaGVtYSBtb2RlbCBvYmplY3QgZ2V0J3MgcmV0dXJuZWQKLSAgICAgIHNjaGVtYSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNjaGVtYSgpOwotICAgICAgcmVzb3VyY2VTZXQgPSBYU0RTY2hlbWFJbXBsLmNyZWF0ZVJlc291cmNlU2V0KCk7Ci0gICAgICByZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkoKSk7ICAgICAgICAgICAgICAgIAotCi0gICAgICBJRE9NTm9kZSBkb21Ob2RlID0gKElET01Ob2RlKWRvY3VtZW50OwotICAgICAgU3RyaW5nIGJhc2VMb2NhdGlvbiA9IGRvbU5vZGUuZ2V0TW9kZWwoKS5nZXRCYXNlTG9jYXRpb24oKTsgICAgICAgICAgIAotCi0gICAgICAvLyBUT0RPLi4uIGdvdHRhIHBlc3RlciBTU0UgZm9sa3MgdG8gcHJvdmlkZSAndXNlZnVsJyBiYXNlTG9jYXRpb25zCi0gICAgICAvLyAKLSAgICAgIFVSSSB1cmkgPSBnZXRVUkkoYmFzZUxvY2F0aW9uKTsKLQotICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgWFNEUmVzb3VyY2VJbXBsKCk7Ci0gICAgICByZXNvdXJjZS5zZXRVUkkodXJpKTsKLSAgICAgIHNjaGVtYSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNjaGVtYSgpOyAKLSAgICAgIHJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHNjaGVtYSk7Ci0gICAgICByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOyAgICAgCi0KLSAgICAgIHNjaGVtYS5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0gICAgICBmaW5hbCBFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgLy8gRm9yY2UgdGhlIGxvYWRpbmcgb2YgdGhlICJtZXRhIiBzY2hlbWEgZm9yIHNjaGVtYSBpbnN0YW5jZSBpbnN0YW5jZS4KLSAgICAgICAgLy8KLSAgICAgICAgU3RyaW5nIHNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSA9IGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKHNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSk7ICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICAgIAotICAgICAgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHNldEVsZW1lbnRPcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBVc2UgdGhlIGFuaW1hdGVkIGZsYXZvdXIgYXMgd2UgZG9uJ3Qga25vdyBiZWZvcmVoYW5kIGhvdyBtYW55IHRpY2tzIHdlIG5lZWQuCi0gICAgICAgICAgLy8gVGhlIHRhc2sgbmFtZSB3aWxsIGJlIGRpc3BsYXllZCBieSB0aGUgY29kZSBpbiBYU0RSZXNvdXJjZUltcGwuCi0gICAgICAgICAgCi0gICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soIiIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBNYXAgbG9hZE9wdGlvbnMgPSByZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpOwotICAgICAgICAgIGxvYWRPcHRpb25zLnB1dChYU0RSZXNvdXJjZUltcGwuWFNEX1BST0dSRVNTX01PTklUT1IsIG1vbml0b3IpOwotICAgICAgICAgIAotICAgICAgICAgIHNjaGVtYS5zZXRFbGVtZW50KGVsZW1lbnQpOwotICAgICAgICAgIAotICAgICAgICAgIGxvYWRPcHRpb25zLnJlbW92ZShYU0RSZXNvdXJjZUltcGwuWFNEX1BST0dSRVNTX01PTklUT1IpOwotICAgICAgICB9Ci0gICAgICB9OwotCi0gICAgICBJUHJvZ3Jlc3NTZXJ2aWNlIHByb2dyZXNzU2VydmljZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgcHJvZ3Jlc3NTZXJ2aWNlLmJ1c3lDdXJzb3JXaGlsZShzZXRFbGVtZW50T3BlcmF0aW9uKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0gICAgICAgCi0gICAgICAgIAotICAgICAgLy8gYXR0YWNoIGFuIGFkYXB0ZXIgdG8ga2VlcCB0aGUgWFNEIG1vZGVsIGFuZCBET00gaW4gc3luYwotICAgICAgLy8KLSAgICAgIG1vZGVsUmVjb25jaWxlQWRhcHRlciA9IG5ldyBYU0RNb2RlbFJlY29uY2lsZUFkYXB0ZXIoZG9jdW1lbnQsIHNjaGVtYSk7Ci0gICAgICBkb21Ob2RlLmdldE1vZGVsKCkuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKG1vZGVsUmVjb25jaWxlQWRhcHRlcik7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCi0gICAgewotICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiBzY2hlbWE7ICAgIAotICB9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBYU0RTY2hlbWEgY3JlYXRlU2NoZW1hKEVsZW1lbnQgZWxlbWVudCkKLSAgeyAgICAgCi0gICAgcmV0dXJuIGNyZWF0ZVNjaGVtYShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gIH0KLQotICBwdWJsaWMgWFNEU2NoZW1hIHJlc2V0U2NoZW1hKERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgLy8gVGhlIGRvY3VtZW50IGhhcyBjaGFuZ2VkIHNvIHRoZSBzY2hlbWEgc2hvdWxkIGJlIHVwZGF0ZWQgYXMgd2VsbC4KLSAgICB0cnkKLSAgICB7Ci0gICAgICBJRE9NTm9kZSBkb21Ob2RlID0gKElET01Ob2RlKWRvY3VtZW50OwotICAgICAgc2NoZW1hLnNldERvY3VtZW50KGRvY3VtZW50KTsKLSAgICAgIHNjaGVtYS5zZXRFbGVtZW50KGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpKTsKLQotICAgICAgcmVzb3VyY2VTZXQgPSBzY2hlbWEuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLSAgICAgIAotICAgICAgU3RyaW5nIGJhc2VMb2NhdGlvbiA9IGRvbU5vZGUuZ2V0TW9kZWwoKS5nZXRCYXNlTG9jYXRpb24oKTsgICAgICAgICAgIAotICAgICAgVVJJIHVyaSA9IGdldFVSSShiYXNlTG9jYXRpb24pOwotICAgICAgc2NoZW1hLmVSZXNvdXJjZSgpLnNldFVSSSh1cmkpOwotCi0gICAgICBtb2RlbFJlY29uY2lsZUFkYXB0ZXIgPSBuZXcgWFNETW9kZWxSZWNvbmNpbGVBZGFwdGVyKGRvY3VtZW50LCBzY2hlbWEpOwotICAgICAgZG9tTm9kZS5nZXRNb2RlbCgpLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcihtb2RlbFJlY29uY2lsZUFkYXB0ZXIpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIHNjaGVtYTsKLSAgfSAgCi0KLSAgcHVibGljIHN0YXRpYyBYU0RNb2RlbEFkYXB0ZXIgbG9va3VwT3JDcmVhdGVNb2RlbEFkYXB0ZXIoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBYU0RNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0gICAgaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikKLSAgICB7Ci0gICAgICBJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpZG9jdW1lbnQ7Ci0gICAgICBhZGFwdGVyID0gKFhTRE1vZGVsQWRhcHRlcilub3RpZmllci5nZXRBZGFwdGVyRm9yKFhTRE1vZGVsQWRhcHRlci5jbGFzcyk7Ci0gICAgICBpZiAoYWRhcHRlciA9PSBudWxsKQotICAgICAgewotICAgICAgICBhZGFwdGVyID0gbmV3IFhTRE1vZGVsQWRhcHRlcigpOwotICAgICAgICBub3RpZmllci5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotICAgICAgfSAKLSAgICB9ICAgCi0gICAgcmV0dXJuIGFkYXB0ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgWFNEU2NoZW1hIGxvb2t1cE9yQ3JlYXRlU2NoZW1hKGZpbmFsIERvY3VtZW50IGRvY3VtZW50KQotICB7ICAgIAotICAgIFhTRFNjaGVtYSByZXN1bHQgPSBudWxsOyAgICAKLSAgICBYU0RNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGxvb2t1cE9yQ3JlYXRlTW9kZWxBZGFwdGVyKGRvY3VtZW50KTsgICAgICAKLSAgICBpZiAoYWRhcHRlci5nZXRTY2hlbWEoKSA9PSBudWxsKQotICAgIHsgIAotICAgICAgCi0gICAgICBhZGFwdGVyLmNyZWF0ZVNjaGVtYShkb2N1bWVudCk7IAotICAgIH0gICAKLSAgICByZXN1bHQgPSBhZGFwdGVyLmdldFNjaGVtYSgpOyAgICAKLSAgICByZXR1cm4gcmVzdWx0OyAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSBVUkkgZ2V0VVJJKFN0cmluZyBiYXNlTG9jYXRpb24pCi0gIHsKLSAgICBVUkkgdXJpID0gbnVsbDsKLSAgICBpZiAoYmFzZUxvY2F0aW9uLnN0YXJ0c1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGJhc2VMb2NhdGlvbik7Ci0gICAgfQotICAgIGVsc2UgaWYgKGJhc2VMb2NhdGlvbi5pbmRleE9mKCc6JykgPiAxKQotICAgIHsKLSAgICAgIC8vIExvb2tzIGxpa2UgYW4gVVJMCi0gICAgICB1cmkgPSBVUkkuY3JlYXRlVVJJKGJhc2VMb2NhdGlvbik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBTdXBwb3NlZGx5IGEgZmlsZSwgdGhlbgotICAgICAgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkoYmFzZUxvY2F0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3RleHQvWFNETW9kZWxEZWxheWVkUmVjb25jaWxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdGV4dC9YU0RNb2RlbERlbGF5ZWRSZWNvbmNpbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYjdiNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdGV4dC9YU0RNb2RlbERlbGF5ZWRSZWNvbmNpbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudGV4dDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5VSUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5JbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogUHJvdmlkZXMgIGRlbGF5ZWQgcmVjb25jaWxpYXRpb24gYmV0d2VlbiB0aGUgU1NFIERPTSBhbmQgdGhlIFhTRCBFTUYgbW9kZWwuIAotICogQ2hhbmdlcyBpbiB0aGUgRE9NIGFyZSBxdWV1ZWQgYW5kIHByb2Nlc3NlZCBieSBhIFVJIGpvYi4gV2hlbiBhIG5ldyByZXF1ZXN0IAotICogY29tZXMgaW4sIHRoZSBjdXJyZW50IHJ1biBpcyBjYW5jZWxsZWQsIHRoZSBuZXcgcmVxdWVzdCBpcyBhZGRlZCB0byB0aGUgcXVldWUsIAotICogdGhlbiB0aGUgam9iIGlzIHJlLXNjaGVkdWxlZC4KLSAqLwotcHVibGljIGNsYXNzIFhTRE1vZGVsRGVsYXllZFJlY29uY2lsZXIKLXsKLSAgLyoqCi0gICAqIFRoZSBtb2RlbCByZWNvbmNpbGVyIGpvYi4KLSAgICovCi0gIHByaXZhdGUgUmVjb25jaWxlckpvYiByZWNvbmNpbGVySm9iOwotCi0gIC8qKgotICAgKiBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgdXBkYXRpbmcgdGhlIEVNRiBtb2RlbC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUxBWSA9IDMwMDsKLQotICAvKioKLSAgICogVGhlIGVsZW1lbnRzIHRvIHJlY29uY2lsZS4KLSAgICovCi0gIHByaXZhdGUgTGlzdCBlbGVtZW50c1RvUmVjb25jaWxlID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIC8qKgotICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBkZWxheWVkIHJlY29uY2lsZXIgc2hvdWxkIGtpY2sgaW4uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxheShYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgYm9vbGVhbiBzaG91bGREZWxheSA9IGZhbHNlOwotCi0gICAgLy8gVGhlIGRlbGF5ZWQgcmVjb25jaWxlciBzaG91bGQgbm90IGJlIHVzZWQgd2hlbiB0aGUgZWRpdG9yIGlzIGluIGdyYXBoaWNhbCBlZGl0aW5nIG1vZGUuCi0KLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFBhZ2UgIT0gbnVsbCA/IHdvcmtiZW5jaFBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCkgOiBudWxsOwotICAgIGlmIChlZGl0b3JQYXJ0ICE9IG51bGwgJiYgZWRpdG9yUGFydCBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKQotICAgIHsKLSAgICAgIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcillZGl0b3JQYXJ0OwotICAgICAgc2hvdWxkRGVsYXkgPSB4c2RFZGl0b3IuaXNTb3VyY2VQYWdlQWN0aXZlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNob3VsZERlbGF5OwotICB9Ci0KLSAgLyoqCi0gICAqIFVwZGF0ZXMgdGhlIFhTRCBFTUYgY29tcG9uZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIERPTSBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGNoYW5nZWQgZWxlbWVudC4KLSAgICogQHBhcmFtIHNjaGVtYSB0aGUgY29udGFpbmluZyBzY2hlbWEuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50IGVsZW1lbnQsIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBzeW5jaHJvbml6ZWQgKGVsZW1lbnRzVG9SZWNvbmNpbGUpCi0gICAgewotICAgICAgLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBzaG91bGQgYmUgc21hbGwgc28gYSBsaW5lYXIgc2VhcmNoIHNob3VsZCBiZSBmaW5lLgotCi0gICAgICBpZiAoIWVsZW1lbnRzVG9SZWNvbmNpbGUuY29udGFpbnMoZWxlbWVudCkpCi0gICAgICB7Ci0gICAgICAgIGVsZW1lbnRzVG9SZWNvbmNpbGUuYWRkKGVsZW1lbnQpOwotICAgICAgfQotCi0gICAgICBpZiAocmVjb25jaWxlckpvYiA9PSBudWxsKQotICAgICAgewotICAgICAgICByZWNvbmNpbGVySm9iID0gbmV3IFJlY29uY2lsZXJKb2Ioc2NoZW1hKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcmVjb25jaWxlckpvYi5zY2hlZHVsZShERUxBWSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEEgVUkgam9iIHVzZWQgdG8gcmVjb25jaWxlIHRoZSBYU0QgRU1GIG1vZGVsIHdpdGggdGhlIGFzc29jaWF0ZWQgU1NFIERPTS4KLSAgICovCi0gIGNsYXNzIFJlY29uY2lsZXJKb2IgZXh0ZW5kcyBVSUpvYgotICB7Ci0gICAgLyoqCi0gICAgICogVGhlIHRhcmdldCBzY2hlbWEuCi0gICAgICovCi0gICAgcHJpdmF0ZSBYU0RTY2hlbWEgc2NoZW1hOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyBhbGxvd2VkIHRvIHdha2UgdXAgYW5kIGRvIG5vdGhpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9JTkFDVElWRV9DT1VOVCA9IDEwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGpvYiB3aWxsIHRlcm1pbmF0ZSBvbmNlIHRoaXMgY291bnRlciByZWFjaGVzIE1BWF9JTkFDVElWRV9DT1VOVC4gCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgdGltZXNBd2FrZUFuZElkbGUgPSAwOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyB0aGUgcmVjb25jaWxlciBqb2IgYW5kIGNvbmZpZ3VyZXMgc29tZSBvZiBpdHMgcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVjb25jaWxlckpvYihYU0RTY2hlbWEgc2NoZW1hKQotICAgIHsKLSAgICAgIHN1cGVyKCJSZWNvbmNpbGluZyB0aGUgWFNEIEVNRiBtb2RlbCIpOyAvLyROT04tTkxTLTEkCi0gICAgICBzZXRTeXN0ZW0odHJ1ZSk7Ci0gICAgICBzZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0gICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICB7Ci0gICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLSAgICAgIH0KLQotICAgICAgRWxlbWVudFtdIGVsZW1lbnRzID0gbnVsbDsKLSAgICAgIAotICAgICAgc3luY2hyb25pemVkIChlbGVtZW50c1RvUmVjb25jaWxlKQotICAgICAgewotICAgICAgICBpZiAoIWVsZW1lbnRzVG9SZWNvbmNpbGUuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudHMgPSBuZXcgRWxlbWVudFtlbGVtZW50c1RvUmVjb25jaWxlLnNpemUoKV07Ci0gICAgICAgICAgZWxlbWVudHNUb1JlY29uY2lsZS50b0FycmF5KGVsZW1lbnRzKTsKLSAgICAgICAgICBlbGVtZW50c1RvUmVjb25jaWxlLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHNob3VsZFRlcm1pbmF0ZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlY29uY2lsZXJKb2IgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZWNvbmNpbGUoZWxlbWVudHMpOwotCi0gICAgICBzY2hlZHVsZShERUxBWSk7Ci0KLSAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWNvbmNpbGUoRWxlbWVudFtdIG1vZGlmaWVkRWxlbWVudHMpCi0gICAgewotICAgICAgaWYgKG1vZGlmaWVkRWxlbWVudHMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1vZGlmaWVkRWxlbWVudHMubGVuZ3RoOyBpbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBtb2RpZmllZEVsZW1lbnQgPSBtb2RpZmllZEVsZW1lbnRzW2luZGV4XTsKLQotICAgICAgICAgIHJlY29uY2lsZShtb2RpZmllZEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlY29uY2lsZShFbGVtZW50IG1vZGlmaWVkRWxlbWVudCkKLSAgICB7Ci0gICAgICBpZiAobW9kaWZpZWRFbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gc2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQobW9kaWZpZWRFbGVtZW50KTsKLSAgICAgICAgY29uY3JldGVDb21wb25lbnQuZWxlbWVudENoYW5nZWQobW9kaWZpZWRFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFRlcm1pbmF0ZSgpCi0gICAgewotICAgICAgcmV0dXJuIHRpbWVzQXdha2VBbmRJZGxlKysgPT0gTUFYX0lOQUNUSVZFX0NPVU5UOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3RleHQvWFNETW9kZWxRdWVyeUV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdGV4dC9YU0RNb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMTFhYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdGV4dC9YU0RNb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uLk1vZGVsUXVlcnlFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbS5Ob2RlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotcHVibGljIGNsYXNzIFhTRE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5kcyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uCi17Ci0gIHB1YmxpYyBYU0RNb2RlbFF1ZXJ5RXh0ZW5zaW9uKCkKLSAgewotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEF0dHJpYnV0ZVZhbHVlcyhFbGVtZW50IGUsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFN0cmluZyBjdXJyZW50RWxlbWVudE5hbWUgPSBlLmdldExvY2FsTmFtZSgpOwotICAgIE5vZGUgcGFyZW50Tm9kZSA9IGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgIFN0cmluZyBwYXJlbnROYW1lID0gcGFyZW50Tm9kZSAhPSBudWxsID8gcGFyZW50Tm9kZS5nZXRMb2NhbE5hbWUoKSA6ICIiOwotICAgIGlmIChjaGVja05hbWUobmFtZSwgInR5cGUiKSkKLSAgICB7Ci0gICAgICBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgImF0dHJpYnV0ZSIpKQotICAgICAgewotICAgICAgICBsaXN0ID0gZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QyKCk7Ci0gICAgICAgIGxpc3QuYWRkQWxsKGdldFR5cGVzSGVscGVyKGUpLmdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgImVsZW1lbnQiKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0MigpOwotICAgICAgICBsaXN0LmFkZEFsbChnZXRUeXBlc0hlbHBlcihlKS5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpKTsKLSAgICAgICAgbGlzdC5hZGRBbGwoZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KCkpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChjaGVja05hbWUobmFtZSwgIm1pbk9jY3VycyIpKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKCIwIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNoZWNrTmFtZShuYW1lLCAiaXRlbVR5cGUiKSkKLSAgICB7Ci0gICAgICBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgImxpc3QiKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoZWNrTmFtZShwYXJlbnROYW1lLCAic2ltcGxlVHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gICAgICAgICAgbGlzdC5hZGRBbGwoZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoY2hlY2tOYW1lKG5hbWUsICJtZW1iZXJUeXBlcyIpKQotICAgIHsKLSAgICAgIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAidW5pb24iKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoZWNrTmFtZShwYXJlbnROYW1lLCAic2ltcGxlVHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gICAgICAgICAgbGlzdC5hZGRBbGwoZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoY2hlY2tOYW1lKG5hbWUsICJiYXNlIikpCi0gICAgewotICAgICAgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJyZXN0cmljdGlvbiIpKQotICAgICAgewotICAgICAgICBpZiAoY2hlY2tOYW1lKHBhcmVudE5hbWUsICJzaW1wbGVUeXBlIikpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0ID0gZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgICAgICAgICBsaXN0LmFkZEFsbChnZXRUeXBlc0hlbHBlcihlKS5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaGVja05hbWUocGFyZW50TmFtZSwgInNpbXBsZUNvbnRlbnQiKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QgPSBnZXRUeXBlc0hlbHBlcihlKS5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICAgICAgICAgIGxpc3QuYWRkQWxsKGdldFR5cGVzSGVscGVyKGUpLmdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaGVja05hbWUocGFyZW50TmFtZSwgImNvbXBsZXhDb250ZW50IikpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0ID0gZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgICAgICAgICBsaXN0LmFkZEFsbChnZXRUeXBlc0hlbHBlcihlKS5nZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJleHRlbnNpb24iKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoZWNrTmFtZShwYXJlbnROYW1lLCAic2ltcGxlQ29udGVudCIpKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gICAgICAgICAgbGlzdC5hZGRBbGwoZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShwYXJlbnROYW1lLCAiY29tcGxleENvbnRlbnQiKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QgPSBnZXRUeXBlc0hlbHBlcihlKS5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICAgICAgICAgIGxpc3QuYWRkQWxsKGdldFR5cGVzSGVscGVyKGUpLmdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChjaGVja05hbWUobmFtZSwgInJlZiIpKQotICAgIHsKLSAgICAgIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAiZWxlbWVudCIpKQotICAgICAgewotICAgICAgICBsaXN0ID0gZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0R2xvYmFsRWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJhdHRyaWJ1dGUiKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEdsb2JhbEF0dHJpYnV0ZXMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJhdHRyaWJ1dGVHcm91cCIpKQotICAgICAgewotICAgICAgICBsaXN0ID0gZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0R2xvYmFsQXR0cmlidXRlR3JvdXBzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAiZ3JvdXAiKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldE1vZGVsR3JvdXBzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGNoZWNrTmFtZShuYW1lLCAic3Vic3RpdHV0aW9uR3JvdXAiKSkKLSAgICB7Ci0gICAgICBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgImVsZW1lbnQiKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEdsb2JhbEVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotICAgIGxpc3QudG9BcnJheShyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVDaGlsZEVsZW1lbnQoTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIGlmIChYU0RDb25zdGFudHMuQVBQSU5GT19FTEVNRU5UX1RBRy5lcXVhbHMocGFyZW50Tm9kZS5nZXROb2RlTmFtZSgpKSAmJgotICAgICAgICBYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgCi0gICAgLy8gd2UgYXNzdW1lIHRoYXQgb3RoZXIgbm9kZXMgZG9uJ3Qgd2FudCBzY2hlbWEgbm9kZXMgYXMgZXh0ZW5zaW9uIGVsZW1lbnRzCi0gICAgLy8gVE9ETy4uLiBjczogd2UgcmVhbGx5IG5lZWQgdG8gZGVmaW5lIGN1c3RpbWl6YXRpb25zIGZvciBmaWx0ZXJpbmcgYmFzZWQgb24gcGFyZW50L2NoaWxkCi0gICAgLy8gbmFtZXNwYWNlIHBhaXJzIHRvIGFjY3VyYXRlbHkgaGFuZGxlIHRoaXMgICAgCi0gICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lc3BhY2VVUkkgPSBwYXJlbnROb2RlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIGlmICghWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLmVxdWFscyhwYXJlbnRFbGVtZW50TmFtZXNwYWNlVVJJKSAmJgotICAgICAgICBYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgewotICAgICAgIHJldHVybiBmYWxzZTsgICAKLSAgICB9Ci0gICAgCi0gICAgaWYgKCFYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgeyAgCi0gICAgICBOb2RlRmlsdGVyIGZpbHRlciA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXROb2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5KCkuZ2V0Tm9kZUZpbHRlcihuYW1lc3BhY2UpOwotICAgICAgaWYgKGZpbHRlciAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm4gZmlsdGVyLmlzQXBwbGljYWJsZUNvbnRleHQocGFyZW50Tm9kZSwgTm9kZS5FTEVNRU5UX05PREUsIG5hbWVzcGFjZSwgbmFtZSk7Ci0gICAgICB9ICAgICAKLSAgICB9Ci0gICAgIAotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSBsb29rdXBPckNyZWF0ZVNjaGVtYShEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIHJldHVybiBYU0RNb2RlbEFkYXB0ZXIubG9va3VwT3JDcmVhdGVTY2hlbWEoZG9jdW1lbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIGxvb2t1cE9yQ3JlYXRlU2NoZW1hRm9yRWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gbG9va3VwT3JDcmVhdGVTY2hlbWEoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFR5cGVzSGVscGVyIGdldFR5cGVzSGVscGVyKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBsb29rdXBPckNyZWF0ZVNjaGVtYShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgcmV0dXJuIG5ldyBUeXBlc0hlbHBlcihzY2hlbWEpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tOYW1lKFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyB0b2tlbikKLSAgewotICAgIGlmIChsb2NhbE5hbWUgIT0gbnVsbCAmJiBsb2NhbE5hbWUudHJpbSgpLmVxdWFscyh0b2tlbikpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3RleHQvWFNETW9kZWxSZWNvbmNpbGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC90ZXh0L1hTRE1vZGVsUmVjb25jaWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGIwNjI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3RleHQvWFNETW9kZWxSZWNvbmNpbGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBFdWdlbmUgT3N0cm91a2hvdiwgZXVnZW5lQGdlbnVpdGVjLmNvbSAtIFsyMDMyOTFdIFhTRCBFZGl0b3IgU291cmNlIFN0YXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgdXBkYXRlZCBpbiBPdXRsaW5lL0dyYXBoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLk1vZGVsUmVjb25jaWxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWFNETW9kZWxSZWNvbmNpbGVBZGFwdGVyIGV4dGVuZHMgTW9kZWxSZWNvbmNpbGVBZGFwdGVyCi17Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hOwotICBwcm90ZWN0ZWQgWFNETW9kZWxEZWxheWVkUmVjb25jaWxlciBkZWxheWVkUmVjb25jaWxlcjsKLSAgCi0gIHB1YmxpYyBYU0RNb2RlbFJlY29uY2lsZUFkYXB0ZXIoRG9jdW1lbnQgZG9jdW1lbnQsIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBzdXBlcihkb2N1bWVudCk7Ci0gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gICAgdGhpcy5kZWxheWVkUmVjb25jaWxlciA9IG5ldyBYU0RNb2RlbERlbGF5ZWRSZWNvbmNpbGVyKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZU5vZGVDaGFuZ2VkKE5vZGUgbm9kZSkKLSAgewotICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBub2RlIGlzIGluIHRoZSBYU0QgU2NoZW1hIG5hbWVzcGFjZS4gV2UgZG9uJ3QgbmVlZCB0byAKLSAgICAvLyByZWNvbmNpbGUgdGhlIG1vZGVsIGZvciBvdGhlciBub2RlcyBsaWtlIHRleHQgb3Igbm9kZXMgaW4gb3RoZXIgbmFtZXNwYWNlcwotICAgIC8vIGxpa2UgdGhlIG9uZXMgbm9ybWFsbHkgb2NjdXJyaW5nIGluIGFubm90YXRpb25zLgotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICghc2hvdWxkUmVjb25jaWxlTW9kZWxGb3Iobm9kZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0KLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgeyAgCi0JCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQlpZiAoZGVsYXllZFJlY29uY2lsZXIuc2hvdWxkRGVsYXkoc2NoZW1hKSkKLQkJewotCQkJZGVsYXllZFJlY29uY2lsZXIuZWxlbWVudENoYW5nZWQoZWxlbWVudCwgc2NoZW1hKTsKLQkJfQotCQllbHNlCi0JCXsKLQkgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gc2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQobm9kZSk7Ci0JCQljb25jcmV0ZUNvbXBvbmVudC5lbGVtZW50Q2hhbmdlZChlbGVtZW50KTsKLQkJfQotCX0KLSAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpCi0gICAgewotICAgICAgLy8gVGhlIGRvY3VtZW50IGNoYW5nZWQgc28gd2UgbWF5IG5lZWQgdG8gZml4IHVwIHRoZSAKLSAgICAgIC8vIGRlZmluaXRpb24ncyByb290IGVsZW1lbnQKLSAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gKERvY3VtZW50KW5vZGU7ICAgIAotICAgICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICBpZiAoc2NoZW1hRWxlbWVudCAhPSBudWxsICYmIHNjaGVtYUVsZW1lbnQgIT0gc2NoZW1hLmdldEVsZW1lbnQoKSkKLSAgICAgIHsgICAKLSAgICAgICAgLy8gaGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYSBuZXcgJ3NjaGVtYScgZWxlbWVudCB3YXMgYWRkZWQKLSAgICAgICAgLy8oZS5nLiB0aGUgZmlsZSB3YXMgdG90YWxseSBibGFuayBhbmQgdGhlbiB3ZSB0eXBlIGluIHRoZSByb290IGVsZW1lbnQpICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgaWYgKHNjaGVtYUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfRUxFTUVOVF9UQUcpKSAgICAgICAgIAotICAgICAgICB7ICAKLSAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqKioqIFNldHRpbmcgbmV3IHNjaGVtYSIpOwotICAgICAgICAgIHNjaGVtYS5zZXRFbGVtZW50KHNjaGVtYUVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgCi0gICAgICBlbHNlIGlmIChzY2hlbWFFbGVtZW50ICE9IG51bGwpCi0gICAgICB7ICAgICAgIAotICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGRlZmluaXRpb24gZWxlbWVudCdzIGNvbnRlbnQgaGFzIGNoYW5nZWQKLSAgICAgICAgLy8gVE9ETyAoY3MpIGRvIHdlIHJlYWxseSBuZWVkIHRvIGhhbmRsZSB0aGlzIGNhc2U/Ci0gICAgICAgIHNjaGVtYS5lbGVtZW50Q2hhbmdlZChzY2hlbWFFbGVtZW50KTsKLSAgICAgIH0gICAgICAKLSAgICAgIGVsc2UgaWYgKHNjaGVtYUVsZW1lbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gaWYgdGhlcmUncyBubyByb290IGVsZW1lbnQgY2xlYXIgb3V0IHRoZSBzY2hlbWEKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDMyOTEKLSAgICAgICAgLy8gQWRkIHRyeS1jYXRjaCB0byB3b3JrLWFyb3VuZCBwcm9ibGVtIGF0IAotICAgICAgICAvLyBYU0RDb25jcmV0ZUNvbXBvbmVudEltcGwuZm9yY2VOaWNlUmVtb3ZlQ2hpbGQoWFNEQ29uY3JldGVDb21wb25lbnRJbXBsLmphdmE6MTY5NikKLSAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBzdGF0ZW1lbnRzIGJlbG93IGRvbid0IGdldCBydW4KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBzY2hlbWEuZ2V0Q29udGVudHMoKS5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gd29ya2Fyb3VuZAotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETyAoY3MpIEknbSBub3Qgc3VyZSB3aHkgdGhlIGFib3ZlIGlzbid0IGVub3VnaAotICAgICAgICAvLyB0byBjbGVhciBvdXQgYWxsIG9mIHRoZSBjb21wb25lbnQgbGlzdHMKLSAgICAgICAgLy8gZm9yIG5vdyBJJ3ZlIGp1c3QgYWRkZWQgYSBmZXcgbW9yZSBsaW5lcyB0byBkbyBhZGRpdGlvbmFsIGNsZWFyaW5nCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFNlZSBjb21tZW50IGFib3ZlIGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzMjkxCi0gICAgICAgIHRyeSB7IHNjaGVtYS5nZXRJbmNvcnBvcmF0ZWRWZXJzaW9ucygpLmNsZWFyKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IH0KLSAgICAgICAgdHJ5IHsgc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKS5jbGVhcigpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgICAgdHJ5IHsgc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpLmNsZWFyKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICB0cnkgeyBzY2hlbWEuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zKCkuY2xlYXIoKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIHRyeSB7IHNjaGVtYS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKS5jbGVhcigpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgICAgdHJ5IHsgc2NoZW1hLmdldEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMoKS5jbGVhcigpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30gICAgIAotICAgICAgICB0cnkgeyBzY2hlbWEuc2V0VGFyZ2V0TmFtZXNwYWNlKG51bGwpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgICAgdHJ5IHsgc2NoZW1hLnJlc2V0KCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCi0gICAgICAgIHNjaGVtYS5zZXRFbGVtZW50KG51bGwpOwotICAgICAgfSAgICAgIAotICAgIH0gCi0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIGlmIGEgY2hhbmdlIHRvIHRoZSBnaXZlbiBub2RlIHNob3VsZCB0cmlnZ2VyIGEgbW9kZWwgdXBkYXRlLgotICAgKiAKLSAgICogQHBhcmFtIGNoYW5nZWROb2RlCi0gICAqICAgICAgICAgIHRoZSBET00gbm9kZSB0byB0ZXN0LgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNoYW5nZSB0byB0aGUgZ2l2ZW4gbm9kZSBzaG91bGQgdHJpZ2dlciBhIG1vZGVsIHVwZGF0ZS4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3VsZFJlY29uY2lsZU1vZGVsRm9yKE5vZGUgY2hhbmdlZE5vZGUpCi0gIHsKLSAgICAvLyBObyBuZWVkIHRvIHJlY29uY2lsZSBpZiB0aGUgbm9kZSBpcyBpbiBhIGRpZmZlcmVudCBuYW1lc3BhY2UgYXMgaXQgaXMgdGhlCi0gICAgLy8gY2FzZSBmb3Igbm9kZXMgZGVlcGx5IG5lc3RlZCBpbiBhcHBpbmZvIG9yIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0KLSAgICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzMjkxCi0gICAgaWYgKGNoYW5nZWROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgU3RyaW5nIG5vZGVOYW1lc3BhY2UgPSBjaGFuZ2VkTm9kZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICBTdHJpbmcgc2NoZW1hTmFtZXNwYWNlID0gc2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSgpOwotICAgIC8vIElmIHRoZSBkb2N1bWVudCBub2RlIGNoYW5nZXMsIHRoZW4gdGhlIG5vZGVOYW1lc3BhY2UgaXMgbnVsbAotICAgIC8vIHNvIHdlIGRvIHdhbnQgdG8gcmVjb25jaWxlLiAgVGhpcyBjaGFuZ2UgaXMgbmVlZGVkIGZvcgotICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDg4NDIgYW5kCi0gICAgLy8gcmVhZCBvbmx5IGZpbGUgc3VwcG9ydC4KLSAgICBpZiAoIXNjaGVtYU5hbWVzcGFjZS5lcXVhbHMobm9kZU5hbWVzcGFjZSkgJiYgbm9kZU5hbWVzcGFjZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBXaGVuIGEgY2hpbGQgbm9kZSBpcyBhZGRlZCB0byBhbiBhcHBpbmZvIG9yIGRvY3VtZW50YXRpb24gZWxlbWVudAotICAgIC8vIE5vIG5lZWQgdG8gcmVjb25jaWxlIGlmIHRoZSBub2RlIGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBhcHBpbmZvIG9yIGRvY3VtZW50YXRpb24KLSAgICAvLyBlbGVtZW50cy4KLQotICAgIE5vZGUgcGFyZW50Tm9kZSA9IGNoYW5nZWROb2RlLmdldFBhcmVudE5vZGUoKTsKLQotICAgIGlmIChwYXJlbnROb2RlICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIG5vZGVOYW1lID0gY2hhbmdlZE5vZGUuZ2V0TG9jYWxOYW1lKCk7Ci0KLSAgICAgIGlmIChYU0RDb25zdGFudHMuQVBQSU5GT19FTEVNRU5UX1RBRy5lcXVhbHMobm9kZU5hbWUpIHx8IFhTRENvbnN0YW50cy5ET0NVTUVOVEFUSU9OX0VMRU1FTlRfVEFHLmVxdWFscyhub2RlTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkKLSAgewotICAgIGlmICghaXNEaXJ0eSkKLSAgICB7Ci0gICAgICAvLyBUT0RPIG5lZWQgYSB3YXkgdG8gdGVsbCB0aGUgdmlld3MgdG8gc3RvcCByZWZyZXNoaW5nICh0ZW1wb3JhcmlseSkKLSAgICAgIC8vCi0gICAgICAvKgotICAgICAgc2NoZW1hLnJlc2V0KCk7Ci0gICAgICAKLSAgICAgIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlIHJlZmVyZW5jZXMgZG9uJ3QgZ2V0IGZpeGVkIHVwIHdoZW4gYW4gaW1wb3J0IGlzIHJlbW92ZWQKLSAgICAgIC8vIGV2ZW4gaWYgd2UgY2FsbCBzY2hlbWEucmVzZXQoKSBleHBsaWN0bHkuICBUbyB3b3JrIGFyb3VuZCB0aGlzICB3ZSBpdGVyYXRlIHRocnUKLSAgICAgIC8vIHRoZSB0eXBlIHJlZmVyZW5jZXMgYW5kIHJlY29tcHV0ZSB0aGVtIGluY2FzZSBhIHNjaGVtYSBkaWQgaW5mYWN0IGNoYW5nZQotICAgICAgLy8KLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsgIAotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb25JbXBsIGVkID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbkltcGwpaS5uZXh0KCk7Ci0gICAgICAgIC8vZWQuZWxlbWVudEF0dHJpYnV0ZXNDaGFuZ2VkKGVkLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZWQuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgdGQgPSBlZC5yZXNvbHZlVHlwZURlZmluaXRpb24odGQuZ2V0U2NoZW1hKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHRkLmdldE5hbWUoKSk7ICAgICAgICAKLSAgICAgICAgZWQuc2V0VHlwZURlZmluaXRpb24odGQpOwotICAgICAgfSovICAKLSAgICB9Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvRG9jdW1lbnRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL0RvY3VtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzEzM2M1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvRG9jdW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1hYnN0cmFjdCBjbGFzcyBEb2N1bWVudEFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIKLXsKLSAgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0KLSAgcHVibGljIERvY3VtZW50QWRhcHRlcihEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKLSAgICAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5hZGRBZGFwdGVyKHRoaXMpOwotICAgIGFkYXB0Q2hpbGRFbGVtZW50cyhkb2N1bWVudCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYWRhcHRDaGlsZEVsZW1lbnRzKE5vZGUgcGFyZW50Tm9kZSkKLSAgewotICAgIGZvciAoTm9kZSBjaGlsZCA9IHBhcmVudE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpCi0gICAgewotICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIGFkYXB0KChFbGVtZW50KSBjaGlsZCk7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRhcHQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaWYgKCgoSU5vZGVOb3RpZmllcikgZWxlbWVudCkuZ2V0RXhpc3RpbmdBZGFwdGVyKHRoaXMpID09IG51bGwpCi0gICAgewotICAgICAgKChJTm9kZU5vdGlmaWVyKSBlbGVtZW50KS5hZGRBZGFwdGVyKHRoaXMpOwotICAgICAgYWRhcHRDaGlsZEVsZW1lbnRzKGVsZW1lbnQpOyAgCi0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgewotICAgIHJldHVybiB0eXBlID09IHRoaXM7Ci0gIH0KLQotICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KTsKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL01vZGVsUmVjb25jaWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9Nb2RlbFJlY29uY2lsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY4NTY3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL01vZGVsUmVjb25jaWxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbFN0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZGVsUmVjb25jaWxlQWRhcHRlciBleHRlbmRzIERvY3VtZW50QWRhcHRlciBpbXBsZW1lbnRzIElNb2RlbFN0YXRlTGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxpbmdOb3RpZnlDaGFuZ2VkID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCi0gIHB1YmxpYyBNb2RlbFJlY29uY2lsZUFkYXB0ZXIoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBzdXBlcihkb2N1bWVudCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb2RlQWRhcHRlciBsaXN0ZW5lcikKLSAgewotICAgIGlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLSAgICB7Ci0gICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICB9ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vZGVBZGFwdGVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0gIAotICAKLSAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGxpc3RlbmVycyk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIElOb2RlQWRhcHRlciBhZGFwdGVyID0gKElOb2RlQWRhcHRlcilpLm5leHQoKTsKLSAgICAgIGFkYXB0ZXIubm90aWZ5Q2hhbmdlZChub3RpZmllciwgZXZlbnRUeXBlLCBjaGFuZ2VkRmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwb3MpOwotICAgIH0gIAotICB9Ci0gICAgICAKLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkKLSAgewotICAgIGlmICghaGFuZGxpbmdOb3RpZnlDaGFuZ2VkKQotICAgIHsKLSAgICAgIGhhbmRsaW5nTm90aWZ5Q2hhbmdlZCA9IHRydWU7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaGFuZGxlTm90aWZ5Q2hhbmdlKG5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOwotICAgICAgICBub3RpZnlMaXN0ZW5lcnMobm90aWZpZXIsIGV2ZW50VHlwZSwgZmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0vLyAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKGUpOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICBoYW5kbGluZ05vdGlmeUNoYW5nZWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZU5vZGVDaGFuZ2VkKE5vZGUgbm9kZSkKLSAgeyAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaGFuZGxlTm90aWZ5Q2hhbmdlKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KQotICB7Ci0gICAgTm9kZSBub2RlID0gKE5vZGUpbm90aWZpZXI7Ci0gICAgc3dpdGNoIChldmVudFR5cGUpCi0gICAgewotICAgICAgY2FzZSBJTm9kZU5vdGlmaWVyLkFERDoKLSAgICAgIHsKLSAgICAgICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KW5ld1ZhbHVlOwotICAgICAgICAgIGFkYXB0KGVsZW1lbnQpOwotICAgICAgICB9ICAKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIElOb2RlTm90aWZpZXIuUkVNT1ZFOgotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgSU5vZGVOb3RpZmllci5DSEFOR0U6Ci0gICAgICBjYXNlIElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQ6Ci0gICAgICB7IAotICAgICAgICBoYW5kbGVOb2RlQ2hhbmdlZChub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAKLSAgICAgIGNhc2UgSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQ6Ci0gICAgICB7Ci0gICAgICAgIC8vIElmIHRoZSBvbmx5IHRoaW5nIGNoYW5nZWQgd2FzIHRoZSBjb250ZW50IG9mIGEgdGV4dCBub2RlCi0gICAgICAgIC8vIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byByZWNvbmNpbGUuCi0gICAgICAgIAotICAgICAgICBpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIFRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaGFuZGxlTm9kZUNoYW5nZWQobm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgICAgICAgICAgICAKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1vZGVsUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9TZWxlY3Rpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1NlbGVjdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMwNzg0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1NlbGVjdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VsZWN0aW9uQWRhcHRlciBpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlcgotewotICBwcm90ZWN0ZWQgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0gIHByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgZXZlbnRTb3VyY2U7Ci0KLSAgcHVibGljIHZvaWQgc2V0RXZlbnRTb3VyY2UoSVNlbGVjdGlvblByb3ZpZGVyIGV2ZW50U291cmNlKQotICB7Ci0gICAgdGhpcy5ldmVudFNvdXJjZSA9IGV2ZW50U291cmNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIAotICB7Ci0gICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0aW9uOwotICB9ICAgIAotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBzcGVjaWFsaXplZCB0byByZXR1cm4gdGhlIGNvcnJlY3Qgb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlICdvdGhlcicgbW9kZWwKLSAgICovCi0gIGFic3RyYWN0IHByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChPYmplY3Qgb2JqZWN0KTsKLQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBtb2RlbFNlbGVjdGlvbikgIAotICB7IAotICAgIExpc3Qgb3RoZXJNb2RlbE9iamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKG1vZGVsU2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbiltb2RlbFNlbGVjdGlvbikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG1vZGVsT2JqZWN0ID0gaS5uZXh0KCk7IAotICAgICAgICBPYmplY3Qgb3RoZXJNb2RlbE9iamVjdCA9IGdldE9iamVjdEZvck90aGVyTW9kZWwobW9kZWxPYmplY3QpOyAgICAgICAKLSAgICAgICAgaWYgKG90aGVyTW9kZWxPYmplY3QgIT0gbnVsbCkKLSAgICAgICAgeyAKLSAgICAgICAgICBvdGhlck1vZGVsT2JqZWN0TGlzdC5hZGQob3RoZXJNb2RlbE9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgCi0gICAgU3RydWN0dXJlZFNlbGVjdGlvbiBub2RlU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob3RoZXJNb2RlbE9iamVjdExpc3QpOwotICAgIHNlbGVjdGlvbiA9IG5vZGVTZWxlY3Rpb247Ci0gICAgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChldmVudFNvdXJjZSAhPSBudWxsID8gZXZlbnRTb3VyY2UgOiB0aGlzLCBub2RlU2VsZWN0aW9uKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3RlbmVyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcilpLm5leHQoKTsKLSAgICAgIGxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1R5cGVzSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1R5cGVzSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MzZmOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9UeXBlc0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RJbXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlc0hlbHBlcgotewotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBWZWN0b3IgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICBwdWJsaWMgVHlwZXNIZWxwZXIoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpCi0gIHsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgY29udGVudHMgPSB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGNvbnRlbnRzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RJbXBvcnRJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNESW1wb3J0SW1wbCBhbkltcG9ydCA9IChYU0RJbXBvcnRJbXBsKSBjb250ZW50OwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhbkltcG9ydC5nZXRTY2hlbWFMb2NhdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGFuSW1wb3J0LmltcG9ydFNjaGVtYSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvLyBUT0RPIFRoaXMgbWV0aG9kIGFuZCBpdCdzIHZlcnkgc2ltaWxhciBnZXRCdWlsdEluVHlwZU5hbWVzTGlzdDIgc2hvdWxkIAotICAvLyBiZSByZXZpZXdlZCBhbmQgY29tYmluZWQgaWYgcG9zc2libGUuIEJvdGggc2VlbSB0byBiZSB1c2VkIGZyb20gCi0gIC8vIFhTRE1vZGVsUXVlcnlFeHRlbnNpb24gZm9yIGNvbnRlbnQgYXNzaXN0IHB1cnBvc2VzLgotICAKLSAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCkKLSAgewotICAgIExpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBwcmVmaXggPSB4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoKTsKLSAgICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hIHNjaGVtYUZvclNjaGVtYSA9IFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYUZvclNjaGVtYS5nZXRTaW1wbGVUeXBlSWRNYXAoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IChYU0RUeXBlRGVmaW5pdGlvbikgaS5uZXh0KCk7ICAKLSAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gdGQuZ2V0TmFtZSgpOyAKLSAgICAgICAgICBTdHJpbmcgcHJlZml4ZWROYW1lID0gKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApID8gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lIDogbG9jYWxOYW1lOyAKLSAgICAgICAgICBpdGVtcy5hZGQocHJlZml4ZWROYW1lKTsgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIC8vIGlzc3VlIChjcykgZG8gd2Ugc3RpbGwgbmVlZCB0aGlzPyAgaXQgY2FuIGxpa2VseSBiZSByZW1vdmUgbm93Ci0gIC8vIHdhcyB1c2VkIGZvciBjb250ZW50IGFzc2lzdCBidXQgSSBkb24ndCB0aGluayB3ZSByZWFsbHkgbmVlZCBpdAotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QyKCkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IHByZWZpeGVzID0gZ2V0UHJlZml4ZXNGb3JOYW1lc3BhY2UoeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSgpKTsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWFGb3JTY2hlbWEgPSBYU0RTY2hlbWFJbXBsLmdldFNjaGVtYUZvclNjaGVtYShYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gc2NoZW1hRm9yU2NoZW1hLmdldFNpbXBsZVR5cGVJZE1hcCgpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOyAgCi0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSB0ZC5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBwcmVmaXhlcy5zaXplKCkgPiAwID8gKFN0cmluZylwcmVmaXhlcy5nZXQoMCkgOiBudWxsOwotICAgICAgICBTdHJpbmcgcHJlZml4ZWROYW1lID0gKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApID8gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lIDogbG9jYWxOYW1lOyAKLSAgICAgICAgcmVzdWx0LmFkZChwcmVmaXhlZE5hbWUpOyAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKQotICB7Ci0gICAgVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVFeHRlcm5hbEltcG9ydEdsb2JhbHMoKTsKLSAgICAgIEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGl0ZW1zLmFkZEFsbChnZXRQcmVmaXhlZE5hbWVzKHR5cGVEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCB0eXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaXRlbXMgPSAoVmVjdG9yKSBzb3J0TGlzdChpdGVtcyk7Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKQotICB7Ci0gICAgVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVFeHRlcm5hbEltcG9ydEdsb2JhbHMoKTsKLSAgICAgIEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLQkJCSAgICBpdGVtcy5hZGRBbGwoZ2V0UHJlZml4ZWROYW1lcyh0eXBlRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgdHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKSk7ICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGl0ZW1zID0gKFZlY3Rvcikgc29ydExpc3QoaXRlbXMpOwotICAgIH0KLSAgICByZXR1cm4gaXRlbXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRVc2VyU2ltcGxlVHlwZXMoKQotICB7Ci0gICAgVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVFeHRlcm5hbEltcG9ydEdsb2JhbHMoKTsKLSAgICAgIEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGl0ZW1zLmFkZCh0eXBlRGVmaW5pdGlvbik7Ci0gICAgICAgICAgLy9pdGVtcy5hZGQodHlwZURlZmluaXRpb24uZ2V0UU5hbWUoeHNkU2NoZW1hKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIFdlIG5lZWQgdG8gYWRkIHRoZSBhbnlUeXBlCi0vLyAgICAgIGl0ZW1zLmFkZChnZXRQcmVmaXgoeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSgpLCB0cnVlKSArICJhbnlUeXBlIik7Ci0gICAgICAKLSAgICAgIC8vICAgICAgaXRlbXMgPSBhZGRFeHRlcm5hbEltcG9ydGVkVXNlclNpbXBsZVR5cGVzKGl0ZW1zKTsKLSAgICAgIC8vaXRlbXMgPSAoVmVjdG9yKSBzb3J0TGlzdChpdGVtcyk7Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBucywgYm9vbGVhbiB3aXRoQ29sb24pCi0gIHsKLSAgICBTdHJpbmcga2V5ID0gIiI7Ci0KLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgTWFwIG1hcCA9IHhzZFNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICBJdGVyYXRvciBpdGVyID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBrZXlPYmogPSBpdGVyLm5leHQoKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbWFwLmdldChrZXlPYmopOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS50b1N0cmluZygpLmVxdWFscyhucykpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoa2V5T2JqICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAga2V5ID0ga2V5T2JqLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBrZXkgPSAiIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICgha2V5LmVxdWFscygiIikpCi0gICAgICB7Ci0gICAgICAgIGlmICh3aXRoQ29sb24pCi0gICAgICAgIHsKLSAgICAgICAgICBrZXkgPSBrZXkgKyAiOiI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGtleTsKLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRHbG9iYWxFbGVtZW50cygpCi0gIHsKLSAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgaWYgKHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudERlY2xhcmF0aW9uLmdldFFOYW1lKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpdGVtcy5hZGQobmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyAgICAgIGl0ZW1zID0gYWRkRXh0ZXJuYWxJbXBvcnRlZEdsb2JhbEVsZW1lbnRzKGl0ZW1zKTsKLSAgICAgIGl0ZW1zID0gKFZlY3Rvcikgc29ydExpc3QoaXRlbXMpOwotICAgIH0KLSAgICByZXR1cm4gaXRlbXM7Ci0gIH0KLQotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0R2xvYmFsQXR0cmlidXRlcygpCi0gIHsKLSAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgaWYgKHhzZFNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpID0geHNkU2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZURlY2xhcmF0aW9uID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICBpZiAoYXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPT0gbnVsbCB8fCAoYXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCAmJiAhYXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfSU5TVEFOQ0VfVVJJXzIwMDEpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldFFOYW1lKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpdGVtcy5hZGQobmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyAgICAgIGl0ZW1zID0gYWRkRXh0ZXJuYWxJbXBvcnRlZEF0dHJpYnV0ZXMoaXRlbXMpOwotICAgICAgaXRlbXMgPSAoVmVjdG9yKSBzb3J0TGlzdChpdGVtcyk7Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRHbG9iYWxBdHRyaWJ1dGVHcm91cHMoKQotICB7Ci0gICAgVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVFeHRlcm5hbEltcG9ydEdsb2JhbHMoKTsKLSAgICAgIGlmICh4c2RTY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5nZXRRTmFtZSh4c2RTY2hlbWEpOwotICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXRlbXMuYWRkKG5hbWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gICAgICBpdGVtcyA9IGFkZEV4dGVybmFsSW1wb3J0ZWRBdHRyaWJ1dGVHcm91cHMoaXRlbXMpOwotICAgICAgaXRlbXMgPSAoVmVjdG9yKSBzb3J0TGlzdChpdGVtcyk7Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRNb2RlbEdyb3VwcygpCi0gIHsKLSAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgaWYgKHhzZFNjaGVtYS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpID0geHNkU2NoZW1hLmdldE1vZGVsR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWZpbml0aW9uID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9IG1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFFOYW1lKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpdGVtcy5hZGQobmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyAgICAgIGl0ZW1zID0gYWRkRXh0ZXJuYWxJbXBvcnRlZEdyb3VwcyhpdGVtcyk7Ci0gICAgICBpdGVtcyA9IChWZWN0b3IpIHNvcnRMaXN0KGl0ZW1zKTsKLSAgICB9Ci0gICAgcmV0dXJuIGl0ZW1zOwotICB9Ci0KLSAgLy8gaXNzdWUgKGNzKSBzc2VtcyBsaWtlIGEgcmF0aGVyIGdvb2Z5IHV0aWwgbWV0aG9kPwotICBwdWJsaWMgc3RhdGljIGphdmEudXRpbC5MaXN0IHNvcnRMaXN0KGphdmEudXRpbC5MaXN0IHR5cGVzKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb25zLnNvcnQodHlwZXMpOyAvLyBwZXJmb3JtYW5jZT8gIG4qbG9nKG4pCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0vLyAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZSgiU29ydCBmYWlsZWQiKTsKLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVzOwotICB9Ci0KLSAgLy8gaXNzdWUgKGNzKSBkbyB3ZSBzdGlsbCBuZWVkIHRoaXM/Ci0gIHB1YmxpYyB2b2lkIHVwZGF0ZU1hcEFmdGVyRGVsZXRlKFhTREltcG9ydCBkZWxldGVkTm9kZSkKLSAgewotICAgIFN0cmluZyBucyA9IGRlbGV0ZWROb2RlLmdldE5hbWVzcGFjZSgpOwotICAgIGlmIChucyAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXgobnMsIGZhbHNlKTsKLSAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gcHJlZml4LnRyaW0oKTsKLSAgICAgIH0KLSAgICAgIFN0cmluZyB4bWxuc0F0dHIgPSAocHJlZml4ID09ICIiKSA/ICJ4bWxucyIgOiAieG1sbnM6IiArIHByZWZpeDsKLQotICAgICAgaWYgKHByZWZpeCA9PSAiIikKLSAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gbnVsbDsKLSAgICAgIH0KLQotICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgICAgewotICAgICAgICBNYXAgbWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgICAgbWFwLnJlbW92ZShwcmVmaXgpOwotICAgICAgICBFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgICAgICBzY2hlbWFFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSh4bWxuc0F0dHIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFByZWZpeGVkTmFtZXMoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgewotICAgICAgbmFtZXNwYWNlID0gIiI7ICAgIAkJCQotICAgIH0KLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwgJiYgbG9jYWxOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBwcmVmaXhlcyA9IGdldFByZWZpeGVzRm9yTmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwcmVmaXhlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgCVN0cmluZyBwcmVmaXggPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgCWlmIChwcmVmaXggPT0gbnVsbCkgcHJlZml4ID0gIiI7Ci0gICAgICAgIFN0cmluZyBwcmVmaXhlZE5hbWUgPSBwcmVmaXgubGVuZ3RoKCkgPiAwID8gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lIDogbG9jYWxOYW1lOwotICAgICAgICBsaXN0LmFkZChwcmVmaXhlZE5hbWUpOyAgICAgICAgICAgICAgIAotICAgICAgfQotICAgICAgaWYgKHByZWZpeGVzLnNpemUoKSA9PSAwKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChsb2NhbE5hbWUpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0UHJlZml4ZXNGb3JOYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBNYXAgbWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgIE9iamVjdCB2YWx1ZSA9IG1hcC5nZXQocHJlZml4KTsKLSAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRvU3RyaW5nKCkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICB7Ci0gICAgICAgbGlzdC5hZGQocHJlZml4KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvVmlld1V0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvVmlld1V0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1YWMzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1ZpZXdVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLy8gaXNzdWUgKGNzKSBjYW4gd2UgZ2V0IHJpZCBvZiB0aGlzIGNsYXNzPwotLy8gSSd2ZSBzdHJpcHBlZCBpdCBkb3duIGEgd2hvbGUgbG90Li4uIGJ1dCBpdCdkIGJlIGdyZWF0IHRvIGdldCByaWQgb2YgaXQKLS8vCi1wdWJsaWMgY2xhc3MgVmlld1V0aWxpdHkKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgRm9udCBmb250OwotCi0gIHByaXZhdGUgc3RhdGljIEZvbnQgZ2V0Rm9udCgpCi0gIHsKLSAgICBpZiAoZm9udCA9PSBudWxsKQotICAgIHsgICAgICAgICAgICAgIAotICAgICAgZm9udCA9IG5ldyBGb250KERpc3BsYXkuZ2V0Q3VycmVudCgpLCAibXMgc2FucyBzZXJpZiIsIDgsIFNXVC5OT1JNQUwpOyAgCi0gICAgfQotICAgIHJldHVybiBmb250OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbXBvc2l0ZShDb21wb3NpdGUgY29tcCkKLSAgewotICAgIC8vIGRlcHJlY2F0ZWQuICBSZW1vdmUgbGF0ZXIKLSAgfQotICBwdWJsaWMgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotICAgIGNvbXBvc2l0ZS5zZXRGb250KGdldEZvbnQoKSk7Ci0KLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMsIGJvb2xlYW4gaG9yaXpvbnRhbEZpbGwpCi0gIHsKLSAgICBpZiAoIWhvcml6b250YWxGaWxsKQotICAgIHsKLSAgICAgIGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIG51bUNvbHVtbnMpOwotICAgIH0KLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgY29tcG9zaXRlLnNldEZvbnQoZ2V0Rm9udCgpKTsKLQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUhvcml6b250YWxGaWxsZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IGhvcml6b250YWxTcGFuKSAKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBsYWJlbDsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIGZvciBjcmVhdGluZyBsYWJlbHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSAKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotICAgIGxhYmVsLnNldFRleHQodGV4dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBsYWJlbDsKLSAgfQotCi0JcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3RyaW5nIHRleHQpCi0JewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIHN0eWxlKTsKLS8vCQlzZXRDb2xvcihsYWJlbCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotICAKLSAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IGFsaWdubWVudCkKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotICAgIGxhYmVsLnNldFRleHQodGV4dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gYWxpZ25tZW50OwotICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgcmV0dXJuIGxhYmVsOwotICB9Ci0KLSAKLQotCi0gIC8qKgotICAgKiBDcmVhdGUgcmFkaW8gYnV0dG9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyk7Ci0gICAgYnV0dG9uLnNldFRleHQobGFiZWwpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciBtZXRob2QgZm9yIGNyZWF0aW5nIGNoZWNrIGJveAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSAKLSAgewotICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICBidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVDb21ib0JveChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNvbWJvQm94KHBhcmVudCwgdHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZUNvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gaXNSZWFkT25seSkKLSAgewotICAgIGludCBzdHlsZSA9IGlzUmVhZE9ubHkgPT0gdHJ1ZSA/IFNXVC5SRUFEX09OTFkgOiBTV1QuRFJPUF9ET1dOOwotCi0gICAgQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBzdHlsZSk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgcmV0dXJuIGNvbWJvOwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCkKLSAgewotICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLndpZHRoSGludCA9IHdpZHRoOwotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgLyoqCi0gICAqIDxjb2RlPmNyZWF0ZVdyYXBwZWRNdWx0aVRleHRGaWVsZDwvY29kZT4gY3JlYXRlcyBhIHdyYXBwZWQgbXVsdGl0ZXh0IGZpZWxkCi0gICAqCi0gICAqIEBwYXJhbSBwYXJlbnQgYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHZhbHVlCi0gICAqIEBwYXJhbSB3aWR0aCBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlCi0gICAqIEBwYXJhbSBudW1MaW5lcyBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIHJlcHJlc2VudGluZyBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBoZWlnaHQKLSAgICogQHBhcmFtIHZlcnRpY2FsRmlsbCBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0gICAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiB2YWx1ZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVdyYXBwZWRNdWx0aVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGgsIGludCBudW1MaW5lcywgYm9vbGVhbiB2ZXJ0aWNhbEZpbGwpCi0gIHsKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGlmICh2ZXJ0aWNhbEZpbGwpCi0gICAgewotICAgICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICB9ICAgICAgCi0gICAgZGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLSAgICBGb250RGF0YVtdIGZvbnREYXRhID0gZ2V0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0gICAgLy8gaGFjayBmb3Igbm93IHdoZXJlIG9uIFdpbmRvd3MsIG9ubHkgMSBmb250ZGF0YSBleGlzdHMKLSAgICBkYXRhLmhlaWdodEhpbnQgPSBudW1MaW5lcyAqIGZvbnREYXRhWzBdLmdldEhlaWdodCgpOwotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZU11bHRpVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiB2ZXJ0aWNhbEZpbGwpCi0gIHsKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBpZiAodmVydGljYWxGaWxsKQotICAgIHsKLSAgICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgfSAgICAgIAotICAgIGRhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0gICAgZGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiB0ZXh0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1hTRERPTUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9YU0RET01IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4Yzg0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1hTRERPTUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vLyBpc3N1ZSAoY3MpIHJlbW92ZSB0aGlzIGNsYXNzISEKLXB1YmxpYyBjbGFzcyBYU0RET01IZWxwZXIKLXsKLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWE1MU2NoZW1hVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFhTRERPTUhlbHBlci4KLSAgICovCi0gIHB1YmxpYyBYU0RET01IZWxwZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBOb2RlIGdldENoaWxkTm9kZShFbGVtZW50IHBhcmVudCwgU3RyaW5nIGNoaWxkTmFtZSkKLSAgewotLyogICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhYTUxTY2hlbWFVUkksIGNoaWxkTmFtZSk7Ci0gICAgaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkKLSAgICAgIHJldHVybiBub2RlTGlzdC5pdGVtKDApOwotICAgIHJldHVybiBudWxsOwotKi8KLSAgICBOb2RlTGlzdCBsaXN0ID0gbnVsbDsKLSAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgfQotCi0gICAgaWYgKGxpc3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBQZXJmb3JtYW5jZSBpc3N1ZSBwZXJoYXBzPwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChsaXN0Lml0ZW0oaSkgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGxpc3QuaXRlbShpKS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoY2hpbGROYW1lKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5pdGVtKGkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0KLQotCi0gIHB1YmxpYyB2b2lkIGNoYW5nZURlcml2ZWRCeVR5cGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZGVyaXZlZEJ5VHlwZSwgU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBEb2N1bWVudCBkb2MgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQotICAgIFN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldFByZWZpeCgpOwotICAgIHByZWZpeCA9IHByZWZpeCA9PSBudWxsID8gIiIgOiBwcmVmaXggKyAiOiI7Ci0KLSAgICBFbGVtZW50IGRlcml2ZWRCeUVsZW1lbnQgPSBnZXREZXJpdmVkQnlFbGVtZW50KGVsZW1lbnQpOwotICAgIAotICAgIGlmIChkZXJpdmVkQnlFbGVtZW50ICE9IG51bGwgJiYgZGVyaXZlZEJ5RWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoZGVyaXZlZEJ5VHlwZSkpCi0gICAgewotICAgIAlyZXR1cm47IC8vIGl0J3MgYWxyZWFkeSB0aGUgZGVyaXZlZCBieSB0eXBlCi0gICAgfQotICAgIEVsZW1lbnQgbmV3Tm9kZTsKLSAgCWlmIChkZXJpdmVkQnlUeXBlLmVxdWFscygicmVzdHJpY3Rpb24iKSkKLSAgCXsKLSAgICAJbmV3Tm9kZSA9IGRvYy5jcmVhdGVFbGVtZW50TlMoWFNERE9NSGVscGVyLlhNTFNjaGVtYVVSSSwgcHJlZml4ICsgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAJbmV3Tm9kZSA9IGRvYy5jcmVhdGVFbGVtZW50TlMoWFNERE9NSGVscGVyLlhNTFNjaGVtYVVSSSwgcHJlZml4ICsgWFNEQ29uc3RhbnRzLkVYVEVOU0lPTl9FTEVNRU5UX1RBRyk7Ci0gICAgfQotCQotICAgIG5ld05vZGUuc2V0QXR0cmlidXRlKCJiYXNlIiwgdHlwZSk7Ci0KLSAgICBpZiAoZGVyaXZlZEJ5RWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChkZXJpdmVkQnlFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkKLSAgICAgIHsgICAgICAgIAotICAgICAgICBOb2RlTGlzdCBub2RlcyA9IGRlcml2ZWRCeUVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAvLyB1c2UgY2xvbmVzIHNvIHdlIGRvbid0IGhhdmUgYSByZWZyZXNoIHByb2JsZW0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsgICAgICAgCi0gICAgICAgICAgbmV3Tm9kZS5hcHBlbmRDaGlsZChub2RlLmNsb25lTm9kZSh0cnVlKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQkgIGVsZW1lbnQucmVwbGFjZUNoaWxkKG5ld05vZGUsIGRlcml2ZWRCeUVsZW1lbnQpOwotICAgIH0KLSAgICBlbHNlIAotCXsKLQkJRWxlbWVudCBwYXJlbnQgPSAoRWxlbWVudCkgZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7CQkJCS8vIGdldCBiYWNrIHRvIGNvbXBsZXhUeXBlCi0gICAgICAgIE5vZGVMaXN0IG5vZGVzID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJQXJyYXlMaXN0IG5vZGVTYXZlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCS8vIHNhdmUgY2hpbGRyZW4uIChub2RlcyB0dXJucyBvdXQgdG8gYmUgdGhlIHNhbWUgb2JqZWN0IGFzIHBhcmVudDsKLQkJLy8gZGVsZXRpbmcgdGhlbSBmcm9tIHBhcmVudCB3aWxsIGRlbGV0ZSB0aGVtIGZyb20gbm9kZXMuKQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspCQkJCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOyAgICAgIAotCQkgIG5vZGVTYXZlTGlzdC5hZGQobm9kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW1vdmUgY2hpbGRyZW4gc28gd2UgY2FuIHN1cnJvdW5kIHRoZW0gYnkgY29tcGxleENvbnRlbnQKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlU2F2ZUxpc3Quc2l6ZSgpOyBpKyspCQkJCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgbm9kZVNhdmVMaXN0LmdldChpKTsgICAgICAKLSAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7Ci0gICAgICAgIH0KLQkJCi0JCS8vIGJ1aWxkIGEgY29tcGxleENvbnRlbnQgZWxlbWVudAotCQlFbGVtZW50IGNvbXBsZXhDb250ZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhYU0RET01IZWxwZXIuWE1MU2NoZW1hVVJJLCBwcmVmaXggKyBYU0RDb25zdGFudHMuQ09NUExFWENPTlRFTlRfRUxFTUVOVF9UQUcpOwotCQlwYXJlbnQuYXBwZW5kQ2hpbGQoY29tcGxleENvbnRlbnQpOwkJCQkJLy8gaW5zZXJ0IGludG8gY29tcGxleFR5cGUKLQkJY29tcGxleENvbnRlbnQuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7CQkJCS8vIGluc2VydCBkZXJpdmF0aW9uIHR5cGUKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlU2F2ZUxpc3Quc2l6ZSgpOyBpKyspCQkJLy8gaW5zZXJ0IGNoaWxkcmVuIHByZXZpb3VzbHkgb2YgY29tcGxleFR5cGUKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBub2RlU2F2ZUxpc3QuZ2V0KGkpOyAgICAgICAKLSAgICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsKLSAgICAgICAgfQotCQkKLQkJcGFyZW50LmFwcGVuZENoaWxkKGNvbXBsZXhDb250ZW50KTsKLQkJZm9ybWF0Q2hpbGQoY29tcGxleENvbnRlbnQpOwotICAgIH0KLSAgfQotCi0gIAotICAvKioKLSAgICogR2V0IHRoZSBkZXJpdmVkIGJ5IG5vZGUgZ2l2ZW4gdGhlIGNvbXBsZXhDb250ZW50IG9yIHNpbXBsZUNvbnRlbnQgbm9kZQotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0RGVyaXZlZEJ5RWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBOb2RlIHJlc3RyaWN0aW9uQ2hpbGQgPSBnZXRDaGlsZE5vZGUoZWxlbWVudCwgInJlc3RyaWN0aW9uIik7Ci0gICAgTm9kZSBleHRlbnNpb25DaGlsZCA9IGdldENoaWxkTm9kZShlbGVtZW50LCAiZXh0ZW5zaW9uIik7Ci0gICAgaWYgKHJlc3RyaWN0aW9uQ2hpbGQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAocmVzdHJpY3Rpb25DaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoRWxlbWVudClyZXN0cmljdGlvbkNoaWxkOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoZXh0ZW5zaW9uQ2hpbGQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZXh0ZW5zaW9uQ2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICByZXR1cm4gKEVsZW1lbnQpZXh0ZW5zaW9uQ2hpbGQ7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAKLSAgcHVibGljIEVsZW1lbnQgZ2V0RGVyaXZlZEJ5RWxlbWVudEZyb21TaW1wbGVUeXBlKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIE5vZGUgYXRvbWljID0gZ2V0Q2hpbGROb2RlKGVsZW1lbnQsICJyZXN0cmljdGlvbiIpOwotICAgIE5vZGUgbGlzdCA9IGdldENoaWxkTm9kZShlbGVtZW50LCAibGlzdCIpOwotICAgIE5vZGUgdW5pb24gPSBnZXRDaGlsZE5vZGUoZWxlbWVudCwgInVuaW9uIik7Ci0gICAgaWYgKGF0b21pYyBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JICB7Ci0JICAgIHJldHVybiAoRWxlbWVudClhdG9taWM7Ci0JICB9Ci0gICAgaWYgKGxpc3QgaW5zdGFuY2VvZiBFbGVtZW50KQotCSAgewotCSAgICByZXR1cm4gKEVsZW1lbnQpbGlzdDsKLQkgIH0KLSAgICBpZiAodW5pb24gaW5zdGFuY2VvZiBFbGVtZW50KQotCSAgewotCSAgICByZXR1cm4gKEVsZW1lbnQpdW5pb247Ci0JICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBkZXJpdmVkIGJ5IG5vZGUgZ2l2ZW4gdGhlIENvbXBsZXhUeXBlIG5vZGUKLSAgICogUmV0dXJucyB0aGUgZmlyc3Qgb25lLCBpZiBzYXksIHRoZSBJTlZBTElEIHNjaGVtYSBoYXMgbW9yZSB0aGFuIG9uZQotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0RGVyaXZlZEJ5RWxlbWVudEZyb21Db21wbGV4VHlwZShFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBOb2RlTGlzdCBubCA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBqID0gMDsKLSAgICBmb3IgKGogPSAwOyBqIDwgbmwuZ2V0TGVuZ3RoKCk7IGorKykKLSAgICB7Ci0gICAgICBOb2RlIGFOb2RlID0gbmwuaXRlbShqKTsKLSAgICAgIGlmIChpbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOyAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGFOb2RlLCBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgRWxlbWVudCBkZXJpdmVkQnlOb2RlID0gZ2V0RGVyaXZlZEJ5RWxlbWVudCgoRWxlbWVudClubC5pdGVtKGopKTsKLSAgICByZXR1cm4gZGVyaXZlZEJ5Tm9kZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvbnRlbnQgbW9kZWwgZ2l2ZW4gdGhlIENvbXBsZXhUeXBlIG5vZGUKLSAgICogUmV0dXJucyB0aGUgZmlyc3Qgb25lLCBpZiBzYXksIHRoZSBJTlZBTElEIHNjaGVtYSBoYXMgbW9yZSB0aGFuIG9uZQotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0Q29udGVudE1vZGVsRnJvbVBhcmVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBOb2RlTGlzdCBubCA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBqID0gMDsKLSAgICBib29sZWFuIG1vZGVsRXhpc3RzID0gZmFsc2U7Ci0gICAgaW50IGxlbmd0aCA9IG5sLmdldExlbmd0aCgpOwotICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGg7IGorKykKLSAgICB7Ci0gICAgICBOb2RlIGFOb2RlID0gbmwuaXRlbShqKTsKLSAgICAgIGlmIChpbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7IAotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoYU5vZGUsIFhTRENvbnN0YW50cy5TSU1QTEVDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLlNFUVVFTkNFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLkNIT0lDRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBtb2RlbEV4aXN0cyA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoYU5vZGUsIFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgIHsKLSAgICAgICAgbW9kZWxFeGlzdHMgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFtb2RlbEV4aXN0cykKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBFbGVtZW50IGRlcml2ZWRCeU5vZGUgPSAoRWxlbWVudClubC5pdGVtKGopOwotICAgIHJldHVybiBkZXJpdmVkQnlOb2RlOwotICB9Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2hhbmdlQ29udGVudE1vZGVsKEVsZW1lbnQgY29tcGxleFR5cGVFbGVtZW50LCBTdHJpbmcgY29udGVudE1vZGVsLCBFbGVtZW50IHNlcXVlbmNlQ2hvaWNlT3JBbGxFbGVtZW50KQotICB7Ci0gICAgRG9jdW1lbnQgZG9jID0gY29tcGxleFR5cGVFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQotICAgIFN0cmluZyBwcmVmaXggPSBjb21wbGV4VHlwZUVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgcHJlZml4ID0gcHJlZml4ID09IG51bGwgPyAiIiA6IHByZWZpeCArICI6IjsKLSAgICAKLSAgICBFbGVtZW50IGNvbnRlbnRNb2RlbEVsZW1lbnQgPSBnZXRDb250ZW50TW9kZWxGcm9tUGFyZW50KGNvbXBsZXhUeXBlRWxlbWVudCk7Ci0KLSAgICBpZiAoY29udGVudE1vZGVsRWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoY29udGVudE1vZGVsKSkKLSAgICB7Ci0gICAgICByZXR1cm47IC8vIGl0J3MgYWxyZWFkeSB0aGUgY29udGVudCBtb2RlbCAKLSAgICB9Ci0gICAgRWxlbWVudCBuZXdOb2RlOwotICAgIG5ld05vZGUgPSBkb2MuY3JlYXRlRWxlbWVudE5TKFhTRERPTUhlbHBlci5YTUxTY2hlbWFVUkksIHByZWZpeCArIGNvbnRlbnRNb2RlbCk7Ci0KLSAgICBpZiAoY29udGVudE1vZGVsRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpCi0gICAgeyAgICAgICAgCi0gICAgICBOb2RlTGlzdCBub2RlcyA9IGNvbnRlbnRNb2RlbEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgLy8gdXNlIGNsb25lcyBzbyB3ZSBkb24ndCBoYXZlIGEgcmVmcmVzaCBwcm9ibGVtCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChub2RlLmdldExvY2FsTmFtZSgpLmVxdWFscyhYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRykpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCEoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGNvbnRlbnRNb2RlbEVsZW1lbnQsIFhTRENvbnN0YW50cy5TRVFVRU5DRV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGNvbnRlbnRNb2RlbEVsZW1lbnQsIFhTRENvbnN0YW50cy5DSE9JQ0VfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjb250ZW50TW9kZWxFbGVtZW50LCBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHLCBmYWxzZSkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobm9kZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHKSB8fAotICAgICAgICAgICAgICAgICAgICBub2RlLmdldExvY2FsTmFtZSgpLmVxdWFscyhYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsKLSAgICAgICAgICAgIGlmIChzZXF1ZW5jZUNob2ljZU9yQWxsRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHNlcXVlbmNlQ2hvaWNlT3JBbGxFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKG5vZGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY29tcGxleFR5cGVFbGVtZW50LnJlcGxhY2VDaGlsZChuZXdOb2RlLCBjb250ZW50TW9kZWxFbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNsb25lRWxlbWVudChFbGVtZW50IHBhcmVudCwgRWxlbWVudCBzb3VyY2VOb2RlKQotICB7Ci0gICAgRG9jdW1lbnQgZG9jID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICBTdHJpbmcgcHJlZml4ID0gcGFyZW50LmdldFByZWZpeCgpOwotICAgIHByZWZpeCA9IHByZWZpeCA9PSBudWxsID8gIiIgOiBwcmVmaXggKyAiOiI7Ci0gICAgCi0gICAgRWxlbWVudCBuZXdOb2RlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhYU0RET01IZWxwZXIuWE1MU2NoZW1hVVJJLCBwcmVmaXggKyBzb3VyY2VOb2RlLmdldExvY2FsTmFtZSgpKTsKLQotICAgIGlmIChzb3VyY2VOb2RlLmhhc0NoaWxkTm9kZXMoKSkKLSAgICB7ICAgICAgICAKLSAgICAgIE5vZGVMaXN0IG5vZGVzID0gc291cmNlTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAvLyB1c2UgY2xvbmVzIHNvIHdlIGRvbid0IGhhdmUgYSByZWZyZXNoIHByb2JsZW0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLSAgICAgICAgbmV3Tm9kZS5hcHBlbmRDaGlsZChub2RlLmNsb25lTm9kZSh0cnVlKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuZXdOb2RlOwotLy8gICAgcGFyZW50LnJlcGxhY2VDaGlsZChuZXdOb2RlLCBzb3VyY2VOb2RlKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNPbmx5V2hpdGVzcGFjZShOb2RlIG5vZGUpCi0gIHsKLSAgICBOb2RlTGlzdCBsaXN0ID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IGxlbmd0aCA9IGxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgYm9vbGVhbiBoYXNPbmx5V2hpdGVzcGFjZSA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIGNoaWxkID0gbGlzdC5pdGVtKGkpOwotICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpCi0gICAgICB7Ci0gICAgICAgIGhhc09ubHlXaGl0ZXNwYWNlID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBjaGlsZC5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgU3RyaW5nIHRyaW1tZWRWYWx1ZSA9IHZhbHVlLnRyaW0oKTsKLSAgICAgICAgaWYgKHRyaW1tZWRWYWx1ZS5sZW5ndGgoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgaGFzT25seVdoaXRlc3BhY2UgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gIAotICAgIAotICAgIHJldHVybiBoYXNPbmx5V2hpdGVzcGFjZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShOb2RlIG5vZGUpCi0gIHsKLSAgICBOb2RlIHBhcmVudE5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAKLSAgICBOb2RlIG5leHRFbGVtZW50ID0gZ2V0TmV4dEVsZW1lbnROb2RlKG5vZGUpOwotICAgIE5vZGUgcHJldmlvdXNFbGVtZW50ID0gZ2V0UHJldmlvdXNFbGVtZW50Tm9kZShub2RlKTsKLQotICAgIE5vZGUgbmV4dFNpYmxpbmcgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgaWYgKG5leHRTaWJsaW5nIGluc3RhbmNlb2YgVGV4dCkKLSAgICB7Ci0gICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5leHRTaWJsaW5nKTsKLSAgICB9Ci0KLSAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsKQotICAgIHsKLQkJICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwotICAgIH0KLQotICAgIGlmIChuZXh0RWxlbWVudCAhPSBudWxsKQotICAgIHsKLQkJCWZvcm1hdENoaWxkKG5leHRFbGVtZW50KTsKLSAgICB9Ci0KLQkJaWYgKHByZXZpb3VzRWxlbWVudCAhPSBudWxsKQotCQl7Ci0JCQlmb3JtYXRDaGlsZChwcmV2aW91c0VsZW1lbnQpOwotCQl9Ci0gIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmb3JtYXRDaGlsZChOb2RlIGNoaWxkKQotCXsKLSAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICBJRE9NTW9kZWwgbW9kZWwgPSAoKElET01Ob2RlKWNoaWxkKS5nZXRNb2RlbCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAgIG1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotICAgICAgICAKLQkgICAgICBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0JCSAgICBmb3JtYXRQcm9jZXNzb3IuZm9ybWF0Tm9kZShjaGlsZCk7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICBtb2RlbC5jaGFuZ2VkTW9kZWwoKTsgCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotCi0gIHByaXZhdGUgc3RhdGljIE5vZGUgZ2V0TmV4dEVsZW1lbnROb2RlKE5vZGUgbm9kZSkKLSAgewotICAgIE5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAKLSAgICB3aGlsZSAoIShuZXh0IGluc3RhbmNlb2YgRWxlbWVudCkgJiYgbmV4dCAhPSBudWxsKQotICAgIHsKLSAgICAgIG5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0gICAgfQotICAgIGlmIChuZXh0IGluc3RhbmNlb2YgVGV4dCkKLSAgICB7Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gbmV4dDsKLSAgfQotCi0JcHJpdmF0ZSBzdGF0aWMgTm9kZSBnZXRQcmV2aW91c0VsZW1lbnROb2RlKE5vZGUgbm9kZSkKLQl7Ci0JCU5vZGUgcHJldmlvdXMgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotICAgIAotCQl3aGlsZSAoIShwcmV2aW91cyBpbnN0YW5jZW9mIEVsZW1lbnQpICYmIHByZXZpb3VzICE9IG51bGwpCi0JCXsKLQkJCXByZXZpb3VzID0gcHJldmlvdXMuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCX0KLSAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBUZXh0KQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gcHJldmlvdXM7Ci0JfQotCi0gCi0KLSAgLy8gaXNzdWUgKGNzKSB3aGF0J3MgdGhpcyBtZXRob2Qgc3VwcG9zZWQgdG8gZG8/Ci0gIC8vIGJpenphcmUgbmFtZQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5wdXRFcXVhbHMoT2JqZWN0IGlucHV0LCBTdHJpbmcgdGFnbmFtZSwgYm9vbGVhbiBpc1JlZikKLSAgewotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIGlucHV0OwotICAgICAgaWYgKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKHRhZ25hbWUpKQotICAgICAgewotICAgICAgICBib29sZWFuIHJlZlByZXNlbnQgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgicmVmIik7Ci0KLSAgICAgICAgcmV0dXJuIHJlZlByZXNlbnQgPT0gaXNSZWY7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzZDkxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLSAgICBwcm90ZWN0ZWQgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwgc2NoZW1hTG9jYXRvciA9IG5ldyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbCgpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyLmNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBBZGFwdGVyIGFkYXB0TmV3KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHNjaGVtYUxvY2F0b3I7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDk4NWI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdG9yOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXIKLXsKLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVTY2hlbWFMb2NhdGlvbihYU0RTY2hlbWEgeHNkU2NoZW1hLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgc2NoZW1hTG9jYXRpb25VUkkpCi0gICAgewotICAgICAgU3RyaW5nIGJhc2VMb2NhdGlvbiA9IHhzZFNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOyAgICAgIAotICAgICAgU3RyaW5nIHJlc3VsdCA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShiYXNlTG9jYXRpb24sIG5hbWVzcGFjZVVSSSwgc2NoZW1hTG9jYXRpb25VUkkpOwotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAJcmVzdWx0ID0gbmFtZXNwYWNlVVJJOwotICAgICAgfQotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAJcmVzdWx0ID0gIiI7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGF0cGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBYU0RTY2hlbWFMb2NhdG9yLmNsYXNzOwotICAgIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbHMvT3Blbk9uU2VsZWN0aW9uSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlscy9PcGVuT25TZWxlY3Rpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUxYWE3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlscy9PcGVuT25TZWxlY3Rpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5JbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8vIGlzc3VlIChjcykgY2FuIHdlIHJlbW92ZSB0aGlzPwotLy8KLXB1YmxpYyBjbGFzcyBPcGVuT25TZWxlY3Rpb25IZWxwZXIKLXsKLSAgCi0gIHByb3RlY3RlZCBTdHJ1Y3R1cmVkVGV4dEVkaXRvciB0ZXh0RWRpdG9yOwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLQotIAotICBwdWJsaWMgT3Blbk9uU2VsZWN0aW9uSGVscGVyKFN0cnVjdHVyZWRUZXh0RWRpdG9yIHRleHRFZGl0b3IsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgCXRoaXMudGV4dEVkaXRvciA9IHRleHRFZGl0b3I7Ci0gIAl0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotICAKLQotICBib29sZWFuIGxhc3RSZXN1bHQ7Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlblhTREVkaXRvcihYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAKLSAgICBPcGVuSW5OZXdFZGl0b3Iub3BlblhTREVkaXRvcihlZGl0b3JJbnB1dCwgc2NoZW1hLCBzY2hlbWEpOyAgICAKLSAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlblhTREVkaXRvcihTdHJpbmcgc2NoZW1hTG9jYXRpb24pCi0gIHsKLSAgICBJUGF0aCBzY2hlbWFQYXRoID0gbmV3IFBhdGgoc2NoZW1hTG9jYXRpb24pOwotCQlmaW5hbCBJRmlsZSBzY2hlbWFGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHNjaGVtYVBhdGgpOwotCQotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLQkJewotCQkJLyoqCi0JCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBydW4oKQotCQkJewotCQkJCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCWlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXRyeQotCQkJCQl7Ci0JCQkJCSAgd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoc2NoZW1hRmlsZSksIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBpbml0RXgpCi0JCQkJCXsKLQkJCQkJICBpbml0RXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2goRXhjZXB0aW9uIGUpCi0JCQkJCXsKLQkJCQkJICBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfSAgICAgICAgICAKLQkJCX0KLQkJfSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHJldmVhbE9iamVjdChmaW5hbCBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBpZiAoY29tcG9uZW50LmdldFJvb3RDb250YWluZXIoKS5lcXVhbHMoeHNkU2NoZW1hKSkKLSAgICB7Ci0gICAgICBOb2RlIGVsZW1lbnQgPSBjb21wb25lbnQuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKQotICAgICAgewotICAgICAgICBJbmRleGVkUmVnaW9uIGluZGV4Tm9kZSA9IChJbmRleGVkUmVnaW9uKSBlbGVtZW50OwotICAgICAgICB0ZXh0RWRpdG9yLmdldFRleHRWaWV3ZXIoKS5zZXRSYW5nZUluZGljYXRpb24oaW5kZXhOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGluZGV4Tm9kZS5nZXRFbmRPZmZzZXQoKSAtIGluZGV4Tm9kZS5nZXRTdGFydE9mZnNldCgpLCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsYXN0UmVzdWx0ID0gZmFsc2U7Ci0gICAgICBpZiAoY29tcG9uZW50LmdldFNjaGVtYSgpICE9IG51bGwpCi0gICAgICB7Ci0JCQkJU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChjb21wb25lbnQuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgICAgIElQYXRoIHNjaGVtYVBhdGggPSBuZXcgUGF0aChzY2hlbWFMb2NhdGlvbik7Ci0JCQkJZmluYWwgSUZpbGUgc2NoZW1hRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShzY2hlbWFQYXRoKTsKLSAgICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCSAgICAgICAgICovCi0JICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotCSAgICAgICAgewotCQkgICAgICAgIGZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkgICAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLQkJICAgICAgICB7Ci0JCQkJCQkJdHJ5Ci0JCQkJCQkJewotCQkJCQkJCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoc2NoZW1hRmlsZSksIFhTREVkaXRvclBsdWdpbi5QTFVHSU5fSUQpOwotCQkJCQkJCQlpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQkoKEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKWVkaXRvclBhcnQpLm9wZW5Pbkdsb2JhbFJlZmVyZW5jZShjb21wb25lbnQpOwotCQkJCQkJCQkJbGFzdFJlc3VsdCA9IHRydWU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGluaXRFeCkKLQkJCQkJCQl7Ci0JCQkJCQkJfQotCQkJCQkJfSAgICAgICAgICAKLQkJCQkJfQotCQkJCX0pOwotICAgICAgfQotICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgWFNETmFtZWRDb21wb25lbnQgb3Blbk9uR2xvYmFsUmVmZXJlbmNlKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXApCi0gIHsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0geHNkU2NoZW1hOwotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgIHsKLSAgICAgIG5hbWUgPSAoKFhTRE5hbWVkQ29tcG9uZW50KSBjb21wKS5nZXROYW1lKCk7Ci0gICAgfQotICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgewotICAgICAgLy8gRm9yIEFub255bW91cyB0eXBlcywganVzdCBzaG93IHRoZSBlbGVtZW50Ci0gICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gKFhTRFR5cGVEZWZpbml0aW9uKSBjb21wOwotICAgICAgICBjb21wID0gdHlwZS5nZXRDb250YWluZXIoKTsKLSAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgIG5hbWUgPSAoKFhTRE5hbWVkQ29tcG9uZW50KSBjb21wKS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKHNjaGVtYSA9PSBudWxsIHx8IG5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBMaXN0IG9iamVjdHMgPSBudWxsOyAgICAKLSAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBvYmplY3RzID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIG9iamVjdHMgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgb2JqZWN0cyA9IHNjaGVtYS5nZXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKQotICAgIHsKLSAgICAgIG9iamVjdHMgPSBzY2hlbWEuZ2V0SWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIG9iamVjdHMgPSBzY2hlbWEuZ2V0TW9kZWxHcm91cERlZmluaXRpb25zKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBvYmplY3RzID0gc2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOwotICAgIH0KLQotICAgIGlmIChvYmplY3RzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcCA9IChYU0ROYW1lZENvbXBvbmVudCkgaXRlci5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAobmFtZWRDb21wLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXZlYWxPYmplY3QobmFtZWRDb21wKTsKLSAgICAgICAgICByZXR1cm4gbmFtZWRDb21wOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBvcGVuT25TZWxlY3Rpb24oKQotICB7Ci0gICAgTGlzdCBzZWxlY3RlZE5vZGVzID0gbnVsbDsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgIHNlbGVjdGVkTm9kZXMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvTGlzdCgpOwotICAgIH0KLQotICAgIGlmIChzZWxlY3RlZE5vZGVzICE9IG51bGwgJiYgIXNlbGVjdGVkTm9kZXMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNlbGVjdGVkTm9kZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXAgPSB4c2RTY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudCgoTm9kZSlvYmopOwotICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IG9iamVjdFRvUmV2ZWFsID0gbnVsbDsKLQotICAgICAgICAgIGlmICh4c2RDb21wIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHhzZENvbXA7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudERlY2wuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSBlbGVtZW50RGVjbC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0eXBlRGVmID0gbnVsbDsKLSAgICAgICAgICAgICAgaWYgKGVsZW1lbnREZWNsLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR5cGVEZWYgPSBlbGVtZW50RGVjbC5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBzdWJHcm91cEFmZmlsaWF0aW9uID0gZWxlbWVudERlY2wuZ2V0U3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbigpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKHR5cGVEZWYgIT0gbnVsbCAmJiBzdWJHcm91cEFmZmlsaWF0aW9uICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIDIgdGhpbmdzIHdlIGNhbiBuYXZpZ2F0ZSB0bywgaWYgdGhlIGN1cnNvciBpcyBhbnl3aGVyZSBvbiB0aGUgc3Vic3RpdHV0aW9uIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgIC8vIHRoZW4ganVtcCB0byB0aGF0LCBvdGhlcndpc2UganVzdCBnbyB0byB0aGUgdHlwZURlZi4KLSAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQXR0ciAmJiAoKEF0dHIpb2JqKS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSBzdWJHcm91cEFmZmlsaWF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHJldmVhbCB0aGUgdHlwZSBub3cuICBPbiBzdWNjZXNzLCB0aGVuIHdlIHJldHVybiB0cnVlLgotICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgZmFpbCwgc2V0IHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAgYXMgdGhlIG9iamVjdCB0byByZXZlYWwgYXMgYSBiYWNrdXAgcGxhbi4KLSAgICAgICAgICAgICAgICAgIGlmIChyZXZlYWxPYmplY3QodHlwZURlZikpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IHN1Ykdyb3VwQWZmaWxpYXRpb247Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG9uZSBvciBtb3JlIG9mIHRoZXNlIGlzIG51bGwuICBJZiB0aGUgdHlwZURlZiBpcyBub24tbnVsbCwgdXNlIGl0LiAgT3RoZXJ3aXNlCi0gICAgICAgICAgICAgICAgLy8gdHJ5IGFuZCB1c2UgdGhlIHN1YnN0aXR1dGlvbiBncm91cAotICAgICAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gdHlwZURlZiAhPSBudWxsID8gdHlwZURlZiA6IHN1Ykdyb3VwQWZmaWxpYXRpb247Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGVsZW1lbnREZWNsID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSB4c2RDb21wOwotICAgICAgICAgICAgaWYgKGVsZW1lbnREZWNsLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSBlbGVtZW50RGVjbC5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHhzZENvbXAgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgeHNkQ29tcDsKLSAgICAgICAgICAgIGlmIChhdHRyRGVjbC5pc0F0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYXR0ckRlY2wuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IGF0dHJEZWNsLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwRGVmID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgeHNkQ29tcDsKLSAgICAgICAgICAgIGlmIChhdHRyR3JvdXBEZWYuaXNBdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSBhdHRyR3JvdXBEZWYuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiBpZENvbnN0cmFpbnREZWYgPSAoWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbikgeHNkQ29tcDsKLSAgICAgICAgICAgIGlmIChpZENvbnN0cmFpbnREZWYuZ2V0UmVmZXJlbmNlZEtleSgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gaWRDb25zdHJhaW50RGVmLmdldFJlZmVyZW5jZWRLZXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHhzZENvbXA7Ci0gICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IHR5cGVEZWYuZ2V0SXRlbVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0VG9SZXZlYWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gaWYgaXRlbVR5cGUgYXR0cmlidXRlIGlzIG5vdCBzZXQsIHRoZW4gY2hlY2sgZm9yIG1lbWJlclR5cGUKLSAgICAgICAgICAgICAgTGlzdCBtZW1iZXJUeXBlcyA9IHR5cGVEZWYuZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCk7Ci0gICAgICAgICAgICAgIGlmIChtZW1iZXJUeXBlcyAhPSBudWxsICYmIG1lbWJlclR5cGVzLnNpemUoKSA+IDApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCltZW1iZXJUeXBlcy5nZXQoMCk7Ci0gICAgICAgICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh4c2RDb21wIGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZiA9IChYU0RUeXBlRGVmaW5pdGlvbikgeHNkQ29tcDsKLSAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gdHlwZURlZi5nZXRCYXNlVHlwZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh4c2RDb21wIGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlKQotICAgICAgICAgIHsKLSAgICAgICAgICAJWFNEU2NoZW1hRGlyZWN0aXZlIGRpcmVjdGl2ZSA9IChYU0RTY2hlbWFEaXJlY3RpdmUpIHhzZENvbXA7Ci0vLwkJCQkJCVN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woZGlyZWN0aXZlLmdldFJlc29sdmVkU2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0vLwkJCQkJCW9wZW5YU0RFZGl0b3Ioc2NoZW1hTG9jYXRpb24pOwotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IGRpcmVjdGl2ZS5nZXRSZXNvbHZlZFNjaGVtYSgpOwkJCQkJCSAgICAgICAgICAJICAgICAgICAgIAkKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBub3cgcmV2ZWFsIHRoZSBvYmplY3QgaWYgdGhpcyBpc24ndCBudWxsCi0gICAgICAgICAgaWYgKG9iamVjdFRvUmV2ZWFsICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJldmVhbE9iamVjdChvYmplY3RUb1JldmVhbCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTBjY2U4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3I7Ci0KLS8qKgotICogVGhpcyBwZXJmb3JtcyB0aGUgYXMteW91LXR5cGUgdmFsaWRhdGlvbiBmb3Igc2NoZW1hIGZpbGVzCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTRCBleHRlbmRzIERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3IgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSWQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZCI7Ci0KLSAgcHJpdmF0ZSBWYWxpZGF0b3IgX3ZhbGlkYXRvcjsKLSAgCi0gIHB1YmxpYyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWFNEKCkgeyAKLSAgfQotICAKLSAgcHJpdmF0ZSBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCl7Ci0JICBpZiAoX3ZhbGlkYXRvciA9PSBudWxsKV92YWxpZGF0b3IgPSBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5nZXRWYWxpZGF0b3IoSWQpOwotCSAgcmV0dXJuIF92YWxpZGF0b3I7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJVmFsaWRhdG9yIGdldERlbGVnYXRlVmFsaWRhdG9yKCkgewotCSAgVmFsaWRhdG9yIHYgPSBnZXRWYWxpZGF0b3IoKTsKLQkgIGlmICh2ID09IG51bGwpcmV0dXJuIG51bGw7Ci0JICByZXR1cm4gdi5hc0lWYWxpZGF0b3IoKTsKLSAgfQotICAKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlbGVnYXRlVmFsaWRhdG9yRW5hYmxlZChJRmlsZSBmaWxlKSB7Ci0JCVZhbGlkYXRvciB2ID0gZ2V0VmFsaWRhdG9yKCk7Ci0JCWlmICh2ID09IG51bGwpcmV0dXJuIGZhbHNlOwotCQlpZiAoIXYuc2hvdWxkVmFsaWRhdGUoZmlsZSwgZmFsc2UsIGZhbHNlKSlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB2LmlzQnVpbGRWYWxpZGF0aW9uKCkgfHwgdi5pc01hbnVhbFZhbGlkYXRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1lcmF0aW9uc0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtZXJhdGlvbnNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmMTlmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1lcmF0aW9uc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlZpZXdVdGlsaXR5OwotCi0KLS8qKgotICogRGlhbG9nIHRvIGhlbHAgZGVmaW5lIGEgbGlzdCBvZiBlbnVtZXJhdGlvbnMKLSAqIGZvciBhIGpvaW4uIFRoaXMgbWlnaHQgYmUgcmVwbGFjZWQgb25jZSB3ZSBrbm93IGhvdyB0bwotICogaW5pdGlhdGUgYSBkcmFnIHRyYWNrZXIKLSAqLwotCi1wdWJsaWMgY2xhc3MgRW51bWVyYXRpb25zRGlhbG9nIGV4dGVuZHMgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cKLXsKLSAgcHVibGljIEVudW1lcmF0aW9uc0RpYWxvZyhTaGVsbCBzaGVsbCkKLSAgewotICAgIHN1cGVyKHNoZWxsKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKQotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgIHNoZWxsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0VOVU1FUkFUSU9OU19ESUFMT0dfVElUTEUiKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkKLSAgewotICAgIGlmIChidXR0b25JZCA9PSBXaW5kb3cuT0spCi0gICAgewotICAgICAgdGV4dCA9IHRleHRGaWVsZC5nZXRUZXh0KCk7Ci0gICAgICBkZWxpbWl0ZXIgPSBkZWxpbWl0ZXJGaWVsZC5nZXRUZXh0KCk7Ci0gICAgICBpc1ByZXNlcnZlID0gcHJlc2VydmVXaGl0ZXNwYWNlLmdldFNlbGVjdGlvbigpOwotICAgIH0KLSAgICBzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIHRleHQsIGRlbGltaXRlcjsKLSAgcHJpdmF0ZSBib29sZWFuIGlzUHJlc2VydmU7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsgcmV0dXJuIHRleHQ7IH0KLSAgcHVibGljIFN0cmluZyBnZXREZWxpbWl0ZXIoKSB7IHJldHVybiBkZWxpbWl0ZXI7IH0KLSAgcHVibGljIGJvb2xlYW4gaXNQcmVzZXJ2ZVdoaXRlc3BhY2UoKSB7IHJldHVybiBpc1ByZXNlcnZlOyB9Ci0KLSAgcHJpdmF0ZSBUZXh0IHRleHRGaWVsZDsKLSAgcHJpdmF0ZSBCdXR0b24gcHJlc2VydmVXaGl0ZXNwYWNlOwotICBwcml2YXRlIENvbWJvIGRlbGltaXRlckZpZWxkOwotICAvLwotICAvLyBDcmVhdGUgdGhlIGNvbnRyb2xzCi0gIC8vCi0gIHB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbnRyb2xbXSB0YWJPcmRlciA9IG5ldyBDb250cm9sWzNdOwotICAJaW50IHRhYkluZGV4ID0gMDsKLSAgICBDb21wb3NpdGUgY2xpZW50ID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCljbGllbnQuZ2V0TGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsgCi0KLSAgICB0ZXh0RmllbGQgPSBWaWV3VXRpbGl0eS5jcmVhdGVXcmFwcGVkTXVsdGlUZXh0RmllbGQoY2xpZW50LCA0MDAsIDIwLCB0cnVlKTsKLSAgICBHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSkgdGV4dEZpZWxkLmdldExheW91dERhdGEoKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgdGFiT3JkZXJbdGFiSW5kZXgrK10gPSB0ZXh0RmllbGQ7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0ZXh0RmllbGQsIFhTREVkaXRvckNTSGVscElkcy5BRERfRU5VTUVSQVRJT05TX19OT19OQU1FKTsKLQotICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNsaWVudCwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0RFTElNSVRFUl9DSEFSIikpOwotICAgIGRlbGltaXRlckZpZWxkID0gVmlld1V0aWxpdHkuY3JlYXRlQ29tYm9Cb3goY2xpZW50LCBmYWxzZSk7Ci0gICAgZ2QgPSAoR3JpZERhdGEpIGRlbGltaXRlckZpZWxkLmdldExheW91dERhdGEoKTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLSAgICBnZC53aWR0aEhpbnQgPSAzMDsKLSAgICB0YWJPcmRlclt0YWJJbmRleCsrXSA9IGRlbGltaXRlckZpZWxkOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGVsaW1pdGVyRmllbGQsIFhTREVkaXRvckNTSGVscElkcy5BRERfRU5VTUVSQVRJT05TX19ERUxJTUlURVJfQ0hBUlMpOwotCi0gICAgLy8gYWRkIGRlZmF1bHQgZGVsaW1pdGVycwotICAgIGRlbGltaXRlckZpZWxkLmFkZCgiOiIpOwotICAgIGRlbGltaXRlckZpZWxkLmFkZCgiLCIpOwotICAgIGRlbGltaXRlckZpZWxkLmFkZCgiICIpOwotICAgIC8vIHNldCB0aGUgY3VycmVudCBvbmUgdG8gYmUgJywnCi0gICAgZGVsaW1pdGVyRmllbGQuc2V0VGV4dCgiLCIpOwotCi0gICAgcHJlc2VydmVXaGl0ZXNwYWNlID0gVmlld1V0aWxpdHkuY3JlYXRlQ2hlY2tCb3goY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfUFJFU0VSVkVfV0hJVEVTUEFDRSIpKTsKLSAgICBnZCA9IChHcmlkRGF0YSkgcHJlc2VydmVXaGl0ZXNwYWNlLmdldExheW91dERhdGEoKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgdGFiT3JkZXJbdGFiSW5kZXgrK10gPSBwcmVzZXJ2ZVdoaXRlc3BhY2U7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcmVzZXJ2ZVdoaXRlc3BhY2UsIFhTREVkaXRvckNTSGVscElkcy5BRERfRU5VTUVSQVRJT05TX19QUkVTRVJWRV9MRUFEX0FORF9UUkFJTF9XSElURVNQQUNFUyk7Ci0gICAgCi0gICAgY2xpZW50LnNldFRhYkxpc3QodGFiT3JkZXIpOwotCi0gICAgcmV0dXJuIGNsaWVudDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2lkZ2V0cy9UeXBlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2lkZ2V0cy9UeXBlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTI5ZmVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpZGdldHMvVHlwZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5WaWV3VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgVHlwZVNlY3Rpb24KLXsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBUeXBlU2VjdGlvbi4KLSAgICogQHBhcmFtIHBhcmVudAotICAgKi8KLSAgcHVibGljIFR5cGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCBCdXR0b24gIHNpbXBsZVR5cGU7Ci0gIHByb3RlY3RlZCBCdXR0b24gIHVzZXJTaW1wbGVUeXBlOwotICBwcm90ZWN0ZWQgQnV0dG9uICB1c2VyQ29tcGxleFR5cGU7Ci0gIHByb3RlY3RlZCBCdXR0b24gIG5vbmVSYWRpbzsKLSAgcHJvdGVjdGVkIENvbWJvICAgdHlwZUxpc3Q7Ci0gIHByb3RlY3RlZCBDb21ibyAgIGRlcml2ZWRCeUNvbWJvOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG93VXNlckNvbXBsZXhUeXBlID0gdHJ1ZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1VzZXJTaW1wbGVUeXBlICA9IHRydWU7Ci0gIHByb3RlY3RlZCBib29sZWFuIHNob3dOb25lICAgICAgICAgICAgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0Rlcml2ZWRCeSAgICAgICA9IGZhbHNlOwotICBwcm90ZWN0ZWQgU3RyaW5nICBkZXJpdmVkQnlDaG9pY2VzW10gID0geyAicmVzdHJpY3Rpb24iLCAiZXh0ZW5zaW9uIiB9OwotICBwdWJsaWMgZmluYWwgaW50ICBOT05FICAgICAgICAgICAgICAgID0gMTsKLSAgcHVibGljIGZpbmFsIGludCAgQlVJTFRfSU4gICAgICAgICAgICA9IDI7Ci0gIHB1YmxpYyBmaW5hbCBpbnQgIFNJTVBMRSAgICAgICAgICAgICAgPSAzOwotICBwdWJsaWMgZmluYWwgaW50ICBDT01QTEVYICAgICAgICAgICAgID0gNDsKLQotICBTdHJpbmcgICAgICAgICAgICBzZWN0aW9uVGl0bGUgICAgICAgID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1RZUEVfSU5GT1JNQVRJT04iKTsKLSAgU3RyaW5nICAgICAgICAgICAgY3VycmVudE9iamVjdFV1aWQgICA9ICIiOwotCi0gIC8qCi0gICAqIEBzZWUgRmxhdFBhZ2VTZWN0aW9uI2NyZWF0ZUNsaWVudChDb21wb3NpdGUsIFdpZGdldEZhY3RvcnkpCi0gICAqLwotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNsaWVudChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgIGdsLnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0gICAgY2xpZW50LnNldExheW91dChnbCk7Ci0KLSAgICBpZiAoc2hvd05vbmUpCi0gICAgewotICAgICAgbm9uZVJhZGlvID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fTk9ORSIpKTsKLSAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChub25lUmFkaW8sIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9UWVBFX0hFTFBFUl9OT05FKTsKLSAgICB9Ci0KLSAgICBzaW1wbGVUeXBlID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fQlVJTFRfSU5fU0lNUExFX1RZUEUiKSk7Ci0gICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKHNpbXBsZVR5cGUsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9UWVBFX0hFTFBFUl9CVUlMVF9JTik7Ci0KLSAgICBpZiAoc2hvd1VzZXJTaW1wbGVUeXBlKQotICAgIHsKLSAgICAgIHVzZXJTaW1wbGVUeXBlID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fVVNFUl9ERUZJTkVEX1NJTVBMRV9UWVBFIikpOwotICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKHVzZXJTaW1wbGVUeXBlLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfVFlQRV9IRUxQRVJfVVNFUl9ERUZJTkVEX1NJTVBMRSk7Ci0gICAgfQotCi0gICAgaWYgKHNob3dVc2VyQ29tcGxleFR5cGUpCi0gICAgewotICAgICAgdXNlckNvbXBsZXhUeXBlID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fVVNFUl9ERUZJTkVEX0NPTVBMRVhfVFlQRSIpKTsKLSAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscCh1c2VyQ29tcGxleFR5cGUsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9UWVBFX0hFTFBFUl9VU0VSX0RFRklORURfQ09NUExFWCk7Ci0gICAgfQotCi0gICAgLy8JICB0eXBlTGlzdCA9IHV0aWxpdHkuY3JlYXRlQ29tYm9Cb3goY2xpZW50KTsKLSAgICAvLwkgIFdvcmtiZW5jaEhlbHAuc2V0SGVscCh0eXBlTGlzdCwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX1RZUEVfSEVMUEVSX1RZUEUpOwotICAgIC8vICAgIHV0aWxpdHkuY3JlYXRlSGVhZGluZ0xhYmVsKGNsaWVudCwgIlR5cGUiLG51bGwpOwotCi0gICAgaWYgKHNob3dEZXJpdmVkQnkpCi0gICAgewotICAgICAgQ29tcG9zaXRlIGRlcml2ZWRCeUNvbXBvc2l0ZSA9IFZpZXdVdGlsaXR5LmNyZWF0ZUNvbXBvc2l0ZShjbGllbnQsIDIpOwotICAgICAgVmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoZGVyaXZlZEJ5Q29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfREVSSVZFRF9CWSIpKTsKLSAgICAgIGRlcml2ZWRCeUNvbWJvID0gVmlld1V0aWxpdHkuY3JlYXRlQ29tYm9Cb3goZGVyaXZlZEJ5Q29tcG9zaXRlKTsKLSAgICAgIHBvcHVsYXRlRGVyaXZlZEJ5Q29tYm8oKTsKLSAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkZXJpdmVkQnlDb21ibywgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX1NJTVBMRV9DT05URU5UX0RFUklWRUQpOwotICAgICAgZGVyaXZlZEJ5Q29tYm8uc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfREVSSVZFRF9CWSIpKTsKLSAgICB9Ci0gICAgLy8gU2V0IHRoZSBkZWZhdWx0IHNlbGVjdGlvbgotICAgIGlmIChzaG93Tm9uZSkKLSAgICB7Ci0gICAgICAvLwkJbm9uZVJhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgIC8vCQl0eXBlTGlzdC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNpbXBsZVR5cGUuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIH0KLSAgICByZXR1cm4gY2xpZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SXNEZXJpdmVkQnkoYm9vbGVhbiBkZXJpdmUpCi0gIHsKLSAgICBpZiAoZGVyaXZlKQotICAgIHsKLSAgICAgIHNlY3Rpb25UaXRsZSA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9CQVNFX1RZUEUiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNlY3Rpb25UaXRsZSA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9UWVBFX0lORk9STUFUSU9OIik7Ci0gICAgfQotICAgIC8vCXNldEhlYWRlclRleHQoc2VjdGlvblRpdGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdG8gdHJ1ZSBpZiBjYWxsZWQgYnkgQ29tcGxleCBUeXBlICYgU2ltcGxlIFR5cGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNob3dEZXJpdmVkQnkoYm9vbGVhbiBkZXJpdmUpCi0gIHsKLSAgICBzaG93RGVyaXZlZEJ5ID0gZGVyaXZlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGRlcml2ZWRCeUZpZWxkCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIEJ1dHRvbgotICAgKi8KLSAgcHVibGljIENvbWJvIGdldERlcml2ZWRCeUNvbWJvKCkKLSAgewotICAgIHJldHVybiBkZXJpdmVkQnlDb21ibzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBub25lUmFkaW8uCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIEJ1dHRvbgotICAgKi8KLSAgcHVibGljIEJ1dHRvbiBnZXROb25lUmFkaW8oKQotICB7Ci0gICAgcmV0dXJuIG5vbmVSYWRpbzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBzaW1wbGVUeXBlLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBCdXR0b24KLSAgICovCi0gIHB1YmxpYyBCdXR0b24gZ2V0U2ltcGxlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gc2ltcGxlVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB1c2VyQ29tcGxleFR5cGUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIEJ1dHRvbgotICAgKi8KLSAgcHVibGljIEJ1dHRvbiBnZXRVc2VyQ29tcGxleFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHVzZXJDb21wbGV4VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB1c2VyU2ltcGxlVHlwZS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgQnV0dG9uCi0gICAqLwotICBwdWJsaWMgQnV0dG9uIGdldFVzZXJTaW1wbGVUeXBlKCkKLSAgewotICAgIHJldHVybiB1c2VyU2ltcGxlVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB0eXBlTGlzdC4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgQ0NvbWJvCi0gICAqLwotICBwdWJsaWMgQ29tYm8gZ2V0VHlwZUxpc3QoKQotICB7Ci0gICAgcmV0dXJuIHR5cGVMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIFBvcHVsYXRlIGNvbWJvIGJveCB3aXRoIGJ1aWx0LWluIHNpbXBsZSB0eXBlcwotICAgKi8KLSAgcHVibGljIHZvaWQgcG9wdWxhdGVCdWlsdEluVHlwZShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgZ2V0VHlwZUxpc3QoKS5yZW1vdmVBbGwoKTsKLSAgICBMaXN0IGl0ZW1zID0gZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoeHNkU2NoZW1hKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIGdldFR5cGVMaXN0KCkuYWRkKGl0ZW1zLmdldChpKS50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgIHJldHVybiBoZWxwZXIuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQb3B1bGF0ZSBjb21ibyBib3ggd2l0aCB1c2VyIGRlZmluZWQgY29tcGxleCB0eXBlcwotICAgKi8KLSAgcHVibGljIHZvaWQgcG9wdWxhdGVVc2VyQ29tcGxleFR5cGUoWFNEU2NoZW1hIHhzZFNjaGVtYSwgYm9vbGVhbiBzaG93QW5vbnltb3VzKQotICB7Ci0gICAgZ2V0VHlwZUxpc3QoKS5yZW1vdmVBbGwoKTsKLSAgICBpZiAoc2hvd0Fub255bW91cykKLSAgICB7Ci0gICAgICBnZXRUeXBlTGlzdCgpLmFkZChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQU5PTllNT1VTIikpOwotICAgIH0KLQotICAgIExpc3QgaXRlbXMgPSBnZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoeHNkU2NoZW1hKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIGdldFR5cGVMaXN0KCkuYWRkKGl0ZW1zLmdldChpKS50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICByZXR1cm4gaGVscGVyLmdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcG9wdWxhdGVVc2VyU2ltcGxlVHlwZShYU0RTY2hlbWEgeHNkU2NoZW1hLCBib29sZWFuIHNob3dBbm9ueW1vdXMpCi0gIHsKLSAgICBnZXRUeXBlTGlzdCgpLnJlbW92ZUFsbCgpOwotICAgIGlmIChzaG93QW5vbnltb3VzKQotICAgIHsKLSAgICAgIGdldFR5cGVMaXN0KCkuYWRkKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BTk9OWU1PVVMiKSk7Ci0gICAgfQotICAgIExpc3QgaXRlbXMgPSBnZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCh4c2RTY2hlbWEpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgZ2V0VHlwZUxpc3QoKS5hZGQoaXRlbXMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQb3B1bGF0ZSBjb21ibyBib3ggd2l0aCB1c2VyIGRlZmluZWQgc2ltcGxlIHR5cGVzCi0gICAqLwotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZVVzZXJTaW1wbGVUeXBlKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBnZXRUeXBlTGlzdCgpLnJlbW92ZUFsbCgpOwotICAgIExpc3QgaXRlbXMgPSBnZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCh4c2RTY2hlbWEpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgZ2V0VHlwZUxpc3QoKS5hZGQoaXRlbXMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdChYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgcmV0dXJuIGhlbHBlci5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5zLCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgU3RyaW5nIGtleSA9IGhlbHBlci5nZXRQcmVmaXgobnMsIHRydWUpOwotICAgIHJldHVybiBrZXk7Ci0gIH0KLQotICAvKioKLSAgICogUG9wdWxhdGUgY29tYm8gYm94IHdpdGggZGVyaXZlZCBieSBjaG9pY2VzCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZURlcml2ZWRCeUNvbWJvKCkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVyaXZlZEJ5Q2hvaWNlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBnZXREZXJpdmVkQnlDb21ibygpLmFkZChkZXJpdmVkQnlDaG9pY2VzW2ldKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgc2hvd1VzZXJDb21wbGV4VHlwZS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd1VzZXJDb21wbGV4VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gc2hvd1VzZXJDb21wbGV4VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBzaG93VXNlclNpbXBsZVR5cGUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFNob3dVc2VyU2ltcGxlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gc2hvd1VzZXJTaW1wbGVUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHNob3dOb25lLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBib29sZWFuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93Tm9uZSgpCi0gIHsKLSAgICByZXR1cm4gc2hvd05vbmU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgc2hvd1VzZXJDb21wbGV4VHlwZS4KLSAgICogQHBhcmFtIHNob3dVc2VyQ29tcGxleFR5cGUgVGhlIHNob3dVc2VyQ29tcGxleFR5cGUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTaG93VXNlckNvbXBsZXhUeXBlKGJvb2xlYW4gc2hvd1VzZXJDb21wbGV4VHlwZSkKLSAgewotICAgIHRoaXMuc2hvd1VzZXJDb21wbGV4VHlwZSA9IHNob3dVc2VyQ29tcGxleFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgc2hvd1VzZXJTaW1wbGVUeXBlLgotICAgKiBAcGFyYW0gc2hvd1VzZXJTaW1wbGVUeXBlIFRoZSBzaG93VXNlclNpbXBsZVR5cGUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTaG93VXNlclNpbXBsZVR5cGUoYm9vbGVhbiBzaG93VXNlclNpbXBsZVR5cGUpCi0gIHsKLSAgICB0aGlzLnNob3dVc2VyU2ltcGxlVHlwZSA9IHNob3dVc2VyU2ltcGxlVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzaG93Tm9uZQotICAgKiBAcGFyYW0gc2hvd1VzZXJTaW1wbGVUeXBlIFRoZSBzaG93Tm9uZSB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNob3dOb25lKGJvb2xlYW4gc2hvd05vbmUpCi0gIHsKLSAgICB0aGlzLnNob3dOb25lID0gc2hvd05vbmU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpZGdldHMvWFNERWRpdFNjaGVtYUluZm9EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpZGdldHMvWFNERWRpdFNjaGVtYUluZm9EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkMDE2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL1hTREVkaXRTY2hlbWFJbmZvRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCSAgIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBbMTQyNTAwXSBXVFAgcHJvcGVydGllcyBwYWdlcyBmb250cyBkb24ndCBmb2xsb3cgRWNsaXBzZSBwcmVmZXJlbmNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLkVkaXRTY2hlbWFJbmZvRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0LkNvbW1vbkVkaXROYW1lc3BhY2VzVGFyZ2V0RmllbGREaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0U2NoZW1hSW5mb0RpYWxvZyBleHRlbmRzIEVkaXRTY2hlbWFJbmZvRGlhbG9nIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCVN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0JQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZyBlZGl0TmFtZXNwYWNlc0NvbnRyb2w7Ci0gIC8qKgotICAgKiBAZGVwcmVjYXRlZCAtIFRoZXNlIGhhdmUgYmVlbiBtb3ZlZCB0byB0aGUgQWR2YW5jZWQgUHJvcGVydGllcyBUYWIgCi0gICAqLwotICBDb21ibyBlbGVtZW50Rm9ybUNvbWJvLCBhdHRyaWJ1dGVGb3JtQ29tYm87Ci0gIC8qKgotICAgKiBAZGVwcmVjYXRlZCAKLSAgICovCi0gIFN0cmluZyBlbGVtZW50Rm9ybVF1YWxpZmllZCA9ICIiLCBhdHRyaWJ1dGVGb3JtUXVhbGlmaWVkID0gIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAKLQlwdWJsaWMgWFNERWRpdFNjaGVtYUluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElQYXRoIHJlc291cmNlTG9jYXRpb24sIFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIHJlc291cmNlTG9jYXRpb24pOwotCQl0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0JCi0JLy8gdGhpcyBpcyBjb3B5IG9mIC4uLi4KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBfX2ludGVybmFsQ3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIC8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0gICAgICAgIGxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQkKLQkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBfX2ludGVybmFsQ3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQllZGl0TmFtZXNwYWNlc0NvbnRyb2wgPSBuZXcgQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZyhkaWFsb2dBcmVhLCByZXNvdXJjZUxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCi0JCXsJCi0JCQllZGl0TmFtZXNwYWNlc0NvbnRyb2wuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0JCX0KLQkJZWRpdE5hbWVzcGFjZXNDb250cm9sLnNldE5hbWVzcGFjZUluZm9MaXN0KG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJZWRpdE5hbWVzcGFjZXNDb250cm9sLnVwZGF0ZUVycm9yTWVzc2FnZShuYW1lc3BhY2VJbmZvTGlzdCk7Ci0KLSAgICBhcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIGVkaXROYW1lc3BhY2VzQ29udHJvbC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQl9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQgCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJc0VsZW1lbnRRdWFsaWZpZWQoU3RyaW5nIHN0YXRlKQotICB7Ci0gICAgZWxlbWVudEZvcm1Db21iby5zZXRUZXh0KHN0YXRlKTsKLSAgICBlbGVtZW50Rm9ybVF1YWxpZmllZCA9IHN0YXRlOwotICB9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQgCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJc0F0dHJpYnV0ZVF1YWxpZmllZChTdHJpbmcgc3RhdGUpCi0gIHsKLSAgICBhdHRyaWJ1dGVGb3JtQ29tYm8uc2V0VGV4dChzdGF0ZSk7Ci0gICAgYXR0cmlidXRlRm9ybVF1YWxpZmllZCA9IHN0YXRlOwotICB9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQgCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRGb3JtUXVhbGlmaWVkKCkKLSAgewotICAgIHJldHVybiBlbGVtZW50Rm9ybVF1YWxpZmllZDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkIAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVGb3JtUXVhbGlmaWVkKCkKLSAgewotICAgIHJldHVybiBhdHRyaWJ1dGVGb3JtUXVhbGlmaWVkOwotICB9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQgCi0gICAqLwotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZCAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gYXR0cmlidXRlRm9ybUNvbWJvKQotICAgIHsKLSAgICAgIGF0dHJpYnV0ZUZvcm1RdWFsaWZpZWQgPSBhdHRyaWJ1dGVGb3JtQ29tYm8uZ2V0VGV4dCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBlbGVtZW50Rm9ybUNvbWJvKQotICAgIHsKLSAgICAgIGVsZW1lbnRGb3JtUXVhbGlmaWVkID0gZWxlbWVudEZvcm1Db21iby5nZXRUZXh0KCk7Ci0gICAgfQotCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYU0RXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WFNEV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxY2QyOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYU0RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIE5ld1hTRFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCXByaXZhdGUgWFNETmV3RmlsZVBhZ2UgbmV3RmlsZVBhZ2U7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQotCXB1YmxpYyBOZXdYU0RXaXphcmQoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIGFXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBhU2VsZWN0aW9uOwotCQl0aGlzLndvcmtiZW5jaCA9IGFXb3JrYmVuY2g7Ci0KLQkJdGhpcy5zZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvTmV3WFNELnBuZyIpKTsKLQkJdGhpcy5zZXRXaW5kb3dUaXRsZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfV0laQVJEX0NSRUFURV9YU0RfTU9ERUxfVElUTEUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCW5ld0ZpbGVQYWdlID0gbmV3IFhTRE5ld0ZpbGVQYWdlKHNlbGVjdGlvbik7Ci0JCWFkZFBhZ2UobmV3RmlsZVBhZ2UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCUlGaWxlIGZpbGUgPSBuZXdGaWxlUGFnZS5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJLy8KLQkJLy8gR2V0IHRoZSB4c2Qgc2NoZW1hIG5hbWUgZnJvbSB0aGUgZnVsbCBwYXRoIG5hbWUKLQkJLy8gZS5nLiBmOi9iMmIvcG8ueHNkID0+IHNjaGVtYSBuYW1lID0gcG8KLQkJLy8KLQkJSVBhdGggaVBhdGggPSBmaWxlLmdldEZ1bGxQYXRoKCkucmVtb3ZlRmlsZUV4dGVuc2lvbigpOwotCQkvLyBTdHJpbmcgc2NoZW1hTmFtZSA9IGlQYXRoLmxhc3RTZWdtZW50KCk7Ci0JCVN0cmluZyBzY2hlbWFOYW1lID0gaVBhdGgubGFzdFNlZ21lbnQoKTsKLQkJU3RyaW5nIHNjaGVtYVByZWZpeCA9ICJ0bnMiOwotCQlTdHJpbmcgcHJlZml4Rm9yU2NoZW1hTmFtZXNwYWNlID0gIiI7Ci0JCVN0cmluZyBzY2hlbWFOYW1lc3BhY2VBdHRyaWJ1dGUgPSAieG1sbnMiOwotCQlpZiAoWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmlzUXVhbGlmeVhNTFNjaGVtYUxhbmd1YWdlKCkpIHsKLQkJCS8vIEFkZGVkIHRoaXMgaWYgY2hlY2sgYmVmb3JlIGRpc2FsbG93aW5nIGJsYW5rIHByZWZpeGVzIGluIHRoZQotCQkJLy8gcHJlZmVyZW5jZXMuLi4KLQkJCS8vIENhbiB0YWtlIHRoaXMgb3V0LiBTZWUgYWxzbyBYU0RFZGl0b3IKLQkJCWlmIChYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0WE1MU2NoZW1hUHJlZml4KCkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCXByZWZpeEZvclNjaGVtYU5hbWVzcGFjZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRYTUxTY2hlbWFQcmVmaXgoKSArICI6IjsKLQkJCQlzY2hlbWFOYW1lc3BhY2VBdHRyaWJ1dGUgKz0gIjoiICsgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFhNTFNjaGVtYVByZWZpeCgpOwotCQkJfQotCQl9Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBjaGFyU2V0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCQlpZiAoY2hhclNldCA9PSBudWxsIHx8IGNoYXJTZXQudHJpbSgpLmVxdWFscygiIikpIHsKLQkJCWNoYXJTZXQgPSAiVVRGLTgiOwotCQl9Ci0KLQkJU3RyaW5nIG5ld0NvbnRlbnRzID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiIgKyBjaGFyU2V0ICsgIlwiPz5cbiI7Ci0KLQkJU3RyaW5nIGRlZmF1bHRUYXJnZXRVUkkgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0WE1MU2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCk7Ci0JCW5ld0NvbnRlbnRzICs9ICI8IiArIHByZWZpeEZvclNjaGVtYU5hbWVzcGFjZSArICJzY2hlbWEgIiArIHNjaGVtYU5hbWVzcGFjZUF0dHJpYnV0ZSArICI9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIHRhcmdldE5hbWVzcGFjZT1cIiIgKyBkZWZhdWx0VGFyZ2V0VVJJICsgc2NoZW1hTmFtZSArICJcIiB4bWxuczoiICsgc2NoZW1hUHJlZml4ICsgIj1cIiIgKyBkZWZhdWx0VGFyZ2V0VVJJICsgc2NoZW1hTmFtZSArICJcIiBlbGVtZW50Rm9ybURlZmF1bHQ9XCJxdWFsaWZpZWRcIj5cbjwvIiArIHByZWZpeEZvclNjaGVtYU5hbWVzcGFjZSArICJzY2hlbWE+IjsKLQotCQl0cnkgewotCQkJYnl0ZVtdIGJ5dGVzID0gbmV3Q29udGVudHMuZ2V0Qnl0ZXMoY2hhclNldCk7Ci0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7Ci0KLQkJCWZpbGUuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0sIHRydWUsIGZhbHNlLCBudWxsKTsKLQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoIkVycm9yIHdyaXRpbmcKLQkJCS8vIGRlZmF1bHQgY29udGVudDpcbiIgKyBuZXdDb250ZW50cyk7Ci0JCQkvLyBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoZSk7Ci0JCX0KLQotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlyZXZlYWxTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmlsZSkpOwotCQl9Ci0KLQkJb3BlbkVkaXRvcihmaWxlKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmV2ZWFsU2VsZWN0aW9uKGZpbmFsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaCB3b3JrYmVuY2gyOwotCQkJaWYgKHdvcmtiZW5jaCA9PSBudWxsKQotCQkJewotCQkJICB3b3JrYmVuY2gyID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJICB3b3JrYmVuY2gyID0gd29ya2JlbmNoOwotCQkJfQotCQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2gyLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJZmluYWwgSVdvcmtiZW5jaFBhcnQgZm9jdXNQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQlpZiAoZm9jdXNQYXJ0IGluc3RhbmNlb2YgSVNldFNlbGVjdGlvblRhcmdldCkgewotCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCSgoSVNldFNlbGVjdGlvblRhcmdldCkgZm9jdXNQYXJ0KS5zZWxlY3RSZXZlYWwoc2VsZWN0aW9uKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBpRmlsZSkgewotCQlpZiAoaUZpbGUgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaCB3b3JrYmVuY2gyOwotCQkJaWYgKHdvcmtiZW5jaCA9PSBudWxsKQotCQkJewotCQkJICB3b3JrYmVuY2gyID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJICB3b3JrYmVuY2gyID0gd29ya2JlbmNoOwotCQkJfQotCQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2gyLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBlZGl0b3JJZCA9IG51bGw7Ci0JCQkJCQlJRWRpdG9yRGVzY3JpcHRvciBlZGl0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdEVkaXRvcihpRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSwgaUZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJCQllZGl0b3JJZCA9IGVkaXRvci5nZXRJZCgpOwotCQkJCQkJfQotCQkJCQkJd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoaUZpbGUpLCBlZGl0b3JJZCk7Ci0JCQkJCQkKLQkJCQkJfQotCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXgpIHsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhDb21wb3NpdGlvblBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhDb21wb3NpdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExNzEyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4Q29tcG9zaXRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8gQmFzZWQgb24gdmVyc2lvbiAxLjEyIG9mIG9yaWdpbmFsIHhzZGVkaXRvcgotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVmlld1V0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhdHRlcm5GYWNldDsKLQotCi0KLS8qCi0tb3RoZXIgcmVnZXggZmVhdHVyZXMgKGVnIGNhc2Ugc2Vuc2l0aXZpdHksIF4gb3IgJCwgfCwgZXRjIGV0YykKLS1zbWFydGVyIG1vZGVsCi0tYmV0dGVyIGtleWJvYXJkIG5hdmlnYXRpb24KLS11cGRhdGUgbGlzdCBvZiB0b2tlbnMgCi0qLwotCi1wdWJsaWMgY2xhc3MgUmVnZXhDb21wb3NpdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQotICAvKiBUaGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiBvdXIgcGF0dGVybi4gKi8KLSAgcHJpdmF0ZSBTdHlsZWRUZXh0IHZhbHVlOyAKLQotICAvKiBUaGUgU3R5bGVSYW5nZSB1c2VkIHRvIGNvbG9yIGNvZGUgdGhlIGN1cnJlbnQgcGFyc2UgZXJyb3IuICovCi0gIHByaXZhdGUgU3R5bGVSYW5nZSBjdXJyZW50RXJyb3I7Ci0KLSAgLyogVGhlIHJlZ2V4IHRlcm1zIHdlIGNhbiBmb3JtIHRva2VucyBmcm9tLiAqLwotICBwcml2YXRlIENvbWJvIHRlcm1zOwotCi0gIC8qIFRoZSBjaGVja2JveCBmb3IgYWN0aXZhdGluZyBhdXRvLWVzY2FwZSBtb2RlLiAqLyAgCi0gIHByaXZhdGUgQnV0dG9uIGVzY2FwZUNoZWNrYm94OwotICAKLSAgLyogT24vb2ZmIHN0YXR1cyBvZiBhdXRvLWVzY2FwZSBtb2RlLiAqLyAKLSAgcHJpdmF0ZSBib29sZWFuIGF1dG9Fc2NhcGVTdGF0dXM7Ci0KLSAgLyogVGhlIEFkZCBUb2tlbiBidXR0b24uICovCi0gIHByaXZhdGUgQnV0dG9uIGFkZDsKLQotCi0gIC8vIFRoZSBmb2xsb3dpbmcgY29udHJvbHMgYXJlIHVzZWQgaW4gdGhlIG9jY3VycmVuY2Ugc2VsZWN0aW9uIGdyb3VwCi0KLSAgcHJpdmF0ZSBUZXh0IHJlcGVhdFZhbHVlOwotCi0gIHByaXZhdGUgVGV4dCByYW5nZU1pblZhbHVlOwotICBwcml2YXRlIFRleHQgcmFuZ2VNYXhWYWx1ZTsKLSAgcHJpdmF0ZSBMYWJlbCByYW5nZVRvTGFiZWw7ICAKLQotICBwcml2YXRlIEJ1dHRvbiBzaW5nbGVSYWRpbzsKLSAgcHJpdmF0ZSBCdXR0b24gc3RhclJhZGlvOwotICBwcml2YXRlIEJ1dHRvbiBwbHVzUmFkaW87Ci0gIHByaXZhdGUgQnV0dG9uIG9wdGlvbmFsUmFkaW87IAotICBwcml2YXRlIEJ1dHRvbiByZXBlYXRSYWRpbzsKLSAgcHJpdmF0ZSBCdXR0b24gcmFuZ2VSYWRpbzsKLQotICAKLSAgLy8gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgdXNlZCBhcyBwYXJ0IG9mIHRoZSBtb2RlbC4gCi0KLSAgLyogT3VyIHBhdHRlcm4uICovCi0gIHByaXZhdGUgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm47Ci0KLSAgLyogTW9kZWwgdXNlZCB0byBzdG9yZSB0aGUgY3VycmVudCB0b2tlbi4gKi8KLSAgcHJpdmF0ZSBSZWdleE5vZGUgbm9kZTsgICAgCi0KLSAgLyogVGhlIGZsYWdzIHBhc3NlZCB0byB0aGUgbmV3IFJlZ3VsYXJFeHByZXNzaW9uIG9iamVjdC4gIERlZmF1bHQgdmFsdWUgaW5jbHVkZXM6Ci0gICAgICBYID0gWE1MU2NoZW1hIG1vZGUgICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgcmVnZXhGbGFncyA9ICJYIjsKLSAgICAgIAotCi0gIC8qIElzIHRoZSBjdXJyZW50IHJlZ2V4IHRva2VuIHZhbGlkPyAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFRva2VuOwotCi0gIC8qIFRoZSBsYWJlbCB1c2VkIHRvIGluZGljYXRlIHRoZSB2YWx1ZSdzIGNhcmV0IHBvc2l0aW9uIHdoZW4gaXQgbG9vc2VzIGZvY3VzLiAqLwotICBwcml2YXRlIExhYmVsIGNhcmV0TGFiZWw7Ci0KLSAgLyogVGhlIHBpeGVsIG9mZnNldHMgbmVlZGVkIHRvIGFsaWduIHRoZSBsYWJlbCBpY29uIHdpdGggdGhlIGNhcmV0IGxvY2F0aW9uLgotICAgICBUaGVzZSBhcmUgZGVwZW5kZW50IG9uIHRoZSBpY29uIHVzZWQuICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQVJFVF9MQUJFTF9YX09GRlNFVCA9IC0zOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FSRVRfTEFCRUxfWV9PRkZTRVQgPSAxOTsKLQotICAKLSAgLyogRW51bWVyYXRlZCBjb25zdGFudHMgZm9yIHNwZWNpZnlpbmcgdGhlIHR5cGUgb2YgYW4gZXJyb3IgbWVzc2FnZS4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTiA9IDE7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVJTRSA9IDI7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX0VSUk9SX01FU1NBR0VfVFlQRVMgPSAzOwotICAKLSAgLyogVGhlIGN1cnJlbnQgZXJyb3IgbWVzc2FnZSBmb3IgZWFjaCB0eXBlIG9mIGVycm9yLiAgQSB2YWx1ZSBvZiBudWxsIGluZGljYXRlcyBubyBtZXNzYWdlLiAKLSAgICAgVGhlIGFycmF5IGlzIGluZGV4ZWQgYWNjb3JkaW5nIHRvIHRoZSBhYm92ZSBjb25zdGFudHMuCi0gICovCi0gIHByaXZhdGUgU3RyaW5nW10gY3VycmVudEVycm9yTWVzc2FnZXM7Ci0KLQotICBwdWJsaWMgUmVnZXhDb21wb3NpdGlvblBhZ2UoWFNEUGF0dGVybkZhY2V0IHBhdHRlcm4pCi0gIHsKLSAgICBzdXBlcihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0NPTVBPU0lUSU9OX1BBR0VfVElUTEUiKSk7Ci0gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQotICAgIHNldFRpdGxlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfQ09NUE9TSVRJT05fUEFHRV9USVRMRSIpKTsKLSAgICBzZXREZXNjcmlwdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0NPTVBPU0lUSU9OX1BBR0VfREVTQ1JJUFRJT04iKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBTZXQgdXAgb3VyIG1vZGVsIGFuZCB2YWxpZGF0b3IKLSAgICBub2RlID0gbmV3IFJlZ2V4Tm9kZSgpOwotICAgICAgICAKLSAgICBpc1ZhbGlkVG9rZW4gPSB0cnVlOwotCi0gICAgY3VycmVudEVycm9yTWVzc2FnZXMgPSBuZXcgU3RyaW5nW05VTV9FUlJPUl9NRVNTQUdFX1RZUEVTXTsKLQotICAgIC8vIFRoZSBtYWluIGNvbXBvc2l0ZQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGU9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9XSVpBUkRfUEFHRSk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCi0gICAgLy8gVGhlIGNvbXBvc2l0ZSBmb3IgdGhlIHRva2VuIGNvbWJvIGJveCwgbGFiZWwsIGFuZCBhdXRvLWVzY2FwZSBjaGVja2JveAotICAgIENvbXBvc2l0ZSB0b2tlbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgdG9rZW5Db21wb3NpdGVMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIHRva2VuQ29tcG9zaXRlTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIHRva2VuQ29tcG9zaXRlTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICB0b2tlbkNvbXBvc2l0ZS5zZXRMYXlvdXQodG9rZW5Db21wb3NpdGVMYXlvdXQpOwotCi0KLSAgICBuZXcgTGFiZWwodG9rZW5Db21wb3NpdGUsIFNXVC5MRUZUKS5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVE9LRU5fTEFCRUwiKSk7Ci0gICAgCi0gICAgdGVybXMgPSBuZXcgQ29tYm8odG9rZW5Db21wb3NpdGUsIFNXVC5EUk9QX0RPV04pOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGVybXMsIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9UT0tFTl9DT05URU5UUyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBSZWdleE5vZGUuZ2V0TnVtUmVnZXhUZXJtcygpOyBpKyspCi0gICAgewotICAgICAgdGVybXMuYWRkKFJlZ2V4Tm9kZS5nZXRSZWdleFRlcm1UZXh0KGkpKTsKLSAgICB9Ci0gICAgdGVybXMuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgbmV3IENvbWJvTGlzdGVuZXIoKSk7Ci0gICAgdGVybXMuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX1RFUk1TIikpOwotCi0gICAgZXNjYXBlQ2hlY2tib3ggPSBuZXcgQnV0dG9uKHRva2VuQ29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotICAgIGVzY2FwZUNoZWNrYm94LnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9BVVRPX0VTQ0FQRV9DSEVDS0JPWF9MQUJFTCIpKTsKLSAgICBlc2NhcGVDaGVja2JveC5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfQVVUT19FU0NBUEVfQ0hFQ0tCT1giKSk7IAotICAgIGVzY2FwZUNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBDaGVja2JveExpc3RlbmVyKCkpOwotICAgIGF1dG9Fc2NhcGVTdGF0dXMgPSBmYWxzZTsKLQotCi0gICAgLy8gU2V0IHVwIHRoZSBjb21wb3NpdGVzIHBlcnRhaW5pbmcgdG8gdGhlIHNlbGVjdGlvbiBvZiBvY2N1cnJlbmNlIHF1YW50aWZpZXJzCi0KLSAgICBHcm91cCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYS5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfT0NDVVJFTkNFX0xBQkVMIikpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAob2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9XSVpBUkRfUEFHRSk7Ci0gICAgR3JpZExheW91dCBzZWxlY3Rpb25BcmVhTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBzZWxlY3Rpb25BcmVhTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLnNldExheW91dChzZWxlY3Rpb25BcmVhTGF5b3V0KTsKLQotICAgIG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgLy8gTGlzdGVuZXIgdXNlZCBmb3IgYWxsIG9mIHRoZSB0ZXh0IGZpZWxkcwotICAgIFRleHRMaXN0ZW5lciB0ZXh0TGlzdGVuZXIgPSBuZXcgVGV4dExpc3RlbmVyKCk7Ci0gICAgCi0KLSAgICAvLyBBZGQgdGhlIHJhZGlvIGJ1dHRvbnMKLSAgICBSYWRpb1NlbGVjdExpc3RlbmVyIHJhZGlvU2VsZWN0TGlzdGVuZXIgPSBuZXcgUmFkaW9TZWxlY3RMaXN0ZW5lcigpOwotCi0gICAgc2luZ2xlUmFkaW8gPSBhZGRPY2N1cmVuY2VSYWRpb0J1dHRvbihSZWdleE5vZGUuU0lOR0xFLCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgcmFkaW9TZWxlY3RMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzaW5nbGVSYWRpbywgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX0pVU1RfT05DRSk7Ci0gICAgVmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGxlcihvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgMSk7Ci0KLSAgICBzdGFyUmFkaW8gPSBhZGRPY2N1cmVuY2VSYWRpb0J1dHRvbihSZWdleE5vZGUuU1RBUiwgb2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIHJhZGlvU2VsZWN0TGlzdGVuZXIpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc3RhclJhZGlvLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVHRVhfWkVST19PUl9NT1JFKTsKLSAgICBWaWV3VXRpbGl0eS5jcmVhdGVIb3Jpem9udGFsRmlsbGVyKG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLCAxKTsKLQotICAgIHBsdXNSYWRpbyA9IGFkZE9jY3VyZW5jZVJhZGlvQnV0dG9uKFJlZ2V4Tm9kZS5QTFVTLCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgcmFkaW9TZWxlY3RMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwbHVzUmFkaW8sIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9PTkVfT1JfTU9SRSk7Ci0gICAgVmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGxlcihvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgMSk7Ci0KLSAgICBvcHRpb25hbFJhZGlvID0gYWRkT2NjdXJlbmNlUmFkaW9CdXR0b24oUmVnZXhOb2RlLk9QVElPTkFMLCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgcmFkaW9TZWxlY3RMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChvcHRpb25hbFJhZGlvLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVHRVhfT1BUSU9OQUwpOwotICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUhvcml6b250YWxGaWxsZXIob2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIDEpOwotCi0gICAgcmVwZWF0UmFkaW8gPSBhZGRPY2N1cmVuY2VSYWRpb0J1dHRvbihSZWdleE5vZGUuUkVQRUFULCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgcmFkaW9TZWxlY3RMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZXBlYXRSYWRpbywgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1JFUEVBVF9SQURJTyk7Ci0gICAgCi0gICAgcmVwZWF0VmFsdWUgPSBuZXcgVGV4dChvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIHJlcGVhdFZhbHVlLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRleHRMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZXBlYXRWYWx1ZSwgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1JFUEVBVF9GSUVMRCk7Ci0gICAgcmVwZWF0VmFsdWUuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX1JFUEVBVCIpKTsKLSAgICByZXBlYXRWYWx1ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBzZXRFbmFibGVkU3RhdHVzKFJlZ2V4Tm9kZS5SRVBFQVQsIGZhbHNlKTsKLSAgICAKLSAgICByYW5nZVJhZGlvID0gYWRkT2NjdXJlbmNlUmFkaW9CdXR0b24oUmVnZXhOb2RlLlJBTkdFLCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgcmFkaW9TZWxlY3RMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyYW5nZVJhZGlvLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVHRVhfUkFOR0VfUkFESU8pOwotCi0gICAgLy8gQWRkIHRleHQgZmllbGRzIGFuZCBsYWJlbHMgZm9yIHNwZWNpZnlpbmcgdGhlIHJhbmdlICAgIAotICAgIENvbXBvc2l0ZSByYW5nZVdpZGdldHMgPSBuZXcgQ29tcG9zaXRlKG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICByYW5nZVdpZGdldHMuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgIHJhbmdlV2lkZ2V0cy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAKLSAgICByYW5nZU1pblZhbHVlID0gbmV3IFRleHQocmFuZ2VXaWRnZXRzLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgcmFuZ2VNaW5WYWx1ZS5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0ZXh0TGlzdGVuZXIpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmFuZ2VNaW5WYWx1ZSwgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1JBTkdFX01JTklNVU1fRklFTEQpOwotICAgIHJhbmdlTWluVmFsdWUuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX01JTiIpKTsKLSAgICByYW5nZU1pblZhbHVlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIAotICAgIHJhbmdlVG9MYWJlbCA9IG5ldyBMYWJlbChyYW5nZVdpZGdldHMsIFNXVC5OT05FKTsKLSAgICByYW5nZVRvTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RPX0xBQkVMIikpOwotICAgIAotICAgIHJhbmdlTWF4VmFsdWUgPSBuZXcgVGV4dChyYW5nZVdpZGdldHMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICByYW5nZU1heFZhbHVlLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRleHRMaXN0ZW5lcik7Ci0gICAgcmFuZ2VNYXhWYWx1ZS5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfTUFYIikpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmFuZ2VNYXhWYWx1ZSwgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1JBTkdFX01BWElNVU1fRklFTEQpOwotICAgIHJhbmdlTWF4VmFsdWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICBzZXRFbmFibGVkU3RhdHVzKFJlZ2V4Tm9kZS5SQU5HRSwgZmFsc2UpOwotICAgIAotICAgIHNpbmdsZVJhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAKLSAgICAvLyBUaGUgYWRkIGJ1dHRvbgotICAgIGFkZCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBCdXR0b25TZWxlY3RMaXN0ZW5lcigpKTsKLSAgICBhZGQuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0FERF9CVVRUT05fTEFCRUwiKSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChhZGQsIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9BRERfQlVUVE9OKTsKLSAgICBhZGQuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX0FERF9CVVRUT04iKSk7Ci0KLSAgICAKLSAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgIAotICAgIC8vIE91ciBtYWluIHRleHQgYm94Ci0KLSAgICBMYWJlbCB2YWx1ZUxhYmVsPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0gICAgdmFsdWVMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfQ1VSUkVOVF9SRUdFWF9MQUJFTCIpKTsKLSAgICAKLSAgICB2YWx1ZSA9IG5ldyBTdHlsZWRUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIHZhbHVlLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRleHRMaXN0ZW5lcik7Ci0gICAgdmFsdWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGV4dExpc3RlbmVyKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHZhbHVlLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVHRVhfQ1VSUkVOVF9WQUxVRSk7Ci0gICAgdmFsdWUuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX0NVUlJFTlRfUkVHRVgiKSk7Ci0gICAgdmFsdWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICB2YWx1ZS5zZXRGb2N1cygpOwotCi0gICAgLy8gU3R5bGVSYW5nZSB1c2VkIGZvciBoaWdobGlnaHRpbmcgcGFyc2UgZXJyb3JzCi0gICAgY3VycmVudEVycm9yID0gbmV3IFN0eWxlUmFuZ2UoKTsKLSAgICBjdXJyZW50RXJyb3IubGVuZ3RoID0gMTsKLSAgICBjdXJyZW50RXJyb3IuZm9yZWdyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0KLSAgICAvLyBUaGUgY2FyZXQgbGFiZWwKLSAgICBjYXJldExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotICAgIGNhcmV0TGFiZWwuc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9SZWdleFdpemFyZEFycm93LmdpZiIpKTsKLSAgICBjYXJldExhYmVsLnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9DQVJFVF9MQUJFTCIpKTsKLSAgICBzZXRTaG93Q2FyZXRMYWJlbCh0cnVlKTsKLQotICAgIHZhbHVlLmFkZEZvY3VzTGlzdGVuZXIobmV3IFRleHRGb2N1c0xpc3RlbmVyKCkpOwotCi0gICAgdGVybXMuc2VsZWN0KDApOwotCi0KLSAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKQotICB7Ci0gICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQotICAgIHZhbHVlLnNldFRleHQocGF0dGVybi5nZXRMZXhpY2FsVmFsdWUoKSk7Ci0gICAgdmFsdWUuc2V0Q2FyZXRPZmZzZXQodmFsdWUuZ2V0Q2hhckNvdW50KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2aXNpYmxlIHN0YXR1cyBvZiBjYXJldExhYmVsIHRvIHN0YXR1cy4gIElmIHN0YXR1cyBpcyB0cnVlLCB0aGVuIHdlIGFsc28gdXBkYXRlIHRoZSBwb3NpdGlvbgotICAgKiBvZiBjYXJldExhYmVsIGluIG9uZSBvZiB0d28gd2F5cy4gIElmIHRoZXJlIGlzIG5vIGFjdGl2ZSBzZWxlY3Rpb24gaW4gdmFsdWUsIHdlIHNldCBjYXJldExhYmVsJ3MKLSAgICogcG9zaXRpb24gdG8gY29ycmVzcG9uZCB3aXRoIHRoZSBwb3NpdGlvbiBvZiB0aGUgYWN0dWFsIGNhcmV0LiAgQWx0ZXJuYXRpdmVseSwgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIHNlbGVjdGlvbgotICAgKiBpbiB2YWx1ZSwgd2Ugc2V0IGNhcmV0TGFiZWwncyBwb3NpdGlvbiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWxlY3Rpb24uCi0gICAqCi0gICAqIEBwYXJhbSBUaGUgbmV3IHZpc2liaWxpdHkgc3RhdHVzIG9mIGNhcmV0TGFiZWwuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc2V0U2hvd0NhcmV0TGFiZWwoYm9vbGVhbiBzdGF0dXMpCi0gIHsKLSAgICBpZiAoc3RhdHVzKQotICAgIHsKLSAgCi0gICAgICBpbnQgb2Zmc2V0OwotICAgICAgCi0gICAgICBpZiAodmFsdWUuZ2V0U2VsZWN0aW9uVGV4dCgpLmVxdWFscygiIikpCi0gICAgICB7Ci0gICAgICAgIG9mZnNldCA9IHZhbHVlLmdldENhcmV0T2Zmc2V0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG9mZnNldCA9IHZhbHVlLmdldFNlbGVjdGlvbigpLng7Ci0gICAgICB9Ci0gIAotICAgICAgUG9pbnQgcCA9IHZhbHVlLmdldExvY2F0aW9uQXRPZmZzZXQob2Zmc2V0KTsKLSAgICAgIAotICAgICAgcC54ICs9IHZhbHVlLmdldExvY2F0aW9uKCkueDsKLSAgICAgIHAueSA9IHZhbHVlLmdldExvY2F0aW9uKCkueTsKLSAgICAgIAotICAgICAgLy8gUGxhY2UgdGhlIGxhYmVsIHVuZGVyIHZhbHVlLCBhbmQgbWFrZSBzdXJlIGl0IGlzIGFsaWduZWQgd2l0aCB0aGUgY2FyZXQuCi0gICAgICAvLyBUaGUgb2Zmc2V0cyBhcmUgZGVwZW5kZW50IG9uIHRoZSBpY29uIHVzZWQuCi0gICAgICBwLnggKz0gQ0FSRVRfTEFCRUxfWF9PRkZTRVQ7Ci0gICAgICBwLnkgKz0gQ0FSRVRfTEFCRUxfWV9PRkZTRVQ7Ci0gIAotICAgICAgaWYgKGRlYnVnKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBPSU5UOiAiICsgcCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FyZXRMYWJlbC5zZXRMb2NhdGlvbihwKTsKLSAgICAgIGNhcmV0TGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNhcmV0TGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogQWRkcyBhIG5ldyByYWRpbyBidXR0b24gdG8gQ29tcG9zaXRlIGMgd2l0aCBTZWxlY3Rpb25MaXN0ZW5lciBsLiAgVGhlIHRleHQgb2YgdGhlIGJ1dHRvbiBpcyB0aGUgU3RyaW5nIGFzc29jaWF0ZWQgd2l0aAotICAgKiBxdWFudGlmaWVyLgotICAgKgotICAgKiBAcGFyYW0gcXVhbnRpZmllciBUaGUgZGVzaXJlZCBxdWFudGlmaWVyLCBhcyBlbnVtZXJhdGVkIGluIFJlZ2V4Tm9kZS4KLSAgICogQHBhcmFtIGMgVGhlIENvbXBvc2l0ZSB0byBhZGQgdGhlIGJ1dHRvbnMgdG8gKG5vcm1hbGx5IG9jY3VycmVuY2VSYWRpb0J1dHRvbnMpLgotICAgKiBAcGFyYW0gbCBUaGUgU2VsZWN0aW9uTGlzdGVuZXIgKG5vcm1hbGx5IHJhZGlvU2VsZWN0aW9uTGlzdGVuZXIpLgotICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGJ1dHRvbi4KLSAgICovCi0gIHByaXZhdGUgQnV0dG9uIGFkZE9jY3VyZW5jZVJhZGlvQnV0dG9uKGludCBxdWFudGlmaWVyLCBDb21wb3NpdGUgYywgU2VsZWN0aW9uTGlzdGVuZXIgbCkKLSAgewotICAgIEJ1dHRvbiByZXN1bHQgPSBuZXcgQnV0dG9uKGMsIFNXVC5SQURJTyk7Ci0gICAgcmVzdWx0LnNldFRleHQoUmVnZXhOb2RlLmdldFF1YW50aWZpZXJUZXh0KHF1YW50aWZpZXIpKTsKLSAgICByZXN1bHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFZhbGlkYXRlcyB0aGUgcmVnZXggaW4gdmFsdWUuICBJZiB0aGUgcmVnZXggaXMgdmFsaWQsIGNsZWFycyB0aGUgV2l6YXJkJ3MgZXJyb3IgbWVzc2FnZS4gIElmIGl0J3Mgbm90IHZhbGlkLAotICAgKiAgc2V0cyB0aGUgV2l6YXJkJ3MgZXJyb3IgbWVzc2FnZSBhY2NvcmRpbmdseS4KLSAgICoKLSAgICogQHJldHVybiBXaGV0aGVyIHRoZSByZWdleCBpcyB2YWxpZC4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVJlZ2V4KCkKLSAgewotCi0gICAgYm9vbGVhbiBpc1ZhbGlkOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIFdlIHZhbGlkYXRlIHRoZSByZWdleCBieSBjaGVja2luZyB3aGV0aGVyIHdlIGdldCBhIFBhcnNlRXhjZXB0aW9uLgotICAgICAgLy8gQnkgZGVmYXVsdCwgd2UgYXNzdW1lIHRoYXQgaXQncyB2YWxpZCB1bmxlc3Mgd2UgZGV0ZXJtaW5lIG90aGVyd2lzZS4KLSAgICAgIGlzVmFsaWQgPSB0cnVlOwotICAgICAgZGlzcGxheVJlZ2V4RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgdmFsdWUuc2V0U3R5bGVSYW5nZShudWxsKTsKLQotICAgICAgUGF0dGVybi5jb21waWxlKHZhbHVlLmdldFRleHQoKSk7Ci0gICAgfQotICAgIGNhdGNoIChQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIHBlKQotICAgIHsKLSAgICAgIGlzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGRpc3BsYXlSZWdleEVycm9yTWVzc2FnZShwZS5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAvLyBBbiBvZmYtYnktb25lIGJ1ZyBpbiB0aGUgeGVyY2VzIHJlZ2V4IHBhcnNlciB3aWxsIHNvbWV0aW1lcyByZXR1cm4gYSBsb2NhdGlvbiBmb3IgdGhlIHBhcnNlRXJyb3IgdGhhdAotICAgICAgLy8gIGlzIG9mZiB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGVuIHdlIHdhbnQgdG8gaGlnaGxpZ2h0IHRoZSBsYXN0IGNoYXJhY3Rlci4KLSAgICAgIGlmIChwZS5nZXRJbmRleCgpID49IHZhbHVlLmdldFRleHQoKS5sZW5ndGgoKSkKLSAgICAgIHsKLSAgICAgICAgY3VycmVudEVycm9yLnN0YXJ0ID0gdmFsdWUuZ2V0VGV4dCgpLmxlbmd0aCgpIC0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY3VycmVudEVycm9yLnN0YXJ0ID0gcGUuZ2V0SW5kZXgoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRlYnVnKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBhcnNlIEVycm9yIGxvY2F0aW9uOiAiICsgcGUuZ2V0SW5kZXgoKSk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY3VycmVudEVycm9yLnN0YXJ0OiAiICsgY3VycmVudEVycm9yLnN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotCi0gICAgICB2YWx1ZS5zZXRTdHlsZVJhbmdlKGN1cnJlbnRFcnJvcik7Ci0KLSAgICB9Ci0KLSAgICAvLyBBbm90aGVyIGJ1ZyBpbiB0aGUgeGVyY2VzIHBhcnNlciB3aWxsIHNvbWV0aW1lcyB0aHJvdyBhIFJ1bnRpbWVFeGNlcHRpb24gaW5zdGVhZCBvZiBhIFBhcnNlRXhjZXB0aW9uLgotICAgIC8vICBXaGVuIHdlIGdldCBhIFJ1bnRpbWVFeGNlcHRpb24sIHdlIGFyZW4ndCBwcm92aWRlZCB3aXRoIHRoZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdlIG5lZWQgdG8gaGlnaGxpZ2h0Ci0gICAgLy8gIHRoZSBwYXJzZSBlcnJvci4gIFNvLCB3ZSBtZXJlbHkgcmVwb3J0IHRoYXQgdGhlcmUgaXMgYW4gZXJyb3IuCi0gICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpCi0gICAgewotICAgICAgZGlzcGxheVJlZ2V4RXJyb3JNZXNzYWdlKCIiKTsKLSAgICAgIHZhbHVlLnNldFN0eWxlUmFuZ2UobnVsbCk7Ci0gICAgICBpc1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHNldFBhZ2VDb21wbGV0ZShpc1ZhbGlkKTsgICAgCi0gICAgcmV0dXJuIGlzVmFsaWQ7Ci0gIH0KLQotICAKLSAgLyoqCi0gICAqIE1hbmFnZXMgdGhlIGRpc3BsYXkgb2YgZXJyb3IgbWVzc2FnZXMuCi0gICAqIFNldHMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHR5cGUgdG8gZXJyb3JNZXNzYWdlLiAgSWYgZXJyb3JNZXNzYWdlICE9IG51bGwsIHRoZW4gd2Ugc2V0IHRoZSBXaXphcmQncyBlcnJvciBtZXNzYWdlCi0gICAqIHRvIGVycm9yTWVzc2FnZS4gIElmIGVycm9yTWVzc2FnZSA9PSBudWxsLCB0aGVuIHdlIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIHBlbmRpbmcgbWVzc2FnZSBvZiBhbm90aGVyIHR5cGUuCi0gICAqIElmIHdlIGRvLCB0aGVuIGl0IGlzIGRpc3BsYXllZCBhcyB0aGUgV2l6YXJkJ3MgZXJyb3IgbWVzc2FnZS4gIElmIHdlIGRvbid0LCB0aGVuIHRoZSBXaXphcmQncyBlcnJvciBtZXNzYWdlIGZpZWxkCi0gICAqIGlzIGNsZWFyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgVGhlIHRleHQgb2YgdGhlIG5ldyBlcnJvciBtZXNzYWdlLiAgQSB2YWx1ZSBvZiBudWxsIGluZGljYXRlcyB0aGF0IHRoZSBlcnJvciBtZXNzYWdlIHNob3VsZAotICAgKiAgYmUgY2xlYXJlZC4KLSAgICogQHBhcmFtIHR5cGUgVGhlIGVycm9yIHR5cGUsIG9uZSBvZiBQQVJTRSwgVE9LRU4sIG9yIFNFTEVDVElPTi4KLSAgICovIAotICBwcml2YXRlIHZvaWQgZGlzcGxheUVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlLCBpbnQgdHlwZSkKLSAgewotICAgIFN0cmluZyBtZXNzYWdlVG9EaXNwbGF5ID0gbnVsbDsKLQotCi0gICAgY3VycmVudEVycm9yTWVzc2FnZXNbdHlwZV0gPSBlcnJvck1lc3NhZ2U7Ci0KLSAgICBtZXNzYWdlVG9EaXNwbGF5ID0gZXJyb3JNZXNzYWdlOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fRVJST1JfTUVTU0FHRV9UWVBFUzsgaSsrKQotICAgIHsKLSAgICAgIGlmIChtZXNzYWdlVG9EaXNwbGF5ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgbWVzc2FnZVRvRGlzcGxheSA9IGN1cnJlbnRFcnJvck1lc3NhZ2VzW2ldOwotICAgIH0KLQotICAgIHNldEVycm9yTWVzc2FnZShtZXNzYWdlVG9EaXNwbGF5KTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFNldHMgdGhlIFdpemFyZCdzIGVycm9yIG1lc3NhZ2UgdG8gbWVzc2FnZSwgcHJlY2VkZWQgYnkgYSBzdGFuZGFyZCBwcmVmaXguCi0gICAqCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBuZXcgZXJyb3IgbWVzc2FnZSAob3IgbnVsbCB0byBjbGVhciBpdCkuCi0gICAqLwotICBwcml2YXRlIHZvaWQgZGlzcGxheVJlZ2V4RXJyb3JNZXNzYWdlIChTdHJpbmcgZXJyb3JNZXNzYWdlKQotICB7Ci0gICAgaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGRpc3BsYXlFcnJvck1lc3NhZ2UobnVsbCwgUEFSU0UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIAlpZiAoZXJyb3JNZXNzYWdlLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyB3aGVuIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UgYXZhaWxhYmxlLgotICAgIAl7Ci0gICAgICAgIGRpc3BsYXlFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1JFR0VYX0VSUk9SIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJTRSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGRpc3BsYXlFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlLCBQQVJTRSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogVXBkYXRlcyB0aGUgdG9rZW4gc3RhdHVzLiAgU2V0cyBpc1ZhbGlkVG9rZW4gdG8gc3RhdHVzICYmIHRoZSBzdGF0dXMgb2YgdGhlIG90aGVyIGVycm9yIHR5cGUuCi0gICAqIElmIHN0YXR1cyBpcyB0cnVlLCB3ZSBjbGVhciB0aGUgd2l6YXJkJ3MgZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyB0eXBlOyBpZiBpdCBpcyBmYWxzZSwgd2Ugc2V0IGl0IHRvIGVycm9yTWVzc2FnZS4KLSAgICoKLSAgICogQHBhcmFtIHN0YXR1cyBUaGUgbmV3IGlzVmFsaWRUb2tlbiB2YWx1ZS4KLSAgICogQHBhcmFtIGVycm9yTWVzc2FnZSBUaGUgbmV3IGVycm9yIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBlcnJvciAoZWl0aGVyIFRPS0VOIG9yIFNFTEVDVElPTikuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc2V0VG9rZW5TdGF0dXMgKGJvb2xlYW4gc3RhdHVzLCBTdHJpbmcgZXJyb3JNZXNzYWdlLCBpbnQgdHlwZSkKLSAgewotICAgIGJvb2xlYW4gb3RoZXJUeXBlU3RhdHVzID0gICAgICh0eXBlID09IFRPS0VOKSA/IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFcnJvck1lc3NhZ2VzW1NFTEVDVElPTl0gPT0gbnVsbCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVycm9yTWVzc2FnZXNbVE9LRU5dID09IG51bGw7Ci0gICAgCi0gICAgaXNWYWxpZFRva2VuID0gc3RhdHVzICYmIG90aGVyVHlwZVN0YXR1czsKLSAgICBhZGQuc2V0RW5hYmxlZChpc1ZhbGlkVG9rZW4pOwotCi0gICAgaWYgKHN0YXR1cykKLSAgICB7Ci0gICAgICBkaXNwbGF5RXJyb3JNZXNzYWdlKG51bGwsIHR5cGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIAlpZiAoZXJyb3JNZXNzYWdlICE9IG51bGwgJiYgZXJyb3JNZXNzYWdlLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyB3aGVuIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UgYXZhaWxhYmxlLgotICAgIAl7Ci0gICAgICAgIGRpc3BsYXlFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1RPS0VOX0VSUk9SIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZGlzcGxheUVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UsIHR5cGUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIAotICAvKioKLSAgICogVXBkYXRlcyB0aGUgdG9rZW4gc3RhdHVzLiAgU2V0cyBpc1ZhbGlkVG9rZW4gdG8gc3RhdHVzICYmIHRoZSBzdGF0dXMgb2YgdGhlIG90aGVyIGVycm9yIHR5cGUuCi0gICAqIEFsc28gY2xlYXJzIHRoZSB3aXphcmQncyBlcnJvciBtZXNzYWdlIGZvciB0aGlzIHR5cGUuCi0gICAqIFVzdWFsbHkgdXNlZCB0byBzZXQgaXNWYWxpZFRva2VuIHRvIHRydWUuCi0gICAqCi0gICAqIEBwYXJhbSBzdGF0dXMgVGhlIG5ldyBpc1ZhbGlkVG9rZW4gdmFsdWUuCi0gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBlcnJvciAoZWl0aGVyIFRPS0VOIG9yIFNFTEVDVElPTikuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc2V0VG9rZW5TdGF0dXMoYm9vbGVhbiBzdGF0dXMsIGludCB0eXBlKQotICB7Ci0gICAgc2V0VG9rZW5TdGF0dXMoc3RhdHVzLCBudWxsLCB0eXBlKTsKLSAgfQotCi0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZW5hYmxlZCBzdGF0dXMgb2YgdGhlIHRleHQgZmllbGRzIGFuZCBsYWJlbHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcXVhbnRpZmllci4KLSAgICogSWYgc3RhdHVzIGlzIHRydWUsIHRoZW4gZmllbGRzIGFuZCBsYWJlbHMgYXNzb2NpYXRlZCB3aXRoIG90aGVyIHF1YW50aWZpZXJzIGFyZSBkaXNhYmxlZC4KLSAgICogQHBhcmFtIHF1YW50aWZpZXIgVGhlIHF1YW50aWZpZXIgd2hvc2UgZWxlbWVudHMnIGVuYWJsZWQgc3RhdHVzIHdlIHdpc2ggdG8gY2hhbmdlCi0gICAqICAgKGFzIGVudW1lcmF0ZWQgaW4gUmVnZXhOb2RlKS4KLSAgICogQHBhcmFtIHN0YXR1cyBUaGUgbmV3IHN0YXR1cyBvZiB0aGUgZWxlbWVudHMuICBJZiB0cnVlLCB0aGVuIGFsbCBlbGVtZW50cyBhc3NvY2lhdGVkIHdpdGggb3RoZXIgYnV0dG9ucwotICAgKiAgICAgICAgICAgICAgIGFyZSBkaXNhYmxlZC4KLSAgICovICAgIAotICBwcml2YXRlIHZvaWQgc2V0RW5hYmxlZFN0YXR1cyhpbnQgcXVhbnRpZmllciwgYm9vbGVhbiBzdGF0dXMpCi0gIHsKLSAgICBzd2l0Y2ggKHF1YW50aWZpZXIpCi0gICAgewotICAgIAotICAgIGNhc2UgUmVnZXhOb2RlLlJFUEVBVDoKLSAgICAgIHJlcGVhdFZhbHVlLnNldEVuYWJsZWQoc3RhdHVzKTsKLSAgICAgIGlmIChzdGF0dXMpCi0gICAgICB7Ci0gICAgICAgIHJhbmdlTWluVmFsdWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHJhbmdlTWF4VmFsdWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHJhbmdlVG9MYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSZWdleE5vZGUuUkFOR0U6Ci0gICAgICByYW5nZU1pblZhbHVlLnNldEVuYWJsZWQoc3RhdHVzKTsKLSAgICAgIHJhbmdlTWF4VmFsdWUuc2V0RW5hYmxlZChzdGF0dXMpOwotICAgICAgcmFuZ2VUb0xhYmVsLnNldEVuYWJsZWQoc3RhdHVzKTsKLSAgICAgIGlmIChzdGF0dXMpCi0gICAgICB7Ci0gICAgICAgIHJlcGVhdFZhbHVlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHNlbGVjdGlvbiBpbiB2YWx1ZS4gIElmIHRoZXJlIGlzIG5vdCwgd2Ugc2V0IHRoZSBXaXphcmQncyBlcnJvciBtZXNzYWdlIGFjY29yZGluZ2x5LgotICAgKiBJZiB0aGVyZSBpcywgd2UgdXBkYXRlIHRoZSBjb250ZW50cyBvZiBub2RlLiAgSWYgIkN1cnJlbnQgU2VsZWN0aW9uIiBpcyBub3QgdGhlIGN1cnJlbnQgdG9rZW4sIHRoZW4KLSAgICogd2UgY2xlYXIgdGhlIFNlbGVjdGlvbiBlcnJvciBtZXNzYWdlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUN1cnJlbnRTZWxlY3Rpb25TdGF0dXMoKQotICB7Ci0gICAgaWYgKHRlcm1zLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gUmVnZXhOb2RlLlNFTEVDVElPTikKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gdmFsdWUuZ2V0U2VsZWN0aW9uVGV4dCgpOwotICAgICAgaWYgKHNlbGVjdGlvbi5lcXVhbHMoIiIpKQotICAgICAgewotICAgICAgICBzZXRUb2tlblN0YXR1cyhmYWxzZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1NFTEVDVElPTl9FUlJPUiIpLCBTRUxFQ1RJT04pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzZXRUb2tlblN0YXR1cyh0cnVlLCBTRUxFQ1RJT04pOwotICAgICAgICBub2RlLnNldENvbnRlbnRzKHNlbGVjdGlvbik7Ci0gICAgICAgIG5vZGUuc2V0SGFzUGFyZW5zKHRydWUpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0VG9rZW5TdGF0dXModHJ1ZSwgU0VMRUNUSU9OKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVXBkYXRlcyB0aGUgZW5hYmxlZCBzdGF0dXMgb2YgdGhlIGF1dG8tZXNjYXBlIGNoZWNrYm94LiAgSWYgc3RhdHVzIGlzIHRydWUsIHdlIGVuYWJsZSB0aGUgY2hlY2tib3gsIGFuZAotICAgKiBzZXQgaXRzIHNlbGVjdGlvbiBzdGF0dXMgYW5kIG5vZGUncyBhdXRvLWVzY2FwZSBzdGF0dXMgdG8gdGhlIHZhbHVlIG9mIGF1dG9Fc2NhcGVTdGF0dXMuICBJZiBzdGF0dXMgaXMKLSAgICogZmFsc2UsIHRoZW4gd2UgZGlzYWJsZSBhbmQgZGVzZWxlY3QgdGhlIGNoZWNrYm94LCBhbmQgc2V0IG5vZGUncyBzdGF0dXMgdG8gZmFsc2UuCi0gICAqCi0gICAqIEBwYXJhbSBzdGF0dXMgVGhlIG5ldyBlbmFibGVkIHN0YXR1cy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBzZXRFc2NhcGVDaGVja2JveEVuYWJsZWRTdGF0dXMoYm9vbGVhbiBzdGF0dXMpCi0gIHsKLSAgICBpZiAoc3RhdHVzKQotICAgIHsKLSAgICAgIGVzY2FwZUNoZWNrYm94LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICBlc2NhcGVDaGVja2JveC5zZXRTZWxlY3Rpb24oYXV0b0VzY2FwZVN0YXR1cyk7Ci0gICAgICBub2RlLnNldEF1dG9Fc2NhcGVTdGF0dXMoYXV0b0VzY2FwZVN0YXR1cyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlc2NhcGVDaGVja2JveC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIGVzY2FwZUNoZWNrYm94LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICBub2RlLnNldEF1dG9Fc2NhcGVTdGF0dXMoZmFsc2UpOwotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcmVnZXggZmxhZ3MuCi0gICAqLwotICBTdHJpbmcgZ2V0RmxhZ3MoKQotICB7Ci0gICAgcmV0dXJuIHJlZ2V4RmxhZ3M7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBYU0RQYXR0ZXJuIG1vZGVsLgotICAgKi8KLSAgWFNEUGF0dGVybkZhY2V0IGdldFBhdHRlcm4oKQotICB7Ci0gICAgcmV0dXJuIHBhdHRlcm47Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnNpc3Rpbmcgb2YgdGhlIHZhbHVlcyBvZiBtaW4sIG1heCwgYW5kIHJlcGVhdCBzdG9yZWQgaW4gbm9kZS4KLSAgICogVXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCi0gICAqLyAgCi0gIHByaXZhdGUgU3RyaW5nIGdldEFsbEZpZWxkVmFsdWVzKCkKLSAgewotICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotICAgICAgcmVzdWx0ICs9ICJNaW46ICIgKyBub2RlLmdldE1pbigpICsgIlxuIjsKLSAgICAgIHJlc3VsdCArPSAiTWF4OiAiICsgbm9kZS5nZXRNYXgoKSArICJcbiI7Ci0gICAgICByZXN1bHQgKz0gIlJlcGVhdDogIiArIG5vZGUuZ2V0UmVwZWF0KCkgKyAiXG4iOwotICAgICAgcmVzdWx0ICs9ICJcbiI7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotCi0gIC8qIExpc3RlbmVyIGZvciB0aGUgYWRkIGJ1dHRvbi4gKi8KLSAgY2xhc3MgQnV0dG9uU2VsZWN0TGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgIH0KLQotICAgIC8vIFByZWNvbmRpdGlvbjogaXNWYWxpZFRva2VuID09IHRydWUgIAotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgaWYgKCFpc1ZhbGlkVG9rZW4pIC8vIHNob3VsZCBuZXZlciBoYXBwZW4KLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvLyBXaGV0aGVyIHRoZXJlIGlzIGFueXRoaW5nIHNlbGVjdGVkIGluIHZhbHVlLgotICAgICAgYm9vbGVhbiBpc0FjdGl2ZVNlbGVjdGlvbiA9IHZhbHVlLmdldFNlbGVjdGlvbkNvdW50KCkgIT0gMDsKLSAgICAgIAotICAgICAgdmFsdWUuaW5zZXJ0KG5vZGUudG9TdHJpbmcoKSk7Ci0KLSAgICAgIGlmICh0ZXJtcy5nZXRTZWxlY3Rpb25JbmRleCgpID09IFJlZ2V4Tm9kZS5TRUxFQ1RJT04pCi0gICAgICB7Ci0gICAgICAgIHVwZGF0ZUN1cnJlbnRTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgbm90aGluZyBpcyBzZWxlY3RlZCwgdGhlbiB3ZSBuZWVkIHRvIGFkdmFuY2UgdGhlIGNhcmV0IGxvY2F0aW9uLgotICAgICAgaWYgKCFpc0FjdGl2ZVNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgdmFsdWUuc2V0Q2FyZXRPZmZzZXQodmFsdWUuZ2V0Q2FyZXRPZmZzZXQoKSArIG5vZGUudG9TdHJpbmcoKS5sZW5ndGgoKSk7Ci0gICAgICB9Ci0KLSAgICAgIHZhbHVlLnNldEZvY3VzKCk7Ci0KLSAgICB9Ci0KLSAgfQotIAotCi0gIC8qIExpc3RlbmVyIGZvciB0aGUgdGVybXMgY29tYm8gYm94LiAqLwotICBjbGFzcyBDb21ib0xpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpCi0gICAgewotICAgICAgCi0gICAgICB1cGRhdGVDdXJyZW50U2VsZWN0aW9uU3RhdHVzKCk7Ci0KLSAgICAgIC8vIElmIHRoZSB1c2VyIGhhcyB0eXBlZCBpbiBhIHRva2VuCi0gICAgICBpZiAodGVybXMuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgc2V0RXNjYXBlQ2hlY2tib3hFbmFibGVkU3RhdHVzKHRydWUpOwotICAgICAgICBub2RlLnNldENvbnRlbnRzKHRlcm1zLmdldFRleHQoKSk7Ci0gICAgICAgIG5vZGUuc2V0SGFzUGFyZW5zKHRydWUpOwotICAgICAgICAKLQotICAgICAgICBpZiAoZGVidWcpCi0gICAgICAgIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGVybXMuZ2V0VGV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0ZXJtcy5nZXRTZWxlY3Rpb25JbmRleCgpID09IFJlZ2V4Tm9kZS5TRUxFQ1RJT04pCi0gICAgICB7Ci0gICAgICAgIHNldEVzY2FwZUNoZWNrYm94RW5hYmxlZFN0YXR1cyhmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG5vZGUuc2V0Q29udGVudHMoUmVnZXhOb2RlLmdldFJlZ2V4VGVybVZhbHVlKHRlcm1zLmdldFNlbGVjdGlvbkluZGV4KCkpKTsKLSAgICAgICAgbm9kZS5zZXRIYXNQYXJlbnMoZmFsc2UpOwotICAgICAgICBzZXRFc2NhcGVDaGVja2JveEVuYWJsZWRTdGF0dXMoZmFsc2UpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyogTGlzdGVuZXIgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyBjYXJldExhYmVsLiAqLwotICBjbGFzcyBUZXh0Rm9jdXNMaXN0ZW5lciBpbXBsZW1lbnRzIEZvY3VzTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkKLSAgICB7Ci0gICAgICBzZXRTaG93Q2FyZXRMYWJlbChmYWxzZSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpCi0gICAgewotICAgICAgc2V0U2hvd0NhcmV0TGFiZWwodHJ1ZSk7Ci0gICAgfQotICB9Ci0KLQotCi0gIC8qIExpc3RlbmVyIGZvciB0aGUgdGV4dCBmaWVsZHMuICovCi0gIGNsYXNzIFRleHRMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkKLSAgICB7Ci0KLSAgICAgIGlmIChkZWJ1ZykKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnNpZGUgVGV4dExpc3RlbmVyIGhhbmRsZXIiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0QWxsRmllbGRWYWx1ZXMoKSk7Ci0gICAgICB9Ci0KLQotICAgICAgaWYgKCAoZS53aWRnZXQgPT0gdmFsdWUpICYmIChlLnR5cGUgPT0gU1dULk1vZGlmeSkgKQotICAgICAgewotICAgICAgICBwYXR0ZXJuLnNldExleGljYWxWYWx1ZSh2YWx1ZS5nZXRUZXh0KCkpOwotICAgICAgICB2YWxpZGF0ZVJlZ2V4KCk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHZhbHVlICYmIGUudHlwZSA9PSBTV1QuU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBpZiAodGVybXMuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSBSZWdleE5vZGUuU0VMRUNUSU9OKQotICAgICAgICB7Ci0gICAgICAgICAgdXBkYXRlQ3VycmVudFNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHJhbmdlTWluVmFsdWUpCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNWYWxpZCA9IG5vZGUuc2V0TWluKHJhbmdlTWluVmFsdWUuZ2V0VGV4dCgpKTsKLQotICAgICAgICBpZiAoaXNWYWxpZCkKLSAgICAgICAgewotICAgICAgICAgIHNldFRva2VuU3RhdHVzKHRydWUsIG51bGwsIFRPS0VOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRUb2tlblN0YXR1cyhmYWxzZSwgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9NSU5fRVJST1JfU1VGRklYIiksIFRPS0VOKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSByYW5nZU1heFZhbHVlKQotICAgICAgewotICAgICAgICBib29sZWFuIGlzVmFsaWQgPSBub2RlLnNldE1heChyYW5nZU1heFZhbHVlLmdldFRleHQoKSk7Ci0KLSAgICAgICAgaWYgKG5vZGUuZ2V0TWluKCkgPT0gUmVnZXhOb2RlLkVNUFRZKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0VG9rZW5TdGF0dXMoZmFsc2UsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfTUlTU0lOR19NSU5fRVJST1JfU1VGRklYIiksIFRPS0VOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc1ZhbGlkKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0VG9rZW5TdGF0dXModHJ1ZSwgbnVsbCwgVE9LRU4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHNldFRva2VuU3RhdHVzKGZhbHNlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfTUFYX0VSUk9SX1NVRkZJWCIpLCBUT0tFTik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZWxzZSAgLy8gKGUud2lkZ2V0ID09IHJlcGVhdFZhbHVlKQotICAgICAgewotICAgICAgICBib29sZWFuIGlzVmFsaWQgPSBub2RlLnNldFJlcGVhdChyZXBlYXRWYWx1ZS5nZXRUZXh0KCkpOwotICAgICAgICBpZiAoaXNWYWxpZCkKLSAgICAgICAgewotICAgICAgICAgIHNldFRva2VuU3RhdHVzKHRydWUsIG51bGwsIFRPS0VOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRUb2tlblN0YXR1cyhmYWxzZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1JFUEVBVF9FUlJPUl9TVUZGSVgiKSwgVE9LRU4pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogTGlzdGVuZXIgZm9yIHRoZSBhdXRvLWVzY2FwZSBjaGVja2JveC4gKi8KLSAgY2xhc3MgQ2hlY2tib3hMaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICBib29sZWFuIG5ld1N0YXR1cyA9ICFhdXRvRXNjYXBlU3RhdHVzOwotICAgICAgbm9kZS5zZXRBdXRvRXNjYXBlU3RhdHVzKG5ld1N0YXR1cyk7Ci0gICAgICBhdXRvRXNjYXBlU3RhdHVzID0gbmV3U3RhdHVzOwotICAgICAgCi0gICAgICBpZiAoZGVidWcpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQXV0b0VzY2FwZSBTdGF0dXM6ICIgKyBub2RlLmdldEF1dG9Fc2NhcGVTdGF0dXMoKSk7ICAvLyROT04tTkxTLTEkIAotICAgICAgfQotICAgIH0KLQotICB9Ci0KLQotICAvKiBMaXN0ZW5lciBmb3IgdGhlIHJhZGlvIGJ1dHRvbnMuICovCi0gIGNsYXNzIFJhZGlvU2VsZWN0TGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgaWYgKGRlYnVnKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0QWxsRmllbGRWYWx1ZXMoKSk7Ci0gICAgICB9Ci0KLQotICAgICAgaW50IGN1cnJlbnRRdWFudGlmaWVyID0gZ2V0UXVhbnRpZmllcihlKTsKLQotICAgICAgbm9kZS5zZXRRdWFudGlmaWVyKGN1cnJlbnRRdWFudGlmaWVyKTsKLQotICAgICAgc3dpdGNoIChjdXJyZW50UXVhbnRpZmllcikKLSAgICAgIHsKLSAgICAgIGNhc2UgUmVnZXhOb2RlLlNJTkdMRTogICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGNhc2UgUmVnZXhOb2RlLlNUQVI6Ci0gICAgICBjYXNlIFJlZ2V4Tm9kZS5QTFVTOgotICAgICAgY2FzZSBSZWdleE5vZGUuT1BUSU9OQUw6Ci0gICAgICAgIHNldEVuYWJsZWRTdGF0dXMoUmVnZXhOb2RlLlJFUEVBVCwgZmFsc2UpOwotICAgICAgICBzZXRFbmFibGVkU3RhdHVzKFJlZ2V4Tm9kZS5SQU5HRSwgZmFsc2UpOwotICAgICAgICBzZXRUb2tlblN0YXR1cyh0cnVlLCBUT0tFTik7Ci0gICAgICAgIGJyZWFrOyAKLQotICAgICAgY2FzZSBSZWdleE5vZGUuUkVQRUFUOgotICAgICAgICBzZXRFbmFibGVkU3RhdHVzKFJlZ2V4Tm9kZS5SRVBFQVQsIHRydWUpOwotICAgICAgICBzZXRUb2tlblN0YXR1cyhub2RlLmhhc1ZhbGlkUmVwZWF0KCksIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9SRVBFQVRfRVJST1JfU1VGRklYIiksIFRPS0VOKTsKLSAgICAgICAgcmVwZWF0VmFsdWUuc2V0Rm9jdXMoKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgUmVnZXhOb2RlLlJBTkdFOgotICAgICAgICBzZXRFbmFibGVkU3RhdHVzKFJlZ2V4Tm9kZS5SQU5HRSwgdHJ1ZSk7Ci0gICAgICAgIFN0cmluZyBlcnJvciA9IChub2RlLmhhc1ZhbGlkTWluKCkpID8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX01BWF9FUlJPUl9TVUZGSVgiKSA6IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9NSU5fRVJST1JfU1VGRklYIik7Ci0KLSAgICAgICAgc2V0VG9rZW5TdGF0dXMoIG5vZGUuaGFzVmFsaWRNaW4oKSAmJiBub2RlLmhhc1ZhbGlkTWF4KCksIGVycm9yLCBUT0tFTik7Ci0gICAgICAgIHJhbmdlTWluVmFsdWUuc2V0Rm9jdXMoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UXVhbnRpZmllcihTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLQotICAgICAgaWYgKGUud2lkZ2V0ID09IHNpbmdsZVJhZGlvKQotICAgICAgewotICAgICAgICByZXR1cm4gUmVnZXhOb2RlLlNJTkdMRTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gc3RhclJhZGlvKQotICAgICAgewotICAgICAgICByZXR1cm4gUmVnZXhOb2RlLlNUQVI7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHBsdXNSYWRpbykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFJlZ2V4Tm9kZS5QTFVTOwotICAgICAgfQotICAgICAgCi0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBvcHRpb25hbFJhZGlvKQotICAgICAgewotICAgICAgICByZXR1cm4gUmVnZXhOb2RlLk9QVElPTkFMOwotICAgICAgfQotICAgICAgCi0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSByZXBlYXRSYWRpbykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFJlZ2V4Tm9kZS5SRVBFQVQ7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHJhbmdlUmFkaW8pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBSZWdleE5vZGUuUkFOR0U7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGVsc2UgLy8gY2FuJ3QgZ2V0IGhlcmUKLSAgICAgIHsgCi0gICAgICAgIHJldHVybiBSZWdleE5vZGUuRU1QVFk7Ci0gICAgICB9Ci0gICAgfSAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gdmFsdWUuZ2V0VGV4dCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4Tm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9SZWdleE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiYmViYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi0KLWNsYXNzIFJlZ2V4Tm9kZQotewotICBwcml2YXRlIFN0cmluZyBjb250ZW50czsKLSAgcHJpdmF0ZSBpbnQgbWluOwotICBwcml2YXRlIGludCBtYXg7Ci0gIHByaXZhdGUgaW50IHJlcGVhdDsKLSAgcHJpdmF0ZSBpbnQgcXVhbnRpZmllcjsKLSAgcHJpdmF0ZSBib29sZWFuIGhhc1BhcmVuczsKLSAgcHJpdmF0ZSBib29sZWFuIGF1dG9Fc2NhcGVTdGF0dXM7Ci0KLSAgCi0gIC8qIFF1YW50aWZpZXJzLiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU5HTEUgPSAwOyAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUiA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMVVMgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05BTCA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUEVBVCA9IDQ7IAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQU5HRSA9IDU7Ci0KLSAgLyogUmVnZXggcXVhbnRpZmllcnMuICBGaXJzdCBjb2x1bW4gaXMgdGhlIG9uLXNjcmVlbiB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uLCBzZWNvbmQgY29sdW1uIGlzIHRoZSAKLSAgIG9uLXNjcmVlbiByZWdleCByZXByZXNlbnRhdGlvbi4gIFRoZSB0d28gYXJlIGNvbmNhdGVuYXRlZCB0b2dldGhlciB0byBmb3JtIHRoZSBvbi1zY3JlZW4KLSAgIHJlcHJlc2VudGF0aW9uLgotICAgSW5kZXhpbmcgb2YgdGhpcyBhcnJheSBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHZhbHVlcyBvZiB0aGUgcXVhbnRpZmllciBjb25zdGFudHMgYWJvdmUuCi0gICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdW10gcmVnZXhRdWFudGlmaWVycyA9Ci0gIHsgCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfU0lOR0xFIiksICAgIiIgIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfU1RBUiIpLCAgICAgIioiIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfUExVUyIpLCAgICAgIisiIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfT1BUSU9OQUwiKSwgIj8iIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfUkVQRUFUIiksICAgIiIgIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfUkFOR0UiKSwgICAgIiIgIH0sCi0gIH07Ci0KLQotICAvKiBSZWdleCB0b2tlbnMuICBGaXJzdCBjb2x1bW4gaXMgdGhlIG9uLXNjcmVlbiByZXByZXNlbnRhdGlvbiwgc2Vjb25kIGNvbHVtbiBpcyB0aGUgcmVnZXggcmVwcmVzZW50YXRpb24uIAotICAgICBNb3JlIHRva2VucyBjYW4gYmUgYWRkZWQsIGJ1dCBpdCBpcyBhc3N1bWVkIHRoYXQgIkN1cnJlbnQgU2VsZWN0aW9uIiBpcyB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBhcnJheS4KLSAgICAgSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHRoZW4gdGhlIHZhbHVlIG9mIHRoZSBTRUxFQ1RJT04gY29uc3RhbnQgYmVsb3cgd2lsbCBuZWVkIHRvIGJlIGNoYW5nZWQgCi0gICAgIGFjY29yZGluZ2x5LgotICAgICBBbHNvIG5vdGUgdGhhdCBiZWNhdXNlIHRoZXNlIGFyZSBqYXZhIFN0cmluZ3MsIGJhY2tzbGFzaGVzIG11c3QgYmUgZXNjYXBlZCAodGhpcyBpcyBvbmx5IHJlbGV2YW50IHRvIHRoZQotICAgICBzZWNvbmQgY29sdW1uIG9mIHRoZSBhcnJheSkuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXVtdIHJlZ2V4VGVybXMgPQotICB7IAotICAgIHsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVJNX0FOWV9DSEFSIiksICAgIi4iICAgICB9LAotICAgIHsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVJNX0FMUEhBTlVNRVJJQ19DSEFSIiksICAgIlxcdyIgICAgIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFUk1fV0hJVEVTUEFDRSIpLCAiXFxzIiAgIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFUk1fRElHSVQiKSwgICAgICAiXFxkIiAgIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFUk1fVVBQRVIiKSwgICAgICAiW0EtWl0iIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFUk1fTE9XRVIiKSwgICAgICAiW2Etel0iIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFUk1fU0VMRUNUSU9OIiksICAiIiAgICAgIH0sCi0gIH07Ci0KLSAgLyogVG9rZW4gZW51bWVyYXRlZCBjb25zdGFudHMuICovCi0KLSAgLy8gU0VMRUNUSU9OIG11c3QgY29ycmVzcG9uZCB0byB0aGUgaW5kZXggaW4gcmVnZXhUZXJtcyBvZiAiQ3VycmVudCBTZWxlY3Rpb24iLiAgVGhpcyBpcyBhc3N1bWVkIHRvIGJlCi0gIC8vICB0aGUgbGFzdCBlbGVtZW50LgotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RJT04gPSByZWdleFRlcm1zLmxlbmd0aCAtIDE7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU1QVFkgPSAtMTsKLQotICAvKiAKLSAgVGhlIG1ldGFjaGFyYWN0ZXJzIHJlY29nbml6ZWQgYnkgWE1MIFNjaGVtYS4KLSAgTm90ZSB0aGF0IHRoZSBkb3VibGUgYmFja3NsYXNoICgiXFwiKSBhY3R1YWxseSByZXByZXNlbnRzIGFuIGVzY2FwZWQgc2luZ2xlIGJhY2tzbGFzaCBjaGFyYWN0ZXIgKCJcIikuCi0gICovIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbWV0YWNoYXJhY3RlcnMgPSAiLlxcPyore30oKVtdIjsKLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlZ2V4VGVybVRleHQoaW50IGkpCi0gIHsKLSAgICBpZiAoaSA9PSBTRUxFQ1RJT04pCi0gICAgewotICAgICAgcmV0dXJuIHJlZ2V4VGVybXNbaV1bMF07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gcmVnZXhUZXJtc1tpXVswXSArICIgKCAiICsgcmVnZXhUZXJtc1tpXVsxXSArICIgKSI7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVnZXhUZXJtVmFsdWUoaW50IGkpCi0gIHsKLSAgICBpZiAoaSA9PSBTRUxFQ1RJT04pIC8vIHNob3VsZG4ndCBoYXBwZW4KLSAgICB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gcmVnZXhUZXJtc1tpXVsxXTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBnZXROdW1SZWdleFRlcm1zKCkKLSAgewotICAgIHJldHVybiByZWdleFRlcm1zLmxlbmd0aDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFF1YW50aWZpZXJUZXh0KGludCBpKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IHJlZ2V4UXVhbnRpZmllcnNbaV1bMF07Ci0gICAgCi0gICAgaWYgKCFyZWdleFF1YW50aWZpZXJzW2ldWzFdLmVxdWFscygiIikpCi0gICAgewotICAgICAgcmVzdWx0ICs9ICIgKCAiOwotICAgICAgcmVzdWx0ICs9IHJlZ2V4UXVhbnRpZmllcnNbaV1bMV07Ci0gICAgICByZXN1bHQgKz0gIiApIjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIFJlZ2V4Tm9kZSgpCi0gIHsKLSAgICB0aGlzLmNvbnRlbnRzID0gIiI7Ci0gICAgdGhpcy5xdWFudGlmaWVyID0gU0lOR0xFOwotICAgIHRoaXMubWluID0gRU1QVFk7Ci0gICAgdGhpcy5tYXggPSBFTVBUWTsKLSAgICB0aGlzLnJlcGVhdCA9IEVNUFRZOwotICAgIHRoaXMuaGFzUGFyZW5zID0gZmFsc2U7Ci0KLSAgfQotCi0gIAotICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRzKCkKLSAgewotICAgIHJldHVybiBjb250ZW50czsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29udGVudHMoU3RyaW5nIGNvbnRlbnRzKQotICB7Ci0gICAgdGhpcy5jb250ZW50cyA9IGNvbnRlbnRzOwotICB9Ci0KLQotICBwdWJsaWMgaW50IGdldFF1YW50aWZpZXIoKQotICB7Ci0gICAgcmV0dXJuIHF1YW50aWZpZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRRdWFudGlmaWVyKGludCBxdWFudGlmaWVyKQotICB7Ci0gICAgdGhpcy5xdWFudGlmaWVyID0gcXVhbnRpZmllcjsKLSAgfQotCi0KLSAgcHVibGljIGludCBnZXRNaW4oKQotICB7Ci0gICAgcmV0dXJuIG1pbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1pbihpbnQgbWluKQotICB7Ci0gICAgdGhpcy5taW4gPSBtaW47Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGlzLm1pbiB0byB0aGUgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBtaW4gaWZmIG1pbiBpcyBhIHZhbGlkIHZhbHVlIChpLmUuIGdyZWF0ZXIgdGhhbiAwKS4KLSAgICogU2V0cyB0aGlzLm1pbiB0byBFTVBUWSBpZiBpdCBpcyBub3QuCi0gICAqCi0gICAqIEBwYXJhbSBtaW4gVGhlIG5ldyBtaW4gdmFsdWUKLSAgICogQHJldHVybnMgV2hldGhlciBtaW4gd2FzIGEgdmFsaWQgdmFsdWUKLSAgICovICAKLSAgcHVibGljIGJvb2xlYW4gc2V0TWluKFN0cmluZyBtaW4pCi0gIHsKLSAgICB0aGlzLm1pbiA9IGNvbnZlcnRUb0ludChtaW4pOwotCi0gICAgLy8gbWluID4gbWF4IGlzIGFuIGludmFsaWQgY2FzZSwgdW5sZXNzIG1heCBpcyBFTVBUWSAoc2luY2UgRU1QVFkgPT0gLTEpLgotICAgIGlmICggKHRoaXMubWF4ICE9IEVNUFRZKSAmJiAodGhpcy5taW4gPiB0aGlzLm1heCkgKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuICh0aGlzLm1pbiA+PSAwKTsKLSAgfQotCi0gIAotICBwdWJsaWMgaW50IGdldE1heCgpCi0gIHsKLSAgICByZXR1cm4gbWF4OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNYXgoaW50IG1heCkKLSAgewotICAgIHRoaXMubWF4ID0gbWF4OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhpcy5tYXggdG8gdGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgbWF4IGlmZiBtYXggaXMgYSB2YWxpZCB2YWx1ZSAoaS5lLiBncmVhdGVyIHRoYW4gMCkuCi0gICAqIFNldHMgdGhpcy5tYXggdG8gRU1QVFkgaWYgaXQgaXMgbm90LgotICAgKgotICAgKiBAcGFyYW0gbWF4IFRoZSBuZXcgbWF4IHZhbHVlCi0gICAqIEByZXR1cm5zIFdoZXRoZXIgbWF4IHdhcyBhIHZhbGlkIHZhbHVlLCBvciAod2hldGhlciBtYXggPT0gdGhlIGVtcHR5IHN0cmluZyAmJiBtaW4gaGFzIGEgdmFsaWQgdmFsdWUpCi0gICAqLyAKLSAgcHVibGljIGJvb2xlYW4gc2V0TWF4KFN0cmluZyBtYXgpCi0gIHsKLSAgICB0aGlzLm1heCA9IGNvbnZlcnRUb0ludChtYXgpOwotCi0gICAgLy8gVGhlIGVtcHR5IHN0cmluZyBpcyBhIHZhbGlkIG1heCB2YWx1ZSBpZmYgbWluIGhhcyBhIHZhbGlkIHZhbHVlLgotICAgIC8vIFRoaXMgaXMgZHVlIHRvIHRoZSBmYWN0IHRoYXQge24sfSBtZWFucyAiYXQgbGVhc3QgbiB0aW1lcyIgaW4gcmVnZXggcGFybGFuY2UuCi0gICAgaWYgKG1heC5lcXVhbHMoIiIpICYmIHRoaXMubWluICE9IEVNUFRZKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBlbHNlIGlmICh0aGlzLm1heCA8IHRoaXMubWluKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiAodGhpcy5tYXggPj0gMCk7Ci0gICAgfQotICB9Ci0KLQotIAotICBwdWJsaWMgaW50IGdldFJlcGVhdCgpCi0gIHsKLSAgICByZXR1cm4gcmVwZWF0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVwZWF0KGludCByZXBlYXQpCi0gIHsKLSAgICB0aGlzLnJlcGVhdCA9IHJlcGVhdDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoaXMucmVwZWF0IHRvIHRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHJlcGVhdCBpZmYgcmVwZWF0IGlzIGEgdmFsaWQgdmFsdWUgKGkuZS4gZ3JlYXRlciB0aGFuIDApLgotICAgKiBTZXRzIHRoaXMucmVwZWF0IHRvIEVNUFRZIGlmIGl0IGlzIG5vdC4KLSAgICoKLSAgICogQHBhcmFtIHJlcGVhdCBUaGUgbmV3IHJlcGVhdCB2YWx1ZQotICAgKiBAcmV0dXJucyBXaGV0aGVyIHJlcGVhdCB3YXMgYSB2YWxpZCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0UmVwZWF0KFN0cmluZyByZXBlYXQpCi0gIHsKLSAgICB0aGlzLnJlcGVhdCA9IGNvbnZlcnRUb0ludChyZXBlYXQpOwotICAgIHJldHVybiAodGhpcy5yZXBlYXQgPj0gMCk7Ci0gIH0KLQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2Ygcy4gIElmIHMgaXMgbGVzcyB0aGFuIHplcm8sIG9yIGlmIHMgaXMgbm90IGFuIGludAotICAgKiAoaS5lLiBpZiBJbnRlZ2VyLnBhcnNlSW50IHdvdWxkIHRocm93IGEgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKSwgdGhlbiByZXR1cm5zIEVNUFRZLgotICAgKgotICAgKiBAcGFyYW0gcyBUaGUgU3RyaW5nIHRvIGNvbnZlcnQuCi0gICAqIEByZXR1cm5zIFRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHMuCi0gICAqLwotICBwcml2YXRlIGludCBjb252ZXJ0VG9JbnQoU3RyaW5nIHMpCi0gIHsKLSAgICBpbnQgcmVzdWx0OwotICAgIHRyeQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEludGVnZXIucGFyc2VJbnQocyk7Ci0gICAgICBpZiAocmVzdWx0IDwgMCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gRU1QVFk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBFTVBUWTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRIYXNQYXJlbnMoKQotICB7Ci0gICAgcmV0dXJuIGhhc1BhcmVuczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEhhc1BhcmVucyhib29sZWFuIHN0YXR1cykKLSAgewotICAgIHRoaXMuaGFzUGFyZW5zID0gc3RhdHVzOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0QXV0b0VzY2FwZVN0YXR1cygpCi0gIHsKLSAgICByZXR1cm4gYXV0b0VzY2FwZVN0YXR1czsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEF1dG9Fc2NhcGVTdGF0dXMoYm9vbGVhbiBzdGF0dXMpCi0gIHsKLSAgICB0aGlzLmF1dG9Fc2NhcGVTdGF0dXMgPSBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBlc2NhcGVkIHZlcnNpb24gb2Ygcy4gIEluIG90aGVyIHdvcmRzLCBlYWNoIG9jY3VycmVuY2Ugb2YgYSBtZXRhY2hhcmFjdGVyICggLlw/Kit7fSgpW10gKQotICAgKiBpcyByZXBsYWNlZCBieSB0aGF0IGNoYXJhY3RlciBwcmVjZWRlZCBieSBhIGJhY2tzbGFzaC4KLSAgICoKLSAgICogQHBhcmFtIHMgVGhlIFN0cmluZyB0byBlc2NhcGUuCi0gICAqIEByZXR1cm5zIEFuIGVzY2FwZWQgdmVyc2lvbiBvZiBzLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgYWRkRXNjYXBlQ2hhcmFjdGVycyhTdHJpbmcgcykKLSAgewotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgY3VycmVudENoYXIgPSBzLmNoYXJBdChpKTsKLQotICAgICAgaWYgKGlzTWV0YWNoYXIoY3VycmVudENoYXIpKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKCJcXCIpOyAvLyBOb3RlIHRoYXQgdGhpcyBpcyBhbiBlc2NhcGVkIGJhY2tzbGFzaCwgbm90IGEgZG91YmxlIGJhY2tzbGFzaC4KLSAgICAgIH0KLSAgICAgIHJlc3VsdC5hcHBlbmQoY3VycmVudENoYXIpOwotCi0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB3aGV0aGVyIGMgaXMgYSBtZXRhY2hhcmFjdGVyIGFzIGRlZmluZWQgaW4gdGhlIHN0YXRpYyB2YXJpYWJsZSBtZXRhY2hhcmFjdGVycy4KLSAgICoKLSAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICogQHJldHVybnMgV2hldGhlciBjIGlzIGEgbWV0YWNoYXJhY3Rlci4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc01ldGFjaGFyKGNoYXIgYykKLSAgewotICAgIHJldHVybiBtZXRhY2hhcmFjdGVycy5pbmRleE9mKGMpICE9IC0xOwotICB9Ci0gIAotCi0gIHB1YmxpYyBib29sZWFuIGhhc1ZhbGlkTWluKCkKLSAgewotICAgIHJldHVybiAobWluICE9IEVNUFRZKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGhhc1ZhbGlkTWF4KCkKLSAgewotICAgIHJldHVybihtYXggIT0gRU1QVFkpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaGFzVmFsaWRSZXBlYXQoKQotICB7Ci0gICAgcmV0dXJuKHJlcGVhdCAhPSBFTVBUWSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSAiIjsKLSAgICAKLSAgICBpZiAoaGFzUGFyZW5zKQotICAgIHsKLSAgICAgIHJlc3VsdCArPSAiKCI7Ci0gICAgfQotICAgIAotICAgIGlmIChhdXRvRXNjYXBlU3RhdHVzKQotICAgIHsKLSAgICAgICByZXN1bHQgKz0gYWRkRXNjYXBlQ2hhcmFjdGVycyhjb250ZW50cyk7Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgcmVzdWx0ICs9IGNvbnRlbnRzOwotICAgIH0KLQotCi0gICAgaWYgKGhhc1BhcmVucykKLSAgICB7Ci0gICAgICByZXN1bHQgKz0gIikiOwotICAgIH0KLSAgICAKLSAgICBzd2l0Y2ggKHF1YW50aWZpZXIpCi0gICAgewotICAgICAgY2FzZSBTVEFSOgotICAgICAgICByZXN1bHQgKz0gIioiOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBQTFVTOgotICAgICAgICByZXN1bHQgKz0gIisiOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBPUFRJT05BTDoKLSAgICAgICAgcmVzdWx0ICs9ICI/IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgUkVQRUFUOgotICAgICAgICByZXN1bHQgKz0gInsiICsgcmVwZWF0ICsgIn0iOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgcmVzdWx0ICs9ICJ7IiArIG1pbiArICIsIjsKLSAgICAgICAgaWYgKG1heCA9PSBFTVBUWSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCArPSAiIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgKz0gbWF4OwotICAgICAgICB9ICAgICAgIAotICAgICAgICByZXN1bHQgKz0gIn0iOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgLy8gU0lOR0xFIGlzIGEgZmFsbCB0aHJvdWdoICAgICAgICAgICAKLQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4VGVzdGluZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhUZXN0aW5nUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODhjNmVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhUZXN0aW5nUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIEJhc2VkIG9uIHZlcnNpb24gMS42IG9mIG9yaWdpbmFsIHhzZGVkaXRvcgotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5UZXh0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVmlld1V0aWxpdHk7Ci0KLQotcHVibGljIGNsYXNzIFJlZ2V4VGVzdGluZ1BhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlCi17Ci0gIC8qIFZhbGlkYXRvciBmcm9tIHhlcmNlcyBwYWNrYWdlLiAqLwotLy8gIHByaXZhdGUgUmVndWxhckV4cHJlc3Npb24gdmFsaWRhdG9yOwotICAKLSAgLyogRGlzcGxheXMgdGhlIHN0YXR1cyBvZiB0aGUgbWF0Y2guICovCi0gIHByaXZhdGUgTGFiZWwgbWF0Y2hMYWJlbDsKLQotCi0gIC8qIFRoZSByZWdleC4gKi8KLSAgcHJpdmF0ZSBUZXh0IHZhbHVlOwotICAKLSAgLyogVGhlIHN0cmluZyB0aGUgdXNlciBpcyB0cnlpbmcgdG8gbWF0Y2ggYWdhaW5zdCB0aGUgcmVnZXguICovCi0gIHByaXZhdGUgU3R5bGVkVGV4dCB0ZXN0U3RyaW5nOwotCi0gIHB1YmxpYyBSZWdleFRlc3RpbmdQYWdlKCkKLSAgewotICAgIHN1cGVyKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVEVTVElOR19QQUdFX1RJVExFIikpOwotCi0gICAgc2V0VGl0bGUoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVNUSU5HX1BBR0VfVElUTEUiKSk7Ci0gICAgc2V0RGVzY3JpcHRpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVNUSU5HX1BBR0VfREVTQ1JJUFRJT04iKSk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1RFU1RfUEFHRSk7Ci0KLSAgICBtYXRjaExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotICAgIG1hdGNoTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFU1RJTkdfUEFHRV9ERVNDUklQVElPTiIpKTsKLSAgICBGb250RGF0YVtdIGZvbnREYXRhID0gbWF0Y2hMYWJlbC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKLSAgICBHcmlkRGF0YSBkYXRhRiA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGFGLndpZHRoSGludCA9IDQwMDsKLSAgICBkYXRhRi5oZWlnaHRIaW50ID0gNiAqIGZvbnREYXRhWzBdLmdldEhlaWdodCgpOwotICAgIG1hdGNoTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhRik7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGNvbnRyb2xzID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGNvbnRyb2xzTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBjb250cm9sc0xheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBjb250cm9scy5zZXRMYXlvdXQoY29udHJvbHNMYXlvdXQpOwotICAgIGNvbnRyb2xzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgbmV3IExhYmVsKGNvbnRyb2xzLCBTV1QuTEVGVCkuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1JFR0VYX0xBQkVMIikpOwotICAgIHZhbHVlID0gbmV3IFRleHQoY29udHJvbHMsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICB2YWx1ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCi0gICAgbmV3IExhYmVsKGNvbnRyb2xzLCBTV1QuTEVGVCkuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1NBTVBMRV9URVhUIikpOwotICAgIHRlc3RTdHJpbmcgPSBuZXcgU3R5bGVkVGV4dChjb250cm9scywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGVzdFN0cmluZywgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1NBTVBMRV9URVhUKTsKLSAgICB0ZXN0U3RyaW5nLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIG5ldyBUZXN0U3RyaW5nTGlzdGVuZXIoKSk7Ci0gICAgdGVzdFN0cmluZy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAKLSAgICBjb250cm9scy5wYWNrKCk7Ci0gICAgCi0gICAgTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBHQyBnYyA9IG5ldyBHQyhzZXBhcmF0b3IpOwotICAgIFBvaW50IHBvaW50U2l6ZSA9IGdjLnN0cmluZ0V4dGVudChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFU1RJTkdfUEFHRV9ERVNDUklQVElPTiIpKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLndpZHRoSGludCA9IHBvaW50U2l6ZS54IC8gMiArIGdjLmdldEFkdmFuY2VXaWR0aCgnTScpKjExOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QpOwotICAgIAotICAgIGNvbXBvc2l0ZS5wYWNrKCk7Ci0KLSAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0gIH0KLQotCi0gIHByaXZhdGUgU3RyaW5nIGdldFBhdHRlcm5WYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gKCAoUmVnZXhDb21wb3NpdGlvblBhZ2UpZ2V0UHJldmlvdXNQYWdlKCkgKS5nZXRQYXR0ZXJuKCkuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRGbGFncygpCi0gIHsKLSAgICByZXR1cm4gKCAoUmVnZXhDb21wb3NpdGlvblBhZ2UpZ2V0UHJldmlvdXNQYWdlKCkgKS5nZXRGbGFncygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpCi0gIHsKLSAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCi0gICAgZ2V0RmxhZ3MoKTsKLSAgICB2YWx1ZS5zZXRUZXh0KFRleHRQcm9jZXNzb3IucHJvY2VzcyhnZXRQYXR0ZXJuVmFsdWUoKSkpOwotICAgIHVwZGF0ZU1hdGNoU3RhdHVzKCk7Ci0gICAgdGVzdFN0cmluZy5zZXRGb2N1cygpOwotICB9Ci0KLSAgY2xhc3MgVGVzdFN0cmluZ0xpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpCi0gICAgewotICAgICAgdXBkYXRlTWF0Y2hTdGF0dXMoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlTWF0Y2hTdGF0dXMoKQotICB7Ci0gICAgaWYgKFBhdHRlcm4ubWF0Y2hlcyhnZXRQYXR0ZXJuVmFsdWUoKSwgdGVzdFN0cmluZy5nZXRUZXh0KCkpKQotICAgIHsKLS8vICAgICAgbWF0Y2hMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfTUFUQ0hFUyIpKTsKLSAgICAgIHNldE1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9NQVRDSEVTIiksIDEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0TWVzc2FnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0RPRVNfTk9UX01BVENIIiksIDIpOwotLy8gICAgICBtYXRjaExhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9ET0VTX05PVF9NQVRDSCIpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM0MWY2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGF0dGVybkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTREZhY3RvcnlJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBSZWdleFdpemFyZCBleHRlbmRzIFdpemFyZCAKLXsKLSAgcHJpdmF0ZSBSZWdleENvbXBvc2l0aW9uUGFnZSBjb21wb3NpdGlvblBhZ2U7Ci0gIHByaXZhdGUgUmVnZXhUZXN0aW5nUGFnZSB0ZXN0aW5nUGFnZTsKLQotICAvKiBUaGUgb3JpZ2luYWwsIHVuY2hhbmdlZCBwYXR0ZXJuLiAqLyAgCi0gIHByaXZhdGUgWFNEUGF0dGVybkZhY2V0IG9yaWdpbmFsUGF0dGVybjsKLSAgCi0gIC8qIEEgY29weSBvZiB0aGUgb3JpZ2luYWwgcGF0dGVybiB0aGF0IGlzIHBhc3NlZCBpbnRvIHRoZSB3aXphcmQuICovCi0gIHByaXZhdGUgWFNEUGF0dGVybkZhY2V0IG1vZGlmaWVkUGF0dGVybjsKLQotICBTdHJpbmcgcGF0dGVybjsKLQotICBwdWJsaWMgUmVnZXhXaXphcmQoU3RyaW5nIGV4cHIpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHNldFdpbmRvd1RpdGxlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVElUTEUiKSk7Ci0gICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL3JlZ3hfd2l6LnBuZyIpKTsKLQotICAgIFhTREZhY3RvcnlJbXBsIGZhY3RvcnkgPSBuZXcgWFNERmFjdG9yeUltcGwoKTsKLSAgICBtb2RpZmllZFBhdHRlcm4gPSBmYWN0b3J5LmNyZWF0ZVhTRFBhdHRlcm5GYWNldCgpOwotICAgIG1vZGlmaWVkUGF0dGVybi5zZXRMZXhpY2FsVmFsdWUoZXhwcik7Ci0KLSAgICBvcmlnaW5hbFBhdHRlcm4gPSBmYWN0b3J5LmNyZWF0ZVhTRFBhdHRlcm5GYWNldCgpOwotICAgIG9yaWdpbmFsUGF0dGVybi5zZXRMZXhpY2FsVmFsdWUoZXhwcik7Ci0KLSAgICBjb21wb3NpdGlvblBhZ2UgPSBuZXcgUmVnZXhDb21wb3NpdGlvblBhZ2UobW9kaWZpZWRQYXR0ZXJuKTsKLSAgICBhZGRQYWdlKGNvbXBvc2l0aW9uUGFnZSk7Ci0KLSAgICB0ZXN0aW5nUGFnZSA9IG5ldyBSZWdleFRlc3RpbmdQYWdlKCk7Ci0gICAgYWRkUGFnZSh0ZXN0aW5nUGFnZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm4oKQotICB7Ci0gICAgcmV0dXJuIHBhdHRlcm47Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpCi0gIHsKLSAgICByZXR1cm4gKGNvbXBvc2l0aW9uUGFnZS5nZXRWYWx1ZSgpLmxlbmd0aCgpID4gMCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkKLSAgewotICAgIHBhdHRlcm4gPSBtb2RpZmllZFBhdHRlcm4uZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvWFNETG9jYXRpb25DaG9pY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1hTRExvY2F0aW9uQ2hvaWNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzA5ZjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvWFNETG9jYXRpb25DaG9pY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5WaWV3VXRpbGl0eTsKLQotCi1wdWJsaWMgY2xhc3MgWFNETG9jYXRpb25DaG9pY2VQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSAKLXsKLSAgcHJvdGVjdGVkIEJ1dHRvbiByYWRpb0J1dHRvbjE7Ci0gIHByb3RlY3RlZCBCdXR0b24gcmFkaW9CdXR0b24yOwotICAgIAotICBwdWJsaWMgWFNETG9jYXRpb25DaG9pY2VQYWdlKCkKLSAgewotICAgIHN1cGVyKCJYU0RMb2NhdGlvbkNob2ljZVBhZ2UiKTsKLQotICAgIHRoaXMuc2V0VGl0bGUoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1dJWkFSRF9JTkNMVURFX0ZJTEVfVElUTEUiKSk7Ci0gICAgdGhpcy5zZXREZXNjcmlwdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfV0laQVJEX0lOQ0xVREVfRklMRV9ERVNDIikpOwotICB9Ci0gICAgCi0gIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBiYXNlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBiYXNlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICAgIAotICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGJhc2UsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9JTkNMVURFX1VSTF9GSUxFIikpOwotICAgIENvbXBvc2l0ZSByYWRpb0J1dHRvbnNHcm91cCA9IFZpZXdVdGlsaXR5LmNyZWF0ZUNvbXBvc2l0ZShiYXNlLCAxLCB0cnVlKTsKLQotICAgIHJhZGlvQnV0dG9uMSA9IFZpZXdVdGlsaXR5LmNyZWF0ZVJhZGlvQnV0dG9uKHJhZGlvQnV0dG9uc0dyb3VwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fRklMRSIpKTsKLSAgICAgIAotICAgIHJhZGlvQnV0dG9uMiA9IFZpZXdVdGlsaXR5LmNyZWF0ZVJhZGlvQnV0dG9uKHJhZGlvQnV0dG9uc0dyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SQURJT19VUkwiKSk7Ci0KLSAgICByYWRpb0J1dHRvbjEuc2V0U2VsZWN0aW9uKHRydWUpOwotCi0gICAgc2V0Q29udHJvbChiYXNlKTsKLSAgfQotCi0gIC8vIGFjdGlvbnMgb24gZmluaXNoCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1VSTCgpCi0gIHsKLSAgICByZXR1cm4gcmFkaW9CdXR0b24yLmdldFNlbGVjdGlvbigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1hTRE5ld0ZpbGVQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1hTRE5ld0ZpbGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYzFlMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9YU0ROZXdGaWxlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzOwotIAotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgWFNETmV3RmlsZVBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlCi17Ci0gIHB1YmxpYyBYU0ROZXdGaWxlUGFnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIAotICB7Ci0gICAgc3VwZXIoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0NSRUFURVhTRCIpLCBzZWxlY3Rpb24pOwotICAgIHNldFRpdGxlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9ORVdfWE1MX1NDSEVNQV9USVRMRSIpKTsKLSAgICBzZXREZXNjcmlwdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQ1JFQVRFX0FfTkVXX1hNTF9TQ0hFTUFfREVTQyIpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLSAgICAvLyBpbmhlcml0IGRlZmF1bHQgY29udGFpbmVyIGFuZCBuYW1lIHNwZWNpZmljYXRpb24gd2lkZ2V0cwotICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQotICAgIHRoaXMuc2V0RmlsZU5hbWUoY29tcHV0ZURlZmF1bHRGaWxlTmFtZSgpKTsKLQotICAgIHNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKQotICB7Ci0gICAgUGF0aCBuZXdOYW1lID0gbmV3IFBhdGgoZ2V0RmlsZU5hbWUoKSk7Ci0gICAgU3RyaW5nIGZ1bGxGaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0gICAgU3RyaW5nIGV4dGVuc2lvbiA9IG5ld05hbWUuZ2V0RmlsZUV4dGVuc2lvbigpOwotICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCB8fCAhZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoInhzZCIpKSAKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX1hTRCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgZm9yIGZpbGUgc2hvdWxkIGJlIGNhc2UgaW5zZW5zaXRpdmUKLSAgICBTdHJpbmcgc2FtZU5hbWUgPSBleGlzdHNGaWxlQW55Q2FzZShmdWxsRmlsZU5hbWUpOwotICAgIGlmIChzYW1lTmFtZSAhPSBudWxsKSAKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX0VSUk9SX0ZJTEVfQUxSRUFEWV9FWElTVFMiLCBzYW1lTmFtZSkpOyAvLyROT04tTkxTLTEkCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlUGFnZSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBkZWZhdWx0TmFtZSA9ICJOZXdYTUxTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgZGVmYXVsdEZpbGVFeHRlbnNpb24gPSAiLnhzZCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMgPSB7ICIqLnhzZCJ9OyAvLyROT04tTkxTLTEkCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlRGVmYXVsdEZpbGVOYW1lKCkKLSAgewotICAgIGludCBjb3VudCA9IDA7Ci0gICAgU3RyaW5nIGZpbGVOYW1lID0gZGVmYXVsdE5hbWUgKyBkZWZhdWx0RmlsZUV4dGVuc2lvbjsKLSAgICBJUGF0aCBjb250YWluZXJGdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0gICAgaWYgKGNvbnRhaW5lckZ1bGxQYXRoICE9IG51bGwpCi0gICAgewotICAgICAgd2hpbGUgKHRydWUpCi0gICAgICB7Ci0gICAgICAgIElQYXRoIHBhdGggPSBjb250YWluZXJGdWxsUGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotICAgICAgICBpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5leGlzdHMocGF0aCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgIGZpbGVOYW1lID0gZGVmYXVsdE5hbWUgKyBjb3VudCArIGRlZmF1bHRGaWxlRXh0ZW5zaW9uOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmaWxlTmFtZTsKLSAgfQotCi0gIC8vIHJldHVybnMgdHJ1ZSBpZiBmaWxlIG9mIHNwZWNpZmllZCBuYW1lIGV4aXN0cyBpbiBhbnkgY2FzZSBmb3Igc2VsZWN0ZWQgY29udGFpbmVyCi0gIHByb3RlY3RlZCBTdHJpbmcgZXhpc3RzRmlsZUFueUNhc2UoU3RyaW5nIGZpbGVOYW1lKQotICB7Ci0gICAgaWYgKCAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSAhPSBudWxsKSAmJiAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5pc0VtcHR5KCkgPT0gZmFsc2UpCi0gICAgICAgICYmIChmaWxlTmFtZS5jb21wYXJlVG8oIiIpICE9IDApKQotICAgIHsKLSAgICAgIC8vbG9vayB0aHJvdWdoIGFsbCByZXNvdXJjZXMgYXQgdGhlIHNwZWNpZmllZCBjb250YWluZXIgLSBjb21wYXJlIGluIHVwcGVyIGNhc2UKLSAgICAgIElSZXNvdXJjZSBwYXJlbnQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSk7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLSAgICAgIHsKLSAgICAgICAgSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcGFyZW50OwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIElSZXNvdXJjZVtdIG1lbWJlcnMgPSBjb250YWluZXIubWVtYmVycygpOwotICAgICAgICAgIFN0cmluZyBlbnRlcmVkRmlsZVVwcGVyID0gZmlsZU5hbWUudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bWVtYmVycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VVcHBlck5hbWUgPSBtZW1iZXJzW2ldLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgaWYgKHJlc291cmNlVXBwZXJOYW1lLmVxdWFscyhlbnRlcmVkRmlsZVVwcGVyKSkKLSAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyc1tpXS5nZXROYW1lKCk7ICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjMWJlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1hTRFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuU2VsZWN0U2luZ2xlRmlsZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5WaWV3VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFBhcnNlcjsKLQotCi0vKioKLSAqIEV4dGVuZCB0aGUgYmFzZSB3aXphcmQgdG8gc2VsZWN0IGEgZmlsZSBmcm9tIHRoZSBwcm9qZWN0IG9yIG91dHNpZGUgdGhlIHdvcmtiZW5jaAotICogYW5kIGFkZCBlcnJvciBoYW5kbGluZwotICovCi1wdWJsaWMgY2xhc3MgWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkCi17Ci0gIGJvb2xlYW4gaXNJbmNsdWRlOwotICBYU0RTY2hlbWEgbWFpblNjaGVtYTsKLSAgWFNEU2NoZW1hIGV4dGVybmFsU2NoZW1hOwotCi0gIFhTRExvY2F0aW9uQ2hvaWNlUGFnZSBjaG9pY2VQYWdlOwotICBYU0RTZWxlY3RTaW5nbGVGaWxlUGFnZSBmaWxlUGFnZTsKLSAgWFNEVVJMUGFnZSB1cmxQYWdlOwotCi0gIElGaWxlIHJlc3VsdEZpbGU7Ci0gIFN0cmluZyByZXN1bHRVUkw7Ci0gIFN0cmluZyBuYW1lc3BhY2UgPSAiIjsKLQotICBwdWJsaWMgWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQoWFNEU2NoZW1hIG1haW5TY2hlbWEsIGJvb2xlYW4gaXNJbmNsdWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3ZXJGaWx0ZXIgZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZXRXaW5kb3dUaXRsZSh0aXRsZSk7Ci0gICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL05ld1hTRC5wbmciKSk7Ci0KLSAgICBzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQotICAgIC8vIENob2ljZSBQYWdlCi0gICAgY2hvaWNlUGFnZSA9IG5ldyBYU0RMb2NhdGlvbkNob2ljZVBhZ2UoKTsKLQotICAgIC8vIFNlbGVjdCBGaWxlIFBhZ2UKLSAgICBmaWxlUGFnZSA9IG5ldyBYU0RTZWxlY3RTaW5nbGVGaWxlUGFnZShQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCAgc2VsZWN0aW9uLCB0cnVlKTsKLSAgICBmaWxlUGFnZS5zZXRUaXRsZSh0aXRsZSk7Ci0gICAgZmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oZGVzYyk7Ci0gICAgZmlsZVBhZ2UuYWRkRmlsdGVyKGZpbHRlcik7Ci0KLSAgICAvLyBVUkwgUGFnZQotICAgIHVybFBhZ2UgPSBuZXcgWFNEVVJMUGFnZSgpOwotICAgIHVybFBhZ2Uuc2V0VGl0bGUodGl0bGUpOwotICAgIHVybFBhZ2Uuc2V0RGVzY3JpcHRpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0ZJTEVESUFMT0dfU0VMRUNUX1hNTF9VUkwiKSk7Ci0gICAgCi0gICAgdGhpcy5tYWluU2NoZW1hID0gbWFpblNjaGVtYTsKLSAgICB0aGlzLmlzSW5jbHVkZSA9IGlzSW5jbHVkZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKQotICB7IAotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkUGFnZXMoKQotICB7Ci0gICAgYWRkUGFnZShjaG9pY2VQYWdlKTsKLSAgICBhZGRQYWdlKGZpbGVQYWdlKTsKLSAgICBhZGRQYWdlKHVybFBhZ2UpOwotICB9Ci0KLSAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIGN1cnJlbnRQYWdlKQotICB7Ci0gICAgV2l6YXJkUGFnZSBuZXh0UGFnZSA9IG51bGw7Ci0KLSAgICBpZiAoY3VycmVudFBhZ2UgPT0gY2hvaWNlUGFnZSkKLSAgICB7Ci0gICAgICBpZiAoY2hvaWNlUGFnZS5pc1VSTCgpKSAKLSAgICAgIHsKLSAgICAgICAgbmV4dFBhZ2UgPSB1cmxQYWdlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBuZXh0UGFnZSA9IGZpbGVQYWdlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmV4dFBhZ2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKQotICB7Ci0gICAgaWYgKCFjaG9pY2VQYWdlLmlzVVJMKCkpCi0gICAgewotICAgICAgcmV0dXJuIGZpbGVQYWdlLmlzUGFnZUNvbXBsZXRlKCk7IAotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKQotICB7IAotICAgIGlmIChjaG9pY2VQYWdlLmlzVVJMKCkpCi0gICAgewotICAgICAgdHJ5IAotICAgICAgewotICAgICAgICBnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIHVybFBhZ2UuZ2V0UnVubmFibGUoKSk7Ci0gICAgICAgIHJlc3VsdFVSTCA9IHVybFBhZ2UuZ2V0VVJMKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgCi0gICAgICByZXN1bHRGaWxlID0gZmlsZVBhZ2UuZ2V0RmlsZSgpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIE1PRiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBleHRlcm5hbCBmaWxlCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hIGdldEV4dGVybmFsU2NoZW1hKCkKLSAgewotICAgIHJldHVybiBleHRlcm5hbFNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyBJRmlsZSBnZXRSZXN1bHRGaWxlKCkKLSAgewotICAgIHJldHVybiByZXN1bHRGaWxlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRVUkwoKQotICB7Ci0gICAgcmV0dXJuIHJlc3VsdFVSTDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKQotICB7Ci0gIAlyZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIE1PRiBtb2RlbCBmb3IgdGhlIGltcG9ydGVkIGZpbGUKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZG9Mb2FkRXh0ZXJuYWxNb2RlbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyB4c2RNb2RlbEZpbGUsIFN0cmluZyB4c2RGaWxlTmFtZSkKLSAgeyAKLSAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLSAgICBTdHJpbmcgY3VycmVudE5hbWVTcGFjZSA9IG1haW5TY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICBtb25pdG9yLmJlZ2luVGFzaygiTG9hZGluZyBYTUwgU2NoZW1hIiwgMTAwKTsKLSAgICBtb25pdG9yLndvcmtlZCg1MCk7Ci0KLSAgICBYU0RQYXJzZXIgcGFyc2VyID0gbmV3IFhTRFBhcnNlcigpOwotICAgIHBhcnNlci5wYXJzZSh4c2RNb2RlbEZpbGUpOwotCi0gICAgZXh0ZXJuYWxTY2hlbWEgPSBwYXJzZXIuZ2V0U2NoZW1hKCk7Ci0gICAgaWYgKGV4dGVybmFsU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGV4dE5hbWVzcGFjZSA9IGV4dGVybmFsU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgbmFtZXNwYWNlID0gZXh0TmFtZXNwYWNlOwotICAgICAKLSAgICAgIGlmIChleHRlcm5hbFNjaGVtYS5nZXREaWFnbm9zdGljcygpICE9IG51bGwgJiYKLSAgICAgICAgICBleHRlcm5hbFNjaGVtYS5nZXREaWFnbm9zdGljcygpLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9JTkNPUlJFQ1RfWE1MX1NDSEVNQSIsIHhzZEZpbGVOYW1lKTsKLSAgICAgIH0gIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoaXNJbmNsdWRlKSAKLSAgICAgICAgeyAgCi0gICAgICAgICAgLy8gQ2hlY2sgdGhlIG5hbWVzcGFjZSB0byBtYWtlIHN1cmUgdGhleSBhcmUgdGhlIHNhbWUgYXMgY3VycmVudCBmaWxlCi0gICAgICAgICAgaWYgKGV4dE5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50TmFtZVNwYWNlICE9IG51bGwgJiYgIWV4dE5hbWVzcGFjZS5lcXVhbHMoY3VycmVudE5hbWVTcGFjZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9ESUZGRVJFTlRfTkFNRV9TUEFDRSIsIHhzZEZpbGVOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAKLSAgICAgICAgICAvLyBDaGVjayB0aGUgbmFtZXNwYWNlIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBmaWxlCi0gICAgICAgICAgaWYgKGV4dE5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50TmFtZVNwYWNlICE9IG51bGwgJiYgZXh0TmFtZXNwYWNlLmVxdWFscyhjdXJyZW50TmFtZVNwYWNlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX1VJX1NBTUVfTkFNRV9TUEFDRSIsIHhzZEZpbGVOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9JTkNPUlJFQ1RfWE1MX1NDSEVNQSIsIHhzZEZpbGVOYW1lKTsKLSAgICB9Ci0KLSAgICBtb25pdG9yLnN1YlRhc2soIkZpbmlzaCBMb2FkaW5nIik7Ci0gICAgbW9uaXRvci53b3JrZWQoODApOwotCi0gICAgcmV0dXJuIGVycm9yTWVzc2FnZTsKLSAgfQotCi0gCi0gIC8qKgotICAgKiBVUkwgcGFnZQotICAgKi8KLSAgY2xhc3MgWFNEVVJMUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UKLSAgeyAKLSAgICBUZXh0IHVybEZpZWxkOwotICAgIFN0cmluZyBzYXZlU3RyaW5nOwotCi0gICAgcHVibGljIFhTRFVSTFBhZ2UoKQotICAgIHsKLSAgICAgIHN1cGVyKCJVUkxQYWdlIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICAgIHsKLSAgICAgIENvbXBvc2l0ZSBjbGllbnQgPSBWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUocGFyZW50LDIpOwotICAgICAgVmlld1V0aWxpdHkuc2V0Q29tcG9zaXRlKGNsaWVudCk7Ci0KLSAgICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNsaWVudCwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1VSTCIpKTsKLSAgICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNsaWVudCwgIiIpOwotCi0gICAgICB1cmxGaWVsZCA9IFZpZXdVdGlsaXR5LmNyZWF0ZVRleHRGaWVsZChjbGllbnQsIDUwKTsKLSAgICAgIHNhdmVTdHJpbmcgPSAiaHR0cDovLyI7Ci0gICAgICB1cmxGaWVsZC5zZXRUZXh0KHNhdmVTdHJpbmcpOwotCi0gICAgICBzZXRDb250cm9sKGNsaWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRVUkwoKQotICAgIHsKLSAgICAgIHJldHVybiB1cmxGaWVsZC5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG9wZW5FeHRlcm5hbFNjaGVtYShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgewotICAgICAgU3RyaW5nIHRleHQgPSB1cmxGaWVsZC5nZXRUZXh0KCk7Ci0vLyAgICAgIGlmICh0ZXh0LmVxdWFscyhzYXZlU3RyaW5nKSkgCi0vLyAgICAgIHsKLS8vICAgICAgICByZXR1cm4gZmFsc2U7Ci0vLyAgICAgIH0KLS8vICAgICAgc2F2ZVN0cmluZyA9IHRleHQ7Ci0KLSAgICAgIGlmICh0ZXh0LmVxdWFscygiIikpCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfU1BFQ0lGWV9VUkwiKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCAhdGV4dC5zdGFydHNXaXRoKCJodHRwOi8vIikgKQotICAgICAgewotICAgICAgICBzZXRFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1VSTF9TVEFSVF9XSVRIIikpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBkb0xvYWRFeHRlcm5hbE1vZGVsKG1vbml0b3IsIHRleHQsIHRleHQpOwotICAgICAgaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7IAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgZ2V0UnVubmFibGUoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgICAKLSAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgIGlmIChtb25pdG9yID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvcj0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soIiIsIDYpOwotICAgICAgICAKLSAgICAgICAgICBib29sZWFuIG9rID0gb3BlbkV4dGVybmFsU2NoZW1hKG1vbml0b3IpOwotCi0gICAgICAgICAgaWYgKCFvaykgCi0gICAgICAgICAgeyAKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKG5ldyBqYXZhLmxhbmcuRXJyb3IoKSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNlbGVjdCBYTUwgU2NoZW1hIEZpbGUKLSAgICovCi0gIGNsYXNzIFhTRFNlbGVjdFNpbmdsZUZpbGVQYWdlIGV4dGVuZHMgU2VsZWN0U2luZ2xlRmlsZVBhZ2UKLSAgewotICAgIHB1YmxpYyBYU0RTZWxlY3RTaW5nbGVGaWxlUGFnZShJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIGlzRmlsZU1hbmRhdG9yeSkKLSAgICB7ICAgICAgICAgIAotICAgICAgc3VwZXIod29ya2JlbmNoLHNlbGVjdGlvbixpc0ZpbGVNYW5kYXRvcnkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBvcGVuRXh0ZXJuYWxTY2hlbWEoKQotICAgIHsKLSAgICAgIC8vIEdldCB0aGUgZnVsbHktcXVhbGlmaWVkIGZpbGUgbmFtZQotICAgICAgSUZpbGUgaUZpbGUgPSBnZXRGaWxlKCk7Ci0gICAgICBpZiAoaUZpbGUgPT0gbnVsbCkgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0gICAgICBTdHJpbmcgeHNkTW9kZWxGaWxlID0gaUZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpOwotICAgICAgU3RyaW5nIHhzZEZpbGVOYW1lID0gaUZpbGUuZ2V0TmFtZSgpOwotICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IGRvTG9hZEV4dGVybmFsTW9kZWwobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgeHNkTW9kZWxGaWxlLCB4c2RGaWxlTmFtZSk7Ci0KLSAgICAgIGlmIChlcnJvck1lc3NhZ2UgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkKLSAgICB7ICAKLSAgICAgIGlmIChjaG9pY2VQYWdlLmlzVVJMKCkpIAotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHN1cGVyLmlzUGFnZUNvbXBsZXRlKCkpIAotICAgICAgewotICAgICAgICByZXR1cm4gb3BlbkV4dGVybmFsU2NoZW1hKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc3VwZXIuaXNQYWdlQ29tcGxldGUoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvQWRkRmllbGRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvQWRkRmllbGRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQxMTI0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0FkZEZpZWxkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VGaWVsZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQmFzZUNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIEFkZEZpZWxkQWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkFjdGlvbgoteyAgIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJBZGRGaWVsZEFjdGlvbiI7ICAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgQWRkRmllbGRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldElkKElEKTsKLSAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0ZJRUxEKTsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgaWYgKGdldFNlbGVjdGVkT2JqZWN0cygpLnNpemUoKSA+IDApCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBnZXRTZWxlY3RlZE9iamVjdHMoKS5nZXQoMCk7Ci0gICAgICBJQ29tcGxleFR5cGUgdHlwZSA9IG51bGw7Ci0gICAgICAKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgSUNvbXBsZXhUeXBlKQotICAgICAgeyAgCi0gICAgICAgIHR5cGUgPSAoSUNvbXBsZXhUeXBlKW87IAotICAgICAgfQotICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIElGaWVsZCkKLSAgICAgIHsKLSAgICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClvOwotICAgICAgICB0eXBlID0gZmllbGQuZ2V0Q29udGFpbmVyVHlwZSgpOwotICAgICAgfQotICAgICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gdHlwZS5nZXRBZGROZXdGaWVsZENvbW1hbmQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCgoKEJhc2VDb21tYW5kKWNvbW1hbmQpLmdldEFkZGVkQ29tcG9uZW50KCkpOwotICAgICAgICAgIHNlbGVjdEFkZGVkQ29tcG9uZW50KGFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAvL1RPRE8gLi4uIHBvcCB1cCBhIGNvbW1hbmQgbm90IGltcGxlbWVudGVkIG1lc3NhZ2UKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBkb0VkaXQoT2JqZWN0IG9iaiwgSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIGlmIChvYmogaW5zdGFuY2VvZiBCYXNlRmllbGRFZGl0UGFydCkKLSAgICB7Ci0gICAgICBCYXNlRmllbGRFZGl0UGFydCBlZGl0UGFydCA9IChCYXNlRmllbGRFZGl0UGFydClvYmo7Ci0gICAgICBlZGl0UGFydC5kb0VkaXROYW1lKCEocGFydCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0Jhc2VEaXJlY3RFZGl0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0Jhc2VEaXJlY3RFZGl0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMTQxYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9CYXNlRGlyZWN0RWRpdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5EaXJlY3RFZGl0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5BYnN0cmFjdEVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEJhc2VEaXJlY3RFZGl0QWN0aW9uIGV4dGVuZHMgRGlyZWN0RWRpdEFjdGlvbiB7Ci0JcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcjsKLQkKLQkvKioKLQkgKiBTYW1lIGFzIHtAbGluayAjRGlyZWN0RWRpdEFjdGlvbihJV29ya2JlbmNoUGFydCl9LgotCSAqIEBwYXJhbSBlZGl0b3IgdGhlIGVkaXRvcgotCSAqLwotCXB1YmxpYyBCYXNlRGlyZWN0RWRpdEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJc3VwZXIoKElXb3JrYmVuY2hQYXJ0KWVkaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIERpcmVjdEVkaXRBY3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBwYXJ0LgotCSAqIEBwYXJhbSBwYXJ0IHRoZSB3b3JrYmVuY2ggcGFydAotCSAqLwotCXB1YmxpYyBCYXNlRGlyZWN0RWRpdEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCXN1cGVyKHBhcnQpOwotCX0KLQkKLQkgIC8qIChub24tSmF2YWRvYykKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuU2VsZWN0aW9uQWN0aW9uI2dldFNlbGVjdGlvbigpCi0JICAgKi8KLQkgIHByb3RlY3RlZCBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0JICB7Ci0JICAgIC8vIGFsd2F5cyBnZXQgc2VsZWN0aW9uIGZyb20gc2VsZWN0aW9uIHByb3ZpZGVyIGZpcnN0Ci0JCSAgaWYgKHByb3ZpZGVyIT1udWxsKSB7Ci0JCQkgIE9iamVjdCBzZWxlY3Rpb24gPSBwcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJCSAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQkgIE9iamVjdCBvYmplY3QgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpIHsKLQkJCQkJICAvLyBXZSBuZWVkIHRvIHJldHVybiBhbiBFZGl0UGFydCBhcyB0aGUgc2VsZWN0aW9uLgotCQkJCQkgIElFZGl0b3JQYXJ0IGVkaXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQkgIE9iamVjdCBncmFwaGljYWxWaWV3ZXIgPSBlZGl0b3IuZ2V0QWRhcHRlcihHcmFwaGljYWxWaWV3ZXIuY2xhc3MpOwotCQkJCQkgIGlmIChncmFwaGljYWxWaWV3ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdEVkaXRQYXJ0Vmlld2VyKSB7Ci0JCQkJCQkgIEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIgdmlld2VyID0gKEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIpIGdyYXBoaWNhbFZpZXdlcjsKLQkJCQkJCSAgRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpdmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQob2JqZWN0KTsKLQkJCQkJCSAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRQYXJ0KTsKLQkJCQkJICB9Ci0JCQkJICB9Ci0JCQkgIH0KLQkgICAgfQotCSAgICAKLQkgICAgcmV0dXJuIHN1cGVyLmdldFNlbGVjdGlvbigpOwotCSAgfQotCQotCSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpIHsKLQkJICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCSAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKSB7Ci0JCQkgIHJldHVybiAgISgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuaXNSZWFkT25seSgpOwotCQkgIH0KLQkJICAKLQkJICByZXR1cm4gdHJ1ZTsKLQkgIH0KLQkgIAotCSAgLyogKG5vbi1KYXZhZG9jKQotCSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5TZWxlY3Rpb25BY3Rpb24jc2V0U2VsZWN0aW9uUHJvdmlkZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIpCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblByb3ZpZGVyKElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcikKLQkgIHsKLQkgICAgc3VwZXIuc2V0U2VsZWN0aW9uUHJvdmlkZXIocHJvdmlkZXIpOwotCSAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7Ci0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0Jhc2VTZWxlY3Rpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvQmFzZVNlbGVjdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTJlYTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvQmFzZVNlbGVjdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuQWJzdHJhY3RFZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlU2VsZWN0aW9uQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJNRU5VX1NUQVJUX0lEID0gIlNVQk1FTlVfU1RBUlRfSUQ6ICI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCTUVOVV9FTkRfSUQgPSAiU1VCTUVOVV9FTkRfSUQ6ICI7IC8vJE5PTi1OTFMtMSQKLQotICBwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBkb0RpcmVjdEVkaXQgPSB0cnVlOwotICAKLSAgcHVibGljIEJhc2VTZWxlY3Rpb25BY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuU2VsZWN0aW9uQWN0aW9uI2dldFNlbGVjdGlvbigpCi0gICAqLwotICBwcm90ZWN0ZWQgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICB7Ci0gICAgLy8gYWx3YXlzIGdldCBzZWxlY3Rpb24gZnJvbSBzZWxlY3Rpb24gcHJvdmlkZXIgZmlyc3QKLSAgICBpZiAocHJvdmlkZXIhPW51bGwpCi0gICAgICByZXR1cm4gcHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgCi0gICAgcmV0dXJuIHN1cGVyLmdldFNlbGVjdGlvbigpOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5TZWxlY3Rpb25BY3Rpb24jc2V0U2VsZWN0aW9uUHJvdmlkZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Qcm92aWRlcihJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpCi0gIHsKLSAgICBzdXBlci5zZXRTZWxlY3Rpb25Qcm92aWRlcihwcm92aWRlcik7Ci0gICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uI2NhbGN1bGF0ZUVuYWJsZWQoKQotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpCi0gIHsKLSAgICBpZiAoZ2V0U2VsZWN0ZWRPYmplY3RzKCkuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGdldFNlbGVjdGVkT2JqZWN0cygpLmdldCgwKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgSUNvbXBsZXhUeXBlKQotICAgICAgewotICAgICAgICByZXR1cm4gISgoSUNvbXBsZXhUeXBlKW8pLmlzUmVhZE9ubHkoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJRmllbGQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAhKChJRmllbGQpbykuaXNSZWFkT25seSgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIElHcmFwaEVsZW1lbnQpCi0gICAgICB7Ci0gICAgCXJldHVybiAhKChJR3JhcGhFbGVtZW50KW8pLmlzUmVhZE9ubHkoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNlbGVjdEFkZGVkQ29tcG9uZW50KGZpbmFsIEFkYXB0ZXIgYWRhcHRlcikKLSAgewotICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGFkYXB0ZXIpKTsKLSAgICAgICAgICBpZiAoZG9EaXJlY3RFZGl0KQotICAgICAgICAgICAgYWN0aXZhdGVEaXJlY3RFZGl0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZURpcmVjdEVkaXQoKQotICB7Ci0gICAgaWYgKGdldFdvcmtiZW5jaFBhcnQoKSBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJRWRpdG9yUGFydCBvd25pbmdFZGl0b3IgPSAoSUVkaXRvclBhcnQpZ2V0V29ya2JlbmNoUGFydCgpOwotICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHBhcnQgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKTsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IG93bmluZ0VkaXRvci5nZXRBZGFwdGVyKEdyYXBoaWNhbFZpZXdlci5jbGFzcyk7Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBYnN0cmFjdEVkaXRQYXJ0Vmlld2VyKQotICAgICAgICB7Ci0gICAgICAgICAgQWJzdHJhY3RFZGl0UGFydFZpZXdlciB2aWV3ZXIgPSAoQWJzdHJhY3RFZGl0UGFydFZpZXdlcilvYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IG9iaiA9IHZpZXdlci5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLmdldCgwKTsKLSAgICAgICAgICBkb0VkaXQob2JqLCBwYXJ0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAKLSAgICAgIH0KLSAgICB9ICAgICAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZG9FZGl0KE9iamVjdCBvYmosIElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9DYXB0dXJlU2NyZWVuQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0NhcHR1cmVTY3JlZW5BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkMDQzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0NhcHR1cmVTY3JlZW5BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU1dUR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuTGF5ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5sYXlvdXRzLkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQ2FwdHVyZVNjcmVlbkFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBMQVNUX1NDUkVFTl9DQVBUVVJFX1BBVEggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBMQVNUX1NDUkVFTl9DQVBUVVJFX0ZJTEVfTkFNRSA9IE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fREVGQVVMVF9GSUxFX05BTUU7Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBMQVNUX1NDUkVFTl9DQVBUVVJFX0ZJTEVfRVhURU5TSU9OID0gIi5qcGciOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIENhcHR1cmVTY3JlZW5BY3Rpb24oKQotICB7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQ0FQVFVSRV9TQ1JFRU5fQUNUSU9OX1RFWFQpOwotICAgIHNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9DQVBUVVJFX1NDUkVFTl9BQ1RJT05fVE9PTFRJUFRFWFQpOwotICAgIHNldEltYWdlRGVzY3JpcHRvcihYU0RFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9ldG9vbDE2L2NhcHR1cmVzY3JlZW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZHRvb2wxNi9jYXB0dXJlc2NyZWVuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIHNldEFjY2VsZXJhdG9yKFNXVC5DVFJMIHwgU1dULlNISUZUIHwgJ1gnKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIEltYWdlRXhwb3J0ZXIgaW1hZ2VFeHBvcnRlciA9IG5ldyBJbWFnZUV4cG9ydGVyKCk7Ci0gICAgaW1hZ2VFeHBvcnRlci5zYXZlKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpLCAoR3JhcGhpY2FsVmlld2VyKSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRBZGFwdGVyKEdyYXBoaWNhbFZpZXdlci5jbGFzcykpOwotICB9Ci0KLSAgcHVibGljIGNsYXNzIEltYWdlRXhwb3J0ZXIKLSAgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0ZPUk1BVFMgPSAiKi5qcGVnOyouamZpZjsqLmpwZzsqLmpwZTsqLnBuZzsqLmJtcDsqLmljbyI7IC8vJE5PTi1OTFMtMSQKLSAgCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1NFUEFSQVRPUiA9ICJmaWxlLnNlcGFyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCSAgcHVibGljIGJvb2xlYW4gc2F2ZShJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBHcmFwaGljYWxWaWV3ZXIgdmlld2VyLCBTdHJpbmcgc2F2ZUZpbGVQYXRoLCBpbnQgZm9ybWF0KQotICAgIHsKLSAgICAgIEFzc2VydC5pc05vdE51bGwoZWRpdG9yUGFydCwgIm51bGwgZWRpdG9yUGFydCBwYXNzZWQgdG8gSW1hZ2VFeHBvcnRlci5zYXZlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIEFzc2VydC5pc05vdE51bGwodmlld2VyLCAibnVsbCB2aWV3ZXIgcGFzc2VkIHRvIEltYWdlRXhwb3J0ZXIuc2F2ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBBc3NlcnQuaXNOb3ROdWxsKHNhdmVGaWxlUGF0aCwgIm51bGwgc2F2ZUZpbGVQYXRoIHBhc3NlZCB0byBJbWFnZUV4cG9ydGVyLnNhdmUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICBpZiAoZm9ybWF0ICE9IFNXVC5JTUFHRV9CTVAgJiYgZm9ybWF0ICE9IFNXVC5JTUFHRV9KUEVHICYmIGZvcm1hdCAhPSBTV1QuSU1BR0VfSUNPICYmIGZvcm1hdCAhPSBTV1QuSU1BR0VfUE5HKQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fRk9STUFUX05PVF9TVVBQT1JURUQpOwotCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgc2F2ZUVkaXRvckNvbnRlbnRzQXNJbWFnZShlZGl0b3JQYXJ0LCB2aWV3ZXIsIHNhdmVGaWxlUGF0aCwgZm9ybWF0KTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCi0gICAgICB7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGVkaXRvclBhcnQuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fRVJST1JfVElUTEUsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fRVJST1JfREVTQ1JJUFRJT04pOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNhdmUoSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgR3JhcGhpY2FsVmlld2VyIHZpZXdlcikKLSAgICB7Ci0gICAgICBBc3NlcnQuaXNOb3ROdWxsKGVkaXRvclBhcnQsICJudWxsIGVkaXRvclBhcnQgcGFzc2VkIHRvIEltYWdlRXhwb3J0ZXIuc2F2ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBBc3NlcnQuaXNOb3ROdWxsKHZpZXdlciwgIm51bGwgdmlld2VyIHBhc3NlZCB0byBJbWFnZUV4cG9ydGVyLnNhdmUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICBTdHJpbmcgc2F2ZUZpbGVQYXRoID0gZ2V0U2F2ZUZpbGVQYXRoKGVkaXRvclBhcnQsIHZpZXdlcik7Ci0gICAgICBpZiAoc2F2ZUZpbGVQYXRoID09IG51bGwpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoc2F2ZUZpbGVQYXRoKTsKLSAgICAgIGlmIChmaWxlLmV4aXN0cygpICYmIGZpbGUuaXNGaWxlKCkpCi0gICAgICB7Ci0gICAgICAgIGlmICghTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBNZXNzYWdlcy5fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX09WRVJXUklURV9DT05GSVJNQVRJT05fUVVFU1RJT04sIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fT1ZFUldSSVRFX0NPTkZJUk1BVElPTi5yZXBsYWNlKCJ7MH0iLCBzYXZlRmlsZVBhdGgpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGludCBmb3JtYXQgPSAtMTsKLSAgICAgIFN0cmluZyBzYXZlRmlsZVBhdGhMb3dlckNhc2UgPSBzYXZlRmlsZVBhdGgudG9Mb3dlckNhc2UoKTsgCi0gICAgICBpZiAoc2F2ZUZpbGVQYXRoTG93ZXJDYXNlLmVuZHNXaXRoKCIuanBlZyIpIHx8IHNhdmVGaWxlUGF0aExvd2VyQ2FzZS5lbmRzV2l0aCgiLmpwZyIpIHx8IHNhdmVGaWxlUGF0aExvd2VyQ2FzZS5lbmRzV2l0aCgiLmpwZSIpIHx8IHNhdmVGaWxlUGF0aExvd2VyQ2FzZS5lbmRzV2l0aCgiLmpmaWYiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotICAgIAlmb3JtYXQgPSBTV1QuSU1BR0VfSlBFRzsKLSAgICAgIGVsc2UgaWYgKHNhdmVGaWxlUGF0aExvd2VyQ2FzZS5lbmRzV2l0aCgiLmJtcCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIGZvcm1hdCA9IFNXVC5JTUFHRV9CTVA7Ci0gICAgICBlbHNlIGlmIChzYXZlRmlsZVBhdGhMb3dlckNhc2UuZW5kc1dpdGgoIi5pY28iKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICBmb3JtYXQgPSBTV1QuSU1BR0VfSUNPOwotICAgICAgZWxzZSBpZiAoc2F2ZUZpbGVQYXRoTG93ZXJDYXNlLmVuZHNXaXRoKCIucG5nIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZm9ybWF0ID0gU1dULklNQUdFX1BORzsKLSAgICAgIGVsc2UgaWYgKHNhdmVGaWxlUGF0aExvd2VyQ2FzZS5lbmRzV2l0aCgiLmdpZiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIGZvcm1hdCA9IFNXVC5JTUFHRV9HSUY7Ci0KLSAgICAgIGlmKGZvcm1hdCAhPSAtMSkgewotICAgIAkgIHJldHVybiBzYXZlKGVkaXRvclBhcnQsIHZpZXdlciwgc2F2ZUZpbGVQYXRoLCBmb3JtYXQpOwotICAgICAgfSBlbHNlIHsKLSAgICAJICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTYXZlRmlsZVBhdGgoSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgR3JhcGhpY2FsVmlld2VyIHZpZXdlcikKLSAgICB7Ci0gICAgICBTdHJpbmcgZmlsZVBhdGg7Ci0KLSAgICAgIEZpbGVEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGVkaXRvclBhcnQuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIFNXVC5TQVZFKTsKLQotICAgICAgU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucyA9IG5ldyBTdHJpbmdbXSB7RklMRV9GT1JNQVRTfTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICBmaWxlRGlhbG9nLnNldEZpbGVOYW1lKG9idGFpbk5leHRGaWxlTmFtZSgpKTsKLSAgICAgIGZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLSAgICAgIGZpbGVEaWFsb2cuc2V0RmlsdGVyTmFtZXMobmV3IFN0cmluZ1tdIHtGSUxFX0ZPUk1BVFN9KTsKLSAgICAgIGZpbGVEaWFsb2cuc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0ZJTEVfU0FWRV9ESUFMT0dfVElUTEUpOwotICAgICAgCi0gICAgICBmaWxlUGF0aCA9IGZpbGVEaWFsb2cub3BlbigpOwotCi0gICAgICBpZiAoZmlsZVBhdGggIT0gbnVsbCkKLSAgICAgIHsKLQkgICAgICBMQVNUX1NDUkVFTl9DQVBUVVJFX1BBVEggPSBmaWxlRGlhbG9nLmdldEZpbHRlclBhdGgoKTsKLQkgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlRGlhbG9nLmdldEZpbGVOYW1lKCk7Ci0JICAgICAgaWYgKGZpbGVOYW1lLmluZGV4T2YoJy4nKSA+IDApIHsKLQkJICAgICAgTEFTVF9TQ1JFRU5fQ0FQVFVSRV9GSUxFX05BTUUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUuaW5kZXhPZignLicpKTsKLQkJICAgICAgTEFTVF9TQ1JFRU5fQ0FQVFVSRV9GSUxFX0VYVEVOU0lPTiA9IGZpbGVOYW1lLnN1YnN0cmluZyhmaWxlTmFtZS5pbmRleE9mKCcuJykpOwotCSAgICAgIH0KLQkgICAgICBlbHNlCi0JICAgICAgewotCQkgICAgICBMQVNUX1NDUkVFTl9DQVBUVVJFX0ZJTEVfTkFNRSA9IGZpbGVOYW1lOwotCQkgICAgICBMQVNUX1NDUkVFTl9DQVBUVVJFX0ZJTEVfRVhURU5TSU9OID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmlsZVBhdGg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNhdmVFZGl0b3JDb250ZW50c0FzSW1hZ2UoSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgR3JhcGhpY2FsVmlld2VyIHZpZXdlciwgU3RyaW5nIHNhdmVGaWxlUGF0aCwgaW50IGZvcm1hdCkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogMS4gRmlyc3QgZ2V0IHRoZSBmaWd1cmUgd2hvc2UgdmlzdWFscyB3ZSB3YW50IHRvIHNhdmUgYXMgaW1hZ2UuIFNvIHdlCi0gICAgICAgKiB3b3VsZCBsaWtlIHRvIHNhdmUgdGhlIHJvb3RlZGl0cGFydCB3aGljaCBhY3R1YWxseSBob3N0cyBhbGwgdGhlCi0gICAgICAgKiBwcmludGFibGUgbGF5ZXJzLgotICAgICAgICogCi0gICAgICAgKiBOT1RFOiBTY2FsYWJsZVJvb3RFZGl0UGFydCBtYW5hZ2VzIGxheWVycyBhbmQgaXMgcmVnaXN0ZXJlZAotICAgICAgICogZ3JhcGhpY2Fsdmlld2VyJ3MgZWRpdHBhcnRyZWdpc3RyeSB3aXRoIHRoZSBrZXkgTGF5ZXJNYW5hZ2VyLklEIC4uLgotICAgICAgICogd2VsbCB0aGF0IGlzIGJlY2F1c2UgU2NhbGFibGVSb290RWRpdFBhcnQgbWFuYWdlcyBhbGwgbGF5ZXJzIHRoYXQgYXJlCi0gICAgICAgKiBob3N0ZWQgb24gYSBGaWd1cmVDYW52YXMuIE1hbnkgbGF5ZXJzIGV4aXN0IGZvciBkb2luZyBkaWZmZXJlbnQgdGhpbmdzCi0gICAgICAgKi8KLSAgICAgIFNjYWxhYmxlUm9vdEVkaXRQYXJ0IHJvb3RFZGl0UGFydCA9IChTY2FsYWJsZVJvb3RFZGl0UGFydCkgdmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQoTGF5ZXJNYW5hZ2VyLklEKTsKLSAgICAgIElGaWd1cmUgcm9vdEZpZ3VyZSA9ICgoTGF5ZXJNYW5hZ2VyKSByb290RWRpdFBhcnQpLmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU5UQUJMRV9MQVlFUlMpOy8vIHJvb3RFZGl0UGFydC5nZXRGaWd1cmUoKTsKLSAgICAKLSAgICAgIFJlY3RhbmdsZSByb290RmlndXJlQm91bmRzID0gbmV3IFJlY3RhbmdsZShuZXcgUG9pbnQoMCwwKSxyb290RmlndXJlLmdldFByZWZlcnJlZFNpemUoKSk7Ci0gICAgICBMaXN0IHJvb3RFZGl0UGFydENoaWxkcmVuID0gcm9vdEVkaXRQYXJ0LmdldENoaWxkcmVuKCk7Ci0gICAgICBJdGVyYXRvciByb290RWRpdFBhcnRDaGlsZHJlbkl0ZXJhdG9yID0gcm9vdEVkaXRQYXJ0Q2hpbGRyZW4uaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlKHJvb3RFZGl0UGFydENoaWxkcmVuSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgCSAgT2JqZWN0IG9iamVjdCA9IHJvb3RFZGl0UGFydENoaWxkcmVuSXRlcmF0b3IubmV4dCgpOwotICAgIAkgIGlmKG9iamVjdCBpbnN0YW5jZW9mIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHsKLSAgICAJCSAgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBjaGlsZEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClvYmplY3Q7Ci0gICAgCQkgIExpc3QgZ3JhbmRDaGlsZHJlbiA9IGNoaWxkQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydC5nZXRDaGlsZHJlbigpOwotICAgIAkJICBJdGVyYXRvciBncmFuZENoaWxkcmVuSXRlcmF0b3IgPSBncmFuZENoaWxkcmVuLml0ZXJhdG9yKCk7Ci0gICAgCQkgIHdoaWxlKGdyYW5kQ2hpbGRyZW5JdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAJCQkgIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZ3JhbmRDaGlsZEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClncmFuZENoaWxkcmVuSXRlcmF0b3IubmV4dCgpOwotICAgIAkJCSAgSUZpZ3VyZSBmaWd1cmUgPSBncmFuZENoaWxkQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydC5nZXRGaWd1cmUoKTsKLSAgICAJCQkgIExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciA9IGZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCk7Ci0gICAgCQkJICBpZihsYXlvdXRNYW5hZ2VyIGluc3RhbmNlb2YgRmlsbExheW91dCkgewotICAgIAkJCQkgIHJvb3RGaWd1cmVCb3VuZHMgPSByb290RmlndXJlLmdldEJvdW5kcygpOwotICAgIAkJCSAgfQotICAgIAkJICB9Ci0gICAgCSAgfQotICAgICAgfQotCi0gICAgICAvKgotICAgICAgICogMi4gTm93IHdlIHdhbnQgdG8gZ2V0IHRoZSBHQyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRyb2wgb24gd2hpY2ggYWxsCi0gICAgICAgKiBmaWd1cmVzIGFyZSBwYWludGVkIGJ5IFNXVEdyYXBoaWNzLiBGb3IgdGhhdCBmaXJzdCBnZXQgdGhlIFNXVCBDb250cm9sCi0gICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHZpZXdlciBvbiB3aGljaCB0aGUgcm9vdGVkaXRwYXJ0IGlzIHNldCBhcyBjb250ZW50cwotICAgICAgICovCi0gICAgICBDb250cm9sIGZpZ3VyZUNhbnZhcyA9IHZpZXdlci5nZXRDb250cm9sKCk7Ci0gICAgICBHQyBmaWd1cmVDYW52YXNHQyA9IG5ldyBHQyhmaWd1cmVDYW52YXMpOwotCi0gICAgICAvKgotICAgICAgICogMy4gQ3JlYXRlIGEgbmV3IEdyYXBoaWNzIGZvciBhbiBJbWFnZSBvbnRvIHdoaWNoIHdlIHdhbnQgdG8gcGFpbnQKLSAgICAgICAqIHJvb3RGaWd1cmUKLSAgICAgICAqLwotICAgICAgSW1hZ2UgaW1nID0gbmV3IEltYWdlKG51bGwsIHJvb3RGaWd1cmVCb3VuZHMud2lkdGgsIHJvb3RGaWd1cmVCb3VuZHMuaGVpZ2h0KTsKLSAgICAgIEdDIGltYWdlR0MgPSBuZXcgR0MoaW1nKTsKLSAgICAgIGltYWdlR0Muc2V0QmFja2dyb3VuZChmaWd1cmVDYW52YXNHQy5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgaW1hZ2VHQy5zZXRGb3JlZ3JvdW5kKGZpZ3VyZUNhbnZhc0dDLmdldEZvcmVncm91bmQoKSk7Ci0gICAgICBpbWFnZUdDLnNldEZvbnQoZmlndXJlQ2FudmFzR0MuZ2V0Rm9udCgpKTsKLSAgICAgIGltYWdlR0Muc2V0TGluZVN0eWxlKGZpZ3VyZUNhbnZhc0dDLmdldExpbmVTdHlsZSgpKTsKLSAgICAgIGltYWdlR0Muc2V0TGluZVdpZHRoKGZpZ3VyZUNhbnZhc0dDLmdldExpbmVXaWR0aCgpKTsKLSAgICAgIGltYWdlR0Muc2V0WE9STW9kZShmaWd1cmVDYW52YXNHQy5nZXRYT1JNb2RlKCkpOwotICAgICAgR3JhcGhpY3MgaW1nR3JhcGhpY3MgPSBuZXcgU1dUR3JhcGhpY3MoaW1hZ2VHQyk7Ci0KLSAgICAgIC8qIDQuIERyYXcgcm9vdEZpZ3VyZSBvbnRvIGltYWdlLiBBZnRlciB0aGF0IGltYWdlIHdpbGwgYmUgcmVhZHkgZm9yIHNhdmUgKi8KLSAgICAgIHJvb3RGaWd1cmUucGFpbnQoaW1nR3JhcGhpY3MpOwotCi0gICAgICAvKiA1LiBTYXZlIGltYWdlICovCi0gICAgICBJbWFnZURhdGFbXSBpbWdEYXRhID0gbmV3IEltYWdlRGF0YVsxXTsKLSAgICAgIGltZ0RhdGFbMF0gPSBpbWcuZ2V0SW1hZ2VEYXRhKCk7Ci0KLSAgICAgIEltYWdlTG9hZGVyIGltZ0xvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotICAgICAgaW1nTG9hZGVyLmRhdGEgPSBpbWdEYXRhOwotICAgICAgaW1nTG9hZGVyLnNhdmUoc2F2ZUZpbGVQYXRoLCBmb3JtYXQpOwotCi0gICAgICAvKiByZWxlYXNlIE9TIHJlc291cmNlcyAqLwotICAgICAgZmlndXJlQ2FudmFzR0MuZGlzcG9zZSgpOwotICAgICAgaW1hZ2VHQy5kaXNwb3NlKCk7Ci0gICAgICBpbWcuZGlzcG9zZSgpOwotCi0gICAgfQotCi0gICAgU3RyaW5nIG9idGFpbk5leHRGaWxlTmFtZSgpCi0gICAgewotCi0gICAgICBpbnQgYXV4ID0gTEFTVF9TQ1JFRU5fQ0FQVFVSRV9GSUxFX05BTUUubGVuZ3RoKCkgLSAxOwotICAgICAgd2hpbGUgKENoYXJhY3Rlci5pc0RpZ2l0KExBU1RfU0NSRUVOX0NBUFRVUkVfRklMRV9OQU1FLmNoYXJBdChhdXgpKSkKLSAgICAgIHsKLSAgICAgICAgYXV4LS07Ci0gICAgICB9Ci0KLSAgICAgIFN0cmluZyBub25OdW1lcmF0ZWRmaWxlTmFtZSA9IExBU1RfU0NSRUVOX0NBUFRVUkVfRklMRV9OQU1FLnN1YnN0cmluZygwLCBhdXggKyAxKTsKLSAgICAgIFN0cmluZyBmaWxlUGF0aCA9IExBU1RfU0NSRUVOX0NBUFRVUkVfUEFUSCArIFN5c3RlbS5nZXRQcm9wZXJ0eShGSUxFX1NFUEFSQVRPUikgKyBub25OdW1lcmF0ZWRmaWxlTmFtZSArIExBU1RfU0NSRUVOX0NBUFRVUkVfRklMRV9FWFRFTlNJT047IC8vJE5PTi1OTFMtMSQKLQotICAgICAgaW50IGNvdW50ZXIgPSAxOwotICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZVBhdGgpOwotICAgICAgd2hpbGUgKGZpbGUuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIGZpbGVQYXRoID0gTEFTVF9TQ1JFRU5fQ0FQVFVSRV9QQVRIICsgU3lzdGVtLmdldFByb3BlcnR5KEZJTEVfU0VQQVJBVE9SKSArIG5vbk51bWVyYXRlZGZpbGVOYW1lICsgY291bnRlcisrICsgTEFTVF9TQ1JFRU5fQ0FQVFVSRV9GSUxFX0VYVEVOU0lPTjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBmaWxlID0gbmV3IEZpbGUoZmlsZVBhdGgpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gZmlsZVBhdGg7Ci0gICAgfQotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvRGVsZXRlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTYzNGMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvRGVsZXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkRlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIERlbGV0ZUFjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25BY3Rpb24KLXsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuRGVsZXRlQWN0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIERlbGV0ZUFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0RFTEVURSk7Ci0gICAgc2V0SWQoSUQpOwotICAgIHNldEltYWdlRGVzY3JpcHRvcihYU0RFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9kZWxldGVfb2JqLmdpZiIpICk7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE9iamVjdCBzZWxlY3Rpb24gPSBpLm5leHQoKTsKLSAgICAgIENvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgICBib29sZWFuIGRvU2V0SW5wdXQgPSBmYWxzZTsKLSAgICAgIGJvb2xlYW4gZG9TZXRNb2RlbEFzSW5wdXQgPSBmYWxzZTsKLSAgICAgIElBRFRPYmplY3QgdG9wTGV2ZWxDb250YWluZXIgPSBudWxsOwotICAgICAgSU1vZGVsIG1vZGVsID0gbnVsbDsKLSAgICAgIAotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElHcmFwaEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIElHcmFwaEVsZW1lbnQgeHNkT2JqID0gKElHcmFwaEVsZW1lbnQpc2VsZWN0aW9uOwotIAotICAgICAgICBpZiAoeHNkT2JqIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RCYXNlQWRhcHRlciBiYXNlQWRhcHRlciA9IChYU0RCYXNlQWRhcHRlcil4c2RPYmo7Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gRG8gbm90IGRlbGV0ZSBzZWxlY3RlZCBpdGVtIGlmIGl0IGlzIHJlYWQtb25seSwgb3IgaWYgdGhlIGl0ZW0gc2VsZWN0ZWQKLSAgICAgICAgICAvLyBpcyBudWxsIGFuZCB0aGUgcmVhZCBvbmx5IGNoZWNrIGNhbm5vdCBiZSBjb21wbGV0ZWQKLSAgICAgICAgICBpZiAoYmFzZUFkYXB0ZXIgPT0gbnVsbCB8fCBiYXNlQWRhcHRlci5pc1JlYWRPbmx5KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIHRvcExldmVsQ29udGFpbmVyID0geHNkT2JqLmdldFRvcENvbnRhaW5lcigpOwotICAgICAgICAgIGlmICh0b3BMZXZlbENvbnRhaW5lciA9PSBzZWxlY3Rpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgZG9TZXRJbnB1dCA9IHRydWU7Ci0gICAgICAgICAgICBkb1NldE1vZGVsQXNJbnB1dCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNvbW1hbmQgPSB4c2RPYmouZ2V0RGVsZXRlQ29tbWFuZCgpOwotICAgICAgICAgIG1vZGVsID0geHNkT2JqLmdldE1vZGVsKCk7ICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICBpZiAod29ya2JlbmNoICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgICBpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwgJiYgd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgICAgaWYgKGVkaXRvclBhcnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgT2JqZWN0IHZpZXdlciA9IGVkaXRvclBhcnQuZ2V0QWRhcHRlcihHcmFwaGljYWxWaWV3ZXIuY2xhc3MpOwotICAgICAgICAgICAgICBpZiAodmlld2VyIGluc3RhbmNlb2YgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcikKLSAgICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgICBPYmplY3QgaW5wdXQgPSAoKERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIpdmlld2VyKS5nZXRJbnB1dCgpOwotICAgICAgICAgICAgICAgIGlmIChpbnB1dCAhPSBzZWxlY3Rpb24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy8gQnVnIDg2MjE4IDogRG9uJ3Qgc3dpdGNoIHRvIHRvcCBsZXZlbCB2aWV3IGlmIHRoZSBvYmplY3Qgd2UncmUgZGVsZXRpbmcKLSAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdCB0aGUgaW5wdXQgdG8gdGhlIHZpZXdlcgotICAgICAgICAgICAgICAgICAgZG9TZXRJbnB1dCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgaWYgKGRvU2V0SW5wdXQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobW9kZWwgIT0gbnVsbCAmJiBkb1NldE1vZGVsQXNJbnB1dCkKLSAgICAgICAgICAgIHByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb2RlbCkpOyAgIAotICAgICAgICAgIGVsc2UgaWYgKHRvcExldmVsQ29udGFpbmVyICE9IG51bGwgJiYgIWRvU2V0TW9kZWxBc0lucHV0KQotICAgICAgICAgICAgcHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRvcExldmVsQ29udGFpbmVyKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gIAotICAgIH0KLSAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9EZXNpZ25TZWxlY3RBbGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvRGVzaWduU2VsZWN0QWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZGE2YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9EZXNpZ25TZWxlY3RBbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuQ29tbW9uTXVsdGlQYWdlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuQ2F0ZWdvcnlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuWFNEU2NoZW1hRWRpdFBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBEZXNpZ25TZWxlY3RBbGwgZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uCi17Ci0gIHByaXZhdGUgR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcjsKLSAgcHJpdmF0ZSBMaXN0IHNlbGVjdGVkOwotCi0gIHB1YmxpYyBEZXNpZ25TZWxlY3RBbGwoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldElkKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpKTsKLSAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fU0VMRUNUX0FMTCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgc3VwZXIucnVuKCk7Ci0KLSAgICBJV29ya2JlbmNoUGFydCBwYXJ0ID0gZ2V0V29ya2JlbmNoUGFydCgpOwotICAgIHNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgQ29tbW9uTXVsdGlQYWdlRWRpdG9yKQotICAgIHsKLSAgICAgIGdyYXBoaWNhbFZpZXdlciA9IChHcmFwaGljYWxWaWV3ZXIpICgoQ29tbW9uTXVsdGlQYWdlRWRpdG9yKSBwYXJ0KS5nZXRBZGFwdGVyKEdyYXBoaWNhbFZpZXdlci5jbGFzcyk7Ci0gICAgICBpZiAoZ3JhcGhpY2FsVmlld2VyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ3JhcGhpY2FsVmlld2VyLmdldENvbnRlbnRzKCk7Ci0gICAgICAgIGRvU2VsZWN0Q2hpbGRyZW4oZWRpdFBhcnQpOwotCi0gICAgICAgIGdyYXBoaWNhbFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWQpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZG9TZWxlY3RDaGlsZHJlbihFZGl0UGFydCBlZGl0UGFydCkKLSAgewotICAgIExpc3QgbGlzdCA9IGVkaXRQYXJ0LmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFFZGl0UGFydCkgJiYgIShvIGluc3RhbmNlb2YgQ2F0ZWdvcnlFZGl0UGFydCkpCi0gICAgICAgIHsKLSAgICAgICAgICBzZWxlY3RlZC5hZGQobyk7Ci0gICAgICAgIH0KLSAgICAgICAgZG9TZWxlY3RDaGlsZHJlbigoR3JhcGhpY2FsRWRpdFBhcnQpIG8pOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9TZXRJbnB1dFRvR3JhcGhWaWV3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL1NldElucHV0VG9HcmFwaFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmOTMwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL1NldElucHV0VG9HcmFwaFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlJvb3RDb250ZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgU2V0SW5wdXRUb0dyYXBoVmlldyBleHRlbmRzIEJhc2VTZWxlY3Rpb25BY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAiU2V0QXNGb2N1cyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0gIHByb3RlY3RlZCBPYmplY3QgaW5wdXQ7Ci0KLSAgcHVibGljIFNldElucHV0VG9HcmFwaFZpZXcoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHRoaXMocGFydCwgbnVsbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTZXRJbnB1dFRvR3JhcGhWaWV3KElXb3JrYmVuY2hQYXJ0IHBhcnQsIE9iamVjdCBpbnB1dCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgICBzZXRJZChJRCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9BU19GT0NVUyk7Ci0gICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkKLSAgICB7Ci0gICAgICBlZGl0b3JQYXJ0ID0gKElFZGl0b3JQYXJ0KXBhcnQ7Ci0gICAgfSAgICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVFbmFibGVkKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgeyAgICAKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gaW5wdXQ7ICAgCi0gICAgaWYgKHNlbGVjdGlvbiA9PSBudWxsKQotICAgIHsgIAotICAgICAgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotICAgIH0gIAotICAgIE9iamVjdCBhZGFwdGVyID0gZ2V0V29ya2JlbmNoUGFydCgpLmdldEFkYXB0ZXIoR3JhcGhpY2FsVmlld2VyLmNsYXNzKTsKLQotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgIHsKLSAgICAgIElBRFRPYmplY3Qgb2JqID0gKElBRFRPYmplY3QpIHNlbGVjdGlvbjsKLSAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcikKLSAgICAgIHsKLSAgICAgICAgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXIgPSAoRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcikgYWRhcHRlcjsgIAotICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdyYXBoaWNhbFZpZXdlci5nZXRJbnB1dEVkaXRQYXJ0KCk7Ci0gICAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFJvb3RDb250ZW50RWRpdFBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICBncmFwaGljYWxWaWV3ZXIuc2V0SW5wdXRBbmRNYXJrTG9jYXRpb24ob2JqKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9TaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZDIzMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9TaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLQotLyoqCi0gKiBTaG93IHRoZSBwcm9wZXJ0aWVzIHZpZXcgaW4gdGhlIGN1cnJlbnQgcGVyc3BlY3RpdmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19WSUVXX0lEID0gIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiOyAvLyROT04tTkxTLTEkCi0JCi0gIHByb3RlY3RlZCBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGVuYWJsZWRJbWFnZSwgZGlzYWJsZWRJbWFnZTsKLQotCXB1YmxpYyBTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotCQlzdXBlcihwYXJ0KTsKLQkJc2V0SWQoSUQpOwotCQlzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fU0hPV19QUk9QRVJUSUVTKTsKLQkJc2V0VG9vbFRpcFRleHQoZ2V0VGV4dCgpKTsKLSAgICBzZXRJbWFnZURlc2NyaXB0b3IoWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZWxjbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYiKSApOyAvLyROT04tTkxTLTEkCi0JICBzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihYU0RFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9kbGNsMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZiIpICk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVFbmFibGVkKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZ2V0V29ya2JlbmNoUGFydCgpLmdldFNpdGUoKS5nZXRQYWdlKCkuc2hvd1ZpZXcoUFJPUEVSVElFU19WSUVXX0lEKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkKLSAgICB7Ci0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9BRFRGbG9hdGluZ1Rvb2xiYXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9BRFRGbG9hdGluZ1Rvb2xiYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyN2NhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vQURURmxvYXRpbmdUb29sYmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuR3JhcGhpY2FsVmlld2VySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkFEVEZsb2F0aW5nVG9vbGJhckVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBBRFRGbG9hdGluZ1Rvb2xiYXIgZXh0ZW5kcyBHcmFwaGljYWxWaWV3ZXJJbXBsCi17Ci0gIHByb3RlY3RlZCBJTW9kZWwgbW9kZWw7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzRHJpbGxlZERvd247Ci0gIHByb3RlY3RlZCBBRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydCBlZGl0UGFydDsKLQotICBwdWJsaWMgQURURmxvYXRpbmdUb29sYmFyKElNb2RlbCBtb2RlbCkKLSAgewotICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKElNb2RlbCBtb2RlbCkKLSAgewotICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICBlZGl0UGFydCA9IChBRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydClnZXRFZGl0UGFydEZhY3RvcnkoKS5jcmVhdGVFZGl0UGFydChudWxsLCBuZXcgQURURmxvYXRpbmdUb29sYmFyTW9kZWwobW9kZWwpKTsKLSAgICBpZiAoZWRpdFBhcnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlZGl0UGFydCA9IG5ldyBBRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydChtb2RlbCk7Ci0gICAgfQotICAgIGVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLSAgICBzZXRDb250ZW50cyhlZGl0UGFydCk7Ci0gIH0KLQotICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpCi0gIHsKLSAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBjYW52YXMuc2V0QmFja2dyb3VuZChDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0gICAgc2V0Q29udHJvbChjYW52YXMpOwotICAgIHJldHVybiBnZXRDb250cm9sKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKGJvb2xlYW4gaXNEcmlsbGVkRG93bikKLSAgewotICAgIHRoaXMuaXNEcmlsbGVkRG93biA9IGlzRHJpbGxlZERvd247Ci0gICAgaWYgKGVkaXRQYXJ0ICE9IG51bGwpIHsKLSAgICAJZWRpdFBhcnQuc2V0SXNEcmlsbGVkRG93bihpc0RyaWxsZWREb3duKTsKLSAgICB9Ci0gICAgRWRpdFBhcnQgY29udGVudHMgPSBnZXRDb250ZW50cygpOwotICAgIGlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0gICAgCWNvbnRlbnRzLnJlZnJlc2goKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBjbGFzcyBBRFRGbG9hdGluZ1Rvb2xiYXJNb2RlbAotICB7Ci0gICAgSU1vZGVsIG1vZGVsOwotICAgIHB1YmxpYyBBRFRGbG9hdGluZ1Rvb2xiYXJNb2RlbChJTW9kZWwgbW9kZWwpCi0gICAgewotICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vQmFzZUdyYXBoaWNhbFZpZXdlcktleUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9CYXNlR3JhcGhpY2FsVmlld2VyS2V5SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmM0ZTgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9CYXNlR3JhcGhpY2FsVmlld2VyS2V5SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkdyYXBoaWNhbFZpZXdlcktleUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLQotLyoqCi0gKiBUaGlzIGtleSBoYW5kbGVyIGlzIGRlc2lnbmVkIHRvIGJlIHJlLXVzZWQgYnkgYm90aCB0aGUgV1NETCBhbmQgWFNEIGVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgQmFzZUdyYXBoaWNhbFZpZXdlcktleUhhbmRsZXIgZXh0ZW5kcyBHcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyCi17Ci0gIHB1YmxpYyBCYXNlR3JhcGhpY2FsVmlld2VyS2V5SGFuZGxlcihHcmFwaGljYWxWaWV3ZXIgdmlld2VyKQotICB7Ci0gICAgc3VwZXIodmlld2VyKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGtleVByZXNzZWQoS2V5RXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpbnQgZGlyZWN0aW9uID0gLTE7Ci0gICAgYm9vbGVhbiBpc0FsdERvd24gPSAoZXZlbnQuc3RhdGVNYXNrICYgU1dULkFMVCkgIT0gMDsKLSAgICBib29sZWFuIGlzQ3RybERvd24gPSAoZXZlbnQuc3RhdGVNYXNrICYgU1dULkNUUkwpICE9IDA7Ci0gICAgc3dpdGNoIChldmVudC5rZXlDb2RlKQotICAgIHsKLSAgICAgIGNhc2UgU1dULkFSUk9XX0xFRlQgOiB7Ci0gICAgICAgIGRpcmVjdGlvbiA9IFBvc2l0aW9uQ29uc3RhbnRzLldFU1Q7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBTV1QuQVJST1dfUklHSFQgOiB7Ci0gICAgICAgIGRpcmVjdGlvbiA9IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1Q7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBTV1QuQVJST1dfVVAgOiB7Ci0gICAgICAgIGRpcmVjdGlvbiA9IGlzQWx0RG93biA/IEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuT1VUX1RPX1BBUkVOVCA6IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgU1dULkFSUk9XX0RPV04gOiB7Ci0gICAgCSBkaXJlY3Rpb24gPSBpc0FsdERvd24gPyBLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LklOX1RPX0ZJUlNUX0NISUxEIDogUG9zaXRpb25Db25zdGFudHMuU09VVEg7ICAgICAgIAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGRpcmVjdGlvbiAhPSAtMSkKLSAgICB7Ci0gICAgICBHcmFwaGljYWxFZGl0UGFydCBmb2N1c0VkaXRQYXJ0ID0gZ2V0Rm9jdXNFZGl0UGFydCgpOwotICAgICAgS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeSBwb2xpY3kgPSAoS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeSlmb2N1c0VkaXRQYXJ0LmdldEVkaXRQb2xpY3koS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeS5LRVkpOwotICAgICAgCi0gICAgICBpZiAocG9saWN5ICE9IG51bGwpICAgICAgICAgIAotICAgICAgewotICAgICAgICBFZGl0UGFydCB0YXJnZXQgPSBwb2xpY3kuZ2V0UmVsYXRpdmVFZGl0UGFydChmb2N1c0VkaXRQYXJ0LCBkaXJlY3Rpb24pOwotICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgCWlmKGlzQ3RybERvd24pIHsKLQotICAgICAgICAJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAJCQkgT2JqZWN0IGtleWJvYXJkRHJhZyA9IGVkaXRvci5nZXRBZGFwdGVyKElLZXlib2FyZERyYWcuY2xhc3MpOwotICAgICAgICAJCQkgaWYgKGtleWJvYXJkRHJhZyBpbnN0YW5jZW9mIElLZXlib2FyZERyYWcpIHsKLSAgICAgICAgCQkJCSAoKElLZXlib2FyZERyYWcpIGtleWJvYXJkRHJhZykucGVyZm9ybUtleWJvYXJkRHJhZyhmb2N1c0VkaXRQYXJ0LCBkaXJlY3Rpb24pOwotICAgICAgICAJCQkJIHJldHVybiB0cnVlOwotICAgICAgICAJCSB9Ci0gICAgICAgIAl9Ci0gICAgICAgIAllbHNlIHsKLSAgICAgICAgICAgICAgICBuYXZpZ2F0ZVRvKHRhcmdldCwgZXZlbnQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAJfQotICAgICAgICB9ICAgICAgICAgIAotICAgICAgfSAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpCi0gICAgewotICAgICAgY2FzZSBTV1QuUEFHRV9ET1dOIDoKLSAgICAgIHsgIAotICAgICAgICBpZiAoc2Nyb2xsUGFnZShldmVudCwgUG9zaXRpb25Db25zdGFudHMuU09VVEgpKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSAgCi0gICAgICBjYXNlIFNXVC5QQUdFX1VQIDoKLSAgICAgIHsgIAotICAgICAgICBpZiAoc2Nyb2xsUGFnZShldmVudCwgUG9zaXRpb25Db25zdGFudHMuTk9SVEgpKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgY2FzZSBTV1QuRjMgOgotICAgICAgY2FzZSBTV1QuQ1IgOgotICAgICAgewotICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSAoQWN0aW9uUmVnaXN0cnkpIGVkaXRvclBhcnQuZ2V0QWRhcHRlcihBY3Rpb25SZWdpc3RyeS5jbGFzcyk7Ci0gICAgICAgIGlmIChyZWdpc3RyeSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgSUFjdGlvbiBhY3Rpb24gPSByZWdpc3RyeS5nZXRBY3Rpb24oT3BlbkluTmV3RWRpdG9yLklEKTsKLSAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvKgotICAgICAgY2FzZSBTV1QuRjUgOgotICAgICAgewotICAgICAgICBJRWRpdG9yUGFydCBwYXJ0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIGlmIChwYXJ0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBFZGl0b3JNb2RlTWFuYWdlciBtYW5hZ2VyID0gKEVkaXRvck1vZGVNYW5hZ2VyKXBhcnQuZ2V0QWRhcHRlcihFZGl0b3JNb2RlTWFuYWdlci5jbGFzcyk7Ci0gICAgICAgICAgRWRpdG9yTW9kZVtdIG1vZGVzID0gbWFuYWdlci5nZXRNb2RlcygpOwotICAgICAgICAgIEVkaXRvck1vZGUgbW9kZSA9IG1hbmFnZXIuZ2V0Q3VycmVudE1vZGUoKTsKLSAgICAgICAgICBMaXN0IGxpc3QgPSBBcnJheXMuYXNMaXN0KG1vZGVzKTsKLSAgICAgICAgICBpbnQgaW5kZXggPSBsaXN0LmluZGV4T2YobW9kZSk7Ci0gICAgICAgICAgaW50IG5leHRJbmRleCA9IGluZGV4ICsgMTsKLSAgICAgICAgICBpZiAobmV4dEluZGV4IDwgbW9kZXMubGVuZ3RoKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1vZGUgPSAoRWRpdG9yTW9kZSlsaXN0LmdldChuZXh0SW5kZXgpOwotICAgICAgICAgIH0gIAotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtb2RlID0gKEVkaXRvck1vZGUpbGlzdC5nZXQoMCk7ICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICAgIGlmIChtb2RlICE9IG1hbmFnZXIuZ2V0Q3VycmVudE1vZGUoKSkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIG1hbmFnZXIuc2V0Q3VycmVudE1vZGUobW9kZSk7Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0gIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0qLyAgICAgIAotICAgIH0KLSAgICByZXR1cm4gc3VwZXIua2V5UHJlc3NlZChldmVudCk7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gc2Nyb2xsUGFnZShLZXlFdmVudCBldmVudCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIGlmICghKGdldFZpZXdlcigpLmdldENvbnRyb2woKSBpbnN0YW5jZW9mIEZpZ3VyZUNhbnZhcykpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgRmlndXJlQ2FudmFzIGZpZ0NhbnZhcyA9IChGaWd1cmVDYW52YXMpIGdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLSAgICBQb2ludCBsb2MgPSBmaWdDYW52YXMuZ2V0Vmlld3BvcnQoKS5nZXRWaWV3TG9jYXRpb24oKTsKLSAgICBSZWN0YW5nbGUgYXJlYSA9IGZpZ0NhbnZhcy5nZXRWaWV3cG9ydCgpLmdldENsaWVudEFyZWEoUmVjdGFuZ2xlLlNJTkdMRVRPTikuc2NhbGUoLjgpOwotICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpCi0gICAgewotICAgICAgZmlnQ2FudmFzLnNjcm9sbFRvWShsb2MueSAtIGFyZWEuaGVpZ2h0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZpZ0NhbnZhcy5zY3JvbGxUb1kobG9jLnkgKyBhcmVhLmhlaWdodCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0Rlc2lnblZpZXdDb250ZXh0TWVudVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRGVzaWduVmlld0NvbnRleHRNZW51UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzZTQ0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRGVzaWduVmlld0NvbnRleHRNZW51UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db250ZXh0TWVudVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5Db250ZXh0TWVudVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5FZGl0b3JNb2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5JWFNEUmVmYWN0b3JDb25zdGFudHM7Ci0KLQotcHVibGljIGNsYXNzIERlc2lnblZpZXdDb250ZXh0TWVudVByb3ZpZGVyIGV4dGVuZHMgQ29udGV4dE1lbnVQcm92aWRlcgotewotICBJRWRpdG9yUGFydCBlZGl0b3I7ICAKLSAgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgR3JhcGhDb250ZXh0TWVudVByb3ZpZGVyLgotICAgKiAKLSAgICogQHBhcmFtIHNlbGVjdGlvblByb3ZpZGVyCi0gICAqIEBwYXJhbSBlZGl0b3IKLSAgICovCi0gIHB1YmxpYyBEZXNpZ25WaWV3Q29udGV4dE1lbnVQcm92aWRlcihJRWRpdG9yUGFydCBlZGl0b3IsIEVkaXRQYXJ0Vmlld2VyIHZpZXdlciwgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyKQotICB7Ci0gICAgc3VwZXIodmlld2VyKTsKLSAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjsKLSAgICB0aGlzLnNlbGVjdGlvblByb3ZpZGVyID0gc2VsZWN0aW9uUHJvdmlkZXI7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuQ29udGV4dE1lbnVQcm92aWRlciNidWlsZENvbnRleHRNZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIsCi0gICAqICAgICAgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyKQotICAgKi8KLSAgcHVibGljIHZvaWQgYnVpbGRDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkKLSAgewotICAgIElNZW51TWFuYWdlciBjdXJyZW50TWVudSA9IG1lbnU7Ci0gICAgCi0gICAgRWRpdG9yTW9kZU1hbmFnZXIgbWFuYWdlciA9IChFZGl0b3JNb2RlTWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihFZGl0b3JNb2RlTWFuYWdlci5jbGFzcyk7Ci0gICAgQ29udGV4dE1lbnVQYXJ0aWNpcGFudCBjb250ZXh0TWVudVBhcnRpY2lwYW50ID0gbWFuYWdlciAhPSBudWxsID8gbWFuYWdlci5nZXRDdXJyZW50TW9kZSgpLmdldENvbnRleHRNZW51UGFydGljaXBhbnQoKSA6IG51bGw7Ci0gICAgCi0gICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotICAgIEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0RWRpdG9yQWN0aW9uUmVnaXN0cnkoKTsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotICAgIAotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAKLSAgICAgIC8vIENvbnZlcnQgZWRpdHBhcnRzIHRvIG1vZGVsIG9iamVjdHMgYXMgc2VsZWN0aW9ucyAKLSAgICAgIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBzZWxlY3RlZE9iamVjdCA9ICgoRWRpdFBhcnQpc2VsZWN0ZWRPYmplY3QpLmdldE1vZGVsKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElBY3Rpb25Qcm92aWRlcikKLSAgICAgIHsKLSAgICAgICAgSUFjdGlvblByb3ZpZGVyIGFjdGlvblByb3ZpZGVyID0gKElBY3Rpb25Qcm92aWRlcikgc2VsZWN0ZWRPYmplY3Q7Ci0KLSAgICAgICAgU3RyaW5nW10gYWN0aW9ucyA9IGFjdGlvblByb3ZpZGVyLmdldEFjdGlvbnMobnVsbCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBpZCA9IGFjdGlvbnNbaV07Ci0gICAgICAgICAgaWYgKGNvbnRleHRNZW51UGFydGljaXBhbnQgPT0gbnVsbCB8fCBjb250ZXh0TWVudVBhcnRpY2lwYW50LmlzQXBwbGljYWJsZShzZWxlY3RlZE9iamVjdCwgaWQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpZC5zdGFydHNXaXRoKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9TVEFSVF9JRCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gaWQuc3Vic3RyaW5nKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9TVEFSVF9JRC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgIElNZW51TWFuYWdlciBzdWJNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKHRleHQpOwotICAgICAgICAgICAgICBjdXJyZW50TWVudS5hZGQoc3ViTWVudSk7Ci0gICAgICAgICAgICAgIGN1cnJlbnRNZW51ID0gc3ViTWVudTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGlkLnN0YXJ0c1dpdGgoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX0VORF9JRCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGN1cnJlbnRNZW51ID0gZ2V0UGFyZW50TWVudShtZW51LCBjdXJyZW50TWVudSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChpZC5lcXVhbHMoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjdXJyZW50TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgSUFjdGlvbiBhY3Rpb24gPSByZWdpc3RyeS5nZXRBY3Rpb24oaWQpOwotICAgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgYWN0aW9uLmlzRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgIGN1cnJlbnRNZW51LmFkZChhY3Rpb24pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7ICAgICAgIAotICAgICAgICBJTWVudU1hbmFnZXIgc3ViTWVudSA9IG5ldyBNZW51TWFuYWdlcihNZXNzYWdlcy5fVUlfUkVGQUNUT1JfQ09OVEVYVF9NRU5VLCBJWFNEUmVmYWN0b3JDb25zdGFudHMuUkVGQUNUT1JfQ09OVEVYVF9NRU5VX0lEKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZW51LmFkZChzdWJNZW51KTsKLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsgICAgICAgCi0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoInNlYXJjaC1zbG90IikpOyAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCJlbmREZXNpZ25NZW51LXNsb3QiKSk7ICAvLyAkTk9OLU5MUy0xJAotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgfQotICAgIH0gICAgCi0gICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJTWVudU1hbmFnZXIgZ2V0UGFyZW50TWVudShJTWVudU1hbmFnZXIgcm9vdCwgSU1lbnVNYW5hZ2VyIGNoaWxkKSB7Ci0gICAgSU1lbnVNYW5hZ2VyIHBhcmVudCA9IG51bGw7Ci0gICAgCi0gICAgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBraWRzID0gcm9vdC5nZXRJdGVtcygpOwotICAgIGludCBpbmRleCA9IDA7Ci0gICAgd2hpbGUgKGluZGV4IDwga2lkcy5sZW5ndGggJiYgcGFyZW50ID09IG51bGwpIHsKLSAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSBraWRzW2luZGV4XTsKLSAgICAgIGlmIChpdGVtLmVxdWFscyhjaGlsZCkpIHsKLSAgICAgICAgcGFyZW50ID0gcm9vdDsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIElNZW51TWFuYWdlcikgewotICAgICAgICAgIHBhcmVudCA9IGdldFBhcmVudE1lbnUoKElNZW51TWFuYWdlcikgaXRlbSwgY2hpbGQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRleCsrOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0KLSAgcHJvdGVjdGVkIEFjdGlvblJlZ2lzdHJ5IGdldEVkaXRvckFjdGlvblJlZ2lzdHJ5KCkKLSAgewotICAgIHJldHVybiAoQWN0aW9uUmVnaXN0cnkpIGVkaXRvci5nZXRBZGFwdGVyKEFjdGlvblJlZ2lzdHJ5LmNsYXNzKTsKLSAgfQotICBwcm90ZWN0ZWQgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjazsKLQotICBwcm90ZWN0ZWQgQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpCi0gIHsKLSAgICBpZiAoY29tbWFuZFN0YWNrID09IG51bGwpCi0gICAgICBjb21tYW5kU3RhY2sgPSBnZXRWaWV3ZXIoKS5nZXRFZGl0RG9tYWluKCkuZ2V0Q29tbWFuZFN0YWNrKCk7Ci0gICAgcmV0dXJuIGNvbW1hbmRTdGFjazsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0Rlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9EZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MTQxNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0Rlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOYXZpZ2F0aW9uSGlzdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlJlZGVmaW5lQ2F0ZWdvcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEUmVkZWZpbmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuSUhvbGRlckVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuUm9vdENvbnRlbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlN0cnVjdHVyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklNb2RlbFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5Db21tb25TZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLkFEVENvbnRlbnRPdXRsaW5lUGFnZTsKLQotcHVibGljIGNsYXNzIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIgZXh0ZW5kcyBTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBBRFRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlciA9IG5ldyBBRFRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKTsKLSAgcHJvdGVjdGVkIElucHV0Q2hhbmdlTWFuYWdlciBpbnB1dENoYW5nZU1hbmFnZXIgPSBuZXcgSW5wdXRDaGFuZ2VNYW5hZ2VyKCk7Ci0gIHByaXZhdGUgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLQotICBwdWJsaWMgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcihJRWRpdG9yUGFydCBlZGl0b3IsIENvbW1vblNlbGVjdGlvbk1hbmFnZXIgbWFuYWdlcikKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yOwotICAgIHNldENvbnRleHRNZW51KG5ldyBEZXNpZ25WaWV3Q29udGV4dE1lbnVQcm92aWRlcihlZGl0b3IsIHRoaXMsIHRoaXMpKTsKLSAgICBlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoIm9yZy5lY2xpcHNlLndzdC54c2QudWkucG9wdXAuZ3JhcGgiLCBnZXRDb250ZXh0TWVudSgpLCBpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvLyBtYWtlIHRoZSBpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyIGxpc3RlbiB0byBncmFwaCB2aWV3IHNlbGVjdGlvbiBjaGFuZ2VzCi0gICAgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIpOyAgICAKLSAgICBpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihtYW5hZ2VyKTsKLSAgICBtYW5hZ2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsgIAotICAgIAotICAgIHNldEtleUhhbmRsZXIobmV3IEJhc2VHcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyKHRoaXMpKTsgICAgCi0gIH0KLSAgCi0gIAotICAvLyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBzb21ldGhpbmcgY2hhbmdlcyBpbiB0aGUgc2VsZWN0aW9uIG1hbmFnZXIKLSAgLy8gKGUuZy4gYSBzZWxlY3Rpb24gb2NjdXJlZCBmcm9tIGFub3RoZXIgdmlldykKLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBudWxsOwotICAgIElTZWxlY3Rpb24gZXZlbnRTZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoZXZlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAJc2VsZWN0ZWRPYmplY3QgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50U2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsgCi0gICAgfSAgICAKLSAgICAvLyBUT0RPIChjcykgSXQgc2VlbXMgbGlrZSB0aGVyZSdzIHdheSBtb3JlIHNlbGVjdGlvbiBnb2luZyBvbiB0aGFuIHRoZXJlCi0gICAgLy8gc2hvdWxkCi0gICAgLy8gYmUhISBUaGVyZSdzIGF0IGxlYXN0IDIgc2VsZWN0aW9ucyBnZXR0aW5nIGZpcmVkIHdoZW4gc29tZXRoaW5nIGlzCi0gICAgLy8gc2VsZWN0ZWQgaW4gdGhlCi0gICAgLy8gb3V0bGluZSB2aWV3LiBBcmUgd2UgbGlzdGVuaW5nIHRvIHRvbyBtYW55IHRoaW5ncz8KLSAgICAvLwotICAgIC8vIGlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFEVENvbnRlbnRPdXRsaW5lUGFnZSkKLSAgICBpZiAoc2VsZWN0ZWRPYmplY3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgaWYgKGV2ZW50LmdldFNvdXJjZSgpICE9IGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIpCi0gICAgewotICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSVN0cnVjdHVyZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElNb2RlbCkgJiYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQURUQ29udGVudE91dGxpbmVQYWdlKSkgfHwKLSAgICAgICAgICAgICghKGdldElucHV0KCkgaW5zdGFuY2VvZiBJTW9kZWwpKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICgoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJR3JhcGhFbGVtZW50KSAmJiAoKElHcmFwaEVsZW1lbnQpc2VsZWN0ZWRPYmplY3QpLmlzRm9jdXNBbGxvd2VkKCkpIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyKSkgICAgICAgICAgICAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2V0SW5wdXRBbmRNYXJrTG9jYXRpb24oKElTdHJ1Y3R1cmUpc2VsZWN0ZWRPYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJR3JhcGhFbGVtZW50KQotICAgICAgewotICAgICAgICBpZiAoKChJR3JhcGhFbGVtZW50KXNlbGVjdGVkT2JqZWN0KS5pc0ZvY3VzQWxsb3dlZCgpICYmICgoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBRFRDb250ZW50T3V0bGluZVBhZ2UpKSkKLSAgICAgICAgewotICAgICAgICAgIHNldElucHV0QW5kTWFya0xvY2F0aW9uKChJQURUT2JqZWN0KXNlbGVjdGVkT2JqZWN0KTsgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCEoKElHcmFwaEVsZW1lbnQpc2VsZWN0ZWRPYmplY3QpLmlzRm9jdXNBbGxvd2VkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBXZSBlbmNvdW50ZXJlZCBhbiBvYmplY3QgdGhhdCBpcyBub3QgYSB2YWxpZCBpbnB1dCB0byB0aGUgZ3JhcGggdmlld2VyCi0gICAgICAgICAgLy8gTm93IGZpbmQgdGhlIHRvcCBjb250YWluZXIgdGhhdCBjYW4gYmUgYSB2YWxpZCBpbnB1dAotICAgICAgICAgIElBRFRPYmplY3Qgb2JqID0gKChJR3JhcGhFbGVtZW50KXNlbGVjdGVkT2JqZWN0KS5nZXRUb3BDb250YWluZXIoKTsKLSAgICAgICAgICBpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBRFRDb250ZW50T3V0bGluZVBhZ2UpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBpZiB0aGUgc2VsZWN0aW9uIGlzIG9yaWdpbmF0ZWQgZnJvbSB0aGUgb3V0bGluZSwgd2Ugc2hvdWxkIAotICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBpbnB1dHMKLSAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCAmJiBnZXRJbnB1dCgpICE9IG9iaikgIC8vIERvbid0IGNoYW5nZSBpbnB1dHMgaWYgdGhlIG9iaiBpcyBhbHJlYWR5IHRoZSBpbnB1dAotICAgICAgICAgICAgICBzZXRJbnB1dEFuZE1hcmtMb2NhdGlvbihvYmopOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIENvbW1vblNlbGVjdGlvbk1hbmFnZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBpZiB0aGUgc2VsZWN0aW9uIGlzIG9yaWdpbmF0ZWQgZnJvbSBzb21lIGFjdGlvbiwgaWUuIGFkZGluZwotICAgICAgICAgICAgLy8gYSBuZXcgZWxlbWVudCwgd2Ugc2hvdWxkIGNoYW5nZSB0aGUgaW5wdXQgb25seSBpZiB0aGUgY3VycmVudCBpbnB1dCBpcyB0aGUgbW9kZWwKLSAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaW5wdXRzIHdpbGwgY2hhbmdlIHVuZXhwZWN0ZWRseSEhCi0gICAgICAgICAgICBpZiAoZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElNb2RlbCkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzZXRJbnB1dCAob2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklQb3N0U2VsZWN0aW9uUHJvdmlkZXIgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgaWYgdGhlIHNlbGVjdGlvbiBpcyBvcmlnaW5hdGVkIGZyb20gdGhlIHNvdXJjZSB2aWV3ZXIKLSAgICAgICAgICAgIC8vIHdlIHNob3VsZCBjaGFuZ2UgdGhlIGlucHV0IHJlZ2FyZGxlc3MuICBUZXN0IGlzIGZvciBtdWx0aXBsZSBsZXZlbHMKLSAgICAgICAgICAgIC8vIG9mIGFub255bW91cyB0eXBlcwotICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsKQotICAgICAgICAgICAgICBzZXRJbnB1dCAob2JqKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCAmJiBnZXRJbnB1dCgpIGluc3RhbmNlb2YgSU1vZGVsKQotICAgICAgICAgICAgICBzZXRJbnB1dEFuZE1hcmtMb2NhdGlvbihvYmopOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJRmllbGQpIAotICAgICAgICB7Ci0gICAgICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClzZWxlY3RlZE9iamVjdDsKLSAgICAgICAgICBpZiAoICghZmllbGQuaXNHbG9iYWwoKSAmJiBnZXRJbnB1dCgpIGluc3RhbmNlb2YgSU1vZGVsKSB8fAotICAgICAgICAgICAgICAgKCFmaWVsZC5pc0dsb2JhbCgpICYmICEoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBDb21tb25TZWxlY3Rpb25NYW5hZ2VyKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgSUFEVE9iamVjdCBvYmogPSAoKElHcmFwaEVsZW1lbnQpc2VsZWN0ZWRPYmplY3QpLmdldFRvcENvbnRhaW5lcigpOwotICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsKQotICAgICAgICAgICAgICBzZXRJbnB1dEFuZE1hcmtMb2NhdGlvbihvYmopOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChmaWVsZC5pc0dsb2JhbCgpICYmICEoZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElNb2RlbCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyICkKLSAgICAgICAgICAgICAgc2V0SW5wdXQoZmllbGQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBzZXRJbnB1dEFuZE1hcmtMb2NhdGlvbihmaWVsZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElGaWVsZCkKLSAgICAgIHsKLSAgICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClzZWxlY3RlZE9iamVjdDsKLSAgICAgICAgaWYgKCAoZmllbGQuaXNHbG9iYWwoKSAmJiAoZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElNb2RlbCkgJiYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQURUQ29udGVudE91dGxpbmVQYWdlKSkgfHwKLSAgICAgICAgICAgICggKGZpZWxkLmlzR2xvYmFsKCkgJiYgIShnZXRJbnB1dCgpIGluc3RhbmNlb2YgSU1vZGVsKSkpKQotICAgICAgICB7ICAKLSAgICAgICAgICBzZXRJbnB1dEFuZE1hcmtMb2NhdGlvbihmaWVsZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSU1vZGVsUHJveHkpCi0gICAgICB7Ci0gICAgICAgIElNb2RlbFByb3h5IGFkYXB0ZXIgPSAoSU1vZGVsUHJveHkpc2VsZWN0ZWRPYmplY3Q7ICAgICAgICAKLSAgICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgUmVkZWZpbmVDYXRlZ29yeUFkYXB0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgCVJlZGVmaW5lQ2F0ZWdvcnlBZGFwdGVyIHNlbGVjdGlvbkFkYXB0ZXIgPSAoUmVkZWZpbmVDYXRlZ29yeUFkYXB0ZXIpc2VsZWN0ZWRPYmplY3Q7Ci0gICAgICAgIAlYU0RSZWRlZmluZUFkYXB0ZXIgc2VsZWN0aW9uUGFyZW50QWRhcHRlciA9IHNlbGVjdGlvbkFkYXB0ZXIuZ2V0WHNkUmVkZWZpbmVBZGFwdGVyKCk7IAotICAgICAgICAJc2V0SW5wdXRBbmRNYXJrTG9jYXRpb24oc2VsZWN0aW9uUGFyZW50QWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZ2V0SW5wdXQoKSAhPSBhZGFwdGVyLmdldE1vZGVsKCkpCi0gICAgICAgICAgIHNldElucHV0KGFkYXB0ZXIuZ2V0TW9kZWwoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElNb2RlbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGdldElucHV0KCkgIT0gc2VsZWN0ZWRPYmplY3QpCi0gICAgICAgICAgc2V0SW5wdXQoKElNb2RlbClzZWxlY3RlZE9iamVjdCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnQoZ2V0Um9vdEVkaXRQYXJ0KCksIHNlbGVjdGVkT2JqZWN0KTsKLSAgICAgIGlmIChlZGl0UGFydCAhPSBudWxsKQotICAgICAgewotICAgICAgICBzZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdFBhcnQpKTsKLSAgICAgICAgc2V0Rm9jdXMoZWRpdFBhcnQpOwotICAgICAgfQotICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFdlIG5lZWQgdG8gY29udmVydCBmcm9tIGVkaXQgcGFydCBzZWxlY3Rpb25zIHRvIG1vZGVsIG9iamVjdCBzZWxlY3Rpb25zCi0gICAqLwotICBjbGFzcyBBRFRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLSAgewotICAgIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcm90ZWN0ZWQgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotCi0gICAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgICAgbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4gc2VsZWN0aW9uOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdGVuZXJMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBpLm5leHQoKTsKLSAgICAgICAgbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cnVjdHVyZWRTZWxlY3Rpb24gY29udmVydFNlbGVjdGlvbkZyb21FZGl0UGFydFRvTW9kZWwoSVNlbGVjdGlvbiBlZGl0UGFydFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBMaXN0IHNlbGVjdGVkTW9kZWxPYmplY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgaWYgKGVkaXRQYXJ0U2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGVkaXRQYXJ0U2VsZWN0aW9uKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICAgICAgT2JqZWN0IG1vZGVsID0gbnVsbDsKLSAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRWRpdFBhcnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIG9iajsKLSAgICAgICAgICAgIG1vZGVsID0gZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG1vZGVsICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VsZWN0ZWRNb2RlbE9iamVjdExpc3QuYWRkKG1vZGVsKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZE1vZGVsT2JqZWN0TGlzdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICAgIHsKLSAgICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIElTZWxlY3Rpb24gbmV3U2VsZWN0aW9uID0gY29udmVydFNlbGVjdGlvbkZyb21FZGl0UGFydFRvTW9kZWwoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgdGhpcy5zZWxlY3Rpb24gPSBuZXdTZWxlY3Rpb247Ci0gICAgICBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgbmV3RXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIG5ld1NlbGVjdGlvbik7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMobmV3RXZlbnQpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGdldEVkaXRQYXJ0KEVkaXRQYXJ0IHBhcmVudCwgT2JqZWN0IG9iamVjdCkKLSAgewotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcGFyZW50LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydClpLm5leHQoKTsKLSAgICAgIGlmIChlZGl0UGFydC5nZXRNb2RlbCgpID09IG9iamVjdCAmJiAhKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUhvbGRlckVkaXRQYXJ0KSAmJiAhKGVkaXRQYXJ0IGluc3RhbmNlb2YgUm9vdENvbnRlbnRFZGl0UGFydCkpCi0gICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gZWRpdFBhcnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gICAgICAgICAgICAgCi0gIAotICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICB7IAotICAgICAgZm9yIChJdGVyYXRvciBpID0gcGFyZW50LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXRFZGl0UGFydCgoRWRpdFBhcnQpaS5uZXh0KCksIG9iamVjdCk7Ci0gICAgICAgIGlmIChlZGl0UGFydCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gRmlyc3QgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgc2VsZWN0aW9uCi0gICAgICAgICAgSVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24gdGhlbiB3ZSB3aWxsIHRyeSB0byBzZWxlY3QgCi0gICAgICAgICAgLy8gdGhlIHRhcmdldCBlZGl0IHBhcnQgdGhhdCBpcyBvbmUgb2YgaXRzIGNoaWxkcmVuCi0gICAgICAgICAgLy8gVGhpcyBpcyBoYW5keSB3aGVuIHlvdSBhZGQgYW4gZWxlbWVudCB0byBhIHN0cnVjdHVyZWQgZWRpdCBwYXJ0Ci0gICAgICAgICAgLy8gdGhlbiB5b3Ugd2FudCB0byBzZWxlY3QgdGhlIGVsZW1lbnQgaW1tZWRpYXRlbHkgYW5kIHB1dCBpdCBpbgotICAgICAgICAgIC8vIGRpcmVjdCBlZGl0IG1vZGUKLSAgICAgICAgICBpZiAoY3VycmVudFNlbGVjdGlvbiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50U2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRWRpdFBhcnQgdGFyZ2V0U3RydWN0dXJlRWRpdFBhcnQgPSAoRWRpdFBhcnQpKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKWN1cnJlbnRTZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICBpZiAodGFyZ2V0U3RydWN0dXJlRWRpdFBhcnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICh0YXJnZXRTdHJ1Y3R1cmVFZGl0UGFydCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRTdHJ1Y3R1cmVFZGl0UGFydCBpbnN0YW5jZW9mIFN0cnVjdHVyZUVkaXRQYXJ0KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIHRhcmdldFN0cnVjdHVyZUVkaXRQYXJ0ID0gdGFyZ2V0U3RydWN0dXJlRWRpdFBhcnQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIEVkaXRQYXJ0IHBvdGVudGlhbEVkaXRQYXJ0VG9TZWxlY3QgPSBlZGl0UGFydDsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIHdoaWxlIChwb3RlbnRpYWxFZGl0UGFydFRvU2VsZWN0ICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocG90ZW50aWFsRWRpdFBhcnRUb1NlbGVjdCBpbnN0YW5jZW9mIFN0cnVjdHVyZUVkaXRQYXJ0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwb3RlbnRpYWxFZGl0UGFydFRvU2VsZWN0ID0gcG90ZW50aWFsRWRpdFBhcnRUb1NlbGVjdC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgLy8gSWYgd2UgZm91bmQgYSBwb3RlbnRpYWwgZWRpdCBwYXJ0IHRvIHNlbGVjdCB0aGVuIHJldHVybiBpdAotICAgICAgICAgICAgICAvLyBPUiwgaWYgdGhlcmUgaXMgbm8gdGFyZ2V0IGZvdW5kLCB0aGVuIHdlIHNob3VsZCBqdXN0IHJldHVybgotICAgICAgICAgICAgICAvLyB0aGUgZWRpdCBwYXJ0IHdlIGZvdW5kCi0gICAgICAgICAgICAgIGlmIChwb3RlbnRpYWxFZGl0UGFydFRvU2VsZWN0ID09IHRhcmdldFN0cnVjdHVyZUVkaXRQYXJ0IHx8IHBvdGVudGlhbEVkaXRQYXJ0VG9TZWxlY3QgPT0gbnVsbCB8fCB0YXJnZXRTdHJ1Y3R1cmVFZGl0UGFydCA9PSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZWRpdFBhcnQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSAvLyBPdGhlcndpc2UganVzdCBmaW5kIHRoZSBmaXJzdCBvbmUgYW5kIHJldHVybgotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGVkaXRQYXJ0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgCi0gICAgfQotICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dEFuZE1hcmtMb2NhdGlvbihJQURUT2JqZWN0IG9iamVjdCkKLSAgewotICAgIElBRFRPYmplY3Qgb2xkSW5wdXQgPSBnZXRJbnB1dCgpOwotICAgIElOYXZpZ2F0aW9uSGlzdG9yeSBuYXZpZ2F0aW9uSGlzdG9yeSA9IG51bGw7Ci0gICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgIGlmKHdvcmtiZW5jaCAhPSBudWxsKQotICAgIHsKLSAgICAJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXb3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgCWlmKGFjdGl2ZVdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgIAl7Ci0gICAgCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gYWN0aXZlV29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAJCWlmKGFjdGl2ZVBhZ2UgIT0gbnVsbCkKLSAgICAJCXsKLSAgICAJCQluYXZpZ2F0aW9uSGlzdG9yeSA9IGFjdGl2ZVBhZ2UuZ2V0TmF2aWdhdGlvbkhpc3RvcnkoKTsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLQotICAgIHNldElucHV0KG9iamVjdCk7Ci0KLSAgICBpZiAoZWRpdG9yUGFydCAhPSBudWxsICYmIG9sZElucHV0ICE9IG9iamVjdCkKLSAgICB7Ci0gICAgICBuYXZpZ2F0aW9uSGlzdG9yeS5tYXJrTG9jYXRpb24oZWRpdG9yUGFydCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJQURUT2JqZWN0IG9iamVjdCkKLSAgewotICAgIFJvb3RDb250ZW50RWRpdFBhcnQgcm9vdENvbnRlbnRFZGl0UGFydCA9IChSb290Q29udGVudEVkaXRQYXJ0KWdldFJvb3RFZGl0UGFydCgpLmdldENvbnRlbnRzKCk7Ci0gICAgcm9vdENvbnRlbnRFZGl0UGFydC5zZXRNb2RlbChvYmplY3QpOwotICAgIHJvb3RDb250ZW50RWRpdFBhcnQucmVmcmVzaCgpOwotCi0gICAgaWYgKG9iamVjdCAhPSBudWxsKQotICAgIHsgIAotICAgICAgaW5wdXRDaGFuZ2VNYW5hZ2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmplY3QpKTsKLSAgICB9Ci0gICAgLy8gU2VsZWN0IHRoZSBlZGl0cGFydCB3aGVuIGl0IGlzIHNldCBhcyBpbnB1dAotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnQocm9vdENvbnRlbnRFZGl0UGFydCwgb2JqZWN0KTsKLSAgICBpZiAoZWRpdFBhcnQgIT0gbnVsbCkKLSAgICAgIHNlbGVjdChlZGl0UGFydCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldElucHV0KCkKLSAgewotICAgIFJvb3RDb250ZW50RWRpdFBhcnQgcm9vdENvbnRlbnRFZGl0UGFydCA9IChSb290Q29udGVudEVkaXRQYXJ0KWdldFJvb3RFZGl0UGFydCgpLmdldENvbnRlbnRzKCk7ICAgIAotICAgIHJldHVybiAoSUFEVE9iamVjdClyb290Q29udGVudEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFZGl0UGFydCBnZXRJbnB1dEVkaXRQYXJ0KCkKLSAgewotICAgIHJldHVybiBnZXRSb290RWRpdFBhcnQoKS5nZXRDb250ZW50cygpOyAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkSW5wdXRDaGFuZ2RMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgaW5wdXRDaGFuZ2VNYW5hZ2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUlucHV0Q2hhbmdkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGlucHV0Q2hhbmdlTWFuYWdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOyAgICAKLSAgfSAgCi0gIAotICAKLSAgcHJpdmF0ZSBjbGFzcyBJbnB1dENoYW5nZU1hbmFnZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIKLSAgewotICAgIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICAgIGlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLSAgICAgIHsgIAotICAgICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICAgIH0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0gICAgeyAgIAotICAgICAgLy8gbm8gb25lIHNob3VsZCBiZSBjYWxsaW5nIHRoaXMgbWV0aG9kICAgICAKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICAgIGxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOyAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgICB7IAotICAgICAgbm90aWZ5TGlzdGVuZXJzKHNlbGVjdGlvbik7Ci0gICAgfQotCi0gICAgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChsaXN0ZW5lcnMpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICAgIGxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pKTsKLSAgICAgIH0gIAotICAgIH0gICAgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9EZXNpZ25WaWV3ZXJHcmFwaGljQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRGVzaWduVmlld2VyR3JhcGhpY0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzRlMGQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9EZXNpZ25WaWV3ZXJHcmFwaGljQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgaW50ZXJmYWNlIERlc2lnblZpZXdlckdyYXBoaWNDb25zdGFudHMKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NBTEVEX0hBTkRMRV9MQVlFUiA9ICJTY2FsZWQgSGFuZGxlIExheWVyIjsgLy8kTk9OLU5MUy0xJCAgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIEZvbnQgIHNtYWxsRm9udCA9IG5ldyBGb250KERpc3BsYXkuZ2V0Q3VycmVudCgpLCAiVGFob21hIiwgNiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRmxhdENDb21iby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0ZsYXRDQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2ZDUxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRmxhdENDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVUZXh0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlR5cGVkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIFRoZSBDQ29tYm8gY2xhc3MgcmVwcmVzZW50cyBhIHNlbGVjdGFibGUgdXNlciBpbnRlcmZhY2Ugb2JqZWN0Ci0gKiB0aGF0IGNvbWJpbmVzIGEgdGV4dCBmaWVsZCBhbmQgYSBsaXN0IGFuZCBpc3N1ZXMgbm90aWZpY2F0aW9uCi0gKiB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQgZnJvbSB0aGUgbGlzdC4KLSAqIDxwPgotICogTm90ZSB0aGF0IGFsdGhvdWdoIHRoaXMgY2xhc3MgaXMgYSBzdWJjbGFzcyBvZiA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LAotICogaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBhZGQgY2hpbGRyZW4gdG8gaXQsIG9yIHNldCBhIGxheW91dCBvbiBpdC4KLSAqIDwvcD4KLSAqIDxkbD4KLSAqIDxkdD48Yj5TdHlsZXM6PC9iPgotICogPGRkPkJPUkRFUiwgUkVBRF9PTkxZLCBGTEFUPC9kZD4KLSAqIDxkdD48Yj5FdmVudHM6PC9iPgotICogPGRkPlNlbGVjdGlvbjwvZGQ+Ci0gKiA8L2RsPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRmxhdENDb21ibyBleHRlbmRzIENvbXBvc2l0ZSB7Ci0KLSAgVGV4dCB0ZXh0OwotICBMaXN0IGxpc3Q7Ci0gIGludCB2aXNpYmxlSXRlbUNvdW50ID0gNTsKLSAgU2hlbGwgcG9wdXA7Ci0gIExhYmVsIGFycm93OwotICBib29sZWFuIGhhc0ZvY3VzOwotICBMaXN0ZW5lciBsaXN0ZW5lciwgZmlsdGVyOwotICBDb2xvciBmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kOwotICBGb250IGZvbnQ7Ci0gIAotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZ2l2ZW4gaXRzIHBhcmVudAotICogYW5kIGEgc3R5bGUgdmFsdWUgZGVzY3JpYmluZyBpdHMgYmVoYXZpb3IgYW5kIGFwcGVhcmFuY2UuCi0gKiA8cD4KLSAqIFRoZSBzdHlsZSB2YWx1ZSBpcyBlaXRoZXIgb25lIG9mIHRoZSBzdHlsZSBjb25zdGFudHMgZGVmaW5lZCBpbgotICogY2xhc3MgPGNvZGU+U1dUPC9jb2RlPiB3aGljaCBpcyBhcHBsaWNhYmxlIHRvIGluc3RhbmNlcyBvZiB0aGlzCi0gKiBjbGFzcywgb3IgbXVzdCBiZSBidWlsdCBieSA8ZW0+Yml0d2lzZSBPUjwvZW0+J2luZyB0b2dldGhlciAKLSAqICh0aGF0IGlzLCB1c2luZyB0aGUgPGNvZGU+aW50PC9jb2RlPiAifCIgb3BlcmF0b3IpIHR3byBvciBtb3JlCi0gKiBvZiB0aG9zZSA8Y29kZT5TV1Q8L2NvZGU+IHN0eWxlIGNvbnN0YW50cy4gVGhlIGNsYXNzIGRlc2NyaXB0aW9uCi0gKiBsaXN0cyB0aGUgc3R5bGUgY29uc3RhbnRzIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGNsYXNzLgotICogU3R5bGUgYml0cyBhcmUgYWxzbyBpbmhlcml0ZWQgZnJvbSBzdXBlcmNsYXNzZXMuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHBhcmVudCBhIHdpZGdldCB3aGljaCB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBpbnN0YW5jZSAoY2Fubm90IGJlIG51bGwpCi0gKiBAcGFyYW0gc3R5bGUgdGhlIHN0eWxlIG9mIHdpZGdldCB0byBjb25zdHJ1Y3QKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYXJlbnQgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHBhcmVudDwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgU1dUI0JPUkRFUgotICogQHNlZSBTV1QjUkVBRF9PTkxZCi0gKiBAc2VlIFNXVCNGTEFUCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCNnZXRTdHlsZSgpCi0gKi8KLXB1YmxpYyBGbGF0Q0NvbWJvIChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgc3VwZXIgKHBhcmVudCwgc3R5bGUgPSBjaGVja1N0eWxlIChzdHlsZSkpOwotICAKLSAgaW50IHRleHRTdHlsZSA9IFNXVC5TSU5HTEU7Ci0gIGlmICgoc3R5bGUgJiBTV1QuUkVBRF9PTkxZKSAhPSAwKSB0ZXh0U3R5bGUgfD0gU1dULlJFQURfT05MWTsKLSAgaWYgKChzdHlsZSAmIFNXVC5GTEFUKSAhPSAwKSB0ZXh0U3R5bGUgfD0gU1dULkZMQVQ7Ci0gIHRleHQgPSBuZXcgVGV4dCAodGhpcywgdGV4dFN0eWxlKTsKLSAgaW50IGFycm93U3R5bGUgPSBTV1QuQVJST1cgfCBTV1QuRE9XTjsKLSAgaWYgKChzdHlsZSAmIFNXVC5GTEFUKSAhPSAwKSBhcnJvd1N0eWxlIHw9IFNXVC5GTEFUOwotICBhcnJvdyA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuRkxBVCk7Ci0gIGFycm93LnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvVHJpYW5nbGVUb29sQmFyLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0gIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLSAgICAgIGlmIChwb3B1cCA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgICAgcG9wdXBFdmVudCAoZXZlbnQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAodGV4dCA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgICAgdGV4dEV2ZW50IChldmVudCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChsaXN0ID09IGV2ZW50LndpZGdldCkgewotICAgICAgICBsaXN0RXZlbnQgKGV2ZW50KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKGFycm93ID09IGV2ZW50LndpZGdldCkgewotICAgICAgICBhcnJvd0V2ZW50IChldmVudCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChGbGF0Q0NvbWJvLnRoaXMgPT0gZXZlbnQud2lkZ2V0KSB7Ci0gICAgICAgIGNvbWJvRXZlbnQgKGV2ZW50KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKGdldFNoZWxsICgpID09IGV2ZW50LndpZGdldCkgewotICAgICAgICBoYW5kbGVGb2N1cyAoU1dULkZvY3VzT3V0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH07Ci0gIGZpbHRlciA9IG5ldyBMaXN0ZW5lcigpIHsKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgU2hlbGwgc2hlbGwgPSAoKENvbnRyb2wpZXZlbnQud2lkZ2V0KS5nZXRTaGVsbCAoKTsKLSAgICAgIGlmIChzaGVsbCA9PSBGbGF0Q0NvbWJvLnRoaXMuZ2V0U2hlbGwgKCkpIHsKLSAgICAgICAgaGFuZGxlRm9jdXMgKFNXVC5Gb2N1c091dCk7Ci0gICAgICB9Ci0gICAgfQotICB9OwotICAKLSAgaW50IFtdIGNvbWJvRXZlbnRzID0ge1NXVC5EaXNwb3NlLCBTV1QuTW92ZSwgU1dULlJlc2l6ZX07Ci0gIGZvciAoaW50IGk9MDsgaTxjb21ib0V2ZW50cy5sZW5ndGg7IGkrKykgdGhpcy5hZGRMaXN0ZW5lciAoY29tYm9FdmVudHMgW2ldLCBsaXN0ZW5lcik7Ci0gIAotICBpbnQgW10gdGV4dEV2ZW50cyA9IHtTV1QuS2V5RG93biwgU1dULktleVVwLCBTV1QuTWVudURldGVjdCwgU1dULk1vZGlmeSwgU1dULk1vdXNlRG93biwgU1dULk1vdXNlVXAsIFNXVC5UcmF2ZXJzZSwgU1dULkZvY3VzSW59OwotICBmb3IgKGludCBpPTA7IGk8dGV4dEV2ZW50cy5sZW5ndGg7IGkrKykgdGV4dC5hZGRMaXN0ZW5lciAodGV4dEV2ZW50cyBbaV0sIGxpc3RlbmVyKTsKLSAgCi0gIGludCBbXSBhcnJvd0V2ZW50cyA9IHtTV1QuTW91c2VEb3duLCBTV1QuU2VsZWN0aW9uLCBTV1QuRm9jdXNJbn07Ci0gIGZvciAoaW50IGk9MDsgaTxhcnJvd0V2ZW50cy5sZW5ndGg7IGkrKykgYXJyb3cuYWRkTGlzdGVuZXIgKGFycm93RXZlbnRzIFtpXSwgbGlzdGVuZXIpOwotICAKLSAgY3JlYXRlUG9wdXAobnVsbCwgLTEpOwotICBpbml0QWNjZXNzaWJsZSgpOwotfQotc3RhdGljIGludCBjaGVja1N0eWxlIChpbnQgc3R5bGUpIHsKLSAgaW50IG1hc2sgPSBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSB8IFNXVC5GTEFUIHwgU1dULkxFRlRfVE9fUklHSFQgfCBTV1QuUklHSFRfVE9fTEVGVDsKLSAgcmV0dXJuIHN0eWxlICYgbWFzazsKLX0KLS8qKgotICogQWRkcyB0aGUgYXJndW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgcmVjZWl2ZXIncyBsaXN0LgotICoKLSAqIEBwYXJhbSBzdHJpbmcgdGhlIG5ldyBpdGVtCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKgotICogQHNlZSAjYWRkKFN0cmluZyxpbnQpCi0gKi8KLXB1YmxpYyB2b2lkIGFkZCAoU3RyaW5nIHN0cmluZykgewotICBjaGVja1dpZGdldCgpOwotICBpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICBsaXN0LmFkZCAoc3RyaW5nKTsKLX0KLS8qKgotICogQWRkcyB0aGUgYXJndW1lbnQgdG8gdGhlIHJlY2VpdmVyJ3MgbGlzdCBhdCB0aGUgZ2l2ZW4KLSAqIHplcm8tcmVsYXRpdmUgaW5kZXguCi0gKiA8cD4KLSAqIE5vdGU6IFRvIGFkZCBhbiBpdGVtIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QsIHVzZSB0aGUKLSAqIHJlc3VsdCBvZiBjYWxsaW5nIDxjb2RlPmdldEl0ZW1Db3VudCgpPC9jb2RlPiBhcyB0aGUKLSAqIGluZGV4IG9yIHVzZSA8Y29kZT5hZGQoU3RyaW5nKTwvY29kZT4uCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHN0cmluZyB0aGUgbmV3IGl0ZW0KLSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggZm9yIHRoZSBpdGVtCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfUkFOR0UgLSBpZiB0aGUgaW5kZXggaXMgbm90IGJldHdlZW4gMCBhbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAoaW5jbHVzaXZlKTwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqCi0gKiBAc2VlICNhZGQoU3RyaW5nKQotICovCi1wdWJsaWMgdm9pZCBhZGQgKFN0cmluZyBzdHJpbmcsIGludCBpbmRleCkgewotICBjaGVja1dpZGdldCgpOwotICBpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICBsaXN0LmFkZCAoc3RyaW5nLCBpbmRleCk7Ci19Ci0vKioKLSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbAotICogYmUgbm90aWZpZWQgd2hlbiB0aGUgcmVjZWl2ZXIncyB0ZXh0IGlzIG1vZGlmaWVkLCBieSBzZW5kaW5nCi0gKiBpdCBvbmUgb2YgdGhlIG1lc3NhZ2VzIGRlZmluZWQgaW4gdGhlIDxjb2RlPk1vZGlmeUxpc3RlbmVyPC9jb2RlPgotICogaW50ZXJmYWNlLgotICoKLSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqCi0gKiBAc2VlIE1vZGlmeUxpc3RlbmVyCi0gKiBAc2VlICNyZW1vdmVNb2RpZnlMaXN0ZW5lcgotICovCi1wdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lciAoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgaWYgKGxpc3RlbmVyID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICBUeXBlZExpc3RlbmVyIHR5cGVkTGlzdGVuZXIgPSBuZXcgVHlwZWRMaXN0ZW5lciAobGlzdGVuZXIpOwotICBhZGRMaXN0ZW5lciAoU1dULk1vZGlmeSwgdHlwZWRMaXN0ZW5lcik7Ci19Ci0vKioKLSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbAotICogYmUgbm90aWZpZWQgd2hlbiB0aGUgcmVjZWl2ZXIncyBzZWxlY3Rpb24gY2hhbmdlcywgYnkgc2VuZGluZwotICogaXQgb25lIG9mIHRoZSBtZXNzYWdlcyBkZWZpbmVkIGluIHRoZSA8Y29kZT5TZWxlY3Rpb25MaXN0ZW5lcjwvY29kZT4KLSAqIGludGVyZmFjZS4KLSAqIDxwPgotICogPGNvZGU+d2lkZ2V0U2VsZWN0ZWQ8L2NvZGU+IGlzIGNhbGxlZCB3aGVuIHRoZSBjb21ibydzIGxpc3Qgc2VsZWN0aW9uIGNoYW5nZXMuCi0gKiA8Y29kZT53aWRnZXREZWZhdWx0U2VsZWN0ZWQ8L2NvZGU+IGlzIHR5cGljYWxseSBjYWxsZWQgd2hlbiBFTlRFUiBpcyBwcmVzc2VkIHRoZSBjb21ibydzIHRleHQgYXJlYS4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKgotICogQHNlZSBTZWxlY3Rpb25MaXN0ZW5lcgotICogQHNlZSAjcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotICovCi1wdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICBjaGVja1dpZGdldCgpOwotICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gIFR5cGVkTGlzdGVuZXIgdHlwZWRMaXN0ZW5lciA9IG5ldyBUeXBlZExpc3RlbmVyIChsaXN0ZW5lcik7Ci0gIGFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLHR5cGVkTGlzdGVuZXIpOwotICBhZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sdHlwZWRMaXN0ZW5lcik7Ci19Ci12b2lkIGFycm93RXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQudHlwZSkgewotICAgIGNhc2UgU1dULkZvY3VzSW46IHsKLSAgICAgIGhhbmRsZUZvY3VzIChTV1QuRm9jdXNJbik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuU2VsZWN0aW9uOiB7Ci0gICAgICBkcm9wRG93biAoIWlzRHJvcHBlZCAoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuTW91c2VEb3duOiB7Ci0gICAgICBkcm9wRG93biAoIWlzRHJvcHBlZCAoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLS8qKgotICogU2V0cyB0aGUgc2VsZWN0aW9uIGluIHRoZSByZWNlaXZlcidzIHRleHQgZmllbGQgdG8gYW4gZW1wdHkKLSAqIHNlbGVjdGlvbiBzdGFydGluZyBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgY2hhcmFjdGVyLiBJZiB0aGUKLSAqIHRleHQgZmllbGQgaXMgZWRpdGFibGUsIHRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgcGxhY2luZyB0aGUKLSAqIGktYmVhbSBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQuCi0gKiA8cD4KLSAqIE5vdGU6IFRvIGNsZWFyIHRoZSBzZWxlY3RlZCBpdGVtcyBpbiB0aGUgcmVjZWl2ZXIncyBsaXN0LCAKLSAqIHVzZSA8Y29kZT5kZXNlbGVjdEFsbCgpPC9jb2RlPi4KLSAqIDwvcD4KLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgI2Rlc2VsZWN0QWxsCi0gKi8KLXB1YmxpYyB2b2lkIGNsZWFyU2VsZWN0aW9uICgpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIHRleHQuY2xlYXJTZWxlY3Rpb24gKCk7Ci0gIGxpc3QuZGVzZWxlY3RBbGwgKCk7Ci19Ci12b2lkIGNvbWJvRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQudHlwZSkgewotICAgIGNhc2UgU1dULkRpc3Bvc2U6Ci0gICAgICBpZiAocG9wdXAgIT0gbnVsbCAmJiAhcG9wdXAuaXNEaXNwb3NlZCAoKSkgewotICAgICAgICBsaXN0LnJlbW92ZUxpc3RlbmVyIChTV1QuRGlzcG9zZSwgbGlzdGVuZXIpOwotICAgICAgICBwb3B1cC5kaXNwb3NlICgpOwotICAgICAgfQotICAgICAgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCAoKTsKLSAgICAgIHNoZWxsLnJlbW92ZUxpc3RlbmVyIChTV1QuRGVhY3RpdmF0ZSwgbGlzdGVuZXIpOwotICAgICAgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSAoKTsKLSAgICAgIGRpc3BsYXkucmVtb3ZlRmlsdGVyIChTV1QuRm9jdXNJbiwgZmlsdGVyKTsKLSAgICAgIHBvcHVwID0gbnVsbDsgIAotICAgICAgdGV4dCA9IG51bGw7ICAKLSAgICAgIGxpc3QgPSBudWxsOyAgCi0gICAgICBhcnJvdyA9IG51bGw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNXVC5Nb3ZlOgotICAgICAgZHJvcERvd24gKGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1dULlJlc2l6ZToKLSAgICAgIGludGVybmFsTGF5b3V0IChmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi1wdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUgKGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIGludCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7Ci0gIFN0cmluZ1tdIGl0ZW1zID0gbGlzdC5nZXRJdGVtcyAoKTsKLSAgaW50IHRleHRXaWR0aCA9IDA7Ci0gIEdDIGdjID0gbmV3IEdDICh0ZXh0KTsKLSAgaW50IHNwYWNlciA9IGdjLnN0cmluZ0V4dGVudCAoIiAiKS54OyAvLyROT04tTkxTLTEkCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICB0ZXh0V2lkdGggPSBNYXRoLm1heCAoZ2Muc3RyaW5nRXh0ZW50IChpdGVtc1tpXSkueCwgdGV4dFdpZHRoKTsKLSAgfQotICBnYy5kaXNwb3NlKCk7Ci0gIFBvaW50IHRleHRTaXplID0gdGV4dC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBjaGFuZ2VkKTsKLSAgLy8gUG9pbnQgYXJyb3dTaXplID0gYXJyb3cuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7Ci0gIFBvaW50IGFycm93U2l6ZSA9IG5ldyBQb2ludCgxNiwgMTYpOwotICBQb2ludCBsaXN0U2l6ZSA9IGxpc3QuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7Ci0gIGludCBib3JkZXJXaWR0aCA9IGdldEJvcmRlcldpZHRoICgpOwotICAKLSAgaGVpZ2h0ID0gTWF0aC5tYXggKHRleHRTaXplLnksIGFycm93U2l6ZS55KTsKLSAgd2lkdGggPSBNYXRoLm1heCAodGV4dFdpZHRoICsgMipzcGFjZXIgKyBhcnJvd1NpemUueCArIDIqYm9yZGVyV2lkdGgsIGxpc3RTaXplLngpOwotICBpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpIHdpZHRoID0gd0hpbnQ7Ci0gIGlmIChoSGludCAhPSBTV1QuREVGQVVMVCkgaGVpZ2h0ID0gaEhpbnQ7Ci0gIHJldHVybiBuZXcgUG9pbnQgKHdpZHRoICsgMipib3JkZXJXaWR0aCwgaGVpZ2h0ICsgMipib3JkZXJXaWR0aCk7Ci19Ci12b2lkIGNyZWF0ZVBvcHVwKFN0cmluZ1tdIGl0ZW1zLCBpbnQgc2VsZWN0aW9uSW5kZXgpIHsgICAgCi0gICAgLy8gY3JlYXRlIHNoZWxsIGFuZCBsaXN0Ci0gICAgcG9wdXAgPSBuZXcgU2hlbGwgKGdldFNoZWxsICgpLCBTV1QuTk9fVFJJTSB8IFNXVC5PTl9UT1ApOwotICAgIGludCBzdHlsZSA9IGdldFN0eWxlICgpOwotICAgIGludCBsaXN0U3R5bGUgPSBTV1QuU0lOR0xFIHwgU1dULlZfU0NST0xMOwotICAgIGlmICgoc3R5bGUgJiBTV1QuRkxBVCkgIT0gMCkgbGlzdFN0eWxlIHw9IFNXVC5GTEFUOwotICAgIGlmICgoc3R5bGUgJiBTV1QuUklHSFRfVE9fTEVGVCkgIT0gMCkgbGlzdFN0eWxlIHw9IFNXVC5SSUdIVF9UT19MRUZUOwotICAgIGlmICgoc3R5bGUgJiBTV1QuTEVGVF9UT19SSUdIVCkgIT0gMCkgbGlzdFN0eWxlIHw9IFNXVC5MRUZUX1RPX1JJR0hUOwotICAgIGxpc3QgPSBuZXcgTGlzdCAocG9wdXAsIGxpc3RTdHlsZSk7Ci0gICAgaWYgKGZvbnQgIT0gbnVsbCkgbGlzdC5zZXRGb250IChmb250KTsKLSAgICBpZiAoZm9yZWdyb3VuZCAhPSBudWxsKSBsaXN0LnNldEZvcmVncm91bmQgKGZvcmVncm91bmQpOwotICAgIGlmIChiYWNrZ3JvdW5kICE9IG51bGwpIGxpc3Quc2V0QmFja2dyb3VuZCAoYmFja2dyb3VuZCk7Ci0gICAgCi0gICAgaW50IFtdIHBvcHVwRXZlbnRzID0ge1NXVC5DbG9zZSwgU1dULlBhaW50LCBTV1QuRGVhY3RpdmF0ZX07Ci0gICAgZm9yIChpbnQgaT0wOyBpPHBvcHVwRXZlbnRzLmxlbmd0aDsgaSsrKSBwb3B1cC5hZGRMaXN0ZW5lciAocG9wdXBFdmVudHMgW2ldLCBsaXN0ZW5lcik7Ci0gICAgaW50IFtdIGxpc3RFdmVudHMgPSB7U1dULk1vdXNlVXAsIFNXVC5TZWxlY3Rpb24sIFNXVC5UcmF2ZXJzZSwgU1dULktleURvd24sIFNXVC5LZXlVcCwgU1dULkZvY3VzSW4sIFNXVC5EaXNwb3NlfTsKLSAgICBmb3IgKGludCBpPTA7IGk8bGlzdEV2ZW50cy5sZW5ndGg7IGkrKykgbGlzdC5hZGRMaXN0ZW5lciAobGlzdEV2ZW50cyBbaV0sIGxpc3RlbmVyKTsKLSAgICAKLSAgICBpZiAoaXRlbXMgIT0gbnVsbCkgbGlzdC5zZXRJdGVtcyAoaXRlbXMpOwotICAgIGlmIChzZWxlY3Rpb25JbmRleCAhPSAtMSkgbGlzdC5zZXRTZWxlY3Rpb24gKHNlbGVjdGlvbkluZGV4KTsKLX0KLS8qKgotICogRGVzZWxlY3RzIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiB6ZXJvLXJlbGF0aXZlIGluZGV4IGluIHRoZSByZWNlaXZlcidzIAotICogbGlzdC4gIElmIHRoZSBpdGVtIGF0IHRoZSBpbmRleCB3YXMgYWxyZWFkeSBkZXNlbGVjdGVkLCBpdCByZW1haW5zCi0gKiBkZXNlbGVjdGVkLiBJbmRpY2VzIHRoYXQgYXJlIG91dCBvZiByYW5nZSBhcmUgaWdub3JlZC4KLSAqCi0gKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIGRlc2VsZWN0Ci0gKgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgZGVzZWxlY3QgKGludCBpbmRleCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgbGlzdC5kZXNlbGVjdCAoaW5kZXgpOwotfQotLyoqCi0gKiBEZXNlbGVjdHMgYWxsIHNlbGVjdGVkIGl0ZW1zIGluIHRoZSByZWNlaXZlcidzIGxpc3QuCi0gKiA8cD4KLSAqIE5vdGU6IFRvIGNsZWFyIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHJlY2VpdmVyJ3MgdGV4dCBmaWVsZCwKLSAqIHVzZSA8Y29kZT5jbGVhclNlbGVjdGlvbigpPC9jb2RlPi4KLSAqIDwvcD4KLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgI2NsZWFyU2VsZWN0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIGRlc2VsZWN0QWxsICgpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIGxpc3QuZGVzZWxlY3RBbGwgKCk7Ci19Ci12b2lkIGRyb3BEb3duIChib29sZWFuIGRyb3ApIHsKLSAgaWYgKGRyb3AgPT0gaXNEcm9wcGVkICgpKSByZXR1cm47Ci0gIGlmICghZHJvcCkgewotICAgIHBvcHVwLnNldFZpc2libGUgKGZhbHNlKTsKLSAgICBpZiAoIWlzRGlzcG9zZWQgKCkmJiBhcnJvdy5pc0ZvY3VzQ29udHJvbCgpKSB7Ci0gICAgICB0ZXh0LnNldEZvY3VzKCk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChnZXRTaGVsbCgpICE9IHBvcHVwLmdldFBhcmVudCAoKSkgewotICAgIFN0cmluZ1tdIGl0ZW1zID0gbGlzdC5nZXRJdGVtcyAoKTsKLSAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4ICgpOwotICAgIGxpc3QucmVtb3ZlTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci0gICAgcG9wdXAuZGlzcG9zZSgpOwotICAgIHBvcHVwID0gbnVsbDsKLSAgICBsaXN0ID0gbnVsbDsKLSAgICBjcmVhdGVQb3B1cCAoaXRlbXMsIHNlbGVjdGlvbkluZGV4KTsKLSAgfQotICAKLSAgUG9pbnQgc2l6ZSA9IGdldFNpemUgKCk7Ci0gIGludCBpdGVtQ291bnQgPSBsaXN0LmdldEl0ZW1Db3VudCAoKTsKLSAgaXRlbUNvdW50ID0gKGl0ZW1Db3VudCA9PSAwKSA/IHZpc2libGVJdGVtQ291bnQgOiBNYXRoLm1pbih2aXNpYmxlSXRlbUNvdW50LCBpdGVtQ291bnQpOwotICBpbnQgaXRlbUhlaWdodCA9IGxpc3QuZ2V0SXRlbUhlaWdodCAoKSAqIGl0ZW1Db3VudDsKLSAgUG9pbnQgbGlzdFNpemUgPSBsaXN0LmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgaXRlbUhlaWdodCwgZmFsc2UpOwotICBsaXN0LnNldEJvdW5kcyAoMSwgMSwgTWF0aC5tYXggKHNpemUueCAtIDIsIGxpc3RTaXplLngpLCBsaXN0U2l6ZS55KTsKLSAgCi0gIGludCBpbmRleCA9IGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0gIGlmIChpbmRleCAhPSAtMSkgbGlzdC5zZXRUb3BJbmRleCAoaW5kZXgpOwotICBEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5ICgpOwotICBSZWN0YW5nbGUgbGlzdFJlY3QgPSBsaXN0LmdldEJvdW5kcyAoKTsKLSAgUmVjdGFuZ2xlIHBhcmVudFJlY3QgPSBkaXNwbGF5Lm1hcCAoZ2V0UGFyZW50ICgpLCBudWxsLCBnZXRCb3VuZHMgKCkpOwotICBQb2ludCBjb21ib1NpemUgPSBnZXRTaXplICgpOwotICBSZWN0YW5nbGUgZGlzcGxheVJlY3QgPSBnZXRNb25pdG9yICgpLmdldENsaWVudEFyZWEgKCk7Ci0gIGludCB3aWR0aCA9IE1hdGgubWF4IChjb21ib1NpemUueCwgbGlzdFJlY3Qud2lkdGggKyAyKTsKLSAgaW50IGhlaWdodCA9IGxpc3RSZWN0LmhlaWdodCArIDI7Ci0gIGludCB4ID0gcGFyZW50UmVjdC54OwotICBpbnQgeSA9IHBhcmVudFJlY3QueSArIGNvbWJvU2l6ZS55OwotICBpZiAoeSArIGhlaWdodCA+IGRpc3BsYXlSZWN0LnkgKyBkaXNwbGF5UmVjdC5oZWlnaHQpIHkgPSBwYXJlbnRSZWN0LnkgLSBoZWlnaHQ7Ci0gIGlmICh4ICsgd2lkdGggPiBkaXNwbGF5UmVjdC54ICsgZGlzcGxheVJlY3Qud2lkdGgpIHggPSBkaXNwbGF5UmVjdC54ICsgZGlzcGxheVJlY3Qud2lkdGggLSBsaXN0UmVjdC53aWR0aDsKLSAgcG9wdXAuc2V0Qm91bmRzICh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSAgcG9wdXAuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0gIGxpc3Quc2V0Rm9jdXMgKCk7Ci19Ci0vKgotICogUmV0dXJuIHRoZSBsb3dlcmNhc2Ugb2YgdGhlIGZpcnN0IG5vbi0nJicgY2hhcmFjdGVyIGZvbGxvd2luZwotICogYW4gJyYnIGNoYXJhY3RlciBpbiB0aGUgZ2l2ZW4gc3RyaW5nLiBJZiB0aGVyZSBhcmUgbm8gJyYnCi0gKiBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBzdHJpbmcsIHJldHVybiAnXDAnLgotICovCi1jaGFyIF9maW5kTW5lbW9uaWMgKFN0cmluZyBzdHJpbmcpIHsKLSAgaWYgKHN0cmluZyA9PSBudWxsKSByZXR1cm4gJ1wwJzsKLSAgaW50IGluZGV4ID0gMDsKLSAgaW50IGxlbmd0aCA9IHN0cmluZy5sZW5ndGggKCk7Ci0gIGRvIHsKLSAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGggJiYgc3RyaW5nLmNoYXJBdCAoaW5kZXgpICE9ICcmJykgaW5kZXgrKzsKLSAgICBpZiAoKytpbmRleCA+PSBsZW5ndGgpIHJldHVybiAnXDAnOwotICAgIGlmIChzdHJpbmcuY2hhckF0IChpbmRleCkgIT0gJyYnKSByZXR1cm4gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlIChzdHJpbmcuY2hhckF0IChpbmRleCkpOwotICAgIGluZGV4Kys7Ci0gIH0gd2hpbGUgKGluZGV4IDwgbGVuZ3RoKTsKLSAgcmV0dXJuICdcMCc7Ci19Ci0vKiAKLSAqIFJldHVybiB0aGUgTGFiZWwgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHRoZSByZWNlaXZlciBpbiB0aGUgei1vcmRlciwgCi0gKiBvciBudWxsIGlmIG5vbmUuIAotICovCi1MYWJlbCBnZXRBc3NvY2lhdGVkTGFiZWwgKCkgewotICBDb250cm9sW10gc2libGluZ3MgPSBnZXRQYXJlbnQgKCkuZ2V0Q2hpbGRyZW4gKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2libGluZ3MubGVuZ3RoOyBpKyspIHsKLSAgICBpZiAoc2libGluZ3MgW2ldID09IHRoaXMpIHsKLSAgICAgIGlmIChpID4gMCAmJiBzaWJsaW5ncyBbaS0xXSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0gICAgICAgIHJldHVybiAoTGFiZWwpIHNpYmxpbmdzIFtpLTFdOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBDb250cm9sIFtdIGdldENoaWxkcmVuICgpIHsKLSAgcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKCk7Ci19Ci0vKioKLSAqIEdldHMgdGhlIGVkaXRhYmxlIHN0YXRlLgotICoKLSAqIEByZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHJlY2VpdmVyIGlzIGVkaXRhYmxlCi0gKiAKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGJvb2xlYW4gZ2V0RWRpdGFibGUgKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIHRleHQuZ2V0RWRpdGFibGUoKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4sIHplcm8tcmVsYXRpdmUgaW5kZXggaW4gdGhlCi0gKiByZWNlaXZlcidzIGxpc3QuIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG91dAotICogb2YgcmFuZ2UuCi0gKgotICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm4KLSAqIEByZXR1cm4gdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGluZGV4Ci0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfUkFOR0UgLSBpZiB0aGUgaW5kZXggaXMgbm90IGJldHdlZW4gMCBhbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCBtaW51cyAxIChpbmNsdXNpdmUpPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgU3RyaW5nIGdldEl0ZW0gKGludCBpbmRleCkgewotICBjaGVja1dpZGdldCgpOwotICByZXR1cm4gbGlzdC5nZXRJdGVtIChpbmRleCk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBjb250YWluZWQgaW4gdGhlIHJlY2VpdmVyJ3MgbGlzdC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMKLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldEl0ZW1Db3VudCAoKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICByZXR1cm4gbGlzdC5nZXRJdGVtQ291bnQgKCk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgYXJlYSB3aGljaCB3b3VsZCBiZSB1c2VkIHRvCi0gKiBkaXNwbGF5IDxlbT5vbmU8L2VtPiBvZiB0aGUgaXRlbXMgaW4gdGhlIHJlY2VpdmVyJ3MgbGlzdC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBoZWlnaHQgb2Ygb25lIGl0ZW0KLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldEl0ZW1IZWlnaHQgKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIGxpc3QuZ2V0SXRlbUhlaWdodCAoKTsKLX0KLS8qKgotICogUmV0dXJucyBhbiBhcnJheSBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+cyB3aGljaCBhcmUgdGhlIGl0ZW1zCi0gKiBpbiB0aGUgcmVjZWl2ZXIncyBsaXN0LiAKLSAqIDxwPgotICogTm90ZTogVGhpcyBpcyBub3QgdGhlIGFjdHVhbCBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgcmVjZWl2ZXIKLSAqIHRvIG1haW50YWluIGl0cyBsaXN0IG9mIGl0ZW1zLCBzbyBtb2RpZnlpbmcgdGhlIGFycmF5IHdpbGwKLSAqIG5vdCBhZmZlY3QgdGhlIHJlY2VpdmVyLiAKLSAqIDwvcD4KLSAqCi0gKiBAcmV0dXJuIHRoZSBpdGVtcyBpbiB0aGUgcmVjZWl2ZXIncyBsaXN0Ci0gKgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFN0cmluZyBbXSBnZXRJdGVtcyAoKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICByZXR1cm4gbGlzdC5nZXRJdGVtcyAoKTsKLX0KLXB1YmxpYyBNZW51IGdldE1lbnUoKSB7Ci0gIHJldHVybiB0ZXh0LmdldE1lbnUoKTsKLX0KLS8qKgotICogUmV0dXJucyBhIDxjb2RlPlBvaW50PC9jb2RlPiB3aG9zZSB4IGNvb3JkaW5hdGUgaXMgdGhlIHN0YXJ0Ci0gKiBvZiB0aGUgc2VsZWN0aW9uIGluIHRoZSByZWNlaXZlcidzIHRleHQgZmllbGQsIGFuZCB3aG9zZSB5Ci0gKiBjb29yZGluYXRlIGlzIHRoZSBlbmQgb2YgdGhlIHNlbGVjdGlvbi4gVGhlIHJldHVybmVkIHZhbHVlcwotICogYXJlIHplcm8tcmVsYXRpdmUuIEFuICJlbXB0eSIgc2VsZWN0aW9uIGFzIGluZGljYXRlZCBieQotICogdGhlIHRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIGhhdmluZyB0aGUgc2FtZSB2YWx1ZS4KLSAqCi0gKiBAcmV0dXJuIGEgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBzZWxlY3Rpb24gc3RhcnQgYW5kIGVuZAotICoKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb24gKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIHRleHQuZ2V0U2VsZWN0aW9uICgpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSB6ZXJvLXJlbGF0aXZlIGluZGV4IG9mIHRoZSBpdGVtIHdoaWNoIGlzIGN1cnJlbnRseQotICogc2VsZWN0ZWQgaW4gdGhlIHJlY2VpdmVyJ3MgbGlzdCwgb3IgLTEgaWYgbm8gaXRlbSBpcyBzZWxlY3RlZC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotICoKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uSW5kZXggKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci19Ci1wdWJsaWMgaW50IGdldFN0eWxlICgpIHsKLSAgaW50IHN0eWxlID0gc3VwZXIuZ2V0U3R5bGUgKCk7Ci0gIHN0eWxlICY9IH5TV1QuUkVBRF9PTkxZOwotICBpZiAoIXRleHQuZ2V0RWRpdGFibGUoKSkgc3R5bGUgfD0gU1dULlJFQURfT05MWTsgCi0gIHJldHVybiBzdHlsZTsKLX0KLS8qKgotICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlCi0gKiByZWNlaXZlcidzIHRleHQgZmllbGQuCi0gKgotICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyB0ZXh0Ci0gKgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFN0cmluZyBnZXRUZXh0ICgpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIHJldHVybiB0ZXh0LmdldFRleHQgKCk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgcmVjZWl2ZXJzJ3MgdGV4dCBmaWVsZC4KLSAqCi0gKiBAcmV0dXJuIHRoZSB0ZXh0IGhlaWdodAotICoKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBpbnQgZ2V0VGV4dEhlaWdodCAoKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICByZXR1cm4gdGV4dC5nZXRMaW5lSGVpZ2h0ICgpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgdGhlIHJlY2VpdmVyJ3MKLSAqIHRleHQgZmllbGQgaXMgY2FwYWJsZSBvZiBob2xkaW5nLiBJZiB0aGlzIGhhcyBub3QgYmVlbiBjaGFuZ2VkCi0gKiBieSA8Y29kZT5zZXRUZXh0TGltaXQoKTwvY29kZT4sIGl0IHdpbGwgYmUgdGhlIGNvbnN0YW50Ci0gKiA8Y29kZT5Db21iby5MSU1JVDwvY29kZT4uCi0gKiAKLSAqIEByZXR1cm4gdGhlIHRleHQgbGltaXQKLSAqIAotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGludCBnZXRUZXh0TGltaXQgKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIHRleHQuZ2V0VGV4dExpbWl0ICgpOwotfQotLyoqCi0gKiBHZXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCBhcmUgdmlzaWJsZSBpbiB0aGUgZHJvcAotICogZG93biBwb3J0aW9uIG9mIHRoZSByZWNlaXZlcidzIGxpc3QuCi0gKgotICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgYXJlIHZpc2libGUKLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnQgZ2V0VmlzaWJsZUl0ZW1Db3VudCAoKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICByZXR1cm4gdmlzaWJsZUl0ZW1Db3VudDsKLX0KLXZvaWQgaGFuZGxlRm9jdXMgKGludCB0eXBlKSB7Ci0gIGlmIChpc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgU1dULkZvY3VzSW46IHsKLSAgICAgIGlmIChoYXNGb2N1cykgcmV0dXJuOwotICAgICAgaWYgKGdldEVkaXRhYmxlICgpKSB0ZXh0LnNlbGVjdEFsbCAoKTsKLSAgICAgIGhhc0ZvY3VzID0gdHJ1ZTsKLSAgICAgIFNoZWxsIHNoZWxsID0gZ2V0U2hlbGwgKCk7Ci0gICAgICBzaGVsbC5yZW1vdmVMaXN0ZW5lciAoU1dULkRlYWN0aXZhdGUsIGxpc3RlbmVyKTsKLSAgICAgIHNoZWxsLmFkZExpc3RlbmVyIChTV1QuRGVhY3RpdmF0ZSwgbGlzdGVuZXIpOwotICAgICAgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSAoKTsKLSAgICAgIGRpc3BsYXkucmVtb3ZlRmlsdGVyIChTV1QuRm9jdXNJbiwgZmlsdGVyKTsKLSAgICAgIGRpc3BsYXkuYWRkRmlsdGVyIChTV1QuRm9jdXNJbiwgZmlsdGVyKTsKLSAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5Gb2N1c0luLCBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNXVC5Gb2N1c091dDogewotICAgICAgaWYgKCFoYXNGb2N1cykgcmV0dXJuOwotICAgICAgQ29udHJvbCBmb2N1c0NvbnRyb2wgPSBnZXREaXNwbGF5ICgpLmdldEZvY3VzQ29udHJvbCAoKTsKLSAgICAgIGlmIChmb2N1c0NvbnRyb2wgPT0gYXJyb3cgfHwgZm9jdXNDb250cm9sID09IGxpc3QgfHwgZm9jdXNDb250cm9sID09IHRleHQpIHJldHVybjsKLSAgICAgIGhhc0ZvY3VzID0gZmFsc2U7Ci0gICAgICBTaGVsbCBzaGVsbCA9IGdldFNoZWxsICgpOwotICAgICAgc2hlbGwucmVtb3ZlTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGxpc3RlbmVyKTsKLSAgICAgIERpc3BsYXkgZGlzcGxheSA9IGdldERpc3BsYXkgKCk7Ci0gICAgICBkaXNwbGF5LnJlbW92ZUZpbHRlciAoU1dULkZvY3VzSW4sIGZpbHRlcik7Ci0gICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgbm90aWZ5TGlzdGVuZXJzIChTV1QuRm9jdXNPdXQsIGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0vKioKLSAqIFNlYXJjaGVzIHRoZSByZWNlaXZlcidzIGxpc3Qgc3RhcnRpbmcgYXQgdGhlIGZpcnN0IGl0ZW0KLSAqIChpbmRleCAwKSB1bnRpbCBhbiBpdGVtIGlzIGZvdW5kIHRoYXQgaXMgZXF1YWwgdG8gdGhlIAotICogYXJndW1lbnQsIGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGF0IGl0ZW0uIElmIG5vIGl0ZW0KLSAqIGlzIGZvdW5kLCByZXR1cm5zIC0xLgotICoKLSAqIEBwYXJhbSBzdHJpbmcgdGhlIHNlYXJjaCBpdGVtCi0gKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgaXRlbQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHN0cmluZyBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGluZGV4T2YgKFN0cmluZyBzdHJpbmcpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIGlmIChzdHJpbmcgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gIHJldHVybiBsaXN0LmluZGV4T2YgKHN0cmluZyk7Ci19Ci0vKioKLSAqIFNlYXJjaGVzIHRoZSByZWNlaXZlcidzIGxpc3Qgc3RhcnRpbmcgYXQgdGhlIGdpdmVuLCAKLSAqIHplcm8tcmVsYXRpdmUgaW5kZXggdW50aWwgYW4gaXRlbSBpcyBmb3VuZCB0aGF0IGlzIGVxdWFsCi0gKiB0byB0aGUgYXJndW1lbnQsIGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGF0IGl0ZW0uIElmCi0gKiBubyBpdGVtIGlzIGZvdW5kIG9yIHRoZSBzdGFydGluZyBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsCi0gKiByZXR1cm5zIC0xLgotICoKLSAqIEBwYXJhbSBzdHJpbmcgdGhlIHNlYXJjaCBpdGVtCi0gKiBAcGFyYW0gc3RhcnQgdGhlIHplcm8tcmVsYXRpdmUgaW5kZXggYXQgd2hpY2ggdG8gYmVnaW4gdGhlIHNlYXJjaAotICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGl0ZW0KLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBzdHJpbmcgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGludCBpbmRleE9mIChTdHJpbmcgc3RyaW5nLCBpbnQgc3RhcnQpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIGlmIChzdHJpbmcgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gIHJldHVybiBsaXN0LmluZGV4T2YgKHN0cmluZywgc3RhcnQpOwotfQotCi12b2lkIGluaXRBY2Nlc3NpYmxlKCkgewotICBBY2Nlc3NpYmxlQWRhcHRlciBhY2Nlc3NpYmxlQWRhcHRlciA9IG5ldyBBY2Nlc3NpYmxlQWRhcHRlciAoKSB7Ci0gICAgcHVibGljIHZvaWQgZ2V0TmFtZSAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLSAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICAgIExhYmVsIGxhYmVsID0gZ2V0QXNzb2NpYXRlZExhYmVsICgpOwotICAgICAgaWYgKGxhYmVsICE9IG51bGwpIHsKLSAgICAgICAgbmFtZSA9IHN0cmlwTW5lbW9uaWMgKGxhYmVsLmdldFRleHQoKSk7Ci0gICAgICB9Ci0gICAgICBlLnJlc3VsdCA9IG5hbWU7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGdldEtleWJvYXJkU2hvcnRjdXQoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLSAgICAgIFN0cmluZyBzaG9ydGN1dCA9IG51bGw7Ci0gICAgICBMYWJlbCBsYWJlbCA9IGdldEFzc29jaWF0ZWRMYWJlbCAoKTsKLSAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gbGFiZWwuZ2V0VGV4dCAoKTsKLSAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewotICAgICAgICAgIGNoYXIgbW5lbW9uaWMgPSBfZmluZE1uZW1vbmljICh0ZXh0KTsKLSAgICAgICAgICBpZiAobW5lbW9uaWMgIT0gJ1wwJykgewotICAgICAgICAgICAgc2hvcnRjdXQgPSAiQWx0KyIrbW5lbW9uaWM7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGUucmVzdWx0ID0gc2hvcnRjdXQ7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGdldEhlbHAgKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0gICAgICBlLnJlc3VsdCA9IGdldFRvb2xUaXBUZXh0ICgpOwotICAgIH0KLSAgfTsKLSAgZ2V0QWNjZXNzaWJsZSAoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIgKGFjY2Vzc2libGVBZGFwdGVyKTsKLSAgdGV4dC5nZXRBY2Nlc3NpYmxlICgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lciAoYWNjZXNzaWJsZUFkYXB0ZXIpOwotICBsaXN0LmdldEFjY2Vzc2libGUgKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyIChhY2Nlc3NpYmxlQWRhcHRlcik7Ci0gIAotICBhcnJvdy5nZXRBY2Nlc3NpYmxlICgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lciAobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgewotICAgIHB1YmxpYyB2b2lkIGdldE5hbWUgKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0gICAgICBlLnJlc3VsdCA9IGlzRHJvcHBlZCAoKSA/IFNXVC5nZXRNZXNzYWdlICgiU1dUX0Nsb3NlIikgOiBTV1QuZ2V0TWVzc2FnZSAoIlNXVF9PcGVuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBnZXRLZXlib2FyZFNob3J0Y3V0IChBY2Nlc3NpYmxlRXZlbnQgZSkgewotICAgICAgZS5yZXN1bHQgPSAiQWx0K0Rvd24gQXJyb3ciOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHB1YmxpYyB2b2lkIGdldEhlbHAgKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0gICAgICBlLnJlc3VsdCA9IGdldFRvb2xUaXBUZXh0ICgpOwotICAgIH0KLSAgfSk7Ci0KLSAgZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVUZXh0TGlzdGVuZXIgKG5ldyBBY2Nlc3NpYmxlVGV4dEFkYXB0ZXIoKSB7Ci0gICAgcHVibGljIHZvaWQgZ2V0Q2FyZXRPZmZzZXQgKEFjY2Vzc2libGVUZXh0RXZlbnQgZSkgewotICAgICAgZS5vZmZzZXQgPSB0ZXh0LmdldENhcmV0UG9zaXRpb24gKCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGdldFNlbGVjdGlvblJhbmdlKEFjY2Vzc2libGVUZXh0RXZlbnQgZSkgewotICAgICAgUG9pbnQgc2VsID0gdGV4dC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIGUub2Zmc2V0ID0gc2VsLng7Ci0gICAgICBlLmxlbmd0aCA9IHNlbC55IC0gc2VsLng7Ci0gICAgfQotICB9KTsKLSAgCi0gIGdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIChuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgewotICAgIHB1YmxpYyB2b2lkIGdldENoaWxkQXRQb2ludCAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0gICAgICBQb2ludCB0ZXN0UG9pbnQgPSB0b0NvbnRyb2wgKGUueCwgZS55KTsKLSAgICAgIGlmIChnZXRCb3VuZHMgKCkuY29udGFpbnMgKHRlc3RQb2ludCkpIHsKLSAgICAgICAgZS5jaGlsZElEID0gQUNDLkNISUxESURfU0VMRjsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZ2V0TG9jYXRpb24gKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotICAgICAgUmVjdGFuZ2xlIGxvY2F0aW9uID0gZ2V0Qm91bmRzICgpOwotICAgICAgUG9pbnQgcHQgPSB0b0Rpc3BsYXkgKGxvY2F0aW9uLngsIGxvY2F0aW9uLnkpOwotICAgICAgZS54ID0gcHQueDsKLSAgICAgIGUueSA9IHB0Lnk7Ci0gICAgICBlLndpZHRoID0gbG9jYXRpb24ud2lkdGg7Ci0gICAgICBlLmhlaWdodCA9IGxvY2F0aW9uLmhlaWdodDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZ2V0Q2hpbGRDb3VudCAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0gICAgICBlLmRldGFpbCA9IDA7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGdldFJvbGUgKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotICAgICAgZS5kZXRhaWwgPSBBQ0MuUk9MRV9DT01CT0JPWDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZ2V0U3RhdGUgKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotICAgICAgZS5kZXRhaWwgPSBBQ0MuU1RBVEVfTk9STUFMOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdldFZhbHVlIChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgIGUucmVzdWx0ID0gZ2V0VGV4dCAoKTsKLSAgICB9Ci0gIH0pOwotCi0gIHRleHQuZ2V0QWNjZXNzaWJsZSAoKS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIChuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyICgpIHsKLSAgICBwdWJsaWMgdm9pZCBnZXRSb2xlIChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgIGUuZGV0YWlsID0gdGV4dC5nZXRFZGl0YWJsZSAoKSA/IEFDQy5ST0xFX1RFWFQgOiBBQ0MuUk9MRV9MQUJFTDsKLSAgICB9Ci0gIH0pOwotCi0gIGFycm93LmdldEFjY2Vzc2libGUgKCkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciAobmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlcigpIHsKLSAgICBwdWJsaWMgdm9pZCBnZXREZWZhdWx0QWN0aW9uIChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgIGUucmVzdWx0ID0gaXNEcm9wcGVkICgpID8gU1dULmdldE1lc3NhZ2UgKCJTV1RfQ2xvc2UiKSA6IFNXVC5nZXRNZXNzYWdlICgiU1dUX09wZW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICB9KTsKLX0KLWJvb2xlYW4gaXNEcm9wcGVkICgpIHsKLSAgcmV0dXJuIHBvcHVwLmdldFZpc2libGUgKCk7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQ29udHJvbCAoKSB7Ci0gIGNoZWNrV2lkZ2V0KCk7Ci0gIGlmICh0ZXh0LmlzRm9jdXNDb250cm9sICgpIHx8IGFycm93LmlzRm9jdXNDb250cm9sICgpIHx8IGxpc3QuaXNGb2N1c0NvbnRyb2wgKCkgfHwgcG9wdXAuaXNGb2N1c0NvbnRyb2wgKCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSAKLSAgcmV0dXJuIHN1cGVyLmlzRm9jdXNDb250cm9sICgpOwotfQotdm9pZCBpbnRlcm5hbExheW91dCAoYm9vbGVhbiBjaGFuZ2VkKSB7Ci0gIGlmIChpc0Ryb3BwZWQgKCkpIGRyb3BEb3duIChmYWxzZSk7Ci0gIFJlY3RhbmdsZSByZWN0ID0gZ2V0Q2xpZW50QXJlYSAoKTsKLSAgaW50IHdpZHRoID0gcmVjdC53aWR0aDsKLSAgaW50IGhlaWdodCA9IHJlY3QuaGVpZ2h0OwotICAvLyBQb2ludCBhcnJvd1NpemUgPSBhcnJvdy5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIGhlaWdodCwgY2hhbmdlZCk7Ci0gIC8vIHRleHQuc2V0Qm91bmRzICgwLCAwLCB3aWR0aCAtIGFycm93U2l6ZS54LCBoZWlnaHQpOwotICB0ZXh0LnNldEJvdW5kcyAoMCwgMCwgd2lkdGggLSAxNiwgaGVpZ2h0KTsKLSAgLy8gYXJyb3cuc2V0Qm91bmRzICh3aWR0aCAtIGFycm93U2l6ZS54LCAwLCBhcnJvd1NpemUueCwgYXJyb3dTaXplLnkpOwotICBhcnJvdy5zZXRCb3VuZHMgKHdpZHRoIC0gMTYsIDAsIDE2LCAxNik7Ci19Ci12b2lkIGxpc3RFdmVudCAoRXZlbnQgZXZlbnQpIHsKLSAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgY2FzZSBTV1QuRGlzcG9zZToKLSAgICAgIGlmIChnZXRTaGVsbCAoKSAhPSBwb3B1cC5nZXRQYXJlbnQgKCkpIHsKLSAgICAgICAgU3RyaW5nW10gaXRlbXMgPSBsaXN0LmdldEl0ZW1zICgpOwotICAgICAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4ICgpOwotICAgICAgICBwb3B1cCA9IG51bGw7Ci0gICAgICAgIGxpc3QgPSBudWxsOwotICAgICAgICBjcmVhdGVQb3B1cCAoaXRlbXMsIHNlbGVjdGlvbkluZGV4KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1dULkZvY3VzSW46IHsKLSAgICAgIGhhbmRsZUZvY3VzIChTV1QuRm9jdXNJbik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuTW91c2VVcDogewotICAgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0gICAgICBkcm9wRG93biAoZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgU1dULlNlbGVjdGlvbjogewotICAgICAgaW50IGluZGV4ID0gbGlzdC5nZXRTZWxlY3Rpb25JbmRleCAoKTsKLSAgICAgIGlmIChpbmRleCA9PSAtMSkgcmV0dXJuOwotICAgICAgdGV4dC5zZXRUZXh0IChsaXN0LmdldEl0ZW0gKGluZGV4KSk7Ci0gICAgICB0ZXh0LnNlbGVjdEFsbCAoKTsKLSAgICAgIGxpc3Quc2V0U2VsZWN0aW9uIChpbmRleCk7Ci0gICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgZS50aW1lID0gZXZlbnQudGltZTsKLSAgICAgIGUuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotICAgICAgZS5kb2l0ID0gZXZlbnQuZG9pdDsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULlNlbGVjdGlvbiwgZSk7Ci0gICAgICBldmVudC5kb2l0ID0gZS5kb2l0OwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgU1dULlRyYXZlcnNlOiB7Ci0gICAgICBzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0gICAgICAgIGNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRToKLSAgICAgICAgY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVM6Ci0gICAgICAgIGNhc2UgU1dULlRSQVZFUlNFX0FSUk9XX05FWFQ6Ci0gICAgICAgICAgZXZlbnQuZG9pdCA9IGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLSAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICBlLmRldGFpbCA9IGV2ZW50LmRldGFpbDsKLSAgICAgIGUuZG9pdCA9IGV2ZW50LmRvaXQ7Ci0gICAgICBlLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLSAgICAgIGUua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5UcmF2ZXJzZSwgZSk7Ci0gICAgICBldmVudC5kb2l0ID0gZS5kb2l0OwotICAgICAgZXZlbnQuZGV0YWlsID0gZS5kZXRhaWw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuS2V5VXA6IHsgICAKLSAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgZS5jaGFyYWN0ZXIgPSBldmVudC5jaGFyYWN0ZXI7Ci0gICAgICBlLmtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotICAgICAgZS5zdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5LZXlVcCwgZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuS2V5RG93bjogewotICAgICAgaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuRVNDKSB7IAotICAgICAgICAvLyBFc2NhcGUga2V5IGNhbmNlbHMgcG9wdXAgbGlzdAotICAgICAgICBkcm9wRG93biAoZmFsc2UpOwotICAgICAgfQotICAgICAgaWYgKChldmVudC5zdGF0ZU1hc2sgJiBTV1QuQUxUKSAhPSAwICYmIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19VUCB8fCBldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19ET1dOKSkgewotICAgICAgICBkcm9wRG93biAoZmFsc2UpOwotICAgICAgfQotICAgICAgaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLSAgICAgICAgLy8gRW50ZXIgY2F1c2VzIGRlZmF1bHQgc2VsZWN0aW9uCi0gICAgICAgIGRyb3BEb3duIChmYWxzZSk7Ci0gICAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICAgIGUuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotICAgICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBlKTsKLSAgICAgIH0KLSAgICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHdpZGdldCBtYXkgaGF2ZSBiZWVuIGRpc3Bvc2VkLgotICAgICAgLy8gSWYgc28sIGRvIG5vdCBjb250aW51ZS4KLSAgICAgIGlmIChpc0Rpc3Bvc2VkICgpKSBicmVhazsKLSAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLSAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICBlLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLSAgICAgIGUua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0gICAgICBlLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyhTV1QuS2V5RG93biwgZSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIH0KLSAgfQotfQotCi12b2lkIHBvcHVwRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgY2FzZSBTV1QuUGFpbnQ6Ci0gICAgICAvLyBkcmF3IGJsYWNrIHJlY3RhbmdsZSBhcm91bmQgbGlzdAotICAgICAgUmVjdGFuZ2xlIGxpc3RSZWN0ID0gbGlzdC5nZXRCb3VuZHMoKTsKLSAgICAgIENvbG9yIGJsYWNrID0gZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSyk7Ci0gICAgICBldmVudC5nYy5zZXRGb3JlZ3JvdW5kKGJsYWNrKTsKLSAgICAgIGV2ZW50LmdjLmRyYXdSZWN0YW5nbGUoMCwgMCwgbGlzdFJlY3Qud2lkdGggKyAxLCBsaXN0UmVjdC5oZWlnaHQgKyAxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1dULkNsb3NlOgotICAgICAgZXZlbnQuZG9pdCA9IGZhbHNlOwotICAgICAgZHJvcERvd24gKGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1dULkRlYWN0aXZhdGU6Ci0gICAgICBkcm9wRG93biAoZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLXB1YmxpYyB2b2lkIHJlZHJhdyAoKSB7Ci0gIHN1cGVyLnJlZHJhdygpOwotICB0ZXh0LnJlZHJhdygpOwotICBhcnJvdy5yZWRyYXcoKTsKLSAgaWYgKHBvcHVwLmlzVmlzaWJsZSgpKSBsaXN0LnJlZHJhdygpOwotfQotcHVibGljIHZvaWQgcmVkcmF3IChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiBhbGwpIHsKLSAgc3VwZXIucmVkcmF3KHgsIHksIHdpZHRoLCBoZWlnaHQsIHRydWUpOwotfQotCi0vKioKLSAqIFJlbW92ZXMgdGhlIGl0ZW0gZnJvbSB0aGUgcmVjZWl2ZXIncyBsaXN0IGF0IHRoZSBnaXZlbgotICogemVyby1yZWxhdGl2ZSBpbmRleC4KLSAqCi0gKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IGZvciB0aGUgaXRlbQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX1JBTkdFIC0gaWYgdGhlIGluZGV4IGlzIG5vdCBiZXR3ZWVuIDAgYW5kIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgbWludXMgMSAoaW5jbHVzaXZlKTwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgcmVtb3ZlIChpbnQgaW5kZXgpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgbGlzdC5yZW1vdmUgKGluZGV4KTsKLX0KLS8qKgotICogUmVtb3ZlcyB0aGUgaXRlbXMgZnJvbSB0aGUgcmVjZWl2ZXIncyBsaXN0IHdoaWNoIGFyZQotICogYmV0d2VlbiB0aGUgZ2l2ZW4gemVyby1yZWxhdGl2ZSBzdGFydCBhbmQgZW5kIAotICogaW5kaWNlcyAoaW5jbHVzaXZlKS4KLSAqCi0gKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZQotICogQHBhcmFtIGVuZCB0aGUgZW5kIG9mIHRoZSByYW5nZQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX1JBTkdFIC0gaWYgZWl0aGVyIHRoZSBzdGFydCBvciBlbmQgYXJlIG5vdCBiZXR3ZWVuIDAgYW5kIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgbWludXMgMSAoaW5jbHVzaXZlKTwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgcmVtb3ZlIChpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgbGlzdC5yZW1vdmUgKHN0YXJ0LCBlbmQpOwotfQotLyoqCi0gKiBTZWFyY2hlcyB0aGUgcmVjZWl2ZXIncyBsaXN0IHN0YXJ0aW5nIGF0IHRoZSBmaXJzdCBpdGVtCi0gKiB1bnRpbCBhbiBpdGVtIGlzIGZvdW5kIHRoYXQgaXMgZXF1YWwgdG8gdGhlIGFyZ3VtZW50LCAKLSAqIGFuZCByZW1vdmVzIHRoYXQgaXRlbSBmcm9tIHRoZSBsaXN0LgotICoKLSAqIEBwYXJhbSBzdHJpbmcgdGhlIGl0ZW0gdG8gcmVtb3ZlCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG5vdCBmb3VuZCBpbiB0aGUgbGlzdDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgcmVtb3ZlIChTdHJpbmcgc3RyaW5nKSB7Ci0gIGNoZWNrV2lkZ2V0KCk7Ci0gIGlmIChzdHJpbmcgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gIGxpc3QucmVtb3ZlIChzdHJpbmcpOwotfQotLyoqCi0gKiBSZW1vdmVzIGFsbCBvZiB0aGUgaXRlbXMgZnJvbSB0aGUgcmVjZWl2ZXIncyBsaXN0IGFuZCBjbGVhciB0aGUKLSAqIGNvbnRlbnRzIG9mIHJlY2VpdmVyJ3MgdGV4dCBmaWVsZC4KLSAqIDxwPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgcmVtb3ZlQWxsICgpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgdGV4dC5zZXRUZXh0ICgiIik7IC8vJE5PTi1OTFMtMSQKLSAgbGlzdC5yZW1vdmVBbGwgKCk7Ci19Ci0vKioKLSAqIFJlbW92ZXMgdGhlIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsCi0gKiBiZSBub3RpZmllZCB3aGVuIHRoZSByZWNlaXZlcidzIHRleHQgaXMgbW9kaWZpZWQuCi0gKgotICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqCi0gKiBAc2VlIE1vZGlmeUxpc3RlbmVyCi0gKiBAc2VlICNhZGRNb2RpZnlMaXN0ZW5lcgotICovCi1wdWJsaWMgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lciAoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgaWYgKGxpc3RlbmVyID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICByZW1vdmVMaXN0ZW5lcihTV1QuTW9kaWZ5LCBsaXN0ZW5lcik7IAotfQotLyoqCi0gKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbAotICogYmUgbm90aWZpZWQgd2hlbiB0aGUgcmVjZWl2ZXIncyBzZWxlY3Rpb24gY2hhbmdlcy4KLSAqCi0gKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgU2VsZWN0aW9uTGlzdGVuZXIKLSAqIEBzZWUgI2FkZFNlbGVjdGlvbkxpc3RlbmVyCi0gKi8KLXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyIChTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICBjaGVja1dpZGdldCgpOwotICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gIHJlbW92ZUxpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLSAgcmVtb3ZlTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sbGlzdGVuZXIpOyAgCi19Ci0vKioKLSAqIFNlbGVjdHMgdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIHplcm8tcmVsYXRpdmUgaW5kZXggaW4gdGhlIHJlY2VpdmVyJ3MgCi0gKiBsaXN0LiAgSWYgdGhlIGl0ZW0gYXQgdGhlIGluZGV4IHdhcyBhbHJlYWR5IHNlbGVjdGVkLCBpdCByZW1haW5zCi0gKiBzZWxlY3RlZC4gSW5kaWNlcyB0aGF0IGFyZSBvdXQgb2YgcmFuZ2UgYXJlIGlnbm9yZWQuCi0gKgotICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBzZWxlY3QKLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZWxlY3QgKGludCBpbmRleCkgewotICBjaGVja1dpZGdldCgpOwotICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICBsaXN0LmRlc2VsZWN0QWxsICgpOwotICAgIHRleHQuc2V0VGV4dCAoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgcmV0dXJuOwotICB9Ci0gIGlmICgwIDw9IGluZGV4ICYmIGluZGV4IDwgbGlzdC5nZXRJdGVtQ291bnQoKSkgewotICAgIGlmIChpbmRleCAhPSBnZXRTZWxlY3Rpb25JbmRleCgpKSB7Ci0gICAgICB0ZXh0LnNldFRleHQgKGxpc3QuZ2V0SXRlbSAoaW5kZXgpKTsKLSAgICAgIHRleHQuc2VsZWN0QWxsICgpOwotICAgICAgbGlzdC5zZWxlY3QgKGluZGV4KTsKLSAgICAgIGxpc3Quc2hvd1NlbGVjdGlvbiAoKTsKLSAgICB9Ci0gIH0KLX0KLXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQgKENvbG9yIGNvbG9yKSB7Ci0gIHN1cGVyLnNldEJhY2tncm91bmQoY29sb3IpOwotICBiYWNrZ3JvdW5kID0gY29sb3I7Ci0gIGlmICh0ZXh0ICE9IG51bGwpIHRleHQuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0gIGlmIChsaXN0ICE9IG51bGwpIGxpc3Quc2V0QmFja2dyb3VuZChjb2xvcik7Ci0gIGlmIChhcnJvdyAhPSBudWxsKSBhcnJvdy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLX0KLS8qKgotICogU2V0cyB0aGUgZWRpdGFibGUgc3RhdGUuCi0gKgotICogQHBhcmFtIGVkaXRhYmxlIHRoZSBuZXcgZWRpdGFibGUgc3RhdGUKLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlIChib29sZWFuIGVkaXRhYmxlKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICB0ZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLX0KLXB1YmxpYyB2b2lkIHNldEVuYWJsZWQgKGJvb2xlYW4gZW5hYmxlZCkgewotICBzdXBlci5zZXRFbmFibGVkKGVuYWJsZWQpOwotICBpZiAocG9wdXAgIT0gbnVsbCkgcG9wdXAuc2V0VmlzaWJsZSAoZmFsc2UpOwotICBpZiAodGV4dCAhPSBudWxsKSB0ZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gIGlmIChhcnJvdyAhPSBudWxsKSBhcnJvdy5zZXRFbmFibGVkKGVuYWJsZWQpOwotfQotcHVibGljIGJvb2xlYW4gc2V0Rm9jdXMgKCkgewotICBjaGVja1dpZGdldCgpOwotICByZXR1cm4gdGV4dC5zZXRGb2N1cyAoKTsKLX0KLXB1YmxpYyB2b2lkIHNldEZvbnQgKEZvbnQgZm9udCkgewotICBzdXBlci5zZXRGb250IChmb250KTsKLSAgdGhpcy5mb250ID0gZm9udDsKLSAgdGV4dC5zZXRGb250IChmb250KTsKLSAgbGlzdC5zZXRGb250IChmb250KTsKLSAgaW50ZXJuYWxMYXlvdXQgKHRydWUpOwotfQotcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZCAoQ29sb3IgY29sb3IpIHsKLSAgc3VwZXIuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0gIGZvcmVncm91bmQgPSBjb2xvcjsKLSAgaWYgKHRleHQgIT0gbnVsbCkgdGV4dC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLSAgaWYgKGxpc3QgIT0gbnVsbCkgbGlzdC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLSAgaWYgKGFycm93ICE9IG51bGwpIGFycm93LnNldEZvcmVncm91bmQoY29sb3IpOwotfQotLyoqCi0gKiBTZXRzIHRoZSB0ZXh0IG9mIHRoZSBpdGVtIGluIHRoZSByZWNlaXZlcidzIGxpc3QgYXQgdGhlIGdpdmVuCi0gKiB6ZXJvLXJlbGF0aXZlIGluZGV4IHRvIHRoZSBzdHJpbmcgYXJndW1lbnQuIFRoaXMgaXMgZXF1aXZhbGVudAotICogdG8gPGNvZGU+cmVtb3ZlPC9jb2RlPidpbmcgdGhlIG9sZCBpdGVtIGF0IHRoZSBpbmRleCwgYW5kIHRoZW4KLSAqIDxjb2RlPmFkZDwvY29kZT4naW5nIHRoZSBuZXcgaXRlbSBhdCB0aGF0IGluZGV4LgotICoKLSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggZm9yIHRoZSBpdGVtCi0gKiBAcGFyYW0gc3RyaW5nIHRoZSBuZXcgdGV4dCBmb3IgdGhlIGl0ZW0KLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9SQU5HRSAtIGlmIHRoZSBpbmRleCBpcyBub3QgYmV0d2VlbiAwIGFuZCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IG1pbnVzIDEgKGluY2x1c2l2ZSk8L2xpPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldEl0ZW0gKGludCBpbmRleCwgU3RyaW5nIHN0cmluZykgewotICBjaGVja1dpZGdldCgpOwotICBsaXN0LnNldEl0ZW0gKGluZGV4LCBzdHJpbmcpOwotfQotLyoqCi0gKiBTZXRzIHRoZSByZWNlaXZlcidzIGxpc3QgdG8gYmUgdGhlIGdpdmVuIGFycmF5IG9mIGl0ZW1zLgotICoKLSAqIEBwYXJhbSBpdGVtcyB0aGUgYXJyYXkgb2YgaXRlbXMKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBpdGVtcyBhcnJheSBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgYW4gaXRlbSBpbiB0aGUgaXRlbXMgYXJyYXkgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0SXRlbXMgKFN0cmluZyBbXSBpdGVtcykgewotICBjaGVja1dpZGdldCAoKTsKLSAgbGlzdC5zZXRJdGVtcyAoaXRlbXMpOwotICBpZiAoIXRleHQuZ2V0RWRpdGFibGUgKCkpIHRleHQuc2V0VGV4dCAoIiIpOyAvLyROT04tTkxTLTEkCi19Ci0vKioKLSAqIFNldHMgdGhlIGxheW91dCB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmVyIHRvIGJlCi0gKiB0aGUgYXJndW1lbnQgd2hpY2ggbWF5IGJlIG51bGwuCi0gKiA8cD4KLSAqIE5vdGU6IE5vIExheW91dCBjYW4gYmUgc2V0IG9uIHRoaXMgQ29udHJvbCBiZWNhdXNlIGl0IGFscmVhZHkKLSAqIG1hbmFnZXMgdGhlIHNpemUgYW5kIHBvc2l0aW9uIG9mIGl0cyBjaGlsZHJlbi4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gbGF5b3V0IHRoZSByZWNlaXZlcidzIG5ldyBsYXlvdXQgb3IgbnVsbAotICoKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldExheW91dCAoTGF5b3V0IGxheW91dCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuOwotfQotcHVibGljIHZvaWQgc2V0TWVudShNZW51IG1lbnUpIHsKLSAgdGV4dC5zZXRNZW51KG1lbnUpOwotfQotLyoqCi0gKiBTZXRzIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHJlY2VpdmVyJ3MgdGV4dCBmaWVsZCB0byB0aGUKLSAqIHJhbmdlIHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnQgd2hvc2UgeCBjb29yZGluYXRlIGlzIHRoZQotICogc3RhcnQgb2YgdGhlIHNlbGVjdGlvbiBhbmQgd2hvc2UgeSBjb29yZGluYXRlIGlzIHRoZSBlbmQKLSAqIG9mIHRoZSBzZWxlY3Rpb24uIAotICoKLSAqIEBwYXJhbSBzZWxlY3Rpb24gYSBwb2ludCByZXByZXNlbnRpbmcgdGhlIG5ldyBzZWxlY3Rpb24gc3RhcnQgYW5kIGVuZAotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHBvaW50IGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbiAoUG9pbnQgc2VsZWN0aW9uKSB7Ci0gIGNoZWNrV2lkZ2V0KCk7Ci0gIGlmIChzZWxlY3Rpb24gPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gIHRleHQuc2V0U2VsZWN0aW9uIChzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnkpOwotfQotCi0vKioKLSAqIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWNlaXZlcidzIHRleHQgZmllbGQgdG8gdGhlCi0gKiBnaXZlbiBzdHJpbmcuCi0gKiA8cD4KLSAqIE5vdGU6IFRoZSB0ZXh0IGZpZWxkIGluIGEgPGNvZGU+Q29tYm88L2NvZGU+IGlzIHR5cGljYWxseQotICogb25seSBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgYSBzaW5nbGUgbGluZSBvZiB0ZXh0LiBUaHVzLAotICogc2V0dGluZyB0aGUgdGV4dCB0byBhIHN0cmluZyBjb250YWluaW5nIGxpbmUgYnJlYWtzIG9yCi0gKiBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgd2lsbCBwcm9iYWJseSBjYXVzZSBpdCB0byAKLSAqIGRpc3BsYXkgaW5jb3JyZWN0bHkuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHN0cmluZyB0aGUgbmV3IHRleHQKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBzdHJpbmcgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0VGV4dCAoU3RyaW5nIHN0cmluZykgewotICBjaGVja1dpZGdldCgpOwotICBpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICBpbnQgaW5kZXggPSBsaXN0LmluZGV4T2YgKHN0cmluZyk7Ci0gIGlmIChpbmRleCA9PSAtMSkgewotICAgIGxpc3QuZGVzZWxlY3RBbGwgKCk7Ci0gICAgdGV4dC5zZXRUZXh0IChzdHJpbmcpOwotICAgIHJldHVybjsKLSAgfQotICB0ZXh0LnNldFRleHQgKHN0cmluZyk7Ci0gIHRleHQuc2VsZWN0QWxsICgpOwotICBsaXN0LnNldFNlbGVjdGlvbiAoaW5kZXgpOwotICBsaXN0LnNob3dTZWxlY3Rpb24gKCk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB0aGUgcmVjZWl2ZXIncwotICogdGV4dCBmaWVsZCBpcyBjYXBhYmxlIG9mIGhvbGRpbmcgdG8gYmUgdGhlIGFyZ3VtZW50LgotICoKLSAqIEBwYXJhbSBsaW1pdCBuZXcgdGV4dCBsaW1pdAotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9DQU5OT1RfQkVfWkVSTyAtIGlmIHRoZSBsaW1pdCBpcyB6ZXJvPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRUZXh0TGltaXQgKGludCBsaW1pdCkgewotICBjaGVja1dpZGdldCgpOwotICB0ZXh0LnNldFRleHRMaW1pdCAobGltaXQpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRUb29sVGlwVGV4dCAoU3RyaW5nIHN0cmluZykgewotICBjaGVja1dpZGdldCgpOwotICBzdXBlci5zZXRUb29sVGlwVGV4dChzdHJpbmcpOwotICBhcnJvdy5zZXRUb29sVGlwVGV4dCAoc3RyaW5nKTsKLSAgdGV4dC5zZXRUb29sVGlwVGV4dCAoc3RyaW5nKTsgICAKLX0KLQotcHVibGljIHZvaWQgc2V0VmlzaWJsZSAoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0gIGlmICghdmlzaWJsZSkgcG9wdXAuc2V0VmlzaWJsZShmYWxzZSk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGFyZSB2aXNpYmxlIGluIHRoZSBkcm9wCi0gKiBkb3duIHBvcnRpb24gb2YgdGhlIHJlY2VpdmVyJ3MgbGlzdC4KLSAqCi0gKiBAcGFyYW0gY291bnQgdGhlIG5ldyBudW1iZXIgb2YgaXRlbXMgdG8gYmUgdmlzaWJsZQotICoKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIHZvaWQgc2V0VmlzaWJsZUl0ZW1Db3VudCAoaW50IGNvdW50KSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICBpZiAoY291bnQgPCAwKSByZXR1cm47Ci0gIHZpc2libGVJdGVtQ291bnQgPSBjb3VudDsKLX0KLVN0cmluZyBzdHJpcE1uZW1vbmljIChTdHJpbmcgc3RyaW5nKSB7Ci0gIGludCBpbmRleCA9IDA7Ci0gIGludCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoICgpOwotICBkbyB7Ci0gICAgd2hpbGUgKChpbmRleCA8IGxlbmd0aCkgJiYgKHN0cmluZy5jaGFyQXQgKGluZGV4KSAhPSAnJicpKSBpbmRleCsrOwotICAgIGlmICgrK2luZGV4ID49IGxlbmd0aCkgcmV0dXJuIHN0cmluZzsKLSAgICBpZiAoc3RyaW5nLmNoYXJBdCAoaW5kZXgpICE9ICcmJykgewotICAgICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgtMSkgKyBzdHJpbmcuc3Vic3RyaW5nKGluZGV4LCBsZW5ndGgpOwotICAgIH0KLSAgICBpbmRleCsrOwotICB9IHdoaWxlIChpbmRleCA8IGxlbmd0aCk7Ci0gIHJldHVybiBzdHJpbmc7Ci19Ci12b2lkIHRleHRFdmVudCAoRXZlbnQgZXZlbnQpIHsKLSAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgY2FzZSBTV1QuRm9jdXNJbjogewotICAgICAgaGFuZGxlRm9jdXMgKFNXVC5Gb2N1c0luKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNXVC5LZXlEb3duOiB7Ci0gICAgICBpZiAoZXZlbnQuY2hhcmFjdGVyID09IFNXVC5DUikgewotICAgICAgICBkcm9wRG93biAoZmFsc2UpOwotICAgICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgICBlLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJzIChTV1QuRGVmYXVsdFNlbGVjdGlvbiwgZSk7Ci0gICAgICB9Ci0gICAgICAvL0F0IHRoaXMgcG9pbnQgdGhlIHdpZGdldCBtYXkgaGF2ZSBiZWVuIGRpc3Bvc2VkLgotICAgICAgLy8gSWYgc28sIGRvIG5vdCBjb250aW51ZS4KLSAgICAgIGlmIChpc0Rpc3Bvc2VkICgpKSBicmVhazsKLSAgICAgIAotICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX1VQIHx8IGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX0RPV04pIHsKLSAgICAgICAgZXZlbnQuZG9pdCA9IGZhbHNlOwotICAgICAgICBpZiAoKGV2ZW50LnN0YXRlTWFzayAmIFNXVC5BTFQpICE9IDApIHsKLSAgICAgICAgICBib29sZWFuIGRyb3BwZWQgPSBpc0Ryb3BwZWQgKCk7Ci0gICAgICAgICAgdGV4dC5zZWxlY3RBbGwgKCk7Ci0gICAgICAgICAgaWYgKCFkcm9wcGVkKSBzZXRGb2N1cyAoKTsKLSAgICAgICAgICBkcm9wRG93biAoIWRyb3BwZWQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG9sZEluZGV4ID0gZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19VUCkgewotICAgICAgICAgIHNlbGVjdCAoTWF0aC5tYXggKG9sZEluZGV4IC0gMSwgMCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNlbGVjdCAoTWF0aC5taW4gKG9sZEluZGV4ICsgMSwgZ2V0SXRlbUNvdW50ICgpIC0gMSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvbGRJbmRleCAhPSBnZXRTZWxlY3Rpb25JbmRleCAoKSkgewotICAgICAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgICAgIGUuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULlNlbGVjdGlvbiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9BdCB0aGlzIHBvaW50IHRoZSB3aWRnZXQgbWF5IGhhdmUgYmVlbiBkaXNwb3NlZC4KLSAgICAgICAgLy8gSWYgc28sIGRvIG5vdCBjb250aW51ZS4KLSAgICAgICAgaWYgKGlzRGlzcG9zZWQgKCkpIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBGdXJ0aGVyIHdvcmsgOiBOZWVkIHRvIGFkZCBzdXBwb3J0IGZvciBpbmNyZW1lbnRhbCBzZWFyY2ggaW4gCi0gICAgICAvLyBwb3AgdXAgbGlzdCBhcyBjaGFyYWN0ZXJzIHR5cGVkIGluIHRleHQgd2lkZ2V0Ci0gICAgICAgICAgICAKLSAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgZS5jaGFyYWN0ZXIgPSBldmVudC5jaGFyYWN0ZXI7Ci0gICAgICBlLmtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotICAgICAgZS5zdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5LZXlEb3duLCBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNXVC5LZXlVcDogewotICAgICAgRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLSAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICBlLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLSAgICAgIGUua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0gICAgICBlLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULktleVVwLCBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNXVC5NZW51RGV0ZWN0OiB7Ci0gICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgZS50aW1lID0gZXZlbnQudGltZTsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULk1lbnVEZXRlY3QsIGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgU1dULk1vZGlmeTogewotICAgICAgbGlzdC5kZXNlbGVjdEFsbCAoKTsKLSAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgbm90aWZ5TGlzdGVuZXJzIChTV1QuTW9kaWZ5LCBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNXVC5Nb3VzZURvd246IHsKLSAgICAgIGlmIChldmVudC5idXR0b24gIT0gMSkgcmV0dXJuOwotICAgICAgaWYgKHRleHQuZ2V0RWRpdGFibGUgKCkpIHJldHVybjsKLSAgICAgIGJvb2xlYW4gZHJvcHBlZCA9IGlzRHJvcHBlZCAoKTsKLSAgICAgIHRleHQuc2VsZWN0QWxsICgpOwotICAgICAgaWYgKCFkcm9wcGVkKSBzZXRGb2N1cyAoKTsKLSAgICAgIGRyb3BEb3duICghZHJvcHBlZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuTW91c2VVcDogewotICAgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0gICAgICBpZiAodGV4dC5nZXRFZGl0YWJsZSAoKSkgcmV0dXJuOwotICAgICAgdGV4dC5zZWxlY3RBbGwgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuVHJhdmVyc2U6IHsgICAgCi0gICAgICBzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0gICAgICAgIGNhc2UgU1dULlRSQVZFUlNFX0FSUk9XX1BSRVZJT1VTOgotICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9BUlJPV19ORVhUOgotICAgICAgICAgIC8vIFRoZSBlbnRlciBjYXVzZXMgZGVmYXVsdCBzZWxlY3Rpb24gYW5kCi0gICAgICAgICAgLy8gdGhlIGFycm93IGtleXMgYXJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aGUgbGlzdCBjb250ZW50cyBzbwotICAgICAgICAgIC8vIGRvIG5vdCB1c2UgdGhlbSBmb3IgdHJhdmVyc2FsLgotICAgICAgICAgIGV2ZW50LmRvaXQgPSBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLSAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICBlLmRldGFpbCA9IGV2ZW50LmRldGFpbDsKLSAgICAgIGUuZG9pdCA9IGV2ZW50LmRvaXQ7Ci0gICAgICBlLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLSAgICAgIGUua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5UcmF2ZXJzZSwgZSk7Ci0gICAgICBldmVudC5kb2l0ID0gZS5kb2l0OwotICAgICAgZXZlbnQuZGV0YWlsID0gZS5kZXRhaWw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9JQW5ub3RhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vSUFubm90YXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjZkNDM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9JQW5ub3RhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduOwotCi1wdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uUHJvdmlkZXIKLXsKLSAgU3RyaW5nIGdldE5hbWVBbm5vdGF0aW9uU3RyaW5nKCk7Ci0gIFN0cmluZyBnZXROYW1lQW5ub3RhdGlvblRvb2xUaXBTdHJpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9JS2V5Ym9hcmREcmFnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vSUtleWJvYXJkRHJhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTA2OTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9JS2V5Ym9hcmREcmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElLZXlib2FyZERyYWcgewotCi0JcHVibGljIHZvaWQgcGVyZm9ybUtleWJvYXJkRHJhZyAoR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBpbnQgZGlyZWN0aW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0ltYWdlT3ZlcmxheURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9JbWFnZU92ZXJsYXlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMmE2NzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0ltYWdlT3ZlcmxheURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIEltYWdlT3ZlcmxheURlc2NyaXB0b3IgZXh0ZW5kcyBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IKLXsKLSAgcHJvdGVjdGVkIEltYWdlIGJhc2VJbWFnZTsKLSAgcHJvdGVjdGVkIEltYWdlIGV4dGVuc2lvbk92ZXJsYXksIGRpc2FibGVkRXh0ZW5zaW9uT3ZlcmxheTsKLSAgcHJvdGVjdGVkIFBvaW50IGltYWdlU2l6ZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkT25seTsKLSAgCi0gIHB1YmxpYyBJbWFnZU92ZXJsYXlEZXNjcmlwdG9yKEltYWdlIGJhc2VJbWFnZSwgYm9vbGVhbiBpc1JlYWRPbmx5KQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmJhc2VJbWFnZSA9IGJhc2VJbWFnZTsKLSAgICB0aGlzLmlzUmVhZE9ubHkgPSBpc1JlYWRPbmx5OwotICAgIGltYWdlU2l6ZSA9IG5ldyBQb2ludChiYXNlSW1hZ2UuZ2V0Qm91bmRzKCkud2lkdGgsIGJhc2VJbWFnZS5nZXRCb3VuZHMoKS5oZWlnaHQpOwotICAgIGV4dGVuc2lvbk92ZXJsYXkgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib3ZyMTYvZXh0bnNuX292ci5naWYiKTsgIC8vJE5PTi1OTFMtMSQgCi0gICAgZGlzYWJsZWRFeHRlbnNpb25PdmVybGF5ID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm92cjE2L2V4dG5zbmRpc19vdnIuZ2lmIik7ICAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZUltYWdlKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gIHsKLSAgICBkcmF3SW1hZ2UoYmFzZUltYWdlLmdldEltYWdlRGF0YSgpLCAwLCAwKTsKLSAgICBJbWFnZURhdGEgZXh0ZW5zaW9uSW1hZ2VEYXRhOwotICAgIGlmIChpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIGV4dGVuc2lvbkltYWdlRGF0YSA9IGRpc2FibGVkRXh0ZW5zaW9uT3ZlcmxheS5nZXRJbWFnZURhdGEoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGV4dGVuc2lvbkltYWdlRGF0YSA9IGV4dGVuc2lvbk92ZXJsYXkuZ2V0SW1hZ2VEYXRhKCk7Ci0gICAgfQotICAgIGRyYXdJbWFnZSAoZXh0ZW5zaW9uSW1hZ2VEYXRhLCBpbWFnZVNpemUueCAtIGV4dGVuc2lvbkltYWdlRGF0YS53aWR0aCwgMCk7ICAvLyBUb3AgUmlnaHQgY29ybmVyCi0gIH0KLQotICBwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpCi0gIHsKLSAgICByZXR1cm4gaW1hZ2VTaXplOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9BRFRDb21ib0JveENlbGxFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0FEVENvbWJvQm94Q2VsbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTdjN2FlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0FEVENvbWJvQm94Q2VsbEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib0JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlR5cGVkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci0KLS8qCi0gKiBUaGlzIHdyYXBzIHRoZSBDb21ib0JveENlbGxFZGl0b3IuCi0gKiBXZSBuZWVkIHRvIGFwcGx5IGFuZCBkZWFjdGl2YXRlIHRoZSBjb21ibyBvbiBhIHNpbmdsZSBjbGljayAobm90IG9uIGEgZG91YmxlIGNsaWNrIGxpa2UKLSAqIHRoZSBDb21ib0JveENlbGxFZGl0b3IpLgotICovCi1wdWJsaWMgY2xhc3MgQURUQ29tYm9Cb3hDZWxsRWRpdG9yIGV4dGVuZHMgQ29tYm9Cb3hDZWxsRWRpdG9yCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBhZHREZWZhdWx0U3R5bGUgPSBTV1QuTk9ORTsKLQotICAvKioKLSAgICogVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHZhbHVlIHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBjZWxsLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGNvbnRpbnVlQXBwbHk7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc1RyYXZlcnNpbmcgPSBmYWxzZTsKLSAgcHJpdmF0ZSBPYmplY3Qgc2VsZWN0ZWRWYWx1ZTsKLSAgcHJpdmF0ZSBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLSAgCi0gIC8vIFRoaXMgcHJldmVudHMgdGhlIGNlbGwgZWRpdG9yIGZyb20gYmVpbmcgZGVhY3RpdmF0ZWQgd2hpbGUgaGFuZGxpbmcgdGhlIE5ldyBvciBCcm93c2Ugc2VsZWN0aW9uLgotICBwcml2YXRlIGJvb2xlYW4gaXNIYW5kbGluZ1NlbGVjdGlvbiA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGNlbGwgZWRpdG9yIHdpdGggYSBjb21ibyBjb250YWluaW5nIHRoZSBnaXZlbiBsaXN0IG9mIGNob2ljZXMKLSAgICogYW5kIHBhcmVudGVkIHVuZGVyIHRoZSBnaXZlbiBjb250cm9sLiBUaGUgY2VsbCBlZGl0b3IgdmFsdWUgaXMgdGhlCi0gICAqIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGl0ZW0uIEluaXRpYWxseSwgdGhlIGNlbGwgZWRpdG9yIGhhcyBubwotICAgKiBjZWxsIHZhbGlkYXRvciBhbmQgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QgaXMgc2VsZWN0ZWQuCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50Ci0gICAqICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotICAgKiBAcGFyYW0gaXRlbXMKLSAgICogICAgICAgICAgdGhlIGxpc3Qgb2Ygc3RyaW5ncyBmb3IgdGhlIGNvbWJvIGJveAotICAgKi8KLSAgcHVibGljIEFEVENvbWJvQm94Q2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmdbXSBpdGVtcywgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZWRpdE1hbmFnZXIpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIGl0ZW1zLCBhZHREZWZhdWx0U3R5bGUgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICBzZXRJdGVtcyhpdGVtcyk7Ci0gICAgY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgPSBlZGl0TWFuYWdlcjsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZW1vdmVMaXN0ZW5lcnMoQ0NvbWJvIGNvbWJvQm94LCBpbnQgZXZlbnQpCi0gIHsKLSAgICBMaXN0ZW5lciBbXSBsaXN0ZW5lcnMgPSBjb21ib0JveC5nZXRMaXN0ZW5lcnMoZXZlbnQpOwotICAgIGludCBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgTGlzdGVuZXIgbCA9IGxpc3RlbmVyc1tpXTsKLSAgICAgIGlmIChsIGluc3RhbmNlb2YgVHlwZWRMaXN0ZW5lcikKLSAgICAgIHsKLSAgICAgICAgVHlwZWRMaXN0ZW5lciB0eXBlZExpc3RlbmVyID0gKFR5cGVkTGlzdGVuZXIpbDsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGVkTGlzdGVuZXIuZ2V0RXZlbnRMaXN0ZW5lcigpLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpOwotICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlcmUgYXJlIG90aGVyIHR5cGVkIGxpc3RlbmVycyBhZGRlZCB0byB0aGUgQ0NvbWJvLgotICAgICAgICAvLyBDdXJyZW50bHkgdGhlcmUgYXJlIG5vbmUsIGJ1dCBhcyBhbiBleHRyYSBjaGVjaywgSSB3YW50IHRvIGVuc3VyZSAKLSAgICAgICAgLy8gSSdtIHJlbW92aW5nIHRoZSBvbmVzIGFkZGVkIGZyb20gdGhlIGluaGVyaXRlZCBjbGFzcy4KLSAgICAgICAgLy8gSSd2ZSB0ZXN0ZWQgdGhpcyBhbmQgSSBrbm93IGl0IHJlbW92ZXMgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgLy8gb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib0JveENlbGxFZGl0b3IkMgotICAgICAgICAvLyBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Q2VsbEVkaXRvciQ0Ci0gICAgICAgIC8vIHdoaWNoIGFyZSBpbmRlZWQgdGhlIG9uZXMgSSdtIGN1c3RvbWl6aW5nCi0gICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUuY29udGFpbnMoIm9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9Cb3hDZWxsRWRpdG9yIikpCi0gICAgICAgIHsKLSAgICAgICAgICBjb21ib0JveC5yZW1vdmVMaXN0ZW5lcihldmVudCwgbCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIENlbGxFZGl0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDQ29tYm8gY29tYm9Cb3ggPSAoQ0NvbWJvKXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQotICAgIGNvbWJvQm94LnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAvLyBOZWVkIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXJzIGFkZGVkIGZyb20gQ29tYm9Cb3hDZWxsRWRpdG9yCi0gICAgcmVtb3ZlTGlzdGVuZXJzKGNvbWJvQm94LCBTV1QuU2VsZWN0aW9uKTsKLSAgICByZW1vdmVMaXN0ZW5lcnMoY29tYm9Cb3gsIFNXVC5EZWZhdWx0U2VsZWN0aW9uKTsKLSAgICByZW1vdmVMaXN0ZW5lcnMoY29tYm9Cb3gsIFNXVC5Gb2N1c0luKTsKLSAgICByZW1vdmVMaXN0ZW5lcnMoY29tYm9Cb3gsIFNXVC5Gb2N1c091dCk7Ci0gICAgCi0gICAgLy8gTm93IGFkZCBvdXIgY3VzdG9tIGxpc3RlbmVycwotICAgIGNvbWJvQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIC8vIFdhbnQgdGhlIHNhbWUgYmVoYXZpb3VyIHNpbmNlIGhpdHRpbmcgcmV0dXJuIG9uIEJyb3dzZSBvciBOZXcgc2hvdWxkIGxhdW5jaCB0aGUgZGlhbG9ncywKLSAgICAgICAgLy8gYW5kIG5vdCBpbW1lZGlhdGVseSBhcHBseSB0aGUgdmFsdWUKLS8vICAgICAgYXBwbHlFZGl0b3JWYWx1ZUFuZERlYWN0aXZhdGUoKTsKLSAgICAgICAgd2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgY29udGludWVBcHBseSA9IHRydWU7Ci0gICAgICAgIENDb21ibyBjb21ib0JveCA9IGdldENDb21ibygpOwotICAgICAgICBpc0hhbmRsaW5nU2VsZWN0aW9uID0gdHJ1ZTsKLSAgICAgICAgT2JqZWN0IG5ld1ZhbHVlID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGludCBzZWxlY3Rpb24gPSBjb21ib0JveC5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAgIGlmIChpc1RyYXZlcnNpbmcpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXNUcmF2ZXJzaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgU3RyaW5nW10gaXRlbXMgPSBnZXRJdGVtcygpOwotICAgICAgICAgIFN0cmluZyBzdHJpbmdTZWxlY3Rpb24gPSBpdGVtc1tzZWxlY3Rpb25dOwotCi0gICAgICAgICAgaWYgKHN0cmluZ1NlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0NPTUJPX0JST1dTRSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgY29udGludWVBcHBseSA9IHRydWU7Ci0gICAgICAgICAgICBuZXdWYWx1ZSA9IGludm9rZURpYWxvZyhjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5nZXRCcm93c2VEaWFsb2coKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHN0cmluZ1NlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0NPTUJPX05FVykpCi0gICAgICAgICAgewotICAgICAgICAgICAgY29udGludWVBcHBseSA9IHRydWU7Ci0gICAgICAgICAgICBuZXdWYWx1ZSA9IGludm9rZURpYWxvZyhjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5nZXROZXdEaWFsb2coKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGlzSGFuZGxpbmdTZWxlY3Rpb24gPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb250aW51ZUFwcGx5KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG5ld1ZhbHVlID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW50IGluZGV4ID0gY29tYm9Cb3guZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZSA9IGNvbWJvQm94LmdldEl0ZW0oaW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZSA9IG5ld1ZhbHVlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGFwcGx5RWRpdG9yVmFsdWVBbmREZWFjdGl2YXRlKCk7Ci0gICAgICAgICAgZm9jdXNMb3N0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIGNvbWJvQm94LmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfQVJST1dfTkVYVCB8fCBlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVMpCi0gICAgICAgIHsKLSAgICAgICAgICBpc1RyYXZlcnNpbmcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBjb21ib0JveC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIGlmICghaXNIYW5kbGluZ1NlbGVjdGlvbikKLSAgICAgICAgICBBRFRDb21ib0JveENlbGxFZGl0b3IudGhpcy5mb2N1c0xvc3QoKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICByZXR1cm4gY29tYm9Cb3g7Ci0gIH0KLQotICBwcml2YXRlIE9iamVjdCBpbnZva2VEaWFsb2coSUNvbXBvbmVudERpYWxvZyBkaWFsb2cpCi0gIHsKLSAgICBPYmplY3QgbmV3VmFsdWUgPSBudWxsOwotCi0gICAgaWYgKGRpYWxvZyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vZGlhbG9nLnNldEluaXRpYWxDb21wb25lbnQoc2V0T2JqZWN0KTsKLSAgICBpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgewotICAgICAgbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbnRpbnVlQXBwbHkgPSBmYWxzZTsKLSAgICAgIGZvY3VzTG9zdCgpOwotICAgIH0KLQotICAgIHJldHVybiBuZXdWYWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0ZWRWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0ZWRWYWx1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCBDQ29tYm8gZ2V0Q0NvbWJvKCkKLSAgewotICAgIHJldHVybiAoQ0NvbWJvKWdldENvbnRyb2woKTsKLSAgfQotICAKLS8vLy8vLy8vLyBDb21ib0JveCBjZWxsIGVkaXRvciAgCi0KLSAgdm9pZCBhcHBseUVkaXRvclZhbHVlQW5kRGVhY3RpdmF0ZSgpCi0gIHsKLSAgICAvLyBtdXN0IHNldCB0aGUgc2VsZWN0aW9uIGJlZm9yZSBnZXR0aW5nIHZhbHVlCi0gICAgQ0NvbWJvIGNvbWJvQm94ID0gZ2V0Q0NvbWJvKCk7Ci0gICAgU3RyaW5nW10gaXRlbXMgPSBnZXRJdGVtcygpOwotCi0gICAgaW50IHNlbGVjdGlvbiA9IGNvbWJvQm94LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgT2JqZWN0IG5ld1ZhbHVlID0gZG9HZXRWYWx1ZSgpOwotICAgIG1hcmtEaXJ0eSgpOwotICAgIGJvb2xlYW4gaXNWYWxpZCA9IGlzQ29ycmVjdChuZXdWYWx1ZSk7Ci0gICAgc2V0VmFsdWVWYWxpZChpc1ZhbGlkKTsKLQotICAgIGlmICghaXNWYWxpZCkKLSAgICB7Ci0gICAgICAvLyBPbmx5IGZvcm1hdCBpZiB0aGUgJ2luZGV4JyBpcyB2YWxpZAotICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDAgJiYgc2VsZWN0aW9uID49IDAgJiYgc2VsZWN0aW9uIDwgaXRlbXMubGVuZ3RoKQotICAgICAgewotICAgICAgICAvLyB0cnkgdG8gaW5zZXJ0IHRoZSBjdXJyZW50IHZhbHVlIGludG8gdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAgICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRFcnJvck1lc3NhZ2UoKSwgbmV3IE9iamVjdFtdIHsgaXRlbXNbc2VsZWN0aW9uXSB9KSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFNpbmNlIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBpbmRleCwgYXNzdW1lIHdlJ3JlIHVzaW5nIGFuCi0gICAgICAgIC8vICdlZGl0JwotICAgICAgICAvLyBjb21ibyBzbyBmb3JtYXQgdXNpbmcgaXRzIHRleHQgdmFsdWUKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldEVycm9yTWVzc2FnZSgpLCBuZXcgT2JqZWN0W10geyBjb21ib0JveC5nZXRUZXh0KCkgfSkpOwotICAgICAgfQotICAgIH0KLQotICAgIGZpcmVBcHBseUVkaXRvclZhbHVlKCk7Ci0gICAgZGVhY3RpdmF0ZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9BdHRyaWJ1dGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvQXR0cmlidXRlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1ZTI3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9BdHRyaWJ1dGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIgZXh0ZW5kcyBSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcgotewotICBwdWJsaWMgQXR0cmlidXRlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoSUZpZWxkIHBhcmFtZXRlciwgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIExhYmVsIGxhYmVsKQotICB7Ci0gICAgc3VwZXIocGFyYW1ldGVyLCBzb3VyY2UsIGxhYmVsKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpCi0gIHsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciByZXN1bHQgPSBudWxsOwotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgIGlmIChlZGl0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEQXR0cmlidXRlUmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOwotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9Db21ib0JveENlbGxFZGl0b3JNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9Db21ib0JveENlbGxFZGl0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NDBmMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21ib0JveENlbGxFZGl0b3JNYW5hZ2VyIGV4dGVuZHMgRGlyZWN0RWRpdE1hbmFnZXIvLyBpbXBsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZQotewotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0KLSAgcHVibGljIENvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXIoR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBMYWJlbCBsYWJlbCkKLSAgewotICAgIHN1cGVyKHNvdXJjZSwgQ29tYm9Cb3hDZWxsRWRpdG9yLmNsYXNzLCBuZXcgSW50ZXJuYWxDZWxsRWRpdG9yTG9jYXRvcihsYWJlbCkpOwotICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXRDZWxsRWRpdG9yKCkKLSAgewotICAgIFN0cmluZyBpbml0aWFsTGFiZWxUZXh0ID0gbGFiZWwuZ2V0VGV4dCgpOwotCi0gICAgQ0NvbWJvIGNvbWJvID0gKENDb21ibykgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLSAgICBjb21iby5zZXRGb250KGxhYmVsLmdldEZvbnQoKSk7Ci0gICAgY29tYm8uc2V0Rm9yZWdyb3VuZChsYWJlbC5nZXRGb3JlZ3JvdW5kQ29sb3IoKSk7Ci0gICAgY29tYm8uc2V0QmFja2dyb3VuZChsYWJlbC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0gICAgY29tYm8uc2V0VmlzaWJsZUl0ZW1Db3VudCgyMCk7Ci0KLSAgICAvKgotICAgICAqIGNvbWJvLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgeyAvLyBob29rIGtleSBwcmVzc2VkIC0gc2VlIFBSCi0gICAgICogMTQyMDEgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBrZXlFdmVudCkgeyBpZiAoa2V5RXZlbnQuY2hhcmFjdGVyID09Ci0gICAgICogJ3onKSB7IGdldENlbGxFZGl0b3IoKS5hcHBseUVkaXRvclZhbHVlKCk7IH0gfSB9KTsKLSAgICAgKi8KLSAgICBJQ2VsbEVkaXRvckxpc3RlbmVyIGNlbGxFZGl0b3JMaXN0ZW5lciA9IG5ldyBJQ2VsbEVkaXRvckxpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBjYW5jZWxFZGl0b3IoKQotICAgICAgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBhcHBseUVkaXRvclZhbHVlKCkKLSAgICAgIHsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgZWRpdG9yVmFsdWVDaGFuZ2VkKGJvb2xlYW4gb2xkLCBib29sZWFuIG5ld1N0YXRlKQotICAgICAgewotICAgICAgfQotICAgIH07Ci0gICAgZ2V0Q2VsbEVkaXRvcigpLmFkZExpc3RlbmVyKGNlbGxFZGl0b3JMaXN0ZW5lcik7Ci0KLSAgICBTdHJpbmdbXSBpdGVtID0gY29tYm8uZ2V0SXRlbXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGl0ZW1baV0uZXF1YWxzKGluaXRpYWxMYWJlbFRleHQpKQotICAgICAgewotICAgICAgICBnZXRDZWxsRWRpdG9yKCkuc2V0VmFsdWUobmV3IEludGVnZXIoaSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBoYWNrLi4uIGZvciBzb21lIHJlYXNvbiB0aGUgQ29tYm9Cb3hDZWxsRWRpdG9yIGRvZXMndCBmaXJlIGFuCi0gIC8vIGVkaXRvclZhbHVlQ2hhbmdlZCB0byBzZXQgdGhlIGRpcnR5IGZsYWcKLSAgLy8gdW5sZXNzIHdlIG92ZXJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRydWUsIHRoZSBtYW5hZ2VyIGlzIG5vdCBub3RpZmllZAotICAvLyBvZiBjaGFuZ2VzIG1hZGUgaW4gdGhlIGNlbGwgZWRpdG9yCi0gIHByb3RlY3RlZCBib29sZWFuIGlzRGlydHkoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yT24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkKLSAgewotICAgIGJvb2xlYW4gaXNMYWJlbFRleHRJbkxpc3QgPSBmYWxzZTsKLSAgICBMaXN0IGxpc3QgPSBjb21wdXRlQ29tYm9Db250ZW50KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgaWYgKHN0cmluZy5lcXVhbHMobGFiZWwuZ2V0VGV4dCgpKSkKLSAgICAgIHsKLSAgICAgICAgaXNMYWJlbFRleHRJbkxpc3QgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWlzTGFiZWxUZXh0SW5MaXN0KQotICAgIHsKLSAgICAgIGxpc3QuYWRkKGxhYmVsLmdldFRleHQoKSk7Ci0gICAgfQotCi0gICAgTGlzdCBzb3J0ZWRMaXN0ID0gY29tcHV0ZVNvcnRlZExpc3QobGlzdCk7Ci0gICAgU3RyaW5nW10gc3RyaW5nQXJyYXkgPSBuZXcgU3RyaW5nW3NvcnRlZExpc3Quc2l6ZSgpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ0FycmF5Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHN0cmluZ0FycmF5W2ldID0gKFN0cmluZykgc29ydGVkTGlzdC5nZXQoaSk7Ci0gICAgfQotICAgIHJldHVybiBjcmVhdGVDZWxsRWRpdG9yKGNvbXBvc2l0ZSwgc3RyaW5nQXJyYXkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yKENvbXBvc2l0ZSBjb21wb3NpdGUsIFN0cmluZ1tdIHN0cmluZ0FycmF5KQotICB7Ci0gICAgcmV0dXJuIG5ldyBDb21ib0JveENlbGxFZGl0b3IoY29tcG9zaXRlLCBzdHJpbmdBcnJheSk7ICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgY29tcHV0ZVNvcnRlZExpc3QoTGlzdCBsaXN0KQotICB7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdCBjb21wdXRlQ29tYm9Db250ZW50KCk7Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcGVyZm9ybU1vZGlmeShPYmplY3QgdmFsdWUpOwotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW50ZXJuYWxDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yCi0gIHsKLSAgICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0KLSAgICBwdWJsaWMgSW50ZXJuYWxDZWxsRWRpdG9yTG9jYXRvcihMYWJlbCBsYWJlbCkKLSAgICB7Ci0gICAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKQotICAgIHsKLSAgICAgIENDb21ibyBjb21ibyA9IChDQ29tYm8pIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCi0gICAgICAvLyBUT0RPOiBXZSdyZSBwdWxsaW5nIGEgZmFzdCBvbmUgaGVyZS4uLi4uIFRoaXMgaXMgYXNzdW1pbmcgd2UncmUgdXNpbmcgYQotICAgICAgLy8gQ0NvbWJvIGFzIG91ciB3aWRnZXQKLSAgICAgIC8vIE91ciBldmVudHVhbCAnQ29tYm8nIG1heSBub3QgZXZlbiB1c2UgQ0NvbWJvIHNvIHRoaXMgd2lsbCBtb3N0IGxpa2VseQotICAgICAgLy8gZ2V0IHJlcGxhY2VkLgotICAgICAgLy8gaW50IGRyb3BEb3duQnV0dG9uU2l6ZVggPSAxNjsKLQotICAgICAgUmVjdGFuZ2xlIGxhYmVsUGFyZW50Qm91bmRzID0gbGFiZWwuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgICAgbGFiZWwudHJhbnNsYXRlVG9BYnNvbHV0ZShsYWJlbFBhcmVudEJvdW5kcyk7Ci0KLSAgICAgIGludCB4ID0gbGFiZWxQYXJlbnRCb3VuZHMueDsKLSAgICAgIGludCB5ID0gbGFiZWxQYXJlbnRCb3VuZHMueTsKLSAgICAgIGludCB3aWR0aEsgPSBsYWJlbFBhcmVudEJvdW5kcy53aWR0aDsKLSAgICAgIGludCBoZWlnaHQgPSBsYWJlbFBhcmVudEJvdW5kcy5oZWlnaHQ7Ci0gICAgICBjb21iby5zZXRCb3VuZHMoeCwgeSArIDEsIHdpZHRoSywgaGVpZ2h0IC0gMik7Ci0gICAgfQotICB9Ci0KLSAgLy8gaW1wbGVtZW50cyBEaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUKLSAgLy8gCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1FZGl0KENlbGxFZGl0b3IgY2VsbEVkaXRvcikKLSAgewotICAgIEFEVENvbWJvQm94Q2VsbEVkaXRvciBjb21ib0NlbGxFZGl0b3IgPSAoQURUQ29tYm9Cb3hDZWxsRWRpdG9yKSBjZWxsRWRpdG9yOwotICAgIENDb21ibyBjb21ibyA9IChDQ29tYm8pIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0gICAgaW50IGluZGV4ID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgT2JqZWN0IHZhbHVlID0gY29tYm8uZ2V0SXRlbShpbmRleCk7Ci0gICAgICBpZiAoY29tYm9DZWxsRWRpdG9yLmdldFNlbGVjdGVkVmFsdWUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICB2YWx1ZSA9IGNvbWJvQ2VsbEVkaXRvci5nZXRTZWxlY3RlZFZhbHVlKCk7Ci0gICAgICB9Ci0KLSAgICAgIHBlcmZvcm1Nb2RpZnkodmFsdWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nIHR5cGVkVmFsdWUgPSBjb21iby5nZXRUZXh0KCk7Ci0gICAgICBpZiAoY29tYm8uaW5kZXhPZih0eXBlZFZhbHVlKSAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgcGVyZm9ybU1vZGlmeSh0eXBlZFZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGNsb3NlTWF0Y2ggPSBnZXRDbG9zZU1hdGNoKHR5cGVkVmFsdWUsIGNvbWJvLmdldEl0ZW1zKCkpOwotICAgICAgICBpZiAoY2xvc2VNYXRjaCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcGVyZm9ybU1vZGlmeShjbG9zZU1hdGNoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5iZWVwKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsb3NlTWF0Y2goU3RyaW5nIHZhbHVlLCBTdHJpbmdbXSBpdGVtcykKLSAgewotICAgIGludCBtYXRjaEluZGV4ID0gLTE7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBpdGVtID0gaXRlbXNbaV07Ci0gICAgICBTdHJpbmcgYSA9IGdldExvY2FsTmFtZSh2YWx1ZSk7Ci0gICAgICBTdHJpbmcgYiA9IGdldExvY2FsTmFtZShpdGVtKTsKLSAgICAgIGlmIChhLmVxdWFsc0lnbm9yZUNhc2UoYikpCi0gICAgICB7Ci0gICAgICAgIG1hdGNoSW5kZXggPSBpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1hdGNoSW5kZXggIT0gLTEgPyBpdGVtc1ttYXRjaEluZGV4XSA6IG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldExvY2FsTmFtZShTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgaW50IGluZGV4ID0gc3RyaW5nLmluZGV4T2YoIjoiKTsgLy8kTk9OLU5MUy0xJAotICAgIHJldHVybiAoaW5kZXggIT0gLTEpID8gc3RyaW5nLnN1YnN0cmluZyhpbmRleCArIDEpIDogc3RyaW5nOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9FbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0VsZW1lbnRSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDExN2EyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0VsZW1lbnRSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEVsZW1lbnRSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIFJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyCi17Ci0gIHB1YmxpYyBFbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoSUZpZWxkIHBhcmFtZXRlciwgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIExhYmVsIGxhYmVsKQotICB7Ci0gICAgc3VwZXIocGFyYW1ldGVyLCBzb3VyY2UsIGxhYmVsKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCkKLSAgewotICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIHJlc3VsdCA9IG51bGw7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgaWYgKGVkaXRvciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOwotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0xhYmVsQ2VsbEVkaXRvckxvY2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0xhYmVsQ2VsbEVkaXRvckxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIzNGY4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9MYWJlbENlbGxFZGl0b3JMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5JTmFtZWRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JRmllbGRGaWd1cmU7Ci0KLXB1YmxpYyBjbGFzcyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IKLXsKLSAgcHJvdGVjdGVkIElOYW1lZEVkaXRQYXJ0IG5hbWVkRWRpdFBhcnQ7Ci0gIHByb3RlY3RlZCBQb2ludCBjdXJzb3JMb2NhdGlvbjsKLQotICBwdWJsaWMgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcihJTmFtZWRFZGl0UGFydCBuYW1lZEVkaXRQYXJ0LCBQb2ludCBjdXJzb3JMb2NhdGlvbikKLSAgewotICAgIHRoaXMubmFtZWRFZGl0UGFydCA9IG5hbWVkRWRpdFBhcnQ7Ci0gICAgdGhpcy5jdXJzb3JMb2NhdGlvbiA9IGN1cnNvckxvY2F0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKQotICB7Ci0gICAgVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCi0gICAgTGFiZWwgbGFiZWwgPSBuYW1lZEVkaXRQYXJ0LmdldE5hbWVMYWJlbEZpZ3VyZSgpOwotICAgIGlmICh0ZXh0LmdldEJvdW5kcygpLnggPD0gMCkKLSAgICB7Ci0gICAgICBpbnQgd2lkdGhUb1JlbW92ZSA9IDA7Ci0gICAgICAvLyBIQUNLIAotICAgICAgaWYgKG5hbWVkRWRpdFBhcnQgaW5zdGFuY2VvZiBCYXNlRmllbGRFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgQmFzZUZpZWxkRWRpdFBhcnQgZmllbGQgPSAoQmFzZUZpZWxkRWRpdFBhcnQpbmFtZWRFZGl0UGFydDsKLSAgICAgICAgSUZpZWxkRmlndXJlIGZpZWxkRmlndXJlID0gZmllbGQuZ2V0RmllbGRGaWd1cmUoKTsgICAgIAotICAgICAgICB3aWR0aFRvUmVtb3ZlID0gZmllbGRGaWd1cmUuZ2V0VHlwZUxhYmVsKCkuZ2V0Qm91bmRzKCkud2lkdGg7ICAgICAgIAotICAgICAgICAvL1RPRE86ICEhIHBlcmhhcHMgdGhlIElGaWVsZEZpZ3VyZSBzaG91bGQganVzdCBoYXZlIGEgbWV0aG9kIHRvIGNvbXB1dGUgdGhpcz8KLSAgICAgICAgLy9MYWJlbCB0eXBlQW5ub3RhdGlvbkxhYmVsID0gKChGaWVsZEZpZ3VyZSkgZmllbGQuZ2V0RmlndXJlKCkpLmdldFR5cGVBbm5vdGF0aW9uTGFiZWwoKTsKLSAgICAgICAgLy9MYWJlbCBuYW1lQW5ub3RhdGlvbkxhYmVsID0gKChGaWVsZEZpZ3VyZSkgZmllbGQuZ2V0RmlndXJlKCkpLmdldE5hbWVBbm5vdGF0aW9uTGFiZWwoKTsKLSAgICAgICAgLy93aWR0aFRvUmVtb3ZlID0gdHlwZUxhYmVsLmdldEJvdW5kcygpLndpZHRoICsgdHlwZUFubm90YXRpb25MYWJlbC5nZXRCb3VuZHMoKS53aWR0aCArIG5hbWVBbm5vdGF0aW9uTGFiZWwuZ2V0Qm91bmRzKCkud2lkdGg7Ci0gICAgICB9Ci0gICAgIAotICAgICAgUmVjdGFuZ2xlIGJvdW5kaW5nUmVjdCA9IGxhYmVsLmdldFRleHRCb3VuZHMoKTsKLQotICAgICAgLy8gUmVkdWNlIHRoZSB3aWR0aCBieSB0aGUgYW1vdW50IHdlIHNoaWZ0ZWQgYWxvbmcgdGhlIHgtYXhpcwotICAgICAgaW50IGRlbHRhID0gTWF0aC5hYnMoYm91bmRpbmdSZWN0LnggLSBsYWJlbC5nZXRQYXJlbnQoKS5nZXRCb3VuZHMoKS54KTsKLQotICAgICAgbGFiZWwuZ2V0UGFyZW50KCkudHJhbnNsYXRlVG9BYnNvbHV0ZShib3VuZGluZ1JlY3QpOwotICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSB0cmltID0gdGV4dC5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLSAgICAgIGJvdW5kaW5nUmVjdC50cmFuc2xhdGUodHJpbS54LCB0cmltLnkpOwotICAgICAgYm91bmRpbmdSZWN0LmhlaWdodCA9IGJvdW5kaW5nUmVjdC5oZWlnaHQgLSB0cmltLnk7Ci0KLSAgICAgIGJvdW5kaW5nUmVjdC53aWR0aCA9IGxhYmVsLmdldFBhcmVudCgpLmdldEJvdW5kcygpLndpZHRoIC0gZGVsdGEgLSB3aWR0aFRvUmVtb3ZlOwotICAgICAgdGV4dC5zZXRCb3VuZHMoYm91bmRpbmdSZWN0LngsIGJvdW5kaW5nUmVjdC55LCBib3VuZGluZ1JlY3Qud2lkdGgsIGJvdW5kaW5nUmVjdC5oZWlnaHQpOwotCi0gICAgICAvLyBUcmFuc2xhdGUgcG9pbnQKLSAgICAgIGlmIChjdXJzb3JMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgCSAgUG9pbnQgdHJhbnNsYXRlZFBvaW50ID0gbmV3IFBvaW50KGN1cnNvckxvY2F0aW9uLnggLSBib3VuZGluZ1JlY3QueCwgY3Vyc29yTG9jYXRpb24ueSAtIGJvdW5kaW5nUmVjdC55KTsKLQotICAgIAkgIC8vIENhbGN1bGF0ZSB0ZXh0IG9mZnNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0cmFuc2xhdGVkIHBvaW50Ci0gICAgCSAgdGV4dC5zZXRTZWxlY3Rpb24oMCwgMCk7Ci0gICAgCSAgaW50IHhDYXJldCA9IHRleHQuZ2V0Q2FyZXRMb2NhdGlvbigpLng7Ci0gICAgCSAgaW50IG9mZnNldCA9IHRleHQuZ2V0Q2FyZXRQb3NpdGlvbigpOwotICAgIAkgIHdoaWxlICh4Q2FyZXQgPCB0cmFuc2xhdGVkUG9pbnQueCkKLSAgICAJICB7Ci0gICAgCQkgIHRleHQuc2V0U2VsZWN0aW9uKG9mZnNldCArIDEsIG9mZnNldCArIDEpOwotICAgIAkJICB4Q2FyZXQgPSB0ZXh0LmdldENhcmV0TG9jYXRpb24oKS54OwotICAgIAkJICBpbnQgbmV3T2Zmc2V0ID0gdGV4dC5nZXRDYXJldFBvc2l0aW9uKCk7Ci0gICAgCQkgIGlmIChuZXdPZmZzZXQgPT0gb2Zmc2V0KQotICAgIAkJICB7Ci0gICAgCQkJICBicmVhazsKLSAgICAJCSAgfQotICAgIAkJICBvZmZzZXQrKzsKLSAgICAJICB9Ci0gICAgCSAgdGV4dC5zZXRTZWxlY3Rpb24ob2Zmc2V0LCBvZmZzZXQpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvTGFiZWxFZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvTGFiZWxFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODQzNDFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0xhYmVsRWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5DZWxsRWRpdG9yQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5JTmFtZWRFZGl0UGFydDsKLQotcHVibGljIGNsYXNzIExhYmVsRWRpdE1hbmFnZXIgZXh0ZW5kcyBEaXJlY3RFZGl0TWFuYWdlciB7Ci0KLQlwcml2YXRlIElBY3Rpb25CYXJzIGFjdGlvbkJhcnM7Ci0JcHJpdmF0ZSBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlciBhY3Rpb25IYW5kbGVyOwotCXByaXZhdGUgSUFjdGlvbiBjb3B5LCBjdXQsIHBhc3RlLCB1bmRvLCByZWRvLCBmaW5kLCBzZWxlY3RBbGwsIGRlbGV0ZTsKLQlwcml2YXRlIEZvbnQgc2NhbGVkRm9udDsKLQotCXB1YmxpYyBMYWJlbEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwgQ2VsbEVkaXRvckxvY2F0b3IgbG9jYXRvcikgewotCQlzdXBlcihzb3VyY2UsIG51bGwsIGxvY2F0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkgewotCQlpZiAoYWN0aW9uSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlhY3Rpb25IYW5kbGVyLmRpc3Bvc2UoKTsKLQkJCWFjdGlvbkhhbmRsZXIgPSBudWxsOwotCQl9Ci0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLQkJCXJlc3RvcmVTYXZlZEFjdGlvbnMoYWN0aW9uQmFycyk7Ci0JCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQkJCWFjdGlvbkJhcnMgPSBudWxsOwotCQl9Ci0KLQkJRm9udCBkaXNwb3NlRm9udCA9IHNjYWxlZEZvbnQ7Ci0JCXNjYWxlZEZvbnQgPSBudWxsOwotCQlzdXBlci5icmluZ0Rvd24oKTsKLQkJaWYgKGRpc3Bvc2VGb250ICE9IG51bGwpCi0JCQlkaXNwb3NlRm9udC5kaXNwb3NlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNob3dGZWVkYmFjaygpIHsKLS8vICAgIHN1cGVyLnNob3dGZWVkYmFjaygpOwotCQlnZXRFZGl0UGFydCgpLnNob3dTb3VyY2VGZWVkYmFjayhnZXREaXJlY3RFZGl0UmVxdWVzdCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yT24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlyZXR1cm4gbmV3IFRleHRDZWxsRWRpdG9yKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5XUkFQKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpIHsKLQkJVGV4dCB0ZXh0ID0gKFRleHQpZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJTGFiZWwgbGFiZWwgPSAoKElOYW1lZEVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKS5nZXROYW1lTGFiZWxGaWd1cmUoKTsKLSAgICAKLQkJaWYgKGxhYmVsICE9IG51bGwpIHsKLQkJCXNjYWxlZEZvbnQgPSBsYWJlbC5nZXRGb250KCk7Ci0JCQkKLQkJCUNvbG9yIGNvbG9yID0gbGFiZWwuZ2V0QmFja2dyb3VuZENvbG9yKCk7Ci0JCQl0ZXh0LnNldEJhY2tncm91bmQoY29sb3IpOwotCQkJCi0JCQlTdHJpbmcgaW5pdGlhbExhYmVsVGV4dCA9IGxhYmVsLmdldFRleHQoKTsKLQkJCWdldENlbGxFZGl0b3IoKS5zZXRWYWx1ZShpbml0aWFsTGFiZWxUZXh0KTsKLQkJfQotCQllbHNlIHsKLQkJCXNjYWxlZEZvbnQgPSBsYWJlbC5nZXRQYXJlbnQoKS5nZXRGb250KCk7Ci0JCQl0ZXh0LnNldEJhY2tncm91bmQobGFiZWwuZ2V0UGFyZW50KCkuZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotCQl9Ci0JCQotCQlGb250RGF0YSBkYXRhID0gc2NhbGVkRm9udC5nZXRGb250RGF0YSgpWzBdOwotCQlEaW1lbnNpb24gZm9udFNpemUgPSBuZXcgRGltZW5zaW9uKDAsIGRhdGEuZ2V0SGVpZ2h0KCkpOwotCQlsYWJlbC5nZXRQYXJlbnQoKS50cmFuc2xhdGVUb0Fic29sdXRlKGZvbnRTaXplKTsKLQkJZGF0YS5zZXRIZWlnaHQoZm9udFNpemUuaGVpZ2h0KTsKLQkJc2NhbGVkRm9udCA9IG5ldyBGb250KG51bGwsIGRhdGEpOwotCQkKLQkJdGV4dC5zZXRGb250KHNjYWxlZEZvbnQpOwotLy8JCXRleHQuc2VsZWN0QWxsKCk7Ci0KLQkJLy8gSG9vayB0aGUgY2VsbCBlZGl0b3IncyBjb3B5L3Bhc3RlIGFjdGlvbnMgdG8gdGhlIGFjdGlvbkJhcnMgc28gdGhhdCB0aGV5IGNhbgotCQkvLyBiZSBpbnZva2VkIHZpYSBrZXlib2FyZCBzaG9ydGN1dHMuCi0JCWFjdGlvbkJhcnMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQlzYXZlQ3VycmVudEFjdGlvbnMoYWN0aW9uQmFycyk7Ci0JCWFjdGlvbkhhbmRsZXIgPSBuZXcgQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXIoYWN0aW9uQmFycyk7Ci0JCWFjdGlvbkhhbmRsZXIuYWRkQ2VsbEVkaXRvcihnZXRDZWxsRWRpdG9yKCkpOwotCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzdG9yZVNhdmVkQWN0aW9ucyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKXsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLCBjb3B5KTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSwgcGFzdGUpOwotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUyNTA5Ci0JCS8vIERlbGV0ZSBhY3Rpb24gKGtleSkgZG9lc24ndCBhbHdheXMgd29yay4gIFRoZSBzYXZlZCBhY3Rpb24gY291bGQgYmUgdGhlIAotCQkvLyBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlcidzIERlbGV0ZUFjdGlvbkhhbmRsZXIuLi5kdWUgdG8gdGltaW5nIGlzc3Vlcy4KLQkJLy8gV2UnbGwgb25seSByZXN0b3JlIHRoZSBkZWxldGUgYWN0aW9uIGlmIGl0IGlzIGluZGVlZCB0aGUgb25lIGZvciB0aGUgRGVzaWduIHZpZXcuCi0JCS8vIFdlIHNob3VsZCB1cGRhdGUgdGhlIG90aGVyIGFjdGlvbnMgdG9vLCBidXQgY3VycmVudGx5LCBub25lIGFyZSBhcHBsaWNhYmxlLgotCQlpZiAoZGVsZXRlIGluc3RhbmNlb2YgQmFzZVNlbGVjdGlvbkFjdGlvbikKLQkJewotICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksIGRlbGV0ZSk7Ci0JCX0KLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpLCBzZWxlY3RBbGwpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSwgY3V0KTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuRklORC5nZXRJZCgpLCBmaW5kKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLCB1bmRvKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpLCByZWRvKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZUN1cnJlbnRBY3Rpb25zKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJY29weSA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSk7Ci0JCXBhc3RlID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSk7Ci0gICAgSUFjdGlvbiBjdXJyZW50RGVsZXRlQWN0aW9uID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTI1MDkKLSAgICAvLyBEZWxldGUgYWN0aW9uIChrZXkpIGRvZXNuJ3QgYWx3YXlzIHdvcmsuICBUaGUgc2F2ZWQgYWN0aW9uIGNvdWxkIGJlIHRoZSAKLSAgICAvLyBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlcidzIERlbGV0ZUFjdGlvbkhhbmRsZXIuLi5kdWUgdG8gdGltaW5nIGlzc3Vlcy4KLSAgICAvLyBXZSdsbCBvbmx5IHJlc3RvcmUgdGhlIGRlbGV0ZSBhY3Rpb24gaWYgaXQgaXMgaW5kZWVkIHRoZSBvbmUgZm9yIHRoZSBEZXNpZ24gdmlldy4KLSAgICAvLyBXZSBzaG91bGQgdXBkYXRlIHRoZSBvdGhlciBhY3Rpb25zIHRvbywgYnV0IGN1cnJlbnRseSwgbm9uZSBhcmUgYXBwbGljYWJsZS4KLSAgICBpZiAoY3VycmVudERlbGV0ZUFjdGlvbiBpbnN0YW5jZW9mIEJhc2VTZWxlY3Rpb25BY3Rpb24pCi0gICAgewotICAgICAgZGVsZXRlID0gY3VycmVudERlbGV0ZUFjdGlvbjsKLSAgICB9Ci0JCXNlbGVjdEFsbCA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuZ2V0SWQoKSk7Ci0JCWN1dCA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpKTsKLQkJZmluZCA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkZJTkQuZ2V0SWQoKSk7Ci0JCXVuZG8gPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5VTkRPLmdldElkKCkpOwotCQlyZWRvID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9SZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NlZDkwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9SZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyIGV4dGVuZHMgQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlcgotewotICBwcm90ZWN0ZWQgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydDsKLSAgcHJvdGVjdGVkIElGaWVsZCBzZXRPYmplY3Q7Ci0KLSAgcHVibGljIFJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyKElGaWVsZCBwYXJhbWV0ZXIsIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBMYWJlbCBsYWJlbCkKLSAgewotICAgIHN1cGVyKHNvdXJjZSwgbGFiZWwpOwotICAgIGVkaXRQYXJ0ID0gc291cmNlOwotICAgIHNldE9iamVjdCA9IHBhcmFtZXRlcjsKLSAgfQotCi0gIHByb3RlY3RlZCBDZWxsRWRpdG9yIGNyZWF0ZUNlbGxFZGl0b3JPbihDb21wb3NpdGUgY29tcG9zaXRlKQotICB7Ci0gICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUNlbGxFZGl0b3JPbihjb21wb3NpdGUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgY29tcHV0ZUNvbWJvQ29udGVudCgpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZWRpdE1hbmFnZXIgPSBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpOwotICAgIGlmIChlZGl0TWFuYWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgICBsaXN0LmFkZChNZXNzYWdlcy5fVUlfQ09NQk9fQlJPV1NFKTsKLSAgICAgICBsaXN0LmFkZChNZXNzYWdlcy5fVUlfQ09NQk9fTkVXKTsKLSAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gcXVpY2tQaWNrcyA9IGVkaXRNYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLSAgICAgICBpZiAocXVpY2tQaWNrcyAhPSBudWxsKQotICAgICAgIHsKLSAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHF1aWNrUGlja3MubGVuZ3RoOyBpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9IHF1aWNrUGlja3NbaV07Ci0gICAgICAgICAgIGxpc3QuYWRkKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgIH0gIAotICAgICAgIH0KLSAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gaGlzdG9yeSA9IGVkaXRNYW5hZ2VyLmdldEhpc3RvcnkoKTsKLSAgICAgICBpZiAoaGlzdG9yeSAhPSBudWxsKQotICAgICAgIHsKLSAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGhpc3RvcnkubGVuZ3RoOyBpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9IGhpc3RvcnlbaV07Ci0gICAgICAgICAgIGxpc3QuYWRkKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgIH0gIAotICAgICAgIH0KLSAgICB9IAotICAgIHJldHVybiBsaXN0OyAKLSAgfQotCi0gIHByb3RlY3RlZCBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldENvbXBvbmVudFNwZWNpZmljYXRpb25Gb3JWYWx1ZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBlZGl0TWFuYWdlciA9IGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCk7Ci0gICAgaWYgKGVkaXRNYW5hZ2VyICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gcXVpY2tQaWNrcyA9IGVkaXRNYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLSAgICAgIGlmIChxdWlja1BpY2tzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHF1aWNrUGlja3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBxdWlja1BpY2tzW2ldOwotICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoY29tcG9uZW50U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRTcGVjaWZpY2F0aW9uOwotICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgIH0gIAotICAgICAgfQotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGhpc3RvcnkgPSBlZGl0TWFuYWdlci5nZXRIaXN0b3J5KCk7Ci0gICAgICBpZiAoaGlzdG9yeSAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBoaXN0b3J5Lmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gaGlzdG9yeVtpXTsKLSAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRTcGVjaWZpY2F0aW9uOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwZXJmb3JtTW9kaWZ5KE9iamVjdCB2YWx1ZSkKLSAgewotICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKTsKLSAgICBpZiAoZWRpdE1hbmFnZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIC8vIG91ciBjcnVkZSBjb21ibyBib3ggY2FuIG9ubHkgd29yayB3aXRoICdTdHJpbmcnIG9iamVjdHMKLSAgICAvLyBpZiB3ZSBnZXQgYSBTdHJpbmcgYmFjayB3ZSBuZWVkIHRvIGRvIHNvbWUgY2xldmVyIG1hcHBpbmcgdG8gZ2V0IHRoZSBDb21wb25lbnRTcGVjaWZpY2F0aW9uIAotICAgIC8vICAgIAotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGdldENvbXBvbmVudFNwZWNpZmljYXRpb25Gb3JWYWx1ZSgoU3RyaW5nKXZhbHVlKTsgICAgIAotICAgIH0gIAotICAgIC8vIHdlIGFzc3VtZSB0aGUgc2VsZWN0ZWQgdmFsdWUgaXMgYWx3YXlzIG9mIHRoZSBmb3JtIG9mIGEgQ29tcG9uZW50U3BlY2lmaWNhdGlvbgotICAgIC8vIAotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbXBvbmVudFNwZWNpZmljYXRpb24pICAgICAgCi0gICAgewotICAgICAgLy8gd2UgbmVlZCB0byBwZXJmb3JtIGFuIGFzeW5jRXhlYyBoZXJlIHNpbmNlIHRoZSAnaG9zdCcgZWRpdHBhcnQgbWF5IGJlCi0gICAgICAvLyByZW1vdmVkIGFzIGEgc2lkZSBlZmZlY3Qgb2YgcGVyZm9ybWluZyB0aGUgYWN0aW9uICAgICAgICAgICAKLSAgICAgIERlbGF5ZWRTZXRSZWZlcmVuY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBEZWxheWVkU2V0UmVmZXJlbmNlUnVubmFibGUoZWRpdE1hbmFnZXIsIHNldE9iamVjdCwgKENvbXBvbmVudFNwZWNpZmljYXRpb24pdmFsdWUpOwotICAgICAgLy9ydW5uYWJsZS5ydW4oKTsKLSAgICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgY29tcHV0ZVNvcnRlZExpc3QoTGlzdCBsaXN0KQotICB7Ci0gICAgLy8gcmV0dXJuIFR5cGVzSGVscGVyLnNvcnRMaXN0KGxpc3QpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yKENvbXBvc2l0ZSBjb21wb3NpdGUsIFN0cmluZ1tdIHN0cmluZ0FycmF5KQotICB7Ci0gICAgQURUQ29tYm9Cb3hDZWxsRWRpdG9yIGNlbGxFZGl0b3IgPSBuZXcgQURUQ29tYm9Cb3hDZWxsRWRpdG9yKGNvbXBvc2l0ZSwgc3RyaW5nQXJyYXksIGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCkpOwotICAgIC8vKChBRFRDb21ib0JveENlbGxFZGl0b3IpIGNlbGxFZGl0b3IpLnNldE9iamVjdFRvTW9kaWZ5KHNldE9iamVjdCk7Ci0gICAgcmV0dXJuIGNlbGxFZGl0b3I7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKTsKLSAgCi0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBnZXRBY3RpdmVFZGl0b3IoKQotICB7Ci0gICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgIHJldHVybiBlZGl0b3JQYXJ0OwotICB9ICAgIAotICAKLSAgcHJvdGVjdGVkIGNsYXNzIERlbGF5ZWRTZXRSZWZlcmVuY2VSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlCi0gIHsKLSAgICBwcm90ZWN0ZWQgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci0gICAgcHJvdGVjdGVkIENvbXBvbmVudFNwZWNpZmljYXRpb24gbmV3VmFsdWU7Ci0gICAgcHJvdGVjdGVkIElGaWVsZCBmaWVsZDsKLQotICAgIHB1YmxpYyBEZWxheWVkU2V0UmVmZXJlbmNlUnVubmFibGUoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIsCi0gICAgICAgIElGaWVsZCBzZXRPYmplY3QsIENvbXBvbmVudFNwZWNpZmljYXRpb24gc2VsZWN0ZWRWYWx1ZSkKLSAgICB7Ci0gICAgICB0aGlzLmNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyID0gY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci0gICAgICBuZXdWYWx1ZSA9IHNlbGVjdGVkVmFsdWU7Ci0gICAgICBmaWVsZCA9IHNldE9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgIGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShmaWVsZCwgbmV3VmFsdWUpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9UeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L1R5cGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmViYWUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L1R5cGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgVHlwZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyIGV4dGVuZHMgUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIgLy9Db21ib0JveENlbGxFZGl0b3JNYW5hZ2VyCi17Ci0gIHB1YmxpYyBUeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoSUZpZWxkIHBhcmFtZXRlciwgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIExhYmVsIGxhYmVsKQotICB7Ci0gICAgc3VwZXIocGFyYW1ldGVyLCBzb3VyY2UsIGxhYmVsKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpCi0gIHsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciByZXN1bHQgPSBudWxsOwotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgIGlmIChlZGl0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOwotICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIyKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIyIG1hbmFnZXIgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIyKXJlc3VsdDsKLSAgICAgICAgICBtYW5hZ2VyLnNldFJlZmVyZW5jZXIoc2V0T2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQURURWRpdFBhcnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0FEVEVkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjQyNjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQURURWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uQURURmxvYXRpbmdUb29sYmFyLkFEVEZsb2F0aW5nVG9vbGJhck1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuQWJzdHJhY3RNb2RlbENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Db21wYXJ0bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkZvY3VzVHlwZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLlJvb3RIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklDb21wbGV4VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci0KLXB1YmxpYyBjbGFzcyBBRFRFZGl0UGFydEZhY3RvcnkgaW1wbGVtZW50cyBFZGl0UGFydEZhY3RvcnkKLXsKLSAgcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkKLSAgewotICAgIEVkaXRQYXJ0IGNoaWxkID0gZG9DcmVhdGVFZGl0UGFydChjb250ZXh0LCBtb2RlbCk7Ci0gICAgY2hlY2tDaGlsZChjaGlsZCwgbW9kZWwpOwotICAgIHJldHVybiBjaGlsZDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGRvQ3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgRWRpdFBhcnQgY2hpbGQgPSBudWxsOwotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIENvbXBhcnRtZW50KQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IENvbXBhcnRtZW50RWRpdFBhcnQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBSb290SG9sZGVyKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IFJvb3RIb2xkZXJFZGl0UGFydCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIEFEVEZsb2F0aW5nVG9vbGJhck1vZGVsKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IEFEVEZsb2F0aW5nVG9vbGJhckVkaXRQYXJ0KCgoQURURmxvYXRpbmdUb29sYmFyTW9kZWwpbW9kZWwpLmdldE1vZGVsKCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIEFic3RyYWN0TW9kZWxDb2xsZWN0aW9uKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IENvbHVtbkVkaXRQYXJ0KCk7Ci0gICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBGb2N1c1R5cGVDb2x1bW4pCi0gICAgICB7Ci0gICAgICAgIENvbHVtbkVkaXRQYXJ0IGNvbHVtbkVkaXRQYXJ0ID0gKENvbHVtbkVkaXRQYXJ0KWNoaWxkOwotICAgICAgICBjb2x1bW5FZGl0UGFydC5zZXRTcGFjaW5nKDYwKTsKLSAgICAgICAgY29sdW1uRWRpdFBhcnQuc2V0TWlub3JBbGlnbm1lbnQoVG9vbGJhckxheW91dC5BTElHTl9DRU5URVIpOwotICAgICAgfSAgCi0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUNvbXBsZXhUeXBlKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IENvbXBsZXhUeXBlRWRpdFBhcnQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IFN0cnVjdHVyZUVkaXRQYXJ0KCk7Ci0gICAgfSAgCi0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJRmllbGQpCi0gICAgewotICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBDb21wYXJ0bWVudEVkaXRQYXJ0KQotICAgICAgeyAgCi0gICAgICAgIGNoaWxkID0gbmV3IEZpZWxkRWRpdFBhcnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY2hpbGQgPSBuZXcgVG9wTGV2ZWxGaWVsZEVkaXRQYXJ0KCk7Ci0gICAgICB9ICAKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJTW9kZWwpCi0gICAgewotICAgICAgY2hpbGQgPSBuZXcgUm9vdENvbnRlbnRFZGl0UGFydCgpOwotICAgIH0KLSAgICByZXR1cm4gY2hpbGQ7ICAgCi0gIH0KLQotICAvKioKLSAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgYW5kIG5vdCBjaGVjayBmb3IgbnVsbAotICAgKiAKLSAgICogQHBhcmFtIGNoaWxkCi0gICAqIEBwYXJhbSBtb2RlbAotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY2hlY2tDaGlsZChFZGl0UGFydCBjaGlsZCwgT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgaWYgKGNoaWxkID09IG51bGwpCi0gICAgewotICAgICAgLy8gVGhyZWFkLmR1bXBTdGFjaygpOwotICAgIH0KLSAgICBBc3NlcnQuaXNOb3ROdWxsKGNoaWxkKTsKLSAgICBjaGlsZC5zZXRNb2RlbChtb2RlbCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQURURmxvYXRpbmdUb29sYmFyRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQURURmxvYXRpbmdUb29sYmFyRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZiOGJlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0FEVEZsb2F0aW5nVG9vbGJhckVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTW91c2VNb3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TZXRJbnB1dFRvR3JhcGhWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuQ2VudGVyZWRJY29uRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIEFEVEZsb2F0aW5nVG9vbGJhckVkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBJTW9kZWwgbW9kZWw7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzRHJpbGxlZERvd247Ci0gIHByb3RlY3RlZCBBRFRUb29sYmFyQnV0dG9uIGJhY2tUb1NjaGVtYTsKLSAgCi0gIHB1YmxpYyBBRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydChJTW9kZWwgbW9kZWwpCi0gIHsKLSAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgRmlndXJlIGZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBUb29sYmFyTGF5b3V0IHRiID0gbmV3IFRvb2xiYXJMYXlvdXQodHJ1ZSk7Ci0gICAgdGIuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7Ci0gICAgdGIuc2V0U3BhY2luZygzKTsKLSAgICBmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcih0Yik7Ci0gICAgCi0gICAgYmFja1RvU2NoZW1hID0gbmV3IEFEVFRvb2xiYXJCdXR0b24oWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oImVsY2wxNi9zY2hlbWF2aWV3X2NvLmdpZiIpKTsKLSAgICBiYWNrVG9TY2hlbWEuc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX0hPVkVSX0JBQ0tfVE9fU0NIRU1BKTsKLSAgICBiYWNrVG9TY2hlbWEuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLSAgICBiYWNrVG9TY2hlbWEuc2V0Rm9jdXNUcmF2ZXJzYWJsZSh0cnVlKTsgICAgCi0gICAgZmlndXJlLmFkZChiYWNrVG9TY2hlbWEpOwotICAgIGZpZ3VyZS5zZXRCb3VuZHMobmV3IFJlY3RhbmdsZSgwLDAsMjQsMjQpKTsgICAgCi0gICAgYWRkVG9Ub29sYmFyKGZpZ3VyZSk7Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgYWRkVG9Ub29sYmFyKElGaWd1cmUgZmlndXJlKQotICB7Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElzRHJpbGxlZERvd24oYm9vbGVhbiBpc0RyaWxsZWREb3duKQotICB7Ci0gICAgdGhpcy5pc0RyaWxsZWREb3duID0gaXNEcmlsbGVkRG93bjsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgICBiYWNrVG9TY2hlbWEuaXNFbmFibGVkID0gaXNEcmlsbGVkRG93bjsKLSAgICBpZiAoaXNEcmlsbGVkRG93bikKLSAgICB7Ci0gICAgICBiYWNrVG9TY2hlbWEuaW1hZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigiZWxjbDE2L3NjaGVtYXZpZXdfY28uZ2lmIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBiYWNrVG9TY2hlbWEuaW1hZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigiZGxjbDE2L3NjaGVtYXZpZXdfY28uZ2lmIik7Ci0gICAgfQotICAgIGJhY2tUb1NjaGVtYS5yZWZyZXNoKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGRvQWN0aW9uKE1vdXNlRXZlbnQgbWUpCi0gIHsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gZ2V0QWN0aW9uRWRpdG9yUGFydCgpOwotIAotICAgIGlmIChiYWNrVG9TY2hlbWEuZ2V0Qm91bmRzKCkuY29udGFpbnMobWUuZ2V0TG9jYXRpb24oKSkpCi0gICAgewotICAgICAgU2V0SW5wdXRUb0dyYXBoVmlldyBhY3Rpb24gPSBuZXcgU2V0SW5wdXRUb0dyYXBoVmlldyhlZGl0b3JQYXJ0LCBtb2RlbCk7Ci0gICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBkb0FjdGlvbihvcmcuZWNsaXBzZS5kcmF3MmQuS2V5RXZlbnQga2UpCi0gIHsKLQkgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBnZXRBY3Rpb25FZGl0b3JQYXJ0KCk7IAotCSAgU2V0SW5wdXRUb0dyYXBoVmlldyBhY3Rpb24gPSBuZXcgU2V0SW5wdXRUb0dyYXBoVmlldyhlZGl0b3JQYXJ0LCBtb2RlbCk7Ci0JICBhY3Rpb24ucnVuKCk7ICAgIAotICB9Ci0gIAotICBwcml2YXRlIElFZGl0b3JQYXJ0IGdldEFjdGlvbkVkaXRvclBhcnQoKQotICB7Ci0JICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCSAgcmV0dXJuIGVkaXRvclBhcnQ7Ci0gIH0KLSAgCi0gIAotICBwcm90ZWN0ZWQgY2xhc3MgQURUVG9vbGJhckJ1dHRvbiBleHRlbmRzIENlbnRlcmVkSWNvbkZpZ3VyZQotICB7Ci0gICAgcHJvdGVjdGVkIE1vdXNlTGlzdGVuZXIgbW91c2VMaXN0ZW5lcjsKLSAgICBwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZHJhdzJkLktleUxpc3RlbmVyIGtleUxpc3RlbmVyOyAgICAKLSAgICBwcm90ZWN0ZWQgRm9jdXNMaXN0ZW5lciBmb2N1c0xpc3RlbmVyOwotICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZDsKLSAgICAKLSAgICBwdWJsaWMgQURUVG9vbGJhckJ1dHRvbihJbWFnZSBpbWcpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICAgIHRoaXMuaW1hZ2UgPSBpbWc7Ci0KLSAgICAgIG1vdXNlTGlzdGVuZXIgPSBuZXcgTW91c2VMaXN0ZW5lci5TdHViKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgbW91c2VQcmVzc2VkKG9yZy5lY2xpcHNlLmRyYXcyZC5Nb3VzZUV2ZW50IG1lKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzRW5hYmxlZCkKLSAgICAgICAgICB7Ci0gICAgICAgIAkgIGFkZEZlZWRiYWNrKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChvcmcuZWNsaXBzZS5kcmF3MmQuTW91c2VFdmVudCBtZSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc0VuYWJsZWQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlRmVlZGJhY2soKTsKLSAgICAgICAgICAgIGRvQWN0aW9uKG1lKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgICBhZGRNb3VzZUxpc3RlbmVyKG1vdXNlTGlzdGVuZXIpOwotICAgICAgYWRkTW91c2VNb3Rpb25MaXN0ZW5lcihuZXcgTW91c2VNb3Rpb25MaXN0ZW5lci5TdHViKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgbW91c2VFeGl0ZWQoTW91c2VFdmVudCBtZSkKLSAgICAgICAgewotICAgICAgICAgIHJlbW92ZUZlZWRiYWNrKCk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgICAgCi0gICAgICBrZXlMaXN0ZW5lciA9IG5ldyBLZXlMaXN0ZW5lci5TdHViKCkKLSAgICAgIHsKLSAgICAJICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKG9yZy5lY2xpcHNlLmRyYXcyZC5LZXlFdmVudCBrZSkKLSAgICAJICB7Ci0gICAgCQkgIGJvb2xlYW4gaXNWYWxpZEtleSA9IChrZS5rZXljb2RlID09IEtleUV2ZW50LlZLX1NQQUNFKTsKLSAgICAJCSAgaXNWYWxpZEtleSA9IGlzVmFsaWRLZXkgfHwgKGtlLmNoYXJhY3RlciA9PSBTV1QuQ1IgfHwga2UuY2hhcmFjdGVyID09IFNXVC5MRik7Ci0gICAgCQkgIGlmIChpc0VuYWJsZWQgJiYgaXNWYWxpZEtleSkKLSAgICAJCSAgewotICAgIAkJCSAgYWRkRmVlZGJhY2soKTsKLSAgICAJCSAgfQotICAgIAkgIH0KLQotICAgIAkgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKG9yZy5lY2xpcHNlLmRyYXcyZC5LZXlFdmVudCBrZSkKLSAgICAJICB7Ci0gICAgCQkgIGJvb2xlYW4gaXNWYWxpZEtleSA9IChrZS5rZXljb2RlID09IEtleUV2ZW50LlZLX1NQQUNFKTsKLSAgICAJCSAgaXNWYWxpZEtleSA9IGlzVmFsaWRLZXkgfHwgKGtlLmNoYXJhY3RlciA9PSBTV1QuQ1IgfHwga2UuY2hhcmFjdGVyID09IFNXVC5MRik7Ci0gICAgCQkgIGlmIChpc0VuYWJsZWQgJiYgaXNWYWxpZEtleSkKLSAgICAJCSAgewotICAgIAkJCSAgcmVtb3ZlRmVlZGJhY2soKTsKLSAgICAJCQkgIGRvQWN0aW9uKGtlKTsKLSAgICAJCSAgfSAgICAgICAgICAgIAotICAgIAkgIH0KLSAgICAgIH07Ci0gICAgICBhZGRLZXlMaXN0ZW5lcihrZXlMaXN0ZW5lcik7ICAgIAotICAgICAgCi0gICAgICBmb2N1c0xpc3RlbmVyID0gbmV3IEZvY3VzTGlzdGVuZXIoKXsKLQotCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGZlKSB7Ci0JCQlzZXRNb2RlKENlbnRlcmVkSWNvbkZpZ3VyZS5IT1ZFUik7Ci0JCQlyZWZyZXNoKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBmZSkgewotCQkJc2V0TW9kZShDZW50ZXJlZEljb25GaWd1cmUuTk9STUFMKTsKLQkJCXJlZnJlc2goKTsKLQkJfQotCX07Ci0JCi0JYWRkRm9jdXNMaXN0ZW5lcihmb2N1c0xpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gICAgewotICAgICAgc2V0TW9kZShDZW50ZXJlZEljb25GaWd1cmUuU0VMRUNURUQpOwotICAgICAgcmVmcmVzaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkKLSAgICB7Ci0gICAgICBzZXRNb2RlKENlbnRlcmVkSWNvbkZpZ3VyZS5OT1JNQUwpOwotICAgICAgcmVmcmVzaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKCkKLSAgICB7Ci0gICAgICBSZWN0YW5nbGUgciA9IHN1cGVyLmdldEJvdW5kcygpOwotICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0gICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZShyLngsIHIueSwgcmVjdC53aWR0aCArIDgsIHJlY3QuaGVpZ2h0ICsgOCk7Ci0gICAgfQotCi0gICAgcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCBoaW50LCBpbnQgaGludDIpCi0gICAgewotICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0gICAgICByZXR1cm4gbmV3IERpbWVuc2lvbihyZWN0LndpZHRoICsgOCwgcmVjdC5oZWlnaHQgKyA4KTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9CYWNrVG9TY2hlbWFFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9CYWNrVG9TY2hlbWFFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzllZDZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQmFja1RvU2NoZW1hRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TZXRJbnB1dFRvR3JhcGhWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUZlZWRiYWNrSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkFEVE11bHRpUGFnZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkNlbnRlcmVkSWNvbkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBCYWNrVG9TY2hlbWFFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydCBpbXBsZW1lbnRzIElGZWVkYmFja0hhbmRsZXIKLXsKLSAgcHJvdGVjdGVkIE11bHRpUGFnZUVkaXRvclBhcnQgbXVsdGlwYWdlRWRpdG9yOwotICBwcm90ZWN0ZWQgQURURGlyZWN0RWRpdFBvbGljeSBhZHREaXJlY3RFZGl0UG9saWN5ID0gbmV3IEFEVERpcmVjdEVkaXRQb2xpY3koKTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmFibGVkOwotICBwcm90ZWN0ZWQgQ2VudGVyZWRJY29uRmlndXJlIGJhY2tUb1NjaGVtYTsKLSAgcHJvdGVjdGVkIE1vdXNlTGlzdGVuZXIgbW91c2VMaXN0ZW5lcjsKLQotICBwdWJsaWMgQmFja1RvU2NoZW1hRWRpdFBhcnQoQURUTXVsdGlQYWdlRWRpdG9yIG11bHRpcGFnZUVkaXRvcikKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5tdWx0aXBhZ2VFZGl0b3IgPSBtdWx0aXBhZ2VFZGl0b3I7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgYmFja1RvU2NoZW1hID0gbmV3IENlbnRlcmVkSWNvbkZpZ3VyZSgpOwotICAgIGJhY2tUb1NjaGVtYS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgIGJhY2tUb1NjaGVtYS5pbWFnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJlbGNsMTYvc2NoZW1hdmlld19jby5naWYiKTsKLSAgICAvLyBUT0RPLCBsb29rIGF0IHdoeSB0aGUgZWRpdHBvbGljeSBkb2Vzbid0IHdvcmsKLSAgICBtb3VzZUxpc3RlbmVyID0gbmV3IE1vdXNlTGlzdGVuZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2tlZChvcmcuZWNsaXBzZS5kcmF3MmQuTW91c2VFdmVudCBtZSkKLSAgICAgIHsKLQotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQob3JnLmVjbGlwc2UuZHJhdzJkLk1vdXNlRXZlbnQgbWUpCi0gICAgICB7Ci0gICAgICAgIGlmIChpc0VuYWJsZWQpCi0gICAgICAgIHsKLSAgICAgICAgICBhZGRGZWVkYmFjaygpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQob3JnLmVjbGlwc2UuZHJhdzJkLk1vdXNlRXZlbnQgbWUpCi0gICAgICB7Ci0gICAgICAgIGlmIChpc0VuYWJsZWQpCi0gICAgICAgIHsKLSAgICAgICAgICByZW1vdmVGZWVkYmFjaygpOwotICAgICAgICAgIFNldElucHV0VG9HcmFwaFZpZXcgYWN0aW9uID0gbmV3IFNldElucHV0VG9HcmFwaFZpZXcobXVsdGlwYWdlRWRpdG9yLCBnZXRNb2RlbCgpKTsKLSAgICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICAgIGJhY2tUb1NjaGVtYS5hZGRNb3VzZUxpc3RlbmVyKG1vdXNlTGlzdGVuZXIpOwotICAgIHJldHVybiBiYWNrVG9TY2hlbWE7Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gaXNFbmFibGVkKQotICB7Ci0gICAgdGhpcy5pc0VuYWJsZWQgPSBpc0VuYWJsZWQ7Ci0gICAgcmVmcmVzaFZpc3VhbHMoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsIGFkdERpcmVjdEVkaXRQb2xpY3kpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIG5ldyBBRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3koKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQgfHwgcmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfT1BFTikKLSAgICB7Ci0gICAgICBTZXRJbnB1dFRvR3JhcGhWaWV3IGFjdGlvbiA9IG5ldyBTZXRJbnB1dFRvR3JhcGhWaWV3KG11bHRpcGFnZUVkaXRvciwgZ2V0TW9kZWwoKSk7Ci0gICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgICBDZW50ZXJlZEljb25GaWd1cmUgZmlndXJlID0gKENlbnRlcmVkSWNvbkZpZ3VyZSkgZ2V0RmlndXJlKCk7Ci0gICAgaWYgKGlzRW5hYmxlZCkKLSAgICB7Ci0gICAgICBiYWNrVG9TY2hlbWEuaW1hZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigiZWxjbDE2L3NjaGVtYXZpZXdfY28uZ2lmIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBiYWNrVG9TY2hlbWEuaW1hZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigiZGxjbDE2L3NjaGVtYXZpZXdfY28uZ2lmIik7Ci0gICAgfQotICAgIGZpZ3VyZS5yZWZyZXNoKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsKLSAgICBDZW50ZXJlZEljb25GaWd1cmUgZmlndXJlID0gKENlbnRlcmVkSWNvbkZpZ3VyZSkgZ2V0RmlndXJlKCk7Ci0gICAgZmlndXJlLnNldE1vZGUoQ2VudGVyZWRJY29uRmlndXJlLlNFTEVDVEVEKTsKLSAgICBmaWd1cmUucmVmcmVzaCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKQotICB7Ci0gICAgQ2VudGVyZWRJY29uRmlndXJlIGZpZ3VyZSA9IChDZW50ZXJlZEljb25GaWd1cmUpIGdldEZpZ3VyZSgpOwotICAgIGZpZ3VyZS5zZXRNb2RlKENlbnRlcmVkSWNvbkZpZ3VyZS5OT1JNQUwpOwotICAgIGZpZ3VyZS5yZWZyZXNoKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICB7Ci0gICAgYmFja1RvU2NoZW1hLnJlbW92ZU1vdXNlTGlzdGVuZXIobW91c2VMaXN0ZW5lcik7Ci0gICAgc3VwZXIuZGVhY3RpdmF0ZSgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQmFzZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0Jhc2VFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTdlNjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQmFzZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5ab29tTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5ab29tTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuRmlsZVN0b3JlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JRmVlZGJhY2tIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JRmlndXJlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuQ29tbW9uTXVsdGlQYWdlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0TGlzdGVuZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGltcGxlbWVudHMgSUFjdGlvblByb3ZpZGVyLCBJQURUT2JqZWN0TGlzdGVuZXIsIElGZWVkYmFja0hhbmRsZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9BQ1RJT05fQVJSQVkgPSB7fTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTZWxlY3RlZCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNGb2N1cyA9IGZhbHNlOwotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNIaWdoQ29udHJhc3QgPSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRIaWdoQ29udHJhc3QoKTsKLSAgcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBhY2Nlc3NpYmxlUGFydDsKLSAgCi0gIHB1YmxpYyBJRmlndXJlRmFjdG9yeSBnZXRGaWd1cmVGYWN0b3J5KCkKLSAgewotICAgIEVkaXRQYXJ0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0Vmlld2VyKCkuZ2V0RWRpdFBhcnRGYWN0b3J5KCk7Ci0gICAgQXNzZXJ0LmlzVHJ1ZShmYWN0b3J5IGluc3RhbmNlb2YgSUZpZ3VyZUZhY3RvcnksICJFZGl0UGFydEZhY3RvcnkgbXVzdCBiZSBhbiBpbnN0YW5jZW9mIG9mIElGaWd1cmVGYWN0b3J5Iik7ICAgICAvLyROT04tTkxTLTEkCi0gICAgcmV0dXJuIChJRmlndXJlRmFjdG9yeSlmYWN0b3J5OyAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIE9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUFjdGlvblByb3ZpZGVyKQotICAgIHsKLSAgICAgIHJldHVybiAoKElBY3Rpb25Qcm92aWRlciltb2RlbCkuZ2V0QWN0aW9ucyhvYmplY3QpOwotICAgIH0gIAotICAgIHJldHVybiBFTVBUWV9BQ1RJT05fQVJSQVk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGFkZEFjdGlvbnNUb0xpc3QoTGlzdCBsaXN0LCBJQWN0aW9uW10gYWN0aW9ucykKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBsaXN0LmFkZChhY3Rpb25zW2ldKTsKLSAgICB9ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWN0aXZhdGUoKQotICB7Ci0gICAgc3VwZXIuYWN0aXZhdGUoKTsKLSAgICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgewotICAgICAgSUFEVE9iamVjdCBvYmplY3QgPSAoSUFEVE9iamVjdCltb2RlbDsKLSAgICAgIG9iamVjdC5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgICAKLSAgICBpZiAoZ2V0Wm9vbU1hbmFnZXIoKSAhPSBudWxsKQotICAgICAgZ2V0Wm9vbU1hbmFnZXIoKS5hZGRab29tTGlzdGVuZXIoem9vbUxpc3RlbmVyKTsKLQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgewotICAgICAgSUFEVE9iamVjdCBvYmplY3QgPSAoSUFEVE9iamVjdCltb2RlbDsKLSAgICAgIG9iamVjdC51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgfSAgIAotICAgIAotICAgIGlmIChnZXRab29tTWFuYWdlcigpICE9IG51bGwpCi0gICAgICBnZXRab29tTWFuYWdlcigpLnJlbW92ZVpvb21MaXN0ZW5lcih6b29tTGlzdGVuZXIpOyAgICAKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgICB9ICAKLSAgfSAgCi0gIAotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgcmVmcmVzaCgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgIAotICAgIGJvb2xlYW4gZG9VcGRhdGVEZXNpZ24gPSBkb1VwZGF0ZURlc2lnbigpOwotICAgIGlmIChkb1VwZGF0ZURlc2lnbikKLSAgICB7Ci0gICAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKQotICB7Ci0gICAgaXNTZWxlY3RlZCA9IHRydWU7Ci0gICAgcmVmcmVzaFZpc3VhbHMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkKLSAgewotICAgIGlzU2VsZWN0ZWQgPSBmYWxzZTsKLSAgICByZWZyZXNoVmlzdWFscygpOwotICB9Ci0gIAotICBwdWJsaWMgWm9vbU1hbmFnZXIgZ2V0Wm9vbU1hbmFnZXIoKQotICB7Ci0gICAgcmV0dXJuICgoU2NhbGFibGVSb290RWRpdFBhcnQpZ2V0Um9vdCgpKS5nZXRab29tTWFuYWdlcigpOwotICB9Ci0gIAotICBwdWJsaWMgUmVjdGFuZ2xlIGdldFpvb21lZEJvdW5kcyhSZWN0YW5nbGUgcikKLSAgewotICAgIGRvdWJsZSBmYWN0b3IgPSBnZXRab29tTWFuYWdlcigpLmdldFpvb20oKTsKLSAgICBpbnQgeCA9IChpbnQpTWF0aC5yb3VuZChyLnggKiBmYWN0b3IpOwotICAgIGludCB5ID0gKGludClNYXRoLnJvdW5kKHIueSAqIGZhY3Rvcik7Ci0gICAgaW50IHdpZHRoID0gKGludClNYXRoLnJvdW5kKHIud2lkdGggKiBmYWN0b3IpOwotICAgIGludCBoZWlnaHQgPSAoaW50KU1hdGgucm91bmQoci5oZWlnaHQgKiBmYWN0b3IpOwotCi0gICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgWm9vbUxpc3RlbmVyIHpvb21MaXN0ZW5lciA9IG5ldyBab29tTGlzdGVuZXIoKQotICB7Ci0gICAgcHVibGljIHZvaWQgem9vbUNoYW5nZWQoZG91YmxlIHpvb20pCi0gICAgewotICAgICAgaGFuZGxlWm9vbUNoYW5nZWQoKTsKLSAgICB9Ci0gIH07Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlWm9vbUNoYW5nZWQoKQotICB7Ci0gICAgcmVmcmVzaFZpc3VhbHMoKTsKLSAgfQotCi0gIHB1YmxpYyBJRWRpdG9yUGFydCBnZXRFZGl0b3JQYXJ0KCkKLSAgewotICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBudWxsOwotICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICBpZiAod29ya2JlbmNoICE9IG51bGwpCi0gICAgewotICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICBpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLS8vICAgIEFzc2VydC5pc05vdE51bGwoZWRpdG9yUGFydCk7Ci0gICAgcmV0dXJuIGVkaXRvclBhcnQ7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LktFWSwgbmV3IEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3koKQotICAgIHsgICAgICAKLSAgICAgIHB1YmxpYyBFZGl0UGFydCBnZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICAgICAgewotICAgICAgICByZXR1cm4gZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KGVkaXRQYXJ0LCBkaXJlY3Rpb24pOyAgCi0gICAgICB9ICAgICAgICAgICAKLSAgICB9KTsgICAgICAgIAotICB9Ci0gIAotICAKLSAgcHVibGljIEVkaXRQYXJ0IGRvR2V0UmVsYXRpdmVFZGl0UGFydChFZGl0UGFydCBlZGl0UGFydCwgaW50IGRpcmVjdGlvbikKLSAgeyAgIAotICAgIHJldHVybiBudWxsOyAgICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpbGVSZWFkT25seSgpCi0gIHsKLSAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgaWYgKHdvcmtiZW5jaCAhPSBudWxsKQotICAgIHsKLSAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgICAgewotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgaWYgKGVkaXRvciAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgaWYgKCEoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0IHx8IGVkaXRvcklucHV0IGluc3RhbmNlb2YgRmlsZVN0b3JlRWRpdG9ySW5wdXQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvLyBGb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxODI4MQotICAvLyBEb24ndCB3YW50IHRvIHJlZnJlc2ggdGhlIGRlc2lnbiB3aGVuIGNoYW5nZXMgYXJlIG1hZGUgaW4gdGhlIHNvdXJjZSB2aWV3LgotICBwcm90ZWN0ZWQgYm9vbGVhbiBkb1VwZGF0ZURlc2lnbigpCi0gIHsKLSAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgaWYgKHdvcmtiZW5jaCAhPSBudWxsKQotICAgIHsKLSAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgICAgewotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgIGlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgQ29tbW9uTXVsdGlQYWdlRWRpdG9yKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENvbW1vbk11bHRpUGFnZUVkaXRvciBlZGl0b3IgPSAoQ29tbW9uTXVsdGlQYWdlRWRpdG9yKSBlZGl0b3JQYXJ0OwotICAgICAgICAgICAgR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChHcmFwaGljYWxWaWV3ZXIpZWRpdG9yLmdldEFkYXB0ZXIoR3JhcGhpY2FsVmlld2VyLmNsYXNzKTsKLSAgICAgICAgICAgIC8vIE5lZWQgdG8gZW5zdXJlIHRoaXMgaXMgdGhlIHNhbWUgZWRpdG9yIHdlIGFyZSB3b3JraW5nIHdpdGggc2luY2UgdGhlIGFjdGl2ZSBlZGl0b3IgbWF5IG5vdCBiZSAKLSAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50LCBlZy4gYXQgc3RhcnR1cCwgdGhlcmUgY2FuIGJlIGFub3RoZXIgWFNEIEVkaXRvciBvcGVuIG9uIHRoZSBzb3VyY2UgcGFnZSwgc28gd2UgY291bGQgZW5kCi0gICAgICAgICAgICAvLyB1cCBub3QgcG9wdWxhdGluZyB0aGUgZGVzaWduIHZpZXcgaW5pdGFsbHkKLSAgICAgICAgICAgIGlmIChnZXRWaWV3ZXIoKSA9PSB2aWV3ZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIElmIHNvdXJjZSBwYWdlIGlzIGFjdGl2ZSwgZG9uJ3QgdXBkYXRlIHRoZSBkZXNpZ24KLSAgICAgICAgICAgICAgcmV0dXJuICFlZGl0b3IuaXNTb3VyY2VQYWdlQWN0aXZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAgICogVHJ5IHRvIGdldCB0aGUgaXRhbGljIGZvbnQgZm9yIHRoZSBjdXJyZW50IGZvbnQKLSAgICogQHBhcmFtIGZvbnQKLSAgICogQHJldHVybgotICAgKi8KLSAgcHJvdGVjdGVkIEZvbnQgZ2V0SXRhbGljRm9udChGb250IGZvbnQpCi0gIHsKLSAgICBpZiAoZm9udCAhPSBudWxsICYmICFmb250LmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBGb250RGF0YVtdIGZkID0gZm9udC5nZXRGb250RGF0YSgpOwotICAgICAgaWYgKGZkLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIGZkWzBdLnNldFN0eWxlKGZkWzBdLmdldFN0eWxlKCkgfCBTV1QuSVRBTElDKTsKLSAgICAgICAgcmV0dXJuIG5ldyBGb250KGZvbnQuZ2V0RGV2aWNlKCksIGZkKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZvbnQ7Ci0gIH0KLSAgcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCQotCSAgaWYgKGFjY2Vzc2libGVQYXJ0ID09bnVsbCkKLQkgIHsKLQkJICBhY2Nlc3NpYmxlUGFydCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKXsKLQkJCi0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7CQkgCi0JCQkJZS5yZXN1bHQgPSBnZXRSZWFkZXJUZXh0KCk7Ci0JCQl9Ci0JCX07Ci0JICB9Ci0JICByZXR1cm4gYWNjZXNzaWJsZVBhcnQ7Ci0JfQotcHVibGljIFN0cmluZyBnZXRSZWFkZXJUZXh0KCkKLXsKLQkgIHJldHVybiAiIjsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQmFzZUZpZWxkRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQmFzZUZpZWxkRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQwOTc4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0Jhc2VGaWVsZEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRyYWdUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkxvY2F0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQuQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5FbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQuTGFiZWxDZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5MYWJlbEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0LlR5cGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkZvY3VzVHlwZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5JQURUVXBkYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JRmllbGRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5Db25uZWN0YWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5UYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5UYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzLkdyYXBoTm9kZURyYWdUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIEJhc2VGaWVsZEVkaXRQYXJ0IGV4dGVuZHMgQmFzZVR5cGVDb25uZWN0aW5nRWRpdFBhcnQgaW1wbGVtZW50cyBJTmFtZWRFZGl0UGFydCwgSUF1dG9EaXJlY3RFZGl0Ci17Ci0gIHByb3RlY3RlZCBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmlndXJlOwotICBwcm90ZWN0ZWQgQURURGlyZWN0RWRpdFBvbGljeSBhZHREaXJlY3RFZGl0UG9saWN5ID0gbmV3IEFEVERpcmVjdEVkaXRQb2xpY3koKTsKLSAgcHJvdGVjdGVkIFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uIGNvbm5lY3Rpb25GZWVkYmFja0ZpZ3VyZTsKLSAgCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsgICAgICAgICAgCi0gICAgSUZpZWxkRmlndXJlIGZpZ3VyZSA9IGdldEZpZ3VyZUZhY3RvcnkoKS5jcmVhdGVGaWVsZEZpZ3VyZShnZXRNb2RlbCgpKTsgICAgCi0gICAgZmlndXJlLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfQotICAKLSAgcHVibGljIElGaWVsZEZpZ3VyZSBnZXRGaWVsZEZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gKElGaWVsZEZpZ3VyZSlmaWd1cmU7Ci0gIH0KLSAKLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3VsZERyYXdDb25uZWN0aW9uKCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgCi0gICAgLy8gRm9yIG5vdyB3ZSBvbmx5IHdhbnQgdG8gcHJvZHVjZSBvdXRib3VuZCBsaW5lcyBmcm9tIGEgRmllbGQgdG8gYSBUeXBlCi0gICAgLy8gd2hlbiB0aGUgZmllbGQgaW4gY29udGFpbmVkIGluIHRoZSAnZm9jdXMnIGVkaXQgcGFydCAgICAKLSAgICBmb3IgKEVkaXRQYXJ0IHBhcmVudCA9IGdldFBhcmVudCgpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpKQotICAgIHsgIAotICAgICAgaWYgKHBhcmVudC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgRm9jdXNUeXBlQ29sdW1uKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgCi0gICAgfSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwcml2YXRlIEVkaXRQYXJ0IGdldFRhcmdldEVkaXRQYXJ0KElUeXBlIHR5cGUpCi0gIHsKLSAgICBDb2x1bW5FZGl0UGFydCBjb2x1bW5FZGl0UGFydCA9IG51bGw7Ci0gICAgZm9yIChFZGl0UGFydCBlZGl0UGFydCA9IHRoaXM7IGVkaXRQYXJ0ICE9IG51bGw7IGVkaXRQYXJ0ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCkpCi0gICAgewotICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29sdW1uRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIGNvbHVtbkVkaXRQYXJ0ID0gKENvbHVtbkVkaXRQYXJ0KWVkaXRQYXJ0OwotICAgICAgICBicmVhazsKLSAgICAgIH0gIAotICAgIH0gICAgIAotICAgIGlmIChjb2x1bW5FZGl0UGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIGdldCB0aGUgbmV4dCBjb2x1bW4KLSAgICAgIEVkaXRQYXJ0IHBhcmVudCA9IGNvbHVtbkVkaXRQYXJ0LmdldFBhcmVudCgpOwotICAgICAgTGlzdCBjb2x1bW5zID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0gICAgICBpbnQgaW5kZXggPSBjb2x1bW5zLmluZGV4T2YoY29sdW1uRWRpdFBhcnQpOwotICAgICAgaWYgKGluZGV4ICsgMSA8IGNvbHVtbnMuc2l6ZSgpKQotICAgICAgeyAgCi0gICAgICAgIEVkaXRQYXJ0IG5leHRDb2x1bW4gPSAoRWRpdFBhcnQpY29sdW1ucy5nZXQoaW5kZXggKyAxKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbmV4dENvbHVtbi5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBFZGl0UGFydCBjaGlsZCA9IChFZGl0UGFydClpLm5leHQoKTsKLSAgICAgICAgICBpZiAoY2hpbGQuZ2V0TW9kZWwoKSA9PSB0eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZDsKLSAgICAgICAgICB9ICAKLSAgICAgICAgfSAgCi0gICAgICB9ICAKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRWRpdFBhcnQgZ2V0VGFyZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCkKLSAgewotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7IAotICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpZ2V0TW9kZWwoKTsKLSAgICBJVHlwZSB0eXBlID0gZmllbGQuZ2V0VHlwZSgpOwotICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgeyAgICAgIAotICAgICAgcmVzdWx0ID0gZ2V0VGFyZ2V0RVAodHlwZSk7IC8vZ2V0VGFyZ2V0RWRpdFBhcnQodHlwZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBEbyBub3Qgb3ZlcnJpZGUKLSAgICogQHBhcmFtIHR5cGUKLSAgICogQHJldHVybgotICAgKi8KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGdldFRhcmdldEVQKElUeXBlIHR5cGUpCi0gIHsKLSAgICByZXR1cm4gZ2V0VGFyZ2V0RWRpdFBhcnQodHlwZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKCkKLSAgewotICAgIGNvbm5lY3Rpb25GaWd1cmUgPSBudWxsOyAgIAotICAgIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmVmZXJlbmNlVHlwZVBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClnZXRUYXJnZXRDb25uZWN0aW9uRWRpdFBhcnQoKTsKLSAgICBpZiAocmVmZXJlbmNlVHlwZVBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlID0gbmV3IFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uKCk7Ci0KLSAgICAgIGlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKSA9PSByZWZlcmVuY2VUeXBlUGFydC5nZXRGaWd1cmUoKSkKLSAgICAgIHsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRTb3VyY2VBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcihnZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLkxFRlQsIDEpKTsgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0U291cmNlQW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5SSUdIVCwgNSkpOwotICAgICAgfQotICAgICAgaW50IHRhcmdldEFuY2hvcllPZmZzZXQgPSA4OwotCi0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldFRhcmdldEFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKHJlZmVyZW5jZVR5cGVQYXJ0LmdldEZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuSEVBREVSX0xFRlQsIDAsIHRhcmdldEFuY2hvcllPZmZzZXQpKTsgCi0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldEhpZ2hsaWdodChmYWxzZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNvbm5lY3Rpb25GaWd1cmU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLCBhZHREaXJlY3RFZGl0UG9saWN5KTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBuZXcgQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5KCkpOwotICB9Ci0gIAotICBwdWJsaWMgRWRpdFBhcnQgZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsgICAgICAgIAotICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuRUFTVCkKLSAgICB7ICAgIAotICAgICAgcmVzdWx0ID0gZ2V0VGFyZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5XRVNUKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdldFBhcmVudCgpLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFNlY3Rpb25FZGl0UGFydCkKLSAgICAgICAgewotICAgICAgICAgIFNlY3Rpb25FZGl0UGFydCBncm91cHMgPSAoU2VjdGlvbkVkaXRQYXJ0KSBjaGlsZDsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBncm91cHMuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBncm91cENoaWxkID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICBFZGl0UGFydCBjb25uZWN0YWJsZSA9IGdldFBhcmVudENvbm5lY3RhYmxlRWRpdFBhcnQoKEVkaXRQYXJ0KWdyb3VwQ2hpbGQpOwotICAgICAgICAgICAgaWYgKGNvbm5lY3RhYmxlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGNvbm5lY3RhYmxlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSB0aGlzOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gc3VwZXIuZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KGVkaXRQYXJ0LCBkaXJlY3Rpb24pOwotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIHJlc3VsdCA9ICgoQmFzZUVkaXRQYXJ0KWdldFBhcmVudCgpKS5kb0dldFJlbGF0aXZlRWRpdFBhcnQoZWRpdFBhcnQsIGRpcmVjdGlvbik7Ci0gICAgICB9ICAKLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OyAgICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgQ29ubmVjdGFibGVFZGl0UGFydCBnZXRQYXJlbnRDb25uZWN0YWJsZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbm5lY3RhYmxlKQotICB7Ci0gICAgaWYgKGNvbm5lY3RhYmxlIGluc3RhbmNlb2YgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkKLSAgICB7Ci0gICAgICBUYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIgc3BhY2UgPSAoVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyKSAoKFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpY29ubmVjdGFibGUpLmdldE1vZGVsKCk7Ci0gICAgICBpZiAoc3BhY2UuZ2V0QWRhcHRlcigpID09IHRoaXMuZ2V0TW9kZWwoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIChDb25uZWN0YWJsZUVkaXRQYXJ0KWNvbm5lY3RhYmxlOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb25uZWN0YWJsZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgT2JqZWN0IGNoaWxkID0gaS5uZXh0KCk7Ci0gICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb25uZWN0YWJsZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBDb25uZWN0YWJsZUVkaXRQYXJ0IHIgPSBnZXRQYXJlbnRDb25uZWN0YWJsZUVkaXRQYXJ0KChFZGl0UGFydCljaGlsZCk7Ci0gICAgICAgIGlmIChyICE9IG51bGwpIHJldHVybiByOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBUYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIgc3BhY2UgPSAoVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyKSAoKFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpY2hpbGQpLmdldE1vZGVsKCk7Ci0gICAgICAgIGlmIChzcGFjZS5nZXRBZGFwdGVyKCkgPT0gdGhpcy5nZXRNb2RlbCgpICYmIGNvbm5lY3RhYmxlIGluc3RhbmNlb2YgQ29ubmVjdGFibGVFZGl0UGFydCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiAoQ29ubmVjdGFibGVFZGl0UGFydCljb25uZWN0YWJsZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoVmlzdWFscygpOwotICAgIElGaWVsZEZpZ3VyZSBmaWd1cmUgPSBnZXRGaWVsZEZpZ3VyZSgpOwotICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpIGdldE1vZGVsKCk7Ci0gICAgCi0gICAgZmlndXJlLmdldE5hbWVMYWJlbCgpLnNldFRleHQoZmllbGQuZ2V0TmFtZSgpKTsKLSAgICBmaWd1cmUuZ2V0VHlwZUxhYmVsKCkuc2V0VGV4dChmaWVsZC5nZXRUeXBlTmFtZSgpKTsKLSAgICBmaWd1cmUucmVmcmVzaFZpc3VhbHMoZ2V0TW9kZWwoKSk7Ci0KLSAgICBmaWd1cmUucmVjb21wdXRlTGF5b3V0KCk7Ci0KLSAgICAoKEdyYXBoaWNhbEVkaXRQYXJ0KWdldFJvb3QoKSkuZ2V0RmlndXJlKCkuaW52YWxpZGF0ZVRyZWUoKTsKLSAgfQotCi0gIHB1YmxpYyBEcmFnVHJhY2tlciBnZXREcmFnVHJhY2tlcihSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICByZXR1cm4gbmV3IEdyYXBoTm9kZURyYWdUcmFja2VyKHRoaXMpOwotICB9Ci0gIAotICAvKgotICBwdWJsaWMgSUFjdGlvbltdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIC8vIHdoZW4gYSBGaWVsZEVkaXRQYXJ0IGlzIHNlbGVjdGVkIGl0IHByb3ZpZGVzIGl0J3Mgb3duIGFjdGlvbnMKLSAgICAvLyBhcyB3ZWxsIGFzIHRob3NlIG9mIGl0J3MgcGFyZW50ICd0eXBlJyBlZGl0IHBhcnQKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgRWRpdFBhcnQgY29tcGFydG1lbnQgPSBnZXRQYXJlbnQoKTsKLSAgICBpZiAoY29tcGFydG1lbnQgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIEVkaXRQYXJ0IHR5cGUgPSBjb21wYXJ0bWVudC5nZXRQYXJlbnQoKTsKLSAgICAgIGlmICh0eXBlICE9IG51bGwgJiYgdHlwZSBpbnN0YW5jZW9mIElBY3Rpb25Qcm92aWRlcikKLSAgICAgIHsKLSAgICAgICAgSUFjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gKElBY3Rpb25Qcm92aWRlcil0eXBlOwotICAgICAgICBhZGRBY3Rpb25zVG9MaXN0KGxpc3QsIHByb3ZpZGVyLmdldEFjdGlvbnMob2JqZWN0KSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGFkZEFjdGlvbnNUb0xpc3QobGlzdCwgc3VwZXIuZ2V0QWN0aW9ucyhvYmplY3QpKTsKLSAgICBJQWN0aW9uW10gcmVzdWx0ID0gbmV3IElBY3Rpb25bbGlzdC5zaXplKCldOwotICAgIGxpc3QudG9BcnJheShyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0qLwotICAKLSAgcHVibGljIExhYmVsIGdldE5hbWVMYWJlbEZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RmllbGRGaWd1cmUoKS5nZXROYW1lTGFiZWwoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGN1cnNvckxvY2F0aW9uKQotICB7Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkKLSAgeyAgCi0gICAgaWYgKCgoSUFEVE9iamVjdClnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkgfHwgaXNGaWxlUmVhZE9ubHkoKSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVHx8Ci0gICAgICAgIHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX09QRU4pCi0gICAgewotICAgICAgSUZpZWxkRmlndXJlIGZpZWxkRmlndXJlID0gZ2V0RmllbGRGaWd1cmUoKTsKLSAgICAgIE9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0gICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkKLSAgICAgIHsKLSAgICAgICAgTG9jYXRpb25SZXF1ZXN0IGxvY2F0aW9uUmVxdWVzdCA9IChMb2NhdGlvblJlcXVlc3QpcmVxdWVzdDsKLSAgICAgICAgUG9pbnQgcCA9IGxvY2F0aW9uUmVxdWVzdC5nZXRMb2NhdGlvbigpOwotICAgICAgIAotICAgICAgICBpZiAoaGl0VGVzdChmaWVsZEZpZ3VyZS5nZXRUeXBlTGFiZWwoKSwgcCkpCi0gICAgICAgIHsKLSAgICAgICAgICBUeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBUeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoKElGaWVsZCltb2RlbCwgdGhpcywgZmllbGRGaWd1cmUuZ2V0VHlwZUxhYmVsKCkpOwotICAgICAgICAgIFR5cGVVcGRhdGVDb21tYW5kIHR5cGVVcGRhdGVDb21tYW5kID0gbmV3IFR5cGVVcGRhdGVDb21tYW5kKCk7Ci0gICAgICAgICAgdHlwZVVwZGF0ZUNvbW1hbmQuc2V0RGVsZWdhdGUobWFuYWdlcik7Ci0gICAgICAgICAgYWR0RGlyZWN0RWRpdFBvbGljeS5zZXRVcGRhdGVDb21tYW5kKHR5cGVVcGRhdGVDb21tYW5kKTsKLSAgICAgICAgICBtYW5hZ2VyLnNob3coKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChoaXRUZXN0KGZpZWxkRmlndXJlLmdldE5hbWVMYWJlbCgpLCBwKSkKLSAgICAgICAgewotICAgICAgICAJZGlyZWN0RWRpdE5hbWVGaWVsZCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAJICBkaXJlY3RFZGl0TmFtZUZpZWxkKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBkaXJlY3RFZGl0TmFtZUZpZWxkKCkKLSAgewotICAgIGlmIChpc0ZpbGVSZWFkT25seSgpKSByZXR1cm47Ci0JICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCSAgSUZpZWxkRmlndXJlIGZpZWxkRmlndXJlID0gZ2V0RmllbGRGaWd1cmUoKTsKLSAgCWlmICggbW9kZWwgaW5zdGFuY2VvZiBJRmllbGQpIAotICAgIHsKLSAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpIG1vZGVsOwotICAgICAgaWYgKGZpZWxkLmlzUmVmZXJlbmNlKCkpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnRSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyID0gbmV3IEVsZW1lbnRSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcigoSUZpZWxkKSBtb2RlbCwgdGhpcywgZmllbGRGaWd1cmUuZ2V0TmFtZUxhYmVsKCkpOwotICAgICAgICBSZWZlcmVuY2VVcGRhdGVDb21tYW5kIGVsZW1lbnRVcGRhdGVDb21tYW5kID0gbmV3IFJlZmVyZW5jZVVwZGF0ZUNvbW1hbmQoKTsKLSAgICAgICAgZWxlbWVudFVwZGF0ZUNvbW1hbmQuc2V0RGVsZWdhdGUobWFuYWdlcik7Ci0gICAgICAgIGFkdERpcmVjdEVkaXRQb2xpY3kuc2V0VXBkYXRlQ29tbWFuZChlbGVtZW50VXBkYXRlQ29tbWFuZCk7Ci0gICAgICAgIG1hbmFnZXIuc2hvdygpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBMYWJlbEVkaXRNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTGFiZWxFZGl0TWFuYWdlcih0aGlzLCBuZXcgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcih0aGlzLCBudWxsKSk7Ci0gICAgICAgIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlciB3cmFwcGVyID0gbmV3IE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlcigpOwotICAgICAgICBhZHREaXJlY3RFZGl0UG9saWN5LnNldFVwZGF0ZUNvbW1hbmQod3JhcHBlcik7Ci0gICAgICAgIG1hbmFnZXIuc2hvdygpOwotICAgICAgfQotICAJfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkb0VkaXROYW1lKGJvb2xlYW4gYWRkRnJvbURlc2lnbikKLSAgewotICAgIGlmICghYWRkRnJvbURlc2lnbikgcmV0dXJuOwotICAgIAotLy8gICAgcmVtb3ZlRmVlZGJhY2soKTsKLQotICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gKChYU0RCYXNlQWRhcHRlcilnZXRNb2RlbCgpKS5nZXRUYXJnZXQoKTsKLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgUG9pbnQgcCA9IGdldE5hbWVMYWJlbEZpZ3VyZSgpLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgTGFiZWxFZGl0TWFuYWdlciBtYW5hZ2VyID0gbmV3IExhYmVsRWRpdE1hbmFnZXIoQmFzZUZpZWxkRWRpdFBhcnQudGhpcywgbmV3IExhYmVsQ2VsbEVkaXRvckxvY2F0b3IoQmFzZUZpZWxkRWRpdFBhcnQudGhpcywgcCkpOwotICAgICAgICAgIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlciB3cmFwcGVyID0gbmV3IE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlcigpOwotICAgICAgICAgIGFkdERpcmVjdEVkaXRQb2xpY3kuc2V0VXBkYXRlQ29tbWFuZCh3cmFwcGVyKTsKLSAgICAgICAgICBtYW5hZ2VyLnNob3coKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQotICB9Ci0gIAotICBwcm90ZWN0ZWQgY2xhc3MgTmFtZVVwZGF0ZUNvbW1hbmRXcmFwcGVyIGV4dGVuZHMgQ29tbWFuZCBpbXBsZW1lbnRzIElBRFRVcGRhdGVDb21tYW5kCi0gIHsKLSAgICBDb21tYW5kIGNvbW1hbmQ7Ci0gICAgcHJvdGVjdGVkIERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3Q7Ci0gICAgCi0gICAgcHVibGljIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlcigpCi0gICAgewotICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfTkFNRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdChEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KQotICAgIHsKLSAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgIHsKLSAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpZ2V0TW9kZWwoKTsKLSAgICAgIE9iamVjdCBuZXdWYWx1ZSA9IHJlcXVlc3QuZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCk7Ci0gICAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmQgPSBmaWVsZC5nZXRVcGRhdGVOYW1lQ29tbWFuZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgIH0KLSAgfQotICAKLSAgY2xhc3MgVHlwZVVwZGF0ZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIGltcGxlbWVudHMgSUFEVFVwZGF0ZUNvbW1hbmQKLSAgewotICAgIHByb3RlY3RlZCBDb21ib0JveENlbGxFZGl0b3JNYW5hZ2VyIGRlbGVnYXRlOwotICAgIHByb3RlY3RlZCBEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0OwotICAgIAotICAgIHB1YmxpYyBUeXBlVXBkYXRlQ29tbWFuZCgpCi0gICAgewotICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfVFlQRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVsZWdhdGUoQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlciBkZWxlZ2F0ZSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpCi0gICAgewotICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgewotICAgICAgaWYgKGRlbGVnYXRlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGRlbGVnYXRlLnBlcmZvcm1FZGl0KHJlcXVlc3QuZ2V0Q2VsbEVkaXRvcigpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkKLSAgICB7Ci0gICAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKWdldE1vZGVsKCk7Ci0gICAgICBPYmplY3QgbmV3VmFsdWUgPSAoKENDb21ibylyZXF1ZXN0LmdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCkpLmdldFRleHQoKTsKLSAgICAgIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICFuZXdWYWx1ZS5lcXVhbHMoZmllbGQuZ2V0VHlwZU5hbWUoKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBSZWZlcmVuY2VVcGRhdGVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCBpbXBsZW1lbnRzIElBRFRVcGRhdGVDb21tYW5kCi0gIHsKLQkgICAgcHJvdGVjdGVkIENvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXIgZGVsZWdhdGU7Ci0JICAgIHByb3RlY3RlZCBEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0OwotCSAgICAKLQkgICAgcHVibGljIFJlZmVyZW5jZVVwZGF0ZUNvbW1hbmQoKQotCSAgICB7Ci0JICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfRUxFTUVOVF9SRUZFUkVOQ0UpOwotCSAgICB9Ci0KLQkgICAgcHVibGljIHZvaWQgc2V0RGVsZWdhdGUoQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlciBkZWxlZ2F0ZSkKLQkgICAgewotCSAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3QoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkKLQkgICAgewotCSAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0JICAgIH0KLQotCSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLQkgICAgewotCSAgICAgIGlmIChkZWxlZ2F0ZSAhPSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIGRlbGVnYXRlLnBlcmZvcm1FZGl0KHJlcXVlc3QuZ2V0Q2VsbEVkaXRvcigpKTsKLQkgICAgICB9Ci0JICAgIH0KLQotCSAgICBwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkKLQkgICAgewotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCkKLSAgewotICAgIC8vIFB1dCBiYWNrIGNvbm5lY3Rpb24gZmlndXJlIHNvIGl0IHdvbid0IGdldCBvdmVybGF5ZWQgYnkgb3RoZXIgbm9uIGhpZ2hsaWdodGVkIGNvbm5lY3Rpb25zCi0gICAgaWYgKGNvbm5lY3Rpb25GaWd1cmUgIT0gbnVsbCAmJiAhaXNTZWxlY3RlZCkKLSAgICB7Ci0gICAgICBjb25uZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBuZXcgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24oKTsKLSAgICAgIGNvbm5lY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRTb3VyY2VBbmNob3IoY29ubmVjdGlvbkZpZ3VyZS5nZXRTb3VyY2VBbmNob3IoKSk7Ci0gICAgICBjb25uZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0VGFyZ2V0QW5jaG9yKGNvbm5lY3Rpb25GaWd1cmUuZ2V0VGFyZ2V0QW5jaG9yKCkpOwotICAgICAgY29ubmVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEhpZ2hsaWdodCh0cnVlKTsKLSAgICAgIGdldExheWVyKExheWVyQ29uc3RhbnRzLkZFRURCQUNLX0xBWUVSKS5hZGQoY29ubmVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLSAgICB9Ci0gICAgIHN1cGVyLmFkZEZlZWRiYWNrKCk7Ci0gICAgIGdldEZpZWxkRmlndXJlKCkuYWRkU2VsZWN0aW9uRmVlZGJhY2soKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKQotICB7Ci0gICAgaWYgKGNvbm5lY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbm5lY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRIaWdobGlnaHQoZmFsc2UpOwotICAgICAgZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuRkVFREJBQ0tfTEFZRVIpLnJlbW92ZShjb25uZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotICAgIH0KLSAgICBjb25uZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotICAgIHN1cGVyLnJlbW92ZUZlZWRiYWNrKCk7Ci0gICAgZ2V0RmllbGRGaWd1cmUoKS5yZW1vdmVTZWxlY3Rpb25GZWVkYmFjaygpOwotICB9Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZGVyVGV4dCgpCi0gIHsKLQkgIElGaWVsZEZpZ3VyZSBmaWVsZEZpZ3VyZSA9IGdldEZpZWxkRmlndXJlKCk7Ci0JICAKLQkgIFN0cmluZyBuYW1lPSIiOwotCSAgaWYgKGZpZWxkRmlndXJlLmdldE5hbWVMYWJlbCgpICE9bnVsbCYmIGZpZWxkRmlndXJlLmdldE5hbWVMYWJlbCgpLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkgIG5hbWUgKz1maWVsZEZpZ3VyZS5nZXROYW1lTGFiZWwoKS5nZXRUZXh0KCk7Ci0JICBpZiAoZmllbGRGaWd1cmUuZ2V0TmFtZUFubm90YXRpb25MYWJlbCgpICE9bnVsbCAmJiBmaWVsZEZpZ3VyZS5nZXROYW1lQW5ub3RhdGlvbkxhYmVsKCkuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0JCSAgbmFtZSArPSAiICIrZmllbGRGaWd1cmUuZ2V0TmFtZUFubm90YXRpb25MYWJlbCgpLmdldFRleHQoKTsKLQkgIGlmIChmaWVsZEZpZ3VyZS5nZXRUeXBlTGFiZWwoKSAhPW51bGwgJiYgZmllbGRGaWd1cmUuZ2V0VHlwZUxhYmVsKCkuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0JCSAgbmFtZSArPSAiIHR5cGUgIitmaWVsZEZpZ3VyZS5nZXRUeXBlTGFiZWwoKS5nZXRUZXh0KCk7Ci0JICBpZiAoZmllbGRGaWd1cmUuZ2V0VHlwZUFubm90YXRpb25MYWJlbCgpICE9bnVsbCAmJiBmaWVsZEZpZ3VyZS5nZXRUeXBlQW5ub3RhdGlvbkxhYmVsKCkuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+MCkKLQkJICBuYW1lICs9ICIgIitmaWVsZEZpZ3VyZS5nZXRUeXBlQW5ub3RhdGlvbkxhYmVsKCkuZ2V0VGV4dCgpOwotCSAgcmV0dXJuIG5hbWU7Ci0KLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0Jhc2VUeXBlQ29ubmVjdGluZ0VkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0Jhc2VUeXBlQ29ubmVjdGluZ0VkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYmI4ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9CYXNlVHlwZUNvbm5lY3RpbmdFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUZlZWRiYWNrSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLklBRFRVcGRhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzb21lIGJhc2UgZnVuY3Rpb24gdG8gZW5hYmxlIGRyYXdpbmcgY29ubmVjdGlvbnMgdG8gYSByZWZlcmVuY2VkIHR5cGUKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlVHlwZUNvbm5lY3RpbmdFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydCBpbXBsZW1lbnRzIElGZWVkYmFja0hhbmRsZXIsIElDb25uZWN0aW9uQ29udGFpbmVyCi17Ci0gIHByaXZhdGUgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZpZ3VyZTsgIAotICAKLSAgcHVibGljIHZvaWQgYWN0aXZhdGUoKQotICB7Ci0gICAgc3VwZXIuYWN0aXZhdGUoKTsgICAgICAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gIHsKLSAgICBkZWFjdGl2YXRlQ29ubmVjdGlvbigpOwotICAgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVmcmVzaENvbm5lY3Rpb25zKCkKLSAgewotICAgIGRlYWN0aXZhdGVDb25uZWN0aW9uKCk7ICAgICAKLSAgICBhY3RpdmF0ZUNvbm5lY3Rpb24oKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFjdGl2YXRlQ29ubmVjdGlvbigpCi0gIHsgICAgCi0gICAgLy8gSWYgYXBwcm9wcmlhdGUsIGNyZWF0ZSBvdXIgY29ubmVjdGlvbkZpZ3VyZSBhbmQgYWRkIGl0IHRvIHRoZSBhcHByb3ByaWF0ZSBsYXllcgotICAgIGlmIChjb25uZWN0aW9uRmlndXJlID09IG51bGwgJiYgc2hvdWxkRHJhd0Nvbm5lY3Rpb24oKSkKLSAgICB7Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiYWN0aXZhdGVlQ29ubmVjdGlvbigpLXByZToiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAgICAgICAgICAgCi0gICAgICBjb25uZWN0aW9uRmlndXJlID0gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpOwotICAgICAgaWYgKGNvbm5lY3Rpb25GaWd1cmUgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICAvLyBBZGQgb3VyIGVkaXRwb2xpY3kgYXMgYSBsaXN0ZW5lciBvbiB0aGUgY29ubmVjdGlvbiwgc28gaXQgY2FuIHN0YXkgaW4gc3luY2gKLSAgICAgICAgLy9jb25uZWN0aW9uRmlndXJlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKEF0dHJpYnV0ZVNlbGVjdGlvbkZlZWRiYWNrUG9saWN5KSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpKTsKLSAgICAgICAgLy9jb25uZWN0aW9uRmlndXJlLmFkZE1vdXNlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIGdldExheWVyKExheWVyQ29uc3RhbnRzLkNPTk5FQ1RJT05fTEFZRVIpLmFkZChjb25uZWN0aW9uRmlndXJlKTsKLSAgICAgIH0gIAotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZGVhY3RpdmF0ZUNvbm5lY3Rpb24oKQotICB7Ci0gICAgLy8gaWYgd2UgaGF2ZSBhIGNvbm5lY3Rpb24sIHJlbW92ZSBpdAotICAgIGlmIChjb25uZWN0aW9uRmlndXJlICE9IG51bGwpCi0gICAgewotICAgICAgZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuQ09OTkVDVElPTl9MQVlFUikucmVtb3ZlKGNvbm5lY3Rpb25GaWd1cmUpOwotICAgICAgLy8gUmVtb3ZlIG91ciBlZGl0cG9saWN5IGxpc3RlbmVyKHMpCi0gICAgICAvL2Nvbm5lY3Rpb25GaWd1cmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigoQXR0cmlidXRlU2VsZWN0aW9uRmVlZGJhY2tQb2xpY3kpIGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSkpOwotICAgICAgLy9jb25uZWN0aW9uRmlndXJlLnJlbW92ZU1vdXNlTGlzdGVuZXIodGhpcyk7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlID0gbnVsbDsKLSAgICB9Ci0gIH0gIAotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRHJhd0Nvbm5lY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBhYnN0cmFjdCBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKCk7Ci0gIAotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsKLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0SGlnaGxpZ2h0KHRydWUpOwotICAgIH0KLSAgICBzdXBlci5hZGRGZWVkYmFjaygpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsKLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0SGlnaGxpZ2h0KGZhbHNlKTsKLSAgICB9Ci0gICAgc3VwZXIucmVtb3ZlRmVlZGJhY2soKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGNsYXNzIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlciBleHRlbmRzIENvbW1hbmQgaW1wbGVtZW50cyBJQURUVXBkYXRlQ29tbWFuZAotICB7Ci0gICAgQ29tbWFuZCBjb21tYW5kOwotICAgIHByb3RlY3RlZCBEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0OwotICAgIAotICAgIHB1YmxpYyBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIoKQotICAgIHsKLSAgICAgIHN1cGVyKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX05BTUUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3QoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkKLSAgICB7Ci0gICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICB7Ci0gICAgICBJVHlwZSBpVHlwZSA9IChJVHlwZSlnZXRNb2RlbCgpOwotICAgICAgT2JqZWN0IG5ld1ZhbHVlID0gcmVxdWVzdC5nZXRDZWxsRWRpdG9yKCkuZ2V0VmFsdWUoKTsKLSAgICAgIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZCA9IGlUeXBlLmdldFVwZGF0ZU5hbWVDb21tYW5kKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgfQotICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaGl0VGVzdChJRmlndXJlIHRhcmdldCwgUG9pbnQgbG9jYXRpb24pCi0gIHsKLSAgICBSZWN0YW5nbGUgYiA9IHRhcmdldC5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0gICAgdGFyZ2V0LnRyYW5zbGF0ZVRvQWJzb2x1dGUoYik7ICAKLSAgICByZXR1cm4gYi5jb250YWlucyhsb2NhdGlvbik7Ci0gIH0gICAKLSAgCi0gIHB1YmxpYyBFZGl0UGFydCBkb0dldFJlbGF0aXZlRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQsIGludCBkaXJlY3Rpb24pCi0gIHsKLSAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOyAgICAgICAgCi0gICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5XRVNUKQotICAgIHsgICAgCi0gICAgICByZXN1bHQgPSBnZXRDb25uZWN0aW9uRWRpdFBhcnQoUG9zaXRpb25Db25zdGFudHMuV0VTVCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5FQVNUKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldENvbm5lY3Rpb25FZGl0UGFydChQb3NpdGlvbkNvbnN0YW50cy5FQVNUKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsgICAgICAgICAgICAKLSAgfSAgICAgICAgCi0gIAotICBwcml2YXRlIEVkaXRQYXJ0IGdldENvbm5lY3Rpb25FZGl0UGFydChpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgLy8gZmluZCB0aGUgZmlyc3QgY29ubmVjdGlvbiB0aGF0IHRhcmdldHMgdGhpcyBlZGl0UGFydAotICAgIC8vIG5hdmlnYXRlIGJhY2t3YXJkIGFsb25nIHRoZSBjb25uZWN0aW9uICh0byB0aGUgbGVmdCkgdG8gZmluZCB0aGUgc291cmNlIGVkaXQgcGFydAotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuQ09OTkVDVElPTl9MQVlFUikuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEZpZ3VyZSBmaWd1cmUgPSAoRmlndXJlKWkubmV4dCgpOwotICAgICAgaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uKQotICAgICAgewotICAgICAgICBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiB0eXBlUmVmZXJlbmNlQ29ubmVjdGlvbiA9IChUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbilmaWd1cmU7Ci0gICAgICAgIENvbm5lY3Rpb25BbmNob3IgdGhpc0FuY2hvciA9IG51bGw7Ci0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuRUFTVCkKLSAgICAgICAgewotICAgICAgICAgIHRoaXNBbmNob3IgPSB0eXBlUmVmZXJlbmNlQ29ubmVjdGlvbi5nZXRTb3VyY2VBbmNob3IoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuV0VTVCkKLSAgICAgICAgewotICAgICAgICAgIHRoaXNBbmNob3IgPSB0eXBlUmVmZXJlbmNlQ29ubmVjdGlvbi5nZXRUYXJnZXRBbmNob3IoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGhpc0FuY2hvciAhPSBudWxsICYmIHRoaXNBbmNob3IuZ2V0T3duZXIoKSA9PSBnZXRGaWd1cmUoKSkKLSAgICAgICAgewotICAgICAgICAgIENvbm5lY3Rpb25BbmNob3Igb3V0QW5jaG9yID0gbnVsbDsKLSAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1QpCi0gICAgICAgICAgewotICAgICAgICAgICAgb3V0QW5jaG9yID0gdHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24uZ2V0VGFyZ2V0QW5jaG9yKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5XRVNUKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG91dEFuY2hvciA9IHR5cGVSZWZlcmVuY2VDb25uZWN0aW9uLmdldFNvdXJjZUFuY2hvcigpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBpZiAob3V0QW5jaG9yICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgSUZpZ3VyZSBzb3VyY2VGaWd1cmUgPSBvdXRBbmNob3IuZ2V0T3duZXIoKTsgICAgICAgICAgCi0gICAgICAgICAgICBFZGl0UGFydCBwYXJ0ID0gbnVsbDsKLSAgICAgICAgICAgIHdoaWxlIChwYXJ0ID09IG51bGwgJiYgc291cmNlRmlndXJlICE9IG51bGwpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwYXJ0ID0gKEVkaXRQYXJ0KWdldFZpZXdlcigpLmdldFZpc3VhbFBhcnRNYXAoKS5nZXQoc291cmNlRmlndXJlKTsKLSAgICAgICAgICAgICAgc291cmNlRmlndXJlID0gc291cmNlRmlndXJlLmdldFBhcmVudCgpOwotICAgICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgICAgIHJlc3VsdCA9IHBhcnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gIAotICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICB9ICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQm94RWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQm94RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlhODVkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0JveEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkNvbXBhcnRtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuU2ltcGxlRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzLkJveEZpZ3VyZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJveEVkaXRQYXJ0IGV4dGVuZHMgQmFzZVR5cGVDb25uZWN0aW5nRWRpdFBhcnQgLy9JRmVlZGJhY2tIYW5kbGVyCi17ICAKLSAgcHJvdGVjdGVkIExpc3QgY29tcGFydG1lbnRMaXN0ID0gbnVsbDsKLSAgcHJvdGVjdGVkIFNpbXBsZURpcmVjdEVkaXRQb2xpY3kgc2ltcGxlRGlyZWN0RWRpdFBvbGljeSA9IG5ldyBTaW1wbGVEaXJlY3RFZGl0UG9saWN5KCk7Ci0KLSAgcHJvdGVjdGVkIENvbXBhcnRtZW50W10gZ2V0Q29tcGFydG1lbnRzKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgQm94RmlndXJlIGZpZ3VyZSA9IG5ldyBCb3hGaWd1cmUoKTsKLSAgICBMaW5lQm9yZGVyIGJveExpbmVCb3JkZXIgPSBuZXcgTGluZUJvcmRlcigxKTsKLSAgICBmaWd1cmUuc2V0Qm9yZGVyKGJveExpbmVCb3JkZXIpOyAgICAKLSAgICBUb29sYmFyTGF5b3V0IHRvb2xiYXJMYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dCgpOwotICAgIHRvb2xiYXJMYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyh0cnVlKTsKLSAgICBmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcih0b29sYmFyTGF5b3V0KTsKLSAgICAvLyB3ZSBzaG91bGQgb3JnYW5pemUgSVRyZWVFbGVtZW50IGFuZCBpbnRlZ3JhdGUgaXQgd2l0aCB0aGUgZmFjYWRlCi0gICAgaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBJVHJlZUVsZW1lbnQpCi0gICAgewotICAgICAgZmlndXJlLmdldE5hbWVMYWJlbCgpLnNldEljb24oKChJVHJlZUVsZW1lbnQpZ2V0TW9kZWwoKSkuZ2V0SW1hZ2UoKSk7Ci0gICAgfQotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiAoKEJveEZpZ3VyZSlnZXRGaWd1cmUoKSkuZ2V0Q29udGVudFBhbmUoKTsKLSAgfQotICAgIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbmV3IEFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeSgpKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsIHNpbXBsZURpcmVjdEVkaXRQb2xpY3kpOwotICB9Ci0gIAotICAgCi0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCkKLSAgewotICAgIEJveEZpZ3VyZSBib3hGaWd1cmUgPSAoQm94RmlndXJlKWZpZ3VyZTsKLSAgICBMaW5lQm9yZGVyIGJveEZpZ3VyZUxpbmVCb3JkZXIgPSAoTGluZUJvcmRlcilib3hGaWd1cmUuZ2V0Qm9yZGVyKCk7Ci0gICAgYm94RmlndXJlTGluZUJvcmRlci5zZXRXaWR0aCgyKTsKLSAgICBib3hGaWd1cmVMaW5lQm9yZGVyLnNldENvbG9yKENvbG9yQ29uc3RhbnRzLmRhcmtCbHVlKTsgIAotICAgIGJveEZpZ3VyZS5nZXRIZWFkaW5nRmlndXJlKCkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgZmlndXJlLnJlcGFpbnQoKTsKLSAgICBzdXBlci5hZGRGZWVkYmFjaygpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsKLSAgICBCb3hGaWd1cmUgYm94RmlndXJlID0gKEJveEZpZ3VyZSlmaWd1cmU7Ci0gICAgTGluZUJvcmRlciBib3hGaWd1cmVMaW5lQm9yZGVyID0gKExpbmVCb3JkZXIpYm94RmlndXJlLmdldEJvcmRlcigpOwotICAgIGJveEZpZ3VyZUxpbmVCb3JkZXIuc2V0V2lkdGgoMSk7Ci0gICAgYm94RmlndXJlTGluZUJvcmRlci5zZXRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgYm94RmlndXJlLmdldEhlYWRpbmdGaWd1cmUoKS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0gICAgZmlndXJlLnJlcGFpbnQoKTsKLSAgICBzdXBlci5yZW1vdmVGZWVkYmFjaygpOyAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIEFjdGlvblJlZ2lzdHJ5IGdldEVkaXRvckFjdGlvblJlZ2lzdHJ5KElFZGl0b3JQYXJ0IGVkaXRvcikKLSAgewotICAgIHJldHVybiAoQWN0aW9uUmVnaXN0cnkpIGVkaXRvci5nZXRBZGFwdGVyKEFjdGlvblJlZ2lzdHJ5LmNsYXNzKTsKLSAgfQotfSAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0NlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9DZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5M2I5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0NlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0Q29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkNlbnRlcmVkSWNvbkZpZ3VyZTsKLQotcHVibGljIGNsYXNzIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkFuY2hvcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1AgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1RUT00gPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFQgPSAzOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFQURFUl9MRUZUID0gNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEVBREVSX1JJR0hUID0gNTsKLQotICBwcml2YXRlIGludCBsb2NhdGlvbjsKLSAgcHJpdmF0ZSBpbnQgaW5zZXQ7Ci0gIHByaXZhdGUgaW50IG9mZnNldCA9IDA7Ci0gIHByaXZhdGUgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yIG90aGVyOwotCi0gIHB1YmxpYyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoSUZpZ3VyZSBvd25lciwgaW50IGxvY2F0aW9uLCBpbnQgaW5zZXQpCi0gIHsKLSAgICBzdXBlcihvd25lcik7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIHRoaXMuaW5zZXQgPSBpbnNldDsKLSAgfQotCi0gIHB1YmxpYyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoSUZpZ3VyZSBvd25lciwgaW50IGxvY2F0aW9uLCBpbnQgaW5zZXQsIGludCBvZmZzZXQpCi0gIHsKLSAgICB0aGlzKG93bmVyLCBsb2NhdGlvbiwgaW5zZXQpOwotICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotICB9Ci0KLSAgcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkKLSAgewotICAgIFJlY3RhbmdsZSByID0gZ2V0T3duZXIoKS5nZXRCb3VuZHMoKTsKLSAgICBpbnQgeCwgeTsKLSAgICBzd2l0Y2ggKGxvY2F0aW9uKQotICAgIHsKLSAgICBjYXNlIFRPUDoKLSAgICAgIHggPSByLnJpZ2h0KCkgLSByLndpZHRoIC8gMiArIG9mZnNldDsKLSAgICAgIHkgPSByLnkgKyBpbnNldDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQk9UVE9NOgotICAgICAgeCA9IHIucmlnaHQoKSAtIHIud2lkdGggLyAyICsgb2Zmc2V0OwotICAgICAgeSA9IHIuYm90dG9tKCkgLSBpbnNldDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTEVGVDoKLSAgICAgIHggPSByLnggKyBpbnNldDsKLSAgICAgIHkgPSByLmJvdHRvbSgpIC0gci5oZWlnaHQgLyAyICsgb2Zmc2V0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSSUdIVDoKLSAgICAgIHggPSByLnJpZ2h0KCkgLSBpbnNldDsKLSAgICAgIHkgPSByLmJvdHRvbSgpIC0gci5oZWlnaHQgLyAyICsgb2Zmc2V0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIRUFERVJfTEVGVDoKLSAgICAgIHggPSByLnggKyBpbnNldDsKLSAgICAgIHkgPSByLnkgKyBvZmZzZXQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhFQURFUl9SSUdIVDoKLSAgICAgIHggPSByLnJpZ2h0KCkgLSBpbnNldDsKLSAgICAgIHkgPSByLnkgKyBvZmZzZXQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICB4ID0gci5yaWdodCgpIC0gci53aWR0aCAvIDI7Ci0gICAgICB5ID0gci5ib3R0b20oKSAtIHIuaGVpZ2h0IC8gMjsKLSAgICB9Ci0gICAgUG9pbnQgcCA9IG5ldyBQb2ludCh4LCB5KTsKLQotICAgIGlmICghKGdldE93bmVyKCkgaW5zdGFuY2VvZiBDZW50ZXJlZEljb25GaWd1cmUpKQotICAgIHsKLSAgICAgIGdldE93bmVyKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShwKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGdldE93bmVyKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShwKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKG90aGVyICE9IG51bGwpCi0gICAgewotICAgICAgLy8gaWYgd2l0aGluIG9ubHkgb25lIHBpeGVsIG9mIGJlaW5nIHZlcnRpY2FsLCB3ZSBzdHJhaWdodGVuIHVwIHRoZSBsaW5lCi0gICAgICBQb2ludCBwMiA9IG90aGVyLmdldExvY2F0aW9uKG51bGwpOwotICAgICAgaWYgKE1hdGguYWJzKHAyLnggLSBwLngpIDw9IDEpCi0gICAgICB7Ci0gICAgICAgIHAueCA9IHAyLng7Ci0gICAgICB9ICAKLSAgICB9ICAKLSAgICByZXR1cm4gcDsKLSAgfQotCi0gIHB1YmxpYyBQb2ludCBnZXRSZWZlcmVuY2VQb2ludCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0TG9jYXRpb24obnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRPdGhlcihDZW50ZXJlZENvbm5lY3Rpb25BbmNob3Igb3RoZXIpCi0gIHsKLSAgICB0aGlzLm90aGVyID0gb3RoZXI7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Db2x1bW5FZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Db2x1bW5FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWI0MDkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ29sdW1uRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkFic3RyYWN0TW9kZWxDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuUmVmZXJlbmNlZFR5cGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklDb21wbGV4VHlwZTsKLQotcHVibGljIGNsYXNzIENvbHVtbkVkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0Ci17ICAgICAgICAgCi0gIHByb3RlY3RlZCBpbnQgc3BhY2luZyA9IDIwOyAgCi0gIHByb3RlY3RlZCBpbnQgbWlub3JBbGlnbm1lbnQgPSAtMTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNIb3Jpem9udGFsID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgQ29sdW1uRWRpdFBhcnQoKQotICB7ICAgIAotICB9Ci0KLSAgcHVibGljIENvbHVtbkVkaXRQYXJ0KGJvb2xlYW4gaXNIb3Jpem9udGFsKQotICB7Ci0gICAgdGhpcy5pc0hvcml6b250YWwgPSBpc0hvcml6b250YWw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBGaWd1cmUgZmlndXJlID0gbmV3IEZpZ3VyZSgpOwotICAgIFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoaXNIb3Jpem9udGFsKTsKLSAgIAotICAgIGlmIChtaW5vckFsaWdubWVudCAhPSAtMSkKLSAgICB7ICAKLSAgICAgIGxheW91dC5zZXRNaW5vckFsaWdubWVudChtaW5vckFsaWdubWVudCk7Ci0gICAgfSAgCi0gICAgbGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOwotICAgIGxheW91dC5zZXRTcGFjaW5nKHNwYWNpbmcpOwotICAgIGZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U3BhY2luZyhpbnQgc3BhY2luZykKLSAgewotICAgIHRoaXMuc3BhY2luZyA9IHNwYWNpbmc7Ci0gICAgaWYgKGZpZ3VyZSAhPSBudWxsKQotICAgIHsgIAotICAgICAgKChUb29sYmFyTGF5b3V0KWZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkpLnNldFNwYWNpbmcoc3BhY2luZyk7Ci0gICAgfSAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJQ29tcGxleFR5cGUgZ2V0Q29tcGxleFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIChJQ29tcGxleFR5cGUpZ2V0TW9kZWwoKTsgICAKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7IAotICAgIEFic3RyYWN0TW9kZWxDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQWJzdHJhY3RNb2RlbENvbGxlY3Rpb24pZ2V0TW9kZWwoKTsKLSAgICByZXR1cm4gY29sbGVjdGlvbi5nZXRDaGlsZHJlbigpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRNaW5vckFsaWdubWVudCgpCi0gIHsKLSAgICByZXR1cm4gbWlub3JBbGlnbm1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNaW5vckFsaWdubWVudChpbnQgbWlub3JBbGlnbm1lbnQpCi0gIHsKLSAgICB0aGlzLm1pbm9yQWxpZ25tZW50ID0gbWlub3JBbGlnbm1lbnQ7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hDaGlsZHJlbigpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICBpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFJlZmVyZW5jZWRUeXBlQ29sdW1uKQotICAgIHsKLSAgICAgIGlmIChnZXRQYXJlbnQoKS5nZXRDaGlsZHJlbigpLnNpemUoKSA+IDApIAotICAgICAgeyAgICAgICAgCi0gICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KWdldFBhcmVudCgpLmdldENoaWxkcmVuKCkuZ2V0KDApOwotICAgICAgICByZWZyZXNoQ29ubmVjdGlvbnMoZWRpdFBhcnQpOwotICAgICAgfSAgCi0gICAgfSAgICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZWZyZXNoQ29ubmVjdGlvbnModGhpcyk7ICAgICAgCi0gICAgfSAgCi0gIH0KLSAgCi0gIAotICBwdWJsaWMgdm9pZCByZWZyZXNoQ29ubmVjdGlvbnMoRWRpdFBhcnQgcGFyZW50KQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcGFyZW50LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydClpLm5leHQoKTsgICAgICAKLSAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEJhc2VUeXBlQ29ubmVjdGluZ0VkaXRQYXJ0KQotICAgICAgewotICAgICAgICBCYXNlVHlwZUNvbm5lY3RpbmdFZGl0UGFydCBjb25uZWN0aW5nRWRpdFBhcnQgPSAoQmFzZVR5cGVDb25uZWN0aW5nRWRpdFBhcnQpZWRpdFBhcnQ7Ci0gICAgICAgIGNvbm5lY3RpbmdFZGl0UGFydC5yZWZyZXNoQ29ubmVjdGlvbnMoKTsKLSAgICAgIH0gIAotICAgICAgcmVmcmVzaENvbm5lY3Rpb25zKGVkaXRQYXJ0KTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0YWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Db21wYXJ0bWVudEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZjU2ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Db21wYXJ0bWVudEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Db21wYXJ0bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLktleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSUNvbXBhcnRtZW50RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci0KLS8vIFRPRE8gKGNzKSBjb21tb24tdXAgd2l0aCBCb3hFZGl0UGFydCAoPykKLXB1YmxpYyBjbGFzcyBDb21wYXJ0bWVudEVkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0IC8vIGltcGxlbWVudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElGZWVkYmFja0hhbmRsZXIKLXsKLSAgcHJvdGVjdGVkIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uKCk7Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIElDb21wYXJ0bWVudEZpZ3VyZSBmaWd1cmUgPSBnZXRGaWd1cmVGYWN0b3J5KCkuY3JlYXRlQ29tcGFydG1lbnRGaWd1cmUoZ2V0TW9kZWwoKSk7Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfQotCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBnZXRDb21wYXJ0bWVudEZpZ3VyZSgpLmdldENvbnRlbnRQYW5lKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGhhc0NvbnRlbnQoKQotICB7Ci0gICAgLy8gc2luY2UgdGhlIGFubm90YXRpb24gYWx3YXlzIHRha2VzIHVwIDEgY2hpbGQsIGhlcmUncyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBmaWd1cmUgb3V0IGlmCi0gICAgcmV0dXJuIGdldENoaWxkcmVuKCkuc2l6ZSgpID4gMTsKLSAgfQotCi0gIExpc3QgZ2V0Q2hpbGRyZW5TYW5zQW5ub3RhdGlvbigpCi0gIHsKLSAgICBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGNoaWxkcmVuLmFkZEFsbChnZXRDaGlsZHJlbigpKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEVkaXRQYXJ0IGNoaWxkID0gKEVkaXRQYXJ0KWkubmV4dCgpOwotICAgICAgaWYgKGNoaWxkLmdldE1vZGVsKCkgPT0gYW5ub3RhdGlvbikKLSAgICAgIHsKLSAgICAgICAgaS5yZW1vdmUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAKLSAgICB9ICAKLSAgICByZXR1cm4gY2hpbGRyZW47Ci0gIH0KLSAgCi0gIHB1YmxpYyBFZGl0UGFydCBkb0dldFJlbGF0aXZlRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQsIGludCBkaXJlY3Rpb24pCi0gIHsKLSAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOyAgIAotICAgIAotICAgIC8vIHdlIGNvbXB1dGUgdGhlIGNoaWxkcmVuIHNhbnMgdGhlIGFubm90YXRpb24gRWRpdFBhcnQKLSAgICAvLyBzaW5jZSB0aGUgYW5ub3RhdGlvbiBFZGl0UGFydCBjb25mdXNlcyBvdXIgdXAvZG93biBrZXkgaGFuZGxpbmcKLSAgICBMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW5TYW5zQW5ub3RhdGlvbigpOwotICAgIGlmIChjaGlsZHJlbi5jb250YWlucyhlZGl0UGFydCkpCi0gICAgeyAgCi0gICAgICBpZiAoZGlyZWN0aW9uID09IEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuT1VUX1RPX1BBUkVOVCkKLSAgICAgIHsKLSAgICAgICAgQ29tcGFydG1lbnQgY29tcGFydG1lbnQgPSAoQ29tcGFydG1lbnQpZ2V0TW9kZWwoKTsKLSAgICAgICAgZm9yIChFZGl0UGFydCBwYXJlbnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKSkKLSAgICAgICAgeyAgICAgICAgICAgIAotICAgICAgICAgIGlmIChwYXJlbnQuZ2V0TW9kZWwoKSA9PSBjb21wYXJ0bWVudC5nZXRPd25lcigpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHBhcmVudDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gIAotICAgICAgICB9ICAKLSAgICAgIH0gICAgICAgIAotICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKQotICAgICAgeyAgICAKLSAgICAgICAgaW50IHNpemUgPSBjaGlsZHJlbi5zaXplKCk7Ci0gICAgICAgIGlmIChzaXplID4gMCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGlmIChjaGlsZHJlbi5nZXQoc2l6ZSAtIDEpID09IGVkaXRQYXJ0KQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgQ29tcGFydG1lbnRFZGl0UGFydCBuZXh0Q29tcGFydG1lbnQgPSAoQ29tcGFydG1lbnRFZGl0UGFydClFZGl0UGFydE5hdmlnYXRpb25IYW5kbGVyVXRpbC5nZXROZXh0U2libGluZyhDb21wYXJ0bWVudEVkaXRQYXJ0LnRoaXMpOwotICAgICAgICAgICAgaWYgKG5leHRDb21wYXJ0bWVudCAhPSBudWxsICYmIG5leHRDb21wYXJ0bWVudC5nZXRDaGlsZHJlblNhbnNBbm5vdGF0aW9uKCkuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgICAgICAgcmVzdWx0ID0gRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuZ2V0Rmlyc3RDaGlsZChuZXh0Q29tcGFydG1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBlZGl0UGFydDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBFZGl0UGFydE5hdmlnYXRpb25IYW5kbGVyVXRpbC5nZXROZXh0U2libGluZyhlZGl0UGFydCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpCi0gICAgICB7Ci0gICAgICAgIGlmIChFZGl0UGFydE5hdmlnYXRpb25IYW5kbGVyVXRpbC5nZXRGaXJzdENoaWxkKENvbXBhcnRtZW50RWRpdFBhcnQudGhpcykgPT0gZWRpdFBhcnQpCi0gICAgICAgIHsgIAotICAgICAgICAgIEVkaXRQYXJ0IHByZXZDb21wYXJ0bWVudCA9IEVkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsLmdldFByZXZTaWJsaW5nKENvbXBhcnRtZW50RWRpdFBhcnQudGhpcyk7Ci0gICAgICAgICAgaWYgKHByZXZDb21wYXJ0bWVudCBpbnN0YW5jZW9mIENvbXBhcnRtZW50RWRpdFBhcnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgTGlzdCBwcmV2Q29tcExpc3RDaGlsZHJlbiA9ICgoQ29tcGFydG1lbnRFZGl0UGFydClwcmV2Q29tcGFydG1lbnQpLmdldENoaWxkcmVuU2Fuc0Fubm90YXRpb24oKTsKLSAgICAgICAgICAgIGludCBzaXplID0gcHJldkNvbXBMaXN0Q2hpbGRyZW4uc2l6ZSgpOwotICAgICAgICAgICAgaWYgKHNpemUgPiAwKQotICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgIHJlc3VsdCA9IChFZGl0UGFydClwcmV2Q29tcGFydG1lbnQuZ2V0Q2hpbGRyZW4oKS5nZXQoc2l6ZSAtIDEpOwotICAgICAgICAgICAgfSAgCi0gICAgICAgICAgfSAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBFZGl0UGFydE5hdmlnYXRpb25IYW5kbGVyVXRpbC5nZXRQcmV2U2libGluZyhlZGl0UGFydCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7ICAgICAgCi0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KQotICB7Ci0gICAgT2JqZWN0IG1vZGVsID0gY2hpbGRFZGl0UGFydC5nZXRNb2RlbCgpOwotCi0gICAgSUZpZ3VyZSBjaGlsZCA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpOwotCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUZpZWxkKQotICAgIHsKLSAgICAgIGdldENvbXBhcnRtZW50RmlndXJlKCkuZ2V0Q29udGVudFBhbmUoKS5hZGQoY2hpbGQsIGluZGV4KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKQotICAgIHsKLSAgICAgIGdldENvbXBhcnRtZW50RmlndXJlKCkuZ2V0QW5ub3RhdGlvblBhbmUoKS5hZGQoY2hpbGQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCBpbmRleCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KQotICB7Ci0gICAgT2JqZWN0IG1vZGVsID0gY2hpbGRFZGl0UGFydC5nZXRNb2RlbCgpOwotICAgIElGaWd1cmUgY2hpbGQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKTsKLQotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElGaWVsZCkKLSAgICB7Ci0gICAgICBnZXRDb21wYXJ0bWVudEZpZ3VyZSgpLmdldENvbnRlbnRQYW5lKCkucmVtb3ZlKGNoaWxkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKQotICAgIHsKLSAgICAgIGdldENvbXBhcnRtZW50RmlndXJlKCkuZ2V0QW5ub3RhdGlvblBhbmUoKS5yZW1vdmUoY2hpbGQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb21wYXJ0bWVudCBnZXRDb21wYXJ0bWVudCgpCi0gIHsKLSAgICByZXR1cm4gKENvbXBhcnRtZW50KSBnZXRNb2RlbCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsKLSAgICBMaXN0IGNoaWxkcmVuID0gZ2V0Q29tcGFydG1lbnQoKS5nZXRDaGlsZHJlbigpOwotICAgIGNoaWxkcmVuLmFkZChhbm5vdGF0aW9uKTsKLSAgICByZXR1cm4gY2hpbGRyZW47Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKE9iamVjdCBtb2RlbCkKLSAgewotICAgIHN1cGVyLnNldE1vZGVsKG1vZGVsKTsKLSAgICBhbm5vdGF0aW9uLnNldENvbXBhcnRtZW50KGdldENvbXBhcnRtZW50KCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENoaWxkcmVuKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2hDaGlsZHJlbigpOwotICAgIC8vICgoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClnZXRQYXJlbnQoKSkuZ2V0Q29udGVudFBhbmUoKS5pbnZhbGlkYXRlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoVmlzdWFscygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKQotICB7Ci0gICAgLy8gZ2V0RmlndXJlKCkuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsdWUpOwotICAgIC8vICgoQ29tcGFydG1lbnRGaWd1cmUpZ2V0RmlndXJlKCkpLnNldEJvcmRlckNvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLSAgICBnZXRGaWd1cmUoKS5yZXBhaW50KCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsKLSAgICAvLyBnZXRGaWd1cmUoKS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubGlnaHRCbHVlKTsKLSAgICAvLyAoKENvbXBhcnRtZW50RmlndXJlKWdldEZpZ3VyZSgpKS5zZXRCb3JkZXJDb2xvcihDb2xvckNvbnN0YW50cy5saWdodEdyYXkpOwotICAgIGdldEZpZ3VyZSgpLnJlcGFpbnQoKTsKLSAgfQotICAKLSAgcHVibGljIElDb21wYXJ0bWVudEZpZ3VyZSBnZXRDb21wYXJ0bWVudEZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gKElDb21wYXJ0bWVudEZpZ3VyZSlmaWd1cmU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGROb3RpZnkoKQotICB7ICAKLSAgICBzdXBlci5hZGROb3RpZnkoKTsKLSAgICBnZXRDb21wYXJ0bWVudEZpZ3VyZSgpLmVkaXRQYXJ0QXR0YWNoZWQodGhpcyk7ICAgCi0gIH0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ29tcGxleFR5cGVFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Db21wbGV4VHlwZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlY2ViMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Db21wbGV4VHlwZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hbmhhdHRhbkNvbm5lY3Rpb25Sb3V0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkZvY3VzVHlwZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JVHlwZTsKLQotcHVibGljIGNsYXNzIENvbXBsZXhUeXBlRWRpdFBhcnQgZXh0ZW5kcyBTdHJ1Y3R1cmVFZGl0UGFydAotewotICBwcml2YXRlIEZvbnQgaXRhbGljRm9udDsKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREcmF3Q29ubmVjdGlvbigpCi0gIHsKLSAgICBpZiAoZ2V0UGFyZW50KCkuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIEZvY3VzVHlwZUNvbHVtbikKLSAgICB7ICAKLSAgICAgIElDb21wbGV4VHlwZSBjb21wbGV4VHlwZSA9IChJQ29tcGxleFR5cGUpZ2V0TW9kZWwoKTsKLSAgICAgIHJldHVybiBjb21wbGV4VHlwZS5nZXRTdXBlclR5cGUoKSAhPSBudWxsOwotICAgIH0gCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAKLSAgcHJpdmF0ZSBFZGl0UGFydCBnZXRUYXJnZXRFZGl0UGFydChJVHlwZSB0eXBlKQotICB7Ci0gICAgQ29sdW1uRWRpdFBhcnQgY29sdW1uRWRpdFBhcnQgPSBudWxsOwotICAgIGZvciAoRWRpdFBhcnQgZWRpdFBhcnQgPSB0aGlzOyBlZGl0UGFydCAhPSBudWxsOyBlZGl0UGFydCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpKQotICAgIHsKLSAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbHVtbkVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBjb2x1bW5FZGl0UGFydCA9IChDb2x1bW5FZGl0UGFydCllZGl0UGFydDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAKLSAgICB9ICAgICAKLSAgICBpZiAoY29sdW1uRWRpdFBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb2x1bW5FZGl0UGFydC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEVkaXRQYXJ0IGNoaWxkID0gKEVkaXRQYXJ0KWkubmV4dCgpOwotICAgICAgICBpZiAoY2hpbGQuZ2V0TW9kZWwoKSA9PSB0eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGNoaWxkOwotICAgICAgICB9ICAgICAgICAgCi0gICAgICB9ICAKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKCkKLSAgewotICAgIGNvbm5lY3Rpb25GaWd1cmUgPSBudWxsOwotICAgIElDb21wbGV4VHlwZSBjb21wbGV4VHlwZSA9IChJQ29tcGxleFR5cGUpZ2V0TW9kZWwoKTsKLSAgICBJVHlwZSB0eXBlID0gY29tcGxleFR5cGUuZ2V0U3VwZXJUeXBlKCk7Ci0gICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICB7ICAgICAgCi0gICAgICBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJlZmVyZW5jZVR5cGVQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpZ2V0VGFyZ2V0RWRpdFBhcnQodHlwZSk7Ci0gICAgICBpZiAocmVmZXJlbmNlVHlwZVBhcnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZSA9IG5ldyBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbih0cnVlKTsKLSAgICAgICAgLy8gZHJhdyBhIGxpbmUgb3V0IGZyb20gdGhlIHRvcCAgICAgICAgIAotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldFNvdXJjZUFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKGdldEZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuVE9QLCAxKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUT0RPIChjcykgbmVlZCB0byBkcmF3IHRoZSB0YXJnZXQgYW5jaG9yIHRvIGxvb2sgbGlrZSBhIFVNTCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXAKLSAgICAgICAgLy8gYWRkaW5nIGEgbGFiZWwgdG8gdGhlIGNvbm5lY3Rpb24gd291bGQgaGVscCB0bwotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldFRhcmdldEFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKHJlZmVyZW5jZVR5cGVQYXJ0LmdldEZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuQk9UVE9NLCAwLCAwKSk7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0Q29ubmVjdGlvblJvdXRlcihuZXcgTWFuaGF0dGFuQ29ubmVjdGlvblJvdXRlcigpKTsKLSAgICAgICAgKChDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IpY29ubmVjdGlvbkZpZ3VyZS5nZXRTb3VyY2VBbmNob3IoKSkuc2V0T3RoZXIoKENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvciljb25uZWN0aW9uRmlndXJlLmdldFRhcmdldEFuY2hvcigpKTsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRIaWdobGlnaHQoZmFsc2UpOwotICAgICAgfQotICAgIH0gICAgCi0gICAgcmV0dXJuIGNvbm5lY3Rpb25GaWd1cmU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoVmlzdWFscygpOwotICAgIExhYmVsIGxhYmVsID0gZ2V0TmFtZUxhYmVsRmlndXJlKCk7Ci0gICAgSUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlID0gKElDb21wbGV4VHlwZSlnZXRNb2RlbCgpOwotICAgIGlmIChjb21wbGV4VHlwZS5pc0Fic3RyYWN0KCkpCi0gICAgewotICAgICAgaWYgKGl0YWxpY0ZvbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgRm9udCBmb250ID0gbGFiZWwuZ2V0Rm9udCgpOwotICAgICAgICBpdGFsaWNGb250ID0gZ2V0SXRhbGljRm9udChmb250KTsKLSAgICAgIH0KLSAgICAgIGlmIChpdGFsaWNGb250ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxhYmVsLnNldEZvbnQoaXRhbGljRm9udCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsYWJlbC5zZXRGb250KGxhYmVsLmdldFBhcmVudCgpLmdldEZvbnQoKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgewotICAgIGlmIChpdGFsaWNGb250ICE9IG51bGwpCi0gICAgewotICAgICAgaXRhbGljRm9udC5kaXNwb3NlKCk7Ci0gICAgICBpdGFsaWNGb250ID0gbnVsbDsKLSAgICB9Ci0gICAgc3VwZXIuZGVhY3RpdmF0ZSgpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9FZGl0UGFydE5hdmlnYXRpb25IYW5kbGVyVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9FZGl0UGFydE5hdmlnYXRpb25IYW5kbGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjM0YjY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLQotCi1wdWJsaWMgY2xhc3MgRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwKLXsgIAotICBwdWJsaWMgc3RhdGljIEVkaXRQYXJ0IGdldEZpcnN0Q2hpbGQoRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsgICAgICAKLSAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOwotICAgIGlmIChlZGl0UGFydC5nZXRDaGlsZHJlbigpLnNpemUoKSA+IDApCi0gICAgewotICAgICAgcmVzdWx0ID0gKEVkaXRQYXJ0KWVkaXRQYXJ0LmdldENoaWxkcmVuKCkuZ2V0KDApOwotICAgIH0gICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIEVkaXRQYXJ0IGdldExhc3RDaGlsZChFZGl0UGFydCBlZGl0UGFydCkKLSAgeyAgICAgIAotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IHNpemUgPSBlZGl0UGFydC5nZXRDaGlsZHJlbigpLnNpemUoKTsKLSAgICBpZiAoc2l6ZSA+IDApCi0gICAgewotICAgICAgcmVzdWx0ID0gKEVkaXRQYXJ0KWVkaXRQYXJ0LmdldENoaWxkcmVuKCkuZ2V0KHNpemUgLSAxKTsKLSAgICB9ICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi0gIAotICBwdWJsaWMgc3RhdGljIEVkaXRQYXJ0IGdldE5leHRTaWJsaW5nKEVkaXRQYXJ0IGVkaXRQYXJ0KQotICB7ICAgIAotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7ICAgIAotICAgIEVkaXRQYXJ0IHBhcmVudCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpOwotICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIExpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgIGludCBpbmRleCA9IGNoaWxkcmVuLmluZGV4T2YoZWRpdFBhcnQpOwotICAgICAgaWYgKGluZGV4ICsgMSA8IGNoaWxkcmVuLnNpemUoKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKEVkaXRQYXJ0KWNoaWxkcmVuLmdldChpbmRleCArIDEpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIEVkaXRQYXJ0IGdldFByZXZTaWJsaW5nKEVkaXRQYXJ0IGVkaXRQYXJ0KQotICB7ICAgIAotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgRWRpdFBhcnQgcGFyZW50ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCk7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIHsgIAotICAgICAgTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOwotICAgICAgaW50IGluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZihlZGl0UGFydCk7Ci0gICAgICBpZiAoaW5kZXggLSAxID49IDApCi0gICAgICB7Ci0gICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNoaWxkCi0gICAgICAgIC8vICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gKEVkaXRQYXJ0KWNoaWxkcmVuLmdldChpbmRleCAtIDEpOwotICAgICAgfSAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0ZpZWxkRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvRmllbGRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTdkZDM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvRmllbGRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLQotcHVibGljIGNsYXNzIEZpZWxkRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRmllbGRFZGl0UGFydAotewotICBwdWJsaWMgdm9pZCBhZGROb3RpZnkoKQotICB7Ci0gICAgc3VwZXIuYWRkTm90aWZ5KCk7Ci0gICAgZ2V0RmllbGRGaWd1cmUoKS5lZGl0UGFydEF0dGFjaGVkKHRoaXMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0lBdXRvRGlyZWN0RWRpdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9JQXV0b0RpcmVjdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkMzE4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0lBdXRvRGlyZWN0RWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLS8qKgotICogRWRpdCBwYXJ0cyB0aGF0IGNhbiBiZSBkaXJlY3QgZWRpdGFibGUKLSAqICAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQXV0b0RpcmVjdEVkaXQKLXsKLSAgcHVibGljIHZvaWQgZG9FZGl0TmFtZShib29sZWFuIGFkZEZyb21EZXNpZ24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9JQ29ubmVjdGlvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9JQ29ubmVjdGlvbkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzYxMjUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvSUNvbm5lY3Rpb25Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotcHVibGljIGludGVyZmFjZSBJQ29ubmVjdGlvbkNvbnRhaW5lcgotewotICBwdWJsaWMgdm9pZCByZWZyZXNoQ29ubmVjdGlvbnMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvSUhvbGRlckVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0lIb2xkZXJFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjdhNWFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvSUhvbGRlckVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotcHVibGljIGludGVyZmFjZSBJSG9sZGVyRWRpdFBhcnQKLXsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9JTmFtZWRFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9JTmFtZWRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTg2YzI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvSU5hbWVkRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLQotcHVibGljIGludGVyZmFjZSBJTmFtZWRFZGl0UGFydAotewotICBwdWJsaWMgTGFiZWwgZ2V0TmFtZUxhYmVsRmlndXJlKCk7Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgY3Vyc29yTG9jYXRpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Sb290Q29udGVudEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1Jvb3RDb250ZW50RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2NzdkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1Jvb3RDb250ZW50RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBhbmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLlJvb3RIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklDb21wbGV4VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotCi1wdWJsaWMgY2xhc3MgUm9vdENvbnRlbnRFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAotewotICBMaXN0IGNvbGxlY3Rpb25zID0gbnVsbDsKLSAgRmlndXJlIGNvbnRlbnRQYW5lOwotICAKLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgeyAgICAKLSAgICBQYW5lbCBwYW5lbCA9IG5ldyBQYW5lbCgpOyAgICAKLSAgICBwYW5lbC5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcig2MCkpOwotICAgCi0gICAgVG9vbGJhckxheW91dCBwYW5lbExheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KGZhbHNlKTsKLSAgICBwYW5lbExheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIHBhbmVsLnNldExheW91dE1hbmFnZXIocGFuZWxMYXlvdXQpOwotICAgIAotICAgIGNvbnRlbnRQYW5lID0gbmV3IEZpZ3VyZSgpOwotICAgIHBhbmVsLmFkZChjb250ZW50UGFuZSk7Ci0gICAgCi0gICAgVG9vbGJhckxheW91dCB0YiA9IG5ldyBUb29sYmFyTGF5b3V0KGZhbHNlKTsKLSAgICB0Yi5zZXRNaW5vckFsaWdubWVudChUb29sYmFyTGF5b3V0LkFMSUdOX0NFTlRFUik7Ci0gICAgdGIuc2V0U3RyZXRjaE1pbm9yQXhpcyh0cnVlKTsKLSAgICB0Yi5zZXRTcGFjaW5nKDQwKTsKLSAgICBjb250ZW50UGFuZS5zZXRMYXlvdXRNYW5hZ2VyKHRiKTsKLSAgICAKLSAgICByZXR1cm4gcGFuZWw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBjb250ZW50UGFuZTsKLSAgfQotICAKLSAgCi0gIHB1YmxpYyBJQ29tcGxleFR5cGUgZ2V0U2VsZWN0ZWRDb21wbGV4VHlwZSgpCi0gIHsKLSAgICBJQ29tcGxleFR5cGUgcmVzdWx0ID0gbnVsbDsKLSAgICBJTW9kZWwgbW9kZWwgPSAoSU1vZGVsKWdldE1vZGVsKCk7Ci0gICAgTGlzdCB0eXBlcyA9IG1vZGVsLmdldFR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzLnNpemUoKSA+IDApCi0gICAgewotICAgICAgaWYgKHR5cGVzLmdldCgwKSBpbnN0YW5jZW9mIElDb21wbGV4VHlwZSkgCi0gICAgICAgIHJlc3VsdCA9IChJQ29tcGxleFR5cGUpdHlwZXMuZ2V0KDApOwotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICB9Ci0gIAotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgeyAKLSAgICBjb2xsZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoZ2V0TW9kZWwoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBnZXRNb2RlbCgpOwotICAgICAgSUFEVE9iamVjdCBmb2N1c09iamVjdCA9IG51bGw7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgSVN0cnVjdHVyZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElHcmFwaEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKChJR3JhcGhFbGVtZW50KW9iaikuaXNGb2N1c0FsbG93ZWQoKSkKLSAgICAgICAgICAgIGZvY3VzT2JqZWN0ID0gKElTdHJ1Y3R1cmUpb2JqOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUZpZWxkKQotICAgICAgewotICAgICAgICBmb2N1c09iamVjdCA9IChJRmllbGQpb2JqOwotICAgICAgfSAgCi0gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJTW9kZWwpCi0gICAgICB7Ci0gICAgICAgIGZvY3VzT2JqZWN0ID0gKElNb2RlbClvYmo7Ci0gICAgICAgIGNvbGxlY3Rpb25zLmFkZChmb2N1c09iamVjdCk7Ci0gICAgICAgIHJldHVybiBjb2xsZWN0aW9uczsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElUeXBlKQotICAgICAgewotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSUdyYXBoRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGlmICgoKElHcmFwaEVsZW1lbnQpb2JqKS5pc0ZvY3VzQWxsb3dlZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZvY3VzT2JqZWN0ID0gKElUeXBlKW9iajsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElHcmFwaEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIGlmICgoKElHcmFwaEVsZW1lbnQpb2JqKS5pc0ZvY3VzQWxsb3dlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgZm9jdXNPYmplY3QgPSAoSUFEVE9iamVjdClvYmo7Ci0gICAgICAgICAgY29sbGVjdGlvbnMuYWRkKGZvY3VzT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbnM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmb2N1c09iamVjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBSb290SG9sZGVyIGhvbGRlciA9IG5ldyBSb290SG9sZGVyKGZvY3VzT2JqZWN0KTsKLSAgICAgICAgY29sbGVjdGlvbnMuYWRkKGhvbGRlcik7Ci0gICAgICAgIHJldHVybiBjb2xsZWN0aW9uczsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGNvbGxlY3Rpb25zOwotICB9Ci0gICAgCi0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQgRG9uJ3QgY2FsbCB0aGlzIG1ldGhvZC4gIFVzZSBEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyLnNldElucHV0KCkgaW5zdGVhZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBzZXRNb2RlbChjb21wb25lbnQpOwotICAgIHJlZnJlc2goKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkIERvbid0IGNhbGwgdGhpcyBtZXRob2QuICBVc2UgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlci5nZXRJbnB1dCgpIGluc3RlYWQuCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldElucHV0KCkKLSAgewotICAgIHJldHVybiBnZXRNb2RlbCgpOwotICB9Ci0gIAotICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUyNTg5Ci0gIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkKLSAgewotICAgIHN1cGVyLmFjdGl2YXRlKCk7Ci0gICAgT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLSAgICAvLyBUaGUgc2NoZW1hIGFkYXB0ZXIgZG9lc24ndCBoYXZlIHRvIG5vdGlmeSB0aGUgUm9vdENvbnRlbnRFZGl0UGFydCBvZiBpdCBjaGFuZ2VzCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUFEVE9iamVjdCkKLSAgICB7Ci0gICAgICBJQURUT2JqZWN0IG9iamVjdCA9IChJQURUT2JqZWN0KW1vZGVsOwotICAgICAgb2JqZWN0LnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Sb290RWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvUm9vdEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkODc1ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Sb290RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkJlbmRwb2ludENvbm5lY3Rpb25Sb3V0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVDYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXllcmVkUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLlNjYWxhYmxlUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5TY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkRlc2lnblZpZXdlckdyYXBoaWNDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBSb290RWRpdFBhcnQgZXh0ZW5kcyBTY2FsYWJsZVJvb3RFZGl0UGFydCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmdlZi5Sb290RWRpdFBhcnQKLXsgICAgCi0gIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkKLSAgewotICAgIHN1cGVyLmFjdGl2YXRlKCk7Ci0gICAgLy8gU2V0IHVwIENvbm5lY3Rpb24gbGF5ZXIgd2l0aCBhIHJvdXRlciwgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGhhdmUgb25lCi0gICAgQ29ubmVjdGlvbkxheWVyIGNvbm5lY3Rpb25MYXllciA9IChDb25uZWN0aW9uTGF5ZXIpIGdldExheWVyKExheWVyQ29uc3RhbnRzLkNPTk5FQ1RJT05fTEFZRVIpOwotICAgIGlmIChjb25uZWN0aW9uTGF5ZXIgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIGNvbm5lY3Rpb25MYXllci5zZXRDb25uZWN0aW9uUm91dGVyKG5ldyBCZW5kcG9pbnRDb25uZWN0aW9uUm91dGVyKCkpOwotICAgIH0KLQotICAgIEZpZ3VyZSBmaWd1cmUgPSAoRmlndXJlKWdldExheWVyKExheWVyQ29uc3RhbnRzLkZFRURCQUNLX0xBWUVSKTsgICAgICAgCi0gICAgaWYgKGZpZ3VyZSAhPSBudWxsKQotICAgIHsgICAgICAKLSAgICAgIGlmIChnZXRWaWV3ZXIoKSBpbnN0YW5jZW9mIFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcikKLSAgICAgIHsgIAotICAgICAgICAvL1Njcm9sbGluZ0dyYXBoaWNhbFZpZXdlciBzZ3YgPSAoU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyKWdldFZpZXdlcigpOwotICAgICAgICAvL0luZGV4RmlndXJlIGluZGV4RmlndXJlID0gbmV3IEluZGV4RmlndXJlKHNndik7Ci0gICAgICAgIC8vZmlndXJlLmFkZChpbmRleEZpZ3VyZSk7Ci0gICAgICAgIC8vZ2V0Vmlld2VyKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihpbmRleEZpZ3VyZSk7Ci0gICAgICB9ICAKLSAgICB9ICAgICAgICAgICAKLSAgICByZWZyZXNoKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBMYXllcmVkUGFuZSBjcmVhdGVQcmludGFibGVMYXllcnMoKSAKLSAgewotICAgIExheWVyZWRQYW5lIHBhbmUgPSBzdXBlci5jcmVhdGVQcmludGFibGVMYXllcnMoKTsgICAgCi0gICAgTGF5ZXIgbGF5ZXIgPSBuZXcgU2NhbGVkSGFuZGxlTGF5ZXIoKTsKLSAgICBsYXllci5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oNSwgNSkpOwotICAgIHBhbmUuYWRkKGxheWVyLCBEZXNpZ25WaWV3ZXJHcmFwaGljQ29uc3RhbnRzLlNDQUxFRF9IQU5ETEVfTEFZRVIpOyAgICAKLSAgICByZXR1cm4gcGFuZTsKLSAgfSAgCi0gIAotICAKLSAgY2xhc3MgU2NhbGVkSGFuZGxlTGF5ZXIgZXh0ZW5kcyBMYXllcgotICB7Ci0gICAgU2NhbGVkSGFuZGxlTGF5ZXIoKSAKLSAgICB7Ci0gICAgICBzZXRFbmFibGVkKHRydWUpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmUjZ2V0UHJlZmVycmVkU2l6ZShpbnQsIGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgRGltZW5zaW9uIGdldFByZWZlcnJlZFNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQpIAotICAgIHsKLSAgICAgIFJlY3RhbmdsZSByZWN0ID0gbmV3IFJlY3RhbmdsZSgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRDaGlsZHJlbigpLnNpemUoKTsgaSsrKQotICAgICAgICByZWN0LnVuaW9uKCgoSUZpZ3VyZSlnZXRDaGlsZHJlbigpLmdldChpKSkuZ2V0Qm91bmRzKCkpOwotICAgICAgcmV0dXJuIHJlY3QuZ2V0U2l6ZSgpOwotICAgIH0KLSAgfSAgCi0gIAotICBjbGFzcyBJbmRleEZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSBpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLSAgewotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0OwotICAgIFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciBzZ3Y7Ci0gICAgcHVibGljIEluZGV4RmlndXJlKFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciBzZ3YpCi0gICAgewotICAgICAgdGhpcy5zZ3YgPSBzZ3Y7ICAgICAgCi0gICAgICAoKEZpZ3VyZUNhbnZhcylzZ3YuZ2V0Q29udHJvbCgpKS5nZXRWaWV3cG9ydCgpLmdldEhvcml6b250YWxSYW5nZU1vZGVsKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICgoRmlndXJlQ2FudmFzKXNndi5nZXRDb250cm9sKCkpLmdldFZpZXdwb3J0KCkuZ2V0VmVydGljYWxSYW5nZU1vZGVsKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDQwLCA0MCk7Ci0gICAgICB0cmFuc2xhdGVUb0Fic29sdXRlKGJvdW5kcyk7ICAgICAgCi0gICAgICBzZXRCb3VuZHMoYm91bmRzKTsgICAgICAgCi0gICAgfQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2Nyb2xsLWNoYW5nZSIpOwotICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgNDAsIDQwKTsKLSAgICAgIFBvaW50IHAgPSAoKEZpZ3VyZUNhbnZhcylzZ3YuZ2V0Q29udHJvbCgpKS5nZXRWaWV3cG9ydCgpLmdldFZpZXdMb2NhdGlvbigpOwotICAgICAgYm91bmRzLnRyYW5zbGF0ZShwKTsKLSAgICAgIHNldEJvdW5kcyhib3VuZHMpOyAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFJlY3RhbmdsZSBnZXRCb3VuZHMoKQotICAgIHsKLSAgICAgIFBvaW50IHAgPSAoKEZpZ3VyZUNhbnZhcylzZ3YuZ2V0Q29udHJvbCgpKS5nZXRWaWV3cG9ydCgpLmdldFZpZXdMb2NhdGlvbigpOwotICAgICAgYm91bmRzLnRyYW5zbGF0ZShwKTsgICAgICAKLSAgICAgIHJldHVybiBzdXBlci5nZXRCb3VuZHMoKS5nZXRDb3B5KCkudHJhbnNsYXRlKHApOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Sb290SG9sZGVyRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvUm9vdEhvbGRlckVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YWQwNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Sb290SG9sZGVyRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5QYW5lbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkZvY3VzVHlwZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLlJlZmVyZW5jZWRUeXBlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuUm9vdEhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLQotcHVibGljIGNsYXNzIFJvb3RIb2xkZXJFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydCBpbXBsZW1lbnRzIElIb2xkZXJFZGl0UGFydAotewotICBwcm90ZWN0ZWQgUGFuZWwgcGFuZWw7Ci0gIAotICBwdWJsaWMgUm9vdEhvbGRlckVkaXRQYXJ0KCkKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIHBhbmVsID0gbmV3IFBhbmVsKCk7ICAgIAotICAgIFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQodHJ1ZSk7Ci0gICAgbGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOwotICAgIGxheW91dC5zZXRTcGFjaW5nKDEwMCk7Ci0gICAgcGFuZWwuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOyAgICAKLQotICAgIHJldHVybiBwYW5lbDsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0gICAgTGlzdCBjb2xsZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBSb290SG9sZGVyIGhvbGRlciA9IChSb290SG9sZGVyKWdldE1vZGVsKCk7Ci0gICAgSUFEVE9iamVjdCBmb2N1c09iamVjdCA9IGhvbGRlci5nZXRNb2RlbCgpOwotICAgIGNvbGxlY3Rpb25zLmFkZChuZXcgRm9jdXNUeXBlQ29sdW1uKGZvY3VzT2JqZWN0KSk7Ci0gICAgY29sbGVjdGlvbnMuYWRkKG5ldyBSZWZlcmVuY2VkVHlwZUNvbHVtbihmb2N1c09iamVjdCkpOwotICAgIHJldHVybiBjb2xsZWN0aW9uczsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0YWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvU2VjdGlvbkVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1NlY3Rpb25FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjVhZjQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvU2VjdGlvbkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklDb21wbGV4VHlwZTsKLQotcHVibGljIGNsYXNzIFNlY3Rpb25FZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAotewotICBwcm90ZWN0ZWQgSUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlOwotICAKLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIEZpZ3VyZSBmaWcgPSBuZXcgRmlndXJlKCk7Ci0gICAgZmlnLnNldExheW91dE1hbmFnZXIobmV3IFRvb2xiYXJMYXlvdXQoKSk7Ci0gICAgcmV0dXJuIGZpZzsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGFibGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1N0cnVjdHVyZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1N0cnVjdHVyZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2N2JmY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9TdHJ1Y3R1cmVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkxvY2F0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TZXRJbnB1dFRvR3JhcGhWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuQ29tcGFydG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFREaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JU3RydWN0dXJlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuT3BlbkluTmV3RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5TcGFjZUZpbGxlckZvckZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlRWRpdFBhcnQgZXh0ZW5kcyBCYXNlVHlwZUNvbm5lY3RpbmdFZGl0UGFydCBpbXBsZW1lbnRzIElOYW1lZEVkaXRQYXJ0Ci17ICAKLSAgcHJvdGVjdGVkIExpc3QgY29tcGFydG1lbnRMaXN0ID0gbnVsbDsKLSAgcHJvdGVjdGVkIEFEVERpcmVjdEVkaXRQb2xpY3kgYWR0RGlyZWN0RWRpdFBvbGljeSA9IG5ldyBBRFREaXJlY3RFZGl0UG9saWN5KCk7Ci0gIHByb3RlY3RlZCBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmlndXJlOwotICBwcm90ZWN0ZWQgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZlZWRiYWNrRmlndXJlOwotCi0gIC8qKgotICAgKiBUT0RPIGNzLi4uIEknbSBzdXJlIHRoaXMgaGFzIHNvbWV0aGluZyB0byBkbyB3aXRoIHRoZSB3YXkgd2Ugd2FudGVkIHRvIHJld29yayBjb21wYXJ0bWVudCBjcmVhdGlvbgotICAgKiBJIHN1cHBvc2Ugd2UgY291bGQgaGF2ZSBzdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGluc3RlYWQgb2YgZ2V0TW9kZWxDaGlsZHJlbigpCi0gICAqIAotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIENvbXBhcnRtZW50W10gZ2V0Q29tcGFydG1lbnRzKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgSVN0cnVjdHVyZUZpZ3VyZSBmaWd1cmUgPSBnZXRGaWd1cmVGYWN0b3J5KCkuY3JlYXRlU3RydWN0dXJlRmlndXJlKGdldE1vZGVsKCkpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJU3RydWN0dXJlRmlndXJlIGdldFN0cnVjdHVyZUZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gKElTdHJ1Y3R1cmVGaWd1cmUpZ2V0RmlndXJlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBnZXRTdHJ1Y3R1cmVGaWd1cmUoKS5nZXRDb250ZW50UGFuZSgpOwotICB9Ci0gIAotICAKLSAgcHVibGljIEVkaXRQYXJ0IGRvR2V0UmVsYXRpdmVFZGl0UGFydChFZGl0UGFydCBlZGl0UGFydCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7ICAgICAgICAgICAgICAgCi0gICAgaWYgKGRpcmVjdGlvbiA9PSBLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LklOX1RPX0ZJUlNUX0NISUxEKQotICAgIHsgICAgICAgICAgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgQ29tcGFydG1lbnRFZGl0UGFydCBjb21wYXJ0bWVudCA9IChDb21wYXJ0bWVudEVkaXRQYXJ0KWkubmV4dCgpOwotICAgICAgICBpZiAoY29tcGFydG1lbnQuaGFzQ29udGVudCgpKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBjb250ZW50Q2hpbGRyZW4gPSBjb21wYXJ0bWVudC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNvbnRlbnRDaGlsZHJlbi5oYXNOZXh0KCk7ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgY2hpbGQgPSBjb250ZW50Q2hpbGRyZW4ubmV4dCgpOwotICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgU2VjdGlvbkVkaXRQYXJ0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTZWN0aW9uRWRpdFBhcnQgcGFydCA9IChTZWN0aW9uRWRpdFBhcnQpIGNoaWxkOwotICAgICAgICAgICAgICByZXN1bHQgPSAoRWRpdFBhcnQpcGFydC5nZXRDaGlsZHJlbigpLmdldCgwKTsKLSAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgQmFzZUZpZWxkRWRpdFBhcnQgJiYgKCEoY2hpbGQgaW5zdGFuY2VvZiBTcGFjZUZpbGxlckZvckZpZWxkRWRpdFBhcnQpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gKEVkaXRQYXJ0KWNoaWxkOwotICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgICB9ICAKLSAgICB9ICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gc3VwZXIuZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KGVkaXRQYXJ0LCBkaXJlY3Rpb24pOwotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7ICAgICAgICAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgeyAgICAgICAgCi0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7ICAKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBuZXcgQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5KCkpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwgYWR0RGlyZWN0RWRpdFBvbGljeSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJU3RydWN0dXJlIGdldFN0cnVjdHVyZSgpCi0gIHsKLSAgICByZXR1cm4gKElTdHJ1Y3R1cmUpZ2V0TW9kZWwoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsKLSAgICBpZiAoY29tcGFydG1lbnRMaXN0ID09IG51bGwpCi0gICAgewotICAgICAgY29tcGFydG1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgCi0gICAgICAvLyBUT0RPLi4gdGhpcyBuZWVkcyB0byBiZSBtb3ZlZCB0byB0aGUgeHNkIHNwZWNpZmljIHZlcnNpb24gb2YgdGhpcyBjbGFzcyAKLSAgICAgIGNvbXBhcnRtZW50TGlzdC5hZGQobmV3IENvbXBhcnRtZW50KGdldFN0cnVjdHVyZSgpLCAiYXR0cmlidXRlIikpOyAvLyROT04tTkxTLTEkCi0gICAgICBjb21wYXJ0bWVudExpc3QuYWRkKG5ldyBDb21wYXJ0bWVudChnZXRTdHJ1Y3R1cmUoKSwgImVsZW1lbnQiKSk7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICB9ICAKLSAgICByZXR1cm4gY29tcGFydG1lbnRMaXN0OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2hpbGRyZW4oKQotICB7ICAgCi0gICAgc3VwZXIucmVmcmVzaENoaWxkcmVuKCk7Ci0gICAgLy9nZXRGaWd1cmUoKS5pbnZhbGlkYXRlVHJlZSgpOyAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgICBnZXRTdHJ1Y3R1cmVGaWd1cmUoKS5yZWZyZXNoVmlzdWFscyhnZXRNb2RlbCgpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKQotICB7Ci0gICAgZ2V0U3RydWN0dXJlRmlndXJlKCkuYWRkU2VsZWN0aW9uRmVlZGJhY2soKTsKLSAgICBzdXBlci5hZGRGZWVkYmFjaygpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsKLSAgICBnZXRTdHJ1Y3R1cmVGaWd1cmUoKS5yZW1vdmVTZWxlY3Rpb25GZWVkYmFjaygpOwotICAgIHN1cGVyLnJlbW92ZUZlZWRiYWNrKCk7ICAgIAotICB9Ci0KLSAgcHVibGljIExhYmVsIGdldE5hbWVMYWJlbEZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0U3RydWN0dXJlRmlndXJlKCkuZ2V0TmFtZUxhYmVsKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBjdXJzb3JMb2NhdGlvbikKLSAgewotICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KQotICB7ICAKLSAgICBpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQpCi0gICAgewotICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpCi0gICAgICB7Ci0gICAgIC8vIHVuY29tbWVudCBmb3IgZGlyZWN0IGVkaXQgb2YgbmFtZSAoYWRkIGVsc2UpCi0vLyAgICAgICAgTG9jYXRpb25SZXF1ZXN0IGxvY2F0aW9uUmVxdWVzdCA9IChMb2NhdGlvblJlcXVlc3QpcmVxdWVzdDsKLS8vICAgICAgICBQb2ludCBwID0gbG9jYXRpb25SZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0vLyAgICAgICAgaWYgKGhpdFRlc3QoZ2V0TmFtZUxhYmVsRmlndXJlKCksIHApKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIExhYmVsRWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBMYWJlbEVkaXRNYW5hZ2VyKHRoaXMsIG5ldyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKHRoaXMsIHApKTsKLS8vICAgICAgICAgIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlciB3cmFwcGVyID0gbmV3IE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlcigpOwotLy8gICAgICAgICAgYWR0RGlyZWN0RWRpdFBvbGljeS5zZXRVcGRhdGVDb21tYW5kKHdyYXBwZXIpOwotLy8gICAgICAgICAgbWFuYWdlci5zaG93KCk7Ci0vLyAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9PUEVOKQotICAgIHsKLSAgICAgIE9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0gICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkKLSAgICAgIHsKLSAgICAgICAgTG9jYXRpb25SZXF1ZXN0IGxvY2F0aW9uUmVxdWVzdCA9IChMb2NhdGlvblJlcXVlc3QpcmVxdWVzdDsKLSAgICAgICAgUG9pbnQgcCA9IGxvY2F0aW9uUmVxdWVzdC5nZXRMb2NhdGlvbigpOwotICAgICAgICAgCi0gICAgICAgIGlmIChnZXRTdHJ1Y3R1cmVGaWd1cmUoKS5oaXRUZXN0SGVhZGVyKHApKQotICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgIC8vIFRPRE86ICEhISBUaGlzIHNob3VsZCBiZSBtb3ZlZCB0byB0aGUgYWR0LXhzZCBwYWNrYWdlCi0gICAgICAgICAgLy8gCi0gICAgICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcikgICAgIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyKW1vZGVsOwotICAgICAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilhZGFwdGVyLmdldFRhcmdldCgpOwotICAgICAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgIE9iamVjdCBzY2hlbWEgPSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoWFNEU2NoZW1hLmNsYXNzKTsKLSAgICAgICAgICAgIEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0RWRpdG9yQWN0aW9uUmVnaXN0cnkoZWRpdG9yUGFydCk7Ci0gICAgICAgICAgICBpZiAocmVnaXN0cnkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHNjaGVtYSA9PSBjdC5nZXRTY2hlbWEoKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElBY3Rpb24gYWN0aW9uID0gcmVnaXN0cnkuZ2V0QWN0aW9uKFNldElucHV0VG9HcmFwaFZpZXcuSUQpOwotICAgICAgICAgICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJQWN0aW9uIGFjdGlvbiA9IHJlZ2lzdHJ5LmdldEFjdGlvbihPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgICAgICAgICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBBY3Rpb25SZWdpc3RyeSBnZXRFZGl0b3JBY3Rpb25SZWdpc3RyeShJRWRpdG9yUGFydCBlZGl0b3IpCi0gIHsKLSAgICByZXR1cm4gKEFjdGlvblJlZ2lzdHJ5KSBlZGl0b3IuZ2V0QWRhcHRlcihBY3Rpb25SZWdpc3RyeS5jbGFzcyk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3VsZERyYXdDb25uZWN0aW9uKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkZXJUZXh0KCkKLSAgewotICAJIC8vIHJldHVybiBnZXRTdHJ1Y3R1cmVGaWd1cmUoKS5nZXROYW1lTGFiZWwoKS5nZXRUZXh0KCk7Ci0gIAlyZXR1cm4gZ2V0TmFtZUxhYmVsRmlndXJlKCkuZ2V0VGV4dCgpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Ub3BMZXZlbEZpZWxkRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvVG9wTGV2ZWxGaWVsZEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZDAxOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Ub3BMZXZlbEZpZWxkRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuQURURGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzLkJveEZpZ3VyZTsKLQotcHVibGljIGNsYXNzIFRvcExldmVsRmllbGRFZGl0UGFydCBleHRlbmRzIEJveEVkaXRQYXJ0IGltcGxlbWVudHMgSU5hbWVkRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIEFEVERpcmVjdEVkaXRQb2xpY3kgYWR0RGlyZWN0RWRpdFBvbGljeSA9IG5ldyBBRFREaXJlY3RFZGl0UG9saWN5KCk7Ci0gIHByaXZhdGUgRm9udCBpdGFsaWNGb250OwotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRHJhd0Nvbm5lY3Rpb24oKQotICB7Ci0gICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClnZXRNb2RlbCgpOwotICAgIElUeXBlIHR5cGUgPSBmaWVsZC5nZXRUeXBlKCk7Ci0gICAgcmV0dXJuICh0eXBlICE9IG51bGwpOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpCi0gIHsKLSAgICBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmlndXJlID0gbnVsbDsKLSAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKWdldE1vZGVsKCk7Ci0gICAgSVR5cGUgdHlwZSA9IGZpZWxkLmdldFR5cGUoKTsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsgICAgICAKLSAgICAgIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmVmZXJlbmNlVHlwZVBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClnZXRWaWV3ZXIoKS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KHR5cGUpOwotICAgICAgaWYgKHJlZmVyZW5jZVR5cGVQYXJ0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUgPSBuZXcgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24oKTsgICAKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRTb3VyY2VBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcihnZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLlJJR0hULCAwKSk7Ci0gICAgICAgIGludCB0YXJnZXRBbmNob3JZT2Zmc2V0ID0gMTI7ICAgICAgICAKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRUYXJnZXRBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcihyZWZlcmVuY2VUeXBlUGFydC5nZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLkhFQURFUl9MRUZULCAwLCB0YXJnZXRBbmNob3JZT2Zmc2V0KSk7IAotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldEhpZ2hsaWdodChmYWxzZSk7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgICByZXR1cm4gY29ubmVjdGlvbkZpZ3VyZTsKLSAgfSAgCi0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLCBhZHREaXJlY3RFZGl0UG9saWN5KTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBuZXcgQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5KCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClnZXRNb2RlbCgpOwotICAgIEJveEZpZ3VyZSBib3hGaWd1cmUgPSAoQm94RmlndXJlKWdldEZpZ3VyZSgpOwotICAgIExhYmVsIGxhYmVsID0gYm94RmlndXJlLmdldE5hbWVMYWJlbCgpOwotICAgIGxhYmVsLnNldFRleHQoZmllbGQuZ2V0TmFtZSgpKTsKLSAgICBpZiAoZmllbGQuaXNBYnN0cmFjdCgpKQotICAgIHsKLSAgICAgIGlmIChpdGFsaWNGb250ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEZvbnQgZm9udCA9IGxhYmVsLmdldEZvbnQoKTsKLSAgICAgICAgaXRhbGljRm9udCA9IGdldEl0YWxpY0ZvbnQoZm9udCk7Ci0gICAgICB9Ci0gICAgICBpZiAoaXRhbGljRm9udCAhPSBudWxsKQotICAgICAgewotICAgICAgICBsYWJlbC5zZXRGb250KGl0YWxpY0ZvbnQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGFiZWwuc2V0Rm9udChsYWJlbC5nZXRQYXJlbnQoKS5nZXRGb250KCkpOwotICAgIH0KLSAgICBzdXBlci5yZWZyZXNoVmlzdWFscygpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgewotICAgIGlmIChpdGFsaWNGb250ICE9IG51bGwpCi0gICAgewotICAgICAgaXRhbGljRm9udC5kaXNwb3NlKCk7Ci0gICAgICBpdGFsaWNGb250ID0gbnVsbDsKLSAgICB9Ci0gICAgc3VwZXIuZGVhY3RpdmF0ZSgpOwotICB9Ci0gIAotICBwdWJsaWMgTGFiZWwgZ2V0TmFtZUxhYmVsRmlndXJlKCkKLSAgewotICAgIEJveEZpZ3VyZSBib3hGaWd1cmUgPSAoQm94RmlndXJlKWdldEZpZ3VyZSgpOwotICAgIHJldHVybiBib3hGaWd1cmUuZ2V0TmFtZUxhYmVsKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBjdXJzb3JMb2NhdGlvbikKLSAgewotICAgCi0gIH0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkZXJUZXh0KCkKLSAgewotCSAgcmV0dXJuICBnZXROYW1lTGFiZWxGaWd1cmUoKS5nZXRUZXh0KCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsgIAotICAgIGlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVHx8Ci0gICAgICAgIHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX09QRU4pCi0gICAgewotLy8gICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkKLS8vICAgICAgewotLy8gICAgICAgIExvY2F0aW9uUmVxdWVzdCBsb2NhdGlvblJlcXVlc3QgPSAoTG9jYXRpb25SZXF1ZXN0KXJlcXVlc3Q7Ci0vLyAgICAgICAgUG9pbnQgcCA9IGxvY2F0aW9uUmVxdWVzdC5nZXRMb2NhdGlvbigpOwotLy8gICAgICAgCi0vLyAgICAgICAgaWYgKGhpdFRlc3QoZ2V0TmFtZUxhYmVsRmlndXJlKCksIHApKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIExhYmVsRWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBMYWJlbEVkaXRNYW5hZ2VyKHRoaXMsIG5ldyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKHRoaXMsIHApKTsKLS8vICAgICAgICAgIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlciB3cmFwcGVyID0gbmV3IE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlcigpOwotLy8gICAgICAgICAgYWR0RGlyZWN0RWRpdFBvbGljeS5zZXRVcGRhdGVDb21tYW5kKHdyYXBwZXIpOwotLy8gICAgICAgICAgbWFuYWdlci5zaG93KCk7Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1R5cGVSZWZlcmVuY2VDb25uZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1R5cGVSZWZlcmVuY2VDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkN2RhNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9UeXBlUmVmZXJlbmNlQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uUm91dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFuaGF0dGFuQ29ubmVjdGlvblJvdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWdvbkRlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgY2xhc3MgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gZXh0ZW5kcyBQb2x5bGluZUNvbm5lY3Rpb24KLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGlnaGxpZ2h0ID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29sb3IgYWN0aXZlQ29ubmVjdGlvbiA9IENvbG9yQ29uc3RhbnRzLmJsYWNrOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbG9yIGluYWN0aXZlQ29ubmVjdGlvbiA9IG5ldyBDb2xvcihudWxsLCAxOTgsIDE5NSwgMTk4KTsKLQotICAvKioKLSAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgc2V0VGFyZ2V0RGVjb3JhdGlvbihuZXcgUG9seWdvbkRlY29yYXRpb24oKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbihib29sZWFuIGZpbGwpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIFBvbHlnb25EZWNvcmF0aW9uIGRlYyA9IG5ldyBQb2x5Z29uRGVjb3JhdGlvbigpCi0gICAgewotICAgICAgcHJvdGVjdGVkIHZvaWQgZmlsbFNoYXBlKEdyYXBoaWNzIGcpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgZy5wdXNoU3RhdGUoKTsKLSAgICAgICAgICBnLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0gICAgICAgICAgc3VwZXIuZmlsbFNoYXBlKGcpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGcucG9wU3RhdGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgfTsKLSAgICBkZWMuc2V0RmlsbChmaWxsKTsKLSAgICBkZWMuc2V0VGVtcGxhdGUoUG9seWdvbkRlY29yYXRpb24uVFJJQU5HTEVfVElQKTsKLSAgICBkZWMuc2V0U2NhbGUoMTQsNik7Ci0gICAgc2V0VGFyZ2V0RGVjb3JhdGlvbihkZWMpOwotICB9Ci0gIAotCi0gIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25Sb3V0ZXIoQ29ubmVjdGlvblJvdXRlciBjcikKLSAgewotICAgIGlmIChjciAhPSBudWxsICYmIGdldENvbm5lY3Rpb25Sb3V0ZXIoKSAhPSBudWxsICYmICEoZ2V0Q29ubmVjdGlvblJvdXRlcigpIGluc3RhbmNlb2YgTWFuaGF0dGFuQ29ubmVjdGlvblJvdXRlcikpCi0gICAgICBzdXBlci5zZXRDb25uZWN0aW9uUm91dGVyKGNyKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN1cnJlbnQgaGlnaGxpZ2h0IHN0YXR1cy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSGlnaGxpZ2h0ZWQoKQotICB7Ci0gICAgcmV0dXJuIGhpZ2hsaWdodDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gaGlnaGxpZ2h0Ci0gICAqICAgICAgICAgIFRoZSBoaWdobGlnaHQgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SGlnaGxpZ2h0KGJvb2xlYW4gaGlnaGxpZ2h0KQotICB7Ci0gICAgdGhpcy5oaWdobGlnaHQgPSBoaWdobGlnaHQ7Ci0gICAgLy8gVXBkYXRlIG91ciBjb25uZWN0aW9uIHRvIHVzZSB0aGUgY29ycmVjdCBjb2xvdXJpbmcKLSAgICBib29sZWFuIGhpZ2hDb250cmFzdCA9IGZhbHNlOwotICAgIHRyeQotICAgIHsKLSAgICAgIGhpZ2hDb250cmFzdCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEhpZ2hDb250cmFzdCgpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBpZiAoaGlnaENvbnRyYXN0KQotICAgIHsKLSAgICAgIHNldEZvcmVncm91bmRDb2xvcihoaWdobGlnaHQgPyBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0ZPUkVHUk9VTkQpIDogQ29sb3JDb25zdGFudHMubGlnaHRHcmF5KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldEZvcmVncm91bmRDb2xvcihoaWdobGlnaHQgPyBhY3RpdmVDb25uZWN0aW9uIDogaW5hY3RpdmVDb25uZWN0aW9uKTsKLSAgICB9Ci0gICAgc2V0T3BhcXVlKGhpZ2hsaWdodCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvQWJzdHJhY3RNb2RlbENvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvQWJzdHJhY3RNb2RlbENvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlYjg4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0Fic3RyYWN0TW9kZWxDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TW9kZWxDb2xsZWN0aW9uIGltcGxlbWVudHMgSUFEVE9iamVjdAotewotICBwcm90ZWN0ZWQgSUFEVE9iamVjdCBtb2RlbDsKLSAgcHJvdGVjdGVkIFN0cmluZyBraW5kOwotICAKLSAgcHVibGljIEFic3RyYWN0TW9kZWxDb2xsZWN0aW9uKElBRFRPYmplY3QgbW9kZWwsIFN0cmluZyBraW5kKQotICB7Ci0gICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldE1vZGVsKCkKLSAgewotICAgIHJldHVybiBtb2RlbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKElBRFRPYmplY3QgbW9kZWwpCi0gIHsKLSAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEtpbmQoKQotICB7Ci0gICAgcmV0dXJuIGtpbmQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRLaW5kKFN0cmluZyBraW5kKQotICB7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgfQotICAKLSAgcHVibGljIGFic3RyYWN0IExpc3QgZ2V0Q2hpbGRyZW4oKTsKLQotICBwdWJsaWMgdm9pZCByZWdpc3Rlckxpc3RlbmVyKElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIG1vZGVsLnJlZ2lzdGVyTGlzdGVuZXIobGlzdGVuZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdW5yZWdpc3Rlckxpc3RlbmVyKElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIG1vZGVsLnVucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0Fubm90YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjY3YTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVN0cnVjdHVyZTsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb24KLXsKLSAgQ29tcGFydG1lbnQgY29tcGFydG1lbnQ7Ci0gIHB1YmxpYyBBbm5vdGF0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbXBhcnRtZW50KENvbXBhcnRtZW50IGNvbXBhcnRtZW50KQotICB7Ci0gICAgdGhpcy5jb21wYXJ0bWVudCA9IGNvbXBhcnRtZW50OwotICB9Ci0gIAotICBwdWJsaWMgQ29tcGFydG1lbnQgZ2V0Q29tcGFydG1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGNvbXBhcnRtZW50OwotICB9Ci0gIAotICBwdWJsaWMgSVN0cnVjdHVyZSBnZXRPd25lcigpCi0gIHsKLSAgICByZXR1cm4gY29tcGFydG1lbnQuZ2V0T3duZXIoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9Db21wYXJ0bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9Db21wYXJ0bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjhjZDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvQ29tcGFydG1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci0KLXB1YmxpYyBjbGFzcyBDb21wYXJ0bWVudCBpbXBsZW1lbnRzIElBRFRPYmplY3QKLXsKLSAgU3RyaW5nIGtpbmQ7Ci0gIElTdHJ1Y3R1cmUgb3duZXI7Ci0KLSAgcHVibGljIENvbXBhcnRtZW50KElTdHJ1Y3R1cmUgb3duZXIsIFN0cmluZyBraW5kKQotICB7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgICB0aGlzLm93bmVyID0gb3duZXI7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gb3duZXIuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpIGkubmV4dCgpOwotICAgICAgaWYgKGtpbmQgPT0gbnVsbCB8fCBraW5kLmVxdWFscyhmaWVsZC5nZXRLaW5kKCkpKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChmaWVsZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRLaW5kKCkKLSAgewotICAgIHJldHVybiBraW5kOwotICB9Ci0gIAotICBwdWJsaWMgSVN0cnVjdHVyZSBnZXRPd25lcigpCi0gIHsKLSAgICByZXR1cm4gb3duZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWdpc3Rlckxpc3RlbmVyKElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIC8vIHJlYWxseSB3ZSB3YW50IHRvIGxpc3RlbiB0byB0aGUgb3duZXIKLSAgICBvd25lci5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICAvLyByZWFsbHkgd2Ugd2FudCB0byBsaXN0ZW4gdG8gdGhlIG93bmVyCi0gICAgb3duZXIudW5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0ZvY3VzVHlwZUNvbHVtbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9Gb2N1c1R5cGVDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBhNmZjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0ZvY3VzVHlwZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBGb2N1c1R5cGVDb2x1bW4gZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbgotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZvY3VzT2JqZWN0ID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgRm9jdXNUeXBlQ29sdW1uKElBRFRPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBzdXBlcihtb2RlbCwgIkZvY3VzVHlwZUNvbHVtbiIpOyAvLyROT04tTkxTLTEkICAKLSAgfQotCi0gIHB1YmxpYyBGb2N1c1R5cGVDb2x1bW4oSUFEVE9iamVjdCBtb2RlbCwgYm9vbGVhbiBpc0ZvY3VzT2JqZWN0KQotICB7Ci0gICAgc3VwZXIobW9kZWwsICJGb2N1c1R5cGVDb2x1bW4iKTsgLy8kTk9OLU5MUy0xJAotICAgIHRoaXMuaXNGb2N1c09iamVjdCA9IGlzRm9jdXNPYmplY3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsgIAotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElUeXBlKQotICAgIHsKLSAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpbW9kZWw7Ci0gICAgICBpZiAodHlwZS5nZXRTdXBlclR5cGUoKSAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIHJlc3VsdC5hZGQodHlwZS5nZXRTdXBlclR5cGUoKSk7Ci0gICAgICB9Ci0gICAgICByZXN1bHQuYWRkKHR5cGUpOwotICAgIH0gIAotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUZpZWxkIHx8Ci0gICAgICAgICAgICAgbW9kZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlKQotICAgIHsgICAKLSAgICAgIHJlc3VsdC5hZGQobW9kZWwpOwotICAgIH0gICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsgICAgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzRm9jdXNPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIGlzRm9jdXNPYmplY3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSUFjdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0lBY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODQ0M2ZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSUFjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvblByb3ZpZGVyCi17Ci0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9JRmVlZGJhY2tIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0lGZWVkYmFja0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlODYwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0lGZWVkYmFja0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGZWVkYmFja0hhbmRsZXIKLXsKLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKTsKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSUdyYXBoRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9JR3JhcGhFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMmY1Y2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9JR3JhcGhFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUdyYXBoRWxlbWVudAotewotICBib29sZWFuIGlzRm9jdXNBbGxvd2VkKCk7Ci0gIElBRFRPYmplY3QgZ2V0VG9wQ29udGFpbmVyKCk7Ci0gIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpOwotICBJTW9kZWwgZ2V0TW9kZWwoKTsKLSAgYm9vbGVhbiBpc1JlYWRPbmx5KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0lNb2RlbFByb3h5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0lNb2RlbFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNjNjMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9JTW9kZWxQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbFByb3h5Ci17Ci0gIElNb2RlbCBnZXRNb2RlbCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9SZWZlcmVuY2VkVHlwZUNvbHVtbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9SZWZlcmVuY2VkVHlwZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWY4OTcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvUmVmZXJlbmNlZFR5cGVDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JVHlwZTsKLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZWRUeXBlQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RNb2RlbENvbGxlY3Rpb24KLXsKLSAgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIEludGVybmFsTGlzdGVuZXIgaW50ZXJuYWxMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbExpc3RlbmVyKCk7Ci0gIAotICAvLyB0b2RvLi4uIHJlYWxseSB0aGlzIHRoaXMgbW9kZWwgb2JqZWN0IHNob3VsZCBsaXN0ZW4KLSAgLy8gdG8gdGhlIHBhcmVudCBvZiB0aGUgSVR5cGUKLSAgLy8KLSAgcHVibGljIFJlZmVyZW5jZWRUeXBlQ29sdW1uKElBRFRPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBzdXBlcihtb2RlbCwgIlJlZmVyZW5jZWRUeXBlQ29sdW1uIik7IC8vJE5PTi1OTFMtMSQKLSAgICBtb2RlbC5yZWdpc3Rlckxpc3RlbmVyKGludGVybmFsTGlzdGVuZXIpOwotICAgIGludGVybmFsTGlzdGVuZXIucmVjb21wdXRlU3ViTGlzdGVuZXJzKCk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsgIAotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmUpCi0gICAgewotICAgICAgSVN0cnVjdHVyZSBzdHJ1Y3R1cmUgPSAoSVN0cnVjdHVyZSltb2RlbDsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHN0cnVjdHVyZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKWkubmV4dCgpOwotICAgICAgICBJVHlwZSB0eXBlID0gZmllbGQuZ2V0VHlwZSgpOwotICAgICAgICBpZiAodHlwZSAhPSBudWxsKSAgLy8gJiYgdHlwZS5pc0NvbXBsZXhUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIXJlc3VsdC5jb250YWlucyh0eXBlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIElHcmFwaEVsZW1lbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICgoKElHcmFwaEVsZW1lbnQpdHlwZSkuaXNGb2N1c0FsbG93ZWQoKSkKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gIAotICAgICAgICB9ICAKLSAgICAgIH0gICAgICAgIAotICAgIH0gIAotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUZpZWxkKQotICAgIHsKLSAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpbW9kZWw7Ci0gICAgICBJVHlwZSB0eXBlID0gZmllbGQuZ2V0VHlwZSgpOwotICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgLy8gICYmIHR5cGUuaXNDb21wbGV4VHlwZSgpKQotICAgICAgewotICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIElHcmFwaEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKChJR3JhcGhFbGVtZW50KXR5cGUpLmlzRm9jdXNBbGxvd2VkKCkpCi0gICAgICAgICAgICByZXN1bHQuYWRkKHR5cGUpOyAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAKLSAgCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0gICAKLSAgCi0gIHByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhPYmplY3QgY2hhbmdlZE9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgTGlzdCBjbG9uZWRMaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgY2xvbmVkTGlzdGVuZXJMaXN0LmFkZEFsbChsaXN0ZW5lckxpc3QpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGNsb25lZExpc3RlbmVyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lciA9IChJQURUT2JqZWN0TGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICBsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQodGhpcywgbnVsbCk7Ci0gICAgfSAKLSAgfSAgIAotICAKLSAgcHJvdGVjdGVkIGNsYXNzIEludGVybmFsTGlzdGVuZXIgaW1wbGVtZW50cyBJQURUT2JqZWN0TGlzdGVuZXIKLSAgewotICAgIExpc3QgZmllbGRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgdm9pZCByZWNvbXB1dGVTdWJMaXN0ZW5lcnMoKQotICAgIHsKLSAgICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmUpCi0gICAgICB7ICAKLSAgICAgICAgLy8gcmVtb3ZlIG9sZCBvbmVzCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGZpZWxkcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKSBpLm5leHQoKTsKLSAgICAgICAgICBmaWVsZC51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYWRkIG5ldyBvbmVzCi0gICAgICAgIGZpZWxkcy5jbGVhcigpOwotICAgICAgICBJU3RydWN0dXJlIGNvbXBsZXhUeXBlID0gKElTdHJ1Y3R1cmUpIG1vZGVsOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb21wbGV4VHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKSBpLm5leHQoKTsKLSAgICAgICAgICBmaWVsZHMuYWRkKGZpZWxkKTsKLSAgICAgICAgICBmaWVsZC5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICBpZiAob2JqZWN0ID09IG1vZGVsKQotICAgICAgewotICAgICAgICAvLyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgZmllbGRzIHdlJ3JlIGxpc3RlbmluZyB0b28KLSAgICAgICAgLy8gc2luY2UgdGhlc2UgbWF5IGhhdmUgY2hhbmdlZAotICAgICAgICByZWNvbXB1dGVTdWJMaXN0ZW5lcnMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElGaWVsZCkKLSAgICAgIHsKLSAgICAgIH0gIAotICAgICAgbm90aWZ5TGlzdGVuZXJzKG9iamVjdCwgcHJvcGVydHkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9Sb290SG9sZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1Jvb3RIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E3YjNhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1Jvb3RIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgUm9vdEhvbGRlcgotewotICBJQURUT2JqZWN0IG1vZGVsOwotCi0gIHB1YmxpYyBSb290SG9sZGVyKElBRFRPYmplY3QgbW9kZWwpCi0gIHsKLSAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRNb2RlbCgpCi0gIHsKLSAgICByZXR1cm4gbW9kZWw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvQURURGlyZWN0RWRpdFBvbGljeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9BRFREaXJlY3RFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZjIyYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9BRFREaXJlY3RFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQuQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEFEVERpcmVjdEVkaXRQb2xpY3kgZXh0ZW5kcyBEaXJlY3RFZGl0UG9saWN5Ci17Ci0gIHByb3RlY3RlZCBDb21ib0JveENlbGxFZGl0b3JNYW5hZ2VyIGRlbGVnYXRlOwotICBwcm90ZWN0ZWQgSUFEVFVwZGF0ZUNvbW1hbmQgY29tbWFuZDsKLQotICBwdWJsaWMgQURURGlyZWN0RWRpdFBvbGljeSgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFVwZGF0ZUNvbW1hbmQoSUFEVFVwZGF0ZUNvbW1hbmQgY29tbWFuZCkKLSAgewotICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNob3dDdXJyZW50RWRpdFZhbHVlKERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpIAotICB7ICAgICAgCi0gICAgZ2V0SG9zdEZpZ3VyZSgpLmdldFVwZGF0ZU1hbmFnZXIoKS5wZXJmb3JtVXBkYXRlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29tbWFuZCBnZXREaXJlY3RFZGl0Q29tbWFuZChEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgY29tbWFuZC5zZXRSZXF1ZXN0KHJlcXVlc3QpOwotICAgIHJldHVybiAoQ29tbWFuZCljb21tYW5kOyAKLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0FEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQ3MTY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklGZWVkYmFja0hhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBBRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3kgZXh0ZW5kcyBTZWxlY3Rpb25FZGl0UG9saWN5Ci17Ci0KLSAgcHVibGljIEFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeSgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpCi0gIHsKLSAgICBpZiAoZ2V0SG9zdCgpIGluc3RhbmNlb2YgSUZlZWRiYWNrSGFuZGxlcikKLSAgICB7Ci0gICAgICAoKElGZWVkYmFja0hhbmRsZXIpIGdldEhvc3QoKSkucmVtb3ZlRmVlZGJhY2soKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkKLSAgewotICAgIGlmIChnZXRIb3N0KCkgaW5zdGFuY2VvZiBJRmVlZGJhY2tIYW5kbGVyKQotICAgIHsKLSAgICAgICgoSUZlZWRiYWNrSGFuZGxlcikgZ2V0SG9zdCgpKS5hZGRGZWVkYmFjaygpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc2hvd0ZvY3VzKCkKLSAgewotICAgIHN1cGVyLnNob3dGb2N1cygpOwotICAgIGdldEhvc3QoKS5zZXRGb2N1cyh0cnVlKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaGlkZUZvY3VzKCkKLSAgewotICAgIHN1cGVyLmhpZGVGb2N1cygpOwotICAgIGdldEhvc3QoKS5zZXRGb2N1cyhmYWxzZSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9EaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvRGlyZWN0RWRpdFBvbGljeURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MWI0OTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9EaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzOwotICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIERpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZQoteyAgICAgICAKLSAgcHVibGljIHZvaWQgcGVyZm9ybUVkaXQoQ2VsbEVkaXRvciBjZWxsRWRpdG9yKTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9JQURUVXBkYXRlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9JQURUVXBkYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGM0ZWI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvSUFEVFVwZGF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElBRFRVcGRhdGVDb21tYW5kCi17Ci0gIHZvaWQgc2V0UmVxdWVzdChEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9LZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMGVlNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9LZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuR3JhcGhpY2FsRWRpdFBvbGljeTsKLQotcHVibGljIGNsYXNzIEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kgZXh0ZW5kcyBHcmFwaGljYWxFZGl0UG9saWN5Ci17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWSA9ICJLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5IjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgaW50IE9VVF9UT19QQVJFTlQgPSBQb3NpdGlvbkNvbnN0YW50cy5BTFdBWVNfTEVGVDsKLSAgcHVibGljIHN0YXRpYyBpbnQgSU5fVE9fRklSU1RfQ0hJTEQgPSBQb3NpdGlvbkNvbnN0YW50cy5BTFdBWVNfUklHSFQ7Ci0gIAotICBwdWJsaWMgRWRpdFBhcnQgZ2V0UmVsYXRpdmVFZGl0UGFydChFZGl0UGFydCBlZGl0UGFydCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL1NpbXBsZURpcmVjdEVkaXRQb2xpY3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvU2ltcGxlRGlyZWN0RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTM4ZTM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvU2ltcGxlRGlyZWN0RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5EaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1wdWJsaWMgY2xhc3MgU2ltcGxlRGlyZWN0RWRpdFBvbGljeSBleHRlbmRzIERpcmVjdEVkaXRQb2xpY3kgCi17Ci0gIHByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUgZGVsZWdhdGU7Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVsZWdhdGUoRGlyZWN0RWRpdFBvbGljeURlbGVnYXRlIGRlbGVnYXRlKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLSAgfQotCi0gIHByb3RlY3RlZCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBnZXREaXJlY3RFZGl0Q29tbWFuZChmaW5hbCBEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSAKLSAgeyAKLSAgCXJldHVybiBuZXcgQ29tbWFuZCgpIC8vQWJzdHJhY3RDb21tYW5kKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoZGVsZWdhdGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGRlbGVnYXRlLnBlcmZvcm1FZGl0KHJlcXVlc3QuZ2V0Q2VsbEVkaXRvcigpKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAgICAKLSAgCi0gICAgICBwdWJsaWMgdm9pZCByZWRvKCkKLSAgICAgIHsKLSAgICAgIH0gIAotICAKLSAgICAgIHB1YmxpYyB2b2lkIHVuZG8oKQotICAgICAgewotICAgICAgfSAgICAgCi0gIAotICAgICAgcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH07Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNob3dDdXJyZW50RWRpdFZhbHVlKERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpIAotICB7ICAgICAgCi0gIAkvL2hhY2sgdG8gcHJldmVudCBhc3luYyBsYXlvdXQgZnJvbSBwbGFjaW5nIHRoZSBjZWxsIGVkaXRvciB0d2ljZS4KLSAgCWdldEhvc3RGaWd1cmUoKS5nZXRVcGRhdGVNYW5hZ2VyKCkucGVyZm9ybVVwZGF0ZSgpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSUFEVEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSUFEVEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODRhMjYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9maWd1cmVzL0lBRFRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLQotcHVibGljIGludGVyZmFjZSBJQURURmlndXJlIGV4dGVuZHMgSUZpZ3VyZQotewotICB2b2lkIGVkaXRQYXJ0QXR0YWNoZWQoRWRpdFBhcnQgb3duZXIpOyAKLSAgdm9pZCBhZGRTZWxlY3Rpb25GZWVkYmFjaygpOwotICB2b2lkIHJlbW92ZVNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0gIHZvaWQgcmVmcmVzaFZpc3VhbHMoT2JqZWN0IG1vZGVsKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9maWd1cmVzL0lDb21wYXJ0bWVudEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSUNvbXBhcnRtZW50RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjVkZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSUNvbXBhcnRtZW50RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLQotcHVibGljIGludGVyZmFjZSBJQ29tcGFydG1lbnRGaWd1cmUgZXh0ZW5kcyBJQURURmlndXJlCi17Ci0gIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKTsKLSAgSUZpZ3VyZSBnZXRBbm5vdGF0aW9uUGFuZSgpOyAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JRmllbGRGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9maWd1cmVzL0lGaWVsZEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmFiZWIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9maWd1cmVzL0lGaWVsZEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUZpZWxkRmlndXJlIGV4dGVuZHMgSUFEVEZpZ3VyZQotewotICBMYWJlbCBnZXRUeXBlTGFiZWwoKTsKLSAgTGFiZWwgZ2V0TmFtZUxhYmVsKCk7Ci0gIExhYmVsIGdldE5hbWVBbm5vdGF0aW9uTGFiZWwoKTsKLSAgTGFiZWwgZ2V0VHlwZUFubm90YXRpb25MYWJlbCgpOwotICB2b2lkIHJlY29tcHV0ZUxheW91dCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSUZpZ3VyZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9maWd1cmVzL0lGaWd1cmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZWZlNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSUZpZ3VyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlczsKLQotcHVibGljIGludGVyZmFjZSBJRmlndXJlRmFjdG9yeQotewotICBJRmllbGRGaWd1cmUgY3JlYXRlRmllbGRGaWd1cmUoT2JqZWN0IG1vZGVsKTsKLSAgSVN0cnVjdHVyZUZpZ3VyZSBjcmVhdGVTdHJ1Y3R1cmVGaWd1cmUoT2JqZWN0IG1vZGVsKTsKLSAgSUNvbXBhcnRtZW50RmlndXJlIGNyZWF0ZUNvbXBhcnRtZW50RmlndXJlKE9iamVjdCBtb2RlbCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JU3RydWN0dXJlRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JU3RydWN0dXJlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOTZhZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSVN0cnVjdHVyZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLQotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlRmlndXJlIGV4dGVuZHMgSUFEVEZpZ3VyZQotewotICBJRmlndXJlIGdldENvbnRlbnRQYW5lKCk7Ci0gIExhYmVsIGdldE5hbWVMYWJlbCgpOwotICBib29sZWFuIGhpdFRlc3RIZWFkZXIoUG9pbnQgcG9pbnQpOyAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0L0NvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0L0NvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YWM5OWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdC9Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcjsKLQotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcgotewotICBwdWJsaWMgSUNvbXBvbmVudERpYWxvZyBnZXRCcm93c2VEaWFsb2coKTsKLSAgcHVibGljIElDb21wb25lbnREaWFsb2cgZ2V0TmV3RGlhbG9nKCk7Ci0gIHB1YmxpYyB2b2lkIG1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShPYmplY3QgcmVmZXJlbmNpbmdPYmplY3QsIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmVmZXJlbmNlZENvbXBvbmVudCk7Ci0gIHB1YmxpYyBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBnZXRDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyKCk7Ci0gIAotICBwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGdldFF1aWNrUGlja3MoKTsKLSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBnZXRIaXN0b3J5KCk7Ci0gIHB1YmxpYyB2b2lkIGFkZFRvSGlzdG9yeShDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudCk7ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXQvQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0L0NvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDEzMTJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXQvQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyMiBleHRlbmRzIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyCi17Ci0gIHZvaWQgc2V0UmVmZXJlbmNlcihJQURUT2JqZWN0IGZpZWxkKTsKLSAgSUFEVE9iamVjdCBnZXRSZWZlcmVuY2VyKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0L0lDb21wb25lbnREaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXQvSUNvbXBvbmVudERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTk0ZjliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXQvSUNvbXBvbmVudERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBvbmVudERpYWxvZyAgewotICAKLQkvKgotCSAqIFNldCB0aGUgT2JqZWN0IGJlaW5nIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uKTsKLQkKLQkvKgotCSAqIFJldHVybiB0aGUgT2JqZWN0IHdoaWNoIHNob3VsZCBiZSB1c2VkIGFzIHRoZSB0eXBlLgotCSAqLwotCXB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldFNlbGVjdGVkQ29tcG9uZW50KCk7Ci0JCi0JLyoKLQkgKiBVc2VkIHRvIG9wZW4gdGhlIERpYWxvZwotCSAqLwotCXB1YmxpYyBpbnQgY3JlYXRlQW5kT3BlbigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9BRFRFeHRlcm5hbFJlc291cmNlVmFyaWFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0FEVEV4dGVybmFsUmVzb3VyY2VWYXJpYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YmY3NmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0FEVEV4dGVybmFsUmVzb3VyY2VWYXJpYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplc3BlciBTdGVlbiBNb2xsZXIgLSBhZGRlZCByZXNvbHZlciBsb29rdXBzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklFbmNvZGVkU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm1PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIEFEVEV4dGVybmFsUmVzb3VyY2VWYXJpYW50IGV4dGVuZHMgUGxhdGZvcm1PYmplY3QKLXsKLSAgcHJpdmF0ZSBJU3RvcmFnZSBzdG9yYWdlOwotICBwcml2YXRlIFN0cmluZyB1cmxTdHJpbmc7Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2hhcnNldChTdHJpbmcgbmFtZSwgSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBnZXRDb250ZW50RGVzY3JpcHRpb24obmFtZSwgc3RyZWFtKTsKLSAgICByZXR1cm4gZGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBkZXNjcmlwdGlvbi5nZXRDaGFyc2V0KCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIElDb250ZW50RGVzY3JpcHRpb24gZ2V0Q29udGVudERlc2NyaXB0aW9uKFN0cmluZyBuYW1lLCBJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgSUNvbnRlbnRUeXBlTWFuYWdlciBjb250ZW50VHlwZU1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXR1cm4gY29udGVudFR5cGVNYW5hZ2VyLmdldERlc2NyaXB0aW9uRm9yKHN0cmVhbSwgbmFtZSwgSUNvbnRlbnREZXNjcmlwdGlvbi5BTEwpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBBRFRFeHRlcm5hbFJlc291cmNlVmFyaWFudChTdHJpbmcgdXJsU3RyaW5nKQotICB7Ci0gICAgdGhpcy51cmxTdHJpbmcgPSB1cmxTdHJpbmc7Ci0gIH0KLQotICBjbGFzcyBYU0RSZXNvdXJjZVZhcmlhbnRTdG9yYWdlIGltcGxlbWVudHMgSUVuY29kZWRTdG9yYWdlCi0gIHsKLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgCSAgU3RyaW5nIHBoeXNpY2FsVXJsU3RyaW5nID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbihudWxsLCBudWxsLCB1cmxTdHJpbmcpOwotICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHBoeXNpY2FsVXJsU3RyaW5nKTsKLSAgICAgICAgICBVUkxDb25uZWN0aW9uIHVybENvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgICByZXR1cm4gdXJsQ29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gdG9FeGNlcHRpb24pCi0gICAgICB7Ci0gICAgICAgIC8vIGhhbmRsZQotICAgICAgfQotICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0KLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGF0aCBnZXRGdWxsUGF0aCgpCi0gICAgewotICAgICAgLy8gU2luY2UgdGhpcyBpcyBsb2FkZWQgZnJvbSBhbiBVUkwsIHRoaXMgc2hvdWxkIG5ldmVyIGJlIGludGVycHJldGVkIGFzIGEgcGF0aAotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gdXJsU3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKQotICAgIHsKLSAgICAgIHJldHVybiBBRFRFeHRlcm5hbFJlc291cmNlVmFyaWFudC50aGlzLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFyc2V0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICB7Ci0gICAgICBJbnB1dFN0cmVhbSBjb250ZW50cyA9IGdldENvbnRlbnRzKCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGNoYXJTZXQgPSBBRFRFeHRlcm5hbFJlc291cmNlVmFyaWFudC5nZXRDaGFyc2V0KGdldE5hbWUoKSwgY29udGVudHMpOwotICAgICAgICByZXR1cm4gY2hhclNldDsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFhTREVkaXRvclBsdWdpbi5QTFVHSU5fSUQsIElSZXNvdXJjZVN0YXR1cy5GQUlMRURfREVTQ1JJQklOR19DT05URU5UUywgTkxTLmJpbmQoIiIsIG5ldyBTdHJpbmdbXSB7IGdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSB9KSwgZSkpOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGNvbnRlbnRzLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvRXhjZXB0aW9uKQotICAgICAgICB7Ci0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBJU3RvcmFnZSBnZXRTdG9yYWdlKCkKLSAgewotICAgIGlmIChzdG9yYWdlID09IG51bGwpCi0gICAgewotICAgICAgc3RvcmFnZSA9IG5ldyBYU0RSZXNvdXJjZVZhcmlhbnRTdG9yYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiBzdG9yYWdlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQURURmlsZVN0b3JlRWRpdG9ySW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9BRFRGaWxlU3RvcmVFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWZjODc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9BRFRGaWxlU3RvcmVFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5GaWxlU3RvcmVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgQURURmlsZVN0b3JlRWRpdG9ySW5wdXQgZXh0ZW5kcyBGaWxlU3RvcmVFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElBRFRFZGl0b3JJbnB1dAotewotICBwcml2YXRlIFhTRFNjaGVtYSBzY2hlbWE7Ci0gIHByaXZhdGUgU3RyaW5nIGVkaXRvck5hbWU7Ci0KLSAgcHVibGljIEFEVEZpbGVTdG9yZUVkaXRvcklucHV0KElGaWxlU3RvcmUgZmlsZVN0b3JlLCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIoZmlsZVN0b3JlKTsKLSAgICB0aGlzLnNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0U2NoZW1hKCkKLSAgewotICAgIHJldHVybiBzY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFZGl0b3JOYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgZWRpdG9yTmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgaWYgKGVkaXRvck5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZWRpdG9yTmFtZTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmdldE5hbWUoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKQotICB7Ci0gICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBucyA9IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgIGlmIChucyAhPSBudWxsICYmIG5zLmxlbmd0aCgpID4gMCkKLSAgICAgICAgcmV0dXJuIE1lc3NhZ2VzLl9VSV9MQUJFTF9UQVJHRVRfTkFNRVNQQUNFICsgbnM7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBNZXNzYWdlcy5fVUlfTEFCRUxfTk9fTkFNRVNQQUNFOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIuZ2V0VG9vbFRpcFRleHQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0FEVE11bHRpUGFnZUVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0FEVE11bHRpUGFnZUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmQzYjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9BRFRNdWx0aVBhZ2VFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlNlbGVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5ab29tTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29udGV4dHMuSUNvbnRleHRBY3RpdmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnRleHRzLklDb250ZXh0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkFEVEZsb2F0aW5nVG9vbGJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkFEVEVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuQURUQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuQURUTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLkV4dGVuc2libGVDb250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQURUTXVsdGlQYWdlRWRpdG9yIGV4dGVuZHMgQ29tbW9uTXVsdGlQYWdlRWRpdG9yCi17Ci0gIHByb3RlY3RlZCBJTW9kZWwgbW9kZWw7Ci0gIHByaXZhdGUgaW50IGN1cnJlbnRQYWdlID0gLTE7Ci0gIHByb3RlY3RlZCBCdXR0b24gdGFibGVPZkNvbnRlbnRzQnV0dG9uOwotICBwcm90ZWN0ZWQgQURURmxvYXRpbmdUb29sYmFyIGZsb2F0aW5nVG9vbGJhcjsKLSAgcHJpdmF0ZSBJQ29udGV4dEFjdGl2YXRpb24gY29udGV4dEFjdGl2YXRpb247Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFU0lHTl9WSUVXX0NPTlRFWFQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5lZGl0b3IuZGVzaWduVmlldyI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU09VUkNFX1ZJRVdfQ09OVEVYVCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmVkaXRvci5zb3VyY2VWaWV3IjsgLy8kTk9OLU5MUy0xJAotICAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBtdWx0aS1wYWdlIGVkaXRvciBleGFtcGxlLgotICAgKi8KLSAgcHVibGljIEFEVE11bHRpUGFnZUVkaXRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgCi0gIHByaXZhdGUgY2xhc3MgSW50ZXJuYWxMYXlvdXQgZXh0ZW5kcyBTdGFja0xheW91dAotICB7Ci0gICAgcHVibGljIEludGVybmFsTGF5b3V0KCkKLSAgICB7Ci0gICAgICBzdXBlcigpOyAgCi0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpCi0gICAgewotICAgICAgQ29udHJvbCBjaGlsZHJlbltdID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0gICAgICBSZWN0YW5nbGUgcmVjdCA9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICByZWN0LnggKz0gbWFyZ2luV2lkdGg7Ci0gICAgICByZWN0LnkgKz0gbWFyZ2luSGVpZ2h0OwotICAgICAgcmVjdC53aWR0aCAtPSAyICogbWFyZ2luV2lkdGg7Ci0gICAgICByZWN0LmhlaWdodCAtPSAyICogbWFyZ2luSGVpZ2h0OwotICAgICAgCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSAKLSAgICAgIHsKLSAgICAgICAgaWYgKGkgPT0gMCkgIC8vIEZvciB0aGUgYmFjayB0byBzY2hlbWEgYnV0dG9uIAotICAgICAgICB7IAotICAgICAgICAgIG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGUgciA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpZmxvYXRpbmdUb29sYmFyLmdldENvbnRlbnRzKCkpLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotICAgICAgICAgIGNoaWxkcmVuW2ldLnNldEJvdW5kcyhyZWN0LnggKyAxMCwgcmVjdC55ICsgMTAsIHIud2lkdGgsIE1hdGgubWF4KDI0LCByLmhlaWdodCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGkgPT0gMSAmJiBtb2RlQ29tYm8gIT0gbnVsbCkgLy8gRm9yIHRoZSBkcm9wIGRvd24gdG9vbGJhcgotICAgICAgICB7Ci0gICAgICAgICAgY2hpbGRyZW5baV0uc2V0Qm91bmRzKHJlY3QueCArIHJlY3Qud2lkdGggLSA5MCAtIG1heExlbmd0aCwgcmVjdC55ICsgMTAsIG1heExlbmd0aCArIDYwLCAyNik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvLyBGb3IgdGhlIG1haW4gZ3JhcGggdmlld2VyCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZHJlbltpXS5zZXRCb3VuZHMocmVjdCk7ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9ICAgICAgIAotICAgIH0gICAgICAgICAgICAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVHcmFwaFBhZ2VDb21wb3NpdGUoKQotICB7ICAgIAotICAgIENvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKGdldENvbnRhaW5lcigpLCBTV1QuRkxBVCk7Ci0gICAgcGFyZW50LnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgIAotICAgIHBhcmVudC5zZXRMYXlvdXQobmV3IEludGVybmFsTGF5b3V0KCkpOwotCi0gICAgZmxvYXRpbmdUb29sYmFyID0gbmV3IEFEVEZsb2F0aW5nVG9vbGJhcihnZXRNb2RlbCgpKTsKLSAgICBmbG9hdGluZ1Rvb2xiYXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICAgIGZsb2F0aW5nVG9vbGJhci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICBFZGl0UGFydEZhY3RvcnkgZWRpdFBhcnRGYWN0b3J5ID0gZ2V0RWRpdG9yTW9kZU1hbmFnZXIoKS5nZXRDdXJyZW50TW9kZSgpLmdldEVkaXRQYXJ0RmFjdG9yeSgpOwotICAgIGZsb2F0aW5nVG9vbGJhci5zZXRFZGl0UGFydEZhY3RvcnkoZWRpdFBhcnRGYWN0b3J5KTsKLSAgICAKLSAgICBjcmVhdGVWaWV3TW9kZVRvb2xiYXIocGFyZW50KTsKLSAgICAKLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHcmFwaFBhZ2UoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlR3JhcGhQYWdlKCk7IAotLy8gICAgdG9vbGJhclZpZXdlci5nZXRDb250cm9sKCkubW92ZUFib3ZlKGdyYXBoaWNhbFZpZXdlci5nZXRDb250cm9sKCkpOwotLy8gICAgZ3JhcGhpY2FsVmlld2VyLmdldENvbnRyb2woKS5tb3ZlQmVsb3codG9vbGJhclZpZXdlci5nZXRDb250cm9sKCkpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENvbnRyaWJ1dG9ySWQoKQotICB7Ci0gICAgcmV0dXJuICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvciI7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgcHVibGljIElDb250ZW50T3V0bGluZVBhZ2UgZ2V0Q29udGVudE91dGxpbmVQYWdlKCkKLSAgewotICAgIGlmIChmT3V0bGluZVBhZ2UgPT0gbnVsbCB8fCBmT3V0bGluZVBhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwgfHwgZk91dGxpbmVQYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgZmluYWwgUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyID0gKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpZ2V0QWRhcHRlcihQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICAgIEV4dGVuc2libGVDb250ZW50T3V0bGluZVBhZ2Ugb3V0bGluZVBhZ2UgPSBudWxsOwotICAgICAgaWYgKHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3V0bGluZVBhZ2UgPSBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmdldFByb2R1Y3RDb250ZW50T3V0bGluZVBhZ2UoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKG91dGxpbmVQYWdlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dGxpbmVQYWdlID0gbmV3IEFEVENvbnRlbnRPdXRsaW5lUGFnZSgpOwotICAgICAgfQotICAgICAgb3V0bGluZVBhZ2Uuc2V0RWRpdG9yKHRoaXMpOwotICAgICAgSVRyZWVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpZ2V0RWRpdG9yTW9kZU1hbmFnZXIoKS5nZXRDdXJyZW50TW9kZSgpLmdldE91dGxpbmVQcm92aWRlcigpOwotICAgICAgb3V0bGluZVBhZ2Uuc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgIEFEVExhYmVsUHJvdmlkZXIgYWR0TGFiZWxQcm92aWRlciA9IG5ldyBBRFRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICBvdXRsaW5lUGFnZS5zZXRMYWJlbFByb3ZpZGVyKGFkdExhYmVsUHJvdmlkZXIpOwotICAgICAgb3V0bGluZVBhZ2Uuc2V0TW9kZWwoZ2V0TW9kZWwoKSk7Ci0gICAgICBmT3V0bGluZVBhZ2UgPSBvdXRsaW5lUGFnZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZPdXRsaW5lUGFnZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIHRoZSBwYWdlcyBvZiB0aGUgbXVsdGktcGFnZSBlZGl0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpCi0gIHsKLSAgICBzZWxlY3Rpb25Qcm92aWRlciA9IGdldFNlbGVjdGlvbk1hbmFnZXIoKTsKLSAgICAKLSAgICBjcmVhdGVHcmFwaFBhZ2UoKTsKLSAgICBjcmVhdGVTb3VyY2VQYWdlKCk7Ci0gICAgCi0gICAgZ2V0RWRpdG9yU2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKHNlbGVjdGlvblByb3ZpZGVyKTsKLQotICAgIG1vZGVsID0gYnVpbGRNb2RlbCgpOyAgLy8gKElGaWxlRWRpdG9ySW5wdXQpZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgCi0gICAgaW5pdGlhbGl6ZUdyYXBoaWNhbFZpZXdlcigpOwotICAgIGZsb2F0aW5nVG9vbGJhci5zZXRNb2RlbChtb2RlbCk7Ci0gICAgCi0gICAgaW50IHBhZ2VJbmRleFRvU2hvdyA9IGdldERlZmF1bHRQYWdlVHlwZUluZGV4KCk7Ci0gICAgc2V0QWN0aXZlUGFnZShwYWdlSW5kZXhUb1Nob3cpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGludCBnZXREZWZhdWx0UGFnZVR5cGVJbmRleCgpIHsKLSAgICBpbnQgcGFnZUluZGV4ID0gU09VUkNFX1BBR0VfSU5ERVg7Ci0gICAgaWYgKFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXREZWZhdWx0UGFnZSgpLmVxdWFscyhYU0RFZGl0b3JQbHVnaW4uREVTSUdOX1BBR0UpKSB7Ci0gICAgICAgIHBhZ2VJbmRleCA9IERFU0lHTl9QQUdFX0lOREVYOwotICAgIH0KLQotICAgIHJldHVybiBwYWdlSW5kZXg7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkKLSAgewotICAgIHN1cGVyLnNldEZvY3VzKCk7Ci0gICAgaWYgKGdldEFjdGl2ZVBhZ2UoKSA9PSBERVNJR05fUEFHRV9JTkRFWCkKLSAgICB7Ci0gICAgICBpZiAoZ3JhcGhpY2FsVmlld2VyICE9IG51bGwgJiYgZ3JhcGhpY2FsVmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBMaXN0IHNlbGVjdGVkID0gZ3JhcGhpY2FsVmlld2VyLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0gICAgICAgIGlmIChzZWxlY3RlZC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgZ3JhcGhpY2FsVmlld2VyLnNldEZvY3VzKChFZGl0UGFydClzZWxlY3RlZC5nZXQoMCkpOwotICAgICAgICB9Ci0gICAgICAgIGdyYXBoaWNhbFZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBncmFwaGljYWxWaWV3ZXIuc2V0Rm9jdXMobnVsbCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgbmV3UGFnZUluZGV4KQotICB7Ci0JZGVhY3RpdmF0ZUNvbnRleHQoY29udGV4dEFjdGl2YXRpb24pOwotICAgIGN1cnJlbnRQYWdlID0gbmV3UGFnZUluZGV4OwotICAgIHN1cGVyLnBhZ2VDaGFuZ2UobmV3UGFnZUluZGV4KTsKLSAgICAKLSAgICBTdHJpbmcgY29udGV4dCA9IGdldENvbnRleHQoY3VycmVudFBhZ2UpOwotICAgIGNvbnRleHRBY3RpdmF0aW9uID0gYWN0aXZhdGVDb250ZXh0KGNvbnRleHQpOwotICAgIAotICAgIGlmIChuZXdQYWdlSW5kZXggPT0gREVTSUdOX1BBR0VfSU5ERVgpCi0gICAgewotICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBncmFwaGljYWxWaWV3ZXIuZ2V0U2VsZWN0aW9uTWFuYWdlcigpLmdldFNlbGVjdGlvbigpOwotICAgICAgT2JqZWN0IG1vZGVsID0gbnVsbDsKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICAgIC8vIFdoaWxlIGluIHRoZSBzb3VyY2Ugdmlldywgc2VsZWN0aW9uIGNvdWxkIGhhdmUgY2hhbmdlZC4KLSAgICAgICAgLy8gV2lsbCB0cnkgdG8gc2VsZWN0IHRoZSBmaXJzdCBpdGVtIHdoZW4gc3dpdGNoaW5nIGJhY2sgdG8gdGhlIGRlc2lnbiB2aWV3LgotICAgICAgICAvLyBXZSBjdXJyZW50bHkgZG8gbm90IG11bHRpLXNlbGVjdCBmaWd1cmVzIGlmIG11bHRpcGxlIGVsZW1lbnRzIGFyZSBzZWxlY3RlZCBpbiB0aGUgc291cmNlIHZpZXcuCi0gICAgICAgIC8vIEZvciBleGFtcGxlLCBpZiBtdWx0aXBsZSBnbG9iYWwgZWxlbWVudHMgYXJlIHNlbGVjdGVkLCB0aGUgZ3JhcGggdmlldyB3aWxsIGJlIGluIHRoZSBkZXRhaWxzIHZpZXcKLSAgICAgICAgLy8gb2YgdGhlIGZpcnN0IG9uZS4KLSAgICAgICAgT2JqZWN0IGVsZW0gPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBpZiAoZWxlbSBpbnN0YW5jZW9mIEVkaXRQYXJ0KQotICAgICAgICAgIG1vZGVsID0gKChFZGl0UGFydCllbGVtKS5nZXRNb2RlbCgpOwotICAgICAgfQotICAgICAgLy8gUmVmcmVzaCB0aGUgZGVzaWduIHBhZ2UgdXBvbiBwYWdlIGNoYW5nZQotICAgICAgZ3JhcGhpY2FsVmlld2VyLmdldENvbnRlbnRzKCkucmVmcmVzaCgpOwotICAgICAgLy8gTmVlZCB0byB1c2UgdGhlIGFkYXB0ZXIsIHNpbmNlIGFmdGVyIHJlZnJlc2gsIHRoZSBvbGQgZWRpdCBwYXJ0IHdpbGwgaGF2ZSBiZWVuIHJlcGxhY2VkCi0gICAgICAvLyBNYWludGFpbiBwcmV2aW91cyBzZWxlY3Rpb246Ci0gICAgICBpZiAobW9kZWwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb2RlbCkpOwotICAgICAgfQotICAgIH0KLSAgICBzZXRGb2N1cygpOwotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gaXNUYWJsZU9mQ29udGVudHNBcHBsaWNhYmxlKE9iamVjdCBncmFwaFZpZXdJbnB1dCkKLSAgewotICAgIHJldHVybiAhKGdyYXBoVmlld0lucHV0IGluc3RhbmNlb2YgSU1vZGVsKTsKLSAgfQotCi0gIHByb3RlY3RlZCBTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLSAgewotICAgIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gbmV3IERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIodGhpcywgZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICB2aWV3ZXIuYWRkSW5wdXRDaGFuZ2RMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5wdXQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGZsb2F0aW5nVG9vbGJhci5yZWZyZXNoKGlzVGFibGVPZkNvbnRlbnRzQXBwbGljYWJsZShpbnB1dC5nZXRGaXJzdEVsZW1lbnQoKSkpOwotICAgICAgfSAgICAgIAotICAgIH0pOwotICAgIC8vIFdvcmthcm91bmQgYnVnIDIyNzY4NyBBbiBlZGl0IHBhcnQncyBmb2N1cyBzdGF0ZSBpcyBub3QgdXBkYXRlZCBwcm9wZXJseQotICAgIC8vIE9uY2UgdGhpcyBpcyBidWcgaXMgZml4ZWQsIHdlIGNhbiByZW1vdmUgY3VzdG9tIHNlbGVjdGlvbiBtYW5hZ2VyCi0gICAgdmlld2VyLnNldFNlbGVjdGlvbk1hbmFnZXIobmV3IEN1c3RvbVNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmV0dXJuIHZpZXdlcjsKLSAgfQotCi0gIC8vIFdvcmthcm91bmQgYnVnIDIyNzY4NyBBbiBlZGl0IHBhcnQncyBmb2N1cyBzdGF0ZSBpcyBub3QgdXBkYXRlZCBwcm9wZXJseQotICAvLyBPbmNlIHRoaXMgaXMgYnVnIGlzIGZpeGVkLCB3ZSBjYW4gcmVtb3ZlIHRoaXMgY2xhc3MKLSAgcHJpdmF0ZSBjbGFzcyBDdXN0b21TZWxlY3Rpb25NYW5hZ2VyIGV4dGVuZHMgU2VsZWN0aW9uTWFuYWdlcgotICB7Ci0gICAgcHVibGljIHZvaWQgYXBwZW5kU2VsZWN0aW9uKEVkaXRQYXJ0IGVkaXRwYXJ0KQotICAgIHsKLSAgICAgIGlmIChlZGl0cGFydCAhPSBnZXRGb2N1cygpKQotICAgICAgICBnZXRWaWV3ZXIoKS5zZXRGb2N1cyhlZGl0cGFydCk7Ci0gICAgICBzdXBlci5hcHBlbmRTZWxlY3Rpb24oZWRpdHBhcnQpOwotICAgIH0KLSAgfQotICAKLSAgYWJzdHJhY3QgcHVibGljIElNb2RlbCBidWlsZE1vZGVsKCk7ICAvLyAoSUZpbGVFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCk7Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkKLSAgewotICAgIEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0QWN0aW9uUmVnaXN0cnkoKTsKLSAgICAKLSAgICBCYXNlU2VsZWN0aW9uQWN0aW9uIGFjdGlvbiA9IG5ldyBTZXRJbnB1dFRvR3JhcGhWaWV3KHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gIH0KLQotCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIHR5cGUpCi0gIHsKLSAgICBpZiAodHlwZSA9PSBab29tTWFuYWdlci5jbGFzcykKLSAgICAgIHJldHVybiBncmFwaGljYWxWaWV3ZXIuZ2V0UHJvcGVydHkoWm9vbU1hbmFnZXIuY2xhc3MudG9TdHJpbmcoKSk7Ci0gICAgCi0gICAgaWYgKHR5cGUgPT0gR3JhcGhpY2FsVmlld2VyLmNsYXNzKQotICAgICAgcmV0dXJuIGdyYXBoaWNhbFZpZXdlcjsKLSAgICBpZiAodHlwZSA9PSBFZGl0UGFydC5jbGFzcyAmJiBncmFwaGljYWxWaWV3ZXIgIT0gbnVsbCkKLSAgICAgIHJldHVybiBncmFwaGljYWxWaWV3ZXIuZ2V0Um9vdEVkaXRQYXJ0KCk7Ci0gICAgaWYgKHR5cGUgPT0gSUZpZ3VyZS5jbGFzcyAmJiBncmFwaGljYWxWaWV3ZXIgIT0gbnVsbCkKLSAgICAgIHJldHVybiAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBncmFwaGljYWxWaWV3ZXIuZ2V0Um9vdEVkaXRQYXJ0KCkpLmdldEZpZ3VyZSgpOwotCi0gICAgaWYgKHR5cGUgPT0gSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcykKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0Q29udGVudE91dGxpbmVQYWdlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIodHlwZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGdldEVkaXRQYXJ0RmFjdG9yeSgpIHsKLSAgICByZXR1cm4gbmV3IEFEVEVkaXRQYXJ0RmFjdG9yeSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdyYXBoaWNhbFZpZXdlcigpCi0gIHsKLSAgICBncmFwaGljYWxWaWV3ZXIuc2V0Q29udGVudHMobW9kZWwpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmIChjdXJyZW50UGFnZSA9PSBTT1VSQ0VfUEFHRV9JTkRFWCkKLSAgICB7Ci0gICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuc2V0U291cmNlUGFnZUFzRGVmYXVsdCgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLnNldERlc2lnblBhZ2VBc0RlZmF1bHQoKTsKLSAgICB9Ci0gICAgZmxvYXRpbmdUb29sYmFyID0gbnVsbDsKLQlkZWFjdGl2YXRlQ29udGV4dChjb250ZXh0QWN0aXZhdGlvbik7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dChpbnQgcGFnZUluZGV4KSB7Ci0JICBpZiAocGFnZUluZGV4ID09IERFU0lHTl9QQUdFX0lOREVYKSB7Ci0JCSAgcmV0dXJuIERFU0lHTl9WSUVXX0NPTlRFWFQ7Ci0JICB9IGVsc2UgaWYgKHBhZ2VJbmRleCA9PSBTT1VSQ0VfUEFHRV9JTkRFWCkgewotCQkgIHJldHVybiBTT1VSQ0VfVklFV19DT05URVhUOwotCSAgfQotCSAgCi0JICByZXR1cm4gbnVsbDsKLSAgfQotICBwcml2YXRlIElDb250ZXh0QWN0aXZhdGlvbiBhY3RpdmF0ZUNvbnRleHQoU3RyaW5nIGNvbnRleHQpIHsKLQkgIElDb250ZXh0U2VydmljZSBjb250ZXh0U2VydmljZSA9IChJQ29udGV4dFNlcnZpY2UpIGdldFNpdGUoKS5nZXRTZXJ2aWNlKElDb250ZXh0U2VydmljZS5jbGFzcyk7Ci0KLQkgIGlmIChjb250ZXh0U2VydmljZSAhPSBudWxsICYmIGNvbnRleHQgIT0gbnVsbCkgewotCQkgIHJldHVybiBjb250ZXh0QWN0aXZhdGlvbiA9IGNvbnRleHRTZXJ2aWNlLmFjdGl2YXRlQ29udGV4dChjb250ZXh0KTsKLQkgIH0KLQkgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgZGVhY3RpdmF0ZUNvbnRleHQoSUNvbnRleHRBY3RpdmF0aW9uIGNvbnRleHRBY3RpdmF0aW9uKSB7Ci0JICBJQ29udGV4dFNlcnZpY2UgY29udGV4dFNlcnZpY2UgPSAoSUNvbnRleHRTZXJ2aWNlKSBnZXRTaXRlKCkuZ2V0U2VydmljZShJQ29udGV4dFNlcnZpY2UuY2xhc3MpOwotCi0JICBpZiAoY29udGV4dFNlcnZpY2UgIT0gbnVsbCAmJiBjb250ZXh0QWN0aXZhdGlvbiAhPSBudWxsKSB7Ci0JCSAgY29udGV4dFNlcnZpY2UuZGVhY3RpdmF0ZUNvbnRleHQoY29udGV4dEFjdGl2YXRpb24pOwotCSAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9BRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0FEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZmQ4ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0FEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotLyoqCi0gKiAKLSAqIFVzZWQgZm9yIGFueSByZWFkLW9ubHkgZmlsZXMsIGllLiBIVFRQIGZpbGVzLgotICoKLSAqLwotcHVibGljIGNsYXNzIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0IGltcGxlbWVudHMgSVN0b3JhZ2VFZGl0b3JJbnB1dCwgSUFEVEVkaXRvcklucHV0Ci17Ci0gIHByb3RlY3RlZCBTdHJpbmcgdXJsU3RyaW5nOwotICBwcm90ZWN0ZWQgSVN0b3JhZ2Ugc3RvcmFnZTsKLSAgcHJvdGVjdGVkIEFEVEV4dGVybmFsUmVzb3VyY2VWYXJpYW50IHZhcmlhbnQ7Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBwcm90ZWN0ZWQgU3RyaW5nIGVkaXRvck5hbWU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZWRpdG9ySUQgPSAiIjsKLQotICBwdWJsaWMgQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQoU3RyaW5nIHVybFN0cmluZykKLSAgewotICAgIHRoaXMudXJsU3RyaW5nID0gdXJsU3RyaW5nOwotICAgIHZhcmlhbnQgPSBuZXcgQURURXh0ZXJuYWxSZXNvdXJjZVZhcmlhbnQodXJsU3RyaW5nKTsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykKLSAgewotICAgIGlmIChvID09IHRoaXMpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChvIGluc3RhbmNlb2YgQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQpCi0gICAgewotICAgICAgQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQgaW5wdXQgPSAoQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQpIG87Ci0gICAgICAKLSAgICAgIHJldHVybiB1cmxTdHJpbmcuZXF1YWxzKGlucHV0LmdldFVybFN0cmluZygpKSAmJiBpbnB1dC5nZXRFZGl0b3JJRCgpLmVxdWFscyhlZGl0b3JJRCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRVcmxTdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuIHVybFN0cmluZzsKLSAgfQotICAKLSAgcHVibGljIElTdG9yYWdlIGdldFN0b3JhZ2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgc3RvcmFnZSA9IHZhcmlhbnQuZ2V0U3RvcmFnZSgpOwotICAgIHJldHVybiBzdG9yYWdlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIGlmIChlZGl0b3JOYW1lID09IG51bGwpCi0gICAgewotICAgICAgVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJsU3RyaW5nKTsKLSAgICAgIHJldHVybiB1cmkubGFzdFNlZ21lbnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVkaXRvck5hbWU7Ci0gIH0KLQotICBwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpCi0gIHsKLSAgICAvLyBodHRwIGZpbGVzIGNhbm5vdCBwZXJzaXN0Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkKLSAgewotICAgIHJldHVybiB1cmxTdHJpbmc7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikKLSAgewotICAgIGlmIChhZGFwdGVyID09IElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKQotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgaWYgKGFkYXB0ZXIgPT0gSVN0b3JhZ2UuY2xhc3MpCi0gICAgICByZXR1cm4gc3RvcmFnZTsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0U2NoZW1hKCkKLSAgewotICAgIHJldHVybiB4c2RTY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFZGl0b3JOYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgZWRpdG9yTmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFZGl0b3JJRChTdHJpbmcgZWRpdG9ySUQpCi0gIHsKLSAgICB0aGlzLmVkaXRvcklEID0gZWRpdG9ySUQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RWRpdG9ySUQoKQotICB7Ci0gICAgcmV0dXJuIGVkaXRvcklEOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQ29tbW9uTXVsdGlQYWdlRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQ29tbW9uTXVsdGlQYWdlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0OGNjMDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0NvbW1vbk11bHRpUGFnZUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRGVmYXVsdEVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLk1vdXNlV2hlZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Nb3VzZVdoZWVsWm9vbUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5MYXllck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5ab29tTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5VcGRhdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuWm9vbUluQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlpvb21PdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuU2VsZWN0aW9uU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVByb3BlcnR5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSW1hZ2VIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uRGVzaWduVmlld2VyR3JhcGhpY0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uRmxhdENDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21tb25NdWx0aVBhZ2VFZGl0b3IgZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0IGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIENvbW1hbmRTdGFja0xpc3RlbmVyLCBJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciwgSVByb3BlcnR5TGlzdGVuZXIsIElFZGl0b3JNb2RlTGlzdGVuZXIKLXsKLSAgcHVibGljIHN0YXRpYyBpbnQgU09VUkNFX1BBR0VfSU5ERVggPSAxLCBERVNJR05fUEFHRV9JTkRFWCA9IDA7ICAKLSAgCi0gIHByb3RlY3RlZCBJQ29udGVudE91dGxpbmVQYWdlIGZPdXRsaW5lUGFnZTsKLSAgcHJvdGVjdGVkIERlZmF1bHRFZGl0RG9tYWluIGVkaXREb21haW47Ci0gIHByb3RlY3RlZCBTZWxlY3Rpb25TeW5jaHJvbml6ZXIgc3luY2hyb25pemVyOwotICBwcm90ZWN0ZWQgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnk7Ci0gIHByb3RlY3RlZCBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBzdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLSAgcHJvdGVjdGVkIENvbW1vblNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uUHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyOwotICBwcm90ZWN0ZWQgRWRpdG9yTW9kZU1hbmFnZXIgZWRpdG9yTW9kZU1hbmFnZXI7Ci0gIHByb3RlY3RlZCBGbGF0Q0NvbWJvIG1vZGVDb21ibzsKLSAgcHJpdmF0ZSBFZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWVbXSBlZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWVzOwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIHRvb2xiYXI7Ci0gIHByb3RlY3RlZCBNb2RlQ29tYm9MaXN0ZW5lciBtb2RlQ29tYm9MaXN0ZW5lcjsKLSAgcHJvdGVjdGVkIGludCBtYXhMZW5ndGggPSAwOwotICBwcm90ZWN0ZWQgQ29tbW9uQWN0aXZhdGlvbkxpc3RlbmVyIGZBY3RpdmF0aW9uTGlzdGVuZXI7Ci0gIAotICBwdWJsaWMgQ29tbW9uTXVsdGlQYWdlRWRpdG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgZWRpdERvbWFpbiA9IG5ldyBEZWZhdWx0RWRpdERvbWFpbih0aGlzKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IG1vdXNlRXZlbnQsIEVkaXRQYXJ0Vmlld2VyIHZpZXdlcikKLSAgICAgIHsKLSAgICAgICAgYm9vbGVhbiBlYXRUaGVFdmVudCA9IGZhbHNlOyAgICAgIAotICAgICAgICBMYXllck1hbmFnZXIgbWFuYWdlciA9IChMYXllck1hbmFnZXIpdmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQoTGF5ZXJNYW5hZ2VyLklEKTsgICAgIAotICAgICAgICBJRmlndXJlIGxheWVyID0gbWFuYWdlci5nZXRMYXllcihEZXNpZ25WaWV3ZXJHcmFwaGljQ29uc3RhbnRzLlNDQUxFRF9IQU5ETEVfTEFZRVIpOwotICAgICAgICBpZiAobGF5ZXIgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgUG9pbnQgcCA9IG5ldyBQb2ludChtb3VzZUV2ZW50LngsIG1vdXNlRXZlbnQueSk7Ci0gICAgICAgICAgbGF5ZXIudHJhbnNsYXRlVG9SZWxhdGl2ZShwKTsKLSAgICAgICAgICBJRmlndXJlIGZpZ3VyZSA9IGxheWVyLmZpbmRGaWd1cmVBdChwKTsgICAgIAotICAgICAgICAgIGlmIChmaWd1cmUgIT0gbnVsbCAmJiBmaWd1cmUgIT0gbGF5ZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gd2UgZWF0IHRoaXMgc2VsZWN0aW9uIGV2ZW50IQotICAgICAgICAgICAgZWF0VGhlRXZlbnQgPSB0cnVlOwotICAgICAgICAgIH0gCi0gICAgICAgIH0KLSAgICAgICAgaWYgKCFlYXRUaGVFdmVudCkKLSAgICAgICAgewotICAgICAgICAgIHN1cGVyLm1vdXNlRG93bihtb3VzZUV2ZW50LCB2aWV3ZXIpOwotICAgICAgICB9ICAKLSAgICAgIH0gICAgICAKLSAgICB9OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yI2dldENvbnRyaWJ1dG9ySWQoKQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRDb250cmlidXRvcklkKCk7Ci0gIAotICAKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlQWN0aW9ucygpOwotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydCNjcmVhdGVQYWdlcygpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpCi0gIHsKLQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICB7Ci0vLyAgICBnZXRFZGl0b3IoMSkuZG9TYXZlKG1vbml0b3IpOyAKLSAgICBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5kb1NhdmUobW9uaXRvcik7Ci0gICAgZ2V0Q29tbWFuZFN0YWNrKCkubWFya1NhdmVMb2NhdGlvbigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNkb1NhdmVBcygpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkb1NhdmVBcygpCi0gIHsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRFZGl0b3IoMSk7Ci0vLyAgICBlZGl0b3IuZG9TYXZlQXMoKTsKLSAgICBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5kb1NhdmVBcygpOwotICAgIHNldElucHV0KHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotICAgIHNldFBhcnROYW1lKGVkaXRvci5nZXRUaXRsZSgpKTsKLSAgICBnZXRDb21tYW5kU3RhY2soKS5tYXJrU2F2ZUxvY2F0aW9uKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2lzU2F2ZUFzQWxsb3dlZCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotICAgKiAKLSAgICogQ2xvc2VzIGFsbCBwcm9qZWN0IGZpbGVzIG9uIHByb2plY3QgY2xvc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoZmluYWwgSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSkKLSAgICB7Ci0gICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgewotICAgICAgICAgIElXb3JrYmVuY2hQYWdlW10gcGFnZXMgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFnZXMoKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoKEZpbGVFZGl0b3JJbnB1dCkgc3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpLmdldFByb2plY3QoKS5lcXVhbHMoZXZlbnQuZ2V0UmVzb3VyY2UoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBwYWdlc1tpXS5maW5kRWRpdG9yKHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotICAgICAgICAgICAgICBwYWdlc1tpXS5jbG9zZUVkaXRvcihlZGl0b3JQYXJ0LCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrTGlzdGVuZXIjY29tbWFuZFN0YWNrQ2hhbmdlZChqYXZhLnV0aWwuRXZlbnRPYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKEV2ZW50T2JqZWN0IGV2ZW50KQotICB7Ci0gICAgZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotICB9Ci0gIAotICAvKioKLSAgICogSW5kaWNhdGVzIHRoYXQgYSBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KLSAgICogCi0gICAqIEBwYXJhbSBzb3VyY2UKLSAgICogICAgICAgICAgdGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBoYXMgY2hhbmdlZAotICAgKiBAcGFyYW0gcHJvcElkCi0gICAqICAgICAgICAgIHRoZSBpZCBvZiB0aGUgcHJvcGVydHkgd2hpY2ggaGFzIGNoYW5nZWQ7IHByb3BlcnR5IGlkcyBhcmUKLSAgICogICAgICAgICAgZ2VuZXJhbGx5IGRlZmluZWQgYXMgY29uc3RhbnRzIG9uIHRoZSBzb3VyY2UgY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgc291cmNlLCBpbnQgcHJvcElkKQotICB7Ci0gICAgc3dpdGNoIChwcm9wSWQpCi0gICAgewotICAgICAgLy8gaGFkIHRvIGltcGxlbWVudCBpbnB1dCBjaGFuZ2VkICJsaXN0ZW5lciIgc28gdGhhdAotICAgICAgLy8gc3RydWN1dGVkVGV4dCBjb3VsZCB0ZWxsIGl0IGNvbnRhaW5pbmcgZWRpdG9yIHRoYXQKLSAgICAgIC8vIHRoZSBpbnB1dCBoYXMgY2hhbmdlLCB3aGVuIGEgJ3Jlc291cmNlIG1vdmVkJyBldmVudCBpcwotICAgICAgLy8gZm91bmQuCi0gICAgICBjYXNlIElFZGl0b3JQYXJ0LlBST1BfSU5QVVQgOgotICAgICAgY2FzZSBJRWRpdG9yUGFydC5QUk9QX0RJUlRZIDogewotICAgICAgICBpZiAoc291cmNlID09IHN0cnVjdHVyZWRUZXh0RWRpdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkgIT0gZ2V0RWRpdG9ySW5wdXQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZXRJbnB1dChzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgICAgICAgICAgIC8vIHRpdGxlIHNob3VsZCBhbHdheXMgY2hhbmdlIHdoZW4gaW5wdXQgY2hhbmdlcy4KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBydW5uYWJsZSBmb3IgZm9sbG93aW5nIHBvc3QgY2FsbAotICAgICAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2ZpcmVQcm9wZXJ0eUNoYW5nZShJV29ya2JlbmNoUGFydC5QUk9QX1RJVExFKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSBpcyBqdXN0IHRvIHBvc3QgdGhpbmdzIG9uIHRoZSBkaXNwbGF5IHF1ZXVlCi0gICAgICAgICAgICAvLyAodGhyZWFkKS4gV2UgaGF2ZSB0byBkbyB0aGlzIHRvIGdldCB0aGUgZGlydHkKLSAgICAgICAgICAgIC8vIHByb3BlcnR5IHRvIGdldCB1cGRhdGVkIGFmdGVyIG90aGVyIHRoaW5ncyBvbiB0aGUKLSAgICAgICAgICAgIC8vIHF1ZXVlIGFyZSBleGVjdXRlZC4KLSAgICAgICAgICAgIHBvc3RPbkRpc3BsYXlRdWUocnVubmFibGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgSVdvcmtiZW5jaFBhcnQuUFJPUF9USVRMRSA6IHsKLSAgICAgICAgLy8gdXBkYXRlIHRoZSBpbnB1dCBpZiB0aGUgdGl0bGUgaXMgY2hhbmdlZAotICAgICAgICBpZiAoc291cmNlID09IHN0cnVjdHVyZWRUZXh0RWRpdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkgIT0gZ2V0RWRpdG9ySW5wdXQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZXRJbnB1dChzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0IDogewotICAgICAgICAvLyBwcm9wYWdhdGUgY2hhbmdlcy4gSXMgdGhpcyBuZWVkZWQ/IEFuc3dlcjogWWVzLgotICAgICAgICBpZiAoc291cmNlID09IHN0cnVjdHVyZWRUZXh0RWRpdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKHByb3BJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvLyBTaG91bGQgb3ZlcnJpZGUgdG8gc2V0IHRoZSBpbnB1dCB0byB0aGUgZGVzaWduIHZpZXdlciBmb3IgYSBuZXcgZG9jdW1lbnQgY2hhbmdlCi0gIC8vIGllLiB3aGVuIGRvaW5nIGEgc2F2ZUFzCi0gIHByb3RlY3RlZCB2b2lkIHNldElucHV0VG9HcmFwaGljYWxWaWV3ZXIoSURvY3VtZW50IG5ld0lucHV0KQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpCi0gIHsKLSAgICBzdXBlci5zZXRJbnB1dChpbnB1dCk7Ci0gICAgaWYgKGdyYXBoaWNhbFZpZXdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHNldElucHV0VG9HcmFwaGljYWxWaWV3ZXIoZ2V0RG9jdW1lbnQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIElEb2N1bWVudCBnZXREb2N1bWVudCgpCi0gIHsKLSAgICBJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgIGlmIChzdHJ1Y3R1cmVkVGV4dEVkaXRvciAhPSBudWxsKQotICAgIHsKLSAgICAgIGRvY3VtZW50ID0gc3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotICAgIH0KLSAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybgotICAgKi8KLSAgcHJvdGVjdGVkIFNlbGVjdGlvblN5bmNocm9uaXplciBnZXRTZWxlY3Rpb25TeW5jaHJvbml6ZXIoKQotICB7Ci0gICAgaWYgKHN5bmNocm9uaXplciA9PSBudWxsKQotICAgICAgc3luY2hyb25pemVyID0gbmV3IFNlbGVjdGlvblN5bmNocm9uaXplcigpOwotICAgIHJldHVybiBzeW5jaHJvbml6ZXI7Ci0gIH0KLQotICBwdWJsaWMgQ29tbW9uU2VsZWN0aW9uTWFuYWdlciBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkKLSAgewotICAgIGlmIChzZWxlY3Rpb25Qcm92aWRlciA9PSBudWxsKQotICAgIHsKLSAgICAgIHNlbGVjdGlvblByb3ZpZGVyID0gbmV3IENvbW1vblNlbGVjdGlvbk1hbmFnZXIodGhpcyk7Ci0gICAgfQotICAgIHJldHVybiBzZWxlY3Rpb25Qcm92aWRlcjsKLSAgfQotICAKLSAgLyoKLSAgICogVGhpcyBtZXRob2QgaXMganVzdCB0byBtYWtlIGZpcmVQcm9wZXJ0eUNoYW5nZWQgYWNjZXNzYmlibGUgZnJvbSBzb21lCi0gICAqIChhbm9ub21vdXMpIGlubmVyIGNsYXNzZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBfZmlyZVByb3BlcnR5Q2hhbmdlKGludCBwcm9wZXJ0eSkKLSAgewotICAgIHN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQb3N0cyB0aGUgdXBkYXRlIGNvZGUgImJlaGluZCIgdGhlIHJ1bm5pbmcgb3BlcmF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcG9zdE9uRGlzcGxheVF1ZShSdW5uYWJsZSBydW5uYWJsZSkKLSAgewotICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICBJV29ya2JlbmNoV2luZG93W10gd2luZG93cyA9IHdvcmtiZW5jaC5nZXRXb3JrYmVuY2hXaW5kb3dzKCk7Ci0gICAgaWYgKHdpbmRvd3MgIT0gbnVsbCAmJiB3aW5kb3dzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgRGlzcGxheSBkaXNwbGF5ID0gd2luZG93c1swXS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKTsKLSAgICAgIGRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcnVubmFibGUucnVuKCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIDxjb2RlPk11bHRpUGFnZUVkaXRvclBhcnQ8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICogPGNvZGU+SVdvcmtiZW5jaFBhcnQ8L2NvZGU+IG1ldGhvZCBkaXNwb3NlcyBhbGwgbmVzdGVkIGVkaXRvcnMuCi0gICAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgZ2V0Q29tbWFuZFN0YWNrKCkucmVtb3ZlQ29tbWFuZFN0YWNrTGlzdGVuZXIodGhpcyk7Ci0gICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgYWN0aW9uUmVnaXN0cnkuZGlzcG9zZSgpOwotICAgIAotICAgIGlmIChzdHJ1Y3R1cmVkVGV4dEVkaXRvciAhPSBudWxsKSB7Ci0gICAgICBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgICBzdHJ1Y3R1cmVkVGV4dEVkaXRvciA9IG51bGw7Ci0gICAgZWRpdERvbWFpbiA9IG51bGw7Ci0gICAgZk91dGxpbmVQYWdlID0gbnVsbDsKLSAgICBzeW5jaHJvbml6ZXIgPSBudWxsOwotICAgIGFjdGlvblJlZ2lzdHJ5ID0gbnVsbDsKLSAgICBzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0gICAgZ3JhcGhpY2FsVmlld2VyID0gbnVsbDsKLSAgICBpZiAobW9kZUNvbWJvICE9IG51bGwgJiYgIW1vZGVDb21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgbW9kZUNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG1vZGVDb21ib0xpc3RlbmVyKTsKLSAgICAgIG1vZGVDb21ib0xpc3RlbmVyID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGZBY3RpdmF0aW9uTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgZkFjdGl2YXRpb25MaXN0ZW5lci5kaXNwb3NlKCk7Ci0gICAgICBmQWN0aXZhdGlvbkxpc3RlbmVyID0gbnVsbDsKLSAgICB9Ci0gICAKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpCi0gIHsKLSAgICByZXR1cm4gZWRpdERvbWFpbi5nZXRDb21tYW5kU3RhY2soKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElFZGl0b3JQYXJ0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKQotICB7Ci0gICAgc2V0QWN0aXZlUGFnZShTT1VSQ0VfUEFHRV9JTkRFWCk7Ci0gICAgSURFLmdvdG9NYXJrZXIoc3RydWN0dXJlZFRleHRFZGl0b3IsIG1hcmtlcik7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIDxjb2RlPk11bHRpUGFnZUVkaXRvckV4YW1wbGU8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kCi0gICAqIGNoZWNrcyB0aGF0IHRoZSBpbnB1dCBpcyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5JRmlsZUVkaXRvcklucHV0PC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLmluaXQoc2l0ZSwgZWRpdG9ySW5wdXQpOwotICAgIAotICAgIGdldENvbW1hbmRTdGFjaygpLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIGluaXRpYWxpemVBY3Rpb25SZWdpc3RyeSgpOwotICAgIAotICAgIFN0cmluZyB0aXRsZSA9IG51bGw7Ci0gICAgaWYgKGdldEVkaXRvcklucHV0KCkgIT0gbnVsbCkgewotICAgICAgdGl0bGUgPSBnZXRFZGl0b3JJbnB1dCgpLmdldE5hbWUoKTsKLSAgICB9Ci0gICAgc2V0UGFydE5hbWUodGl0bGUpOwotICAgIAotICAgIGZBY3RpdmF0aW9uTGlzdGVuZXIgPSBuZXcgQ29tbW9uQWN0aXZhdGlvbkxpc3RlbmVyKHNpdGUuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQWN0aW9uUmVnaXN0cnkoKQotICB7Ci0gICAgY3JlYXRlQWN0aW9ucygpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgQWN0aW9uUmVnaXN0cnkgZ2V0QWN0aW9uUmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKGFjdGlvblJlZ2lzdHJ5ID09IG51bGwpCi0gICAgICBhY3Rpb25SZWdpc3RyeSA9IG5ldyBBY3Rpb25SZWdpc3RyeSgpOwotICAgIHJldHVybiBhY3Rpb25SZWdpc3RyeTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUgPT0gQ29tbWFuZFN0YWNrLmNsYXNzKQotICAgICAgcmV0dXJuIGdldENvbW1hbmRTdGFjaygpOwotICAgIGlmICh0eXBlID09IEFjdGlvblJlZ2lzdHJ5LmNsYXNzKQotICAgICAgcmV0dXJuIGdldEFjdGlvblJlZ2lzdHJ5KCk7Ci0gICAgaWYgKHR5cGUgPT0gRWRpdG9yTW9kZU1hbmFnZXIuY2xhc3MpCi0gICAgICByZXR1cm4gZ2V0RWRpdG9yTW9kZU1hbmFnZXIoKTsKLSAgICBpZiAodHlwZSA9PSBJR290b01hcmtlci5jbGFzcykgewotICAgICAgcmV0dXJuIG5ldyBJR290b01hcmtlcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgewotICAgICAgICAgIENvbW1vbk11bHRpUGFnZUVkaXRvci50aGlzLmdvdG9NYXJrZXIobWFya2VyKTsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICB9Ci0gICAgaWYgKHR5cGUgPT0gSVRleHRFZGl0b3IuY2xhc3MpCi0gICAgICByZXR1cm4gZ2V0VGV4dEVkaXRvcigpOwotICAgIAotICAgIHJldHVybiBzdXBlci5nZXRBZGFwdGVyKHR5cGUpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgRGVmYXVsdEVkaXREb21haW4gZ2V0RWRpdERvbWFpbigpCi0gIHsKLSAgICByZXR1cm4gZWRpdERvbWFpbjsKLSAgfQotCi0gIC8qKgotICAgKiBGcm9tIEdFRiBHcmFwaGljYWxFZGl0b3IgQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHVwZGF0aW5nIGEgc2V0IG9mIGFjdGlvbnMKLSAgICogZGVmaW5lZCBieSB0aGUgZ2l2ZW4gTGlzdCBvZiBhY3Rpb24gSURzLiBUaGUgYWN0aW9ucyBhcmUgZm91bmQgYnkgbG9va2luZwotICAgKiB1cCB0aGUgSUQgaW4gdGhlIHtAbGluayAjZ2V0QWN0aW9uUmVnaXN0cnkoKSBhY3Rpb24gcmVnaXN0cnl9LiBJZiB0aGUKLSAgICogY29ycmVzcG9uZGluZyBhY3Rpb24gaXMgYW4ge0BsaW5rIFVwZGF0ZUFjdGlvbn0sIGl0IHdpbGwgaGF2ZSBpdHMKLSAgICogPGNvZGU+dXBkYXRlKCk8L2NvZGU+IG1ldGhvZCBjYWxsZWQuCi0gICAqIAotICAgKiBAcGFyYW0gYWN0aW9uSWRzCi0gICAqICAgICAgICAgIHRoZSBsaXN0IG9mIElEcyB0byB1cGRhdGUKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUFjdGlvbnMoTGlzdCBhY3Rpb25JZHMpCi0gIHsKLSAgICBBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IGdldEFjdGlvblJlZ2lzdHJ5KCk7Ci0gICAgSXRlcmF0b3IgaXRlciA9IGFjdGlvbklkcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBJQWN0aW9uIGFjdGlvbiA9IHJlZ2lzdHJ5LmdldEFjdGlvbihpdGVyLm5leHQoKSk7Ci0gICAgICBpZiAoYWN0aW9uIGluc3RhbmNlb2YgVXBkYXRlQWN0aW9uKQotICAgICAgICAoKFVwZGF0ZUFjdGlvbikgYWN0aW9uKS51cGRhdGUoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RydWN0dXJlZFRleHRFZGl0b3IgZ2V0VGV4dEVkaXRvcigpCi0gIHsKLSAgICByZXR1cm4gc3RydWN0dXJlZFRleHRFZGl0b3I7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUdyYXBoUGFnZUNvbXBvc2l0ZSgpCi0gIHsKLSAgICBDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShnZXRDb250YWluZXIoKSwgU1dULk5PTkUpOyAgICAKLSAgICBwYXJlbnQuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUdyYXBoUGFnZSgpCi0gIHsKLSAgICBDb21wb3NpdGUgcGFyZW50ID0gY3JlYXRlR3JhcGhQYWdlQ29tcG9zaXRlKCk7Ci0gICAgCi0gICAgZ3JhcGhpY2FsVmlld2VyID0gZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0gICAgZ3JhcGhpY2FsVmlld2VyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICAgICAgCi0gICAgZ2V0RWRpdERvbWFpbigpLmFkZFZpZXdlcihncmFwaGljYWxWaWV3ZXIpOwotICAgIAotICAgIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotICAgIGhvb2tHcmFwaGljYWxWaWV3ZXIoKTsgICAgCi0gICAgaW50IGluZGV4ID0gYWRkUGFnZShwYXJlbnQpOwotICAgIHNldFBhZ2VUZXh0KGluZGV4LCBNZXNzYWdlcy5fVUlfTEFCRUxfREVTSUdOKTsKLSAgfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQjY3JlYXRlU2l0ZShvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUVkaXRvclNpdGUgY3JlYXRlU2l0ZShJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJSUVkaXRvclNpdGUgc2l0ZSA9IG51bGw7Ci0JCWlmIChlZGl0b3IgPT0gc3RydWN0dXJlZFRleHRFZGl0b3IpIHsKLQkJCXNpdGUgPSBuZXcgTXVsdGlQYWdlRWRpdG9yU2l0ZSh0aGlzLCBlZGl0b3IpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCQkvLyBzZXRzIHRoaXMgaWQgc28gbmVzdGVkIGVkaXRvciBpcyBjb25zaWRlcmVkIHhtbCBzb3VyY2UKLQkJCQkJLy8gcGFnZQotCQkJCQlyZXR1cm4gQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTCArICIuc291cmNlIjsgLy8kTk9OLU5MUy0xJDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCWVsc2UgewotCQkJc2l0ZSA9IHN1cGVyLmNyZWF0ZVNpdGUoZWRpdG9yKTsKLQkJfQotCQlyZXR1cm4gc2l0ZTsKLQl9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTb3VyY2VQYWdlKCkKLSAgewotICAgIHN0cnVjdHVyZWRUZXh0RWRpdG9yID0gbmV3IFN0cnVjdHVyZWRUZXh0RWRpdG9yKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaW50IGluZGV4ID0gYWRkUGFnZShzdHJ1Y3R1cmVkVGV4dEVkaXRvciwgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICBzZXRQYWdlVGV4dChpbmRleCwgTWVzc2FnZXMuX1VJX0xBQkVMX1NPVVJDRSk7Ci0gICAgICBzdHJ1Y3R1cmVkVGV4dEVkaXRvci51cGRhdGUoKTsKLSAgICAgIHN0cnVjdHVyZWRUZXh0RWRpdG9yLnNldEVkaXRvclBhcnQodGhpcyk7Ci0gICAgICBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5hZGRQcm9wZXJ0eUxpc3RlbmVyKHRoaXMpOwotICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfVElUTEUpOwotICAgIH0KLSAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2l0ZSgpLmdldFNoZWxsKCksICJFcnJvciBjcmVhdGluZyBuZXN0ZWQgdGV4dCBlZGl0b3IiLCBudWxsLCBlLmdldFN0YXR1cygpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkKLSAgewotICAgIGdyYXBoaWNhbFZpZXdlci5nZXRDb250cm9sKCkuc2V0QmFja2dyb3VuZChDb2xvckNvbnN0YW50cy5saXN0QmFja2dyb3VuZCk7Ci0KLSAgICAvLyBTZXQgdGhlIHJvb3QgZWRpdCBwYXJ0Ci0gICAgLy8gU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydCByb290ID0gbmV3IFNjYWxhYmxlRnJlZWZvcm1Sb290RWRpdFBhcnQoKTsKLSAgICBSb290RWRpdFBhcnQgcm9vdCA9IG5ldyBSb290RWRpdFBhcnQoKTsKLSAgICBab29tTWFuYWdlciB6b29tTWFuYWdlciA9IHJvb3QuZ2V0Wm9vbU1hbmFnZXIoKTsKLSAgICAKLSAgICBMaXN0IHpvb21MZXZlbENvbnRyaWJ1dGlvbnMgPSBuZXcgQXJyYXlMaXN0KDMpOwotICAgIHpvb21MZXZlbENvbnRyaWJ1dGlvbnMuYWRkKFpvb21NYW5hZ2VyLkZJVF9BTEwpOwotICAgIHpvb21MZXZlbENvbnRyaWJ1dGlvbnMuYWRkKFpvb21NYW5hZ2VyLkZJVF9XSURUSCk7Ci0gICAgem9vbUxldmVsQ29udHJpYnV0aW9ucy5hZGQoWm9vbU1hbmFnZXIuRklUX0hFSUdIVCk7Ci0gICAgem9vbU1hbmFnZXIuc2V0Wm9vbUxldmVsQ29udHJpYnV0aW9ucyh6b29tTGV2ZWxDb250cmlidXRpb25zKTsKLQotICAgIGRvdWJsZVtdIHpvb21MZXZlbHMgPSB7LjEwLCAuMjUsIC41LCAuNzUsIDEuMCwgMS4yNSwgMS41LCAyLjAsIDIuNSwgMywgNCwgNX07Ci0gICAgem9vbU1hbmFnZXIuc2V0Wm9vbUxldmVscyh6b29tTGV2ZWxzKTsKLQotICAgIElBY3Rpb24gem9vbUluID0gbmV3IFpvb21JbkFjdGlvbih6b29tTWFuYWdlcik7Ci0gICAgSUFjdGlvbiB6b29tT3V0ID0gbmV3IFpvb21PdXRBY3Rpb24oem9vbU1hbmFnZXIpOwotICAgIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oem9vbUluKTsKLSAgICBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHpvb21PdXQpOwotCi0gICAgZ2V0U2l0ZSgpLmdldEtleUJpbmRpbmdTZXJ2aWNlKCkucmVnaXN0ZXJBY3Rpb24oem9vbUluKTsKLSAgICBnZXRTaXRlKCkuZ2V0S2V5QmluZGluZ1NlcnZpY2UoKS5yZWdpc3RlckFjdGlvbih6b29tT3V0KTsKLQotICAgIC8vQ29ubmVjdGlvbkxheWVyIGNvbm5lY3Rpb25MYXllciA9IChDb25uZWN0aW9uTGF5ZXIpIHJvb3QuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuQ09OTkVDVElPTl9MQVlFUik7Ci0gICAgLy9jb25uZWN0aW9uTGF5ZXIuc2V0Q29ubmVjdGlvblJvdXRlcihuZXcgQmVuZHBvaW50Q29ubmVjdGlvblJvdXRlcigpKTsKLQotICAgIC8vY29ubmVjdGlvbkxheWVyLnNldENvbm5lY3Rpb25Sb3V0ZXIobmV3IFNob3J0ZXN0UGF0aENvbm5lY3Rpb25Sb3V0ZXIoY29ubmVjdGlvbkxheWVyKSk7Ci0gICAgLy8gY29ubmVjdGlvbkxheWVyLnNldFZpc2libGUoZmFsc2UpOwotCi0gICAgLy8gWm9vbQotICAgIHpvb21NYW5hZ2VyLnNldFpvb20oMS4wKTsKLSAgICAvLyBTY3JvbGwtd2hlZWwgWm9vbQotICAgIGdyYXBoaWNhbFZpZXdlci5zZXRQcm9wZXJ0eShNb3VzZVdoZWVsSGFuZGxlci5LZXlHZW5lcmF0b3IuZ2V0S2V5KFNXVC5DVFJMKSwgTW91c2VXaGVlbFpvb21IYW5kbGVyLlNJTkdMRVRPTik7Ci0gICAgZ3JhcGhpY2FsVmlld2VyLnNldFJvb3RFZGl0UGFydChyb290KTsKLSAgICBncmFwaGljYWxWaWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGdldEVkaXRQYXJ0RmFjdG9yeSgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaG9va0dyYXBoaWNhbFZpZXdlcigpCi0gIHsKLSAgICBnZXRTZWxlY3Rpb25TeW5jaHJvbml6ZXIoKS5hZGRWaWV3ZXIoZ3JhcGhpY2FsVmlld2VyKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciBnZXRHcmFwaGljYWxWaWV3ZXIoKTsKLSAgcHJvdGVjdGVkIGFic3RyYWN0IEVkaXRQYXJ0RmFjdG9yeSBnZXRFZGl0UGFydEZhY3RvcnkoKTsKLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZUdyYXBoaWNhbFZpZXdlcigpOwotCi0gIHByb3RlY3RlZCBFZGl0b3JNb2RlTWFuYWdlciBnZXRFZGl0b3JNb2RlTWFuYWdlcigpCi0gIHsKLSAgICBpZiAoZWRpdG9yTW9kZU1hbmFnZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlZGl0b3JNb2RlTWFuYWdlciA9IGNyZWF0ZUVkaXRvck1vZGVNYW5hZ2VyKCk7Ci0gICAgICBlZGl0b3JNb2RlTWFuYWdlci5hZGRMaXN0ZW5lcih0aGlzKTsKLSAgICAgIGVkaXRvck1vZGVNYW5hZ2VyLmluaXQoKTsKLSAgICB9ICAKLSAgICByZXR1cm4gZWRpdG9yTW9kZU1hbmFnZXI7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBFZGl0b3JNb2RlTWFuYWdlciBjcmVhdGVFZGl0b3JNb2RlTWFuYWdlcigpOwotICAKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldEVkaXRNb2RlTmFtZShFZGl0b3JNb2RlIGVkaXRvck1vZGUsIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcikKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBlZGl0b3JNb2RlLmdldERpc3BsYXlOYW1lKCk7Ci0gICAgaWYgKHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgY3VzdG9taXplZE5hbWUgPSBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmdldEVkaXRvck1vZGVEaXNwbGF5TmFtZShlZGl0b3JNb2RlLmdldElkKCkpOwotICAgICAgaWYgKGN1c3RvbWl6ZWROYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGN1c3RvbWl6ZWROYW1lOwotICAgICAgfSAgCi0gICAgfSAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBjbGFzcyBFZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWUKLSAgewotICAgIEVkaXRvck1vZGUgbW9kZTsKLSAgICBTdHJpbmcgbmFtZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmlld01vZGVUb29sYmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBFZGl0b3JNb2RlTWFuYWdlciBtYW5hZ2VyID0gKEVkaXRvck1vZGVNYW5hZ2VyKWdldEFkYXB0ZXIoRWRpdG9yTW9kZU1hbmFnZXIuY2xhc3MpOwotICAgIGZpbmFsIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciA9IChQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKWdldEFkYXB0ZXIoUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5jbGFzcyk7Ci0gICAgRWRpdG9yTW9kZSBbXSBtb2RlTGlzdCA9IG1hbmFnZXIuZ2V0TW9kZXMoKTsKLSAgICAKLSAgICBpbnQgbW9kZUxpc3RMZW5ndGggPSBtb2RlTGlzdC5sZW5ndGg7Ci0gICAgYm9vbGVhbiBzaG93VG9vbEJhciA9IG1vZGVMaXN0TGVuZ3RoID4gMTsKLSAgIAotICAgIGlmIChzaG93VG9vbEJhcikKLSAgICB7Ci0gICAgICB0b29sYmFyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5GTEFUIHwgU1dULkRSQVdfVFJBTlNQQVJFTlQpOwotICAgICAgdG9vbGJhci5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLmxpc3RCYWNrZ3JvdW5kKTsKLSAgICAgIHRvb2xiYXIuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKQotICAgICAgICB7Ci0gICAgICAgICAgUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSB0b29sYmFyLmdldENsaWVudEFyZWEoKTsgCi0gICAgICAgICAgZS5nYy5zZXRGb3JlZ3JvdW5kKENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0gICAgICAgICAgZS5nYy5kcmF3UmVjdGFuZ2xlKGNsaWVudEFyZWEueCwgY2xpZW50QXJlYS55LCBjbGllbnRBcmVhLndpZHRoIC0gMSwgY2xpZW50QXJlYS5oZWlnaHQgLSAxKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgICAKLSAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgIHRvb2xiYXIuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0b29sYmFyLCBTV1QuRkxBVCB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICAgIGxhYmVsLnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMubGlzdEJhY2tncm91bmQpOwotICAgICAgbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfVklFVyk7Ci0gICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpKTsKLQotICAgICAgbW9kZUNvbWJvID0gbmV3IEZsYXRDQ29tYm8odG9vbGJhciwgU1dULkZMQVQpOwotICAgICAgbW9kZUNvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgIG1vZGVDb21iby5zZXRUZXh0KGdldEVkaXRNb2RlTmFtZShtYW5hZ2VyLmdldEN1cnJlbnRNb2RlKCksIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpKTsgCi0gICAgICBHQyBnYyA9IG5ldyBHQyhtb2RlQ29tYm8pOwotICAgICAgaW50IHRleHRXaWR0aCA9IDA7Ci0gICAgICBtYXhMZW5ndGggPSAwOwotICAgICAgCi0gICAgICAvLyBwb3B1bGF0ZSBjb21ibyB3aXRoIG1vZGVzCi0gICAgICBlZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWVzID0gbmV3IEVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZVttb2RlTGlzdExlbmd0aF07ICAgICAgCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZGVMaXN0TGVuZ3RoOyBpKyspCi0gICAgICB7ICAKLSAgICAgICAgRWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lIGVudHJ5ID0gbmV3IEVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZSgpOwotICAgICAgICBlZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWVzW2ldID0gZW50cnk7Ci0gICAgICAgIGVudHJ5Lm5hbWUgPSBnZXRFZGl0TW9kZU5hbWUobW9kZUxpc3RbaV0sIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpOwotICAgICAgICBlbnRyeS5tb2RlID0gbW9kZUxpc3RbaV07Ci0gICAgICB9ICAgICAgICAKLSAgICAgIEFycmF5cy5zb3J0KGVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZXMsIG5ldyBDb21wYXJhdG9yKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkKLSAgICAgICAgewotICAgICAgICAgIEVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZSBhID0gKEVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZSlhcmcwOwotICAgICAgICAgIEVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZSBiID0gKEVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZSlhcmcxOyAgICAgICAgCi0gICAgICAgICAgcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShhLm5hbWUsIGIubmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWVzLmxlbmd0aDsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgRWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lIGVudHJ5ID0gZWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lc1tpXTsKLSAgICAgICAgbW9kZUNvbWJvLmFkZChlbnRyeS5uYW1lKTsKLSAgICAgICAgbWF4TGVuZ3RoID0gTWF0aC5tYXggKGdjLnN0cmluZ0V4dGVudChlbnRyeS5uYW1lKS54LCBtYXhMZW5ndGgpOwotICAgICAgICBpbnQgYXBwcm94V2lkdGhPZlN0cmluZ3MgPSBNYXRoLm1heCAoZ2Muc3RyaW5nRXh0ZW50KGVudHJ5Lm5hbWUpLngsIHRleHRXaWR0aCk7Ci0gICAgICAgIGlmIChhcHByb3hXaWR0aE9mU3RyaW5ncyA+IG1heExlbmd0aCkKLSAgICAgICAgICBtYXhMZW5ndGggPSBhcHByb3hXaWR0aE9mU3RyaW5nczsKLSAgICAgIH0KLSAgICAgIAotICAgICAgbWF4TGVuZ3RoICs9IGdjLnN0cmluZ0V4dGVudChNZXNzYWdlcy5fVUlfTEFCRUxfVklFVykueDsgCi0gICAgICBnYy5kaXNwb3NlKCk7Ci0gICAgICAKLSAgICAgIG1vZGVDb21ib0xpc3RlbmVyID0gbmV3IE1vZGVDb21ib0xpc3RlbmVyKCk7Ci0gICAgICBtb2RlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobW9kZUNvbWJvTGlzdGVuZXIpOwotICAgICAgbW9kZUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0VORCkpOwotICAgICAgbW9kZUNvbWJvLnNldEJhY2tncm91bmQodG9vbGJhci5nZXRCYWNrZ3JvdW5kKCkpOwotCi0gICAgICBJbWFnZUh5cGVybGluayBoeXBlcmxpbmsgPSBuZXcgSW1hZ2VIeXBlcmxpbmsodG9vbGJhciwgU1dULkZMQVQpOwotICAgICAgaHlwZXJsaW5rLnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDQ1NwotICAgICAgSW1hZ2UgaW1hZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEljb25JbWFnZSgiZXRvb2wxNi9oZWxwX2NvbnRlbnRzIik7Ci0gICAgICBoeXBlcmxpbmsuc2V0SW1hZ2UoaW1hZ2UpOwotICAgICAgaHlwZXJsaW5rLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9IT1ZFUl9WSUVXX01PREVfREVTQ1JJUFRJT04pOwotICAgICAgaHlwZXJsaW5rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUikpOwotICAgICAgaHlwZXJsaW5rLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuaGFuZGxlQWN0aW9uKCJzaG93RWRpdG9yTW9kZUhlbHAiKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0pOyAgICAgIAotICAgIH0KLSAgfQotICAKLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBNb2RlQ29tYm9MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgTW9kZUNvbWJvTGlzdGVuZXIoKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgaWYgKGUud2lkZ2V0ID09IG1vZGVDb21ibykKLSAgICAgIHsgICAgICAgIAotICAgICAgICBFZGl0b3JNb2RlTWFuYWdlciBtYW5hZ2VyID0gKEVkaXRvck1vZGVNYW5hZ2VyKWdldEFkYXB0ZXIoRWRpdG9yTW9kZU1hbmFnZXIuY2xhc3MpOwotICAgICAgICBFZGl0b3JNb2RlIFtdIG1vZGVMaXN0ID0gbWFuYWdlci5nZXRNb2RlcygpOwotICAgICAgICBpZiAobW9kZUxpc3QubGVuZ3RoID49IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBFZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWUgZW50cnkgPSBlZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWVzW21vZGVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpXTsKLSAgICAgICAgICBpZiAobWFuYWdlci5nZXRDdXJyZW50TW9kZSgpICE9IGVudHJ5Lm1vZGUpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICBtYW5hZ2VyLnNldEN1cnJlbnRNb2RlKGVudHJ5Lm1vZGUpOwotICAgICAgICAgICAgc3RvcmVDdXJyZW50TW9kZVByZWZlcmVuY2UoZW50cnkubW9kZS5nZXRJZCgpKTsKLSAgICAgICAgICAgIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciA9IChQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKSBnZXRBZGFwdGVyKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICAgICAgaWYgKHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5oYW5kbGVBY3Rpb24oImVkaXRvck1vZGVDaGFuZ2VkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHN0b3JlQ3VycmVudE1vZGVQcmVmZXJlbmNlKFN0cmluZyBpZCkKLSAgewotICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGFzIGRlZmF1bHQuICBBbGxvdyBleHRlbmRlcnMgdG8gaW1wbGVtZW50LgotICB9Ci0gIAotICAKLSAgcHJvdGVjdGVkIGNsYXNzIENvbW1vbkFjdGl2YXRpb25MaXN0ZW5lciBpbXBsZW1lbnRzIElQYXJ0TGlzdGVuZXIsIElXaW5kb3dMaXN0ZW5lcgotICB7Ci0KLSAgICAvKiogQ2FjaGUgb2YgdGhlIGFjdGl2ZSB3b3JrYmVuY2ggcGFydC4gKi8KLSAgICBwcml2YXRlIElXb3JrYmVuY2hQYXJ0IGZBY3RpdmVQYXJ0OwotICAgIC8qKiBJbmRpY2F0ZXMgd2hldGhlciBhY3RpdmF0aW9uIGhhbmRsaW5nIGlzIGN1cnJlbnRseSBiZSBkb25lLiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSBmYWxzZTsKLSAgICAvKioKLSAgICAgKiBUaGUgcGFydCBzZXJ2aWNlLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIElQYXJ0U2VydmljZSBmUGFydFNlcnZpY2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoaXMgYWN0aXZhdGlvbiBsaXN0ZW5lci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFydFNlcnZpY2UKLSAgICAgKiAgICAgICAgICB0aGUgcGFydCBzZXJ2aWNlIG9uIHdoaWNoIHRvIGFkZCB0aGUgcGFydCBsaXN0ZW5lcgotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tbW9uQWN0aXZhdGlvbkxpc3RlbmVyKElQYXJ0U2VydmljZSBwYXJ0U2VydmljZSkKLSAgICB7Ci0gICAgICBmUGFydFNlcnZpY2UgPSBwYXJ0U2VydmljZTsKLSAgICAgIGZQYXJ0U2VydmljZS5hZGRQYXJ0TGlzdGVuZXIodGhpcyk7Ci0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc3Bvc2VzIHRoaXMgYWN0aXZhdGlvbiBsaXN0ZW5lci4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgICAgZlBhcnRTZXJ2aWNlLnJlbW92ZVBhcnRMaXN0ZW5lcih0aGlzKTsKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkucmVtb3ZlV2luZG93TGlzdGVuZXIodGhpcyk7Ci0gICAgICBmUGFydFNlcnZpY2UgPSBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRBY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KQotICAgIHsKLSAgICAgIGZBY3RpdmVQYXJ0ID0gcGFydDsKLSAgICAgIGhhbmRsZUFjdGl2YXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0QnJvdWdodFRvVG9wKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgICB7Ci0gICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydENsb3NlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gICAgewotICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnREZWFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgICB7Ci0gICAgICBmQWN0aXZlUGFydCA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydE9wZW5lZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gICAgewotICAgIAlpZiAoQ29tbW9uTXVsdGlQYWdlRWRpdG9yLnRoaXMuZXF1YWxzKHBhcnQpKQotICAgIAl7Ci0gICAgCQlkb1Bvc3RFZGl0b3JPcGVuVGFza3MoKTsKLSAgICAJfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgdGhlIGFjdGl2YXRpb24gdHJpZ2dlcmluZyBhIGVsZW1lbnQgc3RhdGUgY2hlY2sgaW4gdGhlIGVkaXRvci4KLSAgICAgKi8KLSAgICB2b2lkIGhhbmRsZUFjdGl2YXRpb24oKQotICAgIHsKLSAgICAgIGlmIChmSXNIYW5kbGluZ0FjdGl2YXRpb24gfHwgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAoZkFjdGl2ZVBhcnQgPT0gQ29tbW9uTXVsdGlQYWdlRWRpdG9yLnRoaXMpCi0gICAgICB7Ci0gICAgICAgIGZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IHRydWU7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0VGV4dEVkaXRvcigpLnNhZmVseVNhbml0eUNoZWNrU3RhdGUoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0FjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3aW5kb3dBY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpCi0gICAgewotICAgICAgaWYgKHdpbmRvdyA9PSBnZXRFZGl0b3JTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkpCi0gICAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFdvcmthcm91bmQgZm9yIHByb2JsZW0gZGVzY3JpYmVkIGluCi0gICAgICAgICAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3MzEgV2lsbCBiZSByZW1vdmVkCi0gICAgICAgICAqIHdoZW4gU1dUIGhhcyBzb2x2ZWQgdGhlIHByb2JsZW0uCi0gICAgICAgICAqLwotICAgICAgICB3aW5kb3cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGhhbmRsZUFjdGl2YXRpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93RGVhY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2luZG93RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpCi0gICAgewotICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93Q2xvc2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykKLSAgICB7Ci0gICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lciN3aW5kb3dPcGVuZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2luZG93T3BlbmVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KQotICAgIHsKLSAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzU291cmNlUGFnZUFjdGl2ZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0QWN0aXZlUGFnZSgpID09IFNPVVJDRV9QQUdFX0lOREVYOwotICB9Ci0gIAotICAvKioKLSAgICogSW52b2tlZCBkdXJpbmcgSVBhcnRMaXN0ZW5lciNwYXJ0T3BlbmVkLiBEZXJpdmVkIGNsYXNzZXMgY2FuIG92ZXJyaWRlCi0gICAqIHRvIHByb3ZpZGUgc3BlY2lhbGl6ZWQgYmVoYXZpb3VyLiAgCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBkb1Bvc3RFZGl0b3JPcGVuVGFza3MoKSB7Ci0JICAvLyBOb3RoaW5nIHRvIGRvIGluIHRoZSBiYXNlIGNsYXNzLgotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQ29tbW9uU2VsZWN0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0NvbW1vblNlbGVjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZlYWQ2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQ29tbW9uU2VsZWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25TZWxlY3Rpb25NYW5hZ2VyIGV4dGVuZHMgTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLXsKLQotICBwdWJsaWMgQ29tbW9uU2VsZWN0aW9uTWFuYWdlcihNdWx0aVBhZ2VFZGl0b3JQYXJ0IG11bHRpUGFnZUVkaXRvcikKLSAgewotICAgIHN1cGVyKG11bHRpUGFnZUVkaXRvcik7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjZ2V0U2VsZWN0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gY3VycmVudFNlbGVjdGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNyZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNzZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdGhpcyk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgewotICAgIGlmIChlbmFibGVOb3RpZnkpCi0gICAgewotICAgICAgc2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpLCBldmVudC5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKTsKLSAgICB9Ci0gIH0KLQotICAKLSAgcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICBwcm90ZWN0ZWQgSVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVOb3RpZnkgPSB0cnVlOwotCi0gIHB1YmxpYyBib29sZWFuIGdldEVuYWJsZU5vdGlmeSgpCi0gIHsKLSAgICByZXR1cm4gZW5hYmxlTm90aWZ5OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIElTZWxlY3Rpb25Qcm92aWRlciBzb3VyY2UpCi0gIHsgIAotICAgIGlmIChlbmFibGVOb3RpZnkpCi0gICAgewotICAgICAgY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgICAgIGVuYWJsZU5vdGlmeSA9IGZhbHNlOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc291cmNlLCBzZWxlY3Rpb24pOwotICAgICAgICBMaXN0IGNvcHlPZkxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QobGlzdGVuZXJMaXN0KTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY29weU9mTGlzdGVuZXJMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICAgICAgbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgZW5hYmxlTm90aWZ5ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9Db250ZXh0TWVudVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQ29udGV4dE1lbnVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWQ0MjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9Db250ZXh0TWVudVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZXh0TWVudVBhcnRpY2lwYW50Ci17ICAKLSAgcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKE9iamVjdCBvYmplY3QsIFN0cmluZyBhY3Rpb25JZCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjb250cmlidXRlQWN0aW9ucyhPYmplY3Qgb2JqZWN0LCBJTWVudU1hbmFnZXIgbWVudSkKLSAgeyAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0VkaXRvck1vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9FZGl0b3JNb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZWY4NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0VkaXRvck1vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFZGl0b3JNb2RlIGltcGxlbWVudHMgSUFkYXB0YWJsZQotewotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldElkKCk7Ci0gIAotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0gIAotICBwdWJsaWMgYWJzdHJhY3QgRWRpdFBhcnRGYWN0b3J5IGdldEVkaXRQYXJ0RmFjdG9yeSgpOwotICAKLSAgLy8gVE9ETyAoY3MpIHRoaXMgc2hvdWxkIHJldHVybiBJVHJlZUNvbnRlbnRQcm92aWRlcgotICBwdWJsaWMgYWJzdHJhY3QgSUNvbnRlbnRQcm92aWRlciBnZXRPdXRsaW5lUHJvdmlkZXIoKTsKLSAgCi0gIHB1YmxpYyBDb250ZXh0TWVudVBhcnRpY2lwYW50IGdldENvbnRleHRNZW51UGFydGljaXBhbnQoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9FZGl0b3JNb2RlTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0VkaXRvck1vZGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYmVmNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0VkaXRvck1vZGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotcHVibGljIGNsYXNzIEVkaXRvck1vZGVNYW5hZ2VyIGltcGxlbWVudHMgSUFkYXB0YWJsZQotewotICBwcml2YXRlIExpc3QgbW9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByaXZhdGUgRWRpdG9yTW9kZSBjdXJyZW50TW9kZSA9IG51bGw7Ci0gIHByaXZhdGUgTGlzdCBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByaXZhdGUgU3RyaW5nIGV4dGVuc2lvblBvaW50SWQ7Ci0gIHByaXZhdGUgUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyOwotICAKLSAgcHVibGljIEVkaXRvck1vZGVNYW5hZ2VyKFN0cmluZyBleHRlbnNpb25Qb2ludElkKQotICB7Ci0gICAgdGhpcy5leHRlbnNpb25Qb2ludElkID0gZXh0ZW5zaW9uUG9pbnRJZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaW5pdCgpCi0gIHsgCi0gICAgcmVhZFJlZ2lzdHJ5KGV4dGVuc2lvblBvaW50SWQpOyAgICAKLSAgICBjdXJyZW50TW9kZSA9IGdldERlZmF1bHRNb2RlKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBFZGl0b3JNb2RlIGdldERlZmF1bHRNb2RlKCkKLSAgewotICAgIHJldHVybiAoRWRpdG9yTW9kZSltb2RlTGlzdC5nZXQoMCk7ICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBhZGRNb2RlKEVkaXRvck1vZGUgbW9kZSkKLSAgewotICAgIG1vZGVMaXN0LmFkZChtb2RlKTsKLSAgfQotICAKLSAgcHVibGljIEVkaXRvck1vZGUgZ2V0RWRpdG9yTW9kZShTdHJpbmcgZWRpdG9yTW9kZUlkKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbW9kZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBFZGl0b3JNb2RlIGVkaXRvck1vZGUgPSAoRWRpdG9yTW9kZSlpLm5leHQoKTsKLSAgICAgIGlmIChlZGl0b3JNb2RlSWQuZXF1YWxzKGVkaXRvck1vZGUuZ2V0SWQoKSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBlZGl0b3JNb2RlOwotICAgICAgfSAgCi0gICAgfSAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRNb2RlKEVkaXRvck1vZGUgbW9kZSkKLSAgewotICAgIGlmIChtb2RlTGlzdC5jb250YWlucyhtb2RlKSkKLSAgICB7Ci0gICAgICBjdXJyZW50TW9kZSA9IG1vZGU7Ci0gICAgICBMaXN0IGNsb25lZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBjbG9uZWRMaXN0LmFkZEFsbChsaXN0ZW5lcnMpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gY2xvbmVkTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBJRWRpdG9yTW9kZUxpc3RlbmVyIGxpc3RlbmVyID0gKElFZGl0b3JNb2RlTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICAgIGxpc3RlbmVyLmVkaXRvck1vZGVDaGFuZ2VkKG1vZGUpOwotICAgICAgfSAgCi0gICAgfSAgCi0gIH0KLSAgCi0gIHB1YmxpYyBFZGl0b3JNb2RlIGdldEN1cnJlbnRNb2RlKCkKLSAgewotICAgIHJldHVybiBjdXJyZW50TW9kZTsKLSAgfQotICAKLSAgcHVibGljIEVkaXRvck1vZGVbXSBnZXRNb2RlcygpCi0gIHsKLSAgICBFZGl0b3JNb2RlW10gbW9kZXMgPSBuZXcgRWRpdG9yTW9kZVttb2RlTGlzdC5zaXplKCldOwotICAgIG1vZGVMaXN0LnRvQXJyYXkobW9kZXMpOwotICAgIHJldHVybiBtb2RlczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUVkaXRvck1vZGVMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLSAgICB7ICAKLSAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgIH0gIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJRWRpdG9yTW9kZUxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7ICAKLSAgfSAgCi0gIAotICBwcml2YXRlIHZvaWQgcmVhZFJlZ2lzdHJ5KFN0cmluZyBpZCkKLSAgeyAgICAKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKGlkKTsgIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLSAgICAgIFN0cmluZyBlZGl0b3JNb2RlSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGVkaXRvck1vZGVJZCAhPSBudWxsICYmIAotICAgICAgICAgIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgIT0gbnVsbCAmJgotICAgICAgICAgICFwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmlzRWRpdG9yTW9kZUFwcGxpY2FibGUoZWRpdG9yTW9kZUlkKSkKLSAgICAgIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9ICAKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBFZGl0b3JNb2RlIG1vZGUgPSAoRWRpdG9yTW9kZSllbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAgICAgIG1vZGVMaXN0LmFkZChtb2RlKTsgICAgICAgIAotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgeyAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICB9ICAKLSAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHNldFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIoUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5wcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyID0gcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0lBRFRFZGl0b3JJbnB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0lBRFRFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzY0ZDY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9JQURURWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGludGVyZmFjZSBJQURURWRpdG9ySW5wdXQgZXh0ZW5kcyBJRWRpdG9ySW5wdXQKLXsKLSAgcHVibGljIFhTRFNjaGVtYSBnZXRTY2hlbWEoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9JRWRpdG9yTW9kZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvSUVkaXRvck1vZGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTk4YmRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9JRWRpdG9yTW9kZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotcHVibGljIGludGVyZmFjZSBJRWRpdG9yTW9kZUxpc3RlbmVyCi17Ci0gIHZvaWQgZWRpdG9yTW9kZUNoYW5nZWQoRWRpdG9yTW9kZSBuZXdFZGl0b3JNb2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiN2RlNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLSAgcHJpdmF0ZSBNZXNzYWdlcygpCi0gIHsKLSAgfQotCi0gIHN0YXRpYwotICB7Ci0gICAgLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLSAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0gIH0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9TSE9XX1BST1BFUlRJRVM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fU0VUX0FTX0ZPQ1VTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0RFTEVURTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRklFTEQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQlJPV1NFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX05FVzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9VUERBVEVfTkFNRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9VUERBVEVfVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9VUERBVEVfRUxFTUVOVF9SRUZFUkVOQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fU0VMRUNUX0FMTDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RFU0lHTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NPVVJDRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1ZJRVc7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9IT1ZFUl9WSUVXX01PREVfREVTQ1JJUFRJT047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fT1ZFUldSSVRFX0NPTkZJUk1BVElPTl9RVUVTVElPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9PVkVSV1JJVEVfQ09ORklSTUFUSU9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0VSUk9SX1RJVExFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0VSUk9SX0RFU0NSSVBUSU9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0ZPUk1BVF9OT1RfU1VQUE9SVEVEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0FQVFVSRV9TQ1JFRU5fQUNUSU9OX1RFWFQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQVBUVVJFX1NDUkVFTl9BQ1RJT05fVE9PTFRJUFRFWFQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fREVGQVVMVF9GSUxFX05BTUU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fRklMRV9TQVZFX0RJQUxPR19USVRMRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0hPVkVSX0JBQ0tfVE9fU0NIRU1BOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVGQUNUT1JfQ09OVEVYVF9NRU5VOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSFlQRVJMSU5LX1RFWFQ7ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9Qcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWNlMDYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9Qcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuTmF2aWdhdGlvbkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuRXh0ZW5zaWJsZUNvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyCi17Ci0gIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRWRpdG9yTW9kZUFwcGxpY2FibGUoU3RyaW5nIGlkKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRFZGl0b3JNb2RlRGlzcGxheU5hbWUoU3RyaW5nIGlkKTsKLSAKLSAgcHVibGljIFN0cmluZyBnZXRQcm9kdWN0U3RyaW5nKFN0cmluZyBpZCkKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRQcm9kdWN0U3RyaW5nKFN0cmluZyBpZCwgT2JqZWN0W10gYXJncykKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaGFuZGxlQWN0aW9uKFN0cmluZyBhY3Rpb25JZCkKLSAgeyAgICAKLSAgfQotICAKLSAgcHVibGljIE5hdmlnYXRpb25Mb2NhdGlvbiBnZXROYXZpZ2F0aW9uTG9jYXRpb24oSUVkaXRvclBhcnQgcGFydCwgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50LCBCYXNlRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIEV4dGVuc2libGVDb250ZW50T3V0bGluZVBhZ2UgZ2V0UHJvZHVjdENvbnRlbnRPdXRsaW5lUGFnZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExMGU0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLV9VSV9BQ1RJT05fU0hPV19QUk9QRVJUSUVTPVNobyZ3IHByb3BlcnRpZXMKLV9VSV9BQ1RJT05fU0VUX0FTX0ZPQ1VTPSZTZXQgQXMgRm9jdXMKLV9VSV9BQ1RJT05fVVBEQVRFX05BTUU9VXBkYXRlIE5hbWUKLV9VSV9BQ1RJT05fVVBEQVRFX1RZUEU9VXBkYXRlIHR5cGUKLV9VSV9BQ1RJT05fVVBEQVRFX0VMRU1FTlRfUkVGRVJFTkNFPVVwZGF0ZSBlbGVtZW50IHJlZmVyZW5jZQotX1VJX0FDVElPTl9ERUxFVEU9JkRlbGV0ZQotX1VJX0FDVElPTl9CUk9XU0U9JkJyb3dzZS4uLgotX1VJX0xBQkVMX0RFU0lHTj1EZXNpZ24KLV9VSV9MQUJFTF9TT1VSQ0U9U291cmNlCi1fVUlfQUNUSU9OX05FVz0mTmV3Li4uCi1fVUlfQUNUSU9OX0FERF9GSUVMRD1BZGQgRmllbGQKLV9VSV9MQUJFTF9WSUVXPVZpZXc6Ci1fVUlfSE9WRVJfVklFV19NT0RFX0RFU0NSSVBUSU9OPUNoYW5nZSB0aGUgdmlldyBtb2RlIG9mIHRoZSBlZGl0b3IKLV9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fT1ZFUldSSVRFX0NPTkZJUk1BVElPTl9RVUVTVElPTj1RdWVzdGlvbgotX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9PVkVSV1JJVEVfQ09ORklSTUFUSU9OPVRoZSBmaWxlIHswfSBhbHJlYWR5IGV4aXN0cy4gRG8geW91IHdhbnQgdG8gcmVwbGFjZSB0aGUgZXhpc3RpbmcgZmlsZT8KLV9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fRVJST1JfVElUTEU9RXJyb3IKLV9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fRVJST1JfREVTQ1JJUFRJT049Q291bGQgbm90IHNhdmUgZWRpdG9yIGNvbnRlbnRzCi1fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0ZPUk1BVF9OT1RfU1VQUE9SVEVEPUZvcm1hdCBub3Qgc3VwcG9ydGVkCi1fVUlfQ0FQVFVSRV9TQ1JFRU5fQUNUSU9OX1RFWFQgPSAmRXhwb3J0IERpYWdyYW0gYXMgSW1hZ2UuLi4KLV9VSV9DQVBUVVJFX1NDUkVFTl9BQ1RJT05fVE9PTFRJUFRFWFQgPSBFeHBvcnQgRGlhZ3JhbSBhcyBJbWFnZQotX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9ERUZBVUxUX0ZJTEVfTkFNRSA9IERpYWdyYW0KLV9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fRklMRV9TQVZFX0RJQUxPR19USVRMRT1FeHBvcnQgRGlhZ3JhbSBhcyBJbWFnZQotX1VJX0hPVkVSX0JBQ0tfVE9fU0NIRU1BPVNob3cgc2NoZW1hIGluZGV4IHZpZXcKLV9VSV9BQ1RJT05fU0VMRUNUX0FMTD1TZWxlY3QgJkFsbAotX1VJX1JFRkFDVE9SX0NPTlRFWFRfTUVOVT1SZWZhYyZ0b3IKLV9VSV9IWVBFUkxJTktfVEVYVCA9IE9wZW4gezB9IHdpdGggdGhlIFhNTCBTY2hlbWEgZWRpdG9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSUFEVE9iamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lBRFRPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhNGE4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSUFEVE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZTsKLQotcHVibGljIGludGVyZmFjZSBJQURUT2JqZWN0Ci17Ci0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpOwotICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpOwotICAgIGJvb2xlYW4gaXNSZWFkT25seSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lBRFRPYmplY3RMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lBRFRPYmplY3RMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmM4ZWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JQURUT2JqZWN0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUFEVE9iamVjdExpc3RlbmVyCi17Ci0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpOyAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSUNvbXBsZXhUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSUNvbXBsZXhUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5N2FkYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lDb21wbGV4VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZTsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBsZXhUeXBlIGV4dGVuZHMgSVR5cGUsIElTdHJ1Y3R1cmUKLXsKLSAgYm9vbGVhbiBpc0Fic3RyYWN0KCk7Ci0gIE9iamVjdCBnZXRDb250ZW50VHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lGaWVsZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTMxZDMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotcHVibGljIGludGVyZmFjZSBJRmllbGQgZXh0ZW5kcyBJQURUT2JqZWN0Ci17Ci0gIFN0cmluZyBnZXRLaW5kKCk7Ci0gIFN0cmluZyBnZXROYW1lKCk7Ci0gIFN0cmluZyBnZXRUeXBlTmFtZSgpOwotICBTdHJpbmcgZ2V0VHlwZU5hbWVRdWFsaWZpZXIoKTsKLSAgSU1vZGVsIGdldE1vZGVsKCk7Ci0gIElUeXBlIGdldFR5cGUoKTsKLSAgSUNvbXBsZXhUeXBlIGdldENvbnRhaW5lclR5cGUoKTsKLSAgaW50IGdldE1pbk9jY3VycygpOwotICBpbnQgZ2V0TWF4T2NjdXJzKCk7Ci0gIGJvb2xlYW4gaXNHbG9iYWwoKTsKLSAgYm9vbGVhbiBpc1JlZmVyZW5jZSgpOwotICBib29sZWFuIGlzQWJzdHJhY3QoKTsKLSAgCi0gIENvbW1hbmQgZ2V0VXBkYXRlTWluT2NjdXJzQ29tbWFuZChpbnQgbWluT2NjdXJzKTsKLSAgQ29tbWFuZCBnZXRVcGRhdGVNYXhPY2N1cnNDb21tYW5kKGludCBtYXhPY2N1cnMpOwotICBDb21tYW5kIGdldFVwZGF0ZVR5cGVOYW1lQ29tbWFuZChTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBxdWFpbGlmaWVyKTsKLSAgQ29tbWFuZCBnZXRVcGRhdGVOYW1lQ29tbWFuZChTdHJpbmcgbmFtZSk7IAotICBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTQyNDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBJTW9kZWwgZXh0ZW5kcyBJQURUT2JqZWN0Ci17Ci0gIExpc3QgZ2V0VHlwZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JU3RydWN0dXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSVN0cnVjdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzBkMTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JU3RydWN0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZSBleHRlbmRzIElBRFRPYmplY3QKLXsKLSAgU3RyaW5nIGdldE5hbWUoKTsKLSAgTGlzdCBnZXRGaWVsZHMoKTsKLSAgSU1vZGVsIGdldE1vZGVsKCk7Ci0gIENvbW1hbmQgZ2V0QWRkTmV3RmllbGRDb21tYW5kKFN0cmluZyBmaWVsZEtpbmQpOwotICBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkMWFkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotcHVibGljIGludGVyZmFjZSBJVHlwZSBleHRlbmRzIElBRFRPYmplY3QKLXsgCi0gIElUeXBlIGdldFN1cGVyVHlwZSgpOwotICBTdHJpbmcgZ2V0TmFtZSgpOwotICBTdHJpbmcgZ2V0UXVhbGlmaWVyKCk7Ci0gIGJvb2xlYW4gaXNDb21wbGV4VHlwZSgpOwotICBib29sZWFuIGlzQW5vbnltb3VzKCk7Ci0gIAotICBDb21tYW5kIGdldFVwZGF0ZU5hbWVDb21tYW5kKFN0cmluZyBuZXdOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvQURUQ29udGVudE91dGxpbmVQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0FEVENvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGZiMDFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvQURUQ29udGVudE91dGxpbmVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuQ2F0ZWdvcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuUmVkZWZpbmVDYXRlZ29yeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RSZWRlZmluZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RTY2hlbWFBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uRGVzaWduVmlld0NvbnRleHRNZW51UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JTW9kZWxQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgQURUQ29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgRXh0ZW5zaWJsZUNvbnRlbnRPdXRsaW5lUGFnZQotewotICBwcm90ZWN0ZWQgaW50IGxldmVsID0gMDsKLSAgcHJvdGVjdGVkIE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvbk1hbmFnZXI7Ci0gIHByb3RlY3RlZCBTZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgc2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbk1hbmFnZXJTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpOwotCi0gIHB1YmxpYyBBRFRDb250ZW50T3V0bGluZVBhZ2UoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICBnZXRUcmVlVmlld2VyKCkuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0gICAgZ2V0VHJlZVZpZXdlcigpLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0gICAgZ2V0VHJlZVZpZXdlcigpLnNldElucHV0KG1vZGVsKTsKLSAgICBnZXRUcmVlVmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICAgIE1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCIjcG9wdXAiKTsvLyROT04tTkxTLTEkCi0gICAgbWVudU1hbmFnZXIuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotICAgIE1lbnUgbWVudSA9IG1lbnVNYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KGdldFRyZWVWaWV3ZXIoKS5nZXRDb250cm9sKCkpOwotICAgIGdldFRyZWVWaWV3ZXIoKS5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLSAgICBzZXRTZWxlY3Rpb25NYW5hZ2VyKGVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIAotICAgIC8vIENyZWF0ZSBtZW51Li4uZm9yIG5vdyByZXVzZSBncmFwaCdzLiAgTm90ZSBlZGl0IHBhcnQgdmlld2VyID0gbnVsbAotICAgIERlc2lnblZpZXdDb250ZXh0TWVudVByb3ZpZGVyIG1lbnVQcm92aWRlciA9IG5ldyBEZXNpZ25WaWV3Q29udGV4dE1lbnVQcm92aWRlcihlZGl0b3IsIG51bGwsIGVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIG1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihtZW51UHJvdmlkZXIpOwotICAgIGdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KCJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnBvcHVwLm91dGxpbmUiLCBtZW51TWFuYWdlciwgZWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIGVuYWJsZSBwb3B1cE1lbnVzIGV4dGVuc2lvbgotICAgIC8vIGdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KCJvcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLnVpLnBvcHVwLm91dGxpbmUiLAotICAgIC8vIG1lbnVNYW5hZ2VyLCB4c2RFZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLQotICAgIC8vIGRyaWxsIGRvd24gZnJvbSBvdXRsaW5lIHZpZXcKLSAgICBnZXRUcmVlVmlld2VyKCkuZ2V0Q29udHJvbCgpLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb24gaVNlbGVjdGlvbiA9IGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKGlTZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgaVNlbGVjdGlvbjsKLSAgICAgICAgICBPYmplY3Qgb2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSBvYmo7Ci0gICAgICAgICAgICBpZiAoY29tcC5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gZ2V0WFNERWRpdG9yKCkuZ2V0R3JhcGhWaWV3ZXIoKS5zZXRJbnB1dChvYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLQotICBjbGFzcyBYU0RLZXlMaXN0ZW5lciBleHRlbmRzIEtleUFkYXB0ZXIKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBjb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEV4cGFuZFRvTGV2ZWwoaW50IGkpCi0gIHsKLSAgICBsZXZlbCA9IGk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBnZXRUcmVlVmlld2VyKCkuc2V0SW5wdXQodmFsdWUpOwotICAgIGdldFRyZWVWaWV3ZXIoKS5leHBhbmRUb0xldmVsKGxldmVsKTsKLSAgfQotCi0gIC8vIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0gIC8vIHsKLSAgLy8gaWYgKGdldFRyZWVWaWV3ZXIoKSA9PSBudWxsKQotICAvLyByZXR1cm4gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLSAgLy8gcmV0dXJuIGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgLy8gfQotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25NYW5hZ2VyKE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyIG5ld1NlbGVjdGlvbk1hbmFnZXIpCi0gIHsKLSAgICAvLyBkaXNjb25uZWN0IGZyb20gb2xkIG9uZQotICAgIGlmIChzZWxlY3Rpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgewotICAgICAgc2VsZWN0aW9uTWFuYWdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLSAgICB9Ci0gICAgc2VsZWN0aW9uTWFuYWdlciA9IG5ld1NlbGVjdGlvbk1hbmFnZXI7Ci0gICAgLy8gY29ubmVjdCB0byBuZXcgb25lCi0gICAgaWYgKHNlbGVjdGlvbk1hbmFnZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25NYW5hZ2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBTZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICB1cGRhdGVTdGF0dXNMaW5lKGdldFNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSwgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgaWYgKGV2ZW50LmdldFNlbGVjdGlvblByb3ZpZGVyKCkgIT0gQURUQ29udGVudE91dGxpbmVQYWdlLnRoaXMpICAvL2dldFRyZWVWaWV3ZXIoKSkKLSAgICAgIHsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgCi0gICAgICAgIE9iamVjdCBzZWxlY3Rpb25GaXJzdEVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIE9iamVjdCBjdXJyZW50Rmlyc3RFbGVtZW50ID0gY3VycmVudFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAKLSAgICAgICAgLy8gVE9ETzogSGFjayB0byBwcmV2ZW50IGxvc2luZyBhIHNlbGVjdGlvbiB3aGVuIHRoZSBzY2hlbWEgaXMgc2VsZWN0ZWQgaW4gdGhlCi0gICAgICAgIC8vIHNvdXJjZS4gIEZpeCBpcyB0byBwcmV2ZW50IHRoZSBzb3VyY2UgZnJvbSBmaXJpbmcgb2ZmIHNlbGVjdGlvbiBjaGFuZ2VzIHdoZW4KLSAgICAgICAgLy8gdGhlIHNlbGVjdGlvbiBzb3VyY2UgaXMgbm90IHRoZSBzb3VyY2Ugdmlldy4KLSAgICAgICAgCi0gICAgICAgIGlmIChzZWxlY3Rpb25GaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJTW9kZWwpCi0gICAgICAgIHsgICAgICAgICAgCi0gICAgICAgICAgaWYgKCEoY3VycmVudEZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElNb2RlbFByb3h5KSB8fCBjdXJyZW50Rmlyc3RFbGVtZW50IGluc3RhbmNlb2YgUmVkZWZpbmVDYXRlZ29yeUFkYXB0ZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2V0VHJlZVZpZXdlcigpLnNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNlbGVjdGlvbkZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgCWlmICghKGN1cnJlbnRGaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBSZWRlZmluZUNhdGVnb3J5QWRhcHRlcikpCi0gICAgICAgIAl7Ci0gICAgICAgIAkJZ2V0VHJlZVZpZXdlcigpLnNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSwgdHJ1ZSk7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgTGlzdCBsaXN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi50b0xpc3QoKTsKLSAgICAgICAgICBpbnQgc2VsZWN0aW9uTGVuZ3RoID0gbGlzdC5zaXplKCk7Ci0gICAgICAgICAgaWYgKHNlbGVjdGlvbkxlbmd0aCA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb25MZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgT2JqZWN0IGl0ZW0gPSBsaXN0LmdldChpKTsKLQotICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEFkYXB0ZXJJbXBsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTm90aWZpZXIgdGFyZ2V0ID0gKChBZGFwdGVySW1wbCkgaXRlbSkuZ2V0VGFyZ2V0KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkpCi0gICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSB0YXJnZXQ7Ci0KLSAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGV4cGFuZCBwYXJlbnQgYmVmb3JlIGNoaWxkLCB0aHVzIGEgc3RhY2sgaXMgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICBTdGFjayBjb21wb25lbnRTdGFjayA9IG5ldyBTdGFjaygpOwotICAgICAgICAgICAgICAgIHdoaWxlICh4c2RDb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0YWNrLnB1c2goeHNkQ29uY3JldGVDb21wb25lbnQpOwotICAgICAgICAgICAgICAgICAgeHNkQ29uY3JldGVDb21wb25lbnQgPSB4c2RDb25jcmV0ZUNvbXBvbmVudC5nZXRDb250YWluZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBzdGFjayBtdXN0IGhhdmUgdGhlIFhTRFNjaGVtYUFkYXB0ZXIgYW5kCi0gICAgICAgICAgICAgICAgLy8gYXQgbGVhc3Qgb25lIGNvbXBvbmVudAotICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRTdGFjay5zaXplKCkgPCAyKQotICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBQb3Agb2ZmIHRoZSB0b3Agbm9kZSwgc2luY2UgaXQgaXMgdGhlIFhTRFNjaGVtYUFkYXB0ZXIsIHdoaWNoCi0gICAgICAgICAgICAgICAgLy8gaXNuJ3QKLSAgICAgICAgICAgICAgICAvLyB1c2VkIGFzIHBhcnQgb2YgZmluZGluZyB0aGUgb3V0bGluZSB2aWV3IGhpZXJhcmNoeQotICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0YWNrLnBvcCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCgoWFNEQ29uY3JldGVDb21wb25lbnQpIGNvbXBvbmVudFN0YWNrLnBlZWsoKSkuZUFkYXB0ZXJzKCkuc2l6ZSgpIDw9IDApCi0gICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBjb21wb25lbnRTdGFjay5wZWVrKCkpLmVBZGFwdGVycygpLmdldCgwKTsKLQotICAgICAgICAgICAgICAgIC8vIEZpbmQgb3V0IHdoaWNoIGNhdGVnb3J5IHRoZSBzZWxlY3RlZCBpdGVtIGlzIGNvbnRhaW5lZCBpbgotICAgICAgICAgICAgICAgIGludCBjYXRlZ29yeUluZGV4ID0gLTE7Ci0gICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlJbmRleCA9IENhdGVnb3J5QWRhcHRlci5ESVJFQ1RJVkVTOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGNhdGVnb3J5SW5kZXggPSBDYXRlZ29yeUFkYXB0ZXIuRUxFTUVOVFM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBjYXRlZ29yeUluZGV4ID0gQ2F0ZWdvcnlBZGFwdGVyLkFUVFJJQlVURVM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlJbmRleCA9IENhdGVnb3J5QWRhcHRlci5BVFRSSUJVVEVTOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyIHx8IG9iamVjdCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBjYXRlZ29yeUluZGV4ID0gQ2F0ZWdvcnlBZGFwdGVyLlRZUEVTOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlJbmRleCA9IENhdGVnb3J5QWRhcHRlci5HUk9VUFM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gRXhwYW5kIHRoZSBjYXRlZ29yeQotICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeUluZGV4ID09IC0xKQotICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGNhdGVnb3J5ID0gKChYU0RTY2hlbWFBZGFwdGVyKSBtb2RlbCkuZ2V0Q2F0ZWdvcnkoY2F0ZWdvcnlJbmRleCk7Ci0gICAgICAgICAgICAgICAgdHJlZVZpZXdlci5zZXRFeHBhbmRlZFN0YXRlKGNhdGVnb3J5LCB0cnVlKTsKLQotICAgICAgICAgICAgICAgIC8vIERvIG5vdCBleHBhbmQgY3VycmVudCBub2RlIG9mIGludGVyZXN0LCBqdXN0IGl0cyBwYXJlbnRzCi0gICAgICAgICAgICAgICAgd2hpbGUgKGNvbXBvbmVudFN0YWNrLnNpemUoKSA+IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gY29tcG9uZW50U3RhY2sucG9wKCk7Ci0gICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgb2JqZWN0OwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmVBZGFwdGVycygpLnNpemUoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAvLyBleHBhbmQKLSAgICAgICAgICAgICAgICAgICAgICBnZXRUcmVlVmlld2VyKCkuc2V0RXhwYW5kZWRTdGF0ZShjb21wb25lbnQuZUFkYXB0ZXJzKCkuZ2V0KDApLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBCdWcgMjUxNDc0IC0gV2Ugd2lsbCByZXN0cmljdCBzZWxlY3Rpb24gdG8gb25seSBvbmUgaXRlbQotICAgICAgICAgIGlmIChzZWxlY3Rpb25MZW5ndGggPT0gMSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBnZXRUcmVlVmlld2VyKCkuc2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgCSAgaWYoc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSAhPW51bGwpCi0gICAgICAgIAkJICBnZXRUcmVlVmlld2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXR1c0xpbmUoSVN0YXR1c0xpbmVNYW5hZ2VyIG1nciwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBTdHJpbmcgdGV4dCA9IG51bGw7Ci0gICAgSW1hZ2UgaW1hZ2UgPSBudWxsOwotICAgIElMYWJlbFByb3ZpZGVyIHN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyID0gbmV3IFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKGdldFRyZWVWaWV3ZXIoKSk7Ci0gICAgaWYgKHN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyICE9IG51bGwgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpCi0gICAgewotICAgICAgT2JqZWN0IGZpcnN0RWxlbWVudCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgWFNEUmVkZWZpbmVBZGFwdGVyKQotICAgIAkgIHJldHVybjsKLSAgICAgIHRleHQgPSBzdGF0dXNMaW5lTGFiZWxQcm92aWRlci5nZXRUZXh0KGZpcnN0RWxlbWVudCk7Ci0gICAgICBpbWFnZSA9IHN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyLmdldEltYWdlKGZpcnN0RWxlbWVudCk7Ci0gICAgfQotICAgIGlmIChpbWFnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG1nci5zZXRNZXNzYWdlKHRleHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbWdyLnNldE1lc3NhZ2UoaW1hZ2UsIHRleHQpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIGNsYXNzIFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgSkZhY2VOb2RlTGFiZWxQcm92aWRlcgotICB7Ci0gICAgVHJlZVZpZXdlciB0cmVlVmlld2VyID0gbnVsbDsKLQotICAgIHB1YmxpYyBTdGF0dXNMaW5lTGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikKLSAgICB7Ci0gICAgICB0cmVlVmlld2VyID0gdmlld2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudCA9PSBudWxsKQotICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBzLmFwcGVuZChsYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCkpOwotICAgICAgcmV0dXJuIHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9BRFRDb250ZW50T3V0bGluZVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0FEVENvbnRlbnRPdXRsaW5lUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2ZTc2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0FEVENvbnRlbnRPdXRsaW5lUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIEFEVENvbnRlbnRPdXRsaW5lUHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgSUFEVE9iamVjdExpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBWaWV3ZXIgdmlld2VyID0gbnVsbDsKLSAgcHJvdGVjdGVkIE9iamVjdCBvbGRJbnB1dCwgbmV3SW5wdXQ7Ci0gIHByb3RlY3RlZCBBRFRDb250ZW50T3V0bGluZVJlZnJlc2hKb2IgcmVmcmVzaEpvYjsKLQotICBwdWJsaWMgQURUQ29udGVudE91dGxpbmVQcm92aWRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkKLSAgewotICAgIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVRyZWVFbGVtZW50KQotICAgIHsKLSAgICAgIE9iamVjdFtdIGNoaWxkcmVuID0gKChJVHJlZUVsZW1lbnQpIHBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci0gICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgICAgICAgewotICAgICAgICAgICAgKChJQURUT2JqZWN0KSBjaGlsZCkucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElUcmVlRWxlbWVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gKChJVHJlZUVsZW1lbnQpIGVsZW1lbnQpLmhhc0NoaWxkcmVuKCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgewotICAgIHJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgT2JqZWN0IGlucHV0ID0gdmlld2VyLmdldElucHV0KCk7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSUFEVE9iamVjdCkKLSAgICB7Ci0gICAgICByZW1vdmVMaXN0ZW5lcigoSUFEVE9iamVjdCkgaW5wdXQpOwotICAgIH0KLSAgICBpZiAocmVmcmVzaEpvYiAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlZnJlc2hKb2IuY2FuY2VsKCk7Ci0gICAgICByZWZyZXNoSm9iID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgewotICAgIHRoaXMudmlld2VyID0gdmlld2VyOwotICAgIHRoaXMub2xkSW5wdXQgPSBvbGRJbnB1dDsKLSAgICB0aGlzLm5ld0lucHV0ID0gbmV3SW5wdXQ7Ci0gICAgaWYgKHJlZnJlc2hKb2IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZWZyZXNoSm9iLmNhbmNlbCgpOwotICAgIH0KLSAgICByZWZyZXNoSm9iID0gbmV3IEFEVENvbnRlbnRPdXRsaW5lUmVmcmVzaEpvYih2aWV3ZXIpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0TGlzdGVuZXIjcHJvcGVydHlDaGFuZ2VkKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgcmVmcmVzaEpvYi5yZWZyZXNoKChJQURUT2JqZWN0KW9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIG1vZGVsCi0gICAqLwotICBwcml2YXRlIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUFEVE9iamVjdCBtb2RlbCkKLSAgewotICAgIG1vZGVsLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICBPYmplY3RbXSBjaGlsZHJlbiA9IG51bGw7Ci0gICAgCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSVRyZWVFbGVtZW50KQotICAgIHsKLSAgICAgIGNoaWxkcmVuID0gKChJVHJlZUVsZW1lbnQpIG1vZGVsKS5nZXRDaGlsZHJlbigpOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGNoaWxkID0gY2hpbGRyZW5baV07Ci0gICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIElBRFRPYmplY3QgJiYgbW9kZWwgIT0gY2hpbGQpCi0gICAgICAgIHsKLSAgICAgICAgICByZW1vdmVMaXN0ZW5lcigoSUFEVE9iamVjdCkgY2hpbGQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvQURUQ29udGVudE91dGxpbmVSZWZyZXNoSm9iLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0FEVENvbnRlbnRPdXRsaW5lUmVmcmVzaEpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjA0Y2Y0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvQURUQ29udGVudE91dGxpbmVSZWZyZXNoSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5DYXRlZ29yeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci0KLQotLyoqCi0gKiBUaGlzIGpvYiBob2xkcyBhIHF1ZXVlIG9mIHVwZGF0ZXMgKGFmZmVjdGVkIG5vZGVzKSBmb3IgdGhlIFhTRCBlZGl0b3IncwotICogb3V0bGluZSB2aWV3LiBXaGVuIGEgbmV3IHJlcXVlc3QgY29tZXMgaW4sIHRoZSBjdXJyZW50IHJ1biBpcyBjYW5jZWxsZWQsIAotICogdGhlIG5ldyByZXF1ZXN0IGlzIGFkZGVkIHRvIHRoZSBxdWV1ZSwgdGhlbiB0aGUgam9iIGlzIHJlLXNjaGVkdWxlZC4KLSAqIFRoaXMgY2xhc3MgaXMgbG9vc2VseSBiYXNlZCBvbiBSZWZyZXNoU3RydWN0dXJlSm9iLgotICovCi1jbGFzcyBBRFRDb250ZW50T3V0bGluZVJlZnJlc2hKb2IgZXh0ZW5kcyBKb2IKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWxheSB0aW1lIGluIG1pbGxpc2Vjb25kcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVBEQVRFX0RFTEFZID0gMzAwOwotCi0gIHByaXZhdGUgZmluYWwgTGlzdCBub2Rlc1RvUmVmcmVzaCA9IG5ldyBBcnJheUxpc3QoNSk7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBUcmVlVmlld2VyIHZpZXdlcjsKLQotICBwdWJsaWMgQURUQ29udGVudE91dGxpbmVSZWZyZXNoSm9iKFZpZXdlciB2aWV3ZXIpCi0gIHsKLSAgICBzdXBlcigiUmVmcmVzaGluZyBYU0Qgb3V0bGluZSIpOyAvLyROT04tTkxTLTEkCi0gICAgc2V0UHJpb3JpdHkoSm9iLkxPTkcpOwotICAgIHNldFN5c3RlbSh0cnVlKTsKLSAgICB0aGlzLnZpZXdlciA9IChUcmVlVmlld2VyKXZpZXdlcjsKLSAgfQotCi0gIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkUmVmcmVzaFJlcXVlc3QoSUFEVE9iamVjdCBhZHRPYmplY3QpCi0gIHsKLSAgICBpZiAobm9kZXNUb1JlZnJlc2guY29udGFpbnMoYWR0T2JqZWN0KSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbm9kZXNUb1JlZnJlc2guYWRkKGFkdE9iamVjdCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjYW5jZWxpbmcoKQotICB7Ci0gICAgbm9kZXNUb1JlZnJlc2guY2xlYXIoKTsKLSAgICBzdXBlci5jYW5jZWxpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBkb1JlZnJlc2goZmluYWwgSUFEVE9iamVjdCBhZHRPYmplY3QpCi0gIHsKLSAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLSAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICB7Ci0gICAgICAgICAgYm9vbGVhbiBpc1ZhbGlkVmlld2VyID0gdmlld2VyICE9IG51bGwgJiYgIXZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpOwotICAgICAgICAgIGlmIChpc1ZhbGlkVmlld2VyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZpZXdlci5yZWZyZXNoKGFkdE9iamVjdCk7Ci0KLSAgICAgICAgICAgIC8vIE5lZWRsZXNzbHkgcmV2ZWFsaW5nIHRoZSBjYXRlZ29yeSBub2RlcyBjYXVzZXMgYSBsb3Qgb2YgVUkgZmxpY2tlci4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCEoYWR0T2JqZWN0IGluc3RhbmNlb2YgQ2F0ZWdvcnlBZGFwdGVyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdmlld2VyLnJldmVhbChhZHRPYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSk7Ci0gIH0KLQotICBwcml2YXRlIHN5bmNocm9uaXplZCBJQURUT2JqZWN0W10gZ2V0Tm9kZXNUb1JlZnJlc2goKQotICB7Ci0gICAgSUFEVE9iamVjdFtdIHRvUmVmcmVzaCA9IG5ldyBJQURUT2JqZWN0IFtub2Rlc1RvUmVmcmVzaC5zaXplKCldOwotICAgIG5vZGVzVG9SZWZyZXNoLnRvQXJyYXkodG9SZWZyZXNoKTsKLSAgICBub2Rlc1RvUmVmcmVzaC5jbGVhcigpOwotCi0gICAgcmV0dXJuIHRvUmVmcmVzaDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goSUFEVE9iamVjdCBhZHRPYmplY3QpCi0gIHsKLSAgICBpZiAoYWR0T2JqZWN0ID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGFkZFJlZnJlc2hSZXF1ZXN0KGFkdE9iamVjdCk7Ci0KLSAgICBzY2hlZHVsZShVUERBVEVfREVMQVkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgewotICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBwZXJmb3JtUmVmcmVzaGVzKG1vbml0b3IpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcGVyZm9ybVJlZnJlc2hlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gIHsKLSAgICBJQURUT2JqZWN0W10gbm9kZXMgPSBnZXROb2Rlc1RvUmVmcmVzaCgpOwotCi0gICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG5vZGVzLmxlbmd0aDsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgSUFEVE9iamVjdCBub2RlID0gbm9kZXNbaW5kZXhdOwotICAgICAgZG9SZWZyZXNoKG5vZGUpOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvQURUTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9BRFRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YTZkNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9BRFRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIEFEVExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlcgotewotCi0gIHB1YmxpYyBBRFRMYWJlbFByb3ZpZGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHJlZUVsZW1lbnQpCi0gICAgewotICAgICAgcmV0dXJuICgoSVRyZWVFbGVtZW50KWVsZW1lbnQpLmdldEltYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHJlZUVsZW1lbnQpCi0gICAgewotICAgICAgcmV0dXJuICgoSVRyZWVFbGVtZW50KWVsZW1lbnQpLmdldFRleHQoKTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvRXh0ZW5zaWJsZUNvbnRlbnRPdXRsaW5lUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9FeHRlbnNpYmxlQ29udGVudE91dGxpbmVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMTlhNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9FeHRlbnNpYmxlQ29udGVudE91dGxpbmVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVBhZ2VTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5BRFRNdWx0aVBhZ2VFZGl0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlQ29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgUGFnZSBpbXBsZW1lbnRzIElDb250ZW50T3V0bGluZVBhZ2UsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIExpc3RlbmVyTGlzdCBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotICBwcm90ZWN0ZWQgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotICBwcm90ZWN0ZWQgT2JqZWN0IG1vZGVsOwotICBwcm90ZWN0ZWQgSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotICBwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLSAgcHJvdGVjdGVkIEFEVE11bHRpUGFnZUVkaXRvciBlZGl0b3I7Ci0KLSAgcHJvdGVjdGVkIEV4dGVuc2libGVDb250ZW50T3V0bGluZVBhZ2UoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotICAgIHRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yKEFEVE11bHRpUGFnZUVkaXRvciBlZGl0b3IpCi0gIHsKLSAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TW9kZWwoT2JqZWN0IG5ld01vZGVsKQotICB7Ci0gICAgbW9kZWwgPSBuZXdNb2RlbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENvbnRlbnRQcm92aWRlcihJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLmNvbnRlbnRQcm92aWRlciA9IGNvbnRlbnRQcm92aWRlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldExhYmVsUHJvdmlkZXIoSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikKLSAgewotICAgIHRoaXMubGFiZWxQcm92aWRlciA9IGxhYmVsUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpCi0gIHsKLSAgICB0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRGb2N1cygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgaWYgKHRyZWVWaWV3ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZmlyZVNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICAvLyBjcmVhdGUgYW4gZXZlbnQKLSAgICBmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbik7Ci0KLSAgICAvLyBmaXJlIHRoZSBldmVudAotICAgIE9iamVjdFtdIGxpc3RlbmVycyA9IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyArK2kpCi0gICAgewotICAgICAgZmluYWwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLSAgICAgIFBsYXRmb3JtLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgewotICAgICAgICAgIGwuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKQotICB7Ci0gICAgaWYgKHRyZWVWaWV3ZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIHRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpOwotICB9Ci0KLSAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkKLSAgewotICAgIGlmICh0cmVlVmlld2VyID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0gICAgfQotICAgIHJldHVybiB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICB9Ci0KLSAgcHVibGljIFRyZWVWaWV3ZXIgZ2V0VHJlZVZpZXdlcigpCi0gIHsKLSAgICByZXR1cm4gdHJlZVZpZXdlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoSVBhZ2VTaXRlIHBhZ2VTaXRlKQotICB7Ci0gICAgc3VwZXIuaW5pdChwYWdlU2l0ZSk7Ci0gICAgcGFnZVNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGhpcyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICB7Ci0gICAgZmlyZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0lUcmVlRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9JVHJlZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2MGQ5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0lUcmVlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVRyZWVFbGVtZW50Ci17Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgSVRyZWVFbGVtZW50W10gRU1QVFlfTElTVCA9IHt9OwotICBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpOwotICBJVHJlZUVsZW1lbnQgZ2V0UGFyZW50KCk7Ci0gIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKTsKLSAgU3RyaW5nIGdldFRleHQoKTsKLSAgSW1hZ2UgZ2V0SW1hZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3Byb3BlcnRpZXMvQURUVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3Byb3BlcnRpZXMvQURUVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxMzQzZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvcHJvcGVydGllcy9BRFRUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQuICBFeHRlbmRlcnMgc2hvdWxkIHNwZWNpYWxpemUuLi5pZS4gWFNEVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UKLSAqLwotcHVibGljIGNsYXNzIEFEVFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIGV4dGVuZHMgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UKLXsKLSAgcHVibGljIEFEVFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKElUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IpCi0gIHsKLSAgICBzdXBlcih0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCi0vLyAgICAgIE9iamVjdCBzZWxlY3RlZCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotLy8gICAgICBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBFZGl0UGFydCkKLS8vICAgICAgewotLy8gICAgICAgIE9iamVjdCBtb2RlbCA9ICgoRWRpdFBhcnQpc2VsZWN0ZWQpLmdldE1vZGVsKCk7Ci0vLyAgICAgICAgc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obW9kZWwpOwotLy8gICAgICB9Ci0gICAgICBzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHBhcnQsIHNlbGVjdGlvbik7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RBbnlBdHRyaWJ1dGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3Nzg1ZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RBbnlBdHRyaWJ1dGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RBbnlBdHRyaWJ1dGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLkFkZFhTREFueUF0dHJpYnV0ZUFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb247Ci0gIAotICBwdWJsaWMgQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FOWV9BVFRSSUJVVEUpOwotICAgIHNldElkKElEKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgfQotICAgIEFkZFhTREFueUF0dHJpYnV0ZUNvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZFhTREFueUF0dHJpYnV0ZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQU5ZX0FUVFJJQlVURSwgKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgc2VsZWN0aW9uKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZFhTREFueUF0dHJpYnV0ZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQU5ZX0FUVFJJQlVURSwgKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbilzZWxlY3Rpb24pOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGRlZENvbXBvbmVudCA9IGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKTsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYWRkZWRDb21wb25lbnQpOwotICAgICAgc2VsZWN0QWRkZWRDb21wb25lbnQoYWRhcHRlcik7Ci0gICAgfQotICB9Ci0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVFbmFibGVkKCkKLSAgewotICAgIGJvb2xlYW4gcmMgPSBzdXBlci5jYWxjdWxhdGVFbmFibGVkKCk7Ci0gICAgaWYgKHJjKQotICAgIHsKLSAgICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uID0gKChYU0RCYXNlQWRhcHRlcikgc2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICAgIH0KLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilzZWxlY3Rpb24pLmdldEF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCgpID09IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbilzZWxlY3Rpb24pLmdldEF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCgpID09IG51bGw7Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotICB9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREFueUVsZW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQW55RWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTBhNTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQW55RWxlbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREFueUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotCi1wdWJsaWMgY2xhc3MgQWRkWFNEQW55RWxlbWVudEFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5BZGRYU0RBbnlFbGVtZW50QWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBBZGRYU0RBbnlFbGVtZW50QWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FOWV9FTEVNRU5UKTsKLSAgICBzZXRJZChJRCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBzZWxlY3Rpb24gPSAoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgIH0KLQotICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IGdldE1vZGVsR3JvdXAoc2VsZWN0aW9uKTsKLQotICAgIEFkZFhTREFueUVsZW1lbnRDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkWFNEQW55RWxlbWVudENvbW1hbmQoZ2V0VGV4dCgpLCBtb2RlbEdyb3VwKTsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGNvbW1hbmQuc2V0Q29tcGxleFR5cGUoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilzZWxlY3Rpb24pOwotICAgIH0KLSAgICBjb21tYW5kLnNldERvQ3JlYXRlTW9kZWxHcm91cEZvckNvbXBsZXhUeXBlKG1vZGVsR3JvdXAgPT0gbnVsbCk7Ci0gICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICBhZGRlZENvbXBvbmVudCA9IGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKTsKLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGFkZGVkQ29tcG9uZW50KTsKLSAgICBzZWxlY3RBZGRlZENvbXBvbmVudChhZGFwdGVyKTsKLSAgfQotCi0gIHByaXZhdGUgWFNETW9kZWxHcm91cCBnZXRNb2RlbEdyb3VwKE9iamVjdCBzZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICByZXR1cm4gKFhTRE1vZGVsR3JvdXApIHNlbGVjdGlvbjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCBjb250ZW50ID0gKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pc2VsZWN0aW9uKS5nZXRDb250ZW50KCk7Ci0gICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICBYU0RQYXJ0aWNsZUNvbnRlbnQgcGFydGljbGVDb250ZW50ID0gKChYU0RQYXJ0aWNsZSljb250ZW50KS5nZXRDb250ZW50KCk7Ci0gICAgICAgIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIChYU0RNb2RlbEdyb3VwKXBhcnRpY2xlQ29udGVudDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzExM2ZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uQWRkWFNEQXR0cmlidXRlQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBCRUZPUkVfU0VMRUNURURfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbi5CRUZPUkVfU0VMRUNURURfSUQiOyAvLyROT04tTkxTLTEkICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUZURVJfU0VMRUNURURfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbi5BRlRFUl9TRUxFQ1RFRF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUZfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBdHRyaWJ1dGVSZWZlcmVuY2VBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIGJvb2xlYW4gaXNSZWZlcmVuY2UgPSBmYWxzZTsKLSAgCi0gIHB1YmxpYyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUpOwotICAgIHNldElkKElEKTsKLSAgICBpc1JlZmVyZW5jZSA9IGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCwgU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNSZWZlcmVuY2UpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KGxhYmVsKTsKLSAgICBzZXRJZChpZCk7Ci0gICAgdGhpcy5pc1JlZmVyZW5jZSA9IGlzUmVmZXJlbmNlOwotICAgIGRvRGlyZWN0RWRpdCA9ICFpc1JlZmVyZW5jZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHNlbGVjdGlvbikuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURSwgKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgc2VsZWN0aW9uKTsKLSAgICAgIGNvbW1hbmQuc2V0UmVmZXJlbmNlKGlzUmVmZXJlbmNlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVVc2UgeHNkQXR0cmlidXRlVXNlID0gKFhTREF0dHJpYnV0ZVVzZSkgc2VsZWN0aW9uOwotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gbnVsbDsKLSAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCA9IG51bGw7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gZ3JvdXAgPSBudWxsOwotICAgICAgZm9yIChwYXJlbnQgPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0Q29udGFpbmVyKCk7IHBhcmVudCAhPSBudWxsOykKLSAgICAgIHsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGN0ID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgcGFyZW50OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbilwYXJlbnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldENvbnRhaW5lcigpOwotICAgICAgfQotICAgICAgaWYgKGN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZVVzZSBzZWwgPSAoWFNEQXR0cmlidXRlVXNlKSBzZWxlY3Rpb247Ci0gICAgICAgIGludCBpbmRleCA9IGN0LmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuaW5kZXhPZihzZWwpOwotICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUsIGN0LCBnZXRJZCgpLCBpbmRleCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0UmVmZXJlbmNlKGlzUmVmZXJlbmNlKTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZVVzZSBzZWwgPSAoWFNEQXR0cmlidXRlVXNlKSBzZWxlY3Rpb247Ci0gICAgICAgIGludCBpbmRleCA9IGdyb3VwLmVDb250ZW50cygpLmluZGV4T2Yoc2VsKTsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFLCBncm91cCwgZ2V0SWQoKSwgaW5kZXgpOwotICAgICAgICBjb21tYW5kLnNldFJlZmVyZW5jZShpc1JlZmVyZW5jZSk7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUsIChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pc2VsZWN0aW9uKTsKLSAgICAgIGNvbW1hbmQuc2V0UmVmZXJlbmNlKGlzUmVmZXJlbmNlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUsIChYU0RTY2hlbWEpc2VsZWN0aW9uKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIAotICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgewotICAgICAgYWRkZWRDb21wb25lbnQgPSBjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCk7Ci0gICAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGFkZGVkQ29tcG9uZW50KTsKLSAgICAgIHNlbGVjdEFkZGVkQ29tcG9uZW50KGFkYXB0ZXIpOwotICAgIH0KLQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwYTNlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIkFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVGX0lEID0gIkFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZkFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUCk7Ci0gICAgc2V0SWQoSUQpOwotICB9Ci0gIAotICBwdWJsaWMgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQsIFN0cmluZyBpZCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIGlmIChpZC5lcXVhbHMoUkVGX0lEKSkKLSAgICB7Ci0gICAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUF9SRUYpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfREVGSU5JVElPTik7Ci0gICAgfSAgIAotICAgIHNldElkKGlkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfUkVGLCAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBzZWxlY3Rpb24pOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfREVGSU5JVElPTiwgKFhTRFNjaGVtYSkgc2VsZWN0aW9uKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotCi0gICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGRlZENvbXBvbmVudCA9IGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKTsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYWRkZWRDb21wb25lbnQpOwotICAgICAgc2VsZWN0QWRkZWRDb21wb25lbnQoYWRhcHRlcik7Ci0gICAgfQotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTVmNGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25BY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0NPTVBMRVhfVFlQRSk7Ci0gICAgc2V0SWQoSUQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgewotICAgICAgc2VsZWN0aW9uID0gKChYU0RCYXNlQWRhcHRlcikgc2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsKLSAgICAgIEFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0NPTVBMRVhfVFlQRSwgKFhTRFNjaGVtYSkgc2VsZWN0aW9uKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAKLSAgICAgIGFkZGVkQ29tcG9uZW50ID0gY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpOwotICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChhZGRlZENvbXBvbmVudCk7Ci0gICAgICBzZWxlY3RBZGRlZENvbXBvbmVudChhZGFwdGVyKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNERWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RFbGVtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YmQ2NGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RFbGVtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RNb2RlbEdyb3VwSW1wbDsKLQotLy9yZXZpc2l0IHRoaXMgYW5kIHNlZSBpZiB3ZSBjYW4gcmV1c2UgQWRkRmllbGRBY3Rpb24/PwotCi1wdWJsaWMgY2xhc3MgQWRkWFNERWxlbWVudEFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50QWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBCRUZPUkVfU0VMRUNURURfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50QWN0aW9uLkJFRk9SRV9TRUxFQ1RFRF9JRCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUZURVJfU0VMRUNURURfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50QWN0aW9uLkFGVEVSX1NFTEVDVEVEX0lEIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUZfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50UmVmZXJlbmNlQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBib29sZWFuIGlzUmVmZXJlbmNlOwotICAKLSAgcHVibGljIEFkZFhTREVsZW1lbnRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCwgU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNSZWZlcmVuY2UpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KGxhYmVsKTsKLSAgICBzZXRJZChpZCk7Ci0gICAgdGhpcy5pc1JlZmVyZW5jZSA9IGlzUmVmZXJlbmNlOwotICAgIGRvRGlyZWN0RWRpdCA9ICFpc1JlZmVyZW5jZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgfQotICAgIEFkZFhTREVsZW1lbnRDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RFbGVtZW50Q29tbWFuZChnZXRUZXh0KCksIChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHNlbGVjdGlvbik7Ci0gICAgICBjb21tYW5kLnNldFJlZmVyZW5jZShpc1JlZmVyZW5jZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZFhTREVsZW1lbnRDb21tYW5kKGdldFRleHQoKSwgKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBzZWxlY3Rpb24pOwotICAgICAgY29tbWFuZC5zZXRSZWZlcmVuY2UoaXNSZWZlcmVuY2UpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNERWxlbWVudENvbW1hbmQoZ2V0VGV4dCgpLCAoWFNEU2NoZW1hKSBzZWxlY3Rpb24pOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cCkgc2VsZWN0aW9uOwotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0gbW9kZWxHcm91cC5nZXRDb250YWluZXIoKTsKLSAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCA9IG51bGw7Ci0gICAgICB3aGlsZSAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBjdCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIGNvbXBvbmVudDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTREVsZW1lbnRDb21tYW5kKGdldFRleHQoKSwgKFhTRE1vZGVsR3JvdXApIHNlbGVjdGlvbiwgY3QpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTREVsZW1lbnRDb21tYW5kKGdldFRleHQoKSwgKFhTRE1vZGVsR3JvdXApIHNlbGVjdGlvbik7Ci0gICAgICB9Ci0gICAgICBjb21tYW5kLnNldFJlZmVyZW5jZShpc1JlZmVyZW5jZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24gfHwgc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSBzZWxlY3Rpb247Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSBudWxsOwotICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ID0gbnVsbDsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGdyb3VwID0gbnVsbDsKLSAgICAgIFhTRE1vZGVsR3JvdXBJbXBsIGN0R3JvdXAgPSBudWxsOwotCi0gICAgICBmb3IgKHBhcmVudCA9IHhzZENvbmNyZXRlQ29tcG9uZW50LmdldENvbnRhaW5lcigpOyBwYXJlbnQgIT0gbnVsbDsgKQotICAgICAgewotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgY3QgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXBhcmVudDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGdyb3VwID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKXBhcmVudDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwSW1wbCkKLSAgICAgICAgewotICAgICAgICAgIGN0R3JvdXAgPSAoWFNETW9kZWxHcm91cEltcGwpIHBhcmVudDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoY3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RFbGVtZW50Q29tbWFuZChnZXRUZXh0KCksIGN0KTsKLSAgICAgICAgY29tbWFuZC5zZXRSZWZlcmVuY2UoaXNSZWZlcmVuY2UpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY3RHcm91cCAhPSBudWxsKQotICAgICAgewotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gc2VsID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgc2VsZWN0aW9uOwotICAgICAgICBpbnQgaW5kZXggPSBjdEdyb3VwLmdldENvbnRlbnRzKCkuaW5kZXhPZihzZWwuZUNvbnRhaW5lcigpKTsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RFbGVtZW50Q29tbWFuZChnZXRUZXh0KCksIGN0R3JvdXAsIGdldElkKCksIGluZGV4KTsKLSAgICAgICAgY29tbWFuZC5zZXRSZWZlcmVuY2UoaXNSZWZlcmVuY2UpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZ3JvdXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RFbGVtZW50Q29tbWFuZChnZXRUZXh0KCksIGdyb3VwKTsKLSAgICAgICAgY29tbWFuZC5zZXRSZWZlcmVuY2UoaXNSZWZlcmVuY2UpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkZGVkQ29tcG9uZW50ID0gY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpOwotICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChhZGRlZENvbXBvbmVudCk7Ci0gICAgICBzZWxlY3RBZGRlZENvbXBvbmVudChhZGFwdGVyKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RFbnVtZXJhdGlvbkZhY2V0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0YzExZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkRW51bWVyYXRpb25zQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbnVtZXJhdGlvbkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RFbnVtZXJhdGlvbkZhY2V0QWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLkFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEJFRk9SRV9TRUxFQ1RFRF9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb24uQkVGT1JFX1NFTEVDVEVEX0lEIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBBRlRFUl9TRUxFQ1RFRF9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb24uQUZURVJfU0VMRUNURURfSUQiOyAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgQWRkWFNERW51bWVyYXRpb25GYWNldEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0LCBTdHJpbmcgaWQsIFN0cmluZyBsYWJlbCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQobGFiZWwpOwotICAgIHNldElkKGlkKTsKLSAgfQotICAKLSAgcHVibGljIEFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRU5VTUVSQVRJT04pOwotICAgIHNldElkKElEKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgICBpbnQgaW5kZXggPSAtMTsKLSAgICAgIEFkZEVudW1lcmF0aW9uc0NvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IG51bGw7Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKXNlbGVjdGlvbjsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRFbnVtZXJhdGlvbnNDb21tYW5kKGdldFRleHQoKSwgc3QpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNERW51bWVyYXRpb25GYWNldCkKLSAgICAgIHsKLSAgICAgICAgc3QgPSAoKFhTREVudW1lcmF0aW9uRmFjZXQpc2VsZWN0aW9uKS5nZXRTaW1wbGVUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICBpbmRleCA9IHN0LmdldEZhY2V0Q29udGVudHMoKS5pbmRleE9mKHNlbGVjdGlvbik7Ci0gICAgICAgIGRvRGlyZWN0RWRpdCA9IHRydWU7Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkRW51bWVyYXRpb25zQ29tbWFuZChnZXRUZXh0KCksIHN0LCBnZXRJZCgpLCBpbmRleCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pICAvLyBTdXBwb3J0IGZvciBDb21wbGV4IFR5cGUncyBzaW1wbGUgQ29udGVudCB3aXRoIGVudW1lcmF0aW9ucwotICAgICAgewotICAgIAlzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pc2VsZWN0aW9uKS5nZXRDb250ZW50KCk7Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkRW51bWVyYXRpb25zQ29tbWFuZChnZXRUZXh0KCksIHN0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgLy8gbnVsbAotICAgICAgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIExpc3QgZW51bUxpc3QgPSBzdC5nZXRFbnVtZXJhdGlvbkZhY2V0cygpOwotICAgICAgCi0gICAgICBTdHJpbmcgbmV3TmFtZSA9IFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRW51bWVyYXRpb25WYWx1ZSgidmFsdWUiLCBlbnVtTGlzdCk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgY29tbWFuZC5zZXRWYWx1ZShuZXdOYW1lKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICBhZGRlZENvbXBvbmVudCA9IGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKTsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYWRkZWRDb21wb25lbnQpOwotICAgICAgc2VsZWN0QWRkZWRDb21wb25lbnQoYWRhcHRlcik7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVFbmFibGVkKCkgewotCQkKLQkJYm9vbGVhbiBwYXJlbnRSZXN1bHQgPSBzdXBlci5jYWxjdWxhdGVFbmFibGVkKCk7Ci0JCWJvb2xlYW4gZW5kUmVzdWx0ID0gdHJ1ZTsKLQkJT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpCi0JCXsKLQkJCVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKChYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyKSBzZWxlY3Rpb24pLmdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotCQkJWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGUgPSBkZWZpbml0aW9uLmdldEJhc2VUeXBlKCk7Ci0JCQlpZiAoYmFzZVR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLQkJCQllbmRSZXN1bHQgPSBmYWxzZTsKLQkJfQotCQllbmRSZXN1bHQgPSBlbmRSZXN1bHQgJiBwYXJlbnRSZXN1bHQ7Ci0JCXJldHVybiBlbmRSZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RNb2RlbEdyb3VwQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRE1vZGVsR3JvdXBBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmYjQ2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRE1vZGVsR3JvdXBBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNETW9kZWxHcm91cENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNETW9kZWxHcm91cEFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VRVUVOQ0VfSUQgPSAiQWRkWFNEU2VxdWVuY2VNb2RlbEdyb3VwQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBDSE9JQ0VfSUQgPSAiQWRkWFNEQ2hvaWNlTW9kZWxHcm91cEFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUxMX0lEID0gIkFkZFhTREFsbE1vZGVsR3JvdXBBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIFhTRENvbXBvc2l0b3IgeHNkQ29tcG9zaXRvcjsKLQotICBwdWJsaWMgQWRkWFNETW9kZWxHcm91cEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0LCBYU0RDb21wb3NpdG9yIGNvbXBvc2l0b3IsIFN0cmluZyBJRCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQoZ2V0TGFiZWwoY29tcG9zaXRvcikpOwotICAgIHNldElkKElEKTsKLSAgICB0aGlzLnhzZENvbXBvc2l0b3IgPSBjb21wb3NpdG9yOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgKChYU0RCYXNlQWRhcHRlcikgc2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICAgIEFkZFhTRE1vZGVsR3JvdXBDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgICAgaWYgKHhzZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHhzZENvbXBvbmVudDsKLQotICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTRE1vZGVsR3JvdXBDb21tYW5kKGdldExhYmVsKHhzZENvbXBvc2l0b3IpLCB4c2RFbGVtZW50RGVjbGFyYXRpb24sIHhzZENvbXBvc2l0b3IpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoeHNkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgIHsKLSAgICAgICAgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXApIHhzZENvbXBvbmVudDsKLQotICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTRE1vZGVsR3JvdXBDb21tYW5kKGdldExhYmVsKHhzZENvbXBvc2l0b3IpLCB4c2RNb2RlbEdyb3VwLCB4c2RDb21wb3NpdG9yKTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHhzZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbgotICAgICAgICAgICAgICAgfHwgeHNkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNETW9kZWxHcm91cENvbW1hbmQoZ2V0TGFiZWwoeHNkQ29tcG9zaXRvciksIHhzZENvbXBvbmVudCwgeHNkQ29tcG9zaXRvcik7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICB9Ci0gICAgIAotICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCkpOwotICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgICAgICAgIHByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihhZGFwdGVyKSk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRMYWJlbChYU0RDb21wb3NpdG9yIGNvbXBvc2l0b3IpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfU0VRVUVOQ0UiKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChjb21wb3NpdG9yICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGNvbXBvc2l0b3IgPT0gWFNEQ29tcG9zaXRvci5DSE9JQ0VfTElURVJBTCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQ0hPSUNFIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbXBvc2l0b3IgPT0gWFNEQ29tcG9zaXRvci5BTExfTElURVJBTCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQUxMIik7Ly8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OWEzNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIEFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTEdST1VQREVGSU5JVElPTl9JRCA9ICJBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxHUk9VUERFRklOSVRJT05SRUZfSUQgPSAiQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25SZWZBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIGJvb2xlYW4gaXNSZWZlcmVuY2U7Ci0KLSAgcHVibGljIEFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQsIGJvb2xlYW4gaXNSZWZlcmVuY2UpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICB0aGlzLmlzUmVmZXJlbmNlID0gaXNSZWZlcmVuY2U7Ci0gICAgaWYgKGlzUmVmZXJlbmNlKQotICAgIHsKLSAgICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfR1JPVVBfUkVGKTsKLSAgICAgIHNldElkKE1PREVMR1JPVVBERUZJTklUSU9OX0lEKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfR1JPVVApOwotICAgICAgc2V0SWQoTU9ERUxHUk9VUERFRklOSVRJT05SRUZfSUQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbmNyZXRlQ29tcG9uZW50ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgewotICAgICAgeHNkQ29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgfQotICAgIGlmICh4c2RDb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIEFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQ29tbWFuZChnZXRUZXh0KCksIHhzZENvbmNyZXRlQ29tcG9uZW50LCBpc1JlZmVyZW5jZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCi0gICAgICBhZGRlZENvbXBvbmVudCA9IGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKTsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYWRkZWRDb21wb25lbnQpOwotICAgICAgc2VsZWN0QWRkZWRDb21wb25lbnQoYWRhcHRlcik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRFJlZGVmaW5hYmxlQ29udGVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RSZWRlZmluYWJsZUNvbnRlbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4YzE5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRFJlZGVmaW5hYmxlQ29udGVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkUmVkZWZpbmVkQ29tcG9uZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluYWJsZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFkZFhTRFJlZGVmaW5hYmxlQ29udGVudEFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIEFkZFhTRFJlZGVmaW5hYmxlQ29udGVudEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0LCBTdHJpbmcgSUQsIFN0cmluZyB0ZXh0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dCh0ZXh0KTsKLSAgICBzZXRJZChJRCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpc2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgewotICAgICAgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbigpOwotICAgICAgY29uZmlndXJhdGlvbi5zZXREZXNjcmlwdGlvblByb3ZpZGVyKG5ldyBSZWRlZmluZURlc2NyaXB0b3IoKSk7Ci0gICAgICBjb25maWd1cmF0aW9uLnNldFNlYXJjaExpc3RQcm92aWRlcihuZXcgUmVkZWZpbmVTZWFyY2hMaXN0UHJvdmlkZXIoKFhTRFJlZGVmaW5lKXNlbGVjdGlvbiwgdGhpcykpOwotICAgICAgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyBkaWFsb2cgPSBuZXcgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyhEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCBNZXNzYWdlcy5fVUlfTEFCRUxfUkVERUZJTkVfQ09NUE9ORU5ULCBjb25maWd1cmF0aW9uKQotICAgICAgewotICAgICAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBBZGp1c3QgdGhlIGRpYWxvZydzIGluaXRpYWwgc2l6ZS4KLSAgICAgICAgICAKLSAgICAgICAgICBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKW1haW5Db21wb3NpdGUuZ2V0TGF5b3V0RGF0YSgpOwotICAgICAgICAgIGdyaWREYXRhLmhlaWdodEhpbnQgPSA1MDA7Ci0gICAgICAgICAgZ3JpZERhdGEud2lkdGhIaW50ID0gMzUwOwotICAgICAgICAgIHJldHVybiBtYWluQ29tcG9zaXRlOwotICAgICAgICB9Ci0gICAgICB9OwotICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgICAgaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0KLSAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotICAgICAgewotICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNlbGVjdGVkQ29tcG9uZW50ID0gZGlhbG9nLmdldFNlbGVjdGVkQ29tcG9uZW50KCk7Ci0gICAgICAgIGJ1aWxkUmVkZWZpbmUoKFhTRFJlZGVmaW5lKXNlbGVjdGlvbiwgc2VsZWN0ZWRDb21wb25lbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBBZGRSZWRlZmluZWRDb21wb25lbnRDb21tYW5kIGdldENvbW1hbmQoWFNEUmVkZWZpbmUgcmVkZWZpbmUsIFhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IHJlZGVmaW5hYmxlQ29tcG9uZW50KTsKLSAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGJ1aWxkQ29tcG9uZW50c0xpc3QoWFNEUmVkZWZpbmUgeHNkUmVkZWZpbmUsIFNldCByZWRlZmluZWRDb21wb25lbnRzTmFtZXMsIElDb21wb25lbnRMaXN0IGNvbXBvbmVudExpc3QpOwotICAKLSAgcHJvdGVjdGVkIHZvaWQgYnVpbGRSZWRlZmluZShYU0RSZWRlZmluZSByZWRlZmluZSwgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzZWxlY3RlZENvbXBvbmVudCkKLSAgewotICAgIFhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IHJlZGVmaW5hYmxlQ29tcG9uZW50ID0gKFhTRFJlZGVmaW5hYmxlQ29tcG9uZW50KXNlbGVjdGVkQ29tcG9uZW50LmdldE9iamVjdCgpOwotICAgIEFkZFJlZGVmaW5lZENvbXBvbmVudENvbW1hbmQgY29tbWFuZCA9IGdldENvbW1hbmQocmVkZWZpbmUsIHJlZGVmaW5hYmxlQ29tcG9uZW50KTsKLSAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIGFkZGVkQ29tcG9uZW50ID0gY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpOwotICB9Ci0KLSAgY2xhc3MgUmVkZWZpbmVTZWFyY2hMaXN0UHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyCi0gIHsKLSAgICBYU0RSZWRlZmluZSB4c2RSZWRlZmluZTsKLSAgICBBZGRYU0RSZWRlZmluYWJsZUNvbnRlbnRBY3Rpb24gYWN0aW9uOyAgICAKLSAgICAKLSAgICBwdWJsaWMgUmVkZWZpbmVTZWFyY2hMaXN0UHJvdmlkZXIoWFNEUmVkZWZpbmUgeHNkUmVkZWZpbmUsIEFkZFhTRFJlZGVmaW5hYmxlQ29udGVudEFjdGlvbiBhY3Rpb24pCi0gICAgewotICAgICAgdGhpcy54c2RSZWRlZmluZSA9IHhzZFJlZGVmaW5lOwotICAgICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247Ci0gICAgfQotCi0gICAgLy8gU2hvdWxkIHJlZmFjdG9yIHRoaXMgdG8gaGF2ZSBhIHNlcGFyYXRlIHN1YmNsYXNzIGZvciBlYWNoIHR5cGUgb2YgcmVkZWZpbmUuCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVDb21wb25lbnRMaXN0KElDb21wb25lbnRMaXN0IGxpc3QsIFNlYXJjaFNjb3BlIHNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yIHBtKQotICAgIHsgICAgICAKLSAgICAgIExpc3QgY3VycmVudFJlZGVmaW5lcyA9IHhzZFJlZGVmaW5lLmdldENvbnRlbnRzKCk7Ci0gICAgICBTZXQgcmVkZWZpbmVkQ29tcG9uZW50c05hbWVzID0gbmV3IEhhc2hTZXQoY3VycmVudFJlZGVmaW5lcy5zaXplKCkpOwotICAgICAgSXRlcmF0b3IgcmVkZWZpbmVzSXRlcmF0b3IgPSBjdXJyZW50UmVkZWZpbmVzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAocmVkZWZpbmVzSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBYU0RSZWRlZmluYWJsZUNvbXBvbmVudCBjb21wb25lbnQgPSAoWFNEUmVkZWZpbmFibGVDb21wb25lbnQpcmVkZWZpbmVzSXRlcmF0b3IubmV4dCgpOwotICAgICAgICBTdHJpbmcgcmVkZWZpbmVkQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgICAgIHJlZGVmaW5lZENvbXBvbmVudHNOYW1lcy5hZGQocmVkZWZpbmVkQ29tcG9uZW50TmFtZSk7Ci0gICAgICB9Ci0gICAgICBhY3Rpb24uYnVpbGRDb21wb25lbnRzTGlzdCh4c2RSZWRlZmluZSwgcmVkZWZpbmVkQ29tcG9uZW50c05hbWVzLCBsaXN0KTsgICAgICAKLSAgICB9Ci0gIH0KLQotICBjbGFzcyBSZWRlZmluZURlc2NyaXB0b3IgaW1wbGVtZW50cyBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcgotICB7Ci0gICAgcHVibGljIElGaWxlIGdldEZpbGUoT2JqZWN0IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICB7Ci0gICAgCWlmICgoKFhTRE5hbWVkQ29tcG9uZW50KWNvbXBvbmVudCkuZ2V0U2NoZW1hKCkgPT0gbnVsbCkKLSAgICAJewotICAgIAkgIHJldHVybiBudWxsOwotICAgIAl9Ci0gICAgICAgIFN0cmluZyBsb2NhdGlvbiA9ICgoWFNETmFtZWRDb21wb25lbnQpY29tcG9uZW50KS5nZXRTY2hlbWEoKS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgICAgICBTdHJpbmcgcGxhdGZvcm1SZXNvdXJjZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsICYmIGxvY2F0aW9uLnN0YXJ0c1dpdGgocGxhdGZvcm1SZXNvdXJjZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBQYXRoIHBhdGggPSBuZXcgUGF0aChsb2NhdGlvbi5zdWJzdHJpbmcocGxhdGZvcm1SZXNvdXJjZS5sZW5ndGgoKSkpOwotICAgICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBJbWFnZSBnZXRGaWxlSWNvbihPYmplY3QgY29tcG9uZW50KQotICAgIHsKLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREZpbGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBYU0RSZWRlZmluZUNvbXBvbmVudHNMYWJlbFByb3ZpZGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKE9iamVjdCBjb21wb25lbnQpCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgewotICAgICAgICByZXR1cm4gKChYU0ROYW1lZENvbXBvbmVudCljb21wb25lbnQpLmdldE5hbWUoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllcihPYmplY3QgY29tcG9uZW50KQotICAgIHsKLSAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICgoWFNETmFtZWRDb21wb25lbnQpY29tcG9uZW50KS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGUoT2JqZWN0IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBJbWFnZSBnZXRSZWRlZmluZWRDb21wb25lbnRJbWFnZSgpOwotICAKLSAgY2xhc3MgWFNEUmVkZWZpbmVDb21wb25lbnRzTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyCi0gIHsKLQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICBJbWFnZSBpbWFnZSA9IGdldFJlZGVmaW5lZENvbXBvbmVudEltYWdlKCk7Ci0gICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoKFhTRE5hbWVkQ29tcG9uZW50KWVsZW1lbnQpLmdldE5hbWUoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEUmVkZWZpbmVkQXR0cmlidXRlR3JvdXBBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEUmVkZWZpbmVkQXR0cmlidXRlR3JvdXBBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1YjBlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRFJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklDb21wb25lbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFJlZGVmaW5lZENvbXBvbmVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuUmVkZWZpbmVBdHRyaWJ1dGVHcm91cENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLQotCi1wdWJsaWMgY2xhc3MgQWRkWFNEUmVkZWZpbmVkQXR0cmlidXRlR3JvdXBBY3Rpb24gZXh0ZW5kcyBBZGRYU0RSZWRlZmluYWJsZUNvbnRlbnRBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5hY3Rpb25zLlJlZGVmaW5lQXR0cmlidXRlR3JvdXAiOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIEFkZFhTRFJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0LCBJRCwgTWVzc2FnZXMuX1VJX0FDVElPTl9SRURFRklORV9BVFRSSUJVVEVfR1JPVVApOwotICB9Ci0KLSAgcHJvdGVjdGVkIEFkZFJlZGVmaW5lZENvbXBvbmVudENvbW1hbmQgZ2V0Q29tbWFuZChYU0RSZWRlZmluZSByZWRlZmluZSwgWFNEUmVkZWZpbmFibGVDb21wb25lbnQgcmVkZWZpbmFibGVDb21wb25lbnQpCi0gIHsKLSAgICBBZGRSZWRlZmluZWRDb21wb25lbnRDb21tYW5kIGNvbW1hbmQgPSBuZXcgUmVkZWZpbmVBdHRyaWJ1dGVHcm91cENvbW1hbmQoCi0gICAgICBNZXNzYWdlcy5fVUlfQUNUSU9OX1JFREVGSU5FX0FUVFJJQlVURV9HUk9VUCwKLSAgICAgIHJlZGVmaW5lLAotICAgICAgcmVkZWZpbmFibGVDb21wb25lbnQpOwotICAgIHJldHVybiBjb21tYW5kOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYnVpbGRDb21wb25lbnRzTGlzdChYU0RSZWRlZmluZSB4c2RSZWRlZmluZSwgU2V0IHJlZGVmaW5lZENvbXBvbmVudHNOYW1lcywgSUNvbXBvbmVudExpc3QgY29tcG9uZW50TGlzdCkKLSAgewotICAgIExpc3QgYXR0cmlidXRlR3JvdXBzID0geHNkUmVkZWZpbmUuZ2V0SW5jb3Jwb3JhdGVkU2NoZW1hKCkuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpOwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXR0cmlidXRlR3JvdXBzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbilpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBTdHJpbmcgYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uTmFtZSA9IGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5nZXROYW1lKCk7Ci0gICAgICBpZiAoIXJlZGVmaW5lZENvbXBvbmVudHNOYW1lcy5jb250YWlucyhhdHRyaWJ1dGVHcm91cERlZmluaXRpb25OYW1lKSkKLSAgICAgIHsKLSAgICAgICAgY29tcG9uZW50TGlzdC5hZGQoYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJbWFnZSBnZXRSZWRlZmluZWRDb21wb25lbnRJbWFnZSgpCi0gIHsKLSAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKE1lc3NhZ2VzLl9VSV9JTUFHRV9BVFRSSUJVVEVfR1JPVVApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRFJlZGVmaW5lZENvbXBsZXhUeXBlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRFJlZGVmaW5lZENvbXBsZXhUeXBlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMWQ1YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RSZWRlZmluZWRDb21wbGV4VHlwZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRSZWRlZmluZWRDb21wb25lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlJlZGVmaW5lQ29tcGxleFR5cGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluYWJsZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRYU0RSZWRlZmluZWRDb21wbGV4VHlwZUFjdGlvbiBleHRlbmRzIEFkZFhTRFJlZGVmaW5hYmxlQ29udGVudEFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmFjdGlvbnMuUmVkZWZpbmVDb21wbGV4VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgQWRkWFNEUmVkZWZpbmVkQ29tcGxleFR5cGVBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQsIElELCBNZXNzYWdlcy5fVUlfQUNUSU9OX1JFREVGSU5FX0NPTVBMRVhfVFlQRSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQWRkUmVkZWZpbmVkQ29tcG9uZW50Q29tbWFuZCBnZXRDb21tYW5kKFhTRFJlZGVmaW5lIHJlZGVmaW5lLCBYU0RSZWRlZmluYWJsZUNvbXBvbmVudCByZWRlZmluYWJsZUNvbXBvbmVudCkKLSAgewotICAgIEFkZFJlZGVmaW5lZENvbXBvbmVudENvbW1hbmQgY29tbWFuZCA9IG5ldyBSZWRlZmluZUNvbXBsZXhUeXBlQ29tbWFuZCgKLSAgICAgIE1lc3NhZ2VzLl9VSV9BQ1RJT05fUkVERUZJTkVfQ09NUExFWF9UWVBFLAotICAgICAgcmVkZWZpbmUsCi0gICAgICByZWRlZmluYWJsZUNvbXBvbmVudCk7Ci0gICAgcmV0dXJuIGNvbW1hbmQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBidWlsZENvbXBvbmVudHNMaXN0KFhTRFJlZGVmaW5lIHhzZFJlZGVmaW5lLCBTZXQgcmVkZWZpbmVkQ29tcG9uZW50c05hbWVzLCBJQ29tcG9uZW50TGlzdCBjb21wb25lbnRMaXN0KQotICB7Ci0gICAgTGlzdCB0eXBlRGVmaW5pdGlvbnMgPSB4c2RSZWRlZmluZS5nZXRJbmNvcnBvcmF0ZWRTY2hlbWEoKS5nZXRUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHR5cGVEZWZpbml0aW9ucy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gPSAoWFNEVHlwZURlZmluaXRpb24paXRlcmF0b3IubmV4dCgpOwotICAgICAgU3RyaW5nIHR5cGVEZWZpbml0aW9uTmFtZSA9IHR5cGVEZWZpbml0aW9uLmdldE5hbWUoKTsKLSAgICAgIGlmICh0eXBlRGVmaW5pdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiAmJiAhcmVkZWZpbmVkQ29tcG9uZW50c05hbWVzLmNvbnRhaW5zKHR5cGVEZWZpbml0aW9uTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGNvbXBvbmVudExpc3QuYWRkKHR5cGVEZWZpbml0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJbWFnZSBnZXRSZWRlZmluZWRDb21wb25lbnRJbWFnZSgpCi0gIHsKLSAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKE1lc3NhZ2VzLl9VSV9JTUFHRV9DT01QTEVYX1RZUEUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRFJlZGVmaW5lZE1vZGVsR3JvdXBBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEUmVkZWZpbmVkTW9kZWxHcm91cEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzgzOWE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEUmVkZWZpbmVkTW9kZWxHcm91cEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRSZWRlZmluZWRDb21wb25lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlJlZGVmaW5lTW9kZWxHcm91cENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmFibGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRYU0RSZWRlZmluZWRNb2RlbEdyb3VwQWN0aW9uIGV4dGVuZHMgQWRkWFNEUmVkZWZpbmFibGVDb250ZW50QWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuYWN0aW9ucy5SZWRlZmluZU1vZGVsR3JvdXAiOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIEFkZFhTRFJlZGVmaW5lZE1vZGVsR3JvdXBBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQsIElELCBNZXNzYWdlcy5fVUlfQUNUSU9OX1JFREVGSU5FX01PREVMX0dST1VQKTsKLSAgfQotCi0gIHByb3RlY3RlZCBBZGRSZWRlZmluZWRDb21wb25lbnRDb21tYW5kIGdldENvbW1hbmQoWFNEUmVkZWZpbmUgcmVkZWZpbmUsIFhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IHJlZGVmaW5hYmxlQ29tcG9uZW50KQotICB7Ci0gICAgQWRkUmVkZWZpbmVkQ29tcG9uZW50Q29tbWFuZCBjb21tYW5kID0gbmV3IFJlZGVmaW5lTW9kZWxHcm91cENvbW1hbmQoCi0gICAgICBNZXNzYWdlcy5fVUlfQUNUSU9OX1JFREVGSU5FX01PREVMX0dST1VQLAotICAgICAgcmVkZWZpbmUsCi0gICAgICByZWRlZmluYWJsZUNvbXBvbmVudCk7Ci0gICAgcmV0dXJuIGNvbW1hbmQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBidWlsZENvbXBvbmVudHNMaXN0KFhTRFJlZGVmaW5lIHhzZFJlZGVmaW5lLCBTZXQgcmVkZWZpbmVkQ29tcG9uZW50c05hbWVzLCBJQ29tcG9uZW50TGlzdCBjb21wb25lbnRMaXN0KQotICB7Ci0gICAgTGlzdCBtb2RlbEdyb3VwTGlzdCA9IHhzZFJlZGVmaW5lLmdldEluY29ycG9yYXRlZFNjaGVtYSgpLmdldE1vZGVsR3JvdXBEZWZpbml0aW9ucygpOwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kZWxHcm91cExpc3QuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWZpbml0aW9uID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIFN0cmluZyBtb2RlbEdyb3VwRGVmaW5pdGlvbk5hbWUgPSBtb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXROYW1lKCk7Ci0gICAgICBpZiAoIXJlZGVmaW5lZENvbXBvbmVudHNOYW1lcy5jb250YWlucyhtb2RlbEdyb3VwRGVmaW5pdGlvbk5hbWUpKQotICAgICAgewotICAgICAgICBjb21wb25lbnRMaXN0LmFkZChtb2RlbEdyb3VwRGVmaW5pdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0UmVkZWZpbmVkQ29tcG9uZW50SW1hZ2UoKQotICB7Ci0gICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZShNZXNzYWdlcy5fVUlfSU1BR0VfTU9ERUxfR1JPVVApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRFJlZGVmaW5lZFNpbXBsZVR5cGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEUmVkZWZpbmVkU2ltcGxlVHlwZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDg2MDUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEUmVkZWZpbmVkU2ltcGxlVHlwZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRSZWRlZmluZWRDb21wb25lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlJlZGVmaW5lU2ltcGxlVHlwZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluYWJsZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQWRkWFNEUmVkZWZpbmVkU2ltcGxlVHlwZUFjdGlvbiBleHRlbmRzIEFkZFhTRFJlZGVmaW5hYmxlQ29udGVudEFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmFjdGlvbnMuUmVkZWZpbmVTaW1wbGVUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBBZGRYU0RSZWRlZmluZWRTaW1wbGVUeXBlQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0LCBJRCwgTWVzc2FnZXMuX1VJX0FDVElPTl9SRURFRklORV9TSU1QTEVfVFlQRSk7Ci0gIH0KLQotICBwdWJsaWMgQWRkUmVkZWZpbmVkQ29tcG9uZW50Q29tbWFuZCBnZXRDb21tYW5kKFhTRFJlZGVmaW5lIHJlZGVmaW5lLCBYU0RSZWRlZmluYWJsZUNvbXBvbmVudCByZWRlZmluYWJsZUNvbXBvbmVudCkKLSAgewotICAgIEFkZFJlZGVmaW5lZENvbXBvbmVudENvbW1hbmQgY29tbWFuZCA9IG5ldyBSZWRlZmluZVNpbXBsZVR5cGVDb21tYW5kKAotICAgICAgTWVzc2FnZXMuX1VJX0FDVElPTl9SRURFRklORV9TSU1QTEVfVFlQRSwKLSAgICAgIHJlZGVmaW5lLAotICAgICAgcmVkZWZpbmFibGVDb21wb25lbnQpOwotICAgIHJldHVybiBjb21tYW5kOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYnVpbGRDb21wb25lbnRzTGlzdChYU0RSZWRlZmluZSB4c2RSZWRlZmluZSwgU2V0IHJlZGVmaW5lZENvbXBvbmVudHNOYW1lcywgSUNvbXBvbmVudExpc3QgY29tcG9uZW50TGlzdCkKLSAgewotICAgIExpc3QgdHlwZURlZmluaXRpb25zID0geHNkUmVkZWZpbmUuZ2V0SW5jb3Jwb3JhdGVkU2NoZW1hKCkuZ2V0VHlwZURlZmluaXRpb25zKCk7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSB0eXBlRGVmaW5pdGlvbnMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gKFhTRFR5cGVEZWZpbml0aW9uKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIFN0cmluZyB0eXBlRGVmaW5pdGlvbk5hbWUgPSB0eXBlRGVmaW5pdGlvbi5nZXROYW1lKCk7Ci0gICAgICBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiAmJiAhcmVkZWZpbmVkQ29tcG9uZW50c05hbWVzLmNvbnRhaW5zKHR5cGVEZWZpbml0aW9uTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGNvbXBvbmVudExpc3QuYWRkKHR5cGVEZWZpbml0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotICAKLSAgcHJvdGVjdGVkIEltYWdlIGdldFJlZGVmaW5lZENvbXBvbmVudEltYWdlKCkKLSAgewotICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoTWVzc2FnZXMuX1VJX0lNQUdFX1NJTVBMRV9UWVBFKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjRmMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREltcG9ydENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNESW5jbHVkZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNEUmVkZWZpbmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkJhc2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc1NjaGVtYUxvY2F0aW9uVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5DTFVERV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREluY2x1ZGVBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElNUE9SVF9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREltcG9ydEFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVERUZJTkVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RSZWRlZmluZUFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgU3RyaW5nIGxhYmVsOwotICAKLSAgcHVibGljIEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0LCBTdHJpbmcgSUQsIFN0cmluZyBsYWJlbCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQobGFiZWwpOwotICAgIHNldElkKElEKTsKLSAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBzZWxlY3Rpb24gPSAoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgIH0KLQotICAgIEJhc2VDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgewotICAgICAgaWYgKElOQ0xVREVfSUQuZXF1YWxzKGdldElkKCkpKQotICAgICAgewotICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTREluY2x1ZGVDb21tYW5kKGxhYmVsLCAoWFNEU2NoZW1hKSBzZWxlY3Rpb24pOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoSU1QT1JUX0lELmVxdWFscyhnZXRJZCgpKSkKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RJbXBvcnRDb21tYW5kKGxhYmVsLCAoWFNEU2NoZW1hKSBzZWxlY3Rpb24pOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUkVERUZJTkVfSUQuZXF1YWxzKGdldElkKCkpKQotICAgICAgewotICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTRFJlZGVmaW5lQ29tbWFuZChsYWJlbCwgKFhTRFNjaGVtYSkgc2VsZWN0aW9uKTsKLSAgICAgIH0KLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotCi0gICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKSk7Ci0gICAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgICAgewotICAgIAkgIHByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihhZGFwdGVyKSk7Ci0gICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgb3BlbiB0aGUgc2NoZW1hIGxvY2F0aW9uIGRpYWxvZyBpZiB0aGUgcHJlZmVyZW5jZSBpcyBlbmFibGVkCi0gICAgICAgIGlmKFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QXV0b21hdGljYWxseU9wZW5TY2hlbWFMb2NhdGlvbkRpYWxvZ1NldHRpbmcoKSkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIgeHNkU2NoZW1hRGlyZWN0aXZlQWRhcHRlciA9IG51bGw7Ci0gICAgICAgICAgaWYoYWRhcHRlciBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgeHNkU2NoZW1hRGlyZWN0aXZlQWRhcHRlciA9IChYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyKWFkYXB0ZXI7Ci0gICAgICAgICAgfSAgICAJICAKLSAgICAgICAgICBYU0REaXJlY3RpdmVzU2NoZW1hTG9jYXRpb25VcGRhdGVyLnVwZGF0ZVNjaGVtYUxvY2F0aW9uKChYU0RTY2hlbWEpIHNlbGVjdGlvbiwgeHNkU2NoZW1hRGlyZWN0aXZlQWRhcHRlci5nZXRUYXJnZXQoKSwgCi0gICAgICAgICAgICAJCShjb21tYW5kIGluc3RhbmNlb2YgQWRkWFNESW5jbHVkZUNvbW1hbmQgfHwgY29tbWFuZCBpbnN0YW5jZW9mIEFkZFhTRFJlZGVmaW5lQ29tbWFuZCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRoZSBncmFwaGljYWwgdmlldyBtYXkgZGVzZWxlY3QsIHNvIHNlbGVjdCBhZ2FpbgotICAgICAgICBwcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYWRhcHRlcikpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzdjZDczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25BY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9TSU1QTEVfVFlQRSk7Ci0gICAgc2V0SWQoSUQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgewotICAgICAgc2VsZWN0aW9uID0gKChYU0RCYXNlQWRhcHRlcikgc2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsKLSAgICAgIEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9TSU1QTEVfVFlQRSwgKFhTRFNjaGVtYSkgc2VsZWN0aW9uKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAKLSAgICAgIGFkZGVkQ29tcG9uZW50ID0gY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpOwotICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChhZGRlZENvbXBvbmVudCk7Ci0gICAgICBzZWxlY3RBZGRlZENvbXBvbmVudChhZGFwdGVyKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9EZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9EZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmZlNDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvRGVsZXRlWFNEQ29uY3JldGVDb21wb25lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5EZWxldGVBY3Rpb24KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX1hTRF9DT01QT05FTlRfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5EZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbiI7ICAgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBEZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0RFTEVURSk7Ci0gICAgc2V0SWQoREVMRVRFX1hTRF9DT01QT05FTlRfSUQpOwotICAgIHNldEltYWdlRGVzY3JpcHRvcihYU0RFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9kZWxldGVfb2JqLmdpZiIpICk7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBzZWxlY3Rpb24gPSBpLm5leHQoKTsKLSAgICAgIGJvb2xlYW4gZG9SZXNlbGVjdCA9IGZhbHNlOwotICAgICAgCi0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSBzZWxlY3Rpb247Ci0gICAgICAgIFhTRFNjaGVtYSBtb2RlbCA9IHhzZENvbXBvbmVudC5nZXRTY2hlbWEoKTsKLSAgICAgICAgCi0gICAgICAgIGRvUmVzZWxlY3QgPSB4c2RDb21wb25lbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hOwotICAgICAgICAKLSAgICAgICAgRGVsZXRlQ29tbWFuZCBjb21tYW5kID0gbmV3IERlbGV0ZUNvbW1hbmQoZ2V0VGV4dCgpLCB4c2RDb21wb25lbnQpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICAKLSAgICAgICAgaWYgKG1vZGVsICE9IG51bGwgJiYgZG9SZXNlbGVjdCkKLSAgICAgICAgewotICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQobW9kZWwpOwotICAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgICAgICAgICBwcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYWRhcHRlcikpOwotICAgICAgICB9Ci0gICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9PcGVuSW5OZXdFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvT3BlbkluTmV3RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZmFkZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9PcGVuSW5OZXdFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5FRlM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuRmlsZVN0b3JlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuQURURmlsZVN0b3JlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RJbXBvcnRJbXBsOwotCi1wdWJsaWMgY2xhc3MgT3BlbkluTmV3RWRpdG9yIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJPcGVuSW5OZXdFZGl0b3IiOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIE9wZW5Jbk5ld0VkaXRvcihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX09QRU5fSU5fTkVXX0VESVRPUik7IC8vJE5PTi1OTFMtMSQKLSAgICBzZXRJZChJRCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVFbmFibGVkKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBudWxsOwotICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG51bGw7Ci0gICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgIHsKLSAgICAgIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgIGlmIChhY3RpdmVFZGl0b3IgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZWRpdG9ySW5wdXQgPSBhY3RpdmVFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICAKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgewotICAgICAgWFNEQmFzZUFkYXB0ZXIgeHNkQWRhcHRlciA9IChYU0RCYXNlQWRhcHRlcikgc2VsZWN0aW9uOwotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgZkNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgeHNkQWRhcHRlci5nZXRUYXJnZXQoKTsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBmQ29tcG9uZW50LmdldFNjaGVtYSgpOwotICAgICAgCi0gICAgICBib29sZWFuIGlzUmVmZXJlbmNlID0gZmFsc2U7Ci0gICAgICBpZiAoZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREZlYXR1cmUpCi0gICAgICB7Ci0gICAgICAgIGlzUmVmZXJlbmNlID0gKChYU0RGZWF0dXJlKWZDb21wb25lbnQpLmlzRmVhdHVyZVJlZmVyZW5jZSgpOwotICAgICAgICBmQ29tcG9uZW50ID0gKChYU0RGZWF0dXJlKWZDb21wb25lbnQpLmdldFJlc29sdmVkRmVhdHVyZSgpOwotICAgICAgfQotCi0gICAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSBudWxsOwotICAgICAgSVBhdGggc2NoZW1hUGF0aCA9IG51bGw7Ci0gICAgICBJRmlsZSBzY2hlbWFGaWxlID0gbnVsbDsKLQotICAgICAgLy8gU3BlY2lhbCBjYXNlIGFueSBpbXBvcnRzL2luY2x1ZGVzCi0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hRGlyZWN0aXZlIGRpciA9IChYU0RTY2hlbWFEaXJlY3RpdmUpKChYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyKXNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgIC8vIGZvcmNlIGxvYWQgb2YgaW1wb3J0ZWQgc2NoZW1hCi0gICAgICAgIGlmIChkaXIgaW5zdGFuY2VvZiBYU0RJbXBvcnRJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgKChYU0RJbXBvcnRJbXBsKWRpcikuaW1wb3J0U2NoZW1hKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRpci5nZXRSZXNvbHZlZFNjaGVtYSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzY2hlbWFMb2NhdGlvbiA9IFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woZGlyLmdldFJlc29sdmVkU2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgICAgICAgc2NoZW1hUGF0aCA9IG5ldyBQYXRoKHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgICBzY2hlbWFGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHNjaGVtYVBhdGgpOwotICAgICAgICAgIHNjaGVtYSA9IGRpci5nZXRSZXNvbHZlZFNjaGVtYSgpOyAKLSAgICAgICAgICBmQ29tcG9uZW50ID0gZGlyLmdldFJlc29sdmVkU2NoZW1hKCk7Ci0gICAgICAgIH0KLSAgICAgIH0gLy8gSGFuZGxlIGFueSBvdGhlciBleHRlcm5hbCBjb21wb25lbnRzCi0gICAgICBlbHNlIGlmIChmQ29tcG9uZW50LmdldFNjaGVtYSgpICE9IG51bGwgJiYgZkNvbXBvbmVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWEgfHwKLSAgICAgICAgICBmQ29tcG9uZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lIHx8IGlzUmVmZXJlbmNlKQotICAgICAgewotICAgICAgICBzY2hlbWFMb2NhdGlvbiA9IFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woZkNvbXBvbmVudC5nZXRTY2hlbWEoKS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLSAgICAgICAgc2NoZW1hUGF0aCA9IG5ldyBQYXRoKHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgc2NoZW1hRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShzY2hlbWFQYXRoKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IChYU0RTY2hlbWEpZ2V0V29ya2JlbmNoUGFydCgpLmdldEFkYXB0ZXIoWFNEU2NoZW1hLmNsYXNzKTsKLSAgICAgICAgICBpZiAoZkNvbXBvbmVudC5nZXRTY2hlbWEoKSA9PSB4c2RTY2hlbWEpCi0gICAgICAgICAgewotICAgICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgICAgaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgZWRpdG9yUGFydCkub3Blbk9uR2xvYmFsUmVmZXJlbmNlKGZDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICAvLyBJZiB0aGUgc2NoZW1hRmlsZSBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZQotICAgICAgaWYgKHBhZ2UgIT0gbnVsbCAmJiBzY2hlbWFGaWxlICE9IG51bGwgJiYgc2NoZW1hRmlsZS5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgZWRpdG9yJ3Mgc2NoZW1hCi0gICAgICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IChYU0RTY2hlbWEpZ2V0V29ya2JlbmNoUGFydCgpLmdldEFkYXB0ZXIoWFNEU2NoZW1hLmNsYXNzKTsKLSAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gbnVsbDsKLSAgICAgICAgICAvLyBUaGlzIGZpcnN0IGNoZWNrIGlzIHRvIGVuc3VyZSB0aGF0IHRoZSBzY2hlbWEgaXMgYWN0dWFsbHkKLSAgICAgICAgICAvLyBkaWZmZXJlbnQgdGhhbiB0aGUgY3VycmVudCBvbmUgd2UgYXJlIGVkaXRpbmcgYWdhaW5zdCBpbiB0aGUgZWRpdG9yLCBhbmQgdGhhdCB3ZQotICAgICAgICAgIC8vIGFyZSBpbiB0aGUgc2FtZSByZXNvdXJjZSBmaWxlLi4uLmhlbmNlIG11bHRpcGxlIHNjaGVtYXMgaW4gdGhlIHNhbWUgZmlsZS4KLSAgICAgICAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwgJiYgZkNvbXBvbmVudC5nZXRSb290Q29udGFpbmVyKCkuZVJlc291cmNlKCkgPT0geHNkU2NoZW1hLmVSZXNvdXJjZSgpICYmIHhzZFNjaGVtYSAhPSBzY2hlbWEpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGVkaXRvck5hbWUgPSBudWxsOwotICAgICAgICAgICAgWFNERmlsZUVkaXRvcklucHV0IHhzZEZpbGVFZGl0b3JJbnB1dCA9IG5ldyBYU0RGaWxlRWRpdG9ySW5wdXQoc2NoZW1hRmlsZSwgZkNvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgICAvLyB3aWxsIHVzZSBGaWxlRWRpdG9ySW5wdXQncyBuYW1lIGlmIHN0aWxsIG51bGwKLSAgICAgICAgICAgIC8vIFRyeSB0byB1c2UgdGhlIHNhbWUgZWRpdG9yIG5hbWUgYXMgdGhlIGN1cnJlbnQgb25lCi0gICAgICAgICAgICBpZiAoZWRpdG9ySW5wdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZWRpdG9yTmFtZSA9IGVkaXRvcklucHV0LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgeHNkRmlsZUVkaXRvcklucHV0LnNldEVkaXRvck5hbWUoZWRpdG9yTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlZGl0b3JQYXJ0ID0gZ2V0RXhpc3RpbmdFZGl0b3JGb3JJbmxpbmVTY2hlbWEocGFnZSwgc2NoZW1hRmlsZSwgc2NoZW1hKTsKLSAgICAgICAgICAgIGlmIChlZGl0b3JQYXJ0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVkaXRvclBhcnQgPSBwYWdlLm9wZW5FZGl0b3IoeHNkRmlsZUVkaXRvcklucHV0LCBYU0RFZGl0b3JQbHVnaW4uRURJVE9SX0lELCB0cnVlLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVkaXRvclBhcnQgPSBwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChzY2hlbWFGaWxlKSwgWFNERWRpdG9yUGx1Z2luLkVESVRPUl9JRCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgICAgICAgewotICAgICAgICAgICAgKChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgZWRpdG9yUGFydCkub3Blbk9uR2xvYmFsUmVmZXJlbmNlKGZDb21wb25lbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBvcGVuIHRoZSB4c2QgZXh0ZXJuYWxseQotICAgICAgICBpZiAoc2NoZW1hTG9jYXRpb24gIT0gbnVsbCkKLSAgICAgICAgICBvcGVuRXh0ZXJuYWxGaWxlcyhwYWdlLCBzY2hlbWFMb2NhdGlvbiwgZkNvbXBvbmVudCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5YU0RFZGl0b3IoSUVkaXRvcklucHV0IGVkaXRvcklucHV0LCBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wb25lbnQpCi0gIHsKLSAgICBvcGVuWFNERWRpdG9yKGVkaXRvcklucHV0LCB4c2RDb21wb25lbnQuZ2V0U2NoZW1hKCksIHhzZENvbXBvbmVudCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlblhTREVkaXRvcihJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQsIFhTRFNjaGVtYSBzY2hlbWEsIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXBvbmVudCkKLSAgewotICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gbnVsbDsKLSAgICBpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpCi0gICAgewotICAgICAgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIHJlc291cmNlID0gc2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0gICAgCi0gICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0ICYmIHJlc291cmNlICE9IG51bGwgJiYgIXJlc291cmNlLnN0YXJ0c1dpdGgoImh0dHAiKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSBVUklIZWxwZXIucmVtb3ZlUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKHJlc291cmNlKTsKLSAgICAgIG9wZW5Xb3Jrc3BhY2VGaWxlKHBhZ2UsIHNjaGVtYUxvY2F0aW9uLCB4c2RDb21wb25lbnQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3BlbkV4dGVybmFsRmlsZXMocGFnZSwgcmVzb3VyY2UsIHhzZENvbXBvbmVudCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlbklubGluZVNjaGVtYShJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQsIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXBvbmVudCwgWFNEU2NoZW1hIHNjaGVtYSwgU3RyaW5nIGVkaXRvck5hbWUpCi0gIHsKLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IG51bGw7Ci0gICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgIHsKLSAgICAgIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNXb3Jrc3BhY2VGaWxlID0gZmFsc2U7Ci0gICAgCi0gICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gc2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0gICAgU3RyaW5nIHdvcmtzcGFjZUZpbGVMb2NhdGlvbiA9IFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woc2NoZW1hTG9jYXRpb24pOwotICAgIElQYXRoIHdvcmtzcGFjZUZpbGVQYXRoID0gbmV3IFBhdGgod29ya3NwYWNlRmlsZUxvY2F0aW9uKTsKLSAgICBJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHdvcmtzcGFjZUZpbGVQYXRoKTsKLSAgICAKLSAgICBpZiAocGFnZSAhPSBudWxsICYmIGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKQotICAgIHsKLSAgICAgIGlzV29ya3NwYWNlRmlsZSA9IHRydWU7ICAKLSAgICB9Ci0KLSAgICBpZiAoaXNXb3Jrc3BhY2VGaWxlKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gbnVsbDsKLSAgICAgICAgWFNERmlsZUVkaXRvcklucHV0IHhzZEZpbGVFZGl0b3JJbnB1dCA9IG5ldyBYU0RGaWxlRWRpdG9ySW5wdXQoZmlsZSwgc2NoZW1hKTsKLSAgICAgICAgeHNkRmlsZUVkaXRvcklucHV0LnNldEVkaXRvck5hbWUoZWRpdG9yTmFtZSk7Ci0gICAgICAgIElFZGl0b3JSZWZlcmVuY2VbXSByZWZzID0gcGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGludCBsZW5ndGggPSByZWZzLmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IHJlZnNbaV0uZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RGaWxlRWRpdG9ySW5wdXQpCi0gICAgICAgICAgewotICAgICAgICAgICAgSUZpbGUgYUZpbGUgPSAoKFhTREZpbGVFZGl0b3JJbnB1dCkgaW5wdXQpLmdldEZpbGUoKTsKLSAgICAgICAgICAgIGlmIChhRmlsZS5nZXRGdWxsUGF0aCgpLmVxdWFscyhmaWxlLmdldEZ1bGxQYXRoKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoKChYU0RGaWxlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRTY2hlbWEoKSA9PSBzY2hlbWEpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcmVmc1tpXS5nZXRFZGl0b3IodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcGFnZS5hY3RpdmF0ZShyZWZzW2ldLmdldFBhcnQodHJ1ZSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChlZGl0b3JQYXJ0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBlZGl0b3JQYXJ0ID0gcGFnZS5vcGVuRWRpdG9yKHhzZEZpbGVFZGl0b3JJbnB1dCwgWFNERWRpdG9yUGx1Z2luLkVESVRPUl9JRCwgdHJ1ZSwgMCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IgeHNkRWRpdG9yID0gKEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKSBlZGl0b3JQYXJ0OwotICAgICAgICAgIHhzZEVkaXRvci5vcGVuT25HbG9iYWxSZWZlcmVuY2UoeHNkQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChzY2hlbWFMb2NhdGlvbiAhPSBudWxsICYmICFzY2hlbWFMb2NhdGlvbi5zdGFydHNXaXRoKCJodHRwIikpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBmaWxlTG9jYXRpb24gPSBudWxsOwotICAgICAgICAvLyBUaGlzIGlzIHRvIHdvcmthcm91bmQgdGhlIGRpZmZlcmVuY2UgaW4gVVJJIHJlc29sdXRpb24uIE9uIGxpbnV4LCB0aGUgcmVzb2x2ZWQgbG9jYXRpb24gaXMKLSAgICAgICAgLy8gcGxhdGZvcm06L3Jlc291cmNlLyAgIE9uIFdpbmRvd3MsIGl0J3MgZmlsZTovLwotICAgICAgICAvLyAKLSAgICAgICAJaWYgKGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyID09ICcvJykKLSAgICAgIAl7Ci0gICAgICAgICAgZmlsZUxvY2F0aW9uID0gIi8iICsgVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAJfQotICAgIAkgIGVsc2UgLy8gV2luZG93cwotICAgICAgCXsKLSAgICAgICAgICBmaWxlTG9jYXRpb24gPSBVUklIZWxwZXIucmVtb3ZlUHJvdG9jb2woc2NoZW1hTG9jYXRpb24pOwotICAgICAgCX0KLSAgICAgICAgSVBhdGggc2NoZW1hUGF0aCA9IG5ldyBQYXRoKGZpbGVMb2NhdGlvbik7Ci0gICAgICAgIElGaWxlU3RvcmUgZmlsZVN0b3JlID0gRUZTLmdldExvY2FsRmlsZVN5c3RlbSgpLmdldFN0b3JlKHNjaGVtYVBhdGgpOwotICAgICAgICBpZiAoIWZpbGVTdG9yZS5mZXRjaEluZm8oKS5pc0RpcmVjdG9yeSgpICYmIGZpbGVTdG9yZS5mZXRjaEluZm8oKS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEFEVEZpbGVTdG9yZUVkaXRvcklucHV0IHhzZEZpbGVTdG9yZUVkaXRvcklucHV0ID0gbmV3IEFEVEZpbGVTdG9yZUVkaXRvcklucHV0KGZpbGVTdG9yZSwgc2NoZW1hKTsKLSAgICAgICAgICAgIHhzZEZpbGVTdG9yZUVkaXRvcklucHV0LnNldEVkaXRvck5hbWUoZWRpdG9yTmFtZSk7Ci0KLSAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBudWxsOwotICAgICAgICAgICAgSUVkaXRvclJlZmVyZW5jZVtdIHJlZnMgPSBwYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSByZWZzLmxlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IHJlZnNbaV0uZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgQURURmlsZVN0b3JlRWRpdG9ySW5wdXQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVUkkgdXJpID0gKChBRFRGaWxlU3RvcmVFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFVSSSgpOwotICAgICAgICAgICAgICAgIGlmICh1cmkuZXF1YWxzKHhzZEZpbGVTdG9yZUVkaXRvcklucHV0LmdldFVSSSgpKSAmJiAoKEFEVEZpbGVTdG9yZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U2NoZW1hKCkgPT0geHNkRmlsZVN0b3JlRWRpdG9ySW5wdXQuZ2V0U2NoZW1hKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZWRpdG9yUGFydCA9IHJlZnNbaV0uZ2V0RWRpdG9yKHRydWUpOwotICAgICAgICAgICAgICAgICAgcGFnZS5hY3RpdmF0ZShyZWZzW2ldLmdldFBhcnQodHJ1ZSkpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYWdlICE9IG51bGwgJiYgZWRpdG9yUGFydCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcGFnZS5vcGVuRWRpdG9yKHhzZEZpbGVTdG9yZUVkaXRvcklucHV0LCBYU0RFZGl0b3JQbHVnaW4uRURJVE9SX0lELCB0cnVlLCAwKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IgeHNkRWRpdG9yID0gKEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKSBlZGl0b3JQYXJ0OwotICAgICAgICAgICAgICB4c2RFZGl0b3Iub3Blbk9uR2xvYmFsUmVmZXJlbmNlKHhzZENvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0gICAgICAgICAgewotCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0gICAgICAgICAgSUVkaXRvclJlZmVyZW5jZVtdIHJlZnMgPSBwYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLSAgICAgICAgICBpbnQgbGVuZ3RoID0gcmVmcy5sZW5ndGg7Ci0gICAgICAgICAgLy8gTmVlZCB0byBmaW5kIGlmIGFuIGVkaXRvciBvbiB0aGF0IHNjaGVtYSBoYXMgYWxyZWFkeSBiZWVuIG9wZW5lZAotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gcmVmc1tpXS5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0IHhzZEZpbGVTdG9yYWdlRWRpdG9ySW5wdXQgPSAoQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQpIGlucHV0OwotICAgICAgICAgICAgICBpZiAoeHNkRmlsZVN0b3JhZ2VFZGl0b3JJbnB1dC5nZXRVcmxTdHJpbmcoKS5lcXVhbHMoc2NoZW1hTG9jYXRpb24pCi0gICAgICAgICAgICAgICAgICAmJiB4c2RGaWxlU3RvcmFnZUVkaXRvcklucHV0LmdldEVkaXRvcklEKCkuZXF1YWxzKFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZWRpdG9yUGFydCA9IHJlZnNbaV0uZ2V0RWRpdG9yKHRydWUpOwotICAgICAgICAgICAgICAgIHBhZ2UuYWN0aXZhdGUocmVmc1tpXS5nZXRQYXJ0KHRydWUpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZWRpdG9yUGFydCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0IHhzZEZpbGVTdG9yYWdlRWRpdG9ySW5wdXQgPSBuZXcgQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQoc2NoZW1hTG9jYXRpb24pOwotICAgICAgICAgICAgeHNkRmlsZVN0b3JhZ2VFZGl0b3JJbnB1dC5zZXRTY2hlbWEoc2NoZW1hKTsKLSAgICAgICAgICAgIHhzZEZpbGVTdG9yYWdlRWRpdG9ySW5wdXQuc2V0RWRpdG9yTmFtZShlZGl0b3JOYW1lKTsKLSAgICAgICAgICAgIHhzZEZpbGVTdG9yYWdlRWRpdG9ySW5wdXQuc2V0RWRpdG9ySUQoWFNERWRpdG9yUGx1Z2luLkVESVRPUl9JRCk7Ci0gICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcGFnZS5vcGVuRWRpdG9yKHhzZEZpbGVTdG9yYWdlRWRpdG9ySW5wdXQsIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQsIHRydWUsIDApOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgICAgICAgIHhzZEVkaXRvci5vcGVuT25HbG9iYWxSZWZlcmVuY2UoeHNkQ29tcG9uZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBJRWRpdG9yUGFydCBnZXRFeGlzdGluZ0VkaXRvckZvcklubGluZVNjaGVtYShJV29ya2JlbmNoUGFnZSBwYWdlLCBJRmlsZSBzY2hlbWFGaWxlLCBYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgSUVkaXRvclJlZmVyZW5jZSBbXSByZWZzID0gcGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0gICAgaW50IGxlbmd0aCA9IHJlZnMubGVuZ3RoOwotICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IHJlZnNbaV0uZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERmlsZUVkaXRvcklucHV0KQotICAgICAgICB7Ci0gICAgICAgICAgSUZpbGUgYUZpbGUgPSAoKFhTREZpbGVFZGl0b3JJbnB1dClpbnB1dCkuZ2V0RmlsZSgpOwotICAgICAgICAgIGlmIChhRmlsZS5nZXRGdWxsUGF0aCgpLmVxdWFscyhzY2hlbWFGaWxlLmdldEZ1bGxQYXRoKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoKFhTREZpbGVFZGl0b3JJbnB1dClpbnB1dCkuZ2V0U2NoZW1hKCkgPT0gc2NoZW1hKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcmVmc1tpXS5nZXRFZGl0b3IodHJ1ZSk7Ci0gICAgICAgICAgICAgIHBhZ2UuYWN0aXZhdGUocmVmc1tpXS5nZXRQYXJ0KHRydWUpKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIGVkaXRvclBhcnQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlbldvcmtzcGFjZUZpbGUoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgU3RyaW5nIHNjaGVtYUxvY2F0aW9uLCBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wb25lbnQpCi0gIHsKLSAgICBJUGF0aCBzY2hlbWFQYXRoID0gbmV3IFBhdGgoc2NoZW1hTG9jYXRpb24pOwotICAgIElGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoc2NoZW1hUGF0aCk7Ci0gICAgaWYgKHBhZ2UgIT0gbnVsbCAmJiBmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IElERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIHRydWUpOwotICAgICAgICBpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IgeHNkRWRpdG9yID0gKEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKSBlZGl0b3JQYXJ0OwotICAgICAgICAgIHhzZEVkaXRvci5vcGVuT25HbG9iYWxSZWZlcmVuY2UoeHNkQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkKLSAgICAgIHsKLQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuRXh0ZXJuYWxGaWxlcyhJV29ya2JlbmNoUGFnZSBwYWdlLCBTdHJpbmcgc2NoZW1hTG9jYXRpb24sIFhTRENvbmNyZXRlQ29tcG9uZW50IGZDb21wb25lbnQpCi0gIHsKLSAgICBpZiAoc2NoZW1hTG9jYXRpb24gPT0gbnVsbCkgcmV0dXJuOyAgLy8gQXNzZXJ0IG5vdCBudWxsCi0gIAotICAgIElQYXRoIHNjaGVtYVBhdGggPSBuZXcgUGF0aChzY2hlbWFMb2NhdGlvbik7Ci0vLyAgSW5pdGlhbGx5IHRyaWVkIHRvIHVzZSBzY2hlbWFQYXRoLmdldERldmljZSgpIHRvIGRldGVybWluZSBpZiBpdCBpcyBhbiBodHRwIHJlZmVyZW5jZS4gIEhvd2V2ZXIsIG9uIExpbnV4LCBpdCBpcyBudWxsLgotLy8gIFNvIGFzIGEgcmVzdWx0IG9mIGJ1ZyAyMjE0MjEsIHdlIHdpbGwganVzdCB1c2UgdGhlIHNjaGVtYUxvY2F0aW9uLgotICAgIGlmICghc2NoZW1hTG9jYXRpb24uc3RhcnRzV2l0aCgiaHR0cCIpKQotICAgIHsKLSAgICAgIHNjaGVtYVBhdGggPSBuZXcgUGF0aChVUklIZWxwZXIucmVtb3ZlUHJvdG9jb2woc2NoZW1hTG9jYXRpb24pKTsKLSAgICB9Ci0gICAgSUZpbGVTdG9yZSBmaWxlU3RvcmUgPSBFRlMuZ2V0TG9jYWxGaWxlU3lzdGVtKCkuZ2V0U3RvcmUoc2NoZW1hUGF0aCk7Ci0gICAgVVJJIHNjaGVtYVVSSSA9IFVSSS5jcmVhdGUoc2NoZW1hTG9jYXRpb24pOwotICAgIGlmICghZmlsZVN0b3JlLmZldGNoSW5mbygpLmlzRGlyZWN0b3J5KCkgJiYgZmlsZVN0b3JlLmZldGNoSW5mbygpLmV4aXN0cygpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gbnVsbDsKLSAgICAgICAgSUVkaXRvclJlZmVyZW5jZVtdIHJlZnMgPSBwYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLSAgICAgICAgaW50IGxlbmd0aCA9IHJlZnMubGVuZ3RoOwotICAgICAgICAvLyBOZWVkIHRvIGZpbmQgaWYgYW4gZWRpdG9yIG9uIHRoYXQgc2NoZW1hIGhhcyBhbHJlYWR5IGJlZW4gb3BlbmVkCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSByZWZzW2ldLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZVN0b3JlRWRpdG9ySW5wdXQpCi0gICAgICAgICAgewotICAgICAgICAgICAgVVJJIHVyaSA9ICgoRmlsZVN0b3JlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRVUkkoKTsKLSAgICAgICAgICAgIGlmICh1cmkuZXF1YWxzKHNjaGVtYVVSSSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVkaXRvclBhcnQgPSByZWZzW2ldLmdldEVkaXRvcih0cnVlKTsKLSAgICAgICAgICAgICAgcGFnZS5hY3RpdmF0ZShyZWZzW2ldLmdldFBhcnQodHJ1ZSkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVkaXRvclBhcnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGVkaXRvclBhcnQgPSBJREUub3BlbkVkaXRvck9uRmlsZVN0b3JlKHBhZ2UsIGZpbGVTdG9yZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikKLSAgICAgICAgewotICAgICAgICAgIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgICAgICB4c2RFZGl0b3Iub3Blbk9uR2xvYmFsUmVmZXJlbmNlKGZDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmIChzY2hlbWFMb2NhdGlvbi5zdGFydHNXaXRoKCJodHRwIikpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gbnVsbDsKLSAgICAgICAgICAgIElFZGl0b3JSZWZlcmVuY2VbXSByZWZzID0gcGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gcmVmcy5sZW5ndGg7Ci0gICAgICAgICAgICAvLyBOZWVkIHRvIGZpbmQgaWYgYW4gZWRpdG9yIG9uIHRoYXQgc2NoZW1hIGhhcyBhbHJlYWR5IGJlZW4gb3BlbmVkCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSByZWZzW2ldLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQgcmVhZE9ubHlFZGl0b3JJbnB1dCA9IChBRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWRPbmx5RWRpdG9ySW5wdXQuZ2V0VXJsU3RyaW5nKCkuZXF1YWxzKHNjaGVtYUxvY2F0aW9uKSAmJgotICAgICAgICAgICAgICAgICAgICBYU0RFZGl0b3JQbHVnaW4uRURJVE9SX0lELmVxdWFscyhyZWFkT25seUVkaXRvcklucHV0LmdldEVkaXRvcklEKCkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGVkaXRvclBhcnQgPSByZWZzW2ldLmdldEVkaXRvcih0cnVlKTsKLSAgICAgICAgICAgICAgICAgIHBhZ2UuYWN0aXZhdGUocmVmc1tpXS5nZXRQYXJ0KHRydWUpKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVkaXRvclBhcnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQgcmVhZE9ubHlTdG9yYWdlRWRpdG9ySW5wdXQgPSBuZXcgQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQoc2NoZW1hTG9jYXRpb24pOwotICAgICAgICAgICAgICByZWFkT25seVN0b3JhZ2VFZGl0b3JJbnB1dC5zZXRFZGl0b3JJRChYU0RFZGl0b3JQbHVnaW4uRURJVE9SX0lEKTsKLSAgICAgICAgICAgICAgZWRpdG9yUGFydCA9IHBhZ2Uub3BlbkVkaXRvcihyZWFkT25seVN0b3JhZ2VFZGl0b3JJbnB1dCwgWFNERWRpdG9yUGx1Z2luLkVESVRPUl9JRCwgdHJ1ZSwgMCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgICAgICAgICAgeHNkRWRpdG9yLm9wZW5Pbkdsb2JhbFJlZmVyZW5jZShmQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgRmlsZVN0b3JlRWRpdG9ySW5wdXQgeHNkRmlsZVN0b3JlRWRpdG9ySW5wdXQgPSBuZXcgRmlsZVN0b3JlRWRpdG9ySW5wdXQoZmlsZVN0b3JlKTsgICAgICAgIAotICAgICAgICAgIHBhZ2Uub3BlbkVkaXRvcih4c2RGaWxlU3RvcmVFZGl0b3JJbnB1dCwgWFNERWRpdG9yUGx1Z2luLkVESVRPUl9JRCwgdHJ1ZSwgMCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL1NldEJhc2VUeXBlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL1NldEJhc2VUeXBlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYzNhNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9TZXRCYXNlVHlwZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTRENvbXBsZXhUeXBlQmFzZVR5cGVFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5zZWFyY2guWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2V0QmFzZVR5cGVBY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuc2V0QmFzZVR5cGUiOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIFNldEJhc2VUeXBlQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fU0VUX0JBU0VfVFlQRSArICIuLi4iKTsgLy8kTk9OLU5MUy0xJAotICAgIHNldElkKElEKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgewotICAgICAgc2VsZWN0aW9uID0gKChYU0RCYXNlQWRhcHRlcikgc2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICAgIAotICAgICAgYm9vbGVhbiBjb21wbGV4VHlwZSA9IHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgICAgIGJvb2xlYW4gc2ltcGxlVHlwZSA9IHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotICAgICAgCi0gICAgICBpZiAoY29tcGxleFR5cGUgfHwgc2ltcGxlVHlwZSkKLSAgICAgIHsKLSAgICAgICAgCi0gICAgICAgIGlmIChnZXRXb3JrYmVuY2hQYXJ0KCkgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkKLSAgICAgICAgewotICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IChJRWRpdG9yUGFydClnZXRXb3JrYmVuY2hQYXJ0KCk7Ci0KLSAgICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTRENvbXBsZXhUeXBlQmFzZVR5cGVFZGl0TWFuYWdlci5jbGFzcyk7Ci0gICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBuZXdWYWx1ZTsKLSAgICAgICAgICBJQ29tcG9uZW50RGlhbG9nIGRpYWxvZyA9IG51bGw7Ci0gICAgICAgICAgZGlhbG9nID0gbWFuYWdlci5nZXRCcm93c2VEaWFsb2coKTsKLSAgICAgICAgICBpZiAoZGlhbG9nICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAJaWYoc2ltcGxlVHlwZSkKLSAgICAgICAgCXsKLSAgICAgICAgCQkoKFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZSkgZGlhbG9nKS5zaG93Q29tcGxleFR5cGVzKGZhbHNlKTsKLSAgICAgICAgCX0KLSAgICAgICAgICAgIGlmIChkaWFsb2cuY3JlYXRlQW5kT3BlbigpID09IFdpbmRvdy5PSykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICAgICAgICAgICAgbWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2Uoc2VsZWN0aW9uLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvU2V0TXVsdGlwbGljaXR5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL1NldE11bHRpcGxpY2l0eUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzM5OTZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvU2V0TXVsdGlwbGljaXR5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5TZXRNdWx0aXBsaWNpdHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFNldE11bHRpcGxpY2l0eUFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVRVUlSRURfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5TZXRNdWx0aXBsaWNpdHkuUkVRVUlSRURfSUQiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFpFUk9fT1JfT05FX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0TXVsdGlwbGljaXR5LlpFUk9fT1JfT05FX0lEIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBaRVJPX09SX01PUkVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5TZXRNdWx0aXBsaWNpdHkuWkVST19PUl9NT1JFX0lEIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBPTkVfT1JfTU9SRV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLlNldE11bHRpcGxpY2l0eS5PTkVfT1JfTU9SRV9JRCI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIFNldE11bHRpcGxpY2l0eUNvbW1hbmQgY29tbWFuZDsKLSAgCi0gIHB1YmxpYyBTZXRNdWx0aXBsaWNpdHlBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgSUQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KGxhYmVsKTsKLSAgICBzZXRJZChJRCk7Ci0gICAgY29tbWFuZCA9IG5ldyBTZXRNdWx0aXBsaWNpdHlDb21tYW5kKGxhYmVsKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TWF4T2NjdXJzKGludCBpKQotICB7Ci0gICAgY29tbWFuZC5zZXRNYXhPY2N1cnMoaSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNaW5PY2N1cnMoaW50IGkpCi0gIHsKLSAgICBjb21tYW5kLnNldE1pbk9jY3VycyhpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpCi0gIHsKLSAgICBib29sZWFuIHN0YXRlID0gc3VwZXIuY2FsY3VsYXRlRW5hYmxlZCgpOwotICAgIGlmIChzdGF0ZSkKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb25jcmV0ZUNvbXBvbmVudCA9IGdldFhTRElucHV0KCk7Ci0gICAgICBpZiAoeHNkQ29uY3JldGVDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAhKChYU0RFbGVtZW50RGVjbGFyYXRpb24peHNkQ29uY3JldGVDb21wb25lbnQpLmlzR2xvYmFsKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh4c2RDb25jcmV0ZUNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAhKCgoWFNETW9kZWxHcm91cCl4c2RDb25jcmV0ZUNvbXBvbmVudCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3RhdGU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgWFNEQ29uY3JldGVDb21wb25lbnQgZ2V0WFNESW5wdXQoKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbmNyZXRlQ29tcG9uZW50ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgewotICAgICAgeHNkQ29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpKChYU0RCYXNlQWRhcHRlcikgc2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHhzZENvbmNyZXRlQ29tcG9uZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbmNyZXRlQ29tcG9uZW50ID0gZ2V0WFNESW5wdXQoKTsKLSAgICBpZiAoeHNkQ29uY3JldGVDb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb21tYW5kLnNldFhTRENvbmNyZXRlQ29tcG9uZW50KHhzZENvbmNyZXRlQ29tcG9uZW50KTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL1NldFR5cGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvU2V0VHlwZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDgzZTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvU2V0VHlwZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuU2V0VHlwZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgU2V0VHlwZUFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX05FV19UWVBFX0lEID0gIlNldFR5cGVBY3Rpb25fQWRkVHlwZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX0VYSVNUSU5HX1RZUEVfSUQgPSAiU2V0VHlwZUFjdGlvbl9FeGlzdGluZ1R5cGUiOyAvLyROT04tTkxTLTEkCi0KLSAgU2V0VHlwZUNvbW1hbmQgY29tbWFuZDsKLQotICBwdWJsaWMgU2V0VHlwZUFjdGlvbihTdHJpbmcgbGFiZWwsIFN0cmluZyBJRCwgSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQobGFiZWwpOwotICAgIHNldElkKElEKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIE9iamVjdCB0YXJnZXQgPSAoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotCi0gICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgU2V0VHlwZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfVFlQRSwgZ2V0SWQoKSwgKFhTRENvbmNyZXRlQ29tcG9uZW50KSB0YXJnZXQpOwotICAgICAgICBjb21tYW5kLnNldEFkYXB0ZXIoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9YU0RCYXNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL1hTREJhc2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcyZDk2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL1hTREJhc2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VGaWVsZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuSUF1dG9EaXJlY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5Ub3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgWFNEQmFzZUFjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25BY3Rpb24KLXsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgYWRkZWRDb21wb25lbnQ7Ci0KLSAgcHVibGljIFhTREJhc2VBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpCi0gIHsKLSAgICBpZiAoZ2V0V29ya2JlbmNoUGFydCgpIGluc3RhbmNlb2YgSUVkaXRvclBhcnQpCi0gICAgewotICAgICAgSUVkaXRvclBhcnQgb3duaW5nRWRpdG9yID0gKElFZGl0b3JQYXJ0KWdldFdvcmtiZW5jaFBhcnQoKTsKLSAgICAgIAotICAgICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uID0gKChYU0RCYXNlQWRhcHRlcikgc2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICAgIH0KLSAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBudWxsOwotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgewotICAgICAgICB4c2RTY2hlbWEgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KXNlbGVjdGlvbikuZ2V0U2NoZW1hKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCAmJiB4c2RTY2hlbWEgPT0gb3duaW5nRWRpdG9yLmdldEFkYXB0ZXIoWFNEU2NoZW1hLmNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZG9FZGl0KE9iamVjdCBvYmosIElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBpZiAob2JqIGluc3RhbmNlb2YgVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCkKLSAgICB7Ci0gICAgICBUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQpb2JqOwotICAgICAgaWYgKGFkZGVkQ29tcG9uZW50ID09ICgoWFNEQmFzZUFkYXB0ZXIpZWRpdFBhcnQuZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCkpCi0gICAgICB7Ci0gICAgICAgIGVkaXRQYXJ0LnNldFNjcm9sbCh0cnVlKTsKLSAgICAgICAgZWRpdFBhcnQuYWRkRmVlZGJhY2soKTsKLSAgICAgICAgZWRpdFBhcnQuZG9FZGl0TmFtZSghKHBhcnQgaW5zdGFuY2VvZiBDb250ZW50T3V0bGluZSkpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBCYXNlRmllbGRFZGl0UGFydCkKLSAgICB7Ci0gICAgICBCYXNlRmllbGRFZGl0UGFydCBlZGl0UGFydCA9IChCYXNlRmllbGRFZGl0UGFydClvYmo7Ci0gICAgICBlZGl0UGFydC5kb0VkaXROYW1lKCEocGFydCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElBdXRvRGlyZWN0RWRpdCkKLSAgICB7Ci0gICAgICAoKElBdXRvRGlyZWN0RWRpdClvYmopLmRvRWRpdE5hbWUoIShwYXJ0IGluc3RhbmNlb2YgQ29udGVudE91dGxpbmUpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZERvY3VtZW50YXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGREb2N1bWVudGF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDYyZWNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZERvY3VtZW50YXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBBZGREb2N1bWVudGF0aW9uQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbjsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgaW5wdXQ7Ci0gIFN0cmluZyBuZXdWYWx1ZSwgb2xkVmFsdWU7Ci0gIGJvb2xlYW4gZG9jdW1lbnRhdGlvbkV4aXN0czsKLSAgRWxlbWVudCBkb2N1bWVudGF0aW9uRWxlbWVudDsKLQotICBwdWJsaWMgQWRkRG9jdW1lbnRhdGlvbkNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RBbm5vdGF0aW9uIHhzZEFubm90YXRpb24sIFhTRENvbmNyZXRlQ29tcG9uZW50IGlucHV0LCBTdHJpbmcgbmV3VmFsdWUsIFN0cmluZyBvbGRWYWx1ZSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZEFubm90YXRpb24gPSB4c2RBbm5vdGF0aW9uOwotICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgICB0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0gICAgdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgewotICAgICAgZW5zdXJlU2NoZW1hRWxlbWVudCgoWFNEU2NoZW1hKWlucHV0KTsKLSAgICB9Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoaW5wdXQuZ2V0RWxlbWVudCgpKTsKLQotICAgICAgeHNkQW5ub3RhdGlvbiA9IFhTRENvbW1vblVJVXRpbHMuZ2V0SW5wdXRYU0RBbm5vdGF0aW9uKGlucHV0LCB0cnVlKTsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZEFubm90YXRpb24uZ2V0RWxlbWVudCgpOwotCi0gICAgICBMaXN0IGRvY3VtZW50YXRpb25MaXN0ID0geHNkQW5ub3RhdGlvbi5nZXRVc2VySW5mb3JtYXRpb24oKTsKLSAgICAgIGRvY3VtZW50YXRpb25FbGVtZW50ID0gbnVsbDsKLSAgICAgIGRvY3VtZW50YXRpb25FeGlzdHMgPSBmYWxzZTsKLSAgICAgIGlmIChkb2N1bWVudGF0aW9uTGlzdC5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBkb2N1bWVudGF0aW9uRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgZG9jdW1lbnRhdGlvbkVsZW1lbnQgPSAoRWxlbWVudCkgZG9jdW1lbnRhdGlvbkxpc3QuZ2V0KDApOwotICAgICAgfQotCi0gICAgICBpZiAoZG9jdW1lbnRhdGlvbkVsZW1lbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZG9jdW1lbnRhdGlvbkVsZW1lbnQgPSB4c2RBbm5vdGF0aW9uLmNyZWF0ZVVzZXJJbmZvcm1hdGlvbihudWxsKTsKLSAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICAgIGZvcm1hdENoaWxkKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgICAgLy8gRGVmZWN0IGluIG1vZGVsLi4uLkkgY3JlYXRlIGl0IGJ1dCB0aGUgbW9kZWwgb2JqZWN0IGRvZXNuJ3QgYXBwZWFyCi0gICAgICAgIC8vIHRvIGJlIHVwZGF0ZWQKLSAgICAgICAgeHNkQW5ub3RhdGlvbi51cGRhdGVFbGVtZW50KCk7Ci0gICAgICAgIHhzZEFubm90YXRpb24uc2V0RWxlbWVudChlbGVtZW50KTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRvY3VtZW50YXRpb25FbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRvY3VtZW50YXRpb25FbGVtZW50IGluc3RhbmNlb2YgSURPTUVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBJRE9NRWxlbWVudCBkb21FbGVtZW50ID0gKElET01FbGVtZW50KSBkb2N1bWVudGF0aW9uRWxlbWVudDsKLQotICAgICAgICAgIE5vZGUgZmlyc3RDaGlsZCA9IGRvY3VtZW50YXRpb25FbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICBOb2RlIGxhc3RDaGlsZCA9IGRvY3VtZW50YXRpb25FbGVtZW50LmdldExhc3RDaGlsZCgpOwotICAgICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgICAgaW50IGVuZCA9IDA7Ci0KLSAgICAgICAgICAvLyBJRE9NTW9kZWwgbW9kZWwgPSBkb21FbGVtZW50LmdldE1vZGVsKCk7Ci0gICAgICAgICAgLy8gSURPTURvY3VtZW50IGRvYyA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgSURPTU5vZGUgZmlyc3QgPSBudWxsOwotICAgICAgICAgIGlmIChmaXJzdENoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgZmlyc3QgPSAoSURPTU5vZGUpIGZpcnN0Q2hpbGQ7Ci0gICAgICAgICAgICBzdGFydCA9IGZpcnN0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChsYXN0Q2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJRE9NTm9kZSBsYXN0ID0gKElET01Ob2RlKSBsYXN0Q2hpbGQ7Ci0gICAgICAgICAgICBlbmQgPSBsYXN0LmdldEVuZE9mZnNldCgpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChkb21FbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgb2xkVmFsdWUgPSBkb21FbGVtZW50LmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0gICAgICAgICAgICBkb21FbGVtZW50LmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQoZG9jdW1lbnRhdGlvbkVsZW1lbnQsIHN0YXJ0LCBlbmQgLSBzdGFydCwgbmV3VmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgb2xkVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIE5vZGUgY2hpbGROb2RlID0gZG9jdW1lbnRhdGlvbkVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKG5ld1ZhbHVlKTsKLSAgICAgICAgICBkb2N1bWVudGF0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZE5vZGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVuZG8oKQotICB7Ci0gICAgc3VwZXIudW5kbygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFbnVtZXJhdGlvbnNDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFbnVtZXJhdGlvbnNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYjhmYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRW51bWVyYXRpb25zQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVudW1lcmF0aW9uRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUJ1aWxkaW5nVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRFbnVtZXJhdGlvbnNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZTsKLSAgU3RyaW5nIHZhbHVlOwotICAvLyBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLiAgSWYgbm8gaXRlbSBpcyBzZWxlY3RlZCwgaW5kZXggd2lsbCBiZSBsZXNzIHRoYW4gMAotICBwcml2YXRlIGludCBpbmRleCA9IC0xOyAgCi0gIC8vIERldGVybWluZXMgd2hlcmUgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIGluc2VydGVkIGJhc2VkIG9uIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudC4gIElmIG5vCi0gIC8vIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIHVzZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2YgYXBwZW5kaW5nIHRoZSBlbGVtZW50IHRvIHRoZSBlbmQKLSAgcHJpdmF0ZSBTdHJpbmcgYWRkRW51bWVyYXRpb25Mb2NhdGlvbjsKLSAgCi0gIHB1YmxpYyBBZGRFbnVtZXJhdGlvbnNDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnNpbXBsZVR5cGUgPSBzaW1wbGVUeXBlOwotICB9Ci0KLSAgcHVibGljIEFkZEVudW1lcmF0aW9uc0NvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlLCBTdHJpbmcgSUQsIGludCBpbmRleCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnNpbXBsZVR5cGUgPSBzaW1wbGVUeXBlOwotICAgIHRoaXMuaW5kZXggPSBpbmRleDsKLSAgICB0aGlzLmFkZEVudW1lcmF0aW9uTG9jYXRpb24gPSBJRDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpKTsKLSAgICAgIFhTREZhY3RvcnkgZmFjdG9yeSA9IFhTRFNjaGVtYUJ1aWxkaW5nVG9vbHMuZ2V0WFNERmFjdG9yeSgpOwotICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtZXJhdGlvbkZhY2V0ID0gZmFjdG9yeS5jcmVhdGVYU0RFbnVtZXJhdGlvbkZhY2V0KCk7Ci0gICAgICBlbnVtZXJhdGlvbkZhY2V0LnNldExleGljYWxWYWx1ZSh2YWx1ZSk7Ci0gICAgICAKLSAgICAgIGluZGV4ID0gZ2V0SW5zZXJ0aW9uSW5kZXgoKTsKLSAgICAgIExpc3QgZmFjZXRzID0gc2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCk7Ci0gICAgICBpZiAoaW5kZXggPj0wICYmIGluZGV4IDwgZmFjZXRzLnNpemUoKSkKLSAgICAgIHsKLSAgICAgICAgZmFjZXRzLmFkZChpbmRleCwgZW51bWVyYXRpb25GYWNldCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZhY2V0cy5hZGQoZW51bWVyYXRpb25GYWNldCk7Ci0gICAgICB9Ci0gICAgICBmb3JtYXRDaGlsZChzaW1wbGVUeXBlLmdldEVsZW1lbnQoKSk7Ci0gICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gZW51bWVyYXRpb25GYWNldDsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIGludCBnZXRJbnNlcnRpb25JbmRleCgpCi0gIHsKLSAgICBpZiAoaW5kZXggPCAwKQotICAgICAgcmV0dXJuIC0xOwotCi0gICAgaWYgKGFkZEVudW1lcmF0aW9uTG9jYXRpb24uZXF1YWxzKEFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb24uQkVGT1JFX1NFTEVDVEVEX0lEKSkKLSAgICB7Ci0gICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICAgIGVsc2UgaWYgKGFkZEVudW1lcmF0aW9uTG9jYXRpb24uZXF1YWxzKEFkZFhTREVudW1lcmF0aW9uRmFjZXRBY3Rpb24uQUZURVJfU0VMRUNURURfSUQpKQotICAgIHsKLSAgICAgIGluZGV4Kys7Ci0gICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEV4dGVuc2liaWxpdHlFbGVtZW50Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDdmNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgRWxlbWVudCBpbnB1dCwgZWxlbWVudFRvQWRkOwotICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBleHRlbnNpb25TY2hlbWFTcGVjOwotCi0gIHB1YmxpYyBBZGRFeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBFbGVtZW50IGlucHV0LCBFbGVtZW50IGVsZW1lbnRUb0FkZCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLmlucHV0ID0gaW5wdXQ7Ci0gICAgdGhpcy5lbGVtZW50VG9BZGQgPSBlbGVtZW50VG9BZGQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhpbnB1dCk7Ci0gICAgICBhZGRFbGVtZW50KCk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgewotICAgIHN1cGVyLnVuZG8oKTsKLSAgICAvLyBUT0RPCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFQcm9wZXJ0aWVzKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIGFwcEluZm9TY2hlbWFTcGVjKQotICB7Ci0gICAgdGhpcy5leHRlbnNpb25TY2hlbWFTcGVjID0gYXBwSW5mb1NjaGVtYVNwZWM7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYWRkRWxlbWVudCgpCi0gIHsKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEb2N1bWVudCBkb2MgPSBpbnB1dC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICBTdHJpbmcgbmFtZSA9IGVsZW1lbnRUb0FkZC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudE5TKGV4dGVuc2lvblNjaGVtYVNwZWMuZ2V0TmFtZXNwYWNlVVJJKCksIG5hbWUpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gaW5wdXQuZ2V0UHJlZml4KCk7Ci0gICAgICAgIHJvb3RFbGVtZW50LnNldFByZWZpeChwcmVmaXgpOwotICAgICAgICBTdHJpbmcgeG1sbnMgPSAocHJlZml4ID09IG51bGwgfHwgcHJlZml4LmVxdWFscygiIikpID8gInhtbG5zIiA6ICJ4bWxuczoiICsgcHJlZml4OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgICBBdHRyIG5zVVJJQXR0cmlidXRlID0gZG9jLmNyZWF0ZUF0dHJpYnV0ZSh4bWxucyk7Ci0gICAgICAgIG5zVVJJQXR0cmlidXRlLnNldFZhbHVlKGV4dGVuc2lvblNjaGVtYVNwZWMuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKG5zVVJJQXR0cmlidXRlKTsKLSAgICAgICAgaW5wdXQuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0KLSAgICAgIH0KLQotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFeHRlbnNpb25BdHRyaWJ1dGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFeHRlbnNpb25BdHRyaWJ1dGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZTBjNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRXh0ZW5zaW9uQXR0cmlidXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VJbmZvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRFeHRlbnNpb25BdHRyaWJ1dGVDb21tYW5kIGV4dGVuZHMgQWRkRXh0ZW5zaW9uQ29tbWFuZAotewotICBwcml2YXRlIHN0YXRpYyBET01OYW1lc3BhY2VJbmZvTWFuYWdlciBtYW5hZ2VyID0gbmV3IERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyKCk7Ci0gIHByaXZhdGUgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlOwotICBwcml2YXRlIGJvb2xlYW4gYXBwSW5mb0F0dHJpYnV0ZUFkZGVkID0gZmFsc2U7Ci0gIHByaXZhdGUgU3RyaW5nIGF0dHJpYnV0ZVFOYW1lOwotICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VQcmVmaXg7Ci0KLSAgcHVibGljIEFkZEV4dGVuc2lvbkF0dHJpYnV0ZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQsCi0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGUpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGNvbXBvbmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgc3VwZXIuZXhlY3V0ZSgpOwotICAgICAgbmFtZXNwYWNlUHJlZml4ID0gaGFuZGxlTmFtZXNwYWNlUHJlZmljZXMoKTsKLQotICAgICAgYXR0cmlidXRlUU5hbWUgPSBuYW1lc3BhY2VQcmVmaXggKyAiOiIgKyBhdHRyaWJ1dGUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0gICAgIAotICAgICAgaWYgKCEoY29tcG9uZW50LmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlUU5hbWUpKSkKLSAgICAgIHsKLSAgICAgICAgYXBwSW5mb0F0dHJpYnV0ZUFkZGVkID0gdHJ1ZTsKLSAgICAgICAgY29tcG9uZW50LmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlUU5hbWUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdW5kbygpCi0gIHsKLSAgICBzdXBlci51bmRvKCk7Ci0gICAgaWYgKGFwcEluZm9BdHRyaWJ1dGVBZGRlZCl7Ci0gICAgICBjb21wb25lbnQuZ2V0RWxlbWVudCgpLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGVRTmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqIENyZWF0ZSBhIG5hbWVzcGFjZSBwcmVmaXggaWYgbmVlZGVkLCBvdGhlciB3aXNlIHJldHJpZXZlIAotICAgKiBhIHByZWRlZmluZWQgbmFtZXNwYWNlIHByZWZpeAotICAgKiBAcmV0dXJuICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgaGFuZGxlTmFtZXNwYWNlUHJlZmljZXMoKQotICB7Ci0gICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gY29tcG9uZW50LmdldFNjaGVtYSgpLmdldEVsZW1lbnQoKTsKLSAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAKLSAgICAvLyBJZiB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBhdHRyaWJ1dGUgYWxyZWFkeSBleGlzdHMKLSAgICBMaXN0IG5hbWVzcGFjZVByZWZpY2VzID0gbWFuYWdlci5nZXROYW1lc3BhY2VJbmZvTGlzdChzY2hlbWFFbGVtZW50KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZVByZWZpY2VzLnNpemUoKTsgaSsrKXsKLSAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBuYW1lc3BhY2VQcmVmaWNlcy5nZXQoaSk7Ci0gICAgICBpZiAoIGluZm8udXJpLmVxdWFscyhhdHRyaWJ1dGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgIHByZWZpeCA9IGluZm8ucHJlZml4OwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBDcmVhdGUgdW5xdWllIG5hbWVzcGFjZSBwcmVmaXgKLSAgICBpZiAoIHByZWZpeCA9PSBudWxsKXsKLSAgICAgIHByZWZpeCA9IGNyZWF0ZVVuaXF1ZVByZWZpeChjb21wb25lbnQpOwotICAgIH0KLQotICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKGF0dHJpYnV0ZS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgcHJlZml4LCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBMaXN0IGluZm9MaXN0ID0gbmV3IEFycmF5TGlzdCgxKTsKLSAgICBpbmZvTGlzdC5hZGQoaW5mbyk7Ci0gICAgbWFuYWdlci5hZGROYW1lc3BhY2VJbmZvKHNjaGVtYUVsZW1lbnQsIGluZm9MaXN0LCBmYWxzZSk7Ci0gICAgcmV0dXJuIHByZWZpeDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVVbmlxdWVQcmVmaXgoWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9ICJwIjsgLy8kTk9OLU5MUy0xJAotICAgIE1hcCBwcmVmTWFwcGVyID0gY29tcG9uZW50LmdldFNjaGVtYSgpLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICBpZiAoIHByZWZNYXBwZXIuZ2V0KHByZWZpeCkgIT0gbnVsbCl7Ci0gICAgICBpbnQgaSA9IDE7Ci0gICAgICB3aGlsZSAoIHByZWZNYXBwZXIuZ2V0KHByZWZpeCArIGkpICE9IG51bGwpCi0gICAgICAgIGkrKzsKLSAgICAgIHByZWZpeCArPSBpOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4OwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEV4dGVuc2lvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEV4dGVuc2lvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3MjEwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFeHRlbnNpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBBZGRFeHRlbnNpb25Db21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIGV4dGVuc2lvbnNTY2hlbWFTcGVjOwotICBwcm90ZWN0ZWQgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50OwotCi0gIHByb3RlY3RlZCBBZGRFeHRlbnNpb25Db21tYW5kKFN0cmluZyBsYWJlbCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYVByb3BlcnRpZXMoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgYXBwSW5mb1NjaGVtYVNwZWMpCi0gIHsKLSAgICB0aGlzLmV4dGVuc2lvbnNTY2hlbWFTcGVjID0gYXBwSW5mb1NjaGVtYVNwZWM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsKLSAgICAgIGVuc3VyZVNjaGVtYUVsZW1lbnQoKFhTRFNjaGVtYSljb21wb25lbnQpOwotICAgIH0KLSAgICAKLSAgICBzdXBlci5leGVjdXRlKCk7Ci0gIH0KLSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRXh0ZW5zaW9uRWxlbWVudENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEV4dGVuc2lvbkVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NDY5MDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRXh0ZW5zaW9uRWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEFkZEV4dGVuc2lvbkVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQWRkRXh0ZW5zaW9uQ29tbWFuZAotewotICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudDsKLSAgRWxlbWVudCBhcHBJbmZvOwotICBFbGVtZW50IG5ld0VsZW1lbnQ7Ci0KLSAgcHVibGljIEFkZEV4dGVuc2lvbkVsZW1lbnRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29uY3JldGVDb21wb25lbnQgaW5wdXQsIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMuY29tcG9uZW50ID0gaW5wdXQ7Ci0gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoY29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBzdXBlci5leGVjdXRlKCk7Ci0gICAgICBhZGRBbm5vdGF0aW9uU2V0KGNvbXBvbmVudC5nZXRTY2hlbWEoKSwgZXh0ZW5zaW9uc1NjaGVtYVNwZWMpOwotICAgICAgZm9ybWF0Q2hpbGQoY29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgewotICAgIHN1cGVyLnVuZG8oKTsKLSAgICBYU0RBbm5vdGF0aW9uIHhzZEFubm90YXRpb24gPSBYU0RDb21tb25VSVV0aWxzLmdldElucHV0WFNEQW5ub3RhdGlvbihjb21wb25lbnQsIGZhbHNlKTsKLSAgICB4c2RBbm5vdGF0aW9uLmdldEVsZW1lbnQoKS5yZW1vdmVDaGlsZChhcHBJbmZvKTsKLSAgICBMaXN0IGFwcEluZm9zID0geHNkQW5ub3RhdGlvbi5nZXRBcHBsaWNhdGlvbkluZm9ybWF0aW9uKCk7Ci0gICAgYXBwSW5mb3MucmVtb3ZlKGFwcEluZm8pOwotICAgIHhzZEFubm90YXRpb24udXBkYXRlRWxlbWVudCgpOwotCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFQcm9wZXJ0aWVzKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMpCi0gIHsKLSAgICB0aGlzLmV4dGVuc2lvbnNTY2hlbWFTcGVjID0gc3BlYzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEFubm90YXRpb25TZXQoWFNEU2NoZW1hIHhzZFNjaGVtYSwgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYykKLSAgewotICAgIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbiA9IFhTRENvbW1vblVJVXRpbHMuZ2V0SW5wdXRYU0RBbm5vdGF0aW9uKGNvbXBvbmVudCwgdHJ1ZSk7Ci0gICAgYWRkQW5ub3RhdGlvblNldChzcGVjLCB4c2RBbm5vdGF0aW9uKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhZGRBbm5vdGF0aW9uU2V0KFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMsIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbikKLSAgeyAgICAgCi0gICAgWFNEU2NoZW1hIHNjaGVtYT0geHNkQW5ub3RhdGlvbi5nZXRTY2hlbWEoKTsKLSAgICBFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBzY2hlbWEuZ2V0RWxlbWVudCgpOwotCi0gICAgaWYgKHhzZEFubm90YXRpb24uZ2V0QXBwbGljYXRpb25JbmZvcm1hdGlvbigpLnNpemUoKSA9PSAwKQotICAgIHsKLSAgICAgIGFwcEluZm8gPSB4c2RBbm5vdGF0aW9uLmNyZWF0ZUFwcGxpY2F0aW9uSW5mb3JtYXRpb24obnVsbCk7Ci0gICAgICB4c2RBbm5vdGF0aW9uLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZChhcHBJbmZvKTsKLSAgICAgIExpc3QgYXBwSW5mb3MgPSB4c2RBbm5vdGF0aW9uLmdldEFwcGxpY2F0aW9uSW5mb3JtYXRpb24oKTsKLSAgICAgIGFwcEluZm9zLmFkZChhcHBJbmZvKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIHVzZSB0aGUgZmlyc3QgYXBwSW5mbwotICAgICAgYXBwSW5mbyA9IChFbGVtZW50KXhzZEFubm90YXRpb24uZ2V0QXBwbGljYXRpb25JbmZvcm1hdGlvbigpLmdldCgwKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgcHJlZml4ID0gYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25JZlJlcXVpcmVkKHNjaGVtYUVsZW1lbnQsICJwIiwgc3BlYy5nZXROYW1lc3BhY2VVUkkoKSk7Ci0KLSAgICBpZiAoYXBwSW5mbyAhPSBudWxsKQotICAgIHsKLSAgICAgIERvY3VtZW50IGRvYyA9IGFwcEluZm8uZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAKLSAgICAgIG5ld0VsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudE5TKHNwZWMuZ2V0TmFtZXNwYWNlVVJJKCksIGVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgIG5ld0VsZW1lbnQuc2V0UHJlZml4KHByZWZpeCk7ICAgCi0gICAgICBhcHBJbmZvLmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpOwotCi0gICAgICB4c2RBbm5vdGF0aW9uLnVwZGF0ZUVsZW1lbnQoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpCi0gIHsKLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZVVuaXF1ZVByZWZpeChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gInAiOyAvLyROT04tTkxTLTEkCi0gICAgTWFwIHByZWZNYXBwZXIgPSBjb21wb25lbnQuZ2V0U2NoZW1hKCkuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotICAgIGlmICggcHJlZk1hcHBlci5nZXQocHJlZml4KSAhPSBudWxsKXsKLSAgICAgIGludCBpID0gMTsKLSAgICAgIHdoaWxlICggcHJlZk1hcHBlci5nZXQocHJlZml4ICsgaSkgIT0gbnVsbCkKLSAgICAgICAgaSsrOwotICAgICAgcHJlZml4ICs9IGk7Ci0gICAgfQotICAgIHJldHVybiBwcmVmaXg7Ci0gIH0gIAotICAKLSAgLy8gVE9ETy4uLiBjb21tb24gdGhpcyB1cCB3aXRoIHdzZGwudWkKLSAgcHJpdmF0ZSBTdHJpbmcgYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25JZlJlcXVpcmVkKEVsZW1lbnQgc2NoZW1hRWxlbWVudCwgU3RyaW5nIHByZWZpeEhpbnQsIFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsgICAgICAKLSAgICBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShzY2hlbWFFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChzY2hlbWFFbGVtZW50KTsKLSAgICBwcmVmaXggPSBuYW1lc3BhY2VUYWJsZS5nZXRQcmVmaXhGb3JVUkkobmFtZXNwYWNlKTsKLSAgICBpZiAocHJlZml4ID09IG51bGwpCi0gICAgeyAKLSAgICAgIFN0cmluZyBiYXNlUHJlZml4ID0gcHJlZml4SGludDsKLSAgICAgIHByZWZpeCA9IGJhc2VQcmVmaXg7Ci0gICAgICBTdHJpbmcgeG1sbnNDb2xvbiA9ICJ4bWxuczoiOyAvLyROT04tTkxTLTEkCi0gICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IHhtbG5zQ29sb24gKyBwcmVmaXg7Ci0gICAgICBpbnQgY291bnQgPSAwOwotICAgICAgd2hpbGUgKHNjaGVtYUVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKQotICAgICAgewotICAgICAgICBjb3VudCsrOwotICAgICAgICBwcmVmaXggPSBiYXNlUHJlZml4ICsgY291bnQ7Ci0gICAgICAgIGF0dHJpYnV0ZU5hbWUgPSB4bWxuc0NvbG9uICsgcHJlZml4OwotICAgICAgfSAgICAgIAotICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgbmFtZXNwYWNlKTsgIAotICAgIH0gICAgCi0gICAgcmV0dXJuIHByZWZpeDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkUmVkZWZpbmVkQ29tcG9uZW50Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkUmVkZWZpbmVkQ29tcG9uZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWVjZWRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFJlZGVmaW5lZENvbXBvbmVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluYWJsZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGNvbW1hbmRzIHRoYXQgYWRkIHJlZGVmaW5lZCBjb21wb25lbnRzIHRvIGEgc2NoZW1hIHJlZGVmaW5lLiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFkZFJlZGVmaW5lZENvbXBvbmVudENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBwcm90ZWN0ZWQgWFNEUmVkZWZpbmUgcmVkZWZpbmU7Ci0KLSAgcHJvdGVjdGVkIFhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IHJlZGVmaW5hYmxlQ29tcG9uZW50OwotCi0gIHB1YmxpYyBBZGRSZWRlZmluZWRDb21wb25lbnRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEUmVkZWZpbmUgcmVkZWZpbmUsIFhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IHJlZGVmaW5hYmxlQ29tcG9uZW50KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMucmVkZWZpbmUgPSByZWRlZmluZTsKLSAgICB0aGlzLnJlZGVmaW5hYmxlQ29tcG9uZW50ID0gcmVkZWZpbmFibGVDb21wb25lbnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb0V4ZWN1dGUoKTsKLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IHJlZGVmaW5lLmdldEVsZW1lbnQoKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgZG9FeGVjdXRlKCk7Ci0JICBPYmplY3QgYWRhcHRlciA9ICByZWRlZmluYWJsZUNvbXBvbmVudC5lQWRhcHRlcnMoKS5nZXQoMCk7Ci0JICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpCi0JICB7ICAgIAkJIAotCQkgICgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcilhZGFwdGVyKS51cGRhdGVEZWxldGVkTWFwKHJlZGVmaW5hYmxlQ29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICB9Ci0JICBlbHNlIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyKQotCSAgeyAgICAJCSAKLQkJICAoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcilhZGFwdGVyKS51cGRhdGVEZWxldGVkTWFwKHJlZGVmaW5hYmxlQ29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICB9Ci0JICBlbHNlIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcikKLQkgIHsgICAgCQkgCi0JCSAgKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyKWFkYXB0ZXIpLnVwZGF0ZURlbGV0ZWRNYXAocmVkZWZpbmFibGVDb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpCi0JICB7ICAgIAkJIAotCQkgICgoWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKWFkYXB0ZXIpLnVwZGF0ZURlbGV0ZWRNYXAocmVkZWZpbmFibGVDb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIHJlZGVmaW5lLmdldENvbnRlbnRzKCkuYWRkKGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQpOwotICAgICAgZm9ybWF0Q2hpbGQoYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudC5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RBbnlBdHRyaWJ1dGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RBbnlBdHRyaWJ1dGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMWNiYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQW55QXR0cmlidXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RBbnlBdHRyaWJ1dGVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgaW5wdXQ7Ci0KLSAgcHVibGljIEFkZFhTREFueUF0dHJpYnV0ZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkQ29tcGxleFR5cGVEZWZpbml0aW9uID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uOwotICAgIHRoaXMuaW5wdXQgPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb247IAotICB9Ci0gIAotICBwdWJsaWMgQWRkWFNEQW55QXR0cmlidXRlQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci0gICAgdGhpcy5pbnB1dCA9IHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhpbnB1dC5nZXRFbGVtZW50KCkpOwotCi0gICAgICBYU0RXaWxkY2FyZCBhbnlBdHRyaWJ1dGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RXaWxkY2FyZCgpOwotICAgICAgaWYgKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uc2V0QXR0cmlidXRlV2lsZGNhcmRDb250ZW50KGFueUF0dHJpYnV0ZSk7Ci0gICAgICAgIGZvcm1hdENoaWxkKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoeHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5zZXRBdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQoYW55QXR0cmlidXRlKTsKLSAgICAgICAgZm9ybWF0Q2hpbGQoeHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgICB9Ci0gICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gYW55QXR0cmlidXRlOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREFueUVsZW1lbnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RBbnlFbGVtZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjg4YTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREFueUVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFCdWlsZGluZ1Rvb2xzOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNEQW55RWxlbWVudENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RNb2RlbEdyb3VwIHBhcmVudDsKLSAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlOwotICBib29sZWFuIGRvQ3JlYXRlTW9kZWxHcm91cEZvckNvbXBsZXhUeXBlID0gZmFsc2U7Ci0KLSAgcHVibGljIEFkZFhTREFueUVsZW1lbnRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNETW9kZWxHcm91cCBwYXJlbnQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbXBsZXhUeXBlKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSkKLSAgewotICAgIHRoaXMuY29tcGxleFR5cGUgPSBjb21wbGV4VHlwZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RG9DcmVhdGVNb2RlbEdyb3VwRm9yQ29tcGxleFR5cGUoYm9vbGVhbiBkb0NyZWF0ZSkKLSAgewotICAgIHRoaXMuZG9DcmVhdGVNb2RlbEdyb3VwRm9yQ29tcGxleFR5cGUgPSBkb0NyZWF0ZTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU1vZGVsR3JvdXAoKQotICB7Ci0gICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0gICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBmYWN0b3J5LmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgcGFyZW50ID0gZmFjdG9yeS5jcmVhdGVYU0RNb2RlbEdyb3VwKCk7Ci0gICAgcGFyZW50LnNldENvbXBvc2l0b3IoWFNEQ29tcG9zaXRvci5TRVFVRU5DRV9MSVRFUkFMKTsKLSAgICBwYXJ0aWNsZS5zZXRDb250ZW50KHBhcmVudCk7Ci0gICAgY29tcGxleFR5cGUuc2V0Q29udGVudChwYXJ0aWNsZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChkb0NyZWF0ZU1vZGVsR3JvdXBGb3JDb21wbGV4VHlwZSkKLSAgICAgIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChjb21wbGV4VHlwZSk7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKGNvbXBsZXhUeXBlLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIGNyZWF0ZU1vZGVsR3JvdXAoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICB9Ci0gICAgICBYU0RXaWxkY2FyZCB3aWxkQ2FyZCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFdpbGRjYXJkKCk7Ci0gICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgICBwYXJ0aWNsZS5zZXRDb250ZW50KHdpbGRDYXJkKTsKLSAgICAgIHBhcmVudC5nZXRDb250ZW50cygpLmFkZChwYXJ0aWNsZSk7Ci0gICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gd2lsZENhcmQ7Ci0gICAgICBmb3JtYXRDaGlsZChwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkZjdlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uOwotICBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXA7Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudDsKLSAgYm9vbGVhbiBpc1JlZmVyZW5jZTsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZVRvQWRkOwotICAvLyBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLiAgSWYgbm8gaXRlbSBpcyBzZWxlY3RlZCwgaW5kZXggd2lsbCBiZSBsZXNzIHRoYW4gMAotICBwcml2YXRlIGludCBpbmRleCA9IC0xOwotICAvLyBEZXRlcm1pbmVzIHdoZXJlIHRoZSBhdHRyaWJ1dGUgc2hvdWxkIGJlIGluc2VydGVkIGJhc2VkIG9uIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgYXR0cmlidXRlLiAgSWYgbm8KLSAgLy8gYXR0cmlidXRlIGlzIHNlbGVjdGVkLCB1c2UgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIGFwcGVuZGluZyB0aGUgYXR0cmlidXRlIHRvIHRoZSBlbmQKLSAgcHJpdmF0ZSBTdHJpbmcgYWRkQXR0cmlidXRlTG9jYXRpb247ICAKLSAgCi0gIHB1YmxpYyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkQ29tcGxleFR5cGVEZWZpbml0aW9uID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uOwotICB9Ci0gIAotICBwdWJsaWMgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICB9Ci0gIAotICBwdWJsaWMgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50LCBTdHJpbmcgYWRkQXR0cmlidXRlTG9jYXRpb24sIGludCBpbmRleCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHRoaXMueHNkQ29tcGxleFR5cGVEZWZpbml0aW9uID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgcGFyZW50OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotICAgIHRoaXMuYWRkQXR0cmlidXRlTG9jYXRpb24gPSBhZGRBdHRyaWJ1dGVMb2NhdGlvbjsKLSAgICB0aGlzLmluZGV4ID0gaW5kZXg7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBpbnQgZ2V0SW5zZXJ0aW9uSW5kZXgoKQotICB7Ci0gICAgaWYgKGluZGV4IDwgMCkKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGlmIChhZGRBdHRyaWJ1dGVMb2NhdGlvbi5lcXVhbHMob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbi5CRUZPUkVfU0VMRUNURURfSUQpKQotICAgIHsKLSAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYWRkQXR0cmlidXRlTG9jYXRpb24uZXF1YWxzKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uQUZURVJfU0VMRUNURURfSUQpKQotICAgIHsKLSAgICAgIGluZGV4Kys7Ci0gICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHBhcmVudCA9PSBudWxsKQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgaWYgKCFpc1JlZmVyZW5jZSkKLSAgICAgICAgewotICAgICAgICAgIGF0dHJpYnV0ZS5zZXROYW1lKGdldE5ld05hbWUobmFtZVRvQWRkID09IG51bGwgPyAiTmV3QXR0cmlidXRlIiA6IG5hbWVUb0FkZCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgYXR0cmlidXRlLnNldFR5cGVEZWZpbml0aW9uKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oInN0cmluZyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGF0dHJpYnV0ZS5zZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKHNldEdsb2JhbEF0dHJpYnV0ZVJlZmVyZW5jZSh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0U2NoZW1hKCkpKTsKLSAgICAgICAgfQotICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0cmlidXRlVXNlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQXR0cmlidXRlVXNlKCk7Ci0gICAgICAgIGF0dHJpYnV0ZVVzZS5zZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyaWJ1dGUpOwotICAgICAgICBhdHRyaWJ1dGVVc2Uuc2V0Q29udGVudChhdHRyaWJ1dGUpOwotCi0gICAgICAgIGlmICh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0QXR0cmlidXRlQ29udGVudHMoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaW5kZXggPSBnZXRJbnNlcnRpb25JbmRleCgpOwotICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuc2l6ZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGVDb250ZW50cygpLmFkZChpbmRleCwgYXR0cmlidXRlVXNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGVDb250ZW50cygpLmFkZChhdHRyaWJ1dGVVc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgICBmb3JtYXRDaGlsZCh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyhwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSAoWFNEU2NoZW1hKSBwYXJlbnQ7Ci0gICAgICAgICAgYXR0cmlidXRlID0gY3JlYXRlR2xvYmFsWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oeHNkU2NoZW1hKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzUmVmZXJlbmNlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZS5zZXRUeXBlRGVmaW5pdGlvbihwYXJlbnQuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJzdHJpbmciKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgSXRlcmF0b3IgaSA9ICgoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBwYXJlbnQpLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkuZ2V0QXR0cmlidXRlVXNlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZSB1c2UgPSAoWFNEQXR0cmlidXRlVXNlKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgbGlzdC5hZGQodXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXR0cmlidXRlLnNldE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZSgiTmV3QXR0cmlidXRlIiwgbGlzdCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGUuc2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbihzZXRHbG9iYWxBdHRyaWJ1dGVSZWZlcmVuY2UocGFyZW50LmdldFNjaGVtYSgpKSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgWFNEQXR0cmlidXRlVXNlIGF0dHJpYnV0ZVVzZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREF0dHJpYnV0ZVVzZSgpOwotICAgICAgICAgIGF0dHJpYnV0ZVVzZS5zZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyaWJ1dGUpOwotICAgICAgICAgIGF0dHJpYnV0ZVVzZS5zZXRDb250ZW50KGF0dHJpYnV0ZSk7Ci0KLSAgICAgICAgICBpbmRleCA9IGdldEluc2VydGlvbkluZGV4KCk7Ci0gICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCAoKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHBhcmVudCkuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKS5nZXRDb250ZW50cygpLnNpemUoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHBhcmVudCkuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKS5nZXRDb250ZW50cygpLmFkZChpbmRleCwgYXR0cmlidXRlVXNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgICgoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBwYXJlbnQpLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkuZ2V0Q29udGVudHMoKS5hZGQoYXR0cmlidXRlVXNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9ybWF0Q2hpbGQocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gYXR0cmlidXRlOwotICB9Ci0KLSAgQXJyYXlMaXN0IG5hbWVzOwotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWVUb0FkZChTdHJpbmcgbmFtZSkKLSAgewotICAgIG5hbWVUb0FkZCA9IG5hbWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld05hbWUoU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgQXJyYXlMaXN0IHVzZWRBdHRyaWJ1dGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB1c2VkQXR0cmlidXRlTmFtZXMuYWRkQWxsKFhTRENvbW1vblVJVXRpbHMuZ2V0QWxsQXR0cmlidXRlcyh4c2RDb21wbGV4VHlwZURlZmluaXRpb24pKTsKLSAgICB1c2VkQXR0cmlidXRlTmFtZXMuYWRkQWxsKFhTRENvbW1vblVJVXRpbHMuZ2V0SW5oZXJpdGVkQXR0cmlidXRlcyh4c2RDb21wbGV4VHlwZURlZmluaXRpb24pKTsKLSAgICByZXR1cm4gWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZShkZXNjcmlwdGlvbiwgdXNlZEF0dHJpYnV0ZU5hbWVzKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2UoYm9vbGVhbiBpc1JlZmVyZW5jZSkKLSAgewotICAgIHRoaXMuaXNSZWZlcmVuY2UgPSBpc1JlZmVyZW5jZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGNyZWF0ZUdsb2JhbFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBlbnN1cmVTY2hlbWFFbGVtZW50KHhzZFNjaGVtYSk7Ci0gICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICBhdHRyaWJ1dGUuc2V0VHlwZURlZmluaXRpb24oeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigic3RyaW5nIikpOyAvLyROT04tTkxTLTEkCi0gICAgYXR0cmlidXRlLnNldE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZShuYW1lVG9BZGQgPT0gbnVsbCA/ICJOZXdBdHRyaWJ1dGUiIDogbmFtZVRvQWRkLCB4c2RTY2hlbWEuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zKCkpKTsgLy8kTk9OLU5MUy0xJAotICAgIFRleHQgdGV4dE5vZGUgPSB4c2RTY2hlbWEuZ2V0RG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgIHhzZFNjaGVtYS5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOwotICAgIHhzZFNjaGVtYS5nZXRDb250ZW50cygpLmFkZChhdHRyaWJ1dGUpOwotICAgIHJldHVybiBhdHRyaWJ1dGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gc2V0R2xvYmFsQXR0cmlidXRlUmVmZXJlbmNlKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSB4c2RTY2hlbWEuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zKCk7Ci0gICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gcmVmZXJlbmNlZEF0dHJpYnV0ZSA9IG51bGw7Ci0gICAgYm9vbGVhbiBpc1VzZXJEZWZpbmVkID0gZmFsc2U7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBpLm5leHQoKTsKLSAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgb2JqOwotICAgICAgICBpZiAoIVhTRENvbnN0YW50cy5TQ0hFTUFfSU5TVEFOQ0VfVVJJXzIwMDEuZXF1YWxzKGF0dHIuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVmZXJlbmNlZEF0dHJpYnV0ZSA9IGF0dHI7Ci0gICAgICAgICAgaXNVc2VyRGVmaW5lZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFpc1VzZXJEZWZpbmVkKQotICAgIHsKLSAgICAgIHJlZmVyZW5jZWRBdHRyaWJ1dGUgPSBjcmVhdGVHbG9iYWxYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbih4c2RTY2hlbWEpOwotICAgICAgVGV4dCB0ZXh0Tm9kZSA9IHhzZFNjaGVtYS5nZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKHRleHROb2RlKTsKLSAgICAgIHhzZFNjaGVtYS5nZXRDb250ZW50cygpLmFkZChyZWZlcmVuY2VkQXR0cmlidXRlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVmZXJlbmNlZEF0dHJpYnV0ZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZTU3NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uOwotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotCi0gIHB1YmxpYyBBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25Db21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25Db21tYW5kKFN0cmluZyBsYWJlbCwgWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHhzZFNjaGVtYSA9PSBudWxsKQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgYXR0cmlidXRlR3JvdXAuc2V0TmFtZShnZXROZXdOYW1lKCJBdHRyaWJ1dGVHcm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIExpc3QgbGlzdCA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRTY2hlbWEoKS5nZXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCk7Ci0gICAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyaWJ1dGVHcm91cC5zZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBsaXN0LmdldCgwKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYXR0cmlidXRlR3JvdXAuc2V0TmFtZShudWxsKTsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXAyID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgYXR0cmlidXRlR3JvdXAyLnNldE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZSgiTmV3QXR0cmlidXRlR3JvdXAiLCB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0U2NoZW1hKCkuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0U2NoZW1hKCkuZ2V0Q29udGVudHMoKS5hZGQoYXR0cmlidXRlR3JvdXAyKTsKLSAgICAgICAgICBhdHRyaWJ1dGVHcm91cC5zZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihhdHRyaWJ1dGVHcm91cDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGVDb250ZW50cygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0QXR0cmlidXRlQ29udGVudHMoKS5hZGQoYXR0cmlidXRlR3JvdXApOwotICAgICAgICB9Ci0gICAgICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSBhdHRyaWJ1dGVHcm91cDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZW5zdXJlU2NoZW1hRWxlbWVudCh4c2RTY2hlbWEpOwotICAgICAgICAvLyBwdXQgdGhpcyBhZnRlciwgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIERPTSBub2RlIHlldAotICAgICAgICBiZWdpblJlY29yZGluZyh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgYXR0cmlidXRlR3JvdXAuc2V0TmFtZShYU0RDb21tb25VSVV0aWxzLmNyZWF0ZVVuaXF1ZUVsZW1lbnROYW1lKCJOZXdBdHRyaWJ1dGVHcm91cCIsIHhzZFNjaGVtYS5nZXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCkpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBUZXh0IHRleHROb2RlID0geHNkU2NoZW1hLmdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoIlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgeHNkU2NoZW1hLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgICAgIHhzZFNjaGVtYS5nZXRDb250ZW50cygpLmFkZChhdHRyaWJ1dGVHcm91cCk7Ci0gICAgICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSBhdHRyaWJ1dGVHcm91cDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi0gIEFycmF5TGlzdCBuYW1lczsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld05hbWUoU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgU3RyaW5nIGNhbmRpZGF0ZU5hbWUgPSAiTmV3IiArIGRlc2NyaXB0aW9uOyAvLyROT04tTkxTLTEkCi0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uOwotICAgIG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGludCBpID0gMTsKLSAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHBhcmVudDsKLSAgICAgIHdhbGtVcEluaGVyaXRhbmNlKGN0KTsKLQotICAgICAgYm9vbGVhbiByZWFkeSA9IGZhbHNlOwotICAgICAgd2hpbGUgKCFyZWFkeSkKLSAgICAgIHsKLSAgICAgICAgcmVhZHkgPSB0cnVlOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuYW1lcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICBpZiAoY2FuZGlkYXRlTmFtZS5lcXVhbHMoYXR0ck5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlYWR5ID0gZmFsc2U7Ci0gICAgICAgICAgICBjYW5kaWRhdGVOYW1lID0gIk5ldyIgKyBkZXNjcmlwdGlvbiArIFN0cmluZy52YWx1ZU9mKGkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpKys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjYW5kaWRhdGVOYW1lOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdhbGtVcEluaGVyaXRhbmNlKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCkKLSAgewotICAgIHVwZGF0ZU5hbWVzKGN0KTsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gY3QuZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgaWYgKGN0ICE9IGN0LmdldFJvb3RUeXBlKCkpCi0gICAgewotICAgICAgaWYgKHR5cGVEZWYgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdDIgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB0eXBlRGVmOwotICAgICAgICB3YWxrVXBJbmhlcml0YW5jZShjdDIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVOYW1lcyhYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyID0gY3QuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgdXNlID0gKFhTREF0dHJpYnV0ZVVzZSkgb2JqOwotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gdXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoYXR0ck5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVzLmFkZChhdHRyTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNjM2Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFCdWlsZGluZ1Rvb2xzOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudDsKLSAgcHJvdGVjdGVkIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjcmVhdGVkQ29tcGxleFR5cGU7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWVUb0FkZDsKLSAgCi0gIHB1YmxpYyBBZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXROYW1lVG9BZGQoU3RyaW5nIG5hbWVUb0FkZCkKLSAgewotICAgIHRoaXMubmFtZVRvQWRkID0gbmFtZVRvQWRkOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCNleGVjdXRlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RGYWN0b3J5IGZhY3RvcnkgPSBYU0RTY2hlbWFCdWlsZGluZ1Rvb2xzLmdldFhTREZhY3RvcnkoKTsKLSAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IGZhY3RvcnkuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gY29tcGxleFR5cGU7Ci0gICAgICBTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWUobmFtZVRvQWRkID09IG51bGwgPyAiTmV3Q29tcGxleFR5cGUiIDogbmFtZVRvQWRkLCBwYXJlbnQuZ2V0U2NoZW1hKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICBjb21wbGV4VHlwZS5zZXROYW1lKG5ld05hbWUpOwotICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gKFhTRFNjaGVtYSkgcGFyZW50OwotICAgICAgICAgIGVuc3VyZVNjaGVtYUVsZW1lbnQoeHNkU2NoZW1hKTsKLSAgICAgICAgICBUZXh0IHRleHROb2RlID0geHNkU2NoZW1hLmdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoIlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKHRleHROb2RlKTsKLSAgICAgICAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQoY29tcGxleFR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHBhcmVudCkuc2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oY29tcGxleFR5cGUpOwotICAgICAgICBmb3JtYXRDaGlsZChwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIH0KLSAgICAgIGNyZWF0ZWRDb21wbGV4VHlwZSA9IGNvbXBsZXhUeXBlOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXROZXdOYW1lKFN0cmluZyBkZXNjcmlwdGlvbiwgWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIFN0cmluZyBjYW5kaWRhdGVOYW1lID0gZGVzY3JpcHRpb247IC8vJE5PTi1OTFMtMSQKLSAgICBpbnQgaSA9IDE7Ci0KLSAgICBMaXN0IGxpc3QgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCk7Ci0gICAgTGlzdCBsaXN0T2ZOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gKFhTRFR5cGVEZWZpbml0aW9uKSBpdGVyLm5leHQoKTsKLSAgICAgIFN0cmluZyBuYW1lID0gdHlwZURlZi5nZXROYW1lKCk7Ci0gICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmICh0eXBlRGVmLmdldFRhcmdldE5hbWVzcGFjZSgpID09IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkKLSAgICAgICAgbGlzdE9mTmFtZXMuYWRkKG5hbWUpOwotICAgIH0KLQotICAgIGJvb2xlYW4gZmxhZyA9IHRydWU7Ci0gICAgd2hpbGUgKGZsYWcpCi0gICAgewotICAgICAgaWYgKCFsaXN0T2ZOYW1lcy5jb250YWlucyhjYW5kaWRhdGVOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgZmxhZyA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhbmRpZGF0ZU5hbWUgPSBkZXNjcmlwdGlvbiArIFN0cmluZy52YWx1ZU9mKGkpOyAvLyROT04tTkxTLTEkCi0gICAgICBpKys7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNhbmRpZGF0ZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGdldENyZWF0ZWRDb21wbGV4VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlZENvbXBsZXhUeXBlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RFbGVtZW50Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNERWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFiZGZmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RFbGVtZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hQnVpbGRpbmdUb29sczsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgY2xhc3MgQWRkWFNERWxlbWVudENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uOwotICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLSAgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwOwotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBib29sZWFuIGlzUmVmZXJlbmNlOwotICBwcml2YXRlIFN0cmluZyBuYW1lVG9BZGQ7Ci0gIC8vIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0uICBJZiBubyBpdGVtIGlzIHNlbGVjdGVkLCBpbmRleCB3aWxsIGJlIGxlc3MgdGhhbiAwCi0gIHByaXZhdGUgaW50IGluZGV4ID0gLTE7ICAKLSAgLy8gRGV0ZXJtaW5lcyB3aGVyZSB0aGUgZWxlbWVudCBzaG91bGQgYmUgaW5zZXJ0ZWQgYmFzZWQgb24gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50LiAgSWYgbm8KLSAgLy8gZWxlbWVudCBpcyBzZWxlY3RlZCwgdXNlIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBhcHBlbmRpbmcgdGhlIGVsZW1lbnQgdG8gdGhlIGVuZAotICBwcml2YXRlIFN0cmluZyBhZGRFbGVtZW50TG9jYXRpb247IAotICAKLSAgcHVibGljIEFkZFhTREVsZW1lbnRDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgQWRkWFNERWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkQ29tcGxleFR5cGVEZWZpbml0aW9uID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uOwotICAgIHhzZE1vZGVsR3JvdXAgPSBnZXRNb2RlbEdyb3VwKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbik7Ci0gIH0KLQotICBwdWJsaWMgQWRkWFNERWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZE1vZGVsR3JvdXBEZWZpbml0aW9uID0geHNkTW9kZWxHcm91cERlZmluaXRpb247Ci0gICAgeHNkTW9kZWxHcm91cCA9IGdldE1vZGVsR3JvdXAoeHNkTW9kZWxHcm91cERlZmluaXRpb24pOwotICB9Ci0gIAotICBwdWJsaWMgQWRkWFNERWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAsIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RNb2RlbEdyb3VwID0geHNkTW9kZWxHcm91cDsKLSAgICB0aGlzLnhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBBZGRYU0RFbGVtZW50Q29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZE1vZGVsR3JvdXAgPSB4c2RNb2RlbEdyb3VwOwotICB9Ci0gIAotICBwdWJsaWMgQWRkWFNERWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAsIFN0cmluZyBJRCwgaW50IGluZGV4KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkTW9kZWxHcm91cCA9IHhzZE1vZGVsR3JvdXA7Ci0gICAgdGhpcy5pbmRleCA9IGluZGV4OwotICAgIHRoaXMuYWRkRWxlbWVudExvY2F0aW9uID0gSUQ7Ci0gIH0KLQotICBwdWJsaWMgQWRkWFNERWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlKGJvb2xlYW4gaXNSZWZlcmVuY2UpCi0gIHsKLSAgICB0aGlzLmlzUmVmZXJlbmNlID0gaXNSZWZlcmVuY2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE5hbWVUb0FkZChTdHJpbmcgbmFtZSkKLSAgewotICAgIG5hbWVUb0FkZCA9IG5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEFkZEVsZW1lbnRMb2NhdGlvbihTdHJpbmcgTG9jYXRpb25UeXBlKQotICB7Ci0gICAgYWRkRWxlbWVudExvY2F0aW9uID0gTG9jYXRpb25UeXBlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgaW50IGdldEluc2VydGlvbkluZGV4KCkKLSAgewotICAgIGlmIChpbmRleCA8IDApCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBpZiAoYWRkRWxlbWVudExvY2F0aW9uLmVxdWFscyhvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREVsZW1lbnRBY3Rpb24uQkVGT1JFX1NFTEVDVEVEX0lEKSkKLSAgICB7Ci0gICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICAgIGVsc2UgaWYgKGFkZEVsZW1lbnRMb2NhdGlvbi5lcXVhbHMob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50QWN0aW9uLkFGVEVSX1NFTEVDVEVEX0lEKSkKLSAgICB7Ci0gICAgICBpbmRleCsrOwotICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfQotICAKLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCNleGVjdXRlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSBjcmVhdGVHbG9iYWxYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgICAgVGV4dCB0ZXh0Tm9kZSA9IHhzZFNjaGVtYS5nZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHhzZFNjaGVtYS5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOwotICAgICAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQoZWxlbWVudCk7Ci0gICAgICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSBlbGVtZW50OwotICAgICAgfQotICAgICAgZWxzZSBpZiAoeHNkTW9kZWxHcm91cERlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgaWYgKHhzZE1vZGVsR3JvdXAgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFhTREZhY3RvcnkgZmFjdG9yeSA9IFhTRFNjaGVtYUJ1aWxkaW5nVG9vbHMuZ2V0WFNERmFjdG9yeSgpOwotICAgICAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gZmFjdG9yeS5jcmVhdGVYU0RQYXJ0aWNsZSgpOwotICAgICAgICAgIHhzZE1vZGVsR3JvdXAgPSBmYWN0b3J5LmNyZWF0ZVhTRE1vZGVsR3JvdXAoKTsKLSAgICAgICAgICB4c2RNb2RlbEdyb3VwLnNldENvbXBvc2l0b3IoWFNEQ29tcG9zaXRvci5TRVFVRU5DRV9MSVRFUkFMKTsKLSAgICAgICAgICBwYXJ0aWNsZS5zZXRDb250ZW50KHhzZE1vZGVsR3JvdXApOwotICAgICAgICAgIHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLnNldE1vZGVsR3JvdXAoeHNkTW9kZWxHcm91cCk7Ci0gICAgICAgIH0KLSAgICAgICAgeHNkU2NoZW1hID0geHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0U2NoZW1hKCk7Ci0gICAgICAgIGlmICghaXNSZWZlcmVuY2UpCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbkZvck1vZGVsR3JvdXBEZWZpbml0aW9ucygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGNyZWF0ZVhTREVsZW1lbnRSZWZlcmVuY2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9ybWF0Q2hpbGQoeHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHhzZE1vZGVsR3JvdXAgIT0gbnVsbCAmJiAoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uID09IG51bGwgfHwgeHNkTW9kZWxHcm91cERlZmluaXRpb24gPT0gbnVsbCkgKQotICAgICAgewotICAgICAgICB4c2RTY2hlbWEgPSB4c2RNb2RlbEdyb3VwLmdldFNjaGVtYSgpOwotICAgICAgICBiZWdpblJlY29yZGluZyh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgaWYgKCFpc1JlZmVyZW5jZSkKLSAgICAgICAgewotICAgICAgICAJaW5kZXggPSBnZXRJbnNlcnRpb25JbmRleCgpOwotICAgICAgICAJaWYoaW5kZXggPj0gMCAmJiBpbmRleCA8IHhzZE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5zaXplKCkpCi0gICAgICAgIAl7ICAgICAgICAJCQotICAgICAgICAJCXhzZE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoaW5kZXgsY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgICAgICAJfQotICAgICAgICAJZWxzZQotICAgICAgICAJewotICAgICAgICAJCXhzZE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHhzZE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoY3JlYXRlWFNERWxlbWVudFJlZmVyZW5jZSgpKTsKLSAgICAgICAgfQotICAgICAgICBmb3JtYXRDaGlsZCh4c2RNb2RlbEdyb3VwLmdldEVsZW1lbnQoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHhzZFNjaGVtYSA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRTY2hlbWEoKTsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIGlmICh4c2RNb2RlbEdyb3VwID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RGYWN0b3J5IGZhY3RvcnkgPSBYU0RTY2hlbWFCdWlsZGluZ1Rvb2xzLmdldFhTREZhY3RvcnkoKTsKLSAgICAgICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IGZhY3RvcnkuY3JlYXRlWFNEUGFydGljbGUoKTsKLSAgICAgICAgICB4c2RNb2RlbEdyb3VwID0gZmFjdG9yeS5jcmVhdGVYU0RNb2RlbEdyb3VwKCk7Ci0gICAgICAgICAgeHNkTW9kZWxHcm91cC5zZXRDb21wb3NpdG9yKFhTRENvbXBvc2l0b3IuU0VRVUVOQ0VfTElURVJBTCk7Ci0gICAgICAgICAgcGFydGljbGUuc2V0Q29udGVudCh4c2RNb2RlbEdyb3VwKTsKLSAgICAgICAgICB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uc2V0Q29udGVudChwYXJ0aWNsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpc1JlZmVyZW5jZSkKLSAgICAgICAgewotICAgICAgICAgIHhzZE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uRm9yQ29tcGxleFR5cGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgeHNkTW9kZWxHcm91cC5nZXRDb250ZW50cygpLmFkZChjcmVhdGVYU0RFbGVtZW50UmVmZXJlbmNlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGZvcm1hdENoaWxkKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotICAgICAgfQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgWFNEUGFydGljbGUgY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uKCkKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGUgPSB4c2RNb2RlbEdyb3VwLmdldFNjaGVtYSgpLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigic3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0KLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wID0geHNkTW9kZWxHcm91cC5nZXRDb250YWluZXIoKTsKLSAgICBBcnJheUxpc3QgdXNlZEF0dHJpYnV0ZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFhTRENvbW1vblVJVXRpbHMucmVzZXRWaXNpdGVkR3JvdXBzU3RhY2soKTsKLSAgICB1c2VkQXR0cmlidXRlTmFtZXMuYWRkQWxsKFhTRENvbW1vblVJVXRpbHMuZ2V0Q2hpbGRFbGVtZW50cyh4c2RNb2RlbEdyb3VwKSk7ICAgIAotICAgIHdoaWxlIChjb21wICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgdXNlZEF0dHJpYnV0ZU5hbWVzLmFkZEFsbChYU0RDb21tb25VSVV0aWxzLmdldEFsbEF0dHJpYnV0ZXMoKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKWNvbXApKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjb21wIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICB1c2VkQXR0cmlidXRlTmFtZXMuYWRkQWxsKFhTRENvbW1vblVJVXRpbHMuZ2V0QWxsQXR0cmlidXRlcygoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWNvbXApKTsKLSAgICAgICAgdXNlZEF0dHJpYnV0ZU5hbWVzLmFkZEFsbChYU0RDb21tb25VSVV0aWxzLmdldEluaGVyaXRlZEF0dHJpYnV0ZXMoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiljb21wKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY29tcCA9IGNvbXAuZ2V0Q29udGFpbmVyKCk7Ci0gICAgfQotICAgIGVsZW1lbnQuc2V0TmFtZShYU0RDb21tb25VSVV0aWxzLmNyZWF0ZVVuaXF1ZUVsZW1lbnROYW1lKAotICAgIAkJbmFtZVRvQWRkID09IG51bGwgPyAiTmV3RWxlbWVudCIgOiBuYW1lVG9BZGQgLCB1c2VkQXR0cmlidXRlTmFtZXMpKTsgLy8kTk9OLU5MUy0xJAotICAgIGVsZW1lbnQuc2V0VHlwZURlZmluaXRpb24odHlwZSk7Ci0KLSAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgcGFydGljbGUuc2V0Q29udGVudChlbGVtZW50KTsKLSAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gZWxlbWVudDsKLSAgICByZXR1cm4gcGFydGljbGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNEUGFydGljbGUgY3JlYXRlWFNERWxlbWVudFJlZmVyZW5jZSgpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSB4c2RNb2RlbEdyb3VwLmdldFNjaGVtYSgpLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKTsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gcmVmZXJlbmNlZEVsZW1lbnQgPSBudWxsOwotICAgIGlmIChsaXN0LnNpemUoKSA+IDApCi0gICAgewotICAgICAgcmVmZXJlbmNlZEVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWxpc3QuZ2V0KDApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVmZXJlbmNlZEVsZW1lbnQgPSBjcmVhdGVHbG9iYWxYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgIFRleHQgdGV4dE5vZGUgPSB4c2RTY2hlbWEuZ2V0RG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgeHNkU2NoZW1hLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQocmVmZXJlbmNlZEVsZW1lbnQpOwotICAgIH0KLQotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgCi0gICAgZWxlbWVudC5zZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbihyZWZlcmVuY2VkRWxlbWVudCk7Ci0gICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RQYXJ0aWNsZSgpOwotICAgIHBhcnRpY2xlLnNldENvbnRlbnQoZWxlbWVudCk7Ci0gICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IGVsZW1lbnQ7Ci0gICAgcmV0dXJuIHBhcnRpY2xlOwotICB9Ci0KLSAgcHJvdGVjdGVkIFhTRFBhcnRpY2xlIGNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbkZvckNvbXBsZXhUeXBlKCkKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGUgPSB4c2RNb2RlbEdyb3VwLmdldFNjaGVtYSgpLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigic3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0KLSAgICBBcnJheUxpc3QgdXNlZEF0dHJpYnV0ZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHVzZWRBdHRyaWJ1dGVOYW1lcy5hZGRBbGwoWFNEQ29tbW9uVUlVdGlscy5nZXRBbGxBdHRyaWJ1dGVzKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbikpOwotICAgIHVzZWRBdHRyaWJ1dGVOYW1lcy5hZGRBbGwoWFNEQ29tbW9uVUlVdGlscy5nZXRJbmhlcml0ZWRBdHRyaWJ1dGVzKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbikpOwotICAgIGVsZW1lbnQuc2V0TmFtZShYU0RDb21tb25VSVV0aWxzLmNyZWF0ZVVuaXF1ZUVsZW1lbnROYW1lKAotICAgIAkJbmFtZVRvQWRkID09IG51bGwgPyAiTmV3RWxlbWVudCIgOiBuYW1lVG9BZGQgLCB1c2VkQXR0cmlidXRlTmFtZXMpKTsgLy8kTk9OLU5MUy0xJAotICAgIGVsZW1lbnQuc2V0VHlwZURlZmluaXRpb24odHlwZSk7Ci0KLSAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgcGFydGljbGUuc2V0Q29udGVudChlbGVtZW50KTsKLSAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gZWxlbWVudDsKLSAgICByZXR1cm4gcGFydGljbGU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBYU0RQYXJ0aWNsZSBjcmVhdGVYU0RFbGVtZW50RGVjbGFyYXRpb25Gb3JNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZSA9IHhzZE1vZGVsR3JvdXAuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJzdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLQotICAgIEFycmF5TGlzdCB1c2VkQXR0cmlidXRlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgdXNlZEF0dHJpYnV0ZU5hbWVzLmFkZEFsbChYU0RDb21tb25VSVV0aWxzLmdldEFsbEF0dHJpYnV0ZXMoeHNkTW9kZWxHcm91cERlZmluaXRpb24pKTsKLSAgICBlbGVtZW50LnNldE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZSgKLSAgICAgICAgbmFtZVRvQWRkID09IG51bGwgPyAiTmV3RWxlbWVudCIgOiBuYW1lVG9BZGQgLCB1c2VkQXR0cmlidXRlTmFtZXMpKTsgLy8kTk9OLU5MUy0xJAotICAgIGVsZW1lbnQuc2V0VHlwZURlZmluaXRpb24odHlwZSk7Ci0KLSAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgcGFydGljbGUuc2V0Q29udGVudChlbGVtZW50KTsKLSAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gZWxlbWVudDsKLSAgICByZXR1cm4gcGFydGljbGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNERWxlbWVudERlY2xhcmF0aW9uIGNyZWF0ZUdsb2JhbFhTREVsZW1lbnREZWNsYXJhdGlvbigpCi0gIHsKLSAgICBlbnN1cmVTY2hlbWFFbGVtZW50KHhzZFNjaGVtYSk7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZSA9IHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oInN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0gICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbigpOwotCi0gICAgZWxlbWVudC5zZXROYW1lKFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoCi0gICAgCQluYW1lVG9BZGQgPT0gbnVsbCA/ICJOZXdFbGVtZW50IiA6IG5hbWVUb0FkZCAsIHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkpKTsgLy8kTk9OLU5MUy0xJAotICAgIGVsZW1lbnQuc2V0VHlwZURlZmluaXRpb24odHlwZSk7Ci0KLSAgICByZXR1cm4gZWxlbWVudDsKLSAgfQotICAKLSAgcHVibGljIFhTRE1vZGVsR3JvdXAgZ2V0TW9kZWxHcm91cChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpOwotICB9Ci0KLSAgLy9QT1JUCi0gIHB1YmxpYyBYU0RNb2RlbEdyb3VwIGdldE1vZGVsR3JvdXAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNUeXBlKQotICB7Ci0gICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBudWxsOwotCi0gICAgWFNEQ29tcGxleFR5cGVDb250ZW50IHhzZENvbXBsZXhUeXBlQ29udGVudCA9IGNUeXBlLmdldENvbnRlbnQoKTsKLSAgICBpZiAoeHNkQ29tcGxleFR5cGVDb250ZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgewotICAgICAgcGFydGljbGUgPSAoWFNEUGFydGljbGUpeHNkQ29tcGxleFR5cGVDb250ZW50OwotICAgIH0KLSAgICAKLSAgICBpZiAocGFydGljbGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgT2JqZWN0IHBhcnRpY2xlQ29udGVudCA9IHBhcnRpY2xlLmdldENvbnRlbnQoKTsKLSAgICBYU0RNb2RlbEdyb3VwIGdyb3VwID0gbnVsbDsKLQotICAgIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBncm91cCA9ICgoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHBhcnRpY2xlQ29udGVudCkuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE1vZGVsR3JvdXAoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICBncm91cCA9IChYU0RNb2RlbEdyb3VwKSBwYXJ0aWNsZUNvbnRlbnQ7Ci0gICAgfQotCi0gICAgaWYgKGdyb3VwID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0vLyAgICBpZiAoZ3JvdXAuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkgfHwgZ3JvdXAuZVJlc291cmNlKCkgIT0gY1R5cGUuZVJlc291cmNlKCkpCi0vLyAgICB7Ci0vLyAgICAgIGlmIChjVHlwZS5nZXRCYXNlVHlwZSgpICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgY29udGVudCA9IGNUeXBlLmdldENvbnRlbnQoKTsKLS8vICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIGdyb3VwID0gKFhTRE1vZGVsR3JvdXApICgoWFNEUGFydGljbGUpIGNvbnRlbnQpLmdldENvbnRlbnQoKTsKLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgIH0KLQotICAgIHJldHVybiBncm91cDsKLSAgfQotICAKLSAgcHVibGljIFhTRENvbmNyZXRlQ29tcG9uZW50IGdldEFkZGVkQ29tcG9uZW50KCkKLSAgewotICAgIHJldHVybiBzdXBlci5nZXRBZGRlZENvbXBvbmVudCgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREltcG9ydENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREltcG9ydENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkxZjg3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RJbXBvcnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RJbXBvcnRDb21tYW5kIGV4dGVuZHMgQWRkWFNEU2NoZW1hRGlyZWN0aXZlQ29tbWFuZAotewotICBwdWJsaWMgQWRkWFNESW1wb3J0Q29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSBzY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICAgIC8vIEFkZCB0aGlzIGFmdGVyIGlmIHdlIGRvbid0IGhhdmUgYSBET00gTm9kZSB5ZXQKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHhzZFNjaGVtYS5nZXRFbGVtZW50KCkpOwotICAgICAgWFNESW1wb3J0IHhzZEltcG9ydCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREltcG9ydCgpOwotICAgICAgeHNkU2NoZW1hLmdldENvbnRlbnRzKCkuYWRkKGZpbmROZXh0UG9zaXRpb25Ub0luc2VydCgpLCB4c2RJbXBvcnQpOwotICAgICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IHhzZEltcG9ydDsKLSAgICAgIGZvcm1hdENoaWxkKHhzZFNjaGVtYS5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RJbmNsdWRlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNESW5jbHVkZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5YjMwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RJbmNsdWRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREluY2x1ZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEFkZFhTREluY2x1ZGVDb21tYW5kIGV4dGVuZHMgQWRkWFNEU2NoZW1hRGlyZWN0aXZlQ29tbWFuZAotewotICBwdWJsaWMgQWRkWFNESW5jbHVkZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkU2NoZW1hID0gc2NoZW1hOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBzdXBlci5leGVjdXRlKCk7Ci0gICAgICAvLyBBZGQgdGhpcyBhZnRlciBpZiB3ZSBkb24ndCBoYXZlIGEgRE9NIE5vZGUgeWV0Ci0gICAgICBiZWdpblJlY29yZGluZyh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICAgIFhTREluY2x1ZGUgeHNkSW5jbHVkZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREluY2x1ZGUoKTsKLSAgICAgIHhzZEluY2x1ZGUuc2V0U2NoZW1hTG9jYXRpb24oIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQoZmluZE5leHRQb3NpdGlvblRvSW5zZXJ0KCksIHhzZEluY2x1ZGUpOwotICAgICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IHhzZEluY2x1ZGU7Ci0gICAgICBmb3JtYXRDaGlsZCh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNETW9kZWxHcm91cENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRE1vZGVsR3JvdXBDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMTRiMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNETW9kZWxHcm91cENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUJ1aWxkaW5nVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RNb2RlbEdyb3VwQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudDsKLSAgWFNEQ29tcG9zaXRvciB4c2RDb21wb3NpdG9yOwotICBYU0RNb2RlbEdyb3VwIG5ld01vZGVsR3JvdXA7Ci0KLSAgcHVibGljIEFkZFhTRE1vZGVsR3JvdXBDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50LCBYU0RDb21wb3NpdG9yIHhzZENvbXBvc2l0b3IpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgdGhpcy54c2RDb21wb3NpdG9yID0geHNkQ29tcG9zaXRvcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBvd25lciA9IGdldE93bmVyKCk7Ci0gICAgICBpZiAob3duZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RQYXJ0aWNsZSgpOwotICAgICAgICBuZXdNb2RlbEdyb3VwID0gY3JlYXRlTW9kZWxHcm91cCgpOwotICAgICAgICBwYXJ0aWNsZS5zZXRDb250ZW50KG5ld01vZGVsR3JvdXApOwotCi0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdGQgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBvd25lcjsKLSAgICAgICAgY3RkLnNldENvbnRlbnQocGFydGljbGUpOwotICAgICAgfQotICAgICAgZm9ybWF0Q2hpbGQocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHVuZG8oKQotICB7Ci0gICAgc3VwZXIudW5kbygpOwotICAgIAotICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWwgPSAoWFNETW9kZWxHcm91cCkgcGFyZW50OwotICAgICAgbW9kZWwuZ2V0Q29udGVudHMoKS5yZW1vdmUobmV3TW9kZWxHcm91cC5nZXRDb250YWluZXIoKSk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIFhTRENvbmNyZXRlQ29tcG9uZW50IGdldE93bmVyKCkKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IG93bmVyID0gbnVsbDsKLSAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pcGFyZW50OyAgICAgIAotICAgICAgaWYgKGVkLmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIGlmIChlZC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBlZC5zZXRUeXBlRGVmaW5pdGlvbihudWxsKTsKLSAgICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdGQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICBlZC5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbih0ZCk7Ci0gICAgICAgICAgb3duZXIgPSBlZC5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0ZCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgIGVkLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKHRkKTsKLSAgICAgICAgICBvd25lciA9IHRkOyAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0gICAgICAgIAotICAgICAgZWxzZSBpZiAoZWQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSA9PSBudWxsKQotICAgICAgewotICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdGQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgZWQuc2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24odGQpOwotICAgICAgICBvd25lciA9IHRkOyAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlZC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBvd25lciA9IGVkLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlZC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0ZCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICBlZC5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbih0ZCk7Ci0gICAgICAgIG93bmVyID0gdGQ7ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICBuZXdNb2RlbEdyb3VwID0gY3JlYXRlTW9kZWxHcm91cCgpOwotICAgICAgKChYU0RNb2RlbEdyb3VwKSBwYXJlbnQpLmdldENvbnRlbnRzKCkuYWRkKG5ld01vZGVsR3JvdXAuZ2V0Q29udGFpbmVyKCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilwYXJlbnQ7Ci0gICAgICBvd25lciA9IHBhcmVudDsKLSAgICAgIGlmIChjdC5nZXRDb250ZW50KCkgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpY3QuZ2V0Q29udGVudCgpOwotICAgICAgICBpZiAocGFydGljbGUuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICAgewotICAgICAgICAgIG93bmVyID0gbnVsbDsKLSAgICAgICAgICBuZXdNb2RlbEdyb3VwID0gY3JlYXRlTW9kZWxHcm91cCgpOwotICAgICAgICAgIFhTRE1vZGVsR3JvdXAgbmV3UGFyZW50ID0gKFhTRE1vZGVsR3JvdXApcGFydGljbGUuZ2V0Q29udGVudCgpOwotICAgICAgICAgIG5ld1BhcmVudC5nZXRDb250ZW50cygpLmFkZChuZXdNb2RlbEdyb3VwLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cERlZmluaXRpb24gPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pcGFyZW50OwotICAgICAgb3duZXIgPSBudWxsOwotICAgICAgbmV3TW9kZWxHcm91cCA9IGNyZWF0ZU1vZGVsR3JvdXAoKTsKLSAgICAgIGlmIChtb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRNb2RlbEdyb3VwKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgWFNETW9kZWxHcm91cCBuZXdQYXJlbnQgPSBtb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRNb2RlbEdyb3VwKCk7Ci0gICAgICAgIG5ld1BhcmVudC5nZXRDb250ZW50cygpLmFkZChuZXdNb2RlbEdyb3VwLmdldENvbnRhaW5lcigpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbW9kZWxHcm91cERlZmluaXRpb24uc2V0TW9kZWxHcm91cChuZXdNb2RlbEdyb3VwKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG93bmVyOwotICB9Ci0gIAotCi0gIHByb3RlY3RlZCBib29sZWFuIGFkb3B0KFhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgWFNETW9kZWxHcm91cCBjcmVhdGVNb2RlbEdyb3VwKCkKLSAgewotICAgIAotICAgIFhTREZhY3RvcnkgZmFjdG9yeSA9IFhTRFNjaGVtYUJ1aWxkaW5nVG9vbHMuZ2V0WFNERmFjdG9yeSgpOwotICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gZmFjdG9yeS5jcmVhdGVYU0RQYXJ0aWNsZSgpOwotICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IGZhY3RvcnkuY3JlYXRlWFNETW9kZWxHcm91cCgpOwotICAgIG1vZGVsR3JvdXAuc2V0Q29tcG9zaXRvcih4c2RDb21wb3NpdG9yKTsKLSAgICBwYXJ0aWNsZS5zZXRDb250ZW50KG1vZGVsR3JvdXApOwotICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSBtb2RlbEdyb3VwOwotICAgIHJldHVybiBtb2RlbEdyb3VwOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTc4MmQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hQnVpbGRpbmdUb29sczsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgY2xhc3MgQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25Db21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50OwotICBib29sZWFuIGlzUmVmZXJlbmNlOwotCi0gIHB1YmxpYyBBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQsIGJvb2xlYW4gaXNSZWZlcmVuY2UpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgdGhpcy5pc1JlZmVyZW5jZSA9IGlzUmVmZXJlbmNlOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCNleGVjdXRlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBlbnN1cmVTY2hlbWFFbGVtZW50KChYU0RTY2hlbWEpcGFyZW50KTsKLSAgICB9Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBpZiAoIWlzUmVmZXJlbmNlKQotICAgICAgewotICAgICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBkZWYgPSBjcmVhdGVYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gZGVmOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBYU0RGYWN0b3J5IGZhY3RvcnkgPSBYU0RTY2hlbWFCdWlsZGluZ1Rvb2xzLmdldFhTREZhY3RvcnkoKTsKLSAgICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZGVmID0gZmFjdG9yeS5jcmVhdGVYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgICAgIHBhcnRpY2xlLnNldENvbnRlbnQoZGVmKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gcGFyZW50LmdldFNjaGVtYSgpLmdldE1vZGVsR3JvdXBEZWZpbml0aW9ucygpOwotICAgICAgICBpbnQgbGVuZ3RoID0gbGlzdC5zaXplKCk7Ci0gICAgICAgIGlmIChsZW5ndGggPiAxKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBnciA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZ3IuZ2V0TW9kZWxHcm91cCgpICE9IHBhcmVudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZGVmLnNldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oZ3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChsZW5ndGggPD0gMSkKLSAgICAgICAgewotICAgICAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG5ld0dyb3VwRGVmID0gY3JlYXRlWFNETW9kZWxHcm91cERlZmluaXRpb24oKTsKLSAgICAgICAgICBkZWYuc2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbihuZXdHcm91cERlZik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICAgewotICAgICAgICAgICgoWFNETW9kZWxHcm91cCkgcGFyZW50KS5nZXRDb250ZW50cygpLmFkZChwYXJ0aWNsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9ybWF0Q2hpbGQoZGVmLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSBkZWY7Ci0gICAgICB9Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNETW9kZWxHcm91cERlZmluaXRpb24gY3JlYXRlWFNETW9kZWxHcm91cERlZmluaXRpb24oKQotICB7Ci0gICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0gICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZGVmID0gZmFjdG9yeS5jcmVhdGVYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotICAgIExpc3QgbGlzdCA9IHBhcmVudC5nZXRTY2hlbWEoKS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKTsKLSAgICBTdHJpbmcgbmV3TmFtZSA9IFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoIk5ld0dyb3VwRGVmaW5pdGlvbiIsIGxpc3QpOyAvLyROT04tTkxTLTEkCi0gICAgZGVmLnNldE5hbWUobmV3TmFtZSk7Ci0KLSAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSBjcmVhdGVNb2RlbEdyb3VwKCk7Ci0gICAgZGVmLnNldE1vZGVsR3JvdXAobW9kZWxHcm91cCk7Ci0gICAgVGV4dCB0ZXh0Tm9kZSA9IHBhcmVudC5nZXRTY2hlbWEoKS5nZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgcGFyZW50LmdldFNjaGVtYSgpLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgcGFyZW50LmdldFNjaGVtYSgpLmdldENvbnRlbnRzKCkuYWRkKGRlZik7Ci0gICAgZm9ybWF0Q2hpbGQoZGVmLmdldEVsZW1lbnQoKSk7Ci0gICAgcmV0dXJuIGRlZjsKLSAgfQotCi0gIHByb3RlY3RlZCBYU0RNb2RlbEdyb3VwIGNyZWF0ZU1vZGVsR3JvdXAoKQotICB7Ci0gICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0gICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBmYWN0b3J5LmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gZmFjdG9yeS5jcmVhdGVYU0RNb2RlbEdyb3VwKCk7Ci0gICAgbW9kZWxHcm91cC5zZXRDb21wb3NpdG9yKFhTRENvbXBvc2l0b3IuU0VRVUVOQ0VfTElURVJBTCk7Ci0gICAgcGFydGljbGUuc2V0Q29udGVudChtb2RlbEdyb3VwKTsKLQotICAgIHJldHVybiBtb2RlbEdyb3VwOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRFJlZGVmaW5lQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEUmVkZWZpbmVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZmQzNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEUmVkZWZpbmVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEFkZFhTRFJlZGVmaW5lQ29tbWFuZCBleHRlbmRzIEFkZFhTRFNjaGVtYURpcmVjdGl2ZUNvbW1hbmQKLXsKLSAgcHVibGljIEFkZFhTRFJlZGVmaW5lQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSBzY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBBZGQgdGhpcyBhZnRlciBpZiB3ZSBkb24ndCBoYXZlIGEgRE9NIE5vZGUgeWV0Ci0gICAgICBiZWdpblJlY29yZGluZyh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICAgIFhTRFJlZGVmaW5lIHhzZFJlZGVmaW5lID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEUmVkZWZpbmUoKTsKLSAgICAgIHhzZFJlZGVmaW5lLnNldFNjaGVtYUxvY2F0aW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgeHNkU2NoZW1hLmdldENvbnRlbnRzKCkuYWRkKGZpbmROZXh0UG9zaXRpb25Ub0luc2VydCgpLCB4c2RSZWRlZmluZSk7Ci0gICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0geHNkUmVkZWZpbmU7Ci0gICAgICBmb3JtYXRDaGlsZCh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRFNjaGVtYURpcmVjdGl2ZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRFNjaGVtYURpcmVjdGl2ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmOTAwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RTY2hlbWFEaXJlY3RpdmVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWRkWFNEU2NoZW1hRGlyZWN0aXZlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICAKLSAgcHVibGljIEFkZFhTRFNjaGVtYURpcmVjdGl2ZUNvbW1hbmQoU3RyaW5nIGxhYmVsKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdW5kbygpCi0gIHsKLSAgICBzdXBlci51bmRvKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBhZG9wdChYU0RDb25jcmV0ZUNvbXBvbmVudCBtb2RlbCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGludCBmaW5kTmV4dFBvc2l0aW9uVG9JbnNlcnQoKQotICB7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZSkKLSAgICAgIHsKLSAgICAgICAgaW5kZXggKys7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaW5kZXg7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIGVuc3VyZVNjaGVtYUVsZW1lbnQoeHNkU2NoZW1hKTsKLSB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2FiYmVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudDsKLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gY3JlYXRlZFNpbXBsZVR5cGU7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWVUb0FkZDsKLSAgCi0gIHB1YmxpYyBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lVG9BZGQoU3RyaW5nIG5hbWVUb0FkZCkKLSAgewotICAgIHRoaXMubmFtZVRvQWRkID0gbmFtZVRvQWRkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgewotICAgICAgZW5zdXJlU2NoZW1hRWxlbWVudCgoWFNEU2NoZW1hKXBhcmVudCk7Ci0gICAgfQotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHBhcmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZURlZiA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICB0eXBlRGVmLnNldEJhc2VUeXBlRGVmaW5pdGlvbihwYXJlbnQuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgInN0cmluZyIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgICAgewotICAgICAgICB0eXBlRGVmLnNldE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZShuYW1lVG9BZGQgPT0gbnVsbCA/ICJOZXdTaW1wbGVUeXBlIiA6IG5hbWVUb0FkZCwgKChYU0RTY2hlbWEpIHBhcmVudCkuZ2V0VHlwZURlZmluaXRpb25zKCkpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjcmVhdGVkU2ltcGxlVHlwZSA9IHR5cGVEZWY7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IChYU0RTY2hlbWEpIHBhcmVudDsKLSAgICAgICAgICBUZXh0IHRleHROb2RlID0geHNkU2NoZW1hLmdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoIlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKHRleHROb2RlKTsKLSAgICAgICAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQodHlwZURlZik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgcGFyZW50KS5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbih0eXBlRGVmKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICAoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBwYXJlbnQpLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKHR5cGVEZWYpOwotICAgICAgfQotICAgICAgZm9ybWF0Q2hpbGQoY3JlYXRlZFNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpKTsKLQotICAgICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IGNyZWF0ZWRTaW1wbGVUeXBlOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGdldENyZWF0ZWRTaW1wbGVUeXBlKCkKLSAgewotICAgIHJldHVybiBjcmVhdGVkU2ltcGxlVHlwZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQmFzZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0Jhc2VDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYmNhNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQmFzZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgY2xhc3MgQmFzZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUwgPSAieG1sIjsgLy8kTk9OLU5MUy0xJAotCi0gIFhTRENvbmNyZXRlQ29tcG9uZW50IGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0KLSAgcHVibGljIEJhc2VDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgQmFzZUNvbW1hbmQoU3RyaW5nIGxhYmVsKQotICB7Ci0gICAgLy8gQ29tbWFuZHMgaW5oZXJpdCB0aGVpciBuYW1lIGZyb20gdGhlIGFzc29jaWF0ZWQgYWN0aW9uLgotICAgIC8vIFRoaXMgbGFiZWwgc2hvd3MgdXAgaW4gdGhlIHVuZG8gbWVudSBhbmQgaXQgd291bGQgbG9vayB1Z2x5IHdpdGggdGhlIG1uZW1vbmljIGluIGl0LgotICAgIC8vIElkZWFsbHksIHdlJ2QgaGF2ZSBzZXBhcmF0ZSBzdHJpbmdzLgotCi0gICAgc3VwZXIobGFiZWwucmVwbGFjZUZpcnN0KCImIiwgIiIpKTsKLSAgfQotICAKLSAgcHVibGljIFhTRENvbmNyZXRlQ29tcG9uZW50IGdldEFkZGVkQ29tcG9uZW50KCkKLSAgewotICAgIHJldHVybiBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50OwotICB9Ci0gIAotICBJRE9NTm9kZSBkb21Ob2RlOwotICBwcm90ZWN0ZWQgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgZWxlbWVudCkgewotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgZG9tTm9kZSA9IChJRE9NTm9kZSkgZWxlbWVudDsgCi0gICAgICBkb21Ob2RlLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZW5kUmVjb3JkaW5nKCkKLSAgewotICAgIGlmIChkb21Ob2RlICE9IG51bGwpCi0gICAgICBkb21Ob2RlLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLSAgICByZXR1cm4gZ2V0TGFiZWwoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGZvcm1hdENoaWxkKEVsZW1lbnQgY2hpbGQpCi0gIHsKLSAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICBJRE9NTW9kZWwgbW9kZWwgPSAoKElET01Ob2RlKWNoaWxkKS5nZXRNb2RlbCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAgIG1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotICAgICAgICAKLSAgICAgICAgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotICAgICAgICBmb3JtYXRQcm9jZXNzb3IuZm9ybWF0Tm9kZShjaGlsZCk7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICBtb2RlbC5jaGFuZ2VkTW9kZWwoKTsgCi0gICAgICB9Ci0gICAgfQotICB9Ci0gCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBlbnN1cmVTY2hlbWFFbGVtZW50KFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBEb2N1bWVudCBkb2N1bWVudCA9IHNjaGVtYS5nZXREb2N1bWVudCgpOwotICAgIAotICAgIEVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCi0gICAgaWYgKHNjaGVtYUVsZW1lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZ2V0RGVmYXVsdE5hbWVzcGFjZShzY2hlbWEpOwotICAgICAgc2NoZW1hLnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgTWFwIHFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAgPSBzY2hlbWEuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotICAgICAgcU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcC5wdXQoInRucyIsIHRhcmdldE5hbWVzcGFjZSk7ICAgICAgCi0gICAgICBpZiAoWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5pc1F1YWxpZnlYTUxTY2hlbWFMYW5ndWFnZSgpKQotICAgICAgewotICAgICAgICBTdHJpbmcgcHJlZml4ID0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRYTUxTY2hlbWFQcmVmaXgoKTsKLSAgICAgICAgc2NoZW1hLnNldFNjaGVtYUZvclNjaGVtYVFOYW1lUHJlZml4KHByZWZpeCk7Ci0gICAgICAgIHFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAucHV0KHByZWZpeCwgWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcC5wdXQobnVsbCwgWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsgICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgc2NoZW1hLnVwZGF0ZUVsZW1lbnQoKTsKLSAgICAgIGVuc3VyZVhNTERpcmVjdGl2ZShkb2N1bWVudCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbnN1cmVYTUxEaXJlY3RpdmUoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBpZiAoaGFzWE1MRGlyZWN0aXZlKGRvY3VtZW50KSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIE5vZGUgZmlyc3RDaGlsZCA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24geG1sRGVjbGFyYXRpb24gPSBnZXRYTUxEZWNsYXJhdGlvbihkb2N1bWVudCk7Ci0gICAgZG9jdW1lbnQuaW5zZXJ0QmVmb3JlKHhtbERlY2xhcmF0aW9uLCBmaXJzdENoaWxkKTsKLSAgICBUZXh0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKTsKLSAgICBkb2N1bWVudC5pbnNlcnRCZWZvcmUodGV4dE5vZGUsIGZpcnN0Q2hpbGQpOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1hNTERpcmVjdGl2ZShEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIE5vZGUgZmlyc3RDaGlsZCA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgIAotICAgIGlmIChmaXJzdENoaWxkID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAoZmlyc3RDaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHByb2Nlc3NpbmdJbnN0cnVjdGlvbiAgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uKWZpcnN0Q2hpbGQ7Ci0gICAgCi0gICAgaWYgKCFYTUwuZXF1YWxzKHByb2Nlc3NpbmdJbnN0cnVjdGlvbi5nZXRUYXJnZXQoKSkpIAotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gZ2V0WE1MRGVjbGFyYXRpb24oRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLSAgICBTdHJpbmcgY2hhclNldCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLSAgICBpZiAoY2hhclNldCA9PSBudWxsIHx8IGNoYXJTZXQudHJpbSgpLmVxdWFscygiIikpCi0gICAgewotICAgICAgY2hhclNldCA9ICJVVEYtOCI7Ci0gICAgfQotICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiB4bWxEZWNsYXJhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihYTUwsICJ2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiICsgY2hhclNldCArICJcIiIpOwotICAgIHJldHVybiB4bWxEZWNsYXJhdGlvbjsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHROYW1lc3BhY2UoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFhNTFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgaWYgKCFuYW1lc3BhY2UuZW5kc1dpdGgoIi8iKSkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSBuYW1lc3BhY2UuY29uY2F0KCIvIik7Ci0gICAgfQotCi0gICAgbmFtZXNwYWNlICs9IGdldEZpbGVOYW1lKHNjaGVtYSkgKyAiLyI7Ci0KLSAgICByZXR1cm4gbmFtZXNwYWNlOwotCi0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZShYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgVVJJIHNjaGVtYVVSSSA9IHNjaGVtYS5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLSAgICBJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKHNjaGVtYVVSSS50b1N0cmluZygpKTsKLSAgICByZXR1cm4gZmlsZVBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCkudG9TdHJpbmcoKTsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9DaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0NoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjEwZDhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0NoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNERmVhdHVyZSBwYXJlbnQ7Ci0gIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGFub255bW91c1NpbXBsZVR5cGU7Ci0gIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGN1cnJlbnRUeXBlOwotCi0gIHB1YmxpYyBDaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RGZWF0dXJlIHBhcmVudCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLQotLy8gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLS8vICAgIHsKLS8vICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBwYXJlbnQ7Ci0vLyAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGFUeXBlID0gZWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0vLwotLy8gICAgICBpZiAoYVR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLS8vICAgICAgewotLy8gICAgICAgIGN1cnJlbnRUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBhVHlwZTsKLS8vICAgICAgfQotLy8gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLS8vICAgIGFub255bW91c1NpbXBsZVR5cGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbigpOwotLy8gICAgYW5vbnltb3VzU2ltcGxlVHlwZS5zZXRCYXNlVHlwZURlZmluaXRpb24oY3VycmVudFR5cGUpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHBhcmVudC5nZXRFbGVtZW50KCkpOwotCi0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgcGFyZW50KS5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbihhbm9ueW1vdXNTaW1wbGVUeXBlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICAoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBwYXJlbnQpLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKGFub255bW91c1NpbXBsZVR5cGUpOwotICAgICAgfQotICAgICAgZm9ybWF0Q2hpbGQocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9ICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRBbm9ueW1vdXNTaW1wbGVUeXBlKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGFub255bW91c1NpbXBsZVR5cGUpCi0gIHsKLSAgICB0aGlzLmFub255bW91c1NpbXBsZVR5cGUgPSBhbm9ueW1vdXNTaW1wbGVUeXBlOwotICB9Ci0KLSAgcHVibGljIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGdldEFub255bW91c1R5cGUoKQotICB7Ci0gICAgaWYgKGFub255bW91c1NpbXBsZVR5cGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oKTsKLSAgICAgIGFub255bW91c1NpbXBsZVR5cGUuc2V0QmFzZVR5cGVEZWZpbml0aW9uKGN1cnJlbnRUeXBlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFub255bW91c1NpbXBsZVR5cGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0RlbGV0ZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0RlbGV0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljYzgzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9EZWxldGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0REaXJlY3RpdmVzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVudW1lcmF0aW9uRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBEZWxldGVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgdGFyZ2V0OwotCi0gIHB1YmxpYyBEZWxldGVDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29uY3JldGVDb21wb25lbnQgdGFyZ2V0KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICB9Ci0gIAotICBwdWJsaWMgRGVsZXRlQ29tbWFuZChYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQpCi0gIHsKLSAgICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX0RFTEVURSk7Ci0gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIFhTRFZpc2l0b3IgdmlzaXRvciA9IG5ldyBYU0RWaXNpdG9yKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChlbGVtZW50LmdldFR5cGVEZWZpbml0aW9uKCkgPT0gdGFyZ2V0KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZSA9IHRhcmdldC5nZXRTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oInN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgZWxlbWVudC5zZXRUeXBlRGVmaW5pdGlvbih0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci52aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gdGFyZ2V0LmdldENvbnRhaW5lcigpOwotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSB0YXJnZXQuZ2V0U2NoZW1hKCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIGJvb2xlYW4gZG9DbGVhbnVwID0gZmFsc2U7Ci0gICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCB8fCB0YXJnZXQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24gfHwgdGFyZ2V0IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGRvQ2xlYW51cCA9IHRydWU7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChwYXJlbnQuZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwKSAoKFhTRFBhcnRpY2xlKSBwYXJlbnQpLmdldENvbnRhaW5lcigpOwotCi0gICAgICAgICAgICBtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkucmVtb3ZlKHBhcmVudCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHBhcmVudC5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBwYXJlbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgICAgICBjb21wbGV4VHlwZS5zZXRDb250ZW50KG51bGwpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdG9yLnZpc2l0U2NoZW1hKHRhcmdldC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgKChYU0RTY2hlbWEpIHBhcmVudCkuZ2V0Q29udGVudHMoKS5yZW1vdmUodGFyZ2V0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICAgICAgewotICAgICAgICAJT2JqZWN0IGFkYXB0ZXIgPSB0YXJnZXQuZUFkYXB0ZXJzKCkuZ2V0KDApOwotICAgICAgICAJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgCSAoKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcikgYWRhcHRlcikuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0gICAgICAgICAgCSAoKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcikgYWRhcHRlcikuc2V0Q2hhbmdlUmVhZE9ubHlGaWVsZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAoKFhTRFJlZGVmaW5lKSBwYXJlbnQpLmdldENvbnRlbnRzKCkucmVtb3ZlKHRhcmdldCk7Ci0gICAgICAgIH0gICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBkb0NsZWFudXAgPSB0cnVlOwotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgICB7Ci0gICAgICAgICAgRU9iamVjdCBvYmogPSBwYXJlbnQuZUNvbnRhaW5lcigpOwotICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IG51bGw7Ci0gICAgICAgICAgd2hpbGUgKG9iaiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNvbXBsZXhUeXBlID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgb2JqOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9iaiA9IG9iai5lQ29udGFpbmVyKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChjb21wbGV4VHlwZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbXBsZXhUeXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkucmVtb3ZlKHBhcmVudCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKHBhcmVudC5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgcGFyZW50LmdldENvbnRhaW5lcigpOwotCi0gICAgICAgICAgICBhdHRyR3JvdXAuZ2V0Q29udGVudHMoKS5yZW1vdmUocGFyZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRvci52aXNpdFNjaGVtYSh0YXJnZXQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgICgoWFNEU2NoZW1hKSBwYXJlbnQpLmdldENvbnRlbnRzKCkucmVtb3ZlKHRhcmdldCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiAmJiBwYXJlbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGRvQ2xlYW51cCA9IHRydWU7Ci0gICAgICAgICgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBwYXJlbnQpLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkucmVtb3ZlKHRhcmdldCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotICAgICAgewotICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1lcmF0aW9uRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCkgdGFyZ2V0OwotICAgICAgICBlbnVtZXJhdGlvbkZhY2V0LmdldFNpbXBsZVR5cGVEZWZpbml0aW9uKCkuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShlbnVtZXJhdGlvbkZhY2V0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgICAgewotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocGFyZW50LmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cCkgKChYU0RQYXJ0aWNsZSkgcGFyZW50KS5nZXRDb250YWluZXIoKTsKLSAgICAgICAgICAgIG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5yZW1vdmUocGFyZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHBhcmVudCkuc2V0QXR0cmlidXRlV2lsZGNhcmRDb250ZW50KG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgICgoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBwYXJlbnQpLnNldEF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudChudWxsKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24gJiYgcGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBkb0NsZWFudXAgPSB0cnVlOwotICAgICAgICAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgcGFyZW50KS5zZXRUeXBlRGVmaW5pdGlvbih0YXJnZXQucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgInN0cmluZyIpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgICAgewotICAgICAgICAgIGRvQ2xlYW51cCA9IHRydWU7Ci0gICAgICAgICAgdmlzaXRvci52aXNpdFNjaGVtYSh0YXJnZXQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgICgoWFNEU2NoZW1hKSBwYXJlbnQpLmdldENvbnRlbnRzKCkucmVtb3ZlKHRhcmdldCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICAgICAgewotICAgICAgICAgIGRvQ2xlYW51cCA9IGZhbHNlOwotICAgICAgICAgIEVMaXN0IGNvbnRlbnRzID0gKChYU0RSZWRlZmluZSlwYXJlbnQpLmdldENvbnRlbnRzKCk7ICAgIAotICAgICAgICAgIE9iamVjdCBhZGFwdGVyID0gdGFyZ2V0LmVBZGFwdGVycygpLmdldCgwKTsKLSAgICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpCi0gICAgICAgICAgewotICAgICAgICAJICAKLSAgICAgICAgCSAoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpIGFkYXB0ZXIpLnNldFJlYWRPbmx5KHRydWUpOwotICAgICAgICAJICgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcikgYWRhcHRlcikuc2V0Q2hhbmdlUmVhZE9ubHlGaWVsZCh0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcikKLSAgICAgICAgICB7Ci0gICAgICAgIAkgIAotICAgICAgICAJICgoWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyKSBhZGFwdGVyKS5zZXRSZWFkT25seSh0cnVlKTsKLSAgICAgICAgCSAoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcikgYWRhcHRlcikuc2V0Q2hhbmdlUmVhZE9ubHlGaWVsZCh0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpCi0gICAgICAgICAgewotICAgICAgICAJICAKLSAgICAgICAgCSAoKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpIGFkYXB0ZXIpLnNldFJlYWRPbmx5KHRydWUpOwotICAgICAgICAJICgoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcikgYWRhcHRlcikuc2V0Q2hhbmdlUmVhZE9ubHlGaWVsZCh0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29udGVudHMucmVtb3ZlKHRhcmdldCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKGRvQ2xlYW51cCkKLSAgICAgICAgWFNERGlyZWN0aXZlc01hbmFnZXIucmVtb3ZlVW51c2VkWFNESW1wb3J0cyhzY2hlbWEpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9FeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNlNGM3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9FeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQgZXh0ZW5kcyBBZGRFeHRlbnNpb25Db21tYW5kCi17Ci0gIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudDsKLSAgcHJvdGVjdGVkIEVsZW1lbnQgYXBwSW5mbzsKLSAgcHJvdGVjdGVkIEVsZW1lbnQgbmV3RWxlbWVudDsKLQotICBwdWJsaWMgRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQoU3RyaW5nIGxhYmVsKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICB9Ci0KLSAgcHVibGljIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb25FbGVtZW50KCkKLSAgewotICAgIHJldHVybiBlbGVtZW50OwotICB9Ci0gIAotICBwdWJsaWMgRWxlbWVudCBnZXROZXdFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgZ2V0QXBwSW5mbygpCi0gIHsKLSAgICByZXR1cm4gYXBwSW5mbzsKLSAgfQotICAKLSAgcHVibGljIFhTRFNjaGVtYSBnZXRYU0RTY2hlbWEoKQotICB7Ci0gICAgcmV0dXJuIGNvbXBvbmVudC5nZXRTY2hlbWEoKTsgICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dHMoWFNEQ29uY3JldGVDb21wb25lbnQgaW5wdXQsIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICB7Ci0gICAgdGhpcy5jb21wb25lbnQgPSBpbnB1dDsKLSAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICB9Ci0gIAotICBwdWJsaWMgWFNEQW5ub3RhdGlvbiBnZXRYU0RBbm5vdGF0aW9uKCkKLSAgewotICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RBbm5vdGF0aW9uIHhzZEFubm90YXRpb24gPSBYU0RDb21tb25VSVV0aWxzLmdldElucHV0WFNEQW5ub3RhdGlvbihjb21wb25lbnQsIGZhbHNlKTsKLSAgICAgIHJldHVybiB4c2RBbm5vdGF0aW9uOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoY29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBzdXBlci5leGVjdXRlKCk7Ci0gICAgICBkb1ByZXByb2Nlc3NpbmcoKTsKLSAgICAgIGFkZEV4dGVuc2lvbk5vZGUoKTsKLSAgICAgIGRvQ3VzdG9taXplZEFjdGlvbnMoKTsKLSAgICAgIAotICAgICAgZm9ybWF0Q2hpbGQoY29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGRvUHJlcHJvY2Vzc2luZygpCi0gIHsKLSAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgYWRkRXh0ZW5zaW9uTm9kZSgpCi0gIHsKLSAgICBYU0RBbm5vdGF0aW9uIHhzZEFubm90YXRpb24gPSBYU0RDb21tb25VSVV0aWxzLmdldElucHV0WFNEQW5ub3RhdGlvbihjb21wb25lbnQsIHRydWUpOwotICAgIFhTRFNjaGVtYSBzY2hlbWE9IHhzZEFubm90YXRpb24uZ2V0U2NoZW1hKCk7Ci0gICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gc2NoZW1hLmdldEVsZW1lbnQoKTsKLQotICAgIGlmICh4c2RBbm5vdGF0aW9uLmdldEFwcGxpY2F0aW9uSW5mb3JtYXRpb24oKS5zaXplKCkgPT0gMCkKLSAgICB7Ci0gICAgICBhcHBJbmZvID0geHNkQW5ub3RhdGlvbi5jcmVhdGVBcHBsaWNhdGlvbkluZm9ybWF0aW9uKG51bGwpOwotICAgICAgeHNkQW5ub3RhdGlvbi5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoYXBwSW5mbyk7Ci0gICAgICBMaXN0IGFwcEluZm9zID0geHNkQW5ub3RhdGlvbi5nZXRBcHBsaWNhdGlvbkluZm9ybWF0aW9uKCk7Ci0gICAgICBhcHBJbmZvcy5hZGQoYXBwSW5mbyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyB1c2UgdGhlIGZpcnN0IGFwcEluZm8KLSAgICAgIGFwcEluZm8gPSAoRWxlbWVudCl4c2RBbm5vdGF0aW9uLmdldEFwcGxpY2F0aW9uSW5mb3JtYXRpb24oKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgaWYgKGFwcEluZm8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEb2N1bWVudCBkb2MgPSBhcHBJbmZvLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBhZGRUb05hbWVzcGFjZVRhYmxlKHNjaGVtYUVsZW1lbnQpOwotICAgICAgbmV3RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50TlMoZXh0ZW5zaW9uc1NjaGVtYVNwZWMuZ2V0TmFtZXNwYWNlVVJJKCksIGVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgIG5ld0VsZW1lbnQuc2V0UHJlZml4KHByZWZpeCk7ICAgCi0gICAgICBhcHBJbmZvLmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpOwotCi0gICAgICB4c2RBbm5vdGF0aW9uLnVwZGF0ZUVsZW1lbnQoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgYWRkVG9OYW1lc3BhY2VUYWJsZShFbGVtZW50IHNjaGVtYUVsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25JZlJlcXVpcmVkKHNjaGVtYUVsZW1lbnQsICJwIiwgZXh0ZW5zaW9uc1NjaGVtYVNwZWMuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIHJldHVybiBwcmVmaXg7Ci0gIH0KLQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZG9DdXN0b21pemVkQWN0aW9ucygpCi0gIHsKLSAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgdW5kbygpCi0gIHsKLSAgICBzdXBlci51bmRvKCk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpCi0gIHsKLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotICAKLSAgLy8gVE9ETy4uLiBjb21tb24gdGhpcyB1cCB3aXRoIHdzZGwudWkKLSAgcHJvdGVjdGVkIFN0cmluZyBhZGROYW1lc3BhY2VEZWNsYXJhdGlvbklmUmVxdWlyZWQoRWxlbWVudCBzY2hlbWFFbGVtZW50LCBTdHJpbmcgcHJlZml4SGludCwgU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIFN0cmluZyBwcmVmaXggPSBudWxsOyAgICAgIAotICAgIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlID0gbmV3IE5hbWVzcGFjZVRhYmxlKHNjaGVtYUVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50KHNjaGVtYUVsZW1lbnQpOwotICAgIHByZWZpeCA9IG5hbWVzcGFjZVRhYmxlLmdldFByZWZpeEZvclVSSShuYW1lc3BhY2UpOwotICAgIGlmIChwcmVmaXggPT0gbnVsbCkKLSAgICB7IAotICAgICAgU3RyaW5nIGJhc2VQcmVmaXggPSBwcmVmaXhIaW50OwotICAgICAgcHJlZml4ID0gYmFzZVByZWZpeDsKLSAgICAgIFN0cmluZyB4bWxuc0NvbG9uID0gInhtbG5zOiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0geG1sbnNDb2xvbiArIHByZWZpeDsKLSAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICB3aGlsZSAoc2NoZW1hRWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICAgIHByZWZpeCA9IGJhc2VQcmVmaXggKyBjb3VudDsKLSAgICAgICAgYXR0cmlidXRlTmFtZSA9IHhtbG5zQ29sb24gKyBwcmVmaXg7Ci0gICAgICB9ICAgICAgCi0gICAgICBzY2hlbWFFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBuYW1lc3BhY2UpOyAgCi0gICAgfSAgICAKLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBhZGRTY2hlbWFBdHRyaWJ1dGUoRWxlbWVudCBzY2hlbWFFbGVtZW50LCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlKQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoc2NoZW1hRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoc2NoZW1hRWxlbWVudCk7Ci0gICAgcHJlZml4ID0gbmFtZXNwYWNlVGFibGUuZ2V0UHJlZml4Rm9yVVJJKG5hbWVzcGFjZSk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHByZWZpeCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoc2NoZW1hRWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKHByZWZpeCArICI6IiArIGF0dHJpYnV0ZU5hbWUpID09IG51bGwpCi0gICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGUocHJlZml4ICsgIjoiICsgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOyAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChzY2hlbWFFbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoYXR0cmlidXRlTmFtZSkgPT0gbnVsbCkKLSAgICAgICAgICBzY2hlbWFFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRTb3VyY2VBdHRyaWJ1dGVUb0FwcEluZm8oU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIGlmIChhcHBJbmZvLmdldEF0dHJpYnV0ZU5vZGUoWFNEQ29uc3RhbnRzLlNPVVJDRV9BVFRSSUJVVEUpID09IG51bGwpCi0gICAgICBhcHBJbmZvLnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuU09VUkNFX0FUVFJJQlVURSwgbmFtZXNwYWNlKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudAotICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZQotICAgKiBAcGFyYW0gYXR0cmlidXRlVmFsdWUKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgYXR0cmlidXRlVmFsdWUpCi0gIHsKLSAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0V4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvRXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNWZmMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvRXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIE5vZGUgbm9kZTsKLSAgcHJvdGVjdGVkIFhTRENvbmNyZXRlQ29tcG9uZW50IGlucHV0OwotICAKLSAgcHVibGljIEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZChTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE5vZGUoTm9kZSBub2RlKQotICB7Ci0gICAgdGhpcy5ub2RlID0gbm9kZTsKLSAgfQotCi0gIHB1YmxpYyBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gaW5wdXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChYU0RDb25jcmV0ZUNvbXBvbmVudCBpbnB1dCkKLSAgewotICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgc3VwZXIuZXhlY3V0ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKG5vZGUpOwotICAgICAgCi0gICAgICBkb1ByZXByb2Nlc3NpbmcoKTsKLSAgICAgIAotICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotICAgICAgewotICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cikgbm9kZTsKLSAgICAgICAgYXR0ci5nZXRPd25lckVsZW1lbnQoKS5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICBOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2Uobm9kZSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKFhTRERPTUhlbHBlci5oYXNPbmx5V2hpdGVzcGFjZShwYXJlbnQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChYU0RDb25zdGFudHMuQVBQSU5GT19FTEVNRU5UX1RBRy5lcXVhbHMocGFyZW50LmdldExvY2FsTmFtZSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKHBhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGRvQ3VzdG9taXplZEFjdGlvbnMoKTsKLQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZG9QcmVwcm9jZXNzaW5nKCkKLSAgewotICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBkb0N1c3RvbWl6ZWRBY3Rpb25zKCkKLSAgewotICAgCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvUmVkZWZpbmVBdHRyaWJ1dGVHcm91cENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlZGVmaW5lQXR0cmlidXRlR3JvdXBDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNDczYjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvUmVkZWZpbmVBdHRyaWJ1dGVHcm91cENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmFibGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotCi0KLS8qKgotICogQ3JlYXRlcyBhIHJlZGVmaW5lZCBhdHRyaWJ1dGUgZ3JvdXAgYmFzZWQgb24gdGhlIGlucHV0IGF0dHJpYnV0ZSBncm91cCBhbmQgYWRkcyBpdCB0byB0aGUgcGFyZW50IHJlZGVmaW5lLgotICovCi1wdWJsaWMgY2xhc3MgUmVkZWZpbmVBdHRyaWJ1dGVHcm91cENvbW1hbmQgZXh0ZW5kcyBBZGRSZWRlZmluZWRDb21wb25lbnRDb21tYW5kCi17Ci0gIHB1YmxpYyBSZWRlZmluZUF0dHJpYnV0ZUdyb3VwQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFJlZGVmaW5lIHJlZGVmaW5lLCBYU0RSZWRlZmluYWJsZUNvbXBvbmVudCByZWRlZmluYWJsZUNvbXBvbmVudCkKLSAgewotICAgIHN1cGVyKGxhYmVsLCByZWRlZmluZSwgcmVkZWZpbmFibGVDb21wb25lbnQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkKLSAgewotICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiByZWRlZmluZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKTsKLSAgICByZWRlZmluZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24uc2V0TmFtZShyZWRlZmluYWJsZUNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSByZWRlZmluZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlZGVmaW5lQ29tcGxleFR5cGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZWRlZmluZUNvbXBsZXhUeXBlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGRhZDUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlZGVmaW5lQ29tcGxleFR5cGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRERlcml2YXRpb25NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLQotCi0vKioKLSAqIENyZWF0ZXMgYSByZWRlZmluZWQgY29tcGxleCB0eXBlIGJhc2VkIG9uIHRoZSBpbnB1dCBjb21wbGV4IHR5cGUgYW5kIGFkZHMgaXQgdG8gdGhlIHBhcmVudCByZWRlZmluZS4KLSAqLwotcHVibGljIGNsYXNzIFJlZGVmaW5lQ29tcGxleFR5cGVDb21tYW5kIGV4dGVuZHMgQWRkUmVkZWZpbmVkQ29tcG9uZW50Q29tbWFuZAotewotICBwdWJsaWMgUmVkZWZpbmVDb21wbGV4VHlwZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RSZWRlZmluZSByZWRlZmluZSwgWFNEUmVkZWZpbmFibGVDb21wb25lbnQgcmVkZWZpbmFibGVDb21wb25lbnQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCwgcmVkZWZpbmUsIHJlZGVmaW5hYmxlQ29tcG9uZW50KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpCi0gIHsKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gcmVkZWZpbmVkQ29tcGxleFR5cGVEZWZpbml0aW9uID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgcmVkZWZpbmVkQ29tcGxleFR5cGVEZWZpbml0aW9uLnNldE5hbWUocmVkZWZpbmFibGVDb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICByZWRlZmluZWRDb21wbGV4VHlwZURlZmluaXRpb24uc2V0Q29udGVudChYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKS5nZXRDb250ZW50KCkpOwotICAgIHJlZGVmaW5lZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5zZXREZXJpdmF0aW9uTWV0aG9kKFhTRERlcml2YXRpb25NZXRob2QuRVhURU5TSU9OX0xJVEVSQUwpOwotICAgIHJlZGVmaW5lZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5zZXRCYXNlVHlwZURlZmluaXRpb24oKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilyZWRlZmluYWJsZUNvbXBvbmVudCk7Ci0gICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IHJlZGVmaW5lZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlZGVmaW5lTW9kZWxHcm91cENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlZGVmaW5lTW9kZWxHcm91cENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM2NmVlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZWRlZmluZU1vZGVsR3JvdXBDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmFibGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotCi0KLS8qKgotICogQ3JlYXRlcyBhIHJlZGVmaW5lZCBtb2RlbCBncm91cCBiYXNlZCBvbiB0aGUgaW5wdXQgbW9kZWwgZ3JvdXAgYW5kIGFkZHMgaXQgdG8gdGhlIHBhcmVudCByZWRlZmluZS4KLSAqLwotcHVibGljIGNsYXNzIFJlZGVmaW5lTW9kZWxHcm91cENvbW1hbmQgZXh0ZW5kcyBBZGRSZWRlZmluZWRDb21wb25lbnRDb21tYW5kCi17Ci0KLSAgcHVibGljIFJlZGVmaW5lTW9kZWxHcm91cENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RSZWRlZmluZSByZWRlZmluZSwgWFNEUmVkZWZpbmFibGVDb21wb25lbnQgcmVkZWZpbmFibGVDb21wb25lbnQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCwgcmVkZWZpbmUsIHJlZGVmaW5hYmxlQ29tcG9uZW50KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSByZWRlZmluYWJsZUNvbXBvbmVudDsKLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiByZWRlZmluZWRNb2RlbEdyb3VwRGVmaW5pdGlvbiA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiltb2RlbEdyb3VwLmNsb25lQ29uY3JldGVDb21wb25lbnQodHJ1ZSwgZmFsc2UpOwotICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSByZWRlZmluZWRNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlZGVmaW5lU2ltcGxlVHlwZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlZGVmaW5lU2ltcGxlVHlwZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3NjVhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZWRlZmluZVNpbXBsZVR5cGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0KLQotLyoqCi0gKiBDcmVhdGVzIGEgcmVkZWZpbmVkIHNpbXBsZSB0eXBlIGJhc2VkIG9uIHRoZSBpbnB1dCBzaW1wbGUgdHlwZSBhbmQgYWRkcyBpdCB0byB0aGUgcGFyZW50IHJlZGVmaW5lLgotICovCi1wdWJsaWMgY2xhc3MgUmVkZWZpbmVTaW1wbGVUeXBlQ29tbWFuZCBleHRlbmRzIEFkZFJlZGVmaW5lZENvbXBvbmVudENvbW1hbmQKLXsKLSAgcHVibGljIFJlZGVmaW5lU2ltcGxlVHlwZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RSZWRlZmluZSByZWRlZmluZSwgWFNEUmVkZWZpbmFibGVDb21wb25lbnQgcmVkZWZpbmFibGVDb21wb25lbnQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCwgcmVkZWZpbmUsIHJlZGVmaW5hYmxlQ29tcG9uZW50KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiByZWRlZmluZWRTaW1wbGVUeXBlRGVmaW5pdGlvbiA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgcmVkZWZpbmVkU2ltcGxlVHlwZURlZmluaXRpb24uc2V0TmFtZShyZWRlZmluYWJsZUNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgIHJlZGVmaW5lZFNpbXBsZVR5cGVEZWZpbml0aW9uLnNldEJhc2VUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pcmVkZWZpbmFibGVDb21wb25lbnQpOwotICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSByZWRlZmluZWRTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlbW92ZUV4dGVuc2lvbkF0dHJpYnV0ZXJDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZW1vdmVFeHRlbnNpb25BdHRyaWJ1dGVyQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTczYTQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlbW92ZUV4dGVuc2lvbkF0dHJpYnV0ZXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZUV4dGVuc2lvbkF0dHJpYnV0ZXJDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCAKLXsKLQlFbGVtZW50IGhvc3RFbGVtZW50OwotCUF0dHIgYXR0cjsKLQkKLQlwdWJsaWMgUmVtb3ZlRXh0ZW5zaW9uQXR0cmlidXRlckNvbW1hbmQoU3RyaW5nIGxhYmVsLCBFbGVtZW50IGhvc3RFbGVtZW50LCBBdHRyIGF0dHIpCi0JewotCQlzdXBlcihsYWJlbCk7Ci0JCXRoaXMuaG9zdEVsZW1lbnQgPSBob3N0RWxlbWVudDsKLQkJdGhpcy5hdHRyID0gYXR0cjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0JewotCQlzdXBlci5leGVjdXRlKCk7Ci0JCWhvc3RFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVuZG8oKQotCXsKLQkJc3VwZXIudW5kbygpOwotCQkvL1RPRE8gaW1wbGVtZW50IG1lCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvUmVtb3ZlRXh0ZW5zaW9uRWxlbWVudENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlbW92ZUV4dGVuc2lvbkVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzM2M3NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvUmVtb3ZlRXh0ZW5zaW9uRWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZUV4dGVuc2lvbkVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZAotewotICBYU0RBbm5vdGF0aW9uIHhzZEFubm90YXRpb247Ci0gIE5vZGUgYXBwSW5mbzsKLQotICBwdWJsaWMgUmVtb3ZlRXh0ZW5zaW9uRWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RBbm5vdGF0aW9uIHhzZEFubm90YXRpb24sIE5vZGUgYXBwSW5mbykKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZEFubm90YXRpb24gPSB4c2RBbm5vdGF0aW9uOwotICAgIHRoaXMuYXBwSW5mbyA9IGFwcEluZm87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICB4c2RBbm5vdGF0aW9uLmdldEFwcGxpY2F0aW9uSW5mb3JtYXRpb24oKS5yZW1vdmUoYXBwSW5mbyk7Ci0gICAgeHNkQW5ub3RhdGlvbi5nZXRFbGVtZW50KCkucmVtb3ZlQ2hpbGQoYXBwSW5mbyk7Ci0gICAgeHNkQW5ub3RhdGlvbi51cGRhdGVFbGVtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgewotICAgIHN1cGVyLnVuZG8oKTsKLSAgICB4c2RBbm5vdGF0aW9uLmdldEFwcGxpY2F0aW9uSW5mb3JtYXRpb24oKS5hZGQoYXBwSW5mbyk7Ci0gICAgeHNkQW5ub3RhdGlvbi5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoYXBwSW5mbyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDExNjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIE5vZGUgbm9kZTsKLSAgCi0gIHB1YmxpYyBSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZChTdHJpbmcgbGFiZWwsIE5vZGUgbm9kZSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLm5vZGUgPSBub2RlOwotICB9ICAKLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhub2RlKTsKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpIG5vZGU7Ci0gICAgICAgIGF0dHIuZ2V0T3duZXJFbGVtZW50KCkucmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKG5vZGUpOwotICAgICAgICAgIAotICAgICAgICAgIGlmIChYU0RET01IZWxwZXIuaGFzT25seVdoaXRlc3BhY2UocGFyZW50KSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoWFNEQ29uc3RhbnRzLkFQUElORk9fRUxFTUVOVF9UQUcuZXF1YWxzKHBhcmVudC5nZXRMb2NhbE5hbWUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShwYXJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19ICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldEJhc2VUeXBlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRCYXNlVHlwZUFuZE1hbmFnZXJEaXJlY3RpdmVzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWM0N2NlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldEJhc2VUeXBlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0REaXJlY3RpdmVzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBTZXRCYXNlVHlwZUFuZE1hbmFnZXJEaXJlY3RpdmVzQ29tbWFuZCBleHRlbmRzIFVwZGF0ZVR5cGVSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZAotewotCi0gIHB1YmxpYyBTZXRCYXNlVHlwZUFuZE1hbmFnZXJEaXJlY3RpdmVzQ29tbWFuZChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIFN0cmluZyBjb21wb25lbnROYW1lc3BhY2UsIElGaWxlIGZpbGUpCi0gIHsKLSAgICBzdXBlcihjb25jcmV0ZUNvbXBvbmVudCwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZXNwYWNlLCBmaWxlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoY29uY3JldGVDb21wb25lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIFhTRENvbXBvbmVudCB0ZCA9IGNvbXB1dGVDb21wb25lbnQoKTsKLSAgICAgIGlmICh0ZCAhPSBudWxsICYmIHRkIGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFNldEJhc2VUeXBlQ29tbWFuZCBjb21tYW5kID0gbmV3IFNldEJhc2VUeXBlQ29tbWFuZChjb25jcmV0ZUNvbXBvbmVudCwgKFhTRFR5cGVEZWZpbml0aW9uKSB0ZCk7Ci0gICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICBYU0REaXJlY3RpdmVzTWFuYWdlci5yZW1vdmVVbnVzZWRYU0RJbXBvcnRzKGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRCYXNlVHlwZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldEJhc2VUeXBlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yjc0ZWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldEJhc2VUeXBlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRERlcml2YXRpb25NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVmFyaWV0eTsKLQotcHVibGljIGNsYXNzIFNldEJhc2VUeXBlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50OwotICBYU0RUeXBlRGVmaW5pdGlvbiBiYXNlVHlwZTsKLSAgWFNEQmFzZUFkYXB0ZXIgYWRhcHRlcjsKLSAgCi0KLSAgcHVibGljIFNldEJhc2VUeXBlQ29tbWFuZChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCwgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGUpCi0gIHsKLSAgICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9CQVNFX1RZUEUpOwotICAgIHRoaXMuY29uY3JldGVDb21wb25lbnQgPSBjb25jcmV0ZUNvbXBvbmVudDsKLSAgICB0aGlzLmJhc2VUeXBlID0gYmFzZVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGNvbmNyZXRlQ29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBpZiAoY29uY3JldGVDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIGNvbmNyZXRlQ29tcG9uZW50OyAgICAgICAgCi0gICAgICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCBjb250ZW50VHlwZSA9IChiYXNlVHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgPyAoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiliYXNlVHlwZSkuZ2V0Q29udGVudFR5cGUoKSA6IG51bGw7Ci0gICAgICAgIAotICAgICAgICAvLyBDb21wbGV4IHR5cGUgc2ltcGxlIGNvbnRlbnQKLSAgICAgICAgaWYgKGJhc2VUeXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gfHwgKGNvbnRlbnRUeXBlICE9IG51bGwgJiYgIGNvbnRlbnRUeXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCEoY29tcGxleFR5cGUuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZUNvbnRlbnQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgY29tcGxleFR5cGUuc2V0Q29udGVudChzaW1wbGVDb250ZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ29tcGxleCB0eXBlIGNvbXBsZXggY29udGVudAotICAgICAgICBlbHNlIGlmKGJhc2VUeXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgIAlpZighKGNvbXBsZXhUeXBlLmdldENvbnRlbnQoKSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikpCi0gICAgICAgIAl7Ci0gICAgICAgIAkJWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhDb250ZW50ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIAkJY29tcGxleFR5cGUuc2V0Q29udGVudChjb21wbGV4Q29udGVudC5nZXRDb250ZW50KCkpOwotICAgICAgICAJfQotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgY29tcGxleFR5cGUuc2V0RGVyaXZhdGlvbk1ldGhvZChYU0REZXJpdmF0aW9uTWV0aG9kLkVYVEVOU0lPTl9MSVRFUkFMKTsKLSAgICAgICAgY29tcGxleFR5cGUuc2V0QmFzZVR5cGVEZWZpbml0aW9uKGJhc2VUeXBlKTsKLSAgICAgICAgLy8gdmIgVGhpcyBjYWxsIHNob3VsZCBub3QgYmUgbmVlZGVkLiBUaGUgWFNEIEluZm9zZXQgbW9kZWwgc2hvdWxkIHJlY29uY2lsZSBpdHNlbGYgcHJvcGVybHkuCi0gICAgICAgIGNvbXBsZXhUeXBlLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0gICAgICAgIGZvcm1hdENoaWxkKGNvbXBsZXhUeXBlLmdldEVsZW1lbnQoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjb25jcmV0ZUNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBjb25jcmV0ZUNvbXBvbmVudDsKLSAgICAgICAgaWYgKGJhc2VUeXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RWYXJpZXR5IHZhcmlldHkgPSBzaW1wbGVUeXBlLmdldFZhcmlldHkoKTsKLSAgICAgICAgICBpZiAodmFyaWV0eS5nZXRWYWx1ZSgpID09IFhTRFZhcmlldHkuQVRPTUlDKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNpbXBsZVR5cGUuc2V0QmFzZVR5cGVEZWZpbml0aW9uKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgYmFzZVR5cGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh2YXJpZXR5LmdldFZhbHVlKCkgPT0gWFNEVmFyaWV0eS5VTklPTikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzaW1wbGVUeXBlLmdldE1lbWJlclR5cGVEZWZpbml0aW9ucygpLmFkZChiYXNlVHlwZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHZhcmlldHkuZ2V0VmFsdWUoKSA9PSBYU0RWYXJpZXR5LkxJU1QpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2ltcGxlVHlwZS5zZXRJdGVtVHlwZURlZmluaXRpb24oKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBiYXNlVHlwZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldE11bHRpcGxpY2l0eUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldE11bHRpcGxpY2l0eUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY3OWZlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRNdWx0aXBsaWNpdHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTZXRNdWx0aXBsaWNpdHlDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50OwotICBpbnQgbWF4T2NjdXJzLCBtaW5PY2N1cnM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBwYXJlbnQKLSAgICovCi0gIHB1YmxpYyBTZXRNdWx0aXBsaWNpdHlDb21tYW5kKFN0cmluZyBsYWJlbCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TWF4T2NjdXJzKGludCBpKQotICB7Ci0gICAgbWF4T2NjdXJzPWk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNaW5PY2N1cnMoaW50IGkpCi0gIHsKLSAgICBtaW5PY2N1cnM9aTsgICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRYU0RDb25jcmV0ZUNvbXBvbmVudChYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQpCi0gIHsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuQWJzdHJhY3RDb21tYW5kI3J1bigpCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHBhcmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlQ29udGVudCkKLSAgICAgIHsKLSAgICAgICAgWFNEUGFydGljbGVDb250ZW50IHhzZFBhcnRpY2xlQ29udGVudCA9IChYU0RQYXJ0aWNsZUNvbnRlbnQpIHBhcmVudDsKLSAgICAgICAgWFNEUGFydGljbGUgeHNkUGFydGljbGUgPSAoWFNEUGFydGljbGUpIHhzZFBhcnRpY2xlQ29udGVudC5nZXRDb250YWluZXIoKTsKLSAgICAgICAgaWYgKG1heE9jY3VycyA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICBtYXhPY2N1cnMgPSBYU0RQYXJ0aWNsZS5VTkJPVU5ERUQ7Ci0gICAgICAgIH0KLSAgICAgICAgeHNkUGFydGljbGUuc2V0TWF4T2NjdXJzKG1heE9jY3Vycyk7Ci0gICAgICAgIHhzZFBhcnRpY2xlLnNldE1pbk9jY3VycyhtaW5PY2N1cnMpOwotICAgICAgfQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRUeXBlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0VHlwZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0Y2I0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRUeXBlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5TZXRUeXBlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFNldFR5cGVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50OwotICBwcml2YXRlIGJvb2xlYW4gY29udGludWVBcHBseTsKLSAgWFNEQmFzZUFkYXB0ZXIgYWRhcHRlcjsKLSAgU3RyaW5nIGFjdGlvbjsKLQotICBwdWJsaWMgU2V0VHlwZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgSUQsIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB0aGlzLmFjdGlvbiA9IElEOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKFhTREJhc2VBZGFwdGVyIGFkYXB0ZXIpCi0gIHsKLSAgICB0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKTsKLSAgICAgIGNvbnRpbnVlQXBwbHkgPSB0cnVlOwotICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoU2V0VHlwZUFjdGlvbi5TRVRfTkVXX1RZUEVfSUQpKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBuZXdWYWx1ZSA9IChDb21wb25lbnRTcGVjaWZpY2F0aW9uKSBpbnZva2VEaWFsb2coY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuZ2V0TmV3RGlhbG9nKCkpOwotICAgICAgICAgIGlmIChjb250aW51ZUFwcGx5KQotICAgICAgICAgICAgY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGFkYXB0ZXIsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIG5ld1ZhbHVlID0gKENvbXBvbmVudFNwZWNpZmljYXRpb24pIGludm9rZURpYWxvZyhjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5nZXRCcm93c2VEaWFsb2coKSk7Ci0gICAgICAgICAgaWYgKGNvbnRpbnVlQXBwbHkpCi0gICAgICAgICAgICBjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoYWRhcHRlciwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGZvcm1hdENoaWxkKHBhcmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgfQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBPYmplY3QgaW52b2tlRGlhbG9nKElDb21wb25lbnREaWFsb2cgZGlhbG9nKQotICB7Ci0gICAgT2JqZWN0IG5ld1ZhbHVlID0gbnVsbDsKLQotICAgIGlmIChkaWFsb2cgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgewotICAgICAgbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbnRpbnVlQXBwbHkgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3VmFsdWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKQotICB7Ci0gICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgcmVzdWx0ID0gbnVsbDsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBpZiAoZWRpdG9yICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7Ci0gICAgfSAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHJpdmF0ZSBJRWRpdG9yUGFydCBnZXRBY3RpdmVFZGl0b3IoKQotICB7Ci0gICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgIHJldHVybiBlZGl0b3JQYXJ0OwotICB9ICAgIAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRYU0RGYWNldFZhbHVlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVjNjg4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRYU0RGYWNldFZhbHVlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY2V0OwotCi1wdWJsaWMgY2xhc3MgU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBwcm90ZWN0ZWQgWFNERmFjZXQgZmFjZXQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0gIAotICBwdWJsaWMgU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RGYWNldCBmYWNldCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLmZhY2V0ID0gZmFjZXQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTZXRYU0RGYWNldFZhbHVlQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTREZhY2V0IGZhY2V0LCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5mYWNldCA9IGZhY2V0OwotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgdGhpcy52YWx1ZSA9IHZhbHVlOyAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhmYWNldC5nZXRFbGVtZW50KCkpOwotICAgICAgZmFjZXQuc2V0TGV4aWNhbFZhbHVlKHZhbHVlKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzOGI0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQgZXh0ZW5kcyBVcGRhdGVDb21wb25lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZAotewotCi0gIHB1YmxpYyBVcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQoWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQsIFN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgY29tcG9uZW50TmFtZXNwYWNlLCBJRmlsZSBmaWxlKQotICB7Ci0gICAgc3VwZXIoY29uY3JldGVDb21wb25lbnQsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWVzcGFjZSwgZmlsZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNEQ29tcG9uZW50IGdldERlZmluZWRDb21wb25lbnQoWFNEU2NoZW1hIHNjaGVtYSwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIFN0cmluZyBjb21wb25lbnROYW1lc3BhY2UpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiByZXN1bHQgPSBzY2hlbWEucmVzb2x2ZUF0dHJpYnV0ZURlY2xhcmF0aW9uKGNvbXBvbmVudE5hbWVzcGFjZSwgY29tcG9uZW50TmFtZSk7Ci0gICAgaWYgKHJlc3VsdC5lQ29udGFpbmVyKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhjb25jcmV0ZUNvbXBvbmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgWFNEQ29tcG9uZW50IGNvbXBvbmVudERlZiA9IGNvbXB1dGVDb21wb25lbnQoKTsKLSAgICAgIGlmIChjb21wb25lbnREZWYgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVJlZmVyZW5jZUNvbW1hbmQob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfQVRUUklCVVRFX1JFRkVSRU5DRSwgKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjb25jcmV0ZUNvbXBvbmVudCwKLSAgICAgICAgICAgIChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgY29tcG9uZW50RGVmKTsKLSAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgIFhTRERpcmVjdGl2ZXNNYW5hZ2VyLnJlbW92ZVVudXNlZFhTREltcG9ydHMoY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZjYzNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSwgcmVmOwotCi0gIHB1YmxpYyBVcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlLCBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiByZWYpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7Ci0gICAgdGhpcy5yZWYgPSByZWY7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGF0dHJpYnV0ZS5nZXRFbGVtZW50KCkpOwotICAgICAgYXR0cmlidXRlLnNldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24ocmVmKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc2ZjI0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgZnJvbSB0aGUgZXh0ZW5zaW9uIHZpZXcgdG8gZWRpdCBleHRlbnNpb24gZWxlbWVudHMKLSAqIGFuZCBhdHRyaWJ1dGVzIHdoaWNoIGFyZSBpbXBsZW1lbnRlZCBhcyBET00gb2JqZWN0cyAobm90IHBhcnQgb2YgdGhlIEVNRiBtb2RlbCkKLSAqIAotICogKHRydW5nKSBhbHNvIHVzZWQgaW4gWFNEQ29tcGxleFR5cGVBZHZhbmNlZFNlY3Rpb24gdG8gY2hhbmdlIGF0dHJpYnV0ZSBvZgotICogc3BlY2ljYWwgYXR0cmlidXRlcyBsaWtlIGJsb2NrLCByZXN0cmljdGlvbiB3aGljaCBpcyBub3QgcGFydCBvZiBFTUYgTW9kZWwKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCAgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBwcm90ZWN0ZWQgRWxlbWVudCBlbGVtZW50OwotICBwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZU5hbWU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gIAotICAvKiogV2hldGhlciB0aGUgYXR0cmlidXRlIHNob3VsZCBiZSBkZWxldGVkIGlmIHZhbHVlIHRvIAotICAgKiAgIGJlIHNldCBpcyBhbiBlbXB0eSBTdHJpbmcgb3IgbnVsbCAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZGVsZXRlSWZWYWx1ZUVtcHR5ID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSwgYm9vbGVhbiBkZWxldGVJZlZhbHVlRW1wdHkpCi0gIHsKLSAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgIHRoaXMuYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7Ci0gICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVZhbHVlOwotICAgIHRoaXMuZGVsZXRlSWZWYWx1ZUVtcHR5ID0gZGVsZXRlSWZWYWx1ZUVtcHR5OwotICB9Ci0KLSAgcHVibGljIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgYXR0cmlidXRlVmFsdWUsIFN0cmluZyBsYWJlbCkKLSAgewotICAgIHRoaXMoZWxlbWVudCwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUsIGZhbHNlKTsKLQotICAgIC8vIFRoZSBjb21tYW5kIGxhYmVsIGlzIHNoYXJlZCB3aXRoIHRoZSBhY3R1YWwgVUkgbGFiZWwsIHdoaWNoIGNvbnRhaW5zIAotICAgIC8vIG1uZW1vbmljcyBhbmQgY29sb24gY2hhcmFjdGVycy4gU2luY2Ugd2UgZG9uJ3Qgd2FudCB0aGVzZSB0byBzaG93IHVwIGluIAotICAgIC8vIHRoZSB1bmRvIG1lbnUgd2UgZG8gYSBsaXR0bGUgYml0IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYWdpYyBoZXJlIHRvIHJlbW92ZSB0aGVtLgotICAgIAotICAgIHNldExhYmVsKE5MUy5iaW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0hBTkdFLCBsYWJlbC5yZXBsYWNlQWxsKCJbJjpdIiwgIiIpKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlKQotICB7Ci0gICAgdGhpcyhlbGVtZW50LCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSwgZmFsc2UpOwotICAgIHNldExhYmVsKE5MUy5iaW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0hBTkdFLCBhdHRyaWJ1dGVOYW1lKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZWxldGVJZkVtcHR5KGJvb2xlYW4gdikKLSAgewotCSAgZGVsZXRlSWZWYWx1ZUVtcHR5ID0gdjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSkKLSAgewotICAgIHRoaXMuYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICBpZiAoZGVsZXRlSWZWYWx1ZUVtcHR5ICYmIAotICAgIAkJICAoYXR0cmlidXRlVmFsdWUgPT0gbnVsbCB8fCBhdHRyaWJ1dGVWYWx1ZS5lcXVhbHMoIiIpICkgKQotICAgICAgewotICAgIAllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgfQotICAgICAgCi0gICAgICBkb1Bvc3RQcm9jZXNzaW5nKCk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGRvUG9zdFByb2Nlc3NpbmcoKQotICB7Ci0gICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUNvbXBsZXhUeXBlRGVyaXZhdGlvbkJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVDb21wbGV4VHlwZURlcml2YXRpb25CeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWNhZTZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUNvbXBsZXhUeXBlRGVyaXZhdGlvbkJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERGVyaXZhdGlvbk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlQ29tcGxleFR5cGVEZXJpdmF0aW9uQnkgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBwcml2YXRlIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZTsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVyaXZhdGlvbjsKLQotICBwdWJsaWMgVXBkYXRlQ29tcGxleFR5cGVEZXJpdmF0aW9uQnkoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlLCBTdHJpbmcgZGVyaXZhdGlvbikKLSAgewotICAgIHRoaXMuY29tcGxleFR5cGUgPSBjb21wbGV4VHlwZTsKLSAgICB0aGlzLmRlcml2YXRpb24gPSBkZXJpdmF0aW9uOwotICAgIC8vIFRPRE86IHVzZSBuZXcgTWVzc2FnZSBidW5kbGUgbWVjaGFuaXNtCi0gICAgc2V0TGFiZWwoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0RFUklWRURCWV9DSEFOR0UiKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhjb21wbGV4VHlwZS5nZXRFbGVtZW50KCkpOwotICAgICAgWFNEVHlwZURlZmluaXRpb24gb3JpZ2luYWxCYXNlVHlwZSA9IGNvbXBsZXhUeXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICBpZiAoZGVyaXZhdGlvbi5lcXVhbHMoWFNEQ29uc3RhbnRzLkVYVEVOU0lPTl9FTEVNRU5UX1RBRykpCi0gICAgICB7Ci0gICAgICAgIGNvbXBsZXhUeXBlLnNldERlcml2YXRpb25NZXRob2QoWFNERGVyaXZhdGlvbk1ldGhvZC5FWFRFTlNJT05fTElURVJBTCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChkZXJpdmF0aW9uLmVxdWFscyhYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcpKQotICAgICAgewotICAgICAgICBjb21wbGV4VHlwZS5zZXREZXJpdmF0aW9uTWV0aG9kKFhTRERlcml2YXRpb25NZXRob2QuUkVTVFJJQ1RJT05fTElURVJBTCk7Ci0gICAgICB9Ci0gICAgICBjb21wbGV4VHlwZS5zZXRCYXNlVHlwZURlZmluaXRpb24ob3JpZ2luYWxCYXNlVHlwZSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUNvbXBvbmVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVDb21wb25lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTIzZjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUNvbXBvbmVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlSW1wbDsKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVcGRhdGVDb21wb25lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIHByb3RlY3RlZCBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudDsKLSAgcHJvdGVjdGVkIFN0cmluZyBjb21wb25lbnROYW1lOwotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXBvbmVudE5hbWVzcGFjZTsKLSAgcHJvdGVjdGVkIElGaWxlIGZpbGU7Ci0KLSAgcHVibGljIFVwZGF0ZUNvbXBvbmVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50LCBTdHJpbmcgY29tcG9uZW50TmFtZSwgU3RyaW5nIGNvbXBvbmVudE5hbWVzcGFjZSwgSUZpbGUgZmlsZSkKLSAgewotICAgIHRoaXMuY29uY3JldGVDb21wb25lbnQgPSBjb25jcmV0ZUNvbXBvbmVudDsKLSAgICB0aGlzLmNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOwotICAgIHRoaXMuY29tcG9uZW50TmFtZXNwYWNlID0gY29tcG9uZW50TmFtZXNwYWNlOwotICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNEQ29tcG9uZW50IGNvbXB1dGVDb21wb25lbnQoKQotICB7Ci0gICAgWFNEQ29tcG9uZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpOwotICAgIFhTRFNjaGVtYURpcmVjdGl2ZSBkaXJlY3RpdmUgPSBudWxsOwotCi0gICAgLy8gbGV0cyBzZWUgaWYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSB2aXNpYmxlIHRvIG91ciBzY2hlbWEKLSAgICByZXN1bHQgPSBnZXREZWZpbmVkQ29tcG9uZW50KHNjaGVtYSwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZXNwYWNlKTsKLSAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgewotICAgICAgLy8gVE9ETyAoY3MpIHdlIG5lZWQgdG8gcHJvdmlkZSBhIHNlcGFyYXRlIGNvbW1hbmQgdG8gZG8gdGhpcyBwYXJ0Ci0gICAgICAvLwotICAgICAgLy8gYXBwYXJlbnRseSB0aGUgZWxlbWVudCBpcyBub3QgeWV0IHZpc2libGUsIHdlIG5lZWQgdG8gYWRkCi0gICAgICAvLyBpbmNsdWRlcy9pbXBvcnRzIHRvIGdldCB0byBpdAotICAgICAgaWYgKGNvbXBvbmVudE5hbWVzcGFjZSAhPSBudWxsICYmIGNvbXBvbmVudE5hbWVzcGFjZS5lcXVhbHMoc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICAgIHsKLSAgICAgICAgLy8gd2UgbmVlZCB0byBhZGQgYW4gaW5jbHVkZQotICAgICAgICAvLyBpZiB0aGUgY29tcG9uZW50J3MgbmFtZXNwYWNlIGlzIG5vdCBudWxsIGFuZCBtYXRjaGVzIHRoZSBzY2hlbWEncwotICAgICAgICAvLyB0YXJnZXQgbmFtZXNwYWNlCi0gICAgICAgIGRpcmVjdGl2ZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREluY2x1ZGUoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbXBvbmVudE5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgewotICAgICAgICAvLyB3ZSBuZWVkIHRvIGFkZCBhbiBpbmNsdWRlCi0gICAgICAgIC8vIGlmIHRoZSBjb21wb25lbnQncyBuYW1lc3BhY2UgaXMgbnVsbCwgdGhlbiB3ZSBjYW4ganVzdCBhZGQgaXQKLSAgICAgICAgLy8gb25seSBpZiB0aGUgY3VycmVudCBuYW1lc3BhY2UgaXMgbm90IG51bGwKLSAgICAgICAgZGlyZWN0aXZlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNESW5jbHVkZSgpOwotCi0gICAgICAgIC8vIHdlIGhhdmUgdG8gZW5zdXJlIHRoZSBzY2hlbWEgZm9yIHNjaGVtYSBwcmVmaXggaXMgTk9UIG51bGwKLSAgICAgICAgaWYgKHNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgdGFyZ2V0TlMgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgaWYgKHRhcmdldE5TID09IG51bGwpCi0gICAgICAgICAgICB0YXJnZXROUyA9ICIiOwotICAgICAgICAgIC8vIHRoaXMgd2lsbCBqdXN0IHVwZGF0ZSB0aGUgc2NoZW1hIGZvciBzY2hlbWEgcHJlZml4IHRvIGJlLCBzYXksIHhzZAotICAgICAgICAgIFVwZGF0ZU5hbWVzcGFjZUluZm9ybWF0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZU5hbWVzcGFjZUluZm9ybWF0aW9uQ29tbWFuZCgiIiwgc2NoZW1hLCAiIiwgdGFyZ2V0TlMpOwotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIHdlIG5lZWQgdG8gYWRkIGFuIGltcG9ydAotICAgICAgICBYU0RJbXBvcnQgeHNkSW1wb3J0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNESW1wb3J0KCk7Ci0gICAgICAgIHhzZEltcG9ydC5zZXROYW1lc3BhY2UoY29tcG9uZW50TmFtZXNwYWNlKTsKLSAgICAgICAgZGlyZWN0aXZlID0geHNkSW1wb3J0OwotICAgICAgfQotCi0gICAgICBTdHJpbmcgbG9jYXRpb24gPSBjb21wdXRlTmljZUxvY2F0aW9uKHNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpLCBmaWxlKTsKLSAgICAgIGRpcmVjdGl2ZS5zZXRTY2hlbWFMb2NhdGlvbihsb2NhdGlvbik7Ci0gICAgICAvLyBUT0RPIChjcykgd2Ugc2hvdWxkIGF0IHRoZSBkaXJlY3RpdmUgJ25leHQnIGluIHRoZSBsaXN0IG9mIGRpcmVjdGl2ZXMKLSAgICAgIC8vIGZvciBub3cgSSdtIGp1c3QgYWRkaW5nIGFzIHRoZSBmaXJzdCB0aGluZyBpbiB0aGUgc2NoZW1hIDotKAotICAgICAgLy8KLSAgICAgIHNjaGVtYS5nZXRDb250ZW50cygpLmFkZCgwLCBkaXJlY3RpdmUpOwotICAgICAgWFNEU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gZGlyZWN0aXZlLmdldFJlc29sdmVkU2NoZW1hKCk7Ci0gICAgICBpZiAocmVzb2x2ZWRTY2hlbWEgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHBsYXRmb3JtTG9jYXRpb24gPSAicGxhdGZvcm06L3Jlc291cmNlIiArIGZpbGUuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBjb25jcmV0ZUNvbXBvbmVudC5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkocGxhdGZvcm1Mb2NhdGlvbikpOwotICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBYU0RSZXNvdXJjZUltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXNvdXJjZS5sb2FkKG51bGwpOwotICAgICAgICAgICAgWFNEUmVzb3VyY2VJbXBsIHJlc291cmNlSW1wbCA9IChYU0RSZXNvdXJjZUltcGwpIHJlc291cmNlOwotICAgICAgICAgICAgcmVzb2x2ZWRTY2hlbWEgPSByZXNvdXJjZUltcGwuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZGlyZWN0aXZlLnNldFJlc29sdmVkU2NoZW1hKHJlc29sdmVkU2NoZW1hKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChyZXNvbHZlZFNjaGVtYSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXREZWZpbmVkQ29tcG9uZW50KHJlc29sdmVkU2NoZW1hLCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lc3BhY2UpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBUT0RPIChjcykgY29uc2lkZXIgc2V0dGluZyBzb21lIGVycm9yIHN0YXRlIHNvIHRoYXQgdGhlIGNsaWVudCBjYW4KLSAgICAgICAgLy8gcHJvdmlkZSBhIHBvcC1kaWFsb2cgZXJyb3IKLSAgICAgICAgLy8gd2Ugc2hvdWxkIGFsc28gcmVtb3ZlIHRoZSBpbXBvcnQvaW5jbHVkZSBzbyBzYXZlIGZyb20gY2x1dHRlcmluZwotICAgICAgICAvLyB0aGUgZmlsZSB3aXRoIGJvZ3VzIGRpcmVjdGl2ZXMKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUExBVEZPUk1fUkVTT1VSQ0VfUFJFRklYID0gInBsYXRmb3JtOi9yZXNvdXJjZSI7Ci0gIHByaXZhdGUgU3RyaW5nIGNvbXB1dGVOaWNlTG9jYXRpb24oU3RyaW5nIGJhc2VMb2NhdGlvbiwgSUZpbGUgZmlsZSkKLSAgeyAgICAgCi0gICAgaWYgKGJhc2VMb2NhdGlvbi5zdGFydHNXaXRoKFBMQVRGT1JNX1JFU09VUkNFX1BSRUZJWCkpCi0gICAgewotICAgICAgVVJJIGJhc2VVUkkgPSBVUkkuY3JlYXRlVVJJKGJhc2VMb2NhdGlvbik7Ci0gICAgICBVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLSAgICAgIFVSSSByZWxhdGl2ZSA9IGZpbGVVUkkuZGVyZXNvbHZlKGJhc2VVUkksIGZhbHNlLCB0cnVlLCB0cnVlKTsgICAgICAKLSAgICAgIHJldHVybiByZWxhdGl2ZS50b1N0cmluZygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgVVJJIGJhc2VVUkkgPSBVUkkuY3JlYXRlVVJJKGJhc2VMb2NhdGlvbik7ICAgICAgICAgIAotICAgICAgVVJJIGZpbGVVUkkgPSBVUkkuY3JlYXRlRmlsZVVSSShmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLSAgICAgIFVSSSByZWxhdGl2ZSA9IGZpbGVVUkkuZGVyZXNvbHZlKGJhc2VVUkksIGZhbHNlLCB0cnVlLCB0cnVlKTsgICAgIAotICAgICAgcmV0dXJuIHJlbGF0aXZlLnRvU3RyaW5nKCk7ICAgIAotICAgIH0gCi0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgWFNEQ29tcG9uZW50IGdldERlZmluZWRDb21wb25lbnQoWFNEU2NoZW1hIHNjaGVtYSwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIFN0cmluZyBjb21wb25lbnROYW1lc3BhY2UpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUNvbnRlbnRNb2RlbENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUNvbnRlbnRNb2RlbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhNTYwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVDb250ZW50TW9kZWxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9zaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLQotcHVibGljIGNsYXNzIFVwZGF0ZUNvbnRlbnRNb2RlbENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXA7Ci0gIFhTRENvbXBvc2l0b3Igb2xkWFNEQ29tcG9zaXRvciwgbmV3WFNEQ29tcG9zaXRvcjsKLSAgCi0gIAotICBwdWJsaWMgVXBkYXRlQ29udGVudE1vZGVsQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCwgWFNEQ29tcG9zaXRvciB4c2RDb21wb3NpdG9yKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkTW9kZWxHcm91cCA9IHhzZE1vZGVsR3JvdXA7Ci0gICAgdGhpcy5uZXdYU0RDb21wb3NpdG9yID0geHNkQ29tcG9zaXRvcjsKLSAgICB0aGlzLm9sZFhTRENvbXBvc2l0b3IgPSB4c2RNb2RlbEdyb3VwLmdldENvbXBvc2l0b3IoKTsKLSAgfQotCi0gIAotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHhzZE1vZGVsR3JvdXAuZ2V0RWxlbWVudCgpKTsKLSAgICAgIHhzZE1vZGVsR3JvdXAuc2V0Q29tcG9zaXRvcihuZXdYU0RDb21wb3NpdG9yKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgewotICAgIHhzZE1vZGVsR3JvdXAuc2V0Q29tcG9zaXRvcihvbGRYU0RDb21wb3NpdG9yKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlRWxlbWVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVFbGVtZW50UmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhhZWI0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVFbGVtZW50UmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlRWxlbWVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kIGV4dGVuZHMgVXBkYXRlQ29tcG9uZW50UmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQKLXsKLSAgcHVibGljIFVwZGF0ZUVsZW1lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIFN0cmluZyBjb21wb25lbnROYW1lc3BhY2UsIElGaWxlIGZpbGUpCi0gIHsKLSAgICBzdXBlcihjb25jcmV0ZUNvbXBvbmVudCwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZXNwYWNlLCBmaWxlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBYU0RDb21wb25lbnQgZ2V0RGVmaW5lZENvbXBvbmVudChYU0RTY2hlbWEgc2NoZW1hLCBTdHJpbmcgY29tcG9uZW50TmFtZSwgU3RyaW5nIGNvbXBvbmVudE5hbWVzcGFjZSkKLSAgewotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBzY2hlbWEucmVzb2x2ZUVsZW1lbnREZWNsYXJhdGlvbihjb21wb25lbnROYW1lc3BhY2UsIGNvbXBvbmVudE5hbWUpOwotICAgIGlmIChyZXN1bHQuZUNvbnRhaW5lcigpID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoY29uY3JldGVDb21wb25lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIFhTRENvbXBvbmVudCBlbGVtZW50RGVmID0gY29tcHV0ZUNvbXBvbmVudCgpOwotICAgICAgaWYgKGVsZW1lbnREZWYgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgVXBkYXRlRWxlbWVudFJlZmVyZW5jZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVFbGVtZW50UmVmZXJlbmNlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9FTEVNRU5UX1JFRkVSRU5DRSwgKFhTREVsZW1lbnREZWNsYXJhdGlvbikgY29uY3JldGVDb21wb25lbnQsCi0gICAgICAgICAgICAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50RGVmKTsKLSAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgIFhTRERpcmVjdGl2ZXNNYW5hZ2VyLnJlbW92ZVVudXNlZFhTREltcG9ydHMoY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVFbGVtZW50UmVmZXJlbmNlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlRWxlbWVudFJlZmVyZW5jZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRiNTI3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVFbGVtZW50UmVmZXJlbmNlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFVwZGF0ZUVsZW1lbnRSZWZlcmVuY2VDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQsIHJlZjsKLQotICBwdWJsaWMgVXBkYXRlRWxlbWVudFJlZmVyZW5jZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCwgWFNERWxlbWVudERlY2xhcmF0aW9uIHJlZikKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgIHRoaXMucmVmID0gcmVmOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhlbGVtZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBlbGVtZW50LnNldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKHJlZik7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVNYXhPY2N1cnNDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVNYXhPY2N1cnNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNTllYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTWF4T2NjdXJzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlTWF4T2NjdXJzQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0JcHJpdmF0ZSBpbnQgb2xkTWF4T2NjdXJzOwotCXByaXZhdGUgaW50IG5ld01heE9jY3VyczsKLSAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZU1heE9jY3Vyc0F0dHJpYnV0ZTsKLQkKLQlYU0RQYXJ0aWNsZSBwYXJ0aWNsZTsKLQotICBwdWJsaWMgVXBkYXRlTWF4T2NjdXJzQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFBhcnRpY2xlIHBhcnRpY2xlLCBpbnQgTWF4T2NjdXJzKQotCXsKLQkJc3VwZXIobGFiZWwpOwotCQl0aGlzLm5ld01heE9jY3VycyA9IE1heE9jY3VyczsKLQkJdGhpcy5wYXJ0aWNsZSA9IHBhcnRpY2xlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkKLQl7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gcGFydGljbGUuZ2V0RWxlbWVudCgpOwotICAgICAgYmVnaW5SZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICByZW1vdmVNYXhPY2N1cnNBdHRyaWJ1dGUgPSAoIShlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURSkpKT8gdHJ1ZTogZmFsc2U7Ci0JCSAgb2xkTWF4T2NjdXJzID0gcGFydGljbGUuZ2V0TWF4T2NjdXJzKCk7Ci0JCSAgcGFydGljbGUuc2V0TWF4T2NjdXJzKG5ld01heE9jY3Vycyk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZG8oKQotCXsKLQkJZXhlY3V0ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1bmRvKCkKLQl7Ci0gICAgaWYgKHJlbW92ZU1heE9jY3Vyc0F0dHJpYnV0ZSkKLSAgICB7Ci0gICAgICBwYXJ0aWNsZS51bnNldE1heE9jY3VycygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCQkgIHBhcnRpY2xlLnNldE1heE9jY3VycyhvbGRNYXhPY2N1cnMpOwotICAgIH0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVNaW5PY2N1cnNDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVNaW5PY2N1cnNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMzE3NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTWluT2NjdXJzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVNaW5PY2N1cnNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBpbnQgb2xkTWluT2NjdXJzOwotICBwcml2YXRlIGludCBuZXdNaW5PY2N1cnM7Ci0gIHByaXZhdGUgYm9vbGVhbiByZW1vdmVNaW5PY2N1cnNBdHRyaWJ1dGU7Ci0KLSAgWFNEQ29tcG9uZW50IGNvbXBvbmVudDsKLQotICBwdWJsaWMgVXBkYXRlTWluT2NjdXJzQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRENvbXBvbmVudCBjb21wb25lbnQsIGludCBtaW5PY2N1cnMpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5uZXdNaW5PY2N1cnMgPSBtaW5PY2N1cnM7Ci0gICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IGNvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICByZW1vdmVNaW5PY2N1cnNBdHRyaWJ1dGUgPSAoIShlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTUlOT0NDVVJTX0FUVFJJQlVURSkpKSA/IHRydWUgOiBmYWxzZTsKLQotICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICBvbGRNaW5PY2N1cnMgPSAoKFhTRFBhcnRpY2xlKSBjb21wb25lbnQpLmdldE1pbk9jY3VycygpOwotICAgICAgICAoKFhTRFBhcnRpY2xlKSBjb21wb25lbnQpLnNldE1pbk9jY3VycyhuZXdNaW5PY2N1cnMpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBvbGRNaW5PY2N1cnMgPSAoKChYU0RBdHRyaWJ1dGVVc2UpIGNvbXBvbmVudCkuZ2V0VXNlKCkgPT0gWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkuUkVRVUlSRURfTElURVJBTCA/IDEgOiAwKTsKLSAgICAgICAgaWYgKG5ld01pbk9jY3VycyA9PSAxKQotICAgICAgICAgICgoWFNEQXR0cmlidXRlVXNlKSBjb21wb25lbnQpLnNldFVzZShYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeS5SRVFVSVJFRF9MSVRFUkFMKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICgoWFNEQXR0cmlidXRlVXNlKSBjb21wb25lbnQpLnNldFVzZShYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeS5PUFRJT05BTF9MSVRFUkFMKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVuZG8oKQotICB7Ci0gICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgIHsKLSAgICAgIGlmIChyZW1vdmVNaW5PY2N1cnNBdHRyaWJ1dGUpCi0gICAgICB7Ci0gICAgICAgICgoWFNEUGFydGljbGUpIGNvbXBvbmVudCkudW5zZXRNaW5PY2N1cnMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgKChYU0RQYXJ0aWNsZSkgY29tcG9uZW50KS5zZXRNaW5PY2N1cnMob2xkTWluT2NjdXJzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgIHsKLSAgICAgIGlmIChyZW1vdmVNaW5PY2N1cnNBdHRyaWJ1dGUpCi0gICAgICB7Ci0gICAgICAgICgoWFNEUGFydGljbGUpIGNvbXBvbmVudCkudW5zZXRNaW5PY2N1cnMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKG9sZE1pbk9jY3VycyA9PSAxKQotICAgICAgICAgICgoWFNEQXR0cmlidXRlVXNlKSBjb21wb25lbnQpLnNldFVzZShYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeS5SRVFVSVJFRF9MSVRFUkFMKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICgoWFNEQXR0cmlidXRlVXNlKSBjb21wb25lbnQpLnNldFVzZShYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeS5PUFRJT05BTF9MSVRFUkFMKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZU5hbWVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVOYW1lQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzBhN2MyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZU5hbWVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVJlZmFjdG9yaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUGVyZm9ybVVuc2F2ZWRSZWZhY3RvcmluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuWE1MUmVmYWN0b3JpbmdDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVOYW1lQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0vLyAgcHJpdmF0ZSBTdHJpbmcgb2xkTmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgbmV3TmFtZTsKLSAgcHJpdmF0ZSBYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQ7Ci0KLSAgcHVibGljIFVwZGF0ZU5hbWVDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLQotICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gJiYgY29tcG9uZW50LmdldE5hbWUoKSA9PSBudWxsICYmIGNvbXBvbmVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCAmJiAoKFhTRE5hbWVkQ29tcG9uZW50KSBjb21wb25lbnQuZUNvbnRhaW5lcigpKS5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb21wb25lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpIGNvbXBvbmVudC5lQ29udGFpbmVyKCk7Ci0gICAgfQotCi0gICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgdGhpcy5uZXdOYW1lID0gbmV3TmFtZTsKLS8vICAgIHRoaXMub2xkTmFtZSA9IGNvbXBvbmVudC5nZXROYW1lKCk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kI2V4ZWN1dGUoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhjb21wb25lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIHJlbmFtZUNvbXBvbmVudChuZXdOYW1lKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIFBlcmZvcm1zIGEgcmVuYW1lIHJlZmFjdG9yaW5nIHRvIHJlbmFtZSB0aGUgY29tcG9uZW50IGFuZCBhbGwgdGhlCi0gICAqIHJlZmVyZW5jZXMgdG8gaXQgd2l0aGluIHRoZSBjdXJyZW50IHNjaGVtYS4KLSAgICogCi0gICAqIEBwYXJhbSBuZXdOYW1lIHRoZSBuZXcgY29tcG9uZW50IG5hbWUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgcmVuYW1lQ29tcG9uZW50KFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgLy8gdGhpcyBpcyBhICdnbG9iYWxseScgZGVmaW5lZCBjb21wb25lbnQgKGUuZy4gZ2xvYmFsIGVsZW1lbnQpICAgIAotICAgIGlmIChjb21wb25lbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsKLSAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFJlZmFjdG9yaW5nQ29tcG9uZW50IHJlZmFjdG9yaW5nQ29tcG9uZW50ID0gbmV3IFhNTFJlZmFjdG9yaW5nQ29tcG9uZW50KAotICAgICAgICAgICAgICBjb21wb25lbnQsCi0gICAgICAgICAgICAgIChJRE9NRWxlbWVudCljb21wb25lbnQuZ2V0RWxlbWVudCgpLCAKLSAgICAgICAgICAgICAgY29tcG9uZW50LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgY29tcG9uZW50LmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQotICAgICAgICAgICAgUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IocmVmYWN0b3JpbmdDb21wb25lbnQsIG5ld05hbWUsIHRydWUpOyAgICAKLSAgICAgICAgICAgIFJlbmFtZVJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nID0gbmV3IFJlbmFtZVJlZmFjdG9yaW5nKHByb2Nlc3Nvcik7Ci0gICAgICAgICAgICBQZXJmb3JtVW5zYXZlZFJlZmFjdG9yaW5nT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBQZXJmb3JtVW5zYXZlZFJlZmFjdG9yaW5nT3BlcmF0aW9uKHJlZmFjdG9yaW5nKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbi5ydW4obnVsbCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBXZSBjYW4ndCByZWZhY3RvciByZW5hbWUgZXh0ZXJuYWwgZmlsZXMKLSAgICAgICAgICAgIGNvbXBvbmVudC5zZXROYW1lKG5ld05hbWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gCi0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIHRoaXMgaXMgYSAnbG9jYWxseScgZGVmaW5lZCBjb21wb25lbnQgKGUuZy4gbG9jYWwgZWxlbWVudCkKLSAgICAgIC8vIG5vIG5lZWQgdG8gY2FsbCByZWZhY3RvcmluZyBzaW5jZSB0aGlzIGNvbXBvbmVudCBjYW4ndCBiZSByZWZlcmVuY2VkICAgICAgCi0gICAgICBjb21wb25lbnQuc2V0TmFtZShuZXdOYW1lKTsKLSAgICB9ICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTmFtZXNwYWNlSW5mb3JtYXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVOYW1lc3BhY2VJbmZvcm1hdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlZmRkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVOYW1lc3BhY2VJbmZvcm1hdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuWE1MQ2hhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uc2VkaXQuVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIFVwZGF0ZU5hbWVzcGFjZUluZm9ybWF0aW9uQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5ld1ByZWZpeCwgbmV3VGFyZ2V0TmFtZXNwYWNlOwotICAKLSAgcHVibGljIFVwZGF0ZU5hbWVzcGFjZUluZm9ybWF0aW9uQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyBuZXdQcmVmaXgsIFN0cmluZyBuZXdUYXJnZXROYW1lc3BhY2UpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gICAgdGhpcy5uZXdQcmVmaXggPSBuZXdQcmVmaXg7Ci0gICAgdGhpcy5uZXdUYXJnZXROYW1lc3BhY2UgPSBuZXdUYXJnZXROYW1lc3BhY2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIGVuc3VyZVNjaGVtYUVsZW1lbnQoeHNkU2NoZW1hKTsKLSAgICAKLSAgICBFbGVtZW50IGVsZW1lbnQgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vRG9jdW1lbnRJbXBsIGRvYyA9IChEb2N1bWVudEltcGwpIGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCi0gICAgICBTdHJpbmcgbW9kZWxUYXJnZXROYW1lc3BhY2UgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICBTdHJpbmcgb2xkTmFtZXNwYWNlID0geHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICAgIFN0cmluZyBvbGRQcmVmaXggPSBoZWxwZXIuZ2V0UHJlZml4KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFKSwgZmFsc2UpOwotCi0gICAgICBpZiAobW9kZWxUYXJnZXROYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbW9kZWxUYXJnZXROYW1lc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotCi0gICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gbmV3VGFyZ2V0TmFtZXNwYWNlLnRyaW0oKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBuZXdQcmVmaXgudHJpbSgpOwotCi0gICAgICBpZiAoIXZhbGlkYXRlUHJlZml4KHByZWZpeCkgfHwgIXZhbGlkYXRlVGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDAgJiYgdGFyZ2V0TmFtZXNwYWNlLmxlbmd0aCgpID09IDApCi0gICAgICB7Ci0gICAgICAgIC8vIGNhbid0IGhhdmUgYmxhbmsgdGFyZ2V0bmFtZXNwYWNlIGFuZCB5ZXQgc3BlY2lmeSBhIHByZWZpeAotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIC8vZG9jLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RBUkdFVE5BTUVTUEFDRV9DSEFOR0UiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgCi0gICAgICBTdHJpbmcgeHNkRm9yWFNEUHJlZml4ID0geHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYVFOYW1lUHJlZml4KCk7Ci0gICAgICBNYXAgbWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLQotICAgICAgLy8gQ2hlY2sgaWYgcHJlZml4IGlzIGJsYW5rCi0gICAgICAvLyBpZiBpdCBpcywgdGhlbiBtYWtlIHN1cmUgd2UgaGF2ZSBhIHByZWZpeAotICAgICAgLy8gZm9yIHNjaGVtYSBmb3Igc2NoZW1hCi0gICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID09IDApCi0gICAgICB7Ci0gICAgICAgIC8vIGlmIHByZWZpeCBmb3Igc2NoZW1hIGZvciBzY2hlbWEgaXMgYmxhbmsKLSAgICAgICAgLy8gdGhlbiBzZXQgaXQgdG8gdmFsdWUgc3BlY2lmaWVkIGluIHByZWZlcmVuY2UKLSAgICAgICAgLy8gYW5kIHVwZGF0ZSBBTEwgbm9kZXMgd2l0aCB0aGlzIHByZWZpeAotICAgICAgICBpZiAoeHNkRm9yWFNEUHJlZml4ID09IG51bGwgfHwgKHhzZEZvclhTRFByZWZpeCAhPSBudWxsICYmIHhzZEZvclhTRFByZWZpeC50cmltKCkubGVuZ3RoKCkgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBnZXQgcHJlZmVyZW5jZSBwcmVmaXgKLSAgICAgICAgICB4c2RGb3JYU0RQcmVmaXggPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0WE1MU2NoZW1hUHJlZml4KCk7Ci0gICAgICAgICAgLy8gZ2V0IGEgdW5pcXVlIHByZWZpeCBieSBjaGVja2luZyB3aGF0J3MgaW4gdGhlIG1hcAotCi0gICAgICAgICAgeHNkRm9yWFNEUHJlZml4ID0gZ2V0VW5pcXVlU2NoZW1hRm9yU2NoZW1hUHJlZml4KHhzZEZvclhTRFByZWZpeCwgbWFwKTsKLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnM6IiArIHhzZEZvclhTRFByZWZpeCwgWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgdXBkYXRlQWxsTm9kZXMoZWxlbWVudCwgeHNkRm9yWFNEUHJlZml4KTsKLQotICAgICAgICAgIC8vIHJlbW92ZSB0aGUgb2xkIHhtbG5zIGF0dHJpYnV0ZSBmb3IgdGhlIHNjaGVtYSBmb3Igc2NoZW1hCi0gICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCJ4bWxucyIpICAmJiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ4bWxucyIpLmVxdWFscyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgewotICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoInhtbG5zIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZS5sZW5ndGgoKSA+IDAgfHwgKHRhcmdldE5hbWVzcGFjZS5sZW5ndGgoKSA9PSAwICYmIHByZWZpeC5sZW5ndGgoKSA9PSAwKSkKLSAgICAgIHsKLSAgICAgICAgLy8gY2xlYW4gdXAgdGhlIG9sZCBwcmVmaXggZm9yIHRoaXMgc2NoZW1hCi0gICAgICAgIGlmIChvbGRQcmVmaXggIT0gbnVsbCAmJiBvbGRQcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoInhtbG5zOiIgKyBvbGRQcmVmaXgpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgLy8gZWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBwcmVmaXgsIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgLy8gamF2YS51dGlsLk1hcCBwcmVmaXhUb05hbWVTcGFjZU1hcCA9Ci0gICAgICAgICAgLy8geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgICAgICAvLyBwcmVmaXhUb05hbWVTcGFjZU1hcC5yZW1vdmUob2xkUHJlZml4KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIC8vIGlmIG5vIHByZWZpeAotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCJ4bWxucyIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCFlbGVtZW50LmdldEF0dHJpYnV0ZSgieG1sbnMiKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgieG1sbnMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFtb2RlbFRhcmdldE5hbWVzcGFjZS5lcXVhbHModGFyZ2V0TmFtZXNwYWNlKSkKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFLCB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgICAgIC8vIG5vdyBzZXQgdGhlIG5ldyB4bWxuczpwcmVmaXggYXR0cmlidXRlCi0gICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBwcmVmaXgsIHRhcmdldE5hbWVzcGFjZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnMiLCB0YXJnZXROYW1lc3BhY2UpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgLy8gc2V0IHRoZSB0YXJnZXROYW1lc3BhY2UgYXR0cmlidXRlCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAvLyBlbHNlIHRhcmdldE5hbWVzcGFjZSBpcyBibGFuawotICAgICAgewotICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVEFSR0VUTkFNRVNQQUNFX0FUVFJJQlVURSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gZG8gb3VyIG93biByZWZlcmVudGlhbCBpbnRlZ3JpdHkKLSAgICAgIFRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIgdGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlciA9IG5ldyBUYXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyKHhzZFNjaGVtYSwgb2xkTmFtZXNwYWNlLCB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgdGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlci5yZXNvbHZlKCk7Ci0KLSAgICAgIHVwZGF0ZUVsZW1lbnQoeHNkU2NoZW1hKTsKLQotICAgICAgLy9kb2MuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIAotICAvLyBpc3N1ZSAoY3MpIEkgZG9uJ3QgaGF2ZSBhIGNsdWUgd2h5IHdlIG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZAotICAvLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZUVsZW1lbnQoWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgY29uY3JldGVDb21wLnVwZGF0ZUVsZW1lbnQoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgY29udGFpbm1lbnRzID0gY29uY3JldGVDb21wLmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgY29udGFpbm1lbnRzLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBFUmVmZXJlbmNlIGVSZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSljb250YWlubWVudHMubmV4dCgpOwotICAgICAgICBpZiAoZVJlZmVyZW5jZS5pc0NvbnRhaW5tZW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZVJlZmVyZW5jZS5pc01hbnkoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSAoKENvbGxlY3Rpb24pY29uY3JldGVDb21wLmVHZXQoZVJlZmVyZW5jZSkpLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iamVjdHMubmV4dCgpOwotICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhzZENvbmNyZXRlQ29tcG9uZW50LnVwZGF0ZUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7fQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpY29uY3JldGVDb21wLmVHZXQoZVJlZmVyZW5jZSk7Ci0gICAgICAgICAgICBpZiAoeHNkQ29uY3JldGVDb21wb25lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4c2RDb25jcmV0ZUNvbXBvbmVudC51cGRhdGVFbGVtZW50KCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pcXVlU2NoZW1hRm9yU2NoZW1hUHJlZml4KFN0cmluZyB4c2RGb3JYU0RQcmVmaXgsIE1hcCBtYXApCi0gIHsKLSAgICBpZiAoeHNkRm9yWFNEUHJlZml4ID09IG51bGwgfHwgKHhzZEZvclhTRFByZWZpeCAhPSBudWxsICYmIHhzZEZvclhTRFByZWZpeC50cmltKCkubGVuZ3RoKCkgPT0gMCkpCi0gICAgewotICAgICAgeHNkRm9yWFNEUHJlZml4ID0gInhzZCI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgLy8gZW5zdXJlIHByZWZpeCBpcyB1bmlxdWUKLSAgICBpbnQgcHJlZml4RXh0ZW5zaW9uID0gMTsKLSAgICB3aGlsZSAobWFwLmNvbnRhaW5zS2V5KHhzZEZvclhTRFByZWZpeCkgJiYgcHJlZml4RXh0ZW5zaW9uIDwgMTAwKQotICAgIHsKLSAgICAgIHhzZEZvclhTRFByZWZpeCA9IHhzZEZvclhTRFByZWZpeCArIFN0cmluZy52YWx1ZU9mKHByZWZpeEV4dGVuc2lvbik7Ci0gICAgICBwcmVmaXhFeHRlbnNpb24rKzsKLSAgICB9Ci0gICAgcmV0dXJuIHhzZEZvclhTRFByZWZpeDsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVBbGxOb2RlcyhFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBlbGVtZW50LnNldFByZWZpeChwcmVmaXgpOwotICAgIE5vZGVMaXN0IGxpc3QgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBpZiAobGlzdCAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICBOb2RlIGNoaWxkID0gbGlzdC5pdGVtKGkpOwotICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZC5zZXRQcmVmaXgocHJlZml4KTsKLSAgICAgICAgICBpZiAoY2hpbGQuaGFzQ2hpbGROb2RlcygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZUFsbE5vZGVzKChFbGVtZW50KSBjaGlsZCwgcHJlZml4KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVUYXJnZXROYW1lc3BhY2UoU3RyaW5nIG5zKQotICB7Ci0gICAgLy8gd2lsbCBhbGxvdyBibGFuayBuYW1lc3BhY2UgISEKLSAgICBpZiAobnMuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIFVSSSB0ZXN0VVJJID0gbmV3IFVSSShucyk7Ci0gICAgICB0ZXN0VVJJLmlzQWJzb2x1dGUoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9XQVJOX0lOVkFMSURfVEFSR0VUX05BTUVTUEFDRSIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsIHx8IGVycm9yTWVzc2FnZS5sZW5ndGgoKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUHJlZml4KFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4LmVxdWFscygiIikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBYTUxDaGFyLmlzVmFsaWROQ05hbWUocHJlZml4KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVkbygpCi0gIHsKLSAgICBleGVjdXRlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHVuZG8oKQotICB7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNWNlYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNYXhFeGNsdXNpdmVGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWF4SW5jbHVzaXZlRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1pbkV4Y2x1c2l2ZUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNaW5JbmNsdXNpdmVGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZTsKLSAgU3RyaW5nIG1heCwgbWluOwotICBib29sZWFuIGluY2x1ZGVNaW4sIGluY2x1ZGVNYXg7Ci0gIHByaXZhdGUgYm9vbGVhbiBkb1VwZGF0ZU1heCA9IGZhbHNlLCBkb1VwZGF0ZU1pbiA9IGZhbHNlOwotICBYU0RNaW5JbmNsdXNpdmVGYWNldCBtaW5JbmNsdXNpdmVGYWNldDsKLSAgWFNETWluRXhjbHVzaXZlRmFjZXQgbWluRXhjbHVzaXZlRmFjZXQ7Ci0gIFhTRE1heEluY2x1c2l2ZUZhY2V0IG1heEluY2x1c2l2ZUZhY2V0OwotICBYU0RNYXhFeGNsdXNpdmVGYWNldCBtYXhFeGNsdXNpdmVGYWNldDsKLQotCi0gIHB1YmxpYyBVcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZSwgYm9vbGVhbiBpbmNsdWRlTWluLCBib29sZWFuIGluY2x1ZGVNYXgpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RTaW1wbGVUeXBlID0geHNkU2ltcGxlVHlwZTsKLSAgICB0aGlzLmluY2x1ZGVNaW4gPSBpbmNsdWRlTWluOwotICAgIHRoaXMuaW5jbHVkZU1heCA9IGluY2x1ZGVNYXg7Ci0gICAgCi0gICAgbWluSW5jbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldE1pbkluY2x1c2l2ZUZhY2V0KCk7Ci0gICAgbWluRXhjbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldE1pbkV4Y2x1c2l2ZUZhY2V0KCk7Ci0gICAgbWF4SW5jbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldE1heEluY2x1c2l2ZUZhY2V0KCk7Ci0gICAgbWF4RXhjbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldE1heEV4Y2x1c2l2ZUZhY2V0KCk7Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1pbihTdHJpbmcgbWluKQotICB7Ci0gICAgdGhpcy5taW4gPSBtaW47Ci0gICAgZG9VcGRhdGVNaW4gPSB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNYXgoU3RyaW5nIG1heCkKLSAgewotICAgIHRoaXMubWF4ID0gbWF4OwotICAgIGRvVXBkYXRlTWF4ID0gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkU2ltcGxlVHlwZS5nZXRFbGVtZW50KCkpOwotCi0gICAgICBpZiAoZG9VcGRhdGVNaW4pCi0gICAgICB7Ci0gICAgICAgIGlmIChpbmNsdWRlTWluKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG1pbkluY2x1c2l2ZUZhY2V0ID09IG51bGwgJiYgbWluICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWluSW5jbHVzaXZlRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNaW5JbmNsdXNpdmVGYWNldCgpOwotICAgICAgICAgICAgbWluSW5jbHVzaXZlRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1pbik7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobWluSW5jbHVzaXZlRmFjZXQpOwotCi0gICAgICAgICAgICBpZiAobWluRXhjbHVzaXZlRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1pbkV4Y2x1c2l2ZUZhY2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobWluSW5jbHVzaXZlRmFjZXQgIT0gbnVsbCAmJiBtaW4gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtaW5JbmNsdXNpdmVGYWNldC5zZXRMZXhpY2FsVmFsdWUobWluKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobWluSW5jbHVzaXZlRmFjZXQgIT0gbnVsbCAmJiBtaW4gPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWluSW5jbHVzaXZlRmFjZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIC8vICFpbmNsdWRlTWluCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobWluRXhjbHVzaXZlRmFjZXQgPT0gbnVsbCAmJiBtaW4gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtaW5FeGNsdXNpdmVGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1pbkV4Y2x1c2l2ZUZhY2V0KCk7Ci0gICAgICAgICAgICBtaW5FeGNsdXNpdmVGYWNldC5zZXRMZXhpY2FsVmFsdWUobWluKTsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtaW5FeGNsdXNpdmVGYWNldCk7Ci0KLSAgICAgICAgICAgIGlmIChtaW5JbmNsdXNpdmVGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWluSW5jbHVzaXZlRmFjZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChtaW5FeGNsdXNpdmVGYWNldCAhPSBudWxsICYmIG1pbiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1pbkV4Y2x1c2l2ZUZhY2V0LnNldExleGljYWxWYWx1ZShtaW4pOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChtaW5FeGNsdXNpdmVGYWNldCAhPSBudWxsICYmIG1pbiA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtaW5FeGNsdXNpdmVGYWNldCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChkb1VwZGF0ZU1heCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGluY2x1ZGVNYXgpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobWF4SW5jbHVzaXZlRmFjZXQgPT0gbnVsbCAmJiBtYXggIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXhJbmNsdXNpdmVGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1heEluY2x1c2l2ZUZhY2V0KCk7Ci0gICAgICAgICAgICBtYXhJbmNsdXNpdmVGYWNldC5zZXRMZXhpY2FsVmFsdWUobWF4KTsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtYXhJbmNsdXNpdmVGYWNldCk7Ci0KLSAgICAgICAgICAgIGlmIChtYXhFeGNsdXNpdmVGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWF4RXhjbHVzaXZlRmFjZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChtYXhJbmNsdXNpdmVGYWNldCAhPSBudWxsICYmIG1heCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1heEluY2x1c2l2ZUZhY2V0LnNldExleGljYWxWYWx1ZShtYXgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChtYXhJbmNsdXNpdmVGYWNldCAhPSBudWxsICYmIG1heCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtYXhJbmNsdXNpdmVGYWNldCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgLy8gIWluY2x1ZGVNYXgKLSAgICAgICAgewotICAgICAgICAgIGlmIChtYXhFeGNsdXNpdmVGYWNldCA9PSBudWxsICYmIG1heCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1heEV4Y2x1c2l2ZUZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWF4RXhjbHVzaXZlRmFjZXQoKTsKLSAgICAgICAgICAgIG1heEV4Y2x1c2l2ZUZhY2V0LnNldExleGljYWxWYWx1ZShtYXgpOwotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKG1heEV4Y2x1c2l2ZUZhY2V0KTsKLQotICAgICAgICAgICAgaWYgKG1heEluY2x1c2l2ZUZhY2V0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtYXhJbmNsdXNpdmVGYWNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKG1heEV4Y2x1c2l2ZUZhY2V0ICE9IG51bGwgJiYgbWF4ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWF4RXhjbHVzaXZlRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1heCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKG1heEV4Y2x1c2l2ZUZhY2V0ICE9IG51bGwgJiYgbWF4ID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1heEV4Y2x1c2l2ZUZhY2V0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZm9ybWF0Q2hpbGQoeHNkU2ltcGxlVHlwZS5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVN0cmluZ0xlbmd0aEZhY2V0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZTc4ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRExlbmd0aEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNYXhMZW5ndGhGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWluTGVuZ3RoRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZTsKLSAgU3RyaW5nIG1heCwgbWluOwotICBwcml2YXRlIGJvb2xlYW4gZG9VcGRhdGVNYXggPSBmYWxzZSwgZG9VcGRhdGVNaW4gPSBmYWxzZTsKLQotICBwdWJsaWMgVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZFNpbXBsZVR5cGUgPSB4c2RTaW1wbGVUeXBlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNaW4oU3RyaW5nIG1pbikKLSAgewotICAgIHRoaXMubWluID0gbWluOwotICAgIGRvVXBkYXRlTWluID0gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TWF4KFN0cmluZyBtYXgpCi0gIHsKLSAgICB0aGlzLm1heCA9IG1heDsKLSAgICBkb1VwZGF0ZU1heCA9IHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkU2ltcGxlVHlwZS5nZXRFbGVtZW50KCkpOwotICAgICAgWFNETGVuZ3RoRmFjZXQgbGVuZ3RoRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldEVmZmVjdGl2ZUxlbmd0aEZhY2V0KCk7Ci0gICAgICBYU0RNaW5MZW5ndGhGYWNldCBtaW5MZW5ndGhGYWNldCA9IHhzZFNpbXBsZVR5cGUuZ2V0RWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQoKTsKLSAgICAgIFhTRE1heExlbmd0aEZhY2V0IG1heExlbmd0aEZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRFZmZlY3RpdmVNYXhMZW5ndGhGYWNldCgpOwotCi0gICAgICBTdHJpbmcgY3VycmVudExlbmd0aCA9IG51bGwsIGN1cnJlbnRNaW4gPSBudWxsLCBjdXJyZW50TWF4ID0gbnVsbDsKLSAgICAgIGlmIChsZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgewotICAgICAgICBjdXJyZW50TGVuZ3RoID0gbGVuZ3RoRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICB9Ci0gICAgICBpZiAobWluTGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY3VycmVudE1pbiA9IG1pbkxlbmd0aEZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgICAgfQotICAgICAgaWYgKG1heExlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGN1cnJlbnRNYXggPSBtYXhMZW5ndGhGYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRvVXBkYXRlTWF4ICYmICFkb1VwZGF0ZU1pbikKLSAgICAgIHsKLSAgICAgICAgaWYgKG1heExlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobWF4ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKG1heC5lcXVhbHMoY3VycmVudE1pbikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGxlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgICAgbGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1heCk7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChsZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtYXhMZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtaW5MZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChsZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKGxlbmd0aEZhY2V0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAobWluTGVuZ3RoRmFjZXQgPT0gbnVsbCAmJiBjdXJyZW50TGVuZ3RoICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtaW5MZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1pbkxlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICAgICAgbWluTGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKGN1cnJlbnRMZW5ndGgpOwotICAgICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtaW5MZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgbWF4TGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1heCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWF4TGVuZ3RoRmFjZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY3VycmVudE1pbiAhPSBudWxsICYmIGN1cnJlbnRNaW4uZXF1YWxzKG1heCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGxlbmd0aEZhY2V0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGxlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKGxlbmd0aEZhY2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShtYXgpOwotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1pbkxlbmd0aEZhY2V0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoY3VycmVudExlbmd0aCAhPSBudWxsICYmICFjdXJyZW50TGVuZ3RoLmVxdWFscyhtYXgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShsZW5ndGhGYWNldCk7Ci0KLSAgICAgICAgICAgIGlmIChtYXggIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWF4TGVuZ3RoRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNYXhMZW5ndGhGYWNldCgpOwotICAgICAgICAgICAgICBtYXhMZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUobWF4KTsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKG1heExlbmd0aEZhY2V0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWluTGVuZ3RoRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNaW5MZW5ndGhGYWNldCgpOwotICAgICAgICAgICAgbWluTGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKGN1cnJlbnRMZW5ndGgpOwotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKG1pbkxlbmd0aEZhY2V0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobGVuZ3RoRmFjZXQpOwotCi0gICAgICAgICAgICAgIG1pbkxlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWluTGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgICAgbWluTGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKGN1cnJlbnRMZW5ndGgpOwotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobWluTGVuZ3RoRmFjZXQpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXhMZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1heExlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICBtYXhMZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUobWF4KTsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtYXhMZW5ndGhGYWNldCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICghZG9VcGRhdGVNYXggJiYgZG9VcGRhdGVNaW4pCi0gICAgICB7Ci0gICAgICAgIGlmIChtaW5MZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG1pbiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtaW4uZXF1YWxzKGN1cnJlbnRNYXgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRExlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICAgIGxlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShtaW4pOwotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWF4TGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWluTGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAobGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShsZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKG1heExlbmd0aEZhY2V0ID09IG51bGwgJiYgY3VycmVudExlbmd0aCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWF4TGVuZ3RoRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNYXhMZW5ndGhGYWNldCgpOwotICAgICAgICAgICAgICAgIG1heExlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShjdXJyZW50TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobWF4TGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIG1pbkxlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShtaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1pbkxlbmd0aEZhY2V0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGN1cnJlbnRNYXggIT0gbnVsbCAmJiBjdXJyZW50TWF4LmVxdWFscyhtaW4pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsZW5ndGhGYWNldCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRExlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChsZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUobWluKTsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtYXhMZW5ndGhGYWNldCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRMZW5ndGggIT0gbnVsbCAmJiAhY3VycmVudExlbmd0aC5lcXVhbHMobWluKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobGVuZ3RoRmFjZXQpOwotCi0gICAgICAgICAgICBpZiAobWluICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1pbkxlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWluTGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgICAgbWluTGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1pbik7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtaW5MZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1heExlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWF4TGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgIG1heExlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShjdXJyZW50TGVuZ3RoKTsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtYXhMZW5ndGhGYWNldCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtaW5MZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1pbkxlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICBtaW5MZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUobWluKTsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtaW5MZW5ndGhGYWNldCk7Ci0KLSAgICAgICAgICAgIGlmIChsZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobGVuZ3RoRmFjZXQpOwotCi0gICAgICAgICAgICAgIG1heExlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWF4TGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgICAgbWF4TGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKGN1cnJlbnRMZW5ndGgpOwotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobWF4TGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZm9ybWF0Q2hpbGQoeHNkU2ltcGxlVHlwZS5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVRleHRWYWx1ZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVRleHRWYWx1ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY2MzY0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVUZXh0VmFsdWVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5UcmVlQ29udGVudEhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCBmcm9tIHRoZSBleHRlbnNpb24gdmlldyB0byBlZGl0IGV4dGVuc2lvbiBlbGVtZW50cwotICogYW5kIHdoaWNoIGFyZSBpbXBsZW1lbnRlZCBhcyBET00gb2JqZWN0cyAobm90IHBhcnQgb2YgdGhlIEVNRiBtb2RlbCkKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVRleHRWYWx1ZUNvbW1hbmQgIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgRWxlbWVudCBlbGVtZW50OwotICBTdHJpbmcgdmFsdWU7Ci0gIAotICBwdWJsaWMgVXBkYXRlVGV4dFZhbHVlQ29tbWFuZChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICB9Ci0KLSAgCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoZWxlbWVudCk7ICAgICAgCi0gICAgICBOb2RlIHRleHROb2RlID0gbnVsbDsKLSAgICAgIFRyZWVDb250ZW50SGVscGVyIGhlbHBlciA9IG5ldyBUcmVlQ29udGVudEhlbHBlcigpOwotICAgICAgZm9yIChOb2RlIG5vZGUgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSAKLSAgICAgIHsKLSAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJgotICAgICAgICAgICAgIWhlbHBlci5pc0lnbm9yYWJsZVRleHQobm9kZSkpIAotICAgICAgICB7Ci0gICAgICAgICAgdGV4dE5vZGUgPSBub2RlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9ICAgICAgICAgCi0gICAgICB9ICAgICAgIAotICAgICAgaWYgKHRleHROb2RlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRleHROb2RlID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoIiIpOwotICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHRleHROb2RlKTsKLSAgICAgIH0gIAotICAgICAgaGVscGVyLnNldE5vZGVWYWx1ZSh0ZXh0Tm9kZSwgdmFsdWUpOyAgICAgICAgCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVUeXBlUmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVR5cGVSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWQ3N2IzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVR5cGVSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0REaXJlY3RpdmVzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVR5cGVSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZCBleHRlbmRzIFVwZGF0ZUNvbXBvbmVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kCi17Ci0KLSAgcHVibGljIFVwZGF0ZVR5cGVSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCwKLQkJICBTdHJpbmcgY29tcG9uZW50TmFtZSwgU3RyaW5nIGNvbXBvbmVudE5hbWVzcGFjZSwgSUZpbGUgZmlsZSkKLSAgewotCSAgc3VwZXIoY29uY3JldGVDb21wb25lbnQsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWVzcGFjZSwgZmlsZSk7Ci0gIH0KLQotICAKLSAgcHJvdGVjdGVkIFhTRENvbXBvbmVudCBnZXREZWZpbmVkQ29tcG9uZW50KFhTRFNjaGVtYSBzY2hlbWEsIFN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgY29tcG9uZW50TmFtZXNwYWNlKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gcmVzdWx0ID0gc2NoZW1hLnJlc29sdmVUeXBlRGVmaW5pdGlvbihjb21wb25lbnROYW1lc3BhY2UsIGNvbXBvbmVudE5hbWUpOwotICAgIGlmIChyZXN1bHQuZUNvbnRhaW5lcigpID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gbnVsbDsKLSAgICB9ICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoY29uY3JldGVDb21wb25lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIFhTRENvbXBvbmVudCB0ZCA9IGNvbXB1dGVDb21wb25lbnQoKTsKLSAgICAgIGlmICh0ZCAhPSBudWxsICYmIHRkIGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFVwZGF0ZVR5cGVSZWZlcmVuY2VDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlVHlwZVJlZmVyZW5jZUNvbW1hbmQoY29uY3JldGVDb21wb25lbnQsIChYU0RUeXBlRGVmaW5pdGlvbikgdGQpOwotICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgWFNERGlyZWN0aXZlc01hbmFnZXIucmVtb3ZlVW51c2VkWFNESW1wb3J0cyhjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVR5cGVSZWZlcmVuY2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVUeXBlUmVmZXJlbmNlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGExMDZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVR5cGVSZWZlcmVuY2VDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlVHlwZVJlZmVyZW5jZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudDsKLSAgWFNEVHlwZURlZmluaXRpb24gbmV3VHlwZTsKLSAgCi0gIHB1YmxpYyBVcGRhdGVUeXBlUmVmZXJlbmNlQ29tbWFuZChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCwgWFNEVHlwZURlZmluaXRpb24gbmV3VHlwZSkKLSAgewotICAgIHRoaXMuY29uY3JldGVDb21wb25lbnQgPSBjb25jcmV0ZUNvbXBvbmVudDsKLSAgICB0aGlzLm5ld1R5cGUgPSBuZXdUeXBlOwotICB9Ci0gICAKLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhjb25jcmV0ZUNvbXBvbmVudC5nZXRFbGVtZW50KCkpOwotCi0gICAgICBpZiAoY29uY3JldGVDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIHNldEVsZW1lbnRUeXBlKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGNvbmNyZXRlQ29tcG9uZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBzZXRBdHRyaWJ1dGVUeXBlKChYU0RBdHRyaWJ1dGVVc2UpIGNvbmNyZXRlQ29tcG9uZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIHNldEF0dHJpYnV0ZVR5cGUoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgc2V0RWxlbWVudFR5cGUoWFNERWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7Ci0gICAgZWQgPSBlZC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgIGlmIChlZCAhPSBudWxsKQotICAgIHsgIAotICAgICAgZWQuc2V0VHlwZURlZmluaXRpb24obmV3VHlwZSk7Ci0gICAgfSAgICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzZXRBdHRyaWJ1dGVUeXBlKFhTREF0dHJpYnV0ZVVzZSBhdHRyaWJ1dGVVc2UpCi0gIHsKLSAgICBzZXRBdHRyaWJ1dGVUeXBlKGF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc2V0QXR0cmlidXRlVHlwZShYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgewotICAgIGFkID0gYWQuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgIGlmIChhZCAhPSBudWxsICYmIG5ld1R5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBhZC5zZXRUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pbmV3VHlwZSk7Ci0gICAgfSAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxYjZhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVYU0RQYXR0ZXJuRmFjZXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXR0ZXJuRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlWFNEUGF0dGVybkZhY2V0Q29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFTEVURSA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQREFURSA9IDI7Ci0gIAotICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLSAgU3RyaW5nIHZhbHVlOwotICBpbnQgYWN0aW9uVHlwZTsKLSAgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm5Ub0VkaXQ7Ci0gIAotICBwdWJsaWMgVXBkYXRlWFNEUGF0dGVybkZhY2V0Q29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLCBpbnQgYWN0aW9uVHlwZSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZFNpbXBsZVR5cGVEZWZpbml0aW9uID0geHNkU2ltcGxlVHlwZURlZmluaXRpb247Ci0gICAgdGhpcy5hY3Rpb25UeXBlID0gYWN0aW9uVHlwZTsKLSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuVG9FZGl0KFhTRFBhdHRlcm5GYWNldCBwYXR0ZXJuVG9FZGl0KQotICB7Ci0gICAgdGhpcy5wYXR0ZXJuVG9FZGl0ID0gcGF0dGVyblRvRWRpdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgIGlmIChhY3Rpb25UeXBlID09IEFERCkKLSAgICAgIHsKLSAgICAgICAgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm4gPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RQYXR0ZXJuRmFjZXQoKTsKLSAgICAgICAgcGF0dGVybi5zZXRMZXhpY2FsVmFsdWUodmFsdWUpOwotICAgICAgICB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRGYWNldENvbnRlbnRzKCkuYWRkKHBhdHRlcm4pOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYWN0aW9uVHlwZSA9PSBERUxFVEUpCi0gICAgICB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwocGF0dGVyblRvRWRpdCk7Ci0gICAgICAgIGlmICh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRGYWNldENvbnRlbnRzKCkuY29udGFpbnMocGF0dGVyblRvRWRpdCkpCi0gICAgICAgICAgeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShwYXR0ZXJuVG9FZGl0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGFjdGlvblR5cGUgPT0gVVBEQVRFKQotICAgICAgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHBhdHRlcm5Ub0VkaXQpOwotICAgICAgICBwYXR0ZXJuVG9FZGl0LnNldExleGljYWxWYWx1ZSh2YWx1ZSk7Ci0gICAgICB9Ci0gICAgICBmb3JtYXRDaGlsZCh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVYU0RXaGl0ZVNwYWNlRmFjZXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVYU0RXaGl0ZVNwYWNlRmFjZXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOTJjM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlWFNEV2hpdGVTcGFjZUZhY2V0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaGl0ZVNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaGl0ZVNwYWNlRmFjZXQ7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVYU0RXaGl0ZVNwYWNlRmFjZXRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZURlZmluaXRpb247Ci0gIGJvb2xlYW4gZG9BZGRGYWNldDsKLSAgCi0gIHB1YmxpYyBVcGRhdGVYU0RXaGl0ZVNwYWNlRmFjZXRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZSwgYm9vbGVhbiBkb0FkZEZhY2V0KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkU2ltcGxlVHlwZURlZmluaXRpb24gPSB4c2RTaW1wbGVUeXBlOwotICAgIHRoaXMuZG9BZGRGYWNldCA9IGRvQWRkRmFjZXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RXaGl0ZVNwYWNlRmFjZXQgd2hpdGVzcGFjZUZhY2V0ID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0V2hpdGVTcGFjZUZhY2V0KCk7Ci0KLSAgICAgIGlmIChkb0FkZEZhY2V0KQotICAgICAgewotICAgICAgICBpZiAod2hpdGVzcGFjZUZhY2V0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB3aGl0ZXNwYWNlRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RXaGl0ZVNwYWNlRmFjZXQoKTsKLSAgICAgICAgICB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRGYWNldENvbnRlbnRzKCkuYWRkKHdoaXRlc3BhY2VGYWNldCk7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpdGVzcGFjZUZhY2V0LnNldExleGljYWxWYWx1ZShYU0RXaGl0ZVNwYWNlLkNPTExBUFNFX0xJVEVSQUwuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHdoaXRlc3BhY2VGYWNldCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZSh3aGl0ZXNwYWNlRmFjZXQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmb3JtYXRDaGlsZCh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3Byb3ZpZGVycy9YU0RTZWN0aW9uTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9wcm92aWRlcnMvWFNEU2VjdGlvbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIxZTVmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3Byb3ZpZGVycy9YU0RTZWN0aW9uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuRmlsZVN0b3JlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTZWN0aW9uTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLXsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFhTRFNlY3Rpb25MYWJlbFByb3ZpZGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIGlmIChvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QuZXF1YWxzKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBJbWFnZSByZXN1bHQgPSBudWxsOwotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIE9iamVjdCBzZWxlY3RlZCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0KS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIFhTREJhc2VBZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQmFzZUFkYXB0ZXIpWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCgoWFNEQ29uY3JldGVDb21wb25lbnQpc2VsZWN0ZWQpOwotICAgICAgICByZXR1cm4gKChJVHJlZUVsZW1lbnQpYWRhcHRlcikuZ2V0SW1hZ2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0ID09IG51bGwgfHwgb2JqZWN0LmVxdWFscyhTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKSkKLSAgICB7Ci0gICAgICByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfTk9fSVRFTVNfU0VMRUNURUQ7Ci0gICAgfQotCi0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLSAgICBib29sZWFuIGlzUmVmZXJlbmNlID0gZmFsc2U7Ci0gICAgT2JqZWN0IHNlbGVjdGVkID0gbnVsbDsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBzZWxlY3RlZCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0KS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgICAgewotICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBzZWxlY3RlZDsKLSAgICAgICAgICBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXNSZWZlcmVuY2UgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHNlbGVjdGVkKS5pc0F0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXNSZWZlcmVuY2UgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCgoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHNlbGVjdGVkKS5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXNSZWZlcmVuY2UgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpIHNlbGVjdGVkKS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzYi5hcHBlbmQoKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgc2VsZWN0ZWQpLmdldEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKSk7Ci0KLSAgICAgICAgICBpZiAoaXNSZWZlcmVuY2UpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCIgcmVmIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgLy8gVGhpcyBzdHJpbmcgaXMgbm90IGVhc2lseSB0cmFuc2xhdGFibGUgdG8gb3RoZXIgbGFuZ3VhZ2VzLgotICAgICAgICAgICAgLy8gRm9yIG5vdywgbWFrZSBpdCBlbmdsaXNoLW9ubHkgc2luY2Ugd2UgdXNlIHRoZSBlbGVtZW50IHRhZyBhcyB0aGUgdGl0bGUgYW55d2F5Ci0vLyAgICAgICAgICAgIHNiLmFwcGVuZChNZXNzYWdlcy5VSV9QQUdFX0hFQURJTkdfUkVGRVJFTkNFKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBzZWxlY3RlZCkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgIGlmICghKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCB8fCBlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIEZpbGVTdG9yZUVkaXRvcklucHV0KSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlzUmVhZE9ubHkgPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChlZGl0b3JQYXJ0ICE9IG51bGwgJiYgeHNkU2NoZW1hICE9IGVkaXRvclBhcnQuZ2V0QWRhcHRlcihYU0RTY2hlbWEuY2xhc3MpIHx8IGlzUmVhZE9ubHkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAoIiArIE1lc3NhZ2VzLlVJX0xBQkVMX1JFQURfT05MWSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIG51bGwsIHRoZW4gbGV0J3MgdXNlIHRoZSBtb2RlbCBvYmplY3QgdG8gZmluZAotICAgICAgICAgIC8vIGFuIGFwcHJvcHJpYXRlIG5hbWUKLSAgICAgICAgICBpZiAoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBzZWxlY3RlZCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoKFhTRE5hbWVkQ29tcG9uZW50KXNlbGVjdGVkKS5nZXROYW1lKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgc2VsZWN0ZWQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFhTRENvbnN0YW50cy5TQ0hFTUFfRUxFTUVOVF9UQUc7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGxhc3QgcmVzb3J0Li4uLgotICAgICAgICAgIHJldHVybiAiKCIgKyBNZXNzYWdlcy5VSV9MQUJFTF9SRUFEX09OTFkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICByZXR1cm4gKChFbGVtZW50KSBvYmplY3QpLmdldExvY2FsTmFtZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQWJzdHJhY3RFeHRlbnNpb25zU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9BYnN0cmFjdEV4dGVuc2lvbnNTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNzA1YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9BYnN0cmFjdEV4dGVuc2lvbnNTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRFeHRlbnNpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5BZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5ET01FeHRlbnNpb25EZXRhaWxzQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5ET01FeHRlbnNpb25JdGVtTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5FeHRlbnNpb25EZXRhaWxzVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5FeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5TcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEV4dGVuc2lvbnNTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIHByb3RlY3RlZCBFeHRlbnNpb25EZXRhaWxzVmlld2VyIGV4dGVuc2lvbkRldGFpbHNWaWV3ZXI7Ci0gIHByb3RlY3RlZCBUcmVlVmlld2VyIGV4dGVuc2lvblRyZWVWaWV3ZXI7Ci0gIHByb3RlY3RlZCBJVHJlZUNvbnRlbnRQcm92aWRlciBleHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyOwotICBwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgZXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBMYWJlbCBjb250ZW50TGFiZWw7Ci0gIHByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGVsZW1lbnRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci0gIHByb3RlY3RlZCBJRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXIgZG9jdW1lbnRDaGFuZ2VOb3RpZmllcjsKLSAgcHJvdGVjdGVkIElOb2RlQWRhcHRlciBpbnRlcm5hbE5vZGVBZGFwdGVyID0gbmV3IEludGVybmFsTm9kZUFkYXB0ZXIoKTsKLQotICBwcml2YXRlIENvbXBvc2l0ZSBwYWdlOwotICBwcm90ZWN0ZWQgQnV0dG9uIGFkZEJ1dHRvbiwgcmVtb3ZlQnV0dG9uOwotICBwcml2YXRlIE9iamVjdCBwcmV2SW5wdXQ7Ci0gIHByaXZhdGUgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgcHJldkNhdGVnb3J5OwotCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBBYnN0cmFjdEV4dGVuc2lvbnNTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7Ci0gICAgZXh0ZW5zaW9uRGV0YWlsc1ZpZXdlci5zZXRDb21tYW5kU3RhY2soZ2V0Q29tbWFuZFN0YWNrKCkpOwotICB9Ci0gIAotICBjbGFzcyBJbnRlcm5hbE5vZGVBZGFwdGVyIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyCi0gIHsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgLy8gdGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZAotICAgICAgLy8gd2UgZG9uJ3QgdXNlIG9iamVjdHMgb2YgdGhpcyBjbGFzcyBhcyAnc3RhbmRhcmQnIGFkYXB0ZXJzCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpCi0gICAgeyAgICAgCi0gICAgICBib29sZWFuIGlzUm9vdCA9IGZhbHNlOwotICAgICAgaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGlzVHJlZVZpZXdlcklucHV0RWxlbWVudCgoRWxlbWVudClub3RpZmllcikpLy8gVE9ETwotICAgICAgICB7Ci0gICAgICAgICAgaXNSb290ID0gdHJ1ZTsKLSAgICAgICAgICBleHRlbnNpb25UcmVlVmlld2VyLnJlZnJlc2goZXh0ZW5zaW9uVHJlZVZpZXdlci5nZXRJbnB1dCgpKTsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgICBpZiAoIWlzUm9vdCkKLSAgICAgIHsgIAotICAgICAgICBleHRlbnNpb25UcmVlVmlld2VyLnJlZnJlc2gobm90aWZpZXIpOwotICAgICAgICBpZiAoIG5ld1ZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbChub3RpZmllciwgMSk7Ci0gICAgICAgICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3VmFsdWUpKTsKLSAgICAgICAgfQotICAgICAgfSAgCi0gICAgfSAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNUcmVlVmlld2VySW5wdXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBUT0RPIChjcykgYWRkIGFzc2VydGlvbgotICAgIGlmIChleHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyID09IG51bGwpCi0gICAgICAgcmV0dXJuOwotICAgIAotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgIGRvY3VtZW50Q2hhbmdlTm90aWZpZXIgPSAoSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyKWVkaXRvci5nZXRBZGFwdGVyKElEb2N1bWVudENoYW5nZWROb3RpZmllci5jbGFzcyk7Ci0gICAgCi0gICAgaWYgKGRvY3VtZW50Q2hhbmdlTm90aWZpZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkb2N1bWVudENoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKGludGVybmFsTm9kZUFkYXB0ZXIpOwotICAgIH0gIAotICAgIAotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0KLSAgICBwYWdlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBwYWdlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBwYWdlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIAotICAgIFNhc2hGb3JtIHNhc2hGb3JtID0gbmV3IFNhc2hGb3JtKHBhZ2UsIFNXVC5IT1JJWk9OVEFMKTsKLSAgICAvLyBUcnkgdG8gbGltaXQgdGhlIGluaXRpYWwgd2lkdGggb2YgdGhlIHNlY3Rpb24KLSAgICAKLSAgICBpbnQgdyA9IFNXVC5ERUZBVUxUOwotICAgIHRyeQotICAgIHsKLSAgICAgIElXb3JrYmVuY2hQYXJ0IHBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0KLSAgICAgIC8vIEZpbmQgdGhlIHdpZHRoIG9mIHRoZSBUYWJiZWQgUHJvcGVydHkgU2hlZXQncyBjb21wb3NpdGUgZXhjbHVkaW5nIHRoZSB0YWIKLSAgICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkKLSAgICAgIHsKLSAgICAgICAgUHJvcGVydHlTaGVldCBzaGVldCA9IChQcm9wZXJ0eVNoZWV0KXBhcnQ7Ci0gICAgICAgIGlmIChzaGVldC5nZXRDdXJyZW50UGFnZSgpIGluc3RhbmNlb2YgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQYWdlID0gKFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKXNoZWV0LmdldEN1cnJlbnRQYWdlKCk7Ci0gICAgICAgICAgQ29tcG9zaXRlIHRhcmdldENvbXBvc2l0ZSA9IG51bGw7Ci0gICAgICAgICAgaWYgKHRhYmJlZFBhZ2UuZ2V0Q29udHJvbCgpIGluc3RhbmNlb2YgQ29tcG9zaXRlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENvbXBvc2l0ZSBjID0gKENvbXBvc2l0ZSl0YWJiZWRQYWdlLmdldENvbnRyb2woKTsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBjLmdldENoaWxkcmVuKCkubGVuZ3RoOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQ29udHJvbCBjdHJsID0gYy5nZXRDaGlsZHJlbigpW2ldOwotICAgICAgICAgICAgICBpbnQgbGVuZ3RoMiAgPSAoKChDb21wb3NpdGUpY3RybCkuZ2V0Q2hpbGRyZW4oKSkubGVuZ3RoOwotICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDI7IGorKyApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKCgoQ29tcG9zaXRlKWN0cmwpLmdldENoaWxkcmVuKCkpW2pdIGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgdGFyZ2V0Q29tcG9zaXRlID0gKENvbXBvc2l0ZSkoKChDb21wb3NpdGUpY3RybCkuZ2V0Q2hpbGRyZW4oKSlbal07Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHRhcmdldENvbXBvc2l0ZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHcgPSB0YXJnZXRDb21wb3NpdGUuZ2V0U2l6ZSgpLnggLSAyMDsgIC8vIGVuc3VyZSBzY3JvbGxiYXJzIGRvbid0IHNob3cKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gVGhlIGFib3ZlIGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgdGhlIGZvbGxvd2luZyBjb2RlCi0gICAgICAgICAgLy8gYnV0IGJlY2F1c2UgVGFiYmVkUHJvcGVydHlDb21wb3NpdGUgaXMgaW4gYW4gaW50ZXJuYWwgcGFja2FnZSwgSSB3aWxsIGdldCBhIGRpc2NvdXJhZ2VkCi0gICAgICAgICAgLy8gYWNjZXNzIHdhcm5pbmcuCi0gICAgICAgICAgLy8gdyA9ICgoVGFiYmVkUHJvcGVydHlDb21wb3NpdGUpKHRhYmJlZFBhZ2UuZ2V0Q29udHJvbCgpKSkuZ2V0VGFiQ29tcG9zaXRlKCkuZ2V0U2l6ZSgpLng7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdyA9IFNXVC5ERUZBVUxUOwotICAgIH0KLSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgLy8gVGhlIGluaXRpYWwgc2l6ZSBzaG91bGQgYmUgc2V0LCBub3QgdGhlIHdpZHRoSGludCwgd2hpY2ggZm9yY2VzIHRoZSB3aWR0aAotICAgIC8vIHRvIHJlbWFpbiBjb25zdGFudC4KLSAgICBzYXNoRm9ybS5zZXRTaXplKHcsIFNXVC5ERUZBVUxUKTsKLSAgICBzYXNoRm9ybS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICBzYXNoRm9ybS5zZXRGb3JlZ3JvdW5kKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLSAgICBzYXNoRm9ybS5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLSAgICBDb250cm9sW10gY2hpbGRyZW4gPSBzYXNoRm9ybS5nZXRDaGlsZHJlbigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgY2hpbGRyZW5baV0uc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgfQotICAgIENvbXBvc2l0ZSBsZWZ0Q29udGVudCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoc2FzaEZvcm0sIFNXVC5GTEFUKTsKLSAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGxlZnRDb250ZW50LnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIFNlY3Rpb24gc2VjdGlvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKGxlZnRDb250ZW50LCBTV1QuRkxBVCB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSKTsKLSAgICBzZWN0aW9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0VYVEVOU0lPTlMpOwotICAgIHNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICBDb21wb3NpdGUgdGFibGVBbmRCdXR0b25Db21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKGxlZnRDb250ZW50LCBTV1QuRkxBVCk7Ci0gICAgdGFibGVBbmRCdXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICB0YWJsZUFuZEJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7ICAgIAotICAgIAotICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0YWJsZUFuZEJ1dHRvbkNvbXBvc2l0ZSwgU1dULkZMQVQgfCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkxJTkVfU09MSUQpOwotICAgIE1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCk7ICAgIAotICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldE1lbnUobWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUoZXh0ZW5zaW9uVHJlZVZpZXdlci5nZXRUcmVlKCkpKTsKLSAgICBtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobmV3IERPTUV4dGVuc2lvbkl0ZW1NZW51TGlzdGVuZXIoZXh0ZW5zaW9uVHJlZVZpZXdlcikpOwotICAgIAotICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgIAotICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIpOwotICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihleHRlbnNpb25UcmVlTGFiZWxQcm92aWRlcik7Ci0gICAgZWxlbWVudFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG5ldyBFbGVtZW50U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCk7Ci0gICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZWxlbWVudFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0gICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5nZXRUcmVlKCkuYWRkTW91c2VUcmFja0xpc3RlbmVyKG5ldyBNb3VzZVRyYWNrQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgbW91c2VIb3ZlcihvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQgZSkKLSAgICAgIHsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBleHRlbnNpb25UcmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvYmogPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG9iajsKLSAgICAgICAgICAgIEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICAvLyBBcHBsaWNhdGlvblNwZWNpZmljU2NoZW1hUHJvcGVydGllc1tdIHByb3BlcnRpZXMgPQotICAgICAgICAgICAgLy8gcmVnaXN0cnkuZ2V0QWxsQXBwbGljYXRpb25TcGVjaWZpY1NjaGVtYVByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIC8vIEFwcGxpY2F0aW9uU3BlY2lmaWNTY2hlbWFQcm9wZXJ0aWVzW10gcHJvcGVydGllcyA9Ci0gICAgICAgICAgICAvLyAoQXBwbGljYXRpb25TcGVjaWZpY1NjaGVtYVByb3BlcnRpZXNbXSkKLSAgICAgICAgICAgIC8vIHJlZ2lzdHJ5LmdldEFsbEFwcGxpY2F0aW9uU3BlY2lmaWNTY2hlbWFQcm9wZXJ0aWVzKCkudG9BcnJheShuZXcKLSAgICAgICAgICAgIC8vIEFwcGxpY2F0aW9uU3BlY2lmaWNTY2hlbWFQcm9wZXJ0aWVzWzBdKTsKLSAgICAgICAgICAgIExpc3QgcHJvcGVydGllcyA9IHJlZ2lzdHJ5LmdldEFsbEV4dGVuc2lvbnNTY2hlbWFzQ29udHJpYnV0aW9uKCk7Ci0KLSAgICAgICAgICAgIGludCBsZW5ndGggPSBwcm9wZXJ0aWVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIGN1cnJlbnQgPSAoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpIHByb3BlcnRpZXMuZ2V0KGkpOwotICAgICAgICAgICAgICBpZiAoY3VycmVudC5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHRlbnNpb25UcmVlVmlld2VyLmdldFRyZWUoKS5zZXRUb29sVGlwVGV4dChjdXJyZW50LmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9KTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGV4dGVuc2lvblRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkVYVEVOU0lPTlNfVEFCX19FWFRFTlNJT05TKTsgCi0gICAgCi0gICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUodGFibGVBbmRCdXR0b25Db21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICAvL0NvbHVtbkxheW91dCBjb2x1bW5MYXlvdXQgPSBuZXcgQ29sdW1uTGF5b3V0KCk7Ci0gICAgLy9idXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGNvbHVtbkxheW91dCk7Ci0gICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBncmlkTGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAKLSAgICBhZGRCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfV0lUSF9ET1RTLCBTV1QuRkxBVCk7ICAgCi0gICAgYWRkQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBhZGRCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRVhURU5TSU9OX0NPTVBPTkVOVCk7Ci0gICAgLy9hZGRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgQ29sdW1uTGF5b3V0RGF0YShDb2x1bW5MYXlvdXREYXRhLkZJTEwpKTsKLSAgICBhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChhZGRCdXR0b24sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuRVhURU5TSU9OU19UQUJfX0FERCk7ICAgICAKLSAgICAKLSAgICByZW1vdmVCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0RFTEVURV9CVVRUT04sIFNXVC5GTEFUKTsKLSAgICByZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0gICAgcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIHJlbW92ZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0RFTEVURV9FWFRFTlNJT05fQ09NUE9ORU5UKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJlbW92ZUJ1dHRvbiwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5FWFRFTlNJT05TX1RBQl9fREVMRVRFKTsgICAKLSAgICAKLSAgICAvL3JlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBDb2x1bW5MYXlvdXREYXRhKENvbHVtbkxheW91dERhdGEuRklMTCkpOwotCi0gICAgLy8gVE9ETyAoY3MpIHVuY29tbWVudCB0aGUgdXAvZG93biBidXR0b24gd2hlbiB3ZSBoYXZlIHRpbWUgdG8gaW1wbGVtZW50Ci0gICAgLy8KLSAgICAvL0J1dHRvbiB1cCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfVVAsIFNXVC5GTEFUKTsKLSAgICAvL3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIAotICAgIC8vQnV0dG9uIGRvd24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0RPV04sIFNXVC5GTEFUKTsKLSAgICAvL2Rvd24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICBDb21wb3NpdGUgcmlnaHRDb250ZW50ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShzYXNoRm9ybSwgU1dULkZMQVQpOwotICAgIFNlY3Rpb24gc2VjdGlvbjIgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlU2VjdGlvbihyaWdodENvbnRlbnQsIFNXVC5GTEFUIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIpOwotICAgIHNlY3Rpb24yLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0VYVEVOU0lPTl9ERVRBSUxTKTsKLSAgICBzZWN0aW9uMi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAvL2NvbnRlbnRMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChyaWdodENvbnRlbnQsICJDb250ZW50Iik7Ci0KLSAgICBDb21wb3NpdGUgdGVzdENvbXAgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHJpZ2h0Q29udGVudCwgU1dULkZMQVQpOwotCi0gICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAzOwotICAgIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAzOwotICAgIHJpZ2h0Q29udGVudC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgcmlnaHRDb250ZW50LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMzsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMzsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIHRlc3RDb21wLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICB0ZXN0Q29tcC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgIGNyZWF0ZUVsZW1lbnRDb250ZW50V2lkZ2V0KHRlc3RDb21wKTsKLQotICAgIGludFtdIHdlaWdodHMgPSB7IDQwLCA2MCB9OwotICAgIHNhc2hGb3JtLnNldFdlaWdodHMod2VpZ2h0cyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFbGVtZW50Q29udGVudFdpZGdldChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgZXh0ZW5zaW9uRGV0YWlsc1ZpZXdlciA9IG5ldyBFeHRlbnNpb25EZXRhaWxzVmlld2VyKHBhcmVudCwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLSAgICBleHRlbnNpb25EZXRhaWxzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgRE9NRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlcigpKTsgICAgCi0gICAgZXh0ZW5zaW9uRGV0YWlsc1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChleHRlbnNpb25EZXRhaWxzVmlld2VyLmdldENvbnRyb2woKSwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5FWFRFTlNJT05TX1RBQl9fRVhURU5TSU9OU19ERVRBSUxTKTsgICAKLSAgfQotICAKLQotICAvKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKCBwcmV2SW5wdXQgPT0gaW5wdXQpCi0gICAgCSAgcmV0dXJuOwotICAgICAgZWxzZQotICAgIAkgIHByZXZJbnB1dCA9IGlucHV0OwotICAgICAgCi0gICAgICBUcmVlIHRyZWUgPSBleHRlbnNpb25UcmVlVmlld2VyLmdldFRyZWUoKTsKLSAgICAgIGV4dGVuc2lvbkRldGFpbHNWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0gICAgICB0cmVlLnJlbW92ZUFsbCgpOwotICAgICAgCi0gICAgICBhZGRCdXR0b24uc2V0RW5hYmxlZCghaXNSZWFkT25seSk7Ci0gICAgICAKLSAgICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotICAgICAgaWYgKHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSA9PSAwICYmIHRyZWUuZ2V0SXRlbUNvdW50KCkgPiAwKQotICAgICAgeyAgICAgICAKLSAgICAgICAgVHJlZUl0ZW0gdHJlZUl0ZW0gPSB0cmVlLmdldEl0ZW0oMCk7ICAgICAKLSAgICAgICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odHJlZUl0ZW0uZ2V0RGF0YSgpKSk7Ci0gICAgICB9Ci0gICAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZCh0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkgPiAwICAmJiAhaXNSZWFkT25seSk7Ci0gICAgICAvLyBCdWd6aWxsYSAxOTczMTUuICBNYWtlIHRoaXMgYnVsbGV0cHJvb2YgZm9yIG1haW50ZW5hbmNlIHJlbGVhc2UuCi0gICAgICBDb250cm9sIGRldGFpbHNWaWV3ZXJDb250cm9sID0gZXh0ZW5zaW9uRGV0YWlsc1ZpZXdlci5nZXRDb250cm9sKCk7Ci0gICAgICBpZiAoZGV0YWlsc1ZpZXdlckNvbnRyb2wgIT0gbnVsbCAmJiAhZGV0YWlsc1ZpZXdlckNvbnRyb2wuaXNEaXNwb3NlZCgpKQotICAgICAgewotICAgICAgICBkZXRhaWxzVmlld2VyQ29udHJvbC5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0KLSAgcHVibGljIENvbXBvc2l0ZSBnZXRQYWdlKCkKLSAgewotICAgIHJldHVybiBwYWdlOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IEFkZEV4dGVuc2lvbkNvbW1hbmQgZ2V0QWRkRXh0ZW5zaW9uQ29tbWFuZChPYmplY3Qgbyk7Ci0gIHByb3RlY3RlZCBhYnN0cmFjdCBDb21tYW5kIGdldFJlbW92ZUV4dGVuc2lvbkNvbW1hbmQoT2JqZWN0IG8pOyAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5IGdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKTsKLSAgCi0gIHByb3RlY3RlZCBBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nIGNyZWF0ZUFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2coKQotICB7Ci0gICAgcmV0dXJuIG5ldyBBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nKGNvbXBvc2l0ZS5nZXRTaGVsbCgpLCBnZXRFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5KCkpOwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBhZGRCdXR0b24pCi0gICAgewotICAgICAgRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSByZWdpc3RyeSA9IGdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKTsKLSAgICAgIEFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2cgZGlhbG9nID0gY3JlYXRlQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZygpOwotCi0gICAgICBMaXN0IHByb3BlcnRpZXMgPSByZWdpc3RyeS5nZXRBbGxFeHRlbnNpb25zU2NoZW1hc0NvbnRyaWJ1dGlvbigpOwotCi0gICAgICBkaWFsb2cuc2V0SW5wdXQocHJvcGVydGllcyk7Ci0gICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICBkaWFsb2cuc2V0UHJlZlN0b3JlKCBnZXRQcmVmU3RvcmUoKSApOwotICAgICAgCi0gICAgICBpZiAocHJldkNhdGVnb3J5ICE9IG51bGwpCi0gICAgCSAgZGlhbG9nLnNldEluaXRpYWxDYXRlZ29yeVNlbGVjdGlvbihwcmV2Q2F0ZWdvcnkpOwotCi0gICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBuZXdTZWxlY3Rpb24gPSBudWxsOyAgICAgICAgICAKLSAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gZGlhbG9nLmdldFJlc3VsdCgpOyAgICAgIAotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBleHRlbnNpb25zU2NoZW1hU3BlYyA9IChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSkgcmVzdWx0WzFdOwotICAgICAgICAgIEFkZEV4dGVuc2lvbkNvbW1hbmQgYWRkRXh0ZW5zaW9uQ29tbWFuZCA9IGdldEFkZEV4dGVuc2lvbkNvbW1hbmQocmVzdWx0WzBdKTsKLSAgICAgICAgICBpZiAoYWRkRXh0ZW5zaW9uQ29tbWFuZCAhPSBudWxsKQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgYWRkRXh0ZW5zaW9uQ29tbWFuZC5zZXRTY2hlbWFQcm9wZXJ0aWVzKGV4dGVuc2lvbnNTY2hlbWFTcGVjKTsKLSAgICAgICAgICAgIGlmIChnZXRDb21tYW5kU3RhY2soKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGFkZEV4dGVuc2lvbkNvbW1hbmQpOwotICAgICAgICAgICAgICBuZXdTZWxlY3Rpb24gPSBhZGRFeHRlbnNpb25Db21tYW5kLmdldE5ld09iamVjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL3JlZnJlc2goKTsKLSAgICAgICAgaWYgKG5ld1NlbGVjdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcHJldkNhdGVnb3J5ID0gZGlhbG9nLmdldFNlbGVjdGVkQ2F0ZWdvcnkoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHJlbW92ZUJ1dHRvbikKLSAgICB7Ci0gICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV4dGVuc2lvblRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gZ2V0UmVtb3ZlRXh0ZW5zaW9uQ29tbWFuZChvKTsgICAgICAgICAgICAKLSAgICAgICAgaWYgKGdldENvbW1hbmRTdGFjaygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBleHRlbnNpb25UcmVlVmlld2VyLmdldFRyZWUoKSkKLSAgICB7Ci0KLSAgICB9Ci0gIH0KLQotICAvLyBUT0RPIG1ha2UgdGhpcyBvbmUgYW4gYWJzdHJhY3QgbWV0aG9kLiBYU0RFZGl0b3IgYW5kIFdTRExFZGl0b3Igc2hvdWxkIHJldHVybgotICAvLyBkaWZlcmVudCBJcHJlZmVyZW5jZVN0b3JlIG9iamVjdHMKLSAgcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZlN0b3JlKCkgewotCXJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmIChkb2N1bWVudENoYW5nZU5vdGlmaWVyICE9IG51bGwpCi0gICAgICBkb2N1bWVudENoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKGludGVybmFsTm9kZUFkYXB0ZXIpOwotICB9Ci0gCi0KLSAgTm9kZSBzZWxlY3RlZE5vZGU7Ci0KLSAgY2xhc3MgRWxlbWVudFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgIHsgICAKLSAgICAgIGJvb2xlYW4gaXNEZWxldGVFbmFibGVkID0gZmFsc2U7Ci0gICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICB7Ci0gICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgICAgaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID4gMCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgT2JqZWN0IG9iaiA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VsZWN0ZWROb2RlID0gKE5vZGUpIG9iajsKLSAgICAgICAgICAgIGV4dGVuc2lvbkRldGFpbHNWaWV3ZXIuc2V0SW5wdXQob2JqKTsKLSAgICAgICAgICAgIGlzRGVsZXRlRW5hYmxlZCA9IHRydWU7ICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9ICAKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gaWYgbm90aGluZyBpcyBzZWxlY3RlZCB0aGVuIGRvbid0IHNob3cgYW55IGRldGFpbHMKLSAgICAgICAgICAvLwotICAgICAgICAgIGV4dGVuc2lvbkRldGFpbHNWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcG9uIGVsZW1lbnQgc2VsZWN0aW9uLCB0aGUgZGV0YWlscyB2aWV3IHBvcHVsYXRlcyBmaW5lLCBidXQgdGhlcmUgaXMgbm8gdmVydGljYWwgc2Nyb2xsYmFyLAotICAgICAgICAvLyBzbyBpdCBtaXNsZWFkcyB0aGUgdXNlciBpbnRvIHRoaW5raW5nIHRoZXJlIGFyZSBubyBvdGhlciBhdHRyaWJ1dGVzIGF2YWlsYWJsZQotICAgICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NDA3MwotICAgICAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCB0byBmb3JjZSBhIGxheW91dCBvZiB0aGUgdGFiIGNvbXBvc2l0ZQotICAgICAgICBJV29ya2JlbmNoUGFydCBwYXJ0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlUGFydCgpOwotICAgICAgICBpZiAocGFydCBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXQpCi0gICAgICAgIHsKLSAgICAgICAgICBQcm9wZXJ0eVNoZWV0IHNoZWV0ID0gKFByb3BlcnR5U2hlZXQpcGFydDsKLSAgICAgICAgICBpZiAoc2hlZXQuZ2V0Q3VycmVudFBhZ2UoKSBpbnN0YW5jZW9mIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFBhZ2UgPSAoVGFiYmVkUHJvcGVydHlTaGVldFBhZ2Upc2hlZXQuZ2V0Q3VycmVudFBhZ2UoKTsKLSAgICAgICAgICAgIGlmICh0YWJiZWRQYWdlLmdldENvbnRyb2woKSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQ29tcG9zaXRlIGMgPSAoQ29tcG9zaXRlKXRhYmJlZFBhZ2UuZ2V0Q29udHJvbCgpOwotICAgICAgICAgICAgICBQb2ludCBwID0gYy5nZXRTaXplKCk7Ci0gICAgICAgICAgICAgIC8vIGMubGF5b3V0KHRydWUsIHRydWUpIGRvZXNuJ3QgYXBwZWFyIHRvIHdvcmsuCi0gICAgICAgICAgICAgIC8vIEJ1dCB0aGlzIGZvcmNlcyBhIHJlbGF5b3V0OgotICAgICAgICAgICAgICBjLnNldFNpemUocC54LCBwLnkgKyAxKTsKLSAgICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBzaXplIGJhY2sgdG8gdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgIGMuc2V0U2l6ZShwLngsIHAueSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZChpc0RlbGV0ZUVuYWJsZWQgJiYgIWlzUmVhZE9ubHkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBJVHJlZUNvbnRlbnRQcm92aWRlciBnZXRFeHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyKCkKLSAgewotICAgIHJldHVybiBleHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcihJVHJlZUNvbnRlbnRQcm92aWRlciBleHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5leHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyID0gZXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcjsKLSAgfQotCi0gIHB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRFeHRlbnNpb25UcmVlTGFiZWxQcm92aWRlcigpCi0gIHsKLSAgICByZXR1cm4gZXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25UcmVlTGFiZWxQcm92aWRlcihJTGFiZWxQcm92aWRlciBleHRlbnNpb25UcmVlTGFiZWxQcm92aWRlcikKLSAgewotICAgIHRoaXMuZXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXIgPSBleHRlbnNpb25UcmVlTGFiZWxQcm92aWRlcjsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQWJzdHJhY3RTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0Fic3RyYWN0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDA3YjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQWJzdHJhY3RTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YkNvbnRyaWJ1dGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YlN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5Gb3JtQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5GaWxlU3RvcmVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlTZWN0aW9uIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIsIExpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBDb21wb3NpdGUgY29tcG9zaXRlOwotICBwcm90ZWN0ZWQgUGFpbnRMaXN0ZW5lciBwYWludGVyOwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgcHJvdGVjdGVkIE9iamVjdCBpbnB1dDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkT25seTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gbGlzdGVuZXJFbmFibGVkID0gdHJ1ZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTaW1wbGU7Ci0gIHByb3RlY3RlZCBDdXN0b21MaXN0ZW5lciBjdXN0b21MaXN0ZW5lciA9IG5ldyBDdXN0b21MaXN0ZW5lcigpOwotICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgb3duaW5nRWRpdG9yOwotICBwcml2YXRlIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1RyYXZlcnNpbmcgPSBmYWxzZTsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSUNPTl9FUlJPUiA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19FUlJPUl9UU0spOwotICAKLSAgcHVibGljIEFic3RyYWN0U2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBhVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGFUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0gICAgaXNTaW1wbGUgPSBnZXRJc1NpbXBsZSgpOwotICAgIGNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0gICAgcHJvdGVjdGVkIFBhaW50TGlzdGVuZXIgY3JlYXRlUGFpbnRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQYWludExpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0vLyAgICAgICAgICAgICAgICBSZWN0YW5nbGUgYm91bmRzID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgICAgICBHQyBnYyA9IGUuZ2M7Ci0KLSAgICAgICAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGdjLmdldEJhY2tncm91bmQoKSk7Ci0gICAgICAgICAgICAgICAgZ2Muc2V0QmFja2dyb3VuZChnZXRXaWRnZXRGYWN0b3J5KCkuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoCi0gICAgICAgICAgICAgICAgICAgIEZvcm1Db2xvcnMuVEJfQkcpKTsKLQotLy8gICAgICAgICAgICAgICAgZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKDQgKyBib3VuZHMud2lkdGggLyAyLCAwLAotLy8gICAgICAgICAgICAgICAgICAgIGJvdW5kcy53aWR0aCAvIDIgLSA5LCBib3VuZHMuaGVpZ2h0LCBmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGdldFdpZGdldEZhY3RvcnkoKS5nZXRDb2xvcnMoKS5nZXRDb2xvcigKLSAgICAgICAgICAgICAgICAgICAgRm9ybUNvbG9ycy5UQl9CT1JERVIpKTsKLS8vICAgICAgICAgICAgICAgIGdjLmRyYXdMaW5lKGJvdW5kcy53aWR0aCAtIDUsIDAsIGJvdW5kcy53aWR0aCAtIDUsCi0vLyAgICAgICAgICAgICAgICAgICAgYm91bmRzLmhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfTsKLQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgICAgIGlmIChjb21wb3NpdGUgIT0gbnVsbCAmJiAhIGNvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkgJiYgcGFpbnRlciAhPSBudWxsKQotICAgICAgICAgICAgY29tcG9zaXRlLnJlbW92ZVBhaW50TGlzdGVuZXIocGFpbnRlcik7Ci0gICAgICAgIAotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gICAgewotICAgICAgICBzdXBlci5zZXRJbnB1dChwYXJ0LCBzZWxlY3Rpb24pOwotICAgICAgICBpc1NpbXBsZSA9IGdldElzU2ltcGxlKCk7Ci0gICAgICAgIE9iamVjdCBpbnB1dCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICAgICAgICAKLSAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RTY2hlbWEgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KWlucHV0KS5nZXRTY2hlbWEoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gc2V0IG93bmluZyBlZGl0b3Igb2YgdGhpcyBzZWN0aW9uCi0gICAgICAgIGlmIChwYXJ0IT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG93bmluZ0VkaXRvciA9IChJRWRpdG9yUGFydClwYXJ0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG93bmluZ0VkaXRvciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoeHNkU2NoZW1hID09IG93bmluZ0VkaXRvci5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcykpCi0gICAgICAgIHsKLSAgICAgICAgICBpc1JlYWRPbmx5ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaXNSZWFkT25seSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBvd25pbmdFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgaWYgKCEoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0IHx8IGVkaXRvcklucHV0IGluc3RhbmNlb2YgRmlsZVN0b3JlRWRpdG9ySW5wdXQpKQotICAgICAgICB7Ci0gICAgICAgICAgaXNSZWFkT25seSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgICB7Ci0gICAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZCghaXNSZWFkT25seSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwbHlBbGxMaXN0ZW5lcnMoQ29udHJvbCBjb250cm9sKQotICAgIHsKLSAgICAgIGNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgY3VzdG9tTGlzdGVuZXIpOwotICAgICAgY29udHJvbC5hZGRMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIGN1c3RvbUxpc3RlbmVyKTsKLSAgICAgIGNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULktleURvd24sIGN1c3RvbUxpc3RlbmVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYXBwbHlNb2RpZnlMaXN0ZW5lcnMoQ29udHJvbCBjb250cm9sKQotICAgIHsKLSAgICAgIGNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgY3VzdG9tTGlzdGVuZXIpOwotICAgICAgY29udHJvbC5hZGRMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIGN1c3RvbUxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBseUtleUxpc3RlbmVyKENvbnRyb2wgY29udHJvbCkKLSAgICB7Ci0gICAgICBjb250cm9sLmFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXJzKENvbnRyb2wgY29udHJvbCkKLSAgICB7Ci0gICAgICBjb250cm9sLnJlbW92ZUxpc3RlbmVyKFNXVC5Nb2RpZnksIGN1c3RvbUxpc3RlbmVyKTsKLSAgICAgIGNvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgICBjb250cm9sLnJlbW92ZUxpc3RlbmVyKFNXVC5LZXlEb3duLCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRvV2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAge30KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAge30KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYKLSAgICAgICAgICBpbnB1dCAhPSBudWxsICYmCi0gICAgICAgICAgIWlzUmVhZE9ubHkpIAotICAgICAgewotICAgICAgICBkb1dpZGdldFNlbGVjdGVkKGUpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIGlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmCi0gICAgICAgICAgaW5wdXQgIT0gbnVsbCAmJgotICAgICAgICAgICFpc1JlYWRPbmx5KSAKLSAgICAgIHsKLSAgICAgICAgZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2YWx1ZSBvZiBsaXN0ZW5lckVuYWJsZWQuCi0gICAgICogQHJldHVybiB2YWx1ZSBvZiBsaXN0ZW5lckVuYWJsZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaXN0ZW5lckVuYWJsZWQoKSAKLSAgICB7Ci0gICAgICByZXR1cm4gbGlzdGVuZXJFbmFibGVkOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIGxpc3RlbmVyRW5hYmxlZC4KLSAgICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIGxpc3RlbmVyRW5hYmxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lckVuYWJsZWQoYm9vbGVhbiAgdikgCi0gICAgewotICAgICAgdGhpcy5saXN0ZW5lckVuYWJsZWQgPSB2OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbnQgd2hlbiBhbiBldmVudCB0aGF0IHRoZSByZWNlaXZlciBoYXMgcmVnaXN0ZXJlZCBmb3Igb2NjdXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudCB3aGljaCBvY2N1cnJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIGlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmICFpc1JlYWRPbmx5KSAKLSAgICAgIHsKLSAgICAgICAgZG9IYW5kbGVFdmVudChldmVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUKLSAgICAgKiBAcGFyYW0gZXZlbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICAgIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZ2V0QWN0aXZlRWRpdG9yKCkKLSAgICB7Ci0gICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgdGhpcy5vd25pbmdFZGl0b3IgPSBlZGl0b3JQYXJ0OwotICAgICAgcmV0dXJuIGVkaXRvclBhcnQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkKLSAgICB7Ci0gICAgICBPYmplY3QgY29tbWFuZFN0YWNrID0gb3duaW5nRWRpdG9yLmdldEFkYXB0ZXIoQ29tbWFuZFN0YWNrLmNsYXNzKTsgCi0gICAgICAgICAgCi0gICAgICBpZiAoY29tbWFuZFN0YWNrPT1udWxsKQotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgZWxzZQotICAgICAgICAgIHJldHVybiAoQ29tbWFuZFN0YWNrKWNvbW1hbmRTdGFjazsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0SXNTaW1wbGUoKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogSW50ZW5kZWQgdG8gZGlzcGxheSBlcnJvciBtZXNzYWdlcy4KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJU3RhdHVzTGluZU1hbmFnZXIgZ2V0U3RhdHVzTGluZU1hbmFnZXIoKQotICAgIHsKLSAgICAgIGlmIChzdGF0dXNMaW5lPT1udWxsICYmIGdldFBhcnQoKSE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYoZ2V0UGFydCgpLmdldFNpdGUoKSBpbnN0YW5jZW9mIElFZGl0b3JTaXRlKQotICAgICAgICAgIHN0YXR1c0xpbmUgPSAoKElFZGl0b3JTaXRlKWdldFBhcnQoKS5nZXRTaXRlKCkpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotICAgICAgICBlbHNlIGlmIChnZXRQYXJ0KCkuZ2V0U2l0ZSgpIGluc3RhbmNlb2YgSVZpZXdTaXRlKQotICAgICAgICAgIHN0YXR1c0xpbmUgPSAoKElWaWV3U2l0ZSlnZXRQYXJ0KCkuZ2V0U2l0ZSgpKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLSAgICAgICAgCi0gICAgICAgIC8qIAotICAgICAgICAgKiBXZSBtdXN0IG1hbnVhbGx5IHNldCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgc3RhdHVzIGxpbmUgc2luY2UgdGhlIGFjdGlvbiBiYXJzIGFyZSBmcm9tIHRoZSBlZGl0b3IKLSAgICAgICAgICogd2hpY2ggbWVhbnMgdGhlIHN0YXR1cyBsaW5lIG9ubHkgc2hvd3MgdXAgd2hlbiB0aGUgZWRpdG9yIGlzIGluIGZvY3VzIChieSBkZWZhdWx0KS4KLSAgICAgICAgICogTm90ZSBvbmx5IGEgU3ViU3RhdHVzTGluZU1hbmFnZXIgY2FuIHNldCB0aGUgdmlzaWJpbGl0eS4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChzdGF0dXNMaW5lIGluc3RhbmNlb2YgU3ViU3RhdHVzTGluZU1hbmFnZXIpCi0gICAgICAgICAgKChTdWJTdGF0dXNMaW5lTWFuYWdlcilzdGF0dXNMaW5lKS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgfQotICAgICAgCi0gICAgICByZXR1cm4gc3RhdHVzTGluZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhlIHN0YXR1cyBsaW5lLgotICAgICAqIENhbGwgc2V0RXJyb3JNZXNzYWdlKG51bGwpIHRvIGNsZWFyIHRoZSBzdGF0dXMgbGluZS4KLSAgICAgKiBAcGFyYW0gdGV4dCAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIHRleHQpCi0gICAgewotICAgICAgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmUgPSBnZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCi0gICAgICBpZiAoc3RhdHVzTGluZSE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHRleHQ9PW51bGwgfHwgdGV4dC5sZW5ndGgoKTwxKQotICAgICAgICAgIHN0YXR1c0xpbmUuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgc3RhdHVzTGluZS5zZXRFcnJvck1lc3NhZ2UoSUNPTl9FUlJPUiwgdGV4dCk7Ci0KLSAgICAgICAgLy8gZW5zdXJlIG91ciBtZXNzYWdlIGdldHMgZGlzcGxheWVkCi0gICAgICAgIGlmIChzdGF0dXNMaW5lIGluc3RhbmNlb2YgU3ViQ29udHJpYnV0aW9uTWFuYWdlcikKLSAgICAgICAgICAoKFN1YkNvbnRyaWJ1dGlvbk1hbmFnZXIpc3RhdHVzTGluZSkuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIHN0YXR1c0xpbmUudXBkYXRlKHRydWUpOwotICAgICAgfQotICAgIH0KLQotICAgIAotICAgIHByb3RlY3RlZCBFT2JqZWN0IGdldE1vZGVsKCkKLSAgICB7Ci0gICAgICByZXR1cm4gKFhTRENvbXBvbmVudClpbnB1dDsKLSAgICB9Ci0KLSAgICAKLSAgICBjbGFzcyBDdXN0b21MaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyCi0gICAgewotICAgICAgYm9vbGVhbiBoYW5kbGluZ0V2ZW50ID0gZmFsc2U7Ci0gICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYgIWlzUmVhZE9ubHkpIAotICAgICAgICB7Ci0gICAgICAgICAgc3dpdGNoIChldmVudC50eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU1dULktleURvd24gOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoZXZlbnQuY2hhcmFjdGVyID09IFNXVC5DUikKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghaGFuZGxpbmdFdmVudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBoYW5kbGluZ0V2ZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgIGRvSGFuZGxlRXZlbnQoZXZlbnQpOwotICAgICAgICAgICAgICAgICAgaGFuZGxpbmdFdmVudCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU1dULkZvY3VzT3V0IDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCFoYW5kbGluZ0V2ZW50KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaGFuZGxpbmdFdmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZG9IYW5kbGVFdmVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgaGFuZGxpbmdFdmVudCA9IGZhbHNlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRQZXJmb3JtQ29tYm9TZWxlY3Rpb24oaW50IGV2ZW50VHlwZSwgT2JqZWN0IHNlbGVjdGVkSXRlbSkKLSAgICB7Ci0gICAgICAvLyBpZiB0cmF2ZXJzaW5nIHRocm91Z2ggY29tYm9ib3gsIGRvbid0IGF1dG9tYXRpY2FsbHkgcG9wIHVwCi0gICAgICAvLyB0aGUgYnJvd3NlIGFuZCBuZXcgZGlhbG9nIGJveGVzCi0gICAgICBib29sZWFuIHdhc1RyYXZlcnNpbmcgPSBpc1RyYXZlcnNpbmc7Ci0gICAgICBpZiAoaXNUcmF2ZXJzaW5nKQotICAgICAgICBpc1RyYXZlcnNpbmcgPSBmYWxzZTsKLQotICAgICAgLy8gd2Ugb25seSBjYXJlIGFib3V0IGRlZmF1bHQgc2VsZWN0aW5nIChoaXR0aW5nIGVudGVyIGluIGNvbWJvYm94KQotICAgICAgLy8gZm9yIGJyb3dzZS4uIGFuZCBuZXcuLiBvdGhlcndpc2UsIHNlbGVjdGlvbiBldmVudCB3aWxsIGJlIGZpcmVkCi0gICAgICBpZiAoZXZlbnRUeXBlID09IFNXVC5EZWZhdWx0U2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtIGluc3RhbmNlb2YgU3RyaW5nICYmICgoTWVzc2FnZXMuX1VJX0NPTUJPX0JST1dTRS5lcXVhbHMoc2VsZWN0ZWRJdGVtKSB8fCBNZXNzYWdlcy5fVUlfQ09NQk9fTkVXLmVxdWFscyhzZWxlY3RlZEl0ZW0pKSkpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgLy8gaWYgd2FzIHRyYXZlcnNpbmcgYW5kIGdvdCBzZWxlY3Rpb24gZXZlbnQsIGRvIG5vdGhpbmcgaWYgaXQncyAKLSAgICAgIC8vIGJyb3dzZS4uIG9yIG5ldy4uCi0gICAgICBpZiAod2FzVHJhdmVyc2luZyAmJiBzZWxlY3RlZEl0ZW0gaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICB7Ci0gICAgICAgIGlmIChNZXNzYWdlcy5fVUlfQ09NQk9fQlJPV1NFLmVxdWFscyhzZWxlY3RlZEl0ZW0pIHx8IE1lc3NhZ2VzLl9VSV9DT01CT19ORVcuZXF1YWxzKHNlbGVjdGVkSXRlbSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9BYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYjMzYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9BYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVNlY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvciBpbXBsZW1lbnRzIElTZWN0aW9uRGVzY3JpcHRvcgotewotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldEZpbHRlcigpCi0gICAqLwotICBwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJbnB1dFR5cGVzKCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldElucHV0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKFhTRENvbmNyZXRlQ29tcG9uZW50LmNsYXNzKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjYXBwbGllc1RvKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcHBsaWVzVG8oSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBvYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50IHx8IG9iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRBZnRlclNlY3Rpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBZnRlclNlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICAKLSAgcHVibGljIGludCBnZXRFbmFibGVzRm9yKCkKLSAgewotCXJldHVybiBFTkFCTEVTX0ZPUl9BTlk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQW5ub3RhdGlvblNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQW5ub3RhdGlvblNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRlN2Y0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0Fubm90YXRpb25TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGREb2N1bWVudGF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25TZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIFRleHQgc2ltcGxlVGV4dDsKLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICBzaW1wbGVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsgLy8kTk9OLU5MUy0xJAotICAgIHNpbXBsZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzaW1wbGVUZXh0LAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkRPQ1VNRU5UQVRJT05fVEFCX19OT19MQUJFTCk7IAotICAgIAotCi0gICAgRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxKTsKLSAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEpOwotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEpOwotICAgIGRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEpOwotICAgIHNpbXBsZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgfQotCi0gIHB1YmxpYyBBbm5vdGF0aW9uU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgCi0gICAgaWYgKHNpbXBsZVRleHQuaXNGb2N1c0NvbnRyb2woKSkgcmV0dXJuOwotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uID0gWFNEQ29tbW9uVUlVdGlscy5nZXRJbnB1dFhTREFubm90YXRpb24oKFhTRENvbmNyZXRlQ29tcG9uZW50KSBpbnB1dCwgZmFsc2UpOwotICAgICAgc2V0SW5pdGlhbFRleHQoeHNkQW5ub3RhdGlvbik7Ci0gICAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBpZiAoZXZlbnQud2lkZ2V0ID09IHNpbXBsZVRleHQpCi0gICAgICB7Ci0gICAgICAgIEFkZERvY3VtZW50YXRpb25Db21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkRG9jdW1lbnRhdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRE9DVU1FTlRBVElPTiwgbnVsbCwgKFhTRENvbmNyZXRlQ29tcG9uZW50KSBpbnB1dCwgc2ltcGxlVGV4dC5nZXRUZXh0KCksICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRJbml0aWFsVGV4dChYU0RBbm5vdGF0aW9uIGFuKQotICB7Ci0gICAgaWYgKGFuICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIExpc3QgZG9jdW1lbnRhdGlvbkxpc3QgPSBhbi5nZXRVc2VySW5mb3JtYXRpb24oKTsKLSAgICAgICAgaWYgKGRvY3VtZW50YXRpb25MaXN0LnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IGRvY0VsZW1lbnQgPSAoRWxlbWVudCkgZG9jdW1lbnRhdGlvbkxpc3QuZ2V0KDApOwotICAgICAgICAgIGlmIChkb2NFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2ltcGxlVGV4dC5zZXRUZXh0KGRvU2VyaWFsaXplKGRvY0VsZW1lbnQpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzaW1wbGVUZXh0LnNldFRleHQoIiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNpbXBsZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBkb1NlcmlhbGl6ZShFbGVtZW50IGVsZW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHNvdXJjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBOb2RlIGZpcnN0Q2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICBOb2RlIGxhc3RDaGlsZCA9IGVsZW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0gICAgaW50IHN0YXJ0ID0gMDsKLSAgICBpbnQgZW5kID0gMDsKLQotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSURPTUVsZW1lbnQpCi0gICAgewotICAgICAgSURPTUVsZW1lbnQgZG9tRWxlbWVudCA9IChJRE9NRWxlbWVudCkgZWxlbWVudDsKLSAgICAgIElET01Nb2RlbCBtb2RlbCA9IGRvbUVsZW1lbnQuZ2V0TW9kZWwoKTsKLSAgICAgIElET01Eb2N1bWVudCBkb2MgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCi0gICAgICBpZiAoZmlyc3RDaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgewotICAgICAgICBJRE9NTm9kZSBmaXJzdCA9IChJRE9NTm9kZSkgZmlyc3RDaGlsZDsKLSAgICAgICAgc3RhcnQgPSBmaXJzdC5nZXRTdGFydE9mZnNldCgpOwotICAgICAgfQotICAgICAgaWYgKGxhc3RDaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgewotICAgICAgICBJRE9NTm9kZSBsYXN0ID0gKElET01Ob2RlKSBsYXN0Q2hpbGQ7Ci0gICAgICAgIGVuZCA9IGxhc3QuZ2V0RW5kT2Zmc2V0KCk7Ci0gICAgICB9Ci0gICAgICBzb3VyY2UgPSBkb2MuZ2V0U291cmNlKCkuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotICAgIH0KLQotICAgIHJldHVybiBzb3VyY2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9Db21tb25EaXJlY3RpdmVzU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9Db21tb25EaXJlY3RpdmVzU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzAxZWJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQ29tbW9uRGlyZWN0aXZlc1NlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFBhcnNlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbW1vbkRpcmVjdGl2ZXNTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIFRleHQgc2NoZW1hTG9jYXRpb25UZXh0OwotICBCdXR0b24gd2l6YXJkQnV0dG9uOwotICBTdHlsZWRUZXh0IGVycm9yVGV4dDsKLSAgQ29sb3IgcmVkOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkU2NoZW1hTG9jYXRpb24gPSB0cnVlOwotCi0gIC8vIFRPRE86IGNvbW1vbiB1cCBjb2RlIHdpdGggWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQKLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIGVycm9yVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBzY2hlbWFMb2NhdGlvblRleHQpCi0gICAgewotICAgICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaXNWYWxpZFNjaGVtYUxvY2F0aW9uID0gdHJ1ZTsKLSAgICAgICAgU3RyaW5nIHhzZE1vZGVsRmlsZSA9IHNjaGVtYUxvY2F0aW9uVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBYU0RTY2hlbWEgZXh0ZXJuYWxTY2hlbWEgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKHhzZE1vZGVsRmlsZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgaGFuZGxlU2NoZW1hTG9jYXRpb25DaGFuZ2UoeHNkTW9kZWxGaWxlLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIElGaWxlIGN1cnJlbnRJRmlsZSA9IG51bGw7Ci0gICAgICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJlbnRJRmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCllZGl0b3JJbnB1dCkuZ2V0RmlsZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBVUkkgbmV3VVJJID0gVVJJLmNyZWF0ZVVSSSh4c2RNb2RlbEZpbGUpOwotICAgICAgICAgIFN0cmluZyB4c2RGaWxlID0gVVJJSGVscGVyLmdldFJlbGF0aXZlVVJJKG5ld1VSSS50b1N0cmluZygpLCBjdXJyZW50SUZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLSAgICAgICAgICBmaW5hbCBTdHJpbmcgbm9ybWFsaXplZFhTREZpbGUgPSBVUklIZWxwZXIubm9ybWFsaXplKHhzZEZpbGUsIGN1cnJlbnRJRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGZpbmFsIFN0cmluZyBub3JtYWxpemVkVVJJID0gVVJJLmVuY29kZUZyYWdtZW50KFVSSUhlbHBlci5hZGRJbXBsaWVkRmlsZVByb3RvY29sKG5vcm1hbGl6ZWRYU0RGaWxlKSwgdHJ1ZSkudG9TdHJpbmcoKTsKLSAgICAgICAgICBYU0RQYXJzZXIgcGFyc2VyID0gbmV3IFhTRFBhcnNlcihuZXcgSGFzaE1hcCgpKTsKLSAgICAgICAgICBwYXJzZXIucGFyc2Uobm9ybWFsaXplZFVSSSk7Ci0gICAgICAgICAgZXh0ZXJuYWxTY2hlbWEgPSBwYXJzZXIuZ2V0U2NoZW1hKCk7Ci0KLSAgICAgICAgICBpZiAoZXh0ZXJuYWxTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgZXh0TmFtZXNwYWNlID0gZXh0ZXJuYWxTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBpZiAoZXh0TmFtZXNwYWNlID09IG51bGwpIGV4dE5hbWVzcGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBuYW1lc3BhY2UgPSBleHROYW1lc3BhY2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChleHRlcm5hbFNjaGVtYS5nZXREaWFnbm9zdGljcygpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBleHRlcm5hbFNjaGVtYS5nZXREaWFnbm9zdGljcygpLnNpemUoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlzVmFsaWRTY2hlbWFMb2NhdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9JTkNPUlJFQ1RfWE1MX1NDSEVNQSIsIHhzZE1vZGVsRmlsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudE5hbWVTcGFjZSA9IHhzZFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNESW5jbHVkZSB8fCBpbnB1dCBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgbmFtZXNwYWNlIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSB0aGUgc2FtZSBhcyBjdXJyZW50IGZpbGUKLSAgICAgICAgICAgICAgICBpZiAoZXh0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROYW1lU3BhY2UgIT0gbnVsbCAmJiAhZXh0TmFtZXNwYWNlLmVxdWFscyhjdXJyZW50TmFtZVNwYWNlKSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfRElGRkVSRU5UX05BTUVfU1BBQ0UiLCB4c2RNb2RlbEZpbGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGlzVmFsaWRTY2hlbWFMb2NhdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBuYW1lc3BhY2UgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IGZpbGUKLSAgICAgICAgICAgICAgICBpZiAoZXh0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROYW1lU3BhY2UgIT0gbnVsbCAmJiBleHROYW1lc3BhY2UuZXF1YWxzKGN1cnJlbnROYW1lU3BhY2UpKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9TQU1FX05BTUVfU1BBQ0UiLCB4c2RNb2RlbEZpbGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGlzVmFsaWRTY2hlbWFMb2NhdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gTWVzc2FnZXMuX1VJX0VSUk9SX0lOVkFMSURfRklMRTsKLSAgICAgICAgICAgIGlzVmFsaWRTY2hlbWFMb2NhdGlvbiA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yTWVzc2FnZSA9IE1lc3NhZ2VzLl9VSV9FUlJPUl9JTlZBTElEX0ZJTEU7Ci0gICAgICAgICAgaXNWYWxpZFNjaGVtYUxvY2F0aW9uID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1ZhbGlkU2NoZW1hTG9jYXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgZXJyb3JUZXh0LnNldFRleHQoZXJyb3JNZXNzYWdlKTsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBlcnJvclRleHQuZ2V0VGV4dCgpLmxlbmd0aCgpOwotICAgICAgICAgICAgcmVkID0gbmV3IENvbG9yKG51bGwsIDI1NSwgMCwgMCk7Ci0gICAgICAgICAgICBTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoMCwgbGVuZ3RoLCByZWQsIHNjaGVtYUxvY2F0aW9uVGV4dC5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICAgICAgZXJyb3JUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlU2NoZW1hTG9jYXRpb25DaGFuZ2UoeHNkTW9kZWxGaWxlLCBuYW1lc3BhY2UsIGV4dGVybmFsU2NoZW1hKTsgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVNjaGVtYUxvY2F0aW9uQ2hhbmdlKFN0cmluZyBzY2hlbWFGaWxlU3RyaW5nLCBTdHJpbmcgbmFtZXNwYWNlLCBYU0RTY2hlbWEgZXh0ZXJuYWxTY2hlbWEpCi0gIHsKLSAgICAKLSAgfQotCi0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICBpZiAocmVkICE9IG51bGwpCi0gICAgewotICAgICAgcmVkLmRpc3Bvc2UoKTsKLSAgICAgIHJlZCA9IG51bGw7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvRW51bWVyYXRpb25zU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9FbnVtZXJhdGlvbnNTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZTJhZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9FbnVtZXJhdGlvbnNTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5OYXZpZ2FibGVUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRFbnVtZXJhdGlvbnNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtZXJhdGlvbnNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVudW1lcmF0aW9uRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEVudW1lcmF0aW9uc1NlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgcHJpdmF0ZSBFbnVtZXJhdGlvbnNUYWJsZVZpZXdlciBlbnVtZXJhdGlvbnNUYWJsZTsKLSAgcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOwotICBwcml2YXRlIEJ1dHRvbiBhZGRNYW55QnV0dG9uOwotICBwcml2YXRlIEJ1dHRvbiBkZWxldGVCdXR0b247Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIEVudW1lcmF0aW9uc1NlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0KLSAgICBpZiAoZS53aWRnZXQgPT0gYWRkQnV0dG9uKQotICAgIHsKLSAgICAgIExpc3QgZW51bUxpc3QgPSBzdC5nZXRFbnVtZXJhdGlvbkZhY2V0cygpOwotICAgICAgU3RyaW5nIG5ld05hbWUgPSBYU0RDb21tb25VSVV0aWxzLmNyZWF0ZVVuaXF1ZUVudW1lcmF0aW9uVmFsdWUoInZhbHVlIiwgZW51bUxpc3QpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgIEFkZEVudW1lcmF0aW9uc0NvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRFbnVtZXJhdGlvbnNDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VOVU1FUkFUSU9OLCAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0KTsKLSAgICAgIGNvbW1hbmQuc2V0VmFsdWUobmV3TmFtZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCi0gICAgICBlbnVtZXJhdGlvbnNUYWJsZS5yZWZyZXNoKCk7Ci0gICAgICBpbnQgbmV3SXRlbUluZGV4ID0gZW51bWVyYXRpb25zVGFibGUuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDE7Ci0gICAgICBlbnVtZXJhdGlvbnNUYWJsZS5lZGl0RWxlbWVudChlbnVtZXJhdGlvbnNUYWJsZS5nZXRFbGVtZW50QXQobmV3SXRlbUluZGV4KSwgMCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGFkZE1hbnlCdXR0b24pCi0gICAgewotICAgICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgICAvLyBpZiBpdCBpcyBudWxsLCBnZXQgdGhlIGRlZmF1bHQgb25lCi0gICAgICBkaXNwbGF5ID0gZGlzcGxheSA9PSBudWxsID8gRGlzcGxheS5nZXREZWZhdWx0KCkgOiBkaXNwbGF5OwotICAgICAgU2hlbGwgcGFyZW50U2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICBFbnVtZXJhdGlvbnNEaWFsb2cgZGlhbG9nID0gbmV3IEVudW1lcmF0aW9uc0RpYWxvZyhwYXJlbnRTaGVsbCk7Ci0gICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICBpbnQgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQotICAgICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gZGlhbG9nLmdldFRleHQoKTsKLSAgICAgICAgU3RyaW5nIGRlbGltaXRlciA9IGRpYWxvZy5nZXREZWxpbWl0ZXIoKTsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGV4dCwgZGVsaW1pdGVyKTsKLSAgICAgICAgQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRU5VTUVSQVRJT05TKTsKLSAgICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgaWYgKGRpYWxvZy5pc1ByZXNlcnZlV2hpdGVzcGFjZSgpID09IGZhbHNlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRva2VuID0gdG9rZW4udHJpbSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBBZGRFbnVtZXJhdGlvbnNDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkRW51bWVyYXRpb25zQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9FTlVNRVJBVElPTlMsIChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXQpOwotICAgICAgICAgIGNvbW1hbmQuc2V0VmFsdWUodG9rZW4pOwotICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQoY29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21wb3VuZENvbW1hbmQpOwotICAgICAgfQotICAgICAgZW51bWVyYXRpb25zVGFibGUucmVmcmVzaCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBkZWxldGVCdXR0b24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZW51bWVyYXRpb25zVGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLSAgICAgICAgQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9ERUxFVEVfRU5VTUVSQVRJT04pOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKG9iaiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBvYmo7Ci0KLSAgICAgICAgICAgICAgRGVsZXRlQ29tbWFuZCBkZWxldGVDb21tYW5kID0gbmV3IERlbGV0ZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9ERUxFVEVfRU5VTUVSQVRJT04sIGVudW1GYWNldCk7Ci0gICAgICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQoZGVsZXRlQ29tbWFuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tcG91bmRDb21tYW5kKTsKLSAgICAgICAgZW51bWVyYXRpb25zVGFibGUucmVmcmVzaCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBlbnVtZXJhdGlvbnNUYWJsZS5nZXRUYWJsZSgpKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGVudW1lcmF0aW9uc1RhYmxlLmdldFNlbGVjdGlvbigpOwotICAgICAgaWYgKHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBkZWxldGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0gICAgY29tcG9zaXRlID0gZmFjdG9yeS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgZW51bWVyYXRpb25zVGFibGUgPSBuZXcgRW51bWVyYXRpb25zVGFibGVWaWV3ZXIoZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRhYmxlKGNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKSk7Ci0gICAgZW51bWVyYXRpb25zVGFibGUuc2V0SW5wdXQoaW5wdXQpOwotICAgIFRhYmxlIHRhYmxlID0gZW51bWVyYXRpb25zVGFibGUuZ2V0VGFibGUoKTsKLSAgICB0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIGFkZEJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0FERF9CVVRUT05fTEFCRUwiKSwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0gICAgYWRkTWFueUJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0FERF9CVVRUT05fTEFCRUwiKSArICIuLi4iLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIGRlbGV0ZUJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0RFTEVURV9JTkNMVURFIiksIFNXVC5QVVNIKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgRm9ybURhdGEgZGF0YTIgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBkYXRhMi50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgZGF0YTIubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMDApOwotICAgIGRhdGEyLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgLy8gZGF0YTIud2lkdGggPSA1MDsKLSAgICBhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhMik7Ci0gICAgYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChhZGRCdXR0b24sIDAsIFNXVC5MRUZUKTsKLSAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uLCAwKTsKLSAgICBhZGRNYW55QnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYWRkTWFueUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uLCAwLCBTV1QuTEVGVCk7Ci0gICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGFkZE1hbnlCdXR0b24sIDApOwotICAgIGRlbGV0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICBkZWxldGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uLCAwKTsKLSAgICBkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgIGRhdGEud2lkdGggPSA1MDsKLSAgICB0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHRhYmxlLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIHRoaXMpOwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBpZiAoaXNSZWFkT25seSkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0OwotCi0gICAgSXRlcmF0b3IgdmFsaWRGYWNldHMgPSBzdC5nZXRWYWxpZEZhY2V0cygpLml0ZXJhdG9yKCk7Ci0KLSAgICBib29sZWFuIGlzQXBwbGljYWJsZSA9IGZhbHNlOwotICAgIHdoaWxlICh2YWxpZEZhY2V0cy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU3RyaW5nIGFWYWxpZEZhY2V0ID0gKFN0cmluZykgdmFsaWRGYWNldHMubmV4dCgpOwotICAgICAgaWYgKGFWYWxpZEZhY2V0LmVxdWFscyhYU0RDb25zdGFudHMuRU5VTUVSQVRJT05fRUxFTUVOVF9UQUcpKQotICAgICAgewotICAgICAgICBpc0FwcGxpY2FibGUgPSB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChpc0FwcGxpY2FibGUpCi0gICAgewotICAgICAgYWRkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICBhZGRNYW55QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBhZGRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICBhZGRNYW55QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBlbnVtZXJhdGlvbnNUYWJsZS5zZXRJbnB1dChpbnB1dCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIFRhYmxlIHRhYmxlID0gZW51bWVyYXRpb25zVGFibGUuZ2V0VGFibGUoKTsKLSAgICBpZiAoZXZlbnQudHlwZSA9PSBTV1QuUmVzaXplICYmIGV2ZW50LndpZGdldCA9PSB0YWJsZSkKLSAgICB7Ci0gICAgICBUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IHRhYmxlLmdldENvbHVtbigwKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFdpZHRoKHRhYmxlLmdldFNpemUoKS54KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGNsYXNzIEVudW1lcmF0aW9uc1RhYmxlVmlld2VyIGV4dGVuZHMgTmF2aWdhYmxlVGFibGVWaWV3ZXIgaW1wbGVtZW50cyBJQ2VsbE1vZGlmaWVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gY29sdW1uUHJvcGVydGllcyA9IHsgWFNEQ29uc3RhbnRzLkVOVU1FUkFUSU9OX0VMRU1FTlRfVEFHIH07Ci0KLSAgICBwcm90ZWN0ZWQgQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzOwotCi0gICAgVGFibGUgdGFibGU7Ci0KLSAgICBwdWJsaWMgRW51bWVyYXRpb25zVGFibGVWaWV3ZXIoVGFibGUgdGFibGUpCi0gICAgewotICAgICAgc3VwZXIodGFibGUpOwotICAgICAgdGFibGUgPSBnZXRUYWJsZSgpOwotCi0gICAgICB0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLSAgICAgIHNldENvbnRlbnRQcm92aWRlcihuZXcgRW51bWVyYXRpb25zVGFibGVDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICBzZXRMYWJlbFByb3ZpZGVyKG5ldyBFbnVtZXJhdGlvbnNUYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0gICAgICBzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCi0gICAgICBzZXRDZWxsTW9kaWZpZXIodGhpcyk7Ci0KLSAgICAgIFRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIDApOwotICAgICAgY29sdW1uLnNldFRleHQoY29sdW1uUHJvcGVydGllc1swXSk7Ci0gICAgICBjb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLSAgICAgIGNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLSAgICAgIGNlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbMV07Ci0KLSAgICAgIFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgICAgQ29sdW1uV2VpZ2h0RGF0YSBkYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMTAwKTsKLQotICAgICAgbGF5b3V0LmFkZENvbHVtbkRhdGEoZGF0YSk7Ci0gICAgICBjZWxsRWRpdG9yc1swXSA9IG5ldyBUZXh0Q2VsbEVkaXRvcih0YWJsZSk7Ci0KLSAgICAgIGdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICBzZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhYmxlSXRlbSAmJiAodmFsdWUgIT0gbnVsbCkpCi0gICAgICB7Ci0gICAgICAgIFRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZWxlbWVudDsKLQotICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBTZXRYU0RGYWNldFZhbHVlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9FTlVNRVJBVElPTl9WQUxVRSwgZW51bUZhY2V0KTsKLSAgICAgICAgY29tbWFuZC5zZXRWYWx1ZSgoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgIGl0ZW0uc2V0RGF0YShlbnVtRmFjZXQpOwotICAgICAgICBpdGVtLnNldFRleHQoKFN0cmluZykgdmFsdWUpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFhTREVudW1lcmF0aW9uRmFjZXQpCi0gICAgICB7Ci0gICAgICAgIFhTREVudW1lcmF0aW9uRmFjZXQgZW51bUZhY2V0ID0gKFhTREVudW1lcmF0aW9uRmFjZXQpIGVsZW1lbnQ7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGVudW1GYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgfQotCi0gIGNsYXNzIEVudW1lcmF0aW9uc1RhYmxlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7Ci0gICAgICBqYXZhLnV0aWwuTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXRFbGVtZW50OwotICAgICAgICByZXR1cm4gc3QuZ2V0RW51bWVyYXRpb25GYWNldHMoKS50b0FycmF5KCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgIH0KLSAgfQotCi0gIGNsYXNzIEVudW1lcmF0aW9uc1RhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyCi0gIHsKLSAgICBwdWJsaWMgRW51bWVyYXRpb25zVGFibGVMYWJlbFByb3ZpZGVyKCkKLSAgICB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVFbnVtLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotICAgICAgewotICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBlbGVtZW50OwotICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbnVtRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9FeHRlbnNpb25zU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9FeHRlbnNpb25zU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmFkNTEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvRXh0ZW5zaW9uc1NlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkRXh0ZW5zaW9uQXR0cmlidXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRFeHRlbnNpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZEV4dGVuc2lvbkVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5SZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uQ2F0ZWdvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uRE9NRXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkV4dGVuc2lvbkl0ZW1GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLlNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5YU0RFeHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uTm9kZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnRleHQuWFNETW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5Nb2RlbFJlY29uY2lsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEV4dGVuc2lvbnNTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RFeHRlbnNpb25zU2VjdGlvbgotewotICBYU0RNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0gIAotICBwdWJsaWMgRXh0ZW5zaW9uc1NlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZXRFeHRlbnNpb25UcmVlTGFiZWxQcm92aWRlcihuZXcgRE9NRXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0gICAgc2V0RXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcihuZXcgWFNERXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcigpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2cgY3JlYXRlQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZygpCi0gIHsKLSAgICBBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nIGRpYWxvZyA9ICBuZXcgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSwgZ2V0RXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSgpKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBnZXRDYXRlZ29yeUNvbnRlbnRQcm92aWRlcigpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWFNEQ2F0ZWdvcnlDb250ZW50UHJvdmlkZXIoKTsKLSAgICAgIH0KLSAgICB9OwotICAgIGRpYWxvZy5hZGRFbGVtZW50c1RhYmxlRmlsdGVyKG5ldyBBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nRmlsdGVyKGlucHV0LCBkaWFsb2cpKTsgICAgCi0gICAgcmV0dXJuIGRpYWxvZzsgICAKLSAgfQotICAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsgCi0gICAgaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICB7ICAKLSAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iaikuZ2V0RWxlbWVudCgpOwotICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgYWRhcHRlciA9IFhTRE1vZGVsQWRhcHRlci5sb29rdXBPckNyZWF0ZU1vZGVsQWRhcHRlcihlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBNb2RlbFJlY29uY2lsZUFkYXB0ZXIgbW9kZWxSZWNvbmNpbGVBZGFwdGVyID0gYWRhcHRlci5nZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKTsKLSAgICAgICAgICAgICAgaWYgKG1vZGVsUmVjb25jaWxlQWRhcHRlciAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9kZWxSZWNvbmNpbGVBZGFwdGVyLmFkZExpc3RlbmVyKGludGVybmFsTm9kZUFkYXB0ZXIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5leHBhbmRUb0xldmVsKDIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIE1vZGVsUmVjb25jaWxlQWRhcHRlciBtb2RlbFJlY29uY2lsZUFkYXB0ZXIgPSBhZGFwdGVyLmdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpOwotICAgICAgaWYgKG1vZGVsUmVjb25jaWxlQWRhcHRlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBtb2RlbFJlY29uY2lsZUFkYXB0ZXIucmVtb3ZlTGlzdGVuZXIoaW50ZXJuYWxOb2RlQWRhcHRlcik7Ci0gICAgICB9Ci0gICAgfSAgCi0gIH0KLQotICBwcm90ZWN0ZWQgQWRkRXh0ZW5zaW9uQ29tbWFuZCBnZXRBZGRFeHRlbnNpb25Db21tYW5kKE9iamVjdCBvKQotICB7Ci0gICAgQWRkRXh0ZW5zaW9uQ29tbWFuZCBhZGRFeHRlbnNpb25Db21tYW5kID0gbnVsbDsKLSAgICBpZiAobyBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIG87Ci0gICAgICBFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCBleHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCA9IGdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKS5nZXRBZGRFeHRlbnNpb25Db21tYW5kKGVsZW1lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgaWYgKGV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kLnNldElucHV0cygoWFNEQ29uY3JldGVDb21wb25lbnQpIGlucHV0LCBlbGVtZW50KTsKLSAgICAgICAgYWRkRXh0ZW5zaW9uQ29tbWFuZCA9IGV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBhZGRFeHRlbnNpb25Db21tYW5kID0gbmV3IEFkZEV4dGVuc2lvbkVsZW1lbnRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FQUElORk9fRUxFTUVOVCwgKFhTRENvbmNyZXRlQ29tcG9uZW50KSBpbnB1dCwgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGUgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIG87Ci0gICAgICBhZGRFeHRlbnNpb25Db21tYW5kID0gbmV3IEFkZEV4dGVuc2lvbkF0dHJpYnV0ZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVBQSU5GT19BVFRSSUJVVEUsIChYU0RDb25jcmV0ZUNvbXBvbmVudCkgaW5wdXQsIGF0dHJpYnV0ZSk7Ci0gICAgfQotICAgIHJldHVybiBhZGRFeHRlbnNpb25Db21tYW5kOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVtb3ZlRXh0ZW5zaW9uQ29tbWFuZChPYmplY3QgbykKLSAgewotICAgIENvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBOb2RlKQotICAgICAgewotICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSlvOwotICAgICAgICBFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQgcmVtb3ZlQ29tbWFuZCA9IGdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKS5nZXRSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZChub2RlLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgaWYgKHJlbW92ZUNvbW1hbmQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlbW92ZUNvbW1hbmQuc2V0SW5wdXQoKFhTRENvbmNyZXRlQ29tcG9uZW50KWlucHV0KTsKLSAgICAgICAgICByZW1vdmVDb21tYW5kLnNldE5vZGUobm9kZSk7Ci0gICAgICAgICAgcmV0dXJuIHJlbW92ZUNvbW1hbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgY29tbWFuZCA9IG5ldyBSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0RFTEVURV9BUFBJTkZPX0VMRU1FTlQsIG5vZGUpOyAgCi0gICAgICAgICAgLy8gY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbW1hbmQ7Ci0gIH0gIAotICAKLSAgcHJvdGVjdGVkIEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkgZ2V0RXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSgpCi0gIHsKLSAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5KCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzVHJlZVZpZXdlcklucHV0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAgIAotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsgIAotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KWlucHV0OwotICAgICAgRWxlbWVudCBjb21wb25lbnRFbGVtZW50ID0gY29tcG9uZW50LmdldEVsZW1lbnQoKTsKLSAgICAgIE5vZGUgcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICBOb2RlIGdyYW5kUGFyZW50ID0gcGFyZW50ICE9IG51bGwgPyBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpIDogbnVsbDsKLSAgICAgIHJldHVybiBjb21wb25lbnRFbGVtZW50ID09IGVsZW1lbnQgfHwgY29tcG9uZW50RWxlbWVudCA9PSBwYXJlbnQgfHwgY29tcG9uZW50RWxlbWVudCA9PSBncmFuZFBhcmVudDsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmU3RvcmUoKQotICB7Ci0gICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgfQotICAKLSAgc3RhdGljIGNsYXNzIFhTRENhdGVnb3J5Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotICAgIHsgICAgCi0gICAgICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYVtdIGV4dGVuc2lvbnNTY2hlbWFTcGVjcyA9IG51bGw7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBpbnB1dExpc3QgPSAoTGlzdCkgaW5wdXRFbGVtZW50OwotICAgICAgICAKLSAgICAgICAgTGlzdCB0b3RhbCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdG90YWwuYWRkQWxsKGlucHV0TGlzdCk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IGR5bmFtaWNDYXRlZ29yaWVzID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKS5nZXRDYXRlZ29yeVByb3ZpZGVycygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkeW5hbWljQ2F0ZWdvcmllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgQ2F0ZWdvcnlQcm92aWRlciBjYXRlZ29yeVByb3ZpZGVyID0gKENhdGVnb3J5UHJvdmlkZXIpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNhdGVnb3J5UHJvdmlkZXIuZ2V0Q2F0ZWdvcmllcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwID0gKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKWl0Lm5leHQoKTsKLSAgICAgICAgICAgIHRvdGFsLmFkZChzcCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXh0ZW5zaW9uc1NjaGVtYVNwZWNzID0gKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hW10pIHRvdGFsLnRvQXJyYXkobmV3IFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hWzBdKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIHJldHVybiBleHRlbnNpb25zU2NoZW1hU3BlY3M7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgICAgLy8gRG8gbm90aGluZwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gICAgewotICAgICAgLy8gRG8gbm90aGluZwotCi0gICAgfSAgICAgICAgICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGlzIGZpbHRlciBpcyB0byBiZSB1c2VkIGJ5IHRoZSBkaWFsb2cgaW52b2tlZCB3aGVuIGFkZEJ1dHRvbiBpcyBwcmVzc2VkCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZ0ZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlcgotICB7Ci0gICAgcHJpdmF0ZSBPYmplY3QgaW5wdXQ7Ci0gICAgcHJpdmF0ZSBBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nIGRpYWxvZzsKLQotICAgIHB1YmxpYyBBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nRmlsdGVyKE9iamVjdCBpbnB1dCwgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZyBkaWFsb2cpCi0gICAgewotICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICAgICAgdGhpcy5kaWFsb2cgPSBkaWFsb2c7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkKLSAgICB7ICAgICAgCi0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCAmJgotICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjID0gZGlhbG9nLmdldFNlbGVjdGVkQ2F0ZWdvcnkoKTsKLSAgICAgICAgLy8gaGVyZSB3ZSBvYnRhaW4gdGhlIG5vZGUgZmlsdGVyIHRoYXQgd2FzIHJlZ2lzdGVyZWQgZm9yIHRoZSBhcHBsaWNhYmxlIG5hbWVzcGFjZQotICAgICAgICAvLyBub3RpZWQKLSAgICAgICAgTm9kZUZpbHRlciBmaWx0ZXIgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0Tm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSgpLmdldE5vZGVGaWx0ZXIoc3BlYy5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZmlsdGVyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBDaGVjayBpZiBhIG5vZGUgZmlsdGVyIGhhcyBiZWVuIHNwZWNpZmllZCwgaWYgc28sIHRoZW4gdXNlIGl0Ci0gICAgICAgICAgZmlsdGVyID0gc3BlYy5nZXROb2RlRmlsdGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgRXh0ZW5zaW9uSXRlbUZpbHRlcikKLSAgICAgICAgewotICAgICAgICAgIEV4dGVuc2lvbkl0ZW1GaWx0ZXIgZXh0ZW5zaW9uSXRlbUZpbHRlciA9IChFeHRlbnNpb25JdGVtRmlsdGVyKWZpbHRlcjsKLSAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uSXRlbUZpbHRlci5pc0FwcGxpY2FibGVDb250ZXh0KChYU0RDb25jcmV0ZUNvbXBvbmVudClpbnB1dCwgKFhTRENvbmNyZXRlQ29tcG9uZW50KWVsZW1lbnQpOyAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIFRPRE8gY3M6IGV2ZW4gaWYgaXQncyBqdXN0IGEgcGxhaW4gb2xkIE5vZGVGaWx0ZXIgd2Ugc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gdXNlIGl0ISAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9ICAKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvRmFjZXRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvRmFjZXRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzZDc0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0ZhY2V0Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLS8vaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0vL2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0vL2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLS8vCi0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0FkYXB0ZXI7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzLk5hdmlnYWJsZVRhYmxlVmlld2VyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLkRPTUF0dHJpYnV0ZTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5YU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uc3RyYWluaW5nRmFjZXQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNYXhFeGNsdXNpdmVGYWNldDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNYXhGYWNldDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNYXhJbmNsdXNpdmVGYWNldDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNaW5FeGNsdXNpdmVGYWNldDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNaW5GYWNldDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNaW5JbmNsdXNpdmVGYWNldDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUJ1aWxkaW5nVG9vbHM7Ci0vL2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgRmFjZXRWaWV3ZXIgLy9leHRlbmRzIE5hdmlnYWJsZVRhYmxlVmlld2VyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllcgotewotLy8gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX05BTUUgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRkFDRVRfTkFNRSIpOyAvLyAiTmFtZSI7Ci0vLyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDRVRfVkFMVUUgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRkFDRVRfVkFMVUUiKTsgLy8gIlZhbHVlIjsKLS8vICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVF9PVEhFUiA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9GQUNFVF9GSVhFRCIpOyAvLyAiRml4ZWQiOwotLy8KLS8vICBwcm90ZWN0ZWQgRmFjZXRzVGFibGVMYWJlbFByb3ZpZGVyIGZhY2V0c1RhYmxlTGFiZWxQcm92aWRlciA9IG5ldyBGYWNldHNUYWJsZUxhYmVsUHJvdmlkZXIoKTsKLS8vICBwcm90ZWN0ZWQgRmFjZXRzVGFibGVDb250ZW50UHJvdmlkZXIgZmFjZXRzVGFibGVDb250ZW50UHJvdmlkZXIgPSBuZXcgRmFjZXRzVGFibGVDb250ZW50UHJvdmlkZXIoKTsKLS8vICBwcm90ZWN0ZWQgU3RyaW5nW10gY29sdW1uUHJvcGVydGllcyA9IHsgRkFDRVRfTkFNRSwgRkFDRVRfVkFMVUUsIEZBQ0VUX09USEVSIH07Ci0vLyAgcHJvdGVjdGVkIENlbGxFZGl0b3JbXSBjZWxsRWRpdG9yczsgLy8gdGhlc2UgY2VsbEVkaXRvcnMgYXJlIHVzZWQgd2hlbgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi13aGl0ZXNwYWNlIGZhY2V0IGlzIHNlbGVjdGVkCi0vLyAgcHJvdGVjdGVkIENlbGxFZGl0b3JbXSBhbHRDZWxsRWRpdG9yczsgLy8gdGhlc2UgY2VsbEVkaXRvcnMgYXJlIHVzZWQgd2hlbgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGl0ZXNwYWNlIGZhY2V0IGlzIHNlbGVjdGVkCi0vLwotLy8gIHByb3RlY3RlZCBTdHJpbmdbXSB3aGl0ZVNwYWNlVmFsdWVzID0gbmV3IFN0cmluZ1tdIHsgIiIsICJwcmVzZXJ2ZSIsICJyZXBsYWNlIiwgImNvbGxhcHNlIiB9OwotLy8gIHByb3RlY3RlZCBTdHJpbmdbXSB0cnVlRmFsc2VWYWx1ZXMgPSBuZXcgU3RyaW5nW10geyAiIiwgImZhbHNlIiwgInRydWUiIH07Ci0vLwotLy8gIC8qKgotLy8gICAqIEBwYXJhbSBwYXJlbnQKLS8vICAgKi8KLS8vICBwdWJsaWMgRmFjZXRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkKLS8vICB7Ci0vLyAgICBzdXBlcihuZXcgVGFibGUocGFyZW50LCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuU0lOR0xFKSk7Ci0vLwotLy8gICAgZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0vLyAgICBnZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0vLwotLy8gICAgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSk7Ci0vLyAgICBnZXRUYWJsZSgpLmFkZE1vdXNlVHJhY2tMaXN0ZW5lcihuZXcgTXlNb3VzZVRyYWNrTGlzdGVuZXIoKSk7Ci0vLwotLy8gICAgc2V0Q29udGVudFByb3ZpZGVyKGZhY2V0c1RhYmxlQ29udGVudFByb3ZpZGVyKTsKLS8vICAgIHNldExhYmVsUHJvdmlkZXIoZmFjZXRzVGFibGVMYWJlbFByb3ZpZGVyKTsKLS8vICAgIHNldENvbHVtblByb3BlcnRpZXMoY29sdW1uUHJvcGVydGllcyk7Ci0vLwotLy8gICAgc2V0Q2VsbE1vZGlmaWVyKHRoaXMpOwotLy8KLS8vICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQotLy8gICAgewotLy8gICAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oZ2V0VGFibGUoKSwgU1dULk5PTkUsIGkpOwotLy8gICAgICBjb2x1bW4uc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLS8vICAgICAgY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0vLyAgICAgIGNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0vLyAgICB9Ci0vLwotLy8gICAgY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvclszXTsKLS8vICAgIGFsdENlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbM107Ci0vLwotLy8gICAgVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0vLyAgICBDb2x1bW5XZWlnaHREYXRhIGRhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg2MCwgODAsIHRydWUpOwotLy8gICAgbGF5b3V0LmFkZENvbHVtbkRhdGEoZGF0YSk7Ci0vLyAgICBjZWxsRWRpdG9yc1swXSA9IG51bGw7Ci0vLwotLy8gICAgQ29sdW1uV2VpZ2h0RGF0YSBkYXRhMiA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEyMCwgODAsIHRydWUpOwotLy8gICAgbGF5b3V0LmFkZENvbHVtbkRhdGEoZGF0YTIpOwotLy8KLS8vICAgIGNlbGxFZGl0b3JzWzFdID0gbmV3IFRleHRDZWxsRWRpdG9yKGdldFRhYmxlKCkpOwotLy8gICAgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSBuZXcgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IoImNvbWJvIiwgIndoaXRlc3BhY2UiLCB3aGl0ZVNwYWNlVmFsdWVzKTsKLS8vICAgIGFsdENlbGxFZGl0b3JzWzFdID0gcGQuY3JlYXRlUHJvcGVydHlFZGl0b3IoZ2V0VGFibGUoKSk7Ci0vLwotLy8gICAgQ29sdW1uV2VpZ2h0RGF0YSBkYXRhMyA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDYwLCA2MCwgdHJ1ZSk7Ci0vLyAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShkYXRhMyk7Ci0vLwotLy8gICAgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgcGQyID0gbmV3IFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yKCJjb21ibyIsICJvdGhlciIsIHRydWVGYWxzZVZhbHVlcyk7Ci0vLyAgICBjZWxsRWRpdG9yc1syXSA9IHBkMi5jcmVhdGVQcm9wZXJ0eUVkaXRvcihnZXRUYWJsZSgpKTsKLS8vICAgIGFsdENlbGxFZGl0b3JzWzJdID0gcGQyLmNyZWF0ZVByb3BlcnR5RWRpdG9yKGdldFRhYmxlKCkpOwotLy8KLS8vICAgIGdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dCk7Ci0vLyAgICBzZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0vLwotLy8gIH0KLS8vCi0vLyAgLyoKLS8vICAgKiAobm9uLUphdmFkb2MpCi0vLyAgICogCi0vLyAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXIjY2FuTW9kaWZ5KGphdmEubGFuZy5PYmplY3QsCi0vLyAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotLy8gICAqLwotLy8gIHB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotLy8gIHsKLS8vICAgIHJldHVybiBwcm9wZXJ0eS5lcXVhbHMoRkFDRVRfVkFMVUUpIHx8IHByb3BlcnR5LmVxdWFscyhGQUNFVF9PVEhFUik7Ci0vLyAgfQotLy8KLS8vICAvKgotLy8gICAqIChub24tSmF2YWRvYykKLS8vICAgKiAKLS8vICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllciNnZXRWYWx1ZShqYXZhLmxhbmcuT2JqZWN0LAotLy8gICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLS8vICAgKi8KLS8vICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0vLyAgewotLy8gICAgaW50IGNvbHVtbiA9IDA7Ci0vLyAgICBpZiAocHJvcGVydHkuZXF1YWxzKGNvbHVtblByb3BlcnRpZXNbMF0pKQotLy8gICAgewotLy8gICAgICBjb2x1bW4gPSAwOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKGNvbHVtblByb3BlcnRpZXNbMV0pKQotLy8gICAgewotLy8gICAgICBjb2x1bW4gPSAxOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKGNvbHVtblByb3BlcnRpZXNbMl0pKQotLy8gICAgewotLy8gICAgICBjb2x1bW4gPSAyOwotLy8gICAgfQotLy8KLS8vICAgIHJldHVybiBmYWNldHNUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dChlbGVtZW50LCBjb2x1bW4pOwotLy8gIH0KLS8vCi0vLyAgLyoKLS8vICAgKiAobm9uLUphdmFkb2MpCi0vLyAgICogCi0vLyAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXIjbW9kaWZ5KGphdmEubGFuZy5PYmplY3QsCi0vLyAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotLy8gICAqLwotLy8gIHB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpCi0vLyAgewotLy8gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgZ2V0SW5wdXQoKTsKLS8vICAgIFRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZWxlbWVudDsKLS8vICAgIGlmIChpdGVtICE9IG51bGwpCi0vLyAgICB7Ci0vLyAgICAgIE9iamVjdCBvID0gaXRlbS5nZXREYXRhKCk7Ci0vLyAgICAgIGlmIChvICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFN0cmluZykKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBTdHJpbmcgZmFjZXQgPSAoU3RyaW5nKSBvOwotLy8KLS8vICAgICAgICAgIEVsZW1lbnQgc2ltcGxlVHlwZUVsZW1lbnQgPSB4c2RTaW1wbGVUeXBlLmdldEVsZW1lbnQoKTsKLS8vICAgICAgICAgIFhTRERPTUhlbHBlciB4c2RET01IZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0vLyAgICAgICAgICBFbGVtZW50IGRlcml2ZWRCeUVsZW1lbnQgPSB4c2RET01IZWxwZXIuZ2V0RGVyaXZlZEJ5RWxlbWVudChzaW1wbGVUeXBlRWxlbWVudCk7Ci0vLwotLy8gICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHNpbXBsZVR5cGVFbGVtZW50LmdldFByZWZpeCgpOwotLy8gICAgICAgICAgcHJlZml4ID0gKHByZWZpeCA9PSBudWxsKSA/ICIiIDogKHByZWZpeCArICI6Iik7Ci0vLwotLy8gICAgICAgICAgRWxlbWVudCBjaGlsZE5vZGVFbGVtZW50ID0gbnVsbDsKLS8vICAgICAgICAgIERPTUF0dHJpYnV0ZSB2YWx1ZUF0dHIgPSBudWxsOwotLy8KLS8vICAgICAgICAgIFhTRENvbnN0cmFpbmluZ0ZhY2V0IHRhcmdldEZhY2V0ID0gZ2V0WFNEQ29uc3RyYWluaW5nRmFjZXQoZmFjZXQpOwotLy8KLS8vICAgICAgICAgIFN0cmluZyBuZXdWYWx1ZSA9ICIiOwotLy8gICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIG5ld1ZhbHVlID0gKFN0cmluZykgdmFsdWU7Ci0vLyAgICAgICAgICB9Ci0vLwotLy8gICAgICAgICAgaWYgKHByb3BlcnR5LmVxdWFscyhjb2x1bW5Qcm9wZXJ0aWVzWzFdKSkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgaWYgKHRhcmdldEZhY2V0ID09IG51bGwgJiYgbmV3VmFsdWUubGVuZ3RoKCkgPiAwKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgdGFyZ2V0RmFjZXQgPSBjcmVhdGVGYWNldChmYWNldCk7Ci0vLyAgICAgICAgICAgICAgY2hpbGROb2RlRWxlbWVudCA9IChkZXJpdmVkQnlFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSkuY3JlYXRlRWxlbWVudE5TKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgcHJlZml4ICsgZmFjZXQpOwotLy8gICAgICAgICAgICAgIHZhbHVlQXR0ciA9IG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlZBTFVFX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotLy8gICAgICAgICAgICAgIGNoaWxkTm9kZUVsZW1lbnQuc2V0QXR0cmlidXRlKHZhbHVlQXR0ci5nZXROYW1lKCksIHZhbHVlQXR0ci5nZXRWYWx1ZSgpKTsKLS8vICAgICAgICAgICAgICAvLyBhZGQgYW5kIGZvcm1hdCBjaGlsZAotLy8gICAgICAgICAgICAgIGRlcml2ZWRCeUVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGROb2RlRWxlbWVudCk7Ci0vLyAgICAgICAgICAgICAgdGFyZ2V0RmFjZXQuc2V0RWxlbWVudChjaGlsZE5vZGVFbGVtZW50KTsKLS8vICAgICAgICAgICAgICBYU0RET01IZWxwZXIuZm9ybWF0Q2hpbGQoY2hpbGROb2RlRWxlbWVudCk7Ci0vLwotLy8gICAgICAgICAgICAgIC8vIFhTRFNjaGVtYUhlbHBlci51cGRhdGVFbGVtZW50KHhzZFNpbXBsZVR5cGUpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIGlmICh0YXJnZXRGYWNldCA9PSBudWxsKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgcmV0dXJuOwotLy8gICAgICAgICAgICB9Ci0vLwotLy8gICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgdGFyZ2V0RmFjZXQuc2V0TGV4aWNhbFZhbHVlKG5ld1ZhbHVlKTsKLS8vCi0vLyAgICAgICAgICAgICAgaWYgKHRhcmdldEZhY2V0IGluc3RhbmNlb2YgWFNETWF4RmFjZXQgfHwgdGFyZ2V0RmFjZXQgaW5zdGFuY2VvZiBYU0RNaW5GYWNldCkKLS8vICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RmFjZXQgaW5zdGFuY2VvZiBYU0RNYXhGYWNldCkKLS8vICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldEZhY2V0IGluc3RhbmNlb2YgWFNETWF4RXhjbHVzaXZlRmFjZXQpCi0vLyAgICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgICBYU0RNYXhJbmNsdXNpdmVGYWNldCB4c2RNYXhJbmNsdXNpdmVGYWNldCA9IHhzZFNpbXBsZVR5cGUuZ2V0TWF4SW5jbHVzaXZlRmFjZXQoKTsKLS8vICAgICAgICAgICAgICAgICAgICBpZiAoeHNkTWF4SW5jbHVzaXZlRmFjZXQgIT0gbnVsbCkKLS8vICAgICAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHhzZE1heEluY2x1c2l2ZUZhY2V0RWxlbWVudCA9IHhzZE1heEluY2x1c2l2ZUZhY2V0LmdldEVsZW1lbnQoKTsKLS8vICAgICAgICAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZSh4c2RNYXhJbmNsdXNpdmVGYWNldEVsZW1lbnQpOwotLy8gICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgICBlbHNlIGlmICh0YXJnZXRGYWNldCBpbnN0YW5jZW9mIFhTRE1heEluY2x1c2l2ZUZhY2V0KQotLy8gICAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICAgWFNETWF4RXhjbHVzaXZlRmFjZXQgeHNkTWF4RXhjbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldE1heEV4Y2x1c2l2ZUZhY2V0KCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgaWYgKHhzZE1heEV4Y2x1c2l2ZUZhY2V0ICE9IG51bGwpCi0vLyAgICAgICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCB4c2RNYXhFeGNsdXNpdmVGYWNldEVsZW1lbnQgPSB4c2RNYXhFeGNsdXNpdmVGYWNldC5nZXRFbGVtZW50KCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UoeHNkTWF4RXhjbHVzaXZlRmFjZXRFbGVtZW50KTsKLS8vICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhcmdldEZhY2V0IGluc3RhbmNlb2YgWFNETWluRmFjZXQpCi0vLyAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRGYWNldCBpbnN0YW5jZW9mIFhTRE1pbkV4Y2x1c2l2ZUZhY2V0KQotLy8gICAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICAgWFNETWluSW5jbHVzaXZlRmFjZXQgeHNkTWluSW5jbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldE1pbkluY2x1c2l2ZUZhY2V0KCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgaWYgKHhzZE1pbkluY2x1c2l2ZUZhY2V0ICE9IG51bGwpCi0vLyAgICAgICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCB4c2RNaW5JbmNsdXNpdmVGYWNldEVsZW1lbnQgPSB4c2RNaW5JbmNsdXNpdmVGYWNldC5nZXRFbGVtZW50KCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UoeHNkTWluSW5jbHVzaXZlRmFjZXRFbGVtZW50KTsKLS8vICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGFyZ2V0RmFjZXQgaW5zdGFuY2VvZiBYU0RNaW5JbmNsdXNpdmVGYWNldCkKLS8vICAgICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgIFhTRE1pbkV4Y2x1c2l2ZUZhY2V0IHhzZE1pbkV4Y2x1c2l2ZUZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRNaW5FeGNsdXNpdmVGYWNldCgpOwotLy8gICAgICAgICAgICAgICAgICAgIGlmICh4c2RNaW5FeGNsdXNpdmVGYWNldCAhPSBudWxsKQotLy8gICAgICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgeHNkTWluRXhjbHVzaXZlRmFjZXRFbGVtZW50ID0geHNkTWluRXhjbHVzaXZlRmFjZXQuZ2V0RWxlbWVudCgpOwotLy8gICAgICAgICAgICAgICAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKHhzZE1pbkV4Y2x1c2l2ZUZhY2V0RWxlbWVudCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgICAgLy8gbmV3VmFsdWUubGVuZ3RoID09IDAKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIEVsZW1lbnQgdGFyZ2V0RmFjZXRFbGVtZW50ID0gdGFyZ2V0RmFjZXQuZ2V0RWxlbWVudCgpOwotLy8gICAgICAgICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZSh0YXJnZXRGYWNldEVsZW1lbnQpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoY29sdW1uUHJvcGVydGllc1syXSkpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIGlmICh0YXJnZXRGYWNldCAhPSBudWxsKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLS8vICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICB0YXJnZXRGYWNldC5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUsIG5ld1ZhbHVlKTsKLS8vICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgZWxzZQotLy8gICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIHRhcmdldEZhY2V0LmdldEVsZW1lbnQoKS5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJWEVEX0FUVFJJQlVURSk7Ci0vLyAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgICB4c2RTaW1wbGVUeXBlLnNldEVsZW1lbnQoc2ltcGxlVHlwZUVsZW1lbnQpOwotLy8gICAgICAgICAgLy8geHNkU2ltcGxlVHlwZS51cGRhdGVFbGVtZW50KCk7Ci0vLyAgICAgICAgICByZWZyZXNoKCk7Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgfQotLy8KLS8vICBwcml2YXRlIFhTRENvbnN0cmFpbmluZ0ZhY2V0IGdldFhTRENvbnN0cmFpbmluZ0ZhY2V0KFN0cmluZyBmYWNldFN0cmluZykKLS8vICB7Ci0vLyAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBnZXRJbnB1dCgpOwotLy8gICAgTGlzdCBsaXN0ID0geHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCk7Ci0vLyAgICBpZiAobGlzdCA9PSBudWxsKQotLy8gICAgewotLy8gICAgICByZXR1cm4gbnVsbDsKLS8vICAgIH0KLS8vICAgIEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0vLyAgICBYU0RDb25zdHJhaW5pbmdGYWNldCB0YXJnZXRGYWNldCA9IG51bGw7Ci0vLwotLy8gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotLy8gICAgewotLy8gICAgICBYU0RDb25zdHJhaW5pbmdGYWNldCB4c2RDb25zdHJhaW5pbmdGYWNldCA9IChYU0RDb25zdHJhaW5pbmdGYWNldCkgaXRlci5uZXh0KCk7Ci0vLyAgICAgIGlmICh4c2RDb25zdHJhaW5pbmdGYWNldC5nZXRGYWNldE5hbWUoKS5lcXVhbHMoZmFjZXRTdHJpbmcpKQotLy8gICAgICB7Ci0vLyAgICAgICAgdGFyZ2V0RmFjZXQgPSB4c2RDb25zdHJhaW5pbmdGYWNldDsKLS8vICAgICAgICBicmVhazsKLS8vICAgICAgfQotLy8gICAgfQotLy8gICAgcmV0dXJuIHRhcmdldEZhY2V0OwotLy8gIH0KLS8vCi0vLyAgcHJpdmF0ZSBYU0RDb25zdHJhaW5pbmdGYWNldCBjcmVhdGVGYWNldChTdHJpbmcgZmFjZXQpCi0vLyAgewotLy8gICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0vLyAgICBYU0RDb25zdHJhaW5pbmdGYWNldCB4c2RGYWNldCA9IG51bGw7Ci0vLyAgICBpZiAoZmFjZXQuZXF1YWxzKCJsZW5ndGgiKSkKLS8vICAgIHsKLS8vICAgICAgeHNkRmFjZXQgPSBmYWN0b3J5LmNyZWF0ZVhTRExlbmd0aEZhY2V0KCk7Ci0vLyAgICB9Ci0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1pbkxlbmd0aCIpKQotLy8gICAgewotLy8gICAgICB4c2RGYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNETWluTGVuZ3RoRmFjZXQoKTsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWF4TGVuZ3RoIikpCi0vLyAgICB7Ci0vLyAgICAgIHhzZEZhY2V0ID0gZmFjdG9yeS5jcmVhdGVYU0RNYXhMZW5ndGhGYWNldCgpOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJtaW5JbmNsdXNpdmUiKSkKLS8vICAgIHsKLS8vICAgICAgeHNkRmFjZXQgPSBmYWN0b3J5LmNyZWF0ZVhTRE1pbkluY2x1c2l2ZUZhY2V0KCk7Ci0vLyAgICB9Ci0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1pbkV4Y2x1c2l2ZSIpKQotLy8gICAgewotLy8gICAgICB4c2RGYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNETWluRXhjbHVzaXZlRmFjZXQoKTsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWF4SW5jbHVzaXZlIikpCi0vLyAgICB7Ci0vLyAgICAgIHhzZEZhY2V0ID0gZmFjdG9yeS5jcmVhdGVYU0RNYXhJbmNsdXNpdmVGYWNldCgpOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJtYXhFeGNsdXNpdmUiKSkKLS8vICAgIHsKLS8vICAgICAgeHNkRmFjZXQgPSBmYWN0b3J5LmNyZWF0ZVhTRE1heEV4Y2x1c2l2ZUZhY2V0KCk7Ci0vLyAgICB9Ci0vLwotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJ0b3RhbERpZ2l0cyIpKQotLy8gICAgewotLy8gICAgICB4c2RGYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNEVG90YWxEaWdpdHNGYWNldCgpOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJmcmFjdGlvbkRpZ2l0cyIpKQotLy8gICAgewotLy8gICAgICB4c2RGYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNERnJhY3Rpb25EaWdpdHNGYWNldCgpOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJ3aGl0ZVNwYWNlIikpCi0vLyAgICB7Ci0vLyAgICAgIHhzZEZhY2V0ID0gZmFjdG9yeS5jcmVhdGVYU0RXaGl0ZVNwYWNlRmFjZXQoKTsKLS8vICAgIH0KLS8vICAgIHJldHVybiB4c2RGYWNldDsKLS8vICB9Ci0vLwotLy8gIC8qKgotLy8gICAqIEdldCB0aGUgdG9vbHRpcCBmb3IgdGhlIGZhY2V0Ci0vLyAgICovCi0vLyAgcHVibGljIFN0cmluZyBnZXRUb29sVGlwKFN0cmluZyBmYWNldCkKLS8vICB7Ci0vLyAgICBTdHJpbmcga2V5ID0gIiI7Ci0vLyAgICBpZiAoZmFjZXQuZXF1YWxzKCJsZW5ndGgiKSkKLS8vICAgIHsKLS8vICAgICAga2V5ID0gIl9VSV9UT09MVElQX0xFTkdUSCI7Ci0vLyAgICB9Ci0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1pbkxlbmd0aCIpKQotLy8gICAgewotLy8gICAgICBrZXkgPSAiX1VJX1RPT0xUSVBfTUlOX0xFTiI7Ci0vLyAgICB9Ci0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1heExlbmd0aCIpKQotLy8gICAgewotLy8gICAgICBrZXkgPSAiX1VJX1RPT0xUSVBfTUFYX0xFTiI7Ci0vLyAgICB9Ci0vLwotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJtaW5JbmNsdXNpdmUiKSkKLS8vICAgIHsKLS8vICAgICAga2V5ID0gIl9VSV9UT09MVElQX01JTl9JTkNMVVNJVkUiOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJtaW5FeGNsdXNpdmUiKSkKLS8vICAgIHsKLS8vICAgICAga2V5ID0gIl9VSV9UT09MVElQX01JTl9FWENMVVNJVkUiOwotLy8gICAgfQotLy8KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWF4SW5jbHVzaXZlIikpCi0vLyAgICB7Ci0vLyAgICAgIGtleSA9ICJfVUlfVE9PTFRJUF9NQVhfSU5DTFVTSVZFIjsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWF4RXhjbHVzaXZlIikpCi0vLyAgICB7Ci0vLyAgICAgIGtleSA9ICJfVUlfVE9PTFRJUF9NQVhfRVhDTFVTSVZFIjsKLS8vICAgIH0KLS8vCi0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoInRvdGFsRGlnaXRzIikpCi0vLyAgICB7Ci0vLyAgICAgIGtleSA9ICJfVUlfVE9PTFRJUF9UT1RBTF9ESUdJVFMiOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJmcmFjdGlvbkRpZ2l0cyIpKQotLy8gICAgewotLy8gICAgICBrZXkgPSAiX1VJX1RPT0xUSVBfRlJBQ1RJT05fRElHSVRTIjsKLS8vICAgIH0KLS8vCi0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIndoaXRlU3BhY2UiKSkKLS8vICAgIHsKLS8vICAgICAga2V5ID0gIl9VSV9UT09MVElQX1dISVRFX1NQQUNFIjsKLS8vICAgIH0KLS8vCi0vLyAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoa2V5KSA6ICIiOwotLy8gIH0KLS8vCi0vLyAgLyoqCi0vLyAgICogVGhpcyBsaXN0ZW5lciBkZXRlY3RzIHdoaWNoIHJvdyBpcyBzZWxlY3RlZCBhbmQgYWRkIGEgdG9vbCB0aXAgZm9yIHRoYXQgcm93Ci0vLyAgICovCi0vLyAgcHVibGljIGNsYXNzIE15TW91c2VUcmFja0xpc3RlbmVyIGV4dGVuZHMgTW91c2VUcmFja0FkYXB0ZXIKLS8vICB7Ci0vLyAgICBwdWJsaWMgdm9pZCBtb3VzZUhvdmVyKE1vdXNlRXZlbnQgZSkKLS8vICAgIHsKLS8vICAgICAgVGFibGVJdGVtIGl0ZW0gPSBnZXRUYWJsZSgpLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSk7Ci0vLyAgICAgIGlmIChpdGVtICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBPYmplY3QgbyA9IGl0ZW0uZ2V0RGF0YSgpOwotLy8gICAgICAgIGlmIChvICE9IG51bGwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgU3RyaW5nIGZhY2V0TmFtZSA9IChTdHJpbmcpIG87Ci0vLyAgICAgICAgICBnZXRUYWJsZSgpLnNldFRvb2xUaXBUZXh0KGdldFRvb2xUaXAoZmFjZXROYW1lKSk7Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgfQotLy8KLS8vICAvKioKLS8vICAgKiBCYXNlZCBvbiB0aGUgc2VsZWN0aW9uLCBkZXRlY3RzIGlmIGl0IGlzIGEgd2hpdGUgc3BhY2Ugb3Igbm90LCBhbmQgYWRkIHRoZQotLy8gICAqIGNvcnJlc3BvbmRpbmcgY2VsbCBlZGl0b3JzCi0vLyAgICovCi0vLyAgcHVibGljIGNsYXNzIFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLS8vICB7Ci0vLyAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLS8vICAgIHsKLS8vICAgICAgT2JqZWN0IHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotLy8gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLS8vICAgICAgewotLy8gICAgICAgIE9iamVjdCBvID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotLy8gICAgICAgIGlmIChvICE9IG51bGwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgU3RyaW5nIGZhY2V0ID0gKFN0cmluZykgbzsKLS8vICAgICAgICAgIGlmIChmYWNldC5lcXVhbHMoIndoaXRlU3BhY2UiKSkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgc2V0Q2VsbEVkaXRvcnMoYWx0Q2VsbEVkaXRvcnMpOwotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgZWxzZQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBzZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgfQotLy8KLS8vICBjbGFzcyBGYWNldHNUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0vLyAgewotLy8gICAgcHJvdGVjdGVkIFN0cmluZyBmYWNldDsKLS8vCi0vLyAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0vLyAgICB7Ci0vLyAgICB9Ci0vLwotLy8gICAgcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0IGlucHV0RWxlbWVudCkKLS8vICAgIHsKLS8vICAgICAgTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotLy8gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBpbnB1dFhTRFNpbXBsZVR5cGUgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0RWxlbWVudDsKLS8vICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gYmFzZSA9IGlucHV0WFNEU2ltcGxlVHlwZS5nZXRQcmltaXRpdmVUeXBlRGVmaW5pdGlvbigpOwotLy8KLS8vICAgICAgaWYgKGJhc2UgIT0gbnVsbCkKLS8vICAgICAgewotLy8gICAgICAgIEl0ZXJhdG9yIHZhbGlkRmFjZXRzID0gaW5wdXRYU0RTaW1wbGVUeXBlLmdldFZhbGlkRmFjZXRzKCkuaXRlcmF0b3IoKTsKLS8vICAgICAgICB3aGlsZSAodmFsaWRGYWNldHMuaGFzTmV4dCgpKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIFN0cmluZyBhVmFsaWRGYWNldCA9IChTdHJpbmcpIHZhbGlkRmFjZXRzLm5leHQoKTsKLS8vICAgICAgICAgIGlmICghKGFWYWxpZEZhY2V0LmVxdWFscygicGF0dGVybiIpIHx8IGFWYWxpZEZhY2V0LmVxdWFscygiZW51bWVyYXRpb24iKSkpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHYuYWRkKGFWYWxpZEZhY2V0KTsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgICAgcmV0dXJuIHYudG9BcnJheSgpOwotLy8gICAgfQotLy8KLS8vICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotLy8gICAgewotLy8gICAgfQotLy8gIH0KLS8vCi0vLyAgY2xhc3MgRmFjZXRzVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIKLS8vICB7Ci0vLyAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLS8vICAgIHsKLS8vICAgICAgcmV0dXJuIG51bGw7Ci0vLyAgICB9Ci0vLwotLy8gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0vLyAgICB7Ci0vLyAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nKQotLy8gICAgICB7Ci0vLyAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKLS8vICAgICAgICBYU0RDb25zdHJhaW5pbmdGYWNldCB0YXJnZXRGYWNldCA9IGdldFhTRENvbnN0cmFpbmluZ0ZhY2V0KChTdHJpbmcpIGVsZW1lbnQpOwotLy8gICAgICAgIHN3aXRjaCAoY29sdW1uSW5kZXgpCi0vLyAgICAgICAgewotLy8gICAgICAgIGNhc2UgMDoKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICB2YWx1ZSA9IChTdHJpbmcpIGVsZW1lbnQ7Ci0vLyAgICAgICAgICBicmVhazsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgY2FzZSAxOgotLy8gICAgICAgIHsKLS8vICAgICAgICAgIGlmICh0YXJnZXRGYWNldCA9PSBudWxsKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICB2YWx1ZSA9ICIiOwotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgZWxzZQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICB2YWx1ZSA9IHRhcmdldEZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotLy8gICAgICAgICAgfQotLy8KLS8vICAgICAgICAgIGJyZWFrOwotLy8gICAgICAgIH0KLS8vICAgICAgICBjYXNlIDI6Ci0vLyAgICAgICAgewotLy8gICAgICAgICAgaWYgKHRhcmdldEZhY2V0ID09IG51bGwpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHZhbHVlID0gIiI7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgICBlbHNlCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIEVsZW1lbnQgZWxlbSA9IHRhcmdldEZhY2V0LmdldEVsZW1lbnQoKTsKLS8vICAgICAgICAgICAgdmFsdWUgPSBlbGVtLmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLS8vICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0vLyAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICAgIHJldHVybiB2YWx1ZTsKLS8vICAgICAgfQotLy8gICAgICByZXR1cm4gIiI7Ci0vLyAgICB9Ci0vLyAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9JRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MmU2MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9JRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLQotcHVibGljIGludGVyZmFjZSBJRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXIKLXsKLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vZGVBZGFwdGVyIGFkYXB0ZXIpOwotICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm9kZUFkYXB0ZXIgYWRhcHRlcik7ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvTXVsdGlwbGljaXR5U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9NdWx0aXBsaWNpdHlTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NmFjZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9NdWx0aXBsaWNpdHlTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVNYXhPY2N1cnNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIE11bHRpcGxpY2l0eVNlY3Rpb24gZXh0ZW5kcyBSZWZhY3RvcmluZ1NlY3Rpb24KLXsKLSAgcHJvdGVjdGVkIENDb21ibyBtaW5Db21ibywgbWF4Q29tYm87Ci0KLSAgcHVibGljIE11bHRpcGxpY2l0eVNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgfQotCi0gIAotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBtaW5Db21ibykKLSAgICB7Ci0gICAgICB1cGRhdGVNaW5BdHRyaWJ1dGUoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IG1heENvbWJvKQotICAgIHsKLSAgICAgIHVwZGF0ZU1heEF0dHJpYnV0ZSgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBtaW5Db21ibykKLSAgICB7Ci0gICAgICB1cGRhdGVNaW5BdHRyaWJ1dGUoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gbWF4Q29tYm8pCi0gICAgewotICAgICAgdXBkYXRlTWF4QXR0cmlidXRlKCk7Ci0gICAgfQotICAgIHN1cGVyLmRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNYXhBdHRyaWJ1dGUoKQotICB7Ci0gICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gbnVsbDsKLQotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlQ29udGVudCkKLSAgICB7Ci0gICAgICBwYXJ0aWNsZSA9IGdldEFzc29jaWF0ZWRQYXJ0aWNsZSgoWFNEUGFydGljbGVDb250ZW50KSBpbnB1dCk7Ci0gICAgfQotICAgIGlmIChwYXJ0aWNsZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IG1heENvbWJvLmdldFRleHQoKS50cmltKCk7Ci0gICAgICAKLSAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgewotICAgICAgICBwYXJ0aWNsZS51bnNldE1heE9jY3VycygpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaW50IG5ld01heCA9IDE7Ci0gICAgICAgIGlmIChuZXdWYWx1ZS5lcXVhbHMoInVuYm91bmRlZCIpIHx8IG5ld1ZhbHVlLmVxdWFscygiKiIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgewotICAgICAgICAgIG5ld01heCA9IFhTRFBhcnRpY2xlLlVOQk9VTkRFRDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5ld01heCA9IEludGVnZXIucGFyc2VJbnQobmV3VmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgICAgICBVcGRhdGVNYXhPY2N1cnNDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlTWF4T2NjdXJzQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0NIQU5HRV9NQVhJTVVNX09DQ1VSUkVOQ0UsIHBhcnRpY2xlLCBuZXdNYXgpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLl9VSV9FUlJPUl9JTlZBTElEX1ZBTFVFX0ZPUl9NQVhJTVVNX09DQ1VSUkVOQ0UpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZU1pbkF0dHJpYnV0ZSgpCi0gIHsKLSAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBudWxsOwotCi0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEUGFydGljbGVDb250ZW50KQotICAgIHsKLSAgICAgIHBhcnRpY2xlID0gZ2V0QXNzb2NpYXRlZFBhcnRpY2xlKChYU0RQYXJ0aWNsZUNvbnRlbnQpIGlucHV0KTsKLSAgICB9Ci0gICAgaWYgKHBhcnRpY2xlICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gbWluQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID09IDApCi0gICAgICB7Ci0gICAgICAgIHBhcnRpY2xlLnVuc2V0TWluT2NjdXJzKCk7Ci0gICAgICB9Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaW50IG5ld01pbiA9IDE7Ci0gICAgICAgIGlmIChuZXdWYWx1ZS5lcXVhbHMoInVuYm91bmRlZCIpIHx8IG5ld1ZhbHVlLmVxdWFscygiKiIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgewotICAgICAgICAgIG5ld01pbiA9IFhTRFBhcnRpY2xlLlVOQk9VTkRFRDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdNaW4gPSBJbnRlZ2VyLnBhcnNlSW50KG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBVcGRhdGVNaW5PY2N1cnNDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlTWluT2NjdXJzQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0NIQU5HRV9NSU5JTVVNX09DQ1VSUkVOQ0UsIHBhcnRpY2xlLCBuZXdNaW4pOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgICAgewotCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTWluTWF4KCkKLSAgewotICAgIGJvb2xlYW4gcmVmcmVzaE1pblRleHQgPSB0cnVlOwotICAgIGJvb2xlYW4gcmVmcmVzaE1heFRleHQgPSB0cnVlOwotICAgIGlmIChtaW5Db21iby5pc0ZvY3VzQ29udHJvbCgpKQotICAgIHsKLSAgICAgIHJlZnJlc2hNaW5UZXh0ID0gZmFsc2U7Ci0gICAgfQotICAgIGlmIChtYXhDb21iby5pc0ZvY3VzQ29udHJvbCgpKQotICAgIHsKLSAgICAgIHJlZnJlc2hNYXhUZXh0ID0gZmFsc2U7Ci0gICAgfQotICAgIGlmIChyZWZyZXNoTWluVGV4dCkKLSAgICB7Ci0gICAgICBtaW5Db21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBpZiAocmVmcmVzaE1heFRleHQpCi0gICAgewotICAgICAgbWF4Q29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZUNvbnRlbnQpCi0gICAgICB7Ci0gICAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gZ2V0QXNzb2NpYXRlZFBhcnRpY2xlKChYU0RQYXJ0aWNsZUNvbnRlbnQpIGlucHV0KTsKLSAgICAgICAgaWYgKHBhcnRpY2xlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBtaW5UZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YocGFydGljbGUuZ2V0TWluT2NjdXJzKCkpKTsKLSAgICAgICAgICAvLyBtYXhUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YocGFydGljbGUuZ2V0TWF4T2NjdXJzKCkpKTsKLSAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBwYXJ0aWNsZS5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUpICYmIHJlZnJlc2hNaW5UZXh0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgbWluID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUpOwotICAgICAgICAgICAgICBtaW5Db21iby5zZXRUZXh0KG1pbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1BWE9DQ1VSU19BVFRSSUJVVEUpICYmIHJlZnJlc2hNYXhUZXh0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgbWF4ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1BWE9DQ1VSU19BVFRSSUJVVEUpOwotICAgICAgICAgICAgICBtYXhDb21iby5zZXRUZXh0KG1heCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIFhTRFBhcnRpY2xlIGdldEFzc29jaWF0ZWRQYXJ0aWNsZShYU0RQYXJ0aWNsZUNvbnRlbnQgcGFydGljbGVDb250ZW50KQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcCA9IHBhcnRpY2xlQ29udGVudC5nZXRDb250YWluZXIoKTsKLSAgICBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgIHsKLSAgICAgIHJldHVybiAoWFNEUGFydGljbGUpIHhzZENvbXA7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmIChtaW5Db21ibyAhPSBudWxsICYmICFtaW5Db21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZW1vdmVMaXN0ZW5lcnMobWluQ29tYm8pOwotICAgIGlmIChtYXhDb21ibyAhPSBudWxsICYmICFtYXhDb21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZW1vdmVMaXN0ZW5lcnMobWF4Q29tYm8pOwotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1JlZmFjdG9yaW5nU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9SZWZhY3RvcmluZ1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjllZmQwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1JlZmFjdG9yaW5nU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5JSHlwZXJsaW5rTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JbWFnZUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLklTZWxlY3Rpb25NYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuaGFuZGxlcnMuUmVuYW1lSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmYWN0b3JpbmdTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIGltcGxlbWVudHMgSUh5cGVybGlua0xpc3RlbmVyCi17Ci0gIC8qKgotICAgKiBDbGlja2luZyBvbiBpdCBpbnZva2VzIHRoZSByZWZhY3Rvci0+cmVuYW1lIGFjdGlvbi4KLSAgICovCi0gIHByaXZhdGUgSW1hZ2VIeXBlcmxpbmsgcmVuYW1lSHlwZXJsaW5rOwotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGlkZUh5cGVyTGluazsKLQotICAvKioKLSAgICogSW52b2tlcyB0aGUgcmVmYWN0b3ItPnJlbmFtZSBhY3Rpb24gb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGludm9rZVJlbmFtZVJlZmFjdG9yaW5nKCkKLSAgewotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKSBlZGl0b3IuZ2V0QWRhcHRlcihYU0RTY2hlbWEuY2xhc3MpOwotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oaW5wdXQpOwotICAgIElTZWxlY3Rpb25NYXBwZXIgbWFwcGVyID0gKElTZWxlY3Rpb25NYXBwZXIpIGVkaXRvci5nZXRBZGFwdGVyKElTZWxlY3Rpb25NYXBwZXIuY2xhc3MpOwotICAgIHNlbGVjdGlvbiA9IG1hcHBlciAhPSBudWxsID8gbWFwcGVyLm1hcFNlbGVjdGlvbihzZWxlY3Rpb24pIDogc2VsZWN0aW9uOwotICAgIFJlbmFtZUhhbmRsZXIgcmVuYW1lSGFuZGxlciA9IG5ldyBSZW5hbWVIYW5kbGVyKCk7Ci0gICAgcmVuYW1lSGFuZGxlci5leGVjdXRlKHNlbGVjdGlvbiwgc2NoZW1hKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNob3dMaW5rKGJvb2xlYW4gaXNWaXNpYmxlKQotICB7Ci0JICByZW5hbWVIeXBlcmxpbmsuc2V0VmlzaWJsZShpc1Zpc2libGUpOwotICB9Ci0gIAotICAvKioKLSAgICogQ3JlYXRlcyB0aGUgcmVmYWN0b3IvcmVuYW1lIGh5cGVybGluayBzaG93biBiZXNpZGUgYSBjb21wb25lbnQgbmFtZS4KLSAgICogQ2xpY2tpbmcgb24gdGhlIGh5cGVybGluayBpbnZva2VzIHRoZSByZWZhY3Rvci9yZW5hbWUgYWN0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudAotICAgKiAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZS4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlbmFtZUh5cGVybGluayhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgcmVuYW1lSHlwZXJsaW5rID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUltYWdlSHlwZXJsaW5rKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgcmVuYW1lSHlwZXJsaW5rLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvcXVpY2thc3Npc3QuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgcmVuYW1lSHlwZXJsaW5rLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9UT09MVElQX1JFTkFNRV9SRUZBQ1RPUik7Ci0gICAgcmVuYW1lSHlwZXJsaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKHRoaXMpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzZXRSZW5hbWVIeXBlcmxpbmtFbmFibGVkKGJvb2xlYW4gaXNFbmFibGVkKQotICB7Ci0gICAgcmVuYW1lSHlwZXJsaW5rLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLklIeXBlcmxpbmtMaXN0ZW5lciNsaW5rQWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkKLSAgewotICAgIGludm9rZVJlbmFtZVJlZmFjdG9yaW5nKCk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5JSHlwZXJsaW5rTGlzdGVuZXIjbGlua0VudGVyZWQob3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgbGlua0VudGVyZWQoSHlwZXJsaW5rRXZlbnQgZSkKLSAgewotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSUh5cGVybGlua0xpc3RlbmVyI2xpbmtFeGl0ZWQob3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgbGlua0V4aXRlZChIeXBlcmxpbmtFdmVudCBlKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvU2NoZW1hTG9jYXRpb25TZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1NjaGVtYUxvY2F0aW9uU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODc5OGJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvU2NoZW1hTG9jYXRpb25TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc1NjaGVtYUxvY2F0aW9uVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RJbmNsdWRlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RSZWRlZmluZUltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNjaGVtYUxvY2F0aW9uU2VjdGlvbiBleHRlbmRzIENvbW1vbkRpcmVjdGl2ZXNTZWN0aW9uCi17Ci0JICBJV29ya2JlbmNoUGFydCBwYXJ0OwotCSAgCi0JICAvKioKLQkgICAqIAotCSAgICovCi0JICBwdWJsaWMgU2NoZW1hTG9jYXRpb25TZWN0aW9uKCkKLQkgIHsKLQkgICAgc3VwZXIoKTsKLQkgIH0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0JCXsKLQkJCWNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAKLSAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotCQkJLy8gQ3JlYXRlIFNjaGVtYSBMb2NhdGlvbiBMYWJlbAotCQkJQ0xhYmVsIHNjaGVtYUxvY2F0aW9uTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1NDSEVNQV9MT0NBVElPTiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICAgIHNjaGVtYUxvY2F0aW9uTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotICAgICAgLy8gQ3JlYXRlIFNjaGVtYSBMb2NhdGlvbiBUZXh0Ci0gICAgICBzY2hlbWFMb2NhdGlvblRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHNjaGVtYUxvY2F0aW9uVGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLSAgICAgIGFwcGx5QWxsTGlzdGVuZXJzKHNjaGVtYUxvY2F0aW9uVGV4dCk7ICAgICAgIAotCi0gICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIHNjaGVtYUxvY2F0aW9uVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNjaGVtYUxvY2F0aW9uVGV4dCwKLSAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19JTkNMVURFX1JFREVGSU5FX19TQ0hFTUFMT0NBVElPTik7Ci0gICAgICAKLQkJCS8vIENyZWF0ZSBXaXphcmQgQnV0dG9uCi0JCQl3aXphcmRCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotICAgICAgd2l6YXJkQnV0dG9uLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJCXdpemFyZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJd2l6YXJkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJCi0gICAgICAvLyBlcnJvciB0ZXh0Ci0gICAgICBlcnJvclRleHQgPSBuZXcgU3R5bGVkVGV4dChjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICAgIGVycm9yVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICBlcnJvclRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICBlcnJvclRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIAotICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGVycm9yVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCX0KLQkJCi0gICAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgICB7Ci0gICAgICBpZiAoZXZlbnQud2lkZ2V0ID09IHdpemFyZEJ1dHRvbikKLSAgICAgIHsKLSAgICAgICAgWFNERGlyZWN0aXZlc1NjaGVtYUxvY2F0aW9uVXBkYXRlci51cGRhdGVTY2hlbWFMb2NhdGlvbih4c2RTY2hlbWEsaW5wdXQsdHJ1ZSk7Ci0gICAgICAgIHJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVmcmVzaCgpCi0JCXsKLQkJCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCi0JCQkJRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RJbmNsdWRlKQotICAgICAgICB7IAotCQkJCQllbGVtZW50ID0gKChYU0RJbmNsdWRlSW1wbCkgaW5wdXQpLmdldEVsZW1lbnQoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICAgICAgewotCQkJCQllbGVtZW50ID0gKChYU0RSZWRlZmluZUltcGwpIGlucHV0KS5nZXRFbGVtZW50KCk7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbG9jYXRpb24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgic2NoZW1hTG9jYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxvY2F0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0JCQkJCXNjaGVtYUxvY2F0aW9uVGV4dC5zZXRUZXh0KGxvY2F0aW9uKTsKLQkJCQl9Ci0KLSAgICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCQl9Ci0KLQkgIC8qIChub24tSmF2YWRvYykKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotCSAgICovCi0JICBwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkKLQkgIHsKLQkgICAgcmV0dXJuIHRydWU7Ci0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1NpbXBsZUNvbnRlbnRVbmlvbk1lbWJlclR5cGVzRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1NpbXBsZUNvbnRlbnRVbmlvbk1lbWJlclR5cGVzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOTBiZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9TaW1wbGVDb250ZW50VW5pb25NZW1iZXJUeXBlc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlZpZXdVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2lkZ2V0cy5UeXBlU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLQotcHVibGljIGNsYXNzIFNpbXBsZUNvbnRlbnRVbmlvbk1lbWJlclR5cGVzRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZTsKLSAgLyoqCi0gICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgKi8KLSAgcHVibGljIFNpbXBsZUNvbnRlbnRVbmlvbk1lbWJlclR5cGVzRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgIHRoaXMuc2ltcGxlVHlwZSA9IHNpbXBsZVR5cGU7Ci0gIH0KLSAgCi0gIFRhYmxlIHRhYmxlOwotICBUeXBlU2VjdGlvbiB0eXBlU2VjdGlvbjsKLSAgQnV0dG9uIGFkZEJ1dHRvbiwgcmVtb3ZlQnV0dG9uOwotICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0IG1lbWJlclR5cGVzTGlzdDsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIHJlc3VsdDsKLQotICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkKLSAgewotICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKQotICB7Ci0gICAgaWYgKGJ1dHRvbklkID09IFdpbmRvdy5PSykKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBpbnQgbGVuZ3RoID0gbWVtYmVyVHlwZXNMaXN0LmdldEl0ZW1Db3VudCgpOwotICAgICAgZm9yIChpbnQgaT0wIDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBzYi5hcHBlbmQobWVtYmVyVHlwZXNMaXN0LmdldEl0ZW0oaSkpOwotICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDEpCi0gICAgICAgIHsKLSAgICAgICAgICBzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXN1bHQgPSBzYi50b1N0cmluZygpOwotICAgIH0KLSAgICBzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0KCkgeyByZXR1cm4gcmVzdWx0OyB9Ci0KLSAgLy8KLSAgLy8gQ3JlYXRlIHRoZSBjb250cm9scwotICAvLwotICBwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgY2xpZW50ID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgZ2V0U2hlbGwoKS5zZXRUZXh0KCJVbmlvbiAiICsgWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSk7ICAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgTGFiZWwgaW5zdHJ1Y3Rpb25zID0gbmV3IExhYmVsKGNsaWVudCwgU1dULkxFRlQgfCBTV1QuV1JBUCk7Ci0gICAgaW5zdHJ1Y3Rpb25zLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1NFTEVDVF9NRU1CRVJUWVBFUyIpKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIENvbXBvc2l0ZSBjb2x1bW5zQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjbGllbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGNjR0wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGNjR0wudmVydGljYWxTcGFjaW5nID0gMDsKLSAgICBjY0dMLmhvcml6b250YWxTcGFjaW5nID0gMDsKLSAgICBjY0dMLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgY2NHTC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgY2NHTC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgIGNjR0wubnVtQ29sdW1ucyA9IDM7Ci0gICAgY29sdW1uc0NvbXBvc2l0ZS5zZXRMYXlvdXQoY2NHTCk7Ci0gICAgCi0gICAgR3JpZERhdGEgY2NHRCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGNjR0QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgY2NHRC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBjb2x1bW5zQ29tcG9zaXRlLnNldExheW91dERhdGEoY2NHRCk7ICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHR5cGVTZWN0aW9uID0gbmV3IFR5cGVTZWN0aW9uKGNvbHVtbnNDb21wb3NpdGUpOwotICAgIHR5cGVTZWN0aW9uLnNldFNob3dVc2VyQ29tcGxleFR5cGUoZmFsc2UpOwotCi0gICAgdHlwZVNlY3Rpb24uY3JlYXRlQ2xpZW50KGNvbHVtbnNDb21wb3NpdGUpOwotICAgIHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgIHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICB0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZSgpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUhvcml6b250YWxGaWxsZXIoY29sdW1uc0NvbXBvc2l0ZSwgMSk7Ci0gICAgCi0gICAgTGFiZWwgbWVtYmVyTGlzdExhYmVsID0gbmV3IExhYmVsKGNvbHVtbnNDb21wb3NpdGUsIFNXVC5MRUZUKTsKLSAgICBtZW1iZXJMaXN0TGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfTUVNQkVSVFlQRVNfVkFMVUUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBDb21wb3NpdGUgZGF0YUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBkY0dMID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBkY0dMLnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0gICAgZGNHTC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGRjR0wubWFyZ2luV2lkdGggPSAwOwotICAgIGRjR0wubnVtQ29sdW1ucyA9IDM7Ci0gICAgZGF0YUNvbXBvc2l0ZS5zZXRMYXlvdXQoZGNHTCk7Ci0gICAgCi0gICAgR3JpZERhdGEgZGNHRCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRjR0QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGNHRC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRjR0QpOwotICAgIAotICAgIHRhYmxlID0gbmV3IFRhYmxlKGRhdGFDb21wb3NpdGUsCi0gICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsgCi0gICAgdGFibGUuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0gICAgdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgIEdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkMi5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBnZDIuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdkMi5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBnZDIudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdkMi5oZWlnaHRIaW50ID0gMjAwOwotICAgIGdkMi53aWR0aEhpbnQgPSAyMDA7Ci0gICAgdGFibGUuc2V0TGF5b3V0RGF0YShnZDIpOwotCi0gICAgLy8gRmlsbCB0YWJsZQotICAgIGhhbmRsZVNldElucHV0KCk7Ci0gICAgdGFibGUuZ2V0SXRlbUNvdW50KCk7Ci0KLSAgICBUYWJsZUNvbHVtbiB0YyA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotICAgIHRjLnNldFdpZHRoKDIwMCk7Ci0gICAgdGMuc2V0UmVzaXphYmxlKHRydWUpOwotICAgIAotICAgIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRhdGFDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGJjR0wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGJjR0wubnVtQ29sdW1ucyA9IDE7Ci0gICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChiY0dMKTsKLSAgICBhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgIGFkZEJ1dHRvbi5zZXRUZXh0KCI+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICBhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICByZW1vdmVCdXR0b24uc2V0VGV4dCgiPCIpOyAvLyROT04tTkxTLTEkCi0gICAgcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIENvbXBvc2l0ZSBsaXN0Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkYXRhQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBtdEdMID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBtdEdMLm51bUNvbHVtbnMgPSAxOwotICAgIG10R0wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBtdEdMLm1hcmdpbldpZHRoID0gMDsKLSAgICBtdEdMLmhvcml6b250YWxTcGFjaW5nID0gMDsKLSAgICBtdEdMLnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0gICAgbGlzdENvbXBvc2l0ZS5zZXRMYXlvdXQobXRHTCk7Ci0KLSAgICBHcmlkRGF0YSBtdEdEID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgbXRHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBtdEdELmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBtdEdELnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBtdEdELmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGxpc3RDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShtdEdEKTsKLSAgICAKLSAgICBtZW1iZXJUeXBlc0xpc3QgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdChsaXN0Q29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLSAgICBHcmlkRGF0YSBtdGxHRCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIG10bEdELmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIG10bEdELmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBtdGxHRC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbXRsR0QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbXRsR0QuaGVpZ2h0SGludCA9IDIwMDsKLSAgICBtdGxHRC53aWR0aEhpbnQgPSAyMDA7Ci0gICAgbWVtYmVyVHlwZXNMaXN0LnNldExheW91dERhdGEobXRsR0QpOwotICAgIAotICAgIGluaXRpYWxpemVNZW1iZXJMaXN0Q29udGVudCgpOwotICAgIHJldHVybiBjbGllbnQ7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZU1lbWJlckxpc3RDb250ZW50KCkKLSAgewotLy8gICAgU3RyaW5nIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUpOwotLy8gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotLy8gICAgewotLy8gICAgICByZXR1cm47Ci0vLyAgICB9Ci0vLyAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW4gPSBuZXcgU3RyaW5nVG9rZW5pemVyKHJlc3VsdCk7Ci0vLyAgICB3aGlsZSAodG9rZW4uaGFzTW9yZVRva2VucygpKQotLy8gICAgewotLy8gICAgICBtZW1iZXJUeXBlc0xpc3QuYWRkKHRva2VuLm5leHRUb2tlbigpKTsKLS8vICAgIH0KLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gc2ltcGxlVHlwZS5nZXRTY2hlbWEoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzaW1wbGVUeXBlLmdldE1lbWJlclR5cGVEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgU3RyaW5nIG5hbWUgPSAoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWkubmV4dCgpKS5nZXRRTmFtZShzY2hlbWEpOwotICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgIG1lbWJlclR5cGVzTGlzdC5hZGQobmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpICYmIHR5cGVTZWN0aW9uLmdldFNpbXBsZVR5cGUoKS5nZXRTZWxlY3Rpb24oKSkKLSAgICAgewotICAgICAgcG9wdWxhdGVCdWlsdEluVHlwZSgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSB0eXBlU2VjdGlvbi5nZXRVc2VyU2ltcGxlVHlwZSgpICYmIHR5cGVTZWN0aW9uLmdldFVzZXJTaW1wbGVUeXBlKCkuZ2V0U2VsZWN0aW9uKCkpCi0gICAgIHsKLSAgICAgIHBvcHVsYXRlVXNlclNpbXBsZVR5cGUoZmFsc2UpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBhZGRCdXR0b24pCi0gICAgewotICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotICAgICAgaW50IHNlbGVjdGlvbiA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICBpZiAoaXRlbXMgIT0gbnVsbCAmJiBpdGVtcy5sZW5ndGggPiAwICYmIHNlbGVjdGlvbiA+PSAwKQotICAgICAgewotICAgICAgICBTdHJpbmcgdHlwZVRvQWRkID0gaXRlbXNbc2VsZWN0aW9uXS5nZXREYXRhKCkudG9TdHJpbmcoKTsKLSAgICAgICAgaWYgKG1lbWJlclR5cGVzTGlzdC5pbmRleE9mKHR5cGVUb0FkZCkgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgbWVtYmVyVHlwZXNMaXN0LmFkZChpdGVtc1tzZWxlY3Rpb25dLmdldERhdGEoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSByZW1vdmVCdXR0b24pCi0gICAgewotICAgICAgU3RyaW5nW10gdHlwZXNUb1JlbW92ZSA9IG1lbWJlclR5cGVzTGlzdC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIGZvciAoaW50IGk9MDsgaSA8IHR5cGVzVG9SZW1vdmUubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIG1lbWJlclR5cGVzTGlzdC5yZW1vdmUodHlwZXNUb1JlbW92ZVtpXSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBoYW5kbGVTZXRJbnB1dCgpCi0gIHsKLSAgICBwb3B1bGF0ZUJ1aWx0SW5UeXBlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHBvcHVsYXRlQnVpbHRJblR5cGUoKQotICB7Ci0gICAgdGFibGUucmVtb3ZlQWxsKCk7Ci0gICAgTGlzdCBpdGVtcyA9IGdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykKLSAgICAgewotICAgICAgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICBpdGVtLnNldFRleHQoaXRlbXMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgICAgaXRlbS5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFNpbXBsZVR5cGUuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgICBpdGVtLnNldERhdGEoaXRlbXMuZ2V0KGkpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZVVzZXJTaW1wbGVUeXBlKGJvb2xlYW4gc2hvd0Fub255bW91cykKLSAgewotICAgIHRhYmxlLnJlbW92ZUFsbCgpOwotICAgIGlmIChzaG93QW5vbnltb3VzKQotICAgICB7Ci0gICAgICBUYWJsZUl0ZW0gYW5vbnltb3VzSXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICAgIGFub255bW91c0l0ZW0uc2V0VGV4dCgiKiphbm9ueW1vdXMqKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBhbm9ueW1vdXNJdGVtLnNldERhdGEoIioqYW5vbnltb3VzKioiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBMaXN0IGl0ZW1zID0gZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgICB7Ci0gICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICAgIGl0ZW0uc2V0VGV4dChpdGVtcy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICBpdGVtLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGl0ZW0uc2V0RGF0YShpdGVtcy5nZXQoaSkpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCkKLSAgewotICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcihzaW1wbGVUeXBlLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gaGVscGVyLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gIH0KLQotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKQotICB7Ci0gICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHNpbXBsZVR5cGUuZ2V0U2NoZW1hKCkpOwotICAgIHJldHVybiBoZWxwZXIuZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1NwZWNpZmljQ29uc3RyYWludHNXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTNiNjVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzLk5hdmlnYWJsZVRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZEVudW1lcmF0aW9uc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlWFNEUGF0dGVybkZhY2V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1lcmF0aW9uc0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHMuUmVnZXhXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVudW1lcmF0aW9uRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXR0ZXJuRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldCBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyLCBMaXN0ZW5lcgotewotICBwdWJsaWMgc3RhdGljIGludCBFTlVNRVJBVElPTiA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgaW50IFBBVFRFUk4gPSAxOwotICAKLSAgaW50IGtpbmQ7Ci0gIENvbnN0cmFpbnRzVGFibGVWaWV3ZXIgY29uc3RyYWludHNUYWJsZVZpZXdlcjsKLSAgQnV0dG9uIGFkZEJ1dHRvbjsKLSAgQnV0dG9uIGFkZFVzaW5nRGlhbG9nQnV0dG9uOwotICBCdXR0b24gZGVsZXRlQnV0dG9uOwotICBCdXR0b24gZWRpdEJ1dHRvbjsKLSAgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLSAgYm9vbGVhbiBpc0VuYWJsZWQ7Ci0gIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3Rvcnk7Ci0gIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGlucHV0OwotICBYU0RGZWF0dXJlIGZlYXR1cmU7Ci0gIGJvb2xlYW4gaXNSZWFkT25seTsKLSAgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjazsKLSAgWFNERmFjZXRTZWN0aW9uIGZhY2V0U2VjdGlvbjsKLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICogQHBhcmFtIGNvbXBvc2l0ZQotICAgKiBAcGFyYW0gZmFjdG9yeQotICAgKiBAcGFyYW0gZmVhdHVyZQotICAgKiBAcGFyYW0gaW5wdXQKLSAgICogQHBhcmFtIGZhY2V0U2VjdGlvbgotICAgKi8KLSAgcHVibGljIFNwZWNpZmljQ29uc3RyYWludHNXaWRnZXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSwgWFNERmVhdHVyZSBmZWF0dXJlLCBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBpbnB1dCwgWFNERmFjZXRTZWN0aW9uIGZhY2V0U2VjdGlvbikKLSAgewotICAgIHRoaXMoY29tcG9zaXRlLCBmYWN0b3J5LCBmZWF0dXJlLCBpbnB1dCwgZmFjZXRTZWN0aW9uLCBFTlVNRVJBVElPTik7Ci0gIH0KLQotICBwdWJsaWMgU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldChDb21wb3NpdGUgY29tcG9zaXRlLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5LCBYU0RGZWF0dXJlIGZlYXR1cmUsIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGlucHV0LCBYU0RGYWNldFNlY3Rpb24gZmFjZXRTZWN0aW9uLCBpbnQga2luZCkKLSAgewotICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICAgIHRoaXMuY29tcG9zaXRlID0gY29tcG9zaXRlOwotICAgIHRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0gICAgdGhpcy5mYWNldFNlY3Rpb24gPSBmYWNldFNlY3Rpb247Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgICAKLSAgICBjcmVhdGVDb250cm9sKGNvbXBvc2l0ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kU3RhY2soQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykKLSAgewotICAgIHRoaXMuY29tbWFuZFN0YWNrID0gY29tbWFuZFN0YWNrOyAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElzUmVhZE9ubHkoYm9vbGVhbiBpc1JlYWRPbmx5KQotICB7Ci0gICAgdGhpcy5pc1JlYWRPbmx5ID0gaXNSZWFkT25seTsKLSAgfQotCi0gIHB1YmxpYyBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBnZXRXaWRnZXRGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiBmYWN0b3J5OwotICB9Ci0gIAotICBwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkKLSAgewotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBpc0VuYWJsZWQpCi0gIHsKLSAgICB0aGlzLmlzRW5hYmxlZCA9IGlzRW5hYmxlZDsKLSAgICBhZGRCdXR0b24uc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgIGFkZFVzaW5nRGlhbG9nQnV0dG9uLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICBlZGl0QnV0dG9uLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICBjb25zdHJhaW50c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gIH0KLQotICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBmYWN0b3J5LmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIgPSBuZXcgQ29uc3RyYWludHNUYWJsZVZpZXdlcihnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGFibGUoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pKTsKLSAgICBjb25zdHJhaW50c1RhYmxlVmlld2VyLnNldElucHV0KGlucHV0KTsKLSAgICBUYWJsZSB0YWJsZSA9IGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLSAgICB0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS53aWR0aEhpbnQgPSAxNTA7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICB0YWJsZS5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCB0aGlzKTsKLSAgICAKLSAgICBDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICBHcmlkTGF5b3V0IGJ1dHRvbkNvbXBvc2l0ZUxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgYnV0dG9uQ29tcG9zaXRlTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgYnV0dG9uQ29tcG9zaXRlTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgYnV0dG9uQ29tcG9zaXRlTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoYnV0dG9uQ29tcG9zaXRlTGF5b3V0KTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIAotICAgIGFkZEJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfQUNUSU9OX0FERCwgU1dULlBVU0gpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLSAgICBhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgYWRkVXNpbmdEaWFsb2dCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfV0lUSF9ET1RTLCBTV1QuUFVTSCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotICAgIGFkZFVzaW5nRGlhbG9nQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYWRkVXNpbmdEaWFsb2dCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICBlZGl0QnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fRURJVF9XSVRIX0RPVFMsIFNXVC5QVVNIKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBlZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIAotICAgIGRlbGV0ZUJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfQUNUSU9OX0RFTEVURSwgU1dULlBVU0gpOwotCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkZWxldGVCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBkZWxldGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICBzZXRCdXR0b25TdGF0ZXMoa2luZCk7Ci0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgVGFibGUgdGFibGUgPSBjb25zdHJhaW50c1RhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0gICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULlJlc2l6ZSAmJiBldmVudC53aWRnZXQgPT0gdGFibGUpCi0gICAgewotICAgICAgVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW4oMCk7Ci0gICAgICB0YWJsZUNvbHVtbi5zZXRXaWR0aCh0YWJsZS5nZXRTaXplKCkueCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICB7Ci0gICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0gICAgaWYgKGlzUmVhZE9ubHkpCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotLy8gICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldENvbnN0cmFpbnRLaW5kKCkKLSAgewotCSAgcmV0dXJuIHRoaXMua2luZDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc2V0QnV0dG9uU3RhdGVzKGludCBraW5kKQotICB7Ci0gICAgYm9vbGVhbiBhZGQsIGFkZFVzaW5nLCBkZWxldGUsIGVkaXQ7Ci0KLSAgICBib29sZWFuIGxpc3RIYXNJdGVtcyA9IGZhbHNlOwotICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChzZWxlY3Rpb24udG9MaXN0KCkuc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgbGlzdEhhc0l0ZW1zID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoa2luZCA9PSBFTlVNRVJBVElPTikKLSAgICB7Ci0gICAgICBhZGQgPSB0cnVlOwotICAgICAgYWRkVXNpbmcgPSB0cnVlOwotICAgICAgZWRpdCA9IGZhbHNlOwotICAgIH0KLSAgICBlbHNlIGlmIChraW5kID09IFBBVFRFUk4pCi0gICAgewotICAgICAgYWRkID0gZmFsc2U7Ci0gICAgICBhZGRVc2luZyA9IHRydWU7Ci0gICAgICBlZGl0ID0gbGlzdEhhc0l0ZW1zOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgYWRkID0gdHJ1ZTsKLSAgICAgIGFkZFVzaW5nID0gdHJ1ZTsKLSAgICAgIGVkaXQgPSB0cnVlOwotICAgIH0KLSAgICBkZWxldGUgPSBsaXN0SGFzSXRlbXM7Ci0KLSAgICBpZiAoIWFkZEJ1dHRvbi5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgYWRkQnV0dG9uLnNldEVuYWJsZWQoYWRkKTsKLSAgICB9Ci0gICAgaWYgKCFhZGRVc2luZ0RpYWxvZ0J1dHRvbi5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgYWRkVXNpbmdEaWFsb2dCdXR0b24uc2V0RW5hYmxlZChhZGRVc2luZyk7Ci0gICAgfQotICAgIGlmICghZGVsZXRlQnV0dG9uLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBkZWxldGVCdXR0b24uc2V0RW5hYmxlZChkZWxldGUpOwotICAgIH0KLSAgICBpZiAoIWVkaXRCdXR0b24uaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIGVkaXRCdXR0b24uc2V0RW5hYmxlZChlZGl0KTsKLSAgICB9Ci0gIH0gIAotICAKLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gaW5wdXQ7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGFkZEJ1dHRvbikKLSAgICB7Ci0gICAgICBMaXN0IGVudW1MaXN0ID0gc3QuZ2V0RW51bWVyYXRpb25GYWNldHMoKTsKLSAgICAgIFN0cmluZyBuZXdOYW1lID0gWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbnVtZXJhdGlvblZhbHVlKCJ2YWx1ZSIsIGVudW1MaXN0KTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICBpZiAoa2luZCA9PSBFTlVNRVJBVElPTikKLSAgICAgIHsKLSAgICAgICAgQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLSAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdGFyZ2V0U2ltcGxlVHlwZSA9IG51bGw7Ci0gICAgICAgIGlmIChmZWF0dXJlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBhbm9ueW1vdXNTaW1wbGVUeXBlID0gWFNEQ29tbW9uVUlVdGlscy5nZXRBbm9ueW1vdXNTaW1wbGVUeXBlKGZlYXR1cmUsIGlucHV0KTsKLSAgICAgICAgICBpZiAoYW5vbnltb3VzU2ltcGxlVHlwZSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFub255bW91c1NpbXBsZVR5cGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZS5zZXRCYXNlVHlwZURlZmluaXRpb24oaW5wdXQpOwotCi0gICAgICAgICAgICBDaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQgY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kID0gbmV3IENoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0NIQU5HRV9QQVRURVJOLCBmZWF0dXJlKTsKLSAgICAgICAgICAgIGNoYW5nZVRvQW5vbnltb3VzQ29tbWFuZC5zZXRBbm9ueW1vdXNTaW1wbGVUeXBlKGFub255bW91c1NpbXBsZVR5cGUpOwotICAgICAgICAgICAgY29tcG91bmRDb21tYW5kLmFkZChjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQpOwotICAgICAgICAgICAgaW5wdXQgPSBhbm9ueW1vdXNTaW1wbGVUeXBlOwotICAgICAgICAgIH0KLSAgICAgICAgICB0YXJnZXRTaW1wbGVUeXBlID0gYW5vbnltb3VzU2ltcGxlVHlwZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB0YXJnZXRTaW1wbGVUeXBlID0gaW5wdXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBBZGRFbnVtZXJhdGlvbnNDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkRW51bWVyYXRpb25zQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9FTlVNRVJBVElPTiwgdGFyZ2V0U2ltcGxlVHlwZSk7Ci0gICAgICAgIGNvbW1hbmQuc2V0VmFsdWUobmV3TmFtZSk7Ci0gICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQoY29tbWFuZCk7Ci0gICAgICAgIGNvbW1hbmRTdGFjay5leGVjdXRlKGNvbXBvdW5kQ29tbWFuZCk7Ci0gICAgICAgIHNldElucHV0KGlucHV0KTsKLSAgICAgICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgIGludCBuZXdJdGVtSW5kZXggPSBjb25zdHJhaW50c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxOwotICAgICAgICBjb25zdHJhaW50c1RhYmxlVmlld2VyLmVkaXRFbGVtZW50KGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIuZ2V0RWxlbWVudEF0KG5ld0l0ZW1JbmRleCksIDApOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBhZGRVc2luZ0RpYWxvZ0J1dHRvbikKLSAgICB7Ci0gICAgICBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLSAgICAgIC8vIGlmIGl0IGlzIG51bGwsIGdldCB0aGUgZGVmYXVsdCBvbmUKLSAgICAgIGRpc3BsYXkgPSBkaXNwbGF5ID09IG51bGwgPyBEaXNwbGF5LmdldERlZmF1bHQoKSA6IGRpc3BsYXk7Ci0gICAgICBTaGVsbCBzaGVsbCA9IGRpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKTsKLQotICAgICAgaWYgKGtpbmQgPT0gUEFUVEVSTikKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGluaXRpYWxWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFJlZ2V4V2l6YXJkIHdpemFyZCA9IG5ldyBSZWdleFdpemFyZChpbml0aWFsVmFsdWUpOwotCi0gICAgICAgIFdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotICAgICAgICB3aXphcmREaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICAgIHdpemFyZERpYWxvZy5jcmVhdGUoKTsKLQotICAgICAgICBpbnQgcmVzdWx0ID0gd2l6YXJkRGlhbG9nLm9wZW4oKTsKLQotICAgICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBuZXdQYXR0ZXJuID0gd2l6YXJkLmdldFBhdHRlcm4oKTsKLSAgICAgICAgICBDb21wb3VuZENvbW1hbmQgY29tcG91bmRDb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHRhcmdldFNpbXBsZVR5cGUgPSBudWxsOwotICAgICAgICAgIGlmIChmZWF0dXJlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gYW5vbnltb3VzU2ltcGxlVHlwZSA9IFhTRENvbW1vblVJVXRpbHMuZ2V0QW5vbnltb3VzU2ltcGxlVHlwZShmZWF0dXJlLCBpbnB1dCk7Ci0gICAgICAgICAgICBpZiAoYW5vbnltb3VzU2ltcGxlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZS5zZXRCYXNlVHlwZURlZmluaXRpb24oaW5wdXQpOwotCi0gICAgICAgICAgICAgIENoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZCBjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQgPSBuZXcgQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0hBTkdFX1BBVFRFUk4sIGZlYXR1cmUpOwotICAgICAgICAgICAgICBjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQuc2V0QW5vbnltb3VzU2ltcGxlVHlwZShhbm9ueW1vdXNTaW1wbGVUeXBlKTsKLSAgICAgICAgICAgICAgY29tcG91bmRDb21tYW5kLmFkZChjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQpOwotICAgICAgICAgICAgICBpbnB1dCA9IGFub255bW91c1NpbXBsZVR5cGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YXJnZXRTaW1wbGVUeXBlID0gYW5vbnltb3VzU2ltcGxlVHlwZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldFNpbXBsZVR5cGUgPSBpbnB1dDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgVXBkYXRlWFNEUGF0dGVybkZhY2V0Q29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfUEFUVEVSTiwgdGFyZ2V0U2ltcGxlVHlwZSwgVXBkYXRlWFNEUGF0dGVybkZhY2V0Q29tbWFuZC5BREQpOwotICAgICAgICAgIGNvbW1hbmQuc2V0VmFsdWUobmV3UGF0dGVybik7Ci0gICAgICAgICAgc2V0SW5wdXQoaW5wdXQpOwotICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQoY29tbWFuZCk7Ci0gICAgICAgICAgY29tbWFuZFN0YWNrLmV4ZWN1dGUoY29tcG91bmRDb21tYW5kKTsKLSAgICAgICAgICBmYWNldFNlY3Rpb24uZG9TZXRJbnB1dCgpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBFbnVtZXJhdGlvbnNEaWFsb2cgZGlhbG9nID0gbmV3IEVudW1lcmF0aW9uc0RpYWxvZyhzaGVsbCk7Ci0gICAgICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgICAgaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgdGV4dCA9IGRpYWxvZy5nZXRUZXh0KCk7Ci0gICAgICAgICAgU3RyaW5nIGRlbGltaXRlciA9IGRpYWxvZy5nZXREZWxpbWl0ZXIoKTsKLSAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZXh0LCBkZWxpbWl0ZXIpOwotICAgICAgICAgIENvbXBvdW5kQ29tbWFuZCBjb21wb3VuZENvbW1hbmQgPSBuZXcgQ29tcG91bmRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VOVU1FUkFUSU9OUyk7Ci0gICAgICAgICAgCi0gICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdGFyZ2V0U2ltcGxlVHlwZSA9IG51bGw7Ci0gICAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBhbm9ueW1vdXNTaW1wbGVUeXBlID0gWFNEQ29tbW9uVUlVdGlscy5nZXRBbm9ueW1vdXNTaW1wbGVUeXBlKGZlYXR1cmUsIGlucHV0KTsKLSAgICAgICAgICAgIGlmIChhbm9ueW1vdXNTaW1wbGVUeXBlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGFub255bW91c1NpbXBsZVR5cGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlLnNldEJhc2VUeXBlRGVmaW5pdGlvbihpbnB1dCk7Ci0KLSAgICAgICAgICAgICAgQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kIGNoYW5nZVRvQW5vbnltb3VzQ29tbWFuZCA9IG5ldyBDaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQoIiIsIGZlYXR1cmUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGNoYW5nZVRvQW5vbnltb3VzQ29tbWFuZC5zZXRBbm9ueW1vdXNTaW1wbGVUeXBlKGFub255bW91c1NpbXBsZVR5cGUpOwotICAgICAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGNoYW5nZVRvQW5vbnltb3VzQ29tbWFuZCk7Ci0gICAgICAgICAgICAgIGlucHV0ID0gYW5vbnltb3VzU2ltcGxlVHlwZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRhcmdldFNpbXBsZVR5cGUgPSBhbm9ueW1vdXNTaW1wbGVUeXBlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0U2ltcGxlVHlwZSA9IGlucHV0OwotICAgICAgICAgIH0KLQotICAgICAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIGlmIChkaWFsb2cuaXNQcmVzZXJ2ZVdoaXRlc3BhY2UoKSA9PSBmYWxzZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi50cmltKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBZGRFbnVtZXJhdGlvbnNDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkRW51bWVyYXRpb25zQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9FTlVNRVJBVElPTlMsIHRhcmdldFNpbXBsZVR5cGUpOwotICAgICAgICAgICAgY29tbWFuZC5zZXRWYWx1ZSh0b2tlbik7Ci0gICAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGNvbW1hbmQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjb21tYW5kU3RhY2suZXhlY3V0ZShjb21wb3VuZENvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgIC8vc2V0SW5wdXQoaW5wdXQpOwotICAgICAgICBmYWNldFNlY3Rpb24uZG9TZXRJbnB1dCgpOwotICAgICAgICBjb25zdHJhaW50c1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZGVsZXRlQnV0dG9uKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBDb21wb3VuZENvbW1hbmQgY29tcG91bmRDb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5zZXRMYWJlbChNZXNzYWdlcy5fVUlfQUNUSU9OX0RFTEVURV9DT05TVFJBSU5UUyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgY29tcG91bmRDb21tYW5kLnNldExhYmVsKE1lc3NhZ2VzLl9VSV9BQ1RJT05fREVMRVRFX1BBVFRFUk4pOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvYmogPSBpLm5leHQoKTsKLSAgICAgICAgICBpZiAob2JqICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTRFBhdHRlcm5GYWNldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgVXBkYXRlWFNEUGF0dGVybkZhY2V0Q29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQoIiIsIGlucHV0LCBVcGRhdGVYU0RQYXR0ZXJuRmFjZXRDb21tYW5kLkRFTEVURSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgY29tbWFuZC5zZXRQYXR0ZXJuVG9FZGl0KChYU0RQYXR0ZXJuRmFjZXQpb2JqKTsKLSAgICAgICAgICAgICAgY29tcG91bmRDb21tYW5kLmFkZChjb21tYW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFhTREVudW1lcmF0aW9uRmFjZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTREVudW1lcmF0aW9uRmFjZXQgZW51bUZhY2V0ID0gKFhTREVudW1lcmF0aW9uRmFjZXQpIG9iajsKLSAgICAgICAgICAgICAgRGVsZXRlQ29tbWFuZCBkZWxldGVDb21tYW5kID0gbmV3IERlbGV0ZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9ERUxFVEVfRU5VTUVSQVRJT04sIGVudW1GYWNldCk7Ci0gICAgICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQoZGVsZXRlQ29tbWFuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbW1hbmRTdGFjay5leGVjdXRlKGNvbXBvdW5kQ29tbWFuZCk7Ci0gICAgICAgIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBlZGl0QnV0dG9uKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RQYXR0ZXJuRmFjZXQpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RQYXR0ZXJuRmFjZXQgcGF0dGVybiA9IChYU0RQYXR0ZXJuRmFjZXQpIG9iajsKLSAgICAgICAgICBTdHJpbmcgaW5pdGlhbFZhbHVlID0gcGF0dGVybi5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgICAgICBpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0KLSAgICAgICAgICBSZWdleFdpemFyZCB3aXphcmQgPSBuZXcgUmVnZXhXaXphcmQoaW5pdGlhbFZhbHVlKTsKLQotICAgICAgICAgIFdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotICAgICAgICAgIHdpemFyZERpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgICAgICB3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0KLSAgICAgICAgICBpbnQgcmVzdWx0ID0gd2l6YXJkRGlhbG9nLm9wZW4oKTsKLQotICAgICAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuZXdQYXR0ZXJuID0gd2l6YXJkLmdldFBhdHRlcm4oKTsKLSAgICAgICAgICAgIHBhdHRlcm4uc2V0TGV4aWNhbFZhbHVlKG5ld1BhdHRlcm4pOwotICAgICAgICAgICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHNldEJ1dHRvblN0YXRlcyh0aGlzLmtpbmQpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotCi0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29uc3RyYWludEtpbmQoaW50IGtpbmQpCi0gIHsKLSAgICB0aGlzLmtpbmQgPSBraW5kOwotICAgIHNldEJ1dHRvblN0YXRlcyhraW5kKTsKLSAgICBjb25zdHJhaW50c1RhYmxlVmlld2VyLnNldElucHV0KGlucHV0KTsKLSAgICBjb25zdHJhaW50c1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZG9Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgc2V0QnV0dG9uU3RhdGVzKHRoaXMua2luZCk7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0gJiYgKHZhbHVlICE9IG51bGwpKQotICAgIHsKLSAgICAgIFRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZWxlbWVudDsKLQotICAgICAgaWYgKGl0ZW0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgWFNEUGF0dGVybkZhY2V0KQotICAgICAgewotICAgICAgICBYU0RQYXR0ZXJuRmFjZXQgcGF0dGVybkZhY2V0ID0gKFhTRFBhdHRlcm5GYWNldCkgaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgIHBhdHRlcm5GYWNldC5zZXRMZXhpY2FsVmFsdWUoKFN0cmluZykgdmFsdWUpOwotCi0gICAgICAgIGl0ZW0uc2V0RGF0YShwYXR0ZXJuRmFjZXQpOwotICAgICAgICBpdGVtLnNldFRleHQoKFN0cmluZykgdmFsdWUpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaXRlbS5nZXREYXRhKCkgaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotICAgICAgewotICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBTZXRYU0RGYWNldFZhbHVlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9FTlVNRVJBVElPTl9WQUxVRSwgZW51bUZhY2V0KTsKLSAgICAgICAgY29tbWFuZC5zZXRWYWx1ZSgoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgIGNvbW1hbmRTdGFjay5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICBpdGVtLnNldERhdGEoZW51bUZhY2V0KTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KChTdHJpbmcpIHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgZG9HZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RQYXR0ZXJuRmFjZXQpCi0gICAgewotICAgICAgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm5GYWNldCA9IChYU0RQYXR0ZXJuRmFjZXQpIGVsZW1lbnQ7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBwYXR0ZXJuRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgWFNERW51bWVyYXRpb25GYWNldCkKLSAgICB7Ci0gICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBlbGVtZW50OwotICAgICAgU3RyaW5nIHZhbHVlID0gZW51bUZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgY2xhc3MgQ29uc3RyYWludHNUYWJsZVZpZXdlciBleHRlbmRzIE5hdmlnYWJsZVRhYmxlVmlld2VyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllcgotICB7Ci0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXMgPSB7IE1lc3NhZ2VzLl9VSV9MQUJFTF9QQVRURVJOIH07Ci0KLSAgICBwcm90ZWN0ZWQgQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzOwotCi0gICAgVGFibGUgdGFibGU7Ci0KLSAgICBwdWJsaWMgQ29uc3RyYWludHNUYWJsZVZpZXdlcihUYWJsZSB0YWJsZSkKLSAgICB7Ci0gICAgICBzdXBlcih0YWJsZSk7Ci0gICAgICB0YWJsZSA9IGdldFRhYmxlKCk7Ci0KLSAgICAgIHRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotICAgICAgc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDb25zdHJhaW50c0NvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgIHNldExhYmVsUHJvdmlkZXIobmV3IENvbnN0cmFpbnRzVGFibGVMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzKTsKLQotICAgICAgc2V0Q2VsbE1vZGlmaWVyKHRoaXMpOwotCi0gICAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FLCAwKTsKLSAgICAgIGNvbHVtbi5zZXRUZXh0KGNvbHVtblByb3BlcnRpZXNbMF0pOwotICAgICAgY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0gICAgICBjb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCi0gICAgICBjZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yWzFdOwotCi0gICAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICAgIENvbHVtbldlaWdodERhdGEgZGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCk7Ci0KLSAgICAgIGxheW91dC5hZGRDb2x1bW5EYXRhKGRhdGEpOwotICAgICAgY2VsbEVkaXRvcnNbMF0gPSBuZXcgVGV4dENlbGxFZGl0b3IodGFibGUpOwotCi0gICAgICBnZXRUYWJsZSgpLnNldExheW91dChsYXlvdXQpOwotICAgICAgc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgIGRvTW9kaWZ5KGVsZW1lbnQsIHByb3BlcnR5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIHJldHVybiBkb0dldFZhbHVlKGVsZW1lbnQsIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgfQotCi0gIGNsYXNzIENvbnN0cmFpbnRzQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7Ci0gICAgICBqYXZhLnV0aWwuTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXRFbGVtZW50OwotICAgICAgICBib29sZWFuIGlzRGVmaW5lZCA9IGZhbHNlOwotICAgICAgICBJdGVyYXRvciBpdGVyOwotICAgICAgICBpZiAoa2luZCA9PSBQQVRURVJOKQotICAgICAgICB7Ci0gICAgICAgICAgaXRlciA9IHN0LmdldFBhdHRlcm5GYWNldHMoKS5pdGVyYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGl0ZXIgPSBzdC5nZXRFbnVtZXJhdGlvbkZhY2V0cygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RGYWNldCBmYWNldCA9IChYU0RGYWNldCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgaXNEZWZpbmVkID0gKGZhY2V0LmdldFJvb3RDb250YWluZXIoKSA9PSBmYWNldFNlY3Rpb24ueHNkU2NoZW1hKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChraW5kID09IFBBVFRFUk4pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNEZWZpbmVkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzdC5nZXRQYXR0ZXJuRmFjZXRzKCkudG9BcnJheSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNEZWZpbmVkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzdC5nZXRFbnVtZXJhdGlvbkZhY2V0cygpLnRvQXJyYXkoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgfQotICB9Ci0KLSAgY2xhc3MgQ29uc3RyYWludHNUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlcgotICB7Ci0gICAgcHVibGljIENvbnN0cmFpbnRzVGFibGVMYWJlbFByb3ZpZGVyKCkKLSAgICB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICBpZiAoa2luZCA9PSBQQVRURVJOKQotICAgICAgewotICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVQYXR0ZXJuLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFNpbXBsZUVudW0uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFhTRFBhdHRlcm5GYWNldCkKLSAgICAgIHsKLSAgICAgICAgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm4gPSAoWFNEUGF0dGVybkZhY2V0KSBlbGVtZW50OwotICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXR0ZXJuLmdldExleGljYWxWYWx1ZSgpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotICAgICAgewotICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBlbGVtZW50OwotICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbnVtRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQWN0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMWZhNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5FZGl0QXR0cmlidXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuWE1MTm9kZUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWFNEQWN0aW9uTWFuYWdlciBleHRlbmRzIFhNTE5vZGVBY3Rpb25NYW5hZ2VyIHsKLQotICBwcml2YXRlIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2s7Ci0gIAotCXB1YmxpYyBYU0RBY3Rpb25NYW5hZ2VyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIobW9kZWwsIHZpZXdlcik7Ci0JfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29tbWFuZFN0YWNrKENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spIHsKLSAgICB0aGlzLmNvbW1hbmRTdGFjayA9IGNvbW1hbmRTdGFjazsKLSAgfQotCi0gIHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkQ0RhdGFTZWN0aW9uQWN0aW9uKE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRQQ0RhdGFBY3Rpb24oTm9kZSBwYXJlbnQsIENNRGF0YVR5cGUgZGF0YVR5cGUsIGludCBpbmRleCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAKLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlQWRkRG9jdW1lbnRDaGlsZEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIERvY3VtZW50IGRvY3VtZW50LCBpbnQgaWMsIGludCB2YykgewotCX0KLSAgCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZUVkaXRHcmFtbWFySW5mb3JtYXRpb25BY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBOb2RlIG5vZGUpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVBJQW5kQ29tbWVudEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIERvY3VtZW50IGRvY3VtZW50LCBpbnQgaW5kZXgpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVBJQW5kQ29tbWVudEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIEVsZW1lbnQgcGFyZW50RWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RWQsIGludCBpbmRleCkgewotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVGV4dE5vZGVBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBFbGVtZW50IHBhcmVudEVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkLCBpbnQgaW5kZXgpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRleHROb2RlQWN0aW9ucyhtZW51LCBwYXJlbnRFbGVtZW50LCBwYXJlbnRFZCwgaW5kZXgpOwotCX0KLSAgCi0gIHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkQXR0cmlidXRlQWN0aW9uKEVsZW1lbnQgcGFyZW50LCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKSB7Ci0gICAgQWN0aW9uIGFjdGlvbiA9IG51bGw7Ci0gICAgaWYgKGFkID09IG51bGwpIHsKLSAgICAgIGFjdGlvbiA9IG5ldyBFZGl0QXR0cmlidXRlQWN0aW9uKHRoaXMsIHBhcmVudCwgbnVsbCwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9ORVdfQVRUUklCVVRFLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX05FV19BVFRSSUJVVEVfVElUTEUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9IGVsc2UgewotICAgICAgYWN0aW9uID0gbmV3IEFkZE5vZGVBY3Rpb24oYWQsIHBhcmVudCwgLTEpOwotICAgIH0KLSAgICAKLSAgICBXcmFwcGVyQ29tbWFuZCBjb21tYW5kID0gbmV3IFdyYXBwZXJDb21tYW5kKGFjdGlvbiwgcGFyZW50LCBhZCk7Ci0gICAgV3JhcHBlckFjdGlvbiB3cmFwcGVyQWN0aW9uID0gbmV3IFdyYXBwZXJBY3Rpb24oY29tbWFuZCk7Ci0gICAgcmV0dXJuIHdyYXBwZXJBY3Rpb247Ci0gIH0KLSAgCi0gIGNsYXNzIFdyYXBwZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLSAgewotICAgIFdyYXBwZXJDb21tYW5kIGNvbW1hbmQ7Ci0gICAgCi0gICAgcHVibGljIFdyYXBwZXJBY3Rpb24oV3JhcHBlckNvbW1hbmQgY29tbWFuZCkKLSAgICB7Ci0gICAgICBzdXBlcigpOwotICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gY29tbWFuZC5nZXRBY3Rpb24oKS5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICAvLyBTb21lIGVkaXRvcnMgbWF5IG5vdCB1c2UgYSBjb21tYW5kIHN0YWNrCi0gICAgICBpZiAoY29tbWFuZFN0YWNrICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmRTdGFjay5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBjbGFzcyBXcmFwcGVyQ29tbWFuZCBleHRlbmRzIENvbW1hbmQKLSAgewotICAgIEFjdGlvbiBhY3Rpb247Ci0gICAgRWxlbWVudCBwYXJlbnQ7Ci0gICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZDsKLSAgICBwdWJsaWMgV3JhcHBlckNvbW1hbmQoQWN0aW9uIGFjdGlvbiwgRWxlbWVudCBwYXJlbnQsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uOwotICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICB0aGlzLmFkID0gYWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsKLSAgICAgIHJldHVybiBhY3Rpb24uZ2V0VGV4dCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQWN0aW9uIGdldEFjdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIGFjdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgewotICAgICAgYWN0aW9uLnJ1bigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB1bmRvKCkgewotICAgICAgCi0vLyAgICAgICgoRWxlbWVudClwYXJlbnQpLnJlbW92ZUF0dHJpYnV0ZShhZC5nZXRBdHRyTmFtZSgpKTsKLQotICAgICAgZ2V0TW9kZWwoKS5nZXRVbmRvTWFuYWdlcigpLnVuZG8oKTsKLQotICAgIH0gCi0gICAgICAgIAotCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBbnlFbGVtZW50Q29udGVudHNTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREFueUVsZW1lbnRDb250ZW50c1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3YWI0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREFueUVsZW1lbnRDb250ZW50c1NlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUHJvY2Vzc0NvbnRlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotcHVibGljIGNsYXNzIFhTREFueUVsZW1lbnRDb250ZW50c1NlY3Rpb24gZXh0ZW5kcyBNdWx0aXBsaWNpdHlTZWN0aW9uCi17Ci0gIENDb21ibyBuYW1lc3BhY2VDb21ibzsKLSAgQ0NvbWJvIHByb2Nlc3NDb250ZW50c0NvbWJvOwotCi0gIHByaXZhdGUgU3RyaW5nW10gbmFtZXNwYWNlQ29tYm9WYWx1ZXMgPSB7ICIiLCAvLyROT04tTkxTLTEkCi0gICAgICAiIyNhbnkiLCAvLyROT04tTkxTLTEkCi0gICAgICAiIyNvdGhlciIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICIjI2xvY2FsIiAvLyROT04tTkxTLTEkCi0gIH07Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFhTREFueUVsZW1lbnRDb250ZW50c1NlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBuYW1lc3BhY2VMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUklCVVRFU19OQU1FU1BBQ0UpOwotICAgIG5hbWVzcGFjZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBuYW1lc3BhY2VDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBuYW1lc3BhY2VDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIG5hbWVzcGFjZUNvbWJvLnNldEl0ZW1zKG5hbWVzcGFjZUNvbWJvVmFsdWVzKTsKLSAgICBuYW1lc3BhY2VDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5hbWVzcGFjZUNvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19BTllFTEVNRU5UX19OQU1FU1BBQ0UpOwotCi0gICAgQ0xhYmVsIHByb2Nlc3NDb250ZW50c0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9BVFRSSUJVVEVTX1BST0NFU1NDT05URU5UUyk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIHByb2Nlc3NDb250ZW50c0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBwcm9jZXNzQ29udGVudHNDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBwcm9jZXNzQ29udGVudHNDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIEl0ZXJhdG9yIGxpc3QgPSBYU0RQcm9jZXNzQ29udGVudHMuVkFMVUVTLml0ZXJhdG9yKCk7Ci0gICAgcHJvY2Vzc0NvbnRlbnRzQ29tYm8uYWRkKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIHdoaWxlIChsaXN0Lmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBwcm9jZXNzQ29udGVudHNDb21iby5hZGQoKChYU0RQcm9jZXNzQ29udGVudHMpIGxpc3QubmV4dCgpKS5nZXROYW1lKCkpOwotICAgIH0KLSAgICBwcm9jZXNzQ29udGVudHNDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHByb2Nlc3NDb250ZW50c0NvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19BTllFTEVNRU5UX19QUk9DRVNTQ09OVEVOVFMpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gbWluIHByb3BlcnR5Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuVUlfTEFCRUxfTUlOT0NDVVJTKTsKLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICBtaW5Db21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgbWluQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBtaW5Db21iby5hZGQoIjAiKTsgLy8kTk9OLU5MUy0xJAotICAgIG1pbkNvbWJvLmFkZCgiMSIpOyAvLyROT04tTkxTLTEkCi0gICAgYXBwbHlBbGxMaXN0ZW5lcnMobWluQ29tYm8pOwotICAgIG1pbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWluQ29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0FOWUVMRU1FTlRfX01JTl9PQ0NVUkVOQ0UpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gbWF4IHByb3BlcnR5Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLlVJX0xBQkVMX01BWE9DQ1VSUyk7Ci0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCi0gICAgbWF4Q29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIG1heENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgbWF4Q29tYm8uYWRkKCIwIik7IC8vJE5PTi1OTFMtMSQKLSAgICBtYXhDb21iby5hZGQoIjEiKTsgLy8kTk9OLU5MUy0xJAotICAgIG1heENvbWJvLmFkZCgidW5ib3VuZGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICBhcHBseUFsbExpc3RlbmVycyhtYXhDb21ibyk7Ci0gICAgbWF4Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChtYXhDb21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQU5ZRUxFTUVOVF9fTUFYX09DQ1VSRU5DRSk7Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgbmFtZXNwYWNlQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBwcm9jZXNzQ29udGVudHNDb21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgICAgewotICAgICAgICBYU0RXaWxkY2FyZCB3aWxkY2FyZCA9IChYU0RXaWxkY2FyZCkgaW5wdXQ7Ci0gICAgICAgIGlmICh3aWxkY2FyZC5pc1NldExleGljYWxOYW1lc3BhY2VDb25zdHJhaW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lc3BhY2VDb21iby5zZXRUZXh0KHdpbGRjYXJkLmdldFN0cmluZ0xleGljYWxOYW1lc3BhY2VDb25zdHJhaW50KCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG5hbWVzcGFjZUNvbWJvLnNldFRleHQoIiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3aWxkY2FyZC5pc1NldFByb2Nlc3NDb250ZW50cygpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEUHJvY2Vzc0NvbnRlbnRzIHBjID0gd2lsZGNhcmQuZ2V0UHJvY2Vzc0NvbnRlbnRzKCk7Ci0gICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzQ29tYm8uc2V0VGV4dChwYy5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAod2lsZGNhcmQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICAgIHsKLSAgICAgICAgICBtaW5Db21iby5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgICAgICBtYXhDb21iby5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBtaW5Db21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICBtYXhDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZWZyZXNoTWluTWF4KCk7Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgaW5wdXQ7Ci0gICAgaWYgKGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpCi0gICAgewotICAgICAgWFNEV2lsZGNhcmQgd2lsZGNhcmQgPSAoWFNEV2lsZGNhcmQpIGNvbmNyZXRlQ29tcG9uZW50OwotICAgICAgaWYgKGUud2lkZ2V0ID09IG5hbWVzcGFjZUNvbWJvKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmV3VmFsdWUgPSBuYW1lc3BhY2VDb21iby5nZXRUZXh0KCk7Ci0gICAgICAgIGJvb2xlYW4gcmVtb3ZlQXR0cmlidXRlID0gZmFsc2U7Ci0gICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmVtb3ZlQXR0cmlidXRlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPIHVzZSBjb21tYW5kcwotICAgICAgICAvLyBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTkFNRVNQQUNFX0NIQU5HRSIpLAotICAgICAgICAvLyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAocmVtb3ZlQXR0cmlidXRlKQotICAgICAgICB7Ci0gICAgICAgICAgd2lsZGNhcmQudW5zZXRMZXhpY2FsTmFtZXNwYWNlQ29uc3RyYWludCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHdpbGRjYXJkLnNldFN0cmluZ0xleGljYWxOYW1lc3BhY2VDb25zdHJhaW50KG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAvLyBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBwcm9jZXNzQ29udGVudHNDb21ibykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gcHJvY2Vzc0NvbnRlbnRzQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgICBib29sZWFuIHJlbW92ZUF0dHJpYnV0ZSA9IGZhbHNlOwotICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1BST0NFU1NDT05URU5UU19DSEFOR0UiKSwKLSAgICAgICAgLy8gZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHJlbW92ZUF0dHJpYnV0ZSkKLSAgICAgICAgewotICAgICAgICAgIHdpbGRjYXJkLnVuc2V0UHJvY2Vzc0NvbnRlbnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgd2lsZGNhcmQuc2V0UHJvY2Vzc0NvbnRlbnRzKFhTRFByb2Nlc3NDb250ZW50cy5nZXQocHJvY2Vzc0NvbnRlbnRzQ29tYm8uZ2V0SXRlbShwcm9jZXNzQ29udGVudHNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKSkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIuZG9XaWRnZXRTZWxlY3RlZChlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKG1pbkNvbWJvICE9IG51bGwgJiYgIW1pbkNvbWJvLmlzRGlzcG9zZWQoKSkKLSAgICAgIG1pbkNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGlmIChtYXhDb21ibyAhPSBudWxsICYmICFtYXhDb21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgICBtYXhDb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvblNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQXR0cmlidXRlRGVjbGFyYXRpb25TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYjNlMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvblNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuWE1MQ2hhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5CYXNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlTmFtZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLk5ld1R5cGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNEQXR0cmlidXRlUmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoLlhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEQXR0cmlidXRlRGVjbGFyYXRpb25TZWN0aW9uIGV4dGVuZHMgUmVmYWN0b3JpbmdTZWN0aW9uCi17Ci0gIHByb3RlY3RlZCBUZXh0IG5hbWVUZXh0LCBkZWZhdWx0T3JGaXhlZFRleHQ7Ci0gIHByb3RlY3RlZCBDQ29tYm8gY29tcG9uZW50TmFtZUNvbWJvLCB0eXBlQ29tYm8sIHVzYWdlQ29tYm8sIGZvcm1Db21ibzsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBkZWZhdWx0QnV0dG9uLCBmaXhlZEJ1dHRvbjsKLSAgcHJvdGVjdGVkIFN0cmluZyB0eXBlTmFtZSA9ICIiLCByZWZOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgYm9vbGVhbiBpc0F0dHJpYnV0ZVJlZmVyZW5jZTsKLSAgCi0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvblNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIFN0cmluZyB0eXBlTGFiZWwgPSBNZXNzYWdlcy5VSV9MQUJFTF9UWVBFOyAvLyROT04tTkxTLTEkCi0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5hbWVMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX05BTUUpOwotICAgIG5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gTmFtZVRleHQKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIG5hbWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIG5hbWVUZXh0LnNldEVuYWJsZWQoIWlzQXR0cmlidXRlUmVmZXJlbmNlKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyhuYW1lVGV4dCk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuYW1lVGV4dCwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQVRUUklCVVRFX19OQU1FKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFJlZmFjdG9yL3JlbmFtZSBoeXBlcmxpbmsKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBpZiAoIWhpZGVIeXBlckxpbmspIAotICAgIHsKLSAgICAJY3JlYXRlUmVuYW1lSHlwZXJsaW5rKGNvbXBvc2l0ZSk7Ci0JCSAgc2V0UmVuYW1lSHlwZXJsaW5rRW5hYmxlZCghaXNBdHRyaWJ1dGVSZWZlcmVuY2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgCSAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsKLSAgICB9Ci0gICAgCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBSZWYgTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBpZiAoaXNBdHRyaWJ1dGVSZWZlcmVuY2UpCi0gICAgewotICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICAgIENMYWJlbCByZWZMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9SRUZFUkVOQ0UpOwotICAgICAgcmVmTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBSZWYgQ29tYm8KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgICAgY29tcG9uZW50TmFtZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIHRoaXMpOwotICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9uZW50TmFtZUNvbWJvLAotICAgICAgICAgIFhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQVRUUklCVVRFX19OQU1FKTsKLQotICAgICAgLy8gZHVtbXkKLSAgICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gdHlwZUxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIHR5cGVMYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHR5cGVDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgdHlwZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIHR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHR5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICB0eXBlQ29tYm8uYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCB0aGlzKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHR5cGVDb21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQVRUUklCVVRFX19UWVBFKTsKLQotICAgIC8vIGR1bW15Ci0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFVzYWdlTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgQ0xhYmVsIHVzZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9VU0FHRSIpKTsKLSAgICB1c2VMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gVXNhZ2VDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgdXNhZ2VDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICB1c2FnZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgdXNhZ2VDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICB1c2FnZUNvbWJvLmFkZCgiIik7Ci0gICAgdXNhZ2VDb21iby5hZGQoInJlcXVpcmVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICB1c2FnZUNvbWJvLmFkZCgib3B0aW9uYWwiKTsgLy8kTk9OLU5MUy0xJAotICAgIHVzYWdlQ29tYm8uYWRkKCJwcm9oaWJpdGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICB1c2FnZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIC8vIGR1bW15Ci0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIGRlZmF1bHRMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBDTGFiZWwgZGVmYXVsdExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX1ZBTFVFX0NPTE9OKTsKLSAgICBkZWZhdWx0TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAKLSAgICBDb21wb3NpdGUgcmFkaW8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0gICAgcmFkaW8uc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0gICAgCi0gICAgZGVmYXVsdEJ1dHRvbiA9IG5ldyBCdXR0b24ocmFkaW8sIFNXVC5SQURJTyk7Ci0gICAgZGVmYXVsdEJ1dHRvbi5zZXRUZXh0KG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0RFRkFVTFQpOwotICAgIGRlZmF1bHRCdXR0b24uc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICBkZWZhdWx0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIGZpeGVkQnV0dG9uID0gbmV3IEJ1dHRvbihyYWRpbywgU1dULlJBRElPKTsKLSAgICBmaXhlZEJ1dHRvbi5zZXRUZXh0KG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0ZJWEVEKTsgIAotICAgIGZpeGVkQnV0dG9uLnNldEJhY2tncm91bmQocGFyZW50LmdldEJhY2tncm91bmQoKSk7Ci0gICAgZml4ZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgLy8gZHVtbXkKLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLy8gZHVtbXkKLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBkZWZhdWx0VGV4dAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGVmYXVsdE9yRml4ZWRUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBkZWZhdWx0T3JGaXhlZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyhkZWZhdWx0T3JGaXhlZFRleHQpOwotICAgIAotICAgIC8vUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuYW1lVGV4dCwKLSAgICAvLwkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19BVFRSSUJVVEVfX0RFRkFVTFQpOwotICAgIAotICAgIC8vIGR1bW15Ci0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEZvcm1MYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBDTGFiZWwgZm9ybUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0ZPUk0pOwotICAgIGZvcm1MYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRm9ybUNvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBmb3JtQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgZm9ybUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgZm9ybUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGZvcm1Db21iby5hZGQoIiIpOwotICAgIGZvcm1Db21iby5hZGQoInF1YWxpZmllZCIpOyAvLyROT04tTkxTLTEkCi0gICAgZm9ybUNvbWJvLmFkZCgidW5xdWFsaWZpZWQiKTsgLy8kTk9OLU5MUy0xJAotICAgIGZvcm1Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICAvLyBkdW1teQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBmaWxsVHlwZXNDb21ibygpCi0gIHsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsKLSAgICBpZiAobWFuYWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotCi0gICAgICB0eXBlQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICB0eXBlQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9DT01CT19CUk9XU0UpOwotICAgICAgdHlwZUNvbWJvLmFkZChNZXNzYWdlcy5fVUlfQ09NQk9fTkVXKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHR5cGVDb21iby5hZGQoaXRlbXNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgIH0KLQotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gbmFtZWRDb21wb25lbnQgPSAoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpbnB1dCkuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgICAgWFNEVHlwZURlZmluaXRpb24gbmFtZWRDb21wb25lbnRUeXBlID0gbmFtZWRDb21wb25lbnQuZ2V0VHlwZSgpOwotICAgICAgaWYgKG5hbWVkQ29tcG9uZW50VHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgY3VycmVudFR5cGVOYW1lID0gbmFtZWRDb21wb25lbnRUeXBlLmdldFFOYW1lKHhzZFNjaGVtYSk7IC8vIG5vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWZpeAotICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJldCA9IGdldENvbXBvbmVudFNwZWNGcm9tUXVpY2tQaWNrRm9yVmFsdWUoY3VycmVudFR5cGVOYW1lLCBtYW5hZ2VyKTsKLSAgICAgICAgaWYgKHJldCA9PSBudWxsKSAvLyBub3QgaW4gcXVpY2tQaWNrCi0gICAgICAgICAgdHlwZUNvbWJvLmFkZChjdXJyZW50VHlwZU5hbWUpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldENvbXBvbmVudFNwZWNGcm9tUXVpY2tQaWNrRm9yVmFsdWUoU3RyaW5nIHZhbHVlLCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBlZGl0TWFuYWdlcikKLSAgewotICAgIGlmIChlZGl0TWFuYWdlciAhPSBudWxsKQotICAgIHsgIAotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIHF1aWNrUGlja3MgPSBlZGl0TWFuYWdlci5nZXRRdWlja1BpY2tzKCk7Ci0gICAgICBpZiAocXVpY2tQaWNrcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBxdWlja1BpY2tzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gcXVpY2tQaWNrc1tpXTsKLSAgICAgICAgICBpZiAodmFsdWUgIT1udWxsICYmIGNvbXBvbmVudFNwZWNpZmljYXRpb24hPW51bGwgJiYgdmFsdWUuZXF1YWxzKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2goKTsKLQotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0KLSAgICAvLyByZWZyZXNoIG5hbWUKLQotICAgIG5hbWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gbmFtZWRDb21wb25lbnQgPSAoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpbnB1dCkuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotCi0gICAgICBTdHJpbmcgbmFtZSA9IG5hbWVkQ29tcG9uZW50LmdldE5hbWUoKTsKLSAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5hbWVUZXh0LnNldFRleHQobmFtZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChpc0F0dHJpYnV0ZVJlZmVyZW5jZSkKLSAgICB7Ci0gICAgICByZWZyZXNoUmVmQ29tYm8oKTsKLSAgICB9Ci0KLSAgICAvLyByZWZyZXNoIHR5cGUKLQotICAgIHR5cGVDb21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RBdHRyaWJ1dGUgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGlucHV0OwotICAgICAgICBpc0F0dHJpYnV0ZVJlZmVyZW5jZSA9ICgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24paW5wdXQpLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKTsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZiA9IHhzZEF0dHJpYnV0ZS5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgYm9vbGVhbiBpc0Fub255bW91cyA9IHhzZEF0dHJpYnV0ZS5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpICE9IG51bGw7Ci0KLSAgICAgICAgaWYgKGlzQW5vbnltb3VzKQotICAgICAgICB7Ci0gICAgICAgICAgdHlwZUNvbWJvLnNldFRleHQoIioqYW5vbnltb3VzKioiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZpbGxUeXBlc0NvbWJvKCk7Ci0gICAgICAgICAgaWYgKHR5cGVEZWYgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlTmFtZSA9IHR5cGVEZWYuZ2V0UU5hbWUoeHNkU2NoZW1hKTsKLSAgICAgICAgICAgIGlmICh0eXBlTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0eXBlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0eXBlQ29tYm8uc2V0VGV4dCh0eXBlTmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlQ29tYm8uc2V0VGV4dChNZXNzYWdlcy5VSV9OT19UWVBFKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHVzYWdlQ29tYm8uc2V0VGV4dCgiIik7Ci0gICAgICAgIHVzYWdlQ29tYm8uc2V0RW5hYmxlZCgheHNkQXR0cmlidXRlLmlzR2xvYmFsKCkpOwotICAgICAgICAKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0geHNkQXR0cmlidXRlLmdldEVsZW1lbnQoKTsKLSAgICAgICAgYm9vbGVhbiBoYXNVc2VBdHRyaWJ1dGUgPSBmYWxzZTsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGhhc1VzZUF0dHJpYnV0ZSA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5VU0VfQVRUUklCVVRFKTsKLSAgICAgICAgICBpZiAoaGFzVXNlQXR0cmlidXRlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB1c2FnZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5VU0VfQVRUUklCVVRFKTsKLSAgICAgICAgICAgIHVzYWdlQ29tYm8uc2V0VGV4dCh1c2FnZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBkZWZhdWx0T3JGaXhlZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAKLSAgICAgICAgYm9vbGVhbiBoYXNEZWZhdWx0QXR0cmlidXRlID0gZmFsc2UsIGhhc0ZpeGVkQXR0cmlidXRlID0gZmFsc2U7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBoYXNEZWZhdWx0QXR0cmlidXRlID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkRFRkFVTFRfQVRUUklCVVRFKTsKLSAgICAgICAgICBoYXNGaXhlZEF0dHJpYnV0ZSA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUpOwotCi0gICAgICAgICAgLy8gQ2FzZSB3aGVyZSBubyBmaXhlZCBvciBkZWZhdWx0IGF0dHJpYnV0ZXMgZXhpc3QsIHNvIGVuc3VyZSBvbmUgb2YgdGhlIHJhZGlvIGJ1dHRvbnMgaXMgc2VsZWN0ZWQKLSAgICAgICAgICBpZiAoIWhhc0RlZmF1bHRBdHRyaWJ1dGUgJiYgIWhhc0ZpeGVkQXR0cmlidXRlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghZGVmYXVsdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSAmJiAhZml4ZWRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIC8vIGlmIG5vbmUgYXJlIHNlbGVjdGVkIHRoZW4gcGljayBmaXhlZAotICAgICAgICAgICAgICBmaXhlZEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZiBib3RoIGFyZSBwcmVzZW50IGluIHNvdXJjZSAoYW4gZXJyb3IhKSwgYXNzdW1lIHRoYXQgKmZpeGVkKiB0YWtlcyAicHJlY2VkZW5jZSIKLSAgICAgICAgICAgIGRlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKCFoYXNGaXhlZEF0dHJpYnV0ZSAmJiBoYXNEZWZhdWx0QXR0cmlidXRlKTsKLSAgICAgICAgICAgIGZpeGVkQnV0dG9uLnNldFNlbGVjdGlvbihoYXNGaXhlZEF0dHJpYnV0ZSk7Ci0gICAgICAgICAgICBpZiAoaGFzRGVmYXVsdEF0dHJpYnV0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIHRoZURlZmF1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgCWRlZmF1bHRPckZpeGVkVGV4dC5zZXRUZXh0KHRoZURlZmF1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGhhc0ZpeGVkQXR0cmlidXRlKSAvLyB3aWxsIG92ZXJ3cml0ZSBkZWZhdWx0IGlmIGJvdGggcHJlc2VudAotCSAgICAgICAgICB7Ci0gICAgICAgIAkgICAgU3RyaW5nIGZpeGVkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJWEVEX0FUVFJJQlVURSk7Ci0gICAgICAgIAkgICAgZGVmYXVsdE9yRml4ZWRUZXh0LnNldFRleHQoZml4ZWQpOwotCSAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3JtQ29tYm8uc2V0VGV4dCgiIik7IAotICAgICAgICBmb3JtQ29tYm8uc2V0RW5hYmxlZCgheHNkQXR0cmlidXRlLmlzR2xvYmFsKCkgJiYgIWlzQXR0cmlidXRlUmVmZXJlbmNlKTsKLSAgICAgICAgYm9vbGVhbiBoYXNGb3JtQXR0cmlidXRlID0gZmFsc2U7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBoYXNGb3JtQXR0cmlidXRlID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZPUk1fQVRUUklCVVRFKTsKLSAgICAgICAgICBpZiAoaGFzRm9ybUF0dHJpYnV0ZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgZm9ybSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5GT1JNX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICBmb3JtQ29tYm8uc2V0VGV4dChmb3JtKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSB0eXBlQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IHR5cGVDb21iby5nZXRUZXh0KCk7Ci0gICAgICBpZiAoc2hvdWxkUGVyZm9ybUNvbWJvU2VsZWN0aW9uKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBzZWxlY3Rpb24pKQotICAgICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZSk7Ci0gICAgfSBlbHNlIGlmIChlLndpZGdldCA9PSBjb21wb25lbnROYW1lQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IGNvbXBvbmVudE5hbWVDb21iby5nZXRUZXh0KCk7Ci0gICAgICBpZiAoc2hvdWxkUGVyZm9ybUNvbWJvU2VsZWN0aW9uKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBzZWxlY3Rpb24pKQotICAgICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZSk7Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKGUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSB0eXBlQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IHR5cGVDb21iby5nZXRUZXh0KCk7Ci0gICAgICBpZiAoc2hvdWxkUGVyZm9ybUNvbWJvU2VsZWN0aW9uKFNXVC5TZWxlY3Rpb24sIHNlbGVjdGlvbikpCi0gICAgICAgIGhhbmRsZVdpZGdldFNlbGVjdGlvbihlKTsKLSAgICB9IGVsc2UgaWYgKGUud2lkZ2V0ID09IGNvbXBvbmVudE5hbWVDb21ibykKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gY29tcG9uZW50TmFtZUNvbWJvLmdldFRleHQoKTsKLSAgICAgIGlmIChzaG91bGRQZXJmb3JtQ29tYm9TZWxlY3Rpb24oU1dULlNlbGVjdGlvbiwgc2VsZWN0aW9uKSkKLSAgICAgICAgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKGUpOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgIGhhbmRsZVdpZGdldFNlbGVjdGlvbihlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSB0eXBlQ29tYm8pCi0gICAgewotICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICBpZiAoZWRpdG9yID09IG51bGwpIHJldHVybjsKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsKLQotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IHR5cGVDb21iby5nZXRUZXh0KCk7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIG5ld1ZhbHVlOwotICAgICAgSUNvbXBvbmVudERpYWxvZyBkaWFsb2c9IG51bGw7Ci0gICAgICBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0NPTUJPX0JST1dTRSkpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCk7Ci0gICAgICAgICgoWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlKSBkaWFsb2cpLnNob3dDb21wbGV4VHlwZXMoZmFsc2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0NPTUJPX05FVykpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0TmV3RGlhbG9nKCk7Ci0gICAgICAgICgoTmV3VHlwZURpYWxvZykgZGlhbG9nKS5hbGxvd0NvbXBsZXhUeXBlKGZhbHNlKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRpYWxvZyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdWYWx1ZSA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbXBvbmVudCgpOwotICAgICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHhzZEF0dHJpYnV0ZSA9ICgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGlucHV0KS5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgICAgICAgbWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoeHNkQXR0cmlidXRlLCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKLSAgICAgICAgCXR5cGVDb21iby5zZXRUZXh0KHR5cGVOYW1lKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSAvL3VzZSB0aGUgdmFsdWUgZnJvbSBzZWxlY3RlZCBxdWlja1BpY2sgaXRlbQotICAgICAgewotICAgICAgICBuZXdWYWx1ZSA9IGdldENvbXBvbmVudFNwZWNGcm9tUXVpY2tQaWNrRm9yVmFsdWUoc2VsZWN0aW9uLCBtYW5hZ2VyKTsKLSAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpCi0gICAgICAgICAgbWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoaW5wdXQsIG5ld1ZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gY29tcG9uZW50TmFtZUNvbWJvKQotICAgIHsKLSAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgaWYgKGVkaXRvciA9PSBudWxsKSByZXR1cm47Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsKLQotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IGNvbXBvbmVudE5hbWVDb21iby5nZXRUZXh0KCk7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIG5ld1ZhbHVlOwotICAgICAgSUNvbXBvbmVudERpYWxvZyBkaWFsb2c9IG51bGw7Ci0gICAgICBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0NPTUJPX0JST1dTRSkpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggc2VsZWN0aW9uLmVxdWFscyhNZXNzYWdlcy5fVUlfQ09NQk9fTkVXKSkKLSAgICAgIHsKLSAgICAgICAgZGlhbG9nID0gbWFuYWdlci5nZXROZXdEaWFsb2coKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRpYWxvZyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdWYWx1ZSA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbXBvbmVudCgpOwotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGlucHV0LCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnNldFRleHQocmVmTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgLy91c2UgdGhlIHZhbHVlIGZyb20gc2VsZWN0ZWQgcXVpY2tQaWNrIGl0ZW0KLSAgICAgIHsKLSAgICAgICAgbmV3VmFsdWUgPSBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKHNlbGVjdGlvbiwgbWFuYWdlcik7Ci0gICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKQotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGlucHV0LCBuZXdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24geHNkQXR0cmlidXRlID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZEF0dHJpYnV0ZS5nZXRFbGVtZW50KCk7Ci0gICAgICBpZiAoZS53aWRnZXQgPT0gdXNhZ2VDb21ibykKLSAgICAgIHsJICAgICAgCi0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdWYWx1ZSA9IHVzYWdlQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBQcm9wZXJ0aWVzQ2hhbmdlQ29tbWFuZChlbGVtZW50LCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9VU0FHRSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGVTdGVwcygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5VU0VfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5VU0VfQVRUUklCVVRFLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfTsKLSAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBmb3JtQ29tYm8pCi0gICAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdWYWx1ZSA9IGZvcm1Db21iby5nZXRUZXh0KCk7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBQcm9wZXJ0aWVzQ2hhbmdlQ29tbWFuZCBjb21tYW5kID0gbmV3IFByb3BlcnRpZXNDaGFuZ2VDb21tYW5kKGVsZW1lbnQsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX0ZPUk0pCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlU3RlcHMoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuRk9STV9BVFRSSUJVVEUpOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZPUk1fQVRUUklCVVRFLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfTsKLSAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBkZWZhdWx0QnV0dG9uKQotICAgICAgewotICAgICAgICBib29sZWFuIG5ld1ZhbHVlID0gZGVmYXVsdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChuZXdWYWx1ZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJWEVEX0FUVFJJQlVURSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUpOwotCi0gICAgICAgICAgICAgIFByb3BlcnRpZXNDaGFuZ2VDb21tYW5kIGNvbW1hbmQgPSBuZXcgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQoZWxlbWVudCwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfREVGQVVMVCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZVN0ZXBzKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5ERUZBVUxUX0FUVFJJQlVURSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGZpeGVkQnV0dG9uKQotICAgICAgewotICAgICAgICBib29sZWFuIG5ld1ZhbHVlID0gZml4ZWRCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobmV3VmFsdWUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5ERUZBVUxUX0FUVFJJQlVURSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5ERUZBVUxUX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgIFByb3BlcnRpZXNDaGFuZ2VDb21tYW5kIGNvbW1hbmQgPSBuZXcgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQoZWxlbWVudCwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfRklYRUQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGVTdGVwcygpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkRFRkFVTFRfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLmRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULlRyYXZlcnNlKSB7Ci0gICAgICBpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9BUlJPV19ORVhUIHx8IGV2ZW50LmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVMpIHsKLSAgICAgICAgaXNUcmF2ZXJzaW5nID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5kb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IG5hbWVUZXh0KQotICAgIHsKLSAgICAgIGlmICghbmFtZVRleHQuZ2V0RWRpdGFibGUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIG5hbWVkQ29tcG9uZW50ID0gKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5wdXQpLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLQotICAgICAgICBpZiAoIXZhbGlkYXRlU2VjdGlvbigpKQotICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBhbiBhY3R1YWwgbmFtZSBjaGFuZ2UgaGFzIHRha2VuIHBsYWNlCi0gICAgICAgIFN0cmluZyBvbGROYW1lID0gbmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGROYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIGNvbW1hbmQgPSBuZXcgVXBkYXRlTmFtZUNvbW1hbmQob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfQUNUSU9OX1JFTkFNRSwgbmFtZWRDb21wb25lbnQsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb21tYW5kICE9IG51bGwgJiYgZ2V0Q29tbWFuZFN0YWNrKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChpc0F0dHJpYnV0ZVJlZmVyZW5jZSkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJSZWYgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24paW5wdXQ7Ci0gICAgICAgICAgU3RyaW5nIHFuYW1lID0gYXR0clJlZi5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0UU5hbWUoKTsKLSAgICAgICAgICBhdHRyUmVmLmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUsIHFuYW1lKTsKLSAgICAgICAgICAKLS8vICAgICAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotLy8gICAgICAgICAgTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vICAgICAgICAgIGl0ZW1zID0gaGVscGVyLmdldEdsb2JhbEVsZW1lbnRzKCk7Ci0vLyAgICAgICAgICBpdGVtcy5hZGQoMCwgIiIpOwotLy8gICAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnNldEl0ZW1zKChTdHJpbmcgW10paXRlbXMudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7Ci0vLwotLy8gICAgICAgICAgcmVmcmVzaFJlZkNvbWJvKCk7Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChldmVudC53aWRnZXQgPT0gZGVmYXVsdE9yRml4ZWRUZXh0KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHhzZEF0dHJpYnV0ZSA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSBkZWZhdWx0T3JGaXhlZFRleHQuZ2V0VGV4dCgpOwotICAgICAgRWxlbWVudCBlbGVtZW50ID0geHNkQXR0cmlidXRlLmdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBQcm9wZXJ0aWVzQ2hhbmdlQ29tbWFuZChlbGVtZW50LCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9WQUxVRSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGVTdGVwcygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH07Ci0gICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgICAgICAgaWYgKGZpeGVkQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKGVsZW1lbnQsIFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUsIG5ld1ZhbHVlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9GSVhFRCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0UHJvY2Vzc2luZygpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkRFRkFVTFRfQVRUUklCVVRFLCBuZXdWYWx1ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfREVGQVVMVCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0UHJvY2Vzc2luZygpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29tbWFuZC5zZXREZWxldGVJZkVtcHR5KHRydWUpOwotICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU2VjdGlvbigpCi0gIHsKLSAgICBpZiAobmFtZVRleHQgPT0gbnVsbCB8fCBuYW1lVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLQotICAgIFN0cmluZyBuYW1lID0gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQotICAgIC8vIHZhbGlkYXRlIGFnYWluc3QgTkNOYW1lCi0gICAgaWYgKG5hbWUubGVuZ3RoKCkgPCAxIHx8ICFYTUxDaGFyLmlzVmFsaWROQ05hbWUobmFtZSkpCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0VSUk9SX0lOVkFMSURfTkFNRSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKGNvbXBvbmVudE5hbWVDb21ibyAhPSBudWxsICYmICFjb21wb25lbnROYW1lQ29tYm8uaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5yZW1vdmVMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIHRoaXMpOwotICAgIH0KLSAgICBpZiAobmFtZVRleHQgIT0gbnVsbCAmJiAhbmFtZVRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmVtb3ZlTGlzdGVuZXJzKG5hbWVUZXh0KTsKLSAgICBpZiAodHlwZUNvbWJvICE9IG51bGwgJiYgIXR5cGVDb21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgdHlwZUNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgdHlwZUNvbWJvLnJlbW92ZUxpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgdGhpcyk7Ci0gICAgfQotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgIGluaXQoKTsKLSAgICByZWxheW91dCgpOwotICAgIAotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RBdHRyaWJ1dGUgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGlucHV0OwotICAgICAgaXNBdHRyaWJ1dGVSZWZlcmVuY2UgPSB4c2RBdHRyaWJ1dGUuaXNBdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSgpOwotICAgICAgaGlkZUh5cGVyTGluayA9ICF4c2RBdHRyaWJ1dGUuaXNHbG9iYWwoKSB8fCBpc0F0dHJpYnV0ZVJlZmVyZW5jZTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWxheW91dCgpCi0gIHsKLSAgICBDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlID0gY29tcG9zaXRlLmdldFBhcmVudCgpOwotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5zZXRSZWRyYXcoZmFsc2UpOwotCi0gICAgaWYgKHBhcmVudENvbXBvc2l0ZSAhPSBudWxsICYmICFwYXJlbnRDb21wb3NpdGUuaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudENvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgY2hpbGRyZW5baV0uZGlzcG9zZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIE5vdyBpbml0aWFsaXplIHRoZSBuZXcgaGFuZGxlcgotICAgIGNyZWF0ZUNvbnRlbnRzKHBhcmVudENvbXBvc2l0ZSk7Ci0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLmxheW91dCh0cnVlLCB0cnVlKTsKLQotICAgIC8vIE5vdyB0dXJuIHBhaW50aW5nIGJhY2sgb24KLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkuc2V0UmVkcmF3KHRydWUpOwotICAgIHJlZnJlc2goKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFJlZkNvbWJvKCkKLSAgewotICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIGZpbGxDb21wb25lbnROYW1lQ29tYm8oKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGZpbGxDb21wb25lbnROYW1lQ29tYm8oKQotICB7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RBdHRyaWJ1dGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7ICAgIAotICAgIAotICAgIGNvbXBvbmVudE5hbWVDb21iby5yZW1vdmVBbGwoKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQlJPV1NFKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9BQ1RJT05fTkVXKTsKLSAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gcXVpY2tQaWNrcyA9IG1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotICAgIGlmIChxdWlja1BpY2tzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wOyBpIDwgcXVpY2tQaWNrcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gcXVpY2tQaWNrc1tpXTsKLSAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZChjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSk7Ci0gICAgICB9ICAKLSAgICB9Ci0gICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGhpc3RvcnkgPSBtYW5hZ2VyLmdldEhpc3RvcnkoKTsKLSAgICBpZiAoaGlzdG9yeSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoaW50IGk9MDsgaSA8IGhpc3RvcnkubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9IGhpc3RvcnlbaV07Ci0gICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoY29tcG9uZW50U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpOwotICAgICAgfSAgCi0gICAgfQotICAgIAotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIG5hbWVkQ29tcG9uZW50ID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBuYW1lZENvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUpOwotICAgICAgaWYgKGF0dHJWYWx1ZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBhdHRyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZXQgPSBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKGF0dHJWYWx1ZSwgbWFuYWdlcik7Ci0gICAgICBpZiAocmV0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoYXR0clZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KGF0dHJWYWx1ZSk7Ci0gICAgICByZWZOYW1lID0gYXR0clZhbHVlOwotICAgIH0gCi0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotICB7Ci0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZWxlbWVudDsKLSAgICBwdWJsaWMgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbGFiZWwpCi0gICAgewotICAgICAgc3VwZXIoTkxTLmJpbmQob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfQUNUSU9OX0NIQU5HRSwgbGFiZWwpKTsKLSAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgICAgZG9FeGVjdXRlU3RlcHMoKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZVN0ZXBzKCkKLSAgICB7Ci0gICAgICAKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNDA5ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxDaGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0REaXJlY3RpdmVzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uU2VjdGlvbiBleHRlbmRzIFJlZmFjdG9yaW5nU2VjdGlvbgotewotICBwcm90ZWN0ZWQgVGV4dCBuYW1lVGV4dDsKLSAgcHJvdGVjdGVkIENDb21ibyByZWZDb21ibzsKLSAgYm9vbGVhbiBpc1JlZmVyZW5jZTsKLQotICBwdWJsaWMgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICBpZiAoaXNSZWZlcmVuY2UpCi0gICAgewotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBSZWYgTGFiZWwKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICAgIENMYWJlbCByZWZMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSArICI6Iik7ICAvLyROT04tTkxTLTEkCi0gICAgICByZWZMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIFJlZiBDb21ibwotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCi0gICAgICByZWZDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgICByZWZDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIHJlZkNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmVmQ29tYm8sCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQVRUUklCVVRFR1JPVVBfUkVGU19fUkVGKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gTmFtZUxhYmVsCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgICBDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FKTsKLSAgICAgIG5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIE5hbWVUZXh0Ci0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgbmFtZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgbmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgIGFwcGx5QWxsTGlzdGVuZXJzKG5hbWVUZXh0KTsKLSAgICAgIAotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuYW1lVGV4dCwKLSAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19BVFRSSUJVVEVHUk9VUF9fTkFNRSk7Ci0KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gUmVmYWN0b3IvcmVuYW1lIGh5cGVybGluayAKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgIAotICAgICAgaWYgKCFoaWRlSHlwZXJMaW5rKQotICAgICAgewotICAgICAgICBjcmVhdGVSZW5hbWVIeXBlcmxpbmsoY29tcG9zaXRlKTsKLSAgICAgICAgc2V0UmVuYW1lSHlwZXJsaW5rRW5hYmxlZCghaXNSZWZlcmVuY2UpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotCi0gICAgaWYgKGlzUmVhZE9ubHkpCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KWlucHV0OwotICAgIAotICAgIGlmIChpc1JlZmVyZW5jZSkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBuYW1lZENvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUpOwotICAgICAgICBpZiAoYXR0clZhbHVlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHJlZkNvbWJvLnNldFRleHQoYXR0clZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIHJlZnJlc2ggbmFtZQotICAgICAgbmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lZENvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lVGV4dC5zZXRUZXh0KG5hbWUpOwotICAgICAgfQotICAgIH0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7Ci0gICAgaW5pdCgpOwotICAgIHJlbGF5b3V0KCk7Ci0gICAgCi0gICAgaWYgKGlzUmVmZXJlbmNlKQotICAgIHsKLSAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgICAgTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGl0ZW1zID0gaGVscGVyLmdldEdsb2JhbEF0dHJpYnV0ZUdyb3VwcygpOwotICAgICAgaXRlbXMuYWRkKDAsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcmVmQ29tYm8uc2V0SXRlbXMoKFN0cmluZyBbXSlpdGVtcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlbGF5b3V0KCkKLSAgewotICAgIENvbXBvc2l0ZSBwYXJlbnRDb21wb3NpdGUgPSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0KLSAgICBpZiAocGFyZW50Q29tcG9zaXRlICE9IG51bGwgJiYgIXBhcmVudENvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgQ29udHJvbFtdIGNoaWxkcmVuID0gcGFyZW50Q29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBjaGlsZHJlbltpXS5kaXNwb3NlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm93IGluaXRpYWxpemUgdGhlIG5ldyBoYW5kbGVyCi0gICAgY3JlYXRlQ29udGVudHMocGFyZW50Q29tcG9zaXRlKTsKLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUsIHRydWUpOwotCi0gICAgLy8gTm93IHR1cm4gcGFpbnRpbmcgYmFjayBvbgotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5zZXRSZWRyYXcodHJ1ZSk7Ci0gICAgcmVmcmVzaCgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgewotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gZ3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIGlzUmVmZXJlbmNlID0gZ3JvdXAuaXNBdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKTsKLSAgICAgIGhpZGVIeXBlckxpbmsgPSBpc1JlZmVyZW5jZTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBzdXBlci5kb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IG5hbWVUZXh0KQotICAgIHsKLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgWFNETmFtZWRDb21wb25lbnQgbmFtZWRDb21wb25lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpIGlucHV0OwotICAgICAgICBpZiAoIXZhbGlkYXRlU2VjdGlvbigpKQotICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBhbiBhY3R1YWwgbmFtZSBjaGFuZ2UgaGFzIHRha2VuIHBsYWNlCi0gICAgICAgIFN0cmluZyBvbGROYW1lID0gbmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGROYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIGNvbW1hbmQgPSBuZXcgVXBkYXRlTmFtZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9SRU5BTUUsIG5hbWVkQ29tcG9uZW50LCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsICYmIGdldENvbW1hbmRTdGFjaygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGRvUmVmZXJlbnRpYWxJbnRlZ3JpdHlDaGVjayhuYW1lZENvbXBvbmVudCwgbmV3VmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU2VjdGlvbigpCi0gIHsKLSAgICBpZiAobmFtZVRleHQgPT0gbnVsbCB8fCBuYW1lVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLQotICAgIFN0cmluZyBuYW1lID0gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQotICAgIC8vIHZhbGlkYXRlIGFnYWluc3QgTkNOYW1lCi0gICAgaWYgKG5hbWUubGVuZ3RoKCkgPCAxIHx8ICFYTUxDaGFyLmlzVmFsaWROQ05hbWUobmFtZSkpCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLl9VSV9FUlJPUl9JTlZBTElEX05BTUUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IHJlZkNvbWJvKQotICAgIHsKLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IHJlZkNvbWJvLmdldFRleHQoKTsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBYU0ROYW1lZENvbXBvbmVudCBuYW1lZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudClpbnB1dDsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gbmFtZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpOwotCi0gICAgICAgIGlmIChuYW1lZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgWFNERGlyZWN0aXZlc01hbmFnZXIucmVtb3ZlVW51c2VkWFNESW1wb3J0cyhuYW1lZENvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIuZG9XaWRnZXRTZWxlY3RlZChlKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBpZiAobmFtZVRleHQgIT0gbnVsbCAmJiAhbmFtZVRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmVtb3ZlTGlzdGVuZXJzKG5hbWVUZXh0KTsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RDb21wbGV4VHlwZUFkdmFuY2VkU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RDb21wbGV4VHlwZUFkdmFuY2VkU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzRmOTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQ29tcGxleFR5cGVBZHZhbmNlZFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFhTRENvbXBsZXhUeXBlQWR2YW5jZWRTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9ICIiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIENDb21ibyBibG9ja0NvbWJvOwotICBwcm90ZWN0ZWQgQ0NvbWJvIGZpbmFsQ29tYm87Ci0gIHByb3RlY3RlZCBDQ29tYm8gbWl4ZWRDb21ibzsKLSAgcHJvdGVjdGVkIENDb21ibyBhYnN0cmFjdENvbWJvOwotCi0gIHByaXZhdGUgU3RyaW5nIGZpbmFsVmFsdWVzW10gPSB7IEVNUFRZLCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIC8vJE5PTi1OTFMtMSQKLSAgICAgIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcsICIjIiArIFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUcgfTsgLy8kTk9OLU5MUy0xJAotCi0gIHByaXZhdGUgU3RyaW5nIGJsb2NrVmFsdWVzW10gPSB7IEVNUFRZLCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIC8vJE5PTi1OTFMtMSQKLSAgICAgIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcsICIjIiArIFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUcgfTsgLy8kTk9OLU5MUy0xJAotCi0gIHByaXZhdGUgU3RyaW5nIGJvb2xlYW5WYWx1ZXNbXSA9IHsgRU1QVFksIFRSVUUsIEZBTFNFIH07IC8vIFRPRE8gdXNlIHNvbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dGVybmFsIHN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSBpbnN0ZWFkCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQWJzdHJhY3RMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBhYnN0cmFjdExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9BQlNUUkFDVCk7Ci0gICAgYWJzdHJhY3RMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQWJzdHJhY3RDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgYWJzdHJhY3RDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICBhYnN0cmFjdENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYWJzdHJhY3RDb21iby5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLSAgICBhYnN0cmFjdENvbWJvLnNldEl0ZW1zKGJvb2xlYW5WYWx1ZXMpOwotICAgIGFic3RyYWN0Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBCbG9ja0xhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCi0gICAgQ0xhYmVsIGJsb2NrTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0JMT0NLKTsKLSAgICBibG9ja0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBCbG9ja0NvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBibG9ja0NvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIGJsb2NrQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBibG9ja0NvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotICAgIGJsb2NrQ29tYm8uc2V0SXRlbXMoYmxvY2tWYWx1ZXMpOwotICAgIGJsb2NrQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBGaW5hbExhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCi0gICAgQ0xhYmVsIGZpbmFsTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0ZJTkFMKTsKLSAgICBmaW5hbExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBGaW5hbENvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBmaW5hbENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIGZpbmFsQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBmaW5hbENvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotICAgIGZpbmFsQ29tYm8uc2V0SXRlbXMoZmluYWxWYWx1ZXMpOwotICAgIGZpbmFsQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gTWl4ZWQgTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0KLSAgICBDTGFiZWwgbWl4ZWRMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfTUlYRUQpOwotICAgIG1peGVkTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE1peGVkIENvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBtaXhlZENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIG1peGVkQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBtaXhlZENvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotICAgIG1peGVkQ29tYm8uc2V0SXRlbXMoYm9vbGVhblZhbHVlcyk7Ci0gICAgbWl4ZWRDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGJsb2NrQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHZhbHVlID0gYmxvY2tDb21iby5nZXRUZXh0KCk7Ci0gICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoY29tcGxleFR5cGUuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuQkxPQ0tfQVRUUklCVVRFLCB2YWx1ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0JMT0NLKTsKLSAgICAgIGNvbW1hbmQuc2V0RGVsZXRlSWZFbXB0eSh0cnVlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGZpbmFsQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHZhbHVlID0gZmluYWxDb21iby5nZXRUZXh0KCk7Ci0gICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoY29tcGxleFR5cGUuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuRklOQUxfQVRUUklCVVRFLCB2YWx1ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0ZJTkFMKTsKLSAgICAgIGNvbW1hbmQuc2V0RGVsZXRlSWZFbXB0eSh0cnVlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGFic3RyYWN0Q29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHZhbHVlID0gYWJzdHJhY3RDb21iby5nZXRUZXh0KCk7Ci0gICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoY29tcGxleFR5cGUuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuQUJTVFJBQ1RfQVRUUklCVVRFLCB2YWx1ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0FCU1RSQUNUKTsKLSAgICAgIGNvbW1hbmQuc2V0RGVsZXRlSWZFbXB0eSh0cnVlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IG1peGVkQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHZhbHVlID0gbWl4ZWRDb21iby5nZXRUZXh0KCk7Ci0gICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoY29tcGxleFR5cGUuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuTUlYRURfQVRUUklCVVRFLCB2YWx1ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX01JWEVEKTsKLSAgICAgIGNvbW1hbmQuc2V0RGVsZXRlSWZFbXB0eSh0cnVlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIGVuYWJsZWQgPSB0cnVlOyAKLSAgICAgICAgaWYgKGNvbXBsZXhUeXBlLmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgICAgICB7Ci0gICAgICAgICAgZW5hYmxlZCA9ICFpc1JlYWRPbmx5OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGNvbXBsZXhUeXBlLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJMT0NLX0FUVFJJQlVURSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgYmxvY2tBdHRWYWx1ZSA9IGNvbXBsZXhUeXBlLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJMT0NLX0FUVFJJQlVURSk7Ci0gICAgICAgICAgYmxvY2tDb21iby5zZXRUZXh0KGJsb2NrQXR0VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGJsb2NrQ29tYm8uc2V0VGV4dChFTVBUWSk7Ci0gICAgICAgIH0KLSAgICAgICAgYmxvY2tDb21iby5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0gICAgICAgIGlmIChjb21wbGV4VHlwZS5nZXRFbGVtZW50KCkuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5GSU5BTF9BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgIAlTdHJpbmcgZmluYWxBdHRWYWx1ZSA9IGNvbXBsZXhUeXBlLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJTkFMX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICBmaW5hbENvbWJvLnNldFRleHQoZmluYWxBdHRWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZmluYWxDb21iby5zZXRUZXh0KEVNUFRZKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbENvbWJvLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLSAgICAgICAgaWYgKGNvbXBsZXhUeXBlLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkFCU1RSQUNUX0FUVFJJQlVURSkpCi0gICAgICAgIHsKLSAgICAgICAgICBib29sZWFuIGFic0F0dFZhbHVlID0gY29tcGxleFR5cGUuaXNBYnN0cmFjdCgpOwotICAgICAgICAgIGlmIChhYnNBdHRWYWx1ZSkKLSAgICAgICAgICAgIGFic3RyYWN0Q29tYm8uc2V0VGV4dChUUlVFKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBhYnN0cmFjdENvbWJvLnNldFRleHQoRkFMU0UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGFic3RyYWN0Q29tYm8uc2V0VGV4dChFTVBUWSk7Ci0gICAgICAgIH0KLSAgICAgICAgYWJzdHJhY3RDb21iby5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICAKLSAgICAgICAgaWYgKGNvbXBsZXhUeXBlLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1JWEVEX0FUVFJJQlVURSkpCi0gICAgICAgIHsKLSAgICAgICAgICBib29sZWFuIG1peGVkVmFsdWUgPSBjb21wbGV4VHlwZS5pc01peGVkKCk7Ci0gICAgICAgICAgaWYgKG1peGVkVmFsdWUpCi0gICAgICAgICAgICBtaXhlZENvbWJvLnNldFRleHQoVFJVRSk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgbWl4ZWRDb21iby5zZXRUZXh0KEZBTFNFKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBtaXhlZENvbWJvLnNldFRleHQoRU1QVFkpOwotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRENvbXBsZXhUeXBlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RDb21wbGV4VHlwZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U4ZmVjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRENvbXBsZXhUeXBlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxDaGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlQ29tcGxleFR5cGVEZXJpdmF0aW9uQnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlTmFtZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNEQ29tcGxleFR5cGVCYXNlVHlwZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRERlcml2YXRpb25NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFhTRENvbXBsZXhUeXBlU2VjdGlvbiBleHRlbmRzIFJlZmFjdG9yaW5nU2VjdGlvbiBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBUZXh0IG5hbWVUZXh0OwotICBwcm90ZWN0ZWQgQ0NvbWJvIGJhc2VUeXBlQ29tYm87Ci0gIHByb3RlY3RlZCBDQ29tYm8gZGVyaXZlZEJ5Q29tYm87Ci0gIHByaXZhdGUgU3RyaW5nIGRlcml2ZWRCeUNob2ljZXNDb21ib1ZhbHVlc1tdID0geyAiIiwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHIH07IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgWFNEQ29tcGxleFR5cGVTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udGVudHMgb2YgdGhlIHByb3BlcnR5IHRhYgotICAgKiAKLSAgICogTmFtZUxhYmVsIE5hbWVUZXh0IER1bW15TGFiZWwgQmFzZVR5cGVMYWJlbCBCYXNlVHlwZUNvbWJvIEJhc2VUeXBlQnV0dG9uCi0gICAqIERlcml2ZWRCeUxhYmVsIERlcml2ZWRCeUNvbWJvCi0gICAqLwotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5hbWVMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLlVJX0xBQkVMX05BTUUpOwotICAgIG5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gTmFtZVRleHQKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIG5hbWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGFwcGx5QWxsTGlzdGVuZXJzKG5hbWVUZXh0KTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5hbWVUZXh0LAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19DT01QTEVYX1RZUEVfX05BTUUpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUmVmYWN0b3IvcmVuYW1lIGh5cGVybGluayAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBjcmVhdGVSZW5hbWVIeXBlcmxpbmsoY29tcG9zaXRlKTsKLSAgICAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBCYXNlVHlwZUxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuVUlfTEFCRUxfSU5IRVJJVF9GUk9NKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQmFzZVR5cGVDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICBiYXNlVHlwZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIGJhc2VUeXBlQ29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotICAgIGJhc2VUeXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBiYXNlVHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGJhc2VUeXBlQ29tYm8uYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCB0aGlzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGJhc2VUeXBlQ29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0NPTVBMRVhfVFlQRV9fSU5IRVJJVF9GUk9NKTsKLQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gU3BhY2VyIGxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIERlcml2ZWRCeUxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCi0gICAgQ0xhYmVsIGRlcml2ZWRCeUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLlVJX0xBQkVMX0lOSEVSSVRfQlkpOyAvLyROT04tTkxTLTEkCi0gICAgZGVyaXZlZEJ5TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIERlcml2ZWRCeUNvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgIGRlcml2ZWRCeUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICBkZXJpdmVkQnlDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGRlcml2ZWRCeUNvbWJvLnNldEl0ZW1zKGRlcml2ZWRCeUNob2ljZXNDb21ib1ZhbHVlcyk7Ci0gICAgZGVyaXZlZEJ5Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkZXJpdmVkQnlDb21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQ09NUExFWF9UWVBFX19JTkhFUklUX0JZKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFNwYWNlciBsYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2goKTsKLSAgICBpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLQotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgc2hvd0xpbmsoIWhpZGVIeXBlckxpbmspOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgbmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGJhc2VUeXBlQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGZpbGxUeXBlc0NvbWJvKCk7Ci0KLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gY29tcGxleFR5cGUuZ2V0TmFtZSgpOwotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGJvb2xlYW4gaXNBbm9ueW1vdXNUeXBlID0gbmFtZS5lcXVhbHMoIiIpID8gdHJ1ZSA6IGZhbHNlOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChpc0Fub255bW91c1R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lVGV4dC5zZXRUZXh0KCIqKmFub255bW91cyoqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBuYW1lVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZVRleHQuc2V0VGV4dChuYW1lKTsKLSAgICAgICAgICBuYW1lVGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlRGVmaW5pdGlvbiA9IGNvbXBsZXhUeXBlLmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICBTdHJpbmcgYmFzZVR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoYmFzZVR5cGVEZWZpbml0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBiYXNlVHlwZSA9IGJhc2VUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCk7Ci0gICAgICAgICAgaWYgKGJhc2VUeXBlID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgYmFzZVR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoImFueVR5cGUiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBiYXNlVHlwZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJhc2VUeXBlQ29tYm8uc2V0VGV4dChiYXNlVHlwZSk7Ci0KLSAgICAgICAgZGVyaXZlZEJ5Q29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW50IGRlcml2YXRpb25NZXRob2QgPSBjb21wbGV4VHlwZS5nZXREZXJpdmF0aW9uTWV0aG9kKCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgWFNERE9NSGVscGVyIGRvbUhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICAgICAgaWYoZG9tSGVscGVyLmdldERlcml2ZWRCeUVsZW1lbnRGcm9tQ29tcGxleFR5cGUoY29tcGxleFR5cGUuZ2V0RWxlbWVudCgpKSAhPSBudWxsKSB7Ci0JICAgICAgICBpZiAoZGVyaXZhdGlvbk1ldGhvZCA9PSBYU0REZXJpdmF0aW9uTWV0aG9kLkVYVEVOU0lPTikKLQkgICAgICAgIHsKLQkgICAgICAgICAgZGVyaXZlZEJ5Q29tYm8uc2V0VGV4dChYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGVsc2UgaWYgKGRlcml2YXRpb25NZXRob2QgPT0gWFNERGVyaXZhdGlvbk1ldGhvZC5SRVNUUklDVElPTikKLQkgICAgICAgIHsKLQkgICAgICAgICAgZGVyaXZlZEJ5Q29tYm8uc2V0VGV4dChYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcpOwotCSAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb1dpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGJhc2VUeXBlQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IGJhc2VUeXBlQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgaWYgKHNob3VsZFBlcmZvcm1Db21ib1NlbGVjdGlvbihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgc2VsZWN0aW9uKSkKLSAgICAgICAgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKGUpOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgIGhhbmRsZVdpZGdldFNlbGVjdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gYmFzZVR5cGVDb21ibykKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gYmFzZVR5cGVDb21iby5nZXRUZXh0KCk7Ci0gICAgICBpZiAoc2hvdWxkUGVyZm9ybUNvbWJvU2VsZWN0aW9uKFNXVC5TZWxlY3Rpb24sIHNlbGVjdGlvbikpCi0gICAgICAgIGhhbmRsZVdpZGdldFNlbGVjdGlvbihlKTsKLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZSk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gYmFzZVR5cGVDb21ibykKLSAgICB7Ci0gICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgIGlmIChlZGl0b3IgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXIuY2xhc3MpOwotCi0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gYmFzZVR5cGVDb21iby5nZXRUZXh0KCk7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIG5ld1ZhbHVlOwotICAgICAgSUNvbXBvbmVudERpYWxvZyBkaWFsb2c9IG51bGw7Ci0gICAgICBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0NPTUJPX0JST1dTRSkpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggc2VsZWN0aW9uLmVxdWFscyhNZXNzYWdlcy5fVUlfQ09NQk9fTkVXKSkKLSAgICAgIHsKLSAgICAgICAgZGlhbG9nID0gbWFuYWdlci5nZXROZXdEaWFsb2coKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRpYWxvZyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdWYWx1ZSA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbXBvbmVudCgpOwotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGlucHV0LCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmVmcmVzaCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGRlcml2ZWRCeUNvbWJvKQotICAgIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIGlucHV0OwotICAgICAgU3RyaW5nIHZhbHVlID0gZGVyaXZlZEJ5Q29tYm8uZ2V0VGV4dCgpOwotICAgICAgQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUNvbXBsZXhUeXBlRGVyaXZhdGlvbkJ5KGNvbXBsZXhUeXBlLCB2YWx1ZSk7Ci0KLSAgICAgIGlmIChnZXRDb21tYW5kU3RhY2soKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5kb1dpZGdldFNlbGVjdGVkKGUpOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICAgIGlmIChiYXNlVHlwZUNvbWJvICE9IG51bGwgJiYgIWJhc2VUeXBlQ29tYm8uaXNEaXNwb3NlZCgpKQotICAgICAgYmFzZVR5cGVDb21iby5yZW1vdmVMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIHRoaXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIGlmIChldmVudC50eXBlID09IFNXVC5UcmF2ZXJzZSkgewotICAgICAgaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfQVJST1dfTkVYVCB8fCBldmVudC5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0FSUk9XX1BSRVZJT1VTKSB7Ci0gICAgICAgIGlzVHJhdmVyc2luZyA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIuZG9IYW5kbGVFdmVudChldmVudCk7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBuYW1lVGV4dCkKLSAgICB7Ci0gICAgICBpZiAoIW5hbWVUZXh0LmdldEVkaXRhYmxlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBYU0ROYW1lZENvbXBvbmVudCBuYW1lZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudCkgaW5wdXQ7Ci0KLSAgICAgICAgaWYgKCF2YWxpZGF0ZVNlY3Rpb24oKSkKLSAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgYW4gYWN0dWFsIG5hbWUgY2hhbmdlIGhhcyB0YWtlbiBwbGFjZQotICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWVkQ29tcG9uZW50LmdldE5hbWUoKTsKLSAgICAgICAgaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb21tYW5kID0gbmV3IFVwZGF0ZU5hbWVDb21tYW5kKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0FDVElPTl9SRU5BTUUsIG5hbWVkQ29tcG9uZW50LCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsICYmIGdldENvbW1hbmRTdGFjaygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGRvUmVmZXJlbnRpYWxJbnRlZ3JpdHlDaGVjayhuYW1lZENvbXBvbmVudCwgbmV3VmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU2VjdGlvbigpCi0gIHsKLSAgICBpZiAobmFtZVRleHQgPT0gbnVsbCB8fCBuYW1lVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLQotICAgIFN0cmluZyBuYW1lID0gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQotICAgIC8vIHZhbGlkYXRlIGFnYWluc3QgTkNOYW1lCi0gICAgaWYgKG5hbWUubGVuZ3RoKCkgPCAxIHx8ICFYTUxDaGFyLmlzVmFsaWROQ05hbWUobmFtZSkpCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0VSUk9SX0lOVkFMSURfTkFNRSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgCVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIGlucHV0OwotICAgICAgaGlkZUh5cGVyTGluayA9ICEoY29tcGxleFR5cGUuZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWEpOwotICAgICAgCi0gICAgfSAgICAKLSAgICAKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBmaWxsVHlwZXNDb21ibygpCi0gIHsKLSAgICBiYXNlVHlwZUNvbWJvLnJlbW92ZUFsbCgpOwotICAgIGJhc2VUeXBlQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9DT01CT19CUk9XU0UpOwotICAgIGJhc2VUeXBlQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9DT01CT19ORVcpOwotICAgIC8vIEFkZCB0aGUgY3VycmVudCBUeXBlIG9mIHRoaXMgYXR0cmlidXRlIGlmIG5lZWRlZAotICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIGlucHV0OwotICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlID0gY29tcGxleFR5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiBiYXNlVHlwZS5nZXRRTmFtZSgpICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGN1cnJlbnRUeXBlTmFtZSA9IGJhc2VUeXBlLmdldFFOYW1lKHhzZFNjaGVtYSk7IC8vbm8gcHJlZml4Ci0gICAgICBpZiAoY3VycmVudFR5cGVOYW1lICE9IG51bGwgJiYgIWN1cnJlbnRUeXBlTmFtZS5lcXVhbHMoImFueVR5cGUiKSkKLSAgICAgICAgYmFzZVR5cGVDb21iby5hZGQoY3VycmVudFR5cGVOYW1lKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERWxlbWVudERlY2xhcmF0aW9uQWR2YW5jZWRTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREVsZW1lbnREZWNsYXJhdGlvbkFkdmFuY2VkU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmM2YWE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERWxlbWVudERlY2xhcmF0aW9uQWR2YW5jZWRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBhZGRlZCBuaWxsYWJsZSBhZHZhbmNlZCB0YWIgb3B0aW9uLCBidWcgMjA5MzU2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNEU3Vic3RpdHV0aW9uR3JvdXBFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFbGVtZW50RGVjbGFyYXRpb25BZHZhbmNlZFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgQ0NvbWJvIGJsb2NrQ29tYm87Ci0gIHByb3RlY3RlZCBDQ29tYm8gZmluYWxDb21ibzsKLSAgcHJvdGVjdGVkIENDb21ibyBhYnN0cmFjdENvbWJvOwotICBwcm90ZWN0ZWQgQ0NvbWJvIHN1YnN0R3JvdXBDb21ibzsKLSAgcHJvdGVjdGVkIENDb21ibyBuaWxsYWJsZUNvbWJvOwotCi0gIHByaXZhdGUgU3RyaW5nIGJsb2NrVmFsdWVzW10gPSB7IEVNUFRZLCAiIyIgKyBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHLCAvLyROT04tTkxTLTEkCi0gICAgICBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsCi0gICAgICAic3Vic3RpdHV0aW9uIiB9OyAvLyROT04tTkxTLTEkCi0KLSAgcHJpdmF0ZSBTdHJpbmcgZmluYWxWYWx1ZXNbXSA9IHsgRU1QVFksICIjIiArIFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcsIC8vJE5PTi1OTFMtMSQKLSAgICAgIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRyB9OyAvLyROT04tTkxTLTEkCi0KLSAgcHJpdmF0ZSBTdHJpbmcgYm9vbGVhblZhbHVlc1tdID0geyBFTVBUWSwgVFJVRSwgRkFMU0UgfTsgCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBBYnN0cmFjdExhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCi0gICAgQ0xhYmVsIGFic3RyYWN0TGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfQUJTVFJBQ1QpOwotICAgIGFic3RyYWN0TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEFic3RyYWN0Q29tYm8KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGFic3RyYWN0Q29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgYWJzdHJhY3RDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGFic3RyYWN0Q29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotCi0gICAgYWJzdHJhY3RDb21iby5zZXRJdGVtcyhib29sZWFuVmFsdWVzKTsKLSAgICBhYnN0cmFjdENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQmxvY2tMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBibG9ja0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX0JMT0NLKTsKLSAgICBibG9ja0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBCbG9ja0NvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBibG9ja0NvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIGJsb2NrQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBibG9ja0NvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotICAgIGJsb2NrQ29tYm8uc2V0SXRlbXMoYmxvY2tWYWx1ZXMpOwotICAgIGJsb2NrQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBGaW5hbExhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCi0gICAgQ0xhYmVsIGZpbmFsTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfRklOQUwpOwotICAgIGZpbmFsTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEZpbmFsQ29tYm8KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGZpbmFsQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgZmluYWxDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGZpbmFsQ29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotCi0gICAgZmluYWxDb21iby5zZXRJdGVtcyhmaW5hbFZhbHVlcyk7Ci0gICAgZmluYWxDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFN1YnN0aXR1dGlvbiBHcm91cCBMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBzdWJHcm91cExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX1NVQlNUSVRVVElPTl9HUk9VUCk7Ci0gICAgc3ViR3JvdXBMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gU3Vic3RpdHV0aW9uIEdyb3VwIENvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBzdWJzdEdyb3VwQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgc3Vic3RHcm91cENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgc3Vic3RHcm91cENvbWJvLnNldEVkaXRhYmxlKHRydWUpOwotICAgIHN1YnN0R3JvdXBDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBzdWJzdEdyb3VwQ29tYm8uYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCB0aGlzKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyhzdWJzdEdyb3VwQ29tYm8pOwotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5pbGxhYmxlIExhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCi0gICAgQ0xhYmVsIG5pbGxhYmxlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfTklMTEFCTEUpOwotICAgIG5pbGxhYmxlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5pbGxhYmxlQ29tYm8KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIG5pbGxhYmxlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgbmlsbGFibGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIG5pbGxhYmxlQ29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotCi0gICAgbmlsbGFibGVDb21iby5zZXRJdGVtcyhib29sZWFuVmFsdWVzKTsKLSAgICBuaWxsYWJsZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IHN1YnN0R3JvdXBDb21ibykKLSAgICB7Ci0gICAgICBpZiAoZS50eXBlID09IFNXVC5UcmF2ZXJzZSkgewotICAgICAgICBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0FSUk9XX05FWFQgfHwgZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0FSUk9XX1BSRVZJT1VTKQotICAgICAgICB7Ci0gICAgICAgICAgaXNUcmF2ZXJzaW5nID0gdHJ1ZTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLQkJCi0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlRGVjID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBzdWJzdEdyb3VwQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgU3RyaW5nIG9sZFZhbHVlID0gZWxlRGVjLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURSk7Ci0gICAgICBpZiAob2xkVmFsdWUgPT0gbnVsbCkKLSAgICAgICAgb2xkVmFsdWUgPSBFTVBUWTsKLSAgICAgIGlmICh2YWx1ZS5lcXVhbHMob2xkVmFsdWUpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChlbGVEZWMuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuU1VCU1RJVFVUSU9OR1JPVVBfQVRUUklCVVRFLCB2YWx1ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfU1VCU1RJVFVUSU9OX0dST1VQKTsKLSAgICAgIGNvbW1hbmQuc2V0RGVsZXRlSWZFbXB0eSh0cnVlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBzdWJzdEdyb3VwQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IHN1YnN0R3JvdXBDb21iby5nZXRUZXh0KCk7Ci0gICAgICBpZiAoc2hvdWxkUGVyZm9ybUNvbWJvU2VsZWN0aW9uKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBzZWxlY3Rpb24pKQotICAgICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZSk7Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKGUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBzdWJzdEdyb3VwQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IHN1YnN0R3JvdXBDb21iby5nZXRUZXh0KCk7Ci0gICAgICBpZiAoc2hvdWxkUGVyZm9ybUNvbWJvU2VsZWN0aW9uKFNXVC5TZWxlY3Rpb24sIHNlbGVjdGlvbikpCi0gICAgICAgIGhhbmRsZVdpZGdldFNlbGVjdGlvbihlKTsKLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVdpZGdldFNlbGVjdGlvbihTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGJsb2NrQ29tYm8pCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZURlYyA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGlucHV0OwotICAgICAgU3RyaW5nIHZhbHVlID0gYmxvY2tDb21iby5nZXRUZXh0KCk7Ci0KLSAgICAgIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChlbGVEZWMuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuQkxPQ0tfQVRUUklCVVRFLCB2YWx1ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfQkxPQ0spOwotICAgICAgY29tbWFuZC5zZXREZWxldGVJZkVtcHR5KHRydWUpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZmluYWxDb21ibykKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlRGVjID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBmaW5hbENvbWJvLmdldFRleHQoKTsKLQotICAgICAgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKGVsZURlYy5nZXRFbGVtZW50KCksIFhTRENvbnN0YW50cy5GSU5BTF9BVFRSSUJVVEUsIHZhbHVlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9GSU5BTCk7Ci0gICAgICBjb21tYW5kLnNldERlbGV0ZUlmRW1wdHkodHJ1ZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBhYnN0cmFjdENvbWJvKQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVEZWMgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IGFic3RyYWN0Q29tYm8uZ2V0VGV4dCgpOwotICAgICAgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKGVsZURlYy5nZXRFbGVtZW50KCksIFhTRENvbnN0YW50cy5BQlNUUkFDVF9BVFRSSUJVVEUsIHZhbHVlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9BQlNUUkFDVCk7Ci0gICAgICBjb21tYW5kLnNldERlbGV0ZUlmRW1wdHkodHJ1ZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBzdWJzdEdyb3VwQ29tYm8pCi0gICAgewotICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICBpZiAoZWRpdG9yID09IG51bGwpIHJldHVybjsKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEU3Vic3RpdHV0aW9uR3JvdXBFZGl0TWFuYWdlci5jbGFzcyk7Ci0KLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBzdWJzdEdyb3VwQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBuZXdWYWx1ZTsKLSAgICAgIElDb21wb25lbnREaWFsb2cgZGlhbG9nPSBudWxsOwotICAgICAgaWYgKCBzZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9DT01CT19CUk9XU0UpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldEJyb3dzZURpYWxvZygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0NPTUJPX05FVykpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0TmV3RGlhbG9nKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShpbnB1dCwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHN1YnN0R3JvdXBDb21iby5zZXRUZXh0KCIiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSAvL3VzZSB0aGUgdmFsdWUgZnJvbSBzZWxlY3RlZCBxdWlja1BpY2sgaXRlbQotICAgICAgewotICAgICAgICBuZXdWYWx1ZSA9IGdldENvbXBvbmVudFNwZWNGcm9tUXVpY2tQaWNrRm9yVmFsdWUoc2VsZWN0aW9uLCBtYW5hZ2VyKTsKLSAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpCi0gICAgICAgICAgbWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoaW5wdXQsIG5ld1ZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gbmlsbGFibGVDb21ibykKLSAgICB7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVEZWMgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gbmlsbGFibGVDb21iby5nZXRUZXh0KCk7Ci0KLSAgICAgICAgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKGVsZURlYy5nZXRFbGVtZW50KCksIFhTRENvbnN0YW50cy5OSUxMQUJMRV9BVFRSSUJVVEUsIHZhbHVlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9OSUxMQUJMRSk7Ci0gICAgICAgIGNvbW1hbmQuc2V0RGVsZXRlSWZFbXB0eSh0cnVlKTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2goKTsKLSAgICBmaWxsU3Vic3RpdHV0aW9uR3JvdXBDb21ibygpOwotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlRGVjID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQ7Ci0KLSAgICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQoIWlzUmVhZE9ubHkpOwotICAgICAgICBpZiAoZWxlRGVjLmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hKSAvLyBnbG9iYWwgZWxlbWVudAotICAgICAgICB7Ci0gICAgICAgICAgYWJzdHJhY3RDb21iby5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIGZpbmFsQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICBzdWJzdEdyb3VwQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICBuaWxsYWJsZUNvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYWJzdHJhY3RDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICBmaW5hbENvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgIHN1YnN0R3JvdXBDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBOaWxsYWJsZSB3aGVuIHVzZWQgaW4gYSBsb2NhbCBlbGVtZW50IGRlY2xhcmF0aW9uIGNhbid0IGJlIHNldCBvbgotICAgICAgICAgIC8vIG9uIGVsZW1lbnRzIHRoYXQgdXNlIEByZWYuCi0gICAgICAgCSAgbmlsbGFibGVDb21iby5zZXRFbmFibGVkKCFlbGVEZWMuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBlbGVEZWMuZ2V0RWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5CTE9DS19BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGJsb2NrQXR0VmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuQkxPQ0tfQVRUUklCVVRFKTsKLSAgICAgICAgICBibG9ja0NvbWJvLnNldFRleHQoYmxvY2tBdHRWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYmxvY2tDb21iby5zZXRUZXh0KEVNUFRZKTsKLSAgICAgICAgfQotICAgICAgICAvLyBXZSBzaG91bGQgc2hvdyB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSByZWdhcmRsZXNzIGlmIGl0IGlzIGludmFsaWQKLSAgICAgICAgLy8gaWUuIGFzIHRoZSB1c2VyIHN0YXJ0cyB0eXBpbmcgJ3RydWUnIGluIHRoZSBzb3VyY2UsIHRoZSBwcm9wZXJ0aWVzIHZpZXcKLSAgICAgICAgLy8gc2hvdWxkIHNob3cgdGhlIHZhbHVlIGR5bmFtaWNhbGx5Ci0gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTklMTEFCTEVfQVRUUklCVVRFKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTklMTEFCTEVfQVRUUklCVVRFKTsKLSAgICAgICAgICBuaWxsYWJsZUNvbWJvLnNldFRleHQoYXR0clZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuaWxsYWJsZUNvbWJvLnNldFRleHQoRU1QVFkpOwotICAgICAgICB9Ci0gIAotICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJTkFMX0FUVFJJQlVURSkpCi0gICAgICAgIHsKLSAgICAgICAgCVN0cmluZyBmaW5hbEF0dFZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJTkFMX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICBmaW5hbENvbWJvLnNldFRleHQoZmluYWxBdHRWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZmluYWxDb21iby5zZXRUZXh0KEVNUFRZKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuQUJTVFJBQ1RfQVRUUklCVVRFKSkKLSAgICAgICAgewotICAgICAgICAgIGFic3RyYWN0Q29tYm8uc2V0VGV4dChlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuQUJTVFJBQ1RfQVRUUklCVVRFKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGFic3RyYWN0Q29tYm8uc2V0VGV4dChFTVBUWSk7Ci0KLSAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgc3Vic3RHcm91cENvbWJvLnNldFRleHQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHN1YnN0R3JvdXBDb21iby5zZXRUZXh0KEVNUFRZKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBmaWxsU3Vic3RpdHV0aW9uR3JvdXBDb21ibygpCi0gIHsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTRFN1YnN0aXR1dGlvbkdyb3VwRWRpdE1hbmFnZXIuY2xhc3MpOwotICAgIGlmIChtYW5hZ2VyICE9IG51bGwpCi0gICAgewotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGl0ZW1zID0gbWFuYWdlci5nZXRRdWlja1BpY2tzKCk7Ci0KLSAgICAgIHN1YnN0R3JvdXBDb21iby5yZW1vdmVBbGwoKTsKLSAgICAgIHN1YnN0R3JvdXBDb21iby5hZGQoTWVzc2FnZXMuX1VJX0NPTUJPX0JST1dTRSk7Ci0gICAgICBzdWJzdEdyb3VwQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9DT01CT19ORVcpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgc3Vic3RHcm91cENvbWJvLmFkZChpdGVtc1tpXS5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgLy8gQWRkIHRoZSBjdXJyZW50IHN1YnN0aXR1dGlvbiBncm91cCBpZiBuZWVkZWQKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBuYW1lZENvbXBvbmVudCA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dCkuZ2V0U3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbigpOwotICAgICAgaWYgKG5hbWVkQ29tcG9uZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmV0ID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShuYW1lZENvbXBvbmVudC5nZXROYW1lKCksIG1hbmFnZXIpOwotICAgICAgICBpZiAocmV0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzdWJzdEdyb3VwQ29tYm8uYWRkKG5hbWVkQ29tcG9uZW50LmdldFFOYW1lKHhzZFNjaGVtYSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIENvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShTdHJpbmcgdmFsdWUsIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyKQotICB7Ci0gICAgaWYgKGVkaXRNYW5hZ2VyICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gcXVpY2tQaWNrcyA9IGVkaXRNYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLSAgICAgIGlmIChxdWlja1BpY2tzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHF1aWNrUGlja3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBxdWlja1BpY2tzW2ldOwotICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFNwZWNpZmljYXRpb247Ci0gICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAJaWYgKHN1YnN0R3JvdXBDb21ibyAhPSBudWxsICYmICFzdWJzdEdyb3VwQ29tYm8uaXNEaXNwb3NlZCgpKQotICAJewotCQlzdWJzdEdyb3VwQ29tYm8ucmVtb3ZlTGlzdGVuZXIoU1dULlRyYXZlcnNlLCB0aGlzKTsKLQl9Ci0Jc3VwZXIuZGlzcG9zZSgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERWxlbWVudERlY2xhcmF0aW9uU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RFbGVtZW50RGVjbGFyYXRpb25TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMjIzZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RFbGVtZW50RGVjbGFyYXRpb25TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlhNTENoYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlTmFtZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLk5ld1R5cGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoLlhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTREVsZW1lbnREZWNsYXJhdGlvblNlY3Rpb24gZXh0ZW5kcyBNdWx0aXBsaWNpdHlTZWN0aW9uCi17Ci0gIHByb3RlY3RlZCBUZXh0IG5hbWVUZXh0OwotICBwcm90ZWN0ZWQgQ0NvbWJvIHR5cGVDb21ibzsKLSAgcHJvdGVjdGVkIENDb21ibyBjb21wb25lbnROYW1lQ29tYm87Ci0gIGJvb2xlYW4gaXNFbGVtZW50UmVmZXJlbmNlOwotICBwcm90ZWN0ZWQgU3RyaW5nIHR5cGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICBwcml2YXRlIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uOwotCi0gIHB1YmxpYyBYU0RFbGVtZW50RGVjbGFyYXRpb25TZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udGVudHMgb2YgdGhlIHByb3BlcnR5IHRhYgotICAgKi8KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotICAgIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLSAgICBTdHJpbmcgdHlwZUxhYmVsID0gTWVzc2FnZXMuVUlfTEFCRUxfVFlQRTsgLy8kTk9OLU5MUy0xJAotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gTmFtZUxhYmVsCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICAgIENMYWJlbCBuYW1lTGFiZWwgPSBmYWN0b3J5LmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX05BTUUpOwotICAgICAgbmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gTmFtZVRleHQKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBuYW1lVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBuYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgbmFtZVRleHQuc2V0RW5hYmxlZCghaXNFbGVtZW50UmVmZXJlbmNlKTsKLSAgICAgIGFwcGx5QWxsTGlzdGVuZXJzKG5hbWVUZXh0KTsgICAKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmFtZVRleHQsCi0gICAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19FTEVNRU5UX19OQU1FKTsKLSAgICAgCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIFJlZmFjdG9yL3JlbmFtZSBoeXBlcmxpbmsgCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIGlmICghaGlkZUh5cGVyTGluaykKLSAgICAgIHsKLSAgICAgICAgY3JlYXRlUmVuYW1lSHlwZXJsaW5rKGNvbXBvc2l0ZSk7Ci0gICAgICAgIHNldFJlbmFtZUh5cGVybGlua0VuYWJsZWQoIWlzRWxlbWVudFJlZmVyZW5jZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7Ci0gICAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBSZWYgTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBpZiAoaXNFbGVtZW50UmVmZXJlbmNlKQotICAgIHsKLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgICBDTGFiZWwgcmVmTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfUkVGRVJFTkNFKTsKLSAgICAgIHJlZkxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gUmVmIENvbWJvCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICAgIGNvbXBvbmVudE5hbWVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCB0aGlzKTsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvbmVudE5hbWVDb21ibywKLSAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19FTEVNRU5UX19SRUZFUkVOQ0UpOwotCi0gICAgICAvLyBkdW1teQotICAgICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHR5cGVMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCB0eXBlTGFiZWwpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gdHlwZUNvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgIHR5cGVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsgLy8kTk9OLU5MUy0xJAotICAgIHR5cGVDb21iby5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgdHlwZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgdHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIHR5cGVDb21iby5hZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIHRoaXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodHlwZUNvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19FTEVNRU5UX19UWVBFKTsKLSAgICAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBEdW1teUxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIG1pbiBwcm9wZXJ0eQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLlVJX0xBQkVMX01JTk9DQ1VSUyk7Ci0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCi0gICAgbWluQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIG1pbkNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgbWluQ29tYm8uYWRkKCIwIik7IC8vJE5PTi1OTFMtMSQKLSAgICBtaW5Db21iby5hZGQoIjEiKTsgLy8kTk9OLU5MUy0xJAotICAgIGFwcGx5QWxsTGlzdGVuZXJzKG1pbkNvbWJvKTsKLSAgICBtaW5Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG1pbkNvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19FTEVNRU5UX19NSU5fT0NDVVJFTkNFKTsgICAgCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBEdW1teUxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIG1heCBwcm9wZXJ0eQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5VSV9MQUJFTF9NQVhPQ0NVUlMpOwotCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgIG1heENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICBtYXhDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIG1heENvbWJvLmFkZCgiMCIpOyAvLyROT04tTkxTLTEkCi0gICAgbWF4Q29tYm8uYWRkKCIxIik7IC8vJE5PTi1OTFMtMSQKLSAgICBtYXhDb21iby5hZGQoInVuYm91bmRlZCIpOyAvLyROT04tTkxTLTEkCi0gICAgYXBwbHlBbGxMaXN0ZW5lcnMobWF4Q29tYm8pOwotICAgIG1heENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWF4Q29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0VMRU1FTlRfX01BWF9PQ0NVUkVOQ0UpOyAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgIGluaXQoKTsKLSAgICByZWxheW91dCgpOwotICAgIAotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGlucHV0OwotICAgICAgaXNFbGVtZW50UmVmZXJlbmNlID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCk7Ci0KLSAgICAgIGhpZGVIeXBlckxpbmsgPSAheHNkRWxlbWVudERlY2xhcmF0aW9uLmlzR2xvYmFsKCkgfHwgaXNFbGVtZW50UmVmZXJlbmNlOwotICAgICAgdHlwZURlZmluaXRpb24gPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGZpbGxUeXBlc0NvbWJvKCkKLSAgewotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsKLSAgICBpZiAobWFuYWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotCi0gICAgICB0eXBlQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICB0eXBlQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9DT01CT19CUk9XU0UpOwotICAgICAgdHlwZUNvbWJvLmFkZChNZXNzYWdlcy5fVUlfQ09NQk9fTkVXKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHR5cGVDb21iby5hZGQoaXRlbXNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIC8vIEFkZCB0aGUgY3VycmVudCBUeXBlIG9mIHRoaXMgZWxlbWVudCBpZiBuZWVkZWQKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBuYW1lZENvbXBvbmVudCA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dCkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gbmFtZWRDb21wb25lbnQuZ2V0VHlwZSgpOwotICAgICAgaWYgKHRkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50VHlwZU5hbWUgPSB0ZC5nZXRRTmFtZSh4c2RTY2hlbWEpOwotICAgICAgICBpZiAoY3VycmVudFR5cGVOYW1lID09IG51bGwpIC8vIGFub255bW91cyB0eXBlCi0gICAgICAgICAgY3VycmVudFR5cGVOYW1lID0gIioqQW5vbnltb3VzKioiOwotICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJldCA9IGdldENvbXBvbmVudFNwZWNGcm9tUXVpY2tQaWNrRm9yVmFsdWUoY3VycmVudFR5cGVOYW1lLCBtYW5hZ2VyKTsKLSAgICAgICAgaWYgKHJldCA9PSBudWxsICYmIGN1cnJlbnRUeXBlTmFtZSAhPSBudWxsKSAvLyBub3QgaW4gcXVpY2tQaWNrCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlQ29tYm8uYWRkKGN1cnJlbnRUeXBlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKFN0cmluZyB2YWx1ZSwgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZWRpdE1hbmFnZXIpCi0gIHsKLSAgICBpZiAoZWRpdE1hbmFnZXIgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBxdWlja1BpY2tzID0gZWRpdE1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotICAgICAgaWYgKHF1aWNrUGlja3MgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgcXVpY2tQaWNrcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9IHF1aWNrUGlja3NbaV07Ci0gICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotICAgIHN1cGVyLnJlZnJlc2goKTsKLQotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24gPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQpLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCk7Ci0KLSAgICAvLyByZWZyZXNoIG5hbWUKLSAgICBuYW1lVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIHR5cGVDb21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBuYW1lID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldE5hbWUoKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIG5hbWVUZXh0LnNldFRleHQobmFtZSk7Ci0gICAgfQotICAgIAotICAgIGlmIChpc0VsZW1lbnRSZWZlcmVuY2UpCi0gICAgewotICAgICAgcmVmcmVzaFJlZkNvbWJvKCk7Ci0gICAgfQotCi0gICAgLy8gcmVmcmVzaCB0eXBlCi0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBib29sZWFuIGlzQW5vbnltb3VzID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgIT0gbnVsbDsKLSAgICAgICAgLy9YU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gWFNEVXRpbHMuZ2V0UmVzb2x2ZWRUeXBlKHhzZEVsZW1lbnREZWNsYXJhdGlvbik7Ci0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgCi0gICAgICAgIGlmICh0eXBlRGVmICE9IG51bGwpCi0gICAgICAgICAgdHlwZU5hbWUgPSB0eXBlRGVmLmdldFFOYW1lKHhzZFNjaGVtYSk7Ci0KLSAgICAgICAgaWYgKHR5cGVOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBmaWxsVHlwZXNDb21ibygpOwotICAgICAgICBpZiAoaXNBbm9ueW1vdXMpCi0gICAgICAgIHsKLSAgICAgICAgCXR5cGVDb21iby5zZXRUZXh0KCIqKkFub255bW91cyoqIik7Ci0gICAgICAgICAgdHlwZU5hbWUgPSAiKipBbm9ueW1vdXMqKiI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHR5cGVEZWZpbml0aW9uICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHlwZUNvbWJvLnNldFRleHQodHlwZU5hbWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgdHlwZUNvbWJvLnNldFRleHQoTWVzc2FnZXMuVUlfTk9fVFlQRSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtYXhDb21iby5zZXRFbmFibGVkKCF4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNHbG9iYWwoKSB8fCBpc0VsZW1lbnRSZWZlcmVuY2UpOwotICAgICAgICBtaW5Db21iby5zZXRFbmFibGVkKCF4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNHbG9iYWwoKSB8fCBpc0VsZW1lbnRSZWZlcmVuY2UpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIHJlZnJlc2ggbWluIG1heAotICAgIHJlZnJlc2hNaW5NYXgoKTsKLQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb1dpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IHR5cGVDb21ibykKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gdHlwZUNvbWJvLmdldFRleHQoKTsKLSAgICAgIGlmIChzaG91bGRQZXJmb3JtQ29tYm9TZWxlY3Rpb24oU1dULkRlZmF1bHRTZWxlY3Rpb24sIHNlbGVjdGlvbikpCi0gICAgICAgIGhhbmRsZVdpZGdldFNlbGVjdGlvbihlKTsKLSAgICB9IGVsc2UgaWYgKGUud2lkZ2V0ID09IGNvbXBvbmVudE5hbWVDb21ibykKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gY29tcG9uZW50TmFtZUNvbWJvLmdldFRleHQoKTsKLSAgICAgIGlmIChzaG91bGRQZXJmb3JtQ29tYm9TZWxlY3Rpb24oU1dULkRlZmF1bHRTZWxlY3Rpb24sIHNlbGVjdGlvbikpCi0gICAgICAgIGhhbmRsZVdpZGdldFNlbGVjdGlvbihlKTsKLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IHR5cGVDb21ibykKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gdHlwZUNvbWJvLmdldFRleHQoKTsKLSAgICAgIGlmIChzaG91bGRQZXJmb3JtQ29tYm9TZWxlY3Rpb24oU1dULlNlbGVjdGlvbiwgc2VsZWN0aW9uKSkKLSAgICAgICAgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKGUpOwotICAgIH0gZWxzZSBpZiAoZS53aWRnZXQgPT0gY29tcG9uZW50TmFtZUNvbWJvKQotICAgIHsKLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBjb21wb25lbnROYW1lQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgaWYgKHNob3VsZFBlcmZvcm1Db21ib1NlbGVjdGlvbihTV1QuU2VsZWN0aW9uLCBzZWxlY3Rpb24pKQotICAgICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZSk7Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSB0eXBlQ29tYm8pCi0gICAgewotICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICBpZiAoZWRpdG9yID09IG51bGwpIHJldHVybjsKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsKLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSB0eXBlQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBuZXdWYWx1ZTsKLSAgICAgIElDb21wb25lbnREaWFsb2cgZGlhbG9nPSBudWxsOwotICAgICAgaWYgKCBzZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9DT01CT19CUk9XU0UpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldEJyb3dzZURpYWxvZygpOwotICAgICAgICAoKFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZSkgZGlhbG9nKS5zaG93Q29tcGxleFR5cGVzKHRydWUpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0NPTUJPX05FVykpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0TmV3RGlhbG9nKCk7Ci0gICAgICAgICgoTmV3VHlwZURpYWxvZykgZGlhbG9nKS5hbGxvd0NvbXBsZXhUeXBlKHRydWUpOwotICAgICAgfQotCi0gICAgICBpZiAoZGlhbG9nICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChkaWFsb2cuY3JlYXRlQW5kT3BlbigpID09IFdpbmRvdy5PSykKLSAgICAgICAgewotICAgICAgICAgIG5ld1ZhbHVlID0gZGlhbG9nLmdldFNlbGVjdGVkQ29tcG9uZW50KCk7Ci0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dCkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShlbGVtZW50RGVjbGFyYXRpb24sIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlQ29tYm8uc2V0VGV4dCh0eXBlTmFtZSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIC8vdXNlIHRoZSB2YWx1ZSBmcm9tIHNlbGVjdGVkIHF1aWNrUGljayBpdGVtCi0gICAgICB7Ci0gICAgICAgIG5ld1ZhbHVlID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShzZWxlY3Rpb24sIG1hbmFnZXIpOwotICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShpbnB1dCwgbmV3VmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBjb21wb25lbnROYW1lQ29tYm8pCi0gICAgewotICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICBpZiAoZWRpdG9yID09IG51bGwpIHJldHVybjsKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsKLQotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IGNvbXBvbmVudE5hbWVDb21iby5nZXRUZXh0KCk7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIG5ld1ZhbHVlOwotICAgICAgSUNvbXBvbmVudERpYWxvZyBkaWFsb2c9IG51bGw7Ci0gICAgICBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0NPTUJPX0JST1dTRSkpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggc2VsZWN0aW9uLmVxdWFscyhNZXNzYWdlcy5fVUlfQ09NQk9fTkVXKSkKLSAgICAgIHsKLSAgICAgICAgZGlhbG9nID0gbWFuYWdlci5nZXROZXdEaWFsb2coKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRpYWxvZyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdWYWx1ZSA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbXBvbmVudCgpOwotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGlucHV0LCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnNldFRleHQoIiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIC8vdXNlIHRoZSB2YWx1ZSBmcm9tIHNlbGVjdGVkIHF1aWNrUGljayBpdGVtCi0gICAgICB7Ci0gICAgICAgIG5ld1ZhbHVlID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShzZWxlY3Rpb24sIG1hbmFnZXIpOwotICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShpbnB1dCwgbmV3VmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBtYXhDb21ibykKLSAgICB7Ci0gICAgICB1cGRhdGVNYXhBdHRyaWJ1dGUoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gbWluQ29tYm8pCi0gICAgewotICAgICAgdXBkYXRlTWluQXR0cmlidXRlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVsYXlvdXQoKQotICB7Ci0gICAgQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkuc2V0UmVkcmF3KGZhbHNlKTsKLQotICAgIGlmIChwYXJlbnRDb21wb3NpdGUgIT0gbnVsbCAmJiAhcGFyZW50Q29tcG9zaXRlLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBDb250cm9sW10gY2hpbGRyZW4gPSBwYXJlbnRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGNoaWxkcmVuW2ldLmRpc3Bvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3cgaW5pdGlhbGl6ZSB0aGUgbmV3IGhhbmRsZXIKLSAgICBjcmVhdGVDb250ZW50cyhwYXJlbnRDb21wb3NpdGUpOwotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLSAgICAvLyBOb3cgdHVybiBwYWludGluZyBiYWNrIG9uCi0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLnNldFJlZHJhdyh0cnVlKTsKLSAgICByZWZyZXNoKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULlRyYXZlcnNlKSB7Ci0gICAgICBpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9BUlJPV19ORVhUIHx8IGV2ZW50LmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVMpIHsKLSAgICAgICAgaXNUcmF2ZXJzaW5nID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5kb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IG5hbWVUZXh0KQotICAgIHsKLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBuYW1lZENvbXBvbmVudCA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dCkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgICAgaWYgKCF2YWxpZGF0ZVNlY3Rpb24oKSkKLSAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgYW4gYWN0dWFsIG5hbWUgY2hhbmdlIGhhcyB0YWtlbiBwbGFjZQotICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWVkQ29tcG9uZW50LmdldE5hbWUoKTsKLSAgICAgICAgaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb21tYW5kID0gbmV3IFVwZGF0ZU5hbWVDb21tYW5kKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0FDVElPTl9SRU5BTUUsIG5hbWVkQ29tcG9uZW50LCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsICYmIGdldENvbW1hbmRTdGFjaygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZG9SZWZlcmVudGlhbEludGVncml0eUNoZWNrKG5hbWVkQ29tcG9uZW50LCBuZXdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVTZWN0aW9uKCkKLSAgewotICAgIGlmIChuYW1lVGV4dCA9PSBudWxsIHx8IG5hbWVUZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0gICAgU3RyaW5nIG5hbWUgPSBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCi0gICAgLy8gdmFsaWRhdGUgYWdhaW5zdCBOQ05hbWUKLSAgICBpZiAobmFtZS5sZW5ndGgoKSA8IDEgfHwgIVhNTENoYXIuaXNWYWxpZE5DTmFtZShuYW1lKSkKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2Uob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfRVJST1JfSU5WQUxJRF9OQU1FKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKGNvbXBvbmVudE5hbWVDb21ibyAhPSBudWxsICYmICFjb21wb25lbnROYW1lQ29tYm8uaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5yZW1vdmVMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIHRoaXMpOwotICAgIH0KLSAgICBpZiAobWluQ29tYm8gIT0gbnVsbCAmJiAhbWluQ29tYm8uaXNEaXNwb3NlZCgpKQotICAgICAgbWluQ29tYm8ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgaWYgKG1heENvbWJvICE9IG51bGwgJiYgIW1heENvbWJvLmlzRGlzcG9zZWQoKSkKLSAgICAgIG1heENvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGlmICh0eXBlQ29tYm8gIT0gbnVsbCAmJiAhdHlwZUNvbWJvLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICB0eXBlQ29tYm8ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICB0eXBlQ29tYm8ucmVtb3ZlTGlzdGVuZXIoU1dULlRyYXZlcnNlLCB0aGlzKTsKLSAgICB9Ci0gICAgaWYgKG5hbWVUZXh0ICE9IG51bGwgJiYgIW5hbWVUZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgIHJlbW92ZUxpc3RlbmVycyhuYW1lVGV4dCk7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFJlZkNvbWJvKCkKLSAgewotICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIGZpbGxFbGVtZW50c0NvbWJvKCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBmaWxsRWxlbWVudHNDb21ibygpCi0gIHsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7ICAgIAotICAgIGlmIChtYW5hZ2VyICE9IG51bGwpCi0gICAgewotICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZChNZXNzYWdlcy5fVUlfQ09NQk9fQlJPV1NFKTsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoTWVzc2FnZXMuX1VJX0NPTUJPX05FVyk7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gcXVpY2tQaWNrcyA9IG1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotICAgICAgaWYgKHF1aWNrUGlja3MgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxdWlja1BpY2tzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gcXVpY2tQaWNrc1tpXTsKLSAgICAgICAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGhpc3RvcnkgPSBtYW5hZ2VyLmdldEhpc3RvcnkoKTsKLSAgICAgIGlmIChoaXN0b3J5ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGlzdG9yeS5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9IGhpc3RvcnlbaV07Ci0gICAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZChjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIG5hbWVkQ29tcG9uZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gbmFtZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpOwotICAgIAotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFKTsKLSAgICAgIGlmIChhdHRyVmFsdWUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYXR0clZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmV0ID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShhdHRyVmFsdWUsIG1hbmFnZXIpOwotICAgICAgaWYgKHJldCA9PSBudWxsKQotICAgICAgewotICAgICAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkKGF0dHJWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0VGV4dChhdHRyVmFsdWUpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RFbnVtZXJhdGlvbkZhY2V0U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RFbnVtZXJhdGlvbkZhY2V0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjFiMDA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERW51bWVyYXRpb25GYWNldFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlNldFhTREZhY2V0VmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbnVtZXJhdGlvbkZhY2V0OwotCi1wdWJsaWMgY2xhc3MgWFNERW51bWVyYXRpb25GYWNldFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgQ0NvbWJvIGZpbmFsQ29tYm87Ci0gIFRleHQgdmFsdWVUZXh0OwotICAKLSAgcHVibGljIFhTREVudW1lcmF0aW9uRmFjZXRTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSA9IGdldFdpZGdldEZhY3RvcnkoKTsKLSAgICBjb21wb3NpdGUgPSBmYWN0b3J5LmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gVmFsdWVMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0KLSAgICBDTGFiZWwgdmFsdWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfVkFMVUUpOwotICAgIHZhbHVlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFZhbHVlVGV4dAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgdmFsdWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB2YWx1ZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyh2YWx1ZVRleHQpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodmFsdWVUZXh0LAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19TSU1QTEVfVFlQRV9fTkFNRSk7ICAgIAotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2goKTsKLQotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0KLSAgICB2YWx1ZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotICAgIHsKLSAgICAgIFhTREVudW1lcmF0aW9uRmFjZXQgeHNkRW51bWVyYXRpb24gPSAoWFNERW51bWVyYXRpb25GYWNldClpbnB1dDsKLSAgICAgIAotICAgICAgaWYoeHNkRW51bWVyYXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdmFsdWVUZXh0LnNldFRleHQoeHNkRW51bWVyYXRpb24uZ2V0TGV4aWNhbFZhbHVlKCkpOwotICAgICAgfQotICAgIH0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIAotICB7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSB2YWx1ZVRleHQpCi0gICAgewotICAgICAgaWYgKCF2YWx1ZVRleHQuZ2V0RWRpdGFibGUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBTdHJpbmcgdmFsdWUgPSB2YWx1ZVRleHQuZ2V0VGV4dCgpOwotICAgICAgCi0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotICAgICAgewotICAgIAlYU0RFbnVtZXJhdGlvbkZhY2V0IHhzZEVudW1lcmF0aW9uID0gKFhTREVudW1lcmF0aW9uRmFjZXQpaW5wdXQ7Ci0gICAgCSAgCi0gICAgCUNvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgCWNvbW1hbmQgPSBuZXcgU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9DSEFOR0VfRU5VTUVSQVRJT05fVkFMVUUsCi0gICAgICAgICAgeHNkRW51bWVyYXRpb24sIHZhbHVlKTsKLQotICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsICYmIGdldENvbW1hbmRTdGFjaygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICAgIHZhbHVlVGV4dC5zZXRUZXh0KHZhbHVlKTsgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERmFjZXRTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREZhY2V0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGQwZGY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERmFjZXRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZVhTRFdoaXRlU3BhY2VGYWNldENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RMZW5ndGhGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWF4RXhjbHVzaXZlRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1heEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNYXhJbmNsdXNpdmVGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWF4TGVuZ3RoRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1pbkV4Y2x1c2l2ZUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNaW5GYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWluSW5jbHVzaXZlRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1pbkxlbmd0aEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVmFyaWV0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2hpdGVTcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2hpdGVTcGFjZUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFhTREZhY2V0U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBwcml2YXRlIFN0cmluZyBtaW5MZW5ndGhTdHJpbmcsIG1heExlbmd0aFN0cmluZywgdGl0bGVTdHJpbmc7Ci0gIEZvbnQgdGl0bGVGb250OwotICBDTGFiZWwgdGl0bGU7Ci0gIExhYmVsIG1pbkxlbmd0aExhYmVsOwotICBUZXh0IG1pbkxlbmd0aFRleHQ7Ci0gIExhYmVsIG1heExlbmd0aExhYmVsOwotICBUZXh0IG1heExlbmd0aFRleHQ7Ci0gIEdyb3VwIHNpbXBsZVR5cGVNb2RpZmllckdyb3VwOwotICBTdHJpbmcgc2ltcGxlVHlwZU1vZGlmaWVyR3JvdXBUaXRsZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gIEJ1dHRvbiBjb2xsYXBzZVdoaXRlc3BhY2VCdXR0b247Ci0gIEJ1dHRvbiB1c2VFbnVtZXJhdGlvbnNCdXR0b24sIHVzZVBhdHRlcm5zQnV0dG9uOwotICBCdXR0b24gbWluaW11bUluY2x1c2l2ZUNoZWNrYm94OwotICBCdXR0b24gbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94OwotICBib29sZWFuIGlzTnVtZXJpY0Jhc2VUeXBlOwotICBib29sZWFuIGlzU2ltcGxlVHlwZVJlc3RyaWN0aW9uOwotICBwcml2YXRlIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uOwotICBwcml2YXRlIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uOwotICBwcml2YXRlIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGN1cnJlbnRQcmltaXRpdmVUeXBlLCBwcmV2aW91c1ByaW1pdGl2ZVR5cGU7Ci0gIHByaXZhdGUgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbjsKLSAgcHJpdmF0ZSBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLSAgcHJpdmF0ZSBYU0RGZWF0dXJlIHhzZEZlYXR1cmU7Ci0gIGJvb2xlYW4gaGFzTWF4TWluRmFjZXRzOwotCi0gIFNwZWNpZmljQ29uc3RyYWludHNXaWRnZXQgY29uc3RyYWludHNXaWRnZXQ7Ci0KLSAgcHJpdmF0ZSBpbnQgY29uc3RyYWludEtpbmQgPSBTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0LkVOVU1FUkFUSU9OOwotICAKLSAgcHVibGljIFhTREZhY2V0U2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0gICAgY29tcG9zaXRlID0gZmFjdG9yeS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIHRpdGxlID0gZmFjdG9yeS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBGb250RGF0YSBmb250RGF0YSA9IGNvbXBvc2l0ZS5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLSAgICB0aXRsZS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldEJvbGQoZm9udERhdGEuZ2V0TmFtZSgpKSk7Ci0gICAgdGl0bGUuc2V0VGV4dCh0aXRsZVN0cmluZyArIChpc1JlYWRPbmx5ID8gIiAtICIgKyBNZXNzYWdlcy5fVUlfTEFCRUxfUkVBRE9OTFkgOiAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgIENvbXBvc2l0ZSBmYWNldENvbXBvc2l0ZSA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBmYWNldENvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGZhY2V0Q29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgIHNpbXBsZVR5cGVNb2RpZmllckdyb3VwID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUdyb3VwKGZhY2V0Q29tcG9zaXRlLCBzaW1wbGVUeXBlTW9kaWZpZXJHcm91cFRpdGxlKTsKLSAgICBHcmlkTGF5b3V0IGdyb3VwR3JpZCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JvdXBHcmlkLm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JvdXBHcmlkLm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JvdXBHcmlkLm51bUNvbHVtbnMgPSAxOwotICAgIHNpbXBsZVR5cGVNb2RpZmllckdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgc2ltcGxlVHlwZU1vZGlmaWVyR3JvdXAuc2V0TGF5b3V0KGdyb3VwR3JpZCk7Ci0KLSAgICBDb21wb3NpdGUgc2ltcGxlVHlwZU1vZGlmaWVyQ29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHNpbXBsZVR5cGVNb2RpZmllckdyb3VwKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkLm51bUNvbHVtbnMgPSAzOwotICAgIHNpbXBsZVR5cGVNb2RpZmllckNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZCk7Ci0gICAgc2ltcGxlVHlwZU1vZGlmaWVyQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgaWYgKGhhc01heE1pbkZhY2V0cykKLSAgICB7Ci0gICAgICBib29sZWFuIGlzTGludXggPSBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yLmVxdWFscygiLyIpOwotICAgICAgbWluTGVuZ3RoTGFiZWwgPSBmYWN0b3J5LmNyZWF0ZUxhYmVsKHNpbXBsZVR5cGVNb2RpZmllckNvbXBvc2l0ZSwgbWluTGVuZ3RoU3RyaW5nKTsKLSAgICAgIG1pbkxlbmd0aFRleHQgPSBmYWN0b3J5LmNyZWF0ZVRleHQoc2ltcGxlVHlwZU1vZGlmaWVyQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChpc0xpbnV4KQotICAgICAgewotICAgICAgCW1pbkxlbmd0aFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgY3VzdG9tTGlzdGVuZXIpOwotICAgICAgCW1pbkxlbmd0aFRleHQuYWRkTGlzdGVuZXIoU1dULktleURvd24sIGN1c3RvbUxpc3RlbmVyKTsKLSAgICAgIAltaW5MZW5ndGhUZXh0LmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgY3VzdG9tTGlzdGVuZXIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBhcHBseUFsbExpc3RlbmVycyhtaW5MZW5ndGhUZXh0KTsKLSAgICAgIAotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChtaW5MZW5ndGhUZXh0LAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuQ09OU1RSQUlOVFNfVEFCX19NSU5JTVVNX0xFTkdUSCk7Ci0KLSAgICAgIEdyaWREYXRhIG1pbkdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBtaW5HcmlkRGF0YS53aWR0aEhpbnQgPSAxMDA7Ci0gICAgICBtaW5MZW5ndGhUZXh0LnNldExheW91dERhdGEobWluR3JpZERhdGEpOwotICAgICAgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94ID0gZmFjdG9yeS5jcmVhdGVCdXR0b24oc2ltcGxlVHlwZU1vZGlmaWVyQ29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfSU5DTFVTSVZFLCBTV1QuQ0hFQ0spOwotICAgICAgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgICBtYXhMZW5ndGhMYWJlbCA9IGZhY3RvcnkuY3JlYXRlTGFiZWwoc2ltcGxlVHlwZU1vZGlmaWVyQ29tcG9zaXRlLCBtYXhMZW5ndGhTdHJpbmcpOwotICAgICAgbWF4TGVuZ3RoVGV4dCA9IGZhY3RvcnkuY3JlYXRlVGV4dChzaW1wbGVUeXBlTW9kaWZpZXJDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGlzTGludXgpCi0gICAgICB7Ci0gICAgCSAgbWF4TGVuZ3RoVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgCSAgbWF4TGVuZ3RoVGV4dC5hZGRMaXN0ZW5lcihTV1QuS2V5RG93biwgY3VzdG9tTGlzdGVuZXIpOwotICAgIAkgIG1heExlbmd0aFRleHQuYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGFwcGx5QWxsTGlzdGVuZXJzKG1heExlbmd0aFRleHQpOwotICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG1heExlbmd0aFRleHQsCi0gICAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkNPTlNUUkFJTlRTX1RBQl9fTUFYSU1VTV9MRU5HVEgpOwotCi0gICAgICBHcmlkRGF0YSBtYXhHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgbWF4R3JpZERhdGEud2lkdGhIaW50ID0gMTAwOwotICAgICAgbWF4TGVuZ3RoVGV4dC5zZXRMYXlvdXREYXRhKG1heEdyaWREYXRhKTsKLQotICAgICAgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94ID0gZmFjdG9yeS5jcmVhdGVCdXR0b24oc2ltcGxlVHlwZU1vZGlmaWVyQ29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfSU5DTFVTSVZFLCBTV1QuQ0hFQ0spOwotICAgICAgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgICBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0VmlzaWJsZShpc051bWVyaWNCYXNlVHlwZSk7Ci0gICAgICBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0VmlzaWJsZShpc051bWVyaWNCYXNlVHlwZSk7Ci0gICAgfQotICAgIGNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbiA9IGZhY3RvcnkuY3JlYXRlQnV0dG9uKHNpbXBsZVR5cGVNb2RpZmllckNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0NPTExBUFNFX1dISVRFU1BBQ0UsIFNXVC5DSEVDSyk7Ci0gICAgY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uLAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuQ09OU1RSQUlOVFNfVEFCX19DT0xMQVBTRV9XSElURVNQQUNFKTsKLQotICAgIEdyb3VwIHNwZWNpZmljVmFsdWVDb25zdHJhaW50c0dyb3VwID0gZmFjdG9yeS5jcmVhdGVHcm91cChmYWNldENvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX1NQRUNJRklDX0NPTlNUUkFJTlRfVkFMVUVTKTsKLSAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgc3BlY2lmaWNWYWx1ZUNvbnN0cmFpbnRzR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgc3BlY2lmaWNWYWx1ZUNvbnN0cmFpbnRzR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGVGb3JCdXR0b25zID0gZmFjdG9yeS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShzcGVjaWZpY1ZhbHVlQ29uc3RyYWludHNHcm91cCk7Ci0gICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBjb21wb3NpdGVGb3JCdXR0b25zLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLSAgICBjb21wb3NpdGVGb3JCdXR0b25zLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBmYWN0b3J5LmNyZWF0ZUNMYWJlbChjb21wb3NpdGVGb3JCdXR0b25zLCBNZXNzYWdlcy5fVUlfTEFCRUxfUkVTVFJJQ1RfVkFMVUVTX0JZKTsKLS8vICAgIHVzZURlZmluZWRWYWx1ZXNCdXR0b24gPSBmYWN0b3J5LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGVGb3JCdXR0b25zLCAiT25seSBwZXJtaXQgY2VydGFpbiB2YWx1ZXMiLCBTV1QuQ0hFQ0spOwotLy8gICAgdXNlRGVmaW5lZFZhbHVlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGVGb3JSYWRpb0J1dHRvbnMgPSBmYWN0b3J5LmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKGNvbXBvc2l0ZUZvckJ1dHRvbnMpOwotICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGNvbXBvc2l0ZUZvclJhZGlvQnV0dG9ucy5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgdXNlRW51bWVyYXRpb25zQnV0dG9uID0gZmFjdG9yeS5jcmVhdGVCdXR0b24oY29tcG9zaXRlRm9yUmFkaW9CdXR0b25zLCBNZXNzYWdlcy5fVUlfTEFCRUxfRU5VTUVSQVRJT05TLCBTV1QuUkFESU8pOwotICAgIHVzZUVudW1lcmF0aW9uc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVzZUVudW1lcmF0aW9uc0J1dHRvbiwKLSAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkNPTlNUUkFJTlRTX1RBQl9fRU5VTUVSQVRJT05TKTsKLSAgICB1c2VQYXR0ZXJuc0J1dHRvbiA9IGZhY3RvcnkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZUZvclJhZGlvQnV0dG9ucywgTWVzc2FnZXMuX1VJX0xBQkVMX1BBVFRFUk5TLCBTV1QuUkFESU8pOwotICAgIHVzZVBhdHRlcm5zQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodXNlUGF0dGVybnNCdXR0b24sCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5DT05TVFJBSU5UU19UQUJfX1BBVFRFUk5TKTsgICAgCi0gICAgCi0gICAgY29uc3RyYWludHNXaWRnZXQgPSBuZXcgU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldChzcGVjaWZpY1ZhbHVlQ29uc3RyYWludHNHcm91cCwgZmFjdG9yeSwgKGlucHV0IGluc3RhbmNlb2YgWFNERmVhdHVyZSkgPyAoWFNERmVhdHVyZSlpbnB1dCA6IG51bGwsIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLCB0aGlzLCBjb25zdHJhaW50S2luZCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBjb25zdHJhaW50c1dpZGdldC5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbnN0cmFpbnRzV2lkZ2V0LmdldENvbnRyb2woKSwKLSAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkNPTlNUUkFJTlRTX1RBQl9fTk9fTEFCRUwpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkb1NldElucHV0KCkKLSAgewotICAgIHNldElucHV0KGdldFBhcnQoKSwgZ2V0U2VsZWN0aW9uKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBzdXBlci5zZXRJbnB1dChwYXJ0LCBzZWxlY3Rpb24pOwotICAgIGluaXQoKTsKLSAgICAKLSAgICBYU0RTY2hlbWEgc2NoZW1hT2ZUeXBlID0gbnVsbDsKLQotICAgIGlmICghaXNSZWFkT25seSkKLSAgICB7Ci0gICAgICBzY2hlbWFPZlR5cGUgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRTY2hlbWEoKTsKLSAgICB9Ci0gICAgaWYgKHNjaGVtYU9mVHlwZSA9PSBvd25pbmdFZGl0b3IuZ2V0QWRhcHRlcihYU0RTY2hlbWEuY2xhc3MpKQotICAgIHsKLSAgICAgIGlzUmVhZE9ubHkgPSBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICghWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLmVxdWFscyh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSkpCi0gICAgICAgIGlzUmVhZE9ubHkgPSB0cnVlOwotICAgIH0KLSAgICBpZiAoaGFzTWF4TWluRmFjZXRzKQotICAgIHsKLSAgICAgIHRpdGxlLnNldFRleHQodGl0bGVTdHJpbmcgKyAoaXNSZWFkT25seSA/ICIgLSAiICsgTWVzc2FnZXMuX1VJX0xBQkVMX1JFQURPTkxZIDogIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICAgIHJlbGF5b3V0KCk7Ci0gICAgY29uc3RyYWludHNXaWRnZXQuc2V0Q29tbWFuZFN0YWNrKGdldENvbW1hbmRTdGFjaygpKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXQoKQotICB7Ci0gICAgaGFzTWF4TWluRmFjZXRzID0gZmFsc2U7Ci0gICAgdHJ5Ci0gICAgewotICAgIHVwZGF0ZUlucHV0KCk7Ci0gICAgCi0gICAgaWYgKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgaXNTaW1wbGVUeXBlUmVzdHJpY3Rpb24gPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRWYXJpZXR5KCkuZ2V0VmFsdWUoKSA9PSBYU0RWYXJpZXR5LkFUT01JQzsKLSAgICAgIAotICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdGFyZ2V0U1QgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLSAgICAgIAotICAgICAgd2hpbGUgKCFYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKHRhcmdldFNULmdldFRhcmdldE5hbWVzcGFjZSgpKSAmJiB0YXJnZXRTVCAhPSBudWxsKQotICAgICAgewotICAgICAgICB0YXJnZXRTVCA9IHRhcmdldFNULmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotICAgICAgfQotICAgICAgCi0gICAgICBtaW5MZW5ndGhTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgbWF4TGVuZ3RoU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmICh0YXJnZXRTVC5nZXRWYWxpZEZhY2V0cygpLmNvbnRhaW5zKCJsZW5ndGgiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBtaW5MZW5ndGhTdHJpbmcgPSBNZXNzYWdlcy5fVUlfTEFCRUxfTUlOSU1VTV9MRU5HVEg7Ci0gICAgICAgIG1heExlbmd0aFN0cmluZyA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9NQVhJTVVNX0xFTkdUSDsKLSAgICAgICAgc2ltcGxlVHlwZU1vZGlmaWVyR3JvdXBUaXRsZSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9DT05TVFJBSU5UU19PTl9MRU5HVEhfT0YgKyB0YXJnZXRTVC5nZXROYW1lKCk7Ci0gICAgICAgIGlzTnVtZXJpY0Jhc2VUeXBlID0gZmFsc2U7Ci0gICAgICAgIGhhc01heE1pbkZhY2V0cyA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0YXJnZXRTVC5nZXRWYWxpZEZhY2V0cygpLmNvbnRhaW5zKCJtYXhJbmNsdXNpdmUiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBzaW1wbGVUeXBlTW9kaWZpZXJHcm91cFRpdGxlID0gTWVzc2FnZXMuX1VJX0xBQkVMX0NPTlNUUkFJTlRTX09OX1ZBTFVFX09GICsgdGFyZ2V0U1QuZ2V0TmFtZSgpOwotICAgICAgICBtaW5MZW5ndGhTdHJpbmcgPSBNZXNzYWdlcy5fVUlfTEFCRUxfTUlOSU1VTV9WQUxVRTsKLSAgICAgICAgbWF4TGVuZ3RoU3RyaW5nID0gTWVzc2FnZXMuX1VJX0xBQkVMX01BWElNVU1fVkFMVUU7Ci0gICAgICAgIGlzTnVtZXJpY0Jhc2VUeXBlID0gdHJ1ZTsKLSAgICAgICAgaGFzTWF4TWluRmFjZXRzID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2ltcGxlVHlwZU1vZGlmaWVyR3JvdXBUaXRsZSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9DT05UUkFJTlRTX09OICsgKHRhcmdldFNUICE9IG51bGwgPyB0YXJnZXRTVC5nZXROYW1lKCkgOiAiYW55VHlwZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIH0KLSAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgdXBkYXRlSW5wdXQoKQotICB7Ci0gICAgcHJldmlvdXNQcmltaXRpdmVUeXBlID0gY3VycmVudFByaW1pdGl2ZVR5cGU7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERmVhdHVyZSkKLSAgICB7Ci0gICAgICB4c2RGZWF0dXJlID0gKFhTREZlYXR1cmUpIGlucHV0OwotICAgICAgdHlwZURlZmluaXRpb24gPSB4c2RGZWF0dXJlLmdldFJlc29sdmVkRmVhdHVyZSgpLmdldFR5cGUoKTsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGFub255bW91c1R5cGVEZWZpbml0aW9uID0gbnVsbDsKLSAgICAgIGlmICh4c2RGZWF0dXJlIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICB4c2RFbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKXhzZEZlYXR1cmU7Ci0gICAgICAgIGFub255bW91c1R5cGVEZWZpbml0aW9uID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHhzZEZlYXR1cmUgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgeHNkQXR0cmlidXRlRGVjbGFyYXRpb24gPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24peHNkRmVhdHVyZTsKLSAgICAgICAgYW5vbnltb3VzVHlwZURlZmluaXRpb24gPSB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHR5cGVEZWZpbml0aW9uIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB0eXBlRGVmaW5pdGlvbjsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGFub255bW91c1R5cGVEZWZpbml0aW9uIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWFub255bW91c1R5cGVEZWZpbml0aW9uOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoeHNkU2ltcGxlVHlwZURlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGJhc2VQcmltaXRpdmVUeXBlID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgU3RyaW5nIGJhc2VQcmltaXRpdmVUeXBlU3RyaW5nID0gYmFzZVByaW1pdGl2ZVR5cGUgIT0gbnVsbCA/IGJhc2VQcmltaXRpdmVUeXBlLmdldE5hbWUoKSA6ICIiOwotICAgICAgICAgIGN1cnJlbnRQcmltaXRpdmVUeXBlID0gYmFzZVByaW1pdGl2ZVR5cGU7Ci0gICAgICAgICAgdGl0bGVTdHJpbmcgPSBNZXNzYWdlcy5fVUlfTEFCRUxfVFlQRSArIChhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiAhPSBudWxsID8gIigiICsgeHNkRmVhdHVyZS5nZXRSZXNvbHZlZEZlYXR1cmUoKS5nZXROYW1lKCkgKyAiVHlwZSkiIDogeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKSAgKyAiICwgIiArIE1lc3NhZ2VzLl9VSV9MQUJFTF9CQVNFICsgIjogIiArIGJhc2VQcmltaXRpdmVUeXBlU3RyaW5nOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgY3VycmVudFByaW1pdGl2ZVR5cGUgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLSAgICAgICAgICB0aXRsZVN0cmluZyA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9UWVBFICsgKGFub255bW91c1R5cGVEZWZpbml0aW9uICE9IG51bGwgPyAiKCIgKyB4c2RGZWF0dXJlLmdldFJlc29sdmVkRmVhdHVyZSgpLmdldE5hbWUoKSArICJUeXBlKSIgOiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgeHNkU2ltcGxlVHlwZURlZmluaXRpb24gPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0OwotICAgICAgY3VycmVudFByaW1pdGl2ZVR5cGUgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLSAgICAgIHRpdGxlU3RyaW5nID0gTWVzc2FnZXMuX1VJX0xBQkVMX1RZUEUgKyAoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpID09IG51bGwgPyAiKGxvY2FsVHlwZSkiIDogeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKSArICIgLCAiICsgTWVzc2FnZXMuX1VJX0xBQkVMX0JBU0UgKyAiOiAiICsgeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2goKTsKLSAgICBpbml0KCk7Ci0gICAgCi0gICAgaWYgKGN1cnJlbnRQcmltaXRpdmVUeXBlICE9IHByZXZpb3VzUHJpbWl0aXZlVHlwZSkKLSAgICB7Ci0gICAgICByZWxheW91dCgpOyAgICAgIAotICAgIH0KLSAgICAKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgIAotICAgIFhTRFdoaXRlU3BhY2VGYWNldCB3aGl0ZXNwYWNlRmFjZXQgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRXaGl0ZVNwYWNlRmFjZXQoKTsKLSAgICBpZiAod2hpdGVzcGFjZUZhY2V0ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEZhY2V0Q29udGVudHMoKS5jb250YWlucyh3aGl0ZXNwYWNlRmFjZXQpKQotICAgICAgewotICAgICAgICBpZiAoWFNEV2hpdGVTcGFjZS5DT0xMQVBTRV9MSVRFUkFMLmVxdWFscyh3aGl0ZXNwYWNlRmFjZXQuZ2V0VmFsdWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIVhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMS5lcXVhbHMoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb2xsYXBzZVdoaXRlc3BhY2VCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaGFzTWF4TWluRmFjZXRzICYmICFtaW5MZW5ndGhMYWJlbC5pc0Rpc3Bvc2VkKCkgJiYgIW1heExlbmd0aExhYmVsLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBtaW5MZW5ndGhMYWJlbC5zZXRUZXh0KG1pbkxlbmd0aFN0cmluZyk7Ci0gICAgICBtYXhMZW5ndGhMYWJlbC5zZXRUZXh0KG1heExlbmd0aFN0cmluZyk7Ci0KLSAgICAgIGlmICghaXNOdW1lcmljQmFzZVR5cGUpCi0gICAgICAgIHJlZnJlc2hTdHJpbmdMZW5ndGgoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmVmcmVzaFZhbHVlTGVuZ3RocygpOwotICAgIH0KLQotICAgIGlmICgoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0RW51bWVyYXRpb25GYWNldHMoKS5zaXplKCkgPiAwIAotICAgIAkJJiYgY29uc3RyYWludHNXaWRnZXQuZ2V0Q29uc3RyYWludEtpbmQoKSA9PSBTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0LkVOVU1FUkFUSU9OKQotICAgIAkJfHwgeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0UGF0dGVybkZhY2V0cygpLnNpemUoKSA9PSAwKSAKLSAgICB7Ci0gICAgICB1c2VQYXR0ZXJuc0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgdXNlRW51bWVyYXRpb25zQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LnNldENvbnN0cmFpbnRLaW5kKFNwZWNpZmljQ29uc3RyYWludHNXaWRnZXQuRU5VTUVSQVRJT04pOwotICAgICAgY29uc3RyYWludHNXaWRnZXQuYWRkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRQYXR0ZXJuRmFjZXRzKCkuc2l6ZSgpID4gMAotICAgIAkJJiYgY29uc3RyYWludHNXaWRnZXQuZ2V0Q29uc3RyYWludEtpbmQoKSA9PSBTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0LlBBVFRFUk4pCi0gICAgCQl8fCB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRFbnVtZXJhdGlvbkZhY2V0cygpLnNpemUoKSA9PSAwKQotICAgIHsKLSAgICAgIHVzZVBhdHRlcm5zQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgIHVzZUVudW1lcmF0aW9uc0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgY29uc3RyYWludHNXaWRnZXQuc2V0Q29uc3RyYWludEtpbmQoU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldC5QQVRURVJOKTsKLSAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LmFkZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHVzZVBhdHRlcm5zQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICB1c2VFbnVtZXJhdGlvbnNCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgY29uc3RyYWludHNXaWRnZXQuc2V0Q29uc3RyYWludEtpbmQoU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldC5FTlVNRVJBVElPTik7Ci0gICAgICBjb25zdHJhaW50c1dpZGdldC5hZGRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0gICAgY29uc3RyYWludEtpbmQgPSBjb25zdHJhaW50c1dpZGdldC5nZXRDb25zdHJhaW50S2luZCgpOwotICAgIGNvbnN0cmFpbnRzV2lkZ2V0LnNldElucHV0KHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKTsKLQotICAgIHNldFdpZGdldHNFbmFibGVkKGlzU2ltcGxlVHlwZVJlc3RyaWN0aW9uICYmICFpc1JlYWRPbmx5KTsKLSAgICBjb21wb3NpdGUuc2V0RW5hYmxlZChpc1NpbXBsZVR5cGVSZXN0cmljdGlvbiAmJiAhaXNSZWFkT25seSk7Ci0gICAgCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0V2lkZ2V0c0VuYWJsZWQoYm9vbGVhbiBpc0VuYWJsZWQpCi0gIHsKLSAgICBpZiAoY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uICE9IG51bGwgJiYgIWNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbi5pc0Rpc3Bvc2VkKCkpCi0gICAgICBjb2xsYXBzZVdoaXRlc3BhY2VCdXR0b24uc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgIGlmICh1c2VFbnVtZXJhdGlvbnNCdXR0b24gIT0gbnVsbCAmJiAhdXNlRW51bWVyYXRpb25zQnV0dG9uLmlzRGlzcG9zZWQoKSkKLSAgICAgIHVzZUVudW1lcmF0aW9uc0J1dHRvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgaWYgKHVzZVBhdHRlcm5zQnV0dG9uICE9IG51bGwgJiYgIXVzZVBhdHRlcm5zQnV0dG9uLmlzRGlzcG9zZWQoKSkKLSAgICAgIHVzZVBhdHRlcm5zQnV0dG9uLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICBpZiAobWluaW11bUluY2x1c2l2ZUNoZWNrYm94ICE9IG51bGwgJiYgIW1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5pc0Rpc3Bvc2VkKCkpCi0gICAgICBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgIGlmIChtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3ggIT0gbnVsbCAmJiAhbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LmlzRGlzcG9zZWQoKSkKLSAgICAgIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgaWYgKGNvbnN0cmFpbnRzV2lkZ2V0ICE9IG51bGwgJiYgIWNvbnN0cmFpbnRzV2lkZ2V0LmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgaWYoY29uc3RyYWludHNXaWRnZXQuZ2V0Q29uc3RyYWludEtpbmQoKSA9PSBTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0LlBBVFRFUk4pCi0gICAgICB7Ci0gICAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LmFkZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsgIAotICAgICAgfQotICAgICAgZWxzZSAKLSAgICAgIHsKLSAgICAgICAgY29uc3RyYWludHNXaWRnZXQuYWRkQnV0dG9uLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICAgIH0gICAgICAKLSAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LmFkZFVzaW5nRGlhbG9nQnV0dG9uLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWxheW91dCgpCi0gIHsKLSAgICBDb21wb3NpdGUgcGFyZW50ID0gY29tcG9zaXRlLmdldFBhcmVudCgpOwotICAgIHBhcmVudC5nZXRQYXJlbnQoKS5zZXRSZWRyYXcoZmFsc2UpOwotCi0gICAgaWYgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgY2hpbGRyZW5baV0uZGlzcG9zZSgpOwotICAgICAgfQotICAgIH0KLSAgICBjcmVhdGVDb250ZW50cyhwYXJlbnQpOwotICAgIHBhcmVudC5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0gICAgcGFyZW50LmdldFBhcmVudCgpLnNldFJlZHJhdyh0cnVlKTsKLSAgICByZWZyZXNoKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmICh0aXRsZUZvbnQgIT0gbnVsbCAmJiAhdGl0bGVGb250LmlzRGlzcG9zZWQoKSkKLSAgICAgIHRpdGxlRm9udC5kaXNwb3NlKCk7Ci0gICAgdGl0bGVGb250ID0gbnVsbDsKLSAgICAKLSAgICBpZiAobWluaW11bUluY2x1c2l2ZUNoZWNrYm94ICE9IG51bGwgJiYgIW1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5pc0Rpc3Bvc2VkKCkpCi0gICAgICBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3gucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgaWYgKG1heGltdW1JbmNsdXNpdmVDaGVja2JveCAhPSBudWxsICYmICFtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guaXNEaXNwb3NlZCgpKQotICAgICAgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIGlmIChjb2xsYXBzZVdoaXRlc3BhY2VCdXR0b24gIT0gbnVsbCAmJiAhY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uLmlzRGlzcG9zZWQoKSkKLSAgICAgIGNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIGlmIChtYXhMZW5ndGhUZXh0ICE9IG51bGwgJiYgIW1heExlbmd0aFRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmVtb3ZlTGlzdGVuZXJzKG1heExlbmd0aFRleHQpOwotICAgIGlmIChtaW5MZW5ndGhUZXh0ICE9IG51bGwgJiYgIW1pbkxlbmd0aFRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmVtb3ZlTGlzdGVuZXJzKG1pbkxlbmd0aFRleHQpOwotICAgIAotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hTdHJpbmdMZW5ndGgoKQotICB7Ci0gICAgWFNETWluTGVuZ3RoRmFjZXQgbWluTGVuZ3RoRmFjZXQgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRNaW5MZW5ndGhGYWNldCgpOwotICAgIFhTRE1heExlbmd0aEZhY2V0IG1heExlbmd0aEZhY2V0ID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TWF4TGVuZ3RoRmFjZXQoKTsKLSAgICBYU0RMZW5ndGhGYWNldCBsZW5ndGhGYWNldCA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldExlbmd0aEZhY2V0KCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAobWluTGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IG1pbkxlbmd0aFZhbHVlID0gbWluTGVuZ3RoRmFjZXQuZ2V0VmFsdWUoKTsKLSAgICAgICAgaWYgKG1pbkxlbmd0aFZhbHVlID49IDAgJiYgbWluTGVuZ3RoRmFjZXQuZ2V0Um9vdENvbnRhaW5lcigpID09IHhzZFNjaGVtYSkKLSAgICAgICAgewotICAgICAgICAgIG1pbkxlbmd0aFRleHQuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKG1pbkxlbmd0aFZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWluTGVuZ3RoVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobWF4TGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IG1heExlbmd0aCA9IG1heExlbmd0aEZhY2V0LmdldFZhbHVlKCk7Ci0gICAgICAgIGlmIChtYXhMZW5ndGggPj0gMCAmJiBtYXhMZW5ndGhGYWNldC5nZXRSb290Q29udGFpbmVyKCkgPT0geHNkU2NoZW1hKQotICAgICAgICB7Ci0gICAgICAgICAgbWF4TGVuZ3RoVGV4dC5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcobWF4TGVuZ3RoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWF4TGVuZ3RoVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IGxlbmd0aCA9IGxlbmd0aEZhY2V0LmdldFZhbHVlKCk7Ci0gICAgICAgIGlmIChsZW5ndGggPj0gMCAmJiBsZW5ndGhGYWNldC5nZXRSb290Q29udGFpbmVyKCkgPT0geHNkU2NoZW1hKQotICAgICAgICB7Ci0gICAgICAgICAgbWluTGVuZ3RoVGV4dC5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcobGVuZ3RoKSk7Ci0gICAgICAgICAgbWF4TGVuZ3RoVGV4dC5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcobGVuZ3RoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLQotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaFZhbHVlTGVuZ3RocygpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlID0geHNkU2ltcGxlVHlwZURlZmluaXRpb247Ci0gICAgWFNETWluRmFjZXQgbWluRmFjZXQgPSB0eXBlLmdldE1pbkZhY2V0KCk7Ci0gICAgWFNETWF4RmFjZXQgbWF4RmFjZXQgPSB0eXBlLmdldE1heEZhY2V0KCk7Ci0KLSAgICBpZiAobWluRmFjZXQgIT0gbnVsbCAmJiBtaW5GYWNldC5nZXRSb290Q29udGFpbmVyKCkgPT0geHNkU2NoZW1hKQotICAgIHsKLSAgICAgIGlmIChtaW5GYWNldC5nZXRFbGVtZW50KCkuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhTRENvbnN0YW50cy5NSU5FWENMVVNJVkVfRUxFTUVOVF9UQUcpIHx8IG1pbkZhY2V0LmdldEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLk1JTklOQ0xVU0lWRV9FTEVNRU5UX1RBRykpCi0gICAgICB7Ci0gICAgICAgIG1pbkxlbmd0aFRleHQuc2V0VGV4dChtaW5GYWNldC5nZXRMZXhpY2FsVmFsdWUoKSk7Ci0gICAgICAgIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRTZWxlY3Rpb24obWluRmFjZXQuaXNJbmNsdXNpdmUoKSk7Ci0gICAgICAgIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBtaW5MZW5ndGhUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBpZiAobWF4RmFjZXQgIT0gbnVsbCAmJiBtYXhGYWNldC5nZXRSb290Q29udGFpbmVyKCkgPT0geHNkU2NoZW1hKQotICAgIHsKLSAgICAgIGlmIChtYXhGYWNldC5nZXRFbGVtZW50KCkuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhTRENvbnN0YW50cy5NQVhFWENMVVNJVkVfRUxFTUVOVF9UQUcpIHx8IG1heEZhY2V0LmdldEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLk1BWElOQ0xVU0lWRV9FTEVNRU5UX1RBRykpCi0gICAgICB7Ci0gICAgICAgIG1heExlbmd0aFRleHQuc2V0VGV4dChtYXhGYWNldC5nZXRMZXhpY2FsVmFsdWUoKSk7Ci0gICAgICAgIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRTZWxlY3Rpb24obWF4RmFjZXQuaXNJbmNsdXNpdmUoKSk7Ci0gICAgICAgIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBtYXhMZW5ndGhUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgc3VwZXIuZG9IYW5kbGVFdmVudChldmVudCk7Ci0gICAgQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLSAgICBib29sZWFuIGRvVXBkYXRlTWF4ID0gZmFsc2UsIGRvVXBkYXRlTWluID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBkb1NldElucHV0ID0gZmFsc2U7Ci0gICAgCi0gICAgU3RyaW5nIG1pblZhbHVlID0gbWluTGVuZ3RoVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgIFN0cmluZyBtYXhWYWx1ZSA9IG1heExlbmd0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQotICAgIFhTRExlbmd0aEZhY2V0IGxlbmd0aEZhY2V0ID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TGVuZ3RoRmFjZXQoKTsKLSAgICBYU0RNaW5MZW5ndGhGYWNldCBtaW5MZW5ndGhGYWNldCA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE1pbkxlbmd0aEZhY2V0KCk7Ci0gICAgWFNETWF4TGVuZ3RoRmFjZXQgbWF4TGVuZ3RoRmFjZXQgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRNYXhMZW5ndGhGYWNldCgpOwotICAgIAotICAgIFhTRE1pbkluY2x1c2l2ZUZhY2V0IG1pbkluY2x1c2l2ZUZhY2V0ID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TWluSW5jbHVzaXZlRmFjZXQoKTsKLSAgICBYU0RNaW5FeGNsdXNpdmVGYWNldCBtaW5FeGNsdXNpdmVGYWNldCA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE1pbkV4Y2x1c2l2ZUZhY2V0KCk7Ci0gICAgWFNETWF4SW5jbHVzaXZlRmFjZXQgbWF4SW5jbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRNYXhJbmNsdXNpdmVGYWNldCgpOwotICAgIFhTRE1heEV4Y2x1c2l2ZUZhY2V0IG1heEV4Y2x1c2l2ZUZhY2V0ID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TWF4RXhjbHVzaXZlRmFjZXQoKTsKLQotICAgIFN0cmluZyBjdXJyZW50TWluSW5jbHVzaXZlID0gbnVsbCwgY3VycmVudE1pbkV4Y2x1c2l2ZSA9IG51bGwsIGN1cnJlbnRNYXhJbmNsdXNpdmUgPSBudWxsLCBjdXJyZW50TWF4RXhjbHVzaXZlID0gbnVsbDsKLSAgICBpZiAobWluSW5jbHVzaXZlRmFjZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjdXJyZW50TWluSW5jbHVzaXZlID0gbWluSW5jbHVzaXZlRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgfQotICAgIGlmIChtaW5FeGNsdXNpdmVGYWNldCAhPSBudWxsKQotICAgIHsKLSAgICAgIGN1cnJlbnRNaW5FeGNsdXNpdmUgPSBtaW5FeGNsdXNpdmVGYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICB9Ci0gICAgaWYgKG1heEluY2x1c2l2ZUZhY2V0ICE9IG51bGwpCi0gICAgewotICAgICAgY3VycmVudE1heEluY2x1c2l2ZSA9IG1heEluY2x1c2l2ZUZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgIH0KLSAgICBpZiAobWF4RXhjbHVzaXZlRmFjZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjdXJyZW50TWF4RXhjbHVzaXZlID0gbWF4RXhjbHVzaXZlRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgfQotICAgIAotICAgIFN0cmluZyBjdXJyZW50TGVuZ3RoID0gbnVsbCwgY3VycmVudE1pbiA9IG51bGwsIGN1cnJlbnRNYXggPSBudWxsOwotICAgIGlmIChsZW5ndGhGYWNldCAhPSBudWxsKQotICAgIHsKLSAgICAgIGN1cnJlbnRMZW5ndGggPSBsZW5ndGhGYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICB9Ci0gICAgaWYgKG1pbkxlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgewotICAgICAgY3VycmVudE1pbiA9IG1pbkxlbmd0aEZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgIH0KLSAgICBpZiAobWF4TGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjdXJyZW50TWF4ID0gbWF4TGVuZ3RoRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgfQotICAgIAotICAgIGlmIChldmVudC53aWRnZXQgPT0gbWluTGVuZ3RoVGV4dCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKG1pblZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNOdW1lcmljQmFzZVR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgTnVtYmVyIGJpZyA9IG5ldyBCaWdJbnRlZ2VyKG1pblZhbHVlKTsKLSAgICAgICAgICAgIGJpZy50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKG1pbkxlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChtaW5WYWx1ZS5lcXVhbHMoY3VycmVudE1pbikgfHwgbWluVmFsdWUuZXF1YWxzKGN1cnJlbnRMZW5ndGgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKG1heFZhbHVlICE9IG51bGwgJiYgbWluVmFsdWUuZXF1YWxzKG1heFZhbHVlKSAmJiBsZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigiZG91YmxlIikuZXF1YWxzKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEJhc2VUeXBlKCkpIHx8IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJmbG9hdCIpLmVxdWFscyh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZSgpKSB8fCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigiZGVjaW1hbCIpLmVxdWFscyh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZSgpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBCaWdEZWNpbWFsIGJpZ0RlY2ltYWwgPSBuZXcgQmlnRGVjaW1hbChtaW5WYWx1ZSk7Ci0gICAgICAgICAgICAgIGJpZ0RlY2ltYWwudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgaWYgKCAoY3VycmVudE1pbkluY2x1c2l2ZSAhPSBudWxsICYmIG1pblZhbHVlLmVxdWFscyhjdXJyZW50TWluSW5jbHVzaXZlKSkgfHwKLSAgICAgICAgICAgICAgICAgICAoY3VycmVudE1pbkV4Y2x1c2l2ZSAhPSBudWxsICYmIG1pblZhbHVlLmVxdWFscyhjdXJyZW50TWluRXhjbHVzaXZlKSkgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE51bWJlciBiaWcgPSBuZXcgQmlnSW50ZWdlcihtaW5WYWx1ZSk7Ci0gICAgICAgICAgICAgIGJpZy50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNOdW1lcmljQmFzZVR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGN1cnJlbnRNaW4gPT0gbnVsbCAmJiBjdXJyZW50TGVuZ3RoID09IG51bGwpCi0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50TWluSW5jbHVzaXZlID09IG51bGwgJiYgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50TWluRXhjbHVzaXZlID09IG51bGwgJiYgIW1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgbWluVmFsdWUgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGRvVXBkYXRlTWluID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy8gVE9ETyBzaG93IGVycm9yIG1lc3NhZ2UKLSAgICAgICAgZG9VcGRhdGVNaW4gPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBtYXhMZW5ndGhUZXh0KQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpZiAobWF4VmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc051bWVyaWNCYXNlVHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBOdW1iZXIgYmlnID0gbmV3IEJpZ0ludGVnZXIobWF4VmFsdWUpOwotICAgICAgICAgICAgYmlnLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAobWF4TGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKG1heFZhbHVlLmVxdWFscyhjdXJyZW50TWF4KSB8fCBtYXhWYWx1ZS5lcXVhbHMoY3VycmVudExlbmd0aCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAobWluVmFsdWUgIT0gbnVsbCAmJiBtYXhWYWx1ZS5lcXVhbHMobWluVmFsdWUpICYmIGxlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJkb3VibGUiKS5lcXVhbHMoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0QmFzZVR5cGUoKSkgfHwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oImZsb2F0IikuZXF1YWxzKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEJhc2VUeXBlKCkpIHx8IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJkZWNpbWFsIikuZXF1YWxzKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEJhc2VUeXBlKCkpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEJpZ0RlY2ltYWwgYmlnRGVjaW1hbCA9IG5ldyBCaWdEZWNpbWFsKG1heFZhbHVlKTsKLSAgICAgICAgICAgICAgYmlnRGVjaW1hbC50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBOdW1iZXIgYmlnID0gbmV3IEJpZ0ludGVnZXIobWF4VmFsdWUpOwotICAgICAgICAgICAgICBiaWcudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzTnVtZXJpY0Jhc2VUeXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50TWF4ID09IG51bGwgJiYgY3VycmVudExlbmd0aCA9PSBudWxsKQotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudE1heEluY2x1c2l2ZSA9PSBudWxsICYmIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudE1heEV4Y2x1c2l2ZSA9PSBudWxsICYmICFtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbWF4VmFsdWUgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgZG9VcGRhdGVNYXggPSB0cnVlOwotICAgICAgfQotICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBkb1VwZGF0ZU1heCA9IGZhbHNlOwotICAgICAgICAvLyBUT0RPIHNob3cgZXJyb3IgbWVzc2FnZQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLmVxdWFscyh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSkgJiYgKGRvVXBkYXRlTWF4IHx8IGRvVXBkYXRlTWluKSkKLSAgICB7Ci0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBhbm9ueW1vdXNTaW1wbGVUeXBlID0gbnVsbDsKLSAgICAgIENvbXBvdW5kQ29tbWFuZCBjb21wb3VuZENvbW1hbmQgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0gICAgICBDaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQgY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kID0gbnVsbDsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREZlYXR1cmUpCi0gICAgICB7Ci0gICAgICAgIGFub255bW91c1NpbXBsZVR5cGUgPSBYU0RDb21tb25VSVV0aWxzLmdldEFub255bW91c1NpbXBsZVR5cGUoKFhTREZlYXR1cmUpaW5wdXQsIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgaWYgKGFub255bW91c1NpbXBsZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGFub255bW91c1NpbXBsZVR5cGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgIGFub255bW91c1NpbXBsZVR5cGUuc2V0QmFzZVR5cGVEZWZpbml0aW9uKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAKLSAgICAgICAgICBjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQgPSBuZXcgQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ09OU1RSQUlOX0xFTkdUSCwgKFhTREZlYXR1cmUpaW5wdXQpOwotICAgICAgICAgIGNoYW5nZVRvQW5vbnltb3VzQ29tbWFuZC5zZXRBbm9ueW1vdXNTaW1wbGVUeXBlKGFub255bW91c1NpbXBsZVR5cGUpOwotICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQoY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kKTsKLSAgICAgICAgICBkb1NldElucHV0ID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNOdW1lcmljQmFzZVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBVcGRhdGVTdHJpbmdMZW5ndGhGYWNldENvbW1hbmQgdXBkYXRlQ29tbWFuZCA9IG5ldyBVcGRhdGVTdHJpbmdMZW5ndGhGYWNldENvbW1hbmQoIiIsIGFub255bW91c1NpbXBsZVR5cGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKGRvVXBkYXRlTWF4KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWF4KG1heFZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRvVXBkYXRlTWluKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWluKG1pblZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29tcG91bmRDb21tYW5kLmFkZCh1cGRhdGVDb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBVcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kIHVwZGF0ZUNvbW1hbmQgPSBuZXcgVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9CT1VORFMsIGFub255bW91c1NpbXBsZVR5cGUsIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSwgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICBpZiAoZG9VcGRhdGVNYXgpCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNYXgobWF4VmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZG9VcGRhdGVNaW4pCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNaW4obWluVmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKHVwZGF0ZUNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgIGNvbW1hbmQgPSBjb21wb3VuZENvbW1hbmQ7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBpZiAoIWlzTnVtZXJpY0Jhc2VUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kIHVwZGF0ZUNvbW1hbmQgPSBuZXcgVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kKCIiLCB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAoZG9VcGRhdGVNYXgpCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNYXgobWF4VmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZG9VcGRhdGVNaW4pCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNaW4obWluVmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjb21tYW5kID0gdXBkYXRlQ29tbWFuZDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBVcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kIHVwZGF0ZUNvbW1hbmQgPSBuZXcgVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9CT1VORFMsIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLCBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCksIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgaWYgKGRvVXBkYXRlTWF4KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWF4KG1heFZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRvVXBkYXRlTWluKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWluKG1pblZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29tbWFuZCA9IHVwZGF0ZUNvbW1hbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICghaXNOdW1lcmljQmFzZVR5cGUpCi0gICAgICB7Ci0gICAgICAgIFVwZGF0ZVN0cmluZ0xlbmd0aEZhY2V0Q29tbWFuZCB1cGRhdGVDb21tYW5kID0gbmV3IFVwZGF0ZVN0cmluZ0xlbmd0aEZhY2V0Q29tbWFuZCgiIiwgeHNkU2ltcGxlVHlwZURlZmluaXRpb24pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChkb1VwZGF0ZU1heCkKLSAgICAgICAgewotICAgICAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWF4KG1heFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZG9VcGRhdGVNaW4pCi0gICAgICAgIHsKLSAgICAgICAgICB1cGRhdGVDb21tYW5kLnNldE1pbihtaW5WYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh1cGRhdGVDb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZCB1cGRhdGVDb21tYW5kID0gbmV3IFVwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfQk9VTkRTLCB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiwgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpLCBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBpZiAoZG9VcGRhdGVNYXgpCi0gICAgICAgIHsKLSAgICAgICAgICB1cGRhdGVDb21tYW5kLnNldE1heChtYXhWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRvVXBkYXRlTWluKQotICAgICAgICB7Ci0gICAgICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNaW4obWluVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUodXBkYXRlQ29tbWFuZCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgcmVmcmVzaCgpOwotICAgIGlmIChkb1NldElucHV0KQotICAgICAgc2V0SW5wdXQoZ2V0UGFydCgpLCBnZXRTZWxlY3Rpb24oKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uKQotICAgIHsKLSAgICAgICBDb21wb3VuZENvbW1hbmQgY29tcG91bmRDb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGFub255bW91c1NpbXBsZVR5cGUgPSBudWxsOwotICAgICAgIGlmIChYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICB7Ci0gICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RGZWF0dXJlKQotICAgICAgICAgewotICAgICAgICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlID0gWFNEQ29tbW9uVUlVdGlscy5nZXRBbm9ueW1vdXNTaW1wbGVUeXBlKChYU0RGZWF0dXJlKWlucHV0LCB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbik7Ci0gICAgICAgICAgIGlmIChhbm9ueW1vdXNTaW1wbGVUeXBlID09IG51bGwpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlLnNldEJhc2VUeXBlRGVmaW5pdGlvbih4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbik7Ci0gICAgICAgICAgIAotICAgICAgICAgICAgIENoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZCBjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQgPSBuZXcgQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ09OU1RSQUlOX0xFTkdUSCwgKFhTREZlYXR1cmUpaW5wdXQpOwotICAgICAgICAgICAgIGNoYW5nZVRvQW5vbnltb3VzQ29tbWFuZC5zZXRBbm9ueW1vdXNTaW1wbGVUeXBlKGFub255bW91c1NpbXBsZVR5cGUpOwotICAgICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQoY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kKTsKLSAgICAgICAgICAgfQotICAKLSAgICAgICAgICAgVXBkYXRlWFNEV2hpdGVTcGFjZUZhY2V0Q29tbWFuZCB3aGl0ZVNwYWNlQ29tbWFuZCA9IG5ldyBVcGRhdGVYU0RXaGl0ZVNwYWNlRmFjZXRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ09MTEFQU0VfV0hJVEVTUEFDRSwgYW5vbnltb3VzU2ltcGxlVHlwZSwgY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgY29tcG91bmRDb21tYW5kLmFkZCh3aGl0ZVNwYWNlQ29tbWFuZCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21wb3VuZENvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgICBzZXRJbnB1dChnZXRQYXJ0KCksIGdldFNlbGVjdGlvbigpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgVXBkYXRlWFNEV2hpdGVTcGFjZUZhY2V0Q29tbWFuZCB3aGl0ZVNwYWNlQ29tbWFuZCA9IG5ldyBVcGRhdGVYU0RXaGl0ZVNwYWNlRmFjZXRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ09MTEFQU0VfV0hJVEVTUEFDRSwgeHNkU2ltcGxlVHlwZURlZmluaXRpb24sIGNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUod2hpdGVTcGFjZUNvbW1hbmQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3gpCi0gICAgewotICAgICAgU3RyaW5nIG1pblZhbHVlID0gbWluTGVuZ3RoVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgaWYgKG1pblZhbHVlLmxlbmd0aCgpID09IDApIG1pblZhbHVlID0gbnVsbDsKLQotICAgICAgVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZCB1cGRhdGVDb21tYW5kID0gbmV3IFVwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfQk9VTkRTLCB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiwgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpLCBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNaW4obWluVmFsdWUpOwotICAgICAgCi0gICAgICBpZiAobWluVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh1cGRhdGVDb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94KQotICAgIHsKLSAgICAgIFN0cmluZyBtYXhWYWx1ZSA9IG1heExlbmd0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgIGlmIChtYXhWYWx1ZS5sZW5ndGgoKSA9PSAwKSBtYXhWYWx1ZSA9IG51bGw7Ci0gICAgICBVcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kIHVwZGF0ZUNvbW1hbmQgPSBuZXcgVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9CT1VORFMsIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLCBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCksIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICB1cGRhdGVDb21tYW5kLnNldE1heChtYXhWYWx1ZSk7Ci0gICAgICBpZiAobWF4VmFsdWUgIT0gbnVsbCkKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh1cGRhdGVDb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gdXNlRW51bWVyYXRpb25zQnV0dG9uKQotICAgIHsKLSAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LmFkZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkpCi0gICAgICB7Ci0gICAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LnNldENvbnN0cmFpbnRLaW5kKFNwZWNpZmljQ29uc3RyYWludHNXaWRnZXQuRU5VTUVSQVRJT04pOwotICAgICAgICBjb25zdHJhaW50S2luZCA9IGNvbnN0cmFpbnRzV2lkZ2V0LmdldENvbnN0cmFpbnRLaW5kKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHVzZVBhdHRlcm5zQnV0dG9uKQotICAgIHsKLSAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LmFkZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIGlmIChpc0xpc3RlbmVyRW5hYmxlZCgpKQotICAgICAgewotICAgICAgICBjb25zdHJhaW50c1dpZGdldC5zZXRDb25zdHJhaW50S2luZChTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0LlBBVFRFUk4pOwotICAgICAgICBjb25zdHJhaW50S2luZCA9IGNvbnN0cmFpbnRzV2lkZ2V0LmdldENvbnN0cmFpbnRLaW5kKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERmFjZXRTZWN0aW9uRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREZhY2V0U2VjdGlvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGM1N2M1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERmFjZXRTZWN0aW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0RGYWNldFNlY3Rpb25GaWx0ZXIgaW1wbGVtZW50cyBJRmlsdGVyCi17Ci0gIHB1YmxpYyBib29sZWFuIHNlbGVjdChPYmplY3QgdG9UZXN0KQotICB7Ci0gICAgaWYgKHRvVGVzdCBpbnN0YW5jZW9mIFhTREZlYXR1cmUpCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9ICgoWFNERmVhdHVyZSl0b1Rlc3QpLmdldFJlc29sdmVkRmVhdHVyZSgpLmdldFR5cGUoKTsKLSAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICh0b1Rlc3QgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbil0b1Rlc3Q7Ci0gICAgICBpZiAoc3QuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hIHx8Ci0gICAgICAgICAgc3QuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNERmVhdHVyZSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RJbXBvcnRTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREltcG9ydFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyNjNlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREltcG9ydFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxDaGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRERpcmVjdGl2ZXNTY2hlbWFMb2NhdGlvblVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTREltcG9ydFNlY3Rpb24gZXh0ZW5kcyBTY2hlbWFMb2NhdGlvblNlY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFRleHQgbmFtZXNwYWNlVGV4dCwgcHJlZml4VGV4dDsKLSAgcHJvdGVjdGVkIFN0cmluZyBvbGRQcmVmaXhWYWx1ZTsKLQotICBwdWJsaWMgWFNESW1wb3J0U2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotICAgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0KLSAgICAvLyBDcmVhdGUgU2NoZW1hIExvY2F0aW9uIExhYmVsCi0gICAgQ0xhYmVsIG5hbWVzcGFjZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9OQU1FU1BBQ0UiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBuYW1lc3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgbmFtZXNwYWNlVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotICAgIG5hbWVzcGFjZVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgYXBwbHlBbGxMaXN0ZW5lcnMobmFtZXNwYWNlVGV4dCk7Ci0gICAgbmFtZXNwYWNlVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRHVtbXlMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBDTGFiZWwgcHJlZml4TGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1BSRUZJWCIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBwcmVmaXhMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgcHJlZml4VGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotICAgIHByZWZpeFRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0gICAgYXBwbHlBbGxMaXN0ZW5lcnMocHJlZml4VGV4dCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBwcmVmaXhUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBEdW1teUxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIENyZWF0ZSBTY2hlbWEgTG9jYXRpb24gTGFiZWwKLSAgICBDTGFiZWwgc2NoZW1hTG9jYXRpb25MYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfU0NIRU1BX0xPQ0FUSU9OIikpOyAvLyROT04tTkxTLTEkCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIHNjaGVtYUxvY2F0aW9uTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIENyZWF0ZSBTY2hlbWEgTG9jYXRpb24gVGV4dAotICAgIHNjaGVtYUxvY2F0aW9uVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotICAgIHNjaGVtYUxvY2F0aW9uVGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyhzY2hlbWFMb2NhdGlvblRleHQpOwotCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBzY2hlbWFMb2NhdGlvblRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIENyZWF0ZSBXaXphcmQgQnV0dG9uCi0gICAgd2l6YXJkQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLSAgICB3aXphcmRCdXR0b24uc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9icm93c2VidXR0b24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIHdpemFyZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHdpemFyZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIC8vIGVycm9yIHRleHQKLSAgICBlcnJvclRleHQgPSBuZXcgU3R5bGVkVGV4dChjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICBlcnJvclRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgIGVycm9yVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICBlcnJvclRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZXJyb3JUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNjaGVtYUxvY2F0aW9uVGV4dCwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fSU1QT1JUX19TQ0hFTUFMT0NBVElPTik7Ci0KLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5hbWVzcGFjZVRleHQsCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0lNUE9SVF9fTkFNRVNQQUNFKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHByZWZpeFRleHQsCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0lNUE9SVF9fUFJFRklYKTsKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCi0gICAgZXJyb3JUZXh0LnNldFRleHQoIiIpOwotICAgIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNESW1wb3J0KQotICAgIHsKLSAgICAgIGVsZW1lbnQgPSAoKFhTREltcG9ydCkgaW5wdXQpLmdldEVsZW1lbnQoKTsKLQotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lc3BhY2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInNjaGVtYUxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gaGVscGVyLmdldFByZWZpeChlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSksIGZhbHNlKTsKLQotICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotCi0gICAgICBpZiAocHJlZml4ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHByZWZpeCA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIGlmIChzY2hlbWFMb2NhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICBzY2hlbWFMb2NhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dChuYW1lc3BhY2UpOwotICAgICAgcHJlZml4VGV4dC5zZXRUZXh0KHByZWZpeCk7Ci0gICAgICBzY2hlbWFMb2NhdGlvblRleHQuc2V0VGV4dChzY2hlbWFMb2NhdGlvbik7Ci0gICAgICBvbGRQcmVmaXhWYWx1ZSA9IHByZWZpeFRleHQuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSB3aXphcmRCdXR0b24pCi0gICAgewotICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICAgIAotICAgICAgWFNERGlyZWN0aXZlc1NjaGVtYUxvY2F0aW9uVXBkYXRlci51cGRhdGVTY2hlbWFMb2NhdGlvbih4c2RTY2hlbWEsaW5wdXQsZmFsc2UpOwotICAgICAgcmVmcmVzaCgpOwotICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICAgICAgcHJlZml4VGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgIHN1cGVyLmRvSGFuZGxlRXZlbnQoZXZlbnQpOwotICAgIGlmIChldmVudC53aWRnZXQgPT0gcHJlZml4VGV4dCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmV3UHJlZml4ID0gcHJlZml4VGV4dC5nZXRUZXh0KCk7Ci0gICAgICBpZiAob2xkUHJlZml4VmFsdWUuZXF1YWxzKG5ld1ByZWZpeCkgfHwgIWlzVmFsaWRTY2hlbWFMb2NhdGlvbikKLSAgICAgICAgcmV0dXJuOwotICAgICAgTWFwIG1hcCA9IHhzZFNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICBTdHJpbmcga2V5ID0gcHJlZml4VGV4dC5nZXRUZXh0KCk7ICAgICAgCi0gICAgICBpZiAoa2V5Lmxlbmd0aCgpID09IDApIGtleSA9IG51bGw7Ci0gICAgICAKLSAgICAgIGlmICh2YWxpZGF0ZVByZWZpeChuZXdQcmVmaXgpICYmIHNjaGVtYUxvY2F0aW9uVGV4dC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgaWYgKG1hcC5jb250YWluc0tleShrZXkpKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9FUlJPUl9MQUJFTF9QUkVGSVhfRVhJU1RTIikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IHhzZFNjaGVtYS5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAob2xkUHJlZml4VmFsdWUubGVuZ3RoKCkgPT0gMCkgCi0gICAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxucyIpOwotICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoInhtbG5zOiIrb2xkUHJlZml4VmFsdWUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzY2hlbWFFbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnM6IiArIG5ld1ByZWZpeCwgbmFtZXNwYWNlVGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzY2hlbWFFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgieG1sbnM6IitvbGRQcmVmaXhWYWx1ZSk7Ci0gICAgICAgICAgICBzY2hlbWFFbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnMiLCBuYW1lc3BhY2VUZXh0LmdldFRleHQoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHhzZFNjaGVtYS51cGRhdGVFbGVtZW50KCk7Ci0gICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgICAgIG9sZFByZWZpeFZhbHVlID0gbmV3UHJlZml4OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfRVJST1JfTEFCRUxfSU5WQUxJRF9QUkVGSVgiKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgYWJvdXRUb0JlSGlkZGVuKCkKLSAgewotICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICBzdXBlci5hYm91dFRvQmVIaWRkZW4oKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQcmVmaXgoU3RyaW5nIHByZWZpeCkKLSAgewotICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIFhNTENoYXIuaXNWYWxpZE5DTmFtZShwcmVmaXgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRE1vZGVsR3JvdXBEZWZpbml0aW9uU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RNb2RlbEdyb3VwRGVmaW5pdGlvblNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjMWIzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRE1vZGVsR3JvdXBEZWZpbml0aW9uU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuWE1MQ2hhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVOYW1lQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uU2VjdGlvbiBleHRlbmRzIE11bHRpcGxpY2l0eVNlY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0gIHByb3RlY3RlZCBDQ29tYm8gY29tcG9uZW50TmFtZUNvbWJvOwotICBib29sZWFuIGlzUmVmZXJlbmNlOwotCi0gIHB1YmxpYyBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvblNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgaWYgKGlzUmVmZXJlbmNlKQotICAgIHsKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gUmVmIExhYmVsCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgICBDTGFiZWwgcmVmTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUgKyAiOiIpOyAvLyROT04tTkxTLTEkCi0gICAgICByZWZMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIFJlZiBDb21ibwotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLSAgICAgIGNvbXBvbmVudE5hbWVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgIAotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb25lbnROYW1lQ29tYm8sCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9SRUZTX19SRUYpOwotICAgICAgCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIG1pbiBwcm9wZXJ0eQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgCi0gICAgCQkgIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzLlVJX0xBQkVMX01JTk9DQ1VSUyk7Ci0gICAgICAKLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLSAgICAgIG1pbkNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICAgIG1pbkNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICBtaW5Db21iby5hZGQoIjAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgbWluQ29tYm8uYWRkKCIxIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGFwcGx5QWxsTGlzdGVuZXJzKG1pbkNvbWJvKTsKLSAgICAgIG1pbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG1pbkNvbWJvLAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX01PREVMR1JPVVBfX01JTl9PQ0NVUkVOQ0UpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIG1heCBwcm9wZXJ0eQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgCi0gICAgCQkgIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzLlVJX0xBQkVMX01BWE9DQ1VSUyk7Ci0KLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLSAgICAgIG1heENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICAgIG1heENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICBtYXhDb21iby5hZGQoIjAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgbWF4Q29tYm8uYWRkKCIxIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG1heENvbWJvLmFkZCgidW5ib3VuZGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGFwcGx5QWxsTGlzdGVuZXJzKG1heENvbWJvKTsKLSAgICAgIG1heENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG1heENvbWJvLAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX01PREVMR1JPVVBfX01BWF9PQ0NVUkVOQ0UpOwotICAgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIE5hbWVMYWJlbAotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgICAgQ0xhYmVsIG5hbWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRSk7Ci0gICAgICBuYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBOYW1lVGV4dAotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIG5hbWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICBhcHBseUFsbExpc3RlbmVycyhuYW1lVGV4dCk7Ci0gICAgICAKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmFtZVRleHQsCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9ERUZJTklUSU9OX19OQU1FKTsKLQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBSZWZhY3Rvci9yZW5hbWUgaHlwZXJsaW5rIAotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBpZiAoIWhpZGVIeXBlckxpbmspCi0gICAgICB7Ci0gICAgICAgIGNyZWF0ZVJlbmFtZUh5cGVybGluayhjb21wb3NpdGUpOwotICAgICAgICBzZXRSZW5hbWVIeXBlcmxpbmtFbmFibGVkKCFpc1JlZmVyZW5jZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0KLSAgICBpZiAoaXNSZWFkT25seSkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCi0gICAgWFNETmFtZWRDb21wb25lbnQgbmFtZWRDb21wb25lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpIGlucHV0OwotCi0gICAgaWYgKGlzUmVmZXJlbmNlKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG5hbWVkQ29tcG9uZW50LmdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSk7Ci0gICAgICAgIGlmIChhdHRyVmFsdWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGF0dHJWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnNldFRleHQoYXR0clZhbHVlKTsKLQotICAgICAgICAvLyByZWZyZXNoIG1pbiBtYXgKLSAgICAgICAgaWYgKG1pbkNvbWJvICE9IG51bGwgJiYgbWF4Q29tYm8gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlZnJlc2hNaW5NYXgoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gcmVmcmVzaCBuYW1lCi0gICAgICBuYW1lVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICBTdHJpbmcgbmFtZSA9IG5hbWVkQ29tcG9uZW50LmdldE5hbWUoKTsKLSAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5hbWVUZXh0LnNldFRleHQobmFtZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBzdXBlci5zZXRJbnB1dChwYXJ0LCBzZWxlY3Rpb24pOwotICAgIGluaXQoKTsKLSAgICByZWxheW91dCgpOwotICAgIAotICAgIGlmIChpc1JlZmVyZW5jZSkKLSAgICB7Ci0gICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICAgIExpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBpdGVtcyA9IGhlbHBlci5nZXRNb2RlbEdyb3VwcygpOwotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGdyb3VwID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gZ3JvdXAuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpdGVtcy5yZW1vdmUoKChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbilwYXJlbnQpLmdldFFOYW1lKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRDb250YWluZXIoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaXRlbXMuYWRkKDAsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnNldEl0ZW1zKChTdHJpbmcgW10paXRlbXMudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBncm91cCA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICBpc1JlZmVyZW5jZSA9IGdyb3VwLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKTsKLSAgICAgIGhpZGVIeXBlckxpbmsgPSBpc1JlZmVyZW5jZTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWxheW91dCgpCi0gIHsKLSAgICBDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlID0gY29tcG9zaXRlLmdldFBhcmVudCgpOwotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5zZXRSZWRyYXcoZmFsc2UpOwotCi0gICAgaWYgKHBhcmVudENvbXBvc2l0ZSAhPSBudWxsICYmICFwYXJlbnRDb21wb3NpdGUuaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudENvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgY2hpbGRyZW5baV0uZGlzcG9zZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIE5vdyBpbml0aWFsaXplIHRoZSBuZXcgaGFuZGxlcgotICAgIGNyZWF0ZUNvbnRlbnRzKHBhcmVudENvbXBvc2l0ZSk7Ci0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLmxheW91dCh0cnVlLCB0cnVlKTsKLQotICAgIC8vIE5vdyB0dXJuIHBhaW50aW5nIGJhY2sgb24KLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkuc2V0UmVkcmF3KHRydWUpOwotICAgIHJlZnJlc2goKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBzdXBlci5kb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IG5hbWVUZXh0KQotICAgIHsKLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgWFNETmFtZWRDb21wb25lbnQgbmFtZWRDb21wb25lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpIGlucHV0OwotICAgICAgICBpZiAoIXZhbGlkYXRlU2VjdGlvbigpKQotICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBhbiBhY3R1YWwgbmFtZSBjaGFuZ2UgaGFzIHRha2VuIHBsYWNlCi0gICAgICAgIFN0cmluZyBvbGROYW1lID0gbmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGROYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIGNvbW1hbmQgPSBuZXcgVXBkYXRlTmFtZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9SRU5BTUUsIG5hbWVkQ29tcG9uZW50LCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsICYmIGdldENvbW1hbmRTdGFjaygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGRvUmVmZXJlbnRpYWxJbnRlZ3JpdHlDaGVjayhuYW1lZENvbXBvbmVudCwgbmV3VmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU2VjdGlvbigpCi0gIHsKLSAgICBpZiAobmFtZVRleHQgPT0gbnVsbCB8fCBuYW1lVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLQotICAgIFN0cmluZyBuYW1lID0gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQotICAgIC8vIHZhbGlkYXRlIGFnYWluc3QgTkNOYW1lCi0gICAgaWYgKG5hbWUubGVuZ3RoKCkgPCAxIHx8ICFYTUxDaGFyLmlzVmFsaWROQ05hbWUobmFtZSkpCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLl9VSV9FUlJPUl9JTlZBTElEX05BTUUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gY29tcG9uZW50TmFtZUNvbWJvKQotICAgIHsKLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IGNvbXBvbmVudE5hbWVDb21iby5nZXRUZXh0KCk7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgWFNETmFtZWRDb21wb25lbnQgbmFtZWRDb21wb25lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpaW5wdXQ7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG5hbWVkQ29tcG9uZW50LmdldEVsZW1lbnQoKTsKLQotICAgICAgICBpZiAobmFtZWRDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgWFNERGlyZWN0aXZlc01hbmFnZXIucmVtb3ZlVW51c2VkWFNESW1wb3J0cyhuYW1lZENvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIuZG9XaWRnZXRTZWxlY3RlZChlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBpZiAobmFtZVRleHQgIT0gbnVsbCAmJiAhbmFtZVRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmVtb3ZlTGlzdGVuZXJzKG5hbWVUZXh0KTsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNETW9kZWxHcm91cFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNETW9kZWxHcm91cFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY5NWY3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRE1vZGVsR3JvdXBTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlQ29udGVudE1vZGVsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgWFNETW9kZWxHcm91cFNlY3Rpb24gZXh0ZW5kcyBNdWx0aXBsaWNpdHlTZWN0aW9uCi17Ci0gIHByb3RlY3RlZCBDQ29tYm8gbW9kZWxHcm91cENvbWJvOwotICBwcml2YXRlIFN0cmluZ1tdIG1vZGVsR3JvdXBDb21ib1ZhbHVlcyA9IHsgInNlcXVlbmNlIiwgImNob2ljZSIsICJhbGwiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLSAgcHVibGljIFhTRE1vZGVsR3JvdXBTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5hbWVMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLlVJX0xBQkVMX0tJTkQpOwotICAgIG5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gTmFtZVRleHQKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIG1vZGVsR3JvdXBDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgbW9kZWxHcm91cENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgbW9kZWxHcm91cENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIG1vZGVsR3JvdXBDb21iby5zZXRJdGVtcyhtb2RlbEdyb3VwQ29tYm9WYWx1ZXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobW9kZWxHcm91cENvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19NT0RFTEdST1VQX19LSU5EKTsKLQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gbWluIHByb3BlcnR5Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLlVJX0xBQkVMX01JTk9DQ1VSUyk7Ci0gICAgCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgIG1pbkNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICBtaW5Db21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIG1pbkNvbWJvLmFkZCgiMCIpOyAvLyROT04tTkxTLTEkCi0gICAgbWluQ29tYm8uYWRkKCIxIik7IC8vJE5PTi1OTFMtMSQKLSAgICBhcHBseUFsbExpc3RlbmVycyhtaW5Db21ibyk7Ci0gICAgbWluQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChtaW5Db21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9fTUlOX09DQ1VSRU5DRSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBtYXggcHJvcGVydHkKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuVUlfTEFCRUxfTUFYT0NDVVJTKTsKLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICBtYXhDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgbWF4Q29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBtYXhDb21iby5hZGQoIjAiKTsgLy8kTk9OLU5MUy0xJAotICAgIG1heENvbWJvLmFkZCgiMSIpOyAvLyROT04tTkxTLTEkCi0gICAgbWF4Q29tYm8uYWRkKCJ1bmJvdW5kZWQiKTsgLy8kTk9OLU5MUy0xJAotICAgIGFwcGx5QWxsTGlzdGVuZXJzKG1heENvbWJvKTsKLSAgICBtYXhDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG1heENvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19NT0RFTEdST1VQX19NQVhfT0NDVVJFTkNFKTsKLSAgfQotCi0gIAotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2goKTsKLQotICAgIGlmIChpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLQotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0KLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgewotICAgICAgICBYU0RNb2RlbEdyb3VwIHBhcnRpY2xlID0gKFhTRE1vZGVsR3JvdXApaW5wdXQ7Ci0gICAgICAgIFN0cmluZyBtb2RlbFR5cGUgPSBwYXJ0aWNsZS5nZXRDb21wb3NpdG9yKCkuZ2V0TmFtZSgpOwotICAgICAgICBtb2RlbEdyb3VwQ29tYm8uc2V0VGV4dChtb2RlbFR5cGUpOwotICAgICAgICAKLSAgICAgICAgbWluQ29tYm8uc2V0RW5hYmxlZCghKHBhcnRpY2xlLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSk7Ci0gICAgICAgIG1heENvbWJvLnNldEVuYWJsZWQoIShwYXJ0aWNsZS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZWZyZXNoTWluTWF4KCk7Ci0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIFhTRE1vZGVsR3JvdXAgcGFydGljbGUgPSAoWFNETW9kZWxHcm91cClpbnB1dDsKLSAgICBpZiAoZS53aWRnZXQgPT0gbW9kZWxHcm91cENvbWJvKQotICAgIHsKLSAgICAgIFhTRENvbXBvc2l0b3IgbmV3VmFsdWUgPSBYU0RDb21wb3NpdG9yLmdldChtb2RlbEdyb3VwQ29tYm8uZ2V0VGV4dCgpKTsKLSAgICAgIFVwZGF0ZUNvbnRlbnRNb2RlbENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVDb250ZW50TW9kZWxDb21tYW5kKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0FDVElPTl9DSEFOR0VfQ09OVEVOVF9NT0RFTCwgcGFydGljbGUsIG5ld1ZhbHVlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIHN1cGVyLmRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKG1pbkNvbWJvICE9IG51bGwgJiYgIW1pbkNvbWJvLmlzRGlzcG9zZWQoKSkKLSAgICAgIG1pbkNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGlmIChtYXhDb21ibyAhPSBudWxsICYmICFtYXhDb21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgICBtYXhDb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEU2NoZW1hQWR2YW5jZWRTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNjaGVtYUFkdmFuY2VkU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTAyOTI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEU2NoZW1hQWR2YW5jZWRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFBZHZhbmNlZFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgSVdvcmtiZW5jaFBhcnQgcGFydDsKLSAgcHJvdGVjdGVkIENMYWJlbCBlbGVtZW50Rm9ybUxhYmVsLCBhdHRyaWJ1dGVGb3JtTGFiZWwsIGJsb2NrRGVmYXVsdExhYmVsLCBmaW5hbERlZmF1bHRMYWJlbDsKLSAgcHJvdGVjdGVkIENDb21ibyBlbGVtZW50Rm9ybUNvbWJvLCBhdHRyaWJ1dGVGb3JtQ29tYm8sIGJsb2NrRGVmYXVsdENvbWJvLCBmaW5hbERlZmF1bHRDb21ibzsgIAotICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZW1wdHlPcHRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgW10gZm9ybVF1YWxpZmljYXRpb24gPSB7IGVtcHR5T3B0aW9uLCBYU0RGb3JtLlFVQUxJRklFRF9MSVRFUkFMLmdldExpdGVyYWwoKSwgCi0gICAgICBYU0RGb3JtLlVOUVVBTElGSUVEX0xJVEVSQUwuZ2V0TGl0ZXJhbCgpIH07ICAvLyROT04tTkxTLTEkCi0KLSAgICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVyaXZlZEJ5Q2hvaWNlc0NvbWJvVmFsdWVzW10gPSB7ICIiLCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIC8vJE5PTi1OTFMtMSQgCi0gICAgICBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHIH07IAotICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgYmxvY2tEZWZhdWx0VmFsdWVzW10gPSB7IGVtcHR5T3B0aW9uLCAiIyIgKyBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHLCAvLyROT04tTkxTLTEkCi0gICAgICBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsCi0gICAgICAic3Vic3RpdHV0aW9uIn07Ci0gIAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBmaW5hbERlZmF1bHRWYWx1ZXNbXSA9IHsgZW1wdHlPcHRpb24sICIjIiArIFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUcsIC8vJE5PTi1OTFMtMSQKLSAgICAgIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgCi0gICAgICBYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHfTsgICAgICAKLQotICBwdWJsaWMgWFNEU2NoZW1hQWR2YW5jZWRTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0gICAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotICAgKi8KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIC8vIENyZWF0ZSBlbGVtZW50Rm9ybURlZmF1bHQgbGFiZWwgYW5kIGNvbWJvICAgICAgIAotICAgIGVsZW1lbnRGb3JtTGFiZWwgPSBYU0RDb21tb25VSVV0aWxzLmdldE5ld1Byb3BlcnRpZXNMYWJlbChjb21wb3NpdGUsZ2V0V2lkZ2V0RmFjdG9yeSgpLAotICAgICAgICBNZXNzYWdlcy5fVUlfTEFCRUxfRUxFTUVOVEZPUk1ERUZBVUxUKTsKLSAgICBlbGVtZW50Rm9ybUNvbWJvID0gWFNEQ29tbW9uVUlVdGlscy5nZXROZXdQcm9wZXJ0aWVzQ29tYm8oY29tcG9zaXRlLGdldFdpZGdldEZhY3RvcnkoKSx0aGlzLAotICAgICAgICBmb3JtUXVhbGlmaWNhdGlvbixYU0RFZGl0b3JDU0hlbHBJZHMuQURWQU5DRV9UQUJfX1NDSEVNQV9FTEVNRU5UX0ZPUk1fREVGQVVMVCk7Ci0KLSAgICAvLyBDcmVhdGUgYXR0cmlidXRlRm9ybURlZmF1bHQgbGFiZWwgYW5kIGNvbWJvCi0gICAgYXR0cmlidXRlRm9ybUxhYmVsID0gWFNEQ29tbW9uVUlVdGlscy5nZXROZXdQcm9wZXJ0aWVzTGFiZWwoY29tcG9zaXRlLGdldFdpZGdldEZhY3RvcnkoKSwKLSAgICAgICAgTWVzc2FnZXMuX1VJX0xBQkVMX0FUVFJJQlVURUZPUk1ERUZBVUxUKTsKLSAgICBhdHRyaWJ1dGVGb3JtQ29tYm8gPSBYU0RDb21tb25VSVV0aWxzLmdldE5ld1Byb3BlcnRpZXNDb21ibyhjb21wb3NpdGUsZ2V0V2lkZ2V0RmFjdG9yeSgpLHRoaXMsCi0gICAgICAgIGZvcm1RdWFsaWZpY2F0aW9uLFhTREVkaXRvckNTSGVscElkcy5BRFZBTkNFX1RBQl9fU0NIRU1BX0FUVFJJQlVURV9GT1JNX0RFRkFVTFQpOyAgICAKLSAgICAKLSAgICAvLyBDcmVhdGUgYmxvY2tEZWZhdWx0IGxhYmVsIGFuZCBjb21ibwotICAgIGJsb2NrRGVmYXVsdExhYmVsID0gWFNEQ29tbW9uVUlVdGlscy5nZXROZXdQcm9wZXJ0aWVzTGFiZWwoY29tcG9zaXRlLGdldFdpZGdldEZhY3RvcnkoKSwKLSAgICAgICAgTWVzc2FnZXMuX1VJX0xBQkVMX0JMT0NLREVGQVVMVCk7Ci0gICAgYmxvY2tEZWZhdWx0Q29tYm8gPSBYU0RDb21tb25VSVV0aWxzLmdldE5ld1Byb3BlcnRpZXNDb21ibyhjb21wb3NpdGUsZ2V0V2lkZ2V0RmFjdG9yeSgpLHRoaXMsCi0gICAgICAgIGJsb2NrRGVmYXVsdFZhbHVlcyxYU0RFZGl0b3JDU0hlbHBJZHMuQURWQU5DRV9UQUJfX1NDSEVNQV9CTE9DS19ERUZBVUxUKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgZmluYWxEZWZhdWx0IGxhYmVsIGFuZCBjb21ibwotICAgIGZpbmFsRGVmYXVsdExhYmVsID0gWFNEQ29tbW9uVUlVdGlscy5nZXROZXdQcm9wZXJ0aWVzTGFiZWwoY29tcG9zaXRlLGdldFdpZGdldEZhY3RvcnkoKSwKLSAgICAgICAgTWVzc2FnZXMuX1VJX0xBQkVMX0ZJTkFMREVGQVVMVCk7Ci0gICAgZmluYWxEZWZhdWx0Q29tYm8gPSBYU0RDb21tb25VSVV0aWxzLmdldE5ld1Byb3BlcnRpZXNDb21ibyhjb21wb3NpdGUsZ2V0V2lkZ2V0RmFjdG9yeSgpLHRoaXMsCi0gICAgICAgIGZpbmFsRGVmYXVsdFZhbHVlcyxYU0RFZGl0b3JDU0hlbHBJZHMuQURWQU5DRV9UQUJfX1NDSEVNQV9GSU5BTF9ERUZBVUxUKTsgICAgCi0gICAgCi0gICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICAKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnRGb3JtQ29tYm8gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHRleHQ7Ci0gICAgICAgIGlmICh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuRUxFTUVOVEZPUk1ERUZBVUxUX0FUVFJJQlVURSkpCi0gICAgICAgIHsKLSAgICAgICAgICB0ZXh0ID0geHNkU2NoZW1hLmdldEVsZW1lbnRGb3JtRGVmYXVsdCgpLmdldE5hbWUoKTsgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi0gICAgICAgIHsKLSAgICAgICAgICB0ZXh0ID0gZW1wdHlPcHRpb247ICAKLSAgICAgICAgfSAKLSAgICAgICAgZWxlbWVudEZvcm1Db21iby5zZXRUZXh0KHRleHQpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoYXR0cmlidXRlRm9ybUNvbWJvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0ZXh0OwotICAgICAgICBpZiAoeHNkU2NoZW1hLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkFUVFJJQlVURUZPUk1ERUZBVUxUX0FUVFJJQlVURSkpCi0gICAgICAgIHsKLSAgICAgICAgICB0ZXh0ID0geHNkU2NoZW1hLmdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi0gICAgICAgIHsKLSAgICAgICAgICB0ZXh0ID0gZW1wdHlPcHRpb247Ci0gICAgICAgIH0KLSAgICAgICAgYXR0cmlidXRlRm9ybUNvbWJvLnNldFRleHQodGV4dCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChibG9ja0RlZmF1bHRDb21ibyAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgdGV4dDsKLSAgICAgICAgaWYgKHhzZFNjaGVtYS5nZXRFbGVtZW50KCkuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5CTE9DS0RFRkFVTFRfQVRUUklCVVRFKSkKLSAgICAgICAgewotICAgICAgICAgIHRleHQgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuQkxPQ0tERUZBVUxUX0FUVFJJQlVURSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgIHRleHQgPSBlbXB0eU9wdGlvbjsKLSAgICAgICAgfQotICAgICAgICBibG9ja0RlZmF1bHRDb21iby5zZXRUZXh0KHRleHQpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoZmluYWxEZWZhdWx0Q29tYm8gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHRleHQ7Ci0gICAgICAgIGlmICh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuRklOQUxERUZBVUxUX0FUVFJJQlVURSkpCi0gICAgICAgIHsKLSAgICAgICAgICB0ZXh0ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJTkFMREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi0gICAgICAgIHsKLSAgICAgICAgICB0ZXh0ID0gZW1wdHlPcHRpb247Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxEZWZhdWx0Q29tYm8uc2V0VGV4dCh0ZXh0KTsKLSAgICAgIH0gICAgICAKLSAgICB9ICAgIAotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsgICAgICAgICAgCi0gICAgICBpZiAoZS53aWRnZXQgPT0gZWxlbWVudEZvcm1Db21ibyAmJiBlbGVtZW50Rm9ybUNvbWJvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZUVsZW1lbnRGb3JtID0gZWxlbWVudEZvcm1Db21iby5nZXRUZXh0KCk7Ci0gICAgICAgIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLCAKLSAgICAgICAgICAgIFhTRENvbnN0YW50cy5FTEVNRU5URk9STURFRkFVTFRfQVRUUklCVVRFLCB2YWx1ZUVsZW1lbnRGb3JtLCAKLSAgICAgICAgICAgIE1lc3NhZ2VzLl9VSV9MQUJFTF9FTEVNRU5URk9STURFRkFVTFQpOwotICAgICAgICBjb21tYW5kLnNldERlbGV0ZUlmRW1wdHkodHJ1ZSk7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgIGlmIChlLndpZGdldCA9PSBhdHRyaWJ1dGVGb3JtQ29tYm8gJiYgYXR0cmlidXRlRm9ybUNvbWJvICE9IG51bGwpCi0gICAgICB7ICAgICAKLSAgICAgICAgU3RyaW5nIHZhbHVlQXR0cmlidXRlRm9ybSA9IGF0dHJpYnV0ZUZvcm1Db21iby5nZXRUZXh0KCk7Ci0gICAgICAgIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLCAKLSAgICAgICAgICAgIFhTRENvbnN0YW50cy5BVFRSSUJVVEVGT1JNREVGQVVMVF9BVFRSSUJVVEUsIHZhbHVlQXR0cmlidXRlRm9ybSwgCi0gICAgICAgICAgICBNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUklCVVRFRk9STURFRkFVTFQpOwotICAgICAgICBjb21tYW5kLnNldERlbGV0ZUlmRW1wdHkodHJ1ZSk7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7ICAgICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGUud2lkZ2V0ID09IGJsb2NrRGVmYXVsdENvbWJvICYmIGJsb2NrRGVmYXVsdENvbWJvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZUJsb2NrRGVmYXVsdCA9IGJsb2NrRGVmYXVsdENvbWJvLmdldFRleHQoKTsgICAgICAgIAotICAgICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSwgCi0gICAgICAgICAgICBYU0RDb25zdGFudHMuQkxPQ0tERUZBVUxUX0FUVFJJQlVURSwgdmFsdWVCbG9ja0RlZmF1bHQsIE1lc3NhZ2VzLl9VSV9MQUJFTF9CTE9DS0RFRkFVTFQpOwotICAgICAgICBjb21tYW5kLnNldERlbGV0ZUlmRW1wdHkodHJ1ZSk7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmKGUud2lkZ2V0ID09IGZpbmFsRGVmYXVsdENvbWJvICYmIGZpbmFsRGVmYXVsdENvbWJvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBmaW5hbEJsb2NrRGVmYXVsdCA9IGZpbmFsRGVmYXVsdENvbWJvLmdldFRleHQoKTsgICAgICAgIAotICAgICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSwgCi0gICAgICAgICAgICBYU0RDb25zdGFudHMuRklOQUxERUZBVUxUX0FUVFJJQlVURSwgZmluYWxCbG9ja0RlZmF1bHQsIE1lc3NhZ2VzLl9VSV9MQUJFTF9GSU5BTERFRkFVTFQpOwotICAgICAgICBjb21tYW5kLnNldERlbGV0ZUlmRW1wdHkodHJ1ZSk7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNjaGVtYVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEU2NoZW1hU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWIyNjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEU2NoZW1hU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCSAgIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBbMTQyNTAwXSBXVFAgcHJvcGVydGllcyBwYWdlcyBmb250cyBkb24ndCBmb2xsb3cgRWNsaXBzZSBwcmVmZXJlbmNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuVGV4dFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUluZm9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLlhTREVkaXROYW1lc3BhY2VzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVzcGFjZUluZm9ybWF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uc2VkaXQuVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIElXb3JrYmVuY2hQYXJ0IHBhcnQ7Ci0gIFRleHQgcHJlZml4VGV4dDsKLSAgVGV4dCB0YXJnZXROYW1lc3BhY2VUZXh0OwotICBCdXR0b24gZWRpdEJ1dHRvbjsKLSAgU3R5bGVkVGV4dCBlcnJvclRleHQ7Ci0gIENvbG9yIHJlZDsKLQotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotICAgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0KLSAgICAvLyBDcmVhdGUgUHJlZml4IExhYmVsCi0gICAgQ0xhYmVsIHByZWZpeExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9TQ0hFTUFfUFJFRklYIikpOyAvLyROT04tTkxTLTEkCi0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgcHJlZml4TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIENyZWF0ZSBQcmVmaXggVGV4dAotICAgIHByZWZpeFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHByZWZpeFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyhwcmVmaXhUZXh0KTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHByZWZpeFRleHQsCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fU0NIRU1BX19QUkVGSVgpOwotCi0gICAgLy8gQ3JlYXRlIFRhcmdldE5hbWVzcGFjZSBMYWJlbAotICAgIENMYWJlbCB0YXJnZXROYW1lc3BhY2VMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfVEFSR0VUX05BTUVfU1BBQ0UiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgdGFyZ2V0TmFtZXNwYWNlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIENyZWF0ZSBUYXJnZXROYW1lc3BhY2UgVGV4dAotICAgIHRhcmdldE5hbWVzcGFjZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHRhcmdldE5hbWVzcGFjZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyh0YXJnZXROYW1lc3BhY2VUZXh0KTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRhcmdldE5hbWVzcGFjZVRleHQsCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fU0NIRU1BX19UQVJHRVROQU1FU1BBQ0UpOwotCi0gICAgLy8gQWR2YW5jZWQgQnV0dG9uCi0gICAgZWRpdEJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0VESVRfTkFNRVNQQUNFUyIpLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICBlZGl0QnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGVkaXRCdXR0b24sCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fU0NIRU1BX19BRFZBTkNFRCk7Ci0KLSAgICAvLyBlcnJvciB0ZXh0Ci0gICAgZXJyb3JUZXh0ID0gbmV3IFN0eWxlZFRleHQoY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgZXJyb3JUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICBlcnJvclRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgZXJyb3JUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBlcnJvclRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2goKTsKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCi0gICAgRWxlbWVudCBlbGVtZW50ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLQotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgLy8gSGFuZGxlIHByZWZpeFRleHQKLSAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgICAgU3RyaW5nIGFQcmVmaXggPSBoZWxwZXIuZ2V0UHJlZml4KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFKSwgZmFsc2UpOwotCi0gICAgICBpZiAoYVByZWZpeCAhPSBudWxsICYmIGFQcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBwcmVmaXhUZXh0LnNldFRleHQoYVByZWZpeCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByZWZpeFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLQotICAgICAgLy8gSGFuZGxlIFRhcmdldE5hbWVzcGFjZVRleHQKLSAgICAgCi0gICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRBUkdFVE5BTUVTUEFDRV9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICBTdHJpbmcgdG5zID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRBUkdFVE5BTUVTUEFDRV9BVFRSSUJVVEUpOwotICAgICAgICBTdHJpbmcgcHJvY2Vzc2VkU3RyaW5nID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKHRucyk7Ci0gICAgICAgIHRhcmdldE5hbWVzcGFjZVRleHQuc2V0VGV4dChwcm9jZXNzZWRTdHJpbmcpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0YXJnZXROYW1lc3BhY2VUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlcnJvclRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIGVycm9yVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBwcmVmaXhWYWx1ZSA9IHByZWZpeFRleHQuZ2V0VGV4dCgpOwotICAgIFN0cmluZyB0bnNWYWx1ZSA9IHRhcmdldE5hbWVzcGFjZVRleHQuZ2V0VGV4dCgpOwotCi0gICAgRWxlbWVudCBlbGVtZW50ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICBTdHJpbmcgY3VycmVudFByZWZpeCA9IGhlbHBlci5nZXRQcmVmaXgoZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRBUkdFVE5BTUVTUEFDRV9BVFRSSUJVVEUpLCBmYWxzZSk7Ci0gICAgU3RyaW5nIGN1cnJlbnROYW1lc3BhY2UgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgCi0gICAgaWYgKHRuc1ZhbHVlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChwcmVmaXhWYWx1ZS50cmltKCkubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBlcnJvclRleHQuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfRVJST1JfVEFSR0VUX05BTUVTUEFDRV9BTkRfUFJFRklYIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGludCBsZW5ndGggPSBlcnJvclRleHQuZ2V0VGV4dCgpLmxlbmd0aCgpOwotICAgICAgICByZWQgPSBuZXcgQ29sb3IobnVsbCwgMjU1LCAwLCAwKTsKLSAgICAgICAgU3R5bGVSYW5nZSBzdHlsZSA9IG5ldyBTdHlsZVJhbmdlKDAsIGxlbmd0aCwgcmVkLCB0YXJnZXROYW1lc3BhY2VUZXh0LmdldEJhY2tncm91bmQoKSk7Ci0gICAgICAgIGVycm9yVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChldmVudC53aWRnZXQgPT0gcHJlZml4VGV4dCkKLSAgICB7Ci0gICAgICAvLyBJZiB0aGUgcHJlZml4IGlzIHRoZSBzYW1lLCBqdXN0IHJldHVybi4gICBUaGlzIG1heSBoYXBwZW4gaWYgdGhlCi0gICAgICAvLyB3aWRnZXQgbG9zZXMgZm9jdXMuCi0gICAgICBpZiAocHJlZml4VmFsdWUuZXF1YWxzKGN1cnJlbnRQcmVmaXgpKSAKLSAgICAgICAgcmV0dXJuOwotICAgICAgdXBkYXRlTmFtZXNwYWNlSW5mbyhwcmVmaXhWYWx1ZSwgdG5zVmFsdWUpOwotICAgIH0KLSAgICBlbHNlIGlmIChldmVudC53aWRnZXQgPT0gdGFyZ2V0TmFtZXNwYWNlVGV4dCkKLSAgICB7Ci0gICAgICAvLyBJZiB0aGUgbnMgaXMgdGhlIHNhbWUsIGp1c3QgcmV0dXJuLiAgIFRoaXMgbWF5IGhhcHBlbiBpZiB0aGUKLSAgICAgIC8vIHdpZGdldCBsb3NlcyBmb2N1cy4KLSAgICAgIGlmICh0bnNWYWx1ZS5lcXVhbHMoY3VycmVudE5hbWVzcGFjZSkpIAotICAgICAgICByZXR1cm47Ci0KLSAgICAgIERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyIG5hbWVzcGFjZUluZm9NYW5hZ2VyID0gbmV3IERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyKCk7Ci0gICAgICBMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0gbmFtZXNwYWNlSW5mb01hbmFnZXIuZ2V0TmFtZXNwYWNlSW5mb0xpc3QoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSk7Ci0KLSAgICAgIEVsZW1lbnQgeHNkU2NoZW1hRWxlbWVudCA9IHhzZFNjaGVtYS5nZXRFbGVtZW50KCk7Ci0gICAgICBEb2N1bWVudEltcGwgZG9jID0gKERvY3VtZW50SW1wbCkgeHNkU2NoZW1hRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBkb2MuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTkFNRVNQQUNFX0NIQU5HRSIpKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh0bnNWYWx1ZS50cmltKCkubGVuZ3RoKCkgPT0gMCApIC8vcmVtb3ZlIHRoZSB0YXJnZXROYW1lc3BhY2UgYXR0cmlidXRlCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RTY2hlbWFFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVEFSR0VUTkFNRVNQQUNFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IHJlcGxhY2UgdGhlIG5hbWVzcGFjZSBmb3IgdGhlIHhtbG5zIGVudHJ5Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5hbWVzcGFjZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBpLm5leHQoKTsKLSAgICAgICAgICBpZiAoaW5mby51cmkuZXF1YWxzKGN1cnJlbnROYW1lc3BhY2UpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGluZm8udXJpID0gdG5zVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgeHNkU2NoZW1hLnNldEluY3JlbWVudGFsVXBkYXRlKGZhbHNlKTsKLSAgICAgICAgLy8gc2V0IHRoZSBuZXcgeG1sbnMgZW50cmllcwotICAgICAgICBuYW1lc3BhY2VJbmZvTWFuYWdlci5yZW1vdmVOYW1lc3BhY2VJbmZvKGVsZW1lbnQpOwotICAgICAgICBuYW1lc3BhY2VJbmZvTWFuYWdlci5hZGROYW1lc3BhY2VJbmZvKGVsZW1lbnQsIG5hbWVzcGFjZUluZm9MaXN0LCBmYWxzZSk7Ci0gICAgICAgIHhzZFNjaGVtYS5zZXRJbmNyZW1lbnRhbFVwZGF0ZSh0cnVlKTsKLQotICAgICAgICAvLyBzZXQgdGhlIHRhcmdldE5hbWVzcGFjZSBhdHRyaWJ1dGUKLSAgICAgICAgeHNkU2NoZW1hLnNldFRhcmdldE5hbWVzcGFjZSh0bnNWYWx1ZSk7Ci0gICAgICAgIAotICAgICAgICBUYXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyIHRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIgPSBuZXcgVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlcih4c2RTY2hlbWEsIGN1cnJlbnROYW1lc3BhY2UsIHRuc1ZhbHVlKTsKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlci5yZXNvbHZlKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0KLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICB4c2RTY2hlbWEudXBkYXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgZG9jLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGVkaXRCdXR0b24pCi0gICAgewotICAgICAgWFNERWRpdE5hbWVzcGFjZXNBY3Rpb24gbnNBY3Rpb24gPSBuZXcgWFNERWRpdE5hbWVzcGFjZXNBY3Rpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9FRElUX05BTUVTUEFDRVMiKSwgeHNkU2NoZW1hLmdldEVsZW1lbnQoKSwgbnVsbCwgeHNkU2NoZW1hKTsgLy8kTk9OLU5MUy0xJCAKLSAgICAgIG5zQWN0aW9uLnJ1bigpOwotICAgICAgcmVmcmVzaCgpOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVOYW1lc3BhY2VJbmZvKFN0cmluZyBuZXdQcmVmaXgsIFN0cmluZyBuZXdUYXJnZXROYW1lc3BhY2UpCi0gIHsKLSAgICBVcGRhdGVOYW1lc3BhY2VJbmZvcm1hdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVOYW1lc3BhY2VJbmZvcm1hdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9OQU1FU1BBQ0VfSU5GT1JNQVRJT05fQ0hBTkdFLCB4c2RTY2hlbWEsIG5ld1ByZWZpeCwgbmV3VGFyZ2V0TmFtZXNwYWNlKTsKLSAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBpZiAocHJlZml4VGV4dCAhPSBudWxsICYmICFwcmVmaXhUZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgIHJlbW92ZUxpc3RlbmVycyhwcmVmaXhUZXh0KTsKLSAgICBpZiAodGFyZ2V0TmFtZXNwYWNlVGV4dCAhPSBudWxsICYmICF0YXJnZXROYW1lc3BhY2VUZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgIHJlbW92ZUxpc3RlbmVycyh0YXJnZXROYW1lc3BhY2VUZXh0KTsKLSAgICAKLSAgICBpZiAocmVkICE9IG51bGwpCi0gICAgewotICAgICAgcmVkLmRpc3Bvc2UoKTsKLSAgICAgIHJlZCA9IG51bGw7Ci0gICAgfQotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQcmVmaXgoU3RyaW5nIHByZWZpeCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNpbXBsZVR5cGVBZHZhbmNlZFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEU2ltcGxlVHlwZUFkdmFuY2VkU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTJiYjIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEU2ltcGxlVHlwZUFkdmFuY2VkU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTaW1wbGVUeXBlQWR2YW5jZWRTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9ICIiOyAvLyROT04tTkxTLTEkCQkKLSAgcHJpdmF0ZSBTdHJpbmcgZmluYWxWYWx1ZXNbXSA9IHsgRU1QVFksICIjIiArIFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUcsICAvLyROT04tTkxTLTEkCi0JICAgICAgWFNEQ29uc3RhbnRzLkxJU1RfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgCi0JICAgICAgWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHfTsKLSAgCi0gIENDb21ibyBmaW5hbENvbWJvOwotICAKLSAgcHVibGljIFhTRFNpbXBsZVR5cGVBZHZhbmNlZFNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotICAgIGNvbXBvc2l0ZSA9IGZhY3RvcnkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBGaW5hbExhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBmaW5hbExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9GSU5BTCk7Ci0gICAgZmluYWxMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRmluYWxDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZmluYWxDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICBmaW5hbENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgZmluYWxDb21iby5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLSAgICBmaW5hbENvbWJvLnNldEl0ZW1zKGZpbmFsVmFsdWVzKTsKLSAgICBmaW5hbENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOyAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBzdXBlci5zZXRJbnB1dChwYXJ0LCBzZWxlY3Rpb24pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCi0gICAgZmluYWxDb21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJCk7IAotICAgIAotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0OwotCi0gICAgICAKLSAgICAgIGlmIChzaW1wbGVUeXBlLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJTkFMX0FUVFJJQlVURSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBmaW5hbEF0dFZhbHVlID0gc2ltcGxlVHlwZS5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5GSU5BTF9BVFRSSUJVVEUpOwotICAgICAgICBmaW5hbENvbWJvLnNldFRleHQoZmluYWxBdHRWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZpbmFsQ29tYm8uc2V0VGV4dChFTVBUWSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBmaW5hbENvbWJvICYmIGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IGZpbmFsQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKHNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuRklOQUxfQVRUUklCVVRFLCB2YWx1ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0ZJTkFMKTsKLSAgICAgIGNvbW1hbmQuc2V0RGVsZXRlSWZFbXB0eSh0cnVlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNpbXBsZVR5cGVTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNpbXBsZVR5cGVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMjc1YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RTaW1wbGVUeXBlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlhNTENoYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuQ3JlYXRlRWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuRE9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy5OZXdUeXBlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTRENvbXBsZXhUeXBlQmFzZVR5cGVFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5zZWFyY2guWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVmFyaWV0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTaW1wbGVUeXBlU2VjdGlvbiBleHRlbmRzIFJlZmFjdG9yaW5nU2VjdGlvbgotewotICBwcm90ZWN0ZWQgVGV4dCBuYW1lVGV4dDsKLSAgQ0NvbWJvIHZhcmlldHlDb21ibzsKLSAgQ0NvbWJvIHR5cGVzQ29tYm87Ci0gIENMYWJlbCB0eXBlc0xhYmVsOwotCi0gIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIG1lbWJlclR5cGVEZWZpbml0aW9uLCBpdGVtVHlwZURlZmluaXRpb24sIGJhc2VUeXBlRGVmaW5pdGlvbjsKLQotICBwdWJsaWMgWFNEU2ltcGxlVHlwZVNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotICAgIGNvbXBvc2l0ZSA9IGZhY3RvcnkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBOYW1lTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIENMYWJlbCBuYW1lTGFiZWwgPSBmYWN0b3J5LmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLlVJX0xBQkVMX05BTUUpOwotICAgIG5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gTmFtZVRleHQKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIG5hbWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGFwcGx5QWxsTGlzdGVuZXJzKG5hbWVUZXh0KTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5hbWVUZXh0LAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19TSU1QTEVfVFlQRV9fTkFNRSk7Ci0gICAgCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBSZWZhY3Rvci9yZW5hbWUgaHlwZXJsaW5rIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGNyZWF0ZVJlbmFtZUh5cGVybGluayhjb21wb3NpdGUpOwotCi0gICAgLy8gVmFyaWV0eSBMYWJlbAotICAgIENMYWJlbCBsYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfVkFSSUVUWSIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gVmFyaWV0eSBDb21ibwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgdmFyaWV0eUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCi0gICAgTGlzdCBsaXN0ID0gWFNEVmFyaWV0eS5WQUxVRVM7Ci0gICAgSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgdmFyaWV0eUNvbWJvLmFkZCgoKFhTRFZhcmlldHkpIGl0ZXIubmV4dCgpKS5nZXROYW1lKCkpOwotICAgIH0KLSAgICB2YXJpZXR5Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgdmFyaWV0eUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh2YXJpZXR5Q29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX1NJTVBMRV9UWVBFX19WQVJJRVRZKTsKLQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRHVtbXlMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFR5cGVzIExhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgdHlwZXNMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfTUVNQkVSVFlQRVMiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFR5cGVzIENvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgdHlwZXNDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICB0eXBlc0NvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICB0eXBlc0NvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgdHlwZXNDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICB0eXBlc0NvbWJvLmFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgdGhpcyk7Ci0KLSAgICAKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHR5cGVzQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHR5cGVzQ29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX1NJTVBMRV9UWVBFX19CQVNFX1RZUEUpOwotCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWxheW91dCgpCi0gIHsKLSAgICBDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlID0gY29tcG9zaXRlLmdldFBhcmVudCgpOwotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5zZXRSZWRyYXcoZmFsc2UpOwotCi0gICAgaWYgKHBhcmVudENvbXBvc2l0ZSAhPSBudWxsICYmICFwYXJlbnRDb21wb3NpdGUuaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudENvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgY2hpbGRyZW5baV0uZGlzcG9zZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIE5vdyBpbml0aWFsaXplIHRoZSBuZXcgaGFuZGxlcgotICAgIGNyZWF0ZUNvbnRlbnRzKHBhcmVudENvbXBvc2l0ZSk7Ci0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLmxheW91dCh0cnVlLCB0cnVlKTsKLQotICAgIC8vIE5vdyB0dXJuIHBhaW50aW5nIGJhY2sgb24KLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkuc2V0UmVkcmF3KHRydWUpOwotICAgIHJlZnJlc2goKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICBzaG93TGluayghaGlkZUh5cGVyTGluayk7Ci0KLSAgICBuYW1lVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIHZhcmlldHlDb21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIHR5cGVzQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBmaWxsVHlwZXNDb21ibygpOwotICAgIHR5cGVzTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfQkFTRV9UWVBFX1dJVEhfQ09MT04iKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIFN0cmluZyBzaW1wbGVUeXBlTmFtZSA9IHN0LmdldE5hbWUoKTsKLSAgICAgIGlmIChzaW1wbGVUeXBlTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lVGV4dC5zZXRUZXh0KHNpbXBsZVR5cGVOYW1lKTsKLSAgICAgICAgbmFtZVRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG5hbWVUZXh0LnNldFRleHQoIioqYW5vbnltb3VzKioiKTsgLy8kTk9OLU5MUy0xJCk7Ci0gICAgICAgIG5hbWVUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgU3RyaW5nIHZhcmlldHkgPSBzdC5nZXRWYXJpZXR5KCkuZ2V0TmFtZSgpOwotICAgICAgaW50IGludFZhcmlldHkgPSBzdC5nZXRWYXJpZXR5KCkuZ2V0VmFsdWUoKTsKLSAgICAgIFhTRERPTUhlbHBlciBkb21IZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gICAgICBpZihkb21IZWxwZXIuZ2V0RGVyaXZlZEJ5RWxlbWVudEZyb21TaW1wbGVUeXBlKHN0LmdldEVsZW1lbnQoKSkgIT0gbnVsbCkgewotCSAgICAgIGlmICh2YXJpZXR5ICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgdmFyaWV0eUNvbWJvLnNldFRleHQodmFyaWV0eSk7Ci0JICAgICAgICBpZiAoaW50VmFyaWV0eSA9PSBYU0RWYXJpZXR5LkFUT01JQykKLQkgICAgICAgIHsKLQkgICAgICAgICAgYmFzZVR5cGVEZWZpbml0aW9uID0gc3QuZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0JICAgICAgICAgIFN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgICAgaWYgKGJhc2VUeXBlRGVmaW5pdGlvbiAhPSBudWxsKQotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgbmFtZSA9IGJhc2VUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCk7Ci0JICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgbmFtZSA9ICIiOwotCSAgICAgICAgICB9Ci0JICAgICAgICAgIHR5cGVzQ29tYm8uc2V0VGV4dChuYW1lKTsKLQkgICAgICAgICAgdHlwZXNMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9CQVNFX1RZUEVfV0lUSF9DT0xPTiIpKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgfQotCSAgICAgICAgZWxzZSBpZiAoaW50VmFyaWV0eSA9PSBYU0RWYXJpZXR5LkxJU1QpCi0JICAgICAgICB7Ci0JICAgICAgICAgIGl0ZW1UeXBlRGVmaW5pdGlvbiA9IHN0LmdldEl0ZW1UeXBlRGVmaW5pdGlvbigpOwotCSAgICAgICAgICBTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JICAgICAgICAgIGlmIChpdGVtVHlwZURlZmluaXRpb24gIT0gbnVsbCkKLQkgICAgICAgICAgewotCSAgICAgICAgICAgIG5hbWUgPSBpdGVtVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpOwotCSAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIG5hbWUgPSAiIjsKLQkgICAgICAgICAgfQotCSAgICAgICAgICB0eXBlc0NvbWJvLnNldFRleHQobmFtZSk7Ci0JICAgICAgICAgIHR5cGVzTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfSVRFTV9UWVBFIikpOyAvLyROT04tTkxTLTEkCi0JICAgICAgICB9Ci0JICAgICAgICBlbHNlIGlmIChpbnRWYXJpZXR5ID09IFhTRFZhcmlldHkuVU5JT04pCi0JICAgICAgICB7Ci0JICAgICAgICAgIExpc3QgbWVtYmVyVHlwZXNMaXN0ID0gc3QuZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCk7Ci0JICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWVtYmVyVHlwZXNMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkgICAgICAgICAgewotCSAgICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGVPYmplY3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotCSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdHlwZU9iamVjdC5nZXRRTmFtZSgpOwotCSAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCi0JICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgc2IuYXBwZW5kKG5hbWUpOwotCSAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKQotCSAgICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgfQotCSAgICAgICAgICBTdHJpbmcgbWVtYmVyVHlwZXMgPSBzYi50b1N0cmluZygpOwotCSAgICAgICAgICB0eXBlc0NvbWJvLnNldFRleHQobWVtYmVyVHlwZXMpOwotCSAgICAgICAgICB0eXBlc0xhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX01FTUJFUlRZUEVTIikpOyAvLyROT04tTkxTLTEkCi0JICAgICAgICB9Ci0JICAgICAgfQotCSAgICB9Ci0gICAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSB0eXBlc0NvbWJvKQotICAgIHsKLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSB0eXBlc0NvbWJvLmdldFRleHQoKTsKLSAgICAgIGlmIChzaG91bGRQZXJmb3JtQ29tYm9TZWxlY3Rpb24oU1dULkRlZmF1bHRTZWxlY3Rpb24sIHNlbGVjdGlvbikpCi0gICAgICAgIGhhbmRsZVdpZGdldFNlbGVjdGlvbihlKTsKLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IHR5cGVzQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IHR5cGVzQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgaWYgKHNob3VsZFBlcmZvcm1Db21ib1NlbGVjdGlvbihTV1QuU2VsZWN0aW9uLCBzZWxlY3Rpb24pKQotICAgICAgICBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oZSk7Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgaGFuZGxlV2lkZ2V0U2VsZWN0aW9uKGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVXaWRnZXRTZWxlY3Rpb24oU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSB0eXBlc0NvbWJvKQotICAgIHsKLSAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgaWYgKGVkaXRvciA9PSBudWxsKSByZXR1cm47Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTRENvbXBsZXhUeXBlQmFzZVR5cGVFZGl0TWFuYWdlci5jbGFzcyk7ICAgIAotCi0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gdHlwZXNDb21iby5nZXRUZXh0KCk7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIG5ld1ZhbHVlOwotICAgICAgSUNvbXBvbmVudERpYWxvZyBkaWFsb2c9IG51bGw7Ci0gICAgICBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0NPTUJPX0JST1dTRSkpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCk7Ci0gICAgICAgICgoWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlKSBkaWFsb2cpLnNob3dDb21wbGV4VHlwZXMoZmFsc2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0NPTUJPX05FVykpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0TmV3RGlhbG9nKCk7Ci0gICAgICAgICgoTmV3VHlwZURpYWxvZykgZGlhbG9nKS5hbGxvd0NvbXBsZXhUeXBlKGZhbHNlKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRpYWxvZyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdWYWx1ZSA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbXBvbmVudCgpOwotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGlucHV0LCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgLy91c2UgdGhlIHZhbHVlIGZyb20gc2VsZWN0ZWQgcXVpY2tQaWNrIGl0ZW0KLSAgICAgIHsKLSAgICAgICAgbmV3VmFsdWUgPSBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKHNlbGVjdGlvbiwgbWFuYWdlcik7Ci0gICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKQotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGlucHV0LCBuZXdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHZhcmlldHlDb21ibykKLSAgICB7Ci0gICAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICAgICAgRWxlbWVudCBwYXJlbnQgPSBzdC5nZXRFbGVtZW50KCk7Ci0KLSAgICAgICAgICBTdHJpbmcgdmFyaWV0eSA9IHZhcmlldHlDb21iby5nZXRUZXh0KCk7Ci0gICAgICAgICAgaWYgKHZhcmlldHkuZXF1YWxzKFhTRFZhcmlldHkuQVRPTUlDX0xJVEVSQUwuZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlc0xhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0JBU0VfVFlQRV9XSVRIX0NPTE9OIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzdC5zZXRWYXJpZXR5KFhTRFZhcmlldHkuQVRPTUlDX0xJVEVSQUwpOwotICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QoWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9SRVNUUklDVElPTiIpLCBwYXJlbnQsIG51bGwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHZhcmlldHkuZXF1YWxzKFhTRFZhcmlldHkuVU5JT05fTElURVJBTC5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHR5cGVzTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfTUVNQkVSVFlQRVMiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHN0LnNldFZhcmlldHkoWFNEVmFyaWV0eS5VTklPTl9MSVRFUkFMKTsKLSAgICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfVU5JT04iKSwgcGFyZW50LCBudWxsKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh2YXJpZXR5LmVxdWFscyhYU0RWYXJpZXR5LkxJU1RfTElURVJBTC5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHR5cGVzTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfSVRFTV9UWVBFIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzdC5zZXRWYXJpZXR5KFhTRFZhcmlldHkuTElTVF9MSVRFUkFMKTsKLSAgICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9MSVNUIiksIHBhcmVudCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIGlzc3VlIChjcykgdGhpcyBtZXRob2Qgc2VlbXMgdG8gYmUgdXRpbGl6aW5nICdvbGQnIGNsYXNzZXMsIGNhbiB3ZSByZWltcGxlbWVudD8KLSAgLy8gKGUuZy4gQ2hhbmdlRWxlbWVudEFjdGlvbiwgWFNERE9NSGVscGVyLCBldGMpCi0gIHByb3RlY3RlZCBib29sZWFuIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KFN0cmluZyBlbGVtZW50VGFnLCBTdHJpbmcgbGFiZWwsIEVsZW1lbnQgcGFyZW50LCBOb2RlIHJlbGF0aXZlTm9kZSkKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLSAgICBMaXN0IGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgU3RyaW5nIHJldXNlVHlwZSA9IG51bGw7Ci0KLSAgICAvLyBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfVkFSSUVUWV9DSEFOR0UiKSwKLSAgICAvLyBwYXJlbnQpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGVsZW1lbnRUYWcuZXF1YWxzKFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRykpCi0gICAgewotICAgICAgRWxlbWVudCBsaXN0Tm9kZSA9IGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMocGFyZW50LCBYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRywgZmFsc2UpOwotICAgICAgaWYgKGxpc3ROb2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChsaXN0Tm9kZS5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLklURU1UWVBFX0FUVFJJQlVURSkpCi0gICAgICAgIAlyZXVzZVR5cGUgPSBsaXN0Tm9kZS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLklURU1UWVBFX0FUVFJJQlVURSk7Ci0gICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShsaXN0Tm9kZSk7Ci0gICAgICB9Ci0KLSAgICAgIEVsZW1lbnQgdW5pb25Ob2RlID0gZ2V0Rmlyc3RDaGlsZE5vZGVJZkV4aXN0cyhwYXJlbnQsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRywgZmFsc2UpOwotICAgICAgaWYgKHVuaW9uTm9kZSAhPSBudWxsKQotICAgICAgewotICAgICAgICAKLSAgICAgICAgaWYgKHVuaW9uTm9kZS5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbWVtYmVyQXR0ciA9IHVuaW9uTm9kZS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSk7Ci0gICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobWVtYmVyQXR0cik7Ci0gICAgICAgICAgcmV1c2VUeXBlID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICB9Ci0gICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZSh1bmlvbk5vZGUpOwotICAgICAgfQotCi0gICAgICBpZiAocmV1c2VUeXBlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldXNlVHlwZSA9IGdldEJ1aWx0SW5TdHJpbmdRTmFtZSgpOwotICAgICAgfQotICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUsIHJldXNlVHlwZSkpOwotICAgICAgc3Quc2V0SXRlbVR5cGVEZWZpbml0aW9uKG51bGwpOwotICAgIH0KLSAgICBlbHNlIGlmIChlbGVtZW50VGFnLmVxdWFscyhYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRykpCi0gICAgewotICAgICAgRWxlbWVudCByZXN0cmljdGlvbk5vZGUgPSBnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICBpZiAocmVzdHJpY3Rpb25Ob2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldXNlVHlwZSA9IHJlc3RyaWN0aW9uTm9kZS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFKTsKLSAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKHJlc3RyaWN0aW9uTm9kZSk7Ci0gICAgICB9Ci0gICAgICBFbGVtZW50IHVuaW9uTm9kZSA9IGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMocGFyZW50LCBYU0RDb25zdGFudHMuVU5JT05fRUxFTUVOVF9UQUcsIGZhbHNlKTsKLSAgICAgIGlmICh1bmlvbk5vZGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG1lbWJlckF0dHIgPSB1bmlvbk5vZGUuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUpOwotICAgICAgICBpZiAobWVtYmVyQXR0ciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobWVtYmVyQXR0cik7Ci0gICAgICAgICAgcmV1c2VUeXBlID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICB9Ci0gICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZSh1bmlvbk5vZGUpOwotICAgICAgfQotICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFLCByZXVzZVR5cGUpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudFRhZy5lcXVhbHMoWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHKSkKLSAgICB7Ci0gICAgICBFbGVtZW50IGxpc3ROb2RlID0gZ2V0Rmlyc3RDaGlsZE5vZGVJZkV4aXN0cyhwYXJlbnQsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICBpZiAobGlzdE5vZGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV1c2VUeXBlID0gbGlzdE5vZGUuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5JVEVNVFlQRV9BVFRSSUJVVEUpOwotICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UobGlzdE5vZGUpOwotICAgICAgfQotICAgICAgRWxlbWVudCByZXN0cmljdGlvbk5vZGUgPSBnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICBpZiAocmVzdHJpY3Rpb25Ob2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldXNlVHlwZSA9IHJlc3RyaWN0aW9uTm9kZS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFKTsKLSAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKHJlc3RyaWN0aW9uTm9kZSk7Ci0gICAgICB9Ci0gICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUsIHJldXNlVHlwZSkpOwotICAgICAgc3Quc2V0SXRlbVR5cGVEZWZpbml0aW9uKG51bGwpOwotICAgIH0KLQotICAgIGlmIChnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgZWxlbWVudFRhZywgZmFsc2UpID09IG51bGwpCi0gICAgewotICAgICAgQWN0aW9uIGFjdGlvbiA9IGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24oZWxlbWVudFRhZywgbGFiZWwsIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICB9Ci0KLSAgICBzdC5zZXRFbGVtZW50KHBhcmVudCk7Ci0gICAgc3QudXBkYXRlRWxlbWVudCgpOwotICAgIC8vIGVuZFJlY29yZGluZyhwYXJlbnQpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIEFjdGlvbiBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKFN0cmluZyBlbGVtZW50VGFnLCBTdHJpbmcgbGFiZWwsIExpc3QgYXR0cmlidXRlcywgRWxlbWVudCBwYXJlbnQsIE5vZGUgcmVsYXRpdmVOb2RlKQotICB7Ci0gICAgQ3JlYXRlRWxlbWVudEFjdGlvbiBhY3Rpb24gPSBuZXcgQ3JlYXRlRWxlbWVudEFjdGlvbihsYWJlbCk7Ci0gICAgYWN0aW9uLnNldEVsZW1lbnRUYWcoZWxlbWVudFRhZyk7Ci0gICAgYWN0aW9uLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0gICAgYWN0aW9uLnNldFBhcmVudE5vZGUocGFyZW50KTsKLSAgICBhY3Rpb24uc2V0UmVsYXRpdmVOb2RlKHJlbGF0aXZlTm9kZSk7Ci0gICAgcmV0dXJuIGFjdGlvbjsKLSAgfQotCi0gIHByb3RlY3RlZCBFbGVtZW50IGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMoTm9kZSBwYXJlbnQsIFN0cmluZyBlbGVtZW50VGFnLCBib29sZWFuIGlzUmVmKQotICB7Ci0gICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIEVsZW1lbnQgdGFyZ2V0Tm9kZSA9IG51bGw7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotICAgICAgaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGNoaWxkLCBlbGVtZW50VGFnLCBpc1JlZikpCi0gICAgICAgIHsKLSAgICAgICAgICB0YXJnZXROb2RlID0gKEVsZW1lbnQpIGNoaWxkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0YXJnZXROb2RlOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRCdWlsdEluU3RyaW5nUU5hbWUoKQotICB7Ci0gICAgU3RyaW5nIHN0cmluZ05hbWUgPSAic3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBzY2hlbWFGb3JTY2hlbWFQcmVmaXggPSB4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoKTsKLSAgICAgIGlmIChzY2hlbWFGb3JTY2hlbWFQcmVmaXggIT0gbnVsbCAmJiBzY2hlbWFGb3JTY2hlbWFQcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBTdHJpbmcgcHJlZml4ID0geHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYVFOYW1lUHJlZml4KCk7Ci0gICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgc3RyaW5nTmFtZSA9IHByZWZpeCArICI6IiArIHN0cmluZ05hbWU7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3RyaW5nTmFtZTsKLSAgfQotCi0gIC8vIFRPRE86IENvbW1vbiB0aGlzIHVwIHdpdGggZWxlbWVudCBkZWNsYXJhdGlvbgotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSAKLSAgewotICAgIGlmIChldmVudC50eXBlID09IFNXVC5UcmF2ZXJzZSkgewotICAgICAgaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfQVJST1dfTkVYVCB8fCBldmVudC5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0FSUk9XX1BSRVZJT1VTKSB7Ci0gICAgICAgIGlzVHJhdmVyc2luZyA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBuYW1lVGV4dCkKLSAgICB7Ci0gICAgICBpZiAoIW5hbWVUZXh0LmdldEVkaXRhYmxlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBYU0ROYW1lZENvbXBvbmVudCBuYW1lZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudClpbnB1dDsKLSAgICAgICAgaWYgKCF2YWxpZGF0ZVNlY3Rpb24oKSkKLSAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgYW4gYWN0dWFsIG5hbWUgY2hhbmdlIGhhcyB0YWtlbiBwbGFjZQotICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWVkQ29tcG9uZW50LmdldE5hbWUoKTsKLSAgICAgICAgaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb21tYW5kID0gbmV3IFVwZGF0ZU5hbWVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fUkVOQU1FLCBuYW1lZENvbXBvbmVudCwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCAmJiBnZXRDb21tYW5kU3RhY2soKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVNlY3Rpb24oKQotICB7Ci0gICAgaWYgKG5hbWVUZXh0ID09IG51bGwgfHwgbmFtZVRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLSAgICBTdHJpbmcgbmFtZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0KLSAgICAvLyB2YWxpZGF0ZSBhZ2FpbnN0IE5DTmFtZQotICAgIGlmIChuYW1lLmxlbmd0aCgpIDwgMSB8fCAhWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKG5hbWUpKQotICAgIHsKLSAgICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5fVUlfRVJST1JfSU5WQUxJRF9OQU1FKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBzdXBlci5zZXRJbnB1dChwYXJ0LCBzZWxlY3Rpb24pOwotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgIAlYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIGhpZGVIeXBlckxpbmsgPSAhKHNpbXBsZVR5cGUuZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWEpOwotICAgICAgCi0gICAgfSAgICAKLSAgICAvLyBEb24ndCBoYXZlIHRvIGNhbGwgcmVsYXlvdXQoKSBoZXJlCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgZmlsbFR5cGVzQ29tYm8oKQotICB7Ci0gICAgdHlwZXNDb21iby5yZW1vdmVBbGwoKTsKLSAgICAKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7Ci0gICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gaXRlbXMgPSBtYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLQotICAgICAgdHlwZXNDb21iby5hZGQoTWVzc2FnZXMuX1VJX0NPTUJPX0JST1dTRSk7Ci0gICAgICB0eXBlc0NvbWJvLmFkZChNZXNzYWdlcy5fVUlfQ09NQk9fTkVXKTsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgdHlwZXNDb21iby5hZGQoaXRlbXNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gQWRkIHRoZSBjdXJyZW50IFR5cGUgb2YgdGhpcyBhdHRyaWJ1dGUgaWYgbmVlZGVkCi0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlID0gc2ltcGxlVHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgYmFzZVR5cGUuZ2V0UU5hbWUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgY3VycmVudFR5cGVOYW1lID0gYmFzZVR5cGUuZ2V0UU5hbWUoeHNkU2NoZW1hKTsgLy8gbm8gcHJlZml4Ci0gICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmV0ID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShjdXJyZW50VHlwZU5hbWUsIG1hbmFnZXIpOwotICAgICAgICBpZiAocmV0ID09IG51bGwgJiYgY3VycmVudFR5cGVOYW1lICE9IG51bGwpIC8vIG5vdCBpbiBxdWlja1BpY2sKLSAgICAgICAgewotICAgICAgICAgIHR5cGVzQ29tYm8uYWRkKGN1cnJlbnRUeXBlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBUT0RPOiBjb21tb24gdGhpcyB1cCB3aXRoIFhTREVsZW1lbnREZWNsYXJhdGlvblNlY3Rpb24KLSAgcHJpdmF0ZSBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldENvbXBvbmVudFNwZWNGcm9tUXVpY2tQaWNrRm9yVmFsdWUoU3RyaW5nIHZhbHVlLCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBlZGl0TWFuYWdlcikKLSAgewotICAgIGlmIChlZGl0TWFuYWdlciAhPSBudWxsKQotICAgIHsgIAotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIHF1aWNrUGlja3MgPSBlZGl0TWFuYWdlci5nZXRRdWlja1BpY2tzKCk7Ci0gICAgICBpZiAocXVpY2tQaWNrcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBxdWlja1BpY2tzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gcXVpY2tQaWNrc1tpXTsKLSAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMoY29tcG9uZW50U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRTcGVjaWZpY2F0aW9uOwotICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBpZiAodHlwZXNDb21ibyAhPSBudWxsICYmICF0eXBlc0NvbWJvLmlzRGlzcG9zZWQoKSkKLSAgICAgIHR5cGVzQ29tYm8ucmVtb3ZlTGlzdGVuZXIoU1dULlRyYXZlcnNlLCB0aGlzKTsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEVGFibGVUcmVlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFRhYmxlVHJlZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjA0ZTdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEVGFibGVUcmVlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MVGFibGVUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTFRhYmxlVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEVGFibGVUcmVlVmlld2VyIGV4dGVuZHMgWE1MVGFibGVUcmVlVmlld2VyCi17Ci0KLSAgU3RyaW5nIGZpbHRlciA9ICIiOyAvLyROT04tTkxTLTEkCi0KLSAgY2xhc3MgWFNEQWN0aW9uTWVudUxpc3RlbmVyIGltcGxlbWVudHMgSU1lbnVMaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikKLSAgICB7Ci0gICAgICAvLyB1c2VkIHRvIGRpc2FibGUgTm9kZVNlbGVjdGlvbiBsaXN0ZW5pbmcgd2hpbGUgcnVubmluZyBOb2RlQWN0aW9uCi0gICAgICAvLyBYU0RBY3Rpb25NYW5hZ2VyIG5vZGVBY3Rpb25NYW5hZ2VyID0gbmV3IFhTREFjdGlvbk1hbmFnZXIoZk1vZGVsLAotICAgICAgLy8gWFNEVGFibGVUcmVlVmlld2VyLnRoaXMpOwotICAgICAgLy8gbm9kZUFjdGlvbk1hbmFnZXIuc2V0Q29tbWFuZFN0YWNrKGNvbW1hbmRTdGFjayk7Ci0gICAgICAvLyBub2RlQWN0aW9uTWFuYWdlci5maWxsQ29udGV4dE1lbnUobWVudU1hbmFnZXIsIGdldFNlbGVjdGlvbigpKTsKLQotICAgICAgLy8gdXNlZCB0byBkaXNhYmxlIE5vZGVTZWxlY3Rpb24gbGlzdGVuaW5nIHdoaWxlIHJ1bm5pbmcgTm9kZUFjdGlvbgotICAgICAgLy8gWE1MTm9kZUFjdGlvbk1hbmFnZXIgbm9kZUFjdGlvbk1hbmFnZXIgPSBuZXcKLSAgICAgIC8vIFhNTE5vZGVBY3Rpb25NYW5hZ2VyKCgoSURPTURvY3VtZW50KSBnZXRJbnB1dCgpKS5nZXRNb2RlbCgpLAotICAgICAgLy8gWE1MVGFibGVUcmVlVmlld2VyLnRoaXMpIHsKLSAgICAgIGlmIChnZXRJbnB1dCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFhTREFjdGlvbk1hbmFnZXIgbm9kZUFjdGlvbk1hbmFnZXIgPSBuZXcgWFNEQWN0aW9uTWFuYWdlcigoKElET01Eb2N1bWVudCkgKCgoRWxlbWVudCkgZ2V0SW5wdXQoKSkuZ2V0T3duZXJEb2N1bWVudCgpKSkuZ2V0TW9kZWwoKSwgWFNEVGFibGVUcmVlVmlld2VyLnRoaXMpOwotICAgICAgICAvLyBub2RlQWN0aW9uTWFuYWdlci5zZXRDb21tYW5kU3RhY2soY29tbWFuZFN0YWNrKTsKLSAgICAgICAgbm9kZUFjdGlvbk1hbmFnZXIuZmlsbENvbnRleHRNZW51KG1lbnVNYW5hZ2VyLCBnZXRTZWxlY3Rpb24oKSk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgWFNEVGFibGVUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQpOwotICAgIC8vIHRyZWVFeHRlbnNpb24uc2V0Q2VsbE1vZGlmaWVyKG51bGwpOwotICAgIGdldFRyZWUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLSAgICAvLyB0cmVlRXh0ZW5zaW9uID0gbmV3IFhNTFRyZWVFeHRlbnNpb24oZ2V0VHJlZSgpKTsKLQotICAgIC8vIFJlYXNzaWduIHRoZSBjb250ZW50IHByb3ZpZGVyCi0gICAgWE1MVGFibGVUcmVlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IE15Q29udGVudFByb3ZpZGVyKCk7Ci0gICAgLy8gcHJvdmlkZXIuYWRkVmlld2VyKHRoaXMpOwotCi0gICAgc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICBzZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLQotICAgIC8vIHNldFZpZXdlclNlbGVjdGlvbk1hbmFnZXIobmV3IFZpZXdlclNlbGVjdGlvbk1hbmFnZXJJbXBsKG51bGwpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBPYmplY3QgZ2V0Um9vdCgpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuZ2V0Um9vdCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RmlsdGVyKFN0cmluZyBmaWx0ZXIpCi0gIHsKLSAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRleHRNZW51KCkKLSAgewotICAgIC8vIFRPRE8gVmVyaWZ5IGlmIHRoaXMgaXMgb2theSB0byBvdmVycmlkZSB0aGUgTWVudU1hbmFnZXIKLSAgICBNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7IC8vJE5PTi1OTFMtMSQKLSAgICBjb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0gICAgY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCi0gICAgLy8gVGhpcyBpcyB0aGUgbGluZSB3ZSBoYXZlIHRvIG1vZGlmeQotICAgIGNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgWFNEQWN0aW9uTWVudUxpc3RlbmVyKCkpOwotICAgIE1lbnUgbWVudSA9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KGdldENvbnRyb2woKSk7Ci0gICAgZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0gIH0KLQotICBib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0KLSAgY2xhc3MgTXlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBYTUxUYWJsZVRyZWVDb250ZW50UHJvdmlkZXIKLSAgewotCi0gICAgLy8gcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgLy8JCQkKLSAgICAvLyBpZiAoIWFkZGVkKSB7Ci0gICAgLy8gaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgLy8gYWRkZWQgPSB0cnVlOwotICAgIC8vIEVsZW1lbnQgZWxlbSA9IChFbGVtZW50KWVsZW1lbnQ7Ci0gICAgLy8gaWYgKGVsZW0gaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0gICAgLy8gdmlld2VyTm90aWZ5aW5nQWRhcHRlckZhY3RvcnkuYWRhcHQoKElOb2RlTm90aWZpZXIpIGVsZW0pOwotICAgIC8vIH0KLSAgICAvLyAvLyByZXR1cm4gbmV3IE9iamVjdFtdIHtlbGVtfTsKLSAgICAvLyB9Ci0gICAgLy8gfQotICAgIC8vIHJldHVybiBzdXBlci5nZXRDaGlsZHJlbihlbGVtZW50KTsKLSAgICAvLyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gICAgewotICAgICAgYWRkZWQgPSBmYWxzZTsKLSAgICAgIGlmIChvbGRJbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIG9sZElucHV0ID0gKChFbGVtZW50KSBvbGRJbnB1dCkuZ2V0T3duZXJEb2N1bWVudCgpOwotCi0gICAgICBpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICBuZXdJbnB1dCA9ICgoRWxlbWVudCkgbmV3SW5wdXQpLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgIHN1cGVyLmlucHV0Q2hhbmdlZCh2aWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0FkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzMDliZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWwuWFNESW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZyBleHRlbmRzIFNlbGVjdGlvbkRpYWxvZyBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIFNlbGVjdGlvbkxpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW1hZ2UgREVGQVVMVF9FTEVNRU5UX0lDT04gPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREVsZW1lbnQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbWFnZSBERUZBVUxUX0FUVFJJQlVURV9JQ09OID0gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RBdHRyaWJ1dGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotICAvKiogQSB0ZW1wb3JhcnkgRG9jdW1lbnQgaW4gd2hpY2ggd2UgY3JlYXRlIHRlbXBvcmFyeSBET00gZWxlbWVudCBmb3IgZWFjaCBlbGVtZW50IGluIHRoZQotICAgKiBFbGVtZW50IHZpZXcuIChyZXF1aXJlZCBieSBMYWJlbFByb3ZpZGVyKSAgKi8gCi0gIHByb3RlY3RlZCBzdGF0aWMgRG9jdW1lbnQgdGVtcERvYyA9IG5ldyBEb2N1bWVudEltcGwoKTsKLSAgCi0gIEJ1dHRvbiBhZGRCdXR0b24sIHJlbW92ZUJ1dHRvbiwgZWRpdEJ1dHRvbjsKLQotICBwdWJsaWMgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZyhTaGVsbCBwYXJlbnQsIEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkgc2NoZW1hUmVnaXN0cnkpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQpOwotICAgIHNldFRpdGxlKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VYVEVOU0lPTl9DT01QT05FTlRTKTsKLSAgICBzZXRTaGVsbFN0eWxlKFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5SRVNJWkUgfCBTV1QuQ0xPU0UpOyAgICAKLSAgfQotCi0gIHByaXZhdGUgTGlzdCBmSW5wdXQ7Ci0KLSAgcHJpdmF0ZSBUYWJsZVZpZXdlciBjYXRlZ29yeVRhYmxlVmlld2VyLCBlbGVtZW50VGFibGVWaWV3ZXI7Ci0gIHByaXZhdGUgQXJyYXlMaXN0IGV4aXN0aW5nTmFtZXM7Ci0KLSAgcHJpdmF0ZSBWaWV3ZXJGaWx0ZXIgZWxlbWVudFRhYmxlVmlld2VyRmlsdGVyOwotICBwcml2YXRlIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIGN1cnJlbnRFeHRDYXRlZ29yeTsKLSAgcHJpdmF0ZSBIYXNoTWFwIHNwZWNUb0NvbXBvbmVudHNMaXN0ID0gbmV3IEhhc2hNYXAoKTsKLSAgcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZTsKLSAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KExpc3QgaW5wdXQpCi0gIHsKLSAgICB0aGlzLmZJbnB1dCA9IGlucHV0OwotICB9Ci0gIAotICBwdWJsaWMgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgZ2V0U2VsZWN0ZWRDYXRlZ29yeSgpewotCXJldHVybiBjdXJyZW50RXh0Q2F0ZWdvcnk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxDYXRlZ29yeVNlbGVjdGlvbihTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjKXsKLQkgIGN1cnJlbnRFeHRDYXRlZ29yeSA9IHNwZWM7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBnZXRDYXRlZ29yeUNvbnRlbnRQcm92aWRlcigpCi0gIHsKLSAgICByZXR1cm4gbmV3IENhdGVnb3J5Q29udGVudFByb3ZpZGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBjb250YWluZXIpCi0gIHsKLSAgICBDb21wb3NpdGUgcGFyZW50ID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShjb250YWluZXIpOwotCi0gICAgQ29tcG9zaXRlIGNhdGVnb3J5Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMjsKLSAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgY2F0ZWdvcnlDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBjYXRlZ29yeUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotCi0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY2F0ZWdvcnlDb21wb3NpdGUsIFNXVC5MRUZUKTsKLSAgICBsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9FWFRFTlNJT05fQ0FURUdPUklFUyk7Ci0KLSAgICBuZXcgTGFiZWwoY2F0ZWdvcnlDb21wb3NpdGUsIFNXVC5OT05FKTsKLQotICAgIGNhdGVnb3J5VGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY2F0ZWdvcnlDb21wb3NpdGUsIGdldFRhYmxlU3R5bGUoKSk7Ci0gICAgY2F0ZWdvcnlUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoZ2V0Q2F0ZWdvcnlDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgY2F0ZWdvcnlUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDYXRlZ29yeUxhYmVsUHJvdmlkZXIoKSk7Ci0gICAgY2F0ZWdvcnlUYWJsZVZpZXdlci5zZXRJbnB1dChmSW5wdXQpOwotICAgIGNhdGVnb3J5VGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY2F0ZWdvcnlUYWJsZVZpZXdlci5nZXRDb250cm9sKCksIFhTREVkaXRvckNTSGVscElkcy5BRERfRVhURU5TSU9OU19DT01QT05FTlRTX19FWFRFTlNJT05fQ0FURUdPUklFUyk7Ci0KLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIFRhYmxlIHRhYmxlID0gY2F0ZWdvcnlUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgIHRhYmxlLnNldExheW91dERhdGEoZ2QpOwotICAgIHRhYmxlLnNldEZvbnQoY29udGFpbmVyLmdldEZvbnQoKSk7Ci0KLSAgICBDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjYXRlZ29yeUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgIGdsLm51bUNvbHVtbnMgPSAxOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLSAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLQotICAgIGFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgYWRkQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0FERF9XSVRIX0RPVFMpOwotICAgIGFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLSAgICBhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChhZGRCdXR0b24sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuQUREX0VYVEVOU0lPTlNfQ09NUE9ORU5UU19fQUREKTsgICAgCi0KLSAgICByZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgIHJlbW92ZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9ERUxFVEUpOwotICAgIHJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLSAgICByZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZW1vdmVCdXR0b24sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuQUREX0VYVEVOU0lPTlNfQ09NUE9ORU5UU19fREVMRVRFKTsgICAgCi0KLSAgICAKLSAgICBlZGl0QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICBlZGl0QnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0VESVQpOwotICAgIGVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0gICAgZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGVkaXRCdXR0b24sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuQUREX0VYVEVOU0lPTlNfQ09NUE9ORU5UU19fRURJVCk7ICAgIAotICAgIAotICAgIAotICAgIExpc3QgaW5pdGlhbFNlbGVjdGlvbiA9IGdldEluaXRpYWxFbGVtZW50U2VsZWN0aW9ucygpOwotICAgIGlmIChpbml0aWFsU2VsZWN0aW9uICE9IG51bGwpCi0gICAgICBjYXRlZ29yeVRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihpbml0aWFsU2VsZWN0aW9uKSk7Ci0KLSAgICBMYWJlbCBlbGVtZW50TGFiZWwgPSBuZXcgTGFiZWwoY2F0ZWdvcnlDb21wb3NpdGUsIFNXVC5MRUZUKTsKLSAgICBlbGVtZW50TGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfQVZBSUxBQkxFX0NPTVBPTkVOVFNfVE9fQUREKTsKLQotICAgIG5ldyBMYWJlbChjYXRlZ29yeUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0gICAgZWxlbWVudFRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGNhdGVnb3J5Q29tcG9zaXRlLCBnZXRUYWJsZVN0eWxlKCkpOwotICAgIGVsZW1lbnRUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEVsZW1lbnRDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgZWxlbWVudFRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEVsZW1lbnRMYWJlbFByb3ZpZGVyKCkpOwotICAgIGVsZW1lbnRUYWJsZVZpZXdlci5zZXRJbnB1dChudWxsKTsKLSAgICBlbGVtZW50VGFibGVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIG9rUHJlc3NlZCgpOwotICAgICAgfQotICAgIH0pOwotICAgIGlmICggZWxlbWVudFRhYmxlVmlld2VyRmlsdGVyICE9IG51bGwpewotICAgICAgZWxlbWVudFRhYmxlVmlld2VyLmFkZEZpbHRlcihlbGVtZW50VGFibGVWaWV3ZXJGaWx0ZXIpOwotICAgIH0KLSAgICAKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIHRhYmxlID0gZWxlbWVudFRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0gICAgdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgdGFibGUuc2V0Rm9udChjb250YWluZXIuZ2V0Rm9udCgpKTsKLQotICAgIGVsZW1lbnRUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JICAgICAgICAgIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKHRydWUpOwkJCQotCSAgICB9ICAgICAgICAJICAKLSAgICAgIH0pOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZWxlbWVudFRhYmxlVmlld2VyLmdldENvbnRyb2woKSwgWFNERWRpdG9yQ1NIZWxwSWRzLkFERF9FWFRFTlNJT05TX0NPTVBPTkVOVFNfX0FWQUlMQUJMRV9DT01QT05FTlRTX1RPX0FERCk7Ci0gICAgCi0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZSgpCi0gIHsKLSAgICBzdXBlci5jcmVhdGUoKTsKLSAgICBpZiAoY2F0ZWdvcnlUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpID4gMCkKLSAgICB7Ci0gICAgICBjYXRlZ29yeVRhYmxlVmlld2VyLmdldFRhYmxlKCkuc2VsZWN0KDApOwotICAgICAgCi0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb247Ci0gICAgICBpZiAoY3VycmVudEV4dENhdGVnb3J5ICE9IG51bGwpewotICAgIAkgIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjdXJyZW50RXh0Q2F0ZWdvcnkpOwotICAgICAgfQotICAgICAgZWxzZXsKLSAgICAJICBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gCi0gICAgCQkgIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNhdGVnb3J5VGFibGVWaWV3ZXIuZ2V0RWxlbWVudEF0KDApKTsKLSAgICAgIH0KLSAgICAgIAotCSAgY2F0ZWdvcnlUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0gICAgfQotICAgIAotICAgIC8vIFNldHVwIHRoZSBsaXN0IG9mIGNhdGVnb3J5IG5hbWVzIHRoYXQgYWxyZWFkeSBleGlzdAotICAgIC8vIGFuZCBjb250cnVjdHMgdGhlIFhTRFNjaGVtYSBmb3IgZWFjaCBjYXRlZ29yeQotCWV4aXN0aW5nTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JVGFibGVJdGVtW10gY2F0ZWdvcmllcyA9IGNhdGVnb3J5VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcmllcy5sZW5ndGg7IGkrKyApewotCQlleGlzdGluZ05hbWVzLmFkZChjYXRlZ29yaWVzW2ldLmdldFRleHQoKSk7Ci0KLQkJU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYyA9IAotCQkJKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKSBjYXRlZ29yaWVzW2ldLmdldERhdGEoKTsKLQkJWFNEU2NoZW1hIHNjaGVtYSA9IGdldEFTSVNjaGVtYU1vZGVsKHNwZWMpOwotCQkKLQkJaWYgKHNjaGVtYSA9PSBudWxsKQotCQl7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCUxpc3QgY29tcG9uZW50cyA9IGJ1aWxkSW5wdXQoc2NoZW1hKTsKLQkJc3BlY1RvQ29tcG9uZW50c0xpc3QucHV0KHNwZWMsIGNvbXBvbmVudHMpOwotCi0JCS8vIG1hcmsgY2F0ZWdvcnkgYXMgZ3JheS9lbXB0eSBpZiBhcHBsaWNhYmxlCi0JCU9iamVjdFtdIHJlbWFpbnMgPSBjb21wb25lbnRzLnRvQXJyYXkoKTsKLQkJaWYgKCBlbGVtZW50VGFibGVWaWV3ZXJGaWx0ZXIgIT0gbnVsbCkKLQkJCXJlbWFpbnMgPSBlbGVtZW50VGFibGVWaWV3ZXJGaWx0ZXIuZmlsdGVyKGVsZW1lbnRUYWJsZVZpZXdlciwgCi0JCQkJCWVsZW1lbnRUYWJsZVZpZXdlci5nZXRUYWJsZSgpLCByZW1haW5zKTsKLQkJaWYgKCByZW1haW5zLmxlbmd0aCA9PSAwKQotCQl7Ci0JCSAgY2F0ZWdvcmllc1tpXS5zZXRGb3JlZ3JvdW5kKAotCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSQVkpKTsKLQkJfQotCX0KLQkKLQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZEVsZW1lbnRzVGFibGVGaWx0ZXIoVmlld2VyRmlsdGVyIGZpbHRlcil7Ci0JZWxlbWVudFRhYmxlVmlld2VyRmlsdGVyID0gZmlsdGVyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQcmVmU3RvcmUoSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUpCi0gIHsKLSAgICB0aGlzLnByZWZTdG9yZSA9IHByZWZTdG9yZTsKLSAgfQotCi0gIHByb3RlY3RlZCBQb2ludCBnZXRJbml0aWFsU2l6ZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0U2hlbGwoKS5jb21wdXRlU2l6ZSg0MDAsIDMwMCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBzdHlsZSBmbGFncyBmb3IgdGhlIHRhYmxlIHZpZXdlci4KLSAgICogCi0gICAqIEByZXR1cm4gaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgaW50IGdldFRhYmxlU3R5bGUoKQotICB7Ci0gICAgcmV0dXJuIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSOwotICB9Ci0KLSAgLyoKLSAgICogT3ZlcnJpZGVzIG1ldGhvZCBmcm9tIERpYWxvZwotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkKLSAgewotICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiBzZWxlY3RlZCBjaGlsZHJlbi4KLSAgICBnZXRTaGVsbCgpLnNldEN1cnNvcihuZXcgQ3Vyc29yKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX1dBSVQpKTsKLSAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBlbGVtZW50U2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBlbGVtZW50VGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY2F0ZWdvcnlTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNhdGVnb3J5VGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcmVzdWx0LmFkZChlbGVtZW50U2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLSAgICByZXN1bHQuYWRkKGNhdGVnb3J5U2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLSAgICBpZiAoZWxlbWVudFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHNldFJlc3VsdChyZXN1bHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0UmVzdWx0KG51bGwpOwotICAgIH0KLSAgICBzdXBlci5va1ByZXNzZWQoKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBhZGRCdXR0b24pCi0gICAgewotICAgIAlBZGROZXdDYXRlZ29yeURpYWxvZyBhZGROZXdDYXRlZ29yeURpYWxvZwotICAgIAkJPSBuZXcgQWRkTmV3Q2F0ZWdvcnlEaWFsb2coZ2V0U2hlbGwoKSk7Ci0gICAgCQotICAgIAlhZGROZXdDYXRlZ29yeURpYWxvZy5zZXRVbmF2YWlsYWJsZUNhdGVnb3J5TmFtZXMoZXhpc3RpbmdOYW1lcyk7Ci0gICAgCQotICAgIAlpZiAoIGFkZE5ld0NhdGVnb3J5RGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0sgKXsgICAgCQkKLSAgICAJCVNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNjaGVtYVNwZWMgPSAKLSAgICAJCQluZXcgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEoKTsKLSAgICAJCXNjaGVtYVNwZWMuc2V0RGlzcGxheU5hbWUoYWRkTmV3Q2F0ZWdvcnlEaWFsb2cuZ2V0TmV3Q2F0ZWdvcnlOYW1lKCkgKTsKLSAgICAJCXNjaGVtYVNwZWMuc2V0TG9jYXRpb24oYWRkTmV3Q2F0ZWdvcnlEaWFsb2cuZ2V0Q2F0ZWdvcnlMb2NhdGlvbigpICk7Ci0gICAgCQlzY2hlbWFTcGVjLnNldFNvdXJjZUhpbnQoYWRkTmV3Q2F0ZWdvcnlEaWFsb2cuZ2V0U291cmNlKCkpOwotICAgIAkJc2NoZW1hU3BlYy5zZXRGcm9tQ2F0YWxvZyhhZGROZXdDYXRlZ29yeURpYWxvZy5nZXRGcm9tQ2F0YWxvZygpICk7Ci0KLSAgICAJCWZJbnB1dC5hZGQoc2NoZW1hU3BlYyk7Ci0gICAgCQlleGlzdGluZ05hbWVzLmFkZChzY2hlbWFTcGVjLmdldERpc3BsYXlOYW1lKCkpOwotCi0gICAgCQkvLyByZWZyZXNoIHdpdGhvdXQgdXBkYXRpbmcgbGFiZWxzIG9mIGV4aXN0aW5nIFRhYmxlSXRlbXMgICAgCQkKLSAgICAJCWNhdGVnb3J5VGFibGVWaWV3ZXIucmVmcmVzaChmYWxzZSk7Ci0KLSAgICAJCWNhdGVnb3J5VGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNjaGVtYVNwZWMpKTsKLSAgICAJCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAJCQotICAgIAkJc3RvcmVTcGVjSW5QcmVmKHNjaGVtYVNwZWMpOyAgLy8gbXVzdCBzdG9yZSBhZnRlciBzZWxlY3Rpb24gY2hhbmdlZCBpcyBjYWxsZWQgaWUuIDIgbGluZXMgYWJvdmUgKHRydW5nKQotICAgIAl9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHJlbW92ZUJ1dHRvbikKLSAgICB7Ci0gICAgCVRhYmxlSXRlbVtdIHNlbGVjdGlvbnMgPSBjYXRlZ29yeVRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgCWZvciAoaW50IGkgPTA7IGkgPCBzZWxlY3Rpb25zLmxlbmd0aDsgaSsrKXsKLSAgICAJCVNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMgPSAKLSAgICAJCQkoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpIHNlbGVjdGlvbnNbaV0uZ2V0RGF0YSgpOwotCi0JCQlmSW5wdXQucmVtb3ZlKHNwZWMgKTsKLSAgICAJCWV4aXN0aW5nTmFtZXMucmVtb3ZlKHNwZWMuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgCQlzcGVjVG9Db21wb25lbnRzTGlzdC5yZW1vdmUoc3BlYyk7Ci0gICAgCQkKLSAgICAJCXJlbW92ZUZyb21QcmVmKHNwZWMpOwotICAgIAl9Ci0gICAgCWNhdGVnb3J5VGFibGVWaWV3ZXIucmVmcmVzaChmYWxzZSk7Ci0KLSAgICAJZWxlbWVudFRhYmxlVmlld2VyLnNldElucHV0KG51bGwpOwotICAgIAllbGVtZW50VGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0gICAgICAgIC8vIFRPRE8gYXV0byBzZWxlY3QgZWl0aGVyIHRoZSBwcmV2IGNhdGVnb3J5LCB0aGUgbmV4dCBjYXRlZ29yeSBvciB0aGUgZmlyc3QgY2F0ZWdvcnkgaW4gdGhlIFRhYmxlCi0gICAgCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZWRpdEJ1dHRvbikKLSAgICB7Ci0gICAgICAgIC8vIHVzZSB0aGlzIGRpYWxvZyBub3QgZm9yIGFkZGluZyBidXQgZm9yIGVkaXRpbmcgcHVycG9zZS4KLSAgICAgICAgQWRkTmV3Q2F0ZWdvcnlEaWFsb2cgZGlhbG9nID0gbmV3IEFkZE5ld0NhdGVnb3J5RGlhbG9nKGdldFNoZWxsKCksIE1lc3NhZ2VzLl9VSV9MQUJFTF9FRElUX0NBVEVHT1JZKTsKLSAgICAgICAgCi0gICAgCVRhYmxlSXRlbVtdIHNlbGVjdGlvbnMgPSBjYXRlZ29yeVRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgCWlmIChzZWxlY3Rpb25zLmxlbmd0aCA9PSAwKQotICAgIAkJcmV0dXJuOwotCi0gICAgCVNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMgPSAoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpIHNlbGVjdGlvbnNbMF0uZ2V0RGF0YSgpOwotICAgICAgICAKLSAgICAJU3RyaW5nIGRpc3BsYXlOYW1lID0gc3BlYy5nZXREaXNwbGF5TmFtZSgpOwotCi0JCWRpYWxvZy5zZXRDYXRlZ29yeU5hbWUoZGlzcGxheU5hbWUgKTsKLSAgICAJZGlhbG9nLnNldEZyb21DYXRhbG9nKHNwZWMuaXNGcm9tQ2F0YWxvZygpICk7Ci0gICAgCWRpYWxvZy5zZXRTb3VyY2Uoc3BlYy5nZXRTb3VyY2VIaW50KCkgKTsKLSAgICAJZGlhbG9nLnNldENhdGVnb3J5TG9jYXRpb24oc3BlYy5nZXRMb2NhdGlvbigpICk7Ci0KLSAgICAJc3BlY1RvQ29tcG9uZW50c0xpc3QucmVtb3ZlKHNwZWMpOwotICAgIAlkaWFsb2cuc2V0VW5hdmFpbGFibGVDYXRlZ29yeU5hbWVzKGV4aXN0aW5nTmFtZXMpOwotICAgICAgICAKLSAgICAgICAgaWYgKCBkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSyl7Ci0gICAgICAgIAlleGlzdGluZ05hbWVzLnJlbW92ZShkaXNwbGF5TmFtZSk7Ci0JCQlTdHJpbmcgbmV3RGlzcGxheU5hbWUgPSBkaWFsb2cuZ2V0TmV3Q2F0ZWdvcnlOYW1lKCk7Ci0KLQkJCXNwZWMuc2V0RGlzcGxheU5hbWUobmV3RGlzcGxheU5hbWUpOwotICAgICAgICAJc3BlYy5zZXRMb2NhdGlvbihkaWFsb2cuZ2V0Q2F0ZWdvcnlMb2NhdGlvbigpKTsKLSAgICAgICAgCXNwZWMuc2V0U291cmNlSGludChkaWFsb2cuZ2V0U291cmNlKCkpOwotICAgICAgICAJc3BlYy5zZXRGcm9tQ2F0YWxvZyhkaWFsb2cuZ2V0RnJvbUNhdGFsb2coKSk7Ci0gICAgICAgIAlzcGVjLnNldE5hbWVzcGFjZVVSSShudWxsKTsKLSAgICAgICAgCQotICAgICAgICAJZXhpc3RpbmdOYW1lcy5hZGQobmV3RGlzcGxheU5hbWUpOwotCi0gICAgICAgIAljYXRlZ29yeVRhYmxlVmlld2VyLnVwZGF0ZShzcGVjLCBudWxsKTsKLSAgICAgICAgCXJlZnJlc2hFbGVtZW50c1ZpZXdlcihzcGVjKTsKLSAgICAgICAgCQotICAgICAgICAJZWRpdFNwZWNJblByZWYoZGlzcGxheU5hbWUsIHNwZWMpOwotICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgewotCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgewotICAgIGlmIChldmVudC5nZXRTb3VyY2UoKSA9PSBjYXRlZ29yeVRhYmxlVmlld2VyKQotICAgIHsKLSAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKQotICAgICAgICB7Ci0gICAgICAgICAgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYyA9IChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSkgb2JqOwotICAgICAgICAgIGN1cnJlbnRFeHRDYXRlZ29yeSA9IHNwZWM7Ci0gICAgICAgICAgcmVmcmVzaEVsZW1lbnRzVmlld2VyKHNwZWMpOwotCi0gICAgICAgICAgaWYgKCBzcGVjLmlzRGVmYXV0U2NoZW1hKCkgKXsKLSAgICAgICAgCWVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIAlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2V7Ci0gICAgICAgIAllZGl0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIAlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCByZWZyZXNoRWxlbWVudHNWaWV3ZXIoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYykgewotCSAgTGlzdCBjb21wb25lbnRzID0gKExpc3QpIHNwZWNUb0NvbXBvbmVudHNMaXN0LmdldChzcGVjKTsKLQkgIGlmICggY29tcG9uZW50cyAhPSBudWxsKXsKLQkJZWxlbWVudFRhYmxlVmlld2VyLnNldElucHV0KGNvbXBvbmVudHMpOwotCQlyZXR1cm47Ci0JICB9Ci0JICAKLQkgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBnZXRBU0lTY2hlbWFNb2RlbChzcGVjKTsKLQotCSAgaWYgKHhzZFNjaGVtYSA9PSBudWxsKXsKLQkJICBNZXNzYWdlQm94IGVyckRpYWxvZyA9IG5ldyBNZXNzYWdlQm94KGdldFNoZWxsKCksIFNXVC5JQ09OX0VSUk9SKTsKLQkJICBlcnJEaWFsb2cuc2V0VGV4dChNZXNzYWdlcy5fVUlfRVJST1JfSU5WQUxJRF9DQVRFR09SWSk7Ci0JCSAgLy8gVE9ETyAodHJ1bmcpIEkgd2FzIGZvcmNlZCB0byB1c2UgYSBTdHJpbmcgaW4gTWVzc2FnZXMgdG8gbWFrZSB0aGUgZXJyb3IgY2xlYXJlcgotCQkgIC8vIFdoZW4gd2UgYXJlIGJhY2sgdG8gZGV2ZWxvcG1lbnQgcGhhc2UsIHVzZSBhbm90aGVyIHN0cmluZzogIkV4dGVuc2lvbiBDYXRlZ29yeTogIgotCQkgIC8vIG5vdCAiRXh0ZW5zaW9uIENhdGVnb3JpZXM6IiArICIgIiBsaWtlIHdlIGFyZSB1c2luZyBoZXJlCi0JCSAgZXJyRGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuX1VJX0xBQkVMX0VYVEVOU0lPTl9DQVRFR09SSUVTICsgIiAiICsgc3BlYy5nZXREaXNwbGF5TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkgICsgIlxuIiAgIC8vJE5PTi1OTFMtMSQKLQkJCQkgICsgTWVzc2FnZXMuX1VJX0VSUk9SX0ZJTEVfQ0FOTk9UX0JFX1BBUlNFRAotCQkJCSAgKyAiXG4iICsgTWVzc2FnZXMuX1VJX0VSUk9SX1ZBTElEQVRFX1RIRV9GSUxFKTsgICAvLyROT04tTkxTLTEkCi0JCSAgZXJyRGlhbG9nLm9wZW4oKTsKLQkJICAKLQkJICBlbGVtZW50VGFibGVWaWV3ZXIuc2V0SW5wdXQobmV3IEFycmF5TGlzdCgwKSk7Ci0JCSAgcmV0dXJuOwotCSAgfQotCSAgCi0JICBjb21wb25lbnRzID0gYnVpbGRJbnB1dCh4c2RTY2hlbWEpOwotICAgICAgc3BlY1RvQ29tcG9uZW50c0xpc3QucHV0KHNwZWMsIGNvbXBvbmVudHMpOwkgIAotCSAgCi0JICBMaXN0IGFsbEl0ZW1zID0gYnVpbGRJbnB1dCh4c2RTY2hlbWEpOwotCSAgaWYgKCBhbGxJdGVtcyA9PSBudWxsICkKLQkJICByZXR1cm47Ci0JICBlbGVtZW50VGFibGVWaWV3ZXIuc2V0SW5wdXQoYWxsSXRlbXMpOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBMaXN0IGJ1aWxkSW5wdXQoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotCWlmICggeHNkU2NoZW1hID09bnVsbCApCi0JCXJldHVybiBudWxsOwotCi0gICAgTGlzdCBlbGVtZW50cyA9IHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCk7Ci0gICAgTGlzdCBhdHRyaWJ1dGVzID0geHNkU2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOwotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICAvLyBGb3Igc2FmZXR5IHB1cnBvc2U6IFdlIGRvbid0IGFwcGVuZCAnYXR0cmlidXRlcycgdG8gJ2VsZW1lbnRzJwotICAgIC8vIEFycmF5U3RvcmVFeGNlcHRpb24ob3Igc2ltaWxhciBvbmUpIG1heSBvY2N1cgotICAgIExpc3QgYWxsSXRlbXMgPSBuZXcgQXJyYXlMaXN0KGF0dHJpYnV0ZXMuc2l6ZSgpICsgZWxlbWVudHMuc2l6ZSgpKTsKLSAgICAKLSAgICB7Ci0gICAgICAvLyBnZXRFbGVtZW50RGVjbGFyYXRpb25zIHJldHVybnMgYSBsb3Qgb2YgZWxlbWVudHMgZnJvbSBpbXBvcnQKLSAgICAgIC8vIHN0YXRlbWVudCwgd2UKLSAgICAgIC8vIG9ubHkgYWRkIG5vbi1pbXBvcnRlZCBlbGVtZW50cyBoZXJlLiAodHJ1bmcpCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gY3VycmVudEVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50cy5nZXQoaSk7Ci0gICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyh0YXJnZXROYW1lc3BhY2UpKQotICAgICAgICAgICAgYWxsSXRlbXMuYWRkKGN1cnJlbnRFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgICAgICBhbGxJdGVtcy5hZGQoY3VycmVudEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBnZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMgYWxzbyByZXR1cm5zIGEgbG90IG9mIGVsZW1lbnRzIGZyb20KLSAgICAgIC8vIGltcG9ydCBzdGF0ZW1lbnQsIHdlCi0gICAgICAvLyBvbmx5IGFkZCBub24taW1wb3J0ZWQgZWxlbWVudHMgaGVyZS4gKHRydW5nKQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBjdXJyZW50QXR0cmlidXRlID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyaWJ1dGVzLmdldChpKTsKLSAgICAgICAgaWYgKGN1cnJlbnRBdHRyaWJ1dGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChjdXJyZW50QXR0cmlidXRlLmlzR2xvYmFsKCkgJiYgY3VycmVudEF0dHJpYnV0ZS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHModGFyZ2V0TmFtZXNwYWNlKSkKLSAgICAgICAgICAgIGFsbEl0ZW1zLmFkZChjdXJyZW50QXR0cmlidXRlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgICAgICBhbGxJdGVtcy5hZGQoY3VycmVudEF0dHJpYnV0ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGFsbEl0ZW1zOwotICB9Ci0KLSAgCi0gIHByaXZhdGUgc3RhdGljIFhTRFNjaGVtYSBnZXRBU0lTY2hlbWFNb2RlbChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBleHRlbnNpb25zU2NoZW1hU3BlYykKLSAgewotICAgIFN0cmluZyBsb2NhdGlvbiA9IGV4dGVuc2lvbnNTY2hlbWFTcGVjLmdldExvY2F0aW9uKCk7Ci0gICAgaWYgKCBsb2NhdGlvbiA9PSBudWxsKQotICAgIAlyZXR1cm4gbnVsbDsKLQlYU0RTY2hlbWEgeHNkU2NoZW1hID0gWFNESW1wbC5idWlsZFhTRE1vZGVsKGxvY2F0aW9uKTsKLSAgICAKLSAgICAvLyBub3cgdGhhdCB0aGUgLnhzZCBmaWxlIGlzIHJlYWQsIHdlIGNhbiByZXRyaWV2ZSB0aGUgbmFtZXNwYWNlIG9mIHRoaXMgeHNkIGZpbGUKLSAgICAvLyBhbmQgc2V0IHRoZSBuYW1lc3BhY2UgZm9yICdwcm9wZXJ0aWVzJwotICAgIGlmICggZXh0ZW5zaW9uc1NjaGVtYVNwZWMuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCl7Ci0gICAgCWV4dGVuc2lvbnNTY2hlbWFTcGVjLnNldE5hbWVzcGFjZVVSSSggeHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzdG9yZVNwZWNJblByZWYoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc2NoZW1hU3BlYykgewotCWlmIChwcmVmU3RvcmUgPT0gbnVsbCkKLQkJcmV0dXJuOwotCQotCVN0cmluZyBjdXJyZW50VmFsdWUgPSBwcmVmU3RvcmUuZ2V0U3RyaW5nKEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkuVVNFUl9BRERFRF9FWFRfU0NIRU1BUyk7Ci0JU3RyaW5nIHNwZWNEZXNjID0gIiAgIiArICJcdCIgKyBzY2hlbWFTcGVjLmdldERpc3BsYXlOYW1lKCkgKyAiXHQiKwotCQlzY2hlbWFTcGVjLmdldE5hbWVzcGFjZVVSSSgpICsgIlx0IiArIHNjaGVtYVNwZWMuZ2V0TG9jYXRpb24oKSArICJcdCIgKwotCQlzY2hlbWFTcGVjLmlzRGVmYXV0U2NoZW1hKCkgKyAiXHQiICsgc2NoZW1hU3BlYy5nZXRTb3VyY2VIaW50KCkgKyAiXHQiICsKLQkJc2NoZW1hU3BlYy5pc0Zyb21DYXRhbG9nKCk7Ci0JY3VycmVudFZhbHVlICs9IHNwZWNEZXNjICsgIlxuIjsKLQotCXByZWZTdG9yZS5zZXRWYWx1ZShFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5LlVTRVJfQURERURfRVhUX1NDSEVNQVMsCi0JCQljdXJyZW50VmFsdWUpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGVkaXRTcGVjSW5QcmVmKFN0cmluZyBkaXNwbGF5TmFtZSwgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgbmV3U3BlYykgewotCWlmIChwcmVmU3RvcmUgPT0gbnVsbCkKLQkgIHJldHVybjsKLQkKLQlTdHJpbmcgbmV3VmFsdWUgPSAiIjsKLQlTdHJpbmcgY3VycmVudFZhbHVlID0gcHJlZlN0b3JlLmdldFN0cmluZyhFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5LlVTRVJfQURERURfRVhUX1NDSEVNQVMpOwotCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGN1cnJlbnRWYWx1ZSwgIlxuIik7Ci0KLQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLQl7Ci0JICBTdHJpbmcgb25lU3BlY0Rlc2MgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JICAvLyBnZXQgdGhlIERpc3BsYXkgbmFtZQotCSAgU3RyaW5nVG9rZW5pemVyIF90b2tlbml6ZXJfMiA9IG5ldyBTdHJpbmdUb2tlbml6ZXIob25lU3BlY0Rlc2MsICJcdCIpOwotCSAgX3Rva2VuaXplcl8yLm5leHRUb2tlbigpOwotCSAgU3RyaW5nIGROYW1lID0gX3Rva2VuaXplcl8yLm5leHRUb2tlbigpOwotCi0JICBpZiAoIGROYW1lLmVxdWFscyhkaXNwbGF5TmFtZSApICkKLQkgIHsKLQkJb25lU3BlY0Rlc2MgPSAiICAiICsgIlx0IiArIG5ld1NwZWMuZ2V0RGlzcGxheU5hbWUoKSArICJcdCIrCi0JCQluZXdTcGVjLmdldE5hbWVzcGFjZVVSSSgpICsgIlx0IiArIG5ld1NwZWMuZ2V0TG9jYXRpb24oKSArICJcdCIgKwotCQkJbmV3U3BlYy5pc0RlZmF1dFNjaGVtYSgpICsgIlx0IiArIG5ld1NwZWMuZ2V0U291cmNlSGludCgpICsgIlx0IiArCi0JCQluZXdTcGVjLmlzRnJvbUNhdGFsb2coKTsJCSAgCi0JICB9Ci0KLQkgIG5ld1ZhbHVlICs9IG9uZVNwZWNEZXNjICsgIlxuIjsKLQl9Ci0JcHJlZlN0b3JlLnNldFZhbHVlKEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkuVVNFUl9BRERFRF9FWFRfU0NIRU1BUywgbmV3VmFsdWUpOwotCQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlbW92ZUZyb21QcmVmKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMpIHsKLQlpZiAocHJlZlN0b3JlID09IG51bGwpCi0JICByZXR1cm47CSAgCi0JICAKLQlTdHJpbmcgbmV3VmFsdWUgPSAiIjsKLQlTdHJpbmcgY3VycmVudFZhbHVlID0gcHJlZlN0b3JlLmdldFN0cmluZyhFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5LlVTRVJfQURERURfRVhUX1NDSEVNQVMpOwotCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGN1cnJlbnRWYWx1ZSwgIlxuIik7Ci0KLQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLQl7Ci0JICBTdHJpbmcgb25lU3BlY0Rlc2MgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JICAvLyBnZXQgdGhlIERpc3BsYXkgbmFtZQotCSAgU3RyaW5nVG9rZW5pemVyIF90b2tlbml6ZXJfMiA9IG5ldyBTdHJpbmdUb2tlbml6ZXIob25lU3BlY0Rlc2MsICJcdCIpOwotCSAgX3Rva2VuaXplcl8yLm5leHRUb2tlbigpOwotCSAgU3RyaW5nIGROYW1lID0gX3Rva2VuaXplcl8yLm5leHRUb2tlbigpOwotCi0JICBpZiAoIGROYW1lLmVxdWFscyhzcGVjLmdldERpc3BsYXlOYW1lKCkgKSApCi0JCWNvbnRpbnVlOwotCSAgbmV3VmFsdWUgKz0gb25lU3BlY0Rlc2MgKyAiXG4iOwotCX0KLQlwcmVmU3RvcmUuc2V0VmFsdWUoRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeS5VU0VSX0FEREVEX0VYVF9TQ0hFTUFTLCBuZXdWYWx1ZSk7Ci0gIH0KLQotc3RhdGljIGNsYXNzIENhdGVnb3J5Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotICAgIHsgICAgCi0gICAgICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYVtdIGV4dGVuc2lvbnNTY2hlbWFTcGVjcyA9IG51bGw7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBpbnB1dExpc3QgPSAoTGlzdCkgaW5wdXRFbGVtZW50OwotICAgICAgICBleHRlbnNpb25zU2NoZW1hU3BlY3MgPSAoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWFbXSkgaW5wdXRMaXN0LnRvQXJyYXkobmV3IFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hWzBdKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIHJldHVybiBleHRlbnNpb25zU2NoZW1hU3BlY3M7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgICAgLy8gRG8gbm90aGluZwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gICAgewotICAgICAgLy8gRG8gbm90aGluZwotCi0gICAgfQotICB9Ci0KLSAgc3RhdGljIGNsYXNzIENhdGVnb3J5TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLSAgewotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9hcHBpbmZvX2NhdGVnb3J5LmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSkKLSAgICAgICAgcmV0dXJuICgoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpIGVsZW1lbnQpLmdldERpc3BsYXlOYW1lKCk7Ci0KLSAgICAgIHJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBjbGFzcyBFbGVtZW50Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0KQotICAgICAgewotICAgICAgICByZXR1cm4gKChMaXN0KSBpbnB1dEVsZW1lbnQpLnRvQXJyYXkoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICAgIC8vIERvIG5vdGhpbmcKLQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLSAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICAgIHsKLSAgICAgIC8vIERvIG5vdGhpbmcKLQotICAgIH0KLSAgfQotCi0gIGNsYXNzIEVsZW1lbnRMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotICB7ICAgIAotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICBpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pewotICAgIAkgIAotICAgIAkgIC8vIFdvcmthcm91bmQgdHJpY2s6ICh0cnVuZykgd2UgY3JlYXRlIGEgdGVtcG9yYXJ5IERvbSBlbGVtZW50IGFuZCBwdXQgaXQgaW4gdGhlIGxhYmVsIHByb3ZpZGVyCi0gICAgCSAgLy8gdG8gZ2V0IHRoZSBpbWFnZS4KLSAgICAJICBTdHJpbmcgbmFtZXNwYWNlID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnQpLmdldFNjaGVtYSgpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIAkgIFN0cmluZyBuYW1lID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnQpLmdldE5hbWUoKTsKLSAgICAJICBFbGVtZW50IHRlbXBFbGVtZW50ID0gdGVtcERvYy5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlLCBuYW1lKTsKLSAgICAgICAgICBJTGFiZWxQcm92aWRlciBscCA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Tm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSgpLmdldExhYmVsUHJvdmlkZXIobmFtZXNwYWNlKTsKLSAgICAJICBpZiAobHAgIT0gbnVsbCl7Ci0gICAgCQkgIEltYWdlIGltZyA9IGxwLmdldEltYWdlKHRlbXBFbGVtZW50KTsKLSAgICAJCSAgCi0gICAgCQkgIGlmIChpbWcgIT0gbnVsbCl7Ci0gICAgCQkJICByZXR1cm4gaW1nOwotICAgIAkJICB9Ci0gICAgCSAgfQotICAgIAkgIHJldHVybiBERUZBVUxUX0VMRU1FTlRfSUNPTjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pewotICAgIAkgIHJldHVybiBERUZBVUxUX0FUVFJJQlVURV9JQ09OOwotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICAgIHJldHVybiAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudCkuZ2V0TmFtZSgpOwotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiApCi0gICAgICAgIHJldHVybiAoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0gICAgICByZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjbG9zZSgpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuY2xvc2UoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZW5hYmxlQnV0dG9ucyhib29sZWFuIHZhbHVlKQotICB7Ci0gICAgZWRpdEJ1dHRvbi5zZXRFbmFibGVkKHZhbHVlKTsKLSAgICBhZGRCdXR0b24uc2V0RW5hYmxlZCh2YWx1ZSk7Ci0gICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQodmFsdWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vQWRkTmV3Q2F0ZWdvcnlEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9BZGROZXdDYXRlZ29yeURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzU2ODc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9BZGROZXdDYXRlZ29yeURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9ncy5TZWxlY3RTaW5nbGVGaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIEFkZE5ld0NhdGVnb3J5RGlhbG9nIGV4dGVuZHMgRGlhbG9nCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfTEFCRUwgPSBNZXNzYWdlcy5fVUlfTEFCRUxfU0NIRU1BOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9MQUJFTCA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FOyAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfRlJPTV9XT1JLU1BBQ0UgPSBNZXNzYWdlcy5fVUlfTEFCRUxfV09SS1NQQUNFOyAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9GUk9NX0NBVEFMT0cgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQ0FUQUxPRzsgIAotICBwcml2YXRlIFN0cmluZyBkaWFsb2dUaXRsZSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9BRERfQ0FURUdPUlk7Ci0gICAgCi0gIHByb3RlY3RlZCBNZW51TWFuYWdlciBicm93c2VNZW51OwotICBwcm90ZWN0ZWQgTGFiZWwgbmFtZTsKLSAgcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0gIHByb3RlY3RlZCBMYWJlbCBzY2hlbWE7Ci0gIHByb3RlY3RlZCBDTGFiZWwgc2NoZW1hRGlzcGxheWVyOwotICBwcm90ZWN0ZWQgVG9vbEJhciBicm93c2VUb29sQmFyOwotICBwcm90ZWN0ZWQgVG9vbEl0ZW0gYnJvd3NlSXRlbTsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBzZWFyY2hDYXRhbG9nOwotICBwcm90ZWN0ZWQgQnV0dG9uIHNlYXJjaFdvcmtzcGFjZTsgIAotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIHNvdXJjZXNDb21wb3NpdGU7Ci0KLSAgcHJvdGVjdGVkIExpc3QgaW52YWxpZE5hbWVzOwotICAKLSAgLy8gVE9ETyAoY3MpIHJlbmFtZSB0aGlzIGZpZWxkIHRvIGV4dGVuc2lvblNjaGVtYUxvY2F0aW9uIGluIFdUUCAyLjAKLSAgcHJvdGVjdGVkIFN0cmluZyBhcHBJbmZvU2NoZW1hTG9jYXRpb247Ci0gIHByb3RlY3RlZCBTdHJpbmcgY2F0ZWdvcnlOYW1lOwotICBwcm90ZWN0ZWQgQ0xhYmVsIGVyckRpc3BsYXllcjsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDYXRlZ29yeU5hbWVWYWxpZDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZnJvbUNhdGFsb2c7Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gY2FuT0sgPWZhbHNlOyAKLSAgCi0gIC8qKiBFaXRoZXIgdGhlIGxvY2F0aW9uIGlmIGNvbWUgZnJvbSB3b3Jrc3BhY2Ugb3IgbmFtZXNwYWNlIGlmIGNvbWUgZnJvbQotICAgKiAJWE1MIENhdGFsb2cgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgc291cmNlOwotCi0gIHB1YmxpYyBBZGROZXdDYXRlZ29yeURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgfQotCi0gIHB1YmxpYyBBZGROZXdDYXRlZ29yeURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgIHRoaXMuZGlhbG9nVGl0bGUgPSBkaWFsb2dUaXRsZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIHJlY2VpdmUgYSBMaXN0IG9mIG5hbWVzIHdoaWNoIGhhdmUgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBjYXRlZ29yeSBsaXN0Ci0gICAqIAotICAgKiBAcGFyYW0gdW5hdmFpbE5hbWVzCi0gICAqICAgICAgICAgIEFycmF5IG9mIHVudmFpbGFibGUgbmFtZXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVuYXZhaWxhYmxlQ2F0ZWdvcnlOYW1lcyhMaXN0IHVuYXZhaWxOYW1lcykKLSAgewotICAgIGludmFsaWROYW1lcyA9IHVuYXZhaWxOYW1lczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmV3Q2F0ZWdvcnlOYW1lKCkKLSAgewotICAgIHJldHVybiBjYXRlZ29yeU5hbWUudHJpbSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeUxvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBhcHBJbmZvU2NoZW1hTG9jYXRpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENhdGVnb3J5TG9jYXRpb24oU3RyaW5nIHMpewotCSAgYXBwSW5mb1NjaGVtYUxvY2F0aW9uID0gczsKLSAgfQotICAKLSAgLyoqIEBkZXByZWNhdGVkICovCi0gIHB1YmxpYyBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBnZXRFeHRlbnNpb25zU2NoZW1hU3BlYygpewotCVNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNjaGVtYVNwZWMgPSBuZXcgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEoKTsKLQlzY2hlbWFTcGVjLnNldERpc3BsYXlOYW1lKGdldE5ld0NhdGVnb3J5TmFtZSgpKTsKLQlzY2hlbWFTcGVjLnNldExvY2F0aW9uKGdldENhdGVnb3J5TG9jYXRpb24oKSk7Ci0JCi0JcmV0dXJuIHNjaGVtYVNwZWM7Ci0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnlOYW1lKFN0cmluZyBjYXRlZ29yeU5hbWUpIHsKLQl0aGlzLmNhdGVnb3J5TmFtZSA9IGNhdGVnb3J5TmFtZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEZyb21DYXRhbG9nKCkgewotCXJldHVybiBmcm9tQ2F0YWxvZzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RnJvbUNhdGFsb2coYm9vbGVhbiBiKXsKLQlmcm9tQ2F0YWxvZyA9IGI7CQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKQotICB7Ci0JcmV0dXJuIHNvdXJjZTsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCXRoaXMuc291cmNlID0gc291cmNlOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb250cm9sIHJlc3VsdCA9IHN1cGVyLmNyZWF0ZUJ1dHRvbkJhcihwYXJlbnQpOwotICAgIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGNhbk9LKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8gcmVkdW5kYW50IG1ldGhvZCB0byBpbXByb3ZlIHNwZWVkIChhY2NvcmRpbmcgdG8gdGhlIGNvbXBpbGVyKQotICBwcm90ZWN0ZWQgQnV0dG9uIGdldEJ1dHRvbihpbnQgaWQpIHsKLSAgICByZXR1cm4gc3VwZXIuZ2V0QnV0dG9uKGlkKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgZ2V0U2hlbGwoKS5zZXRUZXh0KGRpYWxvZ1RpdGxlKTsKLQotICAgIENvbXBvc2l0ZSBtYWluQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgIGxheW91dC5tYXJnaW5Ub3AgPSAxMDsKLSAgICBtYWluQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgIG1haW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEud2lkdGhIaW50ID0gNDAwOwotCi0gICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gTGluZSAxLCBuYW1lCi0gICAgbmFtZSA9IG5ldyBMYWJlbChtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgbmFtZS5zZXRUZXh0KE5BTUVfTEFCRUwpOwotCi0gICAgbmFtZVRleHQgPSBuZXcgVGV4dChtYWluQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7Ci0gICAgbmFtZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7ICAgIAotICAgIGlmIChjYXRlZ29yeU5hbWUgIT0gbnVsbCkKLSAgICAJbmFtZVRleHQuc2V0VGV4dChjYXRlZ29yeU5hbWUpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmFtZVRleHQsCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuQUREX0NBVEVHT1JZX19OQU1FKTsgICAgIAotCi0gICAgCi0KLSAgICAvLyBMaW5lIDIsIHNjaGVtYQotICAgIHNjaGVtYSA9IG5ldyBMYWJlbChtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgc2NoZW1hLnNldFRleHQoU0NIRU1BX0xBQkVMKTsKLQotICAgIHNjaGVtYURpc3BsYXllciA9IG5ldyBDTGFiZWwobWFpbkNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotICAgIHNjaGVtYURpc3BsYXllci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBpZiAoc291cmNlICE9IG51bGwpCi0gICAgewotICAgIAlpZiAoZnJvbUNhdGFsb2cpCi0gICAgCQlzY2hlbWFEaXNwbGF5ZXIuc2V0SW1hZ2UoCi0gICAgCQkJCVhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMveG1sY2F0YWxvZ19vYmouZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgCWVsc2UKLSAgICAJCXNjaGVtYURpc3BsYXllci5zZXRJbWFnZSgKLSAgICAJCQkJWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RGaWxlLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIAlzY2hlbWFEaXNwbGF5ZXIuc2V0VGV4dChzb3VyY2UpOwotICAgIAkKLSAgICB9Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzY2hlbWFEaXNwbGF5ZXIsCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuQUREX0NBVEVHT1JZX19TQ0hFTUEpOyAKLSAgICAKLSAgICBpZiAoY2F0ZWdvcnlOYW1lICE9IG51bGwgJiYgc291cmNlICE9IG51bGwpCi0gICAgCWNhbk9LID0gdHJ1ZTsKLSAgICAKLSAgICAvLyBMaW5lIDMsIHNjaGVtYSBzZWxlY3Rpb24gYnV0dG9ucyAgICAgICAgICAgIAotICAgIEJ1dHRvbiBoaWRkZW4gPSBuZXcgQnV0dG9uKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBoaWRkZW4uc2V0VmlzaWJsZShmYWxzZSk7ICAgIAotICAgICAgICAgICAKLSAgICBzb3VyY2VzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgUm93TGF5b3V0IHNvdXJjZXNMYXlvdXQgPSBuZXcgUm93TGF5b3V0KCk7Ci0gIAotICAgIHNvdXJjZXNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLSAgICBzb3VyY2VzQ29tcG9zaXRlLnNldExheW91dChzb3VyY2VzTGF5b3V0KTsKLSAgICAKLSAgICBzZWFyY2hXb3Jrc3BhY2UgPSBuZXcgQnV0dG9uKHNvdXJjZXNDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBzZWFyY2hXb3Jrc3BhY2Uuc2V0VGV4dChTRUxFQ1RfRlJPTV9XT1JLU1BBQ0UpOwotICAgICAgICAKLSAgICBzZWFyY2hDYXRhbG9nID0gbmV3IEJ1dHRvbihzb3VyY2VzQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgc2VhcmNoQ2F0YWxvZy5zZXRUZXh0KFNFTEVDVF9GUk9NX0NBVEFMT0cpOwotICAgIAotICAgIHNlYXJjaFdvcmtzcGFjZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgewotICAgIAlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIAl7Ci0gICAgCQlmaW5hbCBTdHJpbmcgWFNEX0ZJTEVfRVhURU5TSU9OID0gIi54c2QiOyAvLyROT04tTkxTLTEkICAgCSAgICAKLSAgICAJICAgIAotICAgIAkgICAgICBTZWxlY3RTaW5nbGVGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWxlY3RTaW5nbGVGaWxlRGlhbG9nKGdldFNoZWxsKCksIG51bGwsIHRydWUpOwotICAgIAkgICAgICBkaWFsb2cuYWRkRmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyBYU0RfRklMRV9FWFRFTlNJT04gfSk7Ci0gICAgCSAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAJICAgICAgZGlhbG9nLnNldFRpdGxlKE1lc3NhZ2VzLl9VSV9MQUJFTF9TRUxFQ1RfWFNEX0ZJTEUpOwotICAgIAkgICAgICBkaWFsb2cuc2V0TWVzc2FnZShNZXNzYWdlcy5fVUlfREVTQ1JJUFRJT05fQ0hPT1NFX1hTRF9GSUxFKTsKLQotICAgIAkgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgCSAgICAgIHsKLSAgICAJICAgICAgICBJRmlsZSBhcHBJbmZvU2NoZW1hRmlsZSA9IGRpYWxvZy5nZXRGaWxlKCk7Ci0gICAgCSAgICAgICAgaWYgKGFwcEluZm9TY2hlbWFGaWxlICE9IG51bGwpCi0gICAgCSAgICAgICAgewotICAgIAkgICAgICAgICAgLy8gcmVtb3ZlIGxlYWRpbmcgc2xhc2ggZnJvbSB0aGUgdmFsdWUgdG8gYXZvaWQgdGhlCi0gICAgCSAgICAgICAgICAvLyB3aG9sZSBsZWFkaW5nIHNsYXNoIGFtYmlndWl0eSBwcm9ibGVtCi0gICAgCSAgICAgICAgICBTdHJpbmcgdXJpID0gYXBwSW5mb1NjaGVtYUZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgIAkgICAgICAgICAgd2hpbGUgKHVyaS5zdGFydHNXaXRoKCIvIikgfHwgdXJpLnN0YXJ0c1dpdGgoIlxcIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgCSAgICAgICAgICAgIHVyaSA9IHVyaS5zdWJzdHJpbmcoMSk7Ci0gICAgCSAgICAgICAgICB9Ci0gICAgCSAgICAgICAgICBhcHBJbmZvU2NoZW1hTG9jYXRpb24gPSB1cmkudG9TdHJpbmcoKTsKLSAgICAJICAgICAgICAgIHNvdXJjZSA9IHVyaTsKLSAgICAJICAgICAgICAgIGZyb21DYXRhbG9nID0gZmFsc2U7Ci0KLSAgICAJICAgICAgICAgIGFwcEluZm9TY2hlbWFMb2NhdGlvbiA9ICJmaWxlOi8vIiArIFBsYXRmb3JtLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSArICIvIiArIGFwcEluZm9TY2hlbWFMb2NhdGlvbjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgCSAgICAgICAgICAvLyBUT0RPLi4uIGJlIGNhcmVmdWwgaG93IHdlIGNvbnN0cnVjdCB0aGUgbG9jYXRpb24KLSAgICAJICAgICAgICAgIC8vIFVOSVggcmVsYXRlZCBpc3N1ZXMgaGVyZQotCi0gICAgCSAgICAgICAgICBzY2hlbWFEaXNwbGF5ZXIuc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RGaWxlLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIAkgICAgICAgICAgc2NoZW1hRGlzcGxheWVyLnNldFRleHQodXJpKTsKLQotICAgIAkgICAgICAgICAgLy8gRW5hYmxlIHRoZSBPSyBidXR0b24gaWYgd2Ugc2hvdWxkLi4KLSAgICAJICAgICAgICAgIGlmIChpc0NhdGVnb3J5TmFtZVZhbGlkKQotICAgIAkgICAgICAgICAgewotICAgIAkgICAgICAgICAgICBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAJICAgICAgICAgICAgZXJyRGlzcGxheWVyLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgCSAgICAgICAgICAgIGVyckRpc3BsYXllci5zZXRJbWFnZShudWxsKTsKLSAgICAJICAgICAgICAgIH0KLSAgICAJICAgICAgICB9Ci0gICAgCSAgICAgIH0KLSAgICAJICAgIH0KLSAgICAJfQotICAgIAotICAgICk7Ci0gICAgCi0gICAgc2VhcmNoQ2F0YWxvZy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgewotICAgIAlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIAl7Ci0gICAgCSAgICAgIFNlbGVjdEZyb21DYXRhbG9nRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWxlY3RGcm9tQ2F0YWxvZ0RpYWxvZyhnZXRTaGVsbCgpKTsKLSAgICAJICAgICAgLy8gZGlhbG9nLm9wZW4oKTsKLSAgICAJICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKQotICAgIAkgICAgICB7Ci0gICAgCSAgICAgICAgYXBwSW5mb1NjaGVtYUxvY2F0aW9uID0gZGlhbG9nLmdldEN1cnJlbnRTZWxlY3Rpb25Mb2NhdGlvbigpOwotICAgIAkgICAgICAgIHNvdXJjZSA9IGRpYWxvZy5nZXRDdXJyZW50U2VsZWN0aW9uTmFtZXNwYWNlKCk7Ci0gICAgCSAgICAgICAgZnJvbUNhdGFsb2cgPSB0cnVlOwotCi0gICAgCSAgICAgICAgc2NoZW1hRGlzcGxheWVyLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMveG1sY2F0YWxvZ19vYmouZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgCSAgICAgICAgc2NoZW1hRGlzcGxheWVyLnNldFRleHQoZGlhbG9nLmdldEN1cnJlbnRTZWxlY3Rpb25OYW1lc3BhY2UoKSk7Ci0KLSAgICAJICAgICAgICAvLyBFbmFibGUgdGhlIE9LIGJ1dHRvbiBpZiB3ZSBzaG91bGQuLgotICAgIAkgICAgICAgIGlmIChpc0NhdGVnb3J5TmFtZVZhbGlkICYmICFhcHBJbmZvU2NoZW1hTG9jYXRpb24uZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgIAkgICAgICAgIHsKLSAgICAJICAgICAgICAgIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKHRydWUpOwotICAgIAkgICAgICAgICAgZXJyRGlzcGxheWVyLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgCSAgICAgICAgICBlcnJEaXNwbGF5ZXIuc2V0SW1hZ2UobnVsbCk7ICAgIAkgICAgICAgIAotICAgIAkgICAgICB9Ci0gICAgCSAgICB9Ci0gICAgCX0KLSAgICB9KTsKLSAgICAKLQotICAgIC8vIFRPRE86IFNob3VsZCBiZSBhYmxlIHRvIGdldCB0aGUgaW1hZ2UgZnJvbSB0aGUgWE1MIHBsdWdpbi4gRG9uJ3QgbmVlZAotICAgIC8vIHRvIGNvcHkgdG8gWFNERWRpdG9yIGljb25zIGZvbGRlciBsaWtlIHRoaXMuCi0KLQotICAgIC8vIENvbXBvc2l0ZSBlcnJDb21wID0gbmV3IENvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgLy8gZXJyQ29tcC5zZXRCYWNrZ3JvdW5kKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy53aGl0ZSk7Ci0gICAgLy8gZXJyQ29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgZXJyRGlzcGxheWVyID0gbmV3IENMYWJlbChtYWluQ29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgLy8gZXJyRGlzcGxheWVyLnNldFRleHQoImFiZCIpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgIGVyckRpc3BsYXllci5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIC8vIGVyckNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgLy8gZXJyRGlzcGxheWVyLnNldExheW91dERhdGEoZ2QpOwotICAgIC8vIGVyck1zZ0NvbnRhaW5lci5zZXRDb250ZW50KGVyckRpc3BsYXllcik7Ci0KLSAgICBuYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKQotICAgIHsKLSAgICAgIC8vIHRyYWNrIHRoZSBuYW1lVGV4dCBhbmQgZW5hYmxlL2Rpc2FibGUgdGhlIE9LIGJ1dHRvbiBhY2NvcmRpbmdseQotICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotICAgICAgewotICAgICAgICBjYXRlZ29yeU5hbWUgPSBuYW1lVGV4dC5nZXRUZXh0KCk7Ci0KLSAgICAgICAgLy8gbmFtZSBpcyBpbiB0aGUgaW52YWxpZCBMaXN0Ci0gICAgICAgIGlmIChpbnZhbGlkTmFtZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpbnZhbGlkTmFtZXMuY29udGFpbnMoY2F0ZWdvcnlOYW1lLnRyaW0oKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXNDYXRlZ29yeU5hbWVWYWxpZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBlcnJEaXNwbGF5ZXIuc2V0VGV4dChNZXNzYWdlcy5fVUlfRVJST1JfTkFNRV9BTFJFQURZX1VTRUQpOwotICAgICAgICAgICAgZXJyRGlzcGxheWVyLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvZXJyb3Jfc3Rfb2JqLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBuYW1lIGlzIGVtcHR5IHN0cmluZwotICAgICAgICBpZiAoY2F0ZWdvcnlOYW1lLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIGlzQ2F0ZWdvcnlOYW1lVmFsaWQgPSBmYWxzZTsKLQotICAgICAgICAgIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICBlcnJEaXNwbGF5ZXIuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBlcnJEaXNwbGF5ZXIuc2V0SW1hZ2UobnVsbCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogRW5hYmxlIHRoZSBPayBidXR0b24gaWYgdGhlIGxvY2F0aW9uIGZpZWxkIEFORCB0aGUgbmFtZSBmaWVsZCBhcmUgbm90Ci0gICAgICAgICAqIGVtcHR5Ci0gICAgICAgICAqLwotICAgICAgICBpZiAoIWNhdGVnb3J5TmFtZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICBpc0NhdGVnb3J5TmFtZVZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICBlcnJEaXNwbGF5ZXIuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBlcnJEaXNwbGF5ZXIuc2V0SW1hZ2UobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFwcEluZm9TY2hlbWFMb2NhdGlvbiAhPSBudWxsICYmICFhcHBJbmZvU2NoZW1hTG9jYXRpb24uZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKQotICB7Ci0gICAgc3VwZXIub2tQcmVzc2VkKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9DYXRlZ29yeVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vQ2F0ZWdvcnlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2ViNjRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9DYXRlZ29yeVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnlQcm92aWRlcgotewotICBwcml2YXRlIElDYXRhbG9nIHN5c3RlbUNhdGFsb2c7Ci0KLSAgcHVibGljIENhdGVnb3J5UHJvdmlkZXIoKQotICB7Ci0gICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBFeHRlbmRlcnMgc2hvdWxkIGltcGxlbWVudCBhbmQgcmV0dXJuIGEgbGlzdCBvZiAKLSAgICogU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0Q2F0ZWdvcmllcygpCi0gIHsKLSAgICByZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotICB9Ci0gIAotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCB0byBmaW5kIHRoZSBwaHlzaWNhbCBsb2NhdGlvbiBvZiB0aGUgc2NoZW1hCi0gICAqIGluIHRoZSBYTUwgQ2F0YWxvZwotICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCi0gICAqIEByZXR1cm4gcGh5c2ljYWwgbG9jYXRpb24gb2YgdGhlIHNjaGVtYQotICAgKi8KLSAgcHVibGljIFN0cmluZyBsb2NhdGVGaWxlVXNpbmdDYXRhbG9nKFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gIHsKLSAgICByZXRyaWV2ZUNhdGFsb2coKTsKLQotICAgIElDYXRhbG9nRW50cnlbXSBlbnRyaWVzID0gc3lzdGVtQ2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoZW50cmllc1tpXS5nZXRLZXkoKS5lcXVhbHMobmFtZXNwYWNlVVJJKSkKLSAgICAgICAgcmV0dXJuIGVudHJpZXNbaV0uZ2V0VVJJKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmV0cmlldmVDYXRhbG9nKCkKLSAgewotICAgIGlmIChzeXN0ZW1DYXRhbG9nICE9IG51bGwpCi0gICAgICByZXR1cm47Ci0KLSAgICBJQ2F0YWxvZyBkZWZhdWx0Q2F0YWxvZyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0gICAgSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gZGVmYXVsdENhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0Q2F0YWxvZ3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSU5leHRDYXRhbG9nIGNhdGFsb2cgPSBuZXh0Q2F0YWxvZ3NbaV07Ci0gICAgICBJQ2F0YWxvZyByZWZlcmVuY2VkQ2F0YWxvZyA9IGNhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLSAgICAgIGlmIChyZWZlcmVuY2VkQ2F0YWxvZyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoWE1MQ29yZVBsdWdpbi5TWVNURU1fQ0FUQUxPR19JRC5lcXVhbHMocmVmZXJlbmNlZENhdGFsb2cuZ2V0SWQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBzeXN0ZW1DYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25EZXRhaWxzQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOGUxOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5UcmVlQ29udGVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLkRlZmF1bHRMaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbS5Ob2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uTm9kZUVkaXRvckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbS5Ob2RlRWRpdG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLXB1YmxpYyBjbGFzcyBET01FeHRlbnNpb25EZXRhaWxzQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlcgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IHt9OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9TVFJJTkdfQVJSQVkgPSB7fTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zIjsgLy8kTk9OLU5MUwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9OT0RFX0tFWSA9ICJ0ZXh0KCkiOyAvLyROT04tTkxTCi0KLSAgcHVibGljIE9iamVjdFtdIGdldEl0ZW1zKE9iamVjdCBpbnB1dCkKLSAgewotICAgIEhhc2hNYXAgcmVzdWx0TWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBpbnB1dDsKLSAgICAgIAotICAgICAgLy8gaGVyZSB3ZSBjb21wdXRlIGl0ZW1zIGZvciB0aGUgYXR0cmlidXRlcyB0aGF0IHBoeXNpY2FsbHkgaW4gdGhlIGRvY3VtZW50IAotICAgICAgLy8KLSAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLSAgICAgICAgaWYgKCFYTUxOUy5lcXVhbHMoYXR0ci5nZXROYW1lKCkpICYmICFYTUxOUy5lcXVhbHMoYXR0ci5nZXRQcmVmaXgoKSkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0TWFwLnB1dChhdHRyLmdldE5hbWUoKSwgRE9NRXh0ZW5zaW9uSXRlbS5jcmVhdGVJdGVtRm9yRWxlbWVudEF0dHJpYnV0ZShlbGVtZW50LCBhdHRyKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgCi0gICAgICAvLyBoZXJlIHdlIGNvbXB1dGUgYW4gaXRlbSBmb3IgdGhlIHRleHQgbm9kZSB0aGF0IGlzIHBoeXNpY2FsbHkgaW4gdGhlIGRvY3VtZW50IAotICAgICAgLy8gICAgICAKLSAgICAgIFN0cmluZyB0ZXh0Tm9kZVZhbHVlID0gbmV3IFRyZWVDb250ZW50SGVscGVyKCkuZ2V0Tm9kZVZhbHVlKGVsZW1lbnQpOwotICAgICAgaWYgKHRleHROb2RlVmFsdWUgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICByZXN1bHRNYXAucHV0KFRFWFRfTk9ERV9LRVksIERPTUV4dGVuc2lvbkl0ZW0uY3JlYXRlSXRlbUZvckVsZW1lbnRUZXh0KGVsZW1lbnQpKTsKLSAgICAgIH0gIAotICAgICAgCi0gICAgICBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICAgIGlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgICAgaWYgKGVkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBoZXJlIHdlIGNvbXB1dGUgaXRlbXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHRoYXQgbWF5IGJlIGFkZGVkIHRvIHRoZSBkb2N1bWVudCBhY2NvcmRpbmcgdG8gdGhlIGdyYW1tYXIgCi0gICAgICAgICAgLy8gICAgICAgICAgIAotICAgICAgICAgIExpc3QgbGlzdCA9IG1vZGVsUXVlcnkuZ2V0QXZhaWxhYmxlQ29udGVudChlbGVtZW50LCBlZCwgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKWkubmV4dCgpOwotICAgICAgICAgICAgICBpZiAoYWQgIT0gbnVsbCAmJiByZXN1bHRNYXAuZ2V0KGFkLmdldE5vZGVOYW1lKCkpID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHRNYXAucHV0KGFkLmdldE5vZGVOYW1lKCksIERPTUV4dGVuc2lvbkl0ZW0uY3JlYXRlSXRlbUZvckVsZW1lbnRBdHRyaWJ1dGUoZWxlbWVudCwgYWQpKTsKLSAgICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAocmVzdWx0TWFwLmdldChURVhUX05PREVfS0VZKSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIGhlcmUgd2UgY29tcHV0ZSBhbiBpdGVtIGZvciB0aGUgdGV4dCBub2RlIHRoYXQgbWF5IGJlIGFkZGVkIHRvIHRoZSBkb2N1bWVudCBhY2NvcmRpbmcgdG8gdGhlIGdyYW1tYXIgCi0gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IGNvbnRlbnRUeXBlID0gZWQuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgfHwgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdE1hcC5wdXQoVEVYVF9OT0RFX0tFWSwgRE9NRXh0ZW5zaW9uSXRlbS5jcmVhdGVJdGVtRm9yRWxlbWVudFRleHQoZWxlbWVudCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSByZXN1bHRNYXAudmFsdWVzKCk7Ci0gICAgICAvLyBpbml0aWFsaXplIHRoZSBlZGl0b3IgaW5mb3JtYXRpb24gZm9yIGVhY2ggaXRlbQotICAgICAgLy8KLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBpbml0UHJvcGVydHlFZGl0b3JDb25maWd1cmF0aW9uKChET01FeHRlbnNpb25JdGVtKSBpLm5leHQoKSk7Ci0gICAgICB9Ci0gICAgICBET01FeHRlbnNpb25JdGVtW10gaXRlbXMgPSBuZXcgRE9NRXh0ZW5zaW9uSXRlbVtjb2xsZWN0aW9uLnNpemUoKV07Ci0gICAgICByZXN1bHRNYXAudmFsdWVzKCkudG9BcnJheShpdGVtcyk7Ci0gICAgICAKLSAgICAgIC8vIGhlcmUgd2Ugc29ydCB0aGUgbGlzdCBhbHBoYWJldGljYWxseQotICAgICAgLy8KLSAgICAgIGlmIChpdGVtcy5sZW5ndGggPiAwKQotICAgICAgeyAgCi0gICAgICAgIENvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpCi0gICAgICAgICAgeyAgICAgICAgIAotICAgICAgICAgICAgRE9NRXh0ZW5zaW9uSXRlbSBhID0gKERPTUV4dGVuc2lvbkl0ZW0pYXJnMDsKLSAgICAgICAgICAgIERPTUV4dGVuc2lvbkl0ZW0gYiA9IChET01FeHRlbnNpb25JdGVtKWFyZzE7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGJlZ2luIHNwZWNpYWwgY2FzZSB0byBlbnN1cmUgJ3RleHQgbm9kZXMnIGNvbWUgbGFzdAotICAgICAgICAgICAgaWYgKGEuaXNUZXh0VmFsdWUoKSAmJiAhYi5pc1RleHRWYWx1ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gMTsgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGIuaXNUZXh0VmFsdWUoKSAmJiAhYS5pc1RleHRWYWx1ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9ICAKLSAgICAgICAgICAgIC8vIGVuZCBzcGVjaWFsIGNhc2UKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsgICAgICAgICAgCi0gICAgICAgICAgICAgIHJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoYS5nZXROYW1lKCksIGIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgQXJyYXlzLnNvcnQoaXRlbXMsIGNvbXBhcmF0b3IpOwotICAgICAgfSAgCi0gICAgICByZXR1cm4gaXRlbXM7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQXR0cikKLSAgICB7Ci0gICAgICBBdHRyIGF0dHIgPSAoQXR0cikgaW5wdXQ7Ci0gICAgICBET01FeHRlbnNpb25JdGVtIGl0ZW0gPSBET01FeHRlbnNpb25JdGVtLmNyZWF0ZUl0ZW1Gb3JBdHRyaWJ1dGVUZXh0KGF0dHIuZ2V0T3duZXJFbGVtZW50KCksIGF0dHIpOwotICAgICAgRE9NRXh0ZW5zaW9uSXRlbVtdIGl0ZW1zID0ge2l0ZW19OwotICAgICAgcmV0dXJuIGl0ZW1zOwotICAgIH0KLSAgICByZXR1cm4gRU1QVFlfQVJSQVk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoT2JqZWN0IGl0ZW0pCi0gIHsKLSAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIERPTUV4dGVuc2lvbkl0ZW0pCi0gICAgewotICAgICAgcmV0dXJuICgoRE9NRXh0ZW5zaW9uSXRlbSkgaXRlbSkuZ2V0TmFtZSgpOwotICAgIH0KLSAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoT2JqZWN0IGl0ZW0pCi0gIHsKLSAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIERPTUV4dGVuc2lvbkl0ZW0pCi0gICAgewotICAgICAgcmV0dXJuICgoRE9NRXh0ZW5zaW9uSXRlbSkgaXRlbSkuZ2V0VmFsdWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0UG9zc2libGVWYWx1ZXMoT2JqZWN0IGl0ZW0pCi0gIHsKLSAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIERPTUV4dGVuc2lvbkl0ZW0pCi0gICAgewotICAgICAgcmV0dXJuICgoRE9NRXh0ZW5zaW9uSXRlbSkgaXRlbSkuZ2V0UG9zc2libGVWYWx1ZXMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIEVNUFRZX1NUUklOR19BUlJBWTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXRQcm9wZXJ0eUVkaXRvckNvbmZpZ3VyYXRpb24oRE9NRXh0ZW5zaW9uSXRlbSBpdGVtKQotICB7Ci0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IGl0ZW0uZ2V0TmFtZXNwYWNlKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBpdGVtLmdldE5hbWUoKTsKLSAgICBTdHJpbmcgcGFyZW50TmFtZSA9IGl0ZW0uZ2V0UGFyZW50TmFtZSgpOwotICAgIE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBudWxsOwotICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBUT0RPIChjcykgcmVtb3ZlIHJlZmVyZW5jZSB0byBYU0RFZGl0b3JQbHVnaW4uLi4gbWFrZSBnZW5lcmljCi0gICAgICAvLyBwZXJoYXBzIHB1c2ggZG93biB0aGUgeG1sLnVpID8KLSAgICAgIC8vCi0gICAgICBOb2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXROb2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5KCk7Ci0gICAgICBOb2RlRWRpdG9yUHJvdmlkZXIgcHJvdmlkZXI9IHJlZ2lzdHJ5LmdldE5vZGVFZGl0b3JQcm92aWRlcihuYW1lc3BhY2UpOyAgICAgIAotICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24gPSBwcm92aWRlci5nZXROb2RlRWRpdG9yQ29uZmlndXJhdGlvbihwYXJlbnROYW1lLCBuYW1lKTsKLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRQYXJlbnROb2RlKGl0ZW0uZ2V0UGFyZW50Tm9kZSgpKTsKLSAgICAgICAgICBpZiAoaXRlbS5nZXROb2RlKCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb25maWd1cmF0aW9uLnNldE5vZGUoaXRlbS5nZXROb2RlKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICAgIFN0cmluZ1tdIHZhbHVlcyA9IGl0ZW0uZ2V0UG9zc2libGVWYWx1ZXMoKTsKLSAgICBpZiAodmFsdWVzICE9IG51bGwgJiYgdmFsdWVzLmxlbmd0aCA+IDEpCi0gICAgewotICAgICAgY29uZmlndXJhdGlvbiA9IG5ldyBEZWZhdWx0TGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uKHZhbHVlcyk7Ci0gICAgfQotICAgIAotICAgIC8vIE5vdGUgdGhhdCBpdCBJUyBleHBlY3RlZCB0aGF0IHRoZSBjb25maWdhcmF0aW9uIG1heSBiZSBudWxsCi0gICAgLy8KLSAgICBpdGVtLnNldFByb3BlcnR5RWRpdG9yQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkl0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25JdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNTA1MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5UcmVlQ29udGVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlVGV4dFZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWNsYXNzIERPTUV4dGVuc2lvbkl0ZW0gZXh0ZW5kcyBFeHRlbnNpb25JdGVtCi17Ci0gIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBLSU5EX0VMRU1FTlRfQVRUUiA9IDE7Ci0gIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBLSU5EX0VMRU1FTlRfVEVYVCA9IDI7Ci0gIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBLSU5EX0VMRU1FTlRfQ01BVFRSSUJVVEUgPSAzOwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgS0lORF9BVFRSX1RFWFQgPSA0OwotICBpbnQga2luZDsKLSAgQXR0ciBhdHRyaWJ1dGU7Ci0gIEVsZW1lbnQgcGFyZW50OwotICBDTU5vZGUgY21Ob2RlOwotCi0gIHByaXZhdGUgRE9NRXh0ZW5zaW9uSXRlbShpbnQga2luZCwgRWxlbWVudCBwYXJlbnQsIEF0dHIgbm9kZSwgQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgdGhpcy5hdHRyaWJ1dGUgPSBub2RlOwotICAgIHRoaXMuY21Ob2RlID0gY21Ob2RlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1RleHRWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4ga2luZCA9PSBLSU5EX0VMRU1FTlRfVEVYVCB8fCBraW5kID09IEtJTkRfQVRUUl9URVhUOwotICB9Ci0KLSAgc3RhdGljIERPTUV4dGVuc2lvbkl0ZW0gY3JlYXRlSXRlbUZvckVsZW1lbnRUZXh0KEVsZW1lbnQgcGFyZW50KQotICB7Ci0gICAgcmV0dXJuIG5ldyBET01FeHRlbnNpb25JdGVtKEtJTkRfRUxFTUVOVF9URVhULCBwYXJlbnQsIG51bGwsIG51bGwpOwotICB9Ci0KLSAgc3RhdGljIERPTUV4dGVuc2lvbkl0ZW0gY3JlYXRlSXRlbUZvckVsZW1lbnRBdHRyaWJ1dGUoRWxlbWVudCBwYXJlbnQsIEF0dHIgYXR0cmlidXRlKQotICB7Ci0gICAgcmV0dXJuIG5ldyBET01FeHRlbnNpb25JdGVtKEtJTkRfRUxFTUVOVF9BVFRSLCBwYXJlbnQsIGF0dHJpYnV0ZSwgbnVsbCk7Ci0gIH0KLQotICBzdGF0aWMgRE9NRXh0ZW5zaW9uSXRlbSBjcmVhdGVJdGVtRm9yRWxlbWVudEF0dHJpYnV0ZShFbGVtZW50IHBhcmVudCwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgewotICAgIGlmIChhZCA9PSBudWxsKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibnVsbCEiKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBET01FeHRlbnNpb25JdGVtKEtJTkRfRUxFTUVOVF9DTUFUVFJJQlVURSwgcGFyZW50LCBudWxsLCBhZCk7Ci0gIH0KLQotICBzdGF0aWMgRE9NRXh0ZW5zaW9uSXRlbSBjcmVhdGVJdGVtRm9yQXR0cmlidXRlVGV4dChFbGVtZW50IHBhcmVudCwgQXR0ciBhdHRyaWJ1dGUpCi0gIHsKLSAgICByZXR1cm4gbmV3IERPTUV4dGVuc2lvbkl0ZW0oS0lORF9BVFRSX1RFWFQsIHBhcmVudCwgYXR0cmlidXRlLCBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBzd2l0Y2ggKGtpbmQpCi0gICAgewotICAgICAgY2FzZSBLSU5EX0FUVFJfVEVYVCA6IHsKLSAgICAgICAgcmVzdWx0ID0gInZhbHVlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEtJTkRfRUxFTUVOVF9BVFRSIDogewotICAgICAgICByZXN1bHQgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgS0lORF9FTEVNRU5UX0NNQVRUUklCVVRFIDogewotICAgICAgICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtTm9kZTsKLSAgICAgICAgcmVzdWx0ID0gYWQuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEtJTkRfRUxFTUVOVF9URVhUIDogewotICAgICAgICByZXN1bHQgPSAidGV4dCB2YWx1ZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiAiIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICB7Ci0gICAgc3dpdGNoIChraW5kKQotICAgIHsKLSAgICAgIGNhc2UgS0lORF9BVFRSX1RFWFQgOgotICAgICAgY2FzZSBLSU5EX0VMRU1FTlRfQVRUUiA6IHsKLSAgICAgICAgLy8gbm90ZSBpbnRlbnRpb25hbCBmYWxsLXRocnUhIQotICAgICAgICByZXR1cm4gYXR0cmlidXRlLmdldE5vZGVWYWx1ZSgpOwotICAgICAgfQotICAgICAgY2FzZSBLSU5EX0VMRU1FTlRfQ01BVFRSSUJVVEUgOiB7Ci0gICAgICAgIC8vIENTIDogb25lIHdvdWxkIHRoaW5rIHRoYXQgd2UnZCBqdXN0IG5lZWQgdG8gcmV0dXJuICIiIGhlcmUKLSAgICAgICAgLy8gYnV0IGFmdGVyIGVkaXRpbmcgYSBpdGVtIG9mIHRoaXMga2luZCBhbmQgZ2l2aW5nIGl0IHZhbHVlCi0gICAgICAgIC8vIHRoZSBsaXN0IG9mIGl0ZW0ncyBkb2Vzbid0IGdldCByZWNvbXB1dGVkLi4gc28gd2UgbmVlZCB0byB0cmljawotICAgICAgICAvLyBvbmUgb2YgdGhlc2UgaXRlbXMgdG8gYmVoYXZlIGxpa2UgdGhlIEtJTkRfRUxFTUVOVF9BVFRSIGNhc2UKLSAgICAgICAgLy8KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcGFyZW50LmdldEF0dHJpYnV0ZShjbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIHJldHVybiAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZSA6ICIiOwotICAgICAgfQotICAgICAgY2FzZSBLSU5EX0VMRU1FTlRfVEVYVCA6IHsKLSAgICAgICAgcmV0dXJuIG5ldyBUcmVlQ29udGVudEhlbHBlcigpLmdldEVsZW1lbnRUZXh0VmFsdWUocGFyZW50KTsgICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIAotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQb3NzaWJsZVZhbHVlcygpCi0gIHsKLSAgICBTdHJpbmdbXSByZXN1bHQgPSB7fTsKLSAgICAgCi0gICAgc3dpdGNoIChraW5kKQotICAgIHsKLSAgICAgIGNhc2UgS0lORF9BVFRSX1RFWFQgOgotICAgICAgY2FzZSBLSU5EX0VMRU1FTlRfQVRUUiA6IHsKLSAgICAgICAgLy8gbm90ZSBpbnRlbnRpb25hbCBmYWxsLXRocnUhIQotICAgICAgICBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgICBpZiAobW9kZWxRdWVyeSAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IG1vZGVsUXVlcnkuZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyaWJ1dGUpOyAgICAgICAgCi0gICAgICAgICAgaWYgKGFkICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gbW9kZWxRdWVyeS5nZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKHBhcmVudCwgYWQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgS0lORF9FTEVNRU5UX0NNQVRUUklCVVRFIDogewotICAgICAgICBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgICBpZiAobW9kZWxRdWVyeSAhPSBudWxsICYmIGNtTm9kZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gbW9kZWxRdWVyeS5nZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKHBhcmVudCwgY21Ob2RlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgS0lORF9FTEVNRU5UX1RFWFQgOiB7Ci0gICAgICAgIE1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkocGFyZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgIGlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50KTsKLSAgICAgICAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICAgICAgICB7IAotICAgICAgICAgICAgcmVzdWx0ID0gbW9kZWxRdWVyeS5nZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKHBhcmVudCwgZWQpOyAgICAgICAgICAgICAKLSAgICAgICAgICB9ICAKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZVZhbHVlQ29tbWFuZChTdHJpbmcgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGtpbmQpCi0gICAgewotICAgICAgY2FzZSBLSU5EX0FUVFJfVEVYVCA6Ci0gICAgICBjYXNlIEtJTkRfRUxFTUVOVF9BVFRSIDogewotICAgICAgICAvLyBub3RlIGludGVudGlvbmFsIGZhbGwtdGhydSEhICAgICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKHBhcmVudCwgYXR0cmlidXRlLmdldE5vZGVOYW1lKCksIG5ld1ZhbHVlLCB0cnVlKTsKLSAgICAgIH0KLSAgICAgIGNhc2UgS0lORF9FTEVNRU5UX0NNQVRUUklCVVRFIDogewotICAgICAgICBmaW5hbCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtTm9kZTsKLSAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQocGFyZW50LCBhZC5nZXRBdHRyTmFtZSgpLCBuZXdWYWx1ZSwgdHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBjYXNlIEtJTkRfRUxFTUVOVF9URVhUIDogewotICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVRleHRWYWx1ZUNvbW1hbmQocGFyZW50LCBuZXdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKQotICB7Ci0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgaWYgKGtpbmQgPT0gS0lORF9BVFRSX1RFWFQpCi0gICAgewotICAgICAgbmFtZXNwYWNlID0gYXR0cmlidXRlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSBwYXJlbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgfQotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gIH0KLQotICBwdWJsaWMgTm9kZSBnZXRQYXJlbnROb2RlKCkKLSAgewotICAgIE5vZGUgcGFyZW50Tm9kZSA9IG51bGw7Ci0gICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHBhcmVudE5vZGUgPSBhdHRyaWJ1dGUuZ2V0T3duZXJFbGVtZW50KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnQ7Ci0gICAgfQotICAgIHJldHVybiBwYXJlbnROb2RlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQYXJlbnROYW1lKCkKLSAgewotICAgIE5vZGUgcGFyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoKTsKLSAgICByZXR1cm4gcGFyZW50Tm9kZSAhPSBudWxsID8gcGFyZW50Tm9kZS5nZXRMb2NhbE5hbWUoKSA6ICIiOwotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0Tm9kZSgpCi0gIHsKLSAgICByZXR1cm4gYXR0cmlidXRlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uSXRlbUVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uSXRlbUVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYzcwZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkl0ZW1FZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRE9NRXh0ZW5zaW9uSXRlbUVkaXRNYW5hZ2VyIGltcGxlbWVudHMgRXh0ZW5zaW9uSXRlbUVkaXRNYW5hZ2VyCi17Ci0gIHB1YmxpYyB2b2lkIGhhbmRsZUVkaXQoT2JqZWN0IGl0ZW0sIFdpZGdldCB3aWRnZXQpCi0gIHsgICAKLSAgfQotCi0gIHB1YmxpYyBDb250cm9sIGNyZWF0ZUN1c3RvbUJ1dHRvbkNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSwgT2JqZWN0IGl0ZW0pCi0gIHsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBidXR0b24uc2V0VGV4dCgiLi4uIik7IC8vJE5PTi1OTFMtMSQKLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0KLSAgcHVibGljIENvbnRyb2wgY3JlYXRlQ3VzdG9tVGV4dENvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSwgT2JqZWN0IGl0ZW0pCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QnV0dG9uQ29udHJvbFN0eWxlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gRXh0ZW5zaW9uSXRlbUVkaXRNYW5hZ2VyLlNUWUxFX05PTkU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHRDb250cm9sU3R5bGUoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBFeHRlbnNpb25JdGVtRWRpdE1hbmFnZXIuU1RZTEVfTk9ORTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkl0ZW1NZW51TGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25JdGVtTWVudUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMzBjOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkl0ZW1NZW51TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuWE1MTm9kZUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgRE9NRXh0ZW5zaW9uSXRlbU1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIKLXsKLSAgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0gIHB1YmxpYyBET01FeHRlbnNpb25JdGVtTWVudUxpc3RlbmVyKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikKLSAgewotICAgIHRoaXMudHJlZVZpZXdlciA9IHRyZWVWaWV3ZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpCi0gIHsKLSAgICBtYW5hZ2VyLnJlbW92ZUFsbCgpOwotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gdHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudEltcGwgZWxlbWVudEltcGwgPSAoRWxlbWVudEltcGwpIHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIElET01Eb2N1bWVudCBkb21Eb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIGVsZW1lbnRJbXBsLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgSW50ZXJuYWxOb2RlQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyID0gbmV3IEludGVybmFsTm9kZUFjdGlvbk1hbmFnZXIoZG9tRG9jdW1lbnQuZ2V0TW9kZWwoKSwgdHJlZVZpZXdlcik7Ci0gICAgICAgIGFjdGlvbk1hbmFnZXIuZmlsbENvbnRleHRNZW51KG1hbmFnZXIsIHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgCi0gIGNsYXNzIEludGVybmFsTm9kZUFjdGlvbk1hbmFnZXIgZXh0ZW5kcyBYTUxOb2RlQWN0aW9uTWFuYWdlcgotICB7Ci0gICAgcHVibGljIEludGVybmFsTm9kZUFjdGlvbk1hbmFnZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgVmlld2VyIHZpZXdlcikKLSAgICB7Ci0gICAgICBzdXBlcihtb2RlbCwgdmlld2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb250cmlidXRlQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgTGlzdCBzZWxlY3Rpb24pCi0gICAgewotICAgICAgLy9tZW51LmFkZChuZXcgQWN0aW9uKCJ0aGVyZSIpe30pOyAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgIGludCBlZGl0TW9kZSA9IG1vZGVsUXVlcnkuZ2V0RWRpdE1vZGUoKTsKLSAgICAgIGludCBpYyA9IE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUzsKLSAgICAgIGludCB2YyA9IChlZGl0TW9kZSA9PSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpID8gTW9kZWxRdWVyeS5WQUxJRElUWV9TVFJJQ1QgOiBNb2RlbFF1ZXJ5LlZBTElESVRZX05PTkU7Ci0gICAgICBMaXN0IGltcGxpY2l0bHlTZWxlY3RlZE5vZGVMaXN0ID0gbnVsbDsKLQotICAgICAgaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIHNlbGVjdGlvbi5nZXQoMCk7Ci0gICAgICAgIC8vIGNvbnRyaWJ1dGUgYWRkIGNoaWxkIGFjdGlvbnMKLSAgICAgICAgY29udHJpYnV0ZUFkZENoaWxkQWN0aW9ucyhtZW51LCBub2RlLCBpYywgdmMpOwotICAgICAgfQotICAgICAgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBpbXBsaWNpdGx5U2VsZWN0ZWROb2RlTGlzdCA9IGdldFNlbGVjdGVkTm9kZXMoc2VsZWN0aW9uLCB0cnVlKTsKLSAgICAgICAgLy8gY29udHJpYnV0ZSBkZWxldGUgYWN0aW9ucwotICAgICAgICBjb250cmlidXRlRGVsZXRlQWN0aW9ucyhtZW51LCBpbXBsaWNpdGx5U2VsZWN0ZWROb2RlTGlzdCwgaWMsIHZjKTsKLSAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBtZW51LmFkZChuZXcgQWN0aW9uKGUuZ2V0TWVzc2FnZSgpKXt9KTsKLSAgICAgIH0KLSAgICAgIC8qCi0gICAgICBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIC8vIGNvbnRyaWJ1dGUgcmVwbGFjZSBhY3Rpb25zCi0gICAgICAgIGNvbnRyaWJ1dGVSZXBsYWNlQWN0aW9ucyhtZW51LCBpbXBsaWNpdGx5U2VsZWN0ZWROb2RlTGlzdCwgaWMsIHZjKTsKLSAgICAgIH0qLwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVBZGRDaGlsZEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIE5vZGUgbm9kZSwgaW50IGljLCBpbnQgdmMpCi0gICAgewotICAgICAgaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotICAgICAgaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICAvLyAnQWRkIENoaWxkLi4uJyBhbmQgJ0FkZCBBdHRyaWJ1dGUuLi4nIGFjdGlvbnMKLSAgICAgICAgLy8KLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0gICAgICAgIE15TWVudU1hbmFnZXIgbmV3TWVudSA9IG5ldyBNeU1lbnVNYW5hZ2VyKCJOZXciKXsKLSAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7IHJldHVybiB0cnVlOyB9ICAgICAgICAgIAotICAgICAgICB9Oy8vJE5PTi1OTFMtMSQKLSAgICAgICAgbmV3TWVudS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICBtZW51LmFkZChuZXdNZW51KTsKLSAgICAgICAgCi0gICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgICAgaWYgKGVkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBMaXN0IG1vZGVsUXVlcnlBY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIC8vIGFkZCBpbnNlcnQgY2hpbGQgbm9kZSBhY3Rpb25zCi0gICAgICAgICAgLy8KLSAgICAgICAgICBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICBtb2RlbFF1ZXJ5LmdldEluc2VydEFjdGlvbnMoZWxlbWVudCwgZWQsIC0xLCBpYywgdmMsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLSAgICAgICAgICBhZGRBY3Rpb25IZWxwZXIobmV3TWVudSwgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM5MDI5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgRE9NRXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJTm9kZUFkYXB0ZXIKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBmYWNldDsKLSAgcHJvdGVjdGVkIFZpZXdlciB2aWV3ZXI7Ci0gIAotICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gIHsKLSAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgfQotICAgIAotICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpCi0gIHsKLSAgICBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpcGFyZW50RWxlbWVudDsgICAgICAgIAotICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBmb3IgKE5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChub2RlKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAKLSAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkoKTsgICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QudG9BcnJheSgpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkKLSAgewotICAgIE9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0gICAgcmV0dXJuIGNoaWxkcmVuLmxlbmd0aCA+IDA7Ci0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIGdldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QgaW5wdXRFbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpCi0gIHsKLSAgICBpZiAodmlld2VyICE9IG51bGwpCi0gICAgeyAgCi0gICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgIH0gIAotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICB7Ci0gICAgLy8gdGhpcyBtZXRob2QgaXMgbm90IHVzZWQKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25UcmVlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTczNTQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25UcmVlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbS5Ob2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIERPTUV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEltYWdlIERFRkFVTFRfRUxFTUVOVF9JQ09OID0gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RFbGVtZW50LmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW1hZ2UgREVGQVVMVF9BVFRSX0lDT04gPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREF0dHJpYnV0ZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICBwdWJsaWMgRE9NRXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXIoKQotICB7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpCi0gIHsKLSAgICBOb2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXROb2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5KCk7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgIHsKLSAgICAgIEVsZW1lbnQgZG9tRWxlbWVudCA9IChFbGVtZW50KSBlbGVtZW50OwotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGRvbUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgSUxhYmVsUHJvdmlkZXIgbHAgPSByZWdpc3RyeS5nZXRMYWJlbFByb3ZpZGVyKG5hbWVzcGFjZSk7Ci0gICAgICAgIGlmIChscCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgSW1hZ2UgaW1nID0gbHAuZ2V0SW1hZ2UoZG9tRWxlbWVudCk7Ci0gICAgICAgICAgaWYgKGltZyAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGltZzsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgICByZXR1cm4gREVGQVVMVF9FTEVNRU5UX0lDT047Ci0gICAgfQotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXR0cikKLSAgICByZXR1cm4gREVGQVVMVF9BVFRSX0lDT047Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGlucHV0KQotICB7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGRvbUVsZW1lbnQgPSAoRWxlbWVudCkgaW5wdXQ7Ci0gICAgICBTdHJpbmcgdGV4dFZhbCA9ICIiOwotCi0gICAgICBpZiAoZG9tRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IGRvbUVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpLml0ZW0oMCk7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVGV4dCkKLSAgICAgICAgewotICAgICAgICAgIFRleHQgdGV4dE5vZGUgPSAoVGV4dCkgbm9kZTsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXRleHROb2RlLmdldE5vZGVWYWx1ZSgpLmNvbnRhaW5zKCJcbiIpKQotICAgICAgICAgICAgICB0ZXh0VmFsID0gIiBbIiArIHRleHROb2RlLmdldE5vZGVWYWx1ZSgpICsgIl0iOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRE9NRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGV4dFZhbCA9ICIiOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGRvbUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkgKyB0ZXh0VmFsOwotICAgIH0KLSAgICBpZiAoIGlucHV0IGluc3RhbmNlb2YgQXR0cil7Ci0gICAgICByZXR1cm4gKChBdHRyKSBpbnB1dCkuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgfQotICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNmYWFjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlcgotewotICBPYmplY3RbXSBnZXRJdGVtcyhPYmplY3QgaW5wdXQpOwotICBTdHJpbmcgZ2V0TmFtZShPYmplY3QgaXRlbSk7Ci0gIFN0cmluZyBnZXRWYWx1ZShPYmplY3QgaXRlbSk7Ci0gIFN0cmluZ1tdIGdldFBvc3NpYmxlVmFsdWVzKE9iamVjdCBpdGVtKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25EZXRhaWxzVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uRGV0YWlsc1ZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTYyYTVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25EZXRhaWxzVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZXNzZSBWYWxpYW5lcyAtIFNlbmVjYSBDb2xsZWdlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzUzODEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLkRpYWxvZ05vZGVFZGl0b3JDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uTGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uTm9kZUVkaXRvckNvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25EZXRhaWxzVmlld2VyIGV4dGVuZHMgVmlld2VyCi17Ci0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJVEVNX0RBVEEgPSAiSVRFTV9EQVRBIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRURJVE9SX0NPTkZJR1VSQVRJT05fREFUQSA9ICJFRElUT1JfQ09ORklHVVJBVElPTl9EQVRBIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgQ29tcG9zaXRlIGNvbnRyb2w7ICAKLSAgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLSAgRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0gIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3Rvcnk7ICAKLSAgSW50ZXJuYWxDb250cm9sTGlzdGVuZXIgaW50ZXJuYWxDb250cm9sTGlzdGVuZXI7Ci0gIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2s7Ci0gIAotICBwdWJsaWMgRXh0ZW5zaW9uRGV0YWlsc1ZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KQotICB7Ci0gICAgdGhpcy53aWRnZXRGYWN0b3J5ID0gd2lkZ2V0RmFjdG9yeTsgICAgCi0gICAgY29udHJvbCA9ICB3aWRnZXRGYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotICAgIGludGVybmFsQ29udHJvbExpc3RlbmVyID0gbmV3IEludGVybmFsQ29udHJvbExpc3RlbmVyKCk7Ci0gICAgY29udHJvbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7ICAgIAotICB9Ci0gIHB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2w7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbW1hbmRTdGFjayhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKQotICB7Ci0gICAgdGhpcy5jb21tYW5kU3RhY2sgPSBjb21tYW5kU3RhY2s7Ci0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7IAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgQ29udHJvbCBjb250cm9sID0gY2hpbGRyZW5baV07Ci0gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHQpCi0gICAgICB7Ci0gICAgICAgICBFeHRlbnNpb25JdGVtIGl0ZW0gPSAoRXh0ZW5zaW9uSXRlbSljb250cm9sLmdldERhdGEoSVRFTV9EQVRBKTsKLSAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGNvbnRlbnRQcm92aWRlci5nZXRWYWx1ZShpdGVtKTsgICAgICAgIAotICAgICAgICAoKFRleHQpY29udHJvbCkuc2V0VGV4dCh2YWx1ZSk7IAotICAgICAgfSAgCi0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVRleHRPckNvbWJvQ29udHJvbChFeHRlbnNpb25JdGVtIGl0ZW0sIENvbXBvc2l0ZSBjb21wb3NpdGUpCi0gIHsKLSAgICBDb250cm9sIGNvbnRyb2wgPSBudWxsOwotICAgIFN0cmluZyB2YWx1ZSA9IGNvbnRlbnRQcm92aWRlci5nZXRWYWx1ZShpdGVtKTsKLSAgICBOb2RlRWRpdG9yQ29uZmlndXJhdGlvbiBlZGl0b3JDb25maWd1cmF0aW9uID0gaXRlbS5nZXRQcm9wZXJ0eUVkaXRvckNvbmZpZ3VyYXRpb24oKTsKLQotICAgIGlmIChlZGl0b3JDb25maWd1cmF0aW9uICE9IG51bGwgJiYgaGFzU3R5bGUoZWRpdG9yQ29uZmlndXJhdGlvbiwgTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uU1RZTEVfQ09NQk8pKQotICAgIHsgICAgICAgICAgCi0gICAgICBMaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IChMaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24pZWRpdG9yQ29uZmlndXJhdGlvbjsKLSAgICAgIENDb21ibyBjb21ibyA9IHdpZGdldEZhY3RvcnkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgICBjb21iby5zZXRUZXh0KHZhbHVlKTsKLSAgICAgIE9iamVjdFtdIHZhbHVlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0VmFsdWVzKGl0ZW0pOwotICAgICAgTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gY29uZmlndXJhdGlvbi5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IHZhbHVlcy5sZW5ndGg7IGorKykKLSAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgT2JqZWN0IG8gPSB2YWx1ZXNbal07Ci0gICAgICAgIFN0cmluZyBkaXNwbGF5TmFtZSA9IGxhYmVsUHJvdmlkZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICBsYWJlbFByb3ZpZGVyLmdldFRleHQobykgOgotICAgICAgICAgICAgICBvLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBjb21iby5hZGQoZGlzcGxheU5hbWUpOwotICAgICAgfQotICAgICAgY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoaW50ZXJuYWxDb250cm9sTGlzdGVuZXIpOwotICAgICAgY29udHJvbCA9IGNvbWJvOwotICAgIH0KLSAgICBpZiAoY29udHJvbCA9PSBudWxsKQotICAgIHsKLSAgICAgIFRleHQgdGV4dCA9IHdpZGdldEZhY3RvcnkuY3JlYXRlVGV4dChjb21wb3NpdGUsdmFsdWUpOwotICAgICAgdGV4dC5hZGRLZXlMaXN0ZW5lcihpbnRlcm5hbENvbnRyb2xMaXN0ZW5lcik7Ci0gICAgICBjb250cm9sID0gdGV4dDsgCi0gICAgfSAKLSAgICBjb250cm9sLnNldERhdGEoSVRFTV9EQVRBLCBpdGVtKTsKLSAgICBjb250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIGNvbnRyb2wuYWRkRm9jdXNMaXN0ZW5lcihpbnRlcm5hbENvbnRyb2xMaXN0ZW5lcik7ICAgICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVCdXR0b25Db250cm9sKEV4dGVuc2lvbkl0ZW0gaXRlbSwgQ29tcG9zaXRlIGNvbXBvc2l0ZSkKLSAgewotICAgIE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIGVkaXRvckNvbmZpZ3VyYXRpb24gPSBpdGVtLmdldFByb3BlcnR5RWRpdG9yQ29uZmlndXJhdGlvbigpOwotICAgIGlmIChlZGl0b3JDb25maWd1cmF0aW9uICE9IG51bGwgJiYgaGFzU3R5bGUoZWRpdG9yQ29uZmlndXJhdGlvbiwgTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uU1RZTEVfRElBTE9HKSkKLSAgICB7ICAgIAotICAgICAgRGlhbG9nTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IChEaWFsb2dOb2RlRWRpdG9yQ29uZmlndXJhdGlvbillZGl0b3JDb25maWd1cmF0aW9uOyAgICAgICAgICAgIAotICAgICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZ3JpZERhdGEuaGVpZ2h0SGludCA9IDE3OwotICAgICAgYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGludGVybmFsQ29udHJvbExpc3RlbmVyKTsKLSAgICAgIGJ1dHRvbi5zZXREYXRhKElURU1fREFUQSwgaXRlbSk7Ci0gICAgICBidXR0b24uc2V0RGF0YShFRElUT1JfQ09ORklHVVJBVElPTl9EQVRBLCBjb25maWd1cmF0aW9uKTsKLSAgICAgIFN0cmluZyB0ZXh0ID0gY29uZmlndXJhdGlvbi5nZXRCdXRvblRleHQoKTsKLSAgICAgIGlmICh0ZXh0ICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgYnV0dG9uLnNldFRleHQodGV4dCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0gIAotICAgICAgYnV0dG9uLnNldEltYWdlKGNvbmZpZ3VyYXRpb24uZ2V0QnV0dG9uSW1hZ2UoKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBDb250cm9sIHBsYWNlSG9sZGVyID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgcGxhY2VIb2xkZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICBwbGFjZUhvbGRlci5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIHBsYWNlSG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOyAKLSAgICB9ICAgICAgCi0gIH0gCi0gIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpCi0gIHsgCi0gICAgLy8gVE9ETyAoY3MpIGFkZCBhc3NlcnRpb25zCi0gICAgLy8KLSAgICBpZiAoY29udGVudFByb3ZpZGVyID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgCi0gICAgaWYgKGNvbXBvc2l0ZSAhPSBudWxsKQotICAgIHsvKgotICAgICAgZm9yIChJdGVyYXRvciBpID0gY29udHJvbHNUaGF0V2VBcmVMaXN0ZW5pbmdUby5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbClpLm5leHQoKTsgICAgICAgCi0gICAgICAgIGlmIChjb250cm9sICE9IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIGNvbnRyb2wucmVtb3ZlRm9jdXNMaXN0ZW5lcihpbnRlcm5hbEZvY3VzTGlzdGVuZXIpOwotICAgICAgICB9ICAKLSAgICAgIH0gKi8gCi0gICAgICByZW1vdmVMaXN0ZW5lcnMoKTsKLSAgICAgIGNvbXBvc2l0ZS5kaXNwb3NlKCk7ICAgICAgIAotICAgIH0gICAKLQotICAgIGNvbXBvc2l0ZSA9IHdpZGdldEZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKGNvbnRyb2wpOwotICAgIGNvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICBPYmplY3RbXSBpdGVtcyA9IGNvbnRlbnRQcm92aWRlci5nZXRJdGVtcyhpbnB1dCk7ICAgICAgCi0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIEV4dGVuc2lvbkl0ZW0gaXRlbSA9IChFeHRlbnNpb25JdGVtKWl0ZW1zW2ldOwotICAgICAgU3RyaW5nIG5hbWUgPSBjb250ZW50UHJvdmlkZXIuZ2V0TmFtZShpdGVtKTsKLSAgICAgIExhYmVsIGxhYmVsID0gd2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIG5hbWUgKyAiOiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLSAgICAgIGNyZWF0ZVRleHRPckNvbWJvQ29udHJvbChpdGVtLCBjb21wb3NpdGUpOwotICAgICAgY3JlYXRlQnV0dG9uQ29udHJvbChpdGVtLCBjb21wb3NpdGUpOwotICAgIH0gIAotICAgIGNvbnRyb2wubGF5b3V0KHRydWUpOyAgICAKLSAgfQotICAgIAotICBwcml2YXRlIGJvb2xlYW4gaGFzU3R5bGUoTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgaW50IHN0eWxlKQotICB7Ci0gICAgcmV0dXJuIChjb25maWd1cmF0aW9uLmdldFN0eWxlKCkgJiBzdHlsZSkgIT0gMDsKLSAgfQotICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiByZXZlYWwpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgCi0gIH0KLSAgcHVibGljIEV4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkKLSAgewotICAgIHJldHVybiBjb250ZW50UHJvdmlkZXI7Ci0gIH0KLSAgcHVibGljIHZvaWQgc2V0Q29udGVudFByb3ZpZGVyKEV4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5jb250ZW50UHJvdmlkZXIgPSBjb250ZW50UHJvdmlkZXI7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBhcHBseUVkaXQoRXh0ZW5zaW9uSXRlbSBpdGVtLCBXaWRnZXQgd2lkZ2V0KQotICB7Ci0gICAgaWYgKGl0ZW0gIT0gbnVsbCkKLSAgICB7ICAgIAotICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKLSAgICAgIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBUZXh0KQotICAgICAgewotICAgICAgICBUZXh0IHRleHQgPSAoVGV4dCl3aWRnZXQ7Ci0gICAgICAgIHZhbHVlID0gdGV4dC5nZXRUZXh0KCk7ICAgIAotICAgICAgfQotICAgICAgZWxzZSBpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ0NvbWJvKQotICAgICAgewotICAgICAgICBDQ29tYm8gY29tYm8gPSAoQ0NvbWJvKXdpZGdldDsKLSAgICAgICAgaW50IGluZGV4ID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgICB7ICAKLSAgICAgICAgICB2YWx1ZSA9IGNvbWJvLmdldEl0ZW0oaW5kZXgpOwotICAgICAgICB9ICAKLSAgICAgIH0gICAgICAgCi0gICAgICBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBpdGVtLmdldFVwZGF0ZVZhbHVlQ29tbWFuZCh2YWx1ZSk7Ci0gICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY29tbWFuZFN0YWNrICE9IG51bGwpCi0gICAgICAgICAgICBjb21tYW5kU3RhY2suZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgICAgICAgICAgICAgCi0gICAgfSAgICAgICAgICAgICAgCi0gIH0KLSAgCi0gIGNsYXNzIEludGVybmFsQ29udHJvbExpc3RlbmVyIGltcGxlbWVudHMgRm9jdXNMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIsIEtleUxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIC8vIGZvciBidXR0b24gY29udHJvbHMgd2UgaGFuZGxlIHNlbGVjdGlvbiBldmVudHMKLSAgICAgIC8vICAgICAgICAKLSAgICAgIE9iamVjdCBpdGVtID0gZS53aWRnZXQuZ2V0RGF0YShFRElUT1JfQ09ORklHVVJBVElPTl9EQVRBKTsKLSAgICAgIGlmIChpdGVtID09IG51bGwpCi0gICAgICAgIGl0ZW0gPSBlLndpZGdldC5nZXREYXRhKElURU1fREFUQSk7ICAgIAotICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBEaWFsb2dOb2RlRWRpdG9yQ29uZmlndXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgRGlhbG9nTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gZGlhbG9nTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gPSAoRGlhbG9nTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24paXRlbTsgICAgICAgIAotICAgICAgICBkaWFsb2dOb2RlRWRpdG9yQ29uZmlndXJhdGlvbi5pbnZva2VEaWFsb2coKTsKLSAgICAgICAgcmVmcmVzaCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4dGVuc2lvbkl0ZW0pCi0gICAgICB7Ci0gICAgICAgIGFwcGx5RWRpdCgoRXh0ZW5zaW9uSXRlbSlpdGVtLCBlLndpZGdldCk7Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIC8vIGRvIG5vdGhpbmcgICAgICAKLSAgICB9IAotICAgIAotICAgIHB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkKLSAgICB7Ci0gICAgfSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKQotICAgIHsKLSAgICAgIC8vIGFwcGx5IGVkaXRzIGZvciB0ZXh0IGFuZCBjb21ibyBib3ggY29udHJvbHMKLSAgICAgIC8vIHZpYSB0aGUgZm9jdXNMb3N0IGV2ZW50Ci0gICAgICBPYmplY3QgaXRlbSA9IGUud2lkZ2V0LmdldERhdGEoSVRFTV9EQVRBKTsKLSAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRXh0ZW5zaW9uSXRlbSkKLSAgICAgIHsKLSAgICAgICAgYXBwbHlFZGl0KChFeHRlbnNpb25JdGVtKWl0ZW0sIGUud2lkZ2V0KTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpCi0gICAgewotICAgICAgLy8gaGFuZGxlIGV4cGxpY3QgRU5URVIga2V5Ci0gICAgICBPYmplY3QgaXRlbSA9IGUud2lkZ2V0LmdldERhdGEoSVRFTV9EQVRBKTsKLSAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRXh0ZW5zaW9uSXRlbSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGUuY2hhcmFjdGVyID09IFNXVC5DUikKLSAgICAgICAgICBhcHBseUVkaXQoKEV4dGVuc2lvbkl0ZW0paXRlbSwgZS53aWRnZXQpOwotICAgICAgfSAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpCi0gICAgewotICAgICAgLy8gSWdub3JlIHRoZXNlIGV2ZW50cwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXJzKCkKLSAgewotICAgIGlmIChjb21wb3NpdGUgIT0gbnVsbCAmJiAhY29tcG9zaXRlLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBDb250cm9sIFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0gICAgICBpbnQgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQ29udHJvbCBvID0gY2hpbGRyZW5baV07Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgQ0NvbWJvKQotICAgICAgICB7Ci0gICAgICAgICAgKChDQ29tYm8pbykucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoaW50ZXJuYWxDb250cm9sTGlzdGVuZXIpOwotICAgICAgICAgIG8ucmVtb3ZlRm9jdXNMaXN0ZW5lcihpbnRlcm5hbENvbnRyb2xMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIFRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAoKFRleHQpbykucmVtb3ZlS2V5TGlzdGVuZXIoaW50ZXJuYWxDb250cm9sTGlzdGVuZXIpOwotICAgICAgICAgIG8ucmVtb3ZlRm9jdXNMaXN0ZW5lcihpbnRlcm5hbENvbnRyb2xMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25JdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjY3ODA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uTm9kZUVkaXRvckNvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHRlbnNpb25JdGVtCi17Ci0gIE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIHByb3BlcnR5RWRpdG9yQ29uZmlndXJhdGlvbjsKLQotICBwdWJsaWMgTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gZ2V0UHJvcGVydHlFZGl0b3JDb25maWd1cmF0aW9uKCkKLSAgewotICAgIHJldHVybiBwcm9wZXJ0eUVkaXRvckNvbmZpZ3VyYXRpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUVkaXRvckNvbmZpZ3VyYXRpb24oTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gcHJvcGVydHlFZGl0b3JDb25maWd1cmF0aW9uKQotICB7Ci0gICAgdGhpcy5wcm9wZXJ0eUVkaXRvckNvbmZpZ3VyYXRpb24gPSBwcm9wZXJ0eUVkaXRvckNvbmZpZ3VyYXRpb247Ci0gIH0gIAotICAKLSAgcHVibGljIGFic3RyYWN0IENvbW1hbmQgZ2V0VXBkYXRlVmFsdWVDb21tYW5kKFN0cmluZyBuZXdWYWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uSXRlbUVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uSXRlbUVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NGFkMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkl0ZW1FZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0gCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuc2lvbkl0ZW1FZGl0TWFuYWdlcgoteyAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUWUxFX05PTkUgPSAibm9uZSI7ICAgLy8kTk9OLU5MUy0xJCAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUWUxFX1RFWFQgPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFlMRV9DT01CTyA9ICJjb21ibyI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RZTEVfQ1VTVE9NID0gImN1c3RvbSI7ICAgICAvLyROT04tTkxTLTEkCi0gIAotICB2b2lkIGhhbmRsZUVkaXQoT2JqZWN0IGl0ZW0sIFdpZGdldCB3aWRnZXQpOwotICBTdHJpbmcgZ2V0VGV4dENvbnRyb2xTdHlsZShPYmplY3QgaXRlbSk7Ci0gIFN0cmluZyBnZXRCdXR0b25Db250cm9sU3R5bGUoT2JqZWN0IGl0ZW0pOwotICBDb250cm9sIGNyZWF0ZUN1c3RvbVRleHRDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUsIE9iamVjdCBpdGVtKTsKLSAgQ29udHJvbCBjcmVhdGVDdXN0b21CdXR0b25Db250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUsIE9iamVjdCBpdGVtKTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkl0ZW1GaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25JdGVtRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOTljMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkl0ZW1GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotCi0vLyBjczogVGhpcyBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gc3VwcGxpbWVudCB0aGUgTm9kZUZpbHRlciBjbGFzcwotLy8gdGhhdCBjYW4gYmUgc3BlY2lmaWVkIHZpYSB0aGUgY3VzdG9taXphdGlvbiBleHRlbnNpb25zIHBvaW50LgotLy8gV2hlbiB0aGUgaW5pdGlhbCBsaXN0IG9mIGEgY2F0ZWdvcnkncyBvYmplY3RzIGlzIGRpc3BsYXllZCAKLS8vIHdlJ2xsIHVzZSBhIE5vZGVGaWx0ZXIgdG8gcHJ1bmUgdGhlIGxpc3QuICBJZiB0aGUgTm9kZUZpbHRlcgotLy8gaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSB3ZSdsbCBjYWxsIHRoaXMgaW50ZXJmYWNlJ3MgaXNBcHBsaWNhYmxlQ29udGV4dAotLy8gbWV0aG9kIGluc3RlYWQgb2YgdGhlIE5vZGVGaWx0ZXIncyBET00gbm9kZSBiYXNlZCBtZXRob2QuICBUaGlzIHByb3ZpZGVzIAotLy8gYXJlIGEgbW9yZSBjb252ZW5pZW50IGludGVyZmFjZSBmb3IgY2xpZW50cyB3aG8gYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiAKLS8vIGZpbHRlciB0aGUgbGlzdCBwcmVzZW50ZWQgdmlhIHRoZSBBZGRFeHRlbnNpb25Db21wb25lbnREaWFsb2cuCi0vLyBTZWUgdGhlIGNsYXNzIEV4dGVuc2lvbnNTZWN0aW9uIGZvciBtb3JlIGRldGFpbHMuCi0vLwotcHVibGljIGludGVyZmFjZSBFeHRlbnNpb25JdGVtRmlsdGVyCi17Ci0gIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZUNvbnRleHQoWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50LCBYU0RDb25jcmV0ZUNvbXBvbmVudCBjYW5kaWRhdGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzNhZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5FeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5FeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9BRERFRF9FWFRfU0NIRU1BUyA9ICJVU0VSLUFEREVELUVYVC1TQ0hFTUFTIjsgIC8vIFRPRE8gZXh0ZXJuYWxpemUKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX1BSRUZJWCA9ICJwbGF0Zm9ybTovcGx1Z2luLyI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU1BMQVlOQU1FID0gImRpc3BsYXlOYW1lIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VVUkkgPSAibmFtZXNwYWNlVVJJIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RGSUxFVVJMID0gInhzZEZpbGVVUkwiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMUFJPVklERVIgPSAibGFiZWxQcm92aWRlckNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfQ09NTUFORF9DTEFTUyA9ICJhZGRDb21tYW5kQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9DT01NQU5EX0NMQVNTID0gImRlbGV0ZUNvbW1hbmRDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfUFJPVklERVJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0gIAotICBwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZXh0ZW5zaW9uSWQ7Ci0KLSAgcHJvdGVjdGVkIEFycmF5TGlzdCBuc1VSSVByb3BlcnRpZXMsIGNhdGVnb3J5UHJvdmlkZXJMaXN0OwotICBwcml2YXRlIFN0cmluZyBkZXByZWNhdGVkRXh0ZW5zaW9uSWQ7Ci0gIAotICBwdWJsaWMgRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeShTdHJpbmcgYXBwaW5mb19leHRlbnNpb25pZCkKLSAgewotICAgIGV4dGVuc2lvbklkID0gYXBwaW5mb19leHRlbnNpb25pZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgX19pbnRlcm5hbFNldERlcHJlY2F0ZWRFeHRlbnNpb25JZChTdHJpbmcgZGVwcmVjYXRlZElkKQotICB7Ci0gICAgZGVwcmVjYXRlZEV4dGVuc2lvbklkID0gZGVwcmVjYXRlZElkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQcmVmU3RvcmUoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkKLSAgewotCSAgcHJlZlN0b3JlID0gc3RvcmU7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRBbGxFeHRlbnNpb25zU2NoZW1hc0NvbnRyaWJ1dGlvbigpCi0gIHsgIAotICAgIC8vIElmIHdlIHJlYWQgdGhlIHJlZ2lzdHJ5LCB0aGVuIGxldCdzIG5vdCBkbyBpdCBhZ2Fpbi4KLSAgICBpZiAobnNVUklQcm9wZXJ0aWVzICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG5zVVJJUHJvcGVydGllczsKLSAgICB9Ci0gCi0gICAgbnNVUklQcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGNhdGVnb3J5UHJvdmlkZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgZ2V0QWxsRXh0ZW5zaW9uc1NjaGVtYXNDb250cmlidXRpb24oZXh0ZW5zaW9uSWQpOwotICAgIGlmIChkZXByZWNhdGVkRXh0ZW5zaW9uSWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRBbGxFeHRlbnNpb25zU2NoZW1hc0NvbnRyaWJ1dGlvbihkZXByZWNhdGVkRXh0ZW5zaW9uSWQpOyAgICAgCi0gICAgfSAgCi0gICAgCi0gICAgLy8gZ2V0IHVzZXItYWRkZWQgc2NoZW1hcyBzdG9yZWQgaW4gcHJlZmVyZW5jZQotICAgIGlmIChwcmVmU3RvcmUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBwcmVmU3RvcmUuZ2V0U3RyaW5nKFVTRVJfQURERURfRVhUX1NDSEVNQVMpOwotICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICJcbiIpOwotICAgCi0gICAgICB3aGlsZSAoIHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkgKQotICAgICAgewotICAgICAgICBuc1VSSVByb3BlcnRpZXMuYWRkKCBuZXcgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEoIHRva2VuaXplci5uZXh0VG9rZW4oKSApICk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBuc1VSSVByb3BlcnRpZXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgTGlzdCBnZXRBbGxFeHRlbnNpb25zU2NoZW1hc0NvbnRyaWJ1dGlvbihTdHJpbmcgaWQpCi0gIHsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBhc2lQcm9wZXJ0aWVzTGlzdCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKGlkKTsKLQotICAgIGJvb2xlYW4gaGFzQVNJUHJvcGVydGllcyA9IChhc2lQcm9wZXJ0aWVzTGlzdCAhPSBudWxsKSAmJiAoYXNpUHJvcGVydGllc0xpc3QubGVuZ3RoID4gMCk7Ci0KLSAgICBpZiAoaGFzQVNJUHJvcGVydGllcykKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFzaVByb3BlcnRpZXNMaXN0Lmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgYXNpUHJvcGVydGllc0VsZW1lbnQgPSBhc2lQcm9wZXJ0aWVzTGlzdFtpXTsKLSAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lID0gYXNpUHJvcGVydGllc0VsZW1lbnQuZ2V0TmFtZSgpOwotCi0gICAgICAgIGlmICgiY2F0ZWdvcnkiLmVxdWFscyhlbGVtZW50TmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBhc2lQcm9wZXJ0aWVzRWxlbWVudC5nZXRBdHRyaWJ1dGUoREVTQ1JJUFRJT04pOwotICAgICAgICAgIFN0cmluZyBkaXNwbGF5TmFtZSA9IGFzaVByb3BlcnRpZXNFbGVtZW50LmdldEF0dHJpYnV0ZShESVNQTEFZTkFNRSk7Ci0gICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IGFzaVByb3BlcnRpZXNFbGVtZW50LmdldEF0dHJpYnV0ZShOQU1FU1BBQ0VVUkkpOwotICAgICAgICAgIFN0cmluZyB4c2RGaWxlVVJMID0gYXNpUHJvcGVydGllc0VsZW1lbnQuZ2V0QXR0cmlidXRlKFhTREZJTEVVUkwpOwotICAgICAgICAgIFN0cmluZyBsYWJlbFByb3ZpZGVyQ2xhc3MgPSBhc2lQcm9wZXJ0aWVzRWxlbWVudC5nZXRBdHRyaWJ1dGUoTEFCRUxQUk9WSURFUik7Ci0gICAgICAgICAgU3RyaW5nIGFkZENvbW1hbmRDbGFzcyA9IGFzaVByb3BlcnRpZXNFbGVtZW50LmdldEF0dHJpYnV0ZShBRERfQ09NTUFORF9DTEFTUyk7Ci0gICAgICAgICAgU3RyaW5nIGRlbGV0ZUNvbW1hbmRDbGFzcyA9IGFzaVByb3BlcnRpZXNFbGVtZW50LmdldEF0dHJpYnV0ZShERUxFVEVfQ09NTUFORF9DTEFTUyk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKGRpc3BsYXlOYW1lID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZGlzcGxheSBuYW1lLCBmb3JjZSB0aGUgdXNlcgotICAgICAgICAgICAgLy8gdG8gbWFudWFsbHkgY3JlYXRlIGEgbmFtZS4gVGhlcmVmb3JlLCB3ZSBpZ25vcmUgZW50cnkgd2l0aG91dAotICAgICAgICAgICAgLy8gYSBkaXNwbGF5IG5hbWUuCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoeHNkRmlsZVVSTCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZEZpbGVVUkwgPSBsb2NhdGVGaWxlVXNpbmdDYXRhbG9nKG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgZXh0ZW5zaW9uc1NjaGVtYVNwZWMgPSBjcmVhdGVFbnRyeSgpOwotICAgICAgICAgIGV4dGVuc2lvbnNTY2hlbWFTcGVjLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgICBleHRlbnNpb25zU2NoZW1hU3BlYy5zZXREaXNwbGF5TmFtZShkaXNwbGF5TmFtZSk7Ci0gICAgICAgICAgZXh0ZW5zaW9uc1NjaGVtYVNwZWMuc2V0TmFtZXNwYWNlVVJJKG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgZXh0ZW5zaW9uc1NjaGVtYVNwZWMuc2V0RGVmYXV0U2NoZW1hKCk7Ci0KLSAgICAgICAgICBTdHJpbmcgcGx1Z2luSWQgPSBhc2lQcm9wZXJ0aWVzRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQotICAgICAgICAgIGlmIChsYWJlbFByb3ZpZGVyQ2xhc3MgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBDbGFzcyB0aGVDbGFzcyA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCkubG9hZENsYXNzKGxhYmVsUHJvdmlkZXJDbGFzcyk7Ci0gICAgICAgICAgICAgIGlmICh0aGVDbGFzcyAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGFiZWxQcm92aWRlciA9IChJTGFiZWxQcm92aWRlcikgdGhlQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNTY2hlbWFTcGVjLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKGFkZENvbW1hbmRDbGFzcyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCBhZGRDb21tYW5kID0gKEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kKWFzaVByb3BlcnRpZXNFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQUREX0NPTU1BTkRfQ0xBU1MpOwotICAgICAgICAgICAgICBpZiAoYWRkQ29tbWFuZCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uc1NjaGVtYVNwZWMuc2V0RXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQoYWRkQ29tbWFuZCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoZGVsZXRlQ29tbWFuZENsYXNzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZCBkZWxldGVDb21tYW5kID0gKEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZClhc2lQcm9wZXJ0aWVzRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKERFTEVURV9DT01NQU5EX0NMQVNTKTsKLSAgICAgICAgICAgICAgaWYgKGRlbGV0ZUNvbW1hbmQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNTY2hlbWFTcGVjLnNldEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZChkZWxldGVDb21tYW5kKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGV4dGVuc2lvbnNTY2hlbWFTcGVjLnNldExvY2F0aW9uKExPQ0FUSU9OX1BSRUZJWCArIHBsdWdpbklkICsgIi8iICsgeHNkRmlsZVVSTCk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgIG5zVVJJUHJvcGVydGllcy5hZGQoZXh0ZW5zaW9uc1NjaGVtYVNwZWMpOwotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoImNhdGVnb3J5UHJvdmlkZXIiLmVxdWFscyhlbGVtZW50TmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgY2F0ZWdvcnlQcm92aWRlckNsYXNzID0gYXNpUHJvcGVydGllc0VsZW1lbnQuZ2V0QXR0cmlidXRlKENBVEVHT1JZX1BST1ZJREVSX0NMQVNTKTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoY2F0ZWdvcnlQcm92aWRlckNsYXNzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIENhdGVnb3J5UHJvdmlkZXIgY2F0ZWdvcnlQcm92aWRlciA9IChDYXRlZ29yeVByb3ZpZGVyKWFzaVByb3BlcnRpZXNFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQ0FURUdPUllfUFJPVklERVJfQ0xBU1MpOwotICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnlQcm92aWRlciAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2F0ZWdvcnlQcm92aWRlckxpc3QuYWRkKGNhdGVnb3J5UHJvdmlkZXIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotCi0gICAgfQotICAgIAotICAgIHJldHVybiBuc1VSSVByb3BlcnRpZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCBnZXRBZGRFeHRlbnNpb25Db21tYW5kKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICAvLyBEaWRuJ3QgcmV0cmlldmUgdGhlIGNvbmZpZyBlbGVtZW50cyB5ZXQuCi0gICAgaWYgKG5zVVJJUHJvcGVydGllcyA9PSBudWxsKQotICAgIHsKLSAgICAgIGdldEFsbEV4dGVuc2lvbnNTY2hlbWFzQ29udHJpYnV0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIGZvciAoSXRlcmF0b3IgaSA9IG5zVVJJUHJvcGVydGllcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMgPSAoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpaS5uZXh0KCk7Ci0gICAgICBTdHJpbmcgbnNVUkkgPSBzcGVjLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKG5zVVJJICE9IG51bGwgJiYgbnNVUkkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBzcGVjLmdldEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChJdGVyYXRvciBpID0gY2F0ZWdvcnlQcm92aWRlckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBDYXRlZ29yeVByb3ZpZGVyIGNhdGVnb3J5UHJvdmlkZXIgPSAoQ2F0ZWdvcnlQcm92aWRlcilpLm5leHQoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaiA9IGNhdGVnb3J5UHJvdmlkZXIuZ2V0Q2F0ZWdvcmllcygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMgPSAoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpIGoubmV4dCgpOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gc3BlYy5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsICYmIG5hbWVzcGFjZVVSSS5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBzcGVjLmdldEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQgZ2V0UmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIC8vIERpZG4ndCByZXRyaWV2ZSB0aGUgY29uZmlnIGVsZW1lbnRzIHlldC4KLSAgICBpZiAobnNVUklQcm9wZXJ0aWVzID09IG51bGwpCi0gICAgewotICAgICAgZ2V0QWxsRXh0ZW5zaW9uc1NjaGVtYXNDb250cmlidXRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgZm9yIChJdGVyYXRvciBpID0gbnNVUklQcm9wZXJ0aWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYyA9IChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSlpLm5leHQoKTsKLSAgICAgIFN0cmluZyBuc1VSSSA9IHNwZWMuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBpZiAobnNVUkkgIT0gbnVsbCAmJiBuc1VSSS5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHNwZWMuZ2V0RXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGZvciAoSXRlcmF0b3IgaSA9IGNhdGVnb3J5UHJvdmlkZXJMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQ2F0ZWdvcnlQcm92aWRlciBjYXRlZ29yeVByb3ZpZGVyID0gKENhdGVnb3J5UHJvdmlkZXIpaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBjYXRlZ29yeVByb3ZpZGVyLmdldENhdGVnb3JpZXMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjID0gKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKSBqLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHNwZWMuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCAmJiBuYW1lc3BhY2VVUkkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gc3BlYy5nZXRFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0Q2F0ZWdvcnlQcm92aWRlcnMoKQotICB7Ci0gICAgaWYgKG5zVVJJUHJvcGVydGllcyA9PSBudWxsKQotICAgIHsKLSAgICAgIGdldEFsbEV4dGVuc2lvbnNTY2hlbWFzQ29udHJpYnV0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBjYXRlZ29yeVByb3ZpZGVyTGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgY3JlYXRlRW50cnkoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFN0cmluZyBsb2NhdGlvbiBmb3IgdGhlIHNjaGVtYSB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2VVUkkgYnkKLSAgICogbG9va2luZyBhdCB0aGUgWE1MIGNhdGFsb2cuIFdlIGxvb2sgb25seSBpbiB0aGUgcGx1Z2luIHNwZWNpZmllZCBlbnRyaWVzIG9mCi0gICAqIHRoZSBjYXRhbG9nLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZVVSSQotICAgKiBAcmV0dXJuIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBzY2hlbWEuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBsb2NhdGVGaWxlVXNpbmdDYXRhbG9nKFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gIHsKLSAgICBVUklSZXNvbHZlciByZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IHJlc29sdmVyLnJlc29sdmUoIiIsIG5hbWVzcGFjZVVSSSwgIiIpOwotICAgIHJldHVybiByZXNvbHZlci5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbigiIiwgbmFtZXNwYWNlVVJJLCByZXN1bHQpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9TZWxlY3RGcm9tQ2F0YWxvZ0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL1NlbGVjdEZyb21DYXRhbG9nRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNWRhZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL1NlbGVjdEZyb21DYXRhbG9nRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2dTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nLlhNTENhdGFsb2dFbnRyaWVzVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2cuWE1MQ2F0YWxvZ0VudHJ5RGV0YWlsc1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nLlhNTENhdGFsb2dNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2cuWE1MQ2F0YWxvZ1RyZWVWaWV3ZXI7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3RGcm9tQ2F0YWxvZ0RpYWxvZyBleHRlbmRzIERpYWxvZwotewotCi0gIHByaXZhdGUgSUNhdGFsb2cgd29ya2luZ1VzZXJDYXRhbG9nOwotICBwcml2YXRlIElDYXRhbG9nIHVzZXJDYXRhbG9nOwotICBwcml2YXRlIElDYXRhbG9nIGRlZmF1bHRDYXRhbG9nOwotICBwcml2YXRlIFhNTENhdGFsb2dFbnRyaWVzVmlldyBjYXRhbG9nRW50cmllc1ZpZXc7Ci0gIHByaXZhdGUgSUNhdGFsb2cgc3lzdGVtQ2F0YWxvZzsKLQotICBwcml2YXRlIFN0cmluZyBjdXJyZW50U2VsZWN0aW9uTG9jYXRpb247Ci0gIHByaXZhdGUgU3RyaW5nIGN1cnJlbnRTZWxlY3Rpb25OYW1lc3BhY2U7Ci0KLSAgcHVibGljIFNlbGVjdEZyb21DYXRhbG9nRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotCi0gICAgZGVmYXVsdENhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotICAgIElOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGRlZmF1bHRDYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElOZXh0Q2F0YWxvZyBjYXRhbG9nID0gbmV4dENhdGFsb2dzW2ldOwotICAgICAgSUNhdGFsb2cgcmVmZXJlbmNlZENhdGFsb2cgPSBjYXRhbG9nLmdldFJlZmVyZW5jZWRDYXRhbG9nKCk7Ci0gICAgICBpZiAocmVmZXJlbmNlZENhdGFsb2cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKFhNTENvcmVQbHVnaW4uU1lTVEVNX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgc3lzdGVtQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFhNTENvcmVQbHVnaW4uVVNFUl9DQVRBTE9HX0lELmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkKLSAgICAgICAgewotICAgICAgICAgIHVzZXJDYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyB3ZSBjcmVhdGUgYSB3b3JraW5nIGNvcHkgb2YgdGhlICdVc2VyIFNldHRpbmdzJyBmb3IgdGhlIENhdGFsb2cKLSAgICAvLyB0aGF0IHdlIGNhbiBtb2RpZnkKLSAgICBDYXRhbG9nU2V0IHRlbXBDYXRhbG9nU2V0ID0gbmV3IENhdGFsb2dTZXQoKTsKLSAgICB3b3JraW5nVXNlckNhdGFsb2cgPSB0ZW1wQ2F0YWxvZ1NldC5sb29rdXBPckNyZWF0ZUNhdGFsb2coIndvcmtpbmciLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgLy8gVE9ETzogYWRkIGVudHJpZXMgZnJvbSB0aGUgbmVzdGVkIGNhdGFsb2dzIGFzIHdlbGwKLSAgICB3b3JraW5nVXNlckNhdGFsb2cuYWRkRW50cmllc0Zyb21DYXRhbG9nKHVzZXJDYXRhbG9nKTsKLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBncmlkRGF0YS5oZWlnaHRIaW50ID0gNTAwOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICBjcmVhdGVDYXRhbG9nRW50cmllc1ZpZXcoY29tcG9zaXRlKTsKLSAgICBjcmVhdGVDYXRhbG9nRGV0YWlsc1ZpZXcoY29tcG9zaXRlKTsKLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDYXRhbG9nRW50cmllc1ZpZXcoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIGdyaWREYXRhLndpZHRoSGludCA9IDM3MDsKLSAgICBncm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICBncm91cC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9VU0VSX0VOVFJJRVMpOwotICAgIGdyb3VwLnNldFRvb2xUaXBUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9VU0VSX0VOVFJJRVNfVE9PTF9USVApOwotCi0gICAgLyoKLSAgICAgKiBjcmVhdGUgYSBzdWJjbGFzcyBvZiBYTUxDYXRhbG9nRW50cmllc1ZpZXcgd2hpY2ggc3VwcHJlc3NlcyAtIHRoZQotICAgICAqIGNyZWF0aW9uIG9mICdBZGQnLCAnRWRpdCcsICdEZWxldGUnIGJ1dHRvbnMgLSBhbnkgbWV0aG9kIGludm9sdmluZyB0aGUKLSAgICAgKiBhYm92ZSBidXR0b25zCi0gICAgICovCi0gICAgY2F0YWxvZ0VudHJpZXNWaWV3ID0gbmV3IFhNTENhdGFsb2dFbnRyaWVzVmlldyhncm91cCwgd29ya2luZ1VzZXJDYXRhbG9nLCBzeXN0ZW1DYXRhbG9nKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnMoQ29tcG9zaXRlIHBhcmVudCkKLSAgICAgIHsKLSAgICAgIH0KLQotICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2lkZ2V0RW5hYmxlZFN0YXRlKCkKLSAgICAgIHsKLSAgICAgIH0KLQotICAgIH07Ci0KLSAgICAvLyBPbmx5IFhNTCBTY2hlbWEgZW50cnkgaXMgc2VsZWN0YWJsZQotICAgIGNhdGFsb2dFbnRyaWVzVmlldy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICBYTUxDYXRhbG9nVHJlZVZpZXdlciBjYXRhbG9nVHJlZVZpZXdlciA9ICgoWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIpIGNhdGFsb2dFbnRyaWVzVmlldy5nZXRWaWV3ZXIoKSk7Ci0gICAgY2F0YWxvZ1RyZWVWaWV3ZXIucmVzZXRGaWx0ZXJzKCk7Ci0KLSAgICBjYXRhbG9nVHJlZVZpZXdlci5hZGRGaWx0ZXIobmV3IFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlcihuZXcgU3RyaW5nW10geyAiLnhzZCIgfSkpOwotICB9Ci0KLSAgLy8gQnVnIGluIHRoZSBmaWx0ZXIgb2YgdGhlIFhNTCBwbHVnaW4sIGhhdmUgdG8gZ2l2ZSBhIGNvcnJlY3QgdmVyc2lvbiBoZXJlCi0gIC8vIFRPRE86IFdhaXRpbmcgZm9yIHRoZSBmaXggdG8gYmUgY29tbWl0ZWQgdG8gWE1MIHBsdWdpbiBhbmQKLSAgLy8gYmUgdXNlZCBieSBjb25zdGVsbGF0aW9uCi0gIHByaXZhdGUgY2xhc3MgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyCi0gIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVzNfWE1MU0NIRU1BX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxLyI7Ci0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGV4dGVuc2lvbnM7Ci0KLSAgICBwdWJsaWMgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyRmlsdGVyKFN0cmluZ1tdIGV4dGVuc2lvbnMxKQotICAgIHsKLSAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMxOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KQotICAgICAgewotICAgICAgICBJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBlbGVtZW50OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBpZiB0aGUgZXh0ZW5zaW9uIGlzIGNvcnJlY3QgYW5kIHRoZSBuYW1lc3BhY2UgaW5kaWNhdGVzCi0gICAgICAgICAgLy8gdGhhdCB0aGlzIGVudHJ5IGlzIG5vdCB0aGUgVzMgWE1MIFNjaGVtYQotICAgICAgICAgIGlmIChjYXRhbG9nRW50cnkuZ2V0VVJJKCkuZW5kc1dpdGgoZXh0ZW5zaW9uc1tpXSkgJiYgIWNhdGFsb2dFbnRyeS5nZXRLZXkoKS5zdGFydHNXaXRoKFczX1hNTFNDSEVNQV9OQU1FU1BBQ0UpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVsZW1lbnQuZXF1YWxzKFhNTENhdGFsb2dUcmVlVmlld2VyLlBMVUdJTl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1QpIHx8IGVsZW1lbnQuZXF1YWxzKFhNTENhdGFsb2dUcmVlVmlld2VyLlVTRVJfU1BFQ0lGSUVEX0VOVFJJRVNfT0JKRUNUKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNhdGFsb2dEZXRhaWxzVmlldyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgR3JvdXAgZGV0YWlsc0dyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGRldGFpbHNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBkZXRhaWxzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgIGRldGFpbHNHcm91cC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ERVRBSUxTKTsKLSAgICBmaW5hbCBYTUxDYXRhbG9nRW50cnlEZXRhaWxzVmlldyBkZXRhaWxzVmlldyA9IG5ldyBYTUxDYXRhbG9nRW50cnlEZXRhaWxzVmlldyhkZXRhaWxzR3JvdXApOwotICAgIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIE9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLSAgICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkKLSAgICAgICAgewotICAgICAgICAgIElDYXRhbG9nRW50cnkgZW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgc2VsZWN0ZWRPYmplY3Q7Ci0gICAgICAgICAgZGV0YWlsc1ZpZXcuc2V0Q2F0YWxvZ0VsZW1lbnQoZW50cnkpOwotICAgICAgICAgIGN1cnJlbnRTZWxlY3Rpb25Mb2NhdGlvbiA9IGVudHJ5LmdldFVSSSgpOwotICAgICAgICAgIGN1cnJlbnRTZWxlY3Rpb25OYW1lc3BhY2UgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBkZXRhaWxzVmlldy5zZXRDYXRhbG9nRWxlbWVudCgoSUNhdGFsb2dFbnRyeSkgbnVsbCk7Ci0gICAgICAgICAgY3VycmVudFNlbGVjdGlvbkxvY2F0aW9uID0gIiI7Ci0gICAgICAgICAgY3VycmVudFNlbGVjdGlvbk5hbWVzcGFjZSA9ICIiOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgICBjYXRhbG9nRW50cmllc1ZpZXcuZ2V0Vmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudFNlbGVjdGlvbkxvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBjdXJyZW50U2VsZWN0aW9uTG9jYXRpb247Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRTZWxlY3Rpb25OYW1lc3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb25OYW1lc3BhY2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9TcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL1NwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNGE5YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL1NwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLk5vZGVGaWx0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYQotewotICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgZGlzcGxheU5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSTsKLSAgcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb247Ci0gIHByaXZhdGUgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLSAgcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdFNjaGVtYSA9IGZhbHNlOwotICBwcml2YXRlIEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kIGFkZENvbW1hbmQ7Ci0gIHByaXZhdGUgRXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kIHJlbW92ZUNvbW1hbmQ7Ci0gIHByaXZhdGUgTm9kZUZpbHRlciBub2RlRmlsdGVyOwotICBwcml2YXRlIFN0cmluZyBjbGFzc2lmaWNhdGlvbjsKLSAgCi0gIC8qKgotICAgKiBFaXRoZXIgdGhlIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoIG9mIHRoZSB4c2QgZmlsZSBvciB0aGUgbmFtZXNwYWNlCi0gICAqIG9mIHRoZSB4c2QgZmlsZSAoaWYgaXQgY29tZSBmcm9tIHRoZSBDYXRhbG9nKSAKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHNvdXJjZUhpbnQ7Ci0gIHByaXZhdGUgYm9vbGVhbiBmcm9tQ2F0YWxvZzsKLQotICBwdWJsaWMgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYShTdHJpbmcgZGVzYykgewotCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRlc2MsICJcdCIpOwotCQotCS8vIHdlIG11c3QgYmUgc3VyZSB0aGF0IGVhY2ggJ2Rlc2MnIGNvbnRhaW5zIGluZm8gaW4gY29ycmVjdCBmb3JtYXQKLQkvLyBubyBlcnJvciBjaGVja2luZyBoZXJlCi0JZGVzY3JpcHRpb24gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JZGlzcGxheU5hbWUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JbmFtZXNwYWNlVVJJID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCWxvY2F0aW9uID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCWlzRGVmYXVsdFNjaGVtYSA9IHRva2VuaXplci5uZXh0VG9rZW4oKS5lcXVhbHMoInRydWUiKTsKLQlzb3VyY2VIaW50ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCWZyb21DYXRhbG9nID0gdG9rZW5pemVyLm5leHRUb2tlbigpLmVxdWFscygidHJ1ZSIpOwotICB9Ci0KLS8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGRlc2NyaXB0aW9uCi0gICAqICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pCi0gIHsKLSAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkaXNwbGF5TmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGRpc3BsYXlOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBuYW1lCi0gICAqICAgICAgICAgIFRoZSBkaXNwbGF5TmFtZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpCi0gIHsKLSAgICB0aGlzLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lc3BhY2VVUkkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKLSAgICogICAgICAgICAgVGhlIG5hbWVzcGFjZVVSSSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgewotICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIHhzZCBmaWxlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbG9jYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAqICAgICAgICAgIFRoZSBsb2NhdGlvbiB0byBiZSBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikKLSAgewotICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkKLSAgewotICAgIHJldHVybiBsYWJlbFByb3ZpZGVyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRMYWJlbFByb3ZpZGVyKElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kIGdldEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kKCkKLSAgewotICAgIHJldHVybiBhZGRDb21tYW5kOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQoRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQgYWRkQ29tbWFuZCkKLSAgewotICAgIHRoaXMuYWRkQ29tbWFuZCA9IGFkZENvbW1hbmQ7Ci0gIH0KLQotICBwdWJsaWMgRXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kIGdldEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZCgpCi0gIHsKLSAgICByZXR1cm4gcmVtb3ZlQ29tbWFuZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZChFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQgcmVtb3ZlQ29tbWFuZCkKLSAgewotICAgIHRoaXMucmVtb3ZlQ29tbWFuZCA9IHJlbW92ZUNvbW1hbmQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1dFNjaGVtYSgpewotCSAgcmV0dXJuIGlzRGVmYXVsdFNjaGVtYSA7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZWZhdXRTY2hlbWEoKXsKLQkgIGlzRGVmYXVsdFNjaGVtYSA9IHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNvdXJjZUhpbnQoU3RyaW5nIHMpewotCSAgc291cmNlSGludCA9IHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlSGludCgpewotCSAgcmV0dXJuIHNvdXJjZUhpbnQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0Zyb21DYXRhbG9nKCkgewotCXJldHVybiBmcm9tQ2F0YWxvZzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZyb21DYXRhbG9nKGJvb2xlYW4gZnJvbUNhdGFsb2cpIHsKLQl0aGlzLmZyb21DYXRhbG9nID0gZnJvbUNhdGFsb2c7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGVyZSBpcyBubyBzdXBwb3J0IGZvciBzZXR0aW5nIHRoaXMgdmlhIHRoZSBleHRlbnNpb24gcG9pbnQgZGVmaW5lZCBpbiB0aGUgcGx1Z2luLnhtbAotICAgKiBUaGlzIGFsbG93cyBleHRlbmRlcnMgdG8gcHJvdmlkZSBhIGZpbHRlciBmb3IgYSBjYXRlZ29yeSB0aGF0IGhhcyBiZWVuIGFkZGVkIAotICAgKiBkeW5hbWljYWxseSAocHJvZ3JhbW1hdGljYWxseSkKLSAgICogQHBhcmFtIG5vZGVGaWx0ZXIKLSAgICovIAotICBwdWJsaWMgdm9pZCBzZXROb2RlRmlsdGVyKE5vZGVGaWx0ZXIgbm9kZUZpbHRlcikKLSAgewotICAgIHRoaXMubm9kZUZpbHRlciA9IG5vZGVGaWx0ZXI7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIG5vZGUgZmlsdGVyCi0gICAqIEByZXR1cm4gTm9kZUZpbHRlcgotICAgKi8KLSAgcHVibGljIE5vZGVGaWx0ZXIgZ2V0Tm9kZUZpbHRlcigpCi0gIHsKLSAgICByZXR1cm4gbm9kZUZpbHRlcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNldHRpbmcgdGhpcyB2aWEgdGhlIGV4dGVuc2lvbiBwb2ludCBkZWZpbmVkIGluIHRoZSBwbHVnaW4ueG1sCi0gICAqIFRoaXMgYWxsb3dzIGV4dGVuZGVycyB0byBncm91cCBjYXRlZ29yaWVzIGludG8gZ3JvdXBzIG9yIGNsYXNzaWZpY2F0aW9uc3MgIAotICAgKiBAcGFyYW0gY2xhc3NpZmljYXRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENsYXNzaWZpY2F0aW9uKFN0cmluZyBjbGFzc2lmaWNhdGlvbikKLSAgewotICAgIHRoaXMuY2xhc3NpZmljYXRpb24gPSBjbGFzc2lmaWNhdGlvbjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgY2xhc3NpZmljYXRpb24KLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NpZmljYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGNsYXNzaWZpY2F0aW9uOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vWFNERXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL1hTREV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlNDI1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vWFNERXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFeHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgRE9NRXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcgoteyAgCi0gIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotICB7Ci0gICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgaW5wdXRFbGVtZW50OwotICAgICAgTGlzdCBlbGVtZW50c0FuZEF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBYU0RBbm5vdGF0aW9uIHhzZEFubm90YXRpb24gPSBYU0RDb21tb25VSVV0aWxzLmdldElucHV0WFNEQW5ub3RhdGlvbihjb21wb25lbnQsIGZhbHNlKTsKLSAgICAgIGlmICh4c2RBbm5vdGF0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIEJ1ZyAxMzc4NTYgLSBFeHRlbnNpb24gcGFnZSBvZiBwcm9wZXJ0aWVzIHNob3VsZG4ndCBkaXNwbGF5IGltcG9ydGVkIGVsZW1lbnRzCi0gICAgICAgIC8vIEFkZGVkIHRoaXMgaWYgc3RhdGVtZW50Ci0gICAgICAgIGlmICh4c2RBbm5vdGF0aW9uLmdldFNjaGVtYSgpID09IGNvbXBvbmVudC5nZXRTY2hlbWEoKSkKLSAgICAgICAgewotICAgICAgICAgIExpc3QgYXBwSW5mb0xpc3QgPSB4c2RBbm5vdGF0aW9uLmdldEFwcGxpY2F0aW9uSW5mb3JtYXRpb24oKTsKLSAgICAgICAgICBFbGVtZW50IGFwcEluZm9FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICBpZiAoYXBwSW5mb0xpc3Quc2l6ZSgpID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhcHBJbmZvRWxlbWVudCA9IChFbGVtZW50KSBhcHBJbmZvTGlzdC5nZXQoMCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChhcHBJbmZvRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBhcHBJbmZvTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVsZW1lbnQgYXBwSW5mbyA9IChFbGVtZW50KSBvYmo7Ci0gICAgICAgICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBhcHBJbmZvLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbGVtZW50c0FuZEF0dHJpYnV0ZXMuYWRkKG5vZGUpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogQ29uc3RydWN0IGF0dHJpYnV0ZXMgbGlzdCAqLwotICAgICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBhcHBJbmZvRWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBTdHJpbmcgZGVmYXVsdE5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgIC8vIChTdHJpbmcpY29tcG9uZW50LmdldFNjaGVtYSgpLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKS5nZXQoIiIpOwotICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLSAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5vZGUgb25lQXR0cmlidXRlID0gYXR0cmlidXRlcy5pdGVtKGkpOwotICAgICAgICAgICAgICAgIGlmICghaXNYbWxuc0F0dHJpYnV0ZShvbmVBdHRyaWJ1dGUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBvbmVBdHRyaWJ1dGUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICBib29sZWFuIGlzRXh0ZW5zaW9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCAmJiBvbmVBdHRyaWJ1dGUuZ2V0UHJlZml4KCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaXNFeHRlbnNpb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlzRXh0ZW5zaW9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGlmIChpc0V4dGVuc2lvbikKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudHNBbmRBdHRyaWJ1dGVzLmFkZChvbmVBdHRyaWJ1dGUpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGVsZW1lbnRzQW5kQXR0cmlidXRlcy50b0FycmF5KCk7Ci0gICAgfQotICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULnRvQXJyYXkoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYbWxuc0F0dHJpYnV0ZShOb2RlIGF0dHJpYnV0ZSkKLSAgewotICAgIFN0cmluZyBwcmVmaXggPSBhdHRyaWJ1dGUuZ2V0UHJlZml4KCk7Ci0gICAgaWYgKHByZWZpeCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIHRoaXMgaGFuZGxlIHRoZSB4bWxuczpmb289ImJsYWgiIGNhc2UKLSAgICAgIHJldHVybiAieG1sbnMiLmVxdWFscyhwcmVmaXgpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyB0aGlzIGhhbmRsZXMgdGhlIHhtbG5zPSJibGFoIiBjYXNlCi0gICAgICByZXR1cm4gInhtbG5zIi5lcXVhbHMoYXR0cmlidXRlLmdldE5vZGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL0RlZmF1bHRMaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vRGVmYXVsdExpc3ROb2RlRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODRhZDcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vRGVmYXVsdExpc3ROb2RlRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tOwotCi0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIGV4dGVuZHMgTGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uCi17Ci0gIHByaXZhdGUgU3RyaW5nW10gdmFsdWVzOwotICAKLSAgcHVibGljIERlZmF1bHRMaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24oU3RyaW5nW10gdmFsdWVzKQotICB7Ci0gICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7IAotICB9Ci0gCi0gIHB1YmxpYyBPYmplY3RbXSBnZXRWYWx1ZXMoT2JqZWN0IHByb3BlcnR5T2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIHZhbHVlczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9EaWFsb2dOb2RlRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9EaWFsb2dOb2RlRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQ1MzBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vRGlhbG9nTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIERpYWxvZ05vZGVFZGl0b3JDb25maWd1cmF0aW9uIGV4dGVuZHMgTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24KLXsKLSAgcHVibGljIGludCBnZXRTdHlsZSgpCi0gIHsgICAgICAgIAotICAgIHJldHVybiBTVFlMRV9ESUFMT0c7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QnV0b25UZXh0KCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgSW1hZ2UgZ2V0QnV0dG9uSW1hZ2UoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGludm9rZURpYWxvZygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9MaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZmJjZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9MaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIExpc3ROb2RlRWRpdG9yQ29uZmlndXJhdGlvbiBleHRlbmRzIE5vZGVFZGl0b3JDb25maWd1cmF0aW9uCi17Ci0gIHByaXZhdGUgTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotIAotICBwdWJsaWMgTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkKLSAgewotICAgIHJldHVybiBsYWJlbFByb3ZpZGVyOwotICB9Ci0gIAotICBwdWJsaWMgaW50IGdldFN0eWxlKCkKLSAgewotICAgIHJldHVybiBTVFlMRV9DT01CTzsKLSAgfSAgICAKLQotICBwdWJsaWMgdm9pZCBzZXRMYWJlbFByb3ZpZGVyKExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikKLSAgewotICAgIHRoaXMubGFiZWxQcm92aWRlciA9IGxhYmVsUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0W10gZ2V0VmFsdWVzKE9iamVjdCBwcm9wZXJ0eU9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL05vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGRmNjNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgTm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeQotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQgIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfUFJPVklERVJfQ0xBU1NfQVRUUklCVVRFX05BTUUgPSAibGFiZWxQcm92aWRlckNsYXNzIjsgICAgIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9FRElUT1JfUFJPVklERVJfQ0xBU1NfQVRUUklCVVRFX05BTUUgPSAibm9kZUVkaXRvclByb3ZpZGVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJfQ0xBU1NfQVRUUklCVVRFX05BTUUgPSAiZmlsdGVyQ2xhc3MiOyAKLQotCi0gIHByb3RlY3RlZCBTdHJpbmcgZXh0ZW5zaW9uSWQ7Ci0gIHByb3RlY3RlZCBIYXNoTWFwIG1hcDsKLQotICBwdWJsaWMgTm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeShTdHJpbmcgcHJvcGVydHlFZGl0b3JFeHRlbnNpb25JZCkKLSAgewotICAgIGV4dGVuc2lvbklkID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuZXh0ZW5zaWJpbGl0eU5vZGVDdXN0b21pemF0aW9ucyI7Ly9wcm9wZXJ0eUVkaXRvckV4dGVuc2lvbklkOwotICB9ICAKLSAgCi0gIHByaXZhdGUgY2xhc3MgRGVzY3JpcHRvcgotICB7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50OwotICAgIE5vZGVFZGl0b3JQcm92aWRlciBub2RlRWRpdG9yUHJvdmlkZXI7Ci0gICAgTm9kZUZpbHRlciBub2RlRmlsdGVyOyAgICAKLSAgICBib29sZWFuIG5vZGVFZGl0b3JQcm92aWRlckZhaWxlZFRvTG9hZCA9IGZhbHNlOwotICAgIGJvb2xlYW4gbGFiZWxQcm92aWRlckZhaWxlZFRvTG9hZCA9IGZhbHNlOwotICAgIAotICAgIERlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gICAgewotICAgICAgdGhpcy5jb25maWd1cmF0aW9uRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgfQotICAgIAotICAgIE5vZGVFZGl0b3JQcm92aWRlciBsb29rdXBPckNyZWF0ZU5vZGVFZGl0b3JQcm92aWRlcigpCi0gICAgewotICAgICAgaWYgKG5vZGVFZGl0b3JQcm92aWRlciA9PSBudWxsICYmICFub2RlRWRpdG9yUHJvdmlkZXJGYWlsZWRUb0xvYWQpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgbm9kZUVkaXRvclByb3ZpZGVyID0gKE5vZGVFZGl0b3JQcm92aWRlciljb25maWd1cmF0aW9uRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKE5PREVfRURJVE9SX1BST1ZJREVSX0NMQVNTX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIAotICAgICAgICB7Ci0gICAgICAgICAgbm9kZUVkaXRvclByb3ZpZGVyRmFpbGVkVG9Mb2FkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfSAKLSAgICAgIHJldHVybiBub2RlRWRpdG9yUHJvdmlkZXI7Ci0gICAgfQotICAgIAotICAgIElMYWJlbFByb3ZpZGVyIGNyZWF0ZUxhYmVsUHJvdmlkZXIoKQotICAgIHsKLSAgICAgIGlmICghbGFiZWxQcm92aWRlckZhaWxlZFRvTG9hZCkKLSAgICAgIHsgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiAoSUxhYmVsUHJvdmlkZXIpY29uZmlndXJhdGlvbkVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihMQUJFTF9QUk9WSURFUl9DTEFTU19BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSAKLSAgICAgICAgewotICAgICAgICAgIGxhYmVsUHJvdmlkZXJGYWlsZWRUb0xvYWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZUZpbHRlciBnZXROb2RlRmlsdGVyKCkKLSAgICB7Ci0gICAgICBpZiAoIW5vZGVFZGl0b3JQcm92aWRlckZhaWxlZFRvTG9hZCkKLSAgICAgIHsgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIG5vZGVGaWx0ZXIgPSAoTm9kZUZpbHRlciljb25maWd1cmF0aW9uRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEZJTFRFUl9DTEFTU19BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSAKLSAgICAgICAgewotICAgICAgICAgIG5vZGVFZGl0b3JQcm92aWRlckZhaWxlZFRvTG9hZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBub2RlRmlsdGVyOwotICAgIH0KLSAgfQotCi0gIAotICBwcml2YXRlIEhhc2hNYXAgaW5pdE1hcCgpCi0gIHsKLSAgICBIYXNoTWFwIHRoZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZXh0ZW5zaW9ucyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmV4dGVuc2liaWxpdHlOb2RlQ3VzdG9taXphdGlvbnMiKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50ID0gZXh0ZW5zaW9uc1tpXTsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBjb25maWd1cmF0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoTkFNRVNQQUNFKTsKLSAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhlTWFwLnB1dChuYW1lc3BhY2UsIG5ldyBEZXNjcmlwdG9yKGNvbmZpZ3VyYXRpb25FbGVtZW50KSk7Ci0gICAgICB9ICAgICAKLSAgICB9ICAgIAotICAgIHJldHVybiB0aGVNYXA7Ci0gIH0KLQotICBwcml2YXRlIERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcihTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgbWFwID0gbnVsbDsKLSAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgeyAKLSAgICAgIGlmIChtYXAgPT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBtYXAgPSBpbml0TWFwKCk7Ci0gICAgICB9ICAKLSAgICAgIHJldHVybiAoRGVzY3JpcHRvciltYXAuZ2V0KG5hbWVzcGFjZSk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOyAgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBOb2RlRWRpdG9yUHJvdmlkZXIgZ2V0Tm9kZUVkaXRvclByb3ZpZGVyKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsgICAgIAotICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IobmFtZXNwYWNlKTsKLSAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotICAgIHsgIAotICAgICAgcmV0dXJuIGRlc2NyaXB0b3IubG9va3VwT3JDcmVhdGVOb2RlRWRpdG9yUHJvdmlkZXIoKTsgICAgICAgCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcihTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcihuYW1lc3BhY2UpOwotICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpCi0gICAgeyAgCi0gICAgICByZXR1cm4gZGVzY3JpcHRvci5jcmVhdGVMYWJlbFByb3ZpZGVyKCk7ICAgICAgIAotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBOb2RlRmlsdGVyIGdldE5vZGVGaWx0ZXIoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IobmFtZXNwYWNlKTsKLSAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotICAgIHsgIAotICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuZ2V0Tm9kZUZpbHRlcigpOyAgICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7ICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL05vZGVFZGl0b3JDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL05vZGVFZGl0b3JDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MDZhZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9Ob2RlRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGVFZGl0b3JDb25maWd1cmF0aW9uCi17ICAKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RZTEVfTk9ORSA9IDA7ICAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUWUxFX1RFWFQgPSAxOyAKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RZTEVfQ09NQk8gPSAyOwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVFlMRV9ESUFMT0cgPSA0OyAgIAotICAKLSAgcHVibGljIGFic3RyYWN0IGludCBnZXRTdHlsZSgpOwotICAKLSAgcHJpdmF0ZSBOb2RlIG5vZGU7Ci0gIHByaXZhdGUgTm9kZSBwYXJlbnROb2RlOwotCi0gIHB1YmxpYyBOb2RlIGdldE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIG5vZGU7Ci0gIH0KLSAgcHVibGljIHZvaWQgc2V0Tm9kZShOb2RlIG5vZGUpCi0gIHsKLSAgICB0aGlzLm5vZGUgPSBub2RlOwotICB9Ci0gIHB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIHBhcmVudE5vZGU7Ci0gIH0KLSAgcHVibGljIHZvaWQgc2V0UGFyZW50Tm9kZShOb2RlIHBhcmVudE5vZGUpCi0gIHsKLSAgICB0aGlzLnBhcmVudE5vZGUgPSBwYXJlbnROb2RlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL05vZGVFZGl0b3JQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9Ob2RlRWRpdG9yUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkMWM2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL05vZGVFZGl0b3JQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlRWRpdG9yUHJvdmlkZXIKLXsKLSAgcHVibGljIGFic3RyYWN0IE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIGdldE5vZGVFZGl0b3JDb25maWd1cmF0aW9uKFN0cmluZyBwYXJlbnROYW1lLCBTdHJpbmcgbm9kZU5hbWUpOyAKLSAgLy9wdWJsaWMgYWJzdHJhY3QgTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gZ2V0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24oTm9kZSBub2RlKTsgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTm9kZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9Ob2RlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYWJiYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9Ob2RlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b207Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgTm9kZUZpbHRlcgoteyAgCi0gIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZUNvbnRleHQoTm9kZSBwYXJlbnROb2RlLCBpbnQgbm9kZVR5cGUsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKQotICB7ICAKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vdXRpbC9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vdXRpbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTE4MGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUwotewotICBzdGF0aWMgCi0gIHsKLSAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKCJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLm1lc3NhZ2VzIiwgTWVzc2FnZXMuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgTWVzc2FnZXMoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9PUEVOX0lOX05FV19FRElUT1I7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQX1JFRjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQX0RFRklOSVRJT047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0dST1VQX1JFRjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfR1JPVVA7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fREVMRVRFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9DT01QTEVYX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FUVFJJQlVURTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fVVBEQVRFX0VMRU1FTlRfUkVGRVJFTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTk9fSVRFTVNfU0VMRUNURUQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9XSVRIX0RPVFM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fRURJVF9XSVRIX0RPVFM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQ0hBTkdFX1BBVFRFUk47Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0VOVU1FUkFUSU9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0lOU0VSVF9FTlVNRVJBVElPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfUEFUVEVSTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRU5VTUVSQVRJT05TOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0RFTEVURV9DT05TVFJBSU5UUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ERUxFVEVfUEFUVEVSTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ERUxFVEVfRU5VTUVSQVRJT047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fU0VUX0VOVU1FUkFUSU9OX1ZBTFVFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUEFUVEVSTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DSEFOR0VfTUFYSU1VTV9PQ0NVUlJFTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfSU5WQUxJRF9WQUxVRV9GT1JfTUFYSU1VTV9PQ0NVUlJFTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NIQU5HRV9NSU5JTVVNX09DQ1VSUkVOQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FQUElORk9fRUxFTUVOVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQVBQSU5GT19BVFRSSUJVVEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fREVMRVRFX0FQUElORk9fRUxFTUVOVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ERUxFVEVfQVBQSU5GT19BVFRSSUJVVEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQ0hBTkdFX0NPTlRFTlRfTU9ERUw7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fUkVOQU1FOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NIQU5HRV9FTlVNRVJBVElPTl9WQUxVRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX0lOVkFMSURfTkFNRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BTUU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9SRUZFUkVOQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fVVBEQVRFX01BWElNVU1fT0NDVVJSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9VUERBVEVfTUlOSU1VTV9PQ0NVUlJFTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUkVBRE9OTFk7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9JTkNMVVNJVkU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT0xMQVBTRV9XSElURVNQQUNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU1BFQ0lGSUNfQ09OU1RSQUlOVF9WQUxVRVM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9SRVNUUklDVF9WQUxVRVNfQlk7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTlVNRVJBVElPTlM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QQVRURVJOUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX01JTklNVU1fTEVOR1RIOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTUFYSU1VTV9MRU5HVEg7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT05TVFJBSU5UU19PTl9MRU5HVEhfT0Y7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT05TVFJBSU5UU19PTl9WQUxVRV9PRjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX01JTklNVU1fVkFMVUU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9NQVhJTVVNX1ZBTFVFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ09OVFJBSU5UU19PTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9CTE9DS0RFRkFVTFQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9GSU5BTERFRkFVTFQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQ09OU1RSQUlOX0xFTkdUSDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9VUERBVEVfQk9VTkRTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NPTExBUFNFX1dISVRFU1BBQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9CQVNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfSU5WQUxJRF9GSUxFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRVhURU5TSU9OUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRVhURU5TSU9OX0NPTVBPTkVOVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ERUxFVEVfRVhURU5TSU9OX0NPTVBPTkVOVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1VQOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRE9XTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VYVEVOU0lPTl9ERVRBSUxTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9ET0NVTUVOVEFUSU9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9FWFRFTlNJT05fQ09NUE9ORU5UUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VYVEVOU0lPTl9DQVRFR09SSUVTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQUREX1dJVEhfRE9UUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RFTEVURTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VESVQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVkFJTEFCTEVfQ09NUE9ORU5UU19UT19BREQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FRElUX0NBVEVHT1JZOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfSU5WQUxJRF9DQVRFR09SWTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX0ZJTEVfQ0FOTk9UX0JFX1BBUlNFRDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX1ZBTElEQVRFX1RIRV9GSUxFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0NIRU1BOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQUREX0NBVEVHT1JZOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfTkFNRV9BTFJFQURZX1VTRUQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQlJPV1NFX1dPUktTUEFDRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NFTEVDVF9YU0RfRklMRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RFU0NSSVBUSU9OX0NIT09TRV9YU0RfRklMRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9CUk9XU0VfQ0FUQUxPRzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQU5ZX0VMRU1FTlQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FOWV9BVFRSSUJVVEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fU0VUX0JBU0VfVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RPT0xUSVBfUkVOQU1FX1JFRkFDVE9SOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVkFMVUVfQ09MT047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JRDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JFRjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZJWEVEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfREVGQVVMVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZPUk07Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9VU0FHRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DSEFOR0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQ0xPU0VfU0NIRU1BX1BSRVZJRVdfUE9QVVA7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fTkFNRVNQQUNFX0lORk9STUFUSU9OX0NIQU5HRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FCU1RSQUNUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQkxPQ0s7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9GSU5BTDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NVQlNUSVRVVElPTl9HUk9VUDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX01JWEVEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfVkFMVUU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9GT1JNOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTklMTEFCTEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTEVNRU5URk9STURFRkFVTFQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVFRSSUJVVEVGT1JNREVGQVVMVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1dPUktTUEFDRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NBVEFMT0c7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9ERUxFVEVfQlVUVE9OOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vdXRpbC9YU0RDb21tb25VSVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi91dGlsL1hTRENvbW1vblVJVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUxMDg4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi91dGlsL1hTRENvbW1vblVJVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgTmFva2kgQWtpeWFtYSwgRnVqaXRzdSAtIEJ1ZyAyNDQ5MDEgLSBDYW5ub3Qgc2V0IHhzZDphbm5vdGF0aW9uIHRvIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c2Q6cmVkZWZpbmUgYnkgUHJvcGVydGllcyB2aWV3LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVjb3JhdGlvbk92ZXJsYXlJY29uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uSW1hZ2VPdmVybGF5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLkFic3RyYWN0U2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVudW1lcmF0aW9uRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREluY2x1ZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETm90YXRpb25EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFhQYXRoRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWFNEQ29tbW9uVUlVdGlscwotewotICBwdWJsaWMgWFNEQ29tbW9uVUlVdGlscygpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIEltYWdlIGdldFVwZGF0ZWRJbWFnZShYU0RDb25jcmV0ZUNvbXBvbmVudCBpbnB1dCwgSW1hZ2UgYmFzZUltYWdlLCBib29sZWFuIGlzUmVhZE9ubHkpCi0gIHsKLSAgICBYU0RBbm5vdGF0aW9uIHhzZEFubm90YXRpb24gPSBnZXRJbnB1dFhTREFubm90YXRpb24oaW5wdXQsIGZhbHNlKTsKLSAgICAKLSAgICBpZiAoeHNkQW5ub3RhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmICh4c2RBbm5vdGF0aW9uLmdldEFwcGxpY2F0aW9uSW5mb3JtYXRpb24oKS5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICAvLyBXaWxsIHVzZSB0aGUgY2xhc3MgbmFtZSBhcHBlbmRlZCBieSB0aGUgcmVhZCBvbmx5IHN0YXRlIGFzIHRoZSBuYW1lIG9mIHRoZSBpbWFnZS4KLSAgICAgICAgLy8gVGhlcmUgaXMgYSBkaXNhYmxlZCBhbmQgYW4gZW5hYmxlZCB2ZXJzaW9uIG9mIGVhY2ggYmFzZUltYWdlLCBzbyB3ZSBjYW4ndCBzaW1wbHkKLSAgICAgICAgLy8gdXNlIHRoZSBjb21wb25lbnQgbmFtZSBhcyB0aGUgbmFtZSBvZiB0aGUgaW1hZ2UKLSAgICAgICAgU3RyaW5nIGltYWdlTmFtZSA9IGlucHV0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgaXNSZWFkT25seTsKLSAgICAgICAgSW1hZ2UgbmV3SW1hZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoaW1hZ2VOYW1lKTsKLSAgICAgICAgaWYgKG5ld0ltYWdlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJbWFnZU92ZXJsYXlEZXNjcmlwdG9yIG92ciA9IG5ldyBJbWFnZU92ZXJsYXlEZXNjcmlwdG9yKGJhc2VJbWFnZSwgaXNSZWFkT25seSk7Ci0gICAgICAgICAgbmV3SW1hZ2UgPSBvdnIuZ2V0SW1hZ2UoKTsKLSAgICAgICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKS5wdXQoaW1hZ2VOYW1lLCBuZXdJbWFnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ld0ltYWdlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYmFzZUltYWdlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBYU0RBbm5vdGF0aW9uIGdldElucHV0WFNEQW5ub3RhdGlvbihYU0RDb25jcmV0ZUNvbXBvbmVudCBpbnB1dCwgYm9vbGVhbiBjcmVhdGVJZk5vdEV4aXN0KQotICB7Ci0gICAgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uID0gbnVsbDsKLSAgICBYU0RGYWN0b3J5IGZhY3RvcnkgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRTsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RDb21wID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICAgIHhzZEFubm90YXRpb24gPSB4c2RDb21wLmdldEFubm90YXRpb24oKTsKLSAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICB4c2RDb21wLnNldEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiB4c2RDb21wID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkQ29tcCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGlucHV0OwotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0ROb3RhdGlvbkRlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIFhTRE5vdGF0aW9uRGVjbGFyYXRpb24geHNkQ29tcCA9IChYU0ROb3RhdGlvbkRlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICAgIHhzZEFubm90YXRpb24gPSB4c2RDb21wLmdldEFubm90YXRpb24oKTsKLSAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICB4c2RDb21wLnNldEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEWFBhdGhEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRFhQYXRoRGVmaW5pdGlvbiB4c2RDb21wID0gKFhTRFhQYXRoRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cCB4c2RDb21wID0gKFhTRE1vZGVsR3JvdXApIGlucHV0OwotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RDb21wID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIHhzZEFubm90YXRpb24gPSB4c2RDb21wLmdldEFubm90YXRpb24oKTsKLSAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICB4c2RDb21wLnNldEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIHhzZENvbXAgPSAoWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgIHsKLSAgICAgIFhTRFdpbGRjYXJkIHhzZENvbXAgPSAoWFNEV2lsZGNhcmQpIGlucHV0OwotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgewotICAgICAgWFNEU2NoZW1hIHhzZENvbXAgPSAoWFNEU2NoZW1hKSBpbnB1dDsKLSAgICAgIExpc3QgbGlzdCA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbnMoKTsKLSAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSAoWFNEQW5ub3RhdGlvbikgbGlzdC5nZXQoMCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgICBpZiAoeHNkQ29tcC5nZXRDb250ZW50cygpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgeHNkQ29tcC5nZXRDb250ZW50cygpLmFkZCgwLCB4c2RBbm5vdGF0aW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB4c2RBbm5vdGF0aW9uOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREZhY2V0KQotICAgIHsKLSAgICAgIFhTREZhY2V0IHhzZENvbXAgPSAoWFNERmFjZXQpIGlucHV0OwotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB4c2RDb21wID0gKFhTRFR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIHhzZEFubm90YXRpb24gPSB4c2RDb21wLmdldEFubm90YXRpb24oKTsKLSAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICB4c2RDb21wLnNldEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNESW5jbHVkZSkKLSAgICB7Ci0gICAgICBYU0RJbmNsdWRlIHhzZENvbXAgPSAoWFNESW5jbHVkZSkgaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREltcG9ydCkKLSAgICB7Ci0gICAgICBYU0RJbXBvcnQgeHNkQ29tcCA9IChYU0RJbXBvcnQpIGlucHV0OwotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICB7Ci0gICAgICBYU0RSZWRlZmluZSB4c2RDb21wID0gKFhTRFJlZGVmaW5lKSBpbnB1dDsKLSAgICAgIExpc3QgY29udGVudHMgPSB4c2RDb21wLmdldENvbnRlbnRzKCk7IAotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50cy5zaXplKCk7IGkrKykKLSAgICAgIHsgCi0gICAgICAgIE9iamVjdCBjb250ZW50ID0gY29udGVudHMuZ2V0KGkpOwotICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTREFubm90YXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RBbm5vdGF0aW9uID0gKFhTREFubm90YXRpb24pIGNvbnRlbnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICBjb250ZW50cy5hZGQoMCwgeHNkQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4geHNkQW5ub3RhdGlvbjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RBbm5vdGF0aW9uKQotICAgIHsKLSAgICAgIHhzZEFubm90YXRpb24gPSAoWFNEQW5ub3RhdGlvbikgaW5wdXQ7Ci0gICAgfQotCi0gICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QpCi0gICAgewotICAgICAgZm9ybWF0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICB9Ci0KLSAgICByZXR1cm4geHNkQW5ub3RhdGlvbjsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgZm9ybWF0QW5ub3RhdGlvbihYU0RBbm5vdGF0aW9uIGFubm90YXRpb24pCi0gIHsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBhbm5vdGF0aW9uLmdldEVsZW1lbnQoKTsKLSAgICBmb3JtYXRDaGlsZChlbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBmb3JtYXRDaGlsZChOb2RlIGNoaWxkKQotICB7Ci0gICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgSURPTU1vZGVsIG1vZGVsID0gKChJRE9NTm9kZSkgY2hpbGQpLmdldE1vZGVsKCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gbWFrZSBhIGJpZyBtb2RlbCBjaGFuZ2UKLSAgICAgICAgbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLSAgICAgICAgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotICAgICAgICBmb3JtYXRQcm9jZXNzb3IuZm9ybWF0Tm9kZShjaGlsZCk7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICBtb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVVbmlxdWVFbGVtZW50TmFtZShTdHJpbmcgcHJlZml4LCBMaXN0IGVsZW1lbnRzKQotICB7Ci0gICAgQXJyYXlMaXN0IHVzZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgdXNlZE5hbWVzLmFkZChnZXREaXNwbGF5TmFtZSgoWFNETmFtZWRDb21wb25lbnQpIGkubmV4dCgpKSk7Ci0gICAgfQotCi0gICAgaW50IGkgPSAxOwotICAgIFN0cmluZyB0ZXN0TmFtZSA9IHByZWZpeDsKLSAgICB3aGlsZSAodXNlZE5hbWVzLmNvbnRhaW5zKHRlc3ROYW1lKSkKLSAgICB7Ci0gICAgICB0ZXN0TmFtZSA9IHByZWZpeCArIGkrKzsKLSAgICB9Ci0gICAgcmV0dXJuIHRlc3ROYW1lOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVVbmlxdWVFbnVtZXJhdGlvblZhbHVlKFN0cmluZyBwcmVmaXgsIExpc3QgZWxlbWVudHMpCi0gIHsKLSAgICBBcnJheUxpc3QgdXNlZE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICB1c2VkTmFtZXMuYWRkKCgoWFNERW51bWVyYXRpb25GYWNldCkgaS5uZXh0KCkpLmdldExleGljYWxWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBpbnQgaSA9IDE7Ci0gICAgU3RyaW5nIHRlc3ROYW1lID0gcHJlZml4OwotICAgIHdoaWxlICh1c2VkTmFtZXMuY29udGFpbnModGVzdE5hbWUpKQotICAgIHsKLSAgICAgIHRlc3ROYW1lID0gcHJlZml4ICsgaSsrOwotICAgIH0KLSAgICByZXR1cm4gdGVzdE5hbWU7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaXNwbGF5TmFtZShYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWVGcm9tWFNEVHlwZSgoWFNEVHlwZURlZmluaXRpb24pIGNvbXBvbmVudCk7Ci0KLSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNERmVhdHVyZSkKLSAgICB7Ci0gICAgICBYU0RGZWF0dXJlIGZlYXR1cmUgPSAoWFNERmVhdHVyZSkgY29tcG9uZW50OwotICAgICAgaWYgKGZlYXR1cmUuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgIHJldHVybiBmZWF0dXJlLmdldE5hbWUoKTsKLSAgICAgIGVsc2UgaWYgKGZlYXR1cmUuZ2V0UmVzb2x2ZWRGZWF0dXJlKCkgIT0gbnVsbCAmJiBmZWF0dXJlLmdldFJlc29sdmVkRmVhdHVyZSgpLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICByZXR1cm4gZmVhdHVyZS5nZXRSZXNvbHZlZEZlYXR1cmUoKS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNvbXBvbmVudC5nZXROYW1lKCk7Ci0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERpc3BsYXlOYW1lRnJvbVhTRFR5cGUoWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIHJldHVybiBnZXREaXNwbGF5TmFtZUZyb21YU0RUeXBlKHR5cGUsIHRydWUpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWVGcm9tWFNEVHlwZShYU0RUeXBlRGVmaW5pdGlvbiB0eXBlLCBib29sZWFuIHJldHVyblByaW1pdGl2ZVBhcmVudHMpCi0gIHsKLSAgICBpZiAodHlwZSA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBpZiAodHlwZS5nZXROYW1lKCkgPT0gbnVsbCB8fCB0eXBlLmdldE5hbWUoKS5sZW5ndGgoKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChyZXR1cm5QcmltaXRpdmVQYXJlbnRzICYmIGlzUHJpbWl0aXZlVHlwZSh0eXBlKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGdldERpc3BsYXlOYW1lRnJvbVhTRFR5cGUodHlwZS5nZXRCYXNlVHlwZSgpKTsKLSAgICAgIH0KLQotICAgICAgRU9iamVjdCBjb250YWluZXIgPSB0eXBlLmVDb250YWluZXIoKTsKLQotICAgICAgd2hpbGUgKGNvbnRhaW5lciAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQgJiYgKChYU0ROYW1lZENvbXBvbmVudCkgY29udGFpbmVyKS5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiAoKFhTRE5hbWVkQ29tcG9uZW50KSBjb250YWluZXIpLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIuZUNvbnRhaW5lcigpOwotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiB0eXBlLmdldE5hbWUoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ByaW1pdGl2ZVR5cGUoWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGUgPSBudWxsOwotICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgewotICAgICAgYmFzZVR5cGUgPSB0eXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiBvcmlnVHlwZSA9IGJhc2VUeXBlOyAvLyBLQzogYWx0aG91Z2ggaW52YWxpZCwgd2UgbmVlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGN5Y2xlcyBhbmQgdG8gYXZvaWQgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5maW5pdGUgbG9vcAotICAgICAgd2hpbGUgKGJhc2VUeXBlICE9IG51bGwgJiYgIVhTRENvbnN0YW50cy5pc0FueVNpbXBsZVR5cGUoYmFzZVR5cGUpICYmICFYU0RDb25zdGFudHMuaXNBbnlUeXBlKGJhc2VUeXBlKSAmJiBvcmlnVHlwZSAhPSBiYXNlVHlwZSkKLSAgICAgIHsKLSAgICAgICAgdHlwZSA9IGJhc2VUeXBlOwotICAgICAgICBiYXNlVHlwZSA9IHR5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICAgIH0KLSAgICAgIGJhc2VUeXBlID0gdHlwZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMS5lcXVhbHMoYmFzZVR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gZ2V0QW5vbnltb3VzU2ltcGxlVHlwZShYU0RGZWF0dXJlIGlucHV0LCBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGFub255bW91c1NpbXBsZVR5cGUgPSBudWxsOwotICAgIFhTRFR5cGVEZWZpbml0aW9uIGxvY2FsVHlwZSA9IG51bGw7Ci0KLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgbG9jYWxUeXBlID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGlucHV0KS5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIGxvY2FsVHlwZSA9ICgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGlucHV0KS5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpOwotICAgIH0KLQotICAgIGlmIChsb2NhbFR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBsb2NhbFR5cGU7Ci0gICAgfQotICAgIHJldHVybiBhbm9ueW1vdXNTaW1wbGVUeXBlOwotICB9Ci0KLSAgLy8gYnVnMjQ2MDM2IC0gY2hlY2sgZm9yIGN5Y2xpYyBncm91cHMuICBXZSBzaG91bGQgcmVmYWN0b3Igb3V0IHRoaXMgc3RhdGljIGNsYXNzLgotICBwcml2YXRlIHN0YXRpYyBTdGFjayB2aXNpdGVkR3JvdXBzID0gbmV3IFN0YWNrKCk7Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRWaXNpdGVkR3JvdXBzU3RhY2soKQotICB7Ci0gICAgdmlzaXRlZEdyb3Vwcy5jbGVhcigpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldENoaWxkRWxlbWVudHMoWFNETW9kZWxHcm91cCBncm91cCkKLSAgewotICAgIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgdmlzaXRlZEdyb3Vwcy5wdXNoKGdyb3VwKTsKLSAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgcmV0dXJuIGNoaWxkcmVuOwotICAgIAotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdyb3VwLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFBhcnRpY2xlIG5leHQgPSAoWFNEUGFydGljbGUpIGkubmV4dCgpOwotICAgICAgaWYgKG5leHQuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWFNERmVhdHVyZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoaWxkcmVuLmNvbnRhaW5zKG5leHQuZ2V0Q29udGVudCgpKSkgYnJlYWs7Ci0gICAgICAgIGNoaWxkcmVuLmFkZChuZXh0LmdldENvbnRlbnQoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChuZXh0LmdldFRlcm0oKSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICB7Ci0gICAgICAgIGlmICghdmlzaXRlZEdyb3Vwcy5jb250YWlucyhncm91cCkpCi0gICAgICAgIGNoaWxkcmVuLmFkZEFsbChnZXRDaGlsZEVsZW1lbnRzKChYU0RNb2RlbEdyb3VwKSBuZXh0LmdldFRlcm0oKSkpOwotICAgICAgfQotICAgIH0KLSAgICB2aXNpdGVkR3JvdXBzLnBvcCgpOwotICAgIHJldHVybiBjaGlsZHJlbjsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxBdHRyaWJ1dGVzKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZSkKLSAgewotICAgIExpc3QgYXR0cmlidXRlcyA9IGdldENoaWxkRWxlbWVudHMoeHNkQ29tcGxleFR5cGUpOwotICAgIGF0dHJpYnV0ZXMuYWRkQWxsKGdldENoaWxkQXR0cmlidXRlcyh4c2RDb21wbGV4VHlwZSkpOwotCi0gICAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsQXR0cmlidXRlcyhYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgewotICAgIExpc3QgYXR0cmlidXRlcyA9IGdldENoaWxkRWxlbWVudHMoeHNkTW9kZWxHcm91cERlZmluaXRpb24pOwotCi0gICAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRJbmhlcml0ZWRBdHRyaWJ1dGVzKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCkKLSAgewotICAgIExpc3QgYXR0cnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gcGFyZW50ID0gY3QuZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiAmJiBjdC5pc1NldERlcml2YXRpb25NZXRob2QoKSkKLSAgICB7Ci0gICAgICBhdHRycy5hZGRBbGwoZ2V0QWxsQXR0cmlidXRlcygoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBwYXJlbnQpKTsKLSAgICAgIGlmICghIGN0LmlzQ2lyY3VsYXIoKSkgYXR0cnMuYWRkQWxsKGdldEluaGVyaXRlZEF0dHJpYnV0ZXMoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgcGFyZW50KSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGF0dHJzOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldENoaWxkRWxlbWVudHMoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0KQotICB7Ci0gICAgcmV0dXJuIGdldENoaWxkRWxlbWVudHMoZ2V0TW9kZWxHcm91cChjdCkpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q2hpbGRFbGVtZW50cyhYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgewotICAgIHJldHVybiBnZXRDaGlsZEVsZW1lbnRzKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldE1vZGVsR3JvdXAoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgWFNETW9kZWxHcm91cCBnZXRNb2RlbEdyb3VwKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjVHlwZSkKLSAgewotICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gY1R5cGUuZ2V0Q29tcGxleFR5cGUoKTsKLQotICAgIGlmIChwYXJ0aWNsZSA9PSBudWxsIHx8IHBhcnRpY2xlLmVDb250YWluZXIoKSAhPSBjVHlwZSkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgT2JqZWN0IHBhcnRpY2xlQ29udGVudCA9IHBhcnRpY2xlLmdldENvbnRlbnQoKTsKLSAgICBYU0RNb2RlbEdyb3VwIGdyb3VwID0gbnVsbDsKLQotICAgIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgIGdyb3VwID0gKChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgcGFydGljbGVDb250ZW50KS5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCkuZ2V0TW9kZWxHcm91cCgpOwotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICBncm91cCA9IChYU0RNb2RlbEdyb3VwKSBwYXJ0aWNsZUNvbnRlbnQ7Ci0KLSAgICBpZiAoZ3JvdXAgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgaWYgKGdyb3VwLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpIHx8IGdyb3VwLmVSZXNvdXJjZSgpICE9IGNUeXBlLmVSZXNvdXJjZSgpKQotICAgIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCBjb250ZW50ID0gY1R5cGUuZ2V0Q29udGVudCgpOwotICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgICAgZ3JvdXAgPSAoWFNETW9kZWxHcm91cCkgKChYU0RQYXJ0aWNsZSkgY29udGVudCkuZ2V0Q29udGVudCgpOwotICAgIH0KLQotICAgIHJldHVybiBncm91cDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDaGlsZEF0dHJpYnV0ZXMoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0KQotICB7Ci0gICAgRUxpc3QgYXR0ckNvbnRlbnRzID0gY3QuZ2V0QXR0cmlidXRlQ29udGVudHMoKTsKLSAgICBMaXN0IGF0dHJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0ckNvbnRlbnRzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIE9iamVjdCBuZXh0ID0gYXR0ckNvbnRlbnRzLmdldChpKTsKLQotICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIGF0dHJzLmFkZCgoKFhTREF0dHJpYnV0ZVVzZSkgbmV4dCkuZ2V0Q29udGVudCgpLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChuZXh0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICAvL1hTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyR3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBuZXh0OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYXR0cnM7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlV2l0aEVycm9yT3ZlcmxheShYU0RDb25jcmV0ZUNvbXBvbmVudCBpbnB1dCwgSW1hZ2UgYmFzZUltYWdlLCBib29sZWFuIGlzUmVhZE9ubHkpCi0gIHsKLSAgICBJbWFnZSBleHRlbnNpb25JbWFnZSA9IGdldFVwZGF0ZWRJbWFnZShpbnB1dCwgYmFzZUltYWdlLCBpc1JlYWRPbmx5KTsKLSAgICBJbWFnZURlc2NyaXB0b3IgZXJyb3JPdmVybGF5ID0gWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvb3ZyMTYvZXJyb3Jfb3ZyLmdpZiIpOyAgLy8kTk9OLU5MUy0xJAotICAgIGlmIChiYXNlSW1hZ2UgPT0gZXh0ZW5zaW9uSW1hZ2UpCi0gICAgewotICAgICAgU3RyaW5nIGltYWdlTmFtZSA9IGlucHV0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl9lcnJvcl8iICsgaXNSZWFkT25seTsKLSAgICAgIEltYWdlIG5ld0ltYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGltYWdlTmFtZSk7Ci0gICAgICBpZiAobmV3SW1hZ2UgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgRGVjb3JhdGlvbk92ZXJsYXlJY29uIG92ciA9IG5ldyBEZWNvcmF0aW9uT3ZlcmxheUljb24oYmFzZUltYWdlLCBlcnJvck92ZXJsYXksIElEZWNvcmF0aW9uLlRPUF9MRUZUKTsKLSAgICAgICAgbmV3SW1hZ2UgPSBvdnIuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGltYWdlTmFtZSwgbmV3SW1hZ2UpOwotICAgICAgfQotICAgICAgcmV0dXJuIG5ld0ltYWdlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nIGltYWdlTmFtZSA9IGlucHV0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl9leHRlbnNpb25fZXJyb3JfIiArIGlzUmVhZE9ubHk7Ci0gICAgICBJbWFnZSBuZXdJbWFnZSA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChpbWFnZU5hbWUpOwotICAgICAgaWYgKG5ld0ltYWdlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIERlY29yYXRpb25PdmVybGF5SWNvbiBvdnIgPSBuZXcgRGVjb3JhdGlvbk92ZXJsYXlJY29uKGV4dGVuc2lvbkltYWdlLCBlcnJvck92ZXJsYXksIElEZWNvcmF0aW9uLlRPUF9MRUZUKTsKLSAgICAgICAgbmV3SW1hZ2UgPSBvdnIuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGltYWdlTmFtZSwgbmV3SW1hZ2UpOwotICAgICAgfQotICAgICAgcmV0dXJuIG5ld0ltYWdlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgQ0NvbWJvIGdldE5ld1Byb3BlcnRpZXNDb21ibyhDb21wb3NpdGUgY29tcG9zaXRlLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5LAotICAgICAgQWJzdHJhY3RTZWN0aW9uIGxpc3RlbmVyLCBTdHJpbmdbXSBpdGVtcywgU3RyaW5nIGhlbHBJRCkKLSAgewotICAgIENDb21ibyBjb21ibyA9IHdpZGdldEZhY3RvcnkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgY29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotICAgIGNvbWJvLnNldEl0ZW1zKGl0ZW1zKTsKLSAgICBjb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7ICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tYm8sIGhlbHBJRCk7Ci0gICAgcmV0dXJuIGNvbWJvOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIENMYWJlbCBnZXROZXdQcm9wZXJ0aWVzTGFiZWwoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSwKLSAgICAgIFN0cmluZyBsYWJlbFRleHQpCi0gIHsKLSAgICAvLyBDcmVhdGUgbGFiZWwKLSAgICBDTGFiZWwgbGFiZWw7ICAgIAotICAgIGxhYmVsID0gd2lkZ2V0RmFjdG9yeS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBsYWJlbFRleHQpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIAotICAgIHJldHVybiBsYWJlbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vdXRpbC9YU0REaXJlY3RpdmVzTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vdXRpbC9YU0REaXJlY3RpdmVzTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWExZDhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvWFNERGlyZWN0aXZlc01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudGV4dC5YU0RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREluY2x1ZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBlcmZvcm1zIGNsZWFudXAvcmVtb3ZhbCBvZiB1bnVzZWQgWFNEIGltcG9ydHMgYW5kIGluY2x1ZGVzIGZyb20gWE1MIFNjaGVtYXMKLSAqIGFuZCB4bWxucyBlbnRyaWVzIGluIHRoZSBuYW1lc3BhY2UgdGFibGUKLSAqLwotcHVibGljIGNsYXNzIFhTRERpcmVjdGl2ZXNNYW5hZ2VyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zIjsgLy8kTk9OLU5MUy0xJAotICAvLyBMaXN0IG9mIGFsbCB0aGUgdW51c2VkIGRpcmVjdGl2ZXMuICBUaGVzZSB3aWxsIGJlIHJlbW92ZWQKLSAgcHJvdGVjdGVkIExpc3QgdW51c2VkRGlyZWN0aXZlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgLy8gTGlzdCBvZiBhbGwgdGhlIGluY2x1ZGVkIFhTRFNjaGVtYSdzCi0gIHByb3RlY3RlZCBMaXN0IHVzZWRJbmNsdWRlU2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgLy8gTGlzdCBvZiBhbGwgdGhlIFhTREluY2x1ZGUncyB0aGF0IGFyZSBpbmRpcmVjdGx5IHVzZWQKLSAgcHJvdGVjdGVkIExpc3QgdXNlZEluZGlyZWN0SW5jbHVkZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIC8vIExpc3Qgb2YgdGhlIFhTREluY2x1ZGUncyB0aGF0IGFyZSBkaXJlY3RseSB1c2VkCi0gIHByb3RlY3RlZCBMaXN0IHVzZWREaXJlY3RJbmNsdWRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgLy8gVXNlZCB0byB0cmFjayB0aGUgaW5jbHVkZWQgc2NoZW1hcyB0aGF0IHdlcmUgYW5hbHl6ZWQgdG8gYXZvaWQgY2lyY3VsYXIgbG9vcAotICBwcm90ZWN0ZWQgTGlzdCBhbmFseXplZEluY2x1ZGVTY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAvLyBMaXN0IG9mIGFsbCB0aGUgaW1wb3J0ZWQgdXNlZCBzY2hlbWFzCi0gIHByb3RlY3RlZCBMaXN0IHVzZWRTY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAvLyBMaXN0IG9mIGFsbCB0aGUgaW5kaXJlY3RseSB1c2VkIGluY2x1ZGVzICAKLSAgcHJvdGVjdGVkIE1hcCB1c2VkSW5kaXJlY3RJbmNsdWRlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gIC8vIEtlZXAgdHJhY2sgb2YgYWxsIHRoZSB1bnVzZWQgcHJlZml4ZXMKLSAgcHJvdGVjdGVkIFNldCB1bnVzZWRQcmVmaXhlczsKLSAgLy8gS2VlcCB0cmFjayBvZiBhbGwgdGhlIHVzZWQgcHJlZml4ZXMKLSAgcHJvdGVjdGVkIFNldCB1c2VkUHJlZml4ZXM7Ci0gIC8vIE1hcCBvZiBlYWNoIHNjaGVtYSdzIHVudXNlZCBwcmVmaXhlcwotICBwcm90ZWN0ZWQgTWFwIHNjaGVtYVRvUHJlZml4TWFwOwotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVVbnVzZWRYU0RJbXBvcnRzKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICAvLyBPbmx5IGRvIHRoZSByZW1vdmFsIGlmIHRoZSBwcmVmZXJlbmNlIGlzIHR1cm5lZCBvbgotICAgIGlmIChYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlbW92ZUltcG9ydFNldHRpbmcoKSkKLSAgICB7Ci0gICAgICBYU0REaXJlY3RpdmVzTWFuYWdlciBtZ3IgPSBuZXcgWFNERGlyZWN0aXZlc01hbmFnZXIoKTsKLSAgICAgIG1nci5wZXJmb3JtUmVtb3ZhbChzY2hlbWEpOwotICAgICAgbWdyLmNsZWFudXAoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBNYWluIG1ldGhvZCB0byBkbyB0aGUgY2xlYW51cAotICAgKiBAcGFyYW0gc2NoZW1hCi0gICAqLwotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVtb3ZhbChYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgLy8gQ29tcHV0ZSB1bnVzZWQgaW1wb3J0cyBhbmQgdW51c2VkIHByZWZpeGVzCi0gICAgY29tcHV0ZVVudXNlZEltcG9ydHMoc2NoZW1hKTsKLSAgICAvLyBSZW1vdmUgdGhlIGltcG9ydHMKLSAgICByZW1vdmVVbnVzZWRJbXBvcnRzKCk7Ci0gICAgLy8gUmVtb3ZlIHRoZSBwcmVmaXhlcwotICAgIHJlbW92ZVVudXNlZFByZWZpeGVzKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDbGllbnRzIGNhbiBtYW51YWxseSBjbGVhbiB0aGUgbGlzdHMKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFudXAoKQotICB7Ci0gICAgY2xlYXJNYXBzKCk7Ci0gIH0KLQotICAvKioKLSAgICogQWZ0ZXIgcGVyZm9ybWluZyB0aGUgY2xlYW51cCwgcmV0dXJuIHRoZSBsaXN0IG9mIHVudXNlZCBYU0QgZGlyZWN0aXZlcwotICAgKiAgCi0gICAqIEByZXR1cm4gbGlzdCBvZiB1bnVzZWQgWFNEIGRpcmVjdGl2ZXMKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFVudXNlZFhTRERpcmVjdGl2ZXMoKQotICB7Ci0gICAgcmV0dXJuIHVudXNlZERpcmVjdGl2ZXM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZnRlciBwZXJmb3JtaW5nIHRoZSBjbGVhbnVwLCByZXR1cm4gdGhlIG1hcCBvZiBlYWNoIHNjaGVtYXMgdW51c2VkIHByZWZpeGVzCi0gICAqIAotICAgKiBAcmV0dXJuIG1hcCBvZiBlYWNoIHNjaGVtYXMgdW51c2VkIHByZWZpeGVzCi0gICAqLwotICBwdWJsaWMgTWFwIGdldFNjaGVtYVRvUHJlZml4TWFwKCkKLSAgewotICAgIHJldHVybiBzY2hlbWFUb1ByZWZpeE1hcDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgdW51c2VkIHByZWZpeGVzIGZyb20gdGhlIFhNTCBuYW1lc3BhY2UgdGFibGUKLSAgICogCi0gICAqIEByZXR1cm4gc2V0IG9mIHVudXNlZCBwcmVmaXhlcwotICAgKi8KLSAgcHVibGljIFNldCBnZXRVbnVzZWRQcmVmaXhlcygpCi0gIHsKLSAgICByZXR1cm4gdW51c2VkUHJlZml4ZXM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2V0IG9mIHVzZWQgcHJlZml4ZXMgZnJvbSB0aGUgWE1MIG5hbWVzcGFjZSB0YWJsZQotICAgKiAKLSAgICogQHJldHVybiBzZXQgb2YgdXNlZCBwcmVmaXhlcwotICAgKi8KLSAgcHVibGljIFNldCBnZXRVc2VkUHJlZml4ZXMoKQotICB7Ci0gICAgcmV0dXJuIHVzZWRQcmVmaXhlczsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIGFueSBjbGVhbnVwIGFmdGVyIGNvbXB1dGluZyBhbmQgcmVtb3ZpbmcgdGhlIHVudXNlZCBpbXBvcnRzLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY2xlYXJNYXBzKCkKLSAgewotICAgIGlmIChzY2hlbWFUb1ByZWZpeE1hcCAhPSBudWxsKQotICAgIHsKLSAgICAgIHNjaGVtYVRvUHJlZml4TWFwLmNsZWFyKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSB0aGUgbGlzdCBvZiBhbGwgdW51c2VkIGltcG9ydHMuICBJbXBvcnRzIGlzIHVzZWQgaW4gdGhlIGdlbmVyaWMgdGVybSBoZXJlLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVW51c2VkSW1wb3J0cygpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyID0gdW51c2VkRGlyZWN0aXZlcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWFEaXJlY3RpdmUgeHNkRGlyZWN0aXZlID0gKFhTRFNjaGVtYURpcmVjdGl2ZSkgaXRlci5uZXh0KCk7Ci0gICAgICByZW1vdmVYU0REaXJlY3RpdmUoeHNkRGlyZWN0aXZlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlcyB0aGUgZGlyZWN0aXZlIGZyb20gdGhlIG1vZGVsCi0gICAqIEBwYXJhbSB4c2RJbXBvcnQKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZVhTRERpcmVjdGl2ZShYU0RTY2hlbWFEaXJlY3RpdmUgeHNkSW1wb3J0KQotICB7Ci0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IHhzZEltcG9ydC5nZXRTY2hlbWEoKTsKLSAgICAKLSAgICBFbGVtZW50IGVsZW1lbnQgPSB4c2RJbXBvcnQuZ2V0RWxlbWVudCgpOwotICAgIAotICAgIERvY3VtZW50IGRvYyA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCi0gICAgaWYgKGRvYyBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgKChJRE9NTm9kZSlkb2MpLmdldE1vZGVsKCkuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKCFyZW1vdmVUZXh0Tm9kZXNCZXR3ZWVuTmV4dEVsZW1lbnQoZWxlbWVudCkpCi0gICAgICB7Ci0gICAgICAgIHJlbW92ZVRleHROb2RlQmV0d2VlblByZXZpb3VzRWxlbWVudChlbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKGVsZW1lbnQpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgaWYgKGRvYyBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgewotICAgICAgICAoKElET01Ob2RlKWRvYykuZ2V0TW9kZWwoKS5jaGFuZ2VkTW9kZWwoKTsKLSAgICAgIH0KLSAgICAgIHNjaGVtYS51cGRhdGUodHJ1ZSk7Ci0gICAgfQotCi0gIH0KLQotICAvKioKLSAgICogVGhpcyBjb21wdXRlcyB0aGUgbGlzdCBvZiB1bnVzZWQgaW1wb3J0cyBmb3IgYSBzY2hlbWEKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVVudXNlZEltcG9ydHMoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHVudXNlZERpcmVjdGl2ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgdXNlZFNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgdXNlZFByZWZpeGVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICBzY2hlbWFUb1ByZWZpeE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gU3RlcCBPbmUuICBGaW5kIHVudXNlZCBpbXBvcnRzIHVzaW5nIGNyb3NzIHJlZmVyZW5jZXIKLSAgICAgIE1hcCB4c2ROYW1lZENvbXBvbmVudFVzYWdlID0gVG9wTGV2ZWxDb21wb25lbnRDcm9zc1JlZmVyZW5jZXIuZmluZChzY2hlbWEpOwotICAgICAgCi0gICAgICBkb0Nyb3NzUmVmZXJlbmNlcihzY2hlbWEsIHVzZWRTY2hlbWFzLCB4c2ROYW1lZENvbXBvbmVudFVzYWdlKTsKLQotICAgICAgLy8gU3RlcCBUd28uICBVcGRhdGUgdGhlIHVudXNlZEltcG9ydCBsaXN0IGdpdmVuIHRoZSBsaXN0IG9mIHVzZWQgc2NoZW1hcyBvYnRhaW5lZCBmcm9tIGNyb3NzIHJlZmVyZW5jaW5nCi0gICAgICBhZGRUb1VudXNlZEltcG9ydHMoc2NoZW1hLCB1c2VkU2NoZW1hcyk7Ci0gICAgICAKLSAgICAgIC8vIFN0ZXAgVGhyZWUuICBDb21wdXRlIHVudXNlZCBwcmVmaXhlcyB0byBiZSByZW1vdmVkCi0gICAgICBjb21wdXRlVW51c2VkUHJlZml4ZXMoc2NoZW1hKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHVudXNlZERpcmVjdGl2ZXMuY2xlYXIoKTsKLSAgICAgIHNjaGVtYVRvUHJlZml4TWFwLmNsZWFyKCk7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogQ29tcHV0ZXMgdGhlIGxpc3Qgb2YgdW51c2VkIHByZWZpeGVzIGZyb20gdGhlIFhNTCBuYW1lc3BhY2UgdGFibGUgZ2l2ZW4gYSBzY2hlbWEKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVVudXNlZFByZWZpeGVzKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBNYXAgcHJlZml4TWFwID0gc2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICBTZXQgZGVmaW5lZFByZWZpeGVzID0gcHJlZml4TWFwLmtleVNldCgpOwotICAgIFNldCBhY3R1YWxTZXQgPSBuZXcgSGFzaFNldCgpOwotICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gc2NoZW1hLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgSXRlcmF0b3IgaXRlciA9IGRlZmluZWRQcmVmaXhlcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJlZiA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAocHJlZiA9PSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oWE1MTlMpICE9IG51bGwpCi0gICAgICAgICAgIGFjdHVhbFNldC5hZGQobnVsbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShYTUxOUyArICI6IiArIHByZWYpICE9IG51bGwpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBhY3R1YWxTZXQuYWRkKHByZWYpOwotICAgICAgfQotICAgIH0KLQotICAgIHVudXNlZFByZWZpeGVzID0gbmV3IEhhc2hTZXQoYWN0dWFsU2V0KTsKLSAgICAKLSAgICB1c2VkUHJlZml4ZXMuYWRkKHNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCgpKTsKLSAgICAKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBzY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgIAotICAgIE5vZGVMaXN0IGNoaWxkRWxlbWVudHMgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgbGVuZ3RoID0gY2hpbGRFbGVtZW50cy5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgbm9kZSA9IGNoaWxkRWxlbWVudHMuaXRlbShpKTsKLSAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2VET01FbGVtZW50KChFbGVtZW50KW5vZGUsIHNjaGVtYSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIGNvbXB1dGUgdGhlIHVzZWQgcHJlZml4ZXMKLSAgICBjb21wdXRlVXNlZFhTRFByZWZpeGVzKHNjaGVtYSk7Ci0gICAgCi0gICAgLy8gcmVtb3ZlIHRoZSB1c2VkIHByZWZpeGVzIGZyb20gdGhlIHVudXNlZCB0byBnZXQgdGhlIGxpc3Qgb2YgdW51c2VkIHByZWZpeGVzCi0gICAgdW51c2VkUHJlZml4ZXMucmVtb3ZlQWxsKHVzZWRQcmVmaXhlcyk7Ci0gICAgCi0gICAgLy8gcGVyZm9ybSBhZGRpdGlvbmFsIHByb2Nlc3MgZnJvbSBleHRlbmRlcnMKLSAgICBkb0FkZGl0aW9uYWxQcm9jZXNzaW5nKHNjaGVtYSk7Ci0gICAgCi0gICAgc2NoZW1hVG9QcmVmaXhNYXAucHV0KHNjaGVtYSwgdW51c2VkUHJlZml4ZXMpOwotICB9Ci0gIAotICAvKioKLSAgICogUmVtb3ZlIHVudXNlZCBwcmVmaXhlcyBmcm9tIHRoZSBYTUwgbmFtZXNwYWNlIHRhYmxlCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVVbnVzZWRQcmVmaXhlcygpCi0gIHsKLSAgICBTZXQgc2NoZW1hU2V0ID0gc2NoZW1hVG9QcmVmaXhNYXAua2V5U2V0KCk7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHNjaGVtYVNldC5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSlpdGVyLm5leHQoKTsKLSAgICAgIE1hcCBwcmVmaXhNYXAgPSBzY2hlbWEuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotICAgICAgU2V0IHByZWZpeGVzVG9SZW1vdmUgPSAoU2V0KXNjaGVtYVRvUHJlZml4TWFwLmdldChzY2hlbWEpOwotICAgICAgSXRlcmF0b3IgaXRlcjIgPSBwcmVmaXhlc1RvUmVtb3ZlLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRlcjIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBTdHJpbmcgc3RyaW5nID0gKFN0cmluZylpdGVyMi5uZXh0KCk7Ci0gICAgICAgIGlmIChwcmVmaXhNYXAuY29udGFpbnNLZXkoc3RyaW5nKSkKLSAgICAgICAgICBwcmVmaXhNYXAucmVtb3ZlKHN0cmluZyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogRXh0ZW5kZXJzIGNhbiBjdXN0b21pemUKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZG9BZGRpdGlvbmFsUHJvY2Vzc2luZyhYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgLy8gRG8gbm90aGluZyBmb3IgWFNECi0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGNvbXB1dGVVc2VkWFNEUHJlZml4ZXMoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIE1hcCBwcmVmaXhNYXAgPSBzY2hlbWEuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotICAgIFNldCBkZWZpbmVkUHJlZml4ZXMgPSBwcmVmaXhNYXAua2V5U2V0KCk7Ci0gICAgCi0gICAgYm9vbGVhbiBmb3VuZEVudHJ5Rm9yVGFyZ2V0TmFtZXNwYWNlID0gZmFsc2U7Ci0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB1c2VkUHJlZml4ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBwcmVmaXhNYXAuZ2V0KGtleSk7Ci0gICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwgJiYgdmFsdWUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm91bmRFbnRyeUZvclRhcmdldE5hbWVzcGFjZSA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZS5lcXVhbHModmFsdWUpKQotICAgICAgICB7Ci0gICAgICAgICAgZm91bmRFbnRyeUZvclRhcmdldE5hbWVzcGFjZSA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKCFmb3VuZEVudHJ5Rm9yVGFyZ2V0TmFtZXNwYWNlKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGRlZmluZWRQcmVmaXhlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgcHJlZml4TWFwLmdldChrZXkpOwotICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwgJiYgdmFsdWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHVzZWRQcmVmaXhlcy5hZGQobnVsbCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UuZXF1YWxzKHZhbHVlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1c2VkUHJlZml4ZXMuYWRkKGtleSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBGaW5kIHByZWZpeGVzIHRoYXQgYXJlIGluIHRoZSBkb2N1bWVudC4KLSAgICogQHBhcmFtIGVsZW1lbnQKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlRE9NRWxlbWVudChFbGVtZW50IGVsZW1lbnQsIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICB1c2VkUHJlZml4ZXMuYWRkKHByZWZpeCk7Ci0gICAgCi0gICAgTmFtZWROb2RlTWFwIGF0dHJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgaW50IG51bU9mQXR0cnMgPSBhdHRycy5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bU9mQXR0cnM7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSBhdHRycy5pdGVtKGkpOwotICAgICAgU3RyaW5nIGF0dHJQcmVmaXggPSBub2RlLmdldFByZWZpeCgpOwotICAgICAgaWYgKGF0dHJQcmVmaXggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdXNlZFByZWZpeGVzLmFkZChhdHRyUHJlZml4KTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgU3RyaW5nIGF0dHIgPSBub2RlLmdldExvY2FsTmFtZSgpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIGNvbnRpbnVlOwotICAgICAgICBpZiAoYXR0ci5lcXVhbHMoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUpIHx8Ci0gICAgICAgICAgICBhdHRyLmVxdWFscyhYU0RDb25zdGFudHMuUkVGRVJfQVRUUklCVVRFKSB8fAotICAgICAgICAgICAgYXR0ci5lcXVhbHMoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKSB8fAotICAgICAgICAgICAgYXR0ci5lcXVhbHMoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFKSB8fAotICAgICAgICAgICAgYXR0ci5lcXVhbHMoWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURSkgfHwKLSAgICAgICAgICAgIGF0dHIuZXF1YWxzKFhTRENvbnN0YW50cy5JVEVNVFlQRV9BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgdXNlZFByZWZpeGVzLmFkZChleHRyYWN0UHJlZml4KHZhbHVlKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhdHRyLmVxdWFscyhYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlKTsKLSAgICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgICB1c2VkUHJlZml4ZXMuYWRkKGV4dHJhY3RQcmVmaXgodG9rZW4pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIE5vZGVMaXN0IGNoaWxkRWxlbWVudHMgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgbGVuZ3RoID0gY2hpbGRFbGVtZW50cy5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgbm9kZSA9IGNoaWxkRWxlbWVudHMuaXRlbShpKTsKLSAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2VET01FbGVtZW50KChFbGVtZW50KW5vZGUsIHNjaGVtYSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogRXh0cmFjdCB0aGUgcHJlZml4IGZyb20gdGhlIGdpdmVuIHN0cmluZy4gIEZvciBleGFtcGxlLCBwcmVmOmF0dHIgcmV0dXJucyBwcmVmLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiB0aGUgcHJlZml4Ci0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RQcmVmaXgoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaW50IGluZGV4ID0gdmFsdWUuaW5kZXhPZignOicpOwotICAgIGlmIChpbmRleCA8IDApIAotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBkZXRlcm1pbmVzIHRoZSBsaXN0IG9mIHJlZmVyZW5jZWQgY29tcG9uZW50cyBhbmQgaGVuY2UgdGhlIHVzZWQgc2NoZW1hcyBmcm9tIHdoaWNoCi0gICAqIHdlIGNhbiBkZXRlcm1pbmUgd2hhdCBhcmUgdGhlIHVudXNlZCBkaXJlY3RpdmVzCi0gICAqIAotICAgKiBAcGFyYW0gc2NoZW1hCi0gICAqIEBwYXJhbSB1bnVzZWRJbXBvcnRMaXN0Ci0gICAqIEBwYXJhbSB1c2VkU2NoZW1hcwotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZG9Dcm9zc1JlZmVyZW5jZXIoWFNEU2NoZW1hIHNjaGVtYSwgTGlzdCB1c2VkU2NoZW1hcywgTWFwIHhzZE5hbWVkQ29tcG9uZW50VXNhZ2UpCi0gIHsKLSAgICAvLyBDYWxjdWxhdGUgYWRkaXRpb25hbCB1bnVzZWQgaW1wb3J0cyB0aGF0IG1heSBoYXZlIHRoZSBzYW1lCi0gICAgLy8gbmFtZXNwYWNlIHRoYXQgZGlkIG5vdCBnZXQgYWRkZWQgaW4gdGhlIGluaXRpYWwgcGFzcwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0geHNkTmFtZWRDb21wb25lbnRVc2FnZS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIC8vIEZpcnN0IGRldGVybWluZSB0aGUgdXNlZCBzY2hlbWFzIGZyb20gdGhlIGNyb3NzIHJlZmVyZW5jZXIKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBYU0RTY2hlbWEgbmFtZWRDb21wb25lbnRTY2hlbWEgPSBuYW1lZENvbXBvbmVudC5nZXRTY2hlbWEoKTsKLSAgICAgIC8vIElmIHRoZSBuYW1lZCBjb21wb25lbnQgYmVsb25ncyB0byB0aGUgc2FtZSBzY2hlbWEsIHRoZW4gY29udGludWUuLi53ZQotICAgICAgLy8gd2FudCB0byBjaGVjayB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlcwotICAgICAgaWYgKG5hbWVkQ29tcG9uZW50U2NoZW1hID09IHNjaGVtYSkKLSAgICAgIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgeHNkTmFtZWRDb21wb25lbnRVc2FnZS5nZXQobmFtZWRDb21wb25lbnQpOwotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ZXJhdG9yMi5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFNldHRpbmcgc2V0dGluZyA9IChTZXR0aW5nKSBpdGVyYXRvcjIubmV4dCgpOwotICAgICAgICBPYmplY3Qgb2JqID0gc2V0dGluZy5nZXRFT2JqZWN0KCk7Ci0gICAgICAgIGlmIChpc0NvbXBvbmVudFVzZWQob2JqLCBzY2hlbWEsIG5hbWVkQ29tcG9uZW50U2NoZW1hKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghdXNlZFNjaGVtYXMuY29udGFpbnMobmFtZWRDb21wb25lbnRTY2hlbWEpKQotICAgICAgICAgICAgdXNlZFNjaGVtYXMuYWRkKG5hbWVkQ29tcG9uZW50U2NoZW1hKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIERldGVybWluZXMgaWYgdGhlIG9iamVjdCB0byBiZSBhbmFseXplZCBpcyByZWZlcmVuY2VkIGJ5IHRoZSBzY2hlbWEgCi0gICAqIEBwYXJhbSBvYmoKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKiBAcGFyYW0gdGFyZ2V0U2NoZW1hCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGlzIHJlZmVyZW5jZWQgYnkgdGhlIHNjaGVtYSwgZmFsc2UgaWYgbm90IHJlZmVyZW5jZWQKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGlzQ29tcG9uZW50VXNlZChPYmplY3Qgb2JqLCBYU0RTY2hlbWEgc2NoZW1hLCBYU0RTY2hlbWEgdGFyZ2V0U2NoZW1hKQotICB7Ci0gICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgb2JqOwotICAgICAgaWYgKGNvbXBvbmVudCA9PSBzY2hlbWEgfHwgY29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoIXVzZWRJbmNsdWRlU2NoZW1hcy5jb250YWlucyh0YXJnZXRTY2hlbWEpKQotICAgICAgICB1c2VkSW5jbHVkZVNjaGVtYXMuYWRkKHRhcmdldFNjaGVtYSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKioKLSAgICogRnJvbSBhIGxpc3Qgb2YgdXNlZCBzY2hlbWFzLCB1cGRhdGUgdGhlIHVudXNlZEltcG9ydHMgbGlzdCBmb3IgdGhlIGdpdmVuIHNjaGVtYQotICAgKiAKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKiBAcGFyYW0gdW51c2VkSW1wb3J0cwotICAgKiBAcGFyYW0gdXNlZFNjaGVtYXMKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFRvVW51c2VkSW1wb3J0cyhYU0RTY2hlbWEgc2NoZW1hLCBMaXN0IHVzZWRTY2hlbWFzKQotICB7Ci0gICAgLy8gbm93IHRoYXQgd2UgaGF2ZSB0aGUgbGlzdCBvZiB1c2VkU2NoZW1hcywgZ2V0IHRoZSBsaXN0IG9mIHVudXNlZAotICAgIC8vIHNjaGVtYXMgYnkgY29tcGFyaW5nIHRoaXMgbGlzdCB0byB3aGF0IGlzIGFjdHVhbGx5IGluIHRoZSBzY2hlbWEKLSAgICBJdGVyYXRvciBpdGVyID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZShpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0gICAgICB7Ci0gICAgICAgIFhTRFNjaGVtYURpcmVjdGl2ZSBkaXJlY3RpdmUgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKSBvOwotICAgICAgICBib29sZWFuIGlzVXNlZCA9IGZhbHNlOwotICAgICAgICBJdGVyYXRvciBpdGVyMiA9IHVzZWRTY2hlbWFzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyMi5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWEgdXNlZFNjaGVtYSA9IChYU0RTY2hlbWEpIGl0ZXIyLm5leHQoKTsKLSAgICAgICAgICBpZiAoZGlyZWN0aXZlIGluc3RhbmNlb2YgWFNESW1wb3J0ICYmIGRpcmVjdGl2ZS5nZXRSZXNvbHZlZFNjaGVtYSgpID09IHVzZWRTY2hlbWEpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXNVc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZGlyZWN0aXZlIGluc3RhbmNlb2YgWFNESW5jbHVkZSAmJiAoKFhTREluY2x1ZGUpZGlyZWN0aXZlKS5nZXRJbmNvcnBvcmF0ZWRTY2hlbWEoKSA9PSB1c2VkU2NoZW1hKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzVXNlZCA9IHRydWU7Ci0gICAgICAgICAgICB1c2VkRGlyZWN0SW5jbHVkZXMuYWRkKHVzZWRTY2hlbWEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGJsaW5kbHkgYWNjZXB0IHJlZGVmaW5lcyBhcyB1c2VkCi0gICAgICAgICAgaWYgKGRpcmVjdGl2ZSBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzVXNlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIElmIGl0IGlzIGFuIGluY2x1ZGUsIHdlIG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgdXNlZCBpbmRpcmVjdGx5Ci0gICAgICAgIGlmIChkaXJlY3RpdmUgaW5zdGFuY2VvZiBYU0RJbmNsdWRlICYmICFpc1VzZWQpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RJbmNsdWRlIGluYyA9IChYU0RJbmNsdWRlKWRpcmVjdGl2ZTsKLSAgICAgICAgICBYU0RTY2hlbWEgaW5jU2NoZW1hID0gaW5jLmdldEluY29ycG9yYXRlZFNjaGVtYSgpOwotICAgICAgICAgIGlmIChpbmNTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RTY2hlbWEgdXNlZFNjaGVtYSA9IGdldFVzZWRJbmNsdWRlU2NoZW1hKGluY1NjaGVtYSwgaW5jKTsKLSAgICAgICAgICAgIGlmICh1c2VkU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVzZWRJbmRpcmVjdEluY2x1ZGVzLmFkZChkaXJlY3RpdmUpOwotICAgICAgICAgICAgICB1c2VkSW5kaXJlY3RJbmNsdWRlc01hcC5wdXQoZGlyZWN0aXZlLCB1c2VkU2NoZW1hKTsKLSAgICAgICAgICAgICAgaXNVc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaXNVc2VkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiByZXNvbHZlZCBkaXJlY3RpdmVzIGFyZSBkZXRlcm1pbmVkIHVudXNlZAotICAgICAgICAvLyBJZiByZXNvbHZlZCBkaXJlY3RpdmVzIGFyZSBub3QgYWxyZWFkeSBpbiB0aGUgdW51c2VkIGxpc3QKLSAgICAgICAgLy8gQWxzbyBhbnkgcmVkZWZpbmVzIHNob3VsZCBiZSBjb25zaWRlcmVkIHVzZWQKLSAgICAgICAgaWYgKCFpc1VzZWQgJiYgIXVudXNlZERpcmVjdGl2ZXMuY29udGFpbnMoZGlyZWN0aXZlKSAmJiAhKGRpcmVjdGl2ZSBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKSkKLSAgICAgICAgewotICAgICAgICAgIHVudXNlZERpcmVjdGl2ZXMuYWRkKGRpcmVjdGl2ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgSXRlcmF0b3IgaXRlcjMgPSB1c2VkSW5kaXJlY3RJbmNsdWRlcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyMy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpdGVyMy5uZXh0KCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIFhTREluY2x1ZGUpCi0gICAgICB7Ci0gICAgICAgIFhTREluY2x1ZGUgaW5jID0gKFhTREluY2x1ZGUpbzsKLSAgICAgICAgWFNEU2NoZW1hIHRhcmdldFNjaGVtYSA9IChYU0RTY2hlbWEpdXNlZEluZGlyZWN0SW5jbHVkZXNNYXAuZ2V0KGluYyk7Ci0gICAgICAgIGlmICh1c2VkSW5jbHVkZVNjaGVtYXMuY29udGFpbnModGFyZ2V0U2NoZW1hKSAmJiB1c2VkRGlyZWN0SW5jbHVkZXMuY29udGFpbnModGFyZ2V0U2NoZW1hKSkKLSAgICAgICAgewotICAgICAgICAgIHVudXNlZERpcmVjdGl2ZXMuYWRkKGluYyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdXNlZERpcmVjdEluY2x1ZGVzLmFkZCh0YXJnZXRTY2hlbWEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEluY2x1ZGVzIGNhbiBiZSB1c2VkIGluZGlyZWN0bHkuICAgSWYgdGhlIHNjaGVtYSBpbmNsdWRlcyBBIHdoaWNoIGluY2x1ZGVzIEIsIGJ1dCB0aGUgc2NoZW1hCi0gICAqIHJlZmVyZW5jZXMgc29tZXRoaW5nIGluIEIsIHRoZW4gQSBpcyBpbmRpcmVjdGx5IHVzZWQsIGFuZCBoZW5jZSBBIGNhbm5vdCBiZSByZW1vdmVkLgotICAgKiAKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKiBAcGFyYW0geHNkSW5jbHVkZQotICAgKiBAcmV0dXJuIHRoZSByZWZlcmVuY2VkIHNjaGVtYSBpZiB1c2VkLCBudWxsIGlmIG5vdCB1c2VkCi0gICAqLwotICBwcml2YXRlIFhTRFNjaGVtYSBnZXRVc2VkSW5jbHVkZVNjaGVtYShYU0RTY2hlbWEgc2NoZW1hLCBYU0RJbmNsdWRlIHhzZEluY2x1ZGUpCi0gIHsKLSAgICBYU0RTY2hlbWEgcmVmU2NoZW1hID0gbnVsbDsKLSAgICBib29sZWFuIGlzVXNlZCA9IGZhbHNlOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSBzY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RJbmNsdWRlKQotICAgICAgewotICAgICAgICBYU0RJbmNsdWRlIGluYyA9IChYU0RJbmNsdWRlKW87Ci0gICAgICAgIFhTRFNjaGVtYSBpbmNTY2hlbWEgPSBpbmMuZ2V0SW5jb3Jwb3JhdGVkU2NoZW1hKCk7Ci0gICAgICAgIGlmIChpbmNTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIyID0gdXNlZEluY2x1ZGVTY2hlbWFzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKGl0ZXIyLmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RTY2hlbWEgeHNkU2NoID0gKFhTRFNjaGVtYSlpdGVyMi5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoaW5jU2NoZW1hID09IHhzZFNjaCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaXNVc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgcmVmU2NoZW1hID0gaW5jU2NoZW1hOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKCFpc1VzZWQpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCFhbmFseXplZEluY2x1ZGVTY2hlbWFzLmNvbnRhaW5zKGluY1NjaGVtYSkpIC8vIFRvIHByZXZlbnQgaW5maW5pdGUgY3ljbGUKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYW5hbHl6ZWRJbmNsdWRlU2NoZW1hcy5hZGQoaW5jU2NoZW1hKTsKLSAgICAgICAgICAgICAgcmVmU2NoZW1hID0gZ2V0VXNlZEluY2x1ZGVTY2hlbWEoaW5jU2NoZW1hLCBpbmMpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoaXNVc2VkIHx8IHJlZlNjaGVtYSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZWZTY2hlbWE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVmU2NoZW1hOwotICB9Ci0gIAotICAvKioKLSAgICogU2VlIGNyb3NzIHJlZmVyZW5jZSBmb3IgbW9yZSBkZXRhaWxzLiAKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVG9wTGV2ZWxDb21wb25lbnRDcm9zc1JlZmVyZW5jZXIgZXh0ZW5kcyBYU0RVdGlsLlhTRE5hbWVkQ29tcG9uZW50Q3Jvc3NSZWZlcmVuY2VyCi0gIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAKLSAgICBYU0RTY2hlbWEgc2NoZW1hRm9yU2NoZW1hID0gWFNEVXRpbC5nZXRTY2hlbWFGb3JTY2hlbWEoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsKLSAgICBYU0RTY2hlbWEgc2NoZW1hRm9yWFNJID0gWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFJbnN0YW5jZShYU0RDb25zdGFudHMuU0NIRU1BX0lOU1RBTkNFX1VSSV8yMDAxKTsKLQotICAgIHByb3RlY3RlZCBUb3BMZXZlbENvbXBvbmVudENyb3NzUmVmZXJlbmNlcihFT2JqZWN0IGFyZzApCi0gICAgewotICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG1hcCBvZiBhbGwgWFNETmFtZWRDb21wb25lbnQgY3Jvc3MgcmVmZXJlbmNlcyBpbiB0aGUgY29udGVudAotICAgICAqIHRyZWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgZmluZChFT2JqZWN0IGVPYmplY3QpCi0gICAgewotICAgICAgVG9wTGV2ZWxDb21wb25lbnRDcm9zc1JlZmVyZW5jZXIgcmVzdWx0ID0gbmV3IFRvcExldmVsQ29tcG9uZW50Q3Jvc3NSZWZlcmVuY2VyKGVPYmplY3QpOwotICAgICAgcmVzdWx0LmNyb3NzUmVmZXJlbmNlKCk7Ci0gICAgICByZXN1bHQuZG9uZSgpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjcm9zc1JlZmVyZW5jZShFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgZVJlZmVyZW5jZSwgRU9iamVjdCBjcm9zc1JlZmVyZW5jZWRFT2JqZWN0KQotICAgIHsKLSAgICAgIGlmIChjcm9zc1JlZmVyZW5jZWRFT2JqZWN0IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KSBjcm9zc1JlZmVyZW5jZWRFT2JqZWN0OwotCi0gICAgICAgIGlmIChuYW1lZENvbXBvbmVudC5nZXRDb250YWluZXIoKSA9PSBzY2hlbWFGb3JTY2hlbWEgfHwgCi0gICAgICAgICAgICBuYW1lZENvbXBvbmVudC5nZXRDb250YWluZXIoKSA9PSBzY2hlbWFGb3JYU0kgfHwgCi0gICAgICAgICAgICBjcm9zc1JlZmVyZW5jZWRFT2JqZWN0LmVDb250YWluZXIoKSA9PSBlT2JqZWN0IHx8IAotICAgICAgICAgICAgbmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmFtZWRDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gKFhTRFR5cGVEZWZpbml0aW9uKSBuYW1lZENvbXBvbmVudDsKLSAgICAgICAgICBpZiAoISh0eXBlRGVmaW5pdGlvbi5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAodHlwZURlZmluaXRpb24uZ2V0TmFtZSgpID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCB0byByZW1vdmUgVGV4dCBub2RlcwotICAgKiBAcGFyYW0gZWxlbWVudAotICAgKiBAcmV0dXJuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVUZXh0Tm9kZXNCZXR3ZWVuTmV4dEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTGlzdCBub2Rlc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoTm9kZSBub2RlID0gZWxlbWVudC5nZXROZXh0U2libGluZygpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpCi0gICAgewotICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgbm9kZXNUb1JlbW92ZS5hZGQobm9kZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IG5vZGVzVG9SZW1vdmUuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBub2RlVG9SZW1vdmUgPSAoTm9kZSkgai5uZXh0KCk7Ci0gICAgICAgICAgbm9kZVRvUmVtb3ZlLmdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZChub2RlVG9SZW1vdmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCB0byByZW1vdmUgVGV4dCBub2Rlcy4KLSAgICogQHBhcmFtIGVsZW1lbnQKLSAgICogQHJldHVybgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlVGV4dE5vZGVCZXR3ZWVuUHJldmlvdXNFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIExpc3Qgbm9kZXNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKE5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkpCi0gICAgewotICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgbm9kZXNUb1JlbW92ZS5hZGQobm9kZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IG5vZGVzVG9SZW1vdmUuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBub2RlVG9SZW1vdmUgPSAoTm9kZSkgai5uZXh0KCk7Ci0gICAgICAgICAgbm9kZVRvUmVtb3ZlLmdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZChub2RlVG9SZW1vdmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIGlGaWxlCi0gICAqIEBwYXJhbSBjaGVja1ByZWZlcmVuY2UgLSBpZiBmYWxzZSwgaWdub3JlIGNoZWNraW5nIHRoZSBwcmVmZXJlbmNlIHNldHRpbmcgCi0gICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAqLwotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVVudXNlZFhTREltcG9ydHMoSUZpbGUgaUZpbGUsIGJvb2xlYW4gY2hlY2tQcmVmZXJlbmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIGlmICghY2hlY2tQcmVmZXJlbmNlIHx8IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVtb3ZlSW1wb3J0U2V0dGluZygpKQotICAgIHsKLSAgICAgIElET01Nb2RlbCBtb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KGlGaWxlKTsKLSAgICAgIGlmIChtb2RlbCAhPSBudWxsKQotICAgICAgewotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0gICAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IFhTRE1vZGVsQWRhcHRlci5sb29rdXBPckNyZWF0ZVNjaGVtYShkb2N1bWVudCk7Ci0gICAgICAgICAgWFNERGlyZWN0aXZlc01hbmFnZXIgbWdyID0gbmV3IFhTRERpcmVjdGl2ZXNNYW5hZ2VyKCk7Ci0gICAgICAgICAgbWdyLnBlcmZvcm1SZW1vdmFsKHNjaGVtYSk7Ci0gICAgICAgICAgbWdyLmNsZWFudXAoKTsKLSAgICAgICAgICBtb2RlbC5zYXZlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvWFNERGlyZWN0aXZlc1NjaGVtYUxvY2F0aW9uVXBkYXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vdXRpbC9YU0REaXJlY3RpdmVzU2NoZW1hTG9jYXRpb25VcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmOGMxOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vdXRpbC9YU0REaXJlY3RpdmVzU2NoZW1hTG9jYXRpb25VcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuUmVzb3VyY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkcy5YU0RTZWxlY3RJbmNsdWRlRmlsZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTREltcG9ydEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTRERpcmVjdGl2ZXNTY2hlbWFMb2NhdGlvblVwZGF0ZXIKLXsKLSAgLyoqCi0gICAqIE1vZGlmaWVzIHRoZSBzY2hlbWEgbG9jYXRpb24gYnkgb3BlbmluZyB0aGUgc2NoZW1hIGxvY2F0aW9uIGRpYWxvZyBhbmQKLSAgICogcHJvY2Vzc2luZyB0aGUgcmVzdWx0cy4gVGhpcyBtZXRob2QgcmVmYWN0b3JzIHRoZSBjb2RlIGluCi0gICAqIFhTREltcG9ydFNlY3Rpb24kd2lkZ2V0U2VsZWN0ZWQgYW5kIFNjaGVtYUxvY2F0aW9uU2VjdGlvbiR3aWRnZXRTZWxlY3RlZAotICAgKiBhbmQgdGhlIHByb2Nlc3NpbmcgaW4gaGFuZGxlU2NoZW1hTG9jYXRpb25DaGFuZ2UoKQotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVNjaGVtYUxvY2F0aW9uKFhTRFNjaGVtYSB4c2RTY2hlbWEsIE9iamVjdCBzZWxlY3Rpb24sIGJvb2xlYW4gaXNJbmNsdWRlKQotICB7Ci0gICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotICAgIElGaWxlIGN1cnJlbnRJRmlsZSA9IG51bGw7Ci0gICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICBWaWV3ZXJGaWx0ZXIgZmlsdGVyOwotCi0gICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkKLSAgICB7Ci0gICAgICBjdXJyZW50SUZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KS5nZXRGaWxlKCk7Ci0gICAgICBmaWx0ZXIgPSBuZXcgUmVzb3VyY2VGaWx0ZXIobmV3IFN0cmluZ1tdIHsgIi54c2QiIH0sIC8vJE5PTi1OTFMtMSQgCi0gICAgICAgICAgbmV3IElGaWxlW10geyBjdXJyZW50SUZpbGUgfSwgbnVsbCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmaWx0ZXIgPSBuZXcgUmVzb3VyY2VGaWx0ZXIobmV3IFN0cmluZ1tdIHsgIi54c2QiIH0sIC8vJE5PTi1OTFMtMSQgCi0gICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQgZmlsZVNlbGVjdFdpemFyZCA9IG5ldyBYU0RTZWxlY3RJbmNsdWRlRmlsZVdpemFyZCh4c2RTY2hlbWEsIGlzSW5jbHVkZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0ZJTEVESUFMT0dfU0VMRUNUX1hNTF9TQ0hFTUEiKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRklMRURJQUxPR19TRUxFQ1RfWE1MX0RFU0MiKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICBmaWx0ZXIsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCi0gICAgV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIGZpbGVTZWxlY3RXaXphcmQpOwotICAgIHdpemFyZERpYWxvZy5jcmVhdGUoKTsKLSAgICB3aXphcmREaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgaW50IHJlc3VsdCA9IHdpemFyZERpYWxvZy5vcGVuKCk7Ci0KLSAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLSAgICB7Ci0gICAgICBJRmlsZSBzZWxlY3RlZElGaWxlID0gZmlsZVNlbGVjdFdpemFyZC5nZXRSZXN1bHRGaWxlKCk7Ci0gICAgICBTdHJpbmcgc2NoZW1hRmlsZVN0cmluZzsKLSAgICAgIGlmIChzZWxlY3RlZElGaWxlICE9IG51bGwgJiYgY3VycmVudElGaWxlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNjaGVtYUZpbGVTdHJpbmcgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoc2VsZWN0ZWRJRmlsZS5nZXRMb2NhdGlvbigpLCBjdXJyZW50SUZpbGUuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZElGaWxlICE9IG51bGwgJiYgY3VycmVudElGaWxlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNjaGVtYUZpbGVTdHJpbmcgPSBzZWxlY3RlZElGaWxlLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2NoZW1hRmlsZVN0cmluZyA9IGZpbGVTZWxlY3RXaXphcmQuZ2V0VVJMKCk7Ci0gICAgICB9Ci0KLSAgICAgIFN0cmluZyBhdHRyaWJ1dGVTY2hlbWFMb2NhdGlvbiA9ICJzY2hlbWFMb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RJbXBvcnQpCi0gICAgICB7Ci0gICAgICAgIFhTREltcG9ydCB4c2RJbXBvcnQgPSAoWFNESW1wb3J0KSBzZWxlY3Rpb247Ci0gICAgICAgIHhzZEltcG9ydC5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZVNjaGVtYUxvY2F0aW9uLCBzY2hlbWFGaWxlU3RyaW5nKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBmaWxlU2VsZWN0V2l6YXJkLmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgICAgbmFtZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBYU0RTY2hlbWEgZXh0ZXJuYWxTY2hlbWEgPSBmaWxlU2VsZWN0V2l6YXJkLmdldEV4dGVybmFsU2NoZW1hKCk7Ci0gICAgICAgIGphdmEudXRpbC5NYXAgbWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLQotICAgICAgICAvLyB1cGRhdGUgdGhlIHhtbG5zIGluIHRoZSBzY2hlbWEgZWxlbWVudCBmaXJzdCwgYW5kIHRoZW4gdXBkYXRlIHRoZQotICAgICAgICAvLyBpbXBvcnQgZWxlbWVudCBuZXh0IHNvIHRoYXQgdGhlIGxhc3QgY2hhbmdlIHdpbGwgYmUgaW4gdGhlIGltcG9ydCBlbGVtZW50LiBUaGlzIGtlZXBzIHRoZQotICAgICAgICAvLyBzZWxlY3Rpb24gb24gdGhlIGltcG9ydCBlbGVtZW50Ci0gICAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcihleHRlcm5hbFNjaGVtYSk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBoZWxwZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSwgZmFsc2UpOwotCi0gICAgICAgIGlmIChtYXAuY29udGFpbnNLZXkocHJlZml4KSkKLSAgICAgICAgewotICAgICAgICAgIHByZWZpeCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJlZml4ID09IG51bGwgfHwgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZ0J1ZmZlciBuZXdQcmVmaXggPSBuZXcgU3RyaW5nQnVmZmVyKCJwcmVmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpbnQgcHJlZml4RXh0ZW5zaW9uID0gMTsKLSAgICAgICAgICB3aGlsZSAobWFwLmNvbnRhaW5zS2V5KG5ld1ByZWZpeC50b1N0cmluZygpKSAmJiBwcmVmaXhFeHRlbnNpb24gPCAxMDApCi0gICAgICAgICAgewotICAgICAgICAgICAgbmV3UHJlZml4ID0gbmV3IFN0cmluZ0J1ZmZlcigicHJlZiIgKyBTdHJpbmcudmFsdWVPZihwcmVmaXhFeHRlbnNpb24pKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcHJlZml4RXh0ZW5zaW9uKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIHByZWZpeCA9IG5ld1ByZWZpeC50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9ICJuYW1lc3BhY2UiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChuYW1lc3BhY2UubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gaWYgbnMgYWxyZWFkeSBpbiBtYXAsIHVzZSBpdHMgY29ycmVzcG9uZGluZyBwcmVmaXgKLSAgICAgICAgICBpZiAobWFwLmNvbnRhaW5zVmFsdWUobmFtZXNwYWNlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlc0hlbHBlciB0eXBlc0hlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgICAgICAgICAgcHJlZml4ID0gdHlwZXNIZWxwZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSwgZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgLy8gb3RoZXJ3aXNlIGFkZCB0byB0aGUgbWFwCi0gICAgICAgICAgewotICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBwcmVmaXgsIG5hbWVzcGFjZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gcHJlZml4VGV4dC5zZXRUZXh0KHByZWZpeCk7Ci0gICAgICAgICAgeHNkSW1wb3J0LmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZXNwYWNlLCBuYW1lc3BhY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTU4ODUKLSAgICAgICAgLy8gTmVlZCB0byBpbXBvcnQgb3RoZXJ3aXNlIHRoZSBleHRlcm5hbCBzY2hlbWEgaXMgbmV2ZXIKLSAgICAgICAgLy8gcmVzb2x2ZWQuIE9uZSBwcm9ibGVtIGlzIHRoYXQgdGhlIHNjaGVtYSBsb2NhdGlvbiBpcyBzdGlsbCBudWxsLAotICAgICAgICAvLyBzbyB0aGUgc2V0IHR5cGVzIGRpYWxvZyB3aWxsIHNob3cgdHlwZXMgdGhhdCBiZWxvbmcgdG8gdGhhdCBzY2hlbWEKLSAgICAgICAgLy8gd2l0aCBhIG51bGwgc2NoZW1hIGxvY2F0aW9uLiBUaGlzIHNob3VsZCBsb2FkIHJlc291cmNlCi0gICAgICAgIC8vIGludG8gdGhlIHJlc291cmNlIHNldAotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNESW1wb3J0SW1wbCkgLy8gcmVkdW5kYW50Ci0gICAgICAgIHsKLSAgICAgICAgICBYU0RJbXBvcnRJbXBsIHhzZEltcG9ydEltcGwgPSAoWFNESW1wb3J0SW1wbCkgc2VsZWN0aW9uOwotICAgICAgICAgIHhzZEltcG9ydEltcGwuaW1wb3J0U2NoZW1hKCk7Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNESW5jbHVkZSkKLSAgICAgIHsKLSAgICAgICAgWFNESW5jbHVkZSB4c2RJbmNsdWRlID0gKFhTREluY2x1ZGUpIHNlbGVjdGlvbjsKLSAgICAgICAgeHNkSW5jbHVkZS5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZVNjaGVtYUxvY2F0aW9uLCBzY2hlbWFGaWxlU3RyaW5nKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgICAgewotICAgICAgICBYU0RSZWRlZmluZSB4c2RSZWRlZmluZSA9IChYU0RSZWRlZmluZSkgc2VsZWN0aW9uOwotICAgICAgICB4c2RSZWRlZmluZS5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZVNjaGVtYUxvY2F0aW9uLCBzY2hlbWFGaWxlU3RyaW5nKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViZGMxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi91dGlsL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotX1VJX0FDVElPTl9PUEVOX0lOX05FV19FRElUT1I9Jk9wZW4gSW4gTmV3IEVkaXRvcgotX1VJX0FDVElPTl9ERUxFVEVfQ09OU1RSQUlOVFM9RGVsZXRlIENvbnN0cmFpbnRzCi1fVUlfQUNUSU9OX0RFTEVURV9FTlVNRVJBVElPTj1EZWxldGUgRW51bWVyYXRpb24KLV9VSV9BQ1RJT05fREVMRVRFX0FQUElORk9fRUxFTUVOVD1EZWxldGUgQXBwSW5mbyBFbGVtZW50Ci1fVUlfQUNUSU9OX0RFTEVURV9BUFBJTkZPX0FUVFJJQlVURT1EZWxldGUgQXBwSW5mbyBBdHRyaWJ1dGUKLV9VSV9BQ1RJT05fREVMRVRFX0VYVEVOU0lPTl9DT01QT05FTlQ9RGVsZXRlIEV4dGVuc2lvbiBDb21wb25lbnQKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUD1BZGQgQXR0cmlidXRlICZHcm91cAotX1VJX0FDVElPTl9BRERfQVBQSU5GT19FTEVNRU5UPUFkZCBBcHBJbmZvIEVsZW1lbnQKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURT1BZGQgJkF0dHJpYnV0ZQotX1VJX0FDVElPTl9BRERfR1JPVVBfUkVGPUFkZCAmR3JvdXAgUmVmCi1fVUlfQUNUSU9OX0FERF9BTllfRUxFTUVOVD1BZGQgQW4meQotX1VJX0FDVElPTl9BRERfQU5ZX0FUVFJJQlVURT1BZGQgQSZueSBBdHRyaWJ1dGUKLV9VSV9BQ1RJT05fQUREX1dJVEhfRE9UUz0mQWRkLi4uCi1fVUlfQUNUSU9OX1VQREFURV9CT1VORFM9VXBkYXRlIGJvdW5kcwotX1VJX0FDVElPTl9BRERfQ09NUExFWF9UWVBFPUFkZCAmQ29tcGxleCBUeXBlCi1fVUlfQUNUSU9OX0FERF9FTlVNRVJBVElPTlM9QWRkIEVudW1lcmF0aW9ucwotX1VJX0FDVElPTl9BRERfRE9DVU1FTlRBVElPTj1BZGQgRG9jdW1lbnRhdGlvbgotX1VJX0FDVElPTl9DT05TVFJBSU5fTEVOR1RIPUNvbnN0cmFpbiBsZW5ndGgKLV9VSV9BQ1RJT05fQlJPV1NFX1dPUktTUEFDRT1Xb3Jrc3BhY2UKLV9VSV9ERUxFVEVfQlVUVE9OPSZEZWxldGUKLV9VSV9MQUJFTF9OT19JVEVNU19TRUxFQ1RFRD1ObyBpdGVtcyBzZWxlY3RlZAotX1VJX0xBQkVMX0VMRU1FTlRGT1JNREVGQVVMVD1QcmVmaXggZm9yICZFbGVtZW50czoKLV9VSV9MQUJFTF9BVFRSSUJVVEVGT1JNREVGQVVMVD1QcmVmaXggZm9yICZBdHRyaWJ1dGVzOgotX1VJX0xBQkVMX0JMT0NLREVGQVVMVD0mQmxvY2sgZGVmYXVsdDoKLV9VSV9MQUJFTF9FWFRFTlNJT05fREVUQUlMUz1FeHRlbnNpb24gRGV0YWlscwotX1VJX0xBQkVMX0VYVEVOU0lPTl9DQVRFR09SSUVTPUV4dGVuc2lvbiAmQ2F0ZWdvcmllczoKLV9VSV9MQUJFTF9GSU5BTERFRkFVTFQ9JkZpbmFsIGRlZmF1bHQ6Ci1fVUlfTEFCRUxfQ09MTEFQU0VfV0hJVEVTUEFDRT1Db2xsYXBzZSAmd2hpdGVzcGFjZQotX1VJX0xBQkVMX1JFU1RSSUNUX1ZBTFVFU19CWT0mUmVzdHJpY3QgdmFsdWVzIGJ5OgotX1VJX0xBQkVMX01JTklNVU1fTEVOR1RIPU1pJm5pbXVtIGxlbmd0aDoKLV9VSV9MQUJFTF9NQVhJTVVNX0xFTkdUSD1NYSZ4aW11bSBsZW5ndGg6Ci1fVUlfTEFCRUxfU0VMRUNUX1hTRF9GSUxFPVNlbGVjdCBYU0QgZmlsZQotX1VJX0xBQkVMX0NPTlNUUkFJTlRTX09OX1ZBTFVFX09GPUNvbnN0cmFpbnRzIG9uIHZhbHVlIG9mIAotX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEU9QWRkICZTaW1wbGUgVHlwZQotX1VJX0FDVElPTl9FRElUX1dJVEhfRE9UUz0mRWRpdC4uLgotX1VJX0FDVElPTl9DSEFOR0VfUEFUVEVSTj1DaGFuZ2UgcGF0dGVybgotX1VJX0FDVElPTl9BRERfRU5VTUVSQVRJT049QWRkICZFbnVtZXJhdGlvbgotX1VJX0FDVElPTl9JTlNFUlRfRU5VTUVSQVRJT049Jkluc2VydCBFbnVtZXJhdGlvbgotX1VJX0FDVElPTl9DSEFOR0VfRU5VTUVSQVRJT05fVkFMVUU9Q2hhbmdlIEVudW1lcmF0aW9uIHZhbHVlCi1fVUlfQUNUSU9OX0RFTEVURV9QQVRURVJOPURlbGV0ZSBQYXR0ZXJuCi1fVUlfQUNUSU9OX0JST1dTRV9DQVRBTE9HPUNhdGFsb2cKLV9VSV9BQ1RJT05fQUREX0dST1VQPUFkZCAmR3JvdXAKLV9VSV9BQ1RJT05fQUREX1BBVFRFUk49QWRkIHBhdHRlcm4KLV9VSV9BQ1RJT05fU0VUX0JBU0VfVFlQRT1TZXQgJkJhc2UgVHlwZQotX1VJX0VSUk9SX0lOVkFMSURfTkFNRT1JbnZhbGlkIG5hbWUKLV9VSV9FUlJPUl9JTlZBTElEX0ZJTEU9SW52YWxpZCBmaWxlCi1fVUlfRVJST1JfSU5WQUxJRF9DQVRFR09SWT1JbnZhbGlkIENhdGVnb3J5Ci1fVUlfQUNUSU9OX0RFTEVURT0mRGVsZXRlCi1fVUlfQUNUSU9OX0FERD1BJmRkCi1fVUlfQUNUSU9OX1JFTkFNRT1SZW5hbWUKLV9VSV9MQUJFTF9QQVRURVJOPVBhdHRlcm4KLV9VSV9MQUJFTF9QQVRURVJOUz0mUGF0dGVybnMKLV9VSV9MQUJFTF9OQU1FPSZOYW1lOgotX1VJX0xBQkVMX1RZUEU9JlR5cGU6IAotX1VJX0xBQkVMX0JBU0U9JkJhc2U6Ci1fVUlfTEFCRUxfVVA9VXAKLV9VSV9MQUJFTF9ET1dOPURvd24KLV9VSV9MQUJFTF9ERUxFVEU9JkRlbGV0ZQotX1VJX0xBQkVMX1NDSEVNQT0mU2NoZW1hOgotX1VJX0xBQkVMX0VESVQ9JkVkaXQuLi4KLV9VSV9MQUJFTF9SRUZFUkVOQ0U9UmVmZXJlbmNlOgotX1VJX0xBQkVMX1JFQURPTkxZPVJlYWRPbmx5Ci1fVUlfTEFCRUxfSU5DTFVTSVZFPUluY2x1c2l2ZQotX1VJX0xBQkVMX0VOVU1FUkFUSU9OUz0mRW51bWVyYXRpb25zCi1fVUlfTEFCRUxfRVhURU5TSU9OUz1FeHRlbnNpb25zCi1fVUlfTEFCRUxfTUlOSU1VTV9WQUxVRT0mTWluaW11bSB2YWx1ZToKLV9VSV9MQUJFTF9NQVhJTVVNX1ZBTFVFPU1hJnhpbXVtIHZhbHVlOgotX1VJX0xBQkVMX0NPTlRSQUlOVFNfT049Q29uc3RyYWludHMgb24gCi1fVUlfTEFCRUxfQUREX1dJVEhfRE9UUz0mQWRkLi4uCi1fVUlfTEFCRUxfQUREX0NBVEVHT1JZPUFkZCBDYXRlZ29yeQotX1VJX0xBQkVMX0VESVRfQ0FURUdPUlk9RWRpdCBDYXRlZ29yeQotX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQX1JFRj1BZGQgQXR0cmlidXRlICZHcm91cCBSZWYKLV9VSV9BQ1RJT05fQUREX0VYVEVOU0lPTl9DT01QT05FTlQ9QWRkIEV4dGVuc2lvbiBDb21wb25lbnQKLV9VSV9BQ1RJT05fQUREX0VYVEVOU0lPTl9DT01QT05FTlRTPUFkZCBFeHRlbnNpb24gQ29tcG9uZW50cwotX1VJX0xBQkVMX0NPTlNUUkFJTlRTX09OX0xFTkdUSF9PRj1Db25zdHJhaW50cyBvbiBsZW5ndGggb2YgCi1fVUlfQUNUSU9OX0FERF9BUFBJTkZPX0FUVFJJQlVURT1BZGQgQXBwSW5mbyBBdHRyaWJ1dGUKLV9VSV9BQ1RJT05fU0VUX0VOVU1FUkFUSU9OX1ZBTFVFPVNldCBFbnVtZXJhdGlvbiBWYWx1ZQotX1VJX0FDVElPTl9VUERBVEVfRUxFTUVOVF9SRUZFUkVOQ0U9VXBkYXRlIEVsZW1lbnQgUmVmZXJlbmNlCi1fVUlfQUNUSU9OX1VQREFURV9NQVhJTVVNX09DQ1VSUkVOQ0U9VXBkYXRlIE1heGltdW0gT2NjdXJyZW5jZQotX1VJX0FDVElPTl9VUERBVEVfTUlOSU1VTV9PQ0NVUlJFTkNFPVVwZGF0ZSBNaW5pbXVtIE9jY3VycmVuY2UKLV9VSV9BQ1RJT05fQ0hBTkdFX01BWElNVU1fT0NDVVJSRU5DRT1NYXhpbXVtIE9jY3VycmVuY2UgQ2hhbmdlIAotX1VJX0FDVElPTl9DSEFOR0VfTUlOSU1VTV9PQ0NVUlJFTkNFPU1pbmltdW0gT2NjdXJyZW5jZSBDaGFuZ2UKLV9VSV9MQUJFTF9TUEVDSUZJQ19DT05TVFJBSU5UX1ZBTFVFUz1TcGVjaWZpYyBjb25zdHJhaW50IHZhbHVlcwotX1VJX0xBQkVMX0FWQUlMQUJMRV9DT01QT05FTlRTX1RPX0FERD1BdmFpbGFibGUgY29tJnBvbmVudHMgdG8gQWRkOgotX1VJX0FDVElPTl9DSEFOR0VfQ09OVEVOVF9NT0RFTD1DaGFuZ2UgQ29udGVudCBNb2RlbAotX1VJX0VSUk9SX0ZJTEVfQ0FOTk9UX0JFX1BBUlNFRD1UaGUgeHNkIGZpbGUgb2YgdGhlIHNlbGVjdGVkIGNhdGVnb3J5IGNhbm5vdCBiZSBwYXJzZWQuCi1fVUlfREVTQ1JJUFRJT05fQ0hPT1NFX1hTRF9GSUxFPUNob29zZSBhbiBYU0QgZmlsZSBjb250YWluaW5nIHNjaGVtYSBmb3IgeW91ciBleHRlbnNpYmxlIGNvbXBvbmVudHMKLV9VSV9FUlJPUl9WQUxJREFURV9USEVfRklMRT1QbGVhc2UgdmFsaWRhdGUgdGhlIGZpbGUuCi1fVUlfRVJST1JfTkFNRV9BTFJFQURZX1VTRUQ9VGhlIG5hbWUgaXMgYWxyZWFkeSBiZWluZyB1c2VkLgotX1VJX0FDVElPTl9DT0xMQVBTRV9XSElURVNQQUNFPUNvbGxhcHNlIHdoaXRlc3BhY2UKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUF9ERUZJTklUSU9OPUFkZCBBdHRyaWJ1dGUgR3JvdXAgRGVmaW5pdGlvbgotX1VJX0VSUk9SX0lOVkFMSURfVkFMVUVfRk9SX01BWElNVU1fT0NDVVJSRU5DRT1JbnZhbGlkIHZhbHVlIGZvciBtYXhpbXVtIG9jY3VycmVuY2UKLV9VSV9UT09MVElQX1JFTkFNRV9SRUZBQ1RPUj1DbGljayBoZXJlIHRvIGludm9rZSB0aGUgUmVuYW1lIHJlZmFjdG9yaW5nLgotX1VJX1ZBTFVFX0NPTE9OPVZhbHVlOgotX1VJX0lEPUlEOgotX1VJX1JFRj1SZWZlcmVuY2U6Ci1fVUlfRklYRUQ9Rml4ZWQKLV9VSV9ERUZBVUxUPURlZmF1bHQKLV9VSV9GT1JNPUZvcm0gcXVhbGlmaWNhdGlvbjoKLV9VSV9MQUJFTF9DQVRBTE9HPSZYTUwgQ2F0YWxvZy4uLgotX1VJX0xBQkVMX1dPUktTUEFDRT0mV29ya3NwYWNlLi4uCi1fVUlfQUNUSU9OX0NIQU5HRT17MH0gQ2hhbmdlCi1fVUlfQUNUSU9OX0NMT1NFX1NDSEVNQV9QUkVWSUVXX1BPUFVQPSZDbG9zZQotX1VJX0FDVElPTl9OQU1FU1BBQ0VfSU5GT1JNQVRJT05fQ0hBTkdFPU5hbWVzcGFjZSBJbmZvcm1hdGlvbiBDaGFuZ2UKLV9VSV9MQUJFTF9BQlNUUkFDVD0mQWJzdHJhY3Q6Ci1fVUlfTEFCRUxfQkxPQ0s9JkJsb2NrOgotX1VJX0xBQkVMX0ZJTkFMPSZGaW5hbDoKLV9VSV9MQUJFTF9TVUJTVElUVVRJT05fR1JPVVA9JlN1YnN0aXR1dGlvbiBHcm91cDoKLV9VSV9MQUJFTF9NSVhFRD0mTWl4ZWQ6Ci1fVUlfTEFCRUxfVkFMVUU9JlZhbHVlCi1fVUlfVVNBR0U9VXNhZ2UKLV9VSV9MQUJFTF9GT1JNPUZvcm0KLV9VSV9MQUJFTF9OSUxMQUJMRT0mTmlsbGFibGU6ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL0NoZWNrcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL0NoZWNrcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDNhYTcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9DaGVja3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5OYW1lVmFsaWRhdG9yOwotCi1wdWJsaWMgY2xhc3MgQ2hlY2tzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrTmFtZShTdHJpbmcgbmFtZSkgewotCQlSZWZhY3RvcmluZ1N0YXR1cyByZXN1bHQ9IG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCQlpZiAoIiIuZXF1YWxzKG5hbWUpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlRmF0YWxFcnJvclN0YXR1cyhSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiQ2hlY2tzX0Nob29zZV9uYW1lIikpOyAgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbHJlYWR5TmFtZWQoUmVmYWN0b3JpbmdDb21wb25lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWUpewotCQlyZXR1cm4gbmFtZS5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29tcG9uZW50TmFtZShTdHJpbmcgbmFtZSkgewotCQlSZWZhY3RvcmluZ1N0YXR1cyByZXN1bHQ9IG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCQlpZiAoIU5hbWVWYWxpZGF0b3IuaXNWYWxpZChuYW1lKSkKLQkJCXJldHVybiBSZWZhY3RvcmluZ1N0YXR1cy5jcmVhdGVGYXRhbEVycm9yU3RhdHVzKFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJDaGVja3NfQ2hvb3NlX25hbWUiKSk7ICAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9JTmFtZVVwZGF0aW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvSU5hbWVVcGRhdGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjg5NjY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9JTmFtZVVwZGF0aW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLQotLyoqCi0gKiBAYXV0aG9yIGViZWxpc2FyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5hbWVVcGRhdGluZyB7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXROZXdFbGVtZW50TmFtZShTdHJpbmcgbmV3TmFtZSk7Ci0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROZXdFbGVtZW50TmFtZSgpOwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0Q3VycmVudEVsZW1lbnROYW1lKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrTmV3RWxlbWVudE5hbWUoU3RyaW5nIG5ld05hbWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9JUmVmZXJlbmNlVXBkYXRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9JUmVmZXJlbmNlVXBkYXRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmNDhmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvSVJlZmVyZW5jZVVwZGF0aW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZmVyZW5jZVVwZGF0aW5nIHsKLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGlzIHJlZmFjdG9yaW5nIG9iamVjdCBpcyBjYXBhYmxlIG9mIHVwZGF0aW5nIHJlZmVyZW5jZXMgdG8gdGhlIHJlbmFtZWQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FbmFibGVVcGRhdGVSZWZlcmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBJZiA8Y29kZT5jYW5VcGRhdGVSZWZlcmVuY2VzPC9jb2RlPiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIHRoaXMgbWV0aG9kIGlzIHVzZWQgdG8KLQkgKiBpbmZvcm0gdGhlIHJlZmFjdG9yaW5nIG9iamVjdCB3aGV0aGVyIHJlZmVyZW5jZXMgc2hvdWxkIGJlIHVwZGF0ZWQuCi0JICogVGhpcyBjYWxsIGNhbiBiZSBpZ25vcmVkIGlmICA8Y29kZT5jYW5VcGRhdGVSZWZlcmVuY2VzPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKi8JCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlUmVmZXJlbmNlcyhib29sZWFuIHVwZGF0ZSk7Ci0KLQkvKioKLQkgKiBJZiA8Y29kZT5jYW5VcGRhdGVSZWZlcmVuY2VzPC9jb2RlPiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIHRoaXMgbWV0aG9kIGlzIHVzZWQgdG8KLQkgKiBhc2sgdGhlIHJlZmFjdG9yaW5nIG9iamVjdCB3aGV0aGVyIHJlZmVyZW5jZXMgc2hvdWxkIGJlIHVwZGF0ZWQuCi0JICogVGhpcyBjYWxsIGNhbiBiZSBpZ25vcmVkIGlmICA8Y29kZT5jYW5VcGRhdGVSZWZlcmVuY2VzPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKi8JCQotCXB1YmxpYyBib29sZWFuIGdldFVwZGF0ZVJlZmVyZW5jZXMoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9JWFNEUmVmYWN0b3JDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9JWFNEUmVmYWN0b3JDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkZmVjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvSVhTRFJlZmFjdG9yQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3RvcjsKLQotcHVibGljIGludGVyZmFjZSBJWFNEUmVmYWN0b3JDb25zdGFudHMgewotCVN0cmluZyBSRUZBQ1RPUl9DT05URVhUX01FTlVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvck1lbnVJZCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9NYWtlQW5vbnltb3VzVHlwc0dsb2JhbEVuYWJsZW1lbnRUZXN0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9NYWtlQW5vbnltb3VzVHlwc0dsb2JhbEVuYWJsZW1lbnRUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1N2JiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvTWFrZUFub255bW91c1R5cHNHbG9iYWxFbmFibGVtZW50VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3RvcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0KLQotcHVibGljIGNsYXNzIE1ha2VBbm9ueW1vdXNUeXBzR2xvYmFsRW5hYmxlbWVudFRlc3RlciBleHRlbmRzIFJlZmFjdG9yRW5hYmxlbWVudFRlc3RlcgotewotCi0gIHByb3RlY3RlZCBib29sZWFuIGNhbkVuYWJsZShYU0RDb25jcmV0ZUNvbXBvbmVudCBzZWxlY3RlZE9iamVjdCwgWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIGlmIChzZWxlY3RlZE9iamVjdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBYU0RTY2hlbWEgc2VsZWN0ZWRDb21wb25lbnRTY2hlbWEgPSBudWxsOwotICAgIGJvb2xlYW4gZW5hYmxlID0gZmFsc2U7Ci0gICAgc2VsZWN0ZWRDb21wb25lbnRTY2hlbWEgPSBzZWxlY3RlZE9iamVjdC5nZXRTY2hlbWEoKTsKLQotICAgIGlmIChzZWxlY3RlZENvbXBvbmVudFNjaGVtYSAhPSBudWxsICYmIHNlbGVjdGVkQ29tcG9uZW50U2NoZW1hID09IHNjaGVtYSkKLSAgICB7Ci0gICAgICBlbmFibGUgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChlbmFibGUgJiYgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXNlbGVjdGVkT2JqZWN0OwotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gdHlwZURlZi5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlbmFibGUgJiYgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKXNlbGVjdGVkT2JqZWN0OwotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gdHlwZURlZi5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9NYWtlTG9jYWxFbGVtZW50R2xvYmFsRW5hYmxlbWVudFRlc3Rlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL01ha2VMb2NhbEVsZW1lbnRHbG9iYWxFbmFibGVtZW50VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZjQ2OTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL01ha2VMb2NhbEVsZW1lbnRHbG9iYWxFbmFibGVtZW50VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3RvcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotCi1wdWJsaWMgY2xhc3MgTWFrZUxvY2FsRWxlbWVudEdsb2JhbEVuYWJsZW1lbnRUZXN0ZXIgZXh0ZW5kcyBSZWZhY3RvckVuYWJsZW1lbnRUZXN0ZXIKLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuRW5hYmxlKFhTRENvbmNyZXRlQ29tcG9uZW50IHNlbGVjdGVkT2JqZWN0LCBYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgaWYgKHNlbGVjdGVkT2JqZWN0ID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBib29sZWFuIGVuYWJsZSA9IGZhbHNlOwotICAgIFhTRFNjaGVtYSBzZWxlY3RlZENvbXBvbmVudFNjaGVtYSA9IG51bGw7Ci0gICAgc2VsZWN0ZWRDb21wb25lbnRTY2hlbWEgPSBzZWxlY3RlZE9iamVjdC5nZXRTY2hlbWEoKTsKLSAgICBpZiAoc2VsZWN0ZWRDb21wb25lbnRTY2hlbWEgIT0gbnVsbCAmJiBzZWxlY3RlZENvbXBvbmVudFNjaGVtYSA9PSBzY2hlbWEpCi0gICAgewotICAgICAgZW5hYmxlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoZW5hYmxlICYmIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilzZWxlY3RlZE9iamVjdDsKLSAgICAgIGlmICghZWxlbWVudC5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpICYmICFlbGVtZW50LmlzR2xvYmFsKCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1BlcmZvcm1VbnNhdmVkUmVmYWN0b3JpbmdPcGVyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9QZXJmb3JtVW5zYXZlZFJlZmFjdG9yaW5nT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNzM5ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1BlcmZvcm1VbnNhdmVkUmVmYWN0b3JpbmdPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5Qcm9jZXNzb3JCYXNlZFJlZmFjdG9yaW5nOwotCi1wdWJsaWMgY2xhc3MgUGVyZm9ybVVuc2F2ZWRSZWZhY3RvcmluZ09wZXJhdGlvbiBpbXBsZW1lbnRzIElXb3Jrc3BhY2VSdW5uYWJsZSAKLXsgCi0gIHByaXZhdGUgUHJvY2Vzc29yQmFzZWRSZWZhY3RvcmluZyByZWZhY3RvcmluZzsKLSAgCi0gIHB1YmxpYyBQZXJmb3JtVW5zYXZlZFJlZmFjdG9yaW5nT3BlcmF0aW9uKFByb2Nlc3NvckJhc2VkUmVmYWN0b3JpbmcgcmVmYWN0b3JpbmcpCi0gIHsKLSAgICB0aGlzLnJlZmFjdG9yaW5nID0gcmVmYWN0b3Jpbmc7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHBtKQotICB7Ci0gICAgaWYgKHBtID09IG51bGwpCi0gICAgewotICAgICAgcG0gPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotICAgIH0gIAotICAgIHRyeQotICAgIHsgCi0gICAgICByZWZhY3RvcmluZy5jaGVja0FsbENvbmRpdGlvbnMocG0pOwotICAgICAgQ2hhbmdlIGNoYW5nZSA9IHJlZmFjdG9yaW5nLmNyZWF0ZUNoYW5nZShwbSk7ICAgCi0gICAgICBpZiAoY2hhbmdlIGluc3RhbmNlb2YgQ29tcG9zaXRlQ2hhbmdlKQotICAgICAgewotICAgICAgICBDb21wb3NpdGVDaGFuZ2UgY29tcG9zaXRlQ2hhbmdlID0gKENvbXBvc2l0ZUNoYW5nZSljaGFuZ2U7Ci0gICAgICAgIHNldFNhdmVNb2RlKGNvbXBvc2l0ZUNoYW5nZSk7ICAgICAgICAgICAgICAKLSAgICAgIH0gIAotICAgICAgY2hhbmdlLnBlcmZvcm0ocG0pOyAgICAgICAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0U2F2ZU1vZGUoQ29tcG9zaXRlQ2hhbmdlIGNvbXBvc2l0ZSkKLSAgewotICAgIENoYW5nZVtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBDaGFuZ2UgY2hpbGQgPSBjaGlsZHJlbltpXTsKLSAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFRleHRGaWxlQ2hhbmdlKQotICAgICAgewotICAgICAgICAoKFRleHRGaWxlQ2hhbmdlKWNoaWxkKS5zZXRTYXZlTW9kZShUZXh0RmlsZUNoYW5nZS5MRUFWRV9ESVJUWSk7Ci0gICAgICB9IAotICAgICAgZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb21wb3NpdGVDaGFuZ2UpCi0gICAgICB7Ci0gICAgICAgIHNldFNhdmVNb2RlKChDb21wb3NpdGVDaGFuZ2UpY2hpbGQpOwotICAgICAgfSAgCi0gICAgfSAgCi0gIH0KLX0gIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9SZWZhY3RvckVuYWJsZW1lbnRUZXN0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9SZWZhY3RvckVuYWJsZW1lbnRUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkxMmNhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvUmVmYWN0b3JFbmFibGVtZW50VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3RvcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZmFjdG9yRW5hYmxlbWVudFRlc3RlciBleHRlbmRzIFByb3BlcnR5VGVzdGVyCi17Ci0KLSAgcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpCi0gIHsKLSAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgaWYgKHdpbmRvdyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICBpZiAoYWN0aXZlUGFnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBhY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgIGlmIChlZGl0b3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpZWRpdG9yLmdldEFkYXB0ZXIoWFNEU2NoZW1hLmNsYXNzKTsKLQotICAgIGlmIChyZWNlaXZlciBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXJlY2VpdmVyOwotICAgICAgcmVjZWl2ZXIgPSBmU3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIHJlY2VpdmVyID0gKChYU0RCYXNlQWRhcHRlcilyZWNlaXZlcikuZ2V0VGFyZ2V0KCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChyZWNlaXZlciBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgewotICAgICAgICByZXR1cm4gY2FuRW5hYmxlKChYU0RDb25jcmV0ZUNvbXBvbmVudClyZWNlaXZlciwgc2NoZW1hKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgTm9kZSkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpcmVjZWl2ZXI7Ci0gICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gc2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQobm9kZSk7Ci0gICAgICAgICAgcmV0dXJuIGNhbkVuYWJsZShjb25jcmV0ZUNvbXBvbmVudCwgc2NoZW1hKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gY2FuRW5hYmxlKFhTRENvbmNyZXRlQ29tcG9uZW50IHNlbGVjdGVkT2JqZWN0LCBYU0RTY2hlbWEgc2NoZW1hKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9SZWZhY3RvcmluZ0NvbXBvbmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1JlZmFjdG9yaW5nQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NGJjOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1JlZmFjdG9yaW5nQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBSZWZhY3RvcmluZ0NvbXBvbmVudAotewotCS8qKgotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0aGF0IGlzIHJlZmFjdG9yZWQuICBFLmcuICJmb28iCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBjb21wb25lbnQgdGhhdCBpcyByZWZhY3RvcmVkLiAgRS5nLiAiaHR0cDovL2ZvbyIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpOwotCQotCS8qKgotCSAqIFRoZSBiYXNpYyBET00gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSByZWZhY3RvcmluZyBwcm9jZXNzb3IvcGFydGljaXBhbnQgdG8gZ2V0IAotCSAqIGFjY2VzcyB0byB0aGUgZmlsZSBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBTdHJ1Y3R1cmVkIFNvdXJjZSBFZGl0b3IgWE1MIERPTSBlbGVtZW50IG9iamVjdCB0aGF0IHVuZGVybGluZXMgdGhlIAotCSAqIGNvbWJvbmVudCBiZWluZyByZWZhY3RvcmUuCi0JICogCi0JICogQHNlZSBJRE9NRWxlbWVudCAKLQkgKi8KLQlwdWJsaWMgSURPTUVsZW1lbnQgZ2V0RWxlbWVudCgpOwotCQotCS8qKiAKLQkgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdHlwZSBvZiB0aGUgcmVmYWN0b3JlZCBjb21wb25lbnQuIAotCSAqIAotCSAqIDxwPgotCSAqIEEgcXVhbGlmaWVkIG5hbWUgY29uc2lzdHMgb2YgYSBsb2NhbCBuYW1lIGFuZCBhIG5hbWVzcGFjZS4gIAotCSAqIEUuZy4gImNvbXBsZXhUeXBlIi1sb2NhbCBuYW1lLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLW5hbWVzcGFjZQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIFF1YWxpZmllZE5hbWUKLQkgKi8KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXRUeXBlUU5hbWUoKTsKLQkJCi0JLyoqIAotCSAqIFRoZSBtb2RlbCBvYmplY3QgbWF5IGJlIHJlcXVpcmVkIHRvIGJlIGdpdmVuIHRvIHRoZSByZWZhY3RvcmVkIHBhcnRpY2lwYW50cyBhcyBpcyBvciAKLQkgKiBvdGhlciBvYmplY3RzIGNvdWxkIGJlIGRlcml2ZWQgZnJvbSBpdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcmluY2lwYWwgb2JqZWN0IGJlaW5nIHJlZmFjdG9yZWQsIHN1Y2ggYXMgYW4gaW5zdGFuY2Ugb2YgV1NETEVsZW1lbnQgb3IgCi0JICogWFNETmFtZWRDb21wb25lbnQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9SZWZhY3RvcmluZ01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvUmVmYWN0b3JpbmdNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGVkNGIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9SZWZhY3RvcmluZ01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3I7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIFJlZmFjdG9yaW5nTWVzc2FnZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0JVTkRMRT0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGU9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShSRVNPVVJDRV9CVU5ETEUpOwotCi0JcHJpdmF0ZSBSZWZhY3RvcmluZ01lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTdHJpbmdzKFN0cmluZyBrZXlzW10pIHsKLQkJU3RyaW5nW10gcmVzdWx0PSBuZXcgU3RyaW5nW2tleXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXT0gZ2V0U3RyaW5nKGtleXNbaV0pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcm1hdHRlZFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgYXJnKSB7Ci0JCXJldHVybiBnZXRGb3JtYXR0ZWRTdHJpbmcoa2V5LCBuZXcgT2JqZWN0W10geyBhcmcgfSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcm1hdHRlZFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7CQotCX0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvUmVuYW1lRW5hYmxlbWVudFRlc3Rlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1JlbmFtZUVuYWJsZW1lbnRUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzMDhlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvUmVuYW1lRW5hYmxlbWVudFRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3I7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLQotcHVibGljIGNsYXNzIFJlbmFtZUVuYWJsZW1lbnRUZXN0ZXIgZXh0ZW5kcyBSZWZhY3RvckVuYWJsZW1lbnRUZXN0ZXIKLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuRW5hYmxlKFhTRENvbmNyZXRlQ29tcG9uZW50IHNlbGVjdGVkT2JqZWN0LCBYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgaWYgKHNlbGVjdGVkT2JqZWN0ID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFhTRE5hbWVkQ29tcG9uZW50IHNlbGVjdGVkQ29tcG9uZW50ID0gbnVsbDsKLSAgICBib29sZWFuIGVuYWJsZSA9IGZhbHNlOwotCi0gICAgWFNEU2NoZW1hIHNlbGVjdGVkQ29tcG9uZW50U2NoZW1hID0gbnVsbDsKLSAgICBzZWxlY3RlZENvbXBvbmVudFNjaGVtYSA9IHNlbGVjdGVkT2JqZWN0LmdldFNjaGVtYSgpOwotICAgIGlmIChzZWxlY3RlZENvbXBvbmVudFNjaGVtYSAhPSBudWxsICYmIHNlbGVjdGVkQ29tcG9uZW50U2NoZW1hID09IHNjaGVtYSkKLSAgICB7Ci0gICAgICBlbmFibGUgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChlbmFibGUgJiYgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICB7Ci0gICAgICBzZWxlY3RlZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudClzZWxlY3RlZE9iamVjdDsKLQotICAgICAgaWYgKHNlbGVjdGVkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pc2VsZWN0ZWRDb21wb25lbnQ7Ci0gICAgICAgIGlmIChlbGVtZW50LmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChzZWxlY3RlZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gKFhTRFR5cGVEZWZpbml0aW9uKXNlbGVjdGVkQ29tcG9uZW50OwotICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSB0eXBlLmdldENvbnRhaW5lcigpOwotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcmVudDsKLSAgICAgICAgICBpZiAoZWxlbWVudC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpLmVxdWFscyh0eXBlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbilwYXJlbnQ7Ci0gICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKS5lcXVhbHModHlwZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9UZXh0Q2hhbmdlTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1RleHRDaGFuZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYzUzZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1RleHRDaGFuZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci0KLS8qKgotICogQSA8Y29kZT5UZXh0Q2hhbmdlTWFuYWdlcjwvY29kZT4gbWFuYWdlcyBhc3NvY2lhdGlvbnMgYmV0d2VlbiA8Y29kZT5JRmlsZTwvY29kZT4gYW5kIDxjb2RlPlRleHRDaGFuZ2U8L2NvZGU+IG9iamVjdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0Q2hhbmdlTWFuYWdlciB7Ci0JCi0JcHJpdmF0ZSBNYXAgZk1hcD0gbmV3IEhhc2hNYXAoMTApOyAvLyBJRmlsZSAtPiBUZXh0Q2hhbmdlCi0JCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZLZWVwRXhlY3V0ZWRUZXh0RWRpdHM7Ci0JCi0JcHVibGljIFRleHRDaGFuZ2VNYW5hZ2VyKCkgewotCQl0aGlzKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dENoYW5nZU1hbmFnZXIoYm9vbGVhbiBrZWVwRXhlY3V0ZWRUZXh0RWRpdHMpIHsKLQkJZktlZXBFeGVjdXRlZFRleHRFZGl0cz0ga2VlcEV4ZWN1dGVkVGV4dEVkaXRzOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIGdpdmVuIGZpbGUgYW5kIHRoZSBwYXNzZWQKLQkgKiBjaGFuZ2UgdG8gdGhpcyBtYW5hZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIChrZXkpCi0JICogQHBhcmFtIGNoYW5nZSB0aGUgY2hhbmdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIG1hbmFnZShJRmlsZSBmaWxlLCBUZXh0Q2hhbmdlIGNoYW5nZSkgewotCQlmTWFwLnB1dChmaWxlLCBjaGFuZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5UZXh0Q2hhbmdlPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZpbGUuCi0JICogSWYgdGhlIG1hbmFnZXIgZG9lcyBub3QgYWxyZWFkeSBtYW5hZ2UgYW4gYXNzb2NpYXRpb24gaXQgY3JlYXRlcyBhIG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSBmb3Igd2hpY2ggdGhlIHRleHQgYnVmZmVyIGNoYW5nZSBpcyByZXF1ZXN0ZWQKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IGNoYW5nZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZpbGUuIAotCSAqLwotCXB1YmxpYyBUZXh0Q2hhbmdlIGdldChJRmlsZSBmaWxlKSB7Ci0JCVRleHRDaGFuZ2UgcmVzdWx0PSAoVGV4dENoYW5nZSlmTWFwLmdldChmaWxlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQ9IG5ldyBUZXh0RmlsZUNoYW5nZShmaWxlLnRvU3RyaW5nKCksIGZpbGUpOwotCQkJcmVzdWx0LnNldEtlZXBQcmV2aWV3RWRpdHMoZktlZXBFeGVjdXRlZFRleHRFZGl0cyk7Ci0JCQlyZXN1bHQuaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJZk1hcC5wdXQoZmlsZSwgcmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSA8dHQ+VGV4dENoYW5nZTwvdHQ+IG1hbmFnZWQgdW5kZXIgdGhlIGdpdmVuIGtleQotCSAqIDxjb2RlPnVuaXQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtIHVuaXQgdGhlIGtleSBkZXRlcm1pbmluZyB0aGUgPHR0PlRleHRDaGFuZ2U8L3R0PiB0byBiZSByZW1vdmVkLgotCSAqIEByZXR1cm4gdGhlIHJlbW92ZWQgPHR0PlRleHRDaGFuZ2U8L3R0Pi4KLQkgKi8KLQlwdWJsaWMgVGV4dENoYW5nZSByZW1vdmUoSUZpbGUgdW5pdCkgewotCQlyZXR1cm4gKFRleHRDaGFuZ2UpZk1hcC5yZW1vdmUodW5pdCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRleHQgY2hhbmdlcyBtYW5hZ2VkIGJ5IHRoaXMgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBhbGwgdGV4dCBjaGFuZ2VzIG1hbmFnZWQgYnkgdGhpcyBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBUZXh0Q2hhbmdlW10gZ2V0QWxsQ2hhbmdlcygpewotCQlyZXR1cm4gKFRleHRDaGFuZ2VbXSlmTWFwLnZhbHVlcygpLnRvQXJyYXkobmV3IFRleHRDaGFuZ2VbZk1hcC52YWx1ZXMoKS5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBmaWxlcyBtYW5hZ2VkIGJ5IHRoaXMgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBhbGwgZmlsZXMgbWFuYWdlZCBieSB0aGlzIGluc3RhbmNlCi0JICovCQotCXB1YmxpYyBJRmlsZVtdIGdldEFsbENvbXBpbGF0aW9uVW5pdHMoKXsKLQkJcmV0dXJuIChJRmlsZVtdKSBmTWFwLmtleVNldCgpLnRvQXJyYXkobmV3IElGaWxlW2ZNYXAua2V5U2V0KCkuc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIENsZWFycyBhbGwgYXNzb2NpYXRpb25zIGJldHdlZW4gcmVzb3VyY2VzIGFuZCB0ZXh0IGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWZNYXAuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGlmIGFueSB0ZXh0IGNoYW5nZXMgYXJlIG1hbmFnZWQgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW55IHRleHQgY2hhbmdlcyBhcmUgbWFuYWdlZCBmb3IgdGhlIHNwZWNpZmllZCBmaWxlIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0NoYW5nZXNJbihJRmlsZSBmaWxlKXsKLQkJcmV0dXJuIGZNYXAuY29udGFpbnNLZXkoZmlsZSk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9YTUxSZWZhY3RvcmluZ0NvbXBvbmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1hNTFJlZmFjdG9yaW5nQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNzc5YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1hNTFJlZmFjdG9yaW5nQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFhNTFJlZmFjdG9yaW5nQ29tcG9uZW50IGltcGxlbWVudHMgUmVmYWN0b3JpbmdDb21wb25lbnQKLXsKLQkvLyBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IGJlaW5nIHJlZmFjdG9yZWQKLQlTdHJpbmcgbmFtZTsKLQkKLQkvLyBUaGUgbmFtZXNwYWNlIGluIHdoaWNoIGNvbXBvbmVudCBpcyBkZWZpbmVkLCBlLmcuIFhNTCBvciBXU0RMIHRhcmdldCBuYW1lc3BhY2UKLQlTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOwotCQotCS8vIE9wdGlvbmFsIG1vZGVsIG9iamVjdCB0aGF0IGlzIHJlZmFjdG9yZWQKLQlPYmplY3QgbW9kZWw7Ci0JCi0JLy8gU0VEIERPTSBvYmplY3QgdGhhdCB1bmRlcmxpbmVzIHRoZSBjb21wb25lbnQgYmVpbmcgcmVmYWN0b3JlZAotCUlET01FbGVtZW50IGRvbUVsZW1lbnQ7Ci0KLQlwdWJsaWMgWE1MUmVmYWN0b3JpbmdDb21wb25lbnQoT2JqZWN0IG1vZGVsT2JqZWN0LCBJRE9NRWxlbWVudCBkb21FbGVtZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWVzcGFjZSkKLQl7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbE9iamVjdDsKLQkJdGhpcy5kb21FbGVtZW50ID0gZG9tRWxlbWVudDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy50YXJnZXROYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JCQotCQkKLQl9Ci0JCi0JcHVibGljIFhNTFJlZmFjdG9yaW5nQ29tcG9uZW50KElET01FbGVtZW50IGRvbUVsZW1lbnQsIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZXNwYWNlKQotCXsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kb21FbGVtZW50ID0gZG9tRWxlbWVudDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy50YXJnZXROYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNb2RlbE9iamVjdCgpCi0JewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIElET01FbGVtZW50IGdldEVsZW1lbnQoKQotCXsKLQkJcmV0dXJuIGRvbUVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpCi0JewotCQlyZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotCX0KLQotCQotCXB1YmxpYyBRdWFsaWZpZWROYW1lIGdldFR5cGVRTmFtZSgpCi0JewotCQlyZXR1cm4gbmV3IFF1YWxpZmllZE5hbWUoZG9tRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSwgZG9tRWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvTWFrZUFub255bW91c1R5cGVHbG9iYWxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL01ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MTQ3NjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvTWFrZUFub255bW91c1R5cGVHbG9iYWxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5oYW5kbGVycy5NYWtlQW5vbnltb3VzVHlwZUdvYmFsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnN0cnVjdHVyZS5NYWtlQW5vbnltb3VzVHlwZUdsb2JhbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5zdHJ1Y3R1cmUuTWFrZVR5cGVHbG9iYWxQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZW5hbWVSZWZhY3RvcmluZ1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE1ha2VBbm9ueW1vdXNUeXBlR29iYWxIYW5kbGVyfQotICovCi1wdWJsaWMgY2xhc3MgTWFrZUFub255bW91c1R5cGVHbG9iYWxBY3Rpb24gZXh0ZW5kcyBYU0RTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiB7Ci0KLQlwcml2YXRlIFN0cmluZyBmUGFyZW50TmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNDb21wbGV4VHlwZSA9IHRydWU7Ci0JcHJpdmF0ZSBYU0RUeXBlRGVmaW5pdGlvbiBmU2VsZWN0ZWRDb21wb25lbnQ7Ci0JCi0JcHVibGljIE1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBYU0RTY2hlbWEgc2NoZW1hKSB7Ci0JCXN1cGVyKHNlbGVjdGlvbiwgc2NoZW1hKTsKLQkJc2V0VGV4dChSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLk1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uX3RleHQpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhblJ1bigpIHsKLQotCQlyZXR1cm4gZlNlbGVjdGVkQ29tcG9uZW50ICE9IG51bGw7Ci0JfQotCQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmV3RGVmYXVsdE5hbWUoKXsKLQkJaWYoZlBhcmVudE5hbWUgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGZQYXJlbnROYW1lKSl7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKGlzQ29tcGxleFR5cGUpewotCQkJCXJldHVybiBmUGFyZW50TmFtZSArICJDb21wbGV4VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2V7Ci0JCQkJcmV0dXJuIGZQYXJlbnROYW1lICsgIlNpbXBsZVR5cGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZXsKLQkJCWlmKGlzQ29tcGxleFR5cGUpewotCQkJCXJldHVybiAiTmV3Q29tcGxleFR5cGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlewotCQkJCXJldHVybiAiTmV3U2ltcGxlVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkKLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGNhbkVuYWJsZShYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wb25lbnQpewotCQlpZiAoeHNkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB7Ci0JCQlmU2VsZWN0ZWRDb21wb25lbnQgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXhzZENvbXBvbmVudDsKLQkJCWlzQ29tcGxleFR5cGUgPSB0cnVlOwotCQkJWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB4c2RDb21wb25lbnQ7Ci0JCQlYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSB0eXBlRGVmLmdldENvbnRhaW5lcigpOwotCQkJaWYocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKXsKLQkJCQlmUGFyZW50TmFtZSA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcmVudCkuZ2V0TmFtZSgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IAotCQllbHNlIGlmICh4c2RDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbil7Ci0JCQlmU2VsZWN0ZWRDb21wb25lbnQgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24peHNkQ29tcG9uZW50OwotCQkJaXNDb21wbGV4VHlwZSA9IGZhbHNlOwotCQkJWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZURlZiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgeHNkQ29tcG9uZW50OwotCQkJWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gdHlwZURlZi5nZXRDb250YWluZXIoKTsKLQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbil7Ci0JCQkJZlBhcmVudE5hbWUgPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJlbnQpLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pewotCQkJCWZQYXJlbnROYW1lID0gKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbilwYXJlbnQpLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoT2JqZWN0IHNlbGVjdGVkT2JqZWN0KSB7Ci0JCQotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkgewotCQkJcmV0dXJuIGNhbkVuYWJsZSgoWFNEQ29uY3JldGVDb21wb25lbnQpc2VsZWN0ZWRPYmplY3QpICYmIHN1cGVyLmNhbkVuYWJsZShzZWxlY3RlZE9iamVjdCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQlYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IGdldFNjaGVtYSgpLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQobm9kZSk7Ci0JCQlyZXR1cm4gY2FuRW5hYmxlKGNvbmNyZXRlQ29tcG9uZW50KSAmJiBzdXBlci5jYW5FbmFibGUoY29uY3JldGVDb21wb25lbnQpOwotCQkKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bjEoKSB7Ci0JCQotCQlpZihmU2VsZWN0ZWRDb21wb25lbnQgPT0gbnVsbCl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmKGZTZWxlY3RlZENvbXBvbmVudC5nZXRTY2hlbWEoKSA9PSBudWxsKXsKLQkJCWdldFNjaGVtYSgpLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0JCX0KLQkJTWFrZVR5cGVHbG9iYWxQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IE1ha2VUeXBlR2xvYmFsUHJvY2Vzc29yKGZTZWxlY3RlZENvbXBvbmVudCwgZ2V0TmV3RGVmYXVsdE5hbWUoKSk7Ci0JCVJlbmFtZVJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nID0gbmV3IFJlbmFtZVJlZmFjdG9yaW5nKHByb2Nlc3Nvcik7Ci0JCXRyeSB7Ci0JCQlSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBuZXcgUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQoCi0JCQkJCXJlZmFjdG9yaW5nLAotCQkJCQlSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUNvbXBvbmVudFdpemFyZF9kZWZhdWx0UGFnZVRpdGxlLCAvLyBUT0RPOiBwcm92aWRlIGNvcnJlY3Qgc3RyaW5ncwotCQkJCQlSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUNvbXBvbmVudFdpemFyZF9pbnB1dFBhZ2VfZGVzY3JpcHRpb24sIG51bGwpOwotCQkJUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uIG9wPSBuZXcgUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uKHdpemFyZCk7Ci0JCQlvcC5ydW4oWFNERWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIHdpemFyZC5nZXREZWZhdWx0UGFnZVRpdGxlKCkpOwotCQkJLy90cmlnZ2VyQnVpbGQoKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gZG8gbm90aGluZy4gVXNlciBhY3Rpb24gZ290IGNhbmNlbGxlZAotCQl9Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJaWYoZlNlbGVjdGVkQ29tcG9uZW50ID09IG51bGwpewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZihmU2VsZWN0ZWRDb21wb25lbnQuZ2V0U2NoZW1hKCkgPT0gbnVsbCl7Ci0JCQlnZXRTY2hlbWEoKS51cGRhdGVFbGVtZW50KHRydWUpOwotCQl9Ci0JCURvY3VtZW50SW1wbCBkb2MgPSAoRG9jdW1lbnRJbXBsKSBmU2VsZWN0ZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJZG9jLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcoCi0JCQkJCQl0aGlzLAotCQkJCQkJUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5NYWtlQW5vbnltb3VzVHlwZUdsb2JhbEFjdGlvbl90ZXh0KTsKLQkJTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kKAotCQkJCWZTZWxlY3RlZENvbXBvbmVudCwgZ2V0TmV3RGVmYXVsdE5hbWUoKSk7Ci0JCWNvbW1hbmQucnVuKCk7Ci0JCWRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0JCi0JCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL01ha2VMb2NhbEVsZW1lbnRHbG9iYWxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL01ha2VMb2NhbEVsZW1lbnRHbG9iYWxBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlkODc3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9NYWtlTG9jYWxFbGVtZW50R2xvYmFsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmhhbmRsZXJzLk1ha2VMb2NhbEVsZW1lbnRHbG9iYWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iuc3RydWN0dXJlLk1ha2VMb2NhbEVsZW1lbnRHbG9iYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE1ha2VMb2NhbEVsZW1lbnRHbG9iYWxIYW5kbGVyfQotICovCi1wdWJsaWMgY2xhc3MgTWFrZUxvY2FsRWxlbWVudEdsb2JhbEFjdGlvbiBleHRlbmRzIFhTRFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHsKLQotCVhTREVsZW1lbnREZWNsYXJhdGlvbiBmU2VsZWN0ZWRDb21wb25lbnQ7Ci0KLQlwdWJsaWMgTWFrZUxvY2FsRWxlbWVudEdsb2JhbEFjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbiwgWFNEU2NoZW1hIHNjaGVtYSkgewotCQlzdXBlcihzZWxlY3Rpb24sIHNjaGVtYSk7Ci0JCXNldFRleHQoUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIk1ha2VMb2NhbEVsZW1lbnRHbG9iYWxBY3Rpb24udGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW4oKSB7Ci0KLQkJcmV0dXJuIGZTZWxlY3RlZENvbXBvbmVudCAhPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhbkVuYWJsZShYU0RDb25jcmV0ZUNvbXBvbmVudCBzZWxlY3RlZE9iamVjdCkgewotCi0JCWZTZWxlY3RlZENvbXBvbmVudCA9IG51bGw7Ci0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBzZWxlY3RlZE9iamVjdDsKLQkJCWlmICghZWxlbWVudC5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpICYmICFlbGVtZW50LmlzR2xvYmFsKCkpIHsKLQkJCQlmU2VsZWN0ZWRDb21wb25lbnQgPSBlbGVtZW50OwotCQkJfQotCQl9IAotCQlyZXR1cm4gY2FuUnVuKCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBib29sZWFuIGNhbkVuYWJsZShPYmplY3Qgc2VsZWN0ZWRPYmplY3QpIHsKLQkJCi0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gY2FuRW5hYmxlKChYU0RDb25jcmV0ZUNvbXBvbmVudClzZWxlY3RlZE9iamVjdCkgJiYgc3VwZXIuY2FuRW5hYmxlKHNlbGVjdGVkT2JqZWN0KTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBzZWxlY3RlZE9iamVjdDsKLQkJCVhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gZ2V0U2NoZW1hKCkKLQkJCQkJLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQobm9kZSk7Ci0JCQlyZXR1cm4gY2FuRW5hYmxlKGNvbmNyZXRlQ29tcG9uZW50KSAmJiBzdXBlci5jYW5FbmFibGUoY29uY3JldGVDb21wb25lbnQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQkJCi0JfQotCi0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURvY3VtZW50SW1wbCBkb2MgPSAoRG9jdW1lbnRJbXBsKSBmU2VsZWN0ZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpCi0JCQkJLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJZG9jLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgZ2V0VGV4dCgpKTsKLQkJTWFrZUxvY2FsRWxlbWVudEdsb2JhbENvbW1hbmQgY29tbWFuZCA9IG5ldyBNYWtlTG9jYWxFbGVtZW50R2xvYmFsQ29tbWFuZCgKLQkJCQlmU2VsZWN0ZWRDb21wb25lbnQpOwotCQljb21tYW5kLnJ1bigpOwotCQlkb2MuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWQyZmI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlczsKLQotCi0KLS8qKgotKiBSZW5hbWVzIGEgWE1MIFNjaGVtYSBlbGVtZW50IG9yIHdvcmtiZW5jaCByZXNvdXJjZS4KLSogPHA+Ci0qIEFjdGlvbiBpcyBhcHBsaWNhYmxlIHRvIHNlbGVjdGlvbnMgY29udGFpbmluZyBlbGVtZW50cyBvZiB0eXBlCi0qIDxjb2RlPjwvY29kZT4gb3IgPGNvZGU+SVJlc291cmNlPC9jb2RlPi4KLSogCi0qIDxwPgotKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotKiA8L3A+Ci0KLSovCi1wdWJsaWMgY2xhc3MgUmVuYW1lQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gIHsKLQotCXByaXZhdGUgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gcmVuYW1lQ29tcG9uZW50QWN0aW9uOwotCXByaXZhdGUgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gcmVuYW1lUmVzb3VyY2VBY3Rpb247Ci0JCi0JCi0JcHVibGljIFJlbmFtZUFjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcihzZWxlY3Rpb24pOwotCQlzZXRUZXh0KFJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuUmVuYW1lQWN0aW9uX3RleHQpOyAKLQkJcmVuYW1lUmVzb3VyY2VBY3Rpb249IG5ldyBSZW5hbWVSZXNvdXJjZUFjdGlvbihzZWxlY3Rpb24pOwotCQlyZW5hbWVSZXNvdXJjZUFjdGlvbi5zZXRUZXh0KGdldFRleHQoKSk7Ci0JCQotCX0KLQlwdWJsaWMgUmVuYW1lQWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBPYmplY3QgbW9kZWwpIHsKLQkJc3VwZXIoc2VsZWN0aW9uKTsKLQkJc2V0VGV4dChSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUFjdGlvbl90ZXh0KTsKLQkJcmVuYW1lQ29tcG9uZW50QWN0aW9uPSBuZXcgUmVuYW1lQ29tcG9uZW50QWN0aW9uKHNlbGVjdGlvbiwgbW9kZWwpOwotCQlyZW5hbWVDb21wb25lbnRBY3Rpb24uc2V0VGV4dChnZXRUZXh0KCkpOwotCQlyZW5hbWVSZXNvdXJjZUFjdGlvbj0gbmV3IFJlbmFtZVJlc291cmNlQWN0aW9uKHNlbGVjdGlvbik7Ci0JCXJlbmFtZVJlc291cmNlQWN0aW9uLnNldFRleHQoZ2V0VGV4dCgpKTsKLQkJCi0JfQotCQotCi0JCi0JLyoKLQkgKiBAc2VlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJcmVuYW1lQ29tcG9uZW50QWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQlpZiAocmVuYW1lUmVzb3VyY2VBY3Rpb24gIT0gbnVsbCkKLQkJCXJlbmFtZVJlc291cmNlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQlzZXRFbmFibGVkKGNvbXB1dGVFbmFibGVkU3RhdGUoKSk7CQkKLQl9Ci0KLQkvKgotCSAqIEBzZWUgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24jdXBkYXRlKElTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmKHJlbmFtZUNvbXBvbmVudEFjdGlvbiAhPSBudWxsKXsKLQkJCXJlbmFtZUNvbXBvbmVudEFjdGlvbi51cGRhdGUoc2VsZWN0aW9uKTsKLQkJfQotCQlpZiAocmVuYW1lUmVzb3VyY2VBY3Rpb24gIT0gbnVsbCkKLQkJCXJlbmFtZVJlc291cmNlQWN0aW9uLnVwZGF0ZShzZWxlY3Rpb24pOwotCQlzZXRFbmFibGVkKGNvbXB1dGVFbmFibGVkU3RhdGUoKSk7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNvbXB1dGVFbmFibGVkU3RhdGUoKXsKLQkJaWYgKHJlbmFtZVJlc291cmNlQWN0aW9uICE9IG51bGwpIHsKLQkJCXJldHVybiByZW5hbWVDb21wb25lbnRBY3Rpb24uaXNFbmFibGVkKCkgfHwgcmVuYW1lUmVzb3VyY2VBY3Rpb24uaXNFbmFibGVkKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcmVuYW1lQ29tcG9uZW50QWN0aW9uLmlzRW5hYmxlZCgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHJlbmFtZUNvbXBvbmVudEFjdGlvbiAhPSBudWxsICYmIHJlbmFtZUNvbXBvbmVudEFjdGlvbi5pc0VuYWJsZWQoKSkKLQkJCXJlbmFtZUNvbXBvbmVudEFjdGlvbi5ydW4oc2VsZWN0aW9uKTsKLQkJaWYgKHJlbmFtZVJlc291cmNlQWN0aW9uICE9IG51bGwgJiYgcmVuYW1lUmVzb3VyY2VBY3Rpb24uaXNFbmFibGVkKCkpCi0JCQlyZW5hbWVSZXNvdXJjZUFjdGlvbi5ydW4oc2VsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChyZW5hbWVDb21wb25lbnRBY3Rpb24gIT0gbnVsbCAmJiByZW5hbWVDb21wb25lbnRBY3Rpb24uY2FuUnVuKCkpCi0JCQlyZW5hbWVDb21wb25lbnRBY3Rpb24ucnVuKHNlbGVjdGlvbik7Ci0JCWVsc2UKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKFhTREVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCBSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUFjdGlvbl9yZW5hbWUsIFJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuUmVuYW1lQWN0aW9uX3VuYXZhaWxhYmxlKTsgIAotCX0KLQlwdWJsaWMgdm9pZCBydW4oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkgICAgaWYoc2VsZWN0aW9uID09IG51bGwpewotCSAgICAJc3VwZXIucnVuKCk7Ci0JICAgIH0KLQkgICAgZWxzZXsKLQkgICAgCXN1cGVyLnJ1bihzZWxlY3Rpb24pOwotCSAgICB9Ci0JCQotCX0KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRSZW5hbWVDb21wb25lbnRBY3Rpb24oCi0JCQlTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiByZW5hbWVDb21wb25lbnRBY3Rpb24pCi0JewotCQl0aGlzLnJlbmFtZUNvbXBvbmVudEFjdGlvbiA9IHJlbmFtZUNvbXBvbmVudEFjdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVDb21wb25lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZUNvbXBvbmVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDQ0N2VmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZUNvbXBvbmVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVSZWZhY3RvcmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkdsb2JhbEJ1aWxkQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9ncy5TYXZlRGlydHlGaWxlc0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5YTUxSZWZhY3RvcmluZ0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmhhbmRsZXJzLlJlbmFtZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFJlbmFtZUhhbmRsZXJ9IAotICovCi1wdWJsaWMgY2xhc3MgUmVuYW1lQ29tcG9uZW50QWN0aW9uIGV4dGVuZHMgWFNEU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gewotCi0JcHJpdmF0ZSBYU0ROYW1lZENvbXBvbmVudCBzZWxlY3RlZENvbXBvbmVudDsKLQotCXB1YmxpYyBSZW5hbWVDb21wb25lbnRBY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sCi0JCQlPYmplY3QgYU1vZGVsKSB7Ci0JCXN1cGVyKHNlbGVjdGlvbiwgYU1vZGVsKTsKLQkKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoWFNEQ29uY3JldGVDb21wb25lbnQgc2VsZWN0ZWRPYmplY3QpIHsKLQotCQlzZWxlY3RlZENvbXBvbmVudCA9IG51bGw7Ci0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KSB7Ci0JCQlzZWxlY3RlZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudCkgc2VsZWN0ZWRPYmplY3Q7Ci0KLQkJCS8vIGlmIGl0J3MgZWxlbWVudCByZWZlcmVuY2UsIHRoZW4gdGhpcyBhY3Rpb24gaXMgbm90IGFwcHJvcHJpYXRlCi0JCQlpZiAoc2VsZWN0ZWRDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQlYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHNlbGVjdGVkQ29tcG9uZW50OwotCQkJCWlmIChlbGVtZW50LmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpIHsKLQkJCQkJc2VsZWN0ZWRDb21wb25lbnQgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWlmKHNlbGVjdGVkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pewotCQkJCVhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoWFNEVHlwZURlZmluaXRpb24pIHNlbGVjdGVkQ29tcG9uZW50OwotCQkJCVhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IHR5cGUuZ2V0Q29udGFpbmVyKCk7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCQlYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHBhcmVudDsKLQkJCQkJaWYoZWxlbWVudC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpLmVxdWFscyh0eXBlKSl7Ci0JCQkJCQlzZWxlY3RlZENvbXBvbmVudCA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgewotCQkJCQlYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBwYXJlbnQ7Ci0JCQkJCWlmKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKS5lcXVhbHModHlwZSkpewotCQkJCQkJc2VsZWN0ZWRDb21wb25lbnQgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNhblJ1bigpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhbkVuYWJsZShPYmplY3Qgc2VsZWN0ZWRPYmplY3QpIHsKLQotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkgCi0JCXsKLQkJCXJldHVybiBjYW5FbmFibGUoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBzZWxlY3RlZE9iamVjdCkgJiYgc3VwZXIuY2FuRW5hYmxlKHNlbGVjdGVkT2JqZWN0KTsKLQkJfSBlbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIAotCQl7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQlpZiAoZ2V0U2NoZW1hKCkgIT0gbnVsbCkgCi0JCQl7Ci0JCQkJWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQgPSBnZXRTY2hlbWEoKQotCQkJCQkJLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQobm9kZSk7Ci0JCQkJcmV0dXJuIGNhbkVuYWJsZShjb25jcmV0ZUNvbXBvbmVudCkgJiYgc3VwZXIuY2FuRW5hYmxlKGNvbmNyZXRlQ29tcG9uZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW4oKSB7Ci0KLQkJcmV0dXJuIHNlbGVjdGVkQ29tcG9uZW50ICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lKCkgPT0gbnVsbCkgewotCQkJc2VsZWN0ZWRDb21wb25lbnQuc2V0TmFtZShuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChzZWxlY3RlZENvbXBvbmVudC5nZXRTY2hlbWEoKSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0U2NoZW1hKCkgIT0gbnVsbCkgewotCQkJCWdldFNjaGVtYSgpLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0JCQl9Ci0KLQkJfQotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiByYyA9IFNhdmVEaXJ0eUZpbGVzRGlhbG9nLnNhdmVEaXJ0eUZpbGVzKCk7Ci0gICAgICAgIGlmICghcmMpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gIAotICAgICAgICBSZWZhY3RvcmluZ0NvbXBvbmVudCBjb21wb25lbnQgPSBuZXcgWE1MUmVmYWN0b3JpbmdDb21wb25lbnQoCi0JCQkJc2VsZWN0ZWRDb21wb25lbnQsCi0JCQkJKElET01FbGVtZW50KXNlbGVjdGVkQ29tcG9uZW50LmdldEVsZW1lbnQoKSwgCi0JCQkJc2VsZWN0ZWRDb21wb25lbnQuZ2V0TmFtZSgpLAotCQkJCXNlbGVjdGVkQ29tcG9uZW50LmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCVJlbmFtZUNvbXBvbmVudFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yKAotCQkJCWNvbXBvbmVudCwgc2VsZWN0ZWRDb21wb25lbnQuZ2V0TmFtZSgpKTsKLQkJUmVuYW1lUmVmYWN0b3JpbmcgcmVmYWN0b3JpbmcgPSBuZXcgUmVuYW1lUmVmYWN0b3JpbmcocHJvY2Vzc29yKTsKLQkJdHJ5IHsKLQkJCVJlZmFjdG9yaW5nV2l6YXJkIHdpemFyZCA9IG5ldyBSZW5hbWVSZWZhY3RvcmluZ1dpemFyZCgKLQkJCQkJcmVmYWN0b3JpbmcsCi0JCQkJCVJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuUmVuYW1lQ29tcG9uZW50V2l6YXJkX2RlZmF1bHRQYWdlVGl0bGUsIAotCQkJCQlSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzCi0JCQkJCQkJLlJlbmFtZUNvbXBvbmVudFdpemFyZF9pbnB1dFBhZ2VfZGVzY3JpcHRpb24sIAotCQkJCQludWxsKTsKLQkJCVJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbiBvcCA9IG5ldyBSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24oCi0JCQkJCXdpemFyZCk7Ci0JCQlvcC5ydW4oWFNERWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIHdpemFyZAotCQkJCQkuZ2V0RGVmYXVsdFBhZ2VUaXRsZSgpKTsKLQkJCQotCQkJLy8gVE9ETyAoY3MpIEknbSBub3Qgc3VyZSB3aHkgd2UgbmVlZCB0byBkbyB0aGlzLiAgU2VlIGJ1ZyAxNDU3MDAKLQkJCS8vdHJpZ2dlckJ1aWxkKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcuIFVzZXIgYWN0aW9uIGdvdCBjYW5jZWxsZWQKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyaWdnZXJCdWlsZCgpIHsKLQkJaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXREZXNjcmlwdGlvbigpLmlzQXV0b0J1aWxkaW5nKCkpIHsKLQkJCW5ldyBHbG9iYWxCdWlsZEFjdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLAotCQkJCQlJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxEKS5ydW4oKTsKLQkJfQotCX0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVSZXNvdXJjZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lUmVzb3VyY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdkN2Q5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVSZXNvdXJjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVJlZmFjdG9yaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZS5SZW5hbWVSZXNvdXJjZVByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkOwotCi0KLQotcHVibGljIGNsYXNzIFJlbmFtZVJlc291cmNlQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gewotCi0KLQotCQotCXB1YmxpYyBSZW5hbWVSZXNvdXJjZUFjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCXN1cGVyKHNlbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVJlc291cmNlIGVsZW1lbnQ9IGdldFJlc291cmNlKHNlbGVjdGlvbik7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IgcHJvY2Vzc29yPSBuZXcgUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IoZWxlbWVudCk7Ci0JCQlzZXRFbmFibGVkKHByb2Nlc3Nvci5pc0FwcGxpY2FibGUoKSk7Ci0JCQkKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2Uoc2VsZWN0aW9uKTsKLQkJUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IgcHJvY2Vzc29yPSBuZXcgUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IocmVzb3VyY2UpOwotCi0JCQlpZighcHJvY2Vzc29yLmlzQXBwbGljYWJsZSgpKQotCQkJCXJldHVybjsKLQkJCVJlbmFtZVJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nPSBuZXcgUmVuYW1lUmVmYWN0b3JpbmcocHJvY2Vzc29yKTsKLQkJCXRyeSB7Ci0JCQkJUmVmYWN0b3JpbmdXaXphcmQgd2l6YXJkID0gbmV3IFJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkKAotCQkJCQkJcmVmYWN0b3JpbmcsCi0JCQkJCQlSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUNvbXBvbmVudFdpemFyZF9kZWZhdWx0UGFnZVRpdGxlLCAvL1RPRE86IHByb3ZpZGUgY29ycmVjdCBzdHJpbmdzCi0JCQkJCQlSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUNvbXBvbmVudFdpemFyZF9pbnB1dFBhZ2VfZGVzY3JpcHRpb24sIAotCQkJCQkJbnVsbCk7Ci0JCQkJUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uIG9wPSBuZXcgUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uKHdpemFyZCk7Ci0JCQkJb3AucnVuKFhTREVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCB3aXphcmQuZ2V0RGVmYXVsdFBhZ2VUaXRsZSgpKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nLiBVc2VyIGFjdGlvbiBnb3QgY2FuY2VsbGVkCi0JCQl9Ci0JCQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSVJlc291cmNlIGdldFJlc291cmNlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuIG51bGw7Ci0JCU9iamVjdCBmaXJzdD0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoISAoZmlyc3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSVJlc291cmNlKWZpcnN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lUmVzb3VyY2VBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lUmVzb3VyY2VBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDRhNWFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZVJlc291cmNlQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIEBhdXRob3IgZWJlbGlzYXJAY2EuaWJtLmNvbQotICovCi1wdWJsaWMgY2xhc3MgUmVuYW1lUmVzb3VyY2VBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0JCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIGZDdXJyZW50U2VsZWN0aW9uOwotCi0vLwlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IGZQYXJ0OwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlI3NldEFjdGl2ZVBhcnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLS8vCQlmUGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChmQ3VycmVudFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZDdXJyZW50U2VsZWN0aW9uOwotCQkJT2JqZWN0IGZpcnN0PSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKGZpcnN0IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlSZW5hbWVSZXNvdXJjZUFjdGlvbiByZW5hbWVBY3Rpb24gPSBuZXcgUmVuYW1lUmVzb3VyY2VBY3Rpb24oc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCQkJcmVuYW1lQWN0aW9uLnJ1bihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJCX0KLQkJfQotCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZkN1cnJlbnRTZWxlY3Rpb249IHNlbGVjdGlvbjsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZVRhcmdldE5hbWVzcGFjZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lVGFyZ2V0TmFtZXNwYWNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4Y2VlZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lVGFyZ2V0TmFtZXNwYWNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5HbG9iYWxCdWlsZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuUmVuYW1lVGFyZ2V0TmFtZXNwYWNlUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQ7Ci0KLXB1YmxpYyBjbGFzcyBSZW5hbWVUYXJnZXROYW1lc3BhY2VBY3Rpb24gZXh0ZW5kcyBYU0RTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiB7Ci0KLQlwdWJsaWMgUmVuYW1lVGFyZ2V0TmFtZXNwYWNlQWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLAotCQkJT2JqZWN0IGFNb2RlbCkgewotCQlzdXBlcihzZWxlY3Rpb24sIGFNb2RlbCk7Ci0JCXNldFRleHQoUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVUYXJnZXROYW1lc3BhY2VfdGV4dCk7Ci0KLQl9Ci0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhbkVuYWJsZShPYmplY3Qgc2VsZWN0ZWRPYmplY3QpIHsKLQotCQlyZXR1cm4gc3VwZXIuY2FuRW5hYmxlKHNlbGVjdGVkT2JqZWN0KTsKLQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW4oKSB7Ci0KLQkJcmV0dXJuIGdldFNjaGVtYSgpICE9IG51bGw7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBydW4oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQotCQkKLQkJUmVuYW1lVGFyZ2V0TmFtZXNwYWNlUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBSZW5hbWVUYXJnZXROYW1lc3BhY2VQcm9jZXNzb3IoZ2V0U2NoZW1hKCksIGdldFNjaGVtYSgpLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJUmVuYW1lUmVmYWN0b3JpbmcgcmVmYWN0b3JpbmcgPSBuZXcgUmVuYW1lUmVmYWN0b3JpbmcocHJvY2Vzc29yKTsKLQkJdHJ5IHsKLQkJCVJlZmFjdG9yaW5nV2l6YXJkIHdpemFyZCA9IG5ldyBSZW5hbWVSZWZhY3RvcmluZ1dpemFyZCgKLQkJCQkJcmVmYWN0b3JpbmcsCi0JCQkJCVJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuUmVuYW1lQ29tcG9uZW50V2l6YXJkX2RlZmF1bHRQYWdlVGl0bGUsLy9UT0RPOiBwcm92aWRlIGNvcnJlY3Qgc3RyaW5ncwotCQkJCQlSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUNvbXBvbmVudFdpemFyZF9pbnB1dFBhZ2VfZGVzY3JpcHRpb24sIAotCQkJCQludWxsKTsKLQkJCVJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbiBvcCA9IG5ldyBSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24oCi0JCQkJCXdpemFyZCk7Ci0JCQlvcC5ydW4oWFNERWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIHdpemFyZAotCQkJCQkuZ2V0RGVmYXVsdFBhZ2VUaXRsZSgpKTsKLQkJCXRyaWdnZXJCdWlsZCgpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkbyBub3RoaW5nLiBVc2VyIGFjdGlvbiBnb3QgY2FuY2VsbGVkCi0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmlnZ2VyQnVpbGQoKSB7Ci0JCWlmIChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKS5pc0F1dG9CdWlsZGluZygpKSB7Ci0JCQluZXcgR2xvYmFsQnVpbGRBY3Rpb24oWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSwKLQkJCQkJSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCkucnVuKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1NlbGVjdGlvbkRpc3BhdGNoQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9TZWxlY3Rpb25EaXNwYXRjaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTJhYWNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1NlbGVjdGlvbkRpc3BhdGNoQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotCi0KLQotLyoqCi0gKiBBY3Rpb24gdGhhdCBkaXNwYXRjaGVzIHRoZSA8Y29kZT5JQWN0aW9uI3J1bigpPC9jb2RlPiBhbmQgdGhlIAotICogPGNvZGU+SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkPC9jb2RlPiAKLSAqIGFjY29yZGluZyB0byB0aGUgdHlwZSBvZiB0aGUgc2VsZWN0aW9uLiAKLSAqIAotICogPHVsPgotICogCTxsaT5pZiBzZWxlY3Rpb24gaXMgb2YgdHlwZSA8Y29kZT5JVGV4dFNlbGVjdGlvbjwvY29kZT4gdGhlbgotICogCTxjb2RlPnJ1bihJVGV4dFNlbGVjdGlvbik8L2NvZGU+IGFuZCA8Y29kZT5zZWxlY3Rpb25DaGFuZ2VkKElUZXh0U2VsZWN0aW9uKTwvY29kZT4KLSAqIAlpcyBjYWxsZWQuPC9saT4gCi0gKiAJPGxpPmlmIHNlbGVjdGlvbiBpcyBvZiB0eXBlIDxjb2RlPklTdHJ1Y3R1cmVkU2VsZWN0aW9uPC9jb2RlPiB0aGVuCi0gKiAJPGNvZGU+cnVuKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKTwvY29kZT4gYW5kIDxjb2RlPgotICogCXNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24pPC9jb2RlPiBpcyBjYWxsZWQuPC9saT4KLSAqIAk8bGk+ZGVmYXVsdCBpcyB0byBjYWxsIDxjb2RlPnJ1bihJU2VsZWN0aW9uKTwvY29kZT4gYW5kIDxjb2RlPgotICogCXNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbik8L2NvZGU+LjwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiA8cD4KLSAqIGFkYXB0ZWQgZnJvbSA8Y29kZT5vcmcuZWNsaXBzZS5qZHQudWkuYWN0aW9ucy5TZWxlY3Rpb25EaXNwYXRjaEFjdGlvbjwvY29kZT4KLSAqIDwvcD4KLSAqICAgCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0JCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQkKLQlwcml2YXRlIE9iamVjdCBtb2RlbDsKLQkKLQlwcm90ZWN0ZWQgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChzZWxlY3Rpb24pOwotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0aW9uIHByb3ZpZGVkIGJ5IHRoZSBzaXRlIG93bmluZyB0aGlzIGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXRlJ3Mgc2VsZWN0aW9uCi0JICovCQotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgYWN0aW9uJ3MgZW5hYmxlbWVudCBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHNlbGVjdGlvbi4gVGhpcwotCSAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMgb25lIG9mIHRoZSA8Y29kZT5zZWxlY3Rpb25DaGFuZ2VkPC9jb2RlPgotCSAqIG1ldGhvZHMgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHRoZSBwYXNzZWQgc2VsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIHNlbGVjdGlvbiB0aGlzIGFjdGlvbiBpcyB3b3JraW5nIG9uCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWRpc3BhdGNoU2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgYWN0aW9uIHRoYXQgdGhlIGdpdmVuIHN0cnVjdHVyZWQgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLiBUaGlzIGRlZmF1bHQKLQkgKiBpbXBsZW1lbnRhdGlvbiBjYWxscyA8Y29kZT5zZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24gc2VsZWN0aW9uKTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgbmV3IHNlbGVjdGlvbgotIAkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJc2V0RW5hYmxlZChjYW5FbmFibGUob2JqZWN0KSk7Ci0JCX0KLQkJZWxzZXsKLQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGNhbkVuYWJsZShPYmplY3Qgc2VsZWN0ZWRPYmplY3QpewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhpcyBhY3Rpb25zIHdpdGggdGhlIGdpdmVuIHN0cnVjdHVyZWQgc2VsZWN0aW9uLiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLQkgKiBjYWxscyA8Y29kZT5ydW4oSVNlbGVjdGlvbiBzZWxlY3Rpb24pPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJ1bigoSVNlbGVjdGlvbilzZWxlY3Rpb24pOwotCX0KLQotCQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgYWN0aW9uIHRoYXQgdGhlIGdpdmVuIHRleHQgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLiAgVGhpcyBkZWZhdWx0Ci0JICogaW1wbGVtZW50YXRpb24gY2FsbHMgPGNvZGU+c2VsZWN0aW9uQ2hhbmdlZChJU2VsZWN0aW9uIHNlbGVjdGlvbik8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIG5ldyBzZWxlY3Rpb24KLSAJICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0aW9uQ2hhbmdlZCgoSVNlbGVjdGlvbilzZWxlY3Rpb24pOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlcyB0aGlzIGFjdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gdGV4dCBzZWxlY3Rpb24uIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotCSAqIGNhbGxzIDxjb2RlPnJ1bihJU2VsZWN0aW9uIHNlbGVjdGlvbik8L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcnVuKChJU2VsZWN0aW9uKXNlbGVjdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgYWN0aW9uIHRoYXQgdGhlIGdpdmVuIHNlbGVjdGlvbiBoYXMgY2hhbmdlZC4gIFRoaXMgZGVmYXVsdAotCSAqIGltcGxlbWVudGF0aW9uIHNldHMgdGhlIGFjdGlvbidzIGVuYWJsZW1lbnQgc3RhdGUgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIG5ldyBzZWxlY3Rpb24KLSAJICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhpcyBhY3Rpb25zIHdpdGggdGhlIGdpdmVuIHNlbGVjdGlvbi4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0JICogZG9lcyBub3RoaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZGlzcGF0Y2hSdW4oZ2V0U2VsZWN0aW9uKCkpOwotCQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWRpc3BhdGNoU2VsZWN0aW9uQ2hhbmdlZChldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3BhdGNoU2VsZWN0aW9uQ2hhbmdlZChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCXNlbGVjdGlvbkNoYW5nZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbik7Ci0JCX0gZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCXNlbGVjdGlvbkNoYW5nZWQoKElUZXh0U2VsZWN0aW9uKXNlbGVjdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaFJ1bihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCXJ1bigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKTsKLQkJfSAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCXJ1bigoSVRleHRTZWxlY3Rpb24pc2VsZWN0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCXJ1bihzZWxlY3Rpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRNb2RlbCgpCi0JewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0TW9kZWwoT2JqZWN0IG1vZGVsKQotCXsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW4oKSB7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9YU0RSZWZhY3RvckFjdGlvbkdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9YU0RSZWZhY3RvckFjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNjlmMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvWFNEUmVmYWN0b3JBY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZWZhY3RvckFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBYU0RSZWZhY3RvckFjdGlvbkdyb3VwIGV4dGVuZHMgUmVmYWN0b3JBY3Rpb25Hcm91cCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFLRV9FTEVNRU5UX0dMT0JBTCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLm1ha2VFbGVtZW50R2xvYmFsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BS0VfVFlQRV9HTE9CQUwgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5tYWtlVHlwZUdsb2JhbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU5BTUVfRUxFTUVOVCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLnJlbmFtZS5lbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVOQU1FX1RBUkdFVF9OQU1FU1BDRSA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLnJlbmFtZVRhcmdldE5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gZk1ha2VMb2NhbEVsZW1lbnRHbG9iYWw7Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGZNYWtlTG9jYWxUeXBlR2xvYmFsOwotCi0JcHVibGljIFhTRFJlZmFjdG9yQWN0aW9uR3JvdXAoSVNlbGVjdGlvbiBzZWxlY3Rpb24sCi0JCQlYU0RTY2hlbWEgc2NoZW1hKSB7Ci0JCXN1cGVyKHNlbGVjdGlvbik7Ci0JCWZFZGl0b3JBY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmUmVuYW1lQWN0aW9uID0gbmV3IFJlbmFtZUFjdGlvbihzZWxlY3Rpb24sIHNjaGVtYSk7Ci0JCWZSZW5hbWVBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKFJFTkFNRV9FTEVNRU5UKTsKLQkJZkVkaXRvckFjdGlvbnMuYWRkKGZSZW5hbWVBY3Rpb24pOwotCi0JCS8vZlJlbmFtZVRhcmdldE5hbWVzcGFjZSA9IG5ldyBSZW5hbWVUYXJnZXROYW1lc3BhY2VBY3Rpb24oCi0JCS8vCQlzZWxlY3Rpb24sIHNjaGVtYSk7Ci0JCS8vZlJlbmFtZVRhcmdldE5hbWVzcGFjZS5zZXRBY3Rpb25EZWZpbml0aW9uSWQoUkVOQU1FX1RBUkdFVF9OQU1FU1BDRSk7Ci0JCS8vZkVkaXRvckFjdGlvbnMuYWRkKGZSZW5hbWVUYXJnZXROYW1lc3BhY2UpOwotCi0JCWZNYWtlTG9jYWxFbGVtZW50R2xvYmFsID0gbmV3IE1ha2VMb2NhbEVsZW1lbnRHbG9iYWxBY3Rpb24oCi0JCQkJc2VsZWN0aW9uLCBzY2hlbWEpOwotCQlmTWFrZUxvY2FsRWxlbWVudEdsb2JhbC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoTUFLRV9FTEVNRU5UX0dMT0JBTCk7Ci0JCWZFZGl0b3JBY3Rpb25zLmFkZChmTWFrZUxvY2FsRWxlbWVudEdsb2JhbCk7Ci0KLQkJZk1ha2VMb2NhbFR5cGVHbG9iYWwgPSBuZXcgTWFrZUFub255bW91c1R5cGVHbG9iYWxBY3Rpb24oCi0JCQkJc2VsZWN0aW9uLCBzY2hlbWEpOwotCQlmTWFrZUxvY2FsVHlwZUdsb2JhbC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoTUFLRV9UWVBFX0dMT0JBTCk7Ci0JCWZFZGl0b3JBY3Rpb25zLmFkZChmTWFrZUxvY2FsVHlwZUdsb2JhbCk7Ci0KLQkJaW5pdEFjdGlvbihmUmVuYW1lQWN0aW9uLCBzZWxlY3Rpb24pOwotCQkvL2luaXRBY3Rpb24oZlJlbmFtZVRhcmdldE5hbWVzcGFjZSwgc2VsZWN0aW9uKTsKLQkJaW5pdEFjdGlvbihmTWFrZUxvY2FsRWxlbWVudEdsb2JhbCwgc2VsZWN0aW9uKTsKLQkJaW5pdEFjdGlvbihmTWFrZUxvY2FsVHlwZUdsb2JhbCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotLy8JCWRpc3Bvc2VBY3Rpb24oZlJlbmFtZUFjdGlvbiwgc2VsZWN0aW9uKTsKLS8vCQlkaXNwb3NlQWN0aW9uKGZNYWtlTG9jYWxFbGVtZW50R2xvYmFsLCBzZWxlY3Rpb24pOwotLy8JCWRpc3Bvc2VBY3Rpb24oZk1ha2VMb2NhbFR5cGVHbG9iYWwsIHNlbGVjdGlvbik7Ci0vLwkJZGlzcG9zZUFjdGlvbihmUmVuYW1lVGFyZ2V0TmFtZXNwYWNlLCBzZWxlY3Rpb24pOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9YU0RSZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1hTRFJlZmFjdG9yR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDg3M2ZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1hTRFJlZmFjdG9yR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5JU2VsZWN0aW9uTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9ucy5YU0RSZWZhY3RvckFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlZmFjdG9yQWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlZmFjdG9yR3JvdXBTdWJNZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBYU0RSZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBSZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGUgewotCi0JcHVibGljIFhTRFJlZmFjdG9yR3JvdXBBY3Rpb25EZWxlZ2F0ZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgbWVudSB3aXRoIGFwcGxpY2FibGUgcmVmYWN0b3Igc3ViLW1lbnVlcwotCSAqIEBwYXJhbSBtZW51IFRoZSBtZW51IHRvIGZpbGwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsTWVudShNZW51IG1lbnUpIHsKLQkJaWYgKGZTZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh3b3JrYmVuY2hQYXJ0ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlID0gd29ya2JlbmNoUGFydC5nZXRTaXRlKCk7Ci0JCQlpZiAoc2l0ZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHNpdGUuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSllZGl0b3IuZ2V0QWRhcHRlcihYU0RTY2hlbWEuY2xhc3MpOwotICAgICAgICAgICAgICAgIElTZWxlY3Rpb25NYXBwZXIgbWFwcGVyID0gKElTZWxlY3Rpb25NYXBwZXIpZWRpdG9yLmdldEFkYXB0ZXIoSVNlbGVjdGlvbk1hcHBlci5jbGFzcyk7Ci0JCQkgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gbWFwcGVyICE9IG51bGwgPyBtYXBwZXIubWFwU2VsZWN0aW9uKGZTZWxlY3Rpb24pIDogZlNlbGVjdGlvbjsgICAgICAgICAgICAgICAgICAgIAotCQkJCQlSZWZhY3RvckFjdGlvbkdyb3VwIHJlZmFjdG9yTWVudUdyb3VwID0gbmV3IFhTRFJlZmFjdG9yQWN0aW9uR3JvdXAoc2VsZWN0aW9uLCBzY2hlbWEpOwotCQkJCQlSZWZhY3Rvckdyb3VwU3ViTWVudSBzdWJNZW51ID0gbmV3IFJlZmFjdG9yR3JvdXBTdWJNZW51KHJlZmFjdG9yTWVudUdyb3VwKTsKLQkJCQkJc3ViTWVudS5maWxsKG1lbnUsIC0xKTsKLQkJCQl9CQkJCQotCQkJfQotCQkKLQkJfQotCQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1hTRFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9YU0RTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTI4ZGY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1hTRFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTRFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24KLXsKLQotCQotCQotCXB1YmxpYyBYU0RTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbiwgT2JqZWN0IG1vZGVsKQotCXsKLQkJc3VwZXIoc2VsZWN0aW9uKTsKLQkJc2V0TW9kZWwobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCBYU0RTY2hlbWEgZ2V0U2NoZW1hKCl7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmKG1vZGVsIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotCQl7Ci0JCQlyZXR1cm4gKFhTRFNjaGVtYSkgbW9kZWw7Ci0JCX0KLQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGNhbkVuYWJsZShPYmplY3Qgc2VsZWN0ZWRDb21wb25lbnQpCi0JewotCQlYU0RTY2hlbWEgc2VsZWN0ZWRDb21wb25lbnRTY2hlbWEgPSBudWxsOwotCQlpZiAoc2VsZWN0ZWRDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLQkJewotCQkJc2VsZWN0ZWRDb21wb25lbnRTY2hlbWEgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KXNlbGVjdGVkQ29tcG9uZW50KS5nZXRTY2hlbWEoKTsKLQkJfQotCQkKLQkJaWYgKHNlbGVjdGVkQ29tcG9uZW50U2NoZW1hICE9IG51bGwgJiYgc2VsZWN0ZWRDb21wb25lbnRTY2hlbWEgPT0gZ2V0U2NoZW1hKCkgKQotCQl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvaGFuZGxlcnMvTWFrZUFub255bW91c1R5cGVHb2JhbEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9oYW5kbGVycy9NYWtlQW5vbnltb3VzVHlwZUdvYmFsSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmQ4MDg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9oYW5kbGVycy9NYWtlQW5vbnltb3VzVHlwZUdvYmFsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmhhbmRsZXJzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnN0cnVjdHVyZS5NYWtlQW5vbnltb3VzVHlwZUdsb2JhbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgTWFrZUFub255bW91c1R5cGVHb2JhbEhhbmRsZXIgZXh0ZW5kcyBSZWZhY3RvcmluZ0hhbmRsZXIKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgcGFyZW50TmFtZTsKLSAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcGxleFR5cGUgPSB0cnVlOwotCi0gIHB1YmxpYyBPYmplY3QgZG9FeGVjdXRlKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIE9iamVjdCBzZWxlY3RlZE9iamVjdCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgCi0gICAgICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0ZWRPYmplY3QgPSAoKFhTREJhc2VBZGFwdGVyKXNlbGVjdGVkT2JqZWN0KS5nZXRUYXJnZXQoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wID0gbnVsbDsKLQotICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpc2VsZWN0ZWRPYmplY3Q7Ci0gICAgICAgIGNvbmNyZXRlQ29tcCA9IHNjaGVtYS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgY29uY3JldGVDb21wID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClzZWxlY3RlZE9iamVjdCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChjb25jcmV0ZUNvbXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNvbmNyZXRlQ29tcCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotCi0gICAgICAgICAgaXNDb21wbGV4VHlwZSA9IHRydWU7Ci0gICAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWNvbmNyZXRlQ29tcDsKLSAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSB0eXBlRGVmLmdldENvbnRhaW5lcigpOwotICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFyZW50TmFtZSA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcmVudCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgcnVuKHNlbGVjdGlvbiwgc2NoZW1hLCB0eXBlRGVmKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoY29uY3JldGVDb21wIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgaXNDb21wbGV4VHlwZSA9IGZhbHNlOwotICAgICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZURlZiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiljb25jcmV0ZUNvbXA7Ci0gICAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnRDb21wID0gc2ltcGxlVHlwZURlZi5nZXRDb250YWluZXIoKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnRDb21wIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwYXJlbnROYW1lID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pcGFyZW50KS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwYXJlbnROYW1lID0gKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbilwYXJlbnQpLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcnVuKHNlbGVjdGlvbiwgc2NoZW1hLCBzaW1wbGVUeXBlRGVmKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldE5ld0RlZmF1bHROYW1lKCkKLSAgewotICAgIGlmIChwYXJlbnROYW1lICE9IG51bGwgJiYgISIiLmVxdWFscyhwYXJlbnROYW1lKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoaXNDb21wbGV4VHlwZSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudE5hbWUgKyAiQ29tcGxleFR5cGUiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBwYXJlbnROYW1lICsgIlNpbXBsZVR5cGUiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaXNDb21wbGV4VHlwZSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICJOZXdDb21wbGV4VHlwZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICJOZXdTaW1wbGVUeXBlIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBYU0RTY2hlbWEgc2NoZW1hLCBYU0RUeXBlRGVmaW5pdGlvbiBzZWxlY3RlZENvbXBvbmVudCkKLSAgewotICAgIGlmIChzZWxlY3RlZENvbXBvbmVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoc2VsZWN0ZWRDb21wb25lbnQuZ2V0U2NoZW1hKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzY2hlbWEudXBkYXRlRWxlbWVudCh0cnVlKTsKLSAgICB9Ci0gICAgRG9jdW1lbnRJbXBsIGRvYyA9IChEb2N1bWVudEltcGwpc2VsZWN0ZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICBkb2MuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLk1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uX3RleHQpOwotICAgIE1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IE1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZChzZWxlY3RlZENvbXBvbmVudCwgZ2V0TmV3RGVmYXVsdE5hbWUoKSk7Ci0gICAgY29tbWFuZC5ydW4oKTsKLSAgICBkb2MuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvaGFuZGxlcnMvTWFrZUxvY2FsRWxlbWVudEdsb2JhbEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9oYW5kbGVycy9NYWtlTG9jYWxFbGVtZW50R2xvYmFsSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTc4ZDg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9oYW5kbGVycy9NYWtlTG9jYWxFbGVtZW50R2xvYmFsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuaGFuZGxlcnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iuc3RydWN0dXJlLk1ha2VMb2NhbEVsZW1lbnRHbG9iYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgTWFrZUxvY2FsRWxlbWVudEdsb2JhbEhhbmRsZXIgZXh0ZW5kcyBSZWZhY3RvcmluZ0hhbmRsZXIKLXsKLQotICBwdWJsaWMgT2JqZWN0IGRvRXhlY3V0ZShJU2VsZWN0aW9uIHNlbGVjdGlvbiwgWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgICAgewotICAgICAgICBzZWxlY3RlZE9iamVjdCA9ICgoWFNEQmFzZUFkYXB0ZXIpc2VsZWN0ZWRPYmplY3QpLmdldFRhcmdldCgpOwotICAgICAgfQotICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBydW4oc2VsZWN0aW9uLCAoWFNERWxlbWVudERlY2xhcmF0aW9uKXNlbGVjdGVkT2JqZWN0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpc2VsZWN0ZWRPYmplY3Q7Ci0gICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gc2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQobm9kZSk7Ci0gICAgICAgIGlmIChjb25jcmV0ZUNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgICAgICBydW4oc2VsZWN0aW9uLCAoWFNERWxlbWVudERlY2xhcmF0aW9uKWNvbmNyZXRlQ29tcG9uZW50KTsKLSAgICAgIH0KLQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bihJU2VsZWN0aW9uIHNlbGVjdGlvbiwgWFNERWxlbWVudERlY2xhcmF0aW9uIHNlbGVjdGVkQ29tcG9uZW50KQotICB7Ci0gICAgRG9jdW1lbnRJbXBsIGRvYyA9IChEb2N1bWVudEltcGwpc2VsZWN0ZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICBkb2MuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCAiTWFrZUxvY2FsRWxlbWVudEdsb2JhbEhhbmRsZXIudGV4dCIpOwotICAgIE1ha2VMb2NhbEVsZW1lbnRHbG9iYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgTWFrZUxvY2FsRWxlbWVudEdsb2JhbENvbW1hbmQoc2VsZWN0ZWRDb21wb25lbnQpOwotICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgZG9jLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2hhbmRsZXJzL1JlZmFjdG9yaW5nSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2hhbmRsZXJzL1JlZmFjdG9yaW5nSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmUwMmZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9oYW5kbGVycy9SZWZhY3RvcmluZ0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZhY3RvcmluZ0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIKLXsKLSAgcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAKLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdyhldmVudCk7Ci0gICAgaWYgKHdvcmtiZW5jaFdpbmRvdyA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQotICAgIElXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgIGlmIChhY3RpdmVQYWdlID09IG51bGwpIHJldHVybiBudWxsOwotCi0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gYWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBpZiAoZWRpdG9yID09IG51bGwpIHJldHVybiBudWxsOwotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKWVkaXRvci5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcyk7Ci0gICAgIAotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gYWN0aXZlUGFnZS5nZXRTZWxlY3Rpb24oKTsKLSAgICAKLSAgICByZXR1cm4gZG9FeGVjdXRlKHNlbGVjdGlvbiwgc2NoZW1hKTsKLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgZG9FeGVjdXRlKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBYU0RTY2hlbWEgc2NoZW1hKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9oYW5kbGVycy9SZW5hbWVIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvaGFuZGxlcnMvUmVuYW1lSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDZiZDQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9oYW5kbGVycy9SZW5hbWVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuaGFuZGxlcnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVJlZmFjdG9yaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9ncy5TYXZlRGlydHlGaWxlc0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlhNTFJlZmFjdG9yaW5nQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lLlJlbmFtZUNvbXBvbmVudFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBSZW5hbWVIYW5kbGVyIGV4dGVuZHMgUmVmYWN0b3JpbmdIYW5kbGVyCi17Ci0KLSAgcHJvdGVjdGVkIE9iamVjdCBkb0V4ZWN1dGUoSVNlbGVjdGlvbiBzZWxlY3Rpb24sIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICByZXR1cm4gZXhlY3V0ZShzZWxlY3Rpb24sIHNjaGVtYSk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoSVNlbGVjdGlvbiBzZWxlY3Rpb24sIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgewotCi0gICAgICBPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgICAgewotICAgICAgICBzZWxlY3RlZE9iamVjdCA9ICgoWFNEQmFzZUFkYXB0ZXIpc2VsZWN0ZWRPYmplY3QpLmdldFRhcmdldCgpOwotICAgICAgfQotCi0gICAgICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgcnVuKHNlbGVjdGlvbiwgc2NoZW1hLCAoWFNETmFtZWRDb21wb25lbnQpc2VsZWN0ZWRPYmplY3QpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBOb2RlKQotICAgICAgewotICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSlzZWxlY3RlZE9iamVjdDsKLSAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQgPSBzY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChub2RlKTsKLSAgICAgICAgICBpZiAoY29uY3JldGVDb21wb25lbnQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBydW4oc2VsZWN0aW9uLCBzY2hlbWEsIChYU0ROYW1lZENvbXBvbmVudCljb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotCi0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIFhTRFNjaGVtYSBzY2hlbWEsIFhTRE5hbWVkQ29tcG9uZW50IHNlbGVjdGVkQ29tcG9uZW50KQotICB7Ci0gICAgaWYgKHNlbGVjdGVkQ29tcG9uZW50LmdldE5hbWUoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHNlbGVjdGVkQ29tcG9uZW50LnNldE5hbWUobmV3IFN0cmluZygpKTsKLSAgICB9Ci0gICAgaWYgKHNlbGVjdGVkQ29tcG9uZW50LmdldFNjaGVtYSgpID09IG51bGwpCi0gICAgewotICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgewotICAgICAgICBzY2hlbWEudXBkYXRlRWxlbWVudCh0cnVlKTsKLSAgICAgIH0KLQotICAgIH0KLQotICAgIGJvb2xlYW4gcmMgPSBTYXZlRGlydHlGaWxlc0RpYWxvZy5zYXZlRGlydHlGaWxlcygpOwotICAgIGlmICghcmMpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBSZWZhY3RvcmluZ0NvbXBvbmVudCBjb21wb25lbnQgPSBuZXcgWE1MUmVmYWN0b3JpbmdDb21wb25lbnQoCi0gICAgICBzZWxlY3RlZENvbXBvbmVudCwKLSAgICAgIChJRE9NRWxlbWVudClzZWxlY3RlZENvbXBvbmVudC5nZXRFbGVtZW50KCksCi0gICAgICBzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lKCksCi0gICAgICBzZWxlY3RlZENvbXBvbmVudC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0KLSAgICBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFJlbmFtZUNvbXBvbmVudFByb2Nlc3Nvcihjb21wb25lbnQsIHNlbGVjdGVkQ29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgUmVuYW1lUmVmYWN0b3JpbmcgcmVmYWN0b3JpbmcgPSBuZXcgUmVuYW1lUmVmYWN0b3JpbmcocHJvY2Vzc29yKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBuZXcgUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQoCi0gICAgICAgIHJlZmFjdG9yaW5nLAotICAgICAgICBSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUNvbXBvbmVudFdpemFyZF9kZWZhdWx0UGFnZVRpdGxlLAotICAgICAgICBSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUNvbXBvbmVudFdpemFyZF9pbnB1dFBhZ2VfZGVzY3JpcHRpb24sCi0gICAgICAgIG51bGwpOwotICAgICAgUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uIG9wID0gbmV3IFJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbih3aXphcmQpOwotICAgICAgb3AucnVuKFhTREVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCB3aXphcmQuZ2V0RGVmYXVsdFBhZ2VUaXRsZSgpKTsKLQotICAgIH0KLSAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBkbyBub3RoaW5nLiBVc2VyIGFjdGlvbiBnb3QgY2FuY2VsZWQKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOGIwMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUmVmYWN0b3JNZW51LmxhYmVsPVJlZmFjdG9yCi1SZWZhY3RvckFjdGlvbkdyb3VwLm5vX3JlZmFjdG9yaW5nX2F2YWlsYWJsZT08bm8gcmVmYWN0b3JpbmcgYXZhaWxhYmxlPgotCi1SZW5hbWVBY3Rpb24ucmVuYW1lPVJlbmFtZQotUmVuYW1lQWN0aW9uLnVuYXZhaWxhYmxlPU9wZXJhdGlvbiB1bmF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG5TZWxlY3QgYSAuLi4uCi1SZW5hbWVBY3Rpb24udGV4dD1SZSZuYW1lLi4uCi0KLVJlbmFtZUlucHV0V2l6YXJkUGFnZS5uZXdfbmFtZT0gJk5ldyBuYW1lOgotUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQuaW50ZXJuYWxfZXJyb3I9IEludGVybmFsIGVycm9yIGR1cmluZyBuYW1lIGNoZWNraW5nOiB7MH0KLQotCi1SZW5hbWVYU0RFbGVtZW50QWN0aW9uLmV4Y2VwdGlvbj1VbmV4cGVjdGVkIGV4Y2VwdGlvbiBvY2N1cnJlZC4gU2VlIGxvZyBmb3IgZGV0YWlscwotUmVuYW1lWFNERWxlbWVudEFjdGlvbi5ub3RfYXZhaWxhYmxlPU9wZXJhdGlvbiB1bmF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG5TZWxlY3QgYSBYU0QgcHJvamVjdCwgZm9sZGVyLCByZXNvdXJjZSwgZmlsZSwgYXR0cmlidXRlIGRlY2xhcmF0aW9ucywgIGF0dHJpYnV0ZSBncm91cCBkZWZpbml0aW9ucywgY29tcGxleCB0eXBlIGRlZmluaXRpb25zLCBlbGVtZW50IGRlY2xhcmF0aW9ucywgaWRlbnRpdHkgY29uc3RyYWludCBkZWZpbml0aW9ucywgbW9kZWwgZ3JvdXBzIGRlZmluaXRpb25zLCBub3RhdGlvbiBkZWNsYXJhdGlvbnMsIG9yIHNpbXBsZSB0eXBlIGRlZmluaXRpb25zLgotUmVuYW1lWFNERWxlbWVudEFjdGlvbi5uYW1lPVJlbmFtZQotCi0KLVJlbmFtZVN1cHBvcnQuZGlhbG9nLnRpdGxlPVJlbmFtZQotUmVuYW1lU3VwcG9ydC5ub3RfYXZhaWxhYmxlPVJlbmFtZSBzdXBwb3J0IG5vdCBhdmFpbGFibGUKLQotUmVuYW1lQ29tcG9uZW50V2l6YXJkLmRlZmF1bHRQYWdlVGl0bGU9UmVuYW1lIHdpemFyZAotUmVuYW1lQ29tcG9uZW50V2l6YXJkLmlucHV0UGFnZS5kZXNjcmlwdGlvbj1SZW5hbWUgWE1MIFNjaGVtYSBjb21wb25lbnQKLQotUmVuYW1lSW5wdXRXaXphcmRQYWdlLnVwZGF0ZV9yZWZlcmVuY2VzPVVwZGF0ZSByZWZlcmVuY2VzCi1YU0RDb21wb25lbnRSZW5hbWVDaGFuZ2UubmFtZT1YTUwgU2NoZW1hIGNvbXBvbmVudCByZW5hbWluZyBpbiB7MH06IHsxfSB0byB7Mn0KLVhTRENvbXBvbmVudFJlbmFtZUNoYW5nZS5SZW5hbWluZz1SZW5hbWluZy4uLgotUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudC5jb21wb3NpdGVDaGFuZ2VOYW1lPVhTRCBmaWxlIHJlbmFtZSByZWZlcmVuY2VzIHVwZGF0aW5nIGNoYW5nZXMKLVJlbmFtZVJlc291cmNlQ2hhbmdlLnJlbmFtZV9yZXNvdXJjZV9yZWZlcmVuY2VfY2hhbmdlPVJlbmFtaW5nIHJlc291cmNlIG5hbWUgcmVmZXJlbmNlcwotWFNEUmVuYW1lUmVzb3VyY2VDaGFuZ2UubmFtZT1SZXNvdXJjZSByZW5hbWU6IHswfSB0byB7MX0KLVJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmcuSW50ZXJuYWxfRXJyb3I9SW50ZXJuYWwgZXJyb3IKLVJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmcuYWxyZWFkX2V4aXN0cz1SZXNvdXJjZSBhbHJlYWR5IGV4aXN0Ci1SZW5hbWVSZXNvdXJjZVJlZmFjdG9yaW5nLmludmFsaWROYW1lPUludmFsaWQgcmVzb3VyY2UgbmFtZQotUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IubmFtZT1SZXNvdXJjZSByZW5hbWluZwotTWFrZUxvY2FsRWxlbWVudEdsb2JhbEFjdGlvbi50ZXh0PU1ha2UgJkxvY2FsIEVsZW1lbnQgR2xvYmFsCi1YU0RDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudC5Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlcz1YTUwgU2NoZW1hIHJlZmFjdG9yaW5nIGNoYW5nZXMKLVdTRExDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudC5Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlcz1XU0RMIHJlZmFjdG9yaW5nIGNoYW5nZXMKLVJlbmFtZUNvbXBvbmVudFByb2Nlc3Nvci5Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlcz1Db21wb25lbnQgbmFtZSByZWZhY3RvcmluZyBjaGFuZ2VzCi1SZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZV9kZWNsYXRhdGlvbj1VcGRhdGUgY29tcG9uZW50IGRlY2xhcmF0aW9uL2RlZmluaXRpb24KLVJlbmFtZUNvbXBvbmVudFByb2Nlc3Nvci5Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlX3JlZmVyZW5jZT1VcGRhdGUgY29tcG9uZW50IHJlZmVyZW5jZQotWFNEQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQueHNkX2NvbXBvbmVudF9yZW5hbWVfcGFydGljaXBhbnQ9WFNEIGNvbXBvbmVudCByZW5hbWUgcGFydGljaXBhbnQKLVdTRExDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudC53c2RsX2NvbXBvbmVudF9yZW5hbWVfcGFydGljaXBhbnQ9V1NETCBjb21wb25lbnQgcmVuYW1lIHBhcnRpY2lwYW50Ci1SZXNvdXJjZVJlbmFtZVBhcnRpY2lwYW50LkZpbGVfUmVuYW1lX3VwZGF0ZV9yZWZlcmVuY2U9RmlsZSByZW5hbWUgcmVmYWN0b3JpbmcgY2hhbmdlcwotUmVuYW1lQ29tcG9uZW50UmVmYWN0b3JpbmdfY2hlY2tpbmc9Q2hlY2tpbmcuLi4KLVJlbmFtZUNvbXBvbmVudFJlZmFjdG9yaW5nX3NlYXJjaGluZz1TZWFyY2hpbmcuLi4KLUNoZWNrc19DaG9vc2VfbmFtZT1JbnZhbGlkIG5hbWUKLVJlbmFtZUNvbXBvbmVudFJlZmFjdG9yaW5nX2Fub3RoZXJfbmFtZT1OYW1lIGFscmVhZHkgdXNlZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9Db21wb25lbnRSZW5hbWVBcmd1bWVudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvQ29tcG9uZW50UmVuYW1lQXJndW1lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZGYzZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9Db21wb25lbnRSZW5hbWVBcmd1bWVudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVBcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5UZXh0Q2hhbmdlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIENvbXBvbmVudFJlbmFtZUFyZ3VtZW50cyBleHRlbmRzIFJlbmFtZUFyZ3VtZW50cyB7Ci0JCi0JVGV4dENoYW5nZU1hbmFnZXIgY2hhbmdlTWFuYWdlcjsKLQlNYXAgbWF0Y2hlczsKLQlTdHJpbmcgcXVhbGlmaWVyOwotCi0JcHVibGljIENvbXBvbmVudFJlbmFtZUFyZ3VtZW50cyhTdHJpbmcgbmV3TmFtZSwgYm9vbGVhbiB1cGRhdGVSZWZlcmVuY2VzKSB7Ci0JCXN1cGVyKG5ld05hbWUsIHVwZGF0ZVJlZmVyZW5jZXMpOwotCX0KLQotCXB1YmxpYyBUZXh0Q2hhbmdlTWFuYWdlciBnZXRDaGFuZ2VNYW5hZ2VyKCkgewotCQlyZXR1cm4gY2hhbmdlTWFuYWdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VNYW5hZ2VyKFRleHRDaGFuZ2VNYW5hZ2VyIGNoYW5nZU1hbmFnZXIpIHsKLQkJdGhpcy5jaGFuZ2VNYW5hZ2VyID0gY2hhbmdlTWFuYWdlcjsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldE1hdGNoZXMoKSB7Ci0JCXJldHVybiBtYXRjaGVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hdGNoZXMoTWFwIG1hdGNoZXMpIHsKLQkJdGhpcy5tYXRjaGVzID0gbWF0Y2hlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllcigpIHsKLQkJcmV0dXJuIHF1YWxpZmllcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRRdWFsaWZpZXIoU3RyaW5nIHF1YWxpZmllcikgewotCQl0aGlzLnF1YWxpZmllciA9IHF1YWxpZmllcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZUNvbXBvbmVudFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDlkNGZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZTsKLQotLy9pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlBhcnRpY2lwYW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lQXJndW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5TaGFyYWJsZVBhcnRpY2lwYW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlbGVjdGlvblNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuV29ya3NwYWNlU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC51dGlsLkNvbGxlY3RpbmdTZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLkNoZWNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLklOYW1lVXBkYXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5JUmVmZXJlbmNlVXBkYXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5UZXh0Q2hhbmdlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnV0aWwuVGV4dENoYW5nZUNvbXBhdGliaWxpdHk7Ci0KLQotCi1wdWJsaWMgY2xhc3MgUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yIGV4dGVuZHMgUmVuYW1lUHJvY2Vzc29yIGltcGxlbWVudHMgSU5hbWVVcGRhdGluZywgSVJlZmVyZW5jZVVwZGF0aW5nIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElGSUVSID0gIm9yZy5lY2xpcHNlLndzdC54bWwucmVmYWN0b3IucmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgYm9vbGVhbiBzaW5nbGVGaWxlT25seSA9IGZhbHNlOwotICAgIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHF1b3RlU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQl2YWx1ZSA9IHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlOwotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKCF2YWx1ZS5zdGFydHNXaXRoKCJcIiIpKSB7Ci0JCQlzYi5hcHBlbmQoIlwiIik7Ci0JCX0KLQkJc2IuYXBwZW5kKHZhbHVlKTsKLQkJaWYgKCF2YWx1ZS5lbmRzV2l0aCgiXCIiKSkgewotCQkJc2IuYXBwZW5kKCJcIiIpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgVGV4dENoYW5nZU1hbmFnZXIgY2hhbmdlTWFuYWdlcjsKLQotCXByaXZhdGUgU3RyaW5nIG5ld05hbWU7Ci0KLQlwcml2YXRlIFJlZmFjdG9yaW5nQ29tcG9uZW50IHNlbGVjdGVkQ29tcG9uZW50OwotCi0JcHJpdmF0ZSBib29sZWFuIHVwZGF0ZVJlZmVyZW5jZXMgPSB0cnVlOwotCi0JcHJpdmF0ZSBNYXAgcmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yKFJlZmFjdG9yaW5nQ29tcG9uZW50IHNlbGVjdGVkQ29tcG9uZW50KSB7Ci0JCXRoaXMuc2VsZWN0ZWRDb21wb25lbnQgPSBzZWxlY3RlZENvbXBvbmVudDsKLQl9Ci0KLQlwdWJsaWMgUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yKFJlZmFjdG9yaW5nQ29tcG9uZW50IHNlbGVjdGVkQ29tcG9uZW50LCBTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzKHNlbGVjdGVkQ29tcG9uZW50LCBuZXdOYW1lLCBmYWxzZSk7Ci0JfQotICAgIAotICAgIHB1YmxpYyBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IoUmVmYWN0b3JpbmdDb21wb25lbnQgc2VsZWN0ZWRDb21wb25lbnQsIFN0cmluZyBuZXdOYW1lLCBib29sZWFuIHNpbmdsZUZpbGVPbmx5KSB7Ci0gICAgICAgIHRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0gICAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnQgPSBzZWxlY3RlZENvbXBvbmVudDsKLSAgICAgICAgdGhpcy5zaW5nbGVGaWxlT25seSA9IHNpbmdsZUZpbGVPbmx5OwotICAgIH0gICAgCi0KLQlwcml2YXRlIHZvaWQgYWRkRGVjbGFyYXRpb25VcGRhdGUoVGV4dENoYW5nZU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZVN0ciA9IHNlbGVjdGVkQ29tcG9uZW50LmdldEVsZW1lbnQoKS5nZXRNb2RlbCgpLmdldEJhc2VMb2NhdGlvbigpOwotCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKGZpbGVTdHIpKTsKLQkJYWRkRGVjbGFyYXRpb25VcGRhdGUobWFuYWdlciwgZmlsZSk7Ci0JfQotCi0JZmluYWwgdm9pZCBhZGREZWNsYXJhdGlvblVwZGF0ZShUZXh0Q2hhbmdlTWFuYWdlciBtYW5hZ2VyLCBJRmlsZSBmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lKCk7Ci0JCVN0cmluZyBjb21wb25lbnROYW1lc3BhY2UgPSBzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQkJUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZShjb21wb25lbnROYW1lc3BhY2UsIGNvbXBvbmVudE5hbWUpOwotCQlRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSA9IHNlbGVjdGVkQ29tcG9uZW50LmdldFR5cGVRTmFtZSgpOwotCi0KLQotCQlTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBXb3Jrc3BhY2VTZWFyY2hTY29wZSgpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlzY29wZSA9IG5ldyBTZWxlY3Rpb25TZWFyY2hTY29wZShuZXcgSVJlc291cmNlW117ZmlsZX0pOwotCQl9Ci0JCUNvbGxlY3RpbmdTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbGxlY3RpbmdTZWFyY2hSZXF1ZXN0b3IoKTsKLQkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSk7Ci0JCVNlYXJjaEVuZ2luZSBzZWFyY2hFbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0gICAgICAgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgaWYgKHNpbmdsZUZpbGVPbmx5KQotICAgICAgICB7Ci0gICAgICAgICAgbWFwLnB1dCgic2VhcmNoRGlydHlDb250ZW50IiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgfSAgCi0JCXNlYXJjaEVuZ2luZS5zZWFyY2gocGF0dGVybiwgcmVxdWVzdG9yLCBzY29wZSwgbWFwLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJTGlzdCByZXN1bHRzID0gcmVxdWVzdG9yLmdldFJlc3VsdHMoKTsKLQkJCi0JCS8vIG1vcmUgdGhhbiBvbmUgZGVjbGFyYXRpb24gZm91bmQsIHNvIHVzZSBvZmZzZXQgYXMgYWRkaXRpb25hbCBjaGVjawotCQlQb3NpdGlvbiBvZmZzZXRQb3NpdGlvbiA9IG51bGw7Ci0JCWlmIChyZXN1bHRzLnNpemUoKSA+IDEpIHsKLQkJICAgIElET01FbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkQ29tcG9uZW50LmdldEVsZW1lbnQoKTsKLQkJICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgIT0gbnVsbCkgewotCQkgICAgCWludCBzdGFydE9mZnNldCA9IHNlbGVjdGVkRWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQkgICAgCW9mZnNldFBvc2l0aW9uID0gbmV3IFBvc2l0aW9uKHN0YXJ0T2Zmc2V0LCAoc2VsZWN0ZWRFbGVtZW50LmdldEVuZE9mZnNldCgpIC0gc3RhcnRPZmZzZXQpKTsKLQkJICAgIH0KLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzdWx0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVNlYXJjaE1hdGNoIG1hdGNoID0gKFNlYXJjaE1hdGNoKSBpdGVyLm5leHQoKTsKLQkJCWlmIChtYXRjaCAhPSBudWxsKSB7Ci0JCQkJYm9vbGVhbiBhZGRUZXh0Q2hhbmdlID0gdHJ1ZTsKLQkJCQkvLyBhZGRpdGlvbmFsIGNoZWNrIHRvIHZlcmlmeSBjb3JyZWN0IGRlY2xhcmF0aW9uIGlzIGNoYW5nZWQKLQkJCQlpZiAob2Zmc2V0UG9zaXRpb24gIT0gbnVsbCkgewotCQkJCQlhZGRUZXh0Q2hhbmdlID0gb2Zmc2V0UG9zaXRpb24ub3ZlcmxhcHNXaXRoKG1hdGNoLmdldE9mZnNldCgpLCBtYXRjaC5nZXRMZW5ndGgoKSk7ICAKLQkJCQl9Ci0JCQkJaWYgKGFkZFRleHRDaGFuZ2UpIHsKLQkJCQkJVGV4dENoYW5nZSB0ZXh0Q2hhbmdlID0gbWFuYWdlci5nZXQobWF0Y2guZ2V0RmlsZSgpKTsKLQkJCQkJU3RyaW5nIG5ld05hbWUgPSBnZXROZXdFbGVtZW50TmFtZSgpOwotCQkJCQluZXdOYW1lID0gcXVvdGVTdHJpbmcobmV3TmFtZSk7Ci0JCi0JCQkJCVJlcGxhY2VFZGl0IHJlcGxhY2VFZGl0ID0gbmV3IFJlcGxhY2VFZGl0KG1hdGNoLmdldE9mZnNldCgpLCBtYXRjaC5nZXRMZW5ndGgoKSwgbmV3TmFtZSk7Ci0JCQkJCVN0cmluZyBlZGl0TmFtZSA9IFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZV9kZWNsYXRhdGlvbiIpOwotCQkJCQlUZXh0Q2hhbmdlQ29tcGF0aWJpbGl0eS5hZGRUZXh0RWRpdCh0ZXh0Q2hhbmdlLCBlZGl0TmFtZSwgcmVwbGFjZUVkaXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgYWRkT2NjdXJyZW5jZXMoVGV4dENoYW5nZU1hbmFnZXIgbWFuYWdlciwgSVByb2dyZXNzTW9uaXRvciBwbSwgUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nIGZpbGVTdHIgPSBzZWxlY3RlZENvbXBvbmVudC5nZXRFbGVtZW50KCkuZ2V0TW9kZWwoKS5nZXRCYXNlTG9jYXRpb24oKTsKLQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlU3RyKSk7Ci0KLQkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lKCk7Ci0JCVN0cmluZyBjb21wb25lbnROYW1lc3BhY2UgPSBzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQkJUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZShjb21wb25lbnROYW1lc3BhY2UsIGNvbXBvbmVudE5hbWUpOwotCQlRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSA9IHNlbGVjdGVkQ29tcG9uZW50LmdldFR5cGVRTmFtZSgpOwotCi0JCVNlYXJjaEVuZ2luZSBzZWFyY2hFbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0gICAgICAgIFNlYXJjaFNjb3BlIHNjb3BlID0gbnVsbDsKLSAgICAgICAgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBpZiAoc2luZ2xlRmlsZU9ubHkpCi0gICAgICAgIHsKLSAgICAgICAgICBtYXAucHV0KCJzZWFyY2hEaXJ0eUNvbnRlbnQiLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgIHNjb3BlID0gbmV3IFNlbGVjdGlvblNlYXJjaFNjb3BlKG5ldyBJUmVzb3VyY2VbXXtmaWxlfSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAKLSAgICAgICAgICBzY29wZSA9IG5ldyBXb3Jrc3BhY2VTZWFyY2hTY29wZSgpOwotICAgICAgICB9IAotCQlTb3J0aW5nU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBTb3J0aW5nU2VhcmNoUmVxdWVzdG9yKCk7Ci0JCVNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IG5ldyBYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKGZpbGUsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lKTsKLSAgICAgICAgCi0JCXNlYXJjaEVuZ2luZS5zZWFyY2gocGF0dGVybiwgcmVxdWVzdG9yLCBzY29wZSwgbWFwLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJcmVmZXJlbmNlcyA9IHJlcXVlc3Rvci5nZXRSZXN1bHRzKCk7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIFNlYXJjaE1hdGNoIG1hdGNoID0gKFNlYXJjaE1hdGNoKSBpdGVyLm5leHQoKTsKLQotCQkvLyBUZXh0Q2hhbmdlIHRleHRDaGFuZ2UgPSBtYW5hZ2VyLmdldChtYXRjaC5nZXRGaWxlKCkpOwotCQkvLyBTdHJpbmcgbmV3TmFtZSA9IGdldE5ld0VsZW1lbnROYW1lKCk7Ci0JCS8vIGlmKG1hdGNoLmdldE9iamVjdCgpIGluc3RhbmNlb2YgTm9kZSl7Ci0JCS8vIE5vZGUgbm9kZSA9IChOb2RlKW1hdGNoLmdldE9iamVjdCgpOwotCQkvLyBpZihub2RlIGluc3RhbmNlb2YgSURPTUF0dHIpewotCQkvLyBJRE9NQXR0ciBhdHRyID0gKElET01BdHRyKW5vZGU7Ci0JCS8vIElET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpYXR0ci5nZXRPd25lckVsZW1lbnQoKSA7Ci0JCS8vIG5ld05hbWUgPSBnZXROZXdRTmFtZShlbGVtZW50LCBjb21wb25lbnROYW1lc3BhY2UsIG5ld05hbWUpOwotCQkvLyB9Ci0JCS8vIG5ld05hbWUgPSBxdW90ZVN0cmluZyhuZXdOYW1lKTsKLQkJLy8gfQotCQkvLwkJCQkKLQkJLy8gUmVwbGFjZUVkaXQgcmVwbGFjZUVkaXQgPSBuZXcgUmVwbGFjZUVkaXQobWF0Y2guZ2V0T2Zmc2V0KCksCi0JCS8vIG1hdGNoLmdldExlbmd0aCgpLCBuZXdOYW1lICk7Ci0JCS8vIFN0cmluZyBlZGl0TmFtZSA9Ci0JCS8vIFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZV9yZWZlcmVuY2UiKTsKLQkJLy8gVGV4dENoYW5nZUNvbXBhdGliaWxpdHkuYWRkVGV4dEVkaXQodGV4dENoYW5nZSwgZWRpdE5hbWUsCi0JCS8vIHJlcGxhY2VFZGl0KTsKLQotCQkvLyB9Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQucmVmYWN0b3JpbmcudGFnZ2luZy5JVGV4dFVwZGF0aW5nI2NhbkVuYWJsZVRleHRVcGRhdGluZygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRW5hYmxlVGV4dFVwZGF0aW5nKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FbmFibGVVcGRhdGVSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2NoZWNrRmluYWxDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrRmluYWxDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKG1vbml0b3IpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRleHQpOwotCQlmaW5hbCBSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMgPSBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQkJdHJ5IHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAyKTsgLy8kTk9OLU5MUy0xJAotCQkJbW9uaXRvci5zZXRUYXNrTmFtZShSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQ29tcG9uZW50UmVmYWN0b3JpbmdfY2hlY2tpbmciKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXN0YXR1cy5tZXJnZShjaGVja05ld0VsZW1lbnROYW1lKGdldE5ld0VsZW1lbnROYW1lKCkpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJbW9uaXRvci5zZXRUYXNrTmFtZShSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQ29tcG9uZW50UmVmYWN0b3Jpbmdfc2VhcmNoaW5nIikpOyAvLyROT04tTkxTLTEkCi0JCQlzdGF0dXMubWVyZ2UoY3JlYXRlUmVuYW1lQ2hhbmdlcyhuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjY2hlY2tJbml0aWFsQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tJbml0aWFsQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvLyBUT0RPIGFkZCBjb2RlIHRvIGNoZWNrIGluaXRpYWwgY29uZGl0aW9ucyBmb3IgY29tcG9uZW50IHJlbmFtZQotCQlBc3NlcnQuaXNOb3ROdWxsKHBtKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXBtLmRvbmUoKTsKLQkJfQotCi0JfQotCi0JcHVibGljIGZpbmFsIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrTmV3RWxlbWVudE5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChuYW1lKTsKLQkJZmluYWwgUmVmYWN0b3JpbmdTdGF0dXMgcmVzdWx0ID0gQ2hlY2tzLmNoZWNrTmFtZShuYW1lKTsKLQkJcmVzdWx0Lm1lcmdlKENoZWNrcy5jaGVja0NvbXBvbmVudE5hbWUobmFtZSkpOwotCQlpZiAoQ2hlY2tzLmlzQWxyZWFkeU5hbWVkKHNlbGVjdGVkQ29tcG9uZW50LCBuYW1lKSkKLQkJCXJlc3VsdC5hZGRGYXRhbEVycm9yKFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVDb21wb25lbnRSZWZhY3RvcmluZ19hbm90aGVyX25hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGNvbXB1dGVEZXJpdmVkRWxlbWVudHMoKSB7Ci0KLQkJT2JqZWN0W10gZWxlbWVudHMgPSBnZXRFbGVtZW50cygpOwotCQkvLyBPYmplY3RbXSByZXN1bHRzID0gbmV3IE9iamVjdFtlbGVtZW50cy5sZW5ndGhdOwotCQkvLyBmb3IoaW50IGk9MDsgaTwgZWxlbWVudHMubGVuZ3RoOyBpKyspewotCQkvLyBSZWZhY3RvcmluZ0NvbXBvbmVudCBjb21wb25lbnQgPSAoUmVmYWN0b3JpbmdDb21wb25lbnQpZWxlbWVudHNbaV07Ci0JCS8vIHJlc3VsdHNbaV0gPSBjb21wb25lbnQuZ2V0QWRhcHRlZSgpOwotCQkvLwkJCQotCQkvLyB9Ci0JCXJldHVybiBlbGVtZW50czsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvLyBkb24ndCBjcmVhdGUgYW55IGNoYW5nZSBub3csIGFsbCB0aGUgY2hhbmdlcyBhcmUgaW4gY2hhbmdlTWFuZ2VyCi0JCS8vIHZhcmlhYmxlIGFuZCB3aWxsIGJlIGNvbWJpbmVkIGluIHBvc3RDcmVhdGVDaGFuZ2UgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgVGV4dENoYW5nZU1hbmFnZXIgdXBkYXRlQ2hhbmdlTWFuYWdlcihJUHJvZ3Jlc3NNb25pdG9yIHBtLCBSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGV4dENoYW5nZU1hbmFnZXIgbWFuYWdlciA9IGdldENoYW5nZU1hbmFnZXIoKTsKLQkJLy8gb25seSBvbmUgZGVjbGFyYXRpb24gZ2V0cyB1cGRhdGVkCi0JCWFkZERlY2xhcmF0aW9uVXBkYXRlKG1hbmFnZXIpOwotCQlpZiAoZ2V0VXBkYXRlUmVmZXJlbmNlcygpKSB7Ci0JCQlhZGRPY2N1cnJlbmNlcyhtYW5hZ2VyLCBwbSwgc3RhdHVzKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQlwcml2YXRlIFJlZmFjdG9yaW5nU3RhdHVzIGNyZWF0ZVJlbmFtZUNoYW5nZXMoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwobW9uaXRvcik7Ci0JCWZpbmFsIFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cyA9IG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCQl0cnkgewotCQkJbW9uaXRvci5iZWdpblRhc2soUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZUNvbXBvbmVudFJlZmFjdG9yaW5nX3NlYXJjaGluZyIpLCAxKTsgLy8kTk9OLU5MUy0xJAotCQkJdXBkYXRlQ2hhbmdlTWFuYWdlcihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpLCBzdGF0dXMpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgVGV4dENoYW5nZU1hbmFnZXIgZ2V0Q2hhbmdlTWFuYWdlcigpIHsKLQotCQlpZiAoY2hhbmdlTWFuYWdlciA9PSBudWxsKSB7Ci0JCQljaGFuZ2VNYW5hZ2VyID0gbmV3IFRleHRDaGFuZ2VNYW5hZ2VyKGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gY2hhbmdlTWFuYWdlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QuaW50ZXJuYWwucmVmYWN0b3JpbmcucmVuYW1lLlhTRFJlbmFtZVByb2Nlc3NvciNnZXRBZmZlY3RlZFByb2plY3ROYXR1cmVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0QWZmZWN0ZWRQcm9qZWN0TmF0dXJlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETzogZmluZCBwcm9qZWN0IG5hdHVyZXMgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGdvaW5nIHRvIGJlCi0JCS8vIHJlZmFjdG9yZWQKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSJ9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5yZWZhY3RvcmluZy50YWdnaW5nLklUZXh0VXBkYXRpbmcjZ2V0Q3VycmVudEVsZW1lbnROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRFbGVtZW50TmFtZSgpIHsKLQkJLy8KLQkJcmV0dXJuIHNlbGVjdGVkQ29tcG9uZW50LmdldE5hbWUoKTsKLQl9Ci0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjZ2V0RWxlbWVudHMoKQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cygpIHsKLQkJT2JqZWN0IG1vZGVsID0gc2VsZWN0ZWRDb21wb25lbnQuZ2V0TW9kZWxPYmplY3QoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgT2JqZWN0W117bW9kZWx9OwotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2dldElkZW50aWZpZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIElERU5USUZJRVI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXdFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIG5ld05hbWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjZ2V0UHJvY2Vzc29yTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9jZXNzb3JOYW1lKCkgewotCQlyZXR1cm4gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRGb3JtYXR0ZWRTdHJpbmcoIlJlbmFtZUNvbXBvbmVudFJlZmFjdG9yaW5nLm5hbWUiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBTdHJpbmdbXXtzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lc3BhY2VVUkkoKSArICI6IiArIHNlbGVjdGVkQ29tcG9uZW50LmdldE5hbWUoKSwgbmV3TmFtZX0pOwotCi0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBnZXRVcGRhdGVSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gdXBkYXRlUmVmZXJlbmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNpc0FwcGxpY2FibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHNlbGVjdGVkQ29tcG9uZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIFRPRE8gaW1wbGVtZW50IGlzQXBwbGljYWJsZSBsb2dpYyBmb3IgdGhlIG5hbWVkIGNvbXBvbmVudCwKLQkJLy8gdmVyaWZ5IGhvdyBpdCBpcyBkaWZmZXJlbnQgZnJvbSBvdGhlciBjb25kaXRpb24gY2hlY2tzCi0JCS8vIGlmIChmTmFtZWRDb21wb25lbnQuaXNBbm9ueW1vdXMoKSkKLQkJLy8gcmV0dXJuIGZhbHNlOwotCQkvLyBpZiAoISBDaGVja3MuaXNBdmFpbGFibGUoZlR5cGUpKQotCQkvLyByZXR1cm4gZmFsc2U7Ci0JCS8vIGlmIChpc1NwZWNpYWxDYXNlKGZUeXBlKSkKLQkJLy8gcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGVyaXZlZFBhcnRpY2lwYW50cyhSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsIExpc3QgcmVzdWx0LCBPYmplY3RbXSBkZXJpdmVkRWxlbWVudHMsIENvbXBvbmVudFJlbmFtZUFyZ3VtZW50cyBhcmd1bWVudHMsIFN0cmluZ1tdIG5hdHVyZXMsIFNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZGVyaXZlZEVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVyaXZlZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUmVuYW1lUGFydGljaXBhbnRbXSBwYXJ0aWNpcGFudHMgPSBQYXJ0aWNpcGFudE1hbmFnZXIubG9hZFJlbmFtZVBhcnRpY2lwYW50cyhzdGF0dXMsIHRoaXMsIGRlcml2ZWRFbGVtZW50c1tpXSwgYXJndW1lbnRzLCBuYXR1cmVzLCBzaGFyZWQpOwotCQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChwYXJ0aWNpcGFudHMpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLmludGVybmFsLnJlZmFjdG9yaW5nLnJlbmFtZS5YU0RSZW5hbWVQcm9jZXNzb3IjbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMob3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXMsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCwgamF2YS5sYW5nLlN0cmluZ1tdLAotCSAqICAgICAgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlNoYXJhYmxlUGFydGljaXBhbnRzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREZXJpdmVkUGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywgTGlzdCByZXN1bHQsIFN0cmluZ1tdIG5hdHVyZXMsIFNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlDb21wb25lbnRSZW5hbWVBcmd1bWVudHMgYXJndW1lbnRzID0gbmV3IENvbXBvbmVudFJlbmFtZUFyZ3VtZW50cyhnZXROZXdFbGVtZW50TmFtZSgpLCBnZXRVcGRhdGVSZWZlcmVuY2VzKCkpOwotCQlhcmd1bWVudHMuc2V0TWF0Y2hlcyhyZWZlcmVuY2VzKTsKLQkJYXJndW1lbnRzLnNldFF1YWxpZmllcihzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCS8vIHBhc3MgaW4gY2hhbmdlTWFuZ2VyIHRvIHRoZSBwYXJ0aWNpcGFudHMgc28gdGhhdCBpdCBjYW4gY29sbGVjdCBhbGwKLQkJLy8gY2hhbmdlcy9wZXIgZmlsZXMKLQkJYXJndW1lbnRzLnNldENoYW5nZU1hbmFnZXIoZ2V0Q2hhbmdlTWFuYWdlcigpKTsKLQkJbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMoc3RhdHVzLCByZXN1bHQsIGNvbXB1dGVEZXJpdmVkRWxlbWVudHMoKSwgYXJndW1lbnRzLCBuYXR1cmVzLCBzaGFyZWQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRFbGVtZW50UGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywgTGlzdCByZXN1bHQsIFJlbmFtZUFyZ3VtZW50cyBhcmd1bWVudHMsIFN0cmluZ1tdIG5hdHVyZXMsIFNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlPYmplY3RbXSBlbGVtZW50cyA9IG5ldyBPYmplY3RbMF07Ly8gZ2V0RWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KFBhcnRpY2lwYW50TWFuYWdlci5sb2FkUmVuYW1lUGFydGljaXBhbnRzKHN0YXR1cywgdGhpcywgZWxlbWVudHNbaV0sIGFyZ3VtZW50cywgbmF0dXJlcywgc2hhcmVkKSkpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgZmluYWwgUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtdIGxvYWRQYXJ0aWNpcGFudHMoUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLCBTaGFyYWJsZVBhcnRpY2lwYW50cyBzaGFyZWRQYXJ0aWNpcGFudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVuYW1lQXJndW1lbnRzIGFyZ3VtZW50cyA9IG5ldyBSZW5hbWVBcmd1bWVudHMoZ2V0TmV3RWxlbWVudE5hbWUoKSwgZ2V0VXBkYXRlUmVmZXJlbmNlcygpKTsKLQkJU3RyaW5nW10gbmF0dXJlcyA9IGdldEFmZmVjdGVkUHJvamVjdE5hdHVyZXMoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWxvYWRFbGVtZW50UGFydGljaXBhbnRzKHN0YXR1cywgcmVzdWx0LCBhcmd1bWVudHMsIG5hdHVyZXMsIHNoYXJlZFBhcnRpY2lwYW50cyk7Ci0JCWxvYWREZXJpdmVkUGFydGljaXBhbnRzKHN0YXR1cywgcmVzdWx0LCBuYXR1cmVzLCBzaGFyZWRQYXJ0aWNpcGFudHMpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSByZXN1bHQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IGkubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBYTUxDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudCkgewotCQkJCVhNTENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50IHAgPSAoWE1MQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQpIG87Ci0JCQkJLy8gZ2V0Q2hhbmdlTWFuYWdlcigpCi0JCQkJcC5zZXRDaGFuZ2VNYW5hZ2VyKGdldENoYW5nZU1hbmFnZXIoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKFJlZmFjdG9yaW5nUGFydGljaXBhbnRbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFJlZmFjdG9yaW5nUGFydGljaXBhbnRbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5ld0VsZW1lbnROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobmV3TmFtZSk7Ci0JCXRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlUmVmZXJlbmNlcyhib29sZWFuIHVwZGF0ZSkgewotCQl1cGRhdGVSZWZlcmVuY2VzID0gdXBkYXRlOwotCi0JfQotCi0JcHVibGljIENoYW5nZSBwb3N0Q3JlYXRlQ2hhbmdlKENoYW5nZVtdIHBhcnRpY2lwYW50Q2hhbmdlcywgSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChwbSk7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgY2hhbmdlTmFtZSA9IFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZXMiKTsKLQkJCVRleHRDaGFuZ2VbXSBjaGFuZ2VzID0gY2hhbmdlTWFuYWdlci5nZXRBbGxDaGFuZ2VzKCk7Ci0vLwkJCUNvbXBhcmF0b3IgYyA9IG5ldyBDb21wYXJhdG9yKCkgewotLy8JCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0vLwkJCQkJVGV4dEZpbGVDaGFuZ2UgYzEgPSAoVGV4dEZpbGVDaGFuZ2UpIG8xOwotLy8JCQkJCVRleHRGaWxlQ2hhbmdlIGMyID0gKFRleHRGaWxlQ2hhbmdlKSBvMjsKLS8vCQkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGMxLmdldEZpbGUoKS5nZXRGdWxsUGF0aCgpLCBjMi5nZXRGaWxlKCkuZ2V0RnVsbFBhdGgoKSk7Ci0vLwkJCQl9Ci0vLwkJCX07Ci0JCQlpZiAoY2hhbmdlcy5sZW5ndGggPiAwKSB7Ci0JCQkJLy8gQXJyYXlzLnNvcnQoY2hhbmdlcywgYyk7Ci0JCQkJQ29tcG9zaXRlQ2hhbmdlIGNvbXBvc2l0ZUNoYW5nZSA9IG5ldyBDb21wb3NpdGVDaGFuZ2UoIiEiICsgY2hhbmdlTmFtZSwgY2hhbmdlcyk7Ci0JCQkJY29tcG9zaXRlQ2hhbmdlLm1hcmtBc1N5bnRoZXRpYygpOwotCQkJCXJldHVybiBjb21wb3NpdGVDaGFuZ2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQl9Ci0JCWZpbmFsbHkgewotCQkJcG0uZG9uZSgpOwotCQl9Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZW5hbWVSZXNvdXJjZVByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZW5hbWVSZXNvdXJjZVByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE3MDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlICBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUGFydGljaXBhbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVBcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuU2hhcmFibGVQYXJ0aWNpcGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5JTmFtZVVwZGF0aW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFJlbmFtZVJlc291cmNlUHJvY2Vzc29yIGV4dGVuZHMgUmVuYW1lUHJvY2Vzc29yIGltcGxlbWVudHMgSU5hbWVVcGRhdGluZyB7Ci0KLQlwcml2YXRlIElSZXNvdXJjZSBmUmVzb3VyY2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZk5ld0VsZW1lbnROYW1lOwotCQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElGSUVSPSAib3JnLmVjbGlwc2Uud3N0LnVpLnhzZC5yZW5hbWVSZXNvdXJjZVByb2Nlc3NvciI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWZSZXNvdXJjZT0gcmVzb3VyY2U7Ci0JCWlmIChmUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJc2V0TmV3RWxlbWVudE5hbWUoZlJlc291cmNlLmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQkvLy0tLS0gSU5hbWVVcGRhdGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkKLQlwdWJsaWMgdm9pZCBzZXROZXdFbGVtZW50TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5ld05hbWUpOwotCQlmTmV3RWxlbWVudE5hbWU9IG5ld05hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXdFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIGZOZXdFbGVtZW50TmFtZTsKLQl9Ci0JCi0JLy8tLS0tIElSZW5hbWVQcm9jZXNzb3IgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gSURFTlRJRklFUjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKCkgIHsKLQkJaWYgKGZSZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoISBmUmVzb3VyY2UuZXhpc3RzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghIGZSZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkJCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwkJCQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb2Nlc3Nvck5hbWUoKSB7Ci0JCVN0cmluZyBtZXNzYWdlPSBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldEZvcm1hdHRlZFN0cmluZygiUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IubmFtZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQluZXcgU3RyaW5nW117Z2V0Q3VycmVudEVsZW1lbnROYW1lKCksIGdldE5ld0VsZW1lbnROYW1lKCl9KTsKLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cygpIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7ZlJlc291cmNlfTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBmUmVzb3VyY2UuZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0QWZmZWN0ZWRQcm9qZWN0TmF0dXJlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXROZXdFbGVtZW50KCkgewotCQkKLQkJCQotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGNyZWF0ZU5ld1BhdGgoZ2V0TmV3RWxlbWVudE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFVwZGF0ZVJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtdIGxvYWRQYXJ0aWNpcGFudHMoUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLCBTaGFyYWJsZVBhcnRpY2lwYW50cyBzaGFyZWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJT2JqZWN0W10gZWxlbWVudHM9IGdldEVsZW1lbnRzKCk7Ci0JCVN0cmluZ1tdIG5hdHVyZXM9IGdldEFmZmVjdGVkUHJvamVjdE5hdHVyZXMoKTsKLQkJTGlzdCByZXN1bHQ9IG5ldyBBcnJheUxpc3QoKTsKLQkJUmVuYW1lQXJndW1lbnRzIGFyZ3VtZW50cz0gbmV3IFJlbmFtZUFyZ3VtZW50cyhnZXROZXdFbGVtZW50TmFtZSgpLCBnZXRVcGRhdGVSZWZlcmVuY2VzKCkpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChQYXJ0aWNpcGFudE1hbmFnZXIubG9hZFJlbmFtZVBhcnRpY2lwYW50cyhzdGF0dXMsIAotCQkJCXRoaXMsIGVsZW1lbnRzW2ldLAotCQkJCWFyZ3VtZW50cywgbmF0dXJlcywgc2hhcmVkKSkpOwotCQl9Ci0JCXJldHVybiAoUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtdKXJlc3VsdC50b0FycmF5KG5ldyBSZWZhY3RvcmluZ1BhcnRpY2lwYW50W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0JCi0JLy8tLS0gQ29uZGl0aW9uIGNoZWNraW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tJbml0aWFsQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0JCi0JLyogbm9uIGphdmEtZG9jCi0JICogQHNlZSBJUmVuYW1lUmVmYWN0b3JpbmcjY2hlY2tOZXdOYW1lKCkKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tOZXdFbGVtZW50TmFtZShTdHJpbmcgbmV3TmFtZSkgIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChuZXdOYW1lLCAibmV3IG5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlJQ29udGFpbmVyIGM9IGZSZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJaWYgKGMgPT0gbnVsbCkKLQkJCXJldHVybiBSZWZhY3RvcmluZ1N0YXR1cy5jcmVhdGVGYXRhbEVycm9yU3RhdHVzKFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVSZXNvdXJjZVJlZmFjdG9yaW5nLkludGVybmFsX0Vycm9yIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkKLQkJaWYgKGMuZmluZE1lbWJlcihuZXdOYW1lKSAhPSBudWxsKQotCQkJcmV0dXJuIFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZUZhdGFsRXJyb3JTdGF0dXMoUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmcuYWxyZWFkX2V4aXN0cyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCWlmICghYy5nZXRGdWxsUGF0aCgpLmlzVmFsaWRTZWdtZW50KG5ld05hbWUpKQotCQkJcmV0dXJuIFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZUZhdGFsRXJyb3JTdGF0dXMoUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmcuaW52YWxpZE5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkKLQkJUmVmYWN0b3JpbmdTdGF0dXMgcmVzdWx0PSBSZWZhY3RvcmluZ1N0YXR1cy5jcmVhdGUoYy5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZU5hbWUobmV3TmFtZSwgZlJlc291cmNlLmdldFR5cGUoKSkpOwotCQlpZiAoISByZXN1bHQuaGFzRmF0YWxFcnJvcigpKQotCQkJcmVzdWx0Lm1lcmdlKFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZShjLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlUGF0aChjcmVhdGVOZXdQYXRoKG5ld05hbWUpLCBmUmVzb3VyY2UuZ2V0VHlwZSgpKSkpOwkJCi0JCXJldHVybiByZXN1bHQ7CQkKLQl9Ci0JCi0JLyogbm9uIGphdmEtZG9jCi0JICogQHNlZSBSZWZhY3RvcmluZyNjaGVja0lucHV0KElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrRmluYWxDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgIHsKLQkJcG0uYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQl0cnl7Ci0JCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JCX0gZmluYWxseXsKLQkJCXBtLmRvbmUoKTsKLQkJfQkKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjcmVhdGVOZXdQYXRoKFN0cmluZyBuZXdOYW1lKXsKLQkJcmV0dXJuIGZSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQobmV3TmFtZSkudG9TdHJpbmcoKTsKLQl9Ci0JCQotCS8vLS0tIGNoYW5nZXMgCi0JCi0JLyogbm9uIGphdmEtZG9jIAotCSAqIEBzZWUgSVJlZmFjdG9yaW5nI2NyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJcG0uYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQl0cnl7Ci0JCQlyZXR1cm4gbmV3IFJlc291cmNlUmVuYW1lQ2hhbmdlKGZSZXNvdXJjZSwgZ2V0TmV3RWxlbWVudE5hbWUoKSk7Ci0JCX0gZmluYWxseXsKLQkJCXBtLmRvbmUoKTsKLQkJfQkKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVuYW1lVGFyZ2V0TmFtZXNwYWNlUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZVRhcmdldE5hbWVzcGFjZVByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2QzYzg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVuYW1lVGFyZ2V0TmFtZXNwYWNlUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlBhcnRpY2lwYW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lQXJndW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5TaGFyYWJsZVBhcnRpY2lwYW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLklOYW1lVXBkYXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5JUmVmZXJlbmNlVXBkYXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5UZXh0Q2hhbmdlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi0KLXB1YmxpYyBjbGFzcyBSZW5hbWVUYXJnZXROYW1lc3BhY2VQcm9jZXNzb3IgZXh0ZW5kcyBSZW5hbWVQcm9jZXNzb3IgaW1wbGVtZW50cyBJTmFtZVVwZGF0aW5nLCBJUmVmZXJlbmNlVXBkYXRpbmcKLXsKLQlwcml2YXRlIFN0cmluZyBuZXdOYW1lc3BhY2U7Ci0JcHJpdmF0ZSBib29sZWFuIHVwZGF0ZVJlZmVyZW5jZXMgPSB0cnVlOwotCXByaXZhdGUgVGV4dENoYW5nZU1hbmFnZXIgY2hhbmdlTWFuYWdlcjsKLQlwcml2YXRlIFhTRFNjaGVtYSBtb2RlbDsKLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFTlRJRklFUiA9ICJvcmcuZWNsaXBzZS53c3QudWkueHNkLnJlbmFtZUNvbXBvbmVudFByb2Nlc3NvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBSZW5hbWVUYXJnZXROYW1lc3BhY2VQcm9jZXNzb3IoWFNEU2NoZW1hIG1vZGVsLCBTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5uZXdOYW1lc3BhY2UgPSBuZXdOYW1lOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5yZWZhY3RvcmluZy50YWdnaW5nLklUZXh0VXBkYXRpbmcjY2FuRW5hYmxlVGV4dFVwZGF0aW5nKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FbmFibGVUZXh0VXBkYXRpbmcoKQotCXsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnRhZ2dpbmcuSVRleHRVcGRhdGluZyNnZXRDdXJyZW50RWxlbWVudE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudEVsZW1lbnROYW1lKCkKLQl7Ci0JCS8vCi0JCXJldHVybiBtb2RlbC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QuaW50ZXJuYWwucmVmYWN0b3JpbmcucmVuYW1lLlhTRFJlbmFtZVByb2Nlc3NvciNnZXRBZmZlY3RlZFByb2plY3ROYXR1cmVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0QWZmZWN0ZWRQcm9qZWN0TmF0dXJlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQkvLyBUT0RPOiBmaW5kIHByb2plY3QgbmF0dXJlcyBvZiB0aGUgZmlsZXMgdGhhdCBhcmUgZ29pbmcgdG8gYmUKLQkJLy8gcmVmYWN0b3JlZAotCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIn07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLmludGVybmFsLnJlZmFjdG9yaW5nLnJlbmFtZS5YU0RSZW5hbWVQcm9jZXNzb3IjbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMob3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXMsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCwgamF2YS5sYW5nLlN0cmluZ1tdLAotCSAqICAgICAgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlNoYXJhYmxlUGFydGljaXBhbnRzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREZXJpdmVkUGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywKLQkJCUxpc3QgcmVzdWx0LCBTdHJpbmdbXSBuYXR1cmVzLCBTaGFyYWJsZVBhcnRpY2lwYW50cyBzaGFyZWQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIG5ld0NVTmFtZT0gZ2V0TmV3RWxlbWVudE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQlSZW5hbWVBcmd1bWVudHMgYXJndW1lbnRzPSBuZXcgUmVuYW1lQXJndW1lbnRzKG5ld0NVTmFtZSwgZ2V0VXBkYXRlUmVmZXJlbmNlcygpKTsKLQkJbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMoc3RhdHVzLCByZXN1bHQsIAotCQkJY29tcHV0ZURlcml2ZWRFbGVtZW50cygpLCBhcmd1bWVudHMsIAotCQkJIG5hdHVyZXMsIHNoYXJlZCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvYWREZXJpdmVkUGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywgTGlzdCByZXN1bHQsIE9iamVjdFtdIGRlcml2ZWRFbGVtZW50cywgCi0JCQlSZW5hbWVBcmd1bWVudHMgYXJndW1lbnRzLCAgU3RyaW5nW10gbmF0dXJlcywgU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZXJpdmVkRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGRlcml2ZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCVJlbmFtZVBhcnRpY2lwYW50W10gcGFydGljaXBhbnRzPSBQYXJ0aWNpcGFudE1hbmFnZXIubG9hZFJlbmFtZVBhcnRpY2lwYW50cyhzdGF0dXMsIAotCQkJCQl0aGlzLCBkZXJpdmVkRWxlbWVudHNbaV0sIAotCQkJCQlhcmd1bWVudHMsIG5hdHVyZXMsIHNoYXJlZCk7Ci0JCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KHBhcnRpY2lwYW50cykpOwotCQkJfQotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIE9iamVjdFtdIGNvbXB1dGVEZXJpdmVkRWxlbWVudHMoKSB7Ci0KLQkJT2JqZWN0W10gZWxlbWVudHMgPSBnZXRFbGVtZW50cygpOwotCQlPYmplY3RbXSByZXN1bHRzID0gbmV3IE9iamVjdFtlbGVtZW50cy5sZW5ndGhdOwotCQlmb3IoaW50IGk9MDsgaTwgZWxlbWVudHMubGVuZ3RoOyBpKyspewotCQkJUmVmYWN0b3JpbmdDb21wb25lbnQgY29tcG9uZW50ID0gKFJlZmFjdG9yaW5nQ29tcG9uZW50KWVsZW1lbnRzW2ldOwotCQkJcmVzdWx0c1tpXSA9IGNvbXBvbmVudC5nZXRNb2RlbE9iamVjdCgpOwotCQkJCi0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JCQotCX0KLQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2NoZWNrRmluYWxDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrRmluYWxDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sCi0JCQlDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHRocm93cyBDb3JlRXhjZXB0aW9uLAotCQkJT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KLQl7Ci0JCXRyeQotCQl7Ci0JCQlSZWZhY3RvcmluZ1N0YXR1cyByZXN1bHQgPSBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQkJCXBtLmJlZ2luVGFzaygiIiwgOSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNoYW5nZU1hbmFnZXIgPSBjcmVhdGVDaGFuZ2VNYW5hZ2VyKG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIDEpLAotCQkJCQlyZXN1bHQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBmaW5hbGx5Ci0JCXsKLQkJCXBtLmRvbmUoKTsKLQkJfQotCQkKLQotCX0KLQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2NoZWNrSW5pdGlhbENvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrSW5pdGlhbENvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgotCXsKLQkJLy8gVE9ETyBhZGQgY29kZSB0byBjaGVjayBpbml0aWFsIGNvbmRpdGlvbnMgZm9yIGNvbXBvbmVudCByZW5hbWUKLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwKLQkJCU9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JewotCQl0cnkKLQkJewotCQkJU3RyaW5nIGNoYW5nZU5hbWUgPSBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLkNvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVzIik7Ci0JCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUNoYW5nZShjaGFuZ2VOYW1lLCBjaGFuZ2VNYW5hZ2VyLmdldEFsbENoYW5nZXMoKSk7Ci0JCX0gZmluYWxseQotCQl7Ci0JCQlwbS5kb25lKCk7Ci0JCX0KLQotCQkvLyBDaGFuZ2VbXSBjaGFuZ2VzID0gQ29tcG9uZW50UmVuYW1lQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3IoCi0JCS8vIHRoaXMuZk5hbWVkQ29tcG9uZW50LCBnZXROZXdFbGVtZW50TmFtZSgpKTsKLQkJLy8KLQkJLy8gaWYgKGNoYW5nZXMubGVuZ3RoID4gMCkKLQkJLy8gewotCQkvLyBDb21wb3NpdGVDaGFuZ2UgbXVsdGlDaGFuZ2UgPSBudWxsOwotCQkvLyBtdWx0aUNoYW5nZSA9IG5ldyBDb21wb3NpdGVDaGFuZ2UoCi0JCS8vICJYU0QgY29tcG9uZW50IHJlbmFtZSBwYXJ0aWNpcGFudCBjaGFuZ2VzIiwgY2hhbmdlcyk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gVE9ETzogZXh0ZXJuYWxpemUgc3RyaW5nCi0JCS8vIHJldHVybiBtdWx0aUNoYW5nZTsKLQkJLy8gfSBlbHNlCi0JCS8vIHsKLQkJLy8KLQkJLy8gcmV0dXJuIG5ldyBDb21wb25lbnRSZW5hbWVDaGFuZ2UoCi0JCS8vIGZOYW1lZENvbXBvbmVudCwKLQkJLy8gZk5hbWVkQ29tcG9uZW50LmdldE5hbWUoKSwKLQkJLy8gZ2V0TmV3RWxlbWVudE5hbWUoKSwKLQkJLy8gZk5hbWVkQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLQkJLy8gfQotCQkKLQkJCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjZ2V0RWxlbWVudHMoKQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cygpCi0JewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgbW9kZWwgfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNnZXRJZGVudGlmaWVyKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKQotCXsKLQkJcmV0dXJuIElERU5USUZJRVI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjZ2V0UHJvY2Vzc29yTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9jZXNzb3JOYW1lKCkKLQl7Ci0JCXJldHVybiBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldEZvcm1hdHRlZFN0cmluZygKLQkJCQkiUmVuYW1lQ29tcG9uZW50UmVmYWN0b3JpbmcubmFtZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQluZXcgU3RyaW5nW10KLQkJCQl7Ci0JCQkJCQlnZXRDdXJyZW50RWxlbWVudE5hbWUoKSwKLQkJCQkJCWdldE5ld0VsZW1lbnROYW1lKCkgfSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNpc0FwcGxpY2FibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlpZiAoZ2V0TW9kZWwoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBUT0RPIGltcGxlbWVudCBpc0FwcGxpY2FibGUgbG9naWMgZm9yIHRoZSBuYW1lZCBjb21wb25lbnQsCi0JCS8vIHZlcmlmeSBob3cgaXQgaXMgZGlmZmVyZW50IGZyb20gb3RoZXIgY29uZGl0aW9uIGNoZWNrcwotCQkvLyBpZiAoZk5hbWVkQ29tcG9uZW50LmlzQW5vbnltb3VzKCkpCi0JCS8vIHJldHVybiBmYWxzZTsKLQkJLy8gaWYgKCEgQ2hlY2tzLmlzQXZhaWxhYmxlKGZUeXBlKSkKLQkJLy8gcmV0dXJuIGZhbHNlOwotCQkvLyBpZiAoaXNTcGVjaWFsQ2FzZShmVHlwZSkpCi0JCS8vIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnRhZ2dpbmcuSU5hbWVVcGRhdGluZyNjaGVja05ld0VsZW1lbnROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrTmV3RWxlbWVudE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlBc3NlcnQuaXNOb3ROdWxsKG5ld05hbWUsICJuZXcgbmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCS8vIFRPRE86IGltcGxlbWVudCBuZXcgbmFtZSBjaGVja2luZwotCQkvLyBSZWZhY3RvcmluZ1N0YXR1cyByZXN1bHQgPSBDaGVja3MuY2hlY2tUeXBlTmFtZShuZXdOYW1lKTsKLQkJLy8gaWYgKENoZWNrcy5pc0FscmVhZHlOYW1lZChmVHlwZSwgbmV3TmFtZSkpCi0JCS8vIHJlc3VsdC5hZGRGYXRhbEVycm9yKFJlZmFjdG9yaW5nQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lVHlwZVJlZmFjdG9yaW5nLmNob29zZV9hbm90aGVyX25hbWUiKSk7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBSZWZhY3RvcmluZ1BhcnRpY2lwYW50W10gbG9hZFBhcnRpY2lwYW50cygKLQkJCVJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywgU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkUGFydGljaXBhbnRzKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVJlbmFtZUFyZ3VtZW50cyBhcmd1bWVudHMgPSBuZXcgUmVuYW1lQXJndW1lbnRzKGdldE5ld0VsZW1lbnROYW1lKCksCi0JCQkJdHJ1ZSk7Ci0JCVN0cmluZ1tdIG5hdHVyZXMgPSBnZXRBZmZlY3RlZFByb2plY3ROYXR1cmVzKCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlsb2FkRWxlbWVudFBhcnRpY2lwYW50cyhzdGF0dXMsIHJlc3VsdCwgYXJndW1lbnRzLCBuYXR1cmVzLAotCQkJCXNoYXJlZFBhcnRpY2lwYW50cyk7Ci0JCWxvYWREZXJpdmVkUGFydGljaXBhbnRzKHN0YXR1cywgcmVzdWx0LCBuYXR1cmVzLCBzaGFyZWRQYXJ0aWNpcGFudHMpOwotCQlyZXR1cm4gKFJlZmFjdG9yaW5nUGFydGljaXBhbnRbXSkgcmVzdWx0Ci0JCQkJLnRvQXJyYXkobmV3IFJlZmFjdG9yaW5nUGFydGljaXBhbnRbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRFbGVtZW50UGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywKLQkJCUxpc3QgcmVzdWx0LCBSZW5hbWVBcmd1bWVudHMgYXJndW1lbnRzLCBTdHJpbmdbXSBuYXR1cmVzLAotCQkJU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJT2JqZWN0W10gZWxlbWVudHMgPSBnZXRFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoUGFydGljaXBhbnRNYW5hZ2VyCi0JCQkJCS5sb2FkUmVuYW1lUGFydGljaXBhbnRzKHN0YXR1cywgdGhpcywgZWxlbWVudHNbaV0sCi0JCQkJCQkJYXJndW1lbnRzLCBuYXR1cmVzLCBzaGFyZWQpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBUZXh0Q2hhbmdlTWFuYWdlciBjcmVhdGVDaGFuZ2VNYW5hZ2VyKElQcm9ncmVzc01vbml0b3IgcG0sCi0JCQlSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlUZXh0Q2hhbmdlTWFuYWdlciBtYW5hZ2VyID0gbmV3IFRleHRDaGFuZ2VNYW5hZ2VyKGZhbHNlKTsKLQkJLy8gb25seSBvbmUgZGVjbGFyYXRpb24gZ2V0cyB1cGRhdGVkCi0JCWFkZERlY2xhcmF0aW9uVXBkYXRlKG1hbmFnZXIpOwotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRGVjbGFyYXRpb25VcGRhdGUoVGV4dENoYW5nZU1hbmFnZXIgbWFuYWdlcikKLQotCXsKLQkJU3RyaW5nIGZpbGVTdHIgPSBnZXRNb2RlbCgpLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlU3RyKTsKLQkJdHJ5Ci0JCXsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKHVyaS50b1N0cmluZygpKTsKLQkJCXVybCA9IFBsYXRmb3JtLnJlc29sdmUodXJsKTsKLQkJCWlmKHVybCAhPSBudWxsKXsKLQkJCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQlJRmlsZSBmaWxlID0gcm9vdC5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgodXJsLmdldEZpbGUoKSkpOwotCQkJCWlmKGZpbGUgIT0gbnVsbCApewotCQkJCQlUZXh0Q2hhbmdlIGNoYW5nZSA9IG1hbmFnZXIuZ2V0KGZpbGUpOwotCQkJCQlhZGREZWNsYXJhdGlvblVwZGF0ZShjaGFuZ2UpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0JCXsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCQotCX0KLQkKLQkKLQotCWZpbmFsIHZvaWQgYWRkRGVjbGFyYXRpb25VcGRhdGUoVGV4dENoYW5nZSBjaGFuZ2UpIAotCXsKLS8vCQlTdHJpbmcgZWRpdE5hbWUgPSBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLkNvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVfZGVjbGF0YXRpb24iKTs7Ci0vLwkgIAotLy8JCU5hbWVkQ29tcG9uZW50UmVuYW1lciByZW5hbWVyID0gbmV3IE5hbWVkQ29tcG9uZW50UmVuYW1lcigKLS8vCQkJCXNlbGVjdGVkQ29tcG9uZW50LmdldEVsZW1lbnQoKSwgbmV3TmFtZXNwYWNlKTsKLS8vCQlyZW5hbWVyLnJlbmFtZUNvbXBvbmVudCgpOwotLy8JCUxpc3QgdGV4dEVkaXRzID0gcmVuYW1lci5nZXRUZXh0RWRpdHMoKTsKLS8vCQlmb3IgKGludCBqID0gMDsgaiA8IHRleHRFZGl0cy5zaXplKCk7IGorKykKLS8vCQl7Ci0vLwkJCVJlcGxhY2VFZGl0IHJlcGxhY2VFZGl0ID0gKFJlcGxhY2VFZGl0KSB0ZXh0RWRpdHMKLS8vCQkJCQkuZ2V0KGopOwotLy8JCQlUZXh0Q2hhbmdlQ29tcGF0aWJpbGl0eS5hZGRUZXh0RWRpdChjaGFuZ2UsCi0vLwkJCQkJZWRpdE5hbWUsIHJlcGxhY2VFZGl0KTsKLS8vCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV3RWxlbWVudE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQl0aGlzLm5ld05hbWVzcGFjZSA9IG5ld05hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXdFbGVtZW50TmFtZSgpCi0JewotCQlyZXR1cm4gbmV3TmFtZXNwYWNlOwotCX0KLQotCQotCi0JcHVibGljIGJvb2xlYW4gY2FuRW5hYmxlVXBkYXRlUmVmZXJlbmNlcygpCi0JewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRVcGRhdGVSZWZlcmVuY2VzKCkKLQl7Ci0JCXJldHVybiB1cGRhdGVSZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZVJlZmVyZW5jZXMoYm9vbGVhbiB1cGRhdGUpCi0JewotCQl1cGRhdGVSZWZlcmVuY2VzID0gdXBkYXRlOwotCQkKLQl9Ci0KLQlwdWJsaWMgZmluYWwgVGV4dENoYW5nZU1hbmFnZXIgZ2V0Q2hhbmdlTWFuYWdlcigpCi0JewotCQlyZXR1cm4gY2hhbmdlTWFuYWdlcjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgWFNEU2NoZW1hIGdldE1vZGVsKCkKLQl7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1Jlc291cmNlUmVuYW1lQ2hhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1Jlc291cmNlUmVuYW1lQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMTNlMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZXNvdXJjZVJlbmFtZUNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ01lc3NhZ2VzOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBjaGFuZ2UgdGhhdCByZW5hbWVzIGEgZ2l2ZW4gcmVzb3VyY2UKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlUmVuYW1lQ2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKLQotCS8qCi0JICogd2UgY2Fubm90IHVzZSBoYW5kbGVzIGJlY2F1c2UgdGhleSBiZWNhbWUgaW52YWxpZCB3aGVuIHlvdSByZW5hbWUgdGhlIHJlc291cmNlLgotCSAqIHBhdGhzIGRvIG5vdC4KLQkgKi8KLQlwcml2YXRlIElQYXRoIGZSZXNvdXJjZVBhdGg7Ci0KLQlwcml2YXRlIFN0cmluZyBmTmV3TmFtZTsKLQotCS8qKgotCSAqIEBwYXJhbSBuZXdOYW1lIGluY2x1ZGVzIHRoZSBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VSZW5hbWVDaGFuZ2UoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzKHJlc291cmNlLmdldEZ1bGxQYXRoKCksIG5ld05hbWUpOwotCX0KLQotCXByaXZhdGUgUmVzb3VyY2VSZW5hbWVDaGFuZ2UoSVBhdGggcmVzb3VyY2VQYXRoLCBTdHJpbmcgbmV3TmFtZSkgewotCQlmUmVzb3VyY2VQYXRoPSByZXNvdXJjZVBhdGg7Ci0JCWZOZXdOYW1lPSBuZXdOYW1lOwotCX0KLQotCXByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGZSZXNvdXJjZVBhdGgpOwotCX0KLQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCS8vIFRPRE86IGltcGxlbWVudCBmaWxlIHZhbGlkYXRpb24sIHNlZSBKRFRDaGFuZ2UKLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQkKLQkvKgotCSAqIHRvIGF2b2lkIHRoZSBleGNlcHRpb24gc2VuZGVycyBzaG91bGQgY2hlY2sgaWYgYSByZXNvdXJjZSB3aXRoIHRoZSBuZXcgbmFtZQotCSAqIGFscmVhZHkgZXhpc3RzCi0JICovCi0JcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXBtLmJlZ2luVGFzayhSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiWFNEUmVuYW1lUmVzb3VyY2VDaGFuZ2UucmVuYW1lX3Jlc291cmNlIiksIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJCWdldFJlc291cmNlKCkubW92ZShyZW5hbWVkUmVzb3VyY2VQYXRoKGZSZXNvdXJjZVBhdGgsIGZOZXdOYW1lKSwgZ2V0Q29yZVJlbmFtZUZsYWdzKCksIHBtKTsKLQotCQkJU3RyaW5nIG9sZE5hbWU9IGZSZXNvdXJjZVBhdGgubGFzdFNlZ21lbnQoKTsKLQkJCUlQYXRoIG5ld1BhdGg9IHJlbmFtZWRSZXNvdXJjZVBhdGgoZlJlc291cmNlUGF0aCwgZk5ld05hbWUpOwotCQkJcmV0dXJuIG5ldyBSZXNvdXJjZVJlbmFtZUNoYW5nZShuZXdQYXRoLCBvbGROYW1lKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXBtLmRvbmUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGdldENvcmVSZW5hbWVGbGFncygpIHsKLQkJaWYgKGdldFJlc291cmNlKCkuaXNMaW5rZWQoKSkKLQkJCXJldHVybiBJUmVzb3VyY2UuU0hBTExPVzsKLQkJZWxzZQotCQkJcmV0dXJuIElSZXNvdXJjZS5OT05FOwotCX0KLQotCS8qCi0JICogY2hhbmdlcyByZXNvdXJjZSBuYW1lcyAvcy9wL0EuamF2YSByZW5hbWVkIHRvIEIuamF2YSBiZWNvbWVzIC9zL3AvQi5qYXZhCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCByZW5hbWVkUmVzb3VyY2VQYXRoKElQYXRoIHBhdGgsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQobmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRGb3JtYXR0ZWRTdHJpbmcoCi0JCQkiWFNEUmVuYW1lUmVzb3VyY2VDaGFuZ2UubmFtZSIsIG5ldyBTdHJpbmdbXXtmUmVzb3VyY2VQYXRoLnRvU3RyaW5nKCksIC8vJE5PTi1OTFMtMSQKLQkJCXJlbmFtZWRSZXNvdXJjZVBhdGgoZlJlc291cmNlUGF0aCwgZk5ld05hbWUpLnRvU3RyaW5nKCl9KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZSNpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZXNvdXJjZVJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1Jlc291cmNlUmVuYW1lUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMyYmY4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1Jlc291cmNlUmVuYW1lUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dENoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuVGV4dENoYW5nZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLS8qKgotICogVGhpcyByZW5hbWUgcGFydGljaXBhbnQgY3JlYXRlcyB0ZXh0IGNoYW5nZXMgZm9yIHRoZSByZWZlcmVuY2VzIG9mIHRoZSBYU0QgYW5kIFdTREwgZmlsZXMKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlUmVuYW1lUGFydGljaXBhbnQgZXh0ZW5kcyBSZW5hbWVQYXJ0aWNpcGFudCB7Ci0JCi0vLwlwcml2YXRlIElGaWxlIGZpbGUgPSBudWxsOwotCXByaXZhdGUgVGV4dENoYW5nZU1hbmFnZXIgY2hhbmdlTWFuYWdlcjsKLQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBYU0RfQ09OVEVOVF9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBXU0RMX0NPTlRFTlRfVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC53c2Rsc291cmNlIjsKLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkvLyBjaGVjayBpZiBmaWxlIGhhcyBYU0Qgb3IgV1NETCBjb250ZW50Ci0JCQlJRmlsZSBhRmlsZSA9IChJRmlsZSkgZWxlbWVudDsKLQkJCXRyeSB7Ci0JCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGFGaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCWlmICggZGVzY3JpcHRpb24gPT0gbnVsbCApCi0gIAkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gZGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCQlpZihjb250ZW50VHlwZSAhPSBudWxsKXsKLQkJCQkJaWYoWFNEX0NPTlRFTlRfVFlQRV9JRC5lcXVhbHMoY29udGVudFR5cGUuZ2V0SWQoKSkgfHwKLQkJCQkJCQlXU0RMX0NPTlRFTlRfVFlQRV9JRC5lcXVhbHMoY29udGVudFR5cGUuZ2V0SWQoKSkpewotLy8JCQkJCQlmaWxlID0gYUZpbGU7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlc291cmNlUmVuYW1lUGFydGljaXBhbnQuY29tcG9zaXRlQ2hhbmdlTmFtZSIpOwotCX0KLQkKLS8vCXByaXZhdGUgSVBhdGggZ2V0TmV3RmlsZVBhdGgoKSB7Ci0vLwkJCi0vLwkJSVBhdGggb2xkUGF0aCA9IGZpbGUuZ2V0UmF3TG9jYXRpb24oKTsKLS8vCQlJUGF0aCBuZXdQYXRoID0gb2xkUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYXBwZW5kKGdldEFyZ3VtZW50cygpLmdldE5ld05hbWUoKSk7Ci0vLwkJcmV0dXJuIG5ld1BhdGg7Ci0vLwl9Ci0KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sCi0JCQlDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgotCXsKLQkJUmVmYWN0b3JpbmdTdGF0dXMgcmVzdWx0ID0gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JCXRyeQotCQl7Ci0JCQlwbS5iZWdpblRhc2soIiIsIDkpOyAvLyROT04tTkxTLTEkCi0JCQljaGFuZ2VNYW5hZ2VyID0gY3JlYXRlQ2hhbmdlTWFuYWdlcihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHBtLCAxKSwKLQkJCQkJcmVzdWx0KTsKLQkJCQotCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSl7Ci0JCQlyZXN1bHQuYWRkRmF0YWxFcnJvcihlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkJcG0uZG9uZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0JCi0JCi0KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwKLQkJCU9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JewotCQl0cnkKLQkJewotCQkJU3RyaW5nIGNoYW5nZU5hbWUgPSBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lUmVzb3VyY2VDaGFuZ2UucmVuYW1lX3Jlc291cmNlX3JlZmVyZW5jZV9jaGFuZ2UiKTsKLQkJCVRleHRDaGFuZ2VbXSBjaGFuZ2VzID0gIGNoYW5nZU1hbmFnZXIuZ2V0QWxsQ2hhbmdlcygpOwotCQkJaWYoY2hhbmdlcy5sZW5ndGggPiAwKXsKLQkJCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUNoYW5nZShjaGFuZ2VOYW1lLCBjaGFuZ2VzKTsKLQkJCX0KLQkJCWVsc2V7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJfSBmaW5hbGx5Ci0JCXsKLQkJCXBtLmRvbmUoKTsKLQkJfQotCi0JfQotCQotCQotCXByaXZhdGUgVGV4dENoYW5nZU1hbmFnZXIgY3JlYXRlQ2hhbmdlTWFuYWdlcihJUHJvZ3Jlc3NNb25pdG9yIHBtLAotCQkJUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJVGV4dENoYW5nZU1hbmFnZXIgbWFuYWdlciA9IG5ldyBUZXh0Q2hhbmdlTWFuYWdlcihmYWxzZSk7Ci0JCS8vIG9ubHkgb25lIGRlY2xhcmF0aW9uIGdldHMgdXBkYXRlZAotCQkvL2FkZERlY2xhcmF0aW9uVXBkYXRlKG1hbmFnZXIpOwotCQlpZiAoZ2V0QXJndW1lbnRzKCkuZ2V0VXBkYXRlUmVmZXJlbmNlcygpKQotCQkJYWRkT2NjdXJyZW5jZXMobWFuYWdlciwgcG0sIHN0YXR1cyk7Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCi0KLQl2b2lkIGFkZE9jY3VycmVuY2VzKFRleHRDaGFuZ2VNYW5hZ2VyIG1hbmFnZXIsIElQcm9ncmVzc01vbml0b3IgcG0sCi0JCQlSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotLy8JCQotLy8JCU9iamVjdFtdIG9jY3VycmVuY2VzID0gU2VhcmNoVG9vbHMuZ2V0RmlsZURlcGVuZGVuY2llcyhmaWxlKTsKLS8vCQlwbS5iZWdpblRhc2soIiIsIG9jY3VycmVuY2VzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLS8vCQkKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IG9jY3VycmVuY2VzLmxlbmd0aDsgaSsrKQotLy8JCXsKLS8vCQkJT2JqZWN0IG9iamVjdCA9IG9jY3VycmVuY2VzW2ldOwotLy8KLS8vCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdEdyb3VwKQotLy8JCQl7Ci0vLwkJCQlTZWFyY2hSZXN1bHRHcm91cCBzZWFyY2hSZXN1bHQgPSAoU2VhcmNoUmVzdWx0R3JvdXApIG9iamVjdDsKLS8vCQkJCWlmIChzZWFyY2hSZXN1bHQgPT0gbnVsbCkKLS8vCQkJCQljb250aW51ZTsKLS8vCQkJCQotLy8JCQkJSUZpbGUgcmVmZXJlbmNpbmdGaWxlID0gKElGaWxlKXNlYXJjaFJlc3VsdC5nZXRSZXNvdXJjZSgpOwotLy8JCQkJCQotLy8JCQkJcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0vLwkJCQkvLyBmb3IgZWFjaCByZXN1bHQgZmlsZSBjcmVhdGUgWFNEIG1vZGVsIGFuZCBnZXQgY29tcG9uZW50IGZyb20gdGhhdCBtb2RlbAotLy8JCQkJcmVzb3VyY2VTZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZCgKLS8vCQkJCQkJbmV3IFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeSgpKTsKLS8vCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShyZWZlcmVuY2luZ0ZpbGUuZ2V0TG9jYXRpb24oKS50b1BvcnRhYmxlU3RyaW5nKCkpOwotLy8JCQkJdHJ5Ci0vLwkJCQl7Ci0vLwkJCQkJWFNEU2NoZW1hIHNjaGVtYSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNjaGVtYSgpOwotLy8JCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQocmVmZXJlbmNpbmdGaWxlKTsKLS8vCQkJCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWw7Ci0vLwkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgWFNEUmVzb3VyY2VJbXBsKCk7Ci0vLwkJCQkJcmVzb3VyY2Uuc2V0VVJJKHVyaSk7Ci0vLwkJCQkJc2NoZW1hID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2NoZW1hKCk7Ci0vLwkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoc2NoZW1hKTsKLS8vCQkJCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOwotLy8JCQkJCXNjaGVtYS5zZXRFbGVtZW50KGRvbU1vZGVsLmdldERvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotLy8JCQkJCS8vIGdldCB0YXJnZXQgbmFtZXNwYWNlIAotLy8JCQkJCVN0cmluZyBzdHJpbmdQYXRoID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0vLwkJCQkJU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IFhNTFF1aWNrU2Nhbi5nZXRUYXJnZXROYW1lc3BhY2Uoc3RyaW5nUGF0aCk7Ci0vLwkJCQkJdGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlID09IG51bGwgPyAiIiA6IHRhcmdldE5hbWVzcGFjZTsKLS8vCi0vLwkJCQkJTGlzdCB0ZXh0RWRpdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCQkJU2VhcmNoTWF0Y2hbXSBtYXRjaGVzID0gc2VhcmNoUmVzdWx0LmdldFNlYXJjaFJlc3VsdHMoKTsKLS8vCQkJCQkKLS8vCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1hdGNoZXMubGVuZ3RoOyBqKyspIHsKLS8vCQkJCQkJU2VhcmNoTWF0Y2ggbWF0Y2ggPSBtYXRjaGVzW2pdOwotLy8JCQkJCQkKLS8vCQkJCQkJRmlsZVJlZmVyZW5jZVJlbmFtZXIgcmVuYW1lciA9IG5ldyBGaWxlUmVmZXJlbmNlUmVuYW1lcigKLS8vCQkJCQkJCQltYXRjaC5nZXRBdHRyVmFsdWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBnZXROZXdGaWxlUGF0aCgpLnRvU3RyaW5nKCksIHNjaGVtYSk7Ci0vLwkJCQkJCXJlbmFtZXIudmlzaXRTY2hlbWEoc2NoZW1hKTsKLS8vCQkJCQkgICAgdGV4dEVkaXRzLmFkZEFsbChyZW5hbWVyLmdldFRleHRFZGl0cygpKTsKLS8vCQkJCQl9Ci0vLwkJCQkJCi0vLwkJCQkJCi0vLwkJCQkJaWYoIXRleHRFZGl0cy5pc0VtcHR5KCkpewotLy8JCQkJCQlUZXh0Q2hhbmdlIHRleHRDaGFuZ2UgPSBtYW5hZ2VyLmdldChyZWZlcmVuY2luZ0ZpbGUpOwotLy8JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHRleHRFZGl0cy5zaXplKCk7IGorKykKLS8vCQkJCQkJewotLy8JCQkJCQkJUmVwbGFjZUVkaXQgcmVwbGFjZUVkaXQgPSAoUmVwbGFjZUVkaXQpIHRleHRFZGl0cwotLy8JCQkJCQkJCQkuZ2V0KGopOwotLy8JCQkJCQkJU3RyaW5nIGVkaXROYW1lID0gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlc291cmNlUmVuYW1lUGFydGljaXBhbnQuRmlsZV9SZW5hbWVfdXBkYXRlX3JlZmVyZW5jZSIpOwotLy8JCQkJCQkJVGV4dENoYW5nZUNvbXBhdGliaWxpdHkuYWRkVGV4dEVkaXQodGV4dENoYW5nZSwKLS8vCQkJCQkJCQkJZWRpdE5hbWUsIHJlcGxhY2VFZGl0KTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCQkKLS8vCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotLy8JCQkJewotLy8JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJCQl9IGZpbmFsbHkKLS8vCQkJCXsKLS8vCi0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0JfQotCQotCQotCXB1YmxpYyAgY2xhc3MgUmVmZXJlbmNlTG9jYXRpb25GaW5kZXIKLQl7Ci0JCXByb3RlY3RlZCBYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQ7Ci0JCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQkJcHJvdGVjdGVkIFhTRFNjaGVtYSByZWZlcmVuY2luZ1NjaGVtYTsKLQkJcHJvdGVjdGVkIExpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgUmVmZXJlbmNlTG9jYXRpb25GaW5kZXIoWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50LAotCQkJCVN0cmluZyBuYW1lLCBYU0RTY2hlbWEgcmVmZXJlbmNpbmdTY2hlbWEpCi0JCXsKLQkJCXRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMucmVmZXJlbmNpbmdTY2hlbWEgPSByZWZlcmVuY2luZ1NjaGVtYTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpCi0JCXsKLQkJCQotCQkJLy9YU0RTd2l0Y2ggeHNkU3dpdGNoID0gbmV3IFhTRFN3aXRjaCgpCi0vLwkJCXsKLS8vCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRFR5cGVEZWZpbml0aW9uKFhTRFR5cGVEZWZpbml0aW9uIG9iamVjdCkKLS8vCQkJCXsKLS8vCQkJCQlHbG9iYWxUeXBlUmVmZXJlbmNlUmVuYW1lciByZW5hbWVyID0gbmV3IEdsb2JhbFR5cGVSZWZlcmVuY2VSZW5hbWVyKAotLy8JCQkJCQkJb2JqZWN0LmdldE5hbWUoKSwgb2JqZWN0LmdldFRhcmdldE5hbWVzcGFjZSgpLCBuYW1lLCByZWZlcmVuY2luZ1NjaGVtYSk7Ci0vLwkJCQkJcmVuYW1lci52aXNpdFNjaGVtYShyZWZlcmVuY2luZ1NjaGVtYSk7Ci0vLwkJCQkJcmVzdWx0cy5hZGRBbGwocmVuYW1lci5nZXRUZXh0RWRpdHMoKSk7Ci0vLwkJCQkJcmV0dXJuIG51bGw7Ci0vLwkJCQl9Ci0vLwotLy8JCQkJcHVibGljIE9iamVjdCBjYXNlWFNERWxlbWVudERlY2xhcmF0aW9uKAotLy8JCQkJCQlYU0RFbGVtZW50RGVjbGFyYXRpb24gb2JqZWN0KQotLy8JCQkJewotLy8JCQkJCWlmIChvYmplY3QuaXNHbG9iYWwoKSkKLS8vCQkJCQl7Ci0vLwkJCQkJCUdsb2JhbEVsZW1lbnRSZW5hbWVyIHJlbmFtZXIgPSBuZXcgR2xvYmFsRWxlbWVudFJlbmFtZXIoCi0vLwkJCQkJCQkJb2JqZWN0LmdldE5hbWUoKSwgb2JqZWN0LmdldFRhcmdldE5hbWVzcGFjZSgpLCBuYW1lLCByZWZlcmVuY2luZ1NjaGVtYSk7Ci0vLwkJCQkJCXJlbmFtZXIudmlzaXRTY2hlbWEocmVmZXJlbmNpbmdTY2hlbWEpOwotLy8JCQkJCQlyZXN1bHRzLmFkZEFsbChyZW5hbWVyLmdldFRleHRFZGl0cygpKTsKLS8vCQkJCQl9Ci0vLwkJCQkJcmV0dXJuIG51bGw7Ci0vLwkJCQl9Ci0vLwotLy8JCQkJcHVibGljIE9iamVjdCBjYXNlWFNETW9kZWxHcm91cERlZmluaXRpb24oCi0vLwkJCQkJCVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG9iamVjdCkKLS8vCQkJCXsKLS8vCQkJCQlHbG9iYWxHcm91cFJlbmFtZXIgcmVuYW1lciA9IG5ldyBHbG9iYWxHcm91cFJlbmFtZXIoCi0vLwkJCQkJCQlvYmplY3QuZ2V0TmFtZSgpLCBvYmplY3QuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIG5hbWUsIHJlZmVyZW5jaW5nU2NoZW1hKTsKLS8vCQkJCQlyZW5hbWVyLnZpc2l0U2NoZW1hKHJlZmVyZW5jaW5nU2NoZW1hKTsKLS8vCQkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJCX0KLS8vCQkJfTsKLQkJCS8veHNkU3dpdGNoLmRvU3dpdGNoKGNvbXBvbmVudCk7Ci0vLwkJCWNvbXBvbmVudC5zZXROYW1lKG5hbWUpOwotLy8JCQl0cnkKLS8vCQkJewotLy8JCQkJcmVmZXJlbmNpbmdTY2hlbWEuZVJlc291cmNlKCkuc2F2ZShuZXcgSGFzaE1hcCgpKTsKLS8vCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLS8vCQkJewotLy8JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQkJfQotCi0JCX0KLQotCQlwdWJsaWMgZmluYWwgTGlzdCBnZXRSZXN1bHRzKCkKLQkJewotCQkJcmV0dXJuIHJlc3VsdHM7Ci0JCX0KLQl9Ci0JCi0JCi0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1NvcnRpbmdTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvU29ydGluZ1NlYXJjaFJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTQwYThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvU29ydGluZ1NlYXJjaFJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgU29ydGluZ1NlYXJjaFJlcXVlc3RvciBleHRlbmRzIFNlYXJjaFJlcXVlc3RvciB7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTk9OQU1FU1BBQ0UgPSAibm9uYW1lc3BhY2UiOwotCi0JCi0JCXByaXZhdGUgTWFwIGZGb3VuZDsKLQotCQlwdWJsaWMgU29ydGluZ1NlYXJjaFJlcXVlc3RvcigpIHsKLQkJCWZGb3VuZD0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQkKLQotCQkKLQkJLyoqCi0JCSAqIEByZXR1cm4gYSBMaXN0IG9mIHtAbGluayBTZWFyY2hNYXRjaH1lcyAoc29ydGVkIGJ5IG5hbWVzcGFjZSkKLQkJICovCi0JCXB1YmxpYyBNYXAvKiBuYW1lc3BhY2UgLSA8U2VhcmNoTWF0Y2g+Ki8gZ2V0UmVzdWx0cygpIHsKLQkJCXJldHVybiBmRm91bmQ7Ci0JCX0KLQotCi0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWwucHJvdmlzaW9uYWwuU2VhcmNoUmVxdWVzdG9yI2FjY2VwdFNlYXJjaE1hdGNoKG9yZy5lY2xpcHNlLndzdC5jb21tb24uc2VhcmNoLmludGVybmFsLnByb3Zpc2lvbmFsLlNlYXJjaE1hdGNoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWNjZXB0U2VhcmNoTWF0Y2goU2VhcmNoTWF0Y2ggbWF0Y2gpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkJCi0JCQlpZihtYXRjaCAhPSBudWxsICYmIG1hdGNoLmdldE9iamVjdCgpIGluc3RhbmNlb2YgTm9kZSl7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpbWF0Y2guZ2V0T2JqZWN0KCk7Ci0JCQkJRWxlbWVudCBkb21FbGVtZW50ID0gbnVsbDsKLQkJCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERToKLQkJCQkJZG9tRWxlbWVudCA9ICgoQXR0cilub2RlKS5nZXRPd25lckVsZW1lbnQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLQkJCQkJZG9tRWxlbWVudCA9ICgoRWxlbWVudClub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCVN0cmluZyBuYW1lc3BhY2UgPSBkb21FbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotCQkJCWlmKG5hbWVzcGFjZSA9PSBudWxsIHx8IG5hbWVzcGFjZS5lcXVhbHMoIiIpKXsKLQkJCQkJbmFtZXNwYWNlID0gTk9OQU1FU1BBQ0U7Ci0JCQkJfQotCQkJCUxpc3QgbWF0Y2hlcyA9IGdldE1hdGNoZXMobmFtZXNwYWNlKTsKLQkJCQltYXRjaGVzLmFkZChtYXRjaCk7CQkJCi0JCQl9Ci0JCQkKLQkJfQotCQkKLQkJcHJpdmF0ZSBMaXN0IGdldE1hdGNoZXMoU3RyaW5nIG5hbWVzcGFjZSl7Ci0JCQlPYmplY3QgbWF0Y2hlcyA9IGZGb3VuZC5nZXQobmFtZXNwYWNlKTsKLQkJCWlmKCEobWF0Y2hlcyBpbnN0YW5jZW9mIExpc3QpKXsKLQkJCQltYXRjaGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZGb3VuZC5wdXQobmFtZXNwYWNlLCBtYXRjaGVzKTsKLQkJCX0KLQkJCXJldHVybiAoTGlzdCltYXRjaGVzOwotCQkJCi0JCX0KLQkJCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1hNTENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1hNTENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYmEzMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9YTUxDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dENoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuVGV4dENoYW5nZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci51dGlsLlRleHRDaGFuZ2VDb21wYXRpYmlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWE1MQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQgZXh0ZW5kcyBSZW5hbWVQYXJ0aWNpcGFudCB7Ci0JCi0JcHJvdGVjdGVkIFNlYXJjaE1hdGNoIG1hdGNoOwotCi0JcHJvdGVjdGVkIFRleHRDaGFuZ2VNYW5hZ2VyIGNoYW5nZU1hbmFnZXI7Ci0JcHJvdGVjdGVkIExpc3QgbWF0Y2hlczsKLQotICAgIAotICAgIAotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCi0JCWlmKGdldEFyZ3VtZW50cygpIGluc3RhbmNlb2YgQ29tcG9uZW50UmVuYW1lQXJndW1lbnRzKXsKLQkJCS8vIGNoYW5nZU1hbmdlciBpcyBwYXNzZWQgaW4gZnJvbSB0aGUgUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yIHRvIGNvbGxlY3QgYWxsIHRoZSBjaGFuZ2VzCi0JCQljaGFuZ2VNYW5hZ2VyID0gKChDb21wb25lbnRSZW5hbWVBcmd1bWVudHMpZ2V0QXJndW1lbnRzKCkpLmdldENoYW5nZU1hbmFnZXIoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiWE1MIENvbXBvbmVudCBSZW5hbWUgUGFydGljaXBhbnQiOwotCX0KLQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRleHRDaGFuZ2VNYW5hZ2VyIGdldENoYW5nZU1hbmFnZXIoKXsKLQkJCi0JCWlmKGNoYW5nZU1hbmFnZXIgPT0gbnVsbCl7Ci0JCQkJY2hhbmdlTWFuYWdlciA9IG5ldyBUZXh0Q2hhbmdlTWFuYWdlcihmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIGNoYW5nZU1hbmFnZXI7Ci0JCQotCX0KLQkKLS8vCXByaXZhdGUgUmVmYWN0b3JpbmdTdGF0dXMgY3JlYXRlUmVuYW1lQ2hhbmdlcyhmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQlBc3NlcnQuaXNOb3ROdWxsKG1vbml0b3IpOwotLy8JCWZpbmFsIFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cz0gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0vLwkJdHJ5IHsKLS8vCQkJbW9uaXRvci5iZWdpblRhc2soIlJlZmFjdG9yaW5nTWVzc2FnZXMuUmVuYW1lQ29tcG9uZW50UmVmYWN0b3Jpbmdfc2VhcmNoaW5nIiwgMSk7IAotLy8JCQljcmVhdGVSZW5hbWVDaGFuZ2VzKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotLy8JCQkvL3VwZGF0ZUNoYW5nZU1hbmFnZXIobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSwgc3RhdHVzKTsKLS8vCQl9IGZpbmFsbHkgewotLy8JCQltb25pdG9yLmRvbmUoKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIHN0YXR1czsKLS8vCX0KLQotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uLAotCQkJT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXRjaGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU2VhcmNoTWF0Y2ggbWF0Y2ggPSAoU2VhcmNoTWF0Y2gpIGl0ZXIubmV4dCgpOwotCQkJVGV4dENoYW5nZSB0ZXh0Q2hhbmdlID0gZ2V0Q2hhbmdlTWFuYWdlcigpLmdldChtYXRjaC5nZXRGaWxlKCkpOwotCQkJU3RyaW5nIG5ld05hbWUgPSBnZXRBcmd1bWVudHMoKS5nZXROZXdOYW1lKCk7Ci0JCQlTdHJpbmcgcXVhbGlmaWVyID0gIiI7Ci0JCQlpZihnZXRBcmd1bWVudHMoKSBpbnN0YW5jZW9mIENvbXBvbmVudFJlbmFtZUFyZ3VtZW50cyl7Ci0JCQkJcXVhbGlmaWVyID0gKChDb21wb25lbnRSZW5hbWVBcmd1bWVudHMpZ2V0QXJndW1lbnRzKCkpLmdldFF1YWxpZmllcigpOwotCQkJfQotCQkJaWYobWF0Y2guZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBOb2RlKXsKLQkJCQlOb2RlIG5vZGUgPSAoTm9kZSltYXRjaC5nZXRPYmplY3QoKTsKLQkJCQlpZihub2RlIGluc3RhbmNlb2YgSURPTUF0dHIpewotCQkJCQlJRE9NQXR0ciBhdHRyID0gKElET01BdHRyKW5vZGU7Ci0JCQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpYXR0ci5nZXRPd25lckVsZW1lbnQoKSA7Ci0JCQkJCW5ld05hbWUgPSBnZXROZXdRTmFtZShlbGVtZW50LCBxdWFsaWZpZXIsIG5ld05hbWUpOwotCQkJCX0KLQkJCQluZXdOYW1lID0gUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLnF1b3RlU3RyaW5nKG5ld05hbWUpOwotCQkJfQotCQkJCi0JCQlSZXBsYWNlRWRpdCByZXBsYWNlRWRpdCA9IG5ldyBSZXBsYWNlRWRpdChtYXRjaC5nZXRPZmZzZXQoKSwgbWF0Y2guZ2V0TGVuZ3RoKCksIG5ld05hbWUgKTsKLQkJCVN0cmluZyBlZGl0TmFtZSA9IFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZV9yZWZlcmVuY2UiKTsKLQkJCVRleHRDaGFuZ2VDb21wYXRpYmlsaXR5LmFkZFRleHRFZGl0KHRleHRDaGFuZ2UsIGVkaXROYW1lLCByZXBsYWNlRWRpdCk7Ci0gICAJCX0KLQkJLy8gZG9uJ3QgY3JlYXRlIGFueSBjaGFuZ2Ugbm93LCBhbGwgdGhlIGNoYW5nZXMgYXJlIGluIGNoYW5nZU1hbmdlciB2YXJpYWJsZSBhbmQgd2lsbCBiZSBjb21iaW5lZCBpbiBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IucG9zdENyZWF0ZUNoYW5nZSBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXROZXdRTmFtZShOb2RlIG5vZGUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5ld05hbWUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZWZpeCA9IFhTRENvbnN0YW50cy5sb29rdXBRdWFsaWZpZXIobm9kZSwgdGFyZ2V0TmFtZXNwYWNlKTsKLQkJCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc2IuYXBwZW5kKHByZWZpeCk7Ci0JCQkJc2IuYXBwZW5kKCI6Iik7Ci0JCQkJc2IuYXBwZW5kKG5ld05hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQlzYi5hcHBlbmQobmV3TmFtZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQobmV3TmFtZSk7Ci0JCX0KLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2hhbmdlTWFuYWdlcihUZXh0Q2hhbmdlTWFuYWdlciBjaGFuZ2VNYW5hZ2VyKQotICB7Ci0gICAgdGhpcy5jaGFuZ2VNYW5hZ2VyID0gY2hhbmdlTWFuYWdlcjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1hTRENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1hTRENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMTY5ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9YU0RDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLklYU0RTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotCi0vKioKLSAqIFRoaXMgcGFydGljaXBhbnQgdGFrZXMgY2FzZSBvZiByZW5hbWluZyBtYXRjaGVzIHRoYXQgYXJlIFhTRCBjb21wb25lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIFhNTENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50IHsKLQotcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQlzdXBlci5pbml0aWFsaXplKGVsZW1lbnQpOwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpewotCQkJaWYoZ2V0QXJndW1lbnRzKCkgaW5zdGFuY2VvZiBDb21wb25lbnRSZW5hbWVBcmd1bWVudHMpewotCQkJCW1hdGNoZXMgPSAoTGlzdCkoKENvbXBvbmVudFJlbmFtZUFyZ3VtZW50cylnZXRBcmd1bWVudHMoKSkuZ2V0TWF0Y2hlcygpLmdldChJWFNEU2VhcmNoQ29uc3RhbnRzLlhNTFNDSEVNQV9OQU1FU1BBQ0UpOwotCQkJfQotCQkJaWYobWF0Y2hlcyAhPSBudWxsKXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkKLQkJcmV0dXJuICJYU0QgY29tcG9uZW50IHJlbmFtZSBwYXJ0aWNpcGFudCI7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9BYnN0cmFjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvQWJzdHJhY3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOWViYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9BYnN0cmFjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21tYW5kIAotewotICBwcml2YXRlIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudDsKLSAgcHJpdmF0ZSBYU0RDb25jcmV0ZUNvbXBvbmVudCBtb2RlbDsKLQotICBwcm90ZWN0ZWQgQWJzdHJhY3RDb21tYW5kKFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCkKLSAgewotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICB9Ci0gIAotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBydW4oKTsKLQotICBwcm90ZWN0ZWQgWFNEQ29uY3JldGVDb21wb25lbnQgZ2V0UGFyZW50KCkKLSAgewotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRNb2RlbE9iamVjdCgpCi0gIHsKLSAgICByZXR1cm4gbW9kZWw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNldE1vZGVsT2JqZWN0KFhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsKQotICB7Ci0gICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICB9Ci0gIAotICAvLyBFc3RhYmxpc2ggcGFydC13aG9sZSByZWxhdGlvbnNoaXAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gYWRvcHQoWFNEQ29uY3JldGVDb21wb25lbnQgbW9kZWwpOwotCi0gIHByb3RlY3RlZCB2b2lkIGZvcm1hdENoaWxkKEVsZW1lbnQgY2hpbGQpCi0gIHsKLSAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICBJRE9NTW9kZWwgbW9kZWwgPSAoKElET01Ob2RlKWNoaWxkKS5nZXRNb2RlbCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAgIG1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotICAgICAgICAKLSAgICAgICAgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotICAgICAgICBmb3JtYXRQcm9jZXNzb3IuZm9ybWF0Tm9kZShjaGlsZCk7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICBtb2RlbC5jaGFuZ2VkTW9kZWwoKTsgCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL01ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWZjMWIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIE1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0KLQlTdHJpbmcgZk5ld05hbWU7Ci0KLQlwdWJsaWMgTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kKFhTRENvbmNyZXRlQ29tcG9uZW50IGVsZW1lbnQsCi0JCQlTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcihlbGVtZW50LmdldENvbnRhaW5lcigpKTsKLQkJc2V0TW9kZWxPYmplY3QoZWxlbWVudCk7Ci0JCWZOZXdOYW1lID0gbmV3TmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsID0gZ2V0TW9kZWxPYmplY3QoKTsKLQkJWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gbW9kZWwuZ2V0Q29udGFpbmVyKCk7Ci0JCVhTRFR5cGVEZWZpbml0aW9uIGdsb2JhbFR5cGVEZWYgPSBudWxsOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQkvLyBjbG9uZSB0eXBlZGVmIHdpdGggaXQncyBjb250ZW50IGFuZCBzZXQgaXQgZ2xvYmFsCi0JCQkJZ2xvYmFsVHlwZURlZiA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIG1vZGVsCi0JCQkJCQkuY2xvbmVDb25jcmV0ZUNvbXBvbmVudCh0cnVlLCBmYWxzZSk7Ci0JCQkJZ2xvYmFsVHlwZURlZi5zZXROYW1lKGZOZXdOYW1lKTsKLQkJCQlwYXJlbnQuZ2V0U2NoZW1hKCkuZ2V0Q29udGVudHMoKS5hZGQoZ2xvYmFsVHlwZURlZik7Ci0JCQkJKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHBhcmVudCkKLQkJCQkJCS5zZXRUeXBlRGVmaW5pdGlvbihnbG9iYWxUeXBlRGVmKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB7Ci0KLQkJCVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIG1vZGVsOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCS8vIGNsb25lIHR5cGVkZWYgd2l0aCBpdCdzIGNvbnRlbnQgYW5kIHNldCBpdCBnbG9iYWwKLQkJCQlnbG9iYWxUeXBlRGVmID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB0eXBlRGVmCi0JCQkJCQkuY2xvbmVDb25jcmV0ZUNvbXBvbmVudCh0cnVlLCBmYWxzZSk7Ci0JCQkJZ2xvYmFsVHlwZURlZi5zZXROYW1lKGZOZXdOYW1lKTsKLQkJCQlwYXJlbnQuZ2V0U2NoZW1hKCkuZ2V0Q29udGVudHMoKS5hZGQoZ2xvYmFsVHlwZURlZik7Ci0JCQkJKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHBhcmVudCkKLQkJCQkJCS5zZXRUeXBlRGVmaW5pdGlvbihnbG9iYWxUeXBlRGVmKTsKLQkJCQlmb3JtYXRDaGlsZChnbG9iYWxUeXBlRGVmLmdldEVsZW1lbnQoKSk7Ci0KLQkJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHsKLQkJCQkvLyBjbG9uZSB0eXBlZGVmIHdpdGggaXQncyBjb250ZW50IGFuZCBzZXQgaXQgZ2xvYmFsCi0JCQkJZ2xvYmFsVHlwZURlZiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdHlwZURlZgotCQkJCQkJLmNsb25lQ29uY3JldGVDb21wb25lbnQodHJ1ZSwgZmFsc2UpOwotCQkJCWdsb2JhbFR5cGVEZWYuc2V0TmFtZShmTmV3TmFtZSk7Ci0JCQkJcGFyZW50LmdldFNjaGVtYSgpLmdldENvbnRlbnRzKCkuYWRkKGdsb2JhbFR5cGVEZWYpOwotCQkJCSgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHBhcmVudCkKLQkJCQkJCS5zZXRUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGdsb2JhbFR5cGVEZWYpOwotCi0JCQl9Ci0KLQkJfQotCi0JCWZvcm1hdENoaWxkKGdsb2JhbFR5cGVEZWYuZ2V0RWxlbWVudCgpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5BYnN0cmFjdENvbW1hbmQjYWRvcHQob3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkb3B0KFhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlTG9jYWxFbGVtZW50R2xvYmFsQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlTG9jYWxFbGVtZW50R2xvYmFsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2ViOGE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZUxvY2FsRWxlbWVudEdsb2JhbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5zdHJ1Y3R1cmU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgTWFrZUxvY2FsRWxlbWVudEdsb2JhbENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQKLXsKLSAgcHVibGljIE1ha2VMb2NhbEVsZW1lbnRHbG9iYWxDb21tYW5kKFhTRENvbmNyZXRlQ29tcG9uZW50IGVsZW1lbnQpCi0gIHsKLSAgICBzdXBlcihlbGVtZW50LmdldENvbnRhaW5lcigpKTsKLSAgICBzZXRNb2RlbE9iamVjdChlbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBpZiAoZ2V0TW9kZWxPYmplY3QoKSBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0KLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBsb2NhbEVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pZ2V0TW9kZWxPYmplY3QoKTsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IGdldFBhcmVudCgpOwotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29udGFpbmVyID0gcGFyZW50LmdldENvbnRhaW5lcigpOwotCi0gICAgICAvLyBDbG9uZSB0aGUgbG9jYWwgZWxlbWVudCB3aXRoIGl0cyBjb250ZW50IGFuZCBzZXQgaXQgZ2xvYmFsCi0KLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnbG9iYWxFbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWxvY2FsRWxlbWVudERlY2xhcmF0aW9uLmNsb25lQ29uY3JldGVDb21wb25lbnQodHJ1ZSwgZmFsc2UpOwotCi0gICAgICAvLyBUaGUgc2NoZW1hIG1heSBhbHJlYWR5IGhhdmUgYSBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbiB3aXRoIHRoaXMgbmFtZS4gSW4gdGhhdCBjYXNlLCBlbnN1cmUgdGhlIG5hbWUgb2YgdGhlIG5ld2x5IGNyZWF0ZWQKLSAgICAgIC8vIGVsZW1lbnQgZG9lcyBub3QgY29sbGlkZSB3aXRoIGFuIGV4aXN0aW5nIG9uZS4KLQotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGNvbnRhaW5lci5nZXRTY2hlbWEoKTsKLSAgICAgIFN0cmluZyBsb2NhbEVsZW1lbnROYW1lID0gbG9jYWxFbGVtZW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpOwotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGV4aXN0aW5nR2xvYmFsRWxlbWVudCA9IHNjaGVtYS5yZXNvbHZlRWxlbWVudERlY2xhcmF0aW9uKGxvY2FsRWxlbWVudE5hbWUpOwotICAgICAgYm9vbGVhbiBlbGVtZW50RXhpc3RzID0gZXhpc3RpbmdHbG9iYWxFbGVtZW50ICE9IG51bGwgJiYgZXhpc3RpbmdHbG9iYWxFbGVtZW50LmdldFNjaGVtYSgpICE9IG51bGw7Ci0gICAgICBpZiAoZWxlbWVudEV4aXN0cykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5ld0VsZW1lbnROYW1lID0gWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZShsb2NhbEVsZW1lbnROYW1lLCBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpKTsKLSAgICAgICAgZ2xvYmFsRWxlbWVudERlY2xhcmF0aW9uLnNldE5hbWUobmV3RWxlbWVudE5hbWUpOwotICAgICAgfQotCi0gICAgICBFTGlzdCBzY2hlbWFDb250ZW50cyA9IHNjaGVtYS5nZXRDb250ZW50cygpOwotICAgICAgc2NoZW1hQ29udGVudHMuYWRkKGdsb2JhbEVsZW1lbnREZWNsYXJhdGlvbik7Ci0KLSAgICAgIC8vIE1vZGlmeSB0aGUgbG9jYWwgZWxlbWVudCB0byBiZWNvbWUgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBlbGVtZW50LgotCi0gICAgICBsb2NhbEVsZW1lbnREZWNsYXJhdGlvbi5zZXROYW1lKG51bGwpOwotICAgICAgbG9jYWxFbGVtZW50RGVjbGFyYXRpb24uc2V0VHlwZURlZmluaXRpb24obnVsbCk7Ci0gICAgICBsb2NhbEVsZW1lbnREZWNsYXJhdGlvbi5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbihudWxsKTsKLSAgICAgIGxvY2FsRWxlbWVudERlY2xhcmF0aW9uLnNldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKGdsb2JhbEVsZW1lbnREZWNsYXJhdGlvbik7Ci0gICAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cCljb250YWluZXI7Ci0KLSAgICAgIC8vIEZvcm1hdCB0aGUgbWFya3VwLiAKLQotICAgICAgZm9ybWF0Q2hpbGQobW9kZWxHcm91cC5nZXRFbGVtZW50KCkpOwotICAgICAgZm9ybWF0Q2hpbGQoZ2xvYmFsRWxlbWVudERlY2xhcmF0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuQWJzdHJhY3RDb21tYW5kI2Fkb3B0KG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGFkb3B0KFhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL01ha2VUeXBlR2xvYmFsQ2hhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL01ha2VUeXBlR2xvYmFsQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYjFkMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlVHlwZUdsb2JhbENoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0Q2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIGViZWxpc2FyCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1ha2VUeXBlR2xvYmFsQ2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKLQotCXByaXZhdGUgTWFwIGZDaGFuZ2VzOwotCi0JcHJpdmF0ZSBTdHJpbmcgZk5ld05hbWU7Ci0KLQlwcml2YXRlIFhTRFR5cGVEZWZpbml0aW9uIGZUeXBlQ29tcG9uZW50OwotCi0JcHVibGljIE1ha2VUeXBlR2xvYmFsQ2hhbmdlKFhTRFR5cGVEZWZpbml0aW9uIGNvbXBvbmVudCwgCi0JCQlTdHJpbmcgbmV3TmFtZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5ld05hbWUsICJuZXcgbmFtZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJZlR5cGVDb21wb25lbnQgPSBjb21wb25lbnQ7Ci0JCWZOZXdOYW1lID0gbmV3TmFtZTsKLQl9Ci0KLQkvLyBwdWJsaWMgc3RhdGljIENoYW5nZVtdIGNyZWF0ZUNoYW5nZXNGb3IoWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50LAotCS8vIFN0cmluZyBuZXdOYW1lKSB7Ci0JLy8gLy8gVE9ETzogUDEgaW1wbGVtZW50IHNlYXJjaCBvZiBYU0QgZmlsZXMKLQkvLyBYU0RTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBYU0RTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JLy8gUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3Ci0JLy8gUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IoY29tcG9uZW50LCBuZXdOYW1lKTsKLQkvLyBzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKGNvbXBvbmVudCwgSVhTRFNlYXJjaENvbnN0YW50cy5XT1JLU1BBQ0VfU0NPUEUsCi0JLy8gcmVxdWVzdG9yKTsKLQkvLwotCS8vIHJldHVybiByZXF1ZXN0b3IuZ2V0Q2hhbmdlcygpOwotCS8vCi0JLy8gfQotCi0JcHJvdGVjdGVkIENoYW5nZSBjcmVhdGVVbmRvQ2hhbmdlKCkgewotCQlyZXR1cm4gbmV3IE1ha2VUeXBlR2xvYmFsQ2hhbmdlKGZUeXBlQ29tcG9uZW50LCBnZXROZXdOYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvUmVuYW1lKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBQMSBjaGFuZ2UgdGVtcG9yYXJ5IHJlbmFtZSBvZiBYU0QgbW9kZWwgY29tcG9uZW50cwotCQlwZXJmb3JtTW9kaWZ5KGdldE5ld05hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybU1vZGlmeShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKLS8vCQkJRGVsYXllZFJlbmFtZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IERlbGF5ZWRSZW5hbWVSdW5uYWJsZSgKLS8vCQkJCQlmVHlwZUNvbXBvbmVudCwgdmFsdWUpOwotCQkJLy8gVE9ETzogcmVtb3ZlIERpc3BsYXkKLQkJCS8vRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIERlbGF5ZWRSZW5hbWVSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJcHJvdGVjdGVkIFhTRFR5cGVEZWZpbml0aW9uIGNvbXBvbmVudDsKLQotCQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLQkJcHVibGljIERlbGF5ZWRSZW5hbWVSdW5uYWJsZShYU0RUeXBlRGVmaW5pdGlvbiBjb21wb25lbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlEb2N1bWVudEltcGwgZG9jID0gKERvY3VtZW50SW1wbCkgY29tcG9uZW50LmdldEVsZW1lbnQoKS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlkb2MuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZygKLQkJCQkJCQl0aGlzLAotCQkJCQkJCVJlZmFjdG9yaW5nTWVzc2FnZXMKLQkJCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9BQ1RJT05fTUFLRV9BTk9OWU1PVVNfVFlQRV9HTE9CQUwiKSk7Ci0JCQlNYWtlQW5vbnltb3VzVHlwZUdsb2JhbENvbW1hbmQgY29tbWFuZCA9IG5ldyBNYWtlQW5vbnltb3VzVHlwZUdsb2JhbENvbW1hbmQoCi0JCQkJCWNvbXBvbmVudCwgbmFtZSk7Ci0JCQljb21tYW5kLnJ1bigpOwotCQkJZG9jLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRDaGFuZ2UgZ2V0Q2hhbmdlKElGaWxlIGZpbGUpIHsKLQkJVGV4dENoYW5nZSByZXN1bHQgPSAoVGV4dENoYW5nZSkgZkNoYW5nZXMuZ2V0KGZpbGUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IG5ldyBUZXh0RmlsZUNoYW5nZShmaWxlLmdldE5hbWUoKSwgZmlsZSk7Ci0JCQlmQ2hhbmdlcy5wdXQoZmlsZSwgcmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIFJlZmFjdG9yaW5nTWVzc2FnZXMKLQkJCQkuZ2V0Rm9ybWF0dGVkU3RyaW5nKAotCQkJCQkJIk1ha2VUeXBlR2xvYmFsQ2hhbmdlLm5hbWUiLCBuZXcgU3RyaW5nW10ge2dldE5ld05hbWUoKSB9KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBmaW5hbCBDaGFuZ2UgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlwbS5iZWdpblRhc2soUmVmYWN0b3JpbmdNZXNzYWdlcwotCQkJCQkuZ2V0U3RyaW5nKCJYU0RDb21wb25lbnRSZW5hbWVDaGFuZ2UuUmVuYW1pbmciKSwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCUNoYW5nZSByZXN1bHQgPSBjcmVhdGVVbmRvQ2hhbmdlKCk7Ci0JCQlkb1JlbmFtZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHBtLCAxKSk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9IGZpbmFsbHkgewotCQkJcG0uZG9uZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmV3TmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld05hbWUoKSB7Ci0JCXJldHVybiBmTmV3TmFtZTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlI2dldE1vZGlmaWVkRWxlbWVudCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNb2RpZmllZEVsZW1lbnQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZUeXBlQ29tcG9uZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlI2luaXRpYWxpemVWYWxpZGF0aW9uRGF0YShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZSNpc1ZhbGlkKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uLAotCQkJT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvLyBUT0RPIGltcGxlbWVudCBjaGFuZ2UgdmFsaWRhdGlvbgotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlVHlwZUdsb2JhbFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlVHlwZUdsb2JhbFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjc5M2YzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZVR5cGVHbG9iYWxQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iuc3RydWN0dXJlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlBhcnRpY2lwYW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lQXJndW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlNoYXJhYmxlUGFydGljaXBhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuSU5hbWVVcGRhdGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgTWFrZVR5cGVHbG9iYWxQcm9jZXNzb3IgZXh0ZW5kcyBSZW5hbWVQcm9jZXNzb3IgaW1wbGVtZW50cyBJTmFtZVVwZGF0aW5newotCQotCXByaXZhdGUgWFNEVHlwZURlZmluaXRpb24gZlR5cGVDb21wb25lbnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZk5ld0VsZW1lbnROYW1lOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFTlRJRklFUj0gIm9yZy5lY2xpcHNlLndzdC51aS54c2QubWFrZVR5cGVHbG9iYWxQcm9jZXNzb3IiOyAvLyROT04tTkxTLTEkCi0KLQkvL3ByaXZhdGUgUXVhbGlmaWVkTmFtZVNlYXJjaFJlc3VsdCBmTmFtZVNlYXJjaFJlc3VsdDsKLQkKLQlwdWJsaWMgTWFrZVR5cGVHbG9iYWxQcm9jZXNzb3IoWFNEVHlwZURlZmluaXRpb24gZWxlbWVudCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJZlR5cGVDb21wb25lbnQ9IGVsZW1lbnQ7Ci0JCWZOZXdFbGVtZW50TmFtZSA9IG5ld05hbWU7Ci0JCQotCX0KLQkKLQlwdWJsaWMgWFNEVHlwZURlZmluaXRpb24gZ2V0VHlwZUNvbXBvbmVudCgpIHsKLQkJcmV0dXJuIGZUeXBlQ29tcG9uZW50OwotCX0KLQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQucmVmYWN0b3JpbmcudGFnZ2luZy5JVGV4dFVwZGF0aW5nI2NhbkVuYWJsZVRleHRVcGRhdGluZygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRW5hYmxlVGV4dFVwZGF0aW5nKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0QWZmZWN0ZWRQcm9qZWN0TmF0dXJlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy9UT0RPOiBmaW5kIHByb2plY3QgbmF0dXJlcyBvZiB0aGUgZmlsZXMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgcmVmYWN0b3JlZAotCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMoUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLAotCQkJTGlzdCByZXN1bHQsIFN0cmluZ1tdIG5hdHVyZXMsIFNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETzogcHJvdmlkZSBhIHdheSB0byBsb2FkIHJlbmFtZSBwYXJ0aWNpcGFudHMKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2NoZWNrRmluYWxDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tGaW5hbENvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwKLQkJCUNoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgdGhyb3dzIENvcmVFeGNlcHRpb24sCi0JCQlPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gYWRkIGNvZGUgdG8gY2hlY2sgZmluYWwgY29uZGl0aW9ucyBmb3IgY29tcG9uZW50IHJlbmFtZQotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNjaGVja0luaXRpYWxDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0luaXRpYWxDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0pCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotLy8JCSBUT0RPIGFkZCBjb2RlIHRvIGNoZWNrIGluaXRpYWwgY29uZGl0aW9ucyBmb3IgY29tcG9uZW50IHJlbmFtZQotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNjcmVhdGVDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sCi0JCQlPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gUDEgYWRkIGNoYW5nZSBjcmVhdGlvbgotLy8JCUNoYW5nZVtdIGNoYW5nZXMgPSBYU0RDb21wb25lbnRSZW5hbWVDaGFuZ2UuY3JlYXRlQ2hhbmdlc0Zvcih0aGlzLmZOYW1lZENvbXBvbmVudCwgZ2V0TmV3RWxlbWVudE5hbWUoKSk7Ci0vLwkJQ29tcG9zaXRlQ2hhbmdlIG11bHRpQ2hhbmdlID0gbnVsbDsgCi0vLwkJCWlmKGNoYW5nZXMubGVuZ3RoID4gMCkKLS8vCQkJCW11bHRpQ2hhbmdlICA9IG5ldyBDb21wb3NpdGVDaGFuZ2UoIlhTRCBjb21wb25lbnQgcmVuYW1lIHBhcnRpY2lwYW50IGNoYW5nZXMiLCBjaGFuZ2VzKTsgLy8kTk9OLU5MUy0xJCBUT0RPOiBleHRlcm5hbGl6ZSBzdHJpbmcKLS8vCQlyZXR1cm4gbXVsdGlDaGFuZ2U7Ci0JCQotLy8JCWNvbXB1dGVOYW1lTWF0Y2hlcyhwbSk7CQotLy8JCUNoYW5nZVtdIGNoYW5nZXMgPSBmTmFtZVNlYXJjaFJlc3VsdC5nZXRBbGxDaGFuZ2VzKCk7Ci0vLwkJcmV0dXJuIG5ldyBDb21wb3NpdGVDaGFuZ2UoIlhTRCBmaWxlIHJlbmFtZSBwYXJ0aWNpcGFudCBjaGFuZ2VzIiwgY2hhbmdlcyk7IC8vVE9ETzogZXh0ZXJuYWxpemUgc3RyaW5nCi0JCXBtLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5ewotCQkJcmV0dXJuIG5ldyBNYWtlVHlwZUdsb2JhbENoYW5nZShmVHlwZUNvbXBvbmVudCwgZ2V0TmV3RWxlbWVudE5hbWUoKSk7Ci0JCX0gZmluYWxseXsKLQkJCXBtLmRvbmUoKTsKLQkJfQkgCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNnZXRFbGVtZW50cygpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKCkgewotCQkKLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7ZlR5cGVDb21wb25lbnR9OwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjZ2V0SWRlbnRpZmllcigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gSURFTlRJRklFUjsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2dldFByb2Nlc3Nvck5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvY2Vzc29yTmFtZSgpIHsKLQkJcmV0dXJuIFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKAotCQkJCSJNYWtlTG9jYWxUeXBlR2xvYmFsUmVmYWN0b3JpbmcubmFtZSIsICAvLyROT04tTkxTLTEkCi0JCQkJbmV3IFN0cmluZ1tde2dldE5ld0VsZW1lbnROYW1lKCl9KTsKLQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjaXNBcHBsaWNhYmxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmVHlwZUNvbXBvbmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBUT0RPIGltcGxlbWVudCBpc0FwcGxpY2FibGUgbG9naWMgZm9yIHRoZSBuYW1lZCBjb21wb25lbnQsIAotCQkvLyB2ZXJpZnkgaG93IGl0IGlzIGRpZmZlcmVudCBmcm9tIG90aGVyIGNvbmRpdGlvbiBjaGVja3MKLS8vCQlpZiAoZk5hbWVkQ29tcG9uZW50LmlzQW5vbnltb3VzKCkpCi0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQlpZiAoISBDaGVja3MuaXNBdmFpbGFibGUoZlR5cGUpKQotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJaWYgKGlzU3BlY2lhbENhc2UoZlR5cGUpKQotLy8JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnRhZ2dpbmcuSU5hbWVVcGRhdGluZyNjaGVja05ld0VsZW1lbnROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrTmV3RWxlbWVudE5hbWUoU3RyaW5nIG5ld05hbWUpewotCQlBc3NlcnQuaXNOb3ROdWxsKG5ld05hbWUsICJuZXcgbmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCS8vIFRPRE86IGltcGxlbWVudCBuZXcgbmFtZSBjaGVja2luZwotLy8JCVJlZmFjdG9yaW5nU3RhdHVzIHJlc3VsdCA9IENoZWNrcy5jaGVja1R5cGVOYW1lKG5ld05hbWUpOwotLy8JCWlmIChDaGVja3MuaXNBbHJlYWR5TmFtZWQoZlR5cGUsIG5ld05hbWUpKQotLy8JCQlyZXN1bHQuYWRkRmF0YWxFcnJvcihSZWZhY3RvcmluZ0NvcmVNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZVR5cGVSZWZhY3RvcmluZy5jaG9vc2VfYW5vdGhlcl9uYW1lIikpOwkgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQucmVmYWN0b3JpbmcudGFnZ2luZy5JTmFtZVVwZGF0aW5nI2dldE5ld0VsZW1lbnQoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TmV3RWxlbWVudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBpbXBsZW1lbnQgdGhpcyBtZXRob2QsIGl0J3MgdXNlZCBmb3IgdXBkYXRpbmcgc2VsZWN0aW9uIG9uIG5ldyBlbGVtZW50Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLS8vCXByaXZhdGUgdm9pZCBjb21wdXRlTmFtZU1hdGNoZXMoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCi0vLwkgICAgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0vLwkgICAgdHJ5IHsKLS8vCQkJVVJMIGZpbGVVUkwgPSBQbGF0Zm9ybS5yZXNvbHZlKG5ldyBVUkwoZk5hbWVkQ29tcG9uZW50LmdldFNjaGVtYSgpLmdldFNjaGVtYUxvY2F0aW9uKCkpKTsKLS8vCQkJSUZpbGUgZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKGZpbGVVUkwuZ2V0UGF0aCgpKSk7Ci0vLwkJCWlmIChmTmFtZVNlYXJjaFJlc3VsdCA9PSBudWxsKQotLy8JCQkJZk5hbWVTZWFyY2hSZXN1bHQ9IG5ldyBRdWFsaWZpZWROYW1lU2VhcmNoUmVzdWx0KCk7Ci0vLwkJCVF1YWxpZmllZE5hbWVGaW5kZXIucHJvY2VzcyhmTmFtZVNlYXJjaFJlc3VsdCwgZ2V0TmFtZWRDb21wb25lbnQoKS5nZXROYW1lKCksICAKLS8vCQkJCWdldE5ld0VsZW1lbnROYW1lKCksIAotLy8JCQkJIioueHNkIiwgZmlsZS5nZXRQcm9qZWN0KCksIHBtKTsKLS8vCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0vLwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLS8vCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQl9Ci0vLwl9Ci0JCi0JcHVibGljIGZpbmFsIFJlZmFjdG9yaW5nUGFydGljaXBhbnRbXSBsb2FkUGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywgU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkUGFydGljaXBhbnRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlbmFtZUFyZ3VtZW50cyBhcmd1bWVudHM9IG5ldyBSZW5hbWVBcmd1bWVudHMoZ2V0TmV3RWxlbWVudE5hbWUoKSwgdHJ1ZSk7Ci0JCVN0cmluZ1tdIG5hdHVyZXM9IGdldEFmZmVjdGVkUHJvamVjdE5hdHVyZXMoKTsKLQkJTGlzdCByZXN1bHQ9IG5ldyBBcnJheUxpc3QoKTsKLQkJbG9hZEVsZW1lbnRQYXJ0aWNpcGFudHMoc3RhdHVzLCByZXN1bHQsIGFyZ3VtZW50cywgbmF0dXJlcywgc2hhcmVkUGFydGljaXBhbnRzKTsKLQkJbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMoc3RhdHVzLCByZXN1bHQsIG5hdHVyZXMsIHNoYXJlZFBhcnRpY2lwYW50cyk7Ci0JCXJldHVybiAoUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtdKXJlc3VsdC50b0FycmF5KG5ldyBSZWZhY3RvcmluZ1BhcnRpY2lwYW50W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9hZEVsZW1lbnRQYXJ0aWNpcGFudHMoUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLCBMaXN0IHJlc3VsdCwgUmVuYW1lQXJndW1lbnRzIGFyZ3VtZW50cywgU3RyaW5nW10gbmF0dXJlcywgU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzPSBnZXRFbGVtZW50cygpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChQYXJ0aWNpcGFudE1hbmFnZXIubG9hZFJlbmFtZVBhcnRpY2lwYW50cyhzdGF0dXMsIAotCQkJCXRoaXMsICBlbGVtZW50c1tpXSwKLQkJCQlhcmd1bWVudHMsIG5hdHVyZXMsIHNoYXJlZCkpKTsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBzZXROZXdFbGVtZW50TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQkKLQkJZk5ld0VsZW1lbnROYW1lPSBuZXdOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmV3RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBmTmV3RWxlbWVudE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50RWxlbWVudE5hbWUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZOZXdFbGVtZW50TmFtZTsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvdXRpbC9UZXh0Q2hhbmdlQ29tcGF0aWJpbGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3V0aWwvVGV4dENoYW5nZUNvbXBhdGliaWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhNzVlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvdXRpbC9UZXh0Q2hhbmdlQ29tcGF0aWJpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdEdyb3VwOwotCi0vKioKLSAqIEEgdXRpbGl0eSBjbGFzcyB0byBwcm92aWRlIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkCi0gKiB0ZXh0IGNoYW5nZSBBUEkgb2YgYWRkaW5nIHRleHQgZWRpdHMgZGlyZWN0bHkgYW5kIGF1dG8KLSAqIGluc2VydGluZyB0aGVtIGludG8gdGhlIHRyZWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0Q2hhbmdlQ29tcGF0aWJpbGl0eSB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVGV4dEVkaXQoVGV4dENoYW5nZSBjaGFuZ2UsIFN0cmluZyBuYW1lLCBUZXh0RWRpdCBlZGl0KSB7Ci0JCUFzc2VydC5pc05vdE51bGwoY2hhbmdlKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChuYW1lKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChlZGl0KTsKLQkJVGV4dEVkaXQgcm9vdD0gY2hhbmdlLmdldEVkaXQoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkgewotCQkJcm9vdD0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCWNoYW5nZS5zZXRFZGl0KHJvb3QpOwotCQl9Ci0JCWluc2VydChyb290LCBlZGl0KTsKLQkJY2hhbmdlLmFkZFRleHRFZGl0R3JvdXAobmV3IFRleHRFZGl0R3JvdXAobmFtZSwgZWRpdCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVGV4dEVkaXQoVGV4dENoYW5nZSBjaGFuZ2UsIFN0cmluZyBuYW1lLCBUZXh0RWRpdFtdIGVkaXRzKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoY2hhbmdlKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChuYW1lKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChlZGl0cyk7Ci0JCVRleHRFZGl0IHJvb3Q9IGNoYW5nZS5nZXRFZGl0KCk7Ci0JCWlmIChyb290ID09IG51bGwpIHsKLQkJCXJvb3Q9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQljaGFuZ2Uuc2V0RWRpdChyb290KTsKLQkJfQotCQlmb3IgKGludCBpPSAwOyBpIDwgZWRpdHMubGVuZ3RoOyBpKyspIHsKLQkJCWluc2VydChyb290LCBlZGl0c1tpXSk7Ci0JCX0KLQkJY2hhbmdlLmFkZFRleHRFZGl0R3JvdXAobmV3IFRleHRFZGl0R3JvdXAobmFtZSwgZWRpdHMpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGluc2VydChUZXh0RWRpdCBwYXJlbnQsIFRleHRFZGl0IGVkaXQpIHsKLQkJaWYgKCFwYXJlbnQuaGFzQ2hpbGRyZW4oKSkgewotCQkJcGFyZW50LmFkZENoaWxkKGVkaXQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVRleHRFZGl0W10gY2hpbGRyZW49IHBhcmVudC5nZXRDaGlsZHJlbigpOwotCQkvLyBGaXJzdCBkaXZlIGRvd24gdG8gZmluZCB0aGUgcmlnaHQgcGFyZW50LgotCQlmb3IgKGludCBpPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCVRleHRFZGl0IGNoaWxkPSBjaGlsZHJlbltpXTsKLQkJCWlmIChjb3ZlcnMoY2hpbGQsIGVkaXQpKSB7Ci0JCQkJaW5zZXJ0KGNoaWxkLCBlZGl0KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJLy8gV2UgaGF2ZSB0aGUgcmlnaHQgcGFyZW50LiBOb3cgY2hlY2sgaWYgc29tZSBvZiB0aGUgY2hpbGRyZW4gaGF2ZSB0bwotCQkvLyBiZSBtb3ZlZCB1bmRlciB0aGUgbmV3IGVkaXQgc2luY2UgaXQgaXMgY292ZXJpbmcgaXQuCi0JCWZvciAoaW50IGk9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlUZXh0RWRpdCBjaGlsZD0gY2hpbGRyZW5baV07Ci0JCQlpZiAoY292ZXJzKGVkaXQsIGNoaWxkKSkgewotCQkJCXBhcmVudC5yZW1vdmVDaGlsZChpKTsKLQkJCQllZGl0LmFkZENoaWxkKGNoaWxkKTsKLQkJCX0KLQkJfQotCQlwYXJlbnQuYWRkQ2hpbGQoZWRpdCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY292ZXJzKFRleHRFZGl0IHRoaXNFZGl0LCBUZXh0RWRpdCBvdGhlckVkaXQpIHsKLQkJaWYgKHRoaXNFZGl0LmdldExlbmd0aCgpID09IDApCS8vIGFuIGluc2VydGlvbiBwb2ludCBjYW4ndCBjb3ZlciBhbnl0aGluZwotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaW50IHRoaXNPZmZzZXQ9IHRoaXNFZGl0LmdldE9mZnNldCgpOwotCQlpbnQgdGhpc0VuZD0gdGhpc0VkaXQuZ2V0RXhjbHVzaXZlRW5kKCk7CQotCQlpZiAob3RoZXJFZGl0LmdldExlbmd0aCgpID09IDApIHsKLQkJCWludCBvdGhlck9mZnNldD0gb3RoZXJFZGl0LmdldE9mZnNldCgpOwotCQkJcmV0dXJuIHRoaXNPZmZzZXQgPCBvdGhlck9mZnNldCAmJiBvdGhlck9mZnNldCA8IHRoaXNFbmQ7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgb3RoZXJPZmZzZXQ9IG90aGVyRWRpdC5nZXRPZmZzZXQoKTsKLQkJCWludCBvdGhlckVuZD0gb3RoZXJFZGl0LmdldEV4Y2x1c2l2ZUVuZCgpOwotCQkJcmV0dXJuIHRoaXNPZmZzZXQgPD0gb3RoZXJPZmZzZXQgJiYgb3RoZXJFbmQgPD0gdGhpc0VuZDsKLQkJfQotCX0JCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZWZhY3RvckFjdGlvbkdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlZmFjdG9yQWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxOGQwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlZmFjdG9yQWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9ucy5SZW5hbWVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zLlNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uOwotCi0vKioKLSAqIEFjdGlvbiBncm91cCB0aGF0IGFkZHMgcmVmYWN0b3IgYWN0aW9ucyAoZm9yIGV4YW1wbGUgJ1JlbmFtZScsICdNb3ZlJykgdG8gYQotICogY29udGV4dCBtZW51IGFuZCB0aGUgZ2xvYmFsIG1lbnUgYmFyLgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZhY3RvckFjdGlvbkdyb3VwIGV4dGVuZHMgQWN0aW9uR3JvdXAgewotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5vQWN0aW9uQXZhaWxhYmxlIGV4dGVuZHMgQWN0aW9uIHsKLQkJcHVibGljIE5vQWN0aW9uQXZhaWxhYmxlKCkgewotCQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXNldFRleHQoUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZWZhY3RvckFjdGlvbkdyb3VwX25vX3JlZmFjdG9yaW5nX2F2YWlsYWJsZSk7IAotCQl9Ci0JfQotCi0JLyoqCi0JICogUG9wLXVwIG1lbnU6IG5hbWUgb2YgZ3JvdXAgZm9yIHJlb3JnYW5pemUgYWN0aW9ucyAodmFsdWUKLQkgKiA8Y29kZT4iZ3JvdXAucmVvcmdhbml6ZSI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9SRU9SR0FOSVpFID0gSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5HUk9VUF9SRU9SR0FOSVpFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVOVV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yaW5nLm1lbnUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU5BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3RvcmluZy5hY3Rpb25zLlJlbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGluaXRBY3Rpb24oU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gYWN0aW9uLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKHNlbGVjdGlvbik7Ci0JCUFzc2VydC5pc05vdE51bGwoYWN0aW9uKTsKLQkJYWN0aW9uLnVwZGF0ZShzZWxlY3Rpb24pOwotCQkvL3Byb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihhY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGZFZGl0b3JBY3Rpb25zOwotCi0JcHJpdmF0ZSBTdHJpbmcgZkdyb3VwTmFtZSA9IEdST1VQX1JFT1JHQU5JWkU7Ci0JCi0JcHJpdmF0ZSBBY3Rpb24gZk5vQWN0aW9uQXZhaWxhYmxlID0gbmV3IE5vQWN0aW9uQXZhaWxhYmxlKCk7Ci0KLQlwcm90ZWN0ZWQgUmVuYW1lQWN0aW9uIGZSZW5hbWVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gZlJlbmFtZVRhcmdldE5hbWVzcGFjZTsKLQotCXByb3RlY3RlZCBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQkKLQlwdWJsaWMgUmVmYWN0b3JBY3Rpb25Hcm91cChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCQkKLQl9Ci0KLQlwdWJsaWMgaW50IGFkZEFjdGlvbihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgYWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQlmRWRpdG9yQWN0aW9ucy5hZGQoYWN0aW9uKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRSZWZhY3RvclN1Ym1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQotCQlJTWVudU1hbmFnZXIgcmVmYWN0b3JTdWJtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKFJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuUmVmYWN0b3JNZW51X2xhYmVsLCBNRU5VX0lEKTsKLQkJcmVmYWN0b3JTdWJtZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCQkJcmVmYWN0b3JNZW51U2hvd24obWFuYWdlcik7Ci0JCQkJfQotCQkJfSk7Ci0JCXJlZmFjdG9yU3VibWVudS5hZGQoZk5vQWN0aW9uQXZhaWxhYmxlKTsKLQkJCWlmIChtZW51LmZpbmQocmVmYWN0b3JTdWJtZW51LmdldElkKCkpID09IG51bGwpIHsKLQkJCQlpZiAobWVudS5maW5kKGZHcm91cE5hbWUpID09IG51bGwpIHsKLQkJCQkJbWVudS5hZGQocmVmYWN0b3JTdWJtZW51KTsKLQkJCQl9IGVsc2UgewotCQkJCQltZW51LmFwcGVuZFRvR3JvdXAoZkdyb3VwTmFtZSwgcmVmYWN0b3JTdWJtZW51KTsKLQkJCQl9Ci0JCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUFjdGlvbihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGFjdGlvbiwKLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpCi0JCQlwcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoYWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIGluIEFjdGlvbkdyb3VwCi0JICovCi0JcHVibGljIHZvaWQgZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlzdXBlci5maWxsQWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKFJFTkFNRSwgZlJlbmFtZUFjdGlvbik7Ci0JCXJldGFyZ2V0RmlsZU1lbnVBY3Rpb25zKGFjdGlvbkJhcnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZpbGxBY3Rpb25zKExpc3QgZW5hYmxlZEFjdGlvbnMpIHsKLQkJCi0JCWlmKHNlbGVjdGlvbiAhPSBudWxsICYmIGZFZGl0b3JBY3Rpb25zICE9IG51bGwpewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZkVkaXRvckFjdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aW9uIGFjdGlvbiA9IChBY3Rpb24pIGl0ZXIubmV4dCgpOwotCQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbikgewotCQkJCQlTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBzZWxlY3Rpb25BY3Rpb24gPSAoU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24pIGFjdGlvbjsKLQkJCQkJc2VsZWN0aW9uQWN0aW9uLnVwZGF0ZShzZWxlY3Rpb24pOwotCQkJCX0KLQotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZkVkaXRvckFjdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aW9uIGFjdGlvbiA9IChBY3Rpb24pIGl0ZXIubmV4dCgpOwotCQkJCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJCQllbmFibGVkQWN0aW9ucy5hZGQoYWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBpbiBBY3Rpb25Hcm91cAotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5maWxsQ29udGV4dE1lbnUobWVudSk7Ci0JCWFkZFJlZmFjdG9yU3VibWVudShtZW51KTsKLQl9Ci0KLQlwcml2YXRlIGludCBmaWxsUmVmYWN0b3JNZW51KElNZW51TWFuYWdlciByZWZhY3RvclN1Ym1lbnUpIHsKLQkJaW50IGFkZGVkID0gMDsKLQkJcmVmYWN0b3JTdWJtZW51LmFkZChuZXcgU2VwYXJhdG9yKEdST1VQX1JFT1JHQU5JWkUpKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZkVkaXRvckFjdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpb24gYWN0aW9uID0gKEFjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgYWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJZkVkaXRvckFjdGlvbnMuYWRkKGFjdGlvbik7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFkZGVkOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWZhY3Rvck1lbnVIaWRkZW4oSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmRWRpdG9yQWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFjdGlvbiBhY3Rpb24gPSAoQWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbikgewotCQkJCVNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHNlbGVjdGlvbkFjdGlvbiA9IChTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbikgYWN0aW9uOwotCQkJCXNlbGVjdGlvbkFjdGlvbi51cGRhdGUoc2VsZWN0aW9uKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZmFjdG9yTWVudVNob3duKGZpbmFsIElNZW51TWFuYWdlciByZWZhY3RvclN1Ym1lbnUpIHsKLQkJLy8gd2Uga25vdyB0aGF0IHdlIGhhdmUgYW4gTWVudU1hbmFnZXIgc2luY2Ugd2UgY3JlYXRlZCBpdCBpbgotCQkvLyBhZGRSZWZhY3RvclN1Ym1lbnUuCi0JCU1lbnUgbWVudSA9ICgoTWVudU1hbmFnZXIpIHJlZmFjdG9yU3VibWVudSkuZ2V0TWVudSgpOwotCQltZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51SGlkZGVuKE1lbnVFdmVudCBlKSB7Ci0JCQkJcmVmYWN0b3JNZW51SGlkZGVuKHJlZmFjdG9yU3VibWVudSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZFZGl0b3JBY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aW9uIGFjdGlvbiA9IChBY3Rpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uKSB7Ci0JCQkJU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gc2VsZWN0aW9uQWN0aW9uID0gKFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uKSBhY3Rpb247Ci0JCQkJc2VsZWN0aW9uQWN0aW9uLnVwZGF0ZShzZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JCXJlZmFjdG9yU3VibWVudS5yZW1vdmVBbGwoKTsKLQkJaWYgKGZpbGxSZWZhY3Rvck1lbnUocmVmYWN0b3JTdWJtZW51KSA9PSAwKQotCQkJcmVmYWN0b3JTdWJtZW51LmFkZChmTm9BY3Rpb25BdmFpbGFibGUpOwotCX0KLQotCS8qKgotCSAqIFJldGFyZ2V0cyB0aGUgRmlsZSBhY3Rpb25zIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcmVmYWN0b3JpbmcgYWN0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uQmFycwotCSAqICAgICAgICAgICAgdGhlIGFjdGlvbiBiYXIgdG8gcmVnaXN0ZXIgdGhlIG1vdmUgYW5kIHJlbmFtZSBhY3Rpb24gd2l0aAotCSAqLwotCXB1YmxpYyB2b2lkIHJldGFyZ2V0RmlsZU1lbnVBY3Rpb25zKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVOQU1FLmdldElkKCksCi0JCQkJZlJlbmFtZUFjdGlvbik7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlZmFjdG9yR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWM1Njc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUsIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSwgSU1lbnVDcmVhdG9yIHsKLQotCXByb3RlY3RlZCBJU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0JcHJpdmF0ZSBJQWN0aW9uIGZEZWxlZ2F0ZUFjdGlvbjsKLQkvLyB3aGV0aGVyIHRvIHJlLWZpbGwgdGhlIG1lbnUgKHJlc2V0IG9uIHNlbGVjdGlvbiBjaGFuZ2UpCi0JcHJpdmF0ZSBib29sZWFuIGZGaWxsTWVudSA9IHRydWU7Ci0JcHJvdGVjdGVkIElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQ7IAotCXByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQkKLQotCXB1YmxpYyBSZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGUoKSB7Ci0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCXdvcmtiZW5jaFBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvciNnZXRNZW51KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wpCi0JICovCi0JcHVibGljIE1lbnUgZ2V0TWVudShDb250cm9sIHBhcmVudCkgewotCQkvLyBuZXZlciBjYWxsZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IjZ2V0TWVudShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51KQotCSAqLwotCXB1YmxpYyBNZW51IGdldE1lbnUoTWVudSBwYXJlbnQpIHsKLQkJLy9DcmVhdGUgdGhlIG5ldyBtZW51LiBUaGUgbWVudSB3aWxsIGdldCBmaWxsZWQgd2hlbiBpdCBpcyBhYm91dCB0byBiZSBzaG93bi4gc2VlIGZpbGxNZW51KE1lbnUpLgotCQlNZW51IG1lbnUgPSBuZXcgTWVudShwYXJlbnQpOwotCQkvKioKLQkJICogQWRkIGxpc3RlbmVyIHRvIHJlcG9wdWxhdGUgdGhlIG1lbnUgZWFjaCB0aW1lCi0JCSAqIGl0IGlzIHNob3duIGJlY2F1c2UgTWVudU1hbmFnZXIudXBkYXRlKGJvb2xlYW4sIGJvb2xlYW4pIAotCQkgKiBkb2Vzbid0IGRpc3Bvc2UgcHVsbGRvd24gQWN0aW9uQ29udHJpYnV0aW9uIGl0ZW1zIGZvciBlYWNoIHBvcHVwIG1lbnUuCi0JCSAqLwotCQltZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCQlpZiAoZkZpbGxNZW51KSB7Ci0JCQkJCU1lbnUgbSA9IChNZW51KWUud2lkZ2V0OwotCQkJCQlNZW51SXRlbVtdIGl0ZW1zID0gbS5nZXRJdGVtcygpOwotCQkJCQlmb3IgKGludCBpPTA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaXRlbXNbaV0uZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJCWZpbGxNZW51KG0pOwotCQkJCQlmRmlsbE1lbnUgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gbWVudTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJLy8gTmV2ZXIgY2FsbGVkIGJlY2F1c2Ugd2UgYmVjb21lIGEgbWVudS4KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZkRlbGVnYXRlQWN0aW9uID0gYWN0aW9uOwotCQl1cGRhdGVXaXRoKHNlbGVjdGlvbik7Ci0JCQotCX0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCXdvcmtiZW5jaFBhcnQgPSB0YXJnZXRFZGl0b3I7Ci0JCWZEZWxlZ2F0ZUFjdGlvbiA9IGFjdGlvbjsKLQkJaWYgKHRhcmdldEVkaXRvciAhPSBudWxsICYmIHRhcmdldEVkaXRvci5nZXRFZGl0b3JTaXRlKCkgIT0gbnVsbCAmJiB0YXJnZXRFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkgIT0gbnVsbCkgewotCQkJdXBkYXRlV2l0aCh0YXJnZXRFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JCQotCX0KLSAgICAKLQlwdWJsaWMgdm9pZCB1cGRhdGVXaXRoKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCWlmIChmRGVsZWdhdGVBY3Rpb24gIT0gbnVsbCkgewotCQkJYm9vbGVhbiBlbmFibGUgPSBmYWxzZTsKLQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCQkvL2lmICgoKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldExlbmd0aCgpID4gMCkgewotCQkJCQkJZW5hYmxlID0gdHJ1ZTsKLQkJCQkJLy99Ci0JCQkJfQotCQkJCWVsc2UgaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gKXsKLQkJCQkJZW5hYmxlID0gIXNlbGVjdGlvbi5pc0VtcHR5KCk7Ci0JCQkJfQotCQkJfQotCQkJLy8gZW5hYmxlIGFjdGlvbgotCQkJZkRlbGVnYXRlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCQotCQkJLy8gZmlsbCBzdWJtZW51Ci0JCQlmRmlsbE1lbnUgPSB0cnVlOwotCQkJZkRlbGVnYXRlQWN0aW9uLnNldE1lbnVDcmVhdG9yKHRoaXMpOwotCQkJCi0JCQkKLQkJfQotCQkKLQl9Ci0JCi0JCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZmlsbE1lbnUoTWVudSBtZW51KTsKLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVmYWN0b3JHcm91cFN1Yk1lbnUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVmYWN0b3JHcm91cFN1Yk1lbnUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3ODBlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlZmFjdG9yR3JvdXBTdWJNZW51LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Db21wb3VuZENvbnRyaWJ1dGlvbkl0ZW07Ci0KLXB1YmxpYyBjbGFzcyBSZWZhY3Rvckdyb3VwU3ViTWVudSBleHRlbmRzIENvbXBvdW5kQ29udHJpYnV0aW9uSXRlbSB7Ci0KLQlSZWZhY3RvckFjdGlvbkdyb3VwIGZSZWZhY3Rvck1lbnVHcm91cDsKLQkKLQotCXB1YmxpYyBSZWZhY3Rvckdyb3VwU3ViTWVudShSZWZhY3RvckFjdGlvbkdyb3VwIHJlZmFjdG9yTWVudUdyb3VwKSB7Ci0JCXN1cGVyKCk7Ci0JCWZSZWZhY3Rvck1lbnVHcm91cCA9IHJlZmFjdG9yTWVudUdyb3VwOwotCX0KLQotCXB1YmxpYyBSZWZhY3Rvckdyb3VwU3ViTWVudShTdHJpbmcgaWQpIHsKLQkJc3VwZXIoaWQpOwotCX0KLQotCXByb3RlY3RlZCBJQ29udHJpYnV0aW9uSXRlbVtdIGdldENvbnRyaWJ1dGlvbkl0ZW1zKCkgewotCQkgIEFycmF5TGlzdCBhY3Rpb25zTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJICBBcnJheUxpc3QgY29udHJpYkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCSAgZlJlZmFjdG9yTWVudUdyb3VwLmZpbGxBY3Rpb25zKGFjdGlvbnNMaXN0KTsKLQkgICAgICAgICAKLQkgICAgICAgIGlmIChhY3Rpb25zTGlzdCAhPSBudWxsICYmICFhY3Rpb25zTGlzdC5pc0VtcHR5KCkpIHsKLQkgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpb25zTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkgICAgIAkJCUlBY3Rpb24gYWN0aW9uID0gKElBY3Rpb24pIGl0ZXIubmV4dCgpOwotCSAgICAgCQkJY29udHJpYkxpc3QuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbikpOwotCSAgICAgCQl9Ci0JICAgICAgICB9IGVsc2UgewotCSAgICAgICAgICAgIEFjdGlvbiBkdW1teUFjdGlvbiA9IG5ldyBBY3Rpb24oUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZWZhY3RvckFjdGlvbkdyb3VwX25vX3JlZmFjdG9yaW5nX2F2YWlsYWJsZSkgewotCSAgICAgICAgICAgICAgICAvLyBkdW1teSBpbm5lciBjbGFzczsgbm8gbWV0aG9kcwotCSAgICAgICAgICAgIH07Ci0JICAgICAgICAgICAgZHVtbXlBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JICAgICAgICAgICAgY29udHJpYkxpc3QuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGR1bW15QWN0aW9uKSk7Ci0JICAgICAgICB9Ci0JICAgICAgICByZXR1cm4gKElDb250cmlidXRpb25JdGVtW10pIGNvbnRyaWJMaXN0LnRvQXJyYXkobmV3IElDb250cmlidXRpb25JdGVtW2NvbnRyaWJMaXN0LnNpemUoKV0pOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmFjNTRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzICBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUU9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVmYWN0b3JNZW51X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlZmFjdG9yQWN0aW9uR3JvdXBfbm9fcmVmYWN0b3JpbmdfYXZhaWxhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lQWN0aW9uX3JlbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVBY3Rpb25fdW5hdmFpbGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVJbnB1dFdpemFyZFBhZ2VfbmV3X25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lUmVmYWN0b3JpbmdXaXphcmRfaW50ZXJuYWxfZXJyb3I7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lVGFyZ2V0TmFtZXNwYWNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVYU0RFbGVtZW50QWN0aW9uX2V4Y2VwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVYU0RFbGVtZW50QWN0aW9uX25vdF9hdmFpbGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lWFNERWxlbWVudEFjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lU3VwcG9ydF9kaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lU3VwcG9ydF9ub3RfYXZhaWxhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lQ29tcG9uZW50V2l6YXJkX2RlZmF1bHRQYWdlVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lQ29tcG9uZW50V2l6YXJkX2lucHV0UGFnZV9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUlucHV0V2l6YXJkUGFnZV91cGRhdGVfcmVmZXJlbmNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0RDb21wb25lbnRSZW5hbWVDaGFuZ2VfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0RDb21wb25lbnRSZW5hbWVDaGFuZ2VfUmVuYW1pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudF9jb21wb3NpdGVDaGFuZ2VOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVJlc291cmNlQ2hhbmdlX3JlbmFtZV9yZXNvdXJjZV9yZWZlcmVuY2VfY2hhbmdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTRFJlbmFtZVJlc291cmNlQ2hhbmdlX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZ19JbnRlcm5hbF9FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVSZXNvdXJjZVJlZmFjdG9yaW5nX2FscmVhZF9leGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZ19pbnZhbGlkTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVSZXNvdXJjZVByb2Nlc3Nvcl9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uX3RleHQ7IAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ha2VMb2NhbEVsZW1lbnRHbG9iYWxBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0RDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudF9Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnRfQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yX0NvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUNvbXBvbmVudFByb2Nlc3Nvcl9Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlX2RlY2xhdGF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUNvbXBvbmVudFByb2Nlc3Nvcl9Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlX3JlZmVyZW5jZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0RDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudF94c2RfY29tcG9uZW50X3JlbmFtZV9wYXJ0aWNpcGFudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnRfd3NkbF9jb21wb25lbnRfcmVuYW1lX3BhcnRpY2lwYW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlUmVuYW1lUGFydGljaXBhbnRfRmlsZV9SZW5hbWVfdXBkYXRlX3JlZmVyZW5jZTsKLQotCi0JcHJpdmF0ZSBSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlbmFtZUlucHV0V2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZW5hbWVJbnB1dFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiZjMwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlbmFtZUlucHV0V2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlVzZXJJbnB1dFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuSVJlZmVyZW5jZVVwZGF0aW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLQotLyoqCi0gKiBAYXV0aG9yIGViZWxpc2FyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVuYW1lSW5wdXRXaXphcmRQYWdlICBleHRlbmRzIFVzZXJJbnB1dFdpemFyZFBhZ2V7Ci0JcHJpdmF0ZSBTdHJpbmcgZkluaXRpYWxWYWx1ZTsKLQlwcml2YXRlIFRleHQgZlRleHRGaWVsZDsKLQlwcml2YXRlIEJ1dHRvbiBmVXBkYXRlUmVmZXJlbmNlczsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRleHQgaW5wdXQgcGFnZS4KLQkgKiBAcGFyYW0gaXNMYXN0VXNlclBhZ2UgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBwYWdlIGlzIHRoZSB3aXphcmQncyBsYXN0Ci0JICogIHVzZXIgaW5wdXQgcGFnZS4gT3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUmVuYW1lSW5wdXRXaXphcmRQYWdlKFN0cmluZyBkZXNjcmlwdGlvbiwgYm9vbGVhbiBpc0xhc3RVc2VyUGFnZSkgewotCQl0aGlzKGRlc2NyaXB0aW9uLCBpc0xhc3RVc2VyUGFnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdGV4dCBpbnB1dCBwYWdlLgotCSAqIEBwYXJhbSBpc0xhc3RVc2VyUGFnZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHBhZ2UgaXMgdGhlIHdpemFyZCdzIGxhc3QKLQkgKiAgdXNlciBpbnB1dCBwYWdlLiBPdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogQHBhcmFtIGluaXRpYWxWYWx1ZSB0aGUgaW5pdGlhbCB2YWx1ZQotCSAqLwotCXB1YmxpYyBSZW5hbWVJbnB1dFdpemFyZFBhZ2UoU3RyaW5nIGRlc2NyaXB0aW9uLCBib29sZWFuIGlzTGFzdFVzZXJQYWdlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JICAgIHN1cGVyKCJSZW5hbWVJbnB1dFdpemFyZFBhZ2UiKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChpbml0aWFsVmFsdWUpOwotCQlzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCWZJbml0aWFsVmFsdWU9IGluaXRpYWxWYWx1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBpbml0aWFsIGlucHV0IGlzIHZhbGlkLiBUeXBpY2FsbHkgaXQgaXMgbm90LCBiZWNhdXNlIHRoZSAKLQkgKiB1c2VyIGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBlLmcuIGEgbmV3IHR5cGUgbmFtZSBldGMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZmYgdGhlIGlucHV0IHByb3ZpZGVkIGF0IGluaXRpYWxpemF0aW9uIGlzIHZhbGlkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbml0aWFsSW5wdXRWYWxpZCgpewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBhbiBlbXB0eSBzdHJpbmcgaXMgYSB2YWxpZCBpbnB1dC4gVHlwaWNhbGx5IGl0IGlzIG5vdCwgYmVjYXVzZSAKLQkgKiB0aGUgdXNlciBpcyByZXF1aXJlZCB0byBwcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gZS5nLiBhIG5ldyB0eXBlIG5hbWUgZXRjLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIGFuIGVtcHR5IHN0cmluZyBpcyB2YWxpZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRW1wdHlJbnB1dFZhbGlkKCl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCBvZiB0aGUgdGV4dCBpbnB1dCBmaWVsZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50IG9mIHRoZSB0ZXh0IGlucHV0IGZpZWxkLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogbm90IHRleHQgaW5wdXQgZmllbGQgaGFzIGJlZW4gY3JlYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJaWYgKGZUZXh0RmllbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZlRleHRGaWVsZC5nZXRUZXh0KCk7CQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBuZXcgdGV4dCBmb3IgdGhlIHRleHQgZmllbGQuIERvZXMgbm90aGluZyBpZiB0aGUgdGV4dCBmaWVsZCBoYXMgbm90IGJlZW4gY3JlYXRlZC4KLQkgKiBAcGFyYW0gdGV4dCB0aGUgbmV3IHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAoZlRleHRGaWVsZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmVGV4dEZpZWxkLnNldFRleHQodGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIFBlcmZvcm1zIGlucHV0IHZhbGlkYXRpb24uIFJldHVybnMgYSA8Y29kZT5SZWZhY3RvcmluZ1N0YXR1czwvY29kZT4gd2hpY2gKLQkgKiBkZXNjcmliZXMgdGhlIHJlc3VsdCBvZiBpbnB1dCB2YWxpZGF0aW9uLiA8Y29kZT5OdWxsPGNvZGU+IGlzIGludGVycHJldGVkCi0JICogYXMgbm8gZXJyb3IuCi0JICovCi0JcHJvdGVjdGVkIFJlZmFjdG9yaW5nU3RhdHVzIHZhbGlkYXRlVGV4dEZpZWxkKFN0cmluZyB0ZXh0KXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHRJbnB1dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZVRleHRJbnB1dEZpZWxkKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHRJbnB1dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlmVGV4dEZpZWxkPSBuZXcgVGV4dChwYXJlbnQsIHN0eWxlKTsKLQkJZlRleHRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl0ZXh0TW9kaWZpZWQoZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChmVGV4dEZpZWxkLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVOQU1FX05FV19OQU1FKTsKLQkJZlRleHRGaWVsZC5zZXRUZXh0KGZJbml0aWFsVmFsdWUpOwotCQlyZXR1cm4gZlRleHRGaWVsZDsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRoZSBwYWdlJ3Mgc3RhdGUgYW5kIGlzc3VlcyBhIGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZS4gVGhlIHBhZ2UgdmFsaWRhdGlvbgotCSAqIGlzIGNvbXB1dGVkIGJ5IGNhbGxpbmcgPGNvZGU+dmFsaWRhdGVQYWdlPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZXh0TW9kaWZpZWQoU3RyaW5nIHRleHQpIHsJCi0JCWlmICghIGlzRW1wdHlJbnB1dFZhbGlkKCkgJiYgdGV4dC5lcXVhbHMoIiIpKXsgLy8kTk9OLU5MUy0xJAotCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCXJlc3RvcmVNZXNzYWdlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCghIGlzSW5pdGlhbElucHV0VmFsaWQoKSkgJiYgdGV4dC5lcXVhbHMoZkluaXRpYWxWYWx1ZSkpewotCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCXJlc3RvcmVNZXNzYWdlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVRleHRGaWVsZCh0ZXh0KSk7Ci0JCQotLy8JCSBUT0RPOiBlbmFibGUgcHJldmlldyBpbiBNNAotCQlnZXRSZWZhY3RvcmluZ1dpemFyZCgpLnNldEZvcmNlUHJldmlld1JldmlldyhmYWxzZSk7Ci0JCWdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkKLQl9Ci0JCi0JLyoqCi0JICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgaWYgdGhleSB3YW50IHRvIHJlc3RvcmUgdGhlIG1lc3NhZ2UgZGlmZmVyZW50bHkuCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjYWxscyA8Y29kZT5zZXRNZXNzYWdlKG51bGwpPC9jb2RlPiwgd2hpY2ggY2xlYXJzIHRoZSBtZXNzYWdlIAotCSAqIHRodXMgZXhwb3NpbmcgdGhlIGRlc2NyaXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVNZXNzYWdlKCl7Ci0JCXNldE1lc3NhZ2UobnVsbCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgaW4gSURpYWxvZ1BhZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmVGV4dEZpZWxkPSBudWxsOwkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBpbiBXaXphcmRQYWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKHZpc2libGUpIHsKLQkJCXRleHRNb2RpZmllZChnZXRUZXh0KCkpOwotCQl9Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmICh2aXNpYmxlICYmIGZUZXh0RmllbGQgIT0gbnVsbCkgewotCQkJZlRleHRGaWVsZC5zZXRGb2N1cygpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHN1cGVyQ29tcG9zaXRlPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlzZXRDb250cm9sKHN1cGVyQ29tcG9zaXRlKTsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHN1cGVyQ29tcG9zaXRlKTsKLQkJCi0JCXN1cGVyQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZT0gbmV3IENvbXBvc2l0ZShzdXBlckNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CQotCQkKLQkJR3JpZExheW91dCBsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zPSAyOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nPSA4OwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQkKLQkJTGFiZWwgbGFiZWw9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChnZXRMYWJlbFRleHQoKSk7Ci0JCQotCQlUZXh0IHRleHQ9IGNyZWF0ZVRleHRJbnB1dEZpZWxkKGNvbXBvc2l0ZSk7Ci0JCXRleHQuc2VsZWN0QWxsKCk7Ci0JCUdyaWREYXRhIGdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50PSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoMjUpOwotCQl0ZXh0LnNldExheW91dERhdGEoZ2QpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGV4dCwgWFNERWRpdG9yQ1NIZWxwSWRzLlJFTkFNRV9ORVdfTkFNRSk7Ci0gICAgCi0JCWFkZE9wdGlvbmFsVXBkYXRlUmVmZXJlbmNlc0NoZWNrYm94KHN1cGVyQ29tcG9zaXRlKTsKLQkJZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQl0ZXh0LnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJZ2V0UmVmYWN0b3JpbmdXaXphcmQoKS5zZXRGb3JjZVByZXZpZXdSZXZpZXcoZmFsc2UpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChzdXBlckNvbXBvc2l0ZSk7Ci0JCS8vV29ya2JlbmNoSGVscC5zZXRIZWxwKGdldENvbnRyb2woKSwgZkhlbHBDb250ZXh0SUQpOwotCi0JfQotCQotCXByaXZhdGUgc3RhdGljIEJ1dHRvbiBjcmVhdGVDaGVja2JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGl0bGUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJQnV0dG9uIGNoZWNrQm94PSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dCh0aXRsZSk7Ci0JCWNoZWNrQm94LnNldFNlbGVjdGlvbih2YWx1ZSk7Ci0JCXJldHVybiBjaGVja0JveDsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkT3B0aW9uYWxVcGRhdGVSZWZlcmVuY2VzQ2hlY2tib3goQ29tcG9zaXRlIHJlc3VsdCkgewotCi0JCWZpbmFsIElSZWZlcmVuY2VVcGRhdGluZyByZWY9IChJUmVmZXJlbmNlVXBkYXRpbmcpZ2V0UmVmYWN0b3JpbmcoKS5nZXRBZGFwdGVyKElSZWZlcmVuY2VVcGRhdGluZy5jbGFzcyk7Ci0JCWlmIChyZWYgPT0gbnVsbCB8fCAhcmVmLmNhbkVuYWJsZVVwZGF0ZVJlZmVyZW5jZXMoKSkJCi0JCQlyZXR1cm47Ci0JCVN0cmluZyB0aXRsZT0gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZUlucHV0V2l6YXJkUGFnZS51cGRhdGVfcmVmZXJlbmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gZGVmYXVsdFZhbHVlPSB0cnVlOyAKLQkJZlVwZGF0ZVJlZmVyZW5jZXM9IGNyZWF0ZUNoZWNrYm94KHJlc3VsdCwgdGl0bGUsIGRlZmF1bHRWYWx1ZSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChmVXBkYXRlUmVmZXJlbmNlcywgWFNERWRpdG9yQ1NIZWxwSWRzLlJFTkFNRV9VUERBVEVfUkVGRVJFTkNFUyk7Ci0JCXJlZi5zZXRVcGRhdGVSZWZlcmVuY2VzKGZVcGRhdGVSZWZlcmVuY2VzLmdldFNlbGVjdGlvbigpKTsKLQkJZlVwZGF0ZVJlZmVyZW5jZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAJCXJlZi5zZXRVcGRhdGVSZWZlcmVuY2VzKGZVcGRhdGVSZWZlcmVuY2VzLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7CQkJCQotCQlmVXBkYXRlUmVmZXJlbmNlcy5zZXRFbmFibGVkKHRydWUpOwkJCi0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlyZXR1cm4gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZUlucHV0V2l6YXJkUGFnZS5uZXdfbmFtZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlbmFtZVJlZmFjdG9yaW5nV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlbmFtZVJlZmFjdG9yaW5nV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDk3N2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZW5hbWVSZWZhY3RvcmluZ1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5JTmFtZVVwZGF0aW5nOwotCi1wdWJsaWMgY2xhc3MgUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQgZXh0ZW5kcyBSZWZhY3RvcmluZ1dpemFyZCB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZklucHV0UGFnZURlc2NyaXB0aW9uOwotCi0JcHJpdmF0ZSBmaW5hbCBJbWFnZURlc2NyaXB0b3IgZklucHV0UGFnZUltYWdlRGVzY3JpcHRvcjsKLQkKLQlwdWJsaWMgUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQoUmVmYWN0b3JpbmcgcmVmYWN0b3JpbmcsIFN0cmluZyBkZWZhdWx0UGFnZVRpdGxlLCBTdHJpbmcgaW5wdXRQYWdlRGVzY3JpcHRpb24sIAotCQkJSW1hZ2VEZXNjcmlwdG9yIGlucHV0UGFnZUltYWdlRGVzY3JpcHRvcikgewotCQlzdXBlcihyZWZhY3RvcmluZywgRElBTE9HX0JBU0VEX1VTRVJfSU5URVJGQUNFKTsKLQkJc2V0RGVmYXVsdFBhZ2VUaXRsZShkZWZhdWx0UGFnZVRpdGxlKTsKLSAgICAJZklucHV0UGFnZURlc2NyaXB0aW9uPSBpbnB1dFBhZ2VEZXNjcmlwdGlvbjsKLQkJZklucHV0UGFnZUltYWdlRGVzY3JpcHRvcj0gaW5wdXRQYWdlSW1hZ2VEZXNjcmlwdG9yOwotCi0JfQotCi0JLyogbm9uIGphdmEtZG9jCi0JICogQHNlZSBSZWZhY3RvcmluZ1dpemFyZCNhZGRVc2VySW5wdXRQYWdlcwotCSAqLyAKLQlwcm90ZWN0ZWQgdm9pZCBhZGRVc2VySW5wdXRQYWdlcygpIHsKLQkJU3RyaW5nIGluaXRpYWxTZXR0aW5nPSBnZXRQcm9jZXNzb3IoKS5nZXRDdXJyZW50RWxlbWVudE5hbWUoKTsKLQkJUmVuYW1lSW5wdXRXaXphcmRQYWdlIGlucHV0UGFnZT0gY3JlYXRlSW5wdXRQYWdlKGZJbnB1dFBhZ2VEZXNjcmlwdGlvbiwgaW5pdGlhbFNldHRpbmcpOwotCQlpbnB1dFBhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKGZJbnB1dFBhZ2VJbWFnZURlc2NyaXB0b3IpOwotCQlhZGRQYWdlKGlucHV0UGFnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElOYW1lVXBkYXRpbmcgZ2V0UHJvY2Vzc29yKCkgewotCQkKLQkJcmV0dXJuIChJTmFtZVVwZGF0aW5nKWdldFJlZmFjdG9yaW5nKCkuZ2V0QWRhcHRlcihJTmFtZVVwZGF0aW5nLmNsYXNzKTsJCi0JfQotCQotCQotCXByb3RlY3RlZCBSZW5hbWVJbnB1dFdpemFyZFBhZ2UgY3JlYXRlSW5wdXRQYWdlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgaW5pdGlhbFNldHRpbmcpIHsKLQkJcmV0dXJuIG5ldyBSZW5hbWVJbnB1dFdpemFyZFBhZ2UobWVzc2FnZSwgdHJ1ZSwgaW5pdGlhbFNldHRpbmcpIHsKLQkJCXByb3RlY3RlZCBSZWZhY3RvcmluZ1N0YXR1cyB2YWxpZGF0ZVRleHRGaWVsZChTdHJpbmcgdGV4dCkgewotCQkJCXJldHVybiB2YWxpZGF0ZU5ld05hbWUodGV4dCk7Ci0JCQl9CQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUmVmYWN0b3JpbmdTdGF0dXMgdmFsaWRhdGVOZXdOYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCUlOYW1lVXBkYXRpbmcgcmVmPSBnZXRQcm9jZXNzb3IoKTsKLQkJcmVmLnNldE5ld0VsZW1lbnROYW1lKG5ld05hbWUpOwotLy8JCXRyeXsKLQkJCXJldHVybiByZWYuY2hlY2tOZXdFbGVtZW50TmFtZShuZXdOYW1lKTsKLS8vCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotLy8JCQkvL1hYWDogc2hvdWxkIGxvZyB0aGUgZXhjZXB0aW9uCi0vLwkJCVN0cmluZyBtc2c9IGUuZ2V0TWVzc2FnZSgpID09IG51bGwgPyAiIjogZS5nZXRNZXNzYWdlKCk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJcmV0dXJuIFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZUZhdGFsRXJyb3JTdGF0dXMoUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRGb3JtYXR0ZWRTdHJpbmcoIlJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkLmludGVybmFsX2Vycm9yIiwgbXNnKSk7Ly8kTk9OLU5MUy0xJAotLy8JCX0JCi0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTBmY2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVJlZmFjdG9yTWVudV9sYWJlbD1SZWZhY3RvcgotUmVmYWN0b3JBY3Rpb25Hcm91cF9ub19yZWZhY3RvcmluZ19hdmFpbGFibGU9PG5vIHJlZmFjdG9yaW5nIGF2YWlsYWJsZT4KLQotUmVuYW1lQWN0aW9uX3JlbmFtZT1SZW5hbWUKLVJlbmFtZUFjdGlvbl91bmF2YWlsYWJsZT1PcGVyYXRpb24gdW5hdmFpbGFibGUgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuU2VsZWN0IGEgLi4uLgotUmVuYW1lQWN0aW9uX3RleHQ9UmUmbmFtZS4uLgotCi1SZW5hbWVJbnB1dFdpemFyZFBhZ2VfbmV3X25hbWU9ICZOZXcgbmFtZToKLVJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkX2ludGVybmFsX2Vycm9yPSBJbnRlcm5hbCBlcnJvciBkdXJpbmcgbmFtZSBjaGVja2luZzogezB9Ci0KLQotUmVuYW1lWFNERWxlbWVudEFjdGlvbl9leGNlcHRpb249VW5leHBlY3RlZCBleGNlcHRpb24gb2NjdXJyZWQuIFNlZSBsb2cgZm9yIGRldGFpbHMKLVJlbmFtZVhTREVsZW1lbnRBY3Rpb25fbm90X2F2YWlsYWJsZT1PcGVyYXRpb24gdW5hdmFpbGFibGUgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuU2VsZWN0IGEgWFNEIHByb2plY3QsIGZvbGRlciwgcmVzb3VyY2UsIGZpbGUsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMsICBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW5pdGlvbnMsIGNvbXBsZXggdHlwZSBkZWZpbml0aW9ucywgZWxlbWVudCBkZWNsYXJhdGlvbnMsIGlkZW50aXR5IGNvbnN0cmFpbnQgZGVmaW5pdGlvbnMsIG1vZGVsIGdyb3VwcyBkZWZpbml0aW9ucywgbm90YXRpb24gZGVjbGFyYXRpb25zLCBvciBzaW1wbGUgdHlwZSBkZWZpbml0aW9ucy4KLVJlbmFtZVhTREVsZW1lbnRBY3Rpb25fbmFtZT1SZW5hbWUKLQotCi1SZW5hbWVTdXBwb3J0X2RpYWxvZ190aXRsZT1SZW5hbWUKLVJlbmFtZVN1cHBvcnRfbm90X2F2YWlsYWJsZT1SZW5hbWUgc3VwcG9ydCBub3QgYXZhaWxhYmxlCi0KLVJlbmFtZUNvbXBvbmVudFdpemFyZF9kZWZhdWx0UGFnZVRpdGxlPVJlbmFtZSB3aXphcmQKLVJlbmFtZUNvbXBvbmVudFdpemFyZF9pbnB1dFBhZ2VfZGVzY3JpcHRpb249UmVuYW1lIFhNTCBTY2hlbWEgY29tcG9uZW50Ci0KLVJlbmFtZUlucHV0V2l6YXJkUGFnZV91cGRhdGVfcmVmZXJlbmNlcz1VcGRhdGUgcmVmZXJlbmNlcwotWFNEQ29tcG9uZW50UmVuYW1lQ2hhbmdlX25hbWU9WE1MIFNjaGVtYSBjb21wb25lbnQgcmVuYW1pbmcgaW4gezB9OiB7MX0gdG8gezJ9Ci1YU0RDb21wb25lbnRSZW5hbWVDaGFuZ2VfUmVuYW1pbmc9UmVuYW1pbmcuLi4KLVJlc291cmNlUmVuYW1lUGFydGljaXBhbnRfY29tcG9zaXRlQ2hhbmdlTmFtZT1YU0QgZmlsZSByZW5hbWUgcmVmZXJlbmNlcyB1cGRhdGluZyBjaGFuZ2VzCi1SZW5hbWVSZXNvdXJjZUNoYW5nZV9yZW5hbWVfcmVzb3VyY2VfcmVmZXJlbmNlX2NoYW5nZT1SZW5hbWluZyByZXNvdXJjZSBuYW1lIHJlZmVyZW5jZXMKLVhTRFJlbmFtZVJlc291cmNlQ2hhbmdlX25hbWU9UmVzb3VyY2UgcmVuYW1lOiB7MH0gdG8gezF9Ci1SZW5hbWVSZXNvdXJjZVJlZmFjdG9yaW5nX0ludGVybmFsX0Vycm9yPUludGVybmFsIGVycm9yCi1SZW5hbWVSZXNvdXJjZVJlZmFjdG9yaW5nX2FscmVhZF9leGlzdHM9UmVzb3VyY2UgYWxyZWFkeSBleGlzdAotUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZ19pbnZhbGlkTmFtZT1JbnZhbGlkIHJlc291cmNlIG5hbWUKLVJlbmFtZVJlc291cmNlUHJvY2Vzc29yX25hbWU9UmVzb3VyY2UgcmVuYW1pbmcKLU1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uX3RleHQ9TWFrZSAmQW5vbnltb3VzIFR5cGUgR2xvYmFsIAotTWFrZUxvY2FsRWxlbWVudEdsb2JhbEFjdGlvbl90ZXh0PU1ha2UgJkxvY2FsIEVsZW1lbnQgR2xvYmFsCi1YU0RDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudF9Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlcz1YTUwgU2NoZW1hIHJlZmFjdG9yaW5nIGNoYW5nZXMKLVdTRExDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudF9Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlcz1XU0RMIFNjaGVtYSByZWZhY3RvcmluZyBjaGFuZ2VzCi1SZW5hbWVDb21wb25lbnRQcm9jZXNzb3JfQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZXM9Q29tcG9uZW50IG5hbWUgcmVmYWN0b3JpbmcgY2hhbmdlcwotUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yX0NvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVfZGVjbGF0YXRpb249VXBkYXRlIGNvbXBvbmVudCBkZWNsYXJhdGlvbi9kZWZpbml0aW9uCi1SZW5hbWVDb21wb25lbnRQcm9jZXNzb3JfQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZV9yZWZlcmVuY2U9VXBkYXRlIGNvbXBvbmVudCByZWZlcmVuY2UKLVhTRENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50X3hzZF9jb21wb25lbnRfcmVuYW1lX3BhcnRpY2lwYW50PVhTRCBjb21wb25lbnQgcmVuYW1lIHBhcnRpY2lwYW50Ci1XU0RMQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnRfd3NkbF9jb21wb25lbnRfcmVuYW1lX3BhcnRpY2lwYW50PVdTREwgY29tcG9uZW50IHJlbmFtZSBwYXJ0aWNpcGFudAotUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudF9GaWxlX1JlbmFtZV91cGRhdGVfcmVmZXJlbmNlPUZpbGUgcmVuYW1lIHJlZmFjdG9yaW5nIGNoYW5nZXMKLQotUmVuYW1lVGFyZ2V0TmFtZXNwYWNlX3RleHQ9UmVuYW1lIFRhcmdldCBOYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL0lYU0RTZWFyY2hDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL0lYU0RTZWFyY2hDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0NjViMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9JWFNEU2VhcmNoQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVhTRFNlYXJjaENvbnN0YW50cyB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MU0NIRU1BX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNEX0NPTlRFTlRfVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSAgIFRZUEVfTUVUQV9OQU1FID0gIG5ldyBRdWFsaWZpZWROYW1lIChYTUxTQ0hFTUFfTkFNRVNQQUNFLCAidHlwZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSAgIENPTVBMRVhfVFlQRV9NRVRBX05BTUUgPSAgbmV3IFF1YWxpZmllZE5hbWUgKFhNTFNDSEVNQV9OQU1FU1BBQ0UsICJjb21wbGV4VHlwZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSAgIFNJTVBMRV9UWVBFX01FVEFfTkFNRSA9ICBuZXcgUXVhbGlmaWVkTmFtZSAoWE1MU0NIRU1BX05BTUVTUEFDRSwgInNpbXBsZVR5cGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgICBFTEVNRU5UX01FVEFfTkFNRSA9ICBuZXcgUXVhbGlmaWVkTmFtZSAoWE1MU0NIRU1BX05BTUVTUEFDRSwgImVsZW1lbnQiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgICBBVFRSSUJVVEVfTUVUQV9OQU1FID0gIG5ldyBRdWFsaWZpZWROYW1lIChYTUxTQ0hFTUFfTkFNRVNQQUNFLCAiYXR0cmlidXRlIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lICAgQVRUUklCVVRFX0dST1VQX01FVEFfTkFNRSA9ICBuZXcgUXVhbGlmaWVkTmFtZSAoWE1MU0NIRU1BX05BTUVTUEFDRSwgImF0dHJpYnV0ZUdyb3VwIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lICAgR1JPVVBfTUVUQV9OQU1FID0gIG5ldyBRdWFsaWZpZWROYW1lIChYTUxTQ0hFTUFfTkFNRVNQQUNFLCAiZ3JvdXAiKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MDc3YTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZWFyY2hNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUU9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5TZWFyY2hNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTZWFyY2hNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3JvdXBfcmVmZXJlbmNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZERlY2xhcmF0aW9uQWN0aW9uX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kRGVjbGFyYXRpb25zSW5Qcm9qZWN0QWN0aW9uX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kRGVjbGFyYXRpb25zSW5Xb3JraW5nU2V0QWN0aW9uX2xhYmVsOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgU2VhcmNoTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL1hTRFNlYXJjaENvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9YU0RTZWFyY2hDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTg5YjU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL1hTRFNlYXJjaENvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guQ29tcG9uZW50U2VhcmNoQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxTZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFhTRFNlYXJjaENvbnRyaWJ1dG9yIGV4dGVuZHMgQ29tcG9uZW50U2VhcmNoQ29udHJpYnV0b3IgIHsKLSAKLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUmVmZXJlbmNlcygpIHsKLQkJcmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCVN0cmluZyBucyA9IElYU0RTZWFyY2hDb25zdGFudHMuWE1MU0NIRU1BX05BTUVTUEFDRTsKLQotCQlMaXN0IHBhdHRlcm5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUpKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUpKTsKLQkJcmVmZXJlbmNlcy5wdXQoSVhTRFNlYXJjaENvbnN0YW50cy5FTEVNRU5UX01FVEFfTkFNRSwgcGF0dGVybnMpOwotCi0JCXBhdHRlcm5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5CQVNFX0FUVFJJQlVURSkpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUpKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSkpOwotCQlyZWZlcmVuY2VzLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLkNPTVBMRVhfVFlQRV9NRVRBX05BTUUsIHBhdHRlcm5zKTsKLQotCQlwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUpKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSkpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFKSk7Ci0JCXBhdHRlcm5zLmFkZChuZXcgWE1MU2VhcmNoUGF0dGVybiggbnMsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFKSk7Ci0KLQkJcmVmZXJlbmNlcy5wdXQoSVhTRFNlYXJjaENvbnN0YW50cy5TSU1QTEVfVFlQRV9NRVRBX05BTUUsIHBhdHRlcm5zKTsKLQotCQlwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSkpOwotCQlyZWZlcmVuY2VzLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLkdST1VQX01FVEFfTkFNRSwgcGF0dGVybnMpOwotCi0JCXBhdHRlcm5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFKSk7Ci0JCXJlZmVyZW5jZXMucHV0KElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX0dST1VQX01FVEFfTkFNRSwgcGF0dGVybnMpOwotCi0JCXBhdHRlcm5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSkpOwotCQlyZWZlcmVuY2VzLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLkFUVFJJQlVURV9NRVRBX05BTUUsIHBhdHRlcm5zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVjbGFyYXRpb25zKCl7Ci0JCQotCQlkZWNsYXJhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQlTdHJpbmcgbnMgPSBJWFNEU2VhcmNoQ29uc3RhbnRzLlhNTFNDSEVNQV9OQU1FU1BBQ0U7Ci0KLQkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKTsKLQkJZGVjbGFyYXRpb25zLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLkVMRU1FTlRfTUVUQV9OQU1FLCBwYXR0ZXJuKTsKLQotCQlwYXR0ZXJuID0gbmV3IFhNTFNlYXJjaFBhdHRlcm4obnMsIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKTsKLQkJZGVjbGFyYXRpb25zLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLkNPTVBMRVhfVFlQRV9NRVRBX05BTUUsIHBhdHRlcm4pOwotCi0JCXBhdHRlcm4gPSBuZXcgWE1MU2VhcmNoUGF0dGVybihucywgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSk7Ci0JCWRlY2xhcmF0aW9ucy5wdXQoSVhTRFNlYXJjaENvbnN0YW50cy5TSU1QTEVfVFlQRV9NRVRBX05BTUUsIHBhdHRlcm4pOwotCi0JCXBhdHRlcm4gPSBuZXcgWE1MU2VhcmNoUGF0dGVybihucywgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKTsKLQkJZGVjbGFyYXRpb25zLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLkFUVFJJQlVURV9NRVRBX05BTUUsIHBhdHRlcm4pOwotCi0JCXBhdHRlcm4gPSBuZXcgWE1MU2VhcmNoUGF0dGVybihucywgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotCQlkZWNsYXJhdGlvbnMucHV0KElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX0dST1VQX01FVEFfTkFNRSwgcGF0dGVybik7Ci0KLQkJcGF0dGVybiA9IG5ldyBYTUxTZWFyY2hQYXR0ZXJuKG5zLCBYU0RDb25zdGFudHMuR1JPVVBfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSk7Ci0JCWRlY2xhcmF0aW9ucy5wdXQoSVhTRFNlYXJjaENvbnN0YW50cy5HUk9VUF9NRVRBX05BTUUsIHBhdHRlcm4pOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVN1cHBvcnRlZE5hbWVzcGFjZXMoKSB7Ci0JCW5hbWVzcGFjZXMgPSBuZXcgU3RyaW5nW117IElYU0RTZWFyY2hDb25zdGFudHMuWE1MU0NIRU1BX05BTUVTUEFDRX07Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL1hTRFNlYXJjaFBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9YU0RTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDUxODA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL1hTRFNlYXJjaFBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLkNvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTFNlYXJjaFBhcnRpY2lwYW50OwotCi1wdWJsaWMgY2xhc3MgWFNEU2VhcmNoUGFydGljaXBhbnQgZXh0ZW5kcyBYTUxTZWFyY2hQYXJ0aWNpcGFudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC5zZWFyY2guWFNEU2VhcmNoUGFydGljaXBhbnQiOwotCi0JcHVibGljIFhTRFNlYXJjaFBhcnRpY2lwYW50KCkKLQl7Ci0JICBzdXBlcigpOwotICAgICAgaWQgPSBJRDsKLQl9CQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRDb250ZW50VHlwZXMoKQotCXsKLQkgIFN0cmluZ1tdIHJlc3VsdCA9IHsgIm9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiIH07Ci0JICByZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGUoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBNYXAgc2VhcmNoT3B0aW9ucykKLQl7Ci0JCWlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuICl7Ci0JCQlYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuIGNvbXBvbmVudFBhdHRlcm4gPSAoWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybilwYXR0ZXJuOwotCQkJU3RyaW5nIG5hbWVzcGFjZSA9IGNvbXBvbmVudFBhdHRlcm4uZ2V0TWV0YU5hbWUoKS5nZXROYW1lc3BhY2UoKTsKLQkJCWlmKElYU0RTZWFyY2hDb25zdGFudHMuWE1MU0NIRU1BX05BTUVTUEFDRS5lcXVhbHMobmFtZXNwYWNlKSl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkJCi0JcHVibGljIENvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yIGdldFNlYXJjaENvbnRyaWJ1dG9yKCkgewkJCi0JCXJldHVybiBuZXcgWFNEU2VhcmNoQ29udHJpYnV0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9YU0RTZWFyY2hRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvWFNEU2VhcmNoUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRmZWZiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9YU0RTZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guQWJzdHJhY3RTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm47Ci0KLXB1YmxpYyBjbGFzcyBYU0RTZWFyY2hRdWVyeSBleHRlbmRzIEFic3RyYWN0U2VhcmNoUXVlcnkKLXsgICAKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTElNSVRfVE9fREVDTEFSQVRJT05TID0gMTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTElNSVRfVE9fUkVGRVJFTkNFUyAgID0gMjsgIAotICAKLSAgaW50IGZMaW1pdFRvID0gMDsKLSAgSUZpbGUgZkNvbnRleHRGaWxlOwotICBRdWFsaWZpZWROYW1lIGZFbGVtZW50UU5hbWU7Ci0gIFF1YWxpZmllZE5hbWUgZlR5cGVOYW1lOwotICAKLSAgcHVibGljIFhTRFNlYXJjaFF1ZXJ5KFN0cmluZyBwYXR0ZXJuLCBJRmlsZSBmaWxlLCBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwgUXVhbGlmaWVkTmFtZSB0eXBlTmFtZSwgaW50IGxpbWl0VG8sIFNlYXJjaFNjb3BlIHNjb3BlLCBTdHJpbmcgc2NvcGVEZXNjcmlwdGlvbikKLSAgewotICAgIHN1cGVyKHBhdHRlcm4sIHNjb3BlLCBzY29wZURlc2NyaXB0aW9uKTsKLSAgICBmTGltaXRUbyA9IGxpbWl0VG87Ci0gICAgZkNvbnRleHRGaWxlID0gZmlsZTsKLSAgICBmRWxlbWVudFFOYW1lID0gZWxlbWVudFFOYW1lOwotICAgIGZUeXBlTmFtZSA9IHR5cGVOYW1lOwotICB9Ci0KLSAgcHJvdGVjdGVkIFNlYXJjaFBhdHRlcm4gY3JlYXRlU2VhcmNoUGF0dGVybihRdWFsaWZpZWROYW1lIHR5cGVOYW1lKQotICB7Ci0gICAgaWYgKGZMaW1pdFRvID09IExJTUlUX1RPX0RFQ0xBUkFUSU9OUykKLSAgICB7ICAKLSAgICAgIHJldHVybiBuZXcgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKGZDb250ZXh0RmlsZSwgZkVsZW1lbnRRTmFtZSwgZlR5cGVOYW1lKTsKLSAgICB9ICAKLSAgICBlbHNlIGlmIChmTGltaXRUbyA9PSBMSU1JVF9UT19SRUZFUkVOQ0VTKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybihmQ29udGV4dEZpbGUsIGZFbGVtZW50UU5hbWUsIGZUeXBlTmFtZSk7Ci0gICAgfSAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9CYXNlR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9CYXNlR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWM2NjhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvQmFzZUdyb3VwQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLy9UT0RPICh0cnVuZykgc2hvdWxkIGJlIGluIGNvbW1vbi51aSB0aGlzIG9uZSA/PwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VHcm91cEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlLCBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElNZW51Q3JlYXRvcgotewotICAgIHByb3RlY3RlZCBJU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0gICAgcHJpdmF0ZSBJQWN0aW9uIGZEZWxlZ2F0ZUFjdGlvbjsKLSAgICAvLyB3aGV0aGVyIHRvIHJlLWZpbGwgdGhlIG1lbnUgKHJlc2V0IG9uIHNlbGVjdGlvbiBjaGFuZ2UpCi0gICAgcHJpdmF0ZSBib29sZWFuIGZGaWxsTWVudSA9IHRydWU7Ci0gICAgcHJvdGVjdGVkIElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQ7IAotICAgIAotCi0gICAgcHVibGljIEJhc2VHcm91cEFjdGlvbkRlbGVnYXRlKCkgCi0gICAgewotCi0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotICAgICAgICB3b3JrYmVuY2hQYXJ0ID0gdGFyZ2V0UGFydDsKLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvciNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0gICAgfQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IjZ2V0TWVudShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sKQotICAgICAqLwotICAgIHB1YmxpYyBNZW51IGdldE1lbnUoQ29udHJvbCBwYXJlbnQpIHsKLSAgICAgICAgLy8gbmV2ZXIgY2FsbGVkCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yI2dldE1lbnUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudSkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVudSBnZXRNZW51KE1lbnUgcGFyZW50KSB7Ci0gICAgICAgIC8vQ3JlYXRlIHRoZSBuZXcgbWVudS4gVGhlIG1lbnUgd2lsbCBnZXQgZmlsbGVkIHdoZW4gaXQgaXMgYWJvdXQgdG8gYmUgc2hvd24uIHNlZSBmaWxsTWVudShNZW51KS4KLSAgICAgICAgTWVudSBtZW51ID0gbmV3IE1lbnUocGFyZW50KTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZCBsaXN0ZW5lciB0byByZXBvcHVsYXRlIHRoZSBtZW51IGVhY2ggdGltZQotICAgICAgICAgKiBpdCBpcyBzaG93biBiZWNhdXNlIE1lbnVNYW5hZ2VyLnVwZGF0ZShib29sZWFuLCBib29sZWFuKSAKLSAgICAgICAgICogZG9lc24ndCBkaXNwb3NlIHB1bGxkb3duIEFjdGlvbkNvbnRyaWJ1dGlvbiBpdGVtcyBmb3IgZWFjaCBwb3B1cCBtZW51LgotICAgICAgICAgKi8KLSAgICAgICAgbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbWVudVNob3duKE1lbnVFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZGaWxsTWVudSkgewotICAgICAgICAgICAgICAgICAgICBNZW51IG0gPSAoTWVudSllLndpZGdldDsKLSAgICAgICAgICAgICAgICAgICAgTWVudUl0ZW1bXSBpdGVtcyA9IG0uZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaWxsTWVudShtKTsKLSAgICAgICAgICAgICAgICAgICAgZkZpbGxNZW51ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIG1lbnU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0gICAgICAgIC8vIE5ldmVyIGNhbGxlZCBiZWNhdXNlIHdlIGJlY29tZSBhIG1lbnUuCi0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGZEZWxlZ2F0ZUFjdGlvbiA9IGFjdGlvbjsKLSAgICAgICAgdXBkYXRlV2l0aChzZWxlY3Rpb24pOwotICAgICAgICAKLSAgICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLSAgICAgICAgd29ya2JlbmNoUGFydCA9IHRhcmdldEVkaXRvcjsKLSAgICAgICAgZkRlbGVnYXRlQWN0aW9uID0gYWN0aW9uOwotICAgICAgICBpZiAodGFyZ2V0RWRpdG9yICE9IG51bGwgJiYgdGFyZ2V0RWRpdG9yLmdldEVkaXRvclNpdGUoKSAhPSBudWxsICYmIHRhcmdldEVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB1cGRhdGVXaXRoKHRhcmdldEVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVXaXRoKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGZTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgICAgIGlmIChmRGVsZWdhdGVBY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgYm9vbGVhbiBlbmFibGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAvL2lmICgoKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldExlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gKXsKLSAgICAgICAgICAgICAgICAgICAgZW5hYmxlID0gIXNlbGVjdGlvbi5pc0VtcHR5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZW5hYmxlIGFjdGlvbgotICAgICAgICAgICAgZkRlbGVnYXRlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gZmlsbCBzdWJtZW51Ci0gICAgICAgICAgICBmRmlsbE1lbnUgPSB0cnVlOwotICAgICAgICAgICAgZkRlbGVnYXRlQWN0aW9uLnNldE1lbnVDcmVhdG9yKHRoaXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZpbGxNZW51KE1lbnUgbWVudSk7Ci0gICAgCi0gICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0NvbXBvc2l0ZUFjdGlvbkdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0NvbXBvc2l0ZUFjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZjkzNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9Db21wb3NpdGVBY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyBUT0RPLi4uIG9wZW4gYSBidWd6aWxsYSB0byBnZXQgdGhlIEpEVCBjbGFzcyBtb3ZlZCB0byBub24gaW50ZXJuYWwgcGxhdGZvcm0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cDsKLQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUFjdGlvbkdyb3VwIGV4dGVuZHMgQWN0aW9uR3JvdXAgewotCi0gICAgcHJpdmF0ZSBBY3Rpb25Hcm91cFtdIGZHcm91cHM7Ci0gICAgCi0gICAgcHVibGljIENvbXBvc2l0ZUFjdGlvbkdyb3VwKCkgewotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ29tcG9zaXRlQWN0aW9uR3JvdXAoQWN0aW9uR3JvdXBbXSBncm91cHMpIHsKLSAgICAgICAgc2V0R3JvdXBzKGdyb3Vwcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0R3JvdXBzKEFjdGlvbkdyb3VwW10gZ3JvdXBzKSB7Ci0gICAgICAgIEFzc2VydC5pc1RydWUoZkdyb3VwcyA9PSBudWxsKTsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChncm91cHMpOwotICAgICAgICBmR3JvdXBzPSBncm91cHM7ICAgICAgICAKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBBY3Rpb25Hcm91cCBnZXQoaW50IGluZGV4KSB7Ci0gICAgICAgIGlmIChmR3JvdXBzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIGZHcm91cHNbaW5kZXhdOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRHcm91cChBY3Rpb25Hcm91cCBncm91cCkgewotICAgICAgICBpZiAoZkdyb3VwcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmR3JvdXBzPSBuZXcgQWN0aW9uR3JvdXBbXSB7IGdyb3VwIH07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBY3Rpb25Hcm91cFtdIG5ld0dyb3Vwcz0gbmV3IEFjdGlvbkdyb3VwW2ZHcm91cHMubGVuZ3RoICsgMV07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGZHcm91cHMsIDAsIG5ld0dyb3VwcywgMCwgZkdyb3Vwcy5sZW5ndGgpOwotICAgICAgICAgICAgbmV3R3JvdXBzW2ZHcm91cHMubGVuZ3RoXT0gZ3JvdXA7Ci0gICAgICAgICAgICBmR3JvdXBzPSBuZXdHcm91cHM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICBpZiAoZkdyb3VwcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBmb3IgKGludCBpPSAwOyBpIDwgZkdyb3Vwcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZkdyb3Vwc1tpXS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0gICAgICAgIHN1cGVyLmZpbGxBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotICAgICAgICBpZiAoZkdyb3VwcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBmb3IgKGludCBpPSAwOyBpIDwgZkdyb3Vwcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZkdyb3Vwc1tpXS5maWxsQWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotICAgICAgICBzdXBlci5maWxsQ29udGV4dE1lbnUobWVudSk7Ci0gICAgICAgIGlmIChmR3JvdXBzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGZvciAoaW50IGk9IDA7IGkgPCBmR3JvdXBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmR3JvdXBzW2ldLmZpbGxDb250ZXh0TWVudShtZW51KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoQWN0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyLnNldENvbnRleHQoY29udGV4dCk7Ci0gICAgICAgIGlmIChmR3JvdXBzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGZvciAoaW50IGk9IDA7IGkgPCBmR3JvdXBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmR3JvdXBzW2ldLnNldENvbnRleHQoY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVBY3Rpb25CYXJzKCkgewotICAgICAgICBzdXBlci51cGRhdGVBY3Rpb25CYXJzKCk7Ci0gICAgICAgIGlmIChmR3JvdXBzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGZvciAoaW50IGk9IDA7IGkgPCBmR3JvdXBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmR3JvdXBzW2ldLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRGVjbGFyYXRpb25zU2VhcmNoR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRGVjbGFyYXRpb25zU2VhcmNoR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzMDhlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0RlY2xhcmF0aW9uc1NlYXJjaEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci0KLS8vIFRPRE8uLiBmaWxsIGluIHRoZSBjb250ZW50Ci1wdWJsaWMgY2xhc3MgRGVjbGFyYXRpb25zU2VhcmNoR3JvdXAKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRmluZEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNWExNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1wdWJsaWMgY2xhc3MgRmluZEFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGVkaXRvcjsKLQotICBwcm90ZWN0ZWQgRmluZEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3IpCi0gIHsKLSAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDUzMzUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRmluZFJlZmVyZW5jZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5Xb3Jrc3BhY2VTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5JU2VsZWN0aW9uTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLklYU0RTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guWFNEU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotcHVibGljIGNsYXNzIEZpbmRSZWZlcmVuY2VzQWN0aW9uIGV4dGVuZHMgRmluZEFjdGlvbgotewotICBwdWJsaWMgRmluZFJlZmVyZW5jZXNBY3Rpb24oSUVkaXRvclBhcnQgZWRpdG9yKQotICB7Ci0gICAgc3VwZXIoZWRpdG9yKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFjdGlvbkRlZmluaXRpb25JZChTdHJpbmcgc3RyaW5nKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogVG8gYmUgdXNlZCBieSBzdWJjbGFzcyBpbiBpdHMgcnVuKCkgUmV0dXJucyB0aGUgZmlsZSB3aGVyZSB0aGUgc2VsZWN0aW9uIG9mCi0gICAqIGEgY29tcG9uZW50IChmcm9tIHRoZSB1c2VyKSBvY2N1cnMgaWUuIFJldHVybnMgdGhlIGZpbGUgdGhhdCB0aGUgdXNlciBpcwotICAgKiBjdXJyZW50bHkgd29ya2luZyBvbi4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIElGaWxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHdvcmtpbmcgZmlsZS4KLSAgICovCi0gIHByb3RlY3RlZCBJRmlsZSBnZXRDdXJyZW50RmlsZSgpCi0gIHsKLSAgICBpZiAoZWRpdG9yICE9IG51bGwpCi0gICAgewotICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotICAgICAgewotICAgICAgICBJRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSBpbnB1dDsKLSAgICAgICAgcmV0dXJuIGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFRvIGJlIHVzZWQgYnkgc3ViY2xhc3MgaW4gaXRzIHJ1bigpLi4gRGV0ZXJtaW5lcyB0aGUgbWV0YU5hbWUgb2YgdGhlIFhTRAotICAgKiBjb21wb25lbnQgZ2l2ZW4gdG8gdGhpcyBtZXRob2QuCi0gICAqIAotICAgKiBAcGFyYW0gY29tcG9uZW50Ci0gICAqICAgICAgICAgIFRoZSBjb21wb25lbnQgb2Ygd2hpY2ggd2Ugd2FudCB0byBkZXRlcm1pbmUgdGhlIG5hbWUKLSAgICogQHJldHVybgotICAgKi8KLSAgcHJvdGVjdGVkIFF1YWxpZmllZE5hbWUgZGV0ZXJtaW5lTWV0YU5hbWUoWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSA9IG51bGw7Ci0gICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBtZXRhTmFtZSA9IElYU0RTZWFyY2hDb25zdGFudHMuQ09NUExFWF9UWVBFX01FVEFfTkFNRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgbWV0YU5hbWUgPSBJWFNEU2VhcmNoQ29uc3RhbnRzLlNJTVBMRV9UWVBFX01FVEFfTkFNRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIG1ldGFOYW1lID0gSVhTRFNlYXJjaENvbnN0YW50cy5FTEVNRU5UX01FVEFfTkFNRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgbWV0YU5hbWUgPSBJWFNEU2VhcmNoQ29uc3RhbnRzLkdST1VQX01FVEFfTkFNRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIG1ldGFOYW1lID0gSVhTRFNlYXJjaENvbnN0YW50cy5BVFRSSUJVVEVfR1JPVVBfTUVUQV9OQU1FOwotICAgIH0KLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBtZXRhTmFtZSA9IElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX01FVEFfTkFNRTsKLSAgICB9Ci0gICAgcmV0dXJuIG1ldGFOYW1lOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgWFNETmFtZWRDb21wb25lbnQgZ2V0WFNETmFtZWRDb21wb25lbnQoKQotICB7Ci0gICAgaWYgKGVkaXRvciAhPSBudWxsKQotICAgIHsKLSAgICAgIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IChJU2VsZWN0aW9uUHJvdmlkZXIpIGVkaXRvci5nZXRBZGFwdGVyKElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcyk7Ci0gICAgICBJU2VsZWN0aW9uTWFwcGVyIG1hcHBlciA9IChJU2VsZWN0aW9uTWFwcGVyKSBlZGl0b3IuZ2V0QWRhcHRlcihJU2VsZWN0aW9uTWFwcGVyLmNsYXNzKTsKLSAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAobWFwcGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZWxlY3Rpb24gPSBtYXBwZXIubWFwU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICAgIE9iamVjdCBvID0gcy5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICBpZiAobyAhPSBudWxsICYmIG8gaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFhTRE5hbWVkQ29tcG9uZW50KSBvOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBUaGUgZXhwZWN0ZWQgY29tcG9uZW50IHdlIGdldCBmcm9tIHRoZSBlZGl0b3IgZG9lcyBub3QgbWVldAotICAgIC8vIG91ciBleHBlY3RhdGlvbgotICAgIHJldHVybiBudWxsOwotICB9ICAKLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgU3RyaW5nIHBhdHRlcm4gPSAiIjsKLSAgICBYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQgPSBnZXRYU0ROYW1lZENvbXBvbmVudCgpOwotICAgIElGaWxlIGZpbGUgPSBnZXRDdXJyZW50RmlsZSgpOwotICAgIGlmIChmaWxlICE9IG51bGwgJiYgY29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSA9IGRldGVybWluZU1ldGFOYW1lKGNvbXBvbmVudCk7Ci0gICAgICBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKGNvbXBvbmVudC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgY29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICBTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBXb3Jrc3BhY2VTZWFyY2hTY29wZSgpOwotICAgICAgU3RyaW5nIHNjb3BlRGVzY3JpcHRpb24gPSAiV29ya3NwYWNlIjsKLSAgICAgIFhTRFNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5ID0gbmV3IFhTRFNlYXJjaFF1ZXJ5KHBhdHRlcm4sIGZpbGUsIGVsZW1lbnRRTmFtZSwgbWV0YU5hbWUsIFhTRFNlYXJjaFF1ZXJ5LkxJTUlUX1RPX1JFRkVSRU5DRVMsIHNjb3BlLCBzY29wZURlc2NyaXB0aW9uKTsKLSAgICAgIE5ld1NlYXJjaFVJLmFjdGl2YXRlU2VhcmNoUmVzdWx0VmlldygpOwotICAgICAgTmV3U2VhcmNoVUkucnVuUXVlcnlJbkJhY2tncm91bmQoc2VhcmNoUXVlcnkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTRmMjU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuUHJvamVjdFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLlhTRFNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLXB1YmxpYyBjbGFzcyBGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbiBleHRlbmRzIEZpbmRSZWZlcmVuY2VzQWN0aW9uCi17Ci0gIHB1YmxpYyBGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3IpCi0gIHsKLSAgICBzdXBlcihlZGl0b3IpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIFN0cmluZyBwYXR0ZXJuID0gIiI7Ci0gICAgWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50ID0gZ2V0WFNETmFtZWRDb21wb25lbnQoKTsKLSAgICBJRmlsZSBmaWxlID0gZ2V0Q3VycmVudEZpbGUoKTsKLSAgICBpZiAoZmlsZSAhPSBudWxsICYmIGNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIFF1YWxpZmllZE5hbWUgbWV0YU5hbWUgPSBkZXRlcm1pbmVNZXRhTmFtZShjb21wb25lbnQpOwotICAgICAgUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZShjb21wb25lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgICAgSVBhdGggZnVsbFBhdGggPSBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0gICAgICBQcm9qZWN0U2VhcmNoU2NvcGUgc2NvcGUgPSBuZXcgUHJvamVjdFNlYXJjaFNjb3BlKGZ1bGxQYXRoKTsKLSAgICAgIFN0cmluZyBzY29wZURlc2NyaXB0aW9uID0gIlByb2plY3QiOwotICAgICAgWFNEU2VhcmNoUXVlcnkgc2VhcmNoUXVlcnkgPSBuZXcgWFNEU2VhcmNoUXVlcnkocGF0dGVybiwgZmlsZSwgZWxlbWVudFFOYW1lLCBtZXRhTmFtZSwgWFNEU2VhcmNoUXVlcnkuTElNSVRfVE9fUkVGRVJFTkNFUywgc2NvcGUsIHNjb3BlRGVzY3JpcHRpb24pOwotICAgICAgTmV3U2VhcmNoVUkuYWN0aXZhdGVTZWFyY2hSZXN1bHRWaWV3KCk7Ci0gICAgICBOZXdTZWFyY2hVSS5ydW5RdWVyeUluQmFja2dyb3VuZChzZWFyY2hRdWVyeSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNzEwZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklXb3JraW5nU2V0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuV29ya2luZ1NldFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5YU0RTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbiBleHRlbmRzIEZpbmRSZWZlcmVuY2VzQWN0aW9uewotCi0JcHVibGljIEZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uKElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25EZWZpbml0aW9uSWQoU3RyaW5nIHN0cmluZykKLQl7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpewotCQlJV29ya2luZ1NldFtdIHdvcmtpbmdTZXRzID0gcXVlcnlXb3JraW5nU2V0cygpOwotCQlpZiAoIHdvcmtpbmdTZXRzID09IG51bGwgfHwgd29ya2luZ1NldHMubGVuZ3RoID09IDApCi0JCQkvLyBUaGUgdXNlciBjaG9vc2VzIG5vdGhpbmcsIG5vIHBvaW50IHRvIGNvbnRpbnVlLgotCQkJcmV0dXJuOwotCQlTdHJpbmcgcGF0dGVybiA9ICIiOwotCi0JCVhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCA9IGdldFhTRE5hbWVkQ29tcG9uZW50KCk7Ci0JCUlGaWxlIGZpbGUgPSBnZXRDdXJyZW50RmlsZSgpOwotCQlpZiAoIGZpbGUgIT0gbnVsbCAmJiBjb21wb25lbnQgIT0gbnVsbCl7Ci0JCQlRdWFsaWZpZWROYW1lIG1ldGFOYW1lID0gZGV0ZXJtaW5lTWV0YU5hbWUoY29tcG9uZW50KTsKLQotCQkJUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUgPSAKLQkJCQluZXcgUXVhbGlmaWVkTmFtZShjb21wb25lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGNvbXBvbmVudC5nZXROYW1lKCkpOwotCi0JCQkvLyBDcmVhdGUgYSBzY29wZSBmcm9tIHRoZSBzZWxlY3RlZCB3b3JraW5nIHNldHMKLQkJCVdvcmtpbmdTZXRTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBXb3JraW5nU2V0U2VhcmNoU2NvcGUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd29ya2luZ1NldHMubGVuZ3RoOyBpKyspewotCQkJCUlBZGFwdGFibGVbXSBlbGVtZW50cyA9IHdvcmtpbmdTZXRzW2ldLmdldEVsZW1lbnRzKCk7Ci0JCQkJc2NvcGUuYWRkQVdvcmtpbmdTZXRUb1Njb3BlKGVsZW1lbnRzKTsKLQkJCX0KLQotCQkJU3RyaW5nIHNjb3BlRGVzY3JpcHRpb24gPSAiV29ya2luZyBTZXQiOyAgICAKLQkJCVhTRFNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5ID0gCi0JCQkJbmV3IFhTRFNlYXJjaFF1ZXJ5KHBhdHRlcm4sIGZpbGUsIGVsZW1lbnRRTmFtZSwgbWV0YU5hbWUsIFhTRFNlYXJjaFF1ZXJ5LkxJTUlUX1RPX1JFRkVSRU5DRVMsIHNjb3BlLCBzY29wZURlc2NyaXB0aW9uKTsgICAgCi0JCQlOZXdTZWFyY2hVSS5hY3RpdmF0ZVNlYXJjaFJlc3VsdFZpZXcoKTsKLQkJCU5ld1NlYXJjaFVJLnJ1blF1ZXJ5SW5CYWNrZ3JvdW5kKHNlYXJjaFF1ZXJ5KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIGEgZGlhbG9nIGFza2luZyB0aGUgdXNlciB0byBjaG9vc2UgdGhlIHdvcmtpbmcgU2V0cyBoZSB3YW50cwotCSAqIHRvIGRvIHRoZSBzZWFyY2ggb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya2luZ1NldFtdIHF1ZXJ5V29ya2luZ1NldHMoKXsKLQkJU2hlbGwgc2hlbGw9IFhTREVkaXRvclBsdWdpbi5nZXRTaGVsbCgpOwotCQlpZiAoc2hlbGwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJV29ya2luZ1NldFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRXb3JraW5nU2V0TWFuYWdlcigpLmNyZWF0ZVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2coc2hlbGwsIHRydWUpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCUlXb3JraW5nU2V0W10gd29ya2luZ1NldHM9IGRpYWxvZy5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmICh3b3JraW5nU2V0cy5sZW5ndGggPiAwKQotCQkJCXJldHVybiB3b3JraW5nU2V0czsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ltcGxlbWVudG9yc1NlYXJjaEdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ltcGxlbWVudG9yc1NlYXJjaEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZmM4ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9JbXBsZW1lbnRvcnNTZWFyY2hHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotCi0vLyBUT0RPLi4uIGZpbGwgaW4gdGhlIGNvbnRlbnQKLXB1YmxpYyBjbGFzcyBJbXBsZW1lbnRvcnNTZWFyY2hHcm91cAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9PY2N1cnJlbmNlc1NlYXJjaEdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL09jY3VycmVuY2VzU2VhcmNoR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYzZTI0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL09jY3VycmVuY2VzU2VhcmNoR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLQotLy8gVE9ETy4uLiBmaWxsIGluIHRoZSBjb250ZW50Ci1wdWJsaWMgY2xhc3MgT2NjdXJyZW5jZXNTZWFyY2hHcm91cAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9SZWZlcmVuY2VzU2VhcmNoR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvUmVmZXJlbmNlc1NlYXJjaEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OTg0YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9SZWZlcmVuY2VzU2VhcmNoR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guU2VhcmNoTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VzU2VhcmNoR3JvdXAgZXh0ZW5kcyBTZWFyY2hHcm91cCAgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTlVfVEVYVD0gU2VhcmNoTWVzc2FnZXMuZ3JvdXBfcmVmZXJlbmNlczsgCi0KLSAgICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZkVkaXRvcjsKLSAgICBwcml2YXRlIElXb3JrYmVuY2hTaXRlIGZTaXRlOwotICAgIHByaXZhdGUgSUFjdGlvbkJhcnMgZkFjdGlvbkJhcnM7Ci0gICAgCi0vLyAgICBwcml2YXRlIFN0cmluZyBmR3JvdXBJZDsKLSAgICAKLSAgICBwcm90ZWN0ZWQgRmluZEFjdGlvbiBmRmluZFJlZmVyZW5jZXNBY3Rpb247Ci0gICAgcHJvdGVjdGVkIEZpbmRBY3Rpb24gZkZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uOwotICAgIHByb3RlY3RlZCBGaW5kQWN0aW9uIGZGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbjsKLQotCi0gICAgLyoqCi0gICAgICogTm90ZTogVGhpcyBjb25zdHJ1Y3RvciBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgY29uc3RydWN0b3IuCi0gICAgICogQHBhcmFtIGVkaXRvcgotICAgICAqLwotICAgIHB1YmxpYyBSZWZlcmVuY2VzU2VhcmNoR3JvdXAoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoZWRpdG9yKTsKLSAgICAgICAgZkVkaXRvcj0gZWRpdG9yOwotICAgICAgICBmU2l0ZT0gZkVkaXRvci5nZXRTaXRlKCk7Ci0gICAgICAgIAotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0vLyAgICAgIGZHcm91cElkPSBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9GSU5EOwotCi0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0FjdGlvbj0gbmV3IEZpbmRSZWZlcmVuY2VzQWN0aW9uKGZFZGl0b3IpOwotICAgICAgICBmRmluZFJlZmVyZW5jZXNBY3Rpb24uc2V0VGV4dChTZWFyY2hNZXNzYWdlcy5TZWFyY2hfRmluZERlY2xhcmF0aW9uQWN0aW9uX2xhYmVsKTsKLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzQWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZCgiU0VBUkNIX1JFRkVSRU5DRVNfSU5fV09SS1NQQUNFIik7Ci0gICAgICAgIC8vZkVkaXRvci5zZXRBY3Rpb24oIlNlYXJjaFJlZmVyZW5jZXNJbldvcmtzcGFjZSIsIGZGaW5kUmVmZXJlbmNlc0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBmRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb249IG5ldyBGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbihmRWRpdG9yKTsKLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uLnNldFRleHQoU2VhcmNoTWVzc2FnZXMuU2VhcmNoX0ZpbmREZWNsYXJhdGlvbnNJblByb2plY3RBY3Rpb25fbGFiZWwpOyAgICAgICAgCi0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoIlNFQVJDSF9SRUZFUkVOQ0VTX0lOX1BST0pFQ1QiKTsKLSAgICAgICAgLy9mRWRpdG9yLnNldEFjdGlvbigiU2VhcmNoUmVmZXJlbmNlc0luUHJvamVjdCIsIGZGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uPSBuZXcgRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24oZkVkaXRvcik7Ci0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbi5zZXRUZXh0KFNlYXJjaE1lc3NhZ2VzLlNlYXJjaF9GaW5kRGVjbGFyYXRpb25zSW5Xb3JraW5nU2V0QWN0aW9uX2xhYmVsKTsgICAgICAgICAKLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZCgiLlNFQVJDSF9SRUZFUkVOQ0VTX0lOX1dPUktJTkdfU0VUIik7Ci0gICAgICAgIC8vZkVkaXRvci5zZXRBY3Rpb24oIlNlYXJjaFJlZmVyZW5jZXNJbldvcmtpbmdTZXQiLCBmRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24pOyAvLyROT04tTkxTLTEkICAgIAkKLSAgICB9Ci0KLSAgICAvKgotICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckFjdGlvbihTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgYWN0aW9uLnVwZGF0ZShzZWxlY3Rpb24pOwotICAgICAgICBwcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoYWN0aW9uKTsKLSAgICB9Ki8KLQotICAgIC8qKgotICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWVudSBsYWJlbAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIE1FTlVfVEVYVDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZmlsbEFjdGlvbnMoTGlzdCBsaXN0KQotICAgIHsKLSAgICAgIGxpc3QuYWRkKGZGaW5kUmVmZXJlbmNlc0FjdGlvbik7Ci0gICAgICAvL2xpc3QuYWRkKGZGaW5kUmVmZXJlbmNlc0luSGllcmFyY2h5QWN0aW9uKTsKLSAgICAgIGxpc3QuYWRkKGZGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbik7Ci0gICAgICBsaXN0LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgbGlzdC5hZGQoZkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBpbiBBY3Rpb25Hcm91cAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChhY3Rpb25CYXJzKTsKLSAgICAgICAgc3VwZXIuZmlsbEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7Ci0gICAgICAgIGZBY3Rpb25CYXJzPSBhY3Rpb25CYXJzOwotICAgICAgICB1cGRhdGVHbG9iYWxBY3Rpb25IYW5kbGVycygpOwotICAgIH0KLQotICAgIAotLy8gICAgcHJpdmF0ZSB2b2lkIGFkZEFjdGlvbihJQWN0aW9uIGFjdGlvbiwgSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLS8vICAgICAgICBpZiAoYWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0vLyAgICAgICAgICAgIG1hbmFnZXIuYWRkKGFjdGlvbik7Ci0vLyAgICAgICAgfQotLy8gICAgfQotCi0gICAgLyoKLSAgICBwcml2YXRlIHZvaWQgYWRkV29ya2luZ1NldEFjdGlvbihJV29ya2luZ1NldFtdIHdvcmtpbmdTZXRzLCBJTWVudU1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICBGaW5kQWN0aW9uIGFjdGlvbjsKLSAgICAgICAgaWYgKGZFZGl0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIGFjdGlvbj0gbmV3IFdvcmtpbmdTZXRGaW5kQWN0aW9uKGZFZGl0b3IsIG5ldyBGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbihmRWRpdG9yLCB3b3JraW5nU2V0cyksIFNlYXJjaFV0aWwudG9TdHJpbmcod29ya2luZ1NldHMpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYWN0aW9uPSBuZXcgV29ya2luZ1NldEZpbmRBY3Rpb24oZlNpdGUsIG5ldyBGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbihmU2l0ZSwgd29ya2luZ1NldHMpLCBTZWFyY2hVdGlsLnRvU3RyaW5nKHdvcmtpbmdTZXRzKSk7Ci0gICAgICAgIGFjdGlvbi51cGRhdGUoZ2V0Q29udGV4dCgpLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgYWRkQWN0aW9uKGFjdGlvbiwgbWFuYWdlcik7Ci0gICAgfQotICAgICovCi0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBY3Rpb25Hcm91cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgIC8qCi0gICAgICAgIE1lbnVNYW5hZ2VyIGphdmFTZWFyY2hNTT0gbmV3IE1lbnVNYW5hZ2VyKGdldE5hbWUoKSwgSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1NFQVJDSCk7Ci0gICAgICAgIGFkZEFjdGlvbihmRmluZFJlZmVyZW5jZXNBY3Rpb24sIGphdmFTZWFyY2hNTSk7Ci0gICAgICAgIGFkZEFjdGlvbihmRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb24sIGphdmFTZWFyY2hNTSk7Ci0gICAgICAgIGFkZEFjdGlvbihmRmluZFJlZmVyZW5jZXNJbkhpZXJhcmNoeUFjdGlvbiwgamF2YVNlYXJjaE1NKTsKLSAgICAgICAgCi0gICAgICAgIGphdmFTZWFyY2hNTS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXI9IFNlYXJjaFV0aWwuZ2V0TFJVV29ya2luZ1NldHMoKS5zb3J0ZWRJdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGFkZFdvcmtpbmdTZXRBY3Rpb24oKElXb3JraW5nU2V0W10pIGl0ZXIubmV4dCgpLCBqYXZhU2VhcmNoTU0pOwotICAgICAgICB9Ci0gICAgICAgIGFkZEFjdGlvbihmRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24sIGphdmFTZWFyY2hNTSk7Ci0KLSAgICAgICAgaWYgKCFqYXZhU2VhcmNoTU0uaXNFbXB0eSgpKQotICAgICAgICAgICAgbWFuYWdlci5hcHBlbmRUb0dyb3VwKGZHcm91cElkLCBqYXZhU2VhcmNoTU0pOwotICAgICAgICAqLyAgICAKLSAgICB9Ci0gICAgCi0gICAgLyogCi0gICAgICogT3ZlcnJpZGVzIG1ldGhvZCBkZWNsYXJlZCBpbiBBY3Rpb25Hcm91cAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcj0gZlNpdGUuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLSAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRpc3Bvc2VBY3Rpb24oZkZpbmRSZWZlcmVuY2VzQWN0aW9uLCBwcm92aWRlcik7Ci0gICAgICAgICAgICBkaXNwb3NlQWN0aW9uKGZGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbiwgcHJvdmlkZXIpOwotICAgICAgICAgIC8vICBkaXNwb3NlQWN0aW9uKGZGaW5kUmVmZXJlbmNlc0luSGllcmFyY2h5QWN0aW9uLCBwcm92aWRlcik7Ci0gICAgICAgICAgICBkaXNwb3NlQWN0aW9uKGZGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbiwgcHJvdmlkZXIpOwotICAgICAgICB9Ci0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0FjdGlvbj0gbnVsbDsKLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uPSBudWxsOwotICAgICAgICAvL2ZGaW5kUmVmZXJlbmNlc0luSGllcmFyY2h5QWN0aW9uPSBudWxsOwotICAgICAgICBmRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb249IG51bGw7Ci0gICAgICAgIHVwZGF0ZUdsb2JhbEFjdGlvbkhhbmRsZXJzKCk7Ci0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlR2xvYmFsQWN0aW9uSGFuZGxlcnMoKSB7Ci0gICAgICAgIGlmIChmQWN0aW9uQmFycyAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgIGZBY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSmR0QWN0aW9uQ29uc3RhbnRzLkZJTkRfUkVGRVJFTkNFU19JTl9XT1JLU1BBQ0UsIGZGaW5kUmVmZXJlbmNlc0FjdGlvbik7Ci0vLyAgICAgICAgICAgIGZBY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSmR0QWN0aW9uQ29uc3RhbnRzLkZJTkRfUkVGRVJFTkNFU19JTl9QUk9KRUNULCBmRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb24pOwotLy8gICAgICAgICAgICBmQWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEpkdEFjdGlvbkNvbnN0YW50cy5GSU5EX1JFRkVSRU5DRVNfSU5fSElFUkFSQ0hZLCBmRmluZFJlZmVyZW5jZXNJbkhpZXJhcmNoeUFjdGlvbik7Ci0vLyAgICAgICAgICAgIGZBY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSmR0QWN0aW9uQ29uc3RhbnRzLkZJTkRfUkVGRVJFTkNFU19JTl9XT1JLSU5HX1NFVCwgZkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkaXNwb3NlQWN0aW9uKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgYWN0aW9uLCBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgcHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGFjdGlvbik7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvU2VhcmNoR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvU2VhcmNoR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgwNzFiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1NlYXJjaEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoR3JvdXAgZXh0ZW5kcyBBY3Rpb25Hcm91cAotewotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmaWxsQWN0aW9ucyhMaXN0IGxpc3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9YU0RTZWFyY2hBY3Rpb25Hcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9YU0RTZWFyY2hBY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzY4NDZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvWFNEU2VhcmNoQWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uR3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTZWFyY2hBY3Rpb25Hcm91cCBleHRlbmRzIEFjdGlvbkdyb3VwCi17Ci0vLyAgcHJpdmF0ZSBSZWZlcmVuY2VzU2VhcmNoR3JvdXAgZlJlZmVyZW5jZXNHcm91cDsKLS8vICBwcml2YXRlIERlY2xhcmF0aW9uc1NlYXJjaEdyb3VwIGZEZWNsYXJhdGlvbnNHcm91cDsKLS8vICBwcml2YXRlIEltcGxlbWVudG9yc1NlYXJjaEdyb3VwIGZJbXBsZW1lbnRvcnNHcm91cDsKLS8vICBwcml2YXRlIE9jY3VycmVuY2VzU2VhcmNoR3JvdXAgZk9jY3VycmVuY2VzR3JvdXA7Ci0vLyAgcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCi0gIHB1YmxpYyBYU0RTZWFyY2hBY3Rpb25Hcm91cChJRWRpdG9yUGFydCBlZGl0b3IpCi0gIHsKLSAgICBBc3NlcnQuaXNOb3ROdWxsKGVkaXRvcik7Ci0vLyAgICBmRWRpdG9yID0gZWRpdG9yOwotLy8gICAgZlJlZmVyZW5jZXNHcm91cCA9IG5ldyBSZWZlcmVuY2VzU2VhcmNoR3JvdXAoZWRpdG9yKTsKLS8vICAgIGZEZWNsYXJhdGlvbnNHcm91cCA9IG5ldyBEZWNsYXJhdGlvbnNTZWFyY2hHcm91cCgpOwotLy8gICAgZkltcGxlbWVudG9yc0dyb3VwID0gbmV3IEltcGxlbWVudG9yc1NlYXJjaEdyb3VwKCk7Ci0vLyAgICBmT2NjdXJyZW5jZXNHcm91cCA9IG5ldyBPY2N1cnJlbmNlc1NlYXJjaEdyb3VwKCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1hTRFNlYXJjaERlY2xhcmF0aW9uc0dyb3VwQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvWFNEU2VhcmNoRGVjbGFyYXRpb25zR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWM1NWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvWFNEU2VhcmNoRGVjbGFyYXRpb25zR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLQotLy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zLlhTRFNlYXJjaEdyb3VwQWN0aW9uRGVsZWdhdGUKLXB1YmxpYyBjbGFzcyBYU0RTZWFyY2hEZWNsYXJhdGlvbnNHcm91cEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgQmFzZUdyb3VwQWN0aW9uRGVsZWdhdGUKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsTWVudShNZW51IG1lbnUpIHsKLQotICAgIH0gICAgICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1hTRFNlYXJjaEdyb3VwU3ViTWVudS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9YU0RTZWFyY2hHcm91cFN1Yk1lbnUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVjMzU5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1hTRFNlYXJjaEdyb3VwU3ViTWVudS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkNvbXBvdW5kQ29udHJpYnV0aW9uSXRlbTsKLQotLy8gVE9ETyBzaG91bGQgYmUgaW4gY29tbW9uLnVpCi1wdWJsaWMgY2xhc3MgWFNEU2VhcmNoR3JvdXBTdWJNZW51IGV4dGVuZHMgQ29tcG91bmRDb250cmlidXRpb25JdGVtCi17Ci0gIFNlYXJjaEdyb3VwIHNlYXJjaEFjdGlvbkdyb3VwOwotCi0gIHB1YmxpYyBYU0RTZWFyY2hHcm91cFN1Yk1lbnUoU2VhcmNoR3JvdXAgcmVmYWN0b3JNZW51R3JvdXApCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHNlYXJjaEFjdGlvbkdyb3VwID0gcmVmYWN0b3JNZW51R3JvdXA7Ci0gIH0KLQotICBwdWJsaWMgWFNEU2VhcmNoR3JvdXBTdWJNZW51KFN0cmluZyBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJQ29udHJpYnV0aW9uSXRlbVtdIGdldENvbnRyaWJ1dGlvbkl0ZW1zKCkKLSAgewotICAgIEFycmF5TGlzdCBhY3Rpb25zTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBBcnJheUxpc3QgY29udHJpYkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgc2VhcmNoQWN0aW9uR3JvdXAuZmlsbEFjdGlvbnMoYWN0aW9uc0xpc3QpOwotICAgIGlmIChhY3Rpb25zTGlzdCAhPSBudWxsICYmICFhY3Rpb25zTGlzdC5pc0VtcHR5KCkpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aW9uc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIElBY3Rpb24pCi0gICAgICAgIHsgIAotICAgICAgICAgIElBY3Rpb24gYWN0aW9uID0gKElBY3Rpb24pbzsKLSAgICAgICAgICBjb250cmliTGlzdC5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIFNlcGFyYXRvcikKLSAgICAgICAgewotICAgICAgICAgIFNlcGFyYXRvciBzZXBhcmF0b3IgPSAoU2VwYXJhdG9yKW87Ci0gICAgICAgICAgY29udHJpYkxpc3QuYWRkKHNlcGFyYXRvcik7Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgQWN0aW9uIGR1bW15QWN0aW9uID0gbmV3IEFjdGlvbigiWFNEU2VhY2hBY3Rpb25Hcm91cF9ub19yZWZhY3RvcmluZ19hdmFpbGFibGUiKSAvL1RPRE8gd3Jvbmcgc3RyaW5nIGhlcmUgPz8KLSAgICAgIHsKLSAgICAgICAgLy8gZHVtbXkgaW5uZXIgY2xhc3M7IG5vIG1ldGhvZHMKLSAgICAgIH07Ci0gICAgICBkdW1teUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIGNvbnRyaWJMaXN0LmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShkdW1teUFjdGlvbikpOwotICAgIH0KLSAgICByZXR1cm4gKElDb250cmlidXRpb25JdGVtW10pIGNvbnRyaWJMaXN0LnRvQXJyYXkobmV3IElDb250cmlidXRpb25JdGVtW2NvbnRyaWJMaXN0LnNpemUoKV0pOyAgICAgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvWFNEU2VhcmNoUmVmZXJlbmNlc0dyb3VwQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvWFNEU2VhcmNoUmVmZXJlbmNlc0dyb3VwQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5NDdiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1hTRFNlYXJjaFJlZmVyZW5jZXNHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLQotLy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zLlhTRFNlYXJjaEdyb3VwQWN0aW9uRGVsZWdhdGUKLXB1YmxpYyBjbGFzcyBYU0RTZWFyY2hSZWZlcmVuY2VzR3JvdXBBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEJhc2VHcm91cEFjdGlvbkRlbGVnYXRlCi17Ci0gICAgcHJvdGVjdGVkIHZvaWQgZmlsbE1lbnUoTWVudSBtZW51KSB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKGZTZWxlY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3b3JrYmVuY2hQYXJ0ICE9IG51bGwpCi0gICAgICAgIHsKLQkJICBJV29ya2JlbmNoUGFydFNpdGUgc2l0ZSA9IHdvcmtiZW5jaFBhcnQuZ2V0U2l0ZSgpOwotCQkJaWYgKHNpdGUgPT0gbnVsbCkKLQkJCSAgcmV0dXJuOwotCQotCQkgIElFZGl0b3JQYXJ0IGVkaXRvciA9IHNpdGUuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgIGlmICggZWRpdG9yICE9IG51bGwgKXsKLSAgICAgICAgICAgIFJlZmVyZW5jZXNTZWFyY2hHcm91cCByZWZlcmVuY2VzR3JvdXAgPSBuZXcgUmVmZXJlbmNlc1NlYXJjaEdyb3VwKGVkaXRvcik7Ci0gICAgICAgICAgICBYU0RTZWFyY2hHcm91cFN1Yk1lbnUgc3ViTWVudSA9IG5ldyBYU0RTZWFyY2hHcm91cFN1Yk1lbnUocmVmZXJlbmNlc0dyb3VwKTsKLSAgICAgICAgICAgIHN1Yk1lbnUuZmlsbChtZW51LCAtMSk7Ci0gICAgICAgICAgfQotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDU0NWVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcwOTg0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwNGUxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNUdWUgTWF5IDE5IDAzOjEyOjE2IEVEVCAyMDA5Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMTc2MDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVHVlIE1heSAxOSAwMzoxMjoxNyBFRFQgMjAwOQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGIyOTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLAotIG9yZy5lY2xpcHNlLmhlbHAudWkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzL01FVEEtSU5GL2VjbGlwc2UuaW5mIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvTUVUQS1JTkYvZWNsaXBzZS5pbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3OGUyZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvTUVUQS1JTkYvZWNsaXBzZS5pbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgV2UgZG8gbm90IHdhbnQgY2FwYWJpbGl0eSBqYXJzIHBhY2syMDAnZCAodGhleSBhcmUgdGlueSwgbm8gamF2YSwgYW5kIGZldGNoZWQgZWFzaWVyIGFzIGphcnMpCi1qYXJwcm9jZXNzb3IuZXhjbHVkZS5wYWNrPXRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy9PU0dJLUlORi9sMTBuL2J1bmRsZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvT1NHSS1JTkYvbDEwbi9idW5kbGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4NmE2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy9PU0dJLUlORi9sMTBuL2J1bmRsZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMKLUJ1bmRsZS1OYW1lLjAgPSBKYXZhU2NyaXB0IENhcGFiaWxpdGllcwotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLWFjdGl2aXR5LmphdmFzY3JpcHQgICAgICAgICAgICAgPSBKYXZhU2NyaXB0IERldmVsb3BtZW50Ci1hY3Rpdml0eS5qYXZhc2NyaXB0LmRlc2MgICAgICAgID0gRGV2ZWxvcCBKYXZhU2NyaXB0IGFwcGxpY2F0aW9ucy4gCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjZWMwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwOTwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExOTdhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBPU0dJLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBPU0dJLUlORi9sMTBuLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5Y2UzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC5qYXZhc2NyaXB0LmNhcGFiaWxpdGllcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcyI+Ci0gICAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgbmFtZT0iJWFjdGl2aXR5LmphdmFzY3JpcHQiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWFjdGl2aXR5LmphdmFzY3JpcHQuZGVzYyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53dHAuamF2YXNjcmlwdC5jYXBhYmlsaXRpZXMiPgotICAgICAgICA8L2FjdGl2aXR5PgotICAgICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2Uud3RwLmphdmFzY3JpcHQuY2FwYWJpbGl0aWVzIgotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC53c3RcLmpzZHRcLltcLlx3L10qIj4KLSAgICAgICAgPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotCi0gICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA4ZWE5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGYwMGExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVHVlIE1heSAxOSAxMDoyOToyMCBFRFQgMjAwOQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmZGNkMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLAotIG9yZy5lY2xpcHNlLmhlbHAudWkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMvTUVUQS1JTkYvZWNsaXBzZS5pbmYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzL01FVEEtSU5GL2VjbGlwc2UuaW5mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzhlMmYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMvTUVUQS1JTkYvZWNsaXBzZS5pbmYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgV2UgZG8gbm90IHdhbnQgY2FwYWJpbGl0eSBqYXJzIHBhY2syMDAnZCAodGhleSBhcmUgdGlueSwgbm8gamF2YSwgYW5kIGZldGNoZWQgZWFzaWVyIGFzIGphcnMpCi1qYXJwcm9jZXNzb3IuZXhjbHVkZS5wYWNrPXRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzL09TR0ktSU5GL2wxMG4vYnVuZGxlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzL09TR0ktSU5GL2wxMG4vYnVuZGxlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNWM1NTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcy9PU0dJLUlORi9sMTBuL2J1bmRsZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcwotQnVuZGxlLU5hbWUuMCA9IFdlYiBDYXBhYmlsaXRpZXMKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi1hY3Rpdml0eS53ZWIgICAgICAgICAgICAgPSBXZWIgRGV2ZWxvcG1lbnQKLWFjdGl2aXR5LndlYi5kZXNjICAgICAgICA9IERldmVsb3AgV2ViIGFwcGxpY2F0aW9ucy4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjZWMwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA5PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VmMDg0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBPU0dJLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBPU0dJLUlORi9sMTBuLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NWFkN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gIAotCi0gICA8IS0tIFdlYiBDYXBhYmlsaXR5IERlZmluaXRpb24tLT4KLSAgIDwhLS0gVGhlIFdlYiBjYXBhYmlsaXR5IHJlcXVpcmVzIHRoZSBYTUwgY2FwYWJpbGl0eS4KLSAgICAgIAlUaGUgWE1MIGNhcGFiaWxpdHkgaXMgY3VycmVudGx5IHNlcnZpbmcgYXMgdGhlCi0gICAgICAJZGVmYXVsdCBXVFAgY2FwYWJpbGl0eS4gKFNlZSB0aGUgY29tbWVudHMgb24gdGhlCi0gICAgICAJWE1MIGNhcGFiaWxpdHkuKQotICAgIC0tPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcyI+Ci0gICAgICAJCi0gIAk8YWN0aXZpdHkKLSAgICAgICAgICAgIG5hbWU9IiVhY3Rpdml0eS53ZWIiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWFjdGl2aXR5LndlYi5kZXNjIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzIj4KLSAgICAgCTwvYWN0aXZpdHk+Ci0gICAgIAkKLSAgICAgIAk8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2Uud3RwLndlYi5jYXBhYmlsaXRpZXMiCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLndzdFwuY3NzXC5bXC5cdy9dKiI+Ci0gICAgICAJPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotICAgICAgCQotICAgICAgCTxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcyIKLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuZWNsaXBzZVwud3N0XC5odG1sXC5bXC5cdy9dKiI+Ci0gICAgICAJPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotICAgICAgCQotICAgICAgCTxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcyIKLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuZWNsaXBzZVwud3N0XC5qYXZhc2NyaXB0XC5bXC5cdy9dKiI+Ci0gICAgICAJPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotICAgICAgCQotICAgICAgCTxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcyIKLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuZWNsaXBzZVwud3N0XC5zZXJ2ZXJcLltcLlx3L10qIj4KLSAgICAgIAk8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+Ci0gICAgICAJCi0gICAgICAJPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnd0cC53ZWIuY2FwYWJpbGl0aWVzIgotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC53c3RcLmludGVybmV0XC5tb25pdG9yXC5bXC5cdy9dKiI+Ci0gICAgICAJPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotICAgICAgCQotICAgICAgCTxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS53dHAud2ViLmNhcGFiaWxpdGllcyIKLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuZWNsaXBzZVwud3N0XC53ZWJcLltcLlx3L10qIj4KLSAgICAgIAk8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+Ci0gICAgICAJCi0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQxZTQxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjc2MGUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVHVlIE1heSAxOSAwOTo0OTo0NSBFRFQgMjAwOQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ2NDY5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UuaGVscC51aQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcy9NRVRBLUlORi9lY2xpcHNlLmluZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMvTUVUQS1JTkYvZWNsaXBzZS5pbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3OGUyZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcy9NRVRBLUlORi9lY2xpcHNlLmluZgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBXZSBkbyBub3Qgd2FudCBjYXBhYmlsaXR5IGphcnMgcGFjazIwMCdkICh0aGV5IGFyZSB0aW55LCBubyBqYXZhLCBhbmQgZmV0Y2hlZCBlYXNpZXIgYXMgamFycykKLWphcnByb2Nlc3Nvci5leGNsdWRlLnBhY2s9dHJ1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMvT1NHSS1JTkYvbDEwbi9idW5kbGUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMvT1NHSS1JTkYvbDEwbi9idW5kbGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRiODg3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzL09TR0ktSU5GL2wxMG4vYnVuZGxlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSNQcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzCi1CdW5kbGUtTmFtZS4wID0gWE1MIENhcGFiaWxpdGllcwotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLWFjdGl2aXR5LnhtbCAgICAgICAgICAgICA9IFhNTCBEZXZlbG9wbWVudAotYWN0aXZpdHkueG1sLmRlc2MgICAgICAgID0gRGV2ZWxvcCBYTUwgYXBwbGljYXRpb25zLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWNlYzBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDk8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWYwODRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIE9TR0ktSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE9TR0ktSU5GL2wxMG4vLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNlZWQyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgICA8IS0tCi0gICAgICAgIFhNTCBDYXBhYmlsaXR5IERlZmluaXRpb24gVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIGFyZQotICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIFhNTCBhY3Rpdml0eSBhcyB0aGV5IGFyZSByZXF1aXJlZCBieSBYTUwgYW5kCi0gICAgICAgIG90aGVyIGNvbXBvbmVudHMgYW5kIFhNTCBpcyBjdXJyZW50bHkgc2VydmluZyBhcyB0aGUgYmFzZSBXVFAKLSAgICAgICAgY29tcG9uZW50LiBjb21tb24gc3NlIHZhbGlkYXRpb24KLSAgICAtLT4KLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzIj4KLSAgICAgICAgPGFjdGl2aXR5Ci0gICAgICAgICAgICBuYW1lPSIlYWN0aXZpdHkueG1sIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVhY3Rpdml0eS54bWwuZGVzYyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcyI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0gICAgICAgIDxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcyIKLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuZWNsaXBzZVwud3N0XC54bWxcLltcLlx3L10qIj4KLSAgICAgICAgPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotICAgICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMiCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLndzdFwueHNkXC5bXC5cdy9dKiI+Ci0gICAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4KLSAgICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzIgotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC53c3RcLmR0ZFwuW1wuXHcvXSoiPgotICAgICAgICA8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+Ci0gICAgICAgIDxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcyIKLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuYXBhY2hlXC54ZXJjZXNcLltcLlx3L10qIj4KLSAgICAgICAgPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotICAgICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2Uud3RwLnhtbC5jYXBhYmlsaXRpZXMiCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLndzdFwuY29tbW9uXC5bXC5cdy9dKiI+Ci0gICAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4KLSAgICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzIgotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC53c3RcLnNzZVwuW1wuXHcvXSoiPgotICAgICAgICA8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+Ci0gICAgICAgIDxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcyIKLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuZWNsaXBzZVwud3N0XC52YWxpZGF0aW9uXC5bXC5cdy9dKiI+Ci0gICAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4KLSAgICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnd0cC54bWwuY2FwYWJpbGl0aWVzIgotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC53c3RcLmludGVybmV0XC5jYWNoZVwuW1wuXHcvXSoiPgotICAgICAgICA8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+Ci0gICAgICAgIDxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS53dHAueG1sLmNhcGFiaWxpdGllcyIKLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuZWNsaXBzZVwud3N0XC5pbnRlcm5ldFwucHJveHlcLltcLlx3L10qIj4KLSAgICAgICAgPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotICAgICAgIAotICAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLmNsYXNzcGF0aCBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYjMzNTMuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiIGtpbmQ9ImNvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uY3ZzaWdub3JlIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZjOWNiMC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotc3NlanVuaXQuamFyCi10ZW1wLmZvbGRlcgpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnByb2plY3QgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmNTEwOS4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkOGI1Yy4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFjNjUuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNDk1OC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkNDY3OS4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0czsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC43LjAKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLm1pbm9ydG9vbHMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IjMuOC4wIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy50ZXN0cy5lbmNvZGluZztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGVzdHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudGVzdHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRlc3RzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnRlc3RzLmVuY29kaW5nO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlc3RzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlc3RzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnRlc3RzLmVuY29kaW5nO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnZhbGlkYXRpb24udGVzdHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWk7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGVzdHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC50ZXN0cy5lbmNvZGluZztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlc3RzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLnRlc3RzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC54c2wudGVzdHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5jb21waWxlcjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnRlc3RzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLnRlc3RzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40Ci1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL1NTRSBNYXN0ZXIgTGlzdCBUZXN0IFN1aXRlLmxhdW5jaCBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL1NTRSBNYXN0ZXIgTGlzdCBUZXN0IFN1aXRlLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc5ZTQ1Mi4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9TU0UgTWFzdGVyIExpc3QgVGVzdCBTdWl0ZS5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkp1bml0TGF1bmNoQ29uZmlnIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXBwZW5kLmFyZ3MiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFza2NsZWFyIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljQWRkIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJ3cyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJ3c2xvZyIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZS9wZGUtanVuaXQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iZGVmYXVsdCIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iaW5jbHVkZU9wdGlvbmFsIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImxvY2F0aW9uIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jfS8uLi9qdW5pdC13b3Jrc3BhY2UiLz4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfUEFUSFMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iL29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9NYXN0ZXJMaXN0VGVzdFN1aXRlLmphdmEiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfVFlQRVMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iMSIvPgotPC9saXN0QXR0cmlidXRlPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5mYXZvcml0ZUdyb3VwcyI+Ci08bGlzdEVudHJ5IHZhbHVlPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hHcm91cC5ydW4iLz4KLTxsaXN0RW50cnkgdmFsdWU9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaEdyb3VwLmRlYnVnIi8+Ci08L2xpc3RBdHRyaWJ1dGU+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LkNPTlRBSU5FUiIgdmFsdWU9IiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuS0VFUFJVTk5JTkdfQVRUUiIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LlRFU1ROQU1FIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LlRFU1RfS0lORCIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5sb2FkZXIuanVuaXQzIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuTUFJTl9UWVBFIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMuTWFzdGVyTGlzdFRlc3RTdWl0ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPR1JBTV9BUkdVTUVOVFMiIHZhbHVlPSItb3MgJHt0YXJnZXQub3N9IC13cyAke3RhcmdldC53c30gLWFyY2ggJHt0YXJnZXQuYXJjaH0gLW5sICR7dGFyZ2V0Lm5sfSAtc2hvd0xvY2F0aW9uIC1jb25zb2xlTG9nIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9KRUNUX0FUVFIiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUudWkud29ya2JlbmNoQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlZNX0FSR1VNRU5UUyIgdmFsdWU9Ii1YbXMxMDBNIC1YbXg2MDBNIC1YWDpNYXhQZXJtU2l6ZT0xOTJNIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icGRlLnZlcnNpb24iIHZhbHVlPSIzLjMiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwcm9kdWN0IiB2YWx1ZT0ib3JnLmVjbGlwc2Uuc2RrLmlkZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJydW5faW5fdWlfdGhyZWFkIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJzaG93X3NlbGVjdGVkX29ubHkiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ0cmFjaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlRGVmYXVsdENvbmZpZyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlRGVmYXVsdENvbmZpZ0FyZWEiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZVByb2R1Y3QiIHZhbHVlPSJ0cnVlIi8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRlMTQ1NC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvaWNvbnMvc291cmNlRWRpdG9yLmdpZiBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL2ljb25zL3NvdXJjZUVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWJkYjguLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvaWNvbnMvc291cmNlRWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDM3MGIuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1YTUxfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWU9WE1MIFNvdXJjZSBQYWdlIEVkaXRvcgotSmF2YVNjcmlwdF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZT1KYXZhU2NyaXB0IFNvdXJjZSBQYWdlIEVkaXRvcgotCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotQnVuZGxlLU5hbWUuMCA9IFVuaXQgVGVzdHMKLWFkZGl0aW9uYWxUZXN0cz1BZGRpdGlvbmFsIFRlc3RDYXNlcyBhbmQgVGVzdFN1aXRlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3BsdWdpbi54bWwgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGQ0OTE3Li4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgICAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0gICAgICAgICAgICAgICAgPGVkaXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iJVhNTF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIGljb249Imljb25zL3NvdXJjZUVkaXRvci5naWYiCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uQ29udHJpYnV0b3JYTUwiCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbGljRm9udE5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRlbnRUeXBlQmluZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRlbnRUeXBlQmluZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotICAgICAgICAgICAgICAgIDwvZWRpdG9yPgotICAgICAgICA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24tcG9pbnQgaWQ9ImFkZGl0aW9uYWxUZXN0cyIgbmFtZT0iJWFkZGl0aW9uYWxUZXN0cyIgc2NoZW1hPSJzY2hlbWEvYWRkaXRpb25hbFRlc3RzLmV4c2QiLz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zY2hlbWEvYWRkaXRpb25hbFRlc3RzLmV4c2QgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zY2hlbWEvYWRkaXRpb25hbFRlc3RzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZTU4OTMuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc2NoZW1hL2FkZGl0aW9uYWxUZXN0cy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cyIgaWQ9ImFkZGl0aW9uYWxUZXN0cyIgbmFtZT0iJWFkZGl0aW9uYWxUZXN0cyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyBhIHdheSB0byBhZGQgZXh0cmEgdGVzdCBjYXNlcyBhbmQgc3VpdGVzIHRvIHRoZSBhbHJlYWR5IHJ1bm5pbmcgbGlzdCB3aXRob3V0IGRlY2xhcmluZyBhIHJ1bnRpbWUgZGVwZW5kZW5jeSBpbiB0aGlzIHBsdWctaW4uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ0ZXN0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InN1aXRlIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ0ZXN0Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBZGRzIGFuIGluZGl2aWR1YWwgVGVzdCBjYXNlIHRvIHJ1bi4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIFRlc3QgY2xhc3MgbmFtZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Imp1bml0LmZyYW1ld29yay5UZXN0OiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzdWl0ZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQWRkcyBhIFRlc3RTdWl0ZSB0byBydW4uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBUZXN0U3VpdGUgY2xhc3MgbmFtZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Imp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU6Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvTWFzdGVyTGlzdFRlc3RTdWl0ZS5qYXZhIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL01hc3Rlckxpc3RUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNjYWZiNC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvTWFzdGVyTGlzdFRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlCi0gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2gKLSAqIGFjY29tcGFuaWVzICB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRlc3RzLkpTUENvcmVUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC50ZXN0cy5lbmNvZGluZy5KU1BFbmNvZGluZ1Rlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlc3RzLkpTUFVJVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXN0cy5DU1NDb3JlVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudGVzdHMuZW5jb2RpbmcuQ1NTRW5jb2RpbmdUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS50ZXN0cy5DU1NVSVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudGVzdHMuRFREQ29yZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnRlc3RzLkRURFVJVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGVzdHMuSFRNTENvcmVUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudGVzdHMuZW5jb2RpbmcuSFRNTEVuY29kaW5nVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlc3RzLkhUTUxVSVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLlJ1bkpTRFRDb3JlVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5jb21waWxlci5KU0RUQ29tcGlsZXJUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS50ZXN0cy5KU0RUVUlUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS50ZXN0cy5BbGxXZWJDb3JlVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnRlc3RzLkFsbFdlYlVJVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRlc3RzLlNTRU1vZGVsVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVzdHMuU1NFVUlUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRlc3RzLlNTRU1vZGVsWE1MVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudGVzdHMuZW5jb2RpbmcuRW5jb2RpbmdUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS50ZXN0cy5YTUxVSVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24udGVzdHMuaW50ZXJuYWwuQWxsWE1MVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnRlc3RzLmludGVybmFsLkFsbFhTRENvcmVUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnZhbGlkYXRpb24udGVzdHMuaW50ZXJuYWwuQWxsWFNEVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC50ZXN0cy5BbGxUZXN0c1N1aXRlOwotCi1wdWJsaWMgY2xhc3MgTWFzdGVyTGlzdFRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTID0gImNsYXNzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLmFkZGl0aW9uYWxUZXN0cyI7Ci0KLQlwdWJsaWMgTWFzdGVyTGlzdFRlc3RTdWl0ZSgpIHsKLQkJc3VwZXIoIldUUCBTb3VyY2UgRWRpdGluZyBNYXN0ZXIgTGlzdCBUZXN0IFN1aXRlIik7Ci0KLQkJU3lzdGVtLnNldFByb3BlcnR5KCJ3dHAuYXV0b3Rlc3Qubm9uaW50ZXJhY3RpdmUiLCAidHJ1ZSIpOwotCi0JCWFkZFRlc3QoU1NFTW9kZWxUZXN0U3VpdGUuc3VpdGUoKSk7Ci0KLQkJYWRkVGVzdChTU0VNb2RlbFhNTFRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChEVERDb3JlVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KEFsbFhTRENvcmVUZXN0cy5zdWl0ZSgpKTsKLQkJYWRkVGVzdChDU1NDb3JlVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KEhUTUxDb3JlVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KEpTUENvcmVUZXN0U3VpdGUuc3VpdGUoKSk7Ci0KLQkJYWRkVGVzdChFbmNvZGluZ1Rlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChDU1NFbmNvZGluZ1Rlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChIVE1MRW5jb2RpbmdUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoSlNQRW5jb2RpbmdUZXN0U3VpdGUuc3VpdGUoKSk7Ci0KLQkJYWRkVGVzdChBbGxYTUxUZXN0cy5zdWl0ZSgpKTsKLQkJYWRkVGVzdChBbGxYU0RUZXN0cy5zdWl0ZSgpKTsKLQotCQlhZGRUZXN0KFNTRVVJVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KFhNTFVJVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KERURFVJVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KENTU1VJVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KEhUTUxVSVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChKU1BVSVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJCi0JCWFkZFRlc3QoUnVuSlNEVENvcmVUZXN0cy5zdWl0ZSgpKTsKLQkJYWRkVGVzdChKU0RUQ29tcGlsZXJUZXN0cy5zdWl0ZSgpKTsKLQkJYWRkVGVzdChKU0RUVUlUZXN0cy5zdWl0ZSgpKTsKLQkJYWRkVGVzdChBbGxXZWJDb3JlVGVzdHMuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoQWxsV2ViVUlUZXN0cy5zdWl0ZSgpKTsKLQkJCi0KLQkJYWRkVGVzdChuZXcgQWxsVGVzdHNTdWl0ZSgpKTsKLQkJCi0JCS8vIGFkZFRlc3QoUmVncmVzc2lvbkJ1Y2tldC5zdWl0ZSgpKTsKLQkJLy8gYWRkVGVzdChBbGxUZXN0Q2FzZXMuc3VpdGUoKSk7Ci0KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZWxlbWVudHNbaV0uZ2V0TmFtZSgpLmVxdWFscygic3VpdGUiKSkgewotCQkJCVRlc3RTdWl0ZSBzdWl0ZTsKLQkJCQl0cnkgewotCQkJCQlzdWl0ZSA9IChUZXN0U3VpdGUpIGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQ0xBU1MpOwotCQkJCQlhZGRUZXN0U3VpdGUoc3VpdGUuZ2V0Q2xhc3MoKSk7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQWRkaW5nIFRlc3RTdWl0ZSAiICsgc3VpdGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCQkJCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cyIpKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZWxlbWVudHNbaV0uZ2V0TmFtZSgpLmVxdWFscygidGVzdCIpKSB7Ci0JCQkJVGVzdCB0ZXN0OwotCQkJCXRyeSB7Ci0JCQkJCXRlc3QgPSAoVGVzdCkgZWxlbWVudHNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihDTEFTUyk7Ci0JCQkJCWFkZFRlc3RTdWl0ZSh0ZXN0LmdldENsYXNzKCkpOwotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkFkZGluZyBUZXN0Q2FzZSAiICsgdGVzdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0JCQkJCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzIikpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsKCkgewotCQkvLyB0aGlzIG1ldGhvZCBuZWVkcyB0byBleGlzdCwgYnV0IGRvZXNuJ3QgcmVhbGx5IGRvIGFueXRoaW5nCi0JCS8vIG90aGVyIHRoYW4gdG8gc2lnbmFsIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotCQkvLyBUaGUgcmVzdCBpdCBhdXRvbWF0aWMgZnJvbSB0aGUgdGVzdHMgYWRkZWQgaW4gY29uc3RydWN0b3IuCi0JfQotfQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL1Rlc3RUdXJraXNoLmphdmEgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvVGVzdFR1cmtpc2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5YzU0NC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvVGVzdFR1cmtpc2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiBUZXN0VHVya2lzaAotICogU2VlIGh0dHA6Ly93d3cuaTE4bmd1eS5jb20vdW5pY29kZS90dXJraXNoLWkxOG4uaHRtbAotICovCi0KLXB1YmxpYyBjbGFzcyBUZXN0VHVya2lzaCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTdHJpbmcgdHVya2lzaExvd2VyQ2FzZSA9ICJcdTAxMzEiICsgIlx1MDA2OSI7Ci0JCVN0cmluZyB0dXJraXNoVXBwZXJDYXNlID0gIlx1MDEzMCIgKyAiXHUwMDQ5IjsKLQkJTG9jYWxlW10gbG9jYWxlcyA9IExvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxlcy5sZW5ndGg7IGkrKykgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGxvY2FsZXNbaV0pOwotCQl9Ci0JCUxvY2FsZSB0dXJraXNoTG9jYWxlID0gbmV3IExvY2FsZSgiVFIiKTsKLQkJU3RyaW5nIHRlc3RVcHBlcmNhc2UgPSB0dXJraXNoTG93ZXJDYXNlLnRvVXBwZXJDYXNlKHR1cmtpc2hMb2NhbGUpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4odHVya2lzaFVwcGVyQ2FzZS5lcXVhbHModGVzdFVwcGVyY2FzZSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9taW5vcnRvb2xzL1Rlc3RTdHJpbmcuamF2YSBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9taW5vcnRvb2xzL1Rlc3RTdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4ZmM0Ni4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9UZXN0U3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy5taW5vcnRvb2xzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogVGVzdFN0cmluZwotICovCi0KLXB1YmxpYyBjbGFzcyBUZXN0U3RyaW5nIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQotCi0JCVN0cmluZyB4bWwgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLTE2XCI/PjxtZXNzYWdlPjxzb3VyY2VVcmk+PC9zb3VyY2VVcmk+PGJvZHk+PC9ib2R5PjwvbWVzc2FnZT4iOwotCi0KLQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQlmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKGZhbHNlKTsKLQkJZmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCURvY3VtZW50IGRvY3VtZW50ID0gYnVpbGRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcih4bWwpKSk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnQoZG9jdW1lbnQuaGFzQ2hpbGROb2RlcygpKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihkb2N1bWVudCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQljYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL21pbm9ydG9vbHMvVGVzdFN0cmluZ1V0aWxzLmphdmEgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9UZXN0U3RyaW5nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyZTIzOC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9UZXN0U3RyaW5nVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy5taW5vcnRvb2xzOwotCi0KLQotcHVibGljIGNsYXNzIFRlc3RTdHJpbmdVdGlscyB7Ci0KLQkvKioKLQkgKiBUZXN0U3RyaW5nVXRpbHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRlc3RTdHJpbmdVdGlscygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIG1hdGNoaW5nIGxpdGVyYWwgcG9ydGlvbnMgb2YgYSBzdHJpbmcgd2l0aCBhbm90aGVyIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIGFTdHJpbmcsIFN0cmluZyBzb3VyY2UsIFN0cmluZyB0YXJnZXQpIHsKLQkJaWYgKGFTdHJpbmcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgbm9ybWFsU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGxlbmd0aCA9IGFTdHJpbmcubGVuZ3RoKCk7Ci0JCWludCBwb3NpdGlvbiA9IDA7Ci0JCWludCBwcmV2aW91cyA9IDA7Ci0JCWludCBzcGFjZXIgPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCXdoaWxlIChwb3NpdGlvbiArIHNwYWNlciAtIDEgPCBsZW5ndGggJiYgYVN0cmluZy5pbmRleE9mKHNvdXJjZSwgcG9zaXRpb24pID4gLTEpIHsKLQkJCXBvc2l0aW9uID0gYVN0cmluZy5pbmRleE9mKHNvdXJjZSwgcHJldmlvdXMpOwotCQkJbm9ybWFsU3RyaW5nID0gbm9ybWFsU3RyaW5nICsgYVN0cmluZy5zdWJzdHJpbmcocHJldmlvdXMsIHBvc2l0aW9uKSArIHRhcmdldDsKLQkJCXBvc2l0aW9uICs9IHNwYWNlcjsKLQkJCXByZXZpb3VzID0gcG9zaXRpb247Ci0JCX0KLQkJbm9ybWFsU3RyaW5nID0gbm9ybWFsU3RyaW5nICsgYVN0cmluZy5zdWJzdHJpbmcocG9zaXRpb24sIGFTdHJpbmcubGVuZ3RoKCkpOwotCi0JCXJldHVybiBub3JtYWxTdHJpbmc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9WZXJzaW9uUmVtb3Zlci5qYXZhIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL21pbm9ydG9vbHMvVmVyc2lvblJlbW92ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlZDljNS4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9WZXJzaW9uUmVtb3Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy5taW5vcnRvb2xzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRlc3RzLnV0aWwuQ29tbW9uWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBNb2RpZmllcyBwbHVnaW4ueG1sIGFuZCBmcmFnbWVudC54bWwgZmlsZXMgdG8gbm90IHJlcXVpcmUgc3BlY2lmaWMgdmVyc2lvbnMKLSAqIG9mIHRoZWlyIHBsdWdpbiBkZXBlbmRlbmNpZXMuCi0gKiAKLSAqIEBhdXRob3Igbml0aW4KLSAqLwotcHVibGljIGNsYXNzIFZlcnNpb25SZW1vdmVyIHsKLQotCWNoYXJbXSBjaGFyYnVmZiA9IG5ldyBjaGFyWzIwNDhdOwotCVN0cmluZ0J1ZmZlciBzID0gbnVsbDsKLQotCXB1YmxpYyBWZXJzaW9uUmVtb3ZlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpZiAoYXJncy5sZW5ndGggPCAxKQotCQkJbmV3IFZlcnNpb25SZW1vdmVyKCkudmlzaXQobmV3IEZpbGUoImQ6L3RhcmdldCIpKTsKLQkJZWxzZQotCQkJbmV3IFZlcnNpb25SZW1vdmVyKCkudmlzaXQobmV3IEZpbGUoYXJnc1swXSkpOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdChGaWxlIGZpbGUpIHsKLQkJLy8gU2tpcCBkaXJlY3RvcmllcyBsaWtlIG9yZy5lY2xpcHNlLiosIG9yZy5hcGFjaGUuKiwgYW5kIG9yZy5qdW5pdC4qCi0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkgJiYgIWZpbGUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIm9yZy5lY2xpcHNlLiIpICYmICFmaWxlLmdldE5hbWUoKS5zdGFydHNXaXRoKCJvcmcuYXBhY2hlIikgJiYgIWZpbGUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIm9yZy5qdW5pdCIpKSB7Ci0JCQlTdHJpbmdbXSBjb250ZW50cyA9IGZpbGUubGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50cy5sZW5ndGg7IGkrKykKLQkJCQl2aXNpdChuZXcgRmlsZShmaWxlLmdldEFic29sdXRlUGF0aCgpICsgJy8nICsgY29udGVudHNbaV0pKTsKLQkJfQotCQllbHNlIHsKLQkJCWZpeHVwRmlsZShmaWxlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpeHVwRmlsZShGaWxlIGZpbGUpIHsKLQkJLy8gb25seSBsb2FkIGFuZCBmaXh1cCBmaWxlcyBuYW1lZCBwbHVnaW4ueG1sIG9yIGZyYWdtZW50LnhtbCB1bmRlciBlY2xpcHNlXHBsdWdpbnNcWFhYWFhYWC4qCi0JCWlmICghKGZpbGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoInBsdWdpbi54bWwiKSB8fCBmaWxlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJmcmFnbWVudC54bWwiKSkgfHwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5pbmRleE9mKCJlY2xpcHNlXFxwbHVnaW5zXFxYWFhYWFhYLiIpID09IC0xKQotCQkJcmV0dXJuOwotCQkvLwkJU3lzdGVtLm91dC5wcmludGxuKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl0cnkgewotCQkJRG9jdW1lbnQgZG9jID0gQ29tbW9uWE1MLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKGZpbGUpOwotCQkJTm9kZUxpc3QgaW1wb3J0cyA9IG51bGw7Ci0JCQlpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgicGx1Z2luLnhtbCIpKQotCQkJCWltcG9ydHMgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImltcG9ydCIpOwotCQkJZWxzZSBpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiZnJhZ21lbnQueG1sIikpCi0JCQkJaW1wb3J0cyA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZnJhZ21lbnQiKTsKLQkJCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlOb2RlIGltcG9ydE5vZGUgPSBpbXBvcnRzLml0ZW0oaSk7Ci0JCQkJaWYgKGltcG9ydE5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJpbXBvcnQiKSAmJiBpbXBvcnROb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oInZlcnNpb24iKSAhPSBudWxsKSB7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQlpbXBvcnROb2RlLmdldEF0dHJpYnV0ZXMoKS5yZW1vdmVOYW1lZEl0ZW0oInZlcnNpb24iKTsKLQkJCQl9Ci0JCQkJaWYgKGltcG9ydE5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbSgicGx1Z2luLXZlcnNpb24iKSAhPSBudWxsKSB7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQlpbXBvcnROb2RlLmdldEF0dHJpYnV0ZXMoKS5yZW1vdmVOYW1lZEl0ZW0oInBsdWdpbi12ZXJzaW9uIik7Ci0JCQkJfQotCQkJCWlmIChpbXBvcnROb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oIm1hdGNoIikgIT0gbnVsbCkgewotCQkJCQlpbXBvcnROb2RlLmdldEF0dHJpYnV0ZXMoKS5yZW1vdmVOYW1lZEl0ZW0oIm1hdGNoIik7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjaGFuZ2VkKSB7Ci0JCQkJRmlsZU91dHB1dFN0cmVhbSBvc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJQ29tbW9uWE1MLnNlcmlhbGl6ZShkb2MsIG9zdHJlYW0pOwotCQkJCW9zdHJlYW0uY2xvc2UoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1vZGlmaWVkICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihmaWxlLmdldFBhdGgoKSArICI6ICIgKyBlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGZpbGUuZ2V0UGF0aCgpICsgIjogIiArIGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL3Rlc3RTdHJpbmdYTUwuanBhZ2UgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvdGVzdFN0cmluZ1hNTC5qcGFnZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxZWFhMC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvdGVzdFN0cmluZ1hNTC5qcGFnZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3RldC5qc3AgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy90ZXQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTFiMjFlLi4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3RldC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCINCi0JcGFnZUVuY29kaW5nPSJVVEYtOCIlPg0KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4NCi08dGl0bGU+Y29udGVudCBvZiBsb3dlcmNhc2UgdGl0bGUgdGFnczwvdGl0bGU+DQotPHTEsXRsZT5jb250ZW50IG9mIGxvd2VyY2FzZSB0aXRsZSB0YWdzIChubyBkaWFyZXNpcyBvdmVyIGkpPC90xLF0bGU+DQotPHRpdGxlPmNvbnRlbnQgb2YgdXBwZXJjYXNlIHRhZ3M8L3RpdGxlPg0KLTx0aXRsZT48L3RpdGxlPg0KLTx0aXRsZT48L3RpdGxlPg0KLTx0aXRsZT48L3RpdGxlPg0KLTx0aXRsZT48L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aT48L2k+DQotPGk+PC9pPg0KLTxpPjwvaT4NCi08aT48L2k+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy90dXJraXNoQ2FzZS5qcGFnZSBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3R1cmtpc2hDYXNlLmpwYWdlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTk2ZTYxLi4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3R1cmtpc2hDYXNlLmpwYWdlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLVN0cmluZyBzID0gIlx1MDEzMSIrIlx1MDA2OSI7Ci1zLnRvVXBwZXJDYXNlKCk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiZTFiYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkOGI1Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFjNjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNDk1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvRWRpdG9ySnNwQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvRWRpdG9ySnNwQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWMxZmVmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL0VkaXRvckpzcENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0ianNwZjEwMDAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB2YWx1ZXMgZm9yIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdHM6Ci0tICA8Yj5DaGFyYWN0ZXIgY29kZTo8L2I+IFNwZWNpZmllcyB0aGUgcGFnZSBkaXJlY3RpdmUncyBwYWdlRW5jb2RpbmcgdmFsdWUgYW5kIGNvbnRlbnRUeXBlIGNoYXJzZXQuIEluIEhUTUwgZG9jdW1lbnRzLCB0aGlzIHZhbHVlIGlzIGFsc28gdXNlZCBmb3IgdGhlICZsdDtNRVRBJmd0OyB0YWcncyBjaGFyc2V0IHByb3BlcnR5LgotLSAgPGI+TGFuZ3VhZ2U6PC9iPiBTcGVjaWZpZXMgdGhlIHBhZ2UgZGlyZWN0aXZlJ3MgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCi0tICA8Yj5Db250ZW50IFR5cGU6PC9iPiBTcGVjaWZpZXMgdGhlIGNvbnRlbnRUeXBlJ3MgVFlQRSB2YWx1ZSBmb3IgdGhlIHBhZ2UgZGlyZWN0aXZlLiBJbiBIVE1MIGRvY3VtZW50cywgdGhpcyB2YWx1ZSBpcyBhbHNvIHVzZWQgZm9yIHRoZSAmbHQ7TUVUQSZndDsgdGFnJ3MgY29udGVudCBwcm9wZXJ0eS4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJqc3ByMDAxMCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIG9wZW4gdGhlIDxiPlJlbmFtZSBSZXNvdXJjZTwvYj4gZGlhbG9nLCBpZiBhcHBsaWNhYmxlLCB3aGljaCBsZXRzIHlvdSByZW5hbWUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBKYXZhIGVsZW1lbnQgYW5kIHJlZmVyZW5jZXMgdG8gdGhhdCBlbGVtZW50LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU291cmNlIGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHNvdXJjZSBjb2RlIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9ImpzcHIwMDIwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gb3BlbiB0aGUgPGI+TW92ZTwvYj4gZGlhbG9nLCBpZiBhcHBsaWNhYmxlLCB3aGljaCBsZXRzIHlvdSBtb3ZlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgSmF2YSBlbGVtZW50LiBGb3IgZXhhbXBsZSwgeW91IGNhbiBtb3ZlIGEgbWV0aG9kIGZyb20gb25lIGNsYXNzIHRvIGFub3RoZXIuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTb3VyY2UgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgc291cmNlIGNvZGUgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ4MDA1MCI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIGFuZCB0aGUgdGV4dCBlbmNvZGluZyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBjcmVhdGUgb3Igc2F2ZSBhIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZS4KLQotVmFyaW91cyBkZXZlbG9wbWVudCBwbGF0Zm9ybXMgdXNlIGRpZmZlcmVudCBsaW5lIGRlbGltaXRlcnMgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGEgbmV3IGxpbmUuIFNlbGVjdCB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0aGF0IGNvcnJlc3BvbmRzIHRvIHlvdXIgZGV2ZWxvcG1lbnQgb3IgZGVwbG95bWVudCBwbGF0Zm9ybS4KLTxiPk5vdGU6PC9iPiBUaGlzIGRlbGltaXRlciB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGJlIGFkZGVkIHRvIGFueSBkb2N1bWVudHMgdGhhdCBjdXJyZW50bHkgZXhpc3QuIEl0IHdpbGwgYmUgYWRkZWQgb25seSB0byBkb2N1bWVudHMgdGhhdCB5b3UgY3JlYXRlIGFmdGVyIHlvdSBzZWxlY3QgdGhlIGxpbmUgZGVsaW1pdGVyIHR5cGUgYW5kIGNsaWNrIDxiPkFwcGx5PC9iPiwgb3IgdG8gZXhpc3RpbmcgZmlsZXMgdGhhdCB5b3Ugb3BlbiBhbmQgdGhlbiByZXNhdmUgYWZ0ZXIgeW91IHNlbGVjdCB0aGUgbGluZSBkZWxpbWl0ZXIgdHlwZSBhbmQgY2xpY2sgPGI+QXBwbHk8L2I+LgotCi1UaGUgZW5jb2RpbmcgYXR0cmlidXRlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2Rpbmcgc2V0IHRoYXQgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIEpTUCBmaWxlcy4gIENoYW5naW5nIHRoZSBlbmNvZGluZyBjYXVzZXMgYW55IG5ldyBKU1AgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZCBmcm9tIHNjcmF0Y2ggdG8gdXNlIHRoZSBzZWxlY3RlZCBlbmNvZGluZy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYngwMDUxIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3VzdG9taXplIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nIHRoYXQgdGhlIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZWRpdG9yIGRvZXMgd2hlbiB5b3UgYXJlIGVkaXRpbmcgYSBmaWxlLiIKLQotVGhlIDxiPkNvbnRlbnQgdHlwZTwvYj4gZmllbGQgY29udGFpbnMgYSBsaXN0IG9mIGFsbCB0aGUgc291cmNlIHR5cGVzIHRoYXQgeW91IGNhbiBzZWxlY3QgYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLiBZb3UgY2FuIGVpdGhlciBzZWxlY3QgdGhlIGNvbnRlbnQgdHlwZSB0aGF0IHlvdSB3YW50IHRvIHdvcmsgd2l0aCBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdCwgb3IgY2xpY2sgdGV4dCBpbiB0aGUgdGV4dCBzYW1wbGUgd2luZG93IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNvbnRlbnQgdHlwZSBmb3Igd2hpY2ggeW91IHdhbnQgdG8gY2hhbmdlIHRoZSB0ZXh0IGhpZ2hsaWdodGluZy4KLQotVGhlIDxiPkZvcmVncm91bmQ8L2I+IGFuZCA8Yj5CYWNrZ3JvdW5kPC9iPiBwdXNoIGJ1dHRvbnMgb3BlbiA8Yj5Db2xvcjwvYj4gZGlhbG9nIGJveGVzIHRoYXQgbGV0IHlvdSBzcGVjaWZ5IHRleHQgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMsIHJlc3BlY3RpdmVseS4gU2VsZWN0IHRoZSA8Yj5Cb2xkPC9iPiBjaGVjayBib3ggdG8gbWFrZSB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZSBhcHBlYXIgaW4gYm9sZC4KLQotQ2xpY2sgdGhlIDxiPlJlc3RvcmUgRGVmYXVsdDwvYj4gcHVzaCBidXR0b24gdG8gc2V0IHRoZSBoaWdobGlnaHRpbmcgc3R5bGVzIGJhY2sgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ4MDA1MiI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IGNyZWF0ZSBuZXcgYW5kIGVkaXQgZXhpc3RpbmcgdGVtcGxhdGVzIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4geW91IGVkaXQgYSBKU1AgZmlsZS4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InhtbG0xMDUwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gb3BlbiB0aGUgPGI+Q2xlYW51cDwvYj4gZGlhbG9nLCB3aGljaCBjb250YWlucyBzZXR0aW5ncyB0byB1cGRhdGUgYSBkb2N1bWVudCBzbyB0aGF0IGl0IGlzIHdlbGwtZm9ybWVkIGFuZCBmb3JtYXR0ZWQuIENsZWFudXAgaW5jbHVkZXMgc3VjaCBhY3Rpdml0aWVzIGFzIGluc2VydGluZyBtaXNzaW5nIHRhZ3MsIGFkZGluZyBxdW90YXRpb24gbWFya3MgYXJvdW5kIGF0dHJpYnV0ZSB2YWx1ZXMsIG5vZGUgY2FwaXRhbGl6YXRpb24sIGFuZCBmb3JtYXR0aW5nIGEgZG9jdW1lbnQuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotCi08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvRWRpdG9ySnNwQ29udGV4dHMyLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL0VkaXRvckpzcENvbnRleHRzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MDgzNWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvRWRpdG9ySnNwQ29udGV4dHMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0ianNwc291cmNlX3NvdXJjZV9IZWxwSWQiPgotPGRlc2NyaXB0aW9uPlRoZSBKU1Agc291cmNlIHBhZ2UgZWRpdG9yIGxldHMgeW91IGVkaXQgYSBKYXZhU2VydmVyIFBhZ2VzIGZpbGUuIFRoZSBlZGl0b3IgcHJvdmlkZXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QsIHVzZXItZGVmaW5lZCB0ZW1wbGF0ZXMsIHN5bnRheCBoaWdobGlnaHRpbmcsIHVubGltaXRlZCB1bmRvIGFuZCByZWRvLCBlbGVtZW50IHNlbGVjdGlvbiBhbmQgZm9ybWF0dGluZywgYW5kIGRvY3VtZW50IGZvcm1hdHRpbmcuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjguaHRtbCIvPgotPHRvcGljIGxhYmVsPSJNYWtpbmcgY29udGVudCBhc3Npc3Qgd29yayBmb3IgSlNQIGZpbGVzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIzLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9ImpzcGYxMDAwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdmFsdWVzIGZvciB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgZnJvbSB0aGUgZHJvcC1kb3duIGxpc3RzOgotLSAgPGI+Q2hhcmFjdGVyIGNvZGU6PC9iPiBTcGVjaWZpZXMgdGhlIHBhZ2UgZGlyZWN0aXZlJ3MgcGFnZUVuY29kaW5nIHZhbHVlIGFuZCBjb250ZW50VHlwZSBjaGFyc2V0LiBJbiBIVE1MIGRvY3VtZW50cywgdGhpcyB2YWx1ZSBpcyBhbHNvIHVzZWQgZm9yIHRoZSAmbHQ7TUVUQSZndDsgdGFnJ3MgY2hhcnNldCBwcm9wZXJ0eS4KLS0gIDxiPkxhbmd1YWdlOjwvYj4gU3BlY2lmaWVzIHRoZSBwYWdlIGRpcmVjdGl2ZSdzIHByb2dyYW1taW5nIGxhbmd1YWdlLgotLSAgPGI+Q29udGVudCBUeXBlOjwvYj4gU3BlY2lmaWVzIHRoZSBjb250ZW50VHlwZSdzIFRZUEUgdmFsdWUgZm9yIHRoZSBwYWdlIGRpcmVjdGl2ZS4gSW4gSFRNTCBkb2N1bWVudHMsIHRoaXMgdmFsdWUgaXMgYWxzbyB1c2VkIGZvciB0aGUgJmx0O01FVEEmZ3Q7IHRhZydzIGNvbnRlbnQgcHJvcGVydHkuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ianNwcjAwMTAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBvcGVuIHRoZSA8Yj5SZWZhY3RvciBSZW5hbWU8L2I+IGRpYWxvZywgaWYgYXBwbGljYWJsZSwgd2hpY2ggbGV0cyB5b3UgcmVuYW1lIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgSmF2YSBlbGVtZW50IGFuZCByZWZlcmVuY2VzIHRvIHRoYXQgZWxlbWVudC4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNvdXJjZSBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBzb3VyY2UgY29kZSAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJqc3ByMDAyMCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIG9wZW4gdGhlIDxiPlJlZmFjdG9yIE1vdmU8L2I+IGRpYWxvZywgaWYgYXBwbGljYWJsZSwgd2hpY2ggbGV0cyB5b3UgbW92ZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIEphdmEgZWxlbWVudC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gbW92ZSBhIG1ldGhvZCBmcm9tIG9uZSBjbGFzcyB0byBhbm90aGVyLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU291cmNlIGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHNvdXJjZSBjb2RlIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VieDAwNTAiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBsaW5lIGRlbGltaXRlciBhbmQgdGhlIHRleHQgZW5jb2RpbmcgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgY3JlYXRlIG9yIHNhdmUgYSBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGUuCi0KLVZhcmlvdXMgZGV2ZWxvcG1lbnQgcGxhdGZvcm1zIHVzZSBkaWZmZXJlbnQgbGluZSBkZWxpbWl0ZXJzIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiBhIG5ldyBsaW5lLiBTZWxlY3QgdGhlIG9wZXJhdGluZyBzeXN0ZW0gdGhhdCBjb3JyZXNwb25kcyB0byB5b3VyIGRldmVsb3BtZW50IG9yIGRlcGxveW1lbnQgcGxhdGZvcm0uCi08Yj5Ob3RlOjwvYj4gVGhpcyBkZWxpbWl0ZXIgd2lsbCBub3QgYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byBhbnkgZG9jdW1lbnRzIHRoYXQgY3VycmVudGx5IGV4aXN0LiBJdCB3aWxsIGJlIGFkZGVkIG9ubHkgdG8gZG9jdW1lbnRzIHRoYXQgeW91IGNyZWF0ZSBhZnRlciB5b3Ugc2VsZWN0IHRoZSBsaW5lIGRlbGltaXRlciB0eXBlIGFuZCBjbGljayA8Yj5BcHBseTwvYj4sIG9yIHRvIGV4aXN0aW5nIGZpbGVzIHRoYXQgeW91IG9wZW4gYW5kIHRoZW4gcmVzYXZlIGFmdGVyIHlvdSBzZWxlY3QgdGhlIGxpbmUgZGVsaW1pdGVyIHR5cGUgYW5kIGNsaWNrIDxiPkFwcGx5PC9iPi4KLQotVGhlIGVuY29kaW5nIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nIHNldCB0aGF0IGlzIHVzZWQgd2hlbiBjcmVhdGluZyBKU1AgZmlsZXMuICBDaGFuZ2luZyB0aGUgZW5jb2RpbmcgY2F1c2VzIGFueSBuZXcgSlNQIGZpbGVzIHRoYXQgYXJlIGNyZWF0ZWQgZnJvbSBzY3JhdGNoIHRvIHVzZSB0aGUgc2VsZWN0ZWQgZW5jb2RpbmcuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ4MDA1MSI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IGN1c3RvbWl6ZSB0aGUgc3ludGF4IGhpZ2hsaWdodGluZyB0aGF0IHRoZSBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGVkaXRvciBkb2VzIHdoZW4geW91IGFyZSBlZGl0aW5nIGEgZmlsZS4iCi0KLVRoZSA8Yj5Db250ZW50IHR5cGU8L2I+IGZpZWxkIGNvbnRhaW5zIGEgbGlzdCBvZiBhbGwgdGhlIHNvdXJjZSB0eXBlcyB0aGF0IHlvdSBjYW4gc2VsZWN0IGEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci4gWW91IGNhbiBlaXRoZXIgc2VsZWN0IHRoZSBjb250ZW50IHR5cGUgdGhhdCB5b3Ugd2FudCB0byB3b3JrIHdpdGggZnJvbSB0aGUgZHJvcC1kb3duIGxpc3QsIG9yIGNsaWNrIHRleHQgaW4gdGhlIHRleHQgc2FtcGxlIHdpbmRvdyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjb250ZW50IHR5cGUgZm9yIHdoaWNoIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgdGV4dCBoaWdobGlnaHRpbmcuCi0KLVRoZSA8Yj5Gb3JlZ3JvdW5kPC9iPiBhbmQgPGI+QmFja2dyb3VuZDwvYj4gcHVzaCBidXR0b25zIG9wZW4gPGI+Q29sb3I8L2I+IGRpYWxvZyBib3hlcyB0aGF0IGxldCB5b3Ugc3BlY2lmeSB0ZXh0IGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzLCByZXNwZWN0aXZlbHkuIFNlbGVjdCB0aGUgPGI+Qm9sZDwvYj4gY2hlY2sgYm94IHRvIG1ha2UgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUgYXBwZWFyIGluIGJvbGQuCi0KLUNsaWNrIHRoZSA8Yj5SZXN0b3JlIERlZmF1bHQ8L2I+IHB1c2ggYnV0dG9uIHRvIHNldCB0aGUgaGlnaGxpZ2h0aW5nIHN0eWxlcyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VieDAwNTIiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBjcmVhdGUgbmV3IGFuZCBlZGl0IGV4aXN0aW5nIHRlbXBsYXRlcyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBlZGl0IGEgSlNQIGZpbGUuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjguaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ4bWxtMTA1MCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIG9wZW4gdGhlIDxiPkNsZWFudXA8L2I+IGRpYWxvZywgd2hpY2ggY29udGFpbnMgc2V0dGluZ3MgdG8gdXBkYXRlIGEgZG9jdW1lbnQgc28gdGhhdCBpdCBpcyB3ZWxsLWZvcm1lZCBhbmQgZm9ybWF0dGVkLiBDbGVhbnVwIGluY2x1ZGVzIHN1Y2ggYWN0aXZpdGllcyBhcyBpbnNlcnRpbmcgbWlzc2luZyB0YWdzLCBhZGRpbmcgcXVvdGF0aW9uIG1hcmtzIGFyb3VuZCBhdHRyaWJ1dGUgdmFsdWVzLCBub2RlIGNhcGl0YWxpemF0aW9uLCBhbmQgZm9ybWF0dGluZyBhIGRvY3VtZW50LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL0pzcFdpekNvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL0pzcFdpekNvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwODVlMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9Kc3BXaXpDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotCTxjb250ZXh0IGlkPSJqc3B3MDAxMCI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVNlbGVjdCB0aGUgSlNQIHRlbXBsYXRlIGNoZWNrYm94IHRvIGNyZWF0ZSB5b3VyIEpTUCBmaWxlIGJhc2VkIG9uIGEgZGVmYXVsdCB0ZW1wbGF0ZS4gWW91IGNhbiBjaG9vc2UgdG8gaGF2ZSB5b3VyIEpTUCBjcmVhdGVkIHdpdGggSFRNTCwgWEhUTUwsIG9yIFhIVE1MIHdpdGggWE1MIG1hcmt1cC4gSWYgeW91IGRvIG5vdCBzZWxlY3QgYSB0ZW1wbGF0ZSwgeW91ciBuZXdseSBjcmVhdGVkIEpTUCBmaWxlIHdpbGwgYmUgY29tcGxldGVseSBibGFuay4KLQkJPC9kZXNjcmlwdGlvbj4KLQk8L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4OGY0MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBsdWdpbi5uYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4yMDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGM2OTczLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBFZGl0b3JKc3BDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgRWRpdG9ySnNwQ29udGV4dHMyLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBFZGl0b3JKc3BDb250ZXh0czIueG1sLFwKLSAgICAgICAgICAgICAgIEVkaXRvckpzcENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTljYTI2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVHJhbnNsYXRpb24gSW5zdHJ1Y3Rpb246IHNlY3Rpb24gdG8gYmUgdHJhbnNsYXRlZAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVBsdWdpbi5uYW1lID0gSlNQIHRvb2xzIGluZm9wb3BzCi0KLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMWIxMTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4xIj8+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Z2luIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgICAgICAgICAtLT4KLTwhLS0gY29udHJpYnV0aW9ucyBmb3IgdXNpbmcgdGhlIHRvb2wuICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxwbHVnaW4+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJFZGl0b3JKc3BDb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIvPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJFZGl0b3JKc3BDb250ZXh0czIueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZSIvPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJKc3BXaXpDb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIvPgotPC9leHRlbnNpb24+Ci0KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4M2M4NDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXJfMS4wLjAuamFyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGM3NWI5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNmNGMyMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5kb2MudXNlcjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2MTcxNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9ib29rLmNzcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2Jvb2suY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGYyNTUzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2Jvb2suY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLUBpbXBvcnQgIi4uL1BST0RVQ1RfUExVR0lOL2Jvb2suY3NzIjsKLQotUC5Db2RlIHsKLQlkaXNwbGF5OiBibG9jazsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCXRleHQtaW5kZW50OiAwLjAwcHQ7Ci0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsKLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0OwotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsKLQltYXJnaW4tbGVmdDogMTVwdDsKLQlmb250LXNpemU6IDEwLjAwMDAwMHB0OwotCWZvbnQtd2VpZ2h0OiBtZWRpdW07Ci0JZm9udC1zdHlsZTogUmVndWxhcjsKLQljb2xvcjogIzQ0NDRDQzsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotCXRleHQtdHJhbnNmb3JtOiBub25lOwotCWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciOwotfQotCi1INi5DYXB0aW9uRmlnQ29sdW1uIHsKLQlkaXNwbGF5OiBibG9jazsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCXRleHQtaW5kZW50OiAwLjAwMDAwMHB0OwotCW1hcmdpbi10b3A6IDMuMDAwMDAwcHQ7Ci0JbWFyZ2luLWJvdHRvbTogMTEuMDAwMDAwcHQ7Ci0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0OwotCW1hcmdpbi1sZWZ0OiAwLjAwMDAwMHB0OwotCWZvbnQtc2l6ZTogOS4wMDAwMDBwdDsKLQlmb250LXdlaWdodDogbWVkaXVtOwotCWZvbnQtc3R5bGU6IEl0YWxpYzsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotCXRleHQtdHJhbnNmb3JtOiBub25lOwotCWZvbnQtZmFtaWx5OiAiQXJpYWwiOwotfQotCi1QLk5vdGUgewotCWRpc3BsYXk6IGJsb2NrOwotCXRleHQtYWxpZ246IGxlZnQ7Ci0JdGV4dC1pbmRlbnQ6IDBwdDsKLQltYXJnaW4tdG9wOiAxOS41MDAwMDBwdDsKLQltYXJnaW4tYm90dG9tOiAxOS41MDAwMDBwdDsKLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7Ci0JbWFyZ2luLWxlZnQ6IDMwcHQ7Ci0JZm9udC1zaXplOiAxMS4wMDAwMDBwdDsKLQlmb250LXdlaWdodDogbWVkaXVtOwotCWZvbnQtc3R5bGU6IEl0YWxpYzsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotCXRleHQtdHJhbnNmb3JtOiBub25lOwotCWZvbnQtZmFtaWx5OiAiQXJpYWwiOwotfQotCi1FTS5VSUxhYmVsIHsKLQlmb250LXdlaWdodDogQm9sZDsKLQlmb250LXN0eWxlOiBSZWd1bGFyOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7Ci0JdGV4dC10cmFuc2Zvcm06IG5vbmU7Ci19Ci0KLUVNLkNvZGVOYW1lIHsKLQlmb250LXdlaWdodDogQm9sZDsKLQlmb250LXN0eWxlOiBSZWd1bGFyOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7Ci0JdGV4dC10cmFuc2Zvcm06IG5vbmU7Ci0JZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyI7Ci19Ci0KLS8qIGZvbGxvd2luZyBmb250IGZhY2UgZGVjbGFyYXRpb25zIG5lZWQgdG8gYmUgcmVtb3ZlZCBmb3IgREJDUyAqLwotYm9keSxoMSxoMixoMyxoNCxoNSxoNixwLHRhYmxlLHRkLGNhcHRpb24sdGgsdWwsb2wsZGwsbGksZGQsZHQgewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWNvbG9yOiAjMDAwMDAwCi19Ci0KLXByZSB7Ci0JZm9udC1mYW1pbHk6IENvdXJpZXIsIG1vbm9zcGFjZQotfQotCi0vKiBlbmQgZm9udCBmYWNlIGRlY2xhcmF0aW9ucyAqLwotCS8qIGZvbGxvd2luZyBmb250IHNpemUgZGVjbGFyYXRpb25zIHNob3VsZCBiZSBPSyBmb3IgREJDUyAqLwotYm9keSxoMSxoMixoMyxoNCxoNSxoNixwLHRhYmxlLHRkLGNhcHRpb24sdGgsdWwsb2wsZGwsbGksZGQsZHQgewotCWZvbnQtc2l6ZTogMTBwdDsKLX0KLQotcHJlIHsKLQlmb250LXNpemU6IDEwcHQKLX0KLQotLyogZW5kIGZvbnQgc2l6ZSBkZWNsYXJhdGlvbnMgKi8KLWJvZHkgewotCWJhY2tncm91bmQ6ICNGRkZGRkYKLX0KLQotaDEgewotCWZvbnQtc2l6ZTogMThwdDsKLQltYXJnaW4tdG9wOiA1OwotCW1hcmdpbi1ib3R0b206IDEKLX0KLQotaDIgewotCWZvbnQtc2l6ZTogMTRwdDsKLQltYXJnaW4tdG9wOiAyNTsKLQltYXJnaW4tYm90dG9tOiAzCi19Ci0KLWgzIHsKLQlmb250LXNpemU6IDExcHQ7Ci0JbWFyZ2luLXRvcDogMjA7Ci0JbWFyZ2luLWJvdHRvbTogMwotfQotCi1oNCB7Ci0JZm9udC1zaXplOiAxMHB0OwotCW1hcmdpbi10b3A6IDIwOwotCW1hcmdpbi1ib3R0b206IDM7Ci0JZm9udC1zdHlsZTogaXRhbGljCi19Ci0KLXAgewotCW1hcmdpbi10b3A6IDEwcHg7Ci0JbWFyZ2luLWJvdHRvbTogMTBweAotfQotCi1wcmUgewotCW1hcmdpbi1sZWZ0OiA2OwotCWZvbnQtc2l6ZTogOXB0Ci19Ci0KLWE6bGluayB7Ci0JY29sb3I6ICMwMDAwRkYKLX0KLQotYTpob3ZlciB7Ci0JY29sb3I6ICMwMDAwODAKLX0KLQotYTp2aXNpdGVkIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZQotfQotCi11bCB7Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAxMAotfQotCi1saSB7Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAwCi19Ci0KLWxpIHAgewotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMAotfQotCi1vbCB7Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAxMAotfQotCi1kbCB7Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAxMAotfQotCi1kdCB7Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAwOwotCWZvbnQtd2VpZ2h0OiBib2xkCi19Ci0KLWRkIHsKLQltYXJnaW4tdG9wOiAwOwotCW1hcmdpbi1ib3R0b206IDAKLX0KLQotc3Ryb25nIHsKLQlmb250LXdlaWdodDogYm9sZAotfQotCi1lbSB7Ci0JZm9udC1zdHlsZTogaXRhbGljCi19Ci0KLXZhciB7Ci0JZm9udC1zdHlsZTogaXRhbGljCi19Ci0KLWRpdi5yZXZpc2lvbiB7Ci0JYm9yZGVyLWxlZnQtc3R5bGU6IHNvbGlkOwotCWJvcmRlci1sZWZ0LXdpZHRoOiB0aGluOwotCWJvcmRlci1sZWZ0LWNvbG9yOiAjN0I2OEVFOwotCXBhZGRpbmctbGVmdDogNQotfQotCi10aCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwN2E4ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBjb21tb24uY3NzLFwKLSAgICAgICAgICAgICAgIGNvbW1vbmx0ci5jc3MsXAotICAgICAgICAgICAgICAgaW1hZ2VzLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgbm90aWNlcy5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdG9jLnhtbCxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2VfdG9jLnhtbCxcCi0gICAgICAgICAgICAgICB0b3BpY3MvLFwKLSAgICAgICAgICAgICAgIGJvb2suY3NzLFwKLSAgICAgICAgICAgICAgIGNvbW1vbnJ0bC5jc3MKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRmM2YyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTk3ICswLDAgQEAKLWJvZHkgewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDAuOGVtOwotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0JY29sb3I6IEJsYWNrOwotCW1hcmdpbi1yaWdodDogNWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmlibWZpbGVwYXRoIHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWZvbnQtc2l6ZTogMTAwJTsKLX0KLQotLmlibWNvbW1hbmQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaWJtZW1waGFzaXMgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLm12LC5waywucGtkZWYsLnB2IHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWZvbnQtc2l6ZTogMTAwJTsKLQlwYWRkaW5nLXRvcDogMGVtOwotCXBhZGRpbmctcmlnaHQ6IC4zZW07Ci0JcGFkZGluZy1ib3R0b206IDBlbTsKLQlwYWRkaW5nLWxlZnQ6IC4zZW07Ci19Ci0KLXR0LHNhbXAgewotCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci0JZm9udC1zaXplOiAxMDAlOwotfQotCi1CT0RZLm5hdiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLQlib3JkZXItcmlnaHQ6IDAuMmVtIHJpZGdlIGJsYWNrOwotCWZvbnQtc2l6ZTogMC45NWVtOwotfQotCi0uYmFzZSB7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC12YXJpYW50OiBub3JtYWw7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci19Ci0KLVRBQkxFIHsKLQljb2xvcjogYmxhY2s7Ci0Jd2lkdGg6IDkwJTsKLQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwotCWJvcmRlci1jb2xvcjogQmxhY2s7Ci0JYmFja2dyb3VuZDogd2hpdGU7Ci0JbWFyZ2luLXRvcDogMC41ZW07Ci0JbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0JbWFyZ2luLWxlZnQ6IDBlbTsKLQltYXJnaW4tcmlnaHQ6IDBlbTsKLX0KLQotLnRibGRlc2MgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotVEggewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc2l6ZTogMC43ZW07Ci0JY29sb3I6IGJsYWNrOwotCWJhY2tncm91bmQtY29sb3I6ICNkYWRhZGE7Ci0JcGFkZGluZy10b3A6IDAuMWVtOwotCXBhZGRpbmctYm90dG9tOiAwLjNlbTsKLQlwYWRkaW5nLWxlZnQ6IDFlbTsKLQlwYWRkaW5nLXJpZ2h0OiAxZW07Ci19Ci0KLVRILmJhc2UgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiBibGFjazsKLQlib3JkZXI6IDEgc29saWQgIzYwNjA2MDsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGNkYWRhOwotCXBhZGRpbmctdG9wOiAwLjY1ZW07Ci0JcGFkZGluZy1ib3R0b206IDAuNjVlbTsKLQlwYWRkaW5nLWxlZnQ6IDFlbTsKLQlwYWRkaW5nLXJpZ2h0OiAxZW07Ci19Ci0KLVREIHsKLQlmb250LXNpemU6IDAuN2VtOwotCWNvbG9yOiBibGFjazsKLQliYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKLQlwYWRkaW5nLXRvcDogMC4xZW07Ci0JcGFkZGluZy1ib3R0b206IDAuM2VtOwotCXBhZGRpbmctbGVmdDogMWVtOwotCXBhZGRpbmctcmlnaHQ6IDFlbTsKLX0KLQotQ0lURSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1FTSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1TVFJPTkcgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1jYXB0aW9uIHsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotRFQgewotCW1hcmdpbi10b3A6IDAuNWVtOwotCW1hcmdpbi1ib3R0b206IDAuNWVtOwotfQotCi1ERCB7Ci0JbWFyZ2luLWxlZnQ6IDEuMGVtOwotfQotCi1QUkUscHJlLmNncmFwaGljIHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWZvbnQtc2l6ZTogMTJweDsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGFkYWRhOwotCXBhZGRpbmc6IDVweDsKLX0KLQotLml0YWxpYyB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uYm9sZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS51bmRlcmxpbmVkIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmJvbGQtaXRhbGljLC5ib2xkSXRhbGljIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5zbWFsbENhcHMsLnNtYWxsY2FwcyB7Ci0JdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKLQlmb250LXNpemU6IHNtYWxsZXI7Ci0JZm9udC12YXJpYW50OiBzbWFsbC1jYXBzOwotfQotCi0uaXRhbGljLXVuZGVybGluZWQgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmJvbGQtdW5kZXJsaW5lZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5ib2xkLWl0YWxpYy11bmRlcmxpbmVkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5zbWFsbGNhcHMtdW5kZXJsaW5lZCB7Ci0JZm9udC12YXJpYW50OiBzbWFsbC1jYXBzOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uZW1waGFzaXMgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLmlubGluZWRlZiB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uc2lkZWJhciB7Ci0JYmFja2dyb3VuZDogI2NjY2NjYzsKLX0KLQotQTpsaW5rIHsKLQljb2xvcjogIzAwNjY5OTsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotQTp2aXNpdGVkIHsKLQljb2xvcjogIzk5NjY5OTsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotQTphY3RpdmUgewotCWNvbG9yOiAjMDA2Njk5OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1BOmhvdmVyIHsKLQljb2xvcjogIzk5NjY5OTs7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEudG9jbGluazpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEudG9jbGluazphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50b2NsaW5rOnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50b2NsaW5rOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS5wdG9jbGluazpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEucHRvY2xpbms6YWN0aXZlIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEucHRvY2xpbms6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnB0b2NsaW5rOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS5pbmRleGxpbms6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmluZGV4bGluazphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5pbmRleGxpbms6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmluZGV4bGluazpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEuZmlndXJlbGlzdDpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuZmlndXJlbGlzdDphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5maWd1cmVsaXN0OnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5maWd1cmVsaXN0OmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS50YWJsZWxpc3Q6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRhYmxlbGlzdDphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50YWJsZWxpc3Q6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRhYmxlbGlzdDpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEuYm9sZGdyZXlsaW5rOmxpbmsgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zaXplOiAwLjllbTsKLX0KLQotYS5ib2xkZ3JleWxpbms6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXNpemU6IDAuOWVtOwotfQotCi1hLmJvbGRncmV5bGluazpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc2l6ZTogMC45ZW07Ci19Ci0KLS5ydW5uaW5naGVhZGVyIHsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAwLjdlbTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDAuN2VtOwotfQotCi0ucnVubmluZ2Zvb3RlciBhOmxpbmsgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgYTphY3RpdmUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgYTp2aXNpdGVkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5ydW5uaW5nZm9vdGVyIGE6aG92ZXIgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0jYnJlYWRjcnVtYiwuYnJlYWRjcnVtYixzcGFuLmJyZWFkY3J1bWJzIHsKLQlmb250LXNpemU6IDAuNzVlbTsKLX0KLQotLmZhc3RwYXRoIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uZmFzdHBhdGh0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS50b2MgewotCWZvbnQtc2l6ZTogc21hbGw7Ci19Ci0KLS5uZXN0ZWQwIHsKLQltYXJnaW4tdG9wOiAwZW07Ci19Ci0KLS5wIHsKLQltYXJnaW4tdG9wOiAxZW07Ci19Ci0KLXNwYW4uZmlnY2FwIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4uZmlnZGVzYyB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1kaXYuZmlnYm94IHsKLQkKLX0KLQotZGl2LmZpZ3J1bGVzIHsKLQkKLX0KLQotZGl2LmZpZ25vbmUgewotCQotfQotCi0uZmlnbm9uZSB7Ci0JCi19Ci0KLS5maWdib3JkZXIgewotCQotfQotCi0uZmlnc2lkZXMgewotCQotfQotCi0uZmlndG9wIHsKLQkKLX0KLQotLmZpZ2JvdHRvbSB7Ci0JCi19Ci0KLS5maWd0b3Bib3QgewotCQotfQotCi0ucGFyZW50bGluayB7Ci0JCi19Ci0KLS5wcmV2bGluayB7Ci0JCi19Ci0KLS5uZXh0bGluayB7Ci0JCi19Ci0KLS5yZWxjb25jZXB0c2hkIHsKLQkKLX0KLQotLnJlbHRhc2tzaGQgewotCQotfQotCi0ucmVscmVmaGQgewotCQotfQotCi0uc3lubm9uZSB7Ci0JCi19Ci0KLS5zeW5ib3JkZXIgewotCQotfQotCi0uc3luc2lkZXMgewotCQotfQotCi0uc3ludG9wIHsKLQkKLX0KLQotLnN5bmJvdHRvbSB7Ci0JCi19Ci0KLS5zeW50b3Bib3QgewotCQotfQotCi0uc2tpcCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotfQotCi0uc2tpcHNwYWNlIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0udWxjaGlsZGxpbmsgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5vbGNoaWxkbGluayB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotdWwsb2wgewotCW1hcmdpbi10b3A6IDAuMWVtOwotCXBhZGRpbmctdG9wOiAwLjFlbTsKLX0KLQotdWwuc2ltcGxlIHsKLQlsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Ci19Ci0KLXVsLmluZGV4bGlzdCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBub25lOwotfQotCi1PTCBMSSB7Ci0JbWFyZ2luLXRvcDogMC4wZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4wZW07Ci0JbWFyZ2luLWxlZnQ6IDAuMGVtOwotfQotCi1VTCBMSSB7Ci0JbWFyZ2luLXRvcDogMC4wZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4wZW07Ci0JbWFyZ2luLWxlZnQ6IDAuMGVtOwotfQotCi1PTCBMSSBESVYgUCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsOwotCW1hcmdpbi10b3A6IDAuMmVtOwotCW1hcmdpbi1ib3R0b206IDAuMmVtOwotfQotCi1VTCBMSSBESVYgUCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBkaXNjOwotCW1hcmdpbi10b3A6IDAuMmVtOwotCW1hcmdpbi1ib3R0b206IDAuMmVtOwotfQotCi0qIFtjb21wYWN0PSJ5ZXMiXT5saSB7Ci0JbWFyZ2luLXRvcDogMCBlbTsKLX0KLQotKiBbY29tcGFjdD0ibm8iXT5saSB7Ci0JbWFyZ2luLXRvcDogMC41ZW07Ci19Ci0KLWhyIHsKLQltYXJnaW4tYm90dG9tOiAwZW07Ci0JbWFyZ2luLXRvcDogMGVtOwotCXBhZGRpbmctdG9wOiAwZW07Ci0JcGFkZGluZy1ib3R0b206IDBlbTsKLQl3aWR0aDogOTAlOwotCWNvbG9yOiAjY2NjY2NjOwotCXRleHQtYWxpZ246IGNlbnRlcjsKLX0KLQotSDEsLnRpdGxlLC5wYWdldGl0bGUsLnRvcGljdGl0bGUxIHsKLQlmb250LXNpemU6IDEuNWVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjVlbTsKLQl3b3JkLXNwYWNpbmc6IDAuMWVtOwotfQotCi1IMiwuc3VidGl0bGUsLnBhZ2VzdWJ0aXRsZSwudG9waWN0aXRsZTIgewotCWZvbnQtc2l6ZTogMS4yNWVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC4wZW07Ci19Ci0KLUgzLC5ib2xkdGl0bGUsLnRvcGljdGl0bGUzIHsKLQlmb250LXNpemU6IDEuMGVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC4xZW07Ci19Ci0KLUg0LC50b3BpY3RpdGxlNCB7Ci0JZm9udC1zaXplOiAwLjllbTsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4xZW07Ci0JcGFkZGluZy1ib3R0b206IDAuMWVtOwotfQotCi1oNSwudG9waWN0aXRsZTUgewotCWZvbnQtc2l6ZTogMC44ZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMGVtOwotfQotCi1oNiwudG9waWN0aXRsZTYgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMGVtOwotfQotCi1kaXYuaGVhZHRpdGxlIHsKLQlmb250LXNpemU6IDFlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tbGVmdDogMGVtOwotfQotCi1kaXYuaGVhZDAgewotCWZvbnQtc2l6ZTogMC45ZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWxlZnQ6IDBlbTsKLQltYXJnaW4tdG9wOiAwLjVlbTsKLX0KLQotZGl2LmhlYWQxIHsKLQlmb250LXNpemU6IDAuOGVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1sZWZ0OiAxZW07Ci0JcGFkZGluZy10b3A6IDAuNWVtOwotfQotCi1kaXYuaGVhZDIgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogMmVtOwotfQotCi1kaXYuaGVhZDMgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogM2VtOwotfQotCi1kaXYuaGVhZDQgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogNGVtOwotfQotCi1kaXYuaGVhZDUgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogNWVtOwotfQotCi1kaXYuaGVhZDYgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogNmVtOwotfQotCi1kaXYuaGVhZDcgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogN2VtOwotfQotCi1kaXYuaGVhZDggewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogOGVtOwotfQotCi1kaXYuaGVhZDkgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogOWVtOwotfQotCi0udGlwIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0udGlwdGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uZmlyc3Rjb2wgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0ucHRvY0gxIHsKLQlmb250LXNpemU6IHgtc21hbGw7Ci19Ci0KLS5wdG9jSDIgewotCWZvbnQtc2l6ZTogeC1zbWFsbDsKLX0KLQotLnN0aXRsZSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0ubnRlIHsKLQkKLX0KLQotLnh4bGluZXMgewotCXdoaXRlLXNwYWNlOiBwcmU7Ci0JZm9udC1zaXplOiAwLjk1ZW07Ci19Ci0KLS5zZWN0aW9udGl0bGUgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAwZW07Ci0JY29sb3I6IGJsYWNrOwotCWZvbnQtc2l6ZTogMS4yZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi5pbWFnZWxlZnQgewotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLWRpdi5pbWFnZWNlbnRlciB7Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi1kaXYuaW1hZ2VyaWdodCB7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLWRpdi5pbWFnZWp1c3RpZnkgewotCXRleHQtYWxpZ246IGp1c3RpZnk7Ci19Ci0KLWRpdi5tbW9iaiB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLWRpdi5tbW9iamxlZnQgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotZGl2Lm1tb2JqY2VudGVyIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCXRleHQtYWxpZ246IGNlbnRlcjsKLX0KLQotZGl2Lm1tb2JqcmlnaHQgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLXByZS5zY3JlZW4gewotCXBhZGRpbmc6IDFlbSAxZW0gMWVtIDFlbTsKLQltYXJnaW4tdG9wOiAwLjRlbTsKLQltYXJnaW4tYm90dG9tOiAwLjRlbTsKLQlib3JkZXI6IHRoaW4gc29saWQgQmxhY2s7Ci0JZm9udC1zaXplOiAxMDAlOwotfQotCi0ucHJlcmVxIHsKLQltYXJnaW4tbGVmdDogMS41ZW07Ci19Ci0KLS5kZWZMaXN0SGVhZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLXNwYW4ubXYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi5tZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7Ci19Ci0KLS5wayxzcGFuLnBrIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotc3Bhbi5wa2RlZiB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLXNwYW4ucHYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi5wdmRlZiB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1zcGFuLmt3ZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4ua2R3ZGVmIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLnBhcm1MaXN0S3dkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnBhcm1MaXN0VmFyIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4ub3BlciB7Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotfQotCi1zcGFuLm9wZXJkZWYgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1WQVIsc3Bhbi52YXIgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi52YXJkZWYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotZGl2Lm1zZyB7Ci0JcGFkZGluZzogMC4yZW0gMWVtIDFlbSAxZW07Ci0JbWFyZ2luLXRvcDogMC40ZW07Ci0JbWFyZ2luLWJvdHRvbTogMC40ZW07Ci19Ci0KLWRpdi5tc2dudW0gewotCWZsb2F0OiBsZWZ0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLQltYXJnaW4tcmlnaHQ6IDFlbTsKLX0KLQotZGl2Lm1zZ3RleHQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotZGl2Lm1zZ2l0ZW10aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXAubXNnaXRlbSB7Ci0JbWFyZ2luLXRvcDogMGVtOwotfQotCi0uYXR0ZW50aW9uLGRpdi5hdHRlbnRpb24gewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5hdHRlbnRpb250aXRsZSxzcGFuLmF0dGVudGlvbnRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmNhdXRpb250aXRsZSxkaXYuY2F1dGlvbnRpdGxlIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5jYXV0aW9uLGRpdi5jYXV0aW9uIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uZGFuZ2VyLGRpdi5kYW5nZXIgewotCXBhZGRpbmc6IDAuNWVtIDAuNWVtIDAuNWVtIDAuNWVtOwotCWJvcmRlcjogc29saWQ7Ci0JYm9yZGVyLXdpZHRoOiB0aGluOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi10b3A6IDAuMmVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmRhbmdlcnRpdGxlLGRpdi5kYW5nZXJ0aXRsZSB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaW1wb3J0YW50IHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uaW1wb3J0YW50dGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0ucmVtZW1iZXIgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5yZW1lbWJlcnRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnJlc3RyaWN0aW9uIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0ucmVzdHJpY3Rpb250aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi53YXJuaW5ndGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYud2FybmluZ2JvZHkgewotCW1hcmdpbi1sZWZ0OiAyZW0KLX0KLQotLm5vdGUgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5ub3RldGl0bGUsZGl2Lm5vdGV0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi5ub3RlYm9keSB7Ci0JbWFyZ2luLWxlZnQ6IDJlbTsKLX0KLQotZGl2Lm5vdGVsaXN0dGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYuZm5udW0gewotCWZsb2F0OiBsZWZ0OwotfQotCi1kaXYuZm50ZXh0IHsKLQltYXJnaW4tbGVmdDogMmVtOwotfQotCi1kaXYuc3RlcGwgewotCW1hcmdpbi1sZWZ0OiAyZW07Ci19Ci0KLWRpdi5zdGVwbG51bSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZmxvYXQ6IGxlZnQ7Ci0JbWFyZ2luLWxlZnQ6IDAuNWVtOwotfQotCi1kaXYuc3RlcGx0ZXh0IHsKLQltYXJnaW4tbGVmdDogNWVtOwotfQotCi1kaXYuc3RlcGxudW0gewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogMC41ZW07Ci19Ci0KLWRpdi5zdGVwbHRleHQgewotCW1hcmdpbi1ib3R0b206IDAuNWVtOwotCW1hcmdpbi1sZWZ0OiAzZW07Ci19Ci0KLWRpdi5sZWRpIHsKLQltYXJnaW4tbGVmdDogM2VtOwotfQotCi1kaXYubGVkZXNjIHsKLQltYXJnaW4tbGVmdDogM2VtOwotfQotCi1zcGFuLnBibGt0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi5wYmxrbGJsYm94IHsKLQlwYWRkaW5nOiAwLjVlbSAwLjVlbSAwLjVlbSAwLjVlbTsKLQlib3JkZXI6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQltYXJnaW4tdG9wOiAwLjJlbTsKLX0KLQotc3Bhbi5lZG5vdGljZXN0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4udWljb250cm9sIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotc3Bhbi50ZXJtIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotc3Bhbi5pZHhzaG93IHsKLQljb2xvcjogZ3JlZW47Ci19Ci0KLWRpdi5jb2RlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLXNwYW4ucmVma2V5IHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogd2hpdGU7Ci0JYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7Ci19Ci0KLXR0LmFwbCB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1kaXYucXVhbGlmc3RhcnQgewotCXBhZGRpbmc6IDAuMWVtIDAuNWVtIDAuNWVtIDAuNWVtOwotCWJvcmRlci10b3A6IHNvbGlkOwotCWJvcmRlci1sZWZ0OiBzb2xpZDsKLQlib3JkZXItcmlnaHQ6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tdG9wOiAwLjJlbTsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLWRpdi5xdWFsaWZlbmQgewotCXBhZGRpbmc6IDAuNWVtIDAuNWVtIDAuMWVtIDAuNWVtOwotCWJvcmRlci1ib3R0b206IHNvbGlkOwotCWJvcmRlci1sZWZ0OiBzb2xpZDsKLQlib3JkZXItcmlnaHQ6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLS5ub3NoYWRlIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKLX0KLQotLnhsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RBREFEQTsKLX0KLQotLmxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQjBCMEIwOwotfQotCi0ubWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOEM4QzhDOwotfQotCi0uZGFyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzZFNkU2RTsKLX0KLQotLnhkYXJrIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNTg1ODU4OwotfQotCi0ubGlnaHQteWVsbG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkNDOwotfQotCi0ua2hha2kgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDOTk7Ci19Ci0KLS5tZWRpdW0tYmx1ZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzY2OTlDQzsKLX0KLQotLmxpZ2h0LWJsdWUgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDRkY7Ci19Ci0KLS5taWQtZ3JleSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLX0KLQotLmxpZ2h0LWdyZXkgewotCWJhY2tncm91bmQtY29sb3I6ICNEQURBREE7Ci19Ci0KLS5saWdodGVzdC1ncmV5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTZFNkU2OwotfQotCi0jY2hhbmdlZCB7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCWxlZnQ6IDAuMmVtOwotCWNvbG9yOiAjN0I2OEVFOwotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1JTlBVVC5idXR0b25zIHsKLQlmb250LXNpemU6IDAuNzVlbTsKLQlib3JkZXItdG9wOiAwLjJlbSBvdXRzZXQgI0IxQjFCMTsKLQlib3JkZXItcmlnaHQ6IDAuMmVtIG91dHNldCAjMDAwMDAwOwotCWJvcmRlci1ib3R0b206IDAuMmVtIG91dHNldCAjMDAwMDAwOwotCWJvcmRlci1sZWZ0OiAwLjJlbSBvdXRzZXQgI0IxQjFCMTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTJFMkUyOwotCW1hcmdpbi1ib3R0b206IDAuMmVtOwotfQotCi0uY2dyYXBoaWMgewotCWZvbnQtc2l6ZTogOTAlOwotCWNvbG9yOiBibGFjazsKLX0KLQotLmFpeCwuaHB1eCwuc3VuLC51bml4LC53aW4yLC53aW5udCwud2luLC56b3MsLmxpbnV4LC5vczM5MCwub3M0MDAsLmMsLmNwbHVzcGx1cywuY29ib2wsLmZvcnRyYW4sLmphdmEsLm1hY29zeCwub3MyLC5wbDEsLnJwZwotCXsKLQliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb246IHRvcCBsZWZ0OwotCW1hcmdpbi10b3A6IDAuNWVtOwotCXRleHQtaW5kZW50OiA1NXB4OwotfQotCi0uYWl4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdhaXguZ2lmKTsKLX0KLQotLmhwdXggewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ2hwdXguZ2lmKTsKLX0KLQotLnN1biB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nc29sYXJpcy5naWYpOwotfQotCi0udW5peCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5ndW5peC5naWYpOwotfQotCi0ud2luMiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nMjAwMC5naWYpOwotfQotCi0ud2lueHAgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3hwLmdpZik7Ci19Ci0KLS53aW5udCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nbnQuZ2lmKTsKLX0KLQotLndpbiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nd2luLmdpZik7Ci19Ci0KLS56b3MgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3pvcy5naWYpOwotfQotCi0ubGludXggewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ2xpbnV4LmdpZik7Ci19Ci0KLS5vczM5MCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nMzkwLmdpZik7Ci19Ci0KLS5vczQwMCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nNDAwLmdpZik7Ci19Ci0KLS5jIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdjLmdpZik7Ci19Ci0KLS5jcGx1c3BsdXMgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ2NwcC5naWYpOwotfQotCi0uY29ib2wgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ2NvYm9sLmdpZik7Ci19Ci0KLS5mb3J0cmFuIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdmb3J0cmFuLmdpZik7Ci19Ci0KLS5qYXZhIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdqYXZhLmdpZik7Ci19Ci0KLS5tYWNvc3ggewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ21hY29zeC5naWYpOwotfQotCi0ub3MyIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdvczIuZ2lmKTsKLX0KLQotLnBsMSB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5ncGwxLmdpZik7Ci19Ci0KLS5ycGcgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3JwZy5naWYpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbmx0ci5jc3MgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb25sdHIuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmE4MTk1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbmx0ci5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzA2ICswLDAgQEAKLS8qCi0gfCAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA0LCAyMDA1IEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8KLSAKLS51bnJlc29sdmVkIHsgYmFja2dyb3VuZC1jb2xvcjogc2t5Ymx1ZTsgfQotLm5vVGVtcGxhdGUgeyBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7IH0KLQotLmJhc2UgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyB9Ci0KLS8qIEFkZCBzcGFjZSBmb3IgdG9wIGxldmVsIHRvcGljcyAqLwotLm5lc3RlZDAgeyBtYXJnaW4tdG9wIDogMWVtO30KLQotLyogZGl2IHdpdGggY2xhc3M9cCBpcyB1c2VkIGZvciBwYXJhZ3JhcGhzIHRoYXQgY29udGFpbiBibG9ja3MsIHRvIGtlZXAgdGhlIFhIVE1MIHZhbGlkICovCi0ucCB7bWFyZ2luLXRvcDogMWVtfQotCi0vKiBEZWZhdWx0IG9mIGl0YWxpY3MgdG8gc2V0IGFwYXJ0IGZpZ3VyZSBjYXB0aW9ucyAqLwotLmZpZ2NhcCB7IGZvbnQtc3R5bGU6IGl0YWxpYyB9Ci0uZmlnZGVzYyB7IGZvbnQtc3R5bGU6IG5vcm1hbCB9Ci0KLS8qIFVzZSBAZnJhbWUgdG8gY3JlYXRlIGZyYW1lcyBvbiBmaWd1cmVzICovCi0uZmlnYm9yZGVyIHsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgcGFkZGluZy1sZWZ0IDogM3B4OyBib3JkZXItd2lkdGggOiAycHg7IHBhZGRpbmctcmlnaHQgOiAzcHg7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWdzaWRlcyB7IGJvcmRlci1sZWZ0IDogMnB4IHNvbGlkOyBwYWRkaW5nLWxlZnQgOiAzcHg7IGJvcmRlci1yaWdodCA6IDJweCBzb2xpZDsgcGFkZGluZy1yaWdodCA6IDNweDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3RvcCB7IGJvcmRlci10b3AgOiAycHggc29saWQ7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWdib3R0b20geyBib3JkZXItYm90dG9tIDogMnB4IHNvbGlkOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3RvcGJvdCB7IGJvcmRlci10b3AgOiAycHggc29saWQ7IGJvcmRlci1ib3R0b20gOiAycHggc29saWQ7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLQotLyogTW9zdCBsaW5rIGdyb3VwcyBhcmUgY3JlYXRlZCB3aXRoIDxkaXY+LiBFbnN1cmUgdGhleSBoYXZlIHNwYWNlIGJlZm9yZSBhbmQgYWZ0ZXIuICovCi0udWxsaW5rcyB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZSB9Ci0udWxjaGlsZGxpbmsgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ub2xjaGlsZGxpbmsgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ubGlua2xpc3QgeyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmxpbmtsaXN0d2l0aGNoaWxkIHsgbWFyZ2luLWxlZnQ6IDEuNWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gIH0KLS5zdWJsaW5rbGlzdCB7IG1hcmdpbi1sZWZ0OiAxLjVlbTsgbWFyZ2luLWJvdHRvbTogMWVtICB9Ci0ucmVsY29uY2VwdHMgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ucmVsdGFza3MgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ucmVscmVmIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbGluZm8geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uYnJlYWRjcnVtYiB7IGZvbnQtc2l6ZSA6IHNtYWxsZXI7IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ucHJlcmVxIHsgbWFyZ2luLWxlZnQgOiAyMHB4O30KLQotLyogU2V0IGhlYWRpbmcgc2l6ZXMsIGdldHRpbmcgc21hbGxlciBmb3IgZGVlcGVyIG5lc3RpbmcgKi8KLS50b3BpY3RpdGxlMSB7IG1hcmdpbi10b3A6IDBwYzsgbWFyZ2luLWJvdHRvbTogLjFlbTsgZm9udC1zaXplOiAxLjM0ZW07IH0KLS50b3BpY3RpdGxlMiB7IG1hcmdpbi10b3A6IDFwYzsgbWFyZ2luLWJvdHRvbTogLjQ1ZW07IGZvbnQtc2l6ZTogMS4xN2VtOyB9Ci0udG9waWN0aXRsZTMgeyBtYXJnaW4tdG9wOiAxcGM7IG1hcmdpbi1ib3R0b206IC4xN2VtOyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS50b3BpY3RpdGxlNCB7IG1hcmdpbi10b3A6IC44M2VtOyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS50b3BpY3RpdGxlNSB7IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDsgfQotLnRvcGljdGl0bGU2IHsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLnNlY3Rpb250aXRsZSB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMGVtOyBjb2xvcjogYmxhY2s7IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDt9Ci0uc2VjdGlvbiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5leGFtcGxlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotCi0vKiBBbGwgbm90ZSBmb3JtYXRzIGhhdmUgdGhlIHNhbWUgZGVmYXVsdCBwcmVzZW50YXRpb24gKi8KLS5ub3RlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5ub3RldGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ubm90ZWxpc3R0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS50aXAgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnRpcHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmZhc3RwYXRoIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5mYXN0cGF0aHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmltcG9ydGFudCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uaW1wb3J0YW50dGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ucmVtZW1iZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnJlbWVtYmVydGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ucmVzdHJpY3Rpb24geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnJlc3RyaWN0aW9udGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uYXR0ZW50aW9uIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5hdHRlbnRpb250aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5kYW5nZXJ0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5kYW5nZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLmNhdXRpb250aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5jYXV0aW9uIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbi1ib3R0b20gOiAxZW07IH0KLQotLyogU2ltcGxlIGxpc3RzIGRvIG5vdCBnZXQgYSBidWxsZXQgKi8KLXVsLnNpbXBsZSB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZSB9Ci0KLS8qIFVzZWQgb24gdGhlIGZpcnN0IGNvbHVtbiBvZiBhIHRhYmxlLCB3aGVuIHJvd2hlYWRlcj0iZmlyc3Rjb2wiIGlzIHVzZWQgKi8KLS5maXJzdGNvbCB7IGZvbnQtd2VpZ2h0IDogYm9sZDt9Ci0KLS8qIFZhcmlvdXMgYmFzaWMgcGhyYXNlIHN0eWxlcyAqLwotLmJvbGQgeyBmb250LXdlaWdodDogYm9sZDsgfQotLmJvbGRJdGFsaWMgeyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0uaXRhbGljIHsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0udW5kZXJsaW5lZCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0udWljb250cm9sIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5wYXJtbmFtZSB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0ua3dkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5kZWZrd2QgeyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLS52YXIgeyBmb250LXN0eWxlIDogaXRhbGljO30KLS5zaG9ydGN1dCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0KLS8qIERlZmF1bHQgb2YgYm9sZCBmb3IgZGVmaW5pdGlvbiBsaXN0IHRlcm1zICovCi0uZGx0ZXJtIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLQotLyogVXNlIENTUyB0byBleHBhbmQgbGlzdHMgd2l0aCBAY29tcGFjdD0ibm8iICovCi0uZGx0ZXJtZXhwYW5kIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbi10b3A6IDFlbTsgfQotKltjb21wYWN0PSJ5ZXMiXT5saSB7IG1hcmdpbi10b3A6IDBlbTt9Ci0qW2NvbXBhY3Q9Im5vIl0+bGkgeyBtYXJnaW4tdG9wOiAuNTNlbTt9CQotLmxpZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnNsaWV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5kbGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5kZGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zdGVwZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnN1YnN0ZXBleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0KLS8qIEFsaWduIGltYWdlcyBiYXNlZCBvbiBAYWxpZ24gb24gdG9waWMvaW1hZ2UgKi8KLWRpdi5pbWFnZWxlZnQgeyB0ZXh0LWFsaWduOiBsZWZ0IH0KLWRpdi5pbWFnZWNlbnRlciB7IHRleHQtYWxpZ246IGNlbnRlciB9Ci1kaXYuaW1hZ2VyaWdodCB7IHRleHQtYWxpZ246IHJpZ2h0IH0KLWRpdi5pbWFnZWp1c3RpZnkgeyB0ZXh0LWFsaWduOiBqdXN0aWZ5IH0KLQotcHJlLnNjcmVlbiB7IHBhZGRpbmc6IDVweCA1cHggNXB4IDVweDsgYm9yZGVyOiBvdXRzZXQ7IGJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7IG1hcmdpbi10b3A6IDJweDsgbWFyZ2luLWJvdHRvbSA6IDJweDsgd2hpdGUtc3BhY2U6IHByZX0KLQotLyogY29waWVkIGZyb20gY29tbW9uLmNzcyAqLwotYm9keSB7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMC44ZW07Ci0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLQljb2xvcjogQmxhY2s7Ci0JbWFyZ2luLXJpZ2h0OiA1ZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uaWJtZmlsZXBhdGggewotCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci0JZm9udC1zaXplOiAxMDAlOwotfQotCi0uaWJtY29tbWFuZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5pYm1lbXBoYXNpcyB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0ubXYsLnBrLC5wa2RlZiwucHYgewotCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci0JZm9udC1zaXplOiAxMDAlOwotCXBhZGRpbmctdG9wOiAwZW07Ci0JcGFkZGluZy1yaWdodDogLjNlbTsKLQlwYWRkaW5nLWJvdHRvbTogMGVtOwotCXBhZGRpbmctbGVmdDogLjNlbTsKLX0KLQotdHQsc2FtcCB7Ci0JZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKLQlmb250LXNpemU6IDEwMCU7Ci19Ci0KLUJPRFkubmF2IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotCWJvcmRlci1yaWdodDogMC4yZW0gcmlkZ2UgYmxhY2s7Ci0JZm9udC1zaXplOiAwLjk1ZW07Ci19Ci0KLS5iYXNlIHsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXZhcmlhbnQ6IG5vcm1hbDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLX0KLQotVEFCTEUgewotCWNvbG9yOiBibGFjazsKLQl3aWR0aDogOTAlOwotCWJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7Ci0JYm9yZGVyLWNvbG9yOiBCbGFjazsKLQliYWNrZ3JvdW5kOiB3aGl0ZTsKLQltYXJnaW4tdG9wOiAwLjVlbTsKLQltYXJnaW4tYm90dG9tOiAwLjVlbTsKLQltYXJnaW4tbGVmdDogMGVtOwotCW1hcmdpbi1yaWdodDogMGVtOwotfQotCi0udGJsZGVzYyB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1USCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQljb2xvcjogYmxhY2s7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RhZGFkYTsKLQlwYWRkaW5nLXRvcDogMC4xZW07Ci0JcGFkZGluZy1ib3R0b206IDAuM2VtOwotCXBhZGRpbmctbGVmdDogMWVtOwotCXBhZGRpbmctcmlnaHQ6IDFlbTsKLX0KLQotVEguYmFzZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JY29sb3I6IGJsYWNrOwotCWJvcmRlcjogMSBzb2xpZCAjNjA2MDYwOwotCWJhY2tncm91bmQtY29sb3I6ICNkY2RhZGE7Ci0JcGFkZGluZy10b3A6IDAuNjVlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC42NWVtOwotCXBhZGRpbmctbGVmdDogMWVtOwotCXBhZGRpbmctcmlnaHQ6IDFlbTsKLX0KLQotVEQgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JY29sb3I6IGJsYWNrOwotCWJhY2tncm91bmQtY29sb3I6IHdoaXRlOwotCXBhZGRpbmctdG9wOiAwLjFlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC4zZW07Ci0JcGFkZGluZy1sZWZ0OiAxZW07Ci0JcGFkZGluZy1yaWdodDogMWVtOwotfQotCi1DSVRFIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLUVNIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLVNUUk9ORyB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWNhcHRpb24gewotCXRleHQtYWxpZ246IGxlZnQ7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1EVCB7Ci0JbWFyZ2luLXRvcDogMC41ZW07Ci0JbWFyZ2luLWJvdHRvbTogMC41ZW07Ci19Ci0KLUREIHsKLQltYXJnaW4tbGVmdDogMS4wZW07Ci19Ci0KLVBSRSxwcmUuY2dyYXBoaWMgewotCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci0JZm9udC1zaXplOiAxMnB4OwotCWJhY2tncm91bmQtY29sb3I6ICNkYWRhZGE7Ci0JcGFkZGluZzogNXB4OwotfQotCi0uaXRhbGljIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5ib2xkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnVuZGVybGluZWQgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uYm9sZC1pdGFsaWMsLmJvbGRJdGFsaWMgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLnNtYWxsQ2Fwcywuc21hbGxjYXBzIHsKLQl0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwotCWZvbnQtc2l6ZTogc21hbGxlcjsKLQlmb250LXZhcmlhbnQ6IHNtYWxsLWNhcHM7Ci19Ci0KLS5pdGFsaWMtdW5kZXJsaW5lZCB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uYm9sZC11bmRlcmxpbmVkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmJvbGQtaXRhbGljLXVuZGVybGluZWQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLnNtYWxsY2Fwcy11bmRlcmxpbmVkIHsKLQlmb250LXZhcmlhbnQ6IHNtYWxsLWNhcHM7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5lbXBoYXNpcyB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uaW5saW5lZGVmIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5zaWRlYmFyIHsKLQliYWNrZ3JvdW5kOiAjY2NjY2NjOwotfQotCi1BOmxpbmsgewotCWNvbG9yOiAjMDA2Njk5OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1BOnZpc2l0ZWQgewotCWNvbG9yOiAjOTk2Njk5OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1BOmFjdGl2ZSB7Ci0JY29sb3I6ICMwMDY2OTk7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLUE6aG92ZXIgewotCWNvbG9yOiAjOTk2Njk5OzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS50b2NsaW5rOmxpbmsgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50b2NsaW5rOmFjdGl2ZSB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRvY2xpbms6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRvY2xpbms6aG92ZXIgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hLnB0b2NsaW5rOmxpbmsgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5wdG9jbGluazphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5wdG9jbGluazp2aXNpdGVkIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEucHRvY2xpbms6aG92ZXIgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hLmluZGV4bGluazpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuaW5kZXhsaW5rOmFjdGl2ZSB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmluZGV4bGluazp2aXNpdGVkIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuaW5kZXhsaW5rOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS5maWd1cmVsaXN0OmxpbmsgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5maWd1cmVsaXN0OmFjdGl2ZSB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmZpZ3VyZWxpc3Q6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmZpZ3VyZWxpc3Q6aG92ZXIgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hLnRhYmxlbGlzdDpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEudGFibGVsaXN0OmFjdGl2ZSB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRhYmxlbGlzdDp2aXNpdGVkIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEudGFibGVsaXN0OmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS5ib2xkZ3JleWxpbms6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXNpemU6IDAuOWVtOwotfQotCi1hLmJvbGRncmV5bGluazp2aXNpdGVkIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc2l6ZTogMC45ZW07Ci19Ci0KLWEuYm9sZGdyZXlsaW5rOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zaXplOiAwLjllbTsKLX0KLQotLnJ1bm5pbmdoZWFkZXIgewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDAuN2VtOwotfQotCi0ucnVubmluZ2Zvb3RlciB7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMC43ZW07Ci19Ci0KLS5ydW5uaW5nZm9vdGVyIGE6bGluayB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0ucnVubmluZ2Zvb3RlciBhOmFjdGl2ZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0ucnVubmluZ2Zvb3RlciBhOnZpc2l0ZWQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgYTpob3ZlciB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLSNicmVhZGNydW1iLC5icmVhZGNydW1iLHNwYW4uYnJlYWRjcnVtYnMgewotCWZvbnQtc2l6ZTogMC43NWVtOwotfQotCi0uZmFzdHBhdGggewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5mYXN0cGF0aHRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnRvYyB7Ci0JZm9udC1zaXplOiBzbWFsbDsKLX0KLQotLm5lc3RlZDAgewotCW1hcmdpbi10b3A6IDBlbTsKLX0KLQotLnAgewotCW1hcmdpbi10b3A6IDFlbTsKLX0KLQotc3Bhbi5maWdjYXAgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi5maWdkZXNjIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLWRpdi5maWdib3ggewotCQotfQotCi1kaXYuZmlncnVsZXMgewotCQotfQotCi1kaXYuZmlnbm9uZSB7Ci0JCi19Ci0KLS5maWdub25lIHsKLQkKLX0KLQotLmZpZ2JvcmRlciB7Ci0JCi19Ci0KLS5maWdzaWRlcyB7Ci0JCi19Ci0KLS5maWd0b3AgewotCQotfQotCi0uZmlnYm90dG9tIHsKLQkKLX0KLQotLmZpZ3RvcGJvdCB7Ci0JCi19Ci0KLS5wYXJlbnRsaW5rIHsKLQkKLX0KLQotLnByZXZsaW5rIHsKLQkKLX0KLQotLm5leHRsaW5rIHsKLQkKLX0KLQotLnJlbGNvbmNlcHRzaGQgewotCQotfQotCi0ucmVsdGFza3NoZCB7Ci0JCi19Ci0KLS5yZWxyZWZoZCB7Ci0JCi19Ci0KLS5zeW5ub25lIHsKLQkKLX0KLQotLnN5bmJvcmRlciB7Ci0JCi19Ci0KLS5zeW5zaWRlcyB7Ci0JCi19Ci0KLS5zeW50b3AgewotCQotfQotCi0uc3luYm90dG9tIHsKLQkKLX0KLQotLnN5bnRvcGJvdCB7Ci0JCi19Ci0KLS5za2lwIHsKLQltYXJnaW4tdG9wOiAxZW07Ci19Ci0KLS5za2lwc3BhY2UgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS51bGNoaWxkbGluayB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLm9sY2hpbGRsaW5rIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi11bCxvbCB7Ci0JbWFyZ2luLXRvcDogMC4xZW07Ci0JcGFkZGluZy10b3A6IDAuMWVtOwotfQotCi11bC5zaW1wbGUgewotCWxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKLX0KLQotdWwuaW5kZXhsaXN0IHsKLQlsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Ci19Ci0KLU9MIExJIHsKLQltYXJnaW4tdG9wOiAwLjBlbTsKLQltYXJnaW4tYm90dG9tOiAwLjBlbTsKLQltYXJnaW4tbGVmdDogMC4wZW07Ci19Ci0KLVVMIExJIHsKLQltYXJnaW4tdG9wOiAwLjBlbTsKLQltYXJnaW4tYm90dG9tOiAwLjBlbTsKLQltYXJnaW4tbGVmdDogMC4wZW07Ci19Ci0KLU9MIExJIERJViBQIHsKLQlsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWw7Ci0JbWFyZ2luLXRvcDogMC4yZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci19Ci0KLVVMIExJIERJViBQIHsKLQlsaXN0LXN0eWxlLXR5cGU6IGRpc2M7Ci0JbWFyZ2luLXRvcDogMC4yZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci19Ci0KLSogW2NvbXBhY3Q9InllcyJdPmxpIHsKLQltYXJnaW4tdG9wOiAwIGVtOwotfQotCi0qIFtjb21wYWN0PSJubyJdPmxpIHsKLQltYXJnaW4tdG9wOiAwLjVlbTsKLX0KLQotaHIgewotCW1hcmdpbi1ib3R0b206IDBlbTsKLQltYXJnaW4tdG9wOiAwZW07Ci0JcGFkZGluZy10b3A6IDBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMGVtOwotCXdpZHRoOiA5MCU7Ci0JY29sb3I6ICNjY2NjY2M7Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi1IMSwudGl0bGUsLnBhZ2V0aXRsZSwudG9waWN0aXRsZTEgewotCWZvbnQtc2l6ZTogMS41ZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDAuNWVtOwotCXdvcmQtc3BhY2luZzogMC4xZW07Ci19Ci0KLUgyLC5zdWJ0aXRsZSwucGFnZXN1YnRpdGxlLC50b3BpY3RpdGxlMiB7Ci0JZm9udC1zaXplOiAxLjI1ZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDAuMGVtOwotCXBhZGRpbmctYm90dG9tOiAwLjBlbTsKLX0KLQotSDMsLmJvbGR0aXRsZSwudG9waWN0aXRsZTMgewotCWZvbnQtc2l6ZTogMS4wZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDAuMmVtOwotCXBhZGRpbmctYm90dG9tOiAwLjFlbTsKLX0KLQotSDQsLnRvcGljdGl0bGU0IHsKLQlmb250LXNpemU6IDAuOWVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjFlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC4xZW07Ci19Ci0KLWg1LC50b3BpY3RpdGxlNSB7Ci0JZm9udC1zaXplOiAwLjhlbTsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMGVtOwotCXBhZGRpbmctYm90dG9tOiAwZW07Ci19Ci0KLWg2LC50b3BpY3RpdGxlNiB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMGVtOwotCXBhZGRpbmctYm90dG9tOiAwZW07Ci19Ci0KLWRpdi5oZWFkdGl0bGUgewotCWZvbnQtc2l6ZTogMWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1sZWZ0OiAwZW07Ci19Ci0KLWRpdi5oZWFkMCB7Ci0JZm9udC1zaXplOiAwLjllbTsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tbGVmdDogMGVtOwotCW1hcmdpbi10b3A6IDAuNWVtOwotfQotCi1kaXYuaGVhZDEgewotCWZvbnQtc2l6ZTogMC44ZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWxlZnQ6IDFlbTsKLQlwYWRkaW5nLXRvcDogMC41ZW07Ci19Ci0KLWRpdi5oZWFkMiB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCW1hcmdpbi1sZWZ0OiAyZW07Ci19Ci0KLWRpdi5oZWFkMyB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCW1hcmdpbi1sZWZ0OiAzZW07Ci19Ci0KLWRpdi5oZWFkNCB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCW1hcmdpbi1sZWZ0OiA0ZW07Ci19Ci0KLWRpdi5oZWFkNSB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCW1hcmdpbi1sZWZ0OiA1ZW07Ci19Ci0KLWRpdi5oZWFkNiB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCW1hcmdpbi1sZWZ0OiA2ZW07Ci19Ci0KLWRpdi5oZWFkNyB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCW1hcmdpbi1sZWZ0OiA3ZW07Ci19Ci0KLWRpdi5oZWFkOCB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCW1hcmdpbi1sZWZ0OiA4ZW07Ci19Ci0KLWRpdi5oZWFkOSB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCW1hcmdpbi1sZWZ0OiA5ZW07Ci19Ci0KLS50aXAgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS50aXB0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5maXJzdGNvbCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5wdG9jSDEgewotCWZvbnQtc2l6ZTogeC1zbWFsbDsKLX0KLQotLnB0b2NIMiB7Ci0JZm9udC1zaXplOiB4LXNtYWxsOwotfQotCi0uc3RpdGxlIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5udGUgewotCQotfQotCi0ueHhsaW5lcyB7Ci0Jd2hpdGUtc3BhY2U6IHByZTsKLQlmb250LXNpemU6IDAuOTVlbTsKLX0KLQotLnNlY3Rpb250aXRsZSB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDBlbTsKLQljb2xvcjogYmxhY2s7Ci0JZm9udC1zaXplOiAxLjJlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotZGl2LmltYWdlbGVmdCB7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotZGl2LmltYWdlY2VudGVyIHsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLWRpdi5pbWFnZXJpZ2h0IHsKLQl0ZXh0LWFsaWduOiByaWdodDsKLX0KLQotZGl2LmltYWdlanVzdGlmeSB7Ci0JdGV4dC1hbGlnbjoganVzdGlmeTsKLX0KLQotZGl2Lm1tb2JqIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCXRleHQtYWxpZ246IGNlbnRlcjsKLX0KLQotZGl2Lm1tb2JqbGVmdCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi1kaXYubW1vYmpjZW50ZXIgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi1kaXYubW1vYmpyaWdodCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLQl0ZXh0LWFsaWduOiByaWdodDsKLX0KLQotcHJlLnNjcmVlbiB7Ci0JcGFkZGluZzogMWVtIDFlbSAxZW0gMWVtOwotCW1hcmdpbi10b3A6IDAuNGVtOwotCW1hcmdpbi1ib3R0b206IDAuNGVtOwotCWJvcmRlcjogdGhpbiBzb2xpZCBCbGFjazsKLQlmb250LXNpemU6IDEwMCU7Ci19Ci0KLS5wcmVyZXEgewotCW1hcmdpbi1sZWZ0OiAxLjVlbTsKLX0KLQotLmRlZkxpc3RIZWFkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotc3Bhbi5tdiB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1zcGFuLm1kIHsKLQl0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsKLX0KLQotLnBrLHNwYW4ucGsgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1zcGFuLnBrZGVmIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotc3Bhbi5wdiB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1zcGFuLnB2ZGVmIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLXNwYW4ua3dkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotc3Bhbi5rZHdkZWYgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0ucGFybUxpc3RLd2QgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0ucGFybUxpc3RWYXIgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi5vcGVyIHsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci19Ci0KLXNwYW4ub3BlcmRlZiB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLVZBUixzcGFuLnZhciB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1zcGFuLnZhcmRlZiB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1kaXYubXNnIHsKLQlwYWRkaW5nOiAwLjJlbSAxZW0gMWVtIDFlbTsKLQltYXJnaW4tdG9wOiAwLjRlbTsKLQltYXJnaW4tYm90dG9tOiAwLjRlbTsKLX0KLQotZGl2Lm1zZ251bSB7Ci0JZmxvYXQ6IGxlZnQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCW1hcmdpbi1yaWdodDogMWVtOwotfQotCi1kaXYubXNndGV4dCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi1kaXYubXNnaXRlbXRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotcC5tc2dpdGVtIHsKLQltYXJnaW4tdG9wOiAwZW07Ci19Ci0KLS5hdHRlbnRpb24sZGl2LmF0dGVudGlvbiB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmF0dGVudGlvbnRpdGxlLHNwYW4uYXR0ZW50aW9udGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uY2F1dGlvbnRpdGxlLGRpdi5jYXV0aW9udGl0bGUgewotCW1hcmdpbi10b3A6IDFlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmNhdXRpb24sZGl2LmNhdXRpb24gewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5kYW5nZXIsZGl2LmRhbmdlciB7Ci0JcGFkZGluZzogMC41ZW0gMC41ZW0gMC41ZW0gMC41ZW07Ci0JYm9yZGVyOiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLXRvcDogMC4yZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uZGFuZ2VydGl0bGUsZGl2LmRhbmdlcnRpdGxlIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5pbXBvcnRhbnQgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5pbXBvcnRhbnR0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5yZW1lbWJlciB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLnJlbWVtYmVydGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0ucmVzdHJpY3Rpb24gewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5yZXN0cmljdGlvbnRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotZGl2Lndhcm5pbmd0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi53YXJuaW5nYm9keSB7Ci0JbWFyZ2luLWxlZnQ6IDJlbQotfQotCi0ubm90ZSB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLm5vdGV0aXRsZSxkaXYubm90ZXRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotZGl2Lm5vdGVib2R5IHsKLQltYXJnaW4tbGVmdDogMmVtOwotfQotCi1kaXYubm90ZWxpc3R0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi5mbm51bSB7Ci0JZmxvYXQ6IGxlZnQ7Ci19Ci0KLWRpdi5mbnRleHQgewotCW1hcmdpbi1sZWZ0OiAyZW07Ci19Ci0KLWRpdi5zdGVwbCB7Ci0JbWFyZ2luLWxlZnQ6IDJlbTsKLX0KLQotZGl2LnN0ZXBsbnVtIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogMC41ZW07Ci19Ci0KLWRpdi5zdGVwbHRleHQgewotCW1hcmdpbi1sZWZ0OiA1ZW07Ci19Ci0KLWRpdi5zdGVwbG51bSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZsb2F0OiBsZWZ0OwotCW1hcmdpbi1sZWZ0OiAwLjVlbTsKLX0KLQotZGl2LnN0ZXBsdGV4dCB7Ci0JbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0JbWFyZ2luLWxlZnQ6IDNlbTsKLX0KLQotZGl2LmxlZGkgewotCW1hcmdpbi1sZWZ0OiAzZW07Ci19Ci0KLWRpdi5sZWRlc2MgewotCW1hcmdpbi1sZWZ0OiAzZW07Ci19Ci0KLXNwYW4ucGJsa3RpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotZGl2LnBibGtsYmxib3ggewotCXBhZGRpbmc6IDAuNWVtIDAuNWVtIDAuNWVtIDAuNWVtOwotCWJvcmRlcjogc29saWQ7Ci0JYm9yZGVyLXdpZHRoOiB0aGluOwotCW1hcmdpbi10b3A6IDAuMmVtOwotfQotCi1zcGFuLmVkbm90aWNlc3RpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotc3Bhbi50ZXJtIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotc3Bhbi5pZHhzaG93IHsKLQljb2xvcjogZ3JlZW47Ci19Ci0KLWRpdi5jb2RlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLXNwYW4ucmVma2V5IHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogd2hpdGU7Ci0JYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7Ci19Ci0KLXR0LmFwbCB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1kaXYucXVhbGlmc3RhcnQgewotCXBhZGRpbmc6IDAuMWVtIDAuNWVtIDAuNWVtIDAuNWVtOwotCWJvcmRlci10b3A6IHNvbGlkOwotCWJvcmRlci1sZWZ0OiBzb2xpZDsKLQlib3JkZXItcmlnaHQ6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tdG9wOiAwLjJlbTsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLWRpdi5xdWFsaWZlbmQgewotCXBhZGRpbmc6IDAuNWVtIDAuNWVtIDAuMWVtIDAuNWVtOwotCWJvcmRlci1ib3R0b206IHNvbGlkOwotCWJvcmRlci1sZWZ0OiBzb2xpZDsKLQlib3JkZXItcmlnaHQ6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLS5ub3NoYWRlIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKLX0KLQotLnhsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RBREFEQTsKLX0KLQotLmxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQjBCMEIwOwotfQotCi0ubWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOEM4QzhDOwotfQotCi0uZGFyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzZFNkU2RTsKLX0KLQotLnhkYXJrIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNTg1ODU4OwotfQotCi0ubGlnaHQteWVsbG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkNDOwotfQotCi0ua2hha2kgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDOTk7Ci19Ci0KLS5tZWRpdW0tYmx1ZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzY2OTlDQzsKLX0KLQotLmxpZ2h0LWJsdWUgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDRkY7Ci19Ci0KLS5taWQtZ3JleSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLX0KLQotLmxpZ2h0LWdyZXkgewotCWJhY2tncm91bmQtY29sb3I6ICNEQURBREE7Ci19Ci0KLS5saWdodGVzdC1ncmV5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTZFNkU2OwotfQotCi0jY2hhbmdlZCB7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCWxlZnQ6IDAuMmVtOwotCWNvbG9yOiAjN0I2OEVFOwotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1JTlBVVC5idXR0b25zIHsKLQlmb250LXNpemU6IDAuNzVlbTsKLQlib3JkZXItdG9wOiAwLjJlbSBvdXRzZXQgI0IxQjFCMTsKLQlib3JkZXItcmlnaHQ6IDAuMmVtIG91dHNldCAjMDAwMDAwOwotCWJvcmRlci1ib3R0b206IDAuMmVtIG91dHNldCAjMDAwMDAwOwotCWJvcmRlci1sZWZ0OiAwLjJlbSBvdXRzZXQgI0IxQjFCMTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTJFMkUyOwotCW1hcmdpbi1ib3R0b206IDAuMmVtOwotfQotCi0uY2dyYXBoaWMgewotCWZvbnQtc2l6ZTogOTAlOwotCWNvbG9yOiBibGFjazsKLX0KLQotLmFpeCwuaHB1eCwuc3VuLC51bml4LC53aW4yLC53aW5udCwud2luLC56b3MsLmxpbnV4LC5vczM5MCwub3M0MDAsLmMsLmNwbHVzcGx1cywuY29ib2wsLmZvcnRyYW4sLmphdmEsLm1hY29zeCwub3MyLC5wbDEsLnJwZwotCXsKLQliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb246IHRvcCBsZWZ0OwotCW1hcmdpbi10b3A6IDAuNWVtOwotCXRleHQtaW5kZW50OiA1NXB4OwotfQotCi0uYWl4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdhaXguZ2lmKTsKLX0KLQotLmhwdXggewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ2hwdXguZ2lmKTsKLX0KLQotLnN1biB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nc29sYXJpcy5naWYpOwotfQotCi0udW5peCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5ndW5peC5naWYpOwotfQotCi0ud2luMiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nMjAwMC5naWYpOwotfQotCi0ud2lueHAgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3hwLmdpZik7Ci19Ci0KLS53aW5udCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nbnQuZ2lmKTsKLX0KLQotLndpbiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nd2luLmdpZik7Ci19Ci0KLS56b3MgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3pvcy5naWYpOwotfQotCi0ubGludXggewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ2xpbnV4LmdpZik7Ci19Ci0KLS5vczM5MCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nMzkwLmdpZik7Ci19Ci0KLS5vczQwMCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nNDAwLmdpZik7Ci19Ci0KLS5jIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdjLmdpZik7Ci19Ci0KLS5jcGx1c3BsdXMgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ2NwcC5naWYpOwotfQotCi0uY29ib2wgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ2NvYm9sLmdpZik7Ci19Ci0KLS5mb3J0cmFuIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdmb3J0cmFuLmdpZik7Ci19Ci0KLS5qYXZhIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdqYXZhLmdpZik7Ci19Ci0KLS5tYWNvc3ggewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ21hY29zeC5naWYpOwotfQotCi0ub3MyIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdvczIuZ2lmKTsKLX0KLQotLnBsMSB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5ncGwxLmdpZik7Ci19Ci0KLS5ycGcgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3JwZy5naWYpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbnJ0bC5jc3MgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb25ydGwuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzUwYjAxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbnJ0bC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSB8IChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDQsIDIwMDUgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqLwotIAotLnVucmVzb2x2ZWQgeyBiYWNrZ3JvdW5kLWNvbG9yOiBza3libHVlOyB9Ci0ubm9UZW1wbGF0ZSB7IGJhY2tncm91bmQtY29sb3I6IHllbGxvdzsgfQotCi0uYmFzZSB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7IH0KLQotLyogQWRkIHNwYWNlIGZvciB0b3AgbGV2ZWwgdG9waWNzICovCi0ubmVzdGVkMCB7IG1hcmdpbi10b3AgOiAxZW07fQotCi0vKiBkaXYgd2l0aCBjbGFzcz1wIGlzIHVzZWQgZm9yIHBhcmFncmFwaHMgdGhhdCBjb250YWluIGJsb2NrcywgdG8ga2VlcCB0aGUgWEhUTUwgdmFsaWQgKi8KLS5wIHttYXJnaW4tdG9wOiAxZW19Ci0KLS8qIERlZmF1bHQgb2YgaXRhbGljcyB0byBzZXQgYXBhcnQgZmlndXJlIGNhcHRpb25zICovCi0uZmlnY2FwIHsgZm9udC1zdHlsZTogaXRhbGljIH0KLS5maWdkZXNjIHsgZm9udC1zdHlsZTogbm9ybWFsIH0KLQotLyogVXNlIEBmcmFtZSB0byBjcmVhdGUgZnJhbWVzIG9uIGZpZ3VyZXMgKi8KLS5maWdib3JkZXIgeyBib3JkZXItc3R5bGU6IHNvbGlkOyBwYWRkaW5nLWxlZnQgOiAzcHg7IGJvcmRlci13aWR0aCA6IDJweDsgcGFkZGluZy1yaWdodCA6IDNweDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3NpZGVzIHsgYm9yZGVyLWxlZnQgOiAycHggc29saWQ7IHBhZGRpbmctbGVmdCA6IDNweDsgYm9yZGVyLXJpZ2h0IDogMnB4IHNvbGlkOyBwYWRkaW5nLXJpZ2h0IDogM3B4OyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uZmlndG9wIHsgYm9yZGVyLXRvcCA6IDJweCBzb2xpZDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ2JvdHRvbSB7IGJvcmRlci1ib3R0b20gOiAycHggc29saWQ7IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uZmlndG9wYm90IHsgYm9yZGVyLXRvcCA6IDJweCBzb2xpZDsgYm9yZGVyLWJvdHRvbSA6IDJweCBzb2xpZDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotCi0vKiBNb3N0IGxpbmsgZ3JvdXBzIGFyZSBjcmVhdGVkIHdpdGggPGRpdj4uIEVuc3VyZSB0aGV5IGhhdmUgc3BhY2UgYmVmb3JlIGFuZCBhZnRlci4gKi8KLS51bGxpbmtzIHsgbGlzdC1zdHlsZS10eXBlOiBub25lIH0KLS51bGNoaWxkbGluayB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5vbGNoaWxkbGluayB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5saW5rbGlzdCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5saW5rbGlzdHdpdGhjaGlsZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLXJpZ2h0OiAxLjVlbTsgbWFyZ2luLWJvdHRvbTogMWVtICB9Ci0uc3VibGlua2xpc3QgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1yaWdodDogMS41ZW07IG1hcmdpbi1ib3R0b206IDFlbSAgfQotLnJlbGNvbmNlcHRzIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbHRhc2tzIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbHJlZiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5yZWxpbmZvIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmJyZWFkY3J1bWIgeyBmb250LXNpemUgOiBzbWFsbGVyOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnByZXJlcSB7IG1hcmdpbi1yaWdodCA6IDIwcHg7fQotCi0vKiBTZXQgaGVhZGluZyBzaXplcywgZ2V0dGluZyBzbWFsbGVyIGZvciBkZWVwZXIgbmVzdGluZyAqLwotLnRvcGljdGl0bGUxIHsgbWFyZ2luLXRvcDogMHBjOyBtYXJnaW4tYm90dG9tOiAuMWVtOyBmb250LXNpemU6IDEuMzRlbTsgfQotLnRvcGljdGl0bGUyIHsgbWFyZ2luLXRvcDogMXBjOyBtYXJnaW4tYm90dG9tOiAuNDVlbTsgZm9udC1zaXplOiAxLjE3ZW07IH0KLS50b3BpY3RpdGxlMyB7IG1hcmdpbi10b3A6IDFwYzsgbWFyZ2luLWJvdHRvbTogLjE3ZW07IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDsgfQotLnRvcGljdGl0bGU0IHsgbWFyZ2luLXRvcDogLjgzZW07IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDsgfQotLnRvcGljdGl0bGU1IHsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0udG9waWN0aXRsZTYgeyBmb250LXNpemU6IDEuMTdlbTsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0uc2VjdGlvbnRpdGxlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAwZW07IGNvbG9yOiBibGFjazsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtd2VpZ2h0OiBib2xkO30KLS5zZWN0aW9uIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmV4YW1wbGUgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0KLS8qIEFsbCBub3RlIGZvcm1hdHMgaGF2ZSB0aGUgc2FtZSBkZWZhdWx0IHByZXNlbnRhdGlvbiAqLwotLm5vdGUgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLm5vdGV0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5ub3RlbGlzdHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLnRpcCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0udGlwdGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uZmFzdHBhdGggeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLmZhc3RwYXRodGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uaW1wb3J0YW50IHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5pbXBvcnRhbnR0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5yZW1lbWJlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0ucmVtZW1iZXJ0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5yZXN0cmljdGlvbiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0ucmVzdHJpY3Rpb250aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5hdHRlbnRpb24geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLmF0dGVudGlvbnRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmRhbmdlcnRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmRhbmdlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uY2F1dGlvbnRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmNhdXRpb24geyBmb250LXdlaWdodDogYm9sZDsgbWFyZ2luLWJvdHRvbSA6IDFlbTsgfQotCi0vKiBTaW1wbGUgbGlzdHMgZG8gbm90IGdldCBhIGJ1bGxldCAqLwotdWwuc2ltcGxlIHsgbGlzdC1zdHlsZS10eXBlOiBub25lIH0KLQotLyogVXNlZCBvbiB0aGUgZmlyc3QgY29sdW1uIG9mIGEgdGFibGUsIHdoZW4gcm93aGVhZGVyPSJmaXJzdGNvbCIgaXMgdXNlZCAqLwotLmZpcnN0Y29sIHsgZm9udC13ZWlnaHQgOiBib2xkO30KLQotLyogVmFyaW91cyBiYXNpYyBwaHJhc2Ugc3R5bGVzICovCi0uYm9sZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0uYm9sZEl0YWxpYyB7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLS5pdGFsaWMgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLS51bmRlcmxpbmVkIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLS51aWNvbnRyb2wgeyBmb250LXdlaWdodDogYm9sZDsgfQotLnBhcm1uYW1lIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5rd2QgeyBmb250LXdlaWdodDogYm9sZDsgfQotLmRlZmt3ZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotLnZhciB7IGZvbnQtc3R5bGUgOiBpdGFsaWM7fQotLnNob3J0Y3V0IHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLQotLyogRGVmYXVsdCBvZiBib2xkIGZvciBkZWZpbml0aW9uIGxpc3QgdGVybXMgKi8KLS5kbHRlcm0geyBmb250LXdlaWdodDogYm9sZDsgfQotCi0vKiBVc2UgQ1NTIHRvIGV4cGFuZCBsaXN0cyB3aXRoIEBjb21wYWN0PSJubyIgKi8KLS5kbHRlcm1leHBhbmQgeyBmb250LXdlaWdodDogYm9sZDsgbWFyZ2luLXRvcDogMWVtOyB9Ci0qW2NvbXBhY3Q9InllcyJdPmxpIHsgbWFyZ2luLXRvcDogMGVtO30KLSpbY29tcGFjdD0ibm8iXT5saSB7IG1hcmdpbi10b3A6IC41M2VtO30KLS5saWV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zbGlleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZGxleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZGRleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc3RlcGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zdWJzdGVwZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotCi0vKiBBbGlnbiBpbWFnZXMgYmFzZWQgb24gQGFsaWduIG9uIHRvcGljL2ltYWdlICovCi1kaXYuaW1hZ2VsZWZ0IHsgdGV4dC1hbGlnbjogbGVmdCB9Ci1kaXYuaW1hZ2VjZW50ZXIgeyB0ZXh0LWFsaWduOiBjZW50ZXIgfQotZGl2LmltYWdlcmlnaHQgeyB0ZXh0LWFsaWduOiByaWdodCB9Ci1kaXYuaW1hZ2VqdXN0aWZ5IHsgdGV4dC1hbGlnbjoganVzdGlmeSB9Ci0KLXByZS5zY3JlZW4geyBwYWRkaW5nOiA1cHggNXB4IDVweCA1cHg7IGJvcmRlcjogb3V0c2V0OyBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOyBtYXJnaW4tdG9wOiAycHg7IG1hcmdpbi1ib3R0b20gOiAycHg7IHdoaXRlLXNwYWNlOiBwcmV9Ci0KLQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1NlbGVjdEV4aXN0aW5nU2VydmVyLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9TZWxlY3RFeGlzdGluZ1NlcnZlci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OGRiZTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1NlbGVjdEV4aXN0aW5nU2VydmVyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9TZWxlY3ROZXdTZXJ2ZXIuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1NlbGVjdE5ld1NlcnZlci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZjZiNDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1NlbGVjdE5ld1NlcnZlci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmUxLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDY0YmI4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTEuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlMi5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmUyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhNDM0Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmUyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTMuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlMy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkODdkMGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmU0LmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzM0YmJmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlNS5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmU1LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0NjE0ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmU1LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZTk5TC5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2U5OUwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDZhYmRiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZTk5TC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VFSjkuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlRUo5LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU3MzUwZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VFSjkuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlSUFJLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZUlBSS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZjYyNWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlSUFJLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZUxLRi5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VMS0YuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjk4ZjQyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZUxLRi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VPNzguanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlTzc4LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwNzdmOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VPNzguanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlVTcxLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZVU3MS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTA0MzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlVTcxLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9ub3RlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9ub3RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYyNjBkYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvbm90ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvc2VsZWN0Um9vdEVsZW1lbnREVEQucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3NlbGVjdFJvb3RFbGVtZW50RFRELnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVmMjYwZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvc2VsZWN0Um9vdEVsZW1lbnREVEQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3NlbGVjdFJvb3RFbGVtZW50WFNELnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9zZWxlY3RSb290RWxlbWVudFhTRC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NTVlZDMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3NlbGVjdFJvb3RFbGVtZW50WFNELnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiODQ0Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbF9tYWluLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsX21haW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjA3NGU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsX21haW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItYmFja2J1dHRvbi5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1iYWNrYnV0dG9uLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjZDFjNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1iYWNrYnV0dG9uLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLWJpbmRpbmcuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItYmluZGluZy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNzRkNTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItYmluZGluZy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1jb21wbGV4LXR5cGUuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItY29tcGxleC10eXBlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkNjA3MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1jb21wbGV4LXR5cGUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItZmluaXNoZWQtd3NkbC5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1maW5pc2hlZC13c2RsLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM1NjM0Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1maW5pc2hlZC13c2RsLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLW5ldy1vcGVyYXRpb24uanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LW9wZXJhdGlvbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzM0YTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LW9wZXJhdGlvbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1uZXctc2tlbGV0b24uanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LXNrZWxldG9uLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdkZGIyOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1uZXctc2tlbGV0b24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LXdpemFyZC5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1uZXctd2l6YXJkLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1NTNmNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1uZXctd2l6YXJkLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLXNldGVsZW1lbnQtZGlhbG9nLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLXNldGVsZW1lbnQtZGlhbG9nLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4MTY1ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1zZXRlbGVtZW50LWRpYWxvZy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1zZXR0eXBlLWRpYWxvZy5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1zZXR0eXBlLWRpYWxvZy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMzZhNjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc2V0dHlwZS1kaWFsb2cuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc21hcnQtcmVuYW1lMS5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1zbWFydC1yZW5hbWUxLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M2OGE0NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1zbWFydC1yZW5hbWUxLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItYmFja2J1dHRvbi5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWJhY2tidXR0b24uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDkyNjA1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItYmFja2J1dHRvbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTEuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmUxLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiNGY2Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTEuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmUyLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxOGM2MDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmUyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlMy5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjZiNmU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTQuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExODdkYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU1LmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlNS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NjIyZWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU1LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlNi5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTYuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTI1M2I4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlNi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTcuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU3LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZiNzUyMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTcuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU4LmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlOC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjE3NzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU4LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlOS5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTkuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjRlZWNjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlOS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9ub3RpY2VzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9ub3RpY2VzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YjYwNjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvbm90aWNlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxMSU5LIFJFTD0iU1RZTEVTSEVFVCIgSFJFRj0iYm9vay5jc3MiIENIQVJTRVQ9IklTTy04ODU5LTEiCi0JVFlQRT0idGV4dC9jc3MiPgotPHRpdGxlPkxlZ2FsIE5vdGljZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMz48YSBOQU1FPSJOb3RpY2VzIj48L2E+Tm90aWNlczwvaDM+Ci08cD5UaGUgbWF0ZXJpYWwgaW4gdGhpcyBndWlkZSBpcyBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQKLW90aGVycyAyMDAwLCAyMDA3LjwvcD4KLTxwPjxhIGhyZWY9ImFib3V0Lmh0bWwiPlRlcm1zIGFuZCBjb25kaXRpb25zIHJlZ2FyZGluZyB0aGUgdXNlIG9mIHRoaXMKLWd1aWRlLjwvYT48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTYzYjg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSAgID0gTWFzdGVyIFVzZXIgRG9jIFRPQwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTQ4ZjM0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0JCTx0b2MgZmlsZT0idG9jLnhtbCIgcHJpbWFyeT0idHJ1ZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0JCTx0b2MgZmlsZT0icmVmZXJlbmNlX3RvYy54bWwiLz4KLQk8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvcmVmZXJlbmNlX3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9yZWZlcmVuY2VfdG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0YjcyNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9yZWZlcmVuY2VfdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotCSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotCSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0JKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotCSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLQkqIAotCSogQ29udHJpYnV0b3JzOgotCSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gRGVmaW5lIHRoZSB0b3AgbGV2ZWwgdG9waWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHRvYyBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIHJlZmVyZW5jZSBpbmZvcm1hdGlvbiI+Ci0gICA8YW5jaG9yIGlkPSJjb21tYW5kX3JlZmVyZW5jZSIvPgotICAgPGFuY2hvciBpZD0iVUlfcmVmZXJlbmNlIi8+Ci0gICA8YW5jaG9yIGlkPSJqYXZhZG9jX2NvbW1vbiIvPgotICAgPGFuY2hvciBpZD0iamF2YWRvY19lamJ0b29scyIvPgotICAgPGFuY2hvciBpZD0iamF2YWRvY19qZWV0b29scyIvPgotICAgPGFuY2hvciBpZD0iamF2YWRvY19zZXJ2ZXJ0b29scyIvPgotICAgPGFuY2hvciBpZD0iamF2YWRvY19zb3VyY2VlZGl0aW5nIi8+Ci0gICA8YW5jaG9yIGlkPSJqYXZhZG9jX3htbCIvPgotICAgPGFuY2hvciBpZD0iamF2YWRvY193ZWJzZXJ2aWNlcyIvPgotPC90b2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvdG9jLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NDI3MGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotCSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotCSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0JKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotCSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLQkqIAotCSogQ29udHJpYnV0b3JzOgotCSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gRGVmaW5lIHRoZSB0b3AgbGV2ZWwgdG9waWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHRvYyBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIFVzZXIgR3VpZGUiCi0JdG9waWM9InRvcGljcy9vdmVydmlldy5odG1sIj4KLQotCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgV2ViIGFwcGxpY2F0aW9ucyI+Ci0JCTxsaW5rCi0JCQl0b2M9Ii4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci93ZWJ0b29sc190b2MueG1sIiAvPgotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJDcmVhdGluZyBKYXZhIEVFIGFuZCBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucyI+Ci0JCTxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvanN0X2oyZWVfdG9jLnhtbCIgLz4KLQkJPGxpbmsgdG9jPSIuLi9vcmcuZWNsaXBzZS5qc3QuZWpiLmRvYy51c2VyL2VqYl90b2MueG1sIiAvPgotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJFZGl0aW5nIG1hcmt1cCBsYW5ndWFnZSBmaWxlcyIKLQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIj4KLQkJPGxpbmsgdG9jPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3NzZV90b2MueG1sIiAvPgotCQk8bGluawotCQkJdG9jPSIuLi9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RUREVkaXRvcm1hcF90b2MueG1sIiAvPgotCQk8bGluawotCQkJdG9jPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJtYXBfdG9jLnhtbCIgLz4KLQkJPGxpbmsKLQkJCXRvYz0iLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RlZGl0b3JtYXBfdG9jLnhtbCIgLz4KLQk8L3RvcGljPgotCTwhLS0gPGxpbmsgdG9jPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sLmRvYy51c2VyL3htbF90b2MueG1sIi8+LS0+Ci0JPHRvcGljIGxhYmVsPSJEZXZlbG9waW5nIFdlYiBzZXJ2aWNlIGFwcGxpY2F0aW9ucyI+Ci0JCTxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL3dlYnNlcnZpY2VfdG9jLnhtbCIgLz4KLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iVXNpbmcgdGhlIHNlcnZlciB0b29scyI+Ci0gIAkJPGxpbmsgdG9jPSIuLi9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmRvYy51c2VyL3d0cF9tYWluX3RvYy54bWwiIC8+Ci0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9IlJlZmVyZW5jZSI+Ci0gIAkJPGxpbmsgdG9jPSJyZWZlcmVuY2VfdG9jLnhtbCIgLz4KLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iTGltaXRhdGlvbnMgYW5kIEtub3duIElzc3VlcyIgaHJlZj0idG9waWNzL2xpbWl0YXRpb25zLmh0bWwiIC8+Ci0JPHRvcGljIGxhYmVsPSJMZWdhbCIgaHJlZj0ibm90aWNlcy5odG1sIiAvPgotPC90b2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvdG9waWNzL2xpbWl0YXRpb25zLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci90b3BpY3MvbGltaXRhdGlvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5MGJkNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci90b3BpY3MvbGltaXRhdGlvbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTwhZG9jdHlwZSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiCi0JaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiID4KLTx0aXRsZT5XZWIgVG9vbHMgUGxhdGZvcm0gTGltaXRhdGlvbnMgYW5kIEtub3duIElzc3VlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMT5XZWIgVG9vbHMgUGxhdGZvcm0gTGltaXRhdGlvbnMgYW5kIEtub3duIElzc3VlczwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSBsaW1pdGF0aW9ucyBhbmQga25vd24gaXNzdWVzOjwvcD4KLTxkbD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj48Yj5XaGVuIHVzaW5nIFhEb2NsZXQgdGhlIGdlbmVyYXRpb24gZG9lcyBub3QgYXBwZWFyIHRvIHJ1bi48L2I+PC9kdD4KLTxkZD48cD5DYXVzZTogWERvY2xldCBoYXMgc29tZSBsaW1pdGF0aW9ucyB3aXRoIGxvbmcgcGF0aCBuYW1lcy48L3A+Ci08cD5Tb2x1dGlvbjogWW91IHNob3VsZCBpbnN0YWxsIEVjbGlwc2UgYW5kIHRoZSBXZWIgVG9vbHMgUGxhdGZvcm0gaW50byBhIGRpcmVjdG9yeSB3aXRoIGEgc2hvcnQKLXBhdGguPC9wPgotPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj48Yj5XaGVuIGNyZWF0aW5nIGEgV2ViIHNlcnZpY2UgeW91IG1heSBzZWUgYSBtZXNzYWdlIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyBvbmU6PC9iPjwvZHQ+Ci08ZGQ+PHA+PHNhbXA+b3JnLmFwYWNoZS5heGlzLnV0aWxzLkphdmFVdGlscyBpc0F0dGFjaG1lbnRTdXBwb3J0ZWQKLVdBUk5JTkc6IFVuYWJsZSB0byBmaW5kIHJlcXVpcmVkIGNsYXNzZXMgKGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIgYW5kIAotamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lTXVsdGlwYXJ0KS4gQXR0YWNobWVudCBzdXBwb3J0IGlzIGRpc2FibGVkLgotPC9zYW1wPjwvcD4KLTxwPkNhdXNlOiBBdHRhY2htZW50IHN1cHBvcnQgaXMgZGlzYWJsZWQuPC9wPgotPHA+U29sdXRpb246IFRoZSBBcGFjaGUgQXhpcyB0b29scyBzaG91bGQgYXV0by1kZXRlY3QgdGhlIGphdmF4LmFjdGl2YXRpb24gY2xhc3NlcyBwcm92aWRlZCB5b3UgYWRkIAotPHNhbXA+YWN0aXZhdGlvbi5qYXI8L3NhbXA+IHRvIHRoZSBidWlsZCBwYXRoIG9mIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHlvdSBhcmUgZ2VuZXJhdGluZyB5b3VyIFdlYiBzZXJ2aWNlIG9yIGNsaWVudC4gCi1Gb3Igc2VydmljZXMsIHlvdSB3aWxsIGFsc28gbmVlZCB0byBtYWtlIHN1cmUgPHNhbXA+YWN0aXZhdGlvbi5qYXI8L3NhbXA+IGlzIGF2YWlsYWJsZSB0byB0aGUgVG9tY2F0IEpSRSwgZWl0aGVyIGJ5IAotaW5jbHVkaW5nIGl0IGluIHRoZSBzZXJ2ZXIncyBnbG9iYWwgY2xhc3NwYXRoIG9yIGJ5IHBsYWNpbmcgYSBjb3B5IG9mIGFjdGl2YXRpb24uamFyIGludG8gdGhlIHRhcmdldCBXZWIgCi1wcm9qZWN0J3MgPHNhbXA+bGliLzwvc2FtcD4gZGlyZWN0b3J5LgotPC9wPgotPC9kZD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj48Yj5Qcm9ibGVtcyBlbmNvdW50ZXJlZCBwdWJsaXNoaW5nIGZyb20gZHluYW1pYyBXZWIgcHJvamVjdHMgd2l0aCBub24tQVNDSUkgY2hhcmFjdGVycyBpbiB0aGUgY29udGV4dCByb290PC9iPjwvZHQ+Ci08ZGQ+Ci08cD5DYXVzZTogQnkgZGVmYXVsdCB0aGUgY29udGV4dCByb290IG9mIGEgZHluYW1pYyBXZWIgcHJvamVjdCB1c2VzIHRoZSBwcm9qZWN0IG5hbWUuIElmIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGFyZSB1c2VkIGFzIHByb2plY3QgbmFtZXMgZm9yIGR5bmFtaWMgV2ViIHByb2plY3RzLCAKLXRoZSBkZWZhdWx0IGNvbnRleHQgcm9vdCBjYXVzZXMgcHJvYmxlbXMgd2hlbiB0cnlpbmcgdG8gcHVibGlzaCBmcm9tIHRoZSBXZWIgcHJvamVjdC48L3A+Ci08cD5Zb3UgbWF5IGVuY291bnRlciB0aGUgZm9sbG93aW5nIGVycm9ycyBpZiB0aGlzIG9jY3VyczoKLTx1bD4KLTxsaT5JZiB5b3UgY3JlYXRlIGEgZHluYW1pYyBXZWIgcHJvamVjdCB3aXRoIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIChsZWF2aW5nIHRoZSBjb250ZXh0IHJvb3QKLXRvIGRlZmF1bHQgdG8gdGhlIHByb2plY3QgbmFtZSBjb250YWluaW5nIG5vbiBBU0NJSSBjaGFyYWN0ZXJzKSBhbmQgdHJ5IHRvCi1wdWJsaXNoLCB5b3Ugd2lsbCBzZWUgYW4gZXJyb3IgbWVzc2FnZSBzaW1pbGFyIHRvICJUaGUgcmVxdWVzdGVkIHJlc291cmNlIGlzIG5vdCBhdmFpbGFibGUiLjwvbGk+Ci08bGk+SWYgYSBkeW5hbWljIFdlYiBwcm9qZWN0IGNvbnRhaW5pbmcgYSBub24tQVNDSUkgY29udGV4dCByb290IGlzIHVzZWQgaW4gYW4gQXhpczEgV2ViIHNlcnZpY2UgY3JlYXRpb24gCi1zY2VuYXJpbywgeW91IHdpbGwgc2VlIGFuIGVycm9yIG1lc3NhZ2Ugc2ltaWxhciB0byAiVW5hYmxlIHRvIGRlcGxveSB0byBBeGlzIi48L2xpPgotPC91bD4KLTxwPlNvbHV0aW9uOiBUaGUgZm9sbG93aW5nIEFTQ0lJIGNoYXJhY3RlcnMgYXJlIHZhbGlkIGluIHRoZSBjb250ZXh0IHJvb3Q6IGFsbCBsZXR0ZXJzLCBhbGwgbnVtYmVycywgYW4gdW5kZXJzY29yZSwgYSBoeXBoZW4gKGRhc2gpLCBhIGZvcndhcmQgc2xhc2gsIG9yIGEgcGVyaW9kLjwvcD4KLTwvZGQ+Ci08L2RsPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3RvcGljcy9vdmVydmlldy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvdG9waWNzL292ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjUxYmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvdG9waWNzL292ZXJ2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIgotCWhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiA+Ci08dGl0bGU+V2ViIFRvb2xzIFByb2plY3QgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+V2ViIFRvb2xzIFByb2plY3QgT3ZlcnZpZXc8L2gxPgotPHA+VGhlIFdlYiBUb29scyBQcm9qZWN0IGFpbXMgdG8gcHJvdmlkZSBjb21tb24gaW5mcmFzdHJ1Y3R1cmUgYXZhaWxhYmxlCi10byBhbnkgRWNsaXBzZS1iYXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCB0YXJnZXRpbmcgV2ViLWVuYWJsZWQKLWFwcGxpY2F0aW9ucy48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjJmNjlkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjM3OjIxIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jU3VuIEFwciAxNiAxNDowNToyOSBFRFQgMjAwNgotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9FZGl0b3JEdGRDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9FZGl0b3JEdGRDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjZjZTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvRWRpdG9yRHRkQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotCSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotCSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0JKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotCSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLQkqIAotCSogQ29udHJpYnV0b3JzOgotCSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotCi08IS0tIHBsdWdpbjogb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSAtLT4KLQotPGNvbnRleHRzPgotCTxjb250ZXh0IGlkPSJjc2hfb3V0ZXJfY29udGFpbmVyIj4KLQkJPGRlc2NyaXB0aW9uIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3ZWJ4MDAyMCI+PCEtLSBkdGQgZmlsZXMgcHJlZmVyZW5jZSBwYWdlIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlUaGlzIHBhZ2UgbGV0cyB5b3UgY2hvb3NlIHdoaWNoIHN1ZmZpeCAoPGI+ZHRkPC9iPiwgPGI+ZW50PC9iPiwgb3IgPGI+bW9kPC9iPikgaXMgYWRkZWQgd2hlbiBhIG5ldyBEVEQgZmlsZSBpcyBjcmVhdGVkLgotCQk8L2Rlc2NyaXB0aW9uPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2VieDAwMjEiPjwhLS0gZHRkIHN0eWxlcyBwcmVmZXJlbmNlIHBhZ2UgLS0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVRoaXMgcGFnZSBsZXRzIHlvdSBjdXN0b21pemUgdGhlIHN5bnRheCBoaWdobGlnaHRpbmcgdGhhdCB0aGUgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIGVkaXRvciBkb2VzIHdoZW4geW91IGFyZSBlZGl0aW5nIGEgZmlsZS4KLQotCQkJVGhlIDxiPkNvbnRlbnQgdHlwZTwvYj4gZmllbGQgY29udGFpbnMgYSBsaXN0IG9mIGFsbCB0aGUgc291cmNlIHR5cGVzIHRoYXQgeW91IGNhbiBzZWxlY3QgYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLiBZb3UgY2FuIGVpdGhlciBzZWxlY3QgdGhlIGNvbnRlbnQgdHlwZSB0aGF0IHlvdSB3YW50IHRvIHdvcmsgd2l0aCBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdCwgb3IgY2xpY2sgdGV4dCBpbiB0aGUgdGV4dCBzYW1wbGUgd2luZG93IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNvbnRlbnQgdHlwZSBmb3Igd2hpY2ggeW91IHdhbnQgdG8gY2hhbmdlIHRoZSB0ZXh0IGhpZ2hsaWdodGluZy4KLQotCQkJVGhlIDxiPkZvcmVncm91bmQ8L2I+IGFuZCA8Yj5CYWNrZ3JvdW5kPC9iPiBwdXNoIGJ1dHRvbnMgb3BlbiA8Yj5Db2xvcjwvYj4gZGlhbG9nIGJveGVzIHRoYXQgYWxsb3cgeW91IHRvIHNwZWNpZnkgdGV4dCBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycywgcmVzcGVjdGl2ZWx5LiBTZWxlY3QgdGhlIDxiPkJvbGQ8L2I+IGNoZWNrIGJveCB0byBtYWtlIHRoZSBzcGVjaWZpZWQgY29udGVudCB0eXBlIGFwcGVhciBpbiBib2xkLgotCi0JCQlDbGljayB0aGUgPGI+UmVzdG9yZSBEZWZhdWx0PC9iPiBwdXNoIGJ1dHRvbiB0byBzZXQgdGhlIGhpZ2hsaWdodGluZyBzdHlsZXMgYmFjayB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c3Jjc3QuaHRtbCIKLQkJCWxhYmVsPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2VieDAwMjIiPjwhLS0gZHRkIHRlbXBsYXRlIHByZWZlcmVuY2UgcGFnZSAtLT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJVGVtcGxhdGVzIGFyZSBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBEVEQgZmlsZSB3aGVuIGl0IGlzIGNyZWF0ZWQuCi0KLQkJCUNsaWNrIDxiPk5ldzwvYj4gaWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgY29tcGxldGVseSBuZXcgdGVtcGxhdGUuCi0KLQkJCVN1cHBseSBhIG5ldyB0ZW1wbGF0ZSA8Yj5OYW1lPC9iPiBhbmQgPGI+RGVzY3JpcHRpb248L2I+LiBUaGUgPGI+Q29udGV4dDwvYj4gZm9yIHRoZSB0ZW1wbGF0ZSBpcyB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wb3NhbCBsaXN0IHdoZW4gY29udGVudCBhc3Npc3QgaXMgcmVxdWVzdGVkLiBTcGVjaWZ5IHRoZSA8Yj5QYXR0ZXJuPC9iPiBmb3IgeW91ciB0ZW1wbGF0ZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyB0byBiZSBpbnNlcnRlZCBieSBjb250ZW50IGFzc2lzdC4KLQotCQkJSWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8Yj5JbnNlcnQgVmFyaWFibGU8L2I+IGJ1dHRvbiBhbmQgc2VsZWN0IHRoZSB2YXJpYWJsZSB0byBiZSBpbnNlcnRlZC4gRm9yIGV4YW1wbGUsIHRoZSA8Yj5kYXRlPC9iPiB2YXJpYWJsZSBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgZGF0ZSB3aWxsIGJlIGluc2VydGVkLgotCi0JCQlZb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUgc2FtZSBQcmVmZXJlbmNlcyBwYWdlLgotCi0JCQlJZiB5b3UgaGF2ZSBhIHRlbXBsYXRlIHRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IGl0IHRvIGFwcGVhciBpbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCwgY2xlYXIgaXRzIGNoZWNrIGJveCBpbiB0aGUgPGI+VGVtcGxhdGVzPC9iPiBwcmVmZXJlbmNlcyBwYWdlLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkdGVtcGx0Lmh0bWwiCi0JCQlsYWJlbD0iV29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXMiIC8+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXRkdGQuaHRtbCIKLQkJCWxhYmVsPSJDcmVhdGluZyBEVEQgZmlsZXMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSIiPjwhLS0gY3JlYXRlIGR0ZCBwYWdlIDEgaGFzIG5vIGlkIGF0bSAtLT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJSW4gdGhlIDxiPkZpbGUgbmFtZTwvYj4gZmllbGQsIHR5cGUgdGhlIG5hbWUgb2YgdGhlIERURC4gVGhlIG5hbWUgb2YgeW91ciBEVEQgZmlsZSBtdXN0IGVuZCB3aXRoIHRoZSBleHRlbnNpb24gLmR0ZAotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0ZHRkLmh0bWwiCi0JCQlsYWJlbD0iIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZHRkdzAwMTAiPjwhLS0gZHRkIG5ldyBmaWxlIHdpemFyZCBwYWdlIDIsIHBhZ2UgMSBoYXMgbm8gSUQgLS0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCUNsaWNrIHRoZSA8Yj5Vc2UgRFREIFRlbXBsYXRlPC9iPiBjaGVjayBib3ggaWYgeW91IHdhbnQgdG8gdXNlIGEgRFREIHRlbXBsYXRlIGFzIHRoZSBpbml0aWFsIGNvbnRlbnQgaW4geW91ciBuZXcgRFREIHBhZ2UuIEEgbGlzdCBvZiBhdmFpbGFibGUgRFREIHRlbXBsYXRlcyBpcyBsaXN0ZWQgLSBzZWxlY3QgdGhlIG9uZSB5b3Ugd2FudCB0byB1c2UuIEEgcHJldmlldyBvZiB5b3VyIERURCBmaWxlIGlzIHNob3duIG9uY2UgeW91IHNlbGVjdCBhIERURCB0ZW1wbGF0ZS4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZHRlbXBsdC5odG1sIgotCQkJbGFiZWw9Ildvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzIiAvPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0ZHRkLmh0bWwiCi0JCQlsYWJlbD0iQ3JlYXRpbmcgRFREIGZpbGVzIiAvPgotCTwvY29udGV4dD4KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9FZGl0b3JEdGRDb250ZXh0czIueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvRWRpdG9yRHRkQ29udGV4dHMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0NGQyNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9FZGl0b3JEdGRDb250ZXh0czIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotCi08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0iY3NoX291dGVyX2NvbnRhaW5lciI+Ci08ZGVzY3JpcHRpb24vPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9ImR0ZHNvdXJjZV9zb3VyY2VfSGVscElkIj4KLTxkZXNjcmlwdGlvbj5UaGUgRFREIGVkaXRvciBsZXRzIHlvdSBlZGl0IGEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uLgotCi1UaGUgZWRpdG9yIHByb3ZpZGVzIHRleHQgZWRpdGluZyBmZWF0dXJlcyBzdWNoIGFzIHN5bnRheCBoaWdobGlnaHRpbmcgYW5kIHVubGltaXRlZCB1bmRvIGFuZCByZWRvLgotPC9kZXNjcmlwdGlvbj4KLTwvY29udGV4dD4KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzUzNjgyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNDAwLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZThiMzdhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBFZGl0b3JEdGRDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIEVkaXRvckR0ZENvbnRleHRzMi54bWwKLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDA5NGQ3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSAgICAgPSBEVEQgRWRpdG9yIGluZm9wb3BzCi1wbHVnaW5Qcm92aWRlciA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1N2ZiYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Z2luIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgICAgICAgICAtLT4KLTwhLS0gY29udHJpYnV0aW9ucyBmb3IgdXNpbmcgdGhlIHRvb2wuICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxwbHVnaW4+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJFZGl0b3JEdGRDb250ZXh0cy54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkiLz4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9yRHRkQ29udGV4dHMyLnhtbCIgcGx1Z2luID0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlIi8+Ci08L2V4dGVuc2lvbj4KLQotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODBmYzliLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXJfMS4wLjAuamFyCi10ZW1wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDg2ZDdhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkOGI1Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6Mzc6MjEgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFjNjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNDk1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjA1OjI5IEVEVCAyMDA2Ci1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9EVERFZGl0b3JtYXBfdG9jLmRpdGFtYXAgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRFRERWRpdG9ybWFwX3RvYy5kaXRhbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGE3N2VlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9EVERFZGl0b3JtYXBfdG9jLmRpdGFtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIG1hcCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBNYXAvL0VOIg0KLSAibWFwLmR0ZCI+DQotPG1hcCBjb2xsZWN0aW9uLXR5cGU9InNlcXVlbmNlIiBpZD0iZHRkZWRpdG9yVE9DIiB0aXRsZT0iRFREIEVkaXRvciI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd29ya2R0ZHMuZGl0YSIgbmF2dGl0bGU9Ildvcmtpbmcgd2l0aCBEVERzIiB0eXBlPSJjb25jZXB0Ij4NCi08YW5jaG9yIGlkPSJkdGRfcG9zdF9jd29ya2R0ZHMiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV0ZHRkLmRpdGEiIGxpbmtpbmc9Im5vcm1hbCIgbmF2dGl0bGU9IkNyZWF0aW5nIERURHMiDQotdHlwZT0idGFzayI+DQotPGFuY2hvciBpZD0iZHRkX3Bvc3RfdGNyZXRkdGQiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NkdGRvdmVyLmRpdGEiIGxpbmtpbmc9InNvdXJjZW9ubHkiIG5hdnRpdGxlPSJEb2N1bWVudCB0eXBlIGRlZmluaXRpb24gLSBPdmVydmlldyINCi10eXBlPSJjb25jZXB0Ij48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9ImR0ZF9wb3N0X2NkdGRvdmVyIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0c3Jjc3QuZGl0YSIgbGlua2luZz0ic291cmNlb25seSIgbmF2dGl0bGU9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJkdGRfcG9zdF9jdGVkdHNyY3N0Ii8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZHRlbXBsdC5kaXRhIiBsaW5raW5nPSJzb3VyY2Vvbmx5IiBuYXZ0aXRsZT0iV29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJkdGRfcG9zdF90ZHRlbXBsdCIvPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90aW1wdGR0ZC5kaXRhIiBuYXZ0aXRsZT0iSW1wb3J0aW5nIERURHMiIHR5cGU9InRhc2siPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0iZHRkX3Bvc3RfdGltcHRkdGQiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R2YWxkdGQuZGl0YSIgbmF2dGl0bGU9IlZhbGlkYXRpbmcgRFREcyIgdHlwZT0idGFzayI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJkdGRfcG9zdF90dmFsZHRkIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9yZHRkaWNvbnMuZGl0YSIgbmF2dGl0bGU9Ikljb25zIHVzZWQgaW4gdGhlIERURCBlZGl0b3IiDQotdHlwZT0icmVmZXJlbmNlIj48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9ImR0ZF9wb3N0X3JkdGRpY29ucyIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcmR0ZGtleS5kaXRhIiBuYXZ0aXRsZT0iRFREIGVkaXRvciBrZXlib2FyZCBzaG9ydGN1dHMiDQotdHlwZT0icmVmZXJlbmNlIj48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9ImR0ZF9wb3N0X3JkdGRrZXkiLz48L3RvcGljcmVmPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9EVERFZGl0b3JtYXBfdG9jLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9EVERFZGl0b3JtYXBfdG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA1ZDk4OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRFRERWRpdG9ybWFwX3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJEVEQgRWRpdG9yIiB0b3BpYz0idG9waWNzL2N3b3JrZHRkcy5odG1sIj4KLTx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIERURHMiIGhyZWY9InRvcGljcy9jd29ya2R0ZHMuaHRtbCI+Ci08YW5jaG9yIGlkPSJkdGRfcG9zdF9jd29ya2R0ZHMiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgRFREcyIgaHJlZj0idG9waWNzL3RjcmV0ZHRkLmh0bWwiPgotPGFuY2hvciBpZD0iZHRkX3Bvc3RfdGNyZXRkdGQiLz4KLTx0b3BpYyBsYWJlbD0iRG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyAoRFREcykgLSBvdmVydmlldyIgaHJlZj0idG9waWNzL2NkdGRvdmVyLmh0bWwiLz4KLTxhbmNob3IgaWQ9ImR0ZF9wb3N0X2NkdGRvdmVyIi8+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiIGhyZWY9InRvcGljcy90ZWR0c3Jjc3QuaHRtbCIvPgotPGFuY2hvciBpZD0iZHRkX3Bvc3RfY3RlZHRzcmNzdCIvPgotPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggRFREIHRlbXBsYXRlcyIgaHJlZj0idG9waWNzL3RkdGVtcGx0Lmh0bWwiLz4KLTxhbmNob3IgaWQ9ImR0ZF9wb3N0X3RkdGVtcGx0Ii8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJJbXBvcnRpbmcgRFREcyIgaHJlZj0idG9waWNzL3RpbXB0ZHRkLmh0bWwiLz4KLTxhbmNob3IgaWQ9ImR0ZF9wb3N0X3RpbXB0ZHRkIi8+Ci08dG9waWMgbGFiZWw9IlZhbGlkYXRpbmcgRFREcyIgaHJlZj0idG9waWNzL3R2YWxkdGQuaHRtbCIvPgotPGFuY2hvciBpZD0iZHRkX3Bvc3RfdHZhbGR0ZCIvPgotPHRvcGljIGxhYmVsPSJJY29ucyB1c2VkIGluIHRoZSBEVEQgZWRpdG9yIiBocmVmPSJ0b3BpY3MvcmR0ZGljb25zLmh0bWwiLz4KLTxhbmNob3IgaWQ9ImR0ZF9wb3N0X3JkdGRpY29ucyIvPgotPHRvcGljIGxhYmVsPSJEVEQgZWRpdG9yIGtleWJvYXJkIHNob3J0Y3V0cyIgaHJlZj0idG9waWNzL3JkdGRrZXkuaHRtbCIvPgotPGFuY2hvciBpZD0iZHRkX3Bvc3RfcmR0ZGtleSIvPgotPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RURHJlZnRhYmxlLmRpdGFtYXAgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRFREcmVmdGFibGUuZGl0YW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA1YjAzMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRFREcmVmdGFibGUuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgbWFwIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIE1hcC8vRU4iICJtYXAuZHRkIj4NCi08bWFwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV0ZHRkLmRpdGEiIGxpbmtpbmc9Im5vcm1hbCIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgbmV3IERURCINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2R0ZG92ZXIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAtIE92ZXJ2aWV3Ig0KLXR5cGU9ImNvbmNlcHQiPjwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NkdGRvdmVyLmRpdGEiIG5hdnRpdGxlPSJEb2N1bWVudCB0eXBlIGRlZmluaXRpb24gLSBPdmVydmlldyINCi10eXBlPSJjb25jZXB0Ij48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHZhbGR0ZC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iVmFsaWRhdGluZyBEVERzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV0ZHRkLmRpdGEiIGxpbmtpbmc9Im5vcm1hbCIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgbmV3IERURCINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGR0ZW1wbHQuZGl0YSIgbmF2dGl0bGU9Ildvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9EVERyZWZ0YWJsZS54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRFREcmVmdGFibGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmRkMzBhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9EVERyZWZ0YWJsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIHRvcGljPSJ0b3BpY3MvdGNyZXRkdGQuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIERURHMiIGhyZWY9InRvcGljcy90Y3JldGR0ZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnMgKERURHMpIC0gb3ZlcnZpZXciIGhyZWY9InRvcGljcy9jZHRkb3Zlci5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnMgKERURHMpIC0gb3ZlcnZpZXciIGhyZWY9InRvcGljcy9jZHRkb3Zlci5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlZhbGlkYXRpbmcgRFREcyIgaHJlZj0idG9waWNzL3R2YWxkdGQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBEVERzIiBocmVmPSJ0b3BpY3MvdGNyZXRkdGQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggRFREIHRlbXBsYXRlcyIgaHJlZj0idG9waWNzL3RkdGVtcGx0Lmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RvY0J1aWxkLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9Eb2NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2M2QwZWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RvY0J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLSAKLQotCVRoaXMgc2NyaXB0IGJ1aWxkIHRoZSBIZWxwIHBsdWctaW4gYnkgdHJhbnNmb3JtaW5nIHRoZSBESVRBIHNvdXJjZSBmaWxlcyBpbnRvIEhUTUwuCi0JCi0JVG8gdXNlIHRoaXMgc2NyaXB0LCB5b3UgbXVzdCBpbnN0YWxsIERJVEEtT1Qgb24geW91ciBtYWNoaW5lIGluIHRoZSBkaXJlY3RvcnkKLQlkZWZpbmVkIGJ5IHRoZSBkaXRhLm90LmRpciBwcm9wZXJ0eS4KLQkKLQlSdW4gdGhlIGRlZmF1bHQgdGFyZ2V0IGFmdGVyIHlvdSBlZGl0IHRoZSBESVRBIHNvdXJjZSBmaWxlcyB0byByZWdlbmVyYXRlIHRoZSBIVE1MLgotCQotCVRvIGN1c3RvbWl6ZSB0aGlzIHNjcmlwdCBmb3Igb3RoZXIgSGVscCBwbHVnLWlucywgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgYXJncy5pbnB1dCBwcm9wZXJ0eQotCXRvIGJlIHRoZSBESVRBIG1hcCBmaWxlIGZvciB0aGUgcGx1Zy1pbi4KLQkKLQlOT1RFOiBUaGlzIHNjcmlwdCBhc3N1bWVzIHRoYXQgbGlua3MgdG8gc2libGluZyBIZWxwIHBsdWctaW5zIGhhdmUgc2NvcGU9InBlZXIiLCBvdGhlcndpc2UgdGhlCi0Jb3V0cHV0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgd2lsbCBiZSBzaGlmdGVkIGluY29ycmVjdGx5LgotCQotCU5PVEU6IFRoaXMgc2NyaXB0IGFzc3VtZXMgdGhhdCB5b3UgaGFuZCBjb2RlIHlvdXIgcGx1Z2luLnhtbCBmaWxlIGluIG15cGx1Z2luLnhtbC4gVGhpcyBmaWxlCi0Jd2lsbCBiZSBjb3BpZWQgb3ZlciB0aGUgZ2VuZXJhdGVkIHBsdWdpbi54bWwgd2hpY2ggaXMgY3VycmVudGx5IG5vdCBiZWluZyBnZW5lcmF0ZWQgY29ycmVjdGx5Ci0JYnkgRElUQS1PVC4KLQkKLQlDaGFuZ2VMb2c6Ci0JMjAwNi0wNC0wNSBBcnRodXIgUnltYW4gPHJ5bWFuQGNhLmlibS5jb20+Ci0JLSBDcmVhdGVkLgotCTIwMDgtMDEtMDkgS2F0ZSBQcmljZSA8a2F0ZXBAY2EuaWJtLmNvbT4KLQktIG1vZGlmaWVkIGZvciBuZXcgRElUQS1PVCB2ZXJzaW9uCi0JMjAwOC0wNS0wNSBLYXRlIFByaWNlIDxrYXRlcEBjYS5pYm0uY29tPgotCS0gbW9kaWZpZWQgdG8gYWRkIGdlbmVyYXRpb24gb2YgcHJlLWJ1aWx0IGhlbHAgaW5kZXguIAotCS0gTXVzdCBkZWxldGUgL2luZGV4IGZvbGRlciBiZWZvcmUgcnVubmluZyBidWlsZAotLS0+Ci08cHJvamVjdCBuYW1lPSJlY2xpcHNlaGVscCIgZGVmYXVsdD0iYWxsIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLm90LmRpciIgbG9jYXRpb249IkM6L0RJVEEtT1QxLjIuMiIgLz4KLQotCTxwYXRoIGlkPSJkb3N0LmNsYXNzLnBhdGgiPgotCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7ZGl0YS5vdC5kaXJ9JHtmaWxlLnNlcGFyYXRvcn1saWIke2ZpbGUuc2VwYXJhdG9yfWRvc3QuamFyIiAvPgotCTwvcGF0aD4KLQotCTx0YXNrZGVmIG5hbWU9ImludGVncmF0ZSIgY2xhc3NuYW1lPSJvcmcuZGl0YS5kb3N0LnBsYXRmb3JtLkludGVncmF0b3JUYXNrIj4KLQkJPGNsYXNzcGF0aCByZWZpZD0iZG9zdC5jbGFzcy5wYXRoIiAvPgotCTwvdGFza2RlZj4KLQk8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iaW50ZWdyYXRlLCBlY2xpcHNlaGVscCI+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJpbnRlZ3JhdGUiPgotCQk8aW50ZWdyYXRlIGRpdGFkaXI9IiR7ZGl0YS5vdC5kaXJ9IiAvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSByZXZpc2UgYmVsb3cgaGVyZSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImVjbGlwc2VoZWxwIj4KLQkJPGFudCBhbnRmaWxlPSIke2RpdGEub3QuZGlyfSR7ZmlsZS5zZXBhcmF0b3J9Y29uZHVjdG9yLnhtbCIgdGFyZ2V0PSJpbml0IiBkaXI9IiR7ZGl0YS5vdC5kaXJ9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNvcHljc3MiIHZhbHVlPSJubyIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNzc3BhdGgiIHZhbHVlPSIuLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnByb3ZpZGVyIiB2YWx1ZT0iRWNsaXBzZS5vcmciIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnZlcnNpb24iIHZhbHVlPSIzLjQuMCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmlucHV0IiBsb2NhdGlvbj0iRFREcmVmdGFibGUuZGl0YW1hcCIgLz4gICAgCQkKLQkJCTxwcm9wZXJ0eSBuYW1lPSJjbGVhbi50ZW1wIiB2YWx1ZT0idHJ1ZSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLmV4dG5hbWUiIHZhbHVlPSIuZGl0YSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLnRlbXAuZGlyIiBsb2NhdGlvbj0idGVtcCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQuZGlyIiBsb2NhdGlvbj0iIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9InRyYW5zdHlwZSIgdmFsdWU9ImVjbGlwc2VoZWxwIiAvPgotCQk8L2FudD4KLQkJPGNvcHkgZmlsZT0ibXlwbHVnaW4ueG1sIiB0b2ZpbGU9InBsdWdpbi54bWwiIG92ZXJ3cml0ZT0ieWVzIiAvPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iYnVpbGQuaW5kZXgiIGRlc2NyaXB0aW9uPSJCdWlsZHMgc2VhcmNoIGluZGV4IGZvciB0aGUgcGx1Zy1pbiIgaWY9ImVjbGlwc2UucnVubmluZyI+Ci0JICAgICA8aGVscC5idWlsZEhlbHBJbmRleCBtYW5pZmVzdD0icGx1Z2luLnhtbCIgZGVzdGluYXRpb249Ii4iLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdjZTA4NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNzAwLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlmZTM1NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IERUREVkaXRvcm1hcF90b2MueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCxcCi0gICAgICAgICAgICAgICBpbWFnZXMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdG9waWNzLyouaHRtKixcCi0gICAgICAgICAgICAgICBpbmRleC8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSAqLm1hcGxpc3QsXAotICAgICAgICAgICAgICAgKi5kaXRhbWFwLFwKLSAgICAgICAgICAgICAgIHRvcGljcy8qLmRpdGEKLWJpbi5leGNsdWRlcyA9IERvY0J1aWxkLnhtbCxcCi0gICAgICAgICAgICAgICBteVBsdWdpbioueG1sCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvZGl0YS5saXN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2RpdGEubGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkZDk5YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvZGl0YS5saXN0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1RodSBPY3QgMTUgMTE6MzY6NDkgRURUIDIwMDkNCi11c2VyLmlucHV0LmZpbGU9RFREcmVmdGFibGUuZGl0YW1hcA0KLXVzZXIuaW5wdXQuZGlyPURcOlxcRG9jc1xcV1RQM1xcb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlcg0KLWZsYWdpbWFnZWxpc3Q9DQotZnVsbGRpdGFtYXBsaXN0PURURHJlZnRhYmxlLmRpdGFtYXANCi1jb25yZWZsaXN0PQ0KLWhyZWZ0YXJnZXRzbGlzdD10b3BpY3MvdGR0ZW1wbHQuZGl0YSx0b3BpY3MvdGNyZXRkdGQuZGl0YSx0b3BpY3MvdHZhbGR0ZC5kaXRhLHRvcGljcy9jZHRkb3Zlci5kaXRhDQotZnVsbGRpdGF0b3BpY2xpc3Q9dG9waWNzL3RkdGVtcGx0LmRpdGEsdG9waWNzL3RjcmV0ZHRkLmRpdGEsdG9waWNzL3R2YWxkdGQuZGl0YSx0b3BpY3MvY2R0ZG92ZXIuZGl0YQ0KLWZ1bGxkaXRhbWFwYW5kdG9waWNsaXN0PXRvcGljcy90ZHRlbXBsdC5kaXRhLHRvcGljcy90Y3JldGR0ZC5kaXRhLERURHJlZnRhYmxlLmRpdGFtYXAsdG9waWNzL3R2YWxkdGQuZGl0YSx0b3BpY3MvY2R0ZG92ZXIuZGl0YQ0KLWh0bWxsaXN0PQ0KLWltYWdlbGlzdD0NCi1ocmVmZGl0YXRvcGljbGlzdD10b3BpY3MvdHZhbGR0ZC5kaXRhDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfQ29tbWVudC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9Db21tZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk2MTFkNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9Db21tZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0VsZW1lbnQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjQ4ODkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9FbnRpdHkuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfRW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0MTUwNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9FbnRpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9FbnRpdHlfUmVmZXJlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmYTliOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9FbnRpdHlfUmVmZXJlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX05vdGF0aW9uLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX05vdGF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdhZDA4OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9Ob3RhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRENob2ljZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRENob2ljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YmE4MjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDaG9pY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTZXF1ZW5jZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNlcXVlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmM2Y5Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNlcXVlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvYXR0cmlidXRlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvYXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjZGU5NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2F0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2F0dHJpYnV0ZV9saXN0LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvYXR0cmlidXRlX2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGYwMjkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvYXR0cmlidXRlX2xpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uRFRERmlsZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25EVERGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc5OTE0My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25EVERGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvbmFueS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25hbnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDE3ZDkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvbmFueS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25lbXB0eS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25lbXB0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOWUzZDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uZW1wdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9vcmdhbml6ZV9kdGRfbG9naWNhbGx5LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvb3JnYW5pemVfZHRkX2xvZ2ljYWxseS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5M2M2YmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9vcmdhbml6ZV9kdGRfbG9naWNhbGx5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvc29ydC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL3NvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2M1ZDBiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvc29ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvXzkuY2ZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2luZGV4L185LmNmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcxMDU2Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvXzkuY2ZzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbmRleC9kZWxldGFibGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5M2Y0NzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWVhMzFlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0Lg0KLSNXZWQgQXByIDI5IDE4OjAzOjMwIEVEVCAyMDA5DQotb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlcj1vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyXG4xLjAuNDAwLnF1YWxpZmllcg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE3MDdiYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0Lg0KLSNXZWQgQXByIDI5IDE4OjAzOjMwIEVEVCAyMDA5DQotbHVjZW5lPTEuOS4xLnYyMDA4MDUzMC0xNjAwDQotYW5hbHl6ZXI9b3JnLmVjbGlwc2UuaGVscC5iYXNlXCMzLjMuMTAxLk0yMDA4MDcyOF8zNHg/bG9jYWxlXD1lbg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2RvY3MgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDg3NmI3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2RvY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4NCi0jV2VkIEFwciAyOSAxODowMzozMCBFRFQgMjAwOQ0KLS9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZHRka2V5Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya2R0ZHMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXB0ZHRkLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jZHRkb3Zlci5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmR0ZGljb25zLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmFsZHRkLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZHRlbXBsdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXRkdGQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzcmNzdC5odG1sPTANCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NGYxYjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2luZGV4L3NlZ21lbnRzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9teXBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNzU4NTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy42Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PiAKLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxwbHVnaW4+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgPHRvYyBmaWxlPSJEVERFZGl0b3JtYXBfdG9jLnhtbCIvPgotICAgICAgIDxpbmRleCBwYXRoPSJpbmRleC8iLz4KLSAgPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5pbmRleCI+Ci0JCTxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sIi8+ICAgICAKLQk8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci5tYXBsaXN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIubWFwbGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNjYmQ3Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci5tYXBsaXN0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08bWFwbGlzdCB2ZXJzaW9uPSIzLjYuMiI+DQotICA8bmF2Pg0KLSAgICA8bWFwIGZpbGU9IkRUREVkaXRvcm1hcF90b2MuZGl0YW1hcCIvPg0KLSAgPC9uYXY+DQotICA8bGluaz4NCi0gICAgPG1hcCBmaWxlPSJEVERFZGl0b3JtYXBfdG9jLmRpdGFtYXAiLz4NCi0gICAgPG1hcCBmaWxlPSJEVERyZWZ0YWJsZS5kaXRhbWFwIi8+DQotICA8L2xpbms+DQotPC9tYXBsaXN0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZGFiMmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPGluZGV4PgotICA8ZW50cnkga2V5d29yZD0iRFREcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNyZXRkdGQuaHRtbCN0Y3JldGR0ZCIgdGl0bGU9IkNyZWF0aW5nIERURHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NkdGRvdmVyLmh0bWwjY2R0ZG92ZXIiIHRpdGxlPSJEb2N1bWVudCB0eXBlIGRlZmluaXRpb25zIChEVERzKSAtIG92ZXJ2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaGlnaGxpZ2h0aW5nIHN0eWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRzcmNzdC5odG1sI3R0YWdoaWx0IiB0aXRsZT0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIHRlbXBsYXRlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RkdGVtcGx0Lmh0bWwjdHdtYWNybyIgdGl0bGU9Ildvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaW1wb3J0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGltcHRkdGQuaHRtbCN0aW1wdGR0ZCIgdGl0bGU9IkltcG9ydGluZyBEVERzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdG9yIGljb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcmR0ZGljb25zLmh0bWwjcmljb25zIiB0aXRsZT0iSWNvbnMgdXNlZCBpbiB0aGUgRFREIGVkaXRvciIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwgZWRpdG9yIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRFREIGhpZ2hsaWdodGluZyBzdHlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0c3Jjc3QuaHRtbCN0dGFnaGlsdCIgdGl0bGU9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idGVtcGxhdGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRFREIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGR0ZW1wbHQuaHRtbCN0d21hY3JvIiB0aXRsZT0iV29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iRFREIj4KLSAgICA8ZW50cnkga2V5d29yZD0idmFsaWRhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R2YWxkdGQuaHRtbCN0dmFsZHRkIiB0aXRsZT0iVmFsaWRhdGluZyBEVERzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkRURCBlZGl0b3IiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJrZXlib2FyZCBzaG9ydGN1dHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9yZHRka2V5Lmh0bWwja2V5Ym9hcmRzaG9ydGN1dHNpbnRoZWR0ZGVkaXRvciIgdGl0bGU9IkRURCBlZGl0b3Iga2V5Ym9hcmQgc2hvcnRjdXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImtleWJvYXJkIHNob3J0Y3V0cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRURCBlZGl0b3IiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9yZHRka2V5Lmh0bWwja2V5Ym9hcmRzaG9ydGN1dHNpbnRoZWR0ZGVkaXRvciIgdGl0bGU9IkRURCBlZGl0b3Iga2V5Ym9hcmQgc2hvcnRjdXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLTwvaW5kZXg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGMyMDU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotcGx1Z2luTmFtZSAgICAgPSBEVEQgRWRpdG9yIGRvY3VtZW50YXRpb24KLXBsdWdpblByb3ZpZGVyID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNzU4NTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuNiI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4gCi08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgIDx0b2MgZmlsZT0iRFRERWRpdG9ybWFwX3RvYy54bWwiLz4KLSAgICAgICA8aW5kZXggcGF0aD0iaW5kZXgvIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotCQk8aW5kZXggZmlsZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCIvPiAgICAgCi0JPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jZHRkb3Zlci5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jZHRkb3Zlci5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzBhOTk5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY2R0ZG92ZXIuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY2R0ZG92ZXIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnMgKERURHMpIC0gb3ZlcnZpZXc8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSAtIG92ZXJ2aWV3PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIHByb3ZpZGVzIHlvdSB3aXRoIHRoZSBtZWFucyB0bw0KLXZhbGlkYXRlIFhNTCBmaWxlcyBhZ2FpbnN0IGEgc2V0IG9mIHJ1bGVzLiBXaGVuIHlvdSBjcmVhdGUgYSBEVEQgZmlsZSwgeW91DQotY2FuIHNwZWNpZnkgcnVsZXMgdGhhdCBjb250cm9sIHRoZSBzdHJ1Y3R1cmUgb2YgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZQ0KLXRoZSBEVEQgZmlsZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5EVERzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5BIERURCBjYW4gY29udGFpbiBkZWNsYXJhdGlvbnMgdGhhdCBkZWZpbmUgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIG5vdGF0aW9ucywNCi1hbmQgZW50aXRpZXMgZm9yIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIERURCBmaWxlLiBJdCBhbHNvIGVzdGFibGlzaGVzDQotY29uc3RyYWludHMgZm9yIGhvdyBlYWNoIGVsZW1lbnQsIGF0dHJpYnV0ZSwgbm90YXRpb24sIGFuZCBlbnRpdHkgY2FuIGJlIHVzZWQNCi13aXRoaW4gYW55IG9mIHRoZSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIERURCBmaWxlLjwvcD4NCi08cD5UbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIHRoZSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5DQotYSBEVEQgKG9yIGFuIFhNTCBzY2hlbWEpLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREDQotKG9yIFhNTCBzY2hlbWEpLjwvcD4NCi08cD5DZXJ0YWluIFhNTCBwYXJzZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gcmVhZCBEVERzIGFuZCBjaGVjayB0byBzZWUgaWYgdGhlDQotWE1MIGZpbGUgaXQgaXMgcmVhZGluZyBmb2xsb3dzIGFsbCBvZiB0aG9zZSBydWxlcy4gV2hpbGUgdGhlIHBhcnNlciBpcyByZWFkaW5nDQotdGhlIFhNTCBmaWxlLCBpdCB3aWxsIGNoZWNrIGVhY2ggbGluZSB0byBiZSBzdXJlIHRoYXQgaXQgY29uZm9ybXMgdG8gdGhlIHJ1bGVzDQotdGhhdCBhcmUgbGFpZCBvdXQgaW4gdGhlIERURCBmaWxlLiBJZiB0aGVyZSBpcyBhIHByb2JsZW0sIHRoZSBwYXJzZXIgZ2VuZXJhdGVzDQotYW4gZXJyb3IgYW5kIHBvaW50cyB0byB3aGVyZSB0aGUgZXJyb3Igb2NjdXJzIGluIHRoZSBYTUwgZmlsZS4gVGhpcyBraW5kIG9mDQotcGFyc2VyIGlzIGNhbGxlZCBhIHZhbGlkYXRpbmcgcGFyc2VyIGJlY2F1c2UgaXQgdmFsaWRhdGVzIHRoZSBjb250ZW50IG9mIHRoZQ0KLVhNTCBmaWxlIGFnYWluc3QgdGhlIERURC48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NkdGRvdmVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NkdGRvdmVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTQ2NmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jZHRkb3Zlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyAoRFREcykgLSBvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBwcm92aWRlcyB5b3Ugd2l0aCB0aGUgbWVhbnMgdG8gdmFsaWRhdGUgWE1MIGZpbGVzIGFnYWluc3QgYSBzZXQgb2YgcnVsZXMuIFdoZW4geW91IGNyZWF0ZSBhIERURCBmaWxlLCB5b3UgY2FuIHNwZWNpZnkgcnVsZXMgdGhhdCBjb250cm9sIHRoZSBzdHJ1Y3R1cmUgb2YgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgRFREIGZpbGUuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIHByb3ZpZGVzIHlvdSB3aXRoIHRoZSBtZWFucyB0byB2YWxpZGF0ZSBYTUwgZmlsZXMgYWdhaW5zdCBhIHNldCBvZiBydWxlcy4gV2hlbiB5b3UgY3JlYXRlIGEgRFREIGZpbGUsIHlvdSBjYW4gc3BlY2lmeSBydWxlcyB0aGF0IGNvbnRyb2wgdGhlIHN0cnVjdHVyZSBvZiBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS4iIC8+Ci08bWV0YSBjb250ZW50PSJEVERzLCBvdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURHMsIG92ZXJ2aWV3IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R2YWxkdGQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjZHRkb3ZlciIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSAtIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjZHRkb3ZlciI+PGEgbmFtZT0iY2R0ZG92ZXIiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnMgKERURHMpIC0gb3ZlcnZpZXc8L2gxPgotCi0KLQotCi08ZGl2PjxwPkEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIHByb3ZpZGVzIHlvdSB3aXRoIHRoZSBtZWFucyB0bwotdmFsaWRhdGUgWE1MIGZpbGVzIGFnYWluc3QgYSBzZXQgb2YgcnVsZXMuIFdoZW4geW91IGNyZWF0ZSBhIERURCBmaWxlLCB5b3UKLWNhbiBzcGVjaWZ5IHJ1bGVzIHRoYXQgY29udHJvbCB0aGUgc3RydWN0dXJlIG9mIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UKLXRoZSBEVEQgZmlsZS48L3A+Ci0KLTxwPkEgRFREIGNhbiBjb250YWluIGRlY2xhcmF0aW9ucyB0aGF0IGRlZmluZSBlbGVtZW50cywgYXR0cmlidXRlcywgbm90YXRpb25zLAotYW5kIGVudGl0aWVzIGZvciBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS4gSXQgYWxzbyBlc3RhYmxpc2hlcwotY29uc3RyYWludHMgZm9yIGhvdyBlYWNoIGVsZW1lbnQsIGF0dHJpYnV0ZSwgbm90YXRpb24sIGFuZCBlbnRpdHkgY2FuIGJlIHVzZWQKLXdpdGhpbiBhbnkgb2YgdGhlIFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgRFREIGZpbGUuPC9wPgotCi08cD5UbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIHRoZSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5Ci1hIERURCAob3IgYW4gWE1MIHNjaGVtYSksIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQKLShvciBYTUwgc2NoZW1hKS48L3A+Ci0KLTxwPkNlcnRhaW4gWE1MIHBhcnNlcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byByZWFkIERURHMgYW5kIGNoZWNrIHRvIHNlZSBpZiB0aGUKLVhNTCBmaWxlIGl0IGlzIHJlYWRpbmcgZm9sbG93cyBhbGwgb2YgdGhvc2UgcnVsZXMuIFdoaWxlIHRoZSBwYXJzZXIgaXMgcmVhZGluZwotdGhlIFhNTCBmaWxlLCBpdCB3aWxsIGNoZWNrIGVhY2ggbGluZSB0byBiZSBzdXJlIHRoYXQgaXQgY29uZm9ybXMgdG8gdGhlIHJ1bGVzCi10aGF0IGFyZSBsYWlkIG91dCBpbiB0aGUgRFREIGZpbGUuIElmIHRoZXJlIGlzIGEgcHJvYmxlbSwgdGhlIHBhcnNlciBnZW5lcmF0ZXMKLWFuIGVycm9yIGFuZCBwb2ludHMgdG8gd2hlcmUgdGhlIGVycm9yIG9jY3VycyBpbiB0aGUgWE1MIGZpbGUuIFRoaXMga2luZCBvZgotcGFyc2VyIGlzIGNhbGxlZCBhIHZhbGlkYXRpbmcgcGFyc2VyIGJlY2F1c2UgaXQgdmFsaWRhdGVzIHRoZSBjb250ZW50IG9mIHRoZQotWE1MIGZpbGUgYWdhaW5zdCB0aGUgRFRELjwvcD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHZhbGR0ZC5odG1sIiB0aXRsZT0iVmFsaWRhdGluZyBhIERURCBmaWxlIGxldHMgeW91IHZlcmlmeSB0aGF0IGl0IGlzIHdlbGwgZm9ybWVkIGFuZCBkb2VzIG5vdCBjb250YWluIGFueSBlcnJvcnMuIj5WYWxpZGF0aW5nIERURHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya2R0ZHMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtkdGRzLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyODUwZDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya2R0ZHMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiIgICJjb25jZXB0LmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08Y29uY2VwdCBpZD0id29ya2luZ3dpdGhkdGRzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Xb3JraW5nIHdpdGggRFREczwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGlzIHNlY3Rpb25zIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6PC9zaG9ydGRlc2M+DQotPGNvbmJvZHk+PC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCi08P1B1YiAqMDAwMDAwMDM5NT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya2R0ZHMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtkdGRzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNDc4YjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya2R0ZHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ildvcmtpbmcgd2l0aCBEVERzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoaXMgc2VjdGlvbnMgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzoiIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBzZWN0aW9ucyBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOiIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV0ZHRkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90aW1wdGR0ZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHZhbGR0ZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvcmR0ZGljb25zLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9yZHRka2V5Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0id29ya2luZ3dpdGhkdGRzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+V29ya2luZyB3aXRoIERURHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Indvcmtpbmd3aXRoZHRkcyI+PGEgbmFtZT0id29ya2luZ3dpdGhkdGRzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Xb3JraW5nIHdpdGggRFREczwvaDE+Ci0KLQotPGRpdj48cD5UaGlzIHNlY3Rpb25zIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6PC9wPgotPC9kaXY+Ci0KLTxkaXY+Ci08dWwgY2xhc3M9InVsbGlua3MiPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGNyZXRkdGQuaHRtbCI+Q3JlYXRpbmcgRFREczwvYT48L3N0cm9uZz48YnIgLz4KLUEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIGNvbnRhaW5zIGEgc2V0IG9mIHJ1bGVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgYW4gWE1MIGZpbGUuIEFmdGVyIHlvdSBoYXZlIGNyZWF0ZWQgYSBEVEQsIHlvdSBjYW4gZWRpdCBpdCBtYW51YWxseSwgYWRkaW5nIGRlY2xhcmF0aW9ucyB0aGF0IGRlZmluZSBlbGVtZW50cywgYXR0cmlidXRlcywgZW50aXRpZXMsIGFuZCBub3RhdGlvbnMsIGFuZCBob3cgdGhleSBjYW4gYmUgdXNlZCBmb3IgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgRFREIGZpbGUuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RpbXB0ZHRkLmh0bWwiPkltcG9ydGluZyBEVERzPC9hPjwvc3Ryb25nPjxiciAvPgotSWYgeW91IHdhbnQgdG8gd29yayB3aXRoIERURCBmaWxlcyB0aGF0IHlvdSBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIHByb2R1Y3QsIHlvdSBjYW4gaW1wb3J0IHRoZW0gaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuIHRoZW0gaW4gdGhlIERURCBlZGl0b3IuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3R2YWxkdGQuaHRtbCI+VmFsaWRhdGluZyBEVERzPC9hPjwvc3Ryb25nPjxiciAvPgotVmFsaWRhdGluZyBhIERURCBmaWxlIGxldHMgeW91IHZlcmlmeSB0aGF0IGl0IGlzIHdlbGwgZm9ybWVkIGFuZCBkb2VzIG5vdCBjb250YWluIGFueSBlcnJvcnMuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3JkdGRpY29ucy5odG1sIj5JY29ucyB1c2VkIGluIHRoZSBEVEQgZWRpdG9yPC9hPjwvc3Ryb25nPjxiciAvPgotVGhlc2UgRFREIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUgdmlldy48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvcmR0ZGtleS5odG1sIj5EVEQgZWRpdG9yIGtleWJvYXJkIHNob3J0Y3V0czwvYT48L3N0cm9uZz48YnIgLz4KLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JkdGRpY29ucy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZHRkaWNvbnMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhM2UxOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JkdGRpY29ucy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgUmVmZXJlbmNlLy9FTiINCi0gInJlZmVyZW5jZS5kdGQiPg0KLTxyZWZlcmVuY2UgaWQ9InJpY29ucyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+SWNvbnMgdXNlZCBpbiB0aGUgRFREIGVkaXRvcjwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+SWNvbnMgdXNlZCBpbiB0aGUgRFREIGVkaXRvcjwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGVzZSBEVEQgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSB2aWV3Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkRURHM8aW5kZXh0ZXJtPmVkaXRvciBpY29uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08cmVmYm9keT4NCi08dGFibGU+DQotPHRncm91cCBjb2xzPSIyIj48Y29sc3BlYyBjb2xuYW1lPSJDT0xTUEVDMCIvPjxjb2xzcGVjIGNvbG5hbWU9IkNPTFNQRUMxIi8+DQotPHRoZWFkPg0KLTxyb3c+DQotPGVudHJ5Pkljb24mbmJzcDs8L2VudHJ5Pg0KLTxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+DQotPC9yb3c+DQotPC90aGVhZD4NCi08dGJvZHk+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMxIj48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL25hbnkuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgQU5ZIGNvbnRlbnQNCi1pY29uPC9hbHQ+PC9pbWFnZT4gPC9lbnRyeT4NCi08ZW50cnk+QU5ZIGNvbnRlbnQgKGNvbnRlbnQgbW9kZWwpPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL2F0dHJpYnV0ZS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBhdHRyaWJ1dGUNCi1pY29uPC9hbHQ+PC9pbWFnZT4gPC9lbnRyeT4NCi08ZW50cnk+YXR0cmlidXRlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL2F0dHJpYnV0ZV9saXN0LmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlDQotYXR0cmlidXRlIGxpc3QgaWNvbjwvYWx0PjwvaW1hZ2U+IDwvZW50cnk+DQotPGVudHJ5PmF0dHJpYnV0ZSBsaXN0PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9BRERfQ29tbWVudC5naWYiPjxhbHQ+VGhpcw0KLWdyYXBoaWMgaXMgdGhlIGNvbW1lbnQgaWNvbjwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzEiPmNvbW1lbnQ8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTRENob2ljZS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBjb250ZW50DQotbW9kZWwgLSBjaG9pY2UgaWNvbjwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+Y29udGVudCBtb2RlbCAtIGNob2ljZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgY29udGVudA0KLW1vZGVsIC0gc2VxdWVuY2UgaWNvbjwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+Y29udGVudCBtb2RlbCAtIHNlcXVlbmNlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL0FERF9FbGVtZW50LmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGVsZW1lbnQNCi1pY29uPC9hbHQ+PC9pbWFnZT4gPC9lbnRyeT4NCi08ZW50cnk+ZWxlbWVudDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvbmVtcHR5LmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIEVNUFRZDQotY29udGVudCAoY29udGVudCBtb2RlbCkgaWNvbjwvYWx0PjwvaW1hZ2U+IDwvZW50cnk+DQotPGVudHJ5PkVNUFRZIGNvbnRlbnQgKGNvbnRlbnQgbW9kZWwpPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL0FERF9FbnRpdHkuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgZW50aXR5DQotaWNvbjwvYWx0PjwvaW1hZ2U+IDwvZW50cnk+DQotPGVudHJ5PmVudGl0eTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9BRERfTm90YXRpb24uZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgbm90YXRpb24NCi1pY29uPC9hbHQ+PC9pbWFnZT4gPC9lbnRyeT4NCi08ZW50cnk+bm90YXRpb248L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL0FERF9FbnRpdHlfUmVmZXJlbmNlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMNCi1pcyB0aGUgcGFyYW1ldGVyIGVudGl0eSByZWZlcmVuY2UgaWNvbjwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+cGFyYW1ldGVyIGVudGl0eSByZWZlcmVuY2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGJvZHk+DQotPC90Z3JvdXA+DQotPC90YWJsZT4NCi08c2VjdGlvbj48L3NlY3Rpb24+DQotPC9yZWZib2R5Pg0KLTwvcmVmZXJlbmNlPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmR0ZGljb25zLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JkdGRpY29ucy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODBiMzk0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmR0ZGljb25zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InJlZmVyZW5jZSIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJJY29ucyB1c2VkIGluIHRoZSBEVEQgZWRpdG9yIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoZXNlIERURCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIHZpZXcuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZXNlIERURCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIHZpZXcuIiAvPgotPG1ldGEgY29udGVudD0iRFREcywgZWRpdG9yIGljb25zIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iRFREcywgZWRpdG9yIGljb25zIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3b3JrZHRkcy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InJpY29ucyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkljb25zIHVzZWQgaW4gdGhlIERURCBlZGl0b3I8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJpY29ucyI+PGEgbmFtZT0icmljb25zIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5JY29ucyB1c2VkIGluIHRoZSBEVEQgZWRpdG9yPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGVzZSBEVEQgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSB2aWV3LjwvcD4KLQotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+Ci08dGhlYWQgYWxpZ249ImxlZnQiPgotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBpZD0iTjEwMDYzIj5JY29uwqA8L3RoPgotCi08dGggdmFsaWduPSJ0b3AiIGlkPSJOMTAwNkEiPkRlc2NyaXB0aW9uPC90aD4KLQotPC90cj4KLQotPC90aGVhZD4KLQotPHRib2R5PgotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNjMgIj4mbmJzcDs8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2QSAiPiZuYnNwOzwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDYzICI+IDxpbWcgc3JjPSIuLi9pbWFnZXMvbmFueS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBBTlkgY29udGVudCYjMTA7aWNvbiIgLz4gPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNkEgIj5BTlkgY29udGVudCAoY29udGVudCBtb2RlbCk8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2MyAiPjxpbWcgc3JjPSIuLi9pbWFnZXMvYXR0cmlidXRlLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGF0dHJpYnV0ZSYjMTA7aWNvbiIgLz4gPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNkEgIj5hdHRyaWJ1dGU8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2MyAiPjxpbWcgc3JjPSIuLi9pbWFnZXMvYXR0cmlidXRlX2xpc3QuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUmIzEwO2F0dHJpYnV0ZSBsaXN0IGljb24iIC8+IDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZBICI+YXR0cmlidXRlIGxpc3Q8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2MyAiPjxpbWcgc3JjPSIuLi9pbWFnZXMvQUREX0NvbW1lbnQuZ2lmIiBhbHQ9IlRoaXMmIzEwO2dyYXBoaWMgaXMgdGhlIGNvbW1lbnQgaWNvbiIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2QSAiPmNvbW1lbnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2MyAiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL1hTRENob2ljZS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBjb250ZW50JiMxMDttb2RlbCAtIGNob2ljZSBpY29uIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZBICI+Y29udGVudCBtb2RlbCAtIGNob2ljZTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDYzICI+IDxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgY29udGVudCYjMTA7bW9kZWwgLSBzZXF1ZW5jZSBpY29uIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZBICI+Y29udGVudCBtb2RlbCAtIHNlcXVlbmNlPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNjMgIj48aW1nIHNyYz0iLi4vaW1hZ2VzL0FERF9FbGVtZW50LmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGVsZW1lbnQmIzEwO2ljb24iIC8+IDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZBICI+ZWxlbWVudDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDYzICI+IDxpbWcgc3JjPSIuLi9pbWFnZXMvbmVtcHR5LmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIEVNUFRZJiMxMDtjb250ZW50IChjb250ZW50IG1vZGVsKSBpY29uIiAvPiA8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2QSAiPkVNUFRZIGNvbnRlbnQgKGNvbnRlbnQgbW9kZWwpPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNjMgIj48aW1nIHNyYz0iLi4vaW1hZ2VzL0FERF9FbnRpdHkuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgZW50aXR5JiMxMDtpY29uIiAvPiA8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2QSAiPmVudGl0eTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDYzICI+PGltZyBzcmM9Ii4uL2ltYWdlcy9BRERfTm90YXRpb24uZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgbm90YXRpb24mIzEwO2ljb24iIC8+IDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZBICI+bm90YXRpb248L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2MyAiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL0FERF9FbnRpdHlfUmVmZXJlbmNlLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMmIzEwO2lzIHRoZSBwYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZSBpY29uIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZBICI+cGFyYW1ldGVyIGVudGl0eSByZWZlcmVuY2U8L3RkPgotCi08L3RyPgotCi08L3Rib2R5PgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iIC8+Ci0KLTwvZGl2PgotCi08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9jd29ya2R0ZHMuaHRtbCIgdGl0bGU9IlRoaXMgc2VjdGlvbnMgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzoiPldvcmtpbmcgd2l0aCBEVERzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmR0ZGtleS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZHRka2V5LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNTdmYTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZHRka2V5LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHJlZmVyZW5jZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIg0KLSAicmVmZXJlbmNlLmR0ZCI+DQotPHJlZmVyZW5jZSBpZD0ia2V5Ym9hcmRzaG9ydGN1dHNpbnRoZWR0ZGVkaXRvciIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGUgb3V0cHV0Y2xhc3M9ImlkX3RpdGxlIj5EVEQgZWRpdG9yIGtleWJvYXJkIHNob3J0Y3V0czwvdGl0bGU+DQotPHNob3J0ZGVzYyBvdXRwdXRjbGFzcz0iaWRfc2hvcnRkZXNjIj48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5EVEQgZWRpdG9yPGluZGV4dGVybT5rZXlib2FyZCBzaG9ydGN1dHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPmtleWJvYXJkIHNob3J0Y3V0czxpbmRleHRlcm0+RFREIGVkaXRvcjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08cmVmYm9keT4NCi08dGFibGUgZnJhbWU9ImFsbCI+DQotPHRncm91cCBjb2xzPSIyIj48Y29sc3BlYyBjb2xuYW1lPSJjb2wxIiBjb2x3aWR0aD0iODQqIi8+PGNvbHNwZWMgY29sbmFtZT0iY29sMyINCi1jb2x3aWR0aD0iOTMqIi8+DQotPHRoZWFkPg0KLTxyb3cgdmFsaWduPSJib3R0b20iPg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5LZXkgQ29tYmluYXRpb248L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wzIj5GdW5jdGlvbjwvZW50cnk+DQotPC9yb3c+DQotPC90aGVhZD4NCi08dGJvZHk+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+U2hpZnQrQWx0K1VwIEFycm93PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMyI+RXhwYW5kIHNlbGVjdGlvbiB0byBlbmNsb3NpbmcgZWxlbWVudDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+U2hpZnQrQWx0K1JpZ2h0IEFycm93PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMyI+RXhwYW5kIHNlbGVjdGlvbiB0byBuZXh0IGVsZW1lbnQ8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPlNoaWZ0K0FsdCtMZWZ0IEFycm93PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMyI+RXhwYW5kIHNlbGVjdGlvbiB0byBwcmV2aW91cyBlbGVtZW50PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5TaGlmdCtBbHQrRG93biBBcnJvdzwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDMiPlJlc3RvcmUgbGFzdCBzZWxlY3Rpb248L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkN0cmwrU2hpZnQrUDwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDMiPkdvIHRvIG1hdGNoaW5nIGJyYWNrZXQ8L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGJvZHk+DQotPC90Z3JvdXA+DQotPC90YWJsZT4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZHRka2V5Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JkdGRrZXkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwYTY1Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JkdGRrZXkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRFREIGVkaXRvciBrZXlib2FyZCBzaG9ydGN1dHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURCBlZGl0b3IsIGtleWJvYXJkIHNob3J0Y3V0cyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURCBlZGl0b3IsIGtleWJvYXJkIHNob3J0Y3V0cyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd29ya2R0ZHMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJrZXlib2FyZHNob3J0Y3V0c2ludGhlZHRkZWRpdG9yIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RFREIGVkaXRvciBrZXlib2FyZCBzaG9ydGN1dHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImtleWJvYXJkc2hvcnRjdXRzaW50aGVkdGRlZGl0b3IiPjxhIG5hbWU9ImtleWJvYXJkc2hvcnRjdXRzaW50aGVkdGRlZGl0b3IiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0iaWRfdGl0bGUiPkRURCBlZGl0b3Iga2V5Ym9hcmQgc2hvcnRjdXRzPC9oMT4KLQotCi0KLTxkaXY+PHAgY2xhc3M9ImlkX3Nob3J0ZGVzYyIgLz4KLQotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+Ci08dGhlYWQgYWxpZ249ImxlZnQiPgotPHRyIHZhbGlnbj0iYm90dG9tIj4KLTx0aCB2YWxpZ249ImJvdHRvbSIgd2lkdGg9IjQ3LjQ1NzYyNzExODY0NDA3JSIgaWQ9Ik4xMDA2OCI+S2V5IENvbWJpbmF0aW9uPC90aD4KLQotPHRoIHZhbGlnbj0iYm90dG9tIiB3aWR0aD0iNTIuNTQyMzcyODgxMzU1OTQlIiBpZD0iTjEwMDZGIj5GdW5jdGlvbjwvdGg+Ci0KLTwvdHI+Ci0KLTwvdGhlYWQ+Ci0KLTx0Ym9keT4KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjQ3LjQ1NzYyNzExODY0NDA3JSIgaGVhZGVycz0iTjEwMDY4ICI+U2hpZnQrQWx0K1VwIEFycm93PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTIuNTQyMzcyODgxMzU1OTQlIiBoZWFkZXJzPSJOMTAwNkYgIj5FeHBhbmQgc2VsZWN0aW9uIHRvIGVuY2xvc2luZyBlbGVtZW50PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDcuNDU3NjI3MTE4NjQ0MDclIiBoZWFkZXJzPSJOMTAwNjggIj5TaGlmdCtBbHQrUmlnaHQgQXJyb3c8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Mi41NDIzNzI4ODEzNTU5NCUiIGhlYWRlcnM9Ik4xMDA2RiAiPkV4cGFuZCBzZWxlY3Rpb24gdG8gbmV4dCBlbGVtZW50PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDcuNDU3NjI3MTE4NjQ0MDclIiBoZWFkZXJzPSJOMTAwNjggIj5TaGlmdCtBbHQrTGVmdCBBcnJvdzwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUyLjU0MjM3Mjg4MTM1NTk0JSIgaGVhZGVycz0iTjEwMDZGICI+RXhwYW5kIHNlbGVjdGlvbiB0byBwcmV2aW91cyBlbGVtZW50PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDcuNDU3NjI3MTE4NjQ0MDclIiBoZWFkZXJzPSJOMTAwNjggIj5TaGlmdCtBbHQrRG93biBBcnJvdzwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUyLjU0MjM3Mjg4MTM1NTk0JSIgaGVhZGVycz0iTjEwMDZGICI+UmVzdG9yZSBsYXN0IHNlbGVjdGlvbjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjQ3LjQ1NzYyNzExODY0NDA3JSIgaGVhZGVycz0iTjEwMDY4ICI+Q3RybCtTaGlmdCtQPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTIuNTQyMzcyODgxMzU1OTQlIiBoZWFkZXJzPSJOMTAwNkYgIj5HbyB0byBtYXRjaGluZyBicmFja2V0PC90ZD4KLQotPC90cj4KLQotPC90Ym9keT4KLQotPC90YWJsZT4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvY3dvcmtkdGRzLmh0bWwiIHRpdGxlPSJUaGlzIHNlY3Rpb25zIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6Ij5Xb3JraW5nIHdpdGggRFREczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0ZHRkLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0ZHRkLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZjhjZTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldGR0ZC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0Y3JldGR0ZCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgRFREczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+Q3JlYXRpbmcgYSBuZXcgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIGNvbnRhaW5zIGEgc2V0IG9mIHJ1bGVzIHRoYXQgY2FuDQotYmUgdXNlZCB0byB2YWxpZGF0ZSBhbiBYTUwgZmlsZS4gQWZ0ZXIgeW91IGhhdmUgY3JlYXRlZCBhIERURCwgeW91IGNhbiBlZGl0DQotaXQgbWFudWFsbHksIGFkZGluZyBkZWNsYXJhdGlvbnMgdGhhdCBkZWZpbmUgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIGVudGl0aWVzLA0KLWFuZCBub3RhdGlvbnMsIGFuZCBob3cgdGhleSBjYW4gYmUgdXNlZCBmb3IgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUNCi1EVEQgZmlsZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5EVERzPGluZGV4dGVybT5jcmVhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGNyZWF0ZSBhIG5ldw0KLURURCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNyZWF0ZSBhIHByb2plY3QgdG8gY29udGFpbiB0aGUgRFREIGlmIG5lZWRlZC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgd29ya2JlbmNoLCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5GaWxlPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD48dWljb250cm9sPk90aGVyPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5YTUw8L3VpY29udHJvbD48dWljb250cm9sPiBEVEQ8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi4gQ2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LiA8L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIHByb2plY3Qgb3IgZm9sZGVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBEVEQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+RmlsZSBuYW1lPC91aWNvbnRyb2w+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mDQotdGhlIERURCwgZm9yIGV4YW1wbGUgPHVzZXJpbnB1dD5NeURURC5kdGQ8L3VzZXJpbnB1dD4uPC9jbWQ+PGluZm8+VGhlIG5hbWUNCi1vZiB5b3VyIERURCBmaWxlIG11c3QgZW5kIHdpdGggdGhlIGV4dGVuc2lvbiA8dXNlcmlucHV0Pi5kdGQ8L3VzZXJpbnB1dD48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcCBpbXBvcnRhbmNlPSJvcHRpb25hbCI+PGNtZD5Zb3UgY2FuIHVzZSBhIERURCB0ZW1wbGF0ZSBhcyB0aGUgYmFzaXMgZm9yDQoteW91ciBuZXcgRFREIGZpbGUuIFRvIGRvIHNvLCBjbGljayB0aGUgPHVpY29udHJvbD5Vc2UgRFREIFRlbXBsYXRlPC91aWNvbnRyb2w+IGNoZWNrDQotYm94LCBhbmQgc2VsZWN0IHRoZSB0ZW1wbGF0ZSB5b3Ugd2FudCB0byB1c2UuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48cD5UaGUgRFREIGFwcGVhcnMgaW4gdGhlIE5hdmlnYXRvciB2aWV3IGFuZCBhdXRvbWF0aWNhbGx5LCBieSBkZWZhdWx0LA0KLW9wZW5zIGluIHRoZSBEVEQgZWRpdG9yLiBJbiB0aGUgRFREIGVkaXRvciwgeW91IGNhbiBtYW51YWxseSBhZGQgZWxlbWVudHMsDQotYXR0cmlidXRlcywgbm90YXRpb25zLCBlbnRpdGllcywgYW5kIGNvbW1lbnRzIHRvIHRoZSBEVEQuIElmIHlvdSBjbG9zZSB0aGUNCi1maWxlLCBhbmQgd2FudCB0byBsYXRlciByZS1vcGVuIGl0IGluIHRoZSBEVEQgZWRpdG9yLCBkb3VibGUtY2xpY2sgaXQgaW4gdGhlDQotTmF2aWdhdG9yIHZpZXcuPC9wPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXRkdGQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXRkdGQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFjMjVmMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0ZHRkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGluZyBEVERzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIGNvbnRhaW5zIGEgc2V0IG9mIHJ1bGVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgYW4gWE1MIGZpbGUuIEFmdGVyIHlvdSBoYXZlIGNyZWF0ZWQgYSBEVEQsIHlvdSBjYW4gZWRpdCBpdCBtYW51YWxseSwgYWRkaW5nIGRlY2xhcmF0aW9ucyB0aGF0IGRlZmluZSBlbGVtZW50cywgYXR0cmlidXRlcywgZW50aXRpZXMsIGFuZCBub3RhdGlvbnMsIGFuZCBob3cgdGhleSBjYW4gYmUgdXNlZCBmb3IgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgRFREIGZpbGUuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIGNvbnRhaW5zIGEgc2V0IG9mIHJ1bGVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgYW4gWE1MIGZpbGUuIEFmdGVyIHlvdSBoYXZlIGNyZWF0ZWQgYSBEVEQsIHlvdSBjYW4gZWRpdCBpdCBtYW51YWxseSwgYWRkaW5nIGRlY2xhcmF0aW9ucyB0aGF0IGRlZmluZSBlbGVtZW50cywgYXR0cmlidXRlcywgZW50aXRpZXMsIGFuZCBub3RhdGlvbnMsIGFuZCBob3cgdGhleSBjYW4gYmUgdXNlZCBmb3IgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgRFREIGZpbGUuIiAvPgotPG1ldGEgY29udGVudD0iRFREcywgY3JlYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJEVERzLCBjcmVhdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jZHRkb3Zlci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGR0ZW1wbHQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0Y3JldGR0ZCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIGEgbmV3IGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGNyZXRkdGQiPjxhIG5hbWU9InRjcmV0ZHRkIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBEVERzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBjb250YWlucyBhIHNldCBvZiBydWxlcyB0aGF0IGNhbgotYmUgdXNlZCB0byB2YWxpZGF0ZSBhbiBYTUwgZmlsZS4gQWZ0ZXIgeW91IGhhdmUgY3JlYXRlZCBhIERURCwgeW91IGNhbiBlZGl0Ci1pdCBtYW51YWxseSwgYWRkaW5nIGRlY2xhcmF0aW9ucyB0aGF0IGRlZmluZSBlbGVtZW50cywgYXR0cmlidXRlcywgZW50aXRpZXMsCi1hbmQgbm90YXRpb25zLCBhbmQgaG93IHRoZXkgY2FuIGJlIHVzZWQgZm9yIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlCi1EVEQgZmlsZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gY3JlYXRlIGEgbmV3Ci1EVEQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q3JlYXRlIGEgcHJvamVjdCB0byBjb250YWluIHRoZSBEVEQgaWYgbmVlZGVkLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSB3b3JrYmVuY2gsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZTwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdGhlcjwvc3Bhbj48L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj4gRFREPC9zcGFuPjwvc3Bhbj4uIENsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+LiA8L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgcHJvamVjdCBvciBmb2xkZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIERURC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZSBuYW1lPC9zcGFuPiBmaWVsZCwgdHlwZSB0aGUgbmFtZSBvZgotdGhlIERURCwgZm9yIGV4YW1wbGUgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5NeURURC5kdGQ8L2tiZD4uPC9zcGFuPiBUaGUgbmFtZQotb2YgeW91ciBEVEQgZmlsZSBtdXN0IGVuZCB3aXRoIHRoZSBleHRlbnNpb24gPGtiZCBjbGFzcz0idXNlcmlucHV0Ij4uZHRkPC9rYmQ+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPllvdSBjYW4gdXNlIGEgRFREIHRlbXBsYXRlIGFzIHRoZSBiYXNpcyBmb3IKLXlvdXIgbmV3IERURCBmaWxlLiBUbyBkbyBzbywgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVzZSBEVEQgVGVtcGxhdGU8L3NwYW4+IGNoZWNrCi1ib3gsIGFuZCBzZWxlY3QgdGhlIHRlbXBsYXRlIHlvdSB3YW50IHRvIHVzZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgRFREIGFwcGVhcnMgaW4gdGhlIE5hdmlnYXRvciB2aWV3IGFuZCBhdXRvbWF0aWNhbGx5LCBieSBkZWZhdWx0LAotb3BlbnMgaW4gdGhlIERURCBlZGl0b3IuIEluIHRoZSBEVEQgZWRpdG9yLCB5b3UgY2FuIG1hbnVhbGx5IGFkZCBlbGVtZW50cywKLWF0dHJpYnV0ZXMsIG5vdGF0aW9ucywgZW50aXRpZXMsIGFuZCBjb21tZW50cyB0byB0aGUgRFRELiBJZiB5b3UgY2xvc2UgdGhlCi1maWxlLCBhbmQgd2FudCB0byBsYXRlciByZS1vcGVuIGl0IGluIHRoZSBEVEQgZWRpdG9yLCBkb3VibGUtY2xpY2sgaXQgaW4gdGhlCi1OYXZpZ2F0b3Igdmlldy48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2R0ZG92ZXIuaHRtbCIgdGl0bGU9IkEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIHByb3ZpZGVzIHlvdSB3aXRoIHRoZSBtZWFucyB0byB2YWxpZGF0ZSBYTUwgZmlsZXMgYWdhaW5zdCBhIHNldCBvZiBydWxlcy4gV2hlbiB5b3UgY3JlYXRlIGEgRFREIGZpbGUsIHlvdSBjYW4gc3BlY2lmeSBydWxlcyB0aGF0IGNvbnRyb2wgdGhlIHN0cnVjdHVyZSBvZiBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS4iPkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnMgKERURHMpIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RkdGVtcGx0Lmh0bWwiIHRpdGxlPSJUZW1wbGF0ZXMgYXJlIGEgY2h1bmsgb2YgcHJlZGVmaW5lZCBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIERURCBmaWxlIHdoZW4gaXQgaXMgY3JlYXRlZC4gWW91IG1heSBmaW5kIGEgdGVtcGxhdGUgdXNlZnVsIHdoZW4geW91IGhhdmUgYSBjZXJ0YWluIHBpZWNlIG9mIGNvZGUgeW91IHdhbnQgdG8gcmV1c2Ugc2V2ZXJhbCB0aW1lcywgYW5kIHlvdSBkbyBub3Qgd2FudCB0byB3cml0ZSBpdCBvdXQgZXZlcnkgdGltZS4iPldvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGR0ZW1wbHQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGR0ZW1wbHQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdhMjY3YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkdGVtcGx0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3bWFjcm8iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPldvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5Xb3JraW5nIHdpdGggRFREIHRlbXBsYXRlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UZW1wbGF0ZXMgYXJlIGEgY2h1bmsgb2YgcHJlZGVmaW5lZCBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50bw0KLWEgRFREIGZpbGUgd2hlbiBpdCBpcyBjcmVhdGVkLiBZb3UgbWF5IGZpbmQgYSB0ZW1wbGF0ZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZQ0KLWEgY2VydGFpbiBwaWVjZSBvZiBjb2RlIHlvdSB3YW50IHRvIHJldXNlIHNldmVyYWwgdGltZXMsIGFuZCB5b3UgZG8gbm90IHdhbnQNCi10byB3cml0ZSBpdCBvdXQgZXZlcnkgdGltZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5EVERzPGluZGV4dGVybT5jcmVhdGluZyB0ZW1wbGF0ZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPnRlbXBsYXRlczxpbmRleHRlcm0+RFREPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UbyBjcmVhdGUgYSBuZXcgRFREIHRlbXBsYXRlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+V2ViIGFuZCBYTUw8L3VpY29udHJvbD48dWljb250cm9sPkRURCBGaWxlczwvdWljb250cm9sPjx1aWNvbnRyb2w+VGVtcGxhdGVzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD4gaW4gdGhlIHRlbXBsYXRlcyBwcmVmZXJlY2VzLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlN1cHBseSBhIG5ldyB0ZW1wbGF0ZSA8dWljb250cm9sPk5hbWU8L3VpY29udHJvbD4gYW5kIDx1aWNvbnRyb2w+RGVzY3JpcHRpb248L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U3BlY2lmeSB0aGUgPHVpY29udHJvbD5Db250ZXh0PC91aWNvbnRyb2w+IGZvciB0aGUgdGVtcGxhdGUuPC9jbWQ+DQotPGluZm8+VGhpcyBpcyB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wb3NhbA0KLWxpc3Qgd2hlbiBjb250ZW50IGFzc2lzdCBpcyByZXF1ZXN0ZWQuIDwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TcGVjaWZ5IHRoZSA8dWljb250cm9sPlBhdHRlcm48L3VpY29udHJvbD4gZm9yIHlvdXIgdGVtcGxhdGUgdXNpbmcNCi10aGUgYXBwcm9wcmlhdGUgdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyB0byBiZSBpbnNlcnRlZCBieSBjb250ZW50DQotYXNzaXN0LjwvY21kPjwvc3RlcD4NCi08c3RlcCBpbXBvcnRhbmNlPSJvcHRpb25hbCI+PGNtZD5UbyBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDx1aWNvbnRyb2w+SW5zZXJ0DQotVmFyaWFibGU8L3VpY29udHJvbD4gYnV0dG9uIGFuZCBzZWxlY3QgYSB2YXJpYWJsZS4gPC9jbWQ+PGluZm8+Rm9yIGV4YW1wbGUsDQotdGhlIDx1aWNvbnRyb2w+ZGF0ZTwvdWljb250cm9sPiB2YXJpYWJsZSBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgZGF0ZSB3aWxsIGJlDQotaW5zZXJ0ZWQuIDwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkFwcGx5PC91aWNvbnRyb2w+IGFuZCB0aGVuIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gdG8NCi1zYXZlIHlvdXIgY2hhbmdlcy48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUgc2FtZQ0KLXByZWZlcmVuY2VzIHBhZ2UuIDxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlLA0KLWJ1dCB5b3Ugbm8gbG9uZ2VyIHdhbnQgdGhlIHRlbXBsYXRlIHRvIGFwcGVhciBpbiB0aGUgRFREIHRlbXBsYXRlcyBsaXN0IHdoZW4NCi15b3UgY3JlYXRlIGEgZmlsZSwgY2xlYXIgaXRzIGNoZWNrYm94IGluIHRoZSB0ZW1wbGF0ZXMgdGFibGUuPC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkdGVtcGx0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkdGVtcGx0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YjFjMzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZHRlbXBsdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGVtcGxhdGVzIGFyZSBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBEVEQgZmlsZSB3aGVuIGl0IGlzIGNyZWF0ZWQuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuIHlvdSBoYXZlIGEgY2VydGFpbiBwaWVjZSBvZiBjb2RlIHlvdSB3YW50IHRvIHJldXNlIHNldmVyYWwgdGltZXMsIGFuZCB5b3UgZG8gbm90IHdhbnQgdG8gd3JpdGUgaXQgb3V0IGV2ZXJ5IHRpbWUuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRlbXBsYXRlcyBhcmUgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgRFREIGZpbGUgd2hlbiBpdCBpcyBjcmVhdGVkLiBZb3UgbWF5IGZpbmQgYSB0ZW1wbGF0ZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURHMsIGNyZWF0aW5nIHRlbXBsYXRlcywgdGVtcGxhdGVzLCBEVEQiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJEVERzLCBjcmVhdGluZyB0ZW1wbGF0ZXMsIHRlbXBsYXRlcywgRFREIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV0ZHRkLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdtYWNybyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d21hY3JvIj48YSBuYW1lPSJ0d21hY3JvIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Xb3JraW5nIHdpdGggRFREIHRlbXBsYXRlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGVtcGxhdGVzIGFyZSBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8KLWEgRFREIGZpbGUgd2hlbiBpdCBpcyBjcmVhdGVkLiBZb3UgbWF5IGZpbmQgYSB0ZW1wbGF0ZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZQotYSBjZXJ0YWluIHBpZWNlIG9mIGNvZGUgeW91IHdhbnQgdG8gcmV1c2Ugc2V2ZXJhbCB0aW1lcywgYW5kIHlvdSBkbyBub3Qgd2FudAotdG8gd3JpdGUgaXQgb3V0IGV2ZXJ5IHRpbWUuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBjcmVhdGUgYSBuZXcgRFREIHRlbXBsYXRlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZCBYTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RFREIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRlbXBsYXRlczwvc3Bhbj4KLTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiBpbiB0aGUgdGVtcGxhdGVzIHByZWZlcmVjZXMuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TdXBwbHkgYSBuZXcgdGVtcGxhdGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlc2NyaXB0aW9uPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNwZWNpZnkgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRleHQ8L3NwYW4+IGZvciB0aGUgdGVtcGxhdGUuPC9zcGFuPgotIFRoaXMgaXMgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHJvcG9zYWwKLWxpc3Qgd2hlbiBjb250ZW50IGFzc2lzdCBpcyByZXF1ZXN0ZWQuIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U3BlY2lmeSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybjwvc3Bhbj4gZm9yIHlvdXIgdGVtcGxhdGUgdXNpbmcKLXRoZSBhcHByb3ByaWF0ZSB0YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzIHRvIGJlIGluc2VydGVkIGJ5IGNvbnRlbnQKLWFzc2lzdC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5UbyBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluc2VydAotVmFyaWFibGU8L3NwYW4+IGJ1dHRvbiBhbmQgc2VsZWN0IGEgdmFyaWFibGUuIDwvc3Bhbj4gRm9yIGV4YW1wbGUsCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+ZGF0ZTwvc3Bhbj4gdmFyaWFibGUgaW5kaWNhdGVzIHRoZSBjdXJyZW50IGRhdGUgd2lsbCBiZQotaW5zZXJ0ZWQuIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwbHk8L3NwYW4+IGFuZCB0aGVuIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0bwotc2F2ZSB5b3VyIGNoYW5nZXMuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBjYW4gZWRpdCwgcmVtb3ZlLCBpbXBvcnQsIG9yIGV4cG9ydCBhIHRlbXBsYXRlIGJ5IHVzaW5nIHRoZSBzYW1lCi1wcmVmZXJlbmNlcyBwYWdlLiA8cD5JZiB5b3UgaGF2ZSBhIHRlbXBsYXRlIHRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSwKLWJ1dCB5b3Ugbm8gbG9uZ2VyIHdhbnQgdGhlIHRlbXBsYXRlIHRvIGFwcGVhciBpbiB0aGUgRFREIHRlbXBsYXRlcyBsaXN0IHdoZW4KLXlvdSBjcmVhdGUgYSBmaWxlLCBjbGVhciBpdHMgY2hlY2tib3ggaW4gdGhlIHRlbXBsYXRlcyB0YWJsZS48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNyZXRkdGQuaHRtbCIgdGl0bGU9IkEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIGNvbnRhaW5zIGEgc2V0IG9mIHJ1bGVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgYW4gWE1MIGZpbGUuIEFmdGVyIHlvdSBoYXZlIGNyZWF0ZWQgYSBEVEQsIHlvdSBjYW4gZWRpdCBpdCBtYW51YWxseSwgYWRkaW5nIGRlY2xhcmF0aW9ucyB0aGF0IGRlZmluZSBlbGVtZW50cywgYXR0cmlidXRlcywgZW50aXRpZXMsIGFuZCBub3RhdGlvbnMsIGFuZCBob3cgdGhleSBjYW4gYmUgdXNlZCBmb3IgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgRFREIGZpbGUuIj5DcmVhdGluZyBEVERzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNyY3N0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzcmNzdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDQyZjY3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNyY3N0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR0YWdoaWx0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIGZvciBEVEQgZmlsZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+SWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdmFyaW91cyBhc3BlY3RzIG9mIGhvdyB0aGUgRFREIHNvdXJjZQ0KLWNvZGUgaXMgZGlzcGxheWVkIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgRFREIGVkaXRvciwgc3VjaCBhcyB0aGUgY29sb3JzDQotdGhlIHRhZ3Mgd2lsbCBiZSBkaXNwbGF5ZWQgaW4uPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+RFREczxpbmRleHRlcm0+aGlnaGxpZ2h0aW5nIHN0eWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+RFREIGhpZ2hsaWdodGluZyBzdHlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRvIHNldCBoaWdobGlnaHRpbmcgc3R5bGVzIGZvciB0aGUgRFREIGNvZGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcNCi1zdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08dWljb250cm9sPldlYiBhbmQgWE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5EVEQgRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPiBTeW50YXgNCi1Db2xvcmluZzwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPlN5bnRheCBFbGVtZW50PC91aWNvbnRyb2w+IGxpc3QsIHNlbGVjdCB0aGUgc291cmNlDQotdGFnIHR5cGUgdGhhdCB5b3Ugd2lzaCB0byBzZXQgYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLiBZb3UgY2FuIGFsc28gY2xpY2sNCi10ZXh0IGluIHRoZSBzYW1wbGUgdGV4dCB0byBzcGVjaWZ5IHRoZSBzb3VyY2UgdGFnIHR5cGUgdGhhdCB5b3Ugd2lzaCB0byBzZXQNCi1hIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+Rm9yZWdyb3VuZDwvdWljb250cm9sPiBib3ggYW5kIHNlbGVjdCB0aGUNCi1jb2xvciB0aGF0IHlvdSB3YW50IHRoZSB0ZXh0IG9mIHRoZSB0YWcgdG8gYXBwZWFyIGluIGFuZCBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkJhY2tncm91bmQ8L3VpY29udHJvbD4gYm94IGFuZCBzZWxlY3QgdGhlDQotY29sb3IgdGhhdCB5b3Ugd2FudCB0byBhcHBlYXIgYmVoaW5kIHRoZSB0YWcgYW5kIGNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSA8dWljb250cm9sPkJvbGQ8L3VpY29udHJvbD4sIDx1aWNvbnRyb2w+SXRhbGljPC91aWNvbnRyb2w+LCA8dWljb250cm9sPlN0cmlrZXRocm91Z2g8L3VpY29udHJvbD4sDQotYW5kPHVpY29udHJvbD5VbmRlcmxpbmU8L3VpY29udHJvbD4gY2hlY2sgYm94ZXMgZm9yIGFkZGl0aW9uYWwgZm9ybWF0dGluZw0KLW9wdGlvbnMuIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+UmVzdG9yZSBEZWZhdWx0PC91aWNvbnRyb2w+IHRvIHNldCB0aGUgaGlnaGxpZ2h0aW5nDQotc3R5bGVzIGJhY2sgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuIElmIHlvdSBvbmx5IHdhbnQgdG8gcmVzZXQgdGhlIHZhbHVlIGZvcg0KLWEgcGFydGljdWxhciBjb250ZW50IHR5cGUsIHNlbGVjdCBpdCBpbiB0aGUgPHVpY29udHJvbD5Db250ZW50IHR5cGU8L3VpY29udHJvbD4gZmllbGQsDQotdGhlIGNsaWNrIHRoZSA8dWljb250cm9sPlJlc3RvcmUgRGVmYXVsdDwvdWljb250cm9sPiBidXR0b24gbmV4dCB0byBpdC4gPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0byBzYXZlIHlvdXIgY2hhbmdlcy48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNyY3N0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzcmNzdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTc1MjFhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNyY3N0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIERURCBzb3VyY2UgY29kZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBEVEQgZWRpdG9yLCBzdWNoIGFzIHRoZSBjb2xvcnMgdGhlIHRhZ3Mgd2lsbCBiZSBkaXNwbGF5ZWQgaW4uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIERURCBzb3VyY2UgY29kZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBEVEQgZWRpdG9yLCBzdWNoIGFzIHRoZSBjb2xvcnMgdGhlIHRhZ3Mgd2lsbCBiZSBkaXNwbGF5ZWQgaW4uIiAvPgotPG1ldGEgY29udGVudD0iRFREcywgaGlnaGxpZ2h0aW5nIHN0eWxlcywgWE1MIGVkaXRvciwgRFREIGhpZ2hsaWdodGluZyBzdHlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJEVERzLCBoaWdobGlnaHRpbmcgc3R5bGVzLCBYTUwgZWRpdG9yLCBEVEQgaGlnaGxpZ2h0aW5nIHN0eWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3JldGR0ZC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR0YWdoaWx0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyBmb3IgRFREIGZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0dGFnaGlsdCI+PGEgbmFtZT0idHRhZ2hpbHQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIERURCBzb3VyY2UKLWNvZGUgaXMgZGlzcGxheWVkIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgRFREIGVkaXRvciwgc3VjaCBhcyB0aGUgY29sb3JzCi10aGUgdGFncyB3aWxsIGJlIGRpc3BsYXllZCBpbi48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIHNldCBoaWdobGlnaHRpbmcgc3R5bGVzIGZvciB0aGUgRFREIGNvZGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcKLXN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kIFhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EVEQgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+IFN5bnRheAotQ29sb3Jpbmc8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TeW50YXggRWxlbWVudDwvc3Bhbj4gbGlzdCwgc2VsZWN0IHRoZSBzb3VyY2UKLXRhZyB0eXBlIHRoYXQgeW91IHdpc2ggdG8gc2V0IGEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci4gWW91IGNhbiBhbHNvIGNsaWNrCi10ZXh0IGluIHRoZSBzYW1wbGUgdGV4dCB0byBzcGVjaWZ5IHRoZSBzb3VyY2UgdGFnIHR5cGUgdGhhdCB5b3Ugd2lzaCB0byBzZXQKLWEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Gb3JlZ3JvdW5kPC9zcGFuPiBib3ggYW5kIHNlbGVjdCB0aGUKLWNvbG9yIHRoYXQgeW91IHdhbnQgdGhlIHRleHQgb2YgdGhlIHRhZyB0byBhcHBlYXIgaW4gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJhY2tncm91bmQ8L3NwYW4+IGJveCBhbmQgc2VsZWN0IHRoZQotY29sb3IgdGhhdCB5b3Ugd2FudCB0byBhcHBlYXIgYmVoaW5kIHRoZSB0YWcgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Cb2xkPC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SXRhbGljPC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3RyaWtldGhyb3VnaDwvc3Bhbj4sCi1hbmQ8c3BhbiBjbGFzcz0idWljb250cm9sIj5VbmRlcmxpbmU8L3NwYW4+IGNoZWNrIGJveGVzIGZvciBhZGRpdGlvbmFsIGZvcm1hdHRpbmcKLW9wdGlvbnMuIDwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVzdG9yZSBEZWZhdWx0PC9zcGFuPiB0byBzZXQgdGhlIGhpZ2hsaWdodGluZwotc3R5bGVzIGJhY2sgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuIElmIHlvdSBvbmx5IHdhbnQgdG8gcmVzZXQgdGhlIHZhbHVlIGZvcgotYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZSwgc2VsZWN0IGl0IGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZW50IHR5cGU8L3NwYW4+IGZpZWxkLAotdGhlIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZXN0b3JlIERlZmF1bHQ8L3NwYW4+IGJ1dHRvbiBuZXh0IHRvIGl0LiA8L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvIHNhdmUgeW91ciBjaGFuZ2VzLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIiAvPgotCi08L2Rpdj4KLQotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvdGNyZXRkdGQuaHRtbCIgdGl0bGU9IkEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIGNvbnRhaW5zIGEgc2V0IG9mIHJ1bGVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgYW4gWE1MIGZpbGUuIEFmdGVyIHlvdSBoYXZlIGNyZWF0ZWQgYSBEVEQsIHlvdSBjYW4gZWRpdCBpdCBtYW51YWxseSwgYWRkaW5nIGRlY2xhcmF0aW9ucyB0aGF0IGRlZmluZSBlbGVtZW50cywgYXR0cmlidXRlcywgZW50aXRpZXMsIGFuZCBub3RhdGlvbnMsIGFuZCBob3cgdGhleSBjYW4gYmUgdXNlZCBmb3IgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgRFREIGZpbGUuIj5DcmVhdGluZyBEVERzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHRkdGQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHRkdGQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3NTkwYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXB0ZHRkLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRpbXB0ZHRkIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5JbXBvcnRpbmcgRFREczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+SW1wb3J0aW5nIERURHM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+SWYgeW91IHdhbnQgdG8gd29yayB3aXRoIERURCBmaWxlcyB0aGF0IHlvdSBjcmVhdGVkIG91dHNpZGUgb2YNCi10aGUgcHJvZHVjdCwgeW91IGNhbiBpbXBvcnQgdGhlbSBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW4gdGhlbSBpbiB0aGUgRFREDQotZWRpdG9yLiA8L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5EVERzPGluZGV4dGVybT5pbXBvcnRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRvIGltcG9ydCBhIERURCBpbnRvIHRoZSB3b3JrYmVuY2gsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5GaWxlPC91aWNvbnRyb2w+PHVpY29udHJvbD5JbXBvcnQ8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPi4gU2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPkdlbmVyYWw8L3VpY29udHJvbD48dWljb250cm9sPkZpbGUNCi1TeXN0ZW08L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiBhbmQgY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkZpbGwgaW4gdGhlIGZpZWxkcyBpbiB0aGUgPHVpY29udHJvbD5JbXBvcnQ8L3VpY29udHJvbD4gd2l6YXJkDQotYXMgbmVjZXNzYXJ5LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+IHRvIGV4aXQgdGhlIHdpemFyZCBhbmQgaW1wb3J0DQotdGhlIGZpbGVzLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgRFREIGZpbGUgaW4gdGhlIE5hdmlnYXRvciB2aWV3IGFuZCBkb3VibGUtY2xpY2sgaXQgdG8NCi1vcGVuIGl0IGluIHRoZSBEVEQgZWRpdG9yLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+QWZ0ZXIgeW91IGhhdmUgaW1wb3J0ZWQgYSBEVEQgZmlsZSBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW5lZA0KLWl0IGluIHRoZSBEVEQgZWRpdG9yLCB5b3UgY2FuIGVkaXQgaXQgbWFudWFsbHkuPC9wPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHRkdGQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHRkdGQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxM2ViMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXB0ZHRkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJJbXBvcnRpbmcgRFREcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJJZiB5b3Ugd2FudCB0byB3b3JrIHdpdGggRFREIGZpbGVzIHRoYXQgeW91IGNyZWF0ZWQgb3V0c2lkZSBvZiB0aGUgcHJvZHVjdCwgeW91IGNhbiBpbXBvcnQgdGhlbSBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW4gdGhlbSBpbiB0aGUgRFREIGVkaXRvci4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSWYgeW91IHdhbnQgdG8gd29yayB3aXRoIERURCBmaWxlcyB0aGF0IHlvdSBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIHByb2R1Y3QsIHlvdSBjYW4gaW1wb3J0IHRoZW0gaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuIHRoZW0gaW4gdGhlIERURCBlZGl0b3IuIiAvPgotPG1ldGEgY29udGVudD0iRFREcywgaW1wb3J0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iRFREcywgaW1wb3J0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3b3JrZHRkcy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRpbXB0ZHRkIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+SW1wb3J0aW5nIERURHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRpbXB0ZHRkIj48YSBuYW1lPSJ0aW1wdGR0ZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SW1wb3J0aW5nIERURHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPklmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBEVEQgZmlsZXMgdGhhdCB5b3UgY3JlYXRlZCBvdXRzaWRlIG9mCi10aGUgcHJvZHVjdCwgeW91IGNhbiBpbXBvcnQgdGhlbSBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW4gdGhlbSBpbiB0aGUgRFRECi1lZGl0b3IuIDwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gaW1wb3J0IGEgRFREIGludG8gdGhlIHdvcmtiZW5jaCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbXBvcnQ8L3NwYW4+Ci08L3NwYW4+LiBTZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUKLVN5c3RlbTwvc3Bhbj48L3NwYW4+IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+RmlsbCBpbiB0aGUgZmllbGRzIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbXBvcnQ8L3NwYW4+IHdpemFyZAotYXMgbmVjZXNzYXJ5Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPiB0byBleGl0IHRoZSB3aXphcmQgYW5kIGltcG9ydAotdGhlIGZpbGVzLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0IHRoZSBEVEQgZmlsZSBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIGRvdWJsZS1jbGljayBpdCB0bwotb3BlbiBpdCBpbiB0aGUgRFREIGVkaXRvci48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+QWZ0ZXIgeW91IGhhdmUgaW1wb3J0ZWQgYSBEVEQgZmlsZSBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW5lZAotaXQgaW4gdGhlIERURCBlZGl0b3IsIHlvdSBjYW4gZWRpdCBpdCBtYW51YWxseS48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL2N3b3JrZHRkcy5odG1sIiB0aXRsZT0iVGhpcyBzZWN0aW9ucyBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOiI+V29ya2luZyB3aXRoIERURHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmFsZHRkLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2YWxkdGQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjN2FhNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2YWxkdGQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA4LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBTdHkgX2Rpc3BsYXkgRm9udENvbG9yPSJyZWQiPz4NCi08dGFzayBpZD0idHZhbGR0ZCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+VmFsaWRhdGluZyBEVERzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5WYWxpZGF0aW5nIERURHM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VmFsaWRhdGluZyBhIERURCBmaWxlIGxldHMgeW91IHZlcmlmeSB0aGF0IGl0IGlzIHdlbGwgZm9ybWVkDQotYW5kIGRvZXMgbm90IGNvbnRhaW4gYW55IGVycm9ycy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5EVEQ8aW5kZXh0ZXJtPnZhbGlkYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlDQotcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5Ubw0KLXZhbGlkYXRlIGEgRFRELCByaWdodC1jbGljayB0aGUgRFREIGluIHRoZSBOYXZpZ2F0b3IgdmlldyBhbmQgY2xpY2sgPG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+VmFsaWRhdGU8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi4gQSBkaWFsb2cgb3BlbnMsIGluZGljYXRpbmcNCi1pZiB0aGUgRFREIGZpbGUgd2FzIHN1Y2Nlc3NmdWxseSB2YWxpZGF0ZWQgb3Igbm90LiBJZiB0aGUgZmlsZSBpcw0KLWludmFsaWQsIGFueSBlcnJvcnMgd2lsbCBhcHBlYXIgaW4gdGhlIFByb2JsZW1zIHZpZXcuPD9QdWIgQ2FyZXQ/PjwvcD48L2NvbnRleHQ+DQotPHJlc3VsdD48bm90ZT5JZiB5b3UgcmVjZWl2ZSBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUNCi1Qcm9ibGVtcyB2aWV3IGlzIGZ1bGwsIHlvdSBjYW4gaW5jcmVhc2UgdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcw0KLWFsbG93ZWQgaW4gdGhlIHZpZXcuIENsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPkdlbmVyYWw8L3VpY29udHJvbD48dWljb250cm9sPk1hcmtlcnM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPi4gT24gdGhpcyBwcmVmZXJlbmNlcyBwYWdlIHlvdSBjYW4gaW5jcmVhc2Ugb3IgZGVjcmVhc2UNCi10aGUgbnVtYmVyIG9mIHZpc2libGUgaXRlbXMgaW4gdGhlIHByb2JsZW1zIHZpZXcuIDwvbm90ZT48cD5Zb3UgY2FuDQotc2V0IHVwIGEgcHJvamVjdCdzIHByb3BlcnRpZXMgc28gdGhhdCBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdCByZXNvdXJjZXMNCi1hcmUgYXV0b21hdGljYWxseSB2YWxpZGF0ZWQgd2hlbiB5b3Ugc2F2ZSB0aGVtLiBSaWdodCBjbGljayBvbiB0aGUNCi1wcm9qZWN0LCBjbGljayA8dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD4sIGFuZCBzZWxlY3QgPHVpY29udHJvbD5WYWxpZGF0aW9uPC91aWNvbnRyb2w+Lg0KLUFueSB2YWxpZGF0b3JzIHlvdSBjYW4gcnVuIGFnYWluc3QgeW91ciZuYnNwO3Byb2plY3Qgd2lsbCBiZSBsaXN0ZWQNCi1pbiB0aGUgVmFsaWRhdGlvbiBwYWdlLjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5kaXRhIg0KLXNjb3BlPSJwZWVyIj48bGlua3RleHQ+VmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zPC9saW5rdGV4dD4NCi08ZGVzYz5HZW5lcmFsIHZhbGlkYXRpb24gaW5mb3JtYXRpb248L2Rlc2M+DQotPC9saW5rPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDIxMDU/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZhbGR0ZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmFsZHRkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwOThlNTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmFsZHRkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJWYWxpZGF0aW5nIERURHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVmFsaWRhdGluZyBhIERURCBmaWxlIGxldHMgeW91IHZlcmlmeSB0aGF0IGl0IGlzIHdlbGwgZm9ybWVkIGFuZCBkb2VzIG5vdCBjb250YWluIGFueSBlcnJvcnMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlZhbGlkYXRpbmcgYSBEVEQgZmlsZSBsZXRzIHlvdSB2ZXJpZnkgdGhhdCBpdCBpcyB3ZWxsIGZvcm1lZCBhbmQgZG9lcyBub3QgY29udGFpbiBhbnkgZXJyb3JzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURCwgdmFsaWRhdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURCwgdmFsaWRhdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR2YWxkdGQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5WYWxpZGF0aW5nIERURHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR2YWxkdGQiPjxhIG5hbWU9InR2YWxkdGQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlZhbGlkYXRpbmcgRFREczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VmFsaWRhdGluZyBhIERURCBmaWxlIGxldHMgeW91IHZlcmlmeSB0aGF0IGl0IGlzIHdlbGwgZm9ybWVkCi1hbmQgZG9lcyBub3QgY29udGFpbiBhbnkgZXJyb3JzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UKLXBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbwotdmFsaWRhdGUgYSBEVEQsIHJpZ2h0LWNsaWNrIHRoZSBEVEQgaW4gdGhlIE5hdmlnYXRvciB2aWV3IGFuZCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFsaWRhdGU8L3NwYW4+PC9zcGFuPi4gQSBkaWFsb2cgb3BlbnMsIGluZGljYXRpbmcKLWlmIHRoZSBEVEQgZmlsZSB3YXMgc3VjY2Vzc2Z1bGx5IHZhbGlkYXRlZCBvciBub3QuIElmIHRoZSBmaWxlIGlzCi1pbnZhbGlkLCBhbnkgZXJyb3JzIHdpbGwgYXBwZWFyIGluIHRoZSBQcm9ibGVtcyB2aWV3LjwvcD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSWYgeW91IHJlY2VpdmUgYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlCi1Qcm9ibGVtcyB2aWV3IGlzIGZ1bGwsIHlvdSBjYW4gaW5jcmVhc2UgdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcwotYWxsb3dlZCBpbiB0aGUgdmlldy4gQ2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj48L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYWw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWFya2Vyczwvc3Bhbj4KLTwvc3Bhbj4uIE9uIHRoaXMgcHJlZmVyZW5jZXMgcGFnZSB5b3UgY2FuIGluY3JlYXNlIG9yIGRlY3JlYXNlCi10aGUgbnVtYmVyIG9mIHZpc2libGUgaXRlbXMgaW4gdGhlIHByb2JsZW1zIHZpZXcuIDwvZGl2PgotPHA+WW91IGNhbgotc2V0IHVwIGEgcHJvamVjdCdzIHByb3BlcnRpZXMgc28gdGhhdCBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdCByZXNvdXJjZXMKLWFyZSBhdXRvbWF0aWNhbGx5IHZhbGlkYXRlZCB3aGVuIHlvdSBzYXZlIHRoZW0uIFJpZ2h0IGNsaWNrIG9uIHRoZQotcHJvamVjdCwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj4sIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFsaWRhdGlvbjwvc3Bhbj4uCi1BbnkgdmFsaWRhdG9ycyB5b3UgY2FuIHJ1biBhZ2FpbnN0IHlvdXLCoHByb2plY3Qgd2lsbCBiZSBsaXN0ZWQKLWluIHRoZSBWYWxpZGF0aW9uIHBhZ2UuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGluZm8iPjxzdHJvbmc+UmVsYXRlZCBpbmZvcm1hdGlvbjwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuaHRtbCIgdGl0bGU9IkdlbmVyYWwgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbiI+VmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhYTFiNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDhiNWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjM3OjIxIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJhYzY1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjQ5NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jU3VuIEFwciAxNiAxNDowNToyOSBFRFQgMjAwNgotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvRWRpdG9ySHRtbENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9FZGl0b3JIdG1sQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjhkYzEwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9FZGl0b3JIdG1sQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotCi08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0ibWlzYzAxNzAiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBlZGl0IHRoZSBXZWIgY29udGVudCBzZXR0aW5ncyBmb3IgYSBXZWIgcHJvamVjdC4gWW91IGNhbiBzcGVjaWZ5IHRoZSBkZWZhdWx0IGRvY3VtZW50IHR5cGUsIENTUyBwcm9maWxlLCBhbmQgdGFyZ2V0IGRldmljZS4gVGhlIHB1YmxpYyBJRCBhbmQgc3lzdGVtIElEIGFyZSBwb3B1bGF0ZWQgYXV0b21hdGljYWxseS4gVG8gcmVzdG9yZSB0aGUgZGVmYXVsdHMsIGNsaWNrIDxiPlJlc3RvcmUgRGVmYXVsdHM8L2I+LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYngwMDMwIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgbGluZSBkZWxpbWl0ZXIgYW5kIHRoZSB0ZXh0IGVuY29kaW5nIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4geW91IGNyZWF0ZSwgc2F2ZSwgb3IgbG9hZCBhbiBIVE1MIGZpbGUuCi0KLVZhcmlvdXMgZGV2ZWxvcG1lbnQgcGxhdGZvcm1zIHVzZSBkaWZmZXJlbnQgbGluZSBkZWxpbWl0ZXJzIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiBhIG5ldyBsaW5lLiBTZWxlY3QgdGhlIG9wZXJhdGluZyBzeXN0ZW0gdGhhdCBjb3JyZXNwb25kcyB0byB5b3VyIGRldmVsb3BtZW50IG9yIGRlcGxveW1lbnQgcGxhdGZvcm0uCi08Yj5Ob3RlOjwvYj4gVGhpcyBkZWxpbWl0ZXIgd2lsbCBub3QgYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byBhbnkgZG9jdW1lbnRzIHRoYXQgY3VycmVudGx5IGV4aXN0LiBJdCB3aWxsIGJlIGFkZGVkIG9ubHkgdG8gZG9jdW1lbnRzIHRoYXQgeW91IGNyZWF0ZSBhZnRlciB5b3Ugc2VsZWN0IHRoZSBsaW5lIGRlbGltaXRlciB0eXBlIGFuZCBjbGljayA8Yj5BcHBseTwvYj4sIG9yIHRvIGV4aXN0aW5nIGZpbGVzIHRoYXQgeW91IG9wZW4gYW5kIHRoZW4gcmVzYXZlIGFmdGVyIHlvdSBzZWxlY3QgdGhlIGxpbmUgZGVsaW1pdGVyIHR5cGUgYW5kIGNsaWNrIDxiPkFwcGx5PC9iPi4KLQotVGhlIGVuY29kaW5nIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nIHNldCB0aGF0IGlzIHVzZWQgd2hlbiBlaXRoZXIgY3JlYXRpbmcgSFRNTCBmaWxlcyBvciBsb2FkaW5nIHlvdXIgSFRNTCBmaWxlcyBpbnRvIHRoZSBlZGl0b3IuICBDaGFuZ2luZyB0aGUgY3JlYXRpbmcgZmlsZXMgZW5jb2RpbmcgY2F1c2VzIGFueSBuZXcgSFRNTCBmaWxlcyB0aGF0IGFyZSBjcmVhdGVkIGZyb20gc2NyYXRjaCB0byB1c2UgdGhlIHNlbGVjdGVkIGVuY29kaW5nLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VieDAwMzEiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBmb3JtYXR0aW5nLCBjb250ZW50IGFzc2lzdCwgYW5kIGNhcGl0YWxpemF0aW9uIHN0eWxlIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4geW91IGVkaXQgYW4gSFRNTCBmaWxlLgotCi1FbnRlciBhIG1heGltdW0gd2lkdGggaW4gdGhlIDxiPkxpbmUgd2lkdGg8L2I+IGZpZWxkIHRvIHNwZWNpZnkgdGhlIGxpbmUgd2lkdGggdG8gYnJlYWsgYSBsaW5lIHRvIGZpdCBvbnRvIG1vcmUgdGhhbiBvbmUgbGluZSB3aGVuIHRoZSBkb2N1bWVudCBpcyBmb3JtYXR0ZWQuCi0KLVNlbGVjdCA8Yj5TcGxpdCBtdWx0aXBsZSBhdHRyaWJ1dGVzIGVhY2ggb24gYSBuZXcgbGluZTwvYj4gdG8gc3RhcnQgZXZlcnkgYXR0cmlidXRlIG9uIGEgbmV3IGxpbmUgd2hlbiB0aGUgZG9jdW1lbnQgaXMgZm9ybWF0dGVkLiBBdHRyaWJ1dGVzIHdpbGwgcmV0dXJuIHRvIHRoZSBzYW1lIG1hcmdpbiBhcyB0aGUgcHJldmlvdXMgbGluZS4KLQotU2VsZWN0IDxiPkluZGVudCB1c2luZyB0YWJzPC9iPiBpZiB5b3Ugd2FudCB0byB1c2UgdGFiIGNoYXJhY3RlcnMgKFx0KSBhcyB0aGUgc3RhbmRhcmQgZm9ybWF0dGluZyBpbmRlbnRhdGlvbi4KLQotSWYgeW91IHByZWZlciB0byB1c2Ugc3BhY2VzLCBzZWxlY3QgPGI+SW5kZW50IHVzaW5nIHNwYWNlczwvYj4uCi0KLVlvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSA8Yj5JbmRlbnRhdGlvbiBzaXplPC9iPiB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHRhYnMgb3Igc3BhY2UgY2hhcmFjdGVycyB1c2VkIGZvciBmb3JtYXR0aW5nIGluZGVudGF0aW9uLgotCi1TZWxlY3QgPGI+Q2xlYXIgYWxsIGJsYW5rIGxpbmVzPC9iPiB0byByZW1vdmUgYmxhbmsgbGluZXMgd2hlbiB0aGUgZG9jdW1lbnQgaXMgZm9ybWF0dGVkLgotCi1UbyBhcHBseSB0aGVzZSBmb3JtYXR0aW5nIHN0eWxlcywgc2VsZWN0IHRoZSA8Yj5Gb3JtYXQgRG9jdW1lbnQ8L2I+IG1lbnUgaXRlbS4KLQotSWYgdGhlIDxiPkF1dG9tYXRpY2FsbHkgbWFrZSBzdWdnZXN0aW9uczwvYj4gY2hlY2sgYm94IGlzIHNlbGVjdGVkLCB5b3UgY2FuIHNwZWNpZnkgdGhhdCBjZXJ0YWluIGNoYXJhY3RlcnMgd2lsbCBjYXVzZSB0aGUgY29udGVudCBhc3Npc3QgbGlzdCB0byBwb3AgdXAgYXV0b21hdGljYWxseS4gU3BlY2lmeSB0aGVzZSBjaGFyYWN0ZXJzIGluIHRoZSA8Yj5Qcm9tcHQgd2hlbiB0aGVzZSBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZDwvYj4gZmllbGQuCi0KLVNlbGVjdCB0aGUgVXBwZXJjYXNlIG9yIExvd2VyY2FzZSByYWRpbyBidXR0b24gdG8gZGV0ZXJtaW5lIHRoZSBjYXNlIGZvciB0YWcgYW5kIGF0dHJpYnV0ZSBuYW1lcyB0aGF0IGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBkb2N1bWVudCB3aGVuIHVzaW5nIGNvbnRlbnQgYXNzaXN0IG9yIGNvZGUgZ2VuZXJhdGlvbi4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYngwMDMyIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3VzdG9taXplIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nIHRoYXQgdGhlIEhUTUwgZWRpdG9yIGRvZXMgd2hlbiB5b3UgYXJlIGVkaXRpbmcgYSBmaWxlLgotCi1UaGUgPGI+Q29udGVudCB0eXBlPC9iPiBmaWVsZCBjb250YWlucyBhIGxpc3Qgb2YgYWxsIHRoZSBzb3VyY2UgdHlwZXMgdGhhdCB5b3UgY2FuIHNlbGVjdCBhIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuIFlvdSBjYW4gZWl0aGVyIHNlbGVjdCB0aGUgY29udGVudCB0eXBlIHRoYXQgeW91IHdhbnQgdG8gd29yayB3aXRoIGZyb20gdGhlIGRyb3AtZG93biBsaXN0LCBvciBjbGljayB0ZXh0IGluIHRoZSB0ZXh0IHNhbXBsZSB3aW5kb3cgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY29udGVudCB0eXBlIGZvciB3aGljaCB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIHRleHQgaGlnaGxpZ2h0aW5nLgotCi1UaGUgPGI+Rm9yZWdyb3VuZDwvYj4gYW5kIDxiPkJhY2tncm91bmQ8L2I+IHB1c2ggYnV0dG9ucyBvcGVuIDxiPkNvbG9yPC9iPiBkaWFsb2cgYm94ZXMgdGhhdCBhbGxvdyB5b3UgdG8gc3BlY2lmeSB0ZXh0IGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzLCByZXNwZWN0aXZlbHkuIFNlbGVjdCB0aGUgPGI+Qm9sZDwvYj4gY2hlY2sgYm94IHRvIG1ha2UgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUgYXBwZWFyIGluIGJvbGQuCi0KLUNsaWNrIHRoZSA8Yj5SZXN0b3JlIERlZmF1bHQ8L2I+IHB1c2ggYnV0dG9uIHRvIHNldCB0aGUgaGlnaGxpZ2h0aW5nIHN0eWxlcyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VieDAwMzMiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBjcmVhdGUgbmV3IGFuZCBlZGl0IGV4aXN0aW5nIHRlbXBsYXRlcyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBlZGl0IGFuIEhUTUwgZmlsZS4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ4bWxtMTEwMCI+Ci08ZGVzY3JpcHRpb24+Q2xlYW51cCBvcHRpb25zIGVuYWJsZSB5b3UgdG8gdXBkYXRlIGEgZG9jdW1lbnQgc28gdGhhdCBpdCBpcyB3ZWxsLWZvcm1lZCBhbmQgZm9ybWF0dGVkLgotCi1UaGUgZm9sbG93aW5nIGNsZWFudXAgb3B0aW9ucyBsZXQgeW91IHNlbGVjdCByYWRpbyBidXR0b25zIHRvIGNob29zZSB0aGUgdHlwZSBvZiBjbGVhbnVwIHRvIGJlIHBlcmZvcm1lZDoKLS0gPGI+VGFnIG5hbWUgY2FzZSBmb3IgSFRNTDwvYj46IFVubGVzcyBzZXQgdG8gPGI+QXMtaXM8L2I+LCBjaGFuZ2VzIHRoZSBjYXNlIG9mIGFsbCB0YWdzIGluIGEgZmlsZSBmb3IgZWFzaWVyIHZpc3VhbCBwYXJzaW5nIGFuZCBjb25zaXN0ZW5jeS4KLS0gPGI+QXR0cmlidXRlIG5hbWUgY2FzZSBmb3IgSFRNTDwvYj46IFVubGVzcyBzZXQgdG8gPGI+QXMtaXM8L2I+LCBjaGFuZ2VzIHRoZSBjYXNlIG9mIGFsbCBhdHRyaWJ1dGVzIGluIGEgZmlsZSBmb3IgZWFzaWVyIHZpc3VhbCBwYXJzaW5nIGFuZCBjb25zaXN0ZW5jeS4KLQotVGhlIGZvbGxvd2luZyBjbGVhbnVwIG9wdGlvbnMgY2FuIGJlIHNldCB0byBvbiBvciBvZmYsIHNvIHRoYXQgeW91IGNhbiBsaW1pdCB0aGUgdHlwZSBvZiBjbGVhbnVwIHBlcmZvcm1lZDoKLS0gPGI+SW5zZXJ0IHJlcXVpcmVkIGF0dHJpYnV0ZXM8L2I+OiBJbnNlcnRzIGFuIG1pc3NpbmcgYXR0cmlidXRlcyB0aGF0IGFyZSByZXF1aXJlZCBieSB0aGUgdGFnIHRvIG1ha2UgdGhlIGVsZW1lbnQgb3IgZG9jdW1lbnQgd2VsbC1mb3JtZWQuCi0tIDxiPkluc2VydCBtaXNzaW5nIHRhZ3M8L2I+OiBDb21wbGV0ZXMgYW55IG1pc3NpbmcgdGFncyAoc3VjaCBhcyBhZGRpbmcgYW4gZW5kIHRhZykgbmVjZXNzYXJ5IHRvIG1ha2UgdGhlIGVsZW1lbnQgb3IgZG9jdW1lbnQgd2VsbC1mb3JtZWQuCi0tIDxiPlF1b3RlIGF0dHJpYnV0ZSB2YWx1ZXM8L2I+OiBBcHByb3ByaWF0ZWx5IGFkZHMgZG91YmxlLSBvciBzaW5nbGUtcXVvdGVzIGJlZm9yZSBhbmQgYWZ0ZXIgYXR0cmlidXRlIHZhbHVlcyBpZiB0aGV5IGFyZSBtaXNzaW5nLgotLSA8Yj5Gb3JtYXQgc291cmNlPC9iPjogRm9ybWF0cyB0aGUgZG9jdW1lbnQganVzdCBhcyB0aGUgPGI+Rm9ybWF0IERvY3VtZW50PC9iPiBjb250ZXh0IG1lbnUgb3B0aW9uIGRvZXMsIGltbWVkaWF0ZWx5IGFmdGVyIHBlcmZvcm1pbmcgYW55IG90aGVyIHNwZWNpZmllZCA8Yj5DbGVhbnVwPC9iPiBvcHRpb25zLgotLSA8Yj5Db252ZXJ0IGxpbmUgZGVsaW1pdGVycyB0bzwvYj46IENvbnZlcnRzIGFsbCBsaW5lIGRlbGltaXRlcnMgaW4gdGhlIGZpbGUgdG8gdGhlIHNlbGVjdGVkIG9wZXJhdGluZyBzeXN0ZW0ncyB0eXBlLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9FZGl0b3JIdG1sQ29udGV4dHMyLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9FZGl0b3JIdG1sQ29udGV4dHMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYxNDE4Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvRWRpdG9ySHRtbENvbnRleHRzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotCi08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci0KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJodG1sc291cmNlX3NvdXJjZV9IZWxwSWQiPgotPGRlc2NyaXB0aW9uPlRoZSBIVE1MIHNvdXJjZSBwYWdlIGVkaXRvciBsZXRzIHlvdSBlZGl0IGEgZmlsZSB0aGF0IGlzIGNvZGVkIGluIHRoZSBIeXBlcnRleHQgTWFya3VwIExhbmd1YWdlIG9yIGluIFhIVE1MLiBUaGUgZWRpdG9yIHByb3ZpZGVzIG1hbnkgdGV4dCBlZGl0aW5nIGZlYXR1cmVzLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LCB1c2VyLWRlZmluZWQgdGVtcGxhdGVzLCBzeW50YXggaGlnaGxpZ2h0aW5nLCB1bmxpbWl0ZWQgdW5kbyBhbmQgcmVkbywgZWxlbWVudCBzZWxlY3Rpb24gYW5kIGZvcm1hdHRpbmcsIGFuZCBkb2N1bWVudCBmb3JtYXR0aW5nLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNC5odG1sIi8+Ci08L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL0hUTUxXaXpDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvSFRNTFdpekNvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ2OGNmMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvSFRNTFdpekNvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0iaHRtbHcwMDEwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIEhUTUwgdGVtcGxhdGUgY2hlY2tib3ggdG8gY3JlYXRlIHlvdXIgSFRNTCBmaWxlIGJhc2VkIG9uIGEgZGVmYXVsdCB0ZW1wbGF0ZS4gQ2hvb3NlIG9uZSBvZiB0aGUgZnJhbWVzZXQgdGVtcGxhdGVzIGlmIHlvdSBhcmUgZGV2ZWxvcGluZyBhIFdlYiBzaXRlIHdpdGggZnJhbWVzLiBJZiB5b3UgZG8gbm90IHNlbGVjdCBhIHRlbXBsYXRlLCB5b3VyIG5ld2x5IGNyZWF0ZWQgSlNQIGZpbGUgd2lsbCBiZSBjb21wbGV0ZWx5IGJsYW5rLgotPC9kZXNjcmlwdGlvbj4KLTwvY29udGV4dD4KLQotCi0KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OTE1OTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFhMzUyZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIEVkaXRvckh0bWxDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIEVkaXRvckh0bWxDb250ZXh0czIueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmViOWUzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBwcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi1CdW5kbGUtTmFtZS4wID0gSFRNTCBlZGl0b3IgaW5mb3BvcHMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjA4NWU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Z2luIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgICAgICAgICAtLT4KLTwhLS0gY29udHJpYnV0aW9ucyBmb3IgdXNpbmcgdGhlIHRvb2wuICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxwbHVnaW4+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJFZGl0b3JIdG1sQ29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aSIvPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJFZGl0b3JIdG1sQ29udGV4dHMyLnhtbCIgcGx1Z2luID0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZSIvPgotICAgICAgICAgPGNvbnRleHRzIGZpbGU9IkhUTUxXaXpDb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkiLz4KLTwvZXh0ZW5zaW9uPgotCi0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYTJmODguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlcl8xLjAuMC5qYXIKLXRlbXAKLURpdGFMaW5rLmNhdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJkNjQwNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDhiNWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjM3OjIxIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJhYzY1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjQ5NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jU3VuIEFwciAxNiAxNDowNToyOSBFRFQgMjAwNgotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvRG9jQnVpbGQueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL0RvY0J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExODY4NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvRG9jQnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tIAotCi0JVGhpcyBzY3JpcHQgYnVpbGQgdGhlIEhlbHAgcGx1Zy1pbiBieSB0cmFuc2Zvcm1pbmcgdGhlIERJVEEgc291cmNlIGZpbGVzIGludG8gSFRNTC4KLQkKLQlUbyB1c2UgdGhpcyBzY3JpcHQsIHlvdSBtdXN0IGluc3RhbGwgRElUQS1PVCBvbiB5b3VyIG1hY2hpbmUgaW4gdGhlIGRpcmVjdG9yeQotCWRlZmluZWQgYnkgdGhlIGRpdGEub3QuZGlyIHByb3BlcnR5LgotCQotCVJ1biB0aGUgZGVmYXVsdCB0YXJnZXQgYWZ0ZXIgeW91IGVkaXQgdGhlIERJVEEgc291cmNlIGZpbGVzIHRvIHJlZ2VuZXJhdGUgdGhlIEhUTUwuCi0JCi0JVG8gY3VzdG9taXplIHRoaXMgc2NyaXB0IGZvciBvdGhlciBIZWxwIHBsdWctaW5zLCBtb2RpZnkgdGhlIHZhbHVlIG9mIHRoZSBhcmdzLmlucHV0IHByb3BlcnR5Ci0JdG8gYmUgdGhlIERJVEEgbWFwIGZpbGUgZm9yIHRoZSBwbHVnLWluLgotCQotCU5PVEU6IFRoaXMgc2NyaXB0IGFzc3VtZXMgdGhhdCBsaW5rcyB0byBzaWJsaW5nIEhlbHAgcGx1Zy1pbnMgaGF2ZSBzY29wZT0icGVlciIsIG90aGVyd2lzZSB0aGUKLQlvdXRwdXQgZGlyZWN0b3J5IHN0cnVjdHVyZSB3aWxsIGJlIHNoaWZ0ZWQgaW5jb3JyZWN0bHkuCi0JCi0JTk9URTogVGhpcyBzY3JpcHQgYXNzdW1lcyB0aGF0IHlvdSBoYW5kIGNvZGUgeW91ciBwbHVnaW4ueG1sIGZpbGUgaW4gbXlwbHVnaW4ueG1sLiBUaGlzIGZpbGUKLQl3aWxsIGJlIGNvcGllZCBvdmVyIHRoZSBnZW5lcmF0ZWQgcGx1Z2luLnhtbCB3aGljaCBpcyBjdXJyZW50bHkgbm90IGJlaW5nIGdlbmVyYXRlZCBjb3JyZWN0bHkKLQlieSBESVRBLU9ULgotCQotCUNoYW5nZUxvZzoKLQkyMDA2LTA0LTA1IEFydGh1ciBSeW1hbiA8cnltYW5AY2EuaWJtLmNvbT4KLQktIENyZWF0ZWQuCi0JMjAwOC0wNS0wNSBLYXRlIFByaWNlIDxrYXRlcEBjYS5pYm0uY29tPgotCS0gbW9kaWZpZWQgdG8gYWRkIGdlbmVyYXRpb24gb2YgcHJlLWJ1aWx0IGhlbHAgaW5kZXguIAotCS0gTXVzdCBkZWxldGUgL2luZGV4IGZvbGRlciBiZWZvcmUgcnVubmluZyBidWlsZAotLS0+Ci08cHJvamVjdCBuYW1lPSJlY2xpcHNlaGVscCIgZGVmYXVsdD0iYWxsIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLm90LmRpciIgbG9jYXRpb249IkM6L0RJVEEtT1QxLjIuMiIgLz4KLQotCTxwYXRoIGlkPSJkb3N0LmNsYXNzLnBhdGgiPgotCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7ZGl0YS5vdC5kaXJ9JHtmaWxlLnNlcGFyYXRvcn1saWIke2ZpbGUuc2VwYXJhdG9yfWRvc3QuamFyIiAvPgotCTwvcGF0aD4KLQotCTx0YXNrZGVmIG5hbWU9ImludGVncmF0ZSIgY2xhc3NuYW1lPSJvcmcuZGl0YS5kb3N0LnBsYXRmb3JtLkludGVncmF0b3JUYXNrIj4KLQkJPGNsYXNzcGF0aCByZWZpZD0iZG9zdC5jbGFzcy5wYXRoIiAvPgotCTwvdGFza2RlZj4KLQk8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iaW50ZWdyYXRlLCBlY2xpcHNlaGVscCI+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJpbnRlZ3JhdGUiPgotCQk8aW50ZWdyYXRlIGRpdGFkaXI9IiR7ZGl0YS5vdC5kaXJ9IiAvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSByZXZpc2UgYmVsb3cgaGVyZSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImVjbGlwc2VoZWxwIj4KLQkJPGFudCBhbnRmaWxlPSIke2RpdGEub3QuZGlyfSR7ZmlsZS5zZXBhcmF0b3J9Y29uZHVjdG9yLnhtbCIgdGFyZ2V0PSJpbml0IiBkaXI9IiR7ZGl0YS5vdC5kaXJ9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNvcHljc3MiIHZhbHVlPSJubyIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNzc3BhdGgiIHZhbHVlPSIuLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnByb3ZpZGVyIiB2YWx1ZT0iRWNsaXBzZS5vcmciIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnZlcnNpb24iIHZhbHVlPSIzLjMuMCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmlucHV0IiBsb2NhdGlvbj0ic3NlX3RvYy5kaXRhbWFwIiAvPiAgICAJCQotCQkJPHByb3BlcnR5IG5hbWU9ImNsZWFuLnRlbXAiIHZhbHVlPSJ0cnVlIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImRpdGEuZXh0bmFtZSIgdmFsdWU9Ii5kaXRhIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImRpdGEudGVtcC5kaXIiIGxvY2F0aW9uPSJ0ZW1wIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dC5kaXIiIGxvY2F0aW9uPSIiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0idHJhbnN0eXBlIiB2YWx1ZT0iZWNsaXBzZWhlbHAiIC8+Ci0JCTwvYW50PgotCQk8Y29weSBmaWxlPSJteXBsdWdpbi54bWwiIHRvZmlsZT0icGx1Z2luLnhtbCIgb3ZlcndyaXRlPSJ5ZXMiIC8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJidWlsZC5pbmRleCIgZGVzY3JpcHRpb249IkJ1aWxkcyBzZWFyY2ggaW5kZXggZm9yIHRoZSBwbHVnLWluIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkgICAgIDxoZWxwLmJ1aWxkSGVscEluZGV4IG1hbmlmZXN0PSJwbHVnaW4ueG1sIiBkZXN0aW5hdGlvbj0iLiIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGExMWY5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xMDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVjMGMwZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaW1hZ2VzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNzZV90b2MueG1sLFwKLSAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXJpbmRleC54bWwsXAotICAgICAgICAgICAgICAgdG9waWNzLyouaHRtKixcCi0gICAgICAgICAgICAgICBpbmRleC8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSAqLm1hcGxpc3QsXAotICAgICAgICAgICAgICAgKi5kaXRhbWFwLFwKLSAgICAgICAgICAgICAgIHRvcGljcy8qLmRpdGEKLWJpbi5leGNsdWRlcyA9IERvY0J1aWxkLnhtbCxcCi0gICAgICAgICAgICAgICBteVBsdWdpbioueG1sCi0gICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmNvbnRhc3MuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9uY29udGFzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MjAxNGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9uY29udGFzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25qc2NkYXN0LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmpzY2Rhc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWExNDFjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmpzY2Rhc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ubGludXguZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ubGludXguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzEzNWNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmxpbnV4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbm1hY3NjcnAuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ubWFjc2NycC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTYzNzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ubWFjc2NycC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25xdWVzdC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25xdWVzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYWExZTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ucXVlc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ud2luLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbndpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NWY5Y2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ud2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbmRleC9fcC5jZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW5kZXgvX3AuY2ZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTQxNjQ5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbmRleC9fcC5jZnMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW5kZXgvZGVsZXRhYmxlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkzZjQ3MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW5kZXgvZGVsZXRhYmxlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfY29udHJpYnV0aW9ucyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYTc2ZGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfY29udHJpYnV0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI1dlZCBNYXkgMTQgMTg6NTY6MDMgRURUIDIwMDgNCi1vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyPW9yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXJcbjEuMS4wLnF1YWxpZmllcg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJjN2E2NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0Lg0KLSNXZWQgTWF5IDE0IDE4OjU2OjAzIEVEVCAyMDA4DQotbHVjZW5lPTEuOS4xLnYyMDA4MDMwNjE4MTENCi1hbmFseXplcj1vcmcuZWNsaXBzZS5oZWxwLmJhc2VcIzMuMy4xMDAudjIwMDgwNDI1P2xvY2FsZVw9ZW4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg1Y2Q0OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI1dlZCBNYXkgMTQgMTg6NTY6MDMgRURUIDIwMDgNCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdGNvbnRlbnR0eXBlLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI5Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIyLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA1Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE2Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIzLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI0Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA3Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDEwLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jdmFsaWRhdGUuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDEuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjYuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NlbmNvZGluZy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5odG1sPTANCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNjNjNGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L3NlZ21lbnRzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL215cGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9teXBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNTUwNTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL215cGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy42Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PiAKLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Zy1pbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwIHBhZ2VzICAgICAgLS0+Ci08IS0tIGZvciB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgKHNvdXJjZSBlZGl0b3JzKS4gICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotPHBsdWdpbj4KLQotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgIDx0b2MgZmlsZT0ic3NlX3RvYy54bWwiLz4KLSAgICAgICA8aW5kZXggcGF0aD0iaW5kZXgvIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyaW5kZXgueG1sIi8+Ci08L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci5tYXBsaXN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIubWFwbGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBmNGRhNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci5tYXBsaXN0CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08bWFwbGlzdCB2ZXJzaW9uPSIzLjYuMiI+DQotICA8bmF2Pg0KLSAgICA8bWFwIGZpbGU9InNzZV90b2MuZGl0YW1hcCIvPg0KLSAgPC9uYXY+DQotICA8bGluaz4NCi0gIDwvbGluaz4NCi08L21hcGxpc3Q+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXJpbmRleC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXJpbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGE4ODg2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDA3IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPCEtLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBMaWNlbnNlZCBNYXRlcmlhbHMgUHJvcGVydHkgb2YgSUJNIC0tPgotPCEtLSBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0tPgotPCEtLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgcmVzdHJpY3RlZCBieSAtLT4KLTwhLS0gR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImlibWRpdGEuY3NzIiAvPgotPHRpdGxlPkluZGV4PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgxPkluZGV4PC9oMT4KLTxhIG5hbWU9IklEWDBfNDEiIGhyZWY9IiNJRFgxXzQxIj5BPC9hPgotPGEgbmFtZT0iSURYMF80MyIgaHJlZj0iI0lEWDFfNDMiPkM8L2E+Ci08YSBuYW1lPSJJRFgwXzQ0IiBocmVmPSIjSURYMV80NCI+RDwvYT4KLTxhIG5hbWU9IklEWDBfNDYiIGhyZWY9IiNJRFgxXzQ2Ij5GPC9hPgotPGEgbmFtZT0iSURYMF80OCIgaHJlZj0iI0lEWDFfNDgiPkg8L2E+Ci08YSBuYW1lPSJJRFgwXzRBIiBocmVmPSIjSURYMV80QSI+SjwvYT4KLTxhIG5hbWU9IklEWDBfNEQiIGhyZWY9IiNJRFgxXzREIj5NPC9hPgotPGEgbmFtZT0iSURYMF81MyIgaHJlZj0iI0lEWDFfNTMiPlM8L2E+Ci08YSBuYW1lPSJJRFgwXzU0IiBocmVmPSIjSURYMV81NCI+VDwvYT4KLTxhIG5hbWU9IklEWDBfNTYiIGhyZWY9IiNJRFgxXzU2Ij5WPC9hPgotPGEgbmFtZT0iSURYMF81OCIgaHJlZj0iI0lEWDFfNTgiPlg8L2E+Ci08aHI+PC9ocj4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV80MSIgaHJlZj0iI0lEWDBfNDEiPkE8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+YW5ub3RhdGlvbiBwcmVmZXJlbmNlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDAxLmh0bWwjdHNyY2VkdDAwMSI+bWFya3VwIGxhbmd1YWdlIHNldHRpbmdzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV80MyIgaHJlZj0iI0lEWDBfNDMiPkM8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+Y2hhcmFjdGVyIGVuY29kaW5nCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL2NlbmNvZGluZy5odG1sI2NlbmNvZGluZyI+bG9jYXRpb24gaW4gZmlsZXM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+Y29udGVudCBhc3Npc3RhbmNlCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMjMuaHRtbCN0c3JjZWR0MDIzIj5lbmFibGluZyBmb3IgSlNQIGZpbGVzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNi5odG1sI2NzcmNlZHQwMDYiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwNS5odG1sI3RzcmNlZHQwMDUiPnN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmNvbnRlbnQgdHlwZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGNvbnRlbnR0eXBlLmh0bWwjdGNvbnRlbnR0eXBlIj5tYXBwaW5nIGZpbGUgZXh0ZW5zaW9uczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNDQiIGhyZWY9IiNJRFgwXzQ0Ij5EPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPmRyYXdlcnMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNi5odG1sI3RzcmNlZHQwMTYiPnNuaXBwZXRzIHZpZXc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzQ2IiBocmVmPSIjSURYMF80NiI+RjwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5maWxlIGV4dGVuc2lvbnMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGNvbnRlbnR0eXBlLmh0bWwjdGNvbnRlbnR0eXBlIj5tYXBwaW5nIGNvbnRlbnQgdHlwZXM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+ZmlsZSB0eXBlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90Y29udGVudHR5cGUuaHRtbCN0Y29udGVudHR5cGUiPmVkaXRvcnM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzQ4IiBocmVmPSIjSURYMF80OCI+SDwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5IVE1MCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+dGVtcGxhdGVzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMjQuaHRtbCN0c3JjZWR0MDI0Ij5hZGRpbmc8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDI0Lmh0bWwjdHNyY2VkdDAyNCI+cmVtb3Zpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNEEiIGhyZWY9IiNJRFgwXzRBIj5KPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPkpTUCBmaWxlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy9jZW5jb2RpbmcuaHRtbCNjZW5jb2RpbmciPmNoYXJhY3RlciBlbmNvZGluZzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMjMuaHRtbCN0c3JjZWR0MDIzIj5lbmFibGluZyBjb250ZW50IGFzc2lzdGFuY2U8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+SlNQIHBhZ2VzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMjguaHRtbCN0c3JjZWR0MDI4Ij50ZW1wbGF0ZXM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzREIiBocmVmPSIjSURYMF80RCI+TTwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5tYXJrdXAgbGFuZ3VhZ2VzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMDAuaHRtbCN0c3JjZWR0MDAwIj5lZGl0aW5nIHRleHQ8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDAxLmh0bWwjdHNyY2VkdDAwMSI+c2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNy5odG1sI3RzcmNlZHQwMjciPnRlbXBsYXRlczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNTMiIGhyZWY9IiNJRFgwXzUzIj5TPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPnNuaXBwZXQgZHJhd2VycwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDE1Lmh0bWwjdHNyY2VkdDAxNSI+YWRkaW5nIGl0ZW1zPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPnNuaXBwZXQgaXRlbXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNS5odG1sI3RzcmNlZHQwMTUiPmFkZGluZyB0byBkcmF3ZXJzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPnNuaXBwZXRzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMTQuaHRtbCN0c3JjZWR0MDE0Ij5kcmF3ZXIgY3VzdG9taXphdGlvbjwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMjIuaHRtbCN0c3JjZWR0MDIyIj5lZGl0aW5nIGl0ZW1zPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNi5odG1sI3RzcmNlZHQwMTYiPm1vZGlmeWluZyBkcmF3ZXJzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNi5odG1sI3RzcmNlZHQwMjYiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPlNuaXBwZXRzIHZpZXcKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwMS5odG1sI2NzcmNlZHQwMDEiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPnNwZWxsIGNoZWNrCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMTAuaHRtbCN0c3JjZWR0MDEwIj5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPmNvbnRlbnQgYXNzaXN0YW5jZSA8YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwNS5odG1sI3RzcmNlZHQwMDUiPigxKTwvYT4sIDxhIGhyZWY9InRvcGljcy9jc3JjZWR0MDA2Lmh0bWwjY3NyY2VkdDAwNiI+KDIpPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNC5odG1sI2NzcmNlZHQwMDQiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNS5odG1sI3RzcmNlZHQwMjUiPnByZWZlcmVuY2Ugc2V0dGluZzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMTAuaHRtbCN0c3JjZWR0MDEwIj5zcGVsbCBjaGVjazwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMDcuaHRtbCN0c3JjZWR0MDA3Ij50ZXh0IHNlYXJjaDwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNTQiIGhyZWY9IiNJRFgwXzU0Ij5UPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPnRlbXBsYXRlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDI0Lmh0bWwjdHNyY2VkdDAyNCI+SFRNTDwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMjguaHRtbCN0c3JjZWR0MDI4Ij5KU1AgcGFnZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDI3Lmh0bWwjdHNyY2VkdDAyNyI+bWFya3VwIGxhbmd1YWdlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL2NzcmNlZHQwMDQuaHRtbCNjc3JjZWR0MDA0Ij5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMjkuaHRtbCN0c3JjZWR0MDI3Ij5YTUw8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+dGV4dAotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDAwLmh0bWwjdHNyY2VkdDAwMCI+ZWRpdGluZyBpbiBtYXJrdXAgbGFuZ3VhZ2VzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV81NiIgaHJlZj0iI0lEWDBfNTYiPlY8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+dmFsaWRhdGlvbgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy9jdmFsaWRhdGUuaHRtbCNjc3JjZWR0MDAxIj5zb3VyY2UgdnMgYmF0Y2g8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzU4IiBocmVmPSIjSURYMF81OCI+WDwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5YSFRNTAotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy9jZW5jb2RpbmcuaHRtbCNjZW5jb2RpbmciPmNoYXJhY3RlciBlbmNvZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5YTUwKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY2VuY29kaW5nLmh0bWwjY2VuY29kaW5nIj5jaGFyYWN0ZXIgZW5jb2Rpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+eG1sIHRlbXBsYXRlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDI5Lmh0bWwjdHNyY2VkdDAyNyI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlcmluZGV4LnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzIzYWM1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08aW5kZXg+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNC5odG1sI2NzcmNlZHQwMDQiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InByZWZlcmVuY2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNS5odG1sI3RzcmNlZHQwMjUiIHRpdGxlPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvbnRlbnQgYXNzaXN0YW5jZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0idGV4dCBlZGl0b3JzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDA1Lmh0bWwjdHNyY2VkdDAwNSIgdGl0bGU9IkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlIGluIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jc3JjZWR0MDA2Lmh0bWwjY3NyY2VkdDAwNiIgdGl0bGU9IkNvbnRlbnQgYXNzaXN0Ii8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InRleHQgc2VhcmNoIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwNy5odG1sI3RzcmNlZHQwMDciIHRpdGxlPSJTZWFyY2hpbmcgb3IgZmluZGluZyB0ZXh0IHdpdGhpbiBhIGZpbGUiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzcGVsbCBjaGVjayI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMTAuaHRtbCN0c3JjZWR0MDEwIiB0aXRsZT0iQ2hlY2tpbmcgc3BlbGxpbmciLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idGVtcGxhdGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0ic3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jc3JjZWR0MDA0Lmh0bWwjY3NyY2VkdDAwNCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFya3VwIGxhbmd1YWdlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjcuaHRtbCN0c3JjZWR0MDI3IiB0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UgdGVtcGxhdGVzIC0gb3ZlcnZpZXciLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJIVE1MIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNC5odG1sI3RzcmNlZHQwMjQiIHRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iSlNQIHBhZ2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyOC5odG1sI3RzcmNlZHQwMjgiIHRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJYTUwiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI5Lmh0bWwjdHNyY2VkdDAyNyIgdGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYXJrdXAgbGFuZ3VhZ2VzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyB0ZXh0Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMC5odG1sI3RzcmNlZHQwMDAiIHRpdGxlPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMS5odG1sI3RzcmNlZHQwMDEiIHRpdGxlPSJTZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJ0ZW1wbGF0ZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI3Lmh0bWwjdHNyY2VkdDAyNyIgdGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlIHRlbXBsYXRlcyAtIG92ZXJ2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InRleHQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIGluIG1hcmt1cCBsYW5ndWFnZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDAwLmh0bWwjdHNyY2VkdDAwMCIgdGl0bGU9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idmFsaWRhdGlvbiI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNvdXJjZSB2ZXJzdXMgYmF0Y2giPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jdmFsaWRhdGUuaHRtbCNjc3JjZWR0MDAxIiB0aXRsZT0iU291cmNlIGFuZCBiYXRjaCB2YWxpZGF0aW9uIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImFubm90YXRpb25zIj4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFya3VwIGxhbmd1YWdlIHNldHRpbmdzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMS5odG1sI3RzcmNlZHQwMDEiIHRpdGxlPSJTZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY29udGVudCBhc3Npc3RhbmNlIj4KLSAgICA8ZW50cnkga2V5d29yZD0ic3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDA1Lmh0bWwjdHNyY2VkdDAwNSIgdGl0bGU9IkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlIGluIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jc3JjZWR0MDA2Lmh0bWwjY3NyY2VkdDAwNiIgdGl0bGU9IkNvbnRlbnQgYXNzaXN0Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZW5hYmxpbmcgZm9yIEpTUCBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjMuaHRtbCN0c3JjZWR0MDIzIiB0aXRsZT0iRW5hYmxpbmcgY29udGVudCBhc3Npc3QgZm9yIEpTUCBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJKU1AgZmlsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbmFibGluZyBjb250ZW50IGFzc2lzdGFuY2UiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDIzLmh0bWwjdHNyY2VkdDAyMyIgdGl0bGU9IkVuYWJsaW5nIGNvbnRlbnQgYXNzaXN0IGZvciBKU1AgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjaGFyYWN0ZXIgZW5jb2RpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jZW5jb2RpbmcuaHRtbCNjZW5jb2RpbmciIHRpdGxlPSJGaWxlIEVuY29kaW5nIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idGVtcGxhdGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyOC5odG1sI3RzcmNlZHQwMjgiIHRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY29udGVudCB0eXBlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hcHBpbmcgZmlsZSBleHRlbnNpb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNvbnRlbnR0eXBlLmh0bWwjdGNvbnRlbnR0eXBlIiB0aXRsZT0iQXNzb2NpYXRpbmcgZWRpdG9ycyB3aXRoIGFkZGl0aW9uYWwgZmlsZXMgdHlwZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZmlsZSBleHRlbnNpb25zIj4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFwcGluZyBjb250ZW50IHR5cGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNvbnRlbnR0eXBlLmh0bWwjdGNvbnRlbnR0eXBlIiB0aXRsZT0iQXNzb2NpYXRpbmcgZWRpdG9ycyB3aXRoIGFkZGl0aW9uYWwgZmlsZXMgdHlwZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZmlsZSB0eXBlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRvcnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90Y29udGVudHR5cGUuaHRtbCN0Y29udGVudHR5cGUiIHRpdGxlPSJBc3NvY2lhdGluZyBlZGl0b3JzIHdpdGggYWRkaXRpb25hbCBmaWxlcyB0eXBlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJjaGFyYWN0ZXIgZW5jb2RpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJsb2NhdGlvbiBpbiBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NlbmNvZGluZy5odG1sI2NlbmNvZGluZyIgdGl0bGU9IkZpbGUgRW5jb2RpbmciLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iWEhUTUwiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjaGFyYWN0ZXIgZW5jb2RpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jZW5jb2RpbmcuaHRtbCNjZW5jb2RpbmciIHRpdGxlPSJGaWxlIEVuY29kaW5nIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IlhNTCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNoYXJhY3RlciBlbmNvZGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NlbmNvZGluZy5odG1sI2NlbmNvZGluZyIgdGl0bGU9IkZpbGUgRW5jb2RpbmciLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmcgdGVtcGxhdGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyOS5odG1sI3RzcmNlZHQwMjciIHRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic3BlbGwgY2hlY2siPgotICAgIDxlbnRyeSBrZXl3b3JkPSJzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMTAuaHRtbCN0c3JjZWR0MDEwIiB0aXRsZT0iQ2hlY2tpbmcgc3BlbGxpbmciLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSFRNTCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InRlbXBsYXRlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0icmVtb3ZpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjQuaHRtbCN0c3JjZWR0MDI0IiB0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjQuaHRtbCN0c3JjZWR0MDI0IiB0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic25pcHBldHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjYuaHRtbCN0c3JjZWR0MDI2IiB0aXRsZT0iRWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXciLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJkcmF3ZXIgY3VzdG9taXphdGlvbiI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMTQuaHRtbCN0c3JjZWR0MDE0IiB0aXRsZT0iQWRkaW5nIHNuaXBwZXRzIGRyYXdlcnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJkcmF3ZXJzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNS5odG1sI3RzcmNlZHQwMTUiIHRpdGxlPSJBZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VycyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmcgaXRlbXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDIyLmh0bWwjdHNyY2VkdDAyMiIgdGl0bGU9IkVkaXRpbmcgc25pcHBldCBpdGVtcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1vZGlmeWluZyBkcmF3ZXJzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNi5odG1sI3RzcmNlZHQwMTYiIHRpdGxlPSJEZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IlNuaXBwZXRzIHZpZXciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NzcmNlZHQwMDEuaHRtbCNjc3JjZWR0MDAxIiB0aXRsZT0iU25pcHBldHMgdmlldyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJkcmF3ZXJzIj4KLSAgICA8ZW50cnkga2V5d29yZD0ic25pcHBldHMgdmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMTYuaHRtbCN0c3JjZWR0MDE2IiB0aXRsZT0iRGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2VycyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci08L2luZGV4PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI2ZjNiNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgcHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotQnVuZGxlLU5hbWUuMCA9IFN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgYW5kIHNuaXBwZXRzIGRvY3VtZW50YXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjU1MDU2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjYiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+IAotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnLWluIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgcGFnZXMgICAgICAtLT4KLTwhLS0gZm9yIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyAoc291cmNlIGVkaXRvcnMpLiAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08cGx1Z2luPgotCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgICAgPHRvYyBmaWxlPSJzc2VfdG9jLnhtbCIvPgotICAgICAgIDxpbmRleCBwYXRoPSJpbmRleC8iLz4KLSAgIDwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotICAgICAgPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXJpbmRleC54bWwiLz4KLTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9zc2VfdG9jLmRpdGFtYXAgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvc3NlX3RvYy5kaXRhbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODBiNTliLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9zc2VfdG9jLmRpdGFtYXAKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIG1hcCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBNYXAvL0VOIg0KLSAibWFwLmR0ZCI+DQotPG1hcCBpZD0id3N0c3NldG9jIiBsaW5raW5nPSJub25lIiB0aXRsZT0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jc3JjZWR0MDA0LmRpdGEiIG5hdnRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDAwLmRpdGEiIGxvY2t0aXRsZT0ieWVzIiBuYXZ0aXRsZT0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgIg0KLXR5cGU9InRhc2siPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3ZhbGlkYXRlLmRpdGEiIG5hdnRpdGxlPSJTb3VyY2UgYW5kIGJhdGNoIHZhbGlkYXRpb24iDQotdHlwZT0iY29uY2VwdCI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMjUuZGl0YSIgbmF2dGl0bGU9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIg0KLXR5cGU9InRhc2siPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMS5kaXRhIiBuYXZ0aXRsZT0iU2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMDUuZGl0YSIgbmF2dGl0bGU9IkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlIGluIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIg0KLXR5cGU9InRhc2siPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNi5kaXRhIiBuYXZ0aXRsZT0iQ29udGVudCBhc3Npc3QiIHR5cGU9ImNvbmNlcHQiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDIzLmRpdGEiIG5hdnRpdGxlPSJNYWtpbmcgY29udGVudCBhc3Npc3Qgd29yayBmb3IgSlNQIGZpbGVzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3Rjb250ZW50dHlwZS5kaXRhIiBuYXZ0aXRsZT0iQXNzb2NpYXRpbmcgZWRpdG9ycyB3aXRoIGZpbGUgdHlwZXMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NlbmNvZGluZy5kaXRhIiBuYXZ0aXRsZT0iRmlsZSBFbmNvZGluZyIgdHlwZT0iY29uY2VwdCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMDcuZGl0YSIgbmF2dGl0bGU9IlNlYXJjaGluZyBvciBmaW5kaW5nIHRleHQgd2l0aGluIGEgZmlsZSINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxMC5kaXRhIiBuYXZ0aXRsZT0iQ2hlY2tpbmcgc3BlbGxpbmciIHR5cGU9InRhc2siPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDI3LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZSB0ZW1wbGF0ZXMgLSBvdmVydmlldyINCi10eXBlPSJ0YXNrIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMjQuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMjguZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlcyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyOS5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMjYuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3Ig0KLXR5cGU9InRhc2siPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwMS5kaXRhIiBuYXZ0aXRsZT0iU25pcHBldHMgdmlldyIgdHlwZT0iY29uY2VwdCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMTQuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDE1LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VycyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyMi5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBzbmlwcGV0IGl0ZW1zIiB0eXBlPSJ0YXNrIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNi5kaXRhIiBuYXZ0aXRsZT0iRGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2VycyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWx0b29sc2tleS5kaXRhIg0KLW5hdnRpdGxlPSJTb3VyY2UgZWRpdG9yIGtleWJvYXJkIHNob3J0Y3V0cyIgc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9zc2VfdG9jLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9zc2VfdG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE1MzYxOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvc3NlX3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiB0b3BpYz0idG9waWNzL2NzcmNlZHQwMDQuaHRtbCI+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iU291cmNlIGFuZCBiYXRjaCB2YWxpZGF0aW9uIiBocmVmPSJ0b3BpY3MvY3ZhbGlkYXRlLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9InRvcGljcy90c3JjZWR0MDI1Lmh0bWwiPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9InRvcGljcy90c3JjZWR0MDAxLmh0bWwiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlIGluIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwNS5odG1sIj4KLTx0b3BpYyBsYWJlbD0iQ29udGVudCBhc3Npc3QiIGhyZWY9InRvcGljcy9jc3JjZWR0MDA2Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iTWFraW5nIGNvbnRlbnQgYXNzaXN0IHdvcmsgZm9yIEpTUCBmaWxlcyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMjMuaHRtbCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iQXNzb2NpYXRpbmcgZWRpdG9ycyB3aXRoIGZpbGUgdHlwZXMiIGhyZWY9InRvcGljcy90Y29udGVudHR5cGUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJGaWxlIEVuY29kaW5nIiBocmVmPSJ0b3BpY3MvY2VuY29kaW5nLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iU2VhcmNoaW5nIG9yIGZpbmRpbmcgdGV4dCB3aXRoaW4gYSBmaWxlIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwNy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNoZWNraW5nIHNwZWxsaW5nIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxMC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlIHRlbXBsYXRlcyAtIG92ZXJ2aWV3IiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNy5odG1sIj4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlcyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMjQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXMiIGhyZWY9InRvcGljcy90c3JjZWR0MDI4Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyOS5odG1sIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMjYuaHRtbCI+Ci08dG9waWMgbGFiZWw9IlNuaXBwZXRzIHZpZXciIGhyZWY9InRvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIHNuaXBwZXRzIGRyYXdlcnMiIGhyZWY9InRvcGljcy90c3JjZWR0MDE0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnMiIGhyZWY9InRvcGljcy90c3JjZWR0MDE1Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBzbmlwcGV0IGl0ZW1zIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyMi5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnMiIGhyZWY9InRvcGljcy90c3JjZWR0MDE2Lmh0bWwiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IlNvdXJjZSBlZGl0b3Iga2V5Ym9hcmQgc2hvcnRjdXRzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sdG9vbHNrZXkuaHRtbCIvPgotPC90b3BpYz4KLTwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY2VuY29kaW5nLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NlbmNvZGluZy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2E3MzIyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY2VuY29kaW5nLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICIuLlxkdGRcY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjZW5jb2RpbmciIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkZpbGUgRW5jb2Rpbmc8L3RpdGxlPg0KLTxzaG9ydGRlc2M+PC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+Y2hhcmFjdGVyIGVuY29kaW5nPGluZGV4dGVybT5sb2NhdGlvbiBpbiBmaWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+SlNQIGZpbGVzPGluZGV4dGVybT5jaGFyYWN0ZXIgZW5jb2Rpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhIVE1MPGluZGV4dGVybT5jaGFyYWN0ZXIgZW5jb2Rpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTDxpbmRleHRlcm0+Y2hhcmFjdGVyIGVuY29kaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPiBUaGUgY2hhcmFjdGVyIGVuY29kaW5nIGluIFhNTCwgKFgpSFRNTCBmaWxlcywgYW5kIEpTUCBmaWxlcyBjYW4gYmUgc3BlY2lmaWVkDQotYW5kIGludm9rZWQgaW4gbWFueSBkaWZmZXJlbnQgd2F5czsgaG93ZXZlciwgd2UgcmVjb21tZW5kIHRoYXQgeW91IHNwZWNpZnkNCi10aGUgZW5jb2RpbmcgaW4gZWFjaCBvbmUgb2YgeW91ciBzb3VyY2UgZmlsZXMsIGZvciB0aGF0IGlzIHdoZXJlIG1hbnkgWE1MLA0KLUhUTUwsIEpTUCBlZGl0b3JzIGV4cGVjdCB0byBmaW5kIHRoZSBlbmNvZGluZy48L3A+DQotPHA+Rm9yIGV4YW1wbGUsIGZvciBKU1AgZmlsZXMsIHlvdSBtaWdodCB1c2UgdGhlIHBhZ2VFbmNvZGluZyBhdHRyaWJ1dGUgYW5kL29yDQotdGhlIGNvbnRlbnRUeXBlIGF0dHJpYnV0ZSBpbiB0aGUgcGFnZSBkaXJlY3RpdmUsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcNCi1leGFtcGxlOjxjb2RlYmxvY2s+Jmx0OyVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSINCi0gICAgcGFnZUVuY29kaW5nPSJJU08tODg1OS0xIiUmZ3Q7DQotPC9jb2RlYmxvY2s+PC9wPg0KLTxwPkZvciBYTUwgZmlsZXMsIHlvdSBtaWdodCB1c2UgdGhlIGVuY29kaW5nIHBzZXVkby1hdHRyaWJ1dGUgaW4gdGhlIHhtbCBkZWNsYXJhdGlvbg0KLWF0IHRoZSBzdGFydCBvZiBhIGRvY3VtZW50IG9yIHRoZSB0ZXh0IGRlY2xhcmF0aW9uIGF0IHRoZSBzdGFydCBvZiBhbiBlbnRpdHksDQotYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOiA8Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiID8+PC9jb2RlYmxvY2s+PC9wPg0KLTxwPkZvciAoWClIVE1MIGZpbGVzLCB5b3UgbWlnaHQgdXNlIHRoZSAmbHQ7bWV0YSZndDsgdGFnIGluc2lkZSB0aGUgJmx0O2hlYWQmZ3Q7DQotdGFncywgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOjxjb2RlYmxvY2s+Jmx0O21ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz48L2NvZGVibG9jaz48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NlbmNvZGluZy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jZW5jb2RpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI2M2Y0ZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NlbmNvZGluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRmlsZSBFbmNvZGluZyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSIiIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIiAvPgotPG1ldGEgY29udGVudD0iY2hhcmFjdGVyIGVuY29kaW5nLCBsb2NhdGlvbiBpbiBmaWxlcywgSlNQIGZpbGVzLCBYSFRNTCwgWE1MIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iY2hhcmFjdGVyIGVuY29kaW5nLCBsb2NhdGlvbiBpbiBmaWxlcywgSlNQIGZpbGVzLCBYSFRNTCwgWE1MIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjZW5jb2RpbmciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5GaWxlIEVuY29kaW5nPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjZW5jb2RpbmciPjxhIG5hbWU9ImNlbmNvZGluZyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RmlsZSBFbmNvZGluZzwvaDE+Ci0KLQotCi08ZGl2PjxwIC8+Ci0KLTxwPiBUaGUgY2hhcmFjdGVyIGVuY29kaW5nIGluIFhNTCwgKFgpSFRNTCBmaWxlcywgYW5kIEpTUCBmaWxlcyBjYW4gYmUgc3BlY2lmaWVkCi1hbmQgaW52b2tlZCBpbiBtYW55IGRpZmZlcmVudCB3YXlzOyBob3dldmVyLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3Ugc3BlY2lmeQotdGhlIGVuY29kaW5nIGluIGVhY2ggb25lIG9mIHlvdXIgc291cmNlIGZpbGVzLCBmb3IgdGhhdCBpcyB3aGVyZSBtYW55IFhNTCwKLUhUTUwsIEpTUCBlZGl0b3JzIGV4cGVjdCB0byBmaW5kIHRoZSBlbmNvZGluZy48L3A+Ci0KLTxkaXYgY2xhc3M9InAiPkZvciBleGFtcGxlLCBmb3IgSlNQIGZpbGVzLCB5b3UgbWlnaHQgdXNlIHRoZSBwYWdlRW5jb2RpbmcgYXR0cmlidXRlIGFuZC9vcgotdGhlIGNvbnRlbnRUeXBlIGF0dHJpYnV0ZSBpbiB0aGUgcGFnZSBkaXJlY3RpdmUsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcKLWV4YW1wbGU6PHByZT4mbHQ7JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIgotICAgIHBhZ2VFbmNvZGluZz0iSVNPLTg4NTktMSIlJmd0OwotPC9wcmU+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0icCI+Rm9yIFhNTCBmaWxlcywgeW91IG1pZ2h0IHVzZSB0aGUgZW5jb2RpbmcgcHNldWRvLWF0dHJpYnV0ZSBpbiB0aGUgeG1sIGRlY2xhcmF0aW9uCi1hdCB0aGUgc3RhcnQgb2YgYSBkb2N1bWVudCBvciB0aGUgdGV4dCBkZWNsYXJhdGlvbiBhdCB0aGUgc3RhcnQgb2YgYW4gZW50aXR5LAotYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOiA8cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiID8mZ3Q7PC9wcmU+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0icCI+Rm9yIChYKUhUTUwgZmlsZXMsIHlvdSBtaWdodCB1c2UgdGhlICZsdDttZXRhJmd0OyB0YWcgaW5zaWRlIHRoZSAmbHQ7aGVhZCZndDsKLXRhZ3MsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8cHJlPiZsdDttZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8mZ3Q7PC9wcmU+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmODVjOTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICIuLlxkdGRcY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjc3JjZWR0MDAxIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TbmlwcGV0cyB2aWV3PC90aXRsZT4NCi08c2hvcnRkZXNjPlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nDQotb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGgNCi1maWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlNuaXBwZXRzIHZpZXc8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotDQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPiBUaGUgU25pcHBldHMgdmlldyBjYW4gYmUgZXh0ZW5kZWQgYmFzZWQgb24gYWRkaXRpb25hbCBvYmplY3RzIHRoYXQgeW91DQotZGVmaW5lIGFuZCBpbmNsdWRlLiBUbyB2aWV3IG9yIGNvbGxhcHNlIHRoZSBvYmplY3RzIGluIGEgc3BlY2lmaWMgZHJhd2VyLA0KLWNsaWNrIHRoZSBkcmF3ZXIgbmFtZS48L3A+DQotPHA+VGhlIFNuaXBwZXRzIHZpZXcgaGFzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6IDx1bD4NCi08bGk+RHJhZy1hbmQtZHJvcCB0byB2YXJpb3VzIHNvdXJjZSBlZGl0aW5nIHBhZ2VzOiBZb3UgY2FuIGRyYWcgaXRlbXMgZnJvbQ0KLXRoZSB2aWV3IGludG8gdGhlIGFjdGl2ZSBlZGl0b3IgYW5kIHRoZSB0ZXh0IHdpbGwgYmUgZHJvcHBlZCBpbnRvIHRoZSBkb2N1bWVudA0KLWF0IHRoZSBjdXJzb3IgbG9jYXRpb24gPC9saT4NCi08bGk+RG91YmxlLWNsaWNrIHN1cHBvcnQ6IFlvdSBjYW4gZG91YmxlLWNsaWNrIG9uIGFuIGl0ZW0gYW5kIGhhdmUgaXQgaW5zZXJ0ZWQNCi1hdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gaW4gdGhlIGFjdGl2ZSBlZGl0b3IgPC9saT4NCi08bGk+VXNlci1kZWZpbmVkIGRyYXdlcnMgYW5kIGl0ZW1zOiBZb3UgY2FuIGRlZmluZSwgZWRpdCwgYW5kIHJlbW92ZSBpdGVtcw0KLWZyb20gdmlldyBkcmF3ZXJzIGFzIGRlc2lyZWQuPC9saT4NCi08bGk+UGx1Zy1pbi1kZWZpbmVkIGRyYXdlcnMgYW5kIGl0ZW1zOiBQbHVnLWluIGRldmVsb3BlcnMgY2FuIGNvbnRyaWJ1dGUgYQ0KLWRlZmF1bHQgbGlzdCBvZiBpdGVtcyB0byB0aGVpciBvd24gZHJhd2Vycy48L2xpPg0KLTxsaT5WYXJpYWJsZXMgaW4gaW5zZXJ0aW9uczogQnkgZGVmYXVsdCwgaXRlbXMgd2lsbCBiZSBlZGl0ZWQgdXNpbmcgYSBkaWFsb2cNCi1hbmQsIHdoZW4gaW5zZXJ0ZWQsIHlvdSB3aWxsIGJlIHByb21wdGVkIGZvciB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIHZhcmlhYmxlcy48L2xpPg0KLTxsaT5DdXN0b21pemF0aW9uOiBZb3UgY2FuIHNlbGVjdCB3aGljaCBkcmF3ZXJzIGFuZCBpdGVtcyBhcmUgc2hvd24gaW4gdGhlDQotU25pcHBldHMgdmlldy48L2xpPg0KLTxsaT5DdXN0b20gaW5zZXJ0aW9uOiBQbHVnLWluIGRldmVsb3BlcnMgY2FuIGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3Igb2YgaXRlbXMNCi1zbyB0aGF0IHdoZW4gdGhleSBhcmUgZHJvcHBlZCBkdXJpbmcgYSBkcmFnLWFuZC1kcm9wIGFjdGlvbiwgYm90aCB0aGUgdGV4dA0KLXRoYXQgaXMgaW5zZXJ0ZWQgYW5kIHRoZSBpbnNlcnRpb24gbG9jYXRpb24gYXJlIHN0cmljdGx5IGRlZmluZWQuPC9saT4NCi08L3VsPjwvcD4NCi08L2NvbmJvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI2LmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTQuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNS5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDIyLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE2LmRpdGEiPjxsaW5rdGV4dD5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvcg0KLWRyYXdlcnM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDAwLmRpdGEiPjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ1M2Y5ZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNuaXBwZXRzIHZpZXciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIiAvPgotPG1ldGEgY29udGVudD0iU25pcHBldHMgdmlldywgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJTbmlwcGV0cyB2aWV3LCBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyMi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE2Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjc3JjZWR0MDAxIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U25pcHBldHMgdmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3NyY2VkdDAwMSI+PGEgbmFtZT0iY3NyY2VkdDAwMSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U25pcHBldHMgdmlldzwvaDE+Ci0KLQotCi08ZGl2PjxwPlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nCi1vYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdOKEoiwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoCi1maWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLjwvcD4KLQotPHA+IFRoZSBTbmlwcGV0cyB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UKLWRlZmluZSBhbmQgaW5jbHVkZS4gVG8gdmlldyBvciBjb2xsYXBzZSB0aGUgb2JqZWN0cyBpbiBhIHNwZWNpZmljIGRyYXdlciwKLWNsaWNrIHRoZSBkcmF3ZXIgbmFtZS48L3A+Ci0KLTxkaXYgY2xhc3M9InAiPlRoZSBTbmlwcGV0cyB2aWV3IGhhcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOiA8dWw+Ci08bGk+RHJhZy1hbmQtZHJvcCB0byB2YXJpb3VzIHNvdXJjZSBlZGl0aW5nIHBhZ2VzOiBZb3UgY2FuIGRyYWcgaXRlbXMgZnJvbQotdGhlIHZpZXcgaW50byB0aGUgYWN0aXZlIGVkaXRvciBhbmQgdGhlIHRleHQgd2lsbCBiZSBkcm9wcGVkIGludG8gdGhlIGRvY3VtZW50Ci1hdCB0aGUgY3Vyc29yIGxvY2F0aW9uIDwvbGk+Ci0KLTxsaT5Eb3VibGUtY2xpY2sgc3VwcG9ydDogWW91IGNhbiBkb3VibGUtY2xpY2sgb24gYW4gaXRlbSBhbmQgaGF2ZSBpdCBpbnNlcnRlZAotYXQgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBhY3RpdmUgZWRpdG9yIDwvbGk+Ci0KLTxsaT5Vc2VyLWRlZmluZWQgZHJhd2VycyBhbmQgaXRlbXM6IFlvdSBjYW4gZGVmaW5lLCBlZGl0LCBhbmQgcmVtb3ZlIGl0ZW1zCi1mcm9tIHZpZXcgZHJhd2VycyBhcyBkZXNpcmVkLjwvbGk+Ci0KLTxsaT5QbHVnLWluLWRlZmluZWQgZHJhd2VycyBhbmQgaXRlbXM6IFBsdWctaW4gZGV2ZWxvcGVycyBjYW4gY29udHJpYnV0ZSBhCi1kZWZhdWx0IGxpc3Qgb2YgaXRlbXMgdG8gdGhlaXIgb3duIGRyYXdlcnMuPC9saT4KLQotPGxpPlZhcmlhYmxlcyBpbiBpbnNlcnRpb25zOiBCeSBkZWZhdWx0LCBpdGVtcyB3aWxsIGJlIGVkaXRlZCB1c2luZyBhIGRpYWxvZwotYW5kLCB3aGVuIGluc2VydGVkLCB5b3Ugd2lsbCBiZSBwcm9tcHRlZCBmb3IgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSB2YXJpYWJsZXMuPC9saT4KLQotPGxpPkN1c3RvbWl6YXRpb246IFlvdSBjYW4gc2VsZWN0IHdoaWNoIGRyYXdlcnMgYW5kIGl0ZW1zIGFyZSBzaG93biBpbiB0aGUKLVNuaXBwZXRzIHZpZXcuPC9saT4KLQotPGxpPkN1c3RvbSBpbnNlcnRpb246IFBsdWctaW4gZGV2ZWxvcGVycyBjYW4gY3VzdG9taXplIHRoZSBiZWhhdmlvciBvZiBpdGVtcwotc28gdGhhdCB3aGVuIHRoZXkgYXJlIGRyb3BwZWQgZHVyaW5nIGEgZHJhZy1hbmQtZHJvcCBhY3Rpb24sIGJvdGggdGhlIHRleHQKLXRoYXQgaXMgaW5zZXJ0ZWQgYW5kIHRoZSBpbnNlcnRpb24gbG9jYXRpb24gYXJlIHN0cmljdGx5IGRlZmluZWQuPC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwCi1sYW5ndWFnZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyNi5odG1sIiB0aXRsZT0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiBUaGUgdmlldyBjYW4gYmUgZXh0ZW5kZWQgYmFzZWQgb24gYWRkaXRpb25hbCBvYmplY3RzIHRoYXQgeW91IGRlZmluZSBhbmQgaW5jbHVkZS4iPkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDE0Lmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZXhwbGFpbnMgaG93IHRvIGN1c3RvbWl6ZSB0aGUgU25pcHBldHMgdmlldyBieSBhZGRpbmcgYSBuZXcgZHJhd2VyLiI+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTUuaHRtbCIgdGl0bGU9IiI+QWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjIuaHRtbCIgdGl0bGU9IiI+RWRpdGluZyBzbmlwcGV0IGl0ZW1zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDE2Lmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBkZWxldGUgb3IgaGlkZSBkcmF3ZXJzIGFuZCBpdGVtcyBpbiB0aGUgU25pcHBldHMgdmlldy4iPkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yCi1kcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDAwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC4iPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyODA5NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwOSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICIuLlxkdGRcY29uY2VwdC5kdGQiPg0KLTw/UHViIFN0eSBfZGlzcGxheSBGb250Q29sb3I9InJlZCI/Pg0KLTxjb25jZXB0IGlkPSJjc3JjZWR0MDA0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08bmF2dGl0bGU+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L25hdnRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+PHE+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcjwvcT4gaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzDQotdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsDQotb3IgWE1MLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48a2V5d29yZD5zb3VyY2UgZWRpdG9yczwva2V5d29yZD48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+PGluZGV4dGVybT5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4gPGluZGV4dGVybT50ZW1wbGF0ZXM8aW5kZXh0ZXJtPnN0cnVjdHVyZWQNCi10ZXh0IGVkaXRvcnM8L2luZGV4dGVybT48L2luZGV4dGVybT4gIFRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzDQotcmVwcmVzZW50ZWQgYnkgdmFyaW91cyBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBmaWxlcyBjb2RlZA0KLXdpdGggbWFya3VwIHRhZ3M6PC9wPg0KLTx0YWJsZT4NCi08dGdyb3VwIGNvbHM9IjMiPjxjb2xzcGVjIGNvbG5hbWU9ImNvbDEiIGNvbHdpZHRoPSI4OSoiLz48Y29sc3BlYw0KLWNvbG5hbWU9ImNvbDIiIGNvbHdpZHRoPSIxMzQqIi8+PGNvbHNwZWMgY29sbmFtZT0iQ09MU1BFQzAiDQotY29sd2lkdGg9IjY5KiIvPg0KLTx0aGVhZD4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIiB2YWxpZ249InRvcCI+RmlsZSB0eXBlPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiIgdmFsaWduPSJ0b3AiPkVkaXRvcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIiB2YWxpZ249InRvcCI+Q29udGVudCBhc3Npc3Q/PC9lbnRyeT4NCi08L3Jvdz4NCi08L3RoZWFkPg0KLTx0Ym9keT4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5DYXNjYWRpbmcgc3R5bGUgc2hlZXQ8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5DU1Mgc291cmNlIHBhZ2UgZWRpdG9yPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPlllczwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+RG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uczwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPkRURCBzb3VyY2UgcGFnZSBlZGl0b3I8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+Tm88L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkhUTUw8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5IVE1MIHNvdXJjZSBwYWdlIGVkaXRvcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIj5ZZXM8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPjx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+PHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4gc291cmNlDQotcGFnZSBlZGl0b3Igb3Igc291cmNlIHRhYiBvZiBKYXZhU2NyaXB0IGVkaXRvcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIj5ZZXM8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkpTUDwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPkpTUCBzb3VyY2UgcGFnZSBlZGl0b3I8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+WWVzPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5YTUw8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5Tb3VyY2UgdGFiIG9mIFhNTCBlZGl0b3I8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+WWVzPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5YU0QgKHNjaGVtYSk8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5Tb3VyY2UgdGFiIG9mIFhNTCBzY2hlbWEgZWRpdG9yPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPlllczwvZW50cnk+DQotPC9yb3c+DQotPC90Ym9keT4NCi08L3Rncm91cD4NCi08L3RhYmxlPg0KLTxwPllvdSBjYW4gYWNjZXNzIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGJ5IHJpZ2h0LWNsaWNraW5nIG9uDQotYSByZWxldmFudCBmaWxlIG5hbWUgaW4gTmF2aWdhdG9yIG9yIFBhY2thZ2UgRXhwbG9yZXIgdmlldyBhbmQgdGhlbg0KLWNsaWNraW5nIDx1aWNvbnRyb2w+T3BlbiBXaXRoPC91aWNvbnRyb2w+IGFuZCBzZWxlY3RpbmcgdGhlIGVkaXRvcg0KLW1lbnRpb25lZCBhYm92ZS48L3A+DQotPHA+VGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGludGVyZmFjZSByZWdhcmRsZXNzDQotb2YgdGhlIG1hcmt1cCBsYW5ndWFnZSB3aXRoIHdoaWNoIGl0IGlzIGFzc29jaWF0ZWQuIEl0IHByb3ZpZGVzIGNhcGFiaWxpdGllcw0KLXN1Y2ggYXMgZmluZCBhbmQgcmVwbGFjZSwgdW5kbywgcmVkbywgYSBzcGVsbGluZyBjaGVja2VyLCBhbmQgY29kaW5nDQotYXNzaXN0YW5jZSAodW5sZXNzIG90aGVyd2lzZSBub3RlZCkuIEl0IGFsc28gaGlnaGxpZ2h0cyBzeW50YXggaW4NCi1kaWZmZXJlbnQgY29sb3JzLiBGb2xsb3dpbmcgaXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiBzb21lIG9mIHRoZQ0KLXN0cnVjdHVyZWQgdGV4dCBlZGl0b3IncyBjYXBhYmlsaXRpZXM6PC9wPg0KLTxkbD48ZGxlbnRyeT4NCi08ZHQ+c3ludGF4IGhpZ2hsaWdodGluZzwvZHQ+DQotPGRkPkVhY2gga2V5d29yZCB0eXBlIGFuZCBzeW50YXggdHlwZSBpcyBoaWdobGlnaHRlZCBkaWZmZXJlbnRseSwNCi1lbmFibGluZyB5b3UgdG8gZWFzaWx5IGZpbmQgYSBjZXJ0YWluIGtpbmQgb2Yga2V5d29yZCBmb3IgZWRpdGluZy4NCi1Gb3IgZXhhbXBsZSwgaW4gSFRNTCwgZWxlbWVudCBuYW1lcywgYXR0cmlidXRlIG5hbWVzLCBhdHRyaWJ1dGUgdmFsdWVzLA0KLWFuZCBjb21tZW50cyBoYXZlIGRpZmZlcmVudCBjb2xvcnM7IGluIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+LA0KLWZ1bmN0aW9uIGFuZCB2YXJpYWJsZSBuYW1lcywgcXVvdGVkIHRleHQgc3RyaW5ncywgYW5kIGNvbW1lbnRzIGhhdmUNCi1kaWZmZXJlbnQgY29sb3JzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD51bmxpbWl0ZWQgdW5kbyBhbmQgcmVkbzwvZHQ+DQotPGRkPlRoZXNlIG9wdGlvbnMgYWxsb3cgeW91IHRvIGluY3JlbWVudGFsbHkgdW5kbyBhbmQgcmVkbyBldmVyeSBjaGFuZ2UNCi1tYWRlIHRvIGEgZmlsZSBmb3IgdGhlIGVudGlyZSBlZGl0aW5nIHNlc3Npb24uIEZvciB0ZXh0LCBjaGFuZ2VzIGFyZQ0KLWluY3JlbWVudGVkIG9uZSBjaGFyYWN0ZXIgb3Igc2V0IG9mIHNlbGVjdGVkIGNoYXJhY3RlcnMgYXQgYSB0aW1lLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5jb250ZW50IGFzc2lzdDwvZHQ+DQotPGRkPkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSB0byBpbnNlcnQgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4gZnVuY3Rpb25zLA0KLUhUTUwgdGFncywgb3Igb3RoZXIga2V5d29yZHMuIENob2ljZXMgYXZhaWxhYmxlIGluIHRoZSBjb250ZW50IGFzc2lzdA0KLWxpc3QgYXJlIGJhc2VkIG9uIGZ1bmN0aW9ucyBkZWZpbmVkIGJ5IHRoZSBzeW50YXggb2YgdGhlIGxhbmd1YWdlDQotaW4gd2hpY2ggdGhlIGZpbGUgaXMgY29kZWQuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PnVzZXItZGVmaW5lZCB0ZW1wbGF0ZXMgYW5kIHNuaXBwZXRzPC9kdD4NCi08ZGQ+QnkgdXNpbmcgdGhlIFNuaXBwZXRzIHZpZXcsIHlvdSBjYW4gYWNjZXNzIHVzZXItZGVmaW5lZCBjb2RlIHNuaXBwZXRzDQotYW5kIChmb3IgYWxsIGNvZGUgdHlwZXMgZXhjZXB0IDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+KQ0KLXRlbXBsYXRlcyB0byBoZWxwIHlvdSBxdWlja2x5IGFkZCByZWd1bGFybHkgdXNlZCB0ZXh0IHN0cmluZ3MuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PmZ1bmN0aW9uIHNlbGVjdGlvbjwvZHQ+DQotPGRkPkJhc2VkIG9uIHRoZSBsb2NhdGlvbiBvZiB5b3VyIGN1cnNvciwgdGhlIGZ1bmN0aW9uIG9yIHRhZyBzZWxlY3Rpb24NCi1pbmRpY2F0b3IgaGlnaGxpZ2h0cyB0aGUgbGluZSBudW1iZXJzIHRoYXQgaW5jbHVkZSBhIGZ1bmN0aW9uIG9yIHRhZw0KLWluIHRoZSB2ZXJ0aWNhbCBydWxlciBvbiB0aGUgbGVmdCBhcmVhIG9mIHRoZSBTb3VyY2UgcGFnZS48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+cG9wLXVwIG1lbnUgb3B0aW9uczwvZHQ+DQotPGRkPlRoZXNlIGFyZSB0aGUgc2FtZSBlZGl0aW5nIG9wdGlvbnMgYXZhaWxhYmxlIGluIHRoZSB3b3JrYmVuY2ggPHVpY29udHJvbD5FZGl0PC91aWNvbnRyb2w+IG1lbnUuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PmNvZGUgZm9sZGluZzwvZHQ+DQotPGRkPkNvZGUgZm9sZGluZyBhbGxvd3MgY29sbGFwc2luZyBhbmQgZXhwYW5kaW5nIG9mIHRleHQgYW5kIGNhbiBiZQ0KLWFjY2Vzc2VkIGJ5IHRoZSA8dWljb250cm9sPkZvbGRpbmc8L3VpY29udHJvbD4gb3B0aW9uIGluIHRoZSBwb3AtdXANCi1tZW51LjwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+PD9QdWIgQ2FyZXQgMTQ3MT8+DQotPC9jb25ib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA2LmRpdGEiPjxsaW5rdGV4dD5Db250ZW50IGFzc2lzdDwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvY29uY2VwdD4NCi08P1B1YiAqMDAwMDAwNTU0Mz8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVjMDg2Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiIgLz4KLTxtZXRhIGNvbnRlbnQ9InNvdXJjZSBlZGl0b3JzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic291cmNlIGVkaXRvcnMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA2Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjc3JjZWR0MDA0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNzcmNlZHQwMDQiPjxhIG5hbWU9ImNzcmNlZHQwMDQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzPC9oMT4KLQotCi0KLQotPGRpdj48cD48c3BhbiBjbGFzcz0icSI+IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IiPC9zcGFuPiBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdAoteW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvcgotWE1MLjwvcD4KLQotPHA+Ci0KLQotVGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgcmVwcmVzZW50ZWQgYnkgdmFyaW91cyBlZGl0b3JzIHRoYXQgeW91IGNhbgotdXNlIHRvIGVkaXQgZmlsZXMgY29kZWQgd2l0aCBtYXJrdXAgdGFnczo8L3A+Ci0KLQotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPgotPHRoZWFkIGFsaWduPSJsZWZ0Ij4KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgd2lkdGg9IjMwLjQ3OTQ1MjA1NDc5NDUyJSIgaWQ9Ik4xMDA4NiI+RmlsZSB0eXBlPC90aD4KLQotPHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iNDUuODkwNDEwOTU4OTA0MTElIiBpZD0iTjEwMDhFIj5FZGl0b3I8L3RoPgotCi08dGggdmFsaWduPSJ0b3AiIHdpZHRoPSIyMy42MzAxMzY5ODYzMDEzNyUiIGlkPSJOMTAwOTYiPkNvbnRlbnQgYXNzaXN0PzwvdGg+Ci0KLTwvdHI+Ci0KLTwvdGhlYWQ+Ci0KLTx0Ym9keT4KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjMwLjQ3OTQ1MjA1NDc5NDUyJSIgaGVhZGVycz0iTjEwMDg2ICI+Q2FzY2FkaW5nIHN0eWxlIHNoZWV0PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDUuODkwNDEwOTU4OTA0MTElIiBoZWFkZXJzPSJOMTAwOEUgIj5DU1Mgc291cmNlIHBhZ2UgZWRpdG9yPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjMuNjMwMTM2OTg2MzAxMzclIiBoZWFkZXJzPSJOMTAwOTYgIj5ZZXM8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzMC40Nzk0NTIwNTQ3OTQ1MiUiIGhlYWRlcnM9Ik4xMDA4NiAiPkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnM8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI0NS44OTA0MTA5NTg5MDQxMSUiIGhlYWRlcnM9Ik4xMDA4RSAiPkRURCBzb3VyY2UgcGFnZSBlZGl0b3I8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMy42MzAxMzY5ODYzMDEzNyUiIGhlYWRlcnM9Ik4xMDA5NiAiPk5vPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMzAuNDc5NDUyMDU0Nzk0NTIlIiBoZWFkZXJzPSJOMTAwODYgIj5IVE1MPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDUuODkwNDEwOTU4OTA0MTElIiBoZWFkZXJzPSJOMTAwOEUgIj5IVE1MIHNvdXJjZSBwYWdlIGVkaXRvcjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIzLjYzMDEzNjk4NjMwMTM3JSIgaGVhZGVycz0iTjEwMDk2ICI+WWVzPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMzAuNDc5NDUyMDU0Nzk0NTIlIiBoZWFkZXJzPSJOMTAwODYgIj5KYXZhU2NyaXB04oSiPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDUuODkwNDEwOTU4OTA0MTElIiBoZWFkZXJzPSJOMTAwOEUgIj5KYXZhU2NyaXB0IHNvdXJjZSBwYWdlIGVkaXRvciBvciBzb3VyY2UKLXRhYiBvZiBKYXZhU2NyaXB0IGVkaXRvcjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIzLjYzMDEzNjk4NjMwMTM3JSIgaGVhZGVycz0iTjEwMDk2ICI+WWVzPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMzAuNDc5NDUyMDU0Nzk0NTIlIiBoZWFkZXJzPSJOMTAwODYgIj5KU1A8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI0NS44OTA0MTA5NTg5MDQxMSUiIGhlYWRlcnM9Ik4xMDA4RSAiPkpTUCBzb3VyY2UgcGFnZSBlZGl0b3I8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMy42MzAxMzY5ODYzMDEzNyUiIGhlYWRlcnM9Ik4xMDA5NiAiPlllczwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjMwLjQ3OTQ1MjA1NDc5NDUyJSIgaGVhZGVycz0iTjEwMDg2ICI+WE1MPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDUuODkwNDEwOTU4OTA0MTElIiBoZWFkZXJzPSJOMTAwOEUgIj5Tb3VyY2UgdGFiIG9mIFhNTCBlZGl0b3I8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMy42MzAxMzY5ODYzMDEzNyUiIGhlYWRlcnM9Ik4xMDA5NiAiPlllczwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjMwLjQ3OTQ1MjA1NDc5NDUyJSIgaGVhZGVycz0iTjEwMDg2ICI+WFNEIChzY2hlbWEpPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDUuODkwNDEwOTU4OTA0MTElIiBoZWFkZXJzPSJOMTAwOEUgIj5Tb3VyY2UgdGFiIG9mIFhNTCBzY2hlbWEgZWRpdG9yPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjMuNjMwMTM2OTg2MzAxMzclIiBoZWFkZXJzPSJOMTAwOTYgIj5ZZXM8L3RkPgotCi08L3RyPgotCi08L3Rib2R5PgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTxwPllvdSBjYW4gYWNjZXNzIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGJ5IHJpZ2h0LWNsaWNraW5nIG9uIGEgcmVsZXZhbnQKLWZpbGUgbmFtZSBpbiBOYXZpZ2F0b3Igb3IgUGFja2FnZSBFeHBsb3JlciB2aWV3IGFuZCB0aGVuIGNsaWNraW5nIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9wZW4KLVdpdGg8L3NwYW4+IGFuZCBzZWxlY3RpbmcgdGhlIGVkaXRvciBtZW50aW9uZWQgYWJvdmUuPC9wPgotCi08cD5UaGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBwcm92aWRlcyBhIGNvbnNpc3RlbnQgaW50ZXJmYWNlIHJlZ2FyZGxlc3Mgb2YKLXRoZSBtYXJrdXAgbGFuZ3VhZ2Ugd2l0aCB3aGljaCBpdCBpcyBhc3NvY2lhdGVkLiBJdCBwcm92aWRlcyBjYXBhYmlsaXRpZXMKLXN1Y2ggYXMgZmluZCBhbmQgcmVwbGFjZSwgdW5kbywgcmVkbywgYSBzcGVsbGluZyBjaGVja2VyLCBhbmQgY29kaW5nIGFzc2lzdGFuY2UKLSh1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkKS4gSXQgYWxzbyBoaWdobGlnaHRzIHN5bnRheCBpbiBkaWZmZXJlbnQgY29sb3JzLiBGb2xsb3dpbmcKLWlzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2Ygc29tZSBvZiB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcidzIGNhcGFiaWxpdGllczo8L3A+Ci0KLTxkbD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5zeW50YXggaGlnaGxpZ2h0aW5nPC9kdD4KLQotPGRkPkVhY2gga2V5d29yZCB0eXBlIGFuZCBzeW50YXggdHlwZSBpcyBoaWdobGlnaHRlZCBkaWZmZXJlbnRseSwgZW5hYmxpbmcKLXlvdSB0byBlYXNpbHkgZmluZCBhIGNlcnRhaW4ga2luZCBvZiBrZXl3b3JkIGZvciBlZGl0aW5nLiBGb3IgZXhhbXBsZSwgaW4KLUhUTUwsIGVsZW1lbnQgbmFtZXMsIGF0dHJpYnV0ZSBuYW1lcywgYXR0cmlidXRlIHZhbHVlcywgYW5kIGNvbW1lbnRzIGhhdmUKLWRpZmZlcmVudCBjb2xvcnM7IGluIEphdmFTY3JpcHQsIGZ1bmN0aW9uIGFuZCB2YXJpYWJsZQotbmFtZXMsIHF1b3RlZCB0ZXh0IHN0cmluZ3MsIGFuZCBjb21tZW50cyBoYXZlIGRpZmZlcmVudCBjb2xvcnMuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+dW5saW1pdGVkIHVuZG8gYW5kIHJlZG88L2R0PgotCi08ZGQ+VGhlc2Ugb3B0aW9ucyBhbGxvdyB5b3UgdG8gaW5jcmVtZW50YWxseSB1bmRvIGFuZCByZWRvIGV2ZXJ5IGNoYW5nZSBtYWRlCi10byBhIGZpbGUgZm9yIHRoZSBlbnRpcmUgZWRpdGluZyBzZXNzaW9uLiBGb3IgdGV4dCwgY2hhbmdlcyBhcmUgaW5jcmVtZW50ZWQKLW9uZSBjaGFyYWN0ZXIgb3Igc2V0IG9mIHNlbGVjdGVkIGNoYXJhY3RlcnMgYXQgYSB0aW1lLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPmNvbnRlbnQgYXNzaXN0PC9kdD4KLQotPGRkPkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSB0byBpbnNlcnQgSmF2YVNjcmlwdCBmdW5jdGlvbnMsIEhUTUwgdGFncywgb3IKLW90aGVyIGtleXdvcmRzLiBDaG9pY2VzIGF2YWlsYWJsZSBpbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCBhcmUgYmFzZWQgb24KLWZ1bmN0aW9ucyBkZWZpbmVkIGJ5IHRoZSBzeW50YXggb2YgdGhlIGxhbmd1YWdlIGluIHdoaWNoIHRoZSBmaWxlIGlzIGNvZGVkLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPnVzZXItZGVmaW5lZCB0ZW1wbGF0ZXMgYW5kIHNuaXBwZXRzPC9kdD4KLQotPGRkPkJ5IHVzaW5nIHRoZSBTbmlwcGV0cyB2aWV3LCB5b3UgY2FuIGFjY2VzcyB1c2VyLWRlZmluZWQgY29kZSBzbmlwcGV0cwotYW5kIChmb3IgYWxsIGNvZGUgdHlwZXMgZXhjZXB0IEphdmFTY3JpcHQpIHRlbXBsYXRlcyB0byBoZWxwIHlvdQotcXVpY2tseSBhZGQgcmVndWxhcmx5IHVzZWQgdGV4dCBzdHJpbmdzLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPmZ1bmN0aW9uIHNlbGVjdGlvbjwvZHQ+Ci0KLTxkZD5CYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YgeW91ciBjdXJzb3IsIHRoZSBmdW5jdGlvbiBvciB0YWcgc2VsZWN0aW9uIGluZGljYXRvcgotaGlnaGxpZ2h0cyB0aGUgbGluZSBudW1iZXJzIHRoYXQgaW5jbHVkZSBhIGZ1bmN0aW9uIG9yIHRhZyBpbiB0aGUgdmVydGljYWwKLXJ1bGVyIG9uIHRoZSBsZWZ0IGFyZWEgb2YgdGhlIFNvdXJjZSBwYWdlLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPnBvcC11cCBtZW51IG9wdGlvbnM8L2R0PgotCi08ZGQ+VGhlc2UgYXJlIHRoZSBzYW1lIGVkaXRpbmcgb3B0aW9ucyBhdmFpbGFibGUgaW4gdGhlIHdvcmtiZW5jaCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPiBtZW51LjwvZGQ+Ci0KLTwvZGw+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNi5odG1sIiB0aXRsZT0iQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yIGluIHRoZSBzb3VyY2UgZmlsZSBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHRvIG9mZmVyIHN1Z2dlc3Rpb25zIGZvciBjb21wbGV0aW9uLiI+Q29udGVudCBhc3Npc3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA2LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYmZlOWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA2LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiLi5cZHRkXGNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3NyY2VkdDAwNiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q29udGVudCBhc3Npc3Q8L3RpdGxlPg0KLTxzaG9ydGRlc2M+Q29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3INCi1maW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3INCi1pbiB0aGUgc291cmNlIGZpbGUgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50IGFzc2lzdCB0byBvZmZlciBzdWdnZXN0aW9ucw0KLWZvciBjb21wbGV0aW9uLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0iY3NyY2VkdDAwNnwxfGNvbnRlbnRhc3Npc3RhbmNlb3ZlcnZpZXciIHN0YXR1cz0ibmV3Ij5jb250ZW50DQotYXNzaXN0YW5jZTxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtIGtleXJlZj0iY3NyY2VkdDAwNnwyfHN0cnVjdHVyZWR0ZXh0ZWRpdG9yc2NvbnRlbnRhc3Npc3RhbmNlIg0KLXN0YXR1cz0iY2hhbmdlZCI+c3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8aW5kZXh0ZXJtPmNvbnRlbnQgYXNzaXN0YW5jZTxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+TW9zdCBvZiB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgaGF2ZSBjb250ZW50IGFzc2lzdC4gRm9yIGEgbGlzdCBvZg0KLWVkaXRvcnMgdGhhdCBoYXZlIGNvbnRlbnQgYXNzaXN0LCBzZWUgPHhyZWYgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIiB0eXBlPSJjb25jZXB0Ij5TdHJ1Y3R1cmVkDQotdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzPC94cmVmPi4gRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZXQgY29udGVudA0KLWFzc2lzdGFuY2UsIHNlZSA8eHJlZiBocmVmPSJ0c3JjZWR0MDA1LmRpdGEiIHR5cGU9InRhc2siPkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlDQotaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L3hyZWY+PC9wPg0KLTxwPlRoZSBzZWN0aW9ucyBiZWxvdyBkZXNjcmliZSBzcGVjaWZpY3Mgb2YgSFRNTCBjb250ZW50IGFzc2lzdCwgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4gY29udGVudA0KLWFzc2lzdCwgYW5kIEpTUCBjb250ZW50IGFzc2lzdC48L3A+DQotPHNlY3Rpb24+PHRpdGxlPkhUTUwgY29udGVudCBhc3Npc3Q8L3RpdGxlPjxwPkhUTUwgaXMgZmxleGlibGUgaW4gdGhhdCBzb21lDQotSFRNTCBlbGVtZW50cyBhbGxvdyBlbmQgdGFncyB0byBiZSBvcHRpb25hbGx5IG9taXR0ZWQsIHN1Y2ggYXMgPGNvZGVwaD5QPC9jb2RlcGg+LCA8Y29kZXBoPkRUPC9jb2RlcGg+LCA8Y29kZXBoPkREPC9jb2RlcGg+LCA8Y29kZXBoPkxJPC9jb2RlcGg+LCA8Y29kZXBoDQotPlRIRUFEPC9jb2RlcGg+LCA8Y29kZXBoPlRSPC9jb2RlcGg+LCA8Y29kZXBoPlREPC9jb2RlcGg+LCA8Y29kZXBoPlRIPC9jb2RlcGg+LA0KLWFuZCBzbyBvbi4gT3RoZXIgSFRNTCBlbGVtZW50cyB0aGF0IGFyZSBkZWZpbmVkIHRvIGhhdmUgbm8gY29udGVudCBtYXkgcmVxdWlyZQ0KLXRoZSBlbmQgdGFnIGFsd2F5cyBiZSBvbWl0dGVkLCBzdWNoIGFzIDxjb2RlcGg+QlI8L2NvZGVwaD4sIDxjb2RlcGg+SFI8L2NvZGVwaD4sIDxjb2RlcGg+TElOSzwvY29kZXBoPiwgPGNvZGVwaD5NRVRBPC9jb2RlcGg+LA0KLWFuZCA8Y29kZXBoPklNRzwvY29kZXBoPi4gVGhpcyBmbGV4aWJpbGl0eSBtYWtlcyB0aGUgY29udGVudCBhc3Npc3QgZnVuY3Rpb24NCi13aXRoaW4gdGhlIEhUTUwgc291cmNlIHBhZ2UgZWRpdG9yIGxlc3MgcHJlY2lzZSB0aGFuIGl0IG1pZ2h0IGJlIHdpdGggYSBtb3JlDQotcmlnaWRseSBjb25zdHJhaW5lZCBtYXJrdXAgbGFuZ3VhZ2UuPC9wPjxwPkhUTUwgY29udGVudCBhc3Npc3QgaXMgbW9zdCBiZW5lZmljaWFsDQotd2hlbiB5b3UgbmVlZCB0byBjb21wbGV0ZSBhIHRhZyBuYW1lLCBhZGQgYW4gYXR0cmlidXRlIG5hbWUtdmFsdWUgcGFpciB3aXRoaW4NCi1hIHN0YXJ0IHRhZywgb3Igc2VsZWN0IGZyb20gYW4gZW51bWVyYXRlZCBsaXN0IG9mIGF0dHJpYnV0ZSB2YWx1ZXMuPC9wPjxwPkFsdGhvdWdoDQotY29udGVudCBhc3Npc3Qgb25seSBzaG93cyBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBoYXZlIG5vdCBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkDQotaW4gYSBzdGFydCB0YWcsIGl0IGRvZXMgbm90IHRha2UgaW50byBhY2NvdW50IGdyYW1tYXIgY29uc3RyYWludHMgZm9yIHRhZ3MuDQotRm9yIGV4YW1wbGUsIHRoZSA8Y29kZXBoPkhFQUQ8L2NvZGVwaD4gZWxlbWVudCBpbiBIVE1MIG9ubHkgcGVybWl0cyB6ZXJvIG9yDQotb25lIG9jY3VycmVuY2VzIG9mIGEgPGNvZGVwaD5USVRMRTwvY29kZXBoPiB0YWcgaW4gaXRzIGNvbnRlbnQuIElmIHlvdSBwcm9tcHQNCi1mb3IgY29udGVudCBhc3Npc3Qgd2l0aGluIGEgPGNvZGVwaD5IRUFEPC9jb2RlcGg+IGNvbnRlbnQgdGhhdCBhbHJlYWR5IGNvbnRhaW5zDQotYSA8Y29kZXBoPlRJVExFPC9jb2RlcGg+IHRhZywgY29udGVudCBhc3Npc3Qgd2lsbCBzdGlsbCBzaG93IDxjb2RlcGg+VElUTEU8L2NvZGVwaD4gaW4NCi1pdHMgcHJvcG9zYWwgbGlzdC48L3A+PHA+SG93ZXZlciwgaWYgYW4gYXR0cmlidXRlIGlzIHJlcXVpcmVkIGFjY29yZGluZyB0bw0KLXRoZSBEVEQvU2NoZW1hLCB0aGF0IGF0dHJpYnV0ZSB3aWxsIHNob3cgdXAgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdCwgd2l0aCBhDQoteWVsbG93IGNpcmNsZSBpbmRpY2F0b3Igb24gaXRzIGljb24uPC9wPjxwPklmIHlvdXIgY3Vyc29yIGlzIGluIGEgcG9zaXRpb24NCi13aGVyZSBjb250ZW50IGFzc2lzdCBpcyBhdmFpbGFibGUsIGEgcG9wLXVwIGxpc3Qgb2YgYXZhaWxhYmxlIGNob2ljZXMgaXMgZGlzcGxheWVkLg0KLVRoZSBsaXN0IGlzIGJhc2VkIG9uIHRoZSBjb250ZXh0LiBGb3IgZXhhbXBsZSwgaWYgeW91IHVzZSBjb250ZW50IGFzc2lzdCBkaXJlY3RseQ0KLWFmdGVyIGFuIG9wZW5pbmcgcGFyYWdyYXBoIHRhZyAoPGNvZGVwaD4mbHQ7cD48L2NvZGVwaD4pICwgdGhlIGZpcnN0IGl0ZW0NCi1pbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCB3aWxsIGJlIHRoZSBjb3JyZXNwb25kaW5nIGNsb3NpbmcgcGFyYWdyYXBoICg8Y29kZXBoPiZsdDsvcD48L2NvZGVwaD4pDQotdGFnLjwvcD48cD5UaGUgY29udGVudCBhc3Npc3QgbGlzdCBkaXNwbGF5cyBhbGwgYXZhaWxhYmxlIHRhZ3MgZm9yIHRoZSBjdXJyZW50DQotY3Vyc29yIHBvc2l0aW9uLCBpbmNsdWRpbmcgdGVtcGxhdGVzLiBUaGUgcGljdHVyZSBiZWxvdyBzaG93cyB0aGUgZGVmYXVsdA0KLWNvbnRlbnQgYXNzaXN0IGxpc3QgZm9yIGEgcGFyYWdyYXBoIHRhZyBleGFtcGxlOjxpbWFnZSBhbHQ9IkhUTUwgQ29udGVudCBhc3Npc3QiDQotaHJlZj0iLi4vaW1hZ2VzL25jb250YXNzLmdpZiIgcGxhY2VtZW50PSJicmVhayI+PC9pbWFnZT48L3A+PHA+VGFnIHByb3Bvc2Fscw0KLWFyZSBsaXN0ZWQgYWxwaGFiZXRpY2FsbHkuIElmIHlvdSB0eXBlIGEgPGNvZGVwaD4mbHQ7PC9jb2RlcGg+ICh0byBiZWdpbiBhDQotbmV3IHRhZykgYmVmb3JlIHByb21wdGluZyBmb3IgY29udGVudCBhc3Npc3QsIGFuZCBiZWdpbiB0eXBpbmcgdGhlIGZpcnN0IG9uZQ0KLW9yIHR3byBsZXR0ZXJzIG9mIHRoZSB0YWcgdGhhdCB5b3Ugd2FudCB0byBhZGQsIHRoZSBwcm9wb3NhbCBsaXN0IGF1dG9tYXRpY2FsbHkNCi1yZWZyZXNoZXMgdG8gcmVmbGVjdCBwcm9wb3NhbHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiB5b3UgaGF2ZSB0eXBlZC4gSWYgeW91DQotZG8gbm90IHR5cGUgYSA8Y29kZXBoPiZsdDs8L2NvZGVwaD4gYmVmb3JlIHByb21wdGluZyBmb3IgY29udGVudCBhc3Npc3QsIHlvdQ0KLWNhbiBjbGljayB3aXRoaW4gdGhlIHByb3Bvc2FsIGxpc3QgYW5kIHRoZW4gdHlwZSB0aGUgbGV0dGVyIHRoYXQgdGhlIHRhZyBiZWdpbnMNCi13aXRoLCB0byByZWR1Y2UgKHNvbWV3aGF0KSB0aGUgYW1vdW50IG9mIHNjcm9sbGluZyB0byBsb2NhdGUgdGhlIGRlc2lyZWQgdGFnLjwvcD48cD5Bcw0KLXlvdSB0eXBlIHRoZSBmaXJzdCBvbmUgb3IgdHdvIGxldHRlcnMgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lcyBvciBlbnVtZXJhdGVkDQotYXR0cmlidXRlIHZhbHVlcyB0aGF0IHlvdSB3YW50IHRvIGFkZCB0byBhIHRhZywgdGhlIGxpc3QgYXV0b21hdGljYWxseSByZWZyZXNoZXMNCi10byByZWZsZWN0IHByb3Bvc2FscyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuIHlvdSBoYXZlIHR5cGVkLjwvcD48bm90ZSB0eXBlPSJyZXN0cmljdGlvbiI+PGltYWdlDQotYWx0PSJGb3IgTGludXguIiBocmVmPSIuLi9pbWFnZXMvbmxpbnV4LmdpZiI+PC9pbWFnZT4gV2hlbiB1c2luZyBMaW51eCAoTW90aWYNCi1vciBHVEspIGFuZCBhIERCQ1MgbG9jYWxlLCBkb3VibGUtY2xpY2tpbmcgb24gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgY2FuDQotc29tZXRpbWVzIGNhdXNlIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBWTSB0byB0ZXJtaW5hdGUuIEluc3RlYWQgb2YgZG91YmxlLWNsaWNraW5nDQotb24gdGhlIGxpc3QsIHVzZSB0aGUgYXJyb3dzIGFuZCBFbnRlciBrZXlzIHRvIG1ha2UgdGhlIHNlbGVjdGlvbiBmcm9tIHRoZQ0KLWxpc3QuPC9ub3RlPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+SlNQIGNvbnRlbnQgYXNzaXN0PC90aXRsZT48cD5Zb3UgaGF2ZSBtYW55IG9wdGlvbnMgZm9yIGVtYmVkZGluZyA8dG0NCi10bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBhbmQNCi1IVE1MIGNvZGUgaW4geW91ciBKU1AgcGFnZXMgYnkgdXNpbmcgY29udGVudCBhc3Npc3QuPC9wPjxwPkFsbCBvZiB0aGUgSlNQDQotdGFncyBhcmUgaW5jbHVkZWQgYm90aCBpbiB0aGUgdGVtcGxhdGUgbGlzdCBhbmQgaW4gWE1MIGZvcm1hdCAoZm9yIGV4YW1wbGUsIDxjb2RlcGg+Jmx0O2pzcDpleHByZXNzaW9uPjwvY29kZXBoPikuDQotVG8gYWRkIEpTUCBzY3JpcHRsZXQgdGFncywgZm9yIGV4YW1wbGUsIG1vdmUgdGhlIGN1cnNvciB0byB0aGUgYXBwcm9wcmlhdGUNCi1wb3NpdGlvbiBpbiB0aGUgZmlsZSBhbmQgcHJlc3MgQ3RybCtTcGFjZSB0byB1c2UgY29udGVudCBhc3Npc3QuIFNlbGVjdCA8aW1hZ2UNCi1hbHQ9IkpTUCBzY3JpcHRsZXQgY29udGVudCBhc3Npc3QiIGhyZWY9Ii4uL2ltYWdlcy9ubWFjc2NycC5naWYiIHBsYWNlbWVudD0iaW5saW5lIj4NCi08L2ltYWdlPiBmcm9tIHRoZSBwcm9wb3NhbCBsaXN0IHRvIGluc2VydCA8Y29kZXBoPiZsdDslICU+PC9jb2RlcGg+ICBpbiB0aGUNCi1kb2N1bWVudC48L3A+PHA+U2NyaXB0bGV0cyBhcmUgaW5zZXJ0ZWQgaW4gYSB0YWcgPGNvZGVwaD4mbHQ7JSAlPjwvY29kZXBoPi4NCi1Gb3IgZXhhbXBsZTogPGNvZGVibG9jaz4mbHQ7JSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAlPjwvY29kZWJsb2NrPjwvcD48cD5UaGlzDQotZXhhbXBsZSB3aWxsIGV2YWx1YXRlIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBzdGF0ZW1lbnQgdG8gZ2V0IHRoZSBjdXJyZW50IHRpbWUgaW4NCi1taWxsaXNlY29uZHMuPC9wPjxwPlRvIGhhdmUgdGhlIHJlc3VsdCBvZiB0aGUgc3RhdGVtZW50IGluc2VydGVkIGluIHRoZSBmaWxlLA0KLXB1dCBhbiBlcXVhbHMgc2lnbiAoPSkgaW4gdGhlIGZyb250IG9mIHRoZSBzdGF0ZW1lbnQuIEZvciBleGFtcGxlOiA8Y29kZWJsb2NrPiZsdDtiPlRoaXMgaXMgdGhlIHRpbWUgOiAmbHQ7JT0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCklPiZsdDsvYj48L2NvZGVibG9jaw0KLT48L3A+PHA+V2hlbiB5b3UgYXJlIHdpdGhpbiBhIHNjcmlwdGxldCB5b3UgYXJlIHdyaXRpbmcgcHVyZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjb2RlLg0KLVRoZXJlZm9yZSwgY29udGVudCBhc3Npc3Qgd29ya3MgZXhhY3RseSB0aGUgc2FtZSBhcyBpdCBkb2VzIGZvciB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gZWRpdG9yLg0KLUZvciBleGFtcGxlLCBpZiB5b3UgcmVxdWVzdCBjb250ZW50IGFzc2lzdCBhZnRlciA8Y29kZXBoPlN5c3RlbTwvY29kZXBoPiwNCi1jb250ZW50IGFzc2lzdCBkaXNwbGF5cyBhIGxpc3Qgb2YgbWV0aG9kcy4gPG5vdGU+PHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gY29udGVudCBhc3Npc3Qgd29ya3Mgb25seSBpbiBhIFdlYg0KLXByb2plY3QsIGJlY2F1c2UgaXQgcmVxdWlyZXMgYSBidWlsZHBhdGggdG8gZmluZCB0aGUgYXBwcm9wcmlhdGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gY2xhc3Nlcy48L25vdGU+PC9wPjxwPlRoZXJlDQotYXJlIGFsc28gc3BlY2lhbCB0YWdzIHN1Y2ggYXMgdXNlQmVhbi4gRm9yIGV4YW1wbGU6IDxjb2RlYmxvY2s+Jmx0O2pzcDp1c2VCZWFuIGlkPSJ1c2VCZWFuIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIvPjwvY29kZWJsb2NrPjwvcD48cD5UaGUNCi11c2VCZWFuIHRhZyBlbmFibGVzIHlvdSB0byBjcmVhdGUgYSBiZWFuIGNhbGxlZCA8Y29kZXBoPmFTdHJpbmc8L2NvZGVwaD4gb2YNCi10eXBlIDxjb2RlcGg+U3RyaW5nPC9jb2RlcGg+LiBUaGVuIHdoZW4geW91IHVzZSBjb250ZW50IGFzc2lzdCwgdGhpcyBpcyByZWNvZ25pemVkDQotYXMgYSBkZWNsYXJlZCB2YXJpYWJsZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSB1c2UgY29udGVudCBhc3Npc3QgYWZ0ZXIgPGNvZGVwaD5hU3RyaW5nPC9jb2RlcGg+LA0KLWFzIGZvbGxvd3M6PC9wPjxwPiA8Y29kZWJsb2NrPiZsdDslIGFTdHJpbmcuICU+IDwvY29kZWJsb2NrPnRoZSBjb250ZW50IGFzc2lzdA0KLWxpc3Qgc2hvd3MgYXZhaWxhYmxlIG1ldGhvZHMuIFRoaXMgaXMgYmVjYXVzZSA8Y29kZXBoPmFTdHJpbmc8L2NvZGVwaD4gaGFzDQotYmVlbiBkZWNsYXJlZCBhcyBhIGJlYW4gb2YgdHlwZSBTdHJpbmcuPC9wPjxwPklmIHlvdSB1c2UgY29udGVudCBhc3Npc3QgYWZ0ZXINCi10aGUgPGNvZGVwaD5hPC9jb2RlcGg+LCBhcyBmb2xsb3dzOiA8Y29kZWJsb2NrPiZsdDslIGEgJT4gPC9jb2RlYmxvY2s+Y29udGVudA0KLWFzc2lzdCBrbm93cyB0aGF0IDxjb2RlcGg+YVN0cmluZzwvY29kZXBoPiBleGlzdHMsIGFuZCBpdCBpcyBzaG93biBpbiB0aGUNCi1jb250ZW50IGFzc2lzdCBsaXN0LjwvcD48L3NlY3Rpb24+DQotPC9jb25ib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwNS5kaXRhIj48bGlua3RleHQ+R2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZA0KLXRleHQgZWRpdG9yczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjQuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA2Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwNDY3OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDb250ZW50IGFzc2lzdCIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoZSBwbGFjZW1lbnQgb2YgdGhlIGN1cnNvciBpbiB0aGUgc291cmNlIGZpbGUgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50IGFzc2lzdCB0byBvZmZlciBzdWdnZXN0aW9ucyBmb3IgY29tcGxldGlvbi4iIC8+Ci08bWV0YSBjb250ZW50PSJjb250ZW50IGFzc2lzdGFuY2UsIG92ZXJ2aWV3LCBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycywgY29udGVudCBhc3Npc3RhbmNlIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iY29udGVudCBhc3Npc3RhbmNlLCBvdmVydmlldywgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMsIGNvbnRlbnQgYXNzaXN0YW5jZSIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwNS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3NyY2VkdDAwNiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNvbnRlbnQgYXNzaXN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjc3JjZWR0MDA2Ij48YSBuYW1lPSJjc3JjZWR0MDA2Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Db250ZW50IGFzc2lzdDwvaDE+Ci0KLQotCi08ZGl2PjxwPkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yCi1maW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IKLWluIHRoZSBzb3VyY2UgZmlsZSBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHRvIG9mZmVyIHN1Z2dlc3Rpb25zCi1mb3IgY29tcGxldGlvbi48L3A+Ci0KLTxwPk1vc3Qgb2YgdGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGhhdmUgY29udGVudCBhc3Npc3QuIEZvciBhIGxpc3Qgb2YKLWVkaXRvcnMgdGhhdCBoYXZlIGNvbnRlbnQgYXNzaXN0LCBzZWUgPGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlczwvYT4uIEZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2V0IGNvbnRlbnQKLWFzc2lzdGFuY2UsIHNlZSA8YSBocmVmPSJ0c3JjZWR0MDA1Lmh0bWwiPkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlIGluIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC9hPjwvcD4KLQotPHA+VGhlIHNlY3Rpb25zIGJlbG93IGRlc2NyaWJlIHNwZWNpZmljcyBvZiBIVE1MIGNvbnRlbnQgYXNzaXN0LCBKYXZhU2NyaXB04oSiIGNvbnRlbnQKLWFzc2lzdCwgYW5kIEpTUCBjb250ZW50IGFzc2lzdC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5IVE1MIGNvbnRlbnQgYXNzaXN0PC9oND48cD5IVE1MIGlzIGZsZXhpYmxlIGluIHRoYXQgc29tZQotSFRNTCBlbGVtZW50cyBhbGxvdyBlbmQgdGFncyB0byBiZSBvcHRpb25hbGx5IG9taXR0ZWQsIHN1Y2ggYXMgPHNhbXAgY2xhc3M9ImNvZGVwaCI+UDwvc2FtcD4sIDxzYW1wIGNsYXNzPSJjb2RlcGgiPkRUPC9zYW1wPiwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+REQ8L3NhbXA+LCA8c2FtcCBjbGFzcz0iY29kZXBoIj5MSTwvc2FtcD4sIDxzYW1wIGNsYXNzPSJjb2RlcGgiPlRIRUFEPC9zYW1wPiwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+VFI8L3NhbXA+LCA8c2FtcCBjbGFzcz0iY29kZXBoIj5URDwvc2FtcD4sIDxzYW1wIGNsYXNzPSJjb2RlcGgiPlRIPC9zYW1wPiwKLWFuZCBzbyBvbi4gT3RoZXIgSFRNTCBlbGVtZW50cyB0aGF0IGFyZSBkZWZpbmVkIHRvIGhhdmUgbm8gY29udGVudCBtYXkgcmVxdWlyZQotdGhlIGVuZCB0YWcgYWx3YXlzIGJlIG9taXR0ZWQsIHN1Y2ggYXMgPHNhbXAgY2xhc3M9ImNvZGVwaCI+QlI8L3NhbXA+LCA8c2FtcCBjbGFzcz0iY29kZXBoIj5IUjwvc2FtcD4sIDxzYW1wIGNsYXNzPSJjb2RlcGgiPkxJTks8L3NhbXA+LCA8c2FtcCBjbGFzcz0iY29kZXBoIj5NRVRBPC9zYW1wPiwKLWFuZCA8c2FtcCBjbGFzcz0iY29kZXBoIj5JTUc8L3NhbXA+LiBUaGlzIGZsZXhpYmlsaXR5IG1ha2VzIHRoZSBjb250ZW50IGFzc2lzdCBmdW5jdGlvbgotd2l0aGluIHRoZSBIVE1MIHNvdXJjZSBwYWdlIGVkaXRvciBsZXNzIHByZWNpc2UgdGhhbiBpdCBtaWdodCBiZSB3aXRoIGEgbW9yZQotcmlnaWRseSBjb25zdHJhaW5lZCBtYXJrdXAgbGFuZ3VhZ2UuPC9wPgotPHA+SFRNTCBjb250ZW50IGFzc2lzdCBpcyBtb3N0IGJlbmVmaWNpYWwKLXdoZW4geW91IG5lZWQgdG8gY29tcGxldGUgYSB0YWcgbmFtZSwgYWRkIGFuIGF0dHJpYnV0ZSBuYW1lLXZhbHVlIHBhaXIgd2l0aGluCi1hIHN0YXJ0IHRhZywgb3Igc2VsZWN0IGZyb20gYW4gZW51bWVyYXRlZCBsaXN0IG9mIGF0dHJpYnV0ZSB2YWx1ZXMuPC9wPgotPHA+QWx0aG91Z2gKLWNvbnRlbnQgYXNzaXN0IG9ubHkgc2hvd3MgYXR0cmlidXRlIG5hbWVzIHRoYXQgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIHNwZWNpZmllZAotaW4gYSBzdGFydCB0YWcsIGl0IGRvZXMgbm90IHRha2UgaW50byBhY2NvdW50IGdyYW1tYXIgY29uc3RyYWludHMgZm9yIHRhZ3MuCi1Gb3IgZXhhbXBsZSwgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPkhFQUQ8L3NhbXA+IGVsZW1lbnQgaW4gSFRNTCBvbmx5IHBlcm1pdHMgemVybyBvcgotb25lIG9jY3VycmVuY2VzIG9mIGEgPHNhbXAgY2xhc3M9ImNvZGVwaCI+VElUTEU8L3NhbXA+IHRhZyBpbiBpdHMgY29udGVudC4gSWYgeW91IHByb21wdAotZm9yIGNvbnRlbnQgYXNzaXN0IHdpdGhpbiBhIDxzYW1wIGNsYXNzPSJjb2RlcGgiPkhFQUQ8L3NhbXA+IGNvbnRlbnQgdGhhdCBhbHJlYWR5IGNvbnRhaW5zCi1hIDxzYW1wIGNsYXNzPSJjb2RlcGgiPlRJVExFPC9zYW1wPiB0YWcsIGNvbnRlbnQgYXNzaXN0IHdpbGwgc3RpbGwgc2hvdyA8c2FtcCBjbGFzcz0iY29kZXBoIj5USVRMRTwvc2FtcD4gaW4KLWl0cyBwcm9wb3NhbCBsaXN0LjwvcD4KLTxwPkhvd2V2ZXIsIGlmIGFuIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBhY2NvcmRpbmcgdG8KLXRoZSBEVEQvU2NoZW1hLCB0aGF0IGF0dHJpYnV0ZSB3aWxsIHNob3cgdXAgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdCwgd2l0aCBhCi15ZWxsb3cgY2lyY2xlIGluZGljYXRvciBvbiBpdHMgaWNvbi48L3A+Ci08cD5JZiB5b3VyIGN1cnNvciBpcyBpbiBhIHBvc2l0aW9uCi13aGVyZSBjb250ZW50IGFzc2lzdCBpcyBhdmFpbGFibGUsIGEgcG9wLXVwIGxpc3Qgb2YgYXZhaWxhYmxlIGNob2ljZXMgaXMgZGlzcGxheWVkLgotVGhlIGxpc3QgaXMgYmFzZWQgb24gdGhlIGNvbnRleHQuIEZvciBleGFtcGxlLCBpZiB5b3UgdXNlIGNvbnRlbnQgYXNzaXN0IGRpcmVjdGx5Ci1hZnRlciBhbiBvcGVuaW5nIHBhcmFncmFwaCB0YWcgKDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDtwJmd0Ozwvc2FtcD4pICwgdGhlIGZpcnN0IGl0ZW0KLWluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0IHdpbGwgYmUgdGhlIGNvcnJlc3BvbmRpbmcgY2xvc2luZyBwYXJhZ3JhcGggKDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDsvcCZndDs8L3NhbXA+KQotdGFnLjwvcD4KLTxwPlRoZSBjb250ZW50IGFzc2lzdCBsaXN0IGRpc3BsYXlzIGFsbCBhdmFpbGFibGUgdGFncyBmb3IgdGhlIGN1cnJlbnQKLWN1cnNvciBwb3NpdGlvbiwgaW5jbHVkaW5nIHRlbXBsYXRlcy4gVGhlIHBpY3R1cmUgYmVsb3cgc2hvd3MgdGhlIGRlZmF1bHQKLWNvbnRlbnQgYXNzaXN0IGxpc3QgZm9yIGEgcGFyYWdyYXBoIHRhZyBleGFtcGxlOjxiciAvPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmNvbnRhc3MuZ2lmIiBhbHQ9IkhUTUwgQ29udGVudCBhc3Npc3QiIC8+PGJyIC8+PC9wPgotPHA+VGFnIHByb3Bvc2FscwotYXJlIGxpc3RlZCBhbHBoYWJldGljYWxseS4gSWYgeW91IHR5cGUgYSA8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7PC9zYW1wPiAodG8gYmVnaW4gYQotbmV3IHRhZykgYmVmb3JlIHByb21wdGluZyBmb3IgY29udGVudCBhc3Npc3QsIGFuZCBiZWdpbiB0eXBpbmcgdGhlIGZpcnN0IG9uZQotb3IgdHdvIGxldHRlcnMgb2YgdGhlIHRhZyB0aGF0IHlvdSB3YW50IHRvIGFkZCwgdGhlIHByb3Bvc2FsIGxpc3QgYXV0b21hdGljYWxseQotcmVmcmVzaGVzIHRvIHJlZmxlY3QgcHJvcG9zYWxzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4geW91IGhhdmUgdHlwZWQuIElmIHlvdQotZG8gbm90IHR5cGUgYSA8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7PC9zYW1wPiBiZWZvcmUgcHJvbXB0aW5nIGZvciBjb250ZW50IGFzc2lzdCwgeW91Ci1jYW4gY2xpY2sgd2l0aGluIHRoZSBwcm9wb3NhbCBsaXN0IGFuZCB0aGVuIHR5cGUgdGhlIGxldHRlciB0aGF0IHRoZSB0YWcgYmVnaW5zCi13aXRoLCB0byByZWR1Y2UgKHNvbWV3aGF0KSB0aGUgYW1vdW50IG9mIHNjcm9sbGluZyB0byBsb2NhdGUgdGhlIGRlc2lyZWQgdGFnLjwvcD4KLTxwPkFzCi15b3UgdHlwZSB0aGUgZmlyc3Qgb25lIG9yIHR3byBsZXR0ZXJzIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZXMgb3IgZW51bWVyYXRlZAotYXR0cmlidXRlIHZhbHVlcyB0aGF0IHlvdSB3YW50IHRvIGFkZCB0byBhIHRhZywgdGhlIGxpc3QgYXV0b21hdGljYWxseSByZWZyZXNoZXMKLXRvIHJlZmxlY3QgcHJvcG9zYWxzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4geW91IGhhdmUgdHlwZWQuPC9wPgotPGRpdiBjbGFzcz0icmVzdHJpY3Rpb24iPjxzcGFuIGNsYXNzPSJyZXN0cmljdGlvbnRpdGxlIj5SZXN0cmljdGlvbjo8L3NwYW4+IDxpbWcgc3JjPSIuLi9pbWFnZXMvbmxpbnV4LmdpZiIgYWx0PSJGb3IgTGludXguIiAvPiBXaGVuIHVzaW5nIExpbnV4IChNb3RpZgotb3IgR1RLKSBhbmQgYSBEQkNTIGxvY2FsZSwgZG91YmxlLWNsaWNraW5nIG9uIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0IGNhbgotc29tZXRpbWVzIGNhdXNlIHRoZSBKYXZh4oSiIFZNIHRvIHRlcm1pbmF0ZS4gSW5zdGVhZCBvZiBkb3VibGUtY2xpY2tpbmcKLW9uIHRoZSBsaXN0LCB1c2UgdGhlIGFycm93cyBhbmQgRW50ZXIga2V5cyB0byBtYWtlIHRoZSBzZWxlY3Rpb24gZnJvbSB0aGUKLWxpc3QuPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkpTUCBjb250ZW50IGFzc2lzdDwvaDQ+PHA+WW91IGhhdmUgbWFueSBvcHRpb25zIGZvciBlbWJlZGRpbmcgSmF2YSBhbmQKLUhUTUwgY29kZSBpbiB5b3VyIEpTUCBwYWdlcyBieSB1c2luZyBjb250ZW50IGFzc2lzdC48L3A+Ci08cD5BbGwgb2YgdGhlIEpTUAotdGFncyBhcmUgaW5jbHVkZWQgYm90aCBpbiB0aGUgdGVtcGxhdGUgbGlzdCBhbmQgaW4gWE1MIGZvcm1hdCAoZm9yIGV4YW1wbGUsIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDtqc3A6ZXhwcmVzc2lvbiZndDs8L3NhbXA+KS4KLVRvIGFkZCBKU1Agc2NyaXB0bGV0IHRhZ3MsIGZvciBleGFtcGxlLCBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGFwcHJvcHJpYXRlCi1wb3NpdGlvbiBpbiB0aGUgZmlsZSBhbmQgcHJlc3MgQ3RybCtTcGFjZSB0byB1c2UgY29udGVudCBhc3Npc3QuIFNlbGVjdCA8aW1nIHNyYz0iLi4vaW1hZ2VzL25tYWNzY3JwLmdpZiIgYWx0PSJKU1Agc2NyaXB0bGV0IGNvbnRlbnQgYXNzaXN0IiAvPiBmcm9tIHRoZSBwcm9wb3NhbCBsaXN0IHRvIGluc2VydCA8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7JSAlJmd0Ozwvc2FtcD4gIGluIHRoZQotZG9jdW1lbnQuPC9wPgotPGRpdiBjbGFzcz0icCI+U2NyaXB0bGV0cyBhcmUgaW5zZXJ0ZWQgaW4gYSB0YWcgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0OyUgJSZndDs8L3NhbXA+LgotRm9yIGV4YW1wbGU6IDxwcmU+Jmx0OyUgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgJSZndDs8L3ByZT4KLTwvZGl2PgotPHA+VGhpcwotZXhhbXBsZSB3aWxsIGV2YWx1YXRlIHRoZSBKYXZhIHN0YXRlbWVudCB0byBnZXQgdGhlIGN1cnJlbnQgdGltZSBpbgotbWlsbGlzZWNvbmRzLjwvcD4KLTxkaXYgY2xhc3M9InAiPlRvIGhhdmUgdGhlIHJlc3VsdCBvZiB0aGUgc3RhdGVtZW50IGluc2VydGVkIGluIHRoZSBmaWxlLAotcHV0IGFuIGVxdWFscyBzaWduICg9KSBpbiB0aGUgZnJvbnQgb2YgdGhlIHN0YXRlbWVudC4gRm9yIGV4YW1wbGU6IDxwcmU+Jmx0O2ImZ3Q7VGhpcyBpcyB0aGUgdGltZSA6ICZsdDslPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSUmZ3Q7Jmx0Oy9iJmd0OzwvcHJlPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJwIj5XaGVuIHlvdSBhcmUgd2l0aGluIGEgc2NyaXB0bGV0IHlvdSBhcmUgd3JpdGluZyBwdXJlIEphdmEgY29kZS4KLVRoZXJlZm9yZSwgY29udGVudCBhc3Npc3Qgd29ya3MgZXhhY3RseSB0aGUgc2FtZSBhcyBpdCBkb2VzIGZvciB0aGUgSmF2YSBlZGl0b3IuCi1Gb3IgZXhhbXBsZSwgaWYgeW91IHJlcXVlc3QgY29udGVudCBhc3Npc3QgYWZ0ZXIgPHNhbXAgY2xhc3M9ImNvZGVwaCI+U3lzdGVtPC9zYW1wPiwKLWNvbnRlbnQgYXNzaXN0IGRpc3BsYXlzIGEgbGlzdCBvZiBtZXRob2RzLiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSmF2YSBjb250ZW50IGFzc2lzdCB3b3JrcyBvbmx5IGluIGEgV2ViCi1wcm9qZWN0LCBiZWNhdXNlIGl0IHJlcXVpcmVzIGEgYnVpbGRwYXRoIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIEphdmEgY2xhc3Nlcy48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+VGhlcmUKLWFyZSBhbHNvIHNwZWNpYWwgdGFncyBzdWNoIGFzIHVzZUJlYW4uIEZvciBleGFtcGxlOiA8cHJlPiZsdDtqc3A6dXNlQmVhbiBpZD0idXNlQmVhbiIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciLyZndDs8L3ByZT4KLTwvZGl2PgotPHA+VGhlCi11c2VCZWFuIHRhZyBlbmFibGVzIHlvdSB0byBjcmVhdGUgYSBiZWFuIGNhbGxlZCA8c2FtcCBjbGFzcz0iY29kZXBoIj5hU3RyaW5nPC9zYW1wPiBvZgotdHlwZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5TdHJpbmc8L3NhbXA+LiBUaGVuIHdoZW4geW91IHVzZSBjb250ZW50IGFzc2lzdCwgdGhpcyBpcyByZWNvZ25pemVkCi1hcyBhIGRlY2xhcmVkIHZhcmlhYmxlLiBGb3IgZXhhbXBsZSwgaWYgeW91IHVzZSBjb250ZW50IGFzc2lzdCBhZnRlciA8c2FtcCBjbGFzcz0iY29kZXBoIj5hU3RyaW5nPC9zYW1wPiwKLWFzIGZvbGxvd3M6PC9wPgotPGRpdiBjbGFzcz0icCI+IDxwcmU+Jmx0OyUgYVN0cmluZy4gJSZndDsgPC9wcmU+Ci10aGUgY29udGVudCBhc3Npc3QKLWxpc3Qgc2hvd3MgYXZhaWxhYmxlIG1ldGhvZHMuIFRoaXMgaXMgYmVjYXVzZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5hU3RyaW5nPC9zYW1wPiBoYXMKLWJlZW4gZGVjbGFyZWQgYXMgYSBiZWFuIG9mIHR5cGUgU3RyaW5nLjwvZGl2PgotPGRpdiBjbGFzcz0icCI+SWYgeW91IHVzZSBjb250ZW50IGFzc2lzdCBhZnRlcgotdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmE8L3NhbXA+LCBhcyBmb2xsb3dzOiA8cHJlPiZsdDslIGEgJSZndDsgPC9wcmU+Ci1jb250ZW50Ci1hc3Npc3Qga25vd3MgdGhhdCA8c2FtcCBjbGFzcz0iY29kZXBoIj5hU3RyaW5nPC9zYW1wPiBleGlzdHMsIGFuZCBpdCBpcyBzaG93biBpbiB0aGUKLWNvbnRlbnQgYXNzaXN0IGxpc3QuPC9kaXY+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDUuaHRtbCIgdGl0bGU9IlRvIGdldCBoZWxwIGluIGFkZGluZyBtYXJrdXAgdG8gYSBmaWxlLCB5b3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIENvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIj5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkCi10ZXh0IGVkaXRvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjQuaHRtbCIgdGl0bGU9IkhUTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jdmFsaWRhdGUuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3ZhbGlkYXRlLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MzBlNzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jdmFsaWRhdGUuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gIi4uXGR0ZFxjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImNzcmNlZHQwMDEiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNvdXJjZSBhbmQgYmF0Y2ggdmFsaWRhdGlvbjwvdGl0bGU+DQotPHNob3J0ZGVzYz48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9ImN2YWxpZGF0ZXwxfHZhbGlkYXRpb25zb3VyY2V2c2JhdGNoIiBzdGF0dXM9ImNoYW5nZWQiPnZhbGlkYXRpb248aW5kZXh0ZXJtPnNvdXJjZQ0KLXZlcnN1cyBiYXRjaDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UaGVyZSBhcmUgdHdvIHR5cGVzIG9mIHZhbGlkYXRpb24gdGhhdCBjYW4gb2NjdXIgd2hlbiB5b3UgYXJlIHdvcmtpbmcgd2l0aA0KLXNvdXJjZSBmaWxlcyBpbiBhIHN0cnVjdHVyZWQgc291cmNlIGVkaXRvcjogc291cmNlIHZhbGlkYXRpb24gYW5kIGJhdGNoIHZhbGlkYXRpb24uIDwvcD4NCi08cD5Tb3VyY2UgdmFsaWRhdGlvbiBvY2N1cnMgYXMgeW91IHR5cGUgeW91ciBjb2RlOyB0aGlzIHZhbGlkYXRpb24gcmVmbGVjdHMNCi10aGUgInVuc2F2ZWQiIGFuZCAidW5idWlsdCIgY29udGVudHMgb2YgdGhlIHNvdXJjZSB5b3UgYXJlIGVkaXRpbmcuIEZvciBleGFtcGxlLA0KLWlmIHlvdSB3ZXJlIHRvIHR5cGUgdGhlIGZvbGxvd2luZyBjb2RlIGluIGEgSlNQIGVkaXRvcjo8bGluZXM+PGNvZGVwaD4mbHQ7Zm9vOmJhcj48L2NvZGVwaD48L2xpbmVzPndoZXJlIDxjb2RlcGg+Zm9vOmJhcjwvY29kZXBoPmlzDQotYSB0YWcgdGhhdCBkb2VzIG5vdCBleGlzdCwgdGhlIHByb2JsZW0gd291bGQgYmUgZGlzY292ZXJlZCBpbW1lZGlhdGVseSBhbmQNCi13b3VsZCBhcHBlYXIgdW5kZXJsaW5lZCBpbiB0aGUgZWRpdG9yLiBUaGUgYWR2YW50YWdlIG9mIHRoaXMgdHlwZSBvZiB2YWxpZGF0aW9uDQotaXMgdGhhdCBpdCBjYW4gYWxlcnQgeW91IHRvIGVycm9ycyBpbnN0YW50bHkuPG5vdGU+VG8gdHVybiBzb3VyY2UgdmFsaWRhdGlvbg0KLW9uIChvciBvZmYpIGZvciBhbGwgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMsIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD48dWljb250cm9sPkdlbmVyYWw8L3VpY29udHJvbD48dWljb250cm9sPkVkaXRvcnM8L3VpY29udHJvbD4NCi08dWljb250cm9sPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3JzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kIGNoZWNrIChvcg0KLXVuY2hlY2spIDxiPlJlcG9ydCBwcm9ibGVtcyBhcyB5b3UgdHlwZTwvYj4uPC9ub3RlPjwvcD4NCi08cD5CYXRjaCB2YWxpZGF0aW9uIG9jY3VycyBvbiBzYXZlZCBmaWxlcy4gSXQgY2FuIGNhdGNoIGJ1aWxkIHByb2Nlc3MgZXJyb3JzDQotYW5kIG90aGVyIGVycm9ycyB0aGF0IHRoZSBzb3VyY2UgdmFsaWRhdG9yIGNhbm5vdC4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91DQotdHlwZWQgdGhlIGZvbGxvd2luZyBpbiBhIEpTUCBlZGl0b3I6PGxpbmVzPg0KLTxjb2RlcGg+Jmx0OyVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIlPg0KLSZsdDslQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiJT48L2NvZGVwaD48L2xpbmVzPkluDQotdGhpcyBleGFtcGxlLCB0aGUgc2FtZSBwcmVmaXggaXMgdXNlZCB0d2ljZS4gVGhpcyB3b3VsZCBwcm9tcHQgdGhlIGJhdGNoIHZhbGlkYXRvcg0KLXRvIHRyaWdnZXIgbWFya2VycyBhbmQgdG8gZ2VuZXJhdGUgYnVpbGQgd2FybmluZ3MgaW4gdGhlIFByb2JsZW1zIHZpZXcgYW5kDQotaW4gdGhlIE5hdmlnYXRvci4gPC9wPg0KLTxwPkJhdGNoIHZhbGlkYXRpb24gY2FuIHVuY292ZXIgZXJyb3JzIGluIG11bHRpcGxlIGZpbGVzIGF0IG9uY2UgYW5kIGdpdmUNCi15b3UgYSBjb21wcmVoZW5zaXZlIHZpZXcgb2Ygd2hlcmUgcHJvYmxlbWF0aWMgY29kZSBjYW4gYmUgZm91bmQgaW4geW91ciBwcm9qZWN0Lg0KLU1vcmVvdmVyLCB5b3UgZG8gbm90IG5lZWQgdG8gb3BlbiBmaWxlcyBpbiBhbiBlZGl0b3IgdG8gcnVuIGJhdGNoIHZhbGlkYXRpb24uDQotVG8gcnVuIGJhdGNoIHZhbGlkYXRpb24gb24gc3BlY2lmaWMgZmlsZXMsIHNlbGVjdCBhbmQgcmlnaHQgY2xpY2sgdGhlIGZpbGVzDQotaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgYW5kIHRoZW4gc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPlZhbGlkYXRlPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gZnJvbSB0aGUgcG9wdXAgbWVudS48L3A+DQotPG5vdGU+VG8gc2V0IHByZWZlcmVuY2VzIGZvciBiYXRjaCB2YWxpZGF0aW9uLCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD4NCi08dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+PHVpY29udHJvbD5WYWxpZGF0aW9uPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT48L25vdGU+DQotPC9jb25ib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3ZhbGlkYXRlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2N2YWxpZGF0ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzk2MjEyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3ZhbGlkYXRlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTb3VyY2UgYW5kIGJhdGNoIHZhbGlkYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IiIgLz4KLTxtZXRhIGNvbnRlbnQ9InZhbGlkYXRpb24sIHNvdXJjZSB2ZXJzdXMgYmF0Y2giIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJ2YWxpZGF0aW9uLCBzb3VyY2UgdmVyc3VzIGJhdGNoIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNzcmNlZHQwMDEiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Tb3VyY2UgYW5kIGJhdGNoIHZhbGlkYXRpb248L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNzcmNlZHQwMDEiPjxhIG5hbWU9ImNzcmNlZHQwMDEiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNvdXJjZSBhbmQgYmF0Y2ggdmFsaWRhdGlvbjwvaDE+Ci0KLQotCi08ZGl2PjxwIC8+Ci0KLTxwPlRoZXJlIGFyZSB0d28gdHlwZXMgb2YgdmFsaWRhdGlvbiB0aGF0IGNhbiBvY2N1ciB3aGVuIHlvdSBhcmUgd29ya2luZyB3aXRoCi1zb3VyY2UgZmlsZXMgaW4gYSBzdHJ1Y3R1cmVkIHNvdXJjZSBlZGl0b3I6IHNvdXJjZSB2YWxpZGF0aW9uIGFuZCBiYXRjaCB2YWxpZGF0aW9uLiA8L3A+Ci0KLTxkaXYgY2xhc3M9InAiPlNvdXJjZSB2YWxpZGF0aW9uIG9jY3VycyBhcyB5b3UgdHlwZSB5b3VyIGNvZGU7IHRoaXMgdmFsaWRhdGlvbiByZWZsZWN0cwotdGhlICJ1bnNhdmVkIiBhbmQgInVuYnVpbHQiIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgeW91IGFyZSBlZGl0aW5nLiBGb3IgZXhhbXBsZSwKLWlmIHlvdSB3ZXJlIHRvIHR5cGUgdGhlIGZvbGxvd2luZyBjb2RlIGluIGEgSlNQIGVkaXRvcjo8cD48c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7Zm9vOmJhciZndDs8L3NhbXA+PC9wPgotd2hlcmUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Zm9vOmJhcjwvc2FtcD5pcwotYSB0YWcgdGhhdCBkb2VzIG5vdCBleGlzdCwgdGhlIHByb2JsZW0gd291bGQgYmUgZGlzY292ZXJlZCBpbW1lZGlhdGVseSBhbmQKLXdvdWxkIGFwcGVhciB1bmRlcmxpbmVkIGluIHRoZSBlZGl0b3IuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyB0eXBlIG9mIHZhbGlkYXRpb24KLWlzIHRoYXQgaXQgY2FuIGFsZXJ0IHlvdSB0byBlcnJvcnMgaW5zdGFudGx5LjxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUbyB0dXJuIHNvdXJjZSB2YWxpZGF0aW9uCi1vbiAob3Igb2ZmKSBmb3IgYWxsIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYWw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yczwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3JzPC9zcGFuPjwvc3Bhbj4gYW5kIGNoZWNrIChvcgotdW5jaGVjaykgPHN0cm9uZz5SZXBvcnQgcHJvYmxlbXMgYXMgeW91IHR5cGU8L3N0cm9uZz4uPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0icCI+QmF0Y2ggdmFsaWRhdGlvbiBvY2N1cnMgb24gc2F2ZWQgZmlsZXMuIEl0IGNhbiBjYXRjaCBidWlsZCBwcm9jZXNzIGVycm9ycwotYW5kIG90aGVyIGVycm9ycyB0aGF0IHRoZSBzb3VyY2UgdmFsaWRhdG9yIGNhbm5vdC4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91Ci10eXBlZCB0aGUgZm9sbG93aW5nIGluIGEgSlNQIGVkaXRvcjo8cD48YnIgLz4KLTxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDslQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiJSZndDs8YnIgLz4KLSZsdDslQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiJSZndDs8L3NhbXA+PC9wPgotSW4KLXRoaXMgZXhhbXBsZSwgdGhlIHNhbWUgcHJlZml4IGlzIHVzZWQgdHdpY2UuIFRoaXMgd291bGQgcHJvbXB0IHRoZSBiYXRjaCB2YWxpZGF0b3IKLXRvIHRyaWdnZXIgbWFya2VycyBhbmQgdG8gZ2VuZXJhdGUgYnVpbGQgd2FybmluZ3MgaW4gdGhlIFByb2JsZW1zIHZpZXcgYW5kCi1pbiB0aGUgTmF2aWdhdG9yLiA8L2Rpdj4KLQotPHA+QmF0Y2ggdmFsaWRhdGlvbiBjYW4gdW5jb3ZlciBlcnJvcnMgaW4gbXVsdGlwbGUgZmlsZXMgYXQgb25jZSBhbmQgZ2l2ZQoteW91IGEgY29tcHJlaGVuc2l2ZSB2aWV3IG9mIHdoZXJlIHByb2JsZW1hdGljIGNvZGUgY2FuIGJlIGZvdW5kIGluIHlvdXIgcHJvamVjdC4KLU1vcmVvdmVyLCB5b3UgZG8gbm90IG5lZWQgdG8gb3BlbiBmaWxlcyBpbiBhbiBlZGl0b3IgdG8gcnVuIGJhdGNoIHZhbGlkYXRpb24uCi1UbyBydW4gYmF0Y2ggdmFsaWRhdGlvbiBvbiBzcGVjaWZpYyBmaWxlcywgc2VsZWN0IGFuZCByaWdodCBjbGljayB0aGUgZmlsZXMKLWluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRlPC9zcGFuPgotPC9zcGFuPiBmcm9tIHRoZSBwb3B1cCBtZW51LjwvcD4KLQotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRvIHNldCBwcmVmZXJlbmNlcyBmb3IgYmF0Y2ggdmFsaWRhdGlvbiwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0aW9uPC9zcGFuPjwvc3Bhbj48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdGNvbnRlbnR0eXBlLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3Rjb250ZW50dHlwZS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjNkMWUxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdGNvbnRlbnR0eXBlLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0Y29udGVudHR5cGUiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFzc29jaWF0aW5nIGVkaXRvcnMgd2l0aCBhZGRpdGlvbmFsIGZpbGVzIHR5cGVzPC90aXRsZT4NCi08c2hvcnRkZXNjPjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmNvbnRlbnQgdHlwZXM8aW5kZXh0ZXJtPm1hcHBpbmcgZmlsZSBleHRlbnNpb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5maWxlIGV4dGVuc2lvbnM8aW5kZXh0ZXJtPm1hcHBpbmcgY29udGVudCB0eXBlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+ZmlsZSB0eXBlczxpbmRleHRlcm0+ZWRpdG9yczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+WW91IGNhbiBhc3NvY2lhdGUgY2VydGFpbiBlZGl0b3JzIHdpdGggYSBmaWxlIHR5cGUgYnkgY2xpY2tpbmcNCi1vbiA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+PHVpY29udHJvbD5FZGl0b3JzPC91aWNvbnRyb2w+PHVpY29udHJvbD5GaWxlDQotQXNzb2NpYXRpb248L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiBhbmQgc2V0dGluZyB1cCB0aGUgYXNzb2NpYXRpb25zIGluIHRoZQ0KLUZpbGUgQXNzb2NpYXRpb25zIFdpbmRvdy48L3A+PHA+U29tZSBFY2xpcHNlLWJhc2VkIGVkaXRvcnMsIGhvd2V2ZXIsIHdpbGwNCi1vbmx5IHJlY29nbml6ZSBhIGZpbGUgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlLiBDb25zZXF1ZW50bHksIGlmDQoteW91IHdhbnQgdG8gYXNzb2NpYXRlIGFuIGFkZGl0aW9uYWwgZmlsZSB0eXBlIHdpdGggc29tZSBlZGl0b3JzLCB5b3UgbWF5IGhhdmUNCi10byBmaXJzdCBtYXAgdGhlIGNvbnRlbnQgdHlwZSB3aXRoIGl0cyBmaWxlIGV4dGVuc2lvbi4gVG8gbWFwIGEgY29udGVudCB0eXBlDQotd2l0aCBhIGZpbGUgZXh0ZW5zaW9uLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOiA8L3A+PG9sPg0KLTxsaT5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPkdlbmVyYWw8L3VpY29udHJvbD4NCi08dWljb250cm9sPkNvbnRlbnQgVHlwZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi4gVGhlIENvbnRlbnQgVHlwZSB3aW5kb3cNCi1hcHBlYXJzLiA8L2xpPg0KLTxsaT5TZWxlY3QgYSBjb250ZW50IHR5cGUgaW4gdGhlIENvbnRlbnQgVHlwZSB3aW5kb3csIGFuZCB0aGVuIHNlbGVjdCA8Yj5BZGQ8L2I+IC4NCi1UaGUgRGVmaW5lIGEgTmV3IEZpbGUgVHlwZSB3aW5kb3cgYXBwZWFycy48L2xpPg0KLTxsaT5UeXBlIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHR5cGUsIGFuZCB0aGVuIGNsaWNrIDxiPk9LPC9iPi48L2xpPg0KLTwvb2w+PC9jb250ZXh0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdGNvbnRlbnR0eXBlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3Rjb250ZW50dHlwZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWYxODYxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdGNvbnRlbnR0eXBlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBc3NvY2lhdGluZyBlZGl0b3JzIHdpdGggYWRkaXRpb25hbCBmaWxlcyB0eXBlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSIiIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIiAvPgotPG1ldGEgY29udGVudD0iY29udGVudCB0eXBlcywgbWFwcGluZyBmaWxlIGV4dGVuc2lvbnMsIGZpbGUgZXh0ZW5zaW9ucywgbWFwcGluZyBjb250ZW50IHR5cGVzLCBmaWxlIHR5cGVzLCBlZGl0b3JzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iY29udGVudCB0eXBlcywgbWFwcGluZyBmaWxlIGV4dGVuc2lvbnMsIGZpbGUgZXh0ZW5zaW9ucywgbWFwcGluZyBjb250ZW50IHR5cGVzLCBmaWxlIHR5cGVzLCBlZGl0b3JzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0Y29udGVudHR5cGUiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Bc3NvY2lhdGluZyBlZGl0b3JzIHdpdGggYWRkaXRpb25hbCBmaWxlcyB0eXBlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGNvbnRlbnR0eXBlIj48YSBuYW1lPSJ0Y29udGVudHR5cGUiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFzc29jaWF0aW5nIGVkaXRvcnMgd2l0aCBhZGRpdGlvbmFsIGZpbGVzIHR5cGVzPC9oMT4KLQotCi0KLTxkaXY+PHAgLz4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WW91IGNhbiBhc3NvY2lhdGUgY2VydGFpbiBlZGl0b3JzIHdpdGggYSBmaWxlIHR5cGUgYnkgY2xpY2tpbmcKLW9uIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0b3JzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUKLUFzc29jaWF0aW9uPC9zcGFuPjwvc3Bhbj4gYW5kIHNldHRpbmcgdXAgdGhlIGFzc29jaWF0aW9ucyBpbiB0aGUKLUZpbGUgQXNzb2NpYXRpb25zIFdpbmRvdy48L3A+Ci08cD5Tb21lIEVjbGlwc2UtYmFzZWQgZWRpdG9ycywgaG93ZXZlciwgd2lsbAotb25seSByZWNvZ25pemUgYSBmaWxlIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS4gQ29uc2VxdWVudGx5LCBpZgoteW91IHdhbnQgdG8gYXNzb2NpYXRlIGFuIGFkZGl0aW9uYWwgZmlsZSB0eXBlIHdpdGggc29tZSBlZGl0b3JzLCB5b3UgbWF5IGhhdmUKLXRvIGZpcnN0IG1hcCB0aGUgY29udGVudCB0eXBlIHdpdGggaXRzIGZpbGUgZXh0ZW5zaW9uLiBUbyBtYXAgYSBjb250ZW50IHR5cGUKLXdpdGggYSBmaWxlIGV4dGVuc2lvbiwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczogPC9wPgotPG9sPgotPGxpPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYWw8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZW50IFR5cGVzPC9zcGFuPjwvc3Bhbj4uIFRoZSBDb250ZW50IFR5cGUgd2luZG93Ci1hcHBlYXJzLiA8L2xpPgotCi08bGk+U2VsZWN0IGEgY29udGVudCB0eXBlIGluIHRoZSBDb250ZW50IFR5cGUgd2luZG93LCBhbmQgdGhlbiBzZWxlY3QgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gLgotVGhlIERlZmluZSBhIE5ldyBGaWxlIFR5cGUgd2luZG93IGFwcGVhcnMuPC9saT4KLQotPGxpPlR5cGUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdHlwZSwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi48L2xpPgotCi08L29sPgotPC9kaXY+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmI3Yjk3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAwMCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldzwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08bmF2dGl0bGU+RWRpdGluZyBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXc8L25hdnRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgPHRlcm0+c3RydWN0dXJlZA0KLXRleHQgZWRpdG9yPC90ZXJtPi4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbg0KLXVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5tYXJrdXAgbGFuZ3VhZ2VzPGluZGV4dGVybT5lZGl0aW5nIHRleHQ8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPnRleHQ8aW5kZXh0ZXJtPmVkaXRpbmcgaW4gbWFya3VwIGxhbmd1YWdlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+SW4gYWRkaXRpb24gdG8gYmFzaWMgZWRpdGluZyB0YXNrcyBzdWNoIGFzIGFkZGluZywgbW9kaWZ5aW5nLCBhbmQNCi1kZWxldGluZyB0ZXh0LCB5b3UgY2FuIHBlcmZvcm0gdGhlIGZvbGxvd2luZyB0YXNrczo8L2NvbnRleHQ+DQotPHN0ZXBzLXVub3JkZXJlZD4NCi08c3RlcD48Y21kPjx4cmVmIGhyZWY9InRzcmNlZHQwMjUuZGl0YSIgdHlwZT0idGFzayI+U2V0IHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkDQotdGV4dCBlZGl0b3JzPC94cmVmPjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPjx4cmVmIGhyZWY9InRzcmNlZHQwMDUuZGl0YSIgdHlwZT0idGFzayI+R2V0IGNvbnRlbnQgYXNzaXN0YW5jZQ0KLWluIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC94cmVmPjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPjx4cmVmIGhyZWY9InRzcmNlZHQwMDcuZGl0YSIgdHlwZT0idGFzayI+U2VhcmNoIG9yIGZpbmQgdGV4dCB3aXRoaW4NCi1hIGZpbGU8L3hyZWY+PC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+PHhyZWYgaHJlZj0idHNyY2VkdDAxMC5kaXRhIiB0eXBlPSJ0YXNrIj5DaGVjayBzcGVsbGluZzwveHJlZj48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD48eHJlZiBocmVmPSJ0c3JjZWR0MDI3LmRpdGEiIHR5cGU9InRhc2siPkFkZCBvciByZW1vdmUgbWFya3VwIGxhbmd1YWdlDQotdGVtcGxhdGVzPC94cmVmPjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPjx4cmVmIGhyZWY9InRzcmNlZHQwMjYuZGl0YSIgdHlwZT0idGFzayI+RWRpdCB3aXRoIHNuaXBwZXRzPC94cmVmPjwvY21kPg0KLTwvc3RlcD4NCi08L3N0ZXBzLXVub3JkZXJlZD4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNi5kaXRhIj48bGlua3RleHQ+Q29udGVudCBhc3Npc3Q8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJjc3JjZWR0MDAxLmRpdGEiPjxsaW5rdGV4dD5TbmlwcGV0cyB2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNS5kaXRhIj48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwNS5kaXRhIj48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwNy5kaXRhIj48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxMC5kaXRhIj48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNy5kaXRhIj48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNi5kaXRhIj48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTQ4NjEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC4iIC8+Ci08bWV0YSBjb250ZW50PSJtYXJrdXAgbGFuZ3VhZ2VzLCBlZGl0aW5nIHRleHQsIHRleHQsIGVkaXRpbmcgaW4gbWFya3VwIGxhbmd1YWdlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9Im1hcmt1cCBsYW5ndWFnZXMsIGVkaXRpbmcgdGV4dCwgdGV4dCwgZWRpdGluZyBpbiBtYXJrdXAgbGFuZ3VhZ2VzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA2Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDEuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDA1Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxMC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI3Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjYuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDAwIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAwMCI+PGEgbmFtZT0idHNyY2VkdDAwMCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldzwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgPGRmbiBjbGFzcz0idGVybSI+c3RydWN0dXJlZAotdGV4dCBlZGl0b3I8L2Rmbj4uIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4KLXVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPkluIGFkZGl0aW9uIHRvIGJhc2ljIGVkaXRpbmcgdGFza3Mgc3VjaCBhcyBhZGRpbmcsIG1vZGlmeWluZywgYW5kCi1kZWxldGluZyB0ZXh0LCB5b3UgY2FuIHBlcmZvcm0gdGhlIGZvbGxvd2luZyB0YXNrczo8L2Rpdj4KLQotPHVsPgotPGxpPjxzcGFuPjxhIGhyZWY9InRzcmNlZHQwMjUuaHRtbCI+U2V0IHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvYT48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPjxhIGhyZWY9InRzcmNlZHQwMDUuaHRtbCI+R2V0IGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvYT48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPjxhIGhyZWY9InRzcmNlZHQwMDcuaHRtbCI+U2VhcmNoIG9yIGZpbmQgdGV4dCB3aXRoaW4gYSBmaWxlPC9hPjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+PGEgaHJlZj0idHNyY2VkdDAxMC5odG1sIj5DaGVjayBzcGVsbGluZzwvYT48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+PGEgaHJlZj0idHNyY2VkdDAyNy5odG1sIj5BZGQgb3IgcmVtb3ZlIG1hcmt1cCBsYW5ndWFnZSB0ZW1wbGF0ZXM8L2E+PC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj48YSBocmVmPSJ0c3JjZWR0MDI2Lmh0bWwiPkVkaXQgd2l0aCBzbmlwcGV0czwvYT48L3NwYW4+Ci08L2xpPgotCi08L3VsPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwCi1sYW5ndWFnZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDYuaHRtbCIgdGl0bGU9IkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoZSBwbGFjZW1lbnQgb2YgdGhlIGN1cnNvciBpbiB0aGUgc291cmNlIGZpbGUgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50IGFzc2lzdCB0byBvZmZlciBzdWdnZXN0aW9ucyBmb3IgY29tcGxldGlvbi4iPkNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDAxLmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIj5TbmlwcGV0cyB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjUuaHRtbCIgdGl0bGU9IiI+U2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDUuaHRtbCIgdGl0bGU9IlRvIGdldCBoZWxwIGluIGFkZGluZyBtYXJrdXAgdG8gYSBmaWxlLCB5b3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIENvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIj5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwNy5odG1sIiB0aXRsZT0iIj5TZWFyY2hpbmcgb3IgZmluZGluZyB0ZXh0IHdpdGhpbiBhIGZpbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTAuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGNoZWNrIHNwZWxsaW5nIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4iPkNoZWNraW5nIHNwZWxsaW5nPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI3Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBwcm92aWRlcyB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlIHRlbXBsYXRlcyAtIG92ZXJ2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI2Lmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiI+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAxLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDEuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEwMGM4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDEuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMDEiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgbWFya3VwIGxhbmd1YWdlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08bmF2dGl0bGU+U2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzPC9uYXZ0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIHNldCA8dGVybT5hbm5vdGF0aW9uIHByZWZlcmVuY2VzPC90ZXJtPiBmb3INCi1XZWIgYW5kIFhNTCBmaWxlcy4gVGhlIGFubm90YXRpb24gcHJlZmVyZW5jZXMgaW5jbHVkZSB3aGV0aGVyIHRvIGFuYWx5emUgdGhlDQotc3ludGFjdGljIHZhbGlkaXR5IG9mIHlvdXIgZmlsZSB3aGlsZSB5b3UgYXJlIHR5cGluZyBhbmQgd2hhdCBjb2xvcnMgdG8gdXNlDQotdG8gaGlnaGxpZ2h0IGVycm9ycywgd2FybmluZ3MsIHRhc2tzLCBzZWFyY2ggcmVzdWx0cywgYm9va21hcmtzLCBhbmQgb3RoZXINCi10ZXh0Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0idHNyY2VkdDAwMXwxfGFubm90YXRpb25wcmVmZXJlbmNlc21hcmt1cGxhbmd1YWdlc2V0dGluZ3MiDQotc3RhdHVzPSJjaGFuZ2VkIj5hbm5vdGF0aW9uczxpbmRleHRlcm0+bWFya3VwIGxhbmd1YWdlIHNldHRpbmdzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybSBrZXlyZWY9InRzcmNlZHQwMDF8MnxtYXJrdXBsYW5ndWFnZXNzZXR0aW5nYW5ub3RhdGlvbnByZWZlcmVuY2VzIg0KLXN0YXR1cz0ibmV3Ij5tYXJrdXAgbGFuZ3VhZ2VzPGluZGV4dGVybT5zZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD5CeSBkZWZhdWx0LCB3aGVuIHlvdSBlZGl0IGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvciwgeW91ciBzb3VyY2UNCi1jb2RlIGlzIHZhbGlkYXRlZCBhcyB5b3UgdHlwZSBpdCBpbi4gTGlrZSBvdGhlciBFY2xpcHNlLWJhc2VkIGVkaXRvcnMsIHRoZQ0KLXN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIGZsYWcgd2FybmluZ3MgYW5kIGVycm9ycyBpbiB0aGUNCi1zb3VyY2UgY29kZSBpbiB0aGUgZWRpdG9yIGFyZWEuIFRoZSB3YXJuaW5ncyBhbmQgZXJyb3JzIGFsc28gc2hvdyB1cCBpbiB0aGUNCi1UYXNrcyB2aWV3IHdoZW4geW91IHNhdmUgdGhlIGZpbGUuPC9wPjxub3RlPkhpZ2hsaWdodGluZyBpcyBmdWxseSBkeW5hbWljDQotd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHNlYXJjaCByZXN1bHRzLiBTZWFyY2ggcmVzdWx0cyBhcmUgaGlnaGxpZ2h0ZWQgYmFzZWQNCi11cG9uIHdoYXQgaGFzIGJlZW4gc2F2ZWQgdG8gZGlzay48L25vdGU+PG5vdGUgdHlwZT0idGlwIj5Zb3UgY2FuIGltcHJvdmUgYQ0KLXN0cnVjdHVyZWQgdGV4dCBlZGl0b3IncyBwZXJmb3JtYW5jZSBieSB0dXJuaW5nIG9mZiB0aGUgcmVhbC10aW1lIHZhbGlkYXRpb24uPC9ub3RlPjxwPlRvDQotc2V0IGFubm90YXRpb24gcHJlZmVyZW5jZXMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPiA8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+LjwvY21kPjxzdGVwcmVzdWx0PkEgUHJlZmVyZW5jZXMgd2luZG93IGFwcGVhcnMuPC9zdGVwcmVzdWx0Pg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcmVmZXJlbmNlcyB3aW5kb3csIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+RWRpdG9yczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOjwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+VG8gdHVybiBvZmYgcmVhbC10aW1lIHN5bnRheCB2YWxpZGF0aW9uLCBjbGljayA8dWljb250cm9sPlN0cnVjdHVyZWQNCi1UZXh0IEVkaXRvcjwvdWljb250cm9sPiBhbmQgdW5jaGVjayB0aGUgPHVpY29udHJvbD5BbmFseXplIGFubm90YXRpb25zIHdoaWxlDQotdHlwaW5nPC91aWNvbnRyb2w+IGJveC48L2Nob2ljZT4NCi08Y2hvaWNlPlRvIGNvbnRyb2wgb3RoZXIgYW5ub3RhdGlvbiBzZXR0aW5ncywgY2xpY2sgPHVpY29udHJvbD5Bbm5vdGF0aW9uczwvdWljb250cm9sPiBhbmQNCi1zZWxlY3QgeW91ciBhbm5vdGF0aW9uIHByZWZlcmVuY2VzLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvIHNhdmUgeW91ciBwcmVmZXJlbmNlcyBhbmQgY2xvc2UNCi10aGUgcGFnZS48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNS5kaXRhIj48bGlua3RleHQ+U2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZA0KLXRleHQgZWRpdG9yczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDEuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmNhNTU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIHNldCBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGZvciBXZWIgYW5kIFhNTCBmaWxlcy4gVGhlIGFubm90YXRpb24gcHJlZmVyZW5jZXMgaW5jbHVkZSB3aGV0aGVyIHRvIGFuYWx5emUgdGhlIHN5bnRhY3RpYyB2YWxpZGl0eSBvZiB5b3VyIGZpbGUgd2hpbGUgeW91IGFyZSB0eXBpbmcgYW5kIHdoYXQgY29sb3JzIHRvIHVzZSB0byBoaWdobGlnaHQgZXJyb3JzLCB3YXJuaW5ncywgdGFza3MsIHNlYXJjaCByZXN1bHRzLCBib29rbWFya3MsIGFuZCBvdGhlciB0ZXh0LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBzZXQgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgV2ViIGFuZCBYTUwgZmlsZXMuIFRoZSBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGluY2x1ZGUgd2hldGhlciB0byBhbmFseXplIHRoZSBzeW50YWN0aWMgdmFsaWRpdHkgb2YgeW91ciBmaWxlIHdoaWxlIHlvdSBhcmUgdHlwaW5nIGFuZCB3aGF0IGNvbG9ycyB0byB1c2UgdG8gaGlnaGxpZ2h0IGVycm9ycywgd2FybmluZ3MsIHRhc2tzLCBzZWFyY2ggcmVzdWx0cywgYm9va21hcmtzLCBhbmQgb3RoZXIgdGV4dC4iIC8+Ci08bWV0YSBjb250ZW50PSJhbm5vdGF0aW9ucywgbWFya3VwIGxhbmd1YWdlIHNldHRpbmdzLCBtYXJrdXAgbGFuZ3VhZ2VzLCBzZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJhbm5vdGF0aW9ucywgbWFya3VwIGxhbmd1YWdlIHNldHRpbmdzLCBtYXJrdXAgbGFuZ3VhZ2VzLCBzZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjUuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDAxIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDAxIj48YSBuYW1lPSJ0c3JjZWR0MDAxIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIG1hcmt1cCBsYW5ndWFnZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIHNldCA8ZGZuIGNsYXNzPSJ0ZXJtIj5hbm5vdGF0aW9uIHByZWZlcmVuY2VzPC9kZm4+IGZvcgotV2ViIGFuZCBYTUwgZmlsZXMuIFRoZSBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGluY2x1ZGUgd2hldGhlciB0byBhbmFseXplIHRoZQotc3ludGFjdGljIHZhbGlkaXR5IG9mIHlvdXIgZmlsZSB3aGlsZSB5b3UgYXJlIHR5cGluZyBhbmQgd2hhdCBjb2xvcnMgdG8gdXNlCi10byBoaWdobGlnaHQgZXJyb3JzLCB3YXJuaW5ncywgdGFza3MsIHNlYXJjaCByZXN1bHRzLCBib29rbWFya3MsIGFuZCBvdGhlcgotdGV4dC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5CeSBkZWZhdWx0LCB3aGVuIHlvdSBlZGl0IGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvciwgeW91ciBzb3VyY2UKLWNvZGUgaXMgdmFsaWRhdGVkIGFzIHlvdSB0eXBlIGl0IGluLiBMaWtlIG90aGVyIEVjbGlwc2UtYmFzZWQgZWRpdG9ycywgdGhlCi1zdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyBmbGFnIHdhcm5pbmdzIGFuZCBlcnJvcnMgaW4gdGhlCi1zb3VyY2UgY29kZSBpbiB0aGUgZWRpdG9yIGFyZWEuIFRoZSB3YXJuaW5ncyBhbmQgZXJyb3JzIGFsc28gc2hvdyB1cCBpbiB0aGUKLVRhc2tzIHZpZXcgd2hlbiB5b3Ugc2F2ZSB0aGUgZmlsZS48L3A+Ci08ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSGlnaGxpZ2h0aW5nIGlzIGZ1bGx5IGR5bmFtaWMKLXdpdGggdGhlIGV4Y2VwdGlvbiBvZiBzZWFyY2ggcmVzdWx0cy4gU2VhcmNoIHJlc3VsdHMgYXJlIGhpZ2hsaWdodGVkIGJhc2VkCi11cG9uIHdoYXQgaGFzIGJlZW4gc2F2ZWQgdG8gZGlzay48L2Rpdj4KLTxkaXYgY2xhc3M9InRpcCI+PHNwYW4gY2xhc3M9InRpcHRpdGxlIj5UaXA6PC9zcGFuPiBZb3UgY2FuIGltcHJvdmUgYQotc3RydWN0dXJlZCB0ZXh0IGVkaXRvcidzIHBlcmZvcm1hbmNlIGJ5IHR1cm5pbmcgb2ZmIHRoZSByZWFsLXRpbWUgdmFsaWRhdGlvbi48L2Rpdj4KLTxwPlRvCi1zZXQgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcywgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci0gPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ci08L3NwYW4+Ljwvc3Bhbj4gQSBQcmVmZXJlbmNlcyB3aW5kb3cgYXBwZWFycy4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByZWZlcmVuY2VzIHdpbmRvdywgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0b3JzPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PC9zcGFuPgotPHVsPgotPGxpPlRvIHR1cm4gb2ZmIHJlYWwtdGltZSBzeW50YXggdmFsaWRhdGlvbiwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3RydWN0dXJlZAotVGV4dCBFZGl0b3I8L3NwYW4+IGFuZCB1bmNoZWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BbmFseXplIGFubm90YXRpb25zIHdoaWxlCi10eXBpbmc8L3NwYW4+IGJveC48L2xpPgotCi08bGk+VG8gY29udHJvbCBvdGhlciBhbm5vdGF0aW9uIHNldHRpbmdzLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Bbm5vdGF0aW9uczwvc3Bhbj4gYW5kCi1zZWxlY3QgeW91ciBhbm5vdGF0aW9uIHByZWZlcmVuY2VzLjwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvIHNhdmUgeW91ciBwcmVmZXJlbmNlcyBhbmQgY2xvc2UKLXRoZSBwYWdlLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwCi1sYW5ndWFnZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyNS5odG1sIiB0aXRsZT0iIj5TZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkCi10ZXh0IGVkaXRvcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA1LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDUuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4MzY3Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDUuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMDUiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlIGluIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC90aXRsZT4NCi08IS0tRm9ybWVybHkgIlVzaW5nIEphdmFTY3JpcHQgY29udGVudCBhc3Npc3QiOyBtb3ZlZCBzb21lIEphdmFTY3JpcHQtc3BlY2lmaWMgY29udGVudCB0byBjc3JjZWR0MDA2LmRpdGEgKCJDb250ZW50IGFzc2lzdCIpLS0+DQotPHRpdGxlYWx0cz4NCi08bmF2dGl0bGU+R2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2U8L25hdnRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VG8gZ2V0IGhlbHAgaW4gYWRkaW5nIG1hcmt1cCB0byBhIGZpbGUsIHlvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0DQotaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZw0KLW9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0ga2V5cmVmPSJ0c3JjZWR0MDA1fDF8Y29udGVudGFzc2lzdGFuY2VzdHJ1Y3R1cmVkdGV4dGVkaXRvcnMiDQotc3RhdHVzPSJuZXciPmNvbnRlbnQgYXNzaXN0YW5jZTxpbmRleHRlcm0+c3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtIGtleXJlZj0idHNyY2VkdDAwNXwyfHN0cnVjdHVyZWR0ZXh0ZWRpdG9yc2NvbnRlbnRhc3Npc3RhbmNlIiBzdGF0dXM9ImNoYW5nZWQiPnN0cnVjdHVyZWQNCi10ZXh0IGVkaXRvcnM8aW5kZXh0ZXJtPmNvbnRlbnQgYXNzaXN0YW5jZTxpbmRleHRlcm0+dGV4dCBlZGl0b3JzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5Db250ZW50IGFzc2lzdCBhbHNvIGVuYWJsZXMgeW91IHRvIHNlbGVjdCBhbmQgaW5zZXJ0IHRlbXBsYXRlcyBpbg0KLXN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzDQotdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50IGFzc2lzdCB0byBvZmZlciBzdWdnZXN0aW9ucyBmb3IgY29tcGxldGlvbi48L2NvbnRleHQ+DQotPHN0ZXBzLXVub3JkZXJlZD4NCi08c3RlcD48Y21kPjwvY21kPjxpbmZvPllvdSBjYW4gcmVxdWVzdCBjb250ZW50IGFzc2lzdCBpbiBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZw0KLXR3byB3YXlzOjwvaW5mbz4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPkZyb20gdGhlIDx1aWNvbnRyb2w+RWRpdDwvdWljb250cm9sPiBtZW51LCBzZWxlY3QgPHVpY29udHJvbD5Db250ZW50DQotQXNzaXN0PC91aWNvbnRyb2w+PC9jaG9pY2U+DQotPGNob2ljZT5QcmVzcyBDdHJsK1NwYWNlPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTxpbmZvPjxwPkluIGFkZGl0aW9uLCB5b3UgY2FuIHNldCBhIHByZWZlcmVuY2UgdGhhdCBjYXVzZXMgY29udGVudCBhc3Npc3QNCi10byBwb3AgdXAgYXV0b21hdGljYWxseSB3aGVuIGNlcnRhaW4gY2hhcmFjdGVycyBhcmUgdHlwZWQsIHN1Y2ggYXMgPGNvZGVwaD4uPC9jb2RlcGg+IGluDQotdGhlIGNhc2Ugb2YgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iDQotdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4gb3IgPGNvZGVwaD4mbHQ7PC9jb2RlcGg+IGluIHRoZSBjYXNlDQotb2YgSFRNTCBhbmQgWE1MLiBUbyBzZXQgdGhpcyBwcmVmZXJlbmNlLCBzZWxlY3QgPHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPiBmcm9tDQotdGhlIDx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+IG1lbnUsIGFuZCB0aGVuIHNlbGVjdCA8dWljb250cm9sPldlYiBhbmQNCi1YTUwgRmlsZXM8L3VpY29udHJvbD4sIGZvbGxvd2VkIGJ5IG9uZSBvZiB0aGUgZm9sbG93aW5nIHNlcXVlbmNlczo8dWw+DQotPGxpPjxtZW51Y2FzY2FkZT48dWljb250cm9sPkhUTUwgRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPkhUTUwgU291cmNlPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT48L2xpPg0KLTxsaT48bWVudWNhc2NhZGU+PHVpY29udHJvbD5KYXZhU2NyaXB0IEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5KYXZhU2NyaXB0DQotU291cmNlPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT48L2xpPg0KLTxsaT48bWVudWNhc2NhZGU+PHVpY29udHJvbD5YTUwgRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPlhNTCBTb3VyY2U8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPjwvbGk+DQotPC91bD5JbiB0aGUgPHVpY29udHJvbD5Db250ZW50IGFzc2lzdDwvdWljb250cm9sPiBncm91cCBib3gsIHNlbGVjdCB0aGUgPHVpY29udHJvbD5BdXRvbWF0aWNhbGx5DQotbWFrZSBzdWdnZXN0aW9uczwvdWljb250cm9sPiBjaGVjayBib3gsIGFuZCBzdXBwbHkgYW55IGFkZGl0aW9uYWwgY2hhcmFjdGVycw0KLXRoYXQgc2hvdWxkIHRyaWdnZXIgY29udGVudCBhc3Npc3QuPC9wPjxwPklmIHlvdXIgY3Vyc29yIGlzIGluIGEgcG9zaXRpb24NCi13aGVyZSBjb250ZW50IGFzc2lzdCBpcyBhdmFpbGFibGUsIGEgcG9wLXVwIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBjaG9pY2VzDQotaXMgZGlzcGxheWVkLiBGb3IgZWFjaCBvZiB0aGVzZSBjaG9pY2VzLCBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2RlIGlzDQotcHJvdmlkZWQuPC9wPjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcy11bm9yZGVyZWQ+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08IS0tICA8bGluayBocmVmPSJjb250ZW50YXNzaXN0IiB0eXBlPSJzaG93bWUiIGZvcm1hdD0idmlld2xldCI+PGxpbmt0ZXh0PlNob3cgTWU8L2xpbmt0ZXh0PjwvbGluaz4gIC0tPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA2LmRpdGEiPjxsaW5rdGV4dD5Db250ZW50IGFzc2lzdDwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDIzLmRpdGEiPjxsaW5rdGV4dD5NYWtpbmcgY29udGVudCBhc3Npc3Qgd29yayBmb3IgSlNQDQotZmlsZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI3LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZQ0KLXRlbXBsYXRlcyAtIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMC5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMNCi0tIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA1Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNjhmYzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA1Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJHZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUbyBnZXQgaGVscCBpbiBhZGRpbmcgbWFya3VwIHRvIGEgZmlsZSwgeW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUbyBnZXQgaGVscCBpbiBhZGRpbmcgbWFya3VwIHRvIGEgZmlsZSwgeW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbnRlbnQgYXNzaXN0YW5jZSwgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMsIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLCB0ZXh0IGVkaXRvcnMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJjb250ZW50IGFzc2lzdGFuY2UsIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLCBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycywgdGV4dCBlZGl0b3JzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDAwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAwNSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlIGluIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDA1Ij48YSBuYW1lPSJ0c3JjZWR0MDA1Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvaDE+Ci0KLQotCi0KLQotPGRpdj48cD5UbyBnZXQgaGVscCBpbiBhZGRpbmcgbWFya3VwIHRvIGEgZmlsZSwgeW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QKLWluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcKLW9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Db250ZW50IGFzc2lzdCBhbHNvIGVuYWJsZXMgeW91IHRvIHNlbGVjdCBhbmQgaW5zZXJ0IHRlbXBsYXRlcyBpbgotc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMuIFRoZSBwbGFjZW1lbnQgb2YgdGhlIGN1cnNvciBpbiB0aGUgc291cmNlIGZpbGUgcHJvdmlkZXMKLXRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uPC9kaXY+Ci0KLQotPGRpdiBjbGFzcz0icCI+PHNwYW4gLz4gWW91IGNhbiByZXF1ZXN0IGNvbnRlbnQgYXNzaXN0IGluIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nCi10d28gd2F5czoKLTx1bD4KLTxsaT5Gcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPiBtZW51LCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udGVudAotQXNzaXN0PC9zcGFuPjwvbGk+Ci0KLTxsaT5QcmVzcyBDdHJsK1NwYWNlPC9saT4KLQotPC91bD4KLQotIDxkaXYgY2xhc3M9InAiPkluIGFkZGl0aW9uLCB5b3UgY2FuIHNldCBhIHByZWZlcmVuY2UgdGhhdCBjYXVzZXMgY29udGVudCBhc3Npc3QKLXRvIHBvcCB1cCBhdXRvbWF0aWNhbGx5IHdoZW4gY2VydGFpbiBjaGFyYWN0ZXJzIGFyZSB0eXBlZCwgc3VjaCBhcyA8c2FtcCBjbGFzcz0iY29kZXBoIj4uPC9zYW1wPiBpbgotdGhlIGNhc2Ugb2YgSmF2YVNjcmlwdOKEoiBvciA8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7PC9zYW1wPiBpbiB0aGUgY2FzZQotb2YgSFRNTCBhbmQgWE1MLiBUbyBzZXQgdGhpcyBwcmVmZXJlbmNlLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+IGZyb20KLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+IG1lbnUsIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kCi1YTUwgRmlsZXM8L3NwYW4+LCBmb2xsb3dlZCBieSBvbmUgb2YgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZXM6PHVsPgotPGxpPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRNTCBGaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVE1MIFNvdXJjZTwvc3Bhbj4KLTwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5KYXZhU2NyaXB0IEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkphdmFTY3JpcHQKLVNvdXJjZTwvc3Bhbj48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBTb3VyY2U8L3NwYW4+Ci08L3NwYW4+PC9saT4KLQotPC91bD4KLUluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZW50IGFzc2lzdDwvc3Bhbj4gZ3JvdXAgYm94LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkF1dG9tYXRpY2FsbHkKLW1ha2Ugc3VnZ2VzdGlvbnM8L3NwYW4+IGNoZWNrIGJveCwgYW5kIHN1cHBseSBhbnkgYWRkaXRpb25hbCBjaGFyYWN0ZXJzCi10aGF0IHNob3VsZCB0cmlnZ2VyIGNvbnRlbnQgYXNzaXN0LjwvZGl2PgotPHA+SWYgeW91ciBjdXJzb3IgaXMgaW4gYSBwb3NpdGlvbgotd2hlcmUgY29udGVudCBhc3Npc3QgaXMgYXZhaWxhYmxlLCBhIHBvcC11cCBsaXN0IG9mIGFsbCBhdmFpbGFibGUgY2hvaWNlcwotaXMgZGlzcGxheWVkLiBGb3IgZWFjaCBvZiB0aGVzZSBjaG9pY2VzLCBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2RlIGlzCi1wcm92aWRlZC48L3A+Ci08L2Rpdj4KLQotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDYuaHRtbCIgdGl0bGU9IkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoZSBwbGFjZW1lbnQgb2YgdGhlIGN1cnNvciBpbiB0aGUgc291cmNlIGZpbGUgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50IGFzc2lzdCB0byBvZmZlciBzdWdnZXN0aW9ucyBmb3IgY29tcGxldGlvbi4iPkNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjMuaHRtbCIgdGl0bGU9IkhhdmluZyB0aGUgcHJvcGVyIGZpbGVzIGRlZmluZWQgaW4gdGhlIEphdmEgYnVpbGQgY2xhc3MgcGF0aCBpcyBlc3NlbnRpYWwgZm9yIGNvbnRlbnQgYXNzaXN0IHRvIHdvcmsgcHJvcGVybHkgaW4gSlNQIGZpbGVzLiBJdCBpcyBhbHNvIGVzc2VudGlhbCBmb3IgdGhlIGxpbmtzIGJ1aWxkZXIgdG8gYmUgYWJsZSB0byBjb3JyZWN0bHkgcmVzb2x2ZSBsaW5rcyB0byBzZXJ2bGV0cyBvciBKYXZhIGJlYW5zIGluIEpTUCBhbmQgSFRNTCBmaWxlcy4iPk1ha2luZyBjb250ZW50IGFzc2lzdCB3b3JrIGZvciBKU1AKLWZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI3Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBwcm92aWRlcyB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlCi10ZW1wbGF0ZXMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcwotLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDcuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGFhOGI2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAwNyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U2VhcmNoaW5nIG9yIGZpbmRpbmcgdGV4dCB3aXRoaW4gYSBmaWxlPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczxpbmRleHRlcm0+dGV4dCBzZWFyY2g8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi0NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxwcmVyZXE+PG5vdGUgdHlwZT0idGlwIj5CZWZvcmUgeW91IGRvIGEgU2VhcmNoIG9wZXJhdGlvbiBpbiBhIHN0cnVjdHVyZWQNCi10ZXh0IGVkaXRvciwgc2F2ZSB0aGUgZmlsZSB5b3UgYXJlIHNlYXJjaGluZy4gVGhlIHNlYXJjaCBmdW5jdGlvbiB3b3JrcyBmcm9tDQotdGhlIG1vc3QgcmVjZW50bHkgc2F2ZWQgdmVyc2lvbiBvZiB0aGUgZmlsZSByYXRoZXIgdGhhbiBmcm9tIHRoZSBjb250ZW50cw0KLXRoYXQgeW91IHNlZSBpbiB0aGUgZWRpdG9yIGFyZWEuIFlvdSBkbyBub3QgbmVlZCB0byBzYXZlIHlvdXIgZmlsZSBiZWZvcmUNCi15b3UgZG8gYSBGaW5kL1JlcGxhY2Ugb3BlcmF0aW9uLiA8L25vdGU+PC9wcmVyZXE+DQotPGNvbnRleHQ+RWFjaCBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIHByb3ZpZGVzIHR3byB3YXlzIHRvIGxvY2F0ZSBhIHRleHQgc3RyaW5nDQotaW4gdGhlIGZpbGUgeW91IGFyZSBlZGl0aW5nIGFuZCBvcHRpb25hbGx5IHJlcGxhY2UgaXQgd2l0aCBhbm90aGVyIHN0cmluZzogPGRsPg0KLTxkbGVudHJ5Pg0KLTxkdD5GaW5kL1JlcGxhY2U8L2R0Pg0KLTxkZD5MZXRzIHlvdSBsb2NhdGUgdGV4dCBpbiB0aGUgZmlsZSBjdXJyZW50bHkgYmVpbmcgZWRpdGVkLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5TZWFyY2g8L2R0Pg0KLTxkZD5MZXRzIHlvdSBsb2NhdGUgdGV4dCBpbiBmaWxlcyB0aGF0IGhhdmUgYmVlbiBzYXZlZCB0byB5b3VyIHdvcmtzcGFjZS48L2RkPg0KLTwvZGxlbnRyeT48L2RsPjxwPlRvIGxvY2F0ZSBhbmQgb3B0aW9uYWxseSByZXBsYWNlIHRleHQsIHNlbGVjdCBvbmUgb2YgdGhlDQotZm9sbG93aW5nIG1lbnUgcGF0aHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHMtdW5vcmRlcmVkPg0KLTxzdGVwPjxjbWQ+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+RWRpdDwvdWljb250cm9sPjx1aWNvbnRyb2w+RmluZC9SZXBsYWNlPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gKG9yIDx1aWNvbnRyb2w+Q3RybCtGPC91aWNvbnRyb2w+KTwvY21kPjxpbmZvPlRoaXMgb3B0aW9uIGlzDQotc2VsZi1leHBsYW5hdG9yeS48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHMtdW5vcmRlcmVkPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDAwLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcw0KLS0gb3ZlcnZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA3Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY3ODhlZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNlYXJjaGluZyBvciBmaW5kaW5nIHRleHQgd2l0aGluIGEgZmlsZSIgLz4KLTxtZXRhIGNvbnRlbnQ9InN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLCB0ZXh0IHNlYXJjaCIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLCB0ZXh0IHNlYXJjaCIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwMC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMDciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TZWFyY2hpbmcgb3IgZmluZGluZyB0ZXh0IHdpdGhpbiBhIGZpbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMDciPjxhIG5hbWU9InRzcmNlZHQwMDciPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNlYXJjaGluZyBvciBmaW5kaW5nIHRleHQgd2l0aGluIGEgZmlsZTwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InAiPjxkaXYgY2xhc3M9InRpcCI+PHNwYW4gY2xhc3M9InRpcHRpdGxlIj5UaXA6PC9zcGFuPiBCZWZvcmUgeW91IGRvIGEgU2VhcmNoIG9wZXJhdGlvbiBpbiBhIHN0cnVjdHVyZWQKLXRleHQgZWRpdG9yLCBzYXZlIHRoZSBmaWxlIHlvdSBhcmUgc2VhcmNoaW5nLiBUaGUgc2VhcmNoIGZ1bmN0aW9uIHdvcmtzIGZyb20KLXRoZSBtb3N0IHJlY2VudGx5IHNhdmVkIHZlcnNpb24gb2YgdGhlIGZpbGUgcmF0aGVyIHRoYW4gZnJvbSB0aGUgY29udGVudHMKLXRoYXQgeW91IHNlZSBpbiB0aGUgZWRpdG9yIGFyZWEuIFlvdSBkbyBub3QgbmVlZCB0byBzYXZlIHlvdXIgZmlsZSBiZWZvcmUKLXlvdSBkbyBhIEZpbmQvUmVwbGFjZSBvcGVyYXRpb24uIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPkVhY2ggc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBwcm92aWRlcyB0d28gd2F5cyB0byBsb2NhdGUgYSB0ZXh0IHN0cmluZwotaW4gdGhlIGZpbGUgeW91IGFyZSBlZGl0aW5nIGFuZCBvcHRpb25hbGx5IHJlcGxhY2UgaXQgd2l0aCBhbm90aGVyIHN0cmluZzogPGRsPgotCi08ZHQgY2xhc3M9ImRsdGVybSI+RmluZC9SZXBsYWNlPC9kdD4KLQotPGRkPkxldHMgeW91IGxvY2F0ZSB0ZXh0IGluIHRoZSBmaWxlIGN1cnJlbnRseSBiZWluZyBlZGl0ZWQuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+U2VhcmNoPC9kdD4KLQotPGRkPkxldHMgeW91IGxvY2F0ZSB0ZXh0IGluIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIHNhdmVkIHRvIHlvdXIgd29ya3NwYWNlLjwvZGQ+Ci0KLTwvZGw+Ci08cD5UbyBsb2NhdGUgYW5kIG9wdGlvbmFsbHkgcmVwbGFjZSB0ZXh0LCBzZWxlY3Qgb25lIG9mIHRoZQotZm9sbG93aW5nIG1lbnUgcGF0aHM6PC9wPgotPC9kaXY+Ci0KLQotPGRpdiBjbGFzcz0icCI+PHNwYW4+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmQvUmVwbGFjZTwvc3Bhbj4KLTwvc3Bhbj4gKG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN0cmwrRjwvc3Bhbj4pPC9zcGFuPiBUaGlzIG9wdGlvbiBpcwotc2VsZi1leHBsYW5hdG9yeS48L2Rpdj4KLQotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwCi1sYW5ndWFnZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcwotLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTAuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxMC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWM2ZDAxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxMC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAxMCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q2hlY2tpbmcgc3BlbGxpbmc8L3RpdGxlPg0KLTxzaG9ydGRlc2M+VGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gY2hlY2sgc3BlbGxpbmcgaW4gYSBzdHJ1Y3R1cmVkDQotdGV4dCBlZGl0b3IuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c3BlbGwgY2hlY2s8aW5kZXh0ZXJtPnN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczxpbmRleHRlcm0+c3BlbGwgY2hlY2s8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi0NCi0NCi0NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD5UaGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMgKGFjY2Vzc2VkIGZyb20NCi10aGUgUHJvamVjdCBFeHBsb3JlcidzIHBvcC11cCBtZW51IG9yIGJ5IGNsaWNraW5nIHRoZSBTb3VyY2UgdGFiIGluIGNlcnRhaW4NCi1lZGl0b3JzKSBwcm92aWRlIGEgc3BlbGwgY2hlY2tpbmcgZmVhdHVyZS48L3A+PHA+VG8gY2hlY2sgc3BlbGxpbmcgaW4gYW4gSFRNTCwNCi1YTUwsIG9yIG90aGVyIGZpbGUgdGhhdCB1c2VzIGEgc3RydWN0dXJlZCBtYXJrdXAgbGFuZ3VhZ2U6PC9wPiA8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+KE9wdGlvbmFsKSBUbyBzZWxlY3QgdGhlIGRpY3Rpb25hcnkgdGhhdCB3aWxsIGJlIHVzZWQsIGNsaWNrIDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD48dWljb250cm9sPlNwZWxsDQotQ2hlY2s8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5PcGVuIGluIGEgIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgdGhlIGZpbGUgd2hvc2Ugc3BlbGxpbmcgeW91IHdhbnQNCi10byBjaGVjay48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TdGFydCB0aGUgc3BlbGxpbmcgY2hlY2tlciBieSBjbGlja2luZyA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5FZGl0PC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5TcGVsbCBDaGVjazwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlR5cGUgYSBuZXcgc3BlbGxpbmcgaW50byB0aGUgPHVpY29udHJvbD5DaGFuZ2UgdG88L3VpY29udHJvbD4gZmllbGQsDQotb3Igc2VsZWN0IG9uZSBvZiB0aGUgYXZhaWxhYmxlIG9wdGlvbnMuIENsaWNrIHRoZSA8dWljb250cm9sPkNoYW5nZTwvdWljb250cm9sPiBidXR0b24NCi10byBjaGFuZ2UgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIHdvcmQgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQuIENsaWNrDQotdGhlIDx1aWNvbnRyb2w+Q2hhbmdlIEFsbDwvdWljb250cm9sPiBidXR0b24gdG8gY2hhbmdlIGFsbCBpbnN0YW5jZXMgb2YgdGhlDQotd29yZCBpbiB0aGUgY3VycmVudCBkb2N1bWVudC4gWW91IGNhbiBhbHNvIGNsaWNrIHRoZSA8dWljb250cm9sPkFkZDwvdWljb250cm9sPiBidXR0b24NCi10byBhZGQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzcGVsbGluZyB0byB5b3VyIGRpY3Rpb25hcnkuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VXNlIHRoZSBjb250cm9scyBpbiB0aGUgU3BlbGwgQ2hlY2sgZGlhbG9nIGJveCB0byBpZ25vcmUsIGNoYW5nZSwNCi1vciBhZGQgdGVybXMgdG8gdGhlIGN1cnJlbnQgZGljdGlvbmFyeS4gKFRvIHJlbW92ZSBhIHdvcmQgYWZ0ZXIgaXQgaGFzIGJlZW4NCi1hZGRlZCB0byB0aGUgZGljdGlvbmFyeSwgY2xpY2sgdGhlIDx1aWNvbnRyb2w+RGljdGlvbmFyeTwvdWljb250cm9sPiBwdXNoDQotYnV0dG9uLik8L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMC5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMNCi0tIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxMC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYzYyZDMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDaGVja2luZyBzcGVsbGluZyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBjaGVjayBzcGVsbGluZyBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGNoZWNrIHNwZWxsaW5nIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4iIC8+Ci08bWV0YSBjb250ZW50PSJzcGVsbCBjaGVjaywgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzcGVsbCBjaGVjaywgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDEwIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q2hlY2tpbmcgc3BlbGxpbmc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMTAiPjxhIG5hbWU9InRzcmNlZHQwMTAiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNoZWNraW5nIHNwZWxsaW5nPC9oMT4KLQotCi0KLTxkaXY+PHA+VGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gY2hlY2sgc3BlbGxpbmcgaW4gYSBzdHJ1Y3R1cmVkCi10ZXh0IGVkaXRvci48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5UaGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMgKGFjY2Vzc2VkIGZyb20KLXRoZSBQcm9qZWN0IEV4cGxvcmVyJ3MgcG9wLXVwIG1lbnUgb3IgYnkgY2xpY2tpbmcgdGhlIFNvdXJjZSB0YWIgaW4gY2VydGFpbgotZWRpdG9ycykgcHJvdmlkZSBhIHNwZWxsIGNoZWNraW5nIGZlYXR1cmUuPC9wPgotPHA+VG8gY2hlY2sgc3BlbGxpbmcgaW4gYW4gSFRNTCwKLVhNTCwgb3Igb3RoZXIgZmlsZSB0aGF0IHVzZXMgYSBzdHJ1Y3R1cmVkIG1hcmt1cCBsYW5ndWFnZTo8L3A+Ci0gPC9kaXY+Ci0KLTxvbD4KLTxsaT48c3Bhbj4oT3B0aW9uYWwpIFRvIHNlbGVjdCB0aGUgZGljdGlvbmFyeSB0aGF0IHdpbGwgYmUgdXNlZCwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TcGVsbAotQ2hlY2s8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPk9wZW4gaW4gYSAgc3RydWN0dXJlZCB0ZXh0IGVkaXRvciB0aGUgZmlsZSB3aG9zZSBzcGVsbGluZyB5b3Ugd2FudAotdG8gY2hlY2suPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5TdGFydCB0aGUgc3BlbGxpbmcgY2hlY2tlciBieSBjbGlja2luZyA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQ8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TcGVsbCBDaGVjazwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+VHlwZSBhIG5ldyBzcGVsbGluZyBpbnRvIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DaGFuZ2UgdG88L3NwYW4+IGZpZWxkLAotb3Igc2VsZWN0IG9uZSBvZiB0aGUgYXZhaWxhYmxlIG9wdGlvbnMuIENsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DaGFuZ2U8L3NwYW4+IGJ1dHRvbgotdG8gY2hhbmdlIHRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSB3b3JkIGluIHRoZSBjdXJyZW50IGRvY3VtZW50LiBDbGljawotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNoYW5nZSBBbGw8L3NwYW4+IGJ1dHRvbiB0byBjaGFuZ2UgYWxsIGluc3RhbmNlcyBvZiB0aGUKLXdvcmQgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQuIFlvdSBjYW4gYWxzbyBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkPC9zcGFuPiBidXR0b24KLXRvIGFkZCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHNwZWxsaW5nIHRvIHlvdXIgZGljdGlvbmFyeS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlVzZSB0aGUgY29udHJvbHMgaW4gdGhlIFNwZWxsIENoZWNrIGRpYWxvZyBib3ggdG8gaWdub3JlLCBjaGFuZ2UsCi1vciBhZGQgdGVybXMgdG8gdGhlIGN1cnJlbnQgZGljdGlvbmFyeS4gKFRvIHJlbW92ZSBhIHdvcmQgYWZ0ZXIgaXQgaGFzIGJlZW4KLWFkZGVkIHRvIHRoZSBkaWN0aW9uYXJ5LCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGljdGlvbmFyeTwvc3Bhbj4gcHVzaAotYnV0dG9uLik8L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMKLS0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UyYmIxZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMTQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC90aXRsZT4NCi08c2hvcnRkZXNjPlRoaXMgZG9jdW1lbnRhdGlvbiBleHBsYWlucyBob3cgdG8gY3VzdG9taXplIHRoZSBTbmlwcGV0cyB2aWV3DQotYnkgYWRkaW5nIGEgbmV3IGRyYXdlci48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5zbmlwcGV0czxpbmRleHRlcm0+ZHJhd2VyIGN1c3RvbWl6YXRpb248L2luZGV4dGVybT48L2luZGV4dGVybT4NCi0NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PlRvIGFkZCBhIG5ldyBkcmF3ZXIgdG8gdGhlIFNuaXBwZXRzIHZpZXc6PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPlJpZ2h0LWNsaWNrIGFueXdoZXJlIGluIHRoZSBTbmlwcGV0cyB2aWV3IGFuZCBzZWxlY3QgPHVpY29udHJvbD5DdXN0b21pemU8L3VpY29udHJvbD4gZnJvbQ0KLXRoZSBwb3AtdXAgbWVudS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5OZXc8L3VpY29udHJvbD48dWljb250cm9sPkNhdGVnb3J5PC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gYW5kIHR5cGUgdGhlIG5hbWUgb2YgdGhlIG5ldyBkcmF3ZXIgaW4gdGhlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5PcHRpb25hbGx5LCB0eXBlIGEgZGVzY3JpcHRpb24gaW4gdGhlIDx1aWNvbnRyb2w+RGVzY3JpcHRpb248L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBkcmF3ZXIncyBiZWhhdmlvciBieSBjaGVja2luZyBjaGVjayBib3hlcyBhcyBhcHByb3ByaWF0ZS4NCi1UaGUgY2hlY2sgYm94ZXMgYXJlIGFzIGZvbGxvd3M6PC9jbWQ+DQotPGNob2ljZXRhYmxlPg0KLTxjaHJvdz48Y2hvcHRpb24+SGlkZTwvY2hvcHRpb24+PGNoZGVzYz5EbyBub3QgZGlzcGxheSB0aGUgZHJhd2VyLjwvY2hkZXNjPg0KLTwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5PcGVuIGRyYXdlciBhdCBzdGFydC11cDwvY2hvcHRpb24+PGNoZGVzYz5BdCBzdGFydC11cCwgZGlzcGxheQ0KLXRoZSBkcmF3ZXIncyBpdGVtcy48L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+UGluIGRyYXdlciBvcGVuIGF0IHN0YXJ0LXVwPC9jaG9wdGlvbj48Y2hkZXNjPktlZXAgdGhlIGRyYXdlcg0KLW9wZW4uPC9jaGRlc2M+PC9jaHJvdz4NCi08L2Nob2ljZXRhYmxlPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uIFRoZSBuZXcgZHJhd2VyIHdpbGwgYmUgYWRkZWQgdG8NCi10aGUgbGlzdCBvZiBkcmF3ZXJzIGluIHRoZSBTbmlwcGV0cyB2aWV3LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDEuZGl0YSI+PGxpbmt0ZXh0PlNuaXBwZXRzIHZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI2LmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTUuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyMi5kaXRhIj48bGlua3RleHQ+RWRpdGluZyBzbmlwcGV0IGl0ZW1zPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNi5kaXRhIj48bGlua3RleHQ+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3INCi1kcmF3ZXJzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MTQ1ZTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgc25pcHBldHMgZHJhd2VycyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIGRvY3VtZW50YXRpb24gZXhwbGFpbnMgaG93IHRvIGN1c3RvbWl6ZSB0aGUgU25pcHBldHMgdmlldyBieSBhZGRpbmcgYSBuZXcgZHJhd2VyLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIGRvY3VtZW50YXRpb24gZXhwbGFpbnMgaG93IHRvIGN1c3RvbWl6ZSB0aGUgU25pcHBldHMgdmlldyBieSBhZGRpbmcgYSBuZXcgZHJhd2VyLiIgLz4KLTxtZXRhIGNvbnRlbnQ9InNuaXBwZXRzLCBkcmF3ZXIgY3VzdG9taXphdGlvbiIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InNuaXBwZXRzLCBkcmF3ZXIgY3VzdG9taXphdGlvbiIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDEuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE1Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNi5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMTQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAxNCI+PGEgbmFtZT0idHNyY2VkdDAxNCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L2gxPgotCi0KLQotPGRpdj48cD5UaGlzIGRvY3VtZW50YXRpb24gZXhwbGFpbnMgaG93IHRvIGN1c3RvbWl6ZSB0aGUgU25pcHBldHMgdmlldwotYnkgYWRkaW5nIGEgbmV3IGRyYXdlci48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGFkZCBhIG5ldyBkcmF3ZXIgdG8gdGhlIFNuaXBwZXRzIHZpZXc6PC9kaXY+Ci0KLTxvbD4KLTxsaT48c3Bhbj5SaWdodC1jbGljayBhbnl3aGVyZSBpbiB0aGUgU25pcHBldHMgdmlldyBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN1c3RvbWl6ZTwvc3Bhbj4gZnJvbQotdGhlIHBvcC11cCBtZW51Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q2F0ZWdvcnk8L3NwYW4+Ci08L3NwYW4+IGFuZCB0eXBlIHRoZSBuYW1lIG9mIHRoZSBuZXcgZHJhd2VyIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+T3B0aW9uYWxseSwgdHlwZSBhIGRlc2NyaXB0aW9uIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZXNjcmlwdGlvbjwvc3Bhbj4gZmllbGQuPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPlNlbGVjdCB0aGUgZHJhd2VyJ3MgYmVoYXZpb3IgYnkgY2hlY2tpbmcgY2hlY2sgYm94ZXMgYXMgYXBwcm9wcmlhdGUuCi1UaGUgY2hlY2sgYm94ZXMgYXJlIGFzIGZvbGxvd3M6PC9zcGFuPgotCi08dGFibGUgY2xhc3M9ImNob2ljZXRhYmxlYm9yZGVyIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgcnVsZXM9InJvd3MiIGZyYW1lPSJoc2lkZXMiIGJvcmRlcj0iMSI+Ci08dGhlYWQ+PHRyPjx0aCB2YWxpZ249ImJvdHRvbSIgaWQ9Ik4xMDA5MC1vcHRpb24iIGFsaWduPSJsZWZ0Ij5PcHRpb248L3RoPgotPHRoIHZhbGlnbj0iYm90dG9tIiBpZD0iTjEwMDkwLWRlc2MiIGFsaWduPSJsZWZ0Ij5EZXNjcmlwdGlvbjwvdGg+PC90cj48L3RoZWFkPgotPHRib2R5PgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDkwLW9wdGlvbiIgaWQ9Ik4xMDA5QSI+PHN0cm9uZz5IaWRlPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDkwLWRlc2MgTjEwMDlBIj5EbyBub3QgZGlzcGxheSB0aGUgZHJhd2VyLjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA5MC1vcHRpb24iIGlkPSJOMTAwQUEiPjxzdHJvbmc+T3BlbiBkcmF3ZXIgYXQgc3RhcnQtdXA8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwOTAtZGVzYyBOMTAwQUEiPkF0IHN0YXJ0LXVwLCBkaXNwbGF5Ci10aGUgZHJhd2VyJ3MgaXRlbXMuPC90ZD4KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA5MC1vcHRpb24iIGlkPSJOMTAwQjkiPjxzdHJvbmc+UGluIGRyYXdlciBvcGVuIGF0IHN0YXJ0LXVwPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDkwLWRlc2MgTjEwMEI5Ij5LZWVwIHRoZSBkcmF3ZXIKLW9wZW4uPC90ZD4KLTwvdHI+Ci0KLTwvdGJvZHk+PC90YWJsZT4KLQotPC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi4gVGhlIG5ldyBkcmF3ZXIgd2lsbCBiZSBhZGRlZCB0bwotdGhlIGxpc3Qgb2YgZHJhd2VycyBpbiB0aGUgU25pcHBldHMgdmlldy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDAxLmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIj5TbmlwcGV0cyB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjYuaHRtbCIgdGl0bGU9IlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4gVGhlIHZpZXcgY2FuIGJlIGV4dGVuZGVkIGJhc2VkIG9uIGFkZGl0aW9uYWwgb2JqZWN0cyB0aGF0IHlvdSBkZWZpbmUgYW5kIGluY2x1ZGUuIj5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNS5odG1sIiB0aXRsZT0iIj5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyMi5odG1sIiB0aXRsZT0iIj5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTYuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGRlbGV0ZSBvciBoaWRlIGRyYXdlcnMgYW5kIGl0ZW1zIGluIHRoZSBTbmlwcGV0cyB2aWV3LiI+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IKLWRyYXdlcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTUuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiY2NlYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTUuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMTUiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InRzcmNlZHQwMTV8MnxzbmlwcGV0aXRlbXNhZGRpbmd0b2RyYXdlcnMiIHN0YXR1cz0iY2hhbmdlZCI+c25pcHBldHM8aW5kZXh0ZXJtPmRyYXdlcnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiBUbyBhZGQgbmV3IGl0ZW1zIHRvIGFuIGV4aXN0aW5nIHNuaXBwZXRzIGRyYXdlcjo8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+RG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgY2hvaWNlczo8L2NtZD48aW5mbz48dGFibGUgY29sc2VwPSIwIiBmcmFtZT0idG9wYm90Ij4NCi08dGdyb3VwIGNvbHM9IjIiPjxjb2xzcGVjIGNvbG5hbWU9ImNvbDEiIGNvbHdpZHRoPSI3MioiLz48Y29sc3BlYyBjb2xuYW1lPSJjb2wyIg0KLWNvbHdpZHRoPSIxMjcqIi8+DQotPHRoZWFkPg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiIHZhbGlnbj0idG9wIj5UbyBzdGFydCB3aXRoIHRoaXM6PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiIgdmFsaWduPSJ0b3AiPkRvIHRoaXM6PC9lbnRyeT4NCi08L3Jvdz4NCi08L3RoZWFkPg0KLTx0Ym9keT4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5BbiBlbXB0eSBpdGVtIHRoYXQgeW91IGNhbiBlZGl0PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+UmlnaHQtY2xpY2sgYW55d2hlcmUgaW4gYW4gZXhpc3RpbmcgZHJhd2VyLCBzZWxlY3QgPHVpY29udHJvbD5DdXN0b21pemU8L3VpY29udHJvbD4sDQotYW5kIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPk5ldzwvdWljb250cm9sPjx1aWNvbnRyb2w+TmV3IEl0ZW08L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPi48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkV4aXN0aW5nIHRleHQgcGFzdGVkIGludG8gYSBuZXcgaXRlbSBpbiBhbiBleGlzdGluZw0KLWRyYXdlcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPkNvcHkgb3IgY3V0IHRleHQgdG8gdGhlIGNsaXBib2FyZC4gSW4gdGhlIFNuaXBwZXRzIHZpZXcsDQotcmlnaHQtY2xpY2sgYW55d2hlcmUgaW4gYW4gZXhpc3RpbmcgZHJhd2VyIGFuZCBjbGljayA8dWljb250cm9sPlBhc3RlPC91aWNvbnRyb2w+LjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+RXhpc3RpbmcgdGV4dCBwYXN0ZWQgaW50byBhIG5ldyBpdGVtIGluIGEgbmV3IG9yIGV4aXN0aW5nDQotZHJhd2VyPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+U2VsZWN0IHRoZSB0ZXh0LCByaWdodC1jbGljaywgY2xpY2sgPHVpY29udHJvbD5BZGQgdG8NCi1TbmlwcGV0czwvdWljb250cm9sPiwgc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZHJhd2VyIGluIHRoZSBTbmlwcGV0cyB2aWV3DQotdG8gd2hpY2ggeW91IHdhbnQgdG8gYWRkIHRoZSBpdGVtLCBhbmQgY2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGJvZHk+DQotPC90Z3JvdXA+DQotPC90YWJsZT48L2luZm8+PHN0ZXByZXN1bHQ+QSA8d2ludGl0bGU+Q3VzdG9taXplIFBhbGV0dGU8L3dpbnRpdGxlPiB3aW5kb3cNCi1hcHBlYXJzLjwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UeXBlIGEgbmFtZSBmb3IgdGhlIG5ldyBpdGVtLCBhbmQsIG9wdGlvbmFsbHksIHByb3ZpZGUgYSBkZXNjcmlwdGlvbi48L2NtZD4NCi08c3RlcHJlc3VsdD5UaGUgdmFsdWUgdGhhdCB5b3UgdHlwZSBpbiB0aGUgPHVpY29udHJvbD5OYW1lPC91aWNvbnRyb2w+IGZpZWxkDQotd2lsbCBhcHBlYXIgbmV4dCB0byB0aGUgaXRlbSdzIGljb24gaW4gdGhlIFNuaXBwZXRzIHZpZXcuPC9zdGVwcmVzdWx0Pjwvc3RlcD4NCi08c3RlcD48Y21kPlRvIGluY2x1ZGUgaW4gdGhlIDx1aWNvbnRyb2w+VGVtcGxhdGUgUGF0dGVybjwvdWljb250cm9sPiBmaWVsZA0KLWEgdmFyaWFibGUgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IGRlZmluZWQsIGNsaWNrIDx1aWNvbnRyb2w+SW5zZXJ0IFZhcmlhYmxlDQotUGxhY2Vob2xkZXI8L3VpY29udHJvbD4uIDwvY21kPjxpbmZvPkEgdmFyaWFibGUgcGxhY2Vob2xkZXIgaXMgYSBtYXJrZXIgdGhhdCwNCi13aGVuIHRhZ2dpbmcgaXMgaW5zZXJ0ZWQgaW50byB0aGUgYWN0aXZlIGZpbGUsIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHZhbHVlDQotdGhhdCBpcyBlbnRlcmVkIGludG8gdGhlIDx1aWNvbnRyb2w+SW5zZXJ0IFRlbXBsYXRlOjwvdWljb250cm9sPjx2YXJuYW1lPkl0ZW1fbmFtZTwvdmFybmFtZT4gZGlhbG9nDQotYXQgaW5zZXJ0aW9uIHRpbWUuIENsaWNraW5nIHRoZSA8dWljb250cm9sPkluc2VydCBWYXJpYWJsZSBQbGFjZWhvbGRlcjwvdWljb250cm9sPiBidXR0b24NCi1vciB0eXBpbmcgQ3RybCtTcGFjZSBhY3RpdmF0ZXMgYSBwb3AtdXAgaW4gdGhlIHRleHQgYXJlYSB0aGF0IHByb21wdHMgeW91DQotd2l0aCB0aGUgY29ycmVjdCBzZXF1ZW5jZXMgdG8gY3JlYXRlIGEgbWFya2VyIGZvciB0aGUgdmFyaWFibGUuPC9pbmZvPjxzdGVweG1wPkZvcg0KLWV4YW1wbGUsIGlmIHlvdSBjcmVhdGUgdHdvIHZhcmlhYmxlcyBuYW1lZCA8dmFybmFtZT51cmk8L3Zhcm5hbWU+IGFuZCA8dmFybmFtZT5wcmVmaXg8L3Zhcm5hbWU+LA0KLWFuZCBjcmVhdGUgdmFyaWFibGUgcGxhY2Vob2xkZXJzIGZvciBib3RoLCB0aGUgdGVtcGxhdGUgcGF0dGVybiBtaWdodCBsb29rDQotbGlrZSB0aGlzOjxjb2RlYmxvY2s+Jmx0OyVAIHRhZ2xpYiB1cmk9IiR7dXJpfSIgcHJlZml4PSIke3ByZWZpeH0iICU+PC9jb2RlYmxvY2s+PC9zdGVweG1wPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD5UaGUgbmV3IGl0ZW0gd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBpdGVtcyBpbiB0aGUgYXBwcm9wcmlhdGUNCi1kcmF3ZXIuPC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwMS5kaXRhIj48bGlua3RleHQ+U25pcHBldHMgdmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjYuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDIyLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE2LmRpdGEiPjxsaW5rdGV4dD5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvcg0KLWRyYXdlcnM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIxNWVlOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VycyIgLz4KLTxtZXRhIGNvbnRlbnQ9InNuaXBwZXRzLCBkcmF3ZXJzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic25pcHBldHMsIGRyYXdlcnMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDAxLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjYuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDIyLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTYuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDE1IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMTUiPjxhIG5hbWU9InRzcmNlZHQwMTUiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IFRvIGFkZCBuZXcgaXRlbXMgdG8gYW4gZXhpc3Rpbmcgc25pcHBldHMgZHJhd2VyOjwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNob2ljZXM6PC9zcGFuPiAKLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgZnJhbWU9ImhzaWRlcyIgYm9yZGVyPSIxIiBydWxlcz0icm93cyI+Ci08dGhlYWQgYWxpZ249ImxlZnQiPgotPHRyPgotPHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iMzYuMTgwOTA0NTIyNjEzMDclIiBpZD0iTjEwMDcwIj5UbyBzdGFydCB3aXRoIHRoaXM6PC90aD4KLQotPHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMuODE5MDk1NDc3Mzg2OTMlIiBpZD0iTjEwMDc4Ij5EbyB0aGlzOjwvdGg+Ci0KLTwvdHI+Ci0KLTwvdGhlYWQ+Ci0KLTx0Ym9keT4KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjM2LjE4MDkwNDUyMjYxMzA3JSIgaGVhZGVycz0iTjEwMDcwICI+QW4gZW1wdHkgaXRlbSB0aGF0IHlvdSBjYW4gZWRpdDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjYzLjgxOTA5NTQ3NzM4NjkzJSIgaGVhZGVycz0iTjEwMDc4ICI+UmlnaHQtY2xpY2sgYW55d2hlcmUgaW4gYW4gZXhpc3RpbmcgZHJhd2VyLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3VzdG9taXplPC9zcGFuPiwKLWFuZCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXcgSXRlbTwvc3Bhbj4KLTwvc3Bhbj4uPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMzYuMTgwOTA0NTIyNjEzMDclIiBoZWFkZXJzPSJOMTAwNzAgIj5FeGlzdGluZyB0ZXh0IHBhc3RlZCBpbnRvIGEgbmV3IGl0ZW0gaW4gYW4gZXhpc3RpbmcKLWRyYXdlcjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjYzLjgxOTA5NTQ3NzM4NjkzJSIgaGVhZGVycz0iTjEwMDc4ICI+Q29weSBvciBjdXQgdGV4dCB0byB0aGUgY2xpcGJvYXJkLiBJbiB0aGUgU25pcHBldHMgdmlldywKLXJpZ2h0LWNsaWNrIGFueXdoZXJlIGluIGFuIGV4aXN0aW5nIGRyYXdlciBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGFzdGU8L3NwYW4+LjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjM2LjE4MDkwNDUyMjYxMzA3JSIgaGVhZGVycz0iTjEwMDcwICI+RXhpc3RpbmcgdGV4dCBwYXN0ZWQgaW50byBhIG5ldyBpdGVtIGluIGEgbmV3IG9yIGV4aXN0aW5nCi1kcmF3ZXI8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI2My44MTkwOTU0NzczODY5MyUiIGhlYWRlcnM9Ik4xMDA3OCAiPlNlbGVjdCB0aGUgdGV4dCwgcmlnaHQtY2xpY2ssIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCB0bwotU25pcHBldHM8L3NwYW4+LCBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBkcmF3ZXIgaW4gdGhlIFNuaXBwZXRzIHZpZXcKLXRvIHdoaWNoIHlvdSB3YW50IHRvIGFkZCB0aGUgaXRlbSwgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3RkPgotCi08L3RyPgotCi08L3Rib2R5PgotCi08L3RhYmxlPgotPC9kaXY+Ci0gQSA8c3BhbiBjbGFzcz0id2ludGl0bGUiPkN1c3RvbWl6ZSBQYWxldHRlPC9zcGFuPiB3aW5kb3cKLWFwcGVhcnMuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgbmFtZSBmb3IgdGhlIG5ldyBpdGVtLCBhbmQsIG9wdGlvbmFsbHksIHByb3ZpZGUgYSBkZXNjcmlwdGlvbi48L3NwYW4+Ci0gVGhlIHZhbHVlIHRoYXQgeW91IHR5cGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+IGZpZWxkCi13aWxsIGFwcGVhciBuZXh0IHRvIHRoZSBpdGVtJ3MgaWNvbiBpbiB0aGUgU25pcHBldHMgdmlldy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGluY2x1ZGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRlbXBsYXRlIFBhdHRlcm48L3NwYW4+IGZpZWxkCi1hIHZhcmlhYmxlIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBkZWZpbmVkLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbnNlcnQgVmFyaWFibGUKLVBsYWNlaG9sZGVyPC9zcGFuPi4gPC9zcGFuPiBBIHZhcmlhYmxlIHBsYWNlaG9sZGVyIGlzIGEgbWFya2VyIHRoYXQsCi13aGVuIHRhZ2dpbmcgaXMgaW5zZXJ0ZWQgaW50byB0aGUgYWN0aXZlIGZpbGUsIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHZhbHVlCi10aGF0IGlzIGVudGVyZWQgaW50byB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5zZXJ0IFRlbXBsYXRlOjwvc3Bhbj48dmFyIGNsYXNzPSJ2YXJuYW1lIj5JdGVtX25hbWU8L3Zhcj4gZGlhbG9nCi1hdCBpbnNlcnRpb24gdGltZS4gQ2xpY2tpbmcgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluc2VydCBWYXJpYWJsZSBQbGFjZWhvbGRlcjwvc3Bhbj4gYnV0dG9uCi1vciB0eXBpbmcgQ3RybCtTcGFjZSBhY3RpdmF0ZXMgYSBwb3AtdXAgaW4gdGhlIHRleHQgYXJlYSB0aGF0IHByb21wdHMgeW91Ci13aXRoIHRoZSBjb3JyZWN0IHNlcXVlbmNlcyB0byBjcmVhdGUgYSBtYXJrZXIgZm9yIHRoZSB2YXJpYWJsZS4gRm9yCi1leGFtcGxlLCBpZiB5b3UgY3JlYXRlIHR3byB2YXJpYWJsZXMgbmFtZWQgPHZhciBjbGFzcz0idmFybmFtZSI+dXJpPC92YXI+IGFuZCA8dmFyIGNsYXNzPSJ2YXJuYW1lIj5wcmVmaXg8L3Zhcj4sCi1hbmQgY3JlYXRlIHZhcmlhYmxlIHBsYWNlaG9sZGVycyBmb3IgYm90aCwgdGhlIHRlbXBsYXRlIHBhdHRlcm4gbWlnaHQgbG9vawotbGlrZSB0aGlzOjxwcmU+Jmx0OyVAIHRhZ2xpYiB1cmk9IiR7dXJpfSIgcHJlZml4PSIke3ByZWZpeH0iICUmZ3Q7PC9wcmU+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGUgbmV3IGl0ZW0gd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBpdGVtcyBpbiB0aGUgYXBwcm9wcmlhdGUKLWRyYXdlci48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDAxLmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIj5TbmlwcGV0cyB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjYuaHRtbCIgdGl0bGU9IlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4gVGhlIHZpZXcgY2FuIGJlIGV4dGVuZGVkIGJhc2VkIG9uIGFkZGl0aW9uYWwgb2JqZWN0cyB0aGF0IHlvdSBkZWZpbmUgYW5kIGluY2x1ZGUuIj5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNC5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcgYnkgYWRkaW5nIGEgbmV3IGRyYXdlci4iPkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDIyLmh0bWwiIHRpdGxlPSIiPkVkaXRpbmcgc25pcHBldCBpdGVtczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNi5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gZGVsZXRlIG9yIGhpZGUgZHJhd2VycyBhbmQgaXRlbXMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuIj5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvcgotZHJhd2VyczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTYuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDYyNGFmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAxNiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2VyczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08bmF2dGl0bGU+RGVsZXRpbmcgYW5kIGhpZGluZyBkcmF3ZXJzIGFuZCBpdGVtczwvbmF2dGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBkZWxldGUgb3IgaGlkZSBkcmF3ZXJzIGFuZA0KLWl0ZW1zIGluIHRoZSBTbmlwcGV0cyB2aWV3Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmRyYXdlcnM8aW5kZXh0ZXJtPnNuaXBwZXRzIHZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPnNuaXBwZXRzPGluZGV4dGVybT5tb2RpZnlpbmcgZHJhd2VyczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLQ0KLQ0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+WW91IGNhbiBoaWRlIGFueSBkcmF3ZXIgb3IgaXRlbSB0aGF0IHNob3dzIHVwIGluIHRoZSBTbmlwcGV0cyB2aWV3Lg0KLUlmIHRoZSBkcmF3ZXIgb3IgaXRlbSBpcyB1c2VyLWRlZmluZWQsIHlvdSBjYW4gZGVsZXRlIGl0IHBlcm1hbmVudGx5LiBUbyBkZWxldGUNCi1vciBoaWRlIGEgZHJhd2VyIG9yIGl0ZW0sIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgaXRlbSBvciBkcmF3ZXIgdGhhdCB5b3Ugd2FudCB0byByZW1vdmUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+UmlnaHQtY2xpY2sgYW5kIHNlbGVjdCA8dWljb250cm9sPkN1c3RvbWl6ZTwvdWljb250cm9sPiBmcm9tIHRoZQ0KLXBvcC11cCBtZW51LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgaXRlbSBvciBkcmF3ZXIgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RGVsZXRlPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+SGlkZTwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LiBUaGUgaXRlbSBvciBkcmF3ZXIgd2lsbCBiZSBkZWxldGVkDQotb3IgaGlkZGVuIGZyb20gdGhlIFNuaXBwZXRzIHZpZXcuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwMS5kaXRhIj48bGlua3RleHQ+U25pcHBldHMgdmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjYuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE1LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjIuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgc25pcHBldCBpdGVtczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTYuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTBkMzc2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2VycyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBkZWxldGUgb3IgaGlkZSBkcmF3ZXJzIGFuZCBpdGVtcyBpbiB0aGUgU25pcHBldHMgdmlldy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gZGVsZXRlIG9yIGhpZGUgZHJhd2VycyBhbmQgaXRlbXMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuIiAvPgotPG1ldGEgY29udGVudD0iZHJhd2Vycywgc25pcHBldHMgdmlldywgc25pcHBldHMsIG1vZGlmeWluZyBkcmF3ZXJzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iZHJhd2Vycywgc25pcHBldHMgdmlldywgc25pcHBldHMsIG1vZGlmeWluZyBkcmF3ZXJzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwMS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI2Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDIyLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAxNiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMTYiPjxhIG5hbWU9InRzcmNlZHQwMTYiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnM8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGRlbGV0ZSBvciBoaWRlIGRyYXdlcnMgYW5kCi1pdGVtcyBpbiB0aGUgU25pcHBldHMgdmlldy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBjYW4gaGlkZSBhbnkgZHJhd2VyIG9yIGl0ZW0gdGhhdCBzaG93cyB1cCBpbiB0aGUgU25pcHBldHMgdmlldy4KLUlmIHRoZSBkcmF3ZXIgb3IgaXRlbSBpcyB1c2VyLWRlZmluZWQsIHlvdSBjYW4gZGVsZXRlIGl0IHBlcm1hbmVudGx5LiBUbyBkZWxldGUKLW9yIGhpZGUgYSBkcmF3ZXIgb3IgaXRlbSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPlNlbGVjdCB0aGUgaXRlbSBvciBkcmF3ZXIgdGhhdCB5b3Ugd2FudCB0byByZW1vdmUuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5SaWdodC1jbGljayBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN1c3RvbWl6ZTwvc3Bhbj4gZnJvbSB0aGUKLXBvcC11cCBtZW51Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0IHRoZSBpdGVtIG9yIGRyYXdlciBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVsZXRlPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IaWRlPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+LiBUaGUgaXRlbSBvciBkcmF3ZXIgd2lsbCBiZSBkZWxldGVkCi1vciBoaWRkZW4gZnJvbSB0aGUgU25pcHBldHMgdmlldy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDAxLmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIj5TbmlwcGV0cyB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjYuaHRtbCIgdGl0bGU9IlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4gVGhlIHZpZXcgY2FuIGJlIGV4dGVuZGVkIGJhc2VkIG9uIGFkZGl0aW9uYWwgb2JqZWN0cyB0aGF0IHlvdSBkZWZpbmUgYW5kIGluY2x1ZGUuIj5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNC5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcgYnkgYWRkaW5nIGEgbmV3IGRyYXdlci4iPkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDE1Lmh0bWwiIHRpdGxlPSIiPkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDIyLmh0bWwiIHRpdGxlPSIiPkVkaXRpbmcgc25pcHBldCBpdGVtczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2IzMWJmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAyMiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBzbmlwcGV0IGl0ZW1zPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5zbmlwcGV0czxpbmRleHRlcm0+ZWRpdGluZyBpdGVtczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IFRvIG1vZGlmeSBhbiBleGlzdGluZyBpdGVtIGluIGEgU25pcHBldHMgZHJhd2VyLCBjb21wbGV0ZSB0aGUgc3RlcHMNCi1saXN0ZWQgYmVsb3cuIElmIHlvdSBoYXZlIGp1c3QgY29tcGxldGVkIHRoZSB0YXNrIDx4cmVmIGhyZWY9InRzcmNlZHQwMTUuZGl0YSINCi10eXBlPSJ0YXNrIj5BZGRpbmcgYW4gaXRlbSB0byBhIHNuaXBwZXRzIGRyYXdlcjwveHJlZj4gYW5kIHRoZSA8d2ludGl0bGU+Q3VzdG9taXplDQotUGFsZXR0ZTwvd2ludGl0bGU+IHdpbmRvdyBpcyBzdGlsbCBvcGVuLCB5b3UgY2FuIHNraXAgc3RlcHMgMSBhbmQgMi48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFNuaXBwZXRzIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBuYW1lIG9mIHRoZSBpdGVtIHRoYXQgeW91DQotd2FudCB0byBtb2RpZnksIGFuZCBzZWxlY3QgPHVpY29udHJvbD5DdXN0b21pemU8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+T3B0aW9uYWxseSwgdHlwZSBhIG5ldyBuYW1lIGFuZCBhIG5ldyBkZXNjcmlwdGlvbiBmb3IgdGhlIGl0ZW0uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gZGVjbGFyZSBhIHZhcmlhYmxlLCBjbGljayA8dWljb250cm9sPk5ldzwvdWljb250cm9sPiBhbmQgdHlwZQ0KLXRoZSB2YXJpYWJsZSdzIG5hbWUsIGRlc2NyaXB0aW9uLCBhbmQgZGVmYXVsdCB2YWx1ZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyBlZGl0IGFuIGV4aXN0aW5nIHZhcmlhYmxlLCB0eXBlIG92ZXIgdGhlIGV4aXN0aW5nIHZhbHVlcy48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyBlZGl0IHRoZSA8dWljb250cm9sPlRlbXBsYXRlIFBhdHRlcm48L3VpY29udHJvbD4gZmllbGQsIHR5cGUNCi1pbnRvIHRoZSBmaWVsZCwgY3V0IGFuZCBwYXN0ZSBpbnRvIHRoZSBmaWVsZCwgb3IsIGlmIHlvdSBoYXZlIGRlZmluZWQgb25lDQotb3IgbW9yZSB2YXJpYWJsZXMsIGNsaWNrIHRoZSA8dWljb250cm9sPkluc2VydCBWYXJpYWJsZSBQbGFjZWhvbGRlcjwvdWljb250cm9sPiBidXR0b24sDQotYW5kIGRvdWJsZS1jbGljayB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdGhhdCB5b3Ugd2FudCB0byBpbnNlcnQuPC9jbWQ+PHN0ZXB4bXA+Rm9yDQotZXhhbXBsZSwgaWYgeW91IGhhdmUgZGVjbGFyZSB2YXJpYWJsZXMgbmFtZWQgPHZhcm5hbWU+dXJpPC92YXJuYW1lPiBhbmQgPHZhcm5hbWU+cHJlZml4PC92YXJuYW1lPiwNCi1jbGlja2luZyB0aGUgYnV0dG9uIGJyaW5ncyB1cCBhIG1lbnUgdGhhdCBjb250YWlucyB0aG9zZSBuYW1lcy4gRG91YmxlLWNsaWNraW5nIDx2YXJuYW1lPnVyaTwvdmFybmFtZT4gaW5zZXJ0cyA8Y29kZXBoPiR7dXJpfTwvY29kZXBoPiwNCi1hcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6PGNvZGVibG9jaz4mbHQ7JUAgdGFnbGliIHVyaT0iJHt1cml9IiBwcmVmaXg9IiR7cHJlZml4fSIgJT48L2NvZGVibG9jaz48L3N0ZXB4bXA+DQotPHN0ZXByZXN1bHQ+TGF0ZXIsIHdoZW4geW91IGluc2VydCB0aGUgc25pcHBldCBpbnRvIGEgZmlsZSwgPGNvZGVwaD4ke3VyaX08L2NvZGVwaD4gYW5kIDxjb2RlcGg+JHtwcmVmaXh9PC9jb2RlcGg+IGFyZQ0KLWVhY2ggY29udmVydGVkIHRvIHRoZSBkZWZhdWx0IHZhbHVlIGRlY2xhcmVkIGluIHRoZSBWYXJpYWJsZXMgdGFibGUuIFVzZXJzDQotY2FuIHJlcGxhY2UgdGhlIGRlZmF1bHQgdmFsdWVzIGluIHRoZSA8dWljb250cm9sPkluc2VydCBUZW1wbGF0ZTo8L3VpY29udHJvbD48dmFybmFtZT5JdGVtX25hbWU8L3Zhcm5hbWU+IGRpYWxvZw0KLWF0IGluc2VydGlvbiB0aW1lLjwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+VGhlIG1vZGlmaWVkIGl0ZW0gd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBpdGVtcyBpbiB0aGUgYXBwcm9wcmlhdGUNCi1kcmF3ZXIuPC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwMS5kaXRhIj48bGlua3RleHQ+U25pcHBldHMgdmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjYuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE1LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTYuZGl0YSI+PGxpbmt0ZXh0PkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yDQotZHJhd2VyczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDU4YTBlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyBzbmlwcGV0IGl0ZW1zIiAvPgotPG1ldGEgY29udGVudD0ic25pcHBldHMsIGVkaXRpbmcgaXRlbXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzbmlwcGV0cywgZWRpdGluZyBpdGVtcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDEuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNi5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMjIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMjIiPjxhIG5hbWU9InRzcmNlZHQwMjIiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgc25pcHBldCBpdGVtczwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiBUbyBtb2RpZnkgYW4gZXhpc3RpbmcgaXRlbSBpbiBhIFNuaXBwZXRzIGRyYXdlciwgY29tcGxldGUgdGhlIHN0ZXBzCi1saXN0ZWQgYmVsb3cuIElmIHlvdSBoYXZlIGp1c3QgY29tcGxldGVkIHRoZSB0YXNrIDxhIGhyZWY9InRzcmNlZHQwMTUuaHRtbCI+QWRkaW5nIGFuIGl0ZW0gdG8gYSBzbmlwcGV0cyBkcmF3ZXI8L2E+IGFuZCB0aGUgPHNwYW4gY2xhc3M9IndpbnRpdGxlIj5DdXN0b21pemUKLVBhbGV0dGU8L3NwYW4+IHdpbmRvdyBpcyBzdGlsbCBvcGVuLCB5b3UgY2FuIHNraXAgc3RlcHMgMSBhbmQgMi48L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgU25pcHBldHMgdmlldywgcmlnaHQtY2xpY2sgdGhlIG5hbWUgb2YgdGhlIGl0ZW0gdGhhdCB5b3UKLXdhbnQgdG8gbW9kaWZ5LCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN1c3RvbWl6ZTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3B0aW9uYWxseSwgdHlwZSBhIG5ldyBuYW1lIGFuZCBhIG5ldyBkZXNjcmlwdGlvbiBmb3IgdGhlIGl0ZW0uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBkZWNsYXJlIGEgdmFyaWFibGUsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gYW5kIHR5cGUKLXRoZSB2YXJpYWJsZSdzIG5hbWUsIGRlc2NyaXB0aW9uLCBhbmQgZGVmYXVsdCB2YWx1ZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBlZGl0IGFuIGV4aXN0aW5nIHZhcmlhYmxlLCB0eXBlIG92ZXIgdGhlIGV4aXN0aW5nIHZhbHVlcy48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGVkaXQgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRlbXBsYXRlIFBhdHRlcm48L3NwYW4+IGZpZWxkLCB0eXBlCi1pbnRvIHRoZSBmaWVsZCwgY3V0IGFuZCBwYXN0ZSBpbnRvIHRoZSBmaWVsZCwgb3IsIGlmIHlvdSBoYXZlIGRlZmluZWQgb25lCi1vciBtb3JlIHZhcmlhYmxlcywgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluc2VydCBWYXJpYWJsZSBQbGFjZWhvbGRlcjwvc3Bhbj4gYnV0dG9uLAotYW5kIGRvdWJsZS1jbGljayB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdGhhdCB5b3Ugd2FudCB0byBpbnNlcnQuPC9zcGFuPiBGb3IKLWV4YW1wbGUsIGlmIHlvdSBoYXZlIGRlY2xhcmUgdmFyaWFibGVzIG5hbWVkIDx2YXIgY2xhc3M9InZhcm5hbWUiPnVyaTwvdmFyPiBhbmQgPHZhciBjbGFzcz0idmFybmFtZSI+cHJlZml4PC92YXI+LAotY2xpY2tpbmcgdGhlIGJ1dHRvbiBicmluZ3MgdXAgYSBtZW51IHRoYXQgY29udGFpbnMgdGhvc2UgbmFtZXMuIERvdWJsZS1jbGlja2luZyA8dmFyIGNsYXNzPSJ2YXJuYW1lIj51cmk8L3Zhcj4gaW5zZXJ0cyA8c2FtcCBjbGFzcz0iY29kZXBoIj4ke3VyaX08L3NhbXA+LAotYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOjxwcmU+Jmx0OyVAIHRhZ2xpYiB1cmk9IiR7dXJpfSIgcHJlZml4PSIke3ByZWZpeH0iICUmZ3Q7PC9wcmU+Ci0KLSBMYXRlciwgd2hlbiB5b3UgaW5zZXJ0IHRoZSBzbmlwcGV0IGludG8gYSBmaWxlLCA8c2FtcCBjbGFzcz0iY29kZXBoIj4ke3VyaX08L3NhbXA+IGFuZCA8c2FtcCBjbGFzcz0iY29kZXBoIj4ke3ByZWZpeH08L3NhbXA+IGFyZQotZWFjaCBjb252ZXJ0ZWQgdG8gdGhlIGRlZmF1bHQgdmFsdWUgZGVjbGFyZWQgaW4gdGhlIFZhcmlhYmxlcyB0YWJsZS4gVXNlcnMKLWNhbiByZXBsYWNlIHRoZSBkZWZhdWx0IHZhbHVlcyBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5zZXJ0IFRlbXBsYXRlOjwvc3Bhbj48dmFyIGNsYXNzPSJ2YXJuYW1lIj5JdGVtX25hbWU8L3Zhcj4gZGlhbG9nCi1hdCBpbnNlcnRpb24gdGltZS48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VGhlIG1vZGlmaWVkIGl0ZW0gd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBpdGVtcyBpbiB0aGUgYXBwcm9wcmlhdGUKLWRyYXdlci48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDAxLmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIj5TbmlwcGV0cyB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjYuaHRtbCIgdGl0bGU9IlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4gVGhlIHZpZXcgY2FuIGJlIGV4dGVuZGVkIGJhc2VkIG9uIGFkZGl0aW9uYWwgb2JqZWN0cyB0aGF0IHlvdSBkZWZpbmUgYW5kIGluY2x1ZGUuIj5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNC5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcgYnkgYWRkaW5nIGEgbmV3IGRyYXdlci4iPkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDE1Lmh0bWwiIHRpdGxlPSIiPkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDE2Lmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBkZWxldGUgb3IgaGlkZSBkcmF3ZXJzIGFuZCBpdGVtcyBpbiB0aGUgU25pcHBldHMgdmlldy4iPkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yCi1kcmF3ZXJzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIzLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZDgwNjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIzLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDIzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FbmFibGluZyBjb250ZW50IGFzc2lzdCBmb3IgSlNQIGZpbGVzPC90aXRsZT4NCi08c2hvcnRkZXNjPkhhdmluZyB0aGUgcHJvcGVyIGZpbGVzIGRlZmluZWQgaW4gdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJ1aWxkIGNsYXNzIHBhdGggaXMgZXNzZW50aWFsIGZvciBjb250ZW50DQotYXNzaXN0IHRvIHdvcmsgcHJvcGVybHkgaW4gSlNQIGZpbGVzLiBJdCBpcyBhbHNvIGVzc2VudGlhbCBmb3IgdGhlIGxpbmtzIGJ1aWxkZXINCi10byBiZSBhYmxlIHRvIGNvcnJlY3RseSByZXNvbHZlIGxpbmtzIHRvIHNlcnZsZXRzIG9yIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJlYW5zDQotaW4gSlNQIGFuZCBIVE1MIGZpbGVzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmNvbnRlbnQgYXNzaXN0YW5jZTxpbmRleHRlcm0+ZW5hYmxpbmcgZm9yIEpTUCBmaWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+SlNQIGZpbGVzPGluZGV4dGVybT5lbmFibGluZyBjb250ZW50IGFzc2lzdGFuY2U8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi0NCi0NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PlRvIGVuYWJsZSBjb250ZW50IGFzc2lzdCBmb3IgSlNQIGZpbGVzOjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5UbyBkZXRlcm1pbmUgd2hldGhlciB0aGUgYnVpbGQgcGF0aCBpcyBjb3JyZWN0LCBzZWxlY3QgPHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+IGZyb20NCi10aGUgcHJvamVjdCdzIHBvcC11cCBtZW51LiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgPHVpY29udHJvbD5KYXZhIEJ1aWxkIFBhdGg8L3VpY29udHJvbD4sIGFuZCB0aGVuIHRoZSA8dWljb250cm9sPkxpYnJhcmllczwvdWljb250cm9sPiBwYWdlLiA8L2NtZD4NCi08aW5mbz5Zb3Ugc2hvdWxkIHNlZSB0aGUgZm9sbG93aW5nIGZpbGVzOjx1bD4NCi08bGk+ajJlZS5qYXI8L2xpPg0KLTxsaT5ydC5qYXIgPC9saT4NCi08bGk+c2VydmxldC5qYXI8L2xpPg0KLTxsaT53ZWJjb250YWluZXIuamFyPC9saT4NCi08L3VsPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB0aGV5IGFyZSBub3QgcHJlc2VudCwgYWRkIHRoZW0gYXMgRXh0ZXJuYWwgSkFSIGZpbGVzLiBZb3UgbWF5DQotaGF2ZSB5b3VyIG93biB2ZXJzaW9ucyBvZiB0aGVzZSBmaWxlcywgZGVwZW5kaW5nIG9uIHRoZSBsZXZlbCBvZiBKREsgb3IgU2VydmxldA0KLUFQSSBmb3Igd2hpY2ggeW91IGFyZSBkZXZlbG9waW5nLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdXIgV2ViIGFwcGxpY2F0aW9ucyByZWZlcmVuY2Ugb3RoZXIgSkFScywgeW91IGNhbiBwbGFjZSB0aGVtDQotaW4gdGhlIGJ1aWxkIHBhdGggYXMgZm9sbG93czo8L2NtZD4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5Vc2UgdGhlIDx1aWNvbnRyb2w+QWRkIEpBUnM8L3VpY29udHJvbD4gYnV0dG9uIG9uIHRoZSBMaWJyYXJ5DQotcGFnZS4gWW91IG11c3QgZW5zdXJlIHRoYXQgdGhlIEpBUiBmaWxlIGlzIGF2YWlsYWJsZSB0byB0aGUgc2VydmVyIGJ5IHByb3Blcmx5DQotY29uZmlndXJpbmcgdGhlIHNlcnZlci48L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5BZGQgdGhlIEpBUnMgdG8gdGhlIDxmaWxlcGF0aD5XRUItSU5GL2xpYjwvZmlsZXBhdGg+IGRpcmVjdG9yeS4NCi1UaGV5IHdpbGwgYmUgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgYnVpbGQgcGF0aCBhbmQgZGVwbG95ZWQgdG8gdGhlIHNlcnZlcg0KLWluIGFzIHBhcnQgb2YgdGhlIHByb2plY3QgV0FSLjwvY21kPjwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDYuZGl0YSI+PGxpbmt0ZXh0PkNvbnRlbnQgYXNzaXN0PC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDUuZGl0YSI+PGxpbmt0ZXh0PkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlIGluIHN0cnVjdHVyZWQNCi10ZXh0IGVkaXRvcnM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI4LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDAwLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcw0KLS0gb3ZlcnZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwYTg2OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVuYWJsaW5nIGNvbnRlbnQgYXNzaXN0IGZvciBKU1AgZmlsZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSGF2aW5nIHRoZSBwcm9wZXIgZmlsZXMgZGVmaW5lZCBpbiB0aGUgSmF2YSBidWlsZCBjbGFzcyBwYXRoIGlzIGVzc2VudGlhbCBmb3IgY29udGVudCBhc3Npc3QgdG8gd29yayBwcm9wZXJseSBpbiBKU1AgZmlsZXMuIEl0IGlzIGFsc28gZXNzZW50aWFsIGZvciB0aGUgbGlua3MgYnVpbGRlciB0byBiZSBhYmxlIHRvIGNvcnJlY3RseSByZXNvbHZlIGxpbmtzIHRvIHNlcnZsZXRzIG9yIEphdmEgYmVhbnMgaW4gSlNQIGFuZCBIVE1MIGZpbGVzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJIYXZpbmcgdGhlIHByb3BlciBmaWxlcyBkZWZpbmVkIGluIHRoZSBKYXZhIGJ1aWxkIGNsYXNzIHBhdGggaXMgZXNzZW50aWFsIGZvciBjb250ZW50IGFzc2lzdCB0byB3b3JrIHByb3Blcmx5IGluIEpTUCBmaWxlcy4gSXQgaXMgYWxzbyBlc3NlbnRpYWwgZm9yIHRoZSBsaW5rcyBidWlsZGVyIHRvIGJlIGFibGUgdG8gY29ycmVjdGx5IHJlc29sdmUgbGlua3MgdG8gc2VydmxldHMgb3IgSmF2YSBiZWFucyBpbiBKU1AgYW5kIEhUTUwgZmlsZXMuIiAvPgotPG1ldGEgY29udGVudD0iY29udGVudCBhc3Npc3RhbmNlLCBlbmFibGluZyBmb3IgSlNQIGZpbGVzLCBKU1AgZmlsZXMsIGVuYWJsaW5nIGNvbnRlbnQgYXNzaXN0YW5jZSIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbnRlbnQgYXNzaXN0YW5jZSwgZW5hYmxpbmcgZm9yIEpTUCBmaWxlcywgSlNQIGZpbGVzLCBlbmFibGluZyBjb250ZW50IGFzc2lzdGFuY2UiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA2Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwNS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI4Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDIzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RW5hYmxpbmcgY29udGVudCBhc3Npc3QgZm9yIEpTUCBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAyMyI+PGEgbmFtZT0idHNyY2VkdDAyMyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RW5hYmxpbmcgY29udGVudCBhc3Npc3QgZm9yIEpTUCBmaWxlczwvaDE+Ci0KLQotCi08ZGl2PjxwPkhhdmluZyB0aGUgcHJvcGVyIGZpbGVzIGRlZmluZWQgaW4gdGhlIEphdmHihKIgYnVpbGQgY2xhc3MgcGF0aCBpcyBlc3NlbnRpYWwgZm9yIGNvbnRlbnQKLWFzc2lzdCB0byB3b3JrIHByb3Blcmx5IGluIEpTUCBmaWxlcy4gSXQgaXMgYWxzbyBlc3NlbnRpYWwgZm9yIHRoZSBsaW5rcyBidWlsZGVyCi10byBiZSBhYmxlIHRvIGNvcnJlY3RseSByZXNvbHZlIGxpbmtzIHRvIHNlcnZsZXRzIG9yIEphdmEgYmVhbnMKLWluIEpTUCBhbmQgSFRNTCBmaWxlcy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGVuYWJsZSBjb250ZW50IGFzc2lzdCBmb3IgSlNQIGZpbGVzOjwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBidWlsZCBwYXRoIGlzIGNvcnJlY3QsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPiBmcm9tCi10aGUgcHJvamVjdCdzIHBvcC11cCBtZW51LiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SmF2YSBCdWlsZCBQYXRoPC9zcGFuPiwgYW5kIHRoZW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkxpYnJhcmllczwvc3Bhbj4gcGFnZS4gPC9zcGFuPgotIFlvdSBzaG91bGQgc2VlIHRoZSBmb2xsb3dpbmcgZmlsZXM6PHVsPgotPGxpPmoyZWUuamFyPC9saT4KLQotPGxpPnJ0LmphciA8L2xpPgotCi08bGk+c2VydmxldC5qYXI8L2xpPgotCi08bGk+d2ViY29udGFpbmVyLmphcjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHRoZXkgYXJlIG5vdCBwcmVzZW50LCBhZGQgdGhlbSBhcyBFeHRlcm5hbCBKQVIgZmlsZXMuIFlvdSBtYXkKLWhhdmUgeW91ciBvd24gdmVyc2lvbnMgb2YgdGhlc2UgZmlsZXMsIGRlcGVuZGluZyBvbiB0aGUgbGV2ZWwgb2YgSkRLIG9yIFNlcnZsZXQKLUFQSSBmb3Igd2hpY2ggeW91IGFyZSBkZXZlbG9waW5nLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdXIgV2ViIGFwcGxpY2F0aW9ucyByZWZlcmVuY2Ugb3RoZXIgSkFScywgeW91IGNhbiBwbGFjZSB0aGVtCi1pbiB0aGUgYnVpbGQgcGF0aCBhcyBmb2xsb3dzOjwvc3Bhbj4KLTxvbCB0eXBlPSJhIj4KLTxsaT48c3Bhbj5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBKQVJzPC9zcGFuPiBidXR0b24gb24gdGhlIExpYnJhcnkKLXBhZ2UuIFlvdSBtdXN0IGVuc3VyZSB0aGF0IHRoZSBKQVIgZmlsZSBpcyBhdmFpbGFibGUgdG8gdGhlIHNlcnZlciBieSBwcm9wZXJseQotY29uZmlndXJpbmcgdGhlIHNlcnZlci48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkFkZCB0aGUgSkFScyB0byB0aGUgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj5XRUItSU5GL2xpYjwvc3Bhbj4gZGlyZWN0b3J5LgotVGhleSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIGJ1aWxkIHBhdGggYW5kIGRlcGxveWVkIHRvIHRoZSBzZXJ2ZXIKLWluIGFzIHBhcnQgb2YgdGhlIHByb2plY3QgV0FSLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDYuaHRtbCIgdGl0bGU9IkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoZSBwbGFjZW1lbnQgb2YgdGhlIGN1cnNvciBpbiB0aGUgc291cmNlIGZpbGUgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50IGFzc2lzdCB0byBvZmZlciBzdWdnZXN0aW9ucyBmb3IgY29tcGxldGlvbi4iPkNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDUuaHRtbCIgdGl0bGU9IlRvIGdldCBoZWxwIGluIGFkZGluZyBtYXJrdXAgdG8gYSBmaWxlLCB5b3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIENvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIj5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkCi10ZXh0IGVkaXRvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjguaHRtbCIgdGl0bGU9IkpTUCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDAwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC4iPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzCi0tIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NzVlOTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDI0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC90aXRsZT4NCi08c2hvcnRkZXNjPkhUTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkDQotY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzDQotcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+SFRNTDxpbmRleHRlcm0+dGVtcGxhdGVzPGluZGV4dGVybT5yZW1vdmluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+dGVtcGxhdGVzPGluZGV4dGVybT5IVE1MPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5IVE1MPGluZGV4dGVybT50ZW1wbGF0ZXM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLQ0KLQ0KLQ0KLQ0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPkZvciBleGFtcGxlLCB5b3UgbWF5IHdvcmsgb24gYSBncm91cCBvZiBIVE1MIHBhZ2VzIHRoYXQgc2hvdWxkDQotYWxsIGNvbnRhaW4gYSB0YWJsZSB3aXRoIGEgc3BlY2lmaWMgYXBwZWFyYW5jZS4gQ3JlYXRlIGEgdGVtcGxhdGUgdGhhdCBjb250YWlucw0KLXRoZSB0YWdzIGZvciB0aGF0IHRhYmxlLCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgYW5kIGF0dHJpYnV0ZQ0KLXZhbHVlcyBmb3IgZWFjaCB0YWcuIChZb3UgY2FuIGNvcHkgYW5kIHBhc3RlIHRoZSB0YWdzIGZyb20gYSBzdHJ1Y3R1cmVkIHRleHQNCi1lZGl0b3IgaW50byB0aGUgdGVtcGxhdGUncyA8dWljb250cm9sPlBhdHRlcm48L3VpY29udHJvbD4gZmllbGQuKSBUaGVuIHNlbGVjdA0KLXRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSBmcm9tIGEgY29udGVudCBhc3Npc3QgcHJvcG9zYWwgbGlzdCB3aGVuZXZlciB5b3UNCi13YW50IHRvIGluc2VydCB5b3VyIGN1c3RvbSB0YWJsZSBpbnRvIGFuIEhUTUwgb3IgWEhUTUwgZmlsZS48L3A+PHA+VG8gYWRkDQotYSBuZXcgSFRNTCB0ZW1wbGF0ZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5Gcm9tIHRoZSA8dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPiBtZW51LCBzZWxlY3QgPHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJlZmVyZW5jZXMgcGFnZSwgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPldlYiBhbmQNCi1YTUw8L3VpY29udHJvbD48dWljb250cm9sPkhUTUwgRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPkhUTUwgVGVtcGxhdGVzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD4uIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkVudGVyIHRoZSBuZXcgdGVtcGxhdGUgbmFtZSAoYSB0ZXh0IHN0cmluZykgYW5kIGEgYnJpZWYgZGVzY3JpcHRpb24NCi1vZiB0aGUgdGVtcGxhdGUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VXNpbmcgdGhlIDx1aWNvbnRyb2w+Q29udGV4dDwvdWljb250cm9sPiBkcm9wLWRvd24gbGlzdCwgc3BlY2lmeQ0KLXRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsIGxpc3Qgd2hlbiBjb250ZW50DQotYXNzaXN0IGlzIHJlcXVlc3RlZC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5QYXR0ZXJuPC91aWNvbnRyb2w+IGZpZWxkLCBlbnRlciB0aGUgYXBwcm9wcmlhdGUNCi10YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzICh0aGUgY29udGVudCBvZiB0aGUgdGVtcGxhdGUpIHRvIGJlDQotaW5zZXJ0ZWQgYnkgY29udGVudCBhc3Npc3QuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8dWljb250cm9sPlZhcmlhYmxlPC91aWNvbnRyb2w+IGJ1dHRvbg0KLWFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLjwvY21kPjxzdGVweG1wPkZvciBleGFtcGxlLCB0aGUgPHZhcm5hbWU+d29yZF9zZWxlY3Rpb248L3Zhcm5hbWU+IHZhcmlhYmxlDQotaW5kaWNhdGVzIHRoZSB3b3JkIHRoYXQgaXMgc2VsZWN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0ZW1wbGF0ZSBpbnNlcnRpb24sDQotYW5kIHRoZSA8dmFybmFtZT5jdXJzb3I8L3Zhcm5hbWU+IHZhcmlhYmxlIGRldGVybWluZXMgd2hlcmUgdGhlIGN1cnNvciB3aWxsDQotYmUgYWZ0ZXIgdGhlIHRlbXBsYXRlIGlzIGluc2VydGVkIGluIHRoZSBIVE1MIGRvY3VtZW50Ljwvc3RlcHhtcD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvIHNhdmUgdGhlIG5ldyB0ZW1wbGF0ZS48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT48cD5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUNCi1zYW1lIFByZWZlcmVuY2VzIHBhZ2UuIElmIHlvdSBoYXZlIG1vZGlmaWVkIGEgZGVmYXVsdCB0ZW1wbGF0ZSwgeW91IGNhbiByZXN0b3JlDQotaXQgdG8gaXRzIGRlZmF1bHQgdmFsdWUuIFlvdSBjYW4gYWxzbyByZXN0b3JlIGEgcmVtb3ZlZCB0ZW1wbGF0ZSBpZiB5b3UgaGF2ZQ0KLW5vdCBleGl0ZWQgZnJvbSB0aGUgd29ya2JlbmNoIHNpbmNlIGl0IHdhcyByZW1vdmVkLjwvcD48cD5JZiB5b3UgaGF2ZSBhIHRlbXBsYXRlDQotdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlIGJ1dCB5b3Ugbm8gbG9uZ2VyIHdhbnQgdGhlIHRlbXBsYXRlIHRvIGFwcGVhcg0KLWluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LCBnbyB0byB0aGUgVGVtcGxhdGVzIHByZWZlcmVuY2VzIHBhZ2UgYW5kIHVuY2hlY2sNCi1pdHMgY2hlY2sgYm94LjwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjcuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlDQotdGVtcGxhdGVzIC0gb3ZlcnZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI4LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI5LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDAwLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcw0KLS0gb3ZlcnZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE2YTQwNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkhUTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSFRNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkhUTUwsIHRlbXBsYXRlcywgcmVtb3ZpbmcsIGFkZGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkhUTUwsIHRlbXBsYXRlcywgcmVtb3ZpbmcsIGFkZGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI4Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjkuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwMC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMjQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDI0Ij48YSBuYW1lPSJ0c3JjZWR0MDI0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC9oMT4KLQotCi0KLTxkaXY+PHA+SFRNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQKLWNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcwotcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+Rm9yIGV4YW1wbGUsIHlvdSBtYXkgd29yayBvbiBhIGdyb3VwIG9mIEhUTUwgcGFnZXMgdGhhdCBzaG91bGQKLWFsbCBjb250YWluIGEgdGFibGUgd2l0aCBhIHNwZWNpZmljIGFwcGVhcmFuY2UuIENyZWF0ZSBhIHRlbXBsYXRlIHRoYXQgY29udGFpbnMKLXRoZSB0YWdzIGZvciB0aGF0IHRhYmxlLCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgYW5kIGF0dHJpYnV0ZQotdmFsdWVzIGZvciBlYWNoIHRhZy4gKFlvdSBjYW4gY29weSBhbmQgcGFzdGUgdGhlIHRhZ3MgZnJvbSBhIHN0cnVjdHVyZWQgdGV4dAotZWRpdG9yIGludG8gdGhlIHRlbXBsYXRlJ3MgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybjwvc3Bhbj4gZmllbGQuKSBUaGVuIHNlbGVjdAotdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIGZyb20gYSBjb250ZW50IGFzc2lzdCBwcm9wb3NhbCBsaXN0IHdoZW5ldmVyIHlvdQotd2FudCB0byBpbnNlcnQgeW91ciBjdXN0b20gdGFibGUgaW50byBhbiBIVE1MIG9yIFhIVE1MIGZpbGUuPC9wPgotPHA+VG8gYWRkCi1hIG5ldyBIVE1MIHRlbXBsYXRlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLSA8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+IG1lbnUsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJlZmVyZW5jZXMgcGFnZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZAotWE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUwgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRNTCBUZW1wbGF0ZXM8L3NwYW4+Ci08L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4uIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkVudGVyIHRoZSBuZXcgdGVtcGxhdGUgbmFtZSAoYSB0ZXh0IHN0cmluZykgYW5kIGEgYnJpZWYgZGVzY3JpcHRpb24KLW9mIHRoZSB0ZW1wbGF0ZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Vc2luZyB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udGV4dDwvc3Bhbj4gZHJvcC1kb3duIGxpc3QsIHNwZWNpZnkKLXRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsIGxpc3Qgd2hlbiBjb250ZW50Ci1hc3Npc3QgaXMgcmVxdWVzdGVkLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuPC9zcGFuPiBmaWVsZCwgZW50ZXIgdGhlIGFwcHJvcHJpYXRlCi10YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzICh0aGUgY29udGVudCBvZiB0aGUgdGVtcGxhdGUpIHRvIGJlCi1pbnNlcnRlZCBieSBjb250ZW50IGFzc2lzdC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCB0byBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhcmlhYmxlPC9zcGFuPiBidXR0b24KLWFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLjwvc3Bhbj4gRm9yIGV4YW1wbGUsIHRoZSA8dmFyIGNsYXNzPSJ2YXJuYW1lIj53b3JkX3NlbGVjdGlvbjwvdmFyPiB2YXJpYWJsZQotaW5kaWNhdGVzIHRoZSB3b3JkIHRoYXQgaXMgc2VsZWN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0ZW1wbGF0ZSBpbnNlcnRpb24sCi1hbmQgdGhlIDx2YXIgY2xhc3M9InZhcm5hbWUiPmN1cnNvcjwvdmFyPiB2YXJpYWJsZSBkZXRlcm1pbmVzIHdoZXJlIHRoZSBjdXJzb3Igd2lsbAotYmUgYWZ0ZXIgdGhlIHRlbXBsYXRlIGlzIGluc2VydGVkIGluIHRoZSBIVE1MIGRvY3VtZW50LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvIHNhdmUgdGhlIG5ldyB0ZW1wbGF0ZS48L3NwYW4+Ci08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUKLXNhbWUgUHJlZmVyZW5jZXMgcGFnZS4gSWYgeW91IGhhdmUgbW9kaWZpZWQgYSBkZWZhdWx0IHRlbXBsYXRlLCB5b3UgY2FuIHJlc3RvcmUKLWl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUKLW5vdCBleGl0ZWQgZnJvbSB0aGUgd29ya2JlbmNoIHNpbmNlIGl0IHdhcyByZW1vdmVkLjwvcD4KLTxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUKLXRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IHRoZSB0ZW1wbGF0ZSB0byBhcHBlYXIKLWluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LCBnbyB0byB0aGUgVGVtcGxhdGVzIHByZWZlcmVuY2VzIHBhZ2UgYW5kIHVuY2hlY2sKLWl0cyBjaGVjayBib3guPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI3Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBwcm92aWRlcyB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlCi10ZW1wbGF0ZXMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyOC5odG1sIiB0aXRsZT0iSlNQIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjkuaHRtbCIgdGl0bGU9IlhNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBhIGNvbW1lbnQgdGVtcGxhdGUsIGEgY2h1bmsgb2YgcHJlZGVmaW5lZCBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhhdCB0ZW1wbGF0ZSwgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcwotLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTNhODNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA5LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPD9QdWIgU3R5IF9kaXNwbGF5IEZvbnRDb2xvcj0icmVkIj8+DQotPHRhc2sgaWQ9InRzcmNlZHQwMjUiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxuYXZ0aXRsZT5TZXR0aW5nIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgcHJlZmVyZW5jZXM8L25hdnRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtDQota2V5cmVmPSJ0c3JjZWR0MDI1fDF8c3RydWN0dXJlZHRleHRlZGl0b3JzcHJlZmVyZW5jZXNldHRpbmciDQotc3RhdHVzPSJjaGFuZ2VkIj5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczxpbmRleHRlcm0+cHJlZmVyZW5jZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PllvdSBjYW4gY3VzdG9taXplIHlvdXIgd29ya2luZyBlbnZpcm9ubWVudCBieSBzcGVjaWZ5aW5nDQotcHJlZmVyZW5jZXMgZm9yIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgbWFpbiBtZW51LCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD4NCi08dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IG9uZSBvZiB0aGUgY2hvaWNlcyB0aGF0IGFyZSBzaG93biBpbiB0aGUgZm9sbG93aW5nDQotdGFibGU6PC9jbWQ+DQotPGNob2ljZXRhYmxlIHJlbGNvbHdpZHRoPSIxMCogMzAqIj4NCi08Y2hoZWFkPjxjaG9wdGlvbmhkPkl0ZW08L2Nob3B0aW9uaGQ+PGNoZGVzY2hkPk1lbnUgcGF0aDwvY2hkZXNjaGQ+DQotPC9jaGhlYWQ+DQotPGNocm93PjxjaG9wdGlvbj5Bbm5vdGF0aW9uIHNldHRpbmdzPC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPjx1aWNvbnRyb2w+RWRpdG9yczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+QW5ub3RhdGlvbnM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5DaGFyYWN0ZXIgZW5jb2Rpbmc8L2Nob3B0aW9uPjxjaGRlc2M+PHVpY29udHJvbD5XZWINCi1hbmQgWE1MPC91aWNvbnRyb2w+LCB0aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNob2ljZXM6IDx1aWNvbnRyb2w+Q1NTDQotRmlsZXM8L3VpY29udHJvbD4sIDx1aWNvbnRyb2w+SFRNTCBGaWxlczwvdWljb250cm9sPiwgPHVpY29udHJvbD5KU1ANCi1GaWxlczwvdWljb250cm9sPiwgPHVpY29udHJvbD4qWE1MIEZpbGVzICggKm5vdCBpbXBsZW1lbnRlZCBpbiBXVFApPC91aWNvbnRyb2w+PC9jaGRlc2M+DQotPC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkNvZGUgZm9sZGluZzwvY2hvcHRpb24+PGNoZGVzYz48bWVudWNhc2NhZGU+PHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5FZGl0b3JzPC91aWNvbnRyb2w+PHVpY29udHJvbD5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+PC9jaGRlc2M+PC9jaHJvdz48P1B1YiBDYXJldCA1OD8+DQotPGNocm93PjxjaG9wdGlvbj5Db250ZW50IGFzc2lzdDogSFRNTDwvY2hvcHRpb24+PGNoZGVzYz48bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5XZWIgYW5kIFhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+SFRNTCBGaWxlczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+SFRNTCBTb3VyY2U8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5Db250ZW50IGFzc2lzdDogSmF2YVNjcmlwdDwvY2hvcHRpb24+PGNoZGVzYz48bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5XZWIgYW5kIFhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+SmF2YVNjcmlwdCBGaWxlczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+SmF2YVNjcmlwdCBTb3VyY2U8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5Db250ZW50IGFzc2lzdDogWE1MPC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPldlYiBhbmQgWE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD4qWE1MIEZpbGVzICgqbm90IGltcGxlbWVudGVkDQotaW4gV1RQKTwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MIFNvdXJjZTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+PC9jaGRlc2M+DQotPC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkVkaXRvciBhcHBlYXJhbmNlPC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPjx1aWNvbnRyb2w+RWRpdG9yczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+U3RydWN0dXJlZCBUZXh0IEVkaXRvcjwvdWljb250cm9sPjx1aWNvbnRyb2w+QXBwZWFyYW5jZTwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+PC9jaGRlc2M+PC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkVkaXRvciBmb250PC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT48dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+Q29sb3JzIGFuZCBGb250czwvdWljb250cm9sPjx1aWNvbnRyb2w+U3RydWN0dXJlZCBUZXh0DQotRWRpdG9yPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT48L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+RWRpdG9yIG5hdmlnYXRpb248L2Nob3B0aW9uPjxjaGRlc2M+PG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+V29ya2JlbmNoPC91aWNvbnRyb2w+PHVpY29udHJvbD5FZGl0b3JzPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yPC91aWNvbnRyb2w+PHVpY29udHJvbD5OYXZpZ2F0aW9uPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT48L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+RmlsZS10eXBlLXNwZWNpZmljIHNldHRpbmdzPC9jaG9wdGlvbj48Y2hkZXNjPjx1aWNvbnRyb2w+V2ViDQotYW5kIFhNTDwvdWljb250cm9sPiwgdGhlbiBuYXZpZ2F0ZSB0byB0aGUgZmlsZSB0eXBlIGFuZCBwYXJ0aWN1bGFyDQotc2V0dGluZzwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5Ib3ZlciBoZWxwPC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT48dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+RWRpdG9yczwvdWljb250cm9sPjx1aWNvbnRyb2w+U3RydWN0dXJlZCBUZXh0IEVkaXRvcjwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+SG92ZXJzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT48L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+S2V5IGJpbmRpbmdzPC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT48dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+S2V5czwvdWljb250cm9sPjx1aWNvbnRyb2w+S2V5Ym9hcmQgU2hvcnRjdXRzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gdGhlbiBpbiB0aGUgPHVpY29udHJvbD5DYXRlZ29yeTwvdWljb250cm9sPiBmaWVsZCBzcGVjaWZ5IDx1aWNvbnRyb2w+U291cmNlPC91aWNvbnRyb2w+PC9jaGRlc2M+DQotPC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPlNwZWxsIGNoZWNraW5nPC9jaG9wdGlvbj48Y2hkZXNjPjx1aWNvbnRyb2w+U3BlbGwNCi1DaGVjazwvdWljb250cm9sPjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5TeW50YXggY2hlY2tpbmc8L2Nob3B0aW9uPjxjaGRlc2M+PG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+V29ya2JlbmNoPC91aWNvbnRyb2w+PHVpY29udHJvbD5FZGl0b3JzPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yPC91aWNvbnRyb2w+PHVpY29udHJvbD5BcHBlYXJhbmNlPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gdGhlbiBjaGVjayBvciB1bmNoZWNrIHRoZSA8dWljb250cm9sPkFuYWx5emUgYW5ub3RhdGlvbnMNCi13aGlsZSB0eXBpbmc8L3VpY29udHJvbD4gYm94LjwvY2hkZXNjPjwvY2hyb3c+DQotPC9jaG9pY2V0YWJsZT4NCi08aW5mbz48bm90ZT5Zb3UgY2Fubm90IHNldCA8dWljb250cm9sPldlYiBhbmQgWE1MPC91aWNvbnRyb2w+IHByZWZlcmVuY2VzDQotdW5sZXNzIHRoZSBDb3JlIFhNTCBTdXBwb3J0IGNhcGFiaWxpdHkgKDxtZW51Y2FzY2FkZT48dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+Q2FwYWJpbGl0aWVzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4pIGlzIGVuYWJsZWQsIGFuZA0KLXlvdSBjYW5ub3Qgc2V0IHByZWZlcmVuY2VzIGZvciBEVEQgZmlsZXMgdW5sZXNzIHRoZSBYTUwgRGV2ZWxvcG1lbnQNCi1jYXBhYmlsaXR5IGlzIGVuYWJsZWQuPC9ub3RlPjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3INCi1tYXJrdXAgbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMS5kaXRhIj48bGlua3RleHQ+U2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzDQotZm9yIG1hcmt1cCBsYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDEwLmRpdGEiPjxsaW5rdGV4dD5DaGVja2luZyBzcGVsbGluZzwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXANCi1sYW5ndWFnZXMgLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNTE2MD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc2M2RiMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgLz4KLTxtZXRhIGNvbnRlbnQ9InN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLCBwcmVmZXJlbmNlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLCBwcmVmZXJlbmNlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwMS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDEwLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDI1IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMjUiPjxhIG5hbWU9InRzcmNlZHQwMjUiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC9oMT4KLQotCi0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3UgY2FuIGN1c3RvbWl6ZSB5b3VyIHdvcmtpbmcgZW52aXJvbm1lbnQgYnkgc3BlY2lmeWluZyBwcmVmZXJlbmNlcwotZm9yIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLjwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBtYWluIG1lbnUsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3Qgb25lIG9mIHRoZSBjaG9pY2VzIHRoYXQgYXJlIHNob3duIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6PC9zcGFuPgotCi08dGFibGUgY2xhc3M9ImNob2ljZXRhYmxlYm9yZGVyIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgcnVsZXM9InJvd3MiIGZyYW1lPSJoc2lkZXMiIGJvcmRlcj0iMSI+Ci08dGhlYWQ+PHRyPjx0aCB2YWxpZ249ImJvdHRvbSIgaWQ9Ik4xMDA3MC1vcHRpb24iPkl0ZW08L3RoPgotPHRoIHZhbGlnbj0iYm90dG9tIiBpZD0iTjEwMDcwLWRlc2MiPk1lbnUgcGF0aDwvdGg+PC90cj48L3RoZWFkPgotPHRib2R5PgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtb3B0aW9uIiBpZD0iTjEwMDhBIj48c3Ryb25nPkFubm90YXRpb24gc2V0dGluZ3M8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtZGVzYyBOMTAwOEEiPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Bbm5vdGF0aW9uczwvc3Bhbj48L3NwYW4+PC90ZD4KLQotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLW9wdGlvbiIgaWQ9Ik4xMDBBRCI+PHN0cm9uZz5DaGFyYWN0ZXIgZW5jb2Rpbmc8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtZGVzYyBOMTAwQUQiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQgWE1MPC9zcGFuPiwKLXRoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgY2hvaWNlczogPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q1NTIEZpbGVzPC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRNTAotRmlsZXM8L3NwYW4+LCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5KU1AgRmlsZXM8L3NwYW4+LCA8c3BhbiBjbGFzcz0idWljb250cm9sIj4qWE1MIEZpbGVzCi0oICpub3QgaW1wbGVtZW50ZWQgaW4gV1RQKTwvc3Bhbj48L3RkPgotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLW9wdGlvbiIgaWQ9Ik4xMDBEOCI+PHN0cm9uZz5Db250ZW50IGFzc2lzdDogSFRNTDwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1kZXNjIE4xMDBEOCI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIKLWFuZCBYTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRNTCBGaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVE1MIFNvdXJjZTwvc3Bhbj4KLTwvc3Bhbj48L3RkPgotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLW9wdGlvbiIgaWQ9Ik4xMDBGQSI+PHN0cm9uZz5Db250ZW50IGFzc2lzdDogSmF2YVNjcmlwdDwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1kZXNjIE4xMDBGQSI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQgWE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkphdmFTY3JpcHQgRmlsZXM8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5KYXZhU2NyaXB0IFNvdXJjZTwvc3Bhbj48L3NwYW4+PC90ZD4KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1vcHRpb24iIGlkPSJOMTAxMUQiPjxzdHJvbmc+Q29udGVudCBhc3Npc3Q6IFhNTDwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1kZXNjIE4xMDExRCI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIKLWFuZCBYTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+KlhNTCBGaWxlcyAoKm5vdCBpbXBsZW1lbnRlZCBpbiBXVFApPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIFNvdXJjZTwvc3Bhbj48L3NwYW4+PC90ZD4KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1vcHRpb24iIGlkPSJOMTAxM0YiPjxzdHJvbmc+RWRpdG9yIGFwcGVhcmFuY2U8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtZGVzYyBOMTAxM0YiPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwZWFyYW5jZTwvc3Bhbj48L3NwYW4+PC90ZD4KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1vcHRpb24iIGlkPSJOMTAxNjciPjxzdHJvbmc+RWRpdG9yIGZvbnQ8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtZGVzYyBOMTAxNjciPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29sb3JzIGFuZCBGb250czwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yPC9zcGFuPgotPC9zcGFuPjwvdGQ+Ci08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtb3B0aW9uIiBpZD0iTjEwMThBIj48c3Ryb25nPkVkaXRvciBuYXZpZ2F0aW9uPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLWRlc2MgTjEwMThBIj48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaDwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXRvcnM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3RydWN0dXJlZCBUZXh0IEVkaXRvcjwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hdmlnYXRpb248L3NwYW4+PC9zcGFuPjwvdGQ+Ci08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtb3B0aW9uIiBpZD0iTjEwMUIyIj48c3Ryb25nPkZpbGUtdHlwZS1zcGVjaWZpYyBzZXR0aW5nczwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1kZXNjIE4xMDFCMiI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViCi1hbmQgWE1MPC9zcGFuPiwgdGhlbiBuYXZpZ2F0ZSB0byB0aGUgZmlsZSB0eXBlIGFuZCBwYXJ0aWN1bGFyIHNldHRpbmc8L3RkPgotCi08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtb3B0aW9uIiBpZD0iTjEwMUM3Ij48c3Ryb25nPkhvdmVyIGhlbHA8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtZGVzYyBOMTAxQzciPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SG92ZXJzPC9zcGFuPjwvc3Bhbj48L3RkPgotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLW9wdGlvbiIgaWQ9Ik4xMDFFRiI+PHN0cm9uZz5LZXkgYmluZGluZ3M8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtZGVzYyBOMTAxRUYiPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5czwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5LZXlib2FyZCBTaG9ydGN1dHM8L3NwYW4+PC9zcGFuPiB0aGVuCi1pbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q2F0ZWdvcnk8L3NwYW4+IGZpZWxkIHNwZWNpZnkgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U291cmNlPC9zcGFuPjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1vcHRpb24iIGlkPSJOMTAyMUUiPjxzdHJvbmc+U3BlbGwgY2hlY2tpbmc8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtZGVzYyBOMTAyMUUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNwZWxsIENoZWNrPC9zcGFuPjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1vcHRpb24iIGlkPSJOMTAyMzIiPjxzdHJvbmc+U3ludGF4IGNoZWNraW5nPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLWRlc2MgTjEwMjMyIj48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaDwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXRvcnM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3RydWN0dXJlZCBUZXh0IEVkaXRvcjwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGVhcmFuY2U8L3NwYW4+PC9zcGFuPiB0aGVuIGNoZWNrIG9yIHVuY2hlY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFuYWx5emUKLWFubm90YXRpb25zIHdoaWxlIHR5cGluZzwvc3Bhbj4gYm94LjwvdGQ+Ci08L3RyPgotCi08L3Rib2R5PjwvdGFibGU+Ci0KLSA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbm5vdCBzZXQgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZCBYTUw8L3NwYW4+IHByZWZlcmVuY2VzCi11bmxlc3MgdGhlIENvcmUgWE1MIFN1cHBvcnQgY2FwYWJpbGl0eSAoPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DYXBhYmlsaXRpZXM8L3NwYW4+PC9zcGFuPikgaXMgZW5hYmxlZCwgYW5kIHlvdSBjYW5ub3QKLXNldCBwcmVmZXJlbmNlcyBmb3IgRFREIGZpbGVzIHVubGVzcyB0aGUgWE1MIERldmVsb3BtZW50IGNhcGFiaWxpdHkgaXMgZW5hYmxlZC48L2Rpdj4KLQotPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDEuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIHNldCBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGZvciBXZWIgYW5kIFhNTCBmaWxlcy4gVGhlIGFubm90YXRpb24gcHJlZmVyZW5jZXMgaW5jbHVkZSB3aGV0aGVyIHRvIGFuYWx5emUgdGhlIHN5bnRhY3RpYyB2YWxpZGl0eSBvZiB5b3VyIGZpbGUgd2hpbGUgeW91IGFyZSB0eXBpbmcgYW5kIHdoYXQgY29sb3JzIHRvIHVzZSB0byBoaWdobGlnaHQgZXJyb3JzLCB3YXJuaW5ncywgdGFza3MsIHNlYXJjaCByZXN1bHRzLCBib29rbWFya3MsIGFuZCBvdGhlciB0ZXh0LiI+U2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGZvcgotbWFya3VwIGxhbmd1YWdlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxMC5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gY2hlY2sgc3BlbGxpbmcgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiI+Q2hlY2tpbmcgc3BlbGxpbmc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMKLS0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI2LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjYuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjZjkyNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjYuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMjYiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC90aXRsZT4NCi08c2hvcnRkZXNjPlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nDQotb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGgNCi1maWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiBUaGUgdmlldyBjYW4gYmUgZXh0ZW5kZWQgYmFzZWQgb24gYWRkaXRpb25hbCBvYmplY3RzDQotdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnNuaXBwZXRzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLQ0KLQ0KLQ0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+SW4gdGhlIFNuaXBwZXRzIHZpZXcgeW91IGNhbiBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgdGFza3M6PC9jb250ZXh0Pg0KLTxzdGVwcy11bm9yZGVyZWQ+DQotPHN0ZXA+PGNtZD5BZGQgc25pcHBldHMgZHJhd2VyczwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkFkZCBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RWRpdCBzbmlwcGV0IGl0ZW1zPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RGVsZXRlIG9yIGhpZGUgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHMtdW5vcmRlcmVkPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDEuZGl0YSI+PGxpbmt0ZXh0PlNuaXBwZXRzIHZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE0LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTUuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyMi5kaXRhIj48bGlua3RleHQ+RWRpdGluZyBzbmlwcGV0IGl0ZW1zPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNi5kaXRhIj48bGlua3RleHQ+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3INCi1kcmF3ZXJzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMC5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMNCi0tIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI2Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxODFlMWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI2Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9InNuaXBwZXRzLCBvdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InNuaXBwZXRzLCBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDEuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE1Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDAwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAyNiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDI2Ij48YSBuYW1lPSJ0c3JjZWR0MDI2Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvaDE+Ci0KLQotCi08ZGl2PjxwPlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nCi1vYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdOKEoiwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoCi1maWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiBUaGUgdmlldyBjYW4gYmUgZXh0ZW5kZWQgYmFzZWQgb24gYWRkaXRpb25hbCBvYmplY3RzCi10aGF0IHlvdSBkZWZpbmUgYW5kIGluY2x1ZGUuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5JbiB0aGUgU25pcHBldHMgdmlldyB5b3UgY2FuIHBlcmZvcm0gdGhlIGZvbGxvd2luZyB0YXNrczo8L2Rpdj4KLQotPHVsPgotPGxpPjxzcGFuPkFkZCBzbmlwcGV0cyBkcmF3ZXJzPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5BZGQgaXRlbXMgdG8gc25pcHBldHMgZHJhd2Vyczwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+RWRpdCBzbmlwcGV0IGl0ZW1zPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5EZWxldGUgb3IgaGlkZSBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnM8L3NwYW4+PC9saT4KLQotPC91bD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDAxLmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIj5TbmlwcGV0cyB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTQuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBleHBsYWlucyBob3cgdG8gY3VzdG9taXplIHRoZSBTbmlwcGV0cyB2aWV3IGJ5IGFkZGluZyBhIG5ldyBkcmF3ZXIuIj5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNS5odG1sIiB0aXRsZT0iIj5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyMi5odG1sIiB0aXRsZT0iIj5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTYuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGRlbGV0ZSBvciBoaWRlIGRyYXdlcnMgYW5kIGl0ZW1zIGluIHRoZSBTbmlwcGV0cyB2aWV3LiI+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IKLWRyYXdlcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMKLS0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI3LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjcuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzMjRlYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjcuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMjciIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlIHRlbXBsYXRlcyAtIG92ZXJ2aWV3PC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxuYXZ0aXRsZT5BZGRpbmcgbWFya3VwIGxhbmd1YWdlIHRlbXBsYXRlczwvbmF2dGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Db250ZW50IGFzc2lzdCBwcm92aWRlcyB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsDQotdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLA0KLWN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+bWFya3VwIGxhbmd1YWdlczxpbmRleHRlcm0+dGVtcGxhdGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT50ZW1wbGF0ZXM8aW5kZXh0ZXJtPm1hcmt1cCBsYW5ndWFnZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PlRlbXBsYXRlcyBhcmUgYXZhaWxhYmxlIGZvciB0aGUgZm9sbG93aW5nIG1hcmt1cCBsYW5ndWFnZXM6PHVsPg0KLTxsaT5IVE1MIG9yIFhIVE1MPC9saT4NCi08bGk+SlNQPC9saT4NCi08L3VsPjwvY29udGV4dD4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjguZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjkuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzDQotLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDFlNDVmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UgdGVtcGxhdGVzIC0gb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQ29udGVudCBhc3Npc3QgcHJvdmlkZXMgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9Im1hcmt1cCBsYW5ndWFnZXMsIHRlbXBsYXRlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9Im1hcmt1cCBsYW5ndWFnZXMsIHRlbXBsYXRlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI4Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjkuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwMC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMjciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZSB0ZW1wbGF0ZXMgLSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAyNyI+PGEgbmFtZT0idHNyY2VkdDAyNyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UgdGVtcGxhdGVzIC0gb3ZlcnZpZXc8L2gxPgotCi0KLQotCi08ZGl2PjxwPkNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwKLXRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwKLWN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UZW1wbGF0ZXMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIGZvbGxvd2luZyBtYXJrdXAgbGFuZ3VhZ2VzOjx1bD4KLTxsaT5IVE1MIG9yIFhIVE1MPC9saT4KLQotPGxpPkpTUDwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjQuaHRtbCIgdGl0bGU9IkhUTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjguaHRtbCIgdGl0bGU9IkpTUCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI5Lmh0bWwiIHRpdGxlPSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoYXQgdGVtcGxhdGUsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMKLS0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI4LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjguZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmODFkYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjguZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMjgiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlczwvdGl0bGU+DQotPHNob3J0ZGVzYz5KU1AgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkDQotY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzDQotcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0ga2V5cmVmPSJ0c3JjZWR0MDI4fDF8SlNQcGFnZXN0ZW1wbGF0ZXMiIHN0YXR1cz0iY2hhbmdlZCI+SlNQDQotZmlsZXM8aW5kZXh0ZXJtPnRlbXBsYXRlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0ga2V5cmVmPSJ0c3JjZWR0MDI4fDJ8dGVtcGxhdGVzSlNQcGFnZXMiDQotc3RhdHVzPSJuZXciPnRlbXBsYXRlczxpbmRleHRlcm0+SlNQIHBhZ2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+Rm9yIGV4YW1wbGUsIHlvdSBtYXkgd29yayBvbiBhIGdyb3VwIG9mIEpTUCBwYWdlcyB0aGF0IHNob3VsZA0KLWFsbCBjb250YWluIGEgdGFibGUgd2l0aCBhIHNwZWNpZmljIGFwcGVhcmFuY2UuIENyZWF0ZSBhIHRlbXBsYXRlIHRoYXQgY29udGFpbnMNCi10aGUgdGFncyBmb3IgdGhhdCB0YWJsZSwgaW5jbHVkaW5nIHRoZSBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIGFuZCBhdHRyaWJ1dGUNCi12YWx1ZXMgZm9yIGVhY2ggdGFnLiAoWW91IGNhbiBjb3B5IGFuZCBwYXN0ZSB0aGUgdGFncyBmcm9tIGEgc3RydWN0dXJlZCB0ZXh0DQotZWRpdG9yIGludG8gdGhlIHRlbXBsYXRlJ3MgPHVpY29udHJvbD5QYXR0ZXJuPC91aWNvbnRyb2w+IGZpZWxkLikgVGhlbiBzZWxlY3QNCi10aGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgZnJvbSBhIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FsIGxpc3Qgd2hlbmV2ZXIgeW91DQotd2FudCB0byBpbnNlcnQgeW91ciBjdXN0b20gdGFibGUgaW50byBhIEpTUCBmaWxlLjwvcD48cD5UbyBhZGQgYSBuZXcgSlNQIHRlbXBsYXRlLA0KLWNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPiA8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgPHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD4gbWVudSwgc2VsZWN0IDx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByZWZlcmVuY2VzIHBhZ2UsIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XZWIgYW5kDQotWE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5KU1AgRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPkpTUCBUZW1wbGF0ZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk5ldzwvdWljb250cm9sPi4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RW50ZXIgdGhlIG5ldyB0ZW1wbGF0ZSBuYW1lIChhIHRleHQgc3RyaW5nKSBhbmQgYSBicmllZiBkZXNjcmlwdGlvbg0KLW9mIHRoZSB0ZW1wbGF0ZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Vc2luZyB0aGUgPHVpY29udHJvbD5Db250ZXh0PC91aWNvbnRyb2w+IGRyb3AtZG93biBsaXN0LCBzcGVjaWZ5DQotdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHJvcG9zYWwgbGlzdCB3aGVuIGNvbnRlbnQNCi1hc3Npc3QgaXMgcmVxdWVzdGVkLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPlBhdHRlcm48L3VpY29udHJvbD4gZmllbGQsIGVudGVyIHRoZSBhcHByb3ByaWF0ZQ0KLXRhZ3MsIGF0dHJpYnV0ZXMsIG9yIGF0dHJpYnV0ZSB2YWx1ZXMgKHRoZSBjb250ZW50IG9mIHRoZSB0ZW1wbGF0ZSkgdG8gYmUNCi1pbnNlcnRlZCBieSBjb250ZW50IGFzc2lzdC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3Ugd2FudCB0byBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDx1aWNvbnRyb2w+VmFyaWFibGU8L3VpY29udHJvbD4gYnV0dG9uDQotYW5kIHNlbGVjdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5zZXJ0ZWQuPC9jbWQ+PHN0ZXB4bXA+Rm9yIGV4YW1wbGUsIHRoZSA8dmFybmFtZT53b3JkX3NlbGVjdGlvbjwvdmFybmFtZT4gdmFyaWFibGUNCi1pbmRpY2F0ZXMgdGhlIHdvcmQgdGhhdCBpcyBzZWxlY3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRlbXBsYXRlIGluc2VydGlvbiwNCi1hbmQgdGhlIDx2YXJuYW1lPmN1cnNvcjwvdmFybmFtZT4gdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGVyZSB0aGUgY3Vyc29yIHdpbGwNCi1iZSBhZnRlciB0aGUgdGVtcGxhdGUgaXMgaW5zZXJ0ZWQgaW4gdGhlIEhUTUwgZG9jdW1lbnQuPC9zdGVweG1wPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gdG8gc2F2ZSB0aGUgbmV3IHRlbXBsYXRlLjwvY21kPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPjxwPllvdSBjYW4gZWRpdCwgcmVtb3ZlLCBpbXBvcnQsIG9yIGV4cG9ydCBhIHRlbXBsYXRlIGJ5IHVzaW5nIHRoZQ0KLXNhbWUgUHJlZmVyZW5jZXMgcGFnZS4gSWYgeW91IGhhdmUgbW9kaWZpZWQgYSBkZWZhdWx0IHRlbXBsYXRlLCB5b3UgY2FuIHJlc3RvcmUNCi1pdCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gWW91IGNhbiBhbHNvIHJlc3RvcmUgYSByZW1vdmVkIHRlbXBsYXRlIGlmIHlvdSBoYXZlDQotbm90IGV4aXRlZCBmcm9tIHRoZSB3b3JrYmVuY2ggc2luY2UgaXQgd2FzIHJlbW92ZWQuPC9wPjxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUNCi10aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgYnV0IHlvdSBubyBsb25nZXIgd2FudCB0aGUgdGVtcGxhdGUgdG8gYXBwZWFyDQotaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QsIGdvIHRvIHRoZSBUZW1wbGF0ZXMgcHJlZmVyZW5jZXMgcGFnZSBhbmQgdW5jaGVjaw0KLWl0cyBjaGVjayBib3guPC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNy5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UNCi10ZW1wbGF0ZXMgLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjQuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI5LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDAwLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcw0KLS0gb3ZlcnZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI4Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2NDdmYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSlNQIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkpTUCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkpTUCBmaWxlcywgdGVtcGxhdGVzLCBKU1AgcGFnZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJKU1AgZmlsZXMsIHRlbXBsYXRlcywgSlNQIHBhZ2VzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI3Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyOS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDAwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAyOCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAyOCI+PGEgbmFtZT0idHNyY2VkdDAyOCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC9oMT4KLQotCi0KLTxkaXY+PHA+SlNQIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZAotY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzCi1wcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5Gb3IgZXhhbXBsZSwgeW91IG1heSB3b3JrIG9uIGEgZ3JvdXAgb2YgSlNQIHBhZ2VzIHRoYXQgc2hvdWxkCi1hbGwgY29udGFpbiBhIHRhYmxlIHdpdGggYSBzcGVjaWZpYyBhcHBlYXJhbmNlLiBDcmVhdGUgYSB0ZW1wbGF0ZSB0aGF0IGNvbnRhaW5zCi10aGUgdGFncyBmb3IgdGhhdCB0YWJsZSwgaW5jbHVkaW5nIHRoZSBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIGFuZCBhdHRyaWJ1dGUKLXZhbHVlcyBmb3IgZWFjaCB0YWcuIChZb3UgY2FuIGNvcHkgYW5kIHBhc3RlIHRoZSB0YWdzIGZyb20gYSBzdHJ1Y3R1cmVkIHRleHQKLWVkaXRvciBpbnRvIHRoZSB0ZW1wbGF0ZSdzIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhdHRlcm48L3NwYW4+IGZpZWxkLikgVGhlbiBzZWxlY3QKLXRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSBmcm9tIGEgY29udGVudCBhc3Npc3QgcHJvcG9zYWwgbGlzdCB3aGVuZXZlciB5b3UKLXdhbnQgdG8gaW5zZXJ0IHlvdXIgY3VzdG9tIHRhYmxlIGludG8gYSBKU1AgZmlsZS48L3A+Ci08cD5UbyBhZGQgYSBuZXcgSlNQIHRlbXBsYXRlLAotY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci0gPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiBtZW51LCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByZWZlcmVuY2VzIHBhZ2UsIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQKLVhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5KU1AgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SlNQIFRlbXBsYXRlczwvc3Bhbj4KLTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPi4gPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RW50ZXIgdGhlIG5ldyB0ZW1wbGF0ZSBuYW1lIChhIHRleHQgc3RyaW5nKSBhbmQgYSBicmllZiBkZXNjcmlwdGlvbgotb2YgdGhlIHRlbXBsYXRlLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlVzaW5nIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZXh0PC9zcGFuPiBkcm9wLWRvd24gbGlzdCwgc3BlY2lmeQotdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHJvcG9zYWwgbGlzdCB3aGVuIGNvbnRlbnQKLWFzc2lzdCBpcyByZXF1ZXN0ZWQuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhdHRlcm48L3NwYW4+IGZpZWxkLCBlbnRlciB0aGUgYXBwcm9wcmlhdGUKLXRhZ3MsIGF0dHJpYnV0ZXMsIG9yIGF0dHJpYnV0ZSB2YWx1ZXMgKHRoZSBjb250ZW50IG9mIHRoZSB0ZW1wbGF0ZSkgdG8gYmUKLWluc2VydGVkIGJ5IGNvbnRlbnQgYXNzaXN0Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIGluc2VydCBhIHZhcmlhYmxlLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFyaWFibGU8L3NwYW4+IGJ1dHRvbgotYW5kIHNlbGVjdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5zZXJ0ZWQuPC9zcGFuPiBGb3IgZXhhbXBsZSwgdGhlIDx2YXIgY2xhc3M9InZhcm5hbWUiPndvcmRfc2VsZWN0aW9uPC92YXI+IHZhcmlhYmxlCi1pbmRpY2F0ZXMgdGhlIHdvcmQgdGhhdCBpcyBzZWxlY3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRlbXBsYXRlIGluc2VydGlvbiwKLWFuZCB0aGUgPHZhciBjbGFzcz0idmFybmFtZSI+Y3Vyc29yPC92YXI+IHZhcmlhYmxlIGRldGVybWluZXMgd2hlcmUgdGhlIGN1cnNvciB3aWxsCi1iZSBhZnRlciB0aGUgdGVtcGxhdGUgaXMgaW5zZXJ0ZWQgaW4gdGhlIEhUTUwgZG9jdW1lbnQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gdG8gc2F2ZSB0aGUgbmV3IHRlbXBsYXRlLjwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPllvdSBjYW4gZWRpdCwgcmVtb3ZlLCBpbXBvcnQsIG9yIGV4cG9ydCBhIHRlbXBsYXRlIGJ5IHVzaW5nIHRoZQotc2FtZSBQcmVmZXJlbmNlcyBwYWdlLiBJZiB5b3UgaGF2ZSBtb2RpZmllZCBhIGRlZmF1bHQgdGVtcGxhdGUsIHlvdSBjYW4gcmVzdG9yZQotaXQgdG8gaXRzIGRlZmF1bHQgdmFsdWUuIFlvdSBjYW4gYWxzbyByZXN0b3JlIGEgcmVtb3ZlZCB0ZW1wbGF0ZSBpZiB5b3UgaGF2ZQotbm90IGV4aXRlZCBmcm9tIHRoZSB3b3JrYmVuY2ggc2luY2UgaXQgd2FzIHJlbW92ZWQuPC9wPgotPHA+SWYgeW91IGhhdmUgYSB0ZW1wbGF0ZQotdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlIGJ1dCB5b3Ugbm8gbG9uZ2VyIHdhbnQgdGhlIHRlbXBsYXRlIHRvIGFwcGVhcgotaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QsIGdvIHRvIHRoZSBUZW1wbGF0ZXMgcHJlZmVyZW5jZXMgcGFnZSBhbmQgdW5jaGVjawotaXRzIGNoZWNrIGJveC48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjcuaHRtbCIgdGl0bGU9IkNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UKLXRlbXBsYXRlcyAtIG92ZXJ2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI0Lmh0bWwiIHRpdGxlPSJIVE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI5Lmh0bWwiIHRpdGxlPSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoYXQgdGVtcGxhdGUsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMKLS0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI5LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjkuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlYmIwOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjkuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMjciIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlczwvdGl0bGU+DQotPHNob3J0ZGVzYz5YTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQNCi1jb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlIGFzDQotcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGF0IHRlbXBsYXRlLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0idHNyY2VkdDAyOXwxfHRlbXBsYXRlc1hNTCIgc3RhdHVzPSJuZXciPnRlbXBsYXRlczxpbmRleHRlcm0+WE1MPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybSBrZXlyZWY9InRzcmNlZHQwMjl8Mnx4bWx0ZW1wbGF0ZXNhZGRpbmciIHN0YXR1cz0iY2hhbmdlZCI+WE1MPGluZGV4dGVybT5hZGRpbmcNCi10ZW1wbGF0ZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD5Gb3IgZXhhbXBsZSwgeW91IG1heSB3b3JrIG9uIGEgZ3JvdXAgb2YgWE1MIHBhZ2VzIHRoYXQgc2hvdWxkDQotYWxsIGNvbnRhaW4gYSB0YWJsZSB3aXRoIGEgc3BlY2lmaWMgYXBwZWFyYW5jZS4gQ3JlYXRlIGEgdGVtcGxhdGUgdGhhdCBjb250YWlucw0KLXRoZSB0YWdzIGZvciB0aGF0IHRhYmxlLCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgYW5kIGF0dHJpYnV0ZQ0KLXZhbHVlcyBmb3IgZWFjaCB0YWcuIChZb3UgY2FuIGNvcHkgYW5kIHBhc3RlIHRoZSB0YWdzIGZyb20gYSBzdHJ1Y3R1cmVkIHRleHQNCi1lZGl0b3IgaW50byB0aGUgdGVtcGxhdGUncyA8dWljb250cm9sPlBhdHRlcm48L3VpY29udHJvbD4gZmllbGQuKSBUaGVuIHNlbGVjdA0KLXRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSBmcm9tIGEgY29udGVudCBhc3Npc3QgcHJvcG9zYWwgbGlzdCB3aGVuZXZlciB5b3UNCi13YW50IHRvIGluc2VydCB5b3VyIGN1c3RvbSB0YWJsZSBpbnRvIGFuIFhNTCBmaWxlLjwvcD48cD5UbyBhZGQgYSBuZXcgWE1MDQotdGVtcGxhdGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6IDwvcD4gPC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkZyb20gdGhlIDx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+IG1lbnUsIHNlbGVjdCA8dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcmVmZXJlbmNlcyBwYWdlLCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2ViIGFuZA0KLVhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MIEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwgVGVtcGxhdGVzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD4uIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkVudGVyIHRoZSBuZXcgdGVtcGxhdGUgbmFtZSAoYSB0ZXh0IHN0cmluZykgYW5kIGEgYnJpZWYgZGVzY3JpcHRpb24NCi1vZiB0aGUgdGVtcGxhdGUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VXNpbmcgdGhlIDx1aWNvbnRyb2w+Q29udGV4dDwvdWljb250cm9sPiBkcm9wLWRvd24gbGlzdCwgc3BlY2lmeQ0KLXRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsIGxpc3Qgd2hlbiBjb250ZW50DQotYXNzaXN0IGlzIHJlcXVlc3RlZC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5QYXR0ZXJuPC91aWNvbnRyb2w+IGZpZWxkLCBlbnRlciB0aGUgYXBwcm9wcmlhdGUNCi10YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzICh0aGUgY29udGVudCBvZiB0aGUgdGVtcGxhdGUpIHRvIGJlDQotaW5zZXJ0ZWQgYnkgY29udGVudCBhc3Npc3QuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8dWljb250cm9sPlZhcmlhYmxlPC91aWNvbnRyb2w+IGJ1dHRvbg0KLWFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLjwvY21kPjxzdGVweG1wPkZvciBleGFtcGxlLCB0aGUgPHZhcm5hbWU+d29yZF9zZWxlY3Rpb248L3Zhcm5hbWU+IHZhcmlhYmxlDQotaW5kaWNhdGVzIHRoZSB3b3JkIHRoYXQgaXMgc2VsZWN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0ZW1wbGF0ZSBpbnNlcnRpb24sDQotYW5kIHRoZSA8dmFybmFtZT5jdXJzb3I8L3Zhcm5hbWU+IHZhcmlhYmxlIGRldGVybWluZXMgd2hlcmUgdGhlIGN1cnNvciB3aWxsDQotYmUgYWZ0ZXIgdGhlIHRlbXBsYXRlIGlzIGluc2VydGVkIGluIHRoZSBYTUwgZG9jdW1lbnQuPC9zdGVweG1wPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gdG8gc2F2ZSB0aGUgbmV3IHRlbXBsYXRlLjwvY21kPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPjxwPllvdSBjYW4gZWRpdCwgcmVtb3ZlLCBpbXBvcnQsIG9yIGV4cG9ydCBhIHRlbXBsYXRlIGJ5IHVzaW5nIHRoZQ0KLXNhbWUgUHJlZmVyZW5jZXMgcGFnZS4gSWYgeW91IGhhdmUgbW9kaWZpZWQgYSBkZWZhdWx0IHRlbXBsYXRlLCB5b3UgY2FuIHJlc3RvcmUNCi1pdCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gWW91IGNhbiBhbHNvIHJlc3RvcmUgYSByZW1vdmVkIHRlbXBsYXRlIGlmIHlvdSBoYXZlDQotbm90IGV4aXRlZCBmcm9tIHRoZSB3b3JrYmVuY2ggc2luY2UgaXQgd2FzIHJlbW92ZWQuPC9wPjxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUNCi10aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgYnV0IHlvdSBubyBsb25nZXIgd2FudCB0aGUgdGVtcGxhdGUgdG8gYXBwZWFyDQotaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QsIGdvIHRvIHRoZSBUZW1wbGF0ZXMgcHJlZmVyZW5jZXMgcGFnZSBhbmQgdW5jaGVjaw0KLWl0cyBjaGVjayBib3guPC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNy5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UNCi10ZW1wbGF0ZXMgLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjQuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI4LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDAwLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcw0KLS0gb3ZlcnZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI5Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3NDI0My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGUgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGF0IHRlbXBsYXRlLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoYXQgdGVtcGxhdGUsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIiAvPgotPG1ldGEgY29udGVudD0idGVtcGxhdGVzLCBYTUwsIGFkZGluZyB0ZW1wbGF0ZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJ0ZW1wbGF0ZXMsIFhNTCwgYWRkaW5nIHRlbXBsYXRlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjguaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwMC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMjciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMjciPjxhIG5hbWU9InRzcmNlZHQwMjciPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlczwvaDE+Ci0KLQotCi08ZGl2PjxwPlhNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBhIGNvbW1lbnQgdGVtcGxhdGUsIGEgY2h1bmsgb2YgcHJlZGVmaW5lZAotY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBhcwotcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGF0IHRlbXBsYXRlLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPkZvciBleGFtcGxlLCB5b3UgbWF5IHdvcmsgb24gYSBncm91cCBvZiBYTUwgcGFnZXMgdGhhdCBzaG91bGQKLWFsbCBjb250YWluIGEgdGFibGUgd2l0aCBhIHNwZWNpZmljIGFwcGVhcmFuY2UuIENyZWF0ZSBhIHRlbXBsYXRlIHRoYXQgY29udGFpbnMKLXRoZSB0YWdzIGZvciB0aGF0IHRhYmxlLCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgYW5kIGF0dHJpYnV0ZQotdmFsdWVzIGZvciBlYWNoIHRhZy4gKFlvdSBjYW4gY29weSBhbmQgcGFzdGUgdGhlIHRhZ3MgZnJvbSBhIHN0cnVjdHVyZWQgdGV4dAotZWRpdG9yIGludG8gdGhlIHRlbXBsYXRlJ3MgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybjwvc3Bhbj4gZmllbGQuKSBUaGVuIHNlbGVjdAotdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIGZyb20gYSBjb250ZW50IGFzc2lzdCBwcm9wb3NhbCBsaXN0IHdoZW5ldmVyIHlvdQotd2FudCB0byBpbnNlcnQgeW91ciBjdXN0b20gdGFibGUgaW50byBhbiBYTUwgZmlsZS48L3A+Ci08cD5UbyBhZGQgYSBuZXcgWE1MCi10ZW1wbGF0ZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczogPC9wPgotIDwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gbWVudSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcmVmZXJlbmNlcyBwYWdlLCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kCi1YTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBUZW1wbGF0ZXM8L3NwYW4+Ci08L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4uIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkVudGVyIHRoZSBuZXcgdGVtcGxhdGUgbmFtZSAoYSB0ZXh0IHN0cmluZykgYW5kIGEgYnJpZWYgZGVzY3JpcHRpb24KLW9mIHRoZSB0ZW1wbGF0ZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Vc2luZyB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udGV4dDwvc3Bhbj4gZHJvcC1kb3duIGxpc3QsIHNwZWNpZnkKLXRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsIGxpc3Qgd2hlbiBjb250ZW50Ci1hc3Npc3QgaXMgcmVxdWVzdGVkLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuPC9zcGFuPiBmaWVsZCwgZW50ZXIgdGhlIGFwcHJvcHJpYXRlCi10YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzICh0aGUgY29udGVudCBvZiB0aGUgdGVtcGxhdGUpIHRvIGJlCi1pbnNlcnRlZCBieSBjb250ZW50IGFzc2lzdC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCB0byBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhcmlhYmxlPC9zcGFuPiBidXR0b24KLWFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLjwvc3Bhbj4gRm9yIGV4YW1wbGUsIHRoZSA8dmFyIGNsYXNzPSJ2YXJuYW1lIj53b3JkX3NlbGVjdGlvbjwvdmFyPiB2YXJpYWJsZQotaW5kaWNhdGVzIHRoZSB3b3JkIHRoYXQgaXMgc2VsZWN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0ZW1wbGF0ZSBpbnNlcnRpb24sCi1hbmQgdGhlIDx2YXIgY2xhc3M9InZhcm5hbWUiPmN1cnNvcjwvdmFyPiB2YXJpYWJsZSBkZXRlcm1pbmVzIHdoZXJlIHRoZSBjdXJzb3Igd2lsbAotYmUgYWZ0ZXIgdGhlIHRlbXBsYXRlIGlzIGluc2VydGVkIGluIHRoZSBYTUwgZG9jdW1lbnQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gdG8gc2F2ZSB0aGUgbmV3IHRlbXBsYXRlLjwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPllvdSBjYW4gZWRpdCwgcmVtb3ZlLCBpbXBvcnQsIG9yIGV4cG9ydCBhIHRlbXBsYXRlIGJ5IHVzaW5nIHRoZQotc2FtZSBQcmVmZXJlbmNlcyBwYWdlLiBJZiB5b3UgaGF2ZSBtb2RpZmllZCBhIGRlZmF1bHQgdGVtcGxhdGUsIHlvdSBjYW4gcmVzdG9yZQotaXQgdG8gaXRzIGRlZmF1bHQgdmFsdWUuIFlvdSBjYW4gYWxzbyByZXN0b3JlIGEgcmVtb3ZlZCB0ZW1wbGF0ZSBpZiB5b3UgaGF2ZQotbm90IGV4aXRlZCBmcm9tIHRoZSB3b3JrYmVuY2ggc2luY2UgaXQgd2FzIHJlbW92ZWQuPC9wPgotPHA+SWYgeW91IGhhdmUgYSB0ZW1wbGF0ZQotdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlIGJ1dCB5b3Ugbm8gbG9uZ2VyIHdhbnQgdGhlIHRlbXBsYXRlIHRvIGFwcGVhcgotaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QsIGdvIHRvIHRoZSBUZW1wbGF0ZXMgcHJlZmVyZW5jZXMgcGFnZSBhbmQgdW5jaGVjawotaXRzIGNoZWNrIGJveC48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjcuaHRtbCIgdGl0bGU9IkNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UKLXRlbXBsYXRlcyAtIG92ZXJ2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI0Lmh0bWwiIHRpdGxlPSJIVE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI4Lmh0bWwiIHRpdGxlPSJKU1AgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcwotLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDljYzg0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjM3OjIxIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jU3VuIEFwciAxNiAxNDowNToyOSBFRFQgMjAwNgotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9FZGl0b3JDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9FZGl0b3JDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ODA2N2UuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvRWRpdG9yQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLQotPGNvbnRleHQgaWQ9InN0ZWQwMDAxIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3VzdG9taXplIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycy4KLVdoZW4gdGhlIDxiPkhpZ2hsaWdodCBtYXRjaGluZyBicmFja2V0czwvYj4gb3B0aW9uIGlzIHNlbGVjdGVkLCB3aGVuZXZlciB0aGUgY3Vyc29yIGlzIG5leHQgdG8gYSBicmFja2V0IG9yIGN1cmx5IGJyYWNlcywgaXRzIG9wZW5pbmcgb3IgY2xvc2luZyBjb3VudGVyIHBhcnQgaXMgaGlnaGxpZ2h0ZWQuCi1TZWxlY3QgdGhlIDxiPlJlcG9ydCBwcm9ibGVtcyBhcyB5b3UgdHlwZTwvYj4gY2hlY2sgYm94IHRvIHVwZGF0ZSB2YWxpZGl0eSBhbm5vdGF0aW9ucyAodGVtcG9yYXJ5IGFubm90YXRpb25zLCBzdWNoIGFzIG1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlcyBiYXNlZCBvbiBhIERURCwgdGhhdCBnbyBhd2F5IHdoZW4gdGhlIGVkaXRvciBpcyBjbG9zZWQsIG9yIHRoZSBwcm9ibGVtIGlzIGZpeGVkKSBhcyB0aGUgdXNlciB0eXBlcy4KLUluIHRoZSA8Yj5BcHBlYXJhbmNlIGNvbG9yIG9wdGlvbnM8L2I+IHRhYmxlLCB5b3UgY2FuIGFkanVzdCB2YXJpb3VzIGVkaXRvciBhcHBlYXJhbmNlIGZlYXR1cmVzLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InN0ZWQwMDAzIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3VzdG9taXplIGhvdmVyIHRleHQgaW4gdGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXNwZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InhtbG0xMDEwIj4KLTxkZXNjcmlwdGlvbj5Db250ZW50IGFzc2lzdCBoZWxwcyB5b3UgdG8gZmluaXNoIHRhZ3Mgb3IgbGluZXMgb2YgY29kZSBhbmQgaW5zZXJ0IHRlbXBsYXRlcy4gRGVwZW5kaW5nIG9uIHRoZSBzb3VyY2UgbWFya3VwIGxhbmd1YWdlLCB0aGUgY2hvaWNlcyB0aGF0IGFyZSBhdmFpbGFibGUgaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgYXJlIGJhc2VkIG9uIHRhZ3MgZGVmaW5lZCBieSBEVEQgYW5kIHNjaGVtYSBmaWxlcywgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcnMsIG9yIGNvbnRlbnQgbW9kZWwgc3RhbmRhcmQgdGhhdCBpcyBzcGVjaWZpZWQgZm9yIHRoZSBmaWxlIGJlaW5nIGVkaXRlZC4gSFRNTCBjb250ZW50IGFzc2lzdCBjaG9pY2VzIGFyZSBiYXNlZCBvbiB0aGUgVzNDIEhUTUwgNC4wMSBjb250ZW50IG1vZGVsLgotCi1JZiB5b3VyIGN1cnNvciBpcyBpbiBhIHBvc2l0aW9uIHdoZXJlIGNvbnRlbnQgYXNzaXN0IGlzIGF2YWlsYWJsZSwgYSBwb3AtdXAgbGlzdCBvZiBhdmFpbGFibGUgY2hvaWNlcyBpcyBkaXNwbGF5ZWQuIFRoZSBjb250ZW50IGFzc2lzdCBsaXN0IGRpc3BsYXlzIGFsbCBhdmFpbGFibGUgY29tcGxldGlvbnMgZm9yIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiwgaW5jbHVkaW5nIHRlbXBsYXRlcy4gQ29udGVudCBhc3Npc3QgaXMgYWxzbyBhdmFpbGFibGUgYnkgcHJlc3NpbmcgQ3RybCtTcGFjZS4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkNvbnRlbnQgYXNzaXN0IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA2Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iR2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InhtbG0xMDMwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gZm9ybWF0IGFuIGVudGlyZSBkb2N1bWVudC4gRm9ybWF0dGluZyByZXN0b3JlcyBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgaW5kZW50YXRpb24gYW5kIHBvc2l0aW9uaW5nLCB3aGljaCBtYXkgaGF2ZSBiZWVuIG9mZnNldCBkdXJpbmcgZWRpdGluZywgdG8gc2VlIG5lc3RpbmcgaGllcmFyY2hpZXMgYW5kIHJlbGF0aW9uc2hpcHMgbW9yZSBjbGVhcmx5IGluIHRoZSBmaWxlLiBFZGl0IHRoZSBhcHByb3ByaWF0ZSBQcmVmZXJlbmNlcyBwYWdlcyB0byBtYWtlIGNoYW5nZXMgaW4gc3BlY2lmaWMgZm9ybWF0dGluZyBiZWhhdmlvci4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ4bWxtMTA0MCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIGZvcm1hdCBzZWxlY3RlZCBlbGVtZW50cy4gRm9ybWF0dGluZyByZXN0b3JlcyBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgaW5kZW50YXRpb24gYW5kIHBvc2l0aW9uaW5nLCB3aGljaCBtYXkgaGF2ZSBiZWVuIG9mZnNldCBkdXJpbmcgZWRpdGluZywgdG8gc2VlIG5lc3RpbmcgaGllcmFyY2hpZXMgYW5kIHJlbGF0aW9uc2hpcHMgbW9yZSBjbGVhcmx5IGluIHRoZSBmaWxlLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InhtbG0xMDcwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gb3BlbiB0aGUgPGI+UHJvcGVydGllczwvYj4gdmlldywgd2hpY2ggZGlzcGxheXMgcHJvcGVydGllcyByZWxldmFudCB0byB0aGUgY3VycmVudCBlbGVtZW50IGlmIGFueSBleGlzdC4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlByb3BlcnRpZXMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvY29uY2VwdHMvY3Byb3B2aWV3Lmh0bSIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InhtbG0yMDAwIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgbGV0cyB5b3UgZWRpdCBhIHRleHQgZmlsZSB0aGF0IGlzIGNvZGVkIGluIGEgbWFya3VwIGxhbmd1YWdlLiBUaGUgZWRpdG9yIHByb3ZpZGVzIG1hbnkgdGV4dCBlZGl0aW5nIGZlYXR1cmVzLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LCBzeW50YXggaGlnaGxpZ2h0aW5nLCB1bmxpbWl0ZWQgdW5kbyBhbmQgcmVkbywgZWxlbWVudCBzZWxlY3Rpb24gYW5kIGZvcm1hdHRpbmcsIGFuZCBkb2N1bWVudCBmb3JtYXR0aW5nLiBGb3IgYSBtb3JlIHNwZWNpZmljIGxpc3Qgb2YgZWRpdGluZyBmZWF0dXJlcywgc2VlIHRoZSBmaXJzdCBsaW5rIGJlbG93LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYngwMDAwIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3VzdG9taXplIHRhc2sgdGFnIGRpc2NvdmVyeSBpbiB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMuCi08L2Rlc2NyaXB0aW9uPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0iZWNzczAwMDAiPgotPGRlc2NyaXB0aW9uPlRoZSBDU1Mgc291cmNlIHBhZ2UgZWRpdG9yIGxldHMgeW91IGVkaXQgYSBjYXNjYWRpbmcgc3R5bGUgc2hlZXQuIFRoZSBlZGl0b3IgcHJvdmlkZXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QsIHN5bnRheCBoaWdobGlnaHRpbmcsIHVubGltaXRlZCB1bmRvIGFuZCByZWRvLCBlbGVtZW50IHNlbGVjdGlvbiBhbmQgZm9ybWF0dGluZywgYW5kIGRvY3VtZW50IGZvcm1hdHRpbmcuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9Im1pc2MwMTgwIj4KLSA8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIGVkaXQgdGhlIENTUyBjb250ZW50IHNldHRpbmdzIGZvciBhIENTUyBmaWxlLiBZb3UgY2FuIHNwZWNpZnkgQ1NTIHByb2ZpbGUgb3IgcmVzdG9yZSB0aGUgZGVmYXVsdCBieSBjbGlja2luZyA8Yj5SZXN0b3JlIERlZmF1bHRzPC9iPi4KLSA8L2Rlc2NyaXB0aW9uPgotPC9jb250ZXh0PgotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL0VkaXRvckNzc0NvbnRleHRzMi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9FZGl0b3JDc3NDb250ZXh0czIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGJjMzlkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL0VkaXRvckNzc0NvbnRleHRzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9ImNzc3NvdXJjZV9zb3VyY2VfSGVscElkIj4KLTxkZXNjcmlwdGlvbj5UaGUgQ1NTIHNvdXJjZSBwYWdlIGVkaXRvciBsZXRzIHlvdSBlZGl0IGEgY2FzY2FkaW5nIHN0eWxlIHNoZWV0LiBUaGUgZWRpdG9yIHByb3ZpZGVzIG1hbnkgdGV4dCBlZGl0aW5nIGZlYXR1cmVzLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LCBzeW50YXggaGlnaGxpZ2h0aW5nLCB1bmxpbWl0ZWQgdW5kbyBhbmQgcmVkbywgZWxlbWVudCBzZWxlY3Rpb24gYW5kIGZvcm1hdHRpbmcsIGFuZCBkb2N1bWVudCBmb3JtYXR0aW5nLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJlY3NzMDAwMCI+Ci08ZGVzY3JpcHRpb24+VGhlIENTUyBzb3VyY2UgcGFnZSBlZGl0b3IgbGV0cyB5b3UgZWRpdCBhIGNhc2NhZGluZyBzdHlsZSBzaGVldC4gVGhlIGVkaXRvciBwcm92aWRlcyBtYW55IHRleHQgZWRpdGluZyBmZWF0dXJlcywgc3VjaCBhcyBjb250ZW50IGFzc2lzdCwgc3ludGF4IGhpZ2hsaWdodGluZywgdW5saW1pdGVkIHVuZG8gYW5kIHJlZG8sIGVsZW1lbnQgc2VsZWN0aW9uIGFuZCBmb3JtYXR0aW5nLCBhbmQgZG9jdW1lbnQgZm9ybWF0dGluZy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0gPGNvbnRleHQgaWQ9Im1pc2MwMTgwIj4KLSA8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIGVkaXQgdGhlIENTUyBjb250ZW50IHNldHRpbmdzIGZvciBhIENTUyBmaWxlLiBZb3UgY2FuIHNwZWNpZnkgQ1NTIHByb2ZpbGUgb3IgcmVzdG9yZSB0aGUgZGVmYXVsdCBieSBjbGlja2luZyA8Yj5SZXN0b3JlIERlZmF1bHRzPC9iPi4KLSA8L2Rlc2NyaXB0aW9uPgotPC9jb250ZXh0PgotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkN2M5NWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGM3Zjk5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IEVkaXRvckNvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIEVkaXRvckNzc0NvbnRleHRzMi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTAyNWQyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIHByb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotQnVuZGxlLU5hbWUuMCA9IFNTRSBpbmZvcG9wcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTM3OTZmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9yQ29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIi8+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IkVkaXRvckNzc0NvbnRleHRzMi54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiLz4KLTwvZXh0ZW5zaW9uPgotCi0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYzRhNmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTYwYzUyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBTdGF0aWMgV2ViIGluZm9wb3AKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjMwMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvU3RhdGljV2ViV2l6Q29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvU3RhdGljV2ViV2l6Q29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjBmNDAzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL1N0YXRpY1dlYldpekNvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0id2VidzIwMDAiPgotPGRlc2NyaXB0aW9uPiBVc2UgdGhpcyBwYWdlIHRvIG5hbWUgeW91ciBXZWIgcHJvamVjdCBhbmQgc3BlY2lmeSB0aGUgZmlsZSBzeXN0ZW0gbG9jYXRpb24gKHRoZSBwbGFjZSB3aGVyZSB0aGUgcmVzb3VyY2VzIHlvdSBjcmVhdGUgYXJlIHN0b3JlZC4pIFdoZW4gdGhlIFVzZSBkZWZhdWx0IGNoZWNrIGJveCBpcyBzZWxlY3RlZCwgdGhlIHByb2plY3Qgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmaWxlIHN5c3RlbSBsb2NhdGlvbiB3aGVyZSB5b3VyIHdvcmtzcGFjZSByZXNpZGVzLiBUbyBjaGFuZ2UgdGhlIGRlZmF1bHQgZmlsZSBzeXN0ZW0gbG9jYXRpb24sIGNsZWFyIHRoZSBjaGVja2JveCBhbmQgbG9jYXRlIHRoZSBwYXRoIHVzaW5nIHRoZSA8Yj5Ccm93c2U8L2I+IGJ1dHRvbi4gVG8gY29uZmlndXJlIGFkZGl0aW9uYWwgb3B0aW9ucywgc2VsZWN0IHRoZSA8Yj5OZXh0PC9iPiBidXR0b24uCi1JbiB0aGUgVGFyZ2V0IFJ1bnRpbWUgZmllbGQsIHNlbGVjdCB0aGUgc2VydmVyIHdoZXJlIHlvdSB3YW50IHRvIHB1Ymxpc2ggdGhlIFdlYiBwcm9qZWN0LiBpZiBhIHNlcnZlciBpcyBub3QgYWxyZWFkeSBkZWZpbmVkLCBjbGljayA8Yj5OZXc8L2I+IHRvIHNlbGVjdCBhIHNlcnZlciBydW50aW1lIGVudmlyb25tZW50LiA8L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ3MjEwMCI+Ci08ZGVzY3JpcHRpb24+UHJlc2V0cyBhcmUgdXNlZCB0byBkZWZpbmUgYSBkZWZhdWx0IHNldCBvZiBmYWNldCB2ZXJzaW9ucyB0aGF0IHdpbGwgY29uZmlndXJlIGEgcHJvamVjdCBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgZGV2ZWxvcG1lbnQuIFRoZSBTdGF0aWMgV2ViIE1vZHVsZSBmYWNldCBlbmFibGVzIHRoZSBwcm9qZWN0IHRvIGJlIGRlcGxveWVkIGFzIGEgc3RhdGljCi1XZWIgbW9kdWxlLiBDbGljayBTaG93IFJ1bnRpbWVzIHRvIHZpZXcgdGhlIGF2YWlsYWJsZSBydW50aW1lcyBhbmQgcnVudGltZSBjb21wb3NpdGlvbnMuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVzdGEuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VidzIyMDAiPgotPGRlc2NyaXB0aW9uPlRoZSBXZWIgY29udGVudCBmb2xkZXIgaXMgd2hlcmUgdGhlIGVsZW1lbnRzIG9mIHlvdXIgV2ViIHNpdGUgc3VjaCBhcyBXZWIgcGFnZXMsIGdyYXBoaWNzIGFuZCBzdHlsZSBzaGVldHMgYXJlIHN0b3JlZC4gVGhpcyBkaXJlY3Rvcnkgc3RydWN0dXJlIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgY29udGVudCBvZiB5b3VyIFdlYiBzaXRlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIFdBUiBmaWxlIGF0IGRlcGxveW1lbnQgYW5kIHRoYXQgbGluayB2YWxpZGF0aW9uIHdpbGwgd29yayBjb3JyZWN0bHkuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzdjMWE5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IFN0YXRpY1dlYldpekNvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MWQyZGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lICAgICA9IFN0YXRpYyBXZWIgaW5mb3BvcAotcGx1Z2luUHJvdmlkZXIgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGFjMDE4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnaW4gZm9yIGRlY2xhcmluZyB0aGUgaGVscCAgICAgICAgIC0tPgotPCEtLSBjb250cmlidXRpb25zIGZvciB1c2luZyB0aGUgdG9vbC4gICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPHBsdWdpbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI+Ci0gICAgICA8Y29udGV4dHMgZmlsZT0iU3RhdGljV2ViV2l6Q29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIi8+Ci08L2V4dGVuc2lvbj4KLQotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFkY2E5OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlcl8xLjAuMC5qYXIKLXRlbXAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDViMTU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvRG9jQnVpbGQueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvRG9jQnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzVjY2YyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL0RvY0J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLSAKLQotCVRoaXMgc2NyaXB0IGJ1aWxkIHRoZSBIZWxwIHBsdWctaW4gYnkgdHJhbnNmb3JtaW5nIHRoZSBESVRBIHNvdXJjZSBmaWxlcyBpbnRvIEhUTUwuCi0JCi0JVG8gdXNlIHRoaXMgc2NyaXB0LCB5b3UgbXVzdCBpbnN0YWxsIERJVEEtT1Qgb24geW91ciBtYWNoaW5lIGluIHRoZSBkaXJlY3RvcnkKLQlkZWZpbmVkIGJ5IHRoZSBkaXRhLm90LmRpciBwcm9wZXJ0eS4KLQkKLQlSdW4gdGhlIGRlZmF1bHQgdGFyZ2V0IGFmdGVyIHlvdSBlZGl0IHRoZSBESVRBIHNvdXJjZSBmaWxlcyB0byByZWdlbmVyYXRlIHRoZSBIVE1MLgotCQotCVRvIGN1c3RvbWl6ZSB0aGlzIHNjcmlwdCBmb3Igb3RoZXIgSGVscCBwbHVnLWlucywgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgYXJncy5pbnB1dCBwcm9wZXJ0eQotCXRvIGJlIHRoZSBESVRBIG1hcCBmaWxlIGZvciB0aGUgcGx1Zy1pbi4KLQkKLQlOT1RFOiBUaGlzIHNjcmlwdCBhc3N1bWVzIHRoYXQgbGlua3MgdG8gc2libGluZyBIZWxwIHBsdWctaW5zIGhhdmUgc2NvcGU9InBlZXIiLCBvdGhlcndpc2UgdGhlCi0Jb3V0cHV0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgd2lsbCBiZSBzaGlmdGVkIGluY29ycmVjdGx5LgotCQotCU5PVEU6IFRoaXMgc2NyaXB0IGFzc3VtZXMgdGhhdCB5b3UgaGFuZCBjb2RlIHlvdXIgcGx1Z2luLnhtbCBmaWxlIGluIG15cGx1Z2luLnhtbC4gVGhpcyBmaWxlCi0Jd2lsbCBiZSBjb3BpZWQgb3ZlciB0aGUgZ2VuZXJhdGVkIHBsdWdpbi54bWwgd2hpY2ggaXMgY3VycmVudGx5IG5vdCBiZWluZyBnZW5lcmF0ZWQgY29ycmVjdGx5Ci0JYnkgRElUQS1PVC4KLQkKLQlDaGFuZ2VMb2c6Ci0JMjAwNi0wNC0wNSBBcnRodXIgUnltYW4gPHJ5bWFuQGNhLmlibS5jb20+Ci0JLSBDcmVhdGVkLgotCTIwMDgtMDEtMDkgS2F0ZSBQcmljZSA8a2F0ZXBAY2EuaWJtLmNvbT4KLQktIG1vZGlmaWVkIGZvciBuZXcgRElUQS1PVCB2ZXJzaW9uCi0JMjAwOC0wNS0wNSBLYXRlIFByaWNlIDxrYXRlcEBjYS5pYm0uY29tPgotCS0gbW9kaWZpZWQgdG8gYWRkIGdlbmVyYXRpb24gb2YgcHJlLWJ1aWx0IGhlbHAgaW5kZXguIAotCS0gTXVzdCBkZWxldGUgL2luZGV4IGZvbGRlciBiZWZvcmUgcnVubmluZyBidWlsZAotLS0+Ci08cHJvamVjdCBuYW1lPSJlY2xpcHNlaGVscCIgZGVmYXVsdD0iYWxsIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLm90LmRpciIgbG9jYXRpb249IkM6L0RJVEEtT1QxLjIuMiIgLz4KLQotCTxwYXRoIGlkPSJkb3N0LmNsYXNzLnBhdGgiPgotCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7ZGl0YS5vdC5kaXJ9JHtmaWxlLnNlcGFyYXRvcn1saWIke2ZpbGUuc2VwYXJhdG9yfWRvc3QuamFyIiAvPgotCTwvcGF0aD4KLQotCTx0YXNrZGVmIG5hbWU9ImludGVncmF0ZSIgY2xhc3NuYW1lPSJvcmcuZGl0YS5kb3N0LnBsYXRmb3JtLkludGVncmF0b3JUYXNrIj4KLQkJPGNsYXNzcGF0aCByZWZpZD0iZG9zdC5jbGFzcy5wYXRoIiAvPgotCTwvdGFza2RlZj4KLQk8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iaW50ZWdyYXRlLCBlY2xpcHNlaGVscCI+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJpbnRlZ3JhdGUiPgotCQk8aW50ZWdyYXRlIGRpdGFkaXI9IiR7ZGl0YS5vdC5kaXJ9IiAvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSByZXZpc2UgYmVsb3cgaGVyZSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImVjbGlwc2VoZWxwIj4KLQkJPGFudCBhbnRmaWxlPSIke2RpdGEub3QuZGlyfSR7ZmlsZS5zZXBhcmF0b3J9Y29uZHVjdG9yLnhtbCIgdGFyZ2V0PSJpbml0IiBkaXI9IiR7ZGl0YS5vdC5kaXJ9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNvcHljc3MiIHZhbHVlPSJubyIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNzc3BhdGgiIHZhbHVlPSIuLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnByb3ZpZGVyIiB2YWx1ZT0iRWNsaXBzZS5vcmciIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnZlcnNpb24iIHZhbHVlPSIzLjMuMCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmlucHV0IiBsb2NhdGlvbj0icmVsYXRlZGxpbmtzLmRpdGFtYXAiIC8+ICAgIAkJCi0JCQk8cHJvcGVydHkgbmFtZT0iY2xlYW4udGVtcCIgdmFsdWU9InRydWUiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iZGl0YS5leHRuYW1lIiB2YWx1ZT0iLmRpdGEiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iZGl0YS50ZW1wLmRpciIgbG9jYXRpb249InRlbXAiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0LmRpciIgbG9jYXRpb249IiIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJ0cmFuc3R5cGUiIHZhbHVlPSJlY2xpcHNlaGVscCIgLz4KLQkJPC9hbnQ+Ci0JCTxjb3B5IGZpbGU9Im15cGx1Z2luLnhtbCIgdG9maWxlPSJwbHVnaW4ueG1sIiBvdmVyd3JpdGU9InllcyIgLz4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkLmluZGV4IiBkZXNjcmlwdGlvbj0iQnVpbGRzIHNlYXJjaCBpbmRleCBmb3IgdGhlIHBsdWctaW4iIGlmPSJlY2xpcHNlLnJ1bm5pbmciPgotCSAgICAgPGhlbHAuYnVpbGRIZWxwSW5kZXggbWFuaWZlc3Q9InBsdWdpbi54bWwiIGRlc3RpbmF0aW9uPSIuIi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZThmNmE0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNTAwLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlM2ExYzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgd2VidG9vbHNfdG9jLnhtbCxcCi0gICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXJpbmRleC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpbWFnZXMvLFwKLSAgICAgICAgICAgICAgIHRvcGljcy8qaHRtKixcCi0gICAgICAgICAgICAgICBpbmRleC8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSAqLm1hcGxpc3QsXAotICAgICAgICAgICAgICAgKi5kaXRhbWFwLFwKLSAgICAgICAgICAgICAgIHRvcGljcy8qLmRpdGEKLWJpbi5leGNsdWRlcyA9IERvY0J1aWxkLnhtbCxcCi0gICAgICAgICAgICAgICBteVBsdWdpbioueG1sCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvZml4aXQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL2ZpeGl0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhZmMzZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvZml4aXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL2dycHR5cGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL2dycHR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQyNDVmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ncnB0eXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9tZW51YnV0dG9uLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9tZW51YnV0dG9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmMWE2Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbWVudWJ1dHRvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbmxpbnV4LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ubGludXguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzEzNWNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ubGludXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL25zaG93ZXJyLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9uc2hvd2Vyci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYmZkZDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL25zaG93ZXJyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2FybmluZy5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndhcm5pbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjRmZGY5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2FybmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndpbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NWY5Y2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253aW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rYnJrLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2Jyay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjE0MzMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rYnJrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2Nzcy5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtjc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTBjYWY2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2Nzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtnci1sLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2dyLWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzczYjZhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2dyLWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rZ3IuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rZ3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2M2MjYxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2dyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2luZC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtpbmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDNmNzU2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2luZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmttYWwuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rbWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5YzQ3Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmttYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rbnVtLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua251bS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMjRhNjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rbnVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua290ci5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtvdHIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTk2NTkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua290ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtxdWUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rcXVlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1ZjkzOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtxdWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rdHNrLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZDQ3ZWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9za2lwaXQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL3NraXBpdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZjViMWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL3NraXBpdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvdmlld2xpbmsuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL3ZpZXdsaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3YjA1MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvdmlld2xpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW5kZXgvXzEwLmNmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2luZGV4L18xMC5jZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MGM0YzUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW5kZXgvXzEwLmNmcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkzZjQ3MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9kZWxldGFibGUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWUxYjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4NCi0jV2VkIE1heSAxNCAyMDowMzowMiBFRFQgMjAwOA0KLW9yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlcj1vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXJcbjEuMC40MDAucXVhbGlmaWVyDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwYzJjYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI1dlZCBNYXkgMTQgMjA6MDM6MDIgRURUIDIwMDgNCi1sdWNlbmU9MS45LjEudjIwMDgwMzA2MTgxMQ0KLWFuYWx5emVyPW9yZy5lY2xpcHNlLmhlbHAuYmFzZVwjMy4zLjEwMC52MjAwODA0MjU/bG9jYWxlXD1lbg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUwMDk3Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9pbmRleGVkX2RvY3MKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4NCi0jV2VkIE1heSAxNCAyMDowMzowMiBFRFQgMjAwOA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZmlsdGJuLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd3RvdmVyLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqZGV0YWdzLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJyZXNvdXJjZXMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHNlcnZlcnRhcmdldC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BjbnZydC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnZ3Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3c2VydmJuLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3bHN0d2l6Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cHJqc2V0Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Zmx0d2l6Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqcHJlZnMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjdnNyLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3JlcHJqLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY3JlanNwLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJhcnRpZmFjdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnByai5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWh0bS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2xpc3Ribi5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3RmZWF0dXJlcy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3dlZHR2dy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jcGRqc3BzLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGxpYi5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicHJvamVjdHMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdpbXB3YXIuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHN0eWxlc2hlZXQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmV3YXIuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2NzdGF0aWMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnBhZ2VkZXNpZ24uaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdzcnZ3aXouaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3YXJvdnIuaHRtbD0wDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9zZWdtZW50cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ5NzY5OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9zZWdtZW50cworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL215cGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL215cGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1MjBiMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9teXBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuNiI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4gCi08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci0gICA8cGx1Z2luPiAKLSAgICAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgICAgICAJPHRvYyBmaWxlPSJ3ZWJ0b29sc190b2MueG1sIiAvPiAKLSAgICAgICA8aW5kZXggcGF0aD0iaW5kZXgvIi8+Ci0gICAgICAgICAJICAgPC9leHRlbnNpb24+ICAKLSAgICAgICAgIAkgICAKLSAgICAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5pbmRleCI+Ci0gICAgICAgICAgICA8aW5kZXggZmlsZT0ib3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyaW5kZXgueG1sIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgIDwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci5tYXBsaXN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyLm1hcGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZDUyZGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyLm1hcGxpc3QKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTxtYXBsaXN0IHZlcnNpb249IjMuNi4yIj4NCi0gIDxuYXY+DQotICAgIDxtYXAgZmlsZT0id2VidG9vbHNfdG9jLmRpdGFtYXAiLz4NCi0gIDwvbmF2Pg0KLSAgPGxpbms+DQotICAgIDxtYXAgZmlsZT0icmVsYXRlZGxpbmtzLmRpdGFtYXAiLz4NCi0gIDwvbGluaz4NCi08L21hcGxpc3Q+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyaW5kZXgueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmM4YTRkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlcmluZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPGluZGV4PgotICA8ZW50cnkga2V5d29yZD0iV2ViIGFwcGxpY2F0aW9ucyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2N3dG92ZXIuaHRtbCNjY3d0b3ZlciIgdGl0bGU9IldlYiBhcHBsaWNhdGlvbiBvdmVydmlldyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIG9yIGltcG9ydGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N3ZWJwcm9qZWN0cy5odG1sI2N3ZWJwcm9qZWN0cyIgdGl0bGU9IldlYiBwcm9qZWN0cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InJlc291cmNlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmh0bWwjdHdjcmVwcmoiIHRpdGxlPSJDcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3QiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzZXJ2ZXIgdGFyZ2V0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNlcnZlcnRhcmdldC5odG1sI3RzZXJ2ZXJ0YXJnZXQiIHRpdGxlPSJTZXJ2ZXIgdGFyZ2V0aW5nIGZvciBXZWIgYXBwbGljYXRpb25zIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldlYiB0b29scyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImZlYXR1cmVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3d0ZmVhdHVyZXMuaHRtbCNjd3RmZWF0dXJlcyIgdGl0bGU9IldlYiB0b29scyBmZWF0dXJlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IEV4cGxvcmVyIHZpZXciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2Njd2VidncuaHRtbCNjY3dlYnZ3IiB0aXRsZT0iUHJvamVjdCBFeHBsb3JlciB2aWV3IGFuZCBXZWIgZGV2ZWxvcG1lbnQiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iV2ViIHByb2plY3RzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBFeHBsb3JlciB2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2N3ZWJ2dy5odG1sI2Njd2VidnciIHRpdGxlPSJQcm9qZWN0IEV4cGxvcmVyIHZpZXcgYW5kIFdlYiBkZXZlbG9wbWVudCIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3dlYnByb2plY3RzLmh0bWwjY3dlYnByb2plY3RzIiB0aXRsZT0iV2ViIHByb2plY3RzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmcgZHluYW1pYyBwcm9qZWN0cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmh0bWwjdHdjcmVwcmoiIHRpdGxlPSJDcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3QiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJkeW5hbWljIHByb2plY3RzIG92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2N3ZWJwcmouaHRtbCNjY3dlYnByaiIgdGl0bGU9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyBzdGF0aWMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2NyZXN0YS5odG1sI3R3Y3Jlc3RhIiB0aXRsZT0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb252ZXJ0aW5nIHN0YXRpYyB0byBkeW5hbWljIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdwY252cnQuaHRtbCN0d3BjbnZydCIgdGl0bGU9IkNvbnZlcnRpbmcgc3RhdGljIFdlYiBwcm9qZWN0cyB0byBkeW5hbWljIFdlYiBwcm9qZWN0cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InN0YXRpYyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2Njc3RhdGljLmh0bWwjY2NzdGF0aWMiIHRpdGxlPSJTdGF0aWMgV2ViIHByb2plY3RzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZXhwb3J0aW5nIFdBUiBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y3Jld2FyLmh0bWwjdHdjcmV3YXIiIHRpdGxlPSJFeHBvcnRpbmcgV2ViIEFyY2hpdmUgKFdBUikgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJ2aXJ0dWFsIEpBUiBmaWxlcyBhbmQgcHJvamVjdHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d3BsaWIuaHRtbCN0d3BsaWIiIHRpdGxlPSJBZGRpbmcgV2ViIGxpYnJhcnkgcHJvamVjdHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwcm9wZXJ0aWVzIHNldHRpbmdzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdwcmpzZXQuaHRtbCN0d3ByanNldCIgdGl0bGU9IlNldHRpbmcgV2ViIHByb2plY3QgcHJvcGVydGllcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJXZWIgcmVzb3VyY2VzIj4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jd2VicmVzb3VyY2VzLmh0bWwjY3dlYnJlc291cmNlcyIgdGl0bGU9IldlYiByZXNvdXJjZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iV2ViIHBhZ2UgZGVzaWduIj4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jd2VicGFnZWRlc2lnbi5odG1sI2N3ZWJwYWdlZGVzaWduIiB0aXRsZT0iV2ViIHBhZ2UgZGVzaWduIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldBUiBmaWxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3d3YXJvdnIuaHRtbCNjd3dhcm92ciIgdGl0bGU9IldlYiBhcmNoaXZlIChXQVIpIGZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaW1wb3J0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdpbXB3YXIuaHRtbCN0d2ltcHdhciIgdGl0bGU9IkltcG9ydGluZyBXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImV4cG9ydGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y3Jld2FyLmh0bWwjdHdjcmV3YXIiIHRpdGxlPSJFeHBvcnRpbmcgV2ViIEFyY2hpdmUgKFdBUikgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJwcm9qZWN0cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iZHluYW1pYyBXZWIgcHJvamVjdHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL2Njd2VicHJqLmh0bWwjY2N3ZWJwcmoiIHRpdGxlPSJEeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzdGF0aWMgV2ViIHByb2plY3RzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2NyZXN0YS5odG1sI3R3Y3Jlc3RhIiB0aXRsZT0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb252ZXJ0aW5nIHRvIGR5bmFtaWMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d3BjbnZydC5odG1sI3R3cGNudnJ0IiB0aXRsZT0iQ29udmVydGluZyBzdGF0aWMgV2ViIHByb2plY3RzIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jY3N0YXRpYy5odG1sI2Njc3RhdGljIiB0aXRsZT0iU3RhdGljIFdlYiBwcm9qZWN0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJleHBvcnRpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJXQVIgZmlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2NyZXdhci5odG1sI3R3Y3Jld2FyIiB0aXRsZT0iRXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InZpcnR1YWwgSkFSIGZpbGVzIGFzc29jaWF0aW9ucyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IldlYiBsaWJyYXJ5IHByb2plY3RzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdwbGliLmh0bWwjdHdwbGliIiB0aXRsZT0iQWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IndvcmtiZW5jaCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IldlYiBlZGl0b3JzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3d3ZWR0dncuaHRtbCNjd3dlZHR2dyIgdGl0bGU9IldvcmtiZW5jaCBpbnRlZ3JhdGlvbiB3aXRoIFdlYiBlZGl0b3JzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldlYiBwYWdlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGpkZXRhZ3MuaHRtbCN0amRldGFncyIgdGl0bGU9IkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImZyYW1lc2V0cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGpjcmVodG0uaHRtbCN0amNyZWh0bSIgdGl0bGU9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSFRNTCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIGZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGpjcmVodG0uaHRtbCN0amNyZWh0bSIgdGl0bGU9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIHByZWZlcmVuY2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGpwcmVmcy5odG1sI3RqcHJlZnMiIHRpdGxlPSJEZWZpbmluZyBIVE1MIGZpbGUgcHJlZmVyZW5jZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iV01MIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmcgZmlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90amNyZWh0bS5odG1sI3RqY3JlaHRtIiB0aXRsZT0iQ3JlYXRpbmcgSFRNTCBhbmQgWEhUTUwgZmlsZXMgYW5kIGZyYW1lc2V0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYSFRNTCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIGZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGpjcmVodG0uaHRtbCN0amNyZWh0bSIgdGl0bGU9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iRE9DVFlQRSBkZWNsYXJhdGlvbnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmcgYXV0b21hdGljYWxseSI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqcHJlZnMuaHRtbCN0anByZWZzIiB0aXRsZT0iRGVmaW5pbmcgSFRNTCBmaWxlIHByZWZlcmVuY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkhUTUwgZmlsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIHByZWZlcmVuY2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGpwcmVmcy5odG1sI3RqcHJlZnMiIHRpdGxlPSJEZWZpbmluZyBIVE1MIGZpbGUgcHJlZmVyZW5jZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic3R5bGUgc2hlZXRzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3R5bGVzaGVldC5odG1sI3RzdHlsZXNoZWV0IiB0aXRsZT0iQ3JlYXRpbmcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJKU1AgZmlsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqY3JlanNwLmh0bWwjdGpjcmVqc3AiIHRpdGxlPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jcGRqc3BzLmh0bWwjY3BkanNwcyIgdGl0bGU9IkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neSIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJXZWIgY29udGVudCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRpbmcgZHluYW1pY2FsbHkiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jcGRqc3BzLmh0bWwjY3BkanNwcyIgdGl0bGU9IkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neSIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzZXJ2bGV0cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdzcnZ3aXouaHRtbCN0d3NydndpeiIgdGl0bGU9IkNyZWF0aW5nIHNlcnZsZXRzIi8+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3bHN0d2l6Lmh0bWwjdHdsc3R3aXoiIHRpdGxlPSJDcmVhdGluZyBMaXN0ZW5lcnMiLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdmbHR3aXouaHRtbCN0d2ZsdHdpeiIgdGl0bGU9IkNyZWF0aW5nIEZpbHRlcnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N3c2VydmJuLmh0bWwjY3dzZXJ2Ym4iIHRpdGxlPSJTZXJ2bGV0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJXZWIgc2VydmVycyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRpbmcgZHluYW1pYyBjb250ZW50Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3dzZXJ2Ym4uaHRtbCNjd3NlcnZibiIgdGl0bGU9IlNlcnZsZXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Imxpc3RlbmVycyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3dsaXN0Ym4uaHRtbCNjd2xpc3RibiIgdGl0bGU9Ikxpc3RlbmVycyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJmaWx0ZXJzIj4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jd2ZpbHRibi5odG1sI2N3ZmlsdGJuIiB0aXRsZT0iTGlzdGVuZXJzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImJ1aWxkIG91dHB1dCBmb2xkZXJzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iaWdub3JpbmcgaW4gQ1ZTIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdjdnNyLmh0bWwjdHdjdnNyIiB0aXRsZT0iU2V0dGluZyBDVlMgcmVwb3NpdG9yeSBkZWZhdWx0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJDVlMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJzZXR0aW5nIHJlcG9zaXRvcnkgZGVmYXVsdHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2N2c3IuaHRtbCN0d2N2c3IiIHRpdGxlPSJTZXR0aW5nIENWUyByZXBvc2l0b3J5IGRlZmF1bHRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImN2c2lnbm9yZSBmaWxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdjdnNyLmh0bWwjdHdjdnNyIiB0aXRsZT0iU2V0dGluZyBDVlMgcmVwb3NpdG9yeSBkZWZhdWx0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJyZXBvc2l0b3JpZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJkZWZhdWx0IENWUyBzZXR0aW5ncyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y3Zzci5odG1sI3R3Y3ZzciIgdGl0bGU9IlNldHRpbmcgQ1ZTIHJlcG9zaXRvcnkgZGVmYXVsdHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic2VydmVycyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InRhcmdldGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzZXJ2ZXJ0YXJnZXQuaHRtbCN0c2VydmVydGFyZ2V0IiB0aXRsZT0iU2VydmVyIHRhcmdldGluZyBmb3IgV2ViIGFwcGxpY2F0aW9ucyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci08L2luZGV4PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMzI1MTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lICAgPSBXZWIgdG9vbHMgZG9jdW1lbnRhdGlvbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1MjBiMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjYiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+IAotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotICAgPHBsdWdpbj4gCi0gICAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgICAgICAgCTx0b2MgZmlsZT0id2VidG9vbHNfdG9jLnhtbCIgLz4gCi0gICAgICAgPGluZGV4IHBhdGg9ImluZGV4LyIvPgotICAgICAgICAgCSAgIDwvZXh0ZW5zaW9uPiAgCi0gICAgICAgICAJICAgCi0gICAgICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotICAgICAgICAgICAgPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlcmluZGV4LnhtbCIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgICA8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9yZWxhdGVkbGlua3MuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3JlbGF0ZWRsaW5rcy5kaXRhbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzc4ZjMyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3JlbGF0ZWRsaW5rcy5kaXRhbWFwCisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgbWFwIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIE1hcC8vRU4iDQotICJtYXAuZHRkIj4NCi08bWFwIHRpdGxlPSJXZWIgdG9vbHMgcmVsYXRlZCBsaW5rcyI+DQotPHJlbHRhYmxlPg0KLTxyZWxoZWFkZXI+DQotPHJlbGNvbHNwZWMgdHlwZT0iY29uY2VwdCI+PC9yZWxjb2xzcGVjPg0KLTxyZWxjb2xzcGVjIHR5cGU9InRhc2siPjwvcmVsY29sc3BlYz4NCi08cmVsY29sc3BlYyB0eXBlPSJyZWZlcmVuY2UiPjwvcmVsY29sc3BlYz4NCi08L3JlbGhlYWRlcj4NCi08cmVscm93Pg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpjaGd4ZHQuZGl0YSIgbmF2dGl0bGU9IlNwZWNpZnlpbmcgYW4gaW1wbGljaXQgZG9jdW1lbnQgdHlwZSBmb3IgYW4gSFRNTCwgWEhUTUwsIG9yIEpTUCBmcmFnbWVudCI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlaHRtLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBIVE1MIGFuZCBYSFRNTCBmaWxlcyBhbmQgZnJhbWVzZXRzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NwZGpzcHMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neSINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpjcmVqc3AuZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXByai5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0Ij4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c2VydmVydGFyZ2V0LmRpdGEiIG5hdnRpdGxlPSJTZXJ2ZXIgdGFyZ2V0aW5nIGZvciBXZWIgYXBwbGljYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmVwcmouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3N0YXRpYy5kaXRhIiBuYXZ0aXRsZT0iU3RhdGljIFdlYiBwcm9qZWN0cyIgc2NvcGU9InBlZXIiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3dlYnByai5kaXRhIiBuYXZ0aXRsZT0iRHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9ucyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmVwcmouZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlanNwLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njc3RhdGljLmRpdGEiIG5hdnRpdGxlPSJTdGF0aWMgV2ViIHByb2plY3RzIiBzY29wZT0icGVlciI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmVzdGEuZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgc3RhdGljIFdlYiBwcm9qZWN0Ij4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmRpdGEiIG5hdnRpdGxlPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyIgc2NvcGU9InBlZXIiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmV3YXIuZGl0YSIgbmF2dGl0bGU9IkV4cG9ydGluZyBXZWIgQXJjaGl2ZSAoV0FSKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjdnNyLmRpdGEiIG5hdnRpdGxlPSJTZXR0aW5nIENWUyByZXBvc2l0b3J5IGRlZmF1bHRzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmRpdGEiIG5hdnRpdGxlPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyIgc2NvcGU9InBlZXIiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdpbXB3YXIuZGl0YSIgbmF2dGl0bGU9IkltcG9ydGluZyBXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njc3RhdGljLmRpdGEiIG5hdnRpdGxlPSJTdGF0aWMgV2ViIHByb2plY3RzIiBzY29wZT0icGVlciI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd2VicHJqLmRpdGEiIG5hdnRpdGxlPSJEeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3cGNudnJ0LmRpdGEiIG5hdnRpdGxlPSJDb252ZXJ0aW5nIHN0YXRpYyBXZWIgcHJvamVjdHMgdG8gZHluYW1pYyBXZWIgcHJvamVjdHMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3cGxpYi5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3ByanNldC5kaXRhIiBuYXZ0aXRsZT0iU2V0dGluZyBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3NlcnZibi5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iU2VydmxldHMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3c3J2d2l6LmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBTZXJ2bGV0cyI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dsaXN0Ym4uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9Ikxpc3RlbmVycyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdsc3R3aXouZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIExpc3RlbmVycyI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dmaWx0Ym4uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkZpbHRlcnMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Zmx0d2l6LmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBGaWx0ZXJzIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3dlYnZ3LmRpdGEiIG5hdnRpdGxlPSJQcm9qZWN0IEV4cGxvcmVyIHZpZXcgYW5kIFdlYiBkZXZlbG9wbWVudCI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJwcm9qZWN0cy5kaXRhIiBuYXZ0aXRsZT0iV2ViIHByb2plY3RzIiBzY29wZT0icGVlciI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd3RvdmVyLmRpdGEiIG5hdnRpdGxlPSJXZWIgYXBwbGljYXRpb24gb3ZlcnZpZXciDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jcGRqc3BzLmRpdGEiIG5hdnRpdGxlPSJKYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3kiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdpbXB3YXIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkltcG9ydGluZyBXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3dG92ZXIuZGl0YSIgbmF2dGl0bGU9IldlYiBhcHBsaWNhdGlvbiBvdmVydmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3dGZlYXR1cmVzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgdG9vbHMgZmVhdHVyZXMiPg0KLTwvdG9waWNyZWY+DQotPCEtLSA8dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJkZXZlbG9wbWVudHRvb2xzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgZGV2ZWxvcG1lbnQgdG9vbHMiPg0KLTwvdG9waWNyZWY+IC0tPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXByai5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0Ig0KLXNjb3BlPSJwZWVyIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqZGV0YWdzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBhbmQgZWRpdGluZyBXZWIgcGFnZXMgLSBvdmVydmlldyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2ViYXJ0aWZhY3QuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIFdlYiBBcnRpZmFjdHMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3RmZWF0dXJlcy5kaXRhIiBuYXZ0aXRsZT0iV2ViIHRvb2xzIGZlYXR1cmVzIj48L3RvcGljcmVmPg0KLTwhLS0gPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2ViZGV2ZWxvcG1lbnR0b29scy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIGRldmVsb3BtZW50IHRvb2xzIj4NCi08L3RvcGljcmVmPiAtLT4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd2VicHJqLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJEeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYnBhZ2VkZXNpZ24uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBwYWdlIGRlc2lnbiI+DQotPC90b3BpY3JlZj4NCi08IS0tIDx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYnRlY2hub2xvZ2llcy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIHRlY2hub2xvZ2llcyI+DQotPC90b3BpY3JlZj4gLS0+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmVwcmouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlanNwLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdzcnZ3aXouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIFNlcnZsZXRzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdsc3R3aXouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIExpc3RlbmVycyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Zmx0d2l6LmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBGaWx0ZXJzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPCEtLSA8dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJ0ZWNobm9sb2dpZXMuZGl0YSIgbmF2dGl0bGU9IldlYiB0ZWNobm9sb2dpZXMiPg0KLTwvdG9waWNyZWY+IC0tPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3ZWJwcmouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jcGRqc3BzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJKYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3kiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jcGRqc3BzLmRpdGEiIG5hdnRpdGxlPSJKYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3kiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3NlcnZibi5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iU2VydmxldHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2xpc3Ribi5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iTGlzdGVuZXJzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dmaWx0Ym4uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkZpbHRlcnMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlanNwLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3NlcnZibi5kaXRhIiBuYXZ0aXRsZT0iU2VydmxldHMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2xpc3Ribi5kaXRhIiBuYXZ0aXRsZT0iTGlzdGVuZXJzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dmaWx0Ym4uZGl0YSIgbmF2dGl0bGU9IkZpbHRlcnMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3d0b3Zlci5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIGFwcGxpY2F0aW9uIG92ZXJ2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTwhLS0gPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2ViZGV2ZWxvcG1lbnR0b29scy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIGRldmVsb3BtZW50IHRvb2xzIj4NCi08L3RvcGljcmVmPiAtLT4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3Nydndpei5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgU2VydmxldHMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2xzdHdpei5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgTGlzdGVuZXJzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdmbHR3aXouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIEZpbHRlcnMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08IS0tIDx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYmRldmVsb3BtZW50dG9vbHMuZGl0YSIgbmF2dGl0bGU9IldlYiBkZXZlbG9wbWVudCB0b29scyI+DQotPC90b3BpY3JlZj4gLS0+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3N0YXRpYy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iU3RhdGljIFdlYiBwcm9qZWN0cyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd2VicHJqLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJEeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXN0YS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXByai5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0Ig0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpjcmVodG0uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amNyZWpzcC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlcyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3dG92ZXIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBhcHBsaWNhdGlvbiBvdmVydmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3d2VkdHZ3LmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXb3JrYmVuY2ggaW50ZWdyYXRpb24gd2l0aCBXZWIgZWRpdG9ycyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90anByZWZzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJEZWZpbmluZyBIVE1MIGZpbGUgcHJlZmVyZW5jZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NwZGpzcHMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neSI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPjwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicHJvamVjdHMuZGl0YSIgbmF2dGl0bGU9IldlYiBwcm9qZWN0cyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njc3RhdGljLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJTdGF0aWMgV2ViIHByb2plY3RzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3ZWJwcmouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3dhcm92ci5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3Jlc3RhLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3QiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njc3RhdGljLmRpdGEiIG5hdnRpdGxlPSJTdGF0aWMgV2ViIHByb2plY3RzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYnJlc291cmNlcy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIHJlc291cmNlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXN0YS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd2VicHJqLmRpdGEiIG5hdnRpdGxlPSJEeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYnJlc291cmNlcy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIHJlc291cmNlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmVwcmouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlanNwLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicGFnZWRlc2lnbi5kaXRhIiBuYXZ0aXRsZT0iV2ViIHBhZ2UgZGVzaWduIj48L3RvcGljcmVmPg0KLTwhLS0gPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2ViZGV2ZWxvcG1lbnR0b29scy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIGRldmVsb3BtZW50IHRvb2xzIj4NCi08L3RvcGljcmVmPiAtLT4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpkZXRhZ3MuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicmVzb3VyY2VzLmRpdGEiIG5hdnRpdGxlPSJXZWIgcmVzb3VyY2VzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d3YXJvdnIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBhcmNoaXZlIChXQVIpIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3d2VkdHZ3LmRpdGEiIG5hdnRpdGxlPSJXb3JrYmVuY2ggaW50ZWdyYXRpb24gd2l0aCBXZWIgZWRpdG9ycyI+DQotPC90b3BpY3JlZj4NCi08IS0tIDx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYmRldmVsb3BtZW50dG9vbHMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBkZXZlbG9wbWVudCB0b29scyI+DQotPC90b3BpY3JlZj4gLS0+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicmVzb3VyY2VzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgcmVzb3VyY2VzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlanNwLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3dhcm92ci5kaXRhIiBuYXZ0aXRsZT0iV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicmVzb3VyY2VzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgcmVzb3VyY2VzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3aW1wd2FyLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJJbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXdhci5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJyZXNvdXJjZXMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiByZXNvdXJjZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+DQotPCEtLSA8dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJkZXZlbG9wbWVudHRvb2xzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgZGV2ZWxvcG1lbnQgdG9vbHMiPg0KLTwvdG9waWNyZWY+IC0tPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3dG92ZXIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBhcHBsaWNhdGlvbiBvdmVydmlldyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpkZXRhZ3MuZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90anByZWZzLmRpdGEiIG5hdnRpdGxlPSJEZWZpbmluZyBIVE1MIGZpbGUgcHJlZmVyZW5jZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08L3JlbHRhYmxlPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3JlbGF0ZWRsaW5rcy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9yZWxhdGVkbGlua3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MThhMzI5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3JlbGF0ZWRsaW5rcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IldlYiB0b29scyByZWxhdGVkIGxpbmtzIi8+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2NzdGF0aWMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3N0YXRpYy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTgwOWZiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3N0YXRpYy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjY3N0YXRpYyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U3RhdGljIFdlYiBwcm9qZWN0czwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+V2ViIHByb2plY3RzPGluZGV4dGVybT5zdGF0aWM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPnN0YXRpYyBXZWIgcHJvamVjdHM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPklmIHlvdSAgd2FudCB0byBjcmVhdGUgYSBjb250ZW50LWJhc2VkIFdlYiBhcHBsaWNhdGlvbiB0aGF0IGRvZXMgbm90IGNvbnRhaW4NCi1hbnkgZHluYW1pYyBjb250ZW50ICAoc3VjaCBhcyBzZXJ2bGV0cywgSlNQIGZpbGVzLCBmaWx0ZXJzLCBhbmQgYXNzb2NpYXRlZA0KLW1ldGFkYXRhKSB5b3UgbWlnaHQgcHJlZmVyIHRvIGNyZWF0ZSBhIHN0YXRpYyBXZWIgcHJvamVjdCwgYXMgb3Bwb3NlZCB0byBhIDx4cmVmDQotaHJlZj0iY2N3ZWJwcmouZGl0YSIgc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz5keW5hbWljIFdlYiBwcm9qZWN0PC94cmVmPi48L3A+DQotPHA+U3RhdGljIFdlYiBwcm9qZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyaXN0aWNzOiAgPHVsPg0KLTxsaT5hIFdlYiBjb250ZW50IGZvbGRlciAoY2FsbGVkIFdlYkNvbnRlbnQpIGZvciBhbGwgcHVibGlzaGFibGUgcmVzb3VyY2VzLA0KLVlvdSBjYW4gY2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgZm9sZGVyIGZyb20gdGhlIHByb2plY3QncyBwb3AtdXAgbWVudS48L2xpPg0KLTxsaT5hIFRoZW1lIGZvbGRlciwgdGhlIHN1Z2dlc3RlZCBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cw0KLWFuZCBvdGhlciBzdHlsZS1yZWxhdGVkIG9iamVjdHMuPC9saT4NCi08bGk+dGhlIGFiaWxpdHkgdG8gZGVmaW5lIGZvbGRlcnMgb3V0c2lkZSBvZiB0aGUgV2ViIGNvbnRlbnQgZm9sZGVyLCBmb3Igc3RvcmluZw0KLWludGVybWVkaWF0ZSBmaWxlcywgc3VjaCBhcyBNSUYgZmlsZXM8L2xpPg0KLTxsaT5hIGNvbnZlcnNpb24gcGF0aCBmcm9tIGEgc3RhdGljIFdlYiBwcm9qZWN0IHRvIGEgZHluYW1pYyBXZWIgcHJvamVjdC4NCi1JZiB5b3UgZGVjaWRlIHRvIDx4cmVmIGhyZWY9InR3cGNudnJ0LmRpdGEiIHNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+Y29udmVydDwveHJlZj4gdGhlDQotcHJvamVjdCwgaXQgd2lsbCBiZSBhIGZ1bGx5LXZhbGlkIGR5bmFtaWMgV2ViIHByb2plY3QuIDwvbGk+DQotPC91bD48L3A+DQotPHA+SW4gYWRkaXRpb24sIHlvdXIgcHJvamVjdCB3aWxsIHN0aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBmZWF0dXJlcyAod2hpY2gNCi1hcmUgY29tbW9uIHRvIGJvdGggc3RhdGljIGFuZCBkeW5hbWljIFdlYiBwcm9qZWN0cyApIDogPHVsPg0KLTxsaT5IVE1MIHN5bnRheCB2YWxpZGF0aW9uPC9saT4NCi08bGk+YSBicm9rZW4gbGluayBmaXgtdXAgd2l6YXJkPC9saT4NCi08bGk+YSBXZWIgc2l0ZSBuYXZpZ2F0aW9uIHRvb2w8L2xpPg0KLTxsaT5hIG5ldyBzZXJ2ZXIgdHlwZSwgdGhlIFN0YXRpYyBXZWIgc2VydmVyLCB3aGljaCBtYWtlcyBpdCBlYXN5IHRvIHB1Ymxpc2gNCi1zdGF0aWMgV2ViIHByb2plY3RzPC9saT4NCi08L3VsPiA8L3A+DQotPHA+VGhlIGZvbGRlciB0aGF0IGEgc3RhdGljIFdlYiBwcm9qZWN0IGlzIHB1Ymxpc2hlZCB0byBpcyBtb2RpZmlhYmxlLCBzbw0KLXRoYXQgd2hlbiB5b3Ugc2V0IHRoZSBwdWJsaXNoaW5nICJyb290IiB2YWx1ZSAoY2FsbGVkIGEgPGk+Y29udGV4dCByb290PC9pPiksDQotc3VjaCBhcyA8Y29kZXBoPi93ZWIxPC9jb2RlcGg+LCBmb3IgYSBzdGF0aWMgcHJvamVjdCwgZXZlcnl0aGluZyBpbiB0aGUgV2ViDQotY29udGVudCBmb2xkZXIgd2lsbCBiZSBwdWJsaXNoZWQgdG8gdGhlIDxmaWxlcGF0aD53ZWIxPC9maWxlcGF0aD4gZm9sZGVyIHVuZGVyDQotdGhlIFdlYiBzZXJ2ZXIncyBkb2Mgcm9vdC4gVGhpcyBlbmFibGVzIHlvdSB0byBncm91cCBXZWIgcmVzb3VyY2VzIG9uIGEgV2ViDQotc2VydmVyIGluIGZvbGRlcnMgdGhhdCBjb3JyZXNwb25kIHRvIFdlYiBwcm9qZWN0cyBpbiB0aGUgd29ya2JlbmNoLiBXaGVuIHByb2plY3RzDQotZGVmaW5lZCBpbiB0aGlzIHdheSBhcmUgcmVhZHkgZm9yIHByb2R1Y3Rpb24sIHlvdSBjYW4gcHVibGlzaCBzcGVjaWZpYyBwcm9qZWN0cw0KLWRpcmVjdGx5IHRvIHRoZSBkb2Mgcm9vdCBieSBjaGFuZ2luZyB0aGUgdmFsdWUgdG8gPGNvZGVwaD4vPC9jb2RlcGg+IGFuZCBhbGwNCi1wdWJsaXNoaW5nLCBsaW5rIGZpeGluZywgYW5kIGJyb3dzaW5nIHdpbGwgdXBkYXRlIGF1dG9tYXRpY2FsbHkuPC9wPg0KLTxwPkFsaWFzZXMgY2FuIGFsc28gYmUgdXNlZCB0byBzcGVjaWZ5IGEgY29udGV4dCByb290IHZhbHVlLiBGb3IgZXhhbXBsZSwNCi1zdXBwb3NlIHRoYXQgdGhlcmUgaXMgYW4gYWxpYXMgdGhhdCBpcyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgV2ViIHNlcnZlciwgYXMNCi1mb2xsb3dzOiA8Y29kZWJsb2NrPkFsaWFzIC9zY3JpcHRzLyAiL3Zhci93d3cvc2NyaXB0cyI8L2NvZGVibG9jaz5JbiB0aGlzDQotZXhhbXBsZSwgaW4gd2hpY2ggdGhlIGN1cnJlbnQgc3RhdGljIFdlYiBwcm9qZWN0IHdpbGwgY29udGFpbiBjb21tb24gPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4gZmlsZXMsDQoteW91IGNhbiBzZXQgdGhlIGNvbnRleHQgcm9vdCB2YWx1ZSB0byBiZSA8cGg+InNjcmlwdHMiPC9waD4uICBJbiBvcmRlciBmb3INCi10aGUgcmVzb3VyY2VzIGluIHRoZSBzdGF0aWMgV2ViIHByb2plY3QgdG8gYmUgcHVibGlzaGVkIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uDQotb24gdGhlIFdlYiBzZXJ2ZXIsIHlvdSBtdXN0IGFkZCB0aGlzIEFsaWFzIG1hcHBpbmcgdG8gdGhlIHNlcnZlciB0b29scyBpbnN0YW5jZQ0KLW9mIHRoZSBzdGF0aWMgV2ViIHNlcnZlciwgYXMgZm9sbG93cy4gIDxvbD4NCi08bGk+RnJvbSB0aGUgU2VydmVyIHZpZXcsIGRvdWJsZS1jbGljayBvbiB0aGUgc3RhdGljIFdlYiBzZXJ2ZXIgY29uZmlndXJhdGlvbg0KLXRvIG9wZW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGVkaXRvci48bm90ZT5UaGlzIGFzc3VtZXMgdGhhdCB5b3UndmUgYWxyZWFkeQ0KLWRlZmluZWQgdGhlIHN0YXRpYyBXZWIgc2VydmVyLjwvbm90ZT48L2xpPg0KLTxsaT5DbGljayB0aGUgPHVpY29udHJvbD5Db25maWd1cmF0aW9uPC91aWNvbnRyb2w+IGVkaXRvciB0YWIuPC9saT4NCi08bGk+U2Nyb2xsIGRvd24gdG8gdGhlIDx1aWNvbnRyb2w+QWxpYXMgUGF0aCBNYXBwaW5nPC91aWNvbnRyb2w+IHNlY3Rpb24sDQotYW5kIGFkZCB0aGUgbmV3IEFsaWFzIG1hcHBpbmcuPC9saT4NCi08L29sPk5vdyB0aGF0IDxwaD4ic2NyaXB0cyI8L3BoPiBpcyBkZWZpbmVkIGFzIGFuIEFsaWFzLCB0aGUgV2ViIGNvbnRlbnQgaW4NCi10aGUgc3RhdGljIFdlYiBwcm9qZWN0IHdpbGwgYmUgcHVibGlzaGVkIHRvIHRoZSBtYXBwZWQgcGF0aCwgPGZpbGVwYXRoPi92YXIvd3d3L3NjcmlwdHM8L2ZpbGVwYXRoPi48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2NzdGF0aWMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3N0YXRpYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGFlMzU1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3N0YXRpYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlN0YXRpYyBXZWIgcHJvamVjdHMiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcHJvamVjdHMsIHN0YXRpYywgc3RhdGljIFdlYiBwcm9qZWN0cywgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcHJvamVjdHMsIHN0YXRpYywgc3RhdGljIFdlYiBwcm9qZWN0cywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dlYnJlc291cmNlcy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d3YXJvdnIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3Y3Jlc3RhLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY2NzdGF0aWMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TdGF0aWMgV2ViIHByb2plY3RzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjY3N0YXRpYyI+PGEgbmFtZT0iY2NzdGF0aWMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlN0YXRpYyBXZWIgcHJvamVjdHM8L2gxPgotCi0KLTxkaXY+Ci08cD5JZiB5b3UgIHdhbnQgdG8gY3JlYXRlIGEgY29udGVudC1iYXNlZCBXZWIgYXBwbGljYXRpb24gdGhhdCBkb2VzIG5vdCBjb250YWluCi1hbnkgZHluYW1pYyBjb250ZW50ICAoc3VjaCBhcyBzZXJ2bGV0cywgSlNQIGZpbGVzLCBmaWx0ZXJzLCBhbmQgYXNzb2NpYXRlZAotbWV0YWRhdGEpIHlvdSBtaWdodCBwcmVmZXIgdG8gY3JlYXRlIGEgc3RhdGljIFdlYiBwcm9qZWN0LCBhcyBvcHBvc2VkIHRvIGEgPGEgaHJlZj0iY2N3ZWJwcmouaHRtbCIgdGl0bGU9IiI+ZHluYW1pYyBXZWIgcHJvamVjdDwvYT4uPC9wPgotCi08ZGl2IGNsYXNzPSJwIj5TdGF0aWMgV2ViIHByb2plY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJpc3RpY3M6ICA8dWw+Ci08bGk+YSBXZWIgY29udGVudCBmb2xkZXIgKGNhbGxlZCBXZWJDb250ZW50KSBmb3IgYWxsIHB1Ymxpc2hhYmxlIHJlc291cmNlcywKLVlvdSBjYW4gY2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgZm9sZGVyIGZyb20gdGhlIHByb2plY3QncyBwb3AtdXAgbWVudS48L2xpPgotCi08bGk+YSBUaGVtZSBmb2xkZXIsIHRoZSBzdWdnZXN0ZWQgZGlyZWN0b3J5IGZvciBzdG9yaW5nIGNhc2NhZGluZyBzdHlsZSBzaGVldHMKLWFuZCBvdGhlciBzdHlsZS1yZWxhdGVkIG9iamVjdHMuPC9saT4KLQotPGxpPnRoZSBhYmlsaXR5IHRvIGRlZmluZSBmb2xkZXJzIG91dHNpZGUgb2YgdGhlIFdlYiBjb250ZW50IGZvbGRlciwgZm9yIHN0b3JpbmcKLWludGVybWVkaWF0ZSBmaWxlcywgc3VjaCBhcyBNSUYgZmlsZXM8L2xpPgotCi08bGk+YSBjb252ZXJzaW9uIHBhdGggZnJvbSBhIHN0YXRpYyBXZWIgcHJvamVjdCB0byBhIGR5bmFtaWMgV2ViIHByb2plY3QuCi1JZiB5b3UgZGVjaWRlIHRvIDxhIGhyZWY9InR3cGNudnJ0Lmh0bWwiIHRpdGxlPSIiPmNvbnZlcnQ8L2E+IHRoZQotcHJvamVjdCwgaXQgd2lsbCBiZSBhIGZ1bGx5LXZhbGlkIGR5bmFtaWMgV2ViIHByb2plY3QuIDwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0icCI+SW4gYWRkaXRpb24sIHlvdXIgcHJvamVjdCB3aWxsIHN0aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBmZWF0dXJlcyAod2hpY2gKLWFyZSBjb21tb24gdG8gYm90aCBzdGF0aWMgYW5kIGR5bmFtaWMgV2ViIHByb2plY3RzICkgOiA8dWw+Ci08bGk+SFRNTCBzeW50YXggdmFsaWRhdGlvbjwvbGk+Ci0KLTxsaT5hIGJyb2tlbiBsaW5rIGZpeC11cCB3aXphcmQ8L2xpPgotCi08bGk+YSBXZWIgc2l0ZSBuYXZpZ2F0aW9uIHRvb2w8L2xpPgotCi08bGk+YSBuZXcgc2VydmVyIHR5cGUsIHRoZSBTdGF0aWMgV2ViIHNlcnZlciwgd2hpY2ggbWFrZXMgaXQgZWFzeSB0byBwdWJsaXNoCi1zdGF0aWMgV2ViIHByb2plY3RzPC9saT4KLQotPC91bD4KLSA8L2Rpdj4KLQotPHA+VGhlIGZvbGRlciB0aGF0IGEgc3RhdGljIFdlYiBwcm9qZWN0IGlzIHB1Ymxpc2hlZCB0byBpcyBtb2RpZmlhYmxlLCBzbwotdGhhdCB3aGVuIHlvdSBzZXQgdGhlIHB1Ymxpc2hpbmcgInJvb3QiIHZhbHVlIChjYWxsZWQgYSA8ZW0+Y29udGV4dCByb290PC9lbT4pLAotc3VjaCBhcyA8c2FtcCBjbGFzcz0iY29kZXBoIj4vd2ViMTwvc2FtcD4sIGZvciBhIHN0YXRpYyBwcm9qZWN0LCBldmVyeXRoaW5nIGluIHRoZSBXZWIKLWNvbnRlbnQgZm9sZGVyIHdpbGwgYmUgcHVibGlzaGVkIHRvIHRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPndlYjE8L3NwYW4+IGZvbGRlciB1bmRlcgotdGhlIFdlYiBzZXJ2ZXIncyBkb2Mgcm9vdC4gVGhpcyBlbmFibGVzIHlvdSB0byBncm91cCBXZWIgcmVzb3VyY2VzIG9uIGEgV2ViCi1zZXJ2ZXIgaW4gZm9sZGVycyB0aGF0IGNvcnJlc3BvbmQgdG8gV2ViIHByb2plY3RzIGluIHRoZSB3b3JrYmVuY2guIFdoZW4gcHJvamVjdHMKLWRlZmluZWQgaW4gdGhpcyB3YXkgYXJlIHJlYWR5IGZvciBwcm9kdWN0aW9uLCB5b3UgY2FuIHB1Ymxpc2ggc3BlY2lmaWMgcHJvamVjdHMKLWRpcmVjdGx5IHRvIHRoZSBkb2Mgcm9vdCBieSBjaGFuZ2luZyB0aGUgdmFsdWUgdG8gPHNhbXAgY2xhc3M9ImNvZGVwaCI+Lzwvc2FtcD4gYW5kIGFsbAotcHVibGlzaGluZywgbGluayBmaXhpbmcsIGFuZCBicm93c2luZyB3aWxsIHVwZGF0ZSBhdXRvbWF0aWNhbGx5LjwvcD4KLQotPGRpdiBjbGFzcz0icCI+QWxpYXNlcyBjYW4gYWxzbyBiZSB1c2VkIHRvIHNwZWNpZnkgYSBjb250ZXh0IHJvb3QgdmFsdWUuIEZvciBleGFtcGxlLAotc3VwcG9zZSB0aGF0IHRoZXJlIGlzIGFuIGFsaWFzIHRoYXQgaXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IFdlYiBzZXJ2ZXIsIGFzCi1mb2xsb3dzOiA8cHJlPkFsaWFzIC9zY3JpcHRzLyAiL3Zhci93d3cvc2NyaXB0cyI8L3ByZT4KLUluIHRoaXMKLWV4YW1wbGUsIGluIHdoaWNoIHRoZSBjdXJyZW50IHN0YXRpYyBXZWIgcHJvamVjdCB3aWxsIGNvbnRhaW4gY29tbW9uIEphdmFTY3JpcHTihKIgZmlsZXMsCi15b3UgY2FuIHNldCB0aGUgY29udGV4dCByb290IHZhbHVlIHRvIGJlIDxzcGFuPiJzY3JpcHRzIjwvc3Bhbj4uICBJbiBvcmRlciBmb3IKLXRoZSByZXNvdXJjZXMgaW4gdGhlIHN0YXRpYyBXZWIgcHJvamVjdCB0byBiZSBwdWJsaXNoZWQgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb24KLW9uIHRoZSBXZWIgc2VydmVyLCB5b3UgbXVzdCBhZGQgdGhpcyBBbGlhcyBtYXBwaW5nIHRvIHRoZSBzZXJ2ZXIgdG9vbHMgaW5zdGFuY2UKLW9mIHRoZSBzdGF0aWMgV2ViIHNlcnZlciwgYXMgZm9sbG93cy4gIDxvbD4KLTxsaT5Gcm9tIHRoZSBTZXJ2ZXIgdmlldywgZG91YmxlLWNsaWNrIG9uIHRoZSBzdGF0aWMgV2ViIHNlcnZlciBjb25maWd1cmF0aW9uCi10byBvcGVuIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBlZGl0b3IuPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRoaXMgYXNzdW1lcyB0aGF0IHlvdSd2ZSBhbHJlYWR5Ci1kZWZpbmVkIHRoZSBzdGF0aWMgV2ViIHNlcnZlci48L2Rpdj4KLTwvbGk+Ci0KLTxsaT5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29uZmlndXJhdGlvbjwvc3Bhbj4gZWRpdG9yIHRhYi48L2xpPgotCi08bGk+U2Nyb2xsIGRvd24gdG8gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFsaWFzIFBhdGggTWFwcGluZzwvc3Bhbj4gc2VjdGlvbiwKLWFuZCBhZGQgdGhlIG5ldyBBbGlhcyBtYXBwaW5nLjwvbGk+Ci0KLTwvb2w+Ci1Ob3cgdGhhdCA8c3Bhbj4ic2NyaXB0cyI8L3NwYW4+IGlzIGRlZmluZWQgYXMgYW4gQWxpYXMsIHRoZSBXZWIgY29udGVudCBpbgotdGhlIHN0YXRpYyBXZWIgcHJvamVjdCB3aWxsIGJlIHB1Ymxpc2hlZCB0byB0aGUgbWFwcGVkIHBhdGgsIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+L3Zhci93d3cvc2NyaXB0czwvc3Bhbj4uPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3ZWJyZXNvdXJjZXMuaHRtbCIgdGl0bGU9IiI+V2ViIHJlc291cmNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3d2Fyb3ZyLmh0bWwiIHRpdGxlPSIiPldlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2NyZXN0YS5odG1sIj5DcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJwcmouZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnByai5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTVhYzVmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnByai5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY2N3ZWJwcmoiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmVudGVycHJpc2UgYXBwbGljYXRpb25zPGluZGV4dGVybT5wcm9qZWN0czxpbmRleHRlcm0+ZHluYW1pYw0KLVdlYiBwcm9qZWN0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+V2ViIHByb2plY3RzPGluZGV4dGVybT5keW5hbWljDQotcHJvamVjdHMgb3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+VGhlcmUgYXJlIHR3byB0eXBlcyBvZiBXZWIgcHJvamVjdHM6IGR5bmFtaWMgYW5kIDx4cmVmIGhyZWY9ImNjc3RhdGljLmRpdGEiDQotc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz5zdGF0aWM8L3hyZWY+LiBEeW5hbWljIHdlYiBwcm9qZWN0cyBjYW4gY29udGFpbg0KLWR5bmFtaWMgSmF2YSBFRSByZXNvdXJjZXMgc3VjaCBhcyBzZXJ2bGV0cywgSlNQIGZpbGVzLCBmaWx0ZXJzLCBhbmQgYXNzb2NpYXRlZA0KLW1ldGFkYXRhLCBpbiBhZGRpdGlvbiB0byBzdGF0aWMgcmVzb3VyY2VzIHN1Y2ggYXMgaW1hZ2VzIGFuZCBIVE1MIGZpbGVzLiBTdGF0aWMNCi13ZWIgcHJvamVjdHMgb25seSBjb250YWlucyBzdGF0aWMgcmVzb3VyY2VzLiBXaGVuIHlvdSBjcmVhdGUgV2ViIHByb2plY3RzLA0KLXlvdSBjYW4gaW5jbHVkZSBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzIGFuZCBKU1AgdGFnIGxpYnJhcmllcyAoZm9yIGR5bmFtaWMNCi1XZWIgcHJvamVjdHMpLCBzbyB0aGF0IHlvdSBjYW4gYmVnaW4gZGV2ZWxvcG1lbnQgd2l0aCBhIHJpY2hlciBzZXQgb2YgcHJvamVjdA0KLXJlc291cmNlcy48L3A+DQotPHA+RHluYW1pYyBXZWIgcHJvamVjdHMgYXJlIGFsd2F5cyBlbWJlZGRlZCBpbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3RzLg0KLVRoZSB3aXphcmQgdGhhdCB5b3UgdXNlIHRvIGNyZWF0ZSBhIGR5bmFtaWMgV2ViIHByb2plY3Qgd2lsbCBhbHNvIGNyZWF0ZSBhbg0KLUVudGVycHJpc2UgQXBwbGljYXRpb24gKEVBUikgcHJvamVjdCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBUaGUgd2l6YXJkDQotd2lsbCBhbHNvIHVwZGF0ZSB0aGUgPGZpbGVwYXRoPmFwcGxpY2F0aW9uLnhtbDwvZmlsZXBhdGg+IGRlcGxveW1lbnQgZGVzY3JpcHRvcg0KLW9mIHRoZSBzcGVjaWZpZWQgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IHRvIGRlZmluZSB0aGUgV2ViIHByb2plY3QNCi1hcyBhIG1vZHVsZSBlbGVtZW50LiBJZiB5b3UgYXJlIGltcG9ydGluZyBhIFdBUiBmaWxlIHJhdGhlciB0aGFuIGNyZWF0aW5nDQotYSBkeW5hbWljIFdlYiBwcm9qZWN0IG5ldywgdGhlIFdBUiBJbXBvcnQgd2l6YXJkIHJlcXVpcmVzIHRoYXQgeW91IHNwZWNpZnkNCi1hIFdlYiBwcm9qZWN0LCB3aGljaCBhbHJlYWR5IHJlcXVpcmVzIGFuIEVBUiBwcm9qZWN0LiA8L3A+DQotPHA+SmF2YSBFRSBjb252ZW50aW9ucyBtYXkgcmVwcmVzZW50IGV4dHJhIG92ZXJoZWFkIGlmIHlvdSBvbmx5IHdhbnQgdG8gY3JlYXRlDQotYSBzdGF0aWMsIGNvbnRlbnQtYmFzZWQgV2ViIGFwcGxpY2F0aW9uLCB3aGljaCBjb250YWlucyBubyBkeW5hbWljIGZpbGVzLA0KLXN1Y2ggYXMgSlNQIGZpbGVzIG9yIHNlcnZsZXRzLiBJbiB0aGlzIGNhc2UsIHdoZW4geW91IG5lZWQgb25seSB0aGUgbW9zdCBiYXNpYw0KLVdlYiBwcm9qZWN0LCB5b3UgbWlnaHQgd2FudCB0byB1c2UgdGhlIDxpPnN0YXRpYzwvaT4gV2ViIHByb2plY3QgdHlwZSAoc2VlIDx4cmVmDQotaHJlZj0iY2NzdGF0aWMuZGl0YSIgc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz5TdGF0aWMgV2ViIHByb2plY3RzPC94cmVmPikuDQotIE5vdGUgdGhhdCBzdGF0aWMgV2ViIHByb2plY3RzIGNhbiAgYmUgY29udmVydGVkIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzIGJ5DQotc2VsZWN0aW5nIDxiPkNvbnZlcnQgdG8gYSBEeW5hbWljIFdlYiBQcm9qZWN0PC9iPiwgZnJvbSB0aGUgUHJvamVjdCBtZW51LjwvcD4NCi08cD5UaGUgSmF2YSBFRSBtb2RlbCwgYW5kIG1vcmUgc3BlY2lmaWNhbGx5LCB0aGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyA8dG0NCi10bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBTZXJ2bGV0DQotMi4zIFNwZWNpZmljYXRpb248L2NpdGU+LCBkZWZpbmVzIGEgV2ViIGFwcGxpY2F0aW9uIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdGhhdA0KLXNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgV2ViIGNvbnRlbnQgZmlsZXMsIGNsYXNzIGZpbGVzLCBjbGFzcyBwYXRocywgZGVwbG95bWVudA0KLWRlc2NyaXB0b3JzLCBhbmQgc3VwcG9ydGluZyBtZXRhZGF0YS4gVGhlIFdlYiBwcm9qZWN0IGhpZXJhcmNoeSBtaXJyb3JzIHRoYXQNCi1vZiB0aGUgV2ViIGFwcGxpY2F0aW9uIGNyZWF0ZWQgZnJvbSBhIHByb2plY3QuIEluIHRoZSB3b3JrYmVuY2gsIHlvdSBjYW4gdXNlDQotdGhlIDxwaD5OZXcgV2ViIFByb2plY3Q8L3BoPiB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IFdlYiBwcm9qZWN0LjwvcD4NCi08cD5UaGUgbWFpbiBwcm9qZWN0IGZvbGRlciBjb250YWlucyBhbGwgZGV2ZWxvcG1lbnQgb2JqZWN0cyByZWxhdGVkIHRvIGEgV2ViDQotYXBwbGljYXRpb24uIFRoZSBXZWIgY29udGVudCBmb2xkZXIgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIHRoZSBwcm9qZWN0IG5lY2Vzc2FyeQ0KLXRvIGNyZWF0ZSBhIFdlYiBhcHBsaWNhdGlvbi4gVGhpcyBmb2xkZXIgc3RydWN0dXJlIG1hcHMgdG8gdGhlIFdlYiBhcHBsaWNhdGlvbg0KLWFyY2hpdmUgKFdBUikgc3RydWN0dXJlIGRlZmluZWQgYnkgU3VuIE1pY3Jvc3lzdGVtcy4uIFRoZSBmb2xsb3dpbmcgZGVmYXVsdA0KLWVsZW1lbnRzIGFyZSBsb2NhdGVkIGluIHRoZSBXZWIgcHJvamVjdCBmb2xkZXIgaGllcmFyY2h5OiA8bm90ZT5JbiB0aGUgUHJvamVjdA0KLUV4cGxvcmVyIHZpZXcsIFdlYiBwcm9qZWN0cyBhcmUgZmlsdGVyZWQgaW50byBmb2xkZXIgbm9kZXMgdG8gY3VzdG9taXplIHRoZQ0KLWRpc3BsYXkgb2YgV2ViIHJlc291cmNlcyBmb3IgZWFzeSBtYW5hZ2VtZW50IGR1cmluZyBkZXZlbG9wbWVudC4gRm9yIGluZm9ybWF0aW9uDQotb24gdGhlIGZpbHRlcmVkIHN0cnVjdHVyZSwgc2VlIDx4cmVmIGhyZWY9ImNjd2VidncuZGl0YSIgc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz5Qcm9qZWN0DQotRXhwbG9yZXIgdmlldzwveHJlZj4uPC9ub3RlPjxkbD48ZGxlbnRyeT4NCi08ZHQ+V2ViIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZHQ+DQotPGRkPlRoZSBzdGFuZGFyZCBXZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yICh0aGUgPGZpbGVwYXRoPndlYi54bWw8L2ZpbGVwYXRoPiBmaWxlKS48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SmF2YVNvdXJjZTwvZHQ+DQotPGRkPkNvbnRhaW5zIHRoZSBwcm9qZWN0J3MgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gc291cmNlIGNvZGUgZm9yIGNsYXNzZXMsIGJlYW5zLCBhbmQNCi1zZXJ2bGV0cy4gV2hlbiB0aGVzZSByZXNvdXJjZXMgYXJlIGFkZGVkIHRvIGEgV2ViIHByb2plY3QsIHRoZXkgYXJlIGF1dG9tYXRpY2FsbHkNCi1jb21waWxlZCBhbmQgdGhlIGdlbmVyYXRlZCBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIFdFQi1JTkYvY2xhc3NlcyBkaXJlY3RvcnkuDQotVGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZSBub3QgcGFja2FnZWQgaW4gV0FSIGZpbGVzIHVubGVzcw0KLWFuIG9wdGlvbiBpcyBzcGVjaWZpZWQgd2hlbiBhIFdBUiBmaWxlIGlzIGNyZWF0ZWQuIDxub3RlPlRob3VnaCB0aGUgZGVmYXVsdA0KLW5hbWUgZ2l2ZW4gdG8gdGhlIGZvbGRlciBpcyBKYXZhU291cmNlcywgeW91IGNhbiBjaGFuZ2UgdGhlIG5hbWUgYnkgcmlnaHQNCi1jbGlja2luZyBvbiB0aGUgbmFtZSBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciBhbmQgY2xpY2tpbmcgb24gPG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+UmVmYWN0b3I8L3VpY29udHJvbD48dWljb250cm9sPlJlbmFtZTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+Ljwvbm90ZT48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+aW1wb3J0ZWRfY2xhc3NlcyBmb2xkZXI8L2R0Pg0KLTxkZD5UaGlzIGZvbGRlciBtYXkgYmUgY3JlYXRlZCBkdXJpbmcgYSBXQVIgaW1wb3J0LCBhbmQgY29udGFpbnMgY2xhc3MgZmlsZXMNCi10aGF0IGRvIG5vdCBoYXZlIGFjY29tcGFueWluZyBzb3VyY2UuICBUaGUgPHVpY29udHJvbD5pbXBvcnRlZF9jbGFzc2VzPC91aWNvbnRyb2w+IGZvbGRlcg0KLWlzIGEgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNsYXNzZXMNCi1mb2xkZXI7IDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNsYXNzZXMgZm9sZGVycyBjYW4gYWxzbyBiZSBjcmVhdGVkIHVzaW5nIHRoZSBXZWINCi1wcm9qZWN0IDx1aWNvbnRyb2w+SmF2YSBCdWlsZCBQYXRoPC91aWNvbnRyb2w+IHByb3BlcnRpZXMgcGFnZS48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+V2ViQ29udGVudCBmb2xkZXI8L2R0Pg0KLTxkZD5UaGUgbWFuZGF0b3J5IGxvY2F0aW9uIG9mIGFsbCBXZWIgcmVzb3VyY2VzLCBpbmNsdWRpbmcgSFRNTCwgSlNQLCBncmFwaGljDQotZmlsZXMsIGFuZCBzbyBvbi4gSWYgdGhlIGZpbGVzIGFyZSBub3QgcGxhY2VkIGluIHRoaXMgZGlyZWN0b3J5IChvciBpbiBhIHN1YmRpcmVjdG9yeQ0KLXN0cnVjdHVyZSB1bmRlciB0aGlzIGRpcmVjdG9yeSksIHRoZSBmaWxlcyB3aWxsIG5vdCBiZSBhdmFpbGFibGUgd2hlbiB0aGUNCi1hcHBsaWNhdGlvbiBpcyBleGVjdXRlZCBvbiBhIHNlcnZlci4gVGhlIFdlYiBjb250ZW50IGZvbGRlciByZXByZXNlbnRzIHRoZQ0KLWNvbnRlbnRzIG9mIHRoZSBXQVIgZmlsZSB0aGF0IHdpbGwgYmUgZGVwbG95ZWQgdG8gdGhlIHNlcnZlci4gQW55IGZpbGVzIG5vdA0KLXVuZGVyIHRoZSBXZWIgY29udGVudCBmb2xkZXIgYXJlIGNvbnNpZGVyZWQgZGV2ZWxvcG1lbnQtdGltZSByZXNvdXJjZXMgKGZvcg0KLWV4YW1wbGUsIC5qYXZhIGZpbGVzLCAuc3FsIGZpbGVzLCBhbmQgLm1pZiBmaWxlcyksIGFuZCBhcmUgbm90IGRlcGxveWVkIHdoZW4NCi10aGUgcHJvamVjdCBpcyB1bml0IHRlc3RlZCBvciBwdWJsaXNoZWQuIDxub3RlPlRob3VnaCB0aGUgZGVmYXVsdCBuYW1lIGdpdmVuDQotdG8gdGhlIGZvbGRlciBpcyA8ZmlsZXBhdGg+V2ViQ29udGVudDwvZmlsZXBhdGg+LCB5b3UgY2FuIGNoYW5nZSB0aGUgbmFtZQ0KLSBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciBieSByaWdodC1jbGlja2luZyB0aGUgZm9sZGVyIGFuZCBzZWxlY3RpbmcgPHVpY29udHJvbD5SZWZhY3RvcjwvdWljb250cm9sPjx1aWNvbnRyb2w+UmVuYW1lPC91aWNvbnRyb2w+IG9yDQotZnJvbSB0aGUgV2ViIHBhZ2Ugb2YgdGhlIHByb2plY3QncyBQcm9wZXJ0aWVzIGRpYWxvZy4gSW4gYSBkeW5hbWljIFdlYiBwcm9qZWN0LA0KLWNoYW5naW5nIHRoZSBmb2xkZXIgbmFtZSB3aWxsIHVwZGF0ZSB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYnVpbGQgb3V0cHV0IGRpcmVjdG9yeS4gPC9ub3RlPjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5NRVRBLUlORjwvZHQ+DQotPGRkPlRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSA8ZmlsZXBhdGg+TUFOSUZFU1QuTUY8L2ZpbGVwYXRoPiBmaWxlLCB3aGljaA0KLWlzIHVzZWQgdG8gbWFwIGNsYXNzIHBhdGhzIGZvciBkZXBlbmRlbnQgSkFSIGZpbGVzIHRoYXQgZXhpc3QgaW4gb3RoZXIgcHJvamVjdHMNCi1pbiB0aGUgc2FtZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QuIEFuIGVudHJ5IGluIHRoaXMgZmlsZSB3aWxsIHVwZGF0ZQ0KLXRoZSBydW4tdGltZSBwcm9qZWN0IGNsYXNzIHBhdGggYW5kIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJ1aWxkIHNldHRpbmdzIHRvIGluY2x1ZGUgdGhlIHJlZmVyZW5jZWQNCi1KQVIgZmlsZXMuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PnRoZW1lPC9kdD4NCi08ZGQ+VGhlIHN1Z2dlc3RlZCBkaXJlY3RvcnkgZm9yIGNhc2NhZGluZyBzdHlsZSBzaGVldHMgYW5kIG90aGVyIHN0eWxlLXJlbGF0ZWQNCi1vYmplY3RzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5XRUItSU5GPC9kdD4NCi08ZGQ+QmFzZWQgb24gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gU2VydmxldCAyLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4sIHRoaXMNCi1kaXJlY3RvcnkgY29udGFpbnMgdGhlIHN1cHBvcnRpbmcgV2ViIHJlc291cmNlcyBmb3IgYSBXZWIgYXBwbGljYXRpb24sIGluY2x1ZGluZw0KLXRoZSA8ZmlsZXBhdGg+d2ViLnhtbDwvZmlsZXBhdGg+IGZpbGUgYW5kIHRoZSBjbGFzc2VzIGFuZCBsaWIgZGlyZWN0b3JpZXMuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0Pi9jbGFzc2VzPC9kdD4NCi08ZGQ+VGhpcyBkaXJlY3RvcnkgaXMgZm9yIHNlcnZsZXRzLCB1dGlsaXR5IGNsYXNzZXMsIGFuZCB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gY29tcGlsZXINCi1vdXRwdXQgZGlyZWN0b3J5LiBUaGUgY2xhc3NlcyBpbiB0aGlzIGRpcmVjdG9yeSBhcmUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24NCi1jbGFzcyBsb2FkZXIgdG8gbG9hZCB0aGUgY2xhc3Nlcy4gRm9sZGVycyBpbiB0aGlzIGRpcmVjdG9yeSB3aWxsIG1hcCBwYWNrYWdlDQotYW5kIGNsYXNzIG5hbWVzLCBhcyBpbjogPGNvZGVwaD4vV0VCLUlORi9jbGFzc2VzL2NvbS9teWNvcnAvc2VydmxldHMvTXlTZXJ2bGV0LmNsYXNzPC9jb2RlcGg+LjxwPkRvDQotbm90IHBsYWNlIGFueSAuY2xhc3MgZmlsZXMgZGlyZWN0bHkgaW50byB0aGlzIGRpcmVjdG9yeS4gVGhlIC5jbGFzcyBmaWxlcw0KLWFyZSBwbGFjZWQgaW4gdGhpcyBkaXJlY3RvcnkgYXV0b21hdGljYWxseSB3aGVuIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjb21waWxlcg0KLWNvbXBpbGVzIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHNvdXJjZSBmaWxlcyB0aGF0IGFyZSBpbiB0aGUgPGZpbGVwYXRoPkphdmEgUmVzb3VyY2VzPC9maWxlcGF0aD4gZGlyZWN0b3J5Lg0KLUFueSBmaWxlcyBwbGFjZWQgZGlyZWN0bHkgaW4gdGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBkZWxldGVkIGJ5IHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjb21waWxlcg0KLXdoZW4gaXQgcnVucy48L3A+PC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0Pi9saWI8L2R0Pg0KLTxkZD5UaGUgc3VwcG9ydGluZyBKQVIgZmlsZXMgdGhhdCB5b3VyIFdlYiBhcHBsaWNhdGlvbiByZWZlcmVuY2VzLiBBbnkgY2xhc3Nlcw0KLWluIC5qYXIgZmlsZXMgcGxhY2VkIGluIHRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYXZhaWxhYmxlIGZvciB5b3VyIFdlYiBhcHBsaWNhdGlvbjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5MaWJyYXJpZXM8L2R0Pg0KLTxkZD5UaGUgc3VwcG9ydGluZyBKQVIgZmlsZXMgdGhhdCB5b3VyIFdlYiBhcHBsaWNhdGlvbiByZWZlcmVuY2VzLiBUaGlzIGZvbGRlcg0KLW1pcnJvcnMgdGhlIGNvbnRlbnQgb2YgdGhlIGxpYiBmb2xkZXIuIEluIGFkZGl0aW9uLCBXZWIgTGlicmFyeSBQcm9qZWN0cywNCi13aGljaCBhcmUgInZpcnR1YWwiIEpBUiBmaWxlcyB0aGF0IGRvIG5vdCBwaHlzaWNhbGx5IHJlc2lkZSBpbiB0aGUgV2ViIHByb2plY3QsDQotYnV0IGFyZSBhc3NvY2lhdGVkIHdpdGggPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gcHJvamVjdHMgZWxzZXdoZXJlIGluIHlvdXIgd29ya3NwYWNlLA0KLWFyZSBpbmNsdWRlZCBpbiB0aGlzIGZvbGRlci4gVGhleSBhcmUgcGFja2FnZWQgd2l0aCB5b3VyIHByb2plY3Qgd2hlbiB5b3UNCi1leHBvcnQgdGhlIGFwcGxpY2F0aW9uJ3MgV0FSIGZpbGUuPC9kZD4NCi08L2RsZW50cnk+PC9kbD4gPG5vdGU+QSBsaWJyYXJ5IGVudHJ5IG9uIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBidWlsZCBwYXRoIHdpbGwgcmVtYWluIHRoZXJlIHVubGVzcw0KLXRoZSBhY3R1YWwgSkFSIGZpbGUgaXMgZGVsZXRlZCBmcm9tIHRoZSBXRUItSU5GL2xpYiBmb2xkZXIuIElmIHlvdSByZW1vdmUNCi1hIGxpYnJhcnkgcGF0aCBlbnRyeSBidXQgbm90IHRoZSBKQVIgZmlsZSwgdGhlIGxpYnJhcnkgZW50cnkgd2lsbCBiZSByZS1hZGRlZA0KLXRvIHRoZSBwYXRoIGF1dG9tYXRpY2FsbHkuPC9ub3RlPjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnByai5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd2VicHJqLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OGU1YzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd2VicHJqLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9ucyIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVudGVycHJpc2UgYXBwbGljYXRpb25zLCBwcm9qZWN0cywgZHluYW1pYyBXZWIgcHJvamVjdHMsIFdlYiBwcm9qZWN0cywgZHluYW1pYyBwcm9qZWN0cyBvdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVudGVycHJpc2UgYXBwbGljYXRpb25zLCBwcm9qZWN0cywgZHluYW1pYyBXZWIgcHJvamVjdHMsIFdlYiBwcm9qZWN0cywgZHluYW1pYyBwcm9qZWN0cyBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd2VicmVzb3VyY2VzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3dhcm92ci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdjcmVwcmouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqY3JlanNwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY2N3ZWJwcmoiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5EeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjY3dlYnByaiI+PGEgbmFtZT0iY2N3ZWJwcmoiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnM8L2gxPgotCi0KLTxkaXY+Ci08cD5UaGVyZSBhcmUgdHdvIHR5cGVzIG9mIFdlYiBwcm9qZWN0czogZHluYW1pYyBhbmQgPGEgaHJlZj0iY2NzdGF0aWMuaHRtbCIgdGl0bGU9IiI+c3RhdGljPC9hPi4gRHluYW1pYyB3ZWIgcHJvamVjdHMgY2FuIGNvbnRhaW4KLWR5bmFtaWMgSmF2YSBFRSByZXNvdXJjZXMgc3VjaCBhcyBzZXJ2bGV0cywgSlNQIGZpbGVzLCBmaWx0ZXJzLCBhbmQgYXNzb2NpYXRlZAotbWV0YWRhdGEsIGluIGFkZGl0aW9uIHRvIHN0YXRpYyByZXNvdXJjZXMgc3VjaCBhcyBpbWFnZXMgYW5kIEhUTUwgZmlsZXMuIFN0YXRpYwotd2ViIHByb2plY3RzIG9ubHkgY29udGFpbnMgc3RhdGljIHJlc291cmNlcy4gV2hlbiB5b3UgY3JlYXRlIFdlYiBwcm9qZWN0cywKLXlvdSBjYW4gaW5jbHVkZSBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzIGFuZCBKU1AgdGFnIGxpYnJhcmllcyAoZm9yIGR5bmFtaWMKLVdlYiBwcm9qZWN0cyksIHNvIHRoYXQgeW91IGNhbiBiZWdpbiBkZXZlbG9wbWVudCB3aXRoIGEgcmljaGVyIHNldCBvZiBwcm9qZWN0Ci1yZXNvdXJjZXMuPC9wPgotCi08cD5EeW5hbWljIFdlYiBwcm9qZWN0cyBhcmUgYWx3YXlzIGVtYmVkZGVkIGluIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdHMuCi1UaGUgd2l6YXJkIHRoYXQgeW91IHVzZSB0byBjcmVhdGUgYSBkeW5hbWljIFdlYiBwcm9qZWN0IHdpbGwgYWxzbyBjcmVhdGUgYW4KLUVudGVycHJpc2UgQXBwbGljYXRpb24gKEVBUikgcHJvamVjdCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBUaGUgd2l6YXJkCi13aWxsIGFsc28gdXBkYXRlIHRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPmFwcGxpY2F0aW9uLnhtbDwvc3Bhbj4gZGVwbG95bWVudCBkZXNjcmlwdG9yCi1vZiB0aGUgc3BlY2lmaWVkIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCB0byBkZWZpbmUgdGhlIFdlYiBwcm9qZWN0Ci1hcyBhIG1vZHVsZSBlbGVtZW50LiBJZiB5b3UgYXJlIGltcG9ydGluZyBhIFdBUiBmaWxlIHJhdGhlciB0aGFuIGNyZWF0aW5nCi1hIGR5bmFtaWMgV2ViIHByb2plY3QgbmV3LCB0aGUgV0FSIEltcG9ydCB3aXphcmQgcmVxdWlyZXMgdGhhdCB5b3Ugc3BlY2lmeQotYSBXZWIgcHJvamVjdCwgd2hpY2ggYWxyZWFkeSByZXF1aXJlcyBhbiBFQVIgcHJvamVjdC4gPC9wPgotCi08cD5KYXZhIEVFIGNvbnZlbnRpb25zIG1heSByZXByZXNlbnQgZXh0cmEgb3ZlcmhlYWQgaWYgeW91IG9ubHkgd2FudCB0byBjcmVhdGUKLWEgc3RhdGljLCBjb250ZW50LWJhc2VkIFdlYiBhcHBsaWNhdGlvbiwgd2hpY2ggY29udGFpbnMgbm8gZHluYW1pYyBmaWxlcywKLXN1Y2ggYXMgSlNQIGZpbGVzIG9yIHNlcnZsZXRzLiBJbiB0aGlzIGNhc2UsIHdoZW4geW91IG5lZWQgb25seSB0aGUgbW9zdCBiYXNpYwotV2ViIHByb2plY3QsIHlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGUgPGVtPnN0YXRpYzwvZW0+IFdlYiBwcm9qZWN0IHR5cGUgKHNlZSA8YSBocmVmPSJjY3N0YXRpYy5odG1sIiB0aXRsZT0iIj5TdGF0aWMgV2ViIHByb2plY3RzPC9hPikuCi0gTm90ZSB0aGF0IHN0YXRpYyBXZWIgcHJvamVjdHMgY2FuICBiZSBjb252ZXJ0ZWQgdG8gZHluYW1pYyBXZWIgcHJvamVjdHMgYnkKLXNlbGVjdGluZyA8c3Ryb25nPkNvbnZlcnQgdG8gYSBEeW5hbWljIFdlYiBQcm9qZWN0PC9zdHJvbmc+LCBmcm9tIHRoZSBQcm9qZWN0IG1lbnUuPC9wPgotCi08cD5UaGUgSmF2YSBFRSBtb2RlbCwgYW5kIG1vcmUgc3BlY2lmaWNhbGx5LCB0aGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKYXZh4oSiIFNlcnZsZXQKLTIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPiwgZGVmaW5lcyBhIFdlYiBhcHBsaWNhdGlvbiBkaXJlY3Rvcnkgc3RydWN0dXJlIHRoYXQKLXNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgV2ViIGNvbnRlbnQgZmlsZXMsIGNsYXNzIGZpbGVzLCBjbGFzcyBwYXRocywgZGVwbG95bWVudAotZGVzY3JpcHRvcnMsIGFuZCBzdXBwb3J0aW5nIG1ldGFkYXRhLiBUaGUgV2ViIHByb2plY3QgaGllcmFyY2h5IG1pcnJvcnMgdGhhdAotb2YgdGhlIFdlYiBhcHBsaWNhdGlvbiBjcmVhdGVkIGZyb20gYSBwcm9qZWN0LiBJbiB0aGUgd29ya2JlbmNoLCB5b3UgY2FuIHVzZQotdGhlIDxzcGFuPk5ldyBXZWIgUHJvamVjdDwvc3Bhbj4gd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBXZWIgcHJvamVjdC48L3A+Ci0KLTxkaXYgY2xhc3M9InAiPlRoZSBtYWluIHByb2plY3QgZm9sZGVyIGNvbnRhaW5zIGFsbCBkZXZlbG9wbWVudCBvYmplY3RzIHJlbGF0ZWQgdG8gYSBXZWIKLWFwcGxpY2F0aW9uLiBUaGUgV2ViIGNvbnRlbnQgZm9sZGVyIGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiB0aGUgcHJvamVjdCBuZWNlc3NhcnkKLXRvIGNyZWF0ZSBhIFdlYiBhcHBsaWNhdGlvbi4gVGhpcyBmb2xkZXIgc3RydWN0dXJlIG1hcHMgdG8gdGhlIFdlYiBhcHBsaWNhdGlvbgotYXJjaGl2ZSAoV0FSKSBzdHJ1Y3R1cmUgZGVmaW5lZCBieSBTdW4gTWljcm9zeXN0ZW1zLi4gVGhlIGZvbGxvd2luZyBkZWZhdWx0Ci1lbGVtZW50cyBhcmUgbG9jYXRlZCBpbiB0aGUgV2ViIHByb2plY3QgZm9sZGVyIGhpZXJhcmNoeTogPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEluIHRoZSBQcm9qZWN0Ci1FeHBsb3JlciB2aWV3LCBXZWIgcHJvamVjdHMgYXJlIGZpbHRlcmVkIGludG8gZm9sZGVyIG5vZGVzIHRvIGN1c3RvbWl6ZSB0aGUKLWRpc3BsYXkgb2YgV2ViIHJlc291cmNlcyBmb3IgZWFzeSBtYW5hZ2VtZW50IGR1cmluZyBkZXZlbG9wbWVudC4gRm9yIGluZm9ybWF0aW9uCi1vbiB0aGUgZmlsdGVyZWQgc3RydWN0dXJlLCBzZWUgPGEgaHJlZj0iY2N3ZWJ2dy5odG1sIiB0aXRsZT0iIj5Qcm9qZWN0IEV4cGxvcmVyIHZpZXc8L2E+LjwvZGl2PgotPGRsPgotPGR0IGNsYXNzPSJkbHRlcm0iPldlYiBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2R0PgotCi08ZGQ+VGhlIHN0YW5kYXJkIFdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKHRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPndlYi54bWw8L3NwYW4+IGZpbGUpLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkphdmFTb3VyY2U8L2R0PgotCi08ZGQ+Q29udGFpbnMgdGhlIHByb2plY3QncyBKYXZhIHNvdXJjZSBjb2RlIGZvciBjbGFzc2VzLCBiZWFucywgYW5kCi1zZXJ2bGV0cy4gV2hlbiB0aGVzZSByZXNvdXJjZXMgYXJlIGFkZGVkIHRvIGEgV2ViIHByb2plY3QsIHRoZXkgYXJlIGF1dG9tYXRpY2FsbHkKLWNvbXBpbGVkIGFuZCB0aGUgZ2VuZXJhdGVkIGZpbGVzIGFyZSBhZGRlZCB0byB0aGUgV0VCLUlORi9jbGFzc2VzIGRpcmVjdG9yeS4KLVRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUgbm90IHBhY2thZ2VkIGluIFdBUiBmaWxlcyB1bmxlc3MKLWFuIG9wdGlvbiBpcyBzcGVjaWZpZWQgd2hlbiBhIFdBUiBmaWxlIGlzIGNyZWF0ZWQuIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUaG91Z2ggdGhlIGRlZmF1bHQKLW5hbWUgZ2l2ZW4gdG8gdGhlIGZvbGRlciBpcyBKYXZhU291cmNlcywgeW91IGNhbiBjaGFuZ2UgdGhlIG5hbWUgYnkgcmlnaHQKLWNsaWNraW5nIG9uIHRoZSBuYW1lIGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIGFuZCBjbGlja2luZyBvbiA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVmYWN0b3I8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVuYW1lPC9zcGFuPjwvc3Bhbj4uPC9kaXY+Ci08L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5pbXBvcnRlZF9jbGFzc2VzIGZvbGRlcjwvZHQ+Ci0KLTxkZD5UaGlzIGZvbGRlciBtYXkgYmUgY3JlYXRlZCBkdXJpbmcgYSBXQVIgaW1wb3J0LCBhbmQgY29udGFpbnMgY2xhc3MgZmlsZXMKLXRoYXQgZG8gbm90IGhhdmUgYWNjb21wYW55aW5nIHNvdXJjZS4gIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5pbXBvcnRlZF9jbGFzc2VzPC9zcGFuPiBmb2xkZXIKLWlzIGEgSmF2YSBjbGFzc2VzCi1mb2xkZXI7IEphdmEgY2xhc3NlcyBmb2xkZXJzIGNhbiBhbHNvIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIFdlYgotcHJvamVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5KYXZhIEJ1aWxkIFBhdGg8L3NwYW4+IHByb3BlcnRpZXMgcGFnZS48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5XZWJDb250ZW50IGZvbGRlcjwvZHQ+Ci0KLTxkZD5UaGUgbWFuZGF0b3J5IGxvY2F0aW9uIG9mIGFsbCBXZWIgcmVzb3VyY2VzLCBpbmNsdWRpbmcgSFRNTCwgSlNQLCBncmFwaGljCi1maWxlcywgYW5kIHNvIG9uLiBJZiB0aGUgZmlsZXMgYXJlIG5vdCBwbGFjZWQgaW4gdGhpcyBkaXJlY3RvcnkgKG9yIGluIGEgc3ViZGlyZWN0b3J5Ci1zdHJ1Y3R1cmUgdW5kZXIgdGhpcyBkaXJlY3RvcnkpLCB0aGUgZmlsZXMgd2lsbCBub3QgYmUgYXZhaWxhYmxlIHdoZW4gdGhlCi1hcHBsaWNhdGlvbiBpcyBleGVjdXRlZCBvbiBhIHNlcnZlci4gVGhlIFdlYiBjb250ZW50IGZvbGRlciByZXByZXNlbnRzIHRoZQotY29udGVudHMgb2YgdGhlIFdBUiBmaWxlIHRoYXQgd2lsbCBiZSBkZXBsb3llZCB0byB0aGUgc2VydmVyLiBBbnkgZmlsZXMgbm90Ci11bmRlciB0aGUgV2ViIGNvbnRlbnQgZm9sZGVyIGFyZSBjb25zaWRlcmVkIGRldmVsb3BtZW50LXRpbWUgcmVzb3VyY2VzIChmb3IKLWV4YW1wbGUsIC5qYXZhIGZpbGVzLCAuc3FsIGZpbGVzLCBhbmQgLm1pZiBmaWxlcyksIGFuZCBhcmUgbm90IGRlcGxveWVkIHdoZW4KLXRoZSBwcm9qZWN0IGlzIHVuaXQgdGVzdGVkIG9yIHB1Ymxpc2hlZC4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRob3VnaCB0aGUgZGVmYXVsdCBuYW1lIGdpdmVuCi10byB0aGUgZm9sZGVyIGlzIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+V2ViQ29udGVudDwvc3Bhbj4sIHlvdSBjYW4gY2hhbmdlIHRoZSBuYW1lCi0gaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgYnkgcmlnaHQtY2xpY2tpbmcgdGhlIGZvbGRlciBhbmQgc2VsZWN0aW5nIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlZmFjdG9yPC9zcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlbmFtZTwvc3Bhbj4gb3IKLWZyb20gdGhlIFdlYiBwYWdlIG9mIHRoZSBwcm9qZWN0J3MgUHJvcGVydGllcyBkaWFsb2cuIEluIGEgZHluYW1pYyBXZWIgcHJvamVjdCwKLWNoYW5naW5nIHRoZSBmb2xkZXIgbmFtZSB3aWxsIHVwZGF0ZSB0aGUgSmF2YSBidWlsZCBvdXRwdXQgZGlyZWN0b3J5LiA8L2Rpdj4KLTwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPk1FVEEtSU5GPC9kdD4KLQotPGRkPlRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPk1BTklGRVNULk1GPC9zcGFuPiBmaWxlLCB3aGljaAotaXMgdXNlZCB0byBtYXAgY2xhc3MgcGF0aHMgZm9yIGRlcGVuZGVudCBKQVIgZmlsZXMgdGhhdCBleGlzdCBpbiBvdGhlciBwcm9qZWN0cwotaW4gdGhlIHNhbWUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0LiBBbiBlbnRyeSBpbiB0aGlzIGZpbGUgd2lsbCB1cGRhdGUKLXRoZSBydW4tdGltZSBwcm9qZWN0IGNsYXNzIHBhdGggYW5kIEphdmEgYnVpbGQgc2V0dGluZ3MgdG8gaW5jbHVkZSB0aGUgcmVmZXJlbmNlZAotSkFSIGZpbGVzLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPnRoZW1lPC9kdD4KLQotPGRkPlRoZSBzdWdnZXN0ZWQgZGlyZWN0b3J5IGZvciBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzIGFuZCBvdGhlciBzdHlsZS1yZWxhdGVkCi1vYmplY3RzLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPldFQi1JTkY8L2R0PgotCi08ZGQ+QmFzZWQgb24gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSmF2YSBTZXJ2bGV0IDIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPiwgdGhpcwotZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBzdXBwb3J0aW5nIFdlYiByZXNvdXJjZXMgZm9yIGEgV2ViIGFwcGxpY2F0aW9uLCBpbmNsdWRpbmcKLXRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPndlYi54bWw8L3NwYW4+IGZpbGUgYW5kIHRoZSBjbGFzc2VzIGFuZCBsaWIgZGlyZWN0b3JpZXMuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+L2NsYXNzZXM8L2R0PgotCi08ZGQ+VGhpcyBkaXJlY3RvcnkgaXMgZm9yIHNlcnZsZXRzLCB1dGlsaXR5IGNsYXNzZXMsIGFuZCB0aGUgSmF2YSBjb21waWxlcgotb3V0cHV0IGRpcmVjdG9yeS4gVGhlIGNsYXNzZXMgaW4gdGhpcyBkaXJlY3RvcnkgYXJlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uCi1jbGFzcyBsb2FkZXIgdG8gbG9hZCB0aGUgY2xhc3Nlcy4gRm9sZGVycyBpbiB0aGlzIGRpcmVjdG9yeSB3aWxsIG1hcCBwYWNrYWdlCi1hbmQgY2xhc3MgbmFtZXMsIGFzIGluOiA8c2FtcCBjbGFzcz0iY29kZXBoIj4vV0VCLUlORi9jbGFzc2VzL2NvbS9teWNvcnAvc2VydmxldHMvTXlTZXJ2bGV0LmNsYXNzPC9zYW1wPi48cD5Ebwotbm90IHBsYWNlIGFueSAuY2xhc3MgZmlsZXMgZGlyZWN0bHkgaW50byB0aGlzIGRpcmVjdG9yeS4gVGhlIC5jbGFzcyBmaWxlcwotYXJlIHBsYWNlZCBpbiB0aGlzIGRpcmVjdG9yeSBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIEphdmEgY29tcGlsZXIKLWNvbXBpbGVzIEphdmEgc291cmNlIGZpbGVzIHRoYXQgYXJlIGluIHRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPkphdmEgUmVzb3VyY2VzPC9zcGFuPiBkaXJlY3RvcnkuCi1BbnkgZmlsZXMgcGxhY2VkIGRpcmVjdGx5IGluIHRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgZGVsZXRlZCBieSB0aGUgSmF2YSBjb21waWxlcgotd2hlbiBpdCBydW5zLjwvcD4KLTwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPi9saWI8L2R0PgotCi08ZGQ+VGhlIHN1cHBvcnRpbmcgSkFSIGZpbGVzIHRoYXQgeW91ciBXZWIgYXBwbGljYXRpb24gcmVmZXJlbmNlcy4gQW55IGNsYXNzZXMKLWluIC5qYXIgZmlsZXMgcGxhY2VkIGluIHRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYXZhaWxhYmxlIGZvciB5b3VyIFdlYiBhcHBsaWNhdGlvbjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkxpYnJhcmllczwvZHQ+Ci0KLTxkZD5UaGUgc3VwcG9ydGluZyBKQVIgZmlsZXMgdGhhdCB5b3VyIFdlYiBhcHBsaWNhdGlvbiByZWZlcmVuY2VzLiBUaGlzIGZvbGRlcgotbWlycm9ycyB0aGUgY29udGVudCBvZiB0aGUgbGliIGZvbGRlci4gSW4gYWRkaXRpb24sIFdlYiBMaWJyYXJ5IFByb2plY3RzLAotd2hpY2ggYXJlICJ2aXJ0dWFsIiBKQVIgZmlsZXMgdGhhdCBkbyBub3QgcGh5c2ljYWxseSByZXNpZGUgaW4gdGhlIFdlYiBwcm9qZWN0LAotYnV0IGFyZSBhc3NvY2lhdGVkIHdpdGggSmF2YSBwcm9qZWN0cyBlbHNld2hlcmUgaW4geW91ciB3b3Jrc3BhY2UsCi1hcmUgaW5jbHVkZWQgaW4gdGhpcyBmb2xkZXIuIFRoZXkgYXJlIHBhY2thZ2VkIHdpdGggeW91ciBwcm9qZWN0IHdoZW4geW91Ci1leHBvcnQgdGhlIGFwcGxpY2F0aW9uJ3MgV0FSIGZpbGUuPC9kZD4KLQotPC9kbD4KLSA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gQSBsaWJyYXJ5IGVudHJ5IG9uIHRoZSBKYXZhIGJ1aWxkIHBhdGggd2lsbCByZW1haW4gdGhlcmUgdW5sZXNzCi10aGUgYWN0dWFsIEpBUiBmaWxlIGlzIGRlbGV0ZWQgZnJvbSB0aGUgV0VCLUlORi9saWIgZm9sZGVyLiBJZiB5b3UgcmVtb3ZlCi1hIGxpYnJhcnkgcGF0aCBlbnRyeSBidXQgbm90IHRoZSBKQVIgZmlsZSwgdGhlIGxpYnJhcnkgZW50cnkgd2lsbCBiZSByZS1hZGRlZAotdG8gdGhlIHBhdGggYXV0b21hdGljYWxseS48L2Rpdj4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd2VicmVzb3VyY2VzLmh0bWwiIHRpdGxlPSIiPldlYiByZXNvdXJjZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3dhcm92ci5odG1sIiB0aXRsZT0iIj5XZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdjcmVwcmouaHRtbCI+Q3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpjcmVqc3AuaHRtbCI+Q3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJ2dy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd2VidncuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwNDNlMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJ2dy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjY3dlYnZ3IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Qcm9qZWN0IEV4cGxvcmVyIHZpZXcgYW5kIFdlYiBkZXZlbG9wbWVudDwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0ga2V5cmVmPSJjY3dlYnZ3fDF8UHJvamVjdEV4cGxvcmVydmlld292ZXJ2aWV3IiBzdGF0dXM9Im5ldyI+UHJvamVjdA0KLUV4cGxvcmVyIHZpZXc8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybSBrZXlyZWY9ImNjd2Vidnd8MnxXZWJkZXZlbG9wbWVudFByb2plY3RFeHBsb3JlcnZpZXciDQotc3RhdHVzPSJjaGFuZ2VkIj5XZWIgcHJvamVjdHM8aW5kZXh0ZXJtPlByb2plY3QgRXhwbG9yZXIgdmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08c2VjdGlvbj48cD5UaGUgUHJvamVjdCBFeHBsb3JlciB2aWV3IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgbm90YWJsZSBmZWF0dXJlczogPHVsPg0KLTxsaT48aW1hZ2UgYWx0PSJGb3IgV2luZG93cyIgaHJlZj0iLi4vaW1hZ2VzL253aW4uZ2lmIiBwbGFjZW1lbnQ9ImlubGluZSI+DQotPC9pbWFnZT4gWW91IGNhbiBkcmFnIGFuZCBkcm9wIGZpbGVzIGZyb20gPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9Ik1pY3Jvc29mdCBDb3Jwb3JhdGlvbiINCi10bXR5cGU9InJlZyIgdHJhZGVtYXJrPSJXaW5kb3dzIj5XaW5kb3dzPC90bT4gRXhwbG9yZXIgb3IgdGhlIGRlc2t0b3AgaW50bw0KLXRoZSBOYXZpZ2F0b3Igdmlldy48L2xpPg0KLTxsaT5WaWV3IGZpbHRlcmluZyBpcyBzdXBwb3J0ZWQgYnkgc2VsZWN0aW5nIDxwaD48dWljb250cm9sPkZpbHRlcnM8L3VpY29udHJvbD48L3BoPiBmcm9tDQotdGhlIE5hdmlnYXRvciB2aWV3IDxwaD48dWljb250cm9sPk1lbnU8L3VpY29udHJvbD48L3BoPiBidXR0b24uIFJlc291cmNlcw0KLWNhbiBiZSBmaWx0ZXJlZCBieSBuYW1lLCBwcm9qZWN0IHR5cGUgb3IgY29udGVudCB0eXBlLiBGaWxlcyBiZWdpbm5pbmcgd2l0aA0KLWEgcGVyaW9kIGFyZSBmaWx0ZXJlZCBvdXQgYnkgZGVmYXVsdC48L2xpPg0KLTxsaT5UaGUgc3RhdHVzIGxpbmUgc2hvd3MgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UuPC9saT4NCi08bGk+RHJhZ2dpbmcgYSAuamF2YSBmaWxlIGZyb20gdGhlIE5hdmlnYXRvciB2aWV3IGludG8gYSBKU1AgZmlsZSB3aWxsIGluc2VydA0KLWEgdXNlYmVhbiB0YWcsIHRoZSBzYW1lIGJlaGF2aW9yIHRoYXQgaXMgZXhoaWJpdGVkIHdoZW4gYSAuY2xhc3MgZmlsZSBpcyBkcmFnZ2VkDQotaW50byBhIEpTUCBmaWxlLjwvbGk+DQotPGxpPkVycm9ycyBhbmQgd2FybmluZ3Mgb24gcmVzb3VyY2VzIChpbmNsdWRpbmcgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4sIEhUTUwvSlNQLCBhbmQgTGlua3MgQnVpbGRlciBlcnJvcnMNCi1hbmQgd2FybmluZ3MpIGFyZSBpbmRpY2F0ZWQgd2l0aCBhIHJlZCBlcnJvciA8aW1hZ2UgYWx0PSJFcnJvciBpY29uIiBocmVmPSIuLi9pbWFnZXMvbnNob3dlcnIuZ2lmIg0KLXBsYWNlbWVudD0iaW5saW5lIj48L2ltYWdlPiBvciB5ZWxsb3cgd2FybmluZyA8aW1hZ2UgYWx0PSJXYXJuaW5nIGljb24iIGhyZWY9Ii4uL2ltYWdlcy9ud2FybmluZy5naWYiDQotcGxhY2VtZW50PSJpbmxpbmUiPjwvaW1hZ2U+IG5leHQgdG8gdGhlIHJlc291cmNlIHdpdGggdGhlIGVycm9yLCBhcyB3ZWxsIGFzDQotdGhlIHBhcmVudCBjb250YWluZXJzIHVwIHRvIHRoZSBwcm9qZWN0LiBUaGlzIGFwcGxpZXMgZm9yIGFsbCBwcm9qZWN0IHR5cGVzLA0KLW5vdCBvbmx5IFdlYiBwcm9qZWN0cy48L2xpPg0KLTxsaT5JdGVtcyBhdmFpbGFibGUgZnJvbSB0aGUgPHBoPjx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+PC9waD4gY2FzY2FkaW5nDQotbWVudSBpbiB0aGUgcHJvamVjdCBwb3AtdXAgbWVudSBhcmUgY29udGV4dCBzZW5zaXRpdmUuICBBbGwgbWVudXMgd2lsbCBoYXZlIDxwaD48dWljb250cm9sPlByb2plY3Q8L3VpY29udHJvbD48L3BoPiBhbmQgPHBoPjx1aWNvbnRyb2w+T3RoZXI8L3VpY29udHJvbA0KLT48L3BoPiBvcHRpb25zLjwvbGk+DQotPC91bD48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5Pcmdhbml6YXRpb24gb2YgdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldzwvdGl0bGU+PHA+VGhlIFByb2plY3QNCi1FeHBsb3JlciB2aWV3IHNob3dzIGEgY3VzdG9tIHZpZXcgb2YgYWxsIFdlYiBwcm9qZWN0cy4gVGhlIGZvbGxvd2luZyBhcmUgc29tZQ0KLW9mIHRoZSBub3RhYmxlIHRvcC1sZXZlbCBvYmplY3RzIHRoYXQgYXBwZWFyIGJlbmVhdGggdGhlIHByb2plY3Qgbm9kZSAoYmFzZWQNCi1vbiBkZWZhdWx0IGZvbGRlciBuYW1lcykuPC9wPjxwPjxiPldlYiBjb250ZW50IGZvbGRlcjwvYj4gLSBUaGlzIGZvbGRlciBjb250YWlucw0KLWl0ZW1zIHRvIGJlIHB1Ymxpc2hlZCB0byB0aGUgc2VydmVyLiBCeSBkZWZhdWx0LCB0aGlzIGZvbGRlciB3aWxsIGJlIG5hbWVkIDxiPldlYkNvbnRlbnQ8L2I+IGZvcg0KLW5ld2x5IGNyZWF0ZWQgc3RhdGljIGFuZCBkeW5hbWljIFdlYiBwcm9qZWN0cy4gPG5vdGU+WW91IGNhbiBjaGFuZ2UgdGhlIG5hbWUNCi1pbiB0aGUgY3JlYXRpb24gd2l6YXJkIFdlYiBmYWNldCBwYWdlLjwvbm90ZT48dWw+DQotPGxpPjxiPk1FVEEtSU5GPC9iPiAtIFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSA8ZmlsZXBhdGg+TUFOSUZFU1QuTUY8L2ZpbGVwYXRoPiBmaWxlLA0KLXdoaWNoIGlzIHVzZWQgdG8gbWFwIGNsYXNzIHBhdGhzIGZvciBkZXBlbmRlbnQgSkFSIGZpbGVzIHRoYXQgZXhpc3QgaW4gb3RoZXINCi1wcm9qZWN0cyBpbiB0aGUgc2FtZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QuIEFuIGVudHJ5IGluIHRoaXMgZmlsZQ0KLXdpbGwgdXBkYXRlIHRoZSBydW4tdGltZSBwcm9qZWN0IGNsYXNzIHBhdGggYW5kIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJ1aWxkIHNldHRpbmdzIHRvIGluY2x1ZGUgdGhlIHJlZmVyZW5jZWQNCi1KQVIgZmlsZXMuPC9saT4NCi08L3VsPjx1bD4NCi08bGk+PGI+V0VCLUlORjwvYj4gLSBUaGUgZGlyZWN0b3J5IHdoZXJlIHN1cHBvcnRpbmcgV2ViIHJlc291cmNlcyBmb3IgYSBXZWINCi1hcHBsaWNhdGlvbiBhcmUga2VwdCAoZm9yIGV4YW1wbGU6IC54bWkgZmlsZXMsIC54bWwgZmlsZXMsIGFuZCB3ZWIueG1sLikgPC9saT4NCi08L3VsPiA8L3A+IDwvc2VjdGlvbj4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnZ3Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJ2dy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmY1N2FjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnZ3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQcm9qZWN0IEV4cGxvcmVyIHZpZXcgYW5kIFdlYiBkZXZlbG9wbWVudCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlByb2plY3QgRXhwbG9yZXIgdmlldywgb3ZlcnZpZXcsIFdlYiBwcm9qZWN0cywgUHJvamVjdCBFeHBsb3JlciB2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iUHJvamVjdCBFeHBsb3JlciB2aWV3LCBvdmVydmlldywgV2ViIHByb2plY3RzLCBQcm9qZWN0IEV4cGxvcmVyIHZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNjd2VidnciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Qcm9qZWN0IEV4cGxvcmVyIHZpZXcgYW5kIFdlYiBkZXZlbG9wbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2N3ZWJ2dyI+PGEgbmFtZT0iY2N3ZWJ2dyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHJvamVjdCBFeHBsb3JlciB2aWV3IGFuZCBXZWIgZGV2ZWxvcG1lbnQ8L2gxPgotCi0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGl2IGNsYXNzPSJwIj5UaGUgUHJvamVjdCBFeHBsb3JlciB2aWV3IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgbm90YWJsZSBmZWF0dXJlczogPHVsPgotPGxpPjxpbWcgc3JjPSIuLi9pbWFnZXMvbndpbi5naWYiIGFsdD0iRm9yIFdpbmRvd3MiIC8+IFlvdSBjYW4gZHJhZyBhbmQgZHJvcCBmaWxlcyBmcm9tIFdpbmRvd3M8c3VwPsKuPC9zdXA+IEV4cGxvcmVyIG9yIHRoZSBkZXNrdG9wIGludG8KLXRoZSBOYXZpZ2F0b3Igdmlldy48L2xpPgotCi08bGk+VmlldyBmaWx0ZXJpbmcgaXMgc3VwcG9ydGVkIGJ5IHNlbGVjdGluZyA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWx0ZXJzPC9zcGFuPjwvc3Bhbj4gZnJvbQotdGhlIE5hdmlnYXRvciB2aWV3IDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1lbnU8L3NwYW4+PC9zcGFuPiBidXR0b24uIFJlc291cmNlcwotY2FuIGJlIGZpbHRlcmVkIGJ5IG5hbWUsIHByb2plY3QgdHlwZSBvciBjb250ZW50IHR5cGUuIEZpbGVzIGJlZ2lubmluZyB3aXRoCi1hIHBlcmlvZCBhcmUgZmlsdGVyZWQgb3V0IGJ5IGRlZmF1bHQuPC9saT4KLQotPGxpPlRoZSBzdGF0dXMgbGluZSBzaG93cyB0aGUgZnVsbCBwYXRoIG9mIHRoZSBzZWxlY3RlZCByZXNvdXJjZS48L2xpPgotCi08bGk+RHJhZ2dpbmcgYSAuamF2YSBmaWxlIGZyb20gdGhlIE5hdmlnYXRvciB2aWV3IGludG8gYSBKU1AgZmlsZSB3aWxsIGluc2VydAotYSB1c2ViZWFuIHRhZywgdGhlIHNhbWUgYmVoYXZpb3IgdGhhdCBpcyBleGhpYml0ZWQgd2hlbiBhIC5jbGFzcyBmaWxlIGlzIGRyYWdnZWQKLWludG8gYSBKU1AgZmlsZS48L2xpPgotCi08bGk+RXJyb3JzIGFuZCB3YXJuaW5ncyBvbiByZXNvdXJjZXMgKGluY2x1ZGluZyBKYXZh4oSiLCBIVE1ML0pTUCwgYW5kIExpbmtzIEJ1aWxkZXIgZXJyb3JzCi1hbmQgd2FybmluZ3MpIGFyZSBpbmRpY2F0ZWQgd2l0aCBhIHJlZCBlcnJvciA8aW1nIHNyYz0iLi4vaW1hZ2VzL25zaG93ZXJyLmdpZiIgYWx0PSJFcnJvciBpY29uIiAvPiBvciB5ZWxsb3cgd2FybmluZyA8aW1nIHNyYz0iLi4vaW1hZ2VzL253YXJuaW5nLmdpZiIgYWx0PSJXYXJuaW5nIGljb24iIC8+IG5leHQgdG8gdGhlIHJlc291cmNlIHdpdGggdGhlIGVycm9yLCBhcyB3ZWxsIGFzCi10aGUgcGFyZW50IGNvbnRhaW5lcnMgdXAgdG8gdGhlIHByb2plY3QuIFRoaXMgYXBwbGllcyBmb3IgYWxsIHByb2plY3QgdHlwZXMsCi1ub3Qgb25seSBXZWIgcHJvamVjdHMuPC9saT4KLQotPGxpPkl0ZW1zIGF2YWlsYWJsZSBmcm9tIHRoZSA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+PC9zcGFuPiBjYXNjYWRpbmcKLW1lbnUgaW4gdGhlIHByb2plY3QgcG9wLXVwIG1lbnUgYXJlIGNvbnRleHQgc2Vuc2l0aXZlLiAgQWxsIG1lbnVzIHdpbGwgaGF2ZSA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9qZWN0PC9zcGFuPjwvc3Bhbj4gYW5kIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk90aGVyPC9zcGFuPjwvc3Bhbj4gb3B0aW9ucy48L2xpPgotCi08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPk9yZ2FuaXphdGlvbiBvZiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3PC9oND48cD5UaGUgUHJvamVjdAotRXhwbG9yZXIgdmlldyBzaG93cyBhIGN1c3RvbSB2aWV3IG9mIGFsbCBXZWIgcHJvamVjdHMuIFRoZSBmb2xsb3dpbmcgYXJlIHNvbWUKLW9mIHRoZSBub3RhYmxlIHRvcC1sZXZlbCBvYmplY3RzIHRoYXQgYXBwZWFyIGJlbmVhdGggdGhlIHByb2plY3Qgbm9kZSAoYmFzZWQKLW9uIGRlZmF1bHQgZm9sZGVyIG5hbWVzKS48L3A+Ci08ZGl2IGNsYXNzPSJwIj48c3Ryb25nPldlYiBjb250ZW50IGZvbGRlcjwvc3Ryb25nPiAtIFRoaXMgZm9sZGVyIGNvbnRhaW5zCi1pdGVtcyB0byBiZSBwdWJsaXNoZWQgdG8gdGhlIHNlcnZlci4gQnkgZGVmYXVsdCwgdGhpcyBmb2xkZXIgd2lsbCBiZSBuYW1lZCA8c3Ryb25nPldlYkNvbnRlbnQ8L3N0cm9uZz4gZm9yCi1uZXdseSBjcmVhdGVkIHN0YXRpYyBhbmQgZHluYW1pYyBXZWIgcHJvamVjdHMuIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UgY2FuIGNoYW5nZSB0aGUgbmFtZQotaW4gdGhlIGNyZWF0aW9uIHdpemFyZCBXZWIgZmFjZXQgcGFnZS48L2Rpdj4KLTx1bD4KLTxsaT48c3Ryb25nPk1FVEEtSU5GPC9zdHJvbmc+IC0gVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+TUFOSUZFU1QuTUY8L3NwYW4+IGZpbGUsCi13aGljaCBpcyB1c2VkIHRvIG1hcCBjbGFzcyBwYXRocyBmb3IgZGVwZW5kZW50IEpBUiBmaWxlcyB0aGF0IGV4aXN0IGluIG90aGVyCi1wcm9qZWN0cyBpbiB0aGUgc2FtZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QuIEFuIGVudHJ5IGluIHRoaXMgZmlsZQotd2lsbCB1cGRhdGUgdGhlIHJ1bi10aW1lIHByb2plY3QgY2xhc3MgcGF0aCBhbmQgSmF2YSBidWlsZCBzZXR0aW5ncyB0byBpbmNsdWRlIHRoZSByZWZlcmVuY2VkCi1KQVIgZmlsZXMuPC9saT4KLQotPC91bD4KLTx1bD4KLTxsaT48c3Ryb25nPldFQi1JTkY8L3N0cm9uZz4gLSBUaGUgZGlyZWN0b3J5IHdoZXJlIHN1cHBvcnRpbmcgV2ViIHJlc291cmNlcyBmb3IgYSBXZWIKLWFwcGxpY2F0aW9uIGFyZSBrZXB0IChmb3IgZXhhbXBsZTogLnhtaSBmaWxlcywgLnhtbCBmaWxlcywgYW5kIHdlYi54bWwuKSA8L2xpPgotCi08L3VsPgotIDwvZGl2PgotIDwvZGl2PgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd3RvdmVyLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3dG92ZXIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwY2MzYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3dG92ZXIuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08IS0tIEFyYm9yVGV4dCwgSW5jLiwgMTk4OC0yMDAyLCB2LjQwMDIgLS0+DQotPGNvbmNlcHQgaWQ9ImNjd3RvdmVyIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5XZWIgYXBwbGljYXRpb24gb3ZlcnZpZXc8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPldlYiBhcHBsaWNhdGlvbnM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPlRoZSBXZWIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgcHJvdmlkZXMgdGhlIHRvb2xzIHlvdSBuZWVkIHRvIGRldmVsb3ANCi1XZWIgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gU2VydmxldA0KLTIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPiBhbmQgdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSlNQIDEuMiBTcGVjaWZpY2F0aW9uPC9jaXRlPi4NCi1XZWIgYXBwbGljYXRpb25zIGNhbiBiZSBzaW1wbGUgKGNvbnNpc3Rpbmcgb2Ygb25seSBzdGF0aWMgV2ViIHBhZ2VzKSBvciB0aGV5DQotY2FuIGJlIG1vcmUgYWR2YW5jZWQgYW5kIGluY2x1ZGUgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlcyBhbmQgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gc2VydmxldHMuDQotVGhlc2UgcmVzb3VyY2VzLCBhbG9uZyB3aXRoIGFuIFhNTCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKGFuZCBvdGhlciA8eHJlZg0KLWhyZWY9ImN3ZWJyZXNvdXJjZXMuZGl0YSIgc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz4gV2ViIHJlc291cmNlczwveHJlZj4sIGFyZSBjb250YWluZWQNCi13aXRoaW4gYSBXZWIgcHJvamVjdCBkdXJpbmcgZGV2ZWxvcG1lbnQuIFdoZW4geW91IGFyZSByZWFkeSB0byBwdWJsaXNoIHRoZQ0KLVdlYiBhcHBsaWNhdGlvbiB0byB0aGUgV2ViLCB5b3UgZGVwbG95IHRoZSBXZWIgcHJvamVjdCB0byB0aGUgc2VydmVyIGluIHRoZQ0KLWZvcm0gb2YgYSBXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlIC4gVGhlIGVuZCB1c2VyIGNhbiB0aGVuIHZpZXcgdGhlIFdlYiBhcHBsaWNhdGlvbg0KLWFzIGEgV2ViIHNpdGUgZnJvbSBhIFVSTC48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3dG92ZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3d0b3Zlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODg2ZTM3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3d0b3Zlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV2ViIGFwcGxpY2F0aW9uIG92ZXJ2aWV3IiAvPgotPG1ldGEgY29udGVudD0iV2ViIGFwcGxpY2F0aW9ucywgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgYXBwbGljYXRpb25zLCBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3RmZWF0dXJlcy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdjcmVwcmouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqZGV0YWdzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd2ViYXJ0aWZhY3QuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjY3d0b3ZlciIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldlYiBhcHBsaWNhdGlvbiBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2N3dG92ZXIiPjxhIG5hbWU9ImNjd3RvdmVyIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5XZWIgYXBwbGljYXRpb24gb3ZlcnZpZXc8L2gxPgotCi0KLTxkaXY+Ci08cD5UaGUgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IHByb3ZpZGVzIHRoZSB0b29scyB5b3UgbmVlZCB0byBkZXZlbG9wCi1XZWIgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSmF2YeKEoiBTZXJ2bGV0Ci0yLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gYW5kIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEpTUCAxLjIgU3BlY2lmaWNhdGlvbjwvY2l0ZT4uCi1XZWIgYXBwbGljYXRpb25zIGNhbiBiZSBzaW1wbGUgKGNvbnNpc3Rpbmcgb2Ygb25seSBzdGF0aWMgV2ViIHBhZ2VzKSBvciB0aGV5Ci1jYW4gYmUgbW9yZSBhZHZhbmNlZCBhbmQgaW5jbHVkZSBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIGFuZCBKYXZhIHNlcnZsZXRzLgotVGhlc2UgcmVzb3VyY2VzLCBhbG9uZyB3aXRoIGFuIFhNTCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKGFuZCBvdGhlciA8YSBocmVmPSJjd2VicmVzb3VyY2VzLmh0bWwiIHRpdGxlPSIiPldlYiByZXNvdXJjZXM8L2E+LCBhcmUgY29udGFpbmVkCi13aXRoaW4gYSBXZWIgcHJvamVjdCBkdXJpbmcgZGV2ZWxvcG1lbnQuIFdoZW4geW91IGFyZSByZWFkeSB0byBwdWJsaXNoIHRoZQotV2ViIGFwcGxpY2F0aW9uIHRvIHRoZSBXZWIsIHlvdSBkZXBsb3kgdGhlIFdlYiBwcm9qZWN0IHRvIHRoZSBzZXJ2ZXIgaW4gdGhlCi1mb3JtIG9mIGEgV2ViIGFyY2hpdmUgKFdBUikgZmlsZSAuIFRoZSBlbmQgdXNlciBjYW4gdGhlbiB2aWV3IHRoZSBXZWIgYXBwbGljYXRpb24KLWFzIGEgV2ViIHNpdGUgZnJvbSBhIFVSTC48L3A+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3dGZlYXR1cmVzLmh0bWwiIHRpdGxlPSJUaGUgaW50ZWdyYXRlZCBXZWIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgbWFrZXMgaXQgZWFzeSB0byBjb29wZXJhdGl2ZWx5IGNyZWF0ZSwgYXNzZW1ibGUsIHB1Ymxpc2gsIGRlcGxveSBhbmQgbWFpbnRhaW4gZHluYW1pYywgaW50ZXJhY3RpdmUgV2ViIGFwcGxpY2F0aW9ucy4iPldlYiB0b29scyBmZWF0dXJlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdjcmVwcmouaHRtbCI+Q3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpkZXRhZ3MuaHRtbCI+Q3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd2ViYXJ0aWZhY3QuaHRtbCI+Q3JlYXRpbmcgV2ViIEFydGlmYWN0czwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3BkanNwcy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2NwZGpzcHMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcyMjRmMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3BkanNwcy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjcGRqc3BzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5KYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3k8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0iY3BkanNwc3wxfEpTUHBhZ2Vzb3ZlcnZpZXciIHN0YXR1cz0iY2hhbmdlZCI+SlNQDQotZmlsZXM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybSBrZXlyZWY9ImNwZGpzcHN8MnxXZWJjb250ZW50Z2VuZXJhdGluZ2R5bmFtaWNhbGx5Ig0KLXN0YXR1cz0ibmV3Ij5XZWIgY29udGVudDxpbmRleHRlcm0+Z2VuZXJhdGluZyBkeW5hbWljYWxseTwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UaGUgSmF2YVNlcnZlciBQYWdlcyB0ZWNobm9sb2d5IGVuYWJsZXMgeW91IHRvIGdlbmVyYXRlIGR5bmFtaWMgd2ViIGNvbnRlbnQsDQotc3VjaCBhcyBIVE1MLCBESFRNTCwgWEhUTUwsIGFuZCBYTUwgZmlsZXMsIHRvIGluY2x1ZGUgaW4gYSBXZWIgYXBwbGljYXRpb24uDQotSlNQIGZpbGVzIGFyZSBvbmUgd2F5IHRvIGltcGxlbWVudCBzZXJ2ZXItc2lkZSBkeW5hbWljIHBhZ2UgY29udGVudC4gSlNQIGZpbGVzDQotYWxsb3cgYSBXZWIgc2VydmVyLCBzdWNoIGFzIEFwYWNoZSBUb21jYXQsIHRvIGFkZCBjb250ZW50IGR5bmFtaWNhbGx5IHRvIHlvdXINCi1IVE1MIHBhZ2VzIGJlZm9yZSB0aGV5IGFyZSBzZW50IHRvIGEgcmVxdWVzdGluZyBicm93c2VyLjwvcD4NCi08cD5XaGVuIHlvdSBkZXBsb3kgYSBKU1AgZmlsZSB0byBhIFdlYiBzZXJ2ZXIgdGhhdCBwcm92aWRlcyBhIHNlcnZsZXQgZW5naW5lLA0KLWl0IGlzIHByZXByb2Nlc3NlZCBpbnRvIGEgc2VydmxldCB0aGF0IHJ1bnMgb24gdGhlIFdlYiBzZXJ2ZXIuIFRoaXMgaXMgaW4NCi1jb250cmFzdCB3aXRoIGNsaWVudC1zaWRlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+ICh3aXRoaW4gPGNvZGVwaD4mbHQ7U0NSSVBUPjwvY29kZXBoPiB0YWdzKSwNCi13aGljaCBpcyBydW4gaW4gYSBicm93c2VyLiBBIEpTUCBwYWdlIGlzIGlkZWFsIGZvciB0YXNrcyB0aGF0IGFyZSBiZXR0ZXIgc3VpdGVkDQotdG8gZXhlY3V0aW9uIG9uIHRoZSBzZXJ2ZXIsIHN1Y2ggYXMgYWNjZXNzaW5nIGRhdGFiYXNlcyBvciBjYWxsaW5nIEVudGVycHJpc2UgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYmVhbnMuPC9wPg0KLTxwPllvdSBjYW4gY3JlYXRlIGFuZCBlZGl0IGEgSlNQIGZpbGUgaW4gdGhlIEhUTUwgZWRpdG9yIGJ5IGFkZGluZyB5b3VyIG93bg0KLXRleHQgYW5kIGltYWdlcyB1c2luZyBIVE1MLCBKU1AgdGFnZ2luZywgb3IgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4sIGluY2x1ZGluZyA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBzb3VyY2UNCi1jb2RlIGluc2lkZSBvZiBzY3JpcHRsZXQgdGFncy4gVHlwaWNhbGx5LCBKU1AgZmlsZXMgaGF2ZSB0aGUgZmlsZSBleHRlbnNpb24NCi0uanNwLiBBZGRpdGlvbmFsbHksIHRoZSBKU1Agc3BlY2lmaWNhdGlvbiBzdWdnZXN0cyB0aGF0IEpTUCBmcmFnbWVudCBmaWxlcw0KLXNob3VsZCBoYXZlIGZpbGUgZXh0ZW5zaW9uIC5qc3BmLiBJZiB0aGlzIGNvbnZlbnRpb24gaXMgbm90IGZvbGxvd2VkLCB0aGUNCi1KU1AgdmFsaWRhdG9yIHdpbGwgdHJlYXQgSlNQIGZyYWdtZW50cyBhcyByZWd1bGFyIHN0YW5kYWxvbmUgSlNQIGZpbGVzLCBhbmQNCi1jb21waWxhdGlvbiBlcnJvcnMgbWlnaHQgYmUgcmVwb3J0ZWQuPC9wPg0KLTxwPlRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEpTUCAxLjIgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gcHJvdmlkZXMgdGhlIGFiaWxpdHkNCi10byBjcmVhdGUgY3VzdG9tIEpTUCB0YWdzLiBDdXN0b20gdGFncyBzaW1wbGlmeSBjb21wbGV4IGFjdGlvbnMgYW5kICBwcm92aWRlDQotZGV2ZWxvcGVycyB3aXRoIGdyZWF0ZXIgY29udHJvbCBvdmVyIHBhZ2UgY29udGVudC4gQ3VzdG9tIHRhZ3MgYXJlIGNvbGxlY3RlZA0KLWludG8gYSBsaWJyYXJ5ICh0YWdsaWIpLiBBIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZmlsZSAodGFnbGliLnRsZCkgaXMgYW4NCi1YTUwgZG9jdW1lbnQgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFnIGxpYnJhcnksIGluY2x1ZGluZyB0aGUNCi10YWdsaWIgc2hvcnQgbmFtZSwgbGlicmFyeSBkZXNjcmlwdGlvbiwgYW5kIHRhZyBkZXNjcmlwdGlvbnMuIFJlZmVyIHRvIHRoZSA8Y2l0ZT5TdW4NCi1NaWNyb3N5c3RlbXMgSlNQIDEuMiBTcGVjaWZpY2F0aW9uPC9jaXRlPiBmb3IgbW9yZSBkZXRhaWxzLjwvcD4NCi08cD5UbyB1c2UgSlNQIDEuMiBjdXN0b20gdGFnbGlicywgeW91IGNhbiBpbXBvcnQgdGhlIHRhZyBsaWJyYXJ5IC50bGQgYW5kDQotLmphciBmaWxlcyBpbnRvIHlvdXIgcHJvamVjdCB0byB1c2UgdGhlbSwgb3IgYXNzb2NpYXRlIHRoZW0gYXMgV2ViIExpYnJhcnkNCi1wcm9qZWN0cy4gWW91IGNhbiBhbHNvIHJlZmVyZW5jZSBhIFRMRCBmaWxlIGJ5IHVzaW5nIGEgVVJJLjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jcGRqc3BzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3BkanNwcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGRjNjI5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jcGRqc3BzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJKYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3kiIC8+Ci08bWV0YSBjb250ZW50PSJKU1AgZmlsZXMsIG92ZXJ2aWV3LCBXZWIgY29udGVudCwgZ2VuZXJhdGluZyBkeW5hbWljYWxseSIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkpTUCBmaWxlcywgb3ZlcnZpZXcsIFdlYiBjb250ZW50LCBnZW5lcmF0aW5nIGR5bmFtaWNhbGx5IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3c2VydmJuLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd2xpc3Ribi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dmaWx0Ym4uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqY3JlanNwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3BkanNwcyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3BkanNwcyI+PGEgbmFtZT0iY3BkanNwcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SmF2YVNlcnZlciBQYWdlcyAoSlNQKSB0ZWNobm9sb2d5PC9oMT4KLQotCi08ZGl2PgotPHA+VGhlIEphdmFTZXJ2ZXIgUGFnZXMgdGVjaG5vbG9neSBlbmFibGVzIHlvdSB0byBnZW5lcmF0ZSBkeW5hbWljIHdlYiBjb250ZW50LAotc3VjaCBhcyBIVE1MLCBESFRNTCwgWEhUTUwsIGFuZCBYTUwgZmlsZXMsIHRvIGluY2x1ZGUgaW4gYSBXZWIgYXBwbGljYXRpb24uCi1KU1AgZmlsZXMgYXJlIG9uZSB3YXkgdG8gaW1wbGVtZW50IHNlcnZlci1zaWRlIGR5bmFtaWMgcGFnZSBjb250ZW50LiBKU1AgZmlsZXMKLWFsbG93IGEgV2ViIHNlcnZlciwgc3VjaCBhcyBBcGFjaGUgVG9tY2F0LCB0byBhZGQgY29udGVudCBkeW5hbWljYWxseSB0byB5b3VyCi1IVE1MIHBhZ2VzIGJlZm9yZSB0aGV5IGFyZSBzZW50IHRvIGEgcmVxdWVzdGluZyBicm93c2VyLjwvcD4KLQotPHA+V2hlbiB5b3UgZGVwbG95IGEgSlNQIGZpbGUgdG8gYSBXZWIgc2VydmVyIHRoYXQgcHJvdmlkZXMgYSBzZXJ2bGV0IGVuZ2luZSwKLWl0IGlzIHByZXByb2Nlc3NlZCBpbnRvIGEgc2VydmxldCB0aGF0IHJ1bnMgb24gdGhlIFdlYiBzZXJ2ZXIuIFRoaXMgaXMgaW4KLWNvbnRyYXN0IHdpdGggY2xpZW50LXNpZGUgSmF2YVNjcmlwdOKEoiAod2l0aGluIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDtTQ1JJUFQmZ3Q7PC9zYW1wPiB0YWdzKSwKLXdoaWNoIGlzIHJ1biBpbiBhIGJyb3dzZXIuIEEgSlNQIHBhZ2UgaXMgaWRlYWwgZm9yIHRhc2tzIHRoYXQgYXJlIGJldHRlciBzdWl0ZWQKLXRvIGV4ZWN1dGlvbiBvbiB0aGUgc2VydmVyLCBzdWNoIGFzIGFjY2Vzc2luZyBkYXRhYmFzZXMgb3IgY2FsbGluZyBFbnRlcnByaXNlIEphdmHihKIgYmVhbnMuPC9wPgotCi08cD5Zb3UgY2FuIGNyZWF0ZSBhbmQgZWRpdCBhIEpTUCBmaWxlIGluIHRoZSBIVE1MIGVkaXRvciBieSBhZGRpbmcgeW91ciBvd24KLXRleHQgYW5kIGltYWdlcyB1c2luZyBIVE1MLCBKU1AgdGFnZ2luZywgb3IgSmF2YVNjcmlwdCwgaW5jbHVkaW5nIEphdmEgc291cmNlCi1jb2RlIGluc2lkZSBvZiBzY3JpcHRsZXQgdGFncy4gVHlwaWNhbGx5LCBKU1AgZmlsZXMgaGF2ZSB0aGUgZmlsZSBleHRlbnNpb24KLS5qc3AuIEFkZGl0aW9uYWxseSwgdGhlIEpTUCBzcGVjaWZpY2F0aW9uIHN1Z2dlc3RzIHRoYXQgSlNQIGZyYWdtZW50IGZpbGVzCi1zaG91bGQgaGF2ZSBmaWxlIGV4dGVuc2lvbiAuanNwZi4gSWYgdGhpcyBjb252ZW50aW9uIGlzIG5vdCBmb2xsb3dlZCwgdGhlCi1KU1AgdmFsaWRhdG9yIHdpbGwgdHJlYXQgSlNQIGZyYWdtZW50cyBhcyByZWd1bGFyIHN0YW5kYWxvbmUgSlNQIGZpbGVzLCBhbmQKLWNvbXBpbGF0aW9uIGVycm9ycyBtaWdodCBiZSByZXBvcnRlZC48L3A+Ci0KLTxwPlRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEpTUCAxLjIgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gcHJvdmlkZXMgdGhlIGFiaWxpdHkKLXRvIGNyZWF0ZSBjdXN0b20gSlNQIHRhZ3MuIEN1c3RvbSB0YWdzIHNpbXBsaWZ5IGNvbXBsZXggYWN0aW9ucyBhbmQgIHByb3ZpZGUKLWRldmVsb3BlcnMgd2l0aCBncmVhdGVyIGNvbnRyb2wgb3ZlciBwYWdlIGNvbnRlbnQuIEN1c3RvbSB0YWdzIGFyZSBjb2xsZWN0ZWQKLWludG8gYSBsaWJyYXJ5ICh0YWdsaWIpLiBBIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZmlsZSAodGFnbGliLnRsZCkgaXMgYW4KLVhNTCBkb2N1bWVudCB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YWcgbGlicmFyeSwgaW5jbHVkaW5nIHRoZQotdGFnbGliIHNob3J0IG5hbWUsIGxpYnJhcnkgZGVzY3JpcHRpb24sIGFuZCB0YWcgZGVzY3JpcHRpb25zLiBSZWZlciB0byB0aGUgPGNpdGU+U3VuCi1NaWNyb3N5c3RlbXMgSlNQIDEuMiBTcGVjaWZpY2F0aW9uPC9jaXRlPiBmb3IgbW9yZSBkZXRhaWxzLjwvcD4KLQotPHA+VG8gdXNlIEpTUCAxLjIgY3VzdG9tIHRhZ2xpYnMsIHlvdSBjYW4gaW1wb3J0IHRoZSB0YWcgbGlicmFyeSAudGxkIGFuZAotLmphciBmaWxlcyBpbnRvIHlvdXIgcHJvamVjdCB0byB1c2UgdGhlbSwgb3IgYXNzb2NpYXRlIHRoZW0gYXMgV2ViIExpYnJhcnkKLXByb2plY3RzLiBZb3UgY2FuIGFsc28gcmVmZXJlbmNlIGEgVExEIGZpbGUgYnkgdXNpbmcgYSBVUkkuPC9wPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3NlcnZibi5odG1sIiB0aXRsZT0iIj5TZXJ2bGV0czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3bGlzdGJuLmh0bWwiIHRpdGxlPSIiPkxpc3RlbmVyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3ZmlsdGJuLmh0bWwiIHRpdGxlPSIiPkxpc3RlbmVyczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpjcmVqc3AuaHRtbCI+Q3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYmFydGlmYWN0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYmFydGlmYWN0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNGJkYWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJhcnRpZmFjdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTwhLS0gQXJib3JUZXh0LCBJbmMuLCAxOTg4LTIwMDIsIHYuNDAwMiAtLT4NCi08Y29uY2VwdCBpZD0iY3dlYmFydGlmYWN0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBXZWIgQXJ0aWZhY3RzPC90aXRsZT4NCi08Y29uYm9keT4NCi08cD5Db250ZW50czo8L3A+DQotPHVsPg0KLTxsaT48eHJlZiBocmVmPSJ0d3Nydndpei5kaXRhIiBzY29wZT0icGVlciI+PGRlc2M+PC9kZXNjPkNyZWF0aW5nIFNlcnZsZXRzPC94cmVmPjwvbGk+DQotPGxpPjx4cmVmIGhyZWY9InR3bHN0d2l6LmRpdGEiIHNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+Q3JlYXRpbmcgTGlzdGVuZXJzPC94cmVmPjwvbGk+DQotPGxpPjx4cmVmIGhyZWY9InR3Zmx0d2l6LmRpdGEiIHNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+Q3JlYXRpbmcgRmlsdGVyczwveHJlZj48L2xpPg0KLTwvdWw+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYmFydGlmYWN0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYmFydGlmYWN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZGY3NDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJhcnRpZmFjdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgV2ViIEFydGlmYWN0cyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjd2ViYXJ0aWZhY3QiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBXZWIgQXJ0aWZhY3RzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd2ViYXJ0aWZhY3QiPjxhIG5hbWU9ImN3ZWJhcnRpZmFjdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgV2ViIEFydGlmYWN0czwvaDE+Ci0KLTxkaXY+Ci08cD5Db250ZW50czo8L3A+Ci0KLTx1bD4KLTxsaT48YSBocmVmPSJ0d3Nydndpei5odG1sIiB0aXRsZT0iIj5DcmVhdGluZyBTZXJ2bGV0czwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0idHdsc3R3aXouaHRtbCIgdGl0bGU9IiI+Q3JlYXRpbmcgTGlzdGVuZXJzPC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSJ0d2ZsdHdpei5odG1sIiB0aXRsZT0iIj5DcmVhdGluZyBGaWx0ZXJzPC9hPjwvbGk+Ci0KLTwvdWw+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnBhZ2VkZXNpZ24uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicGFnZWRlc2lnbi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjE2MjRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicGFnZWRlc2lnbi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjd2VicGFnZWRlc2lnbiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+V2ViIHBhZ2UgZGVzaWduPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XZWIgcGFnZSBkZXNpZ248aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPldlYiBwYWdlcyBhcmUgYW4gaW50ZWdyYWwgcGFydCBvZiBldmVyeSBXZWIgYXBwbGljYXRpb24uIEVhY2ggV2ViIHBhZ2UNCi1zaG91bGQgc2VydmUgdG8gaGVscCBhY2hpZXZlIHRoZSBvdmVyYWxsIGdvYWwgb2YgdGhlIGVudGlyZSBXZWIgc2l0ZS48L3A+DQotPHA+IFRoZXJlIGFyZSBtYW55IHR5cGVzIG9mIFdlYiBwYWdlcywgcmFuZ2luZyBmcm9tIHNpbXBsZSBIVE1MIHBhZ2VzIHRoYXQNCi1jb250YWluIG5vIGR5bmFtaWMgZWxlbWVudHMsIHRvIGFkdmFuY2VkIEphdmEtYmFzZWQgcGFnZXMgdGhhdCBtYWtlIHVzZSBvZg0KLXNlcnZsZXRzLCBzY3JpcHRzLCBmb3Jtcywgb3IgZGF0YSBhY2Nlc3MgY29tcG9uZW50cy48L3A+DQotPHA+QSBmZXcgb2YgdGhlIG1hbnkgaXRlbXMgeW91IHNob3VsZCBjb25zaWRlciB3aGVuIGRlc2lnbmluZyB5b3VyIHBhZ2VzIGFyZQ0KLW1hcmt1cCBsYW5ndWFnZSwgbGlua3MsIGltYWdlcywgYW5kIHN0eWxlIHNoZWV0cy48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnBhZ2VkZXNpZ24uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicGFnZWRlc2lnbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmUyMTdmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicGFnZWRlc2lnbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV2ViIHBhZ2UgZGVzaWduIiAvPgotPG1ldGEgY29udGVudD0iV2ViIHBhZ2UgZGVzaWduLCBvdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiBwYWdlIGRlc2lnbiwgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGpkZXRhZ3MuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjd2VicGFnZWRlc2lnbiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldlYiBwYWdlIGRlc2lnbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3dlYnBhZ2VkZXNpZ24iPjxhIG5hbWU9ImN3ZWJwYWdlZGVzaWduIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5XZWIgcGFnZSBkZXNpZ248L2gxPgotCi0KLTxkaXY+Ci08cD5XZWIgcGFnZXMgYXJlIGFuIGludGVncmFsIHBhcnQgb2YgZXZlcnkgV2ViIGFwcGxpY2F0aW9uLiBFYWNoIFdlYiBwYWdlCi1zaG91bGQgc2VydmUgdG8gaGVscCBhY2hpZXZlIHRoZSBvdmVyYWxsIGdvYWwgb2YgdGhlIGVudGlyZSBXZWIgc2l0ZS48L3A+Ci0KLTxwPiBUaGVyZSBhcmUgbWFueSB0eXBlcyBvZiBXZWIgcGFnZXMsIHJhbmdpbmcgZnJvbSBzaW1wbGUgSFRNTCBwYWdlcyB0aGF0Ci1jb250YWluIG5vIGR5bmFtaWMgZWxlbWVudHMsIHRvIGFkdmFuY2VkIEphdmEtYmFzZWQgcGFnZXMgdGhhdCBtYWtlIHVzZSBvZgotc2VydmxldHMsIHNjcmlwdHMsIGZvcm1zLCBvciBkYXRhIGFjY2VzcyBjb21wb25lbnRzLjwvcD4KLQotPHA+QSBmZXcgb2YgdGhlIG1hbnkgaXRlbXMgeW91IHNob3VsZCBjb25zaWRlciB3aGVuIGRlc2lnbmluZyB5b3VyIHBhZ2VzIGFyZQotbWFya3VwIGxhbmd1YWdlLCBsaW5rcywgaW1hZ2VzLCBhbmQgc3R5bGUgc2hlZXRzLjwvcD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpkZXRhZ3MuaHRtbCIgdGl0bGU9IiI+Q3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJwcm9qZWN0cy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJwcm9qZWN0cy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDU4NjEwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicHJvamVjdHMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3dlYnByb2plY3RzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5XZWIgcHJvamVjdHM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPldlYiBwcm9qZWN0czxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPldlYiBhcHBsaWNhdGlvbnM8aW5kZXh0ZXJtPmNyZWF0aW5nIG9yIGltcG9ydGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5XZWIgcHJvamVjdHMgaG9sZCBhbGwgb2YgdGhlIFdlYiByZXNvdXJjZXMgdGhhdCBhcmUgY3JlYXRlZCBhbmQgdXNlZCB3aGVuDQotZGV2ZWxvcGluZyB5b3VyIFdlYiBhcHBsaWNhdGlvbi4gVGhlIGZpcnN0IHN0ZXAgdG8gY3JlYXRpbmcgb3IgaW1wb3J0aW5nIGENCi1XZWIgYXBwbGljYXRpb24gaXMgdG8gY3JlYXRlIGVpdGhlciBhIHN0YXRpYyBvciBhIGR5bmFtaWMgV2ViIHByb2plY3QuIFN0YXRpYw0KLVdlYiBwcm9qZWN0cyBhcmUgbWVhbnQgdG8gY29udGFpbiBvbmx5IHNpbXBsZSBXZWIgc2l0ZSByZXNvdXJjZXMsIHN1Y2ggYXMNCi1IVE1MIGZpbGVzLiBEeW5hbWljIFdlYiBwcm9qZWN0cyBhcmUgdXNlZCB0byBzdHJ1Y3R1cmUgV2ViIGFwcGxpY2F0aW9ucyB0aGF0DQotd2lsbCB1c2UgbW9yZSBjb21wbGljYXRlZCwgZHluYW1pYyBXZWIgdGVjaG5vbG9naWVzLCBzdWNoIGFzIEphdmFTZXJ2ZXIgUGFnZXMNCi1maWxlcywgYW5kIHBvc3NpYmx5IGRhdGEgYWNjZXNzIHJlc291cmNlcy48L3A+DQotPHA+VGhvdWdoIHRoZSBXZWIgcHJvamVjdCBpcyBzdHJ1Y3R1cmVkIG9uIHlvdXIgZmlsZSBzeXN0ZW0gaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIEphdmEgRUUgV2ViIGFwcGxpY2F0aW9uIHN0YW5kYXJkIGZvciBkZXBsb3ltZW50IHB1cnBvc2VzLCB0aGUgUHJvamVjdA0KLUV4cGxvcmVyIHZpZXcgaXMgZGVzaWduZWQgdG8gc2hvdyB0aGUgbW9zdCBjb252ZW5pZW50IGRpc3BsYXkgb2YgcHJvamVjdCByZXNvdXJjZXMNCi1mb3IgdXNlIHdoaWxlIHlvdSBhcmUgYWN0dWFsbHkgZGV2ZWxvcGluZyB0aGUgV2ViIGFwcGxpY2F0aW9uLiBXaGVuIHlvdSBhcmUNCi1maW5pc2hlZCBkZXZlbG9waW5nIHlvdXIgV2ViIGFwcGxpY2F0aW9uLCB5b3UgdXNlIHRoZSBXZWIgcHJvamVjdCB0byBkZXBsb3kNCi10aGUgY29ycmVjdCByZXNvdXJjZXMgdG8gdGhlIHNlcnZlci4gVGhlc2UgcmVzb3VyY2VzIHdpbGwgYmUgcGFja2FnZWQgaW4gYQ0KLWZpbGUgY2FsbGVkIGEgV2ViIGFyY2hpdmUsIG9yIFdBUiBmaWxlLjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicHJvamVjdHMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicHJvamVjdHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDliZmFlMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnByb2plY3RzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXZWIgcHJvamVjdHMiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcHJvamVjdHMsIG92ZXJ2aWV3LCBXZWIgYXBwbGljYXRpb25zLCBjcmVhdGluZyBvciBpbXBvcnRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcHJvamVjdHMsIG92ZXJ2aWV3LCBXZWIgYXBwbGljYXRpb25zLCBjcmVhdGluZyBvciBpbXBvcnRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2NzdGF0aWMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2Njd2VicHJqLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3dhcm92ci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdjcmVzdGEuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3Y3JlcHJqLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3dlYnByb2plY3RzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+V2ViIHByb2plY3RzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd2VicHJvamVjdHMiPjxhIG5hbWU9ImN3ZWJwcm9qZWN0cyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V2ViIHByb2plY3RzPC9oMT4KLQotCi08ZGl2PgotPHA+V2ViIHByb2plY3RzIGhvbGQgYWxsIG9mIHRoZSBXZWIgcmVzb3VyY2VzIHRoYXQgYXJlIGNyZWF0ZWQgYW5kIHVzZWQgd2hlbgotZGV2ZWxvcGluZyB5b3VyIFdlYiBhcHBsaWNhdGlvbi4gVGhlIGZpcnN0IHN0ZXAgdG8gY3JlYXRpbmcgb3IgaW1wb3J0aW5nIGEKLVdlYiBhcHBsaWNhdGlvbiBpcyB0byBjcmVhdGUgZWl0aGVyIGEgc3RhdGljIG9yIGEgZHluYW1pYyBXZWIgcHJvamVjdC4gU3RhdGljCi1XZWIgcHJvamVjdHMgYXJlIG1lYW50IHRvIGNvbnRhaW4gb25seSBzaW1wbGUgV2ViIHNpdGUgcmVzb3VyY2VzLCBzdWNoIGFzCi1IVE1MIGZpbGVzLiBEeW5hbWljIFdlYiBwcm9qZWN0cyBhcmUgdXNlZCB0byBzdHJ1Y3R1cmUgV2ViIGFwcGxpY2F0aW9ucyB0aGF0Ci13aWxsIHVzZSBtb3JlIGNvbXBsaWNhdGVkLCBkeW5hbWljIFdlYiB0ZWNobm9sb2dpZXMsIHN1Y2ggYXMgSmF2YVNlcnZlciBQYWdlcwotZmlsZXMsIGFuZCBwb3NzaWJseSBkYXRhIGFjY2VzcyByZXNvdXJjZXMuPC9wPgotCi08cD5UaG91Z2ggdGhlIFdlYiBwcm9qZWN0IGlzIHN0cnVjdHVyZWQgb24geW91ciBmaWxlIHN5c3RlbSBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBKYXZhIEVFIFdlYiBhcHBsaWNhdGlvbiBzdGFuZGFyZCBmb3IgZGVwbG95bWVudCBwdXJwb3NlcywgdGhlIFByb2plY3QKLUV4cGxvcmVyIHZpZXcgaXMgZGVzaWduZWQgdG8gc2hvdyB0aGUgbW9zdCBjb252ZW5pZW50IGRpc3BsYXkgb2YgcHJvamVjdCByZXNvdXJjZXMKLWZvciB1c2Ugd2hpbGUgeW91IGFyZSBhY3R1YWxseSBkZXZlbG9waW5nIHRoZSBXZWIgYXBwbGljYXRpb24uIFdoZW4geW91IGFyZQotZmluaXNoZWQgZGV2ZWxvcGluZyB5b3VyIFdlYiBhcHBsaWNhdGlvbiwgeW91IHVzZSB0aGUgV2ViIHByb2plY3QgdG8gZGVwbG95Ci10aGUgY29ycmVjdCByZXNvdXJjZXMgdG8gdGhlIHNlcnZlci4gVGhlc2UgcmVzb3VyY2VzIHdpbGwgYmUgcGFja2FnZWQgaW4gYQotZmlsZSBjYWxsZWQgYSBXZWIgYXJjaGl2ZSwgb3IgV0FSIGZpbGUuPC9wPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jY3N0YXRpYy5odG1sIiB0aXRsZT0iIj5TdGF0aWMgV2ViIHByb2plY3RzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2N3ZWJwcmouaHRtbCIgdGl0bGU9IiI+RHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3d2Fyb3ZyLmh0bWwiIHRpdGxlPSIiPldlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2NyZXN0YS5odG1sIj5DcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Y3JlcHJqLmh0bWwiPkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnJlc291cmNlcy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJyZXNvdXJjZXMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmOGQ3MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnJlc291cmNlcy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjd2VicmVzb3VyY2VzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5XZWIgcmVzb3VyY2VzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XZWIgcmVzb3VyY2VzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5JbiBtb3N0IGNhc2VzLCBhbGwgb2YgdGhlIHJlc291cmNlcyB0aGF0IHlvdSBuZWVkIHRvIGNyZWF0ZSBmb3IgeW91ciBXZWINCi1hcHBsaWNhdGlvbiBhcmUgZGV2ZWxvcGVkIGR1cmluZyBXZWIgc2l0ZSBvciBXZWIgcGFnZSBkZXNpZ247IGhvd2V2ZXIsIHRoZXJlDQotYXJlIGFkZGl0aW9uYWwgcmVzb3VyY2VzIHRoYXQgeW91IG1heSBuZWVkIHRvIGluY2x1ZGUgaW4geW91ciBXZWIgcHJvamVjdA0KLWlmIHlvdSBhcmUgdXNpbmcgbW9yZSBhZHZhbmNlZCBXZWIgdGVjaG5vbG9naWVzIGluIHlvdXIgYXBwbGljYXRpb24uPC9wPg0KLTxwPlRoZXNlIFdlYiByZXNvdXJjZXMgYXJlIG5vdCB0eXBpY2FsIFdlYiBwYWdlIGZpbGVzLCBhbmQgYXJlIG9mdGVuIG5vdCB0aGUNCi1yZXNvdXJjZXMgdGhhdCB5b3UgY29uc2lkZXIgcGFydCBvZiB0aGUgZmluYWwgV2ViIHNpdGUuIEZvciBleGFtcGxlLCB0YWcgbGlicmFyaWVzDQotYW5kIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiByZXNvdXJjZXMsDQotc3VjaCBhcyBKQVIgZmlsZXMsIGFyZSByZXNvdXJjZXMgeW91IG1pZ2h0IG5lZWQgdG8gaW5jbHVkZSBpbiB5b3VyIFdlYiBwcm9qZWN0LiA8L3A+DQotPHA+SW4gZmFjdCwgZXZlbiB0aGUgV0FSIGZpbGUgaXRzZWxmIGNvdWxkIGJlIGNvbnNpZGVyZWQgYSBXZWIgcmVzb3VyY2UsIGlmDQoteW91IGNvbnNpZGVyIGltcG9ydGluZyBvciBleHBvcnRpbmcgdGhlIHJlc291cmNlLjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicmVzb3VyY2VzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnJlc291cmNlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDMzMDBiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicmVzb3VyY2VzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXZWIgcmVzb3VyY2VzIiAvPgotPG1ldGEgY29udGVudD0iV2ViIHJlc291cmNlcywgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcmVzb3VyY2VzLCBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3dhcm92ci5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN3ZWJyZXNvdXJjZXMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5XZWIgcmVzb3VyY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd2VicmVzb3VyY2VzIj48YSBuYW1lPSJjd2VicmVzb3VyY2VzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5XZWIgcmVzb3VyY2VzPC9oMT4KLQotCi08ZGl2PgotPHA+SW4gbW9zdCBjYXNlcywgYWxsIG9mIHRoZSByZXNvdXJjZXMgdGhhdCB5b3UgbmVlZCB0byBjcmVhdGUgZm9yIHlvdXIgV2ViCi1hcHBsaWNhdGlvbiBhcmUgZGV2ZWxvcGVkIGR1cmluZyBXZWIgc2l0ZSBvciBXZWIgcGFnZSBkZXNpZ247IGhvd2V2ZXIsIHRoZXJlCi1hcmUgYWRkaXRpb25hbCByZXNvdXJjZXMgdGhhdCB5b3UgbWF5IG5lZWQgdG8gaW5jbHVkZSBpbiB5b3VyIFdlYiBwcm9qZWN0Ci1pZiB5b3UgYXJlIHVzaW5nIG1vcmUgYWR2YW5jZWQgV2ViIHRlY2hub2xvZ2llcyBpbiB5b3VyIGFwcGxpY2F0aW9uLjwvcD4KLQotPHA+VGhlc2UgV2ViIHJlc291cmNlcyBhcmUgbm90IHR5cGljYWwgV2ViIHBhZ2UgZmlsZXMsIGFuZCBhcmUgb2Z0ZW4gbm90IHRoZQotcmVzb3VyY2VzIHRoYXQgeW91IGNvbnNpZGVyIHBhcnQgb2YgdGhlIGZpbmFsIFdlYiBzaXRlLiBGb3IgZXhhbXBsZSwgdGFnIGxpYnJhcmllcwotYW5kIEphdmHihKIgcmVzb3VyY2VzLAotc3VjaCBhcyBKQVIgZmlsZXMsIGFyZSByZXNvdXJjZXMgeW91IG1pZ2h0IG5lZWQgdG8gaW5jbHVkZSBpbiB5b3VyIFdlYiBwcm9qZWN0LiA8L3A+Ci0KLTxwPkluIGZhY3QsIGV2ZW4gdGhlIFdBUiBmaWxlIGl0c2VsZiBjb3VsZCBiZSBjb25zaWRlcmVkIGEgV2ViIHJlc291cmNlLCBpZgoteW91IGNvbnNpZGVyIGltcG9ydGluZyBvciBleHBvcnRpbmcgdGhlIHJlc291cmNlLjwvcD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d3YXJvdnIuaHRtbCIgdGl0bGU9IiI+V2ViIGFyY2hpdmUgKFdBUikgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZmlsdGJuLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dmaWx0Ym4uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNkODc1YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dmaWx0Ym4uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3dmaWx0Ym4iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkxpc3RlbmVyczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+ZmlsdGVyczxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+RmlsdGVycyBhcmUgbmV3IGluIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEphdmEgU2VydmxldA0KLTIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPi4gVGhleSBlbmFibGUgeW91IHRvIGludGVyY2VwdCB0byBpbnRlcmNlcHQgYQ0KLXJlcXVlc3QgYmVmb3JlIGl0IHJlYWNoZXMgYSByZXNvdXJjZS4gSW4gb3RoZXIgd29yZHMsIGEgZmlsdGVyIGdpdmVzIHlvdQ0KLWFjY2VzcyB0byB0aGUgSHR0cFNlcnZsZXRSZXF1ZXN0IGFuZCB0aGUgSHR0cFNlcnZsZXRSZXNwb25zZSBvYmplY3RzDQotYmVmb3JlIHRoZXkgYXJlIHBhc3NlZCBvbiB0byBhIHNlcnZsZXQuPC9wPg0KLTxwPkZpbHRlcnMgY2FuIGJlIHZlcnkgdXNlZnVsLiBGb3IgZXhhbXBsZSwgeW91IGNhbiB3cml0ZSBhIGZpbHRlcg0KLXRoYXQgcmVjb3JkcyBhbGwgaW5jb21pbmcgcmVxdWVzdHMgYW5kIGxvZ3MgdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUNCi1jb21wdXRlcnMgZnJvbSB3aGljaCB0aGUgcmVxdWVzdHMgb3JpZ2luYXRlLiBZb3UgYWxzbyBjYW4gdXNlIGEgZmlsdGVyDQotYXMgYW4gZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBkZXZpY2UuIE90aGVyIHVzZXMgaW5jbHVkZSB1c2VyDQotYXV0aGVudGljYXRpb24sIGRhdGEgY29tcHJlc3Npb24sIHVzZXIgaW5wdXQgdmFsaWRhdGlvbiwgYW5kIHNvIG9uLjwvcD4NCi08cD5Zb3UgYWxzbyBjYW4gcHV0IGEgc2V0IG9mIGZpbHRlcnMgaW4gYSBjaGFpbi4gVGhlIGZpcnN0IGZpbHRlciBpbg0KLXRoZSBjaGFpbiB3aWxsIGJlIGNhbGxlZCBmaXJzdCBhbmQgdGhlbiBwYXNzIGNvbnRyb2wgdG8gdGhlIHNlY29uZA0KLWZpbHRlciwgYW5kIHNvIG9uLiBGaWx0ZXIgY2hhaW5pbmcgZW5zdXJlcyB0aGF0IHlvdSBjYW4gd3JpdGUgYSBmaWx0ZXINCi10aGF0IGRvZXMgYSBzcGVjaWZpYyB0YXNrIGJ1dCBhZGRzIHNvbWUgZnVuY3Rpb25hbGl0eSBpbiBhbm90aGVyIGZpbHRlci48L3A+DQotPHA+V2hlbiB3cml0aW5nIGEgZmlsdGVyLCB5b3UgYmFzaWNhbGx5IGRlYWwgd2l0aCB0aGUNCi1mb2xsb3dpbmcgdGhyZWUgaW50ZXJmYWNlcyBpbiB0aGUgamF2YXguc2VydmxldCBwYWNrYWdlOg0KLTx1bD4NCi0JPGxpPjxiPmphdmF4LnNlcnZsZXQuRmlsdGVyOjwvYj4gcmVwcmVzZW50cyB0aGUNCi0JbGlmZS1jeWNsZSBvZiB0aGUgZmlsdGVyLjwvbGk+DQotCTxsaT48Yj5qYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzo8L2I+IHJlcHJlc2VudHMgdGhlDQotCWNvbmZpZ3VyYXRpb24gb2YgdGhlIGZpbHRlci48L2xpPg0KLQk8bGk+PGI+amF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjo8L2I+IG9iamVjdCBwcm92aWRlZCBieQ0KLQl0aGUgc2VydmxldCBjb250YWluZXIgdG8gdGhlIGRldmVsb3BlciBnaXZpbmcgYSB2aWV3IGludG8gdGhlDQotCWludm9jYXRpb24gY2hhaW4gb2YgYSBmaWx0ZXJlZCByZXF1ZXN0IGZvciBhIHJlc291cmNlLjwvbGk+DQotPC91bD48L3A+DQotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZmlsdGVycywgcmVmZXIgdG8gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gU2VydmxldA0KLTIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPiBhdCA8Y29kZXBoPmphdmEuc3VuLmNvbS9wcm9kdWN0cy9zZXJ2bGV0L2Rvd25sb2FkLmh0bWw8L2NvZGVwaD4uPC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZmlsdGJuLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dmaWx0Ym4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhNTIyOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dmaWx0Ym4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ikxpc3RlbmVycyIgLz4KLTxtZXRhIGNvbnRlbnQ9ImZpbHRlcnMsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iZmlsdGVycywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dzZXJ2Ym4uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3bGlzdGJuLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jY3d0b3Zlci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdzcnZ3aXouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3bHN0d2l6Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2ZsdHdpei5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN3ZmlsdGJuIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+TGlzdGVuZXJzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd2ZpbHRibiI+PGEgbmFtZT0iY3dmaWx0Ym4iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkxpc3RlbmVyczwvaDE+Ci0KLQotPGRpdj4KLTxwPkZpbHRlcnMgYXJlIG5ldyBpbiB0aGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKYXZhIFNlcnZsZXQKLTIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPi4gVGhleSBlbmFibGUgeW91IHRvIGludGVyY2VwdCB0byBpbnRlcmNlcHQgYQotcmVxdWVzdCBiZWZvcmUgaXQgcmVhY2hlcyBhIHJlc291cmNlLiBJbiBvdGhlciB3b3JkcywgYSBmaWx0ZXIgZ2l2ZXMgeW91Ci1hY2Nlc3MgdG8gdGhlIEh0dHBTZXJ2bGV0UmVxdWVzdCBhbmQgdGhlIEh0dHBTZXJ2bGV0UmVzcG9uc2Ugb2JqZWN0cwotYmVmb3JlIHRoZXkgYXJlIHBhc3NlZCBvbiB0byBhIHNlcnZsZXQuPC9wPgotCi08cD5GaWx0ZXJzIGNhbiBiZSB2ZXJ5IHVzZWZ1bC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gd3JpdGUgYSBmaWx0ZXIKLXRoYXQgcmVjb3JkcyBhbGwgaW5jb21pbmcgcmVxdWVzdHMgYW5kIGxvZ3MgdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUKLWNvbXB1dGVycyBmcm9tIHdoaWNoIHRoZSByZXF1ZXN0cyBvcmlnaW5hdGUuIFlvdSBhbHNvIGNhbiB1c2UgYSBmaWx0ZXIKLWFzIGFuIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gZGV2aWNlLiBPdGhlciB1c2VzIGluY2x1ZGUgdXNlcgotYXV0aGVudGljYXRpb24sIGRhdGEgY29tcHJlc3Npb24sIHVzZXIgaW5wdXQgdmFsaWRhdGlvbiwgYW5kIHNvIG9uLjwvcD4KLQotPHA+WW91IGFsc28gY2FuIHB1dCBhIHNldCBvZiBmaWx0ZXJzIGluIGEgY2hhaW4uIFRoZSBmaXJzdCBmaWx0ZXIgaW4KLXRoZSBjaGFpbiB3aWxsIGJlIGNhbGxlZCBmaXJzdCBhbmQgdGhlbiBwYXNzIGNvbnRyb2wgdG8gdGhlIHNlY29uZAotZmlsdGVyLCBhbmQgc28gb24uIEZpbHRlciBjaGFpbmluZyBlbnN1cmVzIHRoYXQgeW91IGNhbiB3cml0ZSBhIGZpbHRlcgotdGhhdCBkb2VzIGEgc3BlY2lmaWMgdGFzayBidXQgYWRkcyBzb21lIGZ1bmN0aW9uYWxpdHkgaW4gYW5vdGhlciBmaWx0ZXIuPC9wPgotCi08ZGl2IGNsYXNzPSJwIj5XaGVuIHdyaXRpbmcgYSBmaWx0ZXIsIHlvdSBiYXNpY2FsbHkgZGVhbCB3aXRoIHRoZQotZm9sbG93aW5nIHRocmVlIGludGVyZmFjZXMgaW4gdGhlIGphdmF4LnNlcnZsZXQgcGFja2FnZToKLTx1bD4KLQk8bGk+PHN0cm9uZz5qYXZheC5zZXJ2bGV0LkZpbHRlcjo8L3N0cm9uZz4gcmVwcmVzZW50cyB0aGUKLQlsaWZlLWN5Y2xlIG9mIHRoZSBmaWx0ZXIuPC9saT4KLQotCTxsaT48c3Ryb25nPmphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOjwvc3Ryb25nPiByZXByZXNlbnRzIHRoZQotCWNvbmZpZ3VyYXRpb24gb2YgdGhlIGZpbHRlci48L2xpPgotCi0JPGxpPjxzdHJvbmc+amF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjo8L3N0cm9uZz4gb2JqZWN0IHByb3ZpZGVkIGJ5Ci0JdGhlIHNlcnZsZXQgY29udGFpbmVyIHRvIHRoZSBkZXZlbG9wZXIgZ2l2aW5nIGEgdmlldyBpbnRvIHRoZQotCWludm9jYXRpb24gY2hhaW4gb2YgYSBmaWx0ZXJlZCByZXF1ZXN0IGZvciBhIHJlc291cmNlLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZmlsdGVycywgcmVmZXIgdG8gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSmF2YeKEoiBTZXJ2bGV0Ci0yLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gYXQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+amF2YS5zdW4uY29tL3Byb2R1Y3RzL3NlcnZsZXQvZG93bmxvYWQuaHRtbDwvc2FtcD4uPC9wPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3NlcnZibi5odG1sIiB0aXRsZT0iIj5TZXJ2bGV0czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3bGlzdGJuLmh0bWwiIHRpdGxlPSIiPkxpc3RlbmVyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2Njd3RvdmVyLmh0bWwiIHRpdGxlPSIiPldlYiBhcHBsaWNhdGlvbiBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdzcnZ3aXouaHRtbCI+Q3JlYXRpbmcgU2VydmxldHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2xzdHdpei5odG1sIj5DcmVhdGluZyBMaXN0ZW5lcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2ZsdHdpei5odG1sIj5DcmVhdGluZyBGaWx0ZXJzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2xpc3Ribi5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3bGlzdGJuLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YTUxMzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3bGlzdGJuLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImN3bGlzdGJuIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5MaXN0ZW5lcnM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmxpc3RlbmVyczxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+TGlzdGVuZXJzIGFyZSBuZXcgZmVhdHVyZSBpbiB0aGUgPGNpdGU+U3VuDQotTWljcm9zeXN0ZW1zIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFNlcnZsZXQgMi4zIFNwZWNpZmljYXRpb248L2NpdGU+LiBBIGxpc3RlbmVyIGNhbiBiZSB1c2VkIHRvIG1vbml0b3IgYW5kDQotcmVhY3QgdG8gZXZlbnRzIGluIGEgc2VydmxldCdzIGxpZmUtY3ljbGUgYnkgZGVmaW5pbmcgbWV0aG9kcyB0aGF0IGdldA0KLWludm9rZWQgd2hlbiBsaWZlLWN5Y2xlIGV2ZW50cyBvY2N1ci4gU3VwcG9ydCBmb3IgYXBwbGljYXRpb24gbGV2ZWwNCi1ldmVudHMgaXMgZGVmaW5lZCBpbiB0aGUgSmF2YSBTZXJ2bGV0IFNwZWNpZmljYXRpb24gMi4zLjwvcD4NCi08cD5BcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcnMgYXJlIGNsYXNzZXMgdGhhdA0KLWltcGxlbWVudCBvbmUgb3IgbW9yZSBvZiB0aGUgc2VydmxldCBldmVudCBsaXN0ZW5lciBpbnRlcmZhY2VzLiBTZXJ2bGV0DQotZXZlbnQgbGlzdGVuZXJzIHN1cHBvcnQgbm90aWZpY2F0aW9uIGZvciBzdGF0ZSBjaGFuZ2VzIGluIHRoZQ0KLTxiPlNlcnZsZXRDb250ZXh0PC9iPiBhbmQgPGI+SHR0cFNlc3Npb248L2I+IG9iamVjdHMsIHNwZWNpZmljYWxseToNCi08dWw+DQotCTxsaT48Yj5TZXJ2bGV0IGNvbnRleHQgbGlzdGVuZXJzPC9iPiBhcmUgdXNlZCB0byBtYW5hZ2UgcmVzb3VyY2VzIG9yIHN0YXRlIGhlbGQgYXQgYSBWTQ0KLQlsZXZlbCBmb3IgdGhlIGFwcGxpY2F0aW9uLjwvbGk+DQotCTxsaT48Yj5IVFRQIHNlc3Npb24JbGlzdGVuZXJzPC9iPiBhcmUgdXNlZCB0byBtYW5hZ2Ugc3RhdGUgb3IgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhDQotCXNlcmllcyBvZiByZXF1ZXN0cyBtYWRlIGluIGEgV2ViIGFwcGxpY2F0aW9uIGZyb20gdGhlIHNhbWUgY2xpZW50IG9yDQotCXVzZXIuPC9saT4NCi08L3VsPjwvcD4NCi08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBsaXN0ZW5lcnMsIHJlZmVyIHRvIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIDx0bQ0KLXRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFNlcnZsZXQNCi0yLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gYXQgPGNvZGVwaD5qYXZhLnN1bi5jb20vcHJvZHVjdHMvc2VydmxldC9kb3dubG9hZC5odG1sPC9jb2RlcGg+LjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2xpc3Ribi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3bGlzdGJuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMTEwOWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3bGlzdGJuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJMaXN0ZW5lcnMiIC8+Ci08bWV0YSBjb250ZW50PSJsaXN0ZW5lcnMsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ibGlzdGVuZXJzLCBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3NlcnZibi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dmaWx0Ym4uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2Njd3RvdmVyLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d3Nydndpei5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdsc3R3aXouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3Zmx0d2l6Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3dsaXN0Ym4iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5MaXN0ZW5lcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImN3bGlzdGJuIj48YSBuYW1lPSJjd2xpc3RibiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TGlzdGVuZXJzPC9oMT4KLQotCi08ZGl2PgotPHA+TGlzdGVuZXJzIGFyZSBuZXcgZmVhdHVyZSBpbiB0aGUgPGNpdGU+U3VuCi1NaWNyb3N5c3RlbXMgSmF2YeKEoiBTZXJ2bGV0IDIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPi4gQSBsaXN0ZW5lciBjYW4gYmUgdXNlZCB0byBtb25pdG9yIGFuZAotcmVhY3QgdG8gZXZlbnRzIGluIGEgc2VydmxldCdzIGxpZmUtY3ljbGUgYnkgZGVmaW5pbmcgbWV0aG9kcyB0aGF0IGdldAotaW52b2tlZCB3aGVuIGxpZmUtY3ljbGUgZXZlbnRzIG9jY3VyLiBTdXBwb3J0IGZvciBhcHBsaWNhdGlvbiBsZXZlbAotZXZlbnRzIGlzIGRlZmluZWQgaW4gdGhlIEphdmEgU2VydmxldCBTcGVjaWZpY2F0aW9uIDIuMy48L3A+Ci0KLTxkaXYgY2xhc3M9InAiPkFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVycyBhcmUgY2xhc3NlcyB0aGF0Ci1pbXBsZW1lbnQgb25lIG9yIG1vcmUgb2YgdGhlIHNlcnZsZXQgZXZlbnQgbGlzdGVuZXIgaW50ZXJmYWNlcy4gU2VydmxldAotZXZlbnQgbGlzdGVuZXJzIHN1cHBvcnQgbm90aWZpY2F0aW9uIGZvciBzdGF0ZSBjaGFuZ2VzIGluIHRoZQotPHN0cm9uZz5TZXJ2bGV0Q29udGV4dDwvc3Ryb25nPiBhbmQgPHN0cm9uZz5IdHRwU2Vzc2lvbjwvc3Ryb25nPiBvYmplY3RzLCBzcGVjaWZpY2FsbHk6Ci08dWw+Ci0JPGxpPjxzdHJvbmc+U2VydmxldCBjb250ZXh0IGxpc3RlbmVyczwvc3Ryb25nPiBhcmUgdXNlZCB0byBtYW5hZ2UgcmVzb3VyY2VzIG9yIHN0YXRlIGhlbGQgYXQgYSBWTQotCWxldmVsIGZvciB0aGUgYXBwbGljYXRpb24uPC9saT4KLQotCTxsaT48c3Ryb25nPkhUVFAgc2Vzc2lvbglsaXN0ZW5lcnM8L3N0cm9uZz4gYXJlIHVzZWQgdG8gbWFuYWdlIHN0YXRlIG9yIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYQotCXNlcmllcyBvZiByZXF1ZXN0cyBtYWRlIGluIGEgV2ViIGFwcGxpY2F0aW9uIGZyb20gdGhlIHNhbWUgY2xpZW50IG9yCi0JdXNlci48L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGxpc3RlbmVycywgcmVmZXIgdG8gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSmF2YSBTZXJ2bGV0Ci0yLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gYXQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+amF2YS5zdW4uY29tL3Byb2R1Y3RzL3NlcnZsZXQvZG93bmxvYWQuaHRtbDwvc2FtcD4uPC9wPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3NlcnZibi5odG1sIiB0aXRsZT0iIj5TZXJ2bGV0czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3ZmlsdGJuLmh0bWwiIHRpdGxlPSIiPkxpc3RlbmVyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2Njd3RvdmVyLmh0bWwiIHRpdGxlPSIiPldlYiBhcHBsaWNhdGlvbiBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdzcnZ3aXouaHRtbCI+Q3JlYXRpbmcgU2VydmxldHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2xzdHdpei5odG1sIj5DcmVhdGluZyBMaXN0ZW5lcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2ZsdHdpei5odG1sIj5DcmVhdGluZyBGaWx0ZXJzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3NlcnZibi5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3c2VydmJuLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYjU4MTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3c2VydmJuLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImN3c2VydmJuIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TZXJ2bGV0czwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c2VydmxldHM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5XZWINCi1zZXJ2ZXJzPGluZGV4dGVybT5nZW5lcmF0aW5nIGR5bmFtaWMgY29udGVudDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5TZXJ2bGV0cyBhcmUgc2VydmVyLXNpZGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gcHJvZ3JhbXMgdGhhdCB1c2UgdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gU2VydmxldA0KLUFQSTwvY2l0ZT4gYW5kIGl0cyBhc3NvY2lhdGVkIGNsYXNzZXMgYW5kIG1ldGhvZHMsIGFzIGRlZmluZWQgaW4gdGhlIDxjaXRlPlN1bg0KLU1pY3Jvc3lzdGVtcyA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSINCi10cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBTZXJ2bGV0IDIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPi4gVGhlc2UgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gcHJvZ3JhbXMNCi1leHRlbmQgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYSBXZWIgc2VydmVyIGJ5IGdlbmVyYXRpbmcgZHluYW1pYyBjb250ZW50IGFuZA0KLXJlc3BvbmRpbmcgdG8gV2ViIGNsaWVudCByZXF1ZXN0cy4gV2hlbiBhIGJyb3dzZXIgc2VuZHMgYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIsDQotdGhlIHNlcnZlciBjYW4gc2VuZCB0aGUgcmVxdWVzdCBpbmZvcm1hdGlvbiB0byBhIHNlcnZsZXQsIHNvIHRoYXQgdGhlIHNlcnZsZXQNCi1jYW4gY29uc3RydWN0IHRoZSByZXNwb25zZSB0aGF0IGlzIHNlbnQgYmFjayB0byB0aGUgYnJvd3Nlci48L3A+DQotPHA+SnVzdCBhcyBhcHBsZXRzIHJ1biBvbiBhIFdlYiBicm93c2VyIGFuZCBleHRlbmQgdGhlIGJyb3dzZXIncyBjYXBhYmlsaXRpZXMsDQotc2VydmxldHMgcnVuIG9uIGEgSmF2YS1lbmFibGVkIFdlYiBzZXJ2ZXIgYW5kIGV4dGVuZCB0aGUgc2VydmVyJ3MgY2FwYWJpbGl0aWVzLg0KLUJlY2F1c2Ugb2YgdGhlaXIgZmxleGliaWxpdHkgYW5kIHNjYWxhYmlsaXR5LCBzZXJ2bGV0cyBhcmUgY29tbW9ubHkgdXNlZCB0bw0KLWVuYWJsZSBidXNpbmVzc2VzIHRvIGNvbm5lY3QgZGF0YWJhc2VzIHRvIHRoZSBXZWIuPC9wPg0KLTxwPkFsdGhvdWdoIGEgc2VydmxldCBjYW4gYmUgYSBjb21wbGV0ZWx5IHNlbGYtY29udGFpbmVkIHByb2dyYW0sIHlvdSBjYW4NCi1zcGxpdCBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCBpbnRvIHR3byBwb3J0aW9uczogIDx1bD4NCi08bGk+VGhlIGJ1c2luZXNzIGxvZ2ljIChjb250ZW50IGdlbmVyYXRpb24pLCB3aGljaCBnb3Zlcm5zIHRoZSByZWxhdGlvbnNoaXANCi1iZXR3ZWVuIGlucHV0LCBwcm9jZXNzaW5nLCBhbmQgb3V0cHV0PC9saT4NCi08bGk+VGhlIHByZXNlbnRhdGlvbiBsb2dpYyAoY29udGVudCBwcmVzZW50YXRpb24sIG9yIGdyYXBoaWMgZGVzaWduIHJ1bGVzKSwNCi13aGljaCBkZXRlcm1pbmVzIGhvdyBpbmZvcm1hdGlvbiBpcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXI8L2xpPg0KLTwvdWw+VXNpbmcgdGhpcyBwYXJhZGlnbSwgeW91IG1heSBjaG9vc2UgdG8gaGF2ZSBidXNpbmVzcyBsb2dpYyBoYW5kbGVkIGJ5IDx0bQ0KLXRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJlYW5zLA0KLXRoZSBwcmVzZW50YXRpb24gbG9naWMgaGFuZGxlZCBieSBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIG9yIEhUTUwgZmlsZXMsIGFuZA0KLXRoZSBIVFRQIHByb3RvY29sIGhhbmRsZWQgYnkgYSBzZXJ2bGV0LjwvcD4NCi08bm90ZT5KU1AgZmlsZXMgY2FuIGJlIHVzZWQgdG8gbWFuYWdlIGJvdGggdGhlIHByZXNlbnRhdGlvbiBhbmQgYnVzaW5lc3MgbG9naWMNCi1mb3IgYSBXZWIgYXBwbGljYXRpb24uIEpTUCBmaWxlcyB1c2Ugc3RydWN0dXJlZCBtYXJrdXAgZm9yIHByZXNlbnRhdGlvbiwgYW5kDQotc3VwcGx5IHNlcnZsZXQgbW9kZWwgYmVoYXZpb3IgYXQgcnVuIHRpbWUuPC9ub3RlPg0KLTxwPllvdSBjYW4gZGV2ZWxvcCwgZGVidWcsIGFuZCBkZXBsb3kgc2VydmxldHMsIHNldCBicmVha3BvaW50cyB3aXRoaW4gc2VydmxldA0KLW9iamVjdHMsIGFuZCBzdGVwIHRocm91Z2ggY29kZSB0byBtYWtlIGNoYW5nZXMgdGhhdCBhcmUgZHluYW1pY2FsbHkgZm9sZGVkDQotaW50byB0aGUgcnVubmluZyBzZXJ2bGV0IG9uIGEgcnVubmluZyBzZXJ2ZXIsIHdpdGhvdXQgaGF2aW5nIHRvIHJlc3RhcnQgZWFjaA0KLXRpbWUuPC9wPg0KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHNlcnZsZXRzLCByZWZlciB0byB0aGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyA8dG0NCi10bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBTZXJ2bGV0DQotMi4zIFNwZWNpZmljYXRpb248L2NpdGU+IGF0IDxjb2RlcGg+amF2YS5zdW4uY29tL3Byb2R1Y3RzL3NlcnZsZXQvZG93bmxvYWQuaHRtbDwvY29kZXBoPi48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dzZXJ2Ym4uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3NlcnZibi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDcxZTc4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3NlcnZibi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU2VydmxldHMiIC8+Ci08bWV0YSBjb250ZW50PSJzZXJ2bGV0cywgb3ZlcnZpZXcsIFdlYiBzZXJ2ZXJzLCBnZW5lcmF0aW5nIGR5bmFtaWMgY29udGVudCIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InNlcnZsZXRzLCBvdmVydmlldywgV2ViIHNlcnZlcnMsIGdlbmVyYXRpbmcgZHluYW1pYyBjb250ZW50IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3bGlzdGJuLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd2ZpbHRibi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2N3dG92ZXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3c3J2d2l6Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2xzdHdpei5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdmbHR3aXouaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjd3NlcnZibiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNlcnZsZXRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd3NlcnZibiI+PGEgbmFtZT0iY3dzZXJ2Ym4iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNlcnZsZXRzPC9oMT4KLQotCi08ZGl2PgotPHA+U2VydmxldHMgYXJlIHNlcnZlci1zaWRlIEphdmHihKIgcHJvZ3JhbXMgdGhhdCB1c2UgdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSmF2YSBTZXJ2bGV0Ci1BUEk8L2NpdGU+IGFuZCBpdHMgYXNzb2NpYXRlZCBjbGFzc2VzIGFuZCBtZXRob2RzLCBhcyBkZWZpbmVkIGluIHRoZSA8Y2l0ZT5TdW4KLU1pY3Jvc3lzdGVtcyBKYXZhIFNlcnZsZXQgMi4zIFNwZWNpZmljYXRpb248L2NpdGU+LiBUaGVzZSBKYXZhIHByb2dyYW1zCi1leHRlbmQgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYSBXZWIgc2VydmVyIGJ5IGdlbmVyYXRpbmcgZHluYW1pYyBjb250ZW50IGFuZAotcmVzcG9uZGluZyB0byBXZWIgY2xpZW50IHJlcXVlc3RzLiBXaGVuIGEgYnJvd3NlciBzZW5kcyBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciwKLXRoZSBzZXJ2ZXIgY2FuIHNlbmQgdGhlIHJlcXVlc3QgaW5mb3JtYXRpb24gdG8gYSBzZXJ2bGV0LCBzbyB0aGF0IHRoZSBzZXJ2bGV0Ci1jYW4gY29uc3RydWN0IHRoZSByZXNwb25zZSB0aGF0IGlzIHNlbnQgYmFjayB0byB0aGUgYnJvd3Nlci48L3A+Ci0KLTxwPkp1c3QgYXMgYXBwbGV0cyBydW4gb24gYSBXZWIgYnJvd3NlciBhbmQgZXh0ZW5kIHRoZSBicm93c2VyJ3MgY2FwYWJpbGl0aWVzLAotc2VydmxldHMgcnVuIG9uIGEgSmF2YS1lbmFibGVkIFdlYiBzZXJ2ZXIgYW5kIGV4dGVuZCB0aGUgc2VydmVyJ3MgY2FwYWJpbGl0aWVzLgotQmVjYXVzZSBvZiB0aGVpciBmbGV4aWJpbGl0eSBhbmQgc2NhbGFiaWxpdHksIHNlcnZsZXRzIGFyZSBjb21tb25seSB1c2VkIHRvCi1lbmFibGUgYnVzaW5lc3NlcyB0byBjb25uZWN0IGRhdGFiYXNlcyB0byB0aGUgV2ViLjwvcD4KLQotPGRpdiBjbGFzcz0icCI+QWx0aG91Z2ggYSBzZXJ2bGV0IGNhbiBiZSBhIGNvbXBsZXRlbHkgc2VsZi1jb250YWluZWQgcHJvZ3JhbSwgeW91IGNhbgotc3BsaXQgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgaW50byB0d28gcG9ydGlvbnM6ICA8dWw+Ci08bGk+VGhlIGJ1c2luZXNzIGxvZ2ljIChjb250ZW50IGdlbmVyYXRpb24pLCB3aGljaCBnb3Zlcm5zIHRoZSByZWxhdGlvbnNoaXAKLWJldHdlZW4gaW5wdXQsIHByb2Nlc3NpbmcsIGFuZCBvdXRwdXQ8L2xpPgotCi08bGk+VGhlIHByZXNlbnRhdGlvbiBsb2dpYyAoY29udGVudCBwcmVzZW50YXRpb24sIG9yIGdyYXBoaWMgZGVzaWduIHJ1bGVzKSwKLXdoaWNoIGRldGVybWluZXMgaG93IGluZm9ybWF0aW9uIGlzIHByZXNlbnRlZCB0byB0aGUgdXNlcjwvbGk+Ci0KLTwvdWw+Ci1Vc2luZyB0aGlzIHBhcmFkaWdtLCB5b3UgbWF5IGNob29zZSB0byBoYXZlIGJ1c2luZXNzIGxvZ2ljIGhhbmRsZWQgYnkgSmF2YSBiZWFucywKLXRoZSBwcmVzZW50YXRpb24gbG9naWMgaGFuZGxlZCBieSBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIG9yIEhUTUwgZmlsZXMsIGFuZAotdGhlIEhUVFAgcHJvdG9jb2wgaGFuZGxlZCBieSBhIHNlcnZsZXQuPC9kaXY+Ci0KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBKU1AgZmlsZXMgY2FuIGJlIHVzZWQgdG8gbWFuYWdlIGJvdGggdGhlIHByZXNlbnRhdGlvbiBhbmQgYnVzaW5lc3MgbG9naWMKLWZvciBhIFdlYiBhcHBsaWNhdGlvbi4gSlNQIGZpbGVzIHVzZSBzdHJ1Y3R1cmVkIG1hcmt1cCBmb3IgcHJlc2VudGF0aW9uLCBhbmQKLXN1cHBseSBzZXJ2bGV0IG1vZGVsIGJlaGF2aW9yIGF0IHJ1biB0aW1lLjwvZGl2PgotCi08cD5Zb3UgY2FuIGRldmVsb3AsIGRlYnVnLCBhbmQgZGVwbG95IHNlcnZsZXRzLCBzZXQgYnJlYWtwb2ludHMgd2l0aGluIHNlcnZsZXQKLW9iamVjdHMsIGFuZCBzdGVwIHRocm91Z2ggY29kZSB0byBtYWtlIGNoYW5nZXMgdGhhdCBhcmUgZHluYW1pY2FsbHkgZm9sZGVkCi1pbnRvIHRoZSBydW5uaW5nIHNlcnZsZXQgb24gYSBydW5uaW5nIHNlcnZlciwgd2l0aG91dCBoYXZpbmcgdG8gcmVzdGFydCBlYWNoCi10aW1lLjwvcD4KLQotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgc2VydmxldHMsIHJlZmVyIHRvIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEphdmEgU2VydmxldAotMi4zIFNwZWNpZmljYXRpb248L2NpdGU+IGF0IDxzYW1wIGNsYXNzPSJjb2RlcGgiPmphdmEuc3VuLmNvbS9wcm9kdWN0cy9zZXJ2bGV0L2Rvd25sb2FkLmh0bWw8L3NhbXA+LjwvcD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3dsaXN0Ym4uaHRtbCIgdGl0bGU9IiI+TGlzdGVuZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3dmaWx0Ym4uaHRtbCIgdGl0bGU9IiI+TGlzdGVuZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2N3dG92ZXIuaHRtbCIgdGl0bGU9IiI+V2ViIGFwcGxpY2F0aW9uIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d3Nydndpei5odG1sIj5DcmVhdGluZyBTZXJ2bGV0czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3bHN0d2l6Lmh0bWwiPkNyZWF0aW5nIExpc3RlbmVyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Zmx0d2l6Lmh0bWwiPkNyZWF0aW5nIEZpbHRlcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3dGZlYXR1cmVzLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d0ZmVhdHVyZXMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2ZTQxNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d0ZmVhdHVyZXMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08IS0tIEFyYm9yVGV4dCwgSW5jLiwgMTk4OC0yMDAyLCB2LjQwMDIgLS0+DQotPGNvbmNlcHQgaWQ9ImN3dGZlYXR1cmVzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5XZWIgdG9vbHMgZmVhdHVyZXM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+IFRoZSBpbnRlZ3JhdGVkIFdlYiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBtYWtlcyBpdCBlYXN5IHRvIGNvb3BlcmF0aXZlbHkNCi1jcmVhdGUsIGFzc2VtYmxlLCBwdWJsaXNoLCBkZXBsb3kgYW5kIG1haW50YWluIGR5bmFtaWMsIGludGVyYWN0aXZlIFdlYiBhcHBsaWNhdGlvbnMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+V2ViIHRvb2xzPGluZGV4dGVybT5mZWF0dXJlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UaGUgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgaGlnaC1sZXZlbCBjYXBhYmlsaXRpZXM6DQotIDx1bD4NCi08bGk+RHluYW1pYyBXZWIgcHJvamVjdCBjcmVhdGlvbiwgdXNpbmcgdGhlIEphdmEgRUUtZGVmaW5lZCBoaWVyYXJjaHksIG9yDQotYSBzdGF0aWMgdmVyc2lvbiB0aGF0IHJlZHVjZXMgcHJvamVjdCBvdmVyaGVhZCB3aGVuIGR5bmFtaWMgZWxlbWVudHMgYXJlIG5vdA0KLXJlcXVpcmVkLiAgU3RhdGljIFdlYiBwcm9qZWN0cyBjYW4gbGF0ZXIgYmUgY29udmVydGVkIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzLjxwPjwvcD48L2xpPg0KLTxsaT5DcmVhdGlvbiBhbmQgZWRpdGluZyBvZiBhIFdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKDxmaWxlcGF0aD53ZWIueG1sPC9maWxlcGF0aD4pDQotIGZpbGU8cD48L3A+PC9saT4NCi08bGk+SlNQIGFuZCBIVE1MIGZpbGUgY3JlYXRpb24sIHZhbGlkYXRpb24sIGVkaXRpbmcsIGFuZCBkZWJ1Z2dpbmc8cD48L3A+PC9saT4NCi08bGk+QW4gZXh0ZW5zaWJsZSB2aWV3LCBjYWxsZWQgdGhlIFNuaXBwZXRzIHZpZXcsIHdoaWNoIGFsbG93cyB1c2VycyB0byBjYXRhbG9nDQotIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwsIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+LA0KLSBhbmQgSlNQIG1hcmt1cCwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIHRhZ3MsIHRoYXQgY2FuIGJlIGVtYmVkZGVkIGluDQotIGV4aXN0aW5nIGZpbGVzPHA+PC9wPjwvbGk+DQotPGxpPkR5bmFtaWMgdGFnIGhlbHAgKGNvbnRlbnQgYXNzaXN0KSAsIHdoaWNoIGRpc3BsYXlzIHRhZyB1c2FnZSBhbmQgYXR0cmlidXRlDQotaW5mb3JtYXRpb24gZm9yICBIVE1MLCBKU1AsIGFuZCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiB0YWdzIGJhc2VkIG9uIGN1cnNvciBsb2NhdGlvbg0KLSBpbiB0aGUgU291cmNlIHBhZ2UuIChZb3UgaW52b2tlIENvbnRlbnQgQXNzaXN0IGJ5IHByZXNzaW5nIChDdHJsK1NwYWNlYmFyKQ0KLSk8cD48L3A+PC9saT4NCi08bGk+Q2FzY2FkaW5nIHN0eWxlIHNoZWV0IChDU1MpIGVkaXRpbmcgc3VwcG9ydDxwPjwvcD48L2xpPg0KLTxsaT5IVFRQL0ZUUCBpbXBvcnQ8cD48L3A+PC9saT4NCi08bGk+RlRQIGV4cG9ydCAoc2ltcGxlIHJlc291cmNlIGNvcHkpIHRvIGEgc2VydmVyPHA+PC9wPjwvbGk+DQotPGxpPldBUiBmaWxlIGltcG9ydCwgZXhwb3J0LCBhbmQgdmFsaWRhdGlvbjxwPjwvcD48L2xpPg0KLTxsaT5TZXJ2bGV0IGNyZWF0aW9uLCB3aGljaCBlbXBsb3lzIHRoZSBTZXJ2bGV0IFdpemFyZCB0byBjcmVhdGUgbmV3IHNlcnZsZXRzLjxwPjwvcD48L2xpPg0KLTwvdWw+PC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3dGZlYXR1cmVzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d0ZmVhdHVyZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUzMmU1YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d0ZmVhdHVyZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IldlYiB0b29scyBmZWF0dXJlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgaW50ZWdyYXRlZCBXZWIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgbWFrZXMgaXQgZWFzeSB0byBjb29wZXJhdGl2ZWx5IGNyZWF0ZSwgYXNzZW1ibGUsIHB1Ymxpc2gsIGRlcGxveSBhbmQgbWFpbnRhaW4gZHluYW1pYywgaW50ZXJhY3RpdmUgV2ViIGFwcGxpY2F0aW9ucy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIGludGVncmF0ZWQgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IG1ha2VzIGl0IGVhc3kgdG8gY29vcGVyYXRpdmVseSBjcmVhdGUsIGFzc2VtYmxlLCBwdWJsaXNoLCBkZXBsb3kgYW5kIG1haW50YWluIGR5bmFtaWMsIGludGVyYWN0aXZlIFdlYiBhcHBsaWNhdGlvbnMuIiAvPgotPG1ldGEgY29udGVudD0iV2ViIHRvb2xzLCBmZWF0dXJlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiB0b29scywgZmVhdHVyZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2N3ZWJwcmouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3ZWJwYWdlZGVzaWduLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2NyZXByai5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGpjcmVqc3AuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3c3J2d2l6Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2xzdHdpei5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdmbHR3aXouaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjd3RmZWF0dXJlcyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldlYiB0b29scyBmZWF0dXJlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3d0ZmVhdHVyZXMiPjxhIG5hbWU9ImN3dGZlYXR1cmVzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5XZWIgdG9vbHMgZmVhdHVyZXM8L2gxPgotCi0KLQotPGRpdj48cD4gVGhlIGludGVncmF0ZWQgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IG1ha2VzIGl0IGVhc3kgdG8gY29vcGVyYXRpdmVseQotY3JlYXRlLCBhc3NlbWJsZSwgcHVibGlzaCwgZGVwbG95IGFuZCBtYWludGFpbiBkeW5hbWljLCBpbnRlcmFjdGl2ZSBXZWIgYXBwbGljYXRpb25zLjwvcD4KLQotPGRpdiBjbGFzcz0icCI+VGhlIFdlYiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGhpZ2gtbGV2ZWwgY2FwYWJpbGl0aWVzOgotIDx1bD4KLTxsaT5EeW5hbWljIFdlYiBwcm9qZWN0IGNyZWF0aW9uLCB1c2luZyB0aGUgSmF2YSBFRS1kZWZpbmVkIGhpZXJhcmNoeSwgb3IKLWEgc3RhdGljIHZlcnNpb24gdGhhdCByZWR1Y2VzIHByb2plY3Qgb3ZlcmhlYWQgd2hlbiBkeW5hbWljIGVsZW1lbnRzIGFyZSBub3QKLXJlcXVpcmVkLiAgU3RhdGljIFdlYiBwcm9qZWN0cyBjYW4gbGF0ZXIgYmUgY29udmVydGVkIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzLjxwIC8+Ci08L2xpPgotCi08bGk+Q3JlYXRpb24gYW5kIGVkaXRpbmcgb2YgYSBXZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yICg8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPndlYi54bWw8L3NwYW4+KQotIGZpbGU8cCAvPgotPC9saT4KLQotPGxpPkpTUCBhbmQgSFRNTCBmaWxlIGNyZWF0aW9uLCB2YWxpZGF0aW9uLCBlZGl0aW5nLCBhbmQgZGVidWdnaW5nPHAgLz4KLTwvbGk+Ci0KLTxsaT5BbiBleHRlbnNpYmxlIHZpZXcsIGNhbGxlZCB0aGUgU25pcHBldHMgdmlldywgd2hpY2ggYWxsb3dzIHVzZXJzIHRvIGNhdGFsb2cKLSBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB04oSiLAotIGFuZCBKU1AgbWFya3VwLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gdGFncywgdGhhdCBjYW4gYmUgZW1iZWRkZWQgaW4KLSBleGlzdGluZyBmaWxlczxwIC8+Ci08L2xpPgotCi08bGk+RHluYW1pYyB0YWcgaGVscCAoY29udGVudCBhc3Npc3QpICwgd2hpY2ggZGlzcGxheXMgdGFnIHVzYWdlIGFuZCBhdHRyaWJ1dGUKLWluZm9ybWF0aW9uIGZvciAgSFRNTCwgSlNQLCBhbmQgSmF2YVNjcmlwdCB0YWdzIGJhc2VkIG9uIGN1cnNvciBsb2NhdGlvbgotIGluIHRoZSBTb3VyY2UgcGFnZS4gKFlvdSBpbnZva2UgQ29udGVudCBBc3Npc3QgYnkgcHJlc3NpbmcgKEN0cmwrU3BhY2ViYXIpCi0pPHAgLz4KLTwvbGk+Ci0KLTxsaT5DYXNjYWRpbmcgc3R5bGUgc2hlZXQgKENTUykgZWRpdGluZyBzdXBwb3J0PHAgLz4KLTwvbGk+Ci0KLTxsaT5IVFRQL0ZUUCBpbXBvcnQ8cCAvPgotPC9saT4KLQotPGxpPkZUUCBleHBvcnQgKHNpbXBsZSByZXNvdXJjZSBjb3B5KSB0byBhIHNlcnZlcjxwIC8+Ci08L2xpPgotCi08bGk+V0FSIGZpbGUgaW1wb3J0LCBleHBvcnQsIGFuZCB2YWxpZGF0aW9uPHAgLz4KLTwvbGk+Ci0KLTxsaT5TZXJ2bGV0IGNyZWF0aW9uLCB3aGljaCBlbXBsb3lzIHRoZSBTZXJ2bGV0IFdpemFyZCB0byBjcmVhdGUgbmV3IHNlcnZsZXRzLjxwIC8+Ci08L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2Njd2VicHJqLmh0bWwiIHRpdGxlPSIiPkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd2VicGFnZWRlc2lnbi5odG1sIiB0aXRsZT0iIj5XZWIgcGFnZSBkZXNpZ248L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Y3JlcHJqLmh0bWwiPkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqY3JlanNwLmh0bWwiPkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d3Nydndpei5odG1sIj5DcmVhdGluZyBTZXJ2bGV0czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3bHN0d2l6Lmh0bWwiPkNyZWF0aW5nIExpc3RlbmVyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Zmx0d2l6Lmh0bWwiPkNyZWF0aW5nIEZpbHRlcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2Fyb3ZyLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3YXJvdnIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYxYWRmNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3YXJvdnIuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3d3YXJvdnIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPldlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XQVIgZmlsZXM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPiBBIFdlYiBhcHBsaWNhdGlvbiBpcyBhIGdyb3VwIG9mIEhUTUwgcGFnZXMsIEpTUCBwYWdlcywgc2VydmxldHMsIHJlc291cmNlcw0KLWFuZCBzb3VyY2UgZmlsZSwgd2hpY2ggY2FuIGJlIG1hbmFnZWQgYXMgYSBzaW5nbGUgdW5pdC4gQSBXZWIgYXJjaGl2ZSAoV0FSKQ0KLWZpbGUgaXMgYSBwYWNrYWdlZCBXZWIgYXBwbGljYXRpb24uIFdBUiBmaWxlcyBjYW4gYmUgdXNlZCB0byBpbXBvcnQgYSBXZWINCi1hcHBsaWNhdGlvbiBpbnRvIGEgV2ViIHNlcnZlci48L3A+DQotPHA+SW4gYWRkaXRpb24gdG8gcHJvamVjdCByZXNvdXJjZXMsIHRoZSBXQVIgZmlsZSBpbmNsdWRlcyBhIFdlYiBkZXBsb3ltZW50DQotZGVzY3JpcHRvciBmaWxlLiBUaGUgV2ViIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyBhbiBYTUwgZmlsZSB0aGF0IGNvbnRhaW5zDQotZGVwbG95bWVudCBpbmZvcm1hdGlvbiwgTUlNRSB0eXBlcywgc2Vzc2lvbiBjb25maWd1cmF0aW9uIGRldGFpbHMsIGFuZCBvdGhlcg0KLXNldHRpbmdzIGZvciBhIFdlYiBhcHBsaWNhdGlvbi4gVGhlIFdlYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSAoPGZpbGVwYXRoPndlYi54bWw8L2ZpbGVwYXRoPikNCi1wcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgV0FSIGZpbGUgaXMgc2hhcmVkIHdpdGggdGhlIGRldmVsb3BlcnMsIGFzc2VtYmxlcnMsDQotYW5kIGRlcGxveWVycyBpbiBhIEphdmEgRUUgZW52aXJvbm1lbnQuPC9wPg0KLTxwPlRoZSBXZWIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgcHJvdmlkZXMgZmFjaWxpdGllcyBmb3IgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcNCi1XQVIgZmlsZXMsIHVzaW5nIHRoZSBmb2xsb3dpbmcgd2l6YXJkczogPHVsPg0KLTxsaT48cGg+SW1wb3J0IFJlc291cmNlcyBmcm9tIGEgV0FSIEZpbGU8L3BoPiwgd2hpY2ggcmVxdWlyZXMgdGhhdCB5b3UgdG8NCi1zcGVjaWZ5IGEgV2ViIHByb2plY3QuIFlvdSBjYW4gdXNlIGV4aXN0aW5nIHByb2plY3RzIG9yIGNyZWF0ZSB0aGVtIGFzIHlvdQ0KLXVzZSB0aGUgd2l6YXJkLjwvbGk+DQotPGxpPjxwaD5FeHBvcnQgUmVzb3VyY2VzIHRvIGEgV0FSIEZpbGU8L3BoPiwgd2hpY2ggcmVxdWlyZXMgb25seSBhbiBleHBvcnQNCi1sb2NhdGlvbiBhbmQgc29tZSBvcHRpb25hbCBzZXR0aW5nczwvbGk+DQotPC91bD48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3YXJvdnIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3dhcm92ci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWI1ZDYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3dhcm92ci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiIC8+Ci08bWV0YSBjb250ZW50PSJXQVIgZmlsZXMsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iV0FSIGZpbGVzLCBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd2VicmVzb3VyY2VzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2ltcHdhci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdjcmV3YXIuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjd3dhcm92ciIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd3dhcm92ciI+PGEgbmFtZT0iY3d3YXJvdnIiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC9oMT4KLQotCi08ZGl2PgotPHA+IEEgV2ViIGFwcGxpY2F0aW9uIGlzIGEgZ3JvdXAgb2YgSFRNTCBwYWdlcywgSlNQIHBhZ2VzLCBzZXJ2bGV0cywgcmVzb3VyY2VzCi1hbmQgc291cmNlIGZpbGUsIHdoaWNoIGNhbiBiZSBtYW5hZ2VkIGFzIGEgc2luZ2xlIHVuaXQuIEEgV2ViIGFyY2hpdmUgKFdBUikKLWZpbGUgaXMgYSBwYWNrYWdlZCBXZWIgYXBwbGljYXRpb24uIFdBUiBmaWxlcyBjYW4gYmUgdXNlZCB0byBpbXBvcnQgYSBXZWIKLWFwcGxpY2F0aW9uIGludG8gYSBXZWIgc2VydmVyLjwvcD4KLQotPHA+SW4gYWRkaXRpb24gdG8gcHJvamVjdCByZXNvdXJjZXMsIHRoZSBXQVIgZmlsZSBpbmNsdWRlcyBhIFdlYiBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yIGZpbGUuIFRoZSBXZWIgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzIGFuIFhNTCBmaWxlIHRoYXQgY29udGFpbnMKLWRlcGxveW1lbnQgaW5mb3JtYXRpb24sIE1JTUUgdHlwZXMsIHNlc3Npb24gY29uZmlndXJhdGlvbiBkZXRhaWxzLCBhbmQgb3RoZXIKLXNldHRpbmdzIGZvciBhIFdlYiBhcHBsaWNhdGlvbi4gVGhlIFdlYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSAoPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj53ZWIueG1sPC9zcGFuPikKLXByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBXQVIgZmlsZSBpcyBzaGFyZWQgd2l0aCB0aGUgZGV2ZWxvcGVycywgYXNzZW1ibGVycywKLWFuZCBkZXBsb3llcnMgaW4gYSBKYXZhIEVFIGVudmlyb25tZW50LjwvcD4KLQotPGRpdiBjbGFzcz0icCI+VGhlIFdlYiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBwcm92aWRlcyBmYWNpbGl0aWVzIGZvciBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZwotV0FSIGZpbGVzLCB1c2luZyB0aGUgZm9sbG93aW5nIHdpemFyZHM6IDx1bD4KLTxsaT48c3Bhbj5JbXBvcnQgUmVzb3VyY2VzIGZyb20gYSBXQVIgRmlsZTwvc3Bhbj4sIHdoaWNoIHJlcXVpcmVzIHRoYXQgeW91IHRvCi1zcGVjaWZ5IGEgV2ViIHByb2plY3QuIFlvdSBjYW4gdXNlIGV4aXN0aW5nIHByb2plY3RzIG9yIGNyZWF0ZSB0aGVtIGFzIHlvdQotdXNlIHRoZSB3aXphcmQuPC9saT4KLQotPGxpPjxzcGFuPkV4cG9ydCBSZXNvdXJjZXMgdG8gYSBXQVIgRmlsZTwvc3Bhbj4sIHdoaWNoIHJlcXVpcmVzIG9ubHkgYW4gZXhwb3J0Ci1sb2NhdGlvbiBhbmQgc29tZSBvcHRpb25hbCBzZXR0aW5nczwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3dlYnJlc291cmNlcy5odG1sIiB0aXRsZT0iIj5XZWIgcmVzb3VyY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2ltcHdhci5odG1sIj5JbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2NyZXdhci5odG1sIj5FeHBvcnRpbmcgV2ViIEFyY2hpdmUgKFdBUikgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2VkdHZ3LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3ZWR0dncuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3MzNkZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3ZWR0dncuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3d3ZWR0dnciIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPldvcmtiZW5jaCBpbnRlZ3JhdGlvbiB3aXRoIFdlYiBlZGl0b3JzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9ImN3d2VkdHZ3fDF8V2ViZWRpdG9yc3dvcmtiZW5jaGludGVncmF0aW9uIiBzdGF0dXM9ImNoYW5nZWQiPndvcmtiZW5jaDxpbmRleHRlcm0+V2ViDQotZWRpdG9yczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UaGVyZSBhcmUgc2V2ZXJhbCBlZGl0b3JzIGZvciB1c2UgaW4gdmFyaW91cyBjb250ZXh0cyBmb3IgdmFyaW91cyBmaWxlDQotdHlwZXMuIFRvIGVkaXQgYSBmaWxlIHVzaW5nIGl0cyBkZWZhdWx0IGVkaXRvciwgZG91YmxlLWNsaWNrIG9uIHRoZSBmaWxlIG5hbWUNCi1pbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LCBvciByaWdodC1jbGljayBvbiB0aGUgZmlsZSBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+T3BlbjwvdWljb250cm9sPi4NCi1UaGUgZWRpdG9yIHRoYXQgaXMgbGFzdCB1c2VkIHRvIG9wZW4gYSBmaWxlIGJlY29tZXMgdGhlIGRlZmF1bHQgZm9yIHRoYXQgcGFydGljdWxhcg0KLWZpbGUuIFRvIGVkaXQgdGhlIGZpbGUgd2l0aCBhIGRpZmZlcmVudCBlZGl0b3IsIHJpZ2h0LWNsaWNrIG9uIHRoZSBmaWxlIGFuZA0KLXNlbGVjdCA8dWljb250cm9sPk9wZW4gV2l0aDwvdWljb250cm9sPiB0byBjaG9vc2UgZnJvbSBhIGxpc3Qgb2YgYXZhaWxhYmxlDQotZWRpdG9ycy48L3A+DQotPHA+SW4gdGhlIHdvcmtiZW5jaCwgeW91IGNhbiBhc3NvY2lhdGUgZmlsZS1uYW1lIGV4dGVuc2lvbnMgZm9yIGRpZmZlcmVudA0KLXR5cGVzIG9mIHJlc291cmNlcyB3aXRoIHZhcmlvdXMgZWRpdG9ycy4gQSByZXNvdXJjZSBleHRlbnNpb24gY2FuIGhhdmUgbW9yZQ0KLXRoYW4gb25lIGVkaXRvciBhc3NvY2lhdGVkIHdpdGggaXQ7IHRoZSBsYXN0IGVkaXRvciB1c2VkIGZvciBhIHBhcnRpY3VsYXINCi1leHRlbnNpb24gdHlwZSBpcyBpbmRpY2F0ZWQgYnkgYSBibGFjayBkb3QgYmVmb3JlIGl0IGluIHRoZSA8dWljb250cm9sPk9wZW4NCi1XaXRoPC91aWNvbnRyb2w+IHBvcC11cCBtZW51LiBZb3UgY2FuIGFzc29jaWF0ZSBleHRlbnNpb25zIHRoYXQgYXJlIGtub3duDQotdG8gdGhlIHdvcmtiZW5jaCB3aXRoIGFkZGl0aW9uYWwgZWRpdG9ycywgYnkgdXNpbmcgdGhlIDxiPkZpbGUgQXNzb2NpYXRpb25zPC9iPiBwcmVmZXJlbmNlcw0KLXBhZ2UsIGFjY2Vzc2VkIGJ5IHNlbGVjdGluZyA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5Xb3JrYmVuY2g8L3VpY29udHJvbD48dWljb250cm9sPkZpbGUgQXNzb2NpYXRpb25zPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9wPg0KLTxwPlRoZSBQcm9wZXJ0aWVzIHZpZXcgcHJvdmlkZXMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMgdGhhdCBhcmUgYWR2YW50YWdlb3VzDQotdG8gV2ViIGVkaXRvciB1c2Vycy4gPGRsPjxkbGVudHJ5Pg0KLTxkdD5Qcm9wZXJ0aWVzIHZpZXc8L2R0Pg0KLTxkZD5UaGUgUHJvcGVydGllcyB2aWV3ICg8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlNob3cNCi1WaWV3PC91aWNvbnRyb2w+PHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4pIGNvbnRhaW5zDQotYSBsaXN0IG9mIGF0dHJpYnV0ZXMgYW5kIGVkaXRhYmxlIGF0dHJpYnV0ZSB2YWx1ZXMuIEZvciBleGFtcGxlLCB3aGVuIHlvdQ0KLXNlbGVjdCBhbiBpbWFnZSB0YWcgPHVpY29udHJvbD5pbWc8L3VpY29udHJvbD4gLCB0aGUgd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMNCi1hcHBlYXIgZm9yIGVkaXRpbmcuIEluIGFkZGl0aW9uLCBhbnkgb3RoZXIgYXR0cmlidXRlcyBhbGxvd2VkIGJ5IHRoZSBzdGFuZGFyZA0KLXNwZWNpZmllZCBpbiB0aGUgRE9DVFlQRSBmb3IgdGhlIGZpbGUgKHN1Y2ggYXMgdGhlIEhUTUwgNC4wLjEgRFREKSBhcmUgbGlzdGVkLg0KLVdoZW4geW91IGNsaWNrIHRoZSB2YWx1ZSBjb2x1bW4gb2YgYSBwcm9wZXJ0eSwgeW91IGNhbiBzZWxlY3QgZnJvbSBhbW9uZyB0aGUNCi1saXN0IG9mIGF2YWlsYWJsZSBhdHRyaWJ1dGUgdmFsdWVzLiA8cD5UaGUgcG9wLXVwIG1lbnUgaW4gdGhlIFByb3BlcnRpZXMgdmlldw0KLWVuYWJsZXMgeW91IHRvIHVuZG8sIGN1dCwgY29weSwgcGFzdGUsIGRlbGV0ZSwgYW5kIHNlbGVjdCBhbGwuIFRoZSBvcHRpb25zDQotdGhhdCBhcmUgYXZhaWxhYmxlIGF0IGEgZ2l2ZW4gdGltZSBkZXBlbmRzIG9uIHdoZXJlIHRoZSBjdXJzb3IgaXMgbG9jYXRlZA0KLXdoZW4geW91IHJpZ2h0LWNsaWNrIHRvIGRpc3BsYXkgdGhlIHBvcC11cCBtZW51LiBUbyBzZWUgdGhlIHBvcC11cCBtZW51IHRoYXQNCi1jb250YWlucyB1bmRvLCBjdXQsIGFuZCBzbyBvbiwgdGhlIHByb3BlcnR5IHZhbHVlIGZpZWxkIG11c3QgYmUgYWN0aXZlLiAoVGhpcw0KLWlzIGFjY29tcGxpc2hlZCBieSBzZWxlY3RpbmcgdGhlIHByb3BlcnR5IGFuZCB0aGVuIHNlbGVjdGluZyBpdHMgdmFsdWUuKSBPdGhlcndpc2UsDQotdGhlIHBvcC11cCBtZW51IHdpbGwgY29udGFpbiBkaWZmZXJlbnQgb3B0aW9ucy48L3A+IDxwPlVzZSB0aGUgPHVpY29udHJvbD5SZXN0b3JlDQotRGVmYXVsdCBWYWx1ZTwvdWljb250cm9sPiBidXR0b24gdG8gY2hhbmdlIGFueSB2YWx1ZSBiYWNrIHRvIHRoZSBkZWZhdWx0IHNldHRpbmcuPC9wPiA8cD5BZnRlcg0KLXlvdSBhcmUgaW4gdGhlIFByb3BlcnRpZXMgdmlldywgeW91IGNhbiBtb2RpZnkgb3RoZXIgcHJvcGVydHkgdmFsdWVzIGZvciBzcGVjaWZpYw0KLXRhZ3MuIFRvIGVkaXQgYW5vdGhlciB0YWcgdXNpbmcgdGhlIFByb3BlcnRpZXMgdmlldywgbW92ZSB0aGUgY3Vyc29yIHdpdGhpbg0KLXRoZSBlZGl0aW5nIGFyZWEgb2YgdGhlIFNvdXJjZSBwYWdlIG9yIERlc2lnbiBwYWdlIHRvIHRoZSB0YWcgeW91IHdhbnQgdG8NCi1lZGl0LiBUaGUgYXBwcm9wcmlhdGUgcHJvcGVydGllcyBhbmQgdmFsdWVzIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIFByb3BlcnRpZXMNCi12aWV3LjwvcD48L2RkPg0KLTwvZGxlbnRyeT48L2RsPjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3dlZHR2dy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2VkdHZ3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MTFmNTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2VkdHZ3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXb3JrYmVuY2ggaW50ZWdyYXRpb24gd2l0aCBXZWIgZWRpdG9ycyIgLz4KLTxtZXRhIGNvbnRlbnQ9IndvcmtiZW5jaCwgV2ViIGVkaXRvcnMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJ3b3JrYmVuY2gsIFdlYiBlZGl0b3JzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjd3dlZHR2dyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldvcmtiZW5jaCBpbnRlZ3JhdGlvbiB3aXRoIFdlYiBlZGl0b3JzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd3dlZHR2dyI+PGEgbmFtZT0iY3d3ZWR0dnciPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldvcmtiZW5jaCBpbnRlZ3JhdGlvbiB3aXRoIFdlYiBlZGl0b3JzPC9oMT4KLQotCi08ZGl2PgotPHA+VGhlcmUgYXJlIHNldmVyYWwgZWRpdG9ycyBmb3IgdXNlIGluIHZhcmlvdXMgY29udGV4dHMgZm9yIHZhcmlvdXMgZmlsZQotdHlwZXMuIFRvIGVkaXQgYSBmaWxlIHVzaW5nIGl0cyBkZWZhdWx0IGVkaXRvciwgZG91YmxlLWNsaWNrIG9uIHRoZSBmaWxlIG5hbWUKLWluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIG9yIHJpZ2h0LWNsaWNrIG9uIHRoZSBmaWxlIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3Blbjwvc3Bhbj4uCi1UaGUgZWRpdG9yIHRoYXQgaXMgbGFzdCB1c2VkIHRvIG9wZW4gYSBmaWxlIGJlY29tZXMgdGhlIGRlZmF1bHQgZm9yIHRoYXQgcGFydGljdWxhcgotZmlsZS4gVG8gZWRpdCB0aGUgZmlsZSB3aXRoIGEgZGlmZmVyZW50IGVkaXRvciwgcmlnaHQtY2xpY2sgb24gdGhlIGZpbGUgYW5kCi1zZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3BlbiBXaXRoPC9zcGFuPiB0byBjaG9vc2UgZnJvbSBhIGxpc3Qgb2YgYXZhaWxhYmxlCi1lZGl0b3JzLjwvcD4KLQotPHA+SW4gdGhlIHdvcmtiZW5jaCwgeW91IGNhbiBhc3NvY2lhdGUgZmlsZS1uYW1lIGV4dGVuc2lvbnMgZm9yIGRpZmZlcmVudAotdHlwZXMgb2YgcmVzb3VyY2VzIHdpdGggdmFyaW91cyBlZGl0b3JzLiBBIHJlc291cmNlIGV4dGVuc2lvbiBjYW4gaGF2ZSBtb3JlCi10aGFuIG9uZSBlZGl0b3IgYXNzb2NpYXRlZCB3aXRoIGl0OyB0aGUgbGFzdCBlZGl0b3IgdXNlZCBmb3IgYSBwYXJ0aWN1bGFyCi1leHRlbnNpb24gdHlwZSBpcyBpbmRpY2F0ZWQgYnkgYSBibGFjayBkb3QgYmVmb3JlIGl0IGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PcGVuCi1XaXRoPC9zcGFuPiBwb3AtdXAgbWVudS4gWW91IGNhbiBhc3NvY2lhdGUgZXh0ZW5zaW9ucyB0aGF0IGFyZSBrbm93bgotdG8gdGhlIHdvcmtiZW5jaCB3aXRoIGFkZGl0aW9uYWwgZWRpdG9ycywgYnkgdXNpbmcgdGhlIDxzdHJvbmc+RmlsZSBBc3NvY2lhdGlvbnM8L3N0cm9uZz4gcHJlZmVyZW5jZXMKLXBhZ2UsIGFjY2Vzc2VkIGJ5IHNlbGVjdGluZyA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlIEFzc29jaWF0aW9uczwvc3Bhbj48L3NwYW4+LjwvcD4KLQotPGRpdiBjbGFzcz0icCI+VGhlIFByb3BlcnRpZXMgdmlldyBwcm92aWRlcyBnZW5lcmFsIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBhZHZhbnRhZ2VvdXMKLXRvIFdlYiBlZGl0b3IgdXNlcnMuIDxkbD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5Qcm9wZXJ0aWVzIHZpZXc8L2R0PgotCi08ZGQ+VGhlIFByb3BlcnRpZXMgdmlldyAoPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2hvdwotVmlldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPjwvc3Bhbj4pIGNvbnRhaW5zCi1hIGxpc3Qgb2YgYXR0cmlidXRlcyBhbmQgZWRpdGFibGUgYXR0cmlidXRlIHZhbHVlcy4gRm9yIGV4YW1wbGUsIHdoZW4geW91Ci1zZWxlY3QgYW4gaW1hZ2UgdGFnIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmltZzwvc3Bhbj4gLCB0aGUgd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMKLWFwcGVhciBmb3IgZWRpdGluZy4gSW4gYWRkaXRpb24sIGFueSBvdGhlciBhdHRyaWJ1dGVzIGFsbG93ZWQgYnkgdGhlIHN0YW5kYXJkCi1zcGVjaWZpZWQgaW4gdGhlIERPQ1RZUEUgZm9yIHRoZSBmaWxlIChzdWNoIGFzIHRoZSBIVE1MIDQuMC4xIERURCkgYXJlIGxpc3RlZC4KLVdoZW4geW91IGNsaWNrIHRoZSB2YWx1ZSBjb2x1bW4gb2YgYSBwcm9wZXJ0eSwgeW91IGNhbiBzZWxlY3QgZnJvbSBhbW9uZyB0aGUKLWxpc3Qgb2YgYXZhaWxhYmxlIGF0dHJpYnV0ZSB2YWx1ZXMuIDxwPlRoZSBwb3AtdXAgbWVudSBpbiB0aGUgUHJvcGVydGllcyB2aWV3Ci1lbmFibGVzIHlvdSB0byB1bmRvLCBjdXQsIGNvcHksIHBhc3RlLCBkZWxldGUsIGFuZCBzZWxlY3QgYWxsLiBUaGUgb3B0aW9ucwotdGhhdCBhcmUgYXZhaWxhYmxlIGF0IGEgZ2l2ZW4gdGltZSBkZXBlbmRzIG9uIHdoZXJlIHRoZSBjdXJzb3IgaXMgbG9jYXRlZAotd2hlbiB5b3UgcmlnaHQtY2xpY2sgdG8gZGlzcGxheSB0aGUgcG9wLXVwIG1lbnUuIFRvIHNlZSB0aGUgcG9wLXVwIG1lbnUgdGhhdAotY29udGFpbnMgdW5kbywgY3V0LCBhbmQgc28gb24sIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmaWVsZCBtdXN0IGJlIGFjdGl2ZS4gKFRoaXMKLWlzIGFjY29tcGxpc2hlZCBieSBzZWxlY3RpbmcgdGhlIHByb3BlcnR5IGFuZCB0aGVuIHNlbGVjdGluZyBpdHMgdmFsdWUuKSBPdGhlcndpc2UsCi10aGUgcG9wLXVwIG1lbnUgd2lsbCBjb250YWluIGRpZmZlcmVudCBvcHRpb25zLjwvcD4KLSA8cD5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlc3RvcmUKLURlZmF1bHQgVmFsdWU8L3NwYW4+IGJ1dHRvbiB0byBjaGFuZ2UgYW55IHZhbHVlIGJhY2sgdG8gdGhlIGRlZmF1bHQgc2V0dGluZy48L3A+Ci0gPHA+QWZ0ZXIKLXlvdSBhcmUgaW4gdGhlIFByb3BlcnRpZXMgdmlldywgeW91IGNhbiBtb2RpZnkgb3RoZXIgcHJvcGVydHkgdmFsdWVzIGZvciBzcGVjaWZpYwotdGFncy4gVG8gZWRpdCBhbm90aGVyIHRhZyB1c2luZyB0aGUgUHJvcGVydGllcyB2aWV3LCBtb3ZlIHRoZSBjdXJzb3Igd2l0aGluCi10aGUgZWRpdGluZyBhcmVhIG9mIHRoZSBTb3VyY2UgcGFnZSBvciBEZXNpZ24gcGFnZSB0byB0aGUgdGFnIHlvdSB3YW50IHRvCi1lZGl0LiBUaGUgYXBwcm9wcmlhdGUgcHJvcGVydGllcyBhbmQgdmFsdWVzIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIFByb3BlcnRpZXMKLXZpZXcuPC9wPgotPC9kZD4KLQotPC9kbD4KLTwvZGl2PgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY2hneGR0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjaGd4ZHQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1YzNmNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjaGd4ZHQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGpjaGd4ZHQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNwZWNpZnlpbmcgYW4gaW1wbGljaXQgZG9jdW1lbnQgdHlwZSBmb3IgYW4gSFRNTCwgWEhUTUwsIG9yIEpTUCBmcmFnbWVudDwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+RE9DVFlQRSBkZWNsYXJhdGlvbnM8aW5kZXh0ZXJtPmltcGxpY2l0IGZvciBmcmFnbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPmRvY3VtZW50IHR5cGVzPGluZGV4dGVybT5pbXBsaWNpdCBmb3IgZnJhZ21lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5IVE1MIGZyYWdtZW50czxpbmRleHRlcm0+aW1wbGljaXQgZG9jdW1lbnQgdHlwZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPkpTUCBmcmFnbWVudHM8aW5kZXh0ZXJtPmltcGxpY2l0IGRvY3VtZW50IHR5cGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YSFRNTCBmcmFnbWVudHM8aW5kZXh0ZXJtPmltcGxpY2l0IGRvY3VtZW50IHR5cGUgZm9yIGZyYWdtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPkFuIDxpPmltcGxpY2l0PC9pPiBkb2N1bWVudCB0eXBlIGlzIHVzZWQgZm9yIGNvbnRlbnQgYXNzaXN0IChDVFJMK1NwYWNlYmFyKSwNCi10aGUgUHJvcGVydGllcyB2aWV3LCBhbmQgb3RoZXIgZWRpdGluZyBjb250ZXh0cyB3aGVuIG5vIERPQ1RZUEUgZGVjbGFyYXRpb24NCi1pcyBzcGVjaWZpZWQgaW4gYW4gSFRNTCwgWEhUTUwsIG9yIEpTUCBmaWxlLiBUeXBpY2FsbHksIHRoaXMgZmVhdHVyZSBpcyB1c2VkDQotZm9yIGEgZnJhZ21lbnQgKHBhcnRpYWwgZG9jdW1lbnQpIHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIG90aGVyIHBhZ2VzIHVzaW5nDQotSlNQIGluY2x1ZGUgb3Igc2VydmVyLXNpZGUgaW5jbHVkZS48L3A+PHA+VG8gYXNzaWduIGFuIGltcGxpY2l0IGRvY3VtZW50IHR5cGUNCi10byBhbiBIVE1MLCBYSFRNTCwgb3IgSlNQIGZyYWdtZW50LCBkbyB0aGUgZm9sbG93aW5nOiA8L3A+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5Gcm9tIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIHNlbGVjdCB0aGUgSFRNTCwgWEhUTUwsIG9yIEpTUA0KLWZyYWdtZW50LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCA8cGg+PHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+PC9waD4gZnJvbSB0aGUgZmlsZSdzDQotcG9wLXVwIG1lbnUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+V2ViIENvbnRlbnQgU2V0dGluZ3M8L3VpY29udHJvbD4gcGFnZSwgc2VsZWN0DQotdGhlIGRlc2lyZWQgRE9DVFlQRSBmcm9tIHRoZSA8cGg+PHVpY29udHJvbD5Eb2N1bWVudCB0eXBlPC91aWNvbnRyb2w+PC9waD4gZHJvcC1kb3duDQotbGlzdC48L2NtZD48aW5mbz48cD5UaGUgPHBoPjx1aWNvbnRyb2w+UHJvcGVydGllczwvdWljb250cm9sPjwvcGg+IGRpYWxvZw0KLWZvciBXZWIgcHJvamVjdHMgYWxzbyBpbmNsdWRlcyBhbiA8cGg+PHVpY29udHJvbD5XZWIgQ29udGVudCBTZXR0aW5nczwvdWljb250cm9sPjwvcGg+IHBhZ2UsDQotd2hlcmUgeW91IGNhbiBzcGVjaWZ5IHByb2plY3QtZGVmYXVsdCBIVE1MIGRvY3VtZW50IHR5cGUuIFRoaXMgc2V0dGluZyB3aWxsDQotYmUgdXNlZCBpZiBubyBET0NUWVBFIGRlY2xhcmF0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgZmlsZSwgYW5kIG5vIGRlZmF1bHQNCi1kb2N1bWVudCB0eXBlIGlzIHNwZWNpZmllZCBpbiB0aGUgPHBoPjx1aWNvbnRyb2w+V2ViIENvbnRlbnQgU2V0dGluZ3M8L3VpY29udHJvbD48L3BoPiBwYWdlDQotb24gdGhlIDxwaD48dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD48L3BoPiBkaWFsb2cgZm9yIHRoZSBmaWxlLjwvcD48L2luZm8+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY2hneGR0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjaGd4ZHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjYmY5YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjaGd4ZHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNwZWNpZnlpbmcgYW4gaW1wbGljaXQgZG9jdW1lbnQgdHlwZSBmb3IgYW4gSFRNTCwgWEhUTUwsIG9yIEpTUCBmcmFnbWVudCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zLCBpbXBsaWNpdCBmb3IgZnJhZ21lbnRzLCBkb2N1bWVudCB0eXBlcywgSFRNTCBmcmFnbWVudHMsIGltcGxpY2l0IGRvY3VtZW50IHR5cGVzLCBKU1AgZnJhZ21lbnRzLCBYSFRNTCBmcmFnbWVudHMsIGltcGxpY2l0IGRvY3VtZW50IHR5cGUgZm9yIGZyYWdtZW50cyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zLCBpbXBsaWNpdCBmb3IgZnJhZ21lbnRzLCBkb2N1bWVudCB0eXBlcywgSFRNTCBmcmFnbWVudHMsIGltcGxpY2l0IGRvY3VtZW50IHR5cGVzLCBKU1AgZnJhZ21lbnRzLCBYSFRNTCBmcmFnbWVudHMsIGltcGxpY2l0IGRvY3VtZW50IHR5cGUgZm9yIGZyYWdtZW50cyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGpjaGd4ZHQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TcGVjaWZ5aW5nIGFuIGltcGxpY2l0IGRvY3VtZW50IHR5cGUgZm9yIGFuIEhUTUwsIFhIVE1MLCBvciBKU1AgZnJhZ21lbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqY2hneGR0Ij48YSBuYW1lPSJ0amNoZ3hkdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U3BlY2lmeWluZyBhbiBpbXBsaWNpdCBkb2N1bWVudCB0eXBlIGZvciBhbiBIVE1MLCBYSFRNTCwgb3IgSlNQIGZyYWdtZW50PC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPkFuIDxlbT5pbXBsaWNpdDwvZW0+IGRvY3VtZW50IHR5cGUgaXMgdXNlZCBmb3IgY29udGVudCBhc3Npc3QgKENUUkwrU3BhY2ViYXIpLAotdGhlIFByb3BlcnRpZXMgdmlldywgYW5kIG90aGVyIGVkaXRpbmcgY29udGV4dHMgd2hlbiBubyBET0NUWVBFIGRlY2xhcmF0aW9uCi1pcyBzcGVjaWZpZWQgaW4gYW4gSFRNTCwgWEhUTUwsIG9yIEpTUCBmaWxlLiBUeXBpY2FsbHksIHRoaXMgZmVhdHVyZSBpcyB1c2VkCi1mb3IgYSBmcmFnbWVudCAocGFydGlhbCBkb2N1bWVudCkgdGhhdCBjYW4gYmUgaW5jbHVkZWQgaW4gb3RoZXIgcGFnZXMgdXNpbmcKLUpTUCBpbmNsdWRlIG9yIHNlcnZlci1zaWRlIGluY2x1ZGUuPC9wPgotPHA+VG8gYXNzaWduIGFuIGltcGxpY2l0IGRvY3VtZW50IHR5cGUKLXRvIGFuIEhUTUwsIFhIVE1MLCBvciBKU1AgZnJhZ21lbnQsIGRvIHRoZSBmb2xsb3dpbmc6IDwvcD4KLSA8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIHNlbGVjdCB0aGUgSFRNTCwgWEhUTUwsIG9yIEpTUAotZnJhZ21lbnQuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+PC9zcGFuPiBmcm9tIHRoZSBmaWxlJ3MKLXBvcC11cCBtZW51Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgQ29udGVudCBTZXR0aW5nczwvc3Bhbj4gcGFnZSwgc2VsZWN0Ci10aGUgZGVzaXJlZCBET0NUWVBFIGZyb20gdGhlIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50IHR5cGU8L3NwYW4+PC9zcGFuPiBkcm9wLWRvd24KLWxpc3QuPC9zcGFuPiA8cD5UaGUgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj48L3NwYW4+IGRpYWxvZwotZm9yIFdlYiBwcm9qZWN0cyBhbHNvIGluY2x1ZGVzIGFuIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBDb250ZW50IFNldHRpbmdzPC9zcGFuPjwvc3Bhbj4gcGFnZSwKLXdoZXJlIHlvdSBjYW4gc3BlY2lmeSBwcm9qZWN0LWRlZmF1bHQgSFRNTCBkb2N1bWVudCB0eXBlLiBUaGlzIHNldHRpbmcgd2lsbAotYmUgdXNlZCBpZiBubyBET0NUWVBFIGRlY2xhcmF0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgZmlsZSwgYW5kIG5vIGRlZmF1bHQKLWRvY3VtZW50IHR5cGUgaXMgc3BlY2lmaWVkIGluIHRoZSA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgQ29udGVudCBTZXR0aW5nczwvc3Bhbj48L3NwYW4+IHBhZ2UKLW9uIHRoZSA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPjwvc3Bhbj4gZGlhbG9nIGZvciB0aGUgZmlsZS48L3A+Ci0KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVodG0uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWh0bS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTZlZmUxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWh0bS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0amNyZWh0bSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgSFRNTCBhbmQgWEhUTUwgZmlsZXMgYW5kIGZyYW1lc2V0czwvdGl0bGU+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIHVzZSB0aGUgTmV3IEhUTUwgRmlsZSB3aXphcmQgdG8gY3JlYXRlIEhUTUwgYW5kIFhIVE1MIGZpbGVzDQotYW5kIGZyYW1lc2V0cy4gPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPg0KLTxpbmRleHRlcm0+ZnJhbWVzZXRzPGluZGV4dGVybT5jcmVhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+SFRNTDxpbmRleHRlcm0+Y3JlYXRpbmcgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPldNTDxpbmRleHRlcm0+Y3JlYXRpbmcgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhIVE1MPGluZGV4dGVybT5jcmVhdGluZyBmaWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DcmVhdGUgYSBzdGF0aWMgb3IgYSBkeW5hbWljIFdlYiBwcm9qZWN0IGlmIHlvdSBoYXZlIG5vdCBhbHJlYWR5DQotZG9uZSBzby48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciwgZXhwYW5kIHlvdXIgcHJvamVjdCBhbmQgcmlnaHQgY2xpY2sgb24NCi15b3VyIFdlYkNvbnRlbnQgZm9sZGVyIG9yIG9uIGEgc3ViZm9sZGVyIHVuZGVyIFdlYkNvbnRlbnQuICA8L2NtZD48aW5mbz5Ob3RlDQotdGhhdCBpZiB5b3UgY2hvb3NlIGFueSBvdGhlciBmb2xkZXIgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBIVE1MIGZpbGUsIHRoZW4NCi1pdCB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgV0FSIGZpbGUgdGhhdCBpcyBkZXBsb3llZCB0byB0aGUgc2VydmVyLiBJbg0KLWFkZGl0aW9uLCBsaW5rIHZhbGlkYXRpb24gd2lsbCBub3QgZW5jb21wYXNzIGZpbGVzIHRoYXQgYXJlIG5vdCB1bmRlciB0aGUNCi1XZWJDb250ZW50IGZvbGRlci48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgY29udGV4dCBtZW51LCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5PdGhlcjwvdWljb250cm9sPjx1aWNvbnRyb2w+V2ViPC91aWNvbnRyb2w+PHVpY29udHJvbD5IVE1MPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4uPC9jbWQ+PHN0ZXByZXN1bHQ+VGhlIE5ldyBIVE1MIFBhZ2Ugd2luZG93IGFwcGVhcnMgd2l0aCB5b3VyDQotZm9sZGVyIHNlbGVjdGVkPC9zdGVwcmVzdWx0Pjwvc3RlcD4NCi08c3RlcD48Y21kPlR5cGUgYSBmaWxlIG5hbWUgaW50byB0aGUgRmlsZSBuYW1lIGZpZWxkLCBtYWtpbmcgc3VyZSB5b3UgaW5jbHVkZQ0KLWFuIGh0bWwgZXh0ZW5zaW9uIChodG1sLCBodG0sIHhodG1sLCBodHBsLCB3bWwsIHNodG1sLCBvciBzaHRtKSBpbiB0aGUgZmlsZQ0KLW5hbWUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+IFlvdSBoYXZlIHNldmVyYWwgb3B0aW9ucyBmb3IgcHJvY2VlZGluZzo8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPlRvIGFjY2VwdCB0aGUgZGVmYXVsdHMgYXNzb2NpYXRlZCB3aXRoIGEgbmV3IEhUTUwgZmlsZSwgc2VsZWN0IDx1aWNvbnRyb2w+RmluaXNoLjwvdWljb250cm9sPjwvY2hvaWNlPg0KLTxjaG9pY2U+IFRvIHVzZSBhIHRlbXBsYXRlIGZpbGUgZm9yIHRoZSBpbml0aWFsIGNvbnRlbnQgb2YgeW91ciBIVE1MIHBhZ2UsDQotc2VsZWN0IDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi4gVGhlIFNlbGVjdCBIVE1MIFRlbXBsYXRlIHdpbmRvdyBhcHBlYXJzLg0KLVNlbGVjdCB0aGUgPHVpY29udHJvbD5Vc2UgSFRNTCBUZW1wbGF0ZTwvdWljb250cm9sPiBjaGVjayBib3gsIGFuZCB0aGVuIHNlbGVjdA0KLW9uZSBvZiB0aGUgc2FtcGxlIHRlbXBsYXRlcy4gWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgPHVpY29udHJvbD5IVE1MIFRlbXBsYXRlczwvdWljb250cm9sPiBsaW5rDQotdG8gYWRkIG9yIHJlbW92ZSBIVE1MIHRlbXBsYXRlcyB0byB5b3VyIGxpc3Qgb2YgdGVtcGxhdGVzLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVodG0uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWh0bS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzVlOGY4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWh0bS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgSFRNTCBhbmQgWEhUTUwgZmlsZXMgYW5kIGZyYW1lc2V0cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHVzZSB0aGUgTmV3IEhUTUwgRmlsZSB3aXphcmQgdG8gY3JlYXRlIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gdXNlIHRoZSBOZXcgSFRNTCBGaWxlIHdpemFyZCB0byBjcmVhdGUgSFRNTCBhbmQgWEhUTUwgZmlsZXMgYW5kIGZyYW1lc2V0cy4iIC8+Ci08bWV0YSBjb250ZW50PSJmcmFtZXNldHMsIGNyZWF0aW5nLCBIVE1MLCBjcmVhdGluZyBmaWxlcywgV01MLCBYSFRNTCIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImZyYW1lc2V0cywgY3JlYXRpbmcsIEhUTUwsIGNyZWF0aW5nIGZpbGVzLCBXTUwsIFhIVE1MIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0amNyZWh0bSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqY3JlaHRtIj48YSBuYW1lPSJ0amNyZWh0bSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgSFRNTCBhbmQgWEhUTUwgZmlsZXMgYW5kIGZyYW1lc2V0czwvaDE+Ci0KLQotCi08ZGl2PjxwPllvdSBjYW4gdXNlIHRoZSBOZXcgSFRNTCBGaWxlIHdpemFyZCB0byBjcmVhdGUgSFRNTCBhbmQgWEhUTUwgZmlsZXMKLWFuZCBmcmFtZXNldHMuIDwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNyZWF0ZSBhIHN0YXRpYyBvciBhIGR5bmFtaWMgV2ViIHByb2plY3QgaWYgeW91IGhhdmUgbm90IGFscmVhZHkKLWRvbmUgc28uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIsIGV4cGFuZCB5b3VyIHByb2plY3QgYW5kIHJpZ2h0IGNsaWNrIG9uCi15b3VyIFdlYkNvbnRlbnQgZm9sZGVyIG9yIG9uIGEgc3ViZm9sZGVyIHVuZGVyIFdlYkNvbnRlbnQuICA8L3NwYW4+IE5vdGUKLXRoYXQgaWYgeW91IGNob29zZSBhbnkgb3RoZXIgZm9sZGVyIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgSFRNTCBmaWxlLCB0aGVuCi1pdCB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgV0FSIGZpbGUgdGhhdCBpcyBkZXBsb3llZCB0byB0aGUgc2VydmVyLiBJbgotYWRkaXRpb24sIGxpbmsgdmFsaWRhdGlvbiB3aWxsIG5vdCBlbmNvbXBhc3MgZmlsZXMgdGhhdCBhcmUgbm90IHVuZGVyIHRoZQotV2ViQ29udGVudCBmb2xkZXIuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSBjb250ZXh0IG1lbnUsIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk90aGVyPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYjwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVE1MPC9zcGFuPgotPC9zcGFuPi48L3NwYW4+IFRoZSBOZXcgSFRNTCBQYWdlIHdpbmRvdyBhcHBlYXJzIHdpdGggeW91cgotZm9sZGVyIHNlbGVjdGVkPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgZmlsZSBuYW1lIGludG8gdGhlIEZpbGUgbmFtZSBmaWVsZCwgbWFraW5nIHN1cmUgeW91IGluY2x1ZGUKLWFuIGh0bWwgZXh0ZW5zaW9uIChodG1sLCBodG0sIHhodG1sLCBodHBsLCB3bWwsIHNodG1sLCBvciBzaHRtKSBpbiB0aGUgZmlsZQotbmFtZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4gWW91IGhhdmUgc2V2ZXJhbCBvcHRpb25zIGZvciBwcm9jZWVkaW5nOjwvc3Bhbj4KLTx1bD4KLTxsaT5UbyBhY2NlcHQgdGhlIGRlZmF1bHRzIGFzc29jaWF0ZWQgd2l0aCBhIG5ldyBIVE1MIGZpbGUsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2guPC9zcGFuPjwvbGk+Ci0KLTxsaT4gVG8gdXNlIGEgdGVtcGxhdGUgZmlsZSBmb3IgdGhlIGluaXRpYWwgY29udGVudCBvZiB5b3VyIEhUTUwgcGFnZSwKLXNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi4gVGhlIFNlbGVjdCBIVE1MIFRlbXBsYXRlIHdpbmRvdyBhcHBlYXJzLgotU2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Vc2UgSFRNTCBUZW1wbGF0ZTwvc3Bhbj4gY2hlY2sgYm94LCBhbmQgdGhlbiBzZWxlY3QKLW9uZSBvZiB0aGUgc2FtcGxlIHRlbXBsYXRlcy4gWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRNTCBUZW1wbGF0ZXM8L3NwYW4+IGxpbmsKLXRvIGFkZCBvciByZW1vdmUgSFRNTCB0ZW1wbGF0ZXMgdG8geW91ciBsaXN0IG9mIHRlbXBsYXRlcy48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdiAvPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY3JlanNwLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVqc3AuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3NWIzMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVqc3AuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGpjcmVqc3AiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkpTUCBmaWxlczxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPk1vc3QgdHlwZXMgb2YgSlNQIGZpbGVzIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSBOZXcgSlNQIEZpbGUNCi13aXphcmQuIFRvIGNyZWF0ZSBhIGJhc2ljIEpTUCBmaWxlIHVzaW5nIHRoZSB3aXphcmQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcNCi1zdGVwczogPC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DcmVhdGUgYSBkeW5hbWljIFdlYiBwcm9qZWN0IGlmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IGRvbmUgc28uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIsIGV4cGFuZCB5b3VyIHByb2plY3QgYW5kIHJpZ2h0IGNsaWNrIG9uDQoteW91ciBXZWJDb250ZW50IGZvbGRlciBvciBvbiBhIHN1YmZvbGRlciB1bmRlciBXZWJDb250ZW50LiAgTm90ZSB0aGF0IGlmIHlvdQ0KLWNob29zZSBhbnkgb3RoZXIgZm9sZGVyIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgSlNQLCB0aGVuIGl0IHdpbGwgbm90IGJlIGluY2x1ZGVkDQotaW4gdGhlIFdBUiBmaWxlIHRoYXQgaXMgZGVwbG95ZWQgdG8gdGhlIHNlcnZlci4gSW4gYWRkaXRpb24sIGxpbmsgdmFsaWRhdGlvbg0KLXdpbGwgbm90IGVuY29tcGFzcyBmaWxlcyB0aGF0IGFyZSBub3QgdW5kZXIgdGhlIFdlYkNvbnRlbnQgZm9sZGVyLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkZyb20gdGhlIGNvbnRleHQgbWVudSwgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPk5ldzwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+SlNQPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PHN0ZXByZXN1bHQ+VGhlIE5ldyBKYXZhIFNlcnZlcg0KLVBhZ2Ugd2luZG93IGFwcGVhcnMgd2l0aCB5b3VyIGZvbGRlciBzZWxlY3RlZDwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UeXBlIGEgZmlsZSBuYW1lIGludG8gdGhlIEZpbGUgbmFtZSBmaWVsZCwgbWFraW5nIHN1cmUgeW91IGluY2x1ZGUNCi10aGUganNwIGV4dGVuc2lvbiAoanNwLCBqc3YsIGp0cGwsIG9yIGpzcHgpIGluIHRoZSBmaWxlIG5hbWUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+IFlvdSBoYXZlIHNldmVyYWwgb3B0aW9ucyBmb3IgcHJvY2VlZGluZzo8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPlRvIGFjY2VwdCB0aGUgZGVmYXVsdHMgYXNzb2NpYXRlZCB3aXRoIGEgbmV3IEpTUCBmaWxlLCBzZWxlY3QgPHVpY29udHJvbD5GaW5pc2guPC91aWNvbnRyb2w+PC9jaG9pY2U+DQotPGNob2ljZT5UbyBsaW5rIHRvIGEgZmlsZSBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIHNwZWNpZnkgcGF0aCB2YXJpYWJsZXMsIHNlbGVjdCA8dWljb250cm9sPkFkdmFuY2VkPC91aWNvbnRyb2w+IGFuZA0KLXRoZW4gbWFrZSB5b3VyIHNlbGVjdGlvbnMgdXNpbmcgdGhlIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IGFuZCA8dWljb250cm9sPlZhcmlhYmxlczwvdWljb250cm9sPiBidXR0b25zLiA8L2Nob2ljZT4NCi08Y2hvaWNlPiBUbyB1c2UgYSB0ZW1wbGF0ZSBmaWxlIGZvciB0aGUgaW5pdGlhbCBjb250ZW50IG9mIHlvdXIgSlNQIHBhZ2UsDQotc2VsZWN0IDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi4gVGhlIFNlbGVjdCBKU1AgVGVtcGxhdGUgd2luZG93IGFwcGVhcnMuDQotU2VsZWN0IHRoZSA8dWljb250cm9sPlVzZSBKU1AgVGVtcGxhdGU8L3VpY29udHJvbD4gY2hlY2sgYm94LCBhbmQgdGhlbiBzZWxlY3QNCi1vbmUgb2YgdGhlIHNhbXBsZSB0ZW1wbGF0ZXMuIFlvdSBjYW4gYWxzbyBzZWxlY3QgdGhlIDx1aWNvbnRyb2w+SlNQIFRlbXBsYXRlczwvdWljb250cm9sPiBsaW5rDQotdG8gYWRkIG9yIHJlbW92ZSBKU1AgdGVtcGxhdGVzIHRvIHlvdXIgbGlzdCBvZiB0ZW1wbGF0ZXMuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWpzcC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY3JlanNwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMzdmNGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY3JlanNwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIiAvPgotPG1ldGEgY29udGVudD0iSlNQIGZpbGVzLCBjcmVhdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkpTUCBmaWxlcywgY3JlYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdjcmVwcmouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2NwZGpzcHMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0amNyZWpzcCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqY3JlanNwIj48YSBuYW1lPSJ0amNyZWpzcCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlczwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPk1vc3QgdHlwZXMgb2YgSlNQIGZpbGVzIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSBOZXcgSlNQIEZpbGUKLXdpemFyZC4gVG8gY3JlYXRlIGEgYmFzaWMgSlNQIGZpbGUgdXNpbmcgdGhlIHdpemFyZCwgY29tcGxldGUgdGhlIGZvbGxvd2luZwotc3RlcHM6IDwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNyZWF0ZSBhIGR5bmFtaWMgV2ViIHByb2plY3QgaWYgeW91IGhhdmUgbm90IGFscmVhZHkgZG9uZSBzby48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyLCBleHBhbmQgeW91ciBwcm9qZWN0IGFuZCByaWdodCBjbGljayBvbgoteW91ciBXZWJDb250ZW50IGZvbGRlciBvciBvbiBhIHN1YmZvbGRlciB1bmRlciBXZWJDb250ZW50LiAgTm90ZSB0aGF0IGlmIHlvdQotY2hvb3NlIGFueSBvdGhlciBmb2xkZXIgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBKU1AsIHRoZW4gaXQgd2lsbCBub3QgYmUgaW5jbHVkZWQKLWluIHRoZSBXQVIgZmlsZSB0aGF0IGlzIGRlcGxveWVkIHRvIHRoZSBzZXJ2ZXIuIEluIGFkZGl0aW9uLCBsaW5rIHZhbGlkYXRpb24KLXdpbGwgbm90IGVuY29tcGFzcyBmaWxlcyB0aGF0IGFyZSBub3QgdW5kZXIgdGhlIFdlYkNvbnRlbnQgZm9sZGVyLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gdGhlIGNvbnRleHQgbWVudSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SlNQPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPiBUaGUgTmV3IEphdmEgU2VydmVyCi1QYWdlIHdpbmRvdyBhcHBlYXJzIHdpdGggeW91ciBmb2xkZXIgc2VsZWN0ZWQ8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgYSBmaWxlIG5hbWUgaW50byB0aGUgRmlsZSBuYW1lIGZpZWxkLCBtYWtpbmcgc3VyZSB5b3UgaW5jbHVkZQotdGhlIGpzcCBleHRlbnNpb24gKGpzcCwganN2LCBqdHBsLCBvciBqc3B4KSBpbiB0aGUgZmlsZSBuYW1lLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPiBZb3UgaGF2ZSBzZXZlcmFsIG9wdGlvbnMgZm9yIHByb2NlZWRpbmc6PC9zcGFuPgotPHVsPgotPGxpPlRvIGFjY2VwdCB0aGUgZGVmYXVsdHMgYXNzb2NpYXRlZCB3aXRoIGEgbmV3IEpTUCBmaWxlLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoLjwvc3Bhbj48L2xpPgotCi08bGk+VG8gbGluayB0byBhIGZpbGUgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBzcGVjaWZ5IHBhdGggdmFyaWFibGVzLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWR2YW5jZWQ8L3NwYW4+IGFuZAotdGhlbiBtYWtlIHlvdXIgc2VsZWN0aW9ucyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFyaWFibGVzPC9zcGFuPiBidXR0b25zLiA8L2xpPgotCi08bGk+IFRvIHVzZSBhIHRlbXBsYXRlIGZpbGUgZm9yIHRoZSBpbml0aWFsIGNvbnRlbnQgb2YgeW91ciBKU1AgcGFnZSwKLXNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi4gVGhlIFNlbGVjdCBKU1AgVGVtcGxhdGUgd2luZG93IGFwcGVhcnMuCi1TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVzZSBKU1AgVGVtcGxhdGU8L3NwYW4+IGNoZWNrIGJveCwgYW5kIHRoZW4gc2VsZWN0Ci1vbmUgb2YgdGhlIHNhbXBsZSB0ZW1wbGF0ZXMuIFlvdSBjYW4gYWxzbyBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkpTUCBUZW1wbGF0ZXM8L3NwYW4+IGxpbmsKLXRvIGFkZCBvciByZW1vdmUgSlNQIHRlbXBsYXRlcyB0byB5b3VyIGxpc3Qgb2YgdGVtcGxhdGVzLjwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2NwZGpzcHMuaHRtbCI+SmF2YVNlcnZlciBQYWdlcyAoSlNQKSB0ZWNobm9sb2d5PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2NyZXByai5odG1sIiB0aXRsZT0iWW91IGNyZWF0ZSBhbmQgbWFpbnRhaW4gdGhlIHJlc291cmNlcyBmb3IgeW91ciBXZWIgYXBwbGljYXRpb25zIGluIFdlYiBwcm9qZWN0cy4iPkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpkZXRhZ3MuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amRldGFncy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWZmYjY3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amRldGFncy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0amRldGFncyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXc8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPldlYiBwYWdlczxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD5UbyBhaWQgaW4gV2ViIHNpdGUgZGV2ZWxvcG1lbnQgYW5kIGVkaXRpbmcsIHRoZXJlIGlzIGxvY2FsIHRhZw0KLWhvdmVyIGhlbHAgZm9yIGFsbCBzdXBwb3J0ZWQgdGFnIHNldHMsIGFzIHdlbGwgYXMgPHhyZWYgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5kaXRhIg0KLXNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+Y29udGVudCBhc3Npc3Q8L3hyZWY+IChDdHJsK1NwYWNlYmFyKSwgYSB0b29sIHRoYXQNCi1oZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYQ0KLXN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuPC9wPjxwPiBZb3UgY2FuIHRvZ2dsZSBhbW9uZyB2YXJpb3VzIHZpZXdpbmcgbW9kZXMNCi0od2hpY2ggYXJlIGRldGVybWluZWQgYnkgZmlsZSB0eXBlKSB0byB2aXN1YWxseSBkZXNpZ24gcGFnZXMsIHdvcmsgd2l0aCBIVE1MLCA8dG0NCi10bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiBvcg0KLUpTUCBjb250ZW50LCBhbmQgcHJldmlldyB5b3VyIHBhZ2VzLiBUbyBoZWxwIHlvdSBjcmVhdGUgdGhlIHZpc3VhbCBpbXBhY3QNCi15b3Ugd2FudCBvbiB5b3VyIFdlYiBzaXRlcywgdGhlIGVkaXRvciBpbmNsdWRlcyBpdHMgb3duIGxpYnJhcnkgb2YgcmV1c2FibGUNCi1ncmFwaGljcyBhbmQgdHdvIGdyYXBoaWMgcHJvZ3JhbXMgZm9yIGNyZWF0aW5nLCBlZGl0aW5nLCBhbmQgYW5pbWF0aW5nIGltYWdlDQotZmlsZXMuIDwvcD48bm90ZT5Vc2UgZWl0aGVyIHVwcGVyY2FzZSBvciBsb3dlcmNhc2UgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMNCi1jb25zaXN0ZW50bHkgd2hlbiBuYW1pbmcgSFRNTCBmaWxlcyBhbmQgZW1iZWRkZWQgZmlsZXMgKHN1Y2ggYXMgaW1hZ2UgZmlsZXMpDQotdXNlZCBpbiB5b3VyIFdlYiBwYWdlcywgYmVjYXVzZSBzb21lIHNlcnZlciBvcGVyYXRpbmcgc3lzdGVtcyBhcmUgY2FzZSBzZW5zaXRpdmUuDQotRG8gbm90IHVzZSBzcGFjZXMgb3Igc3BlY2lhbCBjaGFyYWN0ZXJzIHN1Y2ggYXMgZXhjbGFtYXRpb24gcG9pbnRzIG9yIHF1ZXN0aW9uDQotbWFya3MgaW4gZmlsZSBuYW1lcy48L25vdGU+IDwvY29udGV4dD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpkZXRhZ3MuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amRldGFncy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTRmZjljLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amRldGFncy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXciIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcGFnZXMsIGNyZWF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iV2ViIHBhZ2VzLCBjcmVhdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jY3d0b3Zlci5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRqZGV0YWdzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqZGV0YWdzIj48YSBuYW1lPSJ0amRldGFncyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXc8L2gxPgotCi0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+VG8gYWlkIGluIFdlYiBzaXRlIGRldmVsb3BtZW50IGFuZCBlZGl0aW5nLCB0aGVyZSBpcyBsb2NhbCB0YWcKLWhvdmVyIGhlbHAgZm9yIGFsbCBzdXBwb3J0ZWQgdGFnIHNldHMsIGFzIHdlbGwgYXMgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5odG1sIiB0aXRsZT0iIj5jb250ZW50IGFzc2lzdDwvYT4gKEN0cmwrU3BhY2ViYXIpLCBhIHRvb2wgdGhhdAotaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEKLXN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuPC9wPgotPHA+IFlvdSBjYW4gdG9nZ2xlIGFtb25nIHZhcmlvdXMgdmlld2luZyBtb2RlcwotKHdoaWNoIGFyZSBkZXRlcm1pbmVkIGJ5IGZpbGUgdHlwZSkgdG8gdmlzdWFsbHkgZGVzaWduIHBhZ2VzLCB3b3JrIHdpdGggSFRNTCwgSmF2YVNjcmlwdOKEoiBvcgotSlNQIGNvbnRlbnQsIGFuZCBwcmV2aWV3IHlvdXIgcGFnZXMuIFRvIGhlbHAgeW91IGNyZWF0ZSB0aGUgdmlzdWFsIGltcGFjdAoteW91IHdhbnQgb24geW91ciBXZWIgc2l0ZXMsIHRoZSBlZGl0b3IgaW5jbHVkZXMgaXRzIG93biBsaWJyYXJ5IG9mIHJldXNhYmxlCi1ncmFwaGljcyBhbmQgdHdvIGdyYXBoaWMgcHJvZ3JhbXMgZm9yIGNyZWF0aW5nLCBlZGl0aW5nLCBhbmQgYW5pbWF0aW5nIGltYWdlCi1maWxlcy4gPC9wPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFVzZSBlaXRoZXIgdXBwZXJjYXNlIG9yIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycwotY29uc2lzdGVudGx5IHdoZW4gbmFtaW5nIEhUTUwgZmlsZXMgYW5kIGVtYmVkZGVkIGZpbGVzIChzdWNoIGFzIGltYWdlIGZpbGVzKQotdXNlZCBpbiB5b3VyIFdlYiBwYWdlcywgYmVjYXVzZSBzb21lIHNlcnZlciBvcGVyYXRpbmcgc3lzdGVtcyBhcmUgY2FzZSBzZW5zaXRpdmUuCi1EbyBub3QgdXNlIHNwYWNlcyBvciBzcGVjaWFsIGNoYXJhY3RlcnMgc3VjaCBhcyBleGNsYW1hdGlvbiBwb2ludHMgb3IgcXVlc3Rpb24KLW1hcmtzIGluIGZpbGUgbmFtZXMuPC9kaXY+Ci0gPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2Njd3RvdmVyLmh0bWwiIHRpdGxlPSIiPldlYiBhcHBsaWNhdGlvbiBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpwcmVmcy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqcHJlZnMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJjNzNkNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpwcmVmcy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0anByZWZzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5EZWZpbmluZyBIVE1MIGZpbGUgcHJlZmVyZW5jZXM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0idGpwcmVmc3wxfERPQ1RZUEVkZWNsYXJhdGlvbnNhZGRpbmdhdXRvbWF0aWNhbGx5Ig0KLXN0YXR1cz0ibmV3Ij5ET0NUWVBFIGRlY2xhcmF0aW9uczxpbmRleHRlcm0+YWRkaW5nIGF1dG9tYXRpY2FsbHk8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtIGtleXJlZj0idGpwcmVmc3wyfEhUTUxmaWxlc2VkaXRpbmdwcmVmZXJlbmNlcyIgc3RhdHVzPSJjaGFuZ2VkIj5IVE1MPGluZGV4dGVybT5lZGl0aW5nDQotcHJlZmVyZW5jZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD48aW5kZXh0ZXJtPkRPQ1RZUEUgZGVjbGFyYXRpb25zPGluZGV4dGVybT5hZGRpbmcgYXV0b21hdGljYWxseTwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPiA8aW5kZXh0ZXJtPkhUTUwNCi1maWxlczxpbmRleHRlcm0+ZWRpdGluZyBwcmVmZXJlbmNlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPiBUbyBkZWZpbmUgZ2VuZXJhbA0KLUhUTUwgZmlsZSBwcmVmZXJlbmNlcywgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkZyb20gdGhlIDx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+IG1lbnUsIHNlbGVjdCA8dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcmVmZXJlbmNlcyB3aW5kb3csIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XZWIgYW5kDQotWE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5IVE1MIEZpbGVzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U3BlY2lmeSB0aGUgZm9sbG93aW5nIHNldHRpbmdzIHJlbGF0ZWQgdG8gc2F2aW5nIGFuIEhUTUwgc291cmNlDQotcGFnZS4gVGhlIGRlZmF1bHRzIGFyZSByZWNvbW1lbmRlZCBhbmQgc2hvdWxkIG9ubHkgYmUgbW9kaWZpZWQgd2hlbiB0aGVyZQ0KLWlzIGEgc3BlY2lmaWMgcmVhc29uIHRvIGRvIHNvLiA8L2NtZD48aW5mbz48ZGw+PGRsZW50cnk+DQotPGR0PkxpbmUgZGVsaW1pdGVyPC9kdD4NCi08ZGQ+U3BlY2lmeSB0aGUgYXBwcm9wcmlhdGUgRU9MIGNoYXJhY3RlciBmb3IgeW91ciBlbnZpcm9ubWVudC4gVGhlIGRlZmF1bHQNCi1pcyA8dWljb250cm9sPk5vIHRyYW5zbGF0aW9uPC91aWNvbnRyb2w+LjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5BZGQgdGhpcyBzdWZmaXg8L2R0Pg0KLTxkZD5TcGVjaWZ5IGEgZGVmYXVsdCBzdWZmaXggZm9yIGZpbGVzIHRoYXQgeW91IHNhdmUuIFRoZSBkZWZhdWx0IGlzIDx1c2VyaW5wdXQ+aHRtbDwvdXNlcmlucHV0Pi48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+RW5jb2RpbmcsIElBTkEsIChVc2Ugd29ya2JlbmNoIGRlZmF1bHQpPC9kdD4NCi08ZGQ+U3BlY2lmeSB0aGUgZGVmYXVsdCBlbmNvZGluZyAoY29kZSBwYWdlKSBmb3IgZmlsZXMgdGhhdCB5b3UgY3JlYXRlLiBUaGUNCi1kZWZhdWx0IGlzIHRoZSBXb3JrYmVuY2gncyBlbmNvZGluZyBwcmVmZXJlbmNlLiA8L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SW5zZXJ0IERPQ1RZUEUgZGVjbGFyYXRpb248L2R0Pg0KLTxkZD5PcHRpb25hbGx5LCB5b3UgY2FuIGF1dG9tYXRpY2FsbHkgYWRkIGEgRE9DVFlQRSBkZWNsYXJhdGlvbiB0byBIVE1MIGZpbGVzLg0KLVRoZSBkZWZhdWx0IERPQ1RZUEUgaXMgZGV0ZXJtaW5lZCB3aGVuIHlvdSBjcmVhdGUgYW4gSFRNTCBmaWxlIG9yIGEgSlNQIGZpbGUNCi11c2luZyBhIHdpemFyZC4gSWYgeW91IGFkZCB0aGUgRE9DVFlQRSBkZWNsYXJhdGlvbiwgeW91IHNob3VsZCBpbmNsdWRlIGF0DQotbGVhc3QgYSBQdWJsaWMgSUQgc3BlY2lmaWNhdGlvbiwgYW5kLCBvcHRpb25hbGx5LCBhIFN5c3RlbSBJRC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SW5zZXJ0IEdFTkVSQVRPUiB3aXRoIE1FVEEgdGFnPC9kdD4NCi08ZGQ+T3B0aW9uYWxseSwgc2VsZWN0IHRoZSBjaGVjayBib3ggdG8gc3BlY2lmeSBHRU5FUkFUT1IgaW4gYSBNRVRBIHRhZyBpbg0KLXRoZSBIVE1MIGZpbGUgaGVhZGVyLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5Mb2FkaW5nIGZpbGVzPC9kdD4NCi08ZGQ+U3BlY2lmeSB0aGUgZGVmYXVsdCBlbmNvZGluZyAoY29kZSBwYWdlKSBmb3IgZmlsZXMgdGhhdCB5b3Ugb3Blbi4gVGhlDQotZGVmYXVsdCBpcyB0aGUgV29ya2JlbmNoJ3MgZW5jb2RpbmcgcHJlZmVyZW5jZS4gRGVzZWxlY3QgdGhlIDx1aWNvbnRyb2w+VXNlDQotd29ya2JlbmNoIGRlZmF1bHQ8L3VpY29udHJvbD4gY2hlY2sgYm94IHRvIHNlbGVjdCBhbm90aGVyIGVuY29kaW5nLiAgIDxub3RlPkVuY29kaW5nDQotZGV0ZWN0aW9uICh3aGVuIGxvYWRpbmcgZmlsZXMpIGlzIHBlcmZvcm1lZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiAgIDx1bD4NCi08bGk+TG9jYXRlIHRoZSBlbmNvZGluZyBuYW1lIGVtYmVkZGVkIGluIHRoZSBkb2N1bWVudC48L2xpPg0KLTxsaT5XaGVuIG5vIGVuY29kaW5nIGlzIGVtYmVkZGVkIGluIHRoZSBkb2N1bWVudCwgYW4gYXV0b21hdGljIGVuY29kaW5nIGRldGVjdG9yDQotYXR0ZW1wdHMgdG8gZGV0ZXJtaW5lIGVuY29kaW5nIHVzZWQgaW4gdGhlIGRvY3VtZW50LjwvbGk+DQotPGxpPklmIHRoZSBlbmNvZGluZyBzdGlsbCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhlIGVuY29kaW5nIGRlZmluZWQgaW4gdGhlIDx1aWNvbnRyb2w+RW5jb2Rpbmc8L3VpY29udHJvbD4gZmllbGQNCi1pcyB1c2VkLjwvbGk+DQotPC91bD4gPC9ub3RlPiA8L2RkPg0KLTwvZGxlbnRyeT48L2RsPiA8L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5BcHBseTwvdWljb250cm9sPiB0aGVuIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gdG8NCi1zYXZlIHlvdXIgY2hhbmdlcy48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpwcmVmcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqcHJlZnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcyZjEyMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpwcmVmcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRlZmluaW5nIEhUTUwgZmlsZSBwcmVmZXJlbmNlcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zLCBhZGRpbmcgYXV0b21hdGljYWxseSwgSFRNTCwgZWRpdGluZyBwcmVmZXJlbmNlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zLCBhZGRpbmcgYXV0b21hdGljYWxseSwgSFRNTCwgZWRpdGluZyBwcmVmZXJlbmNlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGpwcmVmcyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkRlZmluaW5nIEhUTUwgZmlsZSBwcmVmZXJlbmNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGpwcmVmcyI+PGEgbmFtZT0idGpwcmVmcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGVmaW5pbmcgSFRNTCBmaWxlIHByZWZlcmVuY2VzPC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPiAgVG8gZGVmaW5lIGdlbmVyYWwKLUhUTUwgZmlsZSBwcmVmZXJlbmNlcywgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+IG1lbnUsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJlZmVyZW5jZXMgd2luZG93LCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kCi1YTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRNTCBGaWxlczwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNwZWNpZnkgdGhlIGZvbGxvd2luZyBzZXR0aW5ncyByZWxhdGVkIHRvIHNhdmluZyBhbiBIVE1MIHNvdXJjZQotcGFnZS4gVGhlIGRlZmF1bHRzIGFyZSByZWNvbW1lbmRlZCBhbmQgc2hvdWxkIG9ubHkgYmUgbW9kaWZpZWQgd2hlbiB0aGVyZQotaXMgYSBzcGVjaWZpYyByZWFzb24gdG8gZG8gc28uIDwvc3Bhbj4gPGRsPgotPGR0IGNsYXNzPSJkbHRlcm0iPkxpbmUgZGVsaW1pdGVyPC9kdD4KLQotPGRkPlNwZWNpZnkgdGhlIGFwcHJvcHJpYXRlIEVPTCBjaGFyYWN0ZXIgZm9yIHlvdXIgZW52aXJvbm1lbnQuIFRoZSBkZWZhdWx0Ci1pcyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5ObyB0cmFuc2xhdGlvbjwvc3Bhbj4uPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+QWRkIHRoaXMgc3VmZml4PC9kdD4KLQotPGRkPlNwZWNpZnkgYSBkZWZhdWx0IHN1ZmZpeCBmb3IgZmlsZXMgdGhhdCB5b3Ugc2F2ZS4gVGhlIGRlZmF1bHQgaXMgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5odG1sPC9rYmQ+LjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkVuY29kaW5nLCBJQU5BLCAoVXNlIHdvcmtiZW5jaCBkZWZhdWx0KTwvZHQ+Ci0KLTxkZD5TcGVjaWZ5IHRoZSBkZWZhdWx0IGVuY29kaW5nIChjb2RlIHBhZ2UpIGZvciBmaWxlcyB0aGF0IHlvdSBjcmVhdGUuIFRoZQotZGVmYXVsdCBpcyB0aGUgV29ya2JlbmNoJ3MgZW5jb2RpbmcgcHJlZmVyZW5jZS4gPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SW5zZXJ0IERPQ1RZUEUgZGVjbGFyYXRpb248L2R0PgotCi08ZGQ+T3B0aW9uYWxseSwgeW91IGNhbiBhdXRvbWF0aWNhbGx5IGFkZCBhIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gSFRNTCBmaWxlcy4KLVRoZSBkZWZhdWx0IERPQ1RZUEUgaXMgZGV0ZXJtaW5lZCB3aGVuIHlvdSBjcmVhdGUgYW4gSFRNTCBmaWxlIG9yIGEgSlNQIGZpbGUKLXVzaW5nIGEgd2l6YXJkLiBJZiB5b3UgYWRkIHRoZSBET0NUWVBFIGRlY2xhcmF0aW9uLCB5b3Ugc2hvdWxkIGluY2x1ZGUgYXQKLWxlYXN0IGEgUHVibGljIElEIHNwZWNpZmljYXRpb24sIGFuZCwgb3B0aW9uYWxseSwgYSBTeXN0ZW0gSUQuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SW5zZXJ0IEdFTkVSQVRPUiB3aXRoIE1FVEEgdGFnPC9kdD4KLQotPGRkPk9wdGlvbmFsbHksIHNlbGVjdCB0aGUgY2hlY2sgYm94IHRvIHNwZWNpZnkgR0VORVJBVE9SIGluIGEgTUVUQSB0YWcgaW4KLXRoZSBIVE1MIGZpbGUgaGVhZGVyLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkxvYWRpbmcgZmlsZXM8L2R0PgotCi08ZGQ+U3BlY2lmeSB0aGUgZGVmYXVsdCBlbmNvZGluZyAoY29kZSBwYWdlKSBmb3IgZmlsZXMgdGhhdCB5b3Ugb3Blbi4gVGhlCi1kZWZhdWx0IGlzIHRoZSBXb3JrYmVuY2gncyBlbmNvZGluZyBwcmVmZXJlbmNlLiBEZXNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VXNlCi13b3JrYmVuY2ggZGVmYXVsdDwvc3Bhbj4gY2hlY2sgYm94IHRvIHNlbGVjdCBhbm90aGVyIGVuY29kaW5nLiAgIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBFbmNvZGluZwotZGV0ZWN0aW9uICh3aGVuIGxvYWRpbmcgZmlsZXMpIGlzIHBlcmZvcm1lZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiAgIDx1bD4KLTxsaT5Mb2NhdGUgdGhlIGVuY29kaW5nIG5hbWUgZW1iZWRkZWQgaW4gdGhlIGRvY3VtZW50LjwvbGk+Ci0KLTxsaT5XaGVuIG5vIGVuY29kaW5nIGlzIGVtYmVkZGVkIGluIHRoZSBkb2N1bWVudCwgYW4gYXV0b21hdGljIGVuY29kaW5nIGRldGVjdG9yCi1hdHRlbXB0cyB0byBkZXRlcm1pbmUgZW5jb2RpbmcgdXNlZCBpbiB0aGUgZG9jdW1lbnQuPC9saT4KLQotPGxpPklmIHRoZSBlbmNvZGluZyBzdGlsbCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhlIGVuY29kaW5nIGRlZmluZWQgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVuY29kaW5nPC9zcGFuPiBmaWVsZAotaXMgdXNlZC48L2xpPgotCi08L3VsPgotIDwvZGl2PgotIDwvZGQ+Ci0KLTwvZGw+Ci0gPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBseTwvc3Bhbj4gdGhlbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gdG8KLXNhdmUgeW91ciBjaGFuZ2VzLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RzZXJ2ZXJ0YXJnZXQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c2VydmVydGFyZ2V0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NzE3MTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RzZXJ2ZXJ0YXJnZXQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0idHNlcnZlcnRhcmdldCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U2VydmVyIHRhcmdldGluZyBmb3IgV2ViIGFwcGxpY2F0aW9uczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c2VydmVyczxpbmRleHRlcm0+dGFyZ2V0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5XZWINCi1hcHBsaWNhdGlvbnM8aW5kZXh0ZXJtPnNlcnZlciB0YXJnZXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+VG8gc3VwcG9ydCBkaWZmZXJlbnQgSmF2YSBFRSBhcHBsaWNhdGlvbiBzZXJ2ZXJzLCB0aGUgSmF2YSBFRSB0b29saW5nIGFsbG93cw0KLXlvdSB0byB0YXJnZXQgYSBzcGVjaWZpYyBzZXJ2ZXIgZHVyaW5nIHlvdXIgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiAoRUFSKSBwcm9qZWN0DQotZGV2ZWxvcG1lbnQuIEluIG1vc3QgY2FzZXMsIGEgV2ViIHByb2plY3QgbXVzdCB0YXJnZXQgdGhlIHNhbWUgc2VydmVyIGFzIHRoZQ0KLUVBUiBwcm9qZWN0IGluIG9yZGVyIHRvIGRlcGxveSB0aGUgV2ViIGFwcGxpY2F0aW9uIHRvIHRoZSBzZXJ2ZXIgcHJvcGVybHkuIDwvcD4NCi08cD5BZnRlciB5b3UgaGF2ZSBhIFdlYiBwcm9qZWN0IGNyZWF0ZWQsIHlvdSBjYW4gbW9kaWZ5IHRoZSB0YXJnZXQgc2VydmVyDQotdXNpbmcgdGhlIHByb2plY3QncyBwcm9wZXJ0aWVzIGRpYWxvZy4gVG8gZG8gdGhpcywgcmlnaHQtY2xpY2sgb24gdGhlIHByb2plY3QNCi1pbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LCBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD4NCi08dWljb250cm9sPlNlcnZlcjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c2VydmVydGFyZ2V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHNlcnZlcnRhcmdldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDhmYzA4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c2VydmVydGFyZ2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZXJ2ZXIgdGFyZ2V0aW5nIGZvciBXZWIgYXBwbGljYXRpb25zIiAvPgotPG1ldGEgY29udGVudD0ic2VydmVycywgdGFyZ2V0aW5nLCBXZWIgYXBwbGljYXRpb25zLCBzZXJ2ZXIgdGFyZ2V0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic2VydmVycywgdGFyZ2V0aW5nLCBXZWIgYXBwbGljYXRpb25zLCBzZXJ2ZXIgdGFyZ2V0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3Y3JlcHJqLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNlcnZlcnRhcmdldCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNlcnZlciB0YXJnZXRpbmcgZm9yIFdlYiBhcHBsaWNhdGlvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzZXJ2ZXJ0YXJnZXQiPjxhIG5hbWU9InRzZXJ2ZXJ0YXJnZXQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNlcnZlciB0YXJnZXRpbmcgZm9yIFdlYiBhcHBsaWNhdGlvbnM8L2gxPgotCi0KLTxkaXY+Ci08cD5UbyBzdXBwb3J0IGRpZmZlcmVudCBKYXZhIEVFIGFwcGxpY2F0aW9uIHNlcnZlcnMsIHRoZSBKYXZhIEVFIHRvb2xpbmcgYWxsb3dzCi15b3UgdG8gdGFyZ2V0IGEgc3BlY2lmaWMgc2VydmVyIGR1cmluZyB5b3VyIEVudGVycHJpc2UgQXBwbGljYXRpb24gKEVBUikgcHJvamVjdAotZGV2ZWxvcG1lbnQuIEluIG1vc3QgY2FzZXMsIGEgV2ViIHByb2plY3QgbXVzdCB0YXJnZXQgdGhlIHNhbWUgc2VydmVyIGFzIHRoZQotRUFSIHByb2plY3QgaW4gb3JkZXIgdG8gZGVwbG95IHRoZSBXZWIgYXBwbGljYXRpb24gdG8gdGhlIHNlcnZlciBwcm9wZXJseS4gPC9wPgotCi08cD5BZnRlciB5b3UgaGF2ZSBhIFdlYiBwcm9qZWN0IGNyZWF0ZWQsIHlvdSBjYW4gbW9kaWZ5IHRoZSB0YXJnZXQgc2VydmVyCi11c2luZyB0aGUgcHJvamVjdCdzIHByb3BlcnRpZXMgZGlhbG9nLiBUbyBkbyB0aGlzLCByaWdodC1jbGljayBvbiB0aGUgcHJvamVjdAotaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldywgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TZXJ2ZXI8L3NwYW4+PC9zcGFuPi48L3A+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Y3JlcHJqLmh0bWwiIHRpdGxlPSJZb3UgY3JlYXRlIGFuZCBtYWludGFpbiB0aGUgcmVzb3VyY2VzIGZvciB5b3VyIFdlYiBhcHBsaWNhdGlvbnMgaW4gV2ViIHByb2plY3RzLiI+Q3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c3R5bGVzaGVldC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RzdHlsZXNoZWV0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjM3ZTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RzdHlsZXNoZWV0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzdHlsZXNoZWV0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzPC90aXRsZT4NCi08c2hvcnRkZXNjPkNhc2NhZGluZyBzdHlsZSBzaGVldHMgZW5hYmxlIHlvdSB0byBkZWZpbmUgYSBjb25zaXN0ZW50IGxvb2sgYW5kDQotZmVlbCB0aHJvdWdob3V0IHlvdXIgV2ViIHNpdGUgYnkgbWFpbnRhaW5pbmcgdGhlIGNvbnRlbnRzIChXZWIgcGFnZXMpIGFuZA0KLXRoZSBkZXNpZ24gKHRoZSBzdHlsZSBzaGVldCkgc2VwYXJhdGVseS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5zdHlsZSBzaGVldHM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5UbyBjcmVhdGUgYSBuZXcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0OjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DcmVhdGUgYSBzdGF0aWMgb3IgYSBkeW5hbWljIFdlYiBwcm9qZWN0IGlmIHlvdSBoYXZlIG5vdCBhbHJlYWR5DQotZG9uZSBzby48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciwgZXhwYW5kIHlvdXIgcHJvamVjdCBhbmQgcmlnaHQgY2xpY2sgb24NCi15b3VyIFdlYkNvbnRlbnQgZm9sZGVyIG9yIG9uIGEgc3ViZm9sZGVyIHVuZGVyIFdlYkNvbnRlbnQuICA8L2NtZD48aW5mbz5Ob3RlDQotdGhhdCBpZiB5b3UgY2hvb3NlIGFueSBvdGhlciBmb2xkZXIgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBDU1MgZmlsZSwgdGhlbg0KLWl0IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBXQVIgZmlsZSB0aGF0IGlzIGRlcGxveWVkIHRvIHRoZSBzZXJ2ZXIuIDwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5Gcm9tIHRoZSBjb250ZXh0IG1lbnUsIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5OZXc8L3VpY29udHJvbD4NCi08dWljb250cm9sPk90aGVyPC91aWNvbnRyb2w+PHVpY29udHJvbD5XZWI8L3VpY29udHJvbD48dWljb250cm9sPkNTUzwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+LjwvY21kPjxzdGVwcmVzdWx0PlRoZSBOZXcgQ2FzY2FkaW5nIFN0eWxlIFNoZWV0IHdpbmRvdyBhcHBlYXJzDQotd2l0aCB5b3VyIGZvbGRlciBzZWxlY3RlZDwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UeXBlIGEgZmlsZSBuYW1lIGludG8gdGhlIEZpbGUgbmFtZSBmaWVsZCwgbWFraW5nIHN1cmUgeW91IGluY2x1ZGUNCi1hIGNzcyBleHRlbnNpb24gaW4gdGhlIGZpbGUgbmFtZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD4gWW91IGhhdmUgc2V2ZXJhbCBvcHRpb25zIGZvciBwcm9jZWVkaW5nOjwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+VG8gYWNjZXB0IHRoZSBkZWZhdWx0cyBhc3NvY2lhdGVkIHdpdGggYSBuZXcgQ1NTIGZpbGUsIHNlbGVjdCA8dWljb250cm9sPkZpbmlzaC48L3VpY29udHJvbD48L2Nob2ljZT4NCi08Y2hvaWNlPiBUbyB1c2UgYSB0ZW1wbGF0ZSBmaWxlIGZvciB0aGUgaW5pdGlhbCBjb250ZW50IG9mIHlvdXIgQ1NTIGZpbGUsDQotc2VsZWN0IDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi4gVGhlIFNlbGVjdCBDU1MgVGVtcGxhdGUgd2luZG93IGFwcGVhcnMuDQotU2VsZWN0IHRoZSA8dWljb250cm9sPlVzZSBDU1MgVGVtcGxhdGU8L3VpY29udHJvbD4gY2hlY2sgYm94LCBhbmQgdGhlbiBzZWxlY3QNCi1vbmUgb2YgdGhlIHNhbXBsZSB0ZW1wbGF0ZXMuIFlvdSBjYW4gYWxzbyBzZWxlY3QgdGhlIDx1aWNvbnRyb2w+Q1NTIFRlbXBsYXRlczwvdWljb250cm9sPiBsaW5rDQotdG8gYWRkIG9yIHJlbW92ZSBIVE1MIHRlbXBsYXRlcyB0byB5b3VyIGxpc3Qgb2YgdGVtcGxhdGVzLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHN0eWxlc2hlZXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c3R5bGVzaGVldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmYwYTBjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c3R5bGVzaGVldC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJDYXNjYWRpbmcgc3R5bGUgc2hlZXRzIGVuYWJsZSB5b3UgdG8gZGVmaW5lIGEgY29uc2lzdGVudCBsb29rIGFuZCBmZWVsIHRocm91Z2hvdXQgeW91ciBXZWIgc2l0ZSBieSBtYWludGFpbmluZyB0aGUgY29udGVudHMgKFdlYiBwYWdlcykgYW5kIHRoZSBkZXNpZ24gKHRoZSBzdHlsZSBzaGVldCkgc2VwYXJhdGVseS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQ2FzY2FkaW5nIHN0eWxlIHNoZWV0cyBlbmFibGUgeW91IHRvIGRlZmluZSBhIGNvbnNpc3RlbnQgbG9vayBhbmQgZmVlbCB0aHJvdWdob3V0IHlvdXIgV2ViIHNpdGUgYnkgbWFpbnRhaW5pbmcgdGhlIGNvbnRlbnRzIChXZWIgcGFnZXMpIGFuZCB0aGUgZGVzaWduICh0aGUgc3R5bGUgc2hlZXQpIHNlcGFyYXRlbHkuIiAvPgotPG1ldGEgY29udGVudD0ic3R5bGUgc2hlZXRzLCBjcmVhdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InN0eWxlIHNoZWV0cywgY3JlYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzdHlsZXNoZWV0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHN0eWxlc2hlZXQiPjxhIG5hbWU9InRzdHlsZXNoZWV0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzPC9oMT4KLQotCi0KLTxkaXY+PHA+Q2FzY2FkaW5nIHN0eWxlIHNoZWV0cyBlbmFibGUgeW91IHRvIGRlZmluZSBhIGNvbnNpc3RlbnQgbG9vayBhbmQKLWZlZWwgdGhyb3VnaG91dCB5b3VyIFdlYiBzaXRlIGJ5IG1haW50YWluaW5nIHRoZSBjb250ZW50cyAoV2ViIHBhZ2VzKSBhbmQKLXRoZSBkZXNpZ24gKHRoZSBzdHlsZSBzaGVldCkgc2VwYXJhdGVseS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGNyZWF0ZSBhIG5ldyBjYXNjYWRpbmcgc3R5bGUgc2hlZXQ6PC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q3JlYXRlIGEgc3RhdGljIG9yIGEgZHluYW1pYyBXZWIgcHJvamVjdCBpZiB5b3UgaGF2ZSBub3QgYWxyZWFkeQotZG9uZSBzby48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciwgZXhwYW5kIHlvdXIgcHJvamVjdCBhbmQgcmlnaHQgY2xpY2sgb24KLXlvdXIgV2ViQ29udGVudCBmb2xkZXIgb3Igb24gYSBzdWJmb2xkZXIgdW5kZXIgV2ViQ29udGVudC4gIDwvc3Bhbj4gTm90ZQotdGhhdCBpZiB5b3UgY2hvb3NlIGFueSBvdGhlciBmb2xkZXIgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBDU1MgZmlsZSwgdGhlbgotaXQgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIFdBUiBmaWxlIHRoYXQgaXMgZGVwbG95ZWQgdG8gdGhlIHNlcnZlci4gCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gdGhlIGNvbnRleHQgbWVudSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3RoZXI8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNTUzwvc3Bhbj4KLTwvc3Bhbj4uPC9zcGFuPiBUaGUgTmV3IENhc2NhZGluZyBTdHlsZSBTaGVldCB3aW5kb3cgYXBwZWFycwotd2l0aCB5b3VyIGZvbGRlciBzZWxlY3RlZDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIGZpbGUgbmFtZSBpbnRvIHRoZSBGaWxlIG5hbWUgZmllbGQsIG1ha2luZyBzdXJlIHlvdSBpbmNsdWRlCi1hIGNzcyBleHRlbnNpb24gaW4gdGhlIGZpbGUgbmFtZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4gWW91IGhhdmUgc2V2ZXJhbCBvcHRpb25zIGZvciBwcm9jZWVkaW5nOjwvc3Bhbj4KLTx1bD4KLTxsaT5UbyBhY2NlcHQgdGhlIGRlZmF1bHRzIGFzc29jaWF0ZWQgd2l0aCBhIG5ldyBDU1MgZmlsZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaC48L3NwYW4+PC9saT4KLQotPGxpPiBUbyB1c2UgYSB0ZW1wbGF0ZSBmaWxlIGZvciB0aGUgaW5pdGlhbCBjb250ZW50IG9mIHlvdXIgQ1NTIGZpbGUsCi1zZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uIFRoZSBTZWxlY3QgQ1NTIFRlbXBsYXRlIHdpbmRvdyBhcHBlYXJzLgotU2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Vc2UgQ1NTIFRlbXBsYXRlPC9zcGFuPiBjaGVjayBib3gsIGFuZCB0aGVuIHNlbGVjdAotb25lIG9mIHRoZSBzYW1wbGUgdGVtcGxhdGVzLiBZb3UgY2FuIGFsc28gc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DU1MgVGVtcGxhdGVzPC9zcGFuPiBsaW5rCi10byBhZGQgb3IgcmVtb3ZlIEhUTUwgdGVtcGxhdGVzIHRvIHlvdXIgbGlzdCBvZiB0ZW1wbGF0ZXMuPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXByai5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3JlcHJqLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYzNiM2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3JlcHJqLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPCEtLSBBcmJvclRleHQsIEluYy4sIDE5ODgtMjAwMiwgdi40MDAyLS0+DQotPHRhc2sgaWQ9InR3Y3JlcHJqIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3Q8L3RpdGxlPg0KLTxzaG9ydGRlc2M+WW91IGNyZWF0ZSBhbmQgbWFpbnRhaW4gdGhlIHJlc291cmNlcyBmb3IgeW91ciBXZWIgYXBwbGljYXRpb25zDQotaW4gV2ViIHByb2plY3RzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPldlYiBwcm9qZWN0czxpbmRleHRlcm0+Y3JlYXRpbmcgZHluYW1pYyBwcm9qZWN0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+V2ViIGFwcGxpY2F0aW9uczxpbmRleHRlcm0+cmVzb3VyY2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+IFVubGlrZSB3aXRoIDx4cmVmIGhyZWY9InR3Y3Jlc3RhLmRpdGEiIHNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+c3RhdGljPC94cmVmPiBXZWINCi1wcm9qZWN0cywgIGR5bmFtaWMgV2ViIHByb2plY3RzIGVuYWJsZSB5b3UgdG8gY3JlYXRlIHJlc291cmNlcyBzdWNoIGFzIEphdmFTZXJ2ZXINCi1QYWdlcyBhbmQgc2VydmxldHMuPC9wPjxwPlRvIGNyZWF0ZSBhIG5ldyBkeW5hbWljIFdlYiBwcm9qZWN0LCBjb21wbGV0ZSB0aGUNCi1mb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyLCByaWdodCBjbGljayBvbiBEeW5hbWljIFdlYiBQcm9qZWN0cywgYW5kDQotc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPk5ldzwvdWljb250cm9sPjx1aWNvbnRyb2w+RHluYW1pYyBXZWIgUHJvamVjdDwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGZyb20gdGhlIGNvbnRleHQgbWVudS4gVGhlIE5ldyBEeW5hbWljIFdlYiBQcm9qZWN0IHdpemFyZCBzdGFydHMuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Rm9sbG93IHRoZSBwcm9qZWN0IHdpemFyZCBwcm9tcHRzLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPjxwPjxiPkdlbmVyYWwgSW5mb3JtYXRpb248L2I+PC9wPjxkbD48ZGxlbnRyeT4NCi08ZHQ+UHJvamVjdCBGYWNldHMgPC9kdD4NCi08ZGQ+QSBmYWNldCByZXByZXNlbnRzIGEgdW5pdCBvZiBmdW5jdGlvbmFsaXR5IGluIGEgV2ViIHByb2plY3QuIEZvciBleGFtcGxlLA0KLXRoZSBEeW5hbWljIFdlYiBNb2R1bGUgZmFjZXQgZW5hYmxlcyB0aGUgcHJvamVjdCB0byBiZSBkZXBsb3llZCBhcyBhIGR5bmFtaWMNCi1XZWIgbW9kdWxlLiBBIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGEgcHJvamVjdCBmYWNldCBhcHBlYXJzIGluIHRoZSB3aXphcmQgd2hlbg0KLXlvdSBzZWxlY3QgaXQuICBOb3RlIHRoYXQgaW4gbWFueSBpbnN0YW5jZXMsIHlvdSBjYW4gdmlldyB0aGUgY29uc3RyYWludHMNCi1mb3IgYSBwcm9qZWN0IGZhY2V0IGJ5IHJpZ2h0IGNsaWNraW5nIG9uIHRoZSBmYWNldCBhbmQgc2VsZWN0aW5nIHByb2plY3QgY29uc3RyYWludHMNCi1mcm9tIHRoZSBwb3AgdXAgbWVudS4gIDwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5UYXJnZXQgUnVudGltZTwvZHQ+DQotPGRkPlVzZSB0aGlzIGZpZWxkIHRvIGRlZmluZSBhIG5ldyBpbnN0YWxsZWQgcnVudGltZSBlbnZpcm9ubWVudC4gUnVudGltZXMNCi1hcmUgdXNlZCBhdCBidWlsZCB0aW1lIHRvIGNvbXBpbGUgcHJvamVjdHMuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCAoRUFSIFByb2plY3QpPC9kdD4NCi08ZGQ+QSBuZXcgb3IgZXhpc3RpbmcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IChFQVIgUHJvamVjdCkgbXVzdCBiZQ0KLWFzc29jaWF0ZWQgd2l0aCB5b3VyIG5ldyBXZWIgcHJvamVjdCB0byBmYWNpbGl0YXRlIGRlcGxveW1lbnQuIElmIHlvdSB3YW50DQotdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QsIHlvdQ0KLWNhbiBkbyBzbyB1c2luZyB0aGUgd2l6YXJkLiBXaGVuIHlvdXIgV2ViIHByb2plY3QgaXMgY3JlYXRlZCBhdCB0aGUgZW5kIG9mDQotdGhlIHdpemFyZCwgdGhlIG5ldyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgaXMgYWxzbyBjcmVhdGVkIHdpdGggdGhlDQotbmFtZSBzcGVjaWZpZWQgaW4gdGhlIEVBUiBwcm9qZWN0IGZpZWxkLiBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgaXMgdGhlIG5hbWUNCi1vZiB0aGUgd2ViIHByb2plY3QgYXBwZW5kZWQgd2l0aCBFQVIgKHVubGVzcyB0aGUgZWFyIHByb2plY3Qgd2FzIHNlbGVjdGVkDQotd2hlbiB5b3Ugb3BlbmVkIHRoZSB3aXphcmQuKTwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5Db250ZXh0IFJvb3Q8L2R0Pg0KLTxkZD5UaGUgY29udGV4dCByb290IGlzIHRoZSBXZWIgYXBwbGljYXRpb24gcm9vdCwgd2hpY2ggaXMgdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkNCi1vZiB5b3VyIGFwcGxpY2F0aW9uIHdoZW4gaXQgaXMgZGVwbG95ZWQgdG8gdGhlIFdlYiBzZXJ2ZXIuIFlvdSBjYW4gY2hhbmdlDQotdGhlIGNvbnRleHQgcm9vdCBhZnRlciB5b3UgY3JlYXRlIGEgcHJvamVjdCB1c2luZyB0aGUgcHJvamVjdCBQcm9wZXJ0aWVzIGRpYWxvZywNCi13aGljaCB5b3UgYWNjZXNzIGZyb20gdGhlIHByb2plY3QncyBwb3AtdXAgbWVudS4gVGhlIGNvbnRleHQgcm9vdCBjYW4gYWxzbw0KLWJlIHVzZWQgYnkgdGhlIGxpbmtzIGJ1aWxkZXIgdG8gZW5zdXJlIHRoYXQgeW91ciBsaW5rcyByZW1haW4gcmVhZHkgdG8gcHVibGlzaA0KLWFzIHlvdSBtb3ZlIGFuZCByZW5hbWUgZmlsZXMgaW5zaWRlIHlvdXIgcHJvamVjdC48L2RkPg0KLTwvZGxlbnRyeT48L2RsPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVwcmouaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXByai5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2FlN2QxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXByai5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY3JlYXRlIGFuZCBtYWludGFpbiB0aGUgcmVzb3VyY2VzIGZvciB5b3VyIFdlYiBhcHBsaWNhdGlvbnMgaW4gV2ViIHByb2plY3RzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY3JlYXRlIGFuZCBtYWludGFpbiB0aGUgcmVzb3VyY2VzIGZvciB5b3VyIFdlYiBhcHBsaWNhdGlvbnMgaW4gV2ViIHByb2plY3RzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiBwcm9qZWN0cywgY3JlYXRpbmcgZHluYW1pYyBwcm9qZWN0cywgV2ViIGFwcGxpY2F0aW9ucywgcmVzb3VyY2VzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iV2ViIHByb2plY3RzLCBjcmVhdGluZyBkeW5hbWljIHByb2plY3RzLCBXZWIgYXBwbGljYXRpb25zLCByZXNvdXJjZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGpjcmVqc3AuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2Njc3RhdGljLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jY3dlYnByai5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3Y3JlcHJqIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d2NyZXByaiI+PGEgbmFtZT0idHdjcmVwcmoiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdDwvaDE+Ci0KLQotCi08ZGl2PjxwPllvdSBjcmVhdGUgYW5kIG1haW50YWluIHRoZSByZXNvdXJjZXMgZm9yIHlvdXIgV2ViIGFwcGxpY2F0aW9ucwotaW4gV2ViIHByb2plY3RzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPiBVbmxpa2Ugd2l0aCA8YSBocmVmPSJ0d2NyZXN0YS5odG1sIiB0aXRsZT0iIj5zdGF0aWM8L2E+IFdlYgotcHJvamVjdHMsICBkeW5hbWljIFdlYiBwcm9qZWN0cyBlbmFibGUgeW91IHRvIGNyZWF0ZSByZXNvdXJjZXMgc3VjaCBhcyBKYXZhU2VydmVyCi1QYWdlcyBhbmQgc2VydmxldHMuPC9wPgotPHA+VG8gY3JlYXRlIGEgbmV3IGR5bmFtaWMgV2ViIHByb2plY3QsIGNvbXBsZXRlIHRoZQotZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+T3BlbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyLCByaWdodCBjbGljayBvbiBEeW5hbWljIFdlYiBQcm9qZWN0cywgYW5kCi1zZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RHluYW1pYyBXZWIgUHJvamVjdDwvc3Bhbj4KLTwvc3Bhbj4gZnJvbSB0aGUgY29udGV4dCBtZW51LiBUaGUgTmV3IER5bmFtaWMgV2ViIFByb2plY3Qgd2l6YXJkIHN0YXJ0cy48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+Rm9sbG93IHRoZSBwcm9qZWN0IHdpemFyZCBwcm9tcHRzLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD48c3Ryb25nPkdlbmVyYWwgSW5mb3JtYXRpb248L3N0cm9uZz48L3A+Ci08ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+UHJvamVjdCBGYWNldHMgPC9kdD4KLQotPGRkPkEgZmFjZXQgcmVwcmVzZW50cyBhIHVuaXQgb2YgZnVuY3Rpb25hbGl0eSBpbiBhIFdlYiBwcm9qZWN0LiBGb3IgZXhhbXBsZSwKLXRoZSBEeW5hbWljIFdlYiBNb2R1bGUgZmFjZXQgZW5hYmxlcyB0aGUgcHJvamVjdCB0byBiZSBkZXBsb3llZCBhcyBhIGR5bmFtaWMKLVdlYiBtb2R1bGUuIEEgYnJpZWYgZGVzY3JpcHRpb24gb2YgYSBwcm9qZWN0IGZhY2V0IGFwcGVhcnMgaW4gdGhlIHdpemFyZCB3aGVuCi15b3Ugc2VsZWN0IGl0LiAgTm90ZSB0aGF0IGluIG1hbnkgaW5zdGFuY2VzLCB5b3UgY2FuIHZpZXcgdGhlIGNvbnN0cmFpbnRzCi1mb3IgYSBwcm9qZWN0IGZhY2V0IGJ5IHJpZ2h0IGNsaWNraW5nIG9uIHRoZSBmYWNldCBhbmQgc2VsZWN0aW5nIHByb2plY3QgY29uc3RyYWludHMKLWZyb20gdGhlIHBvcCB1cCBtZW51LiAgPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+VGFyZ2V0IFJ1bnRpbWU8L2R0PgotCi08ZGQ+VXNlIHRoaXMgZmllbGQgdG8gZGVmaW5lIGEgbmV3IGluc3RhbGxlZCBydW50aW1lIGVudmlyb25tZW50LiBSdW50aW1lcwotYXJlIHVzZWQgYXQgYnVpbGQgdGltZSB0byBjb21waWxlIHByb2plY3RzLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCAoRUFSIFByb2plY3QpPC9kdD4KLQotPGRkPkEgbmV3IG9yIGV4aXN0aW5nIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCAoRUFSIFByb2plY3QpIG11c3QgYmUKLWFzc29jaWF0ZWQgd2l0aCB5b3VyIG5ldyBXZWIgcHJvamVjdCB0byBmYWNpbGl0YXRlIGRlcGxveW1lbnQuIElmIHlvdSB3YW50Ci10byBvdmVycmlkZSB0aGUgZGVmYXVsdCBzZXR0aW5ncyBmb3IgdGhlIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCwgeW91Ci1jYW4gZG8gc28gdXNpbmcgdGhlIHdpemFyZC4gV2hlbiB5b3VyIFdlYiBwcm9qZWN0IGlzIGNyZWF0ZWQgYXQgdGhlIGVuZCBvZgotdGhlIHdpemFyZCwgdGhlIG5ldyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgaXMgYWxzbyBjcmVhdGVkIHdpdGggdGhlCi1uYW1lIHNwZWNpZmllZCBpbiB0aGUgRUFSIHByb2plY3QgZmllbGQuIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBpcyB0aGUgbmFtZQotb2YgdGhlIHdlYiBwcm9qZWN0IGFwcGVuZGVkIHdpdGggRUFSICh1bmxlc3MgdGhlIGVhciBwcm9qZWN0IHdhcyBzZWxlY3RlZAotd2hlbiB5b3Ugb3BlbmVkIHRoZSB3aXphcmQuKTwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkNvbnRleHQgUm9vdDwvZHQ+Ci0KLTxkZD5UaGUgY29udGV4dCByb290IGlzIHRoZSBXZWIgYXBwbGljYXRpb24gcm9vdCwgd2hpY2ggaXMgdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkKLW9mIHlvdXIgYXBwbGljYXRpb24gd2hlbiBpdCBpcyBkZXBsb3llZCB0byB0aGUgV2ViIHNlcnZlci4gWW91IGNhbiBjaGFuZ2UKLXRoZSBjb250ZXh0IHJvb3QgYWZ0ZXIgeW91IGNyZWF0ZSBhIHByb2plY3QgdXNpbmcgdGhlIHByb2plY3QgUHJvcGVydGllcyBkaWFsb2csCi13aGljaCB5b3UgYWNjZXNzIGZyb20gdGhlIHByb2plY3QncyBwb3AtdXAgbWVudS4gVGhlIGNvbnRleHQgcm9vdCBjYW4gYWxzbwotYmUgdXNlZCBieSB0aGUgbGlua3MgYnVpbGRlciB0byBlbnN1cmUgdGhhdCB5b3VyIGxpbmtzIHJlbWFpbiByZWFkeSB0byBwdWJsaXNoCi1hcyB5b3UgbW92ZSBhbmQgcmVuYW1lIGZpbGVzIGluc2lkZSB5b3VyIHByb2plY3QuPC9kZD4KLQotPC9kbD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jY3N0YXRpYy5odG1sIj5TdGF0aWMgV2ViIHByb2plY3RzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2N3ZWJwcmouaHRtbCI+RHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpjcmVqc3AuaHRtbCIgdGl0bGU9IiI+Q3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVzdGEuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmU1MTMwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d2NyZXN0YSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3Q8L3RpdGxlPg0KLTxzaG9ydGRlc2M+PC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c3RhdGljIFdlYiBwcm9qZWN0czxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPldlYiBwcm9qZWN0czxpbmRleHRlcm0+Y3JlYXRpbmcgc3RhdGljPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD4gSW4gdGhlIHdvcmtiZW5jaCwgeW91IGNyZWF0ZSBhbmQgbWFpbnRhaW4gcmVzb3VyY2VzIGZvciBXZWIgYXBwbGljYXRpb25zDQotaW4gV2ViIHByb2plY3RzLiBJZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBzdGF0aWMsIGNvbnRlbnQtYmFzZWQgV2ViIGFwcGxpY2F0aW9uDQotdGhhdCBjb250YWlucyBubyBkeW5hbWljIGVsZW1lbnRzLCBzdWNoIGFzIEpTUCBmaWxlcyBvciBzZXJ2bGV0cywgdXNlIHRoZSA8cGg+PHVpY29udHJvbD5OZXcNCi1TdGF0aWMgV2ViIFByb2plY3Q8L3VpY29udHJvbD48L3BoPiB3aXphcmQuIDwvcD48cD5UbyBjcmVhdGUgYSBuZXcgc3RhdGljDQotV2ViIHByb2plY3QsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlIDwvY21kPjxpbmZvPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciwgcmlnaHQgY2xpY2sgb24gT3RoZXIgUHJvamVjdHMgYW5kIHNlbGVjdCA8Yj5OZXctPk90aGVyLT5XZWItPlN0YXRpYw0KLVdlYiBQcm9qZWN0PC9iPiBmcm9tIHRoZSBjb250ZXh0IG1lbnUuIFRoZSBOZXcgU3RhdGljIFdlYiBQcm9qZWN0IHdpemFyZCBzdGFydHMuIDwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkZvbGxvdyB0aGUgcHJvamVjdCB3aXphcmQgcHJvbXB0czwvY21kPjxpbmZvPjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT48cD48Yj5HZW5lcmFsIEluZm9ybWF0aW9uPC9iPjwvcD48ZGw+PGRsZW50cnk+DQotPGR0PlByb2plY3QgRmFjZXRzIDwvZHQ+DQotPGRkPkEgZmFjZXQgcmVwcmVzZW50cyBhIHVuaXQgb2YgZnVuY3Rpb25hbGl0eSBpbiBhIFdlYiBwcm9qZWN0LiBGb3IgZXhhbXBsZSwNCi10aGUgU3RhdGljIFdlYiBNb2R1bGUgZmFjZXQgZW5hYmxlcyB0aGUgcHJvamVjdCB0byBiZSBkZXBsb3llZCBhcyBhIHN0YXRpYw0KLVdlYiBtb2R1bGUuIEEgYnJpZWYgZGVzY3JpcHRpb24gb2YgYSBwcm9qZWN0IGZhY2V0IGFwcGVhcnMgaW4gdGhlIHdpemFyZCB3aGVuDQoteW91IHNlbGVjdCBpdC4gIE5vdGUgdGhhdCBpbiBtYW55IGluc3RhbmNlcywgeW91IGNhbiB2aWV3IHRoZSBjb25zdHJhaW50cw0KLWZvciBhIHByb2plY3QgZmFjZXQgYnkgcmlnaHQgY2xpY2tpbmcgb24gdGhlIGZhY2V0IGFuZCBzZWxlY3RpbmcgcHJvamVjdCBjb25zdHJhaW50cw0KLWZyb20gdGhlIHBvcCB1cCBtZW51LiAgPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PlRhcmdldCBSdW50aW1lPC9kdD4NCi08ZGQ+VXNlIHRoaXMgZmllbGQgdG8gZGVmaW5lIGEgbmV3IGluc3RhbGxlZCBydW50aW1lIGVudmlyb25tZW50LiBSdW50aW1lcw0KLWFyZSB1c2VkIGF0IGJ1aWxkIHRpbWUgdG8gY29tcGlsZSBwcm9qZWN0cy4gPC9kZD4NCi08L2RsZW50cnk+PC9kbD48ZGw+PGRsZW50cnk+DQotPGR0PldlYiBDb250ZW50IEZvbGRlcjwvZHQ+DQotPGRkPlRoZSBmb2xkZXIgaW4gd2hpY2ggeW91IHdhbnQgdG8gc3RvcmUgeW91ciBwdWJsaXNoYWJsZSByZXNvdXJjZXMuIDwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jlc3RhLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOWFmMDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jlc3RhLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSIiIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIiAvPgotPG1ldGEgY29udGVudD0ic3RhdGljIFdlYiBwcm9qZWN0cywgY3JlYXRpbmcsIFdlYiBwcm9qZWN0cywgY3JlYXRpbmcgc3RhdGljIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic3RhdGljIFdlYiBwcm9qZWN0cywgY3JlYXRpbmcsIFdlYiBwcm9qZWN0cywgY3JlYXRpbmcgc3RhdGljIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2Njc3RhdGljLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdjcmVzdGEiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdjcmVzdGEiPjxhIG5hbWU9InR3Y3Jlc3RhIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdDwvaDE+Ci0KLQotCi08ZGl2PjxwIC8+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPiBJbiB0aGUgd29ya2JlbmNoLCB5b3UgY3JlYXRlIGFuZCBtYWludGFpbiByZXNvdXJjZXMgZm9yIFdlYiBhcHBsaWNhdGlvbnMKLWluIFdlYiBwcm9qZWN0cy4gSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgc3RhdGljLCBjb250ZW50LWJhc2VkIFdlYiBhcHBsaWNhdGlvbgotdGhhdCBjb250YWlucyBubyBkeW5hbWljIGVsZW1lbnRzLCBzdWNoIGFzIEpTUCBmaWxlcyBvciBzZXJ2bGV0cywgdXNlIHRoZSA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXcKLVN0YXRpYyBXZWIgUHJvamVjdDwvc3Bhbj48L3NwYW4+IHdpemFyZC4gPC9wPgotPHA+VG8gY3JlYXRlIGEgbmV3IHN0YXRpYwotV2ViIHByb2plY3QsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSA8L3NwYW4+IDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIsIHJpZ2h0IGNsaWNrIG9uIE90aGVyIFByb2plY3RzIGFuZCBzZWxlY3QgPHN0cm9uZz5OZXctJmd0O090aGVyLSZndDtXZWItJmd0O1N0YXRpYwotV2ViIFByb2plY3Q8L3N0cm9uZz4gZnJvbSB0aGUgY29udGV4dCBtZW51LiBUaGUgTmV3IFN0YXRpYyBXZWIgUHJvamVjdCB3aXphcmQgc3RhcnRzLiA8L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZvbGxvdyB0aGUgcHJvamVjdCB3aXphcmQgcHJvbXB0czwvc3Bhbj4gPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+PHN0cm9uZz5HZW5lcmFsIEluZm9ybWF0aW9uPC9zdHJvbmc+PC9wPgotPGRsPgotPGR0IGNsYXNzPSJkbHRlcm0iPlByb2plY3QgRmFjZXRzIDwvZHQ+Ci0KLTxkZD5BIGZhY2V0IHJlcHJlc2VudHMgYSB1bml0IG9mIGZ1bmN0aW9uYWxpdHkgaW4gYSBXZWIgcHJvamVjdC4gRm9yIGV4YW1wbGUsCi10aGUgU3RhdGljIFdlYiBNb2R1bGUgZmFjZXQgZW5hYmxlcyB0aGUgcHJvamVjdCB0byBiZSBkZXBsb3llZCBhcyBhIHN0YXRpYwotV2ViIG1vZHVsZS4gQSBicmllZiBkZXNjcmlwdGlvbiBvZiBhIHByb2plY3QgZmFjZXQgYXBwZWFycyBpbiB0aGUgd2l6YXJkIHdoZW4KLXlvdSBzZWxlY3QgaXQuICBOb3RlIHRoYXQgaW4gbWFueSBpbnN0YW5jZXMsIHlvdSBjYW4gdmlldyB0aGUgY29uc3RyYWludHMKLWZvciBhIHByb2plY3QgZmFjZXQgYnkgcmlnaHQgY2xpY2tpbmcgb24gdGhlIGZhY2V0IGFuZCBzZWxlY3RpbmcgcHJvamVjdCBjb25zdHJhaW50cwotZnJvbSB0aGUgcG9wIHVwIG1lbnUuICA8L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5UYXJnZXQgUnVudGltZTwvZHQ+Ci0KLTxkZD5Vc2UgdGhpcyBmaWVsZCB0byBkZWZpbmUgYSBuZXcgaW5zdGFsbGVkIHJ1bnRpbWUgZW52aXJvbm1lbnQuIFJ1bnRpbWVzCi1hcmUgdXNlZCBhdCBidWlsZCB0aW1lIHRvIGNvbXBpbGUgcHJvamVjdHMuIDwvZGQ+Ci0KLTwvZGw+Ci08ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+V2ViIENvbnRlbnQgRm9sZGVyPC9kdD4KLQotPGRkPlRoZSBmb2xkZXIgaW4gd2hpY2ggeW91IHdhbnQgdG8gc3RvcmUgeW91ciBwdWJsaXNoYWJsZSByZXNvdXJjZXMuIDwvZGQ+Ci0KLTwvZGw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2NzdGF0aWMuaHRtbCI+U3RhdGljIFdlYiBwcm9qZWN0czwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmV3YXIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXdhci5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjY5OWFiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXdhci5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d2NyZXdhciIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5leHBvcnRpbmc8aW5kZXh0ZXJtPldBUiBmaWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+V0FSIGZpbGVzPGluZGV4dGVybT5leHBvcnRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPldlYiBwcm9qZWN0czxpbmRleHRlcm0+ZXhwb3J0aW5nIFdBUiBmaWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPiBBIFdlYiBhcmNoaXZlIChXQVIpIGZpbGUgaXMgYSBwYWNrYWdlZCBXZWIgYXBwbGljYXRpb24gdGhhdA0KLWNhbiBiZSBleHBvcnRlZCB0byB0ZXN0LCBwdWJsaXNoLCBhbmQgZGVwbG95IHRoZSByZXNvdXJjZXMgZGV2ZWxvcGVkIHdpdGhpbg0KLWEgV2ViIHByb2plY3QuPC9wPjxwPlRvIGV4cG9ydCBhIFdBUiBmaWxlIGZyb20gYSBXZWIgcHJvamVjdCwgZG8gdGhlIGZvbGxvd2luZzogPC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5SaWdodCBjbGljayBvbiBhIFdlYiBwcm9qZWN0IGZvbGRlciBhbmQgc2VsZWN0IDxiPkV4cG9ydDwvYj4gZnJvbQ0KLXRoZSBwb3AtdXAgbWVudS4gVGhlbiBzZWxlY3Q8Yj4gV0FSIGZpbGU8L2I+IGluIHRoZSBFeHBvcnQgd2luZG93IGFuZCB0aGVuDQotc2VsZWN0IDxiPk5leHQ8L2I+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNwZWNpZnkgdGhlIFdlYiBwcm9qZWN0IHlvdSB3YW50IHRvIGV4cG9ydCAodGhpcyBmaWVsZCBpcyBwcmltZWQNCi1pZiB5b3UgdXNlZCB0aGUgcG9wLXVwIG1lbnUgdG8gb3BlbiB0aGUgd2l6YXJkKSwgYW5kIHNwZWNpZnkgYSBsb2NhdGlvbiBmb3INCi10aGUgbmV3IFdBUiBmaWxlPC9jbWQ+PC9zdGVwPg0KLTxzdGVwIGltcG9ydGFuY2U9Im9wdGlvbmFsIj48Y21kPk9wdGlvbmFsbHksIHN1cHBseSBXQVIgZXhwb3J0IDxwaD5PcHRpb25zPC9waD4sDQotc3VjaCBhcyB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHNvdXJjZSBmaWxlcyBpbiB0aGUgV0FSLCBhbmQgd2hldGhlcg0KLXRvIG92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgcmVzb3VyY2VzIGR1cmluZyB0aGUgZXhwb3J0IHByb2Nlc3MuIDwvY21kPjxpbmZvPlNvdXJjZQ0KLWZpbGVzIGFyZSBub3QgdXN1YWxseSBpbmNsdWRlZCBpbiBhIFdBUiBmaWxlLCBiZWNhdXNlIHRoZXkgYXJlIG5vdCBuZWNlc3NhcnkNCi1mb3IgdGhlIHNlcnZlciB0byBydW4gdGhlIHdlYiBhcHBsaWNhdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHBoPjx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+PC9waD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jld2FyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmV3YXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhNjU3Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmV3YXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkV4cG9ydGluZyBXZWIgQXJjaGl2ZSAoV0FSKSBmaWxlcyIgLz4KLTxtZXRhIGNvbnRlbnQ9ImV4cG9ydGluZywgV0FSIGZpbGVzLCBXZWIgcHJvamVjdHMsIGV4cG9ydGluZyBXQVIgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJleHBvcnRpbmcsIFdBUiBmaWxlcywgV2ViIHByb2plY3RzLCBleHBvcnRpbmcgV0FSIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3d2Fyb3ZyLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdjcmV3YXIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FeHBvcnRpbmcgV2ViIEFyY2hpdmUgKFdBUikgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3Y3Jld2FyIj48YSBuYW1lPSJ0d2NyZXdhciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzPC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPiBBIFdlYiBhcmNoaXZlIChXQVIpIGZpbGUgaXMgYSBwYWNrYWdlZCBXZWIgYXBwbGljYXRpb24gdGhhdAotY2FuIGJlIGV4cG9ydGVkIHRvIHRlc3QsIHB1Ymxpc2gsIGFuZCBkZXBsb3kgdGhlIHJlc291cmNlcyBkZXZlbG9wZWQgd2l0aGluCi1hIFdlYiBwcm9qZWN0LjwvcD4KLTxwPlRvIGV4cG9ydCBhIFdBUiBmaWxlIGZyb20gYSBXZWIgcHJvamVjdCwgZG8gdGhlIGZvbGxvd2luZzogPC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgb24gYSBXZWIgcHJvamVjdCBmb2xkZXIgYW5kIHNlbGVjdCA8c3Ryb25nPkV4cG9ydDwvc3Ryb25nPiBmcm9tCi10aGUgcG9wLXVwIG1lbnUuIFRoZW4gc2VsZWN0PHN0cm9uZz4gV0FSIGZpbGU8L3N0cm9uZz4gaW4gdGhlIEV4cG9ydCB3aW5kb3cgYW5kIHRoZW4KLXNlbGVjdCA8c3Ryb25nPk5leHQ8L3N0cm9uZz4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U3BlY2lmeSB0aGUgV2ViIHByb2plY3QgeW91IHdhbnQgdG8gZXhwb3J0ICh0aGlzIGZpZWxkIGlzIHByaW1lZAotaWYgeW91IHVzZWQgdGhlIHBvcC11cCBtZW51IHRvIG9wZW4gdGhlIHdpemFyZCksIGFuZCBzcGVjaWZ5IGEgbG9jYXRpb24gZm9yCi10aGUgbmV3IFdBUiBmaWxlPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+T3B0aW9uYWxseSwgc3VwcGx5IFdBUiBleHBvcnQgPHNwYW4+T3B0aW9uczwvc3Bhbj4sCi1zdWNoIGFzIHdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgSmF2YeKEoiBzb3VyY2UgZmlsZXMgaW4gdGhlIFdBUiwgYW5kIHdoZXRoZXIKLXRvIG92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgcmVzb3VyY2VzIGR1cmluZyB0aGUgZXhwb3J0IHByb2Nlc3MuIDwvc3Bhbj4gU291cmNlCi1maWxlcyBhcmUgbm90IHVzdWFsbHkgaW5jbHVkZWQgaW4gYSBXQVIgZmlsZSwgYmVjYXVzZSB0aGV5IGFyZSBub3QgbmVjZXNzYXJ5Ci1mb3IgdGhlIHNlcnZlciB0byBydW4gdGhlIHdlYiBhcHBsaWNhdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3dhcm92ci5odG1sIj5XZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjdnNyLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjdnNyLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2Y2ZjYzguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Zzci5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d2N2c3IiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNldHRpbmcgQ1ZTIHJlcG9zaXRvcnkgZGVmYXVsdHM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmJ1aWxkIG91dHB1dCBmb2xkZXJzPGluZGV4dGVybT5pZ25vcmluZyBpbiBDVlM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPkNWUzxpbmRleHRlcm0+c2V0dGluZyByZXBvc2l0b3J5IGRlZmF1bHRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5jdnNpZ25vcmUgZmlsZXM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5yZXBvc2l0b3JpZXM8aW5kZXh0ZXJtPmRlZmF1bHQgQ1ZTIHNldHRpbmdzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+V2hlbiB5b3UgdXNlIGEgQ1ZTIHJlcG9zaXRvcnkgZHVyaW5nIHRlYW0gZGV2ZWxvcG1lbnQsIHlvdSBtaWdodA0KLXdhbnQgdG8gdXNlIHRoZSBmb2xsb3dpbmcgc2V0dXAgdG8gZW5zdXJlIHRoYXQgdGhlIENWUyB2ZXJzaW9uaW5nIHN1cHBvcnQNCi1pZ25vcmVzIHRoZSBwcm9qZWN0J3MgYnVpbGQgb3V0cHV0IGZvbGRlcjo8L3A+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DcmVhdGUgYSBmaWxlIGNhbGxlZCAuY3ZzaWdub3JlIGluIHlvdXIgcHJvamVjdCdzIDxmaWxlcGF0aD5XZWJDb250ZW50L1dFQi1JTkY8L2ZpbGVwYXRoPiBmb2xkZXIuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhpcyBmaWxlLCBhZGQgYSBsaW5lIHdpdGggdGhlIG5hbWUgb2YgdGhlIGJ1aWxkIG91dHB1dCBmb2xkZXINCi0oZm9yIGV4YW1wbGUsIDxjb2RlcGg+Y2xhc3NlczwvY29kZXBoPikuPC9jbWQ+PGluZm8+PHA+Q3VycmVudGx5LCB5b3UgaGF2ZQ0KLXRoZSBvcHRpb24gb2YgY3JlYXRpbmcgdGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgKGFzIGEgZmVhdHVyZSkgd2hlbiB1c2luZyB0aGUNCi1OZXcgRHluYW1pYyBXZWIgUHJvamVjdCB3aXphcmQuPC9wPjxwPldoZW4geW91IHN5bmNocm9uaXplIHdpdGggYSBDVlMgdGVhbQ0KLXN0cmVhbSwgdGhlIG91dHB1dCBmb2xkZXIgd2lsbCBiZSBpZ25vcmVkLjwvcD48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gYWRkaXRpb24sIHlvdSBzaG91bGQgdHVybiBvZmYgdGhlIDxwaD48dWljb250cm9sPlBydW5lIGVtcHR5DQotZGlyZWN0b3JpZXM8L3VpY29udHJvbD48L3BoPiBvcHRpb24uIFNlbGVjdCA8cGg+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93czwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvcGg+LCBzd2l0Y2ggdG8gdGhlIDxwaD48bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5UZWFtPC91aWNvbnRyb2w+PHVpY29udHJvbD5DVlM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvcGg+IHByb3BlcnRpZXMNCi1wYWdlLCBhbmQgZW5zdXJlIHRoYXQgdGhlIDxwaD48dWljb250cm9sPlBydW5lIGVtcHR5IGRpcmVjdG9yaWVzPC91aWNvbnRyb2w+PC9waD4gY2hlY2sNCi1ib3ggaXMgbm90IGNoZWNrZWQuPC9jbWQ+PGluZm8+PHA+SWYgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgeW91ciBXZWIgcHJvamVjdCdzDQotc291cmNlIGRpcmVjdG9yeSBpcyBlbXB0eSwgaXQgd2lsbCBiZSBkZWxldGVkIHdoZW4gdGhlIHByb2plY3QgaXMgYWRkZWQgdG8NCi15b3VyIHdvcmtzcGFjZSBmcm9tIGEgQ1ZTIHJlcG9zaXRvcnksIGNhdXNpbmcgYSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBidWlsZCBlcnJvci48L3A+PC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2N2c3IuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2N2c3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM2ZTUyZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjdnNyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZXR0aW5nIENWUyByZXBvc2l0b3J5IGRlZmF1bHRzIiAvPgotPG1ldGEgY29udGVudD0iYnVpbGQgb3V0cHV0IGZvbGRlcnMsIGlnbm9yaW5nIGluIENWUywgQ1ZTLCBzZXR0aW5nIHJlcG9zaXRvcnkgZGVmYXVsdHMsIGN2c2lnbm9yZSBmaWxlcywgY3JlYXRpbmcsIHJlcG9zaXRvcmllcywgZGVmYXVsdCBDVlMgc2V0dGluZ3MiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJidWlsZCBvdXRwdXQgZm9sZGVycywgaWdub3JpbmcgaW4gQ1ZTLCBDVlMsIHNldHRpbmcgcmVwb3NpdG9yeSBkZWZhdWx0cywgY3ZzaWdub3JlIGZpbGVzLCBjcmVhdGluZywgcmVwb3NpdG9yaWVzLCBkZWZhdWx0IENWUyBzZXR0aW5ncyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdjdnNyIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U2V0dGluZyBDVlMgcmVwb3NpdG9yeSBkZWZhdWx0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdjdnNyIj48YSBuYW1lPSJ0d2N2c3IiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNldHRpbmcgQ1ZTIHJlcG9zaXRvcnkgZGVmYXVsdHM8L2gxPgotCi0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+V2hlbiB5b3UgdXNlIGEgQ1ZTIHJlcG9zaXRvcnkgZHVyaW5nIHRlYW0gZGV2ZWxvcG1lbnQsIHlvdSBtaWdodAotd2FudCB0byB1c2UgdGhlIGZvbGxvd2luZyBzZXR1cCB0byBlbnN1cmUgdGhhdCB0aGUgQ1ZTIHZlcnNpb25pbmcgc3VwcG9ydAotaWdub3JlcyB0aGUgcHJvamVjdCdzIGJ1aWxkIG91dHB1dCBmb2xkZXI6PC9wPgotIDwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNyZWF0ZSBhIGZpbGUgY2FsbGVkIC5jdnNpZ25vcmUgaW4geW91ciBwcm9qZWN0J3MgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj5XZWJDb250ZW50L1dFQi1JTkY8L3NwYW4+IGZvbGRlci48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoaXMgZmlsZSwgYWRkIGEgbGluZSB3aXRoIHRoZSBuYW1lIG9mIHRoZSBidWlsZCBvdXRwdXQgZm9sZGVyCi0oZm9yIGV4YW1wbGUsIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmNsYXNzZXM8L3NhbXA+KS48L3NwYW4+IDxwPkN1cnJlbnRseSwgeW91IGhhdmUKLXRoZSBvcHRpb24gb2YgY3JlYXRpbmcgdGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgKGFzIGEgZmVhdHVyZSkgd2hlbiB1c2luZyB0aGUKLU5ldyBEeW5hbWljIFdlYiBQcm9qZWN0IHdpemFyZC48L3A+Ci08cD5XaGVuIHlvdSBzeW5jaHJvbml6ZSB3aXRoIGEgQ1ZTIHRlYW0KLXN0cmVhbSwgdGhlIG91dHB1dCBmb2xkZXIgd2lsbCBiZSBpZ25vcmVkLjwvcD4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gYWRkaXRpb24sIHlvdSBzaG91bGQgdHVybiBvZmYgdGhlIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBydW5lIGVtcHR5Ci1kaXJlY3Rvcmllczwvc3Bhbj48L3NwYW4+IG9wdGlvbi4gU2VsZWN0IDxzcGFuPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93czwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPjwvc3Bhbj48L3NwYW4+LCBzd2l0Y2ggdG8gdGhlIDxzcGFuPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+Ci08c3BhbiBjbGFzcz0idWljb250cm9sIj5UZWFtPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNWUzwvc3Bhbj48L3NwYW4+PC9zcGFuPiBwcm9wZXJ0aWVzCi1wYWdlLCBhbmQgZW5zdXJlIHRoYXQgdGhlIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBydW5lIGVtcHR5IGRpcmVjdG9yaWVzPC9zcGFuPjwvc3Bhbj4gY2hlY2sKLWJveCBpcyBub3QgY2hlY2tlZC48L3NwYW4+IDxwPklmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQgYW5kIHlvdXIgV2ViIHByb2plY3Qncwotc291cmNlIGRpcmVjdG9yeSBpcyBlbXB0eSwgaXQgd2lsbCBiZSBkZWxldGVkIHdoZW4gdGhlIHByb2plY3QgaXMgYWRkZWQgdG8KLXlvdXIgd29ya3NwYWNlIGZyb20gYSBDVlMgcmVwb3NpdG9yeSwgY2F1c2luZyBhIEphdmHihKIgYnVpbGQgZXJyb3IuPC9wPgotPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ZsdHdpei5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Zmx0d2l6LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzkyZmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Zmx0d2l6LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3Zmx0d2l6IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBGaWx0ZXJzPC90aXRsZT4NCi08c2hvcnRkZXNjPlRoZSBmaWx0ZXJzIHdpemFyZCBoZWxwcyB5b3UgdG8gY3JlYXRlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHNlcnZsZXQgZmlsdGVycyBieSB3YWxraW5nIHlvdSB0aHJvdWdoDQotdGhlIGNyZWF0aW9uIHByb2Nlc3MgYW5kIGJ5IHByb3ZpZGluZyB5b3Ugd2l0aCBvdXRwdXQgZmlsZXMgdGhhdCB5b3UgY2FuIHVzZQ0KLW9yIHRoYXQgeW91IGNhbiBtb2RpZnkgZm9yIHVzZSB3aXRoIHlvdXIgV2ViIGFwcGxpY2F0aW9uLiBUaGUgZmlsdGVycyBjYW4NCi1ydW4gb24gSmF2YSBFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c2VydmxldHM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+VG8gY3JlYXRlIGEgZmlsdGVyLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOiA8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLCBleHBhbmQgeW91ciAgPHhyZWYgaHJlZj0iY2N3ZWJwcmouZGl0YSINCi1zY29wZT0icGVlciI+PGRlc2M+PC9kZXNjPmR5bmFtaWMgcHJvamVjdDwveHJlZj4gaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldy48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5SaWdodCBjbGljayBvbiB0aGUgPGI+RmlsdGVyPC9iPiBpY29uLCBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPk5ldzwvdWljb250cm9sPjx1aWNvbnRyb2w+RmlsdGVyPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gZnJvbQ0KLXRoZSBwb3AtdXAgbWVudS48L2NtZD48c3RlcHJlc3VsdD4gVGhlIDx1aWNvbnRyb2w+Q3JlYXRlIEZpbHRlcjwvdWljb250cm9sPiB3aXphcmQNCi1hcHBlYXJzLjwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Gb2xsb3cgdGhlIHByb2plY3Qgd2l6YXJkIHByb21wdHMuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+PHA+PGI+R2VuZXJhbCBJbmZvcm1hdGlvbjwvYj48L3A+PGRsPjxkbGVudHJ5Pg0KLTxkdD5Nb2RpZmllcnM8L2R0Pg0KLTxkZD5UaGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBTZXJ2bGV0IDIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPiBzdGF0ZXMNCi10aGF0IGEgU2VydmxldCBjbGFzcyBtdXN0IGJlIDxiPnB1YmxpYzwvYj4gYW5kIG5vdCA8Yj5hYnN0cmFjdDwvYj4uIFRoZXJlZm9yZSwNCi15b3UgY2Fubm90IGNoYW5nZSB0aGVzZSBtb2RpZmllcnMuIFRoZSBvbmx5IG9uZSBhdmFpbGFibGUgZm9yIGNoYW5nZSBpcyB0aGUgPGI+ZmluYWw8L2I+IG1vZGlmaWVyLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5JbnRlcmZhY2VzPC9kdD4NCi08ZGQ+VGhlcmUgaXMgb25lIG9ibGlnYXRvcnkgaW50ZXJmYWNlIHRoYXQgZmlsdGVyIGNsYXNzZXMgbXVzdCBpbXBsZW1lbnQ6IDxiPmphdmF4LnNlcnZsZXQuRmlsdGVyPC9iPi4NCi1UaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0IHBhY2thZ2UgYW5kIGlzIHVzZWQgdG8gcmVwcmVzZW50DQotdGhlIGxpZmUtY3ljbGUgb2YgdGhlIGZpbHRlci4gVGhpcyBpbnRlcmZhY2UgaGFzIHRocmVlIG1ldGhvZHM6IGluaXQsIGRvRmlsdGVyDQotYW5kIGRlc3Ryb3kuIDx1bD4NCi08bGk+VGhlIDxiPmluaXQ8L2I+IG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZsZXQgY29udGFpbmVyIG9ubHkgb25jZSwgd2hlbg0KLWl0IGZpbmlzaGVzIGluc3RhbnRpYXRpbmcgdGhlIGZpbHRlci48L2xpPg0KLTxsaT5UaGU8Yj5kb0ZpbHRlcjwvYj4gbWV0aG9kIGlzIHdoZXJlIHRoZSBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkIGFuZCBpcyBjYWxsZWQNCi1ldmVyeSB0aW1lIGEgdXNlciByZXF1ZXN0cyBhIHJlc291cmNlLCBzdWNoIGFzIGEgc2VydmxldCwgdG8gd2hpY2ggdGhlIGZpbHRlcg0KLWlzIG1hcHBlZC48L2xpPg0KLTxsaT5UaGUgPGI+ZGVzdHJveTwvYj4gbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmxldCBjb250YWluZXIgdG8gdGVsbCB0aGUNCi1maWx0ZXIgdGhhdCBpdCB3aWxsIGJlIHRha2VuIG91dCBvZiBzZXJ2aWNlLjwvbGk+DQotPC91bD4gQWx0aG91Z2gsIHRoYXQgdGhlIGphdmF4LnNlcnZsZXQuRmlsdGVyIGludGVyZmFjZSBpcyBwcm92aWRlZCBpbiB0aGUgPGI+SW50ZXJmYWNlczwvYj4gZmllbGQNCi1ieSBkZWZhdWx0LCB5b3UgY2FuIGFkZCBhZGRpdGlvbmFsIGludGVyZmFjZXMgdG8gaW1wbGVtZW50IGJ5IHVzaW5nIHRoZSA8Yj5BZGQ8L2I+IGJ1dHRvbi48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SW50ZXJmYWNlIHNlbGVjdGlvbiBkaWFsb2c8L2R0Pg0KLTxkZD5UaGlzIGRpYWxvZyBhcHBlYXJzIGlmIHlvdSBzZWxlY3QgdG8gYWRkIGFuIGludGVyZmFjZSB0byB5b3VyIGZpbHRlci4NCi1BcyB5b3UgdHlwZSB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgeW91IGFyZSBhZGRpbmcsIGEgbGlzdCBvZiBhdmFpbGFibGUNCi1pbnRlcmZhY2VzIGxpc3RlZCBpbiB0aGUgPGI+TWF0Y2hpbmcgaXRlbXM8L2I+IGxpc3QgYm94IHVwZGF0ZXMgZHluYW1pY2FsbHkNCi10byBkaXNwbGF5IG9ubHkgdGhlIGludGVyZmFjZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4gQ2hvb3NlIGFuIGludGVyZmFjZQ0KLXRvIHNlZSB0aGUgcXVhbGlmaWVyLCBhbmQgdGhlbiBjbGljayA8Yj5PSzwvYj4gd2hlbiBmaW5pc2hlZC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+RmlsdGVyIE1hcHBpbmdzPC9kdD4NCi08ZGQ+Rm9yIGEgZmlsdGVyIHRvIGludGVyY2VwdCBhIHJlcXVlc3QgdG8gYSBzZXJ2bGV0LCB5b3UgbXVzdDogPG9sPg0KLTxsaT5kZWNsYXJlIHRoZSBmaWx0ZXIgd2l0aCBhIDxiPiZsdDtmaWx0ZXImZ3Q7PC9iPiBlbGVtZW50IGluIHRoZSBkZXBsb3ltZW50DQotZGVzY3JpcHRvcjwvbGk+DQotPGxpPm1hcCB0aGUgZmlsdGVyIHRvIHRoZSBzZXJ2bGV0IHVzaW5nIHRoZSA8Yj4mbHQ7ZmlsdGVyLW1hcHBpbmcmZ3Q7PC9iPiANCi1lbGVtZW50LjwvbGk+DQotPC9vbD4gU29tZXRpbWVzIHlvdSB3YW50IGEgZmlsdGVyIHRvIHdvcmsgb24gbXVsdGlwbGUgc2VydmxldHMuIFlvdSBjYW4gZG8NCi10aGlzIGJ5IG1hcHBpbmcgYSBmaWx0ZXIgdG8gYSBVUkwgcGF0dGVybiBzbyB0aGF0IGFueSByZXF1ZXN0IHRoYXQgbWF0Y2hlcw0KLXRoYXQgVVJMIHBhdHRlcm4gd2lsbCBiZSBmaWx0ZXJlZC4gQWxsIHRoaXMgaXMgbWFkZSBhdXRvbWF0aWNhbGx5IGlmIHlvdSB1c2UNCi10aGUgPGI+RmlsdGVyIE1hcHBpbmdzPC9iPiBmaWVsZC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+TWV0aG9kIHN0dWJzPC9kdD4NCi08ZGQ+QmVjYXVzZSBlYWNoIGZpbHRlciBtdXN0IGltcGxlbWVudCB0aGUgamF2YXguc2VydmxldC5GaWx0ZXIgaW50ZXJmYWNlLA0KLXRoZSA8Yj5Jbmhlcml0ZWQgYWJzdHJhY3QgbWV0aG9kczwvYj4gb3B0aW9uIGlzIGFsd2F5cyBjaGVja2VkIGFuZCBjYW5ub3QNCi1iZSBjaGFuZ2VkLjwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ZsdHdpei5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Zmx0d2l6Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYjhhYTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Zmx0d2l6Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgRmlsdGVycyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgZmlsdGVycyB3aXphcmQgaGVscHMgeW91IHRvIGNyZWF0ZSBKYXZhIHNlcnZsZXQgZmlsdGVycyBieSB3YWxraW5nIHlvdSB0aHJvdWdoIHRoZSBjcmVhdGlvbiBwcm9jZXNzIGFuZCBieSBwcm92aWRpbmcgeW91IHdpdGggb3V0cHV0IGZpbGVzIHRoYXQgeW91IGNhbiB1c2Ugb3IgdGhhdCB5b3UgY2FuIG1vZGlmeSBmb3IgdXNlIHdpdGggeW91ciBXZWIgYXBwbGljYXRpb24uIFRoZSBmaWx0ZXJzIGNhbiBydW4gb24gSmF2YSBFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBmaWx0ZXJzIHdpemFyZCBoZWxwcyB5b3UgdG8gY3JlYXRlIEphdmEgc2VydmxldCBmaWx0ZXJzIGJ5IHdhbGtpbmcgeW91IHRocm91Z2ggdGhlIGNyZWF0aW9uIHByb2Nlc3MgYW5kIGJ5IHByb3ZpZGluZyB5b3Ugd2l0aCBvdXRwdXQgZmlsZXMgdGhhdCB5b3UgY2FuIHVzZSBvciB0aGF0IHlvdSBjYW4gbW9kaWZ5IGZvciB1c2Ugd2l0aCB5b3VyIFdlYiBhcHBsaWNhdGlvbi4gVGhlIGZpbHRlcnMgY2FuIHJ1biBvbiBKYXZhIEVFLWNvbXBsaWFudCBXZWIgc2VydmVycy4iIC8+Ci08bWV0YSBjb250ZW50PSJzZXJ2bGV0cywgY3JlYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzZXJ2bGV0cywgY3JlYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dmaWx0Ym4uaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0d2ZsdHdpeiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIEZpbHRlcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3Zmx0d2l6Ij48YSBuYW1lPSJ0d2ZsdHdpeiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgRmlsdGVyczwvaDE+Ci0KLQotCi08ZGl2PjxwPlRoZSBmaWx0ZXJzIHdpemFyZCBoZWxwcyB5b3UgdG8gY3JlYXRlIEphdmHihKIgc2VydmxldCBmaWx0ZXJzIGJ5IHdhbGtpbmcgeW91IHRocm91Z2gKLXRoZSBjcmVhdGlvbiBwcm9jZXNzIGFuZCBieSBwcm92aWRpbmcgeW91IHdpdGggb3V0cHV0IGZpbGVzIHRoYXQgeW91IGNhbiB1c2UKLW9yIHRoYXQgeW91IGNhbiBtb2RpZnkgZm9yIHVzZSB3aXRoIHlvdXIgV2ViIGFwcGxpY2F0aW9uLiBUaGUgZmlsdGVycyBjYW4KLXJ1biBvbiBKYXZhIEVFLWNvbXBsaWFudCBXZWIgc2VydmVycy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5UbyBjcmVhdGUgYSBmaWx0ZXIsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6IDwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLCBleHBhbmQgeW91ciAgPGEgaHJlZj0iY2N3ZWJwcmouaHRtbCIgdGl0bGU9IiI+ZHluYW1pYyBwcm9qZWN0PC9hPiBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgb24gdGhlIDxzdHJvbmc+RmlsdGVyPC9zdHJvbmc+IGljb24sIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWx0ZXI8L3NwYW4+PC9zcGFuPiBmcm9tCi10aGUgcG9wLXVwIG1lbnUuPC9zcGFuPiAgVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBGaWx0ZXI8L3NwYW4+IHdpemFyZAotYXBwZWFycy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZvbGxvdyB0aGUgcHJvamVjdCB3aXphcmQgcHJvbXB0cy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+PHN0cm9uZz5HZW5lcmFsIEluZm9ybWF0aW9uPC9zdHJvbmc+PC9wPgotPGRsPgotPGR0IGNsYXNzPSJkbHRlcm0iPk1vZGlmaWVyczwvZHQ+Ci0KLTxkZD5UaGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKYXZhIFNlcnZsZXQgMi4zIFNwZWNpZmljYXRpb248L2NpdGU+IHN0YXRlcwotdGhhdCBhIFNlcnZsZXQgY2xhc3MgbXVzdCBiZSA8c3Ryb25nPnB1YmxpYzwvc3Ryb25nPiBhbmQgbm90IDxzdHJvbmc+YWJzdHJhY3Q8L3N0cm9uZz4uIFRoZXJlZm9yZSwKLXlvdSBjYW5ub3QgY2hhbmdlIHRoZXNlIG1vZGlmaWVycy4gVGhlIG9ubHkgb25lIGF2YWlsYWJsZSBmb3IgY2hhbmdlIGlzIHRoZSA8c3Ryb25nPmZpbmFsPC9zdHJvbmc+IG1vZGlmaWVyLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkludGVyZmFjZXM8L2R0PgotCi08ZGQ+VGhlcmUgaXMgb25lIG9ibGlnYXRvcnkgaW50ZXJmYWNlIHRoYXQgZmlsdGVyIGNsYXNzZXMgbXVzdCBpbXBsZW1lbnQ6IDxzdHJvbmc+amF2YXguc2VydmxldC5GaWx0ZXI8L3N0cm9uZz4uCi1UaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0IHBhY2thZ2UgYW5kIGlzIHVzZWQgdG8gcmVwcmVzZW50Ci10aGUgbGlmZS1jeWNsZSBvZiB0aGUgZmlsdGVyLiBUaGlzIGludGVyZmFjZSBoYXMgdGhyZWUgbWV0aG9kczogaW5pdCwgZG9GaWx0ZXIKLWFuZCBkZXN0cm95LiA8dWw+Ci08bGk+VGhlIDxzdHJvbmc+aW5pdDwvc3Ryb25nPiBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBvbmx5IG9uY2UsIHdoZW4KLWl0IGZpbmlzaGVzIGluc3RhbnRpYXRpbmcgdGhlIGZpbHRlci48L2xpPgotCi08bGk+VGhlPHN0cm9uZz5kb0ZpbHRlcjwvc3Ryb25nPiBtZXRob2QgaXMgd2hlcmUgdGhlIGZpbHRlcmluZyBpcyBwZXJmb3JtZWQgYW5kIGlzIGNhbGxlZAotZXZlcnkgdGltZSBhIHVzZXIgcmVxdWVzdHMgYSByZXNvdXJjZSwgc3VjaCBhcyBhIHNlcnZsZXQsIHRvIHdoaWNoIHRoZSBmaWx0ZXIKLWlzIG1hcHBlZC48L2xpPgotCi08bGk+VGhlIDxzdHJvbmc+ZGVzdHJveTwvc3Ryb25nPiBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2bGV0IGNvbnRhaW5lciB0byB0ZWxsIHRoZQotZmlsdGVyIHRoYXQgaXQgd2lsbCBiZSB0YWtlbiBvdXQgb2Ygc2VydmljZS48L2xpPgotCi08L3VsPgotIEFsdGhvdWdoLCB0aGF0IHRoZSBqYXZheC5zZXJ2bGV0LkZpbHRlciBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgaW4gdGhlIDxzdHJvbmc+SW50ZXJmYWNlczwvc3Ryb25nPiBmaWVsZAotYnkgZGVmYXVsdCwgeW91IGNhbiBhZGQgYWRkaXRpb25hbCBpbnRlcmZhY2VzIHRvIGltcGxlbWVudCBieSB1c2luZyB0aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkludGVyZmFjZSBzZWxlY3Rpb24gZGlhbG9nPC9kdD4KLQotPGRkPlRoaXMgZGlhbG9nIGFwcGVhcnMgaWYgeW91IHNlbGVjdCB0byBhZGQgYW4gaW50ZXJmYWNlIHRvIHlvdXIgZmlsdGVyLgotQXMgeW91IHR5cGUgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSB0aGF0IHlvdSBhcmUgYWRkaW5nLCBhIGxpc3Qgb2YgYXZhaWxhYmxlCi1pbnRlcmZhY2VzIGxpc3RlZCBpbiB0aGUgPHN0cm9uZz5NYXRjaGluZyBpdGVtczwvc3Ryb25nPiBsaXN0IGJveCB1cGRhdGVzIGR5bmFtaWNhbGx5Ci10byBkaXNwbGF5IG9ubHkgdGhlIGludGVyZmFjZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4gQ2hvb3NlIGFuIGludGVyZmFjZQotdG8gc2VlIHRoZSBxdWFsaWZpZXIsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4gd2hlbiBmaW5pc2hlZC48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5GaWx0ZXIgTWFwcGluZ3M8L2R0PgotCi08ZGQ+Rm9yIGEgZmlsdGVyIHRvIGludGVyY2VwdCBhIHJlcXVlc3QgdG8gYSBzZXJ2bGV0LCB5b3UgbXVzdDogPG9sPgotPGxpPmRlY2xhcmUgdGhlIGZpbHRlciB3aXRoIGEgPHN0cm9uZz4mbHQ7ZmlsdGVyJmd0Ozwvc3Ryb25nPiBlbGVtZW50IGluIHRoZSBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yPC9saT4KLQotPGxpPm1hcCB0aGUgZmlsdGVyIHRvIHRoZSBzZXJ2bGV0IHVzaW5nIHRoZSA8c3Ryb25nPiZsdDtmaWx0ZXItbWFwcGluZyZndDs8L3N0cm9uZz4gCi1lbGVtZW50LjwvbGk+Ci0KLTwvb2w+Ci0gU29tZXRpbWVzIHlvdSB3YW50IGEgZmlsdGVyIHRvIHdvcmsgb24gbXVsdGlwbGUgc2VydmxldHMuIFlvdSBjYW4gZG8KLXRoaXMgYnkgbWFwcGluZyBhIGZpbHRlciB0byBhIFVSTCBwYXR0ZXJuIHNvIHRoYXQgYW55IHJlcXVlc3QgdGhhdCBtYXRjaGVzCi10aGF0IFVSTCBwYXR0ZXJuIHdpbGwgYmUgZmlsdGVyZWQuIEFsbCB0aGlzIGlzIG1hZGUgYXV0b21hdGljYWxseSBpZiB5b3UgdXNlCi10aGUgPHN0cm9uZz5GaWx0ZXIgTWFwcGluZ3M8L3N0cm9uZz4gZmllbGQuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+TWV0aG9kIHN0dWJzPC9kdD4KLQotPGRkPkJlY2F1c2UgZWFjaCBmaWx0ZXIgbXVzdCBpbXBsZW1lbnQgdGhlIGphdmF4LnNlcnZsZXQuRmlsdGVyIGludGVyZmFjZSwKLXRoZSA8c3Ryb25nPkluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2RzPC9zdHJvbmc+IG9wdGlvbiBpcyBhbHdheXMgY2hlY2tlZCBhbmQgY2Fubm90Ci1iZSBjaGFuZ2VkLjwvZGQ+Ci0KLTwvZGw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3dmaWx0Ym4uaHRtbCI+RmlsdGVyczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdpbXB3YXIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ltcHdhci5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDljMDYxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ltcHdhci5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d2ltcHdhciIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+SW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XQVIgZmlsZXM8aW5kZXh0ZXJtPmltcG9ydGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPkEgV2ViIEFyY2hpdmUgKFdBUikgZmlsZSBpcyBhIHBvcnRhYmxlLCBwYWNrYWdlZCBXZWIgYXBwbGljYXRpb24NCi10aGF0IHlvdSBjYW4gaW1wb3J0IGludG8geW91ciB3b3Jrc3BhY2UuIDwvcD48cD4gQmVmb3JlIGltcG9ydGluZyBhIFdBUiBmaWxlLA0KLXlvdSBzaG91bGQgZmlyc3QgZGV0ZXJtaW5lIGlmIHRoZSBXQVIgZmlsZSBjb250YWlucyBuZWVkZWQgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gc291cmNlDQotZmlsZXMuIFdoZW4gaW1wb3J0aW5nIGEgV0FSIGZpbGUgaW50byBhbiBleGlzdGluZyBXZWIgcHJvamVjdCwgdGhlIGltcG9ydGVkDQotV2ViIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlcyBhcmUgZWl0aGVyIG5vdCBjaGFuZ2VkIG9yIG92ZXJ3cml0dGVuIGJ5IHRoZQ0KLW9uZXMgaW5jbHVkZWQgaW4gdGhlIGltcG9ydGVkIFdBUiBmaWxlLCBiYXNlZCBvbiB5b3VyIHJlc3BvbnNlIHRvIHRoZSBwcm9tcHQNCi10aGF0IGlzIHByb3ZpZGVkLiAgSW4gZWl0aGVyIGNhc2UsIHRoaXMgYWN0aW9uIGRvZXMgPGk+bm90PC9pPiByZXByZXNlbnQgYQ0KLW1lcmdpbmcgb2YgdGhlIHR3byBzZXRzIG9mIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuICA8L3A+ICA8cD5UbyBpbXBvcnQgdGhlDQotV2ViIHByb2plY3QgcmVzb3VyY2VzIGluIGEgV0FSIGZpbGUgaW50byB5b3VyIHdvcmtzcGFjZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZw0KLXN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IDxwaD48bWVudWNhc2NhZGU+PHVpY29udHJvbD5GaWxlPC91aWNvbnRyb2w+PHVpY29udHJvbD5JbXBvcnQ8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPjwvcGg+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPiBJbiB0aGUgSW1wb3J0IGRpYWxvZywgc2VsZWN0IDxwaD48dWljb250cm9sPldBUiBmaWxlPC91aWNvbnRyb2w+PC9waD4gYW5kDQotdGhlbiBjbGljayA8cGg+PHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+PC9waD4uIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkxvY2F0ZSB0aGUgV0FSIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBpbXBvcnQgdXNpbmcgdGhlIDxwaD48dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPjwvcGg+IGJ1dHRvbi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD4gVGhlIHdpemFyZCBhc3N1bWVzIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBXZWIgcHJvamVjdCB3aXRoIHRoZQ0KLXNhbWUgbmFtZSBhcyB0aGUgV0FSIGZpbGUuIElmIHlvdSBhY2NlcHQgdGhpcyBjaG9pY2UsIHRoZSBwcm9qZWN0IHdpbGwgYmUNCi1jcmVhdGVkIHdpdGggdGhlIHNhbWUgc2VydmxldCB2ZXJzaW9uIGFzIHNwZWNpZmllZCBieSB0aGUgV0FSIGZpbGUgYW5kIGluDQotdGhlIHNhbWUgbG9jYXRpb24uIElmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZXNlIHNldHRpbmdzLCB5b3UgY2FuIGNsaWNrIDxiPk5ldzwvYj4gYW5kDQotc3BlY2lmeSB5b3VyIG5ldyBzZXR0aW5ncyBpbiB0aGUgRHluYW1pYyBXZWIgUHJvamVjdCB3aXphcmQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHBoPjx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+PC9waD4gdG8gcG9wdWxhdGUgdGhlIFdlYg0KLXByb2plY3QuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+PC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ltcHdhci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3aW1wd2FyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZGZiOGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3aW1wd2FyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJJbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiIC8+Ci08bWV0YSBjb250ZW50PSJXQVIgZmlsZXMsIGltcG9ydGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IldBUiBmaWxlcywgaW1wb3J0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3d2Fyb3ZyLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdpbXB3YXIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5JbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3aW1wd2FyIj48YSBuYW1lPSJ0d2ltcHdhciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPkEgV2ViIEFyY2hpdmUgKFdBUikgZmlsZSBpcyBhIHBvcnRhYmxlLCBwYWNrYWdlZCBXZWIgYXBwbGljYXRpb24KLXRoYXQgeW91IGNhbiBpbXBvcnQgaW50byB5b3VyIHdvcmtzcGFjZS4gPC9wPgotPHA+IEJlZm9yZSBpbXBvcnRpbmcgYSBXQVIgZmlsZSwKLXlvdSBzaG91bGQgZmlyc3QgZGV0ZXJtaW5lIGlmIHRoZSBXQVIgZmlsZSBjb250YWlucyBuZWVkZWQgSmF2YeKEoiBzb3VyY2UKLWZpbGVzLiBXaGVuIGltcG9ydGluZyBhIFdBUiBmaWxlIGludG8gYW4gZXhpc3RpbmcgV2ViIHByb2plY3QsIHRoZSBpbXBvcnRlZAotV2ViIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlcyBhcmUgZWl0aGVyIG5vdCBjaGFuZ2VkIG9yIG92ZXJ3cml0dGVuIGJ5IHRoZQotb25lcyBpbmNsdWRlZCBpbiB0aGUgaW1wb3J0ZWQgV0FSIGZpbGUsIGJhc2VkIG9uIHlvdXIgcmVzcG9uc2UgdG8gdGhlIHByb21wdAotdGhhdCBpcyBwcm92aWRlZC4gIEluIGVpdGhlciBjYXNlLCB0aGlzIGFjdGlvbiBkb2VzIDxlbT5ub3Q8L2VtPiByZXByZXNlbnQgYQotbWVyZ2luZyBvZiB0aGUgdHdvIHNldHMgb2YgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4gIDwvcD4KLSAgPHA+VG8gaW1wb3J0IHRoZQotV2ViIHByb2plY3QgcmVzb3VyY2VzIGluIGEgV0FSIGZpbGUgaW50byB5b3VyIHdvcmtzcGFjZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZwotc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaT48c3Bhbj5TZWxlY3QgPHNwYW4+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkltcG9ydDwvc3Bhbj4KLTwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+IEluIHRoZSBJbXBvcnQgZGlhbG9nLCBzZWxlY3QgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V0FSIGZpbGU8L3NwYW4+PC9zcGFuPiBhbmQKLXRoZW4gY2xpY2sgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj48L3NwYW4+LiA8L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkxvY2F0ZSB0aGUgV0FSIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBpbXBvcnQgdXNpbmcgdGhlIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj48L3NwYW4+IGJ1dHRvbi48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+IFRoZSB3aXphcmQgYXNzdW1lcyB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgV2ViIHByb2plY3Qgd2l0aCB0aGUKLXNhbWUgbmFtZSBhcyB0aGUgV0FSIGZpbGUuIElmIHlvdSBhY2NlcHQgdGhpcyBjaG9pY2UsIHRoZSBwcm9qZWN0IHdpbGwgYmUKLWNyZWF0ZWQgd2l0aCB0aGUgc2FtZSBzZXJ2bGV0IHZlcnNpb24gYXMgc3BlY2lmaWVkIGJ5IHRoZSBXQVIgZmlsZSBhbmQgaW4KLXRoZSBzYW1lIGxvY2F0aW9uLiBJZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGVzZSBzZXR0aW5ncywgeW91IGNhbiBjbGljayA8c3Ryb25nPk5ldzwvc3Ryb25nPiBhbmQKLXNwZWNpZnkgeW91ciBuZXcgc2V0dGluZ3MgaW4gdGhlIER5bmFtaWMgV2ViIFByb2plY3Qgd2l6YXJkLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPjwvc3Bhbj4gdG8gcG9wdWxhdGUgdGhlIFdlYgotcHJvamVjdC48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d3YXJvdnIuaHRtbCI+V2ViIGFyY2hpdmUgKFdBUikgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3bHN0d2l6LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdsc3R3aXouZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiMWVkYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdsc3R3aXouZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiIgInRhc2suZHRkIj4NCi08dGFzayBpZD0idHdsc3R3aXoiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIExpc3RlbmVyczwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGUgbGlzdGVuZXIgd2l6YXJkIGhlbHBzIHlvdSBjcmVhdGUgYXBwbGljYXRpb24gbGlmZWN5Y2xlIGxpc3RlbmVycyBieSB3YWxraW5nIHlvdSB0aHJvdWdoIHRoZSBjcmVhdGlvbiBwcm9jZXNzIGFuZCBieSBwcm92aWRpbmcgeW91IHdpdGggb3V0cHV0IGZpbGVzIHRoYXQgeW91IGNhbiB1c2Ugb3IgdGhhdCB5b3UgY2FuIG1vZGlmeSBmb3IgdXNlIHdpdGggeW91ciBXZWIgYXBwbGljYXRpb24uIFRoZSBsaXN0ZW5lcnMgY2FuIHJ1biBvbiBKYXZhIEVFLWNvbXBsaWFudCBXZWIgc2VydmVycy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5zZXJ2bGV0czxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD5UbyBjcmVhdGUgYSBsaXN0ZW5lciwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczogPC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5Gcm9tIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLCBleHBhbmQgeW91ciAgPHhyZWYgaHJlZj0iY2N3ZWJwcmouZGl0YSIgc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz5keW5hbWljIHByb2plY3Q8L3hyZWY+IGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+UmlnaHQgY2xpY2sgb24gdGhlIDxiPkxpc3RlbmVyPC9iPiBpY29uLCBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPk5ldzwvdWljb250cm9sPjx1aWNvbnRyb2w+TGlzdGVuZXI8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiBmcm9tIHRoZSBwb3AtdXAgbWVudS48L2NtZD48c3RlcHJlc3VsdD4gVGhlIDx1aWNvbnRyb2w+Q3JlYXRlIExpc3RlbmVyPC91aWNvbnRyb2w+IHdpemFyZCBhcHBlYXJzLjwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Gb2xsb3cgdGhlIHByb2plY3Qgd2l6YXJkIHByb21wdHMuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+PGRsPjxkbGVudHJ5Pg0KLTxkdD5BcHBsaWNhdGlvbiBsaWZlY3ljbGUgbGlzdGVuZXJzPC9kdD4NCi08ZGQ+VGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFNlcnZsZXQgMi4zIFNwZWNpZmljYXRpb248L2NpdGU+ZGVmaW5lcyB0aGUgCWZvbGxvd2luZyBpbnRlcmZhY2VzIHRoYXQgcmVwcmVzZW50IHRoYXQgYXBwbGljYXRpb24gbGlmZWN5Y2xlIAlsaXN0ZW5lcnMuIFlvdSBzaG91bGQgc2VsZWN0IGF0IGxlYXN0IG9uZSBvZiB0aGUgaW50ZWZhY2VzLiAJPHVsPg0KLTxsaT48Yj5qYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0TGlzdGVuZXI6PC9iPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0IHBhY2thZ2UgYW5kIGNhbiBiZSB1c2VkIHRvIGxpc3RlbiB0byB0aGUgU2VydmxldENvbnRleHQgbGlmZS1jeWNsZSBldmVudHMuIFRoaXMgaW50ZXJmYWNlIGhhcyB0d28gbWV0aG9kczogY29udGV4dEluaXRpYWxpemVkIGFuZCBjb250ZXh0RGVzdHJveWVkLiBUaGUgPGI+PGk+Y29udGV4dEluaXRpYWxpemVkPC9pPjwvYj4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB3ZWIgYXBwbGljYXRpb24gaXMgcmVhZHkgdG8gc2VydmljZSByZXF1ZXN0cyBhbmQgdGhlIDxiPjxpPmNvbnRleHREZXN0cm95ZWQ8L2k+PC9iPiBtZXRob2QgaXMgaW52b2tlZCB3aGVuIHRoZSBzZXJ2bGV0IGNvbnRleHQgaXMgYWJvdXQgdG8gYmUgc2h1dCBkb3duLjwvbGk+DQotPGxpPjxiPmphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRBdHRyaWJ1dGVMaXN0ZW5lcjo8L2I+IFRoaXMgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIGJ5IGphdmF4LnNlcnZsZXQgcGFja2FnZS4gSXQgY2FuIGJlIHVzZWQgdG8gYmUgbm90aWZpZWQgd2hlbiBhbnkgYXR0cmlidXRlIGlzIGFkZGVkIHRvIHRoZSBTZXJ2bGV0Q29udGV4dCBvciBpZiBhbnkgb2YgdGhlIFNlcnZsZXRDb250ZXh0J3MgYXR0cmlidXRlcyBhcmUgY2hhbmdlZCBvciByZW1vdmVkLiBUaGlzIGluZXRmYWNlIGhhcyB0aHJlZSBtZXRob2RzOiA8Yj48aT5hdHRyaWJ1dGVBZGRlZCwgYXR0cmlidXRlUmVtb3ZlZDwvaT48L2I+IGFuZCA8Yj48aT5hdHRyaWJ1dGVSZXBsYWNlZDwvaT48L2I+LjwvbGk+DQotPGxpPjxiPmphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RMaXN0ZW5lcjo8L2I+IFRoaXMgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIGJ5IGphdmF4LnNlcnZsZXQgcGFja2FnZS4gSXQgY2FuIGJlIHVzZWQgdG8gYmUgbm90aWZpZWQgd2hlbiBhIHJlcXVlc3QgaXMgY29taW5nIGluIG9yIG91dCBvZiBzY29wZSBpbiBhIFdlYiBjb21wb25lbnQuIFRoaXMgaW50ZXJmYWNlIGhhcyB0d28gbWV0aG9kczogcmVxdWVzdEluaXRpYWxpemVkIGFuZCByZXF1ZXN0RGVzdHJveWVkLiBUaGUgPGI+PGk+cmVxdWVzdEluaXRpYWxpemVkPC9pPjwvYj4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGl0IGlzIGFib3V0IHRvIGVudGVyIHRoZSBmaXJzdCBzZXJ2bGV0IG9yIGZpbHRlciBpbiBlYWNoIFdlYiBhcHBsaWNhdGlvbi4gVGhlIDxiPjxpPnJlcXVlc3REZXN0cm95ZWQ8L2k+PC9iPiBtZXRob2QgaXMgY2FsbGVkIHdoZW4gaXQgZXhpdHMgdGhlIGxhc3Qgc2VydmxldCBvciB0aGUgZmlyc3QgZmlsdGVyIGluIHRoZSBjaGFpbi48L2xpPg0KLTxsaT48Yj5qYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlTGlzdGVuZXI6PC9iPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0IHBhY2thZ2UgYW5kIGNhbiBiZSB1c2VkIHRvIGJlIG5vdGlmaWVkIHdoZW4gYW55IHJlcXVlc3QgYXR0cmlidXRlIGlzIGNoYW5nZWQuIFRoaXMgaW50ZXJmYWNlIGhhcyB0aHJlZSBtZXRob2RzOiBhdHRyaWJ1dGVBZGRlZCwgYXR0cmlidXRlUmVtb3ZlZCBhbmQgYXR0cmlidXRlUmVwbGFjZWQuIFRoZSA8Yj48aT5hdHRyaWJ1dHRlQWRkZWQ8L2k+PC9iPiBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBuZXcgYXR0cmlidXRlIHdhcyBhZGRlZCB0byBzZXJ2bGV0IHJlcXVlc3QuIFRoZSA8Yj48aT5hdHRyaWJ1dGVSZW1vdmVkPC9pPjwvYj4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGV4aXN0aW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4gVGhlIDxiPjxpPmF0dHJpYnV0ZVJlcGxhY2VkPC9pPjwvYj4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSB3YXMgcmVwbGFjZWQgb24gdGhlIHNlcnZsZXQgcmVxdWVzdC48L2xpPg0KLTxsaT48Yj5qYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25MaXN0ZW5lcjo8L2I+IFRoaXMgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIGJ5IGphdmF4LnNlcnZsZXQuaHR0cCBwYWNrYWdlIGFuZCBjYW4gYmUgdXNlZCB0byBsaXN0ZW4gdG8gYSBzZXNzaW9ucyBsaWZlIGN5Y2xlIGV2ZW50cy4gVGhpcyBpbnRlcmZhY2UgaGFzIHR3byBtZXRob2RzOiBzZXNzaW9uQ3JlYXRlZCBhbmQgc2Vzc2lvbkRlc3Ryb3llZC4gVGhlIDxiPjxpPnNlc3Npb25DcmVhdGVkPC9pPjwvYj4gIAltZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gSHR0cFNlc3Npb24gb2JqZWN0IGlzIGNyZWF0ZWQuIFRoZSA8Yj48aT5zZXNzaW9uRGVzdHJveWVkPC9pPjwvYj4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIEh0dHBTZXNzaW9uIG9iamVjdCBpcyBpbnZhbGlkYXRlZC48L2xpPg0KLTxsaT48Yj5qYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXI6PC9iPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0Lmh0dHAgcGFja2FnZS4gSXQgY2FuIGJlIHVzZWQgdG8gbGlzdGVuIHRvIGEgY29udGFpbmVyIGV2ZW50cyBub3RpZnlpbmcgdGhhdCBzZXNzaW9ucyB3aWxsIGJlIHBhc3NpdmF0ZWQgb3IgYWN0aXZhdGVkLiBUaGlzIGludGVyZmFjZSBoYXMgdHdvIG1ldGhvZHM6IHNlc3Npb25EaWRBY3RpdmF0ZSBhbmQgc2Vzc2lvbldpbGxQYXNpdmF0ZS4gVGhlIDxiPjxpPnNlc3Npb25EaWRBY3RpdmF0ZTwvaT48L2I+IGlzIGNhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIGhhcyBqdXN0IGJlZW4gYWN0aXZhdGVkIGFuZCB0aGUgPGI+PGk+c2Vzc2lvbldpbGxQYXNpdmF0ZTwvaT48L2I+IGlzIGNhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIGlzIGFib3V0IHRvIGJlIHBhc3NpdmF0ZWQuPC9saT4NCi08bGk+PGI+amF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXI6PC9iPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0Lmh0dHAgcGFja2FnZSBhbmQgY2FuIGJlIHVzZWQgdG8gbGlzdGVuIHRvIGV2ZW50cyByZWxhdGVkIHRvIHNlc3Npb24gYXR0cmlidXRlcy4gVGhpcyBpbnRlcmZhY2UgaGFzIHRocmVlIG1ldGhvZHM6IGF0dHJpYnV0ZUFkZGVkLCBhdHRyaWJ1dGVSZW1vdmVkIGFuZCBhdHRyaWJ1dGVSZXBsYWNlZC4gVGhlIDxiPjxpPmF0dHJpYnV0ZUFkZGVkPC9pPjwvYj4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBpcyBhZGRlZCB0byBhbiBIdHRwU2Vzc2lvbiBvYmplY3QuIFRoZSA8Yj48aT5hdHRyaWJ1dGVSZW1vdmVkPC9pPjwvYj4gYW5kIDxiPjxpPmF0dHJpYnV0ZVJlcGxhY2VkPC9pPjwvYj4gbWV0aG9kcyBhcmUgY2FsbGVkIHdoZW4gYW4gSHR0cFNlc3Npb24gYXR0cmlidXRlIGlzIHJlbW92ZWQgb3IgcmVwbGFjZWQsIHJlc3BlY3RpdmVseS48L2xpPg0KLTxsaT48Yj5qYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXI6PC9iPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0Lmh0dHAgcGFja2FnZSBhbmQgY2FuIGJlIHVzZWQgdG8gYmUgbm90aWZpZWQgd2hlbiBhbiBvYmplY3QgaXMgYm91bmQgdG8gb3IgdW5ib3VuZCBmcm9tIGEgc2Vzc2lvbi4gVGhpcyBpbnRlcmZhY2UgaGFzIHR3byBtZXRob2RzOiB2YWx1ZUJvdW5kIGFuZCB2YWx1ZVVuYm91bmQuIFRoZSA8Yj48aT52YWx1ZUJvdW5kPC9pPjwvYj4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBvYmplY3QgaXMgYmVpbmcgYm91bmQgdG8gYSBzZXNzaW9uIGFuZCBpZGVudGlmaWVzIHRoZSBzZXNzaW9uLiBUaGUgPGI+PGk+dmFsdWVVbmJvdW5kPC9pPjwvYj4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBvYmplY3QgaXMgYmVpbmcgdW5ib3VuZCBmcm9tIGEgc2Vzc2lvbiBhbmQgaWRlbnRpZmllcyB0aGUgc2Vzc2lvbi48L2xpPg0KLTwvdWw+IAk8L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+TW9kaWZpZXJzPC9kdD4NCi08ZGQ+VGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFNlcnZsZXQgMi4zIFNwZWNpZmljYXRpb248L2NpdGU+IHN0YXRlcyB0aGF0IGEgCUxpc3RlbmVyIGNsYXNzIG11c3QgYmUgPGI+cHVibGljPC9iPiBhbmQgbm90IDxiPmFic3RyYWN0PC9iPi4gVGhlcmVmb3JlLCAJeW91IGNhbm5vdCBjaGFuZ2UgdGhlc2UgbW9kaWZpZXJzLiBUaGUgb25seSBvbmUgYXZhaWxhYmxlIGZvciBjaGFuZ2UgaXMgCXRoZSA8Yj5maW5hbDwvYj4gbW9kaWZpZXIuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkludGVyZmFjZXM8L2R0Pg0KLTxkZD5UaGUgaW50ZXJmYWNlcyB0aGF0IHlvdSBzZWxlY3RlZCBpbiB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgd2l6YXJkIAlhcmUgcHJvdmlkZWQgYXMgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIDxiPkludGVyZmFjZXM8L2I+IGZpZWxkLiBUbyBhZGQgCWFkZGl0aW9uYWwgaW50ZXJmYWNlcywgY2xpY2sgdGhlIDxiPkFkZDwvYj4gYnV0dG9uIG5leHQgdG8gdGhpcyBmaWVsZC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SW50ZXJmYWNlIHNlbGVjdGlvbiBkaWFsb2c8L2R0Pg0KLTxkZD5UaGlzIGRpYWxvZyBhcHBlYXJzIGlmIHlvdSBzZWxlY3QgdG8gYWRkIGFuIGludGVyZmFjZSB0byB5b3VyIAlzZXJ2bGV0LiBBcyB5b3UgdHlwZSB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgeW91IGFyZSBhZGRpbmcsIGEgCWxpc3Qgb2YgYXZhaWxhYmxlIGludGVyZmFjZXMgbGlzdGVkIGluIHRoZSA8Yj5NYXRjaGluZyBpdGVtczwvYj4gbGlzdCBib3ggCXVwZGF0ZXMgZHluYW1pY2FsbHkgdG8gZGlzcGxheSBvbmx5IHRoZSBpbnRlcmZhY2VzIHRoYXQgbWF0Y2ggdGhlIAlwYXR0ZXJuLiBDaG9vc2UgYW4gaW50ZXJmYWNlIHRvIHNlZSB0aGUgcXVhbGlmaWVyLCBhbmQgdGhlbiBjbGljayA8Yj5PSzwvYj4gCXdoZW4gZmluaXNoZWQuPC9kZD4NCi08L2RsZW50cnk+PC9kbD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3bHN0d2l6Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdsc3R3aXouaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ2MmNjNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdsc3R3aXouaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIExpc3RlbmVycyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgbGlzdGVuZXIgd2l6YXJkIGhlbHBzIHlvdSBjcmVhdGUgYXBwbGljYXRpb24gbGlmZWN5Y2xlIGxpc3RlbmVycyBieSB3YWxraW5nIHlvdSB0aHJvdWdoIHRoZSBjcmVhdGlvbiBwcm9jZXNzIGFuZCBieSBwcm92aWRpbmcgeW91IHdpdGggb3V0cHV0IGZpbGVzIHRoYXQgeW91IGNhbiB1c2Ugb3IgdGhhdCB5b3UgY2FuIG1vZGlmeSBmb3IgdXNlIHdpdGggeW91ciBXZWIgYXBwbGljYXRpb24uIFRoZSBsaXN0ZW5lcnMgY2FuIHJ1biBvbiBKYXZhIEVFLWNvbXBsaWFudCBXZWIgc2VydmVycy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIGxpc3RlbmVyIHdpemFyZCBoZWxwcyB5b3UgY3JlYXRlIGFwcGxpY2F0aW9uIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYnkgd2Fsa2luZyB5b3UgdGhyb3VnaCB0aGUgY3JlYXRpb24gcHJvY2VzcyBhbmQgYnkgcHJvdmlkaW5nIHlvdSB3aXRoIG91dHB1dCBmaWxlcyB0aGF0IHlvdSBjYW4gdXNlIG9yIHRoYXQgeW91IGNhbiBtb2RpZnkgZm9yIHVzZSB3aXRoIHlvdXIgV2ViIGFwcGxpY2F0aW9uLiBUaGUgbGlzdGVuZXJzIGNhbiBydW4gb24gSmF2YSBFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuIiAvPgotPG1ldGEgY29udGVudD0ic2VydmxldHMsIGNyZWF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic2VydmxldHMsIGNyZWF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3bGlzdGJuLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdsc3R3aXoiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBMaXN0ZW5lcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3bHN0d2l6Ij48YSBuYW1lPSJ0d2xzdHdpeiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgTGlzdGVuZXJzPC9oMT4KLQotCi0KLTxkaXY+PHA+VGhlIGxpc3RlbmVyIHdpemFyZCBoZWxwcyB5b3UgY3JlYXRlIGFwcGxpY2F0aW9uIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYnkgd2Fsa2luZyB5b3UgdGhyb3VnaCB0aGUgY3JlYXRpb24gcHJvY2VzcyBhbmQgYnkgcHJvdmlkaW5nIHlvdSB3aXRoIG91dHB1dCBmaWxlcyB0aGF0IHlvdSBjYW4gdXNlIG9yIHRoYXQgeW91IGNhbiBtb2RpZnkgZm9yIHVzZSB3aXRoIHlvdXIgV2ViIGFwcGxpY2F0aW9uLiBUaGUgbGlzdGVuZXJzIGNhbiBydW4gb24gSmF2YSBFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+VG8gY3JlYXRlIGEgbGlzdGVuZXIsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6IDwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gdGhlIEphdmEgRUUgcGVyc3BlY3RpdmUsIGV4cGFuZCB5b3VyICA8YSBocmVmPSJjY3dlYnByai5odG1sIiB0aXRsZT0iIj5keW5hbWljIHByb2plY3Q8L2E+IGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgb24gdGhlIDxzdHJvbmc+TGlzdGVuZXI8L3N0cm9uZz4gaWNvbiwgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5MaXN0ZW5lcjwvc3Bhbj48L3NwYW4+IGZyb20gdGhlIHBvcC11cCBtZW51Ljwvc3Bhbj4gIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgTGlzdGVuZXI8L3NwYW4+IHdpemFyZCBhcHBlYXJzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Rm9sbG93IHRoZSBwcm9qZWN0IHdpemFyZCBwcm9tcHRzLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+QXBwbGljYXRpb24gbGlmZWN5Y2xlIGxpc3RlbmVyczwvZHQ+Ci0KLTxkZD5UaGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKYXZh4oSiIFNlcnZsZXQgMi4zIFNwZWNpZmljYXRpb248L2NpdGU+ZGVmaW5lcyB0aGUgCWZvbGxvd2luZyBpbnRlcmZhY2VzIHRoYXQgcmVwcmVzZW50IHRoYXQgYXBwbGljYXRpb24gbGlmZWN5Y2xlIAlsaXN0ZW5lcnMuIFlvdSBzaG91bGQgc2VsZWN0IGF0IGxlYXN0IG9uZSBvZiB0aGUgaW50ZWZhY2VzLiAJPHVsPgotPGxpPjxzdHJvbmc+amF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dExpc3RlbmVyOjwvc3Ryb25nPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0IHBhY2thZ2UgYW5kIGNhbiBiZSB1c2VkIHRvIGxpc3RlbiB0byB0aGUgU2VydmxldENvbnRleHQgbGlmZS1jeWNsZSBldmVudHMuIFRoaXMgaW50ZXJmYWNlIGhhcyB0d28gbWV0aG9kczogY29udGV4dEluaXRpYWxpemVkIGFuZCBjb250ZXh0RGVzdHJveWVkLiBUaGUgPHN0cm9uZz48ZW0+Y29udGV4dEluaXRpYWxpemVkPC9lbT48L3N0cm9uZz4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB3ZWIgYXBwbGljYXRpb24gaXMgcmVhZHkgdG8gc2VydmljZSByZXF1ZXN0cyBhbmQgdGhlIDxzdHJvbmc+PGVtPmNvbnRleHREZXN0cm95ZWQ8L2VtPjwvc3Ryb25nPiBtZXRob2QgaXMgaW52b2tlZCB3aGVuIHRoZSBzZXJ2bGV0IGNvbnRleHQgaXMgYWJvdXQgdG8gYmUgc2h1dCBkb3duLjwvbGk+Ci0KLTxsaT48c3Ryb25nPmphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRBdHRyaWJ1dGVMaXN0ZW5lcjo8L3N0cm9uZz4gVGhpcyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgYnkgamF2YXguc2VydmxldCBwYWNrYWdlLiBJdCBjYW4gYmUgdXNlZCB0byBiZSBub3RpZmllZCB3aGVuIGFueSBhdHRyaWJ1dGUgaXMgYWRkZWQgdG8gdGhlIFNlcnZsZXRDb250ZXh0IG9yIGlmIGFueSBvZiB0aGUgU2VydmxldENvbnRleHQncyBhdHRyaWJ1dGVzIGFyZSBjaGFuZ2VkIG9yIHJlbW92ZWQuIFRoaXMgaW5ldGZhY2UgaGFzIHRocmVlIG1ldGhvZHM6IDxzdHJvbmc+PGVtPmF0dHJpYnV0ZUFkZGVkLCBhdHRyaWJ1dGVSZW1vdmVkPC9lbT48L3N0cm9uZz4gYW5kIDxzdHJvbmc+PGVtPmF0dHJpYnV0ZVJlcGxhY2VkPC9lbT48L3N0cm9uZz4uPC9saT4KLQotPGxpPjxzdHJvbmc+amF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdExpc3RlbmVyOjwvc3Ryb25nPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0IHBhY2thZ2UuIEl0IGNhbiBiZSB1c2VkIHRvIGJlIG5vdGlmaWVkIHdoZW4gYSByZXF1ZXN0IGlzIGNvbWluZyBpbiBvciBvdXQgb2Ygc2NvcGUgaW4gYSBXZWIgY29tcG9uZW50LiBUaGlzIGludGVyZmFjZSBoYXMgdHdvIG1ldGhvZHM6IHJlcXVlc3RJbml0aWFsaXplZCBhbmQgcmVxdWVzdERlc3Ryb3llZC4gVGhlIDxzdHJvbmc+PGVtPnJlcXVlc3RJbml0aWFsaXplZDwvZW0+PC9zdHJvbmc+IG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBpdCBpcyBhYm91dCB0byBlbnRlciB0aGUgZmlyc3Qgc2VydmxldCBvciBmaWx0ZXIgaW4gZWFjaCBXZWIgYXBwbGljYXRpb24uIFRoZSA8c3Ryb25nPjxlbT5yZXF1ZXN0RGVzdHJveWVkPC9lbT48L3N0cm9uZz4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGl0IGV4aXRzIHRoZSBsYXN0IHNlcnZsZXQgb3IgdGhlIGZpcnN0IGZpbHRlciBpbiB0aGUgY2hhaW4uPC9saT4KLQotPGxpPjxzdHJvbmc+amF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyOjwvc3Ryb25nPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0IHBhY2thZ2UgYW5kIGNhbiBiZSB1c2VkIHRvIGJlIG5vdGlmaWVkIHdoZW4gYW55IHJlcXVlc3QgYXR0cmlidXRlIGlzIGNoYW5nZWQuIFRoaXMgaW50ZXJmYWNlIGhhcyB0aHJlZSBtZXRob2RzOiBhdHRyaWJ1dGVBZGRlZCwgYXR0cmlidXRlUmVtb3ZlZCBhbmQgYXR0cmlidXRlUmVwbGFjZWQuIFRoZSA8c3Ryb25nPjxlbT5hdHRyaWJ1dHRlQWRkZWQ8L2VtPjwvc3Ryb25nPiBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBuZXcgYXR0cmlidXRlIHdhcyBhZGRlZCB0byBzZXJ2bGV0IHJlcXVlc3QuIFRoZSA8c3Ryb25nPjxlbT5hdHRyaWJ1dGVSZW1vdmVkPC9lbT48L3N0cm9uZz4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGV4aXN0aW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4gVGhlIDxzdHJvbmc+PGVtPmF0dHJpYnV0ZVJlcGxhY2VkPC9lbT48L3N0cm9uZz4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSB3YXMgcmVwbGFjZWQgb24gdGhlIHNlcnZsZXQgcmVxdWVzdC48L2xpPgotCi08bGk+PHN0cm9uZz5qYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25MaXN0ZW5lcjo8L3N0cm9uZz4gVGhpcyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgYnkgamF2YXguc2VydmxldC5odHRwIHBhY2thZ2UgYW5kIGNhbiBiZSB1c2VkIHRvIGxpc3RlbiB0byBhIHNlc3Npb25zIGxpZmUgY3ljbGUgZXZlbnRzLiBUaGlzIGludGVyZmFjZSBoYXMgdHdvIG1ldGhvZHM6IHNlc3Npb25DcmVhdGVkIGFuZCBzZXNzaW9uRGVzdHJveWVkLiBUaGUgPHN0cm9uZz48ZW0+c2Vzc2lvbkNyZWF0ZWQ8L2VtPjwvc3Ryb25nPiAgCW1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBIdHRwU2Vzc2lvbiBvYmplY3QgaXMgY3JlYXRlZC4gVGhlIDxzdHJvbmc+PGVtPnNlc3Npb25EZXN0cm95ZWQ8L2VtPjwvc3Ryb25nPiBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gSHR0cFNlc3Npb24gb2JqZWN0IGlzIGludmFsaWRhdGVkLjwvbGk+Ci0KLTxsaT48c3Ryb25nPmphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lcjo8L3N0cm9uZz4gVGhpcyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgYnkgamF2YXguc2VydmxldC5odHRwIHBhY2thZ2UuIEl0IGNhbiBiZSB1c2VkIHRvIGxpc3RlbiB0byBhIGNvbnRhaW5lciBldmVudHMgbm90aWZ5aW5nIHRoYXQgc2Vzc2lvbnMgd2lsbCBiZSBwYXNzaXZhdGVkIG9yIGFjdGl2YXRlZC4gVGhpcyBpbnRlcmZhY2UgaGFzIHR3byBtZXRob2RzOiBzZXNzaW9uRGlkQWN0aXZhdGUgYW5kIHNlc3Npb25XaWxsUGFzaXZhdGUuIFRoZSA8c3Ryb25nPjxlbT5zZXNzaW9uRGlkQWN0aXZhdGU8L2VtPjwvc3Ryb25nPiBpcyBjYWxsZWQgd2hlbiB0aGUgc2Vzc2lvbiBoYXMganVzdCBiZWVuIGFjdGl2YXRlZCBhbmQgdGhlIDxzdHJvbmc+PGVtPnNlc3Npb25XaWxsUGFzaXZhdGU8L2VtPjwvc3Ryb25nPiBpcyBjYWxsZWQgd2hlbiB0aGUgc2Vzc2lvbiBpcyBhYm91dCB0byBiZSBwYXNzaXZhdGVkLjwvbGk+Ci0KLTxsaT48c3Ryb25nPmphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyOjwvc3Ryb25nPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0Lmh0dHAgcGFja2FnZSBhbmQgY2FuIGJlIHVzZWQgdG8gbGlzdGVuIHRvIGV2ZW50cyByZWxhdGVkIHRvIHNlc3Npb24gYXR0cmlidXRlcy4gVGhpcyBpbnRlcmZhY2UgaGFzIHRocmVlIG1ldGhvZHM6IGF0dHJpYnV0ZUFkZGVkLCBhdHRyaWJ1dGVSZW1vdmVkIGFuZCBhdHRyaWJ1dGVSZXBsYWNlZC4gVGhlIDxzdHJvbmc+PGVtPmF0dHJpYnV0ZUFkZGVkPC9lbT48L3N0cm9uZz4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBpcyBhZGRlZCB0byBhbiBIdHRwU2Vzc2lvbiBvYmplY3QuIFRoZSA8c3Ryb25nPjxlbT5hdHRyaWJ1dGVSZW1vdmVkPC9lbT48L3N0cm9uZz4gYW5kIDxzdHJvbmc+PGVtPmF0dHJpYnV0ZVJlcGxhY2VkPC9lbT48L3N0cm9uZz4gbWV0aG9kcyBhcmUgY2FsbGVkIHdoZW4gYW4gSHR0cFNlc3Npb24gYXR0cmlidXRlIGlzIHJlbW92ZWQgb3IgcmVwbGFjZWQsIHJlc3BlY3RpdmVseS48L2xpPgotCi08bGk+PHN0cm9uZz5qYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXI6PC9zdHJvbmc+IFRoaXMgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIGJ5IGphdmF4LnNlcnZsZXQuaHR0cCBwYWNrYWdlIGFuZCBjYW4gYmUgdXNlZCB0byBiZSBub3RpZmllZCB3aGVuIGFuIG9iamVjdCBpcyBib3VuZCB0byBvciB1bmJvdW5kIGZyb20gYSBzZXNzaW9uLiBUaGlzIGludGVyZmFjZSBoYXMgdHdvIG1ldGhvZHM6IHZhbHVlQm91bmQgYW5kIHZhbHVlVW5ib3VuZC4gVGhlIDxzdHJvbmc+PGVtPnZhbHVlQm91bmQ8L2VtPjwvc3Ryb25nPiBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCBpcyBiZWluZyBib3VuZCB0byBhIHNlc3Npb24gYW5kIGlkZW50aWZpZXMgdGhlIHNlc3Npb24uIFRoZSA8c3Ryb25nPjxlbT52YWx1ZVVuYm91bmQ8L2VtPjwvc3Ryb25nPiBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCBpcyBiZWluZyB1bmJvdW5kIGZyb20gYSBzZXNzaW9uIGFuZCBpZGVudGlmaWVzIHRoZSBzZXNzaW9uLjwvbGk+Ci0KLTwvdWw+Ci0gCTwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPk1vZGlmaWVyczwvZHQ+Ci0KLTxkZD5UaGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKYXZhIFNlcnZsZXQgMi4zIFNwZWNpZmljYXRpb248L2NpdGU+IHN0YXRlcyB0aGF0IGEgCUxpc3RlbmVyIGNsYXNzIG11c3QgYmUgPHN0cm9uZz5wdWJsaWM8L3N0cm9uZz4gYW5kIG5vdCA8c3Ryb25nPmFic3RyYWN0PC9zdHJvbmc+LiBUaGVyZWZvcmUsIAl5b3UgY2Fubm90IGNoYW5nZSB0aGVzZSBtb2RpZmllcnMuIFRoZSBvbmx5IG9uZSBhdmFpbGFibGUgZm9yIGNoYW5nZSBpcyAJdGhlIDxzdHJvbmc+ZmluYWw8L3N0cm9uZz4gbW9kaWZpZXIuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SW50ZXJmYWNlczwvZHQ+Ci0KLTxkZD5UaGUgaW50ZXJmYWNlcyB0aGF0IHlvdSBzZWxlY3RlZCBpbiB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgd2l6YXJkIAlhcmUgcHJvdmlkZWQgYXMgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIDxzdHJvbmc+SW50ZXJmYWNlczwvc3Ryb25nPiBmaWVsZC4gVG8gYWRkIAlhZGRpdGlvbmFsIGludGVyZmFjZXMsIGNsaWNrIHRoZSA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24gbmV4dCB0byB0aGlzIGZpZWxkLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkludGVyZmFjZSBzZWxlY3Rpb24gZGlhbG9nPC9kdD4KLQotPGRkPlRoaXMgZGlhbG9nIGFwcGVhcnMgaWYgeW91IHNlbGVjdCB0byBhZGQgYW4gaW50ZXJmYWNlIHRvIHlvdXIgCXNlcnZsZXQuIEFzIHlvdSB0eXBlIHRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCB5b3UgYXJlIGFkZGluZywgYSAJbGlzdCBvZiBhdmFpbGFibGUgaW50ZXJmYWNlcyBsaXN0ZWQgaW4gdGhlIDxzdHJvbmc+TWF0Y2hpbmcgaXRlbXM8L3N0cm9uZz4gbGlzdCBib3ggCXVwZGF0ZXMgZHluYW1pY2FsbHkgdG8gZGlzcGxheSBvbmx5IHRoZSBpbnRlcmZhY2VzIHRoYXQgbWF0Y2ggdGhlIAlwYXR0ZXJuLiBDaG9vc2UgYW4gaW50ZXJmYWNlIHRvIHNlZSB0aGUgcXVhbGlmaWVyLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+IAl3aGVuIGZpbmlzaGVkLjwvZGQ+Ci0KLTwvZGw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3dsaXN0Ym4uaHRtbCI+TGlzdGVuZXJzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BjbnZydC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGNudnJ0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOTg5MGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGNudnJ0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3cGNudnJ0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Db252ZXJ0aW5nIHN0YXRpYyBXZWIgcHJvamVjdHMgdG8gZHluYW1pYyBXZWIgcHJvamVjdHM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnN0YXRpYyBXZWIgcHJvamVjdHM8aW5kZXh0ZXJtPmNvbnZlcnRpbmcgdG8gZHluYW1pYzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+V2ViIHByb2plY3RzPGluZGV4dGVybT5jb252ZXJ0aW5nIHN0YXRpYyB0byBkeW5hbWljPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+IElmIHlvdSB3YW50IHRvIGFkZCBkeW5hbWljIGVsZW1lbnRzIHRvIGEgc3RhdGljIHdlYiBwcm9qZWN0LA0KLXN1Y2ggYXMgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iDQotdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gc2VydmxldHMgYW5kIEpTUCBmaWxlcywgeW91IG11c3QgY29udmVydCB0aGUgcHJvamVjdA0KLWZyb20gYSBzdGF0aWMgdG8gYSBkeW5hbWljIG9uZS4gVG8gY29udmVydCBhIHN0YXRpYyBXZWIgcHJvamVjdCB0byBhIGR5bmFtaWMNCi1XZWIgcHJvamVjdCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIHByb2plY3QgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldywgYW5kIHRoZW4gc2VsZWN0IDxwaD48dWljb250cm9sPkNvbnZlcnQNCi10byBhIER5bmFtaWMgV2ViIFByb2plY3Q8L3VpY29udHJvbD48L3BoPiBmcm9tIHRoZSA8Yj5Qcm9qZWN0PC9iPiBtZW51LjwvY21kPg0KLTxpbmZvPlRoaXMgY29udmVyc2lvbiBhc3N1bWVzIHRoZSAgcHJvamVjdCBuYW1lIGFuZCBsb2NhdGlvbiB3aWxsIGJlIHRoZSBzYW1lLg0KLVRoZSBjb252ZXJzaW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgQ1NTIGZpbGUgc3BlY2lmaWVkIGluIHRoZSBvcmlnaW5hbCBzdGF0aWMNCi1wcm9qZWN0LCBzbyBpdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgZHluYW1pYyBXZWIgcHJvamVjdC4gPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPiBTcGVjaWZ5IHRoZSBwcm9qZWN0IHByb3BlcnRpZXMgdGhhdCBhcmUgYXZhaWxhYmxlIHdoZW4gIDx4cmVmDQotaHJlZj0idHdjcmVwcmouZGl0YSIgc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz5DcmVhdGluZyBhIER5bmFtaWMgV2ViIHByb2plY3QuPC94cmVmPjwvY21kPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BjbnZydC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGNudnJ0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZWZiMjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGNudnJ0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDb252ZXJ0aW5nIHN0YXRpYyBXZWIgcHJvamVjdHMgdG8gZHluYW1pYyBXZWIgcHJvamVjdHMiIC8+Ci08bWV0YSBjb250ZW50PSJzdGF0aWMgV2ViIHByb2plY3RzLCBjb252ZXJ0aW5nIHRvIGR5bmFtaWMsIFdlYiBwcm9qZWN0cywgY29udmVydGluZyBzdGF0aWMgdG8gZHluYW1pYyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InN0YXRpYyBXZWIgcHJvamVjdHMsIGNvbnZlcnRpbmcgdG8gZHluYW1pYywgV2ViIHByb2plY3RzLCBjb252ZXJ0aW5nIHN0YXRpYyB0byBkeW5hbWljIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2Njc3RhdGljLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jY3dlYnByai5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3cGNudnJ0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q29udmVydGluZyBzdGF0aWMgV2ViIHByb2plY3RzIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d3BjbnZydCI+PGEgbmFtZT0idHdwY252cnQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNvbnZlcnRpbmcgc3RhdGljIFdlYiBwcm9qZWN0cyB0byBkeW5hbWljIFdlYiBwcm9qZWN0czwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD4gSWYgeW91IHdhbnQgdG8gYWRkIGR5bmFtaWMgZWxlbWVudHMgdG8gYSBzdGF0aWMgd2ViIHByb2plY3QsCi1zdWNoIGFzIEphdmHihKIgc2VydmxldHMgYW5kIEpTUCBmaWxlcywgeW91IG11c3QgY29udmVydCB0aGUgcHJvamVjdAotZnJvbSBhIHN0YXRpYyB0byBhIGR5bmFtaWMgb25lLiBUbyBjb252ZXJ0IGEgc3RhdGljIFdlYiBwcm9qZWN0IHRvIGEgZHluYW1pYwotV2ViIHByb2plY3QsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotIDwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgcHJvamVjdCBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udmVydAotdG8gYSBEeW5hbWljIFdlYiBQcm9qZWN0PC9zcGFuPjwvc3Bhbj4gZnJvbSB0aGUgPHN0cm9uZz5Qcm9qZWN0PC9zdHJvbmc+IG1lbnUuPC9zcGFuPgotIFRoaXMgY29udmVyc2lvbiBhc3N1bWVzIHRoZSAgcHJvamVjdCBuYW1lIGFuZCBsb2NhdGlvbiB3aWxsIGJlIHRoZSBzYW1lLgotVGhlIGNvbnZlcnNpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBDU1MgZmlsZSBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsIHN0YXRpYwotcHJvamVjdCwgc28gaXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIGR5bmFtaWMgV2ViIHByb2plY3QuIAotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4gU3BlY2lmeSB0aGUgcHJvamVjdCBwcm9wZXJ0aWVzIHRoYXQgYXJlIGF2YWlsYWJsZSB3aGVuICA8YSBocmVmPSJ0d2NyZXByai5odG1sIiB0aXRsZT0iIj5DcmVhdGluZyBhIER5bmFtaWMgV2ViIHByb2plY3QuPC9hPjwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2Njc3RhdGljLmh0bWwiPlN0YXRpYyBXZWIgcHJvamVjdHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jY3dlYnByai5odG1sIj5EeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BsaWIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BsaWIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExYmQzMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwbGliLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3cGxpYiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InR3cGxpYnwxfFdlYmxpYnJhcnlwcm9qZWN0c3ZpcnR1YWxKQVJmaWxlc2FuZHByb2plY3RzIg0KLXN0YXR1cz0iY2hhbmdlZCI+V2ViIHByb2plY3RzPGluZGV4dGVybT52aXJ0dWFsIEpBUiBmaWxlcyBhbmQgcHJvamVjdHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtIGtleXJlZj0idHdwbGlifDJ8dmlydHVhbEpBUmZpbGVzYXNzb2NpYXRpb25zV2VibGlicmFyeXByb2plY3RzIg0KLXN0YXR1cz0ibmV3Ij52aXJ0dWFsIEpBUiBmaWxlcyBhc3NvY2lhdGlvbnM8aW5kZXh0ZXJtPldlYiBsaWJyYXJ5IHByb2plY3RzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+V2ViIGxpYnJhcnkgcHJvamVjdHMgYWxsb3cgeW91IHRvIGFzc29jaWF0ZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBwcm9qZWN0cw0KLXdpdGggInZpcnR1YWwiIEpBUiBmaWxlcyBpbiBhIFdlYiBwcm9qZWN0J3MgV0VCLUlORi9saWIgZGlyZWN0b3J5LiBZb3UgY2FuDQotcmVmZXJlbmNlIEpBUiBmaWxlcyB0aGF0IGV4aXN0IGVsc2V3aGVyZSBpbiB0aGUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0DQotdGhhdCBjb250YWlucyB5b3VyIFdlYiBwcm9qZWN0LCBpZiB0aGV5IGFyZSBpbiB0aGUgV2ViIHByb2plY3QncyBidWlsZCBwYXRoLA0KLWFuZCBhdm9pZCB0aGUgbmVlZCB0byBleHBsaWNpdGx5IGNvcHkgdGhlc2UgSkFSIGZpbGVzIGludG8gdGhlIHByb2plY3QncyBsaWINCi1mb2xkZXIgYmVmb3JlIHlvdSBwdWJsaXNoIHRoZSBXZWIgYXBwbGljYXRpb24gdG8gYSBzZXJ2ZXIuPC9wPjxwPlRvIHNldCB1cA0KLXRoZXNlIGFzc29jaWF0aW9uczo8L3A+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5SaWdodCBjbGljayBvbiBhIFdlYiBwcm9qZWN0IGFuZCBzZWxlY3QgPHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+IGZyb20NCi10aGUgcG9wLXVwIG1lbnUuPC9jbWQ+PGluZm8+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIG9uIDx1aWNvbnRyb2w+SmF2YSBFRSBNb2R1bGUgRGVwZW5kZW5jaWVzPC91aWNvbnRyb2w+PC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2V0IHVwIHlvdXIgYXNzb2NpYXRpb25zIGluIHRoZSBKYXZhIEVFIE1vZHVsZSBEZXBlbmRlbmNpZXMgd2luZG93PC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHBoPjx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD48L3BoPiB3aGVuIHlvdSBhcmUgZG9uZS48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwbGliLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwbGliLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OTg3YzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGxpYi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzIiAvPgotPG1ldGEgY29udGVudD0iV2ViIHByb2plY3RzLCB2aXJ0dWFsIEpBUiBmaWxlcyBhbmQgcHJvamVjdHMsIHZpcnR1YWwgSkFSIGZpbGVzIGFzc29jaWF0aW9ucywgV2ViIGxpYnJhcnkgcHJvamVjdHMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcHJvamVjdHMsIHZpcnR1YWwgSkFSIGZpbGVzIGFuZCBwcm9qZWN0cywgdmlydHVhbCBKQVIgZmlsZXMgYXNzb2NpYXRpb25zLCBXZWIgbGlicmFyeSBwcm9qZWN0cyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdwbGliIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d3BsaWIiPjxhIG5hbWU9InR3cGxpYiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzPC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPldlYiBsaWJyYXJ5IHByb2plY3RzIGFsbG93IHlvdSB0byBhc3NvY2lhdGUgSmF2YeKEoiBwcm9qZWN0cwotd2l0aCAidmlydHVhbCIgSkFSIGZpbGVzIGluIGEgV2ViIHByb2plY3QncyBXRUItSU5GL2xpYiBkaXJlY3RvcnkuIFlvdSBjYW4KLXJlZmVyZW5jZSBKQVIgZmlsZXMgdGhhdCBleGlzdCBlbHNld2hlcmUgaW4gdGhlIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdAotdGhhdCBjb250YWlucyB5b3VyIFdlYiBwcm9qZWN0LCBpZiB0aGV5IGFyZSBpbiB0aGUgV2ViIHByb2plY3QncyBidWlsZCBwYXRoLAotYW5kIGF2b2lkIHRoZSBuZWVkIHRvIGV4cGxpY2l0bHkgY29weSB0aGVzZSBKQVIgZmlsZXMgaW50byB0aGUgcHJvamVjdCdzIGxpYgotZm9sZGVyIGJlZm9yZSB5b3UgcHVibGlzaCB0aGUgV2ViIGFwcGxpY2F0aW9uIHRvIGEgc2VydmVyLjwvcD4KLTxwPlRvIHNldCB1cAotdGhlc2UgYXNzb2NpYXRpb25zOjwvcD4KLSA8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayBvbiBhIFdlYiBwcm9qZWN0IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj4gZnJvbQotdGhlIHBvcC11cCBtZW51Ljwvc3Bhbj4gPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayBvbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5KYXZhIEVFIE1vZHVsZSBEZXBlbmRlbmNpZXM8L3NwYW4+PC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZXQgdXAgeW91ciBhc3NvY2lhdGlvbnMgaW4gdGhlIEphdmEgRUUgTW9kdWxlIERlcGVuZGVuY2llcyB3aW5kb3c8L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPjwvc3Bhbj4gd2hlbiB5b3UgYXJlIGRvbmUuPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3ByanNldC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cHJqc2V0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMjgyNjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cHJqc2V0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d3ByanNldCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U2V0dGluZyBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XZWIgcHJvamVjdHM8aW5kZXh0ZXJtPnByb3BlcnRpZXMgc2V0dGluZ3M8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD5UaGVyZSBhcmUgbWFueSBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzIHRoYXQgeW91IGNhbiBzZXQgdGhhdCBhZmZlY3QNCi10aGUgcGhhc2VzIGluIHRoZSBsaWZlY3ljbGUgb2YgeW91ciBwcm9qZWN0IGFuZCBpdHMgZGVwZW5kZW5jaWVzIG9uIG90aGVyDQotV2ViIHJlc291cmNlcyBhbmQgV2ViIGRldmVsb3BtZW50IHByb2Nlc3Nlcy4gWW91IG1pZ2h0IHdhbnQgdG8gdmVyaWZ5IG9yIHVwZGF0ZQ0KLXRoZXNlIHByb3BlcnRpZXMgYWZ0ZXIgeW91IGhhdmUgdXBkYXRlZCBhbiBleGlzdGluZyBwcm9qZWN0IG9yIGhhdmUgaW1wb3J0ZWQNCi1XZWIgcmVzb3VyY2VzIGludG8gYSBwcm9qZWN0IC48L3A+PHA+VG8gdmlldyBvciBzZXQgV2ViIHByb2plY3QgcHJvcGVydGllcywNCi1kbyB0aGUgZm9sbG93aW5nOiA8L3A+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5SaWdodC1jbGljayBvbiBhIFdlYiBQcm9qZWN0LCBhbmQgZnJvbSB0aGUgcG9wLXVwIG1lbnUgc2VsZWN0IDxwaD48dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD48L3BoPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgYSBwcm9wZXJ0eSB0eXBlIGluIHRoZSBsZWZ0IHBhbmUgb2YgdGhlIFByb3BlcnRpZXMgZGlhbG9nDQotdG8gdmlldyBvciB1cGRhdGUgcHJvcGVydGllcyBpbiB0aGUgV2ViIHByb2plY3QuIEZvciBlYWNoIHByb3BlcnR5LCB5b3UgY2FuDQotYXBwbHkgY2hhbmdlcyBhbmQgbW9kaWZ5IGRlZmF1bHQgc2V0dGluZ3MuIEJhc2VkIG9uIHdoZXRoZXIgeW91IGhhdmUgYSBzdGF0aWMNCi1vciBhIGR5bmFtaWMgV2ViIHByb2plY3QsIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkgdHlwZXMgYXJlIGF2YWlsYWJsZTo8L2NtZD4NCi08aW5mbz48ZGw+PGRsZW50cnk+DQotPGR0PkluZm88L2R0Pg0KLTxkZD5Qcm92aWRlcyBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHByb2plY3QgdHlwZSwgbG9jYXRpb24sIGFuZCBtb2RpZmljYXRpb24NCi1zdGF0dXMuIDwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5CZWFuSW5mbyBQYXRoIChEeW5hbWljIFdlYiBwcm9qZWN0IG9ubHkpPC9kdD4NCi08ZGQ+SWYgeW91IHNlbGVjdCB0aGUgRW5hYmxlIEJlYW5pbmZvIEludHJvc3BlY3Rpb24gb24gdGhpcyBwcm9qZWN0LCB5b3UgY2FuDQotc3BlY2lmeSB0aGUgY29udGVudHMgYW5kIG9yZGVyIG9mIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEJlYW4gc2VhcmNoIHBhdGhzIHRvIHByb3ZpZGUgQmVhbiBpbmZvcm1hdGlvbg0KLXJlbGV2YW50IHRvIHRoZSBwcm9qZWN0LiBZb3UgY2FuIGFkZCwgcmVtb3ZlLCBhbmQgcmVvcmRlciAodXNpbmcgdGhlIDxwaD5VcDwvcGg+IGFuZCA8cGg+RG93bjwvcGg+IGJ1dHRvbnMpDQotdGhlIHBhY2thZ2VzIHVzZWQgdG8gaW5jbHVkZSBCZWFuIGluZm9ybWF0aW9uLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5CdWlsZGVyczwvZHQ+DQotPGRkPkFkZCwgcmVtb3ZlLCBvciByZW9yZGVyIGV4dGVybmFsIHRvb2xzIGluIHRoZSBidWlsZCBvcmRlci4gV2hlbiB5b3Ugc2VsZWN0IDx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+IHRvDQotY3JlYXRlIGEgbmV3IGV4dGVybmFsIHRvb2wgdG8gdGhlIGxpc3QsIHRoZSBOZXcgRXh0ZXJuYWwgVG9vbCB3aXphcmQgb3BlbnMsDQotc28gdGhhdCB5b3UgY2FuIGRlZmluZSB0aGUgbmV3IGJ1aWxkIHRvb2wuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkphdmEgRUUgKER5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0Pg0KLTxkZD5JZGVudGlmeSBXZWIgbGV2ZWwgc3BlY2lmaWNhdGlvbiBhbmQgbW9kaWZ5IGNvbnRleHQgcm9vdCBhbmQgV2ViIGNvbnRlbnQNCi1mb2xkZXIgbmFtZTwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD48dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gQnVpbGQNCi1QYXRoIChEeW5hbWljIFdlYiBwcm9qZWN0IG9ubHkpPC9kdD4NCi08ZGQ+VmlldyBvciBjaGFuZ2UgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBidWlsZCBwYXRoIHRoYXQgeW91IHN1cHBsaWVkIHdoZW4gY3JlYXRpbmcNCi10aGUgcHJvamVjdCB1c2luZyB0aGUgPHBoPkNyZWF0ZSBhIER5bmFtaWNXZWIgUHJvamVjdDwvcGg+IHdpemFyZC4gV2hlbmV2ZXINCi10aGUgV2ViIHByb2plY3QgaXMgcmVidWlsdCwgYW55IGNsYXNzIGZpbGVzIHRoYXQgYXJlIGNyZWF0ZWQgb3IgdXBkYXRlZCB3aWxsDQotYmUgb3V0cHV0IHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IGZvbGRlci4gPG5vdGU+QSBsaWJyYXJ5IGVudHJ5IG9uIHRoZSA8dG0NCi10bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBidWlsZA0KLXBhdGggd2lsbCByZW1haW4gdGhlcmUgdW5sZXNzIHRoZSBhY3R1YWwgSkFSIGZpbGUgaXMgZGVsZXRlZCBmcm9tIHRoZSBXRUItSU5GL2xpYg0KLWZvbGRlci4gSWYgeW91IHJlbW92ZSBhIGxpYnJhcnkgcGF0aCBlbnRyeSBidXQgbm90IHRoZSBKQVIgZmlsZSwgdGhlIGxpYnJhcnkNCi1lbnRyeSB3aWxsIGJlIHJlLWFkZGVkIHRvIHRoZSBwYXRoIGF1dG9tYXRpY2FsbHkuPC9ub3RlPjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD48dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gQ29tcGlsZXINCi0oRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+DQotPGRkPkRlZmluZSB3aGV0aGVyIHRvIHVzZSB3b3Jrc3BhY2Ugc2V0dGluZ3Mgb3IgcHJvamVjdCBzZXR0aW5nIGZvciBjb21waWxpbmcgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gY29kZSwNCi1pbmNsdWRpbmcgc2V0dGluZ3MgZm9yIFByb2JsZW1zLCBTdHlsZSwgQ29tcGxpYW5jZSBhbmQgQ2xhc3NmaWxlcywgYW5kIEJ1aWxkDQotUGF0aC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SmF2YWRvYyBMb2NhdGlvbiAoRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+DQotPGRkPkRlZmluZSBhIGRlZmF1bHQgbG9jYXRpb24gKFVSTCkgZm9yIGFueSBKYXZhZG9jIGF2YWlsYWJsZSB0byB0aGUgcHJvamVjdC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+PHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEpBUg0KLURlcGVuZGVuY2llcyAoRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+DQotPGRkPkRlZmluZSBhbmQgcmVvcmRlciBKQVIgZGVwZW5kZW5jaWVzIGZvciB0aGUgcHJvamVjdC4gTm90ZSB0aGF0IHRoZXNlIGRlcGVuZGVuY2llcw0KLW1heSBkaWZmZXIgYmFzZWQgb24gYSBXZWIgcHJvamVjdCdzIGFzc29jaWF0aW9uIHdpdGggbXVsdGlwbGUgRW50ZXJwcmlzZSBhcHBsaWNhdGlvbg0KLXByb2plY3RzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5KU1AgVGFzayBUYWdzPC9kdD4NCi08ZGQ+QWRkLCBlZGl0LCBvciByZW1vdmUgSlNQIHRhc2sgdGFncyBhbmQgYXNzaWduIHRhZyBwcmlvcml0aWVzLiBUaGVzZSAidG8NCi1kbyIgaXRlbXMgYXBwZWFyIGluIHlvdXIgVGFza3Mgdmlldy48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SlNQIENvbXBpbGF0aW9uPC9kdD4NCi08ZGQ+U3BlY2lmeSB3aGVuIGluIHRoZSBidWlsZCBwcm9jZXNzIGEgSlNQIHNob3VsZCBiZSBzZXQgdG8gY29tcGlsZTwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5KU1AgRnJhZ21lbnQgKGR5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0Pg0KLTxkZD5EZWZpbmUgZGVmYXVsdCBlbmNvZGluZywgcGFnZSBkaXJlY3RpdmUsIGFuZCBjb250ZW50IHR5cGUgdmFsdWVzIGZvciBKU1ANCi1mcmFnbWVudCBkb2N1bWVudHMgaW4gdGhlIHdlYiBwcm9qZWN0LjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5MaW5rcyBWYWxpZGF0aW9uL1JlZmFjdG9yaW5nPC9kdD4NCi08ZGQ+RGVmaW5lIHByb2plY3QtbGV2ZWwgbGluayBtYW5hZ2VtZW50IGFuZCB2YWxpZGF0aW9uIHNldHRpbmdzLiBUaGVzZSBzZXR0aW5ncw0KLW92ZXJyaWRlIGNvcnJlc3BvbmRpbmcgc2V0dGluZ3MgaW4gdGhlIFdvcmtiZW5jaCBQcmVmZXJlbmNlIHNldHRpbmdzIGZvciB0aGUNCi1jdXJyZW50IHByb2plY3QuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PlByb2plY3QgUmVmZXJlbmNlczwvZHQ+DQotPGRkPlJlZmVyZW5jZSBvdGhlciBXZWIgcHJvamVjdHMgdGhhdCBleGlzdCBvbiB5b3VyIHdvcmtiZW5jaCB3b3Jrc3BhY2UuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PlNlcnZlcjwvZHQ+DQotPGRkPlNlbGVjdCB0aGUgc2VydmVyIGluc3RhbmNlIHVzZWQgdG8gcGVyZm9ybSBuZWNlc3NhcnkgZGV2ZWxvcG1lbnQsIHRlc3QsDQotYW5kIHB1Ymxpc2hpbmcgZnVuY3Rpb25zIGZvciB0aGUgcHJvamVjdC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+VmFsaWRhdGlvbjwvZHQ+DQotPGRkPlNwZWNpZnkgd2hpY2ggdmFsaWRhdG9ycyBzaG91bGQgcnVuIGZvciB0aGUgcHJvamVjdCwgYW5kIHdoZXRoZXIgdmFsaWRhdGlvbg0KLXNob3VsZCBvY2N1ciBhdXRvbWF0aWNhbGx5IHdoZW4gcmVzb3VyY2UgdXBkYXRlcyBhcmUgd3JpdHRlbiB0byB0aGUgcHJvamVjdC4NCi1UaGUgYXZhaWxhYmxlIHZhbGlkYXRvcnMgYXJlIGJhc2VkIG9uIHRoZSB0eXBlcyBvZiByZXNvdXJjZXMgaW4geW91ciBwcm9qZWN0Lg0KLUJ5IGRlZmF1bHQsIHZhbGlkYXRvcnMgYXJlIGF1dG9tYXRpY2FsbHkgcnVuIHdoZW4geW91IHNhdmUgcmVzb3VyY2VzIGluIGENCi1XZWIgcHJvamVjdC4gSWYgeW91IGRvIG5vdCB3YW50IHZhbGlkYXRvcnMgdG8gcnVuIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3Ugc2F2ZQ0KLXRoZXNlIHJlc291cmNlcywgZW5hYmxlIHRoZSA8dWljb250cm9sPk92ZXJyaWRlIHZhbGlkYXRpb248L3VpY29udHJvbD4gcHJlZmVyZW5jZXMNCi1vcHRpb24gYW5kIGRpc2FibGUgdGhlIDx1aWNvbnRyb2w+UnVuIHZhbGlkYXRpb24gYXV0b21hdGljYWxseSB3aGVuIHlvdSBzYXZlDQotY2hhbmdlcyB0byByZXNvdXJjZXM8L3VpY29udHJvbD4gb3B0aW9uLiA8bm90ZT5Zb3UgY2FuIGFsc28gIGRpc2FibGUgYXV0b21hdGljDQotdmFsaWRhdGlvbiAoYW5kIGJ1aWxkcykgZm9yIGFsbCBwcm9qZWN0cyBieSBkaXNhYmxpbmcgPHVpY29udHJvbD5QZXJmb3JtIGJ1aWxkDQotIGF1dG9tYXRpY2FsbHkgb24gcmVzb3VyY2UgbW9kaWZpY2F0aW9uPC91aWNvbnRyb2w+IGZyb20gdGhlIDx1aWNvbnRyb2w+V29ya2JlbmNoPC91aWNvbnRyb2w+IHByb3BlcnRpZXMuDQotSWYgIHlvdSBkaXNhYmxlIGF1dG9tYXRpYyBidWlsZHMsIHlvdSBjYW4gbWFudWFsbHkgIHJ1biBhIGJ1aWxkIChhbmQgdmFsaWRhdGlvbikNCi1ieSBzZWxlY3RpbmcgIDxtZW51Y2FzY2FkZT48dWljb250cm9sPlByb2plY3Q8L3VpY29udHJvbD48dWljb250cm9sPlJlYnVpbGQNCi1wcm9qZWN0PC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9ub3RlPjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5XZWIgQ29udGVudCBTZXR0aW5nczwvZHQ+DQotPGRkPlByb3ZpZGUgYW55IGFwcGxpY2FibGUgV2ViIGNvbnRlbnQgc2V0dGluZ3MgZm9yIGEgV2ViIHByb2plY3QuIFlvdSBjYW4NCi1zcGVjaWZ5IHRoZSBkb2N1bWVudCB0eXBlLCBDU1MgcHJvZmlsZSwgYW5kIHRhcmdldCBkZXZpY2UuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PldlYiBQcm9qZWN0IEZlYXR1cmVzPC9kdD4NCi08ZGQ+U2VsZWN0IHRoZSBmZWF0dXJlcyB5b3Ugd2FudCB0byBiZSBlbmFibGVkIGZvciB5b3VyIFdlYiBwcm9qZWN0LCBzdWNoDQotYXMgUGFnZSBUZW1wbGF0ZSBzdXBwb3J0LjwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPldoZW4geW91IGhhdmUgY29tcGxldGVkIHVwZGF0ZXMgdG8gV2ViIHByb2plY3Qgc2V0dGluZ3MsIGNsaWNrIDxwaD48dWljb250cm9sPk9LPC91aWNvbnRyb2w+PC9waD4gdG8NCi1zYXZlIGFuZCBjbG9zZSB0aGUgUHJvcGVydGllcyBkaWFsb2cuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cHJqc2V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwcmpzZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFkMWU0MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwcmpzZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZXR0aW5nIFdlYiBwcm9qZWN0IHByb3BlcnRpZXMiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcHJvamVjdHMsIHByb3BlcnRpZXMgc2V0dGluZ3MiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcHJvamVjdHMsIHByb3BlcnRpZXMgc2V0dGluZ3MiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3cHJqc2V0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U2V0dGluZyBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d3ByanNldCI+PGEgbmFtZT0idHdwcmpzZXQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNldHRpbmcgV2ViIHByb2plY3QgcHJvcGVydGllczwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5UaGVyZSBhcmUgbWFueSBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzIHRoYXQgeW91IGNhbiBzZXQgdGhhdCBhZmZlY3QKLXRoZSBwaGFzZXMgaW4gdGhlIGxpZmVjeWNsZSBvZiB5b3VyIHByb2plY3QgYW5kIGl0cyBkZXBlbmRlbmNpZXMgb24gb3RoZXIKLVdlYiByZXNvdXJjZXMgYW5kIFdlYiBkZXZlbG9wbWVudCBwcm9jZXNzZXMuIFlvdSBtaWdodCB3YW50IHRvIHZlcmlmeSBvciB1cGRhdGUKLXRoZXNlIHByb3BlcnRpZXMgYWZ0ZXIgeW91IGhhdmUgdXBkYXRlZCBhbiBleGlzdGluZyBwcm9qZWN0IG9yIGhhdmUgaW1wb3J0ZWQKLVdlYiByZXNvdXJjZXMgaW50byBhIHByb2plY3QgLjwvcD4KLTxwPlRvIHZpZXcgb3Igc2V0IFdlYiBwcm9qZWN0IHByb3BlcnRpZXMsCi1kbyB0aGUgZm9sbG93aW5nOiA8L3A+Ci0gPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQtY2xpY2sgb24gYSBXZWIgUHJvamVjdCwgYW5kIGZyb20gdGhlIHBvcC11cCBtZW51IHNlbGVjdCA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgYSBwcm9wZXJ0eSB0eXBlIGluIHRoZSBsZWZ0IHBhbmUgb2YgdGhlIFByb3BlcnRpZXMgZGlhbG9nCi10byB2aWV3IG9yIHVwZGF0ZSBwcm9wZXJ0aWVzIGluIHRoZSBXZWIgcHJvamVjdC4gRm9yIGVhY2ggcHJvcGVydHksIHlvdSBjYW4KLWFwcGx5IGNoYW5nZXMgYW5kIG1vZGlmeSBkZWZhdWx0IHNldHRpbmdzLiBCYXNlZCBvbiB3aGV0aGVyIHlvdSBoYXZlIGEgc3RhdGljCi1vciBhIGR5bmFtaWMgV2ViIHByb2plY3QsIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkgdHlwZXMgYXJlIGF2YWlsYWJsZTo8L3NwYW4+Ci0gPGRsPgotPGR0IGNsYXNzPSJkbHRlcm0iPkluZm88L2R0PgotCi08ZGQ+UHJvdmlkZXMgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBwcm9qZWN0IHR5cGUsIGxvY2F0aW9uLCBhbmQgbW9kaWZpY2F0aW9uCi1zdGF0dXMuIDwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkJlYW5JbmZvIFBhdGggKER5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0PgotCi08ZGQ+SWYgeW91IHNlbGVjdCB0aGUgRW5hYmxlIEJlYW5pbmZvIEludHJvc3BlY3Rpb24gb24gdGhpcyBwcm9qZWN0LCB5b3UgY2FuCi1zcGVjaWZ5IHRoZSBjb250ZW50cyBhbmQgb3JkZXIgb2YgSmF2YeKEoiBCZWFuIHNlYXJjaCBwYXRocyB0byBwcm92aWRlIEJlYW4gaW5mb3JtYXRpb24KLXJlbGV2YW50IHRvIHRoZSBwcm9qZWN0LiBZb3UgY2FuIGFkZCwgcmVtb3ZlLCBhbmQgcmVvcmRlciAodXNpbmcgdGhlIDxzcGFuPlVwPC9zcGFuPiBhbmQgPHNwYW4+RG93bjwvc3Bhbj4gYnV0dG9ucykKLXRoZSBwYWNrYWdlcyB1c2VkIHRvIGluY2x1ZGUgQmVhbiBpbmZvcm1hdGlvbi48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5CdWlsZGVyczwvZHQ+Ci0KLTxkZD5BZGQsIHJlbW92ZSwgb3IgcmVvcmRlciBleHRlcm5hbCB0b29scyBpbiB0aGUgYnVpbGQgb3JkZXIuIFdoZW4geW91IHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+IHRvCi1jcmVhdGUgYSBuZXcgZXh0ZXJuYWwgdG9vbCB0byB0aGUgbGlzdCwgdGhlIE5ldyBFeHRlcm5hbCBUb29sIHdpemFyZCBvcGVucywKLXNvIHRoYXQgeW91IGNhbiBkZWZpbmUgdGhlIG5ldyBidWlsZCB0b29sLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkphdmEgRUUgKER5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0PgotCi08ZGQ+SWRlbnRpZnkgV2ViIGxldmVsIHNwZWNpZmljYXRpb24gYW5kIG1vZGlmeSBjb250ZXh0IHJvb3QgYW5kIFdlYiBjb250ZW50Ci1mb2xkZXIgbmFtZTwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkphdmEgQnVpbGQKLVBhdGggKER5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0PgotCi08ZGQ+VmlldyBvciBjaGFuZ2UgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBKYXZhIGJ1aWxkIHBhdGggdGhhdCB5b3Ugc3VwcGxpZWQgd2hlbiBjcmVhdGluZwotdGhlIHByb2plY3QgdXNpbmcgdGhlIDxzcGFuPkNyZWF0ZSBhIER5bmFtaWNXZWIgUHJvamVjdDwvc3Bhbj4gd2l6YXJkLiBXaGVuZXZlcgotdGhlIFdlYiBwcm9qZWN0IGlzIHJlYnVpbHQsIGFueSBjbGFzcyBmaWxlcyB0aGF0IGFyZSBjcmVhdGVkIG9yIHVwZGF0ZWQgd2lsbAotYmUgb3V0cHV0IHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IGZvbGRlci4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEEgbGlicmFyeSBlbnRyeSBvbiB0aGUgSmF2YSBidWlsZAotcGF0aCB3aWxsIHJlbWFpbiB0aGVyZSB1bmxlc3MgdGhlIGFjdHVhbCBKQVIgZmlsZSBpcyBkZWxldGVkIGZyb20gdGhlIFdFQi1JTkYvbGliCi1mb2xkZXIuIElmIHlvdSByZW1vdmUgYSBsaWJyYXJ5IHBhdGggZW50cnkgYnV0IG5vdCB0aGUgSkFSIGZpbGUsIHRoZSBsaWJyYXJ5Ci1lbnRyeSB3aWxsIGJlIHJlLWFkZGVkIHRvIHRoZSBwYXRoIGF1dG9tYXRpY2FsbHkuPC9kaXY+Ci08L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5KYXZhIENvbXBpbGVyCi0oRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+Ci0KLTxkZD5EZWZpbmUgd2hldGhlciB0byB1c2Ugd29ya3NwYWNlIHNldHRpbmdzIG9yIHByb2plY3Qgc2V0dGluZyBmb3IgY29tcGlsaW5nIEphdmEgY29kZSwKLWluY2x1ZGluZyBzZXR0aW5ncyBmb3IgUHJvYmxlbXMsIFN0eWxlLCBDb21wbGlhbmNlIGFuZCBDbGFzc2ZpbGVzLCBhbmQgQnVpbGQKLVBhdGguPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SmF2YWRvYyBMb2NhdGlvbiAoRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+Ci0KLTxkZD5EZWZpbmUgYSBkZWZhdWx0IGxvY2F0aW9uIChVUkwpIGZvciBhbnkgSmF2YWRvYyBhdmFpbGFibGUgdG8gdGhlIHByb2plY3QuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SmF2YSBKQVIKLURlcGVuZGVuY2llcyAoRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+Ci0KLTxkZD5EZWZpbmUgYW5kIHJlb3JkZXIgSkFSIGRlcGVuZGVuY2llcyBmb3IgdGhlIHByb2plY3QuIE5vdGUgdGhhdCB0aGVzZSBkZXBlbmRlbmNpZXMKLW1heSBkaWZmZXIgYmFzZWQgb24gYSBXZWIgcHJvamVjdCdzIGFzc29jaWF0aW9uIHdpdGggbXVsdGlwbGUgRW50ZXJwcmlzZSBhcHBsaWNhdGlvbgotcHJvamVjdHMuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SlNQIFRhc2sgVGFnczwvZHQ+Ci0KLTxkZD5BZGQsIGVkaXQsIG9yIHJlbW92ZSBKU1AgdGFzayB0YWdzIGFuZCBhc3NpZ24gdGFnIHByaW9yaXRpZXMuIFRoZXNlICJ0bwotZG8iIGl0ZW1zIGFwcGVhciBpbiB5b3VyIFRhc2tzIHZpZXcuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SlNQIENvbXBpbGF0aW9uPC9kdD4KLQotPGRkPlNwZWNpZnkgd2hlbiBpbiB0aGUgYnVpbGQgcHJvY2VzcyBhIEpTUCBzaG91bGQgYmUgc2V0IHRvIGNvbXBpbGU8L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5KU1AgRnJhZ21lbnQgKGR5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0PgotCi08ZGQ+RGVmaW5lIGRlZmF1bHQgZW5jb2RpbmcsIHBhZ2UgZGlyZWN0aXZlLCBhbmQgY29udGVudCB0eXBlIHZhbHVlcyBmb3IgSlNQCi1mcmFnbWVudCBkb2N1bWVudHMgaW4gdGhlIHdlYiBwcm9qZWN0LjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkxpbmtzIFZhbGlkYXRpb24vUmVmYWN0b3Jpbmc8L2R0PgotCi08ZGQ+RGVmaW5lIHByb2plY3QtbGV2ZWwgbGluayBtYW5hZ2VtZW50IGFuZCB2YWxpZGF0aW9uIHNldHRpbmdzLiBUaGVzZSBzZXR0aW5ncwotb3ZlcnJpZGUgY29ycmVzcG9uZGluZyBzZXR0aW5ncyBpbiB0aGUgV29ya2JlbmNoIFByZWZlcmVuY2Ugc2V0dGluZ3MgZm9yIHRoZQotY3VycmVudCBwcm9qZWN0LjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPlByb2plY3QgUmVmZXJlbmNlczwvZHQ+Ci0KLTxkZD5SZWZlcmVuY2Ugb3RoZXIgV2ViIHByb2plY3RzIHRoYXQgZXhpc3Qgb24geW91ciB3b3JrYmVuY2ggd29ya3NwYWNlLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPlNlcnZlcjwvZHQ+Ci0KLTxkZD5TZWxlY3QgdGhlIHNlcnZlciBpbnN0YW5jZSB1c2VkIHRvIHBlcmZvcm0gbmVjZXNzYXJ5IGRldmVsb3BtZW50LCB0ZXN0LAotYW5kIHB1Ymxpc2hpbmcgZnVuY3Rpb25zIGZvciB0aGUgcHJvamVjdC48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5WYWxpZGF0aW9uPC9kdD4KLQotPGRkPlNwZWNpZnkgd2hpY2ggdmFsaWRhdG9ycyBzaG91bGQgcnVuIGZvciB0aGUgcHJvamVjdCwgYW5kIHdoZXRoZXIgdmFsaWRhdGlvbgotc2hvdWxkIG9jY3VyIGF1dG9tYXRpY2FsbHkgd2hlbiByZXNvdXJjZSB1cGRhdGVzIGFyZSB3cml0dGVuIHRvIHRoZSBwcm9qZWN0LgotVGhlIGF2YWlsYWJsZSB2YWxpZGF0b3JzIGFyZSBiYXNlZCBvbiB0aGUgdHlwZXMgb2YgcmVzb3VyY2VzIGluIHlvdXIgcHJvamVjdC4KLUJ5IGRlZmF1bHQsIHZhbGlkYXRvcnMgYXJlIGF1dG9tYXRpY2FsbHkgcnVuIHdoZW4geW91IHNhdmUgcmVzb3VyY2VzIGluIGEKLVdlYiBwcm9qZWN0LiBJZiB5b3UgZG8gbm90IHdhbnQgdmFsaWRhdG9ycyB0byBydW4gYXV0b21hdGljYWxseSB3aGVuIHlvdSBzYXZlCi10aGVzZSByZXNvdXJjZXMsIGVuYWJsZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3ZlcnJpZGUgdmFsaWRhdGlvbjwvc3Bhbj4gcHJlZmVyZW5jZXMKLW9wdGlvbiBhbmQgZGlzYWJsZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UnVuIHZhbGlkYXRpb24gYXV0b21hdGljYWxseSB3aGVuIHlvdSBzYXZlCi1jaGFuZ2VzIHRvIHJlc291cmNlczwvc3Bhbj4gb3B0aW9uLiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiBhbHNvICBkaXNhYmxlIGF1dG9tYXRpYwotdmFsaWRhdGlvbiAoYW5kIGJ1aWxkcykgZm9yIGFsbCBwcm9qZWN0cyBieSBkaXNhYmxpbmcgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGVyZm9ybSBidWlsZAotIGF1dG9tYXRpY2FsbHkgb24gcmVzb3VyY2UgbW9kaWZpY2F0aW9uPC9zcGFuPiBmcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+IHByb3BlcnRpZXMuCi1JZiAgeW91IGRpc2FibGUgYXV0b21hdGljIGJ1aWxkcywgeW91IGNhbiBtYW51YWxseSAgcnVuIGEgYnVpbGQgKGFuZCB2YWxpZGF0aW9uKQotYnkgc2VsZWN0aW5nICA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb2plY3Q8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVidWlsZAotcHJvamVjdDwvc3Bhbj48L3NwYW4+LjwvZGl2PgotPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+V2ViIENvbnRlbnQgU2V0dGluZ3M8L2R0PgotCi08ZGQ+UHJvdmlkZSBhbnkgYXBwbGljYWJsZSBXZWIgY29udGVudCBzZXR0aW5ncyBmb3IgYSBXZWIgcHJvamVjdC4gWW91IGNhbgotc3BlY2lmeSB0aGUgZG9jdW1lbnQgdHlwZSwgQ1NTIHByb2ZpbGUsIGFuZCB0YXJnZXQgZGV2aWNlLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPldlYiBQcm9qZWN0IEZlYXR1cmVzPC9kdD4KLQotPGRkPlNlbGVjdCB0aGUgZmVhdHVyZXMgeW91IHdhbnQgdG8gYmUgZW5hYmxlZCBmb3IgeW91ciBXZWIgcHJvamVjdCwgc3VjaAotYXMgUGFnZSBUZW1wbGF0ZSBzdXBwb3J0LjwvZGQ+Ci0KLTwvZGw+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPldoZW4geW91IGhhdmUgY29tcGxldGVkIHVwZGF0ZXMgdG8gV2ViIHByb2plY3Qgc2V0dGluZ3MsIGNsaWNrIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPjwvc3Bhbj4gdG8KLXNhdmUgYW5kIGNsb3NlIHRoZSBQcm9wZXJ0aWVzIGRpYWxvZy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXYgLz4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3Nydndpei5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3c3J2d2l6LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MDkyZTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3c3J2d2l6LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3c3J2d2l6IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBzZXJ2bGV0czwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGUgc2VydmxldCB3aXphcmQgaGVscHMgeW91IGNyZWF0ZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBzZXJ2bGV0cyBieSB3YWxraW5nIHlvdSB0aHJvdWdoIHRoZQ0KLWNyZWF0aW9uIHByb2Nlc3MgYW5kIGJ5IHByb3ZpZGluZyB5b3Ugd2l0aCBvdXRwdXQgZmlsZXMgdGhhdCB5b3UgY2FuIHVzZSBvcg0KLXRoYXQgeW91IGNhbiBtb2RpZnkgZm9yIHVzZSB3aXRoIHlvdXIgV2ViIGFwcGxpY2F0aW9uLiBUaGUgc2VydmxldHMgY2FuIHJ1bg0KLW9uIEphdmEgRUUtY29tcGxpYW50IFdlYiBzZXJ2ZXJzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnNlcnZsZXRzPGluZGV4dGVybT5jcmVhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPlRvIGNyZWF0ZSBhIHNlcnZsZXQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6IDwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSwgZXhwYW5kIHlvdXIgIDx4cmVmIGhyZWY9ImNjd2VicHJqLmRpdGEiDQotc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz5keW5hbWljIHByb2plY3Q8L3hyZWY+IGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+UmlnaHQgY2xpY2sgb24gdGhlIDxiPlNlcnZsZXQ8L2I+IGljb24sIGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+PHVpY29udHJvbD5TZXJ2bGV0PC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gZnJvbQ0KLXRoZSBwb3AtdXAgbWVudS48L2NtZD48c3RlcHJlc3VsdD4gVGhlIDx1aWNvbnRyb2w+Q3JlYXRlIFNlcnZsZXQ8L3VpY29udHJvbD4gd2l6YXJkDQotYXBwZWFycy48L3N0ZXByZXN1bHQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Rm9sbG93IHRoZSBwcm9qZWN0IHdpemFyZCBwcm9tcHRzLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPjxwPjxiPkdlbmVyYWwgSW5mb3JtYXRpb248L2I+PC9wPjxkbD48ZGxlbnRyeT4NCi08ZHQ+TW9kaWZpZXJzPC9kdD4NCi08ZGQ+WW91IGNhbiBzZWxlY3QgYSBtb2RpZmllciBpbiB0aGUgd2l6YXJkIHRvIHNwZWNpZnkgd2hldGhlciB5b3VyIHNlcnZsZXQNCi1jbGFzcyBpcyBwdWJsaWMsIGFic3RyYWN0LCBvciBmaW5hbC4gTm90ZSB0aGF0IGNsYXNzZXMgY2Fubm90IGJlIGJvdGggYWJzdHJhY3QNCi1hbmQgZmluYWwuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PmphdmF4LnNlcnZsZXQuU2VydmxldDwvZHQ+DQotPGRkPkFsdGhvdWdoIGphdmF4LnNlcnZsZXQuU2VydmxldCBpcyBwcm92aWRlZCBhcyB0aGUgZGVmYXVsdCBpbnRlcmZhY2UsIHlvdQ0KLWNhbiB1c2UgdGhlIHdpemFyZCB0byBhZGQgYWRkaXRpb25hbCBpbnRlcmZhY2VzIHRvIGltcGxlbWVudC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SW50ZXJmYWNlIHNlbGVjdGlvbiBkaWFsb2c8L2R0Pg0KLTxkZD5UaGlzIGRpYWxvZyBhcHBlYXJzIGlmIHlvdSBlbGVjdCB0byBhZGQgYW4gaW50ZXJmYWNlIHRvIHlvdXIgc2VydmxldC4NCi1BcyB5b3UgdHlwZSB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgeW91IGFyZSBhZGRpbmcsIGEgbGlzdCBvZiBhdmFpbGFibGUNCi1pbnRlcmZhY2VzIGxpc3RlZCBpbiB0aGUgTWF0Y2hpbmcgdHlwZXMgbGlzdCBib3ggdXBkYXRlcyBkeW5hbWljYWxseSB0byBkaXNwbGF5DQotb25seSB0aGUgaW50ZXJmYWNlcyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLiBZb3Ugc2hvdWxkIGNob29zZSBhbiBpbnRlcmZhY2UNCi10byBzZWUgdGhlIHF1YWxpZmllciwgYW5kIHRoZW4gY2xpY2sgT0sgd2hlbiBmaW5pc2hlZC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+TWV0aG9kIHN0dWJzPC9kdD4NCi08ZGQ+WW91IGNhbiBzZWxlY3QgYW55IGFwcHJvcHJpYXRlIG1ldGhvZCBzdHVicyB0byBiZSBjcmVhdGVkIGluIHRoZSBzZXJ2bGV0DQotZmlsZS4gVGhlIHN0dWJzIGNyZWF0ZWQgYnkgdXNpbmcgdGhlIEluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2RzIG9wdGlvbiBtdXN0DQotYmUgaW1wbGVtZW50ZWQgaWYgeW91IGRvIG5vdCBpbnRlbmQgdG8gY3JlYXRlIGFuIGFic3RyYWN0IHNlcnZsZXQuIE5vdGUgdGhhdA0KLXRoaXMgaXMgbm90IHRydWUgZm9yIENvbnN0cnVjdG9ycyBmcm9tIHN1cGVyY2xhc3M8L2RkPg0KLTwvZGxlbnRyeT48L2RsPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdzcnZ3aXouaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3Nydndpei5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWExYWM2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3Nydndpei5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgc2VydmxldHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIHNlcnZsZXQgd2l6YXJkIGhlbHBzIHlvdSBjcmVhdGUgSmF2YSBzZXJ2bGV0cyBieSB3YWxraW5nIHlvdSB0aHJvdWdoIHRoZSBjcmVhdGlvbiBwcm9jZXNzIGFuZCBieSBwcm92aWRpbmcgeW91IHdpdGggb3V0cHV0IGZpbGVzIHRoYXQgeW91IGNhbiB1c2Ugb3IgdGhhdCB5b3UgY2FuIG1vZGlmeSBmb3IgdXNlIHdpdGggeW91ciBXZWIgYXBwbGljYXRpb24uIFRoZSBzZXJ2bGV0cyBjYW4gcnVuIG9uIEphdmEgRUUtY29tcGxpYW50IFdlYiBzZXJ2ZXJzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgc2VydmxldCB3aXphcmQgaGVscHMgeW91IGNyZWF0ZSBKYXZhIHNlcnZsZXRzIGJ5IHdhbGtpbmcgeW91IHRocm91Z2ggdGhlIGNyZWF0aW9uIHByb2Nlc3MgYW5kIGJ5IHByb3ZpZGluZyB5b3Ugd2l0aCBvdXRwdXQgZmlsZXMgdGhhdCB5b3UgY2FuIHVzZSBvciB0aGF0IHlvdSBjYW4gbW9kaWZ5IGZvciB1c2Ugd2l0aCB5b3VyIFdlYiBhcHBsaWNhdGlvbi4gVGhlIHNlcnZsZXRzIGNhbiBydW4gb24gSmF2YSBFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuIiAvPgotPG1ldGEgY29udGVudD0ic2VydmxldHMsIGNyZWF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic2VydmxldHMsIGNyZWF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3c2VydmJuLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdzcnZ3aXoiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBzZXJ2bGV0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdzcnZ3aXoiPjxhIG5hbWU9InR3c3J2d2l6Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBzZXJ2bGV0czwvaDE+Ci0KLQotCi08ZGl2PjxwPlRoZSBzZXJ2bGV0IHdpemFyZCBoZWxwcyB5b3UgY3JlYXRlIEphdmHihKIgc2VydmxldHMgYnkgd2Fsa2luZyB5b3UgdGhyb3VnaCB0aGUKLWNyZWF0aW9uIHByb2Nlc3MgYW5kIGJ5IHByb3ZpZGluZyB5b3Ugd2l0aCBvdXRwdXQgZmlsZXMgdGhhdCB5b3UgY2FuIHVzZSBvcgotdGhhdCB5b3UgY2FuIG1vZGlmeSBmb3IgdXNlIHdpdGggeW91ciBXZWIgYXBwbGljYXRpb24uIFRoZSBzZXJ2bGV0cyBjYW4gcnVuCi1vbiBKYXZhIEVFLWNvbXBsaWFudCBXZWIgc2VydmVycy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5UbyBjcmVhdGUgYSBzZXJ2bGV0LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOiA8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLCBleHBhbmQgeW91ciAgPGEgaHJlZj0iY2N3ZWJwcmouaHRtbCIgdGl0bGU9IiI+ZHluYW1pYyBwcm9qZWN0PC9hPiBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgb24gdGhlIDxzdHJvbmc+U2VydmxldDwvc3Ryb25nPiBpY29uLCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+Ci08c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2VydmxldDwvc3Bhbj48L3NwYW4+IGZyb20KLXRoZSBwb3AtdXAgbWVudS48L3NwYW4+ICBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3JlYXRlIFNlcnZsZXQ8L3NwYW4+IHdpemFyZAotYXBwZWFycy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZvbGxvdyB0aGUgcHJvamVjdCB3aXphcmQgcHJvbXB0cy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+PHN0cm9uZz5HZW5lcmFsIEluZm9ybWF0aW9uPC9zdHJvbmc+PC9wPgotPGRsPgotPGR0IGNsYXNzPSJkbHRlcm0iPk1vZGlmaWVyczwvZHQ+Ci0KLTxkZD5Zb3UgY2FuIHNlbGVjdCBhIG1vZGlmaWVyIGluIHRoZSB3aXphcmQgdG8gc3BlY2lmeSB3aGV0aGVyIHlvdXIgc2VydmxldAotY2xhc3MgaXMgcHVibGljLCBhYnN0cmFjdCwgb3IgZmluYWwuIE5vdGUgdGhhdCBjbGFzc2VzIGNhbm5vdCBiZSBib3RoIGFic3RyYWN0Ci1hbmQgZmluYWwuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+amF2YXguc2VydmxldC5TZXJ2bGV0PC9kdD4KLQotPGRkPkFsdGhvdWdoIGphdmF4LnNlcnZsZXQuU2VydmxldCBpcyBwcm92aWRlZCBhcyB0aGUgZGVmYXVsdCBpbnRlcmZhY2UsIHlvdQotY2FuIHVzZSB0aGUgd2l6YXJkIHRvIGFkZCBhZGRpdGlvbmFsIGludGVyZmFjZXMgdG8gaW1wbGVtZW50LjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkludGVyZmFjZSBzZWxlY3Rpb24gZGlhbG9nPC9kdD4KLQotPGRkPlRoaXMgZGlhbG9nIGFwcGVhcnMgaWYgeW91IGVsZWN0IHRvIGFkZCBhbiBpbnRlcmZhY2UgdG8geW91ciBzZXJ2bGV0LgotQXMgeW91IHR5cGUgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSB0aGF0IHlvdSBhcmUgYWRkaW5nLCBhIGxpc3Qgb2YgYXZhaWxhYmxlCi1pbnRlcmZhY2VzIGxpc3RlZCBpbiB0aGUgTWF0Y2hpbmcgdHlwZXMgbGlzdCBib3ggdXBkYXRlcyBkeW5hbWljYWxseSB0byBkaXNwbGF5Ci1vbmx5IHRoZSBpbnRlcmZhY2VzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uIFlvdSBzaG91bGQgY2hvb3NlIGFuIGludGVyZmFjZQotdG8gc2VlIHRoZSBxdWFsaWZpZXIsIGFuZCB0aGVuIGNsaWNrIE9LIHdoZW4gZmluaXNoZWQuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+TWV0aG9kIHN0dWJzPC9kdD4KLQotPGRkPllvdSBjYW4gc2VsZWN0IGFueSBhcHByb3ByaWF0ZSBtZXRob2Qgc3R1YnMgdG8gYmUgY3JlYXRlZCBpbiB0aGUgc2VydmxldAotZmlsZS4gVGhlIHN0dWJzIGNyZWF0ZWQgYnkgdXNpbmcgdGhlIEluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2RzIG9wdGlvbiBtdXN0Ci1iZSBpbXBsZW1lbnRlZCBpZiB5b3UgZG8gbm90IGludGVuZCB0byBjcmVhdGUgYW4gYWJzdHJhY3Qgc2VydmxldC4gTm90ZSB0aGF0Ci10aGlzIGlzIG5vdCB0cnVlIGZvciBDb25zdHJ1Y3RvcnMgZnJvbSBzdXBlcmNsYXNzPC9kZD4KLQotPC9kbD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3NlcnZibi5odG1sIj5TZXJ2bGV0czwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci93ZWJ0b29sc190b2MuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3dlYnRvb2xzX3RvYy5kaXRhbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjI1OTFlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3dlYnRvb2xzX3RvYy5kaXRhbWFwCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBtYXAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgTWFwLy9FTiINCi0gIm1hcC5kdGQiPg0KLTxtYXAgaWQ9IndlYmFwcGRldmVsb3BtZW50IiBsaW5raW5nPSJub25lIiB0aXRsZT0iV2ViIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd3RvdmVyLmRpdGEiIG5hdnRpdGxlPSJXZWIgYXBwbGljYXRpb24gb3ZlcnZpZXciPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d0ZmVhdHVyZXMuZGl0YSIgbmF2dGl0bGU9IldlYiB0b29scyBmZWF0dXJlcyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3dlYnZ3LmRpdGEiIG5hdnRpdGxlPSJQcm9qZWN0IEV4cGxvcmVyIHZpZXcgYW5kIFdlYiBkZXZlbG9wbWVudCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJyZXNvdXJjZXMuZGl0YSIgbmF2dGl0bGU9IldlYiByZXNvdXJjZXMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicGFnZWRlc2lnbi5kaXRhIiBuYXZ0aXRsZT0iV2ViIHBhZ2UgZGVzaWduIj48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJwcm9qZWN0cy5kaXRhIiBuYXZ0aXRsZT0iV2ViIHByb2plY3RzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmRpdGEiIG5hdnRpdGxlPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3QiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3ZWJwcmouZGl0YSIgbmF2dGl0bGU9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3Jlc3RhLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3BjbnZydC5kaXRhIiBuYXZ0aXRsZT0iQ29udmVydGluZyBzdGF0aWMgV2ViIHByb2plY3RzIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2NzdGF0aWMuZGl0YSIgbmF2dGl0bGU9IlN0YXRpYyBXZWIgcHJvamVjdHMiPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3aW1wd2FyLmRpdGEiIG5hdnRpdGxlPSJJbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXdhci5kaXRhIiBuYXZ0aXRsZT0iRXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdwbGliLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgV2ViIGxpYnJhcnkgcHJvamVjdHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3ByanNldC5kaXRhIiBuYXZ0aXRsZT0iU2V0dGluZyBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3dlZHR2dy5kaXRhIiBuYXZ0aXRsZT0iV29ya2JlbmNoIGludGVncmF0aW9uIHdpdGggV2ViIGVkaXRvcnMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amRldGFncy5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXciPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpjcmVodG0uZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90anByZWZzLmRpdGEiIG5hdnRpdGxlPSJEZWZpbmluZyBIVE1MIGZpbGUgcHJlZmVyZW5jZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3R5bGVzaGVldC5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlanNwLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NwZGpzcHMuZGl0YSIgbmF2dGl0bGU9IkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neSI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYmFydGlmYWN0LmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBXZWIgQXJ0aWZhY3RzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3c3J2d2l6LmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBzZXJ2bGV0cyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3NlcnZibi5kaXRhIiBuYXZ0aXRsZT0iU2VydmxldHMiPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3bHN0d2l6LmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBMaXN0ZW5lcnMiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dsaXN0Ym4uZGl0YSIgbmF2dGl0bGU9Ikxpc3RlbmVycyI+PC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdmbHR3aXouZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIEZpbHRlcnMiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dmaWx0Ym4uZGl0YSIgbmF2dGl0bGU9IkZpbHRlcnMiPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2N2c3IuZGl0YSIgbmF2dGl0bGU9IlNldHRpbmcgQ1ZTIHJlcG9zaXRvcnkgZGVmYXVsdHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c2VydmVydGFyZ2V0LmRpdGEiIG5hdnRpdGxlPSJTZXJ2ZXIgdGFyZ2V0aW5nIGZvciBXZWIgYXBwbGljYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3dlYnRvb2xzX3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci93ZWJ0b29sc190b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2UxZjZhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3dlYnRvb2xzX3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJXZWIgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQiIHRvcGljPSJ0b3BpY3MvY2N3dG92ZXIuaHRtbCI+Ci08dG9waWMgbGFiZWw9IldlYiBhcHBsaWNhdGlvbiBvdmVydmlldyIgaHJlZj0idG9waWNzL2Njd3RvdmVyLmh0bWwiPgotPHRvcGljIGxhYmVsPSJXZWIgdG9vbHMgZmVhdHVyZXMiIGhyZWY9InRvcGljcy9jd3RmZWF0dXJlcy5odG1sIj4KLTx0b3BpYyBsYWJlbD0iUHJvamVjdCBFeHBsb3JlciB2aWV3IGFuZCBXZWIgZGV2ZWxvcG1lbnQiIGhyZWY9InRvcGljcy9jY3dlYnZ3Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iV2ViIHJlc291cmNlcyIgaHJlZj0idG9waWNzL2N3ZWJyZXNvdXJjZXMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJXZWIgcGFnZSBkZXNpZ24iIGhyZWY9InRvcGljcy9jd2VicGFnZWRlc2lnbi5odG1sIi8+Ci08L3RvcGljPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iV2ViIHByb2plY3RzIiBocmVmPSJ0b3BpY3MvY3dlYnByb2plY3RzLmh0bWwiPgotPHRvcGljIGxhYmVsPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyIgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0IiBocmVmPSJ0b3BpY3MvdHdjcmVwcmouaHRtbCI+Ci08dG9waWMgbGFiZWw9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiIGhyZWY9InRvcGljcy9jY3dlYnByai5odG1sIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCIgaHJlZj0idG9waWNzL3R3Y3Jlc3RhLmh0bWwiPgotPHRvcGljIGxhYmVsPSJDb252ZXJ0aW5nIHN0YXRpYyBXZWIgcHJvamVjdHMgdG8gZHluYW1pYyBXZWIgcHJvamVjdHMiIGhyZWY9InRvcGljcy90d3BjbnZydC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlN0YXRpYyBXZWIgcHJvamVjdHMiIGhyZWY9InRvcGljcy9jY3N0YXRpYy5odG1sIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJJbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiIGhyZWY9InRvcGljcy90d2ltcHdhci5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkV4cG9ydGluZyBXZWIgQXJjaGl2ZSAoV0FSKSBmaWxlcyIgaHJlZj0idG9waWNzL3R3Y3Jld2FyLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzIiBocmVmPSJ0b3BpY3MvdHdwbGliLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJ0b3BpY3MvdHdwcmpzZXQuaHRtbCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iV29ya2JlbmNoIGludGVncmF0aW9uIHdpdGggV2ViIGVkaXRvcnMiIGhyZWY9InRvcGljcy9jd3dlZHR2dy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3IiBocmVmPSJ0b3BpY3MvdGpkZXRhZ3MuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiIGhyZWY9InRvcGljcy90amNyZWh0bS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkRlZmluaW5nIEhUTUwgZmlsZSBwcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3RqcHJlZnMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzIiBocmVmPSJ0b3BpY3MvdHN0eWxlc2hlZXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIiBocmVmPSJ0b3BpY3MvdGpjcmVqc3AuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neSIgaHJlZj0idG9waWNzL2NwZGpzcHMuaHRtbCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgV2ViIEFydGlmYWN0cyIgaHJlZj0idG9waWNzL2N3ZWJhcnRpZmFjdC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgc2VydmxldHMiIGhyZWY9InRvcGljcy90d3Nydndpei5odG1sIj4KLTx0b3BpYyBsYWJlbD0iU2VydmxldHMiIGhyZWY9InRvcGljcy9jd3NlcnZibi5odG1sIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBMaXN0ZW5lcnMiIGhyZWY9InRvcGljcy90d2xzdHdpei5odG1sIj4KLTx0b3BpYyBsYWJlbD0iTGlzdGVuZXJzIiBocmVmPSJ0b3BpY3MvY3dsaXN0Ym4uaHRtbCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgRmlsdGVycyIgaHJlZj0idG9waWNzL3R3Zmx0d2l6Lmh0bWwiPgotPHRvcGljIGxhYmVsPSJMaXN0ZW5lcnMiIGhyZWY9InRvcGljcy9jd2ZpbHRibi5odG1sIi8+Ci08L3RvcGljPgotPC90b3BpYz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgQ1ZTIHJlcG9zaXRvcnkgZGVmYXVsdHMiIGhyZWY9InRvcGljcy90d2N2c3IuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTZXJ2ZXIgdGFyZ2V0aW5nIGZvciBXZWIgYXBwbGljYXRpb25zIiBocmVmPSJ0b3BpY3MvdHNlcnZlcnRhcmdldC5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMGZmNjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDhiNWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6Mzc6MjEgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJhYzY1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjQ5NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjA1OjI5IEVEVCAyMDA2Ci1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL0VkaXRvclhtbENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL0VkaXRvclhtbENvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyYjRhMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9FZGl0b3JYbWxDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLQkqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLQkqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotCSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLQkqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0JKiAKLQkqIENvbnRyaWJ1dG9yczoKLQkqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTwhLS1wbHVnaW46IG9yZy5lY2xpcHNlLndzdC54bWwudWkgLS0+Ci08Y29udGV4dHM+Ci0JPGNvbnRleHQgaWQ9ImNzaF9vdXRlcl9jb250YWluZXIiPgotCQk8ZGVzY3JpcHRpb24gLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndlYngwMDYwIj48IS0tIFhNTCBGaWxlcyBwcmVmZXJlbmNlIHBhZ2UgIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQk8cD5UaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgZmlsZSBzdWZmaXggYW5kIHRleHQgZW5jb2RpbmcgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgY3JlYXRlIG9yIHNhdmUgYW4gWE1MIHJlbGF0ZWQgZmlsZS48L3A+Ci0KLQkJCTxwPlRoZSBlbmNvZGluZyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZyBzZXQgdGhhdCBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgWE1MIHJlbGF0ZWQgZmlsZXMgKERURHMsIFhNTCBmaWxlcywgWE1MIHNjaGVtYXMpLiBDaGFuZ2luZyB0aGUgZW5jb2RpbmcgY2F1c2VzIGFueSBuZXcsIFhNTCByZWxhdGVkIGZpbGVzIHRoYXQgYXJlIGNyZWF0ZWQgZnJvbSBzY3JhdGNoIHRvIHVzZSB0aGUgc2VsZWN0ZWQgZW5jb2RpbmcuPC9wPgotCi0JCQk8cD5Zb3UgY2FuIGFsc28gc2V0IHRoZSB0eXBlIG9mIG1lc3NhZ2UgdGhhdCB3aWxsIGFwcGVhciBpbiB0aGUgcHJvYmxlbXMgdmlldyB3aGVuIGEgcmVzb3VyY2UgaXMgdmFsaWRhdGVkIHdpdGggbm8gc3BlY2lmaWVkIGdyYW1tYXIuPC9wPgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGVuYy5odG1sIiBsYWJlbD0iU3BlY2lmeWluZyBYTUwgZGVmYXVsdCBlbmNvZGluZyBhbmQgbGluZSBkZWxpbWl0ZXJzIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2VieDAwNjEiPjwhLS0gRWRpdG9yIHByZWZlcmVuY2VzIHBhZ2UgLS0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCTxwPlRoaXMgcGFnZSBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBmb3JtYXR0aW5nIGFuZCBjb250ZW50IGFzc2lzdCBwcmVmZXJlbmNlcyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIGVkaXRpbmcgYW4gWE1MIGZpbGUuPC9wPgotCi0JCQk8cD5FbnRlciBhIG1heGltdW0gd2lkdGggaW4gdGhlIDxiPkxpbmUgd2lkdGg8L2I+IGZpZWxkIHRvIHNwZWNpZnkgd2hlbiBhIGxpbmUgc2hvdWxkIGJlIGJyb2tlbiB0byBmaXQgb250byBtb3JlIHRoYW4gb25lIGxpbmUuIFRoaXMgd2lsbCBiZSBhcHBsaWVkIHdoZW4gdGhlIGRvY3VtZW50IGlzIGZvcm1hdHRlZC4KLQkJCTwvcD4KLQkJCi0KLQkJCTxwPlNlbGVjdCA8Yj5TcGxpdCBtdWx0aXBsZSBhdHRyaWJ1dGVzIGVhY2ggb24gYSBuZXcgbGluZTwvYj4gdG8gc3RhcnQgZXZlcnkgYXR0cmlidXRlIG9uIGEgbmV3IGxpbmUgd2hlbiB0aGUgZG9jdW1lbnQgaXMgZm9ybWF0dGVkLgotCQkJPC9wPgotCi0JCQk8cD4KLQkJCQlTZWxlY3QgPGI+Q2xlYXIgYWxsIGJsYW5rIGxpbmVzPC9iPiB0byByZW1vdmUgYmxhbmsgbGluZXMgd2hlbiB0aGUgZG9jdW1lbnQgaXMgZm9ybWF0dGVkLgotCQkJPC9wPgotCi0JCQk8cD4KLQkJCQlTZWxlY3QgPGI+SW5kZW50IHVzaW5nIHRhYnM8L2I+IGlmIHlvdSB3YW50IHRvIHVzZSB0YWIgY2hhcmFjdGVycyAoXHQpIGFzIHRoZSBzdGFuZGFyZCBmb3JtYXR0aW5nIGluZGVudGF0aW9uLiBJZiB5b3UgcHJlZmVyIHRvIHVzZSBzcGFjZXMsIHNlbGVjdCA8Yj5JbmRlbnQgdXNpbmcgc3BhY2VzPC9iPi4KLQkJCTwvcD4KLQotCQkJPHA+Ci0JCQkJWW91IGNhbiBhbHNvIHNwZWNpZnkgdGhlIDxiPkluZGVudGF0aW9uIHNpemU8L2I+IHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgdGFicyBvciBzcGFjZSBjaGFyYWN0ZXJzIHVzZWQgZm9yIGZvcm1hdHRpbmcgaW5kZW50YXRpb24uCi0JCQk8L3A+Ci0KLQkJCTxwPgotCQkJCVRvIGFwcGx5IHRoZXNlIGZvcm1hdHRpbmcgc3R5bGVzLCByaWdodC1jbGljayBpbiB5b3VyIFhNTCBkb2N1bWVudCwgYW5kIGNsaWNrIDxiPkZvcm1hdCAmZ3Q7IERvY3VtZW50PC9iPi4KLQkJCTwvcD4KLQotCQkJPHA+Ci0JCQkJSWYgdGhlIDxiPkF1dG9tYXRpY2FsbHkgbWFrZSBzdWdnZXN0aW9uczwvYj4gY2hlY2sgYm94IGlzIHNlbGVjdGVkLCB5b3UgY2FuIHNwZWNpZnkgdGhhdCBjZXJ0YWluIGNoYXJhY3RlcnMgd2lsbCBjYXVzZSB0aGUgY29udGVudCBhc3Npc3QgbGlzdCB0byBwb3AgdXAgYXV0b21hdGljYWxseS4gU3BlY2lmeSB0aGVzZSBjaGFyYWN0ZXJzIGluIHRoZSA8Yj5Qcm9tcHQgd2hlbiB0aGVzZSBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZDwvYj4gZmllbGQuCi0JCQk8L3A+Ci0KLQkJCTxwPgotCQkJCUlmIHlvdSBzZWxlY3QgPGI+U3RyaWN0PC9iPiBmcm9tIHRoZSA8Yj5TdWdnZXN0aW9uIHN0cmF0ZWd5PC9iPiBsaXN0LCBzdWdnZXN0aW9ucyB0aGF0IGFyZSBncmFtbWF0aWNhbGx5IHZhbGlkIHdpbGwgYmUgc2hvd24gZmlyc3QgKHdpdGggYm9sZCBpY29ucykgaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QuIE90aGVyIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGVsZW1lbnQgc2NvcGUsIGJ1dCBub3QgZ3JhbW1hdGljYWxseSB2YWxpZCwgd2lsbCBiZSBzaG93biBiZWxvdyB0aGVtIHdpdGggYSBkZS1lbXBoYXNpemVkIGljb24uIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIDxiPkxheDwvYj4uCi0JCQk8L3A+Ci0KLQkJCTxwPgotCQkJCUlmIGEgRFREIG9yIHNjaGVtYSAob3Igb3RoZXIgbW9kZWwpIGlzIG5vdCBzcGVjaWZpZWQgZm9yIGFuIFhNTCBmaWxlLCBzZWxlY3RpbmcgPGI+VXNlIGluZmVycmVkIGdyYW1tYXIgaW4gYWJzZW5jZSBvZiBEVEQvU2NoZW1hPC9iPiBhbGxvd3MgdGhlIGVkaXRvciB0byAiZ3Vlc3MiIHdoYXQgZWxlbWVudHMgb3IgYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlIGJhc2VkIG9uIGV4aXN0aW5nIGNvbnRlbnQuCi0JCQk8L3A+Ci0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHByZWZzLmh0bWwiIGxhYmVsPSJEZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2VieDAwNjIiPjwhLS0gU3ludGF4IENvbG9yaW5nIHByZWZlcmVuY2UgcGFnZSAtLT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJPHA+VGhpcyBwYWdlIGxldHMgeW91IGN1c3RvbWl6ZSB0aGUgc3ludGF4IGhpZ2hsaWdodGluZyB0aGF0IHRoZSBYTUwgZWRpdG9yIGRvZXMgd2hlbiB5b3UgYXJlIGVkaXRpbmcgYSBmaWxlLjwvcD4KLQotCQkJPHA+Ci0JCQkJVGhlIDxiPkNvbnRlbnQgdHlwZTwvYj4gZmllbGQgY29udGFpbnMgYSBsaXN0IG9mIGFsbCB0aGUgc291cmNlIHR5cGVzIHRoYXQgeW91IGNhbiBzZWxlY3QgYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLiBZb3UgY2FuIGVpdGhlciBzZWxlY3QgdGhlIGNvbnRlbnQgdHlwZSB0aGF0IHlvdSB3YW50IHRvIHdvcmsgd2l0aCBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdCwgb3IgY2xpY2sgdGV4dCBpbiB0aGUgdGV4dCBzYW1wbGUgd2luZG93IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNvbnRlbnQgdHlwZSBmb3Igd2hpY2ggeW91IHdhbnQgdG8gY2hhbmdlIHRoZSB0ZXh0IGhpZ2hsaWdodGluZy4KLQkJCTwvcD4KLQotCQkJPHA+Ci0JCQkJVGhlIDxiPkZvcmVncm91bmQ8L2I+IGFuZCA8Yj5CYWNrZ3JvdW5kPC9iPiBidXR0b25zIG9wZW4gPGI+Q29sb3I8L2I+IGRpYWxvZyBib3hlcyB0aGF0IGFsbG93IHlvdSB0byBzcGVjaWZ5IHRleHQgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMsIHJlc3BlY3RpdmVseS4gU2VsZWN0IHRoZSA8Yj5Cb2xkPC9iPiBjaGVjayBib3ggdG8gbWFrZSB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZSBhcHBlYXIgaW4gYm9sZC4KLQkJCTwvcD4KLQotCQkJPHA+Ci0JCQkJQ2xpY2sgdGhlIDxiPlJlc3RvcmUgRGVmYXVsdHM8L2I+IGJ1dHRvbiB0byBzZXQgdGhlIGhpZ2hsaWdodGluZyBzdHlsZXMgYmFjayB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4gSWYgeW91IG9ubHkgd2FudCB0byByZXNldCB0aGUgdmFsdWUgZm9yIGEgcGFydGljdWxhciBjb250ZW50IHR5cGUsIHNlbGVjdCBpdCBpbiB0aGUgPGI+Q29udGVudCB0eXBlPC9iPiBmaWVsZCwgdGhlIGNsaWNrIHRoZSA8Yj5SZXN0b3JlIERlZmF1bHQ8L2I+IGJ1dHRvbiBuZXh0IHRvIGl0LgotCQkJPC9wPgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHRhZ2hpbHQuaHRtbCIgbGFiZWw9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3ZWJ4MDA2MyI+PCEtLSBUZW1wbGF0ZXMgcHJlZmVyZW5jZSBwYWdlIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQk8cD5UaGlzIHBhZ2UgbGV0cyB5b3UgY3JlYXRlIG5ldyB0ZW1wbGF0ZXMgYW5kIGVkaXQgZXhpc3Rpbmcgb25lcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gZWRpdGluZyBhbiBYTUwgZmlsZS4gQSB0ZW1wbGF0ZSBpcyBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLjwvcD4KLQotCQkJPHA+Q2xpY2sgPGI+TmV3PC9iPiBpZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBjb21wbGV0ZWx5IG5ldyB0ZW1wbGF0ZS4KLQkJCTwvcD4KLQotCQkJPHA+U3VwcGx5IGEgbmV3IHRlbXBsYXRlIDxiPk5hbWU8L2I+IGFuZCA8Yj5EZXNjcmlwdGlvbjwvYj4uIFRoZSA8Yj5Db250ZXh0PC9iPiBmb3IgdGhlIHRlbXBsYXRlIGlzIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsIGxpc3Qgd2hlbiBjb250ZW50IGFzc2lzdCBpcyByZXF1ZXN0ZWQuIFNwZWNpZnkgdGhlIDxiPlBhdHRlcm48L2I+IGZvciB5b3VyIHRlbXBsYXRlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSB0YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzIHRvIGJlIGluc2VydGVkIGJ5IGNvbnRlbnQgYXNzaXN0LgotCQkJPC9wPgotCi0JCQk8cD4KLQkJCQlJZiB5b3Ugd2FudCB0byBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDxiPkluc2VydCBWYXJpYWJsZTwvYj4gYnV0dG9uIGFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLiBGb3IgZXhhbXBsZSwgdGhlIDxiPmRhdGU8L2I+IHZhcmlhYmxlIGluZGljYXRlcyB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUgaW5zZXJ0ZWQuCi0JCQk8L3A+Ci0KLQkJCTxwPllvdSBjYW4gZWRpdCwgcmVtb3ZlLCBpbXBvcnQsIG9yIGV4cG9ydCBhIHRlbXBsYXRlIGJ5IHVzaW5nIHRoZSBzYW1lIFByZWZlcmVuY2VzIHBhZ2UuIElmIHlvdSBoYXZlIG1vZGlmaWVkIGEgZGVmYXVsdCB0ZW1wbGF0ZSwgeW91IGNhbiByZXN0b3JlIGl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUgbm90IGV4aXRlZCBmcm9tIHRoZSB3b3JrYmVuY2ggc2luY2UgaXQgd2FzIHJlbW92ZWQuPC9wPgotCi0JCQk8cD4KLQkJCQlJZiB5b3UgaGF2ZSBhIHRlbXBsYXRlIHRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IGl0IHRvIGFwcGVhciBpbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCwgY2xlYXIgaXRzIGNoZWNrIGJveCBpbiB0aGUgPGI+VGVtcGxhdGVzPC9iPiBwcmVmZXJlbmNlcyBwYWdlLgotCQkJPC9wPgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdtYWNyby5odG1sIiBsYWJlbD0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxtMTIwMCI+PCEtLSBkb2Vzbid0IGV4aXN0IGluIHhtbCBwcmVmZXJlbmNlcyAtLT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJQ2xlYW51cCBvcHRpb25zIGVuYWJsZSB5b3UgdG8gdXBkYXRlIGEgZG9jdW1lbnQgc28gdGhhdCBpdCBpcyB3ZWxsLWZvcm1lZCBhbmQgY29uc2lzdGVudGx5IGZvcm1hdHRlZC4KLQotCQkJVGhlIGZvbGxvd2luZyBjbGVhbnVwIG9wdGlvbnMgY2FuIGJlIHNldCB0byBvbiBvciBvZmYsIHNvIHRoYXQgeW91IGNhbiBsaW1pdCB0aGUgdHlwZSBvZiBjbGVhbnVwIHBlcmZvcm1lZDoKLQotCQkJLSA8Yj5Db21wcmVzcyBlbXB0eSBlbGVtZW50IHRhZ3M8L2I+OiBDb21wcmVzcyBlbGVtZW50IHRhZ3Mgd2l0aCBubyBjb250ZW50IHRvIG9uZSB0YWcgd2l0aCBhbiBlbmQgdGFnIGRlbGltaXRlciAoaWU6IGNoYW5nZSAmbHQ7dGFnJmd0OyZsdDsvdGFnJmd0OyB0byAmbHQ7dGFnLyZndDspLgotCi0JCQktIDxiPkluc2VydCByZXF1aXJlZCBhdHRyaWJ1dGVzPC9iPjogSW5zZXJ0cyBhbnkgbWlzc2luZyBhdHRyaWJ1dGVzIHRoYXQgYXJlIHJlcXVpcmVkIGJ5IHRoZSB0YWcgdG8gbWFrZSB0aGUgZWxlbWVudCBvciBkb2N1bWVudCB3ZWxsLWZvcm1lZC4KLQotCQkJLSA8Yj5JbnNlcnQgbWlzc2luZyB0YWdzPC9iPjogQ29tcGxldGVzIGFueSBtaXNzaW5nIHRhZ3MgKHN1Y2ggYXMgYWRkaW5nIGFuIGVuZCB0YWcpIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBlbGVtZW50IG9yIGRvY3VtZW50IHdlbGwtZm9ybWVkLgotCi0JCQktIDxiPlF1b3RlIGF0dHJpYnV0ZSB2YWx1ZXM8L2I+OiBBcHByb3ByaWF0ZWx5IGFkZHMgZG91YmxlLSBvciBzaW5nbGUtcXVvdGVzIGJlZm9yZSBhbmQgYWZ0ZXIgYXR0cmlidXRlIHZhbHVlcyBpZiB0aGV5IGFyZSBtaXNzaW5nLgotCi0JCQktIDxiPkZvcm1hdCBzb3VyY2U8L2I+OiBGb3JtYXRzIHRoZSBkb2N1bWVudCBqdXN0IGFzIHRoZSA8Yj5Gb3JtYXQgRG9jdW1lbnQ8L2I+IGNvbnRleHQgbWVudSBvcHRpb24gZG9lcywgaW1tZWRpYXRlbHkgYWZ0ZXIgcGVyZm9ybWluZyBhbnkgb3RoZXIgc3BlY2lmaWVkIDxiPkNsZWFudXA8L2I+IG9wdGlvbnMuCi0KLQkJCS0gPGI+Q29udmVydCBsaW5lIGRlbGltaXRlcnMgdG88L2I+OiBDb252ZXJ0cyBhbGwgbGluZSBkZWxpbWl0ZXJzIGluIHRoZSBmaWxlIHRvIHRoZSBzZWxlY3RlZCBvcGVyYXRpbmcgc3lzdGVtJ3MgdHlwZS4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmh0bWwiIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhjdWkwNTAwIj48IS0tIGFkZCBuZXcgYXR0cmlidXRlIGRpYWxvZyAtLT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJRW50ZXIgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBpbiB0aGUgPGI+TmFtZTwvYj4gZmllbGQsIHRoZW4gZW50ZXIgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgaW4gdGhlIDxiPlZhbHVlPC9iPiBmaWVsZC4gQ2xpY2sgPGI+T0s8L2I+LiBUaGUgYXR0cmlidXRlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGZpbGUuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4Y3VpMDAxMCI+PCEtLSAgLS0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBpdCB0byBhc3NvY2lhdGUgaXQgd2l0aCBhIERURCBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgPGI+UHVibGljIElEPC9iPiBmaWVsZCB0byBjcmVhdGUgYW4gYXNzb2NpYXRpb24gdXNpbmcgYW4gWE1MIENhdGFsb2cgZW50cnkgb3IgdGhlIDxiPlN5c3RlbSBJRDwvYj4gZmllbGQgdG8gY3JlYXRlIGFuIGFzc29jaWF0aW9uIHVzaW5nIGEgZmlsZSBpbiB0aGUgd29ya2JlbmNoLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCIgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiAvPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5odG1sIiBsYWJlbD0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhjdWkwMDIwIj48IS0tIGVkaXQgZG9jdHlwZSBkZWNsYXJhdGlvbiBkaWFsb2cgLS0+Ci0JCTxkZXNjcmlwdGlvbj5UaGlzIHNob3VsZCBtYXRjaCB0aGUgbmFtZSBvZiB5b3VyIFhNTCBmaWxlJ3Mgcm9vdCBlbGVtZW50LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIC8+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmh0bWwiIGxhYmVsPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieGN1aTAwMzAiPjwhLS0gZWRpdCBkb2N0eXBlIGRlY2xhcmF0aW9uIGRpYWxvZyAtLT4KLQkJPGRlc2NyaXB0aW9uPlRoZSB2YWx1ZSBpbiB0aGlzIGZpZWxkIGlzIHRoZSBQdWJsaWMgSWRlbnRpZmllci4gSXQgaXMgdXNlZCB0byBhc3NvY2lhdGUgdGhlIFhNTCBmaWxlICh1c2luZyBhbiBYTUwgY2F0YWxvZyBlbnRyeSkgd2l0aCBhIERURCBmaWxlIGJ5IHByb3ZpZGluZyBhIGhpbnQgdG8gdGhlIFhNTCBwcm9jZXNzb3IuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgLz4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRkb2MuaHRtbCIgbGFiZWw9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4Y3VpMDA1MCI+PCEtLSBlZGl0IGRvY3R5cGUgZGVjbGFyYXRpb24gZGlhbG9nIC0tPgotCQk8ZGVzY3JpcHRpb24+VGhlIHZhbHVlIGluIHRoaXMgZmllbGQgaXMgdGhlIERURCB0aGUgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLiBZb3UgY2FuIGNoYW5nZSB0aGUgRFREIHRoZSBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBieSBlZGl0aW5nIHRoaXMgZmllbGQuIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgdHJ5IHRvIHVzZSB0aGUgUHVibGljIElEIHRvIGxvY2F0ZSB0aGUgRFRELCBhbmQgaWYgdGhpcyBmYWlscywgaXQgd2lsbCB1c2UgdGhlIFN5c3RlbSBJRCB0byBmaW5kIGl0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIC8+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmh0bWwiIGxhYmVsPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieGN1aTA2MDAiPjwhLS0gYWRkIGVsZW1lbnQgZGlhbG9nIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlFbnRlciB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpbiB0aGUgPGI+RWxlbWVudCBuYW1lPC9iPiBmaWVsZCwgdGhlbiBjbGljayA8Yj5PSzwvYj4uIFRoZSBlbGVtZW50IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGZpbGUuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4Y3VpMDMwMCI+PCEtLSBlZGl0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZGlhbG9nIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlBIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gaXMgYSBzeW50YXggaW4gWE1MIGZvciBwYXNzaW5nIGluc3RydWN0aW9ucyBhbG9uZyB0byB0aGUgYXBwbGljYXRpb24gdXNpbmcgYW4gWE1MIGRvY3VtZW50LiBUaGUgPGI+VGFyZ2V0PC9iPiBmaWVsZCBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBhcHBsaWNhdGlvbiB0aGUgaW5zdHJ1Y3Rpb25zIGJlbG9uZ3MgdG8uIFRoZSA8Yj5EYXRhPC9iPiBmaWVsZCBjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb25zLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCIgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiAvPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByb2MuaHRtbCIgbGFiZWw9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieGN1aTAxMDAiPjwhLS0gZWRpdCBzY2hlbWEgaW5mb3JtYXRpb24gKG5hbWVzcGFjZSBkZWNsYXJhdGlvbikgZGlhbG9nIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlUaGlzIGlzIGEgcmVhZC1vbmx5IGRpYWxvZy4gU2VsZWN0IHRoZSBlbnRyeSB5b3Ugd2FudCB0byBlZGl0IGFuZCBjbGljayA8Yj5FZGl0PC9iPi4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgLz4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIGxhYmVsPSJFZGl0aW5nIHlvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieGN1aTAyMDAiPjwhLS0gYWRkIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBkaWFsb2cgLS0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVRoZSB2YWx1ZSBpbiB0aGUgPGI+TmFtZXNwYWNlIE5hbWU8L2I+IGZpZWxkIGlzIHRoZSBuYW1lc3BhY2UgdGhlIFhNTCBmaWxlIGJlbG9uZ3MgdG8uCi0KLQkJCUFsbCBxdWFsaWZpZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4gdGhlIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZXNwYWNlIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCB0aGUgPGI+UHJlZml4PC9iPiB2YWx1ZS4KLQotCQkJVGhlIDxiPkxvY2F0aW9uIEhpbnQ8L2I+IGZpZWxkIGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgWE1MIHNjaGVtYSB0aGUgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLiBBbiBYTUwgQ2F0YWxvZyBJRCBvciBhIFVSSSBjYW4gYmUgc3BlY2lmaWVkIGluIHRoaXMgZmllbGQuIFlvdSBjYW4gc2VhcmNoIGZvciB0aGUgc2NoZW1hIHlvdSB3YW50IHRvIHVzZSBieSBjbGlja2luZyA8Yj5Ccm93c2U8L2I+LiBPbmNlIHlvdSBzZWxlY3QgYSBmaWxlLCB0aGUgPGI+TmFtZXNwYWNlIE5hbWU8L2I+IGFuZCA8Yj5QcmVmaXg8L2I+IGZpZWxkcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZmlsbGVkIHdpdGggdGhlIGFwcHJvcHJpYXRlIHZhbHVlcyBmcm9tIHRoZSBzY2hlbWEgKHlvdSBtdXN0IGxlYXZlIHRoZSBmaWVsZHMgYmxhbmsgZm9yIHRoaXMgdG8gb2NjdXIpLgotCi0JCQk8Yj5Ob3RlPC9iPiA6IElmIHlvdSBhcmUgY3JlYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSBhbiBYTUwgc2NoZW1hLCB5b3UgY2Fubm90IGNoYW5nZSB0aGUgPGI+TmFtZXNwYWNlIE5hbWU8L2I+IG9yIDxiPkxvY2F0aW9uIEhpbnQ8L2I+IHZhbHVlcy4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgLz4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIGxhYmVsPSJFZGl0aW5nIHlvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieGN1aTA0MDAiPjwhLS0gIC0tPgotCQk8ZGVzY3JpcHRpb24+QW4gWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvIHBhcnRzIC0gYSBLZXkgKHdoaWNoIHJlcHJlc2VudHMgYSBEVEQgb3IgWE1MIHNjaGVtYSkgYW5kIGEgVVJJICh3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIERURCBvciBYTUwgc2NoZW1hJ3MgbG9jYXRpb24pLiBTZWxlY3QgdGhlIGNhdGFsb2cgZW50cnkgeW91IHdhbnQgdG8gYXNzb2NpYXRlIHlvdXIgWE1MIGZpbGUgd2l0aC48L2Rlc2NyaXB0aW9uPgotCTwvY29udGV4dD4KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9FZGl0b3JYbWxDb250ZXh0czIueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvRWRpdG9yWG1sQ29udGV4dHMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg1MDRlZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9FZGl0b3JYbWxDb250ZXh0czIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLQkqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLQkqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotCSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLQkqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0JKiAKLQkqIENvbnRyaWJ1dG9yczoKLQkqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLQk8Y29udGV4dCBpZD0iY3NoX291dGVyX2NvbnRhaW5lciI+Ci0JCTxkZXNjcmlwdGlvbiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieG1sX3NvdXJjZV9IZWxwSWQiPgotCQk8ZGVzY3JpcHRpb24+VGhlIFhNTCBzb3VyY2UgdmlldyBsZXRzIHlvdSBlZGl0IGEgZmlsZSB0aGF0IGlzIGNvZGVkIGluIHRoZSBFeHRlbnNpYmxlIE1hcmt1cCBMYW5ndWFnZS4gVGhlIGVkaXRvciBwcm92aWRlcyBtYW55IHRleHQgZWRpdGluZyBmZWF0dXJlcywgc3VjaCBhcyBjb250ZW50IGFzc2lzdCwgdXNlci1kZWZpbmVkIHRlbXBsYXRlcywgc3ludGF4IGhpZ2hsaWdodGluZywgdW5saW1pdGVkIHVuZG8gYW5kIHJlZG8sIGVsZW1lbnQgc2VsZWN0aW9uIGFuZCBmb3JtYXR0aW5nLCBhbmQgZG9jdW1lbnQgZm9ybWF0dGluZy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmh0bWwiCi0JCQlsYWJlbD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciIC8+Ci0JPC9jb250ZXh0PgotPC9jb250ZXh0cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmExOWViLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNDAwLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL1RhYmxlVHJlZS54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9UYWJsZVRyZWUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjYyZWZiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL1RhYmxlVHJlZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotCSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotCSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0JKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotCSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLQkqIAotCSogQ29udHJpYnV0b3JzOgotCSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotCi08Y29udGV4dHM+Ci0JPGNvbnRleHQgaWQ9ImNzaF9vdXRlcl9jb250YWluZXIiPgotCQk8ZGVzY3JpcHRpb24gLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhtbG0zMDAwIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBEZXNpZ24gdmlldyBvZiB0aGUgWE1MIGVkaXRvciByZXByZXNlbnRzIHlvdXIgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUsIHdoaWNoIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIERlcGVuZGluZyBvbiB0aGUga2luZCBvZiBmaWxlIHlvdSBhcmUgd29ya2luZyB3aXRoLCBjb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IGxvY2F0aW9uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCIKLQkJCWxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgLz4KLQk8L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL1dTRExDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9XU0RMQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQ2MmI3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL1dTRExDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLQkqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLQkqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotCSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLQkqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0JKiAKLQkqIENvbnRyaWJ1dG9yczoKLQkqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPCEtLSBwbHVnaW46IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpIC0tPgotCi08Y29udGV4dHM+Ci0JPGNvbnRleHQgaWQ9ImNzaF9vdXRlcl9jb250YWluZXIiPgotCQk8ZGVzY3JpcHRpb24gLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IiI+PCEtLSBjaGFuZ2UgbGF0ZXIsIHRoaXMgaGFzIG5vIGlkIGF0bSAtLT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJU2VsZWN0IHRoZSBwcm9qZWN0IG9yIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgV1NETCBmaWxlLiBJbiB0aGUgPGI+RmlsZSBuYW1lPC9iPiBmaWVsZCwgdHlwZSB0aGUgbmFtZSBvZiB0aGUgV1NETCBmaWxlLCBmb3IgZXhhbXBsZSA8aT5OZXdXU0RMRmlsZS53c2RsPC9pPi4gVGhlIG5hbWUgb2YgeW91ciBXU0RMIGZpbGUgbXVzdCBlbmQgaW4gPGk+LndzZGw8L2k+LgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLmRvYy51c2VyL3Rhc2tzL3RjcnR3c2RsLmh0bWwiCi0JCQlsYWJlbD0iIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id3NkbHUwMDAwIj4KLQkJPGRlc2NyaXB0aW9uPgotCQkJPGI+VGFyZ2V0IG5hbWVzcGFjZTwvYj4gaXMgdXNlZCBmb3IgdGhlIG5hbWVzIG9mIG1lc3NhZ2VzIGFuZCB0aGUgcG9ydCB0eXBlLCBiaW5kaW5nIGFuZCBzZXJ2aWNlIGRlZmluZWQgaW4gdGhlIFdTREwgZmlsZS4gVGhlIHZhbHVlIG11c3QgdGFrZSB0aGUgZm9ybSBvZiBhIHZhbGlkIFVSSSAoZm9yIGV4YW1wbGUsIGh0dHA6Ly93d3cubXljb21wYW55LmNvbS9teXNlcnZpY2UvKS4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS5kb2MudXNlci90YXNrcy90Y3J0d3NkbC5odG1sIgotCQkJbGFiZWw9IiIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndzZGx1MDAwMSI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCTxiPlByZWZpeDwvYj4gaXMgdGhlIHByZWZpeCBhc3NvY2lhdGVkIHdpdGggdGhlIHRhcmdldCBuYW1lc3BhY2UuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuZG9jLnVzZXIvdGFza3MvdGNydHdzZGwuaHRtbCIKLQkJCWxhYmVsPSIiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3c2RsdTAwMDIiPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQk8Yj5DcmVhdGUgV1NETCBTa2VsZXRvbjwvYj4gd2lsbCBnZW5lcmF0ZSB0aGUgV1NETCBlbGVtZW50cyByZXF1aXJlZCBmb3IgeW91ciBzZXJ2aWNlLCBpbmNsdWRpbmcgYmluZGluZ3MsIHBvcnRzIGFuZCBtZXNzYWdlcy4gWW91IGNhbiB0aGVuIG1vZGlmeSB0aGVzZSB0byBtZWV0IHRoZSByZXF1aXJlbWVudHMgb2YgeW91ciBXZWIgc2VydmljZS4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS5kb2MudXNlci90YXNrcy90Y3J0d3NkbC5odG1sIgotCQkJbGFiZWw9IiIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndzZGx1MDAwMyI+Ci0JCTxkZXNjcmlwdGlvbj5JZiB5b3UgaGF2ZSBjaG9zZW4gdG8gY3JlYXRlIGEgV1NETCBza2VsZXRvbiwgc2VsZWN0IHRoZSBiaW5kaW5nIG9wdGlvbnMgeW91IHdhbnQgdG8gdXNlIGluIHRoZSBQcm90b2NvbCBkcm9wIGRvd24uIFRoZSBvcHRpb25zIGFyZSBTT0FQIGFuZCBIVFRQLiBVc2UgdGhlIFNPQVAgcHJvdG9jb2wgd2hlbiB5b3Ugd2FudCB0byBleGNoYW5nZSBzdHJ1Y3R1cmVkIGFuZCB0eXBlZCBpbmZvcm1hdGlvbi4gVXNlIHRoZSBIVFRQIHByb3RvY29sIHdoZW4geW91IHdhbnQgeW91ciBhcHBsaWNhdGlvbiBjbGllbnQgdG8ganVzdCByZXF1ZXN0IG9yIHVwZGF0ZSBpbmZvcm1hdGlvbi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLmRvYy51c2VyL3Rhc2tzL3RjcnR3c2RsLmh0bWwiCi0JCQlsYWJlbD0iIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id3NkbHUwMDEwIj4KLQkJPGRlc2NyaXB0aW9uPgotCQkJSWYgeW91IHNlbGVjdCBTT0FQIHlvdSBjYW4gdGhlbiBzZWxlY3QgdGhlIGVuY29kaW5nIHN0eWxlIHlvdSB3YW50IHRvIHVzZToKLQkJCTx1bD4KLQkJCQk8bGk+Ci0JCQkJCTxiPmRvY3VtZW50IGxpdGVyYWw8L2I+OiBEb2N1bWVudCBzdHlsZSBtZXNzYWdlcywgbGl0ZXJhbCBlbmNvZGluZy4gVXNlIHRoaXMgc3R5bGUgb2YgYmluZGluZyB3aGVuIHlvdSB3YW50IHRvIHNlbmQgU09BUCBtZXNzYWdlcyB0aGF0IGNhbiBiZSB2YWxpZGF0ZWQgYnkgYW4gWE1MIHZhbGlkYXRvci4gQWxsIHRoZSBkYXRhIHR5cGVzIGluIHRoZSBTT0FQIG1lc3NhZ2UgYm9keSBhcmUgZGVmaW5lZCBpbiBhIHNjaGVtYSwgc28gdGhlIFdTREwgcGFydHMgbXVzdCBwb2ludCB0byBzY2hlbWEgZWxlbWVudHMuCi0JCQkJPC9saT4KLQkJCTwvdWw+Ci0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuZG9jLnVzZXIvdGFza3MvdGNydHdzZGwuaHRtbCIKLQkJCWxhYmVsPSIiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3c2RsdTAwMTEiPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQk8dWw+Ci0JCQkJPGxpPgotCQkJCQk8Yj5ycGMgbGl0ZXJhbDwvYj46IFJQQyBzdHlsZSBtZXNzYWdlcywgbGl0ZXJhbCBlbmNvZGluZy4gVXNlIHRoaXMgc3R5bGUgb2YgYmluZGluZyB3aGVuIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIG9wZXJhdGlvbiBtZXRob2QgbmFtZXMgaW4geW91ciBTT0FQIG1lc3NhZ2VzIHNvIGEgc2VydmVyIGNhbiBkaXNwYXRjaCB0aGUgc3BlY2lmaWVkIG1ldGhvZHMuIERhdGEgdHlwZXMgbXVzdCBiZSBkZWZpbmVkLCBzbyB0aGUgV1NETCBwYXJ0cyBtdXN0IHBvaW50IHRvIFhTRCB0eXBlcy4KLQkJCQk8L2xpPgotCQkJPC91bD4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS5kb2MudXNlci90YXNrcy90Y3J0d3NkbC5odG1sIgotCQkJbGFiZWw9IiIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndzZGx1MDAxMiI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCTx1bD4KLQkJCQk8bGk+Ci0JCQkJCTxiPnJwYyBlbmNvZGVkPC9iPjogUlBDIHN0eWxlIG1lc3NhZ2VzIGFuZCBTT0FQIGVuY29kaW5nLiBVc2UgdGhpcyBzdHlsZSBvZiBiaW5kaW5nIHdoZW4geW91IHdhbnQgdG8gZW5jb2RlIGRhdGEgZ3JhcGhzIGluIHlvdXIgU09BUCBtZXNzYWdlcyBzbyBhIHNlcnZlciBjYW4gZGVzZXJpYWxpemUgdGhlIG9iamVjdCBkYXRhLiBEYXRhIHR5cGVzIG11c3QgYmUgZGVmaW5lZCwgc28gdGhlIFdTREwgcGFydHMgbXVzdCBwb2ludCB0byBYU0QgdHlwZXMuCi0JCQkJPC9saT4KLQkJCTwvdWw+Ci0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuZG9jLnVzZXIvdGFza3MvdGNydHdzZGwuaHRtbCIKLQkJCWxhYmVsPSIiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3c2RsdTAwMTMiPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlJZiB5b3Ugc2VsZWN0IEhUVFAgeW91IGNhbiBzZWxlY3Qgd2hldGhlciB0byBjcmVhdGUgYW4gSFRUUCBnZXR0ZXIgb3Igc2V0dGVyOgotCQkJPHVsPgotCQkJCTxsaT4KLQkJCQkJPGI+SFRUUCBHRVQ8L2I+OiBBIEdFVCByZXF1ZXN0IGZldGNoZXMgZGF0YSBmcm9tIGEgV2ViIHNlcnZlciBiYXNlZCBvbiBhbiBVUkwgdmFsdWUgYW5kIGEgc2V0IG9mIEhUVFAgaGVhZGVycy4gVXNlIHRoaXMgbWV0aG9kIHdoZW4geW91IHdhbnQgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LgotCQkJCTwvbGk+Ci0JCQk8L3VsPgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLmRvYy51c2VyL3Rhc2tzL3RjcnR3c2RsLmh0bWwiCi0JCQlsYWJlbD0iIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id3NkbHUwMDE0Ij4KLQkJPGRlc2NyaXB0aW9uPgotCQkJPHVsPgotCQkJCTxsaT4KLQkJCQkJPGI+SFRUUCBQT1NUPC9iPjogQSBQT1NUIHJlcXVlc3Qgc2VuZHMgYWRkaXRpb25hbCBkYXRhIHRvIHRoZSBzZXJ2ZXIsIHNwZWNpZmllZCBhZnRlciB0aGUgVVJMIGFuZCB0aGUgaGVhZGVycy4gVXNlIHRoaXMgbWV0aG9kIHdoZW4geW91IHdhbnQgdG8gc2VuZCBkYXRhIGVuY2xvc2VkIGluIHRoZSBib2R5IG9mIHRoZSByZXF1ZXN0LgotCQkJCTwvbGk+Ci0JCQk8L3VsPgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLmRvYy51c2VyL3Rhc2tzL3RjcnR3c2RsLmh0bWwiCi0JCQlsYWJlbD0iIiAvPgotCTwvY29udGV4dD4KLTwvY29udGV4dHM+Ci0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL1hNTFdpemFyZENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL1hNTFdpemFyZENvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViYjkxNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9YTUxXaXphcmRDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLQkqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLQkqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotCSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLQkqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0JKiAKLQkqIENvbnRyaWJ1dG9yczoKLQkqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPGNvbnRleHRzPgotCTxjb250ZXh0IGlkPSJjc2hfb3V0ZXJfY29udGFpbmVyIj4KLQkJPGRlc2NyaXB0aW9uIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxjMDEwMSI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVNlbGVjdCB0aGUgPGI+Q3JlYXRlIFhNTCBmaWxlIGZyb20gYSBEVEQgZmlsZTwvYj4gcmFkaW8gYnV0dG9uIHRvIGNyZWF0ZSBhbiBYTUwgZmlsZSBmcm9tIGEgRFREIGZpbGUuIFRoZSBmaWxlIHdpbGwgY29udGFpbiB0aGUgc2VsZWN0ZWQgcm9vdCBlbGVtZW50LCBwb3B1bGF0ZWQgd2l0aCBhbnkgcmVxdWlyZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbCIKLQkJCWxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxjMDEwMiI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVNlbGVjdCB0aGUgPGI+Q3JlYXRlIFhNTCBmaWxlIGZyb20gYW4gWE1MIHNjaGVtYSBmaWxlPC9iPiByYWRpbyBidXR0b24gdG8gY3JlYXRlIGFuIFhNTCBmaWxlIGZyb20gYW4gWE1MIHNjaGVtYS4gVGhlIGZpbGUgd2lsbCBjb250YWluIHRoZSBzZWxlY3RlZCByb290IGVsZW1lbnQgb2YgdGhlIFhNTCBzY2hlbWEgYW5kIGFueSBlbGVtZW50cyBvciBhdHRyaWJ1dGVzIGl0IGNvbnRhaW5zLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwiCi0JCQlsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhtbGMwMTAzIj4KLQkJPGRlc2NyaXB0aW9uPgotCQkJU2VsZWN0IHRoZSA8Yj5DcmVhdGUgWE1MIGZpbGUgZnJvbSBzY3JhdGNoPC9iPiByYWRpbyBidXR0b24gaWYgeW91IHdhbnQgdG8gY3JlYXRlIGFuIFhNTCBmaWxlIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IFhNTCBzY2hlbWEgb3IgRFREIGZpbGUuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXR4bWwuaHRtbCIKLQkJCWxhYmVsPSJDcmVhdGluZyBlbXB0eSBYTUwgZmlsZXMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxjMDUwMCI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVNlbGVjdCB0aGUgPGI+U2VsZWN0IGZpbGUgZnJvbSB3b3JrYmVuY2g8L2I+IHJhZGlvIGJ1dHRvbiBpZiB5b3Ugd2FudCB0byBjcmVhdGUgeW91ciBYTUwgZmlsZSBmcm9tIGEgRFREIG9yIFhNTCBzY2hlbWEgdGhhdCBpcyBpbiB0aGUgd29ya2JlbmNoLgotCi0JCQlTZWxlY3QgdGhlIDxiPlNlbGVjdCBYTUwgQ2F0YWxvZyBlbnRyeTwvYj4gcmFkaW8gYnV0dG9uIGlmIHlvdSB3YW50IHRvIHVzZSBhIGZpbGUgbGlzdGVkIGluIHRoZSBYTUwgQ2F0YWxvZyB0byBjcmVhdGUgeW91ciBYTUwgZmlsZS4KLQkJPC9kZXNjcmlwdGlvbj4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhtbGMwNDEwIj4KLQkJPGRlc2NyaXB0aW9uPgotCQkJVGhlIHJvb3QgZWxlbWVudCBvZiBhbiBYTUwgZmlsZSBpcyB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGFsbCBvdGhlciBlbGVtZW50cyBpbiB0aGF0IGZpbGUuIEFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBEVEQgb3IgYWxsIGdsb2JhbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBYTUwgc2NoZW1hIGFyZSBpbmNsdWRlZCBpbiB0aGlzIGxpc3QuCi0KLQkJCTxiPk5vdGU8L2I+OiBJZiB5b3UgZG8gbm90IGhhdmUgYW55IGVsZW1lbnRzIGluIHlvdXIgRFREIG9yIGFueSBnbG9iYWwgZWxlbWVudHMgaW4geW91ciBYTUwgc2NoZW1hLCB5b3UgY2Fubm90IGNyZWF0ZSBhbiBYTUwgZmlsZSBmcm9tIGl0LgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmh0bWwiCi0JCQlsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIiAvPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwiCi0JCQlsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhtbGMwNDQxIj4KLQkJPGRlc2NyaXB0aW9uPklmIHlvdSBzZWxlY3QgdGhpcyBjaGVjayBib3gsIGJvdGggbWFuZGF0b3J5IGFuZCBvcHRpb25hbCBhdHRyaWJ1dGVzIHdpbGwgYmUgZ2VuZXJhdGVkLiBJZiB5b3UgZG8gbm90IHNlbGVjdCBpdCwgb25seSBtYW5kYXRvcnkgYXR0cmlidXRlcyB3aWxsIGJlIGdlbmVyYXRlZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmh0bWwiCi0JCQlsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIiAvPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwiCi0JCQlsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhtbGMwNDQyIj4KLQkJPGRlc2NyaXB0aW9uPklmIHlvdSBzZWxlY3QgdGhpcyBjaGVjayBib3gsIGJvdGggdGhlIG1hbmRhdG9yeSBhbmQgb3B0aW9uYWwgZWxlbWVudHMgd2lsbCBiZSBnZW5lcmF0ZWQuIElmIHlvdSBkbyBub3Qgc2VsZWN0IGl0LCBvbmx5IG1hbmRhdG9yeSBlbGVtZW50cyB3aWxsIGJlIGdlbmVyYXRlZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmh0bWwiCi0JCQlsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIiAvPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwiCi0JCQlsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhtbGMwNDQzIj4KLQkJPGRlc2NyaXB0aW9uPgotCQkJSWYgeW91IHNlbGVjdCB0aGlzIGNoZWNrIGJveCwgdGhlIGZpcnN0IGNob2ljZSBvZiBhIHJlcXVpcmVkIGNob2ljZSB3aWxsIGJlIGdlbmVyYXRlZCBpbiB5b3VyIFhNTCBmaWxlLgotCi0JCQlGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhlIGZvbGxvd2luZyBjb2RlIGluIHlvdXIgc291cmNlIGZpbGU6Ci0KLQkJCTxiPiZsdDtjaG9pY2UmZ3Q7ICZsdDtlbGVtZW50IG5hbWU9ImEiIHR5cGU9InN0cmluZyZndDsgJmx0O2VsZW1lbnQgbmFtZT0iYiIgdHlwZT0iaW50ZWdlciZndDsgJmx0Oy9jaG9pY2UmZ3Q7PC9iPgotCi0JCQlhbmQgeW91IHNlbGVjdCB0aGlzIGNoZWNrIGJveCwgYW4gZWxlbWVudCBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSBjcmVhdGVkIGluIHlvdXIgWE1MIGZpbGU6Ci0KLQkJCTxiPiZsdDthJmd0O2hlbGxvJmx0Oy9hJmd0OzwvYj4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sIgotCQkJbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIgLz4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sIgotCQkJbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxjMDQ0NCI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCUlmIHlvdSBzZWxlY3QgdGhpcyBjaGVjayBib3gsIGFueSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBnZW5lcmF0ZWQgd2lsbCBiZSBmaWxsZWQgd2l0aCBzYW1wbGUgZGF0YSwgc3VjaCBhcyA8Yj4mbHQ7dGV4dCZndDtFbXB0eVRleHQmbHQ7L3RleHQmZ3Q7LjwvYj4gT3RoZXJ3aXNlLCB0aGV5IHdpbGwgYmUgZW1wdHkgLSB0aGF0IGlzLCA8Yj4mbHQ7dGV4dCZndDsmbHQ7L3RleHQmZ3Q7LjwvYj4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sIgotCQkJbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIgLz4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sIgotCQkJbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxjMDIxMCI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgU3lzdGVtIElEIHZhbHVlIGNvcnJlc3BvbmRzIHRvIHRoZSBVUkkgKHBoeXNpY2FsIGxvY2F0aW9uKSBvZiB0aGUgRFREIGZpbGUuIFRoZSBQdWJsaWMgSUQgdmFsdWUgY2FuIHJlZmVyIHRvIGEgRFREIGVudHJ5IGluIGFuIFhNTCBDYXRhbG9nLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbCIKLQkJCWxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxjMDIyMCI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgU3lzdGVtIElEIHZhbHVlIGNvcnJlc3BvbmRzIHRvIHRoZSBVUkkgKHBoeXNpY2FsIGxvY2F0aW9uKSBvZiB0aGUgRFREIGZpbGUuIFRoZSBQdWJsaWMgSUQgdmFsdWUgY2FuIHJlZmVyIHRvIGEgRFREIGVudHJ5IGluIGFuIFhNTCBDYXRhbG9nLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbCIKLQkJCWxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiIC8+Ci0JPC9jb250ZXh0PgotPC9jb250ZXh0cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9YU0RDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9YU0RDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZWE4OWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvWFNEQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLQkqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLQkqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotCSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLQkqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0JKiAKLQkqIENvbnRyaWJ1dG9yczoKLQkqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPCEtLSBwbHVnaW5zOiBvcmcuZWNsaXBzZS51aS5pZGUgYW5kIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwgLS0+Ci0KLTxjb250ZXh0cz4KLQk8Y29udGV4dCBpZD0iY3NoX291dGVyX2NvbnRhaW5lciI+Ci0JCTxkZXNjcmlwdGlvbiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibmV3X2ZpbGVfd2l6YXJkX3BhZ2VfY29udGV4dCI+PCEtLSBmaXggdGhpcywgdGhlcmUgaXMgbm8gY29udGV4dCBpZCBhdG0gLS0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVNlbGVjdCB0aGUgcHJvamVjdCBvciBmb2xkZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIFhNTCBzY2hlbWEuIEluIHRoZSA8Yj5GaWxlIG5hbWU8L2I+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mIHRoZSBYTUwgc2NoZW1hLCBmb3IgZXhhbXBsZSA8aT5NeVhNTFNjaGVtYS54c2Q8L2k+LiBUaGUgbmFtZSBvZiB5b3VyIFhNTCBzY2hlbWEgbXVzdCBlbmQgaW4gPGk+LnhzZDwvaT4uCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGN4bWxzY2guaHRtbCIKLQkJCWxhYmVsPSJDcmVhdGluZyBYTUwgc2NoZW1hcyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhzZHAwMDEwIj4KLQkJPGRlc2NyaXB0aW9uPgotCQkJU2VsZWN0IHRoZSA8Yj5RdWFsaWZ5IFhNTCBzY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0czwvYj4gY2hlY2sgYm94IGlmIHlvdSB3YW50IGEgcHJlZml4IGFwcGxpZWQgdG8gYWxsIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBpbiB5b3VyIFhNTCBzY2hlbWEuCi0KLQkJCUluIHRoZSA8Yj5YTUwgc2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgcHJlZml4PC9iPiBmaWVsZCwgdHlwZSB0aGUgcHJlZml4IHlvdSB3YW50IGFwcGxpZWQgdG8gWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIGluIHlvdXIgWE1MIHNjaGVtYS4gVGhlIHByZWZpeCA8aT54c2Q8L2k+IGlzIHVzZWQgYnkgY29udmVudGlvbiB0byBkZW5vdGUgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlLCBidXQgYW55IHByZWZpeCBjYW4gYmUgdXNlZC4gVGhlIHB1cnBvc2Ugb2YgdGhlIGFzc29jaWF0aW9uIGlzIHRvIGlkZW50aWZ5IHRoZSBlbGVtZW50cyBhbmQgc2ltcGxlIHR5cGVzIGFzIGJlbG9uZ2luZyB0byB0aGUgdm9jYWJ1bGFyeSBvZiB0aGUgWE1MIFNjaGVtYSBsYW5ndWFnZSByYXRoZXIgdGhhbiB0aGUgdm9jYWJ1bGFyeSBvZiB0aGUgc2NoZW1hIGF1dGhvci4KLQotCQkJPGI+Tm90ZTo8L2I+IFRoaXMgcHJlZml4IHdpbGwgbm90IGFwcGVhciBpbiBhbnkgc2NoZW1hcyB0aGF0IGN1cnJlbnRseSBleGlzdCAtIGl0IHdpbGwgb25seSBhcHBlYXIgaW4gbmV3IHNjaGVtYXMgeW91IGNyZWF0ZSBhZnRlciB5b3UgdHlwZSB0aGUgcHJlZml4IGFuZCBjbGljayA8Yj5BcHBseTwvYj4uIEFueSBzY2hlbWFzIHRoYXQgYWxyZWFkeSBleGlzdCB3aWxsIGhhdmUgdGhlIHByZWZpeCBzcGVjaWZpZWQgaW4gdGhlIHNjaGVtYSBhcHBsaWVkIHRvIHRoZSBYTUwgc2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMuCi0KLQkJCVlvdSBjYW4gY2hhbmdlIHRoZSA8Yj5EZWZhdWx0IFRhcmdldCBOYW1lc3BhY2U8L2I+IHZhbHVlLiBUaGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoaXMgZmllbGQgd2lsbCBiZSB0aGUgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlIGZvciBhbnkgbmV3IFhNTCBzY2hlbWEgZmlsZXMgY3JlYXRlZC4KLQotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcmVmLmh0bWwiCi0JCQlsYWJlbD0iRWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZWNlcyIgLz4KLQk8L2NvbnRleHQ+Ci08L2NvbnRleHRzPgotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwY2U4OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIEVkaXRvclhtbENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBFZGl0b3JYbWxDb250ZXh0czIueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBYTUxXaXphcmRDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgVGFibGVUcmVlLnhtbCxcCi0gICAgICAgICAgICAgICBXU0RMQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIFhTRENvbnRleHRzLnhtbAotICAgICAgICAgICAgICAgCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOTFjNDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lICAgICA9IFhNTCBpbmZvcG9wcwotcGx1Z2luUHJvdmlkZXIgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZjRjNWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4xIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9yWG1sQ29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpIi8+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IkVkaXRvclhtbENvbnRleHRzMi54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJUYWJsZVRyZWUueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpIi8+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IlhNTFdpemFyZENvbnRleHRzLnhtbCIgcGx1Z2luID0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSIvPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJXU0RMQ29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aSIvPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJYU0RDb250ZXh0cy54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC54c2QudWkiLz4KLQotPC9leHRlbnNpb24+Ci0KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUzMjk4ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyXzEuMC4wLmphcgotYmFrCi10ZW1wCi1EaXRhTGluay5jYXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMzNhZjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL0RvY0J1aWxkLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9Eb2NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZjgzNTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL0RvY0J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLSAKLQotCVRoaXMgc2NyaXB0IGJ1aWxkIHRoZSBIZWxwIHBsdWctaW4gYnkgdHJhbnNmb3JtaW5nIHRoZSBESVRBIHNvdXJjZSBmaWxlcyBpbnRvIEhUTUwuCi0JCi0JVG8gdXNlIHRoaXMgc2NyaXB0LCB5b3UgbXVzdCBpbnN0YWxsIERJVEEtT1Qgb24geW91ciBtYWNoaW5lIGluIHRoZSBkaXJlY3RvcnkKLQlkZWZpbmVkIGJ5IHRoZSBkaXRhLm90LmRpciBwcm9wZXJ0eS4KLQkKLQlSdW4gdGhlIGRlZmF1bHQgdGFyZ2V0IGFmdGVyIHlvdSBlZGl0IHRoZSBESVRBIHNvdXJjZSBmaWxlcyB0byByZWdlbmVyYXRlIHRoZSBIVE1MLgotCQotCVRvIGN1c3RvbWl6ZSB0aGlzIHNjcmlwdCBmb3Igb3RoZXIgSGVscCBwbHVnLWlucywgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgYXJncy5pbnB1dCBwcm9wZXJ0eQotCXRvIGJlIHRoZSBESVRBIG1hcCBmaWxlIGZvciB0aGUgcGx1Zy1pbi4KLQkKLQlOT1RFOiBUaGlzIHNjcmlwdCBhc3N1bWVzIHRoYXQgbGlua3MgdG8gc2libGluZyBIZWxwIHBsdWctaW5zIGhhdmUgc2NvcGU9InBlZXIiLCBvdGhlcndpc2UgdGhlCi0Jb3V0cHV0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgd2lsbCBiZSBzaGlmdGVkIGluY29ycmVjdGx5LgotCQotCU5PVEU6IFRoaXMgc2NyaXB0IGFzc3VtZXMgdGhhdCB5b3UgaGFuZCBjb2RlIHlvdXIgcGx1Z2luLnhtbCBmaWxlIGluIG15cGx1Z2luLnhtbC4gVGhpcyBmaWxlCi0Jd2lsbCBiZSBjb3BpZWQgb3ZlciB0aGUgZ2VuZXJhdGVkIHBsdWdpbi54bWwgd2hpY2ggaXMgY3VycmVudGx5IG5vdCBiZWluZyBnZW5lcmF0ZWQgY29ycmVjdGx5Ci0JYnkgRElUQS1PVC4KLQkKLQlDaGFuZ2VMb2c6Ci0JMjAwNi0wNC0wNSBBcnRodXIgUnltYW4gPHJ5bWFuQGNhLmlibS5jb20+Ci0JLSBDcmVhdGVkLgotCTIwMDgtMDEtMDkgS2F0ZSBQcmljZSA8a2F0ZXBAY2EuaWJtLmNvbT4KLQktIG1vZGlmaWVkIGZvciBuZXcgRElUQS1PVCB2ZXJzaW9uCi0JMjAwOC0wNS0wNSBLYXRlIFByaWNlIDxrYXRlcEBjYS5pYm0uY29tPgotCS0gbW9kaWZpZWQgdG8gYWRkIGdlbmVyYXRpb24gb2YgcHJlLWJ1aWx0IGhlbHAgaW5kZXguIAotCS0gTXVzdCBkZWxldGUgL2luZGV4IGZvbGRlciBiZWZvcmUgcnVubmluZyBidWlsZAotLS0+Ci08cHJvamVjdCBuYW1lPSJlY2xpcHNlaGVscCIgZGVmYXVsdD0iYWxsIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLm90LmRpciIgbG9jYXRpb249IkM6L0RJVEEtT1QxLjIuMiIgLz4KLQotCTxwYXRoIGlkPSJkb3N0LmNsYXNzLnBhdGgiPgotCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7ZGl0YS5vdC5kaXJ9JHtmaWxlLnNlcGFyYXRvcn1saWIke2ZpbGUuc2VwYXJhdG9yfWRvc3QuamFyIiAvPgotCTwvcGF0aD4KLQotCTx0YXNrZGVmIG5hbWU9ImludGVncmF0ZSIgY2xhc3NuYW1lPSJvcmcuZGl0YS5kb3N0LnBsYXRmb3JtLkludGVncmF0b3JUYXNrIj4KLQkJPGNsYXNzcGF0aCByZWZpZD0iZG9zdC5jbGFzcy5wYXRoIiAvPgotCTwvdGFza2RlZj4KLQk8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iaW50ZWdyYXRlLCBlY2xpcHNlaGVscCI+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJpbnRlZ3JhdGUiPgotCQk8aW50ZWdyYXRlIGRpdGFkaXI9IiR7ZGl0YS5vdC5kaXJ9IiAvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSByZXZpc2UgYmVsb3cgaGVyZSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImVjbGlwc2VoZWxwIj4KLQkJPGFudCBhbnRmaWxlPSIke2RpdGEub3QuZGlyfSR7ZmlsZS5zZXBhcmF0b3J9Y29uZHVjdG9yLnhtbCIgdGFyZ2V0PSJpbml0IiBkaXI9IiR7ZGl0YS5vdC5kaXJ9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNvcHljc3MiIHZhbHVlPSJubyIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNzc3BhdGgiIHZhbHVlPSIuLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnByb3ZpZGVyIiB2YWx1ZT0iRWNsaXBzZS5vcmciIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnZlcnNpb24iIHZhbHVlPSIzLjYuMCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmlucHV0IiBsb2NhdGlvbj0iWE1MQnVpbGRlcnJlbC5kaXRhbWFwIiAvPiAgICAJCQotCQkJPHByb3BlcnR5IG5hbWU9ImNsZWFuLnRlbXAiIHZhbHVlPSJ0cnVlIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImRpdGEuZXh0bmFtZSIgdmFsdWU9Ii5kaXRhIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImRpdGEudGVtcC5kaXIiIGxvY2F0aW9uPSJ0ZW1wIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dC5kaXIiIGxvY2F0aW9uPSIiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0idHJhbnN0eXBlIiB2YWx1ZT0iZWNsaXBzZWhlbHAiIC8+Ci0JCTwvYW50PgotCQk8Y29weSBmaWxlPSJteXBsdWdpbi54bWwiIHRvZmlsZT0icGx1Z2luLnhtbCIgb3ZlcndyaXRlPSJ5ZXMiIC8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJidWlsZC5pbmRleCIgZGVzY3JpcHRpb249IkJ1aWxkcyBzZWFyY2ggaW5kZXggZm9yIHRoZSBwbHVnLWluIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkgICAgIDxoZWxwLmJ1aWxkSGVscEluZGV4IG1hbmlmZXN0PSJwbHVnaW4ueG1sIiBkZXN0aW5hdGlvbj0iLiIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmJkNTBlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC43MDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcm1hcF90b2MuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVybWFwX3RvYy5kaXRhbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2YzMmQ1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVybWFwX3RvYy5kaXRhbWFwCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBtYXAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgTWFwLy9FTiINCi0gIm1hcC5kdGQiPg0KLTxtYXAgY29sbGVjdGlvbi10eXBlPSJzZXF1ZW5jZSIgaWQ9InhtbGVkaXRvcmRvY3VtZW50YXRpb24iIHRpdGxlPSJEZXZlbG9waW5nIFhNTCBmaWxlcyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd29ya1hNTC5kaXRhIiBsaW5raW5nPSJzb3VyY2Vvbmx5IiBuYXZ0aXRsZT0iV29ya2luZyB3aXRoIFhNTCBmaWxlcyI+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfY3dvcmtYTUwiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NjcmVhdHhtLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBYTUwgZmlsZXMiPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X2NjcmVhdHhtIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y3JldHhtbC5kaXRhIiBpZD0ieG1sY3JldHhtbCIgbmF2dGl0bGU9IkNyZWF0aW5nIGVtcHR5IFhNTCBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90Y3JldHhtbCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNyZXhkdGQuZGl0YSIgbmF2dGl0bGU9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90Y3JleGR0ZCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNyZXh4c2QuZGl0YSIgbmF2dGl0bGU9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGNyZXh4c2QiLz48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWE1MLmRpdGEiIG5hdnRpdGxlPSJMaW1pdGF0aW9ucyBvZiBYTUwgRWRpdG9yIg0KLXRvYz0ibm8iPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfcmxpbWl0YXRpb25zX3NsdXNoWE1MIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdHRhZy5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgZmlsZXMiPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R4ZWR0dGFnIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3htbGVkdC5kaXRhIiBuYXZ0aXRsZT0iWE1MIGVkaXRvciI+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfY3d4bWxlZHQiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4cHJlZnMuZGl0YSIgbmF2dGl0bGU9IkRlZmluaW5nIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXMiPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R4cHJlZnMiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R0YWdoaWx0LmRpdGEiIGlkPSJ0YWdoaWx0IiBuYXZ0aXRsZT0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90dGFnaGlsdCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdGVuYy5kaXRhIiBuYXZ0aXRsZT0iU3BlY2lmeWluZyBYTUwgZGVmYXVsdCBlbmNvZGluZyBsaW5lIGRlbGltaXRlcnMiPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RlZHRlbmMiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N4bWxlbmMuZGl0YSIgbmF2dGl0bGU9IlhNTCBhbmQgSFRNTCBlbmNvZGluZ3MiPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfY3htbGVuYyIvPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3Vnc3RyYXQuZGl0YSIgbmF2dGl0bGU9IlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0Ij4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RzdWdzdHJhdCIvPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmRpdGEiIGlkPSJ0eGVkdGRlcyIgbGlua2luZz0ibm9uZSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ij4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eGVkdGRlcyIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdGRvYy5kaXRhIiBpZD0idGVkdGRvYyIgbmF2dGl0bGU9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGVkdGRvYyIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdHNjaC5kaXRhIiBpZD0idGVkdHNjaCIgbmF2dGl0bGU9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RlZHRzY2giLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRwcm9jLmRpdGEiIGlkPSJ0ZWR0cHJvYyIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RlZHRwcm9jIi8+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmRpdGEiIGlkPSJ0eGVkc3JjIiBsaW5raW5nPSJub25lIiBuYXZ0aXRsZT0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R4ZWR0c3JjIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NkYXN0LmRpdGEiIG5hdnRpdGxlPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHdjZGFzdCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdtYWNyby5kaXRhIiBpZD0idHdtYWNybyIgbmF2dGl0bGU9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R3bWFjcm8iLz48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdGNuc3QuZGl0YSIgaWQ9InRlZHRjbnQiIG5hdnRpdGxlPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGVkdGNuc3QiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4c2l0eXAuZGl0YSIgbmF2dGl0bGU9IlVzaW5nIHhzaTp0eXBlIj48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R4c2l0eXAiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3JleHRjdG4uZGl0YSIgaWQ9InJleHRjdG4iIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBkb2N1bWVudHMgd2l0aCBtdWx0aXBsZSBuYW1lc3BhY2VzIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3JleHRjdG4iLz48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHd4dmFsaWQuZGl0YSIgaWQ9InhtbHZhbGlkIiBuYXZ0aXRsZT0iVmFsaWRhdGluZyBYTUwgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHd4dmFsaWQiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N4bWxjYXQuZGl0YSIgbGlua2luZz0ibm9uZSIgbmF2dGl0bGU9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF9jeG1sY2F0Ii8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eG1sY2F0LmRpdGEiIGlkPSJ0eG1sY2F0IiBuYXZ0aXRsZT0iQWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R4bWxjYXQiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRncmFtLmRpdGEiIGlkPSJ0ZWR0Z3JhbSIgbmF2dGl0bGU9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcnhtbGNhdGtleS5kaXRhIiBpZD0icnhtbGNhdGtleSIgbmF2dGl0bGU9IlhNTCBDYXRhbG9nIGtleWJvYXJkIHNob3J0Y3V0cyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF9yeG1sY2F0a2V5Ii8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9yeG1sdG9vbHNrZXkuZGl0YSIgbmF2dGl0bGU9IlhNTCBlZGl0b3Iga2V5Ym9hcmQgc2hvcnRjdXRzIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RlZHRncmFtIi8+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3J4bWxiaWNvbnMuZGl0YSIgaWQ9InJpY29ucyIgbmF2dGl0bGU9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3IiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfcnhtbGJpY29ucyIvPjwvdG9waWNyZWY+DQotPC9tYXA+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJtYXBfdG9jLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVybWFwX3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOWM4MDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJtYXBfdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IkRldmVsb3BpbmcgWE1MIGZpbGVzIiB0b3BpYz0idG9waWNzL2N3b3JrWE1MLmh0bWwiPgotPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggWE1MIGZpbGVzIiBocmVmPSJ0b3BpY3MvY3dvcmtYTUwuaHRtbCI+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF9jd29ya1hNTCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBYTUwgZmlsZXMiIGhyZWY9InRvcGljcy9jY3JlYXR4bS5odG1sIj4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X2NjcmVhdHhtIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL3RjcmV0eG1sLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RjcmV0eG1sIi8+Ci08dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIgaHJlZj0idG9waWNzL3RjcmV4ZHRkLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RjcmV4ZHRkIi8+Ci08dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90Y3JleHhzZC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90Y3JleHhzZCIvPgotPC90b3BpYz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3JsaW1pdGF0aW9uc19zbHVzaFhNTCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmh0bWwiPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHhlZHR0YWciLz4KLTx0b3BpYyBsYWJlbD0iWE1MIGVkaXRvciIgaHJlZj0idG9waWNzL2N3eG1sZWR0Lmh0bWwiPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfY3d4bWxlZHQiLz4KLTx0b3BpYyBsYWJlbD0iRGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3R4cHJlZnMuaHRtbCI+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eHByZWZzIi8+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiIGhyZWY9InRvcGljcy90dGFnaGlsdC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90dGFnaGlsdCIvPgotPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIFhNTCBkZWZhdWx0IGVuY29kaW5nIGxpbmUgZGVsaW1pdGVycyIgaHJlZj0idG9waWNzL3RlZHRlbmMuaHRtbCI+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0ZW5jIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBhbmQgSFRNTCBlbmNvZGluZ3MiIGhyZWY9InRvcGljcy9jeG1sZW5jLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X2N4bWxlbmMiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0IiBocmVmPSJ0b3BpY3MvdHN1Z3N0cmF0Lmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RzdWdzdHJhdCIvPgotPC90b3BpYz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuaHRtbCI+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eGVkdGRlcyIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIiBocmVmPSJ0b3BpY3MvdGVkdGRvYy5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0ZG9jIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIiBocmVmPSJ0b3BpY3MvdGVkdHNjaC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0c2NoIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIiBocmVmPSJ0b3BpY3MvdGVkdHByb2MuaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGVkdHByb2MiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuaHRtbCI+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eGVkdHNyYyIvPgotPHRvcGljIGxhYmVsPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiIGhyZWY9InRvcGljcy90d2NkYXN0Lmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R3Y2Rhc3QiLz4KLTx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiIGhyZWY9InRvcGljcy90d21hY3JvLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R3bWFjcm8iLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50cyIgaHJlZj0idG9waWNzL3RlZHRjbnN0Lmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RlZHRjbnN0Ii8+Ci08dG9waWMgbGFiZWw9IlVzaW5nIHhzaTp0eXBlIiBocmVmPSJ0b3BpY3MvdHhzaXR5cC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eHNpdHlwIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIGRvY3VtZW50cyB3aXRoIG11bHRpcGxlIG5hbWVzcGFjZXMiIGhyZWY9InRvcGljcy9yZXh0Y3RuLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3JleHRjdG4iLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IlZhbGlkYXRpbmcgWE1MIGZpbGVzIiBocmVmPSJ0b3BpY3MvdHd4dmFsaWQuaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHd4dmFsaWQiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy9jeG1sY2F0Lmh0bWwiPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfY3htbGNhdCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2ciIGhyZWY9InRvcGljcy90eG1sY2F0Lmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R4bWxjYXQiLz4KLTx0b3BpYyBsYWJlbD0iVXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXMiIGhyZWY9InRvcGljcy90ZWR0Z3JhbS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBDYXRhbG9nIGtleWJvYXJkIHNob3J0Y3V0cyIgaHJlZj0idG9waWNzL3J4bWxjYXRrZXkuaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfcnhtbGNhdGtleSIvPgotPHRvcGljIGxhYmVsPSJTb3VyY2UgZWRpdG9yIGFuZCBYTUwgdG9vbHMga2V5Ym9hcmQgc2hvcnRjdXRzIiBocmVmPSJ0b3BpY3MvcnhtbHRvb2xza2V5Lmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RlZHRncmFtIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJJY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yIiBocmVmPSJ0b3BpY3MvcnhtbGJpY29ucy5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF9yeG1sYmljb25zIi8+Ci08L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcnJlbC5kaXRhbWFwIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJyZWwuZGl0YW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhYmEwNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcnJlbC5kaXRhbWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgbWFwIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIE1hcC8vRU4iDQotICJtYXAuZHRkIj4NCi08bWFwIGlkPSJ4bWxlZGl0b3JyZWx0YWJsZSI+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNyZXR4bWwuZGl0YSIgaWQ9InhtbGNyZXR4bWwiIG5hdnRpdGxlPSJDcmVhdGluZyBlbXB0eSBYTUwgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y3JleGR0ZC5kaXRhIiBuYXZ0aXRsZT0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNyZXh4c2QuZGl0YSIgbmF2dGl0bGU9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdHRhZy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3htbGVkdC5kaXRhIiBuYXZ0aXRsZT0iWE1MIGVkaXRvciI+PC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHR0YWcuZGl0YSIgbGlua2luZz0ic291cmNlb25seSIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlhNTCBlZGl0b3IiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdGRlcy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdHNyYy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N4bWxjYXQuZGl0YSIgbmF2dGl0bGU9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdGNuc3QuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50cyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRkb2MuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eG1sY2F0LmRpdGEiIGlkPSJ0eG1sY2F0IiBuYXZ0aXRsZT0iQWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdGdyYW0uZGl0YSIgaWQ9InRlZHRncmFtIiBuYXZ0aXRsZT0iVXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N4bWxjYXQuZGl0YSIgbmF2dGl0bGU9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdGNuc3QuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50cyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRzY2guZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhtbGNhdC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdGdyYW0uZGl0YSIgbmF2dGl0bGU9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSIgbGlua2luZz0ibm9ybWFsIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRwcm9jLmRpdGEiIGlkPSJ0ZWR0cHJvYyIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3htbGNhdC5kaXRhIiBuYXZ0aXRsZT0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5IiBsaW5raW5nPSJub3JtYWwiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuZGl0YSIgbmF2dGl0bGU9IlhNTCBlZGl0b3IiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdGRlcy5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdHNyYy5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sY2F0LmRpdGEiIG5hdnRpdGxlPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiIGxpbmtpbmc9Im5vcm1hbCI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3h2YWxpZC5kaXRhIiBuYXZ0aXRsZT0iVmFsaWRhdGluZyBYTUwgZmlsZXMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3htbGVkdC5kaXRhIiBuYXZ0aXRsZT0iWE1MIGVkaXRvciI+PC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNyZXh4c2QuZGl0YSIgbmF2dGl0bGU9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5kaXRhIg0KLWxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJYTUwgbmFtZXNwYWNlcyIgc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRzY2guZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuZGl0YSINCi1saW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iWE1MIG5hbWVzcGFjZXMiIHNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdHNyYy5kaXRhIiBpZD0idHhlZHNyYyIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjZGFzdC5kaXRhIiBuYXZ0aXRsZT0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0Ij4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdHNyYy5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d21hY3JvLmRpdGEiIG5hdnRpdGxlPSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHRhZ2hpbHQuZGl0YSIgbmF2dGl0bGU9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y2Rhc3QuZGl0YSIgbmF2dGl0bGU9IlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3bWFjcm8uZGl0YSIgbmF2dGl0bGU9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NkYXN0LmRpdGEiIG5hdnRpdGxlPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3Vnc3RyYXQuZGl0YSIgbmF2dGl0bGU9IlhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdGRvYy5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdHNjaC5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24iPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRwcm9jLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcnhtbGJpY29ucy5kaXRhIiBuYXZ0aXRsZT0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvciI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPC9tYXA+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJyZWwueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJyZWwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDBhYjUwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVycmVsLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgdG9waWM9InRvcGljcy90Y3JldHhtbC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgWE1MIGZpbGVzIiBocmVmPSJ0b3BpY3MvdGNyZXR4bWwuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiIGhyZWY9InRvcGljcy90Y3JleGR0ZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90Y3JleHhzZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIGZpbGVzIiBocmVmPSJ0b3BpY3MvdHhlZHR0YWcuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgZWRpdG9yIiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIGVkaXRvciIgaHJlZj0idG9waWNzL2N3eG1sZWR0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIGhyZWY9InRvcGljcy90eGVkdGRlcy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL2N4bWxjYXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiIGhyZWY9InRvcGljcy90ZWR0Y25zdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiIGhyZWY9InRvcGljcy90ZWR0ZG9jLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nIiBocmVmPSJ0b3BpY3MvdHhtbGNhdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGVkdGdyYW0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL2N4bWxjYXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiIGhyZWY9InRvcGljcy90ZWR0Y25zdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIiBocmVmPSJ0b3BpY3MvdGVkdHNjaC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyIgaHJlZj0idG9waWNzL3R4bWxjYXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJVcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RlZHRncmFtLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiIGhyZWY9InRvcGljcy90ZWR0cHJvYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBlZGl0b3IiIGhyZWY9InRvcGljcy9jd3htbGVkdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy9jeG1sY2F0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVmFsaWRhdGluZyBYTUwgZmlsZXMiIGhyZWY9InRvcGljcy90d3h2YWxpZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBlZGl0b3IiIGhyZWY9InRvcGljcy9jd3htbGVkdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90Y3JleHhzZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBuYW1lc3BhY2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiIgaHJlZj0idG9waWNzL3RlZHRzY2guaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgbmFtZXNwYWNlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciIGhyZWY9InRvcGljcy90eGVkdHNyYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdCIgaHJlZj0idG9waWNzL3R3Y2Rhc3QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiIGhyZWY9InRvcGljcy90d21hY3JvLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciIGhyZWY9InRvcGljcy90eGVkdHNyYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiIGhyZWY9InRvcGljcy90dGFnaGlsdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdCIgaHJlZj0idG9waWNzL3R3Y2Rhc3QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyIgaHJlZj0idG9waWNzL3R3bWFjcm8uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiIGhyZWY9InRvcGljcy90d2NkYXN0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyB0aGUgWE1MIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3QiIGhyZWY9InRvcGljcy90c3Vnc3RyYXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyIgaHJlZj0idG9waWNzL3RlZHRkb2MuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24iIGhyZWY9InRvcGljcy90ZWR0c2NoLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIGhyZWY9InRvcGljcy90eGVkdGRlcy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIiBocmVmPSJ0b3BpY3MvdGVkdHByb2MuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvciIgaHJlZj0idG9waWNzL3J4bWxiaWNvbnMuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjUxZDU0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gWE1MQnVpbGRlcm1hcF90b2MueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaW1hZ2VzLyxcCi0gICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdG9waWNzLyouaHRtKixcCi0gICAgICAgICAgICAgICBpbmRleC8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzLFwKLQkJICAgICAgICoubWFwbGlzdCxcCi0gICAgICAgICAgICAgICAqLmRpdGFtYXAsXAotCQkgICAgICAgdG9waWNzLyouZGl0YQotYmluLmV4Y2x1ZGVzID0gRG9jQnVpbGQueG1sLFwKLSAgICAgICAgICAgICAgIG15UGx1Z2luKi54bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2NkYXRhc2VjdGlvbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2NkYXRhc2VjdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMDg3MmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9jZGF0YXNlY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9jb2xsYXBzZV9hbGwuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9jb2xsYXBzZV9hbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGMwZGU1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29tbWVudF9vYmouZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9jb21tZW50X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YzJjY2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9jb21tZW50X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2RvY3R5cGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9kb2N0eXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwMGY4Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2RvY3R5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9leHBhbmRfYWxsLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvZXhwYW5kX2FsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MmMxNGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9leHBhbmRfYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvbmF0dHJpYi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25hdHRyaWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWE5OTc0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvbmF0dHJpYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25lbGVtLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvbmVsZW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmFiZGRhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvbmVsZW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ucnN0cnZhbC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25yc3RydmFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0MmI4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25yc3RydmFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvcHJvaW5zdF9vYmouZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9wcm9pbnN0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDM2ZDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9wcm9pbnN0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL3JsZGdybXIuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ybGRncm1yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5Y2FjNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL3JsZGdybXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9zdWdnZXN0aW9uLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvc3VnZ2VzdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZWE4NDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9zdWdnZXN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9fdy5jZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvX3cuY2ZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDI4ODk4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9fdy5jZnMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvZGVsZXRhYmxlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkzZjQ3MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvZGVsZXRhYmxlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfY29udHJpYnV0aW9ucyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTJjY2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfY29udHJpYnV0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI1R1ZSBNYXkgMjAgMTE6MTM6MDUgRURUIDIwMDgNCi1vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyPW9yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXJcbjEuMC40MDAucXVhbGlmaWVyDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZGVwZW5kZW5jaWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZGVwZW5kZW5jaWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDA5ZDRlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI1R1ZSBNYXkgMjAgMTE6MTM6MDUgRURUIDIwMDgNCi1sdWNlbmU9MS45LjEudjIwMDgwMzA2MTgxMQ0KLWFuYWx5emVyPW9yZy5lY2xpcHNlLmhlbHAuYmFzZVwjMy4zLjEwMC52MjAwODA0MjU/bG9jYWxlXD1lbg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2RvY3MgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDIwZGUyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2RvY3MKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4NCi0jVHVlIE1heSAyMCAxMToxMzowNSBFRFQgMjAwOA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NoLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya1hNTC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHR0YWcuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRjbnN0Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sY2F0Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sY2F0a2V5Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZW5jLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd3htbGVkdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhwcmVmcy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHd4dmFsaWQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcm9jLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jY3JlYXR4bS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhtbGNhdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRzcmMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JleHRjdG4uaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R0YWdoaWx0Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sZW5jLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sYmljb25zLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d2NkYXN0Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXR4bWwuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWx0b29sc2tleS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXh4c2QuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3bWFjcm8uaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRncmFtLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhzaXR5cC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHN1Z3N0cmF0Lmh0bWw9MA0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9zZWdtZW50cyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9zZWdtZW50cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRhNjkyYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvbXlwbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVmMjAwNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvbXlwbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjYiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRoaXMgaXMgdGhlIHBsdWdpbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwICAgICAgICAgLS0+Ci08IS0tIGNvbnRyaWJ1dGlvbnMgZm9yIHVzaW5nIHRoZSB0b29sLiAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLTxwbHVnaW4+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICA8dG9jIGZpbGU9IlhNTEJ1aWxkZXJtYXBfdG9jLnhtbCIvPgotICAgICAgIDxpbmRleCBwYXRoPSJpbmRleC8iLz4KLSAgICAgIAotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotICAgICAgICA8aW5kZXggZmlsZT0ib3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCIvPiAgICAgCi0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci5tYXBsaXN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIubWFwbGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMzZTI0OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci5tYXBsaXN0CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08bWFwbGlzdCB2ZXJzaW9uPSIzLjYuMiI+DQotICA8bmF2Pg0KLSAgICA8bWFwIGZpbGU9IlhNTEJ1aWxkZXJtYXBfdG9jLmRpdGFtYXAiLz4NCi0gIDwvbmF2Pg0KLSAgPGxpbms+DQotICAgIDxtYXAgZmlsZT0iWE1MQnVpbGRlcnJlbC5kaXRhbWFwIi8+DQotICA8L2xpbms+DQotPC9tYXBsaXN0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMThiYTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxpbmRleD4KLSAgPGVudHJ5IGtleXdvcmQ9IlhNTCBmaWxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNyZXR4bWwuaHRtbCN0Y3JldHhtbCIgdGl0bGU9IkNyZWF0aW5nIFhNTCBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRpbmcgZnJvbSBEVERzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNyZXhkdGQuaHRtbCN0Y3JleGR0ZCIgdGl0bGU9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRpbmcgZnJvbSBYTUwgc2NoZW1hcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjcmV4eHNkLmh0bWwjdGNyZXh4c2QiIHRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2NoZW1hcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjcmV4eHNkLmh0bWwjdGNyZXh4c2QiIHRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmh0bWwjdHhlZHR0YWciIHRpdGxlPSJFZGl0aW5nIFhNTCBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNwZWNpZnlpbmcgbGluZSBkZWxpbWl0ZXJzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGVuYy5odG1sI3RlZHRlbmMiIHRpdGxlPSJTcGVjaWZ5aW5nIFhNTCBkZWZhdWx0IGVuY29kaW5nIGxpbmUgZGVsaW1pdGVycyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im5hbWVzcGFjZSBpbmZvcm1hdGlvbiI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRzY2guaHRtbCN0ZWR0c2NoIiB0aXRsZT0iRWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24iLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwcm9jZXNzaW5nIGluc3RydWN0aW9ucyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRwcm9jLmh0bWwjdGVkdHByb2MiIHRpdGxlPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvbnRlbnQgYXNzaXN0Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdjZGFzdC5odG1sI3R3Y2Rhc3QiIHRpdGxlPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJ0ZW1wbGF0ZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d21hY3JvLmh0bWwjdHdtYWNybyIgdGl0bGU9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyB3aXRoIGNvbnN0cmFpbnRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGNuc3QuaHRtbCN0ZWR0Y25zdCIgdGl0bGU9IkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InZhbGlkYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d3h2YWxpZC5odG1sI3R3eHZhbGlkIiB0aXRsZT0iVmFsaWRhdGluZyBYTUwgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhc3NvY2lhdGlvbnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jeG1sY2F0Lmh0bWwjY3htbGNhdCIgdGl0bGU9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idXBkYXRpbmcgd2l0aCBhc3NvY2lhdGVkIGNoYW5nZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0Z3JhbS5odG1sI3RlZHRncmFtIiB0aXRsZT0iVXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iRFREcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRpbmcgWE1MIGZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNyZXhkdGQuaHRtbCN0Y3JleGR0ZCIgdGl0bGU9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzY2hlbWFzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iZ2VuZXJhdGluZyBYTUwgZmlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90Y3JleHhzZC5odG1sI3RjcmV4eHNkIiB0aXRsZT0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwgZWRpdG9yIj4KLSAgICA8ZW50cnkga2V5d29yZD0iWE1MIGZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHhlZHR0YWcuaHRtbCN0eGVkdHRhZyIgdGl0bGU9IkVkaXRpbmcgWE1MIGZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jd3htbGVkdC5odG1sI2N3eG1sZWR0IiB0aXRsZT0iWE1MIGVkaXRvciIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InByZWZlcmVuY2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHhwcmVmcy5odG1sI3R4cHJlZnMiIHRpdGxlPSJEZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R0YWdoaWx0Lmh0bWwjdHRhZ2hpbHQiIHRpdGxlPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3Vnc3RyYXQuaHRtbCN4bWxzb3VyY2VzdWdnZXN0aW9uc3RyYXRlZ3kiIHRpdGxlPSJTZXR0aW5nIHRoZSBYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdCIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRlc2lnbiB2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuaHRtbCN0eGVkdGRlcyIgdGl0bGU9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iRE9DVFlQRSBkZWNsYXJhdGlvbnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0ZG9jLmh0bWwjdGVkdGRvYyIgdGl0bGU9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJuYW1lc3BhY2UgaW5mb3JtYXRpb24iPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0c2NoLmh0bWwjdGVkdHNjaCIgdGl0bGU9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0cHJvYy5odG1sI3RlZHRwcm9jIiB0aXRsZT0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJTb3VyY2UgdmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmh0bWwjdHhlZHRzcmMiIHRpdGxlPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvbnRlbnQgYXNzaXN0Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdjZGFzdC5odG1sI3R3Y2Rhc3QiIHRpdGxlPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIHdpdGggY29uc3RyYWludHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0Y25zdC5odG1sI3RlZHRjbnN0IiB0aXRsZT0iRWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idXBkYXRpbmcgWE1MIGZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGdyYW0uaHRtbCN0ZWR0Z3JhbSIgdGl0bGU9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWNjZXNzaWJpbGl0eSI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3J4bWxjYXRrZXkuaHRtbCN4bWxjYXRhbG9na2V5Ym9hcmRzaG9ydGN1dHMiIHRpdGxlPSJYTUwgQ2F0YWxvZyBrZXlib2FyZCBzaG9ydGN1dHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJrZXlib2FyZCBzaG9ydGN1dHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9yeG1sY2F0a2V5Lmh0bWwjeG1sY2F0YWxvZ2tleWJvYXJkc2hvcnRjdXRzIiB0aXRsZT0iWE1MIENhdGFsb2cga2V5Ym9hcmQgc2hvcnRjdXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaWNvbnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9yeG1sYmljb25zLmh0bWwjcmljb25zIiB0aXRsZT0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvciIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwcmVmZXJlbmNlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBlZGl0b3IiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90eHByZWZzLmh0bWwjdHhwcmVmcyIgdGl0bGU9IkRlZmluaW5nIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibGluZSBkZWxpbWl0ZXJzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iWE1MIGZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGVuYy5odG1sI3RlZHRlbmMiIHRpdGxlPSJTcGVjaWZ5aW5nIFhNTCBkZWZhdWx0IGVuY29kaW5nIGxpbmUgZGVsaW1pdGVycyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJjaGFyYWN0ZXIgZW5jb2RpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJzdXBwb3J0ZWQgY2hhcmFjdGVyIHNldHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jeG1sZW5jLmh0bWwjY3htbGVuYyIgdGl0bGU9IlhNTCBhbmQgSFRNTCBlbmNvZGluZ3MiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iRE9DVFlQRSBkZWNsYXJhdGlvbnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJYTUwgZWRpdG9yIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGRvYy5odG1sI3RlZHRkb2MiIHRpdGxlPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InRlbXBsYXRlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Indvcmtpbmcgd2l0aCBwcmVkZWZpbmVkIFhNTCBjb2RlIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdtYWNyby5odG1sI3R3bWFjcm8iIHRpdGxlPSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwgY2F0YWxvZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sI2N4bWxjYXQiIHRpdGxlPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyBlbnRyaWVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHhtbGNhdC5odG1sI3R4bWxjYXQiIHRpdGxlPSJBZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2ciLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iYWNjZXNzaWJpbGl0eSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImtleWJvYXJkIHNob3J0Y3V0cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iWE1MIGVkaXRvciI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcnhtbGNhdGtleS5odG1sI3htbGNhdGFsb2drZXlib2FyZHNob3J0Y3V0cyIgdGl0bGU9IlhNTCBDYXRhbG9nIGtleWJvYXJkIHNob3J0Y3V0cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ia2V5Ym9hcmQgc2hvcnRjdXRzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iWE1MIGVkaXRvciI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3J4bWxjYXRrZXkuaHRtbCN4bWxjYXRhbG9na2V5Ym9hcmRzaG9ydGN1dHMiIHRpdGxlPSJYTUwgQ2F0YWxvZyBrZXlib2FyZCBzaG9ydGN1dHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic2hvcnRjdXRzIj4KLSAgICA8ZW50cnkga2V5d29yZD0ia2V5Ym9hcmQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBlZGl0b3IiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3J4bWxjYXRrZXkuaHRtbCN4bWxjYXRhbG9na2V5Ym9hcmRzaG9ydGN1dHMiIHRpdGxlPSJYTUwgQ2F0YWxvZyBrZXlib2FyZCBzaG9ydGN1dHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLTwvaW5kZXg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWVkMzc5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgICAgID0gWE1MIGVkaXRvcgotcGx1Z2luUHJvdmlkZXIgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVmMjAwNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy42Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnaW4gZm9yIGRlY2xhcmluZyB0aGUgaGVscCAgICAgICAgIC0tPgotPCEtLSBjb250cmlidXRpb25zIGZvciB1c2luZyB0aGUgdG9vbC4gICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgPHRvYyBmaWxlPSJYTUxCdWlsZGVybWFwX3RvYy54bWwiLz4KLSAgICAgICA8aW5kZXggcGF0aD0iaW5kZXgvIi8+Ci0gICAgICAKLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgICAgPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwiLz4gICAgIAotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jY3JlYXR4bS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jY3JlYXR4bS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDE5MDQ4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiIgICJjb25jZXB0LmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08Y29uY2VwdCBpZD0iY3JlYXRpbmd4bWxmaWxlcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgWE1MIGZpbGVzPC90aXRsZT4NCi08c2hvcnRkZXNjPlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBjcmVhdGluZyBYTUwgZmlsZXM6PC9zaG9ydGRlc2M+DQotPGNvbmJvZHk+PC9jb25ib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rbGlzdD4NCi08bGluayBocmVmPSJ0Y3JldHhtbC5kaXRhIj48bGlua3RleHQ+Q3JlYXRpbmcgZW1wdHkgWE1MIGZpbGVzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idGNyZXhkdGQuZGl0YSI+PGxpbmt0ZXh0PkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gYSBEVERzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idGNyZXh4c2QuZGl0YSI+PGxpbmt0ZXh0PkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MDQotc2NoZW1hczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua2xpc3Q+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvY29uY2VwdD4NCi08P1B1YiAqMDAwMDAwMDcxOD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jY3JlYXR4bS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jY3JlYXR4bS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzExNzY3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIFhNTCBmaWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gY3JlYXRpbmcgWE1MIGZpbGVzOiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gY3JlYXRpbmcgWE1MIGZpbGVzOiIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idGNyZXR4bWwuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idGNyZXhkdGQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idGNyZXh4c2QuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjcmVhdGluZ3htbGZpbGVzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgWE1MIGZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGluZ3htbGZpbGVzIj48YSBuYW1lPSJjcmVhdGluZ3htbGZpbGVzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBYTUwgZmlsZXM8L2gxPgotCi0KLTxkaXY+PHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIFhNTCBmaWxlczo8L3A+Ci08L2Rpdj4KLQotPGRpdj4KLTxkaXYgY2xhc3M9ImxpbmtsaXN0Ij4KLTxkaXY+PGEgaHJlZj0idGNyZXR4bWwuaHRtbCIgdGl0bGU9IllvdSBjYW4gY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHdoaWNoIHlvdSBjYW4gdGhlbiBlZGl0IGluIHRoZSBYTUwgZWRpdG9yLiBZb3UgY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hIGZpbGUsIHNvIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIGtpbmQgb2YgY29udGVudCBpdCBjYW4gY29udGFpbi4iPkNyZWF0aW5nIGVtcHR5IFhNTCBmaWxlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idGNyZXhkdGQuaHRtbCIgdGl0bGU9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIERURCBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIERURCwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgRFRELiI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBhIERURHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRjcmV4eHNkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBYTUwgc2NoZW1hIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgWE1MIHNjaGVtYSBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBYTUwgc2NoZW1hIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBYTUwgc2NoZW1hLCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBYTUwgc2NoZW1hLiI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwKLXNjaGVtYXM8L2E+PC9kaXY+PC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYTUwuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYTUwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU5M2M4YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWE1MLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXb3JraW5nIHdpdGggWE1MIGZpbGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzoiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNjcmVhdHhtLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InR4ZWR0dGFnLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InR3eHZhbGlkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImN4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0icnhtbGJpY29ucy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9Indvcmtpbmd3aXRoeG1sZmlsZXMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Xb3JraW5nIHdpdGggWE1MIGZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ3b3JraW5nd2l0aHhtbGZpbGVzIj48YSBuYW1lPSJ3b3JraW5nd2l0aHhtbGZpbGVzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Xb3JraW5nIHdpdGggWE1MIGZpbGVzPC9oMT4KLQotCi08ZGl2PjxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOjwvcD4KLTwvZGl2PgotCi08ZGl2PgotPGRpdiBjbGFzcz0ibGlua2xpc3QiPgotPGRpdj48YSBocmVmPSJjY3JlYXR4bS5odG1sIiB0aXRsZT0iVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIFhNTCBmaWxlczoiPkNyZWF0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHhlZHR0YWcuaHRtbCIgdGl0bGU9IlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIFhNTCBmaWxlcy4iPkVkaXRpbmcgWE1MIGZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0d3h2YWxpZC5odG1sIiB0aXRsZT0iV2hlbiB5b3UgdmFsaWRhdGUgeW91ciBYTUwgZmlsZSwgdGhlIFhNTCB2YWxpZGF0b3Igd2lsbCBjaGVjayB0byBzZWUgdGhhdCB5b3VyIGZpbGUgaXMgdmFsaWQgYW5kIHdlbGwtZm9ybWVkLiI+VmFsaWRhdGluZyBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImN4bWxjYXQuaHRtbCIgdGl0bGU9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwKLXNjaGVtYTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icnhtbGJpY29ucy5odG1sIiB0aXRsZT0iVGhlIGZvbGxvd2luZyBYTUwgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSBhbmQgRGVzaWduIHZpZXcuIj5JY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yPC9hPjwvZGl2PjwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JreG1sLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JreG1sLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZmEzZTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya3htbC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIiAgImNvbmNlcHQuZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTxjb25jZXB0IGlkPSJ3b3JraW5nd2l0aHhtbGZpbGVzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Xb3JraW5nIHdpdGggWE1MIGZpbGVzPC90aXRsZT4NCi08c2hvcnRkZXNjPlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOjwvc2hvcnRkZXNjPg0KLTxjb25ib2R5PjwvY29uYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua2xpc3Q+DQotPGxpbmsgaHJlZj0iY2NyZWF0eG0uZGl0YSI+PGxpbmt0ZXh0PkNyZWF0aW5nIFhNTCBmaWxlczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InR4ZWR0dGFnLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIFhNTCBmaWxlczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InR3eHZhbGlkLmRpdGEiPjxsaW5rdGV4dD5WYWxpZGF0aW5nIFhNTCBmaWxlczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9ImN4bWxjYXQuZGl0YSI+PGxpbmt0ZXh0PlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTA0KLXNjaGVtYTwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InJ4bWxiaWNvbnMuZGl0YSI+PGxpbmt0ZXh0Pkljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3I8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08L2xpbmtsaXN0Pg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L2NvbmNlcHQ+DQotPD9QdWIgKjAwMDAwMDA4NzE/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3d4bWxlZHQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3d4bWxlZHQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU0YjYwOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3eG1sZWR0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImN3eG1sZWR0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5YTUwgZWRpdG9yPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5YTUwgZWRpdG9yPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPllvdSBjYW4gdXNlIGl0IHRvIHBlcmZvcm0gYSB2YXJpZXR5IG9mIHRhc2tzIHN1Y2ggYXM6PC9wPg0KLTx1bD4NCi08bGk+Q3JlYXRpbmcgbmV3LCBlbXB0eSBYTUwgZmlsZXMgb3IgZ2VuZXJhdGluZyB0aGVtIGZyb20gZXhpc3RpbmcgRFREcyBvcg0KLWV4aXN0aW5nIFhNTCBzY2hlbWFzPC9saT4NCi08bGk+RWRpdGluZyBYTUwgZmlsZXM8L2xpPg0KLTxsaT5JbXBvcnRpbmcgZXhpc3RpbmcgWE1MIGZpbGVzIGZvciBzdHJ1Y3R1cmVkIHZpZXdpbmc8L2xpPg0KLTxsaT5Bc3NvY2lhdGluZyBYTUwgZmlsZXMgd2l0aCBEVERzIG9yIFhNTCBzY2hlbWFzPC9saT4NCi08L3VsPg0KLTxwPlRoZSBYTUwgZWRpdG9yIGhhcyB0d28gbWFpbiB2aWV3cyAtIHRoZSBTb3VyY2UgdmlldyBhbmQgdGhlIERlc2lnbiB2aWV3Lg0KLVlvdSBjYW4gYWxzbyB1c2UgdGhlIE91dGxpbmUgdmlldyB0byBpbnNlcnQgYW5kIGRlbGV0ZSBlbGVtZW50cy48L3A+DQotPHNlY3Rpb24+PHRpdGxlPlNvdXJjZSB2aWV3PC90aXRsZT48cD5UaGUgU291cmNlIHZpZXcgZW5hYmxlcyB5b3UgdG8gdmlldw0KLWFuZCB3b3JrIGRpcmVjdGx5IHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUuIE1hbnkgb2YgdGhlIFhNTCBlZGl0aW5nIGZlYXR1cmVzDQotaW4gdGhlIFhNTCBlZGl0b3IgU291cmNlIHZpZXcgYXJlIHZlcnkgc2ltaWxhciB0byB0aG9zZSBhdmFpbGFibGUgaW4gdGhlIFNvdXJjZQ0KLXZpZXcgb2YgUGFnZSBEZXNpZ25lci48L3A+PHA+VGhlIFNvdXJjZSB2aWV3IGhhcyBtYW55IHRleHQgZWRpdGluZyBmZWF0dXJlcywNCi1zdWNoIGFzOiA8dWw+DQotPGxpPiBTeW50YXggaGlnaGxpZ2h0aW5nLCB1bmxpbWl0ZWQgdW5kby9yZWRvLCBhbmQgdXNlci1kZWZpbmVkIHRlbXBsYXRlcy48L2xpPg0KLTxsaT4gQ29udGVudCBhc3Npc3QsIHdoaWNoIHVzZXMgdGhlIGluZm9ybWF0aW9uIGluIGEgRFREIG9yIHNjaGVtYSBjb250ZW50DQotbW9kZWwgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgYWNjZXB0YWJsZSBjb250aW51YXRpb25zIGRlcGVuZGluZyBvbiB3aGVyZSB0aGUNCi1jdXJzb3IgaXMgbG9jYXRlZCBpbiBhbiBYTUwgZmlsZSwgb3Igd2hhdCBoYXMganVzdCBiZWVuIHR5cGVkLjwvbGk+DQotPGxpPiJTbWFydCIgZG91YmxlLWNsaWNraW5nIGJlaGF2aW9yLiBJZiB5b3VyIGN1cnNvciBpcyBwbGFjZWQgaW4gYW4gYXR0cmlidXRlDQotdmFsdWUsIG9uZSBkb3VibGUtY2xpY2sgc2VsZWN0cyB0aGF0IHZhbHVlLCBhbm90aGVyIGRvdWJsZSBjbGljayBzZWxlY3RzIHRoZQ0KLWF0dHJpYnV0ZS12YWx1ZSBwYWlyLCBhbmQgYSB0aGlyZCBkb3VibGUtY2xpY2sgc2VsZWN0cyB0aGUgZW50aXJlIHRhZy4gVGhpcw0KLW1ha2VzIGl0IGVhc2llciB0byBjb3B5IGFuZCBwYXN0ZSBjb21tb25seSB1c2VkIHBpZWNlcyBvZiBYTUwuPC9saT4NCi08L3VsPjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPkRlc2lnbiB2aWV3PC90aXRsZT48cD5UaGUgWE1MIGVkaXRvciBhbHNvIGhhcyBhIERlc2lnbiB2aWV3Lg0KLVRoaXMgdmlldyBoYXMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczo8dWw+DQotPGxpPlRoZSBYTUwgZmlsZSBpcyByZXByZXNlbnRlZCBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMNCi1oZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLjwvbGk+DQotPGxpPkNvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsDQotd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIG5vZGVzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvcg0KLXRoYXQgbG9jYXRpb24uICBGb3IgZXhhbXBsZSwgdGhlIDx1aWNvbnRyb2w+QWRkIENoaWxkPC91aWNvbnRyb2w+IG1lbnUgaXRlbQ0KLXdpbGwgbGlzdCBvbmx5IHRob3NlIGVsZW1lbnRzIGZyb20gYSBEVEQgb3IgWE1MIHNjaGVtYSB3aGljaCB3b3VsZCBiZSB2YWxpZA0KLWNoaWxkcmVuIGF0IHRoYXQgcG9pbnQgKGFzIGxvbmcgYXMgZ3JhbW1hciBjb25zdHJhaW50cyBhcmUgb24pLjwvbGk+DQotPC91bD48L3A+PHA+VGhlIERlc2lnbiB2aWV3IGlzIGVzcGVjaWFsbHkgaGVscGZ1bCBpZiB5b3UgYXJlIG5ldyB0byBYTUwsIG9yDQotbmVlZCB0byBkbyBmb3JtLW9yaWVudGVkIGVkaXRpbmcuIEZvciBleGFtcGxlLCB5b3UgY291bGQgdXNlIHRoZSBDcmVhdGUgWE1MDQotRmlsZSB3aXphcmQgdG8gY3JlYXRlIGEgdGVtcGxhdGUgWE1MIGZpbGUgZm9yIGEgam9iIGRlc2NyaXB0aW9uIGZvcm0gZnJvbQ0KLWEgam9iIGRlc2NyaXB0aW9uIERURC4gQWZ0ZXIgdGhvc2Ugc3RlcHMgYXJlIGNvbXBsZXRlZCwgeW91IHdvdWxkIG9ubHkgaGF2ZQ0KLXRvIGZpbGwgaW4gdGhlIGZvcm0gZGF0YSB1c2luZyB0aGUgRGVzaWduIHZpZXcuPC9wPjwvc2VjdGlvbj4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3d4bWxlZHQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3d4bWxlZHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlhMWVkNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3eG1sZWR0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iWE1MIGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIFhNTCBlZGl0b3IgaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBYTUwgZmlsZXMuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3JldHhtbC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNyZXhkdGQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV4eHNkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHRhZy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d3h2YWxpZC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN3eG1sZWR0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+WE1MIGVkaXRvcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3d4bWxlZHQiPjxhIG5hbWU9ImN3eG1sZWR0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5YTUwgZWRpdG9yPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy48L3A+Ci0KLTxwPllvdSBjYW4gdXNlIGl0IHRvIHBlcmZvcm0gYSB2YXJpZXR5IG9mIHRhc2tzIHN1Y2ggYXM6PC9wPgotCi08dWw+Ci08bGk+Q3JlYXRpbmcgbmV3LCBlbXB0eSBYTUwgZmlsZXMgb3IgZ2VuZXJhdGluZyB0aGVtIGZyb20gZXhpc3RpbmcgRFREcyBvcgotZXhpc3RpbmcgWE1MIHNjaGVtYXM8L2xpPgotCi08bGk+RWRpdGluZyBYTUwgZmlsZXM8L2xpPgotCi08bGk+SW1wb3J0aW5nIGV4aXN0aW5nIFhNTCBmaWxlcyBmb3Igc3RydWN0dXJlZCB2aWV3aW5nPC9saT4KLQotPGxpPkFzc29jaWF0aW5nIFhNTCBmaWxlcyB3aXRoIERURHMgb3IgWE1MIHNjaGVtYXM8L2xpPgotCi08L3VsPgotCi08cD5UaGUgWE1MIGVkaXRvciBoYXMgdHdvIG1haW4gdmlld3MgLSB0aGUgU291cmNlIHZpZXcgYW5kIHRoZSBEZXNpZ24gdmlldy4KLVlvdSBjYW4gYWxzbyB1c2UgdGhlIE91dGxpbmUgdmlldyB0byBpbnNlcnQgYW5kIGRlbGV0ZSBlbGVtZW50cy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5Tb3VyY2UgdmlldzwvaDQ+PHA+VGhlIFNvdXJjZSB2aWV3IGVuYWJsZXMgeW91IHRvIHZpZXcKLWFuZCB3b3JrIGRpcmVjdGx5IHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUuIE1hbnkgb2YgdGhlIFhNTCBlZGl0aW5nIGZlYXR1cmVzCi1pbiB0aGUgWE1MIGVkaXRvciBTb3VyY2UgdmlldyBhcmUgdmVyeSBzaW1pbGFyIHRvIHRob3NlIGF2YWlsYWJsZSBpbiB0aGUgU291cmNlCi12aWV3IG9mIFBhZ2UgRGVzaWduZXIuPC9wPgotPGRpdiBjbGFzcz0icCI+VGhlIFNvdXJjZSB2aWV3IGhhcyBtYW55IHRleHQgZWRpdGluZyBmZWF0dXJlcywKLXN1Y2ggYXM6IDx1bD4KLTxsaT4gU3ludGF4IGhpZ2hsaWdodGluZywgdW5saW1pdGVkIHVuZG8vcmVkbywgYW5kIHVzZXItZGVmaW5lZCB0ZW1wbGF0ZXMuPC9saT4KLQotPGxpPiBDb250ZW50IGFzc2lzdCwgd2hpY2ggdXNlcyB0aGUgaW5mb3JtYXRpb24gaW4gYSBEVEQgb3Igc2NoZW1hIGNvbnRlbnQKLW1vZGVsIHRvIHByb3ZpZGUgYSBsaXN0IG9mIGFjY2VwdGFibGUgY29udGludWF0aW9ucyBkZXBlbmRpbmcgb24gd2hlcmUgdGhlCi1jdXJzb3IgaXMgbG9jYXRlZCBpbiBhbiBYTUwgZmlsZSwgb3Igd2hhdCBoYXMganVzdCBiZWVuIHR5cGVkLjwvbGk+Ci0KLTxsaT4iU21hcnQiIGRvdWJsZS1jbGlja2luZyBiZWhhdmlvci4gSWYgeW91ciBjdXJzb3IgaXMgcGxhY2VkIGluIGFuIGF0dHJpYnV0ZQotdmFsdWUsIG9uZSBkb3VibGUtY2xpY2sgc2VsZWN0cyB0aGF0IHZhbHVlLCBhbm90aGVyIGRvdWJsZSBjbGljayBzZWxlY3RzIHRoZQotYXR0cmlidXRlLXZhbHVlIHBhaXIsIGFuZCBhIHRoaXJkIGRvdWJsZS1jbGljayBzZWxlY3RzIHRoZSBlbnRpcmUgdGFnLiBUaGlzCi1tYWtlcyBpdCBlYXNpZXIgdG8gY29weSBhbmQgcGFzdGUgY29tbW9ubHkgdXNlZCBwaWVjZXMgb2YgWE1MLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+RGVzaWduIHZpZXc8L2g0PjxkaXYgY2xhc3M9InAiPlRoZSBYTUwgZWRpdG9yIGFsc28gaGFzIGEgRGVzaWduIHZpZXcuCi1UaGlzIHZpZXcgaGFzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6PHVsPgotPGxpPlRoZSBYTUwgZmlsZSBpcyByZXByZXNlbnRlZCBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMKLWhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuPC9saT4KLQotPGxpPkNvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsCi13aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgbm9kZXMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yCi10aGF0IGxvY2F0aW9uLiAgRm9yIGV4YW1wbGUsIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQ2hpbGQ8L3NwYW4+IG1lbnUgaXRlbQotd2lsbCBsaXN0IG9ubHkgdGhvc2UgZWxlbWVudHMgZnJvbSBhIERURCBvciBYTUwgc2NoZW1hIHdoaWNoIHdvdWxkIGJlIHZhbGlkCi1jaGlsZHJlbiBhdCB0aGF0IHBvaW50IChhcyBsb25nIGFzIGdyYW1tYXIgY29uc3RyYWludHMgYXJlIG9uKS48L2xpPgotCi08L3VsPgotPC9kaXY+Ci08cD5UaGUgRGVzaWduIHZpZXcgaXMgZXNwZWNpYWxseSBoZWxwZnVsIGlmIHlvdSBhcmUgbmV3IHRvIFhNTCwgb3IKLW5lZWQgdG8gZG8gZm9ybS1vcmllbnRlZCBlZGl0aW5nLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHVzZSB0aGUgQ3JlYXRlIFhNTAotRmlsZSB3aXphcmQgdG8gY3JlYXRlIGEgdGVtcGxhdGUgWE1MIGZpbGUgZm9yIGEgam9iIGRlc2NyaXB0aW9uIGZvcm0gZnJvbQotYSBqb2IgZGVzY3JpcHRpb24gRFRELiBBZnRlciB0aG9zZSBzdGVwcyBhcmUgY29tcGxldGVkLCB5b3Ugd291bGQgb25seSBoYXZlCi10byBmaWxsIGluIHRoZSBmb3JtIGRhdGEgdXNpbmcgdGhlIERlc2lnbiB2aWV3LjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIHRpdGxlPSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV0eG1sLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB3aGljaCB5b3UgY2FuIHRoZW4gZWRpdCBpbiB0aGUgWE1MIGVkaXRvci4gWW91IGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLCBzbyB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSBraW5kIG9mIGNvbnRlbnQgaXQgY2FuIGNvbnRhaW4uIj5DcmVhdGluZyBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90Y3JleGR0ZC5odG1sIiB0aXRsZT0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgRFREIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgRFRELCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBEVEQuIj5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90Y3JleHhzZC5odG1sIiB0aXRsZT0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdHRhZy5odG1sIiB0aXRsZT0iVGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGVkaXRpbmcgWE1MIGZpbGVzLiI+RWRpdGluZyBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiB0aXRsZT0iVGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgd2l0aCBOb2RlIGFuZCBDb250ZW50IGNvbHVtbnMgYW5kIGEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBDb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLCB3aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoYXQgcGFydGljdWxhciBlbGVtZW50LiI+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZSBkaXJlY3RseS4iPkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHd4dmFsaWQuaHRtbCIgdGl0bGU9IldoZW4geW91IHZhbGlkYXRlIHlvdXIgWE1MIGZpbGUsIHRoZSBYTUwgdmFsaWRhdG9yIHdpbGwgY2hlY2sgdG8gc2VlIHRoYXQgeW91ciBmaWxlIGlzIHZhbGlkIGFuZCB3ZWxsLWZvcm1lZC4iPlZhbGlkYXRpbmcgWE1MIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGNhdC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sY2F0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZWZhNGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sY2F0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjeG1sY2F0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+V2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMNCi1ib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkDQotYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsDQotYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgY2F0YWxvZzxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+YXNzb2NpYXRpb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPlRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHdheXMgdG8gYXNzb2NpYXRlIFhNTCBmaWxlcyB3aXRoIERURHMgb3IgWE1MIHNjaGVtYXMuPC9wPg0KLTxvbD4NCi08bGk+RGlyZWN0IGFzc29jaWF0aW9uIC0gVGhlIFhNTCBmaWxlIGNvbnRhaW5zIGVpdGhlciB0aGUgbmFtZSBvZiBhIERURCBpbg0KLWl0cyBkb2N0eXBlIGRlY2xhcmF0aW9uIChmb3IgZXhhbXBsZSwgJmx0OyFET0NUWVBFIHJvb3QtZWxlbWVudCBTWVNURU0gIjx2YXJuYW1lPmR0ZGZpbGUuZHRkPC92YXJuYW1lPiINCi0+LCB3aGVyZSA8dmFybmFtZT5kdGRmaWxlLmR0ZDwvdmFybmFtZT4gaXMgdGhlIG5hbWUgb2YgdGhlIERURCBmaWxlKSBvciBpdA0KLWNvbnRhaW5zIHRoZSBwYXRoIG9mIGFuIFhNTCBzY2hlbWEgaW4gdGhlIHNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBvZiB0aGUNCi1YTUwgZmlsZSByb290IGVsZW1lbnQgKGZvciBleGFtcGxlLCAmbHQ7eHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20vPHZhcm5hbWU+c2NoZW1hLnhzZDwvdmFybmFtZT4iPiwNCi13aGVyZSAgPHZhcm5hbWU+c2NoZW1hLnhzZDwvdmFybmFtZT4gaXMgdGhlIG5hbWUgb2YgdGhlIFhNTCBzY2hlbWEuPC9saT4NCi08bGk+WE1MIENhdGFsb2cgZW50cnkgLSBZb3UgY2FuIHJlZ2lzdGVyIERURCBhbmQgWE1MIHNjaGVtYSBmaWxlcyBpbiB0aGUgWE1MDQotQ2F0YWxvZyBhbmQgYXNzb2NpYXRlIHRoZW0gd2l0aCBhICBLZXkgdGhhdCByZXByZXNlbnRzIHRoZW0uIFlvdSBjYW4gdGhlbg0KLXJlZmVyIHRvIGEgRFREIG9yIFhNTCBzY2hlbWEgZmlsZSBLZXkgZnJvbSBhbiBYTUwgZmlsZSBpbnN0ZWFkIG9mIHJlZmVycmluZw0KLWRpcmVjdGx5IHRvIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLiBBbiBYTUwgQ2F0YWxvZyBlbnRyeSBjb250YWlucyB0d28NCi1wYXJ0cyAtIHRoZSBLZXkgKHdoaWNoIHJlcHJlc2VudHMgdGhlIERURCBvciBYTUwgc2NoZW1hKSBhbmQgYSBVUkkgKHdoaWNoDQotY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIERURCBvciBYTUwgc2NoZW1hIGxvY2F0aW9uKS48L2xpPg0KLTwvb2w+DQotPHNlY3Rpb24+PHRpdGxlPkhvdyBhbiBhc3NvY2lhdGlvbiB3b3JrczwvdGl0bGU+PGI+QXNzb2NpYXRpbmcgYW4gWE1MIGZpbGUNCi13aXRoIGEgRFREIDwvYj48cD5JZiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQsIGEgRE9DVFlQRSB0YWcgc3VjaA0KLWFzIHRoZSBmb2xsb3dpbmcgb25lIGlzIGluY2x1ZGVkIGluIHRoZSBYTUwgZmlsZTo8Y29kZWJsb2NrPiZsdDshRE9DVFlQRSByb290LW5hbWUgUFVCTElDICI8dmFybmFtZT5JbnZvaWNlSWQ8L3Zhcm5hbWU+IiAiPHZhcm5hbWU+QzpcbXlkdGRzXEludm9pY2UuZHRkPC92YXJuYW1lDQotPiI+DQotPC9jb2RlYmxvY2s+PC9wPjxwPkludm9pY2VJZCBpcyB0aGUgcHVibGljIGlkZW50aWZpZXIgb2YgdGhlIERURCBmaWxlLiBJdA0KLWlzIHVzZWQgdG8gYXNzb2NpYXRlIHRoZSBYTUwgZmlsZSB3aXRoIGEgRFREIGZpbGUgKGluIHRoaXMgY2FzZSwgdGhlIERURCBmaWxlDQotaXMgSW52b2ljZS5kdGQpLiBJZiB0aGUgcHVibGljIGlkZW50aWZpZXIgSW52b2ljZUlkIGNvcnJlc3BvbmRzIHRvIHRoZSBLZXkNCi1vZiB0aGUgWE1MIENhdGFsb2cgZW50cnkgZm9yIEludm9pY2UuZHRkLCB0aGVuIHRoZSBVPD9QdWIgQ2FyZXQ/PlJJIG9mIHRoZQ0KLVhNTCBDYXRhbG9nIGVudHJ5ICh3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYXRpb24gb2YgSW52b2ljZS5kdGQpDQotaXMgdXNlZCB0byBsb2NhdGUgdGhlIERURC4gT3RoZXJ3aXNlLCB0aGUgRE9DVFlQRSdzIHN5c3RlbSBpZGVudGlmaWVyICgiQzpcbXlkdGRzXEludm9pY2UuZHRkIiksDQotd2hpY2ggcmVmZXJzIGRpcmVjdGx5IHRvIHRoZSBmaWxlIHN5c3RlbSBsb2NhdGlvbiBvZiB0aGUgRFRELCBpcyB1c2VkIHRvIGxvY2F0ZQ0KLXRoZSBEVEQuPC9wPjxub3RlPllvdSBjYW4gYWxzbyB1c2UgYSBzeXN0ZW0gaWRlbnRpZmllciBhcyBhIEtleSBpbiBhbiBYTUwNCi1DYXRhbG9nIGVudHJ5LiBJZiB5b3UgdXNlIGEgc3lzdGVtIGlkZW50aWZpZXIgYXMgYSBLZXksIGEgRE9DVFlQRSB0YWcgc3VjaA0KLWFzIHRoZSBmb2xsb3dpbmcgb25lIGlzIGluY2x1ZGVkIGluIGFuIFhNTCBmaWxlOjwvbm90ZT48Y29kZWJsb2NrPiZsdDshRE9DVFlQRSBSb290LW5hbWUgU1lTVEVNICJNeURURC5kdGQiPiA8L2NvZGVibG9jaz48cD53aGVyZQ0KLU15RFRELmR0ZCBpcyB0aGUgc3lzdGVtIGlkZW50aWZpZXIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgS2V5IG9mIGFuIFhNTCBDYXRhbG9nDQotZW50cnkuPC9wPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48Yj5Bc3NvY2lhdGluZyBhbiBYTUwgZmlsZSB3aXRoIGFuIFhNTCBzY2hlbWE8L2I+PHA+SWYgYW4gWE1MIGZpbGUNCi1pcyBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIHNjaGVtYSwgb25lIG9yIG1vcmUgc2NoZW1hIGxvY2F0aW9uIGF0dHJpYnV0ZXMgYXJlDQotaW5jbHVkZWQgaW4gdGhlIFhNTCBmaWxlLiBUaGUgaW5mb3JtYXRpb24gaW4gdGhlIHNjaGVtYUxvY2F0aW9uIGlzIHByb3ZpZGVkDQotYXMgYSAiaGludCIgdG8gdGhlIFhNTCBwcm9jZXNzb3IuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvdyBzY2hlbWFMb2NhdGlvbg0KLWF0dHJpYnV0ZXM6PC9wPjxwPiA8Yj5FeGFtcGxlIDEgPC9iPjxjb2RlYmxvY2s+Jmx0O3B1cmNoYXNlT3JkZXIgeG1sbnM9Imh0dHA6Ly93d3cuaWJtLmNvbSINCi14c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSBDOlxteXNjaGVtYXNcUHVyY2hhc2VPcmRlci54c2QiPg0KLSZsdDtzaGlwVG8gY291bnRyeT0iVVMiPg0KLS4uLjwvY29kZWJsb2NrPiAgICA8L3A+PHA+PGI+RXhhbXBsZSAyIDwvYj48Y29kZWJsb2NrPiZsdDtwdXJjaGFzZU9yZGVyIHhtbG5zPSJodHRwOi8vd3d3LmlibS5jb20iDQoteHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gUE8ueHNkIj4NCi0mbHQ7c2hpcFRvIGNvdW50cnk9IlVTIj4NCi0uLi4uPC9jb2RlYmxvY2s+ICA8L3A+PHA+SW4gRXhhbXBsZSAxLCB0aGUgc2NoZW1hTG9jYXRpb24gJ2hpbnQnICgnQzpcbXlzY2hlbWFzXFB1cmNoYXNlT3JkZXIueHNkJykNCi1yZWZlcnMgZGlyZWN0bHkgdG8gdGhlIGZpbGUgc3lzdGVtIGxvY2F0aW9uIG9yIFVSSSBvZiB0aGUgWE1MIHNjaGVtYS4gSW4gdGhpcw0KLWNhc2UsIHRoZSBzY2hlbWEgZmlsZSB3aWxsIGJlIGxvY2F0ZWQgYnkgdGhlIFhNTCBwcm9jZXNzb3IgZGlyZWN0bHkuPC9wPjxwPkluDQotRXhhbXBsZSAyLCB0aGUgc2NoZW1hTG9jYXRpb24gJ2hpbnQnICgnUE8ueHNkJykgcmVmZXJzIHRvIGFuIFhNTCBDYXRhbG9nIGVudHJ5Lg0KLVBPLnhzZCBjb3JyZXNwb25kcyB0byB0aGUgIDx2YXJuYW1lPktleTwvdmFybmFtZT4gb2YgdGhlIFhNTCBDYXRhbG9nIGVudHJ5DQotZm9yIFB1cmNoYXNlT3JkZXIueHNkLCBhbmQgdGhlIFVSSSBvZiB0aGUgWE1MIENhdGFsb2cgZW50cnkgKHdoaWNoIGNvbnRhaW5zDQotaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2F0aW9uIG9mIFB1cmNoYXNlT3JkZXIueHNkKSB3aWxsIGJlIHVzZWQgdG8gbG9jYXRlZA0KLXRoZSBYTUwgc2NoZW1hLjwvcD48cD5JbiBib3RoIGV4YW1wbGVzLCA8Y29kZXBoPmh0dHA6Ly93d3cuaWJtLmNvbTwvY29kZXBoPiBpbg0KLXRoZSA8Y29kZXBoPnhzaTpzY2hlbWFMb2NhdGlvbjwvY29kZXBoPiB0YWcgaXMgYSBVUkkgdGhhdCBpZGVudGlmaWVzIHRoZSBuYW1lc3BhY2UNCi1mb3IgdGhlIFhNTCBzY2hlbWEuPC9wPjxwPllvdSBjYW4gYWxzbyB1c2UgYSBuYW1lc3BhY2UgYXMgYSBLZXkgZm9yIGFuIFhNTA0KLUNhdGFsb2cgZW50cnkuIElmIHlvdSB1c2UgYSBuYW1lc3BhY2UgYXMgYSBLZXksIGEgc2NoZW1hTG9jYXRpb24gdGFnIHN1Y2gNCi1hcyB0aGUgZm9sbG93aW5nIG9uZSBpcyBpbmNsdWRlZCBpbiBhbiBYTUwgZmlsZTo8Y29kZWJsb2NrPiZsdDtwdXJjaGFzZU9yZGVyIHhtbG5zOj0id3d3LmlibS5jb20iDQoteHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gcG8veHNkL1B1cmNoYXNlT3JkZXIueHNkICI+PC9jb2RlYmxvY2s+PC9wPjxwPlRoZQ0KLXNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBwb2ludHMgdG8gYm90aCB0aGUgS2V5IGFuZCB0aGUgYWN0dWFsIGxvY2F0aW9uIG9mDQotdGhlIHNjaGVtYS48L3A+PHA+PGI+RFREIG9yIFhNTCBzY2hlbWEgcmVzaWRlcyBvbiBhIHJlbW90ZSBzZXJ2ZXI8L2I+PC9wPjxwPlNldmVyYWwNCi1mdW5jdGlvbnMgaW4gdGhlIFhNTCBlZGl0b3IsIHN1Y2ggYXMgdmFsaWRhdGlvbiBhbmQgY29udGVudCBhc3Npc3QsIHJlcXVpcmUNCi10aGUgYXZhaWxhYmlsaXR5IG9mIGEgRFREIG9yIGFuIFhNTCBzY2hlbWEuIFRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gcHJvdmlkZXMNCi11c2FnZSBpbmZvcm1hdGlvbiBmb3IgY2FzZXMgd2hlbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgcmVzaWRlcyBvbiB5b3VyIGxvY2FsDQotbWFjaGluZS4gSG93ZXZlciwgaW4gbWFueSBjYXNlcywgdGhlIERURCBvciBYTUwgc2NoZW1hIGNhbiByZXNpZGUgb24gYSByZW1vdGUNCi1zZXJ2ZXIsIGZvciBleGFtcGxlOjwvcD48cD48Y29kZXBoPiZsdDshRE9DVFlQRSBDYXRhbG9nIFBVQkxJQyAiYWJjL0NhdGFsb2ciDQotImh0dHA6Ly94eXouYWJjLm9yZy9kdGRzL2NhdGFsb2cuZHRkIj48L2NvZGVwaD48L3A+PHA+Tm9ybWFsbHksIHRoaXMgY2FzZQ0KLXBvc2VzIG5vIHByb2JsZW0sIGJlY2F1c2UgdGhlIERURCBvciBYTUwgc2NoZW1hIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUNCi1yZW1vdGUgc2VydmVyLiBIb3dldmVyLCBpZiB5b3UgYXJlIGJlaGluZCBhIGZpcmV3YWxsLCBhbmQgZG8gbm90IGhhdmUgYSBTT0NLU2lmaWVkDQotc3lzdGVtLCB0aGUgd29ya2JlbmNoIGN1cnJlbnRseSBkb2VzIG5vdCBwcm92aWRlIGEgd2F5IGZvciB5b3UgdG8gc3BlY2lmeQ0KLWEgc29ja3Mgc2VydmVyIGZvciByZXRyaWV2aW5nIGEgRFREIG9yIFhNTCBzY2hlbWEuIElmIHlvdSBhcmUgdW5hYmxlIHRvIFNPQ0tTaWZ5DQoteW91ciBzeXN0ZW0sIHRoZSB3b3JrYXJvdW5kIGZvciB0aGlzIHByb2JsZW0gaXMgdG8gcmV0cmlldmUgYSBjb3B5IG9mIHRoZQ0KLURURCBvciBYTUwgc2NoZW1hICh1c2luZyBhIFdlYiBicm93c2VyLCBmb3IgZXhhbXBsZSkgYW5kIHNhdmUgdGhhdCBjb3B5IG9uDQoteW91ciBsb2NhbCBtYWNoaW5lLiBUaGVuLCB5b3UgY2FuIGVpdGhlciBwbGFjZSBhIGxvY2FsIGNvcHkgaW4gdGhlIHNhbWUgcHJvamVjdA0KLWFzIHlvdXIgWE1MIGZpbGUsIG9yIHVzZSB0aGUgWE1MIENhdGFsb2cgdG8gYXNzb2NpYXRlIGEgcHVibGljIGlkZW50aWZpZXINCi13aXRoIHRoZSBEVEQncyAobG9jYWwpIGxvY2F0aW9uLjwvcD48bm90ZT5JZiB5b3UgaGF2ZSBhbiBYTUwgZmlsZSBhc3NvY2lhdGVkDQotd2l0aCBhbiBYTUwgc2NoZW1hIG9yIERURCB0aGF0IGlzIGVsc2V3aGVyZSBpbiB0aGUgbmV0d29yaywgYW5kIHlvdSBhcmUgd29ya2luZw0KLW9uIGEgbWFjaGluZSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgbmV0d29yaywgeW91IGNhbiBmb2xsb3cgdGhlIHN0ZXBzIGRlc2NyaWJlZA0KLXByZXZpb3VzbHkgaWYgeW91IHdhbnQgdG8gdXNlIGNvbnRlbnQgYXNzaXN0IG9yIHZhbGlkYXRlIHlvdXIgWE1MIGZpbGUuICA8L25vdGU+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5BZHZhbnRhZ2VzIG9mIFhNTCBDYXRhbG9nIGVudHJ5IGFzc29jaWF0aW9uczwvdGl0bGU+PHA+SWYNCi15b3UgY3JlYXRlIGEgZGlyZWN0IGFzc29jaWF0aW9uIGJldHdlZW4gYW4gWE1MIGZpbGUgYW5kIGFuIFhNTCBzY2hlbWEgb3IgRFREDQotZmlsZSwgYW55IHRpbWUgeW91IGNoYW5nZSB0aGUgbG9jYXRpb24gb2YgdGhlIHNjaGVtYSBvciBEVEQgeW91IGhhdmUgdG8gdHJhY2sNCi1kb3duIGFuZCB1cGRhdGUgYWxsIG9mIHRoZSByZWZlcmVuY2luZyBYTUwgZmlsZXMgd2l0aCB0aGUgbmV3IGxvY2F0aW9uIG9mDQotdGhlIERURCBvciBzY2hlbWEuIElmLCBob3dldmVyLCB5b3UgYXNzb2NpYXRlIGFuIFhNTCBmaWxlIHdpdGggYW4gWE1MIHNjaGVtYQ0KLW9yIERURCBLZXksIHRoZW4sIHdoZW4geW91IGNoYW5nZSB0aGUgbG9jYXRpb24gb2YgdGhlIHNjaGVtYSBvciBEVEQsIHlvdSBvbmx5DQotaGF2ZSB0byB1cGRhdGUgdGhlIFhNTCBDYXRhbG9nIGVudHJ5LCBpbnN0ZWFkIG9mIGVhY2ggaW5kaXZpZHVhbCBYTUwgZmlsZS48L3A+PHA+Rm9yDQotZXhhbXBsZSwgeW91IGhhdmUgYSBEVEQgY2FsbGVkIEJ1aWxkaW5nLmR0ZCwgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIGZpdmUNCi1YTUwgZmlsZXMgLSBPZmZpY2UueG1sLCBIb3VzZS54bWwsIEFwYXJ0bWVudC54bWwsIEJhbmsueG1sLCBhbmQgUG9zdE9mZmljZS54bWwuDQotWW91IG1vdmUgdGhlIERURCBmaWxlIEJ1aWxkaW5nLmR0ZCB0byBhIG5ldyBsb2NhdGlvbi4gSWYgeW91IGhhdmUgYSBkaXJlY3Rpb24NCi1hc3NvY2lhdGlvbiBiZXR3ZWVuIEJ1aWxkaW5nLmR0ZCBhbmQgYWxsIHRoZSBYTUwgZmlsZXMsIHlvdSB3aWxsIGhhdmUgdG8gdXBkYXRlDQotdGhlICZsdDtET0NUVFlQRT4gZGVjbGFyYXRpb24gaW4gZWFjaCBYTUwgZmlsZSB0byByZWZsZWN0IHRoZSBuZXcgbG9jYXRpb24NCi1vZiBCdWlsZGluZy5kdGQuIElmLCBob3dldmVyLCB5b3UgaGF2ZSBhbiBYTUwgQ2F0YWxvZyBhc3NvY2lhdGlvbiwgYW5kIGFsbA0KLXRoZSBYTUwgZmlsZXMganVzdCByZWZlciB0byB0aGUgS2V5IG9mIEJ1aWxkaW5nLmR0ZCwgdGhlbiB5b3Ugb25seSBoYXZlIHRvDQotdXBkYXRlIHRoZSBVUkkgYW5kIGFsbCB0aGUgWE1MIGZpbGVzIHdpbGwgcG9pbnQgdG8gdGhlIG5ldyBsb2NhdGlvbiBvZiBCdWlsZGluZy5kdGQuPC9wPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+VXBkYXRpbmcgYW4gZW50cnkgaW4gdGhlIFhNTCBDYXRhbG9nPC90aXRsZT48cD5BZnRlciB5b3UgaGF2ZQ0KLXVwZGF0ZWQgYW4gZW50cnkgaW4gdGhlIFhNTCBDYXRhbG9nLCB5b3UgbWlnaHQgbmVlZCB0byByZWZyZXNoIHRoZSBYTUwgZWRpdG9yDQotdmlldyBzbyB0aGF0IGl0IHVzZXMgdGhlIG5ldyBpbmZvcm1hdGlvbi4gVG8gZG8gdGhpcywgY2xpY2sgdGhlIDx1aWNvbnRyb2w+UmVsb2FkDQotRGVwZW5kZW5jaWVzPC91aWNvbnRyb2w+IHRvb2xiYXIgYnV0dG9uIDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvcmxkZ3Jtci5naWYiPg0KLTxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvb2xiYXIgYnV0dG9uPC9hbHQ+PC9pbWFnZT4gYW5kDQotdGhlIHZpZXcgd2lsbCBiZSB1cGRhdGVkIHVzaW5nIHRoZSBjdXJyZW50IFhNTCBDYXRhbG9nIHNldHRpbmdzLiBZb3Ugb25seQ0KLW5lZWQgdG8gcmVmcmVzaCB0aGUgWE1MIGVkaXRvciB2aWV3IHdoZW4geW91IGhhdmUgYW4gWE1MIGZpbGUgb3BlbiB0aGF0IHJlZmVyZW5jZXMNCi10aGUgWE1MIENhdGFsb2cgZW50cnkgdGhhdCB3YXMgdXBkYXRlZC48L3A+PHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyDQotdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9wPjwvc2VjdGlvbj4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KLTw/UHViICowMDAwMDA4MzU5Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxjYXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGNhdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWQxYzQwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGNhdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGNhdGFsb2csIG92ZXJ2aWV3LCBYTUwgZmlsZXMsIGFzc29jaWF0aW9ucyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBjYXRhbG9nLCBvdmVydmlldywgWE1MIGZpbGVzLCBhc3NvY2lhdGlvbnMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRkb2MuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRwcm9jLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3htbGVkdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3htbGNhdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjeG1sY2F0Ij48YSBuYW1lPSJjeG1sY2F0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+V2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMKLWJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQKLWEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLAotYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS48L3A+Ci0KLTxwPlRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHdheXMgdG8gYXNzb2NpYXRlIFhNTCBmaWxlcyB3aXRoIERURHMgb3IgWE1MIHNjaGVtYXMuPC9wPgotCi08b2w+Ci08bGk+RGlyZWN0IGFzc29jaWF0aW9uIC0gVGhlIFhNTCBmaWxlIGNvbnRhaW5zIGVpdGhlciB0aGUgbmFtZSBvZiBhIERURCBpbgotaXRzIGRvY3R5cGUgZGVjbGFyYXRpb24gKGZvciBleGFtcGxlLCAmbHQ7IURPQ1RZUEUgcm9vdC1lbGVtZW50IFNZU1RFTSAiPHZhciBjbGFzcz0idmFybmFtZSI+ZHRkZmlsZS5kdGQ8L3Zhcj4iCi0mZ3Q7LCB3aGVyZSA8dmFyIGNsYXNzPSJ2YXJuYW1lIj5kdGRmaWxlLmR0ZDwvdmFyPiBpcyB0aGUgbmFtZSBvZiB0aGUgRFREIGZpbGUpIG9yIGl0Ci1jb250YWlucyB0aGUgcGF0aCBvZiBhbiBYTUwgc2NoZW1hIGluIHRoZSBzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgb2YgdGhlCi1YTUwgZmlsZSByb290IGVsZW1lbnQgKGZvciBleGFtcGxlLCAmbHQ7eHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20vPHZhciBjbGFzcz0idmFybmFtZSI+c2NoZW1hLnhzZDwvdmFyPiImZ3Q7LAotd2hlcmUgIDx2YXIgY2xhc3M9InZhcm5hbWUiPnNjaGVtYS54c2Q8L3Zhcj4gaXMgdGhlIG5hbWUgb2YgdGhlIFhNTCBzY2hlbWEuPC9saT4KLQotPGxpPlhNTCBDYXRhbG9nIGVudHJ5IC0gWW91IGNhbiByZWdpc3RlciBEVEQgYW5kIFhNTCBzY2hlbWEgZmlsZXMgaW4gdGhlIFhNTAotQ2F0YWxvZyBhbmQgYXNzb2NpYXRlIHRoZW0gd2l0aCBhICBLZXkgdGhhdCByZXByZXNlbnRzIHRoZW0uIFlvdSBjYW4gdGhlbgotcmVmZXIgdG8gYSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlIEtleSBmcm9tIGFuIFhNTCBmaWxlIGluc3RlYWQgb2YgcmVmZXJyaW5nCi1kaXJlY3RseSB0byB0aGUgRFREIG9yIFhNTCBzY2hlbWEgZmlsZS4gQW4gWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvCi1wYXJ0cyAtIHRoZSBLZXkgKHdoaWNoIHJlcHJlc2VudHMgdGhlIERURCBvciBYTUwgc2NoZW1hKSBhbmQgYSBVUkkgKHdoaWNoCi1jb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgRFREIG9yIFhNTCBzY2hlbWEgbG9jYXRpb24pLjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5Ib3cgYW4gYXNzb2NpYXRpb24gd29ya3M8L2g0PjxzdHJvbmc+QXNzb2NpYXRpbmcgYW4gWE1MIGZpbGUKLXdpdGggYSBEVEQgPC9zdHJvbmc+PGRpdiBjbGFzcz0icCI+SWYgYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFRELCBhIERPQ1RZUEUgdGFnIHN1Y2gKLWFzIHRoZSBmb2xsb3dpbmcgb25lIGlzIGluY2x1ZGVkIGluIHRoZSBYTUwgZmlsZTo8cHJlPiZsdDshRE9DVFlQRSByb290LW5hbWUgUFVCTElDICI8dmFyIGNsYXNzPSJ2YXJuYW1lIj5JbnZvaWNlSWQ8L3Zhcj4iICI8dmFyIGNsYXNzPSJ2YXJuYW1lIj5DOlxteWR0ZHNcSW52b2ljZS5kdGQ8L3Zhcj4iJmd0OwotPC9wcmU+Ci08L2Rpdj4KLTxwPkludm9pY2VJZCBpcyB0aGUgcHVibGljIGlkZW50aWZpZXIgb2YgdGhlIERURCBmaWxlLiBJdAotaXMgdXNlZCB0byBhc3NvY2lhdGUgdGhlIFhNTCBmaWxlIHdpdGggYSBEVEQgZmlsZSAoaW4gdGhpcyBjYXNlLCB0aGUgRFREIGZpbGUKLWlzIEludm9pY2UuZHRkKS4gSWYgdGhlIHB1YmxpYyBpZGVudGlmaWVyIEludm9pY2VJZCBjb3JyZXNwb25kcyB0byB0aGUgS2V5Ci1vZiB0aGUgWE1MIENhdGFsb2cgZW50cnkgZm9yIEludm9pY2UuZHRkLCB0aGVuIHRoZSBVUkkgb2YgdGhlCi1YTUwgQ2F0YWxvZyBlbnRyeSAod2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2F0aW9uIG9mIEludm9pY2UuZHRkKQotaXMgdXNlZCB0byBsb2NhdGUgdGhlIERURC4gT3RoZXJ3aXNlLCB0aGUgRE9DVFlQRSdzIHN5c3RlbSBpZGVudGlmaWVyICgiQzpcbXlkdGRzXEludm9pY2UuZHRkIiksCi13aGljaCByZWZlcnMgZGlyZWN0bHkgdG8gdGhlIGZpbGUgc3lzdGVtIGxvY2F0aW9uIG9mIHRoZSBEVEQsIGlzIHVzZWQgdG8gbG9jYXRlCi10aGUgRFRELjwvcD4KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UgY2FuIGFsc28gdXNlIGEgc3lzdGVtIGlkZW50aWZpZXIgYXMgYSBLZXkgaW4gYW4gWE1MCi1DYXRhbG9nIGVudHJ5LiBJZiB5b3UgdXNlIGEgc3lzdGVtIGlkZW50aWZpZXIgYXMgYSBLZXksIGEgRE9DVFlQRSB0YWcgc3VjaAotYXMgdGhlIGZvbGxvd2luZyBvbmUgaXMgaW5jbHVkZWQgaW4gYW4gWE1MIGZpbGU6PC9kaXY+Ci08cHJlPiZsdDshRE9DVFlQRSBSb290LW5hbWUgU1lTVEVNICJNeURURC5kdGQiJmd0OyA8L3ByZT4KLTxwPndoZXJlCi1NeURURC5kdGQgaXMgdGhlIHN5c3RlbSBpZGVudGlmaWVyIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIEtleSBvZiBhbiBYTUwgQ2F0YWxvZwotZW50cnkuPC9wPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxzdHJvbmc+QXNzb2NpYXRpbmcgYW4gWE1MIGZpbGUgd2l0aCBhbiBYTUwgc2NoZW1hPC9zdHJvbmc+PHA+SWYgYW4gWE1MIGZpbGUKLWlzIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgc2NoZW1hLCBvbmUgb3IgbW9yZSBzY2hlbWEgbG9jYXRpb24gYXR0cmlidXRlcyBhcmUKLWluY2x1ZGVkIGluIHRoZSBYTUwgZmlsZS4gVGhlIGluZm9ybWF0aW9uIGluIHRoZSBzY2hlbWFMb2NhdGlvbiBpcyBwcm92aWRlZAotYXMgYSAiaGludCIgdG8gdGhlIFhNTCBwcm9jZXNzb3IuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvdyBzY2hlbWFMb2NhdGlvbgotYXR0cmlidXRlczo8L3A+Ci08ZGl2IGNsYXNzPSJwIj4gPHN0cm9uZz5FeGFtcGxlIDEgPC9zdHJvbmc+PHByZT4mbHQ7cHVyY2hhc2VPcmRlciB4bWxucz0iaHR0cDovL3d3dy5pYm0uY29tIgoteHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gQzpcbXlzY2hlbWFzXFB1cmNoYXNlT3JkZXIueHNkIiZndDsKLSZsdDtzaGlwVG8gY291bnRyeT0iVVMiJmd0OwotLi4uPC9wcmU+Ci0gICAgPC9kaXY+Ci08ZGl2IGNsYXNzPSJwIj48c3Ryb25nPkV4YW1wbGUgMiA8L3N0cm9uZz48cHJlPiZsdDtwdXJjaGFzZU9yZGVyIHhtbG5zPSJodHRwOi8vd3d3LmlibS5jb20iCi14c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSBQTy54c2QiJmd0OwotJmx0O3NoaXBUbyBjb3VudHJ5PSJVUyImZ3Q7Ci0uLi4uPC9wcmU+Ci0gIDwvZGl2PgotPHA+SW4gRXhhbXBsZSAxLCB0aGUgc2NoZW1hTG9jYXRpb24gJ2hpbnQnICgnQzpcbXlzY2hlbWFzXFB1cmNoYXNlT3JkZXIueHNkJykKLXJlZmVycyBkaXJlY3RseSB0byB0aGUgZmlsZSBzeXN0ZW0gbG9jYXRpb24gb3IgVVJJIG9mIHRoZSBYTUwgc2NoZW1hLiBJbiB0aGlzCi1jYXNlLCB0aGUgc2NoZW1hIGZpbGUgd2lsbCBiZSBsb2NhdGVkIGJ5IHRoZSBYTUwgcHJvY2Vzc29yIGRpcmVjdGx5LjwvcD4KLTxwPkluCi1FeGFtcGxlIDIsIHRoZSBzY2hlbWFMb2NhdGlvbiAnaGludCcgKCdQTy54c2QnKSByZWZlcnMgdG8gYW4gWE1MIENhdGFsb2cgZW50cnkuCi1QTy54c2QgY29ycmVzcG9uZHMgdG8gdGhlICA8dmFyIGNsYXNzPSJ2YXJuYW1lIj5LZXk8L3Zhcj4gb2YgdGhlIFhNTCBDYXRhbG9nIGVudHJ5Ci1mb3IgUHVyY2hhc2VPcmRlci54c2QsIGFuZCB0aGUgVVJJIG9mIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSAod2hpY2ggY29udGFpbnMKLWluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhdGlvbiBvZiBQdXJjaGFzZU9yZGVyLnhzZCkgd2lsbCBiZSB1c2VkIHRvIGxvY2F0ZWQKLXRoZSBYTUwgc2NoZW1hLjwvcD4KLTxwPkluIGJvdGggZXhhbXBsZXMsIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmh0dHA6Ly93d3cuaWJtLmNvbTwvc2FtcD4gaW4KLXRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj54c2k6c2NoZW1hTG9jYXRpb248L3NhbXA+IHRhZyBpcyBhIFVSSSB0aGF0IGlkZW50aWZpZXMgdGhlIG5hbWVzcGFjZQotZm9yIHRoZSBYTUwgc2NoZW1hLjwvcD4KLTxkaXYgY2xhc3M9InAiPllvdSBjYW4gYWxzbyB1c2UgYSBuYW1lc3BhY2UgYXMgYSBLZXkgZm9yIGFuIFhNTAotQ2F0YWxvZyBlbnRyeS4gSWYgeW91IHVzZSBhIG5hbWVzcGFjZSBhcyBhIEtleSwgYSBzY2hlbWFMb2NhdGlvbiB0YWcgc3VjaAotYXMgdGhlIGZvbGxvd2luZyBvbmUgaXMgaW5jbHVkZWQgaW4gYW4gWE1MIGZpbGU6PHByZT4mbHQ7cHVyY2hhc2VPcmRlciB4bWxuczo9Ind3dy5pYm0uY29tIgoteHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gcG8veHNkL1B1cmNoYXNlT3JkZXIueHNkICImZ3Q7PC9wcmU+Ci08L2Rpdj4KLTxwPlRoZQotc2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIHBvaW50cyB0byBib3RoIHRoZSBLZXkgYW5kIHRoZSBhY3R1YWwgbG9jYXRpb24gb2YKLXRoZSBzY2hlbWEuPC9wPgotPHA+PHN0cm9uZz5EVEQgb3IgWE1MIHNjaGVtYSByZXNpZGVzIG9uIGEgcmVtb3RlIHNlcnZlcjwvc3Ryb25nPjwvcD4KLTxwPlNldmVyYWwKLWZ1bmN0aW9ucyBpbiB0aGUgWE1MIGVkaXRvciwgc3VjaCBhcyB2YWxpZGF0aW9uIGFuZCBjb250ZW50IGFzc2lzdCwgcmVxdWlyZQotdGhlIGF2YWlsYWJpbGl0eSBvZiBhIERURCBvciBhbiBYTUwgc2NoZW1hLiBUaGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHByb3ZpZGVzCi11c2FnZSBpbmZvcm1hdGlvbiBmb3IgY2FzZXMgd2hlbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgcmVzaWRlcyBvbiB5b3VyIGxvY2FsCi1tYWNoaW5lLiBIb3dldmVyLCBpbiBtYW55IGNhc2VzLCB0aGUgRFREIG9yIFhNTCBzY2hlbWEgY2FuIHJlc2lkZSBvbiBhIHJlbW90ZQotc2VydmVyLCBmb3IgZXhhbXBsZTo8L3A+Ci08cD48c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7IURPQ1RZUEUgQ2F0YWxvZyBQVUJMSUMgImFiYy9DYXRhbG9nIgotImh0dHA6Ly94eXouYWJjLm9yZy9kdGRzL2NhdGFsb2cuZHRkIiZndDs8L3NhbXA+PC9wPgotPHA+Tm9ybWFsbHksIHRoaXMgY2FzZQotcG9zZXMgbm8gcHJvYmxlbSwgYmVjYXVzZSB0aGUgRFREIG9yIFhNTCBzY2hlbWEgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZQotcmVtb3RlIHNlcnZlci4gSG93ZXZlciwgaWYgeW91IGFyZSBiZWhpbmQgYSBmaXJld2FsbCwgYW5kIGRvIG5vdCBoYXZlIGEgU09DS1NpZmllZAotc3lzdGVtLCB0aGUgd29ya2JlbmNoIGN1cnJlbnRseSBkb2VzIG5vdCBwcm92aWRlIGEgd2F5IGZvciB5b3UgdG8gc3BlY2lmeQotYSBzb2NrcyBzZXJ2ZXIgZm9yIHJldHJpZXZpbmcgYSBEVEQgb3IgWE1MIHNjaGVtYS4gSWYgeW91IGFyZSB1bmFibGUgdG8gU09DS1NpZnkKLXlvdXIgc3lzdGVtLCB0aGUgd29ya2Fyb3VuZCBmb3IgdGhpcyBwcm9ibGVtIGlzIHRvIHJldHJpZXZlIGEgY29weSBvZiB0aGUKLURURCBvciBYTUwgc2NoZW1hICh1c2luZyBhIFdlYiBicm93c2VyLCBmb3IgZXhhbXBsZSkgYW5kIHNhdmUgdGhhdCBjb3B5IG9uCi15b3VyIGxvY2FsIG1hY2hpbmUuIFRoZW4sIHlvdSBjYW4gZWl0aGVyIHBsYWNlIGEgbG9jYWwgY29weSBpbiB0aGUgc2FtZSBwcm9qZWN0Ci1hcyB5b3VyIFhNTCBmaWxlLCBvciB1c2UgdGhlIFhNTCBDYXRhbG9nIHRvIGFzc29jaWF0ZSBhIHB1YmxpYyBpZGVudGlmaWVyCi13aXRoIHRoZSBEVEQncyAobG9jYWwpIGxvY2F0aW9uLjwvcD4KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBJZiB5b3UgaGF2ZSBhbiBYTUwgZmlsZSBhc3NvY2lhdGVkCi13aXRoIGFuIFhNTCBzY2hlbWEgb3IgRFREIHRoYXQgaXMgZWxzZXdoZXJlIGluIHRoZSBuZXR3b3JrLCBhbmQgeW91IGFyZSB3b3JraW5nCi1vbiBhIG1hY2hpbmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIG5ldHdvcmssIHlvdSBjYW4gZm9sbG93IHRoZSBzdGVwcyBkZXNjcmliZWQKLXByZXZpb3VzbHkgaWYgeW91IHdhbnQgdG8gdXNlIGNvbnRlbnQgYXNzaXN0IG9yIHZhbGlkYXRlIHlvdXIgWE1MIGZpbGUuICA8L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+QWR2YW50YWdlcyBvZiBYTUwgQ2F0YWxvZyBlbnRyeSBhc3NvY2lhdGlvbnM8L2g0PjxwPklmCi15b3UgY3JlYXRlIGEgZGlyZWN0IGFzc29jaWF0aW9uIGJldHdlZW4gYW4gWE1MIGZpbGUgYW5kIGFuIFhNTCBzY2hlbWEgb3IgRFRECi1maWxlLCBhbnkgdGltZSB5b3UgY2hhbmdlIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2NoZW1hIG9yIERURCB5b3UgaGF2ZSB0byB0cmFjawotZG93biBhbmQgdXBkYXRlIGFsbCBvZiB0aGUgcmVmZXJlbmNpbmcgWE1MIGZpbGVzIHdpdGggdGhlIG5ldyBsb2NhdGlvbiBvZgotdGhlIERURCBvciBzY2hlbWEuIElmLCBob3dldmVyLCB5b3UgYXNzb2NpYXRlIGFuIFhNTCBmaWxlIHdpdGggYW4gWE1MIHNjaGVtYQotb3IgRFREIEtleSwgdGhlbiwgd2hlbiB5b3UgY2hhbmdlIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2NoZW1hIG9yIERURCwgeW91IG9ubHkKLWhhdmUgdG8gdXBkYXRlIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSwgaW5zdGVhZCBvZiBlYWNoIGluZGl2aWR1YWwgWE1MIGZpbGUuPC9wPgotPHA+Rm9yCi1leGFtcGxlLCB5b3UgaGF2ZSBhIERURCBjYWxsZWQgQnVpbGRpbmcuZHRkLCB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggZml2ZQotWE1MIGZpbGVzIC0gT2ZmaWNlLnhtbCwgSG91c2UueG1sLCBBcGFydG1lbnQueG1sLCBCYW5rLnhtbCwgYW5kIFBvc3RPZmZpY2UueG1sLgotWW91IG1vdmUgdGhlIERURCBmaWxlIEJ1aWxkaW5nLmR0ZCB0byBhIG5ldyBsb2NhdGlvbi4gSWYgeW91IGhhdmUgYSBkaXJlY3Rpb24KLWFzc29jaWF0aW9uIGJldHdlZW4gQnVpbGRpbmcuZHRkIGFuZCBhbGwgdGhlIFhNTCBmaWxlcywgeW91IHdpbGwgaGF2ZSB0byB1cGRhdGUKLXRoZSAmbHQ7RE9DVFRZUEUmZ3Q7IGRlY2xhcmF0aW9uIGluIGVhY2ggWE1MIGZpbGUgdG8gcmVmbGVjdCB0aGUgbmV3IGxvY2F0aW9uCi1vZiBCdWlsZGluZy5kdGQuIElmLCBob3dldmVyLCB5b3UgaGF2ZSBhbiBYTUwgQ2F0YWxvZyBhc3NvY2lhdGlvbiwgYW5kIGFsbAotdGhlIFhNTCBmaWxlcyBqdXN0IHJlZmVyIHRvIHRoZSBLZXkgb2YgQnVpbGRpbmcuZHRkLCB0aGVuIHlvdSBvbmx5IGhhdmUgdG8KLXVwZGF0ZSB0aGUgVVJJIGFuZCBhbGwgdGhlIFhNTCBmaWxlcyB3aWxsIHBvaW50IHRvIHRoZSBuZXcgbG9jYXRpb24gb2YgQnVpbGRpbmcuZHRkLjwvcD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+VXBkYXRpbmcgYW4gZW50cnkgaW4gdGhlIFhNTCBDYXRhbG9nPC9oND48cD5BZnRlciB5b3UgaGF2ZQotdXBkYXRlZCBhbiBlbnRyeSBpbiB0aGUgWE1MIENhdGFsb2csIHlvdSBtaWdodCBuZWVkIHRvIHJlZnJlc2ggdGhlIFhNTCBlZGl0b3IKLXZpZXcgc28gdGhhdCBpdCB1c2VzIHRoZSBuZXcgaW5mb3JtYXRpb24uIFRvIGRvIHRoaXMsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZWxvYWQKLURlcGVuZGVuY2llczwvc3Bhbj4gdG9vbGJhciBidXR0b24gPGltZyBzcmM9Ii4uL2ltYWdlcy9ybGRncm1yLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIFJlbG9hZCBEZXBlbmRlbmNpZXMgdG9vbGJhciBidXR0b24iIC8+IGFuZAotdGhlIHZpZXcgd2lsbCBiZSB1cGRhdGVkIHVzaW5nIHRoZSBjdXJyZW50IFhNTCBDYXRhbG9nIHNldHRpbmdzLiBZb3Ugb25seQotbmVlZCB0byByZWZyZXNoIHRoZSBYTUwgZWRpdG9yIHZpZXcgd2hlbiB5b3UgaGF2ZSBhbiBYTUwgZmlsZSBvcGVuIHRoYXQgcmVmZXJlbmNlcwotdGhlIFhNTCBDYXRhbG9nIGVudHJ5IHRoYXQgd2FzIHVwZGF0ZWQuPC9wPgotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyCi10byB0aGUgcmVsYXRlZCB0YXNrcy48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgdGl0bGU9IkluIHRoZSBEZXNpZ24gdmlldywgd2hlbiB5b3UgZWRpdCBhbiBYTUwgZmlsZSB0aGF0IGhhcyBhIHNldCBvZiBjb25zdHJhaW50cyBvciBydWxlcyBkZWZpbmVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gdHVybiB0aGUgY29uc3RyYWludHMgb24gYW5kIG9mZiB0byBwcm92aWRlIGZsZXhpYmlsaXR5IGluIHRoZSB3YXkgeW91IGVkaXQsIGJ1dCBzdGlsbCBtYWludGFpbiB0aGUgdmFsaWRpdHkgb2YgdGhlIGRvY3VtZW50IHBlcmlvZGljYWxseS4iPkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRkb2MuaHRtbCIgdGl0bGU9IlRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBpdCB0byBhc3NvY2lhdGUgaXQgd2l0aCBhIERURCBmaWxlLiBZb3UgY2FuIGVkaXQgeW91ciBET0NUWVBFIGRlY2xhcmF0aW9uIHRvIGNoYW5nZSB0aGUgRFREIGZpbGUgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguIj5FZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiB0aXRsZT0iWE1MIENhdGFsb2cgZW50cmllcyBhcmUgdXNlZCB0byBtYXAgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZXMgdG8gbG9jYWxseSBkZWZpbmVkIHJlc291cmNlcy4gWW91IGNhbiBwcm92aWRlIHJ1bGVzIHNwZWNpZnkgaG93IHRoZXNlIGVudGl0aWVzIGFyZSByZXNvbHZlZCI+QWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgdGl0bGU9IklmIHlvdSBtYWtlIGNoYW5nZXMgdG8gYSBEVEQgZmlsZSBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgZmlsZSAodGhhdCBpcyBjdXJyZW50bHkgb3BlbiksIGNsaWNrIFhNTCAmZ3Q7IFJlbG9hZCBEZXBlbmRlbmNpZXMgdG8gdXBkYXRlIHRoZSBYTUwgZmlsZSB3aXRoIHRoZXNlIGNoYW5nZXMuIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBndWlkZWQgZWRpdGluZyBtZWNoYW5pc21zIGF2YWlsYWJsZSBpbiB0aGUgZWRpdG9yLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LiI+VXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0c2NoLmh0bWwiIHRpdGxlPSJZb3VyIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHByb3ZpZGUgdmFyaW91cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgWE1MIGZpbGUsIHN1Y2ggYXMgdGhlIFhNTCBzY2hlbWEgYW5kIG5hbWVzcGFjZSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIElmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHRoZSBzY2hlbWEgYW5kIG5hbWVzcGFjZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBvciBhZGQgYSBuZXcgYXNzb2NpYXRpb24uIE1vZGlmeWluZyBhbnkgYXNzb2NpYXRpb25zIGNhbiBpbXBhY3Qgd2hhdCBjb250ZW50IGlzIGFsbG93ZWQgaW4gdGhlIFhNTCBmaWxlLiI+RWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb248L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0cHJvYy5odG1sIiB0aXRsZT0iSWYgeW91IGhhdmUgaW5zdHJ1Y3Rpb25zIHlvdSB3YW50IHRvIHNlbmQgdG8gYW4gYXBwbGljYXRpb24gdXNpbmcgYW4gWE1MIGRvY3VtZW50LCB5b3UgY2FuIHVzZSBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIj5FZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSB3aXRoIE5vZGUgYW5kIENvbnRlbnQgY29sdW1ucyBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIj5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sZW5jLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxlbmMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVmNzRkOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxlbmMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImN4bWxlbmMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlhNTCBhbmQgSFRNTCBlbmNvZGluZ3M8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlhNTCBhbmQgSFRNTCBlbmNvZGluZ3M8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+RW5jb2RpbmdzIGVuYWJsZSB5b3UgdG8gc3BlY2lmeSB3aGF0IGNoYXJhY3RlciBlbmNvZGluZyB5b3VyIHRleHQNCi1pcyBpbi48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9ImN4bWxlbmN8MXxjaGFyYWN0ZXJlbmNvZGluZ3RleHRpbmZpbGVzIiBzdGF0dXM9ImNoYW5nZWQiPmNoYXJhY3Rlcg0KLWVuY29kaW5nPGluZGV4dGVybT5zdXBwb3J0ZWQgY2hhcmFjdGVyIHNldHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+VGhlIElBTkEgbmFtZSBpcyB1c2VkIGluIHRoZSBlbmNvZGluZyBzdGF0ZW1lbnQgb2YgYW4gWE1MIGZpbGUsIG9yIGNoYXJzZXQNCi1kaXJlY3RpdmUgaW4gYW4gSFRNTCBmaWxlLjwvcD4NCi08cD5UaGUgSFRNTCBhbmQgWE1MIGVkaXRvcnMgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGVuY29kaW5nczo8L3A+DQotPHRhYmxlIHJvd2hlYWRlcj0iZmlyc3Rjb2wiPg0KLTx0Z3JvdXAgY29scz0iMiI+PGNvbHNwZWMgY29sbmFtZT0iQ09MU1BFQzAiLz48Y29sc3BlYyBjb2xuYW1lPSJDT0xTUEVDMSIvPg0KLTx0aGVhZD4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCIgdmFsaWduPSJ0b3AiPiA8cD48Yj5YTUwgRW5jb2RpbmcgKElBTkEgTmFtZSk8L2I+PC9wPiA8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMSIgdmFsaWduPSJ0b3AiPiA8cD48Yj5EZXNjcmlwdGlvbjwvYj48L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPC90aGVhZD4NCi08dGJvZHk+DQotPHJvdz4NCi08ZW50cnk+IDxwPkJJRzU8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5CaWc1LCBUcmFkaXRpb25hbCBDaGluZXNlPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5FVUMtSlA8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5FVUMgZW5jb2RpbmcsIEphcGFuZXNlPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5FVUMtS1I8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5FVUMgZW5jb2RpbmcsIEtvcmVhbjwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5HQjE4MDMwPC9lbnRyeT4NCi08ZW50cnk+TmF0aW9uYWwgU3RhbmRhcmQsIENoaW5lc2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5JU08tMjAyMi1KUDwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPklTTyAyMDIyLCBKYXBhbmVzZTwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+SVNPLTIwMjItS1I8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5JU08gMjAyMiwgS29yZWFuPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5JU08tODg1OS0xPC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+SVNPIExhdGluLTE8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+SVNPLTg4NTktMjwvZW50cnk+DQotPGVudHJ5PkNlbnRyYWwvRWFzdCBFdXJvcGVhbiAoU2xhdmljKTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+SVNPLTg4NTktMzwvZW50cnk+DQotPGVudHJ5PlNvdXRoZXJuIEV1cm9wZWFuPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5JU08tODg1OS00PC9lbnRyeT4NCi08ZW50cnk+SVNPIDg4NTktNCwgQ3lyaWxsaWM8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PklTTy04ODU5LTU8L2VudHJ5Pg0KLTxlbnRyeT5JU08gODg1OS01LCBDeXJpbGxpYzwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPklTTy04ODU5LTY8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5BcmFiaWMgKExvZ2ljYWwpPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PklTTy04ODU5LTc8L2VudHJ5Pg0KLTxlbnRyeT5HcmVlazwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPklTTy04ODU5LTg8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5IZWJyZXcgKFZpc3VhbCkgKGVuY29kaW5nIHN1cHBvcnRlZCwgYnV0IG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFBhZ2UNCi1EZXNpZ25lciBEZXNpZ24gcGFnZSk8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+SVNPLTg4NTktOTwvZW50cnk+DQotPGVudHJ5PlR1cmtpc2g8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5TSElGVF9KSVM8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5TaGlmdC1KSVMsIEphcGFuZXNlPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PlRJUy02MjA8L2VudHJ5Pg0KLTxlbnRyeT5USVNJLCBUaGFpPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+VVMtQVNDSUk8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5VUyBBU0NJSTwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+VVRGLTg8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5JU08gMTA2NDYvVW5pY29kZSwgb25lLWJ5dGUgZW5jb2Rpbmc8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPlVURi0xNjwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPklTTyAxMDY0Ni9Vbmljb2RlLCB0d28tYnl0ZSBlbmNvZGluZzwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+VVRGLTE2QkU8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5Vbmljb2RlIEJpZ0VuZGlhbjwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+VVRGLTE2TEU8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5Vbmljb2RlIExpdHRsZUVuZGlhbjwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+PHA+V0lORE9XUy0zMUo8L3A+PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzEiPjxwPkphcGFuZXNlLCBXaW5kb3dzLTMxSjwvcD48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5XSU5ET1dTLTEyNTU8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5IZWJyZXc8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPldJTkRPV1MtMTI1NjwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPkFyYWJpYzwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08L3Rib2R5Pg0KLTwvdGdyb3VwPg0KLTwvdGFibGU+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxlbmMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGVuYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTcyM2IxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGVuYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlhNTCBhbmQgSFRNTCBlbmNvZGluZ3MiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iRW5jb2RpbmdzIGVuYWJsZSB5b3UgdG8gc3BlY2lmeSB3aGF0IGNoYXJhY3RlciBlbmNvZGluZyB5b3VyIHRleHQgaXMgaW4uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkVuY29kaW5ncyBlbmFibGUgeW91IHRvIHNwZWNpZnkgd2hhdCBjaGFyYWN0ZXIgZW5jb2RpbmcgeW91ciB0ZXh0IGlzIGluLiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNoYXJhY3RlciBlbmNvZGluZywgc3VwcG9ydGVkIGNoYXJhY3RlciBzZXRzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iY2hhcmFjdGVyIGVuY29kaW5nLCBzdXBwb3J0ZWQgY2hhcmFjdGVyIHNldHMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN4bWxlbmMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5YTUwgYW5kIEhUTUwgZW5jb2RpbmdzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjeG1sZW5jIj48YSBuYW1lPSJjeG1sZW5jIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5YTUwgYW5kIEhUTUwgZW5jb2RpbmdzPC9oMT4KLQotCi0KLQotPGRpdj48cD5FbmNvZGluZ3MgZW5hYmxlIHlvdSB0byBzcGVjaWZ5IHdoYXQgY2hhcmFjdGVyIGVuY29kaW5nIHlvdXIgdGV4dAotaXMgaW4uPC9wPgotCi08cD5UaGUgSUFOQSBuYW1lIGlzIHVzZWQgaW4gdGhlIGVuY29kaW5nIHN0YXRlbWVudCBvZiBhbiBYTUwgZmlsZSwgb3IgY2hhcnNldAotZGlyZWN0aXZlIGluIGFuIEhUTUwgZmlsZS48L3A+Ci0KLTxwPlRoZSBIVE1MIGFuZCBYTUwgZWRpdG9ycyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgZW5jb2RpbmdzOjwvcD4KLQotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+Ci08dGhlYWQgYWxpZ249ImxlZnQiPgotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAwNzIiPiA8cD48c3Ryb25nPlhNTCBFbmNvZGluZyAoSUFOQSBOYW1lKTwvc3Ryb25nPjwvcD4KLSA8L3RoPgotCi08dGggdmFsaWduPSJ0b3AiIGlkPSJOMTAwODQiPiA8cD48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC9wPgotIDwvdGg+Ci0KLTwvdHI+Ci0KLTwvdGhlYWQ+Ci0KLTx0Ym9keT4KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMEEyIiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+QklHNTwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBBMiBOMTAwODQgIj4gPHA+QmlnNSwgVHJhZGl0aW9uYWwgQ2hpbmVzZTwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDBDMiIgaGVhZGVycz0iTjEwMDcyICI+IDxwPkVVQy1KUDwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBDMiBOMTAwODQgIj4gPHA+RVVDIGVuY29kaW5nLCBKYXBhbmVzZTwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDBFMiIgaGVhZGVycz0iTjEwMDcyICI+IDxwPkVVQy1LUjwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBFMiBOMTAwODQgIj4gPHA+RVVDIGVuY29kaW5nLCBLb3JlYW48L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxMDIiIGhlYWRlcnM9Ik4xMDA3MiAiPkdCMTgwMzA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDEwMiBOMTAwODQgIj5OYXRpb25hbCBTdGFuZGFyZCwgQ2hpbmVzZTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMTE2IiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+SVNPLTIwMjItSlA8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxMTYgTjEwMDg0ICI+IDxwPklTTyAyMDIyLCBKYXBhbmVzZTwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDEzNiIgaGVhZGVycz0iTjEwMDcyICI+IDxwPklTTy0yMDIyLUtSPC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTM2IE4xMDA4NCAiPiA8cD5JU08gMjAyMiwgS29yZWFuPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMTU2IiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+SVNPLTg4NTktMTwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE1NiBOMTAwODQgIj4gPHA+SVNPIExhdGluLTE8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxNzYiIGhlYWRlcnM9Ik4xMDA3MiAiPklTTy04ODU5LTI8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE3NiBOMTAwODQgIj5DZW50cmFsL0Vhc3QgRXVyb3BlYW4gKFNsYXZpYyk8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDE4QSIgaGVhZGVycz0iTjEwMDcyICI+SVNPLTg4NTktMzwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMThBIE4xMDA4NCAiPlNvdXRoZXJuIEV1cm9wZWFuPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxOUUiIGhlYWRlcnM9Ik4xMDA3MiAiPklTTy04ODU5LTQ8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5RSBOMTAwODQgIj5JU08gODg1OS00LCBDeXJpbGxpYzwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMUIyIiBoZWFkZXJzPSJOMTAwNzIgIj5JU08tODg1OS01PC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxQjIgTjEwMDg0ICI+SVNPIDg4NTktNSwgQ3lyaWxsaWM8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDFDNiIgaGVhZGVycz0iTjEwMDcyICI+IDxwPklTTy04ODU5LTY8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxQzYgTjEwMDg0ICI+IDxwPkFyYWJpYyAoTG9naWNhbCk8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxRTYiIGhlYWRlcnM9Ik4xMDA3MiAiPklTTy04ODU5LTc8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDFFNiBOMTAwODQgIj5HcmVlazwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMUZBIiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+SVNPLTg4NTktODwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDFGQSBOMTAwODQgIj4gPHA+SGVicmV3IChWaXN1YWwpIChlbmNvZGluZyBzdXBwb3J0ZWQsIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBQYWdlCi1EZXNpZ25lciBEZXNpZ24gcGFnZSk8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyMUEiIGhlYWRlcnM9Ik4xMDA3MiAiPklTTy04ODU5LTk8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDIxQSBOMTAwODQgIj5UdXJraXNoPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyMkUiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5TSElGVF9KSVM8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyMkUgTjEwMDg0ICI+IDxwPlNoaWZ0LUpJUywgSmFwYW5lc2U8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyNEUiIGhlYWRlcnM9Ik4xMDA3MiAiPlRJUy02MjA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI0RSBOMTAwODQgIj5USVNJLCBUaGFpPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyNjIiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5VUy1BU0NJSTwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI2MiBOMTAwODQgIj4gPHA+VVMgQVNDSUk8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyODIiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5VVEYtODwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI4MiBOMTAwODQgIj4gPHA+SVNPIDEwNjQ2L1VuaWNvZGUsIG9uZS1ieXRlIGVuY29kaW5nPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMkEyIiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+VVRGLTE2PC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMkEyIE4xMDA4NCAiPiA8cD5JU08gMTA2NDYvVW5pY29kZSwgdHdvLWJ5dGUgZW5jb2Rpbmc8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyQzIiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5VVEYtMTZCRTwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDJDMiBOMTAwODQgIj4gPHA+VW5pY29kZSBCaWdFbmRpYW48L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyRTIiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5VVEYtMTZMRTwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDJFMiBOMTAwODQgIj4gPHA+VW5pY29kZSBMaXR0bGVFbmRpYW48L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAzMDIiIGhlYWRlcnM9Ik4xMDA3MiAiPjxwPldJTkRPV1MtMzFKPC9wPgotPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAzMDIgTjEwMDg0ICI+PHA+SmFwYW5lc2UsIFdpbmRvd3MtMzFKPC9wPgotPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAzMUUiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5XSU5ET1dTLTEyNTU8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAzMUUgTjEwMDg0ICI+IDxwPkhlYnJldzwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDMzRSIgaGVhZGVycz0iTjEwMDcyICI+IDxwPldJTkRPV1MtMTI1NjwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDMzRSBOMTAwODQgIj4gPHA+QXJhYmljPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXYgLz4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHRvb2wuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHRvb2wuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmYzViMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWx0b29sLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iICAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjeG1sdG9vbCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+WE1MIHRvb2xzIC0gb3ZlcnZpZXc8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlhNTCB0b29scyAtIG92ZXJ2aWV3PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoaXMgcHJvZHVjdCBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgdmlzdWFsIFhNTCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4NCi1UaGUgdG9vbCBzZXQgaW5jbHVkZXMgY29tcG9uZW50cyBmb3IgYnVpbGRpbmcgRFREcywgWE1MIHNjaGVtYXMsIGFuZCBYTUwgZmlsZXMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHRvb2xzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UaGUgZm9sbG93aW5nIFhNTCB0b29scyBhcmUgYXZhaWxhYmxlLiA8L3A+DQotPHA+VGhlIDxiPlhNTCBlZGl0b3I8L2I+IGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiBZb3UNCi1jYW4gdXNlIGl0IHRvIGNyZWF0ZSBuZXcgWE1MIGZpbGVzLCBlaXRoZXIgZnJvbSBzY3JhdGNoLCBleGlzdGluZyBEVERzLCBvcg0KLWV4aXN0aW5nIFhNTCBzY2hlbWFzLiBZb3UgY2FuIGFsc28gdXNlIGl0IHRvIGVkaXQgWE1MIGZpbGVzLCBhc3NvY2lhdGUgdGhlbQ0KLXdpdGggRFREcyBvciBzY2hlbWFzLCBhbmQgdmFsaWRhdGUgdGhlbS4gPC9wPg0KLTxwPiBUaGUgPGI+RFREIGVkaXRvcjwvYj4gaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBEVERzLiAgIDwvcD4NCi08cD5UaGUgPGI+WE1MIHNjaGVtYSBlZGl0b3I8L2I+IGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcsIHZpZXdpbmcsIGFuZCB2YWxpZGF0aW5nDQotWE1MIHNjaGVtYXMuIFlvdSBjYW4gdXNlIHRoZSBYTUwgc2NoZW1hIGVkaXRvciB0byBwZXJmb3JtIHRhc2tzIHN1Y2ggYXMgY3JlYXRpbmcNCi1YTUwgc2NoZW1hIGNvbXBvbmVudHMgYW5kIGltcG9ydGluZyBhbmQgdmlld2luZyBYTUwgc2NoZW1hcy4gPC9wPg0KLTxwPjxiPk5vdGVzOjwvYj48L3A+DQotPHNlY3Rpb24+RXhlcmNpc2UgY2F1dGlvbiB3aGVuIG9wZW5pbmcgbGFyZ2UgZmlsZXMgd2l0aCBhbnkgb2YgdGhlIFhNTCBlZGl0b3JzLg0KLUlmIHRoZSBtZW1vcnkgbGltaXRzIG9mIHRoZSB3b3JrYmVuY2ggYXJlIGV4Y2VlZGVkLCBpdCB3aWxsIGFicnVwdGx5IGNsb3NlDQotd2l0aG91dCBzYXZpbmcgYW55IGRhdGEgKGFuZCB3aXRob3V0IHdhcm5pbmcgb3IgZXJyb3IgbWVzc2FnZXMpLiBUaGUgbnVtYmVyDQotb2YgZWxlbWVudHMgaW4gYW4gWE1MIGZpbGUsIG5vdCBpdHMgc2l6ZSwgaXMgdGhlIGJlc3QgaW5kaWNhdG9yIG9mIGhvdyBtdWNoDQotbWVtb3J5IHdpbGwgYmUgcmVxdWlyZWQuIE1lbW9yeSByZXF1aXJlbWVudHMgYWxzbyBkZXBlbmQgb24gd2hhdCBlbHNlIGlzIG9wZW4NCi1pbiB0aGUgd29ya2JlbmNoIC0gaW4gc29tZSBjYXNlcyB5b3UgY2FuIG9wZW4gYSBmaWZ0ZWVuIG1lZ2FieXRlcyBmaWxlLCBidXQNCi1pbiBvdGhlciBjYXNlcyBhIG9uZSBtZWdhYnl0ZSBmaWxlIG1pZ2h0IGNhdXNlIHByb2JsZW1zLiBUaGVyZWZvcmUsIHdlIHJlY29tbWVuZA0KLXlvdSBzYXZlIGFsbCBkYXRhIGluIHRoZSB3b3JrYmVuY2ggYmVmb3JlIG9wZW5pbmcgbGFyZ2UgWE1MIGZpbGVzLiBUaGlzIGlzDQotYSBwZXJtYW5lbnQgcmVzdHJpY3Rpb24uPC9zZWN0aW9uPg0KLTxzZWN0aW9uIGNvbnJlZj0icmxpbWl0YXRpb25zX3NsdXNoWE1MLmRpdGEjcmxpbWl0YXRpb25zX3NsdXNoWE1ML3VucmVzb2x2X1VSSSI+PC9zZWN0aW9uPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQotPD9QdWIgKjAwMDAwMDIwNjQ/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHRvb2wuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHRvb2wuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2OTYzMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWx0b29sLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPlhNTCB0b29scyAtIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjeG1sdG9vbCI+PGEgbmFtZT0iY3htbHRvb2wiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5YTUwgdG9vbHMgLSBvdmVydmlldzwvaDE+Ci08ZGl2PjxwPlRoaXMgcHJvZHVjdCBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgdmlzdWFsIFhNTCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4KLVRoZSB0b29sIHNldCBpbmNsdWRlcyBjb21wb25lbnRzIGZvciBidWlsZGluZyBEVERzLCBYTUwgc2NoZW1hcywgYW5kIFhNTCBmaWxlcy48L3A+PHA+VGhlIGZvbGxvd2luZyBYTUwgdG9vbHMgYXJlIGF2YWlsYWJsZTo8L3A+Ci08cD5UaGUgPGI+WE1MIGVkaXRvcjwvYj4gaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBYTUwgZmlsZXMuIFlvdQotY2FuIHVzZSBpdCB0byBjcmVhdGUgbmV3IFhNTCBmaWxlcywgZWl0aGVyIGZyb20gc2NyYXRjaCwgZXhpc3RpbmcgRFREcywgb3IKLWV4aXN0aW5nIFhNTCBzY2hlbWFzLiBZb3UgY2FuIGFsc28gdXNlIGl0IHRvIGVkaXQgWE1MIGZpbGVzLCBhc3NvY2lhdGUgdGhlbQotd2l0aCBEVERzIG9yIHNjaGVtYXMsIGFuZCB2YWxpZGF0ZSB0aGVtLjwvcD4KLTxwPlRoZSA8Yj5EVEQgZWRpdG9yPC9iPiBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIERURHMuIDwvcD4KLTxwPlRoZSA8Yj5YTUwgc2NoZW1hIGVkaXRvcjwvYj4gaXMgYSB0b29sIGZvciBjcmVhdGluZywgdmlld2luZywgYW5kIHZhbGlkYXRpbmcgCi1YTUwgc2NoZW1hcy4gWW91IGNhbiB1c2UgdGhlIFhNTCBzY2hlbWEgZWRpdG9yIHRvIHBlcmZvcm0gdGFza3Mgc3VjaCBhcyBjcmVhdGluZyAKLVhNTCBzY2hlbWEgY29tcG9uZW50cyBhbmQgaW1wb3J0aW5nIGFuZCB2aWV3aW5nIFhNTCBzY2hlbWFzLiA8L3A+Ci08ZGl2IGNsYXNzPSJza2lwc3BhY2UiPkV4ZXJjaXNlIGNhdXRpb24gd2hlbiBvcGVuaW5nIGxhcmdlIGZpbGVzIHdpdGggYW55IG9mIHRoZSBYTUwgZWRpdG9ycy4KLUlmIHRoZSBtZW1vcnkgbGltaXRzIG9mIHRoZSB3b3JrYmVuY2ggYXJlIGV4Y2VlZGVkLCBpdCB3aWxsIGFicnVwdGx5IGNsb3NlCi13aXRob3V0IHNhdmluZyBhbnkgZGF0YSAoYW5kIHdpdGhvdXQgd2FybmluZyBvciBlcnJvciBtZXNzYWdlcykuIFRoZSBudW1iZXIKLW9mIGVsZW1lbnRzIGluIGFuIFhNTCBmaWxlLCBub3QgaXRzIHNpemUsIGlzIHRoZSBiZXN0IGluZGljYXRvciBvZiBob3cgbXVjaAotbWVtb3J5IHdpbGwgYmUgcmVxdWlyZWQuIE1lbW9yeSByZXF1aXJlbWVudHMgYWxzbyBkZXBlbmQgb24gd2hhdCBlbHNlIGlzIG9wZW4KLWluIHRoZSB3b3JrYmVuY2ggLSBpbiBzb21lIGNhc2VzIHlvdSBjYW4gb3BlbiBhIDE1IG1lZ2FieXRlcyBmaWxlLCBidXQgaW4KLW90aGVyIGNhc2VzIGEgb25lLW1lZ2FieXRlIGZpbGUgbWF5IGNhdXNlIHByb2JsZW1zLiBUaGVyZWZvcmUsIHdlIHJlY29tbWVuZAoteW91IHNhdmUgYWxsIGRhdGEgaW4gdGhlIHdvcmtiZW5jaCBiZWZvcmUgb3BlbmluZyBsYXJnZSBYTUwgZmlsZXMuIFRoaXMgaXMKLWEgcGVybWFuZW50IHJlc3RyaWN0aW9uLjwvZGl2PgotPGRpdiBjbGFzcz0ic2tpcHNwYWNlIj48cD5UaGUKLWJlaGF2aW9yIG9mIHRoZSBYTUwgcGFyc2VyIHdoZW4gZW5jb3VudGVyaW5nIGFuIHVucmVzb2x2YWJsZSBVUkkgKGZvciBleGFtcGxlLAotaW4gYSBET0NUWVBFIGRlY2xhcmF0aW9uKSBpcyB0byByZXBvcnQgYSBmYXRhbCBJTyBlcnJvciBhbmQgc3RvcCBhbnkgZnVydGhlcgotcHJvY2Vzc2luZy4gQW4gdW5yZXNvbHZlZCBVUkkgaXMgc2VlbiBuZWl0aGVyIGFzIGEgc3ludGFjdGljIG5vciBhIHNlbWFudGljCi1lcnJvciBhbmQgYXMgc3VjaCwgdGhlIHBhcnNlciBkb2VzIG5vdCBhdHRlbXB0IHRvIGhhbmRsZSBpdC4gRXNzZW50aWFsbHksCi10aGUgZG9jdW1lbnQgcmVtYWlucyB1bmNoZWNrZWQuIFRoaXMgaXMgYSBrbm93biBwcm9ibGVtLjwvcD4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZXh0Y3RuLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JleHRjdG4uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJiZTcxNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JleHRjdG4uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlICBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIiAicmVmZXJlbmNlLmR0ZCI+DQotPHJlZmVyZW5jZSBpZD0icmV4dGN0biIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBYTUwgZG9jdW1lbnRzIHdpdGggbXVsdGlwbGUgbmFtZXNwYWNlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RWRpdGluZyBYTUwgZG9jdW1lbnRzIHdpdGggbXVsdGlwbGUgbmFtZXNwYWNlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIHVzZSB0aGUgWE1MIHNjaGVtYSA8Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50IHRvIGV4dGVuZA0KLXRoZSBjb250ZW50IG1vZGVsIG9mIGFuIFhNTCBkb2N1bWVudC48L3Nob3J0ZGVzYz4NCi08cmVmYm9keT4NCi08c2VjdGlvbj48cD5Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYW4gWE1MIHNjaGVtYSBmaWxlIGNhbGxlZCBCb29rLnhzZCB0aGF0DQotY29udGFpbnMgYSBjb21wbGV4IHR5cGUgY2FsbGVkIEJvb2tUeXBlLiBCb29rVHlwZSBjb250YWlucyA0IGVsZW1lbnRzICh0aXRsZSwNCi1hdXRob3IsIHllYXIsIGFuZCBJU0JOKSBhbmQgb25lICA8Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50LiBUaGUgbmFtZXNwYWNlDQotZm9yIHRoZSA8Y29kZXBoPmFueTwvY29kZXBoPiAgZWxlbWVudCBpcyAgPGNvZGVwaD4jI2FueTwvY29kZXBoPi4gVGhpcyBtZWFucw0KLXRoYXQgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQsIHlvdSBjYW4gaW5zZXJ0IGFueSBYTUwgZWxlbWVudCB0byBleHRlbmQgdGhlDQotZGVmaW5pdGlvbiBvZiB0aGUgQm9va1R5cGUuPC9wPjxwPllvdSBjYW4gYWxzbyBwcm92aWRlIGEgbW9yZSBzcGVjaWZpYyBuYW1lc3BhY2UuDQotRm9yIGV4YW1wbGUsIHlvdSBoYXZlIGFub3RoZXIgc2NoZW1hIGNhbGxlZCBNeV9Cb29rLnhzZCwgd2hpY2ggY29udGFpbnMgYQ0KLWNvbXBsZXggdHlwZSBjYWxsZWQgTXlfQm9va1R5cGUuIE15X0Jvb2tUeXBlIGNvbnRhaW5zIDQgZWxlbWVudHMgKHRpdGxlLCBhdXRob3IsDQoteWVhciwgYW5kIElTQk4pIGFuZCBvbmUgIDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQsIGJ1dCBpbiB0aGlzIGNhc2UgdGhlDQotbmFtZXNwYWNlIGZvciB0aGUgIEJvb2tUeXBlIGVsZW1lbnQgaXMgd3d3Lndlc2xleS5jb20uIFRoaXMgbWVhbnMgdGhhdCBpbg0KLWFuIGluc3RhbmNlIGRvY3VtZW50LCB5b3UgY2FuIGluc2VydCBhbnkgWE1MIGVsZW1lbnQgdG8gZXh0ZW5kIHRoZSBkZWZpbml0aW9uDQotb2YgdGhlIEJvb2tUeXBlLCBwcm92aWRlZCB0aGF0IHRoZXkgYmVsb25nIHRvIHRoZSBuYW1lc3BhY2UgaHR0cDovL3d3dy53ZXNsZXkuY29tLjwvcD48L3NlY3Rpb24+DQotPC9yZWZib2R5Pg0KLTwvcmVmZXJlbmNlPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmV4dGN0bi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZXh0Y3RuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiOWM0ZTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZXh0Y3RuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgWE1MIGRvY3VtZW50cyB3aXRoIG11bHRpcGxlIG5hbWVzcGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIFhNTCBzY2hlbWEgYW55IGVsZW1lbnQgdG8gZXh0ZW5kIHRoZSBjb250ZW50IG1vZGVsIG9mIGFuIFhNTCBkb2N1bWVudC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIFhNTCBzY2hlbWEgYW55IGVsZW1lbnQgdG8gZXh0ZW5kIHRoZSBjb250ZW50IG1vZGVsIG9mIGFuIFhNTCBkb2N1bWVudC4iIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icmV4dGN0biIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgWE1MIGRvY3VtZW50cyB3aXRoIG11bHRpcGxlIG5hbWVzcGFjZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJleHRjdG4iPjxhIG5hbWU9InJleHRjdG4iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgWE1MIGRvY3VtZW50cyB3aXRoIG11bHRpcGxlIG5hbWVzcGFjZXM8L2gxPgotCi0KLQotPGRpdj48cD5Zb3UgY2FuIHVzZSB0aGUgWE1MIHNjaGVtYSA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQgdG8gZXh0ZW5kCi10aGUgY29udGVudCBtb2RlbCBvZiBhbiBYTUwgZG9jdW1lbnQuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYW4gWE1MIHNjaGVtYSBmaWxlIGNhbGxlZCBCb29rLnhzZCB0aGF0Ci1jb250YWlucyBhIGNvbXBsZXggdHlwZSBjYWxsZWQgQm9va1R5cGUuIEJvb2tUeXBlIGNvbnRhaW5zIDQgZWxlbWVudHMgKHRpdGxlLAotYXV0aG9yLCB5ZWFyLCBhbmQgSVNCTikgYW5kIG9uZSAgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50LiBUaGUgbmFtZXNwYWNlCi1mb3IgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gIGVsZW1lbnQgaXMgIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiMjYW55PC9zYW1wPi4gVGhpcyBtZWFucwotdGhhdCBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudCwgeW91IGNhbiBpbnNlcnQgYW55IFhNTCBlbGVtZW50IHRvIGV4dGVuZCB0aGUKLWRlZmluaXRpb24gb2YgdGhlIEJvb2tUeXBlLjwvcD4KLTxwPllvdSBjYW4gYWxzbyBwcm92aWRlIGEgbW9yZSBzcGVjaWZpYyBuYW1lc3BhY2UuCi1Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYW5vdGhlciBzY2hlbWEgY2FsbGVkIE15X0Jvb2sueHNkLCB3aGljaCBjb250YWlucyBhCi1jb21wbGV4IHR5cGUgY2FsbGVkIE15X0Jvb2tUeXBlLiBNeV9Cb29rVHlwZSBjb250YWlucyA0IGVsZW1lbnRzICh0aXRsZSwgYXV0aG9yLAoteWVhciwgYW5kIElTQk4pIGFuZCBvbmUgIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudCwgYnV0IGluIHRoaXMgY2FzZSB0aGUKLW5hbWVzcGFjZSBmb3IgdGhlICBCb29rVHlwZSBlbGVtZW50IGlzIHd3dy53ZXNsZXkuY29tLiBUaGlzIG1lYW5zIHRoYXQgaW4KLWFuIGluc3RhbmNlIGRvY3VtZW50LCB5b3UgY2FuIGluc2VydCBhbnkgWE1MIGVsZW1lbnQgdG8gZXh0ZW5kIHRoZSBkZWZpbml0aW9uCi1vZiB0aGUgQm9va1R5cGUsIHByb3ZpZGVkIHRoYXQgdGhleSBiZWxvbmcgdG8gdGhlIG5hbWVzcGFjZSBodHRwOi8vd3d3Lndlc2xleS5jb20uPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2IC8+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhNTC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYTUwuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdlZTRiMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhNTC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iICJyZWZlcmVuY2UuZHRkIj4NCi08cmVmZXJlbmNlIGlkPSJybGltaXRhdGlvbnNfc2x1c2hYTUwiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkxpbWl0YXRpb25zIG9mIFhNTCBFZGl0b3I8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkxpbWl0YXRpb25zIG9mIFhNTCBFZGl0b3I8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBrbm93biBwcm9kdWN0IGFzcGVjdCBsaW1pdGF0aW9ucyBhbmQgd29ya2Fyb3VuZHMuPC9zaG9ydGRlc2M+DQotPHJlZmJvZHk+DQotPCEtLVVzZSB0aGlzIHRlbXBsYXRlIHRvIHNpbmdsZSBzb3VyY2UgdGhlIHJlYWRtZSBpbmZvcm1hdGlvbi4gIFRoZSBjb250ZW50IGZvciB0aGUgcmVhZG1lIGluZm9ybWF0aW9uIGlzIG1haW50YWluZWQgaW4gdGhpcyB0b3BpYyBhbmQgaXMgaW5zZXJ0ZWQgaW50byB0aGUgcmVsYXRlZCB0b3BpYyB1c2luZyB0aGUgY29ucmVmIGF0dHJpYnV0ZS4gVGhpcyBmaWxlIHdpbGwgbm90IGJlIHN1cmZhY2VkIGluIHlvdXIgbmF2aWdhdGlvbi4tLT4NCi08c2VjdGlvbiBpZD0idW5yZXNvbHZfVVJJIj48IS0tTm8gZGVmZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzLiBJdCBpcyBmcm9tIHRoZSA1LjEuIHJlYWRtZS4tLT48cD5UaGUNCi1iZWhhdmlvciBvZiB0aGUgWE1MIHBhcnNlciB3aGVuIGVuY291bnRlcmluZyBhbiB1bnJlc29sdmFibGUgVVJJIChmb3IgZXhhbXBsZSwNCi1pbiBhIERPQ1RZUEUgZGVjbGFyYXRpb24pIGlzIHRvIHJlcG9ydCBhIGZhdGFsIElPIGVycm9yIGFuZCBzdG9wIGFueSBmdXJ0aGVyDQotcHJvY2Vzc2luZy4gQW4gdW5yZXNvbHZlZCBVUkkgaXMgc2VlbiBuZWl0aGVyIGFzIGEgc3ludGFjdGljIG5vciBhIHNlbWFudGljDQotZXJyb3IgYW5kIGFzIHN1Y2gsIHRoZSBwYXJzZXIgZG9lcyBub3QgYXR0ZW1wdCB0byBoYW5kbGUgaXQuIEVzc2VudGlhbGx5LA0KLXRoZSBkb2N1bWVudCByZW1haW5zIHVuY2hlY2tlZC4gVGhpcyBpcyBhIGtub3duIHByb2JsZW0uPC9wPjwvc2VjdGlvbj4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYTUwuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWE1MLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYTEyYzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYTUwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTGltaXRhdGlvbnMgb2YgWE1MIEVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGtub3duIHByb2R1Y3QgYXNwZWN0IGxpbWl0YXRpb25zIGFuZCB3b3JrYXJvdW5kcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBrbm93biBwcm9kdWN0IGFzcGVjdCBsaW1pdGF0aW9ucyBhbmQgd29ya2Fyb3VuZHMuIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InJsaW1pdGF0aW9uc19zbHVzaFhNTCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkxpbWl0YXRpb25zIG9mIFhNTCBFZGl0b3I8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJsaW1pdGF0aW9uc19zbHVzaFhNTCI+PGEgbmFtZT0icmxpbWl0YXRpb25zX3NsdXNoWE1MIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5MaW1pdGF0aW9ucyBvZiBYTUwgRWRpdG9yPC9oMT4KLQotCi0KLTxkaXY+PHA+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBrbm93biBwcm9kdWN0IGFzcGVjdCBsaW1pdGF0aW9ucyBhbmQgd29ya2Fyb3VuZHMuPC9wPgotCi0KLTxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJybGltaXRhdGlvbnNfc2x1c2hYTUxfX3VucmVzb2x2X1VSSSI+PGEgbmFtZT0icmxpbWl0YXRpb25zX3NsdXNoWE1MX191bnJlc29sdl9VUkkiPjwhLS0gLS0+PC9hPjxwPlRoZQotYmVoYXZpb3Igb2YgdGhlIFhNTCBwYXJzZXIgd2hlbiBlbmNvdW50ZXJpbmcgYW4gdW5yZXNvbHZhYmxlIFVSSSAoZm9yIGV4YW1wbGUsCi1pbiBhIERPQ1RZUEUgZGVjbGFyYXRpb24pIGlzIHRvIHJlcG9ydCBhIGZhdGFsIElPIGVycm9yIGFuZCBzdG9wIGFueSBmdXJ0aGVyCi1wcm9jZXNzaW5nLiBBbiB1bnJlc29sdmVkIFVSSSBpcyBzZWVuIG5laXRoZXIgYXMgYSBzeW50YWN0aWMgbm9yIGEgc2VtYW50aWMKLWVycm9yIGFuZCBhcyBzdWNoLCB0aGUgcGFyc2VyIGRvZXMgbm90IGF0dGVtcHQgdG8gaGFuZGxlIGl0LiBFc3NlbnRpYWxseSwKLXRoZSBkb2N1bWVudCByZW1haW5zIHVuY2hlY2tlZC4gVGhpcyBpcyBhIGtub3duIHByb2JsZW0uPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2IC8+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWxiaWNvbnMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGJpY29ucy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzk4YjA3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGJpY29ucy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iICJyZWZlcmVuY2UuZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTxyZWZlcmVuY2UgaWQ9InJpY29ucyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+SWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvcjwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+SWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvcjwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGUgZm9sbG93aW5nIFhNTCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIGFuZCBEZXNpZ24NCi12aWV3Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmljb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxyZWZib2R5Pg0KLTx0YWJsZT4NCi08dGdyb3VwIGNvbHM9IjIiPjxjb2xzcGVjIGNvbG5hbWU9IkNPTFNQRUMwIi8+PGNvbHNwZWMgY29sbmFtZT0iQ09MU1BFQzEiLz4NCi08dGJvZHk+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiIHZhbGlnbj0iYm90dG9tIj48Yj5JY29uPC9iPjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMxIiB2YWxpZ249ImJvdHRvbSI+PGI+RGVzY3JpcHRpb248L2I+PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9uYXR0cmliLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGF0dHJpYnV0ZQ0KLWljb248L2FsdD48L2ltYWdlPiA8L2VudHJ5Pg0KLTxlbnRyeT5hdHRyaWJ1dGU8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL2NkYXRhc2VjdGlvbi5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZQ0KLWNoYXJhY3RlciBkYXRhIGljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmNoYXJhY3RlciBkYXRhIChDREFUQSkgc2VjdGlvbjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvY29tbWVudF9vYmouZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgY29tbWVudA0KLWljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmNvbW1lbnQ8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL2RvY3R5cGUuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgRE9DVFlQRQ0KLWljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PkRPQ1RZUEUgZGVjbGFyYXRpb248L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL25lbGVtLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGVsZW1lbnQNCi1pY29uPC9hbHQ+PC9pbWFnZT4gPC9lbnRyeT4NCi08ZW50cnk+ZWxlbWVudDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvcHJvaW5zdF9vYmouZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgcHJvY2Vzc2luZw0KLWluc3RydWN0aW9ucyBpY29uPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5wcm9jZXNzaW5nIGluc3RydWN0aW9uczwvZW50cnk+DQotPC9yb3c+DQotPC90Ym9keT4NCi08L3Rncm91cD4NCi08L3RhYmxlPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCi08P1B1YiAqMDAwMDAwMTgyND8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sYmljb25zLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWxiaWNvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I5OWM2My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWxiaWNvbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgZm9sbG93aW5nIFhNTCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIGFuZCBEZXNpZ24gdmlldy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIGZvbGxvd2luZyBYTUwgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSBhbmQgRGVzaWduIHZpZXcuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgaWNvbnMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBpY29ucyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InJpY29ucyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3I8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJpY29ucyI+PGEgbmFtZT0icmljb25zIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5JY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGUgZm9sbG93aW5nIFhNTCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIGFuZCBEZXNpZ24KLXZpZXcuPC9wPgotCi0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCB2YWxpZ249ImJvdHRvbSI+PHN0cm9uZz5JY29uPC9zdHJvbmc+PC90ZD4KLQotPHRkIHZhbGlnbj0iYm90dG9tIj48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9uYXR0cmliLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGF0dHJpYnV0ZSYjMTA7aWNvbiIgLz4gPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5hdHRyaWJ1dGU8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL2NkYXRhc2VjdGlvbi5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSYjMTA7Y2hhcmFjdGVyIGRhdGEgaWNvbiIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmNoYXJhY3RlciBkYXRhIChDREFUQSkgc2VjdGlvbjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+IDxpbWcgc3JjPSIuLi9pbWFnZXMvY29tbWVudF9vYmouZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgY29tbWVudCYjMTA7aWNvbiIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmNvbW1lbnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL2RvY3R5cGUuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgRE9DVFlQRSYjMTA7aWNvbiIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPkRPQ1RZUEUgZGVjbGFyYXRpb248L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL25lbGVtLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGVsZW1lbnQmIzEwO2ljb24iIC8+IDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+ZWxlbWVudDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+IDxpbWcgc3JjPSIuLi9pbWFnZXMvcHJvaW5zdF9vYmouZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgcHJvY2Vzc2luZyYjMTA7aW5zdHJ1Y3Rpb25zIGljb24iIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5wcm9jZXNzaW5nIGluc3RydWN0aW9uczwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIHdpdGggTm9kZSBhbmQgQ29udGVudCBjb2x1bW5zIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGNhdGtleS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sY2F0a2V5LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NTJjOGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sY2F0a2V5LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHJlZmVyZW5jZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIg0KLSAicmVmZXJlbmNlLmR0ZCI+DQotPHJlZmVyZW5jZSBpZD0ieG1sY2F0YWxvZ2tleWJvYXJkc2hvcnRjdXRzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZSBvdXRwdXRjbGFzcz0iaWRfdGl0bGUiPlhNTCBDYXRhbG9nIGtleWJvYXJkIHNob3J0Y3V0czwvdGl0bGU+DQotPHNob3J0ZGVzYyBvdXRwdXRjbGFzcz0iaWRfc2hvcnRkZXNjIj5BY2NlbGVyYXRvciBrZXlzIGNhbiBiZSB1c2VkIGluIHRoZQ0KLWNhdGFsb2cgdHJlZSBzdHJ1Y3R1cmUgYW5kIGNhdGFsb2cgZW50cnkgd2l6YXJkIGJ5IGZpcnN0IHByZXNzaW5nIGFuZCBob2xkaW5nDQotdGhlIEFsdCBrZXkuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+YWNjZXNzaWJpbGl0eTxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPGluZGV4dGVybT5YTUwNCi1jYXRhbG9nIHdpemFyZDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPGluZGV4dGVybT5YTUwNCi1jYXRhbG9nIHdpemFyZDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+c2hvcnRjdXRzPGluZGV4dGVybT5rZXlib2FyZDxpbmRleHRlcm0+WE1MDQotY2F0YWxvZyB3aXphcmQ8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTCBjYXRhbG9nIHdpemFyZDxpbmRleHRlcm0+YWNjZXNzaWJpbGl0eTwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGNhdGFsb2cgd2l6YXJkPGluZGV4dGVybT5rZXlib2FyZCBzaG9ydGN1dHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHJlZmJvZHk+DQotPHRhYmxlIGZyYW1lPSJhbGwiPg0KLTx0Z3JvdXAgY29scz0iMiI+PGNvbHNwZWMgY29sbmFtZT0iY29sMSIgY29sd2lkdGg9Ijg0KiIvPjxjb2xzcGVjIGNvbG5hbWU9ImNvbDMiDQotY29sd2lkdGg9IjkzKiIvPg0KLTx0aGVhZD4NCi08cm93IHZhbGlnbj0iYm90dG9tIj4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+S2V5IENvbWJpbmF0aW9uPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMyI+RnVuY3Rpb248L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGhlYWQ+DQotPHRib2R5Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkFsdCtBPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMyI+QWRkIGNhdGFsb2cgZW50cnk8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkFsdCtFPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMyI+RWRpdCBzZWxlY3RlZCBjYXRhbG9nIGVudHJ5PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5BbHQrUjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDMiPlJlbW92ZSBzZWxlY3RlZCBjYXRhbG9nIGVudHJ5PC9lbnRyeT4NCi08L3Jvdz4NCi08L3Rib2R5Pg0KLTwvdGdyb3VwPg0KLTwvdGFibGU+DQotPC9yZWZib2R5Pg0KLTwvcmVmZXJlbmNlPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGNhdGtleS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sY2F0a2V5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYmMxNDUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sY2F0a2V5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlhNTCBDYXRhbG9nIGtleWJvYXJkIHNob3J0Y3V0cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBY2NlbGVyYXRvciBrZXlzIGNhbiBiZSB1c2VkIGluIHRoZSBjYXRhbG9nIHRyZWUgc3RydWN0dXJlIGFuZCBjYXRhbG9nIGVudHJ5IHdpemFyZCBieSBmaXJzdCBwcmVzc2luZyBhbmQgaG9sZGluZyB0aGUgQWx0IGtleS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQWNjZWxlcmF0b3Iga2V5cyBjYW4gYmUgdXNlZCBpbiB0aGUgY2F0YWxvZyB0cmVlIHN0cnVjdHVyZSBhbmQgY2F0YWxvZyBlbnRyeSB3aXphcmQgYnkgZmlyc3QgcHJlc3NpbmcgYW5kIGhvbGRpbmcgdGhlIEFsdCBrZXkuIiAvPgotPG1ldGEgY29udGVudD0iYWNjZXNzaWJpbGl0eSwga2V5Ym9hcmQgc2hvcnRjdXRzLCBYTUwgY2F0YWxvZyB3aXphcmQsIHNob3J0Y3V0cywga2V5Ym9hcmQsIFhNTCBjYXRhbG9nIHdpemFyZCIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImFjY2Vzc2liaWxpdHksIGtleWJvYXJkIHNob3J0Y3V0cywgWE1MIGNhdGFsb2cgd2l6YXJkLCBzaG9ydGN1dHMsIGtleWJvYXJkLCBYTUwgY2F0YWxvZyB3aXphcmQiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InhtbGNhdGFsb2drZXlib2FyZHNob3J0Y3V0cyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlhNTCBDYXRhbG9nIGtleWJvYXJkIHNob3J0Y3V0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ieG1sY2F0YWxvZ2tleWJvYXJkc2hvcnRjdXRzIj48YSBuYW1lPSJ4bWxjYXRhbG9na2V5Ym9hcmRzaG9ydGN1dHMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0iaWRfdGl0bGUiPlhNTCBDYXRhbG9nIGtleWJvYXJkIHNob3J0Y3V0czwvaDE+Ci0KLQotCi08ZGl2PjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPkFjY2VsZXJhdG9yIGtleXMgY2FuIGJlIHVzZWQgaW4gdGhlCi1jYXRhbG9nIHRyZWUgc3RydWN0dXJlIGFuZCBjYXRhbG9nIGVudHJ5IHdpemFyZCBieSBmaXJzdCBwcmVzc2luZyBhbmQgaG9sZGluZwotdGhlIEFsdCBrZXkuPC9wPgotCi0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj4KLTx0aGVhZCBhbGlnbj0ibGVmdCI+Ci08dHIgdmFsaWduPSJib3R0b20iPgotPHRoIHZhbGlnbj0iYm90dG9tIiB3aWR0aD0iNDcuNDU3NjI3MTE4NjQ0MDclIiBpZD0iTjEwMDkxIj5LZXkgQ29tYmluYXRpb248L3RoPgotCi08dGggdmFsaWduPSJib3R0b20iIHdpZHRoPSI1Mi41NDIzNzI4ODEzNTU5NCUiIGlkPSJOMTAwOTgiPkZ1bmN0aW9uPC90aD4KLQotPC90cj4KLQotPC90aGVhZD4KLQotPHRib2R5PgotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDcuNDU3NjI3MTE4NjQ0MDclIiBoZWFkZXJzPSJOMTAwOTEgIj5BbHQrQTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUyLjU0MjM3Mjg4MTM1NTk0JSIgaGVhZGVycz0iTjEwMDk4ICI+QWRkIGNhdGFsb2cgZW50cnk8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI0Ny40NTc2MjcxMTg2NDQwNyUiIGhlYWRlcnM9Ik4xMDA5MSAiPkFsdCtFPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTIuNTQyMzcyODgxMzU1OTQlIiBoZWFkZXJzPSJOMTAwOTggIj5FZGl0IHNlbGVjdGVkIGNhdGFsb2cgZW50cnk8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI0Ny40NTc2MjcxMTg2NDQwNyUiIGhlYWRlcnM9Ik4xMDA5MSAiPkFsdCtSPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTIuNTQyMzcyODgxMzU1OTQlIiBoZWFkZXJzPSJOMTAwOTggIj5SZW1vdmUgc2VsZWN0ZWQgY2F0YWxvZyBlbnRyeTwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbHRvb2xza2V5LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWx0b29sc2tleS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGVkYzNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbHRvb2xza2V5LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgUmVmZXJlbmNlLy9FTiINCi0gInJlZmVyZW5jZS5kdGQiPg0KLTxyZWZlcmVuY2UgaWQ9InhtbHRvb2xza2V5Ym9hcmRzaG9ydGN1dHMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNvdXJjZSBlZGl0b3IgYW5kIFhNTCB0b29scyBrZXlib2FyZCBzaG9ydGN1dHM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+VGhlIGZvbGxvd2luZyBrZXlib2FyZCBzaG9ydGN1dHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIFhNTCwgWFNELA0KLVdTREwsIEhUTUwsIEpTUCwgQ1NTIGFuZCBEVEQgZWRpdG9ycy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5hY2Nlc3NpYmlsaXR5PGluZGV4dGVybT5rZXlib2FyZCBzaG9ydGN1dHM8aW5kZXh0ZXJtPlhNTA0KLWVkaXRvcjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+YWNjZXNzaWJpbGl0eTxpbmRleHRlcm0+a2V5Ym9hcmQNCi1zaG9ydGN1dHM8aW5kZXh0ZXJtPnNvdXJjZSBlZGl0b3I8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPmtleWJvYXJkDQotc2hvcnRjdXRzPGluZGV4dGVybT5YTUwgZWRpdG9yPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5zaG9ydGN1dHM8aW5kZXh0ZXJtPmtleWJvYXJkPGluZGV4dGVybT5YTUwNCi1lZGl0b3I8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmFjY2Vzc2liaWxpdHk8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmtleWJvYXJkIHNob3J0Y3V0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WFNEIGVkaXRvcjxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5XU0RMIGVkaXRvcjxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5IVE1MIGVkaXRvcjxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5KU1AgZWRpdG9yPGluZGV4dGVybT5rZXlib2FyZCBzaG9ydGN1dHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPkNTUyBlZGl0b3I8aW5kZXh0ZXJtPmtleWJvYXJkIHNob3J0Y3V0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+RFREIGVkaXRvcjxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxyZWZib2R5Pg0KLTxzZWN0aW9uPjx0aXRsZT5TaG9ydGN1dHMgYXZhaWxhYmxlIGluIGFsbCBzb3VyY2UgZWRpdG9yczwvdGl0bGU+PHNpbXBsZXRhYmxlPg0KLTxzdGhlYWQ+DQotPHN0ZW50cnk+Q29tbWFuZDwvc3RlbnRyeT4NCi08c3RlbnRyeT5TaG9ydGN1dDwvc3RlbnRyeT4NCi08L3N0aGVhZD4NCi08c3Ryb3c+DQotPHN0ZW50cnk+R28gVG8gTWF0Y2hpbmcgQnJhY2tldDwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K1A8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+UmVzdG9yZSBMYXN0IFNlbGVjdGlvbjwvc3RlbnRyeT4NCi08c3RlbnRyeT5BdGwrU2hpZnQrRG93bjwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT5TZWxlY3QgRW5jbG9zaW5nIEVsZW1lbnQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+QWx0K1NoaWZ0K1VwPC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5PlNlbGVjdCBOZXh0IEVsZW1lbnQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+QWx0K1NoaWZ0K1JpZ2h0PC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5PlNlbGVjdCBQcmV2aW91cyBFbGVtZW50PC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkFsdCtTaGlmdCtMZWZ0PC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPC9zaW1wbGV0YWJsZT48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlNob3J0Y3V0cyBhdmFpbGFibGUgaW4gdGhlIFhNTCwgWFNELCBXU0RMLCBIVE1MLCBKU1AsIGFuZA0KLUNTUyBlZGl0b3JzIChleGNsdWRlcyB0aGUgRFREIGVkaXRvcik8L3RpdGxlPjxzaW1wbGV0YWJsZT4NCi08c3RoZWFkPg0KLTxzdGVudHJ5PkNvbW1hbmQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+U2hvcnRjdXQ8L3N0ZW50cnk+DQotPC9zdGhlYWQ+DQotPHN0cm93Pg0KLTxzdGVudHJ5PkZvcm1hdDwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K0Y8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+Rm9ybWF0IEFjdGl2ZSBFbGVtZW50czwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK0k8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08L3NpbXBsZXRhYmxlPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+U2hvcnRjdXRzIGF2YWlsYWJsZSBpbiB0aGUgWE1MLCBYU0QsIFdTREwsIEhUTUwsIGFuZCBKU1AgZWRpdG9ycw0KLShleGNsdWRlcyB0aGUgRFREIGFuZCBDU1MgZWRpdG9ycyk8L3RpdGxlPjxzaW1wbGV0YWJsZT4NCi08c3RoZWFkPg0KLTxzdGVudHJ5PkNvbW1hbmQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+U2hvcnRjdXQ8L3N0ZW50cnk+DQotPC9zdGhlYWQ+DQotPHN0cm93Pg0KLTxzdGVudHJ5PkFkZCBCbG9jayBDb21tZW50PC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkN0cmwrU2hpZnQrLzwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT5HbyBUbyBNYXRjaGluZyBUYWc8L3N0ZW50cnk+DQotPHN0ZW50cnk+Q3RybCtTaGlmdCs+PC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5PkdvIFRvIE5leHQgU2libGluZzwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K0Rvd248L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+T2NjdXJyZW5jZXMgaW4gRmlsZTwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K0E8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+T3BlbiBTZWxlY3Rpb248L3N0ZW50cnk+DQotPHN0ZW50cnk+RjM8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+R28gVG8gUHJldmlvdXMgU2libGluZzwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K1VwPC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5PlJlbW92ZSBCbG9jayBDb21tZW50PC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkN0cmwrU2hpZnQrXDwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT5Ub2dnbGUgQ29tbWVudDwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K0M8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08L3NpbXBsZXRhYmxlPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+U2hvcnRjdXRzIGF2YWlsYWJsZSBpbiB0aGUgZGVzaWduIHZpZXcgb2YgdGhlIFhTRCBhbmQgV1NETA0KLWVkaXRvcnM8L3RpdGxlPjxzaW1wbGV0YWJsZT4NCi08c3RoZWFkPg0KLTxzdGVudHJ5PkNvbW1hbmQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+U2hvcnRjdXQ8L3N0ZW50cnk+DQotPC9zdGhlYWQ+DQotPHN0cm93Pg0KLTxzdGVudHJ5Plpvb20gSW48L3N0ZW50cnk+DQotPHN0ZW50cnk+Q3RybCs9PC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5Plpvb20gT3V0PC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkN0cmwrLTwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTwvc2ltcGxldGFibGU+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5TaG9ydGN1dHMgYXZhaWxhYmxlIGluIHRoZSBkZXNpZ24gdmlldyBvZiB0aGUgV1NETCBlZGl0b3I8L3RpdGxlPjxzaW1wbGV0YWJsZT4NCi08c3RoZWFkPg0KLTxzdGVudHJ5PkNvbW1hbmQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+U2hvcnRjdXQ8L3N0ZW50cnk+DQotPC9zdGhlYWQ+DQotPHN0cm93Pg0KLTxzdGVudHJ5PkV4cG9ydCBEaWFncmFtIGFzIEltYWdlPC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkN0cmwrU2hpZnQrWDwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTwvc2ltcGxldGFibGU+PC9zZWN0aW9uPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWx0b29sc2tleS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sdG9vbHNrZXkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1ODY5OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWx0b29sc2tleS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU291cmNlIGVkaXRvciBhbmQgWE1MIHRvb2xzIGtleWJvYXJkIHNob3J0Y3V0cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgZm9sbG93aW5nIGtleWJvYXJkIHNob3J0Y3V0cyBhcmUgYXZhaWxhYmxlIGZvciB0aGUgWE1MLCBYU0QsIFdTREwsIEhUTUwsIEpTUCwgQ1NTIGFuZCBEVEQgZWRpdG9ycy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIGZvbGxvd2luZyBrZXlib2FyZCBzaG9ydGN1dHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIFhNTCwgWFNELCBXU0RMLCBIVE1MLCBKU1AsIENTUyBhbmQgRFREIGVkaXRvcnMuIiAvPgotPG1ldGEgY29udGVudD0iYWNjZXNzaWJpbGl0eSwga2V5Ym9hcmQgc2hvcnRjdXRzLCBYTUwgZWRpdG9yLCBrZXlib2FyZCBzaG9ydGN1dHMsIHNvdXJjZSBlZGl0b3IsIFhNTCBlZGl0b3IsIHNob3J0Y3V0cywga2V5Ym9hcmQsIFhTRCBlZGl0b3IsIFdTREwgZWRpdG9yLCBIVE1MIGVkaXRvciwgSlNQIGVkaXRvciwgQ1NTIGVkaXRvciwgRFREIGVkaXRvciIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImFjY2Vzc2liaWxpdHksIGtleWJvYXJkIHNob3J0Y3V0cywgWE1MIGVkaXRvciwga2V5Ym9hcmQgc2hvcnRjdXRzLCBzb3VyY2UgZWRpdG9yLCBYTUwgZWRpdG9yLCBzaG9ydGN1dHMsIGtleWJvYXJkLCBYU0QgZWRpdG9yLCBXU0RMIGVkaXRvciwgSFRNTCBlZGl0b3IsIEpTUCBlZGl0b3IsIENTUyBlZGl0b3IsIERURCBlZGl0b3IiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InhtbHRvb2xza2V5Ym9hcmRzaG9ydGN1dHMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Tb3VyY2UgZWRpdG9yIGFuZCBYTUwgdG9vbHMga2V5Ym9hcmQgc2hvcnRjdXRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ4bWx0b29sc2tleWJvYXJkc2hvcnRjdXRzIj48YSBuYW1lPSJ4bWx0b29sc2tleWJvYXJkc2hvcnRjdXRzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Tb3VyY2UgZWRpdG9yIGFuZCBYTUwgdG9vbHMga2V5Ym9hcmQgc2hvcnRjdXRzPC9oMT4KLQotCi0KLTxkaXY+PHA+VGhlIGZvbGxvd2luZyBrZXlib2FyZCBzaG9ydGN1dHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIFhNTCwgWFNELAotV1NETCwgSFRNTCwgSlNQLCBDU1MgYW5kIERURCBlZGl0b3JzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlNob3J0Y3V0cyBhdmFpbGFibGUgaW4gYWxsIHNvdXJjZSBlZGl0b3JzPC9oND48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGJvcmRlcj0iMSIgY2xhc3M9InNpbXBsZXRhYmxlYm9yZGVyIj4KLTx0cj4KLTx0aCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGlkPSJOMTAwRDAiPkNvbW1hbmQ8L3RoPgotCi08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMEQ2Ij5TaG9ydGN1dDwvdGg+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEQwIj5HbyBUbyBNYXRjaGluZyBCcmFja2V0PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRDYiPkN0cmwrU2hpZnQrUDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEQwIj5SZXN0b3JlIExhc3QgU2VsZWN0aW9uPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRDYiPkF0bCtTaGlmdCtEb3duPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRDAiPlNlbGVjdCBFbmNsb3NpbmcgRWxlbWVudDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEQ2Ij5BbHQrU2hpZnQrVXA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBEMCI+U2VsZWN0IE5leHQgRWxlbWVudDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEQ2Ij5BbHQrU2hpZnQrUmlnaHQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBEMCI+U2VsZWN0IFByZXZpb3VzIEVsZW1lbnQ8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBENiI+QWx0K1NoaWZ0K0xlZnQ8L3RkPgotCi08L3RyPgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TaG9ydGN1dHMgYXZhaWxhYmxlIGluIHRoZSBYTUwsIFhTRCwgV1NETCwgSFRNTCwgSlNQLCBhbmQKLUNTUyBlZGl0b3JzIChleGNsdWRlcyB0aGUgRFREIGVkaXRvcik8L2g0Pjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgYm9yZGVyPSIxIiBjbGFzcz0ic2ltcGxldGFibGVib3JkZXIiPgotPHRyPgotPHRoIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgaWQ9Ik4xMDE0QiI+Q29tbWFuZDwvdGg+Ci0KLTx0aCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGlkPSJOMTAxNTEiPlNob3J0Y3V0PC90aD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxNEIiPkZvcm1hdDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTUxIj5DdHJsK1NoaWZ0K0Y8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE0QiI+Rm9ybWF0IEFjdGl2ZSBFbGVtZW50czwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTUxIj5DdHJsK0k8L3RkPgotCi08L3RyPgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TaG9ydGN1dHMgYXZhaWxhYmxlIGluIHRoZSBYTUwsIFhTRCwgV1NETCwgSFRNTCwgYW5kIEpTUCBlZGl0b3JzCi0oZXhjbHVkZXMgdGhlIERURCBhbmQgQ1NTIGVkaXRvcnMpPC9oND48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGJvcmRlcj0iMSIgY2xhc3M9InNpbXBsZXRhYmxlYm9yZGVyIj4KLTx0cj4KLTx0aCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGlkPSJOMTAxOTAiPkNvbW1hbmQ8L3RoPgotCi08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMTk2Ij5TaG9ydGN1dDwvdGg+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTkwIj5BZGQgQmxvY2sgQ29tbWVudDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTk2Ij5DdHJsK1NoaWZ0Ky88L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5MCI+R28gVG8gTWF0Y2hpbmcgVGFnPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTYiPkN0cmwrU2hpZnQrJmd0OzwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTkwIj5HbyBUbyBOZXh0IFNpYmxpbmc8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5NiI+Q3RybCtTaGlmdCtEb3duPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTAiPk9jY3VycmVuY2VzIGluIEZpbGU8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5NiI+Q3RybCtTaGlmdCtBPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTAiPk9wZW4gU2VsZWN0aW9uPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTYiPkYzPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTAiPkdvIFRvIFByZXZpb3VzIFNpYmxpbmc8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5NiI+Q3RybCtTaGlmdCtVcDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTkwIj5SZW1vdmUgQmxvY2sgQ29tbWVudDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTk2Ij5DdHJsK1NoaWZ0K1w8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5MCI+VG9nZ2xlIENvbW1lbnQ8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5NiI+Q3RybCtTaGlmdCtDPC90ZD4KLQotPC90cj4KLQotPC90YWJsZT4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U2hvcnRjdXRzIGF2YWlsYWJsZSBpbiB0aGUgZGVzaWduIHZpZXcgb2YgdGhlIFhTRCBhbmQgV1NETAotZWRpdG9yczwvaDQ+PHRhYmxlIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBib3JkZXI9IjEiIGNsYXNzPSJzaW1wbGV0YWJsZWJvcmRlciI+Ci08dHI+Ci08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMjQxIj5Db21tYW5kPC90aD4KLQotPHRoIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgaWQ9Ik4xMDI0NyI+U2hvcnRjdXQ8L3RoPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI0MSI+Wm9vbSBJbjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMjQ3Ij5DdHJsKz08L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI0MSI+Wm9vbSBPdXQ8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI0NyI+Q3RybCstPC90ZD4KLQotPC90cj4KLQotPC90YWJsZT4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U2hvcnRjdXRzIGF2YWlsYWJsZSBpbiB0aGUgZGVzaWduIHZpZXcgb2YgdGhlIFdTREwgZWRpdG9yPC9oND48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGJvcmRlcj0iMSIgY2xhc3M9InNpbXBsZXRhYmxlYm9yZGVyIj4KLTx0cj4KLTx0aCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGlkPSJOMTAyODYiPkNvbW1hbmQ8L3RoPgotCi08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMjhDIj5TaG9ydGN1dDwvdGg+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMjg2Ij5FeHBvcnQgRGlhZ3JhbSBhcyBJbWFnZTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMjhDIj5DdHJsK1NoaWZ0K1g8L3RkPgotCi08L3RyPgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Yzc2YWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldHhtbC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRjcmV0eG1sIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBYTUwgZmlsZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkNyZWF0aW5nIFhNTCBmaWxlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB3aGljaCB5b3UgY2FuIHRoZW4gZWRpdCBpbiB0aGUgWE1MDQotZWRpdG9yLiBZb3UgY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwNCi1zY2hlbWEgZmlsZSwgc28gdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUga2luZCBvZiBjb250ZW50IGl0IGNhbiBjb250YWluLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBjcmVhdGUgYSBuZXcNCi1YTUwgZmlsZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNyZWF0ZSBhIHByb2plY3QgdG8gY29udGFpbiB0aGUgWE1MIGZpbGUgaWYgb25lIGRvZXMgbm90IGV4aXN0DQotYWxyZWFkeS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgd29ya2JlbmNoLCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5GaWxlPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD48dWljb250cm9sPk90aGVyPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5YTUw8L3VpY29udHJvbD48dWljb250cm9sPlhNTDwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LiBDbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBwcm9qZWN0IG9yIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgWE1MIGZpbGUuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+RmlsZSBuYW1lPC91aWNvbnRyb2w+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mDQotdGhlIFhNTCBmaWxlIGFuZCBjbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uIFRoZSBuYW1lIG9mIHlvdXIgWE1MIGZpbGUNCi1tdXN0IGVuZCBpbiA8dXNlcmlucHV0Pi54bWw8L3VzZXJpbnB1dD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSA8dWljb250cm9sPkNyZWF0ZSBYTUwgZmlsZSBmcm9tIGFuIFhNTCB0ZW1wbGF0ZTwvdWljb250cm9sPiByYWRpbw0KLWJ1dHRvbiBhbmQgY2xpY2sgPHVpY29udHJvbD5OZXh0LjwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXAgaW1wb3J0YW5jZT0ib3B0aW9uYWwiPjxjbWQ+WW91IG1heSBjaG9vc2UgdG8gdmlldyBhbmQgZWRpdCB0aGUgWE1MIHRlbXBsYXRlcw0KLXRoYXQgd2lsbCBiZSB1c2VkIGluIHlvdXIgbmV3IFhNTCBmaWxlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrICA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT48P1B1YiBDYXJldD8+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyMDA0Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NWQwNGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldHhtbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgWE1MIGZpbGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHdoaWNoIHlvdSBjYW4gdGhlbiBlZGl0IGluIHRoZSBYTUwgZWRpdG9yLiBZb3UgY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hIGZpbGUsIHNvIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIGtpbmQgb2YgY29udGVudCBpdCBjYW4gY29udGFpbi4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBjcmVhdGUgYSBuZXcgWE1MIGZpbGUgd2hpY2ggeW91IGNhbiB0aGVuIGVkaXQgaW4gdGhlIFhNTCBlZGl0b3IuIFlvdSBjcmVhdGUgYSBuZXcgWE1MIGZpbGUgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEgZmlsZSwgc28gdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUga2luZCBvZiBjb250ZW50IGl0IGNhbiBjb250YWluLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgY3JlYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIGNyZWF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV4ZHRkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3JleHhzZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHR0YWcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGNyZXR4bWwiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBYTUwgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRjcmV0eG1sIj48YSBuYW1lPSJ0Y3JldHhtbCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgWE1MIGZpbGVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB3aGljaCB5b3UgY2FuIHRoZW4gZWRpdCBpbiB0aGUgWE1MCi1lZGl0b3IuIFlvdSBjcmVhdGUgYSBuZXcgWE1MIGZpbGUgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTAotc2NoZW1hIGZpbGUsIHNvIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIGtpbmQgb2YgY29udGVudCBpdCBjYW4gY29udGFpbi48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gY3JlYXRlIGEgbmV3Ci1YTUwgZmlsZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPkNyZWF0ZSBhIHByb2plY3QgdG8gY29udGFpbiB0aGUgWE1MIGZpbGUgaWYgb25lIGRvZXMgbm90IGV4aXN0Ci1hbHJlYWR5Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIHdvcmtiZW5jaCwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk90aGVyPC9zcGFuPjwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj48L3NwYW4+LiBDbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0IHRoZSBwcm9qZWN0IG9yIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgWE1MIGZpbGUuPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlIG5hbWU8L3NwYW4+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mCi10aGUgWE1MIGZpbGUgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+LiBUaGUgbmFtZSBvZiB5b3VyIFhNTCBmaWxlCi1tdXN0IGVuZCBpbiA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPi54bWw8L2tiZD4uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBYTUwgZmlsZSBmcm9tIGFuIFhNTCB0ZW1wbGF0ZTwvc3Bhbj4gcmFkaW8KLWJ1dHRvbiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dC48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGk+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+WW91IG1heSBjaG9vc2UgdG8gdmlldyBhbmQgZWRpdCB0aGUgWE1MIHRlbXBsYXRlcwotdGhhdCB3aWxsIGJlIHVzZWQgaW4geW91ciBuZXcgWE1MIGZpbGUuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgLz4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNyZXhkdGQuaHRtbCIgdGl0bGU9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIERURCBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIERURCwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgRFRELiI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNyZXh4c2QuaHRtbCIgdGl0bGU9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBYTUwgc2NoZW1hIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIFhNTCBzY2hlbWEsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIFhNTCBzY2hlbWEuIj5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHR0YWcuaHRtbCIgdGl0bGU9IlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIFhNTCBmaWxlcy4iPkVkaXRpbmcgWE1MIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFlZmRlNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRjcmV4ZHRkIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20gYSBEVEQ8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkNCi1jcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBEVEQgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXINCi1EVEQgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aA0KLXlvdXIgRFRELCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91cg0KLURURC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InRjcmV4ZHRkfDF8WE1MZmlsZXNnZW5lcmF0aW5nZnJvbURURHMiIHN0YXR1cz0ibmV3Ij5YTUwNCi1maWxlczxpbmRleHRlcm0+Z2VuZXJhdGluZyBmcm9tIERURHM8L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtIGtleXJlZj0idGNyZXhkdGR8MnxEVERnZW5lcmF0aW5nWE1MZmlsZXMiDQotc3RhdHVzPSJjaGFuZ2VkIj5EVERzPGluZGV4dGVybT5nZW5lcmF0aW5nIFhNTCBmaWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+QWZ0ZXIgeW91IGhhdmUgZ2VuZXJhdGVkIHlvdXIgWE1MIGZpbGUsIHlvdSBjYW4gZnVydGhlciBjdXN0b21pemUNCi1pdCBpbiB0aGUgWE1MIGVkaXRvci48L3A+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUNCi1SZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvDQotY3JlYXRlIGFuIFhNTCBmaWxlIGZyb20gYSBEVEQgZmlsZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBOYXZpZ2F0b3IgdmlldywgcmlnaHQtY2xpY2sgdGhlIERURCBmaWxlIHRoYXQgeW91IHdhbnQgdG8NCi13b3JrIHdpdGggYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5HZW5lcmF0ZTwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MDQotRmlsZTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCBhIHByb2plY3Qgb3IgZm9sZGVyIHRvIGNvbnRhaW4gdGhlIFhNTCBmaWxlIGFuZCB0eXBlIGEgbmFtZQ0KLWZvciB0aGUgZmlsZSBpbiB0aGUgPHVpY29udHJvbD5GaWxlIE5hbWU8L3VpY29udHJvbD4gZmllbGQsIHRoZW4gY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvY21kPg0KLTxpbmZvPlRoZSBuYW1lIG9mIHRoZSBmaWxlIG11c3QgZW5kIGluIDx1c2VyaW5wdXQ+LnhtbDwvdXNlcmlucHV0Pi48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSA8dWljb250cm9sPlJvb3QgZWxlbWVudDwvdWljb250cm9sPiBvZiB0aGUgWE1MIGZpbGUuPC9jbWQ+DQotPGluZm8+VGhlIHJvb3QgZWxlbWVudCBvZiBhbiBYTUwgZmlsZSBpcyB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGFsbCBvdGhlcg0KLWVsZW1lbnRzIGluIHRoYXQgZmlsZS4gQWxsIHRoZSBlbGVtZW50cyB0aGF0IHlvdSBoYXZlIGRlZmluZWQgaW4gdGhlIERURCB3aWxsDQotYmUgc2hvd24gaW4gdGhlIDx1aWNvbnRyb2w+Um9vdCBlbGVtZW50PC91aWNvbnRyb2w+IGxpc3QuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCBmcm9tIHRoZSBmb2xsb3dpbmcgY29udGVudCBvcHRpb25zOiAgPC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT48dWljb250cm9sPkNyZWF0ZSBvcHRpb25hbCBhdHRyaWJ1dGVzPC91aWNvbnRyb2w+OiBib3RoIG1hbmRhdG9yeQ0KLWFuZCBvcHRpb25hbCBhdHRyaWJ1dGVzIHdpbGwgYmUgZ2VuZXJhdGVkLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5DcmVhdGUgb3B0aW9uYWwgZWxlbWVudHM8L3VpY29udHJvbD46IGJvdGggbWFuZGF0b3J5IGFuZA0KLW9wdGlvbmFsIGVsZW1lbnRzIHdpbGwgYmUgZ2VuZXJhdGVkLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5DcmVhdGUgZmlyc3QgY2hvaWNlIG9mIHJlcXVpcmVkIGNob2ljZTwvdWljb250cm9sPjogdGhlDQotZmlyc3Qgb3B0aW9uIG9mIGEgcmVxdWlyZWQgY2hvaWNlIHdpbGwgYmUgZ2VuZXJhdGVkIGluIHlvdXIgWE1MIGZpbGUuPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPkZpbGwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgd2l0aCBkYXRhPC91aWNvbnRyb2w+OiBhbnkNCi1lbGVtZW50cyBhbmQgYXR0cmlidXRlcyBnZW5lcmF0ZWQgd2lsbCBiZSBmaWxsZWQgd2l0aCBzYW1wbGUgZGF0YS48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPGluZm8+IElmIHlvdSBkbyBub3Qgc2VsZWN0IGFueSBvZiB0aGVzZSBvcHRpb25zLCB0aGVuIG9ubHkgdGhlIG1pbmltdW0gYW1vdW50DQotb2YgY29udGVudCByZXF1aXJlZCBmb3IgdGhlIFhNTCBmaWxlIHdpbGwgYmUgY3JlYXRlZC48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U3BlY2lmeSB0aGUgPHVpY29udHJvbD5QdWJsaWMgSUQ8L3VpY29udHJvbD4gb3IgPHVpY29udHJvbD5TeXN0ZW0NCi1JRDwvdWljb250cm9sPi48L2NtZD48aW5mbz5Zb3UgZG8gbm90IG5lZWQgdG8gc3BlY2lmeSBib3RoLiBJZiB5b3UgZG8sIHRoZQ0KLVB1YmxpYyBJRCB3aWxsIGJlIHVzZWQgYmVmb3JlIHRoZSBTeXN0ZW0gSUQuIDwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjxwPlRoZSBYTUwgZmlsZSB3aWxsIG9ubHkgY29udGFpbiB0aGUgc2VsZWN0ZWQgcm9vdCBlbGVtZW50IGFuZCBhbnkNCi1lbGVtZW50cyBvciBhdHRyaWJ1dGVzIGNvbnRhaW5lZCBpbiB0aGUgcm9vdCBlbGVtZW50LiBZb3UgY2FuIG5vdyBhZGQgZWxlbWVudHMsDQotYXR0cmlidXRlcywgZW50aXRpZXMsIGFuZCBub3RhdGlvbnMgdG8gdGhlIFhNTCBmaWxlLCBob3dldmVyLCB0aGV5IG11c3QgZm9sbG93DQotdGhlIHJ1bGVzIGVzdGFibGlzaGVkIGluIHRoZSBEVEQgdGhhdCB5b3UgdXNlZCB0byBjcmVhdGUgdGhlIFhNTCBmaWxlLjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZmJhMWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBEVEQgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBEVEQsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIERURC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgRFREIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgRFRELCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBEVEQuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCBnZW5lcmF0aW5nIGZyb20gRFREcywgRFREcywgZ2VuZXJhdGluZyBYTUwgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIGdlbmVyYXRpbmcgZnJvbSBEVERzLCBEVERzLCBnZW5lcmF0aW5nIFhNTCBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3JldHhtbC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNyZXh4c2QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0dGFnLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3htbGVkdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRjcmV4ZHRkIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+R2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSBhIERURDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGNyZXhkdGQiPjxhIG5hbWU9InRjcmV4ZHRkIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBpZiB5b3Ugd2FudCB0byBxdWlja2x5Ci1jcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBEVEQgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIKLURURCBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoCi15b3VyIERURCwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIKLURURC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkFmdGVyIHlvdSBoYXZlIGdlbmVyYXRlZCB5b3VyIFhNTCBmaWxlLCB5b3UgY2FuIGZ1cnRoZXIgY3VzdG9taXplCi1pdCBpbiB0aGUgWE1MIGVkaXRvci48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZQotUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvCi1jcmVhdGUgYW4gWE1MIGZpbGUgZnJvbSBhIERURCBmaWxlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBOYXZpZ2F0b3IgdmlldywgcmlnaHQtY2xpY2sgdGhlIERURCBmaWxlIHRoYXQgeW91IHdhbnQgdG8KLXdvcmsgd2l0aCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhdGU8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MCi1GaWxlPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGEgcHJvamVjdCBvciBmb2xkZXIgdG8gY29udGFpbiB0aGUgWE1MIGZpbGUgYW5kIHR5cGUgYSBuYW1lCi1mb3IgdGhlIGZpbGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgTmFtZTwvc3Bhbj4gZmllbGQsIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPgotIFRoZSBuYW1lIG9mIHRoZSBmaWxlIG11c3QgZW5kIGluIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+LnhtbDwva2JkPi4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Sb290IGVsZW1lbnQ8L3NwYW4+IG9mIHRoZSBYTUwgZmlsZS48L3NwYW4+Ci0gVGhlIHJvb3QgZWxlbWVudCBvZiBhbiBYTUwgZmlsZSBpcyB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGFsbCBvdGhlcgotZWxlbWVudHMgaW4gdGhhdCBmaWxlLiBBbGwgdGhlIGVsZW1lbnRzIHRoYXQgeW91IGhhdmUgZGVmaW5lZCBpbiB0aGUgRFREIHdpbGwKLWJlIHNob3duIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Sb290IGVsZW1lbnQ8L3NwYW4+IGxpc3QuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgZnJvbSB0aGUgZm9sbG93aW5nIGNvbnRlbnQgb3B0aW9uczogIDwvc3Bhbj4KLTx1bD4KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgb3B0aW9uYWwgYXR0cmlidXRlczwvc3Bhbj46IGJvdGggbWFuZGF0b3J5Ci1hbmQgb3B0aW9uYWwgYXR0cmlidXRlcyB3aWxsIGJlIGdlbmVyYXRlZC48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3JlYXRlIG9wdGlvbmFsIGVsZW1lbnRzPC9zcGFuPjogYm90aCBtYW5kYXRvcnkgYW5kCi1vcHRpb25hbCBlbGVtZW50cyB3aWxsIGJlIGdlbmVyYXRlZC48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3JlYXRlIGZpcnN0IGNob2ljZSBvZiByZXF1aXJlZCBjaG9pY2U8L3NwYW4+OiB0aGUKLWZpcnN0IG9wdGlvbiBvZiBhIHJlcXVpcmVkIGNob2ljZSB3aWxsIGJlIGdlbmVyYXRlZCBpbiB5b3VyIFhNTCBmaWxlLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHdpdGggZGF0YTwvc3Bhbj46IGFueQotZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgZ2VuZXJhdGVkIHdpbGwgYmUgZmlsbGVkIHdpdGggc2FtcGxlIGRhdGEuPC9saT4KLQotPC91bD4KLQotICBJZiB5b3UgZG8gbm90IHNlbGVjdCBhbnkgb2YgdGhlc2Ugb3B0aW9ucywgdGhlbiBvbmx5IHRoZSBtaW5pbXVtIGFtb3VudAotb2YgY29udGVudCByZXF1aXJlZCBmb3IgdGhlIFhNTCBmaWxlIHdpbGwgYmUgY3JlYXRlZC48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNwZWNpZnkgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlB1YmxpYyBJRDwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3lzdGVtCi1JRDwvc3Bhbj4uPC9zcGFuPiBZb3UgZG8gbm90IG5lZWQgdG8gc3BlY2lmeSBib3RoLiBJZiB5b3UgZG8sIHRoZQotUHVibGljIElEIHdpbGwgYmUgdXNlZCBiZWZvcmUgdGhlIFN5c3RlbSBJRC4gPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgWE1MIGZpbGUgd2lsbCBvbmx5IGNvbnRhaW4gdGhlIHNlbGVjdGVkIHJvb3QgZWxlbWVudCBhbmQgYW55Ci1lbGVtZW50cyBvciBhdHRyaWJ1dGVzIGNvbnRhaW5lZCBpbiB0aGUgcm9vdCBlbGVtZW50LiBZb3UgY2FuIG5vdyBhZGQgZWxlbWVudHMsCi1hdHRyaWJ1dGVzLCBlbnRpdGllcywgYW5kIG5vdGF0aW9ucyB0byB0aGUgWE1MIGZpbGUsIGhvd2V2ZXIsIHRoZXkgbXVzdCBmb2xsb3cKLXRoZSBydWxlcyBlc3RhYmxpc2hlZCBpbiB0aGUgRFREIHRoYXQgeW91IHVzZWQgdG8gY3JlYXRlIHRoZSBYTUwgZmlsZS48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNyZXR4bWwuaHRtbCIgdGl0bGU9IllvdSBjYW4gY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHdoaWNoIHlvdSBjYW4gdGhlbiBlZGl0IGluIHRoZSBYTUwgZWRpdG9yLiBZb3UgY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hIGZpbGUsIHNvIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIGtpbmQgb2YgY29udGVudCBpdCBjYW4gY29udGFpbi4iPkNyZWF0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV4eHNkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBYTUwgc2NoZW1hIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgWE1MIHNjaGVtYSBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBYTUwgc2NoZW1hIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBYTUwgc2NoZW1hLCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBYTUwgc2NoZW1hLiI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0dGFnLmh0bWwiIHRpdGxlPSJUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuIj5FZGl0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYTM4NzMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0Y3JleHhzZCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+R2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIGFuIFhNTCBzY2hlbWE8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0bw0KLXF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgWE1MIHNjaGVtYSBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTA0KLWZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5DQotYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzDQotYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBYTUwgc2NoZW1hLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0idGNyZXh4c2R8MXxYTUxmaWxlc2dlbmVyYXRpbmdmcm9tWE1Mc2NoZW1hcyINCi1zdGF0dXM9Im5ldyI+WE1MIGZpbGVzPGluZGV4dGVybT5nZW5lcmF0aW5nIGZyb20gWE1MIHNjaGVtYXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtIGtleXJlZj0idGNyZXh4c2R8MnxYTUxzY2hlbWFzZ2VuZXJhdGluZ1hNTGZpbGVzIiBzdGF0dXM9ImNoYW5nZWQiPnNjaGVtYXM8aW5kZXh0ZXJtPmdlbmVyYXRpbmcNCi1YTUwgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0idGNyZXh4c2R8MTF8WE1MZmlsZXNzY2hlbWFzIiBzdGF0dXM9Im5ldyI+WE1MDQotZmlsZXM8aW5kZXh0ZXJtPnNjaGVtYXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPkFmdGVyIHlvdSBoYXZlIGdlbmVyYXRlZCB5b3VyIFhNTCBmaWxlLCB5b3UgY2FuIGZ1cnRoZXIgY3VzdG9taXplDQotaXQgaW4gdGhlIFhNTCBlZGl0b3IuPC9wPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlDQotUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5Ubw0KLWdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20gYSBzY2hlbWEgZmlsZSBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgTmF2aWdhdG9yIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBYTUwgc2NoZW1hIGZpbGUgdGhhdCB5b3UNCi13YW50IHRvIHdvcmsgd2l0aCBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPkdlbmVyYXRlPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5YTUwgRmlsZTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCBhIHByb2plY3Qgb3IgZm9sZGVyIHRvIGNvbnRhaW4gdGhlIFhNTCBmaWxlIGFuZCB0eXBlIGEgbmFtZQ0KLWZvciB0aGUgZmlsZSBpbiB0aGUgPHVpY29udHJvbD5GaWxlIE5hbWU8L3VpY29udHJvbD4gZmllbGQsIHRoZW4gY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvY21kPg0KLTxpbmZvPlRoZSBuYW1lIG9mIHRoZSBmaWxlIG11c3QgZW5kIGluIDx1c2VyaW5wdXQ+LnhtbDwvdXNlcmlucHV0Pi48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSA8dWljb250cm9sPlJvb3QgZWxlbWVudDwvdWljb250cm9sPiBvZiB0aGUgWE1MIGZpbGUuPC9jbWQ+DQotPGluZm8+VGhlIHJvb3QgZWxlbWVudCBvZiBhbiBYTUwgZmlsZSBpcyB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGFsbCBvdGhlcg0KLWVsZW1lbnRzIGluIHRoYXQgZmlsZS4gQWxsIG9mIHRoZSBnbG9iYWwgZWxlbWVudHMgeW91IGhhdmUgZGVmaW5lZCBpbiB0aGUNCi1YTUwgc2NoZW1hIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIFJvb3QgZWxlbWVudCBsaXN0LiBJZiB5b3UgZG8gbm90IGhhdmUgYW55DQotZ2xvYmFsIGVsZW1lbnRzIGluIHlvdXIgWE1MIHNjaGVtYSwgeW91IGNhbm5vdCBjcmVhdGUgYW4gWE1MIGZpbGUgZnJvbSBpdC48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IGZyb20gdGhlIGZvbGxvd2luZyBjb250ZW50IG9wdGlvbnM6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT48dWljb250cm9sPkNyZWF0ZSBvcHRpb25hbCBhdHRyaWJ1dGVzPC91aWNvbnRyb2w+OiBib3RoIG1hbmRhdG9yeQ0KLWFuZCBvcHRpb25hbCBhdHRyaWJ1dGVzIHdpbGwgYmUgZ2VuZXJhdGVkLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5DcmVhdGUgb3B0aW9uYWwgZWxlbWVudHM8L3VpY29udHJvbD46IGJvdGggbWFuZGF0b3J5IGFuZA0KLW9wdGlvbmFsIGVsZW1lbnRzIHdpbGwgYmUgZ2VuZXJhdGVkLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5DcmVhdGUgZmlyc3QgY2hvaWNlIG9mIHJlcXVpcmVkIGNob2ljZTwvdWljb250cm9sPjogdGhlDQotZmlyc3Qgb3B0aW9uIG9mIGEgcmVxdWlyZWQgY2hvaWNlIHdpbGwgYmUgZ2VuZXJhdGVkIGluIHlvdXIgWE1MIGZpbGUuPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPkZpbGwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgd2l0aCBkYXRhPC91aWNvbnRyb2w+OiBhbnkNCi1lbGVtZW50cyBhbmQgYXR0cmlidXRlcyBnZW5lcmF0ZWQgd2lsbCBiZSBmaWxsZWQgd2l0aCBzYW1wbGUgZGF0YS48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPGluZm8+SWYgeW91IGRvIG5vdCBzZWxlY3QgYW55IG9mIHRoZXNlIG9wdGlvbnMsIHRoZW4gb25seSB0aGUgbWluaW11bSBhbW91bnQNCi1vZiBjb250ZW50IHJlcXVpcmVkIGZvciB0aGUgWE1MIGZpbGUgd2lsbCBiZSBjcmVhdGVkLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgTmFtZXNwYWNlIEluZm9ybWF0aW9uIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlDQotdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgWE1MIHNjaGVtYSwgaXRzIHByZWZpeCwgYW5kIHRoZSBzY2hlbWEgbG9jYXRpb24uIFNlbGVjdA0KLXRoZSBlbnRyeSB5b3Ugd2FudCB0byBlZGl0IGFuZCBjbGljayA8dWljb250cm9sPkVkaXQ8L3VpY29udHJvbD4uPC9jbWQ+PGluZm8+PHVsPg0KLTxsaT5UaGUgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+TmFtZXNwYWNlIE5hbWU8L3VpY29udHJvbD4gZmllbGQgaXMgdGhlIHRhcmdldA0KLW5hbWVzcGFjZSBvZiB0aGUgWE1MIHNjaGVtYS4gWW91ciBYTUwgZmlsZSBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1lDQotbmFtZXNwYWNlIGFzIGl0cyBYTUwgc2NoZW1hIGlzIGFzc29jaWF0ZWQgd2l0aC48L2xpPg0KLTxsaT5BbGwgcXVhbGlmaWVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHRoZSBYTUwgZmlsZSBhc3NvY2lhdGVkIHdpdGgNCi10aGUgbmFtZXNwYWNlIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCB0aGUgPHVpY29udHJvbD5QcmVmaXg8L3VpY29udHJvbD4gdmFsdWUuPC9saT4NCi08bGk+VGhlICA8dWljb250cm9sPkxvY2F0aW9uIEhpbnQ8L3VpY29udHJvbD4gZmllbGQgY29udGFpbnMgdGhlIGxvY2F0aW9uDQotb2YgdGhlIFhNTCBzY2hlbWEuPC9saT4NCi08L3VsPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG5hbWVzcGFjZXMgYW5kIG5hbWVzcGFjZSBwcmVmaXhlcywgcmVmZXIgdG8NCi10aGUgcmVsYXRlZCByZWZlcmVuY2VzLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IGFuZCB0aGVuIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+VGhlIFhNTCBmaWxlIHdpbGwgY29udGFpbiB0aGUgc2VsZWN0ZWQgcm9vdCBlbGVtZW50IGFuZCBhbnkgZWxlbWVudHMNCi1vciBhdHRyaWJ1dGVzIGNvbnRhaW5lZCBpbiB0aGUgcm9vdCBlbGVtZW50LiBJdCBhbHNvIGNvbnRhaW5zIGluZm9ybWF0aW9uDQotYWJvdXQgdGhlIFhNTCBmaWxlIG5hbWVzcGFjZSBhbmQgbG9jYXRpb24uIFlvdSBjYW4gbm93IGFkZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcw0KLXRvIHRoZSBYTUwgZmlsZS48L3A+PG5vdGU+SW4gY2VydGFpbiBjYXNlcywgd2hlbiBhbiBYTUwgZmlsZSBpcyBnZW5lcmF0ZWQNCi1mcm9tIGEgY29tcGxleCBYTUwgc2NoZW1hIGZpbGUsIHRoZSBYTUwgZmlsZSBtaWdodCBub3QgYmUgdmFsaWQuIElmIHRoaXMgb2NjdXJzLA0KLXlvdSBjYW4gb3BlbiB0aGUgZ2VuZXJhdGVkIGZpbGUgaW4gdGhlIFhNTCBlZGl0b3IgYW5kIGNvcnJlY3QgYW55IGVycm9ycyB0aGF0DQotb2NjdXIuIFVzdWFsbHksIG9ubHkgYSBmZXcgZXJyb3JzIG5lZWQgdG8gYmUgZml4ZWQuIFRoZSBmb2xsb3dpbmcgWE1MIHNjaGVtYQ0KLWNvbnN0cnVjdHMgbWlnaHQgcHJlc2VudCBwcm9ibGVtczo8L25vdGU+PHVsPg0KLTxsaT5SZXN0cmljdGlvbnM6IHNvbWV0aW1lcyByZXN0cmljdGVkIGVsZW1lbnRzIGFyZSBlcnJvbmVvdXNseSBnZW5lcmF0ZWQuIDwvbGk+DQotPGxpPkZhY2V0czogZGVmYXVsdCBnZW5lcmF0ZWQgZGF0YSB2YWx1ZXMgbWlnaHQgbm90IGNvbmZvcm0gdG8gY29tcGxleCBmYWNldHMNCi0oZm9yIGV4YW1wbGUsIHBhdHRlcm5zKS48L2xpPg0KLTxsaT5BYnN0cmFjdCBlbGVtZW50czogYWJzdHJhY3QgZWxlbWVudHMgYXJlIHNvbWV0aW1lcyBlcnJvbmVvdXNseSBnZW5lcmF0ZWQuPC9saT4NCi08L3VsPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXh4c2QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXh4c2QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQxNjViYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBYTUwgc2NoZW1hIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgWE1MIHNjaGVtYSBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBYTUwgc2NoZW1hIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBYTUwgc2NoZW1hLCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBYTUwgc2NoZW1hLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBYTUwgc2NoZW1hIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgWE1MIHNjaGVtYSBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBYTUwgc2NoZW1hIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBYTUwgc2NoZW1hLCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBYTUwgc2NoZW1hLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgZ2VuZXJhdGluZyBmcm9tIFhNTCBzY2hlbWFzLCBzY2hlbWFzLCBnZW5lcmF0aW5nIFhNTCBmaWxlcywgWE1MIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCBnZW5lcmF0aW5nIGZyb20gWE1MIHNjaGVtYXMsIHNjaGVtYXMsIGdlbmVyYXRpbmcgWE1MIGZpbGVzLCBYTUwgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNyZXR4bWwuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV4ZHRkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHRhZy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGNyZXh4c2QiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5HZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20gYW4gWE1MIHNjaGVtYTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGNyZXh4c2QiPjxhIG5hbWU9InRjcmV4eHNkIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzPC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBYTUwgc2NoZW1hIGlmIHlvdSB3YW50IHRvCi1xdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwKLWZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5Ci1hc3NvY2lhdGVkIHdpdGggeW91ciBYTUwgc2NoZW1hLCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMKLWFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkFmdGVyIHlvdSBoYXZlIGdlbmVyYXRlZCB5b3VyIFhNTCBmaWxlLCB5b3UgY2FuIGZ1cnRoZXIgY3VzdG9taXplCi1pdCBpbiB0aGUgWE1MIGVkaXRvci48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZQotUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvCi1nZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIGEgc2NoZW1hIGZpbGUgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBOYXZpZ2F0b3IgdmlldywgcmlnaHQtY2xpY2sgdGhlIFhNTCBzY2hlbWEgZmlsZSB0aGF0IHlvdQotd2FudCB0byB3b3JrIHdpdGggYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYXRlPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIEZpbGU8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgYSBwcm9qZWN0IG9yIGZvbGRlciB0byBjb250YWluIHRoZSBYTUwgZmlsZSBhbmQgdHlwZSBhIG5hbWUKLWZvciB0aGUgZmlsZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZSBOYW1lPC9zcGFuPiBmaWVsZCwgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L3NwYW4+Ci0gVGhlIG5hbWUgb2YgdGhlIGZpbGUgbXVzdCBlbmQgaW4gPGtiZCBjbGFzcz0idXNlcmlucHV0Ij4ueG1sPC9rYmQ+LgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJvb3QgZWxlbWVudDwvc3Bhbj4gb2YgdGhlIFhNTCBmaWxlLjwvc3Bhbj4KLSBUaGUgcm9vdCBlbGVtZW50IG9mIGFuIFhNTCBmaWxlIGlzIHRoZSBlbGVtZW50IHRoYXQgY29udGFpbnMgYWxsIG90aGVyCi1lbGVtZW50cyBpbiB0aGF0IGZpbGUuIEFsbCBvZiB0aGUgZ2xvYmFsIGVsZW1lbnRzIHlvdSBoYXZlIGRlZmluZWQgaW4gdGhlCi1YTUwgc2NoZW1hIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIFJvb3QgZWxlbWVudCBsaXN0LiBJZiB5b3UgZG8gbm90IGhhdmUgYW55Ci1nbG9iYWwgZWxlbWVudHMgaW4geW91ciBYTUwgc2NoZW1hLCB5b3UgY2Fubm90IGNyZWF0ZSBhbiBYTUwgZmlsZSBmcm9tIGl0LgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgZnJvbSB0aGUgZm9sbG93aW5nIGNvbnRlbnQgb3B0aW9uczo8L3NwYW4+Ci08dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3JlYXRlIG9wdGlvbmFsIGF0dHJpYnV0ZXM8L3NwYW4+OiBib3RoIG1hbmRhdG9yeQotYW5kIG9wdGlvbmFsIGF0dHJpYnV0ZXMgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBvcHRpb25hbCBlbGVtZW50czwvc3Bhbj46IGJvdGggbWFuZGF0b3J5IGFuZAotb3B0aW9uYWwgZWxlbWVudHMgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBmaXJzdCBjaG9pY2Ugb2YgcmVxdWlyZWQgY2hvaWNlPC9zcGFuPjogdGhlCi1maXJzdCBvcHRpb24gb2YgYSByZXF1aXJlZCBjaG9pY2Ugd2lsbCBiZSBnZW5lcmF0ZWQgaW4geW91ciBYTUwgZmlsZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB3aXRoIGRhdGE8L3NwYW4+OiBhbnkKLWVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGdlbmVyYXRlZCB3aWxsIGJlIGZpbGxlZCB3aXRoIHNhbXBsZSBkYXRhLjwvbGk+Ci0KLTwvdWw+Ci0KLSBJZiB5b3UgZG8gbm90IHNlbGVjdCBhbnkgb2YgdGhlc2Ugb3B0aW9ucywgdGhlbiBvbmx5IHRoZSBtaW5pbXVtIGFtb3VudAotb2YgY29udGVudCByZXF1aXJlZCBmb3IgdGhlIFhNTCBmaWxlIHdpbGwgYmUgY3JlYXRlZC48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSBOYW1lc3BhY2UgSW5mb3JtYXRpb24gc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLXRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIFhNTCBzY2hlbWEsIGl0cyBwcmVmaXgsIGFuZCB0aGUgc2NoZW1hIGxvY2F0aW9uLiBTZWxlY3QKLXRoZSBlbnRyeSB5b3Ugd2FudCB0byBlZGl0IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPi48L3NwYW4+IDx1bD4KLTxsaT5UaGUgdmFsdWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWVzcGFjZSBOYW1lPC9zcGFuPiBmaWVsZCBpcyB0aGUgdGFyZ2V0Ci1uYW1lc3BhY2Ugb2YgdGhlIFhNTCBzY2hlbWEuIFlvdXIgWE1MIGZpbGUgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZQotbmFtZXNwYWNlIGFzIGl0cyBYTUwgc2NoZW1hIGlzIGFzc29jaWF0ZWQgd2l0aC48L2xpPgotCi08bGk+QWxsIHF1YWxpZmllZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB0aGUgWE1MIGZpbGUgYXNzb2NpYXRlZCB3aXRoCi10aGUgbmFtZXNwYWNlIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZml4PC9zcGFuPiB2YWx1ZS48L2xpPgotCi08bGk+VGhlICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Mb2NhdGlvbiBIaW50PC9zcGFuPiBmaWVsZCBjb250YWlucyB0aGUgbG9jYXRpb24KLW9mIHRoZSBYTUwgc2NoZW1hLjwvbGk+Ci0KLTwvdWw+Ci1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBuYW1lc3BhY2VzIGFuZCBuYW1lc3BhY2UgcHJlZml4ZXMsIHJlZmVyIHRvCi10aGUgcmVsYXRlZCByZWZlcmVuY2VzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IGFuZCB0aGVuIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIFhNTCBmaWxlIHdpbGwgY29udGFpbiB0aGUgc2VsZWN0ZWQgcm9vdCBlbGVtZW50IGFuZCBhbnkgZWxlbWVudHMKLW9yIGF0dHJpYnV0ZXMgY29udGFpbmVkIGluIHRoZSByb290IGVsZW1lbnQuIEl0IGFsc28gY29udGFpbnMgaW5mb3JtYXRpb24KLWFib3V0IHRoZSBYTUwgZmlsZSBuYW1lc3BhY2UgYW5kIGxvY2F0aW9uLiBZb3UgY2FuIG5vdyBhZGQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMKLXRvIHRoZSBYTUwgZmlsZS48L3A+Ci08ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSW4gY2VydGFpbiBjYXNlcywgd2hlbiBhbiBYTUwgZmlsZSBpcyBnZW5lcmF0ZWQKLWZyb20gYSBjb21wbGV4IFhNTCBzY2hlbWEgZmlsZSwgdGhlIFhNTCBmaWxlIG1pZ2h0IG5vdCBiZSB2YWxpZC4gSWYgdGhpcyBvY2N1cnMsCi15b3UgY2FuIG9wZW4gdGhlIGdlbmVyYXRlZCBmaWxlIGluIHRoZSBYTUwgZWRpdG9yIGFuZCBjb3JyZWN0IGFueSBlcnJvcnMgdGhhdAotb2NjdXIuIFVzdWFsbHksIG9ubHkgYSBmZXcgZXJyb3JzIG5lZWQgdG8gYmUgZml4ZWQuIFRoZSBmb2xsb3dpbmcgWE1MIHNjaGVtYQotY29uc3RydWN0cyBtaWdodCBwcmVzZW50IHByb2JsZW1zOjwvZGl2PgotPHVsPgotPGxpPlJlc3RyaWN0aW9uczogc29tZXRpbWVzIHJlc3RyaWN0ZWQgZWxlbWVudHMgYXJlIGVycm9uZW91c2x5IGdlbmVyYXRlZC4gPC9saT4KLQotPGxpPkZhY2V0czogZGVmYXVsdCBnZW5lcmF0ZWQgZGF0YSB2YWx1ZXMgbWlnaHQgbm90IGNvbmZvcm0gdG8gY29tcGxleCBmYWNldHMKLShmb3IgZXhhbXBsZSwgcGF0dGVybnMpLjwvbGk+Ci0KLTxsaT5BYnN0cmFjdCBlbGVtZW50czogYWJzdHJhY3QgZWxlbWVudHMgYXJlIHNvbWV0aW1lcyBlcnJvbmVvdXNseSBnZW5lcmF0ZWQuPC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3htbGVkdC5odG1sIiB0aXRsZT0iVGhlIFhNTCBlZGl0b3IgaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBYTUwgZmlsZXMuIj5YTUwgZWRpdG9yPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90Y3JldHhtbC5odG1sIiB0aXRsZT0iWW91IGNhbiBjcmVhdGUgYSBuZXcgWE1MIGZpbGUgd2hpY2ggeW91IGNhbiB0aGVuIGVkaXQgaW4gdGhlIFhNTCBlZGl0b3IuIFlvdSBjcmVhdGUgYSBuZXcgWE1MIGZpbGUgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEgZmlsZSwgc28gdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUga2luZCBvZiBjb250ZW50IGl0IGNhbiBjb250YWluLiI+Q3JlYXRpbmcgWE1MIGZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNyZXhkdGQuaHRtbCIgdGl0bGU9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIERURCBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIERURCwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgRFRELiI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHR0YWcuaHRtbCIgdGl0bGU9IlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIFhNTCBmaWxlcy4iPkVkaXRpbmcgWE1MIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxpbmZvIj48c3Ryb25nPlJlbGF0ZWQgaW5mb3JtYXRpb248L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmh0bWwiPlhNTCBuYW1lc3BhY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGNuc3QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGNuc3QuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkNDNjZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRjbnN0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRlZHRjbnN0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50czwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5JbiB0aGUgRGVzaWduIHZpZXcsIHdoZW4geW91IGVkaXQgYW4gWE1MIGZpbGUgdGhhdCBoYXMgYSBzZXQgb2YNCi1jb25zdHJhaW50cyBvciBydWxlcyBkZWZpbmVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gdHVybiB0aGUgY29uc3RyYWludHMNCi1vbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluDQotdGhlIHZhbGlkaXR5IG9mIHRoZSBkb2N1bWVudCBwZXJpb2RpY2FsbHkuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+ZWRpdGluZyB3aXRoIGNvbnN0cmFpbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPmVkaXRpbmcgd2l0aCBjb25zdHJhaW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+IFdoZW4gdGhlIGNvbnN0cmFpbnRzIGFyZSB0dXJuZWQgb24sIGFuZCB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlDQotRGVzaWduIHZpZXcsIHRoZSBYTUwgZWRpdG9yIHByZXZlbnRzIHlvdSBmcm9tIGluc2VydGluZyBlbGVtZW50cywgYXR0cmlidXRlcywNCi1vciBhdHRyaWJ1dGUgdmFsdWVzIG5vdCBwZXJtaXR0ZWQgYnkgdGhlIHJ1bGVzIG9mIHRoZSBYTUwgc2NoZW1hIG9yIERURCwgYW5kDQotZnJvbSByZW1vdmluZyBuZWNlc3Nhcnkgb3IgcHJlZGVmaW5lZCBzZXRzIG9mIHRhZ3MgYW5kIHZhbHVlcy4gSW4gdGhpcyBtb2RlLA0KLWFuIGVsZW1lbnQncyBjb250ZW50IG11c3QgYmUgdmFsaWQgdG8gdXNlIHRoZSBYTUwgZWRpdG9yJ3MgZ3VpZGVkIGVkaXRpbmcNCi1vcHRpb25zLjwvcD48cD5Zb3UgbWlnaHQgd2FudCB0byB0dXJuIHRoZSBjb25zdHJhaW50cyBvZmYgZm9yIGFuIFhNTCBmaWxlDQotaWYgeW91IG5lZWQgbW9yZSBmbGV4aWJpbGl0eS4gRm9yIGV4YW1wbGUsIHlvdSB3YW50IHRvIHRyeSB3b3JraW5nIHdpdGggZWxlbWVudHMNCi1vciBhdHRyaWJ1dGVzIG5vdCBwZXJtaXR0ZWQgYnkgdGhlIGFzc29jaWF0ZWQgRFREIG9yIFhNTCBzY2hlbWEsIHdpdGhvdXQgYWN0dWFsbHkNCi1yZW1vdmluZyB0aGUgYXNzb2NpYXRpb24gd2l0aCB0aGUgRFREIG9yIFhNTCBzY2hlbWEuPC9wPjxwPlRvIHR1cm4gdGhlIGNvbnN0cmFpbnRzDQotZm9yIGFuIFhNTCBmaWxlIG9mZiwgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+WE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5UdXJuDQotR3JhbW1hciBDb25zdHJhaW50cyBPZmY8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiBpbiB0aGUgdG9vbGJhci4gQWZ0ZXIgeW91DQotaGF2ZSB0dXJuZWQgdGhlIGNvbnN0cmFpbnRzIG9mZiBmb3IgYSBmaWxlLCB5b3UgY2FuIGluc2VydCBvciBkZWxldGUgYW55IGVsZW1lbnQNCi1vciBhdHRyaWJ1dGUgcmVnYXJkbGVzcyBvZiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgcnVsZXMuIFlvdSBjYW4gY3JlYXRlIG5ldw0KLWVsZW1lbnRzIG9yIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbm90IGluIHRoZSBEVEQgb3Igc2NoZW1hIC0gdGhlc2UgRGVzaWduIHZpZXcNCi1wcm9tcHRzIHdpbGwgb25seSBhcHBlYXIgd2hlbiB5b3UgaGF2ZSB0dXJuZWQgY29uc3RyYWludHMgb2ZmLiBUaGUgZmlsZSBtaWdodA0KLW5vdCBiZSB2YWxpZCwgaG93ZXZlciwgaWYgeW91IGRvIHRoaXMuIDwvcD48cD5UaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MNCi13aGF0IHlvdSBjYW4gZG8gaWYgeW91IHR1cm4gdGhlIGNvbnN0cmFpbnRzIG9mIGEgRFREIG9mZjo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4gdGhlIFhNTCBmaWxlIGluIHRoZSBYTUwgZWRpdG9yIChyaWdodC1jbGljayB0aGUgZmlsZSBpbiB0aGUNCi1OYXZpZ2F0b3IgdmlldyBhbmQgY2xpY2sgPHVpY29udHJvbD5PcGVuIFdpdGggPiBYTUwgRWRpdG9yPC91aWNvbnRyb2w+KS4gPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+WW91IGhhdmUgYSBEVEQgdGhhdCBzcGVjaWZpZXMgdGhhdCBhbiBlbGVtZW50IHJlcXVpcmVzIGF0IGxlYXN0DQotb25lIG9mIGEgc3BlY2lmaWMgY2hpbGQgZWxlbWVudDogIDwvY21kPjxpbmZvPjxjb2RlYmxvY2s+Jmx0OyFFTEVNRU5UIHBhcmVudEVsZW1lbnQgKGNoaWxkRWxlbWVudCspPg0KLTwvY29kZWJsb2NrPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiwgaW4gYW4gWE1MIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHlvdXIgRFRELCB5b3UgYXR0ZW1wdCB0byByZW1vdmUNCi10aGUgZmluYWwgY2hpbGQgZWxlbWVudCBvZiB0aGUgZWxlbWVudCB3aXRoIHRoZSBEVEQgY29uc3RyYWludHMgdHVybmVkIG9uLA0KLXRoZSBlZGl0b3Igd2lsbCBub3QgYWxsb3cgeW91IHRvIGRvIHRoaXMsIGFzIGl0IHdpbGwgbWFrZSB0aGUgZG9jdW1lbnQgaW52YWxpZC48L2NtZD4NCi08aW5mbz5Zb3UgY2FuIGNvbmZpcm0gdGhpcyBieSB1c2luZyB0aGUgZWxlbWVudCdzIHBvcC11cCBtZW51IHRvIHZlcmlmeSB0aGF0DQotdGhlIDx1aWNvbnRyb2w+UmVtb3ZlPC91aWNvbnRyb2w+IG9wdGlvbiBpcyBncmF5ZWQgb3V0LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyB0dXJuIHRoZSBEVEQgY29uc3RyYWludHMgb2ZmLCBjbGljayA8dWljb250cm9sPlhNTCA+IFR1cm4gR3JhbW1hcg0KLUNvbnN0cmFpbnRzIE9mZjwvdWljb250cm9sPi4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IGF0dGVtcHQgdG8gcmVtb3ZlIHRoZSBzYW1lIGNoaWxkIGVsZW1lbnQgd2l0aCBjb25zdHJhaW50cw0KLW9mZiwgdGhlIGVkaXRvciB3aWxsIGFsbG93IHlvdSB0by48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyBjb3JyZWN0IHRoZSBpbnZhbGlkIGRvY3VtZW50LCB5b3Ugd2lsbCBoYXZlIHRvIHJlLWFkZCB0aGUgbmVjZXNzYXJ5DQotZWxlbWVudCwgb3IgcmVtb3ZlIHRoZSBpbnZhbGlkIHRhZ2dpbmcgb3IgdmFsdWUuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48P1B1YiBDYXJldD8+PHA+SWYgeW91IGludHJvZHVjZSBlcnJvcnMgaW50byB5b3VyIGZpbGVzLCB5b3UgbXVzdA0KLXNhdmUgYW5kIHZhbGlkYXRlIHRoZSBmaWxlIGluIG9yZGVyIHRvIHNlZSBhIGxpc3Qgb2YgdGhlIGVycm9ycyB5b3UgaGF2ZSBpbnRyb2R1Y2VkLg0KLVRoZXkgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuIEFmdGVyIHlvdSBmaXggdGhlIGVycm9ycywgeW91IG11c3QNCi1zYXZlIGFuZCB2YWxpZGF0ZSB5b3VyIGZpbGUgYWdhaW4gdG8gc2VlIGlmIHRoZSBmaWxlIGlzIG5vdyB2YWxpZC48L3A+PHA+VGhlc2UNCi1pbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbw0KLXdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzODE0Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRjbnN0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRjbnN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2OTNlYmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Y25zdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJJbiB0aGUgRGVzaWduIHZpZXcsIHdoZW4geW91IGVkaXQgYW4gWE1MIGZpbGUgdGhhdCBoYXMgYSBzZXQgb2YgY29uc3RyYWludHMgb3IgcnVsZXMgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzIG9uIGFuZCBvZmYgdG8gcHJvdmlkZSBmbGV4aWJpbGl0eSBpbiB0aGUgd2F5IHlvdSBlZGl0LCBidXQgc3RpbGwgbWFpbnRhaW4gdGhlIHZhbGlkaXR5IG9mIHRoZSBkb2N1bWVudCBwZXJpb2RpY2FsbHkuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkluIHRoZSBEZXNpZ24gdmlldywgd2hlbiB5b3UgZWRpdCBhbiBYTUwgZmlsZSB0aGF0IGhhcyBhIHNldCBvZiBjb25zdHJhaW50cyBvciBydWxlcyBkZWZpbmVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gdHVybiB0aGUgY29uc3RyYWludHMgb24gYW5kIG9mZiB0byBwcm92aWRlIGZsZXhpYmlsaXR5IGluIHRoZSB3YXkgeW91IGVkaXQsIGJ1dCBzdGlsbCBtYWludGFpbiB0aGUgdmFsaWRpdHkgb2YgdGhlIGRvY3VtZW50IHBlcmlvZGljYWxseS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBlZGl0aW5nIHdpdGggY29uc3RyYWludHMsIFhNTCBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIGVkaXRpbmcgd2l0aCBjb25zdHJhaW50cywgWE1MIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRkb2MuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0c2NoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlZHRjbnN0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZWR0Y25zdCI+PGEgbmFtZT0idGVkdGNuc3QiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50czwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+SW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mCi1jb25zdHJhaW50cyBvciBydWxlcyBkZWZpbmVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gdHVybiB0aGUgY29uc3RyYWludHMKLW9uIGFuZCBvZmYgdG8gcHJvdmlkZSBmbGV4aWJpbGl0eSBpbiB0aGUgd2F5IHlvdSBlZGl0LCBidXQgc3RpbGwgbWFpbnRhaW4KLXRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+IFdoZW4gdGhlIGNvbnN0cmFpbnRzIGFyZSB0dXJuZWQgb24sIGFuZCB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlCi1EZXNpZ24gdmlldywgdGhlIFhNTCBlZGl0b3IgcHJldmVudHMgeW91IGZyb20gaW5zZXJ0aW5nIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLAotb3IgYXR0cmlidXRlIHZhbHVlcyBub3QgcGVybWl0dGVkIGJ5IHRoZSBydWxlcyBvZiB0aGUgWE1MIHNjaGVtYSBvciBEVEQsIGFuZAotZnJvbSByZW1vdmluZyBuZWNlc3Nhcnkgb3IgcHJlZGVmaW5lZCBzZXRzIG9mIHRhZ3MgYW5kIHZhbHVlcy4gSW4gdGhpcyBtb2RlLAotYW4gZWxlbWVudCdzIGNvbnRlbnQgbXVzdCBiZSB2YWxpZCB0byB1c2UgdGhlIFhNTCBlZGl0b3IncyBndWlkZWQgZWRpdGluZwotb3B0aW9ucy48L3A+Ci08cD5Zb3UgbWlnaHQgd2FudCB0byB0dXJuIHRoZSBjb25zdHJhaW50cyBvZmYgZm9yIGFuIFhNTCBmaWxlCi1pZiB5b3UgbmVlZCBtb3JlIGZsZXhpYmlsaXR5LiBGb3IgZXhhbXBsZSwgeW91IHdhbnQgdG8gdHJ5IHdvcmtpbmcgd2l0aCBlbGVtZW50cwotb3IgYXR0cmlidXRlcyBub3QgcGVybWl0dGVkIGJ5IHRoZSBhc3NvY2lhdGVkIERURCBvciBYTUwgc2NoZW1hLCB3aXRob3V0IGFjdHVhbGx5Ci1yZW1vdmluZyB0aGUgYXNzb2NpYXRpb24gd2l0aCB0aGUgRFREIG9yIFhNTCBzY2hlbWEuPC9wPgotPHA+VG8gdHVybiB0aGUgY29uc3RyYWludHMKLWZvciBhbiBYTUwgZmlsZSBvZmYsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlR1cm4KLUdyYW1tYXIgQ29uc3RyYWludHMgT2ZmPC9zcGFuPjwvc3Bhbj4gaW4gdGhlIHRvb2xiYXIuIEFmdGVyIHlvdQotaGF2ZSB0dXJuZWQgdGhlIGNvbnN0cmFpbnRzIG9mZiBmb3IgYSBmaWxlLCB5b3UgY2FuIGluc2VydCBvciBkZWxldGUgYW55IGVsZW1lbnQKLW9yIGF0dHJpYnV0ZSByZWdhcmRsZXNzIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBydWxlcy4gWW91IGNhbiBjcmVhdGUgbmV3Ci1lbGVtZW50cyBvciBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vdCBpbiB0aGUgRFREIG9yIHNjaGVtYSAtIHRoZXNlIERlc2lnbiB2aWV3Ci1wcm9tcHRzIHdpbGwgb25seSBhcHBlYXIgd2hlbiB5b3UgaGF2ZSB0dXJuZWQgY29uc3RyYWludHMgb2ZmLiBUaGUgZmlsZSBtaWdodAotbm90IGJlIHZhbGlkLCBob3dldmVyLCBpZiB5b3UgZG8gdGhpcy4gPC9wPgotPHA+VGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzCi13aGF0IHlvdSBjYW4gZG8gaWYgeW91IHR1cm4gdGhlIGNvbnN0cmFpbnRzIG9mIGEgRFREIG9mZjo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PcGVuIHRoZSBYTUwgZmlsZSBpbiB0aGUgWE1MIGVkaXRvciAocmlnaHQtY2xpY2sgdGhlIGZpbGUgaW4gdGhlCi1OYXZpZ2F0b3IgdmlldyBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3BlbiBXaXRoICZndDsgWE1MIEVkaXRvcjwvc3Bhbj4pLiA8L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPllvdSBoYXZlIGEgRFREIHRoYXQgc3BlY2lmaWVzIHRoYXQgYW4gZWxlbWVudCByZXF1aXJlcyBhdCBsZWFzdAotb25lIG9mIGEgc3BlY2lmaWMgY2hpbGQgZWxlbWVudDogIDwvc3Bhbj4gPHByZT4mbHQ7IUVMRU1FTlQgcGFyZW50RWxlbWVudCAoY2hpbGRFbGVtZW50KykmZ3Q7Ci08L3ByZT4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYsIGluIGFuIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCB5b3VyIERURCwgeW91IGF0dGVtcHQgdG8gcmVtb3ZlCi10aGUgZmluYWwgY2hpbGQgZWxlbWVudCBvZiB0aGUgZWxlbWVudCB3aXRoIHRoZSBEVEQgY29uc3RyYWludHMgdHVybmVkIG9uLAotdGhlIGVkaXRvciB3aWxsIG5vdCBhbGxvdyB5b3UgdG8gZG8gdGhpcywgYXMgaXQgd2lsbCBtYWtlIHRoZSBkb2N1bWVudCBpbnZhbGlkLjwvc3Bhbj4KLSBZb3UgY2FuIGNvbmZpcm0gdGhpcyBieSB1c2luZyB0aGUgZWxlbWVudCdzIHBvcC11cCBtZW51IHRvIHZlcmlmeSB0aGF0Ci10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVtb3ZlPC9zcGFuPiBvcHRpb24gaXMgZ3JheWVkIG91dC48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIHR1cm4gdGhlIERURCBjb25zdHJhaW50cyBvZmYsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCAmZ3Q7IFR1cm4gR3JhbW1hcgotQ29uc3RyYWludHMgT2ZmPC9zcGFuPi4gPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IGF0dGVtcHQgdG8gcmVtb3ZlIHRoZSBzYW1lIGNoaWxkIGVsZW1lbnQgd2l0aCBjb25zdHJhaW50cwotb2ZmLCB0aGUgZWRpdG9yIHdpbGwgYWxsb3cgeW91IHRvLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGNvcnJlY3QgdGhlIGludmFsaWQgZG9jdW1lbnQsIHlvdSB3aWxsIGhhdmUgdG8gcmUtYWRkIHRoZSBuZWNlc3NhcnkKLWVsZW1lbnQsIG9yIHJlbW92ZSB0aGUgaW52YWxpZCB0YWdnaW5nIG9yIHZhbHVlLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5JZiB5b3UgaW50cm9kdWNlIGVycm9ycyBpbnRvIHlvdXIgZmlsZXMsIHlvdSBtdXN0Ci1zYXZlIGFuZCB2YWxpZGF0ZSB0aGUgZmlsZSBpbiBvcmRlciB0byBzZWUgYSBsaXN0IG9mIHRoZSBlcnJvcnMgeW91IGhhdmUgaW50cm9kdWNlZC4KLVRoZXkgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuIEFmdGVyIHlvdSBmaXggdGhlIGVycm9ycywgeW91IG11c3QKLXNhdmUgYW5kIHZhbGlkYXRlIHlvdXIgZmlsZSBhZ2FpbiB0byBzZWUgaWYgdGhlIGZpbGUgaXMgbm93IHZhbGlkLjwvcD4KLTxwPlRoZXNlCi1pbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbwotd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiB0aXRsZT0iV2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMgYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS4iPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIHRpdGxlPSJUaGUgRE9DVFlQRSBkZWNsYXJhdGlvbiBpbiBhbiBYTUwgZmlsZSBpcyB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiBlZGl0IHlvdXIgRE9DVFlQRSBkZWNsYXJhdGlvbiB0byBjaGFuZ2UgdGhlIERURCBmaWxlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLiI+RWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgdGl0bGU9IlhNTCBDYXRhbG9nIGVudHJpZXMgYXJlIHVzZWQgdG8gbWFwIGV4dGVybmFsIGVudGl0eSByZWZlcmVuY2VzIHRvIGxvY2FsbHkgZGVmaW5lZCByZXNvdXJjZXMuIFlvdSBjYW4gcHJvdmlkZSBydWxlcyBzcGVjaWZ5IGhvdyB0aGVzZSBlbnRpdGllcyBhcmUgcmVzb2x2ZWQiPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIHRpdGxlPSJJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayBYTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC4iPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiB0aXRsZT0iWW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0IHdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS4iPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYzA1MzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRlZHRkb2MiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nDQotb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiBlZGl0IHlvdXIgRE9DVFlQRSBkZWNsYXJhdGlvbg0KLXRvIGNoYW5nZSB0aGUgRFREIGZpbGUgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+RE9DVFlQRSBkZWNsYXJhdGlvbnM8aW5kZXh0ZXJtPlhNTCBlZGl0b3I8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPkRPQ1RZUEUgZGVjbGFyYXRpb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gZWRpdCB5b3VyIERPQ1RZUEUNCi1kZWNsYXJhdGlvbiwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgcmlnaHQtY2xpY2sgPHVpY29udHJvbD5ET0NUWVBFPC91aWNvbnRyb2w+IGFuZA0KLWNsaWNrIDx1aWNvbnRyb2w+RWRpdCBET0NUWVBFPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSB2YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5Sb290IGVsZW1lbnQgbmFtZTwvdWljb250cm9sPiBmaWVsZA0KLXNob3VsZCBtYXRjaCB0aGUgcm9vdCBlbGVtZW50IG9mIHlvdXIgWE1MIGZpbGUgZXhhY3RseS48L2NtZD48aW5mbz5Zb3Ugc2hvdWxkDQotb25seSBlZGl0IHRoZSB2YWx1ZSBpbiB0aGlzIGZpZWxkIGlmIHlvdXIgcm9vdCBlbGVtZW50IGNoYW5nZXMuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPllvdSBjYW4gc2VsZWN0IGEgUHVibGljIElEIGZvciBhbnkgZXhpc3RpbmcgWE1MIENhdGFsb2cgZW50cmllcw0KLWJ5IGNsaWNraW5nIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+LiA8L2NtZD48aW5mbz5UaGUgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+UHVibGljDQotSUQ8L3VpY29udHJvbD4gZmllbGQgaXMgdGhlIFB1YmxpYyBJZGVudGlmaWVyLiBJdCBpcyB1c2VkIHRvIGFzc29jaWF0ZSB0aGUNCi1YTUwgZmlsZSAodXNpbmcgYW4gWE1MIENhdGFsb2cgZW50cnkpIHdpdGggYSBEVEQgZmlsZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sDQotc2VlIDx4cmVmIGZvcm1hdD0iZGl0YSIgaHJlZj0idHhtbGNhdC5kaXRhIiBzY29wZT0ibG9jYWwiPkFkZGluZyBlbnRyaWVzIHRvDQotdGhlIFhNTCBDYXRhbG9nPC94cmVmPi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIHZhbHVlIGluIHRoZSA8dWljb250cm9sPlN5c3RlbSBJRDwvdWljb250cm9sPiBmaWVsZCBpcyB0aGUNCi1EVEQgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4gVHlwZSB0aGUgcGF0aCBvZiB0aGUgRFREIGZpbGUgKG9yIGJyb3dzZQ0KLWZvciBpdCkgeW91IHdhbnQgdGhlIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCBpbiB0aGlzIGZpZWxkLiA8L2NtZD48aW5mbz4gPG5vdGU+V2hlbg0KLXRoZSBYTUwgZmlsZSBpcyBwcm9jZXNzZWQgYnkgdGhlIFhNTCBwcm9jZXNzb3IsIGl0IHdpbGwgZmlyc3QgdHJ5IHRvIHVzZSB0aGUNCi1QdWJsaWMgSUQgdG8gbG9jYXRlIHRoZSBEVEQsIGFuZCBpZiB0aGlzIGZhaWxzLCBpdCB3aWxsIHVzZSB0aGUgU3lzdGVtIElEDQotdG8gZmluZCBpdC48L25vdGU+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrICA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPklmIHlvdSBkbyBub3QgaGF2ZSBhIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4geW91ciBYTUwgZmlsZSwgeW91IGNhbg0KLXJpZ2h0LWNsaWNrIGluIHRoZSBEZXNpZ24gdmlldyBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgRFREIEluZm9ybWF0aW9uPC91aWNvbnRyb2w+IHRvDQotYWRkIG9uZS48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRkb2MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk0OTI5Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRkb2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4iIC8+Ci08bWV0YSBjb250ZW50PSJET0NUWVBFIGRlY2xhcmF0aW9ucywgWE1MIGVkaXRvciIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zLCBYTUwgZWRpdG9yIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0ZWR0ZG9jIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9uczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVkdGRvYyI+PGEgbmFtZT0idGVkdGRvYyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9uczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nCi1vZiBpdCB0byBhc3NvY2lhdGUgaXQgd2l0aCBhIERURCBmaWxlLiBZb3UgY2FuIGVkaXQgeW91ciBET0NUWVBFIGRlY2xhcmF0aW9uCi10byBjaGFuZ2UgdGhlIERURCBmaWxlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBlZGl0IHlvdXIgRE9DVFlQRQotZGVjbGFyYXRpb24sIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLCByaWdodC1jbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5ET0NUWVBFPC9zcGFuPiBhbmQKLWNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQgRE9DVFlQRTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VGhlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Sb290IGVsZW1lbnQgbmFtZTwvc3Bhbj4gZmllbGQKLXNob3VsZCBtYXRjaCB0aGUgcm9vdCBlbGVtZW50IG9mIHlvdXIgWE1MIGZpbGUgZXhhY3RseS48L3NwYW4+IFlvdSBzaG91bGQKLW9ubHkgZWRpdCB0aGUgdmFsdWUgaW4gdGhpcyBmaWVsZCBpZiB5b3VyIHJvb3QgZWxlbWVudCBjaGFuZ2VzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBzZWxlY3QgYSBQdWJsaWMgSUQgZm9yIGFueSBleGlzdGluZyBYTUwgQ2F0YWxvZyBlbnRyaWVzCi1ieSBjbGlja2luZyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+LiA8L3NwYW4+IFRoZSB2YWx1ZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHVibGljCi1JRDwvc3Bhbj4gZmllbGQgaXMgdGhlIFB1YmxpYyBJZGVudGlmaWVyLiBJdCBpcyB1c2VkIHRvIGFzc29jaWF0ZSB0aGUKLVhNTCBmaWxlICh1c2luZyBhbiBYTUwgQ2F0YWxvZyBlbnRyeSkgd2l0aCBhIERURCBmaWxlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwKLXNlZSA8YSBocmVmPSJ0eG1sY2F0Lmh0bWwiPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvYT4uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgdmFsdWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN5c3RlbSBJRDwvc3Bhbj4gZmllbGQgaXMgdGhlCi1EVEQgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4gVHlwZSB0aGUgcGF0aCBvZiB0aGUgRFREIGZpbGUgKG9yIGJyb3dzZQotZm9yIGl0KSB5b3Ugd2FudCB0aGUgWE1MIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGluIHRoaXMgZmllbGQuIDwvc3Bhbj4gIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBXaGVuCi10aGUgWE1MIGZpbGUgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBYTUwgcHJvY2Vzc29yLCBpdCB3aWxsIGZpcnN0IHRyeSB0byB1c2UgdGhlCi1QdWJsaWMgSUQgdG8gbG9jYXRlIHRoZSBEVEQsIGFuZCBpZiB0aGlzIGZhaWxzLCBpdCB3aWxsIHVzZSB0aGUgU3lzdGVtIElECi10byBmaW5kIGl0LjwvZGl2PgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5JZiB5b3UgZG8gbm90IGhhdmUgYSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIHlvdXIgWE1MIGZpbGUsIHlvdSBjYW4KLXJpZ2h0LWNsaWNrIGluIHRoZSBEZXNpZ24gdmlldyBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIERURCBJbmZvcm1hdGlvbjwvc3Bhbj4gdG8KLWFkZCBvbmUuPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgdGl0bGU9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgdGl0bGU9IkluIHRoZSBEZXNpZ24gdmlldywgd2hlbiB5b3UgZWRpdCBhbiBYTUwgZmlsZSB0aGF0IGhhcyBhIHNldCBvZiBjb25zdHJhaW50cyBvciBydWxlcyBkZWZpbmVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gdHVybiB0aGUgY29uc3RyYWludHMgb24gYW5kIG9mZiB0byBwcm92aWRlIGZsZXhpYmlsaXR5IGluIHRoZSB3YXkgeW91IGVkaXQsIGJ1dCBzdGlsbCBtYWludGFpbiB0aGUgdmFsaWRpdHkgb2YgdGhlIGRvY3VtZW50IHBlcmlvZGljYWxseS4iPkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgdGl0bGU9IlhNTCBDYXRhbG9nIGVudHJpZXMgYXJlIHVzZWQgdG8gbWFwIGV4dGVybmFsIGVudGl0eSByZWZlcmVuY2VzIHRvIGxvY2FsbHkgZGVmaW5lZCByZXNvdXJjZXMuIFlvdSBjYW4gcHJvdmlkZSBydWxlcyBzcGVjaWZ5IGhvdyB0aGVzZSBlbnRpdGllcyBhcmUgcmVzb2x2ZWQiPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIHRpdGxlPSJJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayBYTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC4iPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIHdpdGggTm9kZSBhbmQgQ29udGVudCBjb2x1bW5zIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGVuYy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZW5jLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYmVlMWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZW5jLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGVkdGVuYyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U3BlY2lmeWluZyBYTUwgZGVmYXVsdCBlbmNvZGluZyBsaW5lIGRlbGltaXRlcnM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlNwZWNpZnlpbmcgbGluZSBkZWxpbWl0ZXJzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoaXMgcGFnZSBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBsaW5lIGRlbGltaXRlciBhbmQgdGhlIHRleHQgZW5jb2RpbmcNCi10aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBjcmVhdGUgb3Igc2F2ZSBhbiBYTUwgcmVsYXRlZCBmaWxlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+c3BlY2lmeWluZyBsaW5lIGRlbGltaXRlcnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPmxpbmUgZGVsaW1pdGVyczxpbmRleHRlcm0+WE1MIGZpbGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08a2V5d29yZHM+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UbyBzcGVjaWZ5IHRoZSBsaW5lIGRlbGltaXRlciB5b3Ugd2FudCB0byB1c2UsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcNCi1zdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPlhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MDQotRmlsZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Gcm9tIHRoZSA8dWljb250cm9sPkVuY29kaW5nPC91aWNvbnRyb2w+IGZpZWxkLCBzcGVjaWZ5IHRoZSBkZWZhdWx0DQotY2hhcmFjdGVyIGVuY29kaW5nIHNldCB0aGF0IGlzIHVzZWQgd2hlbiBjcmVhdGluZyBYTUwgcmVsYXRlZCBmaWxlcyAoRFREcywNCi1YTUwgZmlsZXMsIFhNTCBzY2hlbWFzKS4gQ2hhbmdpbmcgdGhlIGVuY29kaW5nIGNhdXNlcyBhbnkgbmV3LCBYTUwgcmVsYXRlZA0KLWZpbGVzIHRoYXQgYXJlIGNyZWF0ZWQgZnJvbSBzY3JhdGNoIHRvIHVzZSB0aGUgc2VsZWN0ZWQgZW5jb2RpbmcuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPkdlbmVyYWw8L3VpY29udHJvbD48dWljb250cm9sPldvcmtzcGFjZTwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGluIHRoZSBsZWZ0IHBhbmUgb2YgdGhlIFByZWZlcmVuY2VzIHdpbmRvdyBhbmQgY2hvc2UgZWl0aGVyIDx1aWNvbnRyb2w+RGVmYXVsdDwvdWljb250cm9sPiBvciA8dWljb250cm9sPk90aGVyPC91aWNvbnRyb2w+IGluDQotdGhlIDx1aWNvbnRyb2w+TmV3IHRleHQgZmlsZSBsaW5lIGRlbGltaXRlciA8L3VpY29udHJvbD5zZWN0aW9uLiBTZWxlY3QgdGhlDQotb3BlcmF0aW5nIHN5c3RlbSB0aGF0IGFwcGxpZXMgdG8geW91ciBkZXZlbG9wbWVudCBvciBkZXBsb3ltZW50IHBsYXRmb3JtIGZyb20NCi10aGUgPHVpY29udHJvbD5PdGhlcjwvdWljb250cm9sPiBkcm9wIGRvd24gbGlzdC48L2NtZD48L3N0ZXA+PD9QdWIgQ2FyZXQ/Pg0KLTxzdGVwPjxjbWQ+Q2xpY2sgIDx1aWNvbnRyb2w+QXBwbHk8L3VpY29udHJvbD4sIHRoZW4gPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyMDAyPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRlbmMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGVuYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDMwNzgyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGVuYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU3BlY2lmeWluZyBYTUwgZGVmYXVsdCBlbmNvZGluZyBsaW5lIGRlbGltaXRlcnMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBwYWdlIGxldHMgeW91IHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIGFuZCB0aGUgdGV4dCBlbmNvZGluZyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBjcmVhdGUgb3Igc2F2ZSBhbiBYTUwgcmVsYXRlZCBmaWxlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgbGluZSBkZWxpbWl0ZXIgYW5kIHRoZSB0ZXh0IGVuY29kaW5nIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4geW91IGNyZWF0ZSBvciBzYXZlIGFuIFhNTCByZWxhdGVkIGZpbGUuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCBzcGVjaWZ5aW5nIGxpbmUgZGVsaW1pdGVycywgbGluZSBkZWxpbWl0ZXJzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCBzcGVjaWZ5aW5nIGxpbmUgZGVsaW1pdGVycywgbGluZSBkZWxpbWl0ZXJzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0ZWR0ZW5jIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U3BlY2lmeWluZyBsaW5lIGRlbGltaXRlcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRlZHRlbmMiPjxhIG5hbWU9InRlZHRlbmMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNwZWNpZnlpbmcgWE1MIGRlZmF1bHQgZW5jb2RpbmcgbGluZSBkZWxpbWl0ZXJzPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgbGluZSBkZWxpbWl0ZXIgYW5kIHRoZSB0ZXh0IGVuY29kaW5nCi10aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBjcmVhdGUgb3Igc2F2ZSBhbiBYTUwgcmVsYXRlZCBmaWxlLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gc3BlY2lmeSB0aGUgbGluZSBkZWxpbWl0ZXIgeW91IHdhbnQgdG8gdXNlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nCi1zdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotRmlsZXM8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVuY29kaW5nPC9zcGFuPiBmaWVsZCwgc3BlY2lmeSB0aGUgZGVmYXVsdAotY2hhcmFjdGVyIGVuY29kaW5nIHNldCB0aGF0IGlzIHVzZWQgd2hlbiBjcmVhdGluZyBYTUwgcmVsYXRlZCBmaWxlcyAoRFREcywKLVhNTCBmaWxlcywgWE1MIHNjaGVtYXMpLiBDaGFuZ2luZyB0aGUgZW5jb2RpbmcgY2F1c2VzIGFueSBuZXcsIFhNTCByZWxhdGVkCi1maWxlcyB0aGF0IGFyZSBjcmVhdGVkIGZyb20gc2NyYXRjaCB0byB1c2UgdGhlIHNlbGVjdGVkIGVuY29kaW5nLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3Jrc3BhY2U8L3NwYW4+Ci08L3NwYW4+IGluIHRoZSBsZWZ0IHBhbmUgb2YgdGhlIFByZWZlcmVuY2VzIHdpbmRvdyBhbmQgY2hvc2UgZWl0aGVyIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlZmF1bHQ8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk90aGVyPC9zcGFuPiBpbgotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldyB0ZXh0IGZpbGUgbGluZSBkZWxpbWl0ZXIgPC9zcGFuPnNlY3Rpb24uIFNlbGVjdCB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gdGhhdCBhcHBsaWVzIHRvIHlvdXIgZGV2ZWxvcG1lbnQgb3IgZGVwbG95bWVudCBwbGF0Zm9ybSBmcm9tCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3RoZXI8L3NwYW4+IGRyb3AgZG93biBsaXN0Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGx5PC9zcGFuPiwgdGhlbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgLz4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGdyYW0uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGdyYW0uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4ODE1Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRncmFtLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRlZHRncmFtIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5VcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+VXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+SWYgeW91IG1ha2UgY2hhbmdlcyB0byBhIERURCBmaWxlIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoDQotYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayA8dWljb250cm9sPlhNTCA+IFJlbG9hZCBEZXBlbmRlbmNpZXM8L3VpY29udHJvbD4gdG8NCi11cGRhdGUgdGhlIFhNTCBmaWxlIHdpdGggdGhlc2UgY2hhbmdlcy4gVGhlIGNoYW5nZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlDQotZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT51cGRhdGluZyBYTUwgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+dXBkYXRpbmcgd2l0aCBhc3NvY2lhdGVkIGNoYW5nZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPkZvciBleGFtcGxlLCB5b3UgaGF2ZSBhIERURCBmaWxlIGNhbGxlZCAiQ29udGFjdC5kdGQiIGFuZCBhbiBYTUwNCi1maWxlIGNhbGxlZCAiQ29udGFjdC54bWwiIGFzc29jaWF0ZWQgd2l0aCBpdC4gQ29udGFjdC5kdGQgY29udGFpbnMgYSByb290DQotZWxlbWVudCBjYWxsZWQgPHVzZXJpbnB1dD5Db250YWN0PC91c2VyaW5wdXQ+IHRoYXQgY2FuIGNvbnRhaW4gYW55IG9mIHRoZQ0KLWZvbGxvd2luZyBjaGlsZHJlbiBlbGVtZW50czogIDx1c2VyaW5wdXQ+TmFtZTwvdXNlcmlucHV0PiwgPHVzZXJpbnB1dD5Qb3N0YWxBZGRyZXNzPC91c2VyaW5wdXQ+LDw/UHViIENhcmV0Pz4gPHVzZXJpbnB1dD5FbWFpbDwvdXNlcmlucHV0Pi4NCi1JZiB5b3UgcmVtb3ZlIHRoZSBjaGlsZCBlbGVtZW50ICA8dXNlcmlucHV0PkVtYWlsPC91c2VyaW5wdXQ+IGZyb20gdGhlIERURCwNCi15b3Ugd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byBhZGQgYW4gIDx1c2VyaW5wdXQ+RW1haWw8L3VzZXJpbnB1dD4gY2hpbGQgZWxlbWVudA0KLXRvIHlvdXIgcm9vdCBlbGVtZW50IENvbnRhY3QgaW4geW91ciBDb250YWN0LnhtbCBmaWxlLiBUaGlzIGNoYW5nZSwgaG93ZXZlciwNCi13aWxsIG5vdCBjb21lIGludG8gZWZmZWN0IHVudGlsIHlvdSBzYXZlIHlvdXIgY2hhbmdlcyBpbiB0aGUgRFREIGFuZCBjbGljayA8dWljb250cm9sPlhNTA0KLT4gUmVsb2FkIERlcGVuZGVuY2llczwvdWljb250cm9sPiBpbiB0aGUgWE1MIGVkaXRvci4gVW50aWwgeW91IGNsaWNrIGl0LCB5b3UNCi13aWxsIHN0aWxsIGJlIGFibGUgdG8gYWRkIDx1c2VyaW5wdXQ+RW1haWw8L3VzZXJpbnB1dD4gZWxlbWVudHMgdG8gQ29udGFjdC54bWwuPC9wPjxwPlRoaXMNCi1mZWF0dXJlIGlzIHZlcnkgaGFuZHkgd2hlbiB5b3UgYXJlIG1ha2luZyB1cGRhdGVzIHRvIGJvdGggRFREcyBhbmQgWE1MIHNjaGVtYXMNCi1hbmQgWE1MIGZpbGVzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcy48L3A+PC9jb250ZXh0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAxOTg3Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRncmFtLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRncmFtLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NGExMTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Z3JhbS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSWYgeW91IG1ha2UgY2hhbmdlcyB0byBhIERURCBmaWxlIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBmaWxlICh0aGF0IGlzIGN1cnJlbnRseSBvcGVuKSwgY2xpY2sgWE1MICZndDsgUmVsb2FkIERlcGVuZGVuY2llcyB0byB1cGRhdGUgdGhlIFhNTCBmaWxlIHdpdGggdGhlc2UgY2hhbmdlcy4gVGhlIGNoYW5nZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIGd1aWRlZCBlZGl0aW5nIG1lY2hhbmlzbXMgYXZhaWxhYmxlIGluIHRoZSBlZGl0b3IsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IklmIHlvdSBtYWtlIGNoYW5nZXMgdG8gYSBEVEQgZmlsZSBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgZmlsZSAodGhhdCBpcyBjdXJyZW50bHkgb3BlbiksIGNsaWNrIFhNTCAmZ3Q7IFJlbG9hZCBEZXBlbmRlbmNpZXMgdG8gdXBkYXRlIHRoZSBYTUwgZmlsZSB3aXRoIHRoZXNlIGNoYW5nZXMuIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBndWlkZWQgZWRpdGluZyBtZWNoYW5pc21zIGF2YWlsYWJsZSBpbiB0aGUgZWRpdG9yLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHVwZGF0aW5nIFhNTCBmaWxlcywgWE1MIGZpbGVzLCB1cGRhdGluZyB3aXRoIGFzc29jaWF0ZWQgY2hhbmdlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHVwZGF0aW5nIFhNTCBmaWxlcywgWE1MIGZpbGVzLCB1cGRhdGluZyB3aXRoIGFzc29jaWF0ZWQgY2hhbmdlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGRvYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRzY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0ZWR0Z3JhbSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZWR0Z3JhbSI+PGEgbmFtZT0idGVkdGdyYW0iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9oMT4KLQotCi0KLQotPGRpdj48cD5JZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGgKLWFuIFhNTCBmaWxlICh0aGF0IGlzIGN1cnJlbnRseSBvcGVuKSwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MICZndDsgUmVsb2FkIERlcGVuZGVuY2llczwvc3Bhbj4gdG8KLXVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUKLWd1aWRlZCBlZGl0aW5nIG1lY2hhbmlzbXMgYXZhaWxhYmxlIGluIHRoZSBlZGl0b3IsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYSBEVEQgZmlsZSBjYWxsZWQgIkNvbnRhY3QuZHRkIiBhbmQgYW4gWE1MCi1maWxlIGNhbGxlZCAiQ29udGFjdC54bWwiIGFzc29jaWF0ZWQgd2l0aCBpdC4gQ29udGFjdC5kdGQgY29udGFpbnMgYSByb290Ci1lbGVtZW50IGNhbGxlZCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkNvbnRhY3Q8L2tiZD4gdGhhdCBjYW4gY29udGFpbiBhbnkgb2YgdGhlCi1mb2xsb3dpbmcgY2hpbGRyZW4gZWxlbWVudHM6ICA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPk5hbWU8L2tiZD4sIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+UG9zdGFsQWRkcmVzczwva2JkPiwgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5FbWFpbDwva2JkPi4KLUlmIHlvdSByZW1vdmUgdGhlIGNoaWxkIGVsZW1lbnQgIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+RW1haWw8L2tiZD4gZnJvbSB0aGUgRFRELAoteW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWRkIGFuICA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkVtYWlsPC9rYmQ+IGNoaWxkIGVsZW1lbnQKLXRvIHlvdXIgcm9vdCBlbGVtZW50IENvbnRhY3QgaW4geW91ciBDb250YWN0LnhtbCBmaWxlLiBUaGlzIGNoYW5nZSwgaG93ZXZlciwKLXdpbGwgbm90IGNvbWUgaW50byBlZmZlY3QgdW50aWwgeW91IHNhdmUgeW91ciBjaGFuZ2VzIGluIHRoZSBEVEQgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzPC9zcGFuPiBpbiB0aGUgWE1MIGVkaXRvci4gVW50aWwgeW91IGNsaWNrIGl0LCB5b3UKLXdpbGwgc3RpbGwgYmUgYWJsZSB0byBhZGQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5FbWFpbDwva2JkPiBlbGVtZW50cyB0byBDb250YWN0LnhtbC48L3A+Ci08cD5UaGlzCi1mZWF0dXJlIGlzIHZlcnkgaGFuZHkgd2hlbiB5b3UgYXJlIG1ha2luZyB1cGRhdGVzIHRvIGJvdGggRFREcyBhbmQgWE1MIHNjaGVtYXMKLWFuZCBYTUwgZmlsZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIHRpdGxlPSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIHRpdGxlPSJJbiB0aGUgRGVzaWduIHZpZXcsIHdoZW4geW91IGVkaXQgYW4gWE1MIGZpbGUgdGhhdCBoYXMgYSBzZXQgb2YgY29uc3RyYWludHMgb3IgcnVsZXMgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzIG9uIGFuZCBvZmYgdG8gcHJvdmlkZSBmbGV4aWJpbGl0eSBpbiB0aGUgd2F5IHlvdSBlZGl0LCBidXQgc3RpbGwgbWFpbnRhaW4gdGhlIHZhbGlkaXR5IG9mIHRoZSBkb2N1bWVudCBwZXJpb2RpY2FsbHkuIj5FZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIHRpdGxlPSJUaGUgRE9DVFlQRSBkZWNsYXJhdGlvbiBpbiBhbiBYTUwgZmlsZSBpcyB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiBlZGl0IHlvdXIgRE9DVFlQRSBkZWNsYXJhdGlvbiB0byBjaGFuZ2UgdGhlIERURCBmaWxlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLiI+RWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgdGl0bGU9IlhNTCBDYXRhbG9nIGVudHJpZXMgYXJlIHVzZWQgdG8gbWFwIGV4dGVybmFsIGVudGl0eSByZWZlcmVuY2VzIHRvIGxvY2FsbHkgZGVmaW5lZCByZXNvdXJjZXMuIFlvdSBjYW4gcHJvdmlkZSBydWxlcyBzcGVjaWZ5IGhvdyB0aGVzZSBlbnRpdGllcyBhcmUgcmVzb2x2ZWQiPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRzY2guaHRtbCIgdGl0bGU9IllvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdGhlIHNjaGVtYSBhbmQgbmFtZXNwYWNlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIG9yIGFkZCBhIG5ldyBhc3NvY2lhdGlvbi4gTW9kaWZ5aW5nIGFueSBhc3NvY2lhdGlvbnMgY2FuIGltcGFjdCB3aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuIj5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcm9jLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcm9jLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OTlkMTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJvYy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0ZWR0cHJvYyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPklmIHlvdSBoYXZlIGluc3RydWN0aW9ucyB5b3Ugd2FudCB0byBzZW5kIHRvIGFuIGFwcGxpY2F0aW9uIHVzaW5nDQotYW4gWE1MIGRvY3VtZW50LCB5b3UgY2FuIHVzZSBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIDwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UbyBjcmVhdGUgYSBuZXcgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiwgcmlnaHQtY2xpY2sgaW4gdGhlIERlc2lnbg0KLXZpZXcsIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBDaGlsZDwvdWljb250cm9sPiwgPHVpY29udHJvbD5BZGQgQmVmb3JlPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+QWRkDQotQWZ0ZXI8L3VpY29udHJvbD4sIHRoZW4gY2xpY2sgPHVpY29udHJvbD5BZGQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbjwvdWljb250cm9sPi48L3A+PHA+VG8NCi1lZGl0IGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBpbiB0aGUgWE1MIGVkaXRvciBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgeW91cg0KLXByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24sIGFuZCBjbGljayA8dWljb250cm9sPkVkaXQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbjwvdWljb250cm9sPi4NCi1Zb3UgY2FuIGNoYW5nZSB0aGUgdmFsdWVzIGluIHRoZSBmb2xsb3dpbmcgZmllbGRzOjwvcD48dWw+DQotPGxpPlRoZSA8dWljb250cm9sPlRhcmdldDwvdWljb250cm9sPiBmaWVsZCBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBhcHBsaWNhdGlvbg0KLXRoZSBpbnN0cnVjdGlvbnMgYmVsb25ncyB0by48L2xpPg0KLTxsaT5UaGUgPHVpY29udHJvbD5EYXRhPC91aWNvbnRyb2w+IGZpZWxkIGNvbnRhaW5zIHRoZSBpbnN0cnVjdGlvbnMuPC9saT4NCi08L3VsPjwvY29udGV4dD4NCi08cG9zdHJlcT5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvIHNhdmUgeW91ciBzZXR0aW5ncy48bm90ZT5UaGVzZTw/UHViIENhcmV0Pz4NCi1pbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbw0KLXdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9ub3RlPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMTY1MD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJvYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJvYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZThkYTZmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByb2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IklmIHlvdSBoYXZlIGluc3RydWN0aW9ucyB5b3Ugd2FudCB0byBzZW5kIHRvIGFuIGFwcGxpY2F0aW9uIHVzaW5nIGFuIFhNTCBkb2N1bWVudCwgeW91IGNhbiB1c2UgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiB5b3UgaGF2ZSBpbnN0cnVjdGlvbnMgeW91IHdhbnQgdG8gc2VuZCB0byBhbiBhcHBsaWNhdGlvbiB1c2luZyBhbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gdXNlIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgWE1MIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIFhNTCBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlZHRwcm9jIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRlZHRwcm9jIj48YSBuYW1lPSJ0ZWR0cHJvYyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L2gxPgotCi0KLQotCi08ZGl2PjxwPklmIHlvdSBoYXZlIGluc3RydWN0aW9ucyB5b3Ugd2FudCB0byBzZW5kIHRvIGFuIGFwcGxpY2F0aW9uIHVzaW5nCi1hbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gdXNlIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4gPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBjcmVhdGUgYSBuZXcgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiwgcmlnaHQtY2xpY2sgaW4gdGhlIERlc2lnbgotdmlldywgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBDaGlsZDwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBCZWZvcmU8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZAotQWZ0ZXI8L3NwYW4+LCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBQcm9jZXNzaW5nIEluc3RydWN0aW9uPC9zcGFuPi48L3A+Ci08cD5UbwotZWRpdCBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gaW4gdGhlIFhNTCBlZGl0b3IgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIHlvdXIKLXByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24sIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0IFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb248L3NwYW4+LgotWW91IGNhbiBjaGFuZ2UgdGhlIHZhbHVlcyBpbiB0aGUgZm9sbG93aW5nIGZpZWxkczo8L3A+Ci08dWw+Ci08bGk+VGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRhcmdldDwvc3Bhbj4gZmllbGQgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgYXBwbGljYXRpb24KLXRoZSBpbnN0cnVjdGlvbnMgYmVsb25ncyB0by48L2xpPgotCi08bGk+VGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRhdGE8L3NwYW4+IGZpZWxkIGNvbnRhaW5zIHRoZSBpbnN0cnVjdGlvbnMuPC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gdG8gc2F2ZSB5b3VyIHNldHRpbmdzLjxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUaGVzZQotaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28KLXdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9kaXY+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIHdpdGggTm9kZSBhbmQgQ29udGVudCBjb2x1bW5zIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NoLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYzcwYzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NoLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwOCwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgU3R5IF9kaXNwbGF5IEZvbnRDb2xvcj0icmVkIj8+DQotPHRhc2sgaWQ9InRlZHRzY2giIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3VyIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHByb3ZpZGUgdmFyaW91cyBpbmZvcm1hdGlvbg0KLWFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQNCi13aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwNCi1maWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBvciBhZGQgYSBuZXcgYXNzb2NpYXRpb24uIE1vZGlmeWluZyBhbnkgYXNzb2NpYXRpb25zDQotY2FuIGltcGFjdCB3aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+bmFtZXNwYWNlIGluZm9ybWF0aW9uPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPm5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UNCi1wZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvDQotZWRpdCB5b3VyIHNjaGVtYSBpbmZvcm1hdGlvbiwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgcmlnaHQtY2xpY2sgeW91cg0KLXJvb3QgZWxlbWVudCBhbmQgY2xpY2sgPHVpY29udHJvbD5FZGl0IE5hbWVzcGFjZXM8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+WW91ciBYTUwgZmlsZSBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIG1vcmUgdGhhbiBvbmUgbmFtZXNwYWNlDQotb3Igc2NoZW1hLjwvY21kPjxpbmZvPlNlbGVjdCB0aGUgZW50cnkgeW91IHdhbnQgdG8gZWRpdCBhbmQgY2xpY2sgPHVpY29udHJvbD5FZGl0PC91aWNvbnRyb2w+LjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+TmFtZXNwYWNlIE5hbWU8L3VpY29udHJvbD4gZmllbGQNCi1pcyBhIG5hbWVzcGFjZSB0aGUgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLjwvY21kPjxpbmZvPllvdXIgWE1MDQotZmlsZSBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1lIG5hbWVzcGFjZShzKSBpdHMgWE1MIHNjaGVtYQ0KLWlzIGFzc29jaWF0ZWQgd2l0aC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbmFtZXNwYWNlcywgcmVmZXIgdG8NCi10aGUgcmVsYXRlZCByZWZlcmVuY2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPHhyZWYNCi1ocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuZGl0YSINCi1zY29wZT0icGVlciI+WE1MIG5hbWVzcGFjZXM8L3hyZWY+LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5BbGwgcXVhbGlmaWVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHRoZSBYTTw/UHViIENhcmV0Pz5MDQotZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhlIDx1aWNvbnRyb2w+UHJlZml4PC91aWNvbnRyb2w+IHZhbHVlLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSA8dWljb250cm9sPkxvY2F0aW9uIEhpbnQ8L3VpY29udHJvbD4gZmllbGQgY29udGFpbnMNCi10aGUgbG9jYXRpb24gb2YgdGhlIFhNTCBzY2hlbWEgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC48L2NtZD4NCi08aW5mbz5BbiBYTUwgQ2F0YWxvZyBLZXkgb3IgYSBuYW1lc3BhY2UgbmFtZSBjYW4gYmUgc3BlY2lmaWVkIGluIHRoaXMNCi1maWVsZC4gQ2xpY2sgPHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD4gdG8gdmlldyBhbGwgWE1MIHNjaGVtYXMNCi1pbiB0aGUgd29ya2JlbmNoIGFuZCBYTUwgQ2F0YWxvZy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiwgdGhlbiBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IGFnYWluLjwvY21kPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+SWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGFzc29jaWF0aW9uLCBjbGljayA8dWljb250cm9sPkFkZDwvdWljb250cm9sPiBpbnN0ZWFkDQotb2YgPHVpY29udHJvbD5FZGl0PC91aWNvbnRyb2w+LiBZb3UgY2FuIHRoZW4gZWl0aGVyIHNlbGVjdCB0aGUgPHVpY29udHJvbD5TcGVjaWZ5DQotRnJvbSBSZWdpc3RlcmVkIE5hbWVzcGFjZTwvdWljb250cm9sPiByYWRpbyBidXR0b24gYW5kIHNlbGVjdCB0aGUNCi1uYW1lc3BhY2UgZGVjbGFyYXRpb25zIHlvdSB3YW50IHRvIGFkZCBvciBzZWxlY3QgdGhlIDx1aWNvbnRyb2w+U3BlY2lmeQ0KLU5ldyBOYW1lc3BhY2U8L3VpY29udHJvbD4gcmFkaW8gYnV0dG9uIGFuZCBmaWxsIGluIHRoZSBmaWVsZHMgYXMgbmVjZXNzYXJ5LjwvcD48L3Jlc3VsdD4NCi08cG9zdHJlcT5JZiB5b3UgZG8gbm90IGhhdmUgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGluIHlvdXIgWE1MIGZpbGUsDQoteW91IGNhbiByaWdodC1jbGljayB5b3VyIHJvb3QgZWxlbWVudCBpbiB0aGUgRGVzaWduIHZpZXcgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RWRpdA0KLU5hbWVzcGFjZXM8L3VpY29udHJvbD4gdG8gYWRkIGl0LiBJZiB5b3UgZG8gbm90IGhhdmUgYSByb290IGVsZW1lbnQsDQoteW91IG11c3QgY3JlYXRlIG9uZSBiZWZvcmUgeW91IGNhbiBhZGQgdGhlIG5hbWVzcGFjZSBpbmZvcm1hdGlvbi48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDMyODg/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NoLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZDg3NDMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0IHdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0IHdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBuYW1lc3BhY2UgaW5mb3JtYXRpb24sIFhNTCBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiwgWE1MIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi8uLi9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGVkdHNjaCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZWR0c2NoIj48YSBuYW1lPSJ0ZWR0c2NoIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24KLWFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQKLXdpdGguIElmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHRoZSBzY2hlbWEgYW5kIG5hbWVzcGFjZSB5b3VyIFhNTAotZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucwotY2FuIGltcGFjdCB3aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZQotcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvCi1lZGl0IHlvdXIgc2NoZW1hIGluZm9ybWF0aW9uLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgcmlnaHQtY2xpY2sgeW91cgotcm9vdCBlbGVtZW50IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0IE5hbWVzcGFjZXM8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91ciBYTUwgZmlsZSBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIG1vcmUgdGhhbiBvbmUgbmFtZXNwYWNlCi1vciBzY2hlbWEuPC9zcGFuPiBTZWxlY3QgdGhlIGVudHJ5IHlvdSB3YW50IHRvIGVkaXQgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQ8L3NwYW4+LgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgdmFsdWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWVzcGFjZSBOYW1lPC9zcGFuPiBmaWVsZAotaXMgYSBuYW1lc3BhY2UgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC48L3NwYW4+IFlvdXIgWE1MCi1maWxlIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUgbmFtZXNwYWNlKHMpIGl0cyBYTUwgc2NoZW1hCi1pcyBhc3NvY2lhdGVkIHdpdGguIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG5hbWVzcGFjZXMsIHJlZmVyIHRvCi10aGUgcmVsYXRlZCByZWZlcmVuY2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmh0bWwiPlhNTCBuYW1lc3BhY2VzPC9hPi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkFsbCBxdWFsaWZpZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4gdGhlIFhNTAotZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZpeDwvc3Bhbj4gdmFsdWUuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TG9jYXRpb24gSGludDwvc3Bhbj4gZmllbGQgY29udGFpbnMKLXRoZSBsb2NhdGlvbiBvZiB0aGUgWE1MIHNjaGVtYSB0aGUgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLjwvc3Bhbj4KLSBBbiBYTUwgQ2F0YWxvZyBLZXkgb3IgYSBuYW1lc3BhY2UgbmFtZSBjYW4gYmUgc3BlY2lmaWVkIGluIHRoaXMKLWZpZWxkLiBDbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IHRvIHZpZXcgYWxsIFhNTCBzY2hlbWFzCi1pbiB0aGUgd29ya2JlbmNoIGFuZCBYTUwgQ2F0YWxvZy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiwgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gYWdhaW4uPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+SWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGFzc29jaWF0aW9uLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQ8L3NwYW4+IGluc3RlYWQKLW9mIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQ8L3NwYW4+LiBZb3UgY2FuIHRoZW4gZWl0aGVyIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3BlY2lmeQotRnJvbSBSZWdpc3RlcmVkIE5hbWVzcGFjZTwvc3Bhbj4gcmFkaW8gYnV0dG9uIGFuZCBzZWxlY3QgdGhlCi1uYW1lc3BhY2UgZGVjbGFyYXRpb25zIHlvdSB3YW50IHRvIGFkZCBvciBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNwZWNpZnkKLU5ldyBOYW1lc3BhY2U8L3NwYW4+IHJhZGlvIGJ1dHRvbiBhbmQgZmlsbCBpbiB0aGUgZmllbGRzIGFzIG5lY2Vzc2FyeS48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+SWYgeW91IGRvIG5vdCBoYXZlIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpbiB5b3VyIFhNTCBmaWxlLAoteW91IGNhbiByaWdodC1jbGljayB5b3VyIHJvb3QgZWxlbWVudCBpbiB0aGUgRGVzaWduIHZpZXcgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQKLU5hbWVzcGFjZXM8L3NwYW4+IHRvIGFkZCBpdC4gSWYgeW91IGRvIG5vdCBoYXZlIGEgcm9vdCBlbGVtZW50LAoteW91IG11c3QgY3JlYXRlIG9uZSBiZWZvcmUgeW91IGNhbiBhZGQgdGhlIG5hbWVzcGFjZSBpbmZvcm1hdGlvbi48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiB0aXRsZT0iV2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMgYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS4iPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiB0aXRsZT0iSW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9yIHJ1bGVzIGRlZmluZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiB0dXJuIHRoZSBjb25zdHJhaW50cyBvbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluIHRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5LiI+RWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiB0aXRsZT0iWE1MIENhdGFsb2cgZW50cmllcyBhcmUgdXNlZCB0byBtYXAgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZXMgdG8gbG9jYWxseSBkZWZpbmVkIHJlc291cmNlcy4gWW91IGNhbiBwcm92aWRlIHJ1bGVzIHNwZWNpZnkgaG93IHRoZXNlIGVudGl0aWVzIGFyZSByZXNvbHZlZCI+QWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgdGl0bGU9IklmIHlvdSBtYWtlIGNoYW5nZXMgdG8gYSBEVEQgZmlsZSBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgZmlsZSAodGhhdCBpcyBjdXJyZW50bHkgb3BlbiksIGNsaWNrIFhNTCAmZ3Q7IFJlbG9hZCBEZXBlbmRlbmNpZXMgdG8gdXBkYXRlIHRoZSBYTUwgZmlsZSB3aXRoIHRoZXNlIGNoYW5nZXMuIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBndWlkZWQgZWRpdGluZyBtZWNoYW5pc21zIGF2YWlsYWJsZSBpbiB0aGUgZWRpdG9yLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LiI+VXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiB0aXRsZT0iVGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgd2l0aCBOb2RlIGFuZCBDb250ZW50IGNvbHVtbnMgYW5kIGEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBDb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLCB3aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoYXQgcGFydGljdWxhciBlbGVtZW50LiI+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGluZm8iPjxzdHJvbmc+UmVsYXRlZCBpbmZvcm1hdGlvbjwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuaHRtbCI+WE1MIG5hbWVzcGFjZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90c3Vnc3RyYXQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHN1Z3N0cmF0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYjhmMjguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90c3Vnc3RyYXQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0ieG1sc291cmNlc3VnZ2VzdGlvbnN0cmF0ZWd5IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TZXR0aW5nIHRoZSBYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdDwvdGl0bGU+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIGN1c3RvbWl6ZSB0aGUgZm9ybWF0dGluZyBvZiB0aGUgc3VnZ2VzdGlvbnMgZ2l2ZW4gYnkgY29udGVudA0KLWFzc2lzdCBieSBjaG9vc2luZyBhIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgcHJlZmVyZW5jZS4gV2hlbiB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneQ0KLWlzIHNldCB0byBTdHJpY3QsIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBkaXNwbGF5ZWQNCi1maXJzdCBpbiB0aGUgbGlzdCBvZiBvcHRpb25zIGFuZCBoaWdobGlnaHRlZCBieSBib2xkIGljb25zLiBPdGhlciBzdWdnZXN0aW9ucw0KLXRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhpcyBlbGVtZW50J3Mgc2NvcGUgYnV0IGFyZSBub3QgZ3JhbW1hdGljYWxseSB2YWxpZA0KLXdpbGwgYmUgZGlzcGxheWVkIGxvd2VyIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4gV2hlbiB0aGUgc3VnZ2VzdGlvbg0KLXN0cmF0ZWd5IGlzIHNldCB0byBMYXgsIGFsbCBzdWdnZXN0aW9ucyB3aWxsIGRpc3BsYXllZCBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQNCi1pY29ucy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5zb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneTwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+VG8gc2V0IHRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3QsIGNvbXBsZXRlIHRoZQ0KLWZvbGxvd2luZyBzdGVwczo8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+WE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwNCi1GaWxlczwvdWljb250cm9sPjx1aWNvbnRyb2w+RWRpdG9yPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5CZXNpZGUgPHVpY29udHJvbD5TdWdnZXN0aW9uIHN0cmF0ZWd5PC91aWNvbnRyb2w+IGluIHRoZSBDb250ZW50DQotYXNzaXN0IHNlY3Rpb24sIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgc2V0dGluZyAoU3RyaWN0IG9yIExheCkuPC9jbWQ+PC9zdGVwPjw/UHViIENhcmV0Pz4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+QXBwbHk8L3VpY29udHJvbD4sIHRoZW4gPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0bw0KLXNhdmUgeW91ciBzZXR0aW5nczwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxleGFtcGxlPjxwPlRoZSBmb2xsb3dpbmcgc2NyZWVuIGNhcHR1cmUgZGVtb25zdHJhdGVzIGNvbnRlbnQgYXNzaXN0IHdpdGgNCi10aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSBzZXQgdG8gIlN0cmljdCI6PC9wPjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvc3VnZ2VzdGlvbi5naWYiDQotcGxhY2VtZW50PSJicmVhayI+PGFsdD5FeGFtcGxlIG9mIFN0cmljdCBTdWdnZXN0aW9uIFN0cmF0ZWd5PC9hbHQ+PC9pbWFnZT48L2V4YW1wbGU+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDE5NTA/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHN1Z3N0cmF0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RzdWdzdHJhdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjE2MjRkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHN1Z3N0cmF0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZXR0aW5nIHRoZSBYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdCIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIGN1c3RvbWl6ZSB0aGUgZm9ybWF0dGluZyBvZiB0aGUgc3VnZ2VzdGlvbnMgZ2l2ZW4gYnkgY29udGVudCBhc3Npc3QgYnkgY2hvb3NpbmcgYSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHByZWZlcmVuY2UuIFdoZW4gdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaXMgc2V0IHRvIFN0cmljdCwgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIGRpc3BsYXllZCBmaXJzdCBpbiB0aGUgbGlzdCBvZiBvcHRpb25zIGFuZCBoaWdobGlnaHRlZCBieSBib2xkIGljb25zLiBPdGhlciBzdWdnZXN0aW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoaXMgZWxlbWVudCdzIHNjb3BlIGJ1dCBhcmUgbm90IGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBkaXNwbGF5ZWQgbG93ZXIgaW4gdGhlIGxpc3Qgd2l0aCBkZS1lbXBoYXNpemVkIGljb25zLiBXaGVuIHRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IGlzIHNldCB0byBMYXgsIGFsbCBzdWdnZXN0aW9ucyB3aWxsIGRpc3BsYXllZCBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQgaWNvbnMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gY3VzdG9taXplIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBzdWdnZXN0aW9ucyBnaXZlbiBieSBjb250ZW50IGFzc2lzdCBieSBjaG9vc2luZyBhIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgcHJlZmVyZW5jZS4gV2hlbiB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSBpcyBzZXQgdG8gU3RyaWN0LCBzdWdnZXN0aW9ucyB0aGF0IGFyZSBncmFtbWF0aWNhbGx5IHZhbGlkIHdpbGwgYmUgZGlzcGxheWVkIGZpcnN0IGluIHRoZSBsaXN0IG9mIG9wdGlvbnMgYW5kIGhpZ2hsaWdodGVkIGJ5IGJvbGQgaWNvbnMuIE90aGVyIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhpcyBlbGVtZW50J3Mgc2NvcGUgYnV0IGFyZSBub3QgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIGRpc3BsYXllZCBsb3dlciBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQgaWNvbnMuIFdoZW4gdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaXMgc2V0IHRvIExheCwgYWxsIHN1Z2dlc3Rpb25zIHdpbGwgZGlzcGxheWVkIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3Y2Rhc3QuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ4bWxzb3VyY2VzdWdnZXN0aW9uc3RyYXRlZ3kiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TZXR0aW5nIHRoZSBYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ieG1sc291cmNlc3VnZ2VzdGlvbnN0cmF0ZWd5Ij48YSBuYW1lPSJ4bWxzb3VyY2VzdWdnZXN0aW9uc3RyYXRlZ3kiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0PC9oMT4KLQotCi0KLTxkaXY+PHA+WW91IGNhbiBjdXN0b21pemUgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIHN1Z2dlc3Rpb25zIGdpdmVuIGJ5IGNvbnRlbnQKLWFzc2lzdCBieSBjaG9vc2luZyBhIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgcHJlZmVyZW5jZS4gV2hlbiB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneQotaXMgc2V0IHRvIFN0cmljdCwgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIGRpc3BsYXllZAotZmlyc3QgaW4gdGhlIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgaGlnaGxpZ2h0ZWQgYnkgYm9sZCBpY29ucy4gT3RoZXIgc3VnZ2VzdGlvbnMKLXRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhpcyBlbGVtZW50J3Mgc2NvcGUgYnV0IGFyZSBub3QgZ3JhbW1hdGljYWxseSB2YWxpZAotd2lsbCBiZSBkaXNwbGF5ZWQgbG93ZXIgaW4gdGhlIGxpc3Qgd2l0aCBkZS1lbXBoYXNpemVkIGljb25zLiBXaGVuIHRoZSBzdWdnZXN0aW9uCi1zdHJhdGVneSBpcyBzZXQgdG8gTGF4LCBhbGwgc3VnZ2VzdGlvbnMgd2lsbCBkaXNwbGF5ZWQgaW4gdGhlIGxpc3Qgd2l0aCBkZS1lbXBoYXNpemVkCi1pY29ucy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIHNldCB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0LCBjb21wbGV0ZSB0aGUKLWZvbGxvd2luZyBzdGVwczo8L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkJlc2lkZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TdWdnZXN0aW9uIHN0cmF0ZWd5PC9zcGFuPiBpbiB0aGUgQ29udGVudAotYXNzaXN0IHNlY3Rpb24sIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgc2V0dGluZyAoU3RyaWN0IG9yIExheCkuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBseTwvc3Bhbj4sIHRoZW4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvCi1zYXZlIHlvdXIgc2V0dGluZ3M8L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0iZXhhbXBsZSI+PHA+VGhlIGZvbGxvd2luZyBzY3JlZW4gY2FwdHVyZSBkZW1vbnN0cmF0ZXMgY29udGVudCBhc3Npc3Qgd2l0aAotdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgc2V0IHRvICJTdHJpY3QiOjwvcD4KLTxiciAvPjxpbWcgc3JjPSIuLi9pbWFnZXMvc3VnZ2VzdGlvbi5naWYiIGFsdD0iRXhhbXBsZSBvZiBTdHJpY3QgU3VnZ2VzdGlvbiBTdHJhdGVneSIgLz48YnIgLz48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdjZGFzdC5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgdG8gaGVscCB5b3UgZmluaXNoIGEgdGFnIG9yIGxpbmUgb2YgY29kZSBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFlvdSBjYW4gYWxzbyB1c2UgY29udGVudCBhc3Npc3QgdG8gaW5zZXJ0IHRlbXBsYXRlcyBpbnRvIHlvdXIgWE1MIGNvZGUuIj5Vc2luZyBYTUwgY29udGVudCBhc3Npc3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dGFnaGlsdC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dGFnaGlsdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWE4OTE0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHRhZ2hpbHQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0dGFnaGlsdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+U2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5JZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB2YXJpb3VzIGFzcGVjdHMgb2YgaG93IHRoZSBYTUwgc291cmNlDQotY29kZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLCBzdWNoIGFzIHRoZSBjb2xvcnMNCi10aGUgdGFncyB3aWxsIGJlIGRpc3BsYXllZCBpbi48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5zZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UbyBzZXQgaGlnaGxpZ2h0aW5nIHN0eWxlcyBmb3IgdGhlIFhNTCBjb2RlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nDQotc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5YTUw8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLUZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD4gU3ludGF4IENvbG9yaW5nPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+U3ludGF4IEVsZW1lbnQ8L3VpY29udHJvbD4gbGlzdCwgc2VsZWN0IHRoZSBzb3VyY2UNCi10YWcgdHlwZSB0aGF0IHlvdSB3aXNoIHRvIHNldCBhIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuIFlvdSBjYW4gYWxzbyBjbGljaw0KLXRleHQgaW4gdGhlIDx1aWNvbnRyb2w+U2FtcGxlIHRleHQ8L3VpY29udHJvbD4gYm94IHRvIHNwZWNpZnkgdGhlIHNvdXJjZSB0YWcNCi10eXBlIHRoYXQgeW91IHdpc2ggdG8gc2V0IGEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Gb3JlZ3JvdW5kPC91aWNvbnRyb2w+IGJveCwgc2VsZWN0IHRoZSBjb2xvcg0KLXRoYXQgeW91IHdhbnQgdGhlIHRleHQgb2YgdGhlIHRhZyB0byBhcHBlYXIgaW4sIGFuZCBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkJhY2tncm91bmQ8L3VpY29udHJvbD4gYm94LCBzZWxlY3QgdGhlIGNvbG9yDQotdGhhdCB5b3Ugd2FudCB0byBhcHBlYXIgYmVoaW5kIHRoZSB0YWcsIGFuZCBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgPHVpY29udHJvbD5Cb2xkPC91aWNvbnRyb2w+IGNoZWNrIGJveCBpZiB5b3Ugd2FudCB0bw0KLW1ha2UgdGhlIHR5cGUgYm9sZC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0byBzYXZlIHlvdXIgY2hhbmdlcy48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PlRvIHNldCB0aGUgaGlnaGxpZ2h0PD9QdWIgQ2FyZXQ/PmluZyBzdHlsZXMgYmFjayB0byB0aGVpciBkZWZhdWx0DQotdmFsdWVzLCBjbGljayA8dWljb250cm9sPlJlc3RvcmUgRGVmYXVsdDwvdWljb250cm9sPi4gSWYgeW91IG9ubHkgd2FudCB0bw0KLXJlc2V0IHRoZSB2YWx1ZSBmb3IgYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZSwgc2VsZWN0IGl0IGluIHRoZSA8dWljb250cm9sPlN5bnRheA0KLUVsZW1lbnQ8L3VpY29udHJvbD4gZmllbGQsIHRoZW4gY2xpY2sgdGhlIDx1aWNvbnRyb2w+UmVzdG9yZSBEZWZhdWx0PC91aWNvbnRyb2w+IGJ1dHRvbi48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjI5MD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dGFnaGlsdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dGFnaGlsdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjk2YjFmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHRhZ2hpbHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdmFyaW91cyBhc3BlY3RzIG9mIGhvdyB0aGUgWE1MIHNvdXJjZSBjb2RlIGlzIGRpc3BsYXllZCBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsIHN1Y2ggYXMgdGhlIGNvbG9ycyB0aGUgdGFncyB3aWxsIGJlIGRpc3BsYXllZCBpbi4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdmFyaW91cyBhc3BlY3RzIG9mIGhvdyB0aGUgWE1MIHNvdXJjZSBjb2RlIGlzIGRpc3BsYXllZCBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsIHN1Y2ggYXMgdGhlIGNvbG9ycyB0aGUgdGFncyB3aWxsIGJlIGRpc3BsYXllZCBpbi4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBzZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgc2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR0YWdoaWx0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHRhZ2hpbHQiPjxhIG5hbWU9InR0YWdoaWx0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5JZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB2YXJpb3VzIGFzcGVjdHMgb2YgaG93IHRoZSBYTUwgc291cmNlCi1jb2RlIGlzIGRpc3BsYXllZCBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsIHN1Y2ggYXMgdGhlIGNvbG9ycwotdGhlIHRhZ3Mgd2lsbCBiZSBkaXNwbGF5ZWQgaW4uPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBzZXQgaGlnaGxpZ2h0aW5nIHN0eWxlcyBmb3IgdGhlIFhNTCBjb2RlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nCi1zdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+IFN5bnRheCBDb2xvcmluZzwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3ludGF4IEVsZW1lbnQ8L3NwYW4+IGxpc3QsIHNlbGVjdCB0aGUgc291cmNlCi10YWcgdHlwZSB0aGF0IHlvdSB3aXNoIHRvIHNldCBhIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuIFlvdSBjYW4gYWxzbyBjbGljawotdGV4dCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2FtcGxlIHRleHQ8L3NwYW4+IGJveCB0byBzcGVjaWZ5IHRoZSBzb3VyY2UgdGFnCi10eXBlIHRoYXQgeW91IHdpc2ggdG8gc2V0IGEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Gb3JlZ3JvdW5kPC9zcGFuPiBib3gsIHNlbGVjdCB0aGUgY29sb3IKLXRoYXQgeW91IHdhbnQgdGhlIHRleHQgb2YgdGhlIHRhZyB0byBhcHBlYXIgaW4sIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5CYWNrZ3JvdW5kPC9zcGFuPiBib3gsIHNlbGVjdCB0aGUgY29sb3IKLXRoYXQgeW91IHdhbnQgdG8gYXBwZWFyIGJlaGluZCB0aGUgdGFnLCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJvbGQ8L3NwYW4+IGNoZWNrIGJveCBpZiB5b3Ugd2FudCB0bwotbWFrZSB0aGUgdHlwZSBib2xkLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+IDwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvIHNhdmUgeW91ciBjaGFuZ2VzLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBzZXQgdGhlIGhpZ2hsaWdodGluZyBzdHlsZXMgYmFjayB0byB0aGVpciBkZWZhdWx0Ci12YWx1ZXMsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlc3RvcmUgRGVmYXVsdDwvc3Bhbj4uIElmIHlvdSBvbmx5IHdhbnQgdG8KLXJlc2V0IHRoZSB2YWx1ZSBmb3IgYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZSwgc2VsZWN0IGl0IGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TeW50YXgKLUVsZW1lbnQ8L3NwYW4+IGZpZWxkLCB0aGVuIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZXN0b3JlIERlZmF1bHQ8L3NwYW4+IGJ1dHRvbi48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUgZGlyZWN0bHkuIj5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3Y2Rhc3QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdjZGFzdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjlhNjRhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdjZGFzdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDksIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InR3Y2Rhc3QiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdDwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+VXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmlzaCBhIHRhZyBvcg0KLWxpbmUgb2YgY29kZSBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFlvdSBjYW4gYWxzbyB1c2UNCi1jb250ZW50IGFzc2lzdCB0byBpbnNlcnQgdGVtcGxhdGVzIGludG8geW91ciBYTUwgY29kZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5jb250ZW50IGFzc2lzdDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT5jb250ZW50IGFzc2lzdDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yIGluIHlvdXIgc291cmNlIGZpbGUgcHJvdmlkZXMNCi10aGUgY29udGV4dCBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHRvIG9mZmVyIHN1Z2dlc3Rpb25zIGZvciBjb21wbGV0aW9uLjwvcD48cD5Zb3UNCi1jYW4gbGF1bmNoIGNvbnRlbnQgYXNzaXN0IGluIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIHdheXM6PC9wPjx1bD4NCi08bGk+RnJvbSB0aGUgPHVpY29udHJvbD5FZGl0PC91aWNvbnRyb2w+IG1lbnUsIGNsaWNrIDx1aWNvbnRyb2w+Q29udGVudA0KLUFzc2lzdDwvdWljb250cm9sPiwgb3I8L2xpPg0KLTxsaT5QcmVzcyBDdHJsK1NwYWNlPC9saT4NCi08L3VsPjxwPkluIGFkZGl0aW9uLCB5b3UgY2FuIHNldCB1cCBhbiBvcHRpb24gdGhhdCBjYXVzZXMgY29udGVudA0KLWFzc2lzdCB0byBwb3AgdXAgYXV0b21hdGljYWxseSB3aGVuIGNlcnRhaW4gY2hhcmFjdGVycyBhcmUgdHlwZWQuDQotVG8gc2V0IHVwIHRoaXMgb3B0aW9uLCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD4NCi08dWljb250cm9sPiBQcmVmZXJlbmNlczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IHRvIG9wZW4gdGhlIFByZWZlcmVuY2VzDQotd2luZG93LCB0aGVuIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5YTUw8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLUZpbGVzIDwvdWljb250cm9sPjx1aWNvbnRyb2w+RWRpdG9yPC91aWNvbnRyb2w+PHVpY29udHJvbD5Db250ZW50DQotYXNzaXN0PC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gLiBTZWxlY3QgdGhlIDx1aWNvbnRyb2w+QXV0b21hdGljYWxseQ0KLW1ha2Ugc3VnZ2VzdGlvbnM8L3VpY29udHJvbD4gY2hlY2sgYm94LCBhbmQgc3VwcGx5IGFueSBhZGRpdGlvbmFsDQotY2hhcmFjdGVycyB0aGF0IHNob3VsZCB0cmlnZ2VyIGNvbnRlbnQgYXNzaXN0LjwvcD48cD5JZiB5b3VyIGN1cnNvcg0KLWlzIGluIGEgcG9zaXRpb24gd2hlcmUgY29udGVudCBhc3Npc3QgaXMgYXZhaWxhYmxlLCBhIHBvcC11cCBsaXN0DQotb2YgYXZhaWxhYmxlIGNob2ljZXMgaXMgZGlzcGxheWVkIHdoZW4geW91IGxhdW5jaCBjb250ZW50IGFzc2lzdC4NCi1UaGUgbGlzdCBpcyBiYXNlZCBvbiB0aGUgY29udGV4dCBhbmQgd2hldGhlciBhIERURCBvciBYTUwgc2NoZW1hIGlzDQotYXNzb2NpYXRlZCB3aXRoIHRoZSBYTUwgZmlsZSBiZWluZyBlZGl0ZWQuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQ0KLWFuIEFkZHJlc3MgZWxlbWVudCB0aGF0IGNhbiBjb250YWluIGFueSBvZiB0aGUgZm9sbG93aW5nIGNoaWxkcmVuDQotZWxlbWVudHM6IE5hbWUsIFN0cmVldCwgQ2l0eSwgWmlwIENvZGUsIENvdW50cnksIGFuZCBQcm92aW5jZSwgYW5kDQoteW91IHBsYWNlIHlvdXIgY3Vyc29yIGFmdGVyIGFueSBvZiB0aGVtIGFuZCBsYXVuY2ggY29udGVudCBhc3Npc3QsDQotYWxsIG9mIHRoZSBjaGlsZCBlbGVtZW50cyB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdC48L3A+PHA+Q29udGVudA0KLWFzc2lzdCBjeWNsaW5nIGlzIGF2YWlsYWJsZSBpbiB0aGUgWE1MIGVkaXRvciwgb2ZmZXJpbmcgbXVsdGlwbGUgcGFnZXMNCi1vZiBjb250ZW50IGFzc2lzdC4gWW91IGNhbiBzZXQgcHJlZmVyZW5jZXMgZm9yIHRoZSBwcm9wb3NhbCBjYXRlZ29yaWVzDQotYW5kIHRoZSBjeWNsZSBvcmRlciB3aGVuIHJlcGVhdGVkbHkgaW52b2tpbmcgY29udGVudCBhc3Npc3QgPC9wPjw/UHViDQotQ2FyZXQgNTM/PjxwPlRoZSBjb250ZW50IGFzc2lzdCBsaXN0IGRpc3BsYXlzIGFsbCB2YWxpZCB0YWdzIGZvciB0aGUNCi1jdXJyZW50IGN1cnNvciBwb3NpdGlvbiwgaW5jbHVkaW5nIHRlbXBsYXRlcy4gSWYgeW91ciBncmFtbWFyIGNvbnN0cmFpbnRzDQotYXJlIHR1cm5lZCBvZmYsIGFsbCBhdmFpbGFibGUgdGFncywgbm90IGp1c3QgdmFsaWQgb25lcywgYXJlIGRpc3BsYXllZC4gPC9wPjxwPkFzDQoteW91IHR5cGUgdGhlIGZpcnN0IG9uZSBvciB0d28gbGV0dGVycyBvZiB0aGUgdGFnIHRoYXQgeW91IHdhbnQsIHRoZQ0KLWxpc3QgYXV0b21hdGljYWxseSByZWZyZXNoZXMgd2l0aCBhbHBoYWJldGl6ZWQgY2hvaWNlcyB0aGF0IG1hdGNoDQoteW91ciBpbnB1dC4gU2Nyb2xsIGRvd24gYW5kIHNlbGVjdCB0aGUgdGFnIHRoYXQgeW91IHdhbnQgdG8gdXNlIGJ5DQotZG91YmxlLWNsaWNraW5nIG9uIGl0LjwvcD48bm90ZT5UaGUgbGlzdCBvbmx5IHJlZnJlc2hlcyBhcyBkZXNjcmliZWQNCi1pZiB5b3UgZmlyc3QgdHlwZSA8dXNlcmlucHV0PiZsdDs8L3VzZXJpbnB1dD4gYmVmb3JlIHByb21wdGluZyBmb3INCi1jb250ZW50IGFzc2lzdC48L25vdGU+PC9jb250ZXh0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzMDkyPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3Y2Rhc3QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdjZGFzdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDBkNGY3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdjZGFzdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmlzaCBhIHRhZyBvciBsaW5lIG9mIGNvZGUgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBZb3UgY2FuIGFsc28gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGluc2VydCB0ZW1wbGF0ZXMgaW50byB5b3VyIFhNTCBjb2RlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCB0byBoZWxwIHlvdSBmaW5pc2ggYSB0YWcgb3IgbGluZSBvZiBjb2RlIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvci4gWW91IGNhbiBhbHNvIHVzZSBjb250ZW50IGFzc2lzdCB0byBpbnNlcnQgdGVtcGxhdGVzIGludG8geW91ciBYTUwgY29kZS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBjb250ZW50IGFzc2lzdCwgWE1MIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgY29udGVudCBhc3Npc3QsIFhNTCBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdtYWNyby5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHN1Z3N0cmF0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdjZGFzdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdjZGFzdCI+PGEgbmFtZT0idHdjZGFzdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0PC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCB0byBoZWxwIHlvdSBmaW5pc2ggYSB0YWcgb3IKLWxpbmUgb2YgY29kZSBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFlvdSBjYW4gYWxzbyB1c2UKLWNvbnRlbnQgYXNzaXN0IHRvIGluc2VydCB0ZW1wbGF0ZXMgaW50byB5b3VyIFhNTCBjb2RlLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yIGluIHlvdXIgc291cmNlIGZpbGUgcHJvdmlkZXMKLXRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uPC9wPgotPHA+WW91Ci1jYW4gbGF1bmNoIGNvbnRlbnQgYXNzaXN0IGluIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIHdheXM6PC9wPgotPHVsPgotPGxpPkZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQ8L3NwYW4+IG1lbnUsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRlbnQKLUFzc2lzdDwvc3Bhbj4sIG9yPC9saT4KLQotPGxpPlByZXNzIEN0cmwrU3BhY2U8L2xpPgotCi08L3VsPgotPHA+SW4gYWRkaXRpb24sIHlvdSBjYW4gc2V0IHVwIGFuIG9wdGlvbiB0aGF0IGNhdXNlcyBjb250ZW50Ci1hc3Npc3QgdG8gcG9wIHVwIGF1dG9tYXRpY2FsbHkgd2hlbiBjZXJ0YWluIGNoYXJhY3RlcnMgYXJlIHR5cGVkLgotVG8gc2V0IHVwIHRoaXMgb3B0aW9uLCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPiBQcmVmZXJlbmNlczwvc3Bhbj48L3NwYW4+IHRvIG9wZW4gdGhlIFByZWZlcmVuY2VzCi13aW5kb3csIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotRmlsZXMgPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXRvcjwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZW50Ci1hc3Npc3Q8L3NwYW4+PC9zcGFuPiAuIFNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXV0b21hdGljYWxseQotbWFrZSBzdWdnZXN0aW9uczwvc3Bhbj4gY2hlY2sgYm94LCBhbmQgc3VwcGx5IGFueSBhZGRpdGlvbmFsCi1jaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIHRyaWdnZXIgY29udGVudCBhc3Npc3QuPC9wPgotPHA+SWYgeW91ciBjdXJzb3IKLWlzIGluIGEgcG9zaXRpb24gd2hlcmUgY29udGVudCBhc3Npc3QgaXMgYXZhaWxhYmxlLCBhIHBvcC11cCBsaXN0Ci1vZiBhdmFpbGFibGUgY2hvaWNlcyBpcyBkaXNwbGF5ZWQgd2hlbiB5b3UgbGF1bmNoIGNvbnRlbnQgYXNzaXN0LgotVGhlIGxpc3QgaXMgYmFzZWQgb24gdGhlIGNvbnRleHQgYW5kIHdoZXRoZXIgYSBEVEQgb3IgWE1MIHNjaGVtYSBpcwotYXNzb2NpYXRlZCB3aXRoIHRoZSBYTUwgZmlsZSBiZWluZyBlZGl0ZWQuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQotYW4gQWRkcmVzcyBlbGVtZW50IHRoYXQgY2FuIGNvbnRhaW4gYW55IG9mIHRoZSBmb2xsb3dpbmcgY2hpbGRyZW4KLWVsZW1lbnRzOiBOYW1lLCBTdHJlZXQsIENpdHksIFppcCBDb2RlLCBDb3VudHJ5LCBhbmQgUHJvdmluY2UsIGFuZAoteW91IHBsYWNlIHlvdXIgY3Vyc29yIGFmdGVyIGFueSBvZiB0aGVtIGFuZCBsYXVuY2ggY29udGVudCBhc3Npc3QsCi1hbGwgb2YgdGhlIGNoaWxkIGVsZW1lbnRzIHdpbGwgYmUgbGlzdGVkIGluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LjwvcD4KLTxwPkNvbnRlbnQKLWFzc2lzdCBjeWNsaW5nIGlzIGF2YWlsYWJsZSBpbiB0aGUgWE1MIGVkaXRvciwgb2ZmZXJpbmcgbXVsdGlwbGUgcGFnZXMKLW9mIGNvbnRlbnQgYXNzaXN0LiBZb3UgY2FuIHNldCBwcmVmZXJlbmNlcyBmb3IgdGhlIHByb3Bvc2FsIGNhdGVnb3JpZXMKLWFuZCB0aGUgY3ljbGUgb3JkZXIgd2hlbiByZXBlYXRlZGx5IGludm9raW5nIGNvbnRlbnQgYXNzaXN0IDwvcD4KLTxwPlRoZSBjb250ZW50IGFzc2lzdCBsaXN0IGRpc3BsYXlzIGFsbCB2YWxpZCB0YWdzIGZvciB0aGUKLWN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLCBpbmNsdWRpbmcgdGVtcGxhdGVzLiBJZiB5b3VyIGdyYW1tYXIgY29uc3RyYWludHMKLWFyZSB0dXJuZWQgb2ZmLCBhbGwgYXZhaWxhYmxlIHRhZ3MsIG5vdCBqdXN0IHZhbGlkIG9uZXMsIGFyZSBkaXNwbGF5ZWQuIDwvcD4KLTxwPkFzCi15b3UgdHlwZSB0aGUgZmlyc3Qgb25lIG9yIHR3byBsZXR0ZXJzIG9mIHRoZSB0YWcgdGhhdCB5b3Ugd2FudCwgdGhlCi1saXN0IGF1dG9tYXRpY2FsbHkgcmVmcmVzaGVzIHdpdGggYWxwaGFiZXRpemVkIGNob2ljZXMgdGhhdCBtYXRjaAoteW91ciBpbnB1dC4gU2Nyb2xsIGRvd24gYW5kIHNlbGVjdCB0aGUgdGFnIHRoYXQgeW91IHdhbnQgdG8gdXNlIGJ5Ci1kb3VibGUtY2xpY2tpbmcgb24gaXQuPC9wPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRoZSBsaXN0IG9ubHkgcmVmcmVzaGVzIGFzIGRlc2NyaWJlZAotaWYgeW91IGZpcnN0IHR5cGUgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij4mbHQ7PC9rYmQ+IGJlZm9yZSBwcm9tcHRpbmcgZm9yCi1jb250ZW50IGFzc2lzdC48L2Rpdj4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZSBkaXJlY3RseS4iPkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdtYWNyby5odG1sIiB0aXRsZT0iWE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBzZWN0aW9uIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgbWF5IGZpbmQgYSB0ZW1wbGF0ZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLiI+V29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90c3Vnc3RyYXQuaHRtbCIgdGl0bGU9IllvdSBjYW4gY3VzdG9taXplIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBzdWdnZXN0aW9ucyBnaXZlbiBieSBjb250ZW50IGFzc2lzdCBieSBjaG9vc2luZyBhIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgcHJlZmVyZW5jZS4gV2hlbiB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSBpcyBzZXQgdG8gU3RyaWN0LCBzdWdnZXN0aW9ucyB0aGF0IGFyZSBncmFtbWF0aWNhbGx5IHZhbGlkIHdpbGwgYmUgZGlzcGxheWVkIGZpcnN0IGluIHRoZSBsaXN0IG9mIG9wdGlvbnMgYW5kIGhpZ2hsaWdodGVkIGJ5IGJvbGQgaWNvbnMuIE90aGVyIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhpcyBlbGVtZW50J3Mgc2NvcGUgYnV0IGFyZSBub3QgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIGRpc3BsYXllZCBsb3dlciBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQgaWNvbnMuIFdoZW4gdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaXMgc2V0IHRvIExheCwgYWxsIHN1Z2dlc3Rpb25zIHdpbGwgZGlzcGxheWVkIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4iPlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdtYWNyby5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d21hY3JvLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMWI0YzUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d21hY3JvLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3bWFjcm8iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPldvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5Xb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5YTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIHNlY3Rpb24gb2YgcHJlZGVmaW5lZA0KLWNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IG1heSBmaW5kIGEgdGVtcGxhdGUgdXNlZnVsIHdoZW4NCi15b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91DQotZG8gbm90IHdhbnQgdG8gd3JpdGUgaXQgb3V0IGV2ZXJ5IHRpbWUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0ga2V5cmVmPSJ0d21hY3JvfDF8WE1MdGVtcGxhdGVzd29ya2luZ3dpdGhwcmVkZWZpbmVkY29kZSINCi1zdGF0dXM9ImNoYW5nZWQiPnRlbXBsYXRlczxpbmRleHRlcm0+d29ya2luZyB3aXRoIHByZWRlZmluZWQgWE1MIGNvZGU8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0idHdtYWNyb3wxMHxYTUxmaWxlc3RlbXBsYXRlcyIgc3RhdHVzPSJuZXciPlhNTA0KLWZpbGVzPGluZGV4dGVybT50ZW1wbGF0ZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPllvdSBjYW4gdXNlIGEgZGVmYXVsdCB0ZW1wbGF0ZSBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoYXQgdGVtcGxhdGUsDQotb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy48L3A+PHA+Rm9yIGV4YW1wbGUsIHlvdSBjYW4gd29yayBvbiBhIGdyb3VwIG9mDQotWE1MIHBhZ2VzIHRoYXQgc2hvdWxkIGFsbCBjb250YWluIGEgdGFibGUgd2l0aCBhIHNwZWNpZmljIGFwcGVhcmFuY2UuIENyZWF0ZQ0KLWEgdGVtcGxhdGUgdGhhdCBjb250YWlucyB0aGUgdGFncyBmb3IgdGhhdCB0YWJsZSwgaW5jbHVkaW5nIHRoZSBhcHByb3ByaWF0ZQ0KLWF0dHJpYnV0ZXMgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIGVhY2ggdGFnLiAoWW91IGNhbiBjb3B5IGFuZCBwYXN0ZSB0aGUNCi10YWdzIGZyb20gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGludG8gdGhlIHRlbXBsYXRlJ3MgPHVpY29udHJvbD5QYXR0ZXJuPC91aWNvbnRyb2w+IGZpZWxkLikNCi1UaGVuIHNlbGVjdCB0aGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgZnJvbSBhIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FsIGxpc3Qgd2hlbmV2ZXINCi15b3Ugd2FudCB0byBpbnNlcnQgeW91ciBjdXN0b20gdGFibGUgaW50byBhbiBYTUwgZmlsZS48L3A+PHA+VG8gY3JlYXRlIGEgbmV3DQotWE1MIHRlbXBsYXRlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+WE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwNCi1GaWxlczwvdWljb250cm9sPjx1aWNvbnRyb2w+VGVtcGxhdGVzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD4gaWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgY29tcGxldGVseQ0KLW5ldyB0ZW1wbGF0ZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TdXBwbHkgYSBuZXcgdGVtcGxhdGUgPHVpY29udHJvbD5OYW1lPC91aWNvbnRyb2w+IGFuZCA8dWljb250cm9sPkRlc2NyaXB0aW9uPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNwZWNpZnkgdGhlIDx1aWNvbnRyb2w+Q29udGV4dDwvdWljb250cm9sPiBmb3IgdGhlIHRlbXBsYXRlLjwvY21kPg0KLTxpbmZvPlRoaXMgaXMgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHJvcG9zYWwNCi1saXN0IHdoZW4gY29udGVudCBhc3Npc3QgaXMgcmVxdWVzdGVkLiA8L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U3BlY2lmeSB0aGUgPHVpY29udHJvbD5QYXR0ZXJuPC91aWNvbnRyb2w+IGZvciB5b3VyIHRlbXBsYXRlIHVzaW5nDQotdGhlIGFwcHJvcHJpYXRlIHRhZ3MsIGF0dHJpYnV0ZXMsIG9yIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gYmUgaW5zZXJ0ZWQgYnkgY29udGVudA0KLWFzc2lzdC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3Ugd2FudCB0byBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDx1aWNvbnRyb2w+SW5zZXJ0IFZhcmlhYmxlPC91aWNvbnRyb2w+IGJ1dHRvbg0KLWFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLiA8L2NtZD48aW5mbz5Gb3IgZXhhbXBsZSwgdGhlIDxiPmRhdGU8L2I+IHZhcmlhYmxlDQotaW5kaWNhdGVzIHRoZSBjdXJyZW50IGRhdGUgd2lsbCBiZSBpbnNlcnRlZC4gPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gYW5kIHRoZW4gPHVpY29udHJvbD5BcHBseTwvdWljb250cm9sPiB0bw0KLXNhdmUgeW91ciBjaGFuZ2VzLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPllvdSBjYW4gZWRpdCwgcmVtb3ZlLCBpbXBvcnQsIG9yIGV4cG9ydCBhIHRlbXBsYXRlIGJ5IHVzaW5nIHRoZSBzYW1lDQotcHJlZmVyZW5jZXMgcGFnZS4gSWYgeW91IGhhdmUgbW9kaWZpZWQgYSBkZWZhdWx0IHRlbXBsYXRlLCB5b3UgY2FuIHJlc3RvcmUNCi1pdCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gWW91IGNhbiBhbHNvIHJlc3RvcmUgYSByZW1vdmVkIHRlbXBsYXRlIGlmIHlvdSBoYXZlDQotbm90IGV4aXRlZCBmcm9tIHRoZSB3b3JrYmVuY2ggc2luY2UgaXQgd2FzIHJlbW92ZWQuIDxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUNCi10aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgYnV0IHlvdSBubyBsb25nZXIgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlDQotY29udGVudCBhc3Npc3QgbGlzdCwgY2xlYXIgaXRzIGNoZWNrIGJveCBpbiB0aGUgdGFibGUgb24gdGhlIFRlbXBsYXRlcyBwcmVmZXJlbmNlcw0KLXBhZ2UuPC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3bWFjcm8uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdtYWNyby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2MxNGZhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdtYWNyby5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBzZWN0aW9uIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgbWF5IGZpbmQgYSB0ZW1wbGF0ZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIHNlY3Rpb24gb2YgcHJlZGVmaW5lZCBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuIHlvdSBoYXZlIGEgY2VydGFpbiBwaWVjZSBvZiBjb2RlIHlvdSB3YW50IHRvIHJldXNlIHNldmVyYWwgdGltZXMsIGFuZCB5b3UgZG8gbm90IHdhbnQgdG8gd3JpdGUgaXQgb3V0IGV2ZXJ5IHRpbWUuIiAvPgotPG1ldGEgY29udGVudD0idGVtcGxhdGVzLCB3b3JraW5nIHdpdGggcHJlZGVmaW5lZCBYTUwgY29kZSwgWE1MIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0idGVtcGxhdGVzLCB3b3JraW5nIHdpdGggcHJlZGVmaW5lZCBYTUwgY29kZSwgWE1MIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2NkYXN0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdtYWNybyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d21hY3JvIj48YSBuYW1lPSJ0d21hY3JvIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Xb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBzZWN0aW9uIG9mIHByZWRlZmluZWQKLWNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IG1heSBmaW5kIGEgdGVtcGxhdGUgdXNlZnVsIHdoZW4KLXlvdSBoYXZlIGEgY2VydGFpbiBwaWVjZSBvZiBjb2RlIHlvdSB3YW50IHRvIHJldXNlIHNldmVyYWwgdGltZXMsIGFuZCB5b3UKLWRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WW91IGNhbiB1c2UgYSBkZWZhdWx0IHRlbXBsYXRlIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhhdCB0ZW1wbGF0ZSwKLW9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9wPgotPHA+Rm9yIGV4YW1wbGUsIHlvdSBjYW4gd29yayBvbiBhIGdyb3VwIG9mCi1YTUwgcGFnZXMgdGhhdCBzaG91bGQgYWxsIGNvbnRhaW4gYSB0YWJsZSB3aXRoIGEgc3BlY2lmaWMgYXBwZWFyYW5jZS4gQ3JlYXRlCi1hIHRlbXBsYXRlIHRoYXQgY29udGFpbnMgdGhlIHRhZ3MgZm9yIHRoYXQgdGFibGUsIGluY2x1ZGluZyB0aGUgYXBwcm9wcmlhdGUKLWF0dHJpYnV0ZXMgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIGVhY2ggdGFnLiAoWW91IGNhbiBjb3B5IGFuZCBwYXN0ZSB0aGUKLXRhZ3MgZnJvbSBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaW50byB0aGUgdGVtcGxhdGUncyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuPC9zcGFuPiBmaWVsZC4pCi1UaGVuIHNlbGVjdCB0aGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgZnJvbSBhIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FsIGxpc3Qgd2hlbmV2ZXIKLXlvdSB3YW50IHRvIGluc2VydCB5b3VyIGN1c3RvbSB0YWJsZSBpbnRvIGFuIFhNTCBmaWxlLjwvcD4KLTxwPlRvIGNyZWF0ZSBhIG5ldwotWE1MIHRlbXBsYXRlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VGVtcGxhdGVzPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiBpZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBjb21wbGV0ZWx5Ci1uZXcgdGVtcGxhdGUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U3VwcGx5IGEgbmV3IHRlbXBsYXRlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZXNjcmlwdGlvbjwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TcGVjaWZ5IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZXh0PC9zcGFuPiBmb3IgdGhlIHRlbXBsYXRlLjwvc3Bhbj4KLSBUaGlzIGlzIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsCi1saXN0IHdoZW4gY29udGVudCBhc3Npc3QgaXMgcmVxdWVzdGVkLiA8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNwZWNpZnkgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhdHRlcm48L3NwYW4+IGZvciB5b3VyIHRlbXBsYXRlIHVzaW5nCi10aGUgYXBwcm9wcmlhdGUgdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyB0byBiZSBpbnNlcnRlZCBieSBjb250ZW50Ci1hc3Npc3QuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbnNlcnQgVmFyaWFibGU8L3NwYW4+IGJ1dHRvbgotYW5kIHNlbGVjdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5zZXJ0ZWQuIDwvc3Bhbj4gRm9yIGV4YW1wbGUsIHRoZSA8c3Ryb25nPmRhdGU8L3N0cm9uZz4gdmFyaWFibGUKLWluZGljYXRlcyB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUgaW5zZXJ0ZWQuIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IGFuZCB0aGVuIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGx5PC9zcGFuPiB0bwotc2F2ZSB5b3VyIGNoYW5nZXMuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBjYW4gZWRpdCwgcmVtb3ZlLCBpbXBvcnQsIG9yIGV4cG9ydCBhIHRlbXBsYXRlIGJ5IHVzaW5nIHRoZSBzYW1lCi1wcmVmZXJlbmNlcyBwYWdlLiBJZiB5b3UgaGF2ZSBtb2RpZmllZCBhIGRlZmF1bHQgdGVtcGxhdGUsIHlvdSBjYW4gcmVzdG9yZQotaXQgdG8gaXRzIGRlZmF1bHQgdmFsdWUuIFlvdSBjYW4gYWxzbyByZXN0b3JlIGEgcmVtb3ZlZCB0ZW1wbGF0ZSBpZiB5b3UgaGF2ZQotbm90IGV4aXRlZCBmcm9tIHRoZSB3b3JrYmVuY2ggc2luY2UgaXQgd2FzIHJlbW92ZWQuIDxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUKLXRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IGl0IHRvIGFwcGVhciBpbiB0aGUKLWNvbnRlbnQgYXNzaXN0IGxpc3QsIGNsZWFyIGl0cyBjaGVjayBib3ggaW4gdGhlIHRhYmxlIG9uIHRoZSBUZW1wbGF0ZXMgcHJlZmVyZW5jZXMKLXBhZ2UuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2NkYXN0Lmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCB0byBoZWxwIHlvdSBmaW5pc2ggYSB0YWcgb3IgbGluZSBvZiBjb2RlIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvci4gWW91IGNhbiBhbHNvIHVzZSBjb250ZW50IGFzc2lzdCB0byBpbnNlcnQgdGVtcGxhdGVzIGludG8geW91ciBYTUwgY29kZS4iPlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3eHZhbGlkLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3eHZhbGlkLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZGZlYzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d3h2YWxpZC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d3h2YWxpZCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+VmFsaWRhdGluZyBYTUwgZmlsZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlZhbGlkYXRpbmcgWE1MIGZpbGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPldoZW4geW91IHZhbGlkYXRlIHlvdXIgWE1MIGZpbGUsIHRoZSBYTUwgdmFsaWRhdG9yIHdpbGwgY2hlY2sgdG8NCi1zZWUgdGhhdCB5b3VyIGZpbGUgaXMgdmFsaWQgYW5kIHdlbGwtZm9ybWVkLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+dmFsaWRhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIFhNTCBlZGl0b3Igd2lsbCBwcm9jZXNzIFhNTCBmaWxlcyB0aGF0IGFyZSBpbnZhbGlkIG9yIG5vdA0KLXdlbGwtZm9ybWVkLiBUaGUgZWRpdG9yIHVzZXMgaGV1cmlzdGljcyB0byBvcGVuIGEgZmlsZSB1c2luZyB0aGUgYmVzdCBpbnRlcnByZXRhdGlvbg0KLW9mIHRoZSB0YWdnaW5nIHRoYXQgaXQgY2FuLiBGb3IgZXhhbXBsZSwgYW4gZWxlbWVudCB3aXRoIGEgbWlzc2luZyBlbmQgdGFnDQotaXMgc2ltcGx5IGFzc3VtZWQgdG8gZW5kIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LiBBcyB5b3UgbWFrZSB1cGRhdGVzIHRvDQotYSBmaWxlLCB0aGUgZWRpdG9yIGluY3JlbWVudGFsbHkgcmVpbnRlcnByZXRzIHlvdXIgZG9jdW1lbnQsIGNoYW5naW5nIHRoZQ0KLWhpZ2hsaWdodGluZywgdHJlZSB2aWV3LCBhbmQgc28gb24uIE1hbnkgZm9ybWF0aW9uIGVycm9ycyBhcmUgZWFzeSB0byBzcG90DQotaW4gdGhlIHN5bnRheCBoaWdobGlnaHRpbmcsIHNvIHlvdSBjYW4gZWFzaWx5IGNvcnJlY3Qgb2J2aW91cyBlcnJvcnMgb24tdGhlLWZseS4NCi1Ib3dldmVyLCB0aGVyZSB3aWxsIGJlIG90aGVyIGNhc2VzIHdoZW4gaXQgd2lsbCBiZSBiZW5lZmljaWFsIHRvIHBlcmZvcm0gZm9ybWFsDQotdmFsaWRhdGlvbiBvbiB5b3VyIGRvY3VtZW50cy48L3A+PHA+WW91IGNhbiB2YWxpZGF0ZSB5b3VyIGZpbGUgYnkgc2VsZWN0aW5nDQotaXQgaW4gdGhlIE5hdmlnYXRvciB2aWV3LCByaWdodC1jbGlja2luZyBpdCwgYW5kIGNsaWNraW5nIDx1aWNvbnRyb2w+VmFsaWRhdGU8L3VpY29udHJvbD4uDQotQW55IHZhbGlkYXRpb24gcHJvYmxlbXMgYXJlIGluZGljYXRlZCBpbiB0aGUgUHJvYmxlbXMgdmlldy4gWW91IGNhbiBkb3VibGUtY2xpY2sNCi1vbiBpbmRpdmlkdWFsIGVycm9ycywgYW5kIHlvdSB3aWxsIGJlIHRha2VuIHRvIHRoZSBpbnZhbGlkIHRhZyBpbiB0aGUgZmlsZSwNCi1zbyB0aGF0IHlvdSBjYW4gbWFrZSBjb3JyZWN0aW9ucy48L3A+PC9jb250ZXh0Pg0KLTxwb3N0cmVxPjxub3RlPiBJZiB5b3UgcmVjZWl2ZSBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgUHJvYmxlbXMNCi12aWV3IGlzIGZ1bGwsIHlvdSBjYW4gaW5jcmVhc2UgdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcyBhbGxvd2VkIGJ5IGNsaWNraW5nIDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiBhbmQNCi1zZWxlY3RpbmcgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPjx1aWNvbnRyb2w+TWFya2VyczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+LiBTZWxlY3QgdGhlIDx1aWNvbnRyb2w+VXNlIG1hcmtlciBsaW1pdHM8L3VpY29udHJvbD4gY2hlY2sNCi1ib3ggYW5kIGNoYW5nZSB0aGUgbnVtYmVyIGluIHRoZSA8dWljb250cm9sPkxpbWl0IHZpc2libGUgaXRlbXMgcGVyIGdyb3VwPC91aWNvbnRyb2w+IDw/UHViIENhcmV0Pz5maWVsZC48L25vdGU+PHA+WW91DQotY2FuIHNldCB1cCBhIHByb2plY3QncyBwcm9wZXJ0aWVzIHNvIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3QgcmVzb3VyY2VzDQotYXJlIGF1dG9tYXRpY2FsbHkgdmFsaWRhdGVkIHdoZW4geW91IHNhdmUgdGhlbS4gRnJvbSBhIHByb2plY3QncyBwb3AtdXAgbWVudSwNCi1jbGljayA8dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD4sIHRoZW4gc2VsZWN0IDx1aWNvbnRyb2w+VmFsaWRhdGlvbjwvdWljb250cm9sPi4NCi1BbnkgdmFsaWRhdG9ycyB5b3UgY2FuIHJ1biBhZ2FpbnN0IHlvdXIgcHJvamVjdCB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgVmFsaWRhdGlvbg0KLXBhZ2UuPC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5kaXRhIiBzY29wZT0icGVlciI+DQotPGxpbmt0ZXh0PlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uczwvbGlua3RleHQ+PC9saW5rPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDI2NTg/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHd4dmFsaWQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHd4dmFsaWQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkM2YzNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3eHZhbGlkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJWYWxpZGF0aW5nIFhNTCBmaWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJXaGVuIHlvdSB2YWxpZGF0ZSB5b3VyIFhNTCBmaWxlLCB0aGUgWE1MIHZhbGlkYXRvciB3aWxsIGNoZWNrIHRvIHNlZSB0aGF0IHlvdXIgZmlsZSBpcyB2YWxpZCBhbmQgd2VsbC1mb3JtZWQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IldoZW4geW91IHZhbGlkYXRlIHlvdXIgWE1MIGZpbGUsIHRoZSBYTUwgdmFsaWRhdG9yIHdpbGwgY2hlY2sgdG8gc2VlIHRoYXQgeW91ciBmaWxlIGlzIHZhbGlkIGFuZCB3ZWxsLWZvcm1lZC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIHZhbGlkYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIHZhbGlkYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHd4dmFsaWQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5WYWxpZGF0aW5nIFhNTCBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHd4dmFsaWQiPjxhIG5hbWU9InR3eHZhbGlkIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5WYWxpZGF0aW5nIFhNTCBmaWxlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+V2hlbiB5b3UgdmFsaWRhdGUgeW91ciBYTUwgZmlsZSwgdGhlIFhNTCB2YWxpZGF0b3Igd2lsbCBjaGVjayB0bwotc2VlIHRoYXQgeW91ciBmaWxlIGlzIHZhbGlkIGFuZCB3ZWxsLWZvcm1lZC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBYTUwgZWRpdG9yIHdpbGwgcHJvY2VzcyBYTUwgZmlsZXMgdGhhdCBhcmUgaW52YWxpZCBvciBub3QKLXdlbGwtZm9ybWVkLiBUaGUgZWRpdG9yIHVzZXMgaGV1cmlzdGljcyB0byBvcGVuIGEgZmlsZSB1c2luZyB0aGUgYmVzdCBpbnRlcnByZXRhdGlvbgotb2YgdGhlIHRhZ2dpbmcgdGhhdCBpdCBjYW4uIEZvciBleGFtcGxlLCBhbiBlbGVtZW50IHdpdGggYSBtaXNzaW5nIGVuZCB0YWcKLWlzIHNpbXBseSBhc3N1bWVkIHRvIGVuZCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4gQXMgeW91IG1ha2UgdXBkYXRlcyB0bwotYSBmaWxlLCB0aGUgZWRpdG9yIGluY3JlbWVudGFsbHkgcmVpbnRlcnByZXRzIHlvdXIgZG9jdW1lbnQsIGNoYW5naW5nIHRoZQotaGlnaGxpZ2h0aW5nLCB0cmVlIHZpZXcsIGFuZCBzbyBvbi4gTWFueSBmb3JtYXRpb24gZXJyb3JzIGFyZSBlYXN5IHRvIHNwb3QKLWluIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nLCBzbyB5b3UgY2FuIGVhc2lseSBjb3JyZWN0IG9idmlvdXMgZXJyb3JzIG9uLXRoZS1mbHkuCi1Ib3dldmVyLCB0aGVyZSB3aWxsIGJlIG90aGVyIGNhc2VzIHdoZW4gaXQgd2lsbCBiZSBiZW5lZmljaWFsIHRvIHBlcmZvcm0gZm9ybWFsCi12YWxpZGF0aW9uIG9uIHlvdXIgZG9jdW1lbnRzLjwvcD4KLTxwPllvdSBjYW4gdmFsaWRhdGUgeW91ciBmaWxlIGJ5IHNlbGVjdGluZwotaXQgaW4gdGhlIE5hdmlnYXRvciB2aWV3LCByaWdodC1jbGlja2luZyBpdCwgYW5kIGNsaWNraW5nIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRlPC9zcGFuPi4KLUFueSB2YWxpZGF0aW9uIHByb2JsZW1zIGFyZSBpbmRpY2F0ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuIFlvdSBjYW4gZG91YmxlLWNsaWNrCi1vbiBpbmRpdmlkdWFsIGVycm9ycywgYW5kIHlvdSB3aWxsIGJlIHRha2VuIHRvIHRoZSBpbnZhbGlkIHRhZyBpbiB0aGUgZmlsZSwKLXNvIHRoYXQgeW91IGNhbiBtYWtlIGNvcnJlY3Rpb25zLjwvcD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gIElmIHlvdSByZWNlaXZlIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSBQcm9ibGVtcwotdmlldyBpcyBmdWxsLCB5b3UgY2FuIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMgYWxsb3dlZCBieSBjbGlja2luZyA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPjwvc3Bhbj4gYW5kCi1zZWxlY3RpbmcgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1hcmtlcnM8L3NwYW4+Ci08L3NwYW4+LiBTZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVzZSBtYXJrZXIgbGltaXRzPC9zcGFuPiBjaGVjawotYm94IGFuZCBjaGFuZ2UgdGhlIG51bWJlciBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TGltaXQgdmlzaWJsZSBpdGVtcyBwZXIgZ3JvdXA8L3NwYW4+IGZpZWxkLjwvZGl2PgotPHA+WW91Ci1jYW4gc2V0IHVwIGEgcHJvamVjdCdzIHByb3BlcnRpZXMgc28gdGhhdCBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdCByZXNvdXJjZXMKLWFyZSBhdXRvbWF0aWNhbGx5IHZhbGlkYXRlZCB3aGVuIHlvdSBzYXZlIHRoZW0uIEZyb20gYSBwcm9qZWN0J3MgcG9wLXVwIG1lbnUsCi1jbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPiwgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFsaWRhdGlvbjwvc3Bhbj4uCi1BbnkgdmFsaWRhdG9ycyB5b3UgY2FuIHJ1biBhZ2FpbnN0IHlvdXIgcHJvamVjdCB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgVmFsaWRhdGlvbgotcGFnZS48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsaW5mbyI+PHN0cm9uZz5SZWxhdGVkIGluZm9ybWF0aW9uPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5odG1sIj5WYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGU1ZjUxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwOSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgU3R5IF9kaXNwbGF5IEZvbnRDb2xvcj0icmVkIj8+DQotPHRhc2sgaWQ9InR4ZWR0ZGVzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlDQotWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSB3aXRoIE5vZGUgYW5kIENvbnRlbnQgY29sdW1ucyBhbmQNCi1hIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQNCi1hdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLCB3aGlsZQ0KLXBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZA0KLWZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5EZXNpZ24gdmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+Rm9yIGV4YW1wbGUsIHRoZSA8dWljb250cm9sPkFkZCBjaGlsZDwvdWljb250cm9sPiBtZW51DQotaXRlbSB3aWxsIGxpc3Qgb25seSB0aG9zZSBlbGVtZW50cyBmcm9tIGEgRFREIG9yIFhNTCBzY2hlbWEgd2hpY2gNCi13b3VsZCBiZSB2YWxpZCBjaGlsZHJlbiBhdCB0aGF0IHBvaW50LjwvcD48cD5XaGVuIHlvdSBoYXZlIGFuIFhNTA0KLWZpbGUgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBzY2hlbWEgb3IgRFREIGZpbGUsIGNlcnRhaW4gdGFncyBhbmQgcnVsZXMNCi1mb3IgdGhhdCBmaWxlIGhhdmUgYWxyZWFkeSBiZWVuIGVzdGFibGlzaGVkLCB3aGljaCBpcyB3aHkgdGhlIERlc2lnbg0KLXZpZXcgY2FuIHByb3ZpZGUgcHJvbXB0cyAodmlhIGEgcG9wLXVwIG1lbnUpIGZvciB0aG9zZSB0YWdzLiBXaGVuDQoteW91IGNyZWF0ZSBhbiBYTUwgZmlsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIHNjaGVtYSBvcg0KLURURCBmaWxlLCBpdCBoYXMgbm8gdGFncyBvciBydWxlcyBhc3NvY2lhdGVkIHdpdGggaXQsIHNvIHRoZSBEZXNpZ24NCi12aWV3IGNhbm5vdCBwcm92aWRlIHByb21wdHMgZm9yIHNwZWNpZmljIHRhZ3MsIGJ1dCBpdCBjYW4gcHJvdmlkZQ0KLXByb21wdHMgdG8gY3JlYXRlIG5ldyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcy48L3A+PHA+Rm9yIGFueSBYTUwgZmlsZQ0KLWFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgc2NoZW1hIG9yIERURCBmaWxlLCB5b3UgY2FuIHVzZSB0aGUgRGVzaWduDQotdmlldyB0byBhZGQgYW55IGl0ZW1zIGRlZmluZWQgaW4gdGhlIFhNTCBzY2hlbWEgb3IgRFREIChzdWNoIGFzIGVsZW1lbnRzDQotYW5kIGF0dHJpYnV0ZXMpIHRvIHRoZSBYTUwgZmlsZS4gWW91IGNhbiBhbHNvIHVzZSBpdCB0byBhZGQgcHJvY2Vzc2luZw0KLWluc3RydWN0aW9ucyBhbmQgY29tbWVudHMgdG8gYWxsIFhNTCBmaWxlcy48L3A+PHA+VG8gb3BlbiBhbmQgZWRpdA0KLWEgWE1MIGZpbGUgaW4gdGhlIFhNTCBlZGl0b3IsIHJpZ2h0LWNsaWNrIHRoZSBmaWxlIGluIHRoZSBQcm9qZWN0DQotRXhwbG9yZXIgdmlldyBhbmQgY2xpY2sgPHVpY29udHJvbD5PcGVuIFdpdGggPiBYTUwgRWRpdG9yPC91aWNvbnRyb2w+Lg0KLUlmIG5lY2Vzc2FyeSwgY2xpY2sgdGhlIDx1aWNvbnRyb2w+RGVzaWduPC91aWNvbnRyb2w+IHRhYiB0byBvcGVuDQotdGhlIERlc2lnbiB2aWV3LjwvcD48P1B1YiBDYXJldCA5Mj8+PHA+VG8gZXhwYW5kIGFsbCB0aGUgaXRlbXMgaW4NCi15b3VyIFhNTCBmaWxlLCBjbGljayB0aGUgPHVpY29udHJvbD5FeHBhbmQgQWxsPC91aWNvbnRyb2w+IGJ1dHRvbjxpbWFnZQ0KLWhyZWY9Ii4uL2ltYWdlcy9leHBhbmRfYWxsLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIEV4cGFuZCBBbGwNCi1idXR0b248L2FsdD48L2ltYWdlPiBvbiB0aGUgdG9wIHJpZ2h0IGNvcm5lciBvZiB0aGUgZWRpdG9yLiBUbyBjb2xsYXBzZQ0KLXRoZW0sIGNsaWNrIHRoZSA8dWljb250cm9sPkNvbGxhcHNlIEFsbDwvdWljb250cm9sPiBidXR0b248aW1hZ2UNCi1ocmVmPSIuLi9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIENvbGxhcHNlDQotQWxsIGJ1dHRvbjwvYWx0PjwvaW1hZ2U+IG9uIHRoZSB0b3AgcmlnaHQgY29ybmVyIG9mIHRoZSBlZGl0b3IuPC9wPjxwPklmDQoteW91IHJpZ2h0LWNsaWNrIHRoZSBpdGVtIHRoYXQgeW91IHdhbnQgdG8gd29yayB3aXRoLCBzb21lIG9yIGFsbCBvZg0KLXRoZSBmb2xsb3dpbmcgb3B0aW9ucyAoYXMgYXBwbGljYWJsZSkgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGUgcG9wLXVwDQotbWVudSB0aGF0IGFwcGVhcnM6PC9wPjx0YWJsZT4NCi08dGdyb3VwIGNvbHM9IjIiPjxjb2xzcGVjIGNvbG5hbWU9ImNvbDEiIGNvbHdpZHRoPSI0OCoiLz48Y29sc3BlYw0KLWNvbG5hbWU9ImNvbDIiIGNvbHdpZHRoPSIxNTAqIi8+DQotPHRoZWFkPg0KLTxyb3cgdmFsaWduPSJib3R0b20iPg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5TZWxlY3QgdGhpczwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPklmIHlvdSB3YW50IHRvIGRvIHRoaXM8L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGhlYWQ+DQotPHRib2R5Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkFkZCBEVEQgSW5mb3JtYXRpb248L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5Bc3NvY2lhdGUgdGhlIFhNTCBmaWxlIHdpdGggYSBEVEQuPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5FZGl0IERPQ1RZUEU8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5FZGl0IHRoZSBET0NUWVBFIGRlY2xhcmF0aW9uLiBSZWZlciB0byB0aGUgcmVsYXRlZA0KLXRhc2sgZm9yIG1vcmUgZGV0YWlscy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8eHJlZiBmb3JtYXQ9ImRpdGEiDQotaHJlZj0idGVkdGRvYy5kaXRhIiBzY29wZT0ibG9jYWwiPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L3hyZWY+LjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+RWRpdCBOYW1lc3BhY2VzPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+RWRpdCB0aGUgZXhpc3RpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIG9yIGNyZWF0ZQ0KLWEgbmV3IGFzc29jaWF0aW9uIHdpdGggYSBuYW1lc3BhY2UuIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sgZm9yDQotbW9yZSBkZXRhaWxzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDx4cmVmIGZvcm1hdD0iZGl0YSINCi1ocmVmPSJ0ZWR0c2NoLmRpdGEiIHNjb3BlPSJsb2NhbCI+RWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb248L3hyZWY+LjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+RWRpdCBQcm9jZXNzaW5nIEluc3RydWN0aW9uPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+RWRpdCB0aGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4gUmVmZXIgdG8gdGhlDQotcmVsYXRlZCB0YXNrIGZvciBtb3JlIGRldGFpbHMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPHhyZWYNCi1mb3JtYXQ9ImRpdGEiIGhyZWY9InRlZHRwcm9jLmRpdGEiIHNjb3BlPSJsb2NhbCI+RWRpdGluZyBYTUwgcHJvY2Vzc2luZw0KLWluc3RydWN0aW9uczwveHJlZj4uPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5SZW1vdmU8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5SZW1vdmUgdGhlIGl0ZW0gdGhhdCB5b3UgaGF2ZSBzZWxlY3RlZCBmcm9tDQotdGhlIFhNTCBmaWxlLiBJZiB0aGUgc2VsZWN0ZWQgaXRlbSBvciByZWxhdGVkIGl0ZW1zIGFyZSBkZWZpbmVkIHNvDQotdGhhdCB0aGUgaXRlbSBtdXN0IGV4aXN0IGluIHRoZSBmaWxlLCB0aGlzIG9wdGlvbiB3aWxsIG5vdCBiZSBhdmFpbGFibGUuDQotRm9yIGV4YW1wbGUsIGluIHlvdXIgRFRELCBpZiB5b3UgaGF2ZSBkZWNsYXJlZCB0aGF0ICJPbmUgb3IgbW9yZSINCi1vZiB0aGUgaXRlbSBtdXN0IGFsd2F5cyBleGlzdCBpbiB5b3VyIFhNTCBmaWxlLCBhbmQgdGhlIGl0ZW0geW91IGhhdmUNCi1zZWxlY3RlZCBpcyB0aGUgb25seSBvbmUgdGhhdCBleGlzdHMgaW4geW91ciBYTUwgZmlsZS48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkFkZCBBdHRyaWJ1dGU8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5BZGQgYW4gYXR0cmlidXRlIHRvIHRoZSBlbGVtZW50IHRoYXQgeW91IHNlbGVjdGVkLg0KLUFueSBhdHRyaWJ1dGVzIHlvdSBhcmUgYWxsb3dlZCB0byBhZGQgdG8gdGhlIGVsZW1lbnQgd2lsbCBiZSBsaXN0ZWQuDQotQWZ0ZXIgeW91IGhhdmUgYWRkZWQgdGhlIGF0dHJpYnV0ZSB0byB0aGUgWE1MIGZpbGUsIHlvdSBjYW4gY2xpY2sNCi1pbiB0aGUgcmlnaHQtaGFuZCBjb2x1bW4gdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLiBJZg0KLXRoZSBhdHRyaWJ1dGUgaGFzIHNldCB2YWx1ZXMsIHRoZXkgd2lsbCBhcHBlYXIgaW4gYSBsaXN0LjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+QWRkIENoaWxkPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+QWRkIGFub3RoZXIgZWxlbWVudCwgYSBjb21tZW50LCBvciBhIHByb2Nlc3NpbmcNCi1pbnN0cnVjdGlvbiBhcyBhIGNoaWxkIG9mIHRoZSBwYXJlbnQgZWxlbWVudC48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkFkZCBCZWZvcmU8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5BZGQgYSBjaGlsZCBlbGVtZW50LCBjb21tZW50LCBvciBwcm9jZXNzaW5nDQotaW5zdHJ1Y3Rpb24gdGhhdCBjYW4gZ28gYmVmb3JlIHRoZSBpdGVtIHlvdSBoYXZlIHNlbGVjdGVkLiBGb3IgZXhhbXBsZSwNCi1pZiB5b3UgaGF2ZSBhIHBhcmVudCBlbGVtZW50IGNhbGxlZCA8dXNlcmlucHV0PkNEIENvbGxlY3Rpb25zPC91c2VyaW5wdXQ+IHRoYXQNCi1jYW4gY29udGFpbiBhbiB1bmxpbWl0ZWQgYW1vdW50IG9mIGNoaWxkcmVuIGNhbGxlZCA8dXNlcmlucHV0PkNEPC91c2VyaW5wdXQ+LA0KLXlvdSBjb3VsZCBjbGljayBhIDx1c2VyaW5wdXQ+Q0Q8L3VzZXJpbnB1dD4gZWxlbWVudCBhbmQgY2xpY2sgPG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+QWRkIEJlZm9yZTwvdWljb250cm9sPjx1aWNvbnRyb2w+IENEPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gLCBhcyBhIDx1c2VyaW5wdXQ+Q0Q8L3VzZXJpbnB1dD4gZWxlbWVudCBjYW4gZ28gYmVmb3JlDQotYW5vdGhlciA8dXNlcmlucHV0PkNEPC91c2VyaW5wdXQ+IGVsZW1lbnQuPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5BZGQgQWZ0ZXI8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5BZGQgYSBjaGlsZCBlbGVtZW50LCBjb21tZW50LCBvciBwcm9jZXNzaW5nDQotaW5zdHJ1Y3Rpb24gdGhhdCBjYW4gZ28gYWZ0ZXIgdGhlIGl0ZW0geW91IGhhdmUgc2VsZWN0ZWQuIEZvciBleGFtcGxlLA0KLWlmIHlvdSBoYXZlIGEgcGFyZW50IGVsZW1lbnQgY2FsbGVkIDx1c2VyaW5wdXQ+Q0QgQ29sbGVjdGlvbnM8L3VzZXJpbnB1dD4gdGhhdA0KLWNhbiBjb250YWluIGFuIHVubGltaXRlZCBhbW91bnQgb2YgY2hpbGRyZW4gY2FsbGVkIDx1c2VyaW5wdXQ+Q0Q8L3VzZXJpbnB1dD4sDQoteW91IGNvdWxkIGNsaWNrIGEgPHVzZXJpbnB1dD5DRDwvdXNlcmlucHV0PiBlbGVtZW50IGFuZCBjbGljayAgPG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+QWRkIEFmdGVyPC91aWNvbnRyb2w+PHVpY29udHJvbD4gQ0Q8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiwNCi1hcyBhIDx1c2VyaW5wdXQ+Q0Q8L3VzZXJpbnB1dD4gZWxlbWVudCBjYW4gZ28gYWZ0ZXIgYW5vdGhlciA8dXNlcmlucHV0PkNEPC91c2VyaW5wdXQ+IGVsZW1lbnQuPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5SZXBsYWNlIFdpdGg8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5SZXBsYWNlIG9uZSBpdGVtIHdpdGggYW5vdGhlci4gVGhpcyBvcHRpb24gaXMNCi1ub3QgYXZhaWxhYmxlIGlmIHlvdSB0dXJuIGdyYW1tYXIgY29uc3RyYWludHMgb2ZmIG9yIGlmIHRoZXJlIGFyZQ0KLW5vIHZhbGlkIGFsdGVybmF0aXZlcyBmb3IgeW91IHRvIHJlcGxhY2UgdGhlIGl0ZW0gd2l0aC48L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGJvZHk+DQotPC90Z3JvdXA+DQotPC90YWJsZT48L2NvbnRleHQ+DQotPHJlc3VsdD48cD5BbnkgY2hhbmdlcyB5b3UgbWFrZSBpbiB0aGUgRGVzaWduIHZpZXcgYXJlIGFsc28gcmVmbGVjdGVkDQotaW4gdGhlIFNvdXJjZSB2aWV3IGFuZCB0aGUgT3V0bGluZSB2aWV3LjwvcD48bm90ZT5UaGVzZSBpbnN0cnVjdGlvbnMNCi13ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsNCi1pbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L25vdGU+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDY3ODE/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYzNzBlYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgd2l0aCBOb2RlIGFuZCBDb250ZW50IGNvbHVtbnMgYW5kIGEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBDb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLCB3aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoYXQgcGFydGljdWxhciBlbGVtZW50LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSB3aXRoIE5vZGUgYW5kIENvbnRlbnQgY29sdW1ucyBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgRGVzaWduIHZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBEZXNpZ24gdmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3htbGVkdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRkb2MuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRzY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRwcm9jLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9yeG1sYmljb25zLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHhlZHRkZXMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHhlZHRkZXMiPjxhIG5hbWU9InR4ZWR0ZGVzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlCi1YTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIHdpdGggTm9kZSBhbmQgQ29udGVudCBjb2x1bW5zIGFuZAotYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kCi1hdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLCB3aGlsZQotcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkCi1mb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Gb3IgZXhhbXBsZSwgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBjaGlsZDwvc3Bhbj4gbWVudQotaXRlbSB3aWxsIGxpc3Qgb25seSB0aG9zZSBlbGVtZW50cyBmcm9tIGEgRFREIG9yIFhNTCBzY2hlbWEgd2hpY2gKLXdvdWxkIGJlIHZhbGlkIGNoaWxkcmVuIGF0IHRoYXQgcG9pbnQuPC9wPgotPHA+V2hlbiB5b3UgaGF2ZSBhbiBYTUwKLWZpbGUgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBzY2hlbWEgb3IgRFREIGZpbGUsIGNlcnRhaW4gdGFncyBhbmQgcnVsZXMKLWZvciB0aGF0IGZpbGUgaGF2ZSBhbHJlYWR5IGJlZW4gZXN0YWJsaXNoZWQsIHdoaWNoIGlzIHdoeSB0aGUgRGVzaWduCi12aWV3IGNhbiBwcm92aWRlIHByb21wdHMgKHZpYSBhIHBvcC11cCBtZW51KSBmb3IgdGhvc2UgdGFncy4gV2hlbgoteW91IGNyZWF0ZSBhbiBYTUwgZmlsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIHNjaGVtYSBvcgotRFREIGZpbGUsIGl0IGhhcyBubyB0YWdzIG9yIHJ1bGVzIGFzc29jaWF0ZWQgd2l0aCBpdCwgc28gdGhlIERlc2lnbgotdmlldyBjYW5ub3QgcHJvdmlkZSBwcm9tcHRzIGZvciBzcGVjaWZpYyB0YWdzLCBidXQgaXQgY2FuIHByb3ZpZGUKLXByb21wdHMgdG8gY3JlYXRlIG5ldyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcy48L3A+Ci08cD5Gb3IgYW55IFhNTCBmaWxlCi1hc3NvY2lhdGVkIHdpdGggYW4gWE1MIHNjaGVtYSBvciBEVEQgZmlsZSwgeW91IGNhbiB1c2UgdGhlIERlc2lnbgotdmlldyB0byBhZGQgYW55IGl0ZW1zIGRlZmluZWQgaW4gdGhlIFhNTCBzY2hlbWEgb3IgRFREIChzdWNoIGFzIGVsZW1lbnRzCi1hbmQgYXR0cmlidXRlcykgdG8gdGhlIFhNTCBmaWxlLiBZb3UgY2FuIGFsc28gdXNlIGl0IHRvIGFkZCBwcm9jZXNzaW5nCi1pbnN0cnVjdGlvbnMgYW5kIGNvbW1lbnRzIHRvIGFsbCBYTUwgZmlsZXMuPC9wPgotPHA+VG8gb3BlbiBhbmQgZWRpdAotYSBYTUwgZmlsZSBpbiB0aGUgWE1MIGVkaXRvciwgcmlnaHQtY2xpY2sgdGhlIGZpbGUgaW4gdGhlIFByb2plY3QKLUV4cGxvcmVyIHZpZXcgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9wZW4gV2l0aCAmZ3Q7IFhNTCBFZGl0b3I8L3NwYW4+LgotSWYgbmVjZXNzYXJ5LCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVzaWduPC9zcGFuPiB0YWIgdG8gb3BlbgotdGhlIERlc2lnbiB2aWV3LjwvcD4KLTxwPlRvIGV4cGFuZCBhbGwgdGhlIGl0ZW1zIGluCi15b3VyIFhNTCBmaWxlLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXhwYW5kIEFsbDwvc3Bhbj4gYnV0dG9uPGltZyBzcmM9Ii4uL2ltYWdlcy9leHBhbmRfYWxsLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIEV4cGFuZCBBbGwmIzEwO2J1dHRvbiIgLz4gb24gdGhlIHRvcCByaWdodCBjb3JuZXIgb2YgdGhlIGVkaXRvci4gVG8gY29sbGFwc2UKLXRoZW0sIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db2xsYXBzZSBBbGw8L3NwYW4+IGJ1dHRvbjxpbWcgc3JjPSIuLi9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIENvbGxhcHNlJiMxMDtBbGwgYnV0dG9uIiAvPiBvbiB0aGUgdG9wIHJpZ2h0IGNvcm5lciBvZiB0aGUgZWRpdG9yLjwvcD4KLTxwPklmCi15b3UgcmlnaHQtY2xpY2sgdGhlIGl0ZW0gdGhhdCB5b3Ugd2FudCB0byB3b3JrIHdpdGgsIHNvbWUgb3IgYWxsIG9mCi10aGUgZm9sbG93aW5nIG9wdGlvbnMgKGFzIGFwcGxpY2FibGUpIHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gdGhlIHBvcC11cAotbWVudSB0aGF0IGFwcGVhcnM6PC9wPgotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+Ci08dGhlYWQgYWxpZ249ImxlZnQiPgotPHRyIHZhbGlnbj0iYm90dG9tIj4KLTx0aCB2YWxpZ249ImJvdHRvbSIgd2lkdGg9IjI0LjI0MjQyNDI0MjQyNDI0MiUiIGlkPSJOMTAwQkYiPlNlbGVjdCB0aGlzPC90aD4KLQotPHRoIHZhbGlnbj0iYm90dG9tIiB3aWR0aD0iNzUuNzU3NTc1NzU3NTc1NzUlIiBpZD0iTjEwMEM2Ij5JZiB5b3Ugd2FudCB0byBkbyB0aGlzPC90aD4KLQotPC90cj4KLQotPC90aGVhZD4KLQotPHRib2R5PgotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMjQyNDI0MjQyNDI0MjQyJSIgaGVhZGVycz0iTjEwMEJGICI+QWRkIERURCBJbmZvcm1hdGlvbjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9Ijc1Ljc1NzU3NTc1NzU3NTc1JSIgaGVhZGVycz0iTjEwMEM2ICI+QXNzb2NpYXRlIHRoZSBYTUwgZmlsZSB3aXRoIGEgRFRELjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjI0MjQyNDI0MjQyNDI0MiUiIGhlYWRlcnM9Ik4xMDBCRiAiPkVkaXQgRE9DVFlQRTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9Ijc1Ljc1NzU3NTc1NzU3NTc1JSIgaGVhZGVycz0iTjEwMEM2ICI+RWRpdCB0aGUgRE9DVFlQRSBkZWNsYXJhdGlvbi4gUmVmZXIgdG8gdGhlIHJlbGF0ZWQKLXRhc2sgZm9yIG1vcmUgZGV0YWlscy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJ0ZWR0ZG9jLmh0bWwiPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L2E+LjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjI0MjQyNDI0MjQyNDI0MiUiIGhlYWRlcnM9Ik4xMDBCRiAiPkVkaXQgTmFtZXNwYWNlczwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9Ijc1Ljc1NzU3NTc1NzU3NTc1JSIgaGVhZGVycz0iTjEwMEM2ICI+RWRpdCB0aGUgZXhpc3RpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIG9yIGNyZWF0ZQotYSBuZXcgYXNzb2NpYXRpb24gd2l0aCBhIG5hbWVzcGFjZS4gUmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFzayBmb3IKLW1vcmUgZGV0YWlscy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJ0ZWR0c2NoLmh0bWwiPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC9hPi48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBoZWFkZXJzPSJOMTAwQkYgIj5FZGl0IFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb248L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3NS43NTc1NzU3NTc1NzU3NSUiIGhlYWRlcnM9Ik4xMDBDNiAiPkVkaXQgdGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIFJlZmVyIHRvIHRoZQotcmVsYXRlZCB0YXNrIGZvciBtb3JlIGRldGFpbHMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0idGVkdHByb2MuaHRtbCI+RWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L2E+LjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjI0MjQyNDI0MjQyNDI0MiUiIGhlYWRlcnM9Ik4xMDBCRiAiPlJlbW92ZTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9Ijc1Ljc1NzU3NTc1NzU3NTc1JSIgaGVhZGVycz0iTjEwMEM2ICI+UmVtb3ZlIHRoZSBpdGVtIHRoYXQgeW91IGhhdmUgc2VsZWN0ZWQgZnJvbQotdGhlIFhNTCBmaWxlLiBJZiB0aGUgc2VsZWN0ZWQgaXRlbSBvciByZWxhdGVkIGl0ZW1zIGFyZSBkZWZpbmVkIHNvCi10aGF0IHRoZSBpdGVtIG11c3QgZXhpc3QgaW4gdGhlIGZpbGUsIHRoaXMgb3B0aW9uIHdpbGwgbm90IGJlIGF2YWlsYWJsZS4KLUZvciBleGFtcGxlLCBpbiB5b3VyIERURCwgaWYgeW91IGhhdmUgZGVjbGFyZWQgdGhhdCAiT25lIG9yIG1vcmUiCi1vZiB0aGUgaXRlbSBtdXN0IGFsd2F5cyBleGlzdCBpbiB5b3VyIFhNTCBmaWxlLCBhbmQgdGhlIGl0ZW0geW91IGhhdmUKLXNlbGVjdGVkIGlzIHRoZSBvbmx5IG9uZSB0aGF0IGV4aXN0cyBpbiB5b3VyIFhNTCBmaWxlLjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjI0MjQyNDI0MjQyNDI0MiUiIGhlYWRlcnM9Ik4xMDBCRiAiPkFkZCBBdHRyaWJ1dGU8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3NS43NTc1NzU3NTc1NzU3NSUiIGhlYWRlcnM9Ik4xMDBDNiAiPkFkZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGVsZW1lbnQgdGhhdCB5b3Ugc2VsZWN0ZWQuCi1BbnkgYXR0cmlidXRlcyB5b3UgYXJlIGFsbG93ZWQgdG8gYWRkIHRvIHRoZSBlbGVtZW50IHdpbGwgYmUgbGlzdGVkLgotQWZ0ZXIgeW91IGhhdmUgYWRkZWQgdGhlIGF0dHJpYnV0ZSB0byB0aGUgWE1MIGZpbGUsIHlvdSBjYW4gY2xpY2sKLWluIHRoZSByaWdodC1oYW5kIGNvbHVtbiB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuIElmCi10aGUgYXR0cmlidXRlIGhhcyBzZXQgdmFsdWVzLCB0aGV5IHdpbGwgYXBwZWFyIGluIGEgbGlzdC48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBoZWFkZXJzPSJOMTAwQkYgIj5BZGQgQ2hpbGQ8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3NS43NTc1NzU3NTc1NzU3NSUiIGhlYWRlcnM9Ik4xMDBDNiAiPkFkZCBhbm90aGVyIGVsZW1lbnQsIGEgY29tbWVudCwgb3IgYSBwcm9jZXNzaW5nCi1pbnN0cnVjdGlvbiBhcyBhIGNoaWxkIG9mIHRoZSBwYXJlbnQgZWxlbWVudC48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBoZWFkZXJzPSJOMTAwQkYgIj5BZGQgQmVmb3JlPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNzUuNzU3NTc1NzU3NTc1NzUlIiBoZWFkZXJzPSJOMTAwQzYgIj5BZGQgYSBjaGlsZCBlbGVtZW50LCBjb21tZW50LCBvciBwcm9jZXNzaW5nCi1pbnN0cnVjdGlvbiB0aGF0IGNhbiBnbyBiZWZvcmUgdGhlIGl0ZW0geW91IGhhdmUgc2VsZWN0ZWQuIEZvciBleGFtcGxlLAotaWYgeW91IGhhdmUgYSBwYXJlbnQgZWxlbWVudCBjYWxsZWQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRCBDb2xsZWN0aW9uczwva2JkPiB0aGF0Ci1jYW4gY29udGFpbiBhbiB1bmxpbWl0ZWQgYW1vdW50IG9mIGNoaWxkcmVuIGNhbGxlZCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkNEPC9rYmQ+LAoteW91IGNvdWxkIGNsaWNrIGEgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRDwva2JkPiBlbGVtZW50IGFuZCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEJlZm9yZTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj4gQ0Q8L3NwYW4+Ci08L3NwYW4+ICwgYXMgYSA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkNEPC9rYmQ+IGVsZW1lbnQgY2FuIGdvIGJlZm9yZQotYW5vdGhlciA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkNEPC9rYmQ+IGVsZW1lbnQuPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMjQyNDI0MjQyNDI0MjQyJSIgaGVhZGVycz0iTjEwMEJGICI+QWRkIEFmdGVyPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNzUuNzU3NTc1NzU3NTc1NzUlIiBoZWFkZXJzPSJOMTAwQzYgIj5BZGQgYSBjaGlsZCBlbGVtZW50LCBjb21tZW50LCBvciBwcm9jZXNzaW5nCi1pbnN0cnVjdGlvbiB0aGF0IGNhbiBnbyBhZnRlciB0aGUgaXRlbSB5b3UgaGF2ZSBzZWxlY3RlZC4gRm9yIGV4YW1wbGUsCi1pZiB5b3UgaGF2ZSBhIHBhcmVudCBlbGVtZW50IGNhbGxlZCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkNEIENvbGxlY3Rpb25zPC9rYmQ+IHRoYXQKLWNhbiBjb250YWluIGFuIHVubGltaXRlZCBhbW91bnQgb2YgY2hpbGRyZW4gY2FsbGVkIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+Q0Q8L2tiZD4sCi15b3UgY291bGQgY2xpY2sgYSA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkNEPC9rYmQ+IGVsZW1lbnQgYW5kIGNsaWNrICA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEFmdGVyPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPiBDRDwvc3Bhbj48L3NwYW4+LAotYXMgYSA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkNEPC9rYmQ+IGVsZW1lbnQgY2FuIGdvIGFmdGVyIGFub3RoZXIgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRDwva2JkPiBlbGVtZW50LjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjI0MjQyNDI0MjQyNDI0MiUiIGhlYWRlcnM9Ik4xMDBCRiAiPlJlcGxhY2UgV2l0aDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9Ijc1Ljc1NzU3NTc1NzU3NTc1JSIgaGVhZGVycz0iTjEwMEM2ICI+UmVwbGFjZSBvbmUgaXRlbSB3aXRoIGFub3RoZXIuIFRoaXMgb3B0aW9uIGlzCi1ub3QgYXZhaWxhYmxlIGlmIHlvdSB0dXJuIGdyYW1tYXIgY29uc3RyYWludHMgb2ZmIG9yIGlmIHRoZXJlIGFyZQotbm8gdmFsaWQgYWx0ZXJuYXRpdmVzIGZvciB5b3UgdG8gcmVwbGFjZSB0aGUgaXRlbSB3aXRoLjwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BbnkgY2hhbmdlcyB5b3UgbWFrZSBpbiB0aGUgRGVzaWduIHZpZXcgYXJlIGFsc28gcmVmbGVjdGVkCi1pbiB0aGUgU291cmNlIHZpZXcgYW5kIHRoZSBPdXRsaW5lIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRoZXNlIGluc3RydWN0aW9ucwotd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrCi1pbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L2Rpdj4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3htbGVkdC5odG1sIiB0aXRsZT0iVGhlIFhNTCBlZGl0b3IgaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBYTUwgZmlsZXMuIj5YTUwgZWRpdG9yPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiB0aXRsZT0iV2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMgYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS4iPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZSBkaXJlY3RseS4iPkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGRvYy5odG1sIiB0aXRsZT0iVGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4iPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0c2NoLmh0bWwiIHRpdGxlPSJZb3VyIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHByb3ZpZGUgdmFyaW91cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgWE1MIGZpbGUsIHN1Y2ggYXMgdGhlIFhNTCBzY2hlbWEgYW5kIG5hbWVzcGFjZSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIElmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHRoZSBzY2hlbWEgYW5kIG5hbWVzcGFjZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBvciBhZGQgYSBuZXcgYXNzb2NpYXRpb24uIE1vZGlmeWluZyBhbnkgYXNzb2NpYXRpb25zIGNhbiBpbXBhY3Qgd2hhdCBjb250ZW50IGlzIGFsbG93ZWQgaW4gdGhlIFhNTCBmaWxlLiI+RWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb248L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0cHJvYy5odG1sIiB0aXRsZT0iSWYgeW91IGhhdmUgaW5zdHJ1Y3Rpb25zIHlvdSB3YW50IHRvIHNlbmQgdG8gYW4gYXBwbGljYXRpb24gdXNpbmcgYW4gWE1MIGRvY3VtZW50LCB5b3UgY2FuIHVzZSBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIj5FZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVscmVmIj48c3Ryb25nPlJlbGF0ZWQgcmVmZXJlbmNlPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9yeG1sYmljb25zLmh0bWwiIHRpdGxlPSJUaGUgZm9sbG93aW5nIFhNTCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIGFuZCBEZXNpZ24gdmlldy4iPkljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHNyYy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHNyYy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE4ZmFjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRzcmMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHhlZHRzcmMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3PC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5FZGl0aW5nIGluIHRoZSBTb3VyY2Ugdmlldzwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZQ0KLWNvZGUgZGlyZWN0bHkuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+U291cmNlIHZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPiBUaGUgU291cmNlIHZpZXcgaGFzIG1hbnkgdGV4dCBlZGl0aW5nIGZlYXR1cmVzLCBzdWNoIGFzOjwvcD48ZGw+DQotPGRsZW50cnk+DQotPGR0PlN5bnRheCBoaWdobGlnaHRpbmc8L2R0Pg0KLTxkZD5FYWNoIHRhZyB0eXBlIGlzIGhpZ2hsaWdodGVkIGRpZmZlcmVudGx5LCBlbmFibGluZyB5b3UgdG8gZWFzaWx5IGZpbmQNCi1hIGNlcnRhaW4ga2luZCBvZiB0YWcgZm9yIGVkaXRpbmcuIEluIGFkZGl0aW9uLCBzeW50YXggaGlnaGxpZ2h0aW5nIGlzIHZhbHVhYmxlDQotaW4gbG9jYXRpbmcgc3ludGF4IGVycm9ycy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBiZWdpbiBhIGNvbW1lbnQgaW4gdGhlIG1pZGRsZQ0KLW9mIHRoZSBkb2N1bWVudCB3aXRoIDxjb2RlcGg+Jmx0OyEtLTwvY29kZXBoPiBldmVyeXRoaW5nIHVudGlsIHRoZSBuZXh0IDxjb2RlcGg+LS0+PC9jb2RlcGg+IGlzDQotY29uc2lkZXJlZCBhIGNvbW1lbnQsIGFuZCB3aWxsIGJlIGhpZ2hsaWdodGVkIGFjY29yZGluZ2x5LiBUaGUgbGFyZ2UgaGlnaGxpZ2h0ZWQNCi1hcmVhIHdpbGwgaW5kaWNhdGUgdGhhdCB5b3UgbmVlZCB0byBhZGQgPGNvZGVwaD4tLT48L2NvZGVwaD4gdG8gY2xvc2UgdGhlDQotY29tbWVudC48cD5Zb3UgY2FuIGN1c3RvbWl6ZSB0aGUgc3ludGF4IGhpZ2hsaWdodGluZy4gUmVmZXIgdG8gdGhlIHJlbGF0ZWQNCi10YXNrcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+PC9kZD4NCi08L2RsZW50cnk+PC9kbD48ZGw+PGRsZW50cnk+DQotPGR0PlVubGltaXRlZCB1bmRvIGFuZCByZWRvPC9kdD4NCi08ZGQ+VGhlc2Ugb3B0aW9ucyBhbGxvdyB5b3UgdG8gaW5jcmVtZW50YWxseSB1bmRvIGFuZCByZWRvIGV2ZXJ5IGNoYW5nZSBtYWRlDQotdG8gYSBmaWxlIGZvciB0aGUgZW50aXJlIGVkaXRpbmcgc2Vzc2lvbi4gRm9yIHRleHQsIGNoYW5nZXMgYXJlIGluY3JlbWVudGVkDQotb25lIGNoYXJhY3RlciBvciBzZXQgb2Ygc2VsZWN0ZWQgY2hhcmFjdGVycyBhdCBhIHRpbWUuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkNvbnRlbnQgYXNzaXN0PC9kdD4NCi08ZGQ+Q29udGVudCBhc3Npc3QgaGVscHMgeW91IGZpbmlzaCB0YWdzIGFuZCBpbnNlcnQgbWFjcm9zLiBSZWZlciB0byB0aGUgcmVsYXRlZA0KLXRhc2sgZm9yIG1vcmUgZGV0YWlscy48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+VGVtcGxhdGU8L2R0Pg0KLTxkZD5Zb3UgY2FuIGFjY2VzcyB0ZW1wbGF0ZXMgKHVzaW5nIGNvbnRlbnQgYXNzaXN0KSB0byBoZWxwIHlvdSBxdWlja2x5IGFkZA0KLXJlZ3VsYXJseS11c2VkIHRhZ2dpbmcgY29tYmluYXRpb25zLiBSZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrIGZvciBtb3JlIGRldGFpbHMuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0Pk5vZGUgc2VsZWN0aW9uPC9kdD4NCi08ZGQ+QmFzZWQgb24gdGhlIGxvY2F0aW9uIG9mIHlvdXIgY3Vyc29yIChvciBzZWxlY3Rpb24gaW4gdGhlIE91dGxpbmUgdmlldyksDQotdGhlIG5vZGUgc2VsZWN0aW9uIGluZGljYXRvciBoaWdobGlnaHRzIHRoZSBsaW5lIG51bWJlcnMgdGhhdCBpbmNsdWRlIGEgbm9kZQ0KLShmb3IgZXhhbXBsZSwgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUpLCBpbiB0aGUgdmVydGljYWwgcnVsZXIgaW4gdGhlIGxlZnQNCi1hcmVhIG9mIHRoZSBTb3VyY2Ugdmlldy48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+UG9wLXVwIG1lbnUgb3B0aW9uczwvZHQ+DQotPGRkPkZyb20gdGhlIGVkaXRvcidzIHBvcC11cCBtZW51LCB5b3UgaGF2ZSBtYW55IG9mIHRoZSBzYW1lIGVkaXRpbmcgb3B0aW9ucw0KLWF2YWlsYWJsZSBhcyB5b3UgZG8gZnJvbSB0aGUgd29ya2JlbmNoICA8Yj5FZGl0PC9iPiBtZW51LiBZb3UgY2FuIHNlbGVjdCBtZW51DQotb3B0aW9ucyBzdWNoIGFzOiA8dWljb250cm9sPkNsZWFudXAgRG9jdW1lbnQsPC91aWNvbnRyb2w+IHRvIG9wZW4gdGhlIDx1aWNvbnRyb2w+Q2xlYW51cDwvdWljb250cm9sPiANCi1kaWFsb2csIHdoaWNoIGNvbnRhaW5zIHNldHRpbmdzIHRvIHVwZGF0ZSBhIGRvY3VtZW50IHNvIHRoYXQgaXQgaXMgd2VsbC1mb3JtZWQNCi1hbmQgZm9ybWF0dGVkIGFuZCA8dWljb250cm9sPkZvcm1hdCw8L3VpY29udHJvbD4gd2hpY2ggZm9ybWF0cyBlaXRoZXIgdGhlDQotZW50aXJlIGRvY3VtZW50IG9yIHNlbGVjdGVkIGVsZW1lbnRzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD4iU21hcnQiIGRvdWJsZSBjbGlja2luZzwvZHQ+DQotPGRkPllvdSBjYW4gdXNlIGRvdWJsZS1jbGljayB0byBzZWxlY3QgYXR0cmlidXRlIHZhbHVlcywgYXR0cmlidXRlLXZhbHVlIHBhaXJzLA0KLWFuZCBlbnRpcmUgdGFnIHNldHMgdG8gcXVpY2tseSB1cGRhdGUsIGNvcHksIG9yIHJlbW92ZSBjb250ZW50LjwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+PHA+VG8gb3BlbiBhbiBYTUwgZmlsZSB0byBlZGl0LCByaWdodC1jbGljayB0aGUgZmlsZSBpbiB0aGUNCi1OYXZpZ2F0b3IgdmlldyBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+T3BlbiBXaXRoID4gWE1MIEVkaXRvcjwvdWljb250cm9sPi4gQ2xpY2sNCi10aGUgPHVpY29udHJvbD5Tb3VyY2U8L3VpY29udHJvbD4gdG8gc2VlIHRoZSBTb3VyY2Ugdmlldy48L3A+PHA+RWRpdCB0aGUgY29kZQ0KLWFzIG5lY2Vzc2FyeSwgdXNpbmcgYW55IG9mIHRoZSBhdmFpbGFibGUgZmVhdHVyZXMuIEFzIHlvdSBtb3ZlIHRoZSBjdXJzb3INCi13aXRoaW4geW91ciBYTUwgZmlsZSAob3Igc2VsZWN0IGl0ZW1zIGZyb20gdGhlIE91dGxpbmUgdmlldyksIHRoZSBub2RlIHNlbGVjdGlvbg0KLWluZGljYXRvciB3aWxsIGhpZ2hsaWdodCB0aGUgbGluZSBudW1iZXJzIHRoYXQgZW5jb21wYXNzIHRoZSBub2RlIChmb3IgZXhhbXBsZSwNCi1hbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSkuIFlvdSBjYW4gdXNlIHNtYXJ0IGRvdWJsZS1jbGlja2luZyBiZWhhdmlvciB0byBzZWxlY3QNCi1hdHRyaWJ1dGUgdmFsdWVzLCBhdHRyaWJ1dGUtdmFsdWUgcGFpcnMsIGFuZCBlbnRpcmUgdGFnIHNldHMgdG8gcXVpY2tseSB1cGRhdGUsDQotY29weSwgb3IgcmVtb3ZlIGNvbnRlbnQuIDw/UHViIENhcmV0Pz5JZiBkZXNpcmVkLCB2YWxpZGF0ZSBhbmQgc2F2ZSB0aGUgWE1MDQotZmlsZS48L3A+PC9jb250ZXh0Pg0KLTxyZXN1bHQ+PHA+QW55IGNoYW5nZXMgeW91IG1ha2UgaW4gdGhlIFNvdXJjZSB2aWV3IGFyZSBhbHNvIHJlZmxlY3RlZCBpbiB0aGUNCi1EZXNpZ24gdmlldyBhbmQgdGhlIE91dGxpbmUgdmlldy48L3A+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDM3ODE/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRzcmMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRzcmMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4MzllMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZSBkaXJlY3RseS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZSBkaXJlY3RseS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBTb3VyY2UgdmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIFNvdXJjZSB2aWV3IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdjZGFzdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdtYWNyby5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHRhZ2hpbHQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0eGVkdHNyYyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0eGVkdHNyYyI+PGEgbmFtZT0idHhlZHRzcmMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3PC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZQotY29kZSBkaXJlY3RseS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPiBUaGUgU291cmNlIHZpZXcgaGFzIG1hbnkgdGV4dCBlZGl0aW5nIGZlYXR1cmVzLCBzdWNoIGFzOjwvcD4KLTxkbD4KLQotPGR0IGNsYXNzPSJkbHRlcm0iPlN5bnRheCBoaWdobGlnaHRpbmc8L2R0PgotCi08ZGQ+RWFjaCB0YWcgdHlwZSBpcyBoaWdobGlnaHRlZCBkaWZmZXJlbnRseSwgZW5hYmxpbmcgeW91IHRvIGVhc2lseSBmaW5kCi1hIGNlcnRhaW4ga2luZCBvZiB0YWcgZm9yIGVkaXRpbmcuIEluIGFkZGl0aW9uLCBzeW50YXggaGlnaGxpZ2h0aW5nIGlzIHZhbHVhYmxlCi1pbiBsb2NhdGluZyBzeW50YXggZXJyb3JzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGJlZ2luIGEgY29tbWVudCBpbiB0aGUgbWlkZGxlCi1vZiB0aGUgZG9jdW1lbnQgd2l0aCA8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7IS0tPC9zYW1wPiBldmVyeXRoaW5nIHVudGlsIHRoZSBuZXh0IDxzYW1wIGNsYXNzPSJjb2RlcGgiPi0tJmd0Ozwvc2FtcD4gaXMKLWNvbnNpZGVyZWQgYSBjb21tZW50LCBhbmQgd2lsbCBiZSBoaWdobGlnaHRlZCBhY2NvcmRpbmdseS4gVGhlIGxhcmdlIGhpZ2hsaWdodGVkCi1hcmVhIHdpbGwgaW5kaWNhdGUgdGhhdCB5b3UgbmVlZCB0byBhZGQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+LS0mZ3Q7PC9zYW1wPiB0byBjbG9zZSB0aGUKLWNvbW1lbnQuPHA+WW91IGNhbiBjdXN0b21pemUgdGhlIHN5bnRheCBoaWdobGlnaHRpbmcuIFJlZmVyIHRvIHRoZSByZWxhdGVkCi10YXNrcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08L2RkPgotCi08L2RsPgotPGRsPgotPGR0IGNsYXNzPSJkbHRlcm0iPlVubGltaXRlZCB1bmRvIGFuZCByZWRvPC9kdD4KLQotPGRkPlRoZXNlIG9wdGlvbnMgYWxsb3cgeW91IHRvIGluY3JlbWVudGFsbHkgdW5kbyBhbmQgcmVkbyBldmVyeSBjaGFuZ2UgbWFkZQotdG8gYSBmaWxlIGZvciB0aGUgZW50aXJlIGVkaXRpbmcgc2Vzc2lvbi4gRm9yIHRleHQsIGNoYW5nZXMgYXJlIGluY3JlbWVudGVkCi1vbmUgY2hhcmFjdGVyIG9yIHNldCBvZiBzZWxlY3RlZCBjaGFyYWN0ZXJzIGF0IGEgdGltZS48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5Db250ZW50IGFzc2lzdDwvZHQ+Ci0KLTxkZD5Db250ZW50IGFzc2lzdCBoZWxwcyB5b3UgZmluaXNoIHRhZ3MgYW5kIGluc2VydCBtYWNyb3MuIFJlZmVyIHRvIHRoZSByZWxhdGVkCi10YXNrIGZvciBtb3JlIGRldGFpbHMuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+VGVtcGxhdGU8L2R0PgotCi08ZGQ+WW91IGNhbiBhY2Nlc3MgdGVtcGxhdGVzICh1c2luZyBjb250ZW50IGFzc2lzdCkgdG8gaGVscCB5b3UgcXVpY2tseSBhZGQKLXJlZ3VsYXJseS11c2VkIHRhZ2dpbmcgY29tYmluYXRpb25zLiBSZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrIGZvciBtb3JlIGRldGFpbHMuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+Tm9kZSBzZWxlY3Rpb248L2R0PgotCi08ZGQ+QmFzZWQgb24gdGhlIGxvY2F0aW9uIG9mIHlvdXIgY3Vyc29yIChvciBzZWxlY3Rpb24gaW4gdGhlIE91dGxpbmUgdmlldyksCi10aGUgbm9kZSBzZWxlY3Rpb24gaW5kaWNhdG9yIGhpZ2hsaWdodHMgdGhlIGxpbmUgbnVtYmVycyB0aGF0IGluY2x1ZGUgYSBub2RlCi0oZm9yIGV4YW1wbGUsIGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlKSwgaW4gdGhlIHZlcnRpY2FsIHJ1bGVyIGluIHRoZSBsZWZ0Ci1hcmVhIG9mIHRoZSBTb3VyY2Ugdmlldy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5Qb3AtdXAgbWVudSBvcHRpb25zPC9kdD4KLQotPGRkPkZyb20gdGhlIGVkaXRvcidzIHBvcC11cCBtZW51LCB5b3UgaGF2ZSBtYW55IG9mIHRoZSBzYW1lIGVkaXRpbmcgb3B0aW9ucwotYXZhaWxhYmxlIGFzIHlvdSBkbyBmcm9tIHRoZSB3b3JrYmVuY2ggIDxzdHJvbmc+RWRpdDwvc3Ryb25nPiBtZW51LiBZb3UgY2FuIHNlbGVjdCBtZW51Ci1vcHRpb25zIHN1Y2ggYXM6IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNsZWFudXAgRG9jdW1lbnQsPC9zcGFuPiB0byBvcGVuIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DbGVhbnVwPC9zcGFuPiAKLWRpYWxvZywgd2hpY2ggY29udGFpbnMgc2V0dGluZ3MgdG8gdXBkYXRlIGEgZG9jdW1lbnQgc28gdGhhdCBpdCBpcyB3ZWxsLWZvcm1lZAotYW5kIGZvcm1hdHRlZCBhbmQgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Rm9ybWF0LDwvc3Bhbj4gd2hpY2ggZm9ybWF0cyBlaXRoZXIgdGhlCi1lbnRpcmUgZG9jdW1lbnQgb3Igc2VsZWN0ZWQgZWxlbWVudHMuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+IlNtYXJ0IiBkb3VibGUgY2xpY2tpbmc8L2R0PgotCi08ZGQ+WW91IGNhbiB1c2UgZG91YmxlLWNsaWNrIHRvIHNlbGVjdCBhdHRyaWJ1dGUgdmFsdWVzLCBhdHRyaWJ1dGUtdmFsdWUgcGFpcnMsCi1hbmQgZW50aXJlIHRhZyBzZXRzIHRvIHF1aWNrbHkgdXBkYXRlLCBjb3B5LCBvciByZW1vdmUgY29udGVudC48L2RkPgotCi08L2RsPgotPHA+VG8gb3BlbiBhbiBYTUwgZmlsZSB0byBlZGl0LCByaWdodC1jbGljayB0aGUgZmlsZSBpbiB0aGUKLU5hdmlnYXRvciB2aWV3IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3BlbiBXaXRoICZndDsgWE1MIEVkaXRvcjwvc3Bhbj4uIENsaWNrCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U291cmNlPC9zcGFuPiB0byBzZWUgdGhlIFNvdXJjZSB2aWV3LjwvcD4KLTxwPkVkaXQgdGhlIGNvZGUKLWFzIG5lY2Vzc2FyeSwgdXNpbmcgYW55IG9mIHRoZSBhdmFpbGFibGUgZmVhdHVyZXMuIEFzIHlvdSBtb3ZlIHRoZSBjdXJzb3IKLXdpdGhpbiB5b3VyIFhNTCBmaWxlIChvciBzZWxlY3QgaXRlbXMgZnJvbSB0aGUgT3V0bGluZSB2aWV3KSwgdGhlIG5vZGUgc2VsZWN0aW9uCi1pbmRpY2F0b3Igd2lsbCBoaWdobGlnaHQgdGhlIGxpbmUgbnVtYmVycyB0aGF0IGVuY29tcGFzcyB0aGUgbm9kZSAoZm9yIGV4YW1wbGUsCi1hbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSkuIFlvdSBjYW4gdXNlIHNtYXJ0IGRvdWJsZS1jbGlja2luZyBiZWhhdmlvciB0byBzZWxlY3QKLWF0dHJpYnV0ZSB2YWx1ZXMsIGF0dHJpYnV0ZS12YWx1ZSBwYWlycywgYW5kIGVudGlyZSB0YWcgc2V0cyB0byBxdWlja2x5IHVwZGF0ZSwKLWNvcHksIG9yIHJlbW92ZSBjb250ZW50LiBJZiBkZXNpcmVkLCB2YWxpZGF0ZSBhbmQgc2F2ZSB0aGUgWE1MCi1maWxlLjwvcD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BbnkgY2hhbmdlcyB5b3UgbWFrZSBpbiB0aGUgU291cmNlIHZpZXcgYXJlIGFsc28gcmVmbGVjdGVkIGluIHRoZQotRGVzaWduIHZpZXcgYW5kIHRoZSBPdXRsaW5lIHZpZXcuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIHRpdGxlPSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSB3aXRoIE5vZGUgYW5kIENvbnRlbnQgY29sdW1ucyBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIj5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Y2Rhc3QuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmlzaCBhIHRhZyBvciBsaW5lIG9mIGNvZGUgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBZb3UgY2FuIGFsc28gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGluc2VydCB0ZW1wbGF0ZXMgaW50byB5b3VyIFhNTCBjb2RlLiI+VXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdtYWNyby5odG1sIiB0aXRsZT0iWE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBzZWN0aW9uIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgbWF5IGZpbmQgYSB0ZW1wbGF0ZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLiI+V29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90dGFnaGlsdC5odG1sIiB0aXRsZT0iSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdmFyaW91cyBhc3BlY3RzIG9mIGhvdyB0aGUgWE1MIHNvdXJjZSBjb2RlIGlzIGRpc3BsYXllZCBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsIHN1Y2ggYXMgdGhlIGNvbG9ycyB0aGUgdGFncyB3aWxsIGJlIGRpc3BsYXllZCBpbi4iPlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHRhZy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHRhZy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTY1ZmYwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHR0YWcuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHhlZHR0YWciIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgWE1MIGZpbGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5FZGl0aW5nIFhNTCBmaWxlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+WE1MIGZpbGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPmVkaXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRvIG9wZW4gYW4gWE1MIGZpbGUgaW4gdGhlIFhNTCBlZGl0b3IsIHJpZ2h0LWNsaWNrIGl0IGluIHRoZSBOYXZpZ2F0b3INCi12aWV3IGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+T3BlbiBXaXRoPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwNCi1FZGl0b3I8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi4gPC9wPjxwPldlIHJlY29tbWVuZCB3b3JraW5nIGluIHRoZSBSZXNvdXJjZQ0KLXBlcnNwZWN0aXZlIHdoZW4geW91IGFyZSBkZXZlbG9waW5nIFhNTCBmaWxlcy4gVGhlIHZpZXdzIHRoYXQgYXBwZWFyIGJ5IGRlZmF1bHQNCi1pbiB0aGlzIHBlcnNwZWN0aXZlIChzdWNoIGFzIHRoZSBPdXRsaW5lIHZpZXcpIGhlbHAgZmFjaWxpdGF0ZSBYTUwgZGV2ZWxvcG1lbnQuPC9wPjxwPlRoZQ0KLVhNTCBlZGl0b3IgZW5hYmxlcyB5b3UgdG8gZGlyZWN0bHkgZWRpdCBYTUwgZmlsZXMuIFRoZXJlIGFyZSBzZXZlcmFsIGRpZmZlcmVudA0KLXZpZXdzIHlvdSBjYW4gdXNlIHRvIGVkaXQgeW91ciBmaWxlczo8L3A+PHVsPg0KLTxsaT48Yj5Tb3VyY2UgdmlldzwvYj46IHlvdSBjYW4gbWFudWFsbHkgaW5zZXJ0LCBlZGl0LCBhbmQgZGVsZXRlIGVsZW1lbnRzDQotYW5kIGF0dHJpYnV0ZXMgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBUbyBmYWNpbGl0YXRlIHRoaXMgZWZmb3J0LA0KLXlvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHdoaWxlIHlvdSBhcmUgaW4gdGhlIFNvdXJjZSB2aWV3LjwvbGk+DQotPGxpPjxiPkRlc2lnbiB2aWV3PC9iPjogeW91IGNhbiBpbnNlcnQsIGRlbGV0ZSwgYW5kIGVkaXQgZWxlbWVudHMsIGF0dHJpYnV0ZXMsDQotY29tbWVudHMsIGFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBpbiB0aGlzIHZpZXcuPC9saT4NCi08bGk+PGI+T3V0bGluZSB2aWV3PC9iPjogeW91IGNhbiBpbnNlcnQgYW5kIGRlbGV0ZSBlbGVtZW50cyBhdHRyaWJ1dGVzLCBjb21tZW50cywNCi1hbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgaW4gdGhpcyB2aWV3LjwvbGk+DQotPC91bD48cD5PZnRlbiwgeW91IG1heSBmaW5kIHRoYXQgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSB3YXkgdG8gcGVyZm9ybSBhIHNwZWNpZmljDQotdGFzay4gRm9yIGV4YW1wbGUsIHlvdSBoYXZlIGFuIFhNTCBmaWxlICJNeVNjaG9vbFN1YmplY3RzLnhtbCIgYXNzb2NpYXRlZA0KLXdpdGggYW4gWE1MIHNjaGVtYSBmaWxlICJTY2hvb2xTdWJqZWN0cy54c2QiLCB3aGljaCBsaXN0IGFsbCB0aGUgc3ViamVjdHMNCi10YXVnaHQgaW4gYSBzY2hvb2wuIFlvdSB3YW50IHRvIGluc2VydCBhIG5ldyBlbGVtZW50ICJNYXRoIiBpbnRvIHlvdXIgZmlsZS4NCi1Zb3UgY2FuIGRvIHNvIGluIHRoZSBmb2xsb3dpbmcgd2F5czo8L3A+PHVsPg0KLTxsaT5JbiB0aGUgT3V0bGluZSBvciBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlIGFwcHJvcHJpYXRlIHBhcmVudCBlbGVtZW50DQotYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5BZGQgQ2hpbGQ8L3VpY29udHJvbD48dWljb250cm9sPk1hdGg8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBvciA8dWljb250cm9sPk5ldyBFbGVtZW50PC91aWNvbnRyb2w+IGFuZCBlbnRlciB0aGUgbmFtZSBvZg0KLXRoZSBjaGlsZCBlbGVtZW50PD9QdWIgQ2FyZXQ/Pi48L2xpPg0KLTxsaT5JbiB0aGUgU291cmNlIHZpZXcsIHVzZSBjb250ZW50IGFzc2lzdCB0byBoZWxwIHlvdSBmaW5kIHRoZSBhcHByb3ByaWF0ZQ0KLWxvY2F0aW9uIGFuZCBjb2RlIGZvciB0aGUgPHVpY29udHJvbD5NYXRoPC91aWNvbnRyb2w+IGVsZW1lbnQuPC9saT4NCi08bGk+SW4gdGhlIFNvdXJjZSB2aWV3LCB0eXBlIHRoZSBjb2RlIGZvciB0aGUgPHVpY29udHJvbD5NYXRoPC91aWNvbnRyb2w+IGVsZW1lbnQNCi1pbiB0aGUgZmlsZS48L2xpPg0KLTwvdWw+PC9jb250ZXh0Pg0KLTxwb3N0cmVxPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjUzMD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHRhZy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHRhZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjUzYjdkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHR0YWcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgWE1MIGZpbGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIFhNTCBmaWxlcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGVkaXRpbmcgWE1MIGZpbGVzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIFhNTCBmaWxlcywgZWRpdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIFhNTCBmaWxlcywgZWRpdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3htbGVkdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHhlZHR0YWciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIFhNTCBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHhlZHR0YWciPjxhIG5hbWU9InR4ZWR0dGFnIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIFhNTCBmaWxlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGVkaXRpbmcgWE1MIGZpbGVzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gb3BlbiBhbiBYTUwgZmlsZSBpbiB0aGUgWE1MIGVkaXRvciwgcmlnaHQtY2xpY2sgaXQgaW4gdGhlIE5hdmlnYXRvcgotdmlldyBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3BlbiBXaXRoPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotRWRpdG9yPC9zcGFuPjwvc3Bhbj4uIDwvcD4KLTxwPldlIHJlY29tbWVuZCB3b3JraW5nIGluIHRoZSBSZXNvdXJjZQotcGVyc3BlY3RpdmUgd2hlbiB5b3UgYXJlIGRldmVsb3BpbmcgWE1MIGZpbGVzLiBUaGUgdmlld3MgdGhhdCBhcHBlYXIgYnkgZGVmYXVsdAotaW4gdGhpcyBwZXJzcGVjdGl2ZSAoc3VjaCBhcyB0aGUgT3V0bGluZSB2aWV3KSBoZWxwIGZhY2lsaXRhdGUgWE1MIGRldmVsb3BtZW50LjwvcD4KLTxwPlRoZQotWE1MIGVkaXRvciBlbmFibGVzIHlvdSB0byBkaXJlY3RseSBlZGl0IFhNTCBmaWxlcy4gVGhlcmUgYXJlIHNldmVyYWwgZGlmZmVyZW50Ci12aWV3cyB5b3UgY2FuIHVzZSB0byBlZGl0IHlvdXIgZmlsZXM6PC9wPgotPHVsPgotPGxpPjxzdHJvbmc+U291cmNlIHZpZXc8L3N0cm9uZz46IHlvdSBjYW4gbWFudWFsbHkgaW5zZXJ0LCBlZGl0LCBhbmQgZGVsZXRlIGVsZW1lbnRzCi1hbmQgYXR0cmlidXRlcyBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFRvIGZhY2lsaXRhdGUgdGhpcyBlZmZvcnQsCi15b3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCB3aGlsZSB5b3UgYXJlIGluIHRoZSBTb3VyY2Ugdmlldy48L2xpPgotCi08bGk+PHN0cm9uZz5EZXNpZ24gdmlldzwvc3Ryb25nPjogeW91IGNhbiBpbnNlcnQsIGRlbGV0ZSwgYW5kIGVkaXQgZWxlbWVudHMsIGF0dHJpYnV0ZXMsCi1jb21tZW50cywgYW5kIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGluIHRoaXMgdmlldy48L2xpPgotCi08bGk+PHN0cm9uZz5PdXRsaW5lIHZpZXc8L3N0cm9uZz46IHlvdSBjYW4gaW5zZXJ0IGFuZCBkZWxldGUgZWxlbWVudHMgYXR0cmlidXRlcywgY29tbWVudHMsCi1hbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgaW4gdGhpcyB2aWV3LjwvbGk+Ci0KLTwvdWw+Ci08cD5PZnRlbiwgeW91IG1heSBmaW5kIHRoYXQgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSB3YXkgdG8gcGVyZm9ybSBhIHNwZWNpZmljCi10YXNrLiBGb3IgZXhhbXBsZSwgeW91IGhhdmUgYW4gWE1MIGZpbGUgIk15U2Nob29sU3ViamVjdHMueG1sIiBhc3NvY2lhdGVkCi13aXRoIGFuIFhNTCBzY2hlbWEgZmlsZSAiU2Nob29sU3ViamVjdHMueHNkIiwgd2hpY2ggbGlzdCBhbGwgdGhlIHN1YmplY3RzCi10YXVnaHQgaW4gYSBzY2hvb2wuIFlvdSB3YW50IHRvIGluc2VydCBhIG5ldyBlbGVtZW50ICJNYXRoIiBpbnRvIHlvdXIgZmlsZS4KLVlvdSBjYW4gZG8gc28gaW4gdGhlIGZvbGxvd2luZyB3YXlzOjwvcD4KLTx1bD4KLTxsaT5JbiB0aGUgT3V0bGluZSBvciBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlIGFwcHJvcHJpYXRlIHBhcmVudCBlbGVtZW50Ci1hbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIENoaWxkPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1hdGg8L3NwYW4+Ci08L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldyBFbGVtZW50PC9zcGFuPiBhbmQgZW50ZXIgdGhlIG5hbWUgb2YKLXRoZSBjaGlsZCBlbGVtZW50LjwvbGk+Ci0KLTxsaT5JbiB0aGUgU291cmNlIHZpZXcsIHVzZSBjb250ZW50IGFzc2lzdCB0byBoZWxwIHlvdSBmaW5kIHRoZSBhcHByb3ByaWF0ZQotbG9jYXRpb24gYW5kIGNvZGUgZm9yIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXRoPC9zcGFuPiBlbGVtZW50LjwvbGk+Ci0KLTxsaT5JbiB0aGUgU291cmNlIHZpZXcsIHR5cGUgdGhlIGNvZGUgZm9yIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXRoPC9zcGFuPiBlbGVtZW50Ci1pbiB0aGUgZmlsZS48L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iIC8+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSB3aXRoIE5vZGUgYW5kIENvbnRlbnQgY29sdW1ucyBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIj5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eG1sY2F0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4bWxjYXQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmZjgyZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4bWxjYXQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwOCwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgU3R5IF9kaXNwbGF5IEZvbnRDb2xvcj0icmVkIj8+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idHhtbGNhdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2c8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WE1MIENhdGFsb2cgZW50cmllcyBhcmUgdXNlZCB0byBtYXAgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZXMNCi10byBsb2NhbGx5IGRlZmluZWQgcmVzb3VyY2VzLiBZb3UgY2FuIHByb3ZpZGUgcnVsZXMgc3BlY2lmeSBob3cgdGhlc2UNCi1lbnRpdGllcyBhcmUgcmVzb2x2ZWQ8L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgY2F0YWxvZzxpbmRleHRlcm0+YWRkaW5nIGVudHJpZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPkZvciBkZXRhaWxzIG9uIHRoZSBzdGFuZGFyZCBmb3IgWE1MIENhdGFsb2dzLCBzZWU6IDx4cmVmDQotaHJlZj0iaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2Rvd25sb2FkLnBocC8xNDgwOS94bWwtY2F0YWxvZ3MuaHRtbCINCi1zY29wZT0iZXh0ZXJuYWwiPjwveHJlZj4uPC9wPjxwPkZvciBleGFtcGxlOiB5b3UgYXJlIHdvcmtpbmcgb24gYW4NCi1YTUwgZmlsZSBvbiBhIGNvbXB1dGVyIGFuZCBwb2ludCBpdHMgPGNvZGVwaD5zY2hlbWFMb2NhdGlvbjwvY29kZXBoPiB0b3dhcmRzDQotYSBzY2hlbWEgY2FsbGVkIDxjb2RlcGg+YzpcTXlTY2hlbWEueHNkPC9jb2RlcGg+LiBJZiB5b3UgZG8gbm90IHVzZQ0KLWFuIFhNTCBjYXRhbG9nLCB0aGVuIHdoZW4geW91IGZpbmlzaCBlZGl0aW5nIHRoZSBYTUwgZmlsZSBhbmQgYXJlDQotcmVhZHkgdG8gcHVibGlzaCBpdCBvbiB0aGUgV2ViLCB5b3Ugd2lsbCBuZWVkIHRvIGVkaXQgPGNvZGVwaD5zY2hlbWFMb2NhdGlvbjwvY29kZXBoPiBzbw0KLXRoYXQgaXQgcG9pbnRzIHRvIGEgcmVzb3VyY2UgdGhhdCBpcyBhY2Nlc3NpYmxlIG9uIHRoZSBXZWIuPC9wPjxwPlRvDQotYXZvaWQgbWFraW5nIGZyZXF1ZW50IGNoYW5nZXMgdG8geW91ciBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gdXNlIHRoZQ0KLVhNTCBDYXRhbG9nOiB5b3UgY291bGQgc3BlY2lmeSBhIHJ1bGUgdGhhdCByZWRpcmVjdHMgYW4gSW50ZXJuZXQgcmVzb3VyY2UNCi1yZWZlcmVuY2UgKGZvciBleGFtcGxlLCAgPGNvZGVwaD4iaHR0cDovL3d3dy5pYm0uY29tL3B1Ymxpc2hlZC1zY2hlbWFzL015U2NoZW1hLnhzZCI8L2NvZGVwaD4pDQotc28gdGhhdCBpdCBwb2ludHMgdG8gYSByZXNvdXJjZSBvbiB0aGUgbG9jYWwgbWFjaGluZSAoZm9yIGV4YW1wbGUsDQotIDxjb2RlcGg+ImZpbGU6Ly8vQzovTXlTY2hlbWEueHNkIjwvY29kZXBoPikuIE5vdywgaW5zdGVhZCBvZiBmcmVxdWVudGx5DQotZWRpdGluZyBYTUwgZG9jdW1lbnRzIHRvIHVwZGF0ZSB0aGUgVVJJcyBvciBsb2NhdGlvbnMgKGVzcGVjaWFsbHkNCi13aGVuIHRoZXJlIGFyZSBtYW55IGRvY3VtZW50cyBpbiB5b3VyIHByb2plY3QpLCB5b3Ugb25seSBuZWVkIHRvIHVwZGF0ZQ0KLWEgc2luZ2xlIHJ1bGUgaW4geW91ciBYTUwgQ2F0YWxvZy48L3A+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMNCi13ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsNCi1pbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gYWRkIGFuIGVudHJ5IHRvIHRoZSBYTUwgQ2F0YWxvZywNCi1mb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHRoZSBYTUwgZmlsZSB0aGF0IHlvdSB3YW50IHRvIGFzc29jaWF0ZSB3aXRoIGEgRFREDQotb3IgWE1MIHNjaGVtYS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayAgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+WE1MPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5YTUwgQ2F0YWxvZzwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjxpbmZvPlRoZSAgPHVpY29udHJvbD5YTUwNCi1DYXRhbG9nIEVudHJpZXM8L3VpY29udHJvbD4gc2VjdGlvbiBjb250YWlucyBhIGxpc3Qgb2YgYW55IHVzZXItZGVmaW5lZA0KLWFuZCBwbHVnLWluIGRlZmluZWQgY2F0YWxvZyBlbnRyaWVzLiBTZWxlY3QgYW55IGVudHJ5IHRvIHNlZSBpbmZvcm1hdGlvbg0KLWFib3V0IGl0IGluIHRoZSA8dWljb250cm9sPkRldGFpbHM8L3VpY29udHJvbD4gc2VjdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5BZGQ8L3VpY29udHJvbD4gdG8gY3JlYXRlIGEgbmV3IGNhdGFsb2cNCi1lbnRyeS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgbGVmdC1oYW5kIGNvbHVtbiwgY2xpY2sgdGhlIHR5cGUgb2YgY2F0YWxvZyBlbnRyeQ0KLXRoYXQgeW91IHdhbnQgdG8gYWRkOjwvY21kPg0KLTxjaG9pY2V0YWJsZT4NCi08Y2hyb3c+PGNob3B0aW9uPkNhdGFsb2cgRW50cnk8L2Nob3B0aW9uPjxjaGRlc2M+VXNlZCBieSBhbiBYTUwgcHJvY2Vzc29yDQotd2hlbiByZXNvbHZpbmcgZW50aXR5IHJlZmVyZW5jZXMuIFlvdSBjYW4gcHJvdmlkZSBydWxlcyB0byB0aGUgY2F0YWxvZw0KLXRvIHNwZWNpZnkgaG93IGVudGl0aWVzIHNob3VsZCBiZSByZXNvbHZlZC48cD5BbiBYTUwgQ2F0YWxvZyBlbnRyeQ0KLWNvbnRhaW5zIHR3byBwYXJ0czo8dWw+DQotPGxpPkEga2V5ICh3aGljaCByZXByZXNlbnRzIGEgRFREIG9yIFhNTCBzY2hlbWEpPC9saT4NCi08bGk+QSBsb2NhdGlvbiAoc2ltaWxhciB0byBhIFVSSSwgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQNCi1hIERURCBvciBYTUwgc2NoZW1hJ3MgbG9jYXRpb24pLjwvbGk+DQotPC91bD4gWW91IGNhbiBwbGFjZSB0aGUgS2V5IGluIGFuIFhNTCBmaWxlLiBXaGVuIHRoZSBYTUwgcHJvY2Vzc29yDQotZW5jb3VudGVycyBpdCwgaXQgd2lsbCB1c2UgdGhlIFhNTCBDYXRhbG9nIGVudHJ5IHRvIGZpbmQgdGhlIGxvY2F0aW9uDQotb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGUgS2V5PC9wPjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5SZXdyaXRlIEVudHJ5PC9jaG9wdGlvbj48Y2hkZXNjPlVzZWQgdG8gcmVkaXJlY3QNCi1hIHNldCBvZiBlbnRpdGllcy48L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+U3VmZml4IEVudHJ5PC9jaG9wdGlvbj48Y2hkZXNjPlVzZWQgdG8gbWF0Y2ggdGhlDQotc3VmZml4IG9mIGEgVVJJIG9yIHN5c3RlbUlELjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5OZXh0IENhdGFsb2c8L2Nob3B0aW9uPjxjaGRlc2M+VXNlZCB0byByZWZlciB0byBhbm90aGVyDQotY2F0YWxvZyB3aXRob3V0IGltcG9ydGluZyBpdCBpbnRvIHRoZSB3b3JrYmVuY2guPC9jaGRlc2M+PC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkRlbGVnYXRlIENhdGFsb2c8L2Nob3B0aW9uPjxjaGRlc2M+VXNlZCB0byBhc3NvY2lhdGUNCi1hbiBhbHRlcm5hdGUgY2F0YWxvZyB3aXRoIGFuIGlkZW50aWZpZXIuPC9jaGRlc2M+PC9jaHJvdz4NCi08L2Nob2ljZXRhYmxlPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNvbXBsZXRlIHRoZSBmaWVsZHMgZm9yIHRoZSBjYXRhbG9nIGVudHJ5IHRoYXQgeW91IHNlbGVjdGVkOjwvY21kPg0KLTxpbmZvPjx0YWJsZT48dGl0bGU+IENhdGE8P1B1YiBDYXJldD8+bG9nIGVudHJ5IHR5cGVzIGFuZCBhc3NvY2lhdGVkDQotZmllbGRzPC90aXRsZT4NCi08dGdyb3VwIGNvbHM9IjIiPjxjb2xzcGVjIGNvbG5hbWU9ImNvbDEiLz48Y29sc3BlYyBjb2xuYW1lPSJjb2wyIi8+DQotPHRoZWFkPg0KLTxyb3cgdmFsaWduPSJib3R0b20iPg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5DYXRhbG9nIHR5cGU8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5GaWVsZHM8L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGhlYWQ+DQotPHRib2R5Pg0KLTxyb3c+DQotPGVudHJ5IGNoYXI9Ii4iIGNvbG5hbWU9ImNvbDEiPkNhdGFsb2cgRW50cnk8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj48dWw+DQotPGxpPkluIHRoZSA8dWljb250cm9sPkxvY2F0aW9uPC91aWNvbnRyb2w+IGZpZWxkLCBlbnRlciBvciBicm93c2UNCi1mb3IgdGhlIGxvY2F0aW9uIG9yIFVSSSBvZiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgZmlsZS4gVGhpcyB1c2VzIHlvdXINCi1jb21wdXRlcidzIHBhdGggc3R5bGUgdG8gZGVzY3JpYmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaWxlLiA8L2xpPg0KLTxsaT5TZWxlY3QgYSA8dWljb250cm9sPktleSBUeXBlPC91aWNvbnRyb2w+Ojx1bD4NCi08bGk+SWYgeW91IHNwZWNpZmllZCBhIERURDogc2VsZWN0IDx1aWNvbnRyb2w+UHVibGljIElEPC91aWNvbnRyb2w+LCA8dWljb250cm9sPlN5c3RlbQ0KLUlEPC91aWNvbnRyb2w+LCBvciA8dWljb250cm9sPlVSSTwvdWljb250cm9sPiBmcm9tIHRoZSA8dWljb250cm9sPktleQ0KLVR5cGU8L3VpY29udHJvbD4gZmllbGQuIElmIHlvdSBzZWxlY3QgPHVpY29udHJvbD5QdWJsaWMgSUQsPC91aWNvbnRyb2w+IHRoZQ0KLXZhbHVlIHlvdSBlbnRlciBpbiB0aGUgPHVpY29udHJvbD5LZXk8L3VpY29udHJvbD4gZmllbGQgc2hvdWxkIGJlDQotdGhlIHNhbWUgYXMgdGhlIFB1YmxpYyBJRCBpbiB0aGUgWE1MIGZpbGUncyBET0NUWVBFIGRlY2xhcmF0aW9uLiBJZg0KLXlvdSBzZWxlY3QgPHVpY29udHJvbD5TeXN0ZW0gSUQ8L3VpY29udHJvbD4sIHRoZSB2YWx1ZSB5b3UgZW50ZXIgc2hvdWxkDQotY29ycmVzcG9uZCB0byB0aGUgU3lzdGVtIElEIGluIGFuIFhNTCBmaWxlJ3MgRE9DVFlQRSBkZWNsYXJhdGlvbi4NCi1JZiB5b3Ugc2VsZWN0IDx1aWNvbnRyb2w+VVJJPC91aWNvbnRyb2w+LCB0aGUgdmFsdWUgeW91IGVudGVyIG11c3QNCi1iZSBhIGZ1bGx5IHF1YWxpZmllZCBVUkkuPC9saT4NCi08bGk+SWYgeW91IHNwZWNpZmllZCBhbiBYTUwgc2NoZW1hOiBzZWxlY3QgZWl0aGVyIDx1aWNvbnRyb2w+TmFtZXNwYWNlDQotTmFtZTwvdWljb250cm9sPiBvciAgPHVpY29udHJvbD5TY2hlbWEgTG9jYXRpb248L3VpY29udHJvbD4gZnJvbSB0aGUgPHVpY29udHJvbD5LZXkNCi1UeXBlPC91aWNvbnRyb2w+IGZpZWxkLiBJZiB0aGUgc2NoZW1hIGRlZmluZXMgYSB0YXJnZXQgbmFtZXNwYWNlLA0KLWl0IHdpbGwgYXV0b21hdGljYWxseSBhcHBlYXIgaW4gdGhlIDx1aWNvbnRyb2w+S2V5PC91aWNvbnRyb2w+IGZpZWxkLg0KLU90aGVyd2lzZSwgeW91IGNhbiBlbnRlciB0aGUgc2NoZW1hIGxvY2F0aW9uIGluIHRoZSA8dWljb250cm9sPktleTwvdWljb250cm9sPiBmaWVsZC48L2xpPg0KLTwvdWw+PC9saT4NCi08bGk+U2VsZWN0IHRoZSA8dWljb250cm9sPlNwZWNpZnkgYWx0ZXJuYXRpdmUgV2ViIGFkZHJlc3M8L3VpY29udHJvbD4gY2hlY2sNCi1ib3ggaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IGFuIGFsdGVybmF0ZSBXZWIgYWRkcmVzcyBmb3INCi10aGUgcmVzb3VyY2UuIDxwPlRoaXMgV2ViIGFkZHJlc3MgaXMgdXNlZCB3aGVuIGFuIFhNTCBpbnN0YW5jZSBpcw0KLWdlbmVyYXRlZCBmcm9tIHRoaXMgY2F0YWxvZyBlbnRyeS48bm90ZT5UaGlzIG9wdGlvbiBpcyBvbmx5IGF2YWlsYWJsZQ0KLWlmIHlvdSBzZWxlY3QgPHVpY29udHJvbD5QdWJsaWMgSUQ8L3VpY29udHJvbD4gKGZvciBhIERURCkgb3IgIDx1aWNvbnRyb2w+TmFtZXNwYWNlDQotTmFtZTwvdWljb250cm9sPiAoZm9yIGEgc2NoZW1hKSBpbiB0aGUgIDx1aWNvbnRyb2w+S2V5IHR5cGU8L3VpY29udHJvbD4gZmllbGQuPC9ub3RlPjwvcD48L2xpPg0KLTwvdWw+PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjaGFyPSIuIiBjb2xuYW1lPSJjb2wxIj5SZXdyaXRlIEVudHJ5PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+PHVsPg0KLTxsaT5TZWxlY3QgYSA8dWljb250cm9sPktleSB0eXBlIHRvIG1hdGNoPC91aWNvbnRyb2w+LCBlaXRoZXIgVVJJDQotb3Igc3lzdGVtSUQuPC9saT4NCi08bGk+PHVpY29udHJvbD5NYXRjaGluZyBzdGFydCBzdHJpbmc8L3VpY29udHJvbD46IFRoZSBtYXRjaGluZyBwcmVmaXgNCi10byBiZSByZW1vdmVkIGZyb20gdGhlIHN1cHBsaWVkIGlkZW50aWZpZXIuPC9saT4NCi08bGk+PHVpY29udHJvbD5SZXdyaXRlIHByZWZpeDwvdWljb250cm9sPjogVGhlIHByZWZpeCBpcyBiZSB1c2VkIGluc3RlYWQNCi1vZiB0aGUgcHJlZml4IHRoYXQgaXMgcmVtb3ZlZC48L2xpPg0KLTwvdWw+PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjaGFyPSIuIiBjb2xuYW1lPSJjb2wxIj5TdWZmaXggRW50cnk8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj48dWw+DQotPGxpPkluIHRoZSA8dWljb250cm9sPkxvY2F0aW9uPC91aWNvbnRyb2w+IGZpZWxkLCBlbnRlciBvciBicm93c2UNCi1mb3IgdGhlIGxvY2F0aW9uIG9yIFVSSSBvZiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgZmlsZS4gVGhpcyB1c2VzIHlvdXINCi1jb21wdXRlcidzIHBhdGggc3R5bGUgdG8gZGVzY3JpYmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaWxlLiA8L2xpPg0KLTxsaT5TZWxlY3QgYSA8dWljb250cm9sPktleSBUeXBlPC91aWNvbnRyb2w+IChVUkkgb3Igc3lzdGVtSUQpIHRvDQotbWF0Y2guIDwvbGk+DQotPGxpPlR5cGUgdGhlIDx1aWNvbnRyb2w+U3VmZml4PC91aWNvbnRyb2w+IG9mIHRoZSBpZGVudGlmaWVyIHRvIG1hdGNoLjwvbGk+DQotPC91bD48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNoYXI9Ii4iIGNvbG5hbWU9ImNvbDEiPk5leHQgQ2F0YWxvZzwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPkluIHRoZSA8dWljb250cm9sPkxvY2F0aW9uIG9mIGFub3RoZXIgWE1MIENhdGFsb2cNCi1maWxlPC91aWNvbnRyb2w+IGZpZWxkLCB0eXBlIG9yIGJyb3dzZSBmb3IgdGhlIFhNTCBjYXRhbG9nIHlvdSB3YW50DQotdG8gcmVmZXIgdG8uIDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY2hhcj0iLiIgY29sbmFtZT0iY29sMSI+RGVsZWdhdGUgQ2F0YWxvZzwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPjx1bD4NCi08bGk+U2VsZWN0IGEgPHVpY29udHJvbD5LZXkgdHlwZSB0byBtYXRjaDwvdWljb250cm9sPiwgZWl0aGVyIFVSSQ0KLW9yIHN5c3RlbUlELjwvbGk+DQotPGxpPjx1aWNvbnRyb2w+TWF0Y2hpbmcgc3RhcnQgc3RyaW5nPC91aWNvbnRyb2w+OiBUaGUgcHJlZml4IG9mIHRoZQ0KLXN1cHBsaWVkIGlkZW50aWZpZXIgdG8gbWF0Y2guPC9saT4NCi08bGk+PHVpY29udHJvbD5EZWxlZ2F0ZSB0byB0aGlzIFhNTCBmaWxlPC91aWNvbnRyb2w+OiBUaGUgYWx0ZXJuYXRlDQotY2F0YWxvZyB0byBhc3NvY2lhdGUuPC9saT4NCi08L3VsPjwvZW50cnk+DQotPC9yb3c+DQotPC90Ym9keT4NCi08L3Rncm91cD4NCi08L3RhYmxlPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5XaGVuIHlvdSBhcmUgZG9uZSBjcmVhdGluZyBjYXRhbG9nIGVudHJpZXMsIGNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gdG8NCi1jbG9zZSB0aGUgQWRkIFhNTCBDYXRhbG9nIEVudHJ5IGRpYWxvZy4gQ2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiBhZ2Fpbg0KLXRvIHNhdmUgeW91ciBzZXR0aW5ncy48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5NYWtlIHN1cmUgdGhlIFhNTCBmaWxlIGlzIGluIGZvY3VzIGFuZCBjbGljayB0aGUgPHVpY29udHJvbD5SZWxvYWQNCi1kZXBlbmRlbmNpZXM8L3VpY29udHJvbD4gdG9vbGJhciBidXR0b24uIDwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+VGhlIFhNTCBmaWxlIGlzIG5vdyBhc3NvY2lhdGVkIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mDQotdGhlIFhNTCBzY2hlbWEgb3IgRFRELjwvcmVzdWx0Pg0KLTxwb3N0cmVxPjxwPllvdSBjYW4gYWxzbyBleHBvcnQgYW5kIGltcG9ydCBYTUwgQ2F0YWxvZyBpbmZvcm1hdGlvbjogPC9wPjxwPlRvDQotZXhwb3J0LCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5GaWxlPC91aWNvbnRyb2w+PHVpY29udHJvbD5FeHBvcnQ8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPlhNTDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+WE1MIENhdGFsb2c8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi4gWW91IHdpbGwgYmUgcHJvbXB0ZWQNCi10byBzZWxlY3QgYSBwcm9qZWN0IGFuZCBwcm92aWRlIGEgZmlsZSBuYW1lIHRvIHN0b3JlIHlvdXIgY2F0YWxvZw0KLWVudHJpZXMgaW4gYW4gLnhtbGNhdGFsb2cgZmlsZSwgd2hpY2ggY2FuIGJlIG9wZW5lZCBmcm9tIHRoZSBOYXZpZ2F0b3INCi12aWV3LiBTaW5jZSB5b3VyIGNhdGFsb2cgZW50cmllcyBhcmUgc3RvcmVkIGluIGFuIC54bWxjYXRhbG9nIGZpbGUsDQoteW91IGNhbiBjaGVjayB0aGVtIGluIGFuZCBvdXQgYW5kIHNoYXJlIHRoZW0gbGlrZSBhbnkgb3RoZXIgcHJvamVjdA0KLXJlc291cmNlLjwvcD48cD5UbyBpbXBvcnQsIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkZpbGU8L3VpY29udHJvbD4NCi08dWljb250cm9sPkltcG9ydDwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+WE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwgQ2F0YWxvZzwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+LiBUaGVuIHNwZWNpZnkgdGhlIGZpbGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gbG9hZCB0aGUNCi1YTUwgQ2F0YWxvZyBzZXR0aW5ncy4gV2hlbiB5b3UgaW1wb3J0IGEgLnhtbGNhdGFsb2cgZmlsZSwgYW55IGVudHJpZXMNCi1pbiBpdCB3aWxsIGJlIGxvYWRlZCBpbnRvIHRoZSBYTUwgQ2F0YWxvZyAoYW5kIGFueSBleGlzdGluZyBlbnRyaWVzDQotd2lsbCBiZSBvdmVyd3JpdHRlbikuIDwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDkxMTc/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhtbGNhdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eG1sY2F0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZjY2MDUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eG1sY2F0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlhNTCBDYXRhbG9nIGVudHJpZXMgYXJlIHVzZWQgdG8gbWFwIGV4dGVybmFsIGVudGl0eSByZWZlcmVuY2VzIHRvIGxvY2FsbHkgZGVmaW5lZCByZXNvdXJjZXMuIFlvdSBjYW4gcHJvdmlkZSBydWxlcyBzcGVjaWZ5IGhvdyB0aGVzZSBlbnRpdGllcyBhcmUgcmVzb2x2ZWQiIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWE1MIENhdGFsb2cgZW50cmllcyBhcmUgdXNlZCB0byBtYXAgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZXMgdG8gbG9jYWxseSBkZWZpbmVkIHJlc291cmNlcy4gWW91IGNhbiBwcm92aWRlIHJ1bGVzIHNwZWNpZnkgaG93IHRoZXNlIGVudGl0aWVzIGFyZSByZXNvbHZlZCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBjYXRhbG9nLCBhZGRpbmcgZW50cmllcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBjYXRhbG9nLCBhZGRpbmcgZW50cmllcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGRvYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0c2NoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR4bWxjYXQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2c8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR4bWxjYXQiPjxhIG5hbWU9InR4bWxjYXQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WE1MIENhdGFsb2cgZW50cmllcyBhcmUgdXNlZCB0byBtYXAgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZXMKLXRvIGxvY2FsbHkgZGVmaW5lZCByZXNvdXJjZXMuIFlvdSBjYW4gcHJvdmlkZSBydWxlcyBzcGVjaWZ5IGhvdyB0aGVzZQotZW50aXRpZXMgYXJlIHJlc29sdmVkPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Gb3IgZGV0YWlscyBvbiB0aGUgc3RhbmRhcmQgZm9yIFhNTCBDYXRhbG9ncywgc2VlOiA8YSBocmVmPSJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZG93bmxvYWQucGhwLzE0ODA5L3htbC1jYXRhbG9ncy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2Rvd25sb2FkLnBocC8xNDgwOS94bWwtY2F0YWxvZ3MuaHRtbDwvYT4uPC9wPgotPHA+Rm9yIGV4YW1wbGU6IHlvdSBhcmUgd29ya2luZyBvbiBhbgotWE1MIGZpbGUgb24gYSBjb21wdXRlciBhbmQgcG9pbnQgaXRzIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnNjaGVtYUxvY2F0aW9uPC9zYW1wPiB0b3dhcmRzCi1hIHNjaGVtYSBjYWxsZWQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YzpcTXlTY2hlbWEueHNkPC9zYW1wPi4gSWYgeW91IGRvIG5vdCB1c2UKLWFuIFhNTCBjYXRhbG9nLCB0aGVuIHdoZW4geW91IGZpbmlzaCBlZGl0aW5nIHRoZSBYTUwgZmlsZSBhbmQgYXJlCi1yZWFkeSB0byBwdWJsaXNoIGl0IG9uIHRoZSBXZWIsIHlvdSB3aWxsIG5lZWQgdG8gZWRpdCA8c2FtcCBjbGFzcz0iY29kZXBoIj5zY2hlbWFMb2NhdGlvbjwvc2FtcD4gc28KLXRoYXQgaXQgcG9pbnRzIHRvIGEgcmVzb3VyY2UgdGhhdCBpcyBhY2Nlc3NpYmxlIG9uIHRoZSBXZWIuPC9wPgotPHA+VG8KLWF2b2lkIG1ha2luZyBmcmVxdWVudCBjaGFuZ2VzIHRvIHlvdXIgWE1MIGRvY3VtZW50LCB5b3UgY2FuIHVzZSB0aGUKLVhNTCBDYXRhbG9nOiB5b3UgY291bGQgc3BlY2lmeSBhIHJ1bGUgdGhhdCByZWRpcmVjdHMgYW4gSW50ZXJuZXQgcmVzb3VyY2UKLXJlZmVyZW5jZSAoZm9yIGV4YW1wbGUsICA8c2FtcCBjbGFzcz0iY29kZXBoIj4iaHR0cDovL3d3dy5pYm0uY29tL3B1Ymxpc2hlZC1zY2hlbWFzL015U2NoZW1hLnhzZCI8L3NhbXA+KQotc28gdGhhdCBpdCBwb2ludHMgdG8gYSByZXNvdXJjZSBvbiB0aGUgbG9jYWwgbWFjaGluZSAoZm9yIGV4YW1wbGUsCi0gPHNhbXAgY2xhc3M9ImNvZGVwaCI+ImZpbGU6Ly8vQzovTXlTY2hlbWEueHNkIjwvc2FtcD4pLiBOb3csIGluc3RlYWQgb2YgZnJlcXVlbnRseQotZWRpdGluZyBYTUwgZG9jdW1lbnRzIHRvIHVwZGF0ZSB0aGUgVVJJcyBvciBsb2NhdGlvbnMgKGVzcGVjaWFsbHkKLXdoZW4gdGhlcmUgYXJlIG1hbnkgZG9jdW1lbnRzIGluIHlvdXIgcHJvamVjdCksIHlvdSBvbmx5IG5lZWQgdG8gdXBkYXRlCi1hIHNpbmdsZSBydWxlIGluIHlvdXIgWE1MIENhdGFsb2cuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMKLXdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yawotaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGFuIGVudHJ5IHRvIHRoZSBYTUwgQ2F0YWxvZywKLWZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PcGVuIHRoZSBYTUwgZmlsZSB0aGF0IHlvdSB3YW50IHRvIGFzc29jaWF0ZSB3aXRoIGEgRFRECi1vciBYTUwgc2NoZW1hLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrICA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLTwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBDYXRhbG9nPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPiBUaGUgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotQ2F0YWxvZyBFbnRyaWVzPC9zcGFuPiBzZWN0aW9uIGNvbnRhaW5zIGEgbGlzdCBvZiBhbnkgdXNlci1kZWZpbmVkCi1hbmQgcGx1Zy1pbiBkZWZpbmVkIGNhdGFsb2cgZW50cmllcy4gU2VsZWN0IGFueSBlbnRyeSB0byBzZWUgaW5mb3JtYXRpb24KLWFib3V0IGl0IGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZXRhaWxzPC9zcGFuPiBzZWN0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkPC9zcGFuPiB0byBjcmVhdGUgYSBuZXcgY2F0YWxvZwotZW50cnkuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIGxlZnQtaGFuZCBjb2x1bW4sIGNsaWNrIHRoZSB0eXBlIG9mIGNhdGFsb2cgZW50cnkKLXRoYXQgeW91IHdhbnQgdG8gYWRkOjwvc3Bhbj4KLQotPHRhYmxlIGNsYXNzPSJjaG9pY2V0YWJsZWJvcmRlciIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIHJ1bGVzPSJyb3dzIiBmcmFtZT0iaHNpZGVzIiBib3JkZXI9IjEiPgotPHRoZWFkPjx0cj48dGggdmFsaWduPSJib3R0b20iIGlkPSJOMTAwRUUtb3B0aW9uIiBhbGlnbj0ibGVmdCI+T3B0aW9uPC90aD4KLTx0aCB2YWxpZ249ImJvdHRvbSIgaWQ9Ik4xMDBFRS1kZXNjIiBhbGlnbj0ibGVmdCI+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD4KLTx0Ym9keT4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBFRS1vcHRpb24iIGlkPSJOMTAwRjgiPjxzdHJvbmc+Q2F0YWxvZyBFbnRyeTwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBFRS1kZXNjIE4xMDBGOCI+VXNlZCBieSBhbiBYTUwgcHJvY2Vzc29yCi13aGVuIHJlc29sdmluZyBlbnRpdHkgcmVmZXJlbmNlcy4gWW91IGNhbiBwcm92aWRlIHJ1bGVzIHRvIHRoZSBjYXRhbG9nCi10byBzcGVjaWZ5IGhvdyBlbnRpdGllcyBzaG91bGQgYmUgcmVzb2x2ZWQuPGRpdiBjbGFzcz0icCI+QW4gWE1MIENhdGFsb2cgZW50cnkKLWNvbnRhaW5zIHR3byBwYXJ0czo8dWw+Ci08bGk+QSBrZXkgKHdoaWNoIHJlcHJlc2VudHMgYSBEVEQgb3IgWE1MIHNjaGVtYSk8L2xpPgotCi08bGk+QSBsb2NhdGlvbiAoc2ltaWxhciB0byBhIFVSSSwgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQKLWEgRFREIG9yIFhNTCBzY2hlbWEncyBsb2NhdGlvbikuPC9saT4KLQotPC91bD4KLSBZb3UgY2FuIHBsYWNlIHRoZSBLZXkgaW4gYW4gWE1MIGZpbGUuIFdoZW4gdGhlIFhNTCBwcm9jZXNzb3IKLWVuY291bnRlcnMgaXQsIGl0IHdpbGwgdXNlIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSB0byBmaW5kIHRoZSBsb2NhdGlvbgotb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGUgS2V5PC9kaXY+Ci08L3RkPgotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEVFLW9wdGlvbiIgaWQ9Ik4xMDExRSI+PHN0cm9uZz5SZXdyaXRlIEVudHJ5PC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEVFLWRlc2MgTjEwMTFFIj5Vc2VkIHRvIHJlZGlyZWN0Ci1hIHNldCBvZiBlbnRpdGllcy48L3RkPgotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEVFLW9wdGlvbiIgaWQ9Ik4xMDEyRCI+PHN0cm9uZz5TdWZmaXggRW50cnk8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRUUtZGVzYyBOMTAxMkQiPlVzZWQgdG8gbWF0Y2ggdGhlCi1zdWZmaXggb2YgYSBVUkkgb3Igc3lzdGVtSUQuPC90ZD4KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBFRS1vcHRpb24iIGlkPSJOMTAxM0MiPjxzdHJvbmc+TmV4dCBDYXRhbG9nPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEVFLWRlc2MgTjEwMTNDIj5Vc2VkIHRvIHJlZmVyIHRvIGFub3RoZXIKLWNhdGFsb2cgd2l0aG91dCBpbXBvcnRpbmcgaXQgaW50byB0aGUgd29ya2JlbmNoLjwvdGQ+Ci08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRUUtb3B0aW9uIiBpZD0iTjEwMTRCIj48c3Ryb25nPkRlbGVnYXRlIENhdGFsb2c8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRUUtZGVzYyBOMTAxNEIiPlVzZWQgdG8gYXNzb2NpYXRlCi1hbiBhbHRlcm5hdGUgY2F0YWxvZyB3aXRoIGFuIGlkZW50aWZpZXIuPC90ZD4KLTwvdHI+Ci0KLTwvdGJvZHk+PC90YWJsZT4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Db21wbGV0ZSB0aGUgZmllbGRzIGZvciB0aGUgY2F0YWxvZyBlbnRyeSB0aGF0IHlvdSBzZWxlY3RlZDo8L3NwYW4+Ci0gCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+PGNhcHRpb24+VGFibGUgMS4gIENhdGFsb2cgZW50cnkgdHlwZXMgYW5kIGFzc29jaWF0ZWQKLWZpZWxkczwvY2FwdGlvbj4KLTx0aGVhZCBhbGlnbj0ibGVmdCI+Ci08dHIgdmFsaWduPSJib3R0b20iPgotPHRoIHZhbGlnbj0iYm90dG9tIiBpZD0iTjEwMThCIj5DYXRhbG9nIHR5cGU8L3RoPgotCi08dGggdmFsaWduPSJib3R0b20iIGlkPSJOMTAxOTIiPkZpZWxkczwvdGg+Ci0KLTwvdHI+Ci0KLTwvdGhlYWQ+Ci0KLTx0Ym9keT4KLTx0cj4KLTx0ZCBjaGFyPSIuIiB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMThCICI+Q2F0YWxvZyBFbnRyeTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTkyICI+PHVsPgotPGxpPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Mb2NhdGlvbjwvc3Bhbj4gZmllbGQsIGVudGVyIG9yIGJyb3dzZQotZm9yIHRoZSBsb2NhdGlvbiBvciBVUkkgb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIGZpbGUuIFRoaXMgdXNlcyB5b3VyCi1jb21wdXRlcidzIHBhdGggc3R5bGUgdG8gZGVzY3JpYmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaWxlLiA8L2xpPgotCi08bGk+U2VsZWN0IGEgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5IFR5cGU8L3NwYW4+Ojx1bD4KLTxsaT5JZiB5b3Ugc3BlY2lmaWVkIGEgRFREOiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHVibGljIElEPC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3lzdGVtCi1JRDwvc3Bhbj4sIG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVSSTwvc3Bhbj4gZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5Ci1UeXBlPC9zcGFuPiBmaWVsZC4gSWYgeW91IHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QdWJsaWMgSUQsPC9zcGFuPiB0aGUKLXZhbHVlIHlvdSBlbnRlciBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5PC9zcGFuPiBmaWVsZCBzaG91bGQgYmUKLXRoZSBzYW1lIGFzIHRoZSBQdWJsaWMgSUQgaW4gdGhlIFhNTCBmaWxlJ3MgRE9DVFlQRSBkZWNsYXJhdGlvbi4gSWYKLXlvdSBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3lzdGVtIElEPC9zcGFuPiwgdGhlIHZhbHVlIHlvdSBlbnRlciBzaG91bGQKLWNvcnJlc3BvbmQgdG8gdGhlIFN5c3RlbSBJRCBpbiBhbiBYTUwgZmlsZSdzIERPQ1RZUEUgZGVjbGFyYXRpb24uCi1JZiB5b3Ugc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVSSTwvc3Bhbj4sIHRoZSB2YWx1ZSB5b3UgZW50ZXIgbXVzdAotYmUgYSBmdWxseSBxdWFsaWZpZWQgVVJJLjwvbGk+Ci0KLTxsaT5JZiB5b3Ugc3BlY2lmaWVkIGFuIFhNTCBzY2hlbWE6IHNlbGVjdCBlaXRoZXIgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZXNwYWNlCi1OYW1lPC9zcGFuPiBvciAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NoZW1hIExvY2F0aW9uPC9zcGFuPiBmcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5LZXkKLVR5cGU8L3NwYW4+IGZpZWxkLiBJZiB0aGUgc2NoZW1hIGRlZmluZXMgYSB0YXJnZXQgbmFtZXNwYWNlLAotaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGFwcGVhciBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5PC9zcGFuPiBmaWVsZC4KLU90aGVyd2lzZSwgeW91IGNhbiBlbnRlciB0aGUgc2NoZW1hIGxvY2F0aW9uIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5LZXk8L3NwYW4+IGZpZWxkLjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGk+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TcGVjaWZ5IGFsdGVybmF0aXZlIFdlYiBhZGRyZXNzPC9zcGFuPiBjaGVjawotYm94IGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGUgV2ViIGFkZHJlc3MgZm9yCi10aGUgcmVzb3VyY2UuIDxkaXYgY2xhc3M9InAiPlRoaXMgV2ViIGFkZHJlc3MgaXMgdXNlZCB3aGVuIGFuIFhNTCBpbnN0YW5jZSBpcwotZ2VuZXJhdGVkIGZyb20gdGhpcyBjYXRhbG9nIGVudHJ5LjxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUaGlzIG9wdGlvbiBpcyBvbmx5IGF2YWlsYWJsZQotaWYgeW91IHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QdWJsaWMgSUQ8L3NwYW4+IChmb3IgYSBEVEQpIG9yICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lc3BhY2UKLU5hbWU8L3NwYW4+IChmb3IgYSBzY2hlbWEpIGluIHRoZSAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5IHR5cGU8L3NwYW4+IGZpZWxkLjwvZGl2PgotPC9kaXY+Ci08L2xpPgotCi08L3VsPgotPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIGNoYXI9Ii4iIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOEIgIj5SZXdyaXRlIEVudHJ5PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTIgIj48dWw+Ci08bGk+U2VsZWN0IGEgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5IHR5cGUgdG8gbWF0Y2g8L3NwYW4+LCBlaXRoZXIgVVJJCi1vciBzeXN0ZW1JRC48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWF0Y2hpbmcgc3RhcnQgc3RyaW5nPC9zcGFuPjogVGhlIG1hdGNoaW5nIHByZWZpeAotdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzdXBwbGllZCBpZGVudGlmaWVyLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5SZXdyaXRlIHByZWZpeDwvc3Bhbj46IFRoZSBwcmVmaXggaXMgYmUgdXNlZCBpbnN0ZWFkCi1vZiB0aGUgcHJlZml4IHRoYXQgaXMgcmVtb3ZlZC48L2xpPgotCi08L3VsPgotPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIGNoYXI9Ii4iIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOEIgIj5TdWZmaXggRW50cnk8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5MiAiPjx1bD4KLTxsaT5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TG9jYXRpb248L3NwYW4+IGZpZWxkLCBlbnRlciBvciBicm93c2UKLWZvciB0aGUgbG9jYXRpb24gb3IgVVJJIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLiBUaGlzIHVzZXMgeW91cgotY29tcHV0ZXIncyBwYXRoIHN0eWxlIHRvIGRlc2NyaWJlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZS4gPC9saT4KLQotPGxpPlNlbGVjdCBhIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleSBUeXBlPC9zcGFuPiAoVVJJIG9yIHN5c3RlbUlEKSB0bwotbWF0Y2guIDwvbGk+Ci0KLTxsaT5UeXBlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TdWZmaXg8L3NwYW4+IG9mIHRoZSBpZGVudGlmaWVyIHRvIG1hdGNoLjwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgY2hhcj0iLiIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE4QiAiPk5leHQgQ2F0YWxvZzwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTkyICI+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkxvY2F0aW9uIG9mIGFub3RoZXIgWE1MIENhdGFsb2cKLWZpbGU8L3NwYW4+IGZpZWxkLCB0eXBlIG9yIGJyb3dzZSBmb3IgdGhlIFhNTCBjYXRhbG9nIHlvdSB3YW50Ci10byByZWZlciB0by4gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIGNoYXI9Ii4iIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOEIgIj5EZWxlZ2F0ZSBDYXRhbG9nPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTIgIj48dWw+Ci08bGk+U2VsZWN0IGEgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5IHR5cGUgdG8gbWF0Y2g8L3NwYW4+LCBlaXRoZXIgVVJJCi1vciBzeXN0ZW1JRC48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWF0Y2hpbmcgc3RhcnQgc3RyaW5nPC9zcGFuPjogVGhlIHByZWZpeCBvZiB0aGUKLXN1cHBsaWVkIGlkZW50aWZpZXIgdG8gbWF0Y2guPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlbGVnYXRlIHRvIHRoaXMgWE1MIGZpbGU8L3NwYW4+OiBUaGUgYWx0ZXJuYXRlCi1jYXRhbG9nIHRvIGFzc29jaWF0ZS48L2xpPgotCi08L3VsPgotPC90ZD4KLQotPC90cj4KLQotPC90Ym9keT4KLQotPC90YWJsZT4KLTwvZGl2PgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5XaGVuIHlvdSBhcmUgZG9uZSBjcmVhdGluZyBjYXRhbG9nIGVudHJpZXMsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0bwotY2xvc2UgdGhlIEFkZCBYTUwgQ2F0YWxvZyBFbnRyeSBkaWFsb2cuIENsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiBhZ2FpbgotdG8gc2F2ZSB5b3VyIHNldHRpbmdzLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk1ha2Ugc3VyZSB0aGUgWE1MIGZpbGUgaXMgaW4gZm9jdXMgYW5kIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZWxvYWQKLWRlcGVuZGVuY2llczwvc3Bhbj4gdG9vbGJhciBidXR0b24uIDwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGUgWE1MIGZpbGUgaXMgbm93IGFzc29jaWF0ZWQgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YKLXRoZSBYTUwgc2NoZW1hIG9yIERURC48L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WW91IGNhbiBhbHNvIGV4cG9ydCBhbmQgaW1wb3J0IFhNTCBDYXRhbG9nIGluZm9ybWF0aW9uOiA8L3A+Ci08cD5UbwotZXhwb3J0LCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGU8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXhwb3J0PC9zcGFuPgotPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIENhdGFsb2c8L3NwYW4+PC9zcGFuPi4gWW91IHdpbGwgYmUgcHJvbXB0ZWQKLXRvIHNlbGVjdCBhIHByb2plY3QgYW5kIHByb3ZpZGUgYSBmaWxlIG5hbWUgdG8gc3RvcmUgeW91ciBjYXRhbG9nCi1lbnRyaWVzIGluIGFuIC54bWxjYXRhbG9nIGZpbGUsIHdoaWNoIGNhbiBiZSBvcGVuZWQgZnJvbSB0aGUgTmF2aWdhdG9yCi12aWV3LiBTaW5jZSB5b3VyIGNhdGFsb2cgZW50cmllcyBhcmUgc3RvcmVkIGluIGFuIC54bWxjYXRhbG9nIGZpbGUsCi15b3UgY2FuIGNoZWNrIHRoZW0gaW4gYW5kIG91dCBhbmQgc2hhcmUgdGhlbSBsaWtlIGFueSBvdGhlciBwcm9qZWN0Ci1yZXNvdXJjZS48L3A+Ci08cD5UbyBpbXBvcnQsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZTwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkltcG9ydDwvc3Bhbj48L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgQ2F0YWxvZzwvc3Bhbj4KLTwvc3Bhbj4uIFRoZW4gc3BlY2lmeSB0aGUgZmlsZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBsb2FkIHRoZQotWE1MIENhdGFsb2cgc2V0dGluZ3MuIFdoZW4geW91IGltcG9ydCBhIC54bWxjYXRhbG9nIGZpbGUsIGFueSBlbnRyaWVzCi1pbiBpdCB3aWxsIGJlIGxvYWRlZCBpbnRvIHRoZSBYTUwgQ2F0YWxvZyAoYW5kIGFueSBleGlzdGluZyBlbnRyaWVzCi13aWxsIGJlIG92ZXJ3cml0dGVuKS4gPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgdGl0bGU9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgdGl0bGU9IkluIHRoZSBEZXNpZ24gdmlldywgd2hlbiB5b3UgZWRpdCBhbiBYTUwgZmlsZSB0aGF0IGhhcyBhIHNldCBvZiBjb25zdHJhaW50cyBvciBydWxlcyBkZWZpbmVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gdHVybiB0aGUgY29uc3RyYWludHMgb24gYW5kIG9mZiB0byBwcm92aWRlIGZsZXhpYmlsaXR5IGluIHRoZSB3YXkgeW91IGVkaXQsIGJ1dCBzdGlsbCBtYWludGFpbiB0aGUgdmFsaWRpdHkgb2YgdGhlIGRvY3VtZW50IHBlcmlvZGljYWxseS4iPkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRkb2MuaHRtbCIgdGl0bGU9IlRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBpdCB0byBhc3NvY2lhdGUgaXQgd2l0aCBhIERURCBmaWxlLiBZb3UgY2FuIGVkaXQgeW91ciBET0NUWVBFIGRlY2xhcmF0aW9uIHRvIGNoYW5nZSB0aGUgRFREIGZpbGUgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguIj5FZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgdGl0bGU9IklmIHlvdSBtYWtlIGNoYW5nZXMgdG8gYSBEVEQgZmlsZSBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgZmlsZSAodGhhdCBpcyBjdXJyZW50bHkgb3BlbiksIGNsaWNrIFhNTCAmZ3Q7IFJlbG9hZCBEZXBlbmRlbmNpZXMgdG8gdXBkYXRlIHRoZSBYTUwgZmlsZSB3aXRoIHRoZXNlIGNoYW5nZXMuIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBndWlkZWQgZWRpdGluZyBtZWNoYW5pc21zIGF2YWlsYWJsZSBpbiB0aGUgZWRpdG9yLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LiI+VXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0c2NoLmh0bWwiIHRpdGxlPSJZb3VyIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHByb3ZpZGUgdmFyaW91cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgWE1MIGZpbGUsIHN1Y2ggYXMgdGhlIFhNTCBzY2hlbWEgYW5kIG5hbWVzcGFjZSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIElmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHRoZSBzY2hlbWEgYW5kIG5hbWVzcGFjZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBvciBhZGQgYSBuZXcgYXNzb2NpYXRpb24uIE1vZGlmeWluZyBhbnkgYXNzb2NpYXRpb25zIGNhbiBpbXBhY3Qgd2hhdCBjb250ZW50IGlzIGFsbG93ZWQgaW4gdGhlIFhNTCBmaWxlLiI+RWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb248L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHByZWZzLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4cHJlZnMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkOWZmZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4cHJlZnMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHhwcmVmcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTA0KLWVkaXRvciBzdWNoIGFzIHRoZSBmb3JtYXR0ZXIgaW5kZW50YXRpb24gc3R5bGUsIGxpbmUgd3JhcHBpbmcgcnVsZXMsIGFuZCBjb250ZW50DQotYXNzaXN0IHJ1bGVzLiBUbyBhcHBseSB0aGUgZm9ybWF0dGluZyBzdHlsZXMsIHJpZ2h0LWNsaWNrIGluIHRoZSBTb3VyY2Ugdmlldw0KLWZvciB5b3VyIFhNTCBkb2N1bWVudCwgYW5kIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkZvcm1hdDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+RG9jdW1lbnQ8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5wcmVmZXJlbmNlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+cHJlZmVyZW5jZXM8aW5kZXh0ZXJtPlhNTCBlZGl0b3I8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRvIGRlZmluZSBYTUwgcHJlZmVyZW5jZXMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DbGljayAgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+WE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwNCi1GaWxlczwvdWljb250cm9sPjx1aWNvbnRyb2w+RWRpdG9yPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RW50ZXIgYSBtYXhpbXVtIHdpZHRoIGZvciBmb3JtYXR0ZWQgbGluZXMgaW4gdGhlIDx1aWNvbnRyb2w+TGluZQ0KLXdpZHRoPC91aWNvbnRyb2w+IGZpZWxkPC9jbWQ+PGluZm8+VGhlIGRlZmF1bHQgdmFsdWUgaXMgNzIuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCA8dWljb250cm9sPlNwbGl0IG11bHRpcGxlIGF0dHJpYnV0ZXMgZWFjaCBvbiBhIG5ldyBsaW5lPC91aWNvbnRyb2w+IHRvDQotc3RhcnQgZXZlcnkgYXR0cmlidXRlIG9uIGEgbmV3IGxpbmUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IDx1aWNvbnRyb2w+UHJlc2VydmUgd2hpdGVzcGFjZSBpbiB0YWdzIHdpdGggUENEQVRBIGNvbnRlbnQ8L3VpY29udHJvbD4gdG8NCi1wcmV2ZW50IHRoZSBlZGl0b3IgZnJvbSBkZWxldGluZyB3aGl0ZXNwYWNlIGluIGVsZW1lbnRzIHRoYXQgY29udGFpbiBwYXJzZWQNCi1jaGFyYWN0ZXIgZGF0YS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3Ugd2FudCBibGFuayBsaW5lcyB0byBiZSByZW1vdmVkIHdoZW4gdGhlIGRvY3VtZW50IGlzIGZvcm1hdHRlZCwNCi1zZWxlY3QgdGhlIDx1aWNvbnRyb2w+Q2xlYXIgYWxsIGJsYW5rIGxpbmVzPC91aWNvbnRyb2w+IGNoZWNrIGJveC4gPC9jbWQ+DQotPGluZm8+QnkgZGVmYXVsdCwgYmxhbmsgbGluZXMgYXJlIHByZXNlcnZlZCBpbiBhIGZvcm1hdHRlZCBkb2N1bWVudC48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IDx1aWNvbnRyb2w+SW5kZW50IHVzaW5nIHRhYnM8L3VpY29udHJvbD4gaWYgeW91IHdhbnQgdG8NCi11c2UgdGFiIGNoYXJhY3RlcnMgKFx0KSBhcyB0aGUgc3RhbmRhcmQgZm9ybWF0dGluZyBpbmRlbnRhdGlvbiwgb3IsIGlmIHlvdQ0KLXByZWZlciB0byB1c2Ugc3BhY2VzLCBzZWxlY3QgPHVpY29udHJvbD5JbmRlbnQgdXNpbmcgc3BhY2VzPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPllvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSA8dWljb250cm9sPkluZGVudGF0aW9uIHNpemU8L3VpY29udHJvbD4gd2hpY2gNCi1pcyB0aGUgbnVtYmVyIG9mIHRhYnMgb3Igc3BhY2UgY2hhcmFjdGVycyB1c2VkIGZvciBmb3JtYXR0aW5nIGluZGVudGF0aW9uLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPllvdSBjYW4gc3BlY2lmeSBjZXJ0YWluIGNoYXJhY3RlcnMgKHRoZSBkZWZhdWx0IGNvbW1hbmQ8P1B1YiBDYXJldD8+DQotaXMgJmx0Oz0pIHRoYXQgd2lsbCBjYXVzZSB0aGUgY29udGVudCBhc3Npc3QgbGlzdCB0byBwb3AgdXAgYXV0b21hdGljYWxseS4NCi1FbnN1cmUgdGhlIDx1aWNvbnRyb2w+QXV0b21hdGljYWxseSBtYWtlIHN1Z2dlc3Rpb25zPC91aWNvbnRyb2w+IGNoZWNrIGJveA0KLWlzIHNlbGVjdGVkIGFuZCBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXJzIGluIHRoZSA8dWljb250cm9sPlByb21wdCB3aGVuIHRoZXNlDQotY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQ8L3VpY29udHJvbD4gZmllbGQuIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSBzZWxlY3QgPGI+U3RyaWN0PC9iPiBmcm9tIHRoZSA8Yj5TdWdnZXN0aW9uIHN0cmF0ZWd5PC9iPiBsaXN0LA0KLXN1Z2dlc3Rpb25zIHRoYXQgYXJlIGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBzaG93biBmaXJzdCAod2l0aCBib2xkIGljb25zKQ0KLWluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LiBPdGhlciBzdWdnZXN0aW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBlbGVtZW50DQotc2NvcGUsIGJ1dCBub3QgZ3JhbW1hdGljYWxseSB2YWxpZCwgd2lsbCBiZSBzaG93biBiZWxvdyB0aGVtIHdpdGggYSBkZS1lbXBoYXNpemVkDQotaWNvbi4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZmllbGQgaXMgPGI+U3RyaWN0PC9iPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgPHVpY29udHJvbD5Vc2UgaW5mZXJyZWQgZ3JhbW1hciBpbiBhYnNlbmNlIG9mIERURC9TY2hlbWE8L3VpY29udHJvbD4gY2hlY2sNCi1ib3ggaXMgc2VsZWN0ZWQgYnkgZGVmYXVsdC4gPC9jbWQ+PGluZm8+SWYgdGhpcyBib3ggaXMgc2VsZWN0ZWQsIHdoZW4geW91DQotaGF2ZSBhbiBYTUwgZmlsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgeW91IHdpbGwNCi1zdGlsbCBiZSBhYmxlIHRvIGdldCBjb250ZW50IGFzc2lzdCAtIHRoZSB0b29sIHdpbGwgaW5mZXIgd2hhdCBzaG91bGQgY29tZQ0KLW5leHQgaW4geW91ciBmaWxlIGJhc2VkIG9uIHRoZSBleGlzdGluZyBjb250ZW50LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkFwcGx5PC91aWNvbnRyb2w+IGFuZCB0aGVuIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gdG8NCi1zYXZlIHlvdXIgY2hhbmdlcy48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMzY1OT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHByZWZzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4cHJlZnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0NDVmMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4cHJlZnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRlZmluaW5nIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiBzZXQgdmFyaW91cyBwcmVmZXJlbmNlcyBmb3IgdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yIHN1Y2ggYXMgdGhlIGZvcm1hdHRlciBpbmRlbnRhdGlvbiBzdHlsZSwgbGluZSB3cmFwcGluZyBydWxlcywgYW5kIGNvbnRlbnQgYXNzaXN0IHJ1bGVzLiBUbyBhcHBseSB0aGUgZm9ybWF0dGluZyBzdHlsZXMsIHJpZ2h0LWNsaWNrIGluIHRoZSBTb3VyY2UgdmlldyBmb3IgeW91ciBYTUwgZG9jdW1lbnQsIGFuZCBjbGljayBGb3JtYXQgJmd0OyBEb2N1bWVudC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBzZXQgdmFyaW91cyBwcmVmZXJlbmNlcyBmb3IgdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yIHN1Y2ggYXMgdGhlIGZvcm1hdHRlciBpbmRlbnRhdGlvbiBzdHlsZSwgbGluZSB3cmFwcGluZyBydWxlcywgYW5kIGNvbnRlbnQgYXNzaXN0IHJ1bGVzLiBUbyBhcHBseSB0aGUgZm9ybWF0dGluZyBzdHlsZXMsIHJpZ2h0LWNsaWNrIGluIHRoZSBTb3VyY2UgdmlldyBmb3IgeW91ciBYTUwgZG9jdW1lbnQsIGFuZCBjbGljayBGb3JtYXQgJmd0OyBEb2N1bWVudC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBwcmVmZXJlbmNlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHByZWZlcmVuY2VzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0eHByZWZzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHhwcmVmcyI+PGEgbmFtZT0idHhwcmVmcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiBzZXQgdmFyaW91cyBwcmVmZXJlbmNlcyBmb3IgdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwKLWVkaXRvciBzdWNoIGFzIHRoZSBmb3JtYXR0ZXIgaW5kZW50YXRpb24gc3R5bGUsIGxpbmUgd3JhcHBpbmcgcnVsZXMsIGFuZCBjb250ZW50Ci1hc3Npc3QgcnVsZXMuIFRvIGFwcGx5IHRoZSBmb3JtYXR0aW5nIHN0eWxlcywgcmlnaHQtY2xpY2sgaW4gdGhlIFNvdXJjZSB2aWV3Ci1mb3IgeW91ciBYTUwgZG9jdW1lbnQsIGFuZCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZvcm1hdDwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50PC9zcGFuPjwvc3Bhbj4uPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBkZWZpbmUgWE1MIHByZWZlcmVuY2VzLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrICA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLTwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwKLUZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXRvcjwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkVudGVyIGEgbWF4aW11bSB3aWR0aCBmb3IgZm9ybWF0dGVkIGxpbmVzIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5MaW5lCi13aWR0aDwvc3Bhbj4gZmllbGQ8L3NwYW4+IFRoZSBkZWZhdWx0IHZhbHVlIGlzIDcyLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNwbGl0IG11bHRpcGxlIGF0dHJpYnV0ZXMgZWFjaCBvbiBhIG5ldyBsaW5lPC9zcGFuPiB0bwotc3RhcnQgZXZlcnkgYXR0cmlidXRlIG9uIGEgbmV3IGxpbmUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZXNlcnZlIHdoaXRlc3BhY2UgaW4gdGFncyB3aXRoIFBDREFUQSBjb250ZW50PC9zcGFuPiB0bwotcHJldmVudCB0aGUgZWRpdG9yIGZyb20gZGVsZXRpbmcgd2hpdGVzcGFjZSBpbiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gcGFyc2VkCi1jaGFyYWN0ZXIgZGF0YS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCBibGFuayBsaW5lcyB0byBiZSByZW1vdmVkIHdoZW4gdGhlIGRvY3VtZW50IGlzIGZvcm1hdHRlZCwKLXNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q2xlYXIgYWxsIGJsYW5rIGxpbmVzPC9zcGFuPiBjaGVjayBib3guIDwvc3Bhbj4KLSBCeSBkZWZhdWx0LCBibGFuayBsaW5lcyBhcmUgcHJlc2VydmVkIGluIGEgZm9ybWF0dGVkIGRvY3VtZW50LgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5kZW50IHVzaW5nIHRhYnM8L3NwYW4+IGlmIHlvdSB3YW50IHRvCi11c2UgdGFiIGNoYXJhY3RlcnMgKFx0KSBhcyB0aGUgc3RhbmRhcmQgZm9ybWF0dGluZyBpbmRlbnRhdGlvbiwgb3IsIGlmIHlvdQotcHJlZmVyIHRvIHVzZSBzcGFjZXMsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbmRlbnQgdXNpbmcgc3BhY2VzPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPllvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbmRlbnRhdGlvbiBzaXplPC9zcGFuPiB3aGljaAotaXMgdGhlIG51bWJlciBvZiB0YWJzIG9yIHNwYWNlIGNoYXJhY3RlcnMgdXNlZCBmb3IgZm9ybWF0dGluZyBpbmRlbnRhdGlvbi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPllvdSBjYW4gc3BlY2lmeSBjZXJ0YWluIGNoYXJhY3RlcnMgKHRoZSBkZWZhdWx0IGNvbW1hbmQKLWlzICZsdDs9KSB0aGF0IHdpbGwgY2F1c2UgdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgdG8gcG9wIHVwIGF1dG9tYXRpY2FsbHkuCi1FbnN1cmUgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkF1dG9tYXRpY2FsbHkgbWFrZSBzdWdnZXN0aW9uczwvc3Bhbj4gY2hlY2sgYm94Ci1pcyBzZWxlY3RlZCBhbmQgc3BlY2lmeSB0aGUgY2hhcmFjdGVycyBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvbXB0IHdoZW4gdGhlc2UKLWNoYXJhY3RlcnMgYXJlIGluc2VydGVkPC9zcGFuPiBmaWVsZC4gPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHNlbGVjdCA8c3Ryb25nPlN0cmljdDwvc3Ryb25nPiBmcm9tIHRoZSA8c3Ryb25nPlN1Z2dlc3Rpb24gc3RyYXRlZ3k8L3N0cm9uZz4gbGlzdCwKLXN1Z2dlc3Rpb25zIHRoYXQgYXJlIGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBzaG93biBmaXJzdCAod2l0aCBib2xkIGljb25zKQotaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QuIE90aGVyIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGVsZW1lbnQKLXNjb3BlLCBidXQgbm90IGdyYW1tYXRpY2FsbHkgdmFsaWQsIHdpbGwgYmUgc2hvd24gYmVsb3cgdGhlbSB3aXRoIGEgZGUtZW1waGFzaXplZAotaWNvbi4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZmllbGQgaXMgPHN0cm9uZz5TdHJpY3Q8L3N0cm9uZz4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVzZSBpbmZlcnJlZCBncmFtbWFyIGluIGFic2VuY2Ugb2YgRFREL1NjaGVtYTwvc3Bhbj4gY2hlY2sKLWJveCBpcyBzZWxlY3RlZCBieSBkZWZhdWx0LiA8L3NwYW4+IElmIHRoaXMgYm94IGlzIHNlbGVjdGVkLCB3aGVuIHlvdQotaGF2ZSBhbiBYTUwgZmlsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgeW91IHdpbGwKLXN0aWxsIGJlIGFibGUgdG8gZ2V0IGNvbnRlbnQgYXNzaXN0IC0gdGhlIHRvb2wgd2lsbCBpbmZlciB3aGF0IHNob3VsZCBjb21lCi1uZXh0IGluIHlvdXIgZmlsZSBiYXNlZCBvbiB0aGUgZXhpc3RpbmcgY29udGVudC48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGx5PC9zcGFuPiBhbmQgdGhlbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gdG8KLXNhdmUgeW91ciBjaGFuZ2VzLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHNpdHlwLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4c2l0eXAuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJlZDk3My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4c2l0eXAuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHhzaXR5cCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+VXNpbmcgeHNpOnR5cGU8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlVzaW5nIHhzaTp0eXBlPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPklmIHlvdSBoYXZlIGVsZW1lbnRzIGluIHlvdXIgWE1MIGZpbGUgd2hvc2UgdHlwZSBpcyBhIGNvbXBsZXggdHlwZSwNCi14c2k6dHlwZSBzdXBwb3J0IGluIHRoZSBYTUwgZWRpdG9yIGxldHMgeW91IGNob29zZSBiZXR3ZWVuIHRoZSBjb21wbGV4IHR5cGUNCi1hbmQgYW55IG90aGVyIGNvbXBsZXggdHlwZXMgZGVyaXZlZCBmcm9tIGl0Ljwvc2hvcnRkZXNjPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9uIGFsbG93cyB5b3UgdG8gZGVyaXZlIHR5cGVzIGJ5IGV4dGVuc2lvbi4NCi1TZWUgdGhlIGZvbGxvd2luZyBzdGVwcyBhcyBhbiBleGFtcGxlPD9QdWIgQ2FyZXQ/Pjo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNyZWF0ZSBhbiBYTUwgc2NoZW1hIGFuZCBjcmVhdGUgYSBjb21wbGV4IHR5cGUgZm9yIGl0IGNhbGxlZCAgPHVzZXJpbnB1dD5BZGRyZXNzPC91c2VyaW5wdXQ+LiA8L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5BZGQgc29tZSBiYXNpYyBlbGVtZW50cyB0byA8dXNlcmlucHV0PkFkZHJlc3M8L3VzZXJpbnB1dD4sIHN1Y2gNCi1hcyA8dXNlcmlucHV0PnN0cmVldE5hbWU8L3VzZXJpbnB1dD4gYW5kIDx1c2VyaW5wdXQ+Y2l0eTwvdXNlcmlucHV0Pi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5EZXJpdmUgKGJ5IGV4dGVuc2lvbikgdHdvIG5ldyBjb21wbGV4IHR5cGVzIGZyb20gPHVzZXJpbnB1dD5BZGRyZXNzPC91c2VyaW5wdXQ+OiA8dXNlcmlucHV0PlVTQWRkcmVzczwvdXNlcmlucHV0PiBhbmQgPHVzZXJpbnB1dD5VS0FkZHJlc3M8L3VzZXJpbnB1dA0KLT4uIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkFkZCBhIG5ldyBlbGVtZW50IHRvIDx1c2VyaW5wdXQ+VVNBZGRyZXNzPC91c2VyaW5wdXQ+IGNhbGxlZCAgPHVzZXJpbnB1dD5zdGF0ZTwvdXNlcmlucHV0PiwNCi1hbmQgYWxzbyBhIG5ldyBlbGVtZW50IHRvIDx1c2VyaW5wdXQ+VUtBZGRyZXNzPC91c2VyaW5wdXQ+IGNhbGxlZCA8dXNlcmlucHV0PnBvc3Rjb2RlPC91c2VyaW5wdXQ+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNyZWF0ZSB0d28gbW9yZSBlbGVtZW50czogPHVzZXJpbnB1dD5iaWxsVG88L3VzZXJpbnB1dD4gYW5kIDx1c2VyaW5wdXQ+c2hpcFRvPC91c2VyaW5wdXQ+LA0KLWFzICA8c3lzdGVtb3V0cHV0PkFkZHJlc3M8L3N5c3RlbW91dHB1dD4gdHlwZXMuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+V2hlbiB5b3UgY3JlYXRlIGFuIFhNTCBpbnN0YW5jZSBkb2N1bWVudCBmb3IgYW4gZWxlbWVudCBzdWNoIGFzDQotIDxzeXN0ZW1vdXRwdXQ+YmlsbFRvPC9zeXN0ZW1vdXRwdXQ+IG9yICA8dXNlcmlucHV0PkFkZHJlc3M8L3VzZXJpbnB1dD4sIGFuDQoteHNpOnR5cGUgYXR0cmlidXRlIHdpbGwgYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byBpdC48L2NtZD48aW5mbz5Gb3IgZXhhbXBsZSwgPGNvZGVibG9jaz4mbHQ7YmlsbFRvIHhzaTp0eXBlPSJpcG86QWRkcmVzcyI+PC9jb2RlYmxvY2s+VGhlDQoteHNpOnR5cGUgYXR0cmlidXRlIGlzIHVzZWQgdG8gaWRlbnRpZnkgZGVyaXZlZCBjb21wbGV4IHR5cGVzIChhcyB3ZWxsIGFzIGNvbXBsZXgNCi10eXBlcyB0aGF0IGhhdmUgYmVlbiBkZXJpdmVkIGZyb20pLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsIGEgbGlzdCB3aWxsIGJlIGF2YWlsYWJsZSwNCi1sZXR0aW5nIHlvdSBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHR5cGUgZGVmaW5pdGlvbiAoPHVpY29udHJvbD5BZGRyZXNzPC91aWNvbnRyb2w+LCA8dWljb250cm9sPlVTQWRkcmVzczwvdWljb250cm9sPiwNCi1vciAgPHVpY29udHJvbD5VS0FkZHJlc3M8L3VpY29udHJvbD4pLiBUaGUgZ3VpZGVkIGVkaXRpbmcgZm9yIHRoZSBjb250ZW50DQotbW9kZWwgd2lsbCByZWZsZWN0IHRoZSB0eXBlIGRlZmluaXRpb24gdGhhdCB5b3UgY2hvb3NlLiBGb3IgZXhhbXBsZSwgaWYgeW91DQotc2VsZWN0ICA8dWljb250cm9sPlVTQWRkcmVzczwvdWljb250cm9sPiAsIHlvdXIgPGNvZGVwaD5iaWxsVG88L2NvZGVwaD4gZWxlbWVudA0KLWNhbiBjb250YWluIGEgPGNvZGVwaD5zdGF0ZTwvY29kZXBoPiBlbGVtZW50LCBidXQgaXQgY2Fubm90IGNvbnRhaW4gYSA8Y29kZXBoPnBvc3Rjb2RlPC9jb2RlcGg+IGVsZW1lbnQuPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+PHA+VGhlIFhNTCBleGFtcGxlICJFZGl0aW5nIGFuZCB2YWxpZGF0aW5nIFhNTCBmaWxlcyIgZGVtb25zdHJhdGVzIDxiPnhzaTp0eXBlPC9iPiBzdXBwb3J0LjwvcD48cD5Gb3INCi1tb3JlIGluZm9ybWF0aW9uIGFib3V0IHhzaTp0eXBlLCByZWZlciB0byB0aGUgPGI+VXNpbmcgRGVyaXZlZCBUeXBlcyBpbiBJbnN0YW5jZQ0KLURvY3VtZW50czwvYj4gc2VjdGlvbiBpbiA8eHJlZiBmb3JtYXQ9Imh0bWwiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0wLyNVc2VEZXJpdkluSW5zdERvY3MiDQotc2NvcGU9ImV4dGVybmFsIj5YTUwgU2NoZW1hIFBhcnQgMDogUHJpbWVyLjwveHJlZj48L3A+PHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24NCi1hYm91dCB2YWxpZGF0aW9uIHNlbWFudGljcyB3aGVuIHhzaTp0eXBlIGlzIHVzZWQsIHJlZmVyIHRvIHRoZSA8Yj5TY2hlbWEtUmVsYXRlZA0KLU1hcmt1cCBpbiBEb2N1bWVudHMgQmVpbmcgVmFsaWRhdGVkPC9iPiBzZWN0aW9uIGluICA8eHJlZiBmb3JtYXQ9Imh0bWwiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyN4c2lfdHlwZSINCi1zY29wZT0iZXh0ZXJuYWwiPlhNTCBTY2hlbWEgUGFydCAxOiBTdHJ1Y3R1cmVzPC94cmVmPiA8L3A+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzMTU0Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4c2l0eXAuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhzaXR5cC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzQ3YzRjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhzaXR5cC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVXNpbmcgeHNpOnR5cGUiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSWYgeW91IGhhdmUgZWxlbWVudHMgaW4geW91ciBYTUwgZmlsZSB3aG9zZSB0eXBlIGlzIGEgY29tcGxleCB0eXBlLCB4c2k6dHlwZSBzdXBwb3J0IGluIHRoZSBYTUwgZWRpdG9yIGxldHMgeW91IGNob29zZSBiZXR3ZWVuIHRoZSBjb21wbGV4IHR5cGUgYW5kIGFueSBvdGhlciBjb21wbGV4IHR5cGVzIGRlcml2ZWQgZnJvbSBpdC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSWYgeW91IGhhdmUgZWxlbWVudHMgaW4geW91ciBYTUwgZmlsZSB3aG9zZSB0eXBlIGlzIGEgY29tcGxleCB0eXBlLCB4c2k6dHlwZSBzdXBwb3J0IGluIHRoZSBYTUwgZWRpdG9yIGxldHMgeW91IGNob29zZSBiZXR3ZWVuIHRoZSBjb21wbGV4IHR5cGUgYW5kIGFueSBvdGhlciBjb21wbGV4IHR5cGVzIGRlcml2ZWQgZnJvbSBpdC4iIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHhzaXR5cCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlVzaW5nIHhzaTp0eXBlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0eHNpdHlwIj48YSBuYW1lPSJ0eHNpdHlwIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Vc2luZyB4c2k6dHlwZTwvaDE+Ci0KLQotCi08ZGl2PjxwPklmIHlvdSBoYXZlIGVsZW1lbnRzIGluIHlvdXIgWE1MIGZpbGUgd2hvc2UgdHlwZSBpcyBhIGNvbXBsZXggdHlwZSwKLXhzaTp0eXBlIHN1cHBvcnQgaW4gdGhlIFhNTCBlZGl0b3IgbGV0cyB5b3UgY2hvb3NlIGJldHdlZW4gdGhlIGNvbXBsZXggdHlwZQotYW5kIGFueSBvdGhlciBjb21wbGV4IHR5cGVzIGRlcml2ZWQgZnJvbSBpdC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb24gYWxsb3dzIHlvdSB0byBkZXJpdmUgdHlwZXMgYnkgZXh0ZW5zaW9uLgotU2VlIHRoZSBmb2xsb3dpbmcgc3RlcHMgYXMgYW4gZXhhbXBsZTo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DcmVhdGUgYW4gWE1MIHNjaGVtYSBhbmQgY3JlYXRlIGEgY29tcGxleCB0eXBlIGZvciBpdCBjYWxsZWQgIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+QWRkcmVzczwva2JkPi4gPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5BZGQgc29tZSBiYXNpYyBlbGVtZW50cyB0byA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkFkZHJlc3M8L2tiZD4sIHN1Y2gKLWFzIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+c3RyZWV0TmFtZTwva2JkPiBhbmQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5jaXR5PC9rYmQ+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RGVyaXZlIChieSBleHRlbnNpb24pIHR3byBuZXcgY29tcGxleCB0eXBlcyBmcm9tIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+QWRkcmVzczwva2JkPjogPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5VU0FkZHJlc3M8L2tiZD4gYW5kIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+VUtBZGRyZXNzPC9rYmQ+LiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5BZGQgYSBuZXcgZWxlbWVudCB0byA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPlVTQWRkcmVzczwva2JkPiBjYWxsZWQgIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+c3RhdGU8L2tiZD4sCi1hbmQgYWxzbyBhIG5ldyBlbGVtZW50IHRvIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+VUtBZGRyZXNzPC9rYmQ+IGNhbGxlZCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPnBvc3Rjb2RlPC9rYmQ+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q3JlYXRlIHR3byBtb3JlIGVsZW1lbnRzOiA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPmJpbGxUbzwva2JkPiBhbmQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5zaGlwVG88L2tiZD4sCi1hcyAgPHR0IGNsYXNzPSJzeXNvdXQiPkFkZHJlc3M8L3R0PiB0eXBlcy48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5XaGVuIHlvdSBjcmVhdGUgYW4gWE1MIGluc3RhbmNlIGRvY3VtZW50IGZvciBhbiBlbGVtZW50IHN1Y2ggYXMKLSA8dHQgY2xhc3M9InN5c291dCI+YmlsbFRvPC90dD4gb3IgIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+QWRkcmVzczwva2JkPiwgYW4KLXhzaTp0eXBlIGF0dHJpYnV0ZSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgYWRkZWQgdG8gaXQuPC9zcGFuPiBGb3IgZXhhbXBsZSwgPHByZT4mbHQ7YmlsbFRvIHhzaTp0eXBlPSJpcG86QWRkcmVzcyImZ3Q7PC9wcmU+Ci1UaGUKLXhzaTp0eXBlIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGRlcml2ZWQgY29tcGxleCB0eXBlcyAoYXMgd2VsbCBhcyBjb21wbGV4Ci10eXBlcyB0aGF0IGhhdmUgYmVlbiBkZXJpdmVkIGZyb20pLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLCBhIGxpc3Qgd2lsbCBiZSBhdmFpbGFibGUsCi1sZXR0aW5nIHlvdSBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHR5cGUgZGVmaW5pdGlvbiAoPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkcmVzczwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVTQWRkcmVzczwvc3Bhbj4sCi1vciAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VUtBZGRyZXNzPC9zcGFuPikuIFRoZSBndWlkZWQgZWRpdGluZyBmb3IgdGhlIGNvbnRlbnQKLW1vZGVsIHdpbGwgcmVmbGVjdCB0aGUgdHlwZSBkZWZpbml0aW9uIHRoYXQgeW91IGNob29zZS4gRm9yIGV4YW1wbGUsIGlmIHlvdQotc2VsZWN0ICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5VU0FkZHJlc3M8L3NwYW4+ICwgeW91ciA8c2FtcCBjbGFzcz0iY29kZXBoIj5iaWxsVG88L3NhbXA+IGVsZW1lbnQKLWNhbiBjb250YWluIGEgPHNhbXAgY2xhc3M9ImNvZGVwaCI+c3RhdGU8L3NhbXA+IGVsZW1lbnQsIGJ1dCBpdCBjYW5ub3QgY29udGFpbiBhIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnBvc3Rjb2RlPC9zYW1wPiBlbGVtZW50Ljwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBYTUwgZXhhbXBsZSAiRWRpdGluZyBhbmQgdmFsaWRhdGluZyBYTUwgZmlsZXMiIGRlbW9uc3RyYXRlcyA8c3Ryb25nPnhzaTp0eXBlPC9zdHJvbmc+IHN1cHBvcnQuPC9wPgotPHA+Rm9yCi1tb3JlIGluZm9ybWF0aW9uIGFib3V0IHhzaTp0eXBlLCByZWZlciB0byB0aGUgPHN0cm9uZz5Vc2luZyBEZXJpdmVkIFR5cGVzIGluIEluc3RhbmNlCi1Eb2N1bWVudHM8L3N0cm9uZz4gc2VjdGlvbiBpbiA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMC8jVXNlRGVyaXZJbkluc3REb2NzIiB0YXJnZXQ9Il9ibGFuayI+WE1MIFNjaGVtYSBQYXJ0IDA6IFByaW1lci48L2E+PC9wPgotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24KLWFib3V0IHZhbGlkYXRpb24gc2VtYW50aWNzIHdoZW4geHNpOnR5cGUgaXMgdXNlZCwgcmVmZXIgdG8gdGhlIDxzdHJvbmc+U2NoZW1hLVJlbGF0ZWQKLU1hcmt1cCBpbiBEb2N1bWVudHMgQmVpbmcgVmFsaWRhdGVkPC9zdHJvbmc+IHNlY3Rpb24gaW4gIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyN4c2lfdHlwZSIgdGFyZ2V0PSJfYmxhbmsiPlhNTCBTY2hlbWEgUGFydCAxOiBTdHJ1Y3R1cmVzPC9hPiA8L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNjYyMjguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcl8xLjAuMC5qYXIKLXRlbXAKLURpdGFMaW5rLmNhdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxNzBiNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDhiNWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjM3OjIxIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJhYzY1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjQ5NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jU3VuIEFwciAxNiAxNDowNToyOSBFRFQgMjAwNgotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvRG9jQnVpbGQueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL0RvY0J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjZjMyZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvRG9jQnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tIAotCi0JVGhpcyBzY3JpcHQgYnVpbGQgdGhlIEhlbHAgcGx1Zy1pbiBieSB0cmFuc2Zvcm1pbmcgdGhlIERJVEEgc291cmNlIGZpbGVzIGludG8gSFRNTC4KLQkKLQlUbyB1c2UgdGhpcyBzY3JpcHQsIHlvdSBtdXN0IGluc3RhbGwgRElUQS1PVCBvbiB5b3VyIG1hY2hpbmUgaW4gdGhlIGRpcmVjdG9yeQotCWRlZmluZWQgYnkgdGhlIGRpdGEub3QuZGlyIHByb3BlcnR5LgotCQotCVJ1biB0aGUgZGVmYXVsdCB0YXJnZXQgYWZ0ZXIgeW91IGVkaXQgdGhlIERJVEEgc291cmNlIGZpbGVzIHRvIHJlZ2VuZXJhdGUgdGhlIEhUTUwuCi0JCi0JVG8gY3VzdG9taXplIHRoaXMgc2NyaXB0IGZvciBvdGhlciBIZWxwIHBsdWctaW5zLCBtb2RpZnkgdGhlIHZhbHVlIG9mIHRoZSBhcmdzLmlucHV0IHByb3BlcnR5Ci0JdG8gYmUgdGhlIERJVEEgbWFwIGZpbGUgZm9yIHRoZSBwbHVnLWluLgotCQotCU5PVEU6IFRoaXMgc2NyaXB0IGFzc3VtZXMgdGhhdCBsaW5rcyB0byBzaWJsaW5nIEhlbHAgcGx1Zy1pbnMgaGF2ZSBzY29wZT0icGVlciIsIG90aGVyd2lzZSB0aGUKLQlvdXRwdXQgZGlyZWN0b3J5IHN0cnVjdHVyZSB3aWxsIGJlIHNoaWZ0ZWQgaW5jb3JyZWN0bHkuCi0JCi0JTk9URTogVGhpcyBzY3JpcHQgYXNzdW1lcyB0aGF0IHlvdSBoYW5kIGNvZGUgeW91ciBwbHVnaW4ueG1sIGZpbGUgaW4gbXlwbHVnaW4ueG1sLiBUaGlzIGZpbGUKLQl3aWxsIGJlIGNvcGllZCBvdmVyIHRoZSBnZW5lcmF0ZWQgcGx1Z2luLnhtbCB3aGljaCBpcyBjdXJyZW50bHkgbm90IGJlaW5nIGdlbmVyYXRlZCBjb3JyZWN0bHkKLQlieSBESVRBLU9ULgotCQotCUNoYW5nZUxvZzoKLQkyMDA2LTA0LTA1IEFydGh1ciBSeW1hbiA8cnltYW5AY2EuaWJtLmNvbT4KLQktIENyZWF0ZWQuCi0JMjAwOC0wMS0wOSBLYXRlIFByaWNlIDxrYXRlcEBjYS5pYm0uY29tPgotCS0gbW9kaWZpZWQgZm9yIG5ldyBESVRBLU9UIHZlcnNpb24KLQkyMDA4LTA1LTA1IEthdGUgUHJpY2UgPGthdGVwQGNhLmlibS5jb20+Ci0JLSBtb2RpZmllZCB0byBhZGQgZ2VuZXJhdGlvbiBvZiBwcmUtYnVpbHQgaGVscCBpbmRleC4gCi0JLSBNdXN0IGRlbGV0ZSAvaW5kZXggZm9sZGVyIGJlZm9yZSBydW5uaW5nIGJ1aWxkCi0tLT4KLTxwcm9qZWN0IG5hbWU9ImVjbGlwc2VoZWxwIiBkZWZhdWx0PSJhbGwiPgotCi0JPHByb3BlcnR5IG5hbWU9ImRpdGEub3QuZGlyIiBsb2NhdGlvbj0iQzovRElUQS1PVDEuMi4yIiAvPgotCi0JPHBhdGggaWQ9ImRvc3QuY2xhc3MucGF0aCI+Ci0JCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtkaXRhLm90LmRpcn0ke2ZpbGUuc2VwYXJhdG9yfWxpYiR7ZmlsZS5zZXBhcmF0b3J9ZG9zdC5qYXIiIC8+Ci0JPC9wYXRoPgotCi0JPHRhc2tkZWYgbmFtZT0iaW50ZWdyYXRlIiBjbGFzc25hbWU9Im9yZy5kaXRhLmRvc3QucGxhdGZvcm0uSW50ZWdyYXRvclRhc2siPgotCQk8Y2xhc3NwYXRoIHJlZmlkPSJkb3N0LmNsYXNzLnBhdGgiIC8+Ci0JPC90YXNrZGVmPgotCTx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJpbnRlZ3JhdGUsIGVjbGlwc2VoZWxwIj4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImludGVncmF0ZSI+Ci0JCTxpbnRlZ3JhdGUgZGl0YWRpcj0iJHtkaXRhLm90LmRpcn0iIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIHJldmlzZSBiZWxvdyBoZXJlIC0tPgotCTx0YXJnZXQgbmFtZT0iZWNsaXBzZWhlbHAiPgotCQk8YW50IGFudGZpbGU9IiR7ZGl0YS5vdC5kaXJ9JHtmaWxlLnNlcGFyYXRvcn1jb25kdWN0b3IueG1sIiB0YXJnZXQ9ImluaXQiIGRpcj0iJHtkaXRhLm90LmRpcn0iPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuY29weWNzcyIgdmFsdWU9Im5vIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuY3NzcGF0aCIgdmFsdWU9Ii4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlciIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmVjbGlwc2UucHJvdmlkZXIiIHZhbHVlPSJFY2xpcHNlLm9yZyIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmVjbGlwc2UudmVyc2lvbiIgdmFsdWU9IjMuNC4wIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuaW5wdXQiIGxvY2F0aW9uPSJYU0RMZWRpdG9ycmVsLmRpdGFtYXAiIC8+ICAgIAkJCi0JCQk8cHJvcGVydHkgbmFtZT0iY2xlYW4udGVtcCIgdmFsdWU9InRydWUiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iZGl0YS5leHRuYW1lIiB2YWx1ZT0iLmRpdGEiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iZGl0YS50ZW1wLmRpciIgbG9jYXRpb249InRlbXAiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0LmRpciIgbG9jYXRpb249IiIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJ0cmFuc3R5cGUiIHZhbHVlPSJlY2xpcHNlaGVscCIgLz4KLQkJPC9hbnQ+Ci0JCTxjb3B5IGZpbGU9Im15cGx1Z2luLnhtbCIgdG9maWxlPSJwbHVnaW4ueG1sIiBvdmVyd3JpdGU9InllcyIgLz4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkLmluZGV4IiBkZXNjcmlwdGlvbj0iQnVpbGRzIHNlYXJjaCBpbmRleCBmb3IgdGhlIHBsdWctaW4iIGlmPSJlY2xpcHNlLnJ1bm5pbmciPgotCSAgICAgPGhlbHAuYnVpbGRIZWxwSW5kZXggbWFuaWZlc3Q9InBsdWdpbi54bWwiIGRlc3RpbmF0aW9uPSIuIi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NTA5YWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUGx1Z2luLm5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC44MDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RMZWRpdG9ycmVsLmRpdGFtYXAgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNETGVkaXRvcnJlbC5kaXRhbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTNlZTAwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RMZWRpdG9ycmVsLmRpdGFtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLSA8IURPQ1RZUEUgbWFwIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIE1hcC8vRU4iICJtYXAuZHRkIj4NCi08bWFwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjeG1sc2NoLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBYTUwgc2NoZW1hcyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRzY2htLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N4bWxzY2VkLmRpdGEiIGlkPSJ4c2Rjb25jZXB0cyIgbGlua2luZz0idGFyZ2V0b25seSINCi1uYXZ0aXRsZT0iWE1MIHNjaGVtYSBlZGl0b3IiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90dmR0c2NobS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iVmFsaWRhdGluZyBYTUwgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3htbHNjZWQuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlhNTCBzY2hlbWEgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHZkdHNjaG0uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlZhbGlkYXRpbmcgWE1MIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RpbXBzY2htLmRpdGEiIG5hdnRpdGxlPSJJbXBvcnRpbmcgWE1MIHNjaGVtYXMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0c2NobS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sc2NlZC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iWE1MIHNjaGVtYSBlZGl0b3IiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90dmR0c2NobS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iVmFsaWRhdGluZyBYTUwgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRpbXB0LmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgaW1wb3J0IGVsZW1lbnRzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGluY2wuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90bmF2c3JjLmRpdGEiIG5hdnRpdGxlPSJOYXZpZ2F0aW5nIFhNTCBzY2hlbWFzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3htbHNjZWQuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlhNTCBzY2hlbWEgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sc2NlZC5kaXRhIiBsaW5raW5nPSJub3JtYWwiIG5hdnRpdGxlPSJYTUwgc2NoZW1hIGVkaXRvciI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjeG1sc2NoLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBYTUwgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRzY2htLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R2ZHRzY2htLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJWYWxpZGF0aW5nIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkY214dC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGNvbXBsZXggdHlwZXMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkY21vZC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGNvbnRlbnQgbW9kZWxzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZ2xlbS5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGdsb2JhbCBlbGVtZW50cyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRjbW9kLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgY29udGVudCBtb2RlbHMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRlbG0uZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBlbGVtZW50cyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRjbW9kLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgY29udGVudCBtb2RlbHMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRlbG1yLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGdsZW0uZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBnbG9iYWwgZWxlbWVudHMiPjwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRncnVwLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgZ3JvdXBzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGdycHIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkFkZGluZyBncm91cCByZWZlcmVuY2VzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkFkZGluZyBjb250ZW50IG1vZGVscyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGdycHIuZGl0YSIgbGlua2luZz0ibm9ybWFsIiBuYXZ0aXRsZT0iQWRkaW5nIGdyb3VwIHJlZmVyZW5jZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZ3J1cC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGdyb3VwcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGltcHQuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBpbXBvcnQgZWxlbWVudHMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkaW5jbC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGluY2x1ZGUgZWxlbWVudHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkcmRmbi5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3Mvcm5tc3BjLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJYTUwgbmFtZXNwYWNlcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHZkdHNjaG0uZGl0YSIgbmF2dGl0bGU9IlZhbGlkYXRpbmcgWE1MIHNjaGVtYXMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y3htbHNjaC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgWE1MIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRzY2htLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjeG1sc2NoLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBYTUwgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcnJlZmludGcuZGl0YSIgbmF2dGl0bGU9IlJlZmVyZW50aWFsIGludGVncml0eSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sc2NlZC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iWE1MIHNjaGVtYSBlZGl0b3IiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0c2NobS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3JubXNwYy5kaXRhIiBuYXZ0aXRsZT0iWE1MIG5hbWVzcGFjZXMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0cHJlZi5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRzbXB0LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgc2ltcGxlIHR5cGVzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZHJlZy5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIHBhdHRlcm4gZmFjZXRzIHRvIHNpbXBsZSB0eXBlcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBjb250ZW50IG1vZGVscyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRhbnllLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgYW4gYW55IGVsZW1lbnQiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZWxtLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgZWxlbWVudHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZWxtci5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRncnByLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgZ3JvdXAgcmVmZXJlbmNlcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGRlbHNjbXAuZGl0YSIgbmF2dGl0bGU9IkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50cyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3JyZWZpbnRnLmRpdGEiIG5hdnRpdGxlPSJSZWZlcmVudGlhbCBpbnRlZ3JpdHkgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZWxtLmRpdGEiIGxpbmtpbmc9InNvdXJjZW9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgZWxlbWVudHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZWxtci5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRhbnllLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgYW4gYW55IGVsZW1lbnQiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZ2xiYS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZWxtci5kaXRhIiBsaW5raW5nPSJzb3VyY2Vvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRlbG0uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkFkZGluZyBlbGVtZW50cyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRhbnllLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgYW4gYW55IGVsZW1lbnQiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZ2xiYS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08L21hcD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNETGVkaXRvcnJlbC54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNETGVkaXRvcnJlbC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYWM2ZmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL1hTRExlZGl0b3JyZWwueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyB0b3BpYz0idG9waWNzL3RjeG1sc2NoLmh0bWwiPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RjeG1sc2NoLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiIGhyZWY9InRvcGljcy90ZWR0c2NobS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBzY2hlbWEgZWRpdG9yIiBocmVmPSJ0b3BpY3MvY3htbHNjZWQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJWYWxpZGF0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdHZkdHNjaG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyIgaHJlZj0idG9waWNzL3RlZHRzY2htLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIHNjaGVtYSBlZGl0b3IiIGhyZWY9InRvcGljcy9jeG1sc2NlZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlZhbGlkYXRpbmcgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90dmR0c2NobS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkltcG9ydGluZyBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RpbXBzY2htLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiIGhyZWY9InRvcGljcy90ZWR0c2NobS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBzY2hlbWEgZWRpdG9yIiBocmVmPSJ0b3BpY3MvY3htbHNjZWQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJWYWxpZGF0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdHZkdHNjaG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgaW1wb3J0IGVsZW1lbnRzIiBocmVmPSJ0b3BpY3MvdGFkZGltcHQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgaW5jbHVkZSBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRpbmNsLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iTmF2aWdhdGluZyBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RuYXZzcmMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgc2NoZW1hIGVkaXRvciIgaHJlZj0idG9waWNzL2N4bWxzY2VkLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIHNjaGVtYSBlZGl0b3IiIGhyZWY9InRvcGljcy9jeG1sc2NlZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGN4bWxzY2guaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyIgaHJlZj0idG9waWNzL3RlZHRzY2htLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVmFsaWRhdGluZyBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3R2ZHRzY2htLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGNvbXBsZXggdHlwZXMiIGhyZWY9InRvcGljcy90YWRkY214dC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBjb250ZW50IG1vZGVscyIgaHJlZj0idG9waWNzL3RhZGRjbW9kLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGdsb2JhbCBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRnbGVtLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGNvbnRlbnQgbW9kZWxzIiBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkZWxtLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGNvbnRlbnQgbW9kZWxzIiBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzIiBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZ2xvYmFsIGVsZW1lbnRzIiBocmVmPSJ0b3BpY3MvdGFkZGdsZW0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZ3JvdXBzIiBocmVmPSJ0b3BpY3MvdGFkZGdydXAuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZ3JvdXAgcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3RhZGRncnByLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGNvbnRlbnQgbW9kZWxzIiBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZ3JvdXAgcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3RhZGRncnByLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGdyb3VwcyIgaHJlZj0idG9waWNzL3RhZGRncnVwLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGltcG9ydCBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRpbXB0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGluY2x1ZGUgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkaW5jbC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyByZWRlZmluZSBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRyZGZuLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIG5hbWVzcGFjZXMiIGhyZWY9InRvcGljcy9ybm1zcGMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJWYWxpZGF0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdHZkdHNjaG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RjeG1sc2NoLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiIGhyZWY9InRvcGljcy90ZWR0c2NobS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGN4bWxzY2guaHRtbCIvPgotPHRvcGljIGxhYmVsPSJSZWZlcmVudGlhbCBpbnRlZ3JpdHkgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yIiBocmVmPSJ0b3BpY3MvcnJlZmludGcuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgc2NoZW1hIGVkaXRvciIgaHJlZj0idG9waWNzL2N4bWxzY2VkLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiIGhyZWY9InRvcGljcy90ZWR0c2NobS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBuYW1lc3BhY2VzIiBocmVmPSJ0b3BpY3Mvcm5tc3BjLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXMiIGhyZWY9InRvcGljcy90ZWR0cHJlZi5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBzaW1wbGUgdHlwZXMiIGhyZWY9InRvcGljcy90YWRkc21wdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXMiIGhyZWY9InRvcGljcy90YWRkcmVnLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGNvbnRlbnQgbW9kZWxzIiBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYW4gYW55IGVsZW1lbnQiIGhyZWY9InRvcGljcy90YWRkYW55ZS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRlbG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzIiBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZ3JvdXAgcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3RhZGRncnByLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzIiBocmVmPSJ0b3BpY3MvdGRlbHNjbXAuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJSZWZlcmVudGlhbCBpbnRlZ3JpdHkgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yIiBocmVmPSJ0b3BpY3MvcnJlZmludGcuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkZWxtLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3RhZGRlbG1yLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuIGFueSBlbGVtZW50IiBocmVmPSJ0b3BpY3MvdGFkZGFueWUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXMiIGhyZWY9InRvcGljcy90YWRkZ2xiYS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXMiIGhyZWY9InRvcGljcy90YWRkZWxtci5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRlbG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYW4gYW55IGVsZW1lbnQiIGhyZWY9InRvcGljcy90YWRkYW55ZS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBnbG9iYWwgYXR0cmlidXRlcyIgaHJlZj0idG9waWNzL3RhZGRnbGJhLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL1hTRGVkaXRvcm1hcF90b2MuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RlZGl0b3JtYXBfdG9jLmRpdGFtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMDdjMDUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL1hTRGVkaXRvcm1hcF90b2MuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgbWFwIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIE1hcC8vRU4iDQotICJtYXAuZHRkIj4NCi08bWFwIGNvbGxlY3Rpb24tdHlwZT0ic2VxdWVuY2UiIGlkPSJ3c3R4c2R0b2MiIHRpdGxlPSJYTUwgc2NoZW1hcyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd29ya1hTRC5kaXRhIiBsaW5raW5nPSJzb3VyY2Vvbmx5IiBuYXZ0aXRsZT0iV29ya2luZyB3aXRoIFhNTCBzY2hlbWFzIChYU0RzKSI+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfY3dvcmtYU0QiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjeG1sc2NoLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBYTUwgc2NoZW1hcyI+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90Y3htbHNjaCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWFNELmRpdGEiIG5hdnRpdGxlPSJYU0QgU2x1c2ggZmlsZSINCi10b2M9Im5vIj48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3JsaW1pdGF0aW9uc19zbHVzaFhTRCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGltcHNjaG0uZGl0YSIgbmF2dGl0bGU9IkltcG9ydGluZyBhbiBYTUwgc2NoZW1hIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RpbXBzY2htIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90bmF2c3JjLmRpdGEiIG5hdnRpdGxlPSJOYXZpZ2F0aW5nIFhNTCBzY2hlbWFzIj48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RuYXZzcmMiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmRpdGEiIG5hdnRpdGxlPSJSZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90cmVmYWN0ciIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdHByZWYuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIHNjaGVtYSAgZWRpdG9yIHByZWZlcmVuY2VzIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RlZGl0cHJlZiIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uZGl0YSIgbGlua2luZz0ibm9uZSIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90ZWRpdHNjaG0iLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N4bWxzY2VkLmRpdGEiIGlkPSJ4c2Rjb25jZXB0cyIgbmF2dGl0bGU9IlhNTCBzY2hlbWEgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X2N4bWxzY2VkIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkYWdycC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuIGF0dHJpYnV0ZSBncm91cCI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkZ3JwIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkY214dC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGEgY29tcGxleCB0eXBlIj48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRjbXh0Ii8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkY21vZC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGEgY29udGVudCBtb2RlbCI+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGNtb2QiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRhbnllLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYW4gYW55IGVsZW1lbnQiPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGFueWUiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRlbG0uZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhbiBlbGVtZW50Ij48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRlbG0iLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRlbG1yLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYW4gZWxlbWVudCByZWZlcmVuY2UiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGVsbXIiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRncnByLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYSBncm91cCByZWZlcmVuY2UiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGdycHIiLz48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGdsYmEuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhIGdsb2JhbCBhdHRyaWJ1dGUiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGdsYmEiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRnbGVtLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYSBnbG9iYWwgZWxlbWVudCI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkZ2xlbSIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGdydXAuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhIGdyb3VwIj48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRncnVwIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkaW1wdC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuIGltcG9ydCBlbGVtZW50Ij4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRpbXB0Ii8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkaW5jbC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuIGluY2x1ZGUgZWxlbWVudCI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkaW5jbCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZHJkZm4uZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhIHJlZGVmaW5lIGVsZW1lbnQiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZHJkZm4iLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRzbXB0LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYSBzaW1wbGUgdHlwZSI+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZHNtcHQiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRyZWcuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhIHBhdHRlcm4gZmFjZXQgdG8gYSBzaW1wbGUgdHlwZSI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkcmVnIi8+PC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcnhzZGljb25zLmRpdGEiIGlkPSJ4c2RpY29ucyIgbmF2dGl0bGU9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3J4c2RpY29ucyIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGRlbHNjbXAuZGl0YSIgbmF2dGl0bGU9IkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50cyI+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGRlbHNjbXAiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3JyZWZpbnRnLmRpdGEiIG5hdnRpdGxlPSJSZWZlcmVudGlhbCBpbnRlZ3JpdHkgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3JyZWZpbnRnIi8+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R2ZHRzY2htLmRpdGEiIG5hdnRpdGxlPSJWYWxpZGF0aW5nIGFuIFhNTCBzY2hlbWEiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdHZ0c2NobSIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3Mvcm5tc3BjLmRpdGEiIG5hdnRpdGxlPSJYTUwgbmFtZXNwYWNlcyI+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF9ybm1zcGMiLz48L3RvcGljcmVmPg0KLTwvbWFwPg0KLTw/UHViICowMDAwMDAzODI4Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNEZWRpdG9ybWFwX3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNEZWRpdG9ybWFwX3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyM2UyYTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL1hTRGVkaXRvcm1hcF90b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iWE1MIHNjaGVtYXMiIHRvcGljPSJ0b3BpY3MvY3dvcmtYU0QuaHRtbCI+Ci08dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL2N3b3JrWFNELmh0bWwiPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfY3dvcmtYU0QiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90Y3htbHNjaC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90Y3htbHNjaCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfcmxpbWl0YXRpb25zX3NsdXNoWFNEIi8+Ci08dG9waWMgbGFiZWw9IkltcG9ydGluZyBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RpbXBzY2htLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RpbXBzY2htIi8+Ci08dG9waWMgbGFiZWw9Ik5hdmlnYXRpbmcgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90bmF2c3JjLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RuYXZzcmMiLz4KLTx0b3BpYyBsYWJlbD0iUmVmYWN0b3JpbmcgaW4gWE1MIFNjaGVtYSBGaWxlcyIgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RyZWZhY3RyIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzIiBocmVmPSJ0b3BpY3MvdGVkdHByZWYuaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGVkaXRwcmVmIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIiBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uaHRtbCI+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90ZWRpdHNjaG0iLz4KLTx0b3BpYyBsYWJlbD0iWE1MIHNjaGVtYSBlZGl0b3IiIGhyZWY9InRvcGljcy9jeG1sc2NlZC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF9jeG1sc2NlZCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYXR0cmlidXRlIGdyb3VwcyIgaHJlZj0idG9waWNzL3RhZGRhZ3JwLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRncnAiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGNvbXBsZXggdHlwZXMiIGhyZWY9InRvcGljcy90YWRkY214dC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkY214dCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgY29udGVudCBtb2RlbHMiIGhyZWY9InRvcGljcy90YWRkY21vZC5odG1sIj4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRjbW9kIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBhbiBhbnkgZWxlbWVudCIgaHJlZj0idG9waWNzL3RhZGRhbnllLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRhbnllIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRlbG0uaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGVsbSIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzIiBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGVsbXIiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGdyb3VwIHJlZmVyZW5jZXMiIGhyZWY9InRvcGljcy90YWRkZ3Jwci5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkZ3JwciIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzIiBocmVmPSJ0b3BpY3MvdGFkZGdsYmEuaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGdsYmEiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGdsb2JhbCBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRnbGVtLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRnbGVtIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBncm91cHMiIGhyZWY9InRvcGljcy90YWRkZ3J1cC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkZ3J1cCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgaW1wb3J0IGVsZW1lbnRzIiBocmVmPSJ0b3BpY3MvdGFkZGltcHQuaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGltcHQiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGluY2x1ZGUgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkaW5jbC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkaW5jbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgcmVkZWZpbmUgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkcmRmbi5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkcmRmbiIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgc2ltcGxlIHR5cGVzIiBocmVmPSJ0b3BpY3MvdGFkZHNtcHQuaHRtbCI+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkc21wdCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgcGF0dGVybiBmYWNldHMgdG8gc2ltcGxlIHR5cGVzIiBocmVmPSJ0b3BpY3MvdGFkZHJlZy5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkcmVnIi8+Ci08L3RvcGljPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiIGhyZWY9InRvcGljcy9yeHNkaWNvbnMuaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfcnhzZGljb25zIi8+Ci08dG9waWMgbGFiZWw9IkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50cyIgaHJlZj0idG9waWNzL3RkZWxzY21wLmh0bWwiPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGRlbHNjbXAiLz4KLTx0b3BpYyBsYWJlbD0iUmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciIgaHJlZj0idG9waWNzL3JyZWZpbnRnLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3JyZWZpbnRnIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJWYWxpZGF0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdHZkdHNjaG0uaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdHZ0c2NobSIvPgotPHRvcGljIGxhYmVsPSJYTUwgbmFtZXNwYWNlcyIgaHJlZj0idG9waWNzL3JubXNwYy5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF9ybm1zcGMiLz4KLTwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NTYyM2UuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBYU0RlZGl0b3JtYXBfdG9jLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwsXAotICAgICAgICAgICAgICAgaW1hZ2VzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRvcGljcy8qLmh0bSosXAotICAgICAgICAgICAgICAgaW5kZXgvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcyxcCi0JCSAgICAgICAqLm1hcGxpc3QsXAotICAgICAgICAgICAgICAgKi5kaXRhbWFwLFwKLQkJICAgICAgIHRvcGljcy8qLmRpdGEKLWJpbi5leGNsdWRlcyA9IERvY0J1aWxkLnhtbCxcCi0gICAgICAgICAgICAgICBteVBsdWdpbioueG1sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9Ccm93c2UuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9Ccm93c2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzIxMWJmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQnJvd3NlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvTW9yZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL01vcmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzIxMWJmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvTW9yZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREFsbC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMzdmYmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBbnkuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBbnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzlmOTNjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQW55LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQW55QXR0cmlidXRlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQW55QXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4MGNjMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREFueUF0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDQ5ZDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGVHcm91cC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZUdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4ZGY3My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZUdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzFkYjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZVJlZi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZVJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNjVhZjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGVSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDaG9pY2UuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDaG9pY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWY1ODNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQ2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQ29tcGxleFR5cGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDb21wbGV4VHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OGI5NGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDb21wbGV4VHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREVsZW1lbnQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0NWYwOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RFbGVtZW50UmVmLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNERWxlbWVudFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OWFjZmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RFbGVtZW50UmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNER2xvYmFsQXR0cmlidXRlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNER2xvYmFsQXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkNDlkMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdsb2JhbEF0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdsb2JhbEVsZW1lbnQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHbG9iYWxFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0NWYwOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdsb2JhbEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHcm91cC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYyYzJkNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNER3JvdXBSZWYuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHcm91cFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ODk4N2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHcm91cFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREltcG9ydC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREltcG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDRjZTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RJbXBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RJbmNsdWRlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNESW5jbHVkZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNmM1MjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RJbmNsdWRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEUmVkZWZpbmUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RSZWRlZmluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTY0YzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RSZWRlZmluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNlcXVlbmNlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmI4NjEyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTaW1wbGVFbnVtLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2ltcGxlRW51bS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZDc5NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTaW1wbGVFbnVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2ltcGxlUGF0dGVybi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNpbXBsZVBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTEzY2Y0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2ltcGxlUGF0dGVybi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNpbXBsZVR5cGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTaW1wbGVUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3NDQzMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNpbXBsZVR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L192LmNmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbmRleC9fdi5jZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNzVjNzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L192LmNmcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbmRleC9kZWxldGFibGUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvZGVsZXRhYmxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTNmNDcwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbmRleC9kZWxldGFibGUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfY29udHJpYnV0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIyYTE0OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4NCi0jTW9uIE1heSAxOCAxNzozODoyNCBFRFQgMjAwOQ0KLW9yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXI9b3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlclxuMS4wLjcwMC5xdWFsaWZpZXINCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYjc2ZWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZGVwZW5kZW5jaWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4NCi0jTW9uIE1heSAxOCAxNzozODoyNCBFRFQgMjAwOQ0KLWx1Y2VuZT0xLjkuMS52MjAwODA1MzAtMTYwMA0KLWFuYWx5emVyPW9yZy5lY2xpcHNlLmhlbHAuYmFzZVwjMy4zLjEwMS5NMjAwODA3MjhfMzR4P2xvY2FsZVw9ZW4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3ZmVmNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI01vbiBNYXkgMTggMTc6Mzg6MjQgRURUIDIwMDkNCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNteHQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWFNELmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxzY2VkLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ3Jwci5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHNjaG0uaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RuYXZzcmMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGVtLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeHNkaWNvbnMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbXB0Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xiYS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByZWYuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JyZWZpbnRnLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NobS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNtb2QuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhbnllLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ3J1cC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJkZm4uaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbmNsLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkc21wdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJlZy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGRlbHNjbXAuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjeG1sc2NoLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmR0c2NobS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbXIuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhZ3JwLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90cmVmYWN0clhTRC5odG1sPTANCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NTY0YzUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L3NlZ21lbnRzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9teXBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczN2M1Y2QuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy42Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnaW4gZm9yIGRlY2xhcmluZyB0aGUgaGVscCAgICAgICAgIC0tPgotPCEtLSBjb250cmlidXRpb25zIGZvciB1c2luZyB0aGUgdG9vbC4gICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgPHRvYyBmaWxlPSJYU0RlZGl0b3JtYXBfdG9jLnhtbCIvPgotICAgICAgIDxpbmRleCBwYXRoPSJpbmRleC8iLz4KLSAgICAgIAotPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sIi8+Ci08L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIubWFwbGlzdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLm1hcGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNmY0NjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIubWFwbGlzdAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPG1hcGxpc3QgdmVyc2lvbj0iMy42LjIiPg0KLSAgPG5hdj4NCi0gICAgPG1hcCBmaWxlPSJYU0RlZGl0b3JtYXBfdG9jLmRpdGFtYXAiLz4NCi0gIDwvbmF2Pg0KLSAgPGxpbms+DQotICAgIDxtYXAgZmlsZT0iWFNEZWRpdG9ybWFwX3RvYy5kaXRhbWFwIi8+DQotICAgIDxtYXAgZmlsZT0iWFNETGVkaXRvcnJlbC5kaXRhbWFwIi8+DQotICA8L2xpbms+DQotPC9tYXBsaXN0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyaW5kZXguaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwNzYwMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcmluZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwNyIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTwhLS0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTGljZW5zZWQgTWF0ZXJpYWxzIFByb3BlcnR5IG9mIElCTSAtLT4KLTwhLS0gVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtLT4KLTwhLS0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgLS0+Ci08IS0tIEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJpYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5JbmRleDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMT5JbmRleDwvaDE+Ci08YSBuYW1lPSJJRFgwXzQ0IiBocmVmPSIjSURYMV80NCI+RDwvYT4KLTxhIG5hbWU9IklEWDBfNTAiIGhyZWY9IiNJRFgxXzUwIj5QPC9hPgotPGEgbmFtZT0iSURYMF81MiIgaHJlZj0iI0lEWDFfNTIiPlI8L2E+Ci08YSBuYW1lPSJJRFgwXzU4IiBocmVmPSIjSURYMV81OCI+WDwvYT4KLTxocj48L2hyPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzQ0IiBocmVmPSIjSURYMF80NCI+RDwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5kZXBlbmRlbnQgYXJ0aWZhY3RzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmh0bWwjcmVmYWN0b3JpbmciPnJlZmFjdG9ydGluZyBYTUwgc2NoZW1hIGZpbGVzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV81MCIgaHJlZj0iI0lEWDBfNTAiPlA8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+cHJlZmVyZW5jZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGVkdHByZWYuaHRtbCN0ZWR0cHJlZiI+WE1MIHNjaGVtYSBmaWxlczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNTIiIGhyZWY9IiNJRFgwXzUyIj5SPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPnJlZmFjdG9yaW5nCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmh0bWwjcmVmYWN0b3JpbmciPlhNTCBzY2hlbWEgZmlsZXM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+cmVuYW1pbmcKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyI+WE1MIHNjaGVtYSBmaWxlczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNTgiIGhyZWY9IiNJRFgwXzU4Ij5YPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPlhNTCBuYW1lc3BhY2VzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3JubXNwYy5odG1sI3JubXNwYyI+b3ZlcnZpZXc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+WE1MIHNjaGVtYSBlZGl0b3IKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGFueWUuaHRtbCN0YWRkYW55ZSI+YWRkaW5nIGFuIGFueSBlbGVtZW50PC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZHJkZm4uaHRtbCN0YWRkcmRmbiI+YWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGFncnAuaHRtbCN0YWRkYWdycCI+YXR0cmlidXRlIGdyb3VwczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3JyZWZpbnRnLmh0bWwjcnJlZmludGciPmNsZWFuIHVwIGluPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGNteHQuaHRtbCN0YWRkY214dCI+Y29tcGxleCB0eXBlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRjbW9kLmh0bWwjdGFkZGNtb2QiPmNvbnRlbnQgbW9kZWxzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGRlbHNjbXAuaHRtbCN0ZGVsc2NtcCI+ZGVsZXRpbmcgY29tcG9uZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRlbG1yLmh0bWwjdGFkZGVsbXIiPmVsZW1lbnQgcmVmZXJlbmNlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRlbG0uaHRtbCN0YWRkZWxtIj5lbGVtZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRnbGJhLmh0bWwjdGFkZGdsYmEiPmdsb2JhbCBhdHRyaWJ1dGVzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdsZW0uaHRtbCN0YWRkZ2xlbSI+Z2xvYmFsIGVsZW1lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdycHIuaHRtbCN0YWRkZ3JwciI+Z3JvdXAgZmVhdHVyZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZ3J1cC5odG1sI3RhZGRncnVwIj5ncm91cHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy9yeHNkaWNvbnMuaHRtbCNyaWNvbnMiPmljb25zPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGltcHQuaHRtbCN0YWRkaW1wdCI+aW1wb3J0IGVsZW1lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGluY2wuaHRtbCN0YWRkaW5jbCI+aW5jbHVkZSBlbGVtZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL2N4bWxzY2VkLmh0bWwjY3htbHNjZWQiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZHJlZy5odG1sI3RhZGRyZWciPnBhdHRlcm4gZmFjZXRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvcnJlZmludGcuaHRtbCNycmVmaW50ZyI+cmVmZXJlbnRpYWwgaW50ZWdyaXR5PC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZHNtcHQuaHRtbCN0YWRkc21wdCI+c2ltcGxlIHR5cGVzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uaHRtbCN0ZWR0c2NobSI+WE1MIHNjaGVtYSBwcm9wZXJ0aWVzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPlhNTCBzY2hlbWEgZmlsZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGFueWUuaHRtbCN0YWRkYW55ZSI+YWRkaW5nIGFuIGFueSBlbGVtZW50PC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZHJkZm4uaHRtbCN0YWRkcmRmbiI+YWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGFncnAuaHRtbCN0YWRkYWdycCI+YXR0cmlidXRlIGdyb3VwczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRjbXh0Lmh0bWwjdGFkZGNteHQiPmNvbXBsZXggdHlwZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkY21vZC5odG1sI3RhZGRjbW9kIj5jb250ZW50IG1vZGVsczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RjeG1sc2NoLmh0bWwjdGN4bWxzY2giPmNyZWF0aW5nPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGRlbHNjbXAuaHRtbCN0ZGVsc2NtcCI+ZGVsZXRpbmcgY29tcG9uZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRwcmVmLmh0bWwjdGVkdHByZWYiPmVkaXRpbmcgcHJlZmVyZW5jZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZWR0c2NobS5odG1sI3RlZHRzY2htIj5lZGl0aW5nIHByb3BlcnRpZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZWxtci5odG1sI3RhZGRlbG1yIj5lbGVtZW50IHJlZmVyZW5jZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZWxtLmh0bWwjdGFkZGVsbSI+ZWxlbWVudHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZ2xiYS5odG1sI3RhZGRnbGJhIj5nbG9iYWwgYXR0cmlidXRlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRnbGVtLmh0bWwjdGFkZGdsZW0iPmdsb2JhbCBlbGVtZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRncnByLmh0bWwjdGFkZGdycHIiPmdyb3VwIGZlYXR1cmVzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdydXAuaHRtbCN0YWRkZ3J1cCI+Z3JvdXBzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGltcHQuaHRtbCN0YWRkaW1wdCI+aW1wb3J0IGVsZW1lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGltcHNjaG0uaHRtbCN0aW1wc2NobSI+aW1wb3J0aW5nPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGluY2wuaHRtbCN0YWRkaW5jbCI+aW5jbHVkZSBlbGVtZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RuYXZzcmMuaHRtbCN0bmF2c3JjIj5uYXZpZ2F0aW5nPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZHJlZy5odG1sI3RhZGRyZWciPnBhdHRlcm4gZmFjZXRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZHNtcHQuaHRtbCN0YWRkc21wdCI+c2ltcGxlIHR5cGVzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHZkdHNjaG0uaHRtbCN0dmR0c2NobSI+dmFsaWRhdGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5YTUwgc2NoZW1hcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90cmVmYWN0clhTRC5odG1sI3JlZmFjdG9yaW5nIj5lZGl0aW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2RkODgzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08aW5kZXg+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwgc2NoZW1hIGZpbGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90Y3htbHNjaC5odG1sI3RjeG1sc2NoIiB0aXRsZT0iQ3JlYXRpbmcgWE1MIHNjaGVtYXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpbXBvcnRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90aW1wc2NobS5odG1sI3RpbXBzY2htIiB0aXRsZT0iSW1wb3J0aW5nIFhNTCBzY2hlbWFzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibmF2aWdhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RuYXZzcmMuaHRtbCN0bmF2c3JjIiB0aXRsZT0iTmF2aWdhdGluZyBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmcgcHJlZmVyZW5jZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0cHJlZi5odG1sI3RlZHRwcmVmIiB0aXRsZT0iRWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIHByb3BlcnRpZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0c2NobS5odG1sI3RlZHRzY2htIiB0aXRsZT0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhdHRyaWJ1dGUgZ3JvdXBzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGFncnAuaHRtbCN0YWRkYWdycCIgdGl0bGU9IkFkZGluZyBhdHRyaWJ1dGUgZ3JvdXBzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iY29tcGxleCB0eXBlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRjbXh0Lmh0bWwjdGFkZGNteHQiIHRpdGxlPSJBZGRpbmcgY29tcGxleCB0eXBlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvbnRlbnQgbW9kZWxzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuaHRtbCN0YWRkY21vZCIgdGl0bGU9IkFkZGluZyBjb250ZW50IG1vZGVscyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyBhbiBhbnkgZWxlbWVudCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRhbnllLmh0bWwjdGFkZGFueWUiIHRpdGxlPSJBZGRpbmcgYW4gYW55IGVsZW1lbnQiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbGVtZW50cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRlbG0uaHRtbCN0YWRkZWxtIiB0aXRsZT0iQWRkaW5nIGVsZW1lbnRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWxlbWVudCByZWZlcmVuY2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuaHRtbCN0YWRkZWxtciIgdGl0bGU9IkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJncm91cCBmZWF0dXJlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRncnByLmh0bWwjdGFkZGdycHIiIHRpdGxlPSJBZGRpbmcgZ3JvdXAgcmVmZXJlbmNlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imdsb2JhbCBhdHRyaWJ1dGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdsYmEuaHRtbCN0YWRkZ2xiYSIgdGl0bGU9IkFkZGluZyBnbG9iYWwgYXR0cmlidXRlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imdsb2JhbCBlbGVtZW50cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRnbGVtLmh0bWwjdGFkZGdsZW0iIHRpdGxlPSJBZGRpbmcgZ2xvYmFsIGVsZW1lbnRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ3JvdXBzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdydXAuaHRtbCN0YWRkZ3J1cCIgdGl0bGU9IkFkZGluZyBncm91cHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpbXBvcnQgZWxlbWVudHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkaW1wdC5odG1sI3RhZGRpbXB0IiB0aXRsZT0iQWRkaW5nIGltcG9ydCBlbGVtZW50cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImluY2x1ZGUgZWxlbWVudHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkaW5jbC5odG1sI3RhZGRpbmNsIiB0aXRsZT0iQWRkaW5nIGluY2x1ZGUgZWxlbWVudHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmcgcmVkZWZpbmUgZWxlbWVudHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkcmRmbi5odG1sI3RhZGRyZGZuIiB0aXRsZT0iQWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2ltcGxlIHR5cGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZHNtcHQuaHRtbCN0YWRkc21wdCIgdGl0bGU9IkFkZGluZyBzaW1wbGUgdHlwZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwYXR0ZXJuIGZhY2V0cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRyZWcuaHRtbCN0YWRkcmVnIiB0aXRsZT0iQWRkaW5nIHBhdHRlcm4gZmFjZXRzIHRvIHNpbXBsZSB0eXBlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImRlbGV0aW5nIGNvbXBvbmVudHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZGVsc2NtcC5odG1sI3RkZWxzY21wIiB0aXRsZT0iRGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idmFsaWRhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R2ZHRzY2htLmh0bWwjdHZkdHNjaG0iIHRpdGxlPSJWYWxpZGF0aW5nIFhNTCBzY2hlbWFzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImRlcGVuZGVudCBhcnRpZmFjdHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJyZWZhY3RvcmluZyBYTUwgc2NoZW1hIGZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyIgdGl0bGU9IlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icmVmYWN0b3JpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJYTUwgc2NoZW1hIGZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyIgdGl0bGU9IlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icmVuYW1pbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJYTUwgc2NoZW1hIGZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyIgdGl0bGU9IlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic2NoZW1hcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90cmVmYWN0clhTRC5odG1sI3JlZmFjdG9yaW5nIiB0aXRsZT0iUmVmYWN0b3JpbmcgaW4gWE1MIFNjaGVtYSBGaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwcmVmZXJlbmNlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBzY2hlbWEgZmlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0cHJlZi5odG1sI3RlZHRwcmVmIiB0aXRsZT0iRWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iWE1MIHNjaGVtYSBlZGl0b3IiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJYTUwgc2NoZW1hIHByb3BlcnRpZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0c2NobS5odG1sI3RlZHRzY2htIiB0aXRsZT0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N4bWxzY2VkLmh0bWwjY3htbHNjZWQiIHRpdGxlPSJYTUwgc2NoZW1hIGVkaXRvciIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImF0dHJpYnV0ZSBncm91cHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkYWdycC5odG1sI3RhZGRhZ3JwIiB0aXRsZT0iQWRkaW5nIGF0dHJpYnV0ZSBncm91cHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb21wbGV4IHR5cGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGNteHQuaHRtbCN0YWRkY214dCIgdGl0bGU9IkFkZGluZyBjb21wbGV4IHR5cGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iY29udGVudCBtb2RlbHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkY21vZC5odG1sI3RhZGRjbW9kIiB0aXRsZT0iQWRkaW5nIGNvbnRlbnQgbW9kZWxzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIGFuIGFueSBlbGVtZW50Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGFueWUuaHRtbCN0YWRkYW55ZSIgdGl0bGU9IkFkZGluZyBhbiBhbnkgZWxlbWVudCIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVsZW1lbnRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGVsbS5odG1sI3RhZGRlbG0iIHRpdGxlPSJBZGRpbmcgZWxlbWVudHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbGVtZW50IHJlZmVyZW5jZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZWxtci5odG1sI3RhZGRlbG1yIiB0aXRsZT0iQWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imdyb3VwIGZlYXR1cmVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdycHIuaHRtbCN0YWRkZ3JwciIgdGl0bGU9IkFkZGluZyBncm91cCByZWZlcmVuY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ2xvYmFsIGF0dHJpYnV0ZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ2xiYS5odG1sI3RhZGRnbGJhIiB0aXRsZT0iQWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ2xvYmFsIGVsZW1lbnRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdsZW0uaHRtbCN0YWRkZ2xlbSIgdGl0bGU9IkFkZGluZyBnbG9iYWwgZWxlbWVudHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJncm91cHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ3J1cC5odG1sI3RhZGRncnVwIiB0aXRsZT0iQWRkaW5nIGdyb3VwcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImltcG9ydCBlbGVtZW50cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRpbXB0Lmh0bWwjdGFkZGltcHQiIHRpdGxlPSJBZGRpbmcgaW1wb3J0IGVsZW1lbnRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaW5jbHVkZSBlbGVtZW50cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRpbmNsLmh0bWwjdGFkZGluY2wiIHRpdGxlPSJBZGRpbmcgaW5jbHVkZSBlbGVtZW50cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyByZWRlZmluZSBlbGVtZW50cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRyZGZuLmh0bWwjdGFkZHJkZm4iIHRpdGxlPSJBZGRpbmcgcmVkZWZpbmUgZWxlbWVudHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzaW1wbGUgdHlwZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkc21wdC5odG1sI3RhZGRzbXB0IiB0aXRsZT0iQWRkaW5nIHNpbXBsZSB0eXBlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InBhdHRlcm4gZmFjZXRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZHJlZy5odG1sI3RhZGRyZWciIHRpdGxlPSJBZGRpbmcgcGF0dGVybiBmYWNldHMgdG8gc2ltcGxlIHR5cGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaWNvbnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9yeHNkaWNvbnMuaHRtbCNyaWNvbnMiIHRpdGxlPSJJY29ucyB1c2VkIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImRlbGV0aW5nIGNvbXBvbmVudHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZGVsc2NtcC5odG1sI3RkZWxzY21wIiB0aXRsZT0iRGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icmVmZXJlbnRpYWwgaW50ZWdyaXR5Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcnJlZmludGcuaHRtbCNycmVmaW50ZyIgdGl0bGU9IlJlZmVyZW50aWFsIGludGVncml0eSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjbGVhbiB1cCBpbiI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3JyZWZpbnRnLmh0bWwjcnJlZmludGciIHRpdGxlPSJSZWZlcmVudGlhbCBpbnRlZ3JpdHkgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IlhNTCBuYW1lc3BhY2VzIj4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9ybm1zcGMuaHRtbCNybm1zcGMiIHRpdGxlPSJYTUwgbmFtZXNwYWNlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci08L2luZGV4PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkYTQxOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSIAotIyBOTFNfRU5DT0RJTkc9VVRGLTggCi1QbHVnaW4ubmFtZSA9IFhNTCBzY2hlbWEgZWRpdG9yCi0KLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzdjNWNkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjYiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRoaXMgaXMgdGhlIHBsdWdpbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwICAgICAgICAgLS0+Ci08IS0tIGNvbnRyaWJ1dGlvbnMgZm9yIHVzaW5nIHRoZSB0b29sLiAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLTxwbHVnaW4+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICA8dG9jIGZpbGU9IlhTRGVkaXRvcm1hcF90b2MueG1sIi8+Ci0gICAgICAgPGluZGV4IHBhdGg9ImluZGV4LyIvPgotICAgICAgCi08L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotICAgICAgPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwiLz4KLTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWFNELmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWFNELmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODA0MDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya1hTRC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTw/UHViIEluYz8+DQotPGNvbmNlcHQgaWQ9Indvcmtpbmd3aXRoeG1sc2NoZW1hcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+V29ya2luZyB3aXRoIFhNTCBzY2hlbWFzPC90aXRsZT4NCi08c2hvcnRkZXNjPlhNTCBzY2hlbWFzIGFyZSBhbiBYTUwgbGFuZ3VhZ2UgZm9yIGRlc2NyaWJpbmcgYW5kIGNvbnN0cmFpbmluZw0KLXRoZSBjb250ZW50IG9mIFhNTCBmaWxlcy48L3Nob3J0ZGVzYz4NCi08Y29uYm9keT4NCi08cD5UaGlzIHNlY3Rpb25zIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6PC9wPg0KLTwvY29uYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGluayBocmVmPSJ0Y3htbHNjaC5kaXRhIj48bGlua3RleHQ+Q3JlYXRpbmcgWE1MIHNjaGVtYXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0aW1wc2NobS5kaXRhIj48bGlua3RleHQ+SW1wb3J0aW5nIFhNTCBzY2hlbWFzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idG5hdnNyYy5kaXRhIj48bGlua3RleHQ+TmF2aWdhdGluZyBYTUwgc2NoZW1hczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRyZWZhY3RyWFNELmRpdGEiPjxsaW5rdGV4dD5SZWZhY3RvcmluZyBpbiBYTUwgc2NoZW1hczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRlZHRwcmVmLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InJ4c2RpY29ucy5kaXRhIj48bGlua3RleHQ+SWNvbnMgdXNlZCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3I8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0ZGVsc2NtcC5kaXRhIj48bGlua3RleHQ+RGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHZkdHNjaG0uZGl0YSI+PGxpbmt0ZXh0PlZhbGlkYXRpbmcgWE1MIHNjaGVtYXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJybm1zcGMuZGl0YSI+PGxpbmt0ZXh0PlhNTCBuYW1lc3BhY2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvY29uY2VwdD4NCi08P1B1YiAqMDAwMDAwMTI2Nz8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya1hTRC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya1hTRC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NThkZWYyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYU0QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ildvcmtpbmcgd2l0aCBYTUwgc2NoZW1hcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJYTUwgc2NoZW1hcyBhcmUgYW4gWE1MIGxhbmd1YWdlIGZvciBkZXNjcmliaW5nIGFuZCBjb25zdHJhaW5pbmcgdGhlIGNvbnRlbnQgb2YgWE1MIGZpbGVzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJYTUwgc2NoZW1hcyBhcmUgYW4gWE1MIGxhbmd1YWdlIGZvciBkZXNjcmliaW5nIGFuZCBjb25zdHJhaW5pbmcgdGhlIGNvbnRlbnQgb2YgWE1MIGZpbGVzLiIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idGN4bWxzY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idGltcHNjaG0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idG5hdnNyYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0cmVmYWN0clhTRC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0ZWR0cHJlZi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJyeHNkaWNvbnMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idGRlbHNjbXAuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHZkdHNjaG0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0icm5tc3BjLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0id29ya2luZ3dpdGh4bWxzY2hlbWFzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+V29ya2luZyB3aXRoIFhNTCBzY2hlbWFzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ3b3JraW5nd2l0aHhtbHNjaGVtYXMiPjxhIG5hbWU9Indvcmtpbmd3aXRoeG1sc2NoZW1hcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V29ya2luZyB3aXRoIFhNTCBzY2hlbWFzPC9oMT4KLQotCi08ZGl2PjxwPlhNTCBzY2hlbWFzIGFyZSBhbiBYTUwgbGFuZ3VhZ2UgZm9yIGRlc2NyaWJpbmcgYW5kIGNvbnN0cmFpbmluZwotdGhlIGNvbnRlbnQgb2YgWE1MIGZpbGVzLjwvcD4KLQotPHA+VGhpcyBzZWN0aW9ucyBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOjwvcD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0Y3htbHNjaC5odG1sIiB0aXRsZT0iWW91IGNhbiBjcmVhdGUgYW4gWE1MIHNjaGVtYSBhbmQgdGhlbiBlZGl0IGl0IHVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLCB5b3UgY2FuIHNwZWNpZnkgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iPkNyZWF0aW5nIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0aW1wc2NobS5odG1sIiB0aXRsZT0iSWYgeW91IHdhbnQgdG8gd29yayB3aXRoIFhNTCBzY2hlbWEgZmlsZXMgdGhhdCB5b3UgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBwcm9kdWN0LCB5b3UgY2FuIGltcG9ydCB0aGVtIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbiB0aGVtIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVGhlIFhNTCBzY2hlbWEgZWRpdG9yIHByb3ZpZGVzIHlvdSB3aXRoIGEgc3RydWN0dXJlZCB2aWV3IG9mIHRoZSBYTUwgc2NoZW1hLiI+SW1wb3J0aW5nIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0bmF2c3JjLmh0bWwiIHRpdGxlPSJXaGVuIHlvdSBhcmUgd29ya2luZyBpbiB0aGUgU291cmNlIHZpZXcsIHlvdSBjYW4gdXNlIEYzIHRvIG5hdmlnYXRlIHRocm91Z2ggdGhlIGZpbGUgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbiB0aGUgYXBwcm9wcmlhdGUgaXRlbSBhbmQgcHJlc3NpbmcgRjMgdG8ganVtcCB0byB0aGUgaXRlbSBpdCByZWZlcnMgdG8uIj5OYXZpZ2F0aW5nIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0cmVmYWN0clhTRC5odG1sIiB0aXRsZT0iV2l0aGluIGFuIFhNTCBTY2hlbWEgZmlsZSwgcmVmYWN0b3JpbmcgYWxsb3dzIGF1dGhvcnMgdG8gbWFrZSBhIHNpbmdsZSBhcnRpZmFjdCBjaGFuZ2UsIGFuZCBoYXZlIHRoYXQgY2hhbmdlIGltcGxlbWVudGVkIHRocm91Z2hvdXQgYWxsIG90aGVyIGRlcGVuZGFudCBhcnRpZmFjdHMuIj5SZWZhY3RvcmluZyBpbiBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idGVkdHByZWYuaHRtbCIgdGl0bGU9IllvdSBjYW4gc2V0IHZhcmlvdXMgcHJlZmVyZW5jZXMgZm9yIFhNTCBzY2hlbWEgZmlsZXMgc3VjaCBhcyB0aGUgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlIGFuZCBYTUwgU2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgcHJlZml4IHVzZWQuIj5FZGl0aW5nIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idGRlbHNjbXAuaHRtbCIgdGl0bGU9IklmIHlvdSBoYXZlIGNyZWF0ZWQgYW55IFhNTCBzY2hlbWEgY29tcG9uZW50cyB5b3Ugbm8gbG9uZ2VyIG5lZWQsIHlvdSBjYW4gZGVsZXRlIHRoZW0uIj5EZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InR2ZHRzY2htLmh0bWwiIHRpdGxlPSJWYWxpZGF0aW5nIGFuIFhNTCBzY2hlbWEgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgc2VtYW50aWNhbGx5IHZhbGlkLiBBbnkgZXJyb3JzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiI+VmFsaWRhdGluZyBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVscmVmIj48c3Ryb25nPlJlbGF0ZWQgcmVmZXJlbmNlPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InJ4c2RpY29ucy5odG1sIiB0aXRsZT0iVGhlIGZvbGxvd2luZyBYTUwgc2NoZW1hIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUsIERlc2lnbiwgYW5kIFByb3BlcnRpZXMgdmlldy4iPkljb25zIHVzZWQgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJybm1zcGMuaHRtbCIgdGl0bGU9IkFuIFhNTCBuYW1lc3BhY2UgaXMgYSBjb2xsZWN0aW9uIG9mIG5hbWVzLCBpZGVudGlmaWVkIGJ5IGEgVVJJIHJlZmVyZW5jZSwgd2hpY2ggYXJlIHVzZWQgaW4gWE1MIGRvY3VtZW50cyBhcyBlbGVtZW50IHR5cGVzIGFuZCBhdHRyaWJ1dGUgbmFtZXMuIj5YTUwgbmFtZXNwYWNlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxzY2VkLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxzY2VkLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYWFiM2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sc2NlZC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjeG1sc2NlZCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+WE1MIHNjaGVtYSBlZGl0b3I8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlhNTCBzY2hlbWEgZWRpdG9yPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoaXMgcHJvZHVjdCBwcm92aWRlcyBhbiBYTUwgc2NoZW1hIGVkaXRvciBmb3IgY3JlYXRpbmcsIHZpZXdpbmcsDQotYW5kIHZhbGlkYXRpbmcgWE1MIHNjaGVtYXMuIFhNTCBzY2hlbWFzIGFyZSBhIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGVsZW1lbnQNCi1uYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoDQotY29tYmluYXRpb25zLiA8L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+QSBzY2hlbWEgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gYSBEVEQsIGJ1dCBpcyB3cml0dGVuIGluIFhNTC4gQQ0KLXNjaGVtYSBhbHNvIHByb3ZpZGVzIGV4dGVuZGVkIGZ1bmN0aW9uYWxpdHkgc3VjaCBhcyBkYXRhIHR5cGluZywgaW5oZXJpdGFuY2UsDQotYW5kIHByZXNlbnRhdGlvbiBydWxlcy48L3A+DQotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gb24gWE1MIHNjaGVtYSwgc2VlIHRoZSBmb2xsb3dpbmc6PC9wPg0KLTx1bD4NCi08bGk+IDx4cmVmIGZvcm1hdD0iaHRtbCIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTAvIiBzY29wZT0iZXh0ZXJuYWwiPmh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0wLzwveHJlZj4gPC9saT4NCi08bGk+IDx4cmVmIGZvcm1hdD0iaHRtbCIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvIiBzY29wZT0iZXh0ZXJuYWwiPmh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLzwveHJlZj4gPC9saT4NCi08bGk+IDx4cmVmIGZvcm1hdD0iaHRtbCIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvIiBzY29wZT0iZXh0ZXJuYWwiPmh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLzwveHJlZj4gPC9saT4NCi08L3VsPg0KLTxwPlVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvciwgeW91IGNhbjo8L3A+DQotPHVsPg0KLTxsaT5DcmVhdGUgYW5kIGRlbGV0ZSBYTUwgc2NoZW1hIGNvbXBvbmVudHMgc3VjaCBhcyBjb21wbGV4IHR5cGVzLCBzaW1wbGUNCi10eXBlcywgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIGF0dHJpYnV0ZSBncm91cHMsIGFuZCBncm91cHMuPC9saT4NCi08bGk+RWRpdCBYTUwgc2NoZW1hcy48L2xpPg0KLTxsaT5JbXBvcnQgZXhpc3RpbmcgWE1MIHNjaGVtYXMgZm9yIHN0cnVjdHVyZWQgdmlld2luZy48L2xpPg0KLTwvdWw+DQotPHA+VGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbiBmcm9tIHRoZSBXM0MgV2ViIHNpdGUgaXMgdXNlZCBmb3IgdmFsaWRhdGlvbi48L3A+DQotPHNlY3Rpb24+PHRpdGxlPlhNTCBzY2hlbWEgZWRpdG9yIHZpZXdzIC0gRGVzaWduLCBPdXRsaW5lLCBQcm9wZXJ0aWVzLCBhbmQNCi1Tb3VyY2U8L3RpdGxlPlRoZXJlIGFyZSBmb3VyIG1haW4gdmlld3MgeW91IGNhbiB3b3JrIHdpdGggaW4gdGhlIFhNTCBzY2hlbWENCi1lZGl0b3I6PHVsPg0KLTxsaT5EZXNpZ24gLSB0aGUgRGVzaWduIHZpZXcgcHJvdmlkZXMgYSBncmFwaGljYWwgd2F5IHRvIGVkaXQgeW91ciBzY2hlbWE8L2xpPg0KLTxsaT5PdXRsaW5lIC0gdGhlIE91dGxpbmUgdmlldyBzaG93cyB5b3UgdGhlIG1haW4gY29tcG9uZW50cyBpbiB5b3VyIFhNTCBzY2hlbWEuDQotWW91IGNhbiB1c2UgdGhpcyB2aWV3IHRvIGFkZCBhbmQgcmVtb3ZlIGNlcnRhaW4gY29tcG9uZW50cy48L2xpPg0KLTxsaT5Qcm9wZXJ0aWVzIC0gdGhlIFByb3BlcnRpZXMgdmlldyBlbmFibGVzIHlvdSB0byBlZGl0IHRoZSBwcm9wZXJ0aWVzIG9mDQoteW91ciBYTUwgc2NoZW1hIGNvbXBvbmVudHM8L2xpPg0KLTxsaT5Tb3VyY2UgLSB0aGUgU291cmNlIHZpZXcgZW5hYmxlcyB5b3UgdG8gZWRpdCB5b3VyIHNvdXJjZSBjb2RlIGRpcmVjdGx5PC9saT4NCi08L3VsPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+U3RhdHVzIG9mIHRoZSBYTUwgc2NoZW1hPC90aXRsZT48cD48L3A+PHA+VGhyZWUgc3RhdHVzIGluZGljYXRvcnMNCi1mb3IgdGhlIHNjaGVtYSBhcmUgYXZhaWxhYmxlLiBUaGV5IGFyZSBpbiB0aGUgYm90dG9tIHJpZ2h0IGNvcm5lcjo8L3A+PHVsPg0KLTxsaT4gPHVpY29udHJvbD5Xcml0YWJsZTwvdWljb250cm9sPiBvciA8dWljb250cm9sPlJlYWQgT25seTwvdWljb250cm9sPi4gPC9saT4NCi08bGk+IChTb3VyY2UgdmlldyBvbmx5KSA8dWljb250cm9sPlNtYXJ0IEluc2VydDwvdWljb250cm9sPiBvciA8dWljb250cm9sPk92ZXJ3cml0ZTwvdWljb250cm9sPi4NCi1UbyB0b2dnbGUgYmV0d2VlbiB0aGVzZSBtb2RlcywgcHJlc3MgdGhlIDx1aWNvbnRyb2w+SW5zZXJ0PC91aWNvbnRyb2w+IGJ1dHRvbg0KLW9uIHlvdXIga2V5Ym9hcmQuPC9saT4NCi08bGk+IExpbmUgYW5kIGNvbHVtbiBudW1iZXIgKGRpc3BsYXllZCBpbiB0aGUgZm9ybWF0IDw/UHViIENhcmV0Pz48dXNlcmlucHV0PmNvbHVtbg0KLSMgOiBsaW5lICM8L3VzZXJpbnB1dD4pPC9saT4NCi08L3VsPjwvc2VjdGlvbj4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KLTw/UHViICowMDAwMDAyOTA2Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxzY2VkLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxzY2VkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YTk5MTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sc2NlZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoaXMgcHJvZHVjdCBwcm92aWRlcyBhbiBYTUwgc2NoZW1hIGVkaXRvciBmb3IgY3JlYXRpbmcsIHZpZXdpbmcsIGFuZCB2YWxpZGF0aW5nIFhNTCBzY2hlbWFzLiBYTUwgc2NoZW1hcyBhcmUgYSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIHByb2R1Y3QgcHJvdmlkZXMgYW4gWE1MIHNjaGVtYSBlZGl0b3IgZm9yIGNyZWF0aW5nLCB2aWV3aW5nLCBhbmQgdmFsaWRhdGluZyBYTUwgc2NoZW1hcy4gWE1MIHNjaGVtYXMgYXJlIGEgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGN4bWxzY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRzY2htLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90dmR0c2NobS5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN4bWxzY2VkIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+WE1MIHNjaGVtYSBlZGl0b3I8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImN4bWxzY2VkIj48YSBuYW1lPSJjeG1sc2NlZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+WE1MIHNjaGVtYSBlZGl0b3I8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoaXMgcHJvZHVjdCBwcm92aWRlcyBhbiBYTUwgc2NoZW1hIGVkaXRvciBmb3IgY3JlYXRpbmcsIHZpZXdpbmcsCi1hbmQgdmFsaWRhdGluZyBYTUwgc2NoZW1hcy4gWE1MIHNjaGVtYXMgYXJlIGEgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgZWxlbWVudAotbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaAotY29tYmluYXRpb25zLiA8L3A+Ci0KLTxwPkEgc2NoZW1hIGlzIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIGEgRFRELCBidXQgaXMgd3JpdHRlbiBpbiBYTUwuIEEKLXNjaGVtYSBhbHNvIHByb3ZpZGVzIGV4dGVuZGVkIGZ1bmN0aW9uYWxpdHkgc3VjaCBhcyBkYXRhIHR5cGluZywgaW5oZXJpdGFuY2UsCi1hbmQgcHJlc2VudGF0aW9uIHJ1bGVzLjwvcD4KLQotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gb24gWE1MIHNjaGVtYSwgc2VlIHRoZSBmb2xsb3dpbmc6PC9wPgotCi08dWw+Ci08bGk+IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0wLyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0wLzwvYT4gPC9saT4KLQotPGxpPiA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8iIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS88L2E+IDwvbGk+Ci0KLTxsaT4gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvPC9hPiA8L2xpPgotCi08L3VsPgotCi08cD5Vc2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IsIHlvdSBjYW46PC9wPgotCi08dWw+Ci08bGk+Q3JlYXRlIGFuZCBkZWxldGUgWE1MIHNjaGVtYSBjb21wb25lbnRzIHN1Y2ggYXMgY29tcGxleCB0eXBlcywgc2ltcGxlCi10eXBlcywgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIGF0dHJpYnV0ZSBncm91cHMsIGFuZCBncm91cHMuPC9saT4KLQotPGxpPkVkaXQgWE1MIHNjaGVtYXMuPC9saT4KLQotPGxpPkltcG9ydCBleGlzdGluZyBYTUwgc2NoZW1hcyBmb3Igc3RydWN0dXJlZCB2aWV3aW5nLjwvbGk+Ci0KLTwvdWw+Ci0KLTxwPlRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb24gZnJvbSB0aGUgVzNDIFdlYiBzaXRlIGlzIHVzZWQgZm9yIHZhbGlkYXRpb24uPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+WE1MIHNjaGVtYSBlZGl0b3Igdmlld3MgLSBEZXNpZ24sIE91dGxpbmUsIFByb3BlcnRpZXMsIGFuZAotU291cmNlPC9oND5UaGVyZSBhcmUgZm91ciBtYWluIHZpZXdzIHlvdSBjYW4gd29yayB3aXRoIGluIHRoZSBYTUwgc2NoZW1hCi1lZGl0b3I6PHVsPgotPGxpPkRlc2lnbiAtIHRoZSBEZXNpZ24gdmlldyBwcm92aWRlcyBhIGdyYXBoaWNhbCB3YXkgdG8gZWRpdCB5b3VyIHNjaGVtYTwvbGk+Ci0KLTxsaT5PdXRsaW5lIC0gdGhlIE91dGxpbmUgdmlldyBzaG93cyB5b3UgdGhlIG1haW4gY29tcG9uZW50cyBpbiB5b3VyIFhNTCBzY2hlbWEuCi1Zb3UgY2FuIHVzZSB0aGlzIHZpZXcgdG8gYWRkIGFuZCByZW1vdmUgY2VydGFpbiBjb21wb25lbnRzLjwvbGk+Ci0KLTxsaT5Qcm9wZXJ0aWVzIC0gdGhlIFByb3BlcnRpZXMgdmlldyBlbmFibGVzIHlvdSB0byBlZGl0IHRoZSBwcm9wZXJ0aWVzIG9mCi15b3VyIFhNTCBzY2hlbWEgY29tcG9uZW50czwvbGk+Ci0KLTxsaT5Tb3VyY2UgLSB0aGUgU291cmNlIHZpZXcgZW5hYmxlcyB5b3UgdG8gZWRpdCB5b3VyIHNvdXJjZSBjb2RlIGRpcmVjdGx5PC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U3RhdHVzIG9mIHRoZSBYTUwgc2NoZW1hPC9oND48cCAvPgotPHA+VGhyZWUgc3RhdHVzIGluZGljYXRvcnMKLWZvciB0aGUgc2NoZW1hIGFyZSBhdmFpbGFibGUuIFRoZXkgYXJlIGluIHRoZSBib3R0b20gcmlnaHQgY29ybmVyOjwvcD4KLTx1bD4KLTxsaT4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V3JpdGFibGU8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlYWQgT25seTwvc3Bhbj4uIDwvbGk+Ci0KLTxsaT4gKFNvdXJjZSB2aWV3IG9ubHkpIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNtYXJ0IEluc2VydDwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3ZlcndyaXRlPC9zcGFuPi4KLVRvIHRvZ2dsZSBiZXR3ZWVuIHRoZXNlIG1vZGVzLCBwcmVzcyB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5zZXJ0PC9zcGFuPiBidXR0b24KLW9uIHlvdXIga2V5Ym9hcmQuPC9saT4KLQotPGxpPiBMaW5lIGFuZCBjb2x1bW4gbnVtYmVyIChkaXNwbGF5ZWQgaW4gdGhlIGZvcm1hdCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPmNvbHVtbgotIyA6IGxpbmUgIzwva2JkPik8L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjeG1sc2NoLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNyZWF0ZSBhbiBYTUwgc2NoZW1hIGFuZCB0aGVuIGVkaXQgaXQgdXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiBVc2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IsIHlvdSBjYW4gc3BlY2lmeSBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiI+Q3JlYXRpbmcgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0c2NobS5odG1sIiB0aXRsZT0iQWZ0ZXIgeW91IGNyZWF0ZSBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIGVkaXQgaXRzIHZhcmlvdXMgcHJvcGVydGllcywgc3VjaCBhcyBpdHMgbmFtZXNwYWNlIGFuZCBwcmVmaXguIj5FZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R2ZHRzY2htLmh0bWwiIHRpdGxlPSJWYWxpZGF0aW5nIGFuIFhNTCBzY2hlbWEgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgc2VtYW50aWNhbGx5IHZhbGlkLiBBbnkgZXJyb3JzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiI+VmFsaWRhdGluZyBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhTRC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYU0QuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUwMjYwZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhTRC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iICJyZWZlcmVuY2UuZHRkIj4NCi08cmVmZXJlbmNlIGlkPSJybGltaXRhdGlvbnNfc2x1c2hYU0QiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkxpbWl0YXRpb25zIG9mIFhNTCBzY2hlbWEgZWRpdG9yPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5MaW1pdGF0aW9ucyBvZiBYTUwgc2NoZW1hIGVkaXRvcjwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGtub3duIHByb2R1Y3QgYXNwZWN0IGxpbWl0YXRpb25zIGFuZCB3b3JrYXJvdW5kcy48L3Nob3J0ZGVzYz4NCi08cmVmYm9keT4NCi08IS0tVXNlIHRoaXMgdGVtcGxhdGUgdG8gc2luZ2xlIHNvdXJjZSB0aGUgcmVhZG1lIGluZm9ybWF0aW9uLiAgVGhlIGNvbnRlbnQgZm9yIHRoZSByZWFkbWUgaW5mb3JtYXRpb24gaXMgbWFpbnRhaW5lZCBpbiB0aGlzIHRvcGljIGFuZCBpcyBpbnNlcnRlZCBpbnRvIHRoZSByZWxhdGVkIHRvcGljIHVzaW5nIHRoZSBjb25yZWYgYXR0cmlidXRlLiBUaGlzIGZpbGUgd2lsbCBub3QgYmUgc3VyZmFjZWQgaW4geW91ciBuYXZpZ2F0aW9uLi0tPg0KLTxzZWN0aW9uPjx0aXRsZT5IZWJyZXcgTG9naWNhbCBlbmNvZGluZzwvdGl0bGU+PHAgaWQ9ImVuY29kaW5nIj48IS0tVGhlcmUgaXMgbm8gZGVmZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVudHJ5LiBJdCBpcyBmcm9tIHRoZSA1LjEgcmVhZG1lLi0tPldoZW4NCi1IZWJyZXcgTG9naWNhbCAoSVNPLTg4NTktOC1JKSBlbmNvZGluZyBpcyBzZWxlY3RlZCBhcyBhIHByZWZlcmVuY2UgZm9yIGVuY29kaW5nDQotb2YgSFRNTCBmaWxlcyAoPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+V2ViIGFuZCBYTUwgRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPkhUTUwgZmlsZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBpbiB0aGUgIldoZW4gY3JlYXRpbmcgZmlsZXMiIHNlY3Rpb24pLCB0aGUgSFRNTCBkb2N1bWVudGF0aW9uDQotZmlsZXMgZ2VuZXJhdGVkIGZyb20gYW4gWE1MIHNjaGVtYSBmaWxlIHdpbGwgc3RpbGwgaGF2ZSBhIFVURi04IGVuY29kaW5nLg0KLVRoaXMgaXMgYSBrbm93biBwcm9ibGVtLjwvcD48L3NlY3Rpb24+DQotPC9yZWZib2R5Pg0KLTwvcmVmZXJlbmNlPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWFNELmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhTRC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDJmYzI4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWFNELmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkxpbWl0YXRpb25zIG9mIFhNTCBzY2hlbWEgZWRpdG9yIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoaXMgc2VjdGlvbiBkZXNjcmliZXMga25vd24gcHJvZHVjdCBhc3BlY3QgbGltaXRhdGlvbnMgYW5kIHdvcmthcm91bmRzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGtub3duIHByb2R1Y3QgYXNwZWN0IGxpbWl0YXRpb25zIGFuZCB3b3JrYXJvdW5kcy4iIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icmxpbWl0YXRpb25zX3NsdXNoWFNEIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+TGltaXRhdGlvbnMgb2YgWE1MIHNjaGVtYSBlZGl0b3I8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJsaW1pdGF0aW9uc19zbHVzaFhTRCI+PGEgbmFtZT0icmxpbWl0YXRpb25zX3NsdXNoWFNEIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5MaW1pdGF0aW9ucyBvZiBYTUwgc2NoZW1hIGVkaXRvcjwvaDE+Ci0KLQotCi08ZGl2PjxwPlRoaXMgc2VjdGlvbiBkZXNjcmliZXMga25vd24gcHJvZHVjdCBhc3BlY3QgbGltaXRhdGlvbnMgYW5kIHdvcmthcm91bmRzLjwvcD4KLQotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+SGVicmV3IExvZ2ljYWwgZW5jb2Rpbmc8L2g0PjxwIGlkPSJybGltaXRhdGlvbnNfc2x1c2hYU0RfX2VuY29kaW5nIj48YSBuYW1lPSJybGltaXRhdGlvbnNfc2x1c2hYU0RfX2VuY29kaW5nIj48IS0tIC0tPjwvYT5XaGVuCi1IZWJyZXcgTG9naWNhbCAoSVNPLTg4NTktOC1JKSBlbmNvZGluZyBpcyBzZWxlY3RlZCBhcyBhIHByZWZlcmVuY2UgZm9yIGVuY29kaW5nCi1vZiBIVE1MIGZpbGVzICg8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQgWE1MIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUwgZmlsZXM8L3NwYW4+Ci08L3NwYW4+IGluIHRoZSAiV2hlbiBjcmVhdGluZyBmaWxlcyIgc2VjdGlvbiksIHRoZSBIVE1MIGRvY3VtZW50YXRpb24KLWZpbGVzIGdlbmVyYXRlZCBmcm9tIGFuIFhNTCBzY2hlbWEgZmlsZSB3aWxsIHN0aWxsIGhhdmUgYSBVVEYtOCBlbmNvZGluZy4KLVRoaXMgaXMgYSBrbm93biBwcm9ibGVtLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOWE0NjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwOCwgdi40MDAyLS0+DQotPCFET0NUWVBFIHJlZmVyZW5jZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIg0KLSAicmVmZXJlbmNlLmR0ZCI+DQotPD9QdWIgU3R5IF9kaXNwbGF5IEZvbnRDb2xvcj0icmVkIj8+DQotPHJlZmVyZW5jZSBpZD0icm5tc3BjIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5YTUwgbmFtZXNwYWNlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+WE1MIG5hbWVzcGFjZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QW4gWE1MIG5hbWVzcGFjZSBpcyBhIGNvbGxlY3Rpb24gb2YgbmFtZXMsIGlkZW50aWZpZWQgYnkNCi1hIFVSSSByZWZlcmVuY2UsIHdoaWNoIGFyZSB1c2VkIGluIFhNTCBkb2N1bWVudHMgYXMgZWxlbWVudCB0eXBlcw0KLWFuZCBhdHRyaWJ1dGUgbmFtZXMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIG5hbWVzcGFjZXM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxyZWZib2R5Pg0KLTxzZWN0aW9uPlhNTCBuYW1lc3BhY2VzIGFyZSBkZWZpbmVkIGJ5IGEgVzNDIHJlY29tbWVuZGF0aW9uLCBkYXRpbmcNCi0xNiBBdWd1c3QgMjAwNiwgY2FsbGVkIDx4cmVmIGZvcm1hdD0iaHRtbCINCi1ocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA2L1JFQy14bWwtbmFtZXMtMjAwNjA4MTYvIiBzY29wZT0iZXh0ZXJuYWwiPk5hbWVzcGFjZXMNCi1pbiBYTUw8L3hyZWY+LiBYTUwgdGFnIG5hbWVzIHNob3VsZCBiZSBnbG9iYWxseSB1bmlxdWUsIGFzIHdlbGwgYXMNCi1zaG9ydCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gSW4gb3JkZXIgdG8gcmVzb2x2ZSB0aGlzIGNvbmZsaWN0LA0KLXRoZSBXM0MgbmFtZXNwYWNlIHJlY29tbWVuZGF0aW9uIGRlZmluZXMgYW4gYXR0cmlidXRlIDxiPnhtbG5zPC9iPiB3aGljaA0KLWNhbiBhbWVuZCBhbnkgWE1MIGVsZW1lbnQuIElmIGl0IGlzIHByZXNlbnQgaW4gYW4gZWxlbWVudCwgaXQgaWRlbnRpZmllcw0KLXRoZSBuYW1lc3BhY2UgZm9yIHRoaXMgZWxlbWVudC48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHA+VGhlIHhtbG5zIGF0dHJpYnV0ZSBoYXMgdGhlIGZvbGxvd2luZyBzeW50YXg6PC9wPjxwPjxjb2RlcGg+eG1sbnM6PHZhcm5hbWU+cHJlZml4PC92YXJuYW1lPj1uYW1lc3BhY2U8L2NvZGVwaD4gPC9wPjxwPndoZXJlIDxjb2RlcGg+bmFtZXNwYWNlPC9jb2RlcGg+IGlzDQotYSB1bmlxdWUgVVJJIChzdWNoIGFzIHd3dy5pYm0uY29tKSBhbmQgd2hlcmUgPGNvZGVwaD48dmFybmFtZT5wcmVmaXg8L3Zhcm5hbWU+PC9jb2RlcGg+IHJlcHJlc2VudHMNCi10aGUgbmFtZXNwYWNlIGFuZCBwcm92aWRlcyBhIHBvaW50ZXIgdG8gaXQuPC9wPjxwPkluIHRoZSBmb2xsb3dpbmcNCi1jdXN0b21lciBlbGVtZW50IGRlZmluaXRpb24sIGFuIGFjY291bnRpbmcgbmFtZXNwYWNlIGlzIGRlZmluZWQgaW4NCi1vcmRlciB0byBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoIHRoZSBlbGVtZW50IHRhZ3MgZnJvbSB0aG9zZSBhcHBlYXJpbmcNCi1pbiBjdXN0b21lciByZWNvcmRzIGNyZWF0ZWQgYnkgb3RoZXIgYnVzaW5lc3MgYXBwbGljYXRpb25zOjwvcD48cD48Y29kZWJsb2NrPiZsdDthY2N0OmN1c3RvbWVyIHhtbG5zOmFjY3Q9Imh0dHA6Ly93d3cubXkuY29tL2FjY3QtUkVWMTAiPg0KLQkmbHQ7YWNjdDpuYW1lPkNvcnBvcmF0aW9uJmx0Oy9hY2N0Om5hbWU+DQotCSZsdDthY2N0Om9yZGVyIGFjY3Q6cmVmPSI1NTY2Ii8+DQotCSZsdDthY2N0OnN0YXR1cz5pbnZvaWNlJmx0Oy9hY2N0OnN0YXR1cz4NCi0mbHQ7L2FjY3Q6Y3VzdG9tZXI+ICA8L2NvZGVibG9jaz4gPC9wPjxwPlRoZSBuYW1lc3BhY2UgZGVmaW5pdGlvbg0KLWluIHRoZSBmaXJzdCBsaW5lIGFzc2lnbnMgdGhlIG5hbWVzcGFjZSBodHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwDQotdG8gdGhlIHByZWZpeC4gVGhpcyBwcmVmaXggaXMgdXNlZCBvbiB0aGUgZWxlbWVudCBuYW1lcyBzdWNoIGFzIG5hbWUNCi1pbiBvcmRlciB0byBhdHRhY2ggdGhlbSB0byB0aGUgbmFtZXNwYWNlLiBBIHNlY29uZCBhcHBsaWNhdGlvbiwgZm9yDQotZXhhbXBsZSwgYSBmdWxmaWxsbWVudCBzeXN0ZW0sIGNhbiBhc3NpZ24gYSBkaWZmZXJlbnQgbmFtZXNwYWNlIHRvDQotaXRzIGN1c3RvbWVyIGVsZW1lbnRzOjwvcD48cD48Y29kZWJsb2NrPiZsdDtmdWw6Y3VzdG9tZXIgeG1sbnM6ZnVsPSJodHRwOi8vd3d3LnlvdXIuY29tL2Z1bCI+DQotCSZsdDtmdWw6bmFtZT5Db3Jwb3JhdGlvbiZsdDsvZnVsOm5hbWU+DQotCSZsdDtmdWw6b3JkZXIgZnVsOnJlZj0iQTk4NzU2Ii8+DQotCSZsdDtmdWw6c3RhdHVzPnNoaXBwZWQmbHQ7L2Z1bDpzdGF0dXM+DQotICZsdDsvZnVsOmN1c3RvbWVyPjwvY29kZWJsb2NrPiA8L3A+PHA+QW4gYXBwbGljYXRpb24gcHJvY2Vzc2luZyBib3RoDQotZGF0YSBzdHJ1Y3R1cmVzIGlzIG5vdyBhYmxlIHRvIHRyZWF0IHRoZSBhY2NvdW50aW5nIGFuZCB0aGUgZnVsZmlsbG1lbnQNCi1kYXRhIGRpZmZlcmVudGx5LiBUaGVyZSBpcyBhIGRlZmF1bHQgbmFtZXNwYWNlLiBJdCBpcyBzZXQgaWYgbm8gbG9jYWwNCi1uYW1lIGlzIGFzc2lnbmVkIGluIHRoZSBuYW1lc3BhY2UgZGVmaW5pdGlvbjo8L3A+PHA+PGNvZGVibG9jaz4mbHQ7YWNjdDpjdXN0b21lciB4bWxucz0iaHR0cDovL3d3dy5teS5jb20vYWNjdC1SRVYxMCIgeG1sbnM6YWNjdD0iaHR0cDovL3d3dy5teS5jb20vYWNjdC1SRVYxMCAiPg0KLSZsdDtuYW1lPkNvcnBvcmF0aW9uJmx0Oy9uYW1lPg0KLSZsdDtvcmRlciBhY2N0OnJlZj0iNTU2NiIvPg0KLSZsdDtzdGF0dXM+aW52b2ljZSZsdDsvc3RhdHVzPg0KLSZsdDsvY3VzdG9tZXI+PC9jb2RlYmxvY2s+PC9wPjxwPkluIHRoaXMgZXhhbXBsZSwgYWxsIHRhZ3MgaW4gdGhlDQotY3VzdG9tZXIgcmVjb3JkIGFyZSBxdWFsaWZpZWQgdG8gcmVzaWRlIGluIHRoZSBuYW1lc3BhY2UgaHR0cDovL3d3dy5teS5jb20vYWNjdC1SRVYxMC4NCi1ObyBleHBsaWNpdCBwcmVmaXggaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIGlzIHVzZWQuDQotTm90ZSB0aGF0IHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBhcHBsaWVzIHRvIGFueSBhdHRyaWJ1dGVzIGRlZmluaXRpb25zLjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlhNTCBzY2hlbWFzIGFuZCBuYW1lc3BhY2VzPC90aXRsZT48cD5JbiB0aGUgZm9sbG93aW5nDQotWE1MIHNjaGVtYSwgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIGZvciB0aGUgc2NoZW1hIGlzIGRlZmluZWQgYXMgdGhlDQotc3RhbmRhcmQgWE1MIHNjaGVtYSBuYW1lc3BhY2UgaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWE7IHRoZXJlDQotaXMgYWxzbyBhIHNjaGVtYSBzcGVjaWZpYyBuYW1lc3BhY2UgaHR0cDovL3d3dy5pYm0uY29tLjwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSZsdDtzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6VGVzdFNjaGVtYT0iaHR0cDovL3d3dy5pYm0uY29tIj4NCi0gJmx0O3NpbXBsZVR5cGUgbmFtZT0iWmlwQ29kZVR5cGUiPg0KLSAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iaW50ZWdlciI+DQotICAmbHQ7bWluSW5jbHVzaXZlIHZhbHVlPSIxMDAwMCIvPg0KLSAmbHQ7bWF4SW5jbHVzaXZlIHZhbHVlPSI5OTk5OSIvPg0KLSZsdDsvcmVzdHJpY3Rpb24+DQotICZsdDsvc2ltcGxlVHlwZT4gDQotICZsdDshLS1lbGVtZW50IGRlZmluaXRpb25zIHNraXBwZWQgLS0+ICANCi0mbHQ7L3NjaGVtYT4gIDwvY29kZWJsb2NrPjwvcD48cD5Bc3N1bWluZyB0aGF0IHRoZSBwcmVjZWRpbmcgWE1MIHNjaGVtYQ0KLWlzIHNhdmVkIGFzIDxmaWxlcGF0aD5DOlx0ZW1wXFRlc3RTY2hlbWEueHNkPC9maWxlcGF0aD4sIGEgc2FtcGxlDQotWE1MIGZpbGUgdGhhdCB2YWxpZGF0ZXMgYWdhaW5zdCB0aGlzIHNjaGVtYSBpczo8L3A+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0mbHQ7eDphZGRyZXNzTGlzdCB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSBmaWxlOi8vL0M6L3RlbXAvVGVzdFNjaGVtYS54c2QiPg0KLSB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSBmaWxlOi8vL0M6L3RlbXAvVGVzdFNjaGVtYS54c2QiPg0KLSZsdDt4OmFkZHJlc3M+DQotICZsdDt4OnN0cmVldD54OlZhbmdlcm93c3RyYXNzZSZsdDsveDpzdHJlZXQ+DQotICAmbHQ7eDp6aXBDb2RlPjY5MTE1Jmx0Oy94OnppcENvZGU+DQotICZsdDt4OmNpdHk+eDpIZWlkZWxiZXJnJmx0Oy94OmNpdHk+DQotICZsdDsveDphZGRyZXNzPg0KLSAgICAmbHQ7eDphZGRyZXNzPiANCi0mbHQ7eDpzdHJlZXQ+eDpCZXJuYWwgUm9hZCZsdDsveDpzdHJlZXQ+IA0KLSZsdDt4OnppcENvZGU+OTAzNzUmbHQ7L3g6emlwQ29kZT4NCi0gICAgICZsdDt4OmNpdHk+eDpTYW4gSm9zZSZsdDsveDpjaXR5Pg0KLSAmbHQ7L3g6YWRkcmVzcz4NCi0mbHQ7L3g6YWRkcmVzc0xpc3Q+IDwvY29kZWJsb2NrPjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlRhcmdldCBuYW1lc3BhY2U8L3RpdGxlPjxwPiBUaGUgdGFyZ2V0IG5hbWVzcGFjZSBzZXJ2ZXMNCi10byBpZGVudGlmeSB0aGUgbmFtZXNwYWNlIHdpdGhpbiB3aGljaCB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUNCi1lbGVtZW50IGFuZCBpdHMgbmFtZSBleGlzdHMuIEluIHRoZSBjYXNlIG9mIGRlY2xhcmF0aW9ucywgdGhpcyBhc3NvY2lhdGlvbg0KLWRldGVybWluZXMgdGhlIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudHMgaW4gWE1MIGZpbGVzIGNvbmZvcm1pbmcgdG8NCi10aGUgc2NoZW1hLiBBbiBYTUwgZmlsZSBpbXBvcnRpbmcgYSBzY2hlbWEgbXVzdCByZWZlcmVuY2UgaXRzIHRhcmdldA0KLW5hbWVzcGFjZSBpbiB0aGUgc2NoZW1hTG9jYXRpb24gYXR0cmlidXRlLiBBbnkgbWlzbWF0Y2hlcyBiZXR3ZWVuDQotdGhlIHRhcmdldCBhbmQgdGhlIGFjdHVhbCBuYW1lc3BhY2Ugb2YgYW4gZWxlbWVudCBhcmUgcmVwb3J0ZWQgYXMNCi1zY2hlbWEgdmFsaWRhdGlvbiBlcnJvcnMuIEluIG91ciBleGFtcGxlLCB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBpcw0KLWh0dHA6Ly93d3cuaWJtLmNvbTsgaXQgaXMgZGVmaW5lZCBpbiB0aGUgIFhNTCBzY2hlbWEgZmlsZSBhbmQgcmVmZXJlbmNlZA0KLXR3aWNlIGluIHRoZSBYTUwgZmlsZS4gQW55IG1pc21hdGNoIGJldHdlZW4gdGhlc2UgdGhyZWUgb2NjdXJyZW5jZXMNCi1vZiB0aGUgbmFtZXNwYWNlIGxlYWQgdG8gdmFsaWRhdGlvbiBlcnJvcnMuPC9wPjxwPiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzDQotc2hvdyBob3cgdGFyZ2V0IG5hbWVzcGFjZXMgYW5kIG5hbWVzcGFjZSBwcmVmaXhlcyB3b3JrIGluIFhNTCBzY2hlbWFzDQotYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgWE1MIGluc3RhbmNlIGRvY3VtZW50cy48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5TYW1wbGUgMSAtIEEgc2NoZW1hIHdpdGggYm90aCBhIGRlZmF1bHQgYW5kIHRhcmdldA0KLW5hbWVzcGFjZSBhbmQgdW5xdWFsaWZpZWQgbG9jYWxzPC90aXRsZT48cD5UaGUgWE1MIHNjaGVtYTogIDwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSZsdDtzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIj4NCi0mbHQ7Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc1R5cGUiPg0KLSZsdDtzZXF1ZW5jZT4NCi0mbHQ7ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPiZsdDsvZWxlbWVudD4NCi0mbHQ7L3NlcXVlbmNlPg0KLSZsdDsvY29tcGxleFR5cGU+DQotJmx0O2VsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJ4OkFkZHJlc3NUeXBlIj4mbHQ7L2VsZW1lbnQ+DQotJmx0Oy9zY2hlbWE+IDwvY29kZWJsb2NrPiA8L3A+PHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZA0KLWZyb20gdGhpcyBzY2hlbWEgbG9va3MgbGlrZSB0aGlzLiBMb2NhbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBhcmUNCi11bnF1YWxpZmllZC48L3A+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0mbHQ7eDpNeUFkZHJlc3MgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSB4LnhzZCAiPg0KLSZsdDtuYW1lPlBldGVyIFNtaXRoJmx0Oy9uYW1lPg0KLSZsdDsveDpNeUFkZHJlc3M+IDwvY29kZWJsb2NrPjwvcD48cD5XaGVuIGxvY2FsIGVsZW1lbnRzIChzdWNoIGFzDQotdGhlICJuYW1lIiBlbGVtZW50KSBhbmQgYXR0cmlidXRlcyBhcmUgdW5xdWFsaWZpZWQgaW4gYW4gWE1MIGZpbGUsDQotdGhlbiBvbmx5IHRoZSByb290IGVsZW1lbnQgaXMgcXVhbGlmaWVkLiBTbywgaW4gdGhpcyBleGFtcGxlLCB0aGUNCi0ieCIgbmFtZXNwYWNlIHByZWZpeCBpcyBhc3NpZ25lZCB0byB0aGUgcm9vdCBlbGVtZW50ICJNeUFkZHJlc3MiLA0KLWFzc29jaWF0aW5nIGl0IHdpdGggdGhlIG5hbWVzcGFjZSAiaHR0cDovL3d3dy5pYm0uY29tIiwgYnV0IHRoZSJ4Ig0KLXByZWZpeCBpcyBub3QgYXNzaWduZWQgdG8gdGhlIGxvY2FsIGVsZW1lbnQgIm5hbWUiLjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlNhbXBsZSAyIC0gQSBzY2hlbWEgd2l0aCBib3RoIGEgZGVmYXVsdCBhbmQgdGFyZ2V0DQotbmFtZXNwYWNlIGFuZCBxdWFsaWZpZWQgbG9jYWxzPC90aXRsZT48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSZsdDtzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+DQotJmx0O2NvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NUeXBlIj4NCi0mbHQ7c2VxdWVuY2U+DQotJmx0O2VsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4mbHQ7L2VsZW1lbnQ+DQotJmx0Oy9zZXF1ZW5jZT4NCi0mbHQ7L2NvbXBsZXhUeXBlPg0KLSZsdDtlbGVtZW50IG5hbWU9Ik15QWRkcmVzcyIgdHlwZT0ieDpBZGRyZXNzVHlwZSI+Jmx0Oy9lbGVtZW50Pg0KLSAmbHQ7L3NjaGVtYT4gIDwvY29kZWJsb2NrPjwvcD48cD5BIHZhbGlkIFhNTCBpbnN0YW5jZSBkb2N1bWVudCBjcmVhdGVkDQotZnJvbSB0aGlzIHNjaGVtYSBsb29rcyBsaWtlIHRoaXMuIExvY2FsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGFyZQ0KLXF1YWxpZmllZCBUaGlzIGlzIGJlY2F1c2UgdGhlIGVsZW1lbnRGb3JtRGVmYXVsdCBhdHRyaWJ1dGUgaXMgc2V0DQotdG8gcXVhbGlmaWVkIGluIHRoZSBYTUwgc2NoZW1hLjwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSAgJmx0O3g6TXlBZGRyZXNzIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0geHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20geC54c2QgIj4gDQotJmx0O3g6bmFtZT5QZXRlciBTbWl0aCZsdDsveDpuYW1lPg0KLSAmbHQ7L3g6TXlBZGRyZXNzPjwvY29kZWJsb2NrPiA8L3A+PHA+SW4gdGhpcyBleGFtcGxlLCB0aGUgIngiIG5hbWVzcGFjZQ0KLXByZWZpeCBpcyBhc3NpZ25lZCB0byBib3RoIHRoZSByb290IGVsZW1lbnQgIk15QWRkcmVzcyIgYW5kIHRoZSBsb2NhbA0KLWVsZW1lbnQgIm5hbWUiLCBhc3NvY2lhdGluZyB0aGVtIHdpdGggdGhlIG5hbWVzcGFjZSAiaHR0cDovL3d3dy5pYm0uY29tIiwuPC9wPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+U2FtcGxlIDMgLSBTY2hlbWEgd2l0aCB0YXJnZXQgTmFtZXNwYWNlLCBhbmQgZXhwbGljaXRseQ0KLWRlZmluZXMgeG1sbnM6eHNkPC90aXRsZT48cD5UaGlzIFhNTCBzY2hlbWEgYWRkcyB0aGlzIGF0dHJpYnV0ZTogIDwvcD48Y29kZXBoPnhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEgPC9jb2RlcGg+PHA+V2hhdA0KLXRoaXMgbWVhbnMgaXMgdGhhdCBlYWNoIG9mIHRoZSBjb25zdHJ1Y3RzIHRoYXQgYXJlIGRlZmluZWQgYnkgdGhlDQotWE1MIHNjaGVtYSBsYW5ndWFnZSB3aWxsIG5lZWQgdG8gYmUgcXVhbGlmaWVkIHdpdGggdGhlICJ4c2QiIHByZWZpeC4NCi1Gb3IgZXhhbXBsZSwgeHNkOmNvbXBsZXhUeXBlIGFuZCAgeHNkOnN0cmluZzwvcD48cD4uIE5vdGUgdGhhdCB5b3UNCi1jYW4gY2hvc2UgYW55IG90aGVyIHByZWZpeGVzIHN1Y2ggYXMgInhzIiBvciAiZm9vYmFyIiBpbiB5b3VyIGRlY2xhcmF0aW9uDQotYW5kIHVzYWdlLjwvcD48cD5Zb3UgY2FuIHNwZWNpZnkgdGhpcyBwcmVmaXggaW4gdGhlIFhNTCBzY2hlbWEgcHJlZmVyZW5jZXMNCi1wYWdlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9wPjxwPkFsbA0KLXVzZXIgZGVmaW5lZCB0eXBlcyBiZWxvbmcgdG8gdGhlIG5hbWVzcGFjZSAgaHR0cDovL3d3dy5pYm0uY29tIGFzDQotZGVmaW5lZCBieSB0aGUgdGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZSwgYW5kIHRoZSBwcmVmaXggaXMgIngiIGFzDQotZGVmaW5lZCBieSB0aGUgeG1sbnM6eCBhdHRyaWJ1dGUuPC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+DQotJmx0O3hzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSI+DQotJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSI+DQotJmx0O3hzZDpzZXF1ZW5jZT4NCi0JCSAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Jmx0Oy94c2Q6ZWxlbWVudD4NCi0mbHQ7L3hzZDpzZXF1ZW5jZT4NCi0gJmx0Oy94c2Q6Y29tcGxleFR5cGU+DQotICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJNeUFkZHJlc3MiIHR5cGU9Ing6QWRkcmVzc1R5cGUiPiZsdDsveHNkOmVsZW1lbnQ+DQotJmx0Oy94c2Q6c2NoZW1hPjwvY29kZWJsb2NrPiA8L3A+PHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQNCi1jcmVhdGVkIGZyb20gdGhpcyBzY2hlbWEgbG9va3MgbGlrZSB0aGlzLiBMb2NhbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcw0KLWFyZSB1bnF1YWxpZmllZC4gVGhlIHNlbWFudGljcyBvZiBxdWFsaWZpY2F0aW9uIGlzIHRoZSBzYW1lIGFzIFNhbXBsZQ0KLTEuPC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+DQotICZsdDt4Ok15QWRkcmVzcyB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UieHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20geC54c2QgIj4NCi0mbHQ7bmFtZT5QZXRlciBTbWl0aCZsdDsvbmFtZT4NCi0gJmx0Oy94Ok15QWRkcmVzcz48L2NvZGVibG9jaz48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5TYW1wbGUgNCAtIFNjaGVtYSB3aXRoIHVuZGVjbGFyZWQgdGFyZ2V0IE5hbWVzcGFjZQ0KLXRoYXQgZXhwbGljaXRseSBkZWZpbmVzIHhtbG5zOnhzZDwvdGl0bGU+PHA+VGhpcyBYTUwgc2NoZW1hIGhhcyBubw0KLXRhcmdldCBuYW1lc3BhY2UgZm9yIGl0c2VsZi4gSW4gdGhpcyBjYXNlLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQNCi10aGF0IGFsbCBYTUwgc2NoZW1hIGNvbnN0cnVjdHMgYmUgZXhwbGljaXRseSBxdWFsaWZpZWQgd2l0aCBhIHByZWZpeA0KLXN1Y2ggYXMgInhzZCIuIFRoZSBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20gdGhpcyBzY2hlbWEgc3VjaA0KLWFzIEFkZHJlc3NUeXBlIGFyZSByZWZlcmVuY2VkIHdpdGhvdXQgbmFtZXNwYWNlIHF1YWxpZmljYXRpb24gc2luY2UNCi10aGVyZSBpcyBubyBuYW1lc3BhY2UgcHJlZml4LiAgPC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+DQotJmx0O3hzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSI+DQotJmx0O3hzZDpzZXF1ZW5jZT4NCi0mbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Jmx0Oy94c2Q6ZWxlbWVudD4NCi0mbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Jmx0Oy94c2Q6ZWxlbWVudD4NCi0mbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Jmx0Oy94c2Q6ZWxlbWVudD4gDQotJmx0Oy94c2Q6c2VxdWVuY2U+IA0KLSZsdDsveHNkOmNvbXBsZXhUeXBlPg0KLSZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJNeUFkZHJlc3MiIHR5cGU9IkFkZHJlc3NUeXBlIj4mbHQ7L3hzZDplbGVtZW50PiANCi0mbHQ7L3hzZDpzY2hlbWE+IDwvY29kZWJsb2NrPjwvcD48cD5BIHZhbGlkIFhNTCBpbnN0YW5jZSBkb2N1bWVudA0KLWNyZWF0ZWQgZnJvbSB0aGUgc2NoZW1hIGxvb2tzIGxpa2UgdGhpcy4gQWxsIGVsZW1lbnRzIGFyZSB1bnF1YWxpZmllZC48L3A+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0mbHQ7TXlBZGRyZXNzIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJ4LnhzZCI+DQotJmx0O25hbWU+bmFtZSZsdDsvbmFtZT4NCi0mbHQ7L015QWRkcmVzcz48L2NvZGVibG9jaz4gIDwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlNhbXBsZSA1IC0gQSBzY2hlbWEgd2hlcmUgdGhlIHRhcmdldCBuYW1lc3BhY2UgaXMNCi10aGUgZGVmYXVsdCBuYW1lc3BhY2U8L3RpdGxlPjxwPlRoaXMgaXMgYW4gWE1MIHNjaGVtYSB3aGVyZSB0aGUgdGFyZ2V0DQotbmFtZXNwYWNlIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZS4gQXMgd2VsbCwgdGhlIG5hbWVzcGFjZSBoYXMgbm8NCi1uYW1lc3BhY2UgcHJlZml4LjwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSAmbHQ7eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM9Imh0dHA6Ly93d3cuaWJtLmNvbSI+DQotJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSI+DQotJmx0O3hzZDpzZXF1ZW5jZT4NCi0mbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Jmx0Oy94c2Q6ZWxlbWVudD4NCi0mbHQ7L3hzZDpzZXF1ZW5jZT4NCi0mbHQ7L3hzZDpjb21wbGV4VHlwZT4NCi0gJmx0O3hzZDplbGVtZW50IG5hbWU9Ik15QWRkcmVzcyIgdHlwZT0iQWRkcmVzc1R5cGUiPiZsdDsveHNkOmVsZW1lbnQ+DQotICZsdDsveHNkOnNjaGVtYT4gPC9jb2RlYmxvY2s+IDwvcD48cD5BIHZhbGlkIFhNTCBpbnN0YW5jZSBkb2N1bWVudA0KLWNyZWF0ZWQgZnJvbSB0aGUgc2NoZW1hIGxvb2tzIGxpa2UgdGhpczo8L3A+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLSZsdDtNeUFkZHJlc3MgeG1sbnM9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gTmV3WE1MU2NoZW1hLnhzZCI+DQotJmx0O25hbWU+bmFtZSZsdDsvbmFtZT4NCi0gJmx0Oy9NeUFkZHJlc3M+ICA8L2NvZGVibG9jaz4gPC9wPjwvc2VjdGlvbj4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+PD9QdWIgQ2FyZXQ/Pg0KLTw/UHViICowMDAwMDEyMDM4Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU4MTAyNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iWE1MIG5hbWVzcGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQW4gWE1MIG5hbWVzcGFjZSBpcyBhIGNvbGxlY3Rpb24gb2YgbmFtZXMsIGlkZW50aWZpZWQgYnkgYSBVUkkgcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQW4gWE1MIG5hbWVzcGFjZSBpcyBhIGNvbGxlY3Rpb24gb2YgbmFtZXMsIGlkZW50aWZpZWQgYnkgYSBVUkkgcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgbmFtZXNwYWNlcywgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgbmFtZXNwYWNlcywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdHByZWYuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJybm1zcGMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5YTUwgbmFtZXNwYWNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icm5tc3BjIj48YSBuYW1lPSJybm1zcGMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlhNTCBuYW1lc3BhY2VzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BbiBYTUwgbmFtZXNwYWNlIGlzIGEgY29sbGVjdGlvbiBvZiBuYW1lcywgaWRlbnRpZmllZCBieSBhIFVSSQotcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZQotbmFtZXMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5YTUwgbmFtZXNwYWNlcyBhcmUgZGVmaW5lZCBieSBhIFczQyByZWNvbW1lbmRhdGlvbiwgZGF0aW5nIDE2IEF1Z3VzdAotMjAwNiwgY2FsbGVkIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDYvUkVDLXhtbC1uYW1lcy0yMDA2MDgxNi8iIHRhcmdldD0iX2JsYW5rIj5OYW1lc3BhY2VzIGluIFhNTDwvYT4uIFhNTCB0YWcgbmFtZXMgc2hvdWxkIGJlIGdsb2JhbGx5Ci11bmlxdWUsIGFzIHdlbGwgYXMgc2hvcnQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIEluIG9yZGVyIHRvIHJlc29sdmUgdGhpcwotY29uZmxpY3QsIHRoZSBXM0MgbmFtZXNwYWNlIHJlY29tbWVuZGF0aW9uIGRlZmluZXMgYW4gYXR0cmlidXRlIDxzdHJvbmc+eG1sbnM8L3N0cm9uZz4gd2hpY2gKLWNhbiBhbWVuZCBhbnkgWE1MIGVsZW1lbnQuIElmIGl0IGlzIHByZXNlbnQgaW4gYW4gZWxlbWVudCwgaXQgaWRlbnRpZmllcyB0aGUKLW5hbWVzcGFjZSBmb3IgdGhpcyBlbGVtZW50LjwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgeG1sbnMgYXR0cmlidXRlIGhhcyB0aGUgZm9sbG93aW5nIHN5bnRheDo8L3A+Ci08cD48c2FtcCBjbGFzcz0iY29kZXBoIj54bWxuczo8dmFyIGNsYXNzPSJ2YXJuYW1lIj5wcmVmaXg8L3Zhcj49bmFtZXNwYWNlPC9zYW1wPiA8L3A+Ci08cD53aGVyZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5uYW1lc3BhY2U8L3NhbXA+IGlzIGEgdW5pcXVlIFVSSSAoc3VjaCBhcyB3d3cuaWJtLmNvbSkgYW5kIHdoZXJlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPjx2YXIgY2xhc3M9InZhcm5hbWUiPnByZWZpeDwvdmFyPjwvc2FtcD4gcmVwcmVzZW50cwotdGhlIG5hbWVzcGFjZSBhbmQgcHJvdmlkZXMgYSBwb2ludGVyIHRvIGl0LjwvcD4KLTxwPkluIHRoZSBmb2xsb3dpbmcgY3VzdG9tZXIKLWVsZW1lbnQgZGVmaW5pdGlvbiwgYW4gYWNjb3VudGluZyBuYW1lc3BhY2UgaXMgZGVmaW5lZCBpbiBvcmRlciB0byBiZSBhYmxlCi10byBkaXN0aW5ndWlzaCB0aGUgZWxlbWVudCB0YWdzIGZyb20gdGhvc2UgYXBwZWFyaW5nIGluIGN1c3RvbWVyIHJlY29yZHMgY3JlYXRlZAotYnkgb3RoZXIgYnVzaW5lc3MgYXBwbGljYXRpb25zOjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0O2FjY3Q6Y3VzdG9tZXIgeG1sbnM6YWNjdD0iaHR0cDovL3d3dy5teS5jb20vYWNjdC1SRVYxMCImZ3Q7Ci0JJmx0O2FjY3Q6bmFtZSZndDtDb3Jwb3JhdGlvbiZsdDsvYWNjdDpuYW1lJmd0OwotCSZsdDthY2N0Om9yZGVyIGFjY3Q6cmVmPSI1NTY2Ii8mZ3Q7Ci0JJmx0O2FjY3Q6c3RhdHVzJmd0O2ludm9pY2UmbHQ7L2FjY3Q6c3RhdHVzJmd0OwotJmx0Oy9hY2N0OmN1c3RvbWVyJmd0OyAgPC9wcmU+Ci0gPC9kaXY+Ci08cD5UaGUgbmFtZXNwYWNlIGRlZmluaXRpb24gaW4gdGhlIGZpcnN0Ci1saW5lIGFzc2lnbnMgdGhlIG5hbWVzcGFjZSBodHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwIHRvIHRoZSBwcmVmaXguIFRoaXMKLXByZWZpeCBpcyB1c2VkIG9uIHRoZSBlbGVtZW50IG5hbWVzIHN1Y2ggYXMgbmFtZSBpbiBvcmRlciB0byBhdHRhY2ggdGhlbSB0bwotdGhlIG5hbWVzcGFjZS4gQSBzZWNvbmQgYXBwbGljYXRpb24sIGZvciBleGFtcGxlLCBhIGZ1bGZpbGxtZW50IHN5c3RlbSwgY2FuCi1hc3NpZ24gYSBkaWZmZXJlbnQgbmFtZXNwYWNlIHRvIGl0cyBjdXN0b21lciBlbGVtZW50czo8L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDtmdWw6Y3VzdG9tZXIgeG1sbnM6ZnVsPSJodHRwOi8vd3d3LnlvdXIuY29tL2Z1bCImZ3Q7Ci0JJmx0O2Z1bDpuYW1lJmd0O0NvcnBvcmF0aW9uJmx0Oy9mdWw6bmFtZSZndDsKLQkmbHQ7ZnVsOm9yZGVyIGZ1bDpyZWY9IkE5ODc1NiIvJmd0OwotCSZsdDtmdWw6c3RhdHVzJmd0O3NoaXBwZWQmbHQ7L2Z1bDpzdGF0dXMmZ3Q7Ci0gJmx0Oy9mdWw6Y3VzdG9tZXImZ3Q7PC9wcmU+Ci0gPC9kaXY+Ci08cD5BbiBhcHBsaWNhdGlvbiBwcm9jZXNzaW5nIGJvdGggZGF0YQotc3RydWN0dXJlcyBpcyBub3cgYWJsZSB0byB0cmVhdCB0aGUgYWNjb3VudGluZyBhbmQgdGhlIGZ1bGZpbGxtZW50IGRhdGEgZGlmZmVyZW50bHkuCi1UaGVyZSBpcyBhIGRlZmF1bHQgbmFtZXNwYWNlLiBJdCBpcyBzZXQgaWYgbm8gbG9jYWwgbmFtZSBpcyBhc3NpZ25lZCBpbiB0aGUKLW5hbWVzcGFjZSBkZWZpbml0aW9uOjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0O2FjY3Q6Y3VzdG9tZXIgeG1sbnM9Imh0dHA6Ly93d3cubXkuY29tL2FjY3QtUkVWMTAiIHhtbG5zOmFjY3Q9Imh0dHA6Ly93d3cubXkuY29tL2FjY3QtUkVWMTAgIiZndDsKLSZsdDtuYW1lJmd0O0NvcnBvcmF0aW9uJmx0Oy9uYW1lJmd0OwotJmx0O29yZGVyIGFjY3Q6cmVmPSI1NTY2Ii8mZ3Q7Ci0mbHQ7c3RhdHVzJmd0O2ludm9pY2UmbHQ7L3N0YXR1cyZndDsKLSZsdDsvY3VzdG9tZXImZ3Q7PC9wcmU+Ci08L2Rpdj4KLTxwPkluIHRoaXMgZXhhbXBsZSwgYWxsIHRhZ3MgaW4gdGhlIGN1c3RvbWVyCi1yZWNvcmQgYXJlIHF1YWxpZmllZCB0byByZXNpZGUgaW4gdGhlIG5hbWVzcGFjZSBodHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwLgotTm8gZXhwbGljaXQgcHJlZml4IGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBpcyB1c2VkLiBOb3RlIHRoYXQKLXRoZSBkZWZhdWx0IG5hbWVzcGFjZSBhcHBsaWVzIHRvIGFueSBhdHRyaWJ1dGVzIGRlZmluaXRpb25zLjwvcD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+WE1MIHNjaGVtYXMgYW5kIG5hbWVzcGFjZXM8L2g0PjxwPkluIHRoZSBmb2xsb3dpbmcgWE1MCi1zY2hlbWEsIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBmb3IgdGhlIHNjaGVtYSBpcyBkZWZpbmVkIGFzIHRoZSBzdGFuZGFyZCBYTUwKLXNjaGVtYSBuYW1lc3BhY2UgaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWE7IHRoZXJlIGlzIGFsc28gYSBzY2hlbWEKLXNwZWNpZmljIG5hbWVzcGFjZSBodHRwOi8vd3d3LmlibS5jb20uPC9wPgotPGRpdiBjbGFzcz0icCI+PHByZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKLSZsdDtzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6VGVzdFNjaGVtYT0iaHR0cDovL3d3dy5pYm0uY29tIiZndDsKLSAmbHQ7c2ltcGxlVHlwZSBuYW1lPSJaaXBDb2RlVHlwZSImZ3Q7Ci0gJmx0O3Jlc3RyaWN0aW9uIGJhc2U9ImludGVnZXIiJmd0OwotICAmbHQ7bWluSW5jbHVzaXZlIHZhbHVlPSIxMDAwMCIvJmd0OwotICZsdDttYXhJbmNsdXNpdmUgdmFsdWU9Ijk5OTk5Ii8mZ3Q7Ci0mbHQ7L3Jlc3RyaWN0aW9uJmd0OwotICZsdDsvc2ltcGxlVHlwZSZndDsgCi0gJmx0OyEtLWVsZW1lbnQgZGVmaW5pdGlvbnMgc2tpcHBlZCAtLSZndDsgIAotJmx0Oy9zY2hlbWEmZ3Q7ICA8L3ByZT4KLTwvZGl2PgotPHA+QXNzdW1pbmcgdGhhdCB0aGUgcHJlY2VkaW5nIFhNTCBzY2hlbWEgaXMKLXNhdmVkIGFzIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+QzpcdGVtcFxUZXN0U2NoZW1hLnhzZDwvc3Bhbj4sIGEgc2FtcGxlIFhNTCBmaWxlIHRoYXQKLXZhbGlkYXRlcyBhZ2FpbnN0IHRoaXMgc2NoZW1hIGlzOjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7eDphZGRyZXNzTGlzdCB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSBmaWxlOi8vL0M6L3RlbXAvVGVzdFNjaGVtYS54c2QiJmd0OwotIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIGZpbGU6Ly8vQzovdGVtcC9UZXN0U2NoZW1hLnhzZCImZ3Q7Ci0mbHQ7eDphZGRyZXNzJmd0OwotICZsdDt4OnN0cmVldCZndDt4OlZhbmdlcm93c3RyYXNzZSZsdDsveDpzdHJlZXQmZ3Q7Ci0gICZsdDt4OnppcENvZGUmZ3Q7NjkxMTUmbHQ7L3g6emlwQ29kZSZndDsKLSAmbHQ7eDpjaXR5Jmd0O3g6SGVpZGVsYmVyZyZsdDsveDpjaXR5Jmd0OwotICZsdDsveDphZGRyZXNzJmd0OwotICAgICZsdDt4OmFkZHJlc3MmZ3Q7IAotJmx0O3g6c3RyZWV0Jmd0O3g6QmVybmFsIFJvYWQmbHQ7L3g6c3RyZWV0Jmd0OyAKLSZsdDt4OnppcENvZGUmZ3Q7OTAzNzUmbHQ7L3g6emlwQ29kZSZndDsKLSAgICAgJmx0O3g6Y2l0eSZndDt4OlNhbiBKb3NlJmx0Oy94OmNpdHkmZ3Q7Ci0gJmx0Oy94OmFkZHJlc3MmZ3Q7Ci0mbHQ7L3g6YWRkcmVzc0xpc3QmZ3Q7IDwvcHJlPgotPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlRhcmdldCBuYW1lc3BhY2U8L2g0PjxwPiBUaGUgdGFyZ2V0IG5hbWVzcGFjZSBzZXJ2ZXMgdG8KLWlkZW50aWZ5IHRoZSBuYW1lc3BhY2Ugd2l0aGluIHdoaWNoIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBlbGVtZW50IGFuZAotaXRzIG5hbWUgZXhpc3RzLiBJbiB0aGUgY2FzZSBvZiBkZWNsYXJhdGlvbnMsIHRoaXMgYXNzb2NpYXRpb24gZGV0ZXJtaW5lcwotdGhlIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudHMgaW4gWE1MIGZpbGVzIGNvbmZvcm1pbmcgdG8gdGhlIHNjaGVtYS4gQW4gWE1MCi1maWxlIGltcG9ydGluZyBhIHNjaGVtYSBtdXN0IHJlZmVyZW5jZSBpdHMgdGFyZ2V0IG5hbWVzcGFjZSBpbiB0aGUgc2NoZW1hTG9jYXRpb24KLWF0dHJpYnV0ZS4gQW55IG1pc21hdGNoZXMgYmV0d2VlbiB0aGUgdGFyZ2V0IGFuZCB0aGUgYWN0dWFsIG5hbWVzcGFjZSBvZiBhbgotZWxlbWVudCBhcmUgcmVwb3J0ZWQgYXMgc2NoZW1hIHZhbGlkYXRpb24gZXJyb3JzLiBJbiBvdXIgZXhhbXBsZSwgdGhlIHRhcmdldAotbmFtZXNwYWNlIGlzIGh0dHA6Ly93d3cuaWJtLmNvbTsgaXQgaXMgZGVmaW5lZCBpbiB0aGUgIFhNTCBzY2hlbWEgZmlsZSBhbmQKLXJlZmVyZW5jZWQgdHdpY2UgaW4gdGhlIFhNTCBmaWxlLiBBbnkgbWlzbWF0Y2ggYmV0d2VlbiB0aGVzZSB0aHJlZSBvY2N1cnJlbmNlcwotb2YgdGhlIG5hbWVzcGFjZSBsZWFkIHRvIHZhbGlkYXRpb24gZXJyb3JzLjwvcD4KLTxwPiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzCi1zaG93IGhvdyB0YXJnZXQgbmFtZXNwYWNlcyBhbmQgbmFtZXNwYWNlIHByZWZpeGVzIHdvcmsgaW4gWE1MIHNjaGVtYXMgYW5kCi10aGVpciBjb3JyZXNwb25kaW5nIFhNTCBpbnN0YW5jZSBkb2N1bWVudHMuPC9wPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TYW1wbGUgMSAtIEEgc2NoZW1hIHdpdGggYm90aCBhIGRlZmF1bHQgYW5kIHRhcmdldCBuYW1lc3BhY2UKLWFuZCB1bnF1YWxpZmllZCBsb2NhbHM8L2g0PjxwPlRoZSBYTUwgc2NoZW1hOiAgPC9wPgotPGRpdiBjbGFzcz0icCI+PHByZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKLSZsdDtzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiZndDsKLSZsdDtjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSImZ3Q7Ci0mbHQ7c2VxdWVuY2UmZ3Q7Ci0mbHQ7ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciJmd0OyZsdDsvZWxlbWVudCZndDsKLSZsdDsvc2VxdWVuY2UmZ3Q7Ci0mbHQ7L2NvbXBsZXhUeXBlJmd0OwotJmx0O2VsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJ4OkFkZHJlc3NUeXBlIiZndDsmbHQ7L2VsZW1lbnQmZ3Q7Ci0mbHQ7L3NjaGVtYSZndDsgPC9wcmU+Ci0gPC9kaXY+Ci08cD5BIHZhbGlkIFhNTCBpbnN0YW5jZSBkb2N1bWVudCBjcmVhdGVkIGZyb20KLXRoaXMgc2NoZW1hIGxvb2tzIGxpa2UgdGhpcy4gTG9jYWwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgYXJlIHVucXVhbGlmaWVkLjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7eDpNeUFkZHJlc3MgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSB4LnhzZCAiJmd0OwotJmx0O25hbWUmZ3Q7UGV0ZXIgU21pdGgmbHQ7L25hbWUmZ3Q7Ci0mbHQ7L3g6TXlBZGRyZXNzJmd0OyA8L3ByZT4KLTwvZGl2PgotPHA+V2hlbiBsb2NhbCBlbGVtZW50cyAoc3VjaCBhcyB0aGUgIm5hbWUiCi1lbGVtZW50KSBhbmQgYXR0cmlidXRlcyBhcmUgdW5xdWFsaWZpZWQgaW4gYW4gWE1MIGZpbGUsIHRoZW4gb25seSB0aGUgcm9vdAotZWxlbWVudCBpcyBxdWFsaWZpZWQuIFNvLCBpbiB0aGlzIGV4YW1wbGUsIHRoZSAieCIgbmFtZXNwYWNlIHByZWZpeCBpcyBhc3NpZ25lZAotdG8gdGhlIHJvb3QgZWxlbWVudCAiTXlBZGRyZXNzIiwgYXNzb2NpYXRpbmcgaXQgd2l0aCB0aGUgbmFtZXNwYWNlICJodHRwOi8vd3d3LmlibS5jb20iLAotYnV0IHRoZSJ4IiBwcmVmaXggaXMgbm90IGFzc2lnbmVkIHRvIHRoZSBsb2NhbCBlbGVtZW50ICJuYW1lIi48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlNhbXBsZSAyIC0gQSBzY2hlbWEgd2l0aCBib3RoIGEgZGVmYXVsdCBhbmQgdGFyZ2V0IG5hbWVzcGFjZQotYW5kIHF1YWxpZmllZCBsb2NhbHM8L2g0PjxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiJmd0OwotJmx0O2NvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NUeXBlIiZndDsKLSZsdDtzZXF1ZW5jZSZndDsKLSZsdDtlbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyImZ3Q7Jmx0Oy9lbGVtZW50Jmd0OwotJmx0Oy9zZXF1ZW5jZSZndDsKLSZsdDsvY29tcGxleFR5cGUmZ3Q7Ci0mbHQ7ZWxlbWVudCBuYW1lPSJNeUFkZHJlc3MiIHR5cGU9Ing6QWRkcmVzc1R5cGUiJmd0OyZsdDsvZWxlbWVudCZndDsKLSAmbHQ7L3NjaGVtYSZndDsgIDwvcHJlPgotPC9kaXY+Ci08cD5BIHZhbGlkIFhNTCBpbnN0YW5jZSBkb2N1bWVudCBjcmVhdGVkIGZyb20KLXRoaXMgc2NoZW1hIGxvb2tzIGxpa2UgdGhpcy4gTG9jYWwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgYXJlIHF1YWxpZmllZCBUaGlzCi1pcyBiZWNhdXNlIHRoZSBlbGVtZW50Rm9ybURlZmF1bHQgYXR0cmlidXRlIGlzIHNldCB0byBxdWFsaWZpZWQgaW4gdGhlIFhNTAotc2NoZW1hLjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0gICZsdDt4Ok15QWRkcmVzcyB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0geHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20geC54c2QgIiZndDsgCi0mbHQ7eDpuYW1lJmd0O1BldGVyIFNtaXRoJmx0Oy94Om5hbWUmZ3Q7Ci0gJmx0Oy94Ok15QWRkcmVzcyZndDs8L3ByZT4KLSA8L2Rpdj4KLTxwPkluIHRoaXMgZXhhbXBsZSwgdGhlICJ4IiBuYW1lc3BhY2UgcHJlZml4Ci1pcyBhc3NpZ25lZCB0byBib3RoIHRoZSByb290IGVsZW1lbnQgIk15QWRkcmVzcyIgYW5kIHRoZSBsb2NhbCBlbGVtZW50ICJuYW1lIiwKLWFzc29jaWF0aW5nIHRoZW0gd2l0aCB0aGUgbmFtZXNwYWNlICJodHRwOi8vd3d3LmlibS5jb20iLC48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlNhbXBsZSAzIC0gU2NoZW1hIHdpdGggdGFyZ2V0IE5hbWVzcGFjZSwgYW5kIGV4cGxpY2l0bHkgZGVmaW5lcwoteG1sbnM6eHNkPC9oND48cD5UaGlzIFhNTCBzY2hlbWEgYWRkcyB0aGlzIGF0dHJpYnV0ZTogIDwvcD4KLTxzYW1wIGNsYXNzPSJjb2RlcGgiPnhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEgPC9zYW1wPjxwPldoYXQKLXRoaXMgbWVhbnMgaXMgdGhhdCBlYWNoIG9mIHRoZSBjb25zdHJ1Y3RzIHRoYXQgYXJlIGRlZmluZWQgYnkgdGhlIFhNTCBzY2hlbWEKLWxhbmd1YWdlIHdpbGwgbmVlZCB0byBiZSBxdWFsaWZpZWQgd2l0aCB0aGUgInhzZCIgcHJlZml4LiBGb3IgZXhhbXBsZSwgeHNkOmNvbXBsZXhUeXBlCi1hbmQgIHhzZDpzdHJpbmc8L3A+Ci08cD4uIE5vdGUgdGhhdCB5b3UgY2FuIGNob3NlIGFueSBvdGhlciBwcmVmaXhlcyBzdWNoIGFzCi0ieHMiIG9yICJmb29iYXIiIGluIHlvdXIgZGVjbGFyYXRpb24gYW5kIHVzYWdlLjwvcD4KLTxwPllvdSBjYW4gc3BlY2lmeSB0aGlzCi1wcmVmaXggaW4gdGhlIFhNTCBzY2hlbWEgcHJlZmVyZW5jZXMgcGFnZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvCi10aGUgcmVsYXRlZCB0YXNrcy48L3A+Ci08cD5BbGwgdXNlciBkZWZpbmVkIHR5cGVzIGJlbG9uZyB0byB0aGUgbmFtZXNwYWNlICBodHRwOi8vd3d3LmlibS5jb20KLWFzIGRlZmluZWQgYnkgdGhlIHRhcmdldE5hbWVzcGFjZSBhdHRyaWJ1dGUsIGFuZCB0aGUgcHJlZml4IGlzICJ4IiBhcyBkZWZpbmVkCi1ieSB0aGUgeG1sbnM6eCBhdHRyaWJ1dGUuPC9wPgotPGRpdiBjbGFzcz0icCI+PHByZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKLSZsdDt4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iJmd0OwotJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSImZ3Q7Ci0mbHQ7eHNkOnNlcXVlbmNlJmd0OwotCQkgJmx0O3hzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciJmd0OyZsdDsveHNkOmVsZW1lbnQmZ3Q7Ci0mbHQ7L3hzZDpzZXF1ZW5jZSZndDsKLSAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKLSAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJ4OkFkZHJlc3NUeXBlIiZndDsmbHQ7L3hzZDplbGVtZW50Jmd0OwotJmx0Oy94c2Q6c2NoZW1hJmd0OzwvcHJlPgotIDwvZGl2PgotPHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZAotZnJvbSB0aGlzIHNjaGVtYSBsb29rcyBsaWtlIHRoaXMuIExvY2FsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGFyZSB1bnF1YWxpZmllZC4KLVRoZSBzZW1hbnRpY3Mgb2YgcXVhbGlmaWNhdGlvbiBpcyB0aGUgc2FtZSBhcyBTYW1wbGUgMS48L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotICZsdDt4Ok15QWRkcmVzcyB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UieHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20geC54c2QgIiZndDsKLSZsdDtuYW1lJmd0O1BldGVyIFNtaXRoJmx0Oy9uYW1lJmd0OwotICZsdDsveDpNeUFkZHJlc3MmZ3Q7PC9wcmU+Ci08L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U2FtcGxlIDQgLSBTY2hlbWEgd2l0aCB1bmRlY2xhcmVkIHRhcmdldCBOYW1lc3BhY2UgdGhhdCBleHBsaWNpdGx5Ci1kZWZpbmVzIHhtbG5zOnhzZDwvaDQ+PHA+VGhpcyBYTUwgc2NoZW1hIGhhcyBubyB0YXJnZXQgbmFtZXNwYWNlIGZvciBpdHNlbGYuCi1JbiB0aGlzIGNhc2UsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IGFsbCBYTUwgc2NoZW1hIGNvbnN0cnVjdHMgYmUgZXhwbGljaXRseQotcXVhbGlmaWVkIHdpdGggYSBwcmVmaXggc3VjaCBhcyAieHNkIi4gVGhlIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbQotdGhpcyBzY2hlbWEgc3VjaCBhcyBBZGRyZXNzVHlwZSBhcmUgcmVmZXJlbmNlZCB3aXRob3V0IG5hbWVzcGFjZSBxdWFsaWZpY2F0aW9uCi1zaW5jZSB0aGVyZSBpcyBubyBuYW1lc3BhY2UgcHJlZml4LiAgPC9wPgotPGRpdiBjbGFzcz0icCI+PHByZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKLSZsdDt4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiJmd0OwotJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSImZ3Q7Ci0mbHQ7eHNkOnNlcXVlbmNlJmd0OwotJmx0O3hzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciJmd0OyZsdDsveHNkOmVsZW1lbnQmZ3Q7Ci0mbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyImZ3Q7Jmx0Oy94c2Q6ZWxlbWVudCZndDsKLSZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiZndDsmbHQ7L3hzZDplbGVtZW50Jmd0OyAKLSZsdDsveHNkOnNlcXVlbmNlJmd0OyAKLSZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OwotJmx0O3hzZDplbGVtZW50IG5hbWU9Ik15QWRkcmVzcyIgdHlwZT0iQWRkcmVzc1R5cGUiJmd0OyZsdDsveHNkOmVsZW1lbnQmZ3Q7IAotJmx0Oy94c2Q6c2NoZW1hJmd0OyA8L3ByZT4KLTwvZGl2PgotPHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZAotZnJvbSB0aGUgc2NoZW1hIGxvb2tzIGxpa2UgdGhpcy4gQWxsIGVsZW1lbnRzIGFyZSB1bnF1YWxpZmllZC48L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O015QWRkcmVzcyB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0ieC54c2QiJmd0OwotJmx0O25hbWUmZ3Q7bmFtZSZsdDsvbmFtZSZndDsKLSZsdDsvTXlBZGRyZXNzJmd0OzwvcHJlPgotICA8L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U2FtcGxlIDUgLSBBIHNjaGVtYSB3aGVyZSB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBpcyB0aGUgZGVmYXVsdAotbmFtZXNwYWNlPC9oND48cD5UaGlzIGlzIGFuIFhNTCBzY2hlbWEgd2hlcmUgdGhlIHRhcmdldCBuYW1lc3BhY2UgaXMgdGhlCi1kZWZhdWx0IG5hbWVzcGFjZS4gQXMgd2VsbCwgdGhlIG5hbWVzcGFjZSBoYXMgbm8gbmFtZXNwYWNlIHByZWZpeC48L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotICZsdDt4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxucz0iaHR0cDovL3d3dy5pYm0uY29tIiZndDsKLSZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc1R5cGUiJmd0OwotJmx0O3hzZDpzZXF1ZW5jZSZndDsKLSZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiZndDsmbHQ7L3hzZDplbGVtZW50Jmd0OwotJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7Ci0mbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKLSAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJBZGRyZXNzVHlwZSImZ3Q7Jmx0Oy94c2Q6ZWxlbWVudCZndDsKLSAmbHQ7L3hzZDpzY2hlbWEmZ3Q7IDwvcHJlPgotIDwvZGl2PgotPHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZAotZnJvbSB0aGUgc2NoZW1hIGxvb2tzIGxpa2UgdGhpczo8L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mZ3Q7Ci0mbHQ7TXlBZGRyZXNzIHhtbG5zPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIE5ld1hNTFNjaGVtYS54c2QiJmd0OwotJmx0O25hbWUmZ3Q7bmFtZSZsdDsvbmFtZSZndDsKLSAmbHQ7L015QWRkcmVzcyZndDsgIDwvcHJlPgotIDwvZGl2PgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRwcmVmLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciBYTUwgc2NoZW1hIGZpbGVzIHN1Y2ggYXMgdGhlIGRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZSBhbmQgWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIHByZWZpeCB1c2VkLiI+RWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ycmVmaW50Zy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ycmVmaW50Zy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTJiMzAyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnJlZmludGcuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iDQotICJyZWZlcmVuY2UuZHRkIj4NCi08cmVmZXJlbmNlIGlkPSJycmVmaW50ZyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+UmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvcjwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+UmVmZXJlbnRpYWwgaW50ZWdyaXR5PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoZSBYTUwgc2NoZW1hIGVkaXRvciBoYXMgYSBidWlsdC1pbiBtZWNoYW5pc20gdG8gaGFuZGxlIHJlZmVyZW50aWFsDQotaW50ZWdyaXR5IGlzc3Vlcy4gV2hlbiB5b3UgZGVsZXRlIGNlcnRhaW4gbm9kZXMsIGNsZWFuIHVwIGZvciBhbnkgbm9kZXMgYWZmZWN0ZWQNCi13aWxsIGF1dG9tYXRpY2FsbHkgb2NjdXIuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPnJlZmVyZW50aWFsIGludGVncml0eTwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmNsZWFuIHVwIGluPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxyZWZib2R5Pg0KLTxzZWN0aW9uPldoZW4geW91IGRlZmluZSBhIGNvbXBsZXggdHlwZSwgeW91IGNhbiBhZGQgYSBjb250ZW50IG1vZGVsIHRvIGl0DQotYW5kIHJlZmVyZW5jZSBhIGdsb2JhbCBlbGVtZW50LiA8cD5Gb3IgZXhhbXBsZTo8Y29kZWJsb2NrPiZsdDtzY2hlbWE+DQotICZsdDtlbGVtZW50IG5hbWU9ImNvbW1lbnQiIHR5cGU9InN0cmluZyI+DQotCSZsdDtjb21wbGV4VHlwZSBuYW1lPSJJdGVtcyI+DQotCQkmbHQ7c2VxdWVuY2U+DQotPD9QdWIgQ2FyZXQ/PgkJCQkmbHQ7ZWxlbWVudCByZWY9ImNvbW1lbnQiPg0KLQkJICZsdDsvc2VxdWVuY2U+DQotCSAmbHQ7L2NvbXBsZXhUeXBlPg0KLSZsdDsvc2NoZW1hPjwvY29kZWJsb2NrPjwvcD48cD5JZiB0aGUgZ2xvYmFsIGVsZW1lbnQgKGNvbW1lbnQpIHdhcyBkZWxldGVkLA0KLWFsbCByZWZlcmVuY2VzIHRvIGl0IHdvdWxkIGJlIGluIGVycm9yLiBIb3dldmVyLCB3aGVuIHlvdSBkZWxldGUgdGhlIGdsb2JhbA0KLWVsZW1lbnQsIHRoZSBYTUwgc2NoZW1hIGVkaXRvciB3aWxsIGNsZWFuIHVwIHVzaW5nIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOjwvcD48dWw+DQotPGxpPklmIHRoZXJlIGFyZSBvbmUgb3IgbW9yZSBnbG9iYWwgZWxlbWVudHMgaW4gdGhlIHNjaGVtYSwgaXQgd2lsbCBjaGFuZ2UNCi1hbGwgZXhpc3RpbmcgcmVmZXJlbmNlcyB0byB0aGUgZmlyc3QgZ2xvYmFsIGVsZW1lbnQuPC9saT4NCi08bGk+SWYgdGhlcmUgaXMgbm8gZ2xvYmFsIGVsZW1lbnQsIHRoZW4gaXQgd2lsbCBkZWxldGUgdGhlIGVsZW1lbnQgcmVmZXJlbmNlDQotZnJvbSB0aGUgY29udGVudCBtb2RlbC48L2xpPg0KLTwvdWw+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5EZWxldGluZyBpbmNsdWRlZCBhbmQgaW1wb3J0ZWQgc2NoZW1hPC90aXRsZT48cD5JZiBhbiBpbmNsdWRlZA0KLW9yIGltcG9ydGVkIHNjaGVtYSBpcyBkZWxldGVkLCB5b3UgbXVzdCBtYW51YWxseSByZXNldCB0aGUgZm9sbG93aW5nIHR5cGUNCi1yZWZlcmVuY2VzIGFzIGFwcHJvcHJpYXRlOiA8dWw+DQotPGxpPkdsb2JhbCBlbGVtZW50IGFuZCBlbGVtZW50J3MgdHlwZS48L2xpPg0KLTxsaT5BdHRyaWJ1dGUgdHlwZS48L2xpPg0KLTxsaT5Db21wbGV4IHR5cGUgZGVyaXZhdGlvbi48L2xpPg0KLTxsaT5TaW1wbGUgdHlwZSBkZXJpdmF0aW9uLjwvbGk+DQotPC91bD5UaGV5IHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgYmUgcmVzZXQgaWYgYW4gaW5jbHVkZWQgb3IgaW1wb3J0ZWQgc2NoZW1hDQotaXMgZGVsZXRlZC48L3A+PC9zZWN0aW9uPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCi08P1B1YiAqMDAwMDAwMjA0Nj8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ycmVmaW50Zy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ycmVmaW50Zy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDdiNDJkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnJlZmludGcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgWE1MIHNjaGVtYSBlZGl0b3IgaGFzIGEgYnVpbHQtaW4gbWVjaGFuaXNtIHRvIGhhbmRsZSByZWZlcmVudGlhbCBpbnRlZ3JpdHkgaXNzdWVzLiBXaGVuIHlvdSBkZWxldGUgY2VydGFpbiBub2RlcywgY2xlYW4gdXAgZm9yIGFueSBub2RlcyBhZmZlY3RlZCB3aWxsIGF1dG9tYXRpY2FsbHkgb2NjdXIuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBYTUwgc2NoZW1hIGVkaXRvciBoYXMgYSBidWlsdC1pbiBtZWNoYW5pc20gdG8gaGFuZGxlIHJlZmVyZW50aWFsIGludGVncml0eSBpc3N1ZXMuIFdoZW4geW91IGRlbGV0ZSBjZXJ0YWluIG5vZGVzLCBjbGVhbiB1cCBmb3IgYW55IG5vZGVzIGFmZmVjdGVkIHdpbGwgYXV0b21hdGljYWxseSBvY2N1ci4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgcmVmZXJlbnRpYWwgaW50ZWdyaXR5LCBjbGVhbiB1cCBpbiIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCByZWZlcmVudGlhbCBpbnRlZ3JpdHksIGNsZWFuIHVwIGluIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxzY2VkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0c2NobS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGRlbHNjbXAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJycmVmaW50ZyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlJlZmVyZW50aWFsIGludGVncml0eTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icnJlZmludGciPjxhIG5hbWU9InJyZWZpbnRnIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5SZWZlcmVudGlhbCBpbnRlZ3JpdHkgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGUgWE1MIHNjaGVtYSBlZGl0b3IgaGFzIGEgYnVpbHQtaW4gbWVjaGFuaXNtIHRvIGhhbmRsZSByZWZlcmVudGlhbAotaW50ZWdyaXR5IGlzc3Vlcy4gV2hlbiB5b3UgZGVsZXRlIGNlcnRhaW4gbm9kZXMsIGNsZWFuIHVwIGZvciBhbnkgbm9kZXMgYWZmZWN0ZWQKLXdpbGwgYXV0b21hdGljYWxseSBvY2N1ci48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPldoZW4geW91IGRlZmluZSBhIGNvbXBsZXggdHlwZSwgeW91IGNhbiBhZGQgYSBjb250ZW50IG1vZGVsIHRvIGl0Ci1hbmQgcmVmZXJlbmNlIGEgZ2xvYmFsIGVsZW1lbnQuIDxkaXYgY2xhc3M9InAiPkZvciBleGFtcGxlOjxwcmU+Jmx0O3NjaGVtYSZndDsKLSAmbHQ7ZWxlbWVudCBuYW1lPSJjb21tZW50IiB0eXBlPSJzdHJpbmciJmd0OwotCSZsdDtjb21wbGV4VHlwZSBuYW1lPSJJdGVtcyImZ3Q7Ci0JCSZsdDtzZXF1ZW5jZSZndDsKLQkJCQkmbHQ7ZWxlbWVudCByZWY9ImNvbW1lbnQiJmd0OwotCQkgJmx0Oy9zZXF1ZW5jZSZndDsKLQkgJmx0Oy9jb21wbGV4VHlwZSZndDsKLSZsdDsvc2NoZW1hJmd0OzwvcHJlPgotPC9kaXY+Ci08cD5JZiB0aGUgZ2xvYmFsIGVsZW1lbnQgKGNvbW1lbnQpIHdhcyBkZWxldGVkLAotYWxsIHJlZmVyZW5jZXMgdG8gaXQgd291bGQgYmUgaW4gZXJyb3IuIEhvd2V2ZXIsIHdoZW4geW91IGRlbGV0ZSB0aGUgZ2xvYmFsCi1lbGVtZW50LCB0aGUgWE1MIHNjaGVtYSBlZGl0b3Igd2lsbCBjbGVhbiB1cCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobTo8L3A+Ci08dWw+Ci08bGk+SWYgdGhlcmUgYXJlIG9uZSBvciBtb3JlIGdsb2JhbCBlbGVtZW50cyBpbiB0aGUgc2NoZW1hLCBpdCB3aWxsIGNoYW5nZQotYWxsIGV4aXN0aW5nIHJlZmVyZW5jZXMgdG8gdGhlIGZpcnN0IGdsb2JhbCBlbGVtZW50LjwvbGk+Ci0KLTxsaT5JZiB0aGVyZSBpcyBubyBnbG9iYWwgZWxlbWVudCwgdGhlbiBpdCB3aWxsIGRlbGV0ZSB0aGUgZWxlbWVudCByZWZlcmVuY2UKLWZyb20gdGhlIGNvbnRlbnQgbW9kZWwuPC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+RGVsZXRpbmcgaW5jbHVkZWQgYW5kIGltcG9ydGVkIHNjaGVtYTwvaDQ+PGRpdiBjbGFzcz0icCI+SWYgYW4gaW5jbHVkZWQKLW9yIGltcG9ydGVkIHNjaGVtYSBpcyBkZWxldGVkLCB5b3UgbXVzdCBtYW51YWxseSByZXNldCB0aGUgZm9sbG93aW5nIHR5cGUKLXJlZmVyZW5jZXMgYXMgYXBwcm9wcmlhdGU6IDx1bD4KLTxsaT5HbG9iYWwgZWxlbWVudCBhbmQgZWxlbWVudCdzIHR5cGUuPC9saT4KLQotPGxpPkF0dHJpYnV0ZSB0eXBlLjwvbGk+Ci0KLTxsaT5Db21wbGV4IHR5cGUgZGVyaXZhdGlvbi48L2xpPgotCi08bGk+U2ltcGxlIHR5cGUgZGVyaXZhdGlvbi48L2xpPgotCi08L3VsPgotVGhleSB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGJlIHJlc2V0IGlmIGFuIGluY2x1ZGVkIG9yIGltcG9ydGVkIHNjaGVtYQotaXMgZGVsZXRlZC48L2Rpdj4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sc2NlZC5odG1sIiB0aXRsZT0iVGhpcyBwcm9kdWN0IHByb3ZpZGVzIGFuIFhNTCBzY2hlbWEgZWRpdG9yIGZvciBjcmVhdGluZywgdmlld2luZywgYW5kIHZhbGlkYXRpbmcgWE1MIHNjaGVtYXMuIFhNTCBzY2hlbWFzIGFyZSBhIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuIj5YTUwgc2NoZW1hIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaG0uaHRtbCIgdGl0bGU9IkFmdGVyIHlvdSBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiBlZGl0IGl0cyB2YXJpb3VzIHByb3BlcnRpZXMsIHN1Y2ggYXMgaXRzIG5hbWVzcGFjZSBhbmQgcHJlZml4LiI+RWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZGVsc2NtcC5odG1sIiB0aXRsZT0iSWYgeW91IGhhdmUgY3JlYXRlZCBhbnkgWE1MIHNjaGVtYSBjb21wb25lbnRzIHlvdSBubyBsb25nZXIgbmVlZCwgeW91IGNhbiBkZWxldGUgdGhlbS4iPkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50czwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4c2RpY29ucy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeHNkaWNvbnMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkZWEzOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4c2RpY29ucy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iDQotICJyZWZlcmVuY2UuZHRkIj4NCi08cmVmZXJlbmNlIGlkPSJyaWNvbnMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkljb25zIHVzZWQgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5YTUwgc2NoZW1hIGVkaXRvciBpY29uczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGUgZm9sbG93aW5nIFhNTCBzY2hlbWEgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSwgRGVzaWduLA0KLWFuZCBQcm9wZXJ0aWVzIHZpZXcuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmljb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxyZWZib2R5Pg0KLTxzZWN0aW9uPjwvc2VjdGlvbj4NCi08dGFibGU+DQotPHRncm91cCBjb2xzPSIyIj48Y29sc3BlYyBjb2xuYW1lPSJDT0xTUEVDMCIvPjxjb2xzcGVjIGNvbG5hbWU9IkNPTFNQRUMxIi8+DQotPHRib2R5Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIiB2YWxpZ249ImJvdHRvbSI+PGI+SWNvbjwvYj48L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMSIgdmFsaWduPSJib3R0b20iPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RBbnlBdHRyaWJ1dGUuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUNCi1hbnkgYXR0cmlidXRlIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT48Y29kZXBoPmFueTwvY29kZXBoPiBhdHRyaWJ1dGU8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQW55LmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGFueSBlbGVtZW50DQotaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5Pjxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQ8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQXR0cmlidXRlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGF0dHJpYnV0ZQ0KLWljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5hdHRyaWJ1dGU8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQXR0cmlidXRlR3JvdXAuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcw0KLXRoZSBhdHRyaWJ1dGUgZ3JvdXAgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmF0dHJpYnV0ZSBncm91cDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYiPjxhbHQ+VGhpcyBncmFwaGljDQotaXMgdGhlIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQXR0cmlidXRlUmVmLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlDQotYXR0cmlidXRlIHJlZmVyZW5jZSBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+YXR0cmlidXRlIHJlZmVyZW5jZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RBbGwuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgY29udGVudA0KLW1vZGVsIC0gYWxsIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5jb250ZW50IG1vZGVsIC0gYWxsPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RDaG9pY2UuZ2lmIj48YWx0PlRoaXMNCi1ncmFwaGljIGlzIHRoZSBjb250ZW50IG1vZGVsIC0gY2hvaWNlIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMSI+Y29udGVudCBtb2RlbCAtIGNob2ljZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmIj48YWx0PlRoaXMNCi1ncmFwaGljIGlzIHRoZSBjb250ZW50IG1vZGVsIC0gc2VxdWVuY2UgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMxIj5jb250ZW50IG1vZGVsIC0gc2VxdWVuY2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQ29tcGxleFR5cGUuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUNCi1hbnkgZWxlbWVudCBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+Y29tcGxleCB0eXBlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREVsZW1lbnQuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgZWxlbWVudA0KLWljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5lbGVtZW50PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREVsZW1lbnRSZWYuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUNCi1lbGVtZW50IHJlZmVyZW5jZSBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+ZWxlbWVudCByZWZlcmVuY2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEU2ltcGxlRW51bS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZQ0KLWVudW1lcmF0aW9uIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5lbnVtZXJhdGlvbjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RHbG9iYWxBdHRyaWJ1dGUuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcw0KLXRoZSBnbG9iYWwgYXR0cmlidXRlIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5nbG9iYWwgYXR0cmlidXRlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RHbG9iYWxFbGVtZW50LmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMNCi10aGUgZ2xvYmFsIGVsZW1lbnQgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5Pmdsb2JhbCBlbGVtZW50PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RHcm91cC5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBncm91cA0KLWljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5ncm91cDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RHcm91cFJlZi5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBncm91cA0KLXJlZmVyZW5jZSBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+Z3JvdXAgcmVmZXJlbmNlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREltcG9ydC5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBpbXBvcnQNCi1pY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+aW1wb3J0PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREluY2x1ZGUuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgaW5jbHVkZQ0KLWljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5pbmNsdWRlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTRFNpbXBsZVBhdHRlcm4uZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUNCi1wYXR0ZXJuIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5wYXR0ZXJuPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTRFJlZGVmaW5lLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIHJlZGVmaW5lDQotaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PnJlZGVmaW5lPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTRFNpbXBsZVR5cGUuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUNCi1zaW1wbGUgdHlwZSBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+c2ltcGxlIHR5cGU8L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGJvZHk+DQotPC90Z3JvdXA+DQotPC90YWJsZT4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+DQotPD9QdWIgKjAwMDAwMDQ1ODE/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhzZGljb25zLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4c2RpY29ucy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmNjZTAzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhzZGljb25zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InJlZmVyZW5jZSIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJJY29ucyB1c2VkIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgZm9sbG93aW5nIFhNTCBzY2hlbWEgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSwgRGVzaWduLCBhbmQgUHJvcGVydGllcyB2aWV3LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgZm9sbG93aW5nIFhNTCBzY2hlbWEgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSwgRGVzaWduLCBhbmQgUHJvcGVydGllcyB2aWV3LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBpY29ucyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBpY29ucyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icmljb25zIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+WE1MIHNjaGVtYSBlZGl0b3IgaWNvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJpY29ucyI+PGEgbmFtZT0icmljb25zIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5JY29ucyB1c2VkIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvcjwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhlIGZvbGxvd2luZyBYTUwgc2NoZW1hIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUsIERlc2lnbiwKLWFuZCBQcm9wZXJ0aWVzIHZpZXcuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIiAvPgotCi0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCB2YWxpZ249ImJvdHRvbSI+PHN0cm9uZz5JY29uPC9zdHJvbmc+PC90ZD4KLQotPHRkIHZhbGlnbj0iYm90dG9tIj48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREFueUF0dHJpYnV0ZS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSYjMTA7YW55IGF0dHJpYnV0ZSBpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPjxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gYXR0cmlidXRlPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREFueS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBhbnkgZWxlbWVudCYjMTA7aWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj48c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEQXR0cmlidXRlLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGF0dHJpYnV0ZSYjMTA7aWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5hdHRyaWJ1dGU8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEQXR0cmlidXRlR3JvdXAuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyYjMTA7dGhlIGF0dHJpYnV0ZSBncm91cCBpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmF0dHJpYnV0ZSBncm91cDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYiIGFsdD0iVGhpcyBncmFwaGljJiMxMDtpcyB0aGUgYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSBpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2U8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEQXR0cmlidXRlUmVmLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlJiMxMDthdHRyaWJ1dGUgcmVmZXJlbmNlIGljb24gIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+YXR0cmlidXRlIHJlZmVyZW5jZTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9YU0RBbGwuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgY29udGVudCYjMTA7bW9kZWwgLSBhbGwgaWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5jb250ZW50IG1vZGVsIC0gYWxsPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTRENob2ljZS5naWYiIGFsdD0iVGhpcyYjMTA7Z3JhcGhpYyBpcyB0aGUgY29udGVudCBtb2RlbCAtIGNob2ljZSBpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmNvbnRlbnQgbW9kZWwgLSBjaG9pY2U8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmIiBhbHQ9IlRoaXMmIzEwO2dyYXBoaWMgaXMgdGhlIGNvbnRlbnQgbW9kZWwgLSBzZXF1ZW5jZSBpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmNvbnRlbnQgbW9kZWwgLSBzZXF1ZW5jZTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9YU0RDb21wbGV4VHlwZS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSYjMTA7YW55IGVsZW1lbnQgaWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5jb21wbGV4IHR5cGU8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNERWxlbWVudC5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBlbGVtZW50JiMxMDtpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmVsZW1lbnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNERWxlbWVudFJlZi5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSYjMTA7ZWxlbWVudCByZWZlcmVuY2UgaWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5lbGVtZW50IHJlZmVyZW5jZTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9YU0RTaW1wbGVFbnVtLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlJiMxMDtlbnVtZXJhdGlvbiBpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmVudW1lcmF0aW9uPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREdsb2JhbEF0dHJpYnV0ZS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzJiMxMDt0aGUgZ2xvYmFsIGF0dHJpYnV0ZSBpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmdsb2JhbCBhdHRyaWJ1dGU8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREdsb2JhbEVsZW1lbnQuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyYjMTA7dGhlIGdsb2JhbCBlbGVtZW50IGljb24gIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+Z2xvYmFsIGVsZW1lbnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREdyb3VwLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGdyb3VwJiMxMDtpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmdyb3VwPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREdyb3VwUmVmLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGdyb3VwJiMxMDtyZWZlcmVuY2UgaWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5ncm91cCByZWZlcmVuY2U8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNESW1wb3J0LmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGltcG9ydCYjMTA7aWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5pbXBvcnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNESW5jbHVkZS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBpbmNsdWRlJiMxMDtpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGU8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEU2ltcGxlUGF0dGVybi5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSYjMTA7cGF0dGVybiBpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPnBhdHRlcm48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEUmVkZWZpbmUuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgcmVkZWZpbmUmIzEwO2ljb24gIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+cmVkZWZpbmU8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEU2ltcGxlVHlwZS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSYjMTA7c2ltcGxlIHR5cGUgaWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5zaW1wbGUgdHlwZTwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXYgLz4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFncnAuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFncnAuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2MTUxNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhZ3JwLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDgsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0YWRkYWdycCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGF0dHJpYnV0ZSBncm91cHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBhdHRyaWJ1dGUgZ3JvdXBzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkFuIGF0dHJpYnV0ZSBncm91cCBkZWZpbml0aW9uIGlzIGFuIGFzc29jaWF0aW9uIGJldHdlZW4NCi1hIG5hbWUgYW5kIGEgc2V0IG9mIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuIE5hbWVkIGdyb3VwcyBvZiBhdHRyaWJ1dGUNCi1kZWNsYXJhdGlvbnMgY2FuIGdyZWF0bHkgZmFjaWxpdGF0ZSB0aGUgbWFpbnRlbmFuY2UgYW5kIHJldXNlIG9mIGNvbW1vbg0KLWF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMgaW4gYW4gWE1MIHNjaGVtYS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+YXR0cmlidXRlIGdyb3VwczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+YXR0cmlidXRlIGdyb3VwczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UNCi1wZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvDQotYWRkIGFuIGF0dHJpYnV0ZSBncm91cCB0byBhbiBYTUwgc2NoZW1hLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBPdXRsaW5lIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSA8dWljb250cm9sPkF0dHJpYnV0ZXM8L3VpY29udHJvbD4gZm9sZGVyDQotYW5kIGNsaWNrICA8dWljb250cm9sPkFkZCBBdHRyaWJ1dGUgR3JvdXA8L3VpY29udHJvbD4uIDwvY21kPjxpbmZvPkl0DQotYXBwZWFycyBpbiB0aGUgPHVpY29udHJvbD5BdHRyaWJ1dGVzPC91aWNvbnRyb2w+IGZvbGRlci48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHlvdXIgbmV3IGdyb3VwLCBhbmQgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljaw0KLXRoZSBhdHRyaWJ1dGUgZ3JvdXAgYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5SZWZhY3RvcjwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+UmVuYW1lPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uIEluIHRoZSA8dWljb250cm9sPk5ldw0KLU5hbWU8L3VpY29udHJvbD4gZmllbGQsIHR5cGUgYSBuYW1lIGZvciB0aGUgYXR0cmlidXRlIGdyb3VwIGFuZCBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRvIGFkZCBhbiBhdHRyaWJ1dGUsIHJpZ2h0LWNsaWNrIHlvdXIgYXR0cmlidXRlIGdyb3VwIGluDQotdGhlIE91dGxpbmUgdmlldywgY2xpY2sgPHVpY29udHJvbD5BZGQgQXR0cmlidXRlPC91aWNvbnRyb2w+LiA8L2NtZD4NCi08aW5mbz5UaGUgYXR0cmlidXRlIGFwcGVhcnMgYmVsb3cgdGhlIGF0dHJpYnV0ZSBncm91cCBpbiB0aGUgT3V0bGluZQ0KLXZpZXcuPC9pbmZvPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPlNlbGVjdCB0aGUgYXR0cmlidXRlLCBhbmQgaW4gdGhlIERlc2lnbiB2aWV3LCBjbGljaw0KLXRoZSBjdXJyZW50IChkZWZhdWx0KSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIHRoZW4gdHlwZSB0aGUgbmV3IDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPi48L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIGNsaWNrIHRoZSBjdXJyZW50IChkZWZhdWx0KSBhdHRyaWJ1dGUNCi10eXBlIGFuZCBzZWxlY3QgYSB0eXBlIGZyb20gdGhlIG1lbnUuIEFsdGVybmF0ZWx5LCB5b3UgY2FuIHNlbGVjdA0KLWJyb3dzZSB0byBpbnZva2UgdGhlIFNldCBUeXBlIG1lbnUgZm9yIG1vcmUgb3B0aW9ucy4gPC9jbWQ+PGluZm8+VGhlDQotU2V0IFR5cGUgZGlhbG9nIGxpc3RzIGFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGN1cnJlbnRseQ0KLWF2YWlsYWJsZS4gWW91IGNhbiBjaGFuZ2UgdGhlIDx1aWNvbnRyb2w+U2NvcGU8L3VpY29udHJvbD4gb2YgdGhlDQotbGlzdCBieSBzZWxlY3Rpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8dWw+DQotPGxpPjx1aWNvbnRyb2w+V29ya3NwYWNlPC91aWNvbnRyb2w+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQ0KLWluIHlvdXIgd29ya3NwYWNlLiA8L2xpPg0KLTxsaT48dWljb250cm9sPkVuY2xvc2luZyBQcm9qZWN0PC91aWNvbnRyb2w+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzDQotYXZhaWxhYmxlIGluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPg0KLTxsaT48dWljb250cm9sPkN1cnJlbnQgUmVzb3VyY2U8L3VpY29udHJvbD4gKGRlZmF1bHQpLiBMaXN0IGFsbCBvZg0KLXRoZSB0eXBlcyBhdmFpbGFibGUgaW4geW91ciBjdXJyZW50IGZpbGUuPC9saT4NCi08bGk+PHVpY29udHJvbD5Xb3JraW5nIFNldHM8L3VpY29udHJvbD4uIExpc3QgYWxsIHRoZSB0eXBlcyBhdmFpbGFibGUNCi13aXRoaW4gdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0LjwvbGk+DQotPC91bD48L2luZm8+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+QW4gYXR0cmlidXRlIHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbA0KLWF0dHJpYnV0ZS4gVG8gYWRkIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UsIGluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sNCi10aGUgY29tcGxleCB0eXBlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQsIGFuZCBjbGljayA8dWljb250cm9sPkFkZA0KLUF0dHJpYnV0ZSBSZWY8L3VpY29udHJvbD4uIDwvY21kPjxpbmZvPkEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzDQotYSBnbG9iYWwgYXR0cmlidXRlIGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlIHRvIGFwcGVhciBpbiB0aGUNCi1pbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIFNlbGVjdA0KLXRoZSByZWZlcmVuY2UsIHRoZW4gaW4gdGhlIFByb3BlcnRpZXMgdmlldywgc2VsZWN0IHRoZSBhdHRyaWJ1dGUgeW91DQotd2FudCBpdCB0byByZWZlcmVuY2UgZnJvbSB0aGUgPHVpY29udHJvbD5SZWZlcmVuY2U8L3VpY29udHJvbD4gbGlzdC48P1B1Yg0KLUNhcmV0Pz48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+QW4gYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhbg0KLWF0dHJpYnV0ZSBncm91cC4gVG8gYWRkIGFuIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UsIGluIHRoZSBEZXNpZ24NCi12aWV3LCByaWdodC1jbGljayB0aGUgY29tcGxleCB0eXBlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQsIGFuZCBjbGljayA8dWljb250cm9sPkFkZA0KLUF0dHJpYnV0ZSBHcm91cCBSZWY8L3VpY29udHJvbD4uIDwvY21kPjxpbmZvPkEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzDQotYSBnbG9iYWwgYXR0cmlidXRlIGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlIHRvIGFwcGVhciBpbiB0aGUNCi1pbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIFNlbGVjdA0KLXRoZSByZWZlcmVuY2UsIHRoZW4gaW4gdGhlIFByb3BlcnRpZXMgdmlldywgc2VsZWN0IHRoZSBhdHRyaWJ1dGUgZ3JvdXANCi15b3Ugd2FudCBpdCB0byByZWZlcmVuY2UgZnJvbSB0aGUgPHVpY29udHJvbD5SZWZlcmVuY2U8L3VpY29udHJvbD4gbGlzdC48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+QW4gPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudCBlbmFibGVzIGVsZW1lbnQgY29udGVudA0KLWFjY29yZGluZyB0byBuYW1lc3BhY2VzLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGVwaD5hbnk8L2NvZGVwaD4gYXR0cmlidXRlDQotZWxlbWVudCBlbmFibGVzIGF0dHJpYnV0ZXMgdG8gYXBwZWFyIGluIGVsZW1lbnRzLiBUbyBhZGQgYW4gPGNvZGVwaD5hbnk8L2NvZGVwaD4gYXR0cmlidXRlLA0KLXJpZ2h0LWNsaWNrIHlvdXIgYXR0cmlidXRlIGdyb3VwIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBBbnkgQXR0cmlidXRlPC91aWNvbnRyb2w+LiA8L2NtZD4NCi08aW5mbz5UaGUgPGNvZGVwaD5hbnk8L2NvZGVwaD4gYXBwZWFycyBiZWxvdyB0aGUgYXR0cmlidXRlIGdyb3VwIGluDQotdGhlIE91dGxpbmUgdmlldy4gWW91IGNhbiBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvciBhbiA8Y29kZXBoPmFueTwvY29kZXBoPiBhdHRyaWJ1dGU6PC9pbmZvPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+Rm9yIGEgPHVpY29udHJvbD5OYW1lc3BhY2U8L3VpY29udHJvbD4gdmFsdWUsIHlvdSBjYW4gc2VsZWN0Ojx1bD4NCi08bGk+PGI+IyNhbnk8L2I+OiB0aGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIGZyb20gYW55IG5hbWVzcGFjZS48L2xpPg0KLTxsaT48Yj4jI2xvY2FsIDwvYj46IHRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZGVjbGFyZWQNCi10byBiZSBpbiBhIG5hbWVzcGFjZS48L2xpPg0KLTxsaT48Yj4jI290aGVyPC9iPjogdGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdCBmcm9tDQotdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPg0KLTxsaT48Yj4jI3RhcmdldE5hbWVzcGFjZSA8L2I+OiB0aGlzIGlzIHNob3J0aGFuZCBmb3IgdGhlIHRhcmdldCBuYW1lc3BhY2UNCi1vZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvbGk+DQotPC91bD48L2Nob2ljZT4NCi08Y2hvaWNlPkZvciBhIDx1aWNvbnRyb2w+UHJvY2VzcyBDb250ZW50czwvdWljb250cm9sPiB2YWx1ZSwgeW91IGNhbg0KLXNlbGVjdDo8dWw+DQotPGxpPjxiPnNraXA8L2I+OiB0aGUgWE1MIHByb2Nlc3NvciB3aWxsIG5vdCB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlDQotY29udGVudCBhdCBhbGwuPC9saT4NCi08bGk+PGI+bGF4PC9iPjogdGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlIGNvbnRlbnQNCi1hcyBtdWNoIGFzIGl0IGNhbi48L2xpPg0KLTxsaT48Yj5zdHJpY3Q8L2I+OiB0aGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIGFsbCB0aGUgYXR0cmlidXRlDQotY29udGVudC48L2xpPg0KLTwvdWw+PC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDA1NTQ0Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhZ3JwLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhZ3JwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyM2IzOWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYWdycC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBhdHRyaWJ1dGUgZ3JvdXBzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkFuIGF0dHJpYnV0ZSBncm91cCBkZWZpbml0aW9uIGlzIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gYSBuYW1lIGFuZCBhIHNldCBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLiBOYW1lZCBncm91cHMgb2YgYXR0cmlidXRlIGRlY2xhcmF0aW9ucyBjYW4gZ3JlYXRseSBmYWNpbGl0YXRlIHRoZSBtYWludGVuYW5jZSBhbmQgcmV1c2Ugb2YgY29tbW9uIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMgaW4gYW4gWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQW4gYXR0cmlidXRlIGdyb3VwIGRlZmluaXRpb24gaXMgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBhIG5hbWUgYW5kIGEgc2V0IG9mIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuIE5hbWVkIGdyb3VwcyBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zIGNhbiBncmVhdGx5IGZhY2lsaXRhdGUgdGhlIG1haW50ZW5hbmNlIGFuZCByZXVzZSBvZiBjb21tb24gYXR0cmlidXRlIGRlY2xhcmF0aW9ucyBpbiBhbiBYTUwgc2NoZW1hLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhdHRyaWJ1dGUgZ3JvdXBzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGF0dHJpYnV0ZSBncm91cHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRhZ3JwIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGF0dHJpYnV0ZSBncm91cHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRhZ3JwIj48YSBuYW1lPSJ0YWRkYWdycCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGF0dHJpYnV0ZSBncm91cHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkFuIGF0dHJpYnV0ZSBncm91cCBkZWZpbml0aW9uIGlzIGFuIGFzc29jaWF0aW9uIGJldHdlZW4KLWEgbmFtZSBhbmQgYSBzZXQgb2YgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4gTmFtZWQgZ3JvdXBzIG9mIGF0dHJpYnV0ZQotZGVjbGFyYXRpb25zIGNhbiBncmVhdGx5IGZhY2lsaXRhdGUgdGhlIG1haW50ZW5hbmNlIGFuZCByZXVzZSBvZiBjb21tb24KLWF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMgaW4gYW4gWE1MIHNjaGVtYS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlCi1wZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8KLWFkZCBhbiBhdHRyaWJ1dGUgZ3JvdXAgdG8gYW4gWE1MIHNjaGVtYSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgcmlnaHQtY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkF0dHJpYnV0ZXM8L3NwYW4+IGZvbGRlcgotYW5kIGNsaWNrICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQXR0cmlidXRlIEdyb3VwPC9zcGFuPi4gPC9zcGFuPiBJdAotYXBwZWFycyBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXR0cmlidXRlczwvc3Bhbj4gZm9sZGVyLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHlvdXIgbmV3IGdyb3VwLCBhbmQgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljawotdGhlIGF0dHJpYnV0ZSBncm91cCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVmYWN0b3I8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZW5hbWU8L3NwYW4+PC9zcGFuPi4gSW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldwotTmFtZTwvc3Bhbj4gZmllbGQsIHR5cGUgYSBuYW1lIGZvciB0aGUgYXR0cmlidXRlIGdyb3VwIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBhZGQgYW4gYXR0cmlidXRlLCByaWdodC1jbGljayB5b3VyIGF0dHJpYnV0ZSBncm91cCBpbgotdGhlIE91dGxpbmUgdmlldywgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEF0dHJpYnV0ZTwvc3Bhbj4uIDwvc3Bhbj4KLSBUaGUgYXR0cmlidXRlIGFwcGVhcnMgYmVsb3cgdGhlIGF0dHJpYnV0ZSBncm91cCBpbiB0aGUgT3V0bGluZQotdmlldy4KLTxvbCB0eXBlPSJhIj4KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBhdHRyaWJ1dGUsIGFuZCBpbiB0aGUgRGVzaWduIHZpZXcsIGNsaWNrCi10aGUgY3VycmVudCAoZGVmYXVsdCkgbmFtZSBvZiB0aGUgYXR0cmlidXRlLCB0aGVuIHR5cGUgdGhlIG5ldyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgY2xpY2sgdGhlIGN1cnJlbnQgKGRlZmF1bHQpIGF0dHJpYnV0ZQotdHlwZSBhbmQgc2VsZWN0IGEgdHlwZSBmcm9tIHRoZSBtZW51LiBBbHRlcm5hdGVseSwgeW91IGNhbiBzZWxlY3QKLWJyb3dzZSB0byBpbnZva2UgdGhlIFNldCBUeXBlIG1lbnUgZm9yIG1vcmUgb3B0aW9ucy4gPC9zcGFuPiBUaGUKLVNldCBUeXBlIGRpYWxvZyBsaXN0cyBhbGwgYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBjdXJyZW50bHkKLWF2YWlsYWJsZS4gWW91IGNhbiBjaGFuZ2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjb3BlPC9zcGFuPiBvZiB0aGUKLWxpc3QgYnkgc2VsZWN0aW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtzcGFjZTwvc3Bhbj4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlCi1pbiB5b3VyIHdvcmtzcGFjZS4gPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVuY2xvc2luZyBQcm9qZWN0PC9zcGFuPi4gTGlzdHMgYWxsIG9mIHRoZSB0eXBlcwotYXZhaWxhYmxlIGluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3VycmVudCBSZXNvdXJjZTwvc3Bhbj4gKGRlZmF1bHQpLiBMaXN0IGFsbCBvZgotdGhlIHR5cGVzIGF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2luZyBTZXRzPC9zcGFuPi4gTGlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZQotd2l0aGluIHRoZSBzZWxlY3RlZCB3b3JraW5nIHNldC48L2xpPgotCi08L3VsPgotPC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5BbiBhdHRyaWJ1dGUgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsCi1hdHRyaWJ1dGUuIFRvIGFkZCBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlLCBpbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrCi10aGUgY29tcGxleCB0eXBlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQsIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQKLUF0dHJpYnV0ZSBSZWY8L3NwYW4+LiA8L3NwYW4+IEEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzCi1hIGdsb2JhbCBhdHRyaWJ1dGUgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUgdG8gYXBwZWFyIGluIHRoZQotaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiBTZWxlY3QKLXRoZSByZWZlcmVuY2UsIHRoZW4gaW4gdGhlIFByb3BlcnRpZXMgdmlldywgc2VsZWN0IHRoZSBhdHRyaWJ1dGUgeW91Ci13YW50IGl0IHRvIHJlZmVyZW5jZSBmcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZWZlcmVuY2U8L3NwYW4+IGxpc3QuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5BbiBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGFuCi1hdHRyaWJ1dGUgZ3JvdXAuIFRvIGFkZCBhbiBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlLCBpbiB0aGUgRGVzaWduCi12aWV3LCByaWdodC1jbGljayB0aGUgY29tcGxleCB0eXBlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQsIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQKLUF0dHJpYnV0ZSBHcm91cCBSZWY8L3NwYW4+LiA8L3NwYW4+IEEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzCi1hIGdsb2JhbCBhdHRyaWJ1dGUgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUgdG8gYXBwZWFyIGluIHRoZQotaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiBTZWxlY3QKLXRoZSByZWZlcmVuY2UsIHRoZW4gaW4gdGhlIFByb3BlcnRpZXMgdmlldywgc2VsZWN0IHRoZSBhdHRyaWJ1dGUgZ3JvdXAKLXlvdSB3YW50IGl0IHRvIHJlZmVyZW5jZSBmcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZWZlcmVuY2U8L3NwYW4+IGxpc3QuCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkFuIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudCBlbmFibGVzIGVsZW1lbnQgY29udGVudAotYWNjb3JkaW5nIHRvIG5hbWVzcGFjZXMsIGFuZCB0aGUgY29ycmVzcG9uZGluZyA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGF0dHJpYnV0ZQotZWxlbWVudCBlbmFibGVzIGF0dHJpYnV0ZXMgdG8gYXBwZWFyIGluIGVsZW1lbnRzLiBUbyBhZGQgYW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBhdHRyaWJ1dGUsCi1yaWdodC1jbGljayB5b3VyIGF0dHJpYnV0ZSBncm91cCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEFueSBBdHRyaWJ1dGU8L3NwYW4+LiA8L3NwYW4+Ci0gVGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gYXBwZWFycyBiZWxvdyB0aGUgYXR0cmlidXRlIGdyb3VwIGluCi10aGUgT3V0bGluZSB2aWV3LiBZb3UgY2FuIHNwZWNpZnkgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIGFuIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gYXR0cmlidXRlOgotPHVsPgotPGxpPkZvciBhIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWVzcGFjZTwvc3Bhbj4gdmFsdWUsIHlvdSBjYW4gc2VsZWN0Ojx1bD4KLTxsaT48c3Ryb25nPiMjYW55PC9zdHJvbmc+OiB0aGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIGZyb20gYW55IG5hbWVzcGFjZS48L2xpPgotCi08bGk+PHN0cm9uZz4jI2xvY2FsIDwvc3Ryb25nPjogdGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdCBkZWNsYXJlZAotdG8gYmUgaW4gYSBuYW1lc3BhY2UuPC9saT4KLQotPGxpPjxzdHJvbmc+IyNvdGhlcjwvc3Ryb25nPjogdGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdCBmcm9tCi10aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvbGk+Ci0KLTxsaT48c3Ryb25nPiMjdGFyZ2V0TmFtZXNwYWNlIDwvc3Ryb25nPjogdGhpcyBpcyBzaG9ydGhhbmQgZm9yIHRoZSB0YXJnZXQgbmFtZXNwYWNlCi1vZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGk+Rm9yIGEgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvY2VzcyBDb250ZW50czwvc3Bhbj4gdmFsdWUsIHlvdSBjYW4KLXNlbGVjdDo8dWw+Ci08bGk+PHN0cm9uZz5za2lwPC9zdHJvbmc+OiB0aGUgWE1MIHByb2Nlc3NvciB3aWxsIG5vdCB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlCi1jb250ZW50IGF0IGFsbC48L2xpPgotCi08bGk+PHN0cm9uZz5sYXg8L3N0cm9uZz46IHRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgdmFsaWRhdGUgdGhlIGF0dHJpYnV0ZSBjb250ZW50Ci1hcyBtdWNoIGFzIGl0IGNhbi48L2xpPgotCi08bGk+PHN0cm9uZz5zdHJpY3Q8L3N0cm9uZz46IHRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgdmFsaWRhdGUgYWxsIHRoZSBhdHRyaWJ1dGUKLWNvbnRlbnQuPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhbnllLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhbnllLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOGM3Y2QuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYW55ZS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDgsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRhbnllIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgYW4gYW55IGVsZW1lbnQ8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBhbiBhbnkgZWxlbWVudDwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIHVzZSB0aGUgPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudCBpbiBhIHNpbWlsYXINCi13YXkgYXMgYSBEVEQncyBBTlkgY29udGVudCBtb2RlbCwgaG93ZXZlciwgaXQgbXVzdCBiZSBkb25lIGluIGNvbmp1bmN0aW9uDQotd2l0aCBuYW1lc3BhY2VzLiBUaGlzIGVuYWJsZXMgeW91IHRvIGluY2x1ZGUgYW55IHdlbGwtZm9ybWVkIFhNTCBjb250ZW50LA0KLXN1Y2ggYXMgYW4gSFRNTCBXZWIgcGFnZSB0aGF0IGNvbmZvcm1zIHRvIFhIVE1MIDEuMCBzeW50YXguPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmFkZGluZyBhbiBhbnkgZWxlbWVudDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+YWRkaW5nIGFuIGFueSBlbGVtZW50PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5Gb3IgZXhhbXBsZTo8L3A+PHA+PGNvZGVibG9jaz4mbHQ7ZWxlbWVudCBuYW1lID0gIk15V2ViUGFnZSI+DQotJmx0O2NvbXBsZXhUeXBlPg0KLSZsdDthbnkgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ic2tpcCIvPg0KLSZsdDsvY29tcGxleFR5cGU+DQotJmx0Oy9lbGVtZW50PjwvY29kZWJsb2NrPjwvcD48cD5UaGUgcHJlY2VkaW5nIHNjaGVtYSBmcmFnbWVudCBhbGxvd3MNCi1hIDxjb2RlcGg+Jmx0O015V2ViUGFnZT48L2NvZGVwaD4gZWxlbWVudCB0byBjb250YWluIGFueSB3ZWxsLWZvcm1lZA0KLVhIVE1MIGRhdGEgdGhhdCBhcHBlYXJzIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLjwvcD48cD5UaGUgZm9sbG93aW5nDQotaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsDQotYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBhZGQgYW4gPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudCwNCi1jb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgcmlnaHQtY2xpY2sgdGhlIGNvbnRlbnQgbW9kZWwgdGhhdA0KLXlvdSB3YW50IHRvIHdvcmsgd2l0aCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgQW55PC91aWNvbnRyb2w+LiA8L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIG5ldyA8Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGZvciBhIDx1aWNvbnRyb2w+TmFtZXNwYWNlPC91aWNvbnRyb2w+IHZhbHVlLA0KLXlvdSBjYW4gc2VsZWN0OjwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+PGI+IyNhbnk8L2I+OiB0aGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIGZyb20gYW55IG5hbWVzcGFjZS48L2Nob2ljZT4NCi08Y2hvaWNlPjxiPiMjbG9jYWwgPC9iPjogdGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdA0KLWRlY2xhcmVkIHRvIGJlIGluIGEgbmFtZXNwYWNlLjwvY2hvaWNlPg0KLTxjaG9pY2U+PGI+IyNvdGhlciA8L2I+OiB0aGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIHRoYXQgaXMgbm90DQotZnJvbSB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvY2hvaWNlPg0KLTxjaG9pY2U+PGI+IyN0YXJnZXROYW1lc3BhY2U8L2I+OiB0aGlzIGlzIHNob3J0aGFuZCBmb3IgdGhlIHRhcmdldA0KLW5hbWVzcGFjZSBvZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5Gb3IgYSA8dWljb250cm9sPlByb2Nlc3MgQ29udGVudHM8L3VpY29udHJvbD4gdmFsdWUsIHlvdQ0KLWNhbiBzZWxlY3Q6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT48Yj5za2lwPC9iPjogdGhlIFhNTCBwcm9jZXNzb3Igd2lsbCBub3QgdmFsaWRhdGUgdGhlIGNvbnRlbnQNCi1hdCBhbGwuPC9jaG9pY2U+DQotPGNob2ljZT48Yj5sYXg8L2I+OiB0aGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIHRoZSBjb250ZW50IGFzDQotbXVjaCBhcyBpdCBjYW4uPC9jaG9pY2U+DQotPGNob2ljZT48Yj5zdHJpY3Q8L2I+OiB0aGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIGFsbCB0aGUgY29udGVudC48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIDx1aWNvbnRyb2w+TWluaW11bSBPY2N1cnJlbmNlPC91aWNvbnRyb2w+IHZhbHVlIGlzDQotdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudCBtdXN0IGFwcGVhciBpbg0KLWFuIGluc3RhbmNlIGRvY3VtZW50LiBZb3UgY2FuIHNlbGVjdCA8dWljb250cm9sPjA8L3VpY29udHJvbD4gaWYgeW91DQotd2FudCB0aGUgZWxlbWVudCB0byBiZSBvcHRpb25hbDsgb3RoZXJ3aXNlLCBzZWxlY3QgPHVpY29udHJvbD4xPC91aWNvbnRyb2w+LiA8L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgPHVpY29udHJvbD5NYXhpbXVtIE9jY3VycmVuY2U8L3VpY29udHJvbD4gdmFsdWUgaXMNCi10aGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgYW4gPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudCBjYW4gYXBwZWFyDQotaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQuIFlvdSBjYW4gc2VsZWN0IDx1aWNvbnRyb2w+MDwvdWljb250cm9sPiwgPHVpY29udHJvbD4xPC91aWNvbnRyb2w+LA0KLW9yLCB0byBpbmRpY2F0ZSB0aGVyZSBpcyBubyBtYXhpbXVtIG51bWJlciBvZiBvY2N1cnJlbmNlcywgPHVpY29udHJvbD51bmJvdW5kZWQ8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91DQotd2FudCB0byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVsZW1lbnQuIDw/UHViIENhcmV0Pz48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UgaXMgdXNlZCBmb3IgaHVtYW4NCi1yZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3UNCi13YW50IHRvIGFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mDQotc2NoZW1hIGNvbXBvbmVudHMuIDwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZQ0KLWFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+PGRyYWZ0LWNvbW1lbnQ+KGMpIENvcHlyaWdodCAyMDAxLCBXb3JsZCBXaWRlIFdlYiAoTWFzc2FjaHVzZXR0cw0KLUluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlDQotZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuPC9kcmFmdC1jb21tZW50PjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNDA4Nj8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYW55ZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYW55ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjViN2E1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFueWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgYW4gYW55IGVsZW1lbnQiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIGFueSBlbGVtZW50IGluIGEgc2ltaWxhciB3YXkgYXMgYSBEVEQncyBBTlkgY29udGVudCBtb2RlbCwgaG93ZXZlciwgaXQgbXVzdCBiZSBkb25lIGluIGNvbmp1bmN0aW9uIHdpdGggbmFtZXNwYWNlcy4gVGhpcyBlbmFibGVzIHlvdSB0byBpbmNsdWRlIGFueSB3ZWxsLWZvcm1lZCBYTUwgY29udGVudCwgc3VjaCBhcyBhbiBIVE1MIFdlYiBwYWdlIHRoYXQgY29uZm9ybXMgdG8gWEhUTUwgMS4wIHN5bnRheC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIGFueSBlbGVtZW50IGluIGEgc2ltaWxhciB3YXkgYXMgYSBEVEQncyBBTlkgY29udGVudCBtb2RlbCwgaG93ZXZlciwgaXQgbXVzdCBiZSBkb25lIGluIGNvbmp1bmN0aW9uIHdpdGggbmFtZXNwYWNlcy4gVGhpcyBlbmFibGVzIHlvdSB0byBpbmNsdWRlIGFueSB3ZWxsLWZvcm1lZCBYTUwgY29udGVudCwgc3VjaCBhcyBhbiBIVE1MIFdlYiBwYWdlIHRoYXQgY29uZm9ybXMgdG8gWEhUTUwgMS4wIHN5bnRheC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nIGFuIGFueSBlbGVtZW50LCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZyBhbiBhbnkgZWxlbWVudCwgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGFueWUiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgYW4gYW55IGVsZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRhbnllIj48YSBuYW1lPSJ0YWRkYW55ZSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGFuIGFueSBlbGVtZW50PC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIHVzZSB0aGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50IGluIGEgc2ltaWxhcgotd2F5IGFzIGEgRFREJ3MgQU5ZIGNvbnRlbnQgbW9kZWwsIGhvd2V2ZXIsIGl0IG11c3QgYmUgZG9uZSBpbiBjb25qdW5jdGlvbgotd2l0aCBuYW1lc3BhY2VzLiBUaGlzIGVuYWJsZXMgeW91IHRvIGluY2x1ZGUgYW55IHdlbGwtZm9ybWVkIFhNTCBjb250ZW50LAotc3VjaCBhcyBhbiBIVE1MIFdlYiBwYWdlIHRoYXQgY29uZm9ybXMgdG8gWEhUTUwgMS4wIHN5bnRheC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkZvciBleGFtcGxlOjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0O2VsZW1lbnQgbmFtZSA9ICJNeVdlYlBhZ2UiJmd0OwotJmx0O2NvbXBsZXhUeXBlJmd0OwotJmx0O2FueSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBwcm9jZXNzQ29udGVudHM9InNraXAiLyZndDsKLSZsdDsvY29tcGxleFR5cGUmZ3Q7Ci0mbHQ7L2VsZW1lbnQmZ3Q7PC9wcmU+Ci08L2Rpdj4KLTxwPlRoZSBwcmVjZWRpbmcgc2NoZW1hIGZyYWdtZW50IGFsbG93cwotYSA8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7TXlXZWJQYWdlJmd0Ozwvc2FtcD4gZWxlbWVudCB0byBjb250YWluIGFueSB3ZWxsLWZvcm1lZAotWEhUTUwgZGF0YSB0aGF0IGFwcGVhcnMgaW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UuPC9wPgotPHA+VGhlIGZvbGxvd2luZwotaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsCi1hbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGFuIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudCwKLWNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgcmlnaHQtY2xpY2sgdGhlIGNvbnRlbnQgbW9kZWwgdGhhdAoteW91IHdhbnQgdG8gd29yayB3aXRoIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQW55PC9zcGFuPi4gPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIG5ldyA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgZm9yIGEgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZXNwYWNlPC9zcGFuPiB2YWx1ZSwKLXlvdSBjYW4gc2VsZWN0Ojwvc3Bhbj4KLTx1bD4KLTxsaT48c3Ryb25nPiMjYW55PC9zdHJvbmc+OiB0aGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIGZyb20gYW55IG5hbWVzcGFjZS48L2xpPgotCi08bGk+PHN0cm9uZz4jI2xvY2FsIDwvc3Ryb25nPjogdGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdAotZGVjbGFyZWQgdG8gYmUgaW4gYSBuYW1lc3BhY2UuPC9saT4KLQotPGxpPjxzdHJvbmc+IyNvdGhlciA8L3N0cm9uZz46IHRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QKLWZyb20gdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPgotCi08bGk+PHN0cm9uZz4jI3RhcmdldE5hbWVzcGFjZTwvc3Ryb25nPjogdGhpcyBpcyBzaG9ydGhhbmQgZm9yIHRoZSB0YXJnZXQKLW5hbWVzcGFjZSBvZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Rm9yIGEgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvY2VzcyBDb250ZW50czwvc3Bhbj4gdmFsdWUsIHlvdQotY2FuIHNlbGVjdDo8L3NwYW4+Ci08dWw+Ci08bGk+PHN0cm9uZz5za2lwPC9zdHJvbmc+OiB0aGUgWE1MIHByb2Nlc3NvciB3aWxsIG5vdCB2YWxpZGF0ZSB0aGUgY29udGVudAotYXQgYWxsLjwvbGk+Ci0KLTxsaT48c3Ryb25nPmxheDwvc3Ryb25nPjogdGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSB0aGUgY29udGVudCBhcwotbXVjaCBhcyBpdCBjYW4uPC9saT4KLQotPGxpPjxzdHJvbmc+c3RyaWN0PC9zdHJvbmc+OiB0aGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIGFsbCB0aGUgY29udGVudC48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NaW5pbXVtIE9jY3VycmVuY2U8L3NwYW4+IHZhbHVlIGlzCi10aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQgbXVzdCBhcHBlYXIgaW4KLWFuIGluc3RhbmNlIGRvY3VtZW50LiBZb3UgY2FuIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj4wPC9zcGFuPiBpZiB5b3UKLXdhbnQgdGhlIGVsZW1lbnQgdG8gYmUgb3B0aW9uYWw7IG90aGVyd2lzZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjE8L3NwYW4+LiA8L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXhpbXVtIE9jY3VycmVuY2U8L3NwYW4+IHZhbHVlIGlzCi10aGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgYW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50IGNhbiBhcHBlYXIKLWluIGFuIGluc3RhbmNlIGRvY3VtZW50LiBZb3UgY2FuIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj4wPC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MTwvc3Bhbj4sCi1vciwgdG8gaW5kaWNhdGUgdGhlcmUgaXMgbm8gbWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMsIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnVuYm91bmRlZDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmIHlvdQotd2FudCB0byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVsZW1lbnQuIDwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZSBpcyB1c2VkIGZvciBodW1hbgotcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91Ci13YW50IHRvIGFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mCi1zY2hlbWEgY29tcG9uZW50cy4gPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZQotYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBzY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgLz4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNtb2QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNtb2QuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2OWRkYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbW9kLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZGNtb2QiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBjb250ZW50IG1vZGVsczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGNvbnRlbnQgbW9kZWxzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkEgY29udGVudCBtb2RlbCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkDQotaW5zaWRlIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLiBJdCBpcyBhIGZvcm1hbA0KLWRlc2NyaXB0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHBlcm1pc3NpYmxlIGNvbnRlbnQgb2YgYW4gZWxlbWVudCwgZ2xvYmFsDQotZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gdmFsaWRhdGUgYSBkb2N1bWVudA0KLWluc3RhbmNlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5jb250ZW50IG1vZGVsczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+Y29udGVudCBtb2RlbHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQga2luZHMgb2YgY29udGVudCBtb2RlbHM6PHVsPg0KLTxsaT48Yj5TZXF1ZW5jZTwvYj4sIHdoaWNoIG1lYW5zIHRoYXQgYWxsIHRoZSBjb250ZW50IG1vZGVsJ3MgY2hpbGRyZW4gY2FuDQotYXBwZWFyIGluIGFuIGluc3RhbmNlIG9mIHRoZSBYTUwgc2NoZW1hLiBUaGV5IG11c3QsIGhvd2V2ZXIsIGFwcGVhciBpbiB0aGUNCi1vcmRlciB0aGV5IGFyZSBsaXN0ZWQgaW4gdGhlIGNvbnRlbnQgbW9kZWwuPC9saT4NCi08bGk+PGI+Q2hvaWNlPC9iPiwgd2hpY2ggbWVhbnMgdGhhdCBvbmx5IG9uZSBvZiB0aGUgY29udGVudCBtb2RlbCdzIGNoaWxkcmVuDQotY2FuIGFwcGVhciBpbiBhbiBpbnN0YW5jZSBvZiB0aGUgWE1MIHNjaGVtYS48L2xpPg0KLTxsaT48Yj5BbGw8L2I+LCB3aGljaCBtZWFucyB0aGF0IGFsbCBvZiB0aGUgY29udGVudCBtb2RlbCdzIGNoaWxkcmVuIGNhbiBhcHBlYXINCi1vbmNlIG9yIG5vdCBhdCBhbGwsIGFuZCB0aGV5IGNhbiBhcHBlYXIgaW4gYW55IG9yZGVyLiBJZiB5b3Ugc2VsZWN0IHRoaXMgb3B0aW9uLA0KLWFsbCBvZiB0aGUgY29udGVudHMgbW9kZWwncyBjaGlsZHJlbiBtdXN0IGJlIGluZGl2aWR1YWwgZWxlbWVudHMgYW5kIG5vIGVsZW1lbnQNCi1pbiB0aGUgY29udGVudCBtb2RlbCBjYW4gYXBwZWFyIG1vcmUgdGhhbiBvbmNlLjwvbGk+DQotPC91bD48L3A+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhIGNvbnRlbnQNCi1tb2RlbCB0byBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgY29tcGxldGUgdGhlDQotZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCBzZWxlY3QgeW91ciBjb21wbGV4IHR5cGUsIG9yIGdyb3VwOjwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+SWYgeW91IHNlbGVjdGVkIGEgY29tcGxleCB0eXBlLCB5b3UgY2FuIHJpZ2h0LWNsaWNrIGl0IGFuZCBjbGljayA8dWljb250cm9sPkFkZA0KLVNlcXVlbmNlPC91aWNvbnRyb2w+LCBvciA8dWljb250cm9sPkFkZCBDaG9pY2U8L3VpY29udHJvbD4gdG8gYWRkIHRoZSB0eXBlDQotb2YgY29udGVudCBtb2RlbCB5b3Ugd2FudCB0byB5b3VyIGNvbXBsZXggdHlwZS4gSWYgeW91IHdpc2ggdG8gdXNlIHRoZSA8dWljb250cm9sPmFsbDwvdWljb250cm9sPiBjb250ZW50DQotbW9kZWwsIHlvdSBjYW4gY2hhbmdlIHRoZSBtb2RlbCBieSBjbGlja2luZyB0aGUgbW9kZWwgaW4gdGhlIERlc2lnbiB2aWV3LA0KLWFuZCBpbiBwcm9wZXJ0aWVzLCBzZWxlY3QgPHVpY29udHJvbD5hbGw8L3VpY29udHJvbD4gYXMgdGhlIDx1aWNvbnRyb2w+S2luZDwvdWljb250cm9sPi4NCi1Zb3VyIGNvbnRlbnQgbW9kZWwgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcyBhIGNoaWxkIG9mIHlvdXIgY29tcGxleCB0eXBlDQotLSBleHBhbmQgaW4gdGhlIE91dGxpbmUgdmlldyB0byBzZWUgaXQuIDxiPk5vdGU6PC9iPiBUaGVzZSBvcHRpb25zIHdpbGwgbm90DQotYXBwZWFyIGlmIHlvdSBoYXZlIHNldCBhIGJhc2UgdHlwZSBmb3IgeW91ciBjb21wbGV4IHR5cGUuIFlvdSBjYW4gZWl0aGVyIHNldA0KLWEgYmFzZSB0eXBlIGZvciB5b3VyIGNvbXBsZXggdHlwZSwgb3IgeW91IGFkZCBhIGNvbnRlbnQgbW9kZWwgdG8gaXQsIGJ1dCB5b3UNCi1jYW5ub3QgZG8gYm90aC48L2Nob2ljZT4NCi08Y2hvaWNlPllvdXIgZ3JvdXAgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHdpdGggYSBzZXF1ZW5jZSBjb250ZW50IG1vZGVsDQotY2hpbGQuIEV4cGFuZCBpdCBpbiB0aGUgT3V0bGluZSB2aWV3IHRvIHNlZSBpdCBhbmQgc2VsZWN0IGl0LiBJbiB0aGUgUHJvcGVydGllcw0KLXZpZXcsIHlvdSBjYW4gc2VsZWN0IHRvIGNoYW5nZSBpdCB0byBhIDx1aWNvbnRyb2w+Y2hvaWNlPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+YWxsPC91aWNvbnRyb2w+IGNvbnRlbnQNCi1tb2RlbCBieSBzZWxlY3RpbmcgdGhlc2Ugb3B0aW9ucyBmcm9tIHRoZSA8dWljb250cm9sPktpbmQ8L3VpY29udHJvbD4gZHJvcC1kb3duLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPHN0ZXAgaW1wb3J0YW5jZT0ib3B0aW9uYWwiPjxjbWQ+U2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5NaW5pbXVtDQotT2NjdXJyPD9QdWIgQ2FyZXQ/PmVuY2U8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+PGluZm8+VGhpcyBpcyB0aGUgbWluaW11bQ0KLW51bWJlciBvZiB0aW1lcyB0aGUgY29udGVudCBtb2RlbCBtdXN0IGFwcGVhci4gSWYgeW91IHdhbnQgdGhlIGNvbnRlbnQgbW9kZWwNCi10byBiZSBvcHRpb25hbCwgc2VsZWN0IDx1aWNvbnRyb2w+MDwvdWljb250cm9sPi4gT3RoZXJ3aXNlLCBzZWxlY3QgPHVpY29udHJvbD4xPC91aWNvbnRyb2w+LiA8L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwIGltcG9ydGFuY2U9Im9wdGlvbmFsIj48Y21kPlNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+TWF4aW11bQ0KLU9jY3VycmVuY2U8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+PGluZm8+VGhpcyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMNCi1hIGNvbnRlbnQgbW9kZWwgY2FuIGFwcGVhci4gWW91IGNhbiBzZWxlY3QgPHVpY29udHJvbD51bmJvdW5kZWQ8L3VpY29udHJvbD4gdG8NCi1pbmRpY2F0ZSB0aGVyZSBpcyBubyBtYXhpbXVtIG51bWJlciBvZiBvY2N1cnJlbmNlcy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbnRlbnQgbW9kZWwuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPjxwPllvdSBjYW4gYWRkIHRoZSBmb2xsb3dpbmcgaXRlbXMgdG8gYSBjb250ZW50IG9iamVjdCBtb2RlbDogPC9wPjx1bD4NCi08bGk+QW5vdGhlciBjb250ZW50IG1vZGVsLjwvbGk+DQotPGxpPkEgZ3JvdXAgcmVmZXJlbmNlIHdoaWNoIGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ3JvdXAgdG8gYXBwZWFyIGluIHRoZQ0KLWluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4gVGhpcyBtZW51DQotb3B0aW9uIG9ubHkgYXBwZWFycyBpZiB0aGVyZSBhcmUgZ2xvYmFsIGdyb3VwcyBkZWZpbmVkIGVsc2V3aGVyZSBpbiB0aGUgZG9jdW1lbnQNCi1vciBpZiBncm91cHMgYXJlIGRlZmluZWQgaW4gaW5jbHVkZWQgc2NoZW1hcy48L2xpPg0KLTxsaT5BbiBlbGVtZW50LCBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgaW4gWE1MLjwvbGk+DQotPGxpPkFuIGVsZW1lbnQgcmVmZXJlbmNlLCB3aGljaCBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBlbGVtZW50Lg0KLVRoaXMgbWVudSBvcHRpb24gb25seSBhcHBlYXJzIGlmIHRoZXJlIGFyZSBnbG9iYWwgZWxlbWVudHMgZGVmaW5lZCBlbHNld2hlcmUNCi1pbiB0aGUgZG9jdW1lbnQuPC9saT4NCi08bGk+QW4gPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudC4gWW91IGNhbiB1c2UgYW4gPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudA0KLXRvIGV4dGVuZCB5b3VyIGNvbnRlbnQgbW9kZWwgYnkgYW55IGVsZW1lbnRzIGJlbG9uZ2luZyB0byBhIHNwZWNpZmllZCBuYW1lc3BhY2UuPC9saT4NCi08L3VsPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNTEwMT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY21vZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY21vZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjkxNWJlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNtb2QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgY29udGVudCBtb2RlbHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQSBjb250ZW50IG1vZGVsIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLiBJdCBpcyBhIGZvcm1hbCBkZXNjcmlwdGlvbiBvZiB0aGUgc3RydWN0dXJlIGFuZCBwZXJtaXNzaWJsZSBjb250ZW50IG9mIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLCB3aGljaCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZSBhIGRvY3VtZW50IGluc3RhbmNlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBIGNvbnRlbnQgbW9kZWwgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZCBpbnNpZGUgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAuIEl0IGlzIGEgZm9ybWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHBlcm1pc3NpYmxlIGNvbnRlbnQgb2YgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAsIHdoaWNoIG1heSBiZSB1c2VkIHRvIHZhbGlkYXRlIGEgZG9jdW1lbnQgaW5zdGFuY2UuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGNvbnRlbnQgbW9kZWxzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGNvbnRlbnQgbW9kZWxzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRhbnllLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZWxtLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZWxtci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGdycHIuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkY21vZCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBjb250ZW50IG1vZGVsczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZGNtb2QiPjxhIG5hbWU9InRhZGRjbW9kIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgY29udGVudCBtb2RlbHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkEgY29udGVudCBtb2RlbCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkCi1pbnNpZGUgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAuIEl0IGlzIGEgZm9ybWFsCi1kZXNjcmlwdGlvbiBvZiB0aGUgc3RydWN0dXJlIGFuZCBwZXJtaXNzaWJsZSBjb250ZW50IG9mIGFuIGVsZW1lbnQsIGdsb2JhbAotZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gdmFsaWRhdGUgYSBkb2N1bWVudAotaW5zdGFuY2UuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGl2IGNsYXNzPSJwIj5UaGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IGtpbmRzIG9mIGNvbnRlbnQgbW9kZWxzOjx1bD4KLTxsaT48c3Ryb25nPlNlcXVlbmNlPC9zdHJvbmc+LCB3aGljaCBtZWFucyB0aGF0IGFsbCB0aGUgY29udGVudCBtb2RlbCdzIGNoaWxkcmVuIGNhbgotYXBwZWFyIGluIGFuIGluc3RhbmNlIG9mIHRoZSBYTUwgc2NoZW1hLiBUaGV5IG11c3QsIGhvd2V2ZXIsIGFwcGVhciBpbiB0aGUKLW9yZGVyIHRoZXkgYXJlIGxpc3RlZCBpbiB0aGUgY29udGVudCBtb2RlbC48L2xpPgotCi08bGk+PHN0cm9uZz5DaG9pY2U8L3N0cm9uZz4sIHdoaWNoIG1lYW5zIHRoYXQgb25seSBvbmUgb2YgdGhlIGNvbnRlbnQgbW9kZWwncyBjaGlsZHJlbgotY2FuIGFwcGVhciBpbiBhbiBpbnN0YW5jZSBvZiB0aGUgWE1MIHNjaGVtYS48L2xpPgotCi08bGk+PHN0cm9uZz5BbGw8L3N0cm9uZz4sIHdoaWNoIG1lYW5zIHRoYXQgYWxsIG9mIHRoZSBjb250ZW50IG1vZGVsJ3MgY2hpbGRyZW4gY2FuIGFwcGVhcgotb25jZSBvciBub3QgYXQgYWxsLCBhbmQgdGhleSBjYW4gYXBwZWFyIGluIGFueSBvcmRlci4gSWYgeW91IHNlbGVjdCB0aGlzIG9wdGlvbiwKLWFsbCBvZiB0aGUgY29udGVudHMgbW9kZWwncyBjaGlsZHJlbiBtdXN0IGJlIGluZGl2aWR1YWwgZWxlbWVudHMgYW5kIG5vIGVsZW1lbnQKLWluIHRoZSBjb250ZW50IG1vZGVsIGNhbiBhcHBlYXIgbW9yZSB0aGFuIG9uY2UuPC9saT4KLQotPC91bD4KLTwvZGl2PgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYSBjb250ZW50Ci1tb2RlbCB0byBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgY29tcGxldGUgdGhlCi1mb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3LCBzZWxlY3QgeW91ciBjb21wbGV4IHR5cGUsIG9yIGdyb3VwOjwvc3Bhbj4KLTx1bD4KLTxsaT5JZiB5b3Ugc2VsZWN0ZWQgYSBjb21wbGV4IHR5cGUsIHlvdSBjYW4gcmlnaHQtY2xpY2sgaXQgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZAotU2VxdWVuY2U8L3NwYW4+LCBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQ2hvaWNlPC9zcGFuPiB0byBhZGQgdGhlIHR5cGUKLW9mIGNvbnRlbnQgbW9kZWwgeW91IHdhbnQgdG8geW91ciBjb21wbGV4IHR5cGUuIElmIHlvdSB3aXNoIHRvIHVzZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+YWxsPC9zcGFuPiBjb250ZW50Ci1tb2RlbCwgeW91IGNhbiBjaGFuZ2UgdGhlIG1vZGVsIGJ5IGNsaWNraW5nIHRoZSBtb2RlbCBpbiB0aGUgRGVzaWduIHZpZXcsCi1hbmQgaW4gcHJvcGVydGllcywgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmFsbDwvc3Bhbj4gYXMgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktpbmQ8L3NwYW4+LgotWW91ciBjb250ZW50IG1vZGVsIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMgYSBjaGlsZCBvZiB5b3VyIGNvbXBsZXggdHlwZQotLSBleHBhbmQgaW4gdGhlIE91dGxpbmUgdmlldyB0byBzZWUgaXQuIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlc2Ugb3B0aW9ucyB3aWxsIG5vdAotYXBwZWFyIGlmIHlvdSBoYXZlIHNldCBhIGJhc2UgdHlwZSBmb3IgeW91ciBjb21wbGV4IHR5cGUuIFlvdSBjYW4gZWl0aGVyIHNldAotYSBiYXNlIHR5cGUgZm9yIHlvdXIgY29tcGxleCB0eXBlLCBvciB5b3UgYWRkIGEgY29udGVudCBtb2RlbCB0byBpdCwgYnV0IHlvdQotY2Fubm90IGRvIGJvdGguPC9saT4KLQotPGxpPllvdXIgZ3JvdXAgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHdpdGggYSBzZXF1ZW5jZSBjb250ZW50IG1vZGVsCi1jaGlsZC4gRXhwYW5kIGl0IGluIHRoZSBPdXRsaW5lIHZpZXcgdG8gc2VlIGl0IGFuZCBzZWxlY3QgaXQuIEluIHRoZSBQcm9wZXJ0aWVzCi12aWV3LCB5b3UgY2FuIHNlbGVjdCB0byBjaGFuZ2UgaXQgdG8gYSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5jaG9pY2U8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmFsbDwvc3Bhbj4gY29udGVudAotbW9kZWwgYnkgc2VsZWN0aW5nIHRoZXNlIG9wdGlvbnMgZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2luZDwvc3Bhbj4gZHJvcC1kb3duLjwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+U2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWluaW11bQotT2NjdXJyZW5jZTwvc3Bhbj4gZmllbGQuPC9zcGFuPiBUaGlzIGlzIHRoZSBtaW5pbXVtCi1udW1iZXIgb2YgdGltZXMgdGhlIGNvbnRlbnQgbW9kZWwgbXVzdCBhcHBlYXIuIElmIHlvdSB3YW50IHRoZSBjb250ZW50IG1vZGVsCi10byBiZSBvcHRpb25hbCwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjA8L3NwYW4+LiBPdGhlcndpc2UsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj4xPC9zcGFuPi4gCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPlNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1heGltdW0KLU9jY3VycmVuY2U8L3NwYW4+IGZpZWxkLjwvc3Bhbj4gVGhpcyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMKLWEgY29udGVudCBtb2RlbCBjYW4gYXBwZWFyLiBZb3UgY2FuIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj51bmJvdW5kZWQ8L3NwYW4+IHRvCi1pbmRpY2F0ZSB0aGVyZSBpcyBubyBtYXhpbXVtIG51bWJlciBvZiBvY2N1cnJlbmNlcy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29udGVudCBtb2RlbC48L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3Ugd2FudCB0bwotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUKLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WW91IGNhbiBhZGQgdGhlIGZvbGxvd2luZyBpdGVtcyB0byBhIGNvbnRlbnQgb2JqZWN0IG1vZGVsOiA8L3A+Ci08dWw+Ci08bGk+QW5vdGhlciBjb250ZW50IG1vZGVsLjwvbGk+Ci0KLTxsaT5BIGdyb3VwIHJlZmVyZW5jZSB3aGljaCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUKLWluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4gVGhpcyBtZW51Ci1vcHRpb24gb25seSBhcHBlYXJzIGlmIHRoZXJlIGFyZSBnbG9iYWwgZ3JvdXBzIGRlZmluZWQgZWxzZXdoZXJlIGluIHRoZSBkb2N1bWVudAotb3IgaWYgZ3JvdXBzIGFyZSBkZWZpbmVkIGluIGluY2x1ZGVkIHNjaGVtYXMuPC9saT4KLQotPGxpPkFuIGVsZW1lbnQsIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBpbiBYTUwuPC9saT4KLQotPGxpPkFuIGVsZW1lbnQgcmVmZXJlbmNlLCB3aGljaCBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBlbGVtZW50LgotVGhpcyBtZW51IG9wdGlvbiBvbmx5IGFwcGVhcnMgaWYgdGhlcmUgYXJlIGdsb2JhbCBlbGVtZW50cyBkZWZpbmVkIGVsc2V3aGVyZQotaW4gdGhlIGRvY3VtZW50LjwvbGk+Ci0KLTxsaT5BbiA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQuIFlvdSBjYW4gdXNlIGFuIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudAotdG8gZXh0ZW5kIHlvdXIgY29udGVudCBtb2RlbCBieSBhbnkgZWxlbWVudHMgYmVsb25naW5nIHRvIGEgc3BlY2lmaWVkIG5hbWVzcGFjZS48L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRhbnllLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgYW55IGVsZW1lbnQgaW4gYSBzaW1pbGFyIHdheSBhcyBhIERURCdzIEFOWSBjb250ZW50IG1vZGVsLCBob3dldmVyLCBpdCBtdXN0IGJlIGRvbmUgaW4gY29uanVuY3Rpb24gd2l0aCBuYW1lc3BhY2VzLiBUaGlzIGVuYWJsZXMgeW91IHRvIGluY2x1ZGUgYW55IHdlbGwtZm9ybWVkIFhNTCBjb250ZW50LCBzdWNoIGFzIGFuIEhUTUwgV2ViIHBhZ2UgdGhhdCBjb25mb3JtcyB0byBYSFRNTCAxLjAgc3ludGF4LiI+QWRkaW5nIGFuIGFueSBlbGVtZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGVsbS5odG1sIiB0aXRsZT0iRWxlbWVudHMgYXJlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBpbiBYTUwuIEVsZW1lbnQgZGVjbGFyYXRpb25zIHByb3ZpZGUgdmFsdWUgY29uc3RyYWludHMsIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciB2YWxpZGF0aW9uLCBlc3RhYmxpc2ggY29uc3RyYWluaW5nIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiByZWxhdGVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLCBhbmQgY29udHJvbCB0aGUgc3Vic3RpdHV0aW9uIG9mIGVsZW1lbnRzLiI+QWRkaW5nIGVsZW1lbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGVsbXIuaHRtbCIgdGl0bGU9IkFuIGVsZW1lbnQgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGVsZW1lbnQuIEEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGVsZW1lbnQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBnbG9iYWwgZWxlbWVudCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4iPkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkZ3Jwci5odG1sIiB0aXRsZT0iQSBncm91cCByZWZlcmVuY2UgaXMgYSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBncm91cC4gSXQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBncm91cCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4iPkFkZGluZyBncm91cCByZWZlcmVuY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNteHQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNteHQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhiZDdlYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbXh0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwOCwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgU3R5IF9kaXNwbGF5IEZvbnRDb2xvcj0icmVkIj8+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZGNteHQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBjb21wbGV4IHR5cGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgY29tcGxleCB0eXBlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BIGNvbXBsZXggdHlwZSBhbGxvd3MgZWxlbWVudHMgaW4gaXRzIGNvbnRlbnQgYW5kIGNhbiBjYXJyeQ0KLWF0dHJpYnV0ZXMuIENvbXBsZXggdHlwZXMgY2FuIGJlIHVzZWQgdG8gaGVscCBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlDQotY29udGVudCBmb3IgYW55IGluc3RhbmNlIGRvY3VtZW50cyBnZW5lcmF0ZWQgZnJvbSBvciBhc3NvY2lhdGVkIHdpdGgNCi15b3VyIFhNTCBzY2hlbWEuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmNvbXBsZXggdHlwZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmNvbXBsZXggdHlwZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPllvdSBjYW4gYWRkIGFzIG1hbnkgY29tcGxleCB0eXBlcyBhcyB5b3Ugd2FudCB0byBhbiBYTUwNCi1zY2hlbWEuPC9wPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlDQotcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5Ubw0KLWFkZCBhIGNvbXBsZXggdHlwZSB0byBhbiBYTUwgc2NoZW1hLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlJpZ2h0LWNsaWNrIHRoZSBUeXBlcyBjYXRlZ29yeSBpbiB0aGUgRGVzaWduIHZpZXcsIGNsaWNrIDx1aWNvbnRyb2w+QWRkDQotQ29tcGxleCBUeXBlPC91aWNvbnRyb2w+IGFuZCB0eXBlIHRoZSBuYW1lIGZvciB0aGUgY29tcGxleCB0eXBlLiBJZg0KLXlvdSBuZWVkIHRvIGNoYW5nZSB0aGUgbmFtZSBsYXRlciwgeW91IGNhbiBlZGl0IGl0IGluIHRoZSA8dWljb250cm9sPkdlbmVyYWw8L3VpY29udHJvbD4gdGFiDQotb2YgdGhlIFByb3BlcnRpZXMgdmlldy48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyBzZXQgYSBiYXNlIHR5cGUgZm9yIHRoZSBjb21wbGV4IHR5cGUsIHJpZ2h0LWNsaWNrIHRoZQ0KLXR5cGUgaW4gdGhlIERlc2lnbiB2aWV3IGFuZCBjbGljayA8dWljb250cm9sPlNldCBCYXNlIFR5cGU8L3VpY29udHJvbD4uIDwvY21kPg0KLTxpbmZvPllvdSBjYW4gZWl0aGVyIHNldCBhIGJhc2UgdHlwZSBmb3IgeW91ciBjb21wbGV4IHR5cGUsIG9yIHlvdQ0KLWNhbiBhZGQgYSBjb250ZW50IG1vZGVsIHRvIGl0ICh3aGljaCByZXByZXNlbnRzIGFueSBkYXRhIHRoYXQgY2FuDQotYmUgY29udGFpbmVkIGluc2lkZSBhbiBlbGVtZW50KSwgYnV0IHlvdSBjYW5ub3QgZG8gYm90aC4gRm9yIG1vcmUNCi1pbmZvcm1hdGlvbiBhYm91dCBjb250ZW50IG1vZGVscywgc2VlIDx4cmVmIGhyZWY9InRhZGRjbW9kLmRpdGEiDQotc2NvcGU9InBlZXIiPkFkZGluZyBjb250ZW50IG1vZGVsczwveHJlZj4uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPllvdXIgbmV3IHR5cGUgY2FuIGJlIGRlcml2ZWQgZnJvbSBpdHMgYmFzZSB0eXBlIGVpdGhlcg0KLWJ5IGV4dGVuc2lvbiBvciByZXN0cmljdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGRlcml2YXRpb24gaXMgc2V0IHRvDQotZXh0ZW5zaW9uLiBUbyBjaGFuZ2UgaG93IHRoZSB0eXBlIGlzIGRlcml2ZWQsIGNsaWNrIHRoZSA8dWljb250cm9sPkdlbmVyYWw8L3VpY29udHJvbD4gdGFiDQotaW4gdGhlIFByb3BlcnRpZXMgdmlldyBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+cmVzdHJpY3Rpb248L3VpY29udHJvbD4gb3IgPHVpY29udHJvbD5leHRlbnNpb248L3VpY29udHJvbD4gZnJvbQ0KLXRoZSA8dWljb250cm9sPkluaGVyaXRlZCBCeTwvdWljb250cm9sPiBsaXN0LiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyBhZGQgYXR0cmlidXRlcyB0byB5b3VyIGNvbXBsZXggdHlwZSwgaW4gdGhlIERlc2lnbiB2aWV3LA0KLXJpZ2h0LWNsaWNrIHlvdXIgY29tcGxleCB0eXBlIGFuZCBzZWxlY3QgPHVpY29udHJvbD5BZGQgQXR0cmlidXRlPC91aWNvbnRyb2w+LiA8L2NtZD4NCi08aW5mbz5BbiBhdHRyaWJ1dGUgYXNzb2NpYXRlcyBhbiBhdHRyaWJ1dGUgbmFtZSB3aXRoIGEgc3BlY2lmaWMgdHlwZQ0KLWFuZCB2YWx1ZS4gPC9pbmZvPjw/UHViIENhcmV0MT8+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+VG8gc2V0IHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIGluIHRoZSBEZXNpZ24gdmlldywNCi1kb3VibGUtY2xpY2sgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBhbmQgdHlwZSB0aGUgbmFtZS48L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5UbyBzZXQgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSwgaW4gdGhlIERlc2lnbiB2aWV3LA0KLWRvdWJsZS1jbGljayB0aGUgYXR0cmlidXRlIHR5cGUgYW5kIHRoZW4gc2VsZWN0IHRoZSBuZXcgdHlwZSBmcm9tDQotdGhlIGxpc3QuPC9jbWQ+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPGluZm8+Rm9yIGluZm9ybWF0aW9uIGFib3V0IGFkZGluZyBhdHRyaWJ1dGVzLCBhdHRyaWJ1dGUgcmVmZXJlbmNlcywNCi1hbmQgPHVzZXJpbnB1dD5hbnk8L3VzZXJpbnB1dD4gYXR0cmlidXRlcywgc2VlIDx4cmVmIGhyZWY9InRhZGRhZ3JwLmRpdGEiDQotc2NvcGU9InBlZXIiPkFkZGluZyBhdHRyaWJ1dGUgZ3JvdXBzPC94cmVmPi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+WW91IGNhbiBmdXJ0aGVyIGRlZmluZSB5b3VyIGNvbXBsZXggdHlwZSBpbiB0aGUgUHJvcGVydGllcw0KLXZpZXc6PC9jbWQ+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYNCi15b3Ugd2FudCB0byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbXBsZXggdHlwZS4gPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlIGlzIHVzZWQgZm9yIGh1bWFuDQotcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91DQotd2FudCB0byBhZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZg0KLXNjaGVtYSBjb21wb25lbnRzLiA8L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UNCi1hbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIHNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPg0KLTwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzODQxPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbXh0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbXh0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZWU2ZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY214dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBjb21wbGV4IHR5cGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkEgY29tcGxleCB0eXBlIGFsbG93cyBlbGVtZW50cyBpbiBpdHMgY29udGVudCBhbmQgY2FuIGNhcnJ5IGF0dHJpYnV0ZXMuIENvbXBsZXggdHlwZXMgY2FuIGJlIHVzZWQgdG8gaGVscCBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGNvbnRlbnQgZm9yIGFueSBpbnN0YW5jZSBkb2N1bWVudHMgZ2VuZXJhdGVkIGZyb20gb3IgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBjb21wbGV4IHR5cGUgYWxsb3dzIGVsZW1lbnRzIGluIGl0cyBjb250ZW50IGFuZCBjYW4gY2FycnkgYXR0cmlidXRlcy4gQ29tcGxleCB0eXBlcyBjYW4gYmUgdXNlZCB0byBoZWxwIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgY29udGVudCBmb3IgYW55IGluc3RhbmNlIGRvY3VtZW50cyBnZW5lcmF0ZWQgZnJvbSBvciBhc3NvY2lhdGVkIHdpdGggeW91ciBYTUwgc2NoZW1hLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBjb21wbGV4IHR5cGVzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGNvbXBsZXggdHlwZXMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGNtb2QuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkY214dCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBjb21wbGV4IHR5cGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkY214dCI+PGEgbmFtZT0idGFkZGNteHQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBjb21wbGV4IHR5cGVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BIGNvbXBsZXggdHlwZSBhbGxvd3MgZWxlbWVudHMgaW4gaXRzIGNvbnRlbnQgYW5kIGNhbiBjYXJyeQotYXR0cmlidXRlcy4gQ29tcGxleCB0eXBlcyBjYW4gYmUgdXNlZCB0byBoZWxwIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUKLWNvbnRlbnQgZm9yIGFueSBpbnN0YW5jZSBkb2N1bWVudHMgZ2VuZXJhdGVkIGZyb20gb3IgYXNzb2NpYXRlZCB3aXRoCi15b3VyIFhNTCBzY2hlbWEuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Zb3UgY2FuIGFkZCBhcyBtYW55IGNvbXBsZXggdHlwZXMgYXMgeW91IHdhbnQgdG8gYW4gWE1MCi1zY2hlbWEuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UKLXBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbwotYWRkIGEgY29tcGxleCB0eXBlIHRvIGFuIFhNTCBzY2hlbWEsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0LWNsaWNrIHRoZSBUeXBlcyBjYXRlZ29yeSBpbiB0aGUgRGVzaWduIHZpZXcsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZAotQ29tcGxleCBUeXBlPC9zcGFuPiBhbmQgdHlwZSB0aGUgbmFtZSBmb3IgdGhlIGNvbXBsZXggdHlwZS4gSWYKLXlvdSBuZWVkIHRvIGNoYW5nZSB0aGUgbmFtZSBsYXRlciwgeW91IGNhbiBlZGl0IGl0IGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPiB0YWIKLW9mIHRoZSBQcm9wZXJ0aWVzIHZpZXcuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gc2V0IGEgYmFzZSB0eXBlIGZvciB0aGUgY29tcGxleCB0eXBlLCByaWdodC1jbGljayB0aGUKLXR5cGUgaW4gdGhlIERlc2lnbiB2aWV3IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TZXQgQmFzZSBUeXBlPC9zcGFuPi4gPC9zcGFuPgotIFlvdSBjYW4gZWl0aGVyIHNldCBhIGJhc2UgdHlwZSBmb3IgeW91ciBjb21wbGV4IHR5cGUsIG9yIHlvdQotY2FuIGFkZCBhIGNvbnRlbnQgbW9kZWwgdG8gaXQgKHdoaWNoIHJlcHJlc2VudHMgYW55IGRhdGEgdGhhdCBjYW4KLWJlIGNvbnRhaW5lZCBpbnNpZGUgYW4gZWxlbWVudCksIGJ1dCB5b3UgY2Fubm90IGRvIGJvdGguIEZvciBtb3JlCi1pbmZvcm1hdGlvbiBhYm91dCBjb250ZW50IG1vZGVscywgc2VlIDxhIGhyZWY9InRhZGRjbW9kLmh0bWwiPkFkZGluZyBjb250ZW50IG1vZGVsczwvYT4uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3VyIG5ldyB0eXBlIGNhbiBiZSBkZXJpdmVkIGZyb20gaXRzIGJhc2UgdHlwZSBlaXRoZXIKLWJ5IGV4dGVuc2lvbiBvciByZXN0cmljdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGRlcml2YXRpb24gaXMgc2V0IHRvCi1leHRlbnNpb24uIFRvIGNoYW5nZSBob3cgdGhlIHR5cGUgaXMgZGVyaXZlZCwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYWw8L3NwYW4+IHRhYgotaW4gdGhlIFByb3BlcnRpZXMgdmlldyBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnJlc3RyaWN0aW9uPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5leHRlbnNpb248L3NwYW4+IGZyb20KLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Jbmhlcml0ZWQgQnk8L3NwYW4+IGxpc3QuIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGFkZCBhdHRyaWJ1dGVzIHRvIHlvdXIgY29tcGxleCB0eXBlLCBpbiB0aGUgRGVzaWduIHZpZXcsCi1yaWdodC1jbGljayB5b3VyIGNvbXBsZXggdHlwZSBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBBdHRyaWJ1dGU8L3NwYW4+LiA8L3NwYW4+Ci0gQW4gYXR0cmlidXRlIGFzc29jaWF0ZXMgYW4gYXR0cmlidXRlIG5hbWUgd2l0aCBhIHNwZWNpZmljIHR5cGUKLWFuZCB2YWx1ZS4gCi08b2wgdHlwZT0iYSI+Ci08bGk+PHNwYW4+VG8gc2V0IHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIGluIHRoZSBEZXNpZ24gdmlldywKLWRvdWJsZS1jbGljayB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGFuZCB0eXBlIHRoZSBuYW1lLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5UbyBzZXQgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSwgaW4gdGhlIERlc2lnbiB2aWV3LAotZG91YmxlLWNsaWNrIHRoZSBhdHRyaWJ1dGUgdHlwZSBhbmQgdGhlbiBzZWxlY3QgdGhlIG5ldyB0eXBlIGZyb20KLXRoZSBsaXN0Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi0gRm9yIGluZm9ybWF0aW9uIGFib3V0IGFkZGluZyBhdHRyaWJ1dGVzLCBhdHRyaWJ1dGUgcmVmZXJlbmNlcywKLWFuZCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPmFueTwva2JkPiBhdHRyaWJ1dGVzLCBzZWUgPGEgaHJlZj0idGFkZGFncnAuaHRtbCI+QWRkaW5nIGF0dHJpYnV0ZSBncm91cHM8L2E+LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBmdXJ0aGVyIGRlZmluZSB5b3VyIGNvbXBsZXggdHlwZSBpbiB0aGUgUHJvcGVydGllcwotdmlldzo8L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYKLXlvdSB3YW50IHRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29tcGxleCB0eXBlLiA8L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UgaXMgdXNlZCBmb3IgaHVtYW4KLXJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdQotd2FudCB0byBhZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZgotc2NoZW1hIGNvbXBvbmVudHMuIDwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UKLWFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRjbW9kLmh0bWwiIHRpdGxlPSJBIGNvbnRlbnQgbW9kZWwgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZCBpbnNpZGUgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAuIEl0IGlzIGEgZm9ybWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHBlcm1pc3NpYmxlIGNvbnRlbnQgb2YgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAsIHdoaWNoIG1heSBiZSB1c2VkIHRvIHZhbGlkYXRlIGEgZG9jdW1lbnQgaW5zdGFuY2UuIj5BZGRpbmcgY29udGVudCBtb2RlbHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZWxtLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG0uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxOWJmNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG0uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA4LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGFkZGVsbSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGVsZW1lbnRzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgZWxlbWVudHM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+RWxlbWVudHMgYXJlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBpbiBYTUwuIEVsZW1lbnQNCi1kZWNsYXJhdGlvbnMgcHJvdmlkZSB2YWx1ZSBjb25zdHJhaW50cywgcHJvdmlkZSBhIGRlc2NyaXB0aW9uIHRoYXQNCi1jYW4gYmUgdXNlZCBmb3IgdmFsaWRhdGlvbiwgZXN0YWJsaXNoIGNvbnN0cmFpbmluZyByZWxhdGlvbnNoaXBzIGJldHdlZW4NCi1yZWxhdGVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLCBhbmQgY29udHJvbCB0aGUgc3Vic3RpdHV0aW9uIG9mIGVsZW1lbnRzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5lbGVtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+ZWxlbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlDQotcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5Ubw0KLWFkZCBhbiBlbGVtZW50LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+VG8gYWRkIGFuIGVsZW1lbnQsIGluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlDQotY29udGVudCBtb2RlbCAoc2VxdWVuY2UsIGNob2ljZSwgb3IgYWxsIGVsZW1lbnQpIHlvdSB3YW50IHRvIHdvcmsNCi13aXRoIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBFbGVtZW50PC91aWNvbnRyb2w+LjwvY21kPjxpbmZvPlRoZQ0KLWVsZW1lbnQgYXBwZWFycyBhdHRhY2hlZCB0byB0aGUgY29udGVudCBtb2RlbCBpbiB0aGUgRGVzaWduIHZpZXcuPC9pbmZvPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldywgc2VsZWN0IHRoZSBlbGVtZW50LCBhbmQgY2xpY2sgdGhlDQotY3VycmVudCAoZGVmYXVsdCkgbmFtZSBvZiB0aGUgZWxlbWVudCwgd2hpY2ggcHV0cyB5b3UgaW4gZGlyZWN0IGVkaXRpbmcNCi1tb2RlLCB0aGVuIHR5cGUgdGhlIG5ldyA8dWljb250cm9sPk5hbWU8L3VpY29udHJvbD4gYW5kIHByZXNzIGVudGVyLjwvY21kPg0KLTwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldywgY2xpY2sgdGhlIGN1cnJlbnQgKGRlZmF1bHQpIGVsZW1lbnQNCi10eXBlIGFuZCBzZWxlY3QgYSB0eXBlIGZyb20gdGhlIG1lbnUuIEFsdGVybmF0ZWx5LCB5b3UgY2FuIHNlbGVjdA0KLWJyb3dzZSB0byBpbnZva2UgdGhlIFNldCBUeXBlIGRpYWxvZyBmb3IgbW9yZSBvcHRpb25zLjwvY21kPjxpbmZvPlRoZQ0KLVNldCBUeXBlIGRpYWxvZyBsaXN0cyBhbGwgYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBjdXJyZW50bHkNCi1hdmFpbGFibGUuIFlvdSBjYW4gY2hhbmdlIHRoZSA8dWljb250cm9sPlNjb3BlPC91aWNvbnRyb2w+IG9mIHRoZQ0KLWxpc3QgYnkgc2VsZWN0aW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PHVsPg0KLTxsaT48dWljb250cm9sPldvcmtzcGFjZTwvdWljb250cm9sPjogbGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUNCi1pbiB5b3VyIHdvcmtzcGFjZS48L2xpPg0KLTxsaT48dWljb250cm9sPkVuY2xvc2luZyBQcm9qZWN0PC91aWNvbnRyb2w+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzDQotYXZhaWxhYmxlIGluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLjwvbGk+DQotPGxpPihEZWZhdWx0KSA8dWljb250cm9sPkN1cnJlbnQgUmVzb3VyY2U8L3VpY29udHJvbD46IGxpc3QgYWxsIG9mDQotdGhlIHR5cGVzIGF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPg0KLTxsaT48dWljb250cm9sPldvcmtpbmcgU2V0czwvdWljb250cm9sPjogbGlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZQ0KLXdpdGhpbiB0aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4NCi08L3VsPjwvaW5mbz48L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD4oT3B0aW9uYWwpIEluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUNCi12YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5NaW5pbXVtIE9jY3VycmVuY2U8L3VpY29udHJvbD4gZmllbGQuIDwvY21kPg0KLTxpbmZvPlRoaXMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZWxlbWVudCBjYW4gYXBwZWFyIGluIGFuIGluc3RhbmNlDQotZG9jdW1lbnQuIElmIHlvdSB3YW50IHRoZSBlbGVtZW50IHRvIGJlIG9wdGlvbmFsLCBzZWxlY3QgPHVpY29udHJvbD4wPC91aWNvbnRyb2w+Lg0KLU90aGVyd2lzZSwgc2VsZWN0IDx1aWNvbnRyb2w+MTwvdWljb250cm9sPi4gPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPihPcHRpb25hbCkgU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5NYXhpbXVtDQotT2NjdXJyZW5jZTwvdWljb250cm9sPiBmaWVsZC4gPC9jbWQ+PGluZm8+VGhpcyBpcyB0aGUgbWF4aW11bSBudW1iZXINCi1vZiB0aW1lcyB0aGUgZWxlbWVudCBjYW4gYXBwZWFyIGluIGFuIGluc3RhbmNlIGRvY3VtZW50LiBTZWxlY3QgPHVpY29udHJvbD51bmJvdW5kZWQ8L3VpY29udHJvbD4gdG8NCi1pbmRpY2F0ZSB0aGVyZSBpcyBubyBtYXhpbXVtIG51bWJlciBvZiBvY2N1cnJlbmNlcy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91DQotd2FudCB0byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVsZW1lbnQuIDwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdQ0KLXdhbnQgdG8gYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2YNCi1zY2hlbWEgY29tcG9uZW50cy4gPD9QdWIgQ2FyZXQ/PjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZQ0KLWFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+WW91IGNhbiBhZGQgYSBjb250ZW50IG1vZGVsIHRvIGFuIGVsZW1lbnQsIHdoaWNoIGlzIHRoZSByZXByZXNlbnRhdGlvbg0KLW9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZCBpbnNpZGUgdGhlIGVsZW1lbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uDQotYWJvdXQgd29ya2luZyB3aXRoIGNvbnRlbnQgbW9kZWxzLCByZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrcy48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDM4OTM/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZWxtLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMTVmMzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZWxtLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGVsZW1lbnRzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkVsZW1lbnRzIGFyZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgaW4gWE1MLiBFbGVtZW50IGRlY2xhcmF0aW9ucyBwcm92aWRlIHZhbHVlIGNvbnN0cmFpbnRzLCBwcm92aWRlIGEgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgdmFsaWRhdGlvbiwgZXN0YWJsaXNoIGNvbnN0cmFpbmluZyByZWxhdGlvbnNoaXBzIGJldHdlZW4gcmVsYXRlZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcywgYW5kIGNvbnRyb2wgdGhlIHN1YnN0aXR1dGlvbiBvZiBlbGVtZW50cy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iRWxlbWVudHMgYXJlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBpbiBYTUwuIEVsZW1lbnQgZGVjbGFyYXRpb25zIHByb3ZpZGUgdmFsdWUgY29uc3RyYWludHMsIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciB2YWxpZGF0aW9uLCBlc3RhYmxpc2ggY29uc3RyYWluaW5nIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiByZWxhdGVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLCBhbmQgY29udHJvbCB0aGUgc3Vic3RpdHV0aW9uIG9mIGVsZW1lbnRzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkY21vZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGVsbXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRhbnllLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZ2xiYS5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRlbG0iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgZWxlbWVudHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRlbG0iPjxhIG5hbWU9InRhZGRlbG0iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBlbGVtZW50czwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+RWxlbWVudHMgYXJlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBpbiBYTUwuIEVsZW1lbnQKLWRlY2xhcmF0aW9ucyBwcm92aWRlIHZhbHVlIGNvbnN0cmFpbnRzLCBwcm92aWRlIGEgZGVzY3JpcHRpb24gdGhhdAotY2FuIGJlIHVzZWQgZm9yIHZhbGlkYXRpb24sIGVzdGFibGlzaCBjb25zdHJhaW5pbmcgcmVsYXRpb25zaGlwcyBiZXR3ZWVuCi1yZWxhdGVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLCBhbmQgY29udHJvbCB0aGUgc3Vic3RpdHV0aW9uIG9mIGVsZW1lbnRzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UKLXBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbwotYWRkIGFuIGVsZW1lbnQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gYWRkIGFuIGVsZW1lbnQsIGluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlCi1jb250ZW50IG1vZGVsIChzZXF1ZW5jZSwgY2hvaWNlLCBvciBhbGwgZWxlbWVudCkgeW91IHdhbnQgdG8gd29yawotd2l0aCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEVsZW1lbnQ8L3NwYW4+Ljwvc3Bhbj4gVGhlCi1lbGVtZW50IGFwcGVhcnMgYXR0YWNoZWQgdG8gdGhlIGNvbnRlbnQgbW9kZWwgaW4gdGhlIERlc2lnbiB2aWV3LgotPG9sIHR5cGU9ImEiPgotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcsIHNlbGVjdCB0aGUgZWxlbWVudCwgYW5kIGNsaWNrIHRoZQotY3VycmVudCAoZGVmYXVsdCkgbmFtZSBvZiB0aGUgZWxlbWVudCwgd2hpY2ggcHV0cyB5b3UgaW4gZGlyZWN0IGVkaXRpbmcKLW1vZGUsIHRoZW4gdHlwZSB0aGUgbmV3IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+IGFuZCBwcmVzcyBlbnRlci48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgY2xpY2sgdGhlIGN1cnJlbnQgKGRlZmF1bHQpIGVsZW1lbnQKLXR5cGUgYW5kIHNlbGVjdCBhIHR5cGUgZnJvbSB0aGUgbWVudS4gQWx0ZXJuYXRlbHksIHlvdSBjYW4gc2VsZWN0Ci1icm93c2UgdG8gaW52b2tlIHRoZSBTZXQgVHlwZSBkaWFsb2cgZm9yIG1vcmUgb3B0aW9ucy48L3NwYW4+IFRoZQotU2V0IFR5cGUgZGlhbG9nIGxpc3RzIGFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGN1cnJlbnRseQotYXZhaWxhYmxlLiBZb3UgY2FuIGNoYW5nZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NvcGU8L3NwYW4+IG9mIHRoZQotbGlzdCBieSBzZWxlY3Rpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya3NwYWNlPC9zcGFuPjogbGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUKLWluIHlvdXIgd29ya3NwYWNlLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5FbmNsb3NpbmcgUHJvamVjdDwvc3Bhbj46IGxpc3RzIGFsbCBvZiB0aGUgdHlwZXMKLWF2YWlsYWJsZSBpbiB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHlvdXIgZmlsZS48L2xpPgotCi08bGk+KERlZmF1bHQpIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN1cnJlbnQgUmVzb3VyY2U8L3NwYW4+OiBsaXN0IGFsbCBvZgotdGhlIHR5cGVzIGF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2luZyBTZXRzPC9zcGFuPjogbGlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZQotd2l0aGluIHRoZSBzZWxlY3RlZCB3b3JraW5nIHNldC48L2xpPgotCi08L3VsPgotPC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4oT3B0aW9uYWwpIEluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUKLXZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NaW5pbXVtIE9jY3VycmVuY2U8L3NwYW4+IGZpZWxkLiA8L3NwYW4+Ci0gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBlbGVtZW50IGNhbiBhcHBlYXIgaW4gYW4gaW5zdGFuY2UKLWRvY3VtZW50LiBJZiB5b3Ugd2FudCB0aGUgZWxlbWVudCB0byBiZSBvcHRpb25hbCwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjA8L3NwYW4+LgotT3RoZXJ3aXNlLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MTwvc3Bhbj4uIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+KE9wdGlvbmFsKSBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXhpbXVtCi1PY2N1cnJlbmNlPC9zcGFuPiBmaWVsZC4gPC9zcGFuPiBUaGlzIGlzIHRoZSBtYXhpbXVtIG51bWJlcgotb2YgdGltZXMgdGhlIGVsZW1lbnQgY2FuIGFwcGVhciBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudC4gU2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnVuYm91bmRlZDwvc3Bhbj4gdG8KLWluZGljYXRlIHRoZXJlIGlzIG5vIG1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3UKLXdhbnQgdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlbGVtZW50LiA8L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdQotd2FudCB0byBhZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZgotc2NoZW1hIGNvbXBvbmVudHMuIDwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UKLWFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBjYW4gYWRkIGEgY29udGVudCBtb2RlbCB0byBhbiBlbGVtZW50LCB3aGljaCBpcyB0aGUgcmVwcmVzZW50YXRpb24KLW9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZCBpbnNpZGUgdGhlIGVsZW1lbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uCi1hYm91dCB3b3JraW5nIHdpdGggY29udGVudCBtb2RlbHMsIHJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2tzLjwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkY21vZC5odG1sIiB0aXRsZT0iQSBjb250ZW50IG1vZGVsIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLiBJdCBpcyBhIGZvcm1hbCBkZXNjcmlwdGlvbiBvZiB0aGUgc3RydWN0dXJlIGFuZCBwZXJtaXNzaWJsZSBjb250ZW50IG9mIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLCB3aGljaCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZSBhIGRvY3VtZW50IGluc3RhbmNlLiI+QWRkaW5nIGNvbnRlbnQgbW9kZWxzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGVsbXIuaHRtbCIgdGl0bGU9IkFuIGVsZW1lbnQgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGVsZW1lbnQuIEEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGVsZW1lbnQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBnbG9iYWwgZWxlbWVudCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4iPkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkYW55ZS5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIGFueSBlbGVtZW50IGluIGEgc2ltaWxhciB3YXkgYXMgYSBEVEQncyBBTlkgY29udGVudCBtb2RlbCwgaG93ZXZlciwgaXQgbXVzdCBiZSBkb25lIGluIGNvbmp1bmN0aW9uIHdpdGggbmFtZXNwYWNlcy4gVGhpcyBlbmFibGVzIHlvdSB0byBpbmNsdWRlIGFueSB3ZWxsLWZvcm1lZCBYTUwgY29udGVudCwgc3VjaCBhcyBhbiBIVE1MIFdlYiBwYWdlIHRoYXQgY29uZm9ybXMgdG8gWEhUTUwgMS4wIHN5bnRheC4iPkFkZGluZyBhbiBhbnkgZWxlbWVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRnbGJhLmh0bWwiIHRpdGxlPSJBIGdsb2JhbCBhdHRyaWJ1dGUgaXMgYW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHJlY29nbml6ZWQgYW55d2hlcmUgaW4gYSBkb2N1bWVudC4gT25jZSBkZWNsYXJlZCwgYSBnbG9iYWwgYXR0cmlidXRlIGNhbiBiZSByZWZlcmVuY2VkIGluIG9uZSBvciBtb3JlIGRlY2xhcmF0aW9ucyB1c2luZyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlLiI+QWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbXIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbXIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjNjZkMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG1yLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZGVsbXIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QW4gZWxlbWVudCByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBnbG9iYWwgZWxlbWVudC4NCi1BIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdsb2JhbCBlbGVtZW50IGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ2xvYmFsDQotZWxlbWVudCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZw0KLWRlY2xhcmF0aW9uLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5lbGVtZW50IHJlZmVyZW5jZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmVsZW1lbnQgcmVmZXJlbmNlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhbiBlbGVtZW50DQotcmVmZXJlbmNlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgY29udGVudCBtb2RlbCAoc2VxdWVuY2UsIGNob2ljZSwNCi1vciBhbGwgZWxlbWVudCkgeW91IHdhbnQgdG8gd29yayB3aXRoIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBFbGVtZW50IFJlZjwvdWljb250cm9sPi48L2NtZD4NCi08c3RlcHJlc3VsdD5JZiBubyBnbG9iYWwgZWxlbWVudCBpcyBkZWZpbmVkIGluIHRoZSBkb2N1bWVudCwgYSBuZXcgZ2xvYmFsDQotZWxlbWVudCBpcyBjcmVhdGVkIGZvciB5b3UsIGFuZCB0aGUgZWxlbWVudCByZWZlcmVuY2Ugd2lsbCBwb2ludCB0byBpdC48L3N0ZXByZXN1bHQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBlbGVtZW50IHJlZmVyZW5jZS4gVG8gc3BlY2lmeSB2YWx1ZXMgZm9yIGFuIGVsZW1lbnQNCi1yZWZlcmVuY2U6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT5DbGljayB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UgaW4gdGhlIERlc2lnbiB2aWV3LiBFbnRlcg0KLXRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZS48L2Nob2ljZT4NCi08Y2hvaWNlPkNsaWNrIHRoZSBlbGVtZW50IHJlZmVyZW5jZSB0eXBlIGluIHRoZSBEZXNpZ24gdmlldy4gU2VsZWN0IGEgdHlwZQ0KLWZyb20gdGhlIG1lbnUsIG9yIHNlbGVjdCA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiBmb3IgbW9yZSBvcHRpb25zLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD4oT3B0aW9uYWwpIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+TWluaW11bQ0KLU9jY3VycmVuY2U8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+PGluZm8+VGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBnbG9iYWwNCi1lbGVtZW50IHJlZmVyZW5jZWQgY2FuIGFwcGVhciBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudC4gSWYgeW91IHdhbnQgdGhlIGVsZW1lbnQNCi10byBiZSBvcHRpb25hbCwgc2VsZWN0IDx1aWNvbnRyb2w+MDwvdWljb250cm9sPi4gT3RoZXJ3aXNlLCBzZWxlY3QgPHVpY29udHJvbD4xPC91aWNvbnRyb2w+LiA8L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+KE9wdGlvbmFsKSBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSA8dWljb250cm9sPk1heGltdW0NCi1PY2N1cnJlbmNlPD9QdWIgQ2FyZXQ/PjwvdWljb250cm9sPiBmaWVsZC48L2NtZD48aW5mbz5UaGlzIGlzIHRoZSBtYXhpbXVtDQotbnVtYmVyIG9mIHRpbWVzIHRoZSBnbG9iYWwgZWxlbWVudCByZWZlcmVuY2VkIGNhbiBhcHBlYXIuIFlvdSBjYW4gc2VsZWN0IDx1aWNvbnRyb2w+dW5ib3VuZGVkPC91aWNvbnRyb2w+IHRvDQotaW5kaWNhdGUgdGhlcmUgaXMgbm8gbWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlbGVtZW50IHJlZmVyZW5jZS48L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudCB0bw0KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvY21kPg0KLTxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlDQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDMwMzk/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg1ZWMzOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG1yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkFuIGVsZW1lbnQgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGVsZW1lbnQuIEEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGVsZW1lbnQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBnbG9iYWwgZWxlbWVudCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQW4gZWxlbWVudCByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBnbG9iYWwgZWxlbWVudC4gQSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBnbG9iYWwgZWxlbWVudCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdsb2JhbCBlbGVtZW50IHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBlbGVtZW50IHJlZmVyZW5jZXMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgZWxlbWVudCByZWZlcmVuY2VzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRnbGVtLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZWxtLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkYW55ZS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGdsYmEuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkZWxtciIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRlbG1yIj48YSBuYW1lPSJ0YWRkZWxtciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QW4gZWxlbWVudCByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBnbG9iYWwgZWxlbWVudC4KLUEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGVsZW1lbnQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBnbG9iYWwKLWVsZW1lbnQgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcKLWRlY2xhcmF0aW9uLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYW4gZWxlbWVudAotcmVmZXJlbmNlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlIGNvbnRlbnQgbW9kZWwgKHNlcXVlbmNlLCBjaG9pY2UsCi1vciBhbGwgZWxlbWVudCkgeW91IHdhbnQgdG8gd29yayB3aXRoIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgRWxlbWVudCBSZWY8L3NwYW4+Ljwvc3Bhbj4KLSBJZiBubyBnbG9iYWwgZWxlbWVudCBpcyBkZWZpbmVkIGluIHRoZSBkb2N1bWVudCwgYSBuZXcgZ2xvYmFsCi1lbGVtZW50IGlzIGNyZWF0ZWQgZm9yIHlvdSwgYW5kIHRoZSBlbGVtZW50IHJlZmVyZW5jZSB3aWxsIHBvaW50IHRvIGl0LgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLiBUbyBzcGVjaWZ5IHZhbHVlcyBmb3IgYW4gZWxlbWVudAotcmVmZXJlbmNlOjwvc3Bhbj4KLTx1bD4KLTxsaT5DbGljayB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UgaW4gdGhlIERlc2lnbiB2aWV3LiBFbnRlcgotdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLjwvbGk+Ci0KLTxsaT5DbGljayB0aGUgZWxlbWVudCByZWZlcmVuY2UgdHlwZSBpbiB0aGUgRGVzaWduIHZpZXcuIFNlbGVjdCBhIHR5cGUKLWZyb20gdGhlIG1lbnUsIG9yIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IGZvciBtb3JlIG9wdGlvbnMuPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4oT3B0aW9uYWwpIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1pbmltdW0KLU9jY3VycmVuY2U8L3NwYW4+IGZpZWxkLjwvc3Bhbj4gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBnbG9iYWwKLWVsZW1lbnQgcmVmZXJlbmNlZCBjYW4gYXBwZWFyIGluIGFuIGluc3RhbmNlIGRvY3VtZW50LiBJZiB5b3Ugd2FudCB0aGUgZWxlbWVudAotdG8gYmUgb3B0aW9uYWwsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj4wPC9zcGFuPi4gT3RoZXJ3aXNlLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MTwvc3Bhbj4uIAotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4oT3B0aW9uYWwpIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1heGltdW0KLU9jY3VycmVuY2U8L3NwYW4+IGZpZWxkLjwvc3Bhbj4gVGhpcyBpcyB0aGUgbWF4aW11bQotbnVtYmVyIG9mIHRpbWVzIHRoZSBnbG9iYWwgZWxlbWVudCByZWZlcmVuY2VkIGNhbiBhcHBlYXIuIFlvdSBjYW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnVuYm91bmRlZDwvc3Bhbj4gdG8KLWluZGljYXRlIHRoZXJlIGlzIG5vIG1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlbGVtZW50IHJlZmVyZW5jZS48L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3Ugd2FudCB0bwotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUKLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGdsZW0uaHRtbCIgdGl0bGU9IkEgZ2xvYmFsIGVsZW1lbnQgaXMgYW4gZWxlbWVudCB3aXRoIGEgZ2xvYmFsIHNjb3BlLiBJdCBpcyBvbmUgdGhhdCBoYXMgYmVlbiBkZWNsYXJlZCBhcyBwYXJ0IG9mIHRoZSBtYWluIHNjaGVtYSByYXRoZXIgdGhhbiBhcyBwYXJ0IG9mIGEgY29udGVudCBtb2RlbC4iPkFkZGluZyBnbG9iYWwgZWxlbWVudHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkZWxtLmh0bWwiIHRpdGxlPSJFbGVtZW50cyBhcmUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIGluIFhNTC4gRWxlbWVudCBkZWNsYXJhdGlvbnMgcHJvdmlkZSB2YWx1ZSBjb25zdHJhaW50cywgcHJvdmlkZSBhIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHZhbGlkYXRpb24sIGVzdGFibGlzaCBjb25zdHJhaW5pbmcgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHJlbGF0ZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMsIGFuZCBjb250cm9sIHRoZSBzdWJzdGl0dXRpb24gb2YgZWxlbWVudHMuIj5BZGRpbmcgZWxlbWVudHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkYW55ZS5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIGFueSBlbGVtZW50IGluIGEgc2ltaWxhciB3YXkgYXMgYSBEVEQncyBBTlkgY29udGVudCBtb2RlbCwgaG93ZXZlciwgaXQgbXVzdCBiZSBkb25lIGluIGNvbmp1bmN0aW9uIHdpdGggbmFtZXNwYWNlcy4gVGhpcyBlbmFibGVzIHlvdSB0byBpbmNsdWRlIGFueSB3ZWxsLWZvcm1lZCBYTUwgY29udGVudCwgc3VjaCBhcyBhbiBIVE1MIFdlYiBwYWdlIHRoYXQgY29uZm9ybXMgdG8gWEhUTUwgMS4wIHN5bnRheC4iPkFkZGluZyBhbiBhbnkgZWxlbWVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRnbGJhLmh0bWwiIHRpdGxlPSJBIGdsb2JhbCBhdHRyaWJ1dGUgaXMgYW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHJlY29nbml6ZWQgYW55d2hlcmUgaW4gYSBkb2N1bWVudC4gT25jZSBkZWNsYXJlZCwgYSBnbG9iYWwgYXR0cmlidXRlIGNhbiBiZSByZWZlcmVuY2VkIGluIG9uZSBvciBtb3JlIGRlY2xhcmF0aW9ucyB1c2luZyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlLiI+QWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsYmEuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsYmEuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhZDA3Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGJhLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZGdsYmEiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBnbG9iYWwgYXR0cmlidXRlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkEgZ2xvYmFsIGF0dHJpYnV0ZSBpcyBhbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgcmVjb2duaXplZCBhbnl3aGVyZQ0KLWluIGEgZG9jdW1lbnQuIE9uY2UgZGVjbGFyZWQsIGEgZ2xvYmFsIGF0dHJpYnV0ZSBjYW4gYmUgcmVmZXJlbmNlZCBpbiBvbmUNCi1vciBtb3JlIGRlY2xhcmF0aW9ucyB1c2luZyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5nbG9iYWwgYXR0cmlidXRlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+Z2xvYmFsIGF0dHJpYnV0ZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBhZGQgYSBnbG9iYWwNCi1hdHRyaWJ1dGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayBpbiB0aGUgPGI+QXR0cmlidXRlczwvYj4gc2VjdGlvbg0KLWFuZCBjbGljayA8dWljb250cm9sPkFkZCBBdHRyaWJ1dGU8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgZW50ZXIgYSBuYW1lIGZvciB0aGUgYXR0cmlidXRlIGluIHRoZSA8dWljb250cm9sPk5hbWU8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgeW91IGNhbiBzZWxlY3QgdGhlIGF0dHJpYnV0ZSA8dWljb250cm9sPlR5cGU8L3VpY29udHJvbD4gZnJvbQ0KLXRoZSBwcmVkZWZpbmVkIGxpc3QgaW4gdGhlIG1lbnUgbmV4dCB0byB0aGUgPHVpY29udHJvbD5UeXBlPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTxpbmZvPjxwPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gc2VsZWN0IDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IGZyb20NCi10aGUgbGlzdCBmb3IgbW9yZSBvcHRpb25zLiA8L3A+PHA+VGhlIFNldCBUeXBlIGRpYWxvZyB3aWxsIGFwcGVhciwgYW5kIGxpc3RzDQotYWxsIGJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgY3VycmVudGx5IGF2YWlsYWJsZS4gWW91IGNhbiBjaGFuZ2UgdGhlIDx1aWNvbnRyb2w+U2NvcGU8L3VpY29udHJvbD4gb2YNCi10aGUgbGlzdCBieSBzZWxlY3Rpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8dWw+DQotPGxpPjx1aWNvbnRyb2w+V29ya3NwYWNlPC91aWNvbnRyb2w+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZSBpbg0KLXlvdXIgd29ya3NwYWNlLiA8L2xpPg0KLTxsaT48dWljb250cm9sPkVuY2xvc2luZyBQcm9qZWN0PC91aWNvbnRyb2w+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQ0KLWluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPg0KLTxsaT4oRGVmYXVsdCkgPHVpY29udHJvbD5DdXJyZW50IFJlc291cmNlPC91aWNvbnRyb2w+OiBsaXN0IGFsbCBvZiB0aGUgdHlwZXMNCi1hdmFpbGFibGUgaW4geW91ciBjdXJyZW50IGZpbGUuPC9saT4NCi08bGk+PHVpY29udHJvbD5Xb3JraW5nIFNldHM8L3VpY29udHJvbD46IGw8P1B1YiBDYXJldD8+aXN0IGFsbCB0aGUgdHlwZXMgYXZhaWxhYmxlDQotd2l0aGluIHRoZSBzZWxlY3RlZCB3b3JraW5nIHNldC48L2xpPg0KLTwvdWw+PC9wPjxwPlNlbGVjdCB0aGUgdHlwZSB5b3Ugd2FudCBpbiB0aGUgdHlwZSBsaXN0LCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uIDwvcD48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGdsb2JhbCBhdHRyaWJ1dGUuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyOTgzPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGJhLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGJhLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YjE0NWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xiYS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkEgZ2xvYmFsIGF0dHJpYnV0ZSBpcyBhbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgcmVjb2duaXplZCBhbnl3aGVyZSBpbiBhIGRvY3VtZW50LiBPbmNlIGRlY2xhcmVkLCBhIGdsb2JhbCBhdHRyaWJ1dGUgY2FuIGJlIHJlZmVyZW5jZWQgaW4gb25lIG9yIG1vcmUgZGVjbGFyYXRpb25zIHVzaW5nIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgZ2xvYmFsIGF0dHJpYnV0ZSBpcyBhbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgcmVjb2duaXplZCBhbnl3aGVyZSBpbiBhIGRvY3VtZW50LiBPbmNlIGRlY2xhcmVkLCBhIGdsb2JhbCBhdHRyaWJ1dGUgY2FuIGJlIHJlZmVyZW5jZWQgaW4gb25lIG9yIG1vcmUgZGVjbGFyYXRpb25zIHVzaW5nIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGdsb2JhbCBhdHRyaWJ1dGVzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGdsb2JhbCBhdHRyaWJ1dGVzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkZ2xiYSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBnbG9iYWwgYXR0cmlidXRlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZGdsYmEiPjxhIG5hbWU9InRhZGRnbGJhIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkEgZ2xvYmFsIGF0dHJpYnV0ZSBpcyBhbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgcmVjb2duaXplZCBhbnl3aGVyZQotaW4gYSBkb2N1bWVudC4gT25jZSBkZWNsYXJlZCwgYSBnbG9iYWwgYXR0cmlidXRlIGNhbiBiZSByZWZlcmVuY2VkIGluIG9uZQotb3IgbW9yZSBkZWNsYXJhdGlvbnMgdXNpbmcgYW4gYXR0cmlidXRlIHJlZmVyZW5jZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGEgZ2xvYmFsCi1hdHRyaWJ1dGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgaW4gdGhlIDxzdHJvbmc+QXR0cmlidXRlczwvc3Ryb25nPiBzZWN0aW9uCi1hbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEF0dHJpYnV0ZTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgZW50ZXIgYSBuYW1lIGZvciB0aGUgYXR0cmlidXRlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHlvdSBjYW4gc2VsZWN0IHRoZSBhdHRyaWJ1dGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VHlwZTwvc3Bhbj4gZnJvbQotdGhlIHByZWRlZmluZWQgbGlzdCBpbiB0aGUgbWVudSBuZXh0IHRvIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UeXBlPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci0gPHA+QWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiBmcm9tCi10aGUgbGlzdCBmb3IgbW9yZSBvcHRpb25zLiA8L3A+Ci08ZGl2IGNsYXNzPSJwIj5UaGUgU2V0IFR5cGUgZGlhbG9nIHdpbGwgYXBwZWFyLCBhbmQgbGlzdHMKLWFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGN1cnJlbnRseSBhdmFpbGFibGUuIFlvdSBjYW4gY2hhbmdlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TY29wZTwvc3Bhbj4gb2YKLXRoZSBsaXN0IGJ5IHNlbGVjdGluZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOjx1bD4KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3Jrc3BhY2U8L3NwYW4+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZSBpbgoteW91ciB3b3Jrc3BhY2UuIDwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5FbmNsb3NpbmcgUHJvamVjdDwvc3Bhbj46IGxpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlCi1pbiB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHlvdXIgZmlsZS4gPC9saT4KLQotPGxpPihEZWZhdWx0KSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdXJyZW50IFJlc291cmNlPC9zcGFuPjogbGlzdCBhbGwgb2YgdGhlIHR5cGVzCi1hdmFpbGFibGUgaW4geW91ciBjdXJyZW50IGZpbGUuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtpbmcgU2V0czwvc3Bhbj46IGxpc3QgYWxsIHRoZSB0eXBlcyBhdmFpbGFibGUKLXdpdGhpbiB0aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4KLQotPC91bD4KLTwvZGl2PgotPHA+U2VsZWN0IHRoZSB0eXBlIHlvdSB3YW50IGluIHRoZSB0eXBlIGxpc3QsIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+LiA8L3A+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBnbG9iYWwgYXR0cmlidXRlLjwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50IHRvCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xlbS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xlbS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGFiZDAwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsZW0uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkZ2xlbSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGdsb2JhbCBlbGVtZW50czwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGdsb2JhbCBlbGVtZW50czwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BIGdsb2JhbCBlbGVtZW50IGlzIGFuIGVsZW1lbnQgd2l0aCBhIGdsb2JhbCBzY29wZS4gSXQgaXMgb25lIHRoYXQNCi1oYXMgYmVlbiBkZWNsYXJlZCBhcyBwYXJ0IG9mIHRoZSBtYWluIHNjaGVtYSByYXRoZXIgdGhhbiBhcyBwYXJ0IG9mIGEgY29udGVudA0KLW1vZGVsLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5nbG9iYWwgZWxlbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmdsb2JhbCBlbGVtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhIGdsb2JhbA0KLWVsZW1lbnQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgc2VsZWN0IHlvdXIgc2NoZW1hLjwvY21kPjxpbmZvPlRoZSBlbnRpcmUNCi1zY2hlbWEgYW5kIGl0cyBjb250ZW50cyBhcmUgZGlzcGxheWVkIGluIHRoZSBEZXNpZ24gdmlldy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayBpbiB0aGUgPGI+RWxlbWVudHM8L2I+IHNlY3Rpb24NCi1hbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgRWxlbWVudDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+IHRhYiwNCi1hbmQgdHlwZSBhIG5ldyBuYW1lIGZvciB0aGUgZ2xvYmFsIGVsZW1lbnQgaW4gdGhlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCB5b3UgY2FuIHNlbGVjdCB0aGUgYXR0cmlidXRlIHR5cGUgZnJvbQ0KLXRoZSBwcmVkZWZpbmVkIGxpc3QgaW4gdGhlIG1lbnUgbmV4dCB0byB0aGUgPHVpY29udHJvbD5UeXBlPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTxpbmZvPjxwPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gc2VsZWN0IDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IGZyb20NCi10aGUgbGlzdCBmb3IgbW9yZSBvcHRpb25zLiA8L3A+PHA+VGhlIDx1aWNvbnRyb2w+U2V0IFR5cGU8L3VpY29udHJvbD4gZGlhbG9nDQotYm94IGFwcGVhcnMsIGFuZCBsaXN0cyBhbGwgYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBjdXJyZW50bHkgYXZhaWxhYmxlLg0KLVlvdSBjYW4gY2hhbmdlIHRoZSA8dWljb250cm9sPlNjb3BlPC91aWNvbnRyb2w+IG9mIHRoZSBsaXN0IGJ5IHNlbGVjdGluZyBvbmUNCi1vZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PHVsPg0KLTxsaT48dWljb250cm9sPldvcmtzcGFjZTwvdWljb250cm9sPjogbGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUgaW4NCi15b3VyIHdvcmtzcGFjZS4gPC9saT4NCi08bGk+PHVpY29udHJvbD5FbmNsb3NpbmcgUHJvamVjdDwvdWljb250cm9sPjogbGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUNCi1pbiB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHlvdXIgZmlsZS4gPC9saT4NCi08bGk+KERlZmF1bHQpIDx1aWNvbnRyb2w+Q3VycmVudCBSZXNvdXJjZTwvdWljb250cm9sPjogbGlzdCBhbGwgb2YgdGhlIHR5cGVzDQotYXZhaWxhYmxlIGluIHlvdXIgY3VycmVudCBmaWxlLjwvbGk+DQotPGxpPjx1aWNvbnRyb2w+V29ya2luZyBTZXRzPC91aWNvbnRyb2w+OiBsaXN0IGFsbCB0aGUgdHlwZXMgYXZhaWxhYmxlIHdpdGhpbg0KLXRoZSBzZWxlY3RlZCB3b3JraW5nIHNldC48L2xpPg0KLTwvdWw+PC9wPjxwPlNlbGVjdCB0aGUgdHlwZSB5b3Ugd2FudCBpbiB0aGUgdHlwZSBsaXN0LCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uIDwvcD48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+QWR2YW5jZWQ8L3VpY29udHJvbD4gdGFiLjwvY21kPjxpbmZvPkluIHRoaXMNCi1wYWdlLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGZvbGxvd2luZyB2YXJpb3VzIHZhbHVlcyBmb3IgdGhlIGdsb2JhbCBlbGVtZW50OiA8L2luZm8+DQotPGNob2ljZXM+DQotPGNob2ljZT48dWljb250cm9sPkFic3RyYWN0PC91aWNvbnRyb2w+OiBjbGljayA8Yj50cnVlPC9iPiBpZiB5b3Ugd2FudCB0aGUNCi1nbG9iYWwgZWxlbWVudCB0byBiZSBhYnN0cmFjdC4gV2hlbiBhIGdsb2JhbCBlbGVtZW50IGlzIGRlY2xhcmVkIHRvIGJlIGFic3RyYWN0LA0KLWl0IGNhbm5vdCBiZSB1c2VkIGluIGFuIGluc3RhbmNlIGRvY3VtZW50LiBJbnN0ZWFkLCBhIG1lbWJlciBvZiB0aGF0IGdsb2JhbA0KLWVsZW1lbnQncyBzdWJzdGl0dXRpb24gZ3JvdXAgbXVzdCBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50LjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5CbG9jazwvdWljb250cm9sPjogZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnbG9iYWwgZWxlbWVudA0KLW1heSBiZSByZXBsYWNlZCBieSBhbiBlbGVtZW50IGRlcml2ZWQgZnJvbSBpdC48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+RmluYWw8L3VpY29udHJvbD46IGRldGVybWluZXMgd2hldGhlciB0aGlzIGdsb2JhbCBlbGVtZW50DQotbWF5IGJlIGRlcml2ZWQgZnJvbS48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+U3Vic3RpdHV0aW9uIEdyb3VwPC91aWNvbnRyb2w+OiBhIHN1YnN0aXR1dGlvbiBncm91cCBhbGxvd3MNCi1lbGVtZW50cyB0byBiZSBzdWJzdGl0dXRlZCBmb3Igb3RoZXIgZWxlbWVudHMuPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPk5pbGxhYmxlPC91aWNvbnRyb2w+OiBzZWxlY3QgPGI+dHJ1ZTwvYj4gaWYgeW91IGRvIG5vdA0KLXdhbnQgdGhlIGdsb2JhbCBlbGVtZW50IHRvIGJlIGFibGUgdG8gaGF2ZSBhbnkgY2hpbGQgZWxlbWVudHMsIG9ubHkgYXR0cmlidXRlcy4gPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIHRvIHByb3ZpZGUgYW55DQotaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBnbG9iYWwgZWxlbWVudC48L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiB0byBhZGQgYXBwbGljYXRpb24NCi1pbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZQ0KLWFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+DQotPC9zdGVwPjw/UHViIENhcmV0Pz4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPllvdSBjYW4gYWRkIGEgY29udGVudCBtb2RlbCB0byBhIGdsb2JhbCBlbGVtZW50LCB3aGljaCBpcyB0aGUgcmVwcmVzZW50YXRpb24NCi1vZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIHRoZSBnbG9iYWwgZWxlbWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24NCi1hYm91dCB3b3JraW5nIHdpdGggY29udGVudCBtb2RlbHMsIHJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2tzLjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNDM4Mz8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xlbS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xlbS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmExZGYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsZW0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgZ2xvYmFsIGVsZW1lbnRzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkEgZ2xvYmFsIGVsZW1lbnQgaXMgYW4gZWxlbWVudCB3aXRoIGEgZ2xvYmFsIHNjb3BlLiBJdCBpcyBvbmUgdGhhdCBoYXMgYmVlbiBkZWNsYXJlZCBhcyBwYXJ0IG9mIHRoZSBtYWluIHNjaGVtYSByYXRoZXIgdGhhbiBhcyBwYXJ0IG9mIGEgY29udGVudCBtb2RlbC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBnbG9iYWwgZWxlbWVudCBpcyBhbiBlbGVtZW50IHdpdGggYSBnbG9iYWwgc2NvcGUuIEl0IGlzIG9uZSB0aGF0IGhhcyBiZWVuIGRlY2xhcmVkIGFzIHBhcnQgb2YgdGhlIG1haW4gc2NoZW1hIHJhdGhlciB0aGFuIGFzIHBhcnQgb2YgYSBjb250ZW50IG1vZGVsLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBnbG9iYWwgZWxlbWVudHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgZ2xvYmFsIGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRjbW9kLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZWxtci5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRnbGVtIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGdsb2JhbCBlbGVtZW50czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZGdsZW0iPjxhIG5hbWU9InRhZGRnbGVtIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgZ2xvYmFsIGVsZW1lbnRzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BIGdsb2JhbCBlbGVtZW50IGlzIGFuIGVsZW1lbnQgd2l0aCBhIGdsb2JhbCBzY29wZS4gSXQgaXMgb25lIHRoYXQKLWhhcyBiZWVuIGRlY2xhcmVkIGFzIHBhcnQgb2YgdGhlIG1haW4gc2NoZW1hIHJhdGhlciB0aGFuIGFzIHBhcnQgb2YgYSBjb250ZW50Ci1tb2RlbC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGEgZ2xvYmFsCi1lbGVtZW50LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCBzZWxlY3QgeW91ciBzY2hlbWEuPC9zcGFuPiBUaGUgZW50aXJlCi1zY2hlbWEgYW5kIGl0cyBjb250ZW50cyBhcmUgZGlzcGxheWVkIGluIHRoZSBEZXNpZ24gdmlldy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgaW4gdGhlIDxzdHJvbmc+RWxlbWVudHM8L3N0cm9uZz4gc2VjdGlvbgotYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBFbGVtZW50PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gdGFiLAotYW5kIHR5cGUgYSBuZXcgbmFtZSBmb3IgdGhlIGdsb2JhbCBlbGVtZW50IGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHlvdSBjYW4gc2VsZWN0IHRoZSBhdHRyaWJ1dGUgdHlwZSBmcm9tCi10aGUgcHJlZGVmaW5lZCBsaXN0IGluIHRoZSBtZW51IG5leHQgdG8gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlR5cGU8L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLSA8cD5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IGZyb20KLXRoZSBsaXN0IGZvciBtb3JlIG9wdGlvbnMuIDwvcD4KLTxkaXYgY2xhc3M9InAiPlRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TZXQgVHlwZTwvc3Bhbj4gZGlhbG9nCi1ib3ggYXBwZWFycywgYW5kIGxpc3RzIGFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGN1cnJlbnRseSBhdmFpbGFibGUuCi1Zb3UgY2FuIGNoYW5nZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NvcGU8L3NwYW4+IG9mIHRoZSBsaXN0IGJ5IHNlbGVjdGluZyBvbmUKLW9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya3NwYWNlPC9zcGFuPjogbGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUgaW4KLXlvdXIgd29ya3NwYWNlLiA8L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RW5jbG9zaW5nIFByb2plY3Q8L3NwYW4+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQotaW4gdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB5b3VyIGZpbGUuIDwvbGk+Ci0KLTxsaT4oRGVmYXVsdCkgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3VycmVudCBSZXNvdXJjZTwvc3Bhbj46IGxpc3QgYWxsIG9mIHRoZSB0eXBlcwotYXZhaWxhYmxlIGluIHlvdXIgY3VycmVudCBmaWxlLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JraW5nIFNldHM8L3NwYW4+OiBsaXN0IGFsbCB0aGUgdHlwZXMgYXZhaWxhYmxlIHdpdGhpbgotdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0LjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLTxwPlNlbGVjdCB0aGUgdHlwZSB5b3Ugd2FudCBpbiB0aGUgdHlwZSBsaXN0LCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi4gPC9wPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZHZhbmNlZDwvc3Bhbj4gdGFiLjwvc3Bhbj4gSW4gdGhpcwotcGFnZSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgdmFyaW91cyB2YWx1ZXMgZm9yIHRoZSBnbG9iYWwgZWxlbWVudDogCi08dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWJzdHJhY3Q8L3NwYW4+OiBjbGljayA8c3Ryb25nPnRydWU8L3N0cm9uZz4gaWYgeW91IHdhbnQgdGhlCi1nbG9iYWwgZWxlbWVudCB0byBiZSBhYnN0cmFjdC4gV2hlbiBhIGdsb2JhbCBlbGVtZW50IGlzIGRlY2xhcmVkIHRvIGJlIGFic3RyYWN0LAotaXQgY2Fubm90IGJlIHVzZWQgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQuIEluc3RlYWQsIGEgbWVtYmVyIG9mIHRoYXQgZ2xvYmFsCi1lbGVtZW50J3Mgc3Vic3RpdHV0aW9uIGdyb3VwIG11c3QgYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudC48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+QmxvY2s8L3NwYW4+OiBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdsb2JhbCBlbGVtZW50Ci1tYXkgYmUgcmVwbGFjZWQgYnkgYW4gZWxlbWVudCBkZXJpdmVkIGZyb20gaXQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmFsPC9zcGFuPjogZGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgZ2xvYmFsIGVsZW1lbnQKLW1heSBiZSBkZXJpdmVkIGZyb20uPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN1YnN0aXR1dGlvbiBHcm91cDwvc3Bhbj46IGEgc3Vic3RpdHV0aW9uIGdyb3VwIGFsbG93cwotZWxlbWVudHMgdG8gYmUgc3Vic3RpdHV0ZWQgZm9yIG90aGVyIGVsZW1lbnRzLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5OaWxsYWJsZTwvc3Bhbj46IHNlbGVjdCA8c3Ryb25nPnRydWU8L3N0cm9uZz4gaWYgeW91IGRvIG5vdAotd2FudCB0aGUgZ2xvYmFsIGVsZW1lbnQgdG8gYmUgYWJsZSB0byBoYXZlIGFueSBjaGlsZCBlbGVtZW50cywgb25seSBhdHRyaWJ1dGVzLiA8L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgdG8gcHJvdmlkZSBhbnkKLWluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ2xvYmFsIGVsZW1lbnQuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgdG8gYWRkIGFwcGxpY2F0aW9uCi1pbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UKLWFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBjYW4gYWRkIGEgY29udGVudCBtb2RlbCB0byBhIGdsb2JhbCBlbGVtZW50LCB3aGljaCBpcyB0aGUgcmVwcmVzZW50YXRpb24KLW9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZCBpbnNpZGUgdGhlIGdsb2JhbCBlbGVtZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbgotYWJvdXQgd29ya2luZyB3aXRoIGNvbnRlbnQgbW9kZWxzLCByZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrcy48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGNtb2QuaHRtbCIgdGl0bGU9IkEgY29udGVudCBtb2RlbCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluc2lkZSBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cC4gSXQgaXMgYSBmb3JtYWwgZGVzY3JpcHRpb24gb2YgdGhlIHN0cnVjdHVyZSBhbmQgcGVybWlzc2libGUgY29udGVudCBvZiBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gdmFsaWRhdGUgYSBkb2N1bWVudCBpbnN0YW5jZS4iPkFkZGluZyBjb250ZW50IG1vZGVsczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRlbG1yLmh0bWwiIHRpdGxlPSJBbiBlbGVtZW50IHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBlbGVtZW50LiBBIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdsb2JhbCBlbGVtZW50IGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ2xvYmFsIGVsZW1lbnQgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIj5BZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdycHIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdycHIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwZWMwMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnByLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZGdycHIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBncm91cCByZWZlcmVuY2VzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgZ3JvdXAgcmVmZXJlbmNlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BIGdyb3VwIHJlZmVyZW5jZSBpcyBhIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdyb3VwLiBJdA0KLWVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ3JvdXAgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dA0KLW9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+Z3JvdXAgZmVhdHVyZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmdyb3VwIGZlYXR1cmVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5UaGUgbWVudSBvcHRpb24gdG8gYWRkIGEgZ3JvdXAgcmVmZXJlbmNlIG9ubHkgYXBwZWFycyBpZiB0aGVyZSBhcmUNCi1ncm91cHMgZGVmaW5lZCBlbHNld2hlcmUgaW4gdGhlIGRvY3VtZW50LjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUNCi13cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXINCi1wZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhIGdyb3VwIHJlZmVyZW5jZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczw/UHViIENhcmV0Pz46PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBjb250ZW50IG1vZGVsIHlvdSB3YW50IHRvIHdvcmsNCi13aXRoIGFuZCBzZWxlY3QgPHVpY29udHJvbD5BZGQgR3JvdXAgUmVmPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgbmV3IGdyb3VwIHJlZmVyZW5jZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBzZWxlY3QgdGhlIGdyb3VwIHlvdSB3YW50IHRvIHJlZmVyIHRvIGluDQotdGhlIDx1aWNvbnRyb2w+cmVmPC91aWNvbnRyb2w+IGxpc3QuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGdyb3VwIHJlZmVyZW5jZS48L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudCB0bw0KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvY21kPg0KLTxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlDQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDIwMDc/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdycHIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdycHIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwZDdiYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnByLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgZ3JvdXAgcmVmZXJlbmNlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBIGdyb3VwIHJlZmVyZW5jZSBpcyBhIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdyb3VwLiBJdCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBIGdyb3VwIHJlZmVyZW5jZSBpcyBhIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdyb3VwLiBJdCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBncm91cCBmZWF0dXJlcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBncm91cCBmZWF0dXJlcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZ3J1cC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRncnByIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGdyb3VwIHJlZmVyZW5jZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRncnByIj48YSBuYW1lPSJ0YWRkZ3JwciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGdyb3VwIHJlZmVyZW5jZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkEgZ3JvdXAgcmVmZXJlbmNlIGlzIGEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ3JvdXAuIEl0Ci1lbmFibGVzIHRoZSByZWZlcmVuY2VkIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQKLW9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRoZSBtZW51IG9wdGlvbiB0byBhZGQgYSBncm91cCByZWZlcmVuY2Ugb25seSBhcHBlYXJzIGlmIHRoZXJlIGFyZQotZ3JvdXBzIGRlZmluZWQgZWxzZXdoZXJlIGluIHRoZSBkb2N1bWVudC48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlCi13cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIKLXBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYSBncm91cCByZWZlcmVuY2UsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgY29udGVudCBtb2RlbCB5b3Ugd2FudCB0byB3b3JrCi13aXRoIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEdyb3VwIFJlZjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBuZXcgZ3JvdXAgcmVmZXJlbmNlLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHNlbGVjdCB0aGUgZ3JvdXAgeW91IHdhbnQgdG8gcmVmZXIgdG8gaW4KLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5yZWY8L3NwYW4+IGxpc3QuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBncm91cCByZWZlcmVuY2UuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQgdG8KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRncnVwLmh0bWwiIHRpdGxlPSJXaGVuIHlvdSBjcmVhdGUgYSBncm91cCwgaXQgYXV0b21hdGljYWxseSBjb250YWlucyBhIGNvbnRlbnQgbW9kZWwuIFRoZSBjb250ZW50IG1vZGVsIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgZ3JvdXBlZCB0b2dldGhlciBieSB0aGUgZ3JvdXAsIHN1Y2ggYXMgZWxlbWVudHMsIGVsZW1lbnQgcmVmZXJlbmNlcywgYW5kIGdyb3VwIHJlZmVyZW5jZXMuIj5BZGRpbmcgZ3JvdXBzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdydXAuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdydXAuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc5NzIxYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnVwLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRhZGRncnVwIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgZ3JvdXBzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgZ3JvdXBzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPldoZW4geW91IGNyZWF0ZSBhIGdyb3VwLCBpdCBhdXRvbWF0aWNhbGx5IGNvbnRhaW5zIGEgY29udGVudCBtb2RlbC4NCi1UaGUgY29udGVudCBtb2RlbCBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGdyb3VwZWQgdG9nZXRoZXINCi1ieSB0aGUgZ3JvdXAsIHN1Y2ggYXMgZWxlbWVudHMsIGVsZW1lbnQgcmVmZXJlbmNlcywgYW5kIGdyb3VwIHJlZmVyZW5jZXMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmdyb3VwczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+Z3JvdXBzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD48L3A+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UNCi1wZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd3M8P1B1YiBDYXJldD8+aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8NCi1hZGQgYSBncm91cCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayA8Yj5Hcm91cHM8L2I+LCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQNCi1Hcm91cDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCB0eXBlIGEgbmV3IG5hbWUgZm9yIHRoZSBncm91cCBpbiB0aGUgPHVpY29udHJvbD5OYW1lPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBncm91cCBlbGVtZW50LjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50IHRvDQotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUNCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCBleHBhbmQgdGhlIDx1aWNvbnRyb2w+R3JvdXBzPC91aWNvbnRyb2w+IGZvbGRlcg0KLWFuZCB5b3VyIG5ldyBncm91cC48L2NtZD48aW5mbz5Zb3VyIGdyb3VwIGF1dG9tYXRpY2FsbHkgY29udGFpbnMgYSBjb250ZW50DQotbW9kZWwuIEEgZ3JvdXAncyBjb250ZW50IG1vZGVsIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbg0KLWJlIGNvbnRhaW5lZCBpbnNpZGUgdGhlIGdyb3VwLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3b3JraW5nIHdpdGggY29udGVudA0KLW1vZGVscywgcmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyMjMyPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnVwLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnVwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYTZmM2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ3J1cC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGdyb3VwcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJXaGVuIHlvdSBjcmVhdGUgYSBncm91cCwgaXQgYXV0b21hdGljYWxseSBjb250YWlucyBhIGNvbnRlbnQgbW9kZWwuIFRoZSBjb250ZW50IG1vZGVsIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgZ3JvdXBlZCB0b2dldGhlciBieSB0aGUgZ3JvdXAsIHN1Y2ggYXMgZWxlbWVudHMsIGVsZW1lbnQgcmVmZXJlbmNlcywgYW5kIGdyb3VwIHJlZmVyZW5jZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IldoZW4geW91IGNyZWF0ZSBhIGdyb3VwLCBpdCBhdXRvbWF0aWNhbGx5IGNvbnRhaW5zIGEgY29udGVudCBtb2RlbC4gVGhlIGNvbnRlbnQgbW9kZWwgaXMgYSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBncm91cGVkIHRvZ2V0aGVyIGJ5IHRoZSBncm91cCwgc3VjaCBhcyBlbGVtZW50cywgZWxlbWVudCByZWZlcmVuY2VzLCBhbmQgZ3JvdXAgcmVmZXJlbmNlcy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgZ3JvdXBzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGdyb3VwcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZ3Jwci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGNtb2QuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkZ3J1cCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBncm91cHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRncnVwIj48YSBuYW1lPSJ0YWRkZ3J1cCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGdyb3VwczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+V2hlbiB5b3UgY3JlYXRlIGEgZ3JvdXAsIGl0IGF1dG9tYXRpY2FsbHkgY29udGFpbnMgYSBjb250ZW50IG1vZGVsLgotVGhlIGNvbnRlbnQgbW9kZWwgaXMgYSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBncm91cGVkIHRvZ2V0aGVyCi1ieSB0aGUgZ3JvdXAsIHN1Y2ggYXMgZWxlbWVudHMsIGVsZW1lbnQgcmVmZXJlbmNlcywgYW5kIGdyb3VwIHJlZmVyZW5jZXMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cCAvPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UKLXBlcnNwZWN0aXZlLCBidXQgdGhleSB3c2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8KLWFkZCBhIGdyb3VwLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayA8c3Ryb25nPkdyb3Vwczwvc3Ryb25nPiwgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZAotR3JvdXA8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHR5cGUgYSBuZXcgbmFtZSBmb3IgdGhlIGdyb3VwIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ3JvdXAgZWxlbWVudC48L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3Ugd2FudCB0bwotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUKLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCBleHBhbmQgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdyb3Vwczwvc3Bhbj4gZm9sZGVyCi1hbmQgeW91ciBuZXcgZ3JvdXAuPC9zcGFuPiBZb3VyIGdyb3VwIGF1dG9tYXRpY2FsbHkgY29udGFpbnMgYSBjb250ZW50Ci1tb2RlbC4gQSBncm91cCdzIGNvbnRlbnQgbW9kZWwgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuCi1iZSBjb250YWluZWQgaW5zaWRlIHRoZSBncm91cC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgd29ya2luZyB3aXRoIGNvbnRlbnQKLW1vZGVscywgcmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGdycHIuaHRtbCIgdGl0bGU9IkEgZ3JvdXAgcmVmZXJlbmNlIGlzIGEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ3JvdXAuIEl0IGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ3JvdXAgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIj5BZGRpbmcgZ3JvdXAgcmVmZXJlbmNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRjbW9kLmh0bWwiIHRpdGxlPSJBIGNvbnRlbnQgbW9kZWwgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZCBpbnNpZGUgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAuIEl0IGlzIGEgZm9ybWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHBlcm1pc3NpYmxlIGNvbnRlbnQgb2YgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAsIHdoaWNoIG1heSBiZSB1c2VkIHRvIHZhbGlkYXRlIGEgZG9jdW1lbnQgaW5zdGFuY2UuIj5BZGRpbmcgY29udGVudCBtb2RlbHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW1wdC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW1wdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjBkMTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGltcHQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA4LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkaW1wdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGltcG9ydCBlbGVtZW50czwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGltcG9ydCBlbGVtZW50czwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5JZiB5b3VyIHNjaGVtYXMgYXJlIGxhcmdlLCB5b3UgbWlnaHQgY2hvb3NlIHRvIGRpdmlkZSB0aGVpcg0KLWNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIHRvIG1ha2UgdGhlbSBlYXNpZXIgdG8gbWFpbnRhaW4sDQotcmV1c2UsIGFuZCByZWFkLiBZb3UgY2FuIHVzZSBhbiA8Y29kZXBoPmltcG9ydDwvY29kZXBoPiBlbGVtZW50IHRvDQotYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIGFuIGltcG9ydGVkIHNjaGVtYSBpbnRvDQotdGhlIGN1cnJlbnQgc2NoZW1hLiA8L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+aW1wb3J0IGVsZW1lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5pbXBvcnQgZWxlbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPllvdSBjYW4gaW1wb3J0IGEgc2NoZW1hIGZyb20gYSBkaWZmZXJlbnQgbmFtZXNwYWNlIHRoYW4NCi10aGUgY3VycmVudCBzY2hlbWEuIFlvdSBjYW4gYWRkIG11bHRpcGxlIGltcG9ydCBlbGVtZW50cyB0byBhbiBYTUwNCi1zY2hlbWE7IGhvd2V2ZXIsIGFuIGltcG9ydGVkIHNjaGVtYSBjYW5ub3QgaGF2ZSB0aGUgc2FtZSBuYW1lc3BhY2UNCi1vciBwcmVmaXggYXMgYW5vdGhlciBpbXBvcnRlZCBzY2hlbWEuPC9wPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zDQotd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrDQotaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhbiBpbXBvcnQgZWxlbWVudCwgY29tcGxldGUNCi10aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgaW4gdGhlIDxiPkRpcmVjdGl2ZXM8L2I+IHNlY3Rpb24NCi1hbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgSW1wb3J0PC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBTZWxlY3QgWE1MIHNjaGVtYSBmaWxlIHdpemFyZCwgeW91IGNhbiBpbXBvcnQgYW4NCi1YTUwgc2NoZW1hIHRoYXQgaXMgbG9jYXRlZCBpbiB5b3VyIHdvcmtzcGFjZSBvciB5b3UgY2FuIGltcG9ydCBhIHNjaGVtYQ0KLWZyb20gYW4gSFRUUCBXZWIgYWRkcmVzcy48L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPklmIHlvdSB3YW50IHRvIGltcG9ydCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgaW4geW91ciB3b3Jrc3BhY2U6PG9sPg0KLTxsaT5TZWxlY3QgPHVpY29udHJvbD5Xb3JrYmVuY2ggcHJvamVjdHM8L3VpY29udHJvbD4gYW5kIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi4gPC9saT4NCi08bGk+U2VsZWN0IHRoZSBzY2hlbWEgdGhhdCB5b3Ugd2FudCB0byBpbXBvcnQgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvbGk+DQotPC9vbD48L2Nob2ljZT4NCi08Y2hvaWNlPklmIHlvdSB3YW50IHRvIGltcG9ydCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgYXQgYW4gSFRUUCBXZWINCi1hZGRyZXNzOjxvbD4NCi08bGk+U2VsZWN0IDx1aWNvbnRyb2w+SFRUUDwvdWljb250cm9sPiBhbmQgY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvbGk+DQotPGxpPlR5cGUgdGhlIFVSTCBvZiB0aGUgWE1MIHNjaGVtYSBhbmQgY2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPG5vdGU+QQ0KLWxvY2FsIGNvcHkgb2YgdGhlIHNjaGVtYSBpcyBub3Qgc3RvcmVkIGluIHlvdXIgd29ya3NwYWNlLiBJZiB5b3UgdmFsaWRhdGUNCi15b3VyIHNjaGVtYSwgdGhlIHNjaGVtYSdzIGNvbnRlbnRzIGFyZSBjaGVja2VkIGZyb20gdGhlIFVSTCB0aGF0IHlvdQ0KLXNwZWNpZnkuPC9ub3RlPjwvbGk+DQotPC9vbD48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwIGltcG9ydGFuY2U9Im9wdGlvbmFsIj48Y21kPlVzZSB0aGUgUHJvcGVydGllcyB2aWV3IHRvIGRlZmluZQ0KLWFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgeW91ciBpbXBvcnQgZWxlbWVudC48L2NtZD4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5JZiB5b3Ugd2FudCB0byBhZGQgYSB1bmlxdWUgcHJlZml4IGZvciB0aGlzIG5hbWVzcGFjZSwNCi1jbGljayB0aGUgPHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+IHRhYiBhbmQgdHlwZSB0aGUgcHJlZml4IGluDQotdGhlIDx1aWNvbnRyb2w+UHJlZml4PC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmDQoteW91IHdhbnQgdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBvcnQgZWxlbWVudC4gPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlIGlzIHVzZWQgZm9yIGh1bWFuDQotcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91DQotd2FudCB0byBhZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZg0KLXNjaGVtYSBjb21wb25lbnRzLiA8L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UNCi1hbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIHNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPg0KLTwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08L3N0ZXBzPjw/UHViIENhcmV0MT8+DQotPHJlc3VsdD48cD5PbmNlIHlvdSBoYXZlIGFkZGVkIGFuIGltcG9ydCBlbGVtZW50IHRvIHlvdXIgWE1MIHNjaGVtYSwNCi13aGVuIHlvdSBkZWZpbmUgbmV3IGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBjb21wbGV4IHR5cGVzLCBvciBzaW1wbGUNCi10eXBlcyB3aGVyZSB5b3UgY2FuIHNwZWNpZnkgdHlwZSBpbmZvcm1hdGlvbiwgYW55IGRlY2xhcmF0aW9ucyBmcm9tDQotdGhlIGluY2x1ZGVkIHNjaGVtYSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgPHVpY29udHJvbD5UeXBlPC91aWNvbnRyb2w+IGxpc3QNCi1mb3IgdGhlIGVsZW1lbnQsIGF0dHJpYnV0ZSwgY29tcGxleCBvciBzaW1wbGUgdHlwZS48L3A+PC9yZXN1bHQ+DQotPHBvc3RyZXE+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzNzU2Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbXB0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbXB0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMDA4M2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW1wdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBpbXBvcnQgZWxlbWVudHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSWYgeW91ciBzY2hlbWFzIGFyZSBsYXJnZSwgeW91IG1pZ2h0IGNob29zZSB0byBkaXZpZGUgdGhlaXIgY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgdG8gbWFrZSB0aGVtIGVhc2llciB0byBtYWludGFpbiwgcmV1c2UsIGFuZCByZWFkLiBZb3UgY2FuIHVzZSBhbiBpbXBvcnQgZWxlbWVudCB0byBicmluZyBpbiBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20gYW4gaW1wb3J0ZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiB5b3VyIHNjaGVtYXMgYXJlIGxhcmdlLCB5b3UgbWlnaHQgY2hvb3NlIHRvIGRpdmlkZSB0aGVpciBjb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyB0byBtYWtlIHRoZW0gZWFzaWVyIHRvIG1haW50YWluLCByZXVzZSwgYW5kIHJlYWQuIFlvdSBjYW4gdXNlIGFuIGltcG9ydCBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSBhbiBpbXBvcnRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGltcG9ydCBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBpbXBvcnQgZWxlbWVudHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGluY2wuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRyZGZuLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9ybm1zcGMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkaW1wdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBpbXBvcnQgZWxlbWVudHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRpbXB0Ij48YSBuYW1lPSJ0YWRkaW1wdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGltcG9ydCBlbGVtZW50czwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+SWYgeW91ciBzY2hlbWFzIGFyZSBsYXJnZSwgeW91IG1pZ2h0IGNob29zZSB0byBkaXZpZGUgdGhlaXIKLWNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIHRvIG1ha2UgdGhlbSBlYXNpZXIgdG8gbWFpbnRhaW4sCi1yZXVzZSwgYW5kIHJlYWQuIFlvdSBjYW4gdXNlIGFuIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmltcG9ydDwvc2FtcD4gZWxlbWVudCB0bwotYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIGFuIGltcG9ydGVkIHNjaGVtYSBpbnRvCi10aGUgY3VycmVudCBzY2hlbWEuIDwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WW91IGNhbiBpbXBvcnQgYSBzY2hlbWEgZnJvbSBhIGRpZmZlcmVudCBuYW1lc3BhY2UgdGhhbgotdGhlIGN1cnJlbnQgc2NoZW1hLiBZb3UgY2FuIGFkZCBtdWx0aXBsZSBpbXBvcnQgZWxlbWVudHMgdG8gYW4gWE1MCi1zY2hlbWE7IGhvd2V2ZXIsIGFuIGltcG9ydGVkIHNjaGVtYSBjYW5ub3QgaGF2ZSB0aGUgc2FtZSBuYW1lc3BhY2UKLW9yIHByZWZpeCBhcyBhbm90aGVyIGltcG9ydGVkIHNjaGVtYS48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucwotd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrCi1pbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYW4gaW1wb3J0IGVsZW1lbnQsIGNvbXBsZXRlCi10aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayBpbiB0aGUgPHN0cm9uZz5EaXJlY3RpdmVzPC9zdHJvbmc+IHNlY3Rpb24KLWFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgSW1wb3J0PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSBTZWxlY3QgWE1MIHNjaGVtYSBmaWxlIHdpemFyZCwgeW91IGNhbiBpbXBvcnQgYW4KLVhNTCBzY2hlbWEgdGhhdCBpcyBsb2NhdGVkIGluIHlvdXIgd29ya3NwYWNlIG9yIHlvdSBjYW4gaW1wb3J0IGEgc2NoZW1hCi1mcm9tIGFuIEhUVFAgV2ViIGFkZHJlc3MuPC9zcGFuPgotPHVsPgotPGxpPklmIHlvdSB3YW50IHRvIGltcG9ydCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgaW4geW91ciB3b3Jrc3BhY2U6PG9sIHR5cGU9ImEiPgotPGxpPlNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2ggcHJvamVjdHM8L3NwYW4+IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi4gPC9saT4KLQotPGxpPlNlbGVjdCB0aGUgc2NoZW1hIHRoYXQgeW91IHdhbnQgdG8gaW1wb3J0IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+LjwvbGk+Ci0KLTwvb2w+Ci08L2xpPgotCi08bGk+SWYgeW91IHdhbnQgdG8gaW1wb3J0IGFuIFhNTCBzY2hlbWEgbG9jYXRlZCBhdCBhbiBIVFRQIFdlYgotYWRkcmVzczo8b2wgdHlwZT0iYSI+Ci08bGk+U2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUVFA8L3NwYW4+IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L2xpPgotCi08bGk+VHlwZSB0aGUgVVJMIG9mIHRoZSBYTUwgc2NoZW1hIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+LjxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBBCi1sb2NhbCBjb3B5IG9mIHRoZSBzY2hlbWEgaXMgbm90IHN0b3JlZCBpbiB5b3VyIHdvcmtzcGFjZS4gSWYgeW91IHZhbGlkYXRlCi15b3VyIHNjaGVtYSwgdGhlIHNjaGVtYSdzIGNvbnRlbnRzIGFyZSBjaGVja2VkIGZyb20gdGhlIFVSTCB0aGF0IHlvdQotc3BlY2lmeS48L2Rpdj4KLTwvbGk+Ci0KLTwvb2w+Ci08L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGk+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+VXNlIHRoZSBQcm9wZXJ0aWVzIHZpZXcgdG8gZGVmaW5lCi1hZGRpdGlvbmFsIHByb3BlcnRpZXMgZm9yIHlvdXIgaW1wb3J0IGVsZW1lbnQuPC9zcGFuPgotPG9sIHR5cGU9ImEiPgotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCB0byBhZGQgYSB1bmlxdWUgcHJlZml4IGZvciB0aGlzIG5hbWVzcGFjZSwKLWNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPiB0YWIgYW5kIHR5cGUgdGhlIHByZWZpeCBpbgotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZpeDwvc3Bhbj4gZmllbGQuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZgoteW91IHdhbnQgdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBvcnQgZWxlbWVudC4gPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlIGlzIHVzZWQgZm9yIGh1bWFuCi1yZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3UKLXdhbnQgdG8gYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2YKLXNjaGVtYSBjb21wb25lbnRzLiA8L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlCi1hbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIHNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuCi08L2xpPgotCi08L29sPgotCi08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5PbmNlIHlvdSBoYXZlIGFkZGVkIGFuIGltcG9ydCBlbGVtZW50IHRvIHlvdXIgWE1MIHNjaGVtYSwKLXdoZW4geW91IGRlZmluZSBuZXcgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIGNvbXBsZXggdHlwZXMsIG9yIHNpbXBsZQotdHlwZXMgd2hlcmUgeW91IGNhbiBzcGVjaWZ5IHR5cGUgaW5mb3JtYXRpb24sIGFueSBkZWNsYXJhdGlvbnMgZnJvbQotdGhlIGluY2x1ZGVkIHNjaGVtYSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VHlwZTwvc3Bhbj4gbGlzdAotZm9yIHRoZSBlbGVtZW50LCBhdHRyaWJ1dGUsIGNvbXBsZXggb3Igc2ltcGxlIHR5cGUuPC9wPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iIC8+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRpbmNsLmh0bWwiIHRpdGxlPSJJZiB5b3VyIHNjaGVtYXMgYXJlIGxhcmdlLCB5b3UgbWlnaHQgY2hvb3NlIHRvIGRpdmlkZSB0aGVpciBjb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyB0byBtYWtlIHRoZW0gZWFzaWVyIHRvIG1haW50YWluLCByZXVzZSwgYW5kIHJlYWQuIFlvdSBjYW4gdXNlIHRoZSBpbmNsdWRlIGVsZW1lbnQgdG8gYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBpbmNsdWRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIFRoZSBpbmNsdWRlZCBzY2hlbWEgbXVzdCBiZSBpbiB0aGUgc2FtZSB0YXJnZXQgbmFtZXNwYWNlIGFzIHRoZSBpbmNsdWRpbmcgc2NoZW1hLiI+QWRkaW5nIGluY2x1ZGUgZWxlbWVudHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkcmRmbi5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIHJlZGVmaW5lIG1lY2hhbmlzbSB0byByZWRlZmluZSBzaW1wbGUgYW5kIGNvbXBsZXggdHlwZXMsIGdyb3VwcywgYW5kIGF0dHJpYnV0ZSBncm91cHMgb2J0YWluZWQgZnJvbSBleHRlcm5hbCBzY2hlbWEgZmlsZXMuIFdoZW4geW91IHJlZGVmaW5lIGEgY29tcG9uZW50LCB5b3UgYXJlIG1vZGlmeWluZyBpdHMgY29udGVudHMuIj5BZGRpbmcgcmVkZWZpbmUgZWxlbWVudHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3Mvcm5tc3BjLmh0bWwiIHRpdGxlPSJBbiBYTUwgbmFtZXNwYWNlIGlzIGEgY29sbGVjdGlvbiBvZiBuYW1lcywgaWRlbnRpZmllZCBieSBhIFVSSSByZWZlcmVuY2UsIHdoaWNoIGFyZSB1c2VkIGluIFhNTCBkb2N1bWVudHMgYXMgZWxlbWVudCB0eXBlcyBhbmQgYXR0cmlidXRlIG5hbWVzLiI+WE1MIG5hbWVzcGFjZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW5jbC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW5jbC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTAxMWVkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGluY2wuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA4LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkaW5jbCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGluY2x1ZGUgZWxlbWVudHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPklmIHlvdXIgc2NoZW1hcyBhcmUgbGFyZ2UsIHlvdSBtaWdodCBjaG9vc2UgdG8gZGl2aWRlIHRoZWlyDQotY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgdG8gbWFrZSB0aGVtIGVhc2llciB0byBtYWludGFpbiwNCi1yZXVzZSwgYW5kIHJlYWQuICBZb3UgY2FuIHVzZSB0aGUgPGNvZGVwaD5pbmNsdWRlPC9jb2RlcGg+IGVsZW1lbnQNCi10byBicmluZyBpbiBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20gdGhlIGluY2x1ZGVkIHNjaGVtYQ0KLWludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiBUaGUgaW5jbHVkZWQgc2NoZW1hIG11c3QgYmUgaW4gdGhlIHNhbWUgdGFyZ2V0DQotbmFtZXNwYWNlIGFzIHRoZSBpbmNsdWRpbmcgc2NoZW1hLiA8L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+aW5jbHVkZSBlbGVtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+aW5jbHVkZSBlbGVtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UNCi1wZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvDQotYWRkIGFuIGluY2x1ZGUgZWxlbWVudCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIGluIHRoZSA8Yj5EaXJlY3RpdmVzPC9iPiBzZWN0aW9uDQotYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIEluY2x1ZGU8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFNlbGVjdCBYTUwgc2NoZW1hIGZpbGUgd2l6YXJkLCB5b3UgY2FuIGluY2x1ZGUgYW4NCi1YTUwgc2NoZW1hIHRoYXQgaXMgbG9jYXRlZCBpbiB5b3VyIHdvcmtzcGFjZSBvciB5b3UgY2FuIGluY2x1ZGUgYQ0KLXNjaGVtYSBmcm9tIGFuIEhUVFAgV2ViIGFkZHJlc3MuIFRoZSBYTUwgc2NoZW1hIGZpbGUgdGhhdCB5b3Ugc2VsZWN0DQotbXVzdCBoYXZlIHRoZSBzYW1lIG5hbWVzcGFjZSBhcyB0aGUgY3VycmVudCBzY2hlbWEuPC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT5JZiB5b3Ugd2FudCB0byBpbmNsdWRlIGFuIFhNTCBzY2hlbWEgbG9jYXRlZCBpbiB5b3VyIHdvcmtzcGFjZTo8b2w+DQotPGxpPlNlbGVjdCA8dWljb250cm9sPldvcmtiZW5jaCBwcm9qZWN0czwvdWljb250cm9sPiBhbmQgY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LiA8L2xpPg0KLTxsaT5TZWxlY3QgdGhlIHNjaGVtYSB0aGF0IHlvdSB3YW50IHRvIGltcG9ydCBhbmQgY2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9saT4NCi08L29sPjwvY2hvaWNlPg0KLTxjaG9pY2U+SWYgeW91IHdhbnQgdG8gaW5jbHVkZSBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgYXQgYW4gSFRUUCBXZWINCi1hZGRyZXNzOjxvbD4NCi08bGk+U2VsZWN0IDx1aWNvbnRyb2w+SFRUUDwvdWljb250cm9sPiBhbmQgY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvbGk+DQotPGxpPlR5cGUgdGhlIFVSTCBvZiB0aGUgWE1MIHNjaGVtYSBhbmQgY2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPG5vdGU+QQ0KLWxvY2FsIGNvcHkgb2YgdGhlIHNjaGVtYSBpcyBub3Qgc3RvcmVkIGluIHlvdXIgd29ya3NwYWNlLiBJZiB5b3UgdmFsaWRhdGUNCi15b3VyIHNjaGVtYSwgdGhlIHNjaGVtYSdzIGNvbnRlbnRzIGFyZSBjaGVja2VkIGZyb20gdGhlIFVSTCB0aGF0IHlvdQ0KLXNwZWNpZnkuPC9ub3RlPjwvbGk+DQotPC9vbD48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwIGltcG9ydGFuY2U9Im9wdGlvbmFsIj48Y21kPlVzZSB0aGUgUHJvcGVydGllcyB2aWV3IHRvIGRlZmluZQ0KLWFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgeW91ciBpbXBvcnQgZWxlbWVudC48L2NtZD4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5JZiB5b3Ugd2FudCB0byBlZGl0IHRoZSBsb2NhdGlvbiBvZiB0aGUgaW5jbHVkZWQgWE1MDQotc2NoZW1hIGZpbGUsIGNsaWNrIHRoZSA8dWljb250cm9sPkdlbmVyYWw8L3VpY29udHJvbD4gdGFiIGFuZCB0eXBlDQotdGhlIG5ldyBsb2NhdGlvbiBkaXNwbGF5IGluIHRoZSA8dWljb250cm9sPlNjaGVtYSBsb2NhdGlvbjwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZg0KLXlvdSB3YW50IHRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW5jbHVkZTw/UHViIENhcmV0Pz4NCi1lbGVtZW50LiA8L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3UNCi13YW50IHRvIGFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mDQotc2NoZW1hIGNvbXBvbmVudHMuIDwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZQ0KLWFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+DQotPC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48cD5PbmNlIHlvdSBoYXZlIGFkZGVkIHRoZSBpbmNsdWRlIGVsZW1lbnQgdG8geW91ciBYTUwgc2NoZW1hLA0KLXdoZW4geW91IGRlZmluZSBuZXcgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIGNvbXBsZXggdHlwZXMsIG9yIHNpbXBsZQ0KLXR5cGVzIHdoZXJlIHlvdSBjYW4gc3BlY2lmeSB0eXBlIGluZm9ybWF0aW9uLCBhbnkgZGVjbGFyYXRpb25zIGZyb20NCi10aGUgaW5jbHVkZWQgc2NoZW1hIHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSA8dWljb250cm9sPlR5cGU8L3VpY29udHJvbD4gbGlzdA0KLWZvciB0aGUgZWxlbWVudCwgYXR0cmlidXRlLCBjb21wbGV4IG9yIHNpbXBsZSB0eXBlLjwvcD48cD5Gb3IgZXhhbXBsZSwNCi1pZiBBZGRyZXNzLnhzZCBoYXMgdGhlIGZvbGxvd2luZyBjb250ZW50OjwvcD48Y29kZWJsb2NrPiZsdDtjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIj4NCi0gICAgJmx0O3NlcXVlbmNlPg0KLSAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICZsdDtlbGVtZW50IG5hbWU9InN0cmVldCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgJmx0Oy9zZXF1ZW5jZT4NCi0mbHQ7L2NvbXBsZXhUeXBlPg0KLTwvY29kZWJsb2NrPmFuZCB5b3UgaGF2ZSBhbiBYTUwgc2NoZW1hIGNhbGxlZCBQdXJjaGFzZU9yZGVyLnhzZCB0aGF0DQotaGFzIGFkZGVkIGFuIGluY2x1ZGUgZm9yIEFkZHJlc3MueHNkLCB0aGVuIHdoZW4gZGVmaW5pbmcgYSBuZXcgZWxlbWVudA0KLWluICBQdXJjaGFzZU9yZGVyLCB5b3UgY2FuIHNlbGVjdCBBZGRyZXNzIGFzIGl0cyB0eXBlLiAgPC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDQxNzQ/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGluY2wuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGluY2wuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5ZDUyZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbmNsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGluY2x1ZGUgZWxlbWVudHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSWYgeW91ciBzY2hlbWFzIGFyZSBsYXJnZSwgeW91IG1pZ2h0IGNob29zZSB0byBkaXZpZGUgdGhlaXIgY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgdG8gbWFrZSB0aGVtIGVhc2llciB0byBtYWludGFpbiwgcmV1c2UsIGFuZCByZWFkLiBZb3UgY2FuIHVzZSB0aGUgaW5jbHVkZSBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiBUaGUgaW5jbHVkZWQgc2NoZW1hIG11c3QgYmUgaW4gdGhlIHNhbWUgdGFyZ2V0IG5hbWVzcGFjZSBhcyB0aGUgaW5jbHVkaW5nIHNjaGVtYS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSWYgeW91ciBzY2hlbWFzIGFyZSBsYXJnZSwgeW91IG1pZ2h0IGNob29zZSB0byBkaXZpZGUgdGhlaXIgY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgdG8gbWFrZSB0aGVtIGVhc2llciB0byBtYWludGFpbiwgcmV1c2UsIGFuZCByZWFkLiBZb3UgY2FuIHVzZSB0aGUgaW5jbHVkZSBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiBUaGUgaW5jbHVkZWQgc2NoZW1hIG11c3QgYmUgaW4gdGhlIHNhbWUgdGFyZ2V0IG5hbWVzcGFjZSBhcyB0aGUgaW5jbHVkaW5nIHNjaGVtYS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgaW5jbHVkZSBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBpbmNsdWRlIGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRpbXB0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkcmRmbi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3Mvcm5tc3BjLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGluY2wiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgaW5jbHVkZSBlbGVtZW50czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZGluY2wiPjxhIG5hbWU9InRhZGRpbmNsIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgaW5jbHVkZSBlbGVtZW50czwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+SWYgeW91ciBzY2hlbWFzIGFyZSBsYXJnZSwgeW91IG1pZ2h0IGNob29zZSB0byBkaXZpZGUgdGhlaXIKLWNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIHRvIG1ha2UgdGhlbSBlYXNpZXIgdG8gbWFpbnRhaW4sCi1yZXVzZSwgYW5kIHJlYWQuICBZb3UgY2FuIHVzZSB0aGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+aW5jbHVkZTwvc2FtcD4gZWxlbWVudAotdG8gYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBpbmNsdWRlZCBzY2hlbWEKLWludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiBUaGUgaW5jbHVkZWQgc2NoZW1hIG11c3QgYmUgaW4gdGhlIHNhbWUgdGFyZ2V0Ci1uYW1lc3BhY2UgYXMgdGhlIGluY2x1ZGluZyBzY2hlbWEuIDwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UKLXBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbwotYWRkIGFuIGluY2x1ZGUgZWxlbWVudCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgaW4gdGhlIDxzdHJvbmc+RGlyZWN0aXZlczwvc3Ryb25nPiBzZWN0aW9uCi1hbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEluY2x1ZGU8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIFNlbGVjdCBYTUwgc2NoZW1hIGZpbGUgd2l6YXJkLCB5b3UgY2FuIGluY2x1ZGUgYW4KLVhNTCBzY2hlbWEgdGhhdCBpcyBsb2NhdGVkIGluIHlvdXIgd29ya3NwYWNlIG9yIHlvdSBjYW4gaW5jbHVkZSBhCi1zY2hlbWEgZnJvbSBhbiBIVFRQIFdlYiBhZGRyZXNzLiBUaGUgWE1MIHNjaGVtYSBmaWxlIHRoYXQgeW91IHNlbGVjdAotbXVzdCBoYXZlIHRoZSBzYW1lIG5hbWVzcGFjZSBhcyB0aGUgY3VycmVudCBzY2hlbWEuPC9zcGFuPgotPHVsPgotPGxpPklmIHlvdSB3YW50IHRvIGluY2x1ZGUgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIGluIHlvdXIgd29ya3NwYWNlOjxvbCB0eXBlPSJhIj4KLTxsaT5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoIHByb2plY3RzPC9zcGFuPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uIDwvbGk+Ci0KLTxsaT5TZWxlY3QgdGhlIHNjaGVtYSB0aGF0IHlvdSB3YW50IHRvIGltcG9ydCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L2xpPgotCi08L29sPgotPC9saT4KLQotPGxpPklmIHlvdSB3YW50IHRvIGluY2x1ZGUgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIGF0IGFuIEhUVFAgV2ViCi1hZGRyZXNzOjxvbCB0eXBlPSJhIj4KLTxsaT5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRUUDwvc3Bhbj4gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+LjwvbGk+Ci0KLTxsaT5UeXBlIHRoZSBVUkwgb2YgdGhlIFhNTCBzY2hlbWEgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEEKLWxvY2FsIGNvcHkgb2YgdGhlIHNjaGVtYSBpcyBub3Qgc3RvcmVkIGluIHlvdXIgd29ya3NwYWNlLiBJZiB5b3UgdmFsaWRhdGUKLXlvdXIgc2NoZW1hLCB0aGUgc2NoZW1hJ3MgY29udGVudHMgYXJlIGNoZWNrZWQgZnJvbSB0aGUgVVJMIHRoYXQgeW91Ci1zcGVjaWZ5LjwvZGl2PgotPC9saT4KLQotPC9vbD4KLTwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTxsaT48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5Vc2UgdGhlIFByb3BlcnRpZXMgdmlldyB0byBkZWZpbmUKLWFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgeW91ciBpbXBvcnQgZWxlbWVudC48L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIGVkaXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbmNsdWRlZCBYTUwKLXNjaGVtYSBmaWxlLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gdGFiIGFuZCB0eXBlCi10aGUgbmV3IGxvY2F0aW9uIGRpc3BsYXkgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjaGVtYSBsb2NhdGlvbjwvc3Bhbj4gZmllbGQuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmCi15b3Ugd2FudCB0byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGluY2x1ZGUKLWVsZW1lbnQuIDwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uCi08L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91Ci13YW50IHRvIGFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mCi1zY2hlbWEgY29tcG9uZW50cy4gPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZQotYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBzY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLgotPC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+T25jZSB5b3UgaGF2ZSBhZGRlZCB0aGUgaW5jbHVkZSBlbGVtZW50IHRvIHlvdXIgWE1MIHNjaGVtYSwKLXdoZW4geW91IGRlZmluZSBuZXcgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIGNvbXBsZXggdHlwZXMsIG9yIHNpbXBsZQotdHlwZXMgd2hlcmUgeW91IGNhbiBzcGVjaWZ5IHR5cGUgaW5mb3JtYXRpb24sIGFueSBkZWNsYXJhdGlvbnMgZnJvbQotdGhlIGluY2x1ZGVkIHNjaGVtYSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VHlwZTwvc3Bhbj4gbGlzdAotZm9yIHRoZSBlbGVtZW50LCBhdHRyaWJ1dGUsIGNvbXBsZXggb3Igc2ltcGxlIHR5cGUuPC9wPgotPHA+Rm9yIGV4YW1wbGUsCi1pZiBBZGRyZXNzLnhzZCBoYXMgdGhlIGZvbGxvd2luZyBjb250ZW50OjwvcD4KLTxwcmU+Jmx0O2NvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3MiJmd0OwotICAgICZsdDtzZXF1ZW5jZSZndDsKLSAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiZndDsKLSAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ic3RyZWV0IiB0eXBlPSJzdHJpbmciJmd0OwotICAgICZsdDsvc2VxdWVuY2UmZ3Q7Ci0mbHQ7L2NvbXBsZXhUeXBlJmd0OwotPC9wcmU+Ci1hbmQgeW91IGhhdmUgYW4gWE1MIHNjaGVtYSBjYWxsZWQgUHVyY2hhc2VPcmRlci54c2QgdGhhdAotaGFzIGFkZGVkIGFuIGluY2x1ZGUgZm9yIEFkZHJlc3MueHNkLCB0aGVuIHdoZW4gZGVmaW5pbmcgYSBuZXcgZWxlbWVudAotaW4gIFB1cmNoYXNlT3JkZXIsIHlvdSBjYW4gc2VsZWN0IEFkZHJlc3MgYXMgaXRzIHR5cGUuICA8L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGltcHQuaHRtbCIgdGl0bGU9IklmIHlvdXIgc2NoZW1hcyBhcmUgbGFyZ2UsIHlvdSBtaWdodCBjaG9vc2UgdG8gZGl2aWRlIHRoZWlyIGNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIHRvIG1ha2UgdGhlbSBlYXNpZXIgdG8gbWFpbnRhaW4sIHJldXNlLCBhbmQgcmVhZC4gWW91IGNhbiB1c2UgYW4gaW1wb3J0IGVsZW1lbnQgdG8gYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIGFuIGltcG9ydGVkIHNjaGVtYSBpbnRvIHRoZSBjdXJyZW50IHNjaGVtYS4iPkFkZGluZyBpbXBvcnQgZWxlbWVudHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkcmRmbi5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIHJlZGVmaW5lIG1lY2hhbmlzbSB0byByZWRlZmluZSBzaW1wbGUgYW5kIGNvbXBsZXggdHlwZXMsIGdyb3VwcywgYW5kIGF0dHJpYnV0ZSBncm91cHMgb2J0YWluZWQgZnJvbSBleHRlcm5hbCBzY2hlbWEgZmlsZXMuIFdoZW4geW91IHJlZGVmaW5lIGEgY29tcG9uZW50LCB5b3UgYXJlIG1vZGlmeWluZyBpdHMgY29udGVudHMuIj5BZGRpbmcgcmVkZWZpbmUgZWxlbWVudHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3Mvcm5tc3BjLmh0bWwiIHRpdGxlPSJBbiBYTUwgbmFtZXNwYWNlIGlzIGEgY29sbGVjdGlvbiBvZiBuYW1lcywgaWRlbnRpZmllZCBieSBhIFVSSSByZWZlcmVuY2UsIHdoaWNoIGFyZSB1c2VkIGluIFhNTCBkb2N1bWVudHMgYXMgZWxlbWVudCB0eXBlcyBhbmQgYXR0cmlidXRlIG5hbWVzLiI+WE1MIG5hbWVzcGFjZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkbm90LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRub3QuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcyOGQwNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRub3QuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkbm90IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgbm90YXRpb25zPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgbm90YXRpb25zPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkEgbm90YXRpb24gaXMgYSBtZWFucyBvZiBhc3NvY2lhdGluZyBhIGJpbmFyeSBkZXNjcmlwdGlvbiB3aXRoDQotYW4gZW50aXR5IG9yIGF0dHJpYnV0ZS4gVGhlIG1vc3QgY29tbW9uIHVzZXMgb2Ygbm90YXRpb25zIGFyZSB0byBpbmNsdWRlIGZhbWlsaWFyDQotdHlwZXMgb2YgYmluYXJ5IHJlZmVyZW5jZXMsIHN1Y2ggYXMgR0lGcyBhbmQgSlBHcywgaW4gYW4gWE1MIGZpbGUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPm5vdGF0aW9uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+bm90YXRpb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5Gb3IgZXhhbXBsZSwgeW91IGFyZSBtYWtpbmcgYSBjYXRhbG9ndWUgb2YgeW91ciBjbG90aGluZyBhbmQgd2FudA0KLXRvIGluY2x1ZGUgYW4gaW1hZ2Ugb2Ygb25lIG9mIHlvdXIgc2hpcnRzLiBZb3Ugd291bGQgaGF2ZSB0byBjcmVhdGUgYSBub3RhdGlvbg0KLWxpa2UgdGhpczogIDx1c2VyaW5wdXQ+Jmx0O25vdGF0aW9uIG5hbWU9Ik15X1NoaXJ0IiBzeXN0ZW09IkdJRiI+Jmx0Oy9ub3RhdGlvbj48L3VzZXJpbnB1dD4gd2hpY2gNCi1kZWZpbmVzIGEgbm90YXRpb24gZm9yIGEgR0lGIGltYWdlLjwvcD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlDQotd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyDQotcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBjcmVhdGUgYSBub3RhdGlvbiwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBPdXRsaW5lIHZpZXcsIHJpZ2h0LWNsaWNrIHlvdXIgWE1MIHNjaGVtYSBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQNCi1Ob3RhdGlvbjwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCB0eXBlIHRoZSBuYW1lIG9mIHRoZSBub3RhdGlvbiBpbiB0aGUgPHVpY29udHJvbD5OYW1lPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPk90aGVyPC91aWNvbnRyb2w+IHRhYi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5wdWJsaWM8L3VpY29udHJvbD4gZmllbGQsIHR5cGUgYSBwdWJsaWMgaWRlbnRpZmllci48L2NtZD4NCi08aW5mbz4gVGhpcyBpcyBvcHRpb25hbCBpZiB5b3UgZW50ZXIgYSB2YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5zeXN0ZW08L3VpY29udHJvbD4gZmllbGQuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPnN5c3RlbTwvdWljb250cm9sPiBmaWVsZCwgdHlwZSBhIFVSSSByZWZlcmVuY2UuPC9jbWQ+DQotPGluZm8+IFRoaXMgaXMgb3B0aW9uYWwgaWYgeW91IGVudGVyIGEgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+cHVibGljPC91aWNvbnRyb2w+IGZpZWxkLjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudA0KLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbm90YXRpb24uPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi4gPHVpY29udHJvbD5BcHANCi1JbmZvPC91aWNvbnRyb2w+IHBhZ2UgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBmb3IgYXBwbGljYXRpb25zLjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudCB0bw0KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvY21kPg0KLTxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlDQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDI5NTk/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZG5vdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkbm90Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MDc4YjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkbm90Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPkFkZGluZyBub3RhdGlvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRub3QiPjxhIG5hbWU9InRhZGRub3QiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgbm90YXRpb25zPC9oMT4KLTxkaXY+PHA+QSBub3RhdGlvbiBpcyBhIG1lYW5zIG9mIGFzc29jaWF0aW5nIGEgYmluYXJ5IGRlc2NyaXB0aW9uIHdpdGgKLWFuIGVudGl0eSBvciBhdHRyaWJ1dGUuIFRoZSBtb3N0IGNvbW1vbiB1c2VzIG9mIG5vdGF0aW9ucyBhcmUgdG8gaW5jbHVkZSBmYW1pbGlhcgotdHlwZXMgb2YgYmluYXJ5IHJlZmVyZW5jZXMsIHN1Y2ggYXMgR0lGcyBhbmQgSlBHcywgaW4gYW4gWE1MIGZpbGUuPC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+Rm9yIGV4YW1wbGUsIHlvdSBhcmUgbWFraW5nIGEgY2F0YWxvZ3VlIG9mIHlvdXIgY2xvdGhpbmcgYW5kIHdhbnQKLXRvIGluY2x1ZGUgYW4gaW1hZ2Ugb2Ygb25lIG9mIHlvdXIgc2hpcnRzLiBZb3Ugd291bGQgaGF2ZSB0byBjcmVhdGUgYSBub3RhdGlvbgotbGlrZSB0aGlzOiAgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij4mbHQ7bm90YXRpb24gbmFtZT0iTXlfU2hpcnQiIHN5c3RlbT0iR0lGIiZndDsmbHQ7L25vdGF0aW9uJmd0Ozwva2JkPiB3aGljaAotZGVmaW5lcyBhIG5vdGF0aW9uIGZvciBhIEdJRiBpbWFnZS48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IAotdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbwotY3JlYXRlIGEgbm90YXRpb24sIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLTxvbD48bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkluIHRoZSBPdXRsaW5lIHZpZXcsIHJpZ2h0LWNsaWNrIHlvdXIgWE1MIHNjaGVtYSBhbmQgY2xpY2sgCi08Yj4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkCi1Ob3RhdGlvbjwvc3Bhbj48L2I+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHR5cGUgdGhlIG5hbWUgb2YgdGhlIG5vdGF0aW9uIGluIHRoZSAKLTxiPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPjwvYj4gZmllbGQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+Q2xpY2sgdGhlIDxiPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdGhlcjwvc3Bhbj48L2I+IHRhYi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5JbiB0aGUgPGI+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnB1YmxpYzwvc3Bhbj48L2I+IGZpZWxkLCB0eXBlIGEgcHVibGljIGlkZW50aWZpZXIuPC9zcGFuPiAgVGhpcyBpcyBvcHRpb25hbCBpZiB5b3UgZW50ZXIgYSB2YWx1ZSBpbiB0aGUgCi08Yj4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+c3lzdGVtPC9zcGFuPjwvYj4gZmllbGQuPC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5JbiB0aGUgPGI+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnN5c3RlbTwvc3Bhbj48L2I+IGZpZWxkLCB0eXBlIGEgVVJJIHJlZmVyZW5jZS48L3NwYW4+ICBUaGlzIGlzIG9wdGlvbmFsIGlmIHlvdSBlbnRlciBhIHZhbHVlIGluIHRoZSAKLTxiPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5wdWJsaWM8L3NwYW4+PC9iPiBmaWVsZC48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkNsaWNrIHRoZSA8Yj4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj48L2I+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBub3RhdGlvbi48L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLCBhbmQgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcAotSW5mbzwvc3Bhbj4gcGFnZSBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGluZm9ybWF0aW9uIGZvciBhcHBsaWNhdGlvbnMuPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZGZuLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZGZuLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NWU2MmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmRmbi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDgsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRyZGZuIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgcmVkZWZpbmUgZWxlbWVudHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyByZWRlZmluZSBlbGVtZW50czwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIHVzZSB0aGUgPGNvZGVwaD5yZWRlZmluZTwvY29kZXBoPiBtZWNoYW5pc20gdG8NCi1yZWRlZmluZSBzaW1wbGUgYW5kIGNvbXBsZXggdHlwZXMsIGdyb3VwcywgYW5kIGF0dHJpYnV0ZSBncm91cHMgb2J0YWluZWQNCi1mcm9tIGV4dGVybmFsIHNjaGVtYSBmaWxlcy4gV2hlbiB5b3UgcmVkZWZpbmUgYSBjb21wb25lbnQsIHlvdSBhcmUNCi1tb2RpZnlpbmcgaXRzIGNvbnRlbnRzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5hZGRpbmcgcmVkZWZpbmUgZWxlbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmFkZGluZyByZWRlZmluZSBlbGVtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+TGlrZSB0aGUgPGNvZGVwaD5pbmNsdWRlPC9jb2RlcGg+IG1lY2hhbmlzbSwgPGNvZGVwaD5yZWRlZmluZTwvY29kZXBoPiByZXF1aXJlcw0KLXRoZSBleHRlcm5hbCBjb21wb25lbnRzIHRvIGJlIGluIHRoZSBzYW1lIHRhcmdldCBuYW1lc3BhY2UgYXMgdGhlDQotcmVkZWZpbmluZyBzY2hlbWEsIGFsdGhvdWdoIGV4dGVybmFsIGNvbXBvbmVudHMgZnJvbSBzY2hlbWFzIHRoYXQNCi1oYXZlIG5vIG5hbWVzcGFjZSBjYW4gYWxzbyBiZSByZWRlZmluZWQuPC9wPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zDQotd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrDQotaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhIHJlZGVmaW5lIGVsZW1lbnQsIGNvbXBsZXRlDQotdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIGluIHRoZSA8Yj5EaXJlY3RpdmVzPC9iPiBzZWN0aW9uDQotYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIFJlZGVmaW5lPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBTZWxlY3QgWE1MIHNjaGVtYSBmaWxlIHdpemFyZCwgeW91IGNhbiBpbXBvcnQgYW4NCi1YTUwgc2NoZW1hIHRoYXQgaXMgbG9jYXRlZCBpbiB5b3VyIHdvcmtzcGFjZSBvciB5b3UgY2FuIGltcG9ydCBhIHNjaGVtYQ0KLWZyb20gYW4gSFRUUCBXZWIgYWRkcmVzcy4gVGhlIFhNTCBzY2hlbWEgZmlsZSB0aGF0IHlvdSBzZWxlY3QgbXVzdA0KLWhhdmUgdGhlIHNhbWUgbmFtZXNwYWNlIGFzIHRoZSBjdXJyZW50IHNjaGVtYS48L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPklmIHlvdSB3YW50IHRvIGltcG9ydCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgaW4geW91ciB3b3Jrc3BhY2U6PG9sPg0KLTxsaT5TZWxlY3QgPHVpY29udHJvbD5Xb3JrYmVuY2ggcHJvamVjdHM8L3VpY29udHJvbD4gYW5kIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi4gPC9saT4NCi08bGk+U2VsZWN0IHRoZSBzY2hlbWEgdGhhdCB5b3Ugd2FudCB0byBpbXBvcnQgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvbGk+DQotPC9vbD48L2Nob2ljZT4NCi08Y2hvaWNlPklmIHlvdSB3YW50IHRvIGltcG9ydCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgYXQgYW4gSFRUUCBXZWINCi1hZGRyZXNzOjxvbD4NCi08bGk+U2VsZWN0IDx1aWNvbnRyb2w+SFRUUDwvdWljb250cm9sPiBhbmQgY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvbGk+DQotPGxpPlR5cGUgdGhlIFVSTCBvZiB0aGUgWE1MIHNjaGVtYSBhbmQgY2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPG5vdGU+QQ0KLWxvY2FsIGNvcHkgb2YgdGhlIHNjaGVtYSBpcyBub3Qgc3RvcmVkIGluIHlvdXIgd29ya3NwYWNlLiBJZiB5b3UgdmFsaWRhdGUNCi15b3VyIHNjaGVtYSwgdGhlIHNjaGVtYSdzIGNvbnRlbnRzIGFyZSBjaGVja2VkIGZyb20gdGhlIFVSTCB0aGF0IHlvdQ0KLXNwZWNpZnkuPC9ub3RlPjwvbGk+DQotPC9vbD48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwIGltcG9ydGFuY2U9Im9wdGlvbmFsIj48Y21kPlVzZSB0aGUgUHJvcGVydGllcyB2aWV3IHRvIGRlZmluZQ0KLWFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgeW91ciBpbXBvcnQgZWxlbWVudC48L2NtZD4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5JZiB5b3Ugd2FudCB0byBlZGl0IHRoZSBsb2NhdGlvbiBvZiB0aGUgaW5jbHVkZWQgWE1MDQotc2NoZW1hIGZpbGUsIGNsaWNrIHRoZSA8dWljb250cm9sPkdlbmVyYWw8L3VpY29udHJvbD4gdGFiIGFuZCB0eXBlDQotdGhlIG5ldyBsb2NhdGlvbiBkaXNwbGF5IGluIHRoZSA8dWljb250cm9sPlNjaGVtYSBsb2NhdGlvbjwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZg0KLXlvdSB3YW50IHRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmVkZWZpbmUgZWxlbWVudC4gPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlIGlzIHVzZWQgZm9yIGh1bWFuDQotcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91DQotd2FudCB0byBhZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZg0KLXNjaGVtYSBjb21wb25lbnRzLiA8L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UNCi1hbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIHNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPg0KLTwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08L3N0ZXBzPjw/UHViIENhcmV0MT8+DQotPHJlc3VsdD48cD5PbmNlIHlvdSBoYXZlIGFkZGVkIHRoZSByZWRlZmluZSBlbGVtZW50IHRvIHlvdXIgWE1MIHNjaGVtYSwNCi15b3UgY2FuIHJlZGVmaW5lIGFueSBvZiB0aGUgc2ltcGxlIGFuZCBjb21wbGV4IHR5cGVzLCBncm91cHMsIGFuZA0KLWF0dHJpYnV0ZSBncm91cHMgaW4gdGhlIFhNTCBzY2hlbWEgeW91IHNlbGVjdGVkIGluIHRoZSByZWRlZmluZSBlbGVtZW50LiA8L3A+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDM3MjE/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJkZm4uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJkZm4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2NmQ0YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZGZuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gdXNlIHRoZSByZWRlZmluZSBtZWNoYW5pc20gdG8gcmVkZWZpbmUgc2ltcGxlIGFuZCBjb21wbGV4IHR5cGVzLCBncm91cHMsIGFuZCBhdHRyaWJ1dGUgZ3JvdXBzIG9idGFpbmVkIGZyb20gZXh0ZXJuYWwgc2NoZW1hIGZpbGVzLiBXaGVuIHlvdSByZWRlZmluZSBhIGNvbXBvbmVudCwgeW91IGFyZSBtb2RpZnlpbmcgaXRzIGNvbnRlbnRzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIHVzZSB0aGUgcmVkZWZpbmUgbWVjaGFuaXNtIHRvIHJlZGVmaW5lIHNpbXBsZSBhbmQgY29tcGxleCB0eXBlcywgZ3JvdXBzLCBhbmQgYXR0cmlidXRlIGdyb3VwcyBvYnRhaW5lZCBmcm9tIGV4dGVybmFsIHNjaGVtYSBmaWxlcy4gV2hlbiB5b3UgcmVkZWZpbmUgYSBjb21wb25lbnQsIHlvdSBhcmUgbW9kaWZ5aW5nIGl0cyBjb250ZW50cy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZyByZWRlZmluZSBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkaW1wdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGluY2wuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3JubXNwYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRyZGZuIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkcmRmbiI+PGEgbmFtZT0idGFkZHJkZm4iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyByZWRlZmluZSBlbGVtZW50czwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiB1c2UgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnJlZGVmaW5lPC9zYW1wPiBtZWNoYW5pc20gdG8KLXJlZGVmaW5lIHNpbXBsZSBhbmQgY29tcGxleCB0eXBlcywgZ3JvdXBzLCBhbmQgYXR0cmlidXRlIGdyb3VwcyBvYnRhaW5lZAotZnJvbSBleHRlcm5hbCBzY2hlbWEgZmlsZXMuIFdoZW4geW91IHJlZGVmaW5lIGEgY29tcG9uZW50LCB5b3UgYXJlCi1tb2RpZnlpbmcgaXRzIGNvbnRlbnRzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+TGlrZSB0aGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+aW5jbHVkZTwvc2FtcD4gbWVjaGFuaXNtLCA8c2FtcCBjbGFzcz0iY29kZXBoIj5yZWRlZmluZTwvc2FtcD4gcmVxdWlyZXMKLXRoZSBleHRlcm5hbCBjb21wb25lbnRzIHRvIGJlIGluIHRoZSBzYW1lIHRhcmdldCBuYW1lc3BhY2UgYXMgdGhlCi1yZWRlZmluaW5nIHNjaGVtYSwgYWx0aG91Z2ggZXh0ZXJuYWwgY29tcG9uZW50cyBmcm9tIHNjaGVtYXMgdGhhdAotaGF2ZSBubyBuYW1lc3BhY2UgY2FuIGFsc28gYmUgcmVkZWZpbmVkLjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zCi13ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsKLWluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhIHJlZGVmaW5lIGVsZW1lbnQsIGNvbXBsZXRlCi10aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayBpbiB0aGUgPHN0cm9uZz5EaXJlY3RpdmVzPC9zdHJvbmc+IHNlY3Rpb24KLWFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgUmVkZWZpbmU8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIFNlbGVjdCBYTUwgc2NoZW1hIGZpbGUgd2l6YXJkLCB5b3UgY2FuIGltcG9ydCBhbgotWE1MIHNjaGVtYSB0aGF0IGlzIGxvY2F0ZWQgaW4geW91ciB3b3Jrc3BhY2Ugb3IgeW91IGNhbiBpbXBvcnQgYSBzY2hlbWEKLWZyb20gYW4gSFRUUCBXZWIgYWRkcmVzcy4gVGhlIFhNTCBzY2hlbWEgZmlsZSB0aGF0IHlvdSBzZWxlY3QgbXVzdAotaGF2ZSB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlIGN1cnJlbnQgc2NoZW1hLjwvc3Bhbj4KLTx1bD4KLTxsaT5JZiB5b3Ugd2FudCB0byBpbXBvcnQgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIGluIHlvdXIgd29ya3NwYWNlOjxvbCB0eXBlPSJhIj4KLTxsaT5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoIHByb2plY3RzPC9zcGFuPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uIDwvbGk+Ci0KLTxsaT5TZWxlY3QgdGhlIHNjaGVtYSB0aGF0IHlvdSB3YW50IHRvIGltcG9ydCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L2xpPgotCi08L29sPgotPC9saT4KLQotPGxpPklmIHlvdSB3YW50IHRvIGltcG9ydCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgYXQgYW4gSFRUUCBXZWIKLWFkZHJlc3M6PG9sIHR5cGU9ImEiPgotPGxpPlNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVFRQPC9zcGFuPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9saT4KLQotPGxpPlR5cGUgdGhlIFVSTCBvZiB0aGUgWE1MIHNjaGVtYSBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gQQotbG9jYWwgY29weSBvZiB0aGUgc2NoZW1hIGlzIG5vdCBzdG9yZWQgaW4geW91ciB3b3Jrc3BhY2UuIElmIHlvdSB2YWxpZGF0ZQoteW91ciBzY2hlbWEsIHRoZSBzY2hlbWEncyBjb250ZW50cyBhcmUgY2hlY2tlZCBmcm9tIHRoZSBVUkwgdGhhdCB5b3UKLXNwZWNpZnkuPC9kaXY+Ci08L2xpPgotCi08L29sPgotPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPGxpPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPlVzZSB0aGUgUHJvcGVydGllcyB2aWV3IHRvIGRlZmluZQotYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciB5b3VyIGltcG9ydCBlbGVtZW50Ljwvc3Bhbj4KLTxvbCB0eXBlPSJhIj4KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgdG8gZWRpdCB0aGUgbG9jYXRpb24gb2YgdGhlIGluY2x1ZGVkIFhNTAotc2NoZW1hIGZpbGUsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPiB0YWIgYW5kIHR5cGUKLXRoZSBuZXcgbG9jYXRpb24gZGlzcGxheSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NoZW1hIGxvY2F0aW9uPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYKLXlvdSB3YW50IHRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmVkZWZpbmUgZWxlbWVudC4gPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlIGlzIHVzZWQgZm9yIGh1bWFuCi1yZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3UKLXdhbnQgdG8gYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2YKLXNjaGVtYSBjb21wb25lbnRzLiA8L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlCi1hbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIHNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuCi08L2xpPgotCi08L29sPgotCi08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5PbmNlIHlvdSBoYXZlIGFkZGVkIHRoZSByZWRlZmluZSBlbGVtZW50IHRvIHlvdXIgWE1MIHNjaGVtYSwKLXlvdSBjYW4gcmVkZWZpbmUgYW55IG9mIHRoZSBzaW1wbGUgYW5kIGNvbXBsZXggdHlwZXMsIGdyb3VwcywgYW5kCi1hdHRyaWJ1dGUgZ3JvdXBzIGluIHRoZSBYTUwgc2NoZW1hIHlvdSBzZWxlY3RlZCBpbiB0aGUgcmVkZWZpbmUgZWxlbWVudC4gPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRpbXB0Lmh0bWwiIHRpdGxlPSJJZiB5b3VyIHNjaGVtYXMgYXJlIGxhcmdlLCB5b3UgbWlnaHQgY2hvb3NlIHRvIGRpdmlkZSB0aGVpciBjb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyB0byBtYWtlIHRoZW0gZWFzaWVyIHRvIG1haW50YWluLCByZXVzZSwgYW5kIHJlYWQuIFlvdSBjYW4gdXNlIGFuIGltcG9ydCBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSBhbiBpbXBvcnRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIj5BZGRpbmcgaW1wb3J0IGVsZW1lbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGluY2wuaHRtbCIgdGl0bGU9IklmIHlvdXIgc2NoZW1hcyBhcmUgbGFyZ2UsIHlvdSBtaWdodCBjaG9vc2UgdG8gZGl2aWRlIHRoZWlyIGNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIHRvIG1ha2UgdGhlbSBlYXNpZXIgdG8gbWFpbnRhaW4sIHJldXNlLCBhbmQgcmVhZC4gWW91IGNhbiB1c2UgdGhlIGluY2x1ZGUgZWxlbWVudCB0byBicmluZyBpbiBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20gdGhlIGluY2x1ZGVkIHNjaGVtYSBpbnRvIHRoZSBjdXJyZW50IHNjaGVtYS4gVGhlIGluY2x1ZGVkIHNjaGVtYSBtdXN0IGJlIGluIHRoZSBzYW1lIHRhcmdldCBuYW1lc3BhY2UgYXMgdGhlIGluY2x1ZGluZyBzY2hlbWEuIj5BZGRpbmcgaW5jbHVkZSBlbGVtZW50czwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVscmVmIj48c3Ryb25nPlJlbGF0ZWQgcmVmZXJlbmNlPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9ybm1zcGMuaHRtbCIgdGl0bGU9IkFuIFhNTCBuYW1lc3BhY2UgaXMgYSBjb2xsZWN0aW9uIG9mIG5hbWVzLCBpZGVudGlmaWVkIGJ5IGEgVVJJIHJlZmVyZW5jZSwgd2hpY2ggYXJlIHVzZWQgaW4gWE1MIGRvY3VtZW50cyBhcyBlbGVtZW50IHR5cGVzIGFuZCBhdHRyaWJ1dGUgbmFtZXMuIj5YTUwgbmFtZXNwYWNlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZWcuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJlZy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjlkN2IxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJlZy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0YWRkcmVnIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgcGF0dGVybiBmYWNldHMgdG8gc2ltcGxlIHR5cGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgcGF0dGVybiBmYWNldHMgdG8gc2ltcGxlIHR5cGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkEgcGF0dGVybiBmYWNldCBjYW4gYmUgdXNlZCB0byBjb25zdHJhaW4gdGhlIHZhbHVlIG9mIGEgdHlwZSdzDQotbGV4aWNhbCBzcGFjZSAodGhlIHNldCBvZiBzdHJpbmcgbGl0ZXJhbHMgdGhhdCByZXByZXNlbnQgdGhlIHZhbHVlcyBvZiBhIHR5cGUpLA0KLXdoaWNoIGluZGlyZWN0bHkgY29uc3RyYWlucyB0aGUgdmFsdWUgc3BhY2UuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPnBhdHRlcm4gZmFjZXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5wYXR0ZXJuIGZhY2V0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+IFRoZSB2YWx1ZSBvZiB0aGUgcGF0dGVybiBpcyBjYWxsZWQgYSByZWd1bGFyIGV4cHJlc3Npb24uIFlvdQ0KLWNhbiBzcGVjaWZ5IGl0IHVzaW5nIHRoZSA8dWljb250cm9sPlJlZ3VsYXIgRXhwcmVzc2lvbjwvdWljb250cm9sPiB3aXphcmQuPC9wPjxwPlRvDQotYWRkIGEgcGF0dGVybiB0byBhIHNpbXBsZSB0eXBlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCBzZWxlY3QgdGhlIHNpbXBsZSB0eXBlIHlvdSB3YW50IHRvIHdvcmsgd2l0aC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPHVpY29udHJvbD5Db25zdHJhaW50czwvdWljb250cm9sPiB0YWIsDQotdGhlbiA8dWljb250cm9sPlBhdHRlcm5zPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+QWRkPC91aWNvbnRyb2w+LjwvY21kPjxpbmZvPlRoZSBSZWd1bGFyIEV4cHJlc3Npb24NCi13aXphcmQgb3BlbnMuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgdG9rZW4geW91IHdhbnQgdG8gYWRkIHRvIHRoZSBleHByZXNzaW9uLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluZGljYXRlIGhvdyBvZnRlbiB5b3Ugd2FudCB0aGUgdG9rZW4gdG8gYXBwZWFyIGluIG9yZGVyIGZvciBhDQotbWF0Y2ggdG8gc3VjY2VlZDo8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPklmIHlvdSB3YW50IHRoZSB0b2tlbiB0byByZXBlYXQsIGNsaWNrIDx1aWNvbnRyb2w+UmVwZWF0PC91aWNvbnRyb2w+IGFuZA0KLXNwZWNpZnkgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgdG9rZW4gbXVzdCBhcHBlYXIuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+IElmIHlvdSB3YW50IHRvIHNwZWNpZnkgYSBtaW5pbXVtIGFuZCBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGUNCi10b2tlbiBjYW4gYXBwZWFyLCBjbGljayA8dWljb250cm9sPlJhbmdlPC91aWNvbnRyb2w+IGFuZCBlbnRlciBhIG1pbmltdW0gYW5kDQotbWF4aW11bSB2YWx1ZS48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gYWRkIHRoZSB0b2tlbiB0byB0aGUgcmVndWxhciBleHByZXNzaW9uLCBjbGljayA8dWljb250cm9sPkFkZDwvdWljb250cm9sPi4gPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gY3JlYXRlIHRoZSBlbnRpcmUgZXhwcmVzc2lvbiwgcmVwZWF0IHN0ZXBzIDQgLSA2IGFzIG5lY2Vzc2FyeS48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5XaGVuIHlvdSBhcmUgZmluaXNoZWQsIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UPD9QdWIgQ2FyZXQxPz5vIHRlc3QgYWdhaW5zdCB0aGUgcmVndWxhciBleHByZXNzaW9uIGFuZCBzZWUgaWYNCi1hIG1hdGNoIG9jY3VycywgZW50ZXIgc2FtcGxlIHRleHQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+PHN0ZXByZXN1bHQ+IFRoZSByZWd1bGFyDQotZXhwcmVzc2lvbiB3aWxsIGFwcGVhciBpbiB0aGUgUGF0dGVybnMgcGFnZS4gPG5vdGUgdHlwZT0idGlwIj4gVG8gZWRpdCBhbg0KLWV4aXN0aW5nIHBhdHRlcm4sIHNlbGVjdCBpdCBpbiB0aGUgUGF0dGVybnMgcGFnZSBhbmQgY2xpY2sgPHVpY29udHJvbD5FZGl0PC91aWNvbnRyb2w+Lg0KLVRvIGRlbGV0ZSBhbiBleGlzdGluZyBwYXR0ZXJuLCBzZWxlY3QgaXQgaW4gdGhlIFBhdHRlcm5zIHBhZ2UgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RGVsZXRlPC91aWNvbnRyb2w+LiA8L25vdGU+PC9zdGVwcmVzdWx0Pg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyNzAzPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZWcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJlZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDVmNGY3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJlZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIHBhdHRlcm4gZmFjZXRzIHRvIHNpbXBsZSB0eXBlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBIHBhdHRlcm4gZmFjZXQgY2FuIGJlIHVzZWQgdG8gY29uc3RyYWluIHRoZSB2YWx1ZSBvZiBhIHR5cGUncyBsZXhpY2FsIHNwYWNlICh0aGUgc2V0IG9mIHN0cmluZyBsaXRlcmFscyB0aGF0IHJlcHJlc2VudCB0aGUgdmFsdWVzIG9mIGEgdHlwZSksIHdoaWNoIGluZGlyZWN0bHkgY29uc3RyYWlucyB0aGUgdmFsdWUgc3BhY2UuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgcGF0dGVybiBmYWNldCBjYW4gYmUgdXNlZCB0byBjb25zdHJhaW4gdGhlIHZhbHVlIG9mIGEgdHlwZSdzIGxleGljYWwgc3BhY2UgKHRoZSBzZXQgb2Ygc3RyaW5nIGxpdGVyYWxzIHRoYXQgcmVwcmVzZW50IHRoZSB2YWx1ZXMgb2YgYSB0eXBlKSwgd2hpY2ggaW5kaXJlY3RseSBjb25zdHJhaW5zIHRoZSB2YWx1ZSBzcGFjZS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgcGF0dGVybiBmYWNldHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgcGF0dGVybiBmYWNldHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZHNtcHQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkcmVnIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIHBhdHRlcm4gZmFjZXRzIHRvIHNpbXBsZSB0eXBlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZHJlZyI+PGEgbmFtZT0idGFkZHJlZyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIHBhdHRlcm4gZmFjZXRzIHRvIHNpbXBsZSB0eXBlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QSBwYXR0ZXJuIGZhY2V0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cmFpbiB0aGUgdmFsdWUgb2YgYSB0eXBlJ3MKLWxleGljYWwgc3BhY2UgKHRoZSBzZXQgb2Ygc3RyaW5nIGxpdGVyYWxzIHRoYXQgcmVwcmVzZW50IHRoZSB2YWx1ZXMgb2YgYSB0eXBlKSwKLXdoaWNoIGluZGlyZWN0bHkgY29uc3RyYWlucyB0aGUgdmFsdWUgc3BhY2UuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD4gVGhlIHZhbHVlIG9mIHRoZSBwYXR0ZXJuIGlzIGNhbGxlZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gWW91Ci1jYW4gc3BlY2lmeSBpdCB1c2luZyB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVndWxhciBFeHByZXNzaW9uPC9zcGFuPiB3aXphcmQuPC9wPgotPHA+VG8KLWFkZCBhIHBhdHRlcm4gdG8gYSBzaW1wbGUgdHlwZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcsIHNlbGVjdCB0aGUgc2ltcGxlIHR5cGUgeW91IHdhbnQgdG8gd29yayB3aXRoLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnN0cmFpbnRzPC9zcGFuPiB0YWIsCi10aGVuIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhdHRlcm5zPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQ8L3NwYW4+Ljwvc3Bhbj4gVGhlIFJlZ3VsYXIgRXhwcmVzc2lvbgotd2l6YXJkIG9wZW5zLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSB0b2tlbiB5b3Ugd2FudCB0byBhZGQgdG8gdGhlIGV4cHJlc3Npb24uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW5kaWNhdGUgaG93IG9mdGVuIHlvdSB3YW50IHRoZSB0b2tlbiB0byBhcHBlYXIgaW4gb3JkZXIgZm9yIGEKLW1hdGNoIHRvIHN1Y2NlZWQ6PC9zcGFuPgotPHVsPgotPGxpPklmIHlvdSB3YW50IHRoZSB0b2tlbiB0byByZXBlYXQsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlcGVhdDwvc3Bhbj4gYW5kCi1zcGVjaWZ5IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHRva2VuIG11c3QgYXBwZWFyLjwvbGk+Ci0KLTwvdWw+Ci0KLTx1bD4KLTxsaT4gSWYgeW91IHdhbnQgdG8gc3BlY2lmeSBhIG1pbmltdW0gYW5kIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRoZQotdG9rZW4gY2FuIGFwcGVhciwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmFuZ2U8L3NwYW4+IGFuZCBlbnRlciBhIG1pbmltdW0gYW5kCi1tYXhpbXVtIHZhbHVlLjwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gYWRkIHRoZSB0b2tlbiB0byB0aGUgcmVndWxhciBleHByZXNzaW9uLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQ8L3NwYW4+LiA8L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGNyZWF0ZSB0aGUgZW50aXJlIGV4cHJlc3Npb24sIHJlcGVhdCBzdGVwcyA0IC0gNiBhcyBuZWNlc3NhcnkuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5XaGVuIHlvdSBhcmUgZmluaXNoZWQsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gdGVzdCBhZ2FpbnN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIHNlZSBpZgotYSBtYXRjaCBvY2N1cnMsIGVudGVyIHNhbXBsZSB0ZXh0Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPiAgVGhlIHJlZ3VsYXIKLWV4cHJlc3Npb24gd2lsbCBhcHBlYXIgaW4gdGhlIFBhdHRlcm5zIHBhZ2UuIDxkaXYgY2xhc3M9InRpcCI+PHNwYW4gY2xhc3M9InRpcHRpdGxlIj5UaXA6PC9zcGFuPiAgVG8gZWRpdCBhbgotZXhpc3RpbmcgcGF0dGVybiwgc2VsZWN0IGl0IGluIHRoZSBQYXR0ZXJucyBwYWdlIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPi4KLVRvIGRlbGV0ZSBhbiBleGlzdGluZyBwYXR0ZXJuLCBzZWxlY3QgaXQgaW4gdGhlIFBhdHRlcm5zIHBhZ2UgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlbGV0ZTwvc3Bhbj4uIDwvZGl2PgotCi08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkc21wdC5odG1sIiB0aXRsZT0iU2ltcGxlIHR5cGVzIGFyZSB1c2VkIHRvIGNyZWF0ZSBkZXJpdmVkIGRhdGEgdHlwZXMuIFRoZXkgcHJvdmlkZSBhIHNldCBvZiBjb25zdHJhaW50cyBvbiB0aGUgdmFsdWUgc3BhY2UgKGEgc2V0IG9mIHZhbHVlcykgYW5kIHRoZSBsZXhpY2FsIHNwYWNlIChhIHNldCBvZiB2YWxpZCBsaXRlcmFscykgb2YgYSBkYXRhdHlwZS4iPkFkZGluZyBzaW1wbGUgdHlwZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkc21wdC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkc21wdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2EzZDZjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHNtcHQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwOCwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZHNtcHQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBzaW1wbGUgdHlwZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBzaW1wbGUgdHlwZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+U2ltcGxlIHR5cGVzIGFyZSB1c2VkIHRvIGNyZWF0ZSBkZXJpdmVkIGRhdGEgdHlwZXMuIFRoZXkNCi1wcm92aWRlIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9uIHRoZSB2YWx1ZSBzcGFjZSAoYSBzZXQgb2YgdmFsdWVzKQ0KLWFuZCB0aGUgbGV4aWNhbCBzcGFjZSAoYSBzZXQgb2YgdmFsaWQgbGl0ZXJhbHMpIG9mIGEgZGF0YXR5cGUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPnNpbXBsZSB0eXBlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+c2ltcGxlIHR5cGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5BIHNpbXBsZSB0eXBlIGNhbm5vdCBoYXZlIGVsZW1lbnQgY29udGVudCBhbmQgY2Fubm90IGNhcnJ5DQotYXR0cmlidXRlcy4gRWxlbWVudHMgdGhhdCBjb250YWluIG51bWJlcnMgKGFuZCBzdHJpbmdzLCBhbmQgZGF0ZXMsDQotYW5kIHNvIG9uKSBidXQgZG8gbm90IGNvbnRhaW4gYW55IHN1Yi1lbGVtZW50cyBoYXZlIGEgc2ltcGxlIHR5cGUuPC9wPjxwPlRoZQ0KLWZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhDQotc2ltcGxlIHR5cGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgcmlnaHQtY2xpY2sgPGI+VHlwZXM8L2I+LCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQNCi1TaW1wbGUgVHlwZTwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCBzZWxlY3QgdGhlIG5ldyBzaW1wbGUgdHlwZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+IHRhYi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UeXBlIGEgbmV3IG5hbWUgZm9yIHRoZSBzaW1wbGUgdHlwZSBpbiB0aGUgPHVpY29udHJvbD5OYW1lPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPllvdSBjYW4gc2VsZWN0IHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBmcm9tIHRoZSA8dWljb250cm9sPlZhcmlldHk8L3VpY29udHJvbD4gbGlzdDo8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+YXRvbWljPC91aWNvbnRyb2w+OiBhdG9taWMgdHlwZXMgYXJlIGFsbCB0aGUgc2ltcGxlDQotdHlwZXMgYnVpbHQgaW50byB0aGUgWE1MIHNjaGVtYSBsYW5ndWFnZS48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+bGlzdDwvdWljb250cm9sPjogbGlzdCB0eXBlcyBhcmUgY29tcHJpc2VkIG9mIHNlcXVlbmNlcw0KLW9mIGF0b21pYyB0eXBlcy4gVGhleSBoYXZlIHZhbHVlcyB0aGF0IGFyZSBjb21wcmlzZWQgb2YgZmluaXRlLWxlbmd0aA0KLXNlcXVlbmNlcyBvZiBhdG9taWMgdmFsdWVzLiA8L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+dW5pb248L3VpY29udHJvbD46IHVuaW9uIHR5cGVzIGVuYWJsZSBhbiBlbGVtZW50DQotb3IgYXR0cmlidXRlIHZhbHVlIHRvIGJlIG9uZSBvciBtb3JlIGluc3RhbmNlcyBvZiBvbmUgdHlwZSBkcmF3biBmcm9tDQotdGhlIHVuaW9uIG9mIG11bHRpcGxlIGF0b21pYyBhbmQgbGlzdCB0eXBlcy48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHNlbGVjdGVkIDx1aWNvbnRyb2w+YXRvbWljPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+bGlzdDwvdWljb250cm9sPiBmcm9tDQotdGhlIDx1aWNvbnRyb2w+VmFyaWV0eTwvdWljb250cm9sPiBsaXN0LCBjbGljayA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiA8aW1hZ2UNCi1ocmVmPSIuLi9pbWFnZXMvQnJvd3NlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIEJyb3dzZSBidXR0b248L2FsdD4NCi08L2ltYWdlPiBuZXh0IHRvIHRoZSA8dWljb250cm9sPkJhc2UgdHlwZTwvdWljb250cm9sPiBvciA8dWljb250cm9sPkl0ZW0NCi10eXBlPC91aWNvbnRyb2w+IGZpZWxkIHRvIHNwZWNpZnkgYSBiYXNlIHR5cGUgZm9yIHRoZSBzaW1wbGUgdHlwZS4gPC9jbWQ+DQotPGluZm8+VGhlIFNldCBUeXBlIGRpYWxvZyBib3ggbGlzdHMgYWxsIGJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQNCi10eXBlcyBjdXJyZW50bHkgYXZhaWxhYmxlLiBZb3UgY2FuIGNoYW5nZSB0aGUgPHVpY29udHJvbD5TY29wZTwvdWljb250cm9sPiBvZg0KLXRoZSBsaXN0IGJ5IHNlbGVjdGluZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOjx1bD4NCi08bGk+PHVpY29udHJvbD5Xb3Jrc3BhY2U8L3VpY29udHJvbD46IGxpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlDQotaW4geW91ciB3b3Jrc3BhY2UuIDwvbGk+DQotPGxpPjx1aWNvbnRyb2w+RW5jbG9zaW5nIFByb2plY3Q8L3VpY29udHJvbD46IGxpc3RzIGFsbCBvZiB0aGUgdHlwZXMNCi1hdmFpbGFibGUgaW4gdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB5b3VyIGZpbGUuIDwvbGk+DQotPGxpPihEZWZhdWx0KSA8dWljb250cm9sPkN1cnJlbnQgUmVzb3VyY2U8L3VpY29udHJvbD46IGxpc3RzIGFsbCBvZg0KLXRoZSB0eXBlcyBhdmFpbGFibGUgaW4geW91ciBjdXJyZW50IGZpbGUuPC9saT4NCi08bGk+PHVpY29udHJvbD5Xb3JraW5nIFNldHM8L3VpY29udHJvbD46IGxpc3RzIGFsbCB0aGUgdHlwZXMgYXZhaWxhYmxlDQotd2l0aGluIHRoZSBzZWxlY3RlZCB3b3JraW5nIHNldC48L2xpPg0KLTwvdWw+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSBzZWxlY3RlZCA8dWljb250cm9sPnVuaW9uPC91aWNvbnRyb2w+IGZyb20gdGhlIDx1aWNvbnRyb2w+VmFyaWV0eTwvdWljb250cm9sPiBsaXN0LA0KLWNsaWNrIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvQnJvd3NlLmdpZiI+DQotPGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIEJyb3dzZSBidXR0b248L2FsdD48L2ltYWdlPiBuZXh0IHRvIHRoZSA8dWljb250cm9sPk1lbWJlcg0KLXR5cGVzPC91aWNvbnRyb2w+IGZpZWxkIHRvIHNwZWNpZnkgdGhlIG1lbWJlciB0eXBlcyBmb3IgdGhlIHNpbXBsZQ0KLXR5cGUuIDwvY21kPjxpbmZvPllvdSBjYW4gc2VsZWN0IHRvIGFkZCBib3RoIDx1aWNvbnRyb2w+QnVpbHQtaW4gc2ltcGxlDQotdHlwZXM8L3VpY29udHJvbD4gYW5kIDx1aWNvbnRyb2w+VXNlci1kZWZpbmVkIHNpbXBsZSB0eXBlczwvdWljb250cm9sPiB0bw0KLXRoZSBtZW1iZXIgdHlwZXMgdmFsdWUgbGlzdC4gPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlRvIHNldCBzcGVjaWZpYyBjb25zdHJhaW50IHZhbHVlcyBvbiB5b3VyIHNpbXBsZSB0eXBlLA0KLXN1Y2ggYXMgbGVuZ3RoIGNvbnN0cmFpbnRzLCBlbnVtZXJhdGlvbnMsIGFuZCBwYXR0ZXJucywgY2xpY2sgdGhlIDx1aWNvbnRyb2w+Q29uc3RyYWludHM8L3VpY29udHJvbD4gdGFiLjwvY21kPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPllvdSBjYW4gdXNlIDxpPmVudW1lcmF0aW9uczwvaT4gdG8gZGVmaW5lIGEgc2V0IG9mIHZhbGlkDQotdmFsdWVzIGZvciBzaW1wbGUgdHlwZXMuIFRoZXkgYXJlIHRoZSBhY3R1YWwgdmFsdWVzIHRoZSBzaW1wbGUgdHlwZQ0KLWNhbiB0YWtlIGFzIHZhbGlkIHZhbHVlcyBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQuIFlvdSBjYW4gYWRkIG9uZQ0KLWVudW1lcmF0aW9uIG9yIHNldmVyYWwgZW51bWVyYXRpb25zIGF0IGEgdGltZTo8L2NtZD48aW5mbz48dWw+DQotPGxpPlRvIGFkZCBvbmUgZW51bWVyYXRpb24gYXQgYSB0aW1lLCB1bmRlciA8dWljb250cm9sPlNwZWNpZmljIGNvbnN0cmFpbnQNCi12YWx1ZXM8L3VpY29udHJvbD4sIHNlbGVjdCA8dWljb250cm9sPkVudW1lcmF0aW9uczwvdWljb250cm9sPiBhbmQNCi1jbGljayA8dWljb250cm9sPkFkZDwvdWljb250cm9sPiBhbmQgc3BlY2lmeSBhIHZhbHVlIGZvciB0aGUgZW51bWVyYXRpb24uPC9saT4NCi08bGk+VG8gYWRkIHNldmVyYWwgZW51bWVyYXRpb25zIGF0IG9uZSB0aW1lOjxvbD4NCi08bGk+U2VsZWN0IDx1aWNvbnRyb2w+RW51bWVyYXRpb25zPC91aWNvbnRyb2w+IGFuZCBjbGljayA8dWljb250cm9sPkFkZDwvdWljb250cm9sPi48L2xpPg0KLTxsaT5FbnRlciB0aGUgdmFsdWUgb2YgZWFjaCBlbnVtZXJhdGlvbi4gRWFjaCB2YWx1ZSBtdXN0IGJlIHNlcGFyYXRlZA0KLWJ5IHRoZSA8dWljb250cm9sPkRlbGltaXRlciBjaGFyYWN0ZXI8L3VpY29udHJvbD4uIEZvciBleGFtcGxlOiA8Y29kZXBoPkZpcnN0LA0KLVNlY29uZDwvY29kZXBoPiB3aWxsIGNyZWF0ZSB0d28gZW51bWVyYXRpb25zLCBvbmUgd2l0aCB0aGUgdmFsdWUgIkZpcnN0Ig0KLWFuZCBvbmUgd2l0aCB0aGUgdmFsdWUgIlNlY29uZCIuPC9saT4NCi08bGk+U2VsZWN0IHRoZSA8dWljb250cm9sPlByZXNlcnZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2U8L3VpY29udHJvbD4gY2hlY2sNCi1ib3ggaWYgeW91IHdhbnQgYW55IHdoaXRlIHNwYWNlIGFyb3VuZCB5b3VyIGVudW1lcmF0aW9uIHZhbHVlcyB0bw0KLWJlIHByZXNlcnZlZC4gSWYgeW91IHNlbGVjdCB0aGlzIGNoZWNrIGJveCwgdGhlIHZhbHVlcyBvZiA8Y29kZXBoPkZpcnN0LA0KLVNlY29uZDwvY29kZXBoPiB3aWxsIHNob3cgdXAgYXMgIkZpcnN0IiBhbmQgIiBTZWNvbmQiICh0aGVyZSBpcyBhDQotc3BhY2UgYmVmb3JlIFNlY29uZCkgYmVjYXVzZSB5b3UgcHV0IGEgc3BhY2UgYmVmb3JlICJTZWNvbmQiIHdoZW4NCi1lbnRlcmluZyB0aGUgdmFsdWUuPC9saT4NCi08bGk+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi4gWW91ciBlbnVtZXJhdGlvbnMgd2lsbCBiZSBjcmVhdGVkDQotYW5kIGFwcGVhciBpbiB0aGUgUHJvcGVydGllcyB2aWV3LjwvbGk+DQotPC9vbD48L2xpPg0KLTwvdWw+PC9pbmZvPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPllvdSBjYW4gdXNlIDxpPnBhdHRlcm5zPC9pPiB0byBwbGFjZSBjZXJ0YWluIGNvbnN0cmFpbnRzDQotcmVnYXJkaW5nIGFsbG93YWJsZSB2YWx1ZXMuIDwvY21kPjxpbmZvPkZvciBleGFtcGxlLCB5b3UgY291bGQgcmVzdHJpY3QNCi10aGUgZmllbGQgdG8gb25seSBhY2NlcHQgaW5wdXQgd2hpY2ggZm9sbG93cyB0aGUgcGF0dGVybiAiZml2ZSBkaWdpdHMNCi1mb2xsb3dlZCBieSB0d28gdXBwZXItY2FzZSBBU0NJSSBsZXR0ZXJzIi4gVG8gc2V0IGEgcGF0dGVybiBjb25zdHJhaW50OjxvbD4NCi08bGk+U2VsZWN0IDx1aWNvbnRyb2w+UGF0dGVybnM8L3VpY29udHJvbD4gYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkPC91aWNvbnRyb2w+LjwvbGk+DQotPGxpPkNyZWF0ZSB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4geW91IHdpc2ggdG8gdXNlIGFzIHlvdXINCi1jb25zdHJhaW50IHVzaW5nIHRoZSA8dWljb250cm9sPlJlZ3VsYXIgRXhwcmVzc2lvbjwvdWljb250cm9sPiB3aXphcmQuPC9saT4NCi08bGk+Q2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9saT4NCi08L29sPjwvaW5mbz48L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZiB5b3UNCi13YW50IHRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc2ltcGxlIHR5cGUuIDwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdQ0KLXdhbnQgdG8gYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2YNCi1zY2hlbWEgY29tcG9uZW50cy4gPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlDQotYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBzY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3UgZG8gbm90IHdhbnQgdGhlIHNpbXBsZSB0eXBlIHRvIGJlIHVzZWQgdG8gZGVyaXZlDQotb3RoZXIgdHlwZXMsIGNsaWNrIHRoZSA8dWljb250cm9sPkFkdmFuY2VkPC91aWNvbnRyb2w+IHRhYiBhbmQsIGluDQotdGhlIDx1aWNvbnRyb2w+RmluYWw8L3VpY29udHJvbD4gbGlzdCwgc2VsZWN0IGlmIGRlcml2YXRpb25zIHNob3VsZA0KLWJlIHByZXZlbnRlZCBieSA8dWljb250cm9sPmxpc3Q8L3VpY29udHJvbD4sIDx1aWNvbnRyb2w+cmVzdHJpY3Rpb248L3VpY29udHJvbD4sIDx1aWNvbnRyb2w+dW5pb248L3VpY29udHJvbD4gb3IgPHVpY29udHJvbD4jYWxsPC91aWNvbnRyb2w+LjwvY21kPjw/UHViDQotQ2FyZXQxPz48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNjk5OT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkc21wdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkc21wdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjA5Y2EyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHNtcHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgc2ltcGxlIHR5cGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlNpbXBsZSB0eXBlcyBhcmUgdXNlZCB0byBjcmVhdGUgZGVyaXZlZCBkYXRhIHR5cGVzLiBUaGV5IHByb3ZpZGUgYSBzZXQgb2YgY29uc3RyYWludHMgb24gdGhlIHZhbHVlIHNwYWNlIChhIHNldCBvZiB2YWx1ZXMpIGFuZCB0aGUgbGV4aWNhbCBzcGFjZSAoYSBzZXQgb2YgdmFsaWQgbGl0ZXJhbHMpIG9mIGEgZGF0YXR5cGUuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlNpbXBsZSB0eXBlcyBhcmUgdXNlZCB0byBjcmVhdGUgZGVyaXZlZCBkYXRhIHR5cGVzLiBUaGV5IHByb3ZpZGUgYSBzZXQgb2YgY29uc3RyYWludHMgb24gdGhlIHZhbHVlIHNwYWNlIChhIHNldCBvZiB2YWx1ZXMpIGFuZCB0aGUgbGV4aWNhbCBzcGFjZSAoYSBzZXQgb2YgdmFsaWQgbGl0ZXJhbHMpIG9mIGEgZGF0YXR5cGUuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIHNpbXBsZSB0eXBlcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBzaW1wbGUgdHlwZXMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZHJlZy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRzbXB0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIHNpbXBsZSB0eXBlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZHNtcHQiPjxhIG5hbWU9InRhZGRzbXB0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgc2ltcGxlIHR5cGVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5TaW1wbGUgdHlwZXMgYXJlIHVzZWQgdG8gY3JlYXRlIGRlcml2ZWQgZGF0YSB0eXBlcy4gVGhleQotcHJvdmlkZSBhIHNldCBvZiBjb25zdHJhaW50cyBvbiB0aGUgdmFsdWUgc3BhY2UgKGEgc2V0IG9mIHZhbHVlcykKLWFuZCB0aGUgbGV4aWNhbCBzcGFjZSAoYSBzZXQgb2YgdmFsaWQgbGl0ZXJhbHMpIG9mIGEgZGF0YXR5cGUuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BIHNpbXBsZSB0eXBlIGNhbm5vdCBoYXZlIGVsZW1lbnQgY29udGVudCBhbmQgY2Fubm90IGNhcnJ5Ci1hdHRyaWJ1dGVzLiBFbGVtZW50cyB0aGF0IGNvbnRhaW4gbnVtYmVycyAoYW5kIHN0cmluZ3MsIGFuZCBkYXRlcywKLWFuZCBzbyBvbikgYnV0IGRvIG5vdCBjb250YWluIGFueSBzdWItZWxlbWVudHMgaGF2ZSBhIHNpbXBsZSB0eXBlLjwvcD4KLTxwPlRoZQotZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhCi1zaW1wbGUgdHlwZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgcmlnaHQtY2xpY2sgPHN0cm9uZz5UeXBlczwvc3Ryb25nPiwgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZAotU2ltcGxlIFR5cGU8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBPdXRsaW5lIHZpZXcsIHNlbGVjdCB0aGUgbmV3IHNpbXBsZSB0eXBlLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPiB0YWIuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgbmV3IG5hbWUgZm9yIHRoZSBzaW1wbGUgdHlwZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gZmllbGQuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3UgY2FuIHNlbGVjdCB0aGUgZm9sbG93aW5nIG9wdGlvbnMgZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFyaWV0eTwvc3Bhbj4gbGlzdDo8L3NwYW4+Ci08dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+YXRvbWljPC9zcGFuPjogYXRvbWljIHR5cGVzIGFyZSBhbGwgdGhlIHNpbXBsZQotdHlwZXMgYnVpbHQgaW50byB0aGUgWE1MIHNjaGVtYSBsYW5ndWFnZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+bGlzdDwvc3Bhbj46IGxpc3QgdHlwZXMgYXJlIGNvbXByaXNlZCBvZiBzZXF1ZW5jZXMKLW9mIGF0b21pYyB0eXBlcy4gVGhleSBoYXZlIHZhbHVlcyB0aGF0IGFyZSBjb21wcmlzZWQgb2YgZmluaXRlLWxlbmd0aAotc2VxdWVuY2VzIG9mIGF0b21pYyB2YWx1ZXMuIDwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj51bmlvbjwvc3Bhbj46IHVuaW9uIHR5cGVzIGVuYWJsZSBhbiBlbGVtZW50Ci1vciBhdHRyaWJ1dGUgdmFsdWUgdG8gYmUgb25lIG9yIG1vcmUgaW5zdGFuY2VzIG9mIG9uZSB0eXBlIGRyYXduIGZyb20KLXRoZSB1bmlvbiBvZiBtdWx0aXBsZSBhdG9taWMgYW5kIGxpc3QgdHlwZXMuPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugc2VsZWN0ZWQgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+YXRvbWljPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5saXN0PC9zcGFuPiBmcm9tCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFyaWV0eTwvc3Bhbj4gbGlzdCwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL0Jyb3dzZS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBCcm93c2UgYnV0dG9uIiAvPiBuZXh0IHRvIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5CYXNlIHR5cGU8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkl0ZW0KLXR5cGU8L3NwYW4+IGZpZWxkIHRvIHNwZWNpZnkgYSBiYXNlIHR5cGUgZm9yIHRoZSBzaW1wbGUgdHlwZS4gPC9zcGFuPgotIFRoZSBTZXQgVHlwZSBkaWFsb2cgYm94IGxpc3RzIGFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkCi10eXBlcyBjdXJyZW50bHkgYXZhaWxhYmxlLiBZb3UgY2FuIGNoYW5nZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NvcGU8L3NwYW4+IG9mCi10aGUgbGlzdCBieSBzZWxlY3Rpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya3NwYWNlPC9zcGFuPjogbGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUKLWluIHlvdXIgd29ya3NwYWNlLiA8L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RW5jbG9zaW5nIFByb2plY3Q8L3NwYW4+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzCi1hdmFpbGFibGUgaW4gdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB5b3VyIGZpbGUuIDwvbGk+Ci0KLTxsaT4oRGVmYXVsdCkgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3VycmVudCBSZXNvdXJjZTwvc3Bhbj46IGxpc3RzIGFsbCBvZgotdGhlIHR5cGVzIGF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2luZyBTZXRzPC9zcGFuPjogbGlzdHMgYWxsIHRoZSB0eXBlcyBhdmFpbGFibGUKLXdpdGhpbiB0aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHNlbGVjdGVkIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnVuaW9uPC9zcGFuPiBmcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYXJpZXR5PC9zcGFuPiBsaXN0LAotY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL0Jyb3dzZS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBCcm93c2UgYnV0dG9uIiAvPiBuZXh0IHRvIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NZW1iZXIKLXR5cGVzPC9zcGFuPiBmaWVsZCB0byBzcGVjaWZ5IHRoZSBtZW1iZXIgdHlwZXMgZm9yIHRoZSBzaW1wbGUKLXR5cGUuIDwvc3Bhbj4gWW91IGNhbiBzZWxlY3QgdG8gYWRkIGJvdGggPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnVpbHQtaW4gc2ltcGxlCi10eXBlczwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVzZXItZGVmaW5lZCBzaW1wbGUgdHlwZXM8L3NwYW4+IHRvCi10aGUgbWVtYmVyIHR5cGVzIHZhbHVlIGxpc3QuIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gc2V0IHNwZWNpZmljIGNvbnN0cmFpbnQgdmFsdWVzIG9uIHlvdXIgc2ltcGxlIHR5cGUsCi1zdWNoIGFzIGxlbmd0aCBjb25zdHJhaW50cywgZW51bWVyYXRpb25zLCBhbmQgcGF0dGVybnMsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db25zdHJhaW50czwvc3Bhbj4gdGFiLjwvc3Bhbj4KLTxvbCB0eXBlPSJhIj4KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiB1c2UgPGVtPmVudW1lcmF0aW9uczwvZW0+IHRvIGRlZmluZSBhIHNldCBvZiB2YWxpZAotdmFsdWVzIGZvciBzaW1wbGUgdHlwZXMuIFRoZXkgYXJlIHRoZSBhY3R1YWwgdmFsdWVzIHRoZSBzaW1wbGUgdHlwZQotY2FuIHRha2UgYXMgdmFsaWQgdmFsdWVzIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudC4gWW91IGNhbiBhZGQgb25lCi1lbnVtZXJhdGlvbiBvciBzZXZlcmFsIGVudW1lcmF0aW9ucyBhdCBhIHRpbWU6PC9zcGFuPiA8dWw+Ci08bGk+VG8gYWRkIG9uZSBlbnVtZXJhdGlvbiBhdCBhIHRpbWUsIHVuZGVyIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNwZWNpZmljIGNvbnN0cmFpbnQKLXZhbHVlczwvc3Bhbj4sIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FbnVtZXJhdGlvbnM8L3NwYW4+IGFuZAotY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkPC9zcGFuPiBhbmQgc3BlY2lmeSBhIHZhbHVlIGZvciB0aGUgZW51bWVyYXRpb24uPC9saT4KLQotPGxpPlRvIGFkZCBzZXZlcmFsIGVudW1lcmF0aW9ucyBhdCBvbmUgdGltZTo8b2wgdHlwZT0iaSI+Ci08bGk+U2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVudW1lcmF0aW9uczwvc3Bhbj4gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZDwvc3Bhbj4uPC9saT4KLQotPGxpPkVudGVyIHRoZSB2YWx1ZSBvZiBlYWNoIGVudW1lcmF0aW9uLiBFYWNoIHZhbHVlIG11c3QgYmUgc2VwYXJhdGVkCi1ieSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVsaW1pdGVyIGNoYXJhY3Rlcjwvc3Bhbj4uIEZvciBleGFtcGxlOiA8c2FtcCBjbGFzcz0iY29kZXBoIj5GaXJzdCwKLVNlY29uZDwvc2FtcD4gd2lsbCBjcmVhdGUgdHdvIGVudW1lcmF0aW9ucywgb25lIHdpdGggdGhlIHZhbHVlICJGaXJzdCIKLWFuZCBvbmUgd2l0aCB0aGUgdmFsdWUgIlNlY29uZCIuPC9saT4KLQotPGxpPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlc2VydmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZTwvc3Bhbj4gY2hlY2sKLWJveCBpZiB5b3Ugd2FudCBhbnkgd2hpdGUgc3BhY2UgYXJvdW5kIHlvdXIgZW51bWVyYXRpb24gdmFsdWVzIHRvCi1iZSBwcmVzZXJ2ZWQuIElmIHlvdSBzZWxlY3QgdGhpcyBjaGVjayBib3gsIHRoZSB2YWx1ZXMgb2YgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Rmlyc3QsCi1TZWNvbmQ8L3NhbXA+IHdpbGwgc2hvdyB1cCBhcyAiRmlyc3QiIGFuZCAiIFNlY29uZCIgKHRoZXJlIGlzIGEKLXNwYWNlIGJlZm9yZSBTZWNvbmQpIGJlY2F1c2UgeW91IHB1dCBhIHNwYWNlIGJlZm9yZSAiU2Vjb25kIiB3aGVuCi1lbnRlcmluZyB0aGUgdmFsdWUuPC9saT4KLQotPGxpPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi4gWW91ciBlbnVtZXJhdGlvbnMgd2lsbCBiZSBjcmVhdGVkCi1hbmQgYXBwZWFyIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcuPC9saT4KLQotPC9vbD4KLTwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPllvdSBjYW4gdXNlIDxlbT5wYXR0ZXJuczwvZW0+IHRvIHBsYWNlIGNlcnRhaW4gY29uc3RyYWludHMKLXJlZ2FyZGluZyBhbGxvd2FibGUgdmFsdWVzLiA8L3NwYW4+IEZvciBleGFtcGxlLCB5b3UgY291bGQgcmVzdHJpY3QKLXRoZSBmaWVsZCB0byBvbmx5IGFjY2VwdCBpbnB1dCB3aGljaCBmb2xsb3dzIHRoZSBwYXR0ZXJuICJmaXZlIGRpZ2l0cwotZm9sbG93ZWQgYnkgdHdvIHVwcGVyLWNhc2UgQVNDSUkgbGV0dGVycyIuIFRvIHNldCBhIHBhdHRlcm4gY29uc3RyYWludDo8b2wgdHlwZT0iaSI+Ci08bGk+U2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhdHRlcm5zPC9zcGFuPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkPC9zcGFuPi48L2xpPgotCi08bGk+Q3JlYXRlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB5b3Ugd2lzaCB0byB1c2UgYXMgeW91cgotY29uc3RyYWludCB1c2luZyB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVndWxhciBFeHByZXNzaW9uPC9zcGFuPiB3aXphcmQuPC9saT4KLQotPGxpPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9saT4KLQotPC9vbD4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3UKLXdhbnQgdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzaW1wbGUgdHlwZS4gPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3UKLXdhbnQgdG8gYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2YKLXNjaGVtYSBjb21wb25lbnRzLiA8L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlCi1hbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIHNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSBkbyBub3Qgd2FudCB0aGUgc2ltcGxlIHR5cGUgdG8gYmUgdXNlZCB0byBkZXJpdmUKLW90aGVyIHR5cGVzLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWR2YW5jZWQ8L3NwYW4+IHRhYiBhbmQsIGluCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluYWw8L3NwYW4+IGxpc3QsIHNlbGVjdCBpZiBkZXJpdmF0aW9ucyBzaG91bGQKLWJlIHByZXZlbnRlZCBieSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5saXN0PC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+cmVzdHJpY3Rpb248L3NwYW4+LCA8c3BhbiBjbGFzcz0idWljb250cm9sIj51bmlvbjwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+I2FsbDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRyZWcuaHRtbCIgdGl0bGU9IkEgcGF0dGVybiBmYWNldCBjYW4gYmUgdXNlZCB0byBjb25zdHJhaW4gdGhlIHZhbHVlIG9mIGEgdHlwZSdzIGxleGljYWwgc3BhY2UgKHRoZSBzZXQgb2Ygc3RyaW5nIGxpdGVyYWxzIHRoYXQgcmVwcmVzZW50IHRoZSB2YWx1ZXMgb2YgYSB0eXBlKSwgd2hpY2ggaW5kaXJlY3RseSBjb25zdHJhaW5zIHRoZSB2YWx1ZSBzcGFjZS4iPkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3htbHNjaC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3htbHNjaC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFiZDEzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGN4bWxzY2guZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGN4bWxzY2giIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIFhNTCBzY2hlbWFzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5DcmVhdGluZyBYTUwgc2NoZW1hczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIGNyZWF0ZSBhbiBYTUwgc2NoZW1hIGFuZCB0aGVuIGVkaXQgaXQgdXNpbmcgdGhlIFhNTCBzY2hlbWENCi1lZGl0b3IuIFVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvciwgeW91IGNhbiBzcGVjaWZ5IGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMNCi13aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5jcmVhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+VG8gY3JlYXRlIGFuIFhNTCBzY2hlbWEsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM8P1B1YiBDYXJldD8+OjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DcmVhdGUgYSBwcm9qZWN0IHRvIGNvbnRhaW4gdGhlIFhNTCBzY2hlbWEuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIHdvcmtiZW5jaCwgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+RmlsZSA+IE5ldyA+IE90aGVyPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5YTUwgPiBYTUwgU2NoZW1hPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4uIENsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIHByb2plY3Qgb3IgZm9sZGVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBYTUwgc2NoZW1hLg0KLUluIHRoZSA8L2NtZD48aW5mbz48dWljb250cm9sPkZpbGUgbmFtZTwvdWljb250cm9sPiBmaWVsZCwgdHlwZSB0aGUgbmFtZSBvZg0KLXRoZSBYTUwgc2NoZW1hLCBmb3IgZXhhbXBsZSA8dXNlcmlucHV0Pk15WE1MU2NoZW1hLnhzZDwvdXNlcmlucHV0Pi4gVGhlIG5hbWUNCi1vZiB5b3VyIFhNTCBzY2hlbWEgbXVzdCBlbmQgaW4gPHN5c3RlbW91dHB1dD4ueHNkPC9zeXN0ZW1vdXRwdXQ+LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayAgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD5UaGUgWE1MIHNjaGVtYSBvcGVucyBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuIDwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAxNTU4Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjeG1sc2NoLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjeG1sc2NoLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNTc0OTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3htbHNjaC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgWE1MIHNjaGVtYXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiBjcmVhdGUgYW4gWE1MIHNjaGVtYSBhbmQgdGhlbiBlZGl0IGl0IHVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLCB5b3UgY2FuIHNwZWNpZnkgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBjcmVhdGUgYW4gWE1MIHNjaGVtYSBhbmQgdGhlbiBlZGl0IGl0IHVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLCB5b3UgY2FuIHNwZWNpZnkgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGZpbGVzLCBjcmVhdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIGNyZWF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRzY2htLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sc2NlZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHZkdHNjaG0uaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0Y3htbHNjaCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIFhNTCBzY2hlbWFzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0Y3htbHNjaCI+PGEgbmFtZT0idGN4bWxzY2giPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIFhNTCBzY2hlbWFzPC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIGNyZWF0ZSBhbiBYTUwgc2NoZW1hIGFuZCB0aGVuIGVkaXQgaXQgdXNpbmcgdGhlIFhNTCBzY2hlbWEKLWVkaXRvci4gVXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLCB5b3UgY2FuIHNwZWNpZnkgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcwotd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DcmVhdGUgYSBwcm9qZWN0IHRvIGNvbnRhaW4gdGhlIFhNTCBzY2hlbWEuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIHdvcmtiZW5jaCwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlICZndDsgTmV3ICZndDsgT3RoZXI8L3NwYW4+Ci08L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgJmd0OyBYTUwgU2NoZW1hPC9zcGFuPgotPC9zcGFuPi4gQ2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBwcm9qZWN0IG9yIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgWE1MIHNjaGVtYS4KLUluIHRoZSA8L3NwYW4+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgbmFtZTwvc3Bhbj4gZmllbGQsIHR5cGUgdGhlIG5hbWUgb2YKLXRoZSBYTUwgc2NoZW1hLCBmb3IgZXhhbXBsZSA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPk15WE1MU2NoZW1hLnhzZDwva2JkPi4gVGhlIG5hbWUKLW9mIHlvdXIgWE1MIHNjaGVtYSBtdXN0IGVuZCBpbiA8dHQgY2xhc3M9InN5c291dCI+LnhzZDwvdHQ+LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRoZSBYTUwgc2NoZW1hIG9wZW5zIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxzY2VkLmh0bWwiIHRpdGxlPSJUaGlzIHByb2R1Y3QgcHJvdmlkZXMgYW4gWE1MIHNjaGVtYSBlZGl0b3IgZm9yIGNyZWF0aW5nLCB2aWV3aW5nLCBhbmQgdmFsaWRhdGluZyBYTUwgc2NoZW1hcy4gWE1MIHNjaGVtYXMgYXJlIGEgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iPlhNTCBzY2hlbWEgZWRpdG9yPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0c2NobS5odG1sIiB0aXRsZT0iQWZ0ZXIgeW91IGNyZWF0ZSBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIGVkaXQgaXRzIHZhcmlvdXMgcHJvcGVydGllcywgc3VjaCBhcyBpdHMgbmFtZXNwYWNlIGFuZCBwcmVmaXguIj5FZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R2ZHRzY2htLmh0bWwiIHRpdGxlPSJWYWxpZGF0aW5nIGFuIFhNTCBzY2hlbWEgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgc2VtYW50aWNhbGx5IHZhbGlkLiBBbnkgZXJyb3JzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiI+VmFsaWRhdGluZyBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkZWxzY21wLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkZWxzY21wLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMzI4OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZGVsc2NtcC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0ZGVsc2NtcCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5EZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+SWYgeW91IGhhdmUgY3JlYXRlZCBhbnkgWE1MIHNjaGVtYSBjb21wb25lbnRzIHlvdSBubyBsb25nZXIgbmVlZCwNCi15b3UgY2FuIGRlbGV0ZSB0aGVtLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5kZWxldGluZyBjb21wb25lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5kZWxldGluZyBjb21wb25lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gZGVsZXRlIGFuIFhNTA0KLXNjaGVtYSBjb21wb25lbnQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgY2xpY2sgdGhlIGl0ZW0gdG8gZGVsZXRlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlJpZ2h0LWNsaWNrIHRoZSBpdGVtLCBhbmQsIGZyb20gaXRzIHBvcC11cCBtZW51LCBjbGljayA8dWljb250cm9sPkRlbGV0ZTwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjxwPlRoZSBYTUwgc2NoZW1hIGVkaXRvciBoYXMgYSBidWlsdC1pbiBtZWNoYW5pc20gdG8gaGFuZGxlIHJlZmVyZW50aWFsDQotaW50ZWdyaXR5IGlzc3Vlcy4gV2hlbiB5b3UgZGVsZXRlIGNlcnRhaW4gY29tcG9uZW50cywgY2xlYW51cCB3aWxsIGF1dG9tYXRpY2FsbHkNCi1vY2N1ci48L3A+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+PD9QdWIgQ2FyZXQ/Pg0KLTw/UHViICowMDAwMDAxMzg0Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkZWxzY21wLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkZWxzY21wLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODgwYzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZGVsc2NtcC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IklmIHlvdSBoYXZlIGNyZWF0ZWQgYW55IFhNTCBzY2hlbWEgY29tcG9uZW50cyB5b3Ugbm8gbG9uZ2VyIG5lZWQsIHlvdSBjYW4gZGVsZXRlIHRoZW0uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IklmIHlvdSBoYXZlIGNyZWF0ZWQgYW55IFhNTCBzY2hlbWEgY29tcG9uZW50cyB5b3Ugbm8gbG9uZ2VyIG5lZWQsIHlvdSBjYW4gZGVsZXRlIHRoZW0uIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGRlbGV0aW5nIGNvbXBvbmVudHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgZGVsZXRpbmcgY29tcG9uZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9ycmVmaW50Zy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRkZWxzY21wIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZGVsc2NtcCI+PGEgbmFtZT0idGRlbHNjbXAiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50czwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+SWYgeW91IGhhdmUgY3JlYXRlZCBhbnkgWE1MIHNjaGVtYSBjb21wb25lbnRzIHlvdSBubyBsb25nZXIgbmVlZCwKLXlvdSBjYW4gZGVsZXRlIHRoZW0uPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGRlbGV0ZSBhbiBYTUwKLXNjaGVtYSBjb21wb25lbnQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaT48c3Bhbj5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCBjbGljayB0aGUgaXRlbSB0byBkZWxldGUuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5SaWdodC1jbGljayB0aGUgaXRlbSwgYW5kLCBmcm9tIGl0cyBwb3AtdXAgbWVudSwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVsZXRlPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgWE1MIHNjaGVtYSBlZGl0b3IgaGFzIGEgYnVpbHQtaW4gbWVjaGFuaXNtIHRvIGhhbmRsZSByZWZlcmVudGlhbAotaW50ZWdyaXR5IGlzc3Vlcy4gV2hlbiB5b3UgZGVsZXRlIGNlcnRhaW4gY29tcG9uZW50cywgY2xlYW51cCB3aWxsIGF1dG9tYXRpY2FsbHkKLW9jY3VyLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxyZWYiPjxzdHJvbmc+UmVsYXRlZCByZWZlcmVuY2U8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3JyZWZpbnRnLmh0bWwiIHRpdGxlPSJUaGUgWE1MIHNjaGVtYSBlZGl0b3IgaGFzIGEgYnVpbHQtaW4gbWVjaGFuaXNtIHRvIGhhbmRsZSByZWZlcmVudGlhbCBpbnRlZ3JpdHkgaXNzdWVzLiBXaGVuIHlvdSBkZWxldGUgY2VydGFpbiBub2RlcywgY2xlYW4gdXAgZm9yIGFueSBub2RlcyBhZmZlY3RlZCB3aWxsIGF1dG9tYXRpY2FsbHkgb2NjdXIuIj5SZWZlcmVudGlhbCBpbnRlZ3JpdHkgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByZWYuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByZWYuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM4NDEzNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcmVmLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRlZHRwcmVmIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiBzZXQgdmFyaW91cyBwcmVmZXJlbmNlcyBmb3IgWE1MIHNjaGVtYSBmaWxlcyBzdWNoIGFzIHRoZQ0KLWRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZSBhbmQgWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIHByZWZpeCB1c2VkLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmVkaXRpbmcgcHJlZmVyZW5jZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPnByZWZlcmVuY2VzPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UbyBkZWZpbmUgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nDQotc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3cgPiBQcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+WE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwNCi1TY2hlbWEgRmlsZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIDx1aWNvbnRyb2w+UXVhbGlmeSBYTUwgc2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHM8L3VpY29udHJvbD4gY2hlY2sNCi1ib3ggaWYgeW91IHdhbnQgYSBwcmVmaXggYXBwbGllZCB0byBhbGwgWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIGluDQoteW91ciBYTUwgc2NoZW1hLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPlhNTCBzY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBwcmVmaXg8L3VpY29udHJvbD4gZmllbGQsDQotdHlwZSB0aGUgcHJlZml4IHlvdSB3YW50IGFwcGxpZWQgdG8gWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIGluIHlvdXINCi1YTUwgc2NoZW1hLjwvY21kPjxpbmZvPlRoZSBwcmVmaXggPHVpY29udHJvbD54c2Q8L3VpY29udHJvbD4gaXMgdXNlZCBieSBjb252ZW50aW9uDQotdG8gZGVub3RlIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZSwgYnV0IGFueSBwcmVmaXggY2FuIGJlIHVzZWQuIFRoZSBwdXJwb3NlDQotb2YgdGhlIGFzc29jaWF0aW9uIGlzIHRvIGlkZW50aWZ5IHRoZSBlbGVtZW50cyBhbmQgc2ltcGxlIHR5cGVzIGFzIGJlbG9uZ2luZw0KLXRvIHRoZSB2b2NhYnVsYXJ5IG9mIHRoZSBYTUwgU2NoZW1hIGxhbmd1YWdlIHJhdGhlciB0aGFuIHRoZSB2b2NhYnVsYXJ5IG9mDQotdGhlIHNjaGVtYSBhdXRob3IuICA8bm90ZT5UaGlzIHByZWZpeCB3aWxsIG5vdCBhcHBlYXIgaW4gYW55IHNjaGVtYXMgdGhhdA0KLWN1cnJlbnRseSBleGlzdCAtIGl0IHdpbGwgb25seSBhcHBlYXIgaW4gbmV3IHNjaGVtYXMgeW91IGNyZWF0ZSBhZnRlciB5b3UNCi10eXBlIHRoZSBwcmVmaXggYW5kIGNsaWNrIDx1aWNvbnRyb2w+QXBwbHk8L3VpY29udHJvbD4uIEFueSBzY2hlbWFzIHRoYXQgYWxyZWFkeQ0KLWV4aXN0IHdpbGwgaGF2ZSB0aGUgcHJlZml4IHNwZWNpZmllZCBpbiB0aGUgc2NoZW1hIGFwcGxpZWQgdG8gdGhlIFhNTCBzY2hlbWENCi1sYW5ndWFnZSBjb25zdHJ1Y3RzLjwvbm90ZT48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+WW91IGNhbiBjaGFuZ2UgdGhlIDx1aWNvbnRyb2w+RGVmYXVsdCBUYXJnZXQgTmFtZXNwYWNlPC91aWNvbnRyb2w+IHZhbHVlLjwvY21kPg0KLTxpbmZvPlRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhpcyBmaWVsZCB3aWxsIGJlIHRoZSBkZWZhdWx0IHRhcmdldCBuYW1lc3BhY2UNCi1mb3IgYW55IG5ldyBYTUwgc2NoZW1hIGZpbGVzIGNyZWF0ZWQuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjM4MT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJlZi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJlZi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjMyOWVkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByZWYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gc2V0IHZhcmlvdXMgcHJlZmVyZW5jZXMgZm9yIFhNTCBzY2hlbWEgZmlsZXMgc3VjaCBhcyB0aGUgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlIGFuZCBYTUwgU2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgcHJlZml4IHVzZWQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gc2V0IHZhcmlvdXMgcHJlZmVyZW5jZXMgZm9yIFhNTCBzY2hlbWEgZmlsZXMgc3VjaCBhcyB0aGUgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlIGFuZCBYTUwgU2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgcHJlZml4IHVzZWQuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgZWRpdGluZyBwcmVmZXJlbmNlcywgcHJlZmVyZW5jZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGZpbGVzLCBlZGl0aW5nIHByZWZlcmVuY2VzLCBwcmVmZXJlbmNlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGVkdHByZWYiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVkdHByZWYiPjxhIG5hbWU9InRlZHRwcmVmIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiBzZXQgdmFyaW91cyBwcmVmZXJlbmNlcyBmb3IgWE1MIHNjaGVtYSBmaWxlcyBzdWNoIGFzIHRoZQotZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlIGFuZCBYTUwgU2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgcHJlZml4IHVzZWQuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBkZWZpbmUgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nCi1zdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdyAmZ3Q7IFByZWZlcmVuY2VzPC9zcGFuPgotPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotU2NoZW1hIEZpbGVzPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5RdWFsaWZ5IFhNTCBzY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0czwvc3Bhbj4gY2hlY2sKLWJveCBpZiB5b3Ugd2FudCBhIHByZWZpeCBhcHBsaWVkIHRvIGFsbCBYTUwgU2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgaW4KLXlvdXIgWE1MIHNjaGVtYS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIHNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIHByZWZpeDwvc3Bhbj4gZmllbGQsCi10eXBlIHRoZSBwcmVmaXggeW91IHdhbnQgYXBwbGllZCB0byBYTUwgU2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgaW4geW91cgotWE1MIHNjaGVtYS48L3NwYW4+IFRoZSBwcmVmaXggPHNwYW4gY2xhc3M9InVpY29udHJvbCI+eHNkPC9zcGFuPiBpcyB1c2VkIGJ5IGNvbnZlbnRpb24KLXRvIGRlbm90ZSB0aGUgWE1MIFNjaGVtYSBuYW1lc3BhY2UsIGJ1dCBhbnkgcHJlZml4IGNhbiBiZSB1c2VkLiBUaGUgcHVycG9zZQotb2YgdGhlIGFzc29jaWF0aW9uIGlzIHRvIGlkZW50aWZ5IHRoZSBlbGVtZW50cyBhbmQgc2ltcGxlIHR5cGVzIGFzIGJlbG9uZ2luZwotdG8gdGhlIHZvY2FidWxhcnkgb2YgdGhlIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgcmF0aGVyIHRoYW4gdGhlIHZvY2FidWxhcnkgb2YKLXRoZSBzY2hlbWEgYXV0aG9yLiAgPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRoaXMgcHJlZml4IHdpbGwgbm90IGFwcGVhciBpbiBhbnkgc2NoZW1hcyB0aGF0Ci1jdXJyZW50bHkgZXhpc3QgLSBpdCB3aWxsIG9ubHkgYXBwZWFyIGluIG5ldyBzY2hlbWFzIHlvdSBjcmVhdGUgYWZ0ZXIgeW91Ci10eXBlIHRoZSBwcmVmaXggYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGx5PC9zcGFuPi4gQW55IHNjaGVtYXMgdGhhdCBhbHJlYWR5Ci1leGlzdCB3aWxsIGhhdmUgdGhlIHByZWZpeCBzcGVjaWZpZWQgaW4gdGhlIHNjaGVtYSBhcHBsaWVkIHRvIHRoZSBYTUwgc2NoZW1hCi1sYW5ndWFnZSBjb25zdHJ1Y3RzLjwvZGl2PgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3UgY2FuIGNoYW5nZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVmYXVsdCBUYXJnZXQgTmFtZXNwYWNlPC9zcGFuPiB2YWx1ZS48L3NwYW4+Ci0gVGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGlzIGZpZWxkIHdpbGwgYmUgdGhlIGRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZQotZm9yIGFueSBuZXcgWE1MIHNjaGVtYSBmaWxlcyBjcmVhdGVkLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIiAvPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NobS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NobS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2YyYjk1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaG0uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA4LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0ZWR0c2NobSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkFmdGVyIHlvdSBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiBlZGl0IGl0cyB2YXJpb3VzDQotcHJvcGVydGllcywgc3VjaCBhcyBpdHMgbmFtZXNwYWNlIGFuZCBwcmVmaXguPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPlhNTCBzY2hlbWEgcHJvcGVydGllczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+ZWRpdGluZyBwcm9wZXJ0aWVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD48P1B1YiBDYXJldDE/PlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbg0KLWZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXINCi1wZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGVkaXQgYW4gWE1MIHNjaGVtYSdzIHByb3BlcnRpZXMsIGNvbXBsZXRlIHRoZQ0KLWZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNyZWF0ZSBhIG5ldyBYTUwgc2NoZW1hIG9yIGRvdWJsZS1jbGljayBhbiBleGlzdGluZyBzY2hlbWENCi1pbiB0aGUgTmF2aWdhdG9yIHZpZXcuPC9jbWQ+PGluZm8+IEl0IHdpbGwgYXV0b21hdGljYWxseSBvcGVuIGluIHRoZQ0KLVhNTCBzY2hlbWEgZWRpdG9yLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCBjbGljayA8dWljb250cm9sPkRpcmVjdGl2ZXM8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPiB0YWIuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+WW91IGNhbiBjaGFuZ2UgdGhlIDx1aWNvbnRyb2w+UHJlZml4PC91aWNvbnRyb2w+IGFzc29jaWF0ZWQNCi13aXRoIHRoZSBjdXJyZW50IG5hbWVzcGFjZS4gPC9jbWQ+PGluZm8+RWxlbWVudCBhbmQgYXR0cmlidXRlIG5hbWVzDQotdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmFtZXNwYWNlIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCB0aGlzDQotdmFsdWUuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPllvdSBjYW4gYWxzbyBlZGl0IHRoZSA8dWljb250cm9sPlRhcmdldCBuYW1lc3BhY2U8L3VpY29udHJvbD4gZm9yDQotdGhpcyBzY2hlbWEuPC9jbWQ+PGluZm8+IEEgbmFtZXNwYWNlIGlzIGEgVVJJIHRoYXQgcHJvdmlkZXMgYSB1bmlxdWUNCi1uYW1lIHRvIGFzc29jaWF0ZSB3aXRoIGFsbCB0aGUgZWxlbWVudHMgYW5kIHR5cGUgZGVmaW5pdGlvbnMgaW4gYQ0KLXNjaGVtYS48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91DQotd2FudCB0byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFhNTCBzY2hlbWEuIDwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdQ0KLXdhbnQgdG8gYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2YNCi1zY2hlbWEgY29tcG9uZW50cy4gPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlDQotYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBzY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5BZHZhbmNlZDwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBkZWZpbmUgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHNjaGVtYSBhdHRyaWJ1dGVzOiA8L2NtZD48aW5mbz48dWw+DQotPGxpPjx1aWNvbnRyb2w+UHJlZml4IGZvciBlbGVtZW50czwvdWljb250cm9sPiAoZWxlbWVudEZvcm1EZWZhdWx0KTwvbGk+DQotPGxpPjx1aWNvbnRyb2w+UHJlZml4IGZvciBhdHRyaWJ1dGVzPC91aWNvbnRyb2w+IChhdHRyaWJ1dGVGb3JtRGVmYXVsdCk8L2xpPg0KLTxsaT48dWljb250cm9sPkJsb2NrIGRlZmF1bHQ8L3VpY29udHJvbD4gKGJsb2NrRGVmYXVsdCk8L2xpPg0KLTxsaT48dWljb250cm9sPkZpbmFsIGRlZmF1bHQ8L3VpY29udHJvbD4gKGZpbmFsRGVmYXVsdCk8L2xpPg0KLTwvdWw+PC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyNzgwPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzY2htLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzY2htLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDVhZTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NobS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQWZ0ZXIgeW91IGNyZWF0ZSBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIGVkaXQgaXRzIHZhcmlvdXMgcHJvcGVydGllcywgc3VjaCBhcyBpdHMgbmFtZXNwYWNlIGFuZCBwcmVmaXguIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkFmdGVyIHlvdSBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiBlZGl0IGl0cyB2YXJpb3VzIHByb3BlcnRpZXMsIHN1Y2ggYXMgaXRzIG5hbWVzcGFjZSBhbmQgcHJlZml4LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBYTUwgc2NoZW1hIHByb3BlcnRpZXMsIFhNTCBzY2hlbWEgZmlsZXMsIGVkaXRpbmcgcHJvcGVydGllcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBYTUwgc2NoZW1hIHByb3BlcnRpZXMsIFhNTCBzY2hlbWEgZmlsZXMsIGVkaXRpbmcgcHJvcGVydGllcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGVkdHNjaG0iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVkdHNjaG0iPjxhIG5hbWU9InRlZHRzY2htIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QWZ0ZXIgeW91IGNyZWF0ZSBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIGVkaXQgaXRzIHZhcmlvdXMKLXByb3BlcnRpZXMsIHN1Y2ggYXMgaXRzIG5hbWVzcGFjZSBhbmQgcHJlZml4LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuCi1mb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyCi1wZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gZWRpdCBhbiBYTUwgc2NoZW1hJ3MgcHJvcGVydGllcywgY29tcGxldGUgdGhlCi1mb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q3JlYXRlIGEgbmV3IFhNTCBzY2hlbWEgb3IgZG91YmxlLWNsaWNrIGFuIGV4aXN0aW5nIHNjaGVtYQotaW4gdGhlIE5hdmlnYXRvciB2aWV3Ljwvc3Bhbj4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBvcGVuIGluIHRoZQotWE1MIHNjaGVtYSBlZGl0b3IuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EaXJlY3RpdmVzPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPiB0YWIuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3UgY2FuIGNoYW5nZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZml4PC9zcGFuPiBhc3NvY2lhdGVkCi13aXRoIHRoZSBjdXJyZW50IG5hbWVzcGFjZS4gPC9zcGFuPiBFbGVtZW50IGFuZCBhdHRyaWJ1dGUgbmFtZXMKLXRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhpcwotdmFsdWUuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3UgY2FuIGFsc28gZWRpdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VGFyZ2V0IG5hbWVzcGFjZTwvc3Bhbj4gZm9yCi10aGlzIHNjaGVtYS48L3NwYW4+ICBBIG5hbWVzcGFjZSBpcyBhIFVSSSB0aGF0IHByb3ZpZGVzIGEgdW5pcXVlCi1uYW1lIHRvIGFzc29jaWF0ZSB3aXRoIGFsbCB0aGUgZWxlbWVudHMgYW5kIHR5cGUgZGVmaW5pdGlvbnMgaW4gYQotc2NoZW1hLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3UKLXdhbnQgdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBYTUwgc2NoZW1hLiA8L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdQotd2FudCB0byBhZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZgotc2NoZW1hIGNvbXBvbmVudHMuIDwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UKLWFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkdmFuY2VkPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIGRlZmluZSB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgc2NoZW1hIGF0dHJpYnV0ZXM6IDwvc3Bhbj4gPHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZpeCBmb3IgZWxlbWVudHM8L3NwYW4+IChlbGVtZW50Rm9ybURlZmF1bHQpPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZpeCBmb3IgYXR0cmlidXRlczwvc3Bhbj4gKGF0dHJpYnV0ZUZvcm1EZWZhdWx0KTwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5CbG9jayBkZWZhdWx0PC9zcGFuPiAoYmxvY2tEZWZhdWx0KTwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5hbCBkZWZhdWx0PC9zcGFuPiAoZmluYWxEZWZhdWx0KTwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wc2NobS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wc2NobS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDAxNGVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHNjaG0uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGltcHNjaG0iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkltcG9ydGluZyBYTUwgc2NoZW1hczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+SW1wb3J0aW5nIFhNTCBzY2hlbWFzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPklmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBYTUwgc2NoZW1hIGZpbGVzIHRoYXQgeW91IGNyZWF0ZWQgb3V0c2lkZQ0KLW9mIHRoZSBwcm9kdWN0LCB5b3UgY2FuIGltcG9ydCB0aGVtIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbiB0aGVtIGluIHRoZQ0KLVhNTCBzY2hlbWEgZWRpdG9yLiBUaGUgWE1MIHNjaGVtYSBlZGl0b3IgcHJvdmlkZXMgeW91IHdpdGggYSBzdHJ1Y3R1cmVkIHZpZXcNCi1vZiB0aGUgWE1MIHNjaGVtYS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5pbXBvcnRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBpbXBvcnQgYW4gWE1MDQotc2NoZW1hIGludG8gdGhlIHdvcmtiZW5jaCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkZpbGUgPiBJbXBvcnQ8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPjx1aWNvbnRyb2w+RmlsZQ0KLVN5c3RlbTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IGFuZCBjbGljayAgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IG9uIHRoZSBuZXh0IHBhZ2Ugb2YgdGhlIHdpemFyZA0KLXRvIHNlbGVjdCB0aGUgZGlyZWN0b3JpZXMgZnJvbSB3aGljaCB5b3Ugd291bGQgbGlrZSB0byBhZGQgdGhlIFhNTCBzY2hlbWEuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIGltcG9ydCBzZWxlY3Rpb24gcGFuZXMsIHVzZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgdG8gc2VsZWN0DQotZXhhY3RseSB0aGUgcmVzb3VyY2VzIHlvdSB3YW50IHRvIGFkZDogIDwvY21kPjxpbmZvPjx1bD4NCi08bGk+RXhwYW5kIHRoZSBoaWVyYXJjaGllcyBpbiB0aGUgbGVmdCBwYW5lIGFuZCBzZWxlY3Qgb3IgY2xlYXIgdGhlIGNoZWNrYm94ZXMNCi10aGF0IHJlcHJlc2VudCB0aGUgZm9sZGVycyBpbiB0aGUgc2VsZWN0ZWQgZGlyZWN0b3J5LiBUaGVuIGluIHRoZSByaWdodCBwYW5lLA0KLXNlbGVjdCBvciBjbGVhciBjaGVjayBib3hlcyBmb3IgaW5kaXZpZHVhbCBmaWxlcy48L2xpPg0KLTxsaT5DbGljayA8dWljb250cm9sPkZpbHRlciBUeXBlczwvdWljb250cm9sPiB0byBmaWx0ZXIgdGhlIGN1cnJlbnQgc2VsZWN0aW9uDQotZm9yIGZpbGVzIG9mIGEgc3BlY2lmaWMgdHlwZS48L2xpPg0KLTxsaT5DbGljayA8dWljb250cm9sPlNlbGVjdCBBbGw8L3VpY29udHJvbD4gdG8gc2VsZWN0IGFsbCByZXNvdXJjZXMgaW4gdGhlDQotZGlyZWN0b3J5LCB0aGVuIGdvIHRocm91Z2ggYW5kIGRlc2VsZWN0IHRoZSBvbmVzIHRoYXQgeW91IGRvIG5vdCB3YW50IHRvIGFkZC48L2xpPg0KLTxsaT5DbGljayA8dWljb250cm9sPkRlc2VsZWN0IEFsbDwvdWljb250cm9sPiB0byBkZXNlbGVjdCBhbGwgcmVzb3VyY2VzIGluDQotdGhlIGRpcmVjdG9yeSwgdGhlbiBnbyB0aHJvdWdoIGFuZCBjaG9vc2UgaW5kaXZpZHVhbCByZXNvdXJjZXMgdG8gYWRkLjwvbGk+DQotPC91bD48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+SW50byBmb2xkZXI8L3VpY29udHJvbD4gZmllbGQsIHNwZWNpZnkgdGhlIFdvcmtiZW5jaA0KLXByb2plY3Qgb3IgZm9sZGVyIHRoYXQgd2lsbCBiZSB0aGUgaW1wb3J0IGRlc3RpbmF0aW9uLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPldoZW4geW91IGhhdmUgZmluaXNoZWQgc3BlY2lmeWluZyB5b3VyIGltcG9ydCBvcHRpb25zLCBjbGljayA8dWljb250cm9sPkZpbmlzaC48L3VpY29udHJvbD48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz48P1B1YiBDYXJldDE/Pg0KLTxyZXN1bHQ+PHA+VGhlIGltcG9ydGVkIHNjaGVtYSBub3cgYXBwZWFycyBpbiB0aGUgTmF2aWdhdG9yIHZpZXcuIERvdWJsZS1jbGljaw0KLWl0IHRvIG9wZW4gaXQgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjYxNj8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wc2NobS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wc2NobS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGYzOGE4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHNjaG0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOSIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJJbXBvcnRpbmcgWE1MIHNjaGVtYXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSWYgeW91IHdhbnQgdG8gd29yayB3aXRoIFhNTCBzY2hlbWEgZmlsZXMgdGhhdCB5b3UgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBwcm9kdWN0LCB5b3UgY2FuIGltcG9ydCB0aGVtIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbiB0aGVtIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVGhlIFhNTCBzY2hlbWEgZWRpdG9yIHByb3ZpZGVzIHlvdSB3aXRoIGEgc3RydWN0dXJlZCB2aWV3IG9mIHRoZSBYTUwgc2NoZW1hLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiB5b3Ugd2FudCB0byB3b3JrIHdpdGggWE1MIHNjaGVtYSBmaWxlcyB0aGF0IHlvdSBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIHByb2R1Y3QsIHlvdSBjYW4gaW1wb3J0IHRoZW0gaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuIHRoZW0gaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiBUaGUgWE1MIHNjaGVtYSBlZGl0b3IgcHJvdmlkZXMgeW91IHdpdGggYSBzdHJ1Y3R1cmVkIHZpZXcgb2YgdGhlIFhNTCBzY2hlbWEuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgaW1wb3J0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgaW1wb3J0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRzY2htLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sc2NlZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHZkdHNjaG0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRpbXB0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkaW5jbC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRpbXBzY2htIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+SW1wb3J0aW5nIFhNTCBzY2hlbWFzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0aW1wc2NobSI+PGEgbmFtZT0idGltcHNjaG0iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkltcG9ydGluZyBYTUwgc2NoZW1hczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+SWYgeW91IHdhbnQgdG8gd29yayB3aXRoIFhNTCBzY2hlbWEgZmlsZXMgdGhhdCB5b3UgY3JlYXRlZCBvdXRzaWRlCi1vZiB0aGUgcHJvZHVjdCwgeW91IGNhbiBpbXBvcnQgdGhlbSBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW4gdGhlbSBpbiB0aGUKLVhNTCBzY2hlbWEgZWRpdG9yLiBUaGUgWE1MIHNjaGVtYSBlZGl0b3IgcHJvdmlkZXMgeW91IHdpdGggYSBzdHJ1Y3R1cmVkIHZpZXcKLW9mIHRoZSBYTUwgc2NoZW1hLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBpbXBvcnQgYW4gWE1MCi1zY2hlbWEgaW50byB0aGUgd29ya2JlbmNoLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZSAmZ3Q7IEltcG9ydDwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlCi1TeXN0ZW08L3NwYW4+PC9zcGFuPiBhbmQgY2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiBvbiB0aGUgbmV4dCBwYWdlIG9mIHRoZSB3aXphcmQKLXRvIHNlbGVjdCB0aGUgZGlyZWN0b3JpZXMgZnJvbSB3aGljaCB5b3Ugd291bGQgbGlrZSB0byBhZGQgdGhlIFhNTCBzY2hlbWEuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgaW1wb3J0IHNlbGVjdGlvbiBwYW5lcywgdXNlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0byBzZWxlY3QKLWV4YWN0bHkgdGhlIHJlc291cmNlcyB5b3Ugd2FudCB0byBhZGQ6ICA8L3NwYW4+IDx1bD4KLTxsaT5FeHBhbmQgdGhlIGhpZXJhcmNoaWVzIGluIHRoZSBsZWZ0IHBhbmUgYW5kIHNlbGVjdCBvciBjbGVhciB0aGUgY2hlY2tib3hlcwotdGhhdCByZXByZXNlbnQgdGhlIGZvbGRlcnMgaW4gdGhlIHNlbGVjdGVkIGRpcmVjdG9yeS4gVGhlbiBpbiB0aGUgcmlnaHQgcGFuZSwKLXNlbGVjdCBvciBjbGVhciBjaGVjayBib3hlcyBmb3IgaW5kaXZpZHVhbCBmaWxlcy48L2xpPgotCi08bGk+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsdGVyIFR5cGVzPC9zcGFuPiB0byBmaWx0ZXIgdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi1mb3IgZmlsZXMgb2YgYSBzcGVjaWZpYyB0eXBlLjwvbGk+Ci0KLTxsaT5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TZWxlY3QgQWxsPC9zcGFuPiB0byBzZWxlY3QgYWxsIHJlc291cmNlcyBpbiB0aGUKLWRpcmVjdG9yeSwgdGhlbiBnbyB0aHJvdWdoIGFuZCBkZXNlbGVjdCB0aGUgb25lcyB0aGF0IHlvdSBkbyBub3Qgd2FudCB0byBhZGQuPC9saT4KLQotPGxpPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlc2VsZWN0IEFsbDwvc3Bhbj4gdG8gZGVzZWxlY3QgYWxsIHJlc291cmNlcyBpbgotdGhlIGRpcmVjdG9yeSwgdGhlbiBnbyB0aHJvdWdoIGFuZCBjaG9vc2UgaW5kaXZpZHVhbCByZXNvdXJjZXMgdG8gYWRkLjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbnRvIGZvbGRlcjwvc3Bhbj4gZmllbGQsIHNwZWNpZnkgdGhlIFdvcmtiZW5jaAotcHJvamVjdCBvciBmb2xkZXIgdGhhdCB3aWxsIGJlIHRoZSBpbXBvcnQgZGVzdGluYXRpb24uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+V2hlbiB5b3UgaGF2ZSBmaW5pc2hlZCBzcGVjaWZ5aW5nIHlvdXIgaW1wb3J0IG9wdGlvbnMsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaC48L3NwYW4+PC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGltcG9ydGVkIHNjaGVtYSBub3cgYXBwZWFycyBpbiB0aGUgTmF2aWdhdG9yIHZpZXcuIERvdWJsZS1jbGljawotaXQgdG8gb3BlbiBpdCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxzY2VkLmh0bWwiIHRpdGxlPSJUaGlzIHByb2R1Y3QgcHJvdmlkZXMgYW4gWE1MIHNjaGVtYSBlZGl0b3IgZm9yIGNyZWF0aW5nLCB2aWV3aW5nLCBhbmQgdmFsaWRhdGluZyBYTUwgc2NoZW1hcy4gWE1MIHNjaGVtYXMgYXJlIGEgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iPlhNTCBzY2hlbWEgZWRpdG9yPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0c2NobS5odG1sIiB0aXRsZT0iQWZ0ZXIgeW91IGNyZWF0ZSBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIGVkaXQgaXRzIHZhcmlvdXMgcHJvcGVydGllcywgc3VjaCBhcyBpdHMgbmFtZXNwYWNlIGFuZCBwcmVmaXguIj5FZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R2ZHRzY2htLmh0bWwiIHRpdGxlPSJWYWxpZGF0aW5nIGFuIFhNTCBzY2hlbWEgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgc2VtYW50aWNhbGx5IHZhbGlkLiBBbnkgZXJyb3JzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiI+VmFsaWRhdGluZyBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRpbXB0Lmh0bWwiIHRpdGxlPSJJZiB5b3VyIHNjaGVtYXMgYXJlIGxhcmdlLCB5b3UgbWlnaHQgY2hvb3NlIHRvIGRpdmlkZSB0aGVpciBjb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyB0byBtYWtlIHRoZW0gZWFzaWVyIHRvIG1haW50YWluLCByZXVzZSwgYW5kIHJlYWQuIFlvdSBjYW4gdXNlIGFuIGltcG9ydCBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSBhbiBpbXBvcnRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIj5BZGRpbmcgaW1wb3J0IGVsZW1lbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGluY2wuaHRtbCIgdGl0bGU9IklmIHlvdXIgc2NoZW1hcyBhcmUgbGFyZ2UsIHlvdSBtaWdodCBjaG9vc2UgdG8gZGl2aWRlIHRoZWlyIGNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIHRvIG1ha2UgdGhlbSBlYXNpZXIgdG8gbWFpbnRhaW4sIHJldXNlLCBhbmQgcmVhZC4gWW91IGNhbiB1c2UgdGhlIGluY2x1ZGUgZWxlbWVudCB0byBicmluZyBpbiBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20gdGhlIGluY2x1ZGVkIHNjaGVtYSBpbnRvIHRoZSBjdXJyZW50IHNjaGVtYS4gVGhlIGluY2x1ZGVkIHNjaGVtYSBtdXN0IGJlIGluIHRoZSBzYW1lIHRhcmdldCBuYW1lc3BhY2UgYXMgdGhlIGluY2x1ZGluZyBzY2hlbWEuIj5BZGRpbmcgaW5jbHVkZSBlbGVtZW50czwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RuYXZzcmMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdG5hdnNyYy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDM4NmQxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdG5hdnNyYy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0bmF2c3JjIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5OYXZpZ2F0aW5nIFhNTCBzY2hlbWFzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5OYXZpZ2F0aW5nIFhNTCBzY2hlbWFzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPldoZW4geW91IGFyZSB3b3JraW5nIGluIHRoZSBTb3VyY2UgdmlldywgeW91IGNhbiB1c2UgRjMgdG8gbmF2aWdhdGUNCi10aHJvdWdoIHRoZSBmaWxlIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW4gdGhlIGFwcHJvcHJpYXRlIGl0ZW0gYW5kIHByZXNzaW5nDQotRjMgdG8ganVtcCB0byB0aGUgaXRlbSBpdCByZWZlcnMgdG8uIDwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPm5hdmlnYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPllvdSBjYW4ganVtcCB0byBhbnkgb2YgdGhlIGZvbGxvd2luZyBpdGVtczo8L3A+PHVsPg0KLTxsaT5FbGVtZW50IG9yIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbidzIHR5cGU8L2xpPg0KLTxsaT5FbGVtZW50IHJlZmVyZW5jZXM8L2xpPg0KLTxsaT5Hcm91cCByZWZlcmVuY2VzPC9saT4NCi08bGk+QXR0cmlidXRlIHJlZmVyZW5jZXM8L2xpPg0KLTxsaT5BdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlczwvbGk+DQotPGxpPkltcG9ydCwgaW5jbHVkZSwgYW5kIHJlZGVmaW5lIGVsZW1lbnQgKHRoZSBleHRlcm5hbCBzY2hlbWEgd2lsbCBvcGVuIGluDQotdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiBUaGlzIG9ubHkgd29ya3Mgd2l0aCBzY2hlbWFzIGluIHRoZSB3b3Jrc3BhY2UpLjwvbGk+DQotPGxpPjwvbGk+DQotPC91bD48cD5Zb3U8P1B1YiBDYXJldD8+IG11c3QgcGxhY2UgeW91ciBjdXJzb3IgZXhhY3RseSBpbiB0aGUgbG9jYXRpb24gb2YNCi10aGUgcmVmZXJlbmNlIChmb3IgZXhhbXBsZSBiZXR3ZWVuIHRoZSBkb3VibGUgcXVvdGVzIGZvciA8c3lzdGVtb3V0cHV0PnR5cGUNCi09ICIgIjwvc3lzdGVtb3V0cHV0PiBvciAgPHN5c3RlbW91dHB1dD5iYXNlID0gIiAiPC9zeXN0ZW1vdXRwdXQ+KS48L3A+PHA+Rm9yDQotZXhhbXBsZSwgaWYgeW91IHBsYWNlIHlvdXIgY3Vyc29yIGFueXdoZXJlIGluIHRoZSBmb2xsb3dpbmcgdGV4dCBhbmQgcHJlc3MNCi1GMzo8L3A+PHA+IDxzeXN0ZW1vdXRwdXQ+Jmx0O2VsZW1lbnQgbmFtZT0ic2hpcFRvIiB0eXBlPSJwbzpVU0FkZHJlc3MiPiZsdDsvZWxlbWVudD48L3N5c3RlbW91dHB1dD4gPC9wPjxwPnRoZQ0KLWN1cnNvciB3aWxsIGF1dG9tYXRpY2FsbHkganVtcCB0byB0aGUgbG9jYXRpb24gaW4gdGhlIGZpbGUgd2hlcmUgdGhlIHR5cGUNCi1VU0FkZHJlc3MgaXMgZGVmaW5lZC48L3A+PHA+T3IsIGlmIHlvdSBwbGFjZSB5b3VyIGN1cnNvciBhbnl3aGVyZSBpbiB0aGUgZm9sbG93aW5nDQotdGV4dCBhbmQgY2xpY2sgRjM6PC9wPjxwPiA8c3lzdGVtb3V0cHV0PiZsdDtlbGVtZW50IHJlZj0icG86Q29udGFjdEVsZW1lbnQiPiZsdDsvZWxlbWVudD48L3N5c3RlbW91dHB1dD4gPC9wPjxwPnRoZQ0KLWN1cnNvciB3aWxsIGF1dG9tYXRpY2FsbHkganVtcCB0byB0aGUgbG9jYXRpb24gaW4gdGhlIGZpbGUgd2hlcmUgdGhlIGdsb2JhbA0KLWVsZW1lbnQgQ29udGFjdEVsZW1lbnQgaXMgZGVmaW5lZC48L3A+PHA+VGhpcyB3b3JrcyBhY3Jvc3MgZmlsZXMuIEZvciBleGFtcGxlLA0KLWlmIHRoZSB0eXBlIHlvdSBoYXZlIHNlbGVjdGVkIGlzIGRlZmluZWQgaW4gYW5vdGhlciBYTUwgc2NoZW1hIGFuZCB5b3UgY2xpY2sNCi1GMywgeW91IHdpbGwgYXV0b21hdGljYWxseSBiZSB0YWtlbiB0byB0aGF0IGZpbGUuPC9wPjwvY29udGV4dD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjA2Nj8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90bmF2c3JjLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RuYXZzcmMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFlNGRmMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RuYXZzcmMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik5hdmlnYXRpbmcgWE1MIHNjaGVtYXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iV2hlbiB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlIFNvdXJjZSB2aWV3LCB5b3UgY2FuIHVzZSBGMyB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSBmaWxlIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW4gdGhlIGFwcHJvcHJpYXRlIGl0ZW0gYW5kIHByZXNzaW5nIEYzIHRvIGp1bXAgdG8gdGhlIGl0ZW0gaXQgcmVmZXJzIHRvLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJXaGVuIHlvdSBhcmUgd29ya2luZyBpbiB0aGUgU291cmNlIHZpZXcsIHlvdSBjYW4gdXNlIEYzIHRvIG5hdmlnYXRlIHRocm91Z2ggdGhlIGZpbGUgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbiB0aGUgYXBwcm9wcmlhdGUgaXRlbSBhbmQgcHJlc3NpbmcgRjMgdG8ganVtcCB0byB0aGUgaXRlbSBpdCByZWZlcnMgdG8uIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgbmF2aWdhdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIG5hdmlnYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbHNjZWQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0bmF2c3JjIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+TmF2aWdhdGluZyBYTUwgc2NoZW1hczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idG5hdnNyYyI+PGEgbmFtZT0idG5hdnNyYyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TmF2aWdhdGluZyBYTUwgc2NoZW1hczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+V2hlbiB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlIFNvdXJjZSB2aWV3LCB5b3UgY2FuIHVzZSBGMyB0byBuYXZpZ2F0ZQotdGhyb3VnaCB0aGUgZmlsZSBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluIHRoZSBhcHByb3ByaWF0ZSBpdGVtIGFuZCBwcmVzc2luZwotRjMgdG8ganVtcCB0byB0aGUgaXRlbSBpdCByZWZlcnMgdG8uIDwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WW91IGNhbiBqdW1wIHRvIGFueSBvZiB0aGUgZm9sbG93aW5nIGl0ZW1zOjwvcD4KLTx1bD4KLTxsaT5FbGVtZW50IG9yIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbidzIHR5cGU8L2xpPgotCi08bGk+RWxlbWVudCByZWZlcmVuY2VzPC9saT4KLQotPGxpPkdyb3VwIHJlZmVyZW5jZXM8L2xpPgotCi08bGk+QXR0cmlidXRlIHJlZmVyZW5jZXM8L2xpPgotCi08bGk+QXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZXM8L2xpPgotCi08bGk+SW1wb3J0LCBpbmNsdWRlLCBhbmQgcmVkZWZpbmUgZWxlbWVudCAodGhlIGV4dGVybmFsIHNjaGVtYSB3aWxsIG9wZW4gaW4KLXRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVGhpcyBvbmx5IHdvcmtzIHdpdGggc2NoZW1hcyBpbiB0aGUgd29ya3NwYWNlKS48L2xpPgotCi08bGkgLz4KLQotPC91bD4KLTxwPllvdSBtdXN0IHBsYWNlIHlvdXIgY3Vyc29yIGV4YWN0bHkgaW4gdGhlIGxvY2F0aW9uIG9mCi10aGUgcmVmZXJlbmNlIChmb3IgZXhhbXBsZSBiZXR3ZWVuIHRoZSBkb3VibGUgcXVvdGVzIGZvciA8dHQgY2xhc3M9InN5c291dCI+dHlwZQotPSAiICI8L3R0PiBvciAgPHR0IGNsYXNzPSJzeXNvdXQiPmJhc2UgPSAiICI8L3R0PikuPC9wPgotPHA+Rm9yCi1leGFtcGxlLCBpZiB5b3UgcGxhY2UgeW91ciBjdXJzb3IgYW55d2hlcmUgaW4gdGhlIGZvbGxvd2luZyB0ZXh0IGFuZCBwcmVzcwotRjM6PC9wPgotPHA+IDx0dCBjbGFzcz0ic3lzb3V0Ij4mbHQ7ZWxlbWVudCBuYW1lPSJzaGlwVG8iIHR5cGU9InBvOlVTQWRkcmVzcyImZ3Q7Jmx0Oy9lbGVtZW50Jmd0OzwvdHQ+IDwvcD4KLTxwPnRoZQotY3Vyc29yIHdpbGwgYXV0b21hdGljYWxseSBqdW1wIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUgZmlsZSB3aGVyZSB0aGUgdHlwZQotVVNBZGRyZXNzIGlzIGRlZmluZWQuPC9wPgotPHA+T3IsIGlmIHlvdSBwbGFjZSB5b3VyIGN1cnNvciBhbnl3aGVyZSBpbiB0aGUgZm9sbG93aW5nCi10ZXh0IGFuZCBjbGljayBGMzo8L3A+Ci08cD4gPHR0IGNsYXNzPSJzeXNvdXQiPiZsdDtlbGVtZW50IHJlZj0icG86Q29udGFjdEVsZW1lbnQiJmd0OyZsdDsvZWxlbWVudCZndDs8L3R0PiA8L3A+Ci08cD50aGUKLWN1cnNvciB3aWxsIGF1dG9tYXRpY2FsbHkganVtcCB0byB0aGUgbG9jYXRpb24gaW4gdGhlIGZpbGUgd2hlcmUgdGhlIGdsb2JhbAotZWxlbWVudCBDb250YWN0RWxlbWVudCBpcyBkZWZpbmVkLjwvcD4KLTxwPlRoaXMgd29ya3MgYWNyb3NzIGZpbGVzLiBGb3IgZXhhbXBsZSwKLWlmIHRoZSB0eXBlIHlvdSBoYXZlIHNlbGVjdGVkIGlzIGRlZmluZWQgaW4gYW5vdGhlciBYTUwgc2NoZW1hIGFuZCB5b3UgY2xpY2sKLUYzLCB5b3Ugd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHRha2VuIHRvIHRoYXQgZmlsZS48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbHNjZWQuaHRtbCIgdGl0bGU9IlRoaXMgcHJvZHVjdCBwcm92aWRlcyBhbiBYTUwgc2NoZW1hIGVkaXRvciBmb3IgY3JlYXRpbmcsIHZpZXdpbmcsIGFuZCB2YWxpZGF0aW5nIFhNTCBzY2hlbWFzLiBYTUwgc2NoZW1hcyBhcmUgYSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiI+WE1MIHNjaGVtYSBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90cmVmYWN0clhTRC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90cmVmYWN0clhTRC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzM2YTRhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHJlZmFjdHJYU0QuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0icmVmYWN0b3JpbmciIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+V2l0aGluIGFuIFhNTCBTY2hlbWEgZmlsZSwgcmVmYWN0b3JpbmcgYWxsb3dzIGF1dGhvcnMgdG8gbWFrZSBhDQotc2luZ2xlIGFydGlmYWN0IGNoYW5nZSwgYW5kIGhhdmUgdGhhdCBjaGFuZ2UgaW1wbGVtZW50ZWQgdGhyb3VnaG91dCBhbGwgb3RoZXINCi1kZXBlbmRhbnQgYXJ0aWZhY3RzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0idHJlZmFjdHJYU0R8MXxkZXBlbmRlbnRhcnRpZmFjdHNyZWZhY3RvcnRpbmdYTUxzY2hlbWFmaWxlcyINCi1zdGF0dXM9Im5ldyI+ZGVwZW5kZW50IGFydGlmYWN0czxpbmRleHRlcm0+cmVmYWN0b3JpbmcgWE1MIHNjaGVtYSBmaWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0ga2V5cmVmPSJ0cmVmYWN0clhTRHwyfHJlZmFjdG9yaW5nWE1Mc2NoZW1hZmlsZXMiIHN0YXR1cz0ibmV3Ij5yZWZhY3RvcmluZzxpbmRleHRlcm0+WE1MDQotc2NoZW1hIGZpbGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybSBrZXlyZWY9InRyZWZhY3RyWFNEfDN8cmVuYW1pbmdYTUxzY2hlbWFmaWxlcyINCi1zdGF0dXM9Im5ldyI+cmVuYW1pbmc8aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtDQota2V5cmVmPSJ0cmVmYWN0clhTRHw0fFhNTHNjaGVtYXNlZGl0aW5nIiBzdGF0dXM9ImNoYW5nZWQiPnNjaGVtYXM8aW5kZXh0ZXJtPmVkaXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxwcmVyZXE+PC9wcmVyZXE+DQotPGNvbnRleHQ+UmVmYWN0b3JpbmcgZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgdGhlIHRlZGlvdXMgZWRpdGluZyBuZWNlc3NhcnkNCi10byByZWNvdmVyIGJyb2tlbiBkZXBlbmRlbmNpZXMgY2F1c2VkIGJ5IGFydGlmYWN0IGNoYW5nZXMgd2hpY2ggY2F1c2UgcmlwcGxlDQotZWZmZWN0cyBvbiBvdGhlciBkZXBlbmRhbnQgYXJ0aWZhY3RzIChzdWNoIGFzIHJlbmFtaW5nIGFuIFhNTCBTY2hlbWEgZWxlbWVudCkuPC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNyZWF0ZSBhIG5ldyBYTUwgc2NoZW1hIG9yIGRvdWJsZS1jbGljayBhbiBleGlzdGluZyBzY2hlbWEgaW4gdGhlDQotTmF2aWdhdG9yIHZpZXcuPC9jbWQ+PGluZm8+IEl0IHdpbGwgYXV0b21hdGljYWxseSBvcGVuIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gcmVmYWN0b3IgYW4gYXJ0aWZhY3QsIHBvc2l0aW9uIGN1cnNvciB3aXRoaW4gdGhlIGFydGlmYWN0LCByaWdodC1jbGljaw0KLXRoZSBhcnRpZmFjdCwgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+UmVmYWN0b3I8L3VpY29udHJvbD48dWljb250cm9sPlJlbmFtZTwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+PC9jbWQ+PGluZm8+QSBwb3B1cCBkaWFsb2cgd2lsbCByZXF1ZXN0IHRoZSBlbnRyeSBvZiBhIG5ldyBuYW1lDQotZm9yIHRoYXQgYXJ0aWZhY3Q8L2luZm8+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+VHlwZSBpbiB0aGUgbmV3IG5hbWUgb2YgdGhlIGFydGlmYWN0LjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPihPcHRpb25hbCkgQ2xpY2sgPGI+UHJldmlldzwvYj4uPC9jbWQ+PGluZm8+QSB3aW5kb3cgd2lsbCBvcGVuDQotaW5kaWNhdGluZyBhbGwgb2YgdGhlIGNoYW5nZXMgd2hpY2ggd2lsbCB0YWtlIHBsYWNlIGR1ZSB0byB0aGUgcmVmYWN0b3JpbmcuPC9pbmZvPg0KLTwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0suPC91aWNvbnRyb2w+PC9jbWQ+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD5UaGUgbmV3IG5hbWUgd2lsbCBiZSBlbnRlcmVkIGluIHRoZSBvcGVuZWQgWFNEIHNvdXJjZSwgYXMgd2VsbCBhcw0KLWluIGFsbCBkZXBlbmRhbnQgYXJ0aWZhY3RzLjwvcmVzdWx0Pg0KLTxleGFtcGxlPjxiPjx1PkNvbXBvbmVudCBSZWZlcmVuY2VzIGluIFhNTCBTY2hlbWE8L3U+PC9iPjxzaW1wbGV0YWJsZT4NCi08c3RoZWFkPg0KLTxzdGVudHJ5Pkdsb2JhbCBuYW1lZCBjb21wb25lbnRzPC9zdGVudHJ5Pg0KLTxzdGVudHJ5PlJlZmVyZW5jZTwvc3RlbnRyeT4NCi08L3N0aGVhZD4NCi08c3Ryb3c+DQotPHN0ZW50cnk+PHVsPg0KLTxsaT4mbHQ7ZWxlbWVudCBuYW1lPSJmb28iPjwvbGk+DQotPC91bD48L3N0ZW50cnk+DQotPHN0ZW50cnk+PHVsPg0KLTxsaT4mbHQ7ZWxlbWVudCByZWY9ImZvbyI+PC9saT4NCi08bGk+Jmx0O2VsZW1lbnQgc3Vic3RpdHV0aW9uR3JvdXA9ImZvbyI8L2xpPg0KLTwvdWw+PC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5Pjx1bD4NCi08bGk+Jmx0O3NpbXBsZS9jb21wbGV4VHlwZSBuYW1lPSJmb28iPjwvbGk+DQotPC91bD48L3N0ZW50cnk+DQotPHN0ZW50cnk+PHVsPg0KLTxsaT4mbHQ7ZWxlbWVudCB0eXBlPSJmb28iPjwvbGk+DQotPGxpPiZsdDthdHRyaWJ1dGUgdHlwZT0iZm9vIj48L2xpPg0KLTxsaT4mbHQ7cmVzdHJpY3Rpb24gYmFzZT0iZm9vIj48L2xpPg0KLTxsaT4mbHQ7c3Vic3RpdHV0aW9uIGJhc2U9ImZvbyI+PC9saT4NCi08L3VsPjwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT48dWw+DQotPGxpPiZsdDthdHRyaWJ1dGUgbmFtZT0iZm9vIj48L2xpPg0KLTwvdWw+PC9zdGVudHJ5Pg0KLTxzdGVudHJ5Pjx1bD4NCi08bGk+Jmx0O2F0dHJpYnV0ZSByZWY9ImZvbyI+PC9saT4NCi08L3VsPjwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT48dWw+DQotPGxpPiZsdDthdHRyaWJ1dGVHcm91cCBuYW1lPSJmb28iPjwvbGk+DQotPC91bD48L3N0ZW50cnk+DQotPHN0ZW50cnk+PHVsPg0KLTxsaT4mbHQ7YXR0cmlidXRlR3JvdXAgcmVmPSJmb28iPjwvbGk+DQotPC91bD48L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+PHVsPg0KLTxsaT4mbHQ7Z3JvdXAgbmFtZT0iZm9vIj48L2xpPg0KLTwvdWw+PC9zdGVudHJ5Pg0KLTxzdGVudHJ5Pjx1bD4NCi08bGk+Jmx0O2dyb3VwIHJlZj0iZm9vIj48L2xpPg0KLTwvdWw+PC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPC9zaW1wbGV0YWJsZT48L2V4YW1wbGU+DQotPHBvc3RyZXE+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHJlZmFjdHJYU0QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxYTkzNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RyZWZhY3RyWFNELmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDkiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUmVmYWN0b3JpbmcgaW4gWE1MIFNjaGVtYSBGaWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJXaXRoaW4gYW4gWE1MIFNjaGVtYSBmaWxlLCByZWZhY3RvcmluZyBhbGxvd3MgYXV0aG9ycyB0byBtYWtlIGEgc2luZ2xlIGFydGlmYWN0IGNoYW5nZSwgYW5kIGhhdmUgdGhhdCBjaGFuZ2UgaW1wbGVtZW50ZWQgdGhyb3VnaG91dCBhbGwgb3RoZXIgZGVwZW5kYW50IGFydGlmYWN0cy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iV2l0aGluIGFuIFhNTCBTY2hlbWEgZmlsZSwgcmVmYWN0b3JpbmcgYWxsb3dzIGF1dGhvcnMgdG8gbWFrZSBhIHNpbmdsZSBhcnRpZmFjdCBjaGFuZ2UsIGFuZCBoYXZlIHRoYXQgY2hhbmdlIGltcGxlbWVudGVkIHRocm91Z2hvdXQgYWxsIG90aGVyIGRlcGVuZGFudCBhcnRpZmFjdHMuIiAvPgotPG1ldGEgY29udGVudD0iZGVwZW5kZW50IGFydGlmYWN0cywgcmVmYWN0b3JpbmcgWE1MIHNjaGVtYSBmaWxlcywgcmVmYWN0b3JpbmcsIFhNTCBzY2hlbWEgZmlsZXMsIHJlbmFtaW5nLCBYTUwgc2NoZW1hIGZpbGVzLCBzY2hlbWFzLCBlZGl0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iZGVwZW5kZW50IGFydGlmYWN0cywgcmVmYWN0b3JpbmcgWE1MIHNjaGVtYSBmaWxlcywgcmVmYWN0b3JpbmcsIFhNTCBzY2hlbWEgZmlsZXMsIHJlbmFtaW5nLCBYTUwgc2NoZW1hIGZpbGVzLCBzY2hlbWFzLCBlZGl0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJyZWZhY3RvcmluZyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJlZmFjdG9yaW5nIj48YSBuYW1lPSJyZWZhY3RvcmluZyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UmVmYWN0b3JpbmcgaW4gWE1MIFNjaGVtYSBGaWxlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+V2l0aGluIGFuIFhNTCBTY2hlbWEgZmlsZSwgcmVmYWN0b3JpbmcgYWxsb3dzIGF1dGhvcnMgdG8gbWFrZSBhCi1zaW5nbGUgYXJ0aWZhY3QgY2hhbmdlLCBhbmQgaGF2ZSB0aGF0IGNoYW5nZSBpbXBsZW1lbnRlZCB0aHJvdWdob3V0IGFsbCBvdGhlcgotZGVwZW5kYW50IGFydGlmYWN0cy48L3A+Ci0KLTxkaXYgY2xhc3M9InAiIC8+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlJlZmFjdG9yaW5nIGVsaW1pbmF0ZXMgdGhlIG5lZWQgZm9yIHRoZSB0ZWRpb3VzIGVkaXRpbmcgbmVjZXNzYXJ5Ci10byByZWNvdmVyIGJyb2tlbiBkZXBlbmRlbmNpZXMgY2F1c2VkIGJ5IGFydGlmYWN0IGNoYW5nZXMgd2hpY2ggY2F1c2UgcmlwcGxlCi1lZmZlY3RzIG9uIG90aGVyIGRlcGVuZGFudCBhcnRpZmFjdHMgKHN1Y2ggYXMgcmVuYW1pbmcgYW4gWE1MIFNjaGVtYSBlbGVtZW50KS48L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DcmVhdGUgYSBuZXcgWE1MIHNjaGVtYSBvciBkb3VibGUtY2xpY2sgYW4gZXhpc3Rpbmcgc2NoZW1hIGluIHRoZQotTmF2aWdhdG9yIHZpZXcuPC9zcGFuPiAgSXQgd2lsbCBhdXRvbWF0aWNhbGx5IG9wZW4gaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyByZWZhY3RvciBhbiBhcnRpZmFjdCwgcG9zaXRpb24gY3Vyc29yIHdpdGhpbiB0aGUgYXJ0aWZhY3QsIHJpZ2h0LWNsaWNrCi10aGUgYXJ0aWZhY3QsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVmYWN0b3I8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVuYW1lPC9zcGFuPgotPC9zcGFuPjwvc3Bhbj4gQSBwb3B1cCBkaWFsb2cgd2lsbCByZXF1ZXN0IHRoZSBlbnRyeSBvZiBhIG5ldyBuYW1lCi1mb3IgdGhhdCBhcnRpZmFjdAotPG9sIHR5cGU9ImEiPgotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGluIHRoZSBuZXcgbmFtZSBvZiB0aGUgYXJ0aWZhY3QuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+KE9wdGlvbmFsKSBDbGljayA8c3Ryb25nPlByZXZpZXc8L3N0cm9uZz4uPC9zcGFuPiBBIHdpbmRvdyB3aWxsIG9wZW4KLWluZGljYXRpbmcgYWxsIG9mIHRoZSBjaGFuZ2VzIHdoaWNoIHdpbGwgdGFrZSBwbGFjZSBkdWUgdG8gdGhlIHJlZmFjdG9yaW5nLgotPC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSy48L3NwYW4+PC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRoZSBuZXcgbmFtZSB3aWxsIGJlIGVudGVyZWQgaW4gdGhlIG9wZW5lZCBYU0Qgc291cmNlLCBhcyB3ZWxsIGFzCi1pbiBhbGwgZGVwZW5kYW50IGFydGlmYWN0cy48L2Rpdj4KLQotPGRpdiBjbGFzcz0iZXhhbXBsZSI+PHN0cm9uZz48dT5Db21wb25lbnQgUmVmZXJlbmNlcyBpbiBYTUwgU2NoZW1hPC91Pjwvc3Ryb25nPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgYm9yZGVyPSIxIiBjbGFzcz0ic2ltcGxldGFibGVib3JkZXIiPgotPHRyPgotPHRoIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgaWQ9Ik4xMDBGRSI+R2xvYmFsIG5hbWVkIGNvbXBvbmVudHM8L3RoPgotCi08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMTA0Ij5SZWZlcmVuY2U8L3RoPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBGRSI+PHVsPgotPGxpPiZsdDtlbGVtZW50IG5hbWU9ImZvbyImZ3Q7PC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTA0Ij48dWw+Ci08bGk+Jmx0O2VsZW1lbnQgcmVmPSJmb28iJmd0OzwvbGk+Ci0KLTxsaT4mbHQ7ZWxlbWVudCBzdWJzdGl0dXRpb25Hcm91cD0iZm9vIjwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBGRSI+PHVsPgotPGxpPiZsdDtzaW1wbGUvY29tcGxleFR5cGUgbmFtZT0iZm9vIiZndDs8L2xpPgotCi08L3VsPgotPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxMDQiPjx1bD4KLTxsaT4mbHQ7ZWxlbWVudCB0eXBlPSJmb28iJmd0OzwvbGk+Ci0KLTxsaT4mbHQ7YXR0cmlidXRlIHR5cGU9ImZvbyImZ3Q7PC9saT4KLQotPGxpPiZsdDtyZXN0cmljdGlvbiBiYXNlPSJmb28iJmd0OzwvbGk+Ci0KLTxsaT4mbHQ7c3Vic3RpdHV0aW9uIGJhc2U9ImZvbyImZ3Q7PC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEZFIj48dWw+Ci08bGk+Jmx0O2F0dHJpYnV0ZSBuYW1lPSJmb28iJmd0OzwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDEwNCI+PHVsPgotPGxpPiZsdDthdHRyaWJ1dGUgcmVmPSJmb28iJmd0OzwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBGRSI+PHVsPgotPGxpPiZsdDthdHRyaWJ1dGVHcm91cCBuYW1lPSJmb28iJmd0OzwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDEwNCI+PHVsPgotPGxpPiZsdDthdHRyaWJ1dGVHcm91cCByZWY9ImZvbyImZ3Q7PC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEZFIj48dWw+Ci08bGk+Jmx0O2dyb3VwIG5hbWU9ImZvbyImZ3Q7PC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTA0Ij48dWw+Ci08bGk+Jmx0O2dyb3VwIHJlZj0iZm9vIiZndDs8L2xpPgotCi08L3VsPgotPC90ZD4KLQotPC90cj4KLQotPC90YWJsZT4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIiAvPgotCi08L2Rpdj4KLQotPGRpdiAvPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmR0c2NobS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmR0c2NobS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTczZjdlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZkdHNjaG0uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHZkdHNjaG0iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlZhbGlkYXRpbmcgWE1MIHNjaGVtYXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlZhbGlkYXRpbmcgWE1MIHNjaGVtYXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VmFsaWRhdGluZyBhbiBYTUwgc2NoZW1hIGRldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBvZg0KLXRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgc2VtYW50aWNhbGx5IHZhbGlkLiBBbnkgZXJyb3JzIHdpbGwgYmUgZGlzcGxheWVkIGluDQotdGhlIFByb2JsZW1zIHZpZXcuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+dmFsaWRhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIHZhbGlkYXRlIGFuIFhNTA0KLXNjaGVtYSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPlJpZ2h0LWNsaWNrIHlvdXIgZmlsZSBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDx1aWNvbnRyb2w+VmFsaWRhdGU8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+IElmIHZhbGlkYXRpb24gd2FzIG5vdCBzdWNjZXNzZnVsLCB5b3UgY2FuIHJlZmVyIHRvIHRoZSBQcm9ibGVtcw0KLXZpZXcgdG8gc2VlIHdoYXQgcHJvYmxlbXMgd2VyZSBsb2dnZWQuIDwvY21kPjxpbmZvPiA8bm90ZT4gSWYgeW91IHJlY2VpdmUNCi1hbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgUHJvYmxlbXMgdmlldyBpcyBmdWxsLCB5b3UgY2FuIGluY3JlYXNlDQotdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcyBhbGxvd2VkIGJ5IGNsaWNraW5nIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiBhbmQgc2VsZWN0aW5nIDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPkdlbmVyYWw8L3VpY29udHJvbD48dWljb250cm9sPk1hcmtlcnM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi4NCi1TZWxlY3QgdGhlIDx1aWNvbnRyb2w+VXNlIG1hcmtlciBsaW1pdHM8L3VpY29udHJvbD4gY2hlY2sgYm94IGFuZCBjaGFuZ2UgdGhlDQotbnVtYmVyIGluIHRoZSA8dWljb250cm9sPkxpbWl0IHZpc2libGUgaXRlbXMgcGVyIGdyb3VwPC91aWNvbnRyb2w+IGZpZWxkLjwvbm90ZT48L2luZm8+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48cD5UaGUgWE1MIHNjaGVtYSBzdXBwb3J0IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciBpcyBiYXNlZCBvbiB0aGUNCi1XM0MgWE1MIFNjaGVtYSBSZWNvbW1lbmRhdGlvbiBTcGVjaWZpY2F0aW9uLiBUaGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9ucw0KLVhNTCBTY2hlbWEgUGFydCAxOiBTdHJ1Y3R1cmVzIGFuZCBYTUwgU2NoZW1hIFBhcnQgMjogRGF0YXR5cGVzIGZyb20gdGhlIFczQw0KLVdlYiBzaXRlIGFyZSB1c2VkIGZvciB2YWxpZGF0aW9uLjwvcD48cD5DZXJ0YWluIGVycm9yIG1lc3NhZ2VzIGNvbnRhaW4gYSByZWZlcmVuY2UNCi10byB0aGUgc2NoZW1hIGNvbnN0cmFpbnRzIGxpc3RlZCBpbiBBcHBlbmRpeCBDIG9mIHRoZSBYTUwgU2NoZW1hIFBhcnQgMTogU3RydWN0dXJlcw0KLWRvY3VtZW50LiBFYWNoIGNvbnN0cmFpbnQgaGFzIGEgdW5pcXVlIG5hbWUgdGhhdCB3aWxsIGJlIHJlZmVyZW5jZWQgaW4gdGhlDQotZXJyb3IgbWVzc2FnZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSByZWNlaXZlIGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCB0aGlzIHRleHQ6IDxzeXN0ZW1vdXRwdXQ+Y3QtcHJvcHMtY29ycmVjdDwvc3lzdGVtb3V0cHV0PiBhbmQNCi15b3Ugc2VhcmNoZWQgaW4gdGhlIFN0cnVjdHVyZSBkb2N1bWVudCBmb3IgdGhlIHRleHQsIHlvdSB3b3VsZCBmaW5kIHRoYXQgaXQNCi1pcyBmb3IgdGhlIHNlY3Rpb24gIlNjaGVtYSBDb21wb25lbnQgQ29uc3RyYWludDogQ29tcGxleCBUeXBlIERlZmluaXRpb24gUHJvcGVydGllcw0KLUNvcnJlY3QiLiA8L3A+PHA+WW91IGNhbiBzZXQgdXAgYSBwcm9qZWN0J3MgcHJvcGVydGllcyBzbyB0aGF0IGRpZmZlcmVudCB0eXBlcw0KLW9mIHByb2plY3QgcmVzb3VyY2VzIGFyZSBhdXRvbWF0aWNhbGx5IHZhbGlkYXRlZCB3aGVuIHlvdSBzYXZlIHRoZW0gKHRoaXMNCi1pcyBzZXQgZm9yIGFsbCByZXNvdXJjZXMgYnkgZGVmYXVsdCkuIEZyb20gYSBwcm9qZWN0J3MgcG9wLXVwIG1lbnUgc2VsZWN0IDx1aWNvbnRyb2w+UHJvcGVydGllczwvdWljb250cm9sPiwNCi10aGVuIHNlbGVjdCA8dWljb250cm9sPlZhbGlkYXRpb248L3VpY29udHJvbD4uIEFueSB2YWxpZGF0b3JzIHlvdSBjYW4gcnVuDQotYWdhaW5zdCB5b3VyIHByb2plY3Qgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlIFZhbGlkYXRpb24gcGFnZS48L3A+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuZGl0YSIgc2NvcGU9InBlZXIiPg0KLTxsaW5rdGV4dD5WYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L2xpbmt0ZXh0Pg0KLTxkZXNjPkdlbmVyYWwgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbjwvZGVzYz4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEiIHNjb3BlPSJleHRlcm5hbCI+PGxpbmt0ZXh0PlhNTA0KLVNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXM8L2xpbmt0ZXh0Pg0KLTxkZXNjPlNlZSB0aGUgVzNDIFdlYiBzaXRlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbnM8L2Rlc2M+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yIiBzY29wZT0iZXh0ZXJuYWwiPjxsaW5rdGV4dD5YTUwNCi1TY2hlbWEgUGFydCAyOiBEYXRhdHlwZXM8L2xpbmt0ZXh0Pg0KLTxkZXNjPlNlZSB0aGUgVzNDIFdlYiBzaXRlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbnM8L2Rlc2M+DQotPC9saW5rPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmR0c2NobS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmR0c2NobS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzljMTY5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZkdHNjaG0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA5IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlZhbGlkYXRpbmcgWE1MIHNjaGVtYXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVmFsaWRhdGluZyBhbiBYTUwgc2NoZW1hIGRldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgWE1MIHNjaGVtYSBmaWxlIGlzIHNlbWFudGljYWxseSB2YWxpZC4gQW55IGVycm9ycyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgUHJvYmxlbXMgdmlldy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVmFsaWRhdGluZyBhbiBYTUwgc2NoZW1hIGRldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgWE1MIHNjaGVtYSBmaWxlIGlzIHNlbWFudGljYWxseSB2YWxpZC4gQW55IGVycm9ycyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgUHJvYmxlbXMgdmlldy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGZpbGVzLCB2YWxpZGF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgdmFsaWRhdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3htbHNjaC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi8uLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR2ZHRzY2htIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+VmFsaWRhdGluZyBYTUwgc2NoZW1hczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHZkdHNjaG0iPjxhIG5hbWU9InR2ZHRzY2htIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5WYWxpZGF0aW5nIFhNTCBzY2hlbWFzPC9oMT4KLQotCi0KLQotPGRpdj48cD5WYWxpZGF0aW5nIGFuIFhNTCBzY2hlbWEgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IHN0YXRlIG9mCi10aGUgWE1MIHNjaGVtYSBmaWxlIGlzIHNlbWFudGljYWxseSB2YWxpZC4gQW55IGVycm9ycyB3aWxsIGJlIGRpc3BsYXllZCBpbgotdGhlIFByb2JsZW1zIHZpZXcuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIHZhbGlkYXRlIGFuIFhNTAotc2NoZW1hLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0LWNsaWNrIHlvdXIgZmlsZSBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRlPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPiBJZiB2YWxpZGF0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bCwgeW91IGNhbiByZWZlciB0byB0aGUgUHJvYmxlbXMKLXZpZXcgdG8gc2VlIHdoYXQgcHJvYmxlbXMgd2VyZSBsb2dnZWQuIDwvc3Bhbj4gIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiAgSWYgeW91IHJlY2VpdmUKLWFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSBQcm9ibGVtcyB2aWV3IGlzIGZ1bGwsIHlvdSBjYW4gaW5jcmVhc2UKLXRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMgYWxsb3dlZCBieSBjbGlja2luZyA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPjwvc3Bhbj4gYW5kIHNlbGVjdGluZyA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXJrZXJzPC9zcGFuPjwvc3Bhbj4uCi1TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVzZSBtYXJrZXIgbGltaXRzPC9zcGFuPiBjaGVjayBib3ggYW5kIGNoYW5nZSB0aGUKLW51bWJlciBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TGltaXQgdmlzaWJsZSBpdGVtcyBwZXIgZ3JvdXA8L3NwYW4+IGZpZWxkLjwvZGl2PgotCi08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgWE1MIHNjaGVtYSBzdXBwb3J0IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciBpcyBiYXNlZCBvbiB0aGUKLVczQyBYTUwgU2NoZW1hIFJlY29tbWVuZGF0aW9uIFNwZWNpZmljYXRpb24uIFRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb25zCi1YTUwgU2NoZW1hIFBhcnQgMTogU3RydWN0dXJlcyBhbmQgWE1MIFNjaGVtYSBQYXJ0IDI6IERhdGF0eXBlcyBmcm9tIHRoZSBXM0MKLVdlYiBzaXRlIGFyZSB1c2VkIGZvciB2YWxpZGF0aW9uLjwvcD4KLTxwPkNlcnRhaW4gZXJyb3IgbWVzc2FnZXMgY29udGFpbiBhIHJlZmVyZW5jZQotdG8gdGhlIHNjaGVtYSBjb25zdHJhaW50cyBsaXN0ZWQgaW4gQXBwZW5kaXggQyBvZiB0aGUgWE1MIFNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXMKLWRvY3VtZW50LiBFYWNoIGNvbnN0cmFpbnQgaGFzIGEgdW5pcXVlIG5hbWUgdGhhdCB3aWxsIGJlIHJlZmVyZW5jZWQgaW4gdGhlCi1lcnJvciBtZXNzYWdlLiBGb3IgZXhhbXBsZSwgaWYgeW91IHJlY2VpdmUgYW4gZXJyb3IgbWVzc2FnZSB3aXRoIHRoaXMgdGV4dDogPHR0IGNsYXNzPSJzeXNvdXQiPmN0LXByb3BzLWNvcnJlY3Q8L3R0PiBhbmQKLXlvdSBzZWFyY2hlZCBpbiB0aGUgU3RydWN0dXJlIGRvY3VtZW50IGZvciB0aGUgdGV4dCwgeW91IHdvdWxkIGZpbmQgdGhhdCBpdAotaXMgZm9yIHRoZSBzZWN0aW9uICJTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IENvbXBsZXggVHlwZSBEZWZpbml0aW9uIFByb3BlcnRpZXMKLUNvcnJlY3QiLiA8L3A+Ci08cD5Zb3UgY2FuIHNldCB1cCBhIHByb2plY3QncyBwcm9wZXJ0aWVzIHNvIHRoYXQgZGlmZmVyZW50IHR5cGVzCi1vZiBwcm9qZWN0IHJlc291cmNlcyBhcmUgYXV0b21hdGljYWxseSB2YWxpZGF0ZWQgd2hlbiB5b3Ugc2F2ZSB0aGVtICh0aGlzCi1pcyBzZXQgZm9yIGFsbCByZXNvdXJjZXMgYnkgZGVmYXVsdCkuIEZyb20gYSBwcm9qZWN0J3MgcG9wLXVwIG1lbnUgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+LAotdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFsaWRhdGlvbjwvc3Bhbj4uIEFueSB2YWxpZGF0b3JzIHlvdSBjYW4gcnVuCi1hZ2FpbnN0IHlvdXIgcHJvamVjdCB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgVmFsaWRhdGlvbiBwYWdlLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90Y3htbHNjaC5odG1sIiB0aXRsZT0iWW91IGNhbiBjcmVhdGUgYW4gWE1MIHNjaGVtYSBhbmQgdGhlbiBlZGl0IGl0IHVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLCB5b3UgY2FuIHNwZWNpZnkgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iPkNyZWF0aW5nIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxpbmZvIj48c3Ryb25nPlJlbGF0ZWQgaW5mb3JtYXRpb248L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwiIHRpdGxlPSJHZW5lcmFsIHZhbGlkYXRpb24gaW5mb3JtYXRpb24iPlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEiIHRhcmdldD0iX2JsYW5rIiB0aXRsZT0iU2VlIHRoZSBXM0MgV2ViIHNpdGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9ucyI+WE1MCi1TY2hlbWEgUGFydCAxOiBTdHJ1Y3R1cmVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMiIgdGFyZ2V0PSJfYmxhbmsiIHRpdGxlPSJTZWUgdGhlIFczQyBXZWIgc2l0ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb25zIj5YTUwKLVNjaGVtYSBQYXJ0IDI6IERhdGF0eXBlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODI1NjYxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmOTNhOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnBhdGNoLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5wYXRjaC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGMzYmM0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnBhdGNoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci0KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJCdWlsZCIgY29udGVudD0iQnVpbGQiPgotICAgPHRpdGxlPldUUCAxLjUuNSBQYXRjaGVzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxoMT5XVFAgMS41LjUgUGF0Y2hlczwvaDE+Ci0KLTxoMj5vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmU8L2gyPgotCi08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTQwMic+MTg1NDAyPC9hPi4gSlNQIHZhbGlkYXRpb24gZmFpbHMgYmVjYXVzZSBvZiBkZWZhdWx0ZWQgYXR0cmlidXRlIGZsdXNoIG9uIGpzcDppbmNsdWRlPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDM3MTEnPjIwMzcxMTwvYT4uIHRhZ2xpYiBkZWNsYXJhdGlvbnMgaW4gSlNQIGZyYWdtZW50czwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk5MDUzJz4xOTkwNTM8L2E+LiBTeW50YXggZXJyb3JzIG91dHNpZGUgb2Ygc2NyaXB0aW5nIGFyZWFzIG5vdCByZXBvcnRlZDwvcD4KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTk3YjRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdUUCBQYXRjaCBmb3Igd3N0LnhtbF91aQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVwKLUEgcGF0Y2ggZm9yIHNzZS51aVxuXAotVGhpcyBwYXRjaCBmaXhlcyBwcm9ibGVtcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyBidWdzOiBcblwKLVxuXAotQnVnIDE4NTQwMiBKU1AgdmFsaWRhdGlvbiBmYWlscyBiZWNhdXNlIG9mIGRlZmF1bHRlZCBhdHRyaWJ1dGUgZmx1c2ggb24ganNwOmluY2x1ZGUgIFxuXAotU2VlIGJ1ZyAxODU0MDIgKGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODU0MDIpKSBcblwKLVxuXAotQnVnIDIwMzcxMSB0YWdsaWIgZGVjbGFyYXRpb25zIGluIEpTUCBmcmFnbWVudHMgIFxuXAotU2VlIGJ1ZyAyMDM3MTEgKGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDM3MTEpKSBcblwKLVxuXAotQnVnIDE5OTA1MyBTeW50YXggZXJyb3JzIG91dHNpZGUgb2Ygc2NyaXB0aW5nIGFyZWFzIG5vdCByZXBvcnRlZCAgXG5cCi1TZWUgYnVnIDE5OTA1MyAoaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5OTA1MykpIFxuXAotXG5cCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU9jdG9iZXIsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzgxMzY0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2giCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS41LjUucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUiIHZlcnNpb249IjEuNS41LnYyMDA3MDgwOTA1MTgtLTRoTkREaUVuSldEZFJRIiBwYXRjaD0idHJ1ZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzA2MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+PC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5YjA2NS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlXzEuMC4wLmJpbi5kaXN0LnppcApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEwY2UxZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDc2OTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjIxMzVhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBXZWIgQ29yZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249V2ViIHRvb2xzIGNvcmUuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDE0LCAyMDEwXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1cblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAotXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAotXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ODA5NGUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjMuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg0Y2EzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZjFlNmUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBXZWIgQ29yZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUxMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkMzhkNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIFdlYiBDb3JlIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDllOWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2RjMTU1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgV2ViIENvcmUgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIFdlYiBjb3JlLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCAxNCwgMjAxMFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKLVxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKLVxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCAxNCwgMjAxMDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmI3MzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MNCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4NCi0NCi0wPUBidWlsZEANCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmMWU2ZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIFdlYiBDb3JlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNTEyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWQzOGQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gV2ViIENvcmUgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWQzMDJlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYnVpbGQueG1sCi1mZWF0dXJlcwotcGx1Z2lucwotb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZV8xLjAuMC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzlmODRiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzI0NGE0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLCBmZWF0dXJlQG9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnNvdXJjZQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDlhYTAwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdlYiBQbHVnLWluIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIHRoZSBXU1Qgd2ViIHRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDE0LCAyMDEwXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1cblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAotXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAotXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTdhYmMwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMy4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0X3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg0Y2EzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCAxNCwgMjAxMDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmNkOWZlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTAyNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOTJhM2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bWV0YSBuYW1lPSJCdWlsZCIgY29udGVudD0iQnVpbGQiPgotPHRpdGxlPldUUCAzLjAuNCBQYXRjaGVzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxoMT5XVFAgMy4wLjQgUGF0Y2hlczwvaDE+Ci0KLTxoMj5vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmU8L2gyPgotCi08cD5CdWcgPGEKLQlocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcwNDA3Jz4yNzA0MDc8L2E+Lgotb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IuaHlwZXJsaW5rRGV0ZWN0b3JzJyBleHRlbnNpb24gcG9pbnQgd2lsbCBiZSBpZ25vcmVkCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwZDEyNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1RQIFBhdGNoIGZvciBvcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1cCi1Db250YWlucyBmaXhlcyBmb3IgdGhlIGZvbGxvd2luZyBidWdzOiBcblwKLVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yNzA0MDcgb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IuaHlwZXJsaW5rRGV0ZWN0b3JzJyBleHRlbnNpb24gcG9pbnQgd2lsbCBiZSBpZ25vcmVkXG5cCi1cblwKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotT2N0b2JlciwgMjAwOFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE4NWQzNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUucGF0Y2giCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjQucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlIiB2ZXJzaW9uPSIzLjAuNC52MjAwODExMjQwOTAwLTdSMEVQN0U4S3M5djd1cnR1REp0QmNhUlY2UmkiIHBhdGNoPSJ0cnVlIi8+Ci0gICA8L3JlcXVpcmVzPgotICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotICAgICAgICAgCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzA2MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KYW51YXJ5IDI4LCAyMDA1PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPjwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjRiNDc3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDc2OTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhODQzNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVjbGlwc2UgV2ViIERldmVsb3BlciBUb29scwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RWNsaXBzZSBXZWIgRGV2ZWxvcGVyIFRvb2xzLCBpbmNsdWRpbmcgSFRNTCwgQ1NTLCBYSFRNTCwgZXRjLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCAxNCwgMjAxMFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKLVxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKLVxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZTc1YjcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMy4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCAxNCwgMjAxMDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTk1YzBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIFdlYiBVSVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhNTc1Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NTZmYjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gV2ViIFVJIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4YTYxOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUuc291cmNlID0gb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDQ3ZmEzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdlYiBVSSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIFdlYiBVSS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmI3MzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzDQotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcw0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuDQotDQotMD1AYnVpbGRADQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5NWMwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBXZWIgVUlcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTU3NWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjU2ZmI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIFdlYiBVSSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNmZTE3NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlXzEuMC4wLmphcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1ZWIzMS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDc2OTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDg5NTYyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBXZWIgVXNlciBEb2N1bWVudGF0aW9uCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1XU1QgV2ViIHVzZXIgZG9jdW1lbnRhdGlvbgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCAxNCwgMjAxMFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKLVxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKLVxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzI1ZDk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4zLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODRjYTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCAxNCwgMjAxMDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4Yzc5My4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLnBhdGNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUucGF0Y2gvZGVzY3JpcHRpb24udHh0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUucGF0Y2gvZGVzY3JpcHRpb24udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDgxNDhhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLnBhdGNoL2Rlc2NyaXB0aW9uLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVGhpcyBoZWFkIHRydW5rIGlzIGRlbGliZXJhdGx5IGVtcHR5LiAKLQotUGxlYXNlIGxvYWQgdGhlIGFwcHJvcHJpYXRlIG1haW50ZW5hbmNlIGJyYW5jaC4gCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjM1YWUxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmVfMS41LjAuMjAwNjA1MDgwMTA0LmJpbi5kaXN0LnppcAotZGV2LnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYWUyNDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwOTI3Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gTWF5IDA4IDA5OjEwOjI3IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjQ0ODBiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTVjMTJlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBYTUwgQ29yZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdTVCBYTUwgY29yZS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I0N2RmZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMy4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iamF2YXgueG1sIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMTkwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIxOTAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjMuNC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLnhtbC5yZXNvbHZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9Ijk2IgotICAgICAgICAgaW5zdGFsbC1zaXplPSI5NiIKLSAgICAgICAgIHZlcnNpb249IjEuMi4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIyNzAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjI3MCIKLSAgICAgICAgIHZlcnNpb249IjIuNy4xLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUueGVyY2VzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMTIwMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMTIwMCIKLSAgICAgICAgIHZlcnNpb249IjIuOS4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMTUyIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIxNTIiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg0Y2EzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYzI3MTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBYTUwgQ29yZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUxMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM5MjQxMS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIFhNTCBDb3JlIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDllOWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmM0NGY1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgWE1MIENvcmUgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIFhNTCBjb3JlLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCAxNCwgMjAxMFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKLVxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKLVxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCAxNCwgMjAxMDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmI3MzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MNCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4NCi0NCi0wPUBidWlsZEANCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFjMjcxNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIFhNTCBDb3JlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNTEyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzkyNDExLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gWE1MIENvcmUgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzc0OTUyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotZmVhdHVyZXMKLXBsdWdpbnMKLWJ1aWxkLnhtbAotZGV2LnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc1ZmE2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjQwNTBlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZSwgZmVhdHVyZUBvcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS5zb3VyY2UgCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTRhNmVmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBYTUwgRWRpdG9ycyBhbmQgVG9vbHMgU0RLCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgdGhlIFdTVCBYTUwgdG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZWMwODIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4zLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5wYXRjaC8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5wYXRjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwYzFmOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUucGF0Y2gvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUucGF0Y2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGY5M2E5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiM2MyMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUucGF0aCIKLSAgICAgIGxhYmVsPSJQYXRoIEZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMCI+Ci0KLSAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vZGVzY3JpcHRpb24iPgotICAgICAgW0VudGVyIEZlYXR1cmUgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0IHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9jb3B5cmlnaHQiPgotICAgICAgW0VudGVyIENvcHlyaWdodCBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vbGljZW5zZSI+Ci0gICAgICBbRW50ZXIgTGljZW5zZSBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUiIHZlcnNpb249IjEuNS41LnYyMDA3MDczMTE2MzUtemtpQ2Z6Ty1JRlVPanpSIiBwYXRjaD0idHJ1ZSIvPgotICAgPC9yZXF1aXJlcz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTMxOGM3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YWZmYzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWQzNDk5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFhNTCBFZGl0b3JzIGFuZCBUb29scwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUmVwb3NpdG9yeQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249WE1MLCBEVEQgYW5kIFhNTCBTY2hlbWEgRWRpdG9ycywgdmFsaWRhdG9ycywgYW5kIFhNTCBDYXRhbG9nIHN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzJiNDMxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjMuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvcmVwb3NpdG9yeS9oZWxpb3MiLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg0Y2EzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLTx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDE0LCAyMDEwPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KLQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi0KLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQotICAgICAgIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuPC9wPgotCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZyBQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLQotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTEwZWEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gWE1MIFVJXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGE1NzVjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliNWY0ZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1XZWIgU3RhbmRhcmQgVG9vbHMgLSBYTUwgVUkgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzczN2FmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPVwKLWVwbC12MTAuaHRtbCxcCi1lY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLWZlYXR1cmUueG1sLFwKLWZlYXR1cmUucHJvcGVydGllcyxcCi1saWNlbnNlLmh0bWwKLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVkNjMzNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBYTUwgVUkgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIFhNTCBVSS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmI3MzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzDQotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcw0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuDQotDQotMD1AYnVpbGRADQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlMTBlYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBYTUwgVUlcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTU3NWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWI1ZjRkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIFhNTCBVSSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjM5MWIyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NzY5NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YTdjMGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFhNTCBVc2VyIERvY3VtZW50YXRpb24KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1XU1QgWE1MIHVzZXIgZG9jdW1lbnRhdGlvbgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCAxNCwgMjAxMFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKLVxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKLVxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM3YmY3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4zLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg0Y2EzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4K